[
  {
    "path": ".gitignore",
    "content": "# Prerequisites\n*.d\n\n# Compiled Object files\n*.slo\n*.lo\n*.o\n\n# Precompiled Headers\n*.gch\n*.pch\n\n# Compiled Dynamic libraries\n*.so\n*.dylib\n*.dll\n*.dylib\n\n# Fortran module files\n*.mod\n*.smod\n\n# Compiled Static libraries\n*.lai\n*.la\n*.a\n*.lib\n\n# Executables\n*.exe\n*.out\n*.app\n\n# Qt creator\n*.pro.user\n*.qmake.stash\n\n# Build\n*Makefile\n*build*\n*Build*\n*build/*\n*Build/*\n"
  },
  {
    "path": ".gitmodules",
    "content": "[submodule \"libs/vcglib\"]\n\tpath = libs/vcglib\n\turl = ../../cnr-isti-vclab/vcglib\n[submodule \"libs/xfield_tracer\"]\n\tpath = libs/xfield_tracer\n\turl = https://github.com/nicopietroni/xfield_tracer\n"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://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 <http://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<http://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<http://www.gnu.org/philosophy/why-not-lgpl.html>.\n"
  },
  {
    "path": "README.md",
    "content": "# Reliable Feature-Line Driven Quad-Remeshing\n\n[Nico Pietroni](www.nicopietroni.com), Stefano Nuvoli, \n[Thomas Alderighi](http://vcg.isti.cnr.it/~alderighi/), [Paolo Cignoni](http://vcg.isti.cnr.it/~cignoni/), [Marco Tarini](https://tarini.di.unimi.it/)<br/>\n*SIGGRAPH 2021*<br/>\n\n![alt text](teaser.jpg)\n\n## Abstract\nWe present a new algorithm for the semi-regular quadrangulation of an input surface, driven by its line features, such as sharp creases. We define a perfectly feature-aligned cross-field and a coarse layout of polygonal-shaped patches where we strictly ensure that all the feature-lines are represented as patch boundaries. To be able to consistently do so, we allow non-quadrilateral patches and T-junctions in the layout; the key is the ability to constrain the layout so that it still admits a globally consistent, T-junction-free, and pure-quad internal tessellation of its patches. This requires the insertion of additional irregular-vertices inside patches, but the regularity of the final- mesh is safeguarded by optimizing for both their number and for their reciprocal alignment. In total, our method guarantees the reproduction of feature-lines by construction, while still producing good quality, isometric, pure-quad, conforming meshes, making it an ideal candidate for CAD models. Moreover, the method is fully automatic, requiring no user intervention, and remarkably reliable, requiring little assumptions on the input mesh, as we demonstrate by batch processing the entire Thingi10K repository, with less than 0.5% of the attempted cases failing to produce a usable mesh.\n\nWebsite: [https://www.quadmesh.cloud/](https://www.quadmesh.cloud/)<br />\nDOI: [10.1145/3450626.3459941](https://doi.org/10.1145/3450626.3459941) ACM Transactions on Graphics (SIGGRAPH), 2021\n\n**BibTex**\n```\n@article{10.1145/3450626.3459941,\nauthor = {Pietroni, Nico and Nuvoli, Stefano and Alderighi, Thomas and Cignoni, Paolo and Tarini, Marco},\ntitle = {Reliable Feature-Line Driven Quad-Remeshing},\nyear = {2021},\nissue_date = {August 2021},\npublisher = {Association for Computing Machinery},\naddress = {New York, NY, USA},\nvolume = {40},\nnumber = {4},\nissn = {0730-0301},\nurl = {https://doi.org/10.1145/3450626.3459941},\ndoi = {10.1145/3450626.3459941},\nabstract = {We present a new algorithm for the semi-regular quadrangulation of an input surface, driven by its line features, such as sharp creases. We define a perfectly feature-aligned cross-field and a coarse layout of polygonal-shaped patches where we strictly ensure that all the feature-lines are represented as patch boundaries. To be able to consistently do so, we allow non-quadrilateral patches and T-junctions in the layout; the key is the ability to constrain the layout so that it still admits a globally consistent, T-junction-free, and pure-quad internal tessellation of its patches. This requires the insertion of additional irregular-vertices inside patches, but the regularity of the final-mesh is safeguarded by optimizing for both their number and for their reciprocal alignment. In total, our method guarantees the reproduction of feature-lines by construction, while still producing good quality, isometric, pure-quad, conforming meshes, making it an ideal candidate for CAD models. Moreover, the method is fully automatic, requiring no user intervention, and remarkably reliable, requiring little assumptions on the input mesh, as we demonstrate by batch processing the entire Thingi10K repository, with less than 0.5% of the attempted cases failing to produce a usable mesh.},\njournal = {ACM Trans. Graph.},\nmonth = {jul},\narticleno = {155},\nnumpages = {17},\nkeywords = {geometry processing, quad-meshing, modelling}\n}\n```\n\n### Download\n```bash\ngit clone --recursive https://github.com/nicopietroni/quadwild\n```\n\n### Build\nInstall the libraries boost and gurobi. \nIn Ubuntu you can install boost easily with the following terminal commands:\n```\napt-get install libboost-dev\n```\nOpen the file libs/libs.pri and set the paths of the requested libraries and the gurobi parameters:\n```\n#External libraries\nBOOST_PATH          = /usr/include/boost/\nGUROBI_PATH         = /opt/gurobi950/linux64/\nGUROBI_COMPILER     = gurobi_g++5.2\nGUROBI_LIB          = gurobi95\n```\n\n<br/>\n\nIf you do not need CoMISo, you can simply remove the define `COMISO_FIELD` in the file libs.pri:\n```\n#DEFINES += COMISO_FIELD\n```\nHowever, for organic meshes, we suggest to abilitate CoMISo. You need to compile it along with its dependencies (BLAS):\n```\napt install libblas-dev\ncd quadwild/libs/CoMISo\nmkdir build\ncd build\ncmake ..\nmake\n```\n\n<br/>\n\nYou can now compile the project quadwild/quadwild.pro with qmake or QtCreator.\n\nIn case you have technical issues or building problems, please write to [stefano.nuvoli@gmail.com](mailto:stefano.nuvoli@gmail.com) or [nico.pietroni@uts.edu.au](mailto:nico.pietroni@uts.edu.au).\n\n### Run\nThe package is composed of the main command-line quad-remesher (quadwild) and three different components (field_computation, field_tracing, quad_from_patches) that perform different steps of the pipeline.\n\n---\n\n#### quadwild\nThis project has no visual interface and can be used via command-line. This can be helpful to batch run entire datasets of models. To run the project, once builded, execute the following terminal command:\n```\n./quadwild <mesh> [.txt setup file] [.rosy file] [.sharp file]\n```\nThe command takes as input a mesh and three optional configuration files:\n\n- **`<mesh>`**: filename of the input triangle mesh. **The mesh can be either an obj or a ply.**\n   \n- **`.txt setup file` (optional):** The txt setup file contains the parameters in the pipeline. By default, the executable loads the file basic_setup.txt and two other examples are included: basic_setup_mechanical.txt and basic_setup_organic.txt. Any setup parameter can be specified to control the output result. The setup file has the following fields:\n```\ndo_remesh 1 \t\t  //remesh (1) or not (0) the input mesh\nsharp_feature_thr 35      //the dihedral angle of sharp features (-1 no features)\nalpha 0.02                //regularity vs isometry of the final tessellation. Close to zero -> more regular, Close to 1 -> more singularity are inserted\nscaleFact 1               //the scale of the final quadrangulation (the bigger the bigger the quads)\n```\n\n- **`.rosy file` (optional)**: This optional file contains parameters for the field computation of the field.\n```\nfn              //number of faces of the mesh\n4               //directions of the field (always 4 for a cross-field)\nx0 y0 z0        //XYZ directions of one vector of the cross-field of the first face\n...\nxn yn zn        //XYZ directions of one vector of the cross-field of the n-th face\n```\n\n- **`.sharp file` (optional)**: This optional file contains the informations of the sharp features. Note that, in the pipeline, border edges are considered sharp features by default.\n```\nsn                //number of sharp features\nt0 f0 e0          //for each sharp edge: the first integer is 0 if the edge is concave 1 if convex, then the face and the index of the sharp edge\n...\ntn fn en          //nth sharp edge\n```\n\nThe output of quadwild consists of several files:\n- **The output smooth quadrangulation (suffix quadrangulation_smooth.obj).**\n- The output quadrangulation before being smoothed (suffix quadrangulation.obj).\n- Other files:\n  - The re-meshed triangulated mesh (suffix rem.obj), the relative field and the sharp features automatically computed (.rosy and .sharp files as above).\n  - The mesh decomposed after the tracing (suffix rem_p0.obj).\n  - The patch decomposition (.patch file) contains the patch index for each triangle of the rem_p0 mesh.\n  - The files .corners, .c_feature, .feature files that contain per patch information (respectively corners of each patch, corners to be fixed and feature lines on the patches).\n\n---\n\n#### field_computation. \nThe program can be used either with a GUI or by command line (useful to batch run entire datasets of models).\n```\n./field_computation <mesh> [.txt setup file] [.rosy file][.sharp file] [batch]\n```\nThe \"batch\" option makes the program run in the shell without the GUI. The setup file includes additional parameters. By default, the executable loads the file basic_setup.txt.\n\n---\n\n#### field_tracing\nThis program is used to trace fields and split the mesh into patches.\n```\n./field_tracing <mesh> [.txt setup file] [batch]\n```\nIt requires having a .rosy and a .sharp file (with the same name of the mesh file). The \"batch\" option makes the program run in the shell without the GUI. The setup file includes additional parameters. By default, the executable loads the file basic_setup.txt.\n\n---\n\n#### quad_from_patches\nThis program is used to obtain a quadrangulation from a patch decomposition.\n```\n./quad_from_patches <mesh> [.txt setup file]\n```\nIt requires to have in the same folder a .corners, .c_feature, .feature files (with the same name of the mesh file). The setup file includes additional parameters. By default, the executable loads the file basic_setup.txt.\n\n## Note\nThe code has slightly changed and the results could be different from the ones showed in the paper.\n\n## License\n[GPL3](LICENSE) licensed\n([FAQ](https://www.gnu.org/licenses/gpl-faq.html))\n\n\n\n"
  },
  {
    "path": "components/field_computation/AutoRemesher.h",
    "content": "/***************************************************************************/\r\n/* Copyright(C) 2021\r\n\r\n\r\nThe authors of\r\n\r\nReliable Feature-Line Driven Quad-Remeshing\r\nSiggraph 2021\r\n\r\n\r\n All rights reserved.\r\nThis program is free software: you can redistribute it and/or modify\r\nit under the terms of the GNU General Public License as published by\r\nthe Free Software Foundation, either version 3 of the License, or\r\n(at your option) any later version.\r\n\r\nThis program is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\nGNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License\r\nalong with this program.  If not, see <https://www.gnu.org/licenses/>.\r\n****************************************************************************/\r\n\r\n#ifndef AUTOREMESHER_H\r\n#define AUTOREMESHER_H\r\n\r\n#include <vcg/complex/allocate.h>\r\n#include <vcg/complex/algorithms/clean.h>\r\n#include <vcg/complex/algorithms/crease_cut.h>\r\n#include <vcg/complex/algorithms/isotropic_remeshing.h>\r\n\r\n#include <vcg/complex/append.h>\r\n#include <vcg/space/index/grid_static_ptr.h>\r\n#include <vcg/complex/algorithms/closest.h>\r\n#include <vcg/complex/algorithms/local_optimization/tri_edge_collapse.h>\r\n\r\n#include <memory>\r\n\r\ntemplate <class Mesh>\r\nclass AutoRemesher {\r\n\r\n    typedef typename Mesh::ScalarType ScalarType;\r\n    typedef typename Mesh::CoordType  CoordType;\r\n\r\n    typedef typename Mesh::VertexType    VertexType;\r\n    typedef typename Mesh::VertexPointer VertexPointer;\r\n\r\n    typedef typename Mesh::FaceType    FaceType;\r\n    typedef typename Mesh::FacePointer FacePointer;\r\n\r\n    typedef vcg::GridStaticPtr<FaceType, ScalarType> StaticGrid;\r\n\r\n    static ScalarType computeAR(Mesh & m, const double perc = 0.05)\r\n    {\r\n        vcg::tri::ForEachFace(m, [] (FaceType & f) {\r\n            f.Q() = vcg::QualityRadii(f.cP(0), f.cP(1), f.cP(2));\r\n            //std::cout<<\"Q:\"<<f.Q()<<std::endl;\r\n        });\r\n\r\n        vcg::Histogram<ScalarType> hist;\r\n        vcg::tri::Stat<Mesh>::ComputePerFaceQualityHistogram(m, hist);\r\n\r\n        //\t\t    return hist.MinV();\r\n        return hist.Percentile(perc);\r\n    }\r\npublic:\r\n\r\n    static bool collapseSurvivingMicroEdges(Mesh & m, const ScalarType qualityThr = 0.001, const ScalarType edgeRatio = 0.025, const int maxIter = 2)\r\n    {\r\n        typedef vcg::tri::BasicVertexPair<VertexType> VertexPair;\r\n        typedef vcg::tri::EdgeCollapser<Mesh, VertexPair> Collapser;\r\n        typedef typename vcg::face::Pos<FaceType> PosType;\r\n\r\n        bool done=false;\r\n        int count = 0; int iter = 0;\r\n        do\r\n        {\r\n            count = 0;\r\n            vcg::tri::UpdateTopology<Mesh>::VertexFace(m);\r\n\r\n            for(auto fi=m.face.begin(); fi!=m.face.end(); ++fi)\r\n                if(!(*fi).IsD())\r\n                {\r\n                    if(vcg::QualityRadii(fi->cP(0), fi->cP(1), fi->cP(2)) <= qualityThr)\r\n                    {\r\n                        ScalarType minEdgeLength = std::numeric_limits<ScalarType>::max();\r\n                        ScalarType maxEdgeLength = 0;\r\n\r\n                        int minEdge = 0, maxEdge = 0;\r\n                        for(auto i=0; i<3; ++i)\r\n                        {\r\n                            const ScalarType len = vcg::Distance(fi->cP0(i), fi->cP1(i)) ;\r\n                            if (len < minEdgeLength)\r\n                            {\r\n                                minEdge = i;\r\n                                minEdgeLength = len;\r\n                            }\r\n                            if (len > maxEdgeLength)\r\n                            {\r\n                                maxEdge = i;\r\n                                maxEdgeLength = len;\r\n                            }\r\n                        }\r\n\r\n                        //                        if (minEdgeLength <= maxEdgeLength * edgeRatio)\r\n                        //                        {\r\n                        PosType pi(&*fi, minEdge);\r\n\r\n                        //                        //select the vertices\r\n                        //                        (*fi).V(0)->SetS();\r\n                        //                        (*fi).V(1)->SetS();\r\n                        //                        (*fi).V(2)->SetS();\r\n                        //                        (*fi).FFp(minEdge)->V(0)->SetS();\r\n                        //                        (*fi).FFp(minEdge)->V(1)->SetS();\r\n                        //                        (*fi).FFp(minEdge)->V(2)->SetS();\r\n\r\n                        VertexPair  bp = VertexPair(fi->V0(minEdge), fi->V1(minEdge));\r\n                        CoordType mp = (fi->cP0(minEdge) + fi->cP1(minEdge))/2.f;\r\n\r\n                        if(Collapser::LinkConditions(bp))\r\n                        {\r\n                            Collapser::Do(m, bp, mp, true);\r\n                            done=true;\r\n                        }\r\n                        //                        }\r\n                    }\r\n                }\r\n        } while (count > 0 && ++iter < maxIter);\r\n        return done;\r\n    }\r\nprivate:\r\n    static void MakeEdgeSelConsistent(Mesh & m)\r\n    {\r\n        for (size_t i=0;i<m.face.size();i++)\r\n            for (size_t j=0;j<3;j++)\r\n            {\r\n                if (m.face[i].IsFaceEdgeS(j))\r\n                {\r\n                    if (vcg::face::IsBorder(m.face[i],j))continue;\r\n                    FaceType *f1=m.face[i].FFp(j);\r\n                    int EdgeI=m.face[i].FFi(j);\r\n                    f1->SetFaceEdgeS(EdgeI);\r\n                }\r\n            }\r\n    }\r\n\r\n    static void SelectAllBoundaryV(Mesh & m)\r\n    {\r\n        for (size_t i=0;i<m.face.size();i++)\r\n            for (size_t j=0;j<3;j++)\r\n            {\r\n                if (vcg::face::IsBorder(m.face[i],j)){\r\n                    m.face[i].V0(j)->SetS();\r\n                    m.face[i].V1(j)->SetS();\r\n                    continue;\r\n                }\r\n\r\n                if (m.face[i].IsFaceEdgeS(j))\r\n                {\r\n                    m.face[i].V0(j)->SetS();\r\n                    m.face[i].V1(j)->SetS();\r\n                    FaceType *f1=m.face[i].FFp(j);\r\n                    int EdgeI=m.face[i].FFi(j);\r\n                    f1->SetFaceEdgeS(EdgeI);\r\n                }\r\n            }\r\n    }\r\n\r\npublic:\r\n\r\n    typedef struct Params {\r\n        int iterations = 15;\r\n        ScalarType targetAspect = 0.35;\r\n        int targetDeltaFN = 5000;\r\n        int initialApproximateFN = 20000;\r\n        ScalarType creaseAngle = 25.;\r\n        //bool userSelectedCreases = true;\r\n        bool surfDistCheck = true;\r\n        int erodeDilate = 0;\r\n        ScalarType minAdaptiveMult = 0.3;\r\n        ScalarType maxAdaptiveMult = 3;\r\n        ScalarType minAspectRatioThr = 0.05;\r\n        ScalarType targetEdgeLen = 0;\r\n    } Params;\r\n\r\n    static size_t openNonManifoldEdges(Mesh & m, const ScalarType moveThreshold,\r\n                                       bool debugMesg=false)\r\n    {\r\n\r\n        vcg::tri::UpdateTopology<Mesh>::FaceFace(m);\r\n        vcg::tri::UpdateTopology<Mesh>::VertexFace(m);\r\n        vcg::tri::UpdateFlags<Mesh>::VertexClearV(m);\r\n\r\n        if (debugMesg)\r\n        {\r\n            std::cout << \"Opening non-manifold edges...\";\r\n            std::cout << \"mesh starts with \" << vcg::tri::Clean<Mesh>::CountNonManifoldEdgeFF(m) << std::endl;\r\n        }\r\n\r\n        typedef typename vcg::face::Pos<FaceType> PosType;\r\n\r\n        typedef std::vector<std::vector<std::pair<size_t, size_t> > > VertexToFaceGroups;\r\n\r\n        std::unordered_map<size_t,VertexToFaceGroups> map;\r\n\r\n        vcg::tri::ForEachFacePos(m, [&](PosType & pos) {\r\n\r\n            if (!pos.V()->IsV() && !pos.IsManifold())\r\n            {\r\n                pos.V()->SetV();\r\n\r\n                std::vector<FacePointer> faceVec;\r\n                std::vector<int> vIndices;\r\n                vcg::face::VFStarVF(pos.V(), faceVec, vIndices);\r\n\r\n                std::unordered_set<size_t> inserted;\r\n\r\n                VertexToFaceGroups faceGroups;\r\n\r\n                for (size_t i = 0; i < faceVec.size(); ++i)\r\n                {\r\n                    const FacePointer fp = faceVec[i];\r\n\r\n                    size_t fidx = vcg::tri::Index(m, fp);\r\n                    if (inserted.count(fidx) != 0)\r\n                        continue;\r\n\r\n                    std::vector<std::pair<size_t, size_t> > manifoldGroup;\r\n\r\n                    PosType cyclePos(fp, vIndices[i]);\r\n                    PosType beginPos = cyclePos;\r\n                    //get to a non manifold edge...\r\n                    do\r\n                    {\r\n                        manifoldGroup.push_back(std::make_pair(vcg::tri::Index(m, cyclePos.F()), cyclePos.VInd()));\r\n                        inserted.insert(vcg::tri::Index(m, cyclePos.F()));\r\n                        cyclePos.F()->Q() = faceGroups.size() + 1;\r\n                        cyclePos.FlipE();\r\n                        cyclePos.NextF();\r\n                    } while (cyclePos.IsManifold() && !cyclePos.IsBorder() && cyclePos != beginPos);\r\n\r\n                    if (cyclePos != beginPos)\r\n                    {\r\n                        cyclePos = beginPos;\r\n                        cyclePos.NextF();\r\n\r\n                        while (cyclePos.IsManifold() && !cyclePos.IsBorder())\r\n                        {\r\n                            manifoldGroup.push_back(std::make_pair(vcg::tri::Index(m, cyclePos.F()), cyclePos.VInd()));\r\n                            inserted.insert(vcg::tri::Index(m, cyclePos.F()));\r\n                            cyclePos.F()->Q() = faceGroups.size() + 1;\r\n                            cyclePos.FlipE();\r\n                            cyclePos.NextF();\r\n                        }\r\n                    }\r\n\r\n                    faceGroups.push_back(manifoldGroup);\r\n                }\r\n\r\n                map[vcg::tri::Index(m, pos.V())] = faceGroups;\r\n            }\r\n        });\r\n\r\n        for (auto group : map)\r\n        {\r\n            const size_t vert = group.first;\r\n            const VertexToFaceGroups & faceGroups = group.second;\r\n            if (faceGroups.size() > 1)\r\n            {\r\n                auto vp = vcg::tri::Allocator<Mesh>::AddVertices(m, faceGroups.size()-1);\r\n\r\n                for (size_t i = 1; i < faceGroups.size(); ++i)\r\n                {\r\n                    vp->P() = m.vert[vert].cP();\r\n\r\n                    CoordType delta(0, 0, 0);\r\n                    for (std::pair<size_t,size_t> faceVertIndex : faceGroups[i])\r\n                    {\r\n                        m.face[faceVertIndex.first].V(faceVertIndex.second) = &*vp;\r\n                        delta += vcg::Barycenter(m.face[faceVertIndex.first]) - vp->cP();\r\n                    }\r\n                    delta /= faceGroups[i].size();\r\n                    vp->P() += delta * moveThreshold;\r\n                    ++vp;\r\n                }\r\n            }\r\n        }\r\n\r\n        return map.size();\r\n    }\r\n\r\n\r\n//    static ScalarType ExpectedEdgeL(const Mesh & m,\r\n//                                    size_t TargetSph=2000,\r\n//                                    size_t MinFaces=15000)\r\n//    {\r\n//        ScalarType Vol=m.Volume();\r\n//        ScalarType A=m.Area();\r\n//        ScalarType FaceA=A/TargetSph;\r\n//        //radius and volume of a sphere\r\n//        ScalarType KScale=(Vol/A)*(3/(m.bbox.Diag()/3.4));\r\n//        //ScalarType KScale=(A*(m.bbox.Diag()/3.4))/(3*Vol);\r\n//        ScalarType IdealA=FaceA*KScale;\r\n//        ScalarType IdealL0=sqrt(IdealA*2.309);\r\n//        ScalarType IdealL1=sqrt((A*2.309)/MinFaces);\r\n//        std::cout<<\"KScale\"<<KScale<<std::endl;\r\n//        //exit(0);\r\n//        return std::max(IdealL0,IdealL1);\r\n//    }\r\n\r\n    static ScalarType ExpectedEdgeL(const Mesh & m,\r\n                                    size_t TargetSph=2000,\r\n                                    size_t MinFaces=10000)\r\n    {\r\n        ScalarType Vol=m.Volume();\r\n        ScalarType A=m.Area();\r\n        ScalarType FaceA=A/TargetSph;\r\n        //radius and volume of a sphere\r\n        ScalarType Sphericity=(pow(M_PI,1.0/3.0)*pow((6.0*Vol),2.0/3.0))/A;\r\n        ScalarType KScale=pow(Sphericity,2);\r\n        //ScalarType KScale=(A*(m.bbox.Diag()/3.4))/(3*Vol);\r\n        //ScalarType KScale=(pow(A,1.5))/(3*Vol);\r\n        ScalarType IdealA=FaceA*KScale;\r\n        ScalarType IdealL0=sqrt(IdealA*2.309);\r\n        ScalarType IdealL1=sqrt((A*2.309)/MinFaces);\r\n        std::cout<<\"KScale \"<<KScale<<std::endl;\r\n        //exit(0);\r\n        return std::min(IdealL0,IdealL1);\r\n        //return IdealL0;\r\n    }\r\n\r\n    //remove sharp features that have been removed after remesher or clean that were still marked\r\n    static void UpdateCoherentSharp(Mesh & m, Params & par)\r\n    {\r\n        if (par.creaseAngle<=0)return;\r\n        m.UpdateDataStructures();\r\n        //std::set<std::pair<CoordType,CoordType> > Features;\r\n        for (size_t i=0;i<m.face.size();i++)\r\n            for (size_t j=0;j<3;j++)\r\n            {\r\n                if (!m.face[i].IsFaceEdgeS(j))continue;\r\n\r\n                ScalarType angle = DihedralAngleRad(m.face[i],j);\r\n                if(fabs(angle)<vcg::math::ToRad(par.creaseAngle))\r\n                {\r\n                    if (vcg::face::IsBorder(m.face[i],j))continue;\r\n                    m.face[i].ClearFaceEdgeS(j);\r\n                    m.face[i].FFp(j)->ClearFaceEdgeS(m.face[i].FFi(j));\r\n                }\r\n            }\r\n\r\n        m.InitFeatureCoordsTable();\r\n        //MeshPrepocess<Mesh>::InitSharpFeatures(mesh,BPar.sharp_feature_thr,BPar.feature_erode_dilate);\r\n\r\n    }\r\n\r\n    //for big meshes disabling par.surfDistCheck provides big perf improvements, sacrificing result accuracy\r\n    //static std::shared_ptr<Mesh> Remesh (Mesh & m, Params & par)\r\n    static void RemeshAdapt(Mesh & m, Params & par)\r\n    {\r\n\r\n        vcg::tri::UpdateBounding<Mesh>::Box(m);\r\n        vcg::tri::UpdateTopology<Mesh>::FaceFace(m);\r\n\r\n        typename vcg::tri::IsotropicRemeshing<Mesh>::Params para;\r\n        para.iter = par.iterations;\r\n        //para.SetFeatureAngleDeg(par.creaseAngle);\r\n\r\n        para.splitFlag    = true;\r\n        para.swapFlag     = true;\r\n        para.collapseFlag = true;\r\n        para.smoothFlag   = true;\r\n        para.projectFlag  = true;\r\n        para.selectedOnly = false;\r\n        para.adapt=false;\r\n        para.aspectRatioThr = 0.3;\r\n        para.cleanFlag = true;\r\n\r\n        para.minAdaptiveMult = par.minAdaptiveMult;\r\n        para.maxAdaptiveMult = par.maxAdaptiveMult;\r\n\r\n        para.maxSurfDist = m.bbox.Diag() / 2500.;\r\n        para.surfDistCheck = m.FN() < 400000 ? par.surfDistCheck : false;\r\n        para.userSelectedCreases = true;\r\n\r\n\r\n\r\n        ScalarType edgeL = ExpectedEdgeL(m);//,par.initialApproximateFN);//std::sqrt(2.309 * vcg::tri::Stat<Mesh>::ComputeMeshArea(m) / par.initialApproximateFN);//m.bbox.Diag() * 0.025;//std::sqrt(vcg::tri::Stat<Mesh>::ComputeMeshArea(m) * 2 / par.initialApproximateFN);\r\n\r\n        if (par.targetEdgeLen == 0)\r\n            par.targetEdgeLen = edgeL;\r\n\r\n        para.SetTargetLen(par.targetEdgeLen);\r\n\r\n\r\n        std::cout << \"Before Remeshing - faces: \" << m.FN() << \" quality: \" <<  computeAR(m) << std::endl;\r\n        vcg::tri::IsotropicRemeshing<Mesh>::Do(m, para);\r\n        std::cout << \"After Iter 0 - faces: \" << m.FN() << \" quality: \" <<  computeAR(m) << std::endl;\r\n\r\n\r\n        const ScalarType thr = 0.01;\r\n\r\n        //vcg::tri::UpdateSelection<Mesh>::VertexClear(m);\r\n        collapseSurvivingMicroEdges(m,thr);\r\n\r\n        UpdateCoherentSharp(m,par);\r\n\r\n        para.adapt = true;\r\n        para.smoothFlag   = true;\r\n        para.maxSurfDist = m.bbox.Diag() / 2500.;\r\n\r\n        vcg::tri::IsotropicRemeshing<Mesh>::Do(m, para);\r\n\r\n        m.UpdateDataStructures();\r\n\r\n        std::cout << \"After Iter 1 - faces: \" << m.FN() << \" quality: \" <<  computeAR(m) << std::endl;\r\n\r\n//        MakeEdgeSelConsistent(m);\r\n//        SelectAllBoundaryV(m);\r\n//        typename Local_Param_Smooth<Mesh>::UVSmoothParam UVP;\r\n//        UVP.FixSel=true;\r\n\r\n//        Local_Param_Smooth<Mesh>::Smooth(m,UVP);\r\n//        m.UpdateDataStructures();\r\n//        std::cout << \"After Iter 2 - faces: \" << m.FN() << \" quality: \" <<  computeAR(m) << std::endl;\r\n\r\n    }\r\n\r\n\r\n    //    static int SelectToRemesh(Mesh & m,ScalarType minR=0.2,size_t dilate=3)\r\n    //    {\r\n    //        vcg::tri::UpdateSelection<Mesh>::FaceClear(m);\r\n    //        for (size_t i=0;i<m.face.size();i++)\r\n    //        {\r\n    //            m.face[i].Q() = vcg::QualityRadii(m.face[i].cP(0),\r\n    //                                              m.face[i].cP(1),\r\n    //                                              m.face[i].cP(2));\r\n    //            if (m.face[i].Q()<minR)\r\n    //                m.face[i].SetS();\r\n    //       }\r\n    ////        //then check the borders\r\n    ////        vcg::tri::UpdateSelection<Mesh>::VertexClear(m);\r\n    ////        for (size_t i=0;i<m.face.size();i++)\r\n    ////            for (size_t j=0;j<3;j++)\r\n    ////            {\r\n    ////                if (!m.face[i].IsFaceEdgeS(j))continue;\r\n    ////                m.face[i].V0(j)->SetS();\r\n    ////                m.face[i].V1(j)->SetS();\r\n    ////            }\r\n    ////        for (size_t i=0;i<m.face.size();i++)\r\n    ////            for (size_t j=0;j<3;j++)\r\n    ////            {\r\n    ////                if (m.face[i].IsFaceEdgeS(j))continue;\r\n    ////                if (!m.face[i].V0(j)->IsS())continue;\r\n    ////                if (!m.face[i].V1(j)->IsS())continue;\r\n    ////                m.face[i].SetS();\r\n    ////            }\r\n\r\n    //        vcg::tri::UpdateSelection<Mesh>::VertexClear(m);\r\n    //        for (size_t s=0;s<dilate;s++)\r\n    //        {\r\n    //            vcg::tri::UpdateSelection<Mesh>::VertexFromFaceLoose(m);\r\n    //            vcg::tri::UpdateSelection<Mesh>::FaceFromVertexLoose(m);\r\n    //        }\r\n\r\n    //        int numS=0;\r\n    //        for (size_t i=0;i<m.face.size();i++)\r\n    //            if (m.face[i].IsS())numS++;\r\n    //        return (numS);\r\n    //    }\r\n\r\n    static int NumBadTris(Mesh & m,ScalarType minR=0.2,size_t dilate=3)\r\n    {\r\n        int numS=0;\r\n        for (size_t i=0;i<m.face.size();i++)\r\n        {\r\n            m.face[i].Q() = vcg::QualityRadii(m.face[i].cP(0),\r\n                                              m.face[i].cP(1),\r\n                                              m.face[i].cP(2));\r\n            if (m.face[i].Q()<minR)\r\n                numS++;\r\n        }\r\n        return (numS);\r\n    }\r\n\r\n    //    static void Remesh2(Mesh & m, Params & par)\r\n    //    {\r\n\r\n    //        vcg::tri::UpdateBounding<Mesh>::Box(m);\r\n    //        vcg::tri::UpdateTopology<Mesh>::FaceFace(m);\r\n\r\n    //        typename vcg::tri::IsotropicRemeshing<Mesh>::Params para;\r\n    //        para.iter = par.iterations;\r\n    //        //para.SetFeatureAngleDeg(par.creaseAngle);\r\n\r\n    //        para.splitFlag    = true;\r\n    //        para.swapFlag     = true;\r\n    //        para.collapseFlag = true;\r\n    //        para.smoothFlag   = false;\r\n    //        para.projectFlag  = false;\r\n    //        para.selectedOnly = false;\r\n    //        para.adapt=false;\r\n    //        para.aspectRatioThr = 0.3;\r\n    //        para.cleanFlag = true;\r\n    //        para.minAdaptiveMult = par.minAdaptiveMult;\r\n    //        para.maxAdaptiveMult = par.maxAdaptiveMult;\r\n\r\n    //        para.maxSurfDist = m.bbox.Diag() / 2500.;\r\n    //        para.surfDistCheck = m.FN() < 400000 ? par.surfDistCheck : false;\r\n    //        para.userSelectedCreases = true;\r\n\r\n    //        ScalarType edgeL = ExpectedEdgeL(m);\r\n\r\n    //        //if (par.targetEdgeLen == 0)\r\n    //        par.targetEdgeLen = edgeL;\r\n\r\n    //        para.SetTargetLen(par.targetEdgeLen);\r\n\r\n    //        std::cout << \"Before Remeshing - faces: \" << m.FN() << \" quality: \" <<  computeAR(m) << std::endl;\r\n    //        vcg::tri::IsotropicRemeshing<Mesh>::Do(m, para);\r\n    //        std::cout << \"After Iter 0 - faces: \" << m.FN() << \" quality: \" <<  computeAR(m) << std::endl;\r\n\r\n\r\n    //        MakeEdgeSelConsistent(m);\r\n    //        SelectAllBoundaryV(m);\r\n    //        typename Local_Param_Smooth<Mesh>::UVSmoothParam UVP;\r\n    //        UVP.FixSel=true;\r\n\r\n    //        Local_Param_Smooth<Mesh>::Smooth(m,UVP);\r\n\r\n\r\n    //        //const ScalarType thr = 0.01;\r\n    //        collapseSurvivingMicroEdges(m, 0.01);\r\n\r\n    //        m.UpdateDataStructures();\r\n\r\n    //        int MaxS=3;\r\n    //        int currS=0;\r\n    //        int NumSel0=0;\r\n    //        int NumSel1=0;\r\n    //        do{\r\n    //            //             MakeEdgeSelConsistent(m);\r\n    //            //             SelectAllBoundaryV(m);\r\n    //            //             typename Local_Param_Smooth<Mesh>::UVSmoothParam UVP;\r\n    //            //             UVP.FixSel=true;\r\n\r\n    //            //Local_Param_Smooth<Mesh>::Smooth(m,UVP);\r\n\r\n    //            NumSel0=NumBadTris(m);\r\n    //            std::cout << \"Not Nice 0: \" <<  NumSel0 << \" Faces\"<<std::endl;\r\n\r\n\r\n    //            if (NumSel0>0)\r\n    //            {\r\n    //                par.targetEdgeLen*=0.75;\r\n    //                para.SetTargetLen(par.targetEdgeLen);\r\n    //                para.maxSurfDist = m.bbox.Diag() / 2500.;\r\n    //                //para.selectedOnly=true;\r\n    //                para.adapt=true;\r\n    //                para.smoothFlag= true;\r\n    //                vcg::tri::IsotropicRemeshing<Mesh>::Do(m, para);\r\n    //                collapseSurvivingMicroEdges(m, 0.01);\r\n    //                m.UpdateDataStructures();\r\n    //            }\r\n\r\n    //            NumSel1=NumBadTris(m);\r\n    //            std::cout << \"Not Nice 1: \" <<  NumSel1 << \" Faces\"<<std::endl;\r\n    //            currS++;\r\n\r\n    //        }while ((NumSel1<NumSel0) && (currS<MaxS));\r\n    //        //        std::cout << \"Performed: \" <<  currS << \" Steps\"<<std::endl;\r\n    //        std::cout << \"After Iter Adapt - faces: \" << m.FN() << \" quality: \" <<  computeAR(m) << std::endl;\r\n\r\n    //    }\r\n\r\n    //    //for big meshes disabling par.surfDistCheck provides big perf improvements, sacrificing result accuracy\r\n    //    static void Remesh (Mesh & m, Params & par)\r\n    //    {\r\n\r\n    //        m.UpdateDataStructures();\r\n\r\n    ////        vcg::tri::UpdateBounding<Mesh>::Box(m);\r\n    ////        vcg::tri::UpdateTopology<Mesh>::FaceFace(m);\r\n\r\n    //        typename vcg::tri::IsotropicRemeshing<Mesh>::Params para;\r\n    //        para.iter = par.iterations;\r\n    //        para.SetFeatureAngleDeg(par.creaseAngle);\r\n    //        para.splitFlag    = true;\r\n    //        para.swapFlag     = true;\r\n    //        para.collapseFlag = true;\r\n    //        para.smoothFlag   = false;\r\n    //        para.projectFlag  = true;\r\n    //        para.selectedOnly = false;\r\n    //        para.adapt=false;\r\n    //        para.aspectRatioThr = 0.3;\r\n    //        para.cleanFlag = false;\r\n\r\n    //        para.minAdaptiveMult = par.minAdaptiveMult;\r\n    //        para.maxAdaptiveMult = par.maxAdaptiveMult;\r\n\r\n    //        para.maxSurfDist = m.bbox.Diag() / 2500.;\r\n    //        para.surfDistCheck = m.FN() < 400000 ? par.surfDistCheck : false;\r\n    //        para.userSelectedCreases = true;//par.userSelectedCreases;\r\n\r\n    ////        ScalarType prevFN = m.FN();\r\n    ////        ScalarType deltaFN = m.FN();\r\n\r\n    ////        ScalarType aspect = 0;\r\n    ////        ScalarType edgeLow  = 0;\r\n    //        ScalarType edgeL = std::sqrt(2.309 * vcg::tri::Stat<Mesh>::ComputeMeshArea(m) / par.initialApproximateFN);//m.bbox.Diag() * 0.025;//std::sqrt(vcg::tri::Stat<Mesh>::ComputeMeshArea(m) * 2 / par.initialApproximateFN);\r\n\r\n    //        if (par.targetEdgeLen == 0)\r\n    //            par.targetEdgeLen = edgeL;\r\n\r\n    ////        ScalarType edgeHigh = edgeL * 2.;\r\n\r\n    ////        para.SetTargetLen(par.targetEdgeLen);\r\n\r\n    ////        vcg::tri::Append<Mesh, Mesh>::MeshCopy(*ret, m);\r\n\r\n    ////        ret->UpdateDataStructures();\r\n\r\n    ////        ret->InitSharpFeatures(par.creaseAngle);\r\n    ////        ret->ErodeDilate(par.erodeDilate);\r\n\r\n\r\n    //        vcg::tri::IsotropicRemeshing<Mesh>::Do(m, para);\r\n    //        std::cout << \"Iter: \"<<  0 << \" faces: \" <<m.FN() << \" quality: \" <<  computeAR(m) << std::endl;\r\n\r\n\r\n    //        //const ScalarType thr = 0.01;\r\n    //        collapseSurvivingMicroEdges(m, 0.01);\r\n\r\n    ////        ret->UpdateDataStructures();\r\n    ////        ret->InitSharpFeatures(par.creaseAngle);\r\n    ////        ret->ErodeDilate(par.erodeDilate);\r\n    ////        MP.InitSharpFeatures(par.creaseAngle);\r\n    ////        MP.ErodeDilate(par.erodeDilate);\r\n\r\n    //        //para.SetTargetLen(par.targetEdgeLen * 0.85);\r\n    //        para.adapt = true;\r\n    //        para.smoothFlag   = true;\r\n    //        para.maxSurfDist = m.bbox.Diag() / 2500.;\r\n\r\n    //        vcg::tri::IsotropicRemeshing<Mesh>::Do(m, para);\r\n    //        auto quality = computeAR(m);\r\n    //        std::cout << \"Iter: \"<<  1 << \" faces: \" << m.FN() << \" quality: \" << quality << std::endl;\r\n\r\n    //        std::cerr << \"[REMESH] RemeshedFaces:\" << m.FN() << std::endl;\r\n    //        std::cerr << \"[REMESH] RemeshedAspect:\" << computeAR(m) << std::endl;\r\n\r\n    //        const ScalarType thr = 0.01;\r\n    //        collapseSurvivingMicroEdges(m, thr);\r\n\r\n    //        vcg::tri::UpdateSelection<Mesh>::FaceClear(m);\r\n    //        vcg::tri::UpdateTopology<Mesh>::FaceFace(m);\r\n\r\n    //        vcg::tri::ForEachFace(m, [&] (FaceType & f) {\r\n    //            if (!f.IsD() && vcg::QualityRadii(f.cP(0), f.cP(1), f.cP(2)) <= 0.01)\r\n    //                f.SetS();\r\n    //        });\r\n\r\n    //        int zeroArea = 0;\r\n    //        do\r\n    //        {\r\n    //            zeroArea = vcg::tri::Clean<Mesh>::RemoveZeroAreaFace(m);\r\n    //            std::cout << \"removed \" << zeroArea << \" zero area faces \" << std::endl;\r\n    //        }\r\n    //        while(zeroArea != 0);\r\n\r\n    //        vcg::tri::UpdateSelection<Mesh>::FaceDilate(m);\r\n    //        //\t\tvcg::tri::UpdateSelection<Mesh>::FaceDilate(*ret);\r\n    //        //\t\tvcg::tri::Smooth<Mesh>::VertexCoordLaplacian(*ret, 15, true);\r\n\r\n    //        vcg::tri::Allocator<Mesh>::CompactEveryVector(m);\r\n    //        std::cout << \"[REMESH] remeshing ends..\" << std::endl;\r\n    //        //return ret;\r\n    //    }\r\n};\r\n\r\n#endif // AUTOREMESHER_H\r\n"
  },
  {
    "path": "components/field_computation/AutoRemesherMio.h",
    "content": "        typedef vcg::tri::EdgeCollapser<Mesh, VertexPair> Collapser;\r\n"
  },
  {
    "path": "components/field_computation/basic_setup.txt",
    "content": "do_remesh 1\nremesh_iterations 15\nremesh_target_aspect_ratio 0.35\nremesh_termination_delta 10000\nsharp_feature_thr 35\nsharp_feature_erode_dilate 4\nalpha 0.3\n"
  },
  {
    "path": "components/field_computation/basic_setup_mechanical.txt",
    "content": "do_remesh 1\nremesh_iterations 15\nremesh_target_aspect_ratio 0.35\nremesh_termination_delta 10000\nsharp_feature_thr 35\nsharp_feature_erode_dilate 4\nalpha 0.3\n"
  },
  {
    "path": "components/field_computation/basic_setup_organic.txt",
    "content": "do_remesh 1\nremesh_iterations 15\nremesh_target_aspect_ratio 0.35\nremesh_termination_delta 10000\nsharp_feature_thr -1\nsharp_feature_erode_dilate 4\nalpha 0.3\n"
  },
  {
    "path": "components/field_computation/compute_field_300_mechanical.command",
    "content": "#!/bin/bash\n\nfor i in ../../test/300/Mechanical/*.obj; do\n\n\n    complete_file=\"${i}\"\n    only_file_name=$(basename $complete_file)\n    dir_name=\"${complete_file%.*}\"\n    dir_name+=\"/\"\n\n\n    new_filename=\"${dir_name}\"\"${only_file_name}\"\n\n    ./field_computation \"${new_filename}\" basic_setup_mechanical.txt batch\ndone\n"
  },
  {
    "path": "components/field_computation/compute_field_300_organic.command",
    "content": "#!/bin/bash\n\nfor i in ../../test/300/Organic/*.obj; do\n\n\n    complete_file=\"${i}\"\n    only_file_name=$(basename $complete_file)\n    dir_name=\"${complete_file%.*}\"\n    dir_name+=\"/\"\n\n\n    new_filename=\"${dir_name}\"\"${only_file_name}\"\n\n    ./field_computation \"${new_filename}\" basic_setup_organic.txt batch\ndone\n"
  },
  {
    "path": "components/field_computation/field_computation.pro",
    "content": "############################ PROJECT FILES ############################\n\ninclude(../../libs/libs.pri)\n\nHEADERS = \\\n    glwidget.h \\\n    triangle_mesh_type.h\n\nSOURCES = \\\n    glwidget.cpp \\\n    main.cpp\n\nHEADERS += \\\n    fields/field_smoother.h \\\n    fields/n_polyvector.h \\\n    fields/polyroots.h\nSOURCES += \\\n    fields/n_polyvector.cpp \\\n    fields/polyroots.cpp\n\nDEFINES += GLEW_STATIC\nDEFINES += INCLUDE_TEMPLATES\n\n\n############################ TARGET ############################\n\n#App config\nTARGET = field_computation\n\nTEMPLATE = app\nCONFIG += qt\nCONFIG += c++11\nCONFIG -= app_bundle\n\nQT += core gui opengl xml widgets\n\n#Debug/release optimization flags\nCONFIG(debug, debug|release){\n    DEFINES += DEBUG\n}\nCONFIG(release, debug|release){\n    DEFINES -= DEBUG\n    #just uncomment next line if you want to ignore asserts and got a more optimized binary\n    CONFIG += FINAL_RELEASE\n}\n\n#Final release optimization flag\nFINAL_RELEASE {\n    unix:!macx{\n        QMAKE_CXXFLAGS_RELEASE -= -g -O2\n        QMAKE_CXXFLAGS += -O3 -DNDEBUG\n    }\n}\n\nmacx {\n    QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.13\n    QMAKE_MAC_SDK = macosx10.13\n}\n\n\n############################ INCLUDES ############################\n\n#vcglib\nINCLUDEPATH += $$VCGLIB_PATH\nSOURCES += $$VCGLIB_PATH/wrap/ply/plylib.cpp\nSOURCES += $$VCGLIB_PATH/wrap/gui/trackball.cpp\nSOURCES += $$VCGLIB_PATH/wrap/gui/trackmode.cpp\nSOURCES += $$VCGLIB_PATH/wrap/qt/anttweakbarMapperNew.cpp\n\n#eigen\nINCLUDEPATH += $$EIGEN_PATH\n\n#libigl\nINCLUDEPATH += $$LIBIGL_PATH/include\nHEADERS += \\\n    $$LIBIGL_PATH/include/igl/principal_curvature.h\nSOURCES += \\\n    $$LIBIGL_PATH/include/igl/principal_curvature.cpp\n\n#AntTweakBar\nINCLUDEPATH += $$ANTTWEAKBAR_PATH/include\nLIBS += -L$$ANTTWEAKBAR_PATH/lib -lAntTweakBar\nwin32{ # Awful problem with windows..\n    DEFINES += NOMINMAX\n}\n\n#glew\nunix:!mac{\n    LIBS += -lGLU\n}\nINCLUDEPATH += $$GLEW_PATH/include\nSOURCES += $$GLEW_PATH/src/glew.c\n\ncontains(DEFINES, COMISO_FIELD) {\n    #comiso\n    LIBS += -L$$COMISO_PATH/build/Build/lib/CoMISo/ -lCoMISo\n    INCLUDEPATH += $$COMISO_PATH/..\n\n    #gmm (we have to use comiso gmm)\n    INCLUDEPATH += $$GMM_PATH/include\n\n    HEADERS += \\\n        $$LIBIGL_PATH/include/igl/copyleft/comiso/nrosy.h\n    SOURCES += \\\n        $$LIBIGL_PATH/include/igl/copyleft/comiso/nrosy.cpp\n}\n\n# Mac specific Config required to avoid to make application bundles\nmacx{\n#    CONFIG -= app_bundle\n#    LIBS += $$ANTTWEAKBAR_PATH/lib/libAntTweakBar.dylib\n    QMAKE_POST_LINK +=\"cp -P ../../../code/lib/AntTweakBar1.16/lib/libAntTweakBar.dylib . ; \"\n    QMAKE_POST_LINK +=\"install_name_tool -change ../lib/libAntTweakBar.dylib ./libAntTweakBar.dylib $$TARGET ; \"\n#    QMAKE_POST_LINK +=\"install_name_tool -change libCoMISo.dylib $$COMISO_PATH/build/Build/lib/CoMISo/libCoMISo.dylib $$TARGET ;\"\n    DEPENDPATH += .\n#    DEPENDPATH += $$COMISO_PATH/build/Build/lib/CoMISo\n#    INCLUDEPATH += $$COMISO_PATH/build/Build/lib/CoMISo\n}\n\n#Parallel computation\nunix:!mac {\n    QMAKE_CXXFLAGS += -fopenmp\n    LIBS += -fopenmp\n}\n#macx{\n#    QMAKE_CXXFLAGS += -Xpreprocessor -fopenmp -lomp -I/usr/local/include\n#    QMAKE_LFLAGS += -lomp\n#    LIBS += -L /usr/local/lib /usr/local/lib/libomp.dylib\n#}\n\nwin32{\n    DEFINES += NOMINMAX # Awful problem with windows..\n    DEFINES *= _USE_MATH_DEFINES\n    DEFINES *= _SCL_SECURE_NO_DEPRECATE\n    QMAKE_CXXFLAGS *= /bigobj\n}\n"
  },
  {
    "path": "components/field_computation/fields/field_smoother.h",
    "content": "/****************************************************************************\n* VCGLib                                                            o o     *\n* Visual and Computer Graphics Library                            o     o   *\n*                                                                _   O  _   *\n* Copyright(C) 2014                                                \\/)\\/    *\n* Visual Computing Lab                                            /\\/|      *\n* ISTI - Italian National Research Council                           |      *\n*                                                                    \\      *\n* All rights reserved.                                                      *\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 2 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 (http://www.gnu.org/licenses/gpl.txt)          *\n* for more details.                                                         *\n*                                                                           *\n****************************************************************************/\n\n#ifndef QR_FIELD_SMOOTHER_H\n#define QR_FIELD_SMOOTHER_H\n\n//eigen stuff\n#include <Eigen/Sparse>\n\n//vcg stuff\n#include <vcg/complex/algorithms/update/color.h>\n#include <vcg/complex/algorithms/update/quality.h>\n#include <vcg/complex/algorithms/parametrization/tangent_field_operators.h>\n#include <vcg/complex/algorithms/mesh_to_matrix.h>\n\n//igl related stuff\n\n#include \"fields/n_polyvector.h\"\n#include <igl/principal_curvature.h>\n#include <igl/igl_inline.h>\n\n#ifdef COMISO_FIELD\n#include <igl/copyleft/comiso/nrosy.h>\n#endif\n\nnamespace vcg {\nnamespace tri {\n\nenum SmoothMethod{SMMiq,SMNPoly,SMIterative};\n\ntemplate <class MeshType>\nclass FieldSmoother\n{\n    typedef typename MeshType::FaceType FaceType;\n    typedef typename MeshType::VertexType VertexType;\n    typedef typename MeshType::ScalarType ScalarType;\n    typedef typename MeshType::CoordType CoordType;\n\n\n    static void InitQualityByAnisotropyDir(MeshType &mesh)\n    {\n        ScalarType minV=0.00001;\n        std::vector<ScalarType> QVal;\n        for (size_t i=0;i<mesh.vert.size();i++)\n        {\n            ScalarType N1=fabs(mesh.vert[i].K1());\n            ScalarType N2=fabs(mesh.vert[i].K2());\n            QVal.push_back(N1);\n            QVal.push_back(N2);\n        }\n\n        std::sort(QVal.begin(),QVal.end());\n        int percUp=int(floor(QVal.size()*0.95+0.5));\n        ScalarType trimUp=QVal[percUp];\n\n        for (size_t i=0;i<mesh.vert.size();i++)\n        {\n            ScalarType N1=(mesh.vert[i].K1());\n            ScalarType N2=(mesh.vert[i].K2());\n\n            ScalarType NMax=std::max(N1,N2)/trimUp;\n            ScalarType NMin=std::min(N1,N2)/trimUp;\n\n            if (NMax>1)NMax=1;\n            if (NMax<-1)NMax=-1;\n\n            if (NMin>1)NMin=1;\n            if (NMin<-1)NMin=-1;\n\n            ScalarType CurvAni=(NMax-NMin)/2;\n            CurvAni=std::max(CurvAni,minV);\n            mesh.vert[i].Q()=CurvAni;\n        }\n        vcg::tri::UpdateQuality<MeshType>::FaceFromVertex(mesh);\n    }\n\n    static void SetEdgeDirection(FaceType *f,int edge)\n    {\n        CoordType dir=f->P0(edge)-f->P1(edge);\n        dir.Normalize();\n        ScalarType prod1=fabs(dir*f->PD1());\n        ScalarType prod2=fabs(dir*f->PD2());\n        if (prod1>prod2)\n        {\n            f->PD1()=dir;\n            f->PD2()=f->N()^dir;\n        }else\n        {\n            f->PD2()=dir;\n            f->PD1()=f->N()^dir;\n        }\n    }\n\n    static void AddSharpEdgesConstraints(MeshType & mesh,\n                                         const ScalarType &thr=0.2)\n    {\n        for (size_t i=0;i<mesh.face.size();i++)\n            for (int j=0;j<mesh.face[i].VN();j++)\n            {\n                FaceType *f0=&mesh.face[i];\n                FaceType *f1=f0->FFp(j);\n                if (f0==f1)continue;\n                CoordType N0=f0->N();\n                CoordType N1=f1->N();\n                if ((N0*N1)>thr)continue;\n                SetEdgeDirection(f0,j);\n                f0->SetS();\n            }\n    }\n\n    static void AddBorderConstraints(MeshType & mesh)\n    {\n        for (size_t i=0;i<mesh.face.size();i++)\n            for (int j=0;j<mesh.face[i].VN();j++)\n            {\n                FaceType *f0=&mesh.face[i];\n                FaceType *f1=f0->FFp(j);\n                assert(f1!=NULL);\n                if (f0!=f1)continue;\n                SetEdgeDirection(f0,j);\n                f0->SetS();\n            }\n    }\n\n    static void AddCurvatureConstraints(MeshType & mesh,const ScalarType &thr=0.5)\n    {\n        for (size_t i=0;i<mesh.face.size();i++)\n            if (mesh.face[i].Q()>thr)mesh.face[i].SetS();\n    }\n\n    //hard constraints have selected face\n    static void CollectHardConstraints( MeshType & mesh,\n                                        Eigen::VectorXi &HardI,\n                                        Eigen::MatrixXd &HardD,\n                                        SmoothMethod SMethod,\n                                        int Ndir)\n    {\n        //count number of hard constraints\n        int numS=vcg::tri::UpdateSelection<MeshType>::FaceCount(mesh);\n        HardI=Eigen::MatrixXi(numS,1);\n        if ((Ndir==2)||(SMethod==SMMiq))\n            HardD=Eigen::MatrixXd(numS,3);\n        else\n            HardD=Eigen::MatrixXd(numS,6);\n        //then update them\n        int curr_index=0;\n        for (size_t i=0;i<mesh.face.size();i++)\n        {\n            if (!mesh.face[i].IsS())continue;\n\n            CoordType dir=mesh.face[i].PD1();\n            dir.Normalize();\n\n            HardI(curr_index,0)=i;\n\n            HardD(curr_index,0)=dir.X();\n            HardD(curr_index,1)=dir.Y();\n            HardD(curr_index,2)=dir.Z();\n            if ((Ndir==4)&&(SMethod==SMNPoly))\n            {\n                dir=mesh.face[i].PD2();\n                HardD(curr_index,3)=dir.X();\n                HardD(curr_index,4)=dir.Y();\n                HardD(curr_index,5)=dir.Z();\n            }\n            curr_index++;\n\n        }\n\n    }\n\n    //hard constraints have selected face\n    static void CollectSoftConstraints( MeshType & mesh,\n                                        Eigen::VectorXi &SoftI,\n                                        Eigen::MatrixXd &SoftD,\n                                        Eigen::VectorXd &SoftW)\n    {\n        //count number of soft constraints\n        int numS=vcg::tri::UpdateSelection<MeshType>::FaceCount(mesh);\n        numS=mesh.fn-numS;\n        //allocate eigen matrix\n        SoftI=Eigen::MatrixXi(numS,1);\n        SoftD=Eigen::MatrixXd(numS,3);\n        SoftW=Eigen::MatrixXd(numS,1);\n\n        //then update them\n        int curr_index=0;\n        for (size_t i=0;i<mesh.face.size();i++)\n        {\n            if (mesh.face[i].IsS())continue;\n\n            CoordType dir=mesh.face[i].PD1();\n            dir.Normalize();\n\n            SoftI(curr_index,0)=i;\n\n            SoftD(curr_index,0)=dir.X();\n            SoftD(curr_index,1)=dir.Y();\n            SoftD(curr_index,2)=dir.Z();\n\n            SoftW(curr_index,0)=mesh.face[i].Q();\n            curr_index++;\n\n        }\n    }\n\n    static void SmoothMIQ(MeshType &mesh,\n                          Eigen::VectorXi &HardI,   //hard constraints index\n                          Eigen::MatrixXd &HardD,   //hard directions\n                          Eigen::VectorXi &SoftI,   //soft constraints\n                          Eigen::MatrixXd &SoftD,   //weight of soft constraints\n                          Eigen::VectorXd &SoftW,   //soft directions\n                          ScalarType alpha_soft,\n                          int Ndir)\n    {\n#ifdef COMISO_FIELD\n        assert((Ndir==2)||(Ndir==4));\n        Eigen::MatrixXi F;\n        typename vcg::tri::MeshToMatrix<MeshType>::MatrixXm Vf;\n\n        MeshToMatrix<MeshType>::GetTriMeshData(mesh,F,Vf);\n        Eigen::MatrixXd V = Vf.template cast<double>();\n\n        Eigen::MatrixXd output_field;\n        Eigen::VectorXd output_sing;\n\n        igl::copyleft::comiso::nrosy(V,F,HardI,HardD,SoftI,SoftW,SoftD,Ndir,alpha_soft,output_field,output_sing);\n\n        //finally update the principal directions\n        for (size_t i=0;i<mesh.face.size();i++)\n        {\n            CoordType dir1;\n            dir1[0]=output_field(i,0);\n            dir1[1]=output_field(i,1);\n            dir1[2]=output_field(i,2);\n\n            dir1.Normalize();\n            CoordType dir2=mesh.face[i].N()^dir1;\n            dir2.Normalize();\n\n            ScalarType Norm1=mesh.face[i].PD1().Norm();\n            ScalarType Norm2=mesh.face[i].PD2().Norm();\n\n            mesh.face[i].PD1()=dir1*Norm1;\n            mesh.face[i].PD2()=dir2*Norm2;\n        }\n#else\n        (void)mesh;\n        (void)HardI;\n        (void)HardD;\n        (void)SoftI;\n        (void)SoftD;\n        (void)SoftW;\n        (void)alpha_soft;\n        (void)Ndir;\n        assert(0);\n#endif\n    }\n\n    static void SmoothNPoly(MeshType &mesh,\n                            Eigen::VectorXi &HardI,   //hard constraints index\n                            Eigen::MatrixXd &HardD,   //hard directions\n                            int Ndir)\n    {\n        assert((Ndir==2)||(Ndir==4));\n\n        Eigen::MatrixXi F;\n        typename vcg::tri::MeshToMatrix<MeshType>::MatrixXm Vf;\n        //Eigen::MatrixXd V;\n\n        MeshToMatrix<MeshType>::GetTriMeshData(mesh,F,Vf);\n        //then cast\n        Eigen::MatrixXd V = Vf.template cast<double>();\n        Eigen::MatrixXd output_field;\n        //Eigen::VectorXd output_sing;\n\n        igl::n_polyvector(V,F,HardI,HardD,output_field);\n\n        //finally update the principal directions\n        for (size_t i=0;i<mesh.face.size();i++)\n        {\n            CoordType dir1;\n            dir1[0]=output_field(i,0);\n            dir1[1]=output_field(i,1);\n            dir1[2]=output_field(i,2);\n\n            dir1.Normalize();\n            CoordType dir2=mesh.face[i].N()^dir1;\n            dir2.Normalize();\n\n            ScalarType Norm1=mesh.face[i].PD1().Norm();\n            ScalarType Norm2=mesh.face[i].PD2().Norm();\n\n            mesh.face[i].PD1()=dir1*Norm1;\n            mesh.face[i].PD2()=dir2*Norm2;\n        }\n    }\n\n    static void PickRandomDir(MeshType &mesh,\n                              int &indexF,\n                              CoordType &Dir)\n    {\n        indexF=rand()%mesh.fn;\n        FaceType *currF=&mesh.face[indexF];\n        CoordType dirN=currF->N();\n        dirN.Normalize();\n        Dir=CoordType(1,0,0);\n        if (fabs(Dir*dirN)>0.9)\n            Dir=CoordType(0,1,0);\n        if (fabs(Dir*dirN)>0.9)\n            Dir=CoordType(0,0,1);\n\n        Dir=dirN^Dir;\n        Dir.Normalize();\n    }\n\n\n    static void GloballyOrient(MeshType &mesh)\n    {\n        vcg::tri::CrossField<MeshType>::MakeDirectionFaceCoherent(mesh,true);\n    }\n\n\n\npublic:\n\n    struct SmoothParam\n    {\n        //the 90° rotation independence while smoothing the direction field\n        int Ndir;\n        //the weight of curvature if doing the smoothing keeping the field close to the original one\n        ScalarType alpha_curv;\n        //align the field to border or not\n        bool align_borders;\n        //threshold to consider some edge as sharp feature and to use as hard constraint (0, not use)\n        ScalarType sharp_thr;\n        //threshold to consider some edge as high curvature anisotropyand to use as hard constraint (0, not use)\n        ScalarType curv_thr;\n        //the method used to smooth MIQ or \"Designing N-PolyVector Fields with Complex Polynomials\"\n        SmoothMethod SmoothM;\n        //the number of faces of the ring used ot esteem the curvature\n        int curvRing;\n        //this are additional hard constraints\n        std::vector<std::pair<int,CoordType> > AddConstr;\n        //the number of iteration in case of iterative method\n        size_t IteN;\n\n        SmoothParam()\n        {\n            Ndir=4;\n            curvRing=3;\n            alpha_curv=0.0;\n            align_borders=false;\n            SmoothM=SMMiq;\n            sharp_thr=0.0;\n            curv_thr=0.4;\n            IteN=20;\n        }\n\n    };\n\n    static void InitByCurvature(MeshType & mesh,\n                                unsigned Nring,\n                                bool UpdateFaces=true)\n    {\n\n        tri::RequirePerVertexCurvatureDir(mesh);\n\n        Eigen::MatrixXi F;\n        typename vcg::tri::MeshToMatrix<MeshType>::MatrixXm Vf;\n\n        Eigen::MatrixXd PD1,PD2,PV1,PV2;\n        MeshToMatrix<MeshType>::GetTriMeshData(mesh,F,Vf);\n        Eigen::MatrixXd V = Vf.template cast<double>();\n\n        igl::principal_curvature(V,F,PD1,PD2,PV1,PV2,Nring,true);\n\n        //then copy curvature per vertex\n        for (size_t i=0;i<mesh.vert.size();i++)\n        {\n            mesh.vert[i].PD1()=CoordType(PD1(i,0),PD1(i,1),PD1(i,2));\n            mesh.vert[i].PD2()=CoordType(PD2(i,0),PD2(i,1),PD2(i,2));\n            mesh.vert[i].K1()=PV1(i,0);\n            mesh.vert[i].K2()=PV2(i,0);\n        }\n        if (!UpdateFaces)return;\n        vcg::tri::CrossField<MeshType>::SetFaceCrossVectorFromVert(mesh);\n        InitQualityByAnisotropyDir(mesh);\n    }\n\nprivate:\n\n    static void SelectConstraints(MeshType &mesh,SmoothParam &SParam)\n    {\n        //clear all selected faces\n        vcg::tri::UpdateFlags<MeshType>::FaceClear(mesh);\n\n        //add curvature hard constraints\n        //ScalarType Ratio=mesh.bbox.Diag()*0.01;\n\n        if (SParam.curv_thr>0)\n            AddCurvatureConstraints(mesh,SParam.curv_thr);///Ratio);\n\n        //add alignment to sharp features\n        if (SParam.sharp_thr>0)\n            AddSharpEdgesConstraints(mesh,SParam.sharp_thr);\n\n        //add border constraints\n        if (SParam.align_borders)\n            AddBorderConstraints(mesh);\n\n        //aff final constraints\n        for (size_t i=0;i<SParam.AddConstr.size();i++)\n        {\n            int indexF=SParam.AddConstr[i].first;\n            CoordType dir=SParam.AddConstr[i].second;\n            mesh.face[indexF].PD1()=dir;\n            mesh.face[indexF].PD2()=mesh.face[indexF].N()^dir;\n            mesh.face[indexF].PD1().Normalize();\n            mesh.face[indexF].PD2().Normalize();\n            mesh.face[indexF].SetS();\n        }\n    }\n\n    static void SmoothDirectionsIGL(MeshType &mesh,\n                                    int Ndir,\n                                    SmoothMethod SMethod=SMNPoly,\n                                    bool HardAsS=true,\n                                    ScalarType alphaSoft=0)\n    {\n\n        assert((SMethod==SMNPoly)||(SMethod==SMMiq));\n\n        Eigen::VectorXi HardI;   //hard constraints\n        Eigen::MatrixXd HardD;   //hard directions\n        Eigen::VectorXi SoftI;   //soft constraints\n        Eigen::VectorXd SoftW;   //weight of soft constraints\n        Eigen::MatrixXd SoftD;   //soft directions\n\n        if (HardAsS)\n            CollectHardConstraints(mesh,HardI,HardD,SMethod,Ndir);\n\n        //collect soft constraints , miw only one that allows for soft constraints\n        if ((alphaSoft>0)&&(SMethod==SMMiq))\n            CollectSoftConstraints(mesh,SoftI,SoftD,SoftW);\n\n        //add some hard constraints if are not present\n        int numC=3;\n        if ((SoftI.rows()==0)&&(HardI.rows()==0))\n        {\n            printf(\"Add Forced Constraints \\n\");\n            fflush(stdout);\n            HardI=Eigen::MatrixXi(numC,1);\n\n            if ((Ndir==4)&&(SMethod==SMNPoly))\n                HardD=Eigen::MatrixXd(numC,6);\n            else\n                HardD=Eigen::MatrixXd(numC,3);\n\n            for (int i=0;i<numC;i++)\n            {\n                CoordType Dir;\n                int indexF;\n                PickRandomDir(mesh,indexF,Dir);\n\n                HardI(i,0)=indexF;\n                HardD(i,0)=Dir.X();\n                HardD(i,1)=Dir.Y();\n                HardD(i,2)=Dir.Z();\n\n                if ((Ndir==4)&&(SMethod==SMNPoly))\n                {\n                    CoordType Dir1=mesh.face[indexF].N()^Dir;\n                    Dir1.Normalize();\n                    HardD(i,3)=Dir1.X();\n                    HardD(i,4)=Dir1.Y();\n                    HardD(i,5)=Dir1.Z();\n                }\n            }\n        }\n\n        //finally smooth\n        if (SMethod==SMMiq)\n            SmoothMIQ(mesh,HardI,HardD,SoftI,SoftD,SoftW,alphaSoft,Ndir);\n        else\n        {\n            assert(SMethod==SMNPoly);\n            SmoothNPoly(mesh,HardI,HardD,Ndir);\n        }\n    }\n\npublic:\n\n    static void SmoothDirections(MeshType &mesh,SmoothParam SParam)\n    {\n\n        if ((SParam.SmoothM==SMMiq)||(SParam.SmoothM==SMNPoly))\n        {\n            //        //initialize direction by curvature if needed\n            if ((SParam.alpha_curv>0)||\n                    (SParam.sharp_thr>0)||\n                    (SParam.curv_thr>0))\n            {\n                InitByCurvature(mesh,SParam.curvRing);\n                SelectConstraints(mesh,SParam);\n            }\n            else\n            {\n                SelectConstraints(mesh,SParam);\n                vcg::tri::CrossField<MeshType>::PropagateFromSelF(mesh);\n            }\n            SmoothDirectionsIGL(mesh,SParam.Ndir,SParam.SmoothM,true,SParam.alpha_curv);\n        }\n        else\n        {\n            std::cout<<\"ITERATIVE\"<<std::endl;\n            assert(SParam.SmoothM==SMIterative);\n            InitByCurvature(mesh,SParam.curvRing);\n\n            if ((SParam.sharp_thr>0)||(SParam.curv_thr>0))\n                SelectConstraints(mesh,SParam);\n\n            bool weightByAni=(SParam.alpha_curv>0);\n            vcg::tri::CrossField<MeshType>::SmoothIterative(mesh,SParam.Ndir,(int)SParam.IteN,true,false,weightByAni);\n        }\n    }\n\n};\n\n} // end namespace tri\n} // end namespace vcg\n#endif // QR_FIELD_SMOOTHER_H\n"
  },
  {
    "path": "components/field_computation/fields/n_polyvector.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"n_polyvector.h\"\n\n#include \"igl/LinSpaced.h\"\n#include \"igl/edge_topology.h\"\n#include \"igl/local_basis.h\"\n#include \"igl/nchoosek.h\"\n#include \"igl/slice.h\"\n#include \"igl/igl_inline.h\"\n\n#include \"polyroots.h\"\n\n#include <Eigen/Sparse>\n\n#include <Eigen/Geometry>\n#include <iostream>\n#include <complex>\n\nnamespace igl {\n  template <typename DerivedV, typename DerivedF>\n  class PolyVectorFieldFinder\n  {\n  private:\n    const Eigen::PlainObjectBase<DerivedV> &V;\n    const Eigen::PlainObjectBase<DerivedF> &F; int numF;\n    const int n;\n\n    Eigen::MatrixXi EV; int numE;\n    Eigen::MatrixXi F2E;\n    Eigen::MatrixXi E2F;\n    Eigen::VectorXd K;\n\n    Eigen::VectorXi isBorderEdge;\n    int numInteriorEdges;\n    Eigen::Matrix<int,Eigen::Dynamic,2> E2F_int;\n    Eigen::VectorXi indInteriorToFull;\n    Eigen::VectorXi indFullToInterior;\n\n    DerivedV B1, B2, FN;\n\n    IGL_INLINE void computek();\n    IGL_INLINE void setFieldFromGeneralCoefficients(const  std::vector<Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic,1> > &coeffs,\n                                                    std::vector<Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 2> > &pv);\n    IGL_INLINE void computeCoefficientLaplacian(int n, Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > &D);\n    IGL_INLINE void getGeneralCoeffConstraints(const Eigen::VectorXi &isConstrained,\n                                    const Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, Eigen::Dynamic> &cfW,\n                                    int k,\n                                    Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic,1> &Ck);\n    IGL_INLINE void precomputeInteriorEdges();\n\n\n    IGL_INLINE void minQuadWithKnownMini(const Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > &Q,\n                                         const Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > &f,\n                                         const Eigen::VectorXi isConstrained,\n                                         const Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic, 1> &xknown,\n                                         Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic, 1> &x);\n\n  public:\n    IGL_INLINE PolyVectorFieldFinder(const Eigen::PlainObjectBase<DerivedV> &_V,\n                                     const Eigen::PlainObjectBase<DerivedF> &_F,\n                                     const int &_n);\n    IGL_INLINE bool solve(const Eigen::VectorXi &isConstrained,\n               const Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, Eigen::Dynamic> &cfW,\n               Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, Eigen::Dynamic> &output);\n\n  };\n}\n\ntemplate<typename DerivedV, typename DerivedF>\nIGL_INLINE igl::PolyVectorFieldFinder<DerivedV, DerivedF>::\n          PolyVectorFieldFinder(const Eigen::PlainObjectBase<DerivedV> &_V,\n                                const Eigen::PlainObjectBase<DerivedF> &_F,\n                                const int &_n):\nV(_V),\nF(_F),\nnumF(_F.rows()),\nn(_n)\n{\n\n  igl::edge_topology(V,F,EV,F2E,E2F);\n  numE = EV.rows();\n\n\n  precomputeInteriorEdges();\n\n  igl::local_basis(V,F,B1,B2,FN);\n\n  computek();\n\n};\n\n\ntemplate<typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::PolyVectorFieldFinder<DerivedV, DerivedF>::\nprecomputeInteriorEdges()\n{\n  // Flag border edges\n  numInteriorEdges = 0;\n  isBorderEdge.setZero(numE,1);\n  indFullToInterior = -1*Eigen::VectorXi::Ones(numE,1);\n\n  for(unsigned i=0; i<numE; ++i)\n  {\n    if ((E2F(i,0) == -1) || ((E2F(i,1) == -1)))\n      isBorderEdge[i] = 1;\n      else\n      {\n        indFullToInterior[i] = numInteriorEdges;\n        numInteriorEdges++;\n      }\n  }\n\n  E2F_int.resize(numInteriorEdges, 2);\n  indInteriorToFull.setZero(numInteriorEdges,1);\n  int ii = 0;\n  for (int k=0; k<numE; ++k)\n  {\n    if (isBorderEdge[k])\n      continue;\n    E2F_int.row(ii) = E2F.row(k);\n    indInteriorToFull[ii] = k;\n    ii++;\n  }\n\n}\n\n\ntemplate<typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::PolyVectorFieldFinder<DerivedV, DerivedF>::\nminQuadWithKnownMini(const Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > &Q,\n                          const Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > &f,\n                     const Eigen::VectorXi isConstrained,\n                          const Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic, 1> &xknown,\n                          Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic, 1> &x)\n{\n  int N = Q.rows();\n\n  int nc = xknown.rows();\n  Eigen::VectorXi known; known.setZero(nc,1);\n  Eigen::VectorXi unknown; unknown.setZero(N-nc,1);\n\n  int indk = 0, indu = 0;\n  for (int i = 0; i<N; ++i)\n    if (isConstrained[i])\n    {\n      known[indk] = i;\n      indk++;\n    }\n    else\n    {\n      unknown[indu] = i;\n      indu++;\n    }\n\n  Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > Quu, Quk;\n\n  igl::slice(Q,unknown, unknown, Quu);\n  igl::slice(Q,unknown, known, Quk);\n\n\n  std::vector<typename Eigen::Triplet<std::complex<typename DerivedV::Scalar> > > tripletList;\n\n  Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > fu(N-nc,1);\n\n  igl::slice(f,unknown, Eigen::VectorXi::Zero(1,1), fu);\n\n  Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > rhs = (Quk*xknown).sparseView()+.5*fu;\n\n  Eigen::SparseLU< Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > > solver;\n  solver.compute(-Quu);\n  if(solver.info()!=Eigen::Success)\n  {\n    std::cerr<<\"Decomposition failed!\"<<std::endl;\n    return;\n  }\n  Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> >  b  = solver.solve(rhs);\n  if(solver.info()!=Eigen::Success)\n  {\n    std::cerr<<\"Solving failed!\"<<std::endl;\n    return;\n  }\n\n  indk = 0, indu = 0;\n  x.setZero(N,1);\n  for (int i = 0; i<N; ++i)\n    if (isConstrained[i])\n      x[i] = xknown[indk++];\n    else\n      x[i] = b.coeff(indu++,0);\n\n}\n\n\n\ntemplate<typename DerivedV, typename DerivedF>\nIGL_INLINE bool igl::PolyVectorFieldFinder<DerivedV, DerivedF>::\n                     solve(const Eigen::VectorXi &isConstrained,\n                           const Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, Eigen::Dynamic> &cfW,\n                           Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, Eigen::Dynamic> &output)\n{\n\n  // polynomial is of the form:\n  // (-1)^0 z^(2n) +\n  // (-1)^1 c[0]z^(2n-2) +\n  // (-1)^2 c[1]z^(2n-4) +\n  // (-1)^3 c[2]z^(2n-6) +\n  // ... +\n  // (-1)^n c[n-1]\n\n  std::vector<Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic,1> > coeffs(n,Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic,1>::Zero(numF, 1));\n\n  for (int i =0; i<n; ++i)\n  {\n    int degree = 2*(i+1);\n\n    Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic,1> Ck;\n    getGeneralCoeffConstraints(isConstrained,\n                               cfW,\n                               i,\n                               Ck);\n\n    Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > DD;\n    computeCoefficientLaplacian(degree, DD);\n    Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > f; f.resize(numF,1);\n\n    minQuadWithKnownMini(DD, f, isConstrained, Ck, coeffs[i]);\n  }\n\n  std::vector<Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 2> > pv;\n  setFieldFromGeneralCoefficients(coeffs, pv);\n\n  output.setZero(numF,3*n);\n  for (int fi=0; fi<numF; ++fi)\n  {\n    const Eigen::Matrix<typename DerivedV::Scalar, 1, 3> &b1 = B1.row(fi);\n    const Eigen::Matrix<typename DerivedV::Scalar, 1, 3> &b2 = B2.row(fi);\n    for (int i=0; i<n; ++i)\n      output.block(fi,3*i, 1, 3) = pv[i](fi,0)*b1 + pv[i](fi,1)*b2;\n  }\n  return true;\n}\n\ntemplate<typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::PolyVectorFieldFinder<DerivedV, DerivedF>::setFieldFromGeneralCoefficients(const  std::vector<Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic,1> > &coeffs,\n                                                            std::vector<Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 2> > &pv)\n{\n  pv.assign(n, Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 2>::Zero(numF, 2));\n  for (int i = 0; i <numF; ++i)\n  {\n\n    //    poly coefficients: 1, 0, -Acoeff, 0, Bcoeff\n    //    matlab code from roots (given there are no trailing zeros in the polynomial coefficients)\n    Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic,1> polyCoeff;\n    polyCoeff.setZero(2*n+1,1);\n    polyCoeff[0] = 1.;\n    int sign = 1;\n    for (int k =0; k<n; ++k)\n    {\n      sign = -sign;\n      int degree = 2*(k+1);\n      polyCoeff[degree] = (1.*sign)*coeffs[k](i);\n    }\n\n    Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic,1> roots;\n    igl::polyRoots<std::complex<typename DerivedV::Scalar>, typename DerivedV::Scalar >(polyCoeff,roots);\n\n    Eigen::VectorXi done; done.setZero(2*n,1);\n\n    Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic,1> u(n,1);\n    int ind =0;\n    for (int k=0; k<2*n; ++k)\n    {\n      if (done[k])\n        continue;\n      u[ind] = roots[k];\n      done[k] = 1;\n\n      int mini = -1;\n      double mind = 1e10;\n      for (int l =k+1; l<2*n; ++l)\n      {\n        double dist = abs(roots[l]+u[ind]);\n        if (dist<mind)\n        {\n          mind = dist;\n          mini = l;\n        }\n      }\n      done[mini] = 1;\n      ind ++;\n    }\n    for (int k=0; k<n; ++k)\n    {\n      pv[k](i,0) = real(u[k]);\n      pv[k](i,1) = imag(u[k]);\n    }\n  }\n\n}\n\n\ntemplate<typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::PolyVectorFieldFinder<DerivedV, DerivedF>::computeCoefficientLaplacian(int n, Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > &D)\n{\n  std::vector<Eigen::Triplet<std::complex<typename DerivedV::Scalar> > > tripletList;\n\n  // For every non-border edge\n  for (unsigned eid=0; eid<numE; ++eid)\n  {\n    if (!isBorderEdge[eid])\n    {\n      int fid0 = E2F(eid,0);\n      int fid1 = E2F(eid,1);\n\n      tripletList.push_back(Eigen::Triplet<std::complex<typename DerivedV::Scalar> >(fid0,\n                                           fid0,\n                                           std::complex<typename DerivedV::Scalar>(1.)));\n      tripletList.push_back(Eigen::Triplet<std::complex<typename DerivedV::Scalar> >(fid1,\n                                           fid1,\n                                           std::complex<typename DerivedV::Scalar>(1.)));\n      tripletList.push_back(Eigen::Triplet<std::complex<typename DerivedV::Scalar> >(fid0,\n                                           fid1,\n                                                                                     -1.*std::polar(1.,-1.*n*K[eid])));\n      tripletList.push_back(Eigen::Triplet<std::complex<typename DerivedV::Scalar> >(fid1,\n                                           fid0,\n                                                                                     -1.*std::polar(1.,1.*n*K[eid])));\n\n    }\n  }\n  D.resize(numF,numF);\n  D.setFromTriplets(tripletList.begin(), tripletList.end());\n\n\n}\n\ntemplate<typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::PolyVectorFieldFinder<DerivedV, DerivedF>::getGeneralCoeffConstraints(const Eigen::VectorXi &isConstrained,\n                                                       const Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, Eigen::Dynamic> &cfW,\n                                                       int k,\n                                                       Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic,1> &Ck)\n{\n  int numConstrained = isConstrained.sum();\n  Ck.resize(numConstrained,1);\n  int n = cfW.cols()/3;\n\n  Eigen::MatrixXi allCombs;\n  {\n    Eigen::VectorXi V = igl::LinSpaced<Eigen::VectorXi >(n,0,n-1);\n    igl::nchoosek(V,k+1,allCombs);\n  }\n\n\n  int ind = 0;\n  for (int fi = 0; fi <numF; ++fi)\n  {\n    const Eigen::Matrix<typename DerivedV::Scalar, 1, 3> &b1 = B1.row(fi);\n    const Eigen::Matrix<typename DerivedV::Scalar, 1, 3> &b2 = B2.row(fi);\n    if(isConstrained[fi])\n    {\n      std::complex<typename DerivedV::Scalar> ck(0);\n\n      for (int j = 0; j < allCombs.rows(); ++j)\n      {\n        std::complex<typename DerivedV::Scalar> tk(1.);\n        //collect products\n        for (int i = 0; i < allCombs.cols(); ++i)\n        {\n          int index = allCombs(j,i);\n\n          const Eigen::Matrix<typename DerivedV::Scalar, 1, 3> &w = cfW.block(fi,3*index,1,3);\n          typename DerivedV::Scalar w0 = w.dot(b1);\n          typename DerivedV::Scalar w1 = w.dot(b2);\n          std::complex<typename DerivedV::Scalar> u(w0,w1);\n          tk*= u*u;\n        }\n        //collect sum\n        ck += tk;\n      }\n      Ck(ind) = ck;\n      ind ++;\n    }\n  }\n\n\n}\n\ntemplate<typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::PolyVectorFieldFinder<DerivedV, DerivedF>::computek()\n{\n  K.setZero(numE);\n  // For every non-border edge\n  for (unsigned eid=0; eid<numE; ++eid)\n  {\n    if (!isBorderEdge[eid])\n    {\n      int fid0 = E2F(eid,0);\n      int fid1 = E2F(eid,1);\n\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> N0 = FN.row(fid0);\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> N1 = FN.row(fid1);\n\n      // find common edge on triangle 0 and 1\n      int fid0_vc = -1;\n      int fid1_vc = -1;\n      for (unsigned i=0;i<3;++i)\n      {\n        if (F2E(fid0,i) == eid)\n          fid0_vc = i;\n        if (F2E(fid1,i) == eid)\n          fid1_vc = i;\n      }\n      assert(fid0_vc != -1);\n      assert(fid1_vc != -1);\n\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> common_edge = V.row(F(fid0,(fid0_vc+1)%3)) - V.row(F(fid0,fid0_vc));\n      common_edge.normalize();\n\n      // Map the two triangles in a new space where the common edge is the x axis and the N0 the z axis\n      Eigen::Matrix<typename DerivedV::Scalar, 3, 3> P;\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> o = V.row(F(fid0,fid0_vc));\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> tmp = -N0.cross(common_edge);\n      P << common_edge, tmp, N0;\n//      P.transposeInPlace();\n\n\n      Eigen::Matrix<typename DerivedV::Scalar, 3, 3> V0;\n      V0.row(0) = V.row(F(fid0,0)) -o;\n      V0.row(1) = V.row(F(fid0,1)) -o;\n      V0.row(2) = V.row(F(fid0,2)) -o;\n\n      V0 = (P*V0.transpose()).transpose();\n\n//      assert(V0(0,2) < 1e-10);\n//      assert(V0(1,2) < 1e-10);\n//      assert(V0(2,2) < 1e-10);\n\n      Eigen::Matrix<typename DerivedV::Scalar, 3, 3> V1;\n      V1.row(0) = V.row(F(fid1,0)) -o;\n      V1.row(1) = V.row(F(fid1,1)) -o;\n      V1.row(2) = V.row(F(fid1,2)) -o;\n      V1 = (P*V1.transpose()).transpose();\n\n//      assert(V1(fid1_vc,2) < 10e-10);\n//      assert(V1((fid1_vc+1)%3,2) < 10e-10);\n\n      // compute rotation R such that R * N1 = N0\n      // i.e. map both triangles to the same plane\n      double alpha = -atan2(V1((fid1_vc+2)%3,2),V1((fid1_vc+2)%3,1));\n\n      Eigen::Matrix<typename DerivedV::Scalar, 3, 3> R;\n      R << 1,          0,            0,\n      0, cos(alpha), -sin(alpha) ,\n      0, sin(alpha),  cos(alpha);\n      V1 = (R*V1.transpose()).transpose();\n\n//      assert(V1(0,2) < 1e-10);\n//      assert(V1(1,2) < 1e-10);\n//      assert(V1(2,2) < 1e-10);\n\n      // measure the angle between the reference frames\n      // k_ij is the angle between the triangle on the left and the one on the right\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> ref0 = V0.row(1) - V0.row(0);\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> ref1 = V1.row(1) - V1.row(0);\n\n      ref0.normalize();\n      ref1.normalize();\n\n      double ktemp = atan2(ref1(1),ref1(0)) - atan2(ref0(1),ref0(0));\n\n      // just to be sure, rotate ref0 using angle ktemp...\n      Eigen::Matrix<typename DerivedV::Scalar, 2, 2> R2;\n      R2 << cos(ktemp), -sin(ktemp), sin(ktemp), cos(ktemp);\n\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 2> tmp1 = R2*(ref0.head(2)).transpose();\n\n//      assert(tmp1(0) - ref1(0) < 1e-10);\n//      assert(tmp1(1) - ref1(1) < 1e-10);\n\n      K[eid] = ktemp;\n    }\n  }\n\n}\n\n\nIGL_INLINE void igl::n_polyvector(const Eigen::MatrixXd &V,\n                             const Eigen::MatrixXi &F,\n                             const Eigen::VectorXi& b,\n                             const Eigen::MatrixXd& bc,\n                             Eigen::MatrixXd &output)\n{\n  Eigen::VectorXi isConstrained = Eigen::VectorXi::Constant(F.rows(),0);\n  Eigen::MatrixXd cfW = Eigen::MatrixXd::Constant(F.rows(),bc.cols(),0);\n\n  for(unsigned i=0; i<b.size();++i)\n  {\n    isConstrained(b(i)) = 1;\n    cfW.row(b(i)) << bc.row(i);\n  }\n  if (b.size() == F.rows())\n  {\n    output = cfW;\n    return;\n  }\n\n  int n = cfW.cols()/3;\n  igl::PolyVectorFieldFinder<Eigen::MatrixXd, Eigen::MatrixXi> pvff(V,F,n);\n  pvff.solve(isConstrained, cfW, output);\n}\n\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#endif\n"
  },
  {
    "path": "components/field_computation/fields/n_polyvector.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_N_POLYVECTOR\n#define IGL_N_POLYVECTOR\n#include \"igl/igl_inline.h\"\n\n#include <Eigen/Core>\n#include <vector>\n\nnamespace igl {\n  //todo\n  /// Given 2 vectors centered on origin calculate the rotation matrix from first to the second\n\n  // Inputs:\n  //   v0, v1         the two #3 by 1 vectors\n  //   normalized     boolean, if false, then the vectors are normalized prior to the calculation\n  // Output:\n  //                  3 by 3 rotation matrix that takes v0 to v1\n  //\n\n  IGL_INLINE void n_polyvector(const Eigen::MatrixXd& V,\n                               const Eigen::MatrixXi& F,\n                               const Eigen::VectorXi& b,\n                               const Eigen::MatrixXd& bc,\n                               Eigen::MatrixXd &output);\n\n};\n\n\n#ifndef IGL_STATIC_LIBRARY\n#include \"n_polyvector.cpp\"\n#endif\n\n\n#endif /* defined(IGL_N_POLYVECTOR) */\n"
  },
  {
    "path": "components/field_computation/fields/polyroots.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"polyroots.h\"\n#include <Eigen/Eigenvalues>\n\ntemplate <typename S, typename T>\nIGL_INLINE void igl::polyRoots(Eigen::Matrix<S, Eigen::Dynamic,1> &polyCoeff, //real or comples coefficients\n                          Eigen::Matrix<std::complex<T>, Eigen::Dynamic,1> &roots // complex roots (double or float)\n)\n{\n  //  degree\n  int n = polyCoeff.rows() - 1;\n\n  Eigen::Matrix<S, Eigen::Dynamic, 1> d (n,1);\n  d = polyCoeff.tail(n)/polyCoeff(0);\n\n  Eigen::Matrix<S, Eigen::Dynamic, Eigen::Dynamic> I; I.setIdentity(n-1,n-1);\n  Eigen::Matrix<S, Eigen::Dynamic, 1> z; z.setZero(n-1,1);\n\n  Eigen::Matrix<S, Eigen::Dynamic, Eigen::Dynamic> a(n,n);\n  a<<-d.transpose(),I,z;\n  roots = a.eigenvalues();\n\n}\n\n\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::polyRoots<std::complex<double>, double>(Eigen::Matrix<std::complex<double>, -1, 1, 0, -1, 1>&, Eigen::Matrix<std::complex<double>, -1, 1, 0, -1, 1>&);\ntemplate void igl::polyRoots<double, double>(Eigen::Matrix<double, -1, 1, 0, -1, 1>&, Eigen::Matrix<std::complex<double>, -1, 1, 0, -1, 1>&);\n#endif\n"
  },
  {
    "path": "components/field_computation/fields/polyroots.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_POLYROOTS\n#define IGL_POLYROOTS\n#include \"igl/igl_inline.h\"\n\n#include <Eigen/Core>\n\nnamespace igl {\n  //todo\n  /// Given 2 vectors centered on origin calculate the rotation matrix from first to the second\n\n  // Inputs:\n  //   v0, v1         the two #3 by 1 vectors\n  //   normalized     boolean, if false, then the vectors are normalized prior to the calculation\n  // Output:\n  //                  3 by 3 rotation matrix that takes v0 to v1\n  //\n  template <typename S, typename T>\n  IGL_INLINE void polyRoots(Eigen::Matrix<S, Eigen::Dynamic,1> &polyCoeff, //real or comples coefficients\n                            Eigen::Matrix<std::complex<T>, Eigen::Dynamic,1> &roots // complex roots (double or float)\n                            );\n}\n\n\n#ifndef IGL_STATIC_LIBRARY\n#include \"polyroots.cpp\"\n#endif\n\n\n#endif /* defined(IGL_NCHOOSEK) */\n"
  },
  {
    "path": "components/field_computation/gl_utils.h",
    "content": "/***************************************************************************/\n/* Copyright(C) 2021\n\n\nThe authors of\n\nReliable Feature-Line Driven Quad-Remeshing\nSiggraph 2021\n\n\n All rights reserved.\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <https://www.gnu.org/licenses/>.\n****************************************************************************/\n\n#ifndef GL_UTILS\n#define GL_UTILS\n\n\n#include <wrap/gl/trimesh.h>\n\ntemplate <class MeshType>\nvoid GLDrawSharpEdges(MeshType &mesh)\n{\n    typedef typename MeshType::CoordType  CoordType;\n\n    glPushAttrib(GL_ALL_ATTRIB_BITS);\n    glDisable(GL_LIGHTING);\n    glDepthRange(0,0.9999);\n    glLineWidth(5);\n    glBegin(GL_LINES);\n    for (size_t i=0;i<mesh.face.size();i++)\n        for (size_t j=0;j<3;j++)\n        {\n            if (!mesh.face[i].IsFaceEdgeS(j))continue;\n\n            if (mesh.face[i].FKind[j]==ETConcave)\n                vcg::glColor(vcg::Color4b(0,0,255,255));\n            else\n                vcg::glColor(vcg::Color4b(255,0,0,255));\n\n            CoordType Pos0=mesh.face[i].P0(j);\n            CoordType Pos1=mesh.face[i].P1(j);\n            vcg::glVertex(Pos0);\n            vcg::glVertex(Pos1);\n        }\n    glEnd();\n    glPopAttrib();\n}\n\n\n\n#endif\n"
  },
  {
    "path": "components/field_computation/glwidget.cpp",
    "content": "/***************************************************************************/\n/* Copyright(C) 2021\n\n\nThe authors of\n\nReliable Feature-Line Driven Quad-Remeshing\nSiggraph 2021\n\n\n All rights reserved.\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <https://www.gnu.org/licenses/>.\n****************************************************************************/\n\n#include <GL/glew.h>\n#include <QMouseEvent>\n\n#include <chrono>\n\n#include <math.h>\n#include \"glwidget.h\"\n#include \"mesh_manager.h\"\n#include \"fields/field_smoother.h\"\n#include \"triangle_mesh_type.h\"\n#include \"poly_mesh_type.h\"\n#include <wrap/qt/trackball.h>\n#include <wrap/gl/picking.h>\n#include <wrap/qt/anttweakbarMapper.h>\n#include <wrap/io_trimesh/import_field.h>\n#include <wrap/io_trimesh/export_field.h>\n#include <wrap/io_trimesh/export.h>\n#include <wrap/gl/trimesh.h>\n//#include <vcg/complex/algorithms/parametrization/tangent_field_operators.h>\n#include <wrap/gl/gl_field.h>\n#include <AutoRemesher.h>\n#include <vcg/complex/algorithms/hole.h>\n#include \"mesh_field_smoother.h\"\n#include \"gl_utils.h\"\n\n#ifdef MIQ_QUADRANGULATE\n#include <wrap/igl/miq_parametrization.h>\n#include <vcg/complex/algorithms/quadrangulator.h>\n#endif\n\nstd::string pathM=\"\";\nstd::string pathS=\"\";\n\nvcg::Trackball track;//the active manipulator\n\nbool drawfield=false;\n\nFieldTriMesh tri_mesh;\n\n#ifdef MIQ_QUADRANGULATE\nPMesh quad_mesh;\nbool quadrangulated=false;\nvcg::tri::MiQParametrizer<FieldTriMesh>::MIQParameters MiqP;\n#endif\n\nTwBar *barQuad;\n\nvcg::GlTrimesh<FieldTriMesh> glWrap;\nvcg::GLField<FieldTriMesh> glField;\n\ntypedef typename FieldTriMesh::ScalarType ScalarType;\ntypedef typename FieldTriMesh::CoordType CoordType;\n\nint Iterations;\nScalarType EdgeStep;\nScalarType Multiplier=2;\nScalarType SharpFactor=6;\nScalarType alpha=0.3;\n//ScalarType sharp_feature_thr=45;\n\n\nint xMouse,yMouse;\n\n//vcg::GridStaticPtr<FieldTriMesh::FaceType,FieldTriMesh::ScalarType> Gr;\n\ntypedef vcg::tri::FieldSmoother<FieldTriMesh> FieldSmootherType;\nFieldSmootherType::SmoothParam FieldParam;\n\nAutoRemesher<FieldTriMesh>::Params RemPar;\nbool do_batch=false;\nbool has_features=false;\nbool has_features_fl=false;\n//size_t ErodeDilateSteps=4;\n\nbool do_remesh=true;\nint remesher_iterations=15;\nScalarType remesher_aspect_ratio=0.3;\nint remesher_termination_delta=10000;\nbool surf_dist_check=true;\nScalarType sharp_feature_thr=35;\nint feature_erode_dilate=4;\n\n//MeshPrepocess<FieldTriMesh> MP(tri_mesh);\n\nvoid InitSharp()\n{\n    assert(!(has_features || has_features_fl));\n    tri_mesh.UpdateDataStructures();\n    tri_mesh.InitSharpFeatures(sharp_feature_thr);\n    //MP.InitSharpFeatures(sharp_feature_thr);\n}\n\n\n//void DoAutoRemesh()\n//{\n//    RemPar.iterations   = remesher_iterations;\n//    RemPar.targetAspect = remesher_aspect_ratio;\n//    RemPar.targetDeltaFN= remesher_termination_delta;\n//    RemPar.creaseAngle  = sharp_feature_thr;\n//    RemPar.erodeDilate  = feature_erode_dilate;\n//    RemPar.userSelectedCreases = true;\n//    RemPar.surfDistCheck = true;\n\n//    auto t1 = std::chrono::high_resolution_clock::now();\n//    std::cout << \"cleaning the mesh...\" << std::endl;\n//    std::shared_ptr<FieldTriMesh> clean = AutoRemesher<FieldTriMesh>::CleanMesh(tri_mesh, false);\n//    auto t2 = std::chrono::high_resolution_clock::now();\n//    std::cout << \"Cleaning time: \" << std::chrono::duration_cast<std::chrono::seconds>( t2 - t1 ).count() << std::endl;\n\n//    t1 = std::chrono::high_resolution_clock::now();\n//    clean->UpdateDataStructures();\n\n////    MP.InitSharpFeatures(sharp_feature_thr);\n////    MP.ErodeDilate(feature_erode_dilate);\n//    clean->InitSharpFeatures(sharp_feature_thr);\n//    clean->ErodeDilate(feature_erode_dilate);\n\n//    t2 = std::chrono::high_resolution_clock::now();\n//    std::cout << \"Sharp Features time: \" << std::chrono::duration_cast<std::chrono::seconds>( t2 - t1 ).count() << std::endl;\n\n//    t1 = std::chrono::high_resolution_clock::now();\n//    std::shared_ptr<FieldTriMesh> ret=AutoRemesher<FieldTriMesh>::Remesh(*clean,RemPar);\n//    t2 = std::chrono::high_resolution_clock::now();\n//    std::cout << \"Remesh time: \" << std::chrono::duration_cast<std::chrono::seconds>( t2 - t1 ).count() << std::endl;\n//    AutoRemesher<FieldTriMesh>::SplitNonManifold(*ret);\n\n//    tri_mesh.Clear();\n//    vcg::tri::Append<FieldTriMesh,FieldTriMesh>::Mesh(tri_mesh,(*ret));\n//    vcg::tri::Clean<FieldTriMesh>::RemoveUnreferencedVertex(tri_mesh);\n//    vcg::tri::Allocator<FieldTriMesh>::CompactEveryVector(tri_mesh);\n//    tri_mesh.UpdateDataStructures();\n//    //MeshPrepocess<FieldTriMesh>::AutoRemesh(tri_mesh,RemPar);\n//    Gr.Set(tri_mesh.face.begin(),tri_mesh.face.end());\n//}\n\n//void DoAutoRemesh()\n//{\n//    RemPar.iterations   = remesher_iterations;\n//    RemPar.targetAspect = remesher_aspect_ratio;\n//    RemPar.targetDeltaFN= remesher_termination_delta;\n//    RemPar.creaseAngle  = sharp_feature_thr;\n//    RemPar.erodeDilate  = feature_erode_dilate;\n//    RemPar.userSelectedCreases = true;\n//    RemPar.surfDistCheck = false;\n\n//    auto t1 = std::chrono::high_resolution_clock::now();\n//    std::cout << \"cleaning the mesh...\" << std::endl;\n//    std::shared_ptr<FieldTriMesh> clean = AutoRemesher<FieldTriMesh>::CleanMesh(tri_mesh, false);\n//    auto t2 = std::chrono::high_resolution_clock::now();\n//    std::cout << \"Cleaning time: \" << std::chrono::duration_cast<std::chrono::seconds>( t2 - t1 ).count() << std::endl;\n\n//    t1 = std::chrono::high_resolution_clock::now();\n//    clean->UpdateDataStructures();\n\n////    clean->InitSharpFeatures(sharp_feature_thr);\n////    clean->ErodeDilate(feature_erode_dilate);\n\n//    t2 = std::chrono::high_resolution_clock::now();\n//    std::cout << \"Sharp Features time: \" << std::chrono::duration_cast<std::chrono::seconds>( t2 - t1 ).count() << std::endl;\n\n//    t1 = std::chrono::high_resolution_clock::now();\n//    std::shared_ptr<FieldTriMesh> ret=AutoRemesher<FieldTriMesh>::Remesh(*clean,RemPar);\n//    t2 = std::chrono::high_resolution_clock::now();\n//    std::cout << \"Remesh time: \" << std::chrono::duration_cast<std::chrono::seconds>( t2 - t1 ).count() << std::endl;\n//    AutoRemesher<FieldTriMesh>::SplitNonManifold(*ret);\n\n//    tri_mesh.Clear();\n//    vcg::tri::Append<FieldTriMesh,FieldTriMesh>::Mesh(tri_mesh,(*ret));\n//    vcg::tri::Clean<FieldTriMesh>::RemoveUnreferencedVertex(tri_mesh);\n//    vcg::tri::Allocator<FieldTriMesh>::CompactEveryVector(tri_mesh);\n//    tri_mesh.UpdateDataStructures();\n\n//    tri_mesh.InitSharpFeatures(sharp_feature_thr);\n//    tri_mesh.ErodeDilate(feature_erode_dilate);\n\n//    //MeshPrepocess<FieldTriMesh>::AutoRemesh(tri_mesh,RemPar);\n//    Gr.Set(tri_mesh.face.begin(),tri_mesh.face.end());\n//}\n\n\n//void DoAutoRemesh()\n//{\n//    RemPar.iterations   = remesher_iterations;\n//    RemPar.targetAspect = remesher_aspect_ratio;\n//    RemPar.targetDeltaFN= remesher_termination_delta;\n//    RemPar.creaseAngle  = sharp_feature_thr;\n//    RemPar.erodeDilate  = feature_erode_dilate;\n//    RemPar.userSelectedCreases = true;\n//    RemPar.surfDistCheck = false;\n\n//    auto t1 = std::chrono::high_resolution_clock::now();\n//    std::cout << \"cleaning the mesh...\" << std::endl;\n//    std::shared_ptr<FieldTriMesh> clean = AutoRemesher<FieldTriMesh>::CleanMesh(tri_mesh, false);\n//    auto t2 = std::chrono::high_resolution_clock::now();\n//    std::cout << \"Cleaning time: \" << std::chrono::duration_cast<std::chrono::seconds>( t2 - t1 ).count() << std::endl;\n\n//    t1 = std::chrono::high_resolution_clock::now();\n//    clean->UpdateDataStructures();\n\n////    clean->InitSharpFeatures(sharp_feature_thr);\n////    clean->ErodeDilate(feature_erode_dilate);\n\n//    t2 = std::chrono::high_resolution_clock::now();\n//    std::cout << \"Sharp Features time: \" << std::chrono::duration_cast<std::chrono::seconds>( t2 - t1 ).count() << std::endl;\n\n//    t1 = std::chrono::high_resolution_clock::now();\n//    std::shared_ptr<FieldTriMesh> ret=AutoRemesher<FieldTriMesh>::Remesh(*clean,RemPar);\n//    t2 = std::chrono::high_resolution_clock::now();\n//    std::cout << \"Remesh time: \" << std::chrono::duration_cast<std::chrono::seconds>( t2 - t1 ).count() << std::endl;\n//    AutoRemesher<FieldTriMesh>::SplitNonManifold(*ret);\n\n//    tri_mesh.Clear();\n//    vcg::tri::Append<FieldTriMesh,FieldTriMesh>::Mesh(tri_mesh,(*ret));\n//    vcg::tri::Clean<FieldTriMesh>::RemoveUnreferencedVertex(tri_mesh);\n//    vcg::tri::Allocator<FieldTriMesh>::CompactEveryVector(tri_mesh);\n//    tri_mesh.UpdateDataStructures();\n\n//    tri_mesh.InitSharpFeatures(sharp_feature_thr);\n//    tri_mesh.ErodeDilate(feature_erode_dilate);\n\n//    //MeshPrepocess<FieldTriMesh>::AutoRemesh(tri_mesh,RemPar);\n//    Gr.Set(tri_mesh.face.begin(),tri_mesh.face.end());\n//}\n\nvoid SaveAllData()\n{\n    MeshPrepocess<FieldTriMesh>::SaveAllData(tri_mesh,pathM);\n//    std::string projM=pathM;\n//    size_t indexExt=projM.find_last_of(\".\");\n//    projM=projM.substr(0,indexExt);\n//    std::string meshName=projM+std::string(\"_rem.obj\");\n//    std::string fieldName=projM+std::string(\"_rem.rosy\");\n//    std::string sharpName=projM+std::string(\"_rem.sharp\");\n//    std::cout<<\"Saving Mesh TO:\"<<meshName.c_str()<<std::endl;\n//    std::cout<<\"Saving Field TO:\"<<fieldName.c_str()<<std::endl;\n//    std::cout<<\"Saving Sharp TO:\"<<sharpName.c_str()<<std::endl;\n//    tri_mesh.SaveTriMesh(meshName.c_str());\n//    tri_mesh.SaveField(fieldName.c_str());\n//    tri_mesh.SaveSharpFeatures(sharpName.c_str());\n\n\n////    std::string orFaceName=projM+std::string(\"_rem_origf.txt\");\n////    std::cout<<\"Saving Field TO:\"<<orFaceName.c_str()<<std::endl;\n////    tri_mesh.SaveOrigFace(orFaceName.c_str());\n\n//    //MP.SaveSharpFeatures(sharpName.c_str());\n\n//    //tri_mesh.SaveTriMesh()\n}\n\nvoid DoBatchProcess ()\n{\n    typename MeshPrepocess<FieldTriMesh>::BatchParam BPar;\n    BPar.DoRemesh=do_remesh;\n    BPar.feature_erode_dilate=feature_erode_dilate;\n    BPar.remesher_aspect_ratio=remesher_aspect_ratio;\n    BPar.remesher_iterations=remesher_iterations;\n    BPar.remesher_termination_delta=remesher_termination_delta;\n    BPar.SharpFactor=SharpFactor;\n    BPar.sharp_feature_thr=sharp_feature_thr;\n    BPar.surf_dist_check=surf_dist_check;\n    BPar.UpdateSharp=(!(has_features || has_features_fl));\n    MeshPrepocess<FieldTriMesh>::BatchProcess(tri_mesh,BPar,FieldParam);\n    drawfield=true;\n}\n\nvoid DoAutoRemesh()\n{\n    RemPar.iterations   = remesher_iterations;\n    RemPar.targetAspect = remesher_aspect_ratio;\n    RemPar.targetDeltaFN= remesher_termination_delta;\n    RemPar.creaseAngle  = sharp_feature_thr;\n    RemPar.erodeDilate  = feature_erode_dilate;\n\n    //RemPar.userSelectedCreases = true;\n    RemPar.surfDistCheck = surf_dist_check;\n\n    AutoRemesher<FieldTriMesh>::RemeshAdapt(tri_mesh,RemPar);\n    //AutoRemesher<FieldTriMesh>::RemeshAdapt(tri_mesh,RemPar);\n\n    tri_mesh.InitEdgeType();\n    tri_mesh.InitFeatureCoordsTable();\n//    tri_mesh.InitSharpFeatures(sharp_feature_thr);\n//    tri_mesh.ErodeDilate(feature_erode_dilate);\n\n    //MeshPrepocess<FieldTriMesh>::AutoRemesh(tri_mesh,RemPar);\n//    Gr.Set(tri_mesh.face.begin(),tri_mesh.face.end());\n}\n\nvoid TW_CALL CleanMesh(void *)\n {\n   MeshPrepocess<FieldTriMesh>::SolveGeometricArtifacts(tri_mesh);\n }\n\nvoid TW_CALL AutoRemesh(void *)\n{\n    DoAutoRemesh();\n}\n\nvoid TW_CALL InitSharpFeatures(void *)\n{\n   InitSharp();\n}\n\nvoid TW_CALL RefineIfNeeded(void *)\n{\n   // tri_mesh.RefineIfNeeded();\n    MeshPrepocess<FieldTriMesh>::RefineIfNeeded(tri_mesh);\n    //MP.RefineIfNeeded();\n    //Gr.Set(tri_mesh.face.begin(),tri_mesh.face.end());\n}\n\nvoid TW_CALL BatchProcess(void *)\n{\n    DoBatchProcess();\n}\n\nvoid TW_CALL SmoothField(void *)\n{\n//    //tri_mesh.SplitFolds();\n//    MeshPrepocess<FieldTriMesh>::SplitFolds(tri_mesh);\n//    //tri_mesh.RemoveFolds();\n//    MeshPrepocess<FieldTriMesh>::RemoveFolds(tri_mesh);\n//    //tri_mesh.RemoveSmallComponents();\n//    MeshPrepocess<FieldTriMesh>::RemoveSmallComponents(tri_mesh);\n//    MP.SplitFolds();\n//    MP.RemoveFolds();\n//    MP.RemoveSmallComponents();\n\n    //vcg::tri::io::ExporterPLY<FieldTriMesh>::Save(tri_mesh,\"test0.ply\");\n    //tri_mesh.SmoothField(FieldParam);\n    MeshFieldSmoother<FieldTriMesh>::SmoothField(tri_mesh,FieldParam);\n    //vcg::tri::io::ExporterPLY<FieldTriMesh>::Save(tri_mesh,\"test1.ply\");\n    drawfield=true;\n\n    //Gr.Set(tri_mesh.face.begin(),tri_mesh.face.end());\n}\n\n\n\n#ifdef MIQ_QUADRANGULATE\nvoid TW_CALL MiqQuadrangulate(void *)\n{\n\n    vcg::tri::MiQParametrizer<FieldTriMesh>::MIQParametrize(tri_mesh,MiqP);//,MaxFeature);\n    vcg::tri::Quadrangulator<FieldTriMesh,PMesh> Quadr;\n\n    std::cout<<\"Quadrangulating\"<<std::endl;\n    FieldTriMesh splitted_mesh;\n    vcg::tri::Append<FieldTriMesh,FieldTriMesh>::Mesh(splitted_mesh,tri_mesh);\n    std::vector< std::vector< short int> > AxisUV;\n\n    Quadr.Quadrangulate(splitted_mesh,quad_mesh,AxisUV,false);\n    quadrangulated=true;\n    quad_mesh.UpdateAttributes();\n    vcg::tri::Allocator<PMesh>::CompactEveryVector(quad_mesh);\n    std::cout<<\"Num Faces: \"<<quad_mesh.face.size()<<std::endl;\n    vcg::tri::io::ExporterOBJ<PMesh>::Save(quad_mesh,\"quadrangulated.obj\",vcg::tri::io::Mask::IOM_BITPOLYGONAL);\n}\n#endif\n\n\n\nvoid TW_CALL SaveData(void *)\n{\n    SaveAllData();\n}\n\nvoid TW_CALL AutoSetupField(void *)\n{\n    MeshFieldSmoother<FieldTriMesh>::AutoSetupParam(tri_mesh,FieldParam);\n}\n\nvoid TW_CALL ErodeDilateFeatureStep(void *)\n{\n    tri_mesh.ErodeDilate(feature_erode_dilate);\n    //MP.ErodeDilate(feature_erode_dilate);\n}\n\nvoid SetFieldBarSizePosition(QWidget *w)\n{\n    int params[2];\n    params[0] = QTDeviceWidth(w) / 3;\n    params[1] = QTDeviceHeight(w) / 1.8;\n    TwSetParam(barQuad, NULL, \"size\", TW_PARAM_INT32, 2, params);\n    params[0] = QTLogicalToDevice(w, 10);\n    params[1] = 30;//QTDeviceHeight(w) - params[1] - QTLogicalToDevice(w, 10);\n    TwSetParam(barQuad, NULL, \"position\", TW_PARAM_INT32, 2, params);\n}\n\nvoid InitFieldBar(QWidget *w)\n{\n    barQuad = TwNewBar(\"QuadWild\");\n\n    SetFieldBarSizePosition(w);\n\n\tTwAddVarRW(barQuad,\"sharp_feature_thr\",TW_TYPE_DOUBLE, &sharp_feature_thr,\" label='Sharp Degree'\");\n    TwAddVarRW(barQuad,\"LimitConcave\",TW_TYPE_DOUBLE, &tri_mesh.LimitConcave,\" label='Limit Concave'\");\n    //TwAddVarRW(barQuad,\"LimitConcave\",TW_TYPE_DOUBLE, &MP.LimitConcave,\" label='Limit Concave'\");\n\n    TwAddButton(barQuad,\"CleanMesh\",CleanMesh,0,\"label='CleanMesh'\");\n\n    TwAddButton(barQuad,\"SetSharp\",InitSharpFeatures,0,\"label='InitSharp'\");\n\n\tTwAddVarRW(barQuad,\"ErodeDilSteps\",TW_TYPE_INT32,&feature_erode_dilate,\"label='ErodeDilateSteps'\");\n\n    TwAddButton(barQuad,\"Erode Dilate\",ErodeDilateFeatureStep,0,\"label='ErodeDilateSharp'\");\n\n    TwAddButton(barQuad,\"AutoRemesh\",AutoRemesh,0,\"label='AutoRemesh'\");\n\n    TwAddButton(barQuad,\"Refine\",RefineIfNeeded,0,\"label='Refine if needed'\");\n\n    TwAddVarRW(barQuad,\"Alpha\",TW_TYPE_DOUBLE, &FieldParam.alpha_curv,\" label='Alpha Curvature'\");\n    TwAddVarRW(barQuad,\"HardCT\",TW_TYPE_DOUBLE, &FieldParam.curv_thr,\" label='Hard Curv Thr'\");\n    TwAddVarRW(barQuad,\"CurvRing\",TW_TYPE_INT32,&FieldParam.curvRing,\"label='Curvature Ring'\");\n\n    TwEnumVal smoothmodes[3] = {\n        {vcg::tri::SMMiq,\"MIQ\"},\n        {vcg::tri::SMNPoly,\"NPoly\"},\n        {vcg::tri::SMIterative,\"Ite\"}\n    };\n    TwType smoothMode = TwDefineEnum(\"SmoothMode\", smoothmodes, 3);\n    TwAddVarRW(barQuad, \"Smooth Mode\", smoothMode, &FieldParam.SmoothM,\" label='Smooth Mode' \");\n\n\n    TwAddButton(barQuad,\"AutoSetup\",AutoSetupField,0,\"label='Auto Setup Field'\");\n\n    TwAddButton(barQuad,\"ComputeField\",SmoothField,0,\"label='Compute Field'\");\n\n    TwAddButton(barQuad,\"BatchProcess\",BatchProcess,0,\"label='Batch Process'\");\n\n    TwAddButton(barQuad,\"SaveData\",SaveData,0,\"label='Save Data'\");\n\n#ifdef MIQ_QUADRANGULATE\n    TwAddSeparator(barQuad,\"\",\"\");\n    TwAddVarRW(barQuad,\"Gradient\",TW_TYPE_DOUBLE, &MiqP.gradient,\" label='Gradient'\");\n    TwAddVarRW(barQuad,\"Direct Round\",TW_TYPE_BOOLCPP, &MiqP.directRound,\" label='Direct Round'\");\n    TwAddVarRW(barQuad,\"Round Singularities\",TW_TYPE_BOOLCPP, &MiqP.round_singularities,\" label='Round Singularities'\");\n    TwAddVarRW(barQuad,\"IsotropyVsAlign\",TW_TYPE_DOUBLE, &MiqP.miqAnisotropy,\" label='Isotropy Vs Align'\");\n    TwAddVarRW(barQuad,\"Align Sharp\",TW_TYPE_BOOLCPP, & MiqP.crease_as_feature,\" label='Align Sharp'\");\n    TwAddButton(barQuad,\"Quadrangulate\",MiqQuadrangulate,0,\"label='Miq Quadrangulate'\");\n#endif\n\n}\n\n//void BatchProcess ()\n//{\n////    vcg::tri::Hole<FieldTriMesh>::EarCuttingFill<vcg::tri::TrivialEar<FieldTriMesh> >(tri_mesh,6);\n//    bool Oriented,Orientable;\n//    vcg::tri::Clean<FieldTriMesh>::OrientCoherentlyMesh(tri_mesh,Oriented,Orientable);\n//    if (!Orientable)\n//        std::cout<<\"WARNING MESH NON ORIENTABLE\"<<std::endl;\n\n////    size_t numDup=MeshPrepocess<FieldTriMesh>::NumDuplicatedV(tri_mesh);//tri_mesh.NumDuplicatedV();\n////    if (numDup>0)std::cout<<\"WARNING DUPLICATED VERTICES BEFORE AUTO REMESH!\"<<std::endl;\n\n//    if (do_remesh)\n//        DoAutoRemesh();\n\n//    vcg::tri::Clean<FieldTriMesh>::OrientCoherentlyMesh(tri_mesh,Oriented,Orientable);\n//    if (!Orientable)\n//        std::cout<<\"WARNING MESH NON ORIENTABLE\"<<std::endl;\n\n//    for (size_t i=0;i<tri_mesh.face.size();i++)\n//        tri_mesh.face[i].IndexOriginal=i;\n\n//    //tri_mesh.SolveGeometricIssues();\n//    MeshPrepocess<FieldTriMesh>::SolveGeometricIssues(tri_mesh);\n//    //MP.SolveGeometricIssues();\n\n\n//\tstd::string projM=pathM;\n//    size_t indexExt=projM.find_last_of(\".\");\n//    projM=projM.substr(0,indexExt);\n//    std::string meshName=projM+std::string(\"_remeshed.obj\");\n//    std::cout<<\"Saving remeshed Mesh TO:\"<<meshName.c_str()<<std::endl;\n//    tri_mesh.SaveTriMesh(meshName.c_str());\n\n//    vcg::tri::Allocator<FieldTriMesh>::CompactEveryVector(tri_mesh);\n\n//    if (!(has_features || has_features_fl))\n//    {\n//        InitSharp();\n//        tri_mesh.ErodeDilate(feature_erode_dilate);\n//        //MP.ErodeDilate(feature_erode_dilate);\n//    }\n\n//    //tri_mesh.RefineIfNeeded();\n//    MeshPrepocess<FieldTriMesh>::RefineIfNeeded(tri_mesh);\n//    //tri_mesh.SolveGeometricIssues();\n//    MeshPrepocess<FieldTriMesh>::SolveGeometricIssues(tri_mesh);\n//    //MP.RefineIfNeeded();\n//    //MP.SolveGeometricIssues();\n\n//    //FIELD SMOOTH\n//    bool UseNPoly=tri_mesh.SufficientFeatures(SharpFactor);\n//    ScalarType SharpL=tri_mesh.SharpLenght();\n//    std::cout<<\"Sharp Lenght 0: \"<<SharpL<<std::endl;\n//    if (UseNPoly)\n//    {\n//        std::cout<<\"Using NPoly\"<<std::endl;\n//        FieldParam.SmoothM=SMNPoly;\n//    }\n//    else\n//    {\n//        std::cout<<\"Using Comiso\"<<std::endl;\n//        FieldParam.SmoothM=SMMiq;\n//        FieldParam.alpha_curv=0.3;\n//    }\n\n//    std::string projM=pathM;\n//    size_t indexExt=projM.find_last_of(\".\");\n//    projM=projM.substr(0,indexExt);\n//    std::string meshName=projM+std::string(\"_rem.obj\");\n//    std::string sharpName=projM+std::string(\"_rem.sharp\");\n//    std::cout<<\"Saving Mesh TO:\"<<meshName.c_str()<<std::endl;\n//    std::cout<<\"Saving Sharp TO:\"<<sharpName.c_str()<<std::endl;\n\n//    std::cout << \"[fieldComputation] Smooth Field Computation...\" << std::endl;\n//    //tri_mesh.SplitFolds();\n//    MeshPrepocess<FieldTriMesh>::SplitFolds(tri_mesh);\n\n//    SharpL=tri_mesh.SharpLenght();\n//    //SharpL=MP.SharpLenght();\n//    std::cout<<\"Sharp Lenght 0.0: \"<<SharpL<<std::endl;\n//    //tri_mesh.RemoveFolds();\n//    MeshPrepocess<FieldTriMesh>::RemoveFolds(tri_mesh);\n\n//    SharpL=tri_mesh.SharpLenght();\n//    //SharpL=MP.SharpLenght();\n//    std::cout<<\"Sharp Lenght 0.1: \"<<SharpL<<std::endl;\n//    //tri_mesh.SolveGeometricIssues();\n//    MeshPrepocess<FieldTriMesh>::SolveGeometricIssues(tri_mesh);\n//    //MP.SolveGeometricIssues();\n\n//    SharpL=tri_mesh.SharpLenght();\n//    //SharpL=MP.SharpLenght();\n//    std::cout<<\"Sharp Lenght 0.2: \"<<SharpL<<std::endl;\n//    //tri_mesh.RemoveSmallComponents();\n//    MeshPrepocess<FieldTriMesh>::RemoveSmallComponents(tri_mesh);\n//    //MP.RemoveSmallComponents();\n//    SharpL=tri_mesh.SharpLenght();\n//    //SharpL=MP.SharpLenght();\n//    std::cout<<\"Sharp Lenght 0.3: \"<<SharpL<<std::endl;\n\n//    SharpL=tri_mesh.SharpLenght();\n//    //SharpL=MP.SharpLenght();\n//    std::cout<<\"Sharp Lenght 1: \"<<SharpL<<std::endl;\n//    //tri_mesh.SmoothField(FieldParam);\n//    MeshFieldSmoother<FieldTriMesh>::SmoothField(tri_mesh,FieldParam);\n\n//    SharpL=tri_mesh.SharpLenght();\n//    //SharpL=MP.SharpLenght();\n//    std::cout<<\"Sharp Lenght 2: \"<<SharpL<<std::endl;\n\n//    std::string fieldName=projM+std::string(\"_rem.rosy\");\n//    std::cout<<\"Saving Field TO:\"<<fieldName.c_str()<<std::endl;\n\n//    tri_mesh.SaveTriMesh(meshName.c_str());\n//    tri_mesh.SaveSharpFeatures(sharpName.c_str());\n//    //MP.SaveSharpFeatures(sharpName.c_str());\n//    tri_mesh.SaveField(fieldName.c_str());\n\n//    std::string orFaceName=projM+std::string(\"_rem_origf.txt\");\n//    std::cout<<\"Saving Field TO:\"<<orFaceName.c_str()<<std::endl;\n//    tri_mesh.SaveOrigFace(orFaceName.c_str());\n//    drawfield=true;\n////    //SAVE\n//    SaveAllData();\n//}\n\n\n\n\nGLWidget::GLWidget(QWidget *parent)\n    : QGLWidget(QGLFormat(QGL::SampleBuffers), parent)\n{\n    hasToPick=false;\n    bool AllQuad=false;\n    bool Loaded=tri_mesh.LoadTriMesh(pathM,AllQuad);\n    FieldParam.alpha_curv=alpha;\n    FieldParam.curv_thr=0.8;\n\n    if (!Loaded)\n    {\n        std::cout<<\"Error Loading Mesh\"<<std::endl;\n        exit(0);\n    }\n    if (AllQuad)\n    {\n        drawfield=true;\n    }\n    std::cout<<\"Loaded \"<<tri_mesh.face.size()<<\" faces \"<<std::endl;\n    std::cout<<\"Loaded \"<<tri_mesh.vert.size()<<\" vertices \"<<std::endl;\n\n    glWrap.m=&tri_mesh;\n\n    tri_mesh.UpdateDataStructures();\n\n    tri_mesh.LimitConcave=0;\n    //MP.LimitConcave=0;\n    if (has_features)\n    {\n        std::cout<<\"*** Loading SHARP FEATURES ***\"<<std::endl;\n        bool HasRead=tri_mesh.LoadSharpFeatures(pathS);\n        //bool HasRead=MP.LoadSharpFeatures(pathS);\n        assert(HasRead);\n    }\n\n    if (has_features_fl)\n    {\n        std::cout<<\"*** Loading SHARP FEATURES FL***\"<<std::endl;\n        bool HasRead=tri_mesh.LoadSharpFeaturesFL(pathS);\n        //bool HasRead=MP.LoadSharpFeaturesFL(pathS);\n        assert(HasRead);\n    }\n\n//    if ((do_batch)&&(!has_features))\n//    {\n////        bool SufficientFeatures=mesh.SufficientFeatures(SharpFactor);\n////        if (SufficientFeatures)\n\n//        DoBatchProcess();\n//        SaveAllData();\n//        exit(0);\n//    }\n//    if ((do_batch)&&(has_features))\n//    {\n//        //tri_mesh.PrintSharpInfo();\n//        DoBatchProcess();\n//        SaveAllData();\n//        exit(0);\n//    }\n    if (do_batch)\n    {\n\n        DoBatchProcess();\n        SaveAllData();\n        exit(0);\n    }\n\n    //remeshed_mesh.UpdateDataStructures();\n    //Gr.Set(tri_mesh.face.begin(),tri_mesh.face.end());\n}\n\n\n\nvoid GLWidget::initializeGL ()\n{\n    //initialize Glew\n    glewInit();\n    //CaptInt.GLInit( GLWidget::width(),GLWidget::height());\n    glClearColor(0, 0, 0, 0);\n    glEnable(GL_LIGHTING);\n    glEnable(GL_LIGHT0);\n    glEnable(GL_NORMALIZE);\n    glEnable(GL_COLOR_MATERIAL);\n    glEnable(GL_CULL_FACE);\n    glEnable(GL_DEPTH_TEST);\n}\n\n\nvoid GLWidget::resizeGL (int w, int h)\n{\n    glViewport (0, 0, (GLsizei) w, (GLsizei) h);\n    TwWindowSize(w, h);\n    InitFieldBar(this);\n    initializeGL();\n}\n\nvoid GLWidget::paintGL ()\n{\n\n    //    if (RType!=OldRType)\n    //    {\n    //        PatchDeco.ColorPatches(RType);\n    //        OldRType=RType;\n    //    }\n\n    glClearColor(255,255,255,255);\n    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n    glMatrixMode(GL_PROJECTION);\n    glLoadIdentity();\n    gluPerspective(40, GLWidget::width()/(float)GLWidget::height(), 0.1, 100);\n    glMatrixMode(GL_MODELVIEW);\n    glLoadIdentity();\n    gluLookAt(0,0,3.5f,   0,0,0,   0,1,0);\n    track.center=vcg::Point3f(0, 0, 0);\n    track.radius= 1;\n    track.GetView();\n\n    glPushMatrix();\n    track.Apply();\n    glPushMatrix();\n\n    glDisable(GL_CULL_FACE);\n    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\n    glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);\n\n    if(tri_mesh.vert.size()>0)\n    {\n        vcg::glScale(2.0f/tri_mesh.bbox.Diag());\n        glTranslate(-tri_mesh.bbox.Center());\n        //tri_mesh.GLDrawSharpEdges();\n        GLDrawSharpEdges(tri_mesh);\n        //MP.GLDrawSharpEdges();\n        glWrap.Draw(vcg::GLW::DMFlatWire,vcg::GLW::CMPerFace,vcg::GLW::TMNone);\n        //glWrap.Draw(vcg::GLW::DMSmooth,vcg::GLW::CMNone,vcg::GLW::TMNone);\n    }\n\n#ifdef MIQ_QUADRANGULATE\n    if (quadrangulated)\n    {\n        quad_mesh.GLDraw();\n    }\n#endif\n\n    if (drawfield)\n    {\n        vcg::GLField<FieldTriMesh>::GLDrawFaceField(tri_mesh,false,false,0.007);\n        vcg::GLField<FieldTriMesh>::GLDrawSingularity(tri_mesh);\n    }\n\n//    if(hasToPick)\n//    {\n//        hasToPick=false;\n//        typename FieldTriMesh::CoordType pp;\n//        if(vcg::Pick<typename FieldTriMesh::CoordType>(xMouse,yMouse,pp))\n//        {\n//            typename FieldTriMesh::CoordType closPt,bary;\n//            typename FieldTriMesh::ScalarType minD;\n//            typename FieldTriMesh::FaceType *f=vcg::tri::GetClosestFaceBase(tri_mesh,Gr,pp,tri_mesh.bbox.Diag(),minD,closPt);\n//            vcg::InterpolationParameters(*f,closPt,bary);\n//            size_t EdgeI=1;\n//            if ((bary.Y()<bary.X())&&(bary.Y()<bary.Z()))EdgeI=2;\n//            if ((bary.Z()<bary.X())&&(bary.Z()<bary.Y()))EdgeI=0;\n\n////            FieldTriMesh::FaceType *fOpp=f->FFp(EdgeI);\n////            int eOpp=f->FFi(EdgeI);\n\n//            if (f->IsFaceEdgeS(EdgeI))\n//            {\n//                tri_mesh.ClearSharp((*f),EdgeI);\n//                //MP.ClearSharp((*f),EdgeI);\n////                {\n////                f->ClearFaceEdgeS(EdgeI);\n////                if (fOpp!=f)\n////                    fOpp->ClearFaceEdgeS(eOpp);\n//            }else\n//            {\n\n//                tri_mesh.SetSharp((*f),EdgeI);\n//                //MP.SetSharp((*f),EdgeI);\n////                f->SetFaceEdgeS(EdgeI);\n////                if (fOpp!=f)\n////                    fOpp->SetFaceEdgeS(eOpp);\n//            }\n//        }\n//    }\n\n    glPopMatrix();\n    glPopMatrix();\n\n\n    TwDraw();\n\n}\n\nvoid GLWidget::keyReleaseEvent (QKeyEvent * e)\n{\n    e->ignore ();\n    if (e->key () == Qt::Key_Control)  track.ButtonUp (QT2VCG (Qt::NoButton, Qt::ControlModifier));\n    if (e->key () == Qt::Key_Shift)  track.ButtonUp (QT2VCG (Qt::NoButton, Qt::ShiftModifier));\n    if (e->key () == Qt::Key_Alt) track.ButtonUp (QT2VCG (Qt::NoButton, Qt::AltModifier));\n    updateGL ();\n}\n\n\nvoid GLWidget::keyPressEvent (QKeyEvent * e)\n{\n    e->ignore ();\n    if (e->key () == Qt::Key_Control) track.ButtonDown (QT2VCG (Qt::NoButton, Qt::ControlModifier));\n    if (e->key () == Qt::Key_Shift)  track.ButtonDown (QT2VCG (Qt::NoButton, Qt::ShiftModifier));\n    if (e->key () == Qt::Key_Alt)  track.ButtonDown (QT2VCG (Qt::NoButton, Qt::AltModifier));\n\n    TwKeyPressQt(e);\n    updateGL ();\n}\n\nvoid GLWidget::mousePressEvent (QMouseEvent * e)\n{\n    if(!TwMousePressQt(this,e))\n    {\n        e->accept ();\n        setFocus ();\n        track.MouseDown(QT2VCG_X(this, e), QT2VCG_Y(this, e), QT2VCG (e->button (), e->modifiers ()));\n    }\n    updateGL ();\n}\n\nvoid GLWidget::mouseMoveEvent (QMouseEvent * e)\n{\n    if (e->buttons ()) {\n        track.MouseMove(QT2VCG_X(this, e), QT2VCG_Y(this, e));\n        updateGL ();\n    }\n    TwMouseMotion(QTLogicalToDevice(this, e->x()), QTLogicalToDevice(this, e->y()));\n}\n\nvoid GLWidget::mouseDoubleClickEvent (QMouseEvent * e)\n{\n    if (e->buttons ())\n    {\n        xMouse=QT2VCG_X(this, e);\n        yMouse=QT2VCG_Y(this, e);\n        //pointToPick=Point2i(e->x(),height()-e->y());\n        //pointToPick=Point2i(xMouse,yMouse);\n        hasToPick=true;\n        updateGL ();\n    }\n    updateGL();\n}\n\nvoid GLWidget::mouseReleaseEvent (QMouseEvent * e)\n{\n    track.MouseUp(QT2VCG_X(this, e), QT2VCG_Y(this, e), QT2VCG(e->button (), e->modifiers ()));\n    TwMouseReleaseQt(this,e);\n    updateGL ();\n}\n\nvoid GLWidget::wheelEvent (QWheelEvent * e)\n{\n    const int WHEEL_STEP = 120;\n    track.MouseWheel (e->delta () / float (WHEEL_STEP), QTWheel2VCG (e->modifiers ()));\n    updateGL ();\n}\n"
  },
  {
    "path": "components/field_computation/glwidget.h",
    "content": "/***************************************************************************/\n/* Copyright(C) 2021\n\n\nThe authors of\n\nReliable Feature-Line Driven Quad-Remeshing\nSiggraph 2021\n\n\n All rights reserved.\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <https://www.gnu.org/licenses/>.\n****************************************************************************/\n\n#ifndef GLWIDGET_H\n#define GLWIDGET_H\n\n\n#include <QGLWidget>\n#include <wrap/gui/trackball.h>\n#include <AntTweakBar.h>\n#include <QDir>\n\nclass GLWidget : public QGLWidget\n{\n    Q_OBJECT\n\npublic:\n    bool hasToPick;\n\n    GLWidget(QWidget *parent = 0);\n\n    ~GLWidget(){};\n\n\n    QSize sizeHint() const {\n      return QSize(1400, 1200);\n  };\n\nprotected:\n    //void DrawPolyMesh();\n\n    void initializeGL();\n    void paintGL();\n    void resizeGL(int width, int height);\n    void mousePressEvent(QMouseEvent *event);\n    void mouseReleaseEvent(QMouseEvent *event);\n    void mouseMoveEvent(QMouseEvent *event);\n    void mouseDoubleClickEvent ( QMouseEvent * event );\n    void keyPressEvent(QKeyEvent *event);\n    void keyReleaseEvent(QKeyEvent *event);\n    void wheelEvent(QWheelEvent *event);\n\n};\n\n#endif\n"
  },
  {
    "path": "components/field_computation/main.cpp",
    "content": "/***************************************************************************/\n/* Copyright(C) 2021\n\n\nThe authors of\n\nReliable Feature-Line Driven Quad-Remeshing\nSiggraph 2021\n\n\n All rights reserved.\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <https://www.gnu.org/licenses/>.\n****************************************************************************/\n\n#include <QApplication>\n#include <QDesktopWidget>\n#include <GL/glew.h>\n#include \"glwidget.h\"\n#include <wrap/qt/anttweakbarMapper.h>\n#include <QWindow>\n#include <QDir>\n#include <QFile>\n#include <QFileInfo>\n#include <QTextStream>\n//#include <triangle_mesh_type.h>\n//#include <wrap/io_trimesh/import_field.h>\n//#include <wrap/io_trimesh/import.h>\n\n#include<vcg/complex/algorithms/hole.h>\n#include <cstdio>\n#include <clocale>\n//#include <locale>\n\n\nextern bool do_batch;\nextern bool has_features;\nextern bool has_features_fl;\nextern std::string pathM,pathS;\n\nextern bool do_remesh;\nextern int remesher_iterations;\nextern double remesher_aspect_ratio;\nextern double alpha;\nextern int remesher_termination_delta;\n\nextern double sharp_feature_thr;\nextern int feature_erode_dilate;\n\nvoid correctOrAbort(const bool ok, const std::string & line, const int linenumber)\n{\n    if(!ok)\n    {\n        std::cerr << \"[fieldComputation] Malformerd config file |-> \" << line << \" (\" << linenumber << \")\" << std::endl;\n        std::cerr << \"[fieldComputation] ...aborting...\" << std::endl;\n        abort();\n    }\n}\n\n//bool loadConfigFile(const std::string & filename)\n//{\n//\tQFile configFile(filename.c_str());\n\n//\tif (!configFile.open(QIODevice::ReadOnly))\n//\t{\n//\t\t//handleme\n//\t}\n\n//\tQTextStream configStream(&configFile);\n\n//\tint i = 0;\n//    QString line;\n\n//    while (configStream.readLineInto(&line))//(configStream.readLineInto(&line))\n//\t{\n//\t\tQStringList keyValuePair = line.split(' ');\n\n//\t\tif (keyValuePair.size() != 2)\n//\t\t{\n//            correctOrAbort(false, line.toStdString(), i);\n//\t\t}\n\n//\t\tbool ok = false;\n//\t\tif (keyValuePair[0] == \"remesh_iterations\")\n//\t\t{\n//\t\t\tremesher_iterations = keyValuePair[1].toInt(&ok);\n//            correctOrAbort(ok, line.toStdString(), i);\n//\t\t\tcontinue;\n//\t\t}\n//\t\tif (keyValuePair[0] == \"remesh_target_aspect_ratio\")\n//\t\t{\n//\t\t\tremesher_aspect_ratio = keyValuePair[1].toDouble(&ok);\n//            correctOrAbort(ok, line.toStdString(), i);\n//\t\t\tcontinue;\n//\t\t}\n//\t\tif (keyValuePair[0] == \"remesh_termination_delta\")\n//\t\t{\n//\t\t\tremesher_termination_delta = keyValuePair[1].toInt(&ok);\n//            correctOrAbort(ok, line.toStdString(), i);\n//\t\t\tcontinue;\n//\t\t}\n//\t\tif (keyValuePair[0] == \"sharp_feature_thr\")\n//\t\t{\n//\t\t\tsharp_feature_thr = keyValuePair[1].toDouble(&ok);\n//            correctOrAbort(ok, line.toStdString(), i);\n//\t\t\tcontinue;\n//\t\t}\n//\t\tif (keyValuePair[0] == \"sharp_feature_erode_dilate\")\n//\t\t{\n//\t\t\tfeature_erode_dilate = keyValuePair[1].toInt(&ok);\n//            correctOrAbort(ok, line.toStdString(), i);\n//\t\t\tcontinue;\n//\t\t}\n\n//\t\t++i;\n//\t}\n\n//\tstd::cout << \"[fieldComputation] Successful config import\" << std::endl;\n\n//}\n\nbool loadConfigFile(const std::string & filename)\n{\n\n    FILE *f=fopen(filename.c_str(),\"rt\");\n\n    if (f==NULL)return false;\n\n    std::cout<<\"READ CONFIG FILE\"<<std::endl;\n\n    int IntVar;\n    fscanf(f,\"do_remesh %d\\n\",&IntVar);\n    if (IntVar==0)\n        do_remesh=false;\n    std::cout<<\"do_remesh \"<<do_remesh<<std::endl;\n\n    fscanf(f,\"remesh_iterations %d\\n\",&remesher_iterations);\n    std::cout<<\"remesh_iterations \"<<remesher_iterations<<std::endl;\n\n    float remesher_aspect_ratiof;\n    fscanf(f,\"remesh_target_aspect_ratio %f\\n\",&remesher_aspect_ratiof);\n    remesher_aspect_ratio=remesher_aspect_ratiof;\n    std::cout<<\"remesher_aspect_ratio \"<<remesher_aspect_ratio<<std::endl;\n\n    fscanf(f,\"remesh_termination_delta %d\\n\",&remesher_termination_delta);\n    std::cout<<\"remesh_termination_delta \"<<remesher_termination_delta<<std::endl;\n\n    float sharp_feature_thrf;\n    fscanf(f,\"sharp_feature_thr %f\\n\",&sharp_feature_thrf);\n    sharp_feature_thr=sharp_feature_thrf;\n    std::cout<<\"sharp_feature_thr \"<<sharp_feature_thr<<std::endl;\n\n    fscanf(f,\"sharp_feature_erode_dilate %d\\n\",&feature_erode_dilate);\n    std::cout<<\"sharp_feature_erode_dilate \"<<feature_erode_dilate<<std::endl;\n\n    float alphaf;\n    fscanf(f,\"alpha %f\\n\",&alphaf);\n    alpha=(double)alphaf;\n    std::cout<<\"alpha \"<<alpha<<std::endl;\n\n    fclose(f);\n\n    std::cout << \"[fieldComputation] Successful config import\" << std::endl;\n\n    return true;\n\n}\n\nint main(int argc, char *argv[])\n{\n    QApplication app(argc, argv);\n\n    //Use \".\" as decimal separator\n    std::setlocale(LC_NUMERIC, \"en_US.UTF-8\");\n\n    QWindow dummy;\n    QString def_string = QString(\"GLOBAL fontscaling=%1\").arg((int)dummy.devicePixelRatio());\n    TwDefine(def_string.toStdString().c_str());\n    printf(\"%s\\n\",qPrintable(def_string));\n    fflush(stdout);\n\n    // Set functions to handle string copy\n    TwCopyCDStringToClientFunc(CopyCDStringToClient);\n    TwCopyStdStringToClientFunc(CopyStdStringToClient);\n\n    if( !TwInit(TW_OPENGL, NULL) )\n    {\n        fprintf(stderr, \"AntTweakBar initialization failed: %s\\n\", TwGetLastError());\n        return 1;\n    }\n\n    //load default config\n\n    loadConfigFile(\"basic_setup.txt\");\n    assert(argc>1);\n    pathM=std::string(argv[1]);\n    for (size_t i=2;i<argc;i++)\n    {\n        if(std::string(argv[i])==std::string(\"batch\"))\n        {\n            do_batch=true;\n            continue;\n        }\n\n        std::string pathTest=std::string(argv[i]);\n        int position=pathTest.find(\".sharp\");\n        if (position!=-1)\n        {\n            pathS=pathTest;\n            has_features=true;\n            continue;\n        }\n        position=pathTest.find(\".fl\");\n        if (position!=-1)\n        {\n            pathS=pathTest;\n            has_features_fl=true;\n            continue;\n        }\n        position=pathTest.find(\".txt\");\n        if (position!=-1)\n        {\n           loadConfigFile(pathTest.c_str());\n           continue;\n        }\n    }\n    //    loadConfigFile(\"basic_setup.txt\");\n\n    //    std::cout << pathM << std::endl;\n\n    //    if ((argc>2)&&(std::string(argv[2])==std::string(\"batch\")))\n    //        do_batch=true;\n    //    else\n    //    {\n    //        if (argc>2)\n    //        {\n    //            std::string pathTest=std::string(argv[2]);\n    //            int position=pathTest.find(\".sharp\");\n\n    //            if (position!=-1)\n    //            {\n    //                pathS=pathTest;\n    //                has_features=true;\n    //            }\n    //            position=pathTest.find(\".fl\");\n    //            if (position!=-1)\n    //            {\n    //                pathS=pathTest;\n    //                has_features_fl=true;\n    //            }\n    //        }\n    //    }\n\n    //    if ((has_features || has_features_fl)&&(argc>3))\n    //    {\n    //        if (std::string(argv[3])==std::string(\"batch\"))\n    //            do_batch=true;\n    //    }\n    GLWidget window;\n\n    window.show();\n    return app.exec();\n}\n"
  },
  {
    "path": "components/field_computation/mesh_field_smoother.h",
    "content": "/***************************************************************************/\n/* Copyright(C) 2021\n\n\nThe authors of\n\nReliable Feature-Line Driven Quad-Remeshing\nSiggraph 2021\n\n\n All rights reserved.\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <https://www.gnu.org/licenses/>.\n****************************************************************************/\n\n#ifndef MESH_FIELD_SMOOTHER\n#define MESH_FIELD_SMOOTHER\n\n#include <wrap/io_trimesh/export_field.h>\n#include <wrap/io_trimesh/import.h>\n#include <fields/field_smoother.h>\n\ntemplate <class MeshType>\nclass MeshFieldSmoother\n{\n\n    typedef typename MeshType::ScalarType ScalarType;\n    typedef typename MeshType::CoordType  CoordType;\n    typedef typename MeshType::VertexType    VertexType;\n    typedef typename MeshType::VertexPointer VertexPointer;\n    typedef typename MeshType::FaceType    FaceType;\n    typedef typename MeshType::FacePointer FacePointer;\n\n    typedef vcg::tri::FieldSmoother<MeshType> FieldSmootherType;\n    typedef typename FieldSmootherType::SmoothParam SmoothParam;\n\n   public:\n\n    static void AutoSetupParam(MeshType &mesh,typename vcg::tri::FieldSmoother<MeshType>::SmoothParam &FParam,ScalarType SharpFactor=6)\n    {\n        FParam.align_borders=true;\n        FParam.sharp_thr=0;\n\n        bool SufficientFeatures=mesh.SufficientFeatures(SharpFactor);\n\n        if (SufficientFeatures)\n        {\n            std::cout<<\"Using NPoly\"<<std::endl;\n            FParam.SmoothM=vcg::tri::SMNPoly;\n            FParam.curv_thr=0;\n            FParam.alpha_curv=0;\n        }\n        else\n        {\n#ifndef COMISO_FIELD\n            std::cout<<\"Using NPoly\"<<std::endl;\n            FParam.SmoothM=vcg::tri::SMNPoly;\n            FParam.curv_thr=0.8;\n            FParam.alpha_curv=0;\n#else\n            std::cout<<\"Using Comiso\"<<std::endl;\n            FParam.SmoothM=vcg::tri::SMMiq;\n            if (FParam.alpha_curv==0)\n                FParam.alpha_curv=0.3;\n            FParam.curv_thr=0;\n#endif\n        }\n    }\n\n    static void SmoothField(MeshType &mesh,SmoothParam FieldParam)\n    {\n        //CHANGE BUT NOT REALLY NEEDED\n        //InitFeatureCoordsTable();\n\n        FieldParam.sharp_thr=0.0;\n        //FieldParam.curv_thr=0.0;\n        FieldParam.AddConstr.clear();\n        for (size_t i=0;i<mesh.face.size();i++)\n        {\n            for (size_t j=0;j<3;j++)\n            {\n                if (!mesh.face[i].IsFaceEdgeS(j))continue;\n                size_t IndexV0=vcg::tri::Index(mesh,mesh.face[i].V0(j));\n                size_t IndexV1=vcg::tri::Index(mesh,mesh.face[i].V1(j));\n                //only on one side\n                if (IndexV0>IndexV1)continue;\n                CoordType P0=mesh.face[i].V0(j)->P();\n                CoordType P1=mesh.face[i].V1(j)->P();\n                CoordType Dir=P1-P0;\n                Dir.Normalize();\n                FieldParam.AddConstr.push_back(std::pair<int,CoordType>(i,Dir));\n\n                typename MeshType::FaceType *FOpp=mesh.face[i].FFp(j);\n                if (FOpp==&mesh.face[i])continue;\n\n                int IndexF=vcg::tri::Index(mesh,*FOpp);\n                FieldParam.AddConstr.push_back(std::pair<int,CoordType>(IndexF,Dir));\n            }\n        }\n//        //if there is no alpha curvature and no constraint then set curv_thr\n//        if ((FieldParam.alpha_curv==0)&&(FieldParam.AddConstr.size()==0))\n//        {\n//            FieldParam.curv_thr=0.1;\n            FieldParam.align_borders=true;\n//        }\n#ifndef COMISO_FIELD\n         FieldParam.SmoothM=vcg::tri::SMNPoly;\n#endif\n//        std::cout<<\"..Alpha..\"<<FieldParam.alpha_curv<<std::endl;\n//        std::cout<<\"..Smoothing..\"<<std::endl;\n\n//        vcg::tri::io::ExporterPLY<MeshType>::Save(mesh,\"test.ply\");\n//        vcg::tri::io::ImporterPLY<MeshType>::Open(mesh,\"test.ply\");\n//        mesh.UpdateDataStructures();\n\n        FieldSmootherType::SmoothDirections(mesh,FieldParam);\n\n\n        std::cout<<\"..Global Orientation..\"<<std::endl;\n        vcg::tri::CrossField<MeshType>::OrientDirectionFaceCoherently(mesh);\n        std::cout<<\"..Update Singularities..\"<<std::endl;\n        vcg::tri::CrossField<MeshType>::UpdateSingularByCross(mesh);\n        std::cout<<\"..Update Features..\"<<std::endl;\n\n\n        //CHANGE BUT NOT REALLY NEEDED\n        mesh.UpdateDataStructures();\n        mesh.SetFeatureFromTable();\n    }\n\n\n    static bool SaveField(MeshType &mesh,const std::string &filename)\n    {\n        if(filename.empty()) return false;\n        vcg::tri::io::ExporterFIELD<MeshType>::Save4ROSY(mesh,filename.c_str());\n        return true;\n    }\n\n};\n\n\n#endif\n"
  },
  {
    "path": "components/field_computation/mesh_manager.h",
    "content": "/***************************************************************************/\n/* Copyright(C) 2021\n\n\nThe authors of\n\nReliable Feature-Line Driven Quad-Remeshing\nSiggraph 2021\n\n\n All rights reserved.\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <https://www.gnu.org/licenses/>.\n****************************************************************************/\n\n#ifndef MESH_MANAGER\n#define MESH_MANAGER\n\n//#define MINDOT -0.99\n\n#include <vcg/complex/complex.h>\n#include <vcg/complex/algorithms/update/topology.h>\n#include <vcg/complex/algorithms/update/bounding.h>\n#include <vcg/simplex/face/topology.h>\n#include <wrap/io_trimesh/import.h>\n#include <wrap/io_trimesh/export.h>\n//#include <wrap/gl/trimesh.h>\n#include \"AutoRemesher.h\"\n#include <wrap/io_trimesh/export_field.h>\n#include <iostream>\n#include <fstream>\n#include <vcg/complex/algorithms/attribute_seam.h>\n#include <vcg/complex/algorithms/crease_cut.h>\n#include \"mesh_field_smoother.h\"\n#include <vcg/complex/algorithms/polygonal_algorithms.h>\n\n#include \"fields/field_smoother.h\"\n\n// Basic subdivision class\ntemplate <class FaceType>\nstruct SplitLev : public   std::unary_function<vcg::face::Pos<FaceType> ,typename FaceType::CoordType >\n{\n    typedef typename FaceType::CoordType CoordType;\n    typedef typename FaceType::VertexType VertexType;\n    typedef typename FaceType::ScalarType ScalarType;\n\n    typedef std::pair<CoordType,CoordType> CoordPair;\n    std::map<CoordPair,CoordType> *SplitOps;\n\n    void operator()(VertexType &nv,vcg::face::Pos<FaceType>  ep)\n    {\n        VertexType* v0=ep.f->V0(ep.z);\n        VertexType* v1=ep.f->V1(ep.z);\n\n        assert(v0!=v1);\n\n        CoordType Pos0=v0->P();\n        CoordType Pos1=v1->P();\n\n        CoordPair CoordK(std::min(Pos0,Pos1),std::max(Pos0,Pos1));\n        assert(SplitOps->count(CoordK)>0);\n        nv.P()=(*SplitOps)[CoordK];\n    }\n\n    vcg::TexCoord2<ScalarType> WedgeInterp(vcg::TexCoord2<ScalarType> &t0,\n                                           vcg::TexCoord2<ScalarType> &t1)\n    {\n        return (vcg::TexCoord2<ScalarType>(0,0));\n    }\n\n    SplitLev(std::map<CoordPair,CoordType> *_SplitOps){SplitOps=_SplitOps;}\n};\n\ntemplate <class FaceType>\nclass EdgePred\n{\n    typedef typename FaceType::CoordType CoordType;\n    typedef typename FaceType::VertexType VertexType;\n    typedef std::pair<CoordType,CoordType> CoordPair;\n    std::map<CoordPair,CoordType> *SplitOps;\n\npublic:\n\n    bool operator()(vcg::face::Pos<FaceType> ep) const\n    {\n        VertexType* v0=ep.f->V0(ep.z);\n        VertexType* v1=ep.f->V1(ep.z);\n\n        assert(v0!=v1);\n\n        CoordType Pos0=v0->P();\n        CoordType Pos1=v1->P();\n\n        CoordPair CoordK(std::min(Pos0,Pos1),std::max(Pos0,Pos1));\n\n        return (SplitOps->count(CoordK)>0);\n    }\n\n    EdgePred(std::map<CoordPair,CoordType> *_SplitOps){SplitOps=_SplitOps;}\n};\n\n\ntemplate <class MeshType>\nclass MeshPrepocess\n{\n    typedef typename MeshType::ScalarType ScalarType;\n    typedef typename MeshType::CoordType  CoordType;\n\n    typedef typename MeshType::VertexType    VertexType;\n    typedef typename MeshType::VertexPointer VertexPointer;\n\n    typedef typename MeshType::FaceType    FaceType;\n    typedef typename MeshType::FacePointer FacePointer;\n\n    typedef std::pair<CoordType,CoordType> CoordPair;\n\n    static bool IsFold(const FaceType &f,\n                       const size_t &IndexE,\n                       ScalarType MinDot=-0.99)\n    {\n        if (vcg::face::IsBorder(f,IndexE))return false;\n        FaceType *fOpp=f.cFFp(IndexE);\n        //int IOpp=f.cFFi(IndexE);\n        CoordType N0=f.cN();\n        CoordType N1=fOpp->N();\n        N0.Normalize();\n        N1.Normalize();\n        if ((N0*N1)>MinDot)return false;\n        return true;\n    }\n\n    typedef SplitLev<FaceType> SplitLevType;\n    typedef EdgePred<FaceType> EdgePredType;\n\n    static bool SplitFolds(MeshType &mesh,\n                           ScalarType MinDot=-0.99,\n                           bool debugmsg=false)\n    {\n        mesh.InitFeatureCoordsTable();\n\n        //then save the edges to be splitted\n        std::map<CoordPair,CoordType> ToBeSplitted;\n        for (size_t i=0;i<mesh.face.size();i++)\n        {\n            //find the number of edges\n            for (size_t j=0;j<3;j++)\n            {\n                if (!IsFold(mesh.face[i],j,MinDot))continue;\n                int VIndex0=vcg::tri::Index(mesh,mesh.face[i].V0(j));\n                int VIndex1=vcg::tri::Index(mesh,mesh.face[i].V1(j));\n                CoordType P0=mesh.vert[VIndex0].P();\n                CoordType P1=mesh.vert[VIndex1].P();\n                std::pair<CoordType,CoordType> Key(std::min(P0,P1),std::max(P0,P1));\n                ToBeSplitted[Key]=(P0+P1)/2;\n            }\n        }\n        if (debugmsg)\n            std::cout<<\"Performing \"<<ToBeSplitted.size()<< \" fold split ops\"<<std::endl;\n\n        SplitLev<FaceType> splMd(&ToBeSplitted);\n        EdgePred<FaceType> eP(&ToBeSplitted);\n\n        //do the final split\n\n        size_t NumV0=mesh.vert.size();\n        bool done=vcg::tri::RefineE<MeshType,SplitLevType,EdgePredType>(mesh,splMd,eP);\n        size_t NumV1=mesh.vert.size();\n\n        if (debugmsg)\n            std::cout<<\"Added \"<<NumV1-NumV0<<\" vertices\"<<std::endl;\n\n\n        mesh.UpdateDataStructures();\n        mesh.SetFeatureFromTable();\n        return done;\n    }\n\n\n\n\n    static void Perturb(VertexType &v,ScalarType Magnitudo)\n    {\n        ScalarType eps=std::numeric_limits<ScalarType>::epsilon()*Magnitudo;\n        //take a random direction\n        size_t granularity=10000;\n        int IntX=(rand()%granularity)-granularity/2;\n        int IntY=(rand()%granularity)-granularity/2;\n        int IntZ=(rand()%granularity)-granularity/2;\n        CoordType Dir=CoordType(IntX,IntY,IntZ);\n        Dir.Normalize();\n        Dir*=eps;\n        //std::cout<<Dir.X()<<\";\"<<Dir.Y()<<\";\"<<Dir.Z()<<std::endl;\n        v.P()+=Dir;\n    }\n\n    static size_t NumDuplicatedV(MeshType &mesh)\n    {\n        std::set<CoordType> Pos;\n        vcg::tri::UpdateSelection<MeshType>::VertexClear(mesh);\n        size_t numDupl=0;\n        for (size_t i=0;i<mesh.vert.size();i++)\n        {\n            if (Pos.count(mesh.vert[i].P())>0)\n            {\n                mesh.vert[i].SetS();\n                numDupl++;\n            }\n            Pos.insert(mesh.vert[i].P());\n        }\n        return numDupl;\n    }\n\n    static bool RepositionDuplicatedV(MeshType &mesh)\n    {\n        size_t NumD=NumDuplicatedV(mesh);\n        if (NumD==0)return false;\n        //int dilate_step=0;\n        ScalarType Magnitudo=2;\n        do\n        {\n            std::cout<<\"Repositioning \"<<NumD<<\" duplicated vertices\"<<std::endl;\n\n            for (size_t i=0;i<mesh.vert.size();i++)\n                if (mesh.vert[i].IsS())Perturb(mesh.vert[i],Magnitudo);\n\n            Magnitudo*=2;\n\n            NumD=NumDuplicatedV(mesh);\n        }\n        while(NumD>0);\n        vcg::tri::UpdateBounding<MeshType>::Box(mesh);\n        vcg::tri::UpdateNormal<MeshType>::PerVertexNormalizedPerFace(mesh);\n        vcg::tri::UpdateNormal<MeshType>::PerFaceNormalized(mesh);\n        return true;\n    }\n\n    static bool RemoveZeroAreaF(MeshType &mesh,bool debugmsg=false)\n    {\n        //        int nonManifV=0;\n        //        int degF=0;\n        int zeroAFace=0;\n        bool modified=false;\n        ScalarType Magnitudo=2;\n        do{\n            modified=false;\n            for (size_t i=0;i<mesh.face.size();i++)\n            {\n                if (vcg::DoubleArea(mesh.face[i])>0)continue;\n                Perturb(*mesh.face[i].V(0),Magnitudo);\n                Perturb(*mesh.face[i].V(1),Magnitudo);\n                Perturb(*mesh.face[i].V(2),Magnitudo);\n                modified=true;\n                zeroAFace++;\n            }\n            Magnitudo*=2;\n        }while (modified);\n        vcg::tri::Allocator<MeshType>::CompactEveryVector(mesh);\n\n        if (debugmsg)\n            std::cout<<\"Adjusted \"<<zeroAFace<<\" zero area faces\"<<std::endl;\n        //        std::cout<<\"Removed \"<<degF<<\" degenerate faces\"<<std::endl;\n        //        std::cout<<\"Removed \"<<zeroAFace<<\" nonManifV \"<<std::endl;\n        mesh.UpdateDataStructures();\n        return modified;\n    }\n\n    static bool RemoveSmallComponents(MeshType &mesh,size_t min_size=10)\n    {\n        std::vector< std::pair<int, typename MeshType::FacePointer> > CCV;\n        vcg::tri::Clean<MeshType>::ConnectedComponents(mesh, CCV);\n        vcg::tri::ConnectedComponentIterator<MeshType> ci;\n        //vcg::tri::UpdateFlags<MeshType>::FaceClearS(*this);\n        bool has_removed=false;\n        for(unsigned int i=0;i<CCV.size();++i)\n        {\n            if (CCV[i].first>min_size)continue;\n            has_removed=true;\n            //std::vector<typename MeshType::FacePointer> FPV;\n            for(ci.start(mesh,CCV[i].second);!ci.completed();++ci)\n                vcg::tri::Allocator<MeshType>::DeleteFace(mesh,(*(*ci)));\n        }\n        if (has_removed)\n        {\n            vcg::tri::Clean<MeshType>::RemoveUnreferencedVertex(mesh);\n            vcg::tri::Allocator<MeshType>::CompactEveryVector(mesh);\n            mesh.UpdateDataStructures();\n        }\n        return has_removed;\n    }\n\n    static bool SolvePrecisionIssues(MeshType &mesh)\n    {\n        srand(0);\n        bool HasRepositioned=false;\n        bool HasSolvedZeroF=false;\n        bool HasModified=false;\n        do{\n            HasRepositioned=RepositionDuplicatedV(mesh);\n            HasSolvedZeroF=RemoveZeroAreaF(mesh);\n            HasModified|=HasRepositioned;\n            HasModified|=HasSolvedZeroF;\n        }while (HasRepositioned || HasSolvedZeroF);\n        return HasModified;\n    }\n\n\n    //refine the faces with 3 edge selected for field constraints\n    static bool RefineInternalFacesStepFromEdgeSel(MeshType &mesh)\n    {\n        mesh.InitFeatureCoordsTable();\n        std::vector<int> to_refine_face;\n        for (size_t i=0;i<mesh.face.size();i++)\n        {\n            //find the number of edges\n            int Num=0;\n            for (size_t j=0;j<3;j++)\n            {\n                if (!mesh.face[i].IsFaceEdgeS(j))continue;\n                Num++;\n            }\n            if (Num==3)\n                to_refine_face.push_back(i);\n        }\n        if (to_refine_face.size()==0)return false;\n\n        std::cout<<\"Performing \"<<to_refine_face.size()<< \" face refinement ops\"<<std::endl;\n        for (size_t j=0;j<to_refine_face.size();j++)\n        {\n            int IndexF=to_refine_face[j];\n            CoordType PD1=mesh.face[IndexF].PD1();\n            CoordType PD2=mesh.face[IndexF].PD2();\n            CoordType NewPos=(mesh.face[IndexF].P(0)+\n                              mesh.face[IndexF].P(1)+\n                              mesh.face[IndexF].P(2))/3;\n            vcg::tri::Allocator<MeshType>::AddVertex(mesh,NewPos);\n            VertexType *V0=mesh.face[IndexF].V(0);\n            VertexType *V1=mesh.face[IndexF].V(1);\n            VertexType *V2=mesh.face[IndexF].V(2);\n            VertexType *V3=&mesh.vert.back();\n            mesh.face[IndexF].V(2)=V3;\n            vcg::tri::Allocator<MeshType>::AddFace(mesh,V1,V2,V3);\n            mesh.face.back().PD1()=PD1;\n            mesh.face.back().PD2()=PD2;\n            vcg::tri::Allocator<MeshType>::AddFace(mesh,V2,V0,V3);\n            mesh.face.back().PD1()=PD1;\n            mesh.face.back().PD2()=PD2;\n        }\n        mesh.UpdateDataStructures();\n        mesh.SetFeatureFromTable();\n        return true;\n    }\n\n\n    static bool SplitAdjacentEdgeSharpFromEdgeSel(MeshType &mesh)\n    {\n        typedef SplitLev<FaceType> SplitLevType;\n        typedef EdgePred<FaceType> EdgePredType;\n\n        mesh.InitFeatureCoordsTable();\n        vcg::tri::UpdateSelection<MeshType>::VertexClear(mesh);\n        //InitFaceEdgeSelFromFeatureSeq();\n\n        std::set<std::pair<CoordType,CoordType> > EdgePos;\n\n        for (size_t i=0;i<mesh.face.size();i++)\n        {\n            for (size_t j=0;j<3;j++)\n            {\n                if (!mesh.face[i].IsFaceEdgeS(j))continue;\n                int VIndex0=vcg::tri::Index(mesh,mesh.face[i].V0(j));\n                int VIndex1=vcg::tri::Index(mesh,mesh.face[i].V1(j));\n                CoordType P0=mesh.vert[VIndex0].P();\n                CoordType P1=mesh.vert[VIndex1].P();\n                mesh.vert[VIndex0].SetS();\n                mesh.vert[VIndex1].SetS();\n                EdgePos.insert(std::pair<CoordType,CoordType>(std::min(P0,P1),std::max(P0,P1)));\n            }\n        }\n\n        //then save the edges to be splitted\n        std::map<CoordPair,CoordType> ToBeSplitted;\n        for (size_t i=0;i<mesh.face.size();i++)\n        {\n            //find the number of edges\n            int Num=0;\n            for (size_t j=0;j<3;j++)\n            {\n                int VIndex0=vcg::tri::Index(mesh,mesh.face[i].V0(j));\n                int VIndex1=vcg::tri::Index(mesh,mesh.face[i].V1(j));\n                if ((!mesh.vert[VIndex0].IsS())||(!mesh.vert[VIndex1].IsS()))continue;\n                CoordType P0=mesh.vert[VIndex0].P();\n                CoordType P1=mesh.vert[VIndex1].P();\n                std::pair<CoordType,CoordType> Key(std::min(P0,P1),std::max(P0,P1));\n                if (EdgePos.count(Key)==1){Num++;continue;}\n\n                ToBeSplitted[Key]=(P0+P1)/2;\n            }\n            assert(Num<=2);//this should be already solved\n        }\n        std::cout<<\"Performing \"<<ToBeSplitted.size()<< \" split ops\"<<std::endl;\n\n        SplitLevType splMd(&ToBeSplitted);\n        EdgePredType eP(&ToBeSplitted);\n\n        //do the final split\n        bool done=vcg::tri::RefineE<MeshType,SplitLevType,EdgePredType >(mesh,splMd,eP);\n\n        mesh.UpdateDataStructures();\n        mesh.SetFeatureFromTable();\n        return done;\n    }\n\n\n\n    static bool RemoveFolds(MeshType &mesh,\n                            ScalarType MinDot=-0.99,\n                            bool debugmsg=false)\n    {\n\n        mesh.InitFeatureCoordsTable();\n\n        for (size_t i=0;i<mesh.face.size();i++)\n            for (size_t j=0;j<3;j++)\n                mesh.face[i].ClearFaceEdgeS(j);\n\n        ScalarType AvgEdge=0;\n        size_t Num=0;\n        for (size_t i=0;i<mesh.face.size();i++)\n            for (size_t j=0;j<mesh.face[i].VN();j++)\n            {\n                AvgEdge+=(mesh.face[i].P0(j)-mesh.face[i].P1(j)).Norm();\n                Num++;\n                if (vcg::face::IsBorder(mesh.face[i],j))continue;\n                if (!IsFold(mesh.face[i],j,MinDot))continue;\n                mesh.face[i].SetFaceEdgeS(j);\n            }\n        AvgEdge/=Num;\n\n        size_t NumV0=mesh.vert.size();\n        vcg::tri::CutMeshAlongSelectedFaceEdges<MeshType>(mesh);\n        mesh.UpdateDataStructures();\n        size_t NumV1=mesh.vert.size();\n\n        if (debugmsg)\n            std::cout<<\"Added \"<<NumV1-NumV0<<\" vertices\"<<std::endl;\n\n        for (size_t i=NumV0;i<NumV1;i++)\n            mesh.vert[i].P()+=mesh.vert[i].N()*AvgEdge*0.00001;\n\n        mesh.SetFeatureFromTable();\n        for (size_t i=0;i<mesh.face.size();i++)\n            for (size_t j=0;j<(int)mesh.face[i].VN();j++)\n            {\n                if (!vcg::face::IsBorder(mesh.face[i],j))continue;\n                mesh.face[i].SetFaceEdgeS(j);\n            }\n        return (NumV1>NumV0);\n    }\n\n\n    static bool RemoveNonManifold(MeshType &mesh)\n    {\n        bool modified=false;\n        ScalarType interval=std::numeric_limits<float>::epsilon()*10;\n        int i = 0;\n        int removed = 0;\n        int max_step=50;\n        do\n        {\n            modified| vcg::tri::Clean<MeshType>::SplitNonManifoldVertex(mesh,interval);\n            std::cout << \"removed \" << removed << \" non manifold vertices...\" << std::endl;\n        }\n        while (removed > 0 && i < max_step);\n\n    }\n\n    static bool MakeOrientable(MeshType &mesh)\n    {\n        bool oriented = false, orientable = false;\n        vcg::tri::Clean<MeshType>::OrientCoherentlyMesh(mesh, oriented, orientable);\n        mesh.UpdateDataStructures();\n        return (!orientable);\n    }\n\n    static bool RemoveZeroAreaFaces(MeshType &mesh)\n    {\n        //REMOVE ZERO AREA FACES\n        int cleaned=vcg::tri::Clean<MeshType>::RemoveZeroAreaFace(mesh);\n        bool modified=(cleaned>0);\n\n        if (modified)\n            mesh.UpdateDataStructures();\n\n        return modified;\n    }\n\n    static bool RemoveNonManifolds(MeshType &mesh,\n                                   bool debugMsg=false)\n    {\n        int splitV = 0, openings = 0;\n        bool modified=false;\n        ScalarType interval=std::numeric_limits<float>::epsilon()*10;\n        do\n        {\n            vcg::tri::UpdateTopology<MeshType>::FaceFace(mesh);\n            splitV = vcg::tri::Clean<MeshType>::SplitNonManifoldVertex(mesh,interval);\n            openings = AutoRemesher<MeshType>::openNonManifoldEdges(mesh, interval);\n            modified|=(openings>0);\n\n            if (debugMsg)\n                std::cout << \"Opened \" << openings << \" non manifold edges\" << std::endl;\n\n        } while (splitV > 0 || openings > 0);\n\n        if (modified)\n            mesh.UpdateDataStructures();\n\n        return modified;\n    }\n\n    static bool RemoveColinearFaces(MeshType & m, const ScalarType colinearThr = 0.001)\n    {\n        typedef vcg::GridStaticPtr<FaceType, ScalarType> StaticGrid;\n\n        vcg::tri::UpdateTopology<MeshType>::FaceFace(m);\n\n        MeshType projectMesh;\n        vcg::tri::Append<MeshType, MeshType>::MeshCopy(projectMesh, m);\n        vcg::tri::UpdateBounding<MeshType>::Box(projectMesh);\n        vcg::tri::UpdateNormal<MeshType>::PerVertexNormalizedPerFace(projectMesh);\n        StaticGrid grid;\n        grid.Set(projectMesh.face.begin(), projectMesh.face.end());\n\n\n        int count = 0;\n        int iter = 0;\n        bool modified=false;\n        do\n        {\n            vcg::tri::UpdateTopology<MeshType>::FaceFace(m);\n            vcg::tri::UnMarkAll(m);\n\n            count = 0;\n            for (size_t i = 0; i < size_t(m.FN()); ++i)\n            {\n                FaceType & f = m.face[i];\n\n                ScalarType quality = vcg::QualityRadii(f.cP(0), f.cP(1), f.cP(2));\n\n                if (quality <= colinearThr)\n                {\n                    //find longest edge\n                    double edges[3];\n                    edges[0] = vcg::Distance(f.cP(0), f.cP(1));\n                    edges[1] = vcg::Distance(f.cP(1), f.cP(2));\n                    edges[2] = vcg::Distance(f.cP(2), f.cP(0));\n\n                    ScalarType smallestEdge = std::min(edges[0], std::min(edges[1], edges[2]));\n                    int longestIdx = std::find(edges, edges+3, std::max(std::max(edges[0], edges[1]), edges[2])) - (edges);\n\n                    if (vcg::tri::IsMarked(m, f.V2(longestIdx)))\n                        continue;\n\n\n                    auto f1 = f.cFFp(longestIdx);\n                    vcg::tri::Mark(m,f.V2(longestIdx));\n                    if (!vcg::face::IsBorder(f, longestIdx) && vcg::face::IsManifold(f, longestIdx) && vcg::face::checkFlipEdgeNotManifold<FaceType>(f, longestIdx))  {\n\n                        // Check if EdgeFlipping improves quality\n                        FacePointer g = f.FFp(longestIdx); int k = f.FFi(longestIdx);\n                        vcg::Triangle3<ScalarType> t1(f.P(longestIdx), f.P1(longestIdx), f.P2(longestIdx)), t2(g->P(k), g->P1(k), g->P2(k)),\n                                t3(f.P(longestIdx), g->P2(k), f.P2(longestIdx)), t4(g->P(k), f.P2(longestIdx), g->P2(k));\n\n                        auto n1 = vcg::TriangleNormal(t1);\n                        auto n2 = vcg::TriangleNormal(t2);\n                        auto n3 = vcg::TriangleNormal(t3);\n                        auto n4 = vcg::TriangleNormal(t4);\n\n                        auto biggestSmallest = vcg::DoubleArea(t1) > vcg::DoubleArea(t2) ? std::make_pair(t1, t2) : std::make_pair(t2, t1);\n                        auto areaRatio = vcg::DoubleArea(biggestSmallest.first) / vcg::DoubleArea(biggestSmallest.second);\n\n                        bool normalCheck = true;\n                        //                        if (n1.Norm() > 0.001 && n2.Norm() > 0.001)\n                        {\n                            auto referenceNormal = vcg::NormalizedTriangleNormal(biggestSmallest.first);\n\n                            normalCheck &= vcg::NormalizedTriangleNormal(t3) * referenceNormal >= 0.95;\n                            normalCheck &= vcg::NormalizedTriangleNormal(t4) * referenceNormal >= 0.95;\n                        }\n\n                        bool areaCheck = false;\n                        if (areaRatio > 1000)\n                        {\n                            areaCheck |= vcg::DoubleArea(t3) / vcg::DoubleArea(biggestSmallest.second) > 1000 && vcg::DoubleArea(t4) / vcg::DoubleArea(biggestSmallest.second) > 1000;\n                        }\n\n                        if ((normalCheck) && (areaCheck || std::min( QualityFace(t1), QualityFace(t2) ) <= std::min( QualityFace(t3), QualityFace(t4))))\n                        {\n                            ScalarType dist;\n                            CoordType closest;\n                            auto fp0 = vcg::tri::GetClosestFaceBase(projectMesh, grid, vcg::Barycenter(t3), smallestEdge/4., dist, closest);\n                            if (fp0 == NULL)\n                                continue;\n\n                            auto fp1 = vcg::tri::GetClosestFaceBase(projectMesh, grid, vcg::Barycenter(t4), smallestEdge/4., dist, closest);\n                            if (fp1 == NULL)\n                                continue;\n\n                            vcg::face::FlipEdgeNotManifold<FaceType>(f, longestIdx);\n                            modified=true;\n                            ++count;\n                        }\n                    }\n                }\n            }\n        } while (count && ++iter < 75);\n        if (modified)\n            m.UpdateDataStructures();\n\n        return modified;\n    }\n\npublic:\n\n    static bool SolveGeometricArtifactsStep(MeshType &mesh)\n    {\n        bool modified=false;\n\n//        //REMOVE COLLINEAR FACES\n        modified|=RemoveColinearFaces(mesh);\n\n        //REMOVE ZERO AREA FACES\n        modified|=RemoveZeroAreaFaces(mesh);\n\n        //SPLIT NON MANIFOLD FACES\n        modified|=RemoveNonManifolds(mesh);\n\n        //REMOVE MINIMAL CONNECTED COMPONENTS\n        modified|=RemoveSmallComponents(mesh);\n\n        //MAKE ORIENTABLE\n        modified|=MakeOrientable(mesh);\n\n        //SOLVE POSSIBLE PRECISION ISSUES\n        modified|=SolvePrecisionIssues(mesh);\n\n//        //THEN SPLIT OR REMOVE 180 FOLDS\n        modified|=SplitFolds(mesh);\n        modified|=RemoveFolds(mesh);\n\n//        //REMOVE POSSIBLE PRECISION ISSUES\n        modified|=SolvePrecisionIssues(mesh);\n\n        return modified;\n    }\n\npublic:\n\n    static void SolveGeometricArtifacts(MeshType &mesh,size_t max_steps=10)\n    {\n        size_t currS=0;\n        while ((SolveGeometricArtifactsStep(mesh))&&(currS<max_steps))\n            currS++;\n\n        //AutoRemesher<MeshType>::collapseSurvivingMicroEdges(mesh,0.001, const ScalarType edgeRatio = 0.025);\n\n        vcg::tri::Allocator<MeshType>::CompactEveryVector(mesh);\n        mesh.UpdateDataStructures();\n    }\n\n    static void RefineIfNeeded(MeshType &mesh)\n    {\n\n        mesh.UpdateDataStructures();\n        bool has_refined=false;\n        do\n        {\n            has_refined=false;\n            has_refined|=RefineInternalFacesStepFromEdgeSel(mesh);\n            //SolvePrecisionIssues(mesh);//CHECK\n            has_refined|=SplitAdjacentEdgeSharpFromEdgeSel(mesh);\n            //SolvePrecisionIssues(mesh);//CHECK\n\n            //has_refined|=SplitAdjacentTerminalVertices();\n            //has_refined|=SplitEdgeSharpSharingVerticesFromEdgeSel();\n        }while (has_refined);\n        mesh.InitEdgeType();\n    }\n\n    static void InitSharpFeatures(MeshType &mesh,\n                                  ScalarType sharp_feature_thr,\n                                  size_t feature_erode_dilate)\n    {\n        mesh.UpdateDataStructures();\n        mesh.InitSharpFeatures(sharp_feature_thr);\n        mesh.ErodeDilate(feature_erode_dilate);\n    }\n\n    struct BatchParam\n    {\n        bool UpdateSharp=true;\n        bool DoRemesh=true;\n        bool surf_dist_check=true;\n        ScalarType sharp_feature_thr=35;\n        size_t feature_erode_dilate=4;\n        ScalarType SharpFactor=6;\n        size_t remesher_iterations=15;\n        ScalarType remesher_aspect_ratio=0.3;\n        ScalarType remesher_termination_delta = 10000;\n    };\n\n    static void BatchProcess(MeshType &mesh,BatchParam &BPar,\n                             typename vcg::tri::FieldSmoother<MeshType>::SmoothParam &FieldParam)\n    {\n        mesh.UpdateDataStructures();\n\n        // SELECT SHARP FEATURES\n        if (BPar.UpdateSharp)\n            MeshPrepocess<MeshType>::InitSharpFeatures(mesh,BPar.sharp_feature_thr,BPar.feature_erode_dilate);\n\n//        MeshPrepocess<MeshType>::SolveGeometricArtifacts(mesh);\n\n//        // SELECT SHARP FEATURES\n//        if (BPar.UpdateSharp)\n//            MeshPrepocess<MeshType>::InitSharpFeatures(mesh,BPar.sharp_feature_thr,BPar.feature_erode_dilate);\n\n        //DO REMESH IF NEEDED\n        if (BPar.DoRemesh)\n        {\n            typename AutoRemesher<MeshType>::Params RemPar;\n            RemPar.iterations   = BPar.remesher_iterations;\n            RemPar.targetAspect = BPar.remesher_aspect_ratio;\n            RemPar.targetDeltaFN= BPar.remesher_termination_delta;\n            RemPar.surfDistCheck = BPar.surf_dist_check;\n\n            //AutoRemesher<MeshType>::Remesh2(mesh,RemPar);\n            AutoRemesher<MeshType>::RemeshAdapt(mesh,RemPar);\n\n        }\n        mesh.InitFeatureCoordsTable();\n\n//        //THEN UPDATE SHARP FEATURES\n//        if (BPar.UpdateSharp)\n//            MeshPrepocess<MeshType>::InitSharpFeatures(mesh,BPar.sharp_feature_thr,BPar.feature_erode_dilate);\n\n\n        //SOLVE POSSIBLE GEOMETRIC ARTIFACTS AFTER REFINEMENT\n        MeshPrepocess<MeshType>::SolveGeometricArtifacts(mesh);\n\n        //REFINE THE MESH IF NEEDED TO BE CONSISTENT WHEN COMPUTING FIELD\n        MeshPrepocess<MeshType>::RefineIfNeeded(mesh);\n\n//        //THEN UPDATE SHARP FEATURES\n//        if (BPar.UpdateSharp)\n//            MeshPrepocess<MeshType>::InitSharpFeatures(mesh,BPar.sharp_feature_thr,BPar.feature_erode_dilate);\n//        mesh.ErodeDilate(BPar.feature_erode_dilate);\n\n        MeshFieldSmoother<MeshType>::AutoSetupParam(mesh,FieldParam,BPar.SharpFactor);\n\n        //THEN SMOOTH THE FIELD\n        std::cout << \"[fieldComputation] Smooth Field Computation...\" << std::endl;\n        MeshFieldSmoother<MeshType>::SmoothField(mesh,FieldParam);\n    }\n\n    static void SaveAllData(MeshType &tri_mesh,const std::string &pathM)\n    {\n        std::string projM=pathM;\n        size_t indexExt=projM.find_last_of(\".\");\n        projM=projM.substr(0,indexExt);\n        std::string meshName=projM+std::string(\"_rem.obj\");\n        std::string fieldName=projM+std::string(\"_rem.rosy\");\n        std::string sharpName=projM+std::string(\"_rem.sharp\");\n        std::cout<<\"Saving Mesh TO:\"<<meshName.c_str()<<std::endl;\n        std::cout<<\"Saving Field TO:\"<<fieldName.c_str()<<std::endl;\n        std::cout<<\"Saving Sharp TO:\"<<sharpName.c_str()<<std::endl;\n        tri_mesh.SaveTriMesh(meshName.c_str());\n        tri_mesh.SaveField(fieldName.c_str());\n        tri_mesh.SaveSharpFeatures(sharpName.c_str());\n    }\n\n};\n\n\n\n\n#endif\n"
  },
  {
    "path": "components/field_computation/poly_mesh_type.h",
    "content": "/***************************************************************************/\n/* Copyright(C) 2021\n\n\nThe authors of\n\nReliable Feature-Line Driven Quad-Remeshing\nSiggraph 2021\n\n\n All rights reserved.\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <https://www.gnu.org/licenses/>.\n****************************************************************************/\n\n#ifndef POLY_MESH_TYPE\n#define POLY_MESH_TYPE\n\n#include <vcg/complex/complex.h>\n#include <vcg/complex/algorithms/polygonal_algorithms.h>\n\n#ifdef MIQ_QUADRANGULATE\nclass PolyFace;\nclass PolyVertex;\n\nstruct PUsedTypes: public vcg::UsedTypes<vcg::Use<PolyVertex>  ::AsVertexType,\n        vcg::Use<PolyFace>\t::AsFaceType>{};\n\nclass PolyVertex:public vcg::Vertex<\tPUsedTypes,\n        vcg::vertex::Coord3d,\n        vcg::vertex::Normal3d,\n        vcg::vertex::Mark,\n        vcg::vertex::BitFlags,\n        vcg::vertex::Qualityd,\n        vcg::vertex::TexCoord2d>{} ;\n\nclass PolyFace:public vcg::Face<\n        PUsedTypes\n        ,vcg::face::PolyInfo\n        ,vcg::face::PFVAdj\n        ,vcg::face::PFFAdj\n        ,vcg::face::BitFlags\n        ,vcg::face::Normal3d\n        ,vcg::face::Color4b\n        ,vcg::face::Qualityd      // face quality.\n        ,vcg::face::BitFlags\n        ,vcg::face::Mark\n        ,vcg::face::CurvatureDird> {\n};\n\nclass PMesh: public\n        vcg::tri::TriMesh<\n        std::vector<PolyVertex>,\t// the vector of vertices\n        std::vector<PolyFace >     // the vector of faces\n        >\n{\npublic:\n\n    void TriangulateQuadBySplit(size_t IndexF)\n    {\n\n        size_t sizeV=face[IndexF].VN();\n        assert(sizeV==4);\n\n        //then reupdate the faces\n        VertexType * v0=face[IndexF].V(0);\n        VertexType * v1=face[IndexF].V(1);\n        VertexType * v2=face[IndexF].V(2);\n        VertexType * v3=face[IndexF].V(3);\n\n        face[IndexF].Dealloc();\n        face[IndexF].Alloc(3);\n        face[IndexF].V(0)=v0;\n        face[IndexF].V(1)=v1;\n        face[IndexF].V(2)=v3;\n\n        vcg::tri::Allocator<PMesh>::AddFaces(*this,1);\n\n        face.back().Alloc(3);\n        face.back().V(0)=v1;\n        face.back().V(1)=v2;\n        face.back().V(2)=v3;\n    }\n\n    void TriangulateQuadBySplit()\n    {\n        for (size_t i=0;i<face.size();i++)\n        {\n            if(face[i].VN()!=4)continue;\n            TriangulateQuadBySplit(i);\n        }\n    }\n    void GLDraw(bool DrawEdges=true)\n    {\n\n        glPushAttrib(GL_ALL_ATTRIB_BITS);\n\n        glDepthRange(0.000001,1);\n\n        glEnable(GL_LIGHTING);\n\n        glDisable(GL_CULL_FACE);\n        glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);\n\n        for(unsigned int i=0; i<face.size(); i++)\n        {\n            vcg::glColor(face[i].C());\n\n            if(face[i].IsD())  continue;\n            //if(face[i].Filtered) continue;\n\n            vcg::glNormal(face[i].N());\n\n            glBegin(GL_POLYGON);\n            for(int j=0; j<face[i].VN(); j++)\n                vcg::glVertex( face[i].V(j)->P() );\n\n            glEnd();\n\n        }\n\n        //DrawEdgeSmoothPairs();\n\n        if (DrawEdges)\n        {\n            glDepthRange(0.0,0.999999);\n            glDisable(GL_LIGHTING);\n\n            //            vcg::glColor(vcg::Color4b(255,0,0,255));\n            //            for(unsigned int i=0; i<vert.size(); i++)\n            //            {\n            //                if (!vert[i].Irregular)continue;\n            //                glPointSize(20);\n            //                glBegin(GL_POINTS);\n            //                vcg::glVertex( vert[i].P());\n            //                glEnd();\n            //            }\n            for(unsigned int i=0; i<face.size(); i++)\n            {\n                if(face[i].IsD())  continue;\n                int size=face[i].VN();\n                for(int j=0; j<face[i].VN(); j++)\n                {\n\n                    glLineWidth(4);\n                    vcg::glColor(vcg::Color4b(0,0,0,255));\n\n                    CoordType pos0=face[i].V(j)->P();\n                    CoordType pos1=face[i].V((j+1)%size)->P();\n\n                    glBegin(GL_LINES);\n                    vcg::glVertex( pos0);\n                    vcg::glVertex( pos1);\n                    glEnd();\n                }\n            }\n        }\n        //glEnd();\n        glPopAttrib();\n\n    }\n\n    void UpdateNormal()\n    {\n        vcg::PolygonalAlgorithm<PMesh>::UpdateFaceNormalByFitting(*this);\n        vcg::tri::UpdateNormal<PMesh>::PerVertexNormalized(*this);\n    }\n\n    void UpdateAttributes()\n    {\n        UpdateNormal();\n        vcg::tri::UpdateBounding<PMesh>::Box(*this);\n        vcg::tri::UpdateTopology<PMesh>::FaceFace(*this);\n        //vcg::PolygonalAlgorithm<QuadMeshC>::UpdateBorderVertexFromPFFAdj(*this);\n        vcg::tri::UpdateFlags<PMesh>::VertexBorderFromFaceAdj(*this);\n\n    }\n};\n#endif\n\n\n\n#endif\n"
  },
  {
    "path": "components/field_computation/triangle_mesh_type.h",
    "content": "/***************************************************************************/\n/* Copyright(C) 2021\n\n\nThe authors of\n\nReliable Feature-Line Driven Quad-Remeshing\nSiggraph 2021\n\n\n All rights reserved.\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <https://www.gnu.org/licenses/>.\n****************************************************************************/\n\n#ifndef MY_TRI_MESH_TYPE\n#define MY_TRI_MESH_TYPE\n\n//#define MINDOT -0.99\n\n#include <vcg/complex/complex.h>\n#include <vcg/complex/algorithms/update/topology.h>\n#include <vcg/complex/algorithms/update/bounding.h>\n#include <vcg/simplex/face/topology.h>\n#include <wrap/io_trimesh/import.h>\n#include <wrap/io_trimesh/export.h>\n//#include <wrap/gl/trimesh.h>\n//\n#include <wrap/io_trimesh/export_field.h>\n#include <wrap/io_trimesh/import_field.h>\n#include <iostream>\n#include <fstream>\n#include <vcg/complex/algorithms/attribute_seam.h>\n#include <vcg/complex/algorithms/crease_cut.h>\n#include \"fields/field_smoother.h\"\n\n\nclass FieldTriFace;\n//class MyTriEdge;\nclass FieldTriVertex;\n\nenum FeatureKind{ETConcave,ETConvex,ETNone};\n\nstruct TriUsedTypes: public vcg::UsedTypes<vcg::Use<FieldTriVertex>::AsVertexType,\n        //vcg::Use<MyTriEdge>::AsEdgeType,\n        vcg::Use<FieldTriFace>::AsFaceType>{};\n\nclass FieldTriVertex:public vcg::Vertex<TriUsedTypes,\n        vcg::vertex::Coord3d,\n        vcg::vertex::Color4b,\n        vcg::vertex::Normal3d,\n        vcg::vertex::VFAdj,\n        vcg::vertex::BitFlags,\n        vcg::vertex::CurvatureDird,\n        vcg::vertex::Qualityd,\n        vcg::vertex::TexCoord2d,\n        vcg::vertex::Mark>\n{\n};\n\nclass FieldTriFace:public vcg::Face<TriUsedTypes,\n        vcg::face::VertexRef,\n        vcg::face::VFAdj,\n        vcg::face::FFAdj,\n        vcg::face::BitFlags,\n        vcg::face::Normal3d,\n        vcg::face::CurvatureDird,\n        vcg::face::Color4b,\n        vcg::face::Qualityd,\n        vcg::face::WedgeTexCoord2d,\n        vcg::face::Mark>\n{\n\npublic:\n\n    size_t IndexOriginal;\n\n    void ImportData(const FieldTriFace  & left )\n    {\n        IndexOriginal=left.IndexOriginal;\n        vcg::Face<TriUsedTypes,\n                vcg::face::VertexRef,\n                vcg::face::VFAdj,\n                vcg::face::FFAdj,\n                vcg::face::BitFlags,\n                vcg::face::Normal3d,\n                vcg::face::CurvatureDird,\n                vcg::face::Color4b,\n                vcg::face::Qualityd,\n                vcg::face::WedgeTexCoord2d,\n                vcg::face::Mark>::ImportData(left);\n    }\n\n    FeatureKind FKind[3];\n};\n\n//enum GoemPrecondition{NOVertManifold,NOFaceManifold,\n//                      DegenerateFace,DegenerateVertex,\n//                      UnreferencedVert,\n//                      IsOk};\n\n\nclass FieldTriMesh: public vcg::tri::TriMesh< std::vector<FieldTriVertex>,\n        //std::vector<MyTriEdge>,\n        std::vector<FieldTriFace > >\n{\n    typedef std::pair<CoordType,CoordType> CoordPair;\n    std::set< CoordPair > FeaturesCoord;\n\npublic:\n\n    ScalarType LimitConcave;\n\n    void InitEdgeType()\n    {\n        for (size_t i=0;i<face.size();i++)\n            for (size_t j=0;j<3;j++)\n            {\n                if (IsConcaveEdge(face[i],j))\n                    face[i].FKind[j]=ETConcave;\n                else\n                    face[i].FKind[j]=ETConvex;\n            }\n    }\n\n    void InitFeatureCoordsTable()\n    {\n        FeaturesCoord.clear();\n        for (size_t i=0;i<face.size();i++)\n        {\n            for (size_t j=0;j<3;j++)\n            {\n                if (!face[i].IsFaceEdgeS(j))continue;\n                CoordPair PosEdge(std::min(face[i].P0(j),face[i].P1(j)),\n                                  std::max(face[i].P0(j),face[i].P1(j)));\n                FeaturesCoord.insert(PosEdge);\n            }\n        }\n    }\n\n\n    void SetFeatureFromTable()\n    {\n        for (size_t i=0;i<face.size();i++)\n        {\n            for (size_t j=0;j<3;j++)\n            {\n                face[i].ClearFaceEdgeS(j);\n                CoordPair PosEdge(std::min(face[i].P0(j),face[i].P1(j)),\n                                  std::max(face[i].P0(j),face[i].P1(j)));\n                if(FeaturesCoord.count(PosEdge)==0)continue;\n                face[i].SetFaceEdgeS(j);\n            }\n        }\n    }\n\n    bool IsConcaveEdge(const FaceType &f0,int IndexE)\n    {\n        FaceType *f1=f0.cFFp(IndexE);\n        if (f1==&f0)return false;\n        CoordType N0=f0.cN();\n        CoordType N1=f1->cN();\n        CoordType EdgeDir=f0.cP1(IndexE)-f0.cP0(IndexE);\n        EdgeDir.Normalize();\n        CoordType Cross=N0^N1;\n        return ((Cross*EdgeDir)<LimitConcave);\n    }\n\n\n\npublic:\n\n    bool LoadTriMesh(const std::string &filename,bool &allQuad)\n    {\n        allQuad=false;\n        Clear();\n        if(filename.empty()) return false;\n        int position0=filename.find(\".ply\");\n        int position1=filename.find(\".obj\");\n        int position2=filename.find(\".off\");\n\n        if (position0!=-1)\n        {\n            int err=vcg::tri::io::ImporterPLY<FieldTriMesh>::Open(*this,filename.c_str());\n            if (err!=vcg::ply::E_NOERROR)return false;\n            return true;\n        }\n        if (position1!=-1)\n        {\n#ifdef MIQ_QUADRANGULATE\n            PMesh pmesh;\n            int Mask;\n            vcg::tri::io::ImporterOBJ<PMesh>::LoadMask(filename.c_str(), Mask);\n            int err=vcg::tri::io::ImporterOBJ<PMesh>::Open(pmesh,filename.c_str(),Mask);\n            if ((err!=0)&&(err!=5))return false;\n            check if all quad\n                    allQuad=true;\n            for (size_t i=0;i<pmesh.face.size();i++)\n            {\n                if (pmesh.face[i].VN()==4)continue;\n                allQuad=false;\n            }\n            if (allQuad)\n            {\n                for (size_t i=0;i<pmesh.face.size();i++)\n                {\n                    CoordType PD1[2];\n                    PD1[0]=(pmesh.face[i].V(0)->P()-pmesh.face[i].V(1)->P());\n                    PD1[1]=(pmesh.face[i].V(3)->P()-pmesh.face[i].V(2)->P());\n                    PD1[0].Normalize();\n                    PD1[1].Normalize();\n                    CoordType PD2[2];\n                    PD2[0]=(pmesh.face[i].V(2)->P()-pmesh.face[i].V(1)->P());\n                    PD2[1]=(pmesh.face[i].V(3)->P()-pmesh.face[i].V(0)->P());\n                    PD2[0].Normalize();\n                    PD2[1].Normalize();\n                    pmesh.face[i].PD1()=PD1[0]+PD1[1];\n                    pmesh.face[i].PD2()=PD2[0]+PD2[1];\n                    pmesh.face[i].PD1().Normalize();\n                    pmesh.face[i].PD2().Normalize();\n                }\n                size_t size=pmesh.fn;\n                //vcg::PolygonalAlgorithm<PMesh>::Triangulate(pmesh,false);\n\n                pmesh.TriangulateQuadBySplit();\n                for (size_t i=0;i<size;i++)\n                {\n                    pmesh.face[i+size].PD1()=pmesh.face[i].PD1();\n                    pmesh.face[i+size].PD2()=pmesh.face[i].PD2();\n                }\n                //then copy the field\n                Clear();\n                vcg::tri::Allocator<FieldTriMesh>::AddVertices(*this,pmesh.vn);\n                vcg::tri::Allocator<FieldTriMesh>::AddFaces(*this,pmesh.fn);\n\n                for (size_t i=0;i<pmesh.vert.size();i++)\n                    vert[i].P()=pmesh.vert[i].P();\n\n                for (size_t i=0;i<pmesh.face.size();i++)\n                {\n                    size_t IndexV0=vcg::tri::Index(pmesh,pmesh.face[i].V(0));\n                    size_t IndexV1=vcg::tri::Index(pmesh,pmesh.face[i].V(1));\n                    size_t IndexV2=vcg::tri::Index(pmesh,pmesh.face[i].V(2));\n                    face[i].V(0)=&vert[IndexV0];\n                    face[i].V(1)=&vert[IndexV1];\n                    face[i].V(2)=&vert[IndexV2];\n                    face[i].PD1()=pmesh.face[i].PD1();\n                    face[i].PD2()=pmesh.face[i].PD2();\n                }\n                UpdateDataStructures();\n                for (size_t i=0;i<face.size();i++)\n                {\n                    face[i].PD1()-=face[i].N()*(face[i].PD1()*face[i].N());\n                    face[i].PD2()-=face[i].N()*(face[i].PD2()*face[i].N());\n                    face[i].PD1().Normalize();\n                    face[i].PD2().Normalize();\n                    CoordType Avg=face[i].PD1()+face[i].PD2();\n                    Avg.Normalize();\n                    CoordType Avg1=face[i].N()^Avg;\n                    Avg1.Normalize();\n                    face[i].PD1()=Avg+Avg1;\n                    face[i].PD1().Normalize();\n                    face[i].PD2()=face[i].N()^face[i].PD1();\n                }\n                vcg::tri::CrossField<FieldTriMesh>::OrientDirectionFaceCoherently(*this);\n                vcg::tri::CrossField<FieldTriMesh>::UpdateSingularByCross(*this);\n                return true;\n            }\n            else\n            {\n#endif\n                int mask;\n                vcg::tri::io::ImporterOBJ<FieldTriMesh>::LoadMask(filename.c_str(),mask);\n                int err=vcg::tri::io::ImporterOBJ<FieldTriMesh>::Open(*this,filename.c_str(),mask);\n\n                if ((err!=0)&&(err!=5))return false;\n                return true;\n#ifdef MIQ_QUADRANGULATE\n            }\n#endif\n\n        }\n        if (position2!=-1)\n        {\n            int err=vcg::tri::io::ImporterOFF<FieldTriMesh>::Open(*this,filename.c_str());\n            if (err!=0)return false;\n            return true;\n        }\n        return false;\n    }\n\n    bool SaveSharpFeatures(const std::string &filename)const\n    {\n        if(filename.empty()) return false;\n        std::ofstream myfile;\n        myfile.open (filename.c_str());\n        size_t num=0;\n        for (size_t i=0;i<face.size();i++)\n            for (size_t j=0;j<3;j++)\n            {\n                if (!face[i].IsFaceEdgeS(j))continue;\n                num++;\n            }\n        myfile <<num<<std::endl;\n        for (size_t i=0;i<face.size();i++)\n            for (size_t j=0;j<3;j++)\n            {\n                if (!face[i].IsFaceEdgeS(j))continue;\n                if (face[i].FKind[j]==ETConcave)\n                    myfile <<\"0,\"<< i <<\",\"<<j<<std::endl;\n                else\n                    myfile <<\"1,\"<< i <<\",\"<<j<<std::endl;\n            }\n        myfile.close();\n        return true;\n    }\n\n    bool LoadField(std::string field_filename)\n    {\n        int position0=field_filename.find(\".ffield\");\n        int position1=field_filename.find(\".rosy\");\n\n\n        if (position0!=-1)\n        {\n            bool loaded=vcg::tri::io::ImporterFIELD<FieldTriMesh>::LoadFFIELD(*this,field_filename.c_str());\n            if (!loaded)return false;\n            vcg::tri::CrossField<FieldTriMesh>::OrientDirectionFaceCoherently(*this);\n            vcg::tri::CrossField<FieldTriMesh>::UpdateSingularByCross(*this,true);\n            return true;\n        }\n        if (position1!=-1)\n        {\n            std::cout<<\"Importing ROSY field\"<<std::endl;\n            bool loaded=vcg::tri::io::ImporterFIELD<FieldTriMesh>::Load4ROSY(*this,field_filename.c_str());\n            std::cout<<\"Imported ROSY field\"<<std::endl;\n            if (!loaded)return false;\n            vcg::tri::CrossField<FieldTriMesh>::OrientDirectionFaceCoherently(*this);\n            vcg::tri::CrossField<FieldTriMesh>::UpdateSingularByCross(*this,true);\n            return true;\n        }\n        return false;\n    }\n\n    bool LoadSharpFeatures(const std::string &filename)\n    {\n        std::cout<<\"Loading Sharp Features\"<<std::endl;\n        for (size_t i=0;i<face.size();i++)\n        {\n            for (size_t j=0;j<3;j++)\n            {\n                face[i].FKind[j]=ETNone;\n                face[i].ClearFaceEdgeS(j);\n            }\n        }\n\n        FILE *f=fopen(filename.c_str(),\"rt\");\n        if (f==NULL)return false;\n        int Num;\n        fscanf(f,\"%d/n\",&Num);\n\n        for (size_t i=0;i<Num;i++)\n        {\n            int TypeSh,IndexF,IndexE;\n            fscanf(f,\"%d,%d,%d,/n\",&TypeSh,&IndexF,&IndexE);\n            assert((TypeSh==0)||(TypeSh==1));\n            assert((IndexE>=0)&&(IndexE<3));\n            assert((IndexF>=0)&&(IndexF<face.size()));\n            if (TypeSh==0)\n                face[IndexF].FKind[IndexE]=ETConcave;\n            else\n                face[IndexF].FKind[IndexE]=ETConvex;\n\n            face[IndexF].SetFaceEdgeS(IndexE);\n\n            if (!vcg::face::IsBorder(face[IndexF],IndexE))\n            {\n                FaceType *Fopp=face[IndexF].FFp(IndexE);\n                int IOpp=face[IndexF].FFi(IndexE);\n                Fopp->SetFaceEdgeS(IOpp);\n                if (TypeSh==0)\n                    Fopp->FKind[IOpp]=ETConcave;\n                else\n                    Fopp->FKind[IOpp]=ETConvex;\n            }\n        }\n        fclose(f);\n        return true;\n    }\n\n    bool LoadSharpFeaturesFL(const std::string &filename)\n    {\n        std::cout<<\"Loading Sharp Features FL Format\"<<std::endl;\n        for (size_t i=0;i<face.size();i++)\n        {\n            for (size_t j=0;j<3;j++)\n            {\n                face[i].FKind[j]=ETNone;\n                face[i].ClearFaceEdgeS(j);\n            }\n        }\n\n        FILE *f=fopen(filename.c_str(),\"rt\");\n        if (f==NULL)return false;\n        int Num;\n        fscanf(f,\"%d/n\",&Num);\n\n        std::map<std::pair<size_t,size_t> , std::pair<size_t,size_t> > FaceEdgeMap;\n        for (size_t i=0;i<face.size();i++)\n        {\n            for (size_t j=0;j<3;j++)\n            {\n                std::pair<size_t,size_t> FaceEdge(i,j);\n                size_t IndexV0=vcg::tri::Index(*this,face[i].V0(j));\n                size_t IndexV1=vcg::tri::Index(*this,face[i].V1(j));\n                std::pair<size_t,size_t> key(std::min(IndexV0,IndexV1),\n                                             std::max(IndexV0,IndexV1));\n                FaceEdgeMap[key]=FaceEdge;\n            }\n        }\n\n        for (size_t i=0;i<Num;i++)\n        {\n            int SizeSh;\n            fscanf(f,\"%d/n\",&SizeSh);\n            std::vector<int> CurrSh(SizeSh,-1);\n            for (size_t j=0;j<SizeSh;j++)\n                fscanf(f,\"%d\",&CurrSh[j]);\n\n            for (size_t j=0;j<CurrSh.size()-1;j++)\n            {\n                size_t IndexV0=CurrSh[j];\n                size_t IndexV1=CurrSh[j+1];\n                //std::cout<<\"Adding Sharp:\"<<IndexV0<<\";\"<<IndexV1<<std::endl;\n                std::pair<size_t,size_t> key(std::min(IndexV0,IndexV1),\n                                             std::max(IndexV0,IndexV1));\n                assert(FaceEdgeMap.count(key)>0);\n                size_t IndexF=FaceEdgeMap[key].first;\n                size_t IndexE=FaceEdgeMap[key].second;\n                face[IndexF].SetFaceEdgeS(IndexE);\n\n                if (IsConcaveEdge(face[IndexF],IndexE))\n                    face[IndexF].FKind[IndexE]=ETConcave;\n                else\n                    face[IndexF].FKind[IndexE]=ETConvex;\n\n                FeatureKind  FKind=face[IndexF].FKind[IndexE];\n\n                if (!vcg::face::IsBorder(face[IndexF],IndexE))\n                {\n                    FaceType *Fopp=face[IndexF].FFp(IndexE);\n                    int IOpp=face[IndexF].FFi(IndexE);\n                    Fopp->SetFaceEdgeS(IOpp);\n                    Fopp->FKind[IOpp]=FKind;\n                }\n            }\n        }\n        fclose(f);\n        return true;\n    }\n\npublic:\n\n    bool SaveTriMesh(const std::string &filename)\n    {\n        if(filename.empty()) return false;\n        int position0=filename.find(\".ply\");\n        int position1=filename.find(\".obj\");\n        int position2=filename.find(\".off\");\n\n        if (position0!=-1)\n        {\n            int err=vcg::tri::io::ExporterPLY<FieldTriMesh>::Save(*this,filename.c_str());\n            if (err!=vcg::ply::E_NOERROR)return false;\n            return true;\n        }\n        if (position1!=-1)\n        {\n            int mask=0;\n            int err=vcg::tri::io::ExporterOBJ<FieldTriMesh>::Save(*this,filename.c_str(),mask);\n            if ((err!=0)&&(err!=5))return false;\n            return true;\n        }\n        if (position2!=-1)\n        {\n            int err=vcg::tri::io::ExporterOFF<FieldTriMesh>::Save(*this,filename.c_str());\n            if (err!=0)return false;\n            return true;\n        }\n        return false;\n    }\n\n    bool SaveOrigFace(const std::string &filename)\n    {\n        if(filename.empty()) return false;\n        std::ofstream myfile;\n        myfile.open (filename.c_str());\n\n        for (size_t i=0;i<face.size();i++)\n            myfile <<face[i].IndexOriginal <<std::endl;\n\n        myfile.close();\n        return true;\n    }\n\n    bool SaveField(const std::string &filename)\n    {\n        if(filename.empty()) return false;\n        vcg::tri::io::ExporterFIELD<FieldTriMesh>::Save4ROSY(*this,filename.c_str());\n        return true;\n    }\n\n    //VCG UPDATING STRUCTURES\n    void UpdateDataStructures()\n    {\n        vcg::tri::Clean<FieldTriMesh>::RemoveUnreferencedVertex(*this);\n        vcg::tri::Allocator<FieldTriMesh>::CompactEveryVector(*this);\n\n        vcg::tri::UpdateBounding<FieldTriMesh>::Box(*this);\n        vcg::tri::UpdateNormal<FieldTriMesh>::PerVertexNormalizedPerFace(*this);\n        vcg::tri::UpdateNormal<FieldTriMesh>::PerFaceNormalized(*this);\n        vcg::tri::UpdateTopology<FieldTriMesh>::FaceFace(*this);\n        vcg::tri::UpdateTopology<FieldTriMesh>::VertexFace(*this);\n        vcg::tri::UpdateFlags<FieldTriMesh>::VertexBorderFromFaceAdj(*this);\n        vcg::tri::UpdateFlags<FieldTriMesh>::FaceBorderFromFF(*this);\n    }\n\n\n    void InitSharpFeatures(ScalarType SharpAngleDegree)\n    {\n        UpdateDataStructures();\n\n        for (size_t i=0;i<face.size();i++)\n            for (size_t j=0;j<3;j++)\n                face[i].ClearFaceEdgeS(j);\n\n        if (SharpAngleDegree>0)\n            vcg::tri::UpdateFlags<MeshType>::FaceEdgeSelCrease(*this,vcg::math::ToRad(SharpAngleDegree));\n        InitEdgeType();\n\n        for (size_t i=0;i<face.size();i++)\n            for (size_t j=0;j<3;j++)\n            {\n                if (vcg::face::IsBorder(face[i],j))\n                {\n                    face[i].SetFaceEdgeS(j);\n                    face[i].FKind[j]=ETConvex;\n                }\n            }\n        for (size_t i=0;i<face.size();i++)\n            for (size_t j=0;j<3;j++)\n            {\n\n                if (!vcg::face::IsManifold(face[i],j))\n                {\n                    face[i].SetFaceEdgeS(j);\n                    face[i].FKind[j]=ETConvex;\n                }\n            }\n        std::cout<<\"There is \"<<SharpLenght()<<\" sharp lenght\"<<std::endl;\n    }\n\n    ScalarType SharpLenght()\n    {\n        ScalarType LSharp=0;\n        for (size_t i=0;i<face.size();i++)\n            for (size_t j=0;j<3;j++)\n            {\n                ScalarType L=(face[i].P0(j)-face[i].P1(j)).Norm();\n                if (vcg::face::IsBorder(face[i],j))\n                    LSharp+=2*L;\n                else\n                {\n                    if (face[i].IsFaceEdgeS(j))\n                        LSharp+=L;\n                }\n            }\n        return (LSharp/2);\n    }\n\n    ScalarType Area()const\n    {\n        ScalarType CurrA=0;\n        for (size_t i=0;i<face.size();i++)\n            CurrA+=vcg::DoubleArea(face[i]);\n        return (CurrA/2);\n    }\n\n    ScalarType SignedVolume(const size_t &IndexF)const\n    {\n        return (face[IndexF].cP(0)*(face[IndexF].cP(1)^face[IndexF].cP(2))/6.0);\n    }\n\n    ScalarType Volume()const\n    {\n        ScalarType Vol;\n        for (size_t i=0;i<face.size();i++)\n            Vol+=SignedVolume(i);\n\n        return (fabs(Vol));\n    }\n\n    void SetFeatureValence()\n    {\n        vcg::tri::UpdateQuality<FieldTriMesh>::VertexConstant(*this,0);\n        for (size_t i=0;i<face.size();i++)\n            for (size_t j=0;j<3;j++)\n            {\n                if (!face[i].IsFaceEdgeS(j))continue;\n                face[i].V0(j)->Q()+=1;\n                face[i].V1(j)->Q()+=1;\n            }\n\n    }\n\n    void ErodeFeaturesStep()\n    {\n        SetFeatureValence();\n\n        for (size_t i=0;i<face.size();i++)\n            for (size_t j=0;j<3;j++)\n            {\n                if (!face[i].IsFaceEdgeS(j))continue;\n                if (vcg::face::IsBorder(face[i],j))continue;\n                ScalarType Len=(face[i].P0(j)-face[i].P1(j)).Norm();\n                if (Len>bbox.Diag()*0.05)continue;\n\n                if ((face[i].V0(j)->Q()==2)||(face[i].V1(j)->Q()==2))\n                    face[i].ClearFaceEdgeS(j);\n            }\n    }\n\n    void DilateFeaturesStep(std::vector<std::pair<size_t,size_t> > &OrigFeatures)\n    {\n        SetFeatureValence();\n\n        for (size_t i=0;i<OrigFeatures.size();i++)\n        {\n            size_t IndexF=OrigFeatures[i].first;\n            size_t IndexE=OrigFeatures[i].second;\n            if ((face[IndexF].V0(IndexE)->Q()==2)&&\n                    (!face[IndexF].V0(IndexE)->IsS()))\n                face[IndexF].SetFaceEdgeS(IndexE);\n\n            if ((face[IndexF].V1(IndexE)->Q()==2)&&\n                    (!face[IndexF].V1(IndexE)->IsS()))\n                face[IndexF].SetFaceEdgeS(IndexE);\n        }\n    }\n\n    void PrintSharpInfo()\n    {\n        vcg::tri::UpdateQuality<MeshType>::VertexConstant(*this,0);\n        for (size_t i=0;i<face.size();i++)\n            for (size_t j=0;j<3;j++)\n            {\n                if (!face[i].IsFaceEdgeS(j))continue;\n                if (!face[i].V0(j)->IsB())\n                    face[i].V0(j)->Q()+=1;\n                if (!face[i].V1(j)->IsB())\n                    face[i].V1(j)->Q()+=1;\n            }\n        size_t Valence1=0;\n        for (size_t i=0;i<vert.size();i++)\n            if (vert[i].Q()==2)Valence1++;\n        std::cout<<\"EndPoints \"<<Valence1<<std::endl;\n    }\n\n    void ErodeDilate(size_t StepNum)\n    {\n        vcg::tri::UpdateFlags<FieldTriMesh>::VertexClearS(*this);\n        SetFeatureValence();\n        for (size_t i=0;i<vert.size();i++)\n            if ((vert[i].Q()>4)||((vert[i].IsB())&&(vert[i].Q()>2)))\n                vert[i].SetS();\n\n        std::vector<std::pair<size_t,size_t> > OrigFeatures;\n\n        //save the features\n        for (size_t i=0;i<face.size();i++)\n            for (size_t j=0;j<3;j++)\n            {\n                if (!face[i].IsFaceEdgeS(j))continue;\n                OrigFeatures.push_back(std::pair<size_t,size_t>(i,j));\n            }\n\n        for (size_t s=0;s<StepNum;s++)\n            ErodeFeaturesStep();\n        for (size_t s=0;s<StepNum;s++)\n            DilateFeaturesStep(OrigFeatures);\n\n        PrintSharpInfo();\n    }\n\n    bool SufficientFeatures(ScalarType SharpFactor)\n    {\n        ScalarType sqrtCurrA=sqrt(Area());\n        ScalarType SharpL=SharpLenght();\n        std::cout<<\"Sqrt Area \"<<sqrtCurrA<<std::endl;\n        std::cout<<\"Sharp Lenght \"<<SharpL<<std::endl;\n        ScalarType Ratio=SharpL/sqrtCurrA;\n        std::cout<<\"Ratio \"<<Ratio<<std::endl;\n        return(Ratio>SharpFactor);\n    }\n\n    void SetSharp(FaceType &f,int IndexE)\n    {\n        f.SetFaceEdgeS(IndexE);\n        if (IsConcaveEdge(f,IndexE))\n            f.FKind[IndexE]=ETConcave;\n        else\n            f.FKind[IndexE]=ETConvex;\n\n        if (vcg::face::IsBorder(f,IndexE))return;\n\n        FieldTriMesh::FaceType *fopp=f.FFp(IndexE);\n        int eOpp=f.FFi(IndexE);\n\n        fopp->SetFaceEdgeS(eOpp);\n        fopp->FKind[eOpp]= f.FKind[IndexE];\n    }\n\n    void ClearSharp(FaceType &f,int IndexE)\n    {\n        f.ClearFaceEdgeS(IndexE);\n        f.FKind[IndexE]=ETNone;\n        if (vcg::face::IsBorder(f,IndexE))return;\n\n        FieldTriMesh::FaceType *fopp=f.FFp(IndexE);\n        int eOpp=f.FFi(IndexE);\n\n        fopp->ClearFaceEdgeS(eOpp);\n        fopp->FKind[eOpp]= ETNone;\n    }\n\n    void InitFaceOriginalIndex()\n    {\n        for (size_t i=0;i<face.size();i++)\n            face[i].IndexOriginal=i;\n    }\n};\n\n\n#endif\n"
  },
  {
    "path": "components/field_tracing/basic_setup.txt",
    "content": "Drift 100\nSrate 0.01\nSplitOnRem 1\nMaxVal 5\nCCability 1\nMatchVal 1\nAddNeed 1\nFinalRem 1\nForceSplit 0\nSubd 0\nMetaCollapse 1\n"
  },
  {
    "path": "components/field_tracing/field_tracing.pro",
    "content": "############################ PROJECT FILES ############################\n\ninclude(../../libs/libs.pri)\n\nHEADERS = \\\n    glwidget.h \\\n    mesh_type.h\n\nSOURCES = \\\n    glwidget.cpp \\\n    main.cpp\n\n# Compile glew\nDEFINES += GLEW_STATIC\nDEFINES += NO_PATCH_SIZING\n\n#Field tracer\nINCLUDEPATH += $$XFIELDTRACER_PATH\n\n############################ TARGET ############################\n\n#App config\nTARGET = field_tracing\n\nTEMPLATE = app\nCONFIG += qt\nCONFIG += c++11\nCONFIG -= app_bundle\n\nQT += core gui opengl xml widgets\n\n#Debug/release optimization flags\nCONFIG(debug, debug|release){\n    DEFINES += DEBUG\n}\nCONFIG(release, debug|release){\n    DEFINES -= DEBUG\n    #just uncomment next line if you want to ignore asserts and got a more optimized binary\n    CONFIG += FINAL_RELEASE\n}\n\n#Final release optimization flag\nFINAL_RELEASE {\n    unix:!macx{\n        QMAKE_CXXFLAGS_RELEASE -= -g -O2\n        QMAKE_CXXFLAGS += -O3 -DNDEBUG\n    }\n}\n\nmacx {\n    QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.13\n    QMAKE_MAC_SDK = macosx10.13\n}\n\n############################ INCLUDES ############################\n\n#vcglib\nINCLUDEPATH += $$VCGLIB_PATH\nSOURCES += $$VCGLIB_PATH/wrap/ply/plylib.cpp\nSOURCES += $$VCGLIB_PATH/wrap/gui/trackball.cpp\nSOURCES += $$VCGLIB_PATH/wrap/gui/trackmode.cpp\nSOURCES += $$VCGLIB_PATH/wrap/qt/anttweakbarMapperNew.cpp\n\n#eigen\nINCLUDEPATH += $$EIGEN_PATH\n\n#libigl\nINCLUDEPATH += $$LIBIGL_PATH/include\n\n#AntTweakBar\nINCLUDEPATH += $$ANTTWEAKBAR_PATH/include\nLIBS += -L$$ANTTWEAKBAR_PATH/lib -lAntTweakBar\nwin32{ # Awful problem with windows..\n    DEFINES += NOMINMAX\n}\n\n#glew\nunix:!mac{\n    LIBS += -lGLU\n}\nINCLUDEPATH += $$GLEW_PATH/include\nSOURCES += $$GLEW_PATH/src/glew.c\n\n# Mac specific Config required to avoid to make application bundles\nmacx{\n#    CONFIG -= app_bundle\n#    LIBS += $$ANTTWEAKBARPATH/lib/libAntTweakBar.dylib\n    QMAKE_POST_LINK +=\"cp -P ../../../code/lib/AntTweakBar1.16/lib/libAntTweakBar.dylib . ; \"\n    QMAKE_POST_LINK +=\"install_name_tool -change ../lib/libAntTweakBar.dylib ./libAntTweakBar.dylib $$TARGET ; \"\n#    QMAKE_POST_LINK +=\"install_name_tool -change libCoMISo.dylib $$COMISOPATH/build/Build/lib/CoMISo/libCoMISo.dylib $$TARGET ;\"\n    DEPENDPATH += .\n#    DEPENDPATH += $$COMISOPATH/build/Build/lib/CoMISo\n#    INCLUDEPATH += $$COMISOPATH/build/Build/lib/CoMISo\n}\n\n#Parallel computation\nunix:!mac {\n    QMAKE_CXXFLAGS += -fopenmp\n    LIBS += -fopenmp\n}\n#macx{\n#    QMAKE_CXXFLAGS += -Xpreprocessor -fopenmp -lomp -I/usr/local/include\n#    QMAKE_LFLAGS += -lomp\n#    LIBS += -L /usr/local/lib /usr/local/lib/libomp.dylib\n#}\n\nwin32{\n    DEFINES += NOMINMAX # Awful problem with windows..\n    DEFINES *= _USE_MATH_DEFINES\n    DEFINES *= _SCL_SECURE_NO_DEPRECATE\n    QMAKE_CXXFLAGS *= /bigobj\n}\n"
  },
  {
    "path": "components/field_tracing/glwidget.cpp",
    "content": "/***************************************************************************/\n/* Copyright(C) 2021\n\n\nThe authors of\n\nReliable Feature-Line Driven Quad-Remeshing\nSiggraph 2021\n\n\n All rights reserved.\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <https://www.gnu.org/licenses/>.\n****************************************************************************/\n\n#include \"glwidget.h\"\n#include <wrap/qt/trackball.h>\n#include <wrap/gl/picking.h>\n#include <wrap/gl/trimesh.h>\n#include <wrap/qt/anttweakbarMapper.h>\n#include <wrap/gl/gl_field.h>\n#include <QDir>\n#include \"tracing/GL_vert_field_graph.h\"\n#include \"tracing/patch_tracer.h\"\n#include \"tracing/tracer_interface.h\"\n#include \"tracing/GL_mesh_drawing.h\"\n#include \"tracing/GL_metamesh.h\"\n//#include <vcg/complex/algorithms/parametrization/local_para_smooth.h>\n\nTwBar *bar;\nchar * filename;/// filename of the mesh to load\nTraceMesh mesh,problematic_mesh;     /// the active mesh instance\nvcg::GlTrimesh<TraceMesh> glWrap;    /// the active mesh opengl wrapper\nvcg::GlTrimesh<TraceMesh> glWrapProblem;\nvcg::Trackball track;     /// the active manipulator\nGLW::DrawMode drawmode=GLW::DMFlatWire;     /// the current drawmode\n\nstd::string pathM,pathF,pathS,pathOF,pathProject;\n\n//bool to_pick=false;\n//int xMouse,yMouse;\n\nbool drawSharpF=true;\nbool drawSing=true;\nbool drawField=true;\nbool drawPaths=true;\nbool drawPathNodes=false;\nbool drawTwins=false;\n\nbool drawConcaveEmitters=false;\nbool drawConcaveReceivers=false;\nbool drawFlatEmitters=false;\nbool drawFlatReceivers=false;\nbool drawNarrowEmitters=false;\nbool drawNarrowReceivers=false;\nbool drawInvalidated=false;\nbool drawUnsatisfied=false;\nbool drawCorners=false;\nbool drawChoosenEmitters=false;\nbool drawChoosenReceivers=false;\nbool drawMetaMesh=false;\nbool drawNarrowCandidates=false;\n\n//bool splitted=false;\nbool save_setup=false;\nbool save_csv=false;\n\nbool batch_process=false;\nbool has_features=false;\nbool has_original_faces=false;\nbool add_only_needed=false;\nbool meta_mesh_collapse=true;\n//bool interleave_removal=true;\n//bool interleave_smooth=false;\nbool final_removal=true;\nbool force_split=false;\nbool drawProblematicsOnly=false;\nint CurrNum=0;\nint VisTraces=-1;\n\nbool subdivide_when_save=false;\n\nstd::vector<size_t> ConcaveEmittersNode,ConcaveReceiversNode,\nFlatEmittersNode,FlatReceiversNode,\nNarrowEmittersNode,NarrowReceiversNode,\nProblematicNodes,UnsatisfiedNodes,\nChoosenEmittersNode,ChoosenReceiversNode,\nTraceableFlatNode;\n\nVertexFieldGraph<TraceMesh> VGraph(mesh);\nGLVertGraph<TraceMesh> GLGraph(VGraph);\n\ntypedef PatchTracer<TraceMesh> TracerType;\nTracerType PTr(VGraph);\n\nstd::vector<std::vector<size_t> > CurrCandidates;\nstd::vector<bool> ChosenIsLoop;\nstd::vector<std::vector<size_t> > ChosenCandidates;\nstd::vector<bool> DiscardedIsLoop;\nstd::vector<std::vector<size_t> > DiscardedCandidates;\nstd::vector<typename TraceMesh::CoordType> PatchCornerPos;\nTraceMesh::ScalarType Drift=100;\n\nenum PatchColorMode{CMPatchNone, CMPatchCol, CMPatchValence,\n                    CMPatchTopo,CMPatchLengthDist,CMPatchLenghtVar,\n                    CMArapDistortion,CMCClarkability,CMExpValence};\n\nPatchColorMode CurrPatchMode=CMPatchNone;\nPatchColorMode OldPatchMode=CMPatchNone;\n\n//float BatchSample=-1;\n//float BatchDrift=-1;\n//int BatchSplit=-1;\n//int BatchIncreaseValRem=-1;\n//int BatchIrregularRem=-1;\n//float BatchDistortionL=-1;\n\n\nvoid SaveSetupFile(const std::string pathProject,\n                   const size_t CurrNum)\n{\n    std::string pathSetupFinal=pathProject;\n    pathSetupFinal=pathSetupFinal+\"_p\"+std::to_string(CurrNum)+\".setup\";\n\n    FILE *f=fopen(pathSetupFinal.c_str(),\"wt\");\n    assert(f!=NULL);\n\n    //    fprintf(f,\"Srate %f\\n\",PTr.sample_ratio);\n    //    fprintf(f,\"Drift %f\\n\",Drift);\n\n    //    if (PTr.split_on_removal)\n    //        fprintf(f,\"Split 1\\n\");\n    //    else\n    //        fprintf(f,\"Split 0\\n\");\n\n\n    //    FILE *f=fopen(path.c_str(),\"rt\");\n    //    assert(f!=NULL);\n\n    //    float Driftf;\n    //    fscanf(f,\"Drift %f\\n\",&Driftf);\n    //    Drift=(TraceMesh::ScalarType)Driftf;\n    //    std::cout<<\"DRIFT \"<<Drift<<std::endl;\n    fprintf(f,\"Drift %f\\n\",Drift);\n\n    //    float SRatef;\n    //    fscanf(f,\"Srate %f\\n\",&SRatef);\n    //    PTr.sample_ratio=(TraceMesh::ScalarType)SRatef;\n    //    std::cout<<\"SAMPLE RATE \"<<PTr.sample_ratio<<std::endl;\n    fprintf(f,\"Srate %f\\n\",PTr.sample_ratio);\n\n    //    int IntVar=0;\n    //    fscanf(f,\"SplitOnRem %d\\n\",&IntVar);\n    //    std::cout<<\"SPLIT \"<<IntVar<<std::endl;\n    //    if (IntVar==0)\n    //        PTr.split_on_removal=false;\n    //    else\n    //        PTr.split_on_removal=true;\n\n    if (PTr.split_on_removal)\n        fprintf(f,\"SplitOnRem 1\\n\");\n    else\n        fprintf(f,\"SplitOnRem 0\\n\");\n\n    //fscanf(f,\"MaxVal %d\\n\",&PTr.MaxVal);\n    fprintf(f,\"MaxVal %d\\n\",PTr.MaxVal);\n    //std::cout<<\"INCREASE VAL \"<<PTr.MaxVal<<std::endl;\n\n    //    float CCbility;\n    //    fscanf(f,\"CCability %f\\n\",&CCbility);\n    //    PTr.CClarkability=(TraceMesh::ScalarType)CCbility;\n    //    std::cout<<\"CCABILITY \"<<PTr.CClarkability<<std::endl;\n    fprintf(f,\"CCability %f\\n\",PTr.CClarkability);\n\n    //    fscanf(f,\"MatchVal %d\\n\",&IntVar);\n    //    std::cout<<\"MATCH VAL \"<<IntVar<<std::endl;\n    //    if (IntVar==0)\n    //        PTr.match_valence=false;\n    //    else\n    //        PTr.match_valence=true;\n    if (PTr.match_valence)\n        fprintf(f,\"MatchVal 1\\n\");\n    else\n        fprintf(f,\"MatchVal 0\\n\");\n\n    //    fscanf(f,\"AddNeed %d\\n\",&IntVar);\n    //    std::cout<<\"ADD NEED \"<<IntVar<<std::endl;\n    //    if (IntVar==0)\n    //        add_only_needed=false;\n    //    else\n    //        add_only_needed=true;\n    if (add_only_needed)\n        fprintf(f,\"AddNeed 1\\n\");\n    else\n        fprintf(f,\"AddNeed 0\\n\");\n\n    //    fscanf(f,\"InterleaveRem %d\\n\",&IntVar);\n    //    std::cout<<\"INTERLEAVE REMOVE \"<<IntVar<<std::endl;\n    //    if (IntVar==0)\n    //        interleave_removal=false;\n    //    else\n    //        interleave_removal=true;\n    //    if (interleave_removal)\n    //        fprintf(f,\"InterleaveRem 1\\n\");\n    //    else\n    //        fprintf(f,\"InterleaveRem 0\\n\");\n\n    //    fscanf(f,\"InterleaveSmooth %d\\n\",&IntVar);\n    //    std::cout<<\"INTERLEAVE SMOOTH \"<<IntVar<<std::endl;\n    //    if (IntVar==0)\n    //        interleave_smooth=false;\n    //    else\n    //        interleave_smooth=true;\n    //    if (interleave_smooth)\n    //        fprintf(f,\"InterleaveSmooth 1\\n\");\n    //    else\n    //        fprintf(f,\"InterleaveSmooth 0\\n\");\n\n    //    fscanf(f,\"FinalRem %d\\n\",&IntVar);\n    //    std::cout<<\"FINAL REMOVE \"<<IntVar<<std::endl;\n    //    if (IntVar==0)\n    //        final_removal=false;\n    //    else\n    //        final_removal=true;\n    if (final_removal)\n        fprintf(f,\"FinalRem 1\\n\");\n    else\n        fprintf(f,\"FinalRem 0\\n\");\n\n\n    if (force_split)\n        fprintf(f,\"Force Split 1\\n\");\n    else\n        fprintf(f,\"Force Split 0\\n\");\n\n    if (subdivide_when_save)\n        fprintf(f,\"Subd 1\\n\");\n    else\n        fprintf(f,\"Subd 0\\n\");\n\n    if (meta_mesh_collapse)\n        fprintf(f,\"MetaCollapse 1\\n\");\n    else\n        fprintf(f,\"MetaCollapse 0\\n\");\n\n    //    if (PTr.avoid_increase_valence)\n    //        fprintf(f,\"IncreaseValRem 1\\n\");\n    //    else\n    //        fprintf(f,\"IncreaseValRem 0\\n\");\n\n    //    if (PTr.avoid_collapse_irregular)\n    //        fprintf(f,\"IrregularRem 1\\n\");\n    //    else\n    //        fprintf(f,\"IrregularRem 0\\n\");\n\n    //fprintf(f,\"DistortionL %f\\n\",PTr.max_lenght_distortion);\n\n    fclose(f);\n}\n\n\n\n\n\nvoid LoadSetupFile(std::string path)\n{\n    FILE *f=fopen(path.c_str(),\"rt\");\n    assert(f!=NULL);\n\n    float Driftf;\n    fscanf(f,\"Drift %f\\n\",&Driftf);\n    Drift=(TraceMesh::ScalarType)Driftf;\n    std::cout<<\"DRIFT \"<<Drift<<std::endl;\n\n    float SRatef;\n    fscanf(f,\"Srate %f\\n\",&SRatef);\n    PTr.sample_ratio=(TraceMesh::ScalarType)SRatef;\n    std::cout<<\"SAMPLE RATE \"<<PTr.sample_ratio<<std::endl;\n\n    int IntVar=0;\n    fscanf(f,\"SplitOnRem %d\\n\",&IntVar);\n    std::cout<<\"SPLIT \"<<IntVar<<std::endl;\n    if (IntVar==0)\n        PTr.split_on_removal=false;\n    else\n        PTr.split_on_removal=true;\n\n    fscanf(f,\"MaxVal %d\\n\",&PTr.MaxVal);\n    std::cout<<\"INCREASE VAL \"<<PTr.MaxVal<<std::endl;\n\n    float CCbility;\n    fscanf(f,\"CCability %f\\n\",&CCbility);\n    PTr.CClarkability=(TraceMesh::ScalarType)CCbility;\n    std::cout<<\"CCABILITY \"<<PTr.CClarkability<<std::endl;\n\n    fscanf(f,\"MatchVal %d\\n\",&IntVar);\n    std::cout<<\"MATCH VAL \"<<IntVar<<std::endl;\n    if (IntVar==0)\n        PTr.match_valence=false;\n    else\n        PTr.match_valence=true;\n\n    fscanf(f,\"AddNeed %d\\n\",&IntVar);\n    std::cout<<\"ADD NEED \"<<IntVar<<std::endl;\n    if (IntVar==0)\n        add_only_needed=false;\n    else\n        add_only_needed=true;\n\n    //    fscanf(f,\"InterleaveRem %d\\n\",&IntVar);\n    //    std::cout<<\"INTERLEAVE REMOVE \"<<IntVar<<std::endl;\n    //    if (IntVar==0)\n    //        interleave_removal=false;\n    //    else\n    //        interleave_removal=true;\n\n    //    fscanf(f,\"InterleaveSmooth %d\\n\",&IntVar);\n    //    std::cout<<\"INTERLEAVE SMOOTH \"<<IntVar<<std::endl;\n    //    if (IntVar==0)\n    //        interleave_smooth=false;\n    //    else\n    //        interleave_smooth=true;\n\n    fscanf(f,\"FinalRem %d\\n\",&IntVar);\n    std::cout<<\"FINAL REMOVE \"<<IntVar<<std::endl;\n    if (IntVar==0)\n        final_removal=false;\n    else\n        final_removal=true;\n\n\n    fscanf(f,\"ForceSplit %d\\n\",&IntVar);\n    std::cout<<\"FORCE SPLIT \"<<IntVar<<std::endl;\n    if (IntVar==0)\n        force_split=false;\n    else\n        force_split=true;\n\n    fscanf(f,\"Subd %d\\n\",&IntVar);\n    std::cout<<\"SUBDIVIDE WHEN SAVE \"<<IntVar<<std::endl;\n    if (IntVar==0)\n        subdivide_when_save=false;\n    else\n        subdivide_when_save=true;\n\n    fscanf(f,\"MetaCollapse %d\\n\",&IntVar);\n    std::cout<<\"META COLLAPSE \"<<IntVar<<std::endl;\n    if (IntVar==0)\n        meta_mesh_collapse=false;\n    else\n        meta_mesh_collapse=true;\n\n    //    if ((batch_process)&&(BatchSample>0))\n    //        PTr.sample_ratio=BatchSample;\n\n    //    if ((batch_process)&&(BatchDrift>0))\n    //        Drift=BatchDrift;\n\n    //    if ((batch_process)&&(BatchSplit==0))\n    //        PTr.split_on_removal=false;\n\n    //    if ((batch_process)&&(BatchSplit==1))\n    //        PTr.split_on_removal=true;\n}\n\nvoid FindCurrentNum()\n{\n    std::string BasePath=pathProject;\n    BasePath.resize(BasePath.find_last_of(\"/\")+1);\n    BasePath=\"./\"+BasePath;\n    //std::cout<<\"basepath \"<<BasePath.c_str()<<std::endl;\n    QDir directory(BasePath.c_str());\n\n    QFile f(pathM.c_str());\n    QFileInfo fileInfo(f.fileName());\n    QString filename(fileInfo.fileName());\n    std::string NameFile=filename.toStdString();\n    //std::cout<<\"namefile \"<<NameFile.c_str()<<std::endl;\n    NameFile.resize(NameFile.find_last_of(\".\"));\n    std::string Filter=NameFile+\"_p*.obj\";\n    //std::cout<<\"filter \"<<Filter.c_str()<<std::endl;\n\n    //    TestPath+=\"*.obj\";\n    QStringList projectFiles = directory.entryList(QStringList() <<Filter.c_str(),QDir::Files);\n    CurrNum=0;\n\n    foreach(QString filename, projectFiles) {\n        int Num;\n        std::string TestScan=NameFile+\"_p%d.obj\";\n        sscanf (filename.toStdString().c_str(),TestScan.c_str(),&Num);\n        CurrNum=std::max(CurrNum,(Num+1));\n        //        std::cout<<\"test \"<<Num<<std::endl;\n        //        std::cout<<\"test \"<<filename.toStdString().c_str()<<std::endl;\n        //do whatever you need to do\n    }\n}\n\n\nvoid UpdatePatchColor()\n{\n    if (CurrPatchMode==CMPatchNone)\n        vcg::tri::UpdateColor<TraceMesh>::PerFaceConstant(mesh,vcg::Color4b(192,192,192,255));\n    if (CurrPatchMode==CMPatchCol)\n        PTr.ColorByPartitions();\n    //PTr.ColorByPatchQuality();\n    if (CurrPatchMode==CMPatchValence)\n        PTr.ColorByValence();\n    if (CurrPatchMode==CMPatchTopo)\n        PTr.ColorByTopology();\n    if (CurrPatchMode==CMPatchLenghtVar)\n        PTr.ColorByLenghtVariance();\n    if (CurrPatchMode==CMPatchLengthDist)\n        PTr.ColorByLenghtDistortion();\n    if (CurrPatchMode==CMArapDistortion)\n        PTr.ColorByArapDistortion();\n    if (CurrPatchMode==CMCClarkability)\n        PTr.ColorByCClarkability();\n    if (CurrPatchMode==CMExpValence)\n        PTr.ColorByExpValence();\n}\n\nvoid UpdateVisualNodes()\n{\n\n    CurrCandidates.clear();\n    PTr.GetCurrCandidates(CurrCandidates);\n\n    ChosenCandidates.clear();\n    PTr.GetCurrChosen(ChosenCandidates);\n\n    DiscardedCandidates.clear();\n    PTr.GetCurrDiscarded(DiscardedCandidates);\n\n    ChosenIsLoop.clear();\n    PTr.GetCurrChosenIsLoop(ChosenIsLoop);\n\n    DiscardedIsLoop.clear();\n    PTr.GetCurrDiscardedIsLoop(DiscardedIsLoop);\n    //return;\n\n    //PTr.GetConcaveEmitters(ConcaveEmittersNode);\n    PTr.GetActiveEmittersType(TVConcave,ConcaveEmittersNode);\n\n    //PTr.GetConcaveReceivers(ConcaveReceiversNode);\n    PTr.GetActiveReceiversType(TVConcave,ConcaveReceiversNode);\n\n    //PTr.GetFlatEmitters(FlatEmittersNode);\n    PTr.GetActiveEmittersType(TVFlat,FlatEmittersNode);\n\n    //PTr.GetFlatReceivers(FlatReceiversNode);\n    PTr.GetActiveReceiversType(TVFlat,FlatReceiversNode);\n\n    //PTr.GetNarrowActiveEmitters(NarrowEmittersNode);\n    PTr.GetActiveEmittersType(TVNarrow,NarrowEmittersNode);\n\n    //PTr.GetNarrowActiveReceivers(NarrowReceiversNode);\n    PTr.GetActiveReceiversType(TVNarrow,NarrowReceiversNode);\n\n    //PTr.GetChoosenEmitters(ChoosenEmittersNode);\n    PTr.GetActiveEmittersType(TVChoosen,ChoosenEmittersNode);\n\n    //PTr.GetChoosenReceivers(ChoosenReceiversNode);\n    PTr.GetActiveReceiversType(TVChoosen,ChoosenReceiversNode);\n\n    PTr.GetUnsatisfied(UnsatisfiedNodes);\n\n    PTr.GetVisualCornersPos(PatchCornerPos);\n\n    PTr.GetTraceableFlatNodes(TraceableFlatNode);\n\n    PTr.GetUnsolvedMesh(problematic_mesh);\n}\n\nvoid InitStructures()\n{\n    ConcaveEmittersNode.clear();\n    ConcaveReceiversNode.clear();\n    FlatEmittersNode.clear();\n    FlatReceiversNode.clear();\n    NarrowEmittersNode.clear();\n    NarrowReceiversNode.clear();\n    UnsatisfiedNodes.clear();\n\n    //    std::string origfaceP=pathProject;\n    //    origfaceP=featureCorners+\"_p\"+std::to_string(CurrNum)+\"_origf.txt\";\n    //    mesh.SaveOrigFace(\"test0face.txt\");\n    PreProcessMesh(mesh);\n    //    mesh.SaveOrigFace(\"test1face.txt\");\n    //    exit(0);\n    VGraph.InitGraph(false);//SingPos);\n\n    GLGraph.InitDisplacedPos();\n\n    PTr.InitTracer(Drift,false);\n\n    //std::cout<<\"Here\"<<std::endl;\n    UpdateVisualNodes();\n}\n\n//void TW_CALL SmoothParam(void *)\n//{\n//    vcg::tri::Local_Param_Smooth<TraceMesh>::Smooth(mesh);\n//}\n\nvoid TW_CALL InitGraph(void *)\n{\n    //    vcg::tri::Local_Param_Smooth<TraceMesh>::SmoothStep(mesh,0.5);\n    InitStructures();\n\n    drawField=false;\n    drawSharpF=false;\n    drawSing=false;\n}\n\n//void TW_CALL TestInit(void *)\n//{\n//    PTr.sample_ratio=0.001;\n//    PTr.CClarkability=-1;\n//    //PTr.\n//    PatchGeneralParameters::MinSamples()=1;\n//    InitStructures();\n//    PTr.DebugMsg=true;\n//    PTr.TraceLoops(false);\n//    PTr.UpdatePartitionsFromChoosen();\n//    PTr.ColorByPartitions();\n//    PTr.SmoothPatches();\n//    UpdateVisualNodes();\n//    drawField=false;\n//    drawSharpF=true;\n//    drawSing=true;\n//}\n\nvoid TW_CALL JoinNarrow(void *)\n{\n    PTr.JoinNarrowStep();\n    PTr.UpdatePartitionsFromChoosen();\n    PTr.ColorByPartitions();\n    UpdateVisualNodes();\n}\n\nvoid TW_CALL JoinConcave(void *)\n{\n    PTr.JoinConcaveStep();\n    PTr.UpdatePartitionsFromChoosen();\n    PTr.ColorByPartitions();\n    UpdateVisualNodes();\n}\n\nvoid TW_CALL AddLoops(void *)\n{\n    PTr.TraceLoops(false);\n    PTr.UpdatePartitionsFromChoosen();\n    PTr.ColorByPartitions();\n    UpdateVisualNodes();\n}\n\nvoid TW_CALL TraceBorder(void *)\n{\n    PTr.JoinBoundaries(false);\n    PTr.UpdatePartitionsFromChoosen();\n    PTr.ColorByPartitions();\n    UpdateVisualNodes();\n}\n\nvoid TW_CALL SmoothPathes(void *)\n{\n    PTr.SmoothPatches();\n    PTr.GetVisualCornersPos(PatchCornerPos);\n}\n\n//void TW_CALL RemoveIteration(void *)\n//{\n\n\n////    PTr.SetAllRemovable();\n////    PTr.match_valence=false;\n////    PTr.AllowDarts=false;\n////    PTr.DebugMsg=false;\n////    PTr.AllowSelfGluedPatch=true;\n////    PTr.MinVal=0;\n////    PTr.CheckQuadrangulationLimits=false;\n////    //PTr.SingleRemoveStep(true);\n////    while(PTr.SingleRemoveStep(false)){}\n\n//    //PTr.MergeContiguousPaths();\n//    //PTr.ColorByPartitions();\n\n//    InitStructures();\n\n//    //RecursiveProcessForTexturing(PTr,Drift, add_only_needed,final_removal,true,meta_mesh_collapse,force_split);\n\n//    RecursiveProcessForTexturingWithDarts(PTr,Drift, add_only_needed,final_removal,true,meta_mesh_collapse,force_split);\n\n\n////    PTr.SetAllRemovable();\n////    PTr.AllowDarts=true;\n////    PTr.AllowSelfGluedPatch=true;\n////    PTr.MinVal=0;\n////    PTr.split_on_removal=true;\n////    PTr.match_valence=false;\n////    PTr.CheckQuadrangulationLimits=false;\n\n////    //PTr.SplitIntoIntervals();\n\n////    PTr.BatchRemovalOnMesh(true);\n\n//    PTr.MergeContiguousPaths();\n\n//    PTr.ColorByPartitions();\n\n//    CurrPatchMode=CMPatchCol;\n//    drawField=false;\n//    drawSharpF=false;\n//    drawSing=false;\n//    UpdateVisualNodes();\n//}\n\nvoid TW_CALL BatchProcess(void *)\n{\n    InitStructures();\n\n    //PTr.BatchProcess();\n    PTr.BatchAddLoops(false,false,false,false);//,false,true);//,false);\n    PTr.UpdatePartitionsFromChoosen();\n    PTr.ColorByPartitions();\n    CurrPatchMode=CMPatchCol;\n\n    drawField=false;\n    drawSharpF=false;\n    drawSing=false;\n\n    UpdateVisualNodes();\n}\n\nvoid TW_CALL RecursiveProcess(void *)\n{\n    InitStructures();\n    //RecursiveProcess<TraceMesh>(PTr,Drift);\n    RecursiveProcess<TracerType>(PTr,Drift, add_only_needed,final_removal,true,meta_mesh_collapse,force_split);//,interleave_smooth);\n    CurrPatchMode=CMPatchCol;\n    drawField=false;\n    drawSharpF=false;\n    drawSing=false;\n    UpdateVisualNodes();\n}\n\nvoid TW_CALL ParametrizePatches(void *)\n{\n    PTr.ComputePatchesUV();\n}\n\nvoid TW_CALL SubdividePatches(void *)\n{\n    PTr.SubdivideIrrPatches();\n    PTr.GetVisualCornersPos(PatchCornerPos);\n    CurrPatchMode=CMPatchCol;\n\n    CurrCandidates.clear();\n    ChosenCandidates.clear();\n    ChosenIsLoop.clear();\n}\n\nvoid TW_CALL BatchRemoval(void *)\n{\n    PTr.SetAllRemovable();\n\n    if (meta_mesh_collapse)\n        PTr.BatchRemovalMetaMesh();\n    else\n        PTr.BatchRemovalOnMesh();\n\n    PTr.UpdatePartitionsFromChoosen(true);\n    PTr.ColorByPartitions();\n\n    CurrPatchMode=CMPatchCol;\n    drawField=false;\n    drawSharpF=false;\n    drawSing=false;\n    UpdateVisualNodes();\n    PTr.GetVisualCornersPos(PatchCornerPos);\n}\n\nvoid LoadAll()\n{\n    printf(\"Loading the mesh \\n\");\n    bool loadedMesh=mesh.LoadMesh(pathM);\n    mesh.UpdateAttributes();\n    if (!loadedMesh)\n    {\n        std::cout<<\"*** ERROR LOADING MESH ***\"<<std::endl;\n        exit(0);\n    }\n    std::cout<<\"Loaded \"<<mesh.fn<<\" faces and \"<<mesh.vn<<\" edges\"<<std::endl;\n\n    //FIELD LOAD\n    bool loadedField=mesh.LoadField(pathF);\n    if (!loadedField){\n        std::cout<<\"*** ERROR LOADING FIELD ***\"<<std::endl;\n        exit(0);\n    }\n\n    if (has_original_faces)\n    {\n        bool loadedOrigF=mesh.LoadOrigFaces(pathOF);\n\n        if (!loadedOrigF){\n            std::cout<<\"*** ERROR LOADING ORIGINAL FACES ***\"<<std::endl;\n            exit(0);\n        }\n    }\n\n    if (has_features){\n        bool loadedFeatures=mesh.LoadSharpFeatures(pathS);\n        if (!loadedFeatures){\n            std::cout<<\"*** ERROR LOADING FEATURES ***\"<<std::endl;\n            exit(0);\n        }\n    }\n\n    mesh.SolveGeometricIssues();\n    mesh.UpdateSharpFeaturesFromSelection();\n}\n\nvoid Reload()\n{\n    drawSing=true;\n    drawField=true;\n    drawPaths=false;\n    LoadAll();\n    CurrPatchMode=CMPatchNone;\n}\n\nvoid TW_CALL ReloadAll(void *)\n{\n    Reload();\n}\n\n\nstd::vector<size_t> Emitter,Receiver,Disabled;\n\nbool testDrawEmitter=false;\nbool testdrawReceiver=false;\nbool testdrawDisables=false;\n\n\nvoid TW_CALL TestNarrowNarrow(void *)\n{\n    PTr.TestGetNodes(TVNarrow,\n                     TVNarrow,\n                     TraceDirect,\n                     Emitter,Receiver,Disabled);\n}\n\nvoid TW_CALL TestNarrowConcave(void *)\n{\n    PTr.TestGetNodes(TVNarrow,\n                     TVConcave,\n                     TraceDirect,\n                     Emitter,Receiver,Disabled);\n}\n\nvoid TW_CALL TestNarrowFlat(void *)\n{\n    PTr.TestGetNodes(TVNarrow,\n                     TVFlat,\n                     TraceDirect,\n                     Emitter,Receiver,Disabled);\n}\n\nvoid TW_CALL TestConcaveConcave(void *)\n{\n    PTr.TestGetNodes(TVConcave,\n                     TVConcave,\n                     TraceDirect,\n                     Emitter,Receiver,Disabled);\n}\n\nvoid TW_CALL TestConcaveFlat(void *)\n{\n    PTr.TestGetNodes(TVConcave,\n                     TVFlat,\n                     TraceDirect,\n                     Emitter,Receiver,Disabled);\n}\n\nvoid TW_CALL TestFlatFlat(void *)\n{\n    PTr.TestGetNodes(TVFlat,\n                     TVFlat,\n                     TraceDirect,\n                     Emitter,Receiver,Disabled);\n}\n\n\nvoid TW_CALL TestLoops(void *)\n{\n    PTr.TestGetNodes(TVInternal,\n                     TVInternal,\n                     TraceLoop,\n                     Emitter,Receiver,Disabled);\n}\n\n//void TW_CALL SplitSupPatches(void *)\n//{\n//    PTr.SplitIntoSubPaths();\n//    PTr.InitMetaMesh();\n//    PTr.GetCurrCandidates(CurrCandidates);\n\n//    ChosenCandidates.clear();\n//    PTr.GetCurrChosen(ChosenCandidates);\n\n//    ChosenIsLoop.clear();\n//    PTr.GetCurrChosenIsLoop(ChosenIsLoop);\n\n//    PTr.GetUnsatisfied(UnsatisfiedNodes);\n\n//    PTr.GetVisualCornersPos(PatchCornerPos);\n//}\n\n//void TW_CALL SplitInIntervals(void *)\n//{\n//    PTr.SplitIntoIntervals();\n//    UpdateVisualNodes();\n////    PTr.InitMetaMesh();\n////    PTr.GetCurrCandidates(CurrCandidates);\n\n////    ChosenCandidates.clear();\n////    PTr.GetCurrChosen(ChosenCandidates);\n\n////    ChosenIsLoop.clear();\n////    PTr.GetCurrChosenIsLoop(ChosenIsLoop);\n\n////    PTr.GetUnsatisfied(UnsatisfiedNodes);\n\n////    PTr.GetVisualCornersPos(PatchCornerPos);\n//}\n\nvoid TW_CALL SaveData(void *)\n{\n    SaveAllData(PTr,pathProject,CurrNum,subdivide_when_save,has_original_faces);\n    SaveCSV(PTr,pathProject,CurrNum);\n}\n\nvoid  ProcessAllBatch()\n{\n    std::cout<<\"TEST BATCH\"<<std::endl;\n\n    InitStructures();\n    //std::cout<<\"DE BOIA 4:\"<<PTr.EDirTable.ConvexV.size()<<std::endl;\n\n    //RecursiveProcess<TraceMesh>(PTr,Drift, add_only_needed,final_removal,);//,interleave_smooth);\n    RecursiveProcess<TracerType>(PTr,Drift, add_only_needed,final_removal,true,meta_mesh_collapse,force_split);\n    //RecursiveProcess<TraceMesh>(PTr,Drift,true,true,true);\n    CurrPatchMode=CMPatchCol;\n    //    PTr.BatchRemoval();\n    //    PTr.FixValences();\n    CurrPatchMode=CMPatchCol;\n    drawField=false;\n    drawSharpF=false;\n    drawSing=false;\n    UpdateVisualNodes();\n    PTr.SmoothPatches();\n    SaveAllData(PTr,pathProject,CurrNum,subdivide_when_save,has_original_faces);\n\n    if (save_csv)\n        SaveCSV(PTr,pathProject,CurrNum);\n\n    if (save_setup)\n        SaveSetupFile(pathProject,CurrNum);\n}\n\nvoid TW_CALL AllProcess(void *)\n{\n    ProcessAllBatch();\n}\n\nvoid InitLoopBar(QWidget *w)\n{\n    (void)w;\n    bar = TwNewBar(\"LoopTool\");\n    TwDefine(\"LoopTool size='700 1500' \");\n    TwDefine(\"LoopTool position='40 40' \");\n\n    TwCopyCDStringToClientFunc (CopyCDStringToClient);\n\n\n    TwAddButton(bar,\"Reload All\",ReloadAll,0,\" label='Reload All' \");\n\n    TwEnumVal drawmodes[4] = { {GLW::DMSmooth, \"Smooth\"}, {GLW::DMPoints, \"Per Points\"},{GLW::DMFlatWire, \"FlatWire\"},{GLW::DMFlat, \"Flat\"}};\n    // Create a type for the enum shapeEV\n    TwType drawMode = TwDefineEnum(\"DrawMode\", drawmodes, 4);\n    TwAddVarRW(bar, \"Draw Mode\", drawMode, &drawmode, \" keyIncr='<' keyDecr='>' help='Change draw mode.' \");\n\n    TwEnumVal patchcolmodes[9] = { {CMPatchNone, \"None\"}, {CMPatchCol, \"Per Patch\"},\n                                   {CMPatchValence, \"Valence\"},{CMPatchTopo, \"Topology\"},\n                                   {CMPatchLengthDist,\"Length Dist\"},{CMPatchLenghtVar,\"Length Var\"},\n                                   {CMArapDistortion,\"Arap Dist\"},{CMCClarkability,\"Catmull Clarkability\"},\n                                   {CMExpValence,\"Expected Valence\"}\n                                 };\n    // Create a type for the enum shapeEV\n    TwType patchColMode = TwDefineEnum(\"PatchColMode\", patchcolmodes, 9);\n    TwAddVarRW(bar, \"Patch Col Mode\", patchColMode, &CurrPatchMode, \" keyIncr='<' keyDecr='>' help='Change col mode.' \");\n\n\n    TwAddSeparator(bar,NULL,NULL);\n\n    TwAddVarRW(bar,\"DrawSharpF\",TW_TYPE_BOOLCPP,&drawSharpF,\"label='Draw Sharp Features'\");\n    TwAddVarRW(bar,\"DrawSing\",TW_TYPE_BOOLCPP,&drawSing,\"label='Draw Singularities'\");\n    TwAddVarRW(bar,\"DrawField\",TW_TYPE_BOOLCPP,&drawField,\"label='Draw Field'\");\n\n    TwAddSeparator(bar,NULL,NULL);\n    TwAddVarRW(bar,\"DrawTwins\",TW_TYPE_BOOLCPP,&drawTwins,\"label='Draw Twins'\");\n\n    TwAddVarRW(bar,\"DrawNarrowEmit\",TW_TYPE_BOOLCPP,&drawNarrowEmitters,\"label='Draw Narrow Emitters'\");\n    TwAddVarRW(bar,\"DrawNarrowReceive\",TW_TYPE_BOOLCPP,&drawNarrowReceivers,\"label='Draw Narrow Receivers'\");\n\n\n    TwAddVarRW(bar,\"DrawPaths\",TW_TYPE_BOOLCPP,&drawPaths,\"label='Draw Paths'\");\n    TwAddVarRW(bar,\"DrawPathNodes\",TW_TYPE_BOOLCPP,&drawPathNodes,\"label='Draw Path Nodes'\");\n\n    TwAddVarRW(bar,\"DrawConcaveEmit\",TW_TYPE_BOOLCPP,&drawConcaveEmitters,\"label='Draw Concave Emitters'\");\n    TwAddVarRW(bar,\"DrawConcaveReceive\",TW_TYPE_BOOLCPP,&drawConcaveReceivers,\"label='Draw Concave Receivers'\");\n\n    TwAddVarRW(bar,\"DrawFlatEmit\",TW_TYPE_BOOLCPP,&drawFlatEmitters,\"label='Draw Flat Emitters'\");\n    TwAddVarRW(bar,\"DrawFlatReceive\",TW_TYPE_BOOLCPP,&drawFlatReceivers,\"label='Draw Flat Receivers'\");\n\n    TwAddVarRW(bar,\"DrawChoosenEmit\",TW_TYPE_BOOLCPP,&drawChoosenEmitters,\"label='Draw Choosen Emitters'\");\n    TwAddVarRW(bar,\"DrawChoosenReceive\",TW_TYPE_BOOLCPP,&drawChoosenReceivers,\"label='Draw Choosen Receivers'\");\n\n    TwAddVarRW(bar,\"DrawInvalidated\",TW_TYPE_BOOLCPP,&drawInvalidated,\"label='Draw Invalidated'\");\n\n    TwAddVarRW(bar,\"DrawUnsatisfied\",TW_TYPE_BOOLCPP,&drawUnsatisfied,\"label='Draw Unsatisfied'\");\n\n    TwAddVarRW(bar,\"DrawCorners\",TW_TYPE_BOOLCPP,&drawCorners,\"label='Draw Corners'\");\n\n    TwAddVarRW(bar,\"DrawMetamesh\",TW_TYPE_BOOLCPP,&drawMetaMesh,\"label='Draw MetaMesh'\");\n\n    TwAddVarRW(bar,\"DrawProblematics\",TW_TYPE_BOOLCPP,&drawProblematicsOnly,\"label='Draw Problematic'\");\n\n    TwAddVarRW(bar,\"VIsTraces\",TW_TYPE_INT32,&VisTraces,\"label='Visualize Until'\");\n\n\n    TwAddSeparator(bar,NULL,NULL);\n\n    TwAddVarRW(bar,\"Drift\",TW_TYPE_DOUBLE,&Drift,\"label='Drift'\");\n    TwAddButton(bar,\"InitGraph\",InitGraph,0,\" label='Init Graph' \");\n    TwAddButton(bar,\"JoinNarrow\",JoinNarrow,0,\" label='Trace Narrow' \");\n    TwAddButton(bar,\"JoinConcave\",JoinConcave,0,\" label='Trace Concave' \");\n    TwAddButton(bar,\"TraceLoops\",AddLoops,0,\" label='Trace Loops' \");\n    TwAddButton(bar,\"TraceBorders\",TraceBorder,0,\" label='Trace Borders' \");\n    TwAddButton(bar,\"BatchProcess\",BatchProcess,0,\" label='Batch Process' \");\n    //TwAddButton(bar,\"Split\",SplitSupPatches,0,\" label='Split sub' \");\n    TwAddButton(bar,\"BatchRemoval\",BatchRemoval,0,\" label='Batch Removal' \");\n    TwAddButton(bar,\"SmoothPaths\",SmoothPathes,0,\" label='Smooth Paths' \");\n    //TwAddButton(bar,\"SmoothParam\",SmoothParam,0,\" label='Smooth Param' \");\n\n\n    TwAddSeparator(bar,NULL,NULL);\n\n    TwAddVarRW(bar,\"Sample Ratio\",TW_TYPE_DOUBLE,&PTr.sample_ratio,\"label='Sample Ratio'\");\n\n\n\n    TwAddVarRW(bar,\"SplitOnRemove\",TW_TYPE_BOOLCPP,&PTr.split_on_removal,\"label='Split on Remove'\");\n    TwAddVarRW(bar,\"MaxValence\",TW_TYPE_INT32,&PTr.MaxVal,\"label='Max Valence'\");\n    TwAddVarRW(bar,\"CCLarkability\",TW_TYPE_DOUBLE,&PTr.CClarkability,\"label='CCLarkability'\");\n    TwAddVarRW(bar,\"ConcaveNeed\",TW_TYPE_INT32,&PTr.Concave_Need,\"label='Concave Need'\");\n    //TwAddVarRW(bar,\"MaxValence\",TW_TYPE_INT32,&PTr.MaxVal,\"label='Max Valence'\");\n    TwAddVarRW(bar,\"MatchVal\",TW_TYPE_BOOLCPP,&PTr.match_valence,\"label='Match Valence'\");\n    TwAddVarRW(bar,\"AddNeed\",TW_TYPE_BOOLCPP,&add_only_needed,\"label='Add Only need'\");\n    TwAddVarRW(bar,\"MetaMeshColl\",TW_TYPE_BOOLCPP,&meta_mesh_collapse,\"label='Meta Mesh Collapse'\");\n\n    //TwAddVarRW(bar,\"InterRem\",TW_TYPE_BOOLCPP,&interleave_removal,\"label='Interleave removal'\");\n    //TwAddVarRW(bar,\"InterSmth\",TW_TYPE_BOOLCPP,&interleave_smooth,\"label='Interleave smooth'\");\n    TwAddVarRW(bar,\"FinalRem\",TW_TYPE_BOOLCPP,&final_removal,\"label='Final removal'\");\n    TwAddVarRW(bar,\"ForceSplit\",TW_TYPE_BOOLCPP,&force_split,\"label='Force split'\");\n    TwAddButton(bar,\"RecursiveProcess\",RecursiveProcess,0,\" label='Recursive Process' \");\n    TwAddButton(bar,\"Subdivide\",SubdividePatches,0,\" label='Subdivide Patches' \");\n\n  //    TwAddSeparator(bar,NULL,NULL);\n\n    TwAddButton(bar,\"Subdivide\",SubdividePatches,0,\" label='Subdivide Patches' \");\n//    TwAddButton(bar,\"ParametrizePatches\",ParametrizePatches,0,\" label='Parametrize Patches' \");\n\n\n    //TwAddSeparator(bar,NULL,NULL);\n\n    //TwAddButton(bar,\"TestInit\",TestInit,0,\" label='TestInit' \");\n    //TwAddButton(bar,\"Split\",SplitSupPatches,0,\" label='Split sub' \");\n    //TwAddButton(bar,\"Split Int\",SplitInIntervals,0,\" label='Split in intervals' \");\n    //TwAddButton(bar,\"OneStepRem\",RemoveIteration,0,\" label='Remove Ite step' \");\n    TwAddButton(bar,\"ParametrizePatches\",ParametrizePatches,0,\" label='Parametrize Patches' \");\n\n\n    TwAddSeparator(bar,NULL,NULL);\n\n    TwAddVarRW(bar,\"SubdSave\",TW_TYPE_BOOLCPP,&subdivide_when_save,\"label='Subdivide When Save'\");\n    TwAddButton(bar,\"SaveData\",SaveData,0,\" label='Save Data' \");\n\n\n    TwAddSeparator(bar,NULL,NULL);\n\n    TwAddButton(bar,\"AllProcess\",AllProcess,0,\" label='All Process' \");\n\n}\n\nvoid InitBar(QWidget *w)\n{\n    InitLoopBar(w);\n}\n\n\nGLWidget::GLWidget(QWidget *parent)\n    : QGLWidget(QGLFormat(QGL::SampleBuffers), parent)\n{\n    filename=0;\n    //hasToPick=false;\n    InitBar(this);\n    //LoadSetup();\n    LoadSetupFile(std::string(\"basic_setup.txt\"));\n    FindCurrentNum();\n    LoadAll();\n    if (batch_process)\n    {\n        ProcessAllBatch();\n        exit(0);\n    }\n}\n\nvoid GLWidget::initializeGL ()\n{\n    //    FieldParam.alpha_curv=0.2;\n    //    FieldParam.curvRing=4;\n    glewInit();\n    glClearColor(0, 0, 0, 0);\n    glEnable(GL_LIGHTING);\n    glEnable(GL_LIGHT0);\n    glEnable(GL_NORMALIZE);\n    glEnable(GL_COLOR_MATERIAL);\n    glEnable(GL_CULL_FACE);\n    glEnable(GL_DEPTH_TEST);\n}\n\nvoid GLWidget::resizeGL (int w, int h)\n{\n    glViewport (0, 0, (GLsizei) w, (GLsizei) h);\n    TwWindowSize(w, h);\n    initializeGL();\n}\n\nvoid GLWidget::paintGL ()\n{\n\n    if (CurrPatchMode!=OldPatchMode)\n    {\n        UpdatePatchColor();\n        OldPatchMode=CurrPatchMode;\n    }\n\n    glClearColor(255,255,255,255);\n    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n    glMatrixMode(GL_PROJECTION);\n    glLoadIdentity();\n    gluPerspective(40, GLWidget::width()/(float)GLWidget::height(), 0.1, 100);\n    glMatrixMode(GL_MODELVIEW);\n    glLoadIdentity();\n    gluLookAt(0,0,3.5f,   0,0,0,   0,1,0);\n    track.center=vcg::Point3f(0, 0, 0);\n    track.radius= 1;\n    track.GetView();\n    glPushMatrix();\n    track.Apply();\n    //glPushMatrix();\n    glWrap.m = &mesh;\n    glWrapProblem.m=&problematic_mesh;\n    if(mesh.vert.size()>0)\n    {\n        vcg::glScale(2.0f/mesh.bbox.Diag());\n        glTranslate(-mesh.bbox.Center());\n\n        vcg::glColor(vcg::Color4b(220,220,220,255));\n        //glWrap.Draw(GLW::DrawMode(drawmode),GLW::CMNone,GLW::TMNone);\n\n        if (!drawProblematicsOnly)\n            glWrap.Draw(GLW::DrawMode(drawmode),GLW::CMPerFace,GLW::TMNone);\n        else\n        {\n            glWrap.Draw(GLW::DMWire,GLW::CMNone,GLW::TMNone);\n            glWrapProblem.Draw(GLW::DrawMode(drawmode),GLW::CMPerFace,GLW::TMNone);\n        }\n\n        if (drawField)\n        {\n            if (!drawProblematicsOnly)\n                vcg::GLField<TraceMesh>::GLDrawFaceField(mesh,false,false,0.005);\n            else\n                vcg::GLField<TraceMesh>::GLDrawFaceField(problematic_mesh,false,false,0.005);\n        }\n\n        if (drawSing)\n        {\n            if (!drawProblematicsOnly)\n                vcg::GLField<TraceMesh>::GLDrawSingularity(mesh);\n            else\n                vcg::GLField<TraceMesh>::GLDrawFaceField(problematic_mesh,false,false,0.005);\n        }\n\n        if (drawTwins)\n            GLGraph.GLDrawTwinsConnections();\n        if (drawConcaveEmitters)\n            GLGraph.GLDrawNodes(ConcaveEmittersNode,mesh.bbox.Diag()*0.005);\n        if (drawConcaveReceivers)\n            GLGraph.GLDrawNodes(ConcaveReceiversNode,mesh.bbox.Diag()*0.005);\n        if (drawFlatEmitters)\n            GLGraph.GLDrawNodes(FlatEmittersNode,mesh.bbox.Diag()*0.005,false,10,true);\n        if (drawChoosenEmitters)\n            GLGraph.GLDrawNodes(ChoosenEmittersNode,mesh.bbox.Diag()*0.005);\n        if (drawFlatReceivers)\n            GLGraph.GLDrawNodes(FlatReceiversNode,mesh.bbox.Diag()*0.005);\n        if (drawNarrowEmitters)\n            GLGraph.GLDrawNodes(NarrowEmittersNode,mesh.bbox.Diag()*0.005);\n        if (drawNarrowReceivers)\n            GLGraph.GLDrawNodes(NarrowReceiversNode,mesh.bbox.Diag()*0.005);\n        if (drawChoosenReceivers)\n            GLGraph.GLDrawNodes(ChoosenReceiversNode,mesh.bbox.Diag()*0.005);\n\n        if (drawInvalidated)\n            GLGraph.GLDrawNonActiveNodes(mesh.bbox.Diag()*0.001);\n        if (drawSharpF)\n            MeshDrawing<TraceMesh>::GLDrawSharpEdges(mesh);\n            //mesh.GLDrawSharpEdges();\n        if (drawUnsatisfied)\n            GLGraph.GLDrawNodes(UnsatisfiedNodes,mesh.bbox.Diag()*0.001,true,30);\n\n        if (testDrawEmitter)\n            GLGraph.GLDrawNodes(Emitter,mesh.bbox.Diag()*0.002);\n        if (testdrawReceiver)\n            GLGraph.GLDrawNodes(Receiver,mesh.bbox.Diag()*0.002);\n        if (testdrawDisables)\n            GLGraph.GLDrawNodes(Disabled,mesh.bbox.Diag()*0.002);\n\n\n        if (drawCorners)\n            GLGraph.GLDrawPoints(PatchCornerPos,10,vcg::Color4b(255,0,255,255));\n\n        if (drawPaths)\n            GLGraph.GLDrawPaths(ChosenCandidates,ChosenIsLoop,mesh.bbox.Diag()*0.01,drawPathNodes,VisTraces);//,true);\n\n        //GLGraph.GLDrawPaths(DiscardedCandidates,DiscardedIsLoop,mesh.bbox.Diag()*0.01,true);\n        //GLGraph.GLDrawNodes(TraceableFlatNode,mesh.bbox.Diag()*0.002);\n\n        if (drawMetaMesh)\n            GLMetaMesh<TraceMesh>::GLDraw(PTr.MMesh);\n            //PTr.GLDraweMetaMesh();\n        //GLGraph.GLDrawSingNodes(mesh.bbox.Diag()*0.002);\n    }\n\n    glPopMatrix();\n\n    TwDraw();\n}\n\nvoid GLWidget::keyReleaseEvent (QKeyEvent * e)\n{\n    e->ignore ();\n    if (e->key () == Qt::Key_Control)  track.ButtonUp (QT2VCG (Qt::NoButton, Qt::ControlModifier));\n    if (e->key () == Qt::Key_Shift)  track.ButtonUp (QT2VCG (Qt::NoButton, Qt::ShiftModifier));\n    if (e->key () == Qt::Key_Alt) track.ButtonUp (QT2VCG (Qt::NoButton, Qt::AltModifier));\n    updateGL ();\n}\n\n\nvoid GLWidget::keyPressEvent (QKeyEvent * e)\n{\n    e->ignore ();\n    if (e->key () == Qt::Key_Control) track.ButtonDown (QT2VCG (Qt::NoButton, Qt::ControlModifier));\n    if (e->key () == Qt::Key_Shift)  track.ButtonDown (QT2VCG (Qt::NoButton, Qt::ShiftModifier));\n    if (e->key () == Qt::Key_Alt)  track.ButtonDown (QT2VCG (Qt::NoButton, Qt::AltModifier));\n\n    TwKeyPressQt(e);\n    updateGL ();\n}\n\nvoid GLWidget::mousePressEvent (QMouseEvent * e)\n{\n    if(!TwMousePressQt(this,e))\n    {\n        e->accept ();\n        setFocus ();\n        track.MouseDown(QT2VCG_X(this, e), QT2VCG_Y(this, e), QT2VCG (e->button (), e->modifiers ()));\n    }\n    updateGL ();\n}\n\nvoid GLWidget::mouseMoveEvent (QMouseEvent * e)\n{\n    if (e->buttons ()) {\n        track.MouseMove(QT2VCG_X(this, e), QT2VCG_Y(this, e));\n        updateGL ();\n    }\n    TwMouseMotion(QTLogicalToDevice(this, e->x()), QTLogicalToDevice(this, e->y()));\n}\n\nvoid GLWidget::mouseDoubleClickEvent (QMouseEvent * e)\n{\n    (void)e;\n    updateGL();\n}\n\n\nvoid GLWidget::mouseReleaseEvent (QMouseEvent * e)\n{\n    track.MouseUp(QT2VCG_X(this, e), QT2VCG_Y(this, e), QT2VCG(e->button (), e->modifiers ()));\n    TwMouseReleaseQt(this,e);\n    updateGL ();\n}\n\nvoid GLWidget::wheelEvent (QWheelEvent * e)\n{\n    const int WHEEL_STEP = 120;\n    track.MouseWheel (e->delta () / float (WHEEL_STEP), QTWheel2VCG (e->modifiers ()));\n    updateGL ();\n}\n"
  },
  {
    "path": "components/field_tracing/glwidget.h",
    "content": "/***************************************************************************/\n/* Copyright(C) 2021\n\n\nThe authors of\n\nReliable Feature-Line Driven Quad-Remeshing\nSiggraph 2021\n\n\n All rights reserved.\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <https://www.gnu.org/licenses/>.\n****************************************************************************/\n\n#ifndef GLWIDGET_H\n#define GLWIDGET_H\n\n#include <GL/glew.h>\n#include <QGLWidget>\n#include <QKeyEvent>\n\n/// vcg imports\n#include \"tracing/mesh_type.h\"\n\n#include <wrap/gui/trackball.h>\n\n/// declaring edge and face type\n#include <AntTweakBar.h>\n\nvoid ProcessAllBatch();\n\nclass GLWidget : public QGLWidget\n{\n    Q_OBJECT\n\npublic:\n    GLWidget(QWidget *parent = 0);\n     bool hasToPick;\n     Point2i pointToPick;\n    ~GLWidget() {};\n\n    QSize sizeHint() const {\n      return QSize(1600, 1200);\n  };\n\nprotected:\n    void initializeGL();\n    void paintGL();\n    void resizeGL(int width, int height);\n    void mousePressEvent(QMouseEvent *event);\n    void mouseReleaseEvent(QMouseEvent *event);\n    void mouseMoveEvent(QMouseEvent *event);\n    void mouseDoubleClickEvent ( QMouseEvent * event );\n    void keyPressEvent(QKeyEvent *event);\n    void keyReleaseEvent(QKeyEvent *event);\n    void wheelEvent(QWheelEvent *event);\n};\n\n#endif\n"
  },
  {
    "path": "components/field_tracing/main.cpp",
    "content": "/***************************************************************************/\n/* Copyright(C) 2021\n\n\nThe authors of\n\nReliable Feature-Line Driven Quad-Remeshing\nSiggraph 2021\n\n\n All rights reserved.\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <https://www.gnu.org/licenses/>.\n****************************************************************************/\n\n#include <QApplication>\n#include <QDesktopWidget>\n#include <wrap/qt/anttweakbarMapper.h>\n#include \"glwidget.h\"\n#include <QWindow>\n#include <QFileInfo>\n\n#include <clocale>\n\nextern TraceMesh mesh;\nextern std::string pathM;\nextern std::string pathF;\nextern std::string pathS;\nextern std::string pathOF;\nextern std::string pathProject;\n\nextern bool has_features;\nextern bool has_original_faces;\nextern bool batch_process;\n\n//extern float BatchSample;\n//extern float BatchDrift;\n//extern int BatchSplit;\n//extern int BatchIncreaseValRem;\n//extern int BatchIrregularRem;\n//extern float BatchDistortionL;\n\nint main(int argc, char *argv[])\n{\n    QApplication app(argc, argv);\n\n    //Use \".\" as decimal separator\n    std::setlocale(LC_NUMERIC, \"en_US.UTF-8\");\n\n    QWindow dummy;\n    QString def_string = QString(\"GLOBAL fontscaling=%1\").arg((int)dummy.devicePixelRatio());\n    TwDefine(def_string.toStdString().c_str());\n    printf(\"%s\\n\",qPrintable(def_string));\n    fflush(stdout);\n\n    // Set functions to handle string copy\n    TwCopyCDStringToClientFunc(CopyCDStringToClient);\n    TwCopyStdStringToClientFunc(CopyStdStringToClient);\n\n    if( !TwInit(TW_OPENGL, NULL) )\n    {\n        fprintf(stderr, \"AntTweakBar initialization failed: %s\\n\", TwGetLastError());\n        return 1;\n    }\n\n    //PARAMETERS CHECK\n    if(argc<2)\n    {\n        printf(\"error: pass mesh name as parameter \\n\");\n        fflush(stdout);\n        exit(0);\n    }\n\n    //MESH LOAD\n    pathM=std::string(argv[1]);\n    QString pathMQ=QString(pathM.c_str());\n    QFileInfo f_infoM(pathMQ);\n    if (!f_infoM.exists())\n    {\n        std::cout<<\"error: mesh fileneme wrong\"<<std::endl;\n        fflush(stdout);\n        exit(0);\n    }\n    else\n        std::cout<<\"Mesh file correct\"<<std::endl;\n\n    pathProject=pathM;\n    pathProject.erase(pathProject.find_last_of(\".\"));\n\n    //FIELD LOAD\n\n    pathF=pathProject;\n    pathF.append(\".rosy\");\n\n    QString pathFQ=QString(pathF.c_str());\n    QFileInfo f_infoF(pathFQ);\n    if (!f_infoF.exists())\n    {\n        printf(\"error: field fileneme wrong\\n\");\n        fflush(stdout);\n        exit(0);\n    }\n    else\n        std::cout<<\"Field file correct\"<<std::endl;\n\n    pathS=pathProject;\n    pathS.append(\".sharp\");\n    QString pathSQ=QString(pathS.c_str());\n    QFileInfo f_infoS(pathSQ);\n    if (!f_infoS.exists())\n    {\n        printf(\"no feature line \\n\");\n        has_features=false;\n        fflush(stdout);\n        //exit(0);\n    }\n    else\n    {\n       has_features=true;\n       std::cout<<\"Sharp file correct\"<<std::endl;\n    }\n\n\n    batch_process=false;\n    if (argc>=3)\n    {\n        //then check if it mush batch process\n        std::string pathComm;\n        pathComm=std::string(argv[2]);\n        if (pathComm==std::string(\"batch\"))batch_process=true;\n        if (batch_process)\n        {\n            std::cout<<\"*** BATCH PROCESSING ***\"<<std::endl;\n            std::cout<<\"* DATASET \"<<pathM.c_str()<<\" *\"<<std::endl;\n        }\n    }\n\n\n    pathOF=pathProject;\n    pathOF.append(\"_origf.txt\");\n\n    QString pathOFQ=QString(pathOF.c_str());\n    QFileInfo f_infoOF(pathOFQ);\n    if (!f_infoOF.exists())\n    {\n        has_original_faces=false;\n        printf(\"NO Original faces\\n\");\n        fflush(stdout);\n    }\n    else\n    {\n        has_original_faces=true;\n        std::cout<<\"Original faces correct\"<<std::endl;\n    }\n\n//    if ((batch_process)&&(argc>=4))\n//        BatchSample=atof(argv[3]);\n\n//    if ((batch_process)&&(argc>=5))\n//        BatchDrift=atof(argv[4]);\n\n//    if ((batch_process)&&(argc>=6))\n//        BatchSplit=atoi(argv[5]);\n\n//    if ((batch_process)&&(argc>=7))\n//        BatchIncreaseValRem=atoi(argv[6]);\n\n//    if ((batch_process)&&(argc>=8))\n//        BatchIrregularRem=atoi(argv[7]);\n\n//    if ((batch_process)&&(argc>=9))\n//        BatchDistortionL=atof(argv[8]);\n\n    GLWidget window;\n    window.show();\n    return app.exec();\n}\n"
  },
  {
    "path": "components/field_tracing/moc_glwidget.cpp",
    "content": "/****************************************************************************\n** Meta object code from reading C++ file 'glwidget.h'\n**\n** Created by: The Qt Meta Object Compiler version 67 (Qt 5.3.2)\n**\n** WARNING! All changes made in this file will be lost!\n*****************************************************************************/\n\n#include \"glwidget.h\"\n#include <QtCore/qbytearray.h>\n#include <QtCore/qmetatype.h>\n#if !defined(Q_MOC_OUTPUT_REVISION)\n#error \"The header file 'glwidget.h' doesn't include <QObject>.\"\n#elif Q_MOC_OUTPUT_REVISION != 67\n#error \"This file was generated using the moc from 5.3.2. It\"\n#error \"cannot be used with the include files from this version of Qt.\"\n#error \"(The moc has changed too much.)\"\n#endif\n\nQT_BEGIN_MOC_NAMESPACE\nstruct qt_meta_stringdata_GLWidget_t {\n    QByteArrayData data[1];\n    char stringdata[9];\n};\n#define QT_MOC_LITERAL(idx, ofs, len) \\\n    Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \\\n    qptrdiff(offsetof(qt_meta_stringdata_GLWidget_t, stringdata) + ofs \\\n        - idx * sizeof(QByteArrayData)) \\\n    )\nstatic const qt_meta_stringdata_GLWidget_t qt_meta_stringdata_GLWidget = {\n    {\nQT_MOC_LITERAL(0, 0, 8)\n    },\n    \"GLWidget\"\n};\n#undef QT_MOC_LITERAL\n\nstatic const uint qt_meta_data_GLWidget[] = {\n\n // content:\n       7,       // revision\n       0,       // classname\n       0,    0, // classinfo\n       0,    0, // methods\n       0,    0, // properties\n       0,    0, // enums/sets\n       0,    0, // constructors\n       0,       // flags\n       0,       // signalCount\n\n       0        // eod\n};\n\nvoid GLWidget::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)\n{\n    Q_UNUSED(_o);\n    Q_UNUSED(_id);\n    Q_UNUSED(_c);\n    Q_UNUSED(_a);\n}\n\nconst QMetaObject GLWidget::staticMetaObject = {\n    { &QGLWidget::staticMetaObject, qt_meta_stringdata_GLWidget.data,\n      qt_meta_data_GLWidget,  qt_static_metacall, 0, 0}\n};\n\n\nconst QMetaObject *GLWidget::metaObject() const\n{\n    return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject;\n}\n\nvoid *GLWidget::qt_metacast(const char *_clname)\n{\n    if (!_clname) return 0;\n    if (!strcmp(_clname, qt_meta_stringdata_GLWidget.stringdata))\n        return static_cast<void*>(const_cast< GLWidget*>(this));\n    return QGLWidget::qt_metacast(_clname);\n}\n\nint GLWidget::qt_metacall(QMetaObject::Call _c, int _id, void **_a)\n{\n    _id = QGLWidget::qt_metacall(_c, _id, _a);\n    if (_id < 0)\n        return _id;\n    return _id;\n}\nQT_END_MOC_NAMESPACE\n"
  },
  {
    "path": "components/field_tracing/trace_field_300_mechanical.command",
    "content": "#!/bin/bash\n\nfor i in ../../test/300/Mechanical/*.obj; do\n\n\n    complete_file=\"${i}\"\n    only_file_name=$(basename $complete_file)\n    dir_name=\"${complete_file%.*}\"\n    dir_name+=\"/\"\n\n\n    new_filename=\"${dir_name}\"\"${only_file_name}\"\n    new_filename2=$(echo $new_filename | sed 's/\\(.*\\)\\..*/\\1/')\n     new_filename2=\"$new_filename2\"\"_rem.obj\"\n    echo \"$new_filename2\"\n\n    ./field_tracing \"${new_filename2}\" batch\ndone\n"
  },
  {
    "path": "components/field_tracing/trace_field_300_organic.command",
    "content": "#!/bin/bash\n\nfor i in ../../test/300/Organic/*.obj; do\n\n\n    complete_file=\"${i}\"\n    only_file_name=$(basename $complete_file)\n    dir_name=\"${complete_file%.*}\"\n    dir_name+=\"/\"\n\n\n    new_filename=\"${dir_name}\"\"${only_file_name}\"\n    new_filename2=$(echo $new_filename | sed 's/\\(.*\\)\\..*/\\1/')\n     new_filename2=\"$new_filename2\"\"_rem.obj\"\n    echo \"$new_filename2\"\n\n    ./field_tracing \"${new_filename2}\" batch\ndone\n"
  },
  {
    "path": "components/quad_from_patches/basic_setup.txt",
    "content": "alpha 0.02\nilpMethod 1\ntimeLimit 200\ngapLimit 0.0\ncallbackTimeLimit 8 3.00 5.000 10.0 20.0 30.0 60.0 90.0 120.0\ncallbackGapLimit 8 0.005 0.02 0.05 0.10 0.15 0.20 0.25 0.3\nminimumGap 0.4\nisometry 1\nregularityQuadrilaterals 1\nregularityNonQuadrilaterals 1\nregularityNonQuadrilateralsWeight 0.9\nalignSingularities 1\nalignSingularitiesWeight 0.1\nrepeatLosingConstraintsIterations 1\nrepeatLosingConstraintsQuads 0\nrepeatLosingConstraintsNonQuads 0\nrepeatLosingConstraintsAlign 1\nhardParityConstraint 1\nscaleFact 1\nfixedChartClusters 300\n"
  },
  {
    "path": "components/quad_from_patches/configuration.pri",
    "content": "############################ CONFIGURATION ############################\n\n#DEFINES += QUADRETOPOLOGY_DEBUG_SAVE_MESHES\n#DEFINES += ASSERT_FOR_NUMBER_SIDES\n#DEFINES += GUROBI_NON_VERBOSE\n#DEFINES += NDEBUG\n"
  },
  {
    "path": "components/quad_from_patches/field_smoother.h",
    "content": "/****************************************************************************\n* VCGLib                                                            o o     *\n* Visual and Computer Graphics Library                            o     o   *\n*                                                                _   O  _   *\n* Copyright(C) 2014                                                \\/)\\/    *\n* Visual Computing Lab                                            /\\/|      *\n* ISTI - Italian National Research Council                           |      *\n*                                                                    \\      *\n* All rights reserved.                                                      *\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 2 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 (http://www.gnu.org/licenses/gpl.txt)          *\n* for more details.                                                         *\n*                                                                           *\n****************************************************************************/\n\n#ifndef FIELD_SMOOTHER_H\n#define FIELD_SMOOTHER_H\n\n//eigen stuff\n#include <Eigen/Sparse>\n\n//vcg stuff\n#include <vcg/complex/algorithms/update/color.h>\n#include <vcg/complex/algorithms/update/quality.h>\n#include <vcg/complex/algorithms/parametrization/tangent_field_operators.h>\n#include <vcg/complex/algorithms/mesh_to_matrix.h>\n\n//igl related stuff\n\n#include <libiglfields/n_polyvector.h>\n#include <igl/principal_curvature.h>\n#include <igl/igl_inline.h>\n\n#ifdef COMISO_FIELD\n#include <igl/copyleft/comiso/nrosy.h>\n#endif\n\nnamespace vcg {\nnamespace tri {\n\nenum SmoothMethod{SMMiq,SMNPoly};\n\ntemplate <class MeshType>\nclass FieldSmoother\n{\n    typedef typename MeshType::FaceType FaceType;\n    typedef typename MeshType::VertexType VertexType;\n    typedef typename MeshType::ScalarType ScalarType;\n    typedef typename MeshType::CoordType CoordType;\n\n\n    static void InitQualityByAnisotropyDir(MeshType &mesh)\n    {\n        std::vector<ScalarType> QVal;\n        for (size_t i=0;i<mesh.vert.size();i++)\n        {\n            ScalarType N1=fabs(mesh.vert[i].K1());\n            ScalarType N2=fabs(mesh.vert[i].K2());\n            QVal.push_back(N1);\n            QVal.push_back(N2);\n        }\n\n        std::sort(QVal.begin(),QVal.end());\n        int percUp=int(floor(QVal.size()*0.95+0.5));\n        ScalarType trimUp=QVal[percUp];\n\n        for (size_t i=0;i<mesh.vert.size();i++)\n        {\n            ScalarType N1=(mesh.vert[i].K1());\n            ScalarType N2=(mesh.vert[i].K2());\n\n           ScalarType NMax=std::max(N1,N2)/trimUp;\n           ScalarType NMin=std::min(N1,N2)/trimUp;\n\n           if (NMax>1)NMax=1;\n           if (NMax<-1)NMax=-1;\n\n           if (NMin>1)NMin=1;\n           if (NMin<-1)NMin=-1;\n\n           ScalarType CurvAni=(NMax-NMin)/2;\n           mesh.vert[i].Q()=CurvAni;\n        }\n        vcg::tri::UpdateQuality<MeshType>::FaceFromVertex(mesh);\n    }\n\n    static void SetEdgeDirection(FaceType *f,int edge)\n    {\n        CoordType dir=f->P0(edge)-f->P1(edge);\n        dir.Normalize();\n        ScalarType prod1=fabs(dir*f->PD1());\n        ScalarType prod2=fabs(dir*f->PD2());\n        if (prod1>prod2)\n        {\n            f->PD1()=dir;\n            f->PD2()=f->N()^dir;\n        }else\n        {\n            f->PD2()=dir;\n            f->PD1()=f->N()^dir;\n        }\n    }\n\n    static void AddSharpEdgesConstraints(MeshType & mesh,\n                                         const ScalarType &thr=0.2)\n    {\n        for (size_t i=0;i<mesh.face.size();i++)\n            for (int j=0;j<mesh.face[i].VN();j++)\n            {\n                FaceType *f0=&mesh.face[i];\n                FaceType *f1=f0->FFp(j);\n                if (f0==f1)continue;\n                CoordType N0=f0->N();\n                CoordType N1=f1->N();\n                if ((N0*N1)>thr)continue;\n                SetEdgeDirection(f0,j);\n                f0->SetS();\n            }\n    }\n\n    static void AddBorderConstraints(MeshType & mesh)\n    {\n        for (size_t i=0;i<mesh.face.size();i++)\n            for (int j=0;j<mesh.face[i].VN();j++)\n            {\n                FaceType *f0=&mesh.face[i];\n                FaceType *f1=f0->FFp(j);\n                assert(f1!=NULL);\n                if (f0!=f1)continue;\n                SetEdgeDirection(f0,j);\n                f0->SetS();\n            }\n    }\n\n    static void AddCurvatureConstraints(MeshType & mesh,const ScalarType &thr=0.5)\n    {\n        for (size_t i=0;i<mesh.face.size();i++)\n            if (mesh.face[i].Q()>thr)mesh.face[i].SetS();\n    }\n\n    //hard constraints have selected face\n    static void CollectHardConstraints( MeshType & mesh,\n                                    Eigen::VectorXi &HardI,\n                                    Eigen::MatrixXd &HardD,\n                                    SmoothMethod SMethod,\n                                    int Ndir)\n    {\n        //count number of hard constraints\n        int numS=vcg::tri::UpdateSelection<MeshType>::FaceCount(mesh);\n        HardI=Eigen::MatrixXi(numS,1);\n        if ((Ndir==2)||(SMethod==SMMiq))\n            HardD=Eigen::MatrixXd(numS,3);\n        else\n            HardD=Eigen::MatrixXd(numS,6);\n        //then update them\n        int curr_index=0;\n        for (size_t i=0;i<mesh.face.size();i++)\n        {\n            if (!mesh.face[i].IsS())continue;\n\n            CoordType dir=mesh.face[i].PD1();\n            dir.Normalize();\n\n            HardI(curr_index,0)=i;\n\n            HardD(curr_index,0)=dir.X();\n            HardD(curr_index,1)=dir.Y();\n            HardD(curr_index,2)=dir.Z();\n            if ((Ndir==4)&&(SMethod==SMNPoly))\n            {\n                dir=mesh.face[i].PD2();\n                HardD(curr_index,3)=dir.X();\n                HardD(curr_index,4)=dir.Y();\n                HardD(curr_index,5)=dir.Z();\n            }\n            curr_index++;\n\n        }\n\n    }\n\n    //hard constraints have selected face\n    static void CollectSoftConstraints( MeshType & mesh,\n                                        Eigen::VectorXi &SoftI,\n                                        Eigen::MatrixXd &SoftD,\n                                        Eigen::VectorXd &SoftW)\n    {\n        //count number of soft constraints\n        int numS=vcg::tri::UpdateSelection<MeshType>::FaceCount(mesh);\n        numS=mesh.fn-numS;\n        //allocate eigen matrix\n        SoftI=Eigen::MatrixXi(numS,1);\n        SoftD=Eigen::MatrixXd(numS,3);\n        SoftW=Eigen::MatrixXd(numS,1);\n\n        //then update them\n        int curr_index=0;\n        for (size_t i=0;i<mesh.face.size();i++)\n        {\n            if (mesh.face[i].IsS())continue;\n\n            CoordType dir=mesh.face[i].PD1();\n            dir.Normalize();\n\n            SoftI(curr_index,0)=i;\n\n            SoftD(curr_index,0)=dir.X();\n            SoftD(curr_index,1)=dir.Y();\n            SoftD(curr_index,2)=dir.Z();\n\n            SoftW(curr_index,0)=mesh.face[i].Q();\n\n            curr_index++;\n\n        }\n    }\n\n    static void SmoothMIQ(MeshType &mesh,\n                          Eigen::VectorXi &HardI,   //hard constraints index\n                          Eigen::MatrixXd &HardD,   //hard directions\n                          Eigen::VectorXi &SoftI,   //soft constraints\n                          Eigen::MatrixXd &SoftD,   //weight of soft constraints\n                          Eigen::VectorXd &SoftW,   //soft directions\n                          ScalarType alpha_soft,\n                          int Ndir)\n    {\n#ifdef COMISO_FIELD\n        assert((Ndir==2)||(Ndir==4));\n        Eigen::MatrixXi F;\n        Eigen::MatrixXd V;\n\n        MeshToMatrix<MeshType>::GetTriMeshData(mesh,F,V);\n\n        Eigen::MatrixXd output_field;\n        Eigen::VectorXd output_sing;\n\n        igl::copyleft::comiso::nrosy(V,F,HardI,HardD,SoftI,SoftW,SoftD,Ndir,alpha_soft,output_field,output_sing);\n\n        //finally update the principal directions\n        for (size_t i=0;i<mesh.face.size();i++)\n        {\n            CoordType dir1;\n            dir1[0]=output_field(i,0);\n            dir1[1]=output_field(i,1);\n            dir1[2]=output_field(i,2);\n\n            dir1.Normalize();\n            CoordType dir2=mesh.face[i].N()^dir1;\n            dir2.Normalize();\n\n            ScalarType Norm1=mesh.face[i].PD1().Norm();\n            ScalarType Norm2=mesh.face[i].PD2().Norm();\n\n            mesh.face[i].PD1()=dir1*Norm1;\n            mesh.face[i].PD2()=dir2*Norm2;\n        }\n#else\n        assert(0);\n#endif\n    }\n\n    static void SmoothNPoly(MeshType &mesh,\n                            Eigen::VectorXi &HardI,   //hard constraints index\n                            Eigen::MatrixXd &HardD,   //hard directions\n                            int Ndir)\n    {\n        assert((Ndir==2)||(Ndir==4));\n\n        Eigen::MatrixXi F;\n        Eigen::MatrixXd V;\n\n        MeshToMatrix<MeshType>::GetTriMeshData(mesh,F,V);\n\n        Eigen::MatrixXd output_field;\n        Eigen::VectorXd output_sing;\n\n        igl::n_polyvector(V,F,HardI,HardD,output_field);\n\n        //finally update the principal directions\n        for (size_t i=0;i<mesh.face.size();i++)\n        {\n            CoordType dir1;\n            dir1[0]=output_field(i,0);\n            dir1[1]=output_field(i,1);\n            dir1[2]=output_field(i,2);\n\n            dir1.Normalize();\n            CoordType dir2=mesh.face[i].N()^dir1;\n            dir2.Normalize();\n\n            ScalarType Norm1=mesh.face[i].PD1().Norm();\n            ScalarType Norm2=mesh.face[i].PD2().Norm();\n\n            mesh.face[i].PD1()=dir1*Norm1;\n            mesh.face[i].PD2()=dir2*Norm2;\n        }\n    }\n\n    static void PickRandomDir(MeshType &mesh,\n                              int &indexF,\n                              CoordType &Dir)\n    {\n        indexF=rand()%mesh.fn;\n        FaceType *currF=&mesh.face[indexF];\n        CoordType dirN=currF->N();\n        dirN.Normalize();\n        Dir=CoordType(1,0,0);\n        if (fabs(Dir*dirN)>0.9)\n            Dir=CoordType(0,1,0);\n        if (fabs(Dir*dirN)>0.9)\n            Dir=CoordType(0,0,1);\n\n        Dir=dirN^Dir;\n        Dir.Normalize();\n    }\n\npublic:\n\n    struct SmoothParam\n    {\n        //the 90° rotation independence while smoothing the direction field\n        int Ndir;\n        //the weight of curvature if doing the smoothing keeping the field close to the original one\n        ScalarType alpha_curv;\n        //align the field to border or not\n        bool align_borders;\n        //threshold to consider some edge as sharp feature and to use as hard constraint (0, not use)\n        ScalarType sharp_thr;\n        //threshold to consider some edge as high curvature anisotropyand to use as hard constraint (0, not use)\n        ScalarType curv_thr;\n        //the method used to smooth MIQ or \"Designing N-PolyVector Fields with Complex Polynomials\"\n        SmoothMethod SmoothM;\n        //the number of faces of the ring used ot esteem the curvature\n        int curvRing;\n        //this are additional hard constraints\n        std::vector<std::pair<int,CoordType> > AddConstr;\n\n        SmoothParam()\n        {\n            Ndir=4;\n            curvRing=2;\n            alpha_curv=0.0;\n            align_borders=false;\n            SmoothM=SMMiq;\n            sharp_thr=0.0;\n            curv_thr=0.4;\n        }\n\n    };\n\n    static void SelectConstraints(MeshType &mesh,SmoothParam &SParam)\n    {\n        //clear all selected faces\n        vcg::tri::UpdateFlags<MeshType>::FaceClear(mesh);\n\n        //add curvature hard constraints\n        //ScalarType Ratio=mesh.bbox.Diag()*0.01;\n\n        if (SParam.curv_thr>0)\n            AddCurvatureConstraints(mesh,SParam.curv_thr);///Ratio);\n\n         //add alignment to sharp features\n        if (SParam.sharp_thr>0)\n            AddSharpEdgesConstraints(mesh,SParam.sharp_thr);\n\n        //add border constraints\n        if (SParam.align_borders)\n            AddBorderConstraints(mesh);\n\n        //aff final constraints\n        for (size_t i=0;i<SParam.AddConstr.size();i++)\n        {\n            int indexF=SParam.AddConstr[i].first;\n            CoordType dir=SParam.AddConstr[i].second;\n            mesh.face[indexF].PD1()=dir;\n            mesh.face[indexF].PD2()=mesh.face[indexF].N()^dir;\n            mesh.face[indexF].PD1().Normalize();\n            mesh.face[indexF].PD2().Normalize();\n            mesh.face[indexF].SetS();\n        }\n    }\n\n    static void GloballyOrient(MeshType &mesh)\n    {\n        vcg::tri::CrossField<MeshType>::MakeDirectionFaceCoherent(mesh,true);\n    }\n\n\n    static void InitByCurvature(MeshType & mesh,\n                                unsigned Nring,\n                                bool UpdateFaces=true)\n    {\n\n        tri::RequirePerVertexCurvatureDir(mesh);\n\n        Eigen::MatrixXi F;\n        Eigen::MatrixXd V;\n\n        Eigen::MatrixXd PD1,PD2,PV1,PV2;\n        MeshToMatrix<MeshType>::GetTriMeshData(mesh,F,V);\n\n        igl::principal_curvature(V,F,PD1,PD2,PV1,PV2,Nring,true);\n\n        //then copy curvature per vertex\n        for (size_t i=0;i<mesh.vert.size();i++)\n        {\n            mesh.vert[i].PD1()=CoordType(PD1(i,0),PD1(i,1),PD1(i,2));\n            mesh.vert[i].PD2()=CoordType(PD2(i,0),PD2(i,1),PD2(i,2));\n            mesh.vert[i].K1()=PV1(i,0);\n            mesh.vert[i].K2()=PV2(i,0);\n        }\n        if (!UpdateFaces)return;\n        vcg::tri::CrossField<MeshType>::SetFaceCrossVectorFromVert(mesh);\n        InitQualityByAnisotropyDir(mesh);\n    }\n\n    static void SmoothDirections(MeshType &mesh,\n                                 int Ndir,\n                                 SmoothMethod SMethod=SMNPoly,\n                                 bool HardAsS=true,\n                                 ScalarType alphaSoft=0)\n    {\n\n        Eigen::VectorXi HardI;   //hard constraints\n        Eigen::MatrixXd HardD;   //hard directions\n        Eigen::VectorXi SoftI;   //soft constraints\n        Eigen::VectorXd SoftW;   //weight of soft constraints\n        Eigen::MatrixXd SoftD;   //soft directions\n\n        if (HardAsS)\n            CollectHardConstraints(mesh,HardI,HardD,SMethod,Ndir);\n\n        //collect soft constraints , miw only one that allows for soft constraints\n        if ((alphaSoft>0)&&(SMethod==SMMiq))\n          CollectSoftConstraints(mesh,SoftI,SoftD,SoftW);\n\n        //add some hard constraints if are not present\n        int numC=3;\n        if ((SoftI.rows()==0)&&(HardI.rows()==0))\n        {\n            printf(\"Add Forced Constraints \\n\");\n            fflush(stdout);\n            HardI=Eigen::MatrixXi(numC,1);\n\n            if ((Ndir==4)&&(SMethod==SMNPoly))\n                HardD=Eigen::MatrixXd(numC,6);\n            else\n                HardD=Eigen::MatrixXd(numC,3);\n\n            for (int i=0;i<numC;i++)\n            {\n                CoordType Dir;\n                int indexF;\n                PickRandomDir(mesh,indexF,Dir);\n\n                HardI(i,0)=indexF;\n                HardD(i,0)=Dir.X();\n                HardD(i,1)=Dir.Y();\n                HardD(i,2)=Dir.Z();\n\n                if ((Ndir==4)&&(SMethod==SMNPoly))\n                {\n                    CoordType Dir1=mesh.face[indexF].N()^Dir;\n                    Dir1.Normalize();\n                    HardD(i,3)=Dir1.X();\n                    HardD(i,4)=Dir1.Y();\n                    HardD(i,5)=Dir1.Z();\n                }\n            }\n        }\n\n         //finally smooth\n        if (SMethod==SMMiq)\n         SmoothMIQ(mesh,HardI,HardD,SoftI,SoftD,SoftW,alphaSoft,Ndir);\n        else\n        {\n            assert(SMethod==SMNPoly);\n            SmoothNPoly(mesh,HardI,HardD,Ndir);\n        }\n    }\n\n\n    static void SmoothDirections(MeshType &mesh,SmoothParam SParam)\n    {\n        //for the moment only cross and line field\n\n//        //initialize direction by curvature if needed\n        if ((SParam.alpha_curv>0)||\n             (SParam.sharp_thr>0)||\n             (SParam.curv_thr>0))\n        {\n            InitByCurvature(mesh,SParam.curvRing);\n            SelectConstraints(mesh,SParam);\n        }\n        else\n        {\n            SelectConstraints(mesh,SParam);\n            vcg::tri::CrossField<MeshType>::PropagateFromSelF(mesh);\n        }\n\n\n        //then do the actual smooth\n        SmoothDirections(mesh,SParam.Ndir,SParam.SmoothM,true,SParam.alpha_curv);\n    }\n\n};\n\n} // end namespace tri\n} // end namespace vcg\n#endif // FIELD_SMOOTHER_H\n"
  },
  {
    "path": "components/quad_from_patches/load_save.cpp",
    "content": "/***************************************************************************/\n/* Copyright(C) 2021\n\n\nThe authors of\n\nReliable Feature-Line Driven Quad-Remeshing\nSiggraph 2021\n\n\n All rights reserved.\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <https://www.gnu.org/licenses/>.\n****************************************************************************/\n\n#include \"load_save.h\"\n#include <iostream>\n#include <fstream>\n#include <algorithm>\n#include \"assert.h\"\n\nstd::vector<std::vector<size_t>> loadPatches(const std::string& filename)\n{\n    std::vector<std::vector<size_t>> partitions;\n\n    std::ifstream input;\n    input.open(filename.c_str());\n    if (!input.is_open())\n    {\n        std::cout<<\"ERROR LOADING PATCH FILE\"<<std::endl;\n        exit(0);\n    }\n\n    size_t numFaces;\n    input >> numFaces;\n\n    int maxPartitionId = 0;\n    std::vector<int> facePartition(numFaces,-1);\n\n    for (size_t i=0; i < numFaces;i++)\n    {\n        input >> facePartition[i];\n        maxPartitionId = std::max(facePartition[i], maxPartitionId);\n    }\n\n    input.close();\n\n    partitions.clear();\n    partitions.resize(static_cast<size_t>(maxPartitionId+1));\n    for(size_t i = 0; i < facePartition.size(); i++)\n    {\n        int currentPartition = facePartition[i];\n        assert(currentPartition >= 0);\n        assert(currentPartition < static_cast<int>(partitions.size()));\n        partitions[static_cast<size_t>(currentPartition)].push_back(i);\n    }\n\n    return partitions;\n}\n\nstd::vector<std::vector<size_t>> loadCorners(const std::string& filename)\n{\n    std::vector<std::vector<size_t>> corners;\n\n    std::ifstream input;\n    input.open(filename.c_str());\n    if (!input.is_open())\n    {\n        std::cout<<\"ERROR LOADING CORNERS FILE\"<<std::endl;\n        exit(0);\n    }\n\n    size_t numPartitions;\n    input >> numPartitions;\n\n    corners.clear();\n    corners.resize(numPartitions);\n    for (size_t i = 0; i < numPartitions; i++)\n    {\n        size_t numCorners;\n        input >> numCorners;\n\n        corners[i].resize(numCorners);\n//        std::cout<<\"Reading Patch \"<<i<<std::endl;\n//        std::cout<<\"Size \"<<numCorners<<std::endl;\n        for (size_t j = 0; j < numCorners; j++)\n        {\n            input >> corners[i][j];\n             //std::cout<<corners[i][j]<<\",\";\n        }\n\n//        std::cout<<std::endl;\n//        std::cout<<std::endl;\n    }\n\n    input.close();\n    //exit(0);\n    return corners;\n}\n\n\nstd::vector<std::pair<size_t,size_t> > LoadFeatures(const std::string &filename)\n{\n    std::vector<std::pair<size_t,size_t> > features;\n    FILE *f=NULL;\n    f=fopen(filename.c_str(),\"rt\");\n    if (f==NULL)\n    {\n        std::cout<<\"ERROR LOADING FEATURES FILE\"<<std::endl;\n        exit(0);\n    }\n\n    int numFeatures;\n    fscanf(f,\"%d\\n\",&numFeatures);\n\n    for (size_t i=0;i<numFeatures;i++)\n    {\n        int FIndex,EIndex;\n        fscanf(f,\"%d,%d\\n\",&FIndex,&EIndex);\n\n        features.push_back(std::pair<size_t,size_t>(FIndex,EIndex));\n    }\n    fclose(f);\n\n    return features;\n}\n\nstd::vector<size_t> loadFeatureCorners(const std::string &filename)\n{\n    std::vector<size_t> featureCorners;\n    FILE *f=NULL;\n    f=fopen(filename.c_str(),\"rt\");\n    if (f==NULL)\n    {\n        std::cout<<\"ERROR LOADING FEATURES FILE\"<<std::endl;\n        exit(0);\n    }\n\n    int numFeaturesC;\n    fscanf(f,\"%d\\n\",&numFeaturesC);\n\n    for (size_t i=0;i<numFeaturesC;i++)\n    {\n        int VIndex;\n        fscanf(f,\"%d\\n\",&VIndex);\n\n        featureCorners.push_back(VIndex);\n    }\n    fclose(f);\n\n    return featureCorners;\n}\n"
  },
  {
    "path": "components/quad_from_patches/load_save.h",
    "content": "/***************************************************************************/\n/* Copyright(C) 2021\n\n\nThe authors of\n\nReliable Feature-Line Driven Quad-Remeshing\nSiggraph 2021\n\n\n All rights reserved.\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <https://www.gnu.org/licenses/>.\n****************************************************************************/\n\n#ifndef LOAD_SAVE_H\n#define LOAD_SAVE_H\n\n#include <string>\n#include <vector>\nstd::vector<std::vector<size_t>> loadPatches(const std::string& filename);\nstd::vector<std::vector<size_t>> loadCorners(const std::string& filename);\nstd::vector<std::pair<size_t,size_t>> LoadFeatures(const std::string &filename);\nstd::vector<size_t> loadFeatureCorners(const std::string& filename);\n\n#endif // LOAD_SAVE_H\n"
  },
  {
    "path": "components/quad_from_patches/local_para_smooth.h",
    "content": "/***************************************************************************/\n/* Copyright(C) 2021\n\n\nThe authors of\n\nReliable Feature-Line Driven Quad-Remeshing\nSiggraph 2021\n\n\n All rights reserved.\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <https://www.gnu.org/licenses/>.\n****************************************************************************/\n\n#ifndef LOCAL_PARAM_SMOOTH\n#define LOCAL_PARAM_SMOOTH\n\n#include <vcg/space/triangle2.h>\n#include <vcg/simplex/face/topology.h>\n#include <vcg/complex/algorithms/smooth.h>\n#include <vcg/complex/algorithms/polygonal_algorithms.h>\n#include <vcg/complex/algorithms/parametrization/uv_utils.h>\n#include <wrap/igl/lscm_parametrization.h>\n#include <wrap/io_trimesh/export.h>\n#include <vcg/space/distance3.h>\n\n\ntemplate <class MeshType>\nclass Local_Param_Smooth\n{\n    typedef typename MeshType::FaceType FaceType;\n    typedef typename MeshType::VertexType VertexType;\n    typedef typename MeshType::CoordType CoordType;\n    typedef typename MeshType::ScalarType ScalarType;\n    typedef typename vcg::face::Pos<FaceType> PosType;\n    typedef typename vcg::Point2<ScalarType> Point2Type;\n    typedef typename vcg::Triangle2<ScalarType> Triangle2Type;\n\npublic:\n\n    struct UVSmoothParam\n    {\n        bool FixSel;\n        bool LineEdgeSel;\n        ScalarType Damp;\n        size_t Steps;\n\n        UVSmoothParam()\n        {\n            FixSel=false;\n            LineEdgeSel=true;\n            Damp=0.2;\n            Steps=5;\n        }\n    };\n\nprivate:\n\n\n    static PosType GetStarInternalPos(MeshType &sub_mesh)\n    {\n        //get the first pos to start iterating\n        int indexE=-1;\n        if (!sub_mesh.face[0].V(0)->IsB())indexE=0;\n        if (!sub_mesh.face[0].V(1)->IsB())indexE=1;\n        if (!sub_mesh.face[0].V(2)->IsB())indexE=2;\n        assert(indexE>=0);\n        PosType VertPos(&sub_mesh.face[0],indexE);\n        return VertPos;\n    }\n\n    static void SetStarInternalPos(MeshType &sub_mesh,const CoordType &Pos)\n    {\n        //get the first pos to start iterating\n        int indexE=-1;\n        if (!sub_mesh.face[0].V(0)->IsB())indexE=0;\n        if (!sub_mesh.face[0].V(1)->IsB())indexE=1;\n        if (!sub_mesh.face[0].V(2)->IsB())indexE=2;\n        assert(indexE>=0);\n        sub_mesh.face[0].P(indexE)=Pos;\n    }\n\n    static bool InterpolateUV(MeshType &mesh,\n                              const vcg::Point2<ScalarType> &UV,\n                              size_t &IndexF,CoordType &bary)\n    {\n        for (size_t i=0;i<mesh.face.size();i++)\n        {\n            vcg::Point2<ScalarType> UV0,UV1,UV2;\n            UV0=mesh.face[i].V(0)->T().P();\n            UV1=mesh.face[i].V(1)->T().P();\n            UV2=mesh.face[i].V(2)->T().P();\n            bool inside=InterpolationParameters2(UV0,UV1,UV2,UV,bary);\n            if (inside)\n            {\n                IndexF=i;\n                return true;\n            }\n        }\n        return false;\n    }\n\n\n    static Point2Type ComputeCentralUV(std::vector<PosType> &StarFPos)\n    {\n        ScalarType WSum=0;\n        Point2Type  CenterUV=Point2Type(0,0);\n        for (size_t i=0;i<StarFPos.size();i++)\n        {\n            CoordType P1=StarFPos[i].VFlip()->P();\n            Point2Type UV1=StarFPos[i].VFlip()->T().P();\n\n            size_t next_i=(i+1)%StarFPos.size();\n\n            CoordType P2=StarFPos[next_i].VFlip()->P();\n            Point2Type UV2=StarFPos[next_i].VFlip()->T().P();\n\n            CoordType P0=StarFPos[i].V()->P();\n\n            ScalarType angle1=vcg::Angle(P2 - P1, P0 - P1);\n            ScalarType angle2=vcg::Angle(P1 - P2, P0 - P2);\n            ScalarType weight1 = tan((M_PI * 0.5) - angle1);\n            ScalarType weight2 = tan((M_PI * 0.5) - angle2);\n\n            CenterUV+=UV1*weight2;\n            CenterUV+=UV2*weight1;\n\n            WSum+=weight1;\n            WSum+=weight2;\n        }\n        CenterUV/=WSum;\n        return CenterUV;\n    }\n\n    static void ParametrizeCentralUV(MeshType &StarMesh)\n    {\n        PosType StartVertPos=GetStarInternalPos(StarMesh);\n        //get the star around\n        std::vector<PosType> StarFPos;\n        vcg::face::VFOrderedStarFF(StartVertPos,StarFPos);\n        assert(!StartVertPos.V()->IsB());\n        assert(!StartVertPos.V()->IsS());\n        StartVertPos.V()->T().P()=ComputeCentralUV(StarFPos);\n    }\n\n    static bool FindSmoothedPos(MeshType &StarMesh,\n                                ScalarType Damp,\n                                CoordType &InterpPos)\n    {\n\n        ParametrizeCentralUV(StarMesh);\n\n        PosType InternalPos=GetStarInternalPos(StarMesh);\n        //vcg::Point2<ScalarType> UVCenter=InternalPos.V()->T().P();\n\n        vcg::Point2<ScalarType> CenterUVTarget(0,0);\n        vcg::Point2<ScalarType> SamplePos=CenterUVTarget;//UVCenter*Damp+CenterUVTarget*(1-Damp);\n\n        size_t IndexF;\n        CoordType bary;\n        bool Interpolated=InterpolateUV(StarMesh,SamplePos,IndexF,bary);\n        if (!Interpolated)\n        {\n            //std::cout<<\"No Interp\"<<std::endl;\n            //bool NeedC;\n            ParametrizeBorders(StarMesh);//,false,NeedC);//NeedConformal[i]);\n            ParametrizeCentralUV(StarMesh);\n            Interpolated=InterpolateUV(StarMesh,SamplePos,IndexF,bary);\n            if (!Interpolated)\n            {\n                vcg::tri::io::ExporterPLY<MeshType>::Save(StarMesh,\"test.ply\");\n                assert(0);\n            }\n            //return false;\n        }\n\n        CoordType P0=StarMesh.face[IndexF].P(0);\n        CoordType P1=StarMesh.face[IndexF].P(1);\n        CoordType P2=StarMesh.face[IndexF].P(2);\n        InterpPos=CoordType(P0*bary.X()+P1*bary.Y()+P2*bary.Z());\n        return true;\n\n    }\n\n    static CoordType ProjectOnBasis(const CoordType &testP,\n                                    const std::vector<PosType> &ProjBasis)\n    {\n        if (ProjBasis.size()==0)return testP;\n        CoordType closestP=testP;\n        ScalarType currD=std::numeric_limits<ScalarType>::max();\n        //std::cout<<\"ProjBasis Size\"<<ProjBasis.size();\n        for (size_t i=0;i<ProjBasis.size();i++)\n        {\n            CoordType P0=ProjBasis[i].V()->P();\n            CoordType P1=ProjBasis[i].VFlip()->P();\n            vcg::Segment3<ScalarType> S3(P0,P1);\n            CoordType clos;\n            ScalarType distT;\n            vcg::SegmentPointDistance(S3,testP,clos,distT);\n            if (distT>currD)continue;\n            currD=distT;\n            closestP=clos;\n        }\n        return closestP;\n    }\n\n    static void SmoothStep(MeshType &mesh,\n                           const std::vector<MeshType*> &StarMeshes,\n                           const std::vector<std::vector<int> > &OrigIndex,\n                           const std::vector<std::vector<PosType> > &ProjBasis,\n                           const UVSmoothParam &UVP,\n                           const std::vector<bool> &IsS)\n    {\n        std::vector<CoordType> TargetP(mesh.vert.size(),CoordType(0,0,0));\n        std::vector<size_t> TargetN(mesh.vert.size(),0);\n\n        assert(IsS.size()==mesh.vert.size());\n        assert(StarMeshes.size()==mesh.vert.size());\n        //assert(NeedConformal.size()==StarMeshes.size());\n\n        //compute target pos just to use for borders\n        for (size_t i=0;i<mesh.face.size();i++)\n        {\n            for (size_t j=0;j<mesh.face[i].VN();j++)\n            {\n                VertexType *v0=mesh.face[i].V(j);\n                VertexType *v1=mesh.face[i].V((j+1)%mesh.face[i].VN());\n                //check to sum up only once\n                if ((!vcg::face::IsBorder(mesh.face[i],j))&&(v1<v0))continue;\n                size_t IndexV0=vcg::tri::Index(mesh,v0);\n                size_t IndexV1=vcg::tri::Index(mesh,v1);\n                if (v0->IsB())\n                {\n                    TargetP[IndexV0]+=v1->P();\n                    TargetN[IndexV0]++;\n                }\n                if (v1->IsB())\n                {\n                    TargetP[IndexV1]+=v0->P();\n                    TargetN[IndexV1]++;\n                }\n            }\n        }\n\n        for (size_t i=0;i<TargetP.size();i++)\n        {\n            if (!mesh.vert[i].IsB())continue;\n            assert(TargetN[i]>0);\n            TargetP[i]/=TargetN[i];\n        }\n\n        for (size_t i=0;i<StarMeshes.size();i++)\n        {\n            //if (StarMeshes[i]==NULL)\n            if (mesh.vert[i].IsB())\n            {\n                //assert(StarMeshes[i]==NULL);\n                continue;\n            }\n            else\n            {\n                assert(StarMeshes[i]!=NULL);\n                //compute the pre-parametrization\n                //bool NeedC=true;\n                ParametrizeBorders((*StarMeshes[i]));//,UVP.LineEdgeSel,NeedC);//NeedConformal[i]);\n\n                CoordType InterpPos;\n                //bool Interpolated=FindSmoothedPos((*StarMeshes[i]),NeedC,UVP.Damp,InterpPos);\n                bool Interpolated=FindSmoothedPos((*StarMeshes[i]),UVP.Damp,InterpPos);\n                if (Interpolated)\n                    TargetP[i]=InterpPos;\n                else\n                    TargetP[i]=mesh.vert[i].P();\n            }\n        }\n\n        //update mesh position\n        for (size_t i=0;i<mesh.vert.size();i++)\n        {\n            if (UVP.FixSel && IsS[i])continue;\n\n            mesh.vert[i].P()=mesh.vert[i].P()*UVP.Damp+TargetP[i]*(1-UVP.Damp);\n\n            if (UVP.LineEdgeSel)\n                mesh.vert[i].P()=ProjectOnBasis(mesh.vert[i].P(),ProjBasis[i]);\n        }\n\n        //update submesh positions\n        for (size_t i=0;i<mesh.vert.size();i++)\n        {\n            if (StarMeshes[i]==NULL)continue;\n            assert(OrigIndex[i].size()==(*StarMeshes[i]).vert.size());\n            for (size_t j=0;j<(*StarMeshes[i]).vert.size();j++)\n            {\n                size_t IndexO=OrigIndex[i][j];\n                (*StarMeshes[i]).vert[j].P()=mesh.vert[IndexO].P();\n            }\n        }\n\n    }\n\n\n\n    static void DeriveRegularStarPos(int N,std::vector<Point2Type> &StarPos)\n    {\n        std::vector<CoordType> TemplatePos;\n        vcg::getBaseTemplatePolygon(N,TemplatePos);\n        for (size_t i=0;i<TemplatePos.size();i++)\n            StarPos.push_back(Point2Type(TemplatePos[i].X(),TemplatePos[i].Y()));\n    }\n\n    static void ParametrizeBorders(MeshType &sub_mesh)/*,\n                                   const bool UseSharp),\n                                   bool &NeedConformal)*/\n    {\n        PosType StartVertPos=GetStarInternalPos(sub_mesh);\n\n        //get the star around\n        std::vector<PosType> StarFPos;\n        vcg::face::VFOrderedStarFF(StartVertPos,StarFPos);\n\n        //then get the indexes of the one having sharp edges\n        std::vector<size_t> SelIndexes;\n\n        for (size_t i=0;i<StarFPos.size();i++)\n            SelIndexes.push_back(i);\n\n        //then simply parametrize the ones that should be fixed on border\n        std::vector<Point2Type> UV_Boundary;\n        DeriveRegularStarPos(SelIndexes.size(),UV_Boundary);\n        vcg::tri::UpdateSelection<MeshType>::VertexClear(sub_mesh);\n\n        for (size_t i=0;i<SelIndexes.size();i++)\n        {\n            //get the boundary fixed indexes\n            size_t currI=SelIndexes[i];\n            //set the coordinates\n            StarFPos[currI].VFlip()->T().P()=UV_Boundary[i];\n            //then select it as it shoould be preserved during param\n            StarFPos[currI].VFlip()->SetS();\n        }\n    }\n\n    static void GetStarSubMeshes(MeshType &mesh,\n                                 const PosType &StartVertPos,\n                                 MeshType &sub_mesh,\n                                 std::vector<PosType> &ProjBasis,\n                                 std::vector<int> &OrigIndex)\n    {\n        OrigIndex.clear();\n\n        std::vector<PosType> StarFPos;\n        vcg::face::VFOrderedStarFF(StartVertPos,StarFPos);\n\n        vcg::tri::UpdateSelection<MeshType>::FaceClear(mesh);\n        vcg::tri::UpdateSelection<MeshType>::VertexClear(mesh);\n\n        for (size_t k=0;k<StarFPos.size();k++)\n            StarFPos[k].F()->SetS();\n\n        sub_mesh.Clear();\n        vcg::tri::Append<MeshType,MeshType>::Mesh(sub_mesh,mesh,true);\n\n        //copy the index\n        for (size_t i=0;i<sub_mesh.vert.size();i++)\n            OrigIndex.push_back(sub_mesh.vert[i].Q());\n\n        vcg::tri::UpdateTopology<MeshType>::FaceFace(sub_mesh);\n        vcg::tri::UpdateFlags<MeshType>::VertexBorderFromFaceAdj(sub_mesh);\n\n        //then retrieve a pos from the central vert\n        bool found=false;\n        PosType StartPos1;\n        size_t IndexCentral=vcg::tri::Index(mesh,StartVertPos.V());\n        for (size_t i=0;i<sub_mesh.face.size();i++)\n            for (size_t j=0;j<3;j++)\n            {\n                size_t IndexV=vcg::tri::Index(sub_mesh,sub_mesh.face[i].V(j));\n                if (OrigIndex[IndexV]==IndexCentral)\n                {\n                    found=true;\n                    StartPos1=PosType(&sub_mesh.face[i],j);\n                    break;\n                }\n            }\n        std::vector<PosType> Star1FPos;\n        vcg::face::VFOrderedStarFF(StartPos1,Star1FPos);\n\n        for (size_t k=0;k<Star1FPos.size();k++)\n        {\n            if (Star1FPos[k].IsBorder() || Star1FPos[k].IsEdgeS())\n                ProjBasis.push_back(Star1FPos[k]);\n        }\n\n    }\n\n    static void GetStarMeshes(MeshType &mesh,\n                              std::vector<MeshType*> &StarMeshes,\n                              std::vector<std::vector<PosType> > &ProjBasis,\n                              std::vector<std::vector<int> > &OrigIndex)\n    {\n        //first save the idx of original vertx on quality\n        for (size_t i=0;i<mesh.vert.size();i++)\n            mesh.vert[i].Q()=i;\n\n        //then create the submeshes\n        StarMeshes=std::vector<MeshType*>(mesh.vert.size(),NULL);\n        OrigIndex.clear();\n        OrigIndex.resize(mesh.vert.size());\n\n        ProjBasis.clear();\n        ProjBasis.resize(mesh.vert.size());\n\n        //NeedConformal=std::vector<bool>(mesh.vert.size(),true);\n        vcg::tri::UpdateFlags<MeshType>::VertexClearV(mesh);\n        for (size_t i=0;i<mesh.face.size();i++)\n            for (size_t j=0;j<3;j++)\n            {\n                if (mesh.face[i].V(j)->IsV())continue;\n                //if (mesh.face[i].V(j)->IsB())continue;\n                mesh.face[i].V(j)->SetV();\n\n                //allocate the submesh\n                size_t IndexV=vcg::tri::Index(mesh,mesh.face[i].V(j));\n                assert(StarMeshes[IndexV]==NULL);\n                StarMeshes[IndexV]=new MeshType();\n\n                //get the starting pos\n                PosType VertPos(&mesh.face[i],j);\n\n                //copy the submesh\n                GetStarSubMeshes(mesh,VertPos,(*StarMeshes[IndexV]),ProjBasis[IndexV],OrigIndex[IndexV]);\n\n            }\n        vcg::tri::UpdateFlags<MeshType>::VertexClearV(mesh);\n    }\n\npublic:\n\n    static void Smooth(MeshType &mesh,UVSmoothParam UVP=UVSmoothParam())\n    {\n        //save the selected ones\n        std::vector<bool> SelV(mesh.vert.size(),false);\n        for (size_t i=0;i<mesh.vert.size();i++)\n            if (mesh.vert[i].IsS())SelV[i]=true;\n\n        //update\n        vcg::tri::UpdateTopology<MeshType>::FaceFace(mesh);\n        vcg::tri::UpdateFlags<MeshType>::VertexBorderFromFaceAdj(mesh);\n\n        //then make sure that edge sel consistent alogn adjacent faces\n        for (size_t i=0;i<mesh.face.size();i++)\n            for (size_t j=0;j<3;j++)\n            {\n                if (!mesh.face[i].IsFaceEdgeS(j))continue;\n                if (vcg::face::IsBorder(mesh.face[i],j))continue;\n                FaceType *fOpp=mesh.face[i].FFp(j);\n                int IOpp=mesh.face[i].FFi(j);\n                assert(fOpp!=&mesh.face[i]);\n                assert(fOpp!=NULL);\n                assert(IOpp>=0);\n                assert(IOpp<3);\n                assert(fOpp->IsFaceEdgeS(IOpp));\n            }\n\n        //create star meshes\n        std::vector<MeshType*> StarMeshes;\n        std::vector<std::vector<int> > OrigIndex;\n        std::vector<std::vector<PosType> > ProjBasis;\n        GetStarMeshes(mesh,StarMeshes,ProjBasis,OrigIndex);\n\n        //and finally smooth\n        for (size_t i=0;i<UVP.Steps;i++)\n            SmoothStep(mesh,StarMeshes,OrigIndex,ProjBasis,UVP,SelV);\n\n\n        for (size_t i=0;i<StarMeshes.size();i++)\n        {\n            if (StarMeshes[i]==NULL)continue;\n            delete(StarMeshes[i]);\n        }\n\n        vcg::tri::UpdateSelection<MeshType>::VertexClear(mesh);\n        for (size_t i=0;i<mesh.vert.size();i++)\n        {\n            if (SelV[i])\n                mesh.vert[i].SetS();\n        }\n    }\n}; //end\n\ntemplate <class MeshType>\nvoid SmoothPolygonalMeshByLocalUV(MeshType &mesh,\n                                  const std::vector<std::pair<size_t,size_t> > &SharpFeatures,\n                                  const std::vector<size_t> &Corners,\n                                  const size_t Steps=100)\n{\n    typedef typename MeshType::FaceType FaceType;\n    typedef typename MeshType::VertexType VertexType;\n    typedef typename MeshType::CoordType CoordType;\n    typedef typename MeshType::ScalarType ScalarType;\n\n    //save positions\n    std::set<std::pair<CoordType,CoordType> > SharpFPos;\n    std::set<CoordType> SharpPos;\n    for (size_t i=0;i<SharpFeatures.size();i++)\n    {\n        size_t IndexF=SharpFeatures[i].first;\n        size_t IndexE=SharpFeatures[i].second;\n        size_t numV=mesh.face[IndexF].VN();\n        CoordType P0=mesh.face[IndexF].V(IndexE)->P();\n        CoordType P1=mesh.face[IndexF].V((IndexE+1)%numV)->P();\n        std::pair<CoordType,CoordType> Key(std::min(P0,P1),std::max(P0,P1));\n        SharpFPos.insert(Key);\n    }\n\n    for (size_t i=0;i<Corners.size();i++)\n        SharpPos.insert(mesh.vert[Corners[i]].P());\n\n    //triangulate\n    MeshType swapM;\n    vcg::tri::Append<MeshType,MeshType>::Mesh(swapM,mesh);\n\n    vcg::PolygonalAlgorithm<MeshType>::Triangulate(swapM);\n    vcg::tri::UpdateTopology<MeshType>::FaceFace(swapM);\n    vcg::tri::UpdateFlags<MeshType>::FaceBorderFromFF(swapM);\n    vcg::tri::UpdateFlags<MeshType>::VertexBorderFromFaceBorder(swapM);\n\n    vcg::tri::UpdateFlags<MeshType>::VertexClearS(swapM);\n    vcg::tri::UpdateFlags<MeshType>::FaceClearFaceEdgeS(swapM);\n    //then set it back on the mesh\n    for (size_t i=0;i<swapM.face.size();i++)\n    {\n        size_t numV=swapM.face[i].VN();\n        assert(numV==3);\n        for (size_t j=0;j<3;j++)\n        {\n            CoordType P0=swapM.face[i].V0(j)->P();\n            CoordType P1=swapM.face[i].V1(j)->P();\n            std::pair<CoordType,CoordType> Key(std::min(P0,P1),std::max(P0,P1));\n            if (SharpFPos.count(Key)==0)continue;\n            swapM.face[i].SetFaceEdgeS(j);\n        }\n    }\n\n    for (size_t i=0;i<swapM.vert.size();i++)\n    {\n        CoordType P=swapM.vert[i].P();\n        if (SharpPos.count(P)==0)continue;\n        swapM.vert[i].SetS();\n    }\n\n    //copy back values\n    typename Local_Param_Smooth<MeshType>::UVSmoothParam UVP;\n    UVP.LineEdgeSel=true;\n    UVP.FixSel=true;\n    UVP.Steps=Steps;\n    Local_Param_Smooth<MeshType>::Smooth(swapM,UVP);\n\n    //then copy bback values\n    for (size_t i=0;i<mesh.vert.size();i++)\n        mesh.vert[i].P()=swapM.vert[i].P();\n\n}\n\n#endif // LOCAL_PARAM_SMOOTH\n"
  },
  {
    "path": "components/quad_from_patches/main.cpp",
    "content": "/***************************************************************************/\n/* Copyright(C) 2021\n\n\nThe authors of\n\nReliable Feature-Line Driven Quad-Remeshing\nSiggraph 2021\n\n\n All rights reserved.\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <https://www.gnu.org/licenses/>.\n****************************************************************************/\n\n#include <vcg/complex/complex.h>\n#include <vcg/complex/algorithms/polygonal_algorithms.h>\n#include <vcg/complex/algorithms/update/topology.h>\n#include <vcg/complex/algorithms/update/bounding.h>\n#include <stdio.h>\n//#include <QFileInfo>\n//#include <QDir>\n\n#include \"load_save.h\"\n#include \"mesh_types.h\"\n\n#include <wrap/io_trimesh/import.h>\n#include <wrap/io_trimesh/export.h>\n#include \"smooth_mesh.h\"\n#include \"quad_from_patches.h\"\n#include \"quad_mesh_tracer.h\"\n\n#include <clocale>\n\nbool LocalUVSm=false;\ntypename TriangleMesh::ScalarType avgEdge(const TriangleMesh& trimesh);\nvoid loadSetupFile(const std::string& path, QuadRetopology::Parameters& parameters, float& scaleFactor, int& fixedChartClusters);\nvoid SaveSetupFile(const std::string& path, QuadRetopology::Parameters& parameters, float& scaleFactor, int& fixedChartClusters);\n//int FindCurrentNum(std::string &pathProject);\n\nint main(int argc, char *argv[])\n{\n    //Use \".\" as decimal separator\n    std::setlocale(LC_NUMERIC, \"en_US.UTF-8\");\n\n    int CurrNum=0;\n\n    TriangleMesh trimesh;\n    std::vector<std::vector<size_t>> trimeshPartitions;\n    std::vector<std::vector<size_t>> trimeshCorners;\n    std::vector<std::pair<size_t,size_t> > trimeshFeatures;\n    std::vector<size_t> trimeshFeaturesC;\n\n    PolyMesh quadmesh;\n    std::vector<std::vector<size_t>> quadmeshPartitions;\n    std::vector<std::vector<size_t>> quadmeshCorners;\n    std::vector<int> ilpResult;\n\n//    QuadRetopology::Parameters parameters;\n//    parameters.alpha = 0.05; //Alpha: blends between isometry (alpha) and regularity (1-alpha)\n//    parameters.ilpMethod = QuadRetopology::ILPMethod::LEASTSQUARES; //ILP method\n//    parameters.timeLimit = 5 * 60; //Time limit in seconds\n//    parameters.gapLimit = 0.1; //When it reaches this gap value, optimization stops\n//    parameters.minimumGap = 0.25; //Optimization has to reach at least this minimum gap, otherwise faster methods are performed\n//    parameters.isometry = true; //Activate isometry\n//    parameters.regularityQuadrilaterals = true; //Activate regularity for quadrilaterals\n//    parameters.regularityNonQuadrilaterals = true; //Activate regularity for non-quadrilaterals\n//    parameters.regularityNonQuadrilateralWeight = 0.9; //Regularity for non-quadrilaterals weight\n//    parameters.alignSingularities = true; //Activate singularity alignment\n//    parameters.alignSingularitiesWeight = 0.3; //Singularity alignment weight\n//    parameters.repeatLosingConstraintsIterations = true;\n//    parameters.repeatLosingConstraintsQuads = false;\n//    parameters.repeatLosingConstraintsNonQuads = false;\n//    parameters.repeatLosingConstraintsAlign = true;\n//    parameters.hardParityConstraint = true; //Flag to choose if use hard constraints or not\n\n    QuadRetopology::Parameters parameters;\n    float scaleFactor;\n    int fixedChartClusters;\n    loadSetupFile(std::string(\"basic_setup.txt\"), parameters, scaleFactor, fixedChartClusters);\n\n    parameters.chartSmoothingIterations = 0; //Chart smoothing\n    parameters.quadrangulationFixedSmoothingIterations = 0; //Smoothing with fixed borders of the patches\n    parameters.quadrangulationNonFixedSmoothingIterations = 0; //Smoothing with fixed borders of the quadrangulation\n    parameters.feasibilityFix = false;\n\n    if(argc<2)\n    {\n        printf(\"error: pass one mesh as parameter \\n\");\n        fflush(stdout);\n        exit(0);\n    }\n\n    if (argc>2)\n    {\n        CurrNum=atoi(argv[2]);\n    }\n    //MESH LOAD\n    std::string meshFilename = std::string(argv[1]);\n    int mask;\n    vcg::tri::io::ImporterOBJ<TriangleMesh>::LoadMask(meshFilename.c_str(), mask);\n    int err = vcg::tri::io::ImporterOBJ<TriangleMesh>::Open(trimesh, meshFilename.c_str(), mask);\n    //trimesh.SolveGeometricIssues();\n\n    if ((err!=0)&&(err!=5))\n    {\n        std::cout<<\"ERROR LOADING MESH\"<<std::endl;\n        exit(0);\n    }\n    std::cout<<\"MESH NAME \"<<meshFilename.c_str()<<std::endl;\n    std::cout<<\"Loaded \"<<trimesh.vert.size()<<\" vertices\"<<std::endl;\n    std::cout<<\"Loaded \"<<trimesh.face.size()<<\" faces\"<<std::endl;\n\n    //FACE PARTITIONS\n    std::string partitionFilename = meshFilename;\n    partitionFilename.erase(partitionFilename.find_last_of(\".\"));\n    partitionFilename.append(\".patch\");\n    trimeshPartitions = loadPatches(partitionFilename);\n    std::cout<<\"Loaded \"<<trimeshPartitions.size()<<\" patches\"<<std::endl;\n\n    //PATCH CORNERS\n    std::string cornerFilename = meshFilename;\n    cornerFilename.erase(cornerFilename.find_last_of(\".\"));\n    cornerFilename.append(\".corners\");\n    trimeshCorners = loadCorners(cornerFilename);\n    std::cout<<\"Loaded \"<<trimeshCorners.size()<<\" corners set\"<<std::endl;\n\n    //CheckIntegrity(trimesh,trimeshPartitions,trimeshCorners);\n\n    //FEATURES\n    std::string featureFilename = meshFilename;\n    featureFilename.erase(featureFilename.find_last_of(\".\"));\n    featureFilename.append(\".feature\");\n    trimeshFeatures = LoadFeatures(featureFilename);\n    std::cout<<\"Loaded \"<<trimeshFeatures.size()<<\" features\"<<std::endl;\n\n    //FEATURE CORNERS\n    std::string featureCFilename = meshFilename;\n    featureCFilename.erase(featureCFilename.find_last_of(\".\"));\n    featureCFilename.append(\".c_feature\");\n    trimeshFeaturesC = loadFeatureCorners(featureCFilename);\n    std::cout<<\"Loaded \"<<featureCFilename.size()<<\" corner features\"<<std::endl;\n    loadFeatureCorners(featureCFilename);\n\n    OrientIfNeeded(trimesh,trimeshPartitions,trimeshCorners,trimeshFeatures,trimeshFeaturesC);\n\n    //COMPUTE QUADRANGULATION\n    QuadRetopology::internal::updateAllMeshAttributes(trimesh);\n    double EdgeSize=avgEdge(trimesh)*scaleFactor;\n    std::cout<<\"Edge Size \"<<EdgeSize<<std::endl;\n    const std::vector<double> edgeFactor(trimeshPartitions.size(), EdgeSize);\n    qfp::quadrangulationFromPatches(trimesh, trimeshPartitions, trimeshCorners, edgeFactor, parameters, fixedChartClusters, quadmesh, quadmeshPartitions, quadmeshCorners, ilpResult);\n\n    //COLOR AND SAVE QUADRANGULATION\n    vcg::tri::UpdateColor<PolyMesh>::PerFaceConstant(quadmesh);\n    for(size_t i = 0; i < quadmeshPartitions.size(); i++)\n    {\n        vcg::Color4b partitionColor = vcg::Color4b::Scatter(static_cast<int>(quadmeshPartitions.size()), static_cast<int>(i));\n        for(size_t j = 0; j < quadmeshPartitions[i].size(); j++)\n        {\n            size_t fId = quadmeshPartitions[i][j];\n            quadmesh.face[fId].C() = partitionColor;\n        }\n    }\n\n//    size_t CurrNum=FindCurrentNum(meshFilename);\n\n    //SAVE OUTPUT\n    std::string outputFilename = meshFilename;\n    outputFilename.erase(partitionFilename.find_last_of(\".\"));\n    outputFilename+=std::string(\"_\")+std::to_string(CurrNum)+std::string(\"_quadrangulation\")+std::string(\".obj\");\n    vcg::tri::io::ExporterOBJ<PolyMesh>::Save(quadmesh, outputFilename.c_str(), vcg::tri::io::Mask::IOM_FACECOLOR);\n\n\n//    ReMapBoundaries(trimesh,quadmesh,trimeshCorners,trimeshPartitions,\n//                    quadmeshCorners,quadmeshPartitions);\n\n\n    //SMOOTH\n    std::vector<size_t> QuadPart(quadmesh.face.size(),0);\n    for (size_t i=0;i<quadmeshPartitions.size();i++)\n        for (size_t j=0;j<quadmeshPartitions[i].size();j++)\n            QuadPart[quadmeshPartitions[i][j]]=i;\n\n    std::vector<size_t> TriPart(trimesh.face.size(),0);\n    for (size_t i=0;i<trimeshPartitions.size();i++)\n        for (size_t j=0;j<trimeshPartitions[i].size();j++)\n            TriPart[trimeshPartitions[i][j]]=i;\n\n    std::vector<size_t> QuadCornersVect;\n    for (size_t i=0;i<quadmeshCorners.size();i++)\n        for (size_t j=0;j<quadmeshCorners[i].size();j++)\n            QuadCornersVect.push_back(quadmeshCorners[i][j]);\n    std::sort(QuadCornersVect.begin(),QuadCornersVect.end());\n    auto last=std::unique(QuadCornersVect.begin(),QuadCornersVect.end());\n    QuadCornersVect.erase(last, QuadCornersVect.end());\n\n    std::cout<<\"** SMOOTHING **\"<<std::endl;\n    //SmoothSubdivide(trimesh,quadmesh,trimeshFeatures,trimeshFeaturesC,TriPart,QuadCornersVect,QuadPart,100,0.5,EdgeSize);\n    if (LocalUVSm)\n        LocalUVSmooth(quadmesh,trimesh,trimeshFeatures,trimeshFeaturesC,30);\n    else\n        MultiCostraintSmooth(quadmesh,trimesh,trimeshFeatures,trimeshFeaturesC,TriPart,QuadCornersVect,QuadPart,0.5,EdgeSize,30,1);\n\n    //SAVE OUTPUT\n    outputFilename = meshFilename;\n    outputFilename.erase(partitionFilename.find_last_of(\".\"));\n    //outputFilename.append(\"_quadrangulation_smooth.obj\");\n    outputFilename+=std::string(\"_\")+std::to_string(CurrNum)+std::string(\"_quadrangulation_smooth\")+std::string(\".obj\");\n\n    vcg::tri::io::ExporterOBJ<PolyMesh>::Save(quadmesh, outputFilename.c_str(), vcg::tri::io::Mask::IOM_FACECOLOR);\n\n#ifdef SAVE_MESHES_FOR_DEBUG\n    QuadMeshTracer<PolyMesh> tracerMotorcycle(quadmesh);\n    tracerMotorcycle.MotorCycle = true;\n    tracerMotorcycle.TracePartitions();\n    tracerMotorcycle.SaveColoredMesh(\"results/quadlayout_motorcycle.obj\");\n    QuadMeshTracer<PolyMesh> tracer(quadmesh);\n    tracer.MotorCycle = false;\n    tracer.TracePartitions();\n    tracer.SaveColoredMesh(\"results/quadlayout.obj\");\n#endif\n\n    for(size_t i=0;i<trimesh.face.size();i++)\n        trimesh.face[i].C()=vcg::Color4b::Scatter(trimeshPartitions.size(),TriPart[i]);\n\n#ifdef SAVE_MESHES_FOR_DEBUG\n   vcg::tri::io::ExporterOBJ<TriangleMesh>::Save(trimesh,\"results/test_tri.obj\", vcg::tri::io::Mask::IOM_FACECOLOR);\n\n\n   std::string setupFilename = meshFilename;\n   setupFilename.erase(partitionFilename.find_last_of(\".\"));\n   //setupFilename.append(\"_quadrangulation_setup.txt\");\n   setupFilename+=std::string(\"_\")+std::to_string(CurrNum)+std::string(\"_quadrangulation_setup\")+std::string(\".txt\");\n\n   SaveSetupFile(setupFilename, parameters, scaleFactor, fixedChartClusters);\n #endif\n}\n\n\ntypename TriangleMesh::ScalarType avgEdge(const TriangleMesh& trimesh)\n{\n    typedef typename TriangleMesh::ScalarType ScalarType;\n    ScalarType AvgVal=0;\n    size_t Num=0;\n    for (size_t i=0;i<trimesh.face.size();i++)\n        for (size_t j=0;j<3;j++)\n        {\n            AvgVal+=(trimesh.face[i].cP0(j)-trimesh.face[i].cP1(j)).Norm();\n            Num++;\n        }\n    return (AvgVal/Num);\n}\n\nvoid loadSetupFile(const std::string& path, QuadRetopology::Parameters& parameters, float& scaleFactor, int& fixedChartClusters)\n{\n    FILE *f=fopen(path.c_str(),\"rt\");\n    assert(f!=NULL);\n\n    float alphaF;\n    fscanf(f,\"alpha %f\\n\",&alphaF);\n    std::cout<<\"ALPHA \"<<alphaF<<std::endl;\n    parameters.alpha=alphaF;\n\n    int IntVar=0;\n    fscanf(f,\"ilpMethod %d\\n\",&IntVar);\n    if (IntVar==0)\n        parameters.ilpMethod=QuadRetopology::ILPMethod::ABS;\n    else\n        parameters.ilpMethod=QuadRetopology::ILPMethod::LEASTSQUARES;\n\n    float limitF;\n    fscanf(f,\"timeLimit %f\\n\",&limitF);\n    parameters.timeLimit=limitF;\n\n    float gapF;\n    fscanf(f,\"gapLimit %f\\n\",&gapF);\n    parameters.gapLimit=gapF;\n\n    IntVar=0;\n    fscanf(f,\"callbackTimeLimit %d\",&IntVar);\n    parameters.callbackTimeLimit.resize(IntVar);\n    for (int i = 0; i < IntVar; i++) {\n        fscanf(f,\" %f\", &parameters.callbackTimeLimit[i]);\n    }\n    fscanf(f,\"\\n\");\n\n    IntVar=0;\n    fscanf(f,\"callbackGapLimit %d\",&IntVar);\n    parameters.callbackGapLimit.resize(IntVar);\n    for (int i = 0; i < IntVar; i++) {\n        fscanf(f,\" %f\", &parameters.callbackGapLimit[i]);\n    }\n    fscanf(f,\"\\n\");\n\n    float mingapF;\n    fscanf(f,\"minimumGap %f\\n\",&mingapF);\n    parameters.minimumGap=mingapF;\n\n    IntVar=0;\n    fscanf(f,\"isometry %d\\n\",&IntVar);\n    if (IntVar==0)\n        parameters.isometry=false;\n    else\n        parameters.isometry=true;\n\n    IntVar=0;\n    fscanf(f,\"regularityQuadrilaterals %d\\n\",&IntVar);\n    if (IntVar==0)\n        parameters.regularityQuadrilaterals=false;\n    else\n        parameters.regularityQuadrilaterals=true;\n\n    IntVar=0;\n    fscanf(f,\"regularityNonQuadrilaterals %d\\n\",&IntVar);\n    if (IntVar==0)\n        parameters.regularityNonQuadrilaterals=false;\n    else\n        parameters.regularityNonQuadrilaterals=true;\n\n    float regularityNonQuadrilateralsWeight;\n    fscanf(f,\"regularityNonQuadrilateralsWeight %f\\n\",&regularityNonQuadrilateralsWeight);\n    parameters.regularityNonQuadrilateralsWeight=regularityNonQuadrilateralsWeight;\n\n    IntVar=0;\n    fscanf(f,\"alignSingularities %d\\n\",&IntVar);\n    if (IntVar==0)\n        parameters.alignSingularities=false;\n    else\n        parameters.alignSingularities=true;\n\n    float alignSingularitiesWeight;\n    fscanf(f,\"alignSingularitiesWeight %f\\n\",&alignSingularitiesWeight);\n    parameters.alignSingularitiesWeight=alignSingularitiesWeight;\n\n    IntVar=0;\n    fscanf(f,\"repeatLosingConstraintsIterations %d\\n\",&IntVar);\n    parameters.repeatLosingConstraintsIterations=IntVar;\n\n    IntVar=0;\n    fscanf(f,\"repeatLosingConstraintsQuads %d\\n\",&IntVar);\n    if (IntVar==0)\n        parameters.repeatLosingConstraintsQuads=false;\n    else\n        parameters.repeatLosingConstraintsQuads=true;\n\n    IntVar=0;\n    fscanf(f,\"repeatLosingConstraintsNonQuads %d\\n\",&IntVar);\n    if (IntVar==0)\n        parameters.repeatLosingConstraintsNonQuads=false;\n    else\n        parameters.repeatLosingConstraintsNonQuads=true;\n\n    IntVar=0;\n    fscanf(f,\"repeatLosingConstraintsAlign %d\\n\",&IntVar);\n    if (IntVar==0)\n        parameters.repeatLosingConstraintsAlign=false;\n    else\n        parameters.repeatLosingConstraintsAlign=true;\n\n    IntVar=0;\n    fscanf(f,\"hardParityConstraint %d\\n\",&IntVar);\n    if (IntVar==0)\n        parameters.hardParityConstraint=false;\n    else\n        parameters.hardParityConstraint=true;\n\n    fscanf(f,\"scaleFact %f\\n\",&scaleFactor);\n    \n    fscanf(f,\"fixedChartClusters %d\\n\",&fixedChartClusters);\n\n    fclose(f);\n}\n\nvoid SaveSetupFile(const std::string& path, QuadRetopology::Parameters& parameters, float& scaleFactor, int& fixedChartClusters)\n{\n    FILE *f=fopen(path.c_str(),\"wt\");\n    assert(f!=NULL);\n\n    fprintf(f,\"alpha %f\\n\", parameters.alpha);\n\n    if (parameters.ilpMethod==QuadRetopology::ILPMethod::ABS)\n        fprintf(f,\"ilpMethod 0\\n\");\n    else\n        fprintf(f,\"ilpMethod 1\\n\");\n\n    fprintf(f,\"timeLimit %f\\n\", parameters.timeLimit);\n\n    fprintf(f,\"gapLimit %f\\n\", parameters.gapLimit);\n\n    fprintf(f,\"callbackTimeLimit %d\", static_cast<int>(parameters.callbackTimeLimit.size()));\n    for (float& time : parameters.callbackTimeLimit) {\n        fprintf(f,\" %f\", time);\n    }\n    fprintf(f,\"\\n\");\n\n    fprintf(f,\"callbackGapLimit %d\", static_cast<int>(parameters.callbackGapLimit.size()));\n    for (float& gap : parameters.callbackGapLimit) {\n        fprintf(f,\" %f\", gap);\n    }\n    fprintf(f,\"\\n\");\n\n    fprintf(f,\"minimumGap %f\\n\", parameters.minimumGap);\n\n    if (parameters.isometry)\n        fprintf(f,\"isometry 1\\n\");\n    else\n        fprintf(f,\"isometry 0\\n\");\n\n    if (parameters.regularityQuadrilaterals)\n        fprintf(f,\"regularityQuadrilaterals 1\\n\");\n    else\n        fprintf(f,\"regularityQuadrilaterals 0\\n\");\n\n    if (parameters.regularityNonQuadrilaterals)\n        fprintf(f,\"regularityNonQuadrilaterals 1\\n\");\n    else\n        fprintf(f,\"regularityNonQuadrilaterals 0\\n\");\n\n    fprintf(f,\"regularityNonQuadrilateralsWeight %f\\n\", parameters.regularityNonQuadrilateralsWeight);\n\n    if (parameters.alignSingularities)\n        fprintf(f,\"alignSingularities 1\\n\");\n    else\n        fprintf(f,\"alignSingularities 0\\n\");\n\n    fprintf(f,\"alignSingularitiesWeight %f\\n\", parameters.alignSingularitiesWeight);\n\n    fprintf(f,\"repeatLosingConstraintsIterations %d\\n\", parameters.repeatLosingConstraintsIterations);\n\n    if (parameters.repeatLosingConstraintsQuads)\n        fprintf(f,\"repeatLosingConstraintsQuads 1\\n\");\n    else\n        fprintf(f,\"repeatLosingConstraintsQuads 0\\n\");\n\n    if (parameters.repeatLosingConstraintsNonQuads)\n        fprintf(f,\"repeatLosingConstraintsNonQuads 1\\n\");\n    else\n        fprintf(f,\"repeatLosingConstraintsNonQuads 0\\n\");\n\n    if (parameters.repeatLosingConstraintsAlign)\n        fprintf(f,\"repeatLosingConstraintsAlign 1\\n\");\n    else\n        fprintf(f,\"repeatLosingConstraintsAling 0\\n\");\n\n\n    if (parameters.hardParityConstraint)\n        fprintf(f,\"hardParityConstraint 1\\n\");\n    else\n        fprintf(f,\"hardParityConstraint 0\\n\");\n\n    fprintf(f,\"scaleFact %f\\n\", static_cast<float>(scaleFactor));\n\n    fprintf(f,\"fixedChartClusters %d\\n\", fixedChartClusters);\n\n    fclose(f);\n}\n\n//int FindCurrentNum(std::string &pathProject)\n//{\n//    int CurrNum=0;\n//    std::string BasePath=pathProject;\n//    BasePath.resize(BasePath.find_last_of(\"/\")+1);\n//    BasePath=\".\"+BasePath;\n//    std::cout<<\"basepath \"<<BasePath.c_str()<<std::endl;\n//    QDir directory(BasePath.c_str());\n\n//    QFile f(pathProject.c_str());\n//    QFileInfo fileInfo(f.fileName());\n//    QString filename(fileInfo.fileName());\n//    std::string NameFile=filename.toStdString();\n//    std::cout<<\"namefile \"<<NameFile.c_str()<<std::endl;\n//    NameFile.resize(NameFile.find_last_of(\".\"));\n//    std::string Filter=NameFile+\"_quadrangulation_smooth*.obj\";\n//    std::cout<<\"filter \"<<Filter.c_str()<<std::endl;\n\n////    TestPath+=\"*.obj\";\n//  // QStringList projectFiles = directory.entryList(QStringList() <<Filter.c_str(),QDir::Files);\n//    QStringList projectFiles = directory.entryList(QStringList(),QDir::Files);\n//    CurrNum=0;\n\n//    foreach(QString filename, projectFiles) {\n//        int Num;\n//        std::string TestScan=NameFile+\"%d.obj\";\n//        sscanf (filename.toStdString().c_str(),TestScan.c_str(),&Num);\n//        CurrNum=std::max(CurrNum,(Num+1));\n//        std::cout<<\"test \"<<Num<<std::endl;\n//    }\n//    return CurrNum;\n//}\n"
  },
  {
    "path": "components/quad_from_patches/mesh_types.h",
    "content": "#ifndef DEFAULTMESHTYPES_H\n#define DEFAULTMESHTYPES_H\n\n#include <vcg/complex/complex.h>\n#include <vcg/complex/algorithms/clean.h>\n#include <wrap/io_trimesh/export.h>\n\n/* ----- Polygon mesh ----- */\n\nclass PolyVertex;\nclass PolyFace;\nclass PolyEdge;\n\nstruct MyPolyTypes : public vcg::UsedTypes<\n        vcg::Use<PolyVertex>::AsVertexType,\n        vcg::Use<PolyEdge>::AsEdgeType,\n        vcg::Use<PolyFace>::AsFaceType>{};\n\n/***************************************************************************/\n/* Copyright(C) 2021\n\n\nThe authors of\n\nReliable Feature-Line Driven Quad-Remeshing\nSiggraph 2021\n\n\n All rights reserved.\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <https://www.gnu.org/licenses/>.\n****************************************************************************/\n\nclass PolyVertex : public vcg::Vertex<MyPolyTypes,\n        vcg::vertex::Coord3f,\n        vcg::vertex::Normal3f,\n        vcg::vertex::Color4b,\n        vcg::vertex::Qualityf,\n        vcg::vertex::BitFlags,\n        vcg::vertex::VFAdj,\n        vcg::vertex::CurvatureDirf>{};\n\nclass PolyFace : public vcg::Face<\n        MyPolyTypes,\n        vcg::face::PolyInfo,\n        vcg::face::VertexRef,\n        vcg::face::Normal3f,\n        vcg::face::Color4b,\n        vcg::face::Qualityf,\n        vcg::face::BitFlags,\n        vcg::face::PFVAdj,\n        vcg::face::PFFAdj,\n        vcg::face::PVFAdj,\n        vcg::face::CurvatureDirf,\n        vcg::face::Mark> {};\n\nclass PolyEdge : public vcg::Edge<\n        MyPolyTypes,\n        vcg::edge::VertexRef,\n        vcg::edge::BitFlags> {};\n\nclass PolyMesh : public vcg::tri::TriMesh<\n        std::vector<PolyVertex>,\n        std::vector<PolyEdge>,\n        std::vector<PolyFace>> {};\n\n\n/* ----- Triangle mesh ----- */\n\nclass TriangleVertex;\nclass TriangleFace;\nstruct MyTriangleTypes : public vcg::UsedTypes<\n        vcg::Use<TriangleVertex>::AsVertexType,\n        vcg::Use<TriangleFace>::AsFaceType>{};\n\nclass TriangleVertex : public vcg::Vertex<\n        MyTriangleTypes,\n        vcg::vertex::Coord3f,\n        vcg::vertex::Normal3f,\n        vcg::vertex::VFAdj,\n        vcg::vertex::Color4b,\n        vcg::vertex::Qualityf,\n        vcg::vertex::BitFlags,\n        vcg::vertex::CurvatureDirf>{};\n\nclass TriangleFace : public vcg::Face<\n        MyTriangleTypes,\n        vcg::face::VertexRef,\n        vcg::face::Normal3f,\n        vcg::face::Color4b,\n        vcg::face::Qualityd,\n        vcg::face::BitFlags,\n        vcg::face::FFAdj,\n        vcg::face::VFAdj,\n        vcg::face::CurvatureDirf,\n        vcg::face::Mark> {};\n\nclass TriangleMesh : public vcg::tri::TriMesh<\n        std::vector<TriangleVertex>,\n        std::vector<TriangleFace> > {\n\n\n\n//    void Perturb(VertexType &v,ScalarType Magnitudo)\n//    {\n//        ScalarType eps=std::numeric_limits<ScalarType>::epsilon()*Magnitudo;\n//        //take a random direction\n//        size_t granularity=10000;\n//        int IntX=(rand()%granularity)-granularity/2;\n//        int IntY=(rand()%granularity)-granularity/2;\n//        int IntZ=(rand()%granularity)-granularity/2;\n//        CoordType Dir=CoordType(IntX,IntY,IntZ);\n//        Dir.Normalize();\n//        Dir*=eps;\n//        //std::cout<<Dir.X()<<\";\"<<Dir.Y()<<\";\"<<Dir.Z()<<std::endl;\n//        v.P()+=Dir;\n//    }\n\n//    size_t NumDuplicatedV()\n//    {\n//        std::set<CoordType> Pos;\n//        vcg::tri::UpdateSelection<MeshType>::VertexClear(*this);\n//        size_t numDupl=0;\n//        for (size_t i=0;i<vert.size();i++)\n//        {\n//            if (Pos.count(vert[i].P())>0)\n//            {\n//                vert[i].SetS();\n//                numDupl++;\n//            }\n//            Pos.insert(vert[i].P());\n//        }\n//        return numDupl;\n//    }\n\n//    bool RepositionDuplicatedV()\n//    {\n//        size_t NumD=NumDuplicatedV();\n//        std::cout<<\"There are \"<<NumD<<\" duplicated vertices\"<<std::endl;\n\n//        if (NumD==0)return false;\n//        //int dilate_step=0;\n//        ScalarType Magnitudo=2;\n//        do\n//        {\n//            std::cout<<\"Repositioning \"<<NumD<<\" duplicated vertices\"<<std::endl;\n\n\n//            //            dilate_step++;\n//            //            for (size_t i=0;i<dilate_step;i++)\n//            //            {\n//            //                vcg::tri::UpdateSelection<MeshType>::FaceFromVertexLoose(*this);\n//            //                vcg::tri::UpdateSelection<MeshType>::VertexFromFaceLoose(*this);\n//            //            }\n//            for (size_t i=0;i<vert.size();i++)\n//                if (vert[i].IsS())Perturb(vert[i],Magnitudo);\n\n//            Magnitudo*=2;\n//            //vcg::tri::Smooth<MeshType>::VertexCoordLaplacian(*this,1,true);\n//            NumD=NumDuplicatedV();\n//        }\n//        while(NumD>0);\n//        vcg::tri::UpdateBounding<MeshType>::Box(*this);\n//        vcg::tri::UpdateNormal<MeshType>::PerVertexNormalizedPerFace(*this);\n//        vcg::tri::UpdateNormal<MeshType>::PerFaceNormalized(*this);\n//        return true;\n//    }\n\n//    bool RemoveZeroAreaF()\n//    {\n//        //        int nonManifV=0;\n//        //        int degF=0;\n\n//        int zeroAFace=0;\n//        bool modified=false;\n//        ScalarType Magnitudo=2;\n//        do{\n//            modified=false;\n//            for (size_t i=0;i<face.size();i++)\n//            {\n//                if (vcg::DoubleArea(face[i])>0)continue;\n//                Perturb(*face[i].V(0),Magnitudo);\n//                Perturb(*face[i].V(1),Magnitudo);\n//                Perturb(*face[i].V(2),Magnitudo);\n//                modified=true;\n//                zeroAFace++;\n//            }\n//            Magnitudo*=2;\n//        }while (modified);\n//        vcg::tri::Allocator<MeshType>::CompactEveryVector(*this);\n//        std::cout<<\"Adjusted \"<<zeroAFace<<\" zero area faces\"<<std::endl;\n//        //        std::cout<<\"Removed \"<<degF<<\" degenerate faces\"<<std::endl;\n//        //        std::cout<<\"Removed \"<<zeroAFace<<\" nonManifV \"<<std::endl;\n//        UpdateAttributes();\n//        return modified;\n//    }\n\n\npublic:\n\n    void UpdateAttributes()\n    {\n        vcg::tri::UpdateNormal<TriangleMesh>::PerFaceNormalized(*this);\n        vcg::tri::UpdateNormal<TriangleMesh>::PerVertexNormalized(*this);\n        vcg::tri::UpdateBounding<TriangleMesh>::Box(*this);\n        vcg::tri::UpdateTopology<TriangleMesh>::FaceFace(*this);\n        vcg::tri::UpdateTopology<TriangleMesh>::VertexFace(*this);\n        vcg::tri::UpdateFlags<TriangleMesh>::FaceBorderFromFF(*this);\n        vcg::tri::UpdateFlags<TriangleMesh>::VertexBorderFromFaceBorder(*this);\n    }\n\n//    void SolveGeometricIssues()\n//    {\n//        srand(0);\n//        bool HasRepositioned=false;\n//        bool HasSolvedZeroF=false;\n//        do{\n//            HasRepositioned=RepositionDuplicatedV();\n//            HasSolvedZeroF=RemoveZeroAreaF();\n//        }while (HasRepositioned || HasSolvedZeroF);\n//        UpdateAttributes();\n\n//    }\n};\n\n//void SelectMeshPatchBorders(TriangleMesh &mesh,const std::vector<size_t>  &FacePatches)\n//{\n//    //std::set<std::pair<size_t,size_t> > BorderPatches;\n//    vcg::tri::UpdateFlags<MeshType>::FaceClearFaceEdgeS(mesh);\n\n//    assert(FacePatches.size()==mesh.face.size());\n//    //first add borders\n//    for (size_t i=0;i<mesh.face.size();i++)\n//        for (size_t j=0;j<3;j++)\n//        {\n//            if (mesh.face[i].IsB(j))\n//            {\n//                    mesh.face[i].SetFaceEdgeS(j);\n//            }\n//            else\n//            {\n//                size_t FOpp=vcg::tri::Index(mesh,mesh.face[i].FFp(j));\n//                assert(FOpp!=i);\n//                if (FacePatches[i]<0)assert(FacePatches[i]==-1);\n//                //assert(FacePatches[i]>=0);\n\n//                if (FacePatches[i]!=FacePatches[FOpp])\n//                {\n//                        mesh.face[i].SetFaceEdgeS(j);\n//                }\n//            }\n//        }\n//}\n\nvoid ComputePerFacePatch(TriangleMesh &mesh,\n                         const std::vector<std::vector<size_t> >  &PatchFaces,\n                         std::vector<size_t>  &FacePatches)\n{\n    FacePatches.clear();\n    FacePatches.resize(mesh.face.size(),mesh.face.size()+1);\n    for (size_t i=0;i<PatchFaces.size();i++)\n        for (size_t j=0;j<PatchFaces[i].size();j++)\n        {\n            size_t IndexF=PatchFaces[i][j];\n            assert(IndexF<mesh.face.size());\n            FacePatches[IndexF]=i;\n        }\n    for (size_t i=0;i<FacePatches.size();i++)\n        assert(FacePatches[i]<mesh.face.size());\n}\n\nvoid SelectVertMeshPatchBorders(TriangleMesh &mesh,const std::vector<size_t>  &FacePatches)\n{\n    //std::set<std::pair<size_t,size_t> > BorderPatches;\n    vcg::tri::UpdateSelection<TriangleMesh>::VertexClear(mesh);\n\n    assert(FacePatches.size()==mesh.face.size());\n    //first add borders\n    for (size_t i=0;i<mesh.face.size();i++)\n        for (size_t j=0;j<3;j++)\n        {\n            if (mesh.face[i].IsB(j))\n            {\n                mesh.face[i].V0(j)->SetS();\n                mesh.face[i].V1(j)->SetS();\n            }\n            else\n            {\n                size_t FOpp=vcg::tri::Index(mesh,mesh.face[i].FFp(j));\n                assert(FOpp!=i);\n                //if (FacePatches[i]<0)assert(FacePatches[i]==-1);\n                //assert(FacePatches[i]>=0);\n\n                if (FacePatches[i]!=FacePatches[FOpp])\n                {\n                    mesh.face[i].V0(j)->SetS();\n                    mesh.face[i].V1(j)->SetS();\n                }\n            }\n        }\n}\n\nvoid CheckVertInPatch(TriangleMesh &mesh,\n                      const std::vector<size_t>  &PatchFaces,\n                      const std::vector<size_t>  &PatchCorners)\n{\n    //std::set<std::pair<size_t,size_t> > BorderPatches;\n    vcg::tri::UpdateSelection<TriangleMesh>::VertexClear(mesh);\n\n    //select patch vertices\n    for (size_t i=0;i<PatchFaces.size();i++)\n    {\n        size_t IndexF=PatchFaces[i];\n        for (size_t j=0;j<3;j++)\n            mesh.face[IndexF].V(j)->SetS();\n    }\n\n    for (size_t i=0;i<PatchCorners.size();i++)\n    {\n        size_t IndexV=PatchCorners[i];\n        assert(mesh.vert[IndexV].IsS());\n    }\n}\n\nvoid CheckManifoldPatch(TriangleMesh &mesh,\n                      const std::vector<size_t>  &PatchFaces)\n{\n    TriangleMesh testM;\n    vcg::tri::UpdateSelection<TriangleMesh>::Clear(mesh);\n\n    //select patch vertices\n    for (size_t i=0;i<PatchFaces.size();i++)\n    {\n        size_t IndexF=PatchFaces[i];\n        mesh.face[IndexF].SetS();\n    }\n    vcg::tri::UpdateSelection<TriangleMesh>::VertexFromFaceLoose(mesh);\n    vcg::tri::Append<TriangleMesh,TriangleMesh>::Mesh(testM,mesh,true);\n    testM.UpdateAttributes();\n    assert(vcg::tri::Clean<TriangleMesh>::CountNonManifoldEdgeFF(testM)==0);\n    assert(vcg::tri::Clean<TriangleMesh>::CountNonManifoldVertexFF(testM)==0);\n}\n\nvoid ExportPatch(TriangleMesh &mesh,\n                 const std::vector<size_t>  &PatchFaces)\n{\n    TriangleMesh testM;\n    vcg::tri::UpdateSelection<TriangleMesh>::Clear(mesh);\n\n    //select patch vertices\n    for (size_t i=0;i<PatchFaces.size();i++)\n    {\n        size_t IndexF=PatchFaces[i];\n        mesh.face[IndexF].SetS();\n    }\n    vcg::tri::UpdateSelection<TriangleMesh>::VertexFromFaceLoose(mesh);\n    vcg::tri::Append<TriangleMesh,TriangleMesh>::Mesh(testM,mesh,true);\n    testM.UpdateAttributes();\n    assert(vcg::tri::Clean<TriangleMesh>::CountNonManifoldEdgeFF(testM)==0);\n    assert(vcg::tri::Clean<TriangleMesh>::CountNonManifoldVertexFF(testM)==0);\n    vcg::tri::io::ExporterPLY<TriangleMesh>::Save(testM,\"test.ply\");\n}\n\nvoid CheckIntegrity(TriangleMesh &mesh,\n                    const std::vector<std::vector<size_t> >  &PatchFaces,\n                    const std::vector<std::vector<size_t>> &PatchCorners)\n{\n    std::vector<size_t>  FacePatches;\n    ComputePerFacePatch(mesh,PatchFaces,FacePatches);\n    SelectVertMeshPatchBorders(mesh,FacePatches);\n    for (size_t i=0;i<PatchCorners.size();i++)\n        for (size_t j=0;j<PatchCorners[i].size();j++)\n        {\n            size_t IndexV=PatchCorners[i][j];\n            assert(mesh.vert[IndexV].IsS());\n        }\n    //then check the corners belong to the patch\n    for (size_t i=0;i<PatchFaces.size();i++)\n    {\n//        if (i==41)\n//        {\n//            ExportPatch(mesh,PatchFaces[i]);\n//        }\n        //std::cout<<\"Checking Partition: \"<<i<<std::endl;\n        //CheckManifoldPatch(mesh,PatchFaces[i]);\n        CheckVertInPatch(mesh,PatchFaces[i],PatchCorners[i]);\n    }\n\n}\n\nvoid OrientIfNeeded(TriangleMesh &mesh,\n                    std::vector<std::vector<size_t> > &trimeshPartitions,\n                    std::vector<std::vector<size_t>> &trimeshCorners,\n                    std::vector<std::pair<size_t,size_t> > &trimeshFeatures,\n                    std::vector<size_t> &trimeshFeaturesC)\n{\n    std::cout<<\"CHECKING ORIENTATION\"<<std::endl;\n\n    mesh.UpdateAttributes();\n    bool IsOriented,IsOrientable;\n    IsOriented=vcg::tri::Clean<TriangleMesh>::IsCoherentlyOrientedMesh(mesh);\n    if (IsOriented)return;\n    std::cout<<\"MESH NEED TO BE RE-ORIENTED\"<<std::endl;\n\n    //save the index of original v and faces\n    for (size_t i=0;i<mesh.vert.size();i++)\n        mesh.vert[i].Q()=i;\n    for (size_t i=0;i<mesh.face.size();i++)\n        mesh.face[i].Q()=i;\n\n    //save sharp features as pair of vertices\n    std::set<std::pair<size_t,size_t> > SharpV;\n    for (size_t i=0;i<trimeshFeatures.size();i++)\n    {\n        size_t indexF=trimeshFeatures[i].first;\n        size_t indexE=trimeshFeatures[i].second;\n        assert(indexE<3);\n        assert(indexF<mesh.face.size());\n        size_t IndexV0=vcg::tri::Index(mesh,mesh.face[indexF].V0(indexE));\n        size_t IndexV1=vcg::tri::Index(mesh,mesh.face[indexF].V1(indexE));\n        std::pair<size_t,size_t> key(std::min(IndexV0,IndexV1),std::max(IndexV0,IndexV1));\n        SharpV.insert(key);\n    }\n    //then orient it coherently\n    vcg::tri::Clean<TriangleMesh>::OrientCoherentlyMesh(mesh, IsOriented,IsOrientable);\n    mesh.UpdateAttributes();\n\n    //then update sharp features\n    trimeshFeatures.clear();\n    for (size_t i=0;i<mesh.face.size();i++)\n        for (size_t j=0;j<3;j++)\n        {\n            size_t IndexV0=mesh.face[i].V0(j)->Q();\n            size_t IndexV1=mesh.face[i].V1(j)->Q();\n            assert(IndexV0!=IndexV1);\n            assert(IndexV0<mesh.vert.size());\n            assert(IndexV1<mesh.vert.size());\n            std::pair<size_t,size_t> key(std::min(IndexV0,IndexV1),std::max(IndexV0,IndexV1));\n            if (SharpV.count(key)>0)\n                trimeshFeatures.push_back(std::pair<size_t,size_t>(i,j));\n        }\n\n    if (!IsOrientable)\n    {\n        std::cout<<\"MESH IS NOT ORIENTABLE \"<<std::endl;\n        assert(0);\n    }\n}\n\n#endif // DEFAULTMESHTYPES_H\n"
  },
  {
    "path": "components/quad_from_patches/quad_from_patches.cpp",
    "content": "/***************************************************************************/\n/* Copyright(C) 2021\n\n\nThe authors of\n\nReliable Feature-Line Driven Quad-Remeshing\nSiggraph 2021\n\n\n All rights reserved.\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <https://www.gnu.org/licenses/>.\n****************************************************************************/\n\n#include \"quad_from_patches.h\"\n#include <quadretopology/quadretopology.h>\n#include <random>\n\n#ifdef SAVE_MESHES_FOR_DEBUG\n#include <igl/writeOBJ.h>\n#include <wrap/io_trimesh/export_obj.h>\n#endif\n\n\nnamespace qfp {\n\ntemplate<class PolyMesh, class TriangleMesh>\nvoid quadrangulationFromPatches(\n    TriangleMesh& trimesh,\n    const std::vector<std::vector<size_t>>& trimeshPartitions,\n    const std::vector<std::vector<size_t>>& trimeshCorners,\n    const std::vector<double>& chartEdgeLength,\n    const QuadRetopology::Parameters& parameters,\n    const int fixedChartClusters,\n    PolyMesh& quadmesh,\n    std::vector<std::vector<size_t>>& quadmeshPartitions,\n    std::vector<std::vector<size_t>>& quadmeshCorners,\n    std::vector<int>& ilpResult)\n{\n    assert(trimeshPartitions.size() == trimeshCorners.size() && chartEdgeLength.size() == trimeshPartitions.size());\n\n    //Get chart data\n    QuadRetopology::ChartData chartData = QuadRetopology::computeChartData(\n            trimesh,\n            trimeshPartitions,\n            trimeshCorners);\n\n\n    //Initialize ilp results\n    ilpResult.clear();\n    ilpResult.resize(chartData.subsides.size(), ILP_FIND_SUBDIVISION);\n\n    bool solvedCluster = false;\n    if (fixedChartClusters > 0 && fixedChartClusters < static_cast<int>(chartData.charts.size())) {\n        std::vector<int> chartCluster(chartData.charts.size(), -1);\n        bool clusterDone;\n        int lastClusterId = 0;\n        do {\n            clusterDone = false;\n            size_t firstChart = std::numeric_limits<size_t>::max();\n            for (size_t cId = 0; cId < chartData.charts.size() && firstChart == std::numeric_limits<size_t>::max(); ++cId) {\n                if (chartCluster[cId] == -1) {\n                    firstChart = cId;\n                }\n            }\n            if (firstChart < std::numeric_limits<size_t>::max()) {\n                int numInCluster = 0;\n\n                std::queue<size_t> queue;\n                queue.push(firstChart);\n\n                while (!queue.empty() && numInCluster < fixedChartClusters) {\n                    size_t currentChart = queue.front();\n                    queue.pop();\n\n                    if (chartCluster[currentChart] > -1)\n                        continue;\n\n                    const QuadRetopology::Chart& chart = chartData.charts[currentChart];\n                    chartCluster[currentChart] = lastClusterId;\n                    numInCluster++;\n\n                    for (size_t adjCId : chart.adjacentCharts) {\n                        if (chartCluster[adjCId] == -1) {\n                            if (chartCluster[adjCId] == -1)\n                                queue.push(adjCId);\n                        }\n                    }\n                }\n\n                std::cout << \"Initial cluster \" << lastClusterId << \" composed of \" << numInCluster << \" charts.\" << std::endl;\n\n                lastClusterId++;\n            }\n            else {\n                clusterDone = true;\n            }\n\n        } while (!clusterDone);\n\n        const int limitChartsForCluster = std::max(fixedChartClusters / 3, std::min(fixedChartClusters, 10));\n\n        for (int i = 0; i < lastClusterId; ++i) {\n            int numInCluster = 0;\n\n            std::set<size_t> chartsInCluster;\n            for (size_t cId = 0; cId < chartData.charts.size(); ++cId) {\n                if (chartCluster[cId] == i) {\n                    numInCluster++;\n                    chartsInCluster.insert(cId);\n                }\n            }\n\n            if (numInCluster < limitChartsForCluster) {\n                bool found = true;\n                while (!chartsInCluster.empty() && found) {\n                    size_t targetChart = std::numeric_limits<size_t>::max();\n                    size_t targetCluster = std::numeric_limits<size_t>::max();\n\n                    std::set<size_t>::iterator it = chartsInCluster.begin();\n\n                    do {\n                        size_t cId = *it;\n                        const QuadRetopology::Chart& chart = chartData.charts[cId];\n                        for (size_t adjCId : chart.adjacentCharts) {\n                            if (chartCluster[cId] == i && chartCluster[adjCId] != -1 && chartCluster[adjCId] != i) {\n                                targetChart = cId;\n                                targetCluster = chartCluster[adjCId];\n                                break;\n                            }\n                        }\n                        if (targetChart == std::numeric_limits<size_t>::max()) {\n                            it++;\n                        }\n                    } while (it != chartsInCluster.end() && targetChart == std::numeric_limits<size_t>::max());\n\n                    found = false;\n\n                    if (targetChart != std::numeric_limits<size_t>::max()) {\n                        chartCluster[targetChart] = targetCluster;\n                        chartsInCluster.erase(targetChart);\n\n                        found = true;\n                    }\n                }\n            }\n        }\n\n        int numClusters = 0;\n        for (int clusterId = 0; clusterId < lastClusterId; ++clusterId) {\n            int numInCluster = 0;\n\n            for (size_t cId = 0; cId < chartData.charts.size(); ++cId) {\n                if (chartCluster[cId] == clusterId) {\n                    numInCluster++;\n                }\n            }\n\n            if (numInCluster > 0) {\n                numClusters++;\n\n                std::cout << \"Cluster \" << clusterId << \" is composed of \" << numInCluster << \" charts.\" << std::endl;\n            }\n        }\n\n        if (numClusters > 1) {\n            std::cout << \"Patches clustered in: \" << numClusters << \" clusters.\" << std::endl;\n\n            int numFixed = 0;\n\n            std::vector<bool> subsideAlreadyFixed(chartData.subsides.size(), false);\n            for (size_t subsideId = 0; subsideId < chartData.subsides.size(); subsideId++) {\n                std::array<int, 2> incidentCharts = chartData.subsides[subsideId].incidentCharts;\n                const QuadRetopology::ChartSubside& subside = chartData.subsides[subsideId];\n\n                if (\n                        incidentCharts[0] != -1 &&\n                        incidentCharts[1] != -1 &&\n                        chartCluster[incidentCharts[0]] != chartCluster[incidentCharts[1]]\n                )\n                {\n                    if (!subsideAlreadyFixed[subsideId])\n                    {\n                        double edgeLength = 0.0;\n                        int numIncident = 0;\n                        for (int cId : incidentCharts) {\n                            if (cId >= 0) {\n                                edgeLength += chartEdgeLength[cId];\n                                numIncident++;\n                            }\n                        }\n                        edgeLength /= numIncident;\n\n                        double sideSubdivision = subside.length / edgeLength;\n                        if (!parameters.hardParityConstraint) {\n                            sideSubdivision /= 2.0;\n                        }\n\n                        //Round to nearest even number\n                        sideSubdivision = std::round(sideSubdivision / 2.0) * 2.0;\n\n                        sideSubdivision = std::max(static_cast<double>(MIN_SUBDIVISION_VALUE*2), sideSubdivision);\n\n                        ilpResult[subsideId] = static_cast<int>(std::round(sideSubdivision));\n                        assert(ilpResult[subsideId] % 2 == 0);\n\n                        numFixed++;\n\n                        subsideAlreadyFixed[subsideId] = true;\n                    }\n                }\n            }\n\n            std::cout << \"Fixed \" << numFixed << \" / \" << chartData.subsides.size() << \" subsides.\" << std::endl;\n\n\n\n            for (int clusterId = 0; clusterId < lastClusterId; ++clusterId) {\n                int numInCluster = 0;\n\n                std::vector<int> result(chartData.subsides.size(), ILP_IGNORE);\n                for (size_t subsideId = 0; subsideId < chartData.subsides.size(); subsideId++) {\n                    if (ilpResult[subsideId] >= 0) {\n                        result[subsideId] = ilpResult[subsideId];\n                    }\n                }\n\n                for (size_t cId = 0; cId < chartData.charts.size(); ++cId) {\n                    if (chartCluster[cId] == clusterId) {\n                        numInCluster++;\n                    }\n                }\n\n                if (numInCluster > 0) {\n                    solvedCluster = true;\n                    for (size_t subsideId = 0; subsideId < chartData.subsides.size(); subsideId++) {\n                        std::array<int, 2> incidentCharts = chartData.subsides[subsideId].incidentCharts;\n\n                        if ((incidentCharts[0] == -1 || chartCluster[incidentCharts[0]] == clusterId) && (incidentCharts[1] == -1 || chartCluster[incidentCharts[1]] == clusterId)) {\n                            result[subsideId] = ILP_FIND_SUBDIVISION;\n                        }\n                    }\n\n                    double gap;\n                    QuadRetopology::findSubdivisions(\n                        chartData,\n                        chartEdgeLength,\n                        parameters,\n                        gap,\n                        result);\n\n                    for (size_t subsideId = 0; subsideId < chartData.subsides.size(); subsideId++) {\n                        if (result[subsideId] != ILP_IGNORE && ilpResult[subsideId] == ILP_FIND_SUBDIVISION) {\n                            ilpResult[subsideId] = result[subsideId];\n                        }\n                    }\n                }\n            }\n        }\n    }\n    if (!solvedCluster) {\n        //Solve ILP to find best side size\n        double gap;\n        QuadRetopology::findSubdivisions(\n            chartData,\n            chartEdgeLength,\n            parameters,\n            gap,\n            ilpResult);\n    }\n\n    //Quadrangulate\n    std::vector<size_t> fixedPositionSubsides;\n    std::vector<int> quadmeshLabel;\n    QuadRetopology::quadrangulate(\n            trimesh,\n            chartData,\n            fixedPositionSubsides,\n            ilpResult,\n            parameters,\n            quadmesh,\n            quadmeshLabel,\n            quadmeshPartitions,\n            quadmeshCorners);\n}\n\n}\n"
  },
  {
    "path": "components/quad_from_patches/quad_from_patches.h",
    "content": "/***************************************************************************/\n/* Copyright(C) 2021\n\n\nThe authors of\n\nReliable Feature-Line Driven Quad-Remeshing\nSiggraph 2021\n\n\n All rights reserved.\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <https://www.gnu.org/licenses/>.\n****************************************************************************/\n\n#ifndef QUADFROMPATCHES_H\n#define QUADFROMPATCHES_H\n\n#include <quadretopology/quadretopology.h>\n\nnamespace qfp {\n\ntemplate<class PolyMesh, class TriangleMesh>\nvoid quadrangulationFromPatches(\n    TriangleMesh& trimesh,\n    const std::vector<std::vector<size_t>>& trimeshPartitions,\n    const std::vector<std::vector<size_t>>& trimeshCorners,\n    const std::vector<double>& chartEdgeLength,\n    const QuadRetopology::Parameters& parameters,\n    const int fixedChartClusters,\n    PolyMesh& quadmesh,\n    std::vector<std::vector<size_t>>& quadmeshPartitions,\n    std::vector<std::vector<size_t>>& quadmeshCorners,\n    std::vector<int>& ilpResult);\n\n\n}\n\n#include \"quad_from_patches.cpp\"\n\n#endif // QUADFROMPATCHES_H\n"
  },
  {
    "path": "components/quad_from_patches/quad_from_patches.pro",
    "content": "############################ TARGET AND FLAGS ############################\n\n#App config\nTARGET = quad_from_patches\nTEMPLATE = app\nCONFIG += c++11\nCONFIG -= app_bundle\n\n#Debug/release optimization flags\nCONFIG(debug, debug|release){\n    DEFINES += DEBUG\n}\nCONFIG(release, debug|release){\n    DEFINES -= DEBUG\n    #just uncomment next line if you want to ignore asserts and got a more optimized binary\n    CONFIG += FINAL_RELEASE\n}\n\n#Final release optimization flag\nFINAL_RELEASE {\n    unix:!macx{\n        QMAKE_CXXFLAGS_RELEASE -= -g -O2\n        QMAKE_CXXFLAGS += -O3 -DNDEBUG\n    }\n}\n\nmacx {\n    QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.13\n    QMAKE_MAC_SDK = macosx10.13\n}\n\n\n############################ LIBRARIES ############################\n\n#Setting library paths\ninclude(../../libs/libs.pri)\n\n#Configuration\ninclude(configuration.pri)\n\n#Quad retopology\ninclude($$QUADRETOPOLOGY_PATH/quadretopology.pri)\n\n#Libigl\nINCLUDEPATH += $$LIBIGL_PATH/include/\nQMAKE_CXXFLAGS += -isystem $$LIBIGL_PATH/include/\n\n#Vcglib\nINCLUDEPATH += $$VCGLIB_PATH\n\n#Eigen\nINCLUDEPATH += $$EIGEN_PATH\n\n#Boost\nINCLUDEPATH += $$BOOST_PATH\n\n#Gurobi\nINCLUDEPATH += $$GUROBI_PATH/include\nLIBS += -L$$GUROBI_PATH/lib -l$$GUROBI_COMPILER -l$$GUROBI_LIB\nDEFINES += GUROBI_DEFINED\n\n#Parallel computation\nunix:!mac {\n    QMAKE_CXXFLAGS += -fopenmp\n    LIBS += -fopenmp\n}\n#macx{\n#    QMAKE_CXXFLAGS += -Xpreprocessor -fopenmp -lomp -I/usr/local/include\n#    QMAKE_LFLAGS += -lomp\n#    LIBS += -L /usr/local/lib/usr/local/lib/libomp.dylib\n#}\n\nwin32{\n    DEFINES += NOMINMAX # Awful problem with windows..\n    DEFINES *= _USE_MATH_DEFINES\n    DEFINES *= _SCL_SECURE_NO_DEPRECATE\n    QMAKE_CXXFLAGS *= /bigobj\n}\n\n############################ PROJECT FILES ############################\n\nSOURCES +=  \\\n    load_save.cpp \\\n    main.cpp \\\n    quad_from_patches.cpp \\\n    quad_mesh_tracer.cpp\n\nHEADERS += \\\n    load_save.h \\\n    mesh_types.h \\\n    quad_from_patches.h \\\n    quad_mesh_tracer.h \\\n    smooth_mesh.h\n\n#Vcg ply (needed to save ply files)\nHEADERS += \\\n    $$VCGLIB_PATH/wrap/ply/plylib.h\nSOURCES += \\\n    $$VCGLIB_PATH/wrap/ply/plylib.cpp\n\n"
  },
  {
    "path": "components/quad_from_patches/quad_mesh_tracer.cpp",
    "content": "/***************************************************************************/\n/* Copyright(C) 2021\n\n\nThe authors of\n\nReliable Feature-Line Driven Quad-Remeshing\nSiggraph 2021\n\n\n All rights reserved.\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <https://www.gnu.org/licenses/>.\n****************************************************************************/\n\n#include \"quad_mesh_tracer.h\"\n\n#include <vcg/complex/algorithms/update/quality.h>\n#include <vcg/complex/algorithms/clean.h>\n\ntemplate <class PolyMeshType>\nvoid QuadMeshTracer<PolyMeshType>::updatePolymeshAttributes()\n{\n    vcg::tri::Clean<PolyMeshType>::RemoveDuplicateVertex(PolyM);\n    vcg::tri::Clean<PolyMeshType>::RemoveUnreferencedVertex(PolyM);\n    vcg::tri::UpdateTopology<PolyMeshType>::FaceFace(PolyM);\n    vcg::tri::UpdateFlags<PolyMeshType>::VertexBorderFromFaceAdj(PolyM);\n}\n\ntemplate <class PolyMeshType>\nvoid QuadMeshTracer<PolyMeshType>::InitSingularities()\n{\n    TracedEdges.clear();\n    TracingStack.clear();\n    vcg::tri::UpdateQuality<PolyMeshType>::VertexValence(PolyM);\n    for (size_t i=0;i<PolyM.face.size();i++) {\n        if (PolyM.face[i].VN() == 4) {\n            for (int j=0;j<PolyM.face[i].VN();j++)\n            {\n                if (PolyM.face[i].V(j)->IsB())continue;\n                if (PolyM.face[i].V(j)->Q() == 4)continue;\n\n                vcg::face::Pos<PFace> CurrP(&PolyM.face[i],j);\n\n                size_t IndexV=vcg::tri::Index(PolyM,CurrP.V());\n                VisitedVertices.insert(IndexV);\n\n                CurrP.FlipV();\n                TracingStack.push_back(CurrP);\n            }\n        }\n        else {\n            for (int j=0;j<PolyM.face[i].VN();j++)\n            {\n                vcg::face::Pos<PFace> CurrP(&PolyM.face[i],j);\n\n                size_t IndexV=vcg::tri::Index(PolyM,CurrP.V());\n                VisitedVertices.insert(IndexV);\n\n                size_t IndexV1=vcg::tri::Index(PolyM,CurrP.VFlip());\n                assert(IndexV1!=IndexV);\n                // add to traced paths\n                std::pair<size_t,size_t> key(std::min(IndexV,IndexV1),std::max(IndexV,IndexV1));\n                TracedEdges.insert(key);\n\n                typename PolyMeshType::FaceType* start = CurrP.F();\n                do {\n                    CurrP.FlipF();\n                    CurrP.FlipE();\n                    CurrP.FlipV();\n                    if (start != CurrP.F()) {\n                        TracingStack.push_back(CurrP);\n                    }\n                    CurrP.FlipV();\n                }\n                while (start != CurrP.F());\n            }\n        }\n    }\n    if (DebugMessages)\n        std::cout<<\"Inserted \"<<TracingStack.size()<<\" portals\"<<std::endl;\n}\n\ntemplate <class PolyMeshType>\nint QuadMeshTracer<PolyMeshType>::SplitIntoPatches()\n{\n    FacePatch.resize(PolyM.face.size(),-1);\n    std::vector<size_t> StackMoves;\n    vcg::tri::UpdateFlags<PolyMeshType>::FaceClearS(PolyM);\n    int currPartition=0;\n    while (true)\n    {\n        //find next seed\n        for (size_t i=0;i<PolyM.face.size();i++)\n        {\n            if (PolyM.face[i].IsS())\n                continue;\n            StackMoves.push_back(i);\n            break;\n        }\n        if (StackMoves.empty())\n            return currPartition;\n        if (DebugMessages)\n            std::cout<<\"Partition \"<<currPartition<<std::endl;\n        while (!StackMoves.empty())\n        {\n            size_t currF=StackMoves.back();\n            PolyM.face[currF].SetS();\n            StackMoves.pop_back();\n            FacePatch[currF]=currPartition;\n            for (int j=0;j<PolyM.face[currF].VN();j++)\n            {\n                size_t IndexV0=vcg::tri::Index(PolyM,PolyM.face[currF].V0(j));\n                size_t IndexV1=vcg::tri::Index(PolyM,PolyM.face[currF].V1(j));\n                std::pair<size_t,size_t> key(std::min(IndexV0,IndexV1),std::max(IndexV0,IndexV1));\n                //found a border edge\n                if (TracedEdges.count(key)>0)\n                    continue;\n                // go on the other size\n                size_t nextF=vcg::tri::Index(PolyM,PolyM.face[currF].FFp(j));\n                if (PolyM.face[nextF].IsS())\n                    continue;\n                if (nextF==currF)\n                    continue;\n                StackMoves.push_back(nextF);\n            }\n        }\n        currPartition++;\n    }\n    return -1;\n}\n\ntemplate <class PolyMeshType>\nvoid QuadMeshTracer<PolyMeshType>::DoTrace()\n{\n    if (DebugMessages)\n        std::cout<<TracingStack.size() << \" need to be traced! \"<<std::endl;\n\n    assert(!TracingStack.empty());\n    int step=0;\n    do{\n        vcg::face::Pos<PFace> CurrP=TracingStack.front();\n        TracingStack.pop_front();\n        size_t IndexV0=vcg::tri::Index(PolyM,CurrP.V());\n        size_t IndexV1=vcg::tri::Index(PolyM,CurrP.VFlip());\n        assert(IndexV1!=IndexV0);\n\n        // add to traced paths\n        std::pair<size_t,size_t> key(std::min(IndexV0,IndexV1),std::max(IndexV0,IndexV1));\n        TracedEdges.insert(key);\n\n        //already visited\n        if (VisitedVertices.count(IndexV0)>0)\n            continue;\n\n        //border reached\n        if (PolyM.vert[IndexV0].IsB())\n            continue;\n\n        //must been visited already\n        if (MotorCycle)\n        {\n            assert(VisitedVertices.count(IndexV1)>0);\n        }\n\n        if (MotorCycle)\n            VisitedVertices.insert(IndexV0);\n\n        //then go to next one\n        CurrP.FlipE();\n        CurrP.FlipF();\n        CurrP.FlipE();\n        CurrP.FlipV();\n\n        TracingStack.push_front(CurrP);\n\n        step++;\n        if (((step%100)==0)&&(DebugMessages))\n            std::cout<<\"Traced \"<<step<<\" separatrices\"<<std::endl;\n    }while (!TracingStack.empty());\n}\n\ntemplate <class PolyMeshType>\nvoid QuadMeshTracer<PolyMeshType>::ColorMesh()\n{\n    int NumPartitions=0;\n    for (size_t i=0;i<FacePatch.size();i++)\n        NumPartitions=std::max(NumPartitions,FacePatch[i]);\n\n    for (size_t i=0;i<PolyM.face.size();i++)\n    {\n        assert(FacePatch[i]>=0);\n        vcg::Color4b currC=vcg::Color4b::Scatter(NumPartitions,FacePatch[i]);\n        PolyM.face[i].C()=currC;\n    }\n}\n\ntemplate <class PolyMeshType>\nvoid QuadMeshTracer<PolyMeshType>::SaveColoredMesh(std::string PatchPath)\n{\n    ColorMesh();\n\n    vcg::tri::io::ExporterOBJ<PolyMeshType>::Save(PolyM,PatchPath.c_str(),vcg::tri::io::Mask::IOM_FACECOLOR);\n}\n\ntemplate <class PolyMeshType>\nvoid QuadMeshTracer<PolyMeshType>::SavePatchDecomposition(std::string &PatchFile)\n{\n    FILE *f=fopen(PatchFile.c_str(),\"wt\");\n    for (size_t i=0;i<FacePatch.size();i++)\n        fprintf(f,\"%d\\n\",FacePatch[i]);\n    fclose(f);\n}\n\ntemplate <class PolyMeshType>\nvoid QuadMeshTracer<PolyMeshType>::SaveTracedEdgeMesh(std::string &EdgePath)\n{\n    PolyMeshType TestEdge;\n    std::set<std::pair<size_t,size_t> >::iterator iteE;\n    for (iteE=TracedEdges.begin();iteE!=TracedEdges.end();iteE++)\n    {\n        typename PolyMeshType::CoordType pos0=PolyM.vert[(*iteE).first].P();\n        typename PolyMeshType::CoordType pos1=PolyM.vert[(*iteE).second].P();\n\n        vcg::tri::Allocator<PolyMeshType>::AddEdge(TestEdge,pos0,pos1);\n    }\n    vcg::tri::io::ExporterOBJ<PolyMeshType>::Save(TestEdge,EdgePath.c_str(),vcg::tri::io::Mask::IOM_EDGEINDEX);\n}\n\ntemplate <class PolyMeshType>\nvoid QuadMeshTracer<PolyMeshType>::TracePartitions()\n{\n    InitSingularities();\n\n    DoTrace();\n\n    SplitIntoPatches();\n}\n"
  },
  {
    "path": "components/quad_from_patches/quad_mesh_tracer.h",
    "content": "/***************************************************************************/\n/* Copyright(C) 2021\n\n\nThe authors of\n\nReliable Feature-Line Driven Quad-Remeshing\nSiggraph 2021\n\n\n All rights reserved.\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <https://www.gnu.org/licenses/>.\n****************************************************************************/\n\n#ifndef QUAD_MESH_TRACER_H\n#define QUAD_MESH_TRACER_H\n\n#include <set>\n#include <vector>\n\n#include <Eigen/Core>\n\n#include <vcg/complex/complex.h>\n#include <wrap/io_trimesh/export_obj.h>\n\ntemplate <class PolyMeshType>\nclass QuadMeshTracer\n{\n    typedef typename PolyMeshType::FaceType PFace;\n\n    PolyMeshType &PolyM;\n\n    std::deque<vcg::face::Pos<PFace> > TracingStack;\n    std::set<size_t> VisitedVertices;\n    std::set<std::pair<size_t,size_t> > TracedEdges;\n\npublic:\n    QuadMeshTracer(PolyMeshType &_PolyM):PolyM(_PolyM){}\n\n    bool MotorCycle=false;\n    std::vector<int> FacePatch;\n    bool DebugMessages=false;\n\n    void updatePolymeshAttributes();\n    void InitSingularities();\n    int SplitIntoPatches();\n    void DoTrace();\n\n    void ColorMesh();\n\n    void SaveColoredMesh(std::string PatchPath);\n    void SavePatchDecomposition(std::string &PatchFile);\n    void SaveTracedEdgeMesh(std::string &EdgePath);\n\n    void TracePartitions();\n};\n\n#include \"quad_mesh_tracer.cpp\"\n\n#endif // QUAD_MESH_TRACER_H\n"
  },
  {
    "path": "components/quad_from_patches/quadrangulate_300_mechanical.command",
    "content": "\nfor i in ../../test/300/Mechanical/*.obj; do\n\n\n    complete_file=\"${i}\"\n    only_file_name=$(basename $complete_file)\n    dir_name=\"${complete_file%.*}\"\n    dir_name+=\"/\"\n\n\n    new_filename=\"${dir_name}\"\"${only_file_name}\"\n    new_filename2=$(echo $new_filename | sed 's/\\(.*\\)\\..*/\\1/')\n    new_filename3=\"$new_filename2\"\"_rem_p0.obj\"\n\n    ./quad_from_patches \"${new_filename3}\"\ndone\n"
  },
  {
    "path": "components/quad_from_patches/quadrangulate_300_organic.command",
    "content": "\nfor i in ../../test/300/Organic/*.obj; do\n\n\n    complete_file=\"${i}\"\n    only_file_name=$(basename $complete_file)\n    dir_name=\"${complete_file%.*}\"\n    dir_name+=\"/\"\n\n\n    new_filename=\"${dir_name}\"\"${only_file_name}\"\n    new_filename2=$(echo $new_filename | sed 's/\\(.*\\)\\..*/\\1/')\n    new_filename3=\"$new_filename2\"\"_rem_p0.obj\"\n\n    ./quad_from_patches \"${new_filename3}\"\ndone\n"
  },
  {
    "path": "components/quad_from_patches/quadrangulate_loopy_cuts.command",
    "content": "./quad_from_patches ./../../test/LoopyCuts/1/1_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/12/12_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/3_holes/3_holes_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/4/4_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/5/5_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/6/6_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/anc_101_a1/MIQ/anc_101_a1_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/anc_101_a1/NPoly/anc_101_a1_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/angel/angel_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/anti_backlash_nut/0/MIQ/anti_backlash_nut_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/anti_backlash_nut/0/NPoly/anti_backlash_nut_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/anti_backlash_nut/1/MIQ/anti_backlash_nut_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/anti_backlash_nut/1/NPoly/anti_backlash_nut_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/armadillo/0/armadillo_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/armadillo/1/armadillo_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/armadillo_mauri/armadillo_mauri_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/asm007/asm007_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/bamboo_pen/bamboo_pen_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/bamboo_pen_rem/0/bamboo_pen_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/bamboo_pen_rem/1/bamboo_pen_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/bear0/bear0_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/bear1/bear1_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/bearing_plate/bearing_plate_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/BendTube/BendTube_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/beveled_shoulder_1/beveled_shoulder_1_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/beveled_shoulder_2/beveled_shoulder_2_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/bigguy/bigguy_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/bimba/bimba_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/blade/blade_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/bladefem/bladefem_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/blech/blech_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/blockLP/blockLP_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/boat/boat_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/bolt/bolt_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/bone/bone_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/bone1/bone1_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/botijo/botijo_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/bozbezbozzel/bozbezbozzel_rem_clean_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/BracketInches/0/BracketInches_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/BracketInches/1/BracketInches_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/bumpy/bumpy_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/bunny/bunny_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/bunny_alessia/bunny_alessia_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/buste/buste_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/busto_bimba/busto_bimba_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/cactus/cactus_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/camille_hand/camille_hand_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/cap_thing/cap_thing_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/carter/carter_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/casting/casting_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/casting/casting_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/cat/cat_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/chinese_lion/chinese_lion_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/clef/clef_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/complex_knot/complex_knot_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/CoverSlipCleaningHolder2b/CoverSlipCleaningHolder2b_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/cube/cube_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/cube_carved/cube_carved_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/cube_minus_sphere/cube_minus_sphere_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/cup/cup_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/cylinder_plate/cylinder_plate_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/dancer/dancer_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/dancing_children/dancing_children_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/deckel/deckel_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/delta_arm_base/0/delta_arm_base_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/delta_arm_base/1/delta_arm_base_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/des6/0/des6_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/des6/1/des6_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/des7/0/des7_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/des7/1/des7_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/dino0/dino0_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/dino1/dino1_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/dog/dog_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/double_torus/double_torus_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/doubletorus/doubletorus_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/dragon0/dragon0_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/duck/duck_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/elephant/elephant_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/ellipse/ellipse_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/eraser_ball/eraser_ball_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/fandisk/MIQ/fandisk_new_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/fandisk/NPoly/fandisk_new_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/fertility/0/fertility_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/fertility/1/fertility_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/fish0/fish0_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/fusee/fusee_Lp_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/gargoyle/0/gargoyle_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/gargoyle/1/gargoyle_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/gear/gear_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/graylock/graylock_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/greek/greek_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/guy/guy_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/gyroidpuzzle/MIQ/gyroidpuzzle_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/gyroidpuzzle/NPoly/gyroidpuzzle_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/halved_oblique_scarf_1/halved_oblique_scarf_1_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/halved_oblique_scarf_2/halved_oblique_scarf_2_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/halved_oblique_scarf_3/halved_oblique_scarf_3_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/hand/hand_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/hinge/hinge_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/holes2/holes2_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/Hub/Hub_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/impeller/impeller_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/indorelax/indorelax_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/inlay_dovetail_1/0/inlay_dovetail_1_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/inlay_dovetail_1/1/inlay_dovetail_1_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/inlay_dovetail_3/inlay_dovetail_3_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/israel/israel_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/joint/0/joint_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/joint/1/joint_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/kitten/kitten_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/knob/knob_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/knot/knot_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/kong/kong_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/lego/0/lego_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/lego/1/lego_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/lever_arm/lever_arm_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/lion/lion_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/lock_Lp/MIQ/lock_Lp_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/lock_Lp/NPoly/lock_Lp_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/LowerControlArm/LowerControlArm_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/mazewheel/mazewheel_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/mech09/0/mech09_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/mech09/1/mech09_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/mech10/mech10_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/mech_piece/mech_piece_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/mechanical01/mechanical01_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/mechanical02/mechanical02_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/mechanical03/mechanical03_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/mechanical04/mechanical04_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/mechanical05/mechanical05_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/mechanical06/mechanical06_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/mechanical07/mechanical07_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/mechanical08/mechanical08_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/metatron/MIQ/metatron_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/metatron/NPoly/metatron_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/mid2Fem/mid2Fem_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/mnf07HeadFem/mnf07HeadFem_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/motor_tail/motor_tail_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/mount/mount_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/mouse/0/mouse_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/mouse/1/mouse_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/mechanical01/mechanical01_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/nasty_cheese/MIQ/nasty_cheese_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/nasty_cheese/NPoly/nasty_cheese_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/no_name/no_name_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/nugear/nugear_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/octopus/octopus_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/pegaso/pegaso_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/pig/pig_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/pinion/MIQ/pinion_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/pinion/NPoly/pinion_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/plate_lp/plate_lp_mid_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/prism/prism_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/pump/0/pump_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/pump/1/pump_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/rabbit/rabbit_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/rockerarm/rockerarm_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/rod/rod_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/RotorHub/MIQ/RotorHub_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/RotorHub/NPoly/RotorHub_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/santa/santa_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/sculpt/sculpt_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/shaft/shaft_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/sharp_sphere/sharp_sphere_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/sphinx/sphinx_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/spring/spring_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/square_torus/square_torus_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/teapot/teapot_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/thai/0/thai_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/thai/1/thai_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/toothbrush_holder/toothbrush_holder_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/torque/torque_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/torque1/torque1_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/torus/torus_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/torus2/torus2_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/TransmissionHousingFem/0/TransmissionHousingFem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/TransmissionHousingFem/1/TransmissionHousingFem_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/trebol/trebol_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/tris_closed/tris_closed_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/tris_open/tris_open_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/turbine_lp/turbine_lp_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/ujoint/ujoint_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/vase0/vase0_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/Vertebrae/Vertebrae_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/wave/wave_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/wedge/wedge_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/wedge_with_base/0/wedge_with_base_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/wedge_with_base/1/wedge_with_base_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/WheelDassault/WheelDassault_rem_rem_p0.obj 0\n./quad_from_patches ./../../test/LoopyCuts/wrench/wrench_rem_p0.obj 0\n"
  },
  {
    "path": "components/quad_from_patches/quadrangulatedataset.sh",
    "content": "#USAGE: command dataset_path test_number\n#\n#EXAMPLE: ./quadrangulatedataset.sh /mnt/OS/Workspace/Progetti/supercaprettolation/build-quad_from_patches-Desktop_Qt_5_13_1_GCC_64bit-Release/quad_from_patches /mnt/OS/Workspace/Dataset/quadrangulation 0 > /mnt/OS/Workspace/Dataset/quadrangulation/log0.txt\n\nexecutable=\"$1\"\ndatasetpath=\"$2\"\ntestnumber=\"$3\"\n\nquadrangulate_recursive() {\n\tfor filename in \"$1\"/*.obj; do\n\t\tcase $filename in (*\\_p[+0-9].obj)\n\t\t\techo $'\\n\\n--------------------------------\\n'\n\t\t\techo $filename\n\t\t\techo $'\\n---------------------------------\\n\\n'\n\t\t\t\"$executable\" \"$filename\" \"$testnumber\"\n\t\tesac\n\tdone\n\n\tfor i in \"$1\"/*; do\n\t\tif [ -d \"$i\" ]; then\n\t\t\tquadrangulate_recursive \"$i\"\n\t\tfi\n\tdone\n}\n\nquadrangulate_recursive \"$datasetpath\"\n"
  },
  {
    "path": "components/quad_from_patches/smooth_mesh.h",
    "content": "/***************************************************************************/\n/* Copyright(C) 2021\n\n\nThe authors of\n\nReliable Feature-Line Driven Quad-Remeshing\nSiggraph 2021\n\n\n All rights reserved.\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <https://www.gnu.org/licenses/>.\n****************************************************************************/\n\n#ifndef SMOOTH_MESH_H\n#define SMOOTH_MESH_H\n\n#include <vector>\n#include <vcg/complex/algorithms/polygonal_algorithms.h>\n#include <wrap/io_trimesh/export.h>\n#include <vcg/complex/algorithms/implicit_smooth.h>\n#include \"local_para_smooth.h\"\n#include <vcg/space/distance3.h>\n#include <vcg/space/index/grid_static_ptr.h>\n//#include \"field_smoother.h\"\n\n///* ----- Triangle mesh ----- */\n\nclass BasicVertex;\nclass BasicEdge;\nclass BasicFace;\n\nstruct MyBasicTypes : public vcg::UsedTypes<\n        vcg::Use<BasicVertex>::AsVertexType,\n        vcg::Use<BasicEdge>::AsEdgeType,\n        vcg::Use<BasicFace>::AsFaceType>{};\n\nclass BasicVertex : public vcg::Vertex<\n        MyBasicTypes,\n        vcg::vertex::Normal3f,\n        vcg::vertex::Coord3f,\n        vcg::vertex::BitFlags>{};\n\nclass BasicEdge : public vcg::Edge<\n        MyBasicTypes,\n        vcg::edge::VertexRef,\n        vcg::edge::BitFlags> {};\n\nclass BasicFace : public vcg::Face<\n        MyBasicTypes,\n        vcg::face::VertexRef,\n        vcg::face::BitFlags,\n        vcg::face::Mark> {};\n\nclass BasicMesh : public vcg::tri::TriMesh<\n        std::vector<BasicVertex>,\n        std::vector<BasicEdge>,\n        std::vector<BasicFace> > {};\n\ntemplate <class TriangleMeshType>\nvoid ExtractEdgeMesh(const TriangleMeshType &triMesh,\n                     const std::vector<std::pair<size_t,size_t> > features,\n                     BasicMesh &EdgeMesh)\n{\n    //    typedef typename TriangleMeshType::FaceType TriFaceType;\n    //    typedef typename TriangleMeshType::ScalarType TriScalarType;\n    typedef typename TriangleMeshType::CoordType CoordType;\n\n    EdgeMesh.Clear();\n    for (size_t i=0;i<features.size();i++)\n    {\n        size_t IndexF=features[i].first;\n        size_t IndexE=features[i].second;\n        CoordType P0=triMesh.face[IndexF].cP0(IndexE);\n        CoordType P1=triMesh.face[IndexF].cP1(IndexE);\n        vcg::tri::Allocator<BasicMesh>::AddEdge(EdgeMesh,P0,P1);\n    }\n    vcg::tri::Clean<BasicMesh>::RemoveDuplicateVertex(EdgeMesh);\n    vcg::tri::Clean<BasicMesh>::RemoveDuplicateEdge(EdgeMesh);\n    vcg::tri::Allocator<BasicMesh>::CompactEveryVector(EdgeMesh);\n}\n\n\nvoid ClosestPointEMesh(const typename BasicMesh::CoordType &Pos,\n                       const BasicMesh &EdgeMesh,\n                       size_t &IndexE,\n                       typename BasicMesh::ScalarType &t,\n                       typename BasicMesh::ScalarType &MinD,\n                       typename BasicMesh::CoordType &Clos)\n{\n    typedef typename BasicMesh::ScalarType ScalarType;\n    typedef typename BasicMesh::CoordType CoordType;\n    MinD=std::numeric_limits<ScalarType>::max();\n    for (size_t i=0;i<EdgeMesh.edge.size();i++)\n    {\n        CoordType P0=EdgeMesh.edge[i].V(0)->P();\n        CoordType P1=EdgeMesh.edge[i].V(1)->P();\n        vcg::Segment3<ScalarType> STest(P0,P1);\n        ScalarType testD;\n        CoordType ClosTest;\n        vcg::SegmentPointDistance(STest,Pos,ClosTest,testD);\n        if (testD>MinD)continue;\n        Clos=ClosTest;\n        MinD=testD;\n        IndexE=i;\n        t=1-(Clos-P0).Norm()/(P1-P0).Norm();\n    }\n}\n\n//enum VType{Internal,Feature,Corner};\n\n\ntemplate <class PolyMeshType,class TriangleMeshType>\nvoid GetCorners(//const std::vector<std::pair<size_t,size_t> > &FeatureEdges,\n                const std::vector<size_t > &tri_feature_C,\n                const TriangleMeshType &tri_mesh,\n                const std::vector<size_t > &quad_corner,\n                const PolyMeshType &poly_mesh,\n                //const typename PolyMeshType::ScalarType &AvEdge,\n                std::vector<size_t> &cornersIdx)\n{\n    cornersIdx.clear();\n    typedef typename PolyMeshType::ScalarType ScalarType;\n    typedef typename PolyMeshType::CoordType CoordType;\n\n    for (size_t i=0;i<tri_feature_C.size();i++)\n    {\n        CoordType TriCorner=tri_mesh.vert[tri_feature_C[i]].P();\n        ScalarType MinD=std::numeric_limits<ScalarType>::max();\n        size_t CornerI=0;\n        for (size_t j=0;j<quad_corner.size();j++)\n        {\n            CoordType TestPos=poly_mesh.vert[quad_corner[j]].P();\n            ScalarType TestD=(TriCorner-TestPos).Norm();\n            if (TestD>MinD)continue;\n            MinD=TestD;\n            CornerI=quad_corner[j];\n        }\n        //if (MinD>AvEdge)continue;\n        cornersIdx.push_back(CornerI);\n    }\n}\n\n\nenum ProjType{ProjNone,ProjSuface,ProjSharp,ProjCorner};\nstruct ProjectionBase\n{\n    std::vector<ProjType> VertProjType;\n    //edge sequences as pair of vertices\n    std::vector<std::vector<std::pair<size_t,size_t> > > SharpEdge;\n    //indexes of vertices\n    //std::vector<size_t> Corner;\n    void Clear()\n    {VertProjType.clear();SharpEdge.clear();}//Corner.clear();}\n};\n\nenum SmoothType{Laplacian,TemplateFit};\n\ntemplate <class PolyMeshType>\nvoid LaplacianEdgePos(const PolyMeshType &poly_mesh,\n                      const ProjectionBase &PolyProjBase,\n                      const typename PolyMeshType::ScalarType Damp,\n                      std::vector<typename PolyMeshType::CoordType> &TargetPos,\n                      const std::vector<bool> &BlockedF,\n                      const std::vector<bool> &BlockedV)\n{\n    //typedef typename PolyMeshType::ScalarType ScalarType;\n    typedef typename PolyMeshType::CoordType CoordType;\n    typedef typename PolyMeshType::FaceType FaceType;\n\n    TargetPos = std::vector<CoordType>(poly_mesh.vert.size(),CoordType(0,0,0));\n    std::vector<size_t> NumPos(poly_mesh.vert.size(),0);\n    for (size_t i=0;i<poly_mesh.face.size();i++)\n    {\n        int sizeP=poly_mesh.face[i].VN();\n        for (size_t j=0;j<poly_mesh.face[i].VN();j++)\n        {\n            FaceType *oppF=poly_mesh.face[i].FFp(j);\n            size_t oppI=vcg::tri::Index(poly_mesh,oppF);\n            bool AddContribute=true;\n            //only once for edge\n            //if (oppF<&poly_mesh.face[i])AddContribute=false;\n            if (BlockedF[i])AddContribute=false;\n            if (BlockedF[oppI])AddContribute=false;\n            if (!AddContribute)continue;\n            CoordType Pos0=poly_mesh.face[i].cP(j);\n            CoordType Pos1=poly_mesh.face[i].cP((j+1)%sizeP);\n            size_t VIndex0=vcg::tri::Index(poly_mesh,poly_mesh.face[i].V(j));\n            size_t VIndex1=vcg::tri::Index(poly_mesh,poly_mesh.face[i].V((j+1)%sizeP));\n            TargetPos[VIndex0]+=Pos1;\n            TargetPos[VIndex1]+=Pos0;\n            NumPos[VIndex0]++;\n            NumPos[VIndex1]++;\n        }\n    }\n\n    for (size_t i=0;i<TargetPos.size();i++)\n    {\n        if (NumPos[i]==0)\n            TargetPos[i]=poly_mesh.vert[i].cP();\n        else\n            TargetPos[i]/=NumPos[i];\n    }\n\n    for (size_t i=0;i<poly_mesh.vert.size();i++)\n    {\n        //if (FixS && (poly_mesh.vert[i].IsS()))continue;\n        if ((PolyProjBase.VertProjType[i]==ProjCorner)||(BlockedV[i]))\n            //if (BlockedV[i])\n            TargetPos[i]=poly_mesh.vert[i].cP();\n        else\n            TargetPos[i]=poly_mesh.vert[i].cP()*Damp+TargetPos[i]*(1-Damp);\n    }\n}\n\ntemplate <class PolyMeshType>\nvoid LaplacianPos(const PolyMeshType &poly_mesh,\n                  const typename PolyMeshType::ScalarType Damp,\n                  std::vector<typename PolyMeshType::CoordType> &TargetPos,\n                  bool only_sel_contribute)\n{\n    //typedef typename PolyMeshType::ScalarType ScalarType;\n    typedef typename PolyMeshType::CoordType CoordType;\n    typedef typename PolyMeshType::FaceType FaceType;\n\n    TargetPos = std::vector<CoordType>(poly_mesh.vert.size(),CoordType(0,0,0));\n    std::vector<size_t> NumPos(poly_mesh.vert.size(),0);\n    for (size_t i=0;i<poly_mesh.face.size();i++)\n    {\n        int sizeP=poly_mesh.face[i].VN();\n        for (int j=0;j<poly_mesh.face[i].VN();j++)\n        {\n            FaceType *oppF=poly_mesh.face[i].FFp(j);\n            //size_t oppI=vcg::tri::Index(poly_mesh,oppF);\n            bool AddContribute=true;\n            //only once for edge\n            if (oppF<&poly_mesh.face[i])AddContribute=false;\n            //if (BlockedF[i])AddContribute=false;\n            //if (BlockedF[oppI])AddContribute=false;\n            if (!AddContribute)continue;\n            CoordType Pos0=poly_mesh.face[i].cP(j);\n            CoordType Pos1=poly_mesh.face[i].cP((j+1)%sizeP);\n            size_t VIndex0=vcg::tri::Index(poly_mesh,poly_mesh.face[i].V(j));\n            size_t VIndex1=vcg::tri::Index(poly_mesh,poly_mesh.face[i].V((j+1)%sizeP));\n            bool IsS0=poly_mesh.vert[VIndex0].IsS();\n            bool IsS1=poly_mesh.vert[VIndex1].IsS();\n\n            if ((!only_sel_contribute)||((only_sel_contribute)&&(IsS1)))\n            {\n                NumPos[VIndex0]++;\n                TargetPos[VIndex0]+=Pos1;\n            }\n\n            if ((!only_sel_contribute)||((only_sel_contribute)&&(IsS0)))\n            {\n                NumPos[VIndex1]++;\n                TargetPos[VIndex1]+=Pos0;\n            }\n        }\n    }\n\n    for (size_t i=0;i<TargetPos.size();i++)\n    {\n        if (NumPos[i]<=1)\n            TargetPos[i]=poly_mesh.vert[i].cP();\n        else\n        {\n            CoordType AvgPos=TargetPos[i]/NumPos[i];\n            TargetPos[i]=poly_mesh.vert[i].cP()*Damp + AvgPos*(1-Damp);\n        }\n    }\n}\n\ntemplate <class PolyMeshType>\nvoid TemplatePos(PolyMeshType &poly_mesh,\n                 const ProjectionBase &PolyProjBase,\n                 const typename PolyMeshType::ScalarType Damp,\n                 std::vector<typename PolyMeshType::CoordType> &TargetPos)\n{\n    //typedef typename PolyMeshType::ScalarType ScalarType;\n    typedef typename PolyMeshType::CoordType CoordType;\n\n    TargetPos.clear();\n\n    //save old position\n    vcg::tri::UpdateFlags<PolyMeshType>::VertexClearS(poly_mesh);\n    std::vector<CoordType> OldPos;\n    for (size_t i=0;i<poly_mesh.vert.size();i++)\n    {\n        if ((PolyProjBase.VertProjType[i]==ProjCorner)||\n                (PolyProjBase.VertProjType[i]==ProjSharp))\n            poly_mesh.vert[i].SetS();\n\n        OldPos.push_back(poly_mesh.vert[i].P());\n    }\n\n    //smooth\n    vcg::PolygonalAlgorithm<PolyMeshType>::SmoothPCA(poly_mesh,1,Damp,true,true,0.3,true,true);\n\n    vcg::tri::UpdateFlags<PolyMeshType>::VertexClearS(poly_mesh);\n\n    for (size_t i=0;i<poly_mesh.vert.size();i++)\n    {\n        TargetPos.push_back(poly_mesh.vert[i].P());\n        poly_mesh.vert[i].P()=OldPos[i];\n    }\n}\n\n\ntemplate <class PolyMeshType,class TriMeshType>\nvoid GetQuadInterpW(const typename TriMeshType::FaceType &FTris,\n                    const typename PolyMeshType::FaceType &FPoly,\n                    const typename TriMeshType::CoordType &ClosestPt,\n                    std::vector<typename TriMeshType::ScalarType> &VertWeigths)\n{\n    typedef typename PolyMeshType::ScalarType ScalarType;\n    typedef typename PolyMeshType::CoordType CoordType;\n    //typedef typename TriMeshType::FaceType TriFaceType;\n\n    VertWeigths.clear();\n    VertWeigths=std::vector<ScalarType>(4,0);\n\n    //get the barycentric coordinates\n    CoordType bary;\n    //bool Interpolated=\n    vcg::InterpolationParameters(FTris,ClosestPt,bary);\n\n    //then check which are the index of the vertices\n    int IndexV[3]={-1,-1,-1};\n    for (size_t i=0;i<3;i++)\n    {\n        for (size_t j=0;j<4;j++)\n        {\n            if (FTris.cV(i)->cQ()==FPoly.cV(j)->cQ())\n            {\n                IndexV[i]=j;\n                break;\n            }\n        }\n    }\n\n    //then check there in only and only one -1\n    assert((IndexV[0]==-1)||(IndexV[1]==-1)||(IndexV[2]==-1));\n    assert((IndexV[0]!=IndexV[1])&&(IndexV[1]!=IndexV[2])&&(IndexV[0]!=IndexV[2]));\n\n    for (size_t i=0;i<3;i++)\n        bary.V(i)=std::max(bary.V(i),(ScalarType)0);\n    //then set the weights\n    for (size_t i=0;i<3;i++)\n    {\n        assert(bary.V(i)>=0);\n        //distribute on all\n        if (IndexV[i]==-1)\n        {\n            VertWeigths[0]+=bary.V(i)/4;\n            VertWeigths[1]+=bary.V(i)/4;\n            VertWeigths[2]+=bary.V(i)/4;\n            VertWeigths[3]+=bary.V(i)/4;\n        }\n        else\n        {\n            assert(IndexV[i]>=0);\n            assert(IndexV[i]<4);\n            VertWeigths[IndexV[i]] =bary.V(i);\n        }\n    }\n\n    //finally normalize\n    ScalarType Sum=0;\n    for (size_t i=0;i<4;i++)\n        Sum+=VertWeigths[i];\n\n    for (size_t i=0;i<4;i++)\n    {\n        assert(VertWeigths[i]>=0);\n        VertWeigths[i]/=Sum;\n    }\n}\n\ntemplate <class PolyMeshType,class TriMeshType>\nvoid ProjectStepPositions(PolyMeshType &PolyM,TriMeshType &TriM,\n                          vcg::GridStaticPtr<typename TriMeshType::FaceType,typename TriMeshType::ScalarType> TriGrid,\n                          const ProjectionBase &TriProjBase,\n                          const BasicMesh &EdgeM,\n                          const ProjectionBase &PolyProjBase,\n                          std::vector<typename PolyMeshType::CoordType> &TargetPos,\n                          const bool ProjEdgeM)\n{\n    typedef typename PolyMeshType::ScalarType ScalarType;\n    typedef typename PolyMeshType::CoordType CoordType;\n    typedef typename TriMeshType::FaceType TriFaceType;\n    TargetPos.clear();\n\n    std::vector<int> SharpProj(PolyM.vert.size(),-1);\n    for (size_t i=0;i<PolyProjBase.SharpEdge.size();i++)\n        for (size_t j=0;j<PolyProjBase.SharpEdge[i].size();j++)\n        {\n            size_t IndexV0=PolyProjBase.SharpEdge[i][j].first;\n            size_t IndexV1=PolyProjBase.SharpEdge[i][j].second;\n            SharpProj[IndexV0]=i;\n            SharpProj[IndexV1]=i;\n        }\n\n    for (size_t i=0;i<PolyM.vert.size();i++)\n    {\n        if ((PolyProjBase.VertProjType[i]==ProjCorner)||\n                (PolyProjBase.VertProjType[i]==ProjNone))\n        {\n            TargetPos.push_back(PolyM.vert[i].P());\n            //            CoordType TestPos=PolyM.vert[i].P();\n            //            int IndexSh=SharpProj[i];\n            //            assert(IndexSh>=0);\n            //            assert(IndexSh<TriProjBase.SharpEdge.size());\n            //            size_t ClosestSeg;\n            //            CoordType ClosestPos;\n            //            ClosestPointEdgeSet(TestPos,TriM,TriProjBase.SharpEdge[IndexSh],ClosestSeg,ClosestPos);\n            //            TargetPos.push_back(ClosestPos);\n        }\n        if (PolyProjBase.VertProjType[i]==ProjSharp)\n        {\n            CoordType TestPos=PolyM.vert[i].P();\n            if (ProjEdgeM)\n            {\n                size_t IndexE;\n                ScalarType t,MinD;\n                CoordType Clos;\n                ClosestPointEMesh(TestPos,EdgeM,IndexE,t,MinD,Clos);\n                TargetPos.push_back(Clos);\n            }\n            else\n            {\n                int IndexSh=SharpProj[i];\n                assert(IndexSh>=0);\n                assert(IndexSh<TriProjBase.SharpEdge.size());\n                size_t ClosestSeg;\n                CoordType ClosestPos;\n                ClosestPointEdgeSet(TestPos,TriM,TriProjBase.SharpEdge[IndexSh],ClosestSeg,ClosestPos);\n                TargetPos.push_back(ClosestPos);\n            }\n        }\n        if (PolyProjBase.VertProjType[i]==ProjSuface)\n        {\n            CoordType TestPos=PolyM.vert[i].P();\n            CoordType closestPt;\n            ScalarType MaxD=PolyM.bbox.Diag();\n            ScalarType MinD;\n            TriFaceType *f=vcg::tri::GetClosestFaceBase(TriM,TriGrid,TestPos,MaxD,MinD,closestPt);\n            assert(f!=NULL);\n            TargetPos.push_back(closestPt);\n        }\n    }\n}\n\n\ntemplate <class PolyMeshType,class TriMeshType>\nvoid GetProjectionBasis(const BasicMesh &edge_mesh,\n                        TriMeshType &tri_mesh,\n                        const std::vector<std::pair<size_t,size_t> > &FeatureTris,\n                        const std::vector<size_t> &FeatureTrisC,\n                        const std::vector<size_t> &tri_face_partition,\n                        PolyMeshType &poly_mesh,\n                        const std::vector<size_t > &poly_corner,\n                        const std::vector<size_t> &poly_face_partition,\n                        const typename PolyMeshType::ScalarType &AvEdge,\n                        ProjectionBase &PBaseTris,\n                        ProjectionBase &PBasePoly)\n{\n    typedef typename TriMeshType::ScalarType ScalarType;\n    typedef typename TriMeshType::CoordType CoordType;\n\n    PBaseTris.Clear();\n    PBasePoly.Clear();\n\n    PBaseTris.VertProjType.resize(tri_mesh.vert.size(),ProjSuface);\n    PBasePoly.VertProjType.resize(poly_mesh.vert.size(),ProjSuface);\n\n\n    //get for each corner of the tri mesh the corresponding on the poly mesh\n    //PBaseTris.Corner=FeatureTrisC;\n    std::vector<size_t> FeaturePolyC;\n    GetCorners(FeatureTrisC,tri_mesh,poly_corner,poly_mesh,FeaturePolyC);\n    //GetCorners(FeatureTris,FeatureTrisC,tri_mesh,poly_corner,poly_mesh,AvEdge,FeaturePolyC);\n\n\n    //find each segment set per pair of partitions\n    typedef std::pair<int,int> PatchPairKey;\n    std::map<PatchPairKey,size_t > BasisMap;\n    std::set<std::pair<size_t,size_t> > InsertedTriEdges;\n    for (size_t i=0;i<FeatureTris.size();i++)\n    {\n        size_t IndexF=FeatureTris[i].first;\n        size_t IndexE=FeatureTris[i].second;\n        int Part0=tri_face_partition[IndexF];\n        int Part1=-1;//when is adjacent to border\n        size_t IndexFOpp;\n        if (!vcg::face::IsBorder(tri_mesh.face[IndexF],IndexE))\n        {\n            IndexFOpp=vcg::tri::Index(tri_mesh,tri_mesh.face[IndexF].cFFp(IndexE));\n            Part1=tri_face_partition[IndexFOpp];\n        }\n\n        //see if there is such configuration of adjacent patches\n        if (Part0==Part1)\n        {\n            std::cout<<\"WARNING - SAME PARTITION ACROSS SHARP\"<<std::endl;\n            //            TriMeshType testM;\n            //            typename TriMeshType::FaceType *f0,*f1;\n            //            f0=&tri_mesh.face[IndexF];\n            //            f1=&tri_mesh.face[IndexFOpp];\n            //            vcg::tri::Allocator<TriMeshType>::AddFace(testM,f0->P(0),f0->P(1),f0->P(2));\n            //            vcg::tri::Allocator<TriMeshType>::AddFace(testM,f1->P(0),f1->P(1),f1->P(2));\n            //            vcg::tri::io::ExporterPLY<TriMeshType>::Save(testM,\"test_problem.ply\");\n            //            assert(0);\n        }\n        //assert(Part0!=Part1);\n        PatchPairKey keyPatch(std::min(Part0,Part1),std::max(Part0,Part1));\n\n        size_t IndexV0=vcg::tri::Index(tri_mesh,tri_mesh.face[IndexF].cV0(IndexE));\n        size_t IndexV1=vcg::tri::Index(tri_mesh,tri_mesh.face[IndexF].cV1(IndexE));\n        std::pair<size_t,size_t> EdgeKey=std::pair<size_t,size_t>(std::min(IndexV0,IndexV1),std::max(IndexV0,IndexV1));\n\n        PBaseTris.VertProjType[IndexV0]=ProjSharp;\n        PBaseTris.VertProjType[IndexV1]=ProjSharp;\n\n        //check if already added\n        if (InsertedTriEdges.count(EdgeKey)>0)continue;\n        InsertedTriEdges.insert(EdgeKey);\n\n        if (BasisMap.count(keyPatch)==0)\n        {\n            PBaseTris.SharpEdge.resize(PBaseTris.SharpEdge.size()+1);\n            PBaseTris.SharpEdge.back().push_back(EdgeKey);\n            BasisMap[keyPatch]=PBaseTris.SharpEdge.size()-1;\n        }\n        else\n        {\n            int IndexSharp=BasisMap[keyPatch];\n            PBaseTris.SharpEdge[IndexSharp].push_back(EdgeKey);\n        }\n    }\n\n    //    //std::cout<<\"B\"<<std::endl;\n\n    //    //then check the edge of the quads, by default =-2, no projection, internal\n    //    VertBasis.resize(poly_mesh.vert.size(),-2);\n    //    //    BasicMesh EdgeMesh;\n    //    //    ExtractEdgeMesh(tri_mesh,features,EdgeMesh);\n\n    PBasePoly.SharpEdge.resize(PBaseTris.SharpEdge.size());\n\n    std::set<std::pair<size_t,size_t> > InsertedPolyEdges;\n    for (size_t i=0;i<poly_mesh.face.size();i++)\n    {\n        int Part0=poly_face_partition[i];\n\n        //get neighbours\n        for (int j=0;j<poly_mesh.face[i].VN();j++)\n        {\n            //default border\n            int Part1=-1;\n            //std::cout<<\"i j \"<<i<<\",\"<<j<<std::endl;\n\n            //            int sizeF=poly_mesh.face[i].VN();\n            //            size_t IndexVa0=vcg::tri::Index(poly_mesh,poly_mesh.face[i].V(j));\n            //            size_t IndexVa1=vcg::tri::Index(poly_mesh,poly_mesh.face[i].V((j+1)%sizeF));\n            //            std::pair<size_t,size_t> edgeKey(std::min(IndexV0,IndexV1),std::max(IndexV0,IndexV1));\n            //std::cout<<\"Va0 Va1 \"<<IndexVa0<<\",\"<<IndexVa1<<std::endl;\n\n            if (!vcg::face::IsBorder(poly_mesh.face[i],j))\n            {\n                size_t IndexFOpp=vcg::tri::Index(poly_mesh,poly_mesh.face[i].cFFp(j));\n                Part1=poly_face_partition[IndexFOpp];\n            }\n            std::pair<int,int> keyPatch(std::min(Part0,Part1),std::max(Part0,Part1));\n            //check if this is part of a sharp feature\n            if (BasisMap.count(keyPatch)>0)\n            {\n                if (Part0==Part1)std::cout<<\"WARNING: Internal SHARP FEATURE of a patch\"<<std::endl;\n                int sizeF=poly_mesh.face[i].VN();\n                size_t IndexV0=vcg::tri::Index(poly_mesh,poly_mesh.face[i].V(j));\n                size_t IndexV1=vcg::tri::Index(poly_mesh,poly_mesh.face[i].V((j+1)%sizeF));\n                std::pair<size_t,size_t> edgeKey(std::min(IndexV0,IndexV1),std::max(IndexV0,IndexV1));\n                //                std::cout<<\"V0 V1 \"<<IndexV0<<\",\"<<IndexV1<<std::endl;\n\n                //                std::cout<<\"WTest 0\"<<std::endl;\n\n                if (InsertedPolyEdges.count(edgeKey)>0)continue;\n\n                //                std::cout<<\"WTest 1\"<<std::endl;\n\n                InsertedPolyEdges.insert(edgeKey);\n\n                ScalarType MinD0,MinD1,t;\n                CoordType Clos;\n                size_t IndexE;\n                ClosestPointEMesh(poly_mesh.vert[IndexV0].cP(),edge_mesh,IndexE,t,MinD0,Clos);\n                ClosestPointEMesh(poly_mesh.vert[IndexV1].cP(),edge_mesh,IndexE,t,MinD1,Clos);\n\n                size_t IndexSharp=BasisMap[keyPatch];\n                assert(IndexSharp<PBasePoly.SharpEdge.size());\n                assert(IndexSharp<PBaseTris.SharpEdge.size());\n\n                bool closeI0=(MinD0<AvEdge/10);\n                bool closeI1=(MinD1<AvEdge/10);\n\n                if (closeI0 && closeI1)\n                    PBasePoly.SharpEdge[IndexSharp].push_back(edgeKey);\n\n                if (closeI0)\n                    PBasePoly.VertProjType[IndexV0]=ProjSharp;\n\n                if (closeI1)\n                    PBasePoly.VertProjType[IndexV1]=ProjSharp;\n\n                //                VertBasis[IndV0]=BasisMap[key];\n                //                VertBasis[IndV1]=BasisMap[key];\n            }\n        }\n    }\n\n    //    //std::cout<<\"C\"<<std::endl;\n    //    for (size_t i=0;i<cornersIdx.size();i++)\n    //        VertBasis[cornersIdx[i]]=-1;\n\n    //    if (ProjBasis.size()>0)\n    //        MergeProjBasis(tri_mesh,featuresC,VertBasis,ProjBasis);\n    //    //std::cout<<\"D\"<<std::endl;\n\n    //finally set the corners\n    //PBaseTris.Corner=FeatureTrisC;\n    //GetCorners(FeatureTris,PBaseTris.Corner,tri_mesh,poly_corner,poly_mesh,AvEdge,PBasePoly.Corner);\n    for (size_t i=0;i<FeatureTrisC.size();i++)\n    {\n        size_t IndexC=FeatureTrisC[i];\n        PBaseTris.VertProjType[IndexC]=ProjCorner;\n    }\n\n    for (size_t i=0;i<FeaturePolyC.size();i++)\n    {\n        size_t IndexC=FeaturePolyC[i];\n        PBasePoly.VertProjType[IndexC]=ProjCorner;\n    }\n    vcg::tri::UpdateFlags<PolyMeshType>::VertexClearS(poly_mesh);\n    for (size_t i=0;i<poly_mesh.vert.size();i++)\n    {\n        if ((PBasePoly.VertProjType[i]==ProjCorner)||\n                (PBasePoly.VertProjType[i]==ProjSharp))\n            poly_mesh.vert[i].SetS();\n    }\n\n    //    //also add others depending on sharp ones\n    //    std::vector<size_t> FeatureCount(poly_mesh.face.size(),0);\n    //    for (size_t i=0;i<poly_mesh.face.size();i++)\n    //        for (size_t j=0;j<poly_mesh.face[i].VN();j++)\n    //        {\n    //            size_t IndexV0=vcg::tri::Index(poly_mesh,poly_mesh.face[i].V0(j));\n    //            size_t IndexV1=vcg::tri::Index(poly_mesh,poly_mesh.face[i].V0(j));\n    //            if ()\n    //        }\n    //    //make vertices equivalent\n    //    for (size_t i=0;i<PBasePoly.Corner.size();i++)\n    //    {\n    //        size_t IndexCPoly=PBasePoly.Corner[i];\n    //        size_t IndexCTri=PBaseTris.Corner[i];\n    //        poly_mesh.vert[IndexCPoly].P()=tri_mesh.vert[IndexCTri].P();\n    //    }\n}\n\ntemplate <class PolyMeshType,class TriMeshType>\nvoid InitPolyTrisMesh(PolyMeshType &PolyM,TriMeshType &poly_tris)\n{\n    //set the index of original vertices\n    for (size_t i=0;i<PolyM.vert.size();i++)\n        PolyM.vert[i].Q()=i;\n\n    //and the original faces\n    for (size_t i=0;i<PolyM.face.size();i++)\n        PolyM.face[i].Q()=i;\n\n    vcg::PolygonalAlgorithm<PolyMeshType>::TriangulateToTriMesh(PolyM,poly_tris);\n    assert(poly_tris.vert.size()==(PolyM.vert.size()+PolyM.face.size()));\n    assert(poly_tris.face.size()==(4*PolyM.face.size()));\n\n    //then update values on the mesh\n    vcg::tri::UpdateNormal<TriMeshType>::PerFaceNormalized(poly_tris);\n    vcg::tri::UpdateNormal<TriMeshType>::PerVertexNormalized(poly_tris);\n    vcg::tri::UpdateBounding<TriMeshType>::Box(poly_tris);\n\n    //check the index of the polygonal face\n    for (size_t i=0;i<poly_tris.vert.size();i++)\n    {\n        assert(poly_tris.face[i].Q()>=0);\n        assert(poly_tris.face[i].Q()<PolyM.face.size());\n    }\n\n    //set the index of the original vertices\n    for (size_t i=0;i<poly_tris.vert.size();i++)\n    {\n        poly_tris.vert[i].Q()=-1;\n        if (i<PolyM.vert.size())\n            poly_tris.vert[i].Q()=i;\n    }\n}\n\ntemplate <class PolyMeshType,class TriMeshType>\nvoid GetMovingPointOnSurface(PolyMeshType &PolyM,TriMeshType &poly_tris,\n                             const typename TriMeshType::CoordType &TestPos,\n                             vcg::GridStaticPtr<typename TriMeshType::FaceType,typename TriMeshType::ScalarType> &Poly_tri_Grid,\n                             std::vector<std::vector<typename TriMeshType::CoordType> > &VertMove,\n                             std::vector<std::vector<typename TriMeshType::ScalarType> > &VertWeight)\n{\n    typedef typename PolyMeshType::ScalarType ScalarType;\n    typedef typename PolyMeshType::CoordType CoordType;\n    typedef typename TriMeshType::FaceType TriFaceType;\n\n    assert(VertMove.size()==PolyM.vert.size());\n    assert(VertWeight.size()==PolyM.vert.size());\n\n    CoordType closestPt;\n    ScalarType MaxD=PolyM.bbox.Diag();\n    ScalarType MinD;\n    TriFaceType *f=vcg::tri::GetClosestFaceBase(poly_tris,Poly_tri_Grid,TestPos,MaxD,MinD,closestPt);\n    //assert(f!=NULL);\n\n    //retrieve the original face\n    int IndexTriF=vcg::tri::Index(poly_tris,f);\n    int IndexPolyF=poly_tris.face[IndexTriF].Q();\n\n    assert(IndexPolyF>=0);\n    assert(IndexPolyF<PolyM.face.size());\n\n    std::vector<typename TriMeshType::ScalarType> VertWeigths;\n    //std::cout<<\"A\"<<std::endl;\n    GetQuadInterpW<PolyMeshType,TriMeshType>(poly_tris.face[IndexTriF],\n                                             PolyM.face[IndexPolyF],\n                                             closestPt,VertWeigths);\n    //std::cout<<\"B\"<<std::endl;\n    CoordType MoveVect=TestPos-closestPt;\n\n    for (size_t j=0;j<4;j++)\n    {\n        int IndexV=vcg::tri::Index(PolyM,PolyM.face[IndexPolyF].V(j));\n        VertMove[IndexV].push_back(MoveVect*VertWeigths[j]);\n        VertWeight[IndexV].push_back(VertWeigths[j]);\n    }\n}\n\ntemplate <class PolyMeshType,class TriMeshType>\nvoid BackProjectStepPositions(PolyMeshType &PolyM,TriMeshType &TriM,\n                              const ProjectionBase &TriProjBase,\n                              const ProjectionBase &PolyProjBase,\n                              std::vector<typename PolyMeshType::CoordType> &TargetPos)\n{\n    typedef typename PolyMeshType::ScalarType ScalarType;\n    typedef typename PolyMeshType::CoordType CoordType;\n    typedef typename TriMeshType::FaceType TriFaceType;\n\n    assert(TriProjBase.VertProjType.size()==TriM.vert.size());\n    assert(PolyProjBase.VertProjType.size()==PolyM.vert.size());\n    assert(TriProjBase.SharpEdge.size()==PolyProjBase.SharpEdge.size());\n    //assert(PolyProjBase.Corner.size()==PolyProjBase.Corner.size());\n\n    //transform the polygonal mesh into triangle one\n    int t0=clock();\n    TriMeshType poly_tris;\n    InitPolyTrisMesh(PolyM,poly_tris);\n\n    std::vector<std::vector<CoordType> > VertMove(PolyM.vert.size());\n    std::vector<std::vector<ScalarType> > VertWeight(PolyM.vert.size());\n    int t1=clock();\n    //first set the internal\n    //then initialize the grid\n    vcg::GridStaticPtr<TriFaceType,ScalarType> TriGrid;\n    vcg::Box3<ScalarType> BB=poly_tris.bbox;\n    BB.Offset(BB.Diag()*0.1);\n    TriGrid.Set(poly_tris.face.begin(),poly_tris.face.end(),BB);\n    int t2=clock();\n    for (size_t i=0;i<TriM.vert.size();i++)\n    {\n        if (TriProjBase.VertProjType[i]!=ProjSuface)continue;\n\n        CoordType TestPos=TriM.vert[i].P();\n        GetMovingPointOnSurface(PolyM,poly_tris,TestPos,TriGrid,VertMove,VertWeight);\n    }\n    int t3=clock();\n    //normalize the weight and average the direction\n    std::vector<CoordType> TargetMov(PolyM.vert.size(),CoordType(0,0,0));\n    for (size_t i=0;i<VertWeight.size();i++)\n    {\n        ScalarType SumW=0;\n        for (size_t j=0;j<VertWeight[i].size();j++)\n            SumW+=VertWeight[i][j];\n\n        if (SumW==0)continue;\n\n        for (size_t j=0;j<VertWeight[i].size();j++)\n            VertWeight[i][j]/=SumW;\n\n        for (size_t j=0;j<VertMove[i].size();j++)\n        {\n            TargetMov[i]+=VertMove[i][j]*VertWeight[i][j];\n        }\n    }\n\n    TargetPos.clear();\n    for (size_t i=0;i<PolyM.vert.size();i++)\n    {\n        if ((PolyProjBase.VertProjType[i]==ProjCorner)||\n                (PolyProjBase.VertProjType[i]==ProjNone))\n            TargetPos.push_back(PolyM.vert[i].P());\n        else\n            TargetPos.push_back(PolyM.vert[i].P()+TargetMov[i]);\n    }\n    int t4=clock();\n    //    std::cout<<\"BProj T0: \"<<t1-t0<<std::endl;\n    //    std::cout<<\"BProj T1: \"<<t2-t1<<std::endl;\n    //    std::cout<<\"BProj T2: \"<<t3-t2<<std::endl;\n    //    std::cout<<\"BProj T3: \"<<t4-t3<<std::endl;\n}\n\ntemplate <class PolyMeshType,class TriMeshType>\nvoid SmoothSharpFeatures(PolyMeshType &PolyM,ProjectionBase &PolyProjBase,\n                         const BasicMesh &EdgeM,\n                         const typename PolyMeshType::ScalarType Damp,\n                         std::vector<bool> &BlockedV)\n{\n    typedef typename PolyMeshType::ScalarType ScalarType;\n    typedef typename PolyMeshType::CoordType CoordType;\n    typedef typename TriMeshType::FaceType TriFaceType;\n\n    //select only the one on sharp features\n    vcg::tri::UpdateFlags<PolyMeshType>::VertexClearS(PolyM);\n    for (size_t i=0;i<PolyProjBase.VertProjType.size();i++)\n        if ((PolyProjBase.VertProjType[i]==ProjSharp)||(PolyProjBase.VertProjType[i]==ProjCorner))\n            PolyM.vert[i].SetS();\n\n    //then do one laplacian step\n    std::vector<typename PolyMeshType::CoordType> TargetPos;\n    LaplacianPos(PolyM,Damp,TargetPos,true);\n\n    //set value\n    for (size_t i=0;i<PolyM.vert.size();i++)\n    {\n        if (PolyProjBase.VertProjType[i]!=ProjSharp)continue;\n        if (BlockedV[i])continue;\n        PolyM.vert[i].P()=TargetPos[i];\n    }\n\n\n    for (size_t i=0;i<PolyM.vert.size();i++)\n    {\n        if (PolyProjBase.VertProjType[i]!=ProjSharp)continue;\n        if (BlockedV[i])continue;\n        size_t IndexE;\n        ScalarType t,MinD;\n        CoordType Clos;\n        ClosestPointEMesh(PolyM.vert[i].P(),EdgeM,IndexE,t,MinD,Clos);\n        //TargetPos.push_back(Clos);\n        PolyM.vert[i].P()=Clos;\n    }\n}\n\ntemplate <class PolyMeshType,class TriMeshType>\nvoid SmoothInternal(PolyMeshType &PolyM,TriMeshType &TriM,\n                    vcg::GridStaticPtr<typename TriMeshType::FaceType,\n                    typename TriMeshType::ScalarType> &TriGrid,\n                    ProjectionBase &TriProjBase,ProjectionBase &PolyProjBase,\n                    size_t back_proj_steps,\n                    SmoothType SType,\n                    const typename PolyMeshType::ScalarType Damp,\n                    std::vector<bool> &BlockedV,\n                    bool UseSharp)\n{\n    typedef typename PolyMeshType::CoordType CoordType;\n    typedef typename PolyMeshType::ScalarType ScalarType;\n    typedef typename TriMeshType::FaceType TriFaceType;\n\n    //std::vector<CoordType> TargetPosProj;\n    std::vector<CoordType> TargetPosBackProj;\n    std::vector<CoordType> TargetPosSmooth;\n\n    //select only the one on borders\n    vcg::tri::UpdateFlags<PolyMeshType>::VertexClearS(PolyM);\n\n    //    int t0=clock();\n    if (!UseSharp)\n    {\n        vcg::tri::UpdateFlags<PolyMeshType>::VertexSetS(PolyM);\n        for (size_t i=0;i<PolyProjBase.VertProjType.size();i++)\n        {\n            if ((PolyProjBase.VertProjType[i]==ProjSharp)||(PolyProjBase.VertProjType[i]==ProjCorner))\n                PolyM.vert[i].ClearS();\n        }\n        LaplacianPos(PolyM,Damp,TargetPosSmooth,true);\n        vcg::tri::UpdateFlags<PolyMeshType>::VertexClearS(PolyM);\n    }\n    else\n    {\n        //then do one laplacian step\n        if (SType==Laplacian)\n            LaplacianPos(PolyM,Damp,TargetPosSmooth,false);\n        else\n            TemplatePos(PolyM,PolyProjBase,Damp,TargetPosSmooth);\n    }\n    //    int t1=clock();\n    //smooth\n    for (size_t i=0;i<PolyM.vert.size();i++)\n    {\n        if (BlockedV[i])continue;\n        if (PolyProjBase.VertProjType[i]==ProjSuface)\n            PolyM.vert[i].P()=TargetPosSmooth[i];\n    }\n    //    int t2=clock();\n    //back projection\n\n    for (size_t i=0;i<back_proj_steps;i++)\n    {\n        BackProjectStepPositions(PolyM,TriM,TriProjBase,PolyProjBase,TargetPosBackProj);\n        for (size_t i=0;i<PolyM.vert.size();i++)\n        {\n            if (BlockedV[i])continue;\n            if (PolyProjBase.VertProjType[i]==ProjSuface)\n                PolyM.vert[i].P()=TargetPosBackProj[i];\n        }\n    }\n\n    //    int t3=clock();\n    for (size_t i=0;i<PolyM.vert.size();i++)\n    {\n        if (BlockedV[i])continue;\n        if (PolyProjBase.VertProjType[i]==ProjSuface)\n        {\n            CoordType TestPos=PolyM.vert[i].P();\n            CoordType closestPt;\n            ScalarType MaxD=PolyM.bbox.Diag();\n            ScalarType MinD;\n            //std::cout<<\"Index:\"<<i<<std::endl;\n            TriFaceType *f=vcg::tri::GetClosestFaceBase(TriM,TriGrid,TestPos,MaxD,MinD,closestPt);\n            assert(f!=NULL);\n            PolyM.vert[i].P()=closestPt;\n        }\n    }\n\n    //    int t4=clock();\n    //    std::cout<<\"Internal T0: \"<<t1-t0<<std::endl;\n    //    std::cout<<\"Internal T1: \"<<t2-t1<<std::endl;\n    //    std::cout<<\"Internal T2: \"<<t3-t2<<std::endl;\n    //    std::cout<<\"Internal T3: \"<<t4-t3<<std::endl;\n}\n\ntemplate <class PolyMeshType>\nvoid DeCostrainFace(const PolyMeshType &PolyM,\n                    const size_t &IndexF,\n                    ProjectionBase &PolyProjBase)\n{\n    bool HasModified=false;\n    for (size_t i=0;i<PolyM.face[IndexF].VN();i++)\n    {\n        size_t IndexV=vcg::tri::Index(PolyM,PolyM.face[IndexF].V(i));\n        if (PolyProjBase.VertProjType[IndexV]==ProjCorner)\n        {\n            PolyProjBase.VertProjType[IndexV]=ProjSharp;\n            HasModified=true;\n        }\n    }\n    if (HasModified)return;\n    for (size_t i=0;i<PolyM.face[IndexF].VN();i++)\n    {\n        size_t IndexV=vcg::tri::Index(PolyM,PolyM.face[IndexF].V(i));\n        if (PolyProjBase.VertProjType[IndexV]==ProjSharp)\n        {\n            PolyProjBase.VertProjType[IndexV]=ProjSuface;\n            HasModified=true;\n        }\n    }\n    if (HasModified)return;\n    for (size_t i=0;i<PolyM.face[IndexF].VN();i++)\n    {\n        size_t IndexV=vcg::tri::Index(PolyM,PolyM.face[IndexF].V(i));\n        PolyProjBase.VertProjType[IndexV]=ProjNone;\n    }\n\n}\n\n\ntemplate <class PolyMeshType,class TriMeshType>\nvoid MultiCostraintSmooth(PolyMeshType &PolyM,\n                          TriMeshType &TriM,\n                          const std::vector<std::pair<size_t,size_t> > &features,\n                          const std::vector<size_t> &featuresC,\n                          const std::vector<size_t> &tri_face_partition,\n                          const std::vector<size_t > &quad_corner,\n                          const std::vector<size_t> &quad_face_partition,\n                          //SmoothType SType,\n                          const typename PolyMeshType::ScalarType Damp,\n                          const typename PolyMeshType::ScalarType AvEdge,\n                          size_t step_num,\n                          size_t back_proj_steps)\n{\n    typedef typename PolyMeshType::ScalarType ScalarType;\n    typedef typename PolyMeshType::CoordType CoordType;\n    typedef typename TriMeshType::FaceType TriFaceType;\n\n    std::cout<<\"*** Getting Projection basis ***\"<<std::endl;\n    ProjectionBase TriProjBase,PolyProjBase;\n\n    BasicMesh EdgeM;\n    ExtractEdgeMesh(TriM,features,EdgeM);\n\n    GetProjectionBasis(EdgeM,TriM,features,featuresC,tri_face_partition,PolyM,\n                       quad_corner,quad_face_partition,AvEdge,\n                       TriProjBase,PolyProjBase);\n\n    std::cout<<\"*** Done ***\"<<std::endl;\n\n    std::vector<bool> BlockedV(PolyM.vert.size(),false);\n\n    vcg::GridStaticPtr<TriFaceType,ScalarType> TriGrid;\n    vcg::Box3<ScalarType> BB=TriM.bbox;\n    BB.Offset(BB.Diag()*0.1);\n    TriGrid.Set(TriM.face.begin(),TriM.face.end(),BB);\n\n    for (size_t s=0;s<step_num;s++)\n    {\n        //std::cout<<\"Smoooth Feature step: \"<<s<<std::endl;\n        //int t0=clock();\n        SmoothSharpFeatures<PolyMeshType,TriMeshType>(PolyM,PolyProjBase,EdgeM,Damp,BlockedV);\n        //        std::cout<<\"Smoooth Internal step: \"<<s<<std::endl;\n        //        int t1=clock();\n\n        SmoothInternal<PolyMeshType,TriMeshType>(PolyM,TriM,TriGrid,\n                                                 TriProjBase,PolyProjBase,\n                                                 back_proj_steps,\n                                                 TemplateFit,Damp,\n                                                 BlockedV,true);\n\n        //        int t2=clock();\n        //        std::cout<<\"Concluded Smoothing step TFeat:\"<<t1-t0<<\" TInternal:\"<<t2-t1<<std::endl;\n    }\n\n}\n\n\ntemplate <class PolyMeshType,class TriMeshType>\nvoid LocalUVSmooth(PolyMeshType &PolyM,\n                   TriMeshType &TriM,\n                   const std::vector<std::pair<size_t,size_t> > &features,\n                   const std::vector<size_t> &featuresC,\n                   size_t step_num)\n{\n    typedef typename PolyMeshType::ScalarType ScalarType;\n    typedef typename PolyMeshType::CoordType CoordType;\n    typedef typename TriMeshType::FaceType TriFaceType;\n\n    //set index of original face\n    for (size_t i=0;i<PolyM.face.size();i++)\n        PolyM.face[i].Q()=i;\n\n    TriMeshType testM;\n    vcg::PolygonalAlgorithm<PolyMeshType>::template TriangulateToTriMesh<TriMeshType>(PolyM,testM,false);\n    testM.UpdateAttributes();\n\n    vcg::GridStaticPtr<TriFaceType,ScalarType> TriGrid;\n    vcg::Box3<ScalarType> BB=testM.bbox;\n    BB.Offset(BB.Diag()*0.1);\n    TriGrid.Set(testM.face.begin(),testM.face.end(),BB);\n\n    std::vector<std::pair<size_t,size_t> > PolySharpFeatures;\n    //    std::set<std::pair<CoordType,CoordType> > PolySharpCoord;\n\n    //    ScalarType minDot=0.6;\n\n    size_t subStep=10;\n    for (size_t i=0;i<features.size();i++)\n    {\n        for (size_t k=1;k<subStep-1;k++)\n        {\n            size_t IndexF=features[i].first;\n            size_t IndexE=features[i].second;\n            CoordType P0=TriM.face[IndexF].P0(IndexE);\n            CoordType P1=TriM.face[IndexF].P1(IndexE);\n            //        CoordType Dir0=(P1-P0);\n            //        Dir0.Normalize();\n\n            CoordType TestP=(P0*k+P1*(subStep-k))/subStep;\n            ScalarType maxD=TriM.bbox.Diag();\n            ScalarType minD;\n            CoordType closestPt;\n            TriFaceType *f=vcg::tri::GetClosestFaceBase(testM,TriGrid,TestP,maxD,minD,closestPt);\n            assert(f!=NULL);\n            size_t IndexFPoly=f->Q();\n\n            assert(IndexFPoly>=0);\n            assert(IndexFPoly<PolyM.face.size());\n\n            size_t numV=PolyM.face[IndexFPoly].VN();\n            ScalarType minDT=std::numeric_limits<ScalarType>::max();\n            int minI=-1;\n            for (size_t j=0;j<numV;j++)\n            {\n                CoordType P0=PolyM.face[IndexFPoly].P(j);\n                CoordType P1=PolyM.face[IndexFPoly].P((j+1)%numV);\n                //            CoordType Dir1=(P1-P0);\n                //            Dir1.Normalize();\n\n                //            if (fabs(Dir0*Dir1)<minDot)continue;\n                vcg::Segment3<ScalarType> S3(P0,P1);\n                CoordType closT;\n                ScalarType distT;\n                vcg::SegmentPointDistance(S3,closestPt,closT,distT);\n                if (distT>minDT)continue;\n                minDT=distT;\n                minI=j;\n            }\n            assert(minI>=0);\n            PolySharpFeatures.push_back(std::pair<size_t,size_t>(IndexFPoly,(size_t)minI));\n        }\n    }\n    std::sort(PolySharpFeatures.begin(),PolySharpFeatures.end());\n    auto it = std::unique (PolySharpFeatures.begin(), PolySharpFeatures.end());\n    PolySharpFeatures.resize( std::distance(PolySharpFeatures.begin(),it) );\n\n    std::set<CoordType> CornerPos;\n    for (size_t i=0;i<featuresC.size();i++)\n    {\n        CoordType Pos=TriM.vert[featuresC[i]].P();\n        CornerPos.insert(Pos);\n    }\n\n    std::vector<size_t> PolyCorners;\n    for (size_t i=0;i<PolyM.vert.size();i++)\n    {\n        if (CornerPos.count(PolyM.vert[i].P())==0)continue;\n        //        if (CountS[i]==0)continue;\n        //        if (CountS[i]==2)continue;\n        PolyCorners.push_back(i);\n    }\n\n    SmoothPolygonalMeshByLocalUV(PolyM,PolySharpFeatures,PolyCorners,step_num);\n\n}\n\n#endif // SMOOTH_MESH_H\n"
  },
  {
    "path": "components/quad_from_patches/test_edge.obj",
    "content": "####\n#\n# OBJ File Generated by Meshlab\n#\n####\n# Object test_edge.obj\n#\n# Vertices: 758\n# Faces: 0\n#\n####\nv 144.889500 129.677228 158.536274\nv 143.761597 129.243607 158.459793\nv 143.761597 130.529601 158.686550\nv 143.761597 129.431450 160.126648\nv 218.361549 129.404350 158.488144\nv 218.761597 129.243607 158.459793\nv 218.761597 130.529601 158.686550\nv 218.761597 129.343255 159.343795\nv 217.961502 129.565094 158.516495\nv 216.988738 129.929859 158.580812\nv 146.017403 130.110848 158.612755\nv 216.015973 130.294624 158.645130\nv 146.520352 130.299274 158.645977\nv 214.993590 130.648265 158.707514\nv 147.023300 130.487701 158.679199\nv 147.788002 130.744850 158.724548\nv 143.761597 131.815594 158.913307\nv 218.761597 131.815594 158.913307\nv 213.971207 131.001907 158.769897\nv 148.552704 131.001999 158.769897\nv 213.507607 131.158005 158.797401\nv 149.315600 131.248251 158.813324\nv 213.044006 131.314102 158.824905\nv 150.078496 131.494503 158.856752\nv 212.317862 131.532440 158.863417\nv 151.302226 131.853651 158.920052\nv 211.591718 131.750778 158.901930\nv 210.549010 132.047089 158.954161\nv 143.761597 133.101587 159.140064\nv 218.761597 133.101587 159.140064\nv 152.525956 132.212799 158.983352\nv 209.506302 132.343399 159.006393\nv 153.696063 132.520242 159.037589\nv 208.588875 132.583641 159.048772\nv 154.866170 132.827686 159.091827\nv 207.671448 132.823884 159.091152\nv 206.600476 133.074940 159.135427\nv 155.937212 133.078394 159.136039\nv 205.529503 133.325997 159.179703\nv 157.008255 133.329102 159.180252\nv 143.761597 134.387581 159.366821\nv 218.761597 134.387581 159.366821\nv 204.767704 133.484048 159.207554\nv 157.776802 133.488450 159.208351\nv 204.005905 133.642098 159.235405\nv 158.545349 133.647797 159.236450\nv 203.081367 133.822474 159.267192\nv 159.478474 133.829399 159.268447\nv 202.156830 134.002851 159.298980\nv 160.411598 134.011002 159.300445\nv 200.931439 134.213471 159.336141\nv 161.624872 134.219209 159.337161\nv 199.706047 134.424091 159.373303\nv 162.838147 134.427416 159.373877\nv 218.761597 129.442902 160.227798\nv 143.761597 135.673575 159.593578\nv 218.761597 135.673575 159.593578\nv 198.484623 134.596048 159.403601\nv 164.050322 134.597810 159.403942\nv 197.263199 134.768005 159.433899\nv 165.262497 134.768204 159.434006\nv 196.909653 134.817452 159.442650\nv 165.628250 134.819252 159.443001\nv 196.556107 134.866898 159.451401\nv 165.994003 134.870300 159.451996\nv 195.746277 134.956051 159.467103\nv 166.791526 134.957874 159.467422\nv 194.936447 135.045204 159.482804\nv 167.589050 135.045448 159.482849\nv 194.106625 135.133251 159.498326\nv 168.425727 135.134197 159.498500\nv 193.276802 135.221298 159.513848\nv 169.262405 135.222946 159.514152\nv 192.247349 135.305397 159.528675\nv 170.488052 135.322773 159.531753\nv 191.217896 135.389496 159.543503\nv 171.713699 135.422600 159.549354\nv 190.670611 135.430023 159.550657\nv 172.211574 135.455124 159.555076\nv 190.123325 135.470550 159.557810\nv 172.709450 135.487648 159.560799\nv 189.030565 135.530075 159.568303\nv 173.915252 135.552998 159.572335\nv 187.937805 135.589600 159.578796\nv 175.121054 135.618348 159.583870\nv 187.412030 135.613175 159.582946\nv 186.886254 135.636750 159.587097\nv 176.369601 135.658471 159.590935\nv 185.959424 135.665726 159.592201\nv 177.618149 135.698594 159.598000\nv 185.032593 135.694702 159.597305\nv 143.761597 136.959568 159.820335\nv 218.761597 136.959568 159.820335\nv 184.363846 135.703949 159.598953\nv 178.549850 135.709199 159.599876\nv 183.695099 135.713196 159.600601\nv 179.481552 135.719803 159.601753\nv 182.763351 135.722573 159.602253\nv 180.656578 135.725876 159.602828\nv 181.831604 135.731949 159.603904\nv 143.761597 138.245562 160.047092\nv 218.761597 138.245562 160.047092\nv 143.761597 139.531555 160.273849\nv 218.761597 139.531555 160.273849\nv 143.761597 129.619293 161.793503\nv 218.761597 129.546173 161.174725\nv 143.761597 140.817549 160.500607\nv 218.761597 140.817549 160.500607\nv 143.761597 142.103543 160.727364\nv 218.761597 142.103543 160.727364\nv 143.761597 143.389537 160.954121\nv 218.761597 143.389537 160.954121\nv 143.761597 144.675530 161.180878\nv 218.761597 144.675530 161.180878\nv 218.761597 129.649444 162.121651\nv 143.761597 145.961523 161.407635\nv 218.761597 145.961523 161.407635\nv 143.761597 147.247517 161.634392\nv 218.761597 147.247517 161.634392\nv 143.761597 148.533510 161.861149\nv 218.761597 148.533510 161.861149\nv 143.761597 129.672473 162.372429\nv 143.761597 149.819504 162.087906\nv 218.761597 149.819504 162.087906\nv 144.982113 150.178914 162.151282\nv 143.761597 149.875755 162.979302\nv 217.542861 150.178389 162.151192\nv 218.761597 149.875755 162.979103\nv 218.761597 129.710525 162.786778\nv 216.324124 150.537274 162.214478\nv 146.202629 150.538325 162.214658\nv 215.277461 150.821837 162.264664\nv 147.251091 150.823262 162.264906\nv 214.230797 151.106400 162.314850\nv 148.299553 151.108200 162.315155\nv 213.249821 151.350377 162.357849\nv 149.280629 151.352173 162.358154\nv 212.268845 151.594353 162.400848\nv 150.261704 151.596146 162.401153\nv 143.761597 129.725654 162.951355\nv 211.416698 151.796978 162.436573\nv 151.039114 151.781744 162.433899\nv 151.816524 151.967342 162.466646\nv 210.564552 151.999603 162.472298\nv 152.647287 152.143370 162.497674\nv 209.808426 152.158752 162.500374\nv 153.478050 152.319397 162.528701\nv 209.052300 152.317902 162.528450\nv 208.296147 152.475228 162.556202\nv 154.234802 152.476822 162.556449\nv 207.539993 152.632553 162.583954\nv 154.991554 152.634247 162.584198\nv 206.774395 152.772053 162.608528\nv 155.757179 152.773647 162.608799\nv 206.008797 152.911552 162.633102\nv 156.522804 152.913048 162.633400\nv 205.038738 153.083499 162.663425\nv 157.541878 153.092970 162.665116\nv 204.068680 153.255446 162.693748\nv 158.560953 153.272892 162.696831\nv 202.817040 153.442024 162.726673\nv 159.760724 153.450899 162.728215\nv 201.565399 153.628601 162.759598\nv 160.960495 153.628906 162.759598\nv 200.980346 153.714150 162.774651\nv 161.557747 153.716103 162.775002\nv 200.395294 153.799698 162.789703\nv 162.154999 153.803299 162.790405\nv 218.761597 129.771606 163.451904\nv 199.713295 153.880898 162.804054\nv 162.825150 153.882950 162.804451\nv 199.031296 153.962097 162.818405\nv 163.495300 153.962601 162.818497\nv 197.856660 154.096769 162.842123\nv 164.671988 154.097471 162.842263\nv 196.682024 154.231441 162.865841\nv 165.848677 154.232342 162.866029\nv 195.408086 154.349843 162.886721\nv 167.126739 154.350870 162.886914\nv 194.134147 154.468246 162.907601\nv 168.404801 154.469399 162.907799\nv 193.331425 154.527725 162.918103\nv 169.201752 154.528500 162.918248\nv 192.528702 154.587204 162.928604\nv 169.998703 154.587601 162.928696\nv 191.508804 154.656403 162.940776\nv 171.024529 154.656975 162.940895\nv 190.488906 154.725602 162.952949\nv 172.050354 154.726349 162.953094\nv 143.761597 129.802879 163.972031\nv 189.627978 154.769726 162.960747\nv 172.906205 154.770225 162.960846\nv 188.767051 154.813850 162.968545\nv 173.762055 154.814102 162.968597\nv 187.967426 154.840076 162.973172\nv 174.560974 154.840248 162.973197\nv 187.167801 154.866302 162.977798\nv 175.359894 154.866394 162.977798\nv 186.359101 154.892097 162.982346\nv 176.619408 154.901011 162.983895\nv 218.761597 149.932007 163.870300\nv 143.761597 149.932007 163.870697\nv 185.550400 154.917892 162.986893\nv 177.878922 154.935627 162.989991\nv 185.033749 154.928821 162.988820\nv 184.517098 154.939751 162.990746\nv 178.932412 154.947260 162.992043\nv 183.210724 154.952423 162.992974\nv 179.985901 154.958893 162.994095\nv 181.904350 154.965095 162.995201\nv 180.945126 154.961994 162.994648\nv 218.761597 129.825851 164.222103\nv 218.761595 149.998146 164.959398\nv 143.761597 150.003827 165.089875\nv 143.761597 129.880104 164.992706\nv 218.761597 129.880097 164.992302\nv 218.761593 150.064285 166.048497\nv 218.761597 129.953499 166.034802\nv 143.761597 129.953503 166.035004\nv 143.761597 150.075646 166.309052\nv 218.761597 130.026901 167.077301\nv 143.761597 130.026901 167.077301\nv 218.761595 150.111443 167.276301\nv 143.761597 150.109326 167.078423\nv 143.761597 130.029602 167.142151\nv 218.761597 130.029549 167.140953\nv 143.761597 150.143005 167.847794\nv 218.761597 130.032196 167.204605\nv 143.761597 130.032303 167.207001\nv 218.761597 130.086151 168.491150\nv 143.761597 130.086304 168.493904\nv 218.761597 150.158600 168.504105\nv 143.761597 150.150802 168.176750\nv 143.761597 150.158600 168.505707\nv 218.761597 130.140106 169.777695\nv 143.761597 130.140305 169.780807\nv 218.761597 150.188454 169.761200\nv 143.761597 150.188500 169.763100\nv 218.761597 150.218307 171.018295\nv 143.761597 150.218399 171.020493\nv 218.761597 130.160256 170.257500\nv 143.761597 130.160355 170.259056\nv 218.761597 130.180405 170.737305\nv 143.761597 130.180405 170.737305\nv 143.761597 130.193001 171.612602\nv 218.761597 130.192955 171.610649\nv 218.761597 150.228950 171.466301\nv 143.761597 150.228996 171.467400\nv 218.761597 150.239594 171.914307\nv 143.761597 150.239594 171.914307\nv 218.761597 130.205505 172.483994\nv 143.761597 130.205597 172.487900\nv 143.761597 150.238198 172.800301\nv 218.761597 150.238198 172.798752\nv 218.761597 130.216656 173.684273\nv 143.761597 130.219551 173.458198\nv 218.761597 150.236801 173.683197\nv 143.761597 150.236801 173.686295\nv 143.761597 130.233505 174.428497\nv 218.761597 150.231813 174.879200\nv 218.761597 130.227806 174.884552\nv 143.761597 150.231903 174.806675\nv 143.761597 130.225052 175.102902\nv 143.761597 150.227005 175.927055\nv 218.761597 150.226826 176.075203\nv 218.761597 130.219501 175.547127\nv 143.761597 130.216599 175.777306\nv 218.761597 130.211197 176.209702\nv 143.761597 130.199524 177.022278\nv 143.761597 150.204101 176.960704\nv 218.761597 150.204061 177.032551\nv 218.761597 130.196872 177.236950\nv 143.761597 150.181198 177.994354\nv 143.761597 130.182449 178.267250\nv 218.761597 150.181297 177.989899\nv 218.761597 130.182548 178.264198\nv 218.761597 150.158775 178.867199\nv 143.761597 150.158699 178.870629\nv 218.761597 130.148651 179.142399\nv 143.761597 130.148475 179.147224\nv 218.761597 150.136253 179.744499\nv 143.761597 150.136200 179.746903\nv 218.761597 130.114754 180.020600\nv 143.761597 130.114502 180.027199\nv 218.761597 150.099678 180.553226\nv 143.761597 150.099575 180.555927\nv 218.761597 130.080803 180.900227\nv 143.761597 130.080601 180.905300\nv 218.761597 150.063103 181.361954\nv 143.761597 150.062950 181.364952\nv 218.761597 130.046852 181.779854\nv 143.761597 130.046699 181.783401\nv 218.761597 150.008625 182.477776\nv 143.761597 150.029522 182.049877\nv 218.756496 129.995913 182.639002\nv 143.761597 129.993972 182.629928\nv 143.761597 149.996094 182.734802\nv 218.761597 149.954147 183.593597\nv 143.761597 129.941246 183.476455\nv 218.751396 129.944973 183.498150\nv 143.761597 149.975147 183.164051\nv 143.761597 149.954201 183.593300\nv 143.761597 129.879572 184.439615\nv 218.751144 129.883284 184.450024\nv 143.761597 149.865902 184.897503\nv 218.761597 149.866127 184.893951\nv 143.761597 129.817898 185.402775\nv 218.750891 129.821595 185.401899\nv 218.761597 149.778107 186.194305\nv 143.761597 149.777603 186.201706\nv 218.756244 129.735497 186.386149\nv 143.761597 129.733424 186.389162\nv 218.761597 149.714157 187.091949\nv 143.761597 149.713906 187.095650\nv 218.761597 129.649399 187.370400\nv 143.761597 129.648949 187.375549\nv 218.761597 149.650208 187.989594\nv 143.761597 149.650208 187.989594\nv 218.761597 129.565449 188.314400\nv 143.761597 129.564999 188.319549\nv 143.761597 149.549080 189.074696\nv 218.761597 149.549256 189.072598\nv 218.761597 129.481499 189.258400\nv 143.761597 129.481049 189.263550\nv 218.761597 149.448303 190.155601\nv 143.761597 149.447952 190.159798\nv 218.761597 129.376725 190.200325\nv 143.761597 129.376527 190.202797\nv 218.761597 149.364800 191.051853\nv 143.761597 149.364624 191.053951\nv 218.761597 129.271950 191.142250\nv 143.761597 129.272004 191.142044\nv 218.761597 149.281296 191.948105\nv 143.761597 149.281296 191.948105\nv 143.761597 129.157008 192.154029\nv 218.761597 129.157347 192.150876\nv 143.761597 149.163651 192.973900\nv 218.761597 149.164245 192.968551\nv 218.761597 129.042743 193.159502\nv 143.761597 129.042011 193.166015\nv 218.761597 149.047195 193.988998\nv 143.761597 149.046005 193.999695\nv 218.761597 128.907347 194.142827\nv 143.761597 128.906531 194.149383\nv 218.761597 148.938896 194.933151\nv 143.761597 148.938301 194.938500\nv 218.761597 128.771950 195.126152\nv 143.761597 128.771050 195.132752\nv 218.761597 148.830597 195.877304\nv 143.761597 148.830597 195.877304\nv 218.761597 128.603401 196.299103\nv 143.761597 128.602326 196.306302\nv 143.761597 148.700699 196.832023\nv 218.761597 148.701122 196.828980\nv 218.761597 128.434852 197.472054\nv 143.761597 128.433601 197.479851\nv 218.761597 148.571648 197.780655\nv 143.761597 148.570801 197.786743\nv 218.761597 128.233928 198.704129\nv 143.761597 128.233349 198.707875\nv 218.761597 148.436024 198.777580\nv 143.761597 148.435600 198.780624\nv 218.761597 128.033005 199.936203\nv 143.761597 128.033096 199.935898\nv 218.761597 148.300400 199.774506\nv 143.761597 148.300400 199.774506\nv 143.761597 148.163201 200.646152\nv 218.761597 148.163776 200.642430\nv 143.761597 127.971348 200.314698\nv 218.761597 127.971302 200.314850\nv 143.761597 127.909599 200.693497\nv 218.761597 127.909599 200.693497\nv 218.761597 148.027153 201.510354\nv 143.761597 148.026001 201.517799\nv 143.761597 127.677399 201.944801\nv 218.761597 127.679051 201.935699\nv 218.761597 147.876017 202.470490\nv 143.761600 147.873987 202.483396\nv 218.761597 127.448502 203.177902\nv 143.761597 127.445198 203.196106\nv 218.761597 147.724881 203.430627\nv 143.761604 147.721974 203.448993\nv 218.761597 127.257576 204.124729\nv 143.761597 127.405098 203.412056\nv 143.761597 127.364998 203.628006\nv 218.761597 147.537539 204.489990\nv 143.761600 147.536086 204.499173\nv 143.761597 127.215824 204.349705\nv 218.761597 127.066651 205.071556\nv 143.761597 127.066651 205.071404\nv 218.761597 147.350197 205.549354\nv 143.761597 147.350197 205.549354\nv 143.761597 126.903952 205.858552\nv 218.761597 126.903952 205.858703\nv 143.761597 147.120098 206.799430\nv 218.761597 147.179097 206.505581\nv 143.761597 126.741253 206.645699\nv 218.761597 126.741253 206.645851\nv 218.761597 147.007996 207.461807\nv 143.761597 126.463125 207.865201\nv 218.761597 126.465677 207.854175\nv 143.761597 146.889999 208.049507\nv 218.761597 146.836647 208.315254\nv 218.761597 126.190102 209.062500\nv 143.761597 126.184998 209.084702\nv 143.761597 146.722450 208.883907\nv 218.761597 146.665299 209.168701\nv 143.761597 146.554901 209.718307\nv 218.761597 126.097202 209.467552\nv 143.761597 125.921224 210.164826\nv 218.761597 146.456696 210.207451\nv 218.761597 126.004303 209.872604\nv 143.761597 146.401497 210.482254\nv 218.761597 125.830852 210.558826\nv 143.761597 125.657451 211.244949\nv 218.761597 146.248093 211.246201\nv 143.761597 146.248093 211.246201\nv 218.761597 125.657402 211.245048\nv 143.761597 125.465225 212.005473\nv 218.761597 125.465176 212.005573\nv 143.761597 146.061993 212.080003\nv 218.761597 146.063195 212.074700\nv 143.761597 125.272998 212.765998\nv 218.761597 125.272949 212.766098\nv 218.761597 145.878296 212.903199\nv 143.761597 145.875893 212.913804\nv 143.761597 125.054273 213.561401\nv 218.761597 125.056098 213.554726\nv 218.761597 145.607872 214.098801\nv 143.761597 145.618006 214.053351\nv 218.761597 124.839248 214.343353\nv 143.761597 124.835548 214.356804\nv 143.761597 145.360119 215.192898\nv 218.761597 145.337448 215.294403\nv 218.761597 124.632200 215.090077\nv 143.761597 124.628500 215.103527\nv 218.761597 124.425152 215.836800\nv 143.761597 124.421451 215.850250\nv 143.761597 145.121283 216.167147\nv 218.761597 145.109924 216.217953\nv 218.761597 124.053427 217.065800\nv 143.761597 124.051626 217.072472\nv 143.761597 144.882447 217.141395\nv 218.761597 144.882401 217.141503\nv 218.761597 123.681702 218.294800\nv 143.761597 123.681801 218.294693\nv 143.761597 144.692772 217.911296\nv 218.761597 144.692749 217.911350\nv 143.761597 144.503098 218.681198\nv 218.761597 144.503098 218.681198\nv 143.761597 123.600349 218.563247\nv 218.761597 123.600300 218.563301\nv 143.761597 123.518898 218.831802\nv 218.761597 123.518898 218.831802\nv 143.761597 144.330647 219.318348\nv 218.761597 144.330647 219.318375\nv 143.761597 123.281574 219.549801\nv 218.761597 123.281574 219.549801\nv 143.761597 144.158196 219.955497\nv 218.761597 144.158195 219.955551\nv 143.761597 123.044250 220.267799\nv 218.761597 123.044250 220.267799\nv 143.761597 143.910094 220.872197\nv 218.761597 143.910968 220.869012\nv 143.761597 122.806927 220.985797\nv 218.761597 122.806927 220.985797\nv 218.761597 143.663741 221.782473\nv 143.761597 143.661992 221.788897\nv 143.761597 122.569603 221.703796\nv 218.761597 122.569603 221.703796\nv 143.761597 122.144115 222.886187\nv 218.761597 122.227701 222.653896\nv 218.761597 143.323845 222.953138\nv 143.761597 143.322970 222.956349\nv 218.761597 121.885800 223.603996\nv 143.761597 121.718626 224.068577\nv 218.761597 142.983948 224.123802\nv 143.761597 142.983948 224.123802\nv 218.761597 121.721701 224.060001\nv 218.761597 121.557602 224.516006\nv 143.761597 121.331565 225.075785\nv 143.761597 142.610251 225.364926\nv 218.761597 142.783087 224.789051\nv 218.761597 121.135252 225.595425\nv 218.761597 142.582226 225.454300\nv 143.761597 120.944504 226.082993\nv 143.761597 142.236553 226.606049\nv 218.761597 142.381364 226.119549\nv 218.761597 120.712902 226.674843\nv 143.761597 120.712902 226.674843\nv 218.761597 142.180503 226.784798\nv 143.761597 141.871275 227.718422\nv 143.761597 120.481300 227.266693\nv 218.761597 120.335650 227.585522\nv 218.761597 141.848499 227.791996\nv 143.761597 120.219902 227.881394\nv 218.761597 119.958397 228.496201\nv 143.761597 141.505997 228.830795\nv 218.761597 141.516495 228.799194\nv 143.761597 119.958504 228.496094\nv 143.761597 119.548153 229.441895\nv 218.761597 119.548073 229.441975\nv 218.761597 141.272949 229.535194\nv 143.761597 141.267700 229.550995\nv 143.761597 119.137802 230.387696\nv 218.761597 119.137749 230.387749\nv 218.761597 141.029404 230.271194\nv 143.761597 141.029404 230.271194\nv 143.761597 140.755051 231.035446\nv 218.761597 140.755051 231.035446\nv 143.813851 118.637753 231.523148\nv 218.715401 118.634975 231.522671\nv 143.761597 140.480698 231.799698\nv 218.761597 140.480698 231.799698\nv 218.669205 118.132202 232.657593\nv 143.866104 118.137703 232.658600\nv 143.761597 140.167152 232.673248\nv 218.761597 140.167152 232.673248\nv 217.505604 118.655325 232.749847\nv 218.680754 119.420670 232.884788\nv 145.023651 118.658102 232.750351\nv 143.853041 119.425484 232.885669\nv 143.761597 139.853607 233.546799\nv 218.761597 139.853607 233.546799\nv 216.342003 119.178448 232.842102\nv 146.181198 119.178501 232.842102\nv 216.096454 119.276976 232.859452\nv 146.433098 119.279600 232.859902\nv 215.850906 119.375504 232.876801\nv 146.684998 119.380699 232.877701\nv 214.644203 119.850577 232.960576\nv 147.893124 119.855960 232.961524\nv 218.692303 120.709139 233.111982\nv 143.839977 120.713265 233.112738\nv 213.437500 120.325649 233.044350\nv 149.101251 120.331220 233.045347\nv 213.213051 120.405676 233.058475\nv 150.183728 120.717009 233.113371\nv 212.988602 120.485703 233.072601\nv 211.866775 120.874901 233.141223\nv 218.703852 121.997607 233.339177\nv 143.826914 122.001046 233.339807\nv 151.266205 121.102798 233.181396\nv 210.744949 121.264099 233.209846\nv 152.322962 121.435659 233.240076\nv 209.952171 121.513748 233.253872\nv 153.379719 121.768519 233.298757\nv 209.159393 121.763397 233.297897\nv 208.589695 121.931648 233.327549\nv 154.238062 122.016160 233.342425\nv 208.019996 122.099900 233.357201\nv 218.715401 123.286076 233.566372\nv 143.813851 123.288826 233.566876\nv 155.096405 122.263802 233.386093\nv 207.039773 122.370711 233.404964\nv 156.181481 122.552577 233.437019\nv 206.059550 122.641522 233.452726\nv 157.266556 122.841351 233.487946\nv 205.337476 122.818361 233.483885\nv 204.615402 122.995201 233.515045\nv 158.368531 123.105776 233.534577\nv 203.834450 123.182602 233.548072\nv 159.470505 123.370201 233.581207\nv 143.761597 139.587506 234.235100\nv 218.761597 139.587506 234.235100\nv 203.053497 123.370003 233.581100\nv 218.726950 124.574544 233.793566\nv 143.800788 124.576607 233.793945\nv 202.481346 123.487702 233.601898\nv 160.050202 123.489452 233.602203\nv 201.909195 123.605400 233.622696\nv 160.629898 123.608704 233.623199\nv 200.791672 123.827175 233.661770\nv 161.743775 123.829577 233.662148\nv 199.674149 124.048950 233.700844\nv 162.857651 124.050449 233.701096\nv 198.452828 124.260376 233.738125\nv 164.075127 124.261224 233.738296\nv 197.231506 124.471802 233.775406\nv 165.292603 124.472000 233.775497\nv 196.847152 124.526352 233.785050\nv 165.684952 124.527649 233.785301\nv 196.462799 124.580902 233.794693\nv 166.077301 124.583298 233.795105\nv 218.738499 125.863012 234.020761\nv 143.787724 125.864388 234.021013\nv 195.233573 124.752251 233.824871\nv 167.302650 124.753975 233.825180\nv 194.004348 124.923599 233.855049\nv 168.528000 124.924652 233.855255\nv 192.815651 125.055126 233.878250\nv 169.720501 125.056500 233.878501\nv 191.626953 125.186653 233.901451\nv 170.913002 125.188347 233.901748\nv 190.434601 125.294926 233.920551\nv 172.101524 125.296099 233.920749\nv 189.242249 125.403199 233.939651\nv 173.290047 125.403851 233.939751\nv 188.864922 125.428799 233.944176\nv 173.671924 125.429724 233.944324\nv 188.487595 125.454399 233.948700\nv 174.053802 125.455597 233.948898\nv 187.255295 125.529999 233.961998\nv 175.354301 125.533150 233.962547\nv 186.022995 125.605598 233.975296\nv 176.654800 125.610703 233.976196\nv 185.954994 125.607749 233.975700\nv 185.886993 125.609901 233.976105\nv 184.602897 125.650902 233.983353\nv 177.939147 125.651501 233.983398\nv 183.318802 125.691902 233.990601\nv 179.223495 125.692299 233.990601\nv 183.148353 125.697300 233.991547\nv 179.392295 125.697651 233.991547\nv 182.977905 125.702698 233.992493\nv 179.561096 125.703003 233.992493\nv 182.119949 125.710049 233.993797\nv 180.411544 125.710201 233.993797\nv 181.261993 125.717400 233.995102\nv 218.750048 127.151481 234.247956\nv 143.774660 127.152169 234.248082\nv 143.761597 139.321404 234.923401\nv 218.761597 139.321404 234.923401\nv 218.761597 128.439949 234.475151\nv 143.761597 128.439949 234.475151\nv 143.761597 129.086777 234.589204\nv 218.761597 129.086777 234.589204\nv 143.761597 129.733605 234.703258\nv 218.761597 129.733605 234.703258\nv 143.761597 130.380434 234.817311\nv 218.761597 130.380434 234.817311\nv 143.761597 131.027262 234.931364\nv 218.761597 131.027262 234.931364\nv 143.761597 139.055302 235.611702\nv 218.761597 139.055302 235.611702\nv 143.761597 131.674090 235.045417\nv 218.761597 131.674090 235.045417\nv 143.761597 132.320918 235.159470\nv 218.761597 132.320918 235.159470\nv 143.761597 132.967747 235.273524\nv 218.761597 132.967747 235.273524\nv 143.761597 133.614575 235.387577\nv 218.761597 133.614575 235.387577\nv 143.761597 134.261403 235.501630\nv 218.761597 134.261403 235.501630\nv 143.761597 134.908231 235.615684\nv 218.761597 134.908231 235.615684\nv 143.761597 138.789200 236.300003\nv 218.761597 138.789200 236.300003\nv 143.761597 135.555059 235.729737\nv 218.761597 135.555059 235.729737\nv 143.761597 136.201887 235.843790\nv 218.761597 136.201887 235.843790\nv 143.761597 136.848715 235.957844\nv 218.761597 136.848715 235.957844\nv 143.761597 137.495544 236.071897\nv 218.761597 137.495544 236.071897\nv 143.761597 138.142372 236.185950\nv 218.761597 138.142372 236.185950\nv 143.945747 138.848702 236.310501\nv 218.583496 138.846748 236.310150\nv 218.405396 138.904297 236.320297\nv 144.129898 138.908203 236.320999\nv 217.728771 139.122948 236.358849\nv 144.803546 139.125904 236.359375\nv 217.052147 139.341599 236.397400\nv 145.477195 139.343605 236.397751\nv 216.325897 139.574524 236.438450\nv 146.203544 139.576454 236.438801\nv 215.599648 139.807449 236.479500\nv 146.929893 139.809303 236.479851\nv 214.833523 140.027549 236.518299\nv 147.699245 140.030327 236.518825\nv 214.067398 140.247650 236.557098\nv 148.468597 140.251351 236.557800\nv 213.336475 140.457627 236.594124\nv 149.196498 140.460449 236.594677\nv 212.605552 140.667603 236.631150\nv 149.924400 140.669548 236.631554\nv 211.438373 140.963799 236.683373\nv 151.088200 140.964824 236.683575\nv 210.271194 141.259995 236.735596\nv 152.251999 141.260101 236.735596\nv 210.039597 141.318695 236.745949\nv 152.689003 141.370803 236.755150\nv 209.807999 141.377396 236.756302\nv 153.126007 141.481506 236.774704\nv 209.602951 141.429345 236.765503\nv 209.397903 141.481293 236.774704\nv 208.208000 141.744598 236.821099\nv 154.322555 141.746299 236.821404\nv 207.018097 142.007904 236.867493\nv 155.519104 142.011093 236.868103\nv 206.592102 142.102204 236.884148\nv 155.938553 142.103897 236.884453\nv 206.166107 142.196503 236.900803\nv 156.358002 142.196701 236.900803\nv 205.214852 142.377900 236.932754\nv 157.316101 142.379402 236.932999\nv 204.263596 142.559296 236.964706\nv 158.274200 142.562103 236.965195\nv 203.575348 142.690544 236.987854\nv 158.954524 142.681898 236.986353\nv 159.634849 142.801693 237.007511\nv 202.887100 142.821793 237.011002\nv 160.315174 142.921499 237.028605\nv 202.214852 142.930298 237.030151\nv 160.995499 143.041306 237.049698\nv 201.542603 143.038803 237.049301\nv 200.555001 143.198250 237.077400\nv 161.976304 143.199601 237.077599\nv 199.567398 143.357697 237.105499\nv 162.957108 143.357895 237.105499\nv 199.210449 143.405197 237.113899\nv 163.321106 143.406349 237.114052\nv 198.853500 143.452698 237.122299\nv 163.685104 143.454803 237.122604\nv 197.555901 143.625496 237.152748\nv 164.975205 143.626549 237.152900\nv 196.258301 143.798294 237.183197\nv 166.265305 143.798294 237.183197\nv 166.962128 143.872547 237.196301\nv 196.226303 143.802246 237.183899\nv 196.194305 143.806198 237.184601\nv 195.537304 143.875649 237.196850\nv 167.658951 143.946800 237.209404\nv 194.880302 143.945099 237.209099\nv 194.044452 144.033451 237.224674\nv 168.491226 144.034747 237.224903\nv 193.208602 144.121803 237.240250\nv 169.323502 144.122695 237.240402\nv 192.086448 144.215099 237.256676\nv 170.449554 144.216194 237.256904\nv 190.964294 144.308395 237.273102\nv 171.575607 144.309692 237.273407\nv 189.675598 144.395446 237.288452\nv 172.308807 144.367493 237.283600\nv 173.042007 144.425293 237.293793\nv 188.386902 144.482498 237.303802\nv 173.597755 144.454345 237.298897\nv 174.153503 144.483398 237.304001\nv 187.250603 144.541900 237.314301\nv 175.281951 144.542350 237.314400\nv 186.114304 144.601303 237.324799\nv 176.410400 144.601303 237.324799\nv 176.559403 144.605148 237.325447\nv 185.973404 144.604904 237.325447\nv 185.832504 144.608505 237.326096\nv 176.708405 144.608994 237.326096\nv 184.566300 144.640899 237.331795\nv 177.974801 144.641350 237.331849\nv 183.300095 144.673294 237.337494\nv 179.241196 144.673706 237.337601\nv 183.025147 144.680343 237.338745\nv 180.251748 144.685051 237.339600\nv 182.750198 144.687393 237.339996\nv 181.262299 144.696396 237.341599\nv 182.006249 144.691894 237.340798\n# 758 vertices, 0 vertices normals\n\nl 1 2\nl 3 2\nl 2 4\nl 5 6\nl 6 7\nl 8 6\nl 9 5\nl 9 10\nl 11 1\nl 10 12\nl 13 11\nl 12 14\nl 15 13\nl 16 15\nl 17 3\nl 7 18\nl 14 19\nl 20 16\nl 19 21\nl 22 20\nl 21 23\nl 24 22\nl 23 25\nl 26 24\nl 25 27\nl 27 28\nl 29 17\nl 30 18\nl 31 26\nl 28 32\nl 33 31\nl 32 34\nl 35 33\nl 34 36\nl 36 37\nl 38 35\nl 37 39\nl 40 38\nl 41 29\nl 42 30\nl 39 43\nl 44 40\nl 43 45\nl 46 44\nl 45 47\nl 48 46\nl 47 49\nl 50 48\nl 49 51\nl 52 50\nl 51 53\nl 54 52\nl 55 8\nl 41 56\nl 57 42\nl 53 58\nl 59 54\nl 58 60\nl 61 59\nl 60 62\nl 63 61\nl 62 64\nl 65 63\nl 64 66\nl 67 65\nl 66 68\nl 69 67\nl 70 68\nl 71 69\nl 72 70\nl 73 71\nl 72 74\nl 75 73\nl 74 76\nl 77 75\nl 76 78\nl 79 77\nl 78 80\nl 81 79\nl 80 82\nl 83 81\nl 82 84\nl 85 83\nl 84 86\nl 86 87\nl 88 85\nl 87 89\nl 90 88\nl 89 91\nl 56 92\nl 93 57\nl 91 94\nl 95 90\nl 94 96\nl 97 95\nl 96 98\nl 99 97\nl 98 100\nl 100 99\nl 101 92\nl 93 102\nl 103 101\nl 102 104\nl 4 105\nl 106 55\nl 103 107\nl 104 108\nl 107 109\nl 108 110\nl 109 111\nl 112 110\nl 111 113\nl 114 112\nl 115 106\nl 116 113\nl 114 117\nl 118 116\nl 117 119\nl 118 120\nl 121 119\nl 105 122\nl 120 123\nl 124 121\nl 123 125\nl 126 123\nl 127 124\nl 124 128\nl 129 115\nl 130 127\nl 125 131\nl 132 130\nl 131 133\nl 134 132\nl 133 135\nl 136 134\nl 135 137\nl 138 136\nl 137 139\nl 122 140\nl 141 138\nl 139 142\nl 142 143\nl 144 141\nl 143 145\nl 146 144\nl 145 147\nl 148 146\nl 149 148\nl 147 150\nl 151 149\nl 150 152\nl 153 151\nl 152 154\nl 155 153\nl 154 156\nl 157 155\nl 156 158\nl 159 157\nl 158 160\nl 161 159\nl 160 162\nl 163 161\nl 162 164\nl 165 163\nl 164 166\nl 167 165\nl 166 168\nl 169 129\nl 170 167\nl 168 171\nl 172 170\nl 171 173\nl 174 172\nl 173 175\nl 176 174\nl 175 177\nl 178 176\nl 177 179\nl 180 178\nl 179 181\nl 182 180\nl 181 183\nl 184 182\nl 183 185\nl 186 184\nl 185 187\nl 188 186\nl 187 189\nl 140 190\nl 191 188\nl 189 192\nl 193 191\nl 192 194\nl 195 193\nl 194 196\nl 197 195\nl 196 198\nl 199 197\nl 198 200\nl 128 201\nl 202 126\nl 203 199\nl 200 204\nl 205 203\nl 206 205\nl 204 207\nl 208 206\nl 207 209\nl 210 208\nl 209 211\nl 211 210\nl 212 169\nl 201 213\nl 214 202\nl 190 215\nl 216 212\nl 213 217\nl 218 216\nl 215 219\nl 220 214\nl 221 218\nl 219 222\nl 217 223\nl 224 220\nl 222 225\nl 226 221\nl 227 224\nl 228 226\nl 225 229\nl 230 228\nl 229 231\nl 223 232\nl 233 227\nl 234 233\nl 235 230\nl 231 236\nl 232 237\nl 238 234\nl 237 239\nl 240 238\nl 241 235\nl 236 242\nl 243 241\nl 242 244\nl 244 245\nl 246 243\nl 239 247\nl 248 240\nl 247 249\nl 250 248\nl 251 246\nl 245 252\nl 253 250\nl 249 254\nl 255 251\nl 252 256\nl 254 257\nl 258 253\nl 256 259\nl 257 260\nl 261 255\nl 262 258\nl 259 263\nl 264 262\nl 260 265\nl 266 261\nl 263 267\nl 268 266\nl 267 269\nl 270 264\nl 265 271\nl 272 268\nl 273 270\nl 269 274\nl 271 275\nl 276 272\nl 275 277\nl 278 273\nl 279 276\nl 274 280\nl 277 281\nl 282 278\nl 283 279\nl 280 284\nl 281 285\nl 286 282\nl 287 283\nl 284 288\nl 285 289\nl 290 286\nl 291 287\nl 288 292\nl 289 293\nl 294 290\nl 295 291\nl 292 296\nl 297 294\nl 293 298\nl 296 299\nl 300 295\nl 301 297\nl 302 301\nl 299 303\nl 304 300\nl 305 302\nl 298 306\nl 303 307\nl 308 304\nl 306 309\nl 310 305\nl 311 308\nl 307 312\nl 309 313\nl 314 310\nl 315 311\nl 312 316\nl 313 317\nl 318 314\nl 319 315\nl 316 320\nl 321 318\nl 317 322\nl 323 319\nl 320 324\nl 322 325\nl 326 321\nl 327 323\nl 324 328\nl 325 329\nl 330 326\nl 331 327\nl 328 332\nl 329 333\nl 334 330\nl 332 335\nl 336 331\nl 337 334\nl 333 338\nl 339 336\nl 335 340\nl 338 341\nl 342 337\nl 343 339\nl 340 344\nl 341 345\nl 346 342\nl 347 343\nl 344 348\nl 345 349\nl 350 346\nl 351 347\nl 348 352\nl 350 353\nl 349 354\nl 355 351\nl 352 356\nl 354 357\nl 353 358\nl 359 355\nl 356 360\nl 357 361\nl 362 358\nl 363 359\nl 360 364\nl 361 365\nl 366 362\nl 367 366\nl 365 368\nl 364 369\nl 370 363\nl 369 371\nl 372 370\nl 368 373\nl 374 367\nl 371 375\nl 376 372\nl 373 377\nl 378 374\nl 379 376\nl 375 380\nl 377 381\nl 382 378\nl 383 379\nl 380 384\nl 384 385\nl 381 386\nl 387 382\nl 385 388\nl 389 383\nl 388 390\nl 386 391\nl 392 387\nl 390 393\nl 394 389\nl 392 395\nl 391 396\nl 393 397\nl 398 394\nl 396 399\nl 397 400\nl 401 398\nl 395 402\nl 399 403\nl 404 401\nl 400 405\nl 406 402\nl 403 407\nl 408 406\nl 409 404\nl 405 410\nl 407 411\nl 412 409\nl 413 408\nl 414 412\nl 410 415\nl 411 416\nl 417 413\nl 418 414\nl 415 419\nl 420 418\nl 421 417\nl 416 422\nl 419 423\nl 424 420\nl 422 425\nl 426 421\nl 423 427\nl 428 424\nl 429 425\nl 430 426\nl 431 428\nl 427 432\nl 433 430\nl 434 429\nl 435 431\nl 432 436\nl 437 435\nl 436 438\nl 439 433\nl 434 440\nl 441 437\nl 442 438\nl 443 439\nl 440 444\nl 445 441\nl 446 442\nl 447 443\nl 444 448\nl 449 447\nl 448 450\nl 446 451\nl 452 445\nl 451 453\nl 454 452\nl 455 449\nl 450 456\nl 453 457\nl 458 454\nl 459 455\nl 456 460\nl 457 461\nl 462 458\nl 463 459\nl 460 464\nl 461 465\nl 466 462\nl 464 467\nl 468 463\nl 465 469\nl 470 466\nl 469 471\nl 472 470\nl 467 473\nl 474 468\nl 475 472\nl 471 476\nl 473 477\nl 478 474\nl 479 475\nl 480 479\nl 476 481\nl 482 478\nl 483 477\nl 484 480\nl 485 483\nl 481 486\nl 487 482\nl 485 488\nl 489 484\nl 486 490\nl 488 491\nl 492 487\nl 490 493\nl 494 489\nl 491 495\nl 493 496\nl 497 494\nl 498 492\nl 495 499\nl 496 500\nl 500 501\nl 502 497\nl 499 503\nl 504 498\nl 501 505\nl 506 502\nl 503 507\nl 508 504\nl 509 508\nl 507 510\nl 505 511\nl 512 506\nl 513 509\nl 510 514\nl 515 512\nl 511 516\nl 517 513\nl 514 518\nl 519 515\nl 515 520\nl 516 521\nl 522 516\nl 523 517\nl 518 524\nl 525 519\nl 521 526\nl 527 525\nl 526 528\nl 529 527\nl 528 530\nl 529 531\nl 530 532\nl 520 533\nl 534 522\nl 531 535\nl 532 536\nl 537 535\nl 536 538\nl 539 537\nl 540 539\nl 533 541\nl 534 542\nl 538 543\nl 544 540\nl 543 545\nl 546 544\nl 545 547\nl 548 546\nl 549 548\nl 547 550\nl 551 549\nl 541 552\nl 542 553\nl 550 554\nl 555 551\nl 554 556\nl 557 555\nl 556 558\nl 559 557\nl 560 559\nl 558 561\nl 562 560\nl 561 563\nl 564 523\nl 524 565\nl 566 562\nl 552 567\nl 553 568\nl 569 566\nl 563 570\nl 571 569\nl 570 572\nl 573 571\nl 572 574\nl 575 573\nl 574 576\nl 577 575\nl 576 578\nl 579 577\nl 578 580\nl 581 579\nl 580 582\nl 583 581\nl 582 584\nl 567 585\nl 568 586\nl 583 587\nl 584 588\nl 587 589\nl 588 590\nl 591 589\nl 590 592\nl 593 591\nl 592 594\nl 595 593\nl 594 596\nl 597 595\nl 596 598\nl 599 597\nl 600 598\nl 601 599\nl 602 600\nl 601 603\nl 602 604\nl 603 605\nl 604 606\nl 607 605\nl 608 607\nl 608 609\nl 606 610\nl 609 611\nl 610 612\nl 613 611\nl 612 614\nl 615 613\nl 614 616\nl 617 615\nl 616 618\nl 619 617\nl 618 619\nl 620 585\nl 621 586\nl 622 564\nl 565 623\nl 624 620\nl 625 621\nl 625 626\nl 624 627\nl 626 628\nl 627 629\nl 628 630\nl 629 631\nl 630 632\nl 631 633\nl 622 634\nl 623 635\nl 636 632\nl 637 633\nl 638 636\nl 639 637\nl 640 638\nl 641 639\nl 642 640\nl 643 641\nl 644 642\nl 645 643\nl 646 644\nl 647 645\nl 634 648\nl 635 649\nl 646 650\nl 647 651\nl 650 652\nl 651 653\nl 654 652\nl 653 655\nl 656 654\nl 655 657\nl 658 656\nl 657 659\nl 648 658\nl 659 649\nl 660 648\nl 661 649\nl 662 661\nl 663 660\nl 662 664\nl 665 663\nl 664 666\nl 667 665\nl 666 668\nl 669 667\nl 668 670\nl 671 669\nl 670 672\nl 673 671\nl 672 674\nl 675 673\nl 674 676\nl 677 675\nl 676 678\nl 679 677\nl 678 680\nl 681 679\nl 680 682\nl 683 681\nl 682 684\nl 685 683\nl 684 686\nl 687 685\nl 686 688\nl 688 689\nl 689 690\nl 691 687\nl 690 692\nl 693 691\nl 692 694\nl 695 693\nl 694 696\nl 697 695\nl 696 698\nl 699 697\nl 698 700\nl 701 699\nl 700 702\nl 703 701\nl 704 703\nl 702 705\nl 706 704\nl 705 707\nl 708 706\nl 707 709\nl 709 710\nl 711 708\nl 710 712\nl 713 711\nl 712 714\nl 715 713\nl 714 716\nl 717 715\nl 716 718\nl 719 717\nl 718 720\nl 721 719\nl 722 721\nl 720 723\nl 723 724\nl 725 724\nl 726 722\nl 727 725\nl 727 728\nl 729 726\nl 728 730\nl 731 729\nl 730 732\nl 733 731\nl 732 734\nl 735 733\nl 734 736\nl 737 735\nl 738 737\nl 736 739\nl 740 738\nl 741 740\nl 739 742\nl 743 741\nl 742 744\nl 745 743\nl 746 745\nl 744 747\nl 747 748\nl 749 746\nl 748 750\nl 751 749\nl 750 752\nl 753 751\nl 754 752\nl 755 753\nl 756 754\nl 757 755\nl 758 756\nl 757 758\n# 0 faces, 0 coords texture\n\n# End of File\n"
  },
  {
    "path": "components/quad_from_patches/test_tri.obj",
    "content": "####\n#\n# OBJ File Generated by Meshlab\n#\n####\n# Object test_tri.obj\n#\n# Vertices: 23934\n# Faces: 47864\n#\n####\nmtllib ./test_tri.obj.mtl\n\nv 188.271985 135.925180 176.456932\nv 189.458313 135.623297 181.879736\nv 191.368798 135.530820 181.463440\nv 189.913620 135.858909 175.461891\nv 193.036236 135.425754 180.933074\nv 193.313823 135.645548 174.350206\nv 194.708830 135.329880 180.123717\nv 195.189284 135.466843 173.660394\nv 196.301735 135.214197 179.138675\nv 197.978270 135.055211 177.975775\nv 218.761597 130.140106 169.777695\nv 217.253734 130.645746 168.489799\nv 217.379819 130.490709 166.655753\nv 216.172847 131.042781 179.067072\nv 217.219891 130.731081 177.434884\nv 218.761597 129.481499 189.258400\nv 216.924676 129.695402 192.912296\nv 218.761597 128.434852 197.472054\nv 218.761597 128.033005 199.936203\nv 217.304431 128.451451 200.520512\nv 217.599482 126.896236 207.898104\nv 218.761597 126.004303 209.872604\nv 217.658092 125.465852 213.602543\nv 218.761597 121.557602 224.516006\nv 217.331531 121.133201 227.246159\nv 205.529503 133.325997 159.179703\nv 217.961502 129.565094 158.516495\nv 218.761597 129.243607 158.459793\nv 218.761597 129.442902 160.227798\nv 213.971207 131.001907 158.769897\nv 216.015973 130.294624 158.645130\nv 213.044006 131.314102 158.824905\nv 215.302064 130.845548 161.531163\nv 211.591718 131.750778 158.901930\nv 212.274122 131.684256 160.351976\nv 211.001860 132.335058 163.605009\nv 211.598919 132.034636 161.961466\nv 207.671448 132.823884 159.091152\nv 209.506302 132.343399 159.006393\nv 204.947855 133.580341 160.845837\nv 202.156830 134.002851 159.298980\nv 207.795687 133.064228 162.393368\nv 205.915649 133.512566 162.534606\nv 202.060515 134.179644 161.397660\nv 199.706047 134.424091 159.373303\nv 196.556107 134.866898 159.451401\nv 197.263199 134.768005 159.433899\nv 200.019267 134.636800 163.231531\nv 192.034650 135.502201 162.173278\nv 195.500164 135.086789 161.155799\nv 193.276802 135.221298 159.513848\nv 189.886415 135.671227 162.456350\nv 190.123325 135.470550 159.557810\nv 191.217896 135.389496 159.543503\nv 185.099922 135.779687 160.863057\nv 187.065488 135.729327 161.040218\nv 186.886254 135.636750 159.587097\nv 187.937805 135.589600 159.578796\nv 183.695099 135.713196 159.600601\nv 185.032593 135.694702 159.597305\nv 181.986598 135.924047 162.619563\nv 181.831604 135.731949 159.603904\nv 181.900168 136.058385 166.035628\nv 182.050924 136.143824 172.121494\nv 182.578959 136.055753 177.247980\nv 181.195889 136.095055 175.597780\nv 181.744298 135.747236 183.591208\nv 181.721497 135.267442 189.572434\nv 180.157698 134.270701 198.129369\nv 181.729733 133.709667 202.089397\nv 182.962745 134.551063 196.024682\nv 183.122665 133.610023 202.636934\nv 181.678195 132.936551 206.620453\nv 183.380506 132.788156 207.411170\nv 181.544993 131.304597 214.785114\nv 182.081634 130.215038 219.332748\nv 182.578763 130.563703 217.844361\nv 183.029753 131.544860 213.654375\nv 183.494871 130.293727 218.939575\nv 182.073759 129.534806 221.864296\nv 182.019624 128.685772 224.953715\nv 180.792105 127.207935 229.702580\nv 184.030972 128.707573 224.737083\nv 181.534766 128.181894 226.635581\nv 181.261993 125.717400 233.995102\nv 180.560374 126.262172 232.438959\nv 182.977905 125.702698 233.992493\nv 183.105174 126.757158 230.969920\nv 183.318802 125.691902 233.990601\nv 185.212566 126.733938 230.842301\nv 185.886993 125.609901 233.976105\nv 188.487595 125.454399 233.948700\nv 186.022995 125.605598 233.975296\nv 190.788879 126.861544 229.400377\nv 189.242249 125.403199 233.939651\nv 190.440244 125.842324 232.393494\nv 191.626953 125.186653 233.901451\nv 194.004348 124.923599 233.855049\nv 196.462799 124.580902 233.794693\nv 197.231506 124.471802 233.775406\nv 197.227079 125.538337 230.832675\nv 199.674149 124.048950 233.700844\nv 200.662641 125.101792 230.373812\nv 201.909195 123.605400 233.622696\nv 203.053497 123.370003 233.581100\nv 204.615402 122.995201 233.515045\nv 207.054781 123.073047 231.659788\nv 208.019996 122.099900 233.357201\nv 208.554045 123.270989 229.969110\nv 209.159393 121.763397 233.297897\nv 210.744949 121.264099 233.209846\nv 209.006566 122.344323 231.998956\nv 212.175849 122.108439 229.945939\nv 212.988602 120.485703 233.072601\nv 213.437500 120.325649 233.044350\nv 213.208995 121.023825 231.619109\nv 215.777675 120.209323 231.092452\nv 215.850906 119.375504 232.876801\nv 216.342003 119.178448 232.842102\nv 217.067066 120.392966 229.317099\nv 217.337768 119.425756 231.254691\nv 218.669205 118.132202 232.657593\nv 218.761597 119.137749 230.387749\nv 218.761597 119.958397 228.496201\nv 218.761597 120.712902 226.674843\nv 218.761597 122.569603 221.703796\nv 217.402037 122.355631 223.880788\nv 218.761597 121.885800 223.603996\nv 215.978873 122.698721 224.554933\nv 218.761597 123.681702 218.294800\nv 217.533522 124.069131 218.651946\nv 218.761597 123.518898 218.831802\nv 218.761597 125.272949 212.766098\nv 218.761597 124.425152 215.836800\nv 215.994321 125.433101 216.011671\nv 218.761597 126.741253 206.645851\nv 218.761597 126.190102 209.062500\nv 215.679133 127.111161 209.932827\nv 218.761597 127.909599 200.693497\nv 218.761597 127.448502 203.177902\nv 215.227075 128.699383 203.013802\nv 218.761597 129.042743 193.159502\nv 217.341266 129.338574 194.738248\nv 214.797742 130.753980 189.706483\nv 217.135674 130.220017 187.351948\nv 218.761597 130.046852 181.779854\nv 218.750891 129.821595 185.401899\nv 215.356127 131.218052 181.342052\nv 218.761597 130.211197 176.209702\nv 218.761597 130.182548 178.264198\nv 215.528285 131.348267 173.438674\nv 215.975977 131.179145 171.456167\nv 218.761597 130.227806 174.884552\nv 217.317587 130.684447 170.230121\nv 218.761597 130.180405 170.737305\nv 218.761597 130.205505 172.483994\nv 218.761597 129.880097 164.992302\nv 218.761597 130.026901 167.077301\nv 218.761597 130.032196 167.204605\nv 214.691072 131.190477 163.173855\nv 218.761597 129.649444 162.121651\nv 218.761597 129.771606 163.451904\nv 215.246328 121.248875 229.126256\nv 211.819996 123.055237 227.803238\nv 214.787755 122.131693 227.392792\nv 205.979923 124.693377 228.149297\nv 208.465680 124.792551 225.912769\nv 211.392831 124.543162 224.033409\nv 212.865641 124.318097 223.219331\nv 215.331376 124.186491 220.927751\nv 192.700426 126.641943 229.444261\nv 195.692494 126.759563 227.964797\nv 198.697069 126.627687 226.946214\nv 202.294394 126.481642 225.323700\nv 205.104475 126.058490 224.691213\nv 207.964114 126.107623 222.273251\nv 209.538727 125.991822 221.210790\nv 214.255982 125.715847 217.220268\nv 186.198416 128.791760 224.209006\nv 188.543596 128.664546 224.159698\nv 190.523212 128.588368 223.945346\nv 192.847067 128.427585 223.717364\nv 195.071862 128.461643 222.724504\nv 196.993131 128.467845 221.778348\nv 198.708747 128.475090 220.828836\nv 201.743713 128.015564 220.544848\nv 203.985422 127.989484 219.075428\nv 209.352081 127.309624 216.789529\nv 211.189284 127.433983 214.397178\nv 214.608032 127.131729 211.371270\nv 199.641636 134.884738 176.654176\nv 197.295010 135.242926 172.680472\nv 194.993657 135.445195 166.986116\nv 195.802399 135.295267 165.199464\nv 192.175594 135.722317 168.369106\nv 190.603278 135.849330 168.785525\nv 188.792948 135.948214 169.435800\nv 187.046213 136.039446 170.418182\nv 185.428443 136.095726 171.198455\nv 185.703110 135.720949 182.940875\nv 184.712209 136.036907 176.538062\nv 187.775683 135.626784 183.279576\nv 183.793706 136.023704 165.537353\nv 185.215575 135.957231 164.322470\nv 187.281668 135.887244 164.084667\nv 189.181798 135.781818 164.032478\nv 194.936447 135.045204 159.482804\nv 198.265405 134.886633 163.187810\nv 185.095413 132.638159 208.039459\nv 184.695435 133.702789 201.886243\nv 186.848023 132.732863 207.186884\nv 186.370886 133.716412 201.464037\nv 188.670189 132.764143 206.434113\nv 188.125209 133.703478 201.022325\nv 190.486095 132.760670 205.827790\nv 189.928546 133.676513 200.510394\nv 192.256472 132.747274 205.098814\nv 191.628342 133.627740 200.006017\nv 194.084712 132.494298 205.642845\nv 191.866440 133.856692 198.154410\nv 197.377712 132.373094 204.213746\nv 194.867169 133.481478 199.044854\nv 196.636412 133.438671 197.908312\nv 200.662907 132.213812 202.400045\nv 198.689520 133.310605 197.027931\nv 202.584941 132.068827 201.357137\nv 200.458488 133.190117 196.054409\nv 204.325914 131.869387 200.675676\nv 202.126589 133.047978 195.085218\nv 206.036679 131.667725 199.794861\nv 203.783809 132.910473 194.002993\nv 207.975433 131.398283 198.765859\nv 205.423916 132.740585 192.894850\nv 207.021240 132.543264 191.782933\nv 209.908024 131.486944 194.934768\nv 208.578306 132.333201 190.544291\nv 211.532916 131.242049 193.639564\nv 210.142898 132.101999 189.142243\nv 214.622277 130.638237 191.343047\nv 211.841866 131.969707 185.498119\nv 213.571150 131.537788 184.984580\nv 214.491517 131.369082 183.516306\nv 184.377680 134.572983 195.726496\nv 183.902411 135.259405 189.502021\nv 186.049449 134.562833 195.407357\nv 185.763315 135.247204 189.139984\nv 187.803190 134.533730 195.036183\nv 189.290295 134.515895 194.530625\nv 187.577337 135.220495 188.583054\nv 190.888378 134.390176 194.690056\nv 189.312179 135.182359 188.102188\nv 191.631217 134.531656 192.998599\nv 190.983246 135.083657 188.035099\nv 193.418802 134.424582 192.694844\nv 191.812363 135.144715 186.500067\nv 195.186634 134.324608 192.105153\nv 193.626748 135.021239 186.343186\nv 196.882794 134.219670 191.364599\nv 195.393484 134.895341 185.745701\nv 198.492663 134.105971 190.531995\nv 196.982157 134.760053 185.322666\nv 200.047357 133.993516 189.630771\nv 201.556770 133.851147 188.747942\nv 198.990724 134.654900 183.252383\nv 203.049957 133.683747 187.843727\nv 200.530240 134.476096 182.594070\nv 204.580234 133.517618 186.763460\nv 201.866928 134.320293 181.983469\nv 206.164143 133.286105 185.678320\nv 202.903163 134.223887 180.580964\nv 204.716329 133.940894 179.729780\nv 209.022665 132.945965 181.330497\nv 206.258813 133.731582 176.839304\nv 210.188147 132.740281 179.801767\nv 207.552340 133.490180 175.328636\nv 211.560717 132.441173 178.489369\nv 209.319838 133.100283 174.606826\nv 209.141710 133.141014 173.002485\nv 214.679099 131.605138 175.322232\nv 210.612702 132.770403 171.859882\nv 211.345874 132.539992 169.893166\nv 212.310095 132.218852 168.195102\nv 213.692033 131.744017 166.592806\nv 214.118730 131.495634 164.757861\nv 210.511336 132.568202 165.138665\nv 209.709135 132.854322 166.546856\nv 202.541205 134.381416 166.224965\nv 207.861348 133.401534 169.450016\nv 203.150430 134.177946 164.455279\nv 208.677927 133.165034 168.008456\nv 202.090138 134.515730 167.717531\nv 200.796377 134.743781 175.472795\nv 197.966997 135.162793 170.720012\nv 202.199097 134.524416 175.231502\nv 199.393757 134.965303 169.684641\nv 202.588737 134.482694 173.626000\nv 200.928301 134.721145 168.678392\nv 184.955661 130.197834 219.201686\nv 185.063394 131.487148 213.722212\nv 188.200121 130.172609 218.712294\nv 187.265632 131.520849 213.151512\nv 190.132913 130.194934 218.086159\nv 189.285572 131.533999 212.517495\nv 192.096500 130.185944 217.450470\nv 191.190845 131.541033 211.835094\nv 194.052347 130.151941 216.784660\nv 192.936454 131.578325 210.927565\nv 196.019742 130.110139 215.986950\nv 198.024063 130.048615 215.087395\nv 198.157341 131.186311 209.855453\nv 200.092643 129.899565 214.415213\nv 199.304651 131.301201 208.497138\nv 202.135543 129.716128 213.696480\nv 200.347352 131.388330 207.210641\nv 205.375679 129.486609 211.915097\nv 205.430672 130.799362 205.498449\nv 207.249391 130.597322 204.570823\nv 210.225393 129.211344 207.893123\nv 209.008711 130.371895 203.468629\nv 213.514598 128.579189 206.414775\nv 210.845720 130.067935 202.577444\nv 214.520777 128.614285 204.757708\nv 213.104736 129.868919 200.100025\nv 216.249522 129.484399 196.247107\nv 179.992655 136.035702 165.525781\nv 178.662623 136.118868 171.918916\nv 176.885278 136.085020 171.147367\nv 167.143919 135.468761 172.376837\nv 166.213135 135.221237 178.800155\nv 164.277015 132.456410 203.019651\nv 162.515864 132.306730 202.389013\nv 163.794450 133.340256 196.771085\nv 157.266556 122.841351 233.487946\nv 155.096405 122.263802 233.386093\nv 154.838793 122.786990 231.912364\nv 149.101251 120.331220 233.045347\nv 146.684998 119.380699 232.877701\nv 147.025804 120.349822 231.048053\nv 143.761597 124.421451 215.850250\nv 143.761597 126.184998 209.084702\nv 145.008870 126.993174 207.593500\nv 147.023300 130.487701 158.679199\nv 148.552704 131.001999 158.769897\nv 146.522783 130.512710 160.603790\nv 162.838147 134.427416 159.373877\nv 165.262497 134.768204 159.434006\nv 163.011839 134.736218 163.546452\nv 179.561096 125.703003 233.992493\nv 179.155226 127.364163 229.110068\nv 179.903975 128.554467 225.335773\nv 180.291941 130.064077 219.902745\nv 179.358181 131.460809 214.022899\nv 179.204572 132.653141 208.183933\nv 179.958788 133.646805 202.469886\nv 179.954844 134.486666 196.554945\nv 179.969041 135.176852 190.474667\nv 179.950377 135.747673 183.613365\nv 180.464199 136.054111 177.305790\nv 178.888719 135.811263 161.101674\nv 179.481552 135.719803 159.601753\nv 175.121054 135.618348 159.583870\nv 175.366079 135.737301 161.221084\nv 171.713699 135.422600 159.549354\nv 172.709450 135.487648 159.560799\nv 168.639548 135.271166 161.145728\nv 167.589050 135.045448 159.482849\nv 166.794842 135.304431 165.217561\nv 165.099018 135.043630 164.043450\nv 165.994003 134.870300 159.451996\nv 160.829388 134.218841 161.133459\nv 160.411598 134.011002 159.300445\nv 157.798224 133.855125 163.764553\nv 156.987746 133.572928 162.163206\nv 154.866170 132.827686 159.091827\nv 154.512218 132.888330 160.839923\nv 155.207592 133.160793 162.128730\nv 157.008255 133.329102 159.180252\nv 151.827535 132.285522 161.817491\nv 152.525956 132.212799 158.983352\nv 150.078496 131.494503 158.856752\nv 150.519119 131.885591 161.581379\nv 147.640403 131.003705 161.767005\nv 143.761597 129.619293 161.793503\nv 143.761597 129.243607 158.459793\nv 146.017403 130.110848 158.612755\nv 143.761597 129.725654 162.951355\nv 147.796038 131.191928 163.269553\nv 143.761597 129.880104 164.992706\nv 145.087410 130.569062 168.196979\nv 143.761597 130.032303 167.207001\nv 144.748996 130.356763 166.583462\nv 143.761597 130.026901 167.077301\nv 145.241737 130.692643 169.950943\nv 143.761597 130.180405 170.737305\nv 143.761597 130.140305 169.780807\nv 146.804215 131.273754 172.619178\nv 143.761597 130.233505 174.428497\nv 143.761597 130.205597 172.487900\nv 146.627186 131.216576 174.495526\nv 143.761597 130.216599 175.777306\nv 143.761597 130.182449 178.267250\nv 145.235281 130.717576 177.131781\nv 145.753980 130.835737 179.492102\nv 143.761597 130.046699 181.783401\nv 146.395126 130.967397 181.513415\nv 143.761597 129.817898 185.402775\nv 145.940018 130.515333 185.907049\nv 143.761597 129.481049 189.263550\nv 146.331748 130.359012 189.215306\nv 143.761597 129.042011 193.166015\nv 146.940235 129.432832 198.065679\nv 143.761597 128.033096 199.935898\nv 145.505767 128.465928 201.017441\nv 143.761597 127.909599 200.693497\nv 143.761597 127.445198 203.196106\nv 143.761597 127.364998 203.628006\nv 145.876457 127.972448 204.338922\nv 143.761597 126.741253 206.645699\nv 146.371635 126.880789 210.200916\nv 143.761597 125.272998 212.765998\nv 143.761597 122.569603 221.703796\nv 145.264478 123.986872 219.275605\nv 146.970187 125.862221 215.061500\nv 143.761597 123.681801 218.294693\nv 143.761597 123.518898 218.831802\nv 145.089431 120.671717 228.257426\nv 143.761597 120.944504 226.082993\nv 145.399433 121.466008 226.561049\nv 143.761597 121.718626 224.068577\nv 143.761597 119.137802 230.387696\nv 144.845527 120.048188 229.500265\nv 143.761597 119.958504 228.496094\nv 143.761597 120.481300 227.266693\nv 143.866104 118.137703 232.658600\nv 145.333154 119.631659 230.941201\nv 146.181198 119.178501 232.842102\nv 150.255845 121.943105 230.282292\nv 151.266205 121.102798 233.181396\nv 149.847285 121.196653 231.716135\nv 153.379719 121.768519 233.298757\nv 159.470505 123.370201 233.581207\nv 158.733187 124.757746 229.463398\nv 160.629898 123.608704 233.623199\nv 162.857651 124.050449 233.701096\nv 160.788668 125.107380 229.730168\nv 166.077301 124.583298 233.795105\nv 165.292603 124.472000 233.775497\nv 170.913002 125.188347 233.901748\nv 174.053802 125.455597 233.948898\nv 174.350636 126.917029 229.845726\nv 173.290047 125.403851 233.939751\nv 175.994303 126.586721 231.090440\nv 176.654800 125.610703 233.976196\nv 179.223495 125.692299 233.990601\nv 156.208617 124.687778 227.894337\nv 160.123207 126.487033 225.257586\nv 162.860138 126.703727 226.216728\nv 161.288405 128.192293 220.294664\nv 158.783705 129.451698 213.508905\nv 168.528000 124.924652 233.855255\nv 165.912354 125.141375 232.237693\nv 164.434388 126.833049 226.685087\nv 163.406351 128.168268 221.676026\nv 160.944823 129.658570 214.325332\nv 161.182581 131.103633 207.925556\nv 167.118546 126.954974 227.535701\nv 165.453878 128.395835 221.996420\nv 164.692932 130.065231 215.124026\nv 163.078675 131.251517 208.669916\nv 164.988270 131.367074 209.364798\nv 166.506090 130.086764 216.057657\nv 168.938016 128.713025 222.437577\nv 168.539468 126.991362 227.958225\nv 171.728384 125.804683 232.396072\nv 165.659055 135.304538 171.410833\nv 164.624316 135.072692 177.900026\nv 163.491107 134.618227 183.826903\nv 161.912206 134.464811 182.692413\nv 160.801262 133.818315 188.785554\nv 159.157094 133.648146 187.776165\nv 159.394876 132.927311 194.789652\nv 158.475879 132.903271 193.622679\nv 157.078179 131.885630 199.154205\nv 155.492030 131.728531 198.030238\nv 155.750069 130.636141 204.870126\nv 153.826863 130.409474 203.720296\nv 152.065948 128.891585 209.097281\nv 149.046341 127.117521 212.867878\nv 151.401251 126.204836 218.965491\nv 148.841045 126.022878 216.802536\nv 149.737720 124.393330 223.129801\nv 148.161419 122.168130 227.721674\nv 147.643970 121.370665 229.216962\nv 163.503710 134.488453 185.475624\nv 164.063431 134.097872 190.717680\nv 162.438737 133.966268 189.772275\nv 162.211504 133.223421 195.990755\nv 160.667303 133.079745 195.278370\nv 160.690996 132.182208 201.459082\nv 158.822173 132.042016 200.313896\nv 159.301530 130.948723 207.023055\nv 157.522101 130.787930 206.018052\nv 156.941046 129.380450 212.182334\nv 155.259575 129.239648 211.170103\nv 153.031307 127.324354 216.600587\nv 154.904943 126.135260 222.505398\nv 152.967791 126.356023 220.005333\nv 153.637425 124.429166 226.624632\nv 151.358076 124.268838 225.074601\nv 150.478464 122.518963 229.026453\nv 147.435636 126.957735 211.396639\nv 147.597639 128.289603 205.646448\nv 150.343808 128.982515 206.404950\nv 150.311363 129.854563 201.675604\nv 151.995660 130.133964 202.675591\nv 152.130184 131.264814 195.744963\nv 153.864893 131.530229 196.902711\nv 155.440982 132.610495 190.961451\nv 157.082305 132.798299 192.270362\nv 156.142619 133.254189 185.678416\nv 157.581170 133.449075 186.753145\nv 158.866188 134.087767 180.857039\nv 160.381970 134.288490 181.715804\nv 161.696821 134.730778 175.875156\nv 163.127900 134.913886 176.888659\nv 170.669469 135.453793 161.292134\nv 168.598128 135.524923 166.342847\nv 169.262405 135.222946 159.514152\nv 171.357738 135.616729 163.156673\nv 169.860808 135.679827 168.382064\nv 165.636136 134.217248 191.415776\nv 165.113574 134.736301 184.941464\nv 166.742831 134.830135 186.102603\nv 167.908928 135.348307 179.714059\nv 168.748368 135.613980 173.152050\nv 174.071693 135.652923 160.793277\nv 173.206115 135.755482 163.437556\nv 166.002796 132.533038 203.818059\nv 165.322280 133.435903 197.484062\nv 166.789604 133.489590 198.289309\nv 167.232499 134.316324 192.075890\nv 168.895324 134.405810 192.701100\nv 168.241783 134.858609 187.573705\nv 169.813932 135.020136 187.394259\nv 169.659738 135.462101 180.487518\nv 171.470267 135.565713 181.270484\nv 172.186370 135.841774 174.769402\nv 173.321851 135.943685 170.000196\nv 168.370578 130.120159 216.873021\nv 167.322647 131.534658 209.954350\nv 169.472401 131.560600 210.962785\nv 167.928559 132.546253 205.009103\nv 170.104585 132.684792 205.424760\nv 168.277410 133.527236 199.098374\nv 171.339615 133.739775 199.413046\nv 170.513661 134.454519 193.417048\nv 171.988914 134.436111 194.577130\nv 171.382518 135.115723 187.581334\nv 172.776239 135.177982 187.844529\nv 173.318397 135.620617 182.315478\nv 174.768916 135.621657 183.340581\nv 173.952112 135.931801 175.472956\nv 175.086662 136.016160 170.487313\nv 175.116152 135.864962 163.765472\nv 176.923880 135.780539 161.089774\nv 177.618149 135.698594 159.598000\nv 177.104494 135.938292 164.015086\nv 172.138324 126.896120 229.384162\nv 172.388936 128.635211 223.897988\nv 174.048903 128.612011 224.362408\nv 172.339942 130.168364 218.183017\nv 174.362022 130.144146 218.805147\nv 173.243824 131.560453 212.415793\nv 175.261747 131.527717 213.073892\nv 173.770455 132.710836 206.725599\nv 175.547330 132.702902 207.299230\nv 174.491165 133.740356 200.801805\nv 176.186677 133.723292 201.420340\nv 175.377027 134.556356 195.109982\nv 176.669123 134.488142 196.025926\nv 175.651056 135.120654 190.007470\nv 177.014495 135.223320 189.488141\nv 176.307001 135.681845 183.386351\nv 177.481134 136.030204 176.804352\nv 178.923791 136.031110 177.515538\nv 175.970704 128.601833 224.787771\nv 176.415401 130.021163 219.683024\nv 177.316810 131.498159 213.644870\nv 177.353715 132.684208 207.804186\nv 177.964415 133.681329 201.993974\nv 178.194295 134.508848 196.190596\nv 178.380293 135.220096 189.857129\nv 178.128673 135.727136 183.495436\nv 170.725358 128.639346 223.348950\nv 170.324022 130.145107 217.581416\nv 171.334635 131.567169 211.730974\nv 171.977051 132.719931 206.054049\nv 172.880587 133.743882 200.148016\nv 173.723340 134.596849 194.054091\nv 174.137308 135.166719 188.888634\nv 175.718507 135.991722 176.093556\nv 178.057532 136.018561 165.961883\nv 148.479386 131.755827 177.617203\nv 147.787794 131.571372 175.902699\nv 153.610009 133.191154 172.567112\nv 150.465184 132.372397 171.661059\nv 151.101603 132.505947 169.776706\nv 150.327067 132.228163 167.978089\nv 149.738978 131.973127 166.049528\nv 147.690164 131.292462 165.246350\nv 154.575125 133.379421 169.275473\nv 155.018295 133.434361 167.586896\nv 153.498840 133.035895 166.519358\nv 152.697107 132.750397 164.917479\nv 152.213485 132.499492 163.346170\nv 162.793223 134.902314 168.864567\nv 164.147095 135.116066 170.255899\nv 160.298353 134.520972 174.965598\nv 159.891795 134.340377 165.859365\nv 158.516668 134.069326 165.140343\nv 155.096315 133.515600 175.378569\nv 153.414020 133.158028 174.233121\nv 151.653539 132.565439 180.082227\nv 150.155704 132.239398 177.888474\nv 148.485969 131.378405 185.237699\nv 148.384977 131.443331 183.898615\nv 159.752284 134.389244 167.654585\nv 159.021792 134.327475 172.242188\nv 154.730213 133.390598 177.477361\nv 152.518996 132.723614 181.271978\nv 146.798244 130.339749 190.833631\nv 143.761597 128.433601 197.479851\nv 159.175420 134.352637 173.983684\nv 157.373036 133.847215 180.003835\nv 156.000059 133.606030 178.944746\nv 154.909099 133.081168 184.397204\nv 153.717624 132.923164 182.830232\nv 153.884940 132.415072 189.502580\nv 152.524481 132.243241 187.952785\nv 148.510601 129.784506 199.020684\nv 143.761597 149.819504 162.087906\nv 218.761597 149.819504 162.087906\nv 216.324124 150.537274 162.214478\nv 214.230797 151.106400 162.314850\nv 210.564552 151.999603 162.472298\nv 207.539993 152.632553 162.583954\nv 160.960495 153.628906 162.759598\nv 194.134147 154.468246 162.907601\nv 196.682024 154.231441 162.865841\nv 199.031296 153.962097 162.818405\nv 200.395294 153.799698 162.789703\nv 201.565399 153.628601 162.759598\nv 204.068680 153.255446 162.693748\nv 162.154999 153.803299 162.790405\nv 163.495300 153.962601 162.818497\nv 165.848677 154.232342 162.866029\nv 192.528702 154.587204 162.928604\nv 169.998703 154.587601 162.928696\nv 168.404801 154.469399 162.907799\nv 146.202629 150.538325 162.214658\nv 148.299553 151.108200 162.315155\nv 151.816524 151.967342 162.466646\nv 154.991554 152.634247 162.584198\nv 158.560953 153.272892 162.696831\nv 190.488906 154.725602 162.952949\nv 188.767051 154.813850 162.968545\nv 187.167801 154.866302 162.977798\nv 185.550400 154.917892 162.986893\nv 184.517098 154.939751 162.990746\nv 181.904350 154.965095 162.995201\nv 179.985901 154.958893 162.994095\nv 177.878922 154.935627 162.989991\nv 175.359894 154.866394 162.977798\nv 173.762055 154.814102 162.968597\nv 172.050354 154.726349 162.953094\nv 218.761597 138.789200 236.300003\nv 218.761597 139.853607 233.546799\nv 218.761597 140.480698 231.799698\nv 218.761597 149.932007 163.870300\nv 218.761593 150.064285 166.048497\nv 218.761597 150.158600 168.504105\nv 218.761597 150.218307 171.018295\nv 218.761597 150.239594 171.914307\nv 218.761597 150.236801 173.683197\nv 218.761597 142.180503 226.784798\nv 218.761597 141.029404 230.271194\nv 218.761597 141.516495 228.799194\nv 218.761597 150.226826 176.075203\nv 218.761597 150.136253 179.744499\nv 218.761597 149.954147 183.593597\nv 218.761597 149.778107 186.194305\nv 218.761597 149.650208 187.989594\nv 218.761597 149.448303 190.155601\nv 218.761597 149.281296 191.948105\nv 218.761597 149.047195 193.988998\nv 218.761597 148.830597 195.877304\nv 218.761597 148.571648 197.780655\nv 218.761597 143.663741 221.782473\nv 218.761597 144.503098 218.681198\nv 218.761597 145.337448 215.294403\nv 218.761597 148.300400 199.774506\nv 218.761597 147.724881 203.430627\nv 218.761597 147.007996 207.461807\nv 218.761597 146.665299 209.168701\nv 218.761597 146.248093 211.246201\nv 143.761597 138.789200 236.300003\nv 144.129898 138.908203 236.320999\nv 218.405396 138.904297 236.320297\nv 146.929893 139.809303 236.479851\nv 149.924400 140.669548 236.631554\nv 215.599648 139.807449 236.479500\nv 212.605552 140.667603 236.631150\nv 155.519104 142.011093 236.868103\nv 153.126007 141.481506 236.774704\nv 152.251999 141.260101 236.735596\nv 210.271194 141.259995 236.735596\nv 209.807999 141.377396 236.756302\nv 209.397903 141.481293 236.774704\nv 207.018097 142.007904 236.867493\nv 206.166107 142.196503 236.900803\nv 204.263596 142.559296 236.964706\nv 156.358002 142.196701 236.900803\nv 158.274200 142.562103 236.965195\nv 160.995499 143.041306 237.049698\nv 162.957108 143.357895 237.105499\nv 163.685104 143.454803 237.122604\nv 166.265305 143.798294 237.183197\nv 169.323502 144.122695 237.240402\nv 171.575607 144.309692 237.273407\nv 173.042007 144.425293 237.293793\nv 174.153503 144.483398 237.304001\nv 176.410400 144.601303 237.324799\nv 176.708405 144.608994 237.326096\nv 179.241196 144.673706 237.337601\nv 190.964294 144.308395 237.273102\nv 188.386902 144.482498 237.303802\nv 186.114304 144.601303 237.324799\nv 185.832504 144.608505 237.326096\nv 183.300095 144.673294 237.337494\nv 182.750198 144.687393 237.339996\nv 181.262299 144.696396 237.341599\nv 202.887100 142.821793 237.011002\nv 201.542603 143.038803 237.049301\nv 199.567398 143.357697 237.105499\nv 198.853500 143.452698 237.122299\nv 196.258301 143.798294 237.183197\nv 196.194305 143.806198 237.184601\nv 193.208602 144.121803 237.240250\nv 143.761597 149.932007 163.870697\nv 143.761597 150.143005 167.847794\nv 143.761597 150.075646 166.309052\nv 143.761597 139.853607 233.546799\nv 143.761597 140.480698 231.799698\nv 143.761597 141.029404 230.271194\nv 143.761597 141.505997 228.830795\nv 143.761597 150.227005 175.927055\nv 143.761597 150.236801 173.686295\nv 143.761597 150.239594 171.914307\nv 143.761597 150.218399 171.020493\nv 143.761597 150.158600 168.505707\nv 143.761597 150.136200 179.746903\nv 143.761597 149.996094 182.734802\nv 143.761597 149.954201 183.593300\nv 143.761597 149.777603 186.201706\nv 143.761597 149.650208 187.989594\nv 143.761597 149.447952 190.159798\nv 143.761597 149.281296 191.948105\nv 143.761597 149.046005 193.999695\nv 143.761597 148.830597 195.877304\nv 143.761597 142.236553 226.606049\nv 143.761597 143.661992 221.788897\nv 143.761597 144.503098 218.681198\nv 143.761597 145.360119 215.192898\nv 143.761604 147.721974 203.448993\nv 143.761597 148.300400 199.774506\nv 143.761597 148.570801 197.786743\nv 143.761597 146.248093 211.246201\nv 143.761597 146.889999 208.049507\nv 143.761597 146.554901 209.718307\nv 146.970379 151.050310 168.568742\nv 145.342333 150.566004 167.280765\nv 145.315683 150.640589 177.352426\nv 145.448993 150.384831 184.104370\nv 145.355247 149.757942 191.575899\nv 145.512524 146.761000 211.218463\nv 145.249499 145.475832 216.551668\nv 146.665267 143.169704 226.465713\nv 167.779983 154.478830 164.564243\nv 153.417590 152.409450 164.399632\nv 148.647345 151.474729 168.194008\nv 150.481109 151.921274 168.233237\nv 147.073571 150.891305 164.030308\nv 148.606084 151.395795 166.164970\nv 154.960859 152.797892 166.259402\nv 161.543413 153.884671 167.508596\nv 159.851262 153.586991 165.424075\nv 164.310098 154.232396 167.657806\nv 169.700879 154.640895 164.620716\nv 171.427210 154.802469 166.137370\nv 171.367109 154.823501 167.772000\nv 176.588489 155.022852 166.455483\nv 178.152512 155.079083 167.327760\nv 179.668541 155.107990 167.639389\nv 180.609769 155.070822 166.218009\nv 181.167509 155.077001 176.706130\nv 179.202773 155.123545 174.109232\nv 181.051552 154.971379 179.904852\nv 179.291568 154.955851 179.948738\nv 180.830677 154.900983 181.303583\nv 181.829530 154.678994 185.317208\nv 178.594591 154.631934 185.649624\nv 180.306352 154.648499 185.697778\nv 181.128992 154.187364 191.335612\nv 180.856867 154.338527 189.672049\nv 179.894179 153.580938 197.057700\nv 181.498355 153.470254 197.961841\nv 179.302620 152.881080 202.308244\nv 180.636361 152.177581 206.892117\nv 180.898907 151.883583 208.683985\nv 179.139162 151.894421 208.541971\nv 180.938932 151.121826 212.851663\nv 179.255704 151.008538 213.379237\nv 180.593268 148.487508 224.578407\nv 178.856799 149.724216 219.388581\nv 179.484810 148.596960 224.124721\nv 181.571450 147.602369 227.892121\nv 179.845757 147.184947 229.370215\nv 178.079451 147.168873 229.317214\nv 181.166891 146.209607 232.662261\nv 182.754023 145.693296 234.284355\nv 179.753650 145.712722 234.224037\nv 177.208597 145.689396 234.106212\nv 174.331767 145.444661 234.463785\nv 173.039667 145.565404 233.824468\nv 168.408414 145.210206 233.676501\nv 166.759507 145.134110 233.345663\nv 164.672997 144.056488 235.772315\nv 163.275657 143.863783 235.758372\nv 158.331897 143.066781 235.589231\nv 156.495797 143.301209 233.825785\nv 154.462354 143.357036 232.338917\nv 151.229149 141.511474 235.288624\nv 148.179478 140.796603 234.888308\nv 145.173010 140.451401 233.225622\nv 146.577169 142.602184 228.253217\nv 145.259616 144.044452 222.036591\nv 147.573095 147.071662 212.405643\nv 145.862561 148.188046 204.157212\nv 147.310426 148.957980 201.750787\nv 145.421940 148.940399 198.536649\nv 146.695741 149.769373 194.639558\nv 146.638966 150.917675 179.866188\nv 146.891951 151.105717 172.446011\nv 146.899689 151.085203 170.450975\nv 147.559263 151.087973 165.319048\nv 149.540282 142.834250 230.183278\nv 148.209177 144.399051 223.881803\nv 151.094887 144.630359 225.692878\nv 152.742993 144.343537 227.978013\nv 154.793319 144.611493 228.648025\nv 158.409928 144.821576 230.318079\nv 160.406897 145.202860 230.249975\nv 161.135538 144.869836 231.678566\nv 176.287098 147.138620 229.221185\nv 174.500041 147.068302 229.174953\nv 172.708324 146.949964 229.192911\nv 170.824743 147.222224 227.741653\nv 167.122725 147.036555 227.169541\nv 165.056126 146.831964 227.017087\nv 162.934914 146.876362 225.856994\nv 161.359309 146.863277 225.041312\nv 160.009338 146.894440 224.109485\nv 154.634052 146.288906 222.656257\nv 151.659465 145.690519 222.371938\nv 149.910729 145.813734 220.287931\nv 146.754672 145.437075 218.464541\nv 176.286705 148.352027 224.731394\nv 174.267160 148.328503 224.474598\nv 172.171280 148.273279 224.196844\nv 170.207616 148.395802 223.163651\nv 168.305482 148.325885 222.778470\nv 166.394096 148.299359 222.092122\nv 164.356910 148.305097 221.086753\nv 162.329825 148.157807 220.582846\nv 160.296251 148.153274 219.335266\nv 153.178800 147.276321 217.435432\nv 151.454713 147.381814 215.377477\nv 149.960532 147.418978 213.566865\nv 164.252001 154.051204 180.735830\nv 165.531045 154.369825 175.294520\nv 168.136814 154.574247 176.670998\nv 166.078377 154.220676 181.061660\nv 169.896332 154.687644 177.175173\nv 167.867695 154.272640 183.155506\nv 169.664532 154.369020 183.857208\nv 171.801665 154.757417 178.555343\nv 172.204269 154.504477 184.318187\nv 173.755790 154.789702 180.130990\nv 175.396044 154.554844 185.620800\nv 176.963110 154.599862 185.625749\nv 165.520442 154.387963 169.289103\nv 167.518713 154.578508 169.608205\nv 169.491242 154.731060 169.746654\nv 171.454040 154.871368 171.339693\nv 173.356813 154.971755 172.118890\nv 175.297781 155.046788 172.936399\nv 177.252630 155.098896 173.609254\nv 177.354350 151.876580 208.425720\nv 177.835859 152.719864 203.205221\nv 175.536925 151.829017 208.363552\nv 176.076224 152.774376 202.535037\nv 173.866317 151.750819 208.378788\nv 174.367571 152.776657 202.075666\nv 171.960449 151.904137 206.876994\nv 172.734611 152.771791 201.527053\nv 170.276089 151.861598 206.448182\nv 171.112132 152.762008 200.876083\nv 168.543893 151.895194 205.364557\nv 169.514815 152.723529 200.327641\nv 166.938492 151.739489 205.439126\nv 167.876707 152.730010 199.249728\nv 165.200928 151.800765 203.895618\nv 166.386762 152.610946 199.150746\nv 163.426353 151.759450 202.834490\nv 164.812103 152.475475 198.956101\nv 161.666151 151.584677 202.538838\nv 161.308141 152.301121 197.040884\nv 159.688445 151.445966 201.619311\nv 159.496638 152.125012 196.381812\nv 157.521593 151.163923 201.284998\nv 157.732219 151.851614 196.439462\nv 154.372584 150.901594 199.251960\nv 156.031507 151.767833 194.792380\nv 152.660771 150.583429 199.078980\nv 154.217571 151.594053 193.376120\nv 150.938493 150.455882 197.365572\nv 149.270354 150.217213 196.254684\nv 152.432526 151.535205 190.472838\nv 148.003342 150.002733 195.491470\nv 150.602283 151.205720 189.893838\nv 148.817647 150.844543 189.382076\nv 147.103559 150.574495 187.646860\nv 178.278147 153.420550 198.094795\nv 176.685853 153.484218 197.309883\nv 177.770171 154.101183 191.865765\nv 175.084351 153.513510 196.651654\nv 176.056896 154.117363 191.279300\nv 173.490612 153.516332 196.041250\nv 174.379238 154.152917 190.218042\nv 171.986644 153.486862 195.589217\nv 172.858342 154.080649 190.258658\nv 170.471764 153.475308 194.810506\nv 171.288742 154.060467 189.474134\nv 169.095511 153.387372 194.719343\nv 169.757080 154.006344 188.885383\nv 168.564200 153.865203 189.490686\nv 166.310035 153.173463 194.469090\nv 167.062492 153.794757 188.858936\nv 164.807516 153.190577 192.910070\nv 165.529930 153.774147 187.345990\nv 163.020512 153.109597 191.697838\nv 164.000544 153.718481 185.842474\nv 160.917466 152.870819 191.442123\nv 160.797840 153.019745 189.590353\nv 162.390094 153.529206 185.868115\nv 158.517909 152.717334 189.396039\nv 160.771076 153.438563 184.166035\nv 156.715233 152.523345 188.369648\nv 159.237041 153.280571 183.268306\nv 157.678473 153.090645 182.431949\nv 154.643494 152.336280 186.035568\nv 156.071955 152.889404 181.179665\nv 152.987189 152.109466 184.761254\nv 151.613444 151.851694 184.425871\nv 154.453549 152.648175 180.185024\nv 150.480172 151.697245 182.972023\nv 152.836861 152.356076 179.538184\nv 149.373462 151.520492 181.469416\nv 151.801355 152.210103 177.755104\nv 147.886581 151.188079 181.008919\nv 150.632840 151.996122 175.838598\nv 148.618614 151.522498 175.529377\nv 146.936601 151.107559 174.346026\nv 152.569166 152.426179 170.706415\nv 152.028138 152.253564 168.220115\nv 152.682025 152.456161 172.597814\nv 156.577545 153.143100 168.163765\nv 153.934406 152.708626 172.901610\nv 154.921026 152.884142 174.535006\nv 161.174564 153.897641 172.759286\nv 159.302452 153.570176 176.547462\nv 160.753187 153.744810 177.566871\nv 163.943712 154.205762 174.927514\nv 160.750683 153.696746 179.145306\nv 162.438093 153.897606 179.591031\nv 176.735558 149.842051 218.641948\nv 177.505710 151.306545 211.573014\nv 174.853966 149.833478 218.361185\nv 174.106365 151.139645 211.799831\nv 173.079216 149.796604 218.103930\nv 172.370832 151.048090 211.777798\nv 171.591915 149.748270 217.882057\nv 170.797467 150.952454 211.740998\nv 168.885228 149.672458 217.284774\nv 169.186555 150.844512 211.681124\nv 166.370282 149.565859 216.652859\nv 167.566426 150.709917 211.631787\nv 164.351026 149.382856 216.422904\nv 165.700315 150.765279 210.337659\nv 162.467360 149.447223 215.012488\nv 163.861184 150.724503 209.413001\nv 160.621161 149.202798 214.914671\nv 162.112502 150.522046 209.340472\nv 158.827554 149.222260 213.503829\nv 160.257680 150.454430 208.282148\nv 157.044077 149.125091 212.490595\nv 158.484885 150.343993 207.363113\nv 155.569064 149.190142 210.792781\nv 156.787187 150.277344 206.060750\nv 152.518174 148.657947 210.462243\nv 150.062505 148.479030 208.477633\nv 152.899512 149.782149 204.698201\nv 148.716816 148.199707 208.258623\nv 150.458616 149.521200 203.032745\nv 147.632230 148.261212 206.411312\nv 149.172500 149.461966 201.515861\nv 213.979635 141.305104 233.768868\nv 212.491588 141.213854 235.221374\nv 217.155189 147.995902 204.520248\nv 215.691745 148.125399 206.030624\nv 209.414933 152.331454 164.027241\nv 195.206285 154.437851 164.548883\nv 182.293681 155.128430 169.456701\nv 184.093199 155.106944 168.357726\nv 184.008785 145.555487 234.625804\nv 181.572384 147.178485 229.416745\nv 182.649490 149.649484 219.787917\nv 182.749453 150.744137 214.686126\nv 182.918044 151.953973 208.249932\nv 180.667159 152.741546 203.324099\nv 182.813683 154.073753 192.412574\nv 182.875861 154.959147 180.015255\nv 183.214746 155.131795 173.781933\nv 185.897186 155.054936 167.510128\nv 187.921637 154.956373 166.370721\nv 189.586449 154.897656 166.469988\nv 193.149021 154.615307 164.612378\nv 201.004724 153.839891 166.045832\nv 198.926757 154.149982 167.481286\nv 203.696910 153.388370 164.472759\nv 205.501687 153.229812 168.385568\nv 215.810351 150.868604 165.628006\nv 214.813899 151.053597 163.919348\nv 217.069893 150.654994 168.937844\nv 216.238838 150.939029 171.211344\nv 215.974637 151.012535 173.290453\nv 217.214739 150.621243 177.902731\nv 217.258864 150.642844 176.234431\nv 215.569075 151.000646 179.824172\nv 215.350770 150.645819 186.951882\nv 215.734975 150.637774 185.681497\nv 217.245964 149.833175 190.500910\nv 215.575335 150.014570 193.107834\nv 217.024671 149.030340 197.950602\nv 217.052894 148.774873 199.758081\nv 214.587224 149.207927 201.218624\nv 217.048842 147.001609 209.957967\nv 215.054880 147.066453 212.280705\nv 217.064496 144.085311 222.147748\nv 217.054381 142.591492 227.176641\nv 215.547576 142.422918 229.174166\nv 217.180761 140.585224 233.027068\nv 207.071869 143.314230 233.130731\nv 204.210418 143.067278 235.574525\nv 201.145142 143.641507 235.543012\nv 193.685443 145.159201 233.966006\nv 185.609002 145.601041 234.345837\nv 188.048644 145.527337 234.219331\nv 211.576353 142.891396 231.162363\nv 213.062053 142.548220 230.965891\nv 213.624536 144.641075 223.644102\nv 211.798636 144.443241 226.016319\nv 208.249195 144.711909 227.931641\nv 206.764382 144.667076 229.121044\nv 203.953323 144.886095 230.211812\nv 202.340191 145.193408 230.141600\nv 200.658919 144.907512 231.935819\nv 198.893874 145.204233 231.853943\nv 195.756779 144.961891 233.870204\nv 185.435942 147.070931 229.536789\nv 187.598636 146.962369 229.602320\nv 189.342291 146.824685 229.711953\nv 191.956931 146.892928 228.832516\nv 202.563674 146.736517 224.689340\nv 204.333558 146.643805 223.914306\nv 206.229859 146.619948 222.662752\nv 208.121876 146.266557 222.565014\nv 210.003216 145.860020 222.491936\nv 212.128927 145.787854 220.858683\nv 215.737174 145.731254 217.323992\nv 186.275044 148.395044 224.561876\nv 188.172286 148.482609 223.900095\nv 189.905809 148.454134 223.642636\nv 191.793909 148.407114 223.298157\nv 193.759768 148.463079 222.390245\nv 195.481839 148.256163 222.516939\nv 197.167138 148.309536 221.551689\nv 200.961289 147.929636 221.048663\nv 202.556397 147.825276 220.472414\nv 209.743581 147.650603 215.466068\nv 211.447352 147.381673 214.992951\nv 212.984556 147.149381 214.370011\nv 197.795740 154.279607 175.397877\nv 198.640441 154.033730 180.344300\nv 199.796340 153.942409 179.262326\nv 197.985798 154.281864 173.755074\nv 198.278593 153.994254 181.864032\nv 195.375019 154.481227 176.859091\nv 197.017396 154.124791 181.939311\nv 197.192837 154.373127 169.199009\nv 194.691022 154.339197 181.858370\nv 193.026322 154.650145 177.328188\nv 192.893519 154.397142 183.337069\nv 190.260870 154.801231 178.406262\nv 191.260772 154.410621 184.769596\nv 187.889470 154.832911 180.065658\nv 189.625713 154.508492 184.695282\nv 188.065065 154.583607 184.679388\nv 186.421418 154.884426 180.071230\nv 186.542113 154.638021 184.710492\nv 184.979014 154.667200 184.823724\nv 195.258948 154.557061 169.498091\nv 193.224635 154.724036 170.369830\nv 191.294531 154.847699 170.261376\nv 189.327765 154.966227 172.190578\nv 187.344783 155.039052 173.330150\nv 191.514806 154.764469 165.670786\nv 184.137634 152.779983 202.909398\nv 184.701269 151.957679 208.060317\nv 186.479113 151.927933 207.911974\nv 188.168857 152.767484 202.103037\nv 188.225804 151.866845 207.845698\nv 189.525770 152.789099 201.500597\nv 189.926441 151.767438 207.888268\nv 191.138670 152.818686 200.572049\nv 191.839150 151.858087 206.655539\nv 192.693823 152.702404 200.681853\nv 193.700086 151.900481 205.484699\nv 194.277526 152.562893 200.741203\nv 195.317911 151.736322 205.638876\nv 195.987771 152.603545 199.323633\nv 197.091558 151.707939 204.709414\nv 197.594603 152.515413 198.756808\nv 198.840802 151.639988 203.883741\nv 199.309229 152.424725 197.954811\nv 200.603072 151.573858 202.871733\nv 201.066095 152.258802 197.557981\nv 202.408187 151.380163 202.525536\nv 202.861350 152.166182 196.291033\nv 204.360096 151.356345 200.644951\nv 204.471910 151.946830 196.103283\nv 206.100559 151.080217 200.599129\nv 206.061072 151.697279 195.944481\nv 207.806119 150.784865 200.512858\nv 207.613909 151.609821 194.361469\nv 208.956238 150.800035 198.851850\nv 207.549151 151.780011 192.901037\nv 211.911116 150.454553 196.798662\nv 213.161928 150.185426 196.607086\nv 214.983243 149.998372 194.586659\nv 213.444679 150.945263 188.972773\nv 185.104133 153.466617 197.594411\nv 184.463793 154.166287 191.296770\nv 186.179140 154.164735 190.889271\nv 186.844109 153.518809 196.788558\nv 187.869963 154.146231 190.429510\nv 188.525912 153.533577 196.096486\nv 189.641718 154.140814 189.540760\nv 190.143457 153.516938 195.508593\nv 191.241416 154.035194 189.696514\nv 191.735484 153.520609 194.563641\nv 192.882731 154.049389 188.199678\nv 193.175836 153.408737 194.691650\nv 194.789139 153.377608 193.768224\nv 195.293819 153.854832 188.389808\nv 196.658565 153.250657 193.312089\nv 197.042924 153.669656 188.492099\nv 197.945159 153.259585 191.928607\nv 198.389549 153.622517 187.361072\nv 199.563740 153.010770 192.667178\nv 199.964655 153.550544 185.863284\nv 201.258921 152.868992 191.940519\nv 201.520442 153.434278 184.752989\nv 202.896526 152.809858 190.230639\nv 202.374068 153.339293 184.501431\nv 204.411954 152.662703 189.362889\nv 203.660209 153.182816 184.035560\nv 205.835854 152.485720 188.806295\nv 205.344761 152.983001 182.968694\nv 207.088959 152.334015 188.032655\nv 206.907986 152.756313 182.190752\nv 208.596302 152.184984 186.399234\nv 206.961804 152.839428 180.228003\nv 209.893649 152.017469 185.165810\nv 208.321038 152.598171 180.080265\nv 211.153309 151.826612 184.112582\nv 209.591129 152.406274 178.730800\nv 212.508790 151.591057 183.080642\nv 210.821285 152.190746 177.576504\nv 213.914006 151.320767 181.898109\nv 212.085510 151.950523 176.213633\nv 213.418290 151.653310 175.269304\nv 214.617600 151.366082 173.467108\nv 214.161136 151.320314 165.676610\nv 213.237394 151.616001 167.354444\nv 211.893639 151.963495 168.366626\nv 210.633477 152.265422 169.557745\nv 209.381751 152.542915 170.886904\nv 203.623320 153.559370 170.228382\nv 207.637431 152.885588 172.113628\nv 200.745326 153.968386 172.081046\nv 204.113237 153.453275 175.605070\nv 205.721195 153.211526 175.178120\nv 201.437927 153.763523 178.586460\nv 204.081163 153.418912 177.305002\nv 185.412018 149.798154 218.907049\nv 186.985504 150.910334 213.378664\nv 187.588216 149.807971 218.499972\nv 188.858987 150.908362 212.957980\nv 189.403519 149.783282 218.189158\nv 190.675592 150.876480 212.560879\nv 191.557258 149.755169 217.672364\nv 192.697130 150.959076 211.336123\nv 194.174667 149.696684 216.934077\nv 194.433944 150.794702 211.453885\nv 195.363206 149.624808 216.745601\nv 196.299332 150.759815 210.675911\nv 197.255407 149.535363 216.217675\nv 198.140362 150.717487 209.795382\nv 199.207336 149.533835 215.119112\nv 201.169223 149.410194 214.450652\nv 203.099813 149.259313 213.795220\nv 205.055617 149.049469 213.243841\nv 207.108419 148.895440 212.178919\nv 208.614522 150.031803 204.368040\nv 209.032904 148.902307 210.221088\nv 210.073923 149.753269 204.322097\nv 214.195577 148.509756 205.995599\nv 213.233253 149.413022 202.062724\nv 188.728977 135.754904 179.889601\nv 196.037939 135.296954 177.137217\nv 217.552610 130.576346 179.037520\nv 218.761597 129.271950 191.142250\nv 217.819303 129.600795 191.121275\nv 217.542056 128.610872 199.019726\nv 218.761597 127.066651 205.071556\nv 217.113994 127.413132 206.247243\nv 218.761597 125.657402 211.245048\nv 217.369854 121.813493 225.414772\nv 215.638499 130.575887 159.984936\nv 213.928546 131.158580 160.186931\nv 208.485007 132.749257 160.676341\nv 210.455285 132.229244 160.513751\nv 204.005905 133.642098 159.235405\nv 203.421649 133.873100 160.680321\nv 199.001007 134.609064 160.555835\nv 200.563325 134.395941 160.758067\nv 190.581565 135.526725 160.924060\nv 182.924502 135.822468 161.062960\nv 181.023482 135.996854 164.180215\nv 181.774277 136.123280 173.855386\nv 181.660685 135.908311 180.393663\nv 182.865997 135.490355 186.807428\nv 181.564018 135.074213 191.547800\nv 181.622248 134.131678 199.200165\nv 181.565737 133.480617 203.519530\nv 181.381271 132.617182 208.412011\nv 181.625146 129.883135 220.617468\nv 182.913658 127.728576 227.993922\nv 181.447354 126.777154 230.978087\nv 182.160219 126.250003 232.476461\nv 183.651353 126.208504 232.483534\nv 185.350733 126.111264 232.604286\nv 187.143981 126.395905 231.516606\nv 188.610910 125.940871 232.539989\nv 192.568789 125.626659 232.380221\nv 198.299692 124.864161 232.236001\nv 198.911257 125.329989 230.643083\nv 200.265340 124.542890 232.093586\nv 202.114463 124.910737 230.051434\nv 202.226759 124.235844 231.787180\nv 204.059759 123.706785 232.032982\nv 205.442321 123.267777 232.249759\nv 211.935205 121.481809 231.699628\nv 218.761597 124.839248 214.343353\nv 216.172561 125.952533 213.815909\nv 217.367137 126.662932 209.269595\nv 217.031660 128.165735 202.623440\nv 218.751396 129.944973 183.498150\nv 218.761597 129.649399 187.370400\nv 218.761597 130.114754 180.020600\nv 217.220760 130.765738 173.177343\nv 217.551375 130.628066 171.614566\nv 216.800830 130.439634 163.005882\nv 217.327534 129.918282 159.651323\nv 217.131654 130.154186 161.110000\nv 214.049320 121.227116 230.339651\nv 216.068239 121.442042 227.807612\nv 210.449030 122.329025 230.844089\nv 210.290685 123.167056 228.834237\nv 213.551856 122.128313 228.605195\nv 213.239686 122.911167 226.821675\nv 215.996478 122.080148 226.223332\nv 214.587786 122.831729 225.684770\nv 205.320703 123.841674 230.833733\nv 204.792514 124.577552 229.260916\nv 206.621332 123.889657 229.801033\nv 207.435652 124.111382 228.604171\nv 207.132640 124.779175 226.975036\nv 208.664479 124.027620 227.873432\nv 210.105261 123.985099 226.761043\nv 209.900667 124.720193 224.836468\nv 211.586617 123.831706 225.875644\nv 213.042026 123.615732 225.067376\nv 214.471679 123.486454 223.960729\nv 214.241580 124.196836 222.172713\nv 215.975133 123.327718 222.759436\nv 216.857502 123.469043 221.309878\nv 216.361224 124.191551 219.706174\nv 217.779687 123.507967 220.095761\nv 218.761597 123.044250 220.267799\nv 193.515274 126.036922 230.885532\nv 195.467083 125.787973 230.867177\nv 196.429870 126.142760 229.435244\nv 197.860595 125.890564 229.532258\nv 199.314374 125.915530 228.722171\nv 201.263221 125.576894 228.644028\nv 202.274199 125.919613 227.019103\nv 201.080560 126.525611 225.948118\nv 204.197245 125.288538 227.641696\nv 203.584183 126.463784 224.509126\nv 205.516453 125.377123 226.453028\nv 206.808241 125.476620 225.158647\nv 206.414667 126.169352 223.352745\nv 208.211648 125.464152 224.068418\nv 209.699308 125.364508 223.059457\nv 211.218010 125.193929 222.150915\nv 211.145467 125.842493 220.171377\nv 212.722172 124.984629 221.305781\nv 213.986765 124.768870 220.608625\nv 212.921704 125.572051 219.177939\nv 214.818477 124.892328 219.271851\nv 216.094307 124.818556 217.950587\nv 217.446038 124.595312 216.986280\nv 217.443546 125.127208 215.132236\nv 184.805295 127.761679 227.727457\nv 186.790170 127.769716 227.426091\nv 188.896874 127.668811 227.335112\nv 190.897040 127.656982 226.858365\nv 192.811041 127.537088 226.637799\nv 196.864533 127.472957 225.163075\nv 198.815453 127.393535 224.431344\nv 200.514912 127.477824 223.177660\nv 202.251528 126.999209 223.695310\nv 204.205777 126.918181 222.568831\nv 206.144521 126.794127 221.485010\nv 207.773150 126.749844 220.274576\nv 209.428284 126.672134 219.031997\nv 211.081835 126.486003 218.010109\nv 212.471730 126.274844 217.231472\nv 212.758979 126.623364 215.630534\nv 214.447120 126.244029 214.997672\nv 214.535452 126.728892 213.028924\nv 217.419094 125.904404 212.268314\nv 215.954436 126.538803 211.833429\nv 217.332888 126.322320 210.717595\nv 198.089703 135.115728 174.502052\nv 194.580678 135.527194 170.227806\nv 196.552511 135.296040 174.978485\nv 193.585245 135.624822 171.353149\nv 194.024157 135.485548 177.391940\nv 192.032719 135.751197 171.685790\nv 192.249121 135.617346 177.856110\nv 190.249648 135.869040 172.207425\nv 190.354402 135.727486 178.385503\nv 188.487853 135.958057 173.080863\nv 184.480380 135.896385 180.051021\nv 186.486074 135.859168 179.572958\nv 186.741858 136.019200 174.046361\nv 184.976909 136.060844 174.721644\nv 183.512155 136.106518 173.415047\nv 183.106023 135.894071 180.549255\nv 184.070917 135.898931 162.587156\nv 186.071916 135.847332 162.566488\nv 188.820019 135.643897 161.036907\nv 196.192974 135.135185 163.189591\nv 194.156783 135.319480 162.521363\nv 193.904703 135.483952 165.355376\nv 192.976880 135.498387 163.844541\nv 192.012550 135.641096 165.448185\nv 190.139696 135.775727 165.582706\nv 188.332125 135.874811 165.600074\nv 187.036697 135.966611 166.891858\nv 185.410961 136.039994 167.841198\nv 183.835629 136.093251 168.894334\nv 181.993221 136.099524 168.268543\nv 183.120800 133.342642 204.212579\nv 184.409007 133.221444 204.782242\nv 185.796435 133.234970 204.455221\nv 187.453319 133.241755 204.007525\nv 189.158958 133.242651 203.453582\nv 190.653686 133.225207 202.962434\nv 192.323937 133.051229 203.240686\nv 194.351609 132.942308 202.760101\nv 194.730809 133.202287 200.901849\nv 198.196923 132.816451 200.746314\nv 199.781146 132.787109 199.507961\nv 201.496124 132.671269 198.534462\nv 203.227601 132.512845 197.614683\nv 204.955451 132.328432 196.660421\nv 206.679341 132.125489 195.584910\nv 208.358975 131.912604 194.404405\nv 210.003466 131.694563 193.028573\nv 211.703935 131.609378 189.849381\nv 213.350874 131.273107 188.683376\nv 215.209469 130.828436 187.480560\nv 216.614335 130.532024 185.548183\nv 216.032838 130.855942 183.704782\nv 217.229951 130.530035 182.473936\nv 217.258030 130.620877 180.608535\nv 183.192823 134.907372 192.855236\nv 184.985342 134.913333 192.481045\nv 186.747035 134.897230 192.108585\nv 188.510479 134.858927 191.733131\nv 190.382573 134.798833 191.256544\nv 191.586511 134.874611 189.739193\nv 192.913934 134.755831 189.858593\nv 194.296324 134.698757 189.155483\nv 195.917424 134.592264 188.570555\nv 197.413818 134.473423 187.998537\nv 198.812276 134.369719 187.195089\nv 200.258639 134.248242 186.267431\nv 201.754723 134.095356 185.344986\nv 203.240633 133.920476 184.353768\nv 204.746437 133.732130 183.190301\nv 206.204632 133.512340 182.082758\nv 207.385875 133.330810 180.887902\nv 208.415339 133.171788 179.327888\nv 209.784124 132.900158 177.956673\nv 211.008585 132.648702 175.178552\nv 212.018359 132.385239 173.581223\nv 212.700864 132.179661 171.605177\nv 214.212125 131.708714 170.423989\nv 214.014359 131.712784 168.522363\nv 215.587946 131.070970 165.846186\nv 217.142849 130.452033 164.823505\nv 183.370198 134.142906 198.953196\nv 185.192485 134.145071 198.641295\nv 187.015883 134.132521 198.270613\nv 188.803174 134.100420 197.874043\nv 190.314100 134.054057 197.533426\nv 191.443576 134.133597 196.353662\nv 193.172320 133.943950 196.711820\nv 194.718739 133.931542 195.700153\nv 196.359614 133.865595 194.835202\nv 197.948964 133.767172 194.113702\nv 199.532042 133.663021 193.231070\nv 201.121320 133.548934 192.195361\nv 202.699246 133.409409 191.135065\nv 204.235897 133.244049 190.170251\nv 205.726462 133.061319 189.175921\nv 207.147433 132.871244 188.079150\nv 208.480829 132.692215 186.788769\nv 209.861059 132.497295 185.185372\nv 211.209309 132.276456 183.480852\nv 212.318652 132.075724 181.862673\nv 213.449037 131.823234 180.522291\nv 214.447006 131.585634 179.031009\nv 215.446970 131.325532 177.190121\nv 216.832482 130.888593 175.318354\nv 209.701016 132.574443 162.171360\nv 209.201847 132.827229 163.816250\nv 208.946017 132.980497 165.202004\nv 204.319078 134.127769 168.976175\nv 205.173707 133.915407 167.523077\nv 206.909415 133.562359 167.771848\nv 197.476814 134.871590 161.283262\nv 201.051580 134.550770 164.874977\nv 201.115592 134.715677 172.412716\nv 202.908767 134.426756 172.002486\nv 200.735943 134.452707 162.045081\nv 203.777987 133.936599 162.496330\nv 207.898343 133.283953 166.287219\nv 203.489220 134.309790 170.438488\nv 199.312175 134.871215 166.032059\nv 197.673130 135.174751 169.085036\nv 184.642870 135.497024 186.344247\nv 186.403075 135.494469 185.727363\nv 187.918953 135.355193 186.749425\nv 189.834121 135.306229 186.076957\nv 189.576083 135.476729 184.010100\nv 192.747546 135.249441 184.088181\nv 194.369480 135.161793 183.295371\nv 196.027234 135.045944 182.472158\nv 197.676275 134.892843 181.918663\nv 200.090108 134.672824 179.921154\nv 201.516463 134.500568 179.149020\nv 203.403381 134.274008 176.709222\nv 204.813042 134.023282 176.407008\nv 205.520184 133.911125 175.124555\nv 206.369084 133.752894 173.645924\nv 207.532676 133.504246 172.396316\nv 208.705679 133.227531 171.227532\nv 209.589436 132.987679 169.769051\nv 210.507388 132.703574 168.151782\nv 211.609730 132.332664 166.591375\nv 212.317729 132.046936 165.020441\nv 212.815938 131.782898 163.396195\nv 213.430607 131.460223 161.752307\nv 183.059122 130.915332 216.357432\nv 184.910406 130.876320 216.345501\nv 186.811069 130.859856 216.095028\nv 188.767921 130.879062 215.547003\nv 190.709313 130.876105 214.964943\nv 192.636194 130.877160 214.229993\nv 194.526876 130.879995 213.362776\nv 196.139306 130.827397 212.750426\nv 198.106200 130.467982 213.191156\nv 198.957993 130.738429 211.395628\nv 200.829189 130.578094 210.789057\nv 202.686225 130.451226 209.876376\nv 204.594972 130.253014 209.076071\nv 206.508733 129.990271 208.367220\nv 208.526064 129.669708 207.715263\nv 210.261859 129.510244 206.342715\nv 212.166880 129.512725 203.598752\nv 213.728713 129.137134 203.179469\nv 214.249128 129.281409 201.460813\nv 215.752277 128.857402 201.160817\nv 216.191697 129.011900 199.362013\nv 216.910923 129.037585 197.714251\nv 217.568933 129.033709 196.265266\nv 218.761597 128.771950 195.126152\nv 184.023233 129.460414 222.004031\nv 187.604024 129.384310 221.772651\nv 189.556744 129.402093 221.228835\nv 191.523149 129.372231 220.735488\nv 193.515598 129.346689 220.088197\nv 195.485227 129.332803 219.272227\nv 197.349726 129.296504 218.459854\nv 199.155648 129.166143 217.935617\nv 201.015871 128.940428 217.599454\nv 201.952366 129.260799 215.664609\nv 203.910716 128.788127 216.025441\nv 205.665232 128.617933 215.233531\nv 207.613485 128.539103 213.726725\nv 209.686002 128.149347 213.153485\nv 212.130306 128.074638 210.583263\nv 213.797593 127.685284 210.063298\nv 214.561164 127.853451 208.226128\nv 216.197348 127.345699 208.049329\nv 216.041379 128.110790 204.663947\nv 217.499201 127.649680 204.434390\nv 184.128178 132.130757 210.648617\nv 186.108427 132.112806 210.465642\nv 188.037047 132.130256 209.931573\nv 189.913903 132.144374 209.280327\nv 191.712089 132.122779 208.694109\nv 193.543351 132.027918 208.331648\nv 195.470125 131.870774 208.057927\nv 194.342574 132.205597 207.002257\nv 197.535640 131.660589 207.876998\nv 198.106281 131.960724 205.870240\nv 199.759713 131.742976 205.760409\nv 201.423922 131.471058 205.827761\nv 202.732071 131.524393 204.338576\nv 204.488335 131.225144 204.188238\nv 205.645459 131.347445 202.154112\nv 210.033547 130.820275 199.288541\nv 211.604189 130.689638 197.465419\nv 213.053235 130.491676 196.052775\nv 214.250453 130.346929 194.498212\nv 215.312495 130.222806 192.824161\nv 216.192522 130.172686 190.921619\nv 217.470734 129.932651 189.215649\nv 178.299159 136.074105 168.190587\nv 167.456474 135.432980 175.737948\nv 163.150991 132.858781 199.441549\nv 164.112592 134.706402 160.697971\nv 181.124290 127.655029 228.299422\nv 179.578662 127.992734 227.155161\nv 180.448255 129.128908 223.365601\nv 181.157085 130.885319 216.583168\nv 179.523270 130.744495 217.096505\nv 180.046469 132.034480 211.295930\nv 181.208197 131.760433 212.685888\nv 181.619562 133.218291 205.092932\nv 180.085099 133.073771 205.840956\nv 180.226602 134.075639 199.526535\nv 181.202736 134.868727 193.421208\nv 179.409049 135.475064 186.958365\nv 180.794332 135.842614 181.952705\nv 180.043977 136.074597 167.261218\nv 179.975981 135.914562 162.618332\nv 165.989764 135.049856 162.407952\nv 166.863536 135.059764 160.996245\nv 165.415527 134.887754 160.853092\nv 162.696194 134.579276 161.689588\nv 158.963306 133.958118 162.190672\nv 159.224548 133.883029 160.557078\nv 157.780931 133.612516 160.651509\nv 156.086105 133.260422 160.647174\nv 158.545349 133.647797 159.236450\nv 151.226147 131.992584 160.359841\nv 148.107735 131.020981 160.373498\nv 145.051224 129.941001 160.327639\nv 145.217834 130.301822 163.572899\nv 145.133877 130.135516 162.015651\nv 145.219066 130.735342 173.462567\nv 145.268526 130.735924 171.608348\nv 145.156557 130.703290 175.283989\nv 143.761597 130.114502 180.027199\nv 145.151631 130.481230 182.487249\nv 143.761597 129.941246 183.476455\nv 143.761597 129.648949 187.375549\nv 145.226592 129.873130 190.277541\nv 143.761597 129.272004 191.142044\nv 145.407144 128.769923 198.933624\nv 144.780282 127.332986 205.547489\nv 143.761597 127.066651 205.071404\nv 145.117180 126.535566 209.743814\nv 143.761597 125.657451 211.244949\nv 143.761597 124.835548 214.356804\nv 145.249655 123.284228 221.359484\nv 145.297520 125.120077 215.486109\nv 146.448986 125.255280 216.510659\nv 143.761597 123.044250 220.267799\nv 153.291180 122.533248 231.383477\nv 158.386101 123.600134 232.258400\nv 159.467141 124.311286 231.087651\nv 163.975723 124.827337 232.211598\nv 169.683076 125.627650 232.297703\nv 173.581491 125.917588 232.524092\nv 175.346481 126.035740 232.545847\nv 179.113633 126.235448 232.427232\nv 177.396911 126.160442 232.483412\nv 158.381980 125.924864 225.776930\nv 156.988039 124.357526 229.331488\nv 156.786995 125.363982 226.327717\nv 155.987850 123.584777 230.680379\nv 156.561086 123.188841 232.104039\nv 161.495379 124.454147 231.914810\nv 159.662760 125.379092 228.250154\nv 159.801969 125.892254 226.823910\nv 158.549472 126.611849 223.817224\nv 162.991674 125.232199 230.607754\nv 161.119229 125.779983 227.970994\nv 162.573278 125.683555 229.063168\nv 161.927122 126.910899 225.044690\nv 159.573735 127.244085 222.391581\nv 161.203331 127.666695 222.035470\nv 161.093005 129.221008 216.204028\nv 165.057695 125.504678 230.811188\nv 164.087124 125.741820 229.696484\nv 165.608324 126.101688 229.351778\nv 162.668261 127.502675 223.495836\nv 164.744659 127.852409 223.428870\nv 163.016727 129.199069 217.578365\nv 160.185000 130.368095 210.568367\nv 167.694628 125.406463 232.223044\nv 167.076560 125.935082 230.460818\nv 167.526466 127.715825 225.215709\nv 164.941431 129.201247 218.703128\nv 162.275492 130.510661 211.542199\nv 164.336897 130.655479 212.296986\nv 161.961460 131.729174 205.207965\nv 164.061032 131.909980 205.898826\nv 166.263130 130.767967 212.943489\nv 166.903273 129.249523 219.528893\nv 169.441984 127.802958 225.680906\nv 168.778632 126.004048 230.909570\nv 161.940830 134.209636 186.127876\nv 160.497531 134.068029 185.123889\nv 159.263497 133.243143 191.788386\nv 157.359126 133.046211 190.375135\nv 158.290069 132.454333 196.747076\nv 156.803122 132.306930 195.706168\nv 156.346017 131.265967 201.974934\nv 154.626016 131.085659 200.823398\nv 154.758618 129.924637 207.322572\nv 152.990502 129.693401 206.315371\nv 152.499758 128.096892 213.016847\nv 150.659064 128.289721 209.983354\nv 151.411029 126.692123 217.228454\nv 149.913001 126.541317 216.112917\nv 149.925216 126.095336 217.788351\nv 149.655527 126.862939 214.609816\nv 149.782457 124.991077 221.267743\nv 149.830860 125.556515 219.487256\nv 148.247592 124.214062 222.091169\nv 148.305681 125.409925 218.276344\nv 148.922313 122.998129 226.241398\nv 148.201797 123.408292 224.336522\nv 147.267944 122.373145 226.250736\nv 146.383559 122.584648 224.667540\nv 146.602310 121.475844 227.877595\nv 146.157281 120.658648 229.397864\nv 163.490988 134.338632 187.205413\nv 163.064709 133.654602 193.383382\nv 161.375494 133.505887 192.532030\nv 161.440923 132.732185 198.563752\nv 159.812835 132.595312 197.677096\nv 160.036728 131.566719 204.341338\nv 158.122212 131.419575 203.184601\nv 158.238731 130.222578 209.531987\nv 156.459669 130.083053 208.441520\nv 156.054023 128.545510 214.767439\nv 154.248228 128.324001 213.933142\nv 155.843183 127.187750 219.690855\nv 154.336570 126.895108 219.386930\nv 154.583197 126.556650 220.820058\nv 153.021589 126.834890 218.370486\nv 154.402209 125.075240 225.327347\nv 153.791510 125.402648 223.803666\nv 152.840461 124.678903 225.184882\nv 152.211006 124.988049 223.681241\nv 153.842688 123.551505 229.128126\nv 152.919206 123.695227 227.987750\nv 152.197193 122.821701 229.715354\nv 151.279894 123.195381 227.922990\nv 156.231975 126.812359 221.332281\nv 156.560945 126.384059 223.028307\nv 155.729874 125.392248 225.432372\nv 155.243332 124.874215 226.614238\nv 155.327330 123.923336 229.285612\nv 154.315436 123.203350 230.404908\nv 151.212359 125.092661 222.381121\nv 150.942287 124.550948 223.795432\nv 150.483944 123.483912 226.406764\nv 149.712611 122.717936 227.773146\nv 149.125587 121.987844 229.115622\nv 148.671573 121.240372 230.512820\nv 148.302653 120.530199 231.818657\nv 145.409019 125.630480 213.792122\nv 145.551885 126.183801 211.797743\nv 147.115187 126.392622 213.188236\nv 147.631334 127.885423 207.588219\nv 149.091793 128.089826 208.796304\nv 148.954913 129.263562 202.765223\nv 151.146256 129.391499 205.355178\nv 151.320357 130.606686 198.709473\nv 152.934735 130.864789 199.704876\nv 153.504017 131.911335 193.185837\nv 155.204516 132.127390 194.535229\nv 154.243391 132.658153 187.688203\nv 155.705255 132.842858 189.102270\nv 157.500181 133.670088 183.346680\nv 159.034127 133.888376 184.216652\nv 160.251405 134.410841 178.375351\nv 161.759843 134.610368 179.246783\nv 163.518697 135.010630 173.728060\nv 164.505022 135.120697 174.835222\nv 144.970646 121.926938 224.868689\nv 145.199964 122.624748 223.201648\nv 146.771161 124.064818 220.850974\nv 146.684699 124.925372 217.912576\nv 147.648493 125.647312 216.679802\nv 148.257436 126.506619 214.232310\nv 167.646604 135.250087 162.653746\nv 170.030195 135.579323 164.808868\nv 168.543361 135.591448 171.452377\nv 166.537066 134.621486 188.180853\nv 166.592656 135.056332 182.494762\nv 168.353214 135.173133 183.392027\nv 169.154063 135.565238 176.702206\nv 172.659158 135.610704 161.421854\nv 168.157841 135.541498 169.770919\nv 170.780334 135.703644 166.564116\nv 171.875516 135.719481 164.986181\nv 174.460913 135.752166 162.175250\nv 166.826132 133.232366 200.062362\nv 166.242792 133.870080 194.894126\nv 167.884029 133.947629 195.645357\nv 168.242868 134.680608 189.375665\nv 169.764032 134.744581 190.091335\nv 168.633799 135.059254 185.463311\nv 170.174760 135.280489 184.095086\nv 170.917255 135.671787 177.657798\nv 172.712863 135.758932 178.428115\nv 168.060854 130.827337 213.619883\nv 169.134221 132.167820 207.694718\nv 169.745730 133.273631 201.633945\nv 169.787360 134.016671 196.464480\nv 171.345870 133.959216 197.808564\nv 171.137980 134.836677 190.249289\nv 172.315099 134.822588 191.162257\nv 172.003291 135.359195 184.814042\nv 173.529313 135.502283 184.094439\nv 173.732540 135.937852 173.695263\nv 172.547217 135.824219 166.689757\nv 176.212606 135.835664 162.458568\nv 171.977832 135.846874 172.979862\nv 178.082603 135.889218 162.562506\nv 172.656656 126.366471 231.017256\nv 173.038567 127.809544 226.740862\nv 173.026234 129.388467 221.283234\nv 173.811336 130.841853 215.722481\nv 174.467973 132.149611 209.834711\nv 174.952887 133.238119 204.001340\nv 175.635871 134.142075 198.241697\nv 177.288938 134.896282 192.573785\nv 178.336839 135.890980 180.269538\nv 174.492327 127.786223 227.154157\nv 174.760488 129.335848 221.912457\nv 175.846685 130.823378 216.275943\nv 176.423250 132.117641 210.448003\nv 176.714765 133.196746 204.679125\nv 177.245172 134.125392 198.770878\nv 177.538021 135.463597 186.671711\nv 175.989691 128.013496 226.688551\nv 178.307450 129.345951 222.421984\nv 177.836580 130.788049 216.745737\nv 178.368040 132.077714 210.945636\nv 178.435093 133.141976 205.288336\nv 178.846475 134.109231 199.158930\nv 179.109852 134.872882 193.141407\nv 180.054779 135.908841 180.373319\nv 171.306889 127.815513 226.247571\nv 171.229321 129.352312 220.866818\nv 171.754729 130.836147 215.108236\nv 172.596409 132.166046 209.170399\nv 173.184096 133.252729 203.331472\nv 174.058367 134.143857 197.686157\nv 175.590281 134.936893 191.685417\nv 175.657823 135.434355 186.279394\nv 176.477064 135.860073 179.906918\nv 180.274856 136.103698 174.307948\nv 176.313575 136.010781 167.438235\nv 167.991768 133.074567 201.825009\nv 165.905420 131.916375 207.159524\nv 169.099085 129.231003 220.557449\nv 169.785486 130.824661 214.385535\nv 170.817693 132.171398 208.453764\nv 171.413511 133.244576 202.647540\nv 172.679130 134.117547 197.298010\nv 173.816059 135.403340 185.626000\nv 174.577879 135.819363 179.254357\nv 180.851412 135.823754 161.105528\nv 147.480906 131.396279 179.061336\nv 146.788311 131.217928 177.602850\nv 146.331614 131.099942 176.080436\nv 151.745104 132.716159 174.825728\nv 150.171237 132.291982 173.598472\nv 148.583693 131.823102 172.061385\nv 148.899079 131.872355 169.815257\nv 146.763812 131.155690 168.807941\nv 146.375388 130.938498 166.888009\nv 145.731293 130.605623 165.159380\nv 154.052127 133.279525 170.915139\nv 152.872985 132.964911 169.574825\nv 152.113921 132.727888 168.078561\nv 151.534242 132.497562 166.403997\nv 151.027810 132.263076 164.724503\nv 150.684448 132.051199 163.026666\nv 149.131905 131.503592 162.108502\nv 149.611807 131.494596 160.350611\nv 156.725115 133.778946 167.123645\nv 155.455392 133.443653 165.803391\nv 154.289176 133.130153 164.906310\nv 153.948478 132.959280 163.517617\nv 153.448947 132.716466 161.995981\nv 152.984462 132.467420 160.497036\nv 162.142525 134.823902 172.582927\nv 161.423328 134.542712 164.853466\nv 159.386196 134.348409 169.124584\nv 158.060644 134.083781 168.364300\nv 156.152922 133.754038 173.747476\nv 155.272066 133.568677 172.256439\nv 153.161539 133.003972 177.921686\nv 151.670024 132.658426 176.687728\nv 150.066809 131.970604 182.979647\nv 149.315505 131.866707 181.044247\nv 147.738960 131.043565 186.313830\nv 146.997233 130.947320 184.685700\nv 144.960535 129.934140 188.821073\nv 161.040657 134.380839 162.972275\nv 163.330265 134.866173 165.431284\nv 160.072375 134.488950 170.493707\nv 156.888003 133.882665 175.369028\nv 154.485558 133.257676 179.367771\nv 151.992202 132.491245 182.888666\nv 149.009287 131.268959 188.115497\nv 146.917374 130.005392 193.888337\nv 145.520051 129.742796 192.245249\nv 145.345523 129.076905 196.825737\nv 143.761597 128.771050 195.132752\nv 160.797380 134.617980 171.835674\nv 158.765378 134.187830 177.502914\nv 157.525264 133.978346 176.752238\nv 154.178834 133.110255 181.126778\nv 152.916252 132.477612 186.187344\nv 151.281976 132.064397 186.369105\nv 151.809058 131.667889 191.723774\nv 150.067575 131.377509 190.175524\nv 149.579118 130.473933 196.377314\nv 148.396293 130.290717 195.207396\nv 147.360588 128.914188 201.936121\nv 147.095772 129.159237 200.001289\nv 144.837938 127.937991 202.633301\nv 146.225695 127.660636 206.421452\nv 163.686105 134.971717 167.272724\nv 165.527240 135.226078 167.669224\nv 166.023359 135.319616 169.556806\nv 165.871127 135.279814 175.149524\nv 164.923919 134.918710 181.593831\nv 164.864419 134.432454 188.138801\nv 164.659392 133.771360 194.171363\nv 164.901304 133.011051 199.995737\nv 143.761597 139.531555 160.273849\nv 218.761597 139.531555 160.273849\nv 215.488439 138.565739 160.103571\nv 147.127934 139.810412 160.323047\nv 145.811184 139.165114 160.209258\nv 215.612724 141.153228 160.559797\nv 213.915827 143.485066 160.970986\nv 212.643889 140.055256 160.366237\nv 209.632358 142.843026 160.857765\nv 212.268845 151.594353 162.400848\nv 205.123524 145.251821 161.282494\nv 209.052300 152.317902 162.528450\nv 206.297664 143.419586 160.959453\nv 202.672795 140.060250 160.367053\nv 206.008797 152.911552 162.633102\nv 162.751863 141.478838 160.617242\nv 195.207040 145.072424 161.250853\nv 193.831885 148.267797 161.814286\nv 196.556595 143.924627 161.048495\nv 199.311921 147.412483 161.663489\nv 199.806676 144.168044 161.091408\nv 199.481079 140.967369 160.527040\nv 201.432221 144.103423 161.080002\nv 162.441510 145.664093 161.355210\nv 164.218125 144.676320 161.181065\nv 167.594815 148.089592 161.782894\nv 203.117675 144.399930 161.132253\nv 191.916609 148.346908 161.828257\nv 170.794165 147.730718 161.719630\nv 169.141667 145.306639 161.292162\nv 147.003305 141.645023 160.646541\nv 148.553404 138.483755 160.089130\nv 148.873662 140.512036 160.446739\nv 148.202914 144.506200 161.151029\nv 150.405284 141.995087 160.708264\nv 152.021133 143.122707 160.907094\nv 152.254986 141.380517 160.599903\nv 150.261704 151.596146 162.401153\nv 153.838414 142.266682 160.756175\nv 153.478050 152.319397 162.528701\nv 155.659799 141.392112 160.601964\nv 156.379334 145.828664 161.384206\nv 157.171692 142.816531 160.853099\nv 157.502310 140.820568 160.501166\nv 156.522804 152.913048 162.633400\nv 159.072983 142.090922 160.725162\nv 160.457214 143.140833 160.910293\nv 191.211923 146.838009 161.562202\nv 188.863957 145.358802 161.301357\nv 187.197096 144.367357 161.126548\nv 185.643872 145.448647 161.317200\nv 184.275387 145.009693 161.239813\nv 182.839636 145.440548 161.315774\nv 181.354322 145.801835 161.379487\nv 178.829706 146.616750 161.523161\nv 177.445185 147.146808 161.616632\nv 178.395978 143.525857 160.978160\nv 176.173600 143.967665 161.056073\nv 174.095104 143.657846 161.001447\nv 172.453854 148.572457 161.868007\nv 218.761597 128.439949 234.475151\nv 218.761500 126.623259 230.323904\nv 218.761597 131.309535 231.155265\nv 218.761597 139.321404 234.923401\nv 218.761597 130.464947 229.634349\nv 218.761597 137.891406 162.930673\nv 218.761597 134.383243 162.730688\nv 218.761597 141.149034 163.496493\nv 218.761597 136.603605 166.008251\nv 218.761597 142.384570 166.182964\nv 218.761597 138.186086 168.903351\nv 218.761597 142.646221 169.229921\nv 218.761597 139.492612 170.112395\nv 218.761597 140.964810 171.580003\nv 218.761597 139.749944 173.348375\nv 218.761597 140.514367 175.067010\nv 218.761597 129.458045 222.910803\nv 218.761597 137.016871 225.480268\nv 218.761597 131.404038 227.576751\nv 218.761597 129.339859 224.369838\nv 218.761597 132.258434 225.800377\nv 218.761597 135.141925 226.203837\nv 218.761597 141.291514 176.657850\nv 218.761597 150.181297 177.989899\nv 218.761597 141.047545 179.890556\nv 218.761597 150.063103 181.361954\nv 218.761597 140.076362 181.561926\nv 218.761597 140.831907 183.116347\nv 218.761597 143.086263 184.739798\nv 218.761597 139.825431 184.522743\nv 218.761597 137.021139 185.693073\nv 218.761597 140.489101 186.033567\nv 218.761597 137.852477 187.270478\nv 218.761597 142.469429 188.187843\nv 218.761597 140.593670 189.002795\nv 218.761597 138.991889 190.641167\nv 218.761597 142.444940 191.891143\nv 218.761597 138.946439 193.700567\nv 218.761597 138.897162 195.374755\nv 218.761597 140.751730 197.934635\nv 218.761597 142.983948 224.123802\nv 218.761597 133.497797 219.592237\nv 218.761597 133.629054 217.591569\nv 218.761597 131.881116 216.480642\nv 218.761597 144.158195 219.955551\nv 218.761597 135.617103 214.296287\nv 218.761597 144.882401 217.141503\nv 218.761597 133.797679 215.557834\nv 218.761597 135.606594 216.417670\nv 218.761597 137.657836 198.330696\nv 218.761597 136.261216 199.342055\nv 218.761597 148.027153 201.510354\nv 218.761597 137.740457 200.030830\nv 218.761597 138.172020 201.768066\nv 218.761597 138.367342 203.803389\nv 218.761597 147.350197 205.549354\nv 218.761597 136.778334 205.191725\nv 218.761597 137.083497 207.100968\nv 218.761597 135.633518 208.547429\nv 218.761597 138.732514 209.744928\nv 218.761597 145.878296 212.903199\nv 218.761597 135.357362 212.281576\nv 143.761597 128.439949 234.475151\nv 146.098319 126.029625 234.050129\nv 146.770012 129.542901 234.669627\nv 149.857669 130.754079 234.883177\nv 145.477195 139.343605 236.397751\nv 214.914711 126.996601 234.220636\nv 215.569203 130.854301 234.900864\nv 149.809985 133.857046 235.430294\nv 148.468597 140.251351 236.557800\nv 151.346256 134.121176 235.476862\nv 153.532323 130.785351 234.888687\nv 210.266619 128.051609 234.406635\nv 217.052147 139.341599 236.397400\nv 214.067398 140.247650 236.557098\nv 210.347694 129.777110 234.710901\nv 209.663282 133.398424 235.349414\nv 154.263179 132.593964 235.207580\nv 208.019374 133.919864 235.441353\nv 205.536994 131.465734 235.008636\nv 205.417500 132.980136 235.275648\nv 202.119536 133.592533 235.383635\nv 157.865848 133.464411 235.361068\nv 159.312227 132.837394 235.250476\nv 161.125748 133.717454 235.405682\nv 164.414701 137.045502 235.992494\nv 163.928494 134.246657 235.498980\nv 165.612898 133.440966 235.356927\nv 166.798052 134.992637 235.630517\nv 167.658951 143.946800 237.209404\nv 168.411151 138.668750 236.278741\nv 170.135054 133.696617 235.401978\nv 171.501358 132.985361 235.276597\nv 173.499533 134.992594 235.630537\nv 175.199205 133.811613 235.422286\nv 176.012333 136.842094 235.956622\nv 176.872720 132.898156 235.261173\nv 178.962109 135.317263 235.687763\nv 178.297735 138.679060 236.280530\nv 189.604588 136.146714 235.834006\nv 186.765974 132.157275 235.130537\nv 185.111606 138.110671 236.180353\nv 184.757480 134.641146 235.568584\nv 200.419474 132.199511 235.138011\nv 197.606185 132.149635 235.129248\nv 196.181804 133.201226 235.314652\nv 194.783959 132.488230 235.188917\nv 194.236305 137.284576 236.034653\nv 194.880302 143.945099 237.209099\nv 192.882906 134.177169 235.486728\nv 191.225738 135.193112 235.665866\nv 189.701311 132.548869 235.199617\nv 143.761597 130.937274 232.317999\nv 143.761597 136.814362 163.039677\nv 143.761597 141.170631 164.163976\nv 143.761597 137.541125 164.617934\nv 143.761597 141.039202 165.688316\nv 143.761597 142.540152 165.694323\nv 143.761597 143.236343 169.306597\nv 143.761597 140.029566 166.605802\nv 143.761597 139.321404 234.923401\nv 143.761597 129.852280 231.028030\nv 143.761597 130.784920 229.643034\nv 143.761597 127.794205 225.411208\nv 143.761597 132.986875 225.587331\nv 143.761597 150.181198 177.994354\nv 143.761597 138.941327 177.379300\nv 143.761597 139.197705 175.729742\nv 143.761597 144.174287 175.981986\nv 143.761597 138.912052 174.049777\nv 143.761597 139.983310 172.609484\nv 143.761597 140.734808 171.051093\nv 143.761597 139.405352 169.630152\nv 143.761597 141.031755 179.600838\nv 143.761597 138.177446 181.545264\nv 143.761597 150.062950 181.364952\nv 143.761597 138.009052 186.370825\nv 143.761597 139.150879 187.760345\nv 143.761597 140.443993 188.946504\nv 143.761597 139.794012 190.857991\nv 143.761597 142.851692 191.511476\nv 143.761597 139.703296 192.706482\nv 143.761597 136.200129 193.131639\nv 143.761597 138.254677 195.714407\nv 143.761597 140.016687 196.485924\nv 143.761597 132.864665 223.708936\nv 143.761597 134.810555 222.597281\nv 143.761597 142.983948 224.123802\nv 143.761597 132.415409 219.785931\nv 143.761597 135.671353 219.269302\nv 143.761597 137.190731 218.239106\nv 143.761597 144.158196 219.955497\nv 143.761597 137.072820 216.327692\nv 143.761597 133.509353 214.293894\nv 143.761597 144.882447 217.141395\nv 143.761597 135.404519 213.451090\nv 143.761597 137.019500 201.995216\nv 143.761597 148.026001 201.517799\nv 143.761597 137.256609 199.232928\nv 143.761597 138.500488 197.868830\nv 143.761597 135.606492 211.535535\nv 143.761597 139.098090 213.317182\nv 143.761597 145.875893 212.913804\nv 143.761597 137.390792 210.289733\nv 143.761597 134.818601 207.850467\nv 143.761597 140.405379 203.139872\nv 143.761597 136.352549 203.423323\nv 143.761597 137.426627 205.005234\nv 143.761597 147.350197 205.549354\nv 143.761597 134.070440 204.609947\nv 143.761597 140.032923 208.176676\nv 143.761597 138.409936 206.856434\nv 145.320901 150.619141 168.925230\nv 145.376099 146.306579 213.080090\nv 150.405748 151.825235 166.277103\nv 145.604667 150.466056 163.919616\nv 156.586155 153.002625 164.434075\nv 153.453527 152.472700 165.751991\nv 163.426779 154.018633 164.439741\nv 161.383151 153.764147 164.376800\nv 163.369851 154.074521 166.083717\nv 165.614385 154.263229 164.461159\nv 171.563107 154.755098 164.565872\nv 173.228567 154.841883 164.588562\nv 174.993559 154.912497 164.617514\nv 176.831575 154.970094 164.637805\nv 179.268869 155.051634 166.037095\nv 180.491818 155.017274 164.622224\nv 180.601997 155.134991 169.384405\nv 181.914254 154.552658 186.916101\nv 181.419435 154.033034 192.930007\nv 181.337085 153.256548 199.644120\nv 180.959416 150.754116 214.682093\nv 180.798820 149.636079 219.876684\nv 180.832512 149.226256 221.559498\nv 180.060405 147.616675 227.802225\nv 181.095025 146.632669 231.261209\nv 180.023988 145.192720 235.815696\nv 176.864957 145.140180 235.747827\nv 178.449937 145.167269 235.794988\nv 175.087221 145.060770 235.719610\nv 173.307799 144.983069 235.659313\nv 170.917817 145.226328 234.356431\nv 169.034106 144.638898 235.595883\nv 167.542545 144.443797 235.685359\nv 165.813941 144.669152 234.383609\nv 166.065708 144.243584 235.763910\nv 159.904477 143.330880 235.684862\nv 155.435207 142.492365 235.456996\nv 156.682223 142.770423 235.455673\nv 154.128121 142.194065 235.431186\nv 154.916585 142.934920 233.873277\nv 151.672097 142.136614 233.853254\nv 152.791760 141.881365 235.374469\nv 149.709672 141.148977 235.143451\nv 145.142422 140.991655 231.662906\nv 148.090469 141.359515 233.249772\nv 146.713143 140.450456 234.575750\nv 145.264291 139.885944 234.781760\nv 145.135294 142.344027 227.662094\nv 145.596069 147.104634 209.581638\nv 145.686115 147.448384 207.937995\nv 145.697755 148.452499 202.191650\nv 145.306806 149.548438 193.364699\nv 145.301792 150.658409 171.237241\nv 150.280614 151.704959 164.305453\nv 148.564937 151.288901 164.185800\nv 151.084366 142.530026 232.305986\nv 149.539115 142.176291 232.084997\nv 151.114443 142.860170 231.374731\nv 148.034805 141.734845 232.108630\nv 148.032544 142.426052 230.101685\nv 146.559929 142.009661 230.003713\nv 145.134055 141.720205 229.532773\nv 145.175654 142.906327 225.848791\nv 146.815456 143.756227 224.670966\nv 148.148827 144.066921 224.942951\nv 149.494128 143.851816 226.864465\nv 149.563698 144.369403 225.243183\nv 149.491730 143.346874 228.517999\nv 152.729046 144.879152 226.172570\nv 151.171444 143.317608 229.989999\nv 152.810521 143.780213 229.796502\nv 154.611281 144.115873 230.077484\nv 156.410298 144.418722 230.329855\nv 157.889337 144.167439 232.023011\nv 158.961951 143.890408 233.521141\nv 160.223399 143.729467 234.681520\nv 161.366187 144.006954 234.416961\nv 163.305619 144.335198 234.345088\nv 179.514423 146.210661 232.591003\nv 177.582366 146.205910 232.453946\nv 174.328028 146.176191 232.096148\nv 171.064929 146.128006 231.513728\nv 167.840616 146.254994 230.083537\nv 166.494790 146.117034 230.045949\nv 163.403724 145.802621 229.764064\nv 161.589520 146.193193 227.517276\nv 159.928809 145.955650 227.414010\nv 158.078185 145.676076 227.247807\nv 156.235413 145.821289 225.498910\nv 152.803745 145.372748 224.459320\nv 149.685168 144.873783 223.534504\nv 147.805577 144.871276 221.705212\nv 148.237133 145.394788 220.196365\nv 146.797292 145.013316 220.106806\nv 145.284420 144.583490 220.042814\nv 145.266850 145.055148 218.238957\nv 178.270649 147.957741 226.420130\nv 158.342452 147.223970 221.728405\nv 156.558286 147.052602 221.142015\nv 153.189351 146.834576 219.237907\nv 151.553594 146.561498 218.863237\nv 149.843787 146.646592 216.806145\nv 148.106346 146.557072 215.298331\nv 164.152513 154.116549 178.731208\nv 168.022786 154.383319 181.120719\nv 171.958935 154.628204 181.609940\nv 173.422228 154.636564 182.903884\nv 175.213142 154.756630 181.963511\nv 175.223015 154.665760 183.717150\nv 181.683996 154.790035 183.424762\nv 180.604634 154.822194 182.724388\nv 176.778296 154.763728 182.766854\nv 165.559590 154.390611 172.268294\nv 167.918158 154.598480 173.322679\nv 169.730490 154.736497 173.571405\nv 171.683934 154.834678 175.174700\nv 173.593809 154.932972 175.223404\nv 175.699959 154.977349 176.773050\nv 177.928778 155.030159 176.886399\nv 179.653010 155.049385 177.123790\nv 181.123736 155.020535 178.318290\nv 180.797956 155.147916 171.252111\nv 178.835834 155.118422 170.638182\nv 176.895815 155.079295 170.057148\nv 174.947366 155.014118 169.026853\nv 173.140072 154.936839 169.195698\nv 167.572214 154.505913 166.254591\nv 165.540326 154.302803 166.001124\nv 178.482325 152.433405 205.109175\nv 176.655450 152.388122 205.121708\nv 174.931289 152.324109 205.141012\nv 173.318138 152.236605 205.215235\nv 171.527326 152.342609 203.860910\nv 169.908997 152.292009 203.453870\nv 168.289731 152.252090 202.856695\nv 166.700621 152.190550 202.297021\nv 165.096097 152.041433 202.201956\nv 163.315895 151.998334 201.104278\nv 161.565021 151.806986 200.897769\nv 159.601480 151.706791 199.651568\nv 161.422847 152.022962 199.236502\nv 157.739256 151.423688 199.637252\nv 157.746426 151.635886 198.061762\nv 155.696511 151.274831 198.175387\nv 155.978083 151.524880 196.625168\nv 154.334877 151.452901 194.768027\nv 152.611083 151.118578 194.713962\nv 150.863709 150.893190 193.460527\nv 149.107960 150.573365 192.705197\nv 146.929719 150.204258 191.126502\nv 145.407918 149.929195 189.796301\nv 145.439169 150.097087 187.978389\nv 145.449090 150.255696 186.087687\nv 179.926526 153.865469 194.410310\nv 176.467354 153.804153 194.352138\nv 174.857263 153.743674 194.412873\nv 173.149806 153.805369 193.093748\nv 171.631341 153.777166 192.552968\nv 170.094605 153.732678 192.004019\nv 168.316347 153.729395 190.666722\nv 166.520962 153.382480 192.621358\nv 164.940577 153.367844 191.172737\nv 163.665837 153.525941 187.854020\nv 163.333397 153.315879 189.804731\nv 162.126131 153.265898 188.718145\nv 160.758617 153.170412 187.732365\nv 159.368611 153.051880 186.766490\nv 157.837242 152.906330 185.585779\nv 156.254681 152.678019 185.114344\nv 154.617229 152.401533 184.934182\nv 145.346273 150.668087 175.575281\nv 145.318112 150.670357 173.448351\nv 179.806169 153.257631 199.503506\nv 176.742590 153.134968 199.998178\nv 175.332895 153.194644 199.175913\nv 173.877202 153.138461 199.129461\nv 172.390332 153.048702 199.228161\nv 170.760760 153.123467 197.858232\nv 169.248017 153.075683 197.366550\nv 167.763587 153.047351 196.608657\nv 166.320513 152.983658 196.032990\nv 164.744545 152.730096 196.801439\nv 163.021202 152.630015 196.005915\nv 161.177089 152.535639 194.812101\nv 161.029909 152.704808 193.134981\nv 159.399017 152.297622 194.741635\nv 159.173446 152.453768 193.015371\nv 157.261027 152.322723 191.396328\nv 155.639537 152.071775 191.147348\nv 154.182720 151.938260 189.754194\nv 152.627982 151.739618 188.567703\nv 151.464996 151.600026 187.355778\nv 150.166929 151.394201 186.345896\nv 148.814609 151.137817 185.557625\nv 147.256341 150.853970 184.078115\nv 146.554102 150.840115 180.984733\nv 145.233978 150.481022 181.003810\nv 145.278065 150.574833 179.156073\nv 154.659115 152.814515 169.708167\nv 153.507794 152.559035 168.168447\nv 151.967509 152.194440 166.845784\nv 151.855551 152.062823 164.360224\nv 156.488284 153.154203 170.011008\nv 156.404229 153.150740 171.888733\nv 158.247340 153.453715 170.162976\nv 158.024811 153.413457 173.687931\nv 159.750531 153.694704 171.478332\nv 160.822289 153.786109 176.061087\nv 160.945800 153.831290 174.620897\nv 164.045083 154.163842 176.791291\nv 159.908574 153.638826 167.044640\nv 159.992602 153.689161 168.714601\nv 161.413354 153.916375 170.921215\nv 163.663042 154.186233 171.104129\nv 163.795000 154.205283 172.982618\nv 181.849928 154.435510 188.406985\nv 180.543232 154.491631 187.698729\nv 178.917265 154.385165 188.847951\nv 177.143775 154.369729 188.608350\nv 175.552072 154.352578 188.241319\nv 174.038429 154.344743 187.597469\nv 172.530874 154.304802 187.175538\nv 171.009390 154.267624 186.505355\nv 167.376512 153.963677 186.997496\nv 167.651139 154.110689 185.231299\nv 165.806489 153.929561 185.416981\nv 164.111093 153.836702 184.159097\nv 162.462981 153.699730 183.310509\nv 160.778785 153.531877 182.465002\nv 159.218675 153.444718 179.783814\nv 157.714673 153.242703 179.004541\nv 156.186348 153.038546 177.542778\nv 154.590570 152.793216 175.838201\nv 149.851984 151.830744 173.814593\nv 149.652142 151.779808 171.875572\nv 149.427669 151.704258 169.992058\nv 148.545115 151.484044 169.875238\nv 147.236872 151.060890 166.823082\nv 146.362116 150.763215 165.483322\nv 180.804219 150.020212 218.163116\nv 180.863261 150.388924 216.421952\nv 178.114992 150.440035 216.002414\nv 175.950620 150.556201 215.140708\nv 173.942287 150.489532 215.028370\nv 171.951074 150.405161 214.871933\nv 170.048579 150.293344 214.744424\nv 168.169737 150.154175 214.639226\nv 166.070844 150.220260 213.298931\nv 164.230941 150.027099 213.215483\nv 162.359938 150.077703 211.775418\nv 160.581629 149.886824 211.471949\nv 154.862716 149.396598 208.978568\nv 153.023791 149.467917 206.593552\nv 151.507482 148.791667 208.577141\nv 151.321723 149.095876 206.633887\nv 149.419385 148.949297 204.958302\nv 147.516823 148.497462 204.869958\nv 179.121793 149.186510 221.662924\nv 177.394868 149.132093 221.732688\nv 175.530865 149.110951 221.539096\nv 173.650989 149.064078 221.346800\nv 171.779265 148.979301 221.210222\nv 169.595056 149.075828 220.087661\nv 167.974212 148.987116 219.841675\nv 158.672927 148.471568 216.779562\nv 156.915507 148.444307 215.529942\nv 155.030951 148.088106 215.546219\nv 152.906923 148.020021 213.854852\nv 150.166097 147.804411 211.965746\nv 148.882600 147.751061 210.677454\nv 147.363928 147.601492 209.485753\nv 146.477794 147.356742 209.534378\nv 147.404889 148.724349 203.318613\nv 180.920693 151.458355 211.044844\nv 177.456847 151.503858 210.487171\nv 174.043332 151.316094 210.818393\nv 172.298896 151.346034 210.123252\nv 170.628073 151.323422 209.631899\nv 168.867115 151.387348 208.507382\nv 167.211867 151.220349 208.602667\nv 165.410611 151.269088 207.280142\nv 163.568328 151.290104 205.927431\nv 161.807693 151.083781 205.803677\nv 160.023495 150.884055 205.495861\nv 158.226486 150.737729 204.704557\nv 157.049732 150.581966 204.474433\nv 155.313408 150.267162 204.539867\nv 156.082300 150.672953 202.850144\nv 154.158667 150.320823 202.810398\nv 152.724218 150.324344 200.905621\nv 150.852201 149.877876 201.230372\nv 149.128990 149.696942 199.767715\nv 147.914180 149.575826 198.535527\nv 146.881699 149.460547 197.449669\nv 145.337199 149.128460 196.858297\nv 145.267621 149.322154 195.175456\nv 213.124952 141.546469 233.775957\nv 214.088505 140.789363 235.114738\nv 211.151384 151.939510 163.988938\nv 182.484072 155.045994 165.658679\nv 182.865427 146.177098 232.698217\nv 180.739068 148.868846 223.050855\nv 182.650036 151.398108 211.301558\nv 180.981561 152.995689 201.510919\nv 181.622801 153.674321 196.237995\nv 181.687906 153.860194 194.474921\nv 180.997604 155.141721 173.154583\nv 184.488390 154.991968 164.593765\nv 186.372686 154.947983 164.591433\nv 188.228157 154.889816 164.609499\nv 189.876822 154.815658 164.555458\nv 191.524057 154.722928 164.554088\nv 199.174921 154.008770 164.440432\nv 197.211712 154.232775 164.499540\nv 201.354494 153.734603 164.445493\nv 203.677885 153.454384 166.421364\nv 207.834695 152.760828 167.043933\nv 207.617439 152.687763 164.101375\nv 216.900900 150.559970 165.545092\nv 216.724436 150.522537 163.879716\nv 217.317960 150.638682 173.144931\nv 217.208062 150.663617 171.028152\nv 217.295349 150.643739 174.654505\nv 217.119156 150.511989 181.326716\nv 217.167298 150.575716 179.662992\nv 217.158018 150.017191 188.646570\nv 217.076957 150.203501 186.704462\nv 217.070720 150.344359 184.896879\nv 217.092852 149.685892 192.439358\nv 216.979302 149.274456 196.140878\nv 217.104162 148.507130 201.365274\nv 216.987114 146.599911 211.969444\nv 215.774401 145.945736 216.356209\nv 217.070575 143.602893 223.818726\nv 217.119221 144.436457 220.750871\nv 217.146554 141.962459 229.035326\nv 217.178432 141.273281 231.017516\nv 215.666994 140.357203 234.954044\nv 215.512587 141.208252 232.730591\nv 217.178369 139.900829 234.816409\nv 205.732787 142.750795 235.582296\nv 208.392632 142.977448 233.244516\nv 202.517808 143.816799 234.303058\nv 202.679074 143.357938 235.561265\nv 205.594152 143.338644 234.004759\nv 197.837917 144.071363 235.735714\nv 199.461915 143.833641 235.747188\nv 191.645649 144.720802 235.862962\nv 182.652656 145.184204 235.840473\nv 184.524488 145.132391 235.863918\nv 186.377443 145.073361 235.856372\nv 209.050057 142.028892 235.469913\nv 210.805896 141.618377 235.341985\nv 211.742198 141.935063 233.773657\nv 209.820837 143.015616 232.120859\nv 213.794219 141.821624 232.448824\nv 214.846912 142.029614 230.941640\nv 213.930409 142.848126 229.323462\nv 216.063081 143.402919 225.499101\nv 215.580651 144.065940 223.780432\nv 212.954672 144.396814 225.160598\nv 213.512206 143.495299 227.600866\nv 209.934028 144.662970 226.843758\nv 208.758763 143.924606 230.064274\nv 208.414138 143.386036 231.993386\nv 206.983649 143.743202 231.863063\nv 205.405121 144.040567 231.960428\nv 203.814424 144.330037 232.011756\nv 203.962079 143.878288 233.323965\nv 202.225842 144.621133 232.002542\nv 200.888505 144.275103 233.752354\nv 199.256286 144.276353 234.509326\nv 197.560455 144.575407 234.331088\nv 196.160076 144.312650 235.661752\nv 194.748234 144.438589 235.773912\nv 193.247223 144.580784 235.840637\nv 184.961465 146.449100 231.642952\nv 191.533297 145.909341 232.223010\nv 195.176818 146.150995 230.256700\nv 196.999550 145.941746 230.247609\nv 198.992033 146.118241 228.760719\nv 200.914046 146.102861 227.841103\nv 202.807651 145.776611 227.900676\nv 206.351226 145.602983 226.212966\nv 207.870435 145.322745 226.108621\nv 211.804960 144.945515 224.233247\nv 211.868826 145.417204 222.459919\nv 213.570636 145.015569 222.328459\nv 214.359081 145.232651 220.732927\nv 216.086923 144.756958 220.707033\nv 217.166893 144.794531 219.337469\nv 217.198300 145.163251 217.895973\nv 182.864261 147.965231 226.491431\nv 183.919207 147.952528 226.469150\nv 187.980291 147.730848 226.748638\nv 189.052446 147.712669 226.595349\nv 190.806074 147.667240 226.335196\nv 192.851339 147.592420 226.006753\nv 195.572936 147.435001 225.591700\nv 197.342342 147.534631 224.454019\nv 199.085630 147.679372 223.049310\nv 206.159908 147.050101 221.001078\nv 207.570854 147.030520 219.967077\nv 209.208641 146.937488 218.949841\nv 210.936024 146.747029 218.139254\nv 212.612924 146.442006 217.738234\nv 214.311631 146.357540 216.279865\nv 197.417314 154.215258 178.691792\nv 195.711043 154.317736 180.316285\nv 196.696690 154.338565 166.217833\nv 194.889364 154.525207 166.721815\nv 194.219242 154.442309 180.299532\nv 192.740651 154.552765 180.274584\nv 191.427167 154.575773 181.655515\nv 189.750771 154.677146 181.452788\nv 184.845956 154.781037 182.807675\nv 183.399466 154.677838 185.018575\nv 183.052624 154.848118 182.099867\nv 196.535969 154.434160 172.454203\nv 194.739757 154.581252 173.970723\nv 193.091182 154.708212 174.113172\nv 191.221565 154.828520 174.436429\nv 189.285034 154.892592 176.359356\nv 187.007447 154.973364 176.726653\nv 184.974028 155.018572 177.076508\nv 182.753063 155.029291 178.032151\nv 193.274648 154.689031 168.425134\nv 191.947986 154.792231 169.014060\nv 187.513403 155.021925 169.912465\nv 185.517550 155.085903 170.850242\nv 182.072014 152.494286 204.918816\nv 183.762701 152.492586 204.775256\nv 187.184565 152.353923 205.048221\nv 189.026457 152.373487 204.394115\nv 190.688174 152.328804 204.075677\nv 192.289649 152.268998 203.762538\nv 193.994687 152.235630 203.103698\nv 195.681137 152.187699 202.413610\nv 197.400465 152.112020 201.745045\nv 199.135504 152.036248 200.906256\nv 202.585778 151.618572 200.656061\nv 202.737855 151.896306 198.474627\nv 204.292556 151.562555 199.193686\nv 205.964806 151.413711 198.255414\nv 207.670341 151.223232 197.401032\nv 209.368286 151.131034 195.510594\nv 211.377969 150.948675 193.489460\nv 213.141498 150.626623 192.813641\nv 214.613064 150.489097 190.723208\nv 215.946515 150.161181 190.634439\nv 183.676614 153.862814 194.294567\nv 185.584894 153.839880 194.149788\nv 187.206338 153.785988 194.181942\nv 189.002450 153.820899 193.121182\nv 190.781411 153.793740 192.448930\nv 192.944215 153.742086 191.520971\nv 194.658250 153.593876 191.669401\nv 196.937306 153.382063 191.693089\nv 199.773601 153.369983 188.405279\nv 201.421308 153.185444 188.106901\nv 203.239037 152.997522 187.310080\nv 205.159034 152.801215 185.975192\nv 206.916900 152.498058 186.128626\nv 208.321148 152.448780 182.925145\nv 209.765624 152.133220 183.530877\nv 209.719687 152.236645 181.819298\nv 211.118674 151.990438 180.907016\nv 212.529238 151.720536 179.952609\nv 213.772460 151.483371 178.456576\nv 215.174988 151.164697 177.538100\nv 216.091439 150.948111 176.465246\nv 216.007891 150.989303 174.966394\nv 183.066951 153.246891 199.551006\nv 184.780791 153.225482 199.488850\nv 186.403017 153.137556 199.817698\nv 188.115070 153.150740 199.218756\nv 189.769888 153.133268 198.729329\nv 191.395777 153.109323 198.160181\nv 192.976800 153.058963 197.680987\nv 194.621063 153.020712 196.923689\nv 196.259637 152.935057 196.393392\nv 198.006085 152.889784 195.258672\nv 199.608091 152.671553 195.546887\nv 198.032904 153.065042 193.762667\nv 201.251536 152.655533 193.852043\nv 202.976804 152.475776 193.294333\nv 205.302146 152.239451 192.151550\nv 207.433009 151.945897 191.427856\nv 208.786553 151.815240 190.164155\nv 210.282392 151.819334 186.669371\nv 211.961750 151.437136 186.915128\nv 215.439150 150.798599 184.301737\nv 217.083349 150.436782 183.082117\nv 212.835033 151.546426 163.982289\nv 213.035664 151.586092 165.660147\nv 210.182861 152.241345 165.880003\nv 210.256039 152.295550 167.939732\nv 206.386664 153.096018 170.132792\nv 207.782288 152.837514 170.144418\nv 209.216445 152.557023 169.833356\nv 203.886507 153.521611 172.040468\nv 206.091102 153.154150 171.422848\nv 204.994710 153.338274 170.165332\nv 202.631814 153.695863 173.747099\nv 204.135310 153.469102 173.848516\nv 202.328896 153.760193 172.018246\nv 199.717854 154.006373 177.302158\nv 201.264817 153.860715 175.255871\nv 202.450013 153.707923 174.832187\nv 199.538260 154.116933 173.691256\nv 202.309208 153.670397 166.587560\nv 202.123371 153.745660 168.708834\nv 200.529453 153.966910 169.072627\nv 200.429680 153.993941 170.520520\nv 198.557982 154.221037 170.552701\nv 198.263580 154.257398 172.144800\nv 183.294160 154.449459 188.096618\nv 185.021424 154.437601 187.867579\nv 186.512259 154.404345 187.765309\nv 188.378267 154.367018 187.364161\nv 190.266984 154.322521 186.756152\nv 192.920918 154.169470 186.537692\nv 196.690839 153.941943 185.261152\nv 198.314995 153.865282 183.878099\nv 199.900699 153.759081 182.609139\nv 201.436683 153.606654 181.828449\nv 202.690421 153.458431 181.361695\nv 204.053932 153.297901 180.497019\nv 205.524406 153.115072 179.271551\nv 207.139630 152.872862 178.233108\nv 209.268406 152.513335 176.877173\nv 208.987166 152.602327 175.131565\nv 210.368893 152.334002 173.940445\nv 211.614467 152.068917 172.872183\nv 213.283804 151.681603 172.107324\nv 213.347379 151.650679 170.573506\nv 215.257127 151.137236 169.000822\nv 215.150093 151.122993 167.552247\nv 217.011817 150.609408 167.232701\nv 184.628301 150.682351 214.833976\nv 188.220404 150.293086 216.048555\nv 190.104595 150.343705 215.305946\nv 191.983392 150.183759 215.452237\nv 194.028727 150.267376 214.231928\nv 195.857521 150.197194 213.719740\nv 197.745773 150.142158 212.972273\nv 199.646285 150.078143 212.123674\nv 201.562573 150.019038 211.091754\nv 203.471003 149.842089 210.514245\nv 205.337485 149.706532 209.605403\nv 207.168370 149.624774 208.278953\nv 209.000584 149.461042 207.213014\nv 210.875363 149.266553 206.086040\nv 212.675227 148.880936 205.946617\nv 212.994067 149.142992 203.985422\nv 215.362833 148.511950 204.233283\nv 217.132292 148.247300 202.961903\nv 184.563649 149.105225 221.900452\nv 186.462537 148.985810 222.146444\nv 188.700028 149.154945 221.005382\nv 190.594052 149.087951 220.798985\nv 192.602093 149.051049 220.315727\nv 194.858198 149.008464 219.621480\nv 196.531955 148.954705 219.106090\nv 198.910853 148.865862 218.249647\nv 200.933406 148.679700 217.862002\nv 202.671564 148.771982 216.301509\nv 204.470947 148.493503 216.224156\nv 208.179061 148.098850 214.881854\nv 211.190785 147.985307 212.380267\nv 212.955249 147.870529 210.931993\nv 214.942463 147.698962 209.291345\nv 217.131300 147.383306 207.849980\nv 184.255721 151.360905 211.369963\nv 185.890542 151.312033 211.401559\nv 187.718331 151.418471 210.441319\nv 189.493246 151.402438 210.044392\nv 191.280058 151.372261 209.599880\nv 193.094341 151.335350 209.056598\nv 194.907755 151.309892 208.315959\nv 196.593780 151.144657 208.313488\nv 198.593444 151.275964 206.268853\nv 200.255536 151.038754 206.440027\nv 202.007609 150.816589 206.336911\nv 203.878252 150.730313 205.168089\nv 205.707794 150.575755 204.273208\nv 207.499340 150.381643 203.489201\nv 207.651002 150.582717 202.004008\nv 209.711337 150.415718 200.414663\nv 215.617808 149.615220 196.309591\nv 199.376302 134.652625 161.851992\nv 181.869808 134.388115 197.328520\nv 183.409194 129.912344 220.408970\nv 189.252455 126.506390 230.778476\nv 203.590494 124.435496 230.433240\nv 191.468403 126.266755 230.876039\nv 183.457073 128.229264 226.363651\nv 185.456721 128.260071 226.066330\nv 187.587521 128.233114 225.790608\nv 189.646078 128.158564 225.554947\nv 191.622498 128.058407 225.311609\nv 195.039017 127.945329 224.444338\nv 196.944345 127.966747 223.495171\nv 199.679411 126.837815 225.816154\nv 196.409716 135.344025 170.597035\nv 195.834711 135.382443 168.765973\nv 193.882746 135.576966 168.606327\nv 192.479214 135.712881 169.960030\nv 190.449162 135.862771 170.498808\nv 188.640386 135.966278 171.306309\nv 189.697873 135.824570 176.912793\nv 190.349471 135.651458 180.191210\nv 186.905670 136.034100 172.282643\nv 184.590913 135.973934 178.343800\nv 187.317846 135.743439 181.484990\nv 185.222480 136.079924 172.955589\nv 184.178971 135.823919 181.675669\nv 187.943649 135.769945 162.549520\nv 194.604359 135.347979 163.952700\nv 191.091702 135.652845 163.910162\nv 186.734340 135.938845 165.426755\nv 185.324093 136.004346 166.147755\nv 184.562723 133.455783 203.384485\nv 186.103446 133.480135 202.948983\nv 187.771361 133.468073 202.565184\nv 189.541862 133.451710 202.059752\nv 191.309360 133.381558 201.684401\nv 193.763238 132.754035 204.253173\nv 193.249565 133.556964 199.596615\nv 196.498995 132.786417 202.273061\nv 198.623592 132.480714 202.520972\nv 199.646471 132.564059 201.090733\nv 201.168841 132.451938 200.350265\nv 202.921571 132.296438 199.469690\nv 204.658737 132.110326 198.614914\nv 206.430741 131.906164 197.612771\nv 208.210317 131.690251 196.393897\nv 211.647892 131.421132 191.777325\nv 213.239723 131.108806 190.648686\nv 217.436161 130.356294 184.090426\nv 183.447471 135.089737 191.148183\nv 185.346258 135.086383 190.813352\nv 187.152677 135.068703 190.373785\nv 188.887382 135.030631 189.928399\nv 192.208831 134.661481 191.299207\nv 193.851125 134.559321 190.966418\nv 195.512948 134.457866 190.394644\nv 197.147696 134.349903 189.671595\nv 198.698246 134.236489 188.841252\nv 200.194565 134.111121 187.999269\nv 201.679629 133.970167 187.069877\nv 203.181443 133.803736 186.112035\nv 204.733393 133.613832 184.993522\nv 206.326876 133.381003 183.896570\nv 207.809710 133.136349 182.787428\nv 213.766578 131.882130 173.546724\nv 214.430613 131.672813 172.078414\nv 215.667304 130.952886 164.392426\nv 183.833039 134.363303 197.298670\nv 185.609118 134.356936 197.026724\nv 187.452494 134.332926 196.684990\nv 189.462278 134.290785 196.183283\nv 193.538440 133.722023 198.145806\nv 194.806853 133.709657 197.349576\nv 196.051486 133.700877 196.393191\nv 197.516890 133.585816 195.981401\nv 199.169265 133.470538 195.216547\nv 200.805627 133.361741 194.202056\nv 202.428441 133.235833 193.109212\nv 204.035435 133.083553 192.008984\nv 205.606025 132.903508 190.954189\nv 207.112940 132.705128 189.921620\nv 208.585244 132.505683 188.647867\nv 210.106507 132.283953 187.138506\nv 212.936004 131.803336 183.557546\nv 213.735298 131.662467 182.093556\nv 207.280092 133.312182 164.324294\nv 206.088336 133.775300 169.113559\nv 201.773196 134.335672 163.054505\nv 202.587620 134.448110 169.008377\nv 204.416021 134.160867 171.669716\nv 199.270296 134.809525 164.478620\nv 197.693934 135.055533 164.887921\nv 197.288163 135.171232 166.978956\nv 199.389820 134.963738 173.298846\nv 183.107239 135.621962 185.104531\nv 184.983051 135.617788 184.695681\nv 186.572528 135.596490 184.342994\nv 191.266125 135.303044 184.890406\nv 192.698690 135.162576 185.377684\nv 194.155973 135.076085 184.861046\nv 195.808605 134.963992 184.145005\nv 197.416661 134.820165 183.654586\nv 199.384261 134.694697 181.465757\nv 201.069155 134.489979 180.913905\nv 203.174274 134.255622 178.524602\nv 204.854103 133.975077 177.936973\nv 207.925156 133.417396 173.788961\nv 183.770611 131.221022 214.984503\nv 185.452140 131.131710 215.164023\nv 187.060965 131.182256 214.668706\nv 189.026020 131.211009 214.064687\nv 190.963855 131.215785 213.407897\nv 192.870365 131.243575 212.531038\nv 194.860389 131.272438 211.449798\nv 200.391901 130.240004 212.658760\nv 202.376261 130.087560 211.834472\nv 204.184716 129.931181 210.984653\nv 205.920755 129.719543 210.298864\nv 207.621113 129.435167 209.851440\nv 211.921951 129.249414 205.371841\nv 213.225150 129.013911 204.649947\nv 185.711814 129.738592 220.794282\nv 187.901169 129.773754 220.265834\nv 189.848480 129.804400 219.665078\nv 191.810929 129.793774 219.072338\nv 193.785155 129.769782 218.391772\nv 195.754643 129.737647 217.604702\nv 197.726170 129.675187 216.777418\nv 202.181655 128.345738 219.089542\nv 202.929407 128.624401 217.413493\nv 205.322390 128.172528 217.320015\nv 207.502350 128.023008 215.938214\nv 209.382709 127.806536 214.922968\nv 211.503751 127.767495 212.648476\nv 213.201362 127.440606 211.953493\nv 215.298872 127.997122 206.440069\nv 183.455340 132.463316 209.103579\nv 185.034815 132.359030 209.431685\nv 186.592408 132.416863 208.872502\nv 188.401006 132.463766 208.166936\nv 190.245021 132.468603 207.523289\nv 192.338294 132.414627 206.919380\nv 194.363937 131.684246 209.663990\nv 196.109734 132.176503 206.096713\nv 198.991449 131.615240 207.073458\nv 203.333689 131.097133 206.075921\nv 206.041085 130.971418 203.869850\nv 207.506292 130.901750 202.439446\nv 209.459264 130.607045 201.498313\nv 211.900052 130.365333 199.117360\nv 213.458889 130.076341 198.088804\nv 214.709357 129.973485 196.258076\nv 215.840503 129.840995 194.595659\nv 166.029054 135.255011 176.874078\nv 164.222188 133.166472 198.387306\nv 179.830822 126.795168 230.865021\nv 180.734220 130.493173 218.219561\nv 181.038894 133.901274 200.790687\nv 179.714975 135.334317 188.689255\nv 146.537617 130.797007 163.875218\nv 146.464101 130.666957 162.484744\nv 157.681305 123.969235 230.818942\nv 174.318066 126.384497 231.357044\nv 158.080015 125.212805 227.689470\nv 157.976670 127.059789 221.865258\nv 161.423396 126.345273 226.479517\nv 160.670190 127.083169 223.673056\nv 159.542872 129.184267 215.205580\nv 161.121312 128.692837 218.312552\nv 161.736841 130.830019 209.669038\nv 166.318907 127.157635 226.507851\nv 163.760199 127.230408 225.004350\nv 165.128461 128.764452 220.478834\nv 163.160432 128.680598 219.641912\nv 163.764966 130.969637 210.469141\nv 160.581332 130.020967 212.482139\nv 163.095017 132.106795 204.097699\nv 162.554064 131.488399 206.981819\nv 164.613797 132.248604 204.468693\nv 165.800267 131.103552 211.181848\nv 166.685765 129.687402 217.761091\nv 169.123496 128.226928 224.159780\nv 165.466706 135.263488 173.364840\nv 163.415321 134.700936 182.152205\nv 163.311816 134.775403 180.421714\nv 160.566535 133.936935 186.933230\nv 161.950702 134.352361 184.399802\nv 159.238754 133.471836 189.604763\nv 156.891152 132.093112 197.403311\nv 158.224893 132.659497 195.165523\nv 155.145746 130.850922 202.912843\nv 155.818623 131.501372 199.904875\nv 153.395567 129.431485 208.163169\nv 154.367113 130.187583 205.553918\nv 150.772114 127.872496 211.941319\nv 161.792393 133.364860 194.267201\nv 162.766549 133.818237 191.620316\nv 160.176877 132.398063 199.439104\nv 161.042179 132.915555 196.889298\nv 158.758516 131.182839 205.189340\nv 159.388507 131.793278 202.382678\nv 156.703657 129.743526 210.288922\nv 157.916851 130.524039 207.773868\nv 154.640133 127.973167 215.733080\nv 155.562330 128.854895 213.049093\nv 164.362268 133.931402 192.505123\nv 161.956557 132.525810 200.468133\nv 162.640107 133.043165 197.707892\nv 160.658652 131.327513 206.227328\nv 161.279333 131.951633 203.362200\nv 158.546517 129.878764 211.414088\nv 159.752789 130.677873 208.746998\nv 157.087921 127.842150 218.384870\nv 156.556911 128.226343 216.526120\nv 157.055282 129.021500 213.774938\nv 164.774774 134.998598 179.787724\nv 162.074803 134.072910 187.946691\nv 160.142371 133.176746 193.698867\nv 161.059588 133.663849 190.657521\nv 158.472428 132.252881 198.396052\nv 159.562501 132.774631 196.107295\nv 156.937019 131.031546 204.019399\nv 157.491460 131.640402 201.114497\nv 155.022699 129.602415 209.206424\nv 156.187893 130.377355 206.691027\nv 152.811920 127.737357 214.816304\nv 153.895503 128.673386 212.108372\nv 153.646329 129.078876 210.141260\nv 149.075590 128.502699 206.846814\nv 147.612564 127.455681 209.530924\nv 149.277359 128.969703 204.863004\nv 152.557663 131.072159 197.752213\nv 151.644607 130.388220 200.699926\nv 155.242333 132.349277 192.820241\nv 153.614341 131.712262 195.008348\nv 155.950901 133.061355 187.328579\nv 158.939404 133.993750 182.439123\nv 157.619546 133.577089 185.049716\nv 161.695330 134.674383 177.522098\nv 160.315951 134.353142 180.083210\nv 163.897376 135.079400 171.993076\nv 163.172086 134.944788 175.317137\nv 146.713456 123.388595 222.782263\nv 148.522300 126.260841 215.506709\nv 150.529124 128.682602 208.054589\nv 149.091873 127.645780 210.766924\nv 152.438207 129.912011 204.491911\nv 150.613670 129.595494 203.541776\nv 151.758230 129.208277 207.167311\nv 154.190192 131.317131 198.755047\nv 153.342151 130.628307 201.790199\nv 156.833070 132.536561 194.019428\nv 155.309238 131.921854 196.280311\nv 157.501041 133.259814 188.528893\nv 160.453752 134.191264 183.394611\nv 159.088916 133.771185 185.971833\nv 163.205147 134.852172 178.625421\nv 161.836965 134.542657 180.970497\nv 164.525433 135.099285 176.203637\nv 166.757658 135.218612 163.798166\nv 169.479049 135.449081 162.951312\nv 168.227541 135.400456 164.421709\nv 165.321199 134.347390 189.629163\nv 168.145600 135.266671 181.617316\nv 166.733090 134.959378 184.240903\nv 170.665768 135.717700 175.807050\nv 165.899011 132.832296 201.896467\nv 167.539388 134.141522 193.844866\nv 166.556231 133.681370 196.631382\nv 169.384051 134.838516 188.830751\nv 168.569752 134.546966 191.021975\nv 169.920827 135.380026 182.338374\nv 172.432589 135.816957 176.594868\nv 171.184047 135.620893 179.445071\nv 170.600124 134.275383 195.003426\nv 172.349808 135.016142 189.323193\nv 174.223284 135.888097 177.316934\nv 173.049127 135.696138 180.312317\nv 165.043293 134.837325 183.261727\nv 167.669593 135.398496 177.703286\nv 171.656935 135.829110 169.455220\nv 171.633688 135.804509 167.949341\nv 173.056439 135.897894 168.349170\nv 164.993216 133.601051 195.853841\nv 166.924041 134.463678 190.247282\nv 169.402814 135.520077 178.634067\nv 174.397763 128.182787 225.858818\nv 174.578633 129.737329 220.388969\nv 175.571698 131.165205 214.745035\nv 175.941187 132.427759 208.819823\nv 176.458880 133.471538 203.000302\nv 176.956584 134.314217 197.352028\nv 177.110944 135.076298 190.894575\nv 177.043422 135.580323 184.973977\nv 176.470225 129.565863 221.378355\nv 177.567620 131.151187 215.177350\nv 177.842772 132.392117 209.337707\nv 178.238748 133.420239 203.632811\nv 180.204025 132.857107 207.100152\nv 178.555244 134.310155 197.686049\nv 178.680219 135.047113 191.506667\nv 179.478263 135.975805 178.866969\nv 171.716777 127.391539 227.739364\nv 171.899690 129.008738 222.387040\nv 173.497788 129.010643 222.816874\nv 172.046796 130.502084 216.652274\nv 172.924899 131.862866 210.804028\nv 173.458333 132.983989 205.037481\nv 174.288065 133.952931 199.170988\nv 175.556024 134.752726 193.370312\nv 176.012475 135.294872 188.196939\nv 177.238049 135.793607 181.796754\nv 179.199706 136.074882 175.727986\nv 180.346750 136.125854 172.771021\nv 175.774186 135.944858 165.510639\nv 174.354931 135.926076 166.985500\nv 170.635668 135.189659 185.827618\nv 171.740957 135.463441 183.121808\nv 170.459914 134.647098 191.599330\nv 170.685291 134.928811 188.992945\nv 168.159127 133.740181 197.427817\nv 169.182204 134.220798 194.481431\nv 169.497451 132.949943 203.467334\nv 167.550376 131.888944 208.290756\nv 169.256620 131.874227 209.255332\nv 170.440741 128.986271 221.975504\nv 169.698062 131.211030 212.679144\nv 170.016101 130.477042 216.013077\nv 170.568099 132.436847 206.979645\nv 169.041074 132.404253 206.432143\nv 171.067776 131.871830 210.075788\nv 171.370315 133.503478 201.037715\nv 169.809368 133.535089 200.053174\nv 171.620279 132.979100 204.337025\nv 171.644679 134.191927 196.244998\nv 172.774410 133.951438 198.568126\nv 173.871730 134.786517 192.351204\nv 174.089068 135.295506 187.223616\nv 176.669407 136.059754 169.324411\nv 147.666268 131.397689 180.576774\nv 148.335213 131.764076 174.028954\nv 157.134486 133.789345 165.374835\nv 155.866333 133.433725 163.896748\nv 160.524036 134.577246 173.305706\nv 154.727655 133.447162 173.646786\nv 157.041513 133.942330 172.124326\nv 155.866886 133.700802 170.616715\nv 151.672800 132.611121 178.647790\nv 153.324279 133.095204 175.997317\nv 150.392783 132.239467 179.679137\nv 145.317690 130.197621 187.465120\nv 147.059408 130.722938 187.787611\nv 156.329247 133.756356 168.901270\nv 158.353353 134.091022 166.648354\nv 148.097822 131.458721 182.231906\nv 148.895143 131.817976 179.355505\nv 145.342930 130.441512 184.102565\nv 157.949309 134.106991 170.277724\nv 152.957782 132.890447 179.701207\nv 149.957276 131.818269 184.912318\nv 150.922613 132.300986 181.274127\nv 148.047043 130.851051 189.627830\nv 149.609140 131.593517 186.497544\nv 162.163615 134.828352 170.697554\nv 157.414111 133.916329 178.305747\nv 158.606110 134.209564 175.555250\nv 155.671187 133.350530 182.673073\nv 155.834883 133.486664 180.734165\nv 153.265115 132.692716 184.506703\nv 150.076778 131.144680 192.373214\nv 152.075415 131.945888 189.819561\nv 148.378254 130.007468 197.211337\nv 149.821852 130.309521 197.988947\nv 148.470077 130.582762 193.171886\nv 146.233215 128.406809 202.777612\nv 161.006129 134.629719 168.947943\nv 156.256890 133.726774 177.080420\nv 157.761307 134.079285 173.795974\nv 148.418093 130.793123 191.374504\nv 150.824728 131.786407 188.162116\nv 146.880216 129.716212 196.036675\nv 147.153994 130.284878 192.243138\nv 146.309426 127.262088 208.472286\nv 148.724065 129.526640 200.866808\nv 147.544178 128.639472 203.788263\nv 150.933594 130.787080 196.830127\nv 150.162001 130.879202 194.654668\nv 150.052176 130.111957 199.785263\nv 153.604802 132.152531 191.384244\nv 151.826776 131.446039 193.644958\nv 154.558660 132.875927 185.992271\nv 157.368207 133.748981 181.635055\nv 156.341349 133.387168 184.290230\nv 160.195082 134.463112 176.615087\nv 158.822222 134.138473 179.277966\nv 161.869196 134.775928 174.257060\nv 165.180338 135.133145 165.958415\nv 166.730925 135.344222 166.606388\nv 167.498585 135.459296 168.039250\nv 167.274111 135.457826 174.035395\nv 166.416124 135.142874 180.723768\nv 163.712892 134.210589 188.968448\nv 165.072650 134.595781 186.632801\nv 163.409157 133.496701 195.065280\nv 165.927693 134.047234 193.154643\nv 163.775088 132.661335 201.274035\nv 165.599573 133.275659 198.832078\nv 165.973788 132.232437 205.548305\nv 167.850941 131.190725 211.902354\nv 168.653236 129.708807 218.584366\nv 171.009079 128.218436 224.834167\nv 170.532234 126.319308 230.580769\nv 143.761597 144.675530 161.180878\nv 218.761597 144.675530 161.180878\nv 145.479088 144.257827 161.107240\nv 145.090633 145.580949 161.340538\nv 213.920481 138.299747 160.056646\nv 212.956562 134.817111 159.442570\nv 215.170238 145.004565 161.238908\nv 211.719372 135.797385 159.615448\nv 212.337787 147.136458 161.614821\nv 210.566701 147.210972 161.627946\nv 210.053918 145.764694 161.372930\nv 205.962163 138.479060 160.088317\nv 204.368652 139.282801 160.230010\nv 207.235044 145.123590 161.259911\nv 209.283994 148.890385 161.924065\nv 207.995260 143.158475 160.913389\nv 207.596667 139.517103 160.271333\nv 203.233585 146.303877 161.467973\nv 205.273887 149.167055 161.972846\nv 163.021585 139.607270 160.287237\nv 193.411920 138.245775 160.047145\nv 194.316339 150.286215 162.170190\nv 196.119592 149.049734 161.952173\nv 197.621999 150.669141 162.237737\nv 198.187211 144.184268 161.094278\nv 197.896716 141.401120 160.603529\nv 199.960153 149.105958 161.962089\nv 200.270644 150.784186 162.258001\nv 199.678893 139.295238 160.232216\nv 160.748938 146.575518 161.515884\nv 162.241665 150.058070 162.129996\nv 164.106970 148.696753 161.889978\nv 166.085027 149.606135 162.050281\nv 165.901295 151.748440 162.428026\nv 165.998842 143.762129 161.019856\nv 201.348725 147.494491 161.677950\nv 203.284953 148.267795 161.814282\nv 192.548193 147.035287 161.596979\nv 193.144939 151.376734 162.362495\nv 169.085808 150.934866 162.284587\nv 167.941377 141.320993 160.589426\nv 167.850776 149.675377 162.062493\nv 167.689455 142.990750 160.883843\nv 149.896306 137.177091 159.858693\nv 147.767047 146.226124 161.454299\nv 148.853034 147.664203 161.707889\nv 149.482557 145.961669 161.407696\nv 150.585925 147.610249 161.698354\nv 154.281913 138.405416 160.075322\nv 153.123788 145.929530 161.402029\nv 152.460373 147.515558 161.681658\nv 153.833611 144.145884 161.087516\nv 155.986148 139.201529 160.215715\nv 154.870718 145.901781 161.397120\nv 154.192539 147.532771 161.684712\nv 158.631587 137.158839 159.855519\nv 155.913794 147.299367 161.643523\nv 157.584145 146.520454 161.506204\nv 159.381878 140.426907 160.431753\nv 159.075392 147.409065 161.662903\nv 161.233629 140.095818 160.373362\nv 191.795699 151.478125 162.380378\nv 192.182275 145.622538 161.347873\nv 190.263066 148.128679 161.789755\nv 189.622754 140.537999 160.451345\nv 190.256250 138.761613 160.138113\nv 189.171559 142.246410 160.752567\nv 190.612250 145.367752 161.302943\nv 187.819322 140.827501 160.502374\nv 185.937645 141.380673 160.599911\nv 184.716787 139.940356 160.345956\nv 182.999627 140.536186 160.451017\nv 182.180966 142.391241 160.778107\nv 181.251310 140.974885 160.528369\nv 180.440921 139.417760 160.253804\nv 179.463692 141.451462 160.612391\nv 178.677281 139.838723 160.328028\nv 177.503403 141.829491 160.679028\nv 175.800951 147.997736 161.766676\nv 175.889245 138.734897 160.133397\nv 175.515301 141.978773 160.705382\nv 174.819739 140.260275 160.402362\nv 174.193087 145.475999 161.322029\nv 174.386358 151.199968 162.331338\nv 172.589536 150.602214 162.225918\nv 170.813870 149.689265 162.064963\nv 170.787417 145.940597 161.403970\nv 218.761597 134.776238 234.250354\nv 218.761597 127.892846 231.581217\nv 218.761597 133.614575 235.387577\nv 218.761597 129.035465 233.001130\nv 218.761597 123.951860 228.056950\nv 218.761597 137.464563 161.506254\nv 218.761597 145.680568 162.943862\nv 218.761597 135.470592 164.278111\nv 218.761597 134.388335 165.775863\nv 218.761597 146.289168 165.577919\nv 218.761597 136.615110 167.851836\nv 218.761597 143.784434 167.906010\nv 218.761597 145.498299 169.012776\nv 218.761597 143.943548 169.664155\nv 218.761597 144.904510 172.096191\nv 218.761597 143.975104 173.654718\nv 218.761597 146.201693 173.857023\nv 218.761597 126.022688 223.196507\nv 218.761597 123.955352 223.223453\nv 218.761597 132.200131 224.178687\nv 218.761597 136.623192 174.628184\nv 218.761597 135.706393 176.011193\nv 218.761597 145.021869 177.189889\nv 218.761597 136.258751 178.861495\nv 218.761597 145.184426 181.771803\nv 218.761597 134.796796 182.380470\nv 218.761597 132.433477 183.860153\nv 218.761597 136.300410 183.808936\nv 218.761596 133.355630 185.467018\nv 218.761597 142.371838 186.366275\nv 218.761597 134.196272 187.213549\nv 218.761597 139.568848 187.356851\nv 218.761597 137.084825 188.592020\nv 218.761597 145.936366 189.902808\nv 218.761597 144.189329 188.980072\nv 218.761597 135.578854 191.329806\nv 218.761597 132.433083 190.343936\nv 218.761597 139.311314 192.216269\nv 218.761597 132.860403 191.613357\nv 218.761597 142.424335 193.667915\nv 218.761597 144.041130 194.532305\nv 218.761597 142.423311 195.361758\nv 218.761597 134.643416 194.639461\nv 218.761597 135.654238 196.345501\nv 218.761597 132.520338 194.589851\nv 218.761597 133.530085 223.250986\nv 218.761597 130.472823 221.942965\nv 218.761597 136.414291 223.689298\nv 218.761597 136.703205 222.071125\nv 218.761597 133.455440 221.463751\nv 218.761597 139.935265 223.558343\nv 218.761597 140.380412 221.334258\nv 218.761597 140.795726 219.550636\nv 218.761597 137.409889 217.491561\nv 218.761597 139.391533 215.064793\nv 218.761597 140.764019 215.733488\nv 218.761597 139.279281 216.657292\nv 218.761597 130.052905 216.822085\nv 218.761597 132.008542 196.573106\nv 218.761597 135.019847 198.014523\nv 218.761597 143.684744 200.769915\nv 218.761597 140.617723 199.675010\nv 218.761597 132.697566 199.784761\nv 218.761597 142.609599 204.335251\nv 218.761597 141.963375 205.931566\nv 218.761597 131.866098 205.445770\nv 218.761597 140.519839 209.133289\nv 218.761597 133.498346 208.163555\nv 218.761597 141.865662 211.514951\nv 218.761597 138.668326 211.578414\nv 218.761597 141.978257 213.060798\nv 218.761597 132.212689 212.769438\nv 143.761597 133.614575 235.387577\nv 217.325765 129.638649 234.686496\nv 216.951680 127.283924 234.271292\nv 145.018872 135.530385 235.725393\nv 217.210773 131.555848 235.024556\nv 147.977580 130.861200 234.902076\nv 146.233718 136.521029 235.900055\nv 146.859875 132.675136 235.221924\nv 146.502703 134.711791 235.581040\nv 147.400323 137.801511 236.125822\nv 148.199724 134.248783 235.499385\nv 151.866240 127.403158 234.292295\nv 149.028539 137.461957 236.065946\nv 151.773463 130.758460 234.883919\nv 149.768876 135.612212 235.739778\nv 214.299129 136.978381 235.980652\nv 213.689750 130.470468 234.833177\nv 214.014622 133.505713 235.368357\nv 215.881069 135.449392 235.711097\nv 215.615765 132.566799 235.202822\nv 212.433496 134.184080 235.487956\nv 208.699829 128.612789 234.505598\nv 212.166885 137.599160 236.090113\nv 210.854928 134.706776 235.580122\nv 153.379735 139.703444 236.461216\nv 155.440108 127.258014 234.266697\nv 207.251910 125.667806 233.986327\nv 208.737431 130.308858 234.804654\nv 208.839060 137.081405 235.998821\nv 207.171923 130.834683 234.897360\nv 208.484870 138.857548 236.312035\nv 207.240312 136.026191 235.812781\nv 205.660938 137.759303 236.118370\nv 203.893712 132.407219 235.174682\nv 203.737908 137.339556 236.044354\nv 202.813995 127.321413 234.277908\nv 202.599463 138.264945 236.207502\nv 158.000335 129.086370 234.589117\nv 159.324579 127.220684 234.260119\nv 159.630329 128.999143 234.573693\nv 161.019659 128.063165 234.408646\nv 162.671697 127.653910 234.336495\nv 162.808525 133.611651 235.386989\nv 161.470225 139.834531 236.484258\nv 163.717349 130.976851 234.922422\nv 165.015532 129.639311 234.686596\nv 166.186045 128.120362 234.418768\nv 167.158959 131.969492 235.097448\nv 166.871883 130.058042 234.760428\nv 166.741125 141.805559 236.831837\nv 167.160018 138.080083 236.174935\nv 168.412463 140.507016 236.602880\nv 171.517969 140.392049 236.582609\nv 173.445524 129.164832 234.602933\nv 173.557274 130.998211 234.926213\nv 173.967959 136.822741 235.953228\nv 175.491780 140.309294 236.568003\nv 175.220775 131.916909 235.088202\nv 177.082267 130.752225 234.882785\nv 178.247789 128.867736 234.550509\nv 176.984005 134.966078 235.625802\nv 178.314012 141.542011 236.785354\nv 178.392087 132.255519 235.147868\nv 178.993973 130.488892 234.836380\nv 179.707186 143.002697 237.042937\nv 189.425222 128.922325 234.560169\nv 188.323157 131.599055 235.032143\nv 188.107817 137.343149 236.044961\nv 186.127594 135.442842 235.709900\nv 185.312158 127.138057 234.245570\nv 184.851412 132.565944 235.202666\nv 183.652166 139.543352 236.432964\nv 184.240390 130.523209 234.842482\nv 183.565749 128.554170 234.495289\nv 183.116697 135.821496 235.776697\nv 182.901078 132.084633 235.117795\nv 181.782460 139.306819 236.391265\nv 200.162868 128.582618 234.500247\nv 198.924828 131.182811 234.958749\nv 200.000262 133.977154 235.451468\nv 198.650733 127.663109 234.338122\nv 199.104301 137.978157 236.156953\nv 198.361798 139.991431 236.511971\nv 197.531482 136.409835 235.880439\nv 195.685031 127.754954 234.354331\nv 195.381009 138.710114 236.286017\nv 194.827909 140.410669 236.585875\nv 195.730109 142.123269 236.887853\nv 193.789523 139.043075 236.344730\nv 194.155223 141.711742 236.815294\nv 192.398898 139.394569 236.406700\nv 193.168933 140.597102 236.618758\nv 191.165415 138.752136 236.293407\nv 189.683495 137.957159 236.153230\nv 191.276554 140.591411 236.617716\nv 143.761597 130.204752 233.699303\nv 143.761597 144.309887 162.952095\nv 143.761597 140.415758 162.186998\nv 143.761597 136.236331 161.624203\nv 143.761597 133.329037 163.759000\nv 143.761597 144.391704 165.736953\nv 143.761597 146.278371 165.584600\nv 143.761597 147.022381 168.773484\nv 143.761597 143.554495 167.458329\nv 143.761597 140.634904 168.093140\nv 143.761597 136.815489 167.459351\nv 143.761597 147.995213 167.049030\nv 143.761597 134.901101 167.012847\nv 143.761597 136.201513 165.731481\nv 143.761597 135.345862 231.183943\nv 143.761597 131.575770 228.335696\nv 143.761597 126.200296 225.791444\nv 143.761597 126.534637 224.549755\nv 143.761597 147.115153 177.451121\nv 143.761597 136.473290 176.178919\nv 143.761597 134.980898 176.111480\nv 143.761597 145.155054 173.937317\nv 143.761597 145.386289 172.091741\nv 143.761597 144.493909 170.748337\nv 143.761597 133.607065 169.643692\nv 143.761597 137.279247 169.191634\nv 143.761597 144.785424 179.586987\nv 143.761597 136.635665 179.065268\nv 143.761597 135.167125 179.761990\nv 143.761597 135.207438 181.530360\nv 143.761597 140.441755 184.182052\nv 143.761597 133.289041 185.118436\nv 143.761597 136.853854 184.751953\nv 143.761597 134.534729 186.465753\nv 143.761597 136.390888 189.747620\nv 143.761597 133.545985 191.247243\nv 143.761597 135.443995 191.366194\nv 143.761597 132.665035 192.765628\nv 143.761597 143.473955 194.885481\nv 143.761597 134.989514 194.461179\nv 143.761597 135.227474 195.944726\nv 143.761597 129.263108 224.284509\nv 143.761597 125.853245 223.234298\nv 143.761597 126.721129 221.764480\nv 143.761597 128.901674 222.106606\nv 143.761597 141.075759 224.123169\nv 143.761597 138.194812 223.319434\nv 143.761597 135.660029 220.920852\nv 143.761597 139.827266 222.558571\nv 143.761597 140.204852 220.703506\nv 143.761597 134.061211 217.183284\nv 143.761597 133.019045 216.048863\nv 143.761597 141.944792 217.765487\nv 143.761597 138.740761 217.356727\nv 143.761597 140.406061 216.731938\nv 143.761597 138.821847 215.354811\nv 143.761597 132.068375 212.978517\nv 143.761597 134.605193 200.310300\nv 143.761597 145.768180 201.526839\nv 143.761597 144.143535 201.419354\nv 143.761597 140.818165 200.759658\nv 143.761597 133.847757 198.791760\nv 143.761597 134.607855 197.328363\nv 143.761597 132.209536 195.526325\nv 143.761597 132.467624 210.876712\nv 143.761597 142.362695 214.318345\nv 143.761597 141.642811 211.613708\nv 143.761597 141.378571 209.787225\nv 143.761597 143.885989 205.340984\nv 143.761597 140.925231 204.856843\nv 143.761597 134.397141 206.070253\nv 143.761597 131.126149 206.614552\nv 146.660736 146.207692 215.119142\nv 156.574501 153.079168 166.275725\nv 154.984890 152.715272 164.421951\nv 181.195076 155.117798 175.056740\nv 152.709234 142.893919 232.460960\nv 145.527099 148.722413 200.182522\nv 145.438739 150.511762 165.601503\nv 145.239862 143.442359 224.133201\nv 152.735721 143.338449 231.143734\nv 156.299163 143.805804 232.150813\nv 163.320294 144.806118 232.918978\nv 165.607457 145.106096 232.982329\nv 179.663259 146.696840 230.979513\nv 177.809075 146.688501 230.875769\nv 175.256178 146.650615 230.684296\nv 172.751506 146.540977 230.554235\nv 171.041609 146.711359 229.564624\nv 169.472993 146.496357 229.833202\nv 167.506533 146.648255 228.647560\nv 165.093305 146.404068 228.498742\nv 163.250746 146.433952 227.551073\nv 161.489966 146.457245 226.555091\nv 159.932051 146.412182 225.819554\nv 157.822527 146.182639 225.304289\nv 154.456873 145.142391 226.590175\nv 147.309203 144.334160 223.193241\nv 180.365287 148.064977 226.162816\nv 178.068104 148.348498 224.947571\nv 176.694728 147.950778 226.284149\nv 174.879614 147.924038 226.105299\nv 172.347080 147.842642 225.848715\nv 170.459979 147.994375 224.755844\nv 168.544743 147.939188 224.316297\nv 166.622757 147.882839 223.764851\nv 164.436200 147.924972 222.604916\nv 162.362323 147.688607 222.417886\nv 160.209431 147.766931 220.836669\nv 158.433273 147.649833 220.125395\nv 155.036745 147.461235 218.308633\nv 151.513874 146.983925 217.082449\nv 149.814399 147.014046 215.228409\nv 165.756593 154.331769 177.227059\nv 168.109350 154.514871 178.159744\nv 169.927484 154.622262 178.946038\nv 169.934551 154.545240 180.649391\nv 171.868311 154.688323 180.236577\nv 173.636410 154.735024 181.142985\nv 180.418891 154.741951 184.189088\nv 178.566357 154.755677 183.569975\nv 176.658634 154.839314 181.280149\nv 167.691185 154.596898 171.468195\nv 169.604937 154.746612 171.711507\nv 171.563641 154.865800 173.246551\nv 173.498689 154.957143 173.986121\nv 175.509076 155.009900 175.246695\nv 177.419061 155.063965 175.234386\nv 179.315331 155.098094 175.172881\nv 179.023002 155.124703 172.406309\nv 177.064625 155.089975 171.747101\nv 175.124042 155.031818 171.001375\nv 173.225263 154.951142 170.332127\nv 171.354245 154.844570 169.483595\nv 169.531395 154.705254 168.104465\nv 168.515613 154.626950 168.017302\nv 167.489666 154.538513 167.934253\nv 165.515592 154.352182 167.604693\nv 164.607591 154.209593 166.034569\nv 180.423516 152.465049 205.076303\nv 179.312305 152.650741 203.819147\nv 176.410819 152.538529 204.116724\nv 174.632779 152.554517 203.589281\nv 172.979992 152.547325 203.109187\nv 171.319329 152.556578 202.386322\nv 169.710086 152.518462 201.872167\nv 168.107501 152.479569 201.238195\nv 166.546075 152.407075 200.736755\nv 164.961585 152.267496 200.563491\nv 160.676566 151.521714 202.078756\nv 159.559383 151.923606 198.026560\nv 156.066300 151.173326 199.452492\nv 154.285586 151.109339 197.461795\nv 152.637406 150.864039 196.876158\nv 150.962322 150.782597 194.609505\nv 149.325656 150.430770 194.513504\nv 147.997850 150.112922 194.556487\nv 146.803808 150.006012 192.855933\nv 178.167358 153.843634 194.358302\nv 176.292159 153.933550 193.082645\nv 174.602794 153.956774 192.286017\nv 172.997354 153.945443 191.673227\nv 171.378966 153.977865 190.407751\nv 169.893088 153.868270 190.517716\nv 165.236935 153.575314 189.263747\nv 162.020912 153.119051 190.261687\nv 159.495948 152.956662 188.193437\nv 158.148853 152.812556 187.487267\nv 156.472314 152.600096 186.760391\nv 152.890803 152.186249 183.038871\nv 151.760982 151.980133 182.632621\nv 151.063002 151.892855 181.401921\nv 149.752483 151.675581 179.649754\nv 148.120063 151.311551 179.114953\nv 146.782139 151.009835 178.035251\nv 178.292274 153.252991 199.366539\nv 176.802037 153.233694 199.254338\nv 175.235290 153.323060 198.170695\nv 173.678361 153.332131 197.572705\nv 172.150970 153.308773 197.108896\nv 170.615646 153.304724 196.353552\nv 169.150396 153.269642 195.755818\nv 167.708566 153.282510 194.599970\nv 163.092410 152.445865 197.665896\nv 162.967112 152.821674 194.302211\nv 157.685896 152.036149 194.780658\nv 157.488417 152.183068 193.107223\nv 155.781034 151.966072 192.460035\nv 154.028581 151.808380 190.833097\nv 151.459334 151.473034 188.878692\nv 150.204141 151.259388 188.183748\nv 148.785589 150.998190 187.408839\nv 147.169037 150.720424 185.860660\nv 147.559642 151.019195 182.535666\nv 145.340901 150.435571 182.562817\nv 154.938294 152.839862 168.081477\nv 158.304553 153.373135 166.387582\nv 158.153750 153.444335 171.950695\nv 159.577135 153.655925 173.253032\nv 162.432792 154.026741 174.749619\nv 159.812694 153.543639 164.401193\nv 158.299766 153.424554 168.348704\nv 159.900628 153.696723 169.788623\nv 162.497519 154.056641 172.281081\nv 165.544286 154.391839 170.761218\nv 179.156075 154.302985 189.905032\nv 178.423894 154.520695 187.056489\nv 176.673100 154.467354 187.237170\nv 175.401654 154.473184 186.654884\nv 173.872287 154.490853 185.632076\nv 172.374366 154.413054 185.660546\nv 170.921103 154.333954 185.548969\nv 159.216021 153.395657 180.808902\nv 157.656272 153.156671 180.853363\nv 156.123364 152.965701 179.384717\nv 154.511394 152.714731 178.382364\nv 152.882490 152.422311 177.763061\nv 152.909702 152.462213 175.987412\nv 148.525229 151.521500 173.539868\nv 148.496245 151.501002 171.649046\nv 179.294142 150.709778 214.826087\nv 177.624681 150.641956 214.990732\nv 175.876725 150.896709 213.482483\nv 172.172668 150.732864 213.345448\nv 171.150375 150.678739 213.283621\nv 169.536078 150.574105 213.195525\nv 167.860521 150.442903 213.106861\nv 165.859740 150.518344 211.718093\nv 164.087570 150.346979 211.552547\nv 162.250075 150.300068 210.585219\nv 160.387518 150.211819 209.664737\nv 158.584206 149.961893 209.492361\nv 156.785230 149.997514 207.675997\nv 154.907842 149.897918 206.336034\nv 149.610063 148.704884 206.636149\nv 151.365172 149.493884 204.429848\nv 177.084549 149.481543 220.232864\nv 175.199988 149.470435 219.984519\nv 173.349300 149.432397 219.741290\nv 171.626623 149.377418 219.492679\nv 169.245639 149.381921 218.669741\nv 166.425705 149.152882 218.442583\nv 164.340920 149.020472 217.982119\nv 162.413092 149.025879 216.868888\nv 160.532012 148.870369 216.340435\nv 158.782658 148.844328 215.205466\nv 156.992124 148.794498 214.011633\nv 155.226423 148.660650 213.090088\nv 153.823580 148.646469 211.830352\nv 152.699369 148.335381 212.153602\nv 150.406279 148.181358 210.397317\nv 149.265569 149.202699 203.249275\nv 179.168506 151.672801 209.753556\nv 175.674928 151.526611 210.052326\nv 173.941809 151.576650 209.359774\nv 172.175360 151.642702 208.448664\nv 170.525818 151.528546 208.459729\nv 168.749408 151.579431 207.383649\nv 167.074999 151.493663 206.990447\nv 165.280645 151.544025 205.633853\nv 163.502347 151.530228 204.438608\nv 161.736694 151.350202 204.174395\nv 159.824546 151.177478 203.559757\nv 157.294193 150.878253 202.889175\nv 155.152860 150.776338 201.092526\nv 152.800294 150.053631 202.789093\nv 147.240385 149.188387 200.151776\nv 147.043489 149.319489 198.824171\nv 146.767587 149.610268 196.043179\nv 182.535184 155.010650 164.608451\nv 184.208114 155.058425 166.560017\nv 199.066874 154.081744 165.962711\nv 206.397172 153.021343 166.706369\nv 207.156801 142.864195 234.368271\nv 189.955931 144.864583 235.853798\nv 210.181235 142.363339 233.700160\nv 211.191523 142.620726 232.239893\nv 212.518099 142.218410 232.346917\nv 213.270755 143.884721 226.552953\nv 210.030101 144.309398 227.899892\nv 210.517972 143.593911 229.776139\nv 184.512416 146.137820 232.714589\nv 186.188570 146.093898 232.682501\nv 187.898165 146.040226 232.604428\nv 189.695776 145.993970 232.394721\nv 191.593617 145.583213 233.272190\nv 193.414078 145.775652 232.112716\nv 195.339716 145.600968 232.049784\nv 197.086681 145.409970 231.957239\nv 198.877011 145.697702 230.238296\nv 200.696475 145.488362 230.053544\nv 202.573409 145.494290 229.021432\nv 204.664151 145.443474 227.913380\nv 206.501456 145.108663 227.847303\nv 208.039468 145.856447 224.090913\nv 209.947179 145.592865 223.498979\nv 209.880407 145.149795 225.150703\nv 215.303046 144.569123 222.228623\nv 183.085721 147.559300 227.984842\nv 184.691984 147.510835 228.035084\nv 186.325309 147.449037 228.067028\nv 187.970653 147.372576 228.078244\nv 189.987682 147.317182 227.855255\nv 191.938571 147.234940 227.628725\nv 193.788148 147.126782 227.416748\nv 197.353738 147.084725 226.160796\nv 200.976054 147.055451 224.403920\nv 202.657456 147.032888 223.484840\nv 207.374534 146.706100 221.420671\nv 208.813361 146.535578 220.919475\nv 210.586671 146.348138 220.114070\nv 212.382657 146.124909 219.288086\nv 213.567217 145.840547 219.263526\nv 214.358613 145.957430 217.928762\nv 214.682311 146.565142 214.963097\nv 197.611118 154.253979 177.048379\nv 196.328043 154.323563 178.671973\nv 194.601648 154.475896 178.731834\nv 197.774224 154.275347 167.635492\nv 195.880314 154.467592 167.948925\nv 192.898331 154.605944 178.829586\nv 191.911204 154.681967 178.647097\nv 191.051203 154.669505 180.159368\nv 189.426629 154.760507 180.084537\nv 188.031713 154.778884 181.016680\nv 196.362902 154.442257 173.845924\nv 195.084726 154.542136 174.993402\nv 193.093490 154.681979 175.750178\nv 191.477741 154.766961 176.833520\nv 188.426086 154.880684 178.342047\nv 186.718208 154.938514 178.419189\nv 184.741056 154.972768 178.969347\nv 183.266301 155.098946 175.102505\nv 189.375447 154.945735 170.106750\nv 187.412752 155.035527 171.633536\nv 185.327674 155.096606 172.708384\nv 183.163975 155.127273 171.538028\nv 183.336391 152.228556 206.493735\nv 185.466333 152.227605 206.219922\nv 187.251373 152.135108 206.431777\nv 188.840654 152.259687 205.183833\nv 190.467448 152.158372 205.268615\nv 192.077892 152.049502 205.301334\nv 193.815701 152.031496 204.555735\nv 195.501748 151.964030 204.027850\nv 197.251876 151.915921 203.190245\nv 199.002559 151.855675 202.273533\nv 200.804221 151.821031 200.949471\nv 204.395442 151.769228 197.528368\nv 205.691113 151.290696 199.546013\nv 207.726404 151.010869 198.971704\nv 206.032690 151.586039 196.839884\nv 207.658859 151.423813 195.808807\nv 209.973323 150.821829 197.080152\nv 209.482344 151.292618 193.975072\nv 211.169997 150.799629 195.182591\nv 209.854776 151.402505 192.333685\nv 213.077841 150.423930 194.815417\nv 211.613750 151.091096 191.740415\nv 214.227046 150.302744 193.499098\nv 214.431050 150.395783 192.101903\nv 213.247578 150.814623 190.785760\nv 215.819105 150.102166 191.600523\nv 215.603398 150.422794 188.790917\nv 183.476821 153.681517 196.023009\nv 185.377214 153.668531 195.813709\nv 187.065039 153.684916 195.196603\nv 188.762316 153.711973 194.281482\nv 190.267920 153.621924 194.419237\nv 191.995363 153.614243 193.473062\nv 193.058593 153.574253 193.131025\nv 198.345613 153.493678 188.895457\nv 201.220204 153.043575 190.080887\nv 203.063587 152.903464 188.777610\nv 201.589950 153.322117 186.147121\nv 204.590761 152.744061 187.941791\nv 203.416882 153.082836 185.853533\nv 205.905770 152.579002 187.377557\nv 205.228008 152.871903 184.842822\nv 206.889029 152.634430 184.151409\nv 208.390312 152.326595 184.713265\nv 208.314892 152.548429 181.192778\nv 211.134767 151.911077 182.470979\nv 209.702771 152.330875 179.965448\nv 212.530609 151.660618 181.389857\nv 211.107388 152.035281 179.921297\nv 213.953387 151.388697 180.030781\nv 212.315352 151.833372 178.158631\nv 213.588527 151.570224 176.869955\nv 214.813163 151.288862 175.756229\nv 184.479560 153.014116 201.143731\nv 186.336917 152.841313 202.090467\nv 187.998142 153.035383 200.143277\nv 189.574495 152.928319 200.401652\nv 191.239120 152.931824 199.634018\nv 192.843550 152.880986 199.177799\nv 194.473918 152.824202 198.612572\nv 196.119312 152.771628 197.849974\nv 197.811623 152.707918 196.967639\nv 202.952467 152.643977 191.779094\nv 204.720270 152.105653 194.300007\nv 204.338412 152.594526 190.209104\nv 206.463491 151.905885 193.516332\nv 205.798627 152.361618 190.109593\nv 207.277069 152.117037 189.942635\nv 210.288672 151.503512 190.378523\nv 208.723535 151.988954 188.381935\nv 210.298874 151.613827 189.073122\nv 211.904543 151.345780 188.230895\nv 211.148153 151.721917 185.547549\nv 213.629258 151.046328 187.110603\nv 212.404144 151.492873 184.820647\nv 213.746030 151.137034 185.455316\nv 213.843625 151.227607 183.715815\nv 215.153085 150.951080 182.904001\nv 215.470273 150.948358 181.504271\nv 207.836194 152.799994 168.573817\nv 198.994466 154.143022 175.402099\nv 201.068379 153.917686 173.670566\nv 203.650053 153.513214 168.336571\nv 201.998847 153.788998 170.374003\nv 182.696566 154.333297 189.606392\nv 184.543970 154.316864 189.490098\nv 186.352737 154.283133 189.367998\nv 188.021930 154.220791 189.426023\nv 189.801447 154.218274 188.428027\nv 191.221364 154.180084 187.899171\nv 194.905312 154.004403 186.719510\nv 195.486384 154.176488 183.496002\nv 198.324655 153.757269 185.564463\nv 196.839022 154.039429 183.580801\nv 199.907800 153.655029 184.344631\nv 201.462467 153.520846 183.317754\nv 200.048317 153.863859 180.335293\nv 202.582963 153.395736 182.884673\nv 201.429159 153.687830 180.296032\nv 203.871346 153.243699 182.254352\nv 202.751219 153.495745 180.401629\nv 205.507416 153.074525 180.373232\nv 204.062407 153.364295 178.929455\nv 205.424800 153.204417 177.267259\nv 207.310996 152.900781 176.187901\nv 208.326994 152.664685 178.023126\nv 207.449993 152.918243 174.091138\nv 210.557446 152.276076 175.597495\nv 208.925140 152.632798 174.033532\nv 211.808419 152.022565 173.811822\nv 209.848631 152.457494 172.507816\nv 213.266876 151.692579 173.661837\nv 211.134856 152.176006 171.201853\nv 214.567353 151.372663 171.897317\nv 212.040803 151.944575 169.304222\nv 213.456100 151.597803 169.057488\nv 184.069455 150.144212 217.431329\nv 186.384339 150.203068 216.848955\nv 188.273354 150.034729 217.266649\nv 189.755073 150.063913 216.744740\nv 191.901631 150.016522 216.286164\nv 193.900111 149.992270 215.622563\nv 195.542275 149.780369 215.913322\nv 197.494787 149.841139 214.609015\nv 199.416957 149.802114 213.657869\nv 201.433675 149.755315 212.529292\nv 203.358440 149.499873 212.374720\nv 205.256523 149.214976 212.244281\nv 207.146643 149.267756 210.213808\nv 208.936123 149.300848 208.156236\nv 212.565586 148.583815 207.773167\nv 214.197457 148.637928 205.240881\nv 214.914905 148.892108 202.626252\nv 216.026525 148.809996 201.310619\nv 182.666980 148.799793 223.316734\nv 184.845533 148.695317 223.584460\nv 186.437037 148.759324 223.097544\nv 188.367344 148.848075 222.365210\nv 190.179204 148.748779 222.343203\nv 191.985547 148.623114 222.337844\nv 193.992308 148.687358 221.350807\nv 195.194700 148.644283 221.034296\nv 198.885941 148.481724 219.919438\nv 199.923966 148.404904 219.672638\nv 200.953871 148.316103 219.424759\nv 203.892879 148.053128 218.601613\nv 207.943641 147.845490 216.260071\nv 209.999404 147.935708 213.871852\nv 211.770917 147.591152 213.632686\nv 213.084044 147.517367 212.508789\nv 215.019795 147.305907 211.179397\nv 215.587161 147.811024 207.850953\nv 182.697832 151.088664 212.991519\nv 184.815414 150.953402 213.505366\nv 185.897515 151.161461 212.221125\nv 187.556627 151.253790 211.381567\nv 189.252201 151.185796 211.309768\nv 190.970656 151.104123 211.202945\nv 192.857477 151.110793 210.418668\nv 194.669430 151.055000 209.880446\nv 196.480588 150.998107 209.219866\nv 198.301279 150.955298 208.318320\nv 200.041846 150.745734 208.303355\nv 201.828382 150.538683 208.117063\nv 203.746211 150.552317 206.372759\nv 205.494059 150.260330 206.421334\nv 209.084495 150.182895 202.817091\nv 211.572418 150.036290 200.293505\nv 210.892683 150.423535 198.649680\nv 213.367547 149.646453 200.165126\nv 213.275396 149.915730 198.383374\nv 215.245623 149.224997 199.953636\nv 214.622748 149.613427 198.228545\nv 216.942187 149.510169 194.309489\nv 188.350417 135.850641 178.130778\nv 191.136232 135.748063 176.525340\nv 191.768826 135.582013 179.696797\nv 192.831322 135.633402 176.070131\nv 193.426857 135.477000 179.160302\nv 194.688865 135.478249 175.558747\nv 183.111449 136.085092 175.224120\nv 181.231067 135.449505 187.601657\nv 186.936308 125.875355 233.034751\nv 194.648691 126.400967 229.417822\nv 197.454419 126.428656 228.144452\nv 200.417509 126.271356 227.086970\nv 202.952838 125.160448 228.799908\nv 182.244844 127.252755 229.555091\nv 183.992817 127.265636 229.382955\nv 185.985959 127.324545 229.000454\nv 187.397954 126.940835 229.928561\nv 187.672983 127.377090 228.546136\nv 189.078486 127.132889 229.024724\nv 190.358504 127.307450 228.149046\nv 191.940599 127.175882 228.090883\nv 193.833600 127.007411 227.985820\nv 194.966612 127.387186 226.298347\nv 196.976196 127.003212 226.657078\nv 198.232958 127.085294 225.780729\nv 198.738820 127.976378 222.517295\nv 200.408809 127.989994 221.492019\nv 202.117573 127.525234 221.995240\nv 203.191251 127.714487 220.599724\nv 204.677974 127.385729 220.643491\nv 205.907696 127.429657 219.494870\nv 207.573165 127.425066 218.054693\nv 211.062246 127.029291 216.049575\nv 212.924957 127.050344 213.830065\nv 197.935478 135.105986 176.147274\nv 195.158605 135.483142 171.903816\nv 193.568885 135.626689 172.755799\nv 194.893934 135.367714 178.602830\nv 191.817266 135.761706 173.270428\nv 190.082005 135.868511 173.838530\nv 188.361652 135.947358 174.776561\nv 185.650035 135.811862 181.212126\nv 186.480572 135.949070 177.575266\nv 186.585206 135.997645 175.796050\nv 183.799088 136.125839 171.692962\nv 182.893311 135.964773 179.122188\nv 182.479417 135.834610 181.891890\nv 192.986626 135.627136 167.006675\nv 191.047567 135.761238 167.123490\nv 188.995006 135.894353 167.432552\nv 187.125062 136.005189 168.599580\nv 185.490747 136.069651 169.478977\nv 184.175990 136.116001 170.264973\nv 182.354928 136.133827 170.239559\nv 183.267757 133.072460 205.785393\nv 185.149444 132.961046 206.190422\nv 187.118146 132.996373 205.548288\nv 188.907493 133.017349 204.889355\nv 190.630549 133.013773 204.257545\nv 192.985736 133.297046 201.367346\nv 196.491493 133.136761 200.052977\nv 198.281224 133.096415 198.865530\nv 200.089589 133.004243 197.761405\nv 201.821831 132.870174 196.812067\nv 203.515933 132.710287 195.849679\nv 205.200071 132.528140 194.830054\nv 206.862879 132.333044 193.707083\nv 208.486817 132.123250 192.465224\nv 210.098071 131.895059 191.085189\nv 211.758741 131.802497 187.753945\nv 213.446492 131.432291 186.657572\nv 214.949380 131.082448 185.354164\nv 181.472381 134.633041 195.401331\nv 183.060039 134.721827 194.539567\nv 184.701500 134.741497 194.117517\nv 186.397679 134.730168 193.766077\nv 188.108139 134.699154 193.402317\nv 189.846918 134.634598 193.134421\nv 190.264734 134.995057 189.469640\nv 192.857270 134.929425 188.158210\nv 194.784921 134.821810 187.399764\nv 196.390093 134.696510 186.901994\nv 197.644185 134.573642 186.570585\nv 198.671076 134.556619 185.264341\nv 200.330144 134.377407 184.457715\nv 201.797643 134.222974 183.556592\nv 203.197853 134.056609 182.475588\nv 204.655113 133.858183 181.430352\nv 205.955958 133.647143 180.624399\nv 206.531351 133.613496 178.957959\nv 207.987741 133.342744 177.340765\nv 209.515944 133.014661 176.231931\nv 182.974233 133.884153 200.834999\nv 184.889948 133.925477 200.289409\nv 186.669058 133.926269 199.866943\nv 188.452345 133.908001 199.416032\nv 190.153774 133.878655 198.909860\nv 192.916983 134.228452 194.734713\nv 194.898258 134.149418 193.865956\nv 196.630965 134.056722 193.050132\nv 198.246882 133.954047 192.244273\nv 199.825318 133.840739 191.314601\nv 201.375293 133.711708 190.376092\nv 202.895722 133.557939 189.457780\nv 204.391038 133.384687 188.498553\nv 205.864052 133.193272 187.451516\nv 207.155993 133.006583 186.557926\nv 207.962598 132.962819 184.905712\nv 209.470982 132.732310 183.267573\nv 210.684821 132.529119 181.649967\nv 211.859810 132.291045 180.186683\nv 212.948279 132.031382 179.042016\nv 205.272381 133.974191 170.463896\nv 203.494734 134.251221 167.552169\nv 206.061400 133.671249 165.993114\nv 200.957034 134.732111 174.020372\nv 199.400067 134.974591 171.501747\nv 201.389051 134.669377 170.521088\nv 200.904948 134.672687 166.920614\nv 199.273985 134.937408 167.887425\nv 199.476145 134.932212 174.990392\nv 182.797319 135.373682 188.256520\nv 184.358585 135.375519 187.958086\nv 186.128489 135.367700 187.463779\nv 188.031857 135.485736 184.979278\nv 191.172063 135.431697 183.192239\nv 192.827266 135.349668 182.539520\nv 194.513715 135.250668 181.720609\nv 196.210490 135.125003 180.856957\nv 198.180705 134.931069 179.970132\nv 199.894725 134.772255 178.385192\nv 201.547085 134.575922 177.053806\nv 203.824686 134.239613 175.090535\nv 204.448326 134.148505 173.342035\nv 205.866112 133.874806 172.034374\nv 207.027664 133.605082 170.755523\nv 184.261704 130.559039 217.751691\nv 186.308435 130.481529 217.794310\nv 188.445358 130.534009 217.106617\nv 190.426548 130.540475 216.503422\nv 192.375544 130.526940 215.857561\nv 194.301061 130.494329 215.165885\nv 196.205757 130.471259 214.300821\nv 196.998512 131.009269 211.410307\nv 199.662332 130.962714 209.921707\nv 201.073730 130.975063 208.786112\nv 203.964124 129.557382 212.829574\nv 203.040422 130.781566 208.006794\nv 204.970087 130.561921 207.238581\nv 206.917781 130.288646 206.486260\nv 208.716999 130.044049 205.560616\nv 212.680184 129.674784 201.853625\nv 214.677833 129.462487 199.675689\nv 215.367598 129.519498 197.894167\nv 182.878443 129.110210 223.363817\nv 184.548950 129.090231 223.329546\nv 185.857539 129.274902 222.474394\nv 187.521059 129.047812 223.028383\nv 189.223485 129.024519 222.704177\nv 191.172536 128.961797 222.372851\nv 193.231003 128.902649 221.851876\nv 195.255537 128.908726 220.990989\nv 197.100636 128.900669 220.118678\nv 198.559199 128.881288 219.371132\nv 200.294738 128.555014 219.564338\nv 199.720637 129.520482 216.169763\nv 203.901607 129.164080 214.537881\nv 205.621574 129.073744 213.416505\nv 206.854158 129.179104 211.790795\nv 211.157023 128.702608 209.069288\nv 212.889724 128.310672 208.496236\nv 181.857536 132.177697 210.586876\nv 183.450339 131.834638 212.217701\nv 185.555310 131.817955 212.024025\nv 187.616502 131.818608 211.594442\nv 189.584762 131.831986 210.960821\nv 191.388157 131.836507 210.282591\nv 192.818005 131.847421 209.612496\nv 199.222834 132.117748 204.193779\nv 200.996239 131.831452 204.258411\nv 202.243198 131.852878 202.957592\nv 203.772730 131.631787 202.624695\nv 211.464688 131.013114 195.462460\nv 212.775638 130.792041 194.433678\nv 213.365542 130.845546 192.688898\nv 180.180333 129.622144 221.537097\nv 181.033315 135.604630 185.545811\nv 164.375692 134.841478 162.178683\nv 159.884352 123.874953 232.485604\nv 156.878227 125.916321 224.741043\nv 157.649794 127.478037 220.159953\nv 162.731545 126.229623 227.555049\nv 159.506875 127.674393 220.862452\nv 158.897665 128.612098 216.978440\nv 164.174781 126.202351 228.403887\nv 165.774472 126.631300 227.883070\nv 162.896642 129.687878 215.582333\nv 167.178403 126.559967 228.709963\nv 164.787510 129.659152 216.847840\nv 162.891075 130.146574 213.606610\nv 164.372413 131.610121 207.709003\nv 164.870088 130.398710 213.765316\nv 167.052984 128.795899 221.277632\nv 168.040767 127.343790 226.631293\nv 169.847553 127.413788 227.076647\nv 168.765875 126.509880 229.455299\nv 148.301176 124.838492 220.129670\nv 154.926951 127.484200 217.838223\nv 153.014814 125.775022 221.956446\nv 152.003093 123.938738 226.530861\nv 155.378540 125.721837 224.138984\nv 154.577755 124.204947 227.959821\nv 151.298927 127.129524 215.500203\nv 151.363043 125.680175 220.669001\nv 149.928671 123.852823 224.848751\nv 147.022730 124.634783 219.295548\nv 170.052616 135.714218 170.392079\nv 167.568373 132.184653 206.771551\nv 169.785032 133.756206 198.414165\nv 170.243365 135.731820 172.202068\nv 171.792537 135.842894 171.162086\nv 173.765931 135.843116 165.207950\nv 173.529796 135.944801 171.795251\nv 173.569457 127.386472 228.224892\nv 172.742802 128.217062 225.351481\nv 174.095892 130.506134 217.228706\nv 174.886324 131.844191 211.464858\nv 175.236843 132.959989 205.728725\nv 175.898404 133.939886 199.780926\nv 175.489965 127.497502 228.271060\nv 174.906390 128.963987 223.301902\nv 176.392828 129.132511 222.965616\nv 176.175786 130.457151 217.891684\nv 176.932382 131.805126 212.079018\nv 176.988265 132.923499 206.338861\nv 177.580761 133.916168 200.342268\nv 177.421406 134.692034 194.474719\nv 178.025050 126.739647 230.889929\nv 177.535279 127.714466 227.870224\nv 178.379026 129.797776 220.743686\nv 178.493227 130.350696 218.653668\nv 179.466143 131.092030 215.615673\nv 178.952985 131.776956 212.473850\nv 179.774056 132.336773 209.800352\nv 178.691138 132.895909 206.758828\nv 179.962678 133.332489 204.320246\nv 179.300212 133.897154 200.727697\nv 179.586558 134.692992 194.843759\nv 180.112314 135.014172 191.989668\nv 177.980053 135.343295 188.298588\nv 178.918478 135.606251 185.196126\nv 179.085259 135.824624 181.925567\nv 181.165249 135.996764 178.844420\nv 172.643252 129.776850 219.746133\nv 173.530278 131.206743 214.092810\nv 174.090712 132.447081 208.249404\nv 174.708955 133.494378 202.399471\nv 175.375729 134.334531 196.770913\nv 177.788151 135.955934 178.625210\nv 177.258961 136.051581 174.880569\nv 178.796674 136.097002 173.774427\nv 174.803694 135.988414 168.749259\nv 175.289672 136.021706 172.404433\nv 168.469483 133.331289 200.519659\nv 167.502622 132.793954 203.224025\nv 170.665494 129.740474 219.243008\nv 168.161205 130.461581 215.278758\nv 171.536096 131.215914 213.381791\nv 172.299306 132.452114 207.616303\nv 173.005678 133.503267 201.767979\nv 173.539598 134.347717 195.996403\nv 172.119532 134.634196 192.841785\nv 173.991794 134.979243 190.602939\nv 172.358617 135.261154 186.410064\nv 175.253068 135.539006 184.703038\nv 175.124924 135.735880 181.549104\nv 176.023396 135.934381 178.005517\nv 175.482748 136.006111 174.269425\nv 177.048048 136.071767 173.047599\nv 179.078507 135.979320 164.126454\nv 161.682218 134.685369 166.982758\nv 145.337311 129.408916 194.584402\nv 167.080225 135.448632 170.908208\nv 165.992392 131.669005 208.495561\nv 166.420854 130.437921 214.507138\nv 143.761597 134.387581 159.366821\nv 217.334783 136.109637 159.670514\nv 218.761597 134.387581 159.366821\nv 216.427271 134.563070 159.397765\nv 214.492166 134.762852 159.433009\nv 146.662498 134.136993 159.322666\nv 148.214344 134.476953 159.382617\nv 146.290403 132.127066 158.968253\nv 217.051863 143.652109 161.000435\nv 215.598115 146.914265 161.575639\nv 213.214839 145.384307 161.305896\nv 210.255874 136.958066 159.820092\nv 208.865511 138.059671 160.014343\nv 208.553519 136.277918 159.700179\nv 207.278018 137.468298 159.910067\nv 207.356559 149.013705 161.945859\nv 202.810251 138.046118 160.011926\nv 160.353721 150.358871 162.182991\nv 160.616254 148.539256 161.862142\nv 194.769130 139.042670 160.187658\nv 196.621082 138.130391 160.026834\nv 199.025457 150.305738 162.173658\nv 198.344666 138.248533 160.047640\nv 198.126047 139.666593 160.297662\nv 163.263107 137.810419 159.970404\nv 164.851420 138.873312 160.157840\nv 166.433453 140.123623 160.378292\nv 201.041882 140.614468 160.464798\nv 192.925024 141.591258 160.637036\nv 193.056714 139.808678 160.322722\nv 191.123374 142.188642 160.742371\nv 169.388747 142.464349 160.790990\nv 167.382361 150.970833 162.290921\nv 149.980271 134.889129 159.455275\nv 146.814281 143.453321 160.965384\nv 146.530644 145.136493 161.262167\nv 151.438216 136.323829 159.708248\nv 151.201422 138.249633 160.047819\nv 152.796525 137.482184 159.912524\nv 154.224210 136.460177 159.732329\nv 155.473840 137.237021 159.869313\nv 153.386560 149.094232 161.960037\nv 157.942091 138.941657 160.169874\nv 157.179591 149.956749 162.112120\nv 158.891811 149.157187 161.971146\nv 188.421308 151.534716 162.390337\nv 187.232950 148.175882 161.798096\nv 187.127892 150.048438 162.128273\nv 185.729100 150.448442 162.198805\nv 184.209510 150.002831 162.120232\nv 182.308835 149.469808 162.026235\nv 180.572660 150.765266 162.254662\nv 180.473166 148.866916 161.919931\nv 178.909911 149.918072 162.105271\nv 177.362715 148.949866 161.934557\nv 177.313186 150.818861 162.264107\nv 176.688186 140.217040 160.394740\nv 175.895731 151.527334 162.389034\nv 174.132537 138.682926 160.124242\nv 173.390086 141.727315 160.661050\nv 172.276444 138.627250 160.114407\nv 171.232532 142.099128 160.726609\nv 170.246133 138.723343 160.131344\nv 218.760549 124.391856 232.025983\nv 218.715401 123.286076 233.566372\nv 218.760773 126.230783 231.946674\nv 218.761597 123.454002 230.102925\nv 218.761597 135.946005 231.248517\nv 218.761597 132.862626 162.973664\nv 218.761597 133.004902 161.196694\nv 218.761597 146.541458 164.284208\nv 218.761597 142.841067 164.533891\nv 218.761597 133.511152 167.205610\nv 218.761597 147.230805 168.482916\nv 218.761597 145.845730 167.246506\nv 218.761597 133.288411 168.682277\nv 218.761597 136.391721 169.774759\nv 218.761597 135.170735 171.240306\nv 218.761597 135.855572 172.963296\nv 218.761597 125.676296 227.684178\nv 218.761597 127.275650 226.806578\nv 218.761597 134.865772 227.688934\nv 218.761597 137.872921 228.660738\nv 218.761597 139.033750 225.519017\nv 218.761597 135.154280 177.532917\nv 218.761597 143.951659 178.552633\nv 218.761597 145.810428 178.867431\nv 218.761597 135.187872 180.544646\nv 218.761597 143.998279 183.247833\nv 218.761597 145.774548 183.293026\nv 218.761597 144.694908 184.745870\nv 218.761597 146.396155 184.818092\nv 218.761597 145.328759 186.162032\nv 218.761597 135.177575 185.560804\nv 218.761597 132.486450 186.951521\nv 218.761597 146.044253 187.751823\nv 218.761597 133.887647 190.527749\nv 218.761597 142.441075 189.994682\nv 218.761597 144.163319 190.917073\nv 218.761597 145.711993 193.907615\nv 218.761597 135.403125 193.038445\nv 218.761597 131.934587 192.791684\nv 218.761597 145.465175 195.674050\nv 218.761597 142.698970 197.348454\nv 218.761597 128.758299 221.656324\nv 218.761597 128.230071 219.948688\nv 218.761597 130.033664 220.282819\nv 218.761597 127.657143 218.105430\nv 218.761597 139.183227 220.143926\nv 218.761597 128.628157 216.944048\nv 218.761597 140.490589 214.035772\nv 218.761597 130.442897 213.406046\nv 218.761597 128.748335 213.999622\nv 218.761597 128.715514 215.587253\nv 218.761597 144.874831 197.455616\nv 218.761597 144.179226 199.132755\nv 218.761597 141.985094 201.030344\nv 218.761597 143.522693 202.631036\nv 218.761597 134.628725 201.735426\nv 218.761597 133.902431 203.159445\nv 218.761597 131.566409 203.392894\nv 218.761597 142.369590 208.935167\nv 218.761597 132.075406 206.928919\nv 218.761597 141.683681 210.215724\nv 218.761597 130.263157 209.945549\nv 218.761597 136.739762 210.578649\nv 218.761597 132.376583 210.609052\nv 218.761597 129.043228 211.009912\nv 218.761597 143.733691 213.878421\nv 143.813851 123.288826 233.566876\nv 215.543408 122.404718 233.410952\nv 145.474126 124.069754 233.704560\nv 146.956443 124.698680 233.815440\nv 148.356356 124.217633 233.730640\nv 214.395858 125.402459 233.939533\nv 214.857321 123.873025 233.669868\nv 148.029289 126.324490 234.102139\nv 150.013380 123.650916 233.630707\nv 149.903041 127.215813 234.259286\nv 151.396326 124.588352 233.796006\nv 152.717697 125.754554 234.001574\nv 208.652757 126.911954 234.205705\nv 211.835724 131.053438 234.935938\nv 211.516141 124.085130 233.707271\nv 211.801183 127.324846 234.278512\nv 213.223636 126.285497 234.095259\nv 213.082544 124.284027 233.742347\nv 212.413074 135.878741 235.786760\nv 155.925205 136.422367 235.882653\nv 155.043369 134.476234 235.539496\nv 152.780553 137.796848 236.124982\nv 151.832178 135.894597 235.789589\nv 210.618702 136.452200 235.887866\nv 207.160884 129.146314 234.599669\nv 205.733029 126.151826 234.071650\nv 202.016264 129.131395 234.597042\nv 156.162318 129.078377 234.587712\nv 156.835415 138.498966 236.248801\nv 158.436034 138.045588 236.168826\nv 159.760741 138.806014 236.302918\nv 163.398113 140.106196 236.532154\nv 165.768795 138.444415 236.239168\nv 166.936279 139.706578 236.461732\nv 168.919350 130.606219 234.857092\nv 168.118926 128.457195 234.478141\nv 168.488457 134.492353 235.542327\nv 171.214703 138.518396 236.252222\nv 173.115209 127.225582 234.260979\nv 176.628031 138.573351 236.261866\nv 180.674647 130.350274 234.811983\nv 188.474141 139.144759 236.362632\nv 187.171987 130.395507 234.819908\nv 187.417502 140.479146 236.597921\nv 186.836969 138.665111 236.278059\nv 185.521627 139.937843 236.502529\nv 184.170652 141.322963 236.746757\nv 183.339574 137.678462 236.104132\nv 182.322466 141.174021 236.720499\nv 181.417905 131.677352 235.045988\nv 181.062854 135.272247 235.679863\nv 179.973641 139.001335 236.337394\nv 201.136538 138.257502 236.206208\nv 200.239904 139.831724 236.483792\nv 197.115730 128.447952 234.476542\nv 197.294037 130.297194 234.802616\nv 196.552208 140.248653 236.557311\nv 194.235804 131.177102 234.957723\nv 193.395746 129.632012 234.685283\nv 192.656451 131.224562 234.966096\nv 192.304628 128.048847 234.406125\nv 191.304290 129.632324 234.685357\nv 143.764980 125.188386 231.878985\nv 143.761708 123.381033 231.068565\nv 143.761597 131.101063 161.865250\nv 143.761597 132.506287 160.581493\nv 143.761597 132.814844 162.166153\nv 143.761597 135.369872 164.126594\nv 143.761597 134.223216 165.359193\nv 143.761597 146.615654 164.203492\nv 143.761597 133.378422 167.953974\nv 143.761597 145.650306 167.284134\nv 143.761597 125.960427 228.565786\nv 143.761597 134.514862 232.586030\nv 143.761597 127.485662 227.224412\nv 143.761597 136.113833 229.712988\nv 143.761597 135.344849 227.902718\nv 143.761597 138.569563 226.934063\nv 143.761597 143.639476 177.834338\nv 143.761597 135.372987 177.787782\nv 143.761597 146.005899 175.892992\nv 143.761597 135.657076 174.541589\nv 143.761597 135.908778 172.430787\nv 143.761597 133.771692 171.482325\nv 143.761597 135.569347 170.469143\nv 143.761597 146.727344 179.541175\nv 143.761597 145.456425 181.389759\nv 143.761597 144.323855 183.092302\nv 143.761597 146.047761 183.132000\nv 143.761597 143.633775 184.838163\nv 143.761597 145.052693 185.944068\nv 143.761597 143.262298 186.816957\nv 143.761597 143.785679 188.469083\nv 143.761597 145.873263 192.510716\nv 143.761597 145.507035 194.691469\nv 143.761597 141.848514 193.404169\nv 143.761597 132.005117 194.062511\nv 143.761597 142.990700 196.297237\nv 143.761597 146.054624 196.649281\nv 143.761597 139.278105 228.900997\nv 143.761597 136.584948 224.165616\nv 143.761597 127.718138 220.138370\nv 143.761597 127.113352 218.194795\nv 143.761597 132.720383 221.773591\nv 143.761597 128.936351 218.632410\nv 143.761597 138.700583 219.380296\nv 143.761597 128.520256 216.659401\nv 143.761597 130.055444 215.460444\nv 143.761597 130.261156 213.612988\nv 143.761597 137.665980 200.733992\nv 143.761597 141.947384 198.934582\nv 143.761597 145.032806 198.256573\nv 143.761597 140.627563 214.887511\nv 143.761597 129.293083 210.315275\nv 143.761597 131.806937 208.707548\nv 143.761597 131.155020 200.353173\nv 143.761597 135.303144 201.869106\nv 143.761597 131.941746 201.664758\nv 143.761597 132.668663 203.442372\nv 143.761597 143.607126 207.191919\nv 143.761597 136.237295 206.499089\nv 143.761597 141.847458 207.692105\nv 158.303246 153.297602 164.462198\nv 161.446411 153.840216 165.934475\nv 173.158113 154.909872 166.606550\nv 178.684307 154.999687 164.640173\nv 180.635972 155.115710 167.797134\nv 175.898536 145.680355 233.984238\nv 149.599604 141.647204 233.646717\nv 146.586233 141.295182 232.096204\nv 148.050380 143.246968 227.526660\nv 159.507563 144.527125 231.863539\nv 161.273743 144.437635 233.059986\nv 175.920166 146.202502 232.257303\nv 174.371791 145.876253 233.099402\nv 172.788276 146.116400 231.979015\nv 170.980694 145.691775 232.937653\nv 169.431406 145.956472 231.622679\nv 167.787245 145.755513 231.742646\nv 165.449940 145.541888 231.557045\nv 163.326201 145.275243 231.488216\nv 161.908014 145.510533 230.021062\nv 160.164973 145.571347 228.874064\nv 158.579503 145.394471 228.529483\nv 156.325079 144.918897 228.689883\nv 156.254817 145.392100 227.014180\nv 154.275586 145.669238 224.589274\nv 152.957228 145.892088 222.732947\nv 149.819880 145.359536 221.882444\nv 148.252265 145.805370 218.635788\nv 178.378353 147.580018 227.829872\nv 176.984575 147.561404 227.757254\nv 175.529595 147.526288 227.680280\nv 174.027955 147.468937 227.616159\nv 170.668845 147.601715 226.282215\nv 168.785664 147.531322 225.925391\nv 166.873226 147.459395 225.465139\nv 164.735802 147.383130 224.812767\nv 162.630678 147.279959 224.142421\nv 160.187782 147.387194 222.298291\nv 158.143282 146.777677 223.342515\nv 156.390310 146.661495 222.553194\nv 156.276322 146.253355 224.006507\nv 154.860005 146.736854 221.060873\nv 153.153090 146.407386 220.950282\nv 151.559746 146.133519 220.632999\nv 149.890565 146.256271 218.498978\nv 148.193674 146.182664 216.997662\nv 146.702780 145.835226 216.771454\nv 147.822613 146.816193 213.853943\nv 165.946086 154.283302 179.149071\nv 168.082444 154.451598 179.638684\nv 169.824511 154.466050 182.258659\nv 172.065611 154.565594 182.971314\nv 173.737245 154.561513 184.638432\nv 175.629706 154.868824 180.047562\nv 178.222039 154.850022 181.700317\nv 177.480440 154.925976 179.990860\nv 176.899325 154.672925 184.479489\nv 165.554326 154.384987 173.784297\nv 168.184015 154.600260 175.156067\nv 169.866743 154.719453 175.311102\nv 171.737157 154.803596 176.870747\nv 173.609808 154.877081 177.694997\nv 175.089027 154.911348 178.620621\nv 176.758522 154.965079 178.467846\nv 178.711620 155.001050 178.465333\nv 178.679001 155.112734 169.140169\nv 176.790358 155.073077 169.009050\nv 174.917916 155.003632 167.455768\nv 169.594376 154.677435 166.392617\nv 178.827308 152.175192 206.797758\nv 177.000459 152.142504 206.748592\nv 175.223897 152.087597 206.718865\nv 173.502126 152.082776 206.264383\nv 171.735241 152.130808 205.316010\nv 170.141233 152.022586 205.328599\nv 168.446963 152.035444 204.380221\nv 166.832040 151.971624 203.855029\nv 163.168712 152.242123 199.270195\nv 152.512601 151.342083 192.597268\nv 150.727510 151.055649 191.671838\nv 148.934427 150.710816 190.984231\nv 147.058699 150.394666 189.460218\nv 179.582555 154.065233 192.476813\nv 178.240786 153.657879 196.135339\nv 176.575275 153.669199 195.657133\nv 174.946422 153.658057 195.257645\nv 173.327214 153.664196 194.537251\nv 171.889833 153.575057 194.672114\nv 170.285939 153.601502 193.431912\nv 168.336115 153.479156 193.220726\nv 166.719085 153.575873 190.809437\nv 162.278573 153.432254 186.991146\nv 160.786246 153.323695 185.874303\nv 159.292918 153.120571 185.729550\nv 156.147892 152.790449 183.157718\nv 154.419329 152.585102 181.262928\nv 152.793842 152.258531 181.316479\nv 151.395911 152.045006 179.582313\nv 150.181029 151.838509 177.774648\nv 148.365925 151.420354 177.287313\nv 146.981596 151.103622 175.544018\nv 179.545346 153.108483 200.609944\nv 177.624185 152.986855 201.283593\nv 175.701850 152.976975 200.938241\nv 174.119383 152.959752 200.588750\nv 172.522655 152.942030 200.113420\nv 170.908966 152.945584 199.329961\nv 169.385516 152.841876 199.308273\nv 167.828910 152.852449 198.226159\nv 166.343886 152.795256 197.598479\nv 164.696739 152.983395 194.629506\nv 158.947634 152.599171 191.313137\nv 156.981664 152.424140 189.916639\nv 155.647838 152.236011 189.450144\nv 154.726814 152.205042 187.957145\nv 152.815450 151.938007 186.662953\nv 151.546212 151.754865 185.600003\nv 150.244536 151.570917 184.102096\nv 148.899955 151.275204 183.792387\nv 154.331705 152.776018 171.316255\nv 156.326116 153.137510 173.777816\nv 157.870372 153.375169 175.383977\nv 159.404469 153.609987 174.993928\nv 162.188076 153.927647 177.499068\nv 163.417834 154.129166 167.692653\nv 161.636497 153.921446 169.098169\nv 163.547925 154.164778 169.282131\nv 177.513558 154.262713 190.061805\nv 175.925410 154.209927 190.157996\nv 174.233318 154.227755 189.196881\nv 172.693094 154.194915 188.711603\nv 171.149035 154.163498 187.997705\nv 169.616443 154.122891 187.188802\nv 169.470965 154.240556 185.453006\nv 165.970982 154.087755 183.242966\nv 164.195672 153.953554 182.449769\nv 162.528763 153.849422 180.746163\nv 160.805234 153.623449 180.778720\nv 159.239762 153.517311 178.186538\nv 157.789397 153.324894 177.183539\nv 156.246884 153.106483 175.652520\nv 153.457488 152.597138 174.459165\nv 150.783388 152.036904 174.006336\nv 150.824468 152.048334 172.129037\nv 150.717124 152.013770 170.202011\nv 178.616781 150.108705 217.615731\nv 176.353545 150.191162 216.938704\nv 174.474008 150.166658 216.686255\nv 172.764158 150.115800 216.485058\nv 171.712240 150.075555 216.353291\nv 168.524911 149.918563 215.935387\nv 166.256188 149.919951 214.861440\nv 164.343125 149.705715 214.872134\nv 162.435407 149.762904 213.405067\nv 160.628897 149.558772 213.182153\nv 158.849851 149.671350 211.224900\nv 156.809042 149.697085 209.284455\nv 154.047327 148.928372 210.625201\nv 152.965860 149.082518 208.658514\nv 151.487299 148.652421 209.319152\nv 179.238783 148.965966 222.592588\nv 177.768134 148.744445 223.383877\nv 175.879828 148.743545 223.126858\nv 173.922943 148.711575 222.876097\nv 171.975097 148.647868 222.646904\nv 169.932979 148.761302 221.542642\nv 168.154253 148.547182 221.794360\nv 166.421406 148.732102 220.251383\nv 164.333266 148.657285 219.542130\nv 160.416371 148.515330 217.821177\nv 158.551636 148.076767 218.446629\nv 156.809225 148.015733 217.383449\nv 155.024187 147.850132 216.637831\nv 153.138102 147.707125 215.560221\nv 151.151910 147.670809 213.680650\nv 148.617088 147.370400 212.234413\nv 147.339612 147.306490 210.949647\nv 147.358560 147.889414 208.025255\nv 146.022292 147.897162 206.087876\nv 179.210979 151.384365 211.329257\nv 175.798381 151.220718 211.754508\nv 169.072396 151.040241 210.539093\nv 167.381429 150.973253 210.088434\nv 165.542873 150.996212 208.919110\nv 163.708378 150.999349 207.709847\nv 161.951626 150.800414 207.586571\nv 160.132205 150.669222 206.883645\nv 158.398811 150.592523 205.767720\nv 150.899458 150.154070 199.400115\nv 149.210208 149.959270 198.007714\nv 148.004250 149.805910 196.965777\nv 217.179121 147.716841 206.015306\nv 182.408679 155.101882 167.339915\nv 185.780331 155.008223 165.920798\nv 205.670127 153.048671 164.286552\nv 217.065503 143.098988 225.492233\nv 215.250350 143.062975 227.396363\nv 214.427514 143.933124 225.339933\nv 211.870806 143.881770 227.769495\nv 212.321850 143.231452 229.468511\nv 207.015097 144.226139 230.336798\nv 205.510918 144.562364 230.274754\nv 205.457159 144.304422 231.116507\nv 199.056515 144.735714 233.208693\nv 197.276484 145.090238 232.893113\nv 183.074791 146.663847 231.090098\nv 183.289951 147.137545 229.496074\nv 187.726387 146.496909 231.099043\nv 189.265429 146.422825 231.062272\nv 191.177157 146.649627 229.856193\nv 193.126355 146.424763 230.040321\nv 195.359027 146.586726 228.730899\nv 197.353726 146.780649 227.249144\nv 199.111641 146.542257 227.266882\nv 200.970241 146.595508 226.112987\nv 203.878426 146.265509 225.562533\nv 206.258966 146.116398 224.473301\nv 215.504422 145.367121 219.030838\nv 182.723346 148.383874 224.942092\nv 184.366530 148.365582 224.900357\nv 185.921404 147.934393 226.332043\nv 188.039349 148.102404 225.363161\nv 189.554417 148.080193 225.117156\nv 191.405313 148.037867 224.784738\nv 193.500204 147.978774 224.332569\nv 195.552661 147.855218 224.014812\nv 197.304931 147.981320 222.766875\nv 198.959794 148.094175 221.512441\nv 206.151044 147.464252 219.354378\nv 207.769676 147.449043 218.116829\nv 209.580990 147.485875 216.344290\nv 211.209886 147.123471 216.313634\nv 212.805213 146.762266 216.190838\nv 217.213660 145.529450 216.422574\nv 197.203963 154.179395 180.325389\nv 192.820364 154.478675 181.800115\nv 191.943603 154.468238 183.245847\nv 190.370869 154.564174 183.087903\nv 186.458535 154.801611 181.654270\nv 186.504774 154.719309 183.192622\nv 184.657355 154.926045 180.073248\nv 195.039158 154.579638 170.476191\nv 193.189014 154.728918 172.254280\nv 191.244989 154.852538 173.008636\nv 189.278190 154.929600 174.732646\nv 187.259643 155.004918 174.991278\nv 185.293496 155.061510 175.080584\nv 191.648154 154.789233 167.432242\nv 190.251902 154.888981 168.572471\nv 187.676341 155.003311 168.142808\nv 185.729206 155.076351 169.737958\nv 183.997157 155.110965 169.578623\nv 182.388613 152.772760 203.120330\nv 185.489846 152.434003 204.897138\nv 187.601342 152.562774 203.611956\nv 189.328915 152.564660 203.066532\nv 190.914583 152.549287 202.552913\nv 192.495440 152.489542 202.221138\nv 194.168955 152.439272 201.658604\nv 195.857830 152.407509 200.819370\nv 197.488794 152.232837 200.853584\nv 198.883350 152.261160 199.555973\nv 200.925238 152.039110 199.274537\nv 184.515697 153.995189 192.918009\nv 185.922790 154.006958 192.478072\nv 187.601668 153.992820 192.063108\nv 189.344159 153.983720 191.382593\nv 191.130309 153.945467 190.745284\nv 192.840909 153.911690 189.860540\nv 194.306387 153.789708 189.971111\nv 195.775580 153.651873 190.044124\nv 197.247052 153.502822 190.084556\nv 199.243577 153.284554 190.081379\nv 183.273860 153.474655 197.799396\nv 182.733396 153.019623 201.304790\nv 186.601721 153.312664 198.428767\nv 188.310542 153.335304 197.731001\nv 189.957723 153.327973 197.134788\nv 191.556843 153.303760 196.545287\nv 193.087595 153.237993 196.190476\nv 194.794125 153.258691 194.825835\nv 196.417995 153.094977 194.947701\nv 202.947306 152.316630 194.792636\nv 211.724798 151.946114 167.028924\nv 205.822375 153.199354 173.977836\nv 201.388420 153.806890 176.897440\nv 200.720472 153.917255 167.588509\nv 198.750878 154.189941 169.010777\nv 196.809356 154.411370 170.533138\nv 193.248640 154.656791 166.496855\nv 183.724674 154.588114 186.309908\nv 185.579045 154.551783 186.263677\nv 186.569589 154.525843 186.215598\nv 189.026192 154.466105 185.727376\nv 191.915107 154.243121 186.496736\nv 192.960372 154.286138 184.903537\nv 194.809734 154.127120 185.062085\nv 196.853756 153.818544 186.879616\nv 182.697770 150.403644 216.301052\nv 186.479600 150.592338 214.988153\nv 188.300920 150.479471 215.142620\nv 190.387398 150.615047 213.923500\nv 192.324960 150.585611 213.392605\nv 194.213883 150.536688 212.847635\nv 196.172428 150.570157 211.714043\nv 197.910686 150.330827 211.942583\nv 199.835639 150.422498 210.244940\nv 201.693896 150.289708 209.618757\nv 203.594385 150.264753 208.179941\nv 205.373065 149.960130 208.235636\nv 207.260382 149.937143 206.482983\nv 209.061960 149.619148 206.267462\nv 211.815189 149.402199 204.113192\nv 182.668257 149.205843 221.640881\nv 184.790579 149.376006 220.752804\nv 186.999285 149.443209 220.155532\nv 189.048845 149.469506 219.612163\nv 191.048870 149.435015 219.206122\nv 193.117082 149.396783 218.663315\nv 194.504075 149.361512 218.262358\nv 196.913039 149.279364 217.520881\nv 199.039635 149.249248 216.503788\nv 200.929407 149.034192 216.307730\nv 202.838199 148.962966 215.329126\nv 204.746992 148.760969 214.802836\nv 206.720842 148.550971 214.115112\nv 208.261971 148.391642 213.452706\nv 210.998235 148.416867 210.522875\nv 212.775457 148.237689 209.349642\nv 182.769004 151.674710 209.777943\nv 184.185404 151.622131 209.949109\nv 186.157000 151.659046 209.464668\nv 187.976252 151.661298 209.053733\nv 189.755208 151.628206 208.722546\nv 191.585465 151.633373 208.037601\nv 193.253645 151.485149 208.147301\nv 195.114466 151.527728 206.976657\nv 196.950245 151.509565 205.996512\nv 198.688773 151.417884 205.365783\nv 200.419668 151.309081 204.705119\nv 202.212428 151.107379 204.415615\nv 204.086705 151.012821 203.229790\nv 205.907702 150.842096 202.375152\nv 210.931566 149.878367 202.331874\nv 206.059550 122.641522 233.452726\nv 203.851456 125.903675 226.038591\nv 183.031112 135.987968 164.189235\nv 211.331821 132.537147 176.802601\nv 212.767984 132.166476 175.338881\nv 149.818916 132.179272 175.746700\nv 151.939294 132.790993 173.052435\nv 149.372444 131.735243 164.174933\nv 143.761597 147.247517 161.634392\nv 218.761597 147.247517 161.634392\nv 146.058022 146.788804 161.553508\nv 145.357730 142.733149 160.838397\nv 213.438159 136.397604 159.721244\nv 211.235855 148.812474 161.910331\nv 208.965071 144.689318 161.183317\nv 204.529739 137.337158 159.886947\nv 205.940641 136.905800 159.810895\nv 205.212858 135.344073 159.535530\nv 194.666906 141.007649 160.534135\nv 195.963804 151.186652 162.328941\nv 197.383237 152.466436 162.554642\nv 200.322872 152.583441 162.575251\nv 161.450391 151.983518 162.469485\nv 162.910959 152.169491 162.502314\nv 164.168072 150.754443 162.252792\nv 201.183206 138.775430 160.140538\nv 204.250099 141.291210 160.584134\nv 168.540542 136.366109 159.715731\nv 150.743752 133.133979 159.145780\nv 147.854297 149.193844 161.977589\nv 155.781190 135.238710 159.516958\nv 155.316348 142.930977 160.873300\nv 157.322264 148.260848 161.813085\nv 161.595974 138.420674 160.077983\nv 190.154231 151.456133 162.376467\nv 186.462875 139.326935 160.237770\nv 182.080116 139.119629 160.201240\nv 182.961489 137.443951 159.905777\nv 176.628303 137.193112 159.861542\nv 177.656877 138.497970 160.091594\nv 172.928697 152.784554 162.610730\nv 218.761597 130.958231 233.002216\nv 218.761597 131.027262 234.931364\nv 218.761597 143.240464 162.769435\nv 218.761597 141.148646 162.022706\nv 218.761597 142.103543 160.727364\nv 218.761597 147.766524 166.660638\nv 218.761597 138.455577 167.210326\nv 218.761597 148.625681 169.625778\nv 218.761597 148.522416 171.282576\nv 218.761597 146.715928 171.866610\nv 218.761597 137.333039 230.181023\nv 218.761597 127.949522 223.110983\nv 218.761597 148.297309 174.965354\nv 218.761597 143.246590 176.840782\nv 218.761597 140.150955 178.207856\nv 218.761597 133.411931 179.799405\nv 218.761597 133.252195 182.765242\nv 218.761597 134.197309 183.929450\nv 218.761550 131.682302 185.328655\nv 218.761597 136.080424 187.258399\nv 218.761597 131.236545 188.122654\nv 218.761597 134.254297 191.935700\nv 218.761597 133.653560 193.085480\nv 218.761597 139.177381 218.540124\nv 218.761597 130.574588 211.735078\nv 218.761597 128.839919 212.413835\nv 218.761597 142.191470 216.105661\nv 218.761597 125.956992 215.579733\nv 218.761597 133.860262 196.313669\nv 218.761597 133.284173 198.140873\nv 218.761597 142.292174 199.297153\nv 218.761597 129.610819 200.212719\nv 218.761597 145.970623 204.758971\nv 218.761597 144.325664 204.413340\nv 218.761597 140.308801 210.712022\nv 218.761597 140.326680 212.340612\nv 145.189132 131.837360 235.074189\nv 143.761597 136.201887 235.843790\nv 213.914250 122.107445 233.358536\nv 145.845118 138.222919 236.200143\nv 210.166335 126.349673 234.106545\nv 215.154574 138.698016 236.283860\nv 214.055770 135.123007 235.653526\nv 217.268989 133.659402 235.395472\nv 156.432025 125.663265 233.985524\nv 154.623011 125.327879 233.926377\nv 210.175115 138.212743 236.198313\nv 209.767301 139.915103 236.498468\nv 206.872739 132.559609 235.201525\nv 159.523075 125.109766 233.887916\nv 163.809377 126.018610 234.048155\nv 162.196504 130.523040 234.842399\nv 162.732000 138.290999 236.212096\nv 164.369154 142.025292 236.870552\nv 170.013288 128.682561 234.517874\nv 171.776508 128.799667 234.538533\nv 174.803228 127.857784 234.372473\nv 177.227971 140.164478 236.542449\nv 180.243231 141.045309 236.697802\nv 188.515557 130.063694 234.761424\nv 184.823646 143.057274 237.052565\nv 182.252319 127.139478 234.245840\nv 199.975050 127.065343 234.232714\nv 199.050040 132.723777 235.230464\nv 197.551788 141.872902 236.843717\nv 194.982776 126.402395 234.115825\nv 192.535023 142.411814 236.938718\nv 189.935308 139.473154 236.420537\nv 143.761597 135.343166 234.380595\nv 143.761597 131.878025 233.677562\nv 143.761597 145.957696 162.898553\nv 143.761597 142.616870 162.556687\nv 143.761597 142.103543 160.727364\nv 143.761597 142.145797 168.243606\nv 143.761597 132.672358 229.465233\nv 143.761597 148.508376 169.927979\nv 143.761597 146.568550 170.708738\nv 143.761597 141.880477 177.939210\nv 143.761597 131.788065 179.460987\nv 143.761597 133.536099 178.843574\nv 143.761597 133.679479 183.152450\nv 143.761597 135.082874 184.799830\nv 143.761597 132.666610 189.647836\nv 143.761597 134.560013 189.688435\nv 143.761597 144.575397 191.130701\nv 143.761597 134.468335 192.853044\nv 143.761597 130.573194 194.701635\nv 143.761597 127.555147 223.630616\nv 143.761597 123.891793 223.338709\nv 143.761597 124.642681 221.665109\nv 143.761597 136.745391 222.200666\nv 143.761597 138.435992 221.381204\nv 143.761597 130.293730 217.285440\nv 143.761597 143.505442 216.586086\nv 143.761597 142.054733 215.983759\nv 143.761597 142.917030 200.408245\nv 143.761597 131.910186 198.815982\nv 143.761597 140.196395 211.623423\nv 143.761597 144.475831 211.806679\nv 143.761597 143.051103 210.743259\nv 143.761597 144.362118 203.269684\nv 143.761597 145.372672 206.686887\nv 143.761597 142.180729 205.846487\nv 143.761597 132.662970 205.346515\nv 181.265695 145.605196 234.576088\nv 161.404028 143.578856 235.745777\nv 151.102788 144.070273 227.531083\nv 207.244440 142.412933 235.579118\nv 191.632205 145.068174 234.823330\nv 200.740258 126.965707 224.759290\nv 195.488389 132.578950 204.230730\nv 210.530603 132.795290 173.711569\nv 212.798442 132.116248 169.713275\nv 213.310381 131.982029 177.293302\nv 209.382726 129.083899 209.535778\nv 210.458340 129.816676 204.470285\nv 207.065612 131.274650 200.785890\nv 151.011028 127.491001 213.800743\nv 168.934161 135.600707 174.855301\nv 170.444132 135.738475 174.002483\nv 146.699192 130.964441 183.099343\nv 164.351716 135.106205 168.790612\nv 170.262756 126.953169 228.643438\nv 145.139801 133.417912 159.195884\nv 144.996024 131.436183 158.846447\nv 143.761597 136.959568 159.820335\nv 218.761597 136.959568 159.820335\nv 217.055549 137.944042 159.993924\nv 214.917533 132.716283 159.072168\nv 147.735166 132.552010 159.043193\nv 145.345604 135.516426 159.565908\nv 213.183879 133.200424 159.157507\nv 215.108863 148.688784 161.888555\nv 212.143271 143.960193 161.054753\nv 210.491434 144.277909 161.110774\nv 210.584309 138.912556 160.164724\nv 207.058610 141.600409 160.638679\nv 208.596036 146.868920 161.567639\nv 206.480467 150.997623 162.295640\nv 195.558224 146.907834 161.574478\nv 196.422636 140.233649 160.397683\nv 194.608092 136.960570 159.820535\nv 198.276802 148.963693 161.937026\nv 197.903913 136.796439 159.791583\nv 201.658170 149.561066 162.042355\nv 161.977313 137.067597 159.839397\nv 164.601911 140.816083 160.500404\nv 163.285155 136.106946 159.670038\nv 164.151360 146.638374 161.527032\nv 166.717158 138.290876 160.055130\nv 165.178212 136.734068 159.780633\nv 202.502472 142.297312 160.761520\nv 201.211757 137.023302 159.831579\nv 203.394813 150.199676 162.154939\nv 192.688878 136.893544 159.808701\nv 191.963182 138.517496 160.095053\nv 192.619344 149.952844 162.111420\nv 194.374957 152.122248 162.493931\nv 191.042903 137.030276 159.832812\nv 169.200585 148.807039 161.909388\nv 169.741136 140.752068 160.489065\nv 168.950273 143.837346 161.033089\nv 169.169393 146.993988 161.589695\nv 168.492587 137.806740 159.969769\nv 149.834079 138.908054 160.163916\nv 152.856412 135.869233 159.628107\nv 150.226529 144.055246 161.071535\nv 152.590635 139.431127 160.256180\nv 153.753383 134.535307 159.392908\nv 156.900705 137.164581 159.856541\nv 157.767662 135.345931 159.535863\nv 154.191108 150.826793 162.265511\nv 155.803134 151.154060 162.323228\nv 155.362062 149.203215 161.979215\nv 159.552538 135.532191 159.568672\nv 160.461129 137.128815 159.850213\nv 159.804641 138.712915 160.129535\nv 160.725346 144.681872 161.181983\nv 159.150612 145.599292 161.343790\nv 158.731848 150.876267 162.274261\nv 191.370455 140.261343 160.402549\nv 188.933856 149.524791 162.035937\nv 190.036014 143.796108 161.025821\nv 189.905651 146.659893 161.530780\nv 189.556607 153.141003 162.673566\nv 188.589278 143.667324 161.003110\nv 187.444283 142.617879 160.818065\nv 185.760729 148.977673 161.939467\nv 187.959532 153.260081 162.694570\nv 186.541782 153.581240 162.751203\nv 186.543571 151.902616 162.455216\nv 183.382915 143.753239 161.018263\nv 184.038171 141.945229 160.699466\nv 184.500385 151.651960 162.411021\nv 183.032295 153.175721 162.679693\nv 182.471049 151.338396 162.355713\nv 181.621006 144.207410 161.098348\nv 180.234242 147.045989 161.598853\nv 180.701051 152.918841 162.634392\nv 180.330054 143.018338 160.888676\nv 178.886353 151.752931 162.428803\nv 175.785440 149.884922 162.099432\nv 175.918790 146.112253 161.434218\nv 174.141498 147.327686 161.648525\nv 174.146873 149.263216 161.989838\nv 173.455241 137.116070 159.847946\nv 173.227114 139.948025 160.347287\nv 171.628887 140.319622 160.412846\nv 171.032950 153.266898 162.695782\nv 170.674431 143.986138 161.059325\nv 218.761584 125.166561 230.741982\nv 218.761597 121.985351 228.372437\nv 218.761597 134.510517 232.525281\nv 218.761597 125.245852 229.294422\nv 218.761597 134.166329 230.568752\nv 218.761597 132.343845 229.906563\nv 218.761597 138.088999 232.048485\nv 218.761597 136.243770 233.221143\nv 218.761597 135.253643 161.177327\nv 218.761597 137.361634 164.265717\nv 218.761597 148.082451 164.952401\nv 218.761597 133.557319 164.282077\nv 218.761597 144.846351 164.343799\nv 218.761597 135.138559 167.054510\nv 218.761597 132.070960 165.845865\nv 218.761597 144.365758 165.900386\nv 218.761597 134.920944 168.424018\nv 218.761597 141.225909 169.707528\nv 218.761597 138.731160 171.703877\nv 218.761597 133.182677 170.455153\nv 218.761597 131.460987 170.310382\nv 218.761597 134.663039 169.771926\nv 218.761597 143.959091 170.874051\nv 218.761597 142.607179 170.503080\nv 218.761597 141.917441 173.482407\nv 218.761597 138.434021 174.893696\nv 218.761597 133.268338 174.416047\nv 218.761597 127.006076 228.629660\nv 218.761597 122.731847 226.377387\nv 218.761597 127.514065 224.898989\nv 218.761597 133.631750 228.652528\nv 218.761597 136.546750 227.384058\nv 218.761597 135.760996 229.168951\nv 218.761597 139.734394 228.627509\nv 218.761597 135.191207 224.407937\nv 218.761597 142.626194 175.180130\nv 218.761597 134.884040 174.436791\nv 218.761597 146.461349 175.991009\nv 218.761597 148.318222 176.971944\nv 218.761597 146.704417 177.630415\nv 218.761597 136.872220 177.307887\nv 218.761597 138.126341 178.513726\nv 218.761597 148.039755 178.976269\nv 218.761597 137.260925 180.238745\nv 218.761597 142.858160 180.023571\nv 218.761597 141.814886 181.597244\nv 218.761597 143.459551 181.683971\nv 218.761597 142.418421 183.193756\nv 218.761597 138.372904 181.627488\nv 218.761597 139.247650 183.041021\nv 218.761597 148.129039 185.136641\nv 218.761597 146.821305 186.136797\nv 218.761597 143.901120 185.947925\nv 218.761597 144.062023 187.280283\nv 218.761597 135.310553 189.165526\nv 218.761597 131.166443 189.762456\nv 218.761597 133.021107 188.848264\nv 218.761597 147.614610 191.075645\nv 218.761597 145.832842 191.991870\nv 218.761597 137.433542 192.341518\nv 218.761597 143.907842 196.029700\nv 218.761597 140.733355 196.212579\nv 218.761597 136.860147 194.570154\nv 218.761597 137.364649 196.570916\nv 218.761597 130.785725 195.389227\nv 218.761597 132.023296 222.468561\nv 218.761597 130.785688 223.507668\nv 218.761597 126.946994 221.448982\nv 218.761597 135.044313 222.539747\nv 218.761597 138.529298 221.751970\nv 218.761597 129.373571 218.426424\nv 218.761597 142.230058 220.745776\nv 218.761597 141.759110 222.617566\nv 218.761597 135.444677 218.555188\nv 218.761597 137.330498 219.829237\nv 218.761597 142.082714 214.661996\nv 218.761597 143.592104 215.578181\nv 218.761597 127.318284 214.776018\nv 218.761597 137.626734 215.146021\nv 218.761597 134.449981 199.921931\nv 218.761597 144.928366 201.703997\nv 218.761597 146.445192 201.711432\nv 218.761597 136.164339 201.091293\nv 218.761597 136.077269 203.108036\nv 218.761597 129.500633 202.106232\nv 218.761597 139.801188 202.692144\nv 218.761597 133.239642 204.531407\nv 218.761597 144.778683 205.874694\nv 218.761597 145.380271 207.404078\nv 218.761597 133.495048 206.026521\nv 218.761597 135.237009 206.598217\nv 218.761597 141.193351 207.520308\nv 218.761597 131.376474 208.431304\nv 218.761597 128.742084 206.232700\nv 218.761597 144.966026 210.869105\nv 218.761597 134.569891 210.345579\nv 218.761597 137.336416 208.774870\nv 218.761597 133.762800 212.001815\nv 146.908039 123.089845 233.531750\nv 215.424219 120.998261 233.162948\nv 149.742835 125.355800 233.931321\nv 151.105478 126.062040 234.055858\nv 148.895235 132.500750 235.191164\nv 147.821996 136.048243 235.816678\nv 154.489743 123.503447 233.604665\nv 153.755674 127.268721 234.268588\nv 214.320592 132.025871 235.107437\nv 211.277252 132.896338 235.260893\nv 213.364975 138.884891 236.316813\nv 154.825148 138.144357 236.186272\nv 153.888297 136.164566 235.837202\nv 157.144163 127.355009 234.283819\nv 151.566405 139.321527 236.393842\nv 152.557726 132.494766 235.190106\nv 209.183854 135.264155 235.678395\nv 204.174239 126.669935 234.163002\nv 206.260916 134.296565 235.507787\nv 202.618170 125.457493 233.949245\nv 204.347190 134.213067 235.493102\nv 205.086706 135.972621 235.803344\nv 203.065159 135.618201 235.740825\nv 201.377283 127.195096 234.255616\nv 157.688564 124.444319 233.770576\nv 156.779075 140.606851 236.620468\nv 159.090421 130.826529 234.895912\nv 157.049160 130.832559 234.897010\nv 158.946273 134.790016 235.594777\nv 158.376481 139.664507 236.454285\nv 160.805331 129.807504 234.716222\nv 159.327868 136.820469 235.952805\nv 160.778530 135.656908 235.747654\nv 161.978132 129.034210 234.579882\nv 162.441931 134.918736 235.617466\nv 163.706292 135.562962 235.731075\nv 160.950779 137.592068 236.088859\nv 162.430875 136.503417 235.896891\nv 163.971839 132.676197 235.222067\nv 164.314058 138.782067 236.298690\nv 166.291085 136.723801 235.935784\nv 165.180486 140.167811 236.543040\nv 168.132554 136.548135 235.904812\nv 169.889492 139.432552 236.413381\nv 171.853584 136.620631 235.917599\nv 169.845688 140.976074 236.685546\nv 171.951179 131.625152 235.036750\nv 172.262147 130.248413 234.793988\nv 173.266362 132.968678 235.273661\nv 174.743314 138.604264 236.267360\nv 174.529220 142.403811 236.937323\nv 173.563996 140.449761 236.592781\nv 177.737540 127.200479 234.256529\nv 176.592116 128.662495 234.514359\nv 178.179755 133.809865 235.421937\nv 178.711036 140.120847 236.534773\nv 189.300641 140.799357 236.654378\nv 187.830170 135.403876 235.703012\nv 185.758158 130.838184 234.897993\nv 183.818607 126.716042 234.171175\nv 183.157101 142.955328 237.034581\nv 182.427737 130.344913 234.811044\nv 179.640986 137.142759 236.009658\nv 202.083167 139.663793 236.454167\nv 197.109458 138.382543 236.228269\nv 195.410141 129.546102 234.670145\nv 194.144709 128.036076 234.403860\nv 193.070365 126.594387 234.149655\nv 192.633906 137.896122 236.142492\nv 192.829085 136.075731 235.821504\nv 191.158628 131.658149 235.042561\nv 189.744268 130.654674 234.865621\nv 188.720559 127.187865 234.254344\nv 143.761597 127.146441 232.364542\nv 143.787724 125.864388 234.021013\nv 143.761597 126.416502 230.428740\nv 143.761597 134.557938 160.992798\nv 143.761597 134.742735 162.572037\nv 143.761597 145.078422 164.218693\nv 143.761597 147.935725 163.337210\nv 143.761597 133.257552 166.501551\nv 143.761597 135.292736 168.734873\nv 143.761597 123.042865 229.016390\nv 143.761597 124.716959 229.809283\nv 143.761597 128.106553 230.877558\nv 143.761597 137.444515 234.593527\nv 143.761597 132.797799 232.343218\nv 143.761597 133.675000 230.958343\nv 143.761597 124.515361 226.051071\nv 143.761597 129.642314 228.156120\nv 143.761597 129.465385 226.194071\nv 143.761597 136.508365 226.215469\nv 143.761597 148.690066 175.032636\nv 143.761597 143.023483 174.255977\nv 143.761597 133.652279 175.239014\nv 143.761597 141.851534 172.601990\nv 143.761597 139.154992 171.267835\nv 143.761597 137.560495 170.880674\nv 143.761597 133.793532 173.406614\nv 143.761597 131.963296 173.995632\nv 143.761597 143.745828 172.434469\nv 143.761597 142.549798 170.937252\nv 143.761597 131.897882 170.335823\nv 143.761597 145.085106 169.042253\nv 143.761597 148.555281 178.668359\nv 143.761597 148.529521 180.408437\nv 143.761597 138.647421 179.437046\nv 143.761597 136.780504 180.593397\nv 143.761597 141.896468 181.304423\nv 143.761597 140.801413 182.647026\nv 143.761597 136.653249 181.963120\nv 143.761597 148.053923 183.261043\nv 143.761597 147.186605 181.571649\nv 143.761597 145.119096 184.456521\nv 143.761597 141.801716 185.343691\nv 143.761597 139.874804 185.991868\nv 143.761597 146.619490 186.547063\nv 143.761597 146.523205 184.803017\nv 143.761597 146.705485 188.615316\nv 143.761597 145.048741 187.670998\nv 143.761597 137.218761 188.074550\nv 143.761597 138.361415 189.549870\nv 143.761597 143.398839 189.841722\nv 143.761597 141.726983 190.197384\nv 143.761597 146.226816 190.647192\nv 143.761597 144.043107 193.026375\nv 143.761597 144.421116 196.446464\nv 143.761597 147.446350 196.774724\nv 143.761597 133.839459 195.784710\nv 143.761597 136.529985 197.171458\nv 143.761597 134.775191 224.710473\nv 143.761597 134.624639 226.313564\nv 143.761597 140.041947 225.694364\nv 143.761597 139.503770 224.102510\nv 143.761597 130.865790 221.073972\nv 143.761597 134.203996 220.471453\nv 143.761597 130.675277 219.155530\nv 143.761597 132.270626 217.759734\nv 143.761597 140.366677 218.728360\nv 143.761597 128.252667 214.379071\nv 143.761597 127.030432 212.476319\nv 143.761597 137.105909 214.327816\nv 143.761599 146.404606 203.407122\nv 143.761597 136.217728 200.480843\nv 143.761597 138.927784 199.943436\nv 143.761597 144.693076 200.004845\nv 143.761597 143.484631 199.065904\nv 143.761597 141.075576 213.170338\nv 143.761597 130.834824 210.036949\nv 143.761597 134.213999 210.822272\nv 143.761597 129.771058 208.231935\nv 143.761597 135.394142 209.707212\nv 143.761597 128.132146 206.986257\nv 143.761597 132.918284 200.237042\nv 143.761597 129.431758 200.718456\nv 143.761597 142.519937 202.150466\nv 143.761597 142.359000 204.021533\nv 143.761597 130.767966 202.926682\nv 143.761597 130.895414 204.662128\nv 143.761597 140.475162 206.385974\nv 143.761597 138.395384 208.680895\nv 143.761597 143.292215 209.003901\nv 177.909646 155.029689 165.809700\nv 172.085772 144.868720 235.729804\nv 170.889777 144.761210 235.754009\nv 161.285707 147.222009 223.619442\nv 155.275131 147.132173 219.810276\nv 156.685627 147.550402 219.252710\nv 157.074907 149.430253 210.956024\nv 162.357221 148.591898 218.727405\nv 207.760892 152.727619 165.554176\nv 188.203917 144.989895 235.816265\nv 195.545067 146.998640 227.232738\nv 199.114145 147.122049 225.169732\nv 202.691499 147.244303 222.640240\nv 211.776648 151.173123 190.587861\nv 206.208190 147.846057 217.721117\nv 209.864288 131.213373 196.992790\nv 165.628059 127.511780 225.026985\nv 217.073689 141.529541 160.626164\nv 216.445499 139.814374 160.323739\nv 145.456146 140.817024 160.500533\nv 145.520732 137.566477 159.927365\nv 215.567921 142.693763 160.831435\nv 214.667679 139.985770 160.353949\nv 212.053449 137.758853 159.961319\nv 208.733329 141.272443 160.580822\nv 205.882921 140.353588 160.418831\nv 205.622853 142.002817 160.709638\nv 204.795746 151.361530 162.359778\nv 204.514958 143.186927 160.918396\nv 197.474295 147.251215 161.635075\nv 196.990928 145.536048 161.332638\nv 197.600451 142.894474 160.866869\nv 198.726564 145.743164 161.369136\nv 200.448263 145.809684 161.380890\nv 200.560423 142.441811 160.787043\nv 162.319676 143.495832 160.972890\nv 162.365280 147.733606 161.720121\nv 165.883718 147.485957 161.676442\nv 165.900055 145.603052 161.344450\nv 201.909575 145.614838 161.346508\nv 193.455337 144.553921 161.159433\nv 168.244627 139.553645 160.277798\nv 167.559978 144.640841 161.174801\nv 148.558962 142.612051 160.817035\nv 155.931449 144.388025 161.130197\nv 157.303080 151.543649 162.391941\nv 159.027008 143.753775 161.018369\nv 191.734547 144.033561 161.067692\nv 185.405493 143.518171 160.976804\nv 177.748286 145.412988 161.310912\nv 175.069438 137.436023 159.904373\nv 172.454059 146.698350 161.537538\nv 172.441900 143.376018 160.951739\nv 170.960705 151.657647 162.412034\nv 218.761597 136.263900 234.887442\nv 218.761597 136.201887 235.843790\nv 218.761597 132.900003 233.893147\nv 218.761597 132.765781 231.879852\nv 218.761597 128.431647 229.940078\nv 218.761597 136.228612 162.744229\nv 218.761597 147.813378 163.306705\nv 218.761597 139.407283 162.401359\nv 218.761597 138.809535 165.582619\nv 218.761597 140.822370 165.023577\nv 218.761597 141.772611 168.000394\nv 218.761597 131.729764 167.445257\nv 218.761597 143.095203 171.995161\nv 218.761597 124.798949 221.177204\nv 218.761597 128.999926 228.123916\nv 218.761597 130.887162 225.305801\nv 218.761597 133.637640 225.082275\nv 218.761597 144.551705 175.419241\nv 218.761597 137.222821 176.007570\nv 218.761597 137.851913 182.957557\nv 218.761597 138.197768 184.332944\nv 218.761597 141.103788 187.374618\nv 218.761597 138.757515 185.871343\nv 218.761597 138.628830 188.831754\nv 218.761597 140.743878 192.892313\nv 218.761597 131.320958 191.295323\nv 218.761597 140.685634 194.566343\nv 218.761597 139.058935 197.097998\nv 218.761597 131.817791 220.750277\nv 218.761597 140.839552 225.572587\nv 218.761597 141.549048 224.265128\nv 218.761597 135.207126 220.634532\nv 218.761597 131.477608 218.616150\nv 218.761597 133.862062 213.631380\nv 218.761597 139.162221 198.834616\nv 218.761597 146.429479 198.914762\nv 218.761597 145.421357 200.448311\nv 218.761597 146.929773 200.451907\nv 218.761597 139.178819 200.290715\nv 218.761597 140.242709 201.246546\nv 218.761597 141.509561 202.689058\nv 218.761597 140.570995 204.464828\nv 218.761597 134.884441 204.764687\nv 218.761597 139.074374 207.749191\nv 218.761597 143.597923 212.148567\nv 218.761597 143.165313 210.519970\nv 218.761597 137.154372 212.861172\nv 145.177557 127.407825 234.293153\nv 145.228529 130.296516 234.802492\nv 145.259931 128.843154 234.546230\nv 143.761597 131.027262 234.931364\nv 215.890175 125.471553 233.951723\nv 146.466939 130.997822 234.926170\nv 215.337206 128.962279 234.567248\nv 151.598592 122.907480 233.499621\nv 153.081359 123.993186 233.691017\nv 150.736005 129.028613 234.578926\nv 150.838204 132.442075 235.180809\nv 212.890952 132.421889 235.177260\nv 211.981416 129.185168 234.606544\nv 215.400714 134.073630 235.468509\nv 217.914216 137.488007 236.070566\nv 213.518714 128.242011 234.440242\nv 210.143323 131.554772 235.024333\nv 211.421608 139.402382 236.408052\nv 154.475747 129.031393 234.579408\nv 207.123676 127.435800 234.298066\nv 208.485401 132.075196 235.116101\nv 207.360131 137.861641 236.136418\nv 203.914289 128.547558 234.494077\nv 202.049701 136.966794 235.978603\nv 160.923266 131.723066 235.053994\nv 162.519488 132.244471 235.145930\nv 162.450448 141.642048 236.802965\nv 165.391328 131.476441 235.010533\nv 167.319099 133.526573 235.372013\nv 168.737982 132.712120 235.228427\nv 168.751462 142.265731 236.912989\nv 170.020931 135.489481 235.718109\nv 170.839003 130.377515 234.816746\nv 170.353190 132.010759 235.104719\nv 175.162778 135.403153 235.702914\nv 177.850051 136.920411 235.970411\nv 179.584394 133.676409 235.398438\nv 179.219589 127.239065 234.263345\nv 188.128631 133.441899 235.357075\nv 189.628229 134.387937 235.523893\nv 187.034892 127.178056 234.252589\nv 186.442565 133.986311 235.453057\nv 183.020560 133.953068 235.447247\nv 181.279122 133.213624 235.316878\nv 200.356977 130.377892 234.816805\nv 202.067221 131.393297 234.995863\nv 198.923553 125.878190 234.023393\nv 198.744008 129.434022 234.650387\nv 199.263727 135.863653 235.784116\nv 195.892497 131.465913 235.008667\nv 196.165514 134.993041 235.630597\nv 194.637672 133.846056 235.428337\nv 194.494407 135.485334 235.717392\nv 191.161481 133.457385 235.359813\nv 143.761597 129.028380 232.484013\nv 143.761597 138.161598 161.755023\nv 143.761597 138.960828 163.509407\nv 143.761597 139.521654 165.105414\nv 143.761597 141.732109 166.944280\nv 143.761597 125.073715 224.571386\nv 143.761597 134.429169 229.457337\nv 143.761597 137.890795 176.411683\nv 143.761597 140.914764 174.523535\nv 143.761597 141.459772 169.512707\nv 143.761597 137.270290 177.698947\nv 143.761597 135.737903 183.157797\nv 143.761597 131.654930 184.281251\nv 143.761597 137.488302 183.129228\nv 143.761597 138.631123 184.613111\nv 143.761597 136.248492 186.450729\nv 143.761597 137.619761 191.598298\nv 143.761597 131.583541 191.265282\nv 143.761597 141.214131 191.743332\nv 143.761597 138.034197 193.744716\nv 143.761597 139.928519 194.584718\nv 143.761597 136.539616 194.965495\nv 143.761597 131.349265 226.784310\nv 143.761597 131.054333 224.899064\nv 143.761597 130.920104 222.993192\nv 143.761597 134.053271 218.652854\nv 143.761597 126.617224 216.208754\nv 143.761597 131.455351 216.273904\nv 143.761597 138.821087 201.798694\nv 143.761597 135.560906 198.903208\nv 143.761597 132.788118 197.220814\nv 143.761597 130.639386 211.733628\nv 143.761597 137.241686 212.367214\nv 143.761597 144.096058 213.584523\nv 143.761597 142.771588 212.534844\nv 143.761597 138.698199 211.532574\nv 143.761597 139.414519 209.949603\nv 143.761597 138.204929 203.430250\nv 143.761597 139.327811 204.958784\nv 143.761597 135.609601 204.844824\nv 143.761597 128.902857 203.970513\nv 143.761597 129.256203 205.910454\nv 143.761597 136.710138 208.314182\nv 143.761597 132.990429 207.255828\nv 165.114724 145.973449 229.975046\nv 200.939837 147.492462 222.750585\nv 204.447865 146.953098 222.619083\nv 188.378383 154.672413 182.816413\nv 201.206890 152.440707 195.811012\nv 191.538962 135.773692 174.862723\nv 183.640803 135.748367 183.360997\nv 186.598888 130.085626 219.362964\nv 201.786550 131.164474 207.182099\nv 211.728637 128.951573 207.130736\nv 166.942814 128.207937 223.325545\nv 152.266947 128.486981 211.083599\nv 157.862474 128.843191 215.188148\nv 177.866135 128.286601 226.051702\nv 178.114211 128.862986 224.169378\nv 143.761597 131.815594 158.913307\nv 217.407808 130.843253 158.741894\nv 218.761597 131.815594 158.913307\nv 217.055200 132.640027 159.058731\nv 215.484770 136.687093 159.772330\nv 148.490131 136.478108 159.735474\nv 147.135839 137.966194 159.997865\nv 149.236057 132.881330 159.101265\nv 216.938355 148.136361 161.791106\nv 214.208304 141.641971 160.645992\nv 211.643290 133.951309 159.289920\nv 212.516556 142.187273 160.742169\nv 213.197606 148.806175 161.909238\nv 210.035937 135.160875 159.503195\nv 211.902250 150.426134 162.194862\nv 209.254441 139.697793 160.303189\nv 206.943562 135.801345 159.616138\nv 202.990498 135.871364 159.628461\nv 206.472070 147.134053 161.614404\nv 208.150381 150.757804 162.253356\nv 209.972919 150.525614 162.212393\nv 194.636079 143.099276 160.902946\nv 196.314747 142.178953 160.740684\nv 196.304842 136.141425 159.676126\nv 198.946004 151.847620 162.445548\nv 198.960776 142.648431 160.823451\nv 201.756417 151.428804 162.371695\nv 199.631226 137.679104 159.947262\nv 166.184698 141.951508 160.700598\nv 164.347258 152.516012 162.563401\nv 167.091442 136.560634 159.750038\nv 192.801277 152.883970 162.628257\nv 169.511765 152.906180 162.632195\nv 167.749006 152.600501 162.578265\nv 147.361014 147.703596 161.714819\nv 151.901398 134.465873 159.380638\nv 150.816291 140.137293 160.380675\nv 149.703406 149.222195 161.982582\nv 154.129096 140.420154 160.430583\nv 150.711831 150.555912 162.217735\nv 151.600455 149.047212 161.951713\nv 152.519101 150.588654 162.223560\nv 157.576471 144.783157 161.199866\nv 161.425304 135.744230 159.606067\nv 160.901487 141.804753 160.674709\nv 189.224961 137.174187 159.858203\nv 191.211846 153.070746 162.661179\nv 190.937374 149.841422 162.091768\nv 188.344753 138.977470 160.176162\nv 187.209211 146.210108 161.451477\nv 185.706460 147.227634 161.630885\nv 184.092829 148.283111 161.817000\nv 184.893501 137.714696 159.953518\nv 182.180125 147.380943 161.657917\nv 181.129287 137.526278 159.920288\nv 179.764297 145.144249 161.263526\nv 179.388212 137.942663 159.993699\nv 178.875095 148.127388 161.789527\nv 178.184732 137.044963 159.835411\nv 177.052775 152.886922 162.628760\nv 174.999123 153.023010 162.652774\nv 171.698112 137.018721 159.830811\nv 218.761597 121.279664 230.101920\nv 218.760045 122.319567 231.740001\nv 218.692303 120.709139 233.111982\nv 218.738499 125.863012 234.020761\nv 218.761596 127.487510 233.005475\nv 218.761597 137.976751 234.397589\nv 218.761597 131.383385 162.495738\nv 218.761597 130.879250 160.629610\nv 218.761597 139.223507 164.001553\nv 218.761597 131.641040 164.080031\nv 218.761597 140.410056 166.657371\nv 218.761597 139.969405 168.373985\nv 218.761597 131.668179 168.914459\nv 218.761597 137.944129 170.395683\nv 218.761597 146.969880 170.196523\nv 218.761597 145.318835 170.585749\nv 218.761597 131.813672 171.773628\nv 218.761597 136.948193 171.563499\nv 218.761597 137.722100 173.203999\nv 218.761597 148.365565 173.008260\nv 218.761597 131.876816 175.374689\nv 218.761597 125.074659 225.597317\nv 218.761597 139.104514 230.191290\nv 218.761597 138.439675 227.118053\nv 218.761597 133.420127 226.887790\nv 218.761597 140.265148 227.125461\nv 218.761597 133.757760 176.068086\nv 218.761597 138.912818 176.686644\nv 218.761597 133.494839 178.044748\nv 218.761597 131.827092 178.955029\nv 218.761597 133.344733 181.467405\nv 218.761597 146.505410 180.418665\nv 218.761597 147.003567 181.875799\nv 218.761597 131.882025 182.327087\nv 218.761597 147.634902 183.406498\nv 218.761597 141.490307 184.677593\nv 218.761597 148.071793 186.957601\nv 218.761597 147.792968 189.012581\nv 218.761597 137.214845 190.241788\nv 218.761597 140.743768 191.099756\nv 218.761597 144.117021 192.851062\nv 218.761597 147.240576 195.043041\nv 218.761597 147.450750 193.120045\nv 218.761597 130.613603 193.905543\nv 218.761597 136.409140 197.826075\nv 218.761597 124.612980 219.276516\nv 218.761597 137.933242 223.708551\nv 218.761597 126.403978 219.584991\nv 218.761597 125.735391 217.591704\nv 218.761597 142.702622 218.961198\nv 218.761597 138.885732 213.472957\nv 218.761597 127.033886 212.935942\nv 218.761597 132.078529 214.550681\nv 218.761597 130.296617 215.103150\nv 218.761597 143.231117 217.238712\nv 218.761597 141.190210 217.560759\nv 218.761597 146.889499 196.894772\nv 218.761597 130.157646 196.975839\nv 218.761597 145.513795 203.105430\nv 218.761597 131.283082 198.746401\nv 218.761597 131.266588 200.959353\nv 218.761597 133.023169 201.461377\nv 218.761597 140.336909 206.262683\nv 218.761597 129.146208 204.158030\nv 218.761597 130.363779 205.174899\nv 218.761597 144.331386 208.996857\nv 218.761597 129.501721 208.117950\nv 218.761597 128.048087 209.580117\nv 218.761597 127.401957 211.193191\nv 143.839977 120.713265 233.112738\nv 216.953232 120.075927 233.000330\nv 146.975753 121.257408 233.208639\nv 148.603085 122.476071 233.423550\nv 146.706981 127.821769 234.366132\nv 144.727890 137.303739 236.038082\nv 150.194905 122.170543 233.369678\nv 148.580742 128.821306 234.542386\nv 148.413002 138.833683 236.307821\nv 152.695774 129.039201 234.580768\nv 149.796910 138.987570 236.334954\nv 208.777193 125.173100 233.899093\nv 210.544481 122.965310 233.509802\nv 209.074222 123.421128 233.590151\nv 210.228185 124.663461 233.809239\nv 216.353600 137.236338 236.026183\nv 211.624976 125.580595 233.970953\nv 212.182131 122.540776 233.434963\nv 207.503911 123.894840 233.673717\nv 155.161535 140.089133 236.529202\nv 156.316397 132.738915 235.233163\nv 155.924145 123.992169 233.690851\nv 155.261495 130.848571 234.899850\nv 153.115102 134.280879 235.505024\nv 150.790633 137.496164 236.071979\nv 208.517900 140.517979 236.604812\nv 205.875434 124.371732 233.757789\nv 204.311796 124.826431 233.837945\nv 205.546955 129.733244 234.703151\nv 206.566929 139.664738 236.454342\nv 200.765844 125.552280 233.965938\nv 204.081179 139.254434 236.381993\nv 158.008663 125.915125 234.029924\nv 156.941852 134.719703 235.582425\nv 157.714111 136.518676 235.899602\nv 158.233471 141.372735 236.755487\nv 161.549942 125.944842 234.035138\nv 159.814667 140.719910 236.640408\nv 163.321233 129.278179 234.622893\nv 165.550055 126.254625 234.089794\nv 164.396970 127.814676 234.364862\nv 165.150802 135.284272 235.681948\nv 167.311906 126.518766 234.136345\nv 169.330531 126.789012 234.184004\nv 170.627257 142.372698 236.931833\nv 169.908690 137.509342 236.074267\nv 171.326759 127.002147 234.221584\nv 172.526300 142.368009 236.931024\nv 175.156563 129.967700 234.744504\nv 176.072156 126.976607 234.217091\nv 176.102388 143.443479 237.120630\nv 176.570669 141.789343 236.828925\nv 177.796243 143.147331 237.068402\nv 179.819283 128.802319 234.539007\nv 190.232768 142.507649 236.955596\nv 188.066548 142.284230 236.916192\nv 187.848159 128.770467 234.533391\nv 186.491452 136.860233 235.959813\nv 186.061651 141.685099 236.810595\nv 184.838174 136.315105 235.863749\nv 181.505017 128.740712 234.528175\nv 181.504401 137.383717 236.052175\nv 181.547321 142.933073 237.030673\nv 179.942267 131.982173 235.099707\nv 200.530807 136.913056 235.969147\nv 201.313202 141.589350 236.793708\nv 199.335169 141.661402 236.806405\nv 198.008289 134.198566 235.490520\nv 196.977633 126.418484 234.118685\nv 193.521152 132.611988 235.210739\nv 194.450479 143.019593 237.045907\nv 192.279523 132.635108 235.214830\nv 190.371282 127.603339 234.327589\nv 191.188423 136.983437 235.981543\nv 143.761597 121.435792 230.095746\nv 143.761597 130.826011 160.315723\nv 143.761597 143.277815 164.202790\nv 143.761597 131.455445 163.463197\nv 143.761597 132.273993 165.145006\nv 143.761597 138.187530 166.185670\nv 143.761597 131.752355 168.596499\nv 143.761597 138.764170 167.832622\nv 143.761597 148.134012 165.082467\nv 143.761597 122.569165 227.012348\nv 143.761597 133.505362 233.904112\nv 143.761597 127.702564 229.143129\nv 143.761597 137.628359 229.857129\nv 143.761597 133.304090 227.626414\nv 143.761597 137.208312 228.276033\nv 143.761597 133.571844 177.018273\nv 143.761597 131.879587 177.622417\nv 143.761597 142.357915 176.151149\nv 143.761597 131.922748 175.765195\nv 143.761597 137.603475 175.098268\nv 143.761597 147.089430 174.381452\nv 143.761597 137.244450 173.724990\nv 143.761597 146.875162 172.622594\nv 143.761597 131.967162 172.120726\nv 143.761597 138.106156 172.467847\nv 143.761597 148.505587 171.637986\nv 143.761597 148.721159 168.459104\nv 143.761597 142.992716 179.602849\nv 143.761597 133.277407 180.896864\nv 143.761597 148.703951 181.823915\nv 143.761597 142.363327 183.247180\nv 143.761597 148.187004 185.194331\nv 143.761597 131.511921 186.047605\nv 143.761597 148.186460 187.105650\nv 143.761597 144.946336 189.390142\nv 143.761597 141.186327 187.144676\nv 143.761597 132.972484 186.613328\nv 143.761597 131.556350 188.028262\nv 143.761597 147.876095 190.323754\nv 143.761597 142.337104 188.502079\nv 143.761597 130.906654 189.832590\nv 143.761597 147.371181 191.822676\nv 143.761597 147.404624 193.445617\nv 143.761597 147.323451 195.287055\nv 143.761597 130.829763 192.936645\nv 143.761597 133.448542 194.230842\nv 143.761597 141.687850 195.418564\nv 143.761597 141.661458 197.163157\nv 143.761597 140.287774 227.376995\nv 143.761597 125.437365 219.766896\nv 143.761597 125.156985 217.841029\nv 143.761597 129.394302 220.302153\nv 143.761597 141.674809 222.143775\nv 143.761597 137.082786 220.135554\nv 143.761597 135.613716 217.573932\nv 143.761597 142.203074 219.926853\nv 143.761597 143.457724 218.324916\nv 143.761597 126.154375 214.318865\nv 143.761597 135.109280 215.660168\nv 143.761597 131.703302 214.834169\nv 143.761597 143.519926 215.127462\nv 143.761597 128.867121 212.172549\nv 143.761597 133.870084 212.393317\nv 143.761597 129.911319 199.185670\nv 143.761597 146.496722 199.831887\nv 143.761597 130.603541 196.964304\nv 143.761597 140.242995 198.524485\nv 143.761597 143.240327 197.694529\nv 143.761597 146.935296 198.186133\nv 143.761597 127.519423 210.661395\nv 143.761597 133.651661 209.231073\nv 143.761597 130.516827 201.548041\nv 143.761597 145.459119 204.949278\nv 143.761597 134.605853 203.329109\nv 143.761597 145.068700 208.529590\nv 143.761597 144.771905 210.184300\nv 168.996876 147.137373 227.477175\nv 166.855195 154.489230 175.237244\nv 189.580140 145.458708 234.142693\nv 193.559465 146.751049 228.811395\nv 207.365691 150.168581 204.980895\nv 210.738087 148.954947 207.984177\nv 206.673816 133.214528 160.798336\nv 214.468944 120.455384 231.777555\nv 183.674904 136.059664 167.140101\nv 152.287416 132.854855 171.277236\nv 153.577196 133.109086 168.179908\nv 218.761597 129.700739 231.343816\nv 143.761597 137.495544 236.071897\nv 144.826420 147.445717 206.688639\nv 199.614691 152.794501 194.480620\nv 208.554523 128.821987 211.556746\nv 145.243693 124.577507 217.237620\nv 159.516867 134.176445 164.085005\nv 195.805442 152.839841 162.620459\nv 218.761597 131.871395 173.644381\nv 218.761597 123.118180 224.635372\nv 218.761597 139.119748 179.974161\nv 143.763835 120.318934 231.615193\nv 143.761597 131.855254 230.913995\nv 143.761597 127.937987 208.769680\nv 143.761597 133.610077 201.772657\nv 144.895907 147.629251 205.819180\nv 172.493032 147.387550 227.581787\nv 218.761597 142.582226 225.454300\nv 208.793645 151.696305 191.445978\nv 214.069711 148.218211 207.817485\nv 159.227083 128.117326 219.121615\nv 218.761597 137.495544 236.071897\nv 157.909237 132.181005 235.134776\nv 143.761597 132.320918 235.159470\nv 143.761597 123.139100 225.062163\nv 143.761597 135.429258 188.093389\nv 162.458492 154.051695 173.706497\nv 206.320405 148.192951 216.090775\nv 210.353307 128.440177 211.160598\nv 215.881751 131.499729 158.857601\nv 146.993255 136.067385 159.663055\nv 214.094628 146.973692 161.586161\nv 209.811115 133.420360 159.196294\nv 164.363835 142.747754 160.841009\nv 188.704738 147.367838 161.655609\nv 218.761597 133.756361 172.700962\nv 218.761597 148.394950 180.719670\nv 218.761597 144.586861 180.222668\nv 218.761597 129.563506 198.670275\nv 218.761597 143.447003 205.564088\nv 218.761597 143.372355 207.135124\nv 218.761597 138.742054 205.735462\nv 218.761597 130.570483 206.707224\nv 218.761597 127.877730 207.910809\nv 216.615441 123.667168 233.633568\nv 205.188094 141.132727 236.713206\nv 203.280092 141.122987 236.711451\nv 201.111382 135.463791 235.713594\nv 191.357288 126.624246 234.154947\nv 143.761597 131.510345 166.796108\nv 143.761597 124.357214 227.846981\nv 143.761597 136.381421 232.834642\nv 143.761597 125.683280 227.045508\nv 143.761597 137.066911 231.286509\nv 143.761597 138.940786 230.824851\nv 143.761597 140.618992 176.595325\nv 143.761597 148.591274 173.251733\nv 143.761597 143.704474 181.369086\nv 143.761597 131.701256 182.507471\nv 143.761597 133.641870 188.038451\nv 217.001653 145.926983 161.401540\nv 218.761597 129.733605 234.703258\nv 211.482996 145.640350 161.351013\nv 151.320921 145.937329 161.403376\nv 218.761597 136.638768 181.914746\nv 145.373469 122.053658 233.349071\nv 145.465055 120.122195 233.008503\nv 217.513491 135.708596 235.756806\nv 203.803984 130.483403 234.835445\nv 143.764965 121.913308 231.891959\nv 143.761597 138.284033 225.127850\nv 210.656306 141.067951 160.544792\nv 211.080899 142.810437 160.852039\nv 193.792563 146.271993 161.462374\nv 152.041021 144.616511 161.170483\nv 218.761597 134.908231 235.615684\nv 143.761597 129.733605 234.703258\nv 143.761597 140.243905 178.145821\nv 143.761597 140.019425 181.266464\nv 143.761597 139.243831 182.926305\nv 208.250634 134.609390 159.405981\nv 160.038213 151.944216 162.462526\nv 170.028631 136.798394 159.791927\nv 187.034098 137.175423 159.858412\nv 183.593780 138.931376 160.168046\nv 184.129255 146.529596 161.507813\nv 178.872416 153.452907 162.728552\nv 172.457087 144.962946 161.231546\nv 218.747663 120.435159 231.579809\nv 218.761597 131.769313 180.697570\nv 218.760272 131.068807 186.648154\nv 218.761597 127.324220 216.386496\nv 218.761597 146.093343 206.179859\nv 216.993131 121.822819 233.308361\nv 172.806847 138.597109 236.266110\nv 143.761597 138.479200 232.816154\nv 143.761597 129.138927 229.763932\nv 143.761597 131.463050 180.930020\nv 143.761597 129.193906 202.204535\nv 192.100694 135.398726 160.625105\nv 180.258250 136.125415 169.200382\nv 218.761597 126.118670 214.135043\nv 159.634849 142.801693 237.007511\nv 196.549556 125.127494 232.314954\nv 193.423524 127.888312 225.257913\nv 193.660692 135.285308 160.914413\nv 180.368758 136.146417 170.994534\nv 144.983155 130.497073 181.110546\nv 157.738013 153.002135 184.010177\nv 203.214597 151.894259 162.453746\nv 195.841690 136.863966 235.960485\nv 211.368135 130.257527 200.721419\nv 178.528577 136.107614 170.048302\nv 167.541783 146.336248 161.473747\nv 218.761596 148.760980 167.931853\nv 218.761597 130.480514 192.458793\nv 160.977217 141.605363 236.796518\nv 143.761597 134.908231 235.615684\nv 204.735466 147.192125 161.624611\nv 185.082867 153.314985 162.704260\nv 218.761597 148.596563 182.084651\nv 171.717598 134.484532 235.540945\nv 143.761597 121.538951 228.350097\nv 218.761597 132.320918 235.159470\nv 215.714790 131.197068 169.388443\nv 146.898082 131.264521 170.724764\nv 194.700348 125.374133 232.354196\nv 176.765770 127.173694 229.536521\nv 143.761597 148.319085 188.759716\nv 217.093257 146.060229 214.227669\nv 192.866841 143.094199 160.902048\nv 208.310288 131.026714 200.561427\nv 218.761597 129.258135 226.249110\nv 218.761597 134.755408 178.973114\nv 199.489187 136.059923 159.661757\nv 205.560415 127.965009 234.391364\nv 217.518983 122.729259 222.657027\nv 215.599001 131.156793 167.554088\nv 148.309061 131.614416 167.467139\nv 209.196880 148.450715 212.257586\nv 205.111117 133.790015 164.278919\nv 201.127468 135.549101 159.571638\nv 218.761597 131.894410 177.117850\nv 218.761597 142.154059 178.277413\nv 218.760127 130.909333 183.666562\nv 180.611922 127.215019 234.259143\nv 143.761597 148.689704 176.853961\nv 143.761597 147.477111 175.917870\nv 144.992071 133.673995 235.398046\nv 145.894771 148.616847 161.875840\nv 185.842249 129.018522 234.577138\nv 152.720167 142.375260 233.940758\nv 204.281060 134.045406 165.966380\nv 186.541339 143.432916 237.118769\nv 206.701691 134.370390 159.363824\nv 151.607389 132.272737 184.619946\nv 216.159328 130.393468 189.003945\nv 145.251651 145.845785 214.963855\nv 182.659449 150.047440 217.997585\nv 196.261225 131.466184 209.698938\nv 204.304905 147.450449 220.761701\nv 151.650975 121.908483 231.557693\nv 217.417165 125.198539 233.903590\nv 143.761597 145.393193 177.732745\nv 218.226819 129.539955 159.232444\nv 143.761597 138.302982 235.458121\nv 218.279092 139.229356 235.588872\nv 218.464158 138.124542 236.182805\nv 144.111149 138.157217 236.188575\nv 218.007666 130.392926 169.133747\nv 218.007666 130.338971 167.847202\nv 218.761597 130.086151 168.491150\nv 218.761597 129.376725 190.200325\nv 218.290450 129.436372 191.131762\nv 218.290450 129.541147 190.189837\nv 218.761597 128.233928 198.704129\nv 218.151827 128.321938 199.477964\nv 218.151827 128.522862 198.245890\nv 218.130399 127.358166 204.752973\nv 217.937795 127.239891 205.659400\nv 217.306597 127.531406 205.340817\nv 218.047243 125.989861 210.981321\nv 218.090345 125.780903 211.756681\nv 217.375991 126.113362 211.492955\nv 218.761597 121.135252 225.595425\nv 218.065725 121.263197 226.044808\nv 218.065725 121.685547 224.965389\nv 190.352445 135.498637 160.240935\nv 189.700792 135.585311 160.980483\nv 189.471672 135.557224 160.297358\nv 208.078228 132.786570 159.883746\nv 207.579411 132.981893 160.737338\nv 207.172632 133.019206 159.944744\nv 218.494208 129.491429 159.730121\nv 218.494208 129.391781 158.846118\nv 218.761597 129.343255 159.343795\nv 214.993590 130.648265 158.707514\nv 215.827236 130.435255 159.315033\nv 214.804853 130.788897 159.377417\nv 210.649968 132.304539 162.066413\nv 210.078151 132.401843 161.342555\nv 211.027102 132.131940 161.237609\nv 210.549010 132.047089 158.954161\nv 211.023502 131.990011 159.707840\nv 209.980794 132.286321 159.760072\nv 206.600476 133.074940 159.135427\nv 206.101659 133.270263 159.989020\nv 202.108672 134.091247 160.348320\nv 201.311920 134.287793 161.077863\nv 201.360077 134.199396 160.028523\nv 199.142336 134.761716 163.209670\nv 198.820853 134.769629 162.519901\nv 199.697784 134.644713 162.541761\nv 200.056123 134.552666 161.948536\nv 199.969814 134.524283 161.305029\nv 200.649634 134.424324 161.401574\nv 201.398229 134.316175 161.721370\nv 200.134686 134.410016 160.065685\nv 200.931439 134.213471 159.336141\nv 194.580428 135.186049 161.035106\nv 194.298569 135.165256 160.198608\nv 195.218305 135.065997 160.319302\nv 192.688748 135.310012 160.069477\nv 191.659295 135.394111 160.084304\nv 192.247349 135.305397 159.528675\nv 191.341129 135.462725 160.774582\nv 190.899731 135.458110 160.233781\nv 185.993088 135.708219 160.225077\nv 185.066258 135.737195 160.230181\nv 185.959424 135.665726 159.592201\nv 186.975871 135.683038 160.313658\nv 187.412030 135.613175 159.582946\nv 187.501647 135.659463 160.309507\nv 187.942754 135.686612 161.038562\nv 188.378912 135.616749 160.307851\nv 189.030565 135.530075 159.568303\nv 183.309800 135.767832 160.331781\nv 184.397511 135.746442 160.231829\nv 184.012212 135.801078 160.963009\nv 184.363846 135.703949 159.598953\nv 186.082705 135.754507 160.951637\nv 182.378053 135.777208 160.333432\nv 182.763351 135.722573 159.602253\nv 182.781540 136.125171 172.768270\nv 182.643216 136.114899 173.635216\nv 181.912600 136.133552 172.988440\nv 183.121732 133.476332 203.424757\nv 183.842694 133.532903 203.010710\nv 183.841762 133.399212 203.798532\nv 181.853390 130.049087 219.975108\nv 182.745414 130.063691 219.870859\nv 182.517170 129.897740 220.513219\nv 183.744022 128.468419 225.550367\nv 182.738348 128.457518 225.658683\nv 183.025298 128.696673 224.845399\nv 180.911183 125.989786 233.217030\nv 181.360296 126.256088 232.457710\nv 181.711106 125.983702 233.235781\nv 182.632697 126.503581 231.723190\nv 181.803786 126.513578 231.727274\nv 182.276264 126.767156 230.974003\nv 183.148353 125.697300 233.991547\nv 183.314629 125.955601 233.238014\nv 183.485078 125.950203 233.237068\nv 184.431959 126.471221 231.662917\nv 185.281649 126.422601 231.723293\nv 184.501043 126.159884 232.543910\nv 186.178273 126.564921 231.179453\nv 186.247357 126.253584 232.060446\nv 187.270968 126.668370 230.722584\nv 188.325205 126.723613 230.353518\nv 188.198218 126.451147 231.147541\nv 191.033599 125.514488 233.147472\nv 191.504517 125.734491 232.386858\nv 192.097871 125.406656 233.140836\nv 193.286568 125.275129 233.117635\nv 192.815651 125.055126 233.878250\nv 197.765599 124.667981 233.005703\nv 196.890531 124.799648 233.045180\nv 197.424624 124.995827 232.275477\nv 198.986921 124.456555 232.968422\nv 198.452828 124.260376 233.738125\nv 198.605474 125.097075 231.439542\nv 199.588299 124.936439 231.368335\nv 199.282516 124.703525 232.164793\nv 201.444700 124.668818 231.080496\nv 201.388552 125.006264 230.212623\nv 202.170611 124.573290 230.919307\nv 202.852479 124.673116 230.242337\nv 202.908627 124.335670 231.110210\nv 205.028862 123.131489 232.882402\nv 205.750936 122.954649 232.851242\nv 205.337476 122.818361 233.483885\nv 209.875758 121.804211 232.604401\nv 209.727798 122.336674 231.421523\nv 210.596989 121.796562 232.026968\nv 211.340077 121.372954 232.454737\nv 212.461904 120.983756 232.386115\nv 211.866775 120.874901 233.141223\nv 213.838970 120.739604 231.698332\nv 213.629157 121.125470 230.979380\nv 214.259132 120.841250 231.058603\nv 213.323248 120.674737 232.331730\nv 213.953222 120.390516 232.410952\nv 215.814290 119.792414 231.984626\nv 216.059839 119.693886 231.967277\nv 216.096454 119.276976 232.859452\nv 216.839886 119.302102 232.048396\nv 218.003487 118.778979 231.956142\nv 217.505604 118.655325 232.749847\nv 218.715401 118.634975 231.522671\nv 218.049683 119.281753 230.821220\nv 217.202417 119.909361 230.285895\nv 217.914332 119.765358 229.852424\nv 217.914332 120.175682 228.906650\nv 218.761597 119.548073 229.441975\nv 218.761597 120.335650 227.585522\nv 218.046564 120.545799 227.871180\nv 218.046564 120.923052 226.960501\nv 216.747058 123.028488 222.708231\nv 217.460510 122.542445 223.268907\nv 216.688585 122.841675 223.320112\nv 218.761597 124.053427 217.065800\nv 218.103818 124.138507 217.640540\nv 218.103818 124.510232 216.411540\nv 218.147560 123.794014 218.741874\nv 218.147560 123.875416 218.473373\nv 218.761597 123.600300 218.563301\nv 218.209844 125.369400 213.184321\nv 218.761597 125.056098 213.554726\nv 218.209844 125.152550 213.972948\nv 216.083441 125.692817 214.913790\nv 216.808053 125.539871 214.474073\nv 216.718933 125.280154 215.571954\nv 218.180540 126.818744 207.271978\nv 218.761597 126.465677 207.854175\nv 218.180540 126.543169 208.480302\nv 218.064367 126.426517 209.166047\nv 217.483309 126.779584 208.583850\nv 218.033014 128.242228 200.228358\nv 217.423244 128.531161 199.770119\nv 217.896629 128.037667 201.658468\nv 218.761597 127.679051 201.935699\nv 217.896629 127.807118 202.900671\nv 218.033014 128.180525 200.607005\nv 217.168046 128.308593 201.571976\nv 217.843136 129.369073 193.035899\nv 218.051431 129.190658 193.948875\nv 217.132971 129.516988 193.825272\nv 216.175925 130.283077 189.962782\nv 216.815031 130.163060 189.109797\nv 216.831628 130.052669 190.068634\nv 216.875005 130.376021 186.450065\nv 217.682613 130.176810 185.475041\nv 217.943283 130.020806 186.376923\nv 218.756244 129.735497 186.386149\nv 217.948636 129.934708 187.361174\nv 218.157104 130.345550 179.529060\nv 218.009814 130.367815 180.314567\nv 217.405320 130.598611 179.823027\nv 218.761597 130.196872 177.236950\nv 217.990744 130.456814 177.849541\nv 217.990744 130.471139 176.822293\nv 218.009814 130.333864 181.194194\nv 218.761597 130.080803 180.900227\nv 218.039592 130.412276 170.003908\nv 217.285661 130.665096 169.359960\nv 218.039592 130.432426 170.483713\nv 218.156486 130.404236 171.175935\nv 217.434481 130.656257 170.922344\nv 218.761597 130.160256 170.257500\nv 216.763676 130.903606 171.535367\nv 217.386067 130.696902 172.395955\nv 216.598368 130.972441 172.316755\nv 218.761597 129.953499 166.034802\nv 218.070708 130.258805 166.866527\nv 218.070708 130.185403 165.824028\nv 218.761597 130.029549 167.140953\nv 218.070708 130.261453 166.930179\nv 217.644518 129.741688 159.083909\nv 218.094161 129.552525 158.874469\nv 217.777177 129.729119 159.441883\nv 216.483017 130.247084 159.818129\nv 217.229594 130.036234 160.380661\nv 216.385077 130.365036 160.547468\nv 216.216859 130.499867 161.320581\nv 216.966242 130.296910 162.057941\nv 216.051447 130.642591 162.268523\nv 213.213051 120.405676 233.058475\nv 213.098799 120.754764 232.345855\nv 212.572100 121.252817 231.659369\nv 213.112584 121.667777 230.142795\nv 212.863853 122.118376 229.275567\nv 213.800588 121.677714 229.472423\nv 216.156697 120.820921 229.221677\nv 215.657283 121.345458 228.466934\nv 216.567653 120.917504 228.562355\nv 217.199299 120.763084 228.281629\nv 217.350692 121.473347 226.330466\nv 209.952171 121.513748 233.253872\nv 209.082980 122.053860 232.648427\nv 212.055527 121.795124 230.822783\nv 211.192118 121.905417 231.271859\nv 211.312439 122.218732 230.395014\nv 209.501537 122.800007 230.406600\nv 209.422365 123.219022 229.401673\nv 210.369857 122.748040 229.839163\nv 212.685926 122.591775 228.204216\nv 212.529841 122.983202 227.312457\nv 213.395771 122.519740 227.713435\nv 216.699885 121.287621 227.526885\nv 216.032358 121.761095 227.015472\nv 216.664004 121.606674 226.734746\nv 215.392116 122.105920 226.808062\nv 214.687770 122.481711 226.538781\nv 215.292132 122.455938 225.954051\nv 216.683166 121.946820 225.819052\nv 215.987675 122.389435 225.389133\nv 216.674363 122.256107 224.984853\nv 217.385945 122.084562 224.647780\nv 218.081817 121.956616 224.198397\nv 204.690231 123.774229 231.433357\nv 205.381512 123.554725 231.541746\nv 204.751040 123.487281 232.141370\nv 205.056609 124.209613 230.047324\nv 205.706923 124.233604 229.530974\nv 205.971018 123.865665 230.317383\nv 207.028492 124.000519 229.202602\nv 207.994848 123.691185 229.286641\nv 207.587688 123.580323 229.885071\nv 207.284146 124.445279 227.789604\nv 207.898560 124.403398 227.424234\nv 208.050065 124.069501 228.238802\nv 209.384870 124.006360 227.317238\nv 210.197973 123.576077 227.797640\nv 209.477582 123.597338 228.353834\nv 210.002964 124.352646 225.798756\nv 210.743642 124.275950 225.356056\nv 210.845939 123.908403 226.318344\nv 212.314322 123.723719 225.471510\nv 213.140856 123.263450 225.944526\nv 212.413152 123.371437 226.348660\nv 213.756852 123.551093 224.514053\nv 214.529732 123.159091 224.822750\nv 213.814906 123.223731 225.376073\nv 214.356630 123.841645 223.066721\nv 215.108357 123.762277 222.466074\nv 215.223406 123.407086 223.360083\nv 216.416318 123.398381 222.034657\nv 217.188243 123.099151 221.983452\nv 216.609363 123.830297 220.508026\nv 217.070456 123.849759 219.900967\nv 217.318595 123.488505 220.702819\nv 218.270642 123.038785 220.899778\nv 218.270642 123.276108 220.181780\nv 218.761597 122.806927 220.985797\nv 190.434601 125.294926 233.920551\nv 189.841247 125.622761 233.166572\nv 191.128641 126.564149 230.138208\nv 190.360429 126.386572 230.827258\nv 190.020667 126.683967 230.089427\nv 193.042031 125.831790 231.632877\nv 194.107811 125.705527 231.619864\nv 193.634568 125.500396 232.367208\nv 195.948476 125.965366 230.151210\nv 196.828474 125.840548 230.133959\nv 196.347081 125.663155 230.849926\nv 197.145232 126.016662 229.483751\nv 197.543837 125.714451 230.182467\nv 198.587484 125.903047 229.127215\nv 199.112816 125.622759 229.682627\nv 198.385926 125.610276 230.087671\nv 199.988508 125.508661 229.547992\nv 200.288797 125.746212 228.683099\nv 200.962931 125.339343 229.508920\nv 201.768710 125.748254 227.831565\nv 202.613518 125.540030 227.909505\nv 202.108029 125.368671 228.721968\nv 203.575042 125.224493 228.220802\nv 204.494880 124.933045 228.451306\nv 203.872676 124.869000 229.030412\nv 204.024351 125.596107 226.840143\nv 204.683955 125.640399 226.245809\nv 204.856849 125.332831 227.047362\nv 206.162347 125.426872 225.805837\nv 206.970441 125.127898 226.066842\nv 206.324547 125.078149 226.714032\nv 206.611454 125.822986 224.255696\nv 207.313158 125.816752 223.710582\nv 207.509945 125.470386 224.613533\nv 208.955478 125.414330 223.563937\nv 209.799987 125.042350 223.947962\nv 209.056158 125.092172 224.452443\nv 211.305420 124.868546 223.092162\nv 212.041826 124.756013 222.685123\nv 212.129236 124.430629 223.626370\nv 211.181739 125.518211 221.161146\nv 211.933820 125.413561 220.738579\nv 211.970091 125.089279 221.728348\nv 213.354469 124.876750 220.957203\nv 214.114173 124.482853 221.390669\nv 213.481876 124.590733 221.739247\nv 213.454235 125.170460 219.893282\nv 213.870091 125.232189 219.224895\nv 214.402621 124.830599 219.940238\nv 215.456392 124.855442 218.611219\nv 216.227766 124.505053 218.828380\nv 215.589851 124.541940 219.489012\nv 216.044314 125.125828 216.981129\nv 216.720180 125.014206 216.498976\nv 216.770173 124.706934 217.468434\nv 201.517326 126.723674 225.041495\nv 201.495893 126.982458 224.227300\nv 202.272961 126.740425 224.509505\nv 203.228653 126.958695 223.132071\nv 203.894980 126.690982 223.538978\nv 202.917856 126.731496 224.102218\nv 205.175149 126.856154 222.026920\nv 206.279594 126.481740 222.418877\nv 205.310222 126.543766 222.960788\nv 207.054317 126.450875 221.879131\nv 206.958835 126.771986 220.879793\nv 207.868632 126.428734 221.273914\nv 208.655938 126.370833 220.742683\nv 208.600717 126.710989 219.653286\nv 209.483505 126.331978 220.121394\nv 210.255060 126.579069 218.521053\nv 211.113651 126.164248 219.090743\nv 210.286876 126.257314 219.601687\nv 212.001770 126.029027 218.594024\nv 211.776782 126.380424 217.620790\nv 212.696717 125.923447 218.204706\nv 213.363856 125.995345 217.225870\nv 212.615354 126.449104 216.431003\nv 213.507481 126.169605 216.425401\nv 214.351551 125.979938 216.108970\nv 215.220720 125.838565 215.504672\nv 215.125152 125.574474 216.615970\nv 215.309840 126.098281 214.406790\nv 214.491286 126.486460 214.013298\nv 215.354007 126.340713 213.422417\nv 216.063499 126.245668 212.824669\nv 216.686765 126.221603 212.050872\nv 216.795827 125.928469 213.042112\nv 216.643662 126.430561 211.275512\nv 216.506011 126.716740 210.325211\nv 216.523135 126.887047 209.601211\nv 217.350012 126.492626 209.993595\nv 195.414184 135.413819 167.876045\nv 194.858728 135.479705 168.686150\nv 194.438201 135.511080 167.796222\nv 193.029170 135.649642 168.487717\nv 193.180980 135.644924 169.283179\nv 192.327404 135.717599 169.164568\nv 187.546765 135.685111 182.382283\nv 186.739397 135.673867 183.110226\nv 186.510478 135.732194 182.212932\nv 181.505040 135.960450 163.399889\nv 182.508855 135.956007 163.404399\nv 182.027297 135.992411 164.184725\nv 184.585419 135.839309 161.725106\nv 185.585919 135.813510 161.714772\nv 185.071416 135.873132 162.576822\nv 186.676792 135.867288 163.325578\nv 187.007782 135.808639 162.558004\nv 187.612659 135.828594 163.317093\nv 196.943454 135.095359 164.038756\nv 197.229189 135.010909 163.188701\nv 197.979669 134.971083 164.037865\nv 194.828473 135.203135 161.838581\nv 195.846569 135.110987 162.172695\nv 195.174878 135.227333 162.855477\nv 193.566832 135.408934 163.182952\nv 194.380571 135.333730 163.237031\nv 193.790620 135.423183 163.898620\nv 190.960532 135.586714 162.314814\nv 191.563176 135.577523 163.041720\nv 190.489059 135.662036 163.183256\nv 190.136750 135.717331 163.971320\nv 190.615699 135.714286 164.746434\nv 189.660747 135.778773 164.807592\nv 189.235910 135.825269 165.591390\nv 188.756962 135.828314 164.816276\nv 187.806896 135.881027 164.842370\nv 187.533233 135.906828 165.513414\nv 187.008004 135.913044 164.755711\nv 185.974957 135.948038 164.874612\nv 186.029217 135.971596 165.787255\nv 185.269834 135.980788 165.235112\nv 183.734305 136.041684 166.338727\nv 184.558900 136.014025 165.842554\nv 184.499499 136.032005 166.643928\nv 182.834063 136.079594 167.704322\nv 183.755267 136.076457 168.017218\nv 182.914425 136.096387 168.581438\nv 182.343268 133.411629 203.866055\nv 182.370181 133.280466 204.652755\nv 181.592650 133.349454 204.306231\nv 182.344201 133.545320 203.078232\nv 212.443807 131.264969 191.213006\nv 211.675913 131.515255 190.813353\nv 212.471829 131.359092 190.249034\nv 214.018733 130.931393 190.177584\nv 213.295299 131.190957 189.666031\nv 214.074308 131.013544 189.194930\nv 214.280172 131.050771 188.081968\nv 215.003606 130.791208 188.593521\nv 216.172572 130.524226 187.416254\nv 215.911902 130.680230 186.514371\nv 215.491109 130.969195 184.529473\nv 214.720449 131.225765 184.435235\nv 215.262178 131.112512 183.610544\nv 217.990674 130.237504 182.986043\nv 217.995774 130.288443 182.126895\nv 218.756496 129.995913 182.639002\nv 192.813816 134.543031 191.997026\nv 193.029978 134.610401 191.132812\nv 193.634963 134.491951 191.830631\nv 211.446269 132.489160 177.645985\nv 210.672420 132.670666 178.223021\nv 210.557972 132.718652 177.379637\nv 213.267281 132.024303 174.442803\nv 212.393172 132.275857 174.460052\nv 212.892469 132.133684 173.563973\nv 214.647432 131.615198 173.492699\nv 214.098596 131.777471 172.812569\nv 214.979449 131.510540 172.758544\nv 215.203295 131.425979 171.767290\nv 214.321369 131.690763 171.251201\nv 215.094051 131.443930 170.940078\nv 216.646782 130.931796 170.843144\nv 215.845383 131.188107 170.422305\nv 216.516189 130.940757 169.809282\nv 216.484262 130.921407 168.939121\nv 215.656896 131.176931 168.471265\nv 216.426368 130.901269 168.021944\nv 214.853338 131.283302 165.302024\nv 214.893017 131.224260 164.575144\nv 215.627625 131.011928 165.119306\nv 216.405077 130.702459 164.607965\nv 216.234067 130.696260 163.699154\nv 216.971840 130.445833 163.914693\nv 194.202805 133.601750 198.595330\nv 194.172647 133.715840 197.747691\nv 194.837011 133.595567 198.197215\nv 214.545712 131.440260 181.717804\nv 213.592168 131.742851 181.307924\nv 214.402582 131.520643 180.932171\nv 213.948021 131.704434 179.776650\nv 214.901566 131.401843 180.186530\nv 215.309926 131.314208 179.049041\nv 214.946988 131.455583 178.110565\nv 215.809908 131.184157 178.128597\nv 216.333430 131.028306 177.312502\nv 216.139726 131.107062 176.254237\nv 217.026186 130.809837 176.376619\nv 216.180383 131.118430 174.378514\nv 216.374523 131.057002 173.308009\nv 217.026621 130.827165 174.247849\nv 208.748351 132.819335 162.282364\nv 209.451432 132.700836 162.993805\nv 208.498767 132.945728 163.104809\nv 206.974842 133.588417 169.281787\nv 206.498875 133.668829 168.442703\nv 207.385381 133.481947 168.610932\nv 197.016461 134.869244 160.367331\nv 196.909653 134.817452 159.442650\nv 197.370007 134.819798 160.358580\nv 200.535423 134.593785 164.053254\nv 200.896231 134.486236 163.143018\nv 201.412388 134.443221 163.964741\nv 202.919251 134.058122 161.946995\nv 202.741082 134.026372 161.038990\nv 203.599818 133.904849 161.588326\nv 201.916855 134.257658 162.226082\nv 201.254570 134.394189 162.549793\nv 207.793671 133.363696 167.890152\nv 207.403879 133.423156 167.029533\nv 208.288135 133.224493 167.147837\nv 198.767850 134.848079 163.833215\nv 198.482115 134.932529 164.683271\nv 191.539244 135.223880 185.695236\nv 191.982407 135.232810 185.134045\nv 192.255527 135.153646 185.938875\nv 208.533433 133.279205 173.395723\nv 207.728916 133.460821 173.092638\nv 208.337193 133.322630 172.699400\nv 208.119177 133.365888 171.811924\nv 208.923694 133.184272 172.115008\nv 209.659190 132.998967 171.543707\nv 209.147557 133.107605 170.498291\nv 210.101069 132.879041 170.814467\nv 210.467655 132.763835 169.831109\nv 210.048412 132.845626 168.960417\nv 210.926631 132.621783 169.022474\nv 211.408742 132.461213 168.173442\nv 211.058559 132.518119 167.371579\nv 211.959912 132.275758 167.393238\nv 212.650881 132.038341 166.592091\nv 211.963729 132.189800 165.805908\nv 213.004881 131.895477 165.806624\nv 211.659794 132.190997 164.312725\nv 211.908899 132.058978 163.500602\nv 212.566833 131.914917 164.208318\nv 213.753505 131.486688 163.285025\nv 213.123272 131.621561 162.574251\nv 214.060839 131.325350 162.463081\nv 214.366335 131.152885 161.641735\nv 213.679576 131.309402 160.969619\nv 214.615305 131.002064 160.859047\nv 182.657802 131.262810 214.884809\nv 182.287373 131.424728 214.219745\nv 183.400182 131.382941 214.319439\nv 197.552356 130.738626 212.300731\nv 197.978253 130.873849 211.402967\nv 198.532096 130.603206 212.293392\nv 201.263722 129.978066 213.177620\nv 201.384081 130.163782 212.246616\nv 202.255902 129.901844 212.765476\nv 213.204449 129.405959 202.516547\nv 213.464656 129.478096 201.657219\nv 213.988920 129.209271 202.320141\nv 214.738102 128.990396 202.237307\nv 215.000702 129.069405 201.310815\nv 215.489676 128.778392 202.087309\nv 216.528354 128.654426 200.840664\nv 215.971987 128.934651 200.261415\nv 216.748064 128.731676 199.941263\nv 216.551310 129.024743 198.538132\nv 217.226490 128.824228 198.366988\nv 216.866877 128.811386 199.190870\nv 217.836260 128.736219 197.593152\nv 217.239928 129.035647 196.989758\nv 218.165265 128.734281 196.868660\nv 218.165265 128.902830 195.695709\nv 218.761597 128.603401 196.299103\nv 182.741477 129.723575 221.136633\nv 181.849452 129.708971 221.240882\nv 201.019225 128.285289 220.054593\nv 201.238197 128.450376 219.326940\nv 201.962684 128.180651 219.817195\nv 200.368254 129.230455 216.884608\nv 200.836502 129.390641 215.917186\nv 201.484119 129.100614 216.632032\nv 213.343659 127.997978 209.279767\nv 213.725444 128.082062 208.361182\nv 214.179379 127.769367 209.144713\nv 215.120149 127.482306 209.079477\nv 215.379256 127.599575 208.137729\nv 215.938241 127.228430 208.991078\nv 216.577686 127.761961 205.455595\nv 216.206433 127.705127 206.343656\nv 215.670125 128.053956 205.552008\nv 216.770290 127.880235 204.549168\nv 216.536520 128.138262 203.643693\nv 217.265431 127.907708 203.528915\nv 182.380889 132.702669 207.911591\nv 183.417923 132.625736 208.257374\nv 182.418306 132.540249 208.757795\nv 196.898433 131.563387 208.787968\nv 195.865675 131.668479 208.878433\nv 196.502882 131.765681 207.967462\nv 196.822687 131.918546 206.986855\nv 197.108007 132.068614 205.983477\nv 197.820961 131.810657 206.873619\nv 199.669400 131.501785 207.142050\nv 199.375581 131.679108 206.416934\nv 200.053532 131.565653 206.485525\nv 216.382589 129.768199 193.753978\nv 215.576499 130.031901 193.709910\nv 216.118585 129.959104 192.868229\nv 215.752508 130.197746 191.872890\nv 216.558599 129.934044 191.916957\nv 217.645019 129.766723 190.168462\nv 218.116165 129.707075 189.237024\nv 179.050754 136.046579 166.611551\nv 179.171568 136.074351 167.725903\nv 178.178346 136.046333 167.076235\nv 155.828745 122.726322 232.745066\nv 154.967599 122.525396 232.649228\nv 155.699939 122.987916 232.008201\nv 147.493826 119.955449 232.348179\nv 146.855401 119.865261 231.962877\nv 147.664228 120.440011 231.433355\nv 144.585308 125.233014 214.074463\nv 145.353270 125.375279 214.639116\nv 144.529559 124.977813 214.921456\nv 147.788002 130.744850 158.724548\nv 148.330220 131.011490 159.571697\nv 147.565518 130.754341 159.526348\nv 180.195598 126.528670 231.651990\nv 180.639088 126.786161 230.921554\nv 181.003864 126.519663 231.708523\nv 180.060735 125.982587 233.215726\nv 180.411544 125.710201 233.993797\nv 179.366944 127.678449 228.132615\nv 180.351476 127.823882 227.727292\nv 180.139758 127.509596 228.704745\nv 180.961799 128.620120 225.144744\nv 180.176115 128.841688 224.350687\nv 181.233939 128.907340 224.159658\nv 180.945653 130.689246 217.401365\nv 181.867924 130.724511 217.213765\nv 181.656491 130.528438 218.031961\nv 180.513080 130.278625 219.061153\nv 181.407927 130.354106 218.776155\nv 181.186788 130.139558 219.617747\nv 180.902739 129.752640 221.077282\nv 181.127046 129.578475 221.700696\nv 179.910262 132.185626 210.548141\nv 180.815796 132.257235 210.193614\nv 180.952003 132.106088 210.941403\nv 181.384314 133.805471 201.440042\nv 180.844261 133.678236 202.279642\nv 180.498841 133.774039 201.630287\nv 180.791120 133.275390 204.706589\nv 180.764207 133.406553 203.919888\nv 179.629500 133.771979 201.598792\nv 180.169553 133.899214 200.759192\nv 180.718236 135.300879 189.130844\nv 180.845269 135.222147 190.023550\nv 179.842008 135.255584 189.581961\nv 181.872104 136.026259 178.046200\nv 182.736135 136.010263 178.185084\nv 182.029280 135.980769 178.983304\nv 180.499732 135.955708 163.399274\nv 180.981290 135.919304 162.618947\nv 178.253434 135.754929 160.349837\nv 178.549850 135.709199 159.599876\nv 179.185136 135.765533 160.351713\nv 176.022467 135.699444 160.336822\nv 176.369601 135.658471 159.590935\nv 177.271015 135.739567 160.343887\nv 173.390571 135.570286 160.177038\nv 173.915252 135.552998 159.572335\nv 174.596373 135.635636 160.188573\nv 168.114299 135.158307 160.314288\nv 168.425727 135.134197 159.498500\nv 168.950977 135.247056 160.329940\nv 167.255070 135.154926 161.824996\nv 166.818184 135.149971 162.530849\nv 166.426650 135.054810 161.702099\nv 165.702646 134.968805 161.630522\nv 166.139532 134.973759 160.924669\nv 164.244142 134.773940 161.438327\nv 163.535943 134.710377 161.934135\nv 163.404393 134.642839 161.193780\nv 161.833767 134.323129 160.253668\nv 160.620493 134.114922 160.216952\nv 161.624872 134.219209 159.337161\nv 159.896347 134.088480 161.662066\nv 159.093927 133.920574 161.373875\nv 160.026968 134.050935 160.845269\nv 159.818073 133.947016 159.928762\nv 157.392985 133.714027 162.963879\nv 157.975526 133.765523 162.176939\nv 158.380765 133.906622 162.977613\nv 155.476137 133.044054 159.869500\nv 155.937212 133.078394 159.136039\nv 156.547180 133.294762 159.913713\nv 154.689194 132.858008 159.965875\nv 155.299161 133.074376 160.743548\nv 154.859905 133.024562 161.484327\nv 155.646848 133.210608 161.387952\nv 157.394593 133.470809 159.915880\nv 156.933518 133.436469 160.649341\nv 152.755209 132.340109 159.740194\nv 152.105305 132.230002 160.428439\nv 151.876052 132.102692 159.671597\nv 149.845152 131.494550 159.603681\nv 150.652322 131.743544 159.608297\nv 150.418977 131.743590 160.355226\nv 151.302226 131.853651 158.920052\nv 150.872633 131.939087 160.970610\nv 150.065463 131.690093 160.965995\nv 149.082256 131.248298 159.560254\nv 148.859771 131.257788 160.362054\nv 144.889500 129.677228 158.536274\nv 145.534313 130.025925 159.470197\nv 144.406410 129.592304 159.393716\nv 145.787004 130.226855 160.465715\nv 146.270093 130.311779 159.608272\nv 146.520352 130.299274 158.645977\nv 146.773042 130.500205 159.641494\nv 147.081593 130.758208 161.185397\nv 147.052252 130.835331 162.125874\nv 146.493442 130.589834 161.544267\nv 145.828330 130.324113 161.309720\nv 145.092550 130.038259 161.171645\nv 145.474564 130.453723 164.366139\nv 144.746445 130.242863 165.076043\nv 144.489716 130.090963 164.282802\nv 145.840968 130.484390 163.028822\nv 146.500859 130.731982 163.179981\nv 145.877726 130.549415 163.724059\nv 144.424503 130.300683 167.701990\nv 144.255296 130.194533 166.895232\nv 144.918203 130.462913 167.390221\nv 143.761597 130.029602 167.142151\nv 144.255296 130.191832 166.830382\nv 145.255132 130.714284 170.779645\nv 144.515062 130.458165 171.172827\nv 144.501667 130.436524 170.344124\nv 145.164573 130.630853 169.073961\nv 144.501667 130.416474 169.865875\nv 144.424503 130.354684 168.988893\nv 143.761597 130.086304 168.493904\nv 144.490331 130.484423 173.945532\nv 145.187811 130.719316 174.373278\nv 144.459077 130.468397 174.856243\nv 146.083304 131.000223 171.166556\nv 146.851149 131.269137 171.671971\nv 146.036371 131.004839 172.113763\nv 143.761597 130.160355 170.259056\nv 145.195919 130.710433 176.207885\nv 145.744086 130.901616 175.682213\nv 145.783448 130.908759 176.606109\nv 146.011640 131.004548 173.040872\nv 146.715701 131.245165 173.557352\nv 145.923126 130.975959 173.979046\nv 144.498439 130.450012 177.699516\nv 145.494631 130.776656 178.311941\nv 144.757789 130.509093 178.879676\nv 146.074553 130.901567 180.502758\nv 146.710124 131.116713 180.034438\nv 147.030697 131.182543 181.045095\nv 144.456614 130.263965 182.135325\nv 144.456614 130.211238 182.981852\nv 143.761597 129.993972 182.629928\nv 144.539643 130.007759 186.433948\nv 144.539643 129.923285 187.420335\nv 143.761597 129.733424 186.389162\nv 144.494094 129.677089 189.770545\nv 144.494094 129.572567 190.709792\nv 143.761597 129.376527 190.202797\nv 143.761597 127.971348 200.314698\nv 144.633682 128.249512 200.476669\nv 144.633682 128.187763 200.855469\nv 145.171852 128.201959 201.825371\nv 145.869491 128.436368 201.897526\nv 145.535577 128.172400 202.705456\nv 144.270939 127.348992 204.587747\nv 144.270939 127.199819 205.309446\nv 143.761597 127.215824 204.349705\nv 144.385233 126.589086 208.339101\nv 145.063025 126.764370 208.668657\nv 144.439389 126.360282 209.414258\nv 144.439389 126.096509 210.494382\nv 143.761597 125.921224 210.164826\nv 145.744408 126.708178 209.972365\nv 145.961760 126.532295 210.999330\nv 145.334533 126.359684 210.770779\nv 144.480781 122.171687 223.635113\nv 145.085305 122.275843 224.035169\nv 144.366121 121.822782 224.468633\nv 146.133854 125.491149 215.273804\nv 146.709587 125.558750 215.786079\nv 145.873253 125.187679 215.998384\nv 144.513038 123.834336 218.785149\nv 144.513038 123.752885 219.053703\nv 143.761597 123.600349 218.563247\nv 143.761597 122.806927 220.985797\nv 144.505626 123.164239 220.813642\nv 144.505626 122.926915 221.531640\nv 144.580515 120.973654 226.913871\nv 143.761597 120.712902 226.674843\nv 144.580515 121.205256 226.322021\nv 145.185040 121.696473 225.714869\nv 144.366121 121.435721 225.475841\nv 143.761597 121.331565 225.075785\nv 144.547375 119.384731 230.664449\nv 144.303562 119.592995 229.943981\nv 145.089341 119.839923 230.220733\nv 143.761597 119.548153 229.441895\nv 144.303562 120.003346 228.998180\nv 144.425514 120.315111 228.376760\nv 144.967479 120.359952 228.878845\nv 143.761597 120.219902 227.881394\nv 144.425514 120.576509 227.762059\nv 145.244432 121.068863 227.409237\nv 143.813851 118.637753 231.523148\nv 144.599629 118.884681 231.799901\nv 145.757176 119.405080 231.891652\nv 145.023651 118.658102 232.750351\nv 151.226519 122.382403 229.998823\nv 151.924084 122.365092 230.636524\nv 150.953410 121.925794 230.919993\nv 150.051565 121.569879 230.999214\nv 150.749130 121.552568 231.636914\nv 157.860613 124.557636 229.397443\nv 158.207246 124.363491 230.141170\nv 157.334672 124.163381 230.075215\nv 164.024684 125.368438 230.709471\nv 164.516709 125.166007 231.511393\nv 163.483698 125.029768 231.409676\nv 169.720501 125.056500 233.878501\nv 169.105538 125.276151 233.076479\nv 170.298039 125.407999 233.099725\nv 175.172470 126.751875 230.468083\nv 175.156184 126.485609 231.223742\nv 174.334351 126.650763 230.601385\nv 179.493024 127.079666 229.987545\nv 178.927936 126.767407 230.877475\nv 178.590138 127.051905 229.999998\nv 156.834578 123.777006 230.749660\nv 156.487945 123.971152 230.005933\nv 156.913821 123.015096 232.795992\nv 156.181481 122.552577 233.437019\nv 160.127905 124.709333 230.408910\nv 159.100164 124.534516 230.275524\nv 159.760927 124.932563 229.596783\nv 160.460599 125.836119 227.397452\nv 160.612683 126.118764 226.651714\nv 161.271313 126.062628 227.225256\nv 158.465726 126.268357 224.797077\nv 157.630103 125.920592 225.258986\nv 157.713849 126.264085 224.279133\nv 157.555209 126.497954 223.422765\nv 157.268808 126.721924 222.446783\nv 158.263071 126.835819 222.841241\nv 164.075127 124.261224 233.738296\nv 163.416687 124.438893 232.956347\nv 164.634163 124.649668 232.993547\nv 161.142024 124.780763 230.822489\nv 161.890171 125.169789 230.168961\nv 162.243527 124.843173 231.261282\nv 161.680973 125.395468 229.396668\nv 160.953949 125.443682 228.850581\nv 161.846254 125.731769 228.517081\nv 161.025165 126.698966 225.151138\nv 160.396698 126.785101 224.465321\nv 161.298656 126.997034 224.358873\nv 160.121962 127.163627 223.032318\nv 159.609831 126.847509 223.745140\nv 159.061604 126.927967 223.104402\nv 166.885964 124.994880 233.009074\nv 165.994827 124.862337 233.016399\nv 166.803491 125.273919 232.230368\nv 164.572409 125.623249 230.253836\nv 164.847724 125.921754 229.524131\nv 165.333009 125.803183 230.081483\nv 164.075505 128.010339 222.552448\nv 163.706460 127.677542 223.462353\nv 163.037306 127.835472 222.585931\nv 163.214230 127.366542 224.250093\nv 162.843661 127.070653 225.024520\nv 162.297692 127.206787 224.270263\nv 168.111314 125.165557 233.039149\nv 168.688852 125.517057 232.260373\nv 167.927596 125.969565 230.685194\nv 167.921218 126.222481 229.958058\nv 168.772253 126.256964 230.182435\nv 166.494457 125.538229 231.349255\nv 165.485024 125.323027 231.524440\nv 166.067127 125.719880 230.636003\nv 165.031224 127.172415 225.856036\nv 164.097294 127.031729 225.844718\nv 164.694129 127.371094 225.015667\nv 164.267406 128.466360 221.077430\nv 163.283392 128.424433 220.658969\nv 164.144447 128.722525 220.060373\nv 168.236630 125.705255 231.566307\nv 169.230854 125.815849 231.603637\nv 169.655433 126.161678 230.745170\nv 170.107655 125.973479 231.439236\nv 150.668123 126.393729 217.508403\nv 149.919108 126.318326 216.950634\nv 150.662015 126.616720 216.670685\nv 149.383130 126.059107 217.295444\nv 149.377023 126.282098 216.457726\nv 148.969759 123.900811 223.733161\nv 149.833196 124.123077 223.989276\nv 149.065234 123.630558 224.592637\nv 146.333689 121.919577 226.405893\nv 146.935127 121.924494 227.064166\nv 146.000872 121.470926 227.219322\nv 145.845870 121.073781 228.067510\nv 146.379795 121.067246 228.637729\nv 145.623356 120.665182 228.827645\nv 145.501404 120.353418 229.449064\nv 145.745217 120.145154 230.169532\nv 155.213190 126.872200 220.255456\nv 154.459884 126.725879 220.103494\nv 155.089877 127.041429 219.538893\nv 153.775494 126.456337 220.412696\nv 153.652180 126.625565 219.696132\nv 154.348227 125.768954 223.154532\nv 155.141742 125.928548 223.322191\nv 154.585025 125.562242 223.971325\nv 152.525733 124.833476 224.433062\nv 152.099268 124.473870 225.129741\nv 151.784541 124.628444 224.377921\nv 153.278316 124.062197 227.306191\nv 154.107590 124.317057 227.292226\nv 153.748481 123.950087 227.973785\nv 150.879179 122.857172 228.474721\nv 151.738544 123.008541 228.819172\nv 151.337829 122.670332 229.370903\nv 150.367155 122.231034 229.654372\nv 149.474268 120.763936 232.380741\nv 150.556745 121.149725 232.448766\nv 150.183728 120.717009 233.113371\nv 156.822416 128.034247 217.455495\nv 157.727288 128.419221 216.752280\nv 157.992793 128.227124 217.681655\nv 156.396460 126.598209 222.180294\nv 157.104322 126.936074 221.598770\nv 155.732944 126.259659 222.766852\nv 155.969743 126.052948 223.583646\nv 155.554207 125.557042 224.785678\nv 156.128383 125.819079 224.440014\nv 156.304051 125.654284 225.086707\nv 154.019817 124.752203 225.975990\nv 154.822770 124.974727 225.970792\nv 154.440378 124.651691 226.619435\nv 155.767974 124.305557 228.589975\nv 156.598328 124.522652 228.612913\nv 156.157685 124.140431 229.308550\nv 154.079062 123.377428 229.766517\nv 153.256315 123.012526 230.060131\nv 153.019940 123.186603 229.421740\nv 153.803308 122.868299 230.894193\nv 152.744187 122.677475 230.549416\nv 153.081225 128.580183 211.595986\nv 152.956638 128.782929 210.612430\nv 153.770916 128.876131 211.124816\nv 152.184521 126.280430 219.485412\nv 152.211420 126.519863 218.667989\nv 152.994690 126.595456 219.187909\nv 151.287701 125.386418 221.525061\nv 152.188929 125.727599 221.312724\nv 152.113587 125.433842 222.168783\nv 150.475040 124.742995 222.755461\nv 151.077323 124.821804 223.088276\nv 150.340004 124.472139 223.462616\nv 150.921010 123.876375 225.740682\nv 151.680584 124.103788 225.802731\nv 151.243519 123.711325 226.468813\nv 149.317462 122.858032 227.007272\nv 148.937015 122.443033 227.747410\nv 148.541866 122.583129 226.981536\nv 149.419099 122.352890 228.444384\nv 148.643503 122.077987 228.418648\nv 148.384778 121.679254 229.166292\nv 148.898580 121.614108 229.814221\nv 148.157771 121.305518 229.864891\nv 147.848688 120.795097 230.780436\nv 148.487113 120.885286 231.165738\nv 148.701952 120.430710 232.432002\nv 147.893124 119.855960 232.961524\nv 146.189603 125.746350 214.426811\nv 146.262103 126.011551 213.490179\nv 147.042687 126.127421 214.124868\nv 148.437499 128.629653 205.254726\nv 149.176474 128.736201 205.854909\nv 148.336614 128.396151 206.246631\nv 149.709699 128.742607 206.625882\nv 149.810583 128.976109 205.633977\nv 145.254086 124.282189 218.256613\nv 144.502645 124.129654 217.766157\nv 147.977087 125.528618 217.478073\nv 148.244769 125.835095 216.741169\nv 148.573363 125.716402 217.539440\nv 147.613811 126.184420 214.646905\nv 147.686311 126.449621 213.710273\nv 148.085396 125.954076 216.093255\nv 148.681672 126.141859 216.154622\nv 151.051019 129.095396 206.786130\nv 151.143677 128.945439 207.610950\nv 150.436466 128.832558 207.229769\nv 150.879963 129.493496 204.448477\nv 151.525939 129.753752 204.016843\nv 151.792231 129.651755 204.923545\nv 166.373711 135.134234 163.103059\nv 167.202131 135.234350 163.225956\nv 165.946930 135.174030 164.630506\nv 165.928338 135.131121 163.920808\nv 166.776250 135.261522 164.507863\nv 168.143076 135.260627 161.899737\nv 169.059299 135.360124 162.048520\nv 168.562826 135.349584 162.802529\nv 169.965937 135.338370 160.403143\nv 169.654509 135.362480 161.218931\nv 167.696485 135.414677 165.780204\nv 167.511192 135.352443 164.819635\nv 168.412834 135.462689 165.382278\nv 173.365425 135.631814 161.107565\nv 172.684304 135.549176 160.491327\nv 171.616627 135.668105 164.071427\nv 170.952855 135.649402 164.897524\nv 170.693966 135.598026 163.982770\nv 169.229468 135.602375 167.362455\nv 169.689231 135.614283 166.453481\nv 170.320571 135.691735 167.473090\nv 172.932636 135.683093 162.429705\nv 173.560035 135.681435 161.798552\nv 173.833514 135.753824 162.806403\nv 174.718886 135.695112 161.007180\nv 175.243566 135.677825 160.402477\nv 171.645312 135.816809 168.702280\nv 172.345064 135.851201 168.149255\nv 172.356687 135.863502 168.902195\nv 175.789342 135.786482 161.839826\nv 175.336760 135.793915 162.316909\nv 174.913496 135.744734 161.698167\nv 176.144979 135.758920 161.155429\nv 176.658550 135.886978 163.236827\nv 177.147605 135.862441 162.510537\nv 177.593548 135.913755 163.288796\nv 177.906300 135.795901 161.095724\nv 175.354301 125.533150 233.962547\nv 174.700141 125.745668 233.247372\nv 176.000640 125.823221 233.261021\nv 179.392584 130.207387 219.278207\nv 179.613724 130.421935 218.436615\nv 179.155583 131.618882 213.248374\nv 180.080591 131.768694 212.579869\nv 180.283189 131.610621 213.354393\nv 178.947855 132.774525 207.471380\nv 179.447582 132.876508 206.929490\nv 179.704298 132.755124 207.642042\nv 180.529470 134.663016 195.122545\nv 180.394647 134.780859 194.132483\nv 181.337559 134.750884 194.411270\nv 172.144313 128.821974 223.142514\nv 172.698739 129.009690 222.601957\nv 172.943362 128.822927 223.357431\nv 181.198837 136.134839 172.446257\nv 181.060513 136.124567 173.313203\nv 180.166482 135.771779 160.353640\nv 179.870066 135.817509 161.103601\nv 174.770059 135.893987 165.359295\nv 175.064559 135.935467 166.248070\nv 174.060431 135.884596 166.096725\nv 167.715591 132.670103 204.116564\nv 168.500037 132.871949 203.345679\nv 168.713005 132.748098 204.238219\nv 167.436511 131.711801 209.122553\nv 168.403498 131.881585 208.773044\nv 168.289633 131.704442 209.604841\nv 170.336342 132.560819 206.202203\nv 169.804586 132.420550 206.705894\nv 169.572830 132.544523 205.928451\nv 171.354965 133.621627 200.225381\nv 170.589842 133.519284 200.545445\nv 170.574492 133.637432 199.733110\nv 175.537959 135.651751 183.363466\nv 175.780035 135.610425 184.044694\nv 175.010992 135.580331 184.021810\nv 173.432654 135.236744 187.534073\nv 172.567428 135.219568 187.127297\nv 173.223843 135.278330 186.816840\nv 180.413697 135.869158 161.861930\nv 181.419005 135.873901 161.862545\nv 147.573587 131.396984 179.819055\nv 146.617443 131.116008 179.276719\nv 148.133590 131.663600 176.759951\nv 147.633849 131.486878 177.610026\nv 147.288053 131.394650 176.752774\nv 146.271146 131.026833 178.547476\nv 146.011796 130.967752 177.367315\nv 147.207490 131.393974 175.199112\nv 147.059704 131.335657 175.991568\nv 146.479400 131.158259 175.287981\nv 145.891872 130.959933 174.889757\nv 144.498439 130.467087 176.454544\nv 143.761597 130.199524 177.022278\nv 151.707564 132.687293 175.756728\nv 150.744470 132.418849 176.217214\nv 150.782010 132.447716 175.286214\nv 152.113355 132.822924 172.164835\nv 152.948712 133.023004 171.922174\nv 152.774651 132.991074 172.809773\nv 149.995077 132.235627 174.672586\nv 149.077065 131.971674 174.887827\nv 149.253225 132.028029 173.813713\nv 149.682131 132.122376 170.738158\nv 149.524438 132.097749 171.861222\nv 148.741386 131.847728 170.938321\nv 150.714335 132.367055 168.877397\nv 150.000341 132.189151 169.795981\nv 149.613073 132.050259 168.896673\nv 147.740887 131.543811 171.393074\nv 147.898581 131.568438 170.270011\nv 150.033023 132.100645 167.013809\nv 149.318064 131.921289 167.722614\nv 149.024020 131.793771 166.758334\nv 146.002774 130.924167 169.379442\nv 145.925611 130.862376 168.502460\nv 147.032776 131.115480 166.067180\nv 147.999612 131.453439 166.356744\nv 147.342225 131.276457 167.177574\nv 145.731399 130.753780 167.542494\nv 145.562192 130.647630 166.735736\nv 146.710728 130.949042 165.202865\nv 146.053341 130.772060 166.023695\nv 147.743101 131.242195 164.257951\nv 147.113890 131.044734 164.560784\nv 147.166828 130.994467 163.572386\nv 144.255296 130.118433 165.788084\nv 143.761597 129.953503 166.035004\nv 151.376300 132.613626 171.469147\nv 151.202239 132.581695 172.356747\nv 154.076161 133.244254 168.727691\nv 153.724055 133.172166 169.425149\nv 153.225090 133.036999 168.877366\nv 152.580200 132.909883 170.426030\nv 151.694510 132.680401 170.526971\nv 151.987294 132.735429 169.675765\nv 154.258568 133.235128 167.053127\nv 154.297746 133.271723 167.883402\nv 153.538018 133.072491 167.349633\nv 151.607762 132.616918 168.927634\nv 151.220494 132.478025 168.028325\nv 153.097974 132.893146 165.718419\nv 152.516541 132.766729 166.461677\nv 152.115674 132.623980 165.660738\nv 150.930654 132.362862 167.191043\nv 150.636610 132.235345 166.226763\nv 152.455296 132.624944 164.131825\nv 151.862458 132.506737 164.820991\nv 151.620648 132.381284 164.035336\nv 150.383394 132.118102 165.387016\nv 149.555711 131.854185 165.112231\nv 150.200127 131.999160 164.449718\nv 152.020510 132.392507 162.581830\nv 151.448967 132.275345 163.186418\nv 151.255992 132.168360 162.422078\nv 149.252175 131.619418 163.141718\nv 148.584241 131.463585 163.722243\nv 148.463972 131.347760 162.689027\nv 151.173327 132.085556 161.699435\nv 150.601783 131.968395 162.304022\nv 147.718221 131.097816 162.518279\nv 148.386154 131.253649 161.937753\nv 149.825512 131.694592 161.844941\nv 149.371856 131.499094 161.229557\nv 148.619820 131.262287 161.241000\nv 156.527181 133.767651 168.012457\nv 155.673771 133.595359 168.244083\nv 155.871705 133.606653 167.355270\nv 155.236844 133.439007 166.695143\nv 154.477116 133.239774 166.161374\nv 153.894008 133.083024 165.712834\nv 153.493142 132.940275 164.911894\nv 156.097669 133.366861 162.145968\nv 156.427039 133.503327 163.029977\nv 155.536962 133.297259 163.012739\nv 153.322792 132.854838 164.217548\nv 153.080982 132.729386 163.431893\nv 154.328269 132.938630 162.062356\nv 153.980582 132.802398 161.417952\nv 152.831216 132.607979 162.671075\nv 152.638241 132.500994 161.906736\nv 153.748340 132.677875 160.668480\nv 153.925316 132.647553 159.794432\nv 155.624618 133.634819 174.563023\nv 154.911985 133.481381 174.512677\nv 155.440289 133.600600 173.697131\nv 155.569476 133.634740 171.436577\nv 156.454199 133.821566 171.370521\nv 156.156789 133.755503 172.190382\nv 154.255167 133.336814 174.805845\nv 154.210297 133.305402 175.687943\nv 153.369149 133.126616 175.115219\nv 149.225893 131.706967 183.439131\nv 148.241399 131.451026 183.065261\nv 149.082316 131.714663 182.605777\nv 151.032792 132.425294 179.163464\nv 151.663170 132.588280 179.365008\nv 151.023161 132.402453 179.880682\nv 145.824719 130.278317 188.340213\nv 146.188549 130.460279 187.626366\nv 146.695578 130.540975 188.501459\nv 147.542084 131.203886 183.498979\nv 147.691105 131.195325 184.292158\nv 146.848212 130.955880 183.892521\nv 144.361066 129.791545 188.098311\nv 144.361066 129.707595 189.042312\nv 143.761597 129.564999 188.319549\nv 162.767171 134.503346 160.531732\nv 161.762791 134.399059 161.411523\nv 160.935022 134.299840 162.052867\nv 160.001981 134.169479 162.581474\nv 155.221006 133.540112 169.946094\nv 155.452186 133.567889 169.088371\nv 156.098067 133.728579 169.758992\nv 157.825577 133.929335 165.257589\nv 158.435011 134.080174 165.894349\nv 157.743919 133.940183 166.011594\nv 154.168832 133.319158 173.106949\nv 154.441037 133.379915 172.411775\nv 154.999861 133.507919 172.951612\nv 150.912864 132.448912 177.288101\nv 149.987310 132.209335 176.817587\nv 152.676657 132.974511 173.642778\nv 152.579562 132.937094 174.529424\nv 151.842199 132.753576 173.939082\nv 147.398507 131.211581 182.665624\nv 149.317545 131.997613 177.752838\nv 149.525424 132.028687 178.621989\nv 148.687265 131.786902 178.486354\nv 144.850807 130.166616 185.654912\nv 144.552263 130.129705 184.752670\nv 145.641474 130.478423 185.004807\nv 146.547159 130.965919 182.306379\nv 145.925411 130.722835 182.793296\nv 145.773378 130.724313 182.000332\nv 165.339012 134.827979 160.143549\nv 164.764060 134.797078 160.775532\nv 164.687545 134.737303 160.065989\nv 163.171052 134.801195 164.488868\nv 162.376796 134.704442 165.142375\nv 162.217583 134.639465 164.199959\nv 150.837099 132.121670 183.799797\nv 150.782332 132.045503 184.766132\nv 150.012043 131.894436 183.945983\nv 152.086268 132.644527 180.677103\nv 151.720805 132.512300 181.273053\nv 151.288076 132.433213 180.678177\nv 146.564996 130.349381 190.024469\nv 146.012418 130.106439 190.555586\nv 145.779170 130.116071 189.746423\nv 143.761597 128.602326 196.306302\nv 144.553560 128.923977 195.979244\nv 144.553560 128.755253 197.152794\nv 149.700485 130.391727 197.183130\nv 149.100053 130.158495 197.600142\nv 148.978686 130.240701 196.794325\nv 149.247436 130.968902 191.873859\nv 149.273428 130.863721 192.772550\nv 148.444085 130.687943 192.273195\nv 145.357197 127.955220 203.486111\nv 146.054836 128.189629 203.558267\nv 147.018004 129.296035 199.033484\nv 146.251458 128.964580 199.467456\nv 146.173690 129.101377 198.499651\nv 143.761597 127.405098 203.412056\nv 144.299768 127.691594 202.914704\nv 144.299768 127.651494 203.130654\nv 144.299768 127.923795 201.663399\nv 143.761597 127.677399 201.944801\nv 147.786043 130.539001 191.808821\nv 146.976119 130.312314 191.538385\nv 147.608168 130.566436 191.104068\nv 151.053352 131.925402 187.265611\nv 151.903229 132.153819 187.160945\nv 151.674604 132.014824 188.057451\nv 146.142879 129.254868 197.445708\nv 146.112869 129.396559 196.431206\nv 146.910226 129.574522 197.051177\nv 146.051076 127.816542 205.380187\nv 145.502988 127.496811 205.984470\nv 145.328369 127.652717 204.943205\nv 145.713303 126.898827 209.108050\nv 146.340530 127.071438 209.336601\nv 149.281389 129.948232 199.402973\nv 149.388121 129.819299 200.326035\nv 148.617333 129.655573 199.943746\nv 149.870559 130.676567 195.515991\nv 150.547797 130.833141 195.742398\nv 150.256356 130.630506 196.603721\nv 166.762884 135.324326 165.911975\nv 165.955632 135.238684 166.282401\nv 165.987590 135.218788 165.587988\nv 171.130309 126.061996 231.488421\nv 171.594445 126.342890 230.799012\nv 172.192520 126.085577 231.706664\nv 172.654937 125.861135 232.460082\nv 173.435769 125.660719 233.231921\nv 172.509215 125.604267 233.167912\nv 210.937585 150.475874 162.203628\nv 211.569053 149.619304 162.052596\nv 210.604387 149.669044 162.061362\nv 205.576750 136.124937 159.673213\nv 204.871299 136.340615 159.711239\nv 205.235190 137.121479 159.848921\nv 193.234317 139.027226 160.184933\nv 193.912922 139.425674 160.255190\nv 194.090525 138.644223 160.117401\nv 202.741523 139.053184 160.189489\nv 201.996728 138.410774 160.076232\nv 201.928000 139.417840 160.253795\nv 192.874247 148.307353 161.821272\nv 193.190039 147.651542 161.705633\nv 192.232401 147.691097 161.712618\nv 154.309776 133.681497 159.242367\nv 154.767287 134.887009 159.454933\nv 155.323680 134.033198 159.304392\nv 154.749106 141.829397 160.679069\nv 154.577381 142.598830 160.814737\nv 155.488074 142.161545 160.737632\nv 154.352165 145.023832 161.242318\nv 153.478700 145.037707 161.244773\nv 153.997253 145.915656 161.399575\nv 156.981740 146.174559 161.445205\nv 156.146564 146.564016 161.513864\nv 156.748970 146.909911 161.574863\nv 156.618029 147.780108 161.728304\nv 157.453205 147.390651 161.659644\nv 218.761597 129.368102 232.172473\nv 218.761597 130.329485 232.173016\nv 218.761597 129.996848 233.001673\nv 218.761597 143.957997 161.975156\nv 218.761597 142.672003 161.748399\nv 218.761597 143.389537 160.954121\nv 218.761597 144.460516 162.856648\nv 218.761597 145.178049 162.062370\nv 218.761597 137.535344 167.531081\nv 218.761597 138.320831 168.056839\nv 218.761597 137.400598 168.377594\nv 218.761597 147.100343 169.339719\nv 218.761597 147.928243 169.054347\nv 218.761597 147.797781 169.911151\nv 218.761597 149.381005 171.598441\nv 218.761597 149.302579 172.461283\nv 218.761597 148.443991 172.145418\nv 218.761597 128.353911 222.383653\nv 218.761597 127.448258 222.279982\nv 218.761597 127.852647 221.552653\nv 218.761597 140.102166 176.672247\nv 218.761597 140.721235 177.432853\nv 218.761597 139.531886 177.447250\nv 218.761597 135.695488 188.211963\nv 218.761597 136.582624 187.925210\nv 218.761597 136.197689 188.878773\nv 218.761597 125.695810 213.450570\nv 218.761597 125.478959 214.239198\nv 218.761597 134.152010 198.077698\nv 218.761597 133.572217 197.227271\nv 218.761597 134.440054 197.164096\nv 218.761597 142.138634 200.163748\nv 218.761597 142.988459 200.033534\nv 218.761597 142.834919 200.900130\nv 218.761597 144.919730 203.759385\nv 218.761597 145.742209 203.932201\nv 218.761597 145.148143 204.586155\nv 218.761597 140.996241 210.463873\nv 218.761597 141.774672 210.865337\nv 218.761597 141.087232 211.113486\nv 218.761597 139.488563 211.145218\nv 218.761597 140.317740 211.526317\nv 218.761597 139.497503 211.959513\nv 218.043681 130.332956 234.808930\nv 217.986185 131.291555 234.977960\nv 217.268269 130.597249 234.855526\nv 213.451426 121.296574 233.215568\nv 213.675875 121.216547 233.201443\nv 148.425267 136.755100 235.941312\nv 148.795436 135.830228 235.778228\nv 149.398707 136.537085 235.902862\nv 215.326365 137.107360 236.003417\nv 215.754087 137.967177 236.155021\nv 214.726852 137.838198 236.132256\nv 152.473070 139.512486 236.427529\nv 152.815867 140.481773 236.598406\nv 151.909202 140.290814 236.564719\nv 160.076486 124.359235 233.755558\nv 161.089920 124.776773 233.829169\nv 160.536509 125.527304 233.961527\nv 165.868050 127.187493 234.254281\nv 166.430981 126.386695 234.113070\nv 166.748976 127.319564 234.277557\nv 169.671910 127.735787 234.350939\nv 170.328645 126.895580 234.202794\nv 170.670024 127.842354 234.369729\nv 173.202628 126.314716 234.100365\nv 173.671924 125.429724 233.944324\nv 173.584506 126.340589 234.104938\nv 174.428515 126.656690 234.160685\nv 175.062979 126.216102 234.082994\nv 175.437692 127.417195 234.294782\nv 188.284359 127.979166 234.393868\nv 189.072890 128.055095 234.407256\nv 188.636691 128.846396 234.546780\nv 188.895656 137.650154 236.099096\nv 189.078818 138.550959 236.257931\nv 188.290979 138.243954 236.203796\nv 186.262066 131.497730 235.014265\nv 185.808693 132.361610 235.166601\nv 185.304785 131.702064 235.050330\nv 183.398256 126.209370 234.081834\nv 183.035463 126.927760 234.208508\nv 182.615112 126.421088 234.119167\nv 182.148759 143.810233 237.185334\nv 182.006249 144.691894 237.340798\nv 181.404810 143.814734 237.186136\nv 199.094335 142.557050 236.964352\nv 198.202644 142.662800 236.983008\nv 198.443478 141.767152 236.825061\nv 195.322392 143.412896 237.115254\nv 195.537304 143.875649 237.196850\nv 194.665391 143.482346 237.127503\nv 190.424455 138.354648 236.223319\nv 190.550361 139.112645 236.356972\nv 189.809401 138.715157 236.286883\nv 143.761597 139.055302 235.611702\nv 143.761597 138.812193 235.190761\nv 143.761597 138.546091 235.879062\nv 143.761597 136.823201 235.218659\nv 143.761597 136.393840 234.487061\nv 143.761597 135.772526 235.112193\nv 143.761597 146.946711 163.117882\nv 143.761597 147.591621 162.485801\nv 143.761597 146.602607 162.266473\nv 143.761597 143.646200 161.868783\nv 143.761597 143.389537 160.954121\nv 143.761597 142.360206 161.642026\nv 143.761597 135.096918 167.873860\nv 143.761597 136.054113 168.097112\nv 143.761597 135.858295 167.236099\nv 143.761597 149.458355 176.390508\nv 143.761597 149.458535 175.479845\nv 143.761597 148.689885 175.943298\nv 143.761597 131.048093 176.699862\nv 143.761597 131.901167 176.693806\nv 143.761597 131.069673 175.771250\nv 143.761597 134.381176 183.976140\nv 143.761597 133.484260 184.135443\nv 143.761597 134.185958 184.959133\nv 143.761597 135.002004 190.527315\nv 143.761597 134.052999 190.467839\nv 143.761597 134.494990 191.306718\nv 143.761597 126.193941 223.892026\nv 143.761597 127.044892 224.090186\nv 143.761597 126.704196 223.432457\nv 143.761597 136.914089 221.168110\nv 143.761597 137.590692 221.790935\nv 143.761597 137.759389 220.758379\nv 143.761597 141.669051 201.455062\nv 143.761597 142.718483 201.279356\nv 143.761597 141.867598 200.583952\nv 143.761597 139.647242 212.470303\nv 143.761597 140.086833 213.243760\nv 143.761597 140.635985 212.396881\nv 143.761597 145.361962 211.526440\nv 143.761597 145.509999 210.715250\nv 143.761597 144.623868 210.995490\nv 143.761597 146.404658 205.249316\nv 143.761597 145.415896 205.818082\nv 143.761597 146.361434 206.118120\nv 144.531694 150.438404 171.128867\nv 145.311346 150.638775 170.081235\nv 144.541249 150.418770 169.972862\nv 144.584758 149.688574 189.978050\nv 144.558422 149.602947 190.867848\nv 145.381582 149.843568 190.686100\nv 143.761597 145.618006 214.053351\nv 144.506624 145.602952 215.078376\nv 144.506624 145.860839 213.938829\nv 146.681758 146.021459 215.945298\nv 145.955118 145.841762 215.835405\nv 145.976139 145.655529 216.661561\nv 166.814330 154.355586 163.715136\nv 168.092392 154.474115 163.736021\nv 167.126739 154.350870 162.886914\nv 154.234802 152.476822 162.556449\nv 153.447820 152.364423 163.464167\nv 154.204572 152.521848 163.491915\nv 151.068082 151.883891 164.332838\nv 150.343181 151.765097 165.291278\nv 151.130649 151.944029 165.318663\nv 146.638100 150.714815 163.122483\nv 147.686562 150.999753 163.172731\nv 147.251091 150.823262 162.264906\nv 143.761597 149.875755 162.979302\nv 144.683132 150.199031 163.895156\nv 144.683132 150.142780 163.003761\nv 144.982113 150.178914 162.151282\nv 145.903648 150.502190 163.067137\nv 147.819254 151.090103 164.108054\nv 147.316417 150.989639 164.674678\nv 148.062100 151.188437 164.752424\nv 154.201240 152.562361 164.410792\nv 154.988222 152.674759 163.503075\nv 162.790889 153.910966 163.615073\nv 161.769075 153.783723 163.583602\nv 162.404965 153.891390 164.408270\nv 160.386594 153.586273 163.580396\nv 160.597922 153.653893 164.388997\nv 161.171823 153.696527 163.568199\nv 159.186823 153.408266 163.549012\nv 159.760724 153.450899 162.728215\nv 164.017185 154.114113 165.237155\nv 163.398315 154.046577 165.261729\nv 163.988721 154.142057 166.059143\nv 168.740431 154.559862 164.592480\nv 169.052840 154.555147 163.764258\nv 169.849791 154.614248 163.774706\nv 170.631993 154.697996 164.593294\nv 170.780905 154.671350 163.747284\nv 169.201752 154.528500 162.918248\nv 171.495158 154.778784 165.351621\nv 172.327888 154.822176 165.362966\nv 172.395837 154.798491 164.577217\nv 175.176727 154.889445 163.797656\nv 175.912567 154.941295 164.627659\nv 176.095734 154.918244 163.807801\nv 176.710032 154.996473 165.546644\nv 177.249068 155.026270 166.132591\nv 177.370610 154.999891 165.223752\nv 177.757941 154.984890 164.638989\nv 178.296977 155.014688 165.224937\nv 180.171560 154.963615 179.926795\nv 180.061122 154.928417 180.626161\nv 180.941115 154.936181 180.604218\nv 181.124210 154.710472 184.753148\nv 180.362622 154.695225 184.943433\nv 181.067941 154.663746 185.507493\nv 180.672980 153.949252 193.670159\nv 180.500995 154.049133 192.703410\nv 179.754540 153.965351 193.443561\nv 179.850174 153.419284 198.280603\nv 180.652262 153.363942 198.732673\nv 180.696267 153.525596 197.509771\nv 180.767634 152.030582 207.788051\nv 179.887762 152.036001 207.717044\nv 180.019035 151.889002 208.612978\nv 181.960457 145.951451 233.473308\nv 181.216293 145.907401 233.619175\nv 182.009859 145.649246 234.430222\nv 177.036777 145.414788 234.927019\nv 177.657447 145.153724 235.771408\nv 177.829267 145.428332 234.950600\nv 179.101793 145.439995 235.009513\nv 179.236963 145.179994 235.805342\nv 179.888819 145.452721 235.019867\nv 175.748810 144.831037 236.522205\nv 176.637678 144.870741 236.536313\nv 175.976089 145.100475 235.733719\nv 173.597755 144.454345 237.298897\nv 173.730651 144.733233 236.481657\nv 173.174903 144.704181 236.476553\nv 172.562720 145.217062 234.777136\nv 171.978742 145.395866 234.090450\nv 171.501794 145.047524 235.043117\nv 169.663116 145.218267 234.016466\nv 168.721260 144.924552 234.636192\nv 169.975961 144.932613 234.976157\nv 168.346528 144.292849 236.402643\nv 168.288326 144.541347 235.640621\nv 167.600748 144.195298 236.447382\nv 166.804127 144.343691 235.724635\nv 166.862329 144.095192 236.486657\nv 166.678243 144.556474 235.034484\nv 165.939824 144.456368 235.073759\nv 164.179051 143.755646 236.447459\nv 163.974327 143.960136 235.765343\nv 163.480381 143.659293 236.440488\nv 163.321106 143.406349 237.114052\nv 163.116383 143.610839 236.431935\nv 158.303049 142.814442 236.277213\nv 157.507060 142.918602 235.522452\nv 157.478211 142.666263 236.210434\nv 162.180568 143.468375 236.425638\nv 161.199764 143.310081 236.397737\nv 161.976304 143.199601 237.077599\nv 162.339843 143.721320 235.752074\nv 156.058715 142.631394 235.456335\nv 156.589010 143.035816 234.640729\nv 155.965502 142.896787 234.641391\nv 159.089338 142.946492 236.325029\nv 159.118187 143.198831 235.637047\nv 158.954524 142.681898 236.986353\nv 159.769663 143.066287 236.346187\nv 155.706191 143.118065 233.849531\nv 155.175896 142.713643 234.665137\nv 152.231928 142.008989 234.613862\nv 152.755964 142.128312 234.657614\nv 152.196132 142.255937 233.897006\nv 153.818376 142.655090 233.907018\nv 153.424144 142.284663 234.685972\nv 154.522353 142.564493 234.652231\nv 149.817036 140.909263 235.887503\nv 149.089134 140.700164 235.850626\nv 149.196498 140.460449 236.594677\nv 143.761597 140.755051 231.035446\nv 144.452009 140.736177 231.731302\nv 144.452009 141.010530 230.967050\nv 145.157716 140.721528 232.444264\nv 144.467303 140.466049 232.512660\nv 146.649688 140.872819 233.335977\nv 147.401806 140.904985 233.912761\nv 147.338351 141.327348 232.672988\nv 145.988717 140.168200 234.678755\nv 145.370743 139.614774 235.589756\nv 146.095169 139.897030 235.486751\nv 144.512944 139.869775 234.164280\nv 143.761597 139.587506 234.235100\nv 144.512944 139.603674 234.852581\nv 145.155474 142.625177 226.755442\nv 144.468626 142.571440 226.227420\nv 144.448446 142.290290 227.134071\nv 143.761597 141.871275 227.718422\nv 144.448446 141.925012 228.246444\nv 146.621218 142.885944 227.359465\nv 145.900280 142.756865 227.063904\nv 145.856231 142.473105 227.957655\nv 145.249739 143.743405 223.084896\nv 144.510607 143.853222 221.912744\nv 144.500729 143.552175 222.961049\nv 144.723856 147.169192 207.993751\nv 144.678833 146.997316 208.815573\nv 145.641092 147.276509 208.759817\nv 144.678833 146.676363 210.413920\nv 144.678833 146.829767 209.649973\nv 143.761597 146.401497 210.482254\nv 145.554297 146.932817 210.400051\nv 144.637061 146.504547 211.232332\nv 144.729679 148.087236 202.820321\nv 144.812083 147.955010 203.803102\nv 145.780158 148.320272 203.174431\nv 145.256268 147.447050 207.313317\nv 144.294009 147.167858 207.369073\nv 144.549398 148.849630 197.322520\nv 144.591768 148.755600 198.161696\nv 145.379570 149.034429 197.697473\nv 143.761597 148.435600 198.780624\nv 144.591768 148.620399 199.155577\nv 144.729676 148.239250 201.854724\nv 143.761600 147.873987 202.483396\nv 143.761597 149.364624 191.053951\nv 144.558422 149.519619 191.762002\nv 144.534202 149.414867 192.656402\nv 145.331027 149.653190 192.470299\nv 145.394947 150.410201 183.333593\nv 144.551249 150.194886 183.078058\nv 144.605295 150.169516 183.848835\nv 143.761597 149.865902 184.897503\nv 144.605295 150.081217 185.153038\nv 144.605344 150.016649 186.144696\nv 145.449041 150.320264 185.096028\nv 144.538640 150.410894 177.673390\nv 144.519831 150.378015 178.575213\nv 145.296874 150.607711 178.254249\nv 144.553935 150.447546 175.751168\nv 144.538640 150.433797 176.639740\nv 145.330978 150.654338 176.463853\nv 144.519831 150.355516 179.451488\nv 143.761597 150.158699 178.870629\nv 146.145640 150.834725 168.746986\nv 146.110295 150.852172 169.688103\nv 146.935034 151.067756 169.509859\nv 146.100740 150.871806 170.844108\nv 143.761597 150.109326 167.078423\nv 144.551965 150.354504 167.564280\nv 144.551965 150.320825 166.794909\nv 143.761597 150.150802 168.176750\nv 144.551965 150.362302 167.893236\nv 144.541249 150.388871 168.715469\nv 145.331617 150.592572 168.102998\nv 150.271159 151.650553 163.353303\nv 149.413320 151.442524 163.293476\nv 149.422775 151.496930 164.245627\nv 148.585511 151.342348 165.175385\nv 148.082674 151.241884 165.742009\nv 148.432245 151.198551 163.250477\nv 144.600168 150.293704 165.955277\nv 145.390536 150.538883 166.441134\nv 151.088200 140.964824 236.683575\nv 151.740574 141.385787 236.012110\nv 150.576774 141.090511 235.960089\nv 150.311740 142.353159 232.195492\nv 149.569360 141.911748 232.865857\nv 150.341985 142.088615 232.976352\nv 148.786960 141.955568 232.096813\nv 148.062637 141.547180 232.679201\nv 148.814792 141.767903 232.667385\nv 148.033675 142.080449 231.105157\nv 147.296237 142.217857 230.052699\nv 147.297367 141.872253 231.056171\nv 145.846992 141.864933 229.768243\nv 145.138239 141.355930 230.597840\nv 145.851176 141.500658 230.833309\nv 145.855612 142.161195 228.892995\nv 145.134675 142.032116 228.597434\nv 143.761597 142.610251 225.364926\nv 144.468626 142.945138 224.986296\nv 145.995555 143.331277 225.259878\nv 146.027659 143.599293 224.402084\nv 145.207758 143.174343 224.990996\nv 146.740361 143.462965 225.568340\nv 147.407047 143.618313 225.704332\nv 147.482142 143.911574 224.806958\nv 148.821477 143.959369 225.903708\nv 149.528913 144.110609 226.053824\nv 148.856263 144.218162 225.093067\nv 148.772254 143.549392 227.195563\nv 148.771055 143.296921 228.022330\nv 149.492929 143.599345 227.691232\nv 150.331587 143.332241 229.253999\nv 151.137116 143.693941 228.760541\nv 150.297259 143.708574 228.024541\nv 151.142943 143.088889 230.682365\nv 151.925082 143.099310 231.259232\nv 151.953582 143.328029 230.566867\nv 152.773121 143.559331 230.470118\nv 153.673501 143.727161 230.610609\nv 153.710901 143.948043 229.936993\nv 154.536817 143.736455 231.208200\nv 155.380758 143.581420 232.244865\nv 155.455222 143.960839 231.114148\nv 156.354730 144.112263 231.240334\nv 157.094250 143.986622 232.086912\nv 157.149818 144.293080 231.176433\nv 157.728874 143.595808 233.673463\nv 157.413847 143.183995 234.707508\nv 158.646924 143.478594 234.555186\nv 159.277648 143.398124 235.135376\nv 159.592675 143.809937 234.101331\nv 160.813713 143.654161 235.213649\nv 161.385108 143.792905 235.081369\nv 160.794793 143.868211 234.549241\nv 162.320922 143.935369 235.087666\nv 163.290638 144.099491 235.051730\nv 162.335903 144.171076 234.381025\nv 165.469151 143.927391 236.477756\nv 164.975205 143.626549 237.152900\nv 180.460270 145.961164 233.443149\nv 180.340657 146.210134 232.626632\nv 179.634037 145.961691 233.407520\nv 179.754508 146.940894 230.174864\nv 180.379142 146.664754 231.120361\nv 180.470391 146.908808 230.315712\nv 180.304724 146.421665 231.926106\nv 179.588841 146.453750 231.785258\nv 174.878110 146.859458 229.929624\nv 173.625773 146.804639 229.864594\nv 174.003842 146.595796 230.619265\nv 171.896558 146.626168 230.059430\nv 172.729915 146.745471 229.873573\nv 171.874967 146.830662 229.378768\nv 157.038672 145.787369 226.159234\nv 157.028970 146.001964 225.401599\nv 156.245115 145.606694 226.256545\nv 153.592959 145.010771 226.381372\nv 154.366230 145.405814 225.589724\nv 153.502316 145.274195 225.380922\nv 153.539666 145.520993 224.524297\nv 152.766396 145.125950 225.315945\nv 151.949316 145.001553 225.076099\nv 151.244457 145.123266 223.996912\nv 150.390027 144.752071 224.613691\nv 148.947173 144.636417 223.708154\nv 148.745373 144.872530 222.619858\nv 148.007377 144.635164 222.793507\nv 148.021355 145.133032 220.950788\nv 147.517213 145.204052 220.151585\nv 147.301435 144.942296 220.906009\nv 146.040856 144.798403 220.074810\nv 145.272018 144.313971 221.039702\nv 146.028454 144.528884 221.071698\nv 145.275635 144.819319 219.140886\nv 144.514223 144.779123 218.460078\nv 144.523008 144.543294 219.362006\nv 144.514223 144.968797 217.690176\nv 143.761597 144.692772 217.911296\nv 179.925048 148.330968 225.143769\nv 178.776457 148.472729 224.536146\nv 179.216695 148.206737 225.555193\nv 152.374549 146.484047 219.935453\nv 152.371473 146.698037 219.050572\nv 151.556670 146.347509 219.748118\nv 150.702219 146.620098 217.790713\nv 150.678830 146.815258 216.944297\nv 149.867176 146.451431 217.652562\nv 149.829093 146.830319 216.017277\nv 148.960372 146.785559 215.263370\nv 148.975066 146.601832 216.052238\nv 146.599356 146.561386 213.467016\nv 147.697854 146.943927 213.129793\nv 146.474597 146.689120 212.742867\nv 166.946703 154.453008 176.949029\nv 166.932972 154.423320 177.693401\nv 168.123082 154.544559 177.415371\nv 170.864575 154.689839 178.750690\nv 169.931018 154.583751 179.797715\nv 170.868108 154.651328 179.602367\nv 181.051443 154.765993 183.806925\nv 181.144315 154.806114 183.074575\nv 180.511762 154.782073 183.456738\nv 179.450472 154.640216 185.673701\nv 179.506741 154.686943 184.919356\nv 177.746958 154.652430 185.064557\nv 178.580474 154.693806 184.609800\nv 177.732841 154.714301 184.024732\nv 166.505054 154.463238 168.611678\nv 166.502629 154.445348 167.769473\nv 165.518017 154.370072 168.446898\nv 166.660155 154.390816 165.282684\nv 166.697184 154.371029 164.512701\nv 165.577356 154.283016 165.231142\nv 164.520582 154.140931 164.450450\nv 165.110988 154.236411 165.247864\nv 164.458844 154.220994 166.846188\nv 163.839975 154.153458 166.870762\nv 179.989732 152.696144 203.571623\nv 179.867911 152.557895 204.447725\nv 180.545337 152.603297 204.200201\nv 160.182505 151.483840 201.849033\nv 160.139023 151.614252 200.865162\nv 159.644962 151.576379 200.635439\nv 158.649319 151.673647 198.831906\nv 158.652905 151.779746 198.044161\nv 157.742841 151.529787 198.849507\nv 155.219442 151.037460 199.352226\nv 155.881406 151.224078 198.813940\nv 155.034548 151.088212 198.713674\nv 151.799864 150.823318 195.742831\nv 152.624244 150.991308 195.795060\nv 151.786702 150.950587 194.661733\nv 150.143989 150.606683 194.561505\nv 150.913016 150.837893 194.035016\nv 150.094683 150.661980 193.987015\nv 148.664499 150.216751 195.002487\nv 148.661753 150.271846 194.534996\nv 148.000596 150.057827 195.023978\nv 146.079527 149.881977 192.215916\nv 146.866763 150.105135 191.991218\nv 146.142483 149.981100 191.351200\nv 146.168819 150.066727 190.461401\nv 146.248934 150.245876 188.719303\nv 147.081129 150.484580 188.553539\nv 146.271364 150.335791 187.812624\nv 144.584758 149.789702 188.892948\nv 145.423544 150.013141 188.887345\nv 144.600383 149.873648 187.983991\nv 146.276324 150.415095 186.867273\nv 145.444129 150.176392 187.033038\nv 144.605344 149.952952 187.038640\nv 143.761597 149.713906 187.095650\nv 179.086163 153.500744 197.576248\nv 179.067483 153.619408 196.596520\nv 178.259467 153.539214 197.115067\nv 164.285166 153.445597 189.534239\nv 164.451386 153.550627 188.558883\nv 163.499617 153.420910 188.829375\nv 150.218232 151.706674 181.435668\nv 150.407743 151.784218 180.525838\nv 149.562973 151.598036 180.559585\nv 147.379514 151.114613 179.490571\nv 147.451101 151.160693 178.575102\nv 146.710552 150.963755 178.950719\nv 146.048911 150.825212 177.693839\nv 146.881868 151.056728 176.789635\nv 146.148639 150.872106 176.448222\nv 146.127356 150.888958 173.897189\nv 146.914276 151.106638 173.396018\nv 146.105031 150.888037 172.947181\nv 146.096871 150.882063 171.841626\nv 145.309952 150.664383 172.342796\nv 178.463402 152.933967 201.795919\nv 179.423983 152.994782 201.459094\nv 178.584766 153.047669 200.946769\nv 162.200276 152.373493 197.353390\nv 163.056806 152.537940 196.835906\nv 162.164672 152.465568 196.523399\nv 162.072101 152.678656 194.557156\nv 161.998511 152.763241 193.718596\nv 161.103499 152.620223 193.973541\nv 150.831737 151.366211 188.531220\nv 151.462165 151.536530 188.117235\nv 150.834568 151.429707 187.769763\nv 147.944574 150.786342 187.527849\nv 147.977313 150.859307 186.634749\nv 147.136298 150.647459 186.753760\nv 146.352667 150.619401 184.091243\nv 146.298621 150.644770 183.320466\nv 146.450271 150.727383 182.549242\nv 147.056872 150.929655 181.760200\nv 145.947502 150.637843 181.773775\nv 144.551249 150.249260 181.963884\nv 145.287440 150.458296 181.783314\nv 144.497788 150.271986 181.184381\nv 145.256022 150.527927 180.079941\nv 144.497788 150.308611 180.375357\nv 154.798704 152.827189 168.894822\nv 154.223044 152.699449 168.124962\nv 154.083455 152.686775 168.938307\nv 153.480661 152.515867 166.960219\nv 152.710518 152.333570 166.298887\nv 152.737652 152.376738 167.507116\nv 152.654539 152.267761 165.056107\nv 151.911530 152.128632 165.603004\nv 151.224309 152.057857 167.539510\nv 151.186629 152.009837 166.561444\nv 150.443429 151.873254 167.255170\nv 154.234327 152.678463 167.213924\nv 154.949577 152.818877 167.170439\nv 155.573699 152.984359 169.859588\nv 155.713289 152.997033 169.046242\nv 156.576023 153.111134 167.219745\nv 157.441049 153.258118 167.275674\nv 157.439527 153.226152 166.331654\nv 157.367812 153.303959 170.086992\nv 156.446256 153.152471 170.949871\nv 157.325784 153.302227 171.025854\nv 157.278989 153.297538 171.919714\nv 158.200545 153.449025 171.056835\nv 158.800973 153.534691 173.470481\nv 158.865442 153.550130 172.601863\nv 158.089281 153.428896 172.819313\nv 160.462547 153.796173 172.118809\nv 159.663833 153.675315 172.365682\nv 160.375849 153.776783 173.006159\nv 163.201102 154.128728 174.317005\nv 162.445642 154.039218 174.228058\nv 163.188252 154.116252 174.838567\nv 164.737378 154.287793 175.111017\nv 163.994398 154.184802 175.859403\nv 164.788064 154.266834 176.042905\nv 155.767680 152.938530 166.267563\nv 155.769202 152.970496 167.211583\nv 159.104170 153.531690 167.696672\nv 159.146184 153.556857 168.531652\nv 159.950588 153.663993 167.879621\nv 159.100197 153.560638 169.068663\nv 158.273553 153.439134 169.255840\nv 159.073984 153.575219 169.975799\nv 160.768562 153.809085 169.443396\nv 160.656991 153.806549 170.354919\nv 161.524925 153.918910 170.009692\nv 163.080280 154.121437 171.692605\nv 163.146259 154.130962 172.631850\nv 163.729021 154.195758 172.043373\nv 164.900838 154.247806 177.009175\nv 165.643819 154.350797 176.260789\nv 180.424792 154.570065 186.698254\nv 181.228743 154.522145 187.307415\nv 181.110303 154.600579 186.306939\nv 181.196580 154.463570 188.052857\nv 181.882091 154.494084 187.661543\nv 178.676363 154.083208 192.171289\nv 179.369315 154.184109 191.190923\nv 178.463123 154.202084 190.885399\nv 155.317379 152.840216 178.883541\nv 156.154856 153.002123 178.463748\nv 155.348871 152.876638 177.962571\nv 153.696942 152.568521 178.072713\nv 154.550982 152.753974 177.110283\nv 153.736530 152.607763 176.800631\nv 148.510737 151.511251 172.594457\nv 149.088685 151.650654 172.707720\nv 149.074193 151.640405 171.762309\nv 147.808862 151.262519 168.381375\nv 147.942109 151.267809 167.508545\nv 147.103626 151.055600 167.695912\nv 146.289603 150.813447 167.051924\nv 146.799494 150.912052 166.153202\nv 145.852225 150.664609 166.382044\nv 150.774902 148.565725 208.898392\nv 151.497390 148.722044 208.948146\nv 150.784993 148.635348 208.527387\nv 148.621147 148.483048 206.523731\nv 149.514724 148.827091 205.797225\nv 148.525808 148.605255 205.684807\nv 179.960306 149.411294 220.769804\nv 179.977152 149.206383 221.611211\nv 180.815666 149.431167 220.718091\nv 155.397743 148.925396 211.941434\nv 154.696322 148.918305 211.311566\nv 154.525001 148.653559 212.460220\nv 151.925640 148.003095 212.917126\nv 151.432733 148.069896 212.059674\nv 150.659004 147.737610 212.823198\nv 146.426068 147.033745 211.084055\nv 146.908703 147.331616 210.242013\nv 145.995159 147.058871 210.376421\nv 146.036932 147.230688 209.558008\nv 146.081955 147.402563 208.736187\nv 148.241463 149.209973 201.633324\nv 148.287998 149.080340 202.500031\nv 149.219034 149.332332 202.382568\nv 146.633725 148.456197 203.737912\nv 146.551322 148.588424 202.755131\nv 180.033707 151.778192 209.218770\nv 180.044600 151.565578 210.399200\nv 180.909800 151.670969 209.864414\nv 154.655764 150.548580 201.951462\nv 153.938539 150.550341 200.999074\nv 153.441442 150.322584 201.858010\nv 150.655409 149.699538 202.131558\nv 151.629455 149.787416 202.910919\nv 151.826248 149.965754 202.009733\nv 146.232714 149.129944 198.680410\nv 146.962594 149.390018 198.136920\nv 146.151819 149.200473 197.993159\nv 146.109449 149.294503 197.153983\nv 146.052393 149.369364 196.450738\nv 146.017604 149.466211 195.609317\nv 145.302410 149.225307 196.016877\nv 145.981681 149.545764 194.907507\nv 146.001274 149.658906 194.002129\nv 145.287214 149.435296 194.270078\nv 213.290047 141.001609 235.168056\nv 213.606729 141.167916 234.445348\nv 212.808270 141.380161 234.498666\nv 194.670216 154.453049 163.728242\nv 195.944155 154.334646 163.707362\nv 195.408086 154.349843 162.886721\nv 182.701427 144.935799 236.590235\nv 181.957477 144.940300 236.591036\nv 181.338322 145.188462 235.828085\nv 181.959175 145.394700 235.208281\nv 180.644842 145.398958 235.195892\nv 182.084908 146.648258 231.175654\nv 181.980226 146.404883 231.979713\nv 182.970109 146.420473 231.894158\nv 182.809725 145.935197 233.491286\nv 182.016159 146.193352 232.680239\nv 180.708604 147.393658 228.631168\nv 180.709070 147.181716 229.393480\nv 181.571917 147.390427 228.654433\nv 180.911338 150.571520 215.552022\nv 181.780516 150.396284 216.361502\nv 181.828593 150.578880 215.491572\nv 181.844848 151.566533 210.411394\nv 181.785365 151.428232 211.173201\nv 182.709520 151.536409 210.539751\nv 181.912779 154.260331 190.471002\nv 181.971337 154.130559 191.874093\nv 182.755125 154.203525 191.009483\nv 181.963707 154.965263 179.960054\nv 181.853269 154.930065 180.659419\nv 182.777102 154.633554 185.813558\nv 181.871892 154.615826 186.116655\nv 182.819464 154.570386 186.613004\nv 179.910479 155.136310 171.829210\nv 180.010303 155.133212 172.780446\nv 180.897780 155.144819 172.203347\nv 185.033749 154.928821 162.988820\nv 184.502744 154.965860 163.792256\nv 185.019395 154.954930 163.790329\nv 187.147161 154.952178 165.481077\nv 188.074897 154.923095 165.490110\nv 187.300421 154.918900 164.600466\nv 192.838862 154.601256 163.770491\nv 192.026380 154.655066 163.741346\nv 192.336539 154.669117 164.583233\nv 193.641584 154.541777 163.759989\nv 193.331425 154.527725 162.918103\nv 199.103108 153.985433 163.629418\nv 198.121504 154.097436 163.658973\nv 198.193316 154.120772 164.469986\nv 199.965740 153.994936 166.763559\nv 200.035799 153.960817 166.004271\nv 198.996816 154.115863 166.721998\nv 204.869404 153.152059 163.490150\nv 203.882795 153.321908 163.583253\nv 204.683519 153.218521 164.379655\nv 202.817040 153.442024 162.726673\nv 202.631155 153.508486 163.616178\nv 201.459947 153.681602 163.602546\nv 202.525702 153.561487 164.459126\nv 201.179609 153.787247 165.245662\nv 200.264707 153.871686 164.442963\nv 200.089822 153.924330 165.243132\nv 205.949429 153.125578 167.545968\nv 205.037529 153.237863 166.563867\nv 204.589786 153.342098 167.403466\nv 210.857968 151.969556 163.230618\nv 209.989742 152.165529 163.249770\nv 210.283159 152.135482 164.008090\nv 206.813118 152.799658 163.367239\nv 205.839462 152.980112 163.459827\nv 206.643783 152.868217 164.193963\nv 207.079032 152.874481 166.130273\nv 206.715510 152.888145 164.920364\nv 206.033650 153.035007 165.496461\nv 217.743016 150.171021 162.983811\nv 217.743016 150.227272 163.875008\nv 218.761597 149.875755 162.979103\nv 216.524280 150.529906 163.047097\nv 217.542861 150.178389 162.151192\nv 217.915745 150.406797 168.720974\nv 217.886707 150.384004 167.868403\nv 217.040855 150.632201 168.085272\nv 218.761595 150.111443 167.276301\nv 217.886705 150.336846 166.640599\nv 217.984829 150.451606 171.471229\nv 218.761597 150.228950 171.466301\nv 217.984829 150.440962 171.023223\nv 217.984829 150.411109 169.766128\nv 218.761597 150.188454 169.761200\nv 217.138978 150.659306 169.982998\nv 218.028473 150.435283 175.364854\nv 218.761597 150.231813 174.879200\nv 218.028473 150.440270 174.168851\nv 216.106737 150.975782 172.250898\nv 216.646298 150.825609 173.217692\nv 216.778399 150.788856 172.178137\nv 218.010230 150.412071 177.112165\nv 218.761597 150.204061 177.032551\nv 218.010230 150.434835 176.154817\nv 217.940376 150.287546 181.344335\nv 218.761597 150.099678 180.553226\nv 217.940376 150.324121 180.535607\nv 217.964447 150.378507 178.826446\nv 217.964447 150.355985 179.703746\nv 218.761597 150.158775 178.867199\nv 217.191018 150.598480 178.782861\nv 217.988168 150.401270 177.946315\nv 215.542872 150.641797 186.316690\nv 216.213863 150.424660 186.828172\nv 216.405966 150.420638 186.192979\nv 217.919277 149.926854 187.347028\nv 218.761597 149.714157 187.091949\nv 217.919277 149.990804 186.449383\nv 217.916159 150.149253 184.245238\nv 217.916159 150.061233 185.545592\nv 218.761597 149.866127 184.893951\nv 218.003780 149.640739 190.328255\nv 218.003780 149.557235 191.224507\nv 218.761597 149.364800 191.051853\nv 217.169408 149.759534 191.470134\nv 217.927224 149.483594 192.193731\nv 216.334093 149.850231 192.773596\nv 216.455978 149.894029 192.019940\nv 215.697220 150.058368 192.354179\nv 217.893134 148.800994 197.865628\nv 217.038782 148.902607 198.854341\nv 217.907245 148.673261 198.769368\nv 218.761597 148.436024 198.777580\nv 217.907245 148.537637 199.766293\nv 218.761597 147.876017 202.470490\nv 217.932880 148.267142 201.437814\nv 217.932880 148.116006 202.397951\nv 216.074069 146.563341 213.254187\nv 214.868595 146.815797 213.621901\nv 215.887784 146.312686 214.595383\nv 217.100467 142.276975 228.105983\nv 217.954075 142.071481 227.910062\nv 217.907989 142.385997 226.980719\nv 218.761597 141.848499 227.791996\nv 217.954075 141.739477 228.917260\nv 216.363004 141.848100 230.095841\nv 215.197244 142.226266 230.057903\nv 216.012672 141.651448 230.979578\nv 218.520344 139.275380 235.256137\nv 218.520344 139.009278 235.944438\nv 218.761597 139.055302 235.611702\nv 216.423877 140.471214 233.990556\nv 216.346674 140.896738 232.878830\nv 215.589790 140.782727 233.842318\nv 217.179565 140.243027 233.921739\nv 216.422681 140.129016 234.885226\nv 211.705724 141.142990 235.986567\nv 212.548570 140.940729 235.926262\nv 211.648742 141.416116 235.281679\nv 214.844077 140.298406 235.797119\nv 214.077952 140.518507 235.835918\nv 214.833523 140.027549 236.518299\nv 203.364113 143.442039 234.938792\nv 202.598441 143.587369 234.932162\nv 203.444746 143.212608 235.567895\nv 202.214852 142.930298 237.030151\nv 202.783087 143.089865 236.286133\nv 202.110838 143.198370 236.305283\nv 203.471335 142.958617 236.262985\nv 204.237007 142.813287 236.269616\nv 206.375476 143.101419 234.186515\nv 205.663469 143.044719 234.793528\nv 206.444794 142.807495 234.975283\nv 198.649916 143.952502 235.741451\nv 198.345709 143.762031 236.429006\nv 199.157708 143.643169 236.434744\nv 200.200714 143.958930 235.026169\nv 199.359100 144.054997 235.128257\nv 200.303528 143.737574 235.645100\nv 200.502259 143.436222 236.398245\nv 199.514657 143.595669 236.426344\nv 200.555001 143.198250 237.077400\nv 201.343872 143.340155 236.296157\nv 193.466333 144.869993 234.903322\nv 192.658824 145.113688 234.394668\nv 192.439714 144.824479 235.331984\nv 183.330720 145.369846 235.233139\nv 183.588572 145.158298 235.852196\nv 184.266637 145.343939 235.244861\nv 185.066745 145.366716 235.104878\nv 185.450966 145.102876 235.860145\nv 185.993222 145.337201 235.101105\nv 188.295409 144.736196 236.560033\nv 189.171417 144.673540 236.578800\nv 189.079924 144.927239 235.835031\nv 191.638927 144.894488 235.343146\nv 192.446436 144.650793 235.851799\nv 209.615646 142.196116 234.585036\nv 209.927976 141.823635 235.405949\nv 210.493565 141.990858 234.521072\nv 211.854811 142.419568 232.293405\nv 211.466860 142.277895 233.006775\nv 212.130148 142.076737 233.060287\nv 212.821526 141.882439 233.061437\nv 213.459586 141.684046 233.112390\nv 213.156159 142.020017 232.397870\nv 214.320565 141.925619 231.695232\nv 213.954482 142.288917 230.953765\nv 213.428136 142.184922 231.707357\nv 215.179749 141.618933 231.836116\nv 216.345510 141.240766 231.874054\nv 217.971179 140.532961 232.413383\nv 217.971179 140.219416 233.286934\nv 218.761597 140.167152 232.673248\nv 214.838932 143.498050 226.368148\nv 213.849135 143.908923 225.946443\nv 214.260553 143.473848 226.974658\nv 212.096328 143.556611 228.619003\nv 210.950453 144.095584 227.834694\nv 211.175975 143.770425 228.684202\nv 209.106735 142.996532 232.682688\nv 209.117488 143.200826 232.057122\nv 208.403385 143.181742 232.618951\nv 207.688141 143.360325 232.553790\nv 207.027759 143.528716 232.496897\nv 207.732250 143.145839 233.187624\nv 206.194385 143.891885 231.911746\nv 206.220404 144.023812 231.489785\nv 205.431140 144.172494 231.538468\nv 204.609773 144.185302 231.986092\nv 203.888251 144.104162 232.667860\nv 204.683600 143.959427 232.642197\nv 204.902285 143.202961 234.789642\nv 204.778115 143.608466 233.664362\nv 204.086248 143.472783 234.449245\nv 203.093960 144.249710 232.663253\nv 202.371825 144.218966 233.152800\nv 203.239943 143.847544 233.813512\nv 201.831475 143.729153 234.923035\nv 201.703156 144.045951 234.027706\nv 201.016823 143.958305 234.647683\nv 198.408370 144.425880 234.420207\nv 197.699186 144.323385 235.033401\nv 198.547102 144.173858 235.122520\nv 196.209188 144.055472 236.422474\nv 197.048109 143.934829 236.459455\nv 196.998997 144.192007 235.698733\nv 195.471269 144.122393 236.479257\nv 196.177190 144.059424 236.423176\nv 195.454155 144.375620 235.717832\nv 194.063763 144.262941 236.524868\nv 193.227913 144.351293 236.540444\nv 194.044452 144.033451 237.224674\nv 183.633219 145.915558 233.499472\nv 183.381404 145.624392 234.455080\nv 184.260600 145.846654 233.670197\nv 184.736941 146.293460 232.178770\nv 185.350493 146.115859 232.698545\nv 185.575018 146.271499 232.162726\nv 186.957478 146.295403 231.890772\nv 187.043367 146.067062 232.643464\nv 187.812276 146.268567 231.851735\nv 188.581797 146.231525 231.833350\nv 188.796971 146.017098 232.499574\nv 189.480603 146.208398 231.728496\nv 193.549761 145.467427 233.039361\nv 194.512580 145.380085 233.007895\nv 194.376897 145.688310 232.081250\nv 195.548248 145.281430 232.959994\nv 196.516631 145.026065 233.381659\nv 196.308100 145.345603 232.471448\nv 208.080672 146.061502 223.327964\nv 208.993323 145.724656 223.794946\nv 209.034527 145.929711 223.031996\nv 208.902232 144.992858 226.476190\nv 208.059815 145.017327 227.020131\nv 209.091611 144.687439 227.387700\nv 210.842683 145.047655 224.691975\nv 210.839521 144.796518 225.583511\nv 211.801798 144.694378 225.124783\nv 212.376654 144.420027 225.588458\nv 212.379816 144.671164 224.696923\nv 214.463791 144.605099 222.936363\nv 214.602594 144.353507 223.712267\nv 215.441849 144.317531 223.004527\nv 215.694984 144.663040 221.467828\nv 216.183771 144.327217 222.188185\nv 216.575710 144.421135 221.427390\nv 217.091859 144.260884 221.449309\nv 216.603072 144.596708 220.728952\nv 217.940409 144.297326 220.353211\nv 217.940409 144.050099 221.266672\nv 218.761597 143.910968 220.869012\nv 217.964245 144.476363 219.646510\nv 218.761597 144.330647 219.318375\nv 217.964245 144.648815 219.009333\nv 180.815928 147.609522 227.847173\nv 182.217856 147.783800 227.191776\nv 181.462333 147.790953 227.146828\nv 185.063963 147.290883 228.785937\nv 185.880625 147.259984 228.801909\nv 185.508646 147.479936 228.051056\nv 207.748205 146.486328 221.992843\nv 208.467619 146.401068 221.742245\nv 208.093948 146.620839 221.170073\nv 209.408289 146.197799 221.705706\nv 210.294943 146.104079 221.303003\nv 209.700016 146.441858 220.516773\nv 212.255792 145.956381 220.073385\nv 212.848072 145.814201 220.061104\nv 212.974937 145.982728 219.275806\nv 215.228356 146.255439 215.659653\nv 216.433829 146.002982 215.291939\nv 218.761597 144.692749 217.911350\nv 217.979949 145.022826 217.518738\nv 217.979949 144.833174 218.288585\nv 196.493068 154.367603 176.953735\nv 197.703429 154.266793 176.223128\nv 196.585380 154.380417 176.128484\nv 197.881782 154.210154 166.090272\nv 198.139293 154.157259 165.231126\nv 196.954201 154.285670 165.358687\nv 196.946868 154.232108 163.682691\nv 196.208999 154.335313 164.524212\nv 197.483530 154.324237 168.417251\nv 196.827269 154.371469 167.792208\nv 196.536575 154.420360 168.573967\nv 194.177653 154.526579 164.580630\nv 192.962327 154.628045 178.078887\nv 192.468763 154.666056 177.987643\nv 192.404768 154.643956 178.738342\nv 190.656037 154.735368 179.282815\nv 189.843749 154.780869 179.245399\nv 190.238916 154.715006 180.121953\nv 183.562070 154.632976 185.664241\nv 182.614498 154.678416 185.167891\nv 182.368310 154.819077 182.762315\nv 181.941651 154.874551 181.701725\nv 181.257336 154.845509 182.364173\nv 186.569813 154.911470 179.245209\nv 185.729632 154.955641 178.694268\nv 185.581237 154.928597 179.520288\nv 181.960286 155.053146 177.369140\nv 181.145622 155.048768 177.512210\nv 181.938399 155.024913 178.175221\nv 193.249642 154.706534 169.397482\nv 192.611317 154.740631 168.719597\nv 192.586311 154.758134 169.691945\nv 181.545818 155.138173 170.354406\nv 181.447839 155.131711 169.420553\nv 180.699976 155.141454 170.318258\nv 201.963723 152.212492 196.924507\nv 201.901975 152.077554 198.016304\nv 202.799603 152.031244 197.382830\nv 202.661817 151.757439 199.565344\nv 203.439167 151.590564 199.924873\nv 203.515205 151.729430 198.834156\nv 205.827960 151.352204 198.900714\nv 206.708759 151.150783 199.258859\nv 206.845605 151.212290 198.613559\nv 208.491097 151.370427 194.936031\nv 207.636384 151.516817 195.085138\nv 208.513572 151.277423 195.659701\nv 210.269141 150.965331 195.346592\nv 209.670804 150.976431 196.295373\nv 210.571660 150.810729 196.131371\nv 210.071724 151.453008 191.356104\nv 209.541158 151.599908 190.912250\nv 209.324210 151.549405 191.889831\nv 211.273983 150.874152 194.336025\nv 212.123919 150.611779 194.999004\nv 212.227905 150.686302 194.152439\nv 213.684272 150.464683 193.156370\nv 214.329048 150.349264 192.800501\nv 213.786274 150.511203 192.457772\nv 215.882810 150.131674 191.117481\nv 216.532534 149.967671 191.050716\nv 216.596239 149.997178 190.567674\nv 216.340178 150.313147 187.747689\nv 216.380708 150.219993 188.718744\nv 217.117488 150.110346 187.675516\nv 217.201991 149.925183 189.573740\nv 216.552266 150.089186 189.640505\nv 181.655354 153.767258 195.356458\nv 182.549811 153.677919 196.130502\nv 182.582364 153.770855 195.248965\nv 196.168372 153.762244 188.440953\nv 195.534700 153.753352 189.216966\nv 196.409252 153.660765 189.268111\nv 207.641421 152.718800 180.154134\nv 207.638348 152.693929 180.710391\nv 208.317965 152.573300 180.636522\nv 209.742656 152.184933 182.675087\nv 210.450196 152.022149 183.000928\nv 210.427227 152.073861 182.145138\nv 208.956083 152.502223 179.405532\nv 209.011904 152.464523 180.022856\nv 209.646950 152.368574 179.348124\nv 211.126720 151.950757 181.688998\nv 211.832688 151.785848 181.930418\nv 211.824641 151.825528 181.148436\nv 210.206207 152.298510 178.153652\nv 210.349258 152.220777 179.326048\nv 210.964336 152.113014 178.748901\nv 212.529923 151.690577 180.671233\nv 213.241998 151.524658 180.710319\nv 213.241312 151.554616 179.991695\nv 211.453397 152.070634 176.895068\nv 211.568318 152.012059 177.867567\nv 212.200431 151.891947 177.186132\nv 213.862923 151.436034 179.243679\nv 214.761231 151.194671 179.927476\nv 214.670768 151.242009 179.140374\nv 212.751900 151.801916 175.741469\nv 212.837019 151.760373 176.541794\nv 213.503409 151.611767 176.069630\nv 216.391907 150.810944 178.863451\nv 216.368186 150.788181 179.743582\nv 214.017945 151.509696 174.368206\nv 214.115726 151.471086 175.512767\nv 214.715381 151.327472 174.611669\nv 216.653089 150.784677 177.183989\nv 217.236801 150.632044 177.068581\nv 216.675151 150.795478 176.349839\nv 215.296118 151.189309 173.378781\nv 215.312745 151.177693 174.216751\nv 215.991264 151.000919 174.128424\nv 216.651620 150.816521 174.810450\nv 216.634993 150.828137 173.972479\nv 181.417720 153.363401 198.802981\nv 182.202018 153.251720 199.597563\nv 182.282653 153.358573 198.756424\nv 198.810388 152.842143 194.869646\nv 198.807088 152.780669 195.402779\nv 199.611391 152.733027 195.013753\nv 209.244975 152.101226 185.782522\nv 209.439347 152.002159 186.534303\nv 210.088020 151.918401 185.917590\nv 211.101709 151.479804 188.652008\nv 211.037761 151.393475 189.830491\nv 211.840596 151.259452 189.409378\nv 210.523479 151.922040 184.639196\nv 210.520901 151.869693 185.356679\nv 211.150731 151.774264 184.830065\nv 211.933147 151.391458 187.573012\nv 212.766901 151.196054 187.670749\nv 212.795504 151.241732 187.012866\nv 211.831050 151.708834 183.596612\nv 211.778727 151.659743 184.466614\nv 212.456467 151.541965 183.950644\nv 214.592590 150.967817 184.878526\nv 214.740502 150.887404 185.568407\nv 215.587062 150.718187 184.991617\nv 213.211398 151.455912 182.489375\nv 213.222308 151.490693 181.643983\nv 212.519699 151.625838 182.235249\nv 216.402847 150.491066 185.289188\nv 216.254935 150.571479 184.599308\nv 216.276811 150.692570 182.293194\nv 215.311679 150.949719 182.204136\nv 216.118217 150.693931 182.993059\nv 215.519674 150.974502 180.664222\nv 216.294714 150.730173 181.415494\nv 216.344115 150.756318 180.575444\nv 217.922473 150.195465 183.337857\nv 217.077035 150.390570 183.989498\nv 215.569011 150.795435 163.066913\nv 215.277461 150.821837 162.264664\nv 214.522348 151.079998 163.117099\nv 213.532915 151.326413 163.148570\nv 213.824466 151.300011 163.950819\nv 211.710115 151.766931 163.194893\nv 211.416698 151.796978 162.436573\nv 211.609262 151.913718 165.770075\nv 212.093524 151.762801 164.824543\nv 210.667122 152.090427 164.934470\nv 209.798897 152.286400 164.953622\nv 208.587913 152.529537 164.790709\nv 208.971876 152.484482 165.717089\nv 207.084476 152.966766 170.138605\nv 207.809241 152.818754 169.359118\nv 207.111429 152.948006 169.353304\nv 208.525570 152.658926 168.438644\nv 209.736242 152.426287 168.886544\nv 209.045367 152.528189 167.491833\nv 205.248198 153.284043 169.275450\nv 205.690687 153.217146 170.149062\nv 205.944175 153.162915 169.259180\nv 202.976108 153.659781 171.123314\nv 203.107701 153.640902 172.029357\nv 203.754914 153.540490 171.134425\nv 198.395103 154.211315 175.399988\nv 198.302792 154.198501 176.225239\nv 199.266363 154.129977 174.546678\nv 200.129641 154.001869 175.328985\nv 200.401538 153.988824 174.473564\nv 201.698637 153.838939 172.844406\nv 201.850096 153.806775 173.708832\nv 202.480355 153.728028 172.882673\nv 203.687398 153.421377 165.447061\nv 204.674006 153.251527 165.353958\nv 199.493831 154.107489 170.536611\nv 198.410781 154.239218 171.348751\nv 199.346630 154.125670 171.332660\nv 192.418561 154.432690 183.291458\nv 192.451988 154.377188 184.074692\nv 192.926946 154.341640 184.120303\nv 193.792271 154.368170 182.597720\nv 194.189952 154.286815 183.416536\nv 195.088703 154.257843 182.677186\nv 207.225313 152.886822 177.210505\nv 207.733312 152.768774 178.128117\nv 207.818995 152.782733 177.105514\nv 209.127786 152.557831 176.004369\nv 209.912926 152.394705 176.237334\nv 209.772306 152.439201 175.364530\nv 210.463170 152.305039 174.768970\nv 211.182932 152.149320 174.704659\nv 211.088656 152.178284 173.876134\nv 211.711443 152.045741 173.342002\nv 212.537648 151.857572 173.736829\nv 212.440672 151.880748 173.267010\nv 210.007614 152.404168 170.222324\nv 210.258304 152.359461 171.044378\nv 210.884167 152.220714 170.379799\nv 213.275340 151.687091 172.884580\nv 213.917115 151.532621 172.779577\nv 213.925578 151.527133 172.002320\nv 214.912240 151.254950 170.449070\nv 215.403096 151.155846 171.554330\nv 215.747982 151.038133 170.106083\nv 212.565517 151.789748 167.860535\nv 212.674870 151.780649 168.712057\nv 213.346747 151.606902 168.205966\nv 216.654366 150.797012 170.074594\nv 216.163510 150.896115 168.969333\nv 213.699265 151.468157 166.515527\nv 214.193744 151.369497 167.453345\nv 214.655615 151.221654 166.614429\nv 216.109993 150.888994 168.245045\nv 216.080955 150.866201 167.392474\nv 214.985744 151.094459 165.652308\nv 215.480222 150.995799 166.590126\nv 216.411084 150.739006 166.430353\nv 216.956358 150.584689 166.388897\nv 216.355625 150.714287 165.586549\nv 181.761355 150.218182 217.209769\nv 182.678610 150.225542 217.149319\nv 208.968353 149.380945 207.684625\nv 209.837105 149.127897 208.070207\nv 209.869335 149.207995 207.598595\nv 210.944556 149.577734 204.217645\nv 210.474643 149.509911 205.204069\nv 211.345276 149.334376 205.099616\nv 213.595762 148.890460 204.613151\nv 214.780145 148.574939 204.737082\nv 214.178450 148.827471 204.109352\nv 216.579409 148.528648 202.136261\nv 215.470715 148.851052 201.968435\nv 216.023599 148.569704 202.794078\nv 216.539709 148.792435 200.534350\nv 216.565344 148.658563 201.337946\nv 217.078528 148.641002 200.561677\nv 185.560288 148.545181 224.073168\nv 186.356040 148.577184 223.829710\nv 185.641285 148.727321 223.341002\nv 211.480851 147.788230 213.006476\nv 212.427481 147.554259 213.070737\nv 212.137415 147.751337 212.444528\nv 181.908475 151.918778 208.466958\nv 181.777202 152.065777 207.571025\nv 182.723643 150.916400 213.838822\nv 183.782434 150.848769 214.095746\nv 183.756623 151.021033 213.248442\nv 206.953339 150.932541 200.555994\nv 206.875780 150.831467 201.301568\nv 207.728560 150.683791 201.258433\nv 208.367748 150.382806 202.410549\nv 209.397916 150.299306 201.615877\nv 208.681169 150.499218 201.209335\nv 208.381179 150.792450 199.682354\nv 208.758728 150.600291 200.463760\nv 209.333788 150.607877 199.633256\nv 210.321452 150.147043 201.373268\nv 211.251992 149.957329 201.312689\nv 210.641878 150.226004 200.354084\nv 210.433003 150.622682 197.864916\nv 209.464781 150.810932 197.966001\nv 209.924461 150.611785 198.750765\nv 212.536522 150.319989 196.702874\nv 212.593256 150.185141 197.591018\nv 213.218662 150.050578 197.495230\nv 214.072585 150.091899 195.596873\nv 214.030542 150.211151 194.701038\nv 213.119884 150.304678 195.711252\nv 214.934186 149.419212 199.091091\nv 216.135147 149.127668 198.952119\nv 215.823710 149.321883 198.089573\nv 215.279289 150.006471 193.847247\nv 215.962715 149.754270 194.448074\nv 216.258761 149.762369 193.708662\nv 187.376279 135.937125 177.016099\nv 188.311201 135.887910 177.293855\nv 187.415495 135.899855 177.853022\nv 190.026137 135.776028 177.649148\nv 190.417053 135.786316 176.719067\nv 190.745317 135.737775 177.455421\nv 217.316776 130.568227 167.572776\nv 216.489410 130.823751 167.104921\nv 217.386251 130.653713 178.236202\nv 218.157104 130.379447 178.650859\nv 218.761597 129.157347 192.150876\nv 218.290450 129.321769 192.140388\nv 217.371990 129.648099 192.016785\nv 218.761597 127.971302 200.314850\nv 218.761597 126.903952 205.858703\nv 217.937795 127.077192 206.446547\nv 218.761597 125.465176 212.005573\nv 218.090345 125.588676 212.517206\nv 217.538593 125.685128 212.935429\nv 213.949877 131.080243 159.478414\nv 213.486276 131.236341 159.505918\nv 213.507607 131.158005 158.797401\nv 214.783523 130.867233 160.085934\nv 215.470282 130.710717 160.758050\nv 212.317862 131.532440 158.863417\nv 212.659064 131.499179 159.588441\nv 211.932920 131.717517 159.626953\nv 210.351438 132.454751 162.888185\nv 211.300389 132.184847 162.783238\nv 209.470146 132.489250 160.595046\nv 209.093011 132.661850 161.423850\nv 208.588875 132.583641 159.048772\nv 208.995655 132.546328 159.841367\nv 211.364704 131.956750 160.432864\nv 211.936521 131.859446 161.156721\nv 205.238679 133.453169 160.012770\nv 204.476880 133.611220 160.040621\nv 204.767704 133.484048 159.207554\nv 204.184752 133.726720 160.763079\nv 204.362921 133.758470 161.671084\nv 203.081367 133.822474 159.267192\nv 203.713777 133.757599 159.957863\nv 202.789239 133.937975 159.989651\nv 205.810835 133.397435 160.822087\nv 205.431752 133.546454 161.690222\nv 204.846818 133.724583 162.515468\nv 198.132103 134.688534 159.994867\nv 198.238911 134.740327 160.919548\nv 199.353527 134.516577 159.964569\nv 198.484623 134.596048 159.403601\nv 199.782166 134.502502 160.656951\nv 190.670611 135.430023 159.550657\nv 182.455550 135.873257 161.841261\nv 181.887957 135.823111 161.084244\nv 181.341508 135.777852 160.354716\nv 181.887424 136.075404 176.422880\nv 182.153669 136.090074 175.410950\nv 182.845204 136.070422 176.236050\nv 180.830044 136.074583 176.451785\nv 181.521579 136.054932 177.276885\nv 183.655622 136.116178 172.554004\nv 182.925006 136.134831 171.907228\nv 182.111858 135.790923 182.741549\nv 183.060110 135.791488 182.626443\nv 182.692550 135.747802 183.476102\nv 180.221182 135.539847 186.252088\nv 181.132191 135.527067 186.573734\nv 180.320058 135.462285 187.280011\nv 180.912326 134.437390 196.941733\nv 181.013753 134.329408 197.728944\nv 180.056271 134.378684 197.342157\nv 181.647735 133.595142 202.804464\nv 182.426199 133.659845 202.363166\nv 181.648879 133.077421 205.856692\nv 182.443660 133.145376 205.439163\nv 182.472976 133.004506 206.202923\nv 180.881647 133.005161 206.230705\nv 180.941110 132.896829 206.860303\nv 180.144562 132.965439 206.470554\nv 181.529733 132.776867 207.516232\nv 182.529351 132.862354 207.015812\nv 180.792648 132.737144 207.756082\nv 183.414867 131.068177 215.670967\nv 182.302057 131.109964 215.571273\nv 182.108104 130.900326 216.470300\nv 182.818942 130.739518 217.100896\nv 182.788253 130.254383 219.136162\nv 183.452032 130.103036 219.674273\nv 181.261007 129.331857 222.614949\nv 182.476101 129.322508 222.614057\nv 181.663349 129.119559 223.364709\nv 182.495919 128.205579 226.499616\nv 181.777195 128.433833 225.794648\nv 181.329528 127.918462 227.467502\nv 182.224212 127.955235 227.314752\nv 182.018974 127.691802 228.146672\nv 182.119949 125.710049 233.993797\nv 182.569062 125.976351 233.234477\nv 182.905786 126.229253 232.479997\nv 183.378264 126.482831 231.726727\nv 184.158870 126.745548 230.906110\nv 186.305260 126.837386 230.385431\nv 187.040144 126.135630 232.275678\nv 186.143520 125.993310 232.819519\nv 186.411650 125.742628 233.505428\nv 185.618863 125.860582 233.290196\nv 188.549253 125.697635 233.244345\nv 188.926580 125.672035 233.239820\nv 188.864922 125.428799 233.944176\nv 187.773609 125.908113 232.787370\nv 187.711951 125.664877 233.491725\nv 194.352348 125.148866 233.104622\nv 196.847152 124.526352 233.785050\nv 196.506177 124.854198 233.054823\nv 197.763385 125.201249 231.534338\nv 196.888317 125.332915 231.573814\nv 199.969745 124.295920 232.897215\nv 198.069168 125.434163 230.737879\nv 199.786949 125.215890 230.508448\nv 200.463991 124.822341 231.233699\nv 201.087268 124.074145 232.858141\nv 200.791672 123.827175 233.661770\nv 201.246050 124.389367 231.940383\nv 202.067977 123.920622 232.704938\nv 202.481346 123.487702 233.601898\nv 202.640128 123.802924 232.684140\nv 204.337580 123.350993 232.774013\nv 203.556628 123.538394 232.807041\nv 203.143259 123.971315 231.910081\nv 207.039773 122.370711 233.404964\nv 206.557166 122.857285 232.556257\nv 207.537389 122.586474 232.508494\nv 208.030674 122.708685 231.829372\nv 207.804413 123.172018 230.814449\nv 208.780305 122.807656 230.984033\nv 208.513281 122.222112 232.678079\nv 208.589695 121.931648 233.327549\nv 212.692422 121.566132 230.782524\nv 215.159925 119.915444 232.327178\nv 215.123310 120.332353 231.435003\nv 216.557721 119.817540 231.173571\nv 217.489780 124.332222 217.819113\nv 218.102571 124.983228 214.737795\nv 218.761597 124.632200 215.090077\nv 218.102571 124.776180 215.484518\nv 217.550819 125.296530 214.367390\nv 216.915326 125.709193 213.709226\nv 216.782242 127.004316 208.659462\nv 216.391969 128.511568 201.892128\nv 216.129368 128.432559 202.818621\nv 217.303204 130.076334 188.283798\nv 218.116165 129.791025 188.293024\nv 218.761597 129.565449 188.314400\nv 216.715438 130.831829 179.837803\nv 216.307078 130.919464 180.975293\nv 215.764487 131.130417 180.204562\nv 216.862728 130.809563 179.052296\nv 216.696369 130.886931 178.250978\nv 218.761597 130.148651 179.142399\nv 215.752131 131.263706 172.447421\nv 218.761597 130.192955 171.610649\nv 218.156486 130.416786 172.049280\nv 217.991179 130.485621 172.830669\nv 217.991179 130.496772 174.030948\nv 218.761597 130.216656 173.684273\nv 215.745951 130.815056 163.089869\nv 214.996568 131.018012 162.352509\nv 216.671753 130.106453 159.148226\nv 216.988738 129.929859 158.580812\nv 217.946626 129.798544 160.668899\nv 218.044565 129.680592 159.939560\nv 218.761597 129.546173 161.174725\nv 217.946626 129.901815 161.615825\nv 217.781213 130.105620 163.228893\nv 217.781213 130.044539 162.563767\nv 218.761597 129.710525 162.786778\nv 217.952223 130.166065 164.907903\nv 217.952223 130.111819 164.137704\nv 218.761597 129.825851 164.222103\nv 214.913497 120.718219 230.716051\nv 214.647824 121.237995 229.732953\nv 215.512001 120.729099 230.109354\nv 214.399092 121.688594 228.865725\nv 216.422371 120.301145 230.204775\nv 211.233267 122.637747 229.390088\nv 211.055341 123.111146 228.318737\nv 211.997923 122.581838 228.874588\nv 214.169806 122.130003 227.998993\nv 215.017042 121.690284 228.259524\nv 214.013721 122.521430 227.107233\nv 215.427997 121.786867 227.600202\nv 215.283329 122.765225 225.119852\nv 216.690455 122.527176 224.217860\nv 218.081817 122.120715 223.742392\nv 218.761597 121.721701 224.060001\nv 203.834450 123.182602 233.548072\nv 203.825127 124.071140 231.233111\nv 204.455599 124.138585 230.633486\nv 206.187742 123.457361 231.246760\nv 206.838057 123.481352 230.730410\nv 206.248551 123.170412 231.954773\nv 204.191504 124.506524 229.847078\nv 205.386219 124.635464 228.705106\nv 206.300627 124.291517 228.975165\nv 206.707787 124.402379 228.376734\nv 208.609262 123.649305 228.921271\nv 206.556282 124.736276 227.562166\nv 207.799160 124.785863 226.443902\nv 208.565079 124.410086 226.893100\nv 209.285471 124.388825 226.336906\nv 210.962629 123.520168 227.282141\nv 211.703307 123.443472 226.839441\nv 209.183173 124.756372 225.374618\nv 210.646749 124.631678 224.434938\nv 211.489724 124.187434 224.954526\nv 212.217428 124.079447 224.550392\nv 213.913736 122.871448 226.253223\nv 212.953833 123.966914 224.143354\nv 213.668660 123.902275 223.590030\nv 215.225276 123.092588 224.257831\nv 215.977003 123.013220 223.657184\nv 213.553611 124.257466 222.696022\nv 214.786478 124.191663 221.550232\nv 215.653254 123.757105 221.843593\nv 216.094439 123.827767 221.118814\nv 215.846300 124.189021 220.316962\nv 216.947373 124.130341 219.179060\nv 217.656605 123.788549 219.373853\nv 218.140290 122.307529 223.130511\nv 218.140290 122.649431 222.180411\nv 218.761597 122.227701 222.653896\nv 217.809550 123.019323 221.506837\nv 218.270642 123.513432 219.463781\nv 218.761597 123.281574 219.549801\nv 189.846350 126.174357 231.585985\nv 189.525577 125.891597 232.466742\nv 188.931683 126.223630 231.659233\nv 192.018596 125.946707 231.628130\nv 192.491839 126.151838 230.880786\nv 190.954324 126.054539 231.634767\nv 192.320512 126.908913 228.767572\nv 191.744653 126.751743 229.422319\nv 191.364739 127.018713 228.745630\nv 194.491178 125.912448 230.876355\nv 195.083715 125.581053 231.610686\nv 193.107850 126.339432 230.164897\nv 193.674559 126.521455 229.431041\nv 194.081983 126.218945 230.151677\nv 194.241146 126.704189 228.701821\nv 193.267013 126.824677 228.715040\nv 196.008319 125.457734 231.591066\nv 195.057887 126.094470 230.142500\nv 195.539281 126.271863 229.426533\nv 197.215307 126.715934 227.400765\nv 196.573457 126.594109 228.054625\nv 196.334345 126.881388 227.310938\nv 197.657507 126.159610 228.838355\nv 198.384397 126.172093 228.433311\nv 199.005722 126.271609 227.834193\nv 199.557289 126.449522 227.016592\nv 199.865942 126.093443 227.904570\nv 200.048460 126.554585 226.451562\nv 199.188240 126.732751 226.381184\nv 201.688842 125.243815 229.347731\nv 200.840365 125.924125 227.865499\nv 201.345854 126.095485 227.053036\nv 202.533650 125.035592 229.425671\nv 200.749035 126.398484 226.517544\nv 201.677380 126.222612 226.483610\nv 201.687477 126.503626 225.635909\nv 202.284296 126.200627 226.171401\nv 203.271666 124.797972 229.616574\nv 203.072925 126.192658 225.681145\nv 203.062828 125.911644 226.528847\nv 205.088584 124.990958 227.895496\nv 205.748188 125.035250 227.301162\nv 203.235722 125.604076 227.330399\nv 204.477966 125.981082 225.364902\nv 205.310464 125.717807 225.572121\nv 205.956358 125.767555 224.924930\nv 207.636961 125.134586 225.535708\nv 208.338664 125.128352 224.990593\nv 205.759571 126.113921 224.021979\nv 207.189390 126.138488 222.812998\nv 208.087881 125.785888 223.170835\nv 208.831711 125.736066 222.666354\nv 210.546069 124.953835 223.546433\nv 208.751420 126.049723 221.742021\nv 209.619017 125.678165 222.135123\nv 210.458659 125.279218 222.605186\nv 210.378369 125.592876 221.680853\nv 212.793906 124.651363 222.262556\nv 210.342097 125.917157 220.691084\nv 212.033586 125.707272 219.674658\nv 212.821938 125.278340 220.241860\nv 214.659070 124.477680 220.768188\nv 215.074926 124.539409 220.099801\nv 213.588843 125.643949 218.199104\nv 214.537230 125.304087 218.246059\nv 215.175145 125.267201 217.585428\nv 216.813915 124.443843 218.301266\nv 217.444792 124.861260 216.059258\nv 181.846099 127.014955 230.266589\nv 181.119729 126.992545 230.340333\nv 181.518474 127.230345 229.628836\nv 182.675009 127.004957 230.262506\nv 180.958197 127.431482 229.001001\nv 181.684567 127.453892 228.927257\nv 184.399056 127.513658 228.555206\nv 185.395627 127.543112 228.363955\nv 184.989388 127.295091 229.191704\nv 183.453237 127.497106 228.688438\nv 183.859476 127.745127 227.860690\nv 185.131008 128.010875 226.896893\nv 184.131184 127.995471 227.045554\nv 184.456897 128.244668 226.214990\nv 186.691957 127.132690 229.464507\nv 186.829471 127.350818 228.773295\nv 187.535469 127.158963 229.237348\nv 185.599262 127.029242 229.921377\nv 187.188845 128.001415 226.608349\nv 186.123445 128.014894 226.746210\nv 186.522121 128.246593 225.928469\nv 188.987680 127.400850 228.179918\nv 189.627689 127.488130 227.742079\nv 189.718495 127.220169 228.586885\nv 189.271476 127.913687 226.445029\nv 188.242197 127.950963 226.562860\nv 188.616799 128.195839 225.672777\nv 191.149551 127.241666 228.119965\nv 190.627772 127.482216 227.503706\nv 191.418819 127.416432 227.474624\nv 190.573692 127.084497 228.774712\nv 191.259769 127.857695 226.084987\nv 190.271559 127.907773 226.206656\nv 190.634288 128.108485 225.433278\nv 193.322321 127.272249 227.311809\nv 193.888827 127.462137 226.468073\nv 194.400106 127.197298 227.142083\nv 192.887099 127.091647 228.038351\nv 195.002814 127.666258 225.371343\nv 194.195068 127.637749 225.778130\nv 194.231270 127.916820 224.851126\nv 195.329553 127.073375 227.131572\nv 195.971404 127.195199 226.477712\nv 195.951775 127.709143 224.803707\nv 195.915572 127.430072 225.730711\nv 198.524205 127.239414 225.106036\nv 199.247432 127.115675 225.123749\nv 198.956184 126.961554 225.798442\nv 198.465013 126.856490 226.363472\nv 197.836632 126.815450 226.801646\nv 197.604577 127.044253 226.218903\nv 198.777137 127.684956 223.474319\nv 197.879899 127.680141 223.963257\nv 197.841582 127.971563 223.006233\nv 200.910409 126.745659 225.353704\nv 201.076261 128.002779 221.018434\nv 201.930643 127.770399 221.270044\nv 201.263191 127.757614 221.743629\nv 200.351774 128.272504 220.528178\nv 199.558778 128.232542 221.160428\nv 199.501742 128.515052 220.196587\nv 202.939288 126.472713 224.916413\nv 202.184551 127.262221 222.845275\nv 203.161675 127.221707 222.282035\nv 204.655126 126.488335 223.630022\nv 204.344329 126.261137 224.600170\nv 203.588337 127.851985 219.837576\nv 204.331698 127.687606 219.859459\nv 203.934613 127.550108 220.621607\nv 202.686453 128.030113 219.844633\nv 202.467482 127.865025 220.572286\nv 206.026108 127.111892 220.489940\nv 206.840423 127.089751 219.884723\nv 204.946559 127.709570 219.285149\nv 205.292835 127.407693 220.069180\nv 210.216958 126.897814 217.399819\nv 210.207163 127.169457 216.419552\nv 211.072040 126.757647 217.029842\nv 209.390183 126.990879 217.910763\nv 211.910612 126.826327 215.840055\nv 211.125765 127.231637 215.223377\nv 211.974132 127.028674 215.013856\nv 211.766988 126.652067 216.640524\nv 213.063159 127.245475 212.891779\nv 212.214354 127.408919 213.239270\nv 212.352556 127.604050 212.300984\nv 213.603049 126.433696 215.314103\nv 212.057121 127.242163 214.113622\nv 212.841968 126.836854 214.730300\nv 213.686039 126.647186 214.413868\nv 213.730205 126.889618 213.429495\nv 213.868407 127.084749 212.491208\nv 213.904697 127.286168 211.662381\nv 214.571742 126.930311 212.200097\nv 215.244944 126.633847 212.431177\nv 215.816785 126.824982 210.883128\nv 215.281234 126.835266 211.602350\nv 215.143583 127.121445 210.652048\nv 218.047243 126.163311 210.295099\nv 218.761597 125.830852 210.558826\nv 218.064367 126.333618 209.571099\nv 218.761597 126.097202 209.467552\nv 195.784160 135.413583 171.250425\nv 196.852363 135.293475 171.638754\nv 196.226807 135.363034 172.292144\nv 193.434686 135.602051 167.806501\nv 192.581110 135.674727 167.687891\nv 197.243995 135.201013 175.562879\nv 196.986709 135.201470 176.642245\nv 196.295225 135.296497 176.057851\nv 194.363745 135.554915 172.329807\nv 195.173945 135.474993 172.782105\nv 194.379085 135.546766 173.208096\nv 194.371925 135.553982 171.628482\nv 193.577065 135.625755 172.054474\nv 192.255967 135.732039 170.822910\nv 191.240941 135.806984 171.092299\nv 191.464188 135.787826 170.229419\nv 195.597835 135.290956 178.870752\nv 195.465936 135.332334 177.870023\nv 196.169837 135.255576 178.137946\nv 194.459046 135.426631 177.997385\nv 194.160396 135.422357 178.881566\nv 193.725507 135.481274 178.276121\nv 194.356511 135.481899 176.475343\nv 193.427739 135.559475 176.731036\nv 193.760094 135.555826 175.814439\nv 192.693076 135.694197 173.013113\nv 193.441354 135.636119 173.553003\nv 192.565545 135.703627 173.810317\nv 192.800802 135.688943 172.220795\nv 191.924993 135.756451 172.478109\nv 190.349405 135.865906 171.353116\nv 189.445017 135.917659 171.756867\nv 189.544774 135.914524 170.902558\nv 192.837989 135.547173 178.508206\nv 192.597841 135.529507 179.428550\nv 192.008973 135.599679 178.776454\nv 192.540222 135.625374 176.963121\nv 191.692677 135.682704 177.190725\nv 191.983777 135.690733 176.297736\nv 190.949635 135.815108 173.554479\nv 191.678114 135.767699 174.066575\nv 190.810483 135.821101 174.350626\nv 191.033457 135.815373 172.738926\nv 190.165826 135.868776 173.022977\nv 188.564119 135.962167 172.193586\nv 187.696761 135.996079 172.681753\nv 187.773028 136.000189 171.794476\nv 190.859135 135.591139 180.827325\nv 191.059148 135.616736 179.944004\nv 191.568812 135.556416 180.580119\nv 189.352409 135.789064 178.258140\nv 189.024145 135.837606 177.521786\nv 189.137636 135.903133 175.119226\nv 189.221829 135.907934 174.307546\nv 189.997812 135.863710 174.650211\nv 189.284929 135.913284 173.459697\nv 188.424753 135.952707 173.928712\nv 186.823764 136.026650 173.164502\nv 185.982169 136.049562 173.500975\nv 186.064075 136.057012 172.619116\nv 185.538494 135.916551 178.958379\nv 185.483227 135.877777 179.811989\nv 184.535646 135.935159 179.197410\nv 188.388080 135.683368 181.682363\nv 188.023412 135.749171 180.687295\nv 189.093645 135.689100 180.884669\nv 187.428596 135.961412 176.126491\nv 187.473429 135.972501 175.286306\nv 188.316819 135.936269 175.616746\nv 185.099694 136.070384 173.838617\nv 184.244532 136.083681 174.068346\nv 184.367318 136.093221 173.185318\nv 184.844559 136.048875 175.629853\nv 183.911829 136.060999 175.881091\nv 184.044179 136.072968 174.972882\nv 183.645584 136.046330 176.893021\nv 183.584936 136.014843 177.795890\nv 183.742112 135.969353 178.732994\nv 182.792720 135.864340 181.220572\nv 183.642497 135.858995 181.112462\nv 183.329194 135.829264 181.783779\nv 180.508068 136.016278 164.852998\nv 181.461825 136.027619 165.107921\nv 180.946411 136.047043 165.780704\nv 184.123343 135.972599 164.255852\nv 184.504640 135.990467 164.929911\nv 183.412409 136.005836 164.863294\nv 183.497709 135.860699 161.825058\nv 183.028758 135.911489 162.603359\nv 182.465640 136.023176 165.112431\nv 182.846937 136.041044 165.786490\nv 183.551015 135.943449 163.388195\nv 184.643246 135.928081 163.454813\nv 185.643745 135.902281 163.444479\nv 186.568702 135.788330 161.803353\nv 186.248621 135.922237 164.203569\nv 187.504569 135.749636 161.794869\nv 188.381834 135.706921 161.793213\nv 188.562724 135.775881 163.290999\nv 188.231733 135.834531 164.058573\nv 188.915032 135.720586 162.502935\nv 189.534107 135.726523 163.244414\nv 195.746277 134.956051 159.467103\nv 196.028135 134.976844 160.303600\nv 196.488489 134.979190 161.219530\nv 196.834894 135.003388 162.236426\nv 196.748167 135.175400 165.043693\nv 195.997686 135.215226 164.194528\nv 194.254531 135.415966 164.654038\nv 193.440792 135.491170 164.599958\nv 194.449180 135.464573 166.170746\nv 194.853551 135.389610 165.277420\nv 195.398028 135.370231 166.092790\nv 193.908737 135.302394 161.717888\nv 192.505765 135.500294 163.008909\nv 193.095716 135.410841 162.347320\nv 192.958627 135.562524 165.401780\nv 192.494715 135.569741 164.646363\nv 193.990142 135.536166 166.996396\nv 192.034291 135.575616 163.877351\nv 191.611580 135.741777 167.746298\nv 192.017097 135.694187 167.065082\nv 190.825422 135.805284 167.954507\nv 189.799142 135.871841 168.109038\nv 190.021287 135.827795 167.278021\nv 188.893977 135.921283 168.434176\nv 187.959005 135.976702 169.017690\nv 188.060034 135.949771 168.016066\nv 185.450854 136.054823 168.660088\nv 186.268012 136.022592 168.220389\nv 186.307905 136.037420 169.039279\nv 185.459595 136.082689 170.338716\nv 184.802217 136.105863 170.731714\nv 184.833369 136.092826 169.871975\nv 183.095278 136.113539 169.566946\nv 184.005809 136.104626 169.579654\nv 183.265459 136.124914 170.252266\nv 183.324132 132.930308 206.598282\nv 185.122429 132.799602 207.114940\nv 184.237960 132.713157 207.725315\nv 184.264975 132.874601 206.800796\nv 185.949940 133.357553 203.702102\nv 185.179579 133.345377 203.919853\nv 185.333085 133.467959 203.166734\nv 186.983085 132.864618 206.367586\nv 185.998733 132.846954 206.688653\nv 186.133795 132.978709 205.869355\nv 187.612340 133.354914 203.286355\nv 186.778382 133.360945 203.478254\nv 186.937403 133.474104 202.757084\nv 188.788841 132.890746 205.661734\nv 187.894168 132.880258 205.991201\nv 188.012820 133.006861 205.218822\nv 189.350410 133.347181 202.756667\nv 188.465159 133.355362 203.009383\nv 188.656611 133.459891 202.312468\nv 190.558322 132.887221 205.042668\nv 189.696794 132.889009 205.358572\nv 189.769021 133.015561 204.573450\nv 190.981523 133.303382 202.323417\nv 190.097774 133.338458 202.511093\nv 190.425611 133.416634 201.872076\nv 192.290204 132.899252 204.169750\nv 191.443510 132.880524 204.678179\nv 191.477243 133.032501 203.749116\nv 192.438953 133.592352 199.801316\nv 191.747391 133.742216 199.080214\nv 192.558002 133.706828 198.875513\nv 192.654836 133.174137 202.304016\nv 191.816649 133.216393 202.462544\nv 192.147548 133.339302 201.525874\nv 193.923975 132.624167 204.948009\nv 194.625813 132.666493 204.241951\nv 194.786550 132.536624 204.936787\nv 195.614902 132.994352 201.587455\nv 195.425302 132.864362 202.516581\nv 194.541209 133.072297 201.830975\nv 194.798989 133.341882 199.973351\nv 193.990187 133.379625 200.249232\nv 194.058367 133.519221 199.320734\nv 195.679331 133.309119 199.548915\nv 195.611151 133.169524 200.477413\nv 198.410257 132.648583 201.633643\nv 198.921697 132.690255 200.918523\nv 199.135032 132.522387 201.805852\nv 196.563953 133.287716 198.980644\nv 197.458818 133.267543 198.386921\nv 197.386359 133.116588 199.459253\nv 199.713809 132.675584 200.299347\nv 200.474994 132.619523 199.929113\nv 200.407656 132.507999 200.720499\nv 198.485372 133.203510 197.946730\nv 199.389555 133.157424 197.394668\nv 199.185407 133.050329 198.313467\nv 201.332483 132.561604 199.442363\nv 202.208848 132.483854 199.002076\nv 202.045206 132.374188 199.909977\nv 200.274039 133.097180 196.907907\nv 201.140160 133.030145 196.433238\nv 200.955710 132.937208 197.286736\nv 203.074586 132.404641 198.542186\nv 203.943169 132.311585 198.114798\nv 203.790154 132.203382 199.042302\nv 201.974210 132.959076 195.948643\nv 202.821261 132.879132 195.467448\nv 202.668882 132.790230 196.330873\nv 204.807094 132.219379 197.637668\nv 205.693096 132.117298 197.136596\nv 205.544739 132.008245 198.113842\nv 203.649871 132.810380 194.926336\nv 204.491940 132.719306 194.416523\nv 204.358002 132.619213 195.339866\nv 206.555041 132.015827 196.598840\nv 207.444829 131.907870 195.989403\nv 207.320529 131.798208 197.003334\nv 205.311993 132.634362 193.862452\nv 206.143397 132.536815 193.300966\nv 206.031475 132.430592 194.268568\nv 208.284646 131.801428 195.399151\nv 209.133500 131.699774 194.669587\nv 209.059171 131.588598 195.664333\nv 206.942059 132.438154 192.745008\nv 207.754028 132.333257 192.124078\nv 207.674848 132.228147 193.086153\nv 209.955745 131.590754 193.981671\nv 210.768191 131.468306 193.334069\nv 210.720470 131.364497 194.287166\nv 208.532562 132.228225 191.504758\nv 209.338188 132.114130 190.814740\nv 209.292444 132.009154 191.775206\nv 210.120485 131.998529 190.113716\nv 210.923417 131.855689 189.495812\nv 210.901003 131.752219 190.467285\nv 212.506717 131.133339 192.233112\nv 213.302633 130.977176 191.668792\nv 212.644179 131.700999 186.077846\nv 212.602617 131.617394 187.205759\nv 211.800303 131.886102 186.626032\nv 213.931000 130.873521 190.995866\nv 214.710010 130.696108 190.524765\nv 212.554807 131.537802 188.218661\nv 213.398683 131.352699 187.670474\nv 214.260265 131.310118 185.169372\nv 214.197936 131.257370 186.005868\nv 213.508821 131.485040 185.821076\nv 215.684399 130.610952 188.242252\nv 215.478535 130.573724 189.355214\nv 214.327981 131.130364 187.069066\nv 215.079425 130.955442 186.417362\nv 214.031334 131.453435 184.250443\nv 217.025248 130.444159 184.819305\nv 218.093526 130.088945 184.746163\nv 216.734500 130.606118 183.897604\nv 216.323587 130.693983 184.626482\nv 216.631395 130.692988 183.089359\nv 215.694482 131.036997 182.523417\nv 216.293039 130.874043 181.907994\nv 214.923822 131.293567 182.429179\nv 218.093779 130.150634 183.794288\nv 218.751144 129.883284 184.450024\nv 217.243991 130.575456 181.541235\nv 183.011392 134.636445 195.282124\nv 182.217563 134.592052 195.713006\nv 182.266210 134.677434 194.970449\nv 183.320147 134.998554 192.001709\nv 182.378420 134.990792 192.201518\nv 182.505745 135.081975 191.347992\nv 184.539590 134.657240 194.922006\nv 183.718859 134.647405 195.133031\nv 183.880769 134.731662 194.328542\nv 185.165800 134.999858 191.647198\nv 184.216406 135.001535 191.814614\nv 184.396864 135.088060 190.980768\nv 186.223564 134.646500 194.586717\nv 185.375475 134.652165 194.762437\nv 185.549589 134.735832 193.941797\nv 186.949856 134.982966 191.241185\nv 186.046647 134.991806 191.460968\nv 186.249468 135.077543 190.593568\nv 187.955664 134.616442 194.219250\nv 187.100434 134.631949 194.401130\nv 187.252909 134.714661 193.584197\nv 188.698930 134.944779 190.830765\nv 187.831578 134.963815 191.053458\nv 188.020029 135.049667 190.151092\nv 189.568606 134.575247 193.832523\nv 188.699217 134.607525 193.966471\nv 188.977528 134.666876 193.268369\nv 190.323654 134.896945 190.363092\nv 189.634977 134.914732 190.592472\nv 189.576058 135.012844 189.699020\nv 190.367648 134.512387 193.912238\nv 190.739068 134.583127 193.066510\nv 191.259798 134.460916 193.844327\nv 191.897671 134.768046 190.519200\nv 191.295702 134.730157 191.277875\nv 190.984542 134.836722 190.497868\nv 191.284879 134.979134 188.887146\nv 190.925623 134.934834 189.604416\nv 190.623990 135.039357 188.752370\nv 191.920024 134.596568 192.148903\nv 192.525009 134.478119 192.846721\nv 191.920258 135.006541 188.096655\nv 191.397805 135.114186 187.267583\nv 192.334817 135.037070 187.329138\nv 194.540623 134.760283 188.277624\nv 193.576797 134.814091 188.656847\nv 193.821096 134.875618 187.778987\nv 194.073724 134.629039 190.060950\nv 194.904636 134.578311 189.775063\nv 194.682036 134.508593 190.680531\nv 195.715186 134.525065 189.482599\nv 196.532560 134.471083 189.121075\nv 196.330322 134.403884 190.033119\nv 195.089203 134.858575 186.572732\nv 195.891788 134.795925 186.323848\nv 195.587507 134.759160 187.150879\nv 197.280757 134.411663 188.835066\nv 198.056032 134.354956 188.419894\nv 197.922971 134.293196 189.256424\nv 196.686125 134.728281 186.112330\nv 197.313171 134.666847 185.946626\nv 197.017139 134.635076 186.736290\nv 198.755261 134.303104 188.018170\nv 199.503420 134.240420 187.597179\nv 199.446405 134.173805 188.420260\nv 200.226602 134.179682 187.133350\nv 200.969134 134.109204 186.668654\nv 200.937097 134.040644 187.534573\nv 198.830900 134.605760 184.258362\nv 199.660434 134.516154 183.855049\nv 199.500610 134.467013 184.861028\nv 201.717176 134.032762 186.207432\nv 202.468083 133.949546 185.728511\nv 202.430536 133.886952 186.590956\nv 200.430192 134.426751 183.525893\nv 201.163942 134.349535 183.075331\nv 201.063893 134.300190 184.007154\nv 203.211038 133.862106 185.232902\nv 203.987013 133.767154 184.673645\nv 203.957418 133.708784 185.552778\nv 201.832286 134.271634 182.770030\nv 202.532391 134.188451 182.229529\nv 202.497748 134.139791 183.016090\nv 204.739915 133.672981 184.091911\nv 205.536657 133.556566 183.543435\nv 205.530134 133.497418 184.445046\nv 203.050508 134.140248 181.528276\nv 203.779138 134.041035 181.005658\nv 203.926483 133.957396 181.952970\nv 206.265754 133.446671 182.989664\nv 207.007171 133.324344 182.435093\nv 207.068293 133.258676 183.341999\nv 204.685721 133.899539 180.580066\nv 205.336143 133.794018 180.177090\nv 205.305535 133.752663 181.027376\nv 207.597792 133.233579 181.837665\nv 208.204270 133.138387 181.109199\nv 208.416187 133.041157 182.058962\nv 208.719002 133.058876 180.329193\nv 209.301743 132.956035 179.564828\nv 209.605406 132.843123 180.566132\nv 206.395082 133.672539 177.898632\nv 207.123277 133.537163 177.090035\nv 207.259546 133.478120 178.149362\nv 207.770041 133.416462 176.334701\nv 208.534142 133.252421 175.780283\nv 208.751843 133.178703 176.786348\nv 210.164211 132.874492 174.892689\nv 210.262264 132.831682 175.705241\nv 209.417891 133.057472 175.419379\nv 212.435549 132.211601 177.891336\nv 212.321101 132.259588 177.047951\nv 210.423882 132.775904 176.517266\nv 211.170203 132.592925 175.990576\nv 209.836156 132.968152 173.357027\nv 209.925220 132.947786 174.159198\nv 209.230774 133.120648 173.804656\nv 211.888285 132.407589 175.258717\nv 212.049903 132.351811 176.070741\nv 210.769594 132.721996 174.445061\nv 211.315530 132.577821 172.720553\nv 211.274481 132.590264 173.646396\nv 210.571652 132.782846 172.785726\nv 213.723542 131.885807 175.330557\nv 214.222839 131.743634 174.434478\nv 211.656783 132.475032 171.732530\nv 212.359612 132.282450 172.593200\nv 212.023369 132.359827 170.749171\nv 210.979288 132.655198 170.876524\nv 212.072158 132.328120 169.803221\nv 212.749653 132.147954 170.659226\nv 212.554269 132.167550 168.954188\nv 211.827985 132.379422 169.044134\nv 214.963458 131.452891 169.906216\nv 213.505284 131.912481 170.068632\nv 213.406400 131.914516 169.117819\nv 214.113242 131.710749 169.473176\nv 213.853196 131.728400 167.557584\nv 213.162227 131.965818 168.358732\nv 213.001064 131.981434 167.393954\nv 214.645517 131.450405 167.073447\nv 214.639989 131.407494 166.219496\nv 215.593474 131.113882 166.700137\nv 213.905381 131.619826 165.675334\nv 217.261334 130.471371 165.739629\nv 216.483882 130.780840 166.250970\nv 216.365398 130.761501 165.334846\nv 215.179188 131.071682 163.783141\nv 182.298240 134.007916 200.017582\nv 182.006563 133.892714 200.812843\nv 181.330571 134.016476 199.995426\nv 183.601619 134.253104 198.125933\nv 182.620003 134.265511 198.140858\nv 182.851424 134.375709 197.313595\nv 184.792691 133.814133 201.087826\nv 183.834834 133.793471 201.360621\nv 183.932090 133.904815 200.562204\nv 185.400802 134.251004 197.834009\nv 184.512762 134.254187 197.969982\nv 184.721079 134.360120 197.162697\nv 186.519972 133.821340 200.665490\nv 185.630417 133.820945 200.876723\nv 185.779503 133.925873 200.078176\nv 187.234189 134.232724 197.477801\nv 186.312501 134.244729 197.648668\nv 186.530806 134.344931 196.855857\nv 188.288777 133.805739 200.219178\nv 187.397133 133.814873 200.444634\nv 187.560702 133.917135 199.641487\nv 189.132726 134.195602 197.028663\nv 188.127834 134.216673 197.279517\nv 188.457386 134.311856 196.434136\nv 190.041160 133.777584 199.710127\nv 189.190446 133.792257 199.963213\nv 189.303060 133.893328 199.162946\nv 190.878838 134.093827 196.943544\nv 189.888189 134.172421 196.858354\nv 190.452927 134.212191 196.268472\nv 190.891058 133.753198 199.457938\nv 191.010107 133.867674 198.532135\nv 192.307948 134.038773 196.532741\nv 192.519380 133.900321 197.433115\nv 191.655008 133.995145 197.254036\nv 191.165977 134.261887 195.521859\nv 191.902680 134.309314 194.712385\nv 192.180279 134.181025 195.544188\nv 192.274100 134.380054 193.866656\nv 194.808498 134.040480 194.783054\nv 193.817861 134.079997 195.217433\nv 193.907620 134.188935 194.300334\nv 194.762796 133.820600 196.524865\nv 195.385113 133.816209 196.046672\nv 195.429170 133.705267 196.871384\nv 196.495289 133.961158 193.942667\nv 195.628936 134.007506 194.350579\nv 195.764612 134.103070 193.458044\nv 196.205550 133.783236 195.614196\nv 196.938252 133.725706 195.408302\nv 196.784188 133.643346 196.187296\nv 198.097923 133.860610 193.178988\nv 197.289964 133.911947 193.581917\nv 197.438923 134.005385 192.647202\nv 197.732927 133.676494 195.047552\nv 198.559114 133.618855 194.665124\nv 198.343078 133.528177 195.598974\nv 199.678680 133.751880 192.272835\nv 198.889462 133.808534 192.737671\nv 199.036100 133.897393 191.779437\nv 199.350653 133.566779 194.223808\nv 200.168834 133.512381 193.716563\nv 199.987446 133.416140 194.709301\nv 201.248307 133.630321 191.285726\nv 200.473319 133.694836 191.754981\nv 200.600306 133.776224 190.845346\nv 200.963473 133.455338 193.198709\nv 201.774880 133.392384 192.652287\nv 201.617034 133.298787 193.655634\nv 202.797484 133.483674 190.296423\nv 202.037270 133.560558 190.755579\nv 202.135508 133.634824 189.916936\nv 202.563844 133.322621 192.122139\nv 203.367341 133.246481 191.572024\nv 203.231938 133.159693 192.559098\nv 204.313468 133.314368 189.334402\nv 203.565809 133.400994 189.814016\nv 203.643380 133.471313 188.978166\nv 204.135666 133.163801 191.089617\nv 204.920961 133.073778 190.562220\nv 204.820730 132.993530 191.481586\nv 205.795257 133.127295 188.313718\nv 205.058750 133.223003 188.837237\nv 205.127545 133.288979 187.975034\nv 205.666243 132.982413 190.065055\nv 206.419701 132.883223 189.548770\nv 206.359483 132.804318 190.437904\nv 207.151713 132.938913 187.318538\nv 206.505743 133.032258 187.765333\nv 206.510022 133.099927 187.004721\nv 207.130187 132.788186 189.000385\nv 207.866339 132.688463 188.363509\nv 207.849092 132.605406 189.284744\nv 208.221713 132.827517 185.847240\nv 207.818411 132.849399 186.673347\nv 207.559295 132.984701 185.731819\nv 208.533037 132.598949 187.718318\nv 209.293668 132.488084 186.963637\nv 209.345876 132.394818 187.893187\nv 209.666021 132.614803 184.226473\nv 208.911829 132.730057 185.045542\nv 208.716790 132.847564 184.086643\nv 209.983783 132.390624 186.161939\nv 210.851463 132.233501 185.341746\nv 210.974187 132.126830 186.318313\nv 210.947065 132.402788 182.565410\nv 210.340146 132.504383 183.374212\nv 210.077901 132.630715 182.458770\nv 211.525588 132.123082 184.489486\nv 212.072657 132.039896 183.519199\nv 212.388935 131.886522 184.527833\nv 211.023979 132.515663 179.994225\nv 211.272316 132.410082 180.918325\nv 210.436484 132.634700 180.725867\nv 212.627328 131.939530 182.710110\nv 213.026975 131.869096 181.978115\nv 213.335651 131.732902 182.825551\nv 211.501736 132.302422 181.756320\nv 212.089231 132.183384 181.024678\nv 212.254498 132.236278 178.765693\nv 212.404045 132.161213 179.614350\nv 211.710264 132.366109 179.338026\nv 214.113408 131.515774 182.804931\nv 212.654424 132.057140 180.354487\nv 213.198658 131.927308 179.782153\nv 213.697642 131.808508 179.036513\nv 213.129330 132.006706 178.167659\nv 213.878693 131.783832 178.162155\nv 215.063034 131.465335 176.256176\nv 214.378676 131.653781 177.241711\nv 213.994740 131.793584 176.307767\nv 215.755790 131.246866 175.320293\nv 215.103692 131.476703 174.380453\nv 217.797039 130.549895 175.764028\nv 217.797039 130.558199 175.101453\nv 218.761597 130.219501 175.547127\nv 208.140347 132.906742 161.534854\nv 210.101853 132.581144 163.710630\nv 209.856591 132.697715 164.477458\nv 210.756598 132.451630 164.371837\nv 208.240970 133.069706 164.070272\nv 209.073932 132.903863 164.509127\nv 208.113054 133.146340 164.763149\nv 209.728676 132.774349 165.170335\nv 209.327576 132.917409 165.874430\nv 210.110235 132.711262 165.842761\nv 204.795729 134.050980 169.720036\nv 205.203707 133.951534 169.044867\nv 205.680358 133.874745 169.788727\nv 206.558000 133.690191 169.934541\nv 207.444506 133.503308 170.102769\nv 203.017970 134.316319 166.888567\nv 203.411133 134.213411 166.095673\nv 203.887897 134.148314 166.759275\nv 208.269637 133.283284 168.729236\nv 197.871109 134.879112 162.235536\nv 198.426558 134.762108 161.567627\nv 200.160938 134.680148 164.676799\nv 199.644781 134.723163 163.855075\nv 201.252321 134.692527 171.466902\nv 200.257830 134.845134 171.957231\nv 200.394559 134.821984 171.011418\nv 201.852164 134.599185 173.019358\nv 202.012180 134.571216 172.207601\nv 202.748752 134.454725 172.814243\nv 203.906906 134.189495 168.264172\nv 203.453349 134.287939 168.992276\nv 203.041177 134.349666 168.280273\nv 201.723077 134.527052 166.572790\nv 200.978264 134.611729 165.897796\nv 201.796393 134.466093 165.549971\nv 202.101005 134.364358 164.665128\nv 202.845818 134.279681 165.340122\nv 200.377605 134.544753 162.638306\nv 202.461813 134.256809 163.754892\nv 203.464208 134.057272 163.475805\nv 202.775591 134.136135 162.775418\nv 204.444552 133.863307 163.387625\nv 205.513383 133.651291 163.406763\nv 206.979871 133.477601 166.140166\nv 206.670746 133.491716 165.158704\nv 207.589218 133.298068 165.305756\nv 208.803739 133.069137 166.417037\nv 209.193531 133.009678 167.277656\nv 208.422180 133.132225 165.744611\nv 204.380801 134.141991 170.451192\nv 204.844201 134.067529 171.066806\nv 203.952621 134.235329 171.054102\nv 201.158676 134.695261 169.599740\nv 201.757961 134.584628 168.843385\nv 201.988336 134.558744 169.764733\nv 201.509219 134.618437 168.197961\nv 200.916625 134.696916 167.799503\nv 201.497543 134.594209 167.319072\nv 200.089466 134.805048 167.404020\nv 200.101143 134.829277 168.282908\nv 200.108562 134.771951 166.476337\nv 199.293080 134.904312 166.959742\nv 198.503054 134.963374 165.459990\nv 198.300169 135.021223 166.505507\nv 197.491048 135.113383 165.933438\nv 198.281074 135.054320 167.433190\nv 198.473557 135.056080 168.486231\nv 197.480646 135.172991 168.031996\nv 197.820063 135.168772 169.902524\nv 198.533443 135.070027 169.384839\nv 198.680377 135.064048 170.202327\nv 196.122213 135.363234 169.681504\nv 196.753920 135.278597 168.925505\nv 197.041423 135.259388 169.841036\nv 200.876706 134.737946 174.746583\nv 200.136261 134.837997 175.231593\nv 200.216590 134.832161 174.505382\nv 198.012591 135.110857 175.324663\nv 198.782924 135.023970 174.746222\nv 198.705811 135.019099 175.568833\nv 182.259408 135.320562 188.914477\nv 181.476282 135.358473 188.587045\nv 182.014193 135.411593 187.929089\nv 182.986618 135.556158 185.955980\nv 181.949656 135.547492 186.176620\nv 182.070277 135.613296 185.325171\nv 184.130498 135.317462 188.730053\nv 183.349865 135.316543 188.879271\nv 183.577952 135.374600 188.107303\nv 184.812961 135.557406 185.519964\nv 183.875055 135.559493 185.724389\nv 184.045145 135.619875 184.900106\nv 185.945902 135.307452 188.301881\nv 185.060950 135.311361 188.549035\nv 185.243537 135.371610 187.710932\nv 186.487801 135.545479 185.035178\nv 185.693063 135.556129 185.211522\nv 185.777790 135.607139 184.519337\nv 186.265782 135.431085 186.595571\nv 187.161014 135.424831 186.238394\nv 187.023721 135.361447 187.106602\nv 187.217466 135.490103 185.353320\nv 187.302192 135.541113 184.661136\nv 187.748145 135.287844 187.666239\nv 188.615566 135.268776 187.425806\nv 188.444758 135.201427 188.342621\nv 188.932989 135.395983 185.528117\nv 188.876537 135.330711 186.413191\nv 187.975405 135.420465 185.864351\nv 187.903770 135.556260 184.129427\nv 188.675883 135.551756 183.644838\nv 188.803970 135.481232 184.494689\nv 189.517198 135.550013 182.944918\nv 188.616998 135.625041 182.579656\nv 189.573150 135.244294 187.089572\nv 190.408683 135.194943 187.056028\nv 190.147712 135.133008 188.068644\nv 190.421104 135.389886 184.450253\nv 190.550123 135.304637 185.483681\nv 189.705102 135.391479 185.043528\nv 190.315188 135.527497 182.535988\nv 190.374073 135.454213 183.601169\nv 191.270430 135.481258 182.327840\nv 190.413555 135.577058 181.671588\nv 190.823242 135.225472 186.288512\nv 192.787406 135.299555 183.313851\nv 191.959804 135.340569 183.640210\nv 191.999664 135.390683 182.865880\nv 193.451759 135.162763 184.474613\nv 193.558513 135.205617 183.691776\nv 194.262727 135.118939 184.078209\nv 192.931751 135.387711 181.736297\nv 193.774976 135.338211 181.326841\nv 193.670491 135.300168 182.130064\nv 196.118862 135.085474 181.664557\nv 195.270474 135.148306 182.096383\nv 195.362103 135.187836 181.288783\nv 195.917920 135.004968 183.308582\nv 196.721947 134.933054 183.063372\nv 196.612633 134.892078 183.899795\nv 197.546468 134.856504 182.786625\nv 198.333499 134.773872 182.585523\nv 198.203692 134.737532 183.453484\nv 196.256113 135.169600 179.997816\nv 197.241220 135.072633 179.554404\nv 197.195598 135.028036 180.413544\nv 199.992416 134.722540 179.153173\nv 199.135407 134.801947 179.945643\nv 199.037715 134.851662 179.177662\nv 199.737184 134.683761 180.693456\nv 200.579631 134.581402 180.417529\nv 200.226708 134.592338 181.189831\nv 201.292809 134.495274 180.031462\nv 202.209813 134.362228 179.864992\nv 201.986159 134.356933 180.747434\nv 199.768181 134.828496 177.519684\nv 200.594360 134.730330 176.853991\nv 200.720905 134.674089 177.719499\nv 202.801239 134.399212 175.970362\nv 202.475233 134.424965 176.881514\nv 201.873091 134.550169 176.142654\nv 203.288827 134.264815 177.616912\nv 204.128742 134.124543 177.323097\nv 204.014188 134.115349 178.230788\nv 204.833572 133.999179 177.171991\nv 205.535927 133.877432 176.623156\nv 205.556458 133.853329 177.388139\nv 203.206711 134.361154 174.358267\nv 203.518531 134.315599 173.484017\nv 204.136506 134.194059 174.216285\nv 205.889498 133.821353 175.981930\nv 206.536262 133.700653 175.226596\nv 206.905577 133.610881 176.083970\nv 206.117598 133.813850 172.840149\nv 205.408705 133.950700 173.493980\nv 205.157219 134.011655 172.688205\nv 206.960712 133.621537 174.487280\nv 207.147120 133.585145 173.717443\nv 207.738748 133.453788 174.558799\nv 207.280170 133.554664 171.575919\nv 206.699394 133.689526 172.215345\nv 206.446888 133.739944 171.394949\nv 208.622497 133.258839 174.197894\nv 207.866671 133.416306 170.991527\nv 208.283513 133.314532 170.338774\nv 209.877206 132.955709 172.431184\nv 208.725392 133.194606 169.609534\nv 209.133682 133.076356 168.888753\nv 209.592658 132.934304 168.080119\nv 210.108262 132.778948 167.349319\nv 210.659432 132.593493 166.569116\nv 211.060533 132.450433 165.865020\nv 211.414532 132.307569 165.079553\nv 213.218229 131.771285 164.889151\nv 213.467334 131.639266 164.077028\nv 212.207428 131.908767 162.678831\nv 214.404901 131.343056 163.965858\nv 212.514763 131.747429 161.856886\nv 212.852364 131.572240 161.052141\nv 213.101334 131.421418 160.269454\nv 183.036817 130.428715 218.391968\nv 183.420234 130.561371 217.798026\nv 183.878288 130.426383 218.345633\nv 182.330198 130.389371 218.588555\nv 185.181273 131.004015 215.754762\nv 184.340509 131.048671 215.665002\nv 184.611376 131.176366 215.074263\nv 185.632048 130.339682 218.497998\nv 184.608683 130.378436 218.476689\nv 185.285070 130.520284 217.773000\nv 186.936017 131.021056 215.381867\nv 186.131605 130.995783 215.629526\nv 186.256553 131.156983 214.916365\nv 188.322739 130.353309 217.909455\nv 187.254278 130.327069 218.253302\nv 187.376897 130.507769 217.450463\nv 188.896970 131.045036 214.805845\nv 187.914443 131.030659 215.107855\nv 188.043492 131.196633 214.366697\nv 190.279730 130.367705 217.294791\nv 189.289135 130.364472 217.596388\nv 189.435953 130.537242 216.805019\nv 190.836584 131.045945 214.186420\nv 189.867666 131.043557 214.514815\nv 189.994937 131.213397 213.736292\nv 192.236022 130.356442 216.654015\nv 191.261524 130.363210 216.976946\nv 191.401046 130.533708 216.180491\nv 192.753279 131.060368 213.380516\nv 191.800024 131.046473 213.818945\nv 191.917110 131.229680 212.969467\nv 194.176704 130.323135 215.975272\nv 193.213945 130.339441 216.321110\nv 193.338302 130.510635 215.511723\nv 194.693633 131.076216 212.406287\nv 193.698620 131.061785 212.946907\nv 193.865377 131.258007 211.990418\nv 196.172531 130.649328 213.525624\nv 197.122753 130.647689 212.970791\nv 197.155979 130.469620 213.745989\nv 196.112750 130.290699 215.143886\nv 195.160401 130.302234 215.576418\nv 195.253409 130.482794 214.733353\nv 196.568909 130.918333 212.080366\nv 195.499847 131.049917 212.100112\nv 195.929451 131.140854 211.430052\nv 198.065132 130.258298 214.139276\nv 199.099422 130.183773 213.803185\nv 199.058353 129.974090 214.751304\nv 199.674947 130.489216 212.027194\nv 199.249050 130.353993 212.924958\nv 198.557667 130.962370 210.625541\nv 198.909837 131.074512 209.888580\nv 199.310163 130.850571 210.658667\nv 199.483492 131.131958 209.209422\nv 198.730996 131.243756 209.176296\nv 200.189191 131.138132 208.641625\nv 200.368031 130.968888 209.353910\nv 203.280489 130.009371 211.409562\nv 204.074420 129.744281 211.907113\nv 203.170192 129.822471 212.332023\nv 200.710541 131.181696 207.998377\nv 201.066951 131.276402 207.196370\nv 201.430140 131.069768 207.984106\nv 204.389844 130.092097 210.030362\nv 205.257864 129.986278 209.687467\nv 205.052736 129.825362 210.641758\nv 203.187055 130.939350 207.041357\nv 204.151888 130.829527 206.657251\nv 204.005254 130.671744 207.622687\nv 206.214744 129.854907 209.333042\nv 207.064923 129.712719 209.109330\nv 206.770934 129.577355 210.075152\nv 205.200380 130.680642 206.368515\nv 206.174227 130.544004 205.992355\nv 205.943934 130.425284 206.862421\nv 208.073588 129.552438 208.783352\nv 208.954395 129.376803 208.625520\nv 208.501919 129.259533 209.693609\nv 207.083586 130.442984 205.528542\nv 207.983195 130.320685 205.065719\nv 207.817390 130.166347 206.023438\nv 210.995248 129.230909 206.736725\nv 211.091905 129.379829 205.857278\nv 211.825294 129.100494 206.251288\nv 208.862855 130.207972 204.514623\nv 209.733526 130.094285 203.969457\nv 209.587670 129.930362 205.015450\nv 212.044415 129.381070 204.485297\nv 212.696015 129.263318 204.124350\nv 212.573550 129.131663 205.010894\nv 211.506300 129.790330 203.088098\nv 211.762952 129.871360 202.215535\nv 212.423532 129.593754 202.726189\nv 213.676932 129.575164 200.780419\nv 212.892460 129.771852 200.976825\nv 215.281078 128.362538 204.710827\nv 214.873926 128.656834 203.885755\nv 215.634227 128.405087 203.838874\nv 214.477894 128.918258 203.096635\nv 213.891285 129.665703 199.887857\nv 214.463481 129.371948 200.568251\nv 215.215055 129.159944 200.418253\nv 215.434765 129.237194 199.518851\nv 216.580222 129.260992 196.980679\nv 216.139261 129.278542 197.804209\nv 215.808560 129.501949 197.070637\nv 215.779648 129.265699 198.628090\nv 216.909227 129.259054 196.256187\nv 217.455099 129.186141 195.501757\nv 216.795394 129.411486 195.492678\nv 218.051431 129.055262 194.932200\nv 218.761597 128.907347 194.142827\nv 182.449033 128.897991 224.158766\nv 184.289961 128.898902 224.033315\nv 183.454707 128.908892 224.050450\nv 183.713697 129.100221 223.346682\nv 184.867523 129.599503 221.399156\nv 183.716213 129.686379 221.206501\nv 184.560504 129.825468 220.601626\nv 186.730781 129.329606 222.123522\nv 187.562541 129.216061 222.400517\nv 186.689299 129.161357 222.751389\nv 186.027977 129.033331 223.341700\nv 185.373683 128.940995 223.769276\nv 185.203245 129.182567 222.901970\nv 187.752596 129.579032 221.019242\nv 186.657919 129.561451 221.283466\nv 186.806491 129.756173 220.530058\nv 188.883541 128.844533 223.431938\nv 188.032328 128.856179 223.594041\nv 188.372272 129.036165 222.866280\nv 189.702612 129.603247 220.446957\nv 188.728956 129.587924 220.747335\nv 188.874825 129.789077 219.965456\nv 190.847874 128.775082 223.159098\nv 189.873349 128.806443 223.324762\nv 190.198011 128.993158 222.538514\nv 191.667039 129.583003 219.903913\nv 190.685815 129.588316 220.200283\nv 190.829704 129.799087 219.368708\nv 193.039035 128.665117 222.784620\nv 192.009801 128.694691 223.045108\nv 192.201769 128.932223 222.112364\nv 193.650376 129.558235 219.239984\nv 192.663263 129.570232 219.580267\nv 192.798042 129.781778 218.732055\nv 195.163700 128.685184 221.857746\nv 194.151433 128.682146 222.288190\nv 194.243270 128.905688 221.421433\nv 195.619935 129.535225 218.438464\nv 194.635191 129.551292 218.831999\nv 194.769899 129.753715 217.998237\nv 197.225181 129.098587 219.289266\nv 197.954463 129.088896 218.915493\nv 197.829918 128.890979 219.744905\nv 197.046884 128.684257 220.948513\nv 196.124334 128.688285 221.384669\nv 196.178087 128.904697 220.554834\nv 197.537948 129.485846 217.618636\nv 196.552185 129.517076 218.032278\nv 196.740407 129.706417 217.191060\nv 198.633973 128.678189 220.099984\nv 199.426969 128.718151 219.467735\nv 199.438143 129.343313 217.052690\nv 198.440909 129.420665 217.356518\nv 198.723404 129.597835 216.473590\nv 203.083539 128.167611 219.082485\nv 202.440887 128.942600 216.539051\nv 201.972639 128.782415 217.506473\nv 202.043955 129.488464 214.680544\nv 201.022505 129.580182 215.039911\nv 201.114093 129.807846 214.055846\nv 204.653906 128.081006 218.197721\nv 205.615043 127.801093 218.407442\nv 203.018575 129.440104 214.117180\nv 202.926987 129.212440 215.101245\nv 204.761591 129.118912 213.977193\nv 203.932866 129.360731 213.683727\nv 204.792849 129.315563 213.123039\nv 206.412370 128.097768 216.629114\nv 207.537757 127.724037 216.996453\nv 206.447777 127.798797 217.687354\nv 207.557917 128.281055 214.832470\nv 208.498097 128.172819 214.324846\nv 208.442529 127.914772 215.430591\nv 210.437643 127.791665 213.775332\nv 210.594877 127.958421 212.900980\nv 211.346518 127.600739 213.522827\nv 211.442830 128.827091 208.100012\nv 212.309180 128.631122 207.813486\nv 212.023373 128.506640 208.782762\nv 211.643664 128.388623 209.826275\nv 212.510015 128.192655 209.539749\nv 214.037881 128.216320 207.320452\nv 213.202161 128.444931 207.455506\nv 214.738363 127.398222 209.998062\nv 214.406735 128.288156 206.427422\nv 214.017687 128.596737 205.586242\nv 214.909824 128.305704 205.598888\nv 214.930018 127.925286 207.333098\nv 216.898415 127.120967 207.973717\nv 217.356738 127.154684 207.072674\nv 216.655671 127.379415 207.148286\nv 218.130399 127.549091 203.806146\nv 218.761597 127.257576 204.124729\nv 182.118975 131.652646 213.170131\nv 182.329268 131.797536 212.451794\nv 183.240046 131.689749 212.936038\nv 181.376595 131.532515 213.735501\nv 184.581497 132.244893 210.040151\nv 183.791759 132.297036 209.876098\nv 184.245078 132.411173 209.267632\nv 185.309352 131.652551 212.873119\nv 184.256866 131.660893 212.969956\nv 184.502824 131.826296 212.120863\nv 186.350417 132.264834 209.669072\nv 185.571621 132.235918 209.948663\nv 185.813612 132.387947 209.152093\nv 187.441067 131.669728 212.372977\nv 186.410471 131.669402 212.587769\nv 186.585906 131.818281 211.809234\nv 188.219027 132.297011 209.049255\nv 187.314728 132.273560 209.402038\nv 187.496707 132.440315 208.519719\nv 189.435167 131.682993 211.739158\nv 188.451037 131.676304 212.055969\nv 188.600632 131.825297 211.277632\nv 190.079462 132.306488 208.401808\nv 189.157455 132.304070 208.723631\nv 189.323014 132.466185 207.845112\nv 191.289501 131.688770 211.058843\nv 190.387803 131.686510 211.397958\nv 190.486459 131.834246 210.621706\nv 192.025192 132.268703 207.806744\nv 190.978555 132.295691 208.108699\nv 191.291658 132.441615 207.221334\nv 193.180678 131.937669 208.972072\nv 193.953644 131.856082 208.997819\nv 193.590971 131.765833 209.638243\nv 192.877229 131.712873 210.270031\nv 192.162305 131.707416 210.605078\nv 192.103081 131.841964 209.947544\nv 193.942963 132.116757 207.666952\nv 192.940823 132.221272 207.625514\nv 193.340434 132.310112 206.960818\nv 195.226154 132.191050 206.549485\nv 195.789929 132.023638 207.077320\nv 194.906349 132.038185 207.530092\nv 194.213643 132.349947 206.322551\nv 195.097223 132.335400 205.869779\nv 195.799061 132.377727 205.163721\nv 197.846491 131.423450 208.866225\nv 198.420146 131.480895 208.187068\nv 198.548865 131.787982 206.471849\nv 198.263545 131.637915 207.475228\nv 197.741997 132.166909 205.041993\nv 198.300273 132.245421 204.203762\nv 198.664557 132.039236 205.032010\nv 199.148050 131.458221 207.785298\nv 199.826001 131.344765 207.853890\nv 201.605236 131.317766 206.504930\nv 202.378806 131.284096 205.951841\nv 202.560119 131.130804 206.629010\nv 200.829573 132.022632 203.329228\nv 201.453052 132.033345 202.678819\nv 201.619718 131.842165 203.608002\nv 203.032880 131.310763 205.207249\nv 203.610203 131.374769 204.263407\nv 203.911012 131.161139 205.132079\nv 202.414069 131.960853 202.157364\nv 203.178835 131.850307 201.990916\nv 203.007964 131.742332 202.791144\nv 204.049322 131.750587 201.650185\nv 204.985686 131.608416 201.414894\nv 204.709094 131.489616 202.389404\nv 205.843272 131.159431 203.011981\nv 206.575875 131.124597 202.296779\nv 206.773689 130.936584 203.154648\nv 205.841069 131.507585 200.974486\nv 206.551146 131.471188 200.290375\nv 206.355535 131.311047 201.470001\nv 207.285952 131.088200 201.612668\nv 207.687950 131.150682 200.673658\nv 207.908290 130.964232 201.500436\nv 210.818868 130.754957 198.376980\nv 209.948917 131.016824 198.140666\nv 210.734238 130.951505 197.229104\nv 211.752121 130.527486 198.291389\nv 212.531539 130.382990 197.777111\nv 212.679471 130.220837 198.603082\nv 209.886156 131.350158 195.963779\nv 210.686356 131.250029 195.198614\nv 210.664488 131.113243 196.227625\nv 214.084123 130.024913 197.173440\nv 215.038478 129.746492 197.076122\nv 214.413244 129.797919 197.991485\nv 211.498802 131.127582 194.551012\nv 212.154277 131.017045 194.036621\nv 212.120163 130.902577 194.948069\nv 214.479905 130.160207 195.378144\nv 215.045478 130.093962 194.546936\nv 215.274930 129.907240 195.426868\nv 213.513045 130.569485 194.465945\nv 213.070590 130.818794 193.561288\nv 213.807998 130.596238 193.593555\nv 214.967386 130.430521 192.083604\nv 214.339019 130.534176 192.756530\nv 213.993910 130.741891 192.015972\nv 216.590884 129.589784 194.666954\nv 215.407399 130.405461 191.132333\nv 215.495132 130.463333 190.314051\nv 217.005913 129.886740 191.021447\nv 178.413868 136.090859 169.119445\nv 179.278705 136.099760 168.695485\nv 179.393414 136.116514 169.624342\nv 162.236211 132.416270 201.428573\nv 162.865822 132.593572 200.871084\nv 163.145476 132.484032 201.831524\nv 144.529559 124.770764 215.668179\nv 143.761597 124.628500 215.103527\nv 143.761597 126.463125 207.865201\nv 144.385233 126.867214 207.119599\nv 147.315259 130.766845 160.488644\nv 163.475370 134.566909 160.035924\nv 164.050322 134.597810 159.403942\nv 179.337365 125.969225 233.209863\nv 179.837003 126.248810 232.433095\nv 179.472227 126.515308 231.646127\nv 180.719370 128.368181 225.985677\nv 180.556714 128.087314 226.895371\nv 179.741318 128.273601 226.245467\nv 179.973665 127.286049 229.406324\nv 181.351039 131.094958 215.684141\nv 180.311614 130.988674 216.099420\nv 180.505568 131.198313 215.200394\nv 179.494707 130.918263 216.356089\nv 180.340178 130.814907 216.839837\nv 180.958543 129.973606 220.260107\nv 180.236137 129.843111 220.719921\nv 179.009093 128.708727 224.752575\nv 179.281233 128.995947 223.767490\nv 180.314294 129.375526 222.451349\nv 179.377852 129.237429 222.893793\nv 179.243891 129.484048 221.979540\nv 180.292922 132.635162 208.297972\nv 180.577664 132.476978 209.106182\nv 179.489314 132.494957 208.992142\nv 181.619404 132.397440 209.499443\nv 180.627333 131.897456 211.990909\nv 181.532867 131.969065 211.636382\nv 180.451587 131.382703 214.404007\nv 180.762262 133.563711 202.994708\nv 179.960733 133.489647 203.395066\nv 180.713613 134.559853 195.978138\nv 181.671094 134.510578 196.364926\nv 180.924425 134.103659 199.363350\nv 180.192150 134.173170 198.827952\nv 180.889973 134.201190 198.664767\nv 180.632748 133.988456 200.158611\nv 180.766529 135.125532 191.011234\nv 180.838166 135.044192 191.768734\nv 180.040677 135.095512 191.232168\nv 181.642758 135.170827 190.560117\nv 179.770701 134.589829 195.699352\nv 180.657525 134.941450 192.705438\nv 181.383377 134.971470 192.484504\nv 179.163763 135.540658 186.077245\nv 179.975896 135.605440 185.370968\nv 180.473021 135.391911 188.145456\nv 182.048532 135.469930 187.204543\nv 181.412967 135.952538 179.619042\nv 182.276998 135.936542 179.757926\nv 180.372355 135.795143 182.783035\nv 181.269315 135.794925 182.771956\nv 180.847337 135.747455 183.602286\nv 180.972072 136.066491 166.648423\nv 180.018316 136.055149 166.393500\nv 181.018599 136.087060 167.764881\nv 181.946694 136.078954 167.152085\nv 178.595600 136.113241 170.983609\nv 179.448668 136.127016 170.521418\nv 179.515690 136.132643 171.456725\nv 180.050994 135.988087 164.153335\nv 179.535581 136.007511 164.826118\nv 165.544391 135.046743 163.225701\nv 164.737355 134.942554 163.111066\nv 165.182728 134.945667 162.293317\nv 167.226293 135.052606 160.239547\nv 166.428770 134.965032 160.224121\nv 166.791526 134.957874 159.467422\nv 165.704765 134.879027 160.152544\nv 165.628250 134.819252 159.443001\nv 159.240086 134.067282 163.137839\nv 158.657546 134.015785 163.924779\nv 158.884949 133.765413 159.896764\nv 158.502739 133.747773 160.604293\nv 158.163140 133.630157 159.943979\nv 157.384338 133.592722 161.407357\nv 156.536925 133.416675 161.405190\nv 158.372118 133.785317 161.421090\nv 157.776802 133.488450 159.208351\nv 159.478474 133.829399 159.268447\nv 151.526841 132.139053 161.088666\nv 147.874069 131.012343 161.070251\nv 144.406410 129.780147 161.060571\nv 144.447737 129.877405 161.904577\nv 145.798989 130.401237 162.250197\nv 144.447737 129.930585 162.483503\nv 143.761597 129.672473 162.372429\nv 145.175856 130.218669 162.794275\nv 143.761597 129.431450 160.126648\nv 143.761597 129.802879 163.972031\nv 144.489716 130.013738 163.262127\nv 145.243796 130.735633 172.535458\nv 144.515062 130.470761 172.048124\nv 143.761597 130.193001 171.612602\nv 144.490331 130.470469 172.975234\nv 144.459077 130.459944 175.530647\nv 143.761597 130.225052 175.102902\nv 143.761597 130.219551 173.458198\nv 144.757789 130.475120 179.759650\nv 145.368568 130.666405 180.301324\nv 144.372376 130.305787 180.568872\nv 143.761597 130.148475 179.147224\nv 144.372376 130.271886 181.446973\nv 143.761597 130.080601 180.905300\nv 144.552263 130.191379 183.789510\nv 145.247280 130.461371 183.294907\nv 145.628854 130.356477 186.686084\nv 145.093563 129.903635 189.549307\nv 145.646141 130.146576 189.018190\nv 143.761597 129.157008 192.154029\nv 144.640824 129.507400 191.693647\nv 144.640824 129.392403 192.705632\nv 145.373321 129.807963 191.261395\nv 144.584370 128.601762 198.206737\nv 144.584370 128.401509 199.434761\nv 143.761597 128.233349 198.707875\nv 145.456455 128.617925 199.975532\nv 144.819027 127.668723 203.983464\nv 144.270939 127.037120 206.096594\nv 143.761597 126.903952 205.858552\nv 144.894576 127.163080 206.570494\nv 145.617282 127.326905 207.007476\nv 144.656741 125.920626 211.521346\nv 144.656741 125.728399 212.281871\nv 145.480452 125.907140 212.794933\nv 144.585308 125.451739 213.279060\nv 143.761597 125.465225 212.005473\nv 143.761597 125.054273 213.561401\nv 143.761597 122.144115 222.886187\nv 144.480781 122.597175 222.452722\nv 145.224810 122.954488 222.280566\nv 145.270607 124.848792 216.361865\nv 145.846340 124.916393 216.874140\nv 145.964196 124.751440 217.575098\nv 145.974589 124.456122 218.594090\nv 144.513038 123.515561 219.771702\nv 143.761597 123.281574 219.549801\nv 145.257066 123.635550 220.317545\nv 159.135227 123.737544 232.372002\nv 158.926621 123.955710 231.673026\nv 159.675747 124.093119 231.786627\nv 158.928303 123.485168 232.919804\nv 158.368531 123.105776 233.534577\nv 157.826329 123.220743 232.873173\nv 159.677429 123.622577 233.033405\nv 165.602478 124.806688 233.006595\nv 164.944038 124.984356 232.224645\nv 173.817646 125.686592 233.236495\nv 174.463986 125.976664 232.534969\nv 180.311463 127.001552 230.283801\nv 179.168564 125.963873 233.208917\nv 179.392295 125.697651 233.991547\nv 178.310203 125.926370 233.237006\nv 178.255272 126.197945 232.455322\nv 156.719586 126.150190 223.884675\nv 157.433505 125.288394 227.008594\nv 157.144316 124.950292 227.791904\nv 156.497806 125.025880 227.111027\nv 158.574223 124.140261 230.953297\nv 155.657590 123.754057 229.982995\nv 157.121195 123.579038 231.461490\nv 156.274468 123.386809 231.392209\nv 155.413321 123.185884 231.296371\nv 157.473593 123.394488 232.181220\nv 161.062639 124.031425 232.769005\nv 160.257125 123.741828 233.054401\nv 160.689866 124.164550 232.200207\nv 160.481260 124.382717 231.501231\nv 162.176515 124.252298 232.807953\nv 161.743775 123.829577 233.662148\nv 160.225714 125.243236 228.990161\nv 159.197974 125.068419 228.856776\nv 160.390995 125.579537 228.110574\nv 159.732364 125.635673 227.537032\nv 158.406601 124.985276 228.576434\nv 158.871388 125.295949 227.969812\nv 159.962588 126.189644 226.040748\nv 160.773302 126.416153 225.868551\nv 159.091974 125.908559 226.300420\nv 159.252593 126.205949 225.517258\nv 158.940992 125.552530 227.256690\nv 158.775202 127.151937 222.128419\nv 162.735551 124.640742 232.063204\nv 163.539399 125.487009 230.152119\nv 162.782476 125.457877 229.835461\nv 163.330201 125.712688 229.379826\nv 161.925387 126.004803 227.763021\nv 162.652412 125.956589 228.309108\nv 162.077471 126.287448 227.017283\nv 161.675259 126.628086 225.762104\nv 161.669225 127.292922 223.584446\nv 159.336339 126.549441 224.537405\nv 160.388533 127.455390 222.213525\nv 159.540305 127.459239 221.627016\nv 160.355103 127.670544 221.448961\nv 160.257744 128.154810 219.708140\nv 160.174198 128.405082 218.717083\nv 161.204858 128.442565 219.303608\nv 165.684952 124.527649 233.785301\nv 166.342442 126.018385 229.906298\nv 165.104430 126.732175 227.284078\nv 164.974626 126.416826 228.143478\nv 164.304585 126.517700 227.544487\nv 163.453163 126.215987 227.979468\nv 163.582967 126.531336 227.120068\nv 162.795842 126.466675 226.885889\nv 163.647263 126.768388 226.450908\nv 163.310169 126.967068 225.610539\nv 164.252429 127.541408 224.216610\nv 165.186359 127.682095 224.227928\nv 162.304841 127.917482 221.855748\nv 161.245868 127.929494 221.165067\nv 162.347378 128.180281 220.985345\nv 160.397640 127.933343 220.578558\nv 163.088580 128.939833 218.610139\nv 162.140872 128.686718 218.977232\nv 162.069020 128.945953 217.945459\nv 158.665111 129.665231 212.461496\nv 159.563924 129.949866 211.948114\nv 159.682518 129.736333 212.995522\nv 167.302650 124.753975 233.825180\nv 167.385594 125.670773 231.341931\nv 167.127482 126.247525 229.585391\nv 167.972139 126.534923 229.082631\nv 167.148475 126.757471 228.122832\nv 166.476437 126.595634 228.296517\nv 166.446509 126.793137 227.709386\nv 165.691398 126.366494 228.617424\nv 166.393364 126.330827 229.030871\nv 165.099268 128.124122 222.712645\nv 166.198346 128.301886 222.660982\nv 165.843736 128.030173 223.377208\nv 163.902119 129.429110 217.213103\nv 162.956684 129.443474 216.580349\nv 163.842076 129.673515 216.215087\nv 163.794787 129.876554 215.353180\nv 162.893858 129.917226 214.594472\nv 163.792003 130.105902 214.365318\nv 160.763078 129.839768 213.403735\nv 161.736203 130.083771 213.044375\nv 161.917949 129.902572 213.965971\nv 163.421821 131.110577 209.569528\nv 162.750903 130.899828 210.069089\nv 162.407758 131.040768 209.169477\nv 160.920617 131.215573 207.076442\nv 161.606358 131.407956 206.604574\nv 161.868323 131.296016 207.453688\nv 163.686016 132.281602 203.558675\nv 164.445406 132.352507 203.744172\nv 163.854407 132.177699 204.283196\nv 162.816370 131.369958 207.825867\nv 163.463238 131.549260 207.345411\nv 163.725544 131.430819 208.189460\nv 164.376618 131.168356 209.916969\nv 165.394269 131.235313 210.273323\nv 164.782616 131.036595 210.825494\nv 165.566609 130.583338 213.354403\nv 166.341992 130.602944 213.725313\nv 165.645471 130.418316 214.136227\nv 164.603492 130.527095 213.031151\nv 165.300013 130.711723 212.620238\nv 164.864471 129.430200 217.775484\nv 165.736638 129.673277 217.304466\nv 165.813598 129.444325 218.232109\nv 166.253431 128.595867 221.637026\nv 165.291169 128.580143 221.237627\nv 166.090723 128.780175 220.878233\nv 168.741375 127.573374 226.156100\nv 169.644768 127.608373 226.378777\nv 168.944160 127.378789 226.853970\nv 167.579656 127.149382 227.083497\nv 166.718726 127.056304 227.021776\nv 167.179837 127.250712 226.569572\nv 167.858936 126.775665 228.334094\nv 168.652672 126.750621 228.706762\nv 169.649054 126.414594 230.018034\nv 170.705730 125.716166 232.346888\nv 171.320693 125.496515 233.148910\nv 163.989961 134.925385 179.206572\nv 164.043295 134.887001 180.104719\nv 163.258482 134.813788 179.523567\nv 161.874585 134.503734 181.831455\nv 162.626143 134.621796 181.561351\nv 162.663763 134.582873 182.422309\nv 163.497409 134.553340 184.651264\nv 162.727206 134.420407 184.937713\nv 162.720905 134.485294 184.113352\nv 159.123005 133.709665 186.873999\nv 159.827725 133.854060 186.452531\nv 159.861814 133.792540 187.354697\nv 160.930425 133.741082 189.721537\nv 160.149171 133.567843 190.131142\nv 160.020008 133.645076 189.195158\nv 159.478689 132.850971 195.448473\nv 158.893697 132.717064 195.636409\nv 158.809884 132.793404 194.977588\nv 155.400634 131.825192 197.155275\nv 156.100195 132.007483 196.841811\nv 156.191591 131.910821 197.716775\nv 157.284820 131.763016 200.134351\nv 156.655041 131.570887 200.509686\nv 156.448401 131.693501 199.529540\nv 153.584507 130.518890 202.755247\nv 154.243949 130.739614 202.351521\nv 154.486305 130.630198 203.316569\nv 155.968981 130.506748 205.780576\nv 155.277503 130.282469 206.122472\nv 155.058591 130.411862 205.212022\nv 151.912089 129.049931 208.132296\nv 152.576899 129.319881 207.665240\nv 152.730758 129.161535 208.630225\nv 149.069107 127.381650 211.817401\nv 149.931994 127.759138 211.354122\nv 149.909228 127.495008 212.404599\nv 150.477227 126.996231 215.055010\nv 150.605964 126.835420 215.806560\nv 149.784264 126.702128 215.361367\nv 151.354978 126.910823 216.364329\nv 150.028685 127.304261 213.334311\nv 150.891571 127.681748 212.871031\nv 151.406140 126.448479 218.096973\nv 150.663233 126.150086 218.376921\nv 149.217650 126.401079 215.809813\nv 149.115449 125.752630 218.032348\nv 149.878038 125.825925 218.637804\nv 149.068271 125.483220 218.881800\nv 150.616055 125.880676 219.226374\nv 149.015025 124.602570 221.679456\nv 149.760089 124.692203 222.198772\nv 148.992656 124.303696 222.610485\nv 149.041816 124.914785 220.698707\nv 148.274384 124.526277 221.110419\nv 149.066018 125.197503 219.808463\nv 148.303429 125.124208 219.203007\nv 146.548507 122.986621 223.724902\nv 147.457627 123.398443 223.559393\nv 147.292678 122.996470 224.502031\nv 147.480524 123.801328 222.436716\nv 148.224695 123.811177 223.213845\nv 148.095129 122.685637 226.246067\nv 147.714682 122.270637 226.986205\nv 148.562055 123.203210 225.288960\nv 147.734871 122.890718 225.293629\nv 146.825752 122.478896 225.459138\nv 147.381865 121.821987 227.799634\nv 147.123140 121.423254 228.547278\nv 147.902695 121.769397 228.469318\nv 146.900625 121.014656 229.307413\nv 146.591542 120.504235 230.222958\nv 147.334887 120.860243 230.132507\nv 146.179479 119.990741 230.994627\nv 146.433098 119.279600 232.859902\nv 146.603501 119.764162 231.945077\nv 163.075814 134.088428 189.370362\nv 162.256770 134.019589 188.859483\nv 162.893847 134.141749 188.457569\nv 164.212850 134.014637 191.611402\nv 163.564408 133.874819 192.062719\nv 163.414990 133.958055 191.168998\nv 160.404837 133.128245 194.488618\nv 160.967382 133.270803 193.983034\nv 161.229848 133.222302 194.772785\nv 162.425805 133.133293 196.849323\nv 161.841143 132.979360 197.298595\nv 161.626841 133.069488 196.440027\nv 158.647301 132.147448 199.354974\nv 159.324653 132.325472 198.917578\nv 159.499525 132.220040 199.876500\nv 160.985164 132.066920 202.410641\nv 160.333920 131.872456 202.872439\nv 160.039751 131.987743 201.920880\nv 157.229560 130.909738 205.018726\nv 157.847768 131.107193 204.604370\nv 158.140308 130.985384 205.603696\nv 159.527159 130.813298 207.885027\nv 158.834820 130.600956 208.260433\nv 158.609191 130.736381 207.398462\nv 155.141137 129.421032 210.188264\nv 155.863178 129.672971 209.747673\nv 155.981616 129.491587 210.729513\nv 156.998164 129.200975 212.978636\nv 156.308806 128.938198 213.412015\nv 156.251688 129.117672 212.615713\nv 153.726026 127.855262 215.274692\nv 153.530074 128.030679 214.374723\nv 154.444180 128.148584 214.833111\nv 154.631760 127.189654 218.612577\nv 155.385067 127.335975 218.764539\nv 156.037579 127.000054 220.511568\nv 155.407586 126.684505 221.076169\nv 153.679079 126.864999 218.878708\nv 152.612910 125.381536 222.818844\nv 153.403162 125.588835 222.880056\nv 153.001258 125.195348 223.742453\nv 153.959879 125.955141 222.230922\nv 153.621335 124.877071 225.256115\nv 153.238943 124.554035 225.904757\nv 154.096859 125.238944 224.565506\nv 153.315986 125.040775 224.494274\nv 151.641494 123.567060 227.226925\nv 152.461150 123.816983 227.259305\nv 152.099550 123.445304 227.955370\nv 152.820259 124.183952 226.577747\nv 152.421777 124.308820 225.857871\nv 153.380947 123.623366 228.557938\nv 152.558200 123.258464 228.851552\nv 153.335450 122.150884 232.341117\nv 152.515347 121.838501 232.428225\nv 152.471078 122.220865 231.470585\nv 151.458590 121.505640 232.369545\nv 152.322962 121.435659 233.240076\nv 162.810331 133.360061 195.528017\nv 162.001949 133.294140 195.128978\nv 162.600775 133.430780 194.666240\nv 164.008319 133.253364 197.579195\nv 163.431147 133.104818 198.047599\nv 163.217278 133.191710 197.239488\nv 160.433936 132.290136 200.449093\nv 161.066717 132.461937 199.953618\nv 161.323776 132.354009 200.963608\nv 162.805441 132.206762 203.243356\nv 162.187175 132.029214 203.729949\nv 161.897599 132.129181 202.875606\nv 159.030023 131.065781 206.106198\nv 159.708584 131.255176 205.708334\nv 159.980091 131.138118 206.625192\nv 161.459711 130.966826 208.797297\nv 160.744815 130.753946 209.208018\nv 160.467685 130.890753 208.336277\nv 156.822351 129.561988 211.235628\nv 157.625087 129.811145 210.851505\nv 157.743781 129.629607 211.798211\nv 159.163289 129.317982 214.357242\nv 158.702673 129.013729 215.196864\nv 158.323089 129.147445 214.348526\nv 155.598522 128.099755 216.129600\nv 155.347078 128.259339 215.250259\nv 156.305467 128.385927 215.646780\nv 156.940884 127.145198 220.746117\nv 157.813232 127.268913 221.012606\nv 156.465552 127.514950 219.037862\nv 157.368858 127.660093 219.272411\nv 156.746489 127.332893 219.925404\nv 155.568459 126.473810 221.918840\nv 154.744070 126.345955 221.662728\nv 154.890374 125.398538 224.733166\nv 155.066041 125.233744 225.379859\nv 156.015164 125.119098 226.470977\nv 155.725974 124.780996 227.254287\nv 156.258435 125.378115 225.880044\nv 155.486603 125.133231 226.023305\nv 154.210221 123.878226 228.543973\nv 154.952543 124.064142 228.622716\nv 154.585009 123.737421 229.206869\nv 155.393186 124.446362 227.927079\nv 155.151643 123.394064 230.542644\nv 154.577115 122.995170 231.158636\nv 154.910543 124.539581 227.287029\nv 154.821383 123.563343 229.845260\nv 154.064987 122.660119 231.647920\nv 154.238062 122.016160 233.342425\nv 154.109256 122.277754 232.605560\nv 160.683898 133.877625 187.859392\nv 161.320669 134.004923 187.439960\nv 161.438032 133.945612 188.366122\nv 162.602643 133.892252 190.696296\nv 161.913068 133.741043 191.138919\nv 161.749163 133.815058 190.214898\nv 158.935377 132.915291 194.206165\nv 159.309125 133.040009 193.660773\nv 159.768623 133.052029 194.244259\nv 160.854741 132.997650 196.083834\nv 160.302340 132.845093 196.498297\nv 160.114902 132.927188 195.692832\nv 156.984666 131.989371 198.278758\nv 157.681790 132.172996 197.899681\nv 157.775304 132.069255 198.775128\nv 159.105340 131.917647 201.348287\nv 158.439983 131.716840 201.748587\nv 158.156816 131.841209 200.714196\nv 155.447908 130.743532 203.891485\nv 156.041383 130.941234 203.466121\nv 156.343544 130.833844 204.444763\nv 157.719476 130.655984 206.895960\nv 157.052372 130.450697 207.232447\nv 156.854997 130.582642 206.354539\nv 153.520948 129.255180 209.152215\nv 154.209133 129.516950 208.684797\nv 154.334514 129.340646 209.673842\nv 155.410953 129.047272 212.109598\nv 154.728917 128.764140 212.578732\nv 154.577539 128.956517 211.639238\nv 150.333278 127.176970 214.205280\nv 149.350934 126.990230 213.738847\nv 152.221168 127.008238 216.914521\nv 152.165117 127.226939 216.050395\nv 151.154978 127.310262 214.650473\nv 151.911474 127.614179 214.308524\nv 152.055423 127.433440 215.158254\nv 152.216309 126.763506 217.799470\nv 150.572750 125.335626 220.968372\nv 150.497408 125.041869 221.824432\nv 152.165417 126.018099 220.337167\nv 152.991303 126.065523 220.980889\nv 151.576647 124.769498 223.738337\nv 151.150181 124.409893 224.435016\nv 149.806658 125.273796 220.377500\nv 150.596952 125.618345 220.078129\nv 151.711683 125.040355 223.031181\nv 149.425492 123.425476 225.545075\nv 150.206308 123.668368 225.627758\nv 149.703129 123.241020 226.324081\nv 150.643373 124.060831 224.961676\nv 150.496252 122.956659 227.848068\nv 150.095537 122.618450 228.399799\nv 150.435479 124.201886 224.322092\nv 150.881919 123.339647 227.164877\nv 150.098277 123.100924 227.089955\nv 149.802025 122.253404 229.071037\nv 149.690716 121.965475 229.698957\nv 149.463709 121.591739 230.397556\nv 149.259429 121.218512 231.114477\nv 149.074969 120.863426 231.767396\nv 144.502645 124.499479 216.543935\nv 146.333536 126.288212 212.492990\nv 146.493761 126.570768 211.597191\nv 146.903636 126.919262 210.798778\nv 147.275411 126.675178 212.292437\nv 146.960995 127.358884 209.001605\nv 146.992100 127.168235 209.865920\nv 149.802357 128.592650 207.450701\nv 147.570909 128.464538 204.717355\nv 148.410768 128.804588 204.325633\nv 151.304665 129.864729 203.108683\nv 150.462517 129.725028 202.608690\nv 151.153512 129.994264 202.175597\nv 150.181770 129.983260 200.730433\nv 150.848392 130.250088 200.242594\nv 150.977985 130.121392 201.187765\nv 154.027543 131.423680 197.828879\nv 153.373928 131.194645 198.253630\nv 153.211278 131.301194 197.327462\nv 151.978480 131.355426 194.694960\nv 152.720558 131.579150 194.326653\nv 152.872262 131.488538 195.376655\nv 156.957687 132.667430 193.144895\nv 156.037701 132.442919 193.419834\nv 156.162319 132.573788 192.545302\nv 157.541106 133.354444 187.641019\nv 156.725971 133.160584 187.928736\nv 156.766035 133.255215 187.040862\nv 156.241984 133.320678 184.984323\nv 156.980447 133.482128 184.669973\nv 156.881082 133.415639 185.364066\nv 160.417861 134.239877 182.555208\nv 159.696578 134.092507 182.916867\nv 159.660687 134.141120 182.077464\nv 158.844205 134.113120 180.067502\nv 159.569087 134.245807 179.680588\nv 159.591070 134.220454 180.470124\nv 163.166524 134.883029 177.757040\nv 162.450239 134.763278 178.073759\nv 162.411615 134.794135 177.205378\nv 161.783008 134.753353 175.066108\nv 162.520641 134.860358 174.787099\nv 162.434453 134.837783 175.596146\nv 164.682041 135.171444 172.678958\nv 164.492702 135.137059 173.546450\nv 163.708037 135.045015 172.860568\nv 145.677102 122.255793 224.768115\nv 145.791762 122.604698 223.934594\nv 146.010408 123.674523 221.105229\nv 146.017819 124.025845 220.063289\nv 145.891496 122.025328 225.614295\nv 145.981555 123.336411 222.070874\nv 146.742308 123.726706 221.816618\nv 145.956710 123.006671 222.991956\nv 147.664205 125.022354 218.785946\nv 146.853714 124.780078 218.604062\nv 147.495190 125.167649 218.094460\nv 146.143604 124.310827 219.285576\nv 147.048740 125.451296 216.595230\nv 147.309340 125.754766 215.870651\nv 147.661953 124.736637 219.712609\nv 146.566843 125.090326 217.211617\nv 147.166596 125.286342 217.296189\nv 149.088914 126.561890 215.058263\nv 148.389868 126.383730 214.869510\nv 148.956482 126.684779 214.421063\nv 147.746243 126.061531 215.284104\nv 148.080764 126.755071 213.028057\nv 148.240989 127.037628 212.132259\nv 148.651888 126.812070 213.550094\nv 147.524100 127.206708 210.463782\nv 148.352219 127.550730 210.148924\nv 148.263755 127.301757 211.081782\nv 151.362506 128.590653 209.540318\nv 150.594094 128.486162 209.018972\nv 151.297536 128.787093 208.575935\nv 152.068379 129.542450 205.835275\nv 152.374366 129.450839 206.741341\nv 151.452243 129.299888 206.261245\nv 154.096988 130.298529 204.637107\nv 153.402660 130.049797 205.022914\nv 153.132535 130.160743 204.106103\nv 151.820134 130.261092 201.687758\nv 152.493379 130.508263 201.245062\nv 152.668906 130.381135 202.232895\nv 155.655326 131.614951 198.967556\nv 155.004407 131.409251 199.329961\nv 154.841111 131.522831 198.392643\nv 153.739617 131.621245 195.955530\nv 154.461789 131.817058 195.644330\nv 154.587066 131.726041 196.591511\nv 158.350386 132.781384 194.394101\nv 157.528981 132.598029 194.592475\nv 157.654474 132.719916 193.821053\nv 159.197924 133.559991 188.690464\nv 158.369898 133.365825 189.066828\nv 158.329067 133.453980 188.152529\nv 157.600358 133.513082 185.901431\nv 158.354231 133.674137 185.510774\nv 158.335043 133.610130 186.362489\nv 161.931454 134.408586 183.546108\nv 161.202227 134.271812 183.897207\nv 161.182979 134.328037 183.043512\nv 160.348961 134.320816 180.899507\nv 161.076458 134.447899 180.526854\nv 161.109468 134.415574 181.343150\nv 164.699545 135.035645 178.843875\nv 163.914732 134.962432 178.262723\nv 163.149993 134.929337 176.102898\nv 163.848759 135.022037 175.760387\nv 163.826667 135.006586 176.546148\nv 164.778216 135.191969 171.701954\nv 165.562880 135.284013 172.387836\nv 167.751542 135.165465 161.070987\nv 170.074259 135.451437 162.121723\nv 167.492599 135.309534 164.109937\nv 170.418394 135.532905 163.053992\nv 169.754622 135.514202 163.880090\nv 171.013604 135.535261 162.224403\nv 167.946143 135.541371 172.764443\nv 167.843640 135.530105 171.914607\nv 168.645864 135.602714 172.302213\nv 166.639949 134.725810 187.141728\nv 167.492307 134.844372 186.838154\nv 167.389425 134.740047 187.877279\nv 165.078433 134.786813 184.101595\nv 165.888191 134.898351 183.751315\nv 165.923332 134.847839 184.591183\nv 169.033213 135.323349 181.977845\nv 169.137020 135.276580 182.865200\nv 168.249407 135.219902 182.504672\nv 169.596250 135.676227 173.577266\nv 169.495867 135.672900 172.677059\nv 170.343749 135.735147 173.102276\nv 171.191584 135.438197 160.420744\nv 172.186429 135.516652 160.485604\nv 171.664314 135.532249 161.356994\nv 172.211574 135.455124 159.555076\nv 169.956712 135.697022 169.387071\nv 170.758872 135.754468 168.918642\nv 170.854776 135.771664 169.923649\nv 169.009324 135.610662 169.076491\nv 167.828213 135.500397 168.905084\nv 168.679696 135.569561 168.210657\nv 169.314161 135.552123 165.575857\nv 169.128868 135.489889 164.615288\nv 170.405265 135.641483 165.686492\nv 171.327925 135.711562 165.775149\nv 172.540815 135.737481 164.211868\nv 172.281926 135.686105 163.297114\nv 172.008448 135.613717 162.289263\nv 174.266303 135.702545 161.484263\nv 166.194589 133.382625 198.560693\nv 166.807868 133.360978 199.175835\nv 166.212852 133.254013 199.447220\nv 165.157748 133.518477 196.668952\nv 165.774724 133.641211 196.242611\nv 165.939256 133.558636 197.057722\nv 169.038764 134.313304 193.591265\nv 168.360796 134.181160 194.163148\nv 168.217356 134.273666 193.272983\nv 167.078270 134.390001 191.161586\nv 167.746896 134.505322 190.634628\nv 167.901126 134.431645 191.548932\nv 170.249612 134.974473 188.193602\nv 170.034671 134.883664 188.911848\nv 169.598991 134.929326 188.112505\nv 171.605612 135.514577 182.196146\nv 170.830892 135.421734 182.730091\nv 170.695547 135.472870 181.804429\nv 169.531276 135.491089 179.560792\nv 170.293431 135.570485 179.039569\nv 170.421893 135.541497 179.966294\nv 168.879458 131.019184 213.149514\nv 167.955898 131.009031 212.761119\nv 168.774502 131.200877 212.290749\nv 169.087647 132.286037 207.063430\nv 168.351297 132.176236 207.233134\nv 168.304723 132.294453 206.601847\nv 169.777549 133.404360 200.843560\nv 169.107607 133.302460 201.076802\nv 169.139425 133.433189 200.286417\nv 169.797200 133.645648 199.233669\nv 169.043389 133.531163 199.575774\nv 169.031221 133.641721 198.756269\nv 168.218268 133.633709 198.263096\nv 168.972079 133.748194 197.920991\nv 171.816796 134.314019 195.411064\nv 171.122401 134.233655 195.624212\nv 171.294519 134.355747 194.790278\nv 171.251287 134.445315 193.997089\nv 171.316597 134.544358 193.129416\nv 172.054223 134.535154 193.709458\nv 171.726540 134.829633 190.705773\nv 171.387507 134.734843 191.380794\nv 170.798947 134.741887 190.924310\nv 171.870567 135.188439 186.995699\nv 171.009093 135.152691 186.704476\nv 171.497143 135.225407 186.118841\nv 173.423855 135.561450 183.204959\nv 172.635135 135.482862 183.608123\nv 172.529677 135.542029 182.718643\nv 167.162526 135.245591 180.218913\nv 168.027264 135.307489 180.665688\nv 167.280862 135.204773 181.170542\nv 166.121094 135.238124 177.837116\nv 166.849324 135.326754 177.288682\nv 166.941364 135.309866 178.251720\nv 169.689147 135.669591 174.428892\nv 168.841265 135.607343 174.003675\nv 169.297989 135.652833 170.922228\nv 170.147991 135.723019 171.297074\nv 169.393363 135.661634 171.827223\nv 170.922576 135.778556 170.777082\nv 171.724736 135.836002 170.308653\nv 170.747248 135.742168 168.165702\nv 172.211366 135.771850 165.837969\nv 171.663776 135.763931 166.626936\nv 173.486023 135.799299 164.322753\nv 172.820723 135.781298 165.097065\nv 175.445169 135.904910 164.638056\nv 174.441041 135.854039 164.486711\nv 174.788532 135.808564 162.970361\nv 175.664379 135.850313 163.112020\nv 174.161133 135.810222 163.601514\nv 176.568243 135.808101 161.774171\nv 166.580096 134.181779 192.615266\nv 167.385943 134.228923 192.960378\nv 166.733540 134.094378 193.499754\nv 165.478668 134.282319 190.522470\nv 166.122620 134.405534 189.938223\nv 166.280089 134.340463 190.831529\nv 166.737961 134.894756 185.171753\nv 167.683445 135.009316 184.852107\nv 167.688315 134.944694 185.782957\nv 168.902669 135.364386 181.052417\nv 169.790283 135.421063 181.412946\nv 168.784333 135.405204 180.100789\nv 168.655871 135.434192 179.174063\nv 172.753814 135.895837 172.387557\nv 171.885184 135.844884 172.070974\nv 172.661166 135.893847 171.478668\nv 173.156574 135.833668 165.948853\nv 173.451074 135.875148 166.837628\nv 176.110323 135.901627 163.890279\nv 177.503242 135.834879 161.826140\nv 178.485661 135.850241 161.832090\nv 173.487361 126.375484 231.187150\nv 173.503646 126.641750 230.431491\nv 173.304012 127.598008 227.482877\nv 172.643117 127.389006 227.982128\nv 172.377672 127.600542 227.240113\nv 173.718165 127.996166 226.299840\nv 172.890684 128.013303 226.046172\nv 173.570282 128.199925 225.605150\nv 173.802433 129.562898 220.836102\nv 172.834743 129.582659 220.514683\nv 173.610942 129.757090 220.067551\nv 173.953614 130.673993 216.475594\nv 173.071344 130.504109 216.940490\nv 172.929066 130.671969 216.187378\nv 174.691517 131.003529 215.233758\nv 173.670807 131.024298 214.907646\nv 174.550988 131.185974 214.418923\nv 174.677149 131.996901 210.649784\nv 173.905612 131.853529 211.134443\nv 173.696436 132.006239 210.319369\nv 175.204580 132.288685 209.327267\nv 174.279343 132.298346 209.042058\nv 175.015949 132.437420 208.534613\nv 175.094865 133.099054 204.865032\nv 174.347588 132.971989 205.383103\nv 174.205610 133.111054 204.519410\nv 175.705884 133.354828 203.500821\nv 174.830921 133.366248 203.200405\nv 175.583917 133.482958 202.699886\nv 175.767137 134.040981 199.011311\nv 175.093234 133.946409 199.475957\nv 174.961968 134.047503 198.706343\nv 176.296227 134.228146 197.796863\nv 175.505800 134.238303 197.506305\nv 176.166156 134.324374 197.061471\nv 177.355172 134.794158 193.524252\nv 176.488715 134.722380 193.922515\nv 176.422481 134.824504 192.972048\nv 175.670392 126.311230 231.818143\nv 174.832273 126.210118 231.951445\nv 173.960047 127.151750 229.035309\nv 174.529711 127.441987 228.247976\nv 174.920301 127.207265 229.058393\nv 175.241009 127.899860 226.921354\nv 174.445045 127.984505 226.506488\nv 175.193727 128.098142 226.273685\nv 175.576658 129.234179 222.439036\nv 175.649609 129.048249 223.133759\nv 174.833439 129.149917 222.607180\nv 173.773346 128.811327 223.589641\nv 174.202089 128.987315 223.059388\nv 174.477646 128.787999 223.832155\nv 175.615356 129.450855 221.645406\nv 174.669560 129.536589 221.150713\nv 175.524429 129.651596 220.883662\nv 174.228957 130.325140 218.016926\nv 175.135839 130.481642 217.560195\nv 175.268904 130.300649 218.348416\nv 176.707152 130.987283 215.726647\nv 175.709191 130.994291 215.510489\nv 176.569659 131.158196 214.961192\nv 175.074036 131.685954 212.269375\nv 175.909353 131.824659 211.771938\nv 176.097065 131.666422 212.576455\nv 177.133011 132.254879 209.892855\nv 176.182218 132.272700 209.633913\nv 176.891979 132.409938 209.078765\nv 175.392087 132.831446 206.513977\nv 176.112554 132.941744 206.033793\nv 176.267798 132.813201 206.819045\nv 177.476756 133.308492 204.155968\nv 176.586823 133.334142 203.839713\nv 177.348814 133.445888 203.316556\nv 176.042540 133.831589 200.600633\nv 176.739582 133.928027 200.061597\nv 176.883719 133.819730 200.881304\nv 177.900208 134.217773 198.228464\nv 177.100878 134.219804 198.061453\nv 177.755914 134.312186 197.519039\nv 177.984579 134.971697 192.040226\nv 177.199941 134.986290 191.734180\nv 177.895582 135.061705 191.200621\nv 176.513485 135.259096 188.842540\nv 176.996264 135.319084 188.247764\nv 177.497274 135.283308 188.893365\nv 178.228249 135.534924 185.933918\nv 177.290721 135.521960 185.822844\nv 177.980950 135.593287 185.085051\nv 177.683361 135.760371 182.646095\nv 178.161654 135.809115 181.861161\nv 178.606966 135.775880 182.710501\nv 178.907551 135.933393 179.568254\nv 178.062495 135.923457 179.447374\nv 178.633207 135.965870 178.746089\nv 176.695607 126.373581 231.786926\nv 176.371696 126.098091 232.514629\nv 178.345252 127.539315 228.490146\nv 178.556970 127.853600 227.512693\nv 175.558203 127.045362 229.691123\nv 176.380036 126.880208 230.313480\nv 177.253520 128.997749 223.567497\nv 177.350139 129.239231 222.693800\nv 178.210831 129.104469 223.295681\nv 179.335483 129.930927 220.323216\nv 179.279679 129.709960 221.140391\nv 178.343238 129.571863 221.582835\nv 177.388837 129.455907 221.900170\nv 177.424625 129.681819 221.061021\nv 176.295593 130.239157 218.787354\nv 177.334506 130.403924 218.272676\nv 177.454314 130.185929 219.168346\nv 178.651361 130.940039 216.180705\nv 177.702100 130.969618 215.961544\nv 178.516881 131.121609 215.396511\nv 177.124596 131.651643 212.861944\nv 177.942684 131.791041 212.276434\nv 178.134897 131.637558 213.059360\nv 179.071048 132.207244 210.372994\nv 178.105406 132.234915 210.141671\nv 178.808414 132.364445 209.569030\nv 177.170990 132.803853 207.071524\nv 177.839702 132.909704 206.548845\nv 178.022427 132.790058 207.281507\nv 179.198886 133.237233 204.804291\nv 178.336921 133.281108 204.460573\nv 179.100713 133.376364 203.976528\nv 177.772588 133.798748 201.168121\nv 178.440487 133.906661 200.534983\nv 178.632313 133.789241 201.360835\nv 179.502087 134.189966 198.644149\nv 178.700860 134.209693 198.422489\nv 179.356471 134.290428 197.907709\nv 177.807850 134.600441 195.332657\nv 178.503982 134.692513 194.659239\nv 178.890426 134.600920 195.517177\nv 179.611083 134.943527 192.565538\nv 178.895035 134.959997 192.324037\nv 179.396267 135.030642 191.748168\nv 179.562012 135.404691 187.823810\nv 178.847514 135.338806 188.493922\nv 178.694551 135.409180 187.628477\nv 180.424556 135.875728 181.163012\nv 179.939795 135.833619 181.939136\nv 179.570019 135.866733 181.149443\nv 180.610014 135.952803 179.608869\nv 179.766521 135.942323 179.620144\nv 180.321756 135.986285 178.855694\nv 172.024845 128.016288 225.799526\nv 171.157984 128.016974 225.540869\nv 171.875940 128.217749 225.092824\nv 171.564505 129.180525 221.626929\nv 171.170216 128.997504 222.181272\nv 170.835031 129.169291 221.421161\nv 171.936286 129.564581 220.306476\nv 170.947408 129.546393 220.054913\nv 171.654373 129.758662 219.494570\nv 171.900763 130.669115 215.880255\nv 171.031448 130.489563 216.332675\nv 170.885415 130.656594 215.560656\nv 172.642504 131.021445 214.600523\nv 171.645413 131.026030 214.245013\nv 172.533187 131.211329 213.737301\nv 172.760654 132.014456 209.987213\nv 171.996337 131.867348 210.439908\nv 171.832092 132.018938 209.623093\nv 173.343561 132.306563 208.709901\nv 172.447857 132.309080 208.393351\nv 173.195009 132.449598 207.932854\nv 173.321214 133.118359 204.184476\nv 172.539306 132.981544 204.687253\nv 172.402187 133.115914 203.834249\nv 173.946525 133.373554 202.865472\nv 173.094887 133.377998 202.549725\nv 173.857316 133.498823 202.083725\nv 174.173216 134.048394 198.428573\nv 173.531238 133.952184 198.869557\nv 173.416388 134.047648 198.127142\nv 174.717048 134.239194 197.228535\nv 173.798982 134.245787 196.841280\nv 174.457663 134.341124 196.383658\nv 175.573152 134.844809 192.527864\nv 174.713877 134.769621 192.860758\nv 174.731006 134.861705 192.018310\nv 175.620668 135.028773 190.846443\nv 176.381000 135.098476 190.451022\nv 176.350613 135.006595 191.289996\nv 175.835149 135.364613 187.238167\nv 175.050772 135.295189 187.710277\nv 174.873446 135.364930 186.751505\nv 176.675212 135.631084 184.180164\nv 176.148245 135.559664 184.838507\nv 176.857557 135.826840 180.851836\nv 176.181486 135.764743 181.672929\nv 175.800994 135.797977 180.728011\nv 177.132608 135.908004 179.266064\nv 176.250230 135.897227 178.956217\nv 176.905774 135.945158 178.315363\nv 178.729648 136.107935 172.846672\nv 179.504686 136.122361 172.344969\nv 179.571712 136.111428 173.272724\nv 177.922361 136.084385 173.411013\nv 177.855335 136.095318 172.483257\nv 179.831953 136.064496 176.516888\nv 180.197798 136.084969 175.662883\nv 181.485083 136.109168 174.726583\nv 180.735373 136.099377 174.952864\nv 181.024567 136.113489 174.081667\nv 179.432350 135.862913 161.860003\nv 179.029292 135.901890 162.590419\nv 178.580555 135.934269 163.344480\nv 178.091501 135.958806 164.070770\nv 177.185554 136.014671 166.700059\nv 176.043881 135.977819 166.474437\nv 176.915859 135.981709 165.736261\nv 173.705685 135.911985 167.667335\nv 174.579313 135.957245 167.867380\nv 173.930067 135.943154 168.549215\nv 173.631168 135.941326 172.745257\nv 174.409734 135.983253 172.099842\nv 174.511106 135.979779 173.049848\nv 172.959455 135.889813 174.232332\nv 172.082101 135.844324 173.874632\nv 172.855186 135.892363 173.337563\nv 174.087698 135.909949 176.394945\nv 173.327937 135.852527 176.955901\nv 173.192350 135.874379 176.033912\nv 171.327157 135.593303 180.357777\nv 172.116587 135.658515 179.878694\nv 172.259697 135.630926 180.791400\nv 169.223865 135.039695 186.428785\nv 169.634734 135.124457 185.645465\nv 170.224800 135.104898 186.610938\nv 171.866163 135.065933 188.452264\nv 171.517550 134.972477 189.158069\nv 171.033905 135.022267 188.287140\nv 168.732538 134.476388 191.861537\nv 169.514833 134.597032 191.310653\nv 169.677619 134.526454 192.150215\nv 170.556893 134.364951 194.210237\nv 169.891164 134.248090 194.742429\nv 169.847932 134.337658 193.949239\nv 166.672918 133.585480 197.460345\nv 167.357679 133.710775 197.029599\nv 167.474365 133.614885 197.858563\nv 167.551771 133.379801 199.580368\nv 168.373446 133.429263 199.809016\nv 167.647807 133.281828 200.291010\nv 166.752709 132.663496 203.521042\nv 165.950904 132.682667 202.857263\nv 166.700817 132.813125 202.560246\nv 166.965677 132.539645 204.413581\nv 167.748466 132.365453 205.890327\nv 166.771080 132.208545 206.159928\nv 166.951173 132.389345 205.278704\nv 169.882290 129.485738 219.900228\nv 168.876161 129.469905 219.570907\nv 169.659365 129.724641 218.913687\nv 169.900793 130.650852 215.199306\nv 169.088653 130.469312 215.645917\nv 168.973346 130.643121 214.832146\nv 170.660791 131.020288 213.883663\nv 169.741774 131.017846 213.532340\nv 170.617079 131.213472 213.030467\nv 169.364511 131.717413 210.109058\nv 170.162198 131.873029 209.665560\nv 170.270088 131.716215 210.519286\nv 171.558499 132.311756 208.035034\nv 170.692896 132.304122 207.716705\nv 171.433702 132.444481 207.297974\nv 169.801018 132.817368 204.446047\nv 170.558865 132.964522 203.902179\nv 170.862432 132.831946 204.880893\nv 172.209595 133.373921 202.207759\nv 171.391913 133.374027 201.842628\nv 172.187996 133.503373 201.402847\nv 172.726770 134.034492 197.933068\nv 172.060140 133.955327 198.188345\nv 172.012500 134.038382 197.553287\nv 173.109364 134.232632 196.647206\nv 172.161905 134.154737 196.771504\nv 172.592138 134.269822 196.120701\nv 173.153446 134.900915 190.882598\nv 173.931762 134.882880 191.477071\nv 173.093415 134.804553 191.756730\nv 174.113188 135.231112 188.056125\nv 173.456773 135.172350 188.366582\nv 172.079378 135.146852 187.712932\nv 174.221660 135.678249 181.932291\nv 173.183762 135.658378 181.313898\nv 174.087025 135.716009 180.930710\nv 175.870951 135.963052 177.049536\nv 175.123340 135.911239 177.661225\nv 174.970895 135.939909 176.705245\nv 176.265398 136.038939 173.658512\nv 175.386210 136.013908 173.336929\nv 176.168860 136.046736 172.726016\nv 176.491491 136.035268 168.381323\nv 175.736550 136.024084 169.036835\nv 175.558635 135.999597 168.093747\nv 177.306367 136.042443 167.814411\nv 179.025094 136.027131 165.743832\nv 179.527244 135.946941 163.372393\nv 178.568020 135.998941 165.044169\nv 177.581013 135.978426 164.988485\nv 180.656578 135.725876 159.602828\nv 147.980146 131.576053 178.339269\nv 147.134609 131.307104 178.332093\nv 146.559963 131.158935 176.841643\nv 151.055266 132.541487 173.325453\nv 150.958171 132.504071 174.212100\nv 148.061504 131.667724 174.965827\nv 148.803355 131.875322 175.824700\nv 150.318210 132.332189 172.629765\nv 149.377465 132.057542 172.829929\nv 147.569714 131.518915 173.324066\nv 147.481200 131.490326 174.262240\nv 150.783393 132.439172 170.718882\nv 147.693954 131.548428 172.340281\nv 147.536437 131.385053 168.137540\nv 148.604070 131.743385 168.641198\nv 147.831445 131.514023 169.311599\nv 146.830947 131.210106 169.766352\nv 146.069909 130.978582 170.337853\nv 148.714571 131.632794 165.647939\nv 146.569600 131.047094 167.847975\nv 146.134455 130.701315 164.517299\nv 145.240145 130.481193 165.871421\nv 154.313626 133.329473 170.095306\nv 153.462556 133.122218 170.244982\nv 153.169771 133.067190 171.096188\nv 153.831068 133.235339 171.741126\nv 152.845558 132.918487 168.129235\nv 152.493453 132.846400 168.826693\nv 152.806381 132.881892 167.298960\nv 151.824081 132.612725 167.241279\nv 151.281026 132.380319 165.564250\nv 150.856129 132.157137 163.875584\nv 150.028446 131.893221 163.600800\nv 149.908177 131.777396 162.567584\nv 149.315600 131.248251 158.813324\nv 156.294939 133.616499 165.589113\nv 156.929800 133.784145 166.249240\nv 156.090253 133.611299 166.463518\nv 156.832279 133.644425 163.830651\nv 157.466355 133.822235 164.569694\nv 156.500409 133.611535 164.635791\nv 154.872284 133.286903 165.354850\nv 154.578035 133.060037 162.823174\nv 154.907405 133.196502 163.707182\nv 154.118827 133.044717 164.211963\nv 153.698712 132.837873 162.756799\nv 153.216705 132.591943 161.246508\nv 152.405999 132.376471 161.157263\nv 153.696063 132.520242 159.037589\nv 159.704331 134.258411 164.972185\nv 160.470097 134.359578 164.469236\nv 160.657561 134.441544 165.356415\nv 159.822039 134.364810 166.756975\nv 159.052818 134.240133 167.151469\nv 159.122574 134.215699 166.253859\nv 157.139278 133.931674 169.589497\nv 156.908098 133.903897 170.447219\nv 153.512014 133.174591 173.400116\nv 154.070838 133.302595 173.939953\nv 154.913264 133.453099 176.427965\nv 154.027246 133.242901 176.737339\nv 151.671412 132.634773 177.667759\nv 150.914252 132.425260 178.268132\nv 150.119059 132.083847 181.159187\nv 149.854144 132.053087 180.361692\nv 150.657698 132.270227 180.476632\nv 149.171126 131.630800 184.405467\nv 147.368096 130.995442 185.499765\nv 147.741601 131.162862 184.961700\nv 148.112465 131.210985 185.775764\nv 146.468625 130.731326 185.296374\nv 146.839489 130.779449 186.110439\nv 145.139112 130.065881 188.143097\nv 162.854017 134.657747 162.618020\nv 162.026248 134.558529 163.259363\nv 161.868425 134.480058 162.330931\nv 161.231992 134.461776 163.912871\nv 158.157446 133.962226 164.452448\nv 159.016768 134.122885 164.612674\nv 157.392879 133.931363 167.743972\nv 157.194945 133.920069 168.632785\nv 154.662096 133.424101 171.585789\nv 154.959506 133.490164 170.765927\nv 152.534691 132.905682 175.411523\nv 148.280706 131.607833 179.966140\nv 148.188025 131.607128 179.208420\nv 147.882045 131.428205 181.404340\nv 147.246474 131.213059 181.872660\nv 146.170081 130.694416 184.394133\nv 146.021061 130.702976 183.600954\nv 143.761597 129.879572 184.439615\nv 164.895610 134.864616 161.515887\nv 163.693766 134.788848 162.862567\nv 164.055428 134.889924 163.794951\nv 164.214641 134.954901 164.737367\nv 162.506242 134.775771 166.207021\nv 161.552773 134.614041 165.918112\nv 160.379206 134.509482 168.301264\nv 160.196163 134.489064 169.036264\nv 159.569240 134.368827 168.389584\nv 158.391550 134.203380 173.019081\nv 157.401410 134.010807 172.960150\nv 158.031652 134.134902 172.183257\nv 152.315291 132.750784 179.174498\nv 152.305660 132.727943 179.891717\nv 152.255599 132.607430 182.080322\nv 151.457407 132.396116 182.081397\nv 148.435473 131.410868 184.568157\nv 149.221623 131.598337 185.075009\nv 148.374124 131.156262 187.214664\nv 148.674050 131.318541 186.405687\nv 149.309214 131.431238 187.306521\nv 147.553225 130.786994 188.707721\nv 147.189395 130.605031 189.421568\nv 146.159147 130.041272 191.539440\nv 146.337022 130.013837 192.244194\nv 145.428681 129.575856 193.414825\nv 144.549454 129.225463 193.875208\nv 146.218713 129.874094 193.066793\nv 146.127343 129.707154 194.236369\nv 143.761597 128.906531 194.149383\nv 144.549454 129.089983 194.858577\nv 159.098606 134.340056 173.112936\nv 159.772914 134.452361 172.773947\nv 159.849728 134.464942 173.644695\nv 160.246718 134.492042 175.790342\nv 159.400596 134.336338 176.085168\nv 159.452232 134.365268 175.260424\nv 156.128474 133.666402 178.012583\nv 156.835500 133.821551 177.693084\nv 156.707085 133.761180 178.625246\nv 157.370621 133.798098 180.819445\nv 156.601545 133.617822 181.184610\nv 156.603959 133.666939 180.369000\nv 153.948229 133.016709 181.978505\nv 154.925011 133.230393 181.899925\nv 154.694406 133.136847 182.751652\nv 154.733880 132.978547 185.194737\nv 153.911887 132.784321 185.249487\nv 154.087107 132.886942 184.451954\nv 153.744871 132.283801 190.443412\nv 152.840109 132.049209 190.601902\nv 152.980177 132.180480 189.661070\nv 149.242834 131.085316 190.775014\nv 150.072177 131.261094 191.274369\nv 147.629235 129.861840 196.624006\nv 147.659245 129.720150 197.638508\nv 147.725418 129.608669 198.543181\nv 147.803187 129.471872 199.510986\nv 147.909918 129.342939 200.434048\nv 146.300769 128.812582 200.509365\nv 147.228180 129.036712 200.968705\nv 146.433177 128.690058 201.476781\nv 164.433222 135.052431 166.615570\nv 163.508185 134.918945 166.352004\nv 164.255302 134.999659 165.694849\nv 163.239664 134.937016 168.068646\nv 162.237720 134.793841 167.923662\nv 162.684162 134.828543 167.127741\nv 161.344174 134.657544 167.965351\nv 161.899676 134.766017 168.906255\nv 162.478419 134.865333 169.781061\nv 161.584872 134.729036 169.822749\nv 158.890765 134.281101 174.769467\nv 158.183708 134.144425 174.675612\nv 158.468364 134.215961 173.889829\nv 155.676602 133.621187 176.229495\nv 155.493551 133.558686 177.278891\nv 155.917471 133.546347 179.839455\nv 155.160220 133.372170 180.050968\nv 155.242808 133.431853 179.156258\nv 152.738389 132.807031 180.486592\nv 153.568308 133.000351 180.413992\nv 153.348915 132.916935 181.199378\nv 153.491370 132.807940 183.668468\nv 152.628659 132.591981 183.697684\nv 152.854913 132.707204 182.859449\nv 152.299948 132.094565 188.886173\nv 151.450071 131.866148 188.990839\nv 147.422643 130.595400 190.230731\nv 148.232568 130.822087 190.501167\nv 147.693726 130.294077 193.530111\nv 147.035684 130.145135 193.065737\nv 147.812035 130.433820 192.707512\nv 146.898795 129.860802 194.962506\nv 147.656834 130.148055 194.547866\nv 147.638254 130.003465 195.622036\nv 145.376333 128.923414 197.879680\nv 145.659148 127.127631 208.032893\nv 146.267560 127.461362 207.446869\nv 146.911667 127.975120 206.033950\nv 147.614487 128.087513 206.617334\nv 146.928514 127.773030 207.004835\nv 146.737048 128.131026 204.992685\nv 146.888697 128.523141 203.282937\nv 146.710317 128.305960 204.063592\nv 149.633138 129.559062 202.220414\nv 148.839489 129.395101 201.816015\nv 149.517714 129.690602 201.271206\nv 149.166227 130.047014 198.504815\nv 149.937014 130.210739 198.887105\nv 152.343923 131.168487 196.748588\nv 151.745628 130.929620 197.291170\nv 151.531889 131.025947 196.287545\nv 150.119389 131.011941 193.513941\nv 150.951777 131.295359 193.009086\nv 150.994388 131.162620 194.149813\nv 155.341658 132.479886 191.890846\nv 154.423568 132.250904 192.102242\nv 154.522892 132.381513 191.172848\nv 156.046760 133.157772 186.503497\nv 155.254780 132.968641 186.660425\nv 155.350639 133.065058 185.835343\nv 155.290143 133.215849 183.535138\nv 156.006268 133.368849 183.481651\nv 155.625224 133.234168 184.343717\nv 158.902796 134.040759 181.648081\nv 158.153806 133.871365 182.037089\nv 158.117198 133.918374 181.246047\nv 157.393573 133.881772 179.154791\nv 158.118167 134.027401 178.791857\nv 158.097629 133.992844 179.640900\nv 161.696075 134.702581 176.698627\nv 160.945206 134.568747 177.068592\nv 160.945951 134.596945 176.245121\nv 160.411194 134.549109 174.135652\nv 161.196616 134.676587 173.781383\nv 161.083775 134.648450 174.611329\nv 164.022235 135.097733 171.124487\nv 163.030496 134.953876 171.345315\nv 163.155355 134.972209 170.476727\nv 165.775300 135.272847 168.613015\nv 165.187538 135.212911 169.173709\nv 164.939478 135.166142 168.229918\nv 166.512912 135.342687 167.854237\nv 166.129082 135.285150 167.137806\nv 167.114755 135.401759 167.322819\nv 165.841207 135.312077 170.483819\nv 166.551792 135.384124 170.232507\nv 166.369640 135.376585 171.159520\nv 167.619033 135.495065 170.339563\nv 168.350601 135.566473 170.611648\nv 167.811793 135.520040 171.180293\nv 167.090600 135.430557 169.663862\nv 166.305312 135.366124 172.870838\nv 167.209015 135.463294 173.206116\nv 166.370408 135.360657 173.700117\nv 165.493954 135.109917 179.293939\nv 166.314629 135.182055 179.761961\nv 165.595449 135.070736 180.255746\nv 164.302340 134.677264 184.384183\nv 164.267200 134.727776 183.544315\nv 164.288180 134.542117 186.054213\nv 164.308642 134.612377 185.208544\nv 165.093112 134.666041 185.787133\nv 163.888161 134.154231 189.843064\nv 164.517045 134.278990 189.298806\nv 164.692315 134.222631 190.173422\nv 164.999202 134.074325 191.960450\nv 165.781914 134.132241 192.285209\nv 165.144980 133.989318 192.829883\nv 163.601804 133.418478 195.918182\nv 164.201187 133.548876 195.459561\nv 164.393833 133.470653 196.312463\nv 164.772234 133.301187 197.935684\nv 165.460927 133.355781 198.158070\nv 164.910881 133.221066 198.609692\nv 164.026051 132.558872 202.146843\nv 164.837050 132.746815 201.585251\nv 165.088013 132.644353 202.458059\nv 165.308296 132.390821 204.143376\nv 165.988292 132.382737 204.683182\nv 165.293792 132.240520 205.008499\nv 165.948906 131.792690 207.827543\nv 166.727898 131.902659 207.725140\nv 166.771384 131.778974 208.393159\nv 165.490331 131.518039 208.930179\nv 164.680341 131.488597 208.536900\nv 165.182402 131.639563 208.102282\nv 166.031698 130.935760 212.062669\nv 166.825604 131.147139 211.542101\nv 167.057036 130.979346 212.422922\nv 167.240854 130.632629 214.063511\nv 168.111030 130.644459 214.449321\nv 167.291030 130.449751 214.892948\nv 166.794519 129.468462 218.644992\nv 167.669501 129.698105 218.172728\nv 167.778255 129.479165 219.056629\nv 169.018550 128.972014 221.497513\nv 167.995500 128.754462 221.857604\nv 168.076035 129.013451 220.917540\nv 169.282740 128.014943 224.920343\nv 170.066287 128.222682 224.496973\nv 170.225531 128.010697 225.257536\nv 170.989766 127.172354 228.191401\nv 170.055155 127.183478 227.860043\nv 170.782165 127.402663 227.408006\nv 169.514316 126.731524 229.049368\nv 170.397495 126.636238 229.612104\nv 173.119074 126.142029 231.770674\nv 144.378810 131.625889 158.879877\nv 144.450699 132.616753 159.054595\nv 145.067913 132.427048 159.021165\nv 144.641164 138.549016 160.100607\nv 144.641164 137.263023 159.873850\nv 143.761597 138.245562 160.047092\nv 218.761597 138.245562 160.047092\nv 217.908573 137.451805 159.907129\nv 217.908573 138.737798 160.133886\nv 148.894380 131.941664 158.935581\nv 148.143935 131.777004 158.906545\nv 148.485611 132.716670 159.072229\nv 216.111051 144.328337 161.119672\nv 216.085945 145.465774 161.320224\nv 217.026758 144.789546 161.200987\nv 215.353489 147.801524 161.732097\nv 216.023609 148.412572 161.839830\nv 216.268235 147.525313 161.683372\nv 212.578766 136.097494 159.668346\nv 211.886410 136.778119 159.788384\nv 212.745804 137.078228 159.841282\nv 214.846371 146.943978 161.580900\nv 214.601745 147.831238 161.737358\nv 208.813809 143.000750 160.885577\nv 209.182843 142.057734 160.719294\nv 208.364294 142.215459 160.747106\nv 207.010230 151.815088 162.439797\nv 207.845187 151.695179 162.418655\nv 207.315424 150.877713 162.274498\nv 194.969794 153.654044 162.764030\nv 195.090199 152.481045 162.557195\nv 194.254552 153.295247 162.700766\nv 195.620644 135.593314 159.579465\nv 194.772269 136.002887 159.651669\nv 195.456467 136.550998 159.748330\nv 196.784020 135.454715 159.555012\nv 196.430474 135.504161 159.563763\nv 200.654439 148.300224 161.820019\nv 200.809162 149.333512 162.002222\nv 201.503448 148.527778 161.860152\nv 163.274131 136.958682 159.820221\nv 162.631234 136.587271 159.754718\nv 162.620210 137.439008 159.904900\nv 164.184742 145.657347 161.354048\nv 163.329817 145.170207 161.268138\nv 163.296435 146.151233 161.441121\nv 166.904300 137.425755 159.902584\nv 166.134827 136.647351 159.765336\nv 165.947685 137.512472 159.917882\nv 165.097967 153.374177 162.714715\nv 165.874986 152.990391 162.647028\nv 165.124276 152.132226 162.495714\nv 193.730639 150.831475 162.266342\nv 193.467842 150.119529 162.140805\nv 192.882141 150.664789 162.236957\nv 192.207522 150.715484 162.245899\nv 192.470319 151.427429 162.371436\nv 169.949839 150.312066 162.174775\nv 170.007227 149.248152 161.987176\nv 169.143196 149.870952 162.096987\nv 169.045970 144.571993 161.162625\nv 169.908049 144.646389 161.175744\nv 169.812352 143.911742 161.046207\nv 167.616568 150.323105 162.176707\nv 166.967901 149.640756 162.056387\nv 166.733694 150.288484 162.170601\nv 147.366779 144.821347 161.206598\nv 147.508597 143.979761 161.058207\nv 146.672462 144.294907 161.113776\nv 149.167795 146.812936 161.557792\nv 148.624802 146.093896 161.430998\nv 148.310040 146.945163 161.581094\nv 153.789550 148.313502 161.822375\nv 153.326456 147.524165 161.683185\nv 152.923467 148.304895 161.820847\nv 158.286839 138.050248 160.012696\nv 157.766146 137.161710 159.856030\nv 157.421398 138.053119 160.013208\nv 159.982068 134.771596 159.434559\nv 159.048943 134.589994 159.402561\nv 160.488921 135.638210 159.587369\nv 160.006833 136.330503 159.709442\nv 160.943217 136.436522 159.728140\nv 159.876177 144.217824 161.100176\nv 159.088810 144.676534 161.181079\nv 159.937979 145.140582 161.262886\nv 192.147740 140.926301 160.519792\nv 191.246915 141.224993 160.572460\nv 192.024199 141.889950 160.689703\nv 186.426542 145.829377 161.384339\nv 185.675166 146.338140 161.474043\nv 186.457836 146.718871 161.541181\nv 186.542676 152.741928 162.603210\nv 187.250657 153.420660 162.722886\nv 187.251552 152.581349 162.574893\nv 182.230321 144.823979 161.207061\nv 183.111275 144.596893 161.167018\nv 182.501960 143.980324 161.058305\nv 180.692652 144.675829 161.180937\nv 180.559309 145.473042 161.321506\nv 181.487664 145.004622 161.238917\nv 174.266616 150.231592 162.160588\nv 175.085899 150.542445 162.215385\nv 174.966156 149.574069 162.044635\nv 218.761590 124.310282 230.422453\nv 218.761066 124.779208 231.383982\nv 218.761073 123.922929 231.064454\nv 218.761597 133.838121 234.071750\nv 218.761597 133.705260 233.209214\nv 218.761597 134.643378 233.387818\nv 218.761597 133.694073 161.963691\nv 218.761597 133.622935 162.852176\nv 218.761597 132.933764 162.085179\nv 218.761597 135.673575 159.593578\nv 218.761597 136.106605 160.498831\nv 218.761597 134.820612 160.272074\nv 218.761597 135.871082 166.531380\nv 218.761597 134.763447 166.415187\nv 218.761597 135.495970 165.892057\nv 218.761597 135.029751 167.739264\nv 218.761597 135.876834 167.453173\nv 218.761597 135.768027 168.137927\nv 218.761597 145.327463 165.739153\nv 218.761597 146.067449 166.412213\nv 218.761597 145.105744 166.573446\nv 218.761597 142.778522 167.953202\nv 218.761597 142.078590 167.091679\nv 218.761597 143.084502 167.044487\nv 218.761597 139.847985 171.641940\nv 218.761597 140.357377 172.464189\nv 218.761597 139.240552 172.526126\nv 218.761597 143.527147 171.434606\nv 218.761597 142.851191 171.249120\nv 218.761597 143.283135 170.688565\nv 218.761597 140.833692 173.415391\nv 218.761597 141.441125 172.531205\nv 218.761597 137.172646 173.916091\nv 218.761597 138.078061 174.048847\nv 218.761597 137.528607 174.760940\nv 218.761597 128.715787 229.031997\nv 218.761597 127.718862 229.284869\nv 218.761597 128.003001 228.376788\nv 218.761597 122.501990 224.119684\nv 218.761597 122.337891 224.575689\nv 218.761597 126.294362 225.248153\nv 218.761597 127.394857 225.852784\nv 218.761597 126.175154 226.201948\nv 218.761597 135.706261 227.536496\nv 218.761597 136.153873 228.276504\nv 218.761597 135.313384 228.428942\nv 218.761597 137.209835 228.022398\nv 218.761597 137.493213 227.251055\nv 218.761597 138.156298 227.889396\nv 218.761597 128.644691 223.740410\nv 218.761597 128.426962 224.634414\nv 218.761597 127.731793 224.004986\nv 218.761597 137.728273 226.299161\nv 218.761597 136.781811 226.432163\nv 218.761597 138.025311 225.499642\nv 218.761597 138.736713 226.318535\nv 218.761597 141.215904 174.274708\nv 218.761597 142.271818 174.331269\nv 218.761597 141.570281 175.123570\nv 218.761597 138.067819 176.347107\nv 218.761597 137.892519 176.997265\nv 218.761597 137.047520 176.657728\nv 218.761597 149.265601 180.232085\nv 218.761597 149.229026 181.040812\nv 218.761597 137.693633 179.376235\nv 218.761597 138.623044 179.243943\nv 218.761597 138.190337 180.106453\nv 218.761597 141.952852 179.957063\nv 218.761597 142.336523 180.810407\nv 218.761597 141.431215 180.743900\nv 218.761597 141.323397 182.356795\nv 218.761597 142.116654 182.395500\nv 218.761597 141.625164 183.155051\nv 218.761597 139.224633 181.594707\nv 218.761597 139.662006 182.301474\nv 218.761597 138.810277 182.334254\nv 218.761597 148.953573 185.665473\nv 218.761597 148.924950 186.575953\nv 218.761597 148.100416 186.047121\nv 218.761573 132.057889 184.594404\nv 218.761596 132.894553 184.663586\nv 218.761573 132.518966 185.397837\nv 218.761597 143.493692 185.343862\nv 218.761597 143.890586 184.742834\nv 218.761597 144.298014 185.346897\nv 218.761597 148.620635 189.584091\nv 218.761597 148.531457 190.615623\nv 218.761597 147.703789 190.044113\nv 218.761597 148.447953 191.511875\nv 218.761597 148.366023 192.534075\nv 218.761597 147.532680 192.097845\nv 218.761597 144.998081 191.454471\nv 218.761597 145.049842 190.409940\nv 218.761597 145.884604 190.947339\nv 218.761597 143.302197 190.455877\nv 218.761597 143.304129 191.404108\nv 218.761597 142.443007 190.942913\nv 218.761597 138.372428 192.278893\nv 218.761597 139.128876 192.958418\nv 218.761597 138.189990 193.021042\nv 218.761597 143.280980 192.371103\nv 218.761597 143.270678 193.259488\nv 218.761597 142.434637 192.779529\nv 218.761597 143.232220 194.947031\nv 218.761597 143.974486 195.281003\nv 218.761597 143.165576 195.695729\nv 218.761597 142.423823 194.514837\nv 218.761597 143.232732 194.100110\nv 218.761597 137.878654 194.972454\nv 218.761597 138.130906 195.972835\nv 218.761597 137.112398 195.570535\nv 218.761597 129.131868 220.115754\nv 218.761597 129.395981 220.969571\nv 218.761597 128.494185 220.802506\nv 218.761597 128.801821 219.187556\nv 218.761597 129.703617 219.354622\nv 218.761597 141.305235 221.040017\nv 218.761597 140.588069 220.442447\nv 218.761597 141.512892 220.148206\nv 218.761597 143.430408 219.458374\nv 218.761597 143.194126 220.350664\nv 218.761597 142.466340 219.853487\nv 218.761597 142.908203 214.270209\nv 218.761597 143.662898 214.728301\nv 218.761597 142.837409 215.120088\nv 218.761597 134.739583 213.963834\nv 218.761597 134.707391 214.927060\nv 218.761597 133.829871 214.594607\nv 218.761597 126.576278 213.535492\nv 218.761597 127.176085 213.855980\nv 218.761597 126.718477 214.455530\nv 218.761597 143.439098 198.240604\nv 218.761597 143.235700 199.214954\nv 218.761597 142.495572 198.322804\nv 218.761597 134.734914 198.968227\nv 218.761597 133.867077 199.031402\nv 218.761597 137.572838 204.497557\nv 218.761597 136.427801 204.149880\nv 218.761597 137.222305 203.455712\nv 218.761597 146.022785 208.286390\nv 218.761597 145.498342 209.082779\nv 218.761597 144.855828 208.200468\nv 218.761597 130.036102 207.412587\nv 218.761597 130.973479 207.569264\nv 218.761597 130.439098 208.274627\nv 218.761597 140.414320 209.922655\nv 218.761597 139.520657 210.228475\nv 218.761597 139.626177 209.439108\nv 218.761597 129.653192 210.477731\nv 218.761597 130.418872 210.840314\nv 218.761597 129.808908 211.372495\nv 218.761597 139.606206 212.906785\nv 218.761597 138.777029 212.525686\nv 215.736381 123.770096 233.651718\nv 215.200365 123.138872 233.540410\nv 216.079425 123.035943 233.522260\nv 215.933195 127.140263 234.245964\nv 215.402443 126.234077 234.086180\nv 216.420928 126.377739 234.111508\nv 147.492866 125.511585 233.958790\nv 147.656400 124.458157 233.773040\nv 148.192823 125.271062 233.916390\nv 147.027857 136.284636 235.858366\nv 146.368211 135.616410 235.740548\nv 147.162350 135.380017 235.698859\nv 153.934731 122.635983 233.451711\nv 154.793074 122.883624 233.495379\nv 149.412725 138.224764 236.200450\nv 149.909586 137.479061 236.068962\nv 150.293772 138.241867 236.203467\nv 212.423285 135.031410 235.637358\nv 213.244633 134.653544 235.570741\nv 213.234422 135.500874 235.720143\nv 214.177450 136.050694 235.817089\nv 213.356102 136.428561 235.883706\nv 210.470267 133.147381 235.305154\nv 211.066090 133.801557 235.420507\nv 210.259105 134.052600 235.464768\nv 209.459688 127.481782 234.306170\nv 209.483224 128.332199 234.456116\nv 208.676293 127.762372 234.355651\nv 155.998475 139.294050 236.389001\nv 154.993341 139.116745 236.357737\nv 155.830281 138.321661 236.217537\nv 153.080144 138.750146 236.293099\nv 152.173479 138.559187 236.259412\nv 153.897751 131.689657 235.048134\nv 153.410453 132.544365 235.198843\nv 153.045025 131.640058 235.039396\nv 209.423568 134.331289 235.513905\nv 210.019391 134.985465 235.629258\nv 203.396204 126.063714 234.056124\nv 203.464983 125.141962 233.893595\nv 204.243018 125.748183 234.000473\nv 202.835833 124.413748 233.765173\nv 203.682647 124.098217 233.709522\nv 199.844698 125.715235 233.994665\nv 199.298851 124.963570 233.862118\nv 200.219996 124.800615 233.833391\nv 157.220344 125.789195 234.007724\nv 157.060295 125.053792 233.878050\nv 157.848613 125.179722 233.900250\nv 156.149089 141.308972 236.744286\nv 155.340319 141.050113 236.698652\nv 155.970305 140.347992 236.574835\nv 158.304976 140.518621 236.604886\nv 157.506273 140.989793 236.687978\nv 157.577778 140.135679 236.537377\nv 160.864299 130.765285 234.885108\nv 160.006844 131.274798 234.974953\nv 159.947876 130.317017 234.806067\nv 158.934160 142.087214 236.881499\nv 158.253835 141.967419 236.860341\nv 162.649683 129.156195 234.601388\nv 162.324914 128.344060 234.458188\nv 162.996465 128.466045 234.479694\nv 163.065057 139.198598 236.372125\nv 163.523029 138.536533 236.255393\nv 163.856086 139.444131 236.415422\nv 165.091748 137.744959 236.115831\nv 165.352893 136.884651 235.964139\nv 166.029940 137.584108 236.087476\nv 164.027129 142.740048 236.996578\nv 163.663131 142.691594 236.988026\nv 165.474640 139.306113 236.391104\nv 166.352537 139.075496 236.350450\nv 166.058383 139.937194 236.502386\nv 168.613220 133.602237 235.385377\nv 167.903778 134.009463 235.457170\nv 168.028541 133.119347 235.300220\nv 171.072613 141.382373 236.757221\nv 170.236473 141.674386 236.808689\nv 170.681828 140.684061 236.634077\nv 173.501399 130.081521 234.764573\nv 172.909710 130.623312 234.860101\nv 172.853835 129.706622 234.698460\nv 172.540982 140.420905 236.587695\nv 172.162408 139.494579 236.424359\nv 173.185422 139.523435 236.429446\nv 173.785613 143.414552 237.115558\nv 172.784153 143.396651 237.112409\nv 173.527760 142.385910 236.934174\nv 175.377824 137.723179 236.111991\nv 176.320182 137.707723 236.109244\nv 175.685673 138.588807 236.264613\nv 190.396505 136.565076 235.907775\nv 190.435959 137.470298 236.067387\nv 189.644041 137.051937 235.993618\nv 186.438571 128.098289 234.414863\nv 187.441526 127.974262 234.392990\nv 186.845204 128.894494 234.555265\nv 183.911409 140.433158 236.589861\nv 184.586897 139.740598 236.467747\nv 184.846140 140.630403 236.624643\nv 184.852800 126.162971 234.073640\nv 185.599575 126.373979 234.110838\nv 184.565383 126.927050 234.208372\nv 183.228598 143.814311 237.186037\nv 183.025147 144.680343 237.338745\nv 182.953649 143.821361 237.187288\nv 182.159491 131.880992 235.081892\nv 182.090100 132.649128 235.217337\nv 181.348514 132.445488 235.181433\nv 201.059899 133.784843 235.417552\nv 200.209868 133.088333 235.294740\nv 201.269505 132.896022 235.260823\nv 197.735628 139.186987 236.370120\nv 198.106879 138.180350 236.192611\nv 198.733049 138.984794 236.334462\nv 196.475574 137.623254 236.094377\nv 196.686586 136.636900 235.920462\nv 197.320470 137.396189 236.054354\nv 192.850187 128.840430 234.545704\nv 192.350018 129.632168 234.685320\nv 191.804459 128.840586 234.545741\nv 193.094211 139.218822 236.375715\nv 193.479228 139.820089 236.481744\nv 192.783915 139.995835 236.512729\nv 143.762716 119.728368 231.001445\nv 143.762716 120.877363 230.855469\nv 143.761597 120.286797 230.241721\nv 143.761597 127.793195 233.419846\nv 143.774660 126.505414 233.192777\nv 143.774660 127.152169 234.248082\nv 143.761597 137.177744 163.828805\nv 143.761597 136.092117 163.583135\nv 143.761597 136.455499 164.372264\nv 143.761597 134.035886 163.165518\nv 143.761597 134.349455 163.942797\nv 143.761597 135.056303 163.349315\nv 143.761597 134.079326 166.757199\nv 143.761597 134.562158 166.186020\nv 143.761597 133.740384 165.930372\nv 143.761597 145.678396 164.901647\nv 143.761597 144.735063 164.977823\nv 143.761597 145.335038 165.660776\nv 143.761597 129.495603 230.395981\nv 143.761597 128.622740 230.320745\nv 143.761597 128.979416 230.952794\nv 143.761597 130.394777 231.673014\nv 143.761597 131.396264 231.615997\nv 143.761597 130.853767 230.971012\nv 143.761597 136.858339 227.245751\nv 143.761597 135.926607 227.059094\nv 143.761597 136.276580 228.089375\nv 143.761597 131.943022 174.880414\nv 143.761597 131.098401 174.212065\nv 143.761597 131.078126 175.096846\nv 143.761597 141.383149 173.562763\nv 143.761597 140.917422 172.605737\nv 143.761597 140.449037 173.566510\nv 143.761597 139.944900 171.159464\nv 143.761597 140.070080 170.340622\nv 143.761597 139.280172 170.448994\nv 143.761597 132.880347 172.763670\nv 143.761597 131.965229 173.058179\nv 143.761597 132.878414 173.701123\nv 143.761597 144.160724 169.174425\nv 143.761597 143.865126 170.027467\nv 143.761597 144.789508 169.895295\nv 143.761597 130.821251 182.991963\nv 143.761597 130.873977 182.145436\nv 143.761597 147.402975 186.826356\nv 143.761597 148.186732 186.149990\nv 143.761597 147.403247 185.870697\nv 143.761597 147.290790 189.469535\nv 143.761597 148.097590 189.541735\nv 143.761597 147.512285 188.687516\nv 143.761597 139.797436 188.353424\nv 143.761597 138.756147 188.655108\nv 143.761597 139.402704 189.248187\nv 143.761597 135.822062 192.248916\nv 143.761597 134.956165 192.109619\nv 143.761597 135.334232 192.992341\nv 143.761597 145.780830 195.670375\nv 143.761597 144.964076 195.568966\nv 143.761597 145.237870 196.547872\nv 143.761597 148.700699 196.832023\nv 143.761597 148.138474 196.326014\nv 143.761597 148.008576 197.280733\nv 143.761597 127.138138 222.697548\nv 143.761597 126.287187 222.499389\nv 143.761597 136.371408 220.528203\nv 143.761597 136.202710 221.560759\nv 143.761597 137.891684 219.757925\nv 143.761597 138.568287 220.380750\nv 143.761597 133.165919 217.471509\nv 143.761597 133.540128 216.616074\nv 143.761597 132.644836 216.904299\nv 143.761597 132.788864 213.636206\nv 143.761597 133.689719 213.343606\nv 143.761597 132.969229 212.685917\nv 143.761597 133.761738 200.273671\nv 143.761597 134.226475 199.551030\nv 143.761597 133.383021 199.514401\nv 143.761597 145.764764 199.044230\nv 143.761597 146.716009 199.009010\nv 143.761597 145.984051 198.221353\nv 143.761597 139.862826 214.102346\nv 143.761597 140.851569 214.028924\nv 143.761597 129.532071 209.273605\nv 143.761597 130.063953 210.176112\nv 143.761597 130.302941 209.134442\nv 143.761597 127.436700 206.815978\nv 143.761597 127.339620 207.707689\nv 143.761597 128.035067 207.877968\nv 143.761597 128.551752 201.449016\nv 143.761597 129.312832 201.461495\nv 143.761597 128.670679 200.705976\nv 143.761597 134.954168 201.089703\nv 143.761597 134.107635 201.041478\nv 143.761597 134.456610 201.820881\nv 143.761597 132.058289 206.935190\nv 143.761597 132.826699 206.301172\nv 143.761597 131.894559 205.980533\nv 143.761597 138.402660 207.768664\nv 143.761597 137.560037 207.585308\nv 143.761597 137.552761 208.497539\nv 146.156356 150.808157 167.924753\nv 143.761597 146.061993 212.080003\nv 144.637061 146.318447 212.066134\nv 145.444312 146.533789 212.149277\nv 144.568848 146.091236 212.996947\nv 152.617057 152.188396 163.433139\nv 151.836037 152.015082 163.413435\nv 152.636570 152.236136 164.379928\nv 149.505916 151.610515 166.221036\nv 149.443349 151.550377 165.235211\nv 149.526547 151.649982 167.235555\nv 149.564227 151.698002 168.213622\nv 144.600168 150.221885 164.736100\nv 143.761597 150.003827 165.089875\nv 148.626715 151.435262 167.179489\nv 157.444701 153.150113 164.448136\nv 157.413025 153.105325 163.547799\nv 156.554480 152.957837 163.533737\nv 156.580328 153.040897 165.354900\nv 155.785523 152.858948 164.428013\nv 155.779696 152.897220 165.348838\nv 154.219209 152.593986 165.086971\nv 153.435558 152.441075 165.075811\nv 155.757179 152.773647 162.608799\nv 155.788855 152.818436 163.509136\nv 162.456632 153.979596 166.796157\nv 162.408131 153.957369 166.009096\nv 161.494912 153.862444 166.721536\nv 159.831978 153.565315 164.912634\nv 160.617207 153.675569 164.900437\nv 161.557747 153.716103 162.775002\nv 163.393842 154.101844 166.888185\nv 162.480623 154.006919 167.600625\nv 162.436595 153.929425 165.187108\nv 164.554842 154.112915 163.639828\nv 163.461039 153.990617 163.629119\nv 165.731531 154.247785 163.663594\nv 164.671988 154.097471 162.842263\nv 162.825150 153.882950 162.804451\nv 170.564044 154.721682 165.379043\nv 171.806730 154.740724 163.759483\nv 171.024529 154.656975 162.940895\nv 172.639460 154.784116 163.770828\nv 172.292661 154.856170 166.371960\nv 173.193340 154.875877 165.597556\nv 173.495311 154.827993 163.778579\nv 172.906205 154.770225 162.960846\nv 174.377807 154.863299 163.793055\nv 174.111063 154.877190 164.603038\nv 172.262611 154.866686 167.189275\nv 171.397159 154.812985 166.954685\nv 173.149092 154.923355 167.901124\nv 172.253590 154.880170 168.483849\nv 174.560974 154.840248 162.973197\nv 174.955738 154.958064 166.036641\nv 174.075836 154.911184 165.612032\nv 174.038015 154.956752 167.031159\nv 175.791024 154.967674 165.536498\nv 177.355248 154.952860 163.813898\nv 176.619408 154.901011 162.983895\nv 178.281615 154.967657 163.815082\nv 180.238859 154.988083 163.808159\nv 179.335104 154.979290 163.817134\nv 179.588063 155.008480 164.631198\nv 179.939319 155.061228 166.127552\nv 180.550793 155.044048 165.420116\nv 179.880343 155.034454 165.329659\nv 181.198084 154.991184 163.808712\nv 180.945126 154.961994 162.994648\nv 180.135269 155.121491 168.511897\nv 180.618984 155.125351 168.590769\nv 180.152257 155.111850 167.718261\nv 180.100189 155.132633 173.631907\nv 180.198924 155.120672 174.582986\nv 181.096340 155.129760 174.105661\nv 180.355773 154.126299 191.906213\nv 181.274213 154.110199 192.132810\nv 180.142533 154.245175 190.620322\nv 180.992929 154.262946 190.503831\nv 180.006471 154.320756 189.788541\nv 180.263454 153.052086 201.060431\nv 181.159323 153.126118 200.577520\nv 180.441216 153.182516 200.127032\nv 179.042158 153.339090 198.799150\nv 180.571627 153.257089 199.573813\nv 179.153834 151.783611 209.147763\nv 180.097318 151.065182 213.115450\nv 180.074955 151.253095 212.090460\nv 179.233341 151.196451 212.354247\nv 179.988925 148.917406 222.821722\nv 180.785790 149.047551 222.305177\nv 180.035647 149.096111 222.076043\nv 179.827809 149.680147 219.632632\nv 178.989296 149.455363 220.525752\nv 181.614774 148.015104 226.327123\nv 180.212846 147.840826 226.982520\nv 178.962604 147.176910 229.343715\nv 178.871355 146.932857 230.148364\nv 176.559403 144.605148 237.325447\nv 176.786681 144.874587 236.536962\nv 177.579171 144.888131 236.560542\nv 178.845567 144.920487 236.566295\nv 177.974801 144.641350 237.331849\nv 178.481124 145.701059 234.165124\nv 179.632592 144.933213 236.576649\nv 180.643144 144.944558 236.578648\nv 180.251748 144.685051 237.339600\nv 175.281951 144.542350 237.314400\nv 174.620362 144.772084 236.511806\nv 176.381746 145.410268 234.866032\nv 175.492878 145.370563 234.851924\nv 174.709494 145.252716 235.091698\nv 175.115151 145.562508 234.224011\nv 174.197510 145.021920 235.689461\nv 173.819783 145.213865 235.061549\nv 173.173733 145.274236 234.741890\nv 173.685717 145.505033 234.144126\nv 172.696786 144.925894 235.694558\nv 172.563890 144.647006 236.511798\nv 170.903797 144.993769 235.055220\nv 171.487774 144.814965 235.741906\nv 170.949256 145.459052 233.647042\nv 172.010181 145.628590 233.381061\nv 169.178804 144.380796 236.418142\nv 170.106639 144.441952 236.497206\nv 169.961941 144.700054 235.674946\nv 167.975480 144.827001 234.680930\nv 167.151026 144.788954 234.515511\nv 167.583960 145.172158 233.511082\nv 168.491226 144.034747 237.224903\nv 166.286724 144.901631 233.864636\nv 165.528699 145.323992 232.269687\nv 166.183482 145.120103 233.163996\nv 166.104723 145.337999 232.451354\nv 160.449988 143.186093 236.367280\nv 160.315174 142.921499 237.028605\nv 155.896605 142.344533 236.178900\nv 156.520112 142.483562 236.178238\nv 157.316101 142.379402 236.932999\nv 153.591260 142.866148 233.139838\nv 154.689469 143.145978 233.106097\nv 154.781664 142.343215 235.444091\nv 155.477156 142.251729 236.162550\nv 155.938553 142.103897 236.884453\nv 154.823612 142.102579 236.149644\nv 153.627064 141.837786 236.102945\nv 154.322555 141.746299 236.821404\nv 151.099404 142.695098 231.840358\nv 151.896800 142.711973 232.383473\nv 151.911838 142.877044 231.917845\nv 151.450623 141.824044 234.570939\nv 152.010455 141.696419 235.331547\nv 152.958884 141.681435 236.074586\nv 152.521880 141.570733 236.055032\nv 152.689003 141.370803 236.755150\nv 153.459940 142.037715 235.402827\nv 150.469410 141.330225 235.216038\nv 149.654638 141.398091 234.395084\nv 150.414377 141.579339 234.467671\nv 148.944575 140.972790 235.015880\nv 148.324037 140.523977 235.723054\nv 147.699245 140.030327 236.518825\nv 147.554685 140.302953 235.684080\nv 143.761597 140.167152 232.673248\nv 144.467303 140.152504 233.386210\nv 147.446310 140.623530 234.732029\nv 146.821518 140.129879 235.527801\nv 148.134973 141.078059 234.069040\nv 146.203544 139.576454 236.438801\nv 145.943076 140.450928 233.900686\nv 145.218651 140.168672 234.003691\nv 144.697095 139.397073 235.551380\nv 144.803546 139.125904 236.359375\nv 144.512944 139.337572 235.540882\nv 143.945747 138.848702 236.310501\nv 143.761597 143.910094 220.872197\nv 144.510607 144.101324 220.996044\nv 146.542810 146.916331 211.812053\nv 143.761597 146.722450 208.883907\nv 144.328752 147.489724 205.684267\nv 144.294009 147.397957 206.118996\nv 144.861164 147.537484 206.253909\nv 144.328755 147.675612 204.634087\nv 143.761600 147.536086 204.499173\nv 145.612427 148.587456 201.187086\nv 144.644348 148.374207 200.850161\nv 144.644348 148.511407 199.978514\nv 145.474519 148.831406 199.359585\nv 143.761597 148.163201 200.646152\nv 143.761597 149.163651 192.973900\nv 144.534202 149.297222 193.682197\nv 146.055307 149.777225 193.110316\nv 146.749775 149.887693 193.747746\nv 146.030102 150.792334 178.595662\nv 145.958515 150.746254 179.511130\nv 143.761597 150.204101 176.960704\nv 146.895820 151.095460 171.448493\nv 143.761597 150.228996 171.467400\nv 144.531694 150.449001 171.575774\nv 144.531694 150.447605 172.461768\nv 143.761597 150.238198 172.800301\nv 143.761597 150.188500 169.763100\nv 151.048569 151.836151 163.386050\nv 151.039114 151.781744 162.433899\nv 149.280629 151.352173 162.358154\nv 146.717844 150.827260 164.756815\nv 146.960690 150.925594 165.401185\nv 145.983391 150.614635 164.701469\nv 146.339119 150.678681 163.974962\nv 150.635851 141.891909 233.749986\nv 151.378231 142.333320 233.079620\nv 148.845037 141.503359 233.448245\nv 150.326779 142.518231 231.729864\nv 150.327363 142.847210 230.779004\nv 149.539699 142.505271 231.134138\nv 148.787544 142.284548 231.145954\nv 147.310519 141.515014 232.102417\nv 145.879621 140.873291 232.660913\nv 148.786413 142.630151 230.142481\nv 147.304856 142.514118 229.177451\nv 146.568549 142.305923 229.128465\nv 145.864327 141.143419 231.879555\nv 144.447826 141.374805 229.901984\nv 144.447826 141.613101 229.181784\nv 143.761597 141.267700 229.550995\nv 146.274532 143.888259 223.663221\nv 146.284409 144.189306 222.614916\nv 143.761597 143.322970 222.956349\nv 144.500729 143.213153 224.128502\nv 145.920460 143.038015 226.157252\nv 147.062330 144.045193 223.932104\nv 147.512317 144.077639 224.276384\nv 147.759190 144.366606 223.537522\nv 148.179002 144.232986 224.412377\nv 147.357823 143.208336 226.996187\nv 147.313775 142.924576 227.889938\nv 148.886438 144.384227 224.562493\nv 148.099604 143.656945 226.234805\nv 150.294507 144.241087 226.278672\nv 150.329292 144.499881 225.468031\nv 150.298458 143.961045 227.197774\nv 148.041462 142.836510 228.814173\nv 148.762137 142.886463 229.309842\nv 149.516006 143.090562 229.350638\nv 151.098837 144.350316 226.611981\nv 150.355863 143.075929 230.086639\nv 151.915917 144.474713 226.851827\nv 151.922890 144.206905 227.754548\nv 152.736019 144.611344 227.075292\nv 152.776757 144.061875 228.887257\nv 153.801920 144.195853 229.222264\nv 153.768156 144.477515 228.313019\nv 151.957219 143.830573 228.984006\nv 151.990983 143.548911 229.893251\nv 154.702300 144.363683 229.362755\nv 153.599037 143.347743 231.741325\nv 156.367688 144.668809 229.509869\nv 157.410113 144.620149 230.323967\nv 157.367504 144.870236 229.503981\nv 155.601809 144.515107 229.488940\nv 155.510789 144.267297 230.203669\nv 158.149633 144.494507 231.170545\nv 156.397480 143.553507 232.988299\nv 157.192567 143.734324 232.924398\nv 158.698450 144.347282 231.943275\nv 158.958746 144.674350 231.090809\nv 159.408413 145.012218 230.284027\nv 159.957230 144.864992 231.056757\nv 158.425644 144.028923 232.772076\nv 160.321551 144.698480 231.771053\nv 160.771218 145.036348 230.964271\nv 160.390653 144.482380 232.461763\nv 161.204641 144.653735 232.369276\nv 160.117847 144.164021 233.290564\nv 160.748571 144.083551 233.870753\nv 162.297019 144.621876 232.989482\nv 162.227916 144.837977 232.298772\nv 162.343241 144.406536 233.667970\nv 161.319965 144.222295 233.738474\nv 163.989308 144.195843 235.058702\nv 165.243469 144.362820 235.077962\nv 164.559780 144.502175 234.364348\nv 166.165506 144.020939 236.473553\nv 165.369352 144.150036 235.768112\nv 180.509672 145.658959 234.400063\nv 181.130958 146.421138 231.961735\nv 178.361510 145.950028 233.348607\nv 177.395482 145.947653 233.280079\nv 178.548395 146.208285 232.522474\nv 177.695721 146.447205 231.664857\nv 178.622813 146.451375 231.716729\nv 178.736167 146.692671 230.927641\nv 175.588172 146.426558 231.470800\nv 176.864621 146.445502 231.566536\nv 176.532627 146.669558 230.780032\nv 174.349910 146.026222 232.597775\nv 173.558152 146.146295 232.037581\nv 173.580034 145.996327 232.539208\nv 175.135164 145.778304 233.541820\nv 174.351779 145.660457 233.781593\nv 171.926602 146.122203 231.746372\nv 171.022812 145.909891 232.225691\nv 171.884485 145.904088 232.458334\nv 170.268961 146.312182 230.673465\nv 171.053269 146.419683 230.539176\nv 170.257301 146.603858 229.698913\nv 168.636011 146.105733 230.853108\nv 167.813931 146.005254 230.913092\nv 168.609326 145.855992 231.682663\nv 168.919910 145.583339 232.649590\nv 169.694554 145.450991 233.307077\nv 170.206050 145.824124 232.280166\nv 167.673574 146.451625 229.365548\nv 168.656804 146.375676 229.958370\nv 168.489763 146.572306 229.240381\nv 167.273376 145.444811 232.544154\nv 166.618593 145.648701 231.649846\nv 165.794047 146.260551 229.272346\nv 167.000661 146.382644 229.346755\nv 166.299919 146.526161 228.573151\nv 164.466829 145.190669 232.235272\nv 163.323247 145.040680 232.203597\nv 164.463875 144.956107 232.950654\nv 163.327235 146.118287 228.657568\nv 164.248515 146.103345 229.131403\nv 164.172025 146.419010 228.024908\nv 161.521776 145.190184 230.849814\nv 162.230870 145.072539 231.583391\nv 162.617107 145.392888 230.754639\nv 161.539743 146.325219 227.036184\nv 162.420133 146.313572 227.534174\nv 162.370356 146.445598 227.053082\nv 160.046891 145.763499 228.144037\nv 159.254156 145.675061 227.971746\nv 159.372238 145.482909 228.701773\nv 160.285935 145.387103 229.562019\nv 161.157455 145.356696 230.135519\nv 161.036493 145.540940 229.447563\nv 159.930430 146.183916 226.616782\nv 160.709388 146.206448 226.984550\nv 160.711009 146.434713 226.187322\nv 158.494715 145.108023 229.423781\nv 157.452291 145.156684 228.609683\nv 157.950356 145.929358 226.276048\nv 159.005118 146.044129 226.533680\nv 158.877289 146.297410 225.561921\nv 155.346143 145.481840 226.044542\nv 155.355845 145.267245 226.802177\nv 155.524068 145.001796 227.831103\nv 155.559199 144.765195 228.668954\nv 156.289948 145.155498 227.852032\nv 153.599933 144.742964 227.284094\nv 151.911966 144.754755 225.932724\nv 152.231605 145.531634 223.415629\nv 152.880487 145.632418 223.596133\nv 152.308346 145.791303 222.552442\nv 153.055159 146.149737 221.841614\nv 153.795640 146.090497 222.694602\nv 153.893571 146.348146 221.803270\nv 149.624433 144.621593 224.388844\nv 150.672317 145.282151 222.953221\nv 149.752524 145.116659 222.708474\nv 148.812729 145.115406 221.793828\nv 150.689813 145.746527 221.257721\nv 150.739673 145.525027 222.127191\nv 151.609606 145.912019 221.502469\nv 147.557390 144.602718 222.449227\nv 149.028507 145.377162 221.039404\nv 146.775982 145.225195 219.285673\nv 147.524779 145.409343 219.371297\nv 147.503468 145.621222 218.550165\nv 147.053248 144.673738 221.650024\nv 145.984815 145.445187 217.505206\nv 146.010761 145.246111 218.351749\nv 146.728726 145.636150 217.617997\nv 144.523008 144.370843 219.999155\nv 146.019546 145.010283 219.253678\nv 143.761597 144.330647 219.318348\nv 145.258174 145.265490 217.395313\nv 144.505548 145.179139 216.846532\nv 143.761597 145.121283 216.167147\nv 144.505548 145.417975 215.872283\nv 179.953081 147.400811 228.586220\nv 178.228902 147.374446 228.573543\nv 179.112055 147.382483 228.600044\nv 177.482689 147.954259 226.352140\nv 178.169377 148.153119 225.683850\nv 177.381416 148.149638 225.615860\nv 177.532013 147.365139 228.537234\nv 176.635836 147.350012 228.489219\nv 177.183274 147.153747 229.269199\nv 175.204604 147.725163 226.892790\nv 176.112162 147.738533 226.982215\nv 175.787171 147.937408 226.194724\nv 174.263998 147.268619 228.395556\nv 175.014818 147.297295 228.427617\nv 174.778775 147.497612 227.648220\nv 173.187518 147.655789 226.732437\nv 174.453785 147.696487 226.860729\nv 173.613347 147.883340 225.977007\nv 170.746794 147.411970 227.011934\nv 171.658887 147.304887 227.661720\nv 171.580938 147.494633 226.932001\nv 170.564412 147.798045 225.519029\nv 171.507962 147.722178 226.065465\nv 171.403530 147.918509 225.302280\nv 168.891270 147.334348 226.701283\nv 169.832861 147.369544 226.879695\nv 169.727255 147.566519 226.103803\nv 168.665204 147.735255 225.120844\nv 169.622822 147.762849 225.340618\nv 169.502361 147.966782 224.536071\nv 166.997976 147.247975 226.317340\nv 167.954195 147.283939 226.547466\nv 167.829445 147.495359 225.695265\nv 166.747991 147.671117 224.614995\nv 167.708985 147.699292 224.890718\nv 167.583750 147.911013 224.040574\nv 164.895964 147.107547 225.914927\nv 165.964676 147.145679 226.241113\nv 165.804514 147.421262 225.138953\nv 164.586001 147.654051 223.708841\nv 165.679279 147.632984 224.288809\nv 165.529478 147.903905 223.184883\nv 162.782796 147.078160 224.999707\nv 163.835358 147.129746 225.334880\nv 163.683240 147.331544 224.477594\nv 162.496501 147.484283 223.280154\nv 163.533439 147.602465 223.373668\nv 163.399262 147.806789 222.511401\nv 160.647522 147.058224 223.864464\nv 160.684323 146.878858 224.575398\nv 161.322508 147.042643 224.330377\nv 160.198606 147.577062 221.567480\nv 161.275053 147.537900 222.358089\nv 161.285877 147.727769 221.627277\nv 158.242867 147.000824 222.535460\nv 157.366381 146.942733 222.140800\nv 157.266796 146.719586 222.947855\nv 159.076310 146.836059 223.726000\nv 160.098560 147.140817 223.203888\nv 159.165532 147.082436 222.820403\nv 158.387863 147.436902 220.926900\nv 159.275941 147.495450 221.282537\nv 159.321352 147.708382 220.481032\nv 155.625157 146.699175 221.807033\nv 156.474298 146.857048 221.847604\nv 155.709145 146.894728 221.101444\nv 155.155938 147.296704 219.059454\nv 155.980379 147.341287 219.531493\nv 155.861186 147.505819 218.780672\nv 154.747028 146.512880 221.858565\nv 154.006547 146.572120 221.005577\nv 150.732162 146.187616 219.575584\nv 150.735237 145.973626 220.460465\nv 152.406277 146.048952 221.661110\nv 152.356418 146.270452 220.791641\nv 152.325988 147.345525 216.321335\nv 152.346337 147.130123 217.258940\nv 153.158451 147.491723 216.497826\nv 149.042119 146.219468 217.748320\nv 148.222969 145.994017 217.816725\nv 149.071415 146.030821 218.567383\nv 150.483154 147.342427 214.454529\nv 150.634556 147.197930 215.302943\nv 151.303312 147.526312 214.529063\nv 147.474173 145.809870 217.731102\nv 147.448227 146.008945 216.884558\nv 147.964479 146.686632 214.576137\nv 147.241675 146.511942 214.486542\nv 147.383541 146.382382 215.208737\nv 148.219851 147.093296 213.044178\nv 148.891573 147.117585 213.710404\nv 149.288810 147.394689 212.900639\nv 145.313875 146.076182 214.021973\nv 145.956194 146.026739 215.041498\nv 146.018418 146.257135 214.099616\nv 163.345047 153.974405 180.163431\nv 164.202257 154.083876 179.733519\nv 163.295303 154.007078 179.161120\nv 167.014265 154.367450 179.393878\nv 166.012231 154.251989 180.105366\nv 167.080410 154.336137 180.350172\nv 168.095897 154.483234 178.899214\nv 169.004964 154.536930 179.292361\nv 169.018417 154.568566 178.552891\nv 167.945240 154.327980 182.138113\nv 168.846103 154.369345 182.707083\nv 168.923648 154.424685 181.689689\nv 170.901431 154.616782 180.442984\nv 170.946743 154.586722 181.129666\nv 171.913623 154.658264 180.923258\nv 170.891723 154.547127 181.934300\nv 170.945061 154.515822 182.614987\nv 172.012273 154.596899 182.290627\nv 172.690582 154.632384 182.256912\nv 172.743920 154.601079 182.937599\nv 172.797673 154.681614 181.376462\nv 172.752361 154.711674 180.689781\nv 174.322622 154.651162 183.310517\nv 173.579737 154.599038 183.771158\nv 174.480130 154.613637 184.177791\nv 175.218079 154.711195 182.840330\nv 174.317685 154.696597 182.433698\nv 174.424776 154.745827 181.553248\nv 175.421424 154.812727 181.005536\nv 174.633058 154.801924 180.595273\nv 181.756763 154.734514 184.370985\nv 180.717655 154.861589 182.013986\nv 179.948101 154.889023 181.336563\nv 179.492624 154.748814 183.879532\nv 178.756803 154.902936 180.824527\nv 179.413336 154.836108 182.212353\nv 177.440336 154.844668 181.490233\nv 177.851239 154.887999 180.845588\nv 177.069537 154.882645 180.635504\nv 177.672327 154.759702 183.168415\nv 176.838811 154.718326 183.623171\nv 176.931217 154.636394 185.052619\nv 176.147684 154.613885 185.050144\nv 176.179577 154.577353 185.623274\nv 165.551938 154.391225 171.514756\nv 166.625388 154.493755 171.868244\nv 166.617735 154.494369 171.114707\nv 167.386676 154.543855 174.279961\nv 166.736242 154.491734 173.553488\nv 166.204760 154.437109 174.510770\nv 167.804672 154.597689 172.395437\nv 168.761548 154.672546 172.517093\nv 168.648061 154.671755 171.589851\nv 169.798617 154.727975 174.441253\nv 168.957253 154.668378 174.363736\nv 169.025379 154.659856 175.233584\nv 169.667714 154.741555 172.641456\nv 170.647065 154.801148 173.408978\nv 170.584289 154.806206 172.479029\nv 171.710545 154.819137 176.022724\nv 170.775339 154.777065 175.242901\nv 170.801950 154.761525 176.090924\nv 171.623787 154.850239 174.210626\nv 172.591311 154.895910 174.580410\nv 172.531165 154.911472 173.616336\nv 173.601808 154.905026 176.459201\nv 172.665483 154.868284 176.047076\nv 172.673482 154.840339 177.282872\nv 173.546249 154.945058 174.604762\nv 174.551442 154.971436 175.235050\nv 174.503882 154.983522 174.616408\nv 173.682799 154.833391 178.912994\nv 174.422408 154.850525 179.375805\nv 174.349417 154.894214 178.157809\nv 176.229240 154.971214 177.620448\nv 175.394493 154.944348 177.696836\nv 175.923774 154.938213 178.544233\nv 175.604517 154.993625 176.009873\nv 176.559510 155.020657 176.003718\nv 176.464069 155.036933 175.240541\nv 177.735071 154.983064 178.466589\nv 177.119481 154.945527 179.229353\nv 178.096030 154.963513 179.228096\nv 177.673920 155.047062 176.060393\nv 178.622055 155.064127 176.029640\nv 178.367196 155.081030 175.203634\nv 179.001594 154.978451 179.207035\nv 180.207652 154.988193 179.133514\nv 179.917678 155.010792 178.391811\nv 179.259052 155.110820 174.641056\nv 180.255203 155.107946 175.114811\nv 180.410259 155.063193 176.914960\nv 180.388373 155.034960 177.721040\nv 179.173771 155.110362 168.389779\nv 179.640499 155.123863 169.262287\nv 178.929418 155.121562 171.522245\nv 177.950230 155.104199 171.192642\nv 178.043814 155.107339 172.076705\nv 176.843086 155.076186 169.533099\nv 177.787408 155.096015 169.598659\nv 177.734679 155.092906 169.074610\nv 176.980220 155.084635 170.902125\nv 176.009928 155.055557 170.529262\nv 176.094334 155.060897 171.374238\nv 174.932641 155.008875 168.241310\nv 175.868862 155.043598 169.017952\nv 175.854137 155.038354 168.232409\nv 175.035704 155.022968 170.014114\nv 174.086314 154.982630 169.679490\nv 174.174652 154.991480 170.666751\nv 173.182667 154.943990 169.763913\nv 172.247158 154.890704 169.339647\nv 172.289754 154.897856 169.907861\nv 171.360677 154.834035 168.627798\nv 170.449252 154.764377 167.938233\nv 170.442820 154.774912 168.794030\nv 170.480742 154.750468 167.082309\nv 169.562886 154.691345 167.248541\nv 169.647627 154.659165 165.506667\nv 170.510793 154.739952 166.264993\nv 169.054995 154.652193 167.204960\nv 168.583295 154.591674 166.323604\nv 168.043913 154.566432 167.135947\nv 168.636546 154.573404 165.437654\nv 167.530940 154.522213 167.094422\nv 168.002640 154.582731 167.975778\nv 167.676098 154.492372 165.409417\nv 166.556270 154.404358 166.127858\nv 164.915270 154.310179 168.473455\nv 164.912845 154.292289 167.631249\nv 178.983235 152.034806 207.669864\nv 179.731835 152.176386 206.844938\nv 177.177404 152.009542 207.587156\nv 178.090829 152.025886 207.611739\nv 177.913884 152.158848 206.773175\nv 176.533134 152.463326 204.619216\nv 177.568888 152.410763 205.115441\nv 177.446572 152.485967 204.612949\nv 175.380411 151.958307 207.541208\nv 176.268692 151.985761 207.556072\nv 176.112178 152.115051 206.733728\nv 174.782034 152.439313 204.365146\nv 175.671054 152.431319 204.628868\nv 175.521799 152.546523 203.853002\nv 173.684221 151.916798 207.321586\nv 174.545107 151.919208 207.548826\nv 174.363011 152.085187 206.491624\nv 173.149065 152.391965 204.162211\nv 173.975459 152.395561 204.402258\nv 173.806386 152.550921 203.349234\nv 171.847845 152.017473 206.096502\nv 172.731287 151.993457 206.570689\nv 172.618683 152.106792 205.790197\nv 171.423328 152.449593 203.123616\nv 172.253659 152.444967 203.485048\nv 172.149661 152.551952 202.747754\nv 170.208661 151.942092 205.888391\nv 171.005665 151.996203 205.882096\nv 170.938237 152.076697 205.322305\nv 169.809541 152.405235 202.663018\nv 170.614163 152.424294 202.920096\nv 170.514708 152.537520 202.129244\nv 168.495428 151.965319 204.872389\nv 169.342563 151.958890 205.346578\nv 169.294098 152.029015 204.854410\nv 168.198616 152.365829 202.047445\nv 168.999909 152.385276 202.364431\nv 168.908793 152.499016 201.555181\nv 166.885266 151.855556 204.647078\nv 167.692727 151.887467 204.909674\nv 167.639502 152.003534 204.117625\nv 166.623348 152.298812 201.516888\nv 167.404061 152.335060 201.767608\nv 167.326788 152.443322 200.987475\nv 165.028841 152.154465 201.382724\nv 165.821086 152.224254 201.469356\nv 165.753830 152.337286 200.650123\nv 163.242303 152.120228 200.187236\nv 164.138740 152.132915 200.833885\nv 164.065148 152.254810 199.916843\nv 161.615586 151.695831 201.718304\nv 161.120793 151.664350 201.488262\nv 161.171359 151.553195 202.308797\nv 162.257629 152.234413 198.451199\nv 161.365494 152.162041 198.138693\nv 159.580431 151.815199 198.839064\nv 158.670368 151.565240 199.644410\nv 160.433762 152.112363 197.533722\nv 160.402390 152.213066 196.711348\nv 159.528011 152.024309 197.204186\nv 160.491115 151.973284 198.631531\nv 158.713850 151.434827 200.628282\nv 157.630425 151.293806 200.461125\nv 158.605019 151.304944 201.452154\nv 156.906363 151.404606 198.757127\nv 156.902778 151.298507 199.544872\nv 157.739323 151.743750 197.250612\nv 158.645801 151.887610 197.233011\nv 155.609580 150.974832 200.272509\nv 154.762722 150.838966 200.172243\nv 156.855151 151.688247 196.532315\nv 156.862255 151.580383 197.343465\nv 155.131835 151.317109 197.043482\nv 155.156480 151.488890 195.696598\nv 154.310232 151.281120 196.114911\nv 156.004795 151.646356 195.708774\nv 155.183192 151.610367 194.780203\nv 153.486142 151.158470 195.822093\nv 153.461496 150.986689 197.168976\nv 154.276224 151.523477 194.072073\nv 153.414327 151.356315 194.045041\nv 153.472980 151.285739 194.740994\nv 151.787950 150.659961 197.120865\nv 150.950407 150.619239 195.987538\nv 151.580018 151.295427 191.072338\nv 151.620056 151.198866 192.134553\nv 152.472564 151.438644 191.535053\nv 150.116338 150.499905 195.432095\nv 149.298005 150.323991 195.384094\nv 151.688155 151.117636 193.028897\nv 150.795610 150.974419 192.566182\nv 149.768355 150.958268 190.439035\nv 149.830969 150.883233 191.328035\nv 150.664897 151.130684 190.782838\nv 148.552905 150.343143 193.630842\nv 147.955884 150.289689 192.780565\nv 147.400829 150.059467 193.706210\nv 149.917735 150.814507 192.188518\nv 149.021194 150.642091 191.844714\nv 147.938173 150.619604 189.421147\nv 147.996563 150.552741 190.222225\nv 148.876037 150.777680 190.183153\nv 147.932073 150.457537 191.055367\nv 146.994209 150.299462 190.293360\nv 147.960603 150.709519 188.514468\nv 146.309063 150.488060 185.974174\nv 143.761597 149.549080 189.074696\nv 146.309015 150.552628 184.982515\nv 181.560578 153.572287 197.099918\nv 180.758490 153.627630 196.647847\nv 180.774664 153.769895 195.324152\nv 180.807216 153.862832 194.442615\nv 179.910352 153.723204 195.734005\nv 177.968765 153.972408 193.112034\nv 178.874956 153.954433 193.417557\nv 176.630564 153.576709 196.483508\nv 177.463320 153.571049 196.722611\nv 177.408031 153.663539 195.896236\nv 176.379757 153.868851 193.717392\nv 177.317356 153.823893 194.355220\nv 177.229759 153.888592 193.720474\nv 175.015387 153.585783 195.954650\nv 175.829813 153.591354 196.154393\nv 175.760848 153.663628 195.457389\nv 174.730029 153.850224 193.349445\nv 175.574711 153.838612 193.747759\nv 175.447477 153.945162 192.684331\nv 173.408913 153.590264 195.289250\nv 174.218517 153.587195 195.649448\nv 174.136818 153.661126 194.897448\nv 173.073580 153.875406 192.383488\nv 173.876300 153.881071 192.689883\nv 173.800074 153.951108 191.979622\nv 171.938238 153.530959 195.130665\nv 172.656929 153.575529 195.063234\nv 172.608523 153.619626 194.604682\nv 171.505153 153.877515 191.480360\nv 172.314347 153.861304 192.113097\nv 172.188160 153.961654 191.040489\nv 170.378851 153.538405 194.121209\nv 171.180798 153.525182 194.741310\nv 171.087886 153.588279 194.052013\nv 169.993846 153.800474 191.260867\nv 170.736786 153.855271 191.205885\nv 170.636027 153.923067 190.462734\nv 168.715813 153.433264 193.970035\nv 169.690725 153.494437 194.075628\nv 169.311027 153.540329 193.326319\nv 168.326231 153.604276 191.943724\nv 167.418655 153.555937 191.644040\nv 167.428539 153.430818 192.921042\nv 166.415499 153.277971 193.545224\nv 165.664239 153.286528 192.765714\nv 165.558776 153.182020 193.689580\nv 165.829831 153.471859 190.991087\nv 165.730770 153.375162 191.897047\nv 166.620023 153.479177 191.715398\nv 166.890788 153.685315 189.834187\nv 166.149713 153.685035 189.061341\nv 165.978010 153.575594 190.036592\nv 165.383432 153.674731 188.304869\nv 166.296211 153.784452 188.102463\nv 164.874046 153.279211 192.041404\nv 163.980545 153.238721 191.435288\nv 163.914014 153.150087 192.303954\nv 164.136987 153.341862 190.488734\nv 165.088756 153.471579 190.218242\nv 163.833191 153.622211 186.848247\nv 164.597884 153.650044 187.600005\nv 164.765237 153.746314 186.594232\nv 163.176955 153.212738 190.751284\nv 162.677154 153.217465 190.033209\nv 162.520712 153.114324 190.979763\nv 163.139559 153.575367 186.416810\nv 162.972205 153.479097 187.422583\nv 162.073521 153.192474 189.489916\nv 161.461986 153.142821 189.154249\nv 161.409376 153.069398 189.926020\nv 160.772432 153.247054 186.803334\nv 161.518595 153.301333 187.361755\nv 161.532410 153.377975 186.432724\nv 160.778229 153.095078 188.661359\nv 160.127283 153.063537 187.962901\nv 160.146894 152.988203 188.891895\nv 159.432279 153.004271 187.479963\nv 158.758732 152.932218 187.126878\nv 158.822400 152.884609 187.840352\nv 160.778661 153.381129 185.020169\nv 160.031997 153.279567 184.947793\nv 160.039582 153.222133 185.801927\nv 157.993047 152.859443 186.536523\nv 157.154778 152.753213 186.173085\nv 157.310583 152.706326 187.123829\nv 156.201286 152.734234 184.136031\nv 156.996347 152.840077 184.562261\nv 156.942952 152.896292 183.583948\nv 156.363498 152.639057 185.937368\nv 155.449087 152.507150 185.574956\nv 155.557904 152.468188 186.397980\nv 154.630361 152.368907 185.484875\nv 153.802209 152.255499 184.847718\nv 153.815341 152.222873 185.398411\nv 156.109924 152.839927 182.168692\nv 155.245642 152.737253 181.221297\nv 155.283611 152.687776 182.210323\nv 153.623695 152.453353 180.750751\nv 153.606585 152.421816 181.289703\nv 154.436439 152.616639 180.723976\nv 152.252123 152.018972 183.732371\nv 152.325892 152.083191 182.835746\nv 151.687213 151.915914 183.529246\nv 152.842322 152.222390 182.177675\nv 153.655066 152.385675 182.150899\nv 152.116386 152.200541 179.560249\nv 152.094876 152.151769 180.449396\nv 152.815351 152.307303 180.427331\nv 151.120577 151.838689 182.802322\nv 151.411992 151.936494 182.017271\nv 150.771587 151.795050 182.186972\nv 151.928422 152.075693 181.359200\nv 151.229457 151.968931 180.492117\nv 150.991192 152.024306 177.764876\nv 150.788470 151.941757 178.678481\nv 151.598633 152.127555 178.668708\nv 148.819532 151.431830 180.329337\nv 148.630021 151.354285 181.239167\nv 150.574197 151.860293 179.616034\nv 149.966756 151.757045 178.712201\nv 149.499383 151.708238 176.562955\nv 149.273477 151.629431 177.530980\nv 150.406935 151.917315 176.806623\nv 148.936273 151.493566 179.382354\nv 148.003322 151.249815 180.061936\nv 149.150546 151.575030 178.444801\nv 148.242994 151.365953 178.201133\nv 147.800105 151.313060 175.536698\nv 147.673761 151.261988 176.415665\nv 148.492269 151.471426 176.408345\nv 146.141437 150.887823 174.960654\nv 146.163935 150.885855 175.559650\nv 146.959099 151.105590 174.945022\nv 145.332192 150.669222 174.511816\nv 144.539854 150.448681 174.687703\nv 144.539854 150.453579 173.567323\nv 143.761597 150.231903 174.806675\nv 180.142090 152.938385 201.909582\nv 179.984889 152.811313 202.816172\nv 180.824360 152.868618 202.417509\nv 178.918810 153.180737 199.988241\nv 177.958230 153.119923 200.325066\nv 179.675758 153.183057 200.056725\nv 178.285211 153.336770 198.730667\nv 179.049222 153.255311 199.435022\nv 177.183388 153.060911 200.640886\nv 177.517432 153.193980 199.682358\nv 176.743945 153.358956 198.282111\nv 177.540092 153.327122 198.674567\nv 177.482000 153.452384 197.702339\nv 175.889037 152.875676 201.736639\nv 176.850204 152.880616 201.909315\nv 176.663017 152.981915 201.110917\nv 175.284092 153.258852 198.673304\nv 176.067466 153.214169 199.215125\nv 176.018663 153.278377 198.712517\nv 174.243477 152.868205 201.332208\nv 175.034710 152.876816 201.506953\nv 174.910617 152.968364 200.763495\nv 173.777782 153.235296 198.351083\nv 174.556246 153.230761 198.650078\nv 174.456825 153.327596 197.871700\nv 172.628633 152.856911 200.820236\nv 173.426997 152.865772 201.057901\nv 173.321019 152.950891 200.351085\nv 172.270651 153.178738 198.168528\nv 173.034346 153.190417 198.400433\nv 172.914665 153.320452 197.340801\nv 171.010549 152.853796 200.103022\nv 171.817393 152.852019 200.494752\nv 171.715810 152.943807 199.721691\nv 170.688203 153.214096 197.105892\nv 171.455865 153.216120 197.483564\nv 171.383308 153.306749 196.731224\nv 169.450166 152.782703 199.817957\nv 170.211890 152.834556 199.828801\nv 170.147241 152.893730 199.319117\nv 169.199207 153.172663 196.561184\nv 169.931831 153.190204 196.860051\nv 169.883021 153.287183 196.054685\nv 167.852808 152.791229 198.737943\nv 168.631112 152.785943 199.279000\nv 168.607213 152.847163 198.767216\nv 167.736077 153.164931 195.604313\nv 168.456991 153.158496 196.182237\nv 168.429481 153.276076 195.177894\nv 166.365324 152.703101 198.374612\nv 167.107836 152.731698 198.688452\nv 167.086398 152.823853 197.912319\nv 164.778324 152.602785 197.878770\nv 163.918477 152.587980 197.233667\nv 163.952257 152.460670 198.310999\nv 164.720642 152.856745 195.715472\nv 165.532529 152.856877 196.417214\nv 165.508626 152.983526 195.331248\nv 163.831926 152.902534 194.465859\nv 162.994157 152.725845 195.154063\nv 163.858971 152.806705 195.317710\nv 164.752128 153.086986 193.769788\nv 163.887314 153.006126 193.606141\nv 162.993812 152.965636 193.000025\nv 161.242615 152.418380 195.926492\nv 160.336864 152.330325 195.596957\nv 160.214463 152.501215 193.938308\nv 160.288053 152.416630 194.776868\nv 160.973688 152.787813 192.288552\nv 162.025211 152.907202 192.416410\nv 161.968989 152.990208 191.569981\nv 159.447827 152.211317 195.561724\nv 158.542456 152.166885 194.761147\nv 158.591267 152.080580 195.581235\nv 160.045456 152.662293 192.228747\nv 160.101678 152.579288 193.075176\nv 158.429671 152.244958 193.898014\nv 158.330931 152.318418 193.061297\nv 157.587156 152.109609 193.943941\nv 159.932550 152.734995 191.377630\nv 160.857653 152.945282 190.516238\nv 159.872737 152.809458 190.451745\nv 157.374722 152.252896 192.251776\nv 156.521030 152.144398 191.928181\nv 156.634725 152.074570 192.783629\nv 158.732772 152.658252 190.354588\nv 157.749787 152.570737 189.656339\nv 157.964649 152.511655 190.614888\nv 155.710285 152.018924 191.803691\nv 154.834059 151.940078 190.990222\nv 154.904807 151.887226 191.646566\nv 156.848449 152.473742 189.143144\nv 156.181536 152.379678 188.909896\nv 156.314751 152.330075 189.683392\nv 154.105650 151.873320 190.293645\nv 153.307623 151.736733 190.113516\nv 153.230554 151.671793 190.652967\nv 152.530254 151.637412 189.520270\nv 152.043658 151.606326 188.723197\nv 151.945930 151.504120 189.675765\nv 154.685154 152.270661 186.996357\nv 153.729472 152.137144 186.349261\nv 153.771132 152.071525 187.310049\nv 152.266700 151.932166 185.180628\nv 152.180831 151.846436 186.131478\nv 152.901319 152.023737 185.712103\nv 151.030809 151.339377 189.386265\nv 150.403212 151.232554 189.038793\nv 152.140223 151.769017 187.009365\nv 151.505604 151.677446 186.477890\nv 150.928990 151.711306 184.263984\nv 150.895374 151.662891 184.851049\nv 151.579828 151.803280 185.012937\nv 150.185535 151.326794 187.264822\nv 149.476259 151.196195 186.877368\nv 149.494865 151.128789 187.796293\nv 150.856571 151.574533 185.972950\nv 150.205732 151.482559 185.223996\nv 149.690064 151.486224 183.382205\nv 149.572245 151.423061 183.947242\nv 150.362354 151.634081 183.537060\nv 149.529572 151.354367 184.829860\nv 148.857282 151.206511 184.675006\nv 148.466552 151.269843 182.002541\nv 148.229799 151.147200 183.164027\nv 149.136708 151.397848 182.630901\nv 147.212689 150.787197 184.969388\nv 148.078148 151.064587 183.935251\nv 147.407991 150.936583 183.306891\nv 147.220341 151.014097 180.996826\nv 147.723111 151.103637 181.772293\nv 147.262773 151.052877 180.437553\nv 146.596534 150.878895 180.425461\nv 145.936472 150.699349 180.434999\nv 145.894040 150.660568 180.994272\nv 144.551249 150.215832 182.648809\nv 143.761597 150.029522 182.049877\nv 143.761597 150.099575 180.555927\nv 153.614140 152.620347 170.207291\nv 153.343626 152.534040 168.964141\nv 152.298652 152.339871 169.463265\nv 152.767966 152.406299 168.194281\nv 151.997824 152.224002 167.532950\nv 154.207193 152.635296 166.005696\nv 151.254624 152.087419 168.226676\nv 152.647287 152.143370 162.497674\nv 153.450436 152.601098 171.011335\nv 152.625595 152.441170 171.652114\nv 153.506865 152.616090 171.957034\nv 154.495410 152.795267 170.512211\nv 155.757920 152.991481 168.122621\nv 157.438656 153.283827 168.256235\nv 158.302159 153.398845 167.368143\nv 153.308215 152.582394 172.749712\nv 154.133056 152.742322 172.108932\nv 155.367967 152.963379 171.602494\nv 155.169317 152.929683 172.395172\nv 155.623571 153.010826 174.156411\nv 155.130261 152.923068 173.339713\nv 154.427716 152.796384 173.718308\nv 156.532914 153.148652 169.087387\nv 157.412443 153.298408 169.163371\nv 156.365172 153.144125 172.833274\nv 158.952140 153.569520 171.714514\nv 158.998935 153.574210 170.820654\nv 157.175463 153.275483 173.732873\nv 157.098244 153.256339 174.580897\nv 157.947591 153.394313 174.535954\nv 158.714640 153.511722 174.340929\nv 159.490802 153.632956 174.123480\nv 160.175135 153.720639 174.807412\nv 160.113379 153.698048 175.527507\nv 160.884044 153.808700 175.340992\nv 160.787738 153.765460 176.813979\nv 160.062370 153.678143 176.304274\nv 160.027820 153.657493 177.057166\nv 160.261467 153.743608 173.936964\nv 161.060182 153.864466 173.690092\nv 161.469379 153.812197 178.322187\nv 161.470632 153.836229 177.532969\nv 160.751935 153.720778 178.356088\nv 159.077254 153.442297 164.943136\nv 158.303899 153.335369 165.424890\nv 159.077907 153.480063 165.905829\nv 160.677493 153.739521 166.489557\nv 160.725993 153.761748 167.276618\nv 159.879918 153.612909 166.234357\nv 159.106563 153.505980 166.716111\nv 160.768007 153.786916 168.111599\nv 161.589955 153.903059 168.303383\nv 162.527165 154.025306 168.395411\nv 160.814549 153.805303 168.906385\nv 163.482879 154.146972 168.487392\nv 162.592211 154.043112 169.190150\nv 160.581942 153.805539 171.199774\nv 161.293959 153.907008 171.840250\nv 163.929011 154.198587 168.469969\nv 164.534183 154.276370 169.285617\nv 163.863966 154.180781 167.675230\nv 164.546105 154.278309 170.021675\nv 165.532364 154.389901 170.025161\nv 162.538198 154.051304 171.012672\nv 161.955436 153.986508 171.601148\nv 165.556958 154.387799 173.026295\nv 164.677295 154.297947 172.625456\nv 164.674663 154.295135 173.383457\nv 163.238937 154.095292 175.770455\nv 163.116579 154.045745 177.145179\nv 163.170295 154.022098 178.115138\nv 164.098798 154.140196 177.761249\nv 165.099043 154.167253 179.942451\nv 165.049300 154.199925 178.940140\nv 181.353397 154.387018 189.039517\nv 180.700049 154.415079 188.685389\nv 179.730248 154.438398 188.273340\nv 179.887066 154.361846 189.260000\nv 179.365123 154.584597 186.377134\nv 179.483563 154.506163 187.377609\nv 178.509243 154.576315 186.353057\nv 177.641865 154.181948 190.963785\nv 178.334816 154.282849 189.983418\nv 176.908438 154.418541 187.922760\nv 177.783835 154.445212 187.832420\nv 177.548497 154.494025 187.146830\nv 175.991153 154.163645 190.718648\nv 176.785227 154.190038 190.670552\nv 176.719484 154.236320 190.109900\nv 175.476863 154.412881 187.448102\nv 176.112586 154.409966 187.739244\nv 176.037377 154.470269 186.946027\nv 174.306278 154.190336 189.707462\nv 175.152324 154.181422 190.188019\nv 175.079364 154.218841 189.677439\nv 173.955358 154.417798 186.614772\nv 174.720041 154.408963 187.126176\nv 174.636971 154.482019 186.143480\nv 172.775718 154.137782 189.485131\nv 173.545830 154.154202 189.727770\nv 173.463206 154.211335 188.954242\nv 172.452620 154.358928 186.418042\nv 173.201580 154.397827 186.403807\nv 173.123326 154.451954 185.646311\nv 171.218888 154.111983 188.735919\nv 171.990918 154.127691 189.092868\nv 171.921064 154.179207 188.354654\nv 170.965246 154.300789 186.027162\nv 171.691878 154.340339 186.082951\nv 171.647734 154.373504 185.604758\nv 169.686761 154.064617 188.037092\nv 170.453057 154.084921 188.441544\nv 170.382739 154.143195 187.593253\nv 169.090321 153.994047 188.339744\nv 168.339467 153.958824 188.023869\nv 167.813346 153.829980 189.174811\nv 168.423738 154.102116 186.225251\nv 168.496477 154.043284 187.093149\nv 169.543704 154.181723 186.320904\nv 169.567748 154.304788 184.655107\nv 168.657835 154.239854 184.544253\nv 168.561052 154.175623 185.342152\nv 167.759417 154.191665 184.193402\nv 168.766113 154.320830 183.506357\nv 167.219502 153.879217 187.928216\nv 166.453221 153.868912 187.171743\nv 166.728814 154.020125 185.324140\nv 166.591501 153.946619 186.207238\nv 167.513825 154.037183 186.114397\nv 166.919339 154.180198 183.199236\nv 166.811061 154.099222 184.237132\nv 165.668210 153.851854 186.381485\nv 164.903517 153.824021 185.629727\nv 166.024680 154.154216 182.152313\nv 165.137024 154.087115 181.755715\nv 165.083327 154.020655 182.846367\nv 162.495872 153.774576 182.028336\nv 163.329327 153.826642 182.880139\nv 163.362218 153.901488 181.597966\nv 162.426537 153.614468 184.589312\nv 161.617029 153.569147 183.738272\nv 161.580585 153.483885 185.017075\nv 160.774931 153.485220 183.315519\nv 160.007913 153.406224 182.866654\nv 160.004059 153.359567 183.717170\nv 162.483428 153.873514 180.168597\nv 161.621663 153.760528 180.184876\nv 161.666998 153.736436 180.762442\nv 159.984679 153.570732 179.464560\nv 160.011954 153.534084 180.281267\nv 160.777958 153.660098 179.962013\nv 159.217348 153.420188 180.296358\nv 158.437474 153.300694 180.318588\nv 158.436146 153.276164 180.831132\nv 157.685472 153.199687 179.928952\nv 156.919018 153.104202 179.194629\nv 156.889818 153.061186 180.119040\nv 159.271107 153.543743 177.367000\nv 158.545924 153.447535 176.865500\nv 158.514579 153.421103 177.685038\nv 156.216616 153.072514 176.597649\nv 156.987872 153.181720 177.363159\nv 157.018140 153.215688 176.418029\nv 155.288457 152.806938 179.784870\nv 154.482472 152.681453 179.283694\nv 153.674128 152.535404 178.960274\nv 152.859676 152.389193 178.650623\nv 154.755798 152.838679 175.186604\nv 154.189257 152.740640 174.497086\nv 154.024029 152.695177 175.148683\nv 153.069756 152.526649 173.528489\nv 151.732706 152.246533 173.302075\nv 152.120438 152.317021 174.232751\nv 152.341922 152.316207 177.759083\nv 152.896096 152.442262 176.875237\nv 152.355528 152.336158 176.871258\nv 153.183595 152.529675 175.223289\nv 151.846545 152.249559 174.996874\nv 150.708114 152.016513 174.922467\nv 151.771271 152.229168 175.913005\nv 151.753246 152.252247 172.363425\nv 150.803928 152.042619 173.067686\nv 151.643145 152.219974 170.454213\nv 150.770796 152.031052 171.165524\nv 151.696817 152.237256 171.417726\nv 149.235299 151.676621 174.671985\nv 149.188606 151.676122 173.677231\nv 148.571921 151.521999 174.534623\nv 150.338226 151.939539 172.971815\nv 150.238305 151.914071 172.002304\nv 149.752063 151.805276 172.845083\nv 151.372631 152.133667 169.211063\nv 147.708590 151.313609 172.992939\nv 147.694098 151.303359 172.047528\nv 148.961957 151.602630 170.820552\nv 148.986392 151.594151 169.933648\nv 148.520680 151.492523 170.762142\nv 149.954389 151.812766 169.112647\nv 149.037507 151.589493 169.093033\nv 147.722402 151.284624 170.163107\nv 147.757747 151.267177 169.221990\nv 148.596230 151.479387 169.034623\nv 147.921478 151.228342 166.494026\nv 147.398068 151.074432 166.071065\nv 145.900428 150.637489 165.542413\nv 180.801519 149.828145 219.019900\nv 179.830509 149.872214 218.775848\nv 179.710500 150.064458 217.889424\nv 180.833740 150.204568 217.292534\nv 179.740021 150.248814 217.018842\nv 180.078702 150.549351 215.624020\nv 180.126779 150.731947 214.754090\nv 178.365886 150.274370 216.809072\nv 179.489127 150.414479 216.212183\nv 177.869837 150.540995 215.496573\nv 178.704567 150.574906 215.414251\nv 178.459412 150.675867 214.908410\nv 176.544551 150.016607 217.790326\nv 177.676169 149.975378 218.128840\nv 177.485163 150.149933 217.277217\nv 175.913673 150.726455 214.311596\nv 176.787651 150.599078 215.065720\nv 176.750703 150.769332 214.236608\nv 174.663987 150.000068 217.523720\nv 175.603755 150.012320 217.649944\nv 175.413776 150.178910 216.812479\nv 173.057478 150.611198 214.186909\nv 174.909506 150.693120 214.255427\nv 174.024697 150.814787 213.413966\nv 172.921687 149.956202 217.294494\nv 173.776612 149.981631 217.395092\nv 173.619083 150.141229 216.585656\nv 171.550724 150.541950 214.077777\nv 172.061871 150.569013 214.108690\nv 171.661521 150.705802 213.314534\nv 171.652078 149.911913 217.117674\nv 172.178037 149.932035 217.183557\nv 172.238199 150.095677 216.419175\nv 169.792329 150.433724 213.969974\nv 170.599477 150.486042 214.014022\nv 170.343226 150.626422 213.239573\nv 168.705069 149.795511 216.610080\nv 170.298734 149.874007 216.819032\nv 170.118575 149.997059 216.144339\nv 168.015129 150.298539 213.873044\nv 168.852908 150.364140 213.917375\nv 168.698300 150.508504 213.151193\nv 166.313235 149.742905 215.757149\nv 167.447597 149.742211 216.294123\nv 167.390549 149.919257 215.398413\nv 165.965292 150.369302 212.508512\nv 166.965683 150.331582 213.202896\nv 166.860130 150.480623 212.412477\nv 164.347075 149.544286 215.647519\nv 165.303607 149.651404 215.642172\nv 165.299656 149.812833 214.866787\nv 164.159256 150.187039 212.384015\nv 165.045340 150.272721 212.466788\nv 164.973655 150.432661 211.635320\nv 162.451384 149.605064 214.208777\nv 163.405243 149.576469 214.942311\nv 163.389266 149.734310 214.138600\nv 162.305007 150.188886 211.180318\nv 163.223754 150.212341 211.663982\nv 163.168823 150.323523 211.068883\nv 160.625029 149.380785 214.048412\nv 161.528284 149.482851 214.159869\nv 161.532152 149.660838 213.293610\nv 160.484574 150.049322 210.568343\nv 161.415852 150.093446 211.028584\nv 161.318797 150.255943 210.124978\nv 158.838703 149.446805 212.364365\nv 159.728226 149.390516 213.342991\nv 159.739374 149.615061 212.203527\nv 158.717028 149.816622 210.358630\nv 159.618685 149.941584 210.444819\nv 159.485862 150.086856 209.578549\nv 156.189053 149.443614 210.038618\nv 156.321985 149.310198 210.874402\nv 156.941974 149.563669 210.120240\nv 156.797136 149.847299 208.480226\nv 157.696624 149.829489 209.388408\nv 157.684718 149.979704 208.584179\nv 154.455022 149.162485 209.801885\nv 153.914288 149.239558 208.818541\nv 153.506593 149.005445 209.641857\nv 154.808195 149.059257 210.708991\nv 155.428184 149.312729 209.954828\nv 154.885279 149.647258 207.657301\nv 155.823973 149.697056 208.327282\nv 155.846536 149.947716 207.006016\nv 150.234392 148.330194 209.437475\nv 150.946789 148.416889 209.858234\nv 152.002737 148.655184 209.890697\nv 152.742017 148.870232 209.560378\nv 152.226580 148.867469 208.988833\nv 152.961652 149.625033 205.645876\nv 153.965817 149.682918 206.464793\nv 153.903677 149.840034 205.517118\nv 150.558772 148.748275 207.606645\nv 149.836284 148.591957 207.556891\nv 150.465893 148.900380 206.635018\nv 151.414602 148.943772 207.605514\nv 152.110617 149.439013 205.666044\nv 152.132342 149.638016 204.564024\nv 151.343447 149.294880 205.531868\nv 152.082733 149.773758 203.609470\nv 152.849903 149.917890 203.743647\nv 149.163440 148.452295 207.447386\nv 148.174523 148.230459 207.334968\nv 149.939001 149.235249 203.995523\nv 149.862093 149.361949 203.141010\nv 149.342477 149.075998 204.103788\nv 149.815558 149.491583 202.274303\nv 179.180288 149.076238 222.127756\nv 180.039039 148.542234 224.351564\nv 180.479277 148.276242 225.370611\nv 178.316826 149.049029 222.162638\nv 177.581501 148.938269 222.558282\nv 178.503459 148.855205 222.988233\nv 178.258330 149.159301 221.697806\nv 177.239708 149.306818 220.982776\nv 178.103171 149.334026 220.947894\nv 176.083266 148.547786 223.929126\nv 177.027420 148.548236 224.057635\nv 176.823981 148.743995 223.255368\nv 175.365427 149.290693 220.761808\nv 176.307707 149.296247 220.885980\nv 176.142269 149.475989 220.108691\nv 174.095052 148.520039 223.675347\nv 175.073494 148.536024 223.800728\nv 174.901385 148.727560 223.001477\nv 173.500145 149.248238 220.544045\nv 174.425489 149.267257 220.665660\nv 174.274644 149.451416 219.862905\nv 172.073189 148.460573 223.421874\nv 173.047111 148.492427 223.536470\nv 172.949020 148.679721 222.761500\nv 171.702944 149.178359 220.351450\nv 172.564282 149.205849 220.475756\nv 172.487962 149.404908 219.616984\nv 170.070297 148.578552 222.353146\nv 171.091356 148.521835 222.905277\nv 170.954038 148.704585 222.094773\nv 169.420347 149.228874 219.378701\nv 170.610840 149.226623 219.790170\nv 170.436131 149.379669 219.081210\nv 168.229867 148.436534 222.286415\nv 169.119230 148.543594 222.160556\nv 169.043616 148.654242 221.668501\nv 167.199958 149.069999 219.142129\nv 168.609926 149.184518 219.255708\nv 167.835672 149.267401 218.556162\nv 166.407751 148.515731 221.171752\nv 167.274174 148.423270 221.943241\nv 167.287829 148.639642 221.022871\nv 165.381163 148.876287 219.116751\nv 166.423555 148.942492 219.346983\nv 165.383312 149.086677 218.212351\nv 164.345088 148.481191 220.314441\nv 165.389158 148.518600 220.669068\nv 165.377336 148.694693 219.896756\nv 163.349070 148.806185 218.354762\nv 163.345243 148.624591 219.134767\nv 164.337093 148.838878 218.762125\nv 161.326736 148.372586 219.031336\nv 161.313038 148.155541 219.959056\nv 162.343523 148.374853 219.655125\nv 160.474192 148.692849 217.080806\nv 161.414731 148.770604 217.345032\nv 161.472552 148.948124 216.604662\nv 159.423944 148.115021 218.890948\nv 160.356311 148.334302 218.578222\nv 159.484004 148.296049 218.133903\nv 158.727793 148.657948 215.992514\nv 159.602470 148.670969 216.559999\nv 159.657335 148.857349 215.772951\nv 156.747426 147.783068 218.318080\nv 157.618632 147.813585 218.849670\nv 157.680431 148.046250 217.915039\nv 156.953816 148.619403 214.770788\nv 157.849082 148.644317 215.367704\nv 157.887391 148.819413 214.608550\nv 155.030466 147.655684 217.473232\nv 155.922985 147.738484 217.846041\nv 155.916706 147.932933 217.010640\nv 155.128687 148.374378 214.318154\nv 156.011538 148.441302 214.778926\nv 156.109274 148.727574 213.550861\nv 152.296408 147.544469 215.468849\nv 151.484293 147.182869 216.229963\nv 154.101493 147.563227 217.036631\nv 154.081144 147.778629 216.099026\nv 152.803146 148.177701 213.004227\nv 153.365251 148.333245 212.842602\nv 153.261474 148.490925 211.991977\nv 150.556221 147.544894 213.623757\nv 149.887465 147.216512 214.397637\nv 152.029417 147.845415 213.767751\nv 151.462227 148.419652 210.429780\nv 148.749844 147.560730 211.455933\nv 149.391593 147.587405 212.100079\nv 149.524348 147.777736 211.321600\nv 147.456353 147.189076 211.677645\nv 148.095092 147.221031 212.320028\nv 147.978350 147.338445 211.592030\nv 148.040372 147.900600 208.872188\nv 148.713217 148.040261 208.981693\nv 149.389661 148.339368 208.368128\nv 146.918177 147.623078 208.779817\nv 146.522337 147.668899 207.981625\nv 145.379234 147.908649 204.988196\nv 146.689692 148.342754 204.513585\nv 147.460856 148.610905 204.094285\nv 145.942427 148.042604 205.122544\nv 146.769558 148.197312 205.478917\nv 146.504090 148.705240 201.971219\nv 146.418763 148.840197 200.966655\nv 147.357658 148.841164 202.534700\nv 148.335229 148.963524 203.283944\nv 180.107560 150.881327 214.030665\nv 180.949174 150.937971 213.766878\nv 177.481278 151.405202 211.030092\nv 178.358345 151.345455 211.451136\nv 178.333913 151.444111 210.908214\nv 175.736655 151.373664 210.903417\nv 176.627614 151.362288 211.120839\nv 176.565888 151.515234 210.269748\nv 173.992571 151.446372 210.089083\nv 174.859130 151.421352 210.435359\nv 174.808369 151.551631 209.706050\nv 172.237128 151.494368 209.285958\nv 173.120353 151.461342 209.741513\nv 173.058584 151.609676 208.904219\nv 170.576945 151.425984 209.045814\nv 171.401716 151.483062 209.040282\nv 171.350589 151.585624 208.454196\nv 169.129475 150.942377 211.110108\nv 169.992011 150.898483 211.711061\nv 169.934932 150.996348 211.140045\nv 168.808262 151.483389 207.945516\nv 169.696466 151.457947 208.483556\nv 169.637613 151.553989 207.921689\nv 167.473927 150.841585 210.860111\nv 168.319411 150.875079 211.085440\nv 168.226912 151.006747 210.313763\nv 167.143433 151.357006 207.796557\nv 167.980638 151.399890 207.993158\nv 167.912204 151.536547 207.187048\nv 165.621594 150.880745 209.628385\nv 166.540872 150.869266 210.213047\nv 166.462151 150.984732 209.503772\nv 165.345628 151.406557 206.456998\nv 166.242805 151.381376 207.135295\nv 166.177822 151.518844 206.312150\nv 163.784781 150.861926 208.561424\nv 164.702029 150.860357 209.166056\nv 164.625625 150.997780 208.314479\nv 163.535337 151.410166 205.183020\nv 164.424486 151.417064 205.780642\nv 164.391496 151.537127 205.036231\nv 162.032064 150.661230 208.463521\nv 162.910440 150.760698 208.525159\nv 162.830002 150.899882 207.648209\nv 161.772194 151.216991 204.989036\nv 162.655020 151.307005 205.121143\nv 162.619521 151.440215 204.306502\nv 160.194942 150.561826 207.582896\nv 161.104653 150.627422 207.934359\nv 161.041916 150.734818 207.235108\nv 159.924020 151.030766 204.527809\nv 160.880095 151.117128 204.835128\nv 160.780620 151.263840 203.867076\nv 158.441848 150.468258 206.565417\nv 159.308545 150.506608 207.123379\nv 159.265508 150.630873 206.325683\nv 157.760340 150.807991 203.796866\nv 159.025516 150.957603 204.132157\nv 158.559369 151.027865 203.224466\nv 156.918459 150.429655 205.267591\nv 156.181570 150.424564 204.507150\nv 156.050297 150.272253 205.300308\nv 156.566016 150.627459 203.662288\nv 157.171962 150.730109 203.681804\nv 156.688246 150.775603 202.869660\nv 155.110625 150.082540 205.437950\nv 154.106460 150.024655 204.619034\nv 155.120484 150.496888 202.830271\nv 154.736038 150.293992 203.675132\nv 155.697854 150.470058 203.695005\nv 156.801946 150.918438 202.067571\nv 156.337227 150.970131 201.188762\nv 155.617580 150.724646 201.971335\nv 156.793947 151.168624 200.368745\nv 153.529090 150.051486 203.754299\nv 153.479481 150.187227 202.799745\nv 152.762256 150.188988 201.847357\nv 152.692494 150.453887 199.992300\nv 153.548401 150.612969 200.078791\nv 153.516678 150.742511 199.165470\nv 150.012350 149.669921 201.373117\nv 151.780115 150.368750 199.239547\nv 151.811838 150.239207 200.152868\nv 150.074350 150.207576 197.686643\nv 150.054833 150.056670 198.703914\nv 150.918976 150.304976 198.382843\nv 149.150745 149.579454 200.641788\nv 148.184688 149.442665 199.959746\nv 148.206442 149.325176 200.833818\nv 150.014224 149.925506 199.583915\nv 149.169599 149.828106 198.887715\nv 148.637302 150.011561 196.610231\nv 148.607229 149.882590 197.486745\nv 149.240281 150.088241 197.131199\nv 147.141937 149.253938 199.487974\nv 146.285294 149.020951 199.503347\nv 146.383742 148.955400 200.167149\nv 148.562194 149.767548 198.271620\nv 147.959215 149.690868 197.750652\nv 147.385464 149.806500 195.767324\nv 147.385918 149.708089 196.504478\nv 148.003796 149.904321 196.228623\nv 147.442974 149.633228 197.207723\nv 146.824643 149.535407 196.746424\nv 146.731664 149.689821 195.341368\nv 144.549398 148.979528 196.367801\nv 144.514609 149.076376 195.526380\nv 144.514609 149.184080 194.587575\nv 143.761597 148.938301 194.938500\nv 215.633321 140.082326 235.716772\nv 214.877749 140.573283 235.034391\nv 214.034070 141.047234 234.441803\nv 213.552294 141.425786 233.772413\nv 215.639453 147.968211 206.940789\nv 216.383141 147.763933 206.933129\nv 216.435433 147.921120 206.022965\nv 209.808426 152.158752 162.500374\nv 209.233616 152.324678 163.277846\nv 183.346093 155.052210 166.109348\nv 182.446375 155.073938 166.499297\nv 183.308396 155.080154 166.949966\nv 182.703339 145.438750 235.062414\nv 183.688921 146.157459 232.706403\nv 181.703024 148.834319 223.183795\nv 180.666168 148.678177 223.814631\nv 181.630124 148.643650 223.947570\nv 181.731834 150.033826 218.080351\nv 183.364452 150.095826 217.714457\nv 182.654470 149.848462 218.892751\nv 183.359472 149.896848 218.609623\nv 181.794484 151.259967 212.076611\nv 180.929812 151.290090 211.948254\nv 181.818382 151.105245 212.921591\nv 182.673934 151.243386 212.146538\nv 181.354188 152.335933 205.905467\nv 181.986376 152.203069 206.692926\nv 182.704203 152.361421 205.706276\nv 182.448331 153.574488 197.018696\nv 182.386107 153.472454 197.880619\nv 183.375340 153.578086 196.911202\nv 181.776716 154.335912 189.639221\nv 182.273247 154.384403 189.006688\nv 182.204911 155.124797 174.419336\nv 182.106175 155.136758 173.468258\nv 181.546920 155.058408 165.938344\nv 181.487945 155.031634 165.140451\nv 181.509224 155.086352 166.778962\nv 181.513501 155.013962 164.615337\nv 182.219767 154.987873 163.801826\nv 185.961543 154.932938 163.789163\nv 185.430538 154.969976 164.592599\nv 183.526141 154.975201 163.799598\nv 183.511787 155.001309 164.601108\nv 183.210724 154.952423 162.992974\nv 184.348252 155.025197 165.576891\nv 184.994223 155.033324 166.240407\nv 185.134360 155.000096 165.257281\nv 186.076509 154.978103 165.256116\nv 186.850984 154.982298 166.145759\nv 186.770243 154.907143 163.784616\nv 186.359101 154.892097 162.982346\nv 187.697979 154.878059 163.793648\nv 188.907303 154.893736 165.539744\nv 188.754043 154.927015 166.420355\nv 189.731635 154.856657 165.512723\nv 189.052489 154.852737 164.582479\nv 188.497604 154.851833 163.789022\nv 189.321936 154.814754 163.762002\nv 187.967426 154.840076 162.973172\nv 191.508804 154.656403 162.940776\nv 191.006482 154.724265 163.753519\nv 199.120898 154.045257 165.201571\nv 197.856660 154.096769 162.842123\nv 201.514840 153.793826 167.088034\nv 201.656966 153.755144 166.316696\nv 200.862598 153.878573 166.817170\nv 200.874894 153.767150 163.617598\nv 199.785107 153.904234 163.615067\nv 200.980346 153.714150 162.774651\nv 199.713295 153.880898 162.804054\nv 206.668941 153.014903 168.479692\nv 207.116683 152.910668 167.640093\nv 207.835445 152.780411 167.808875\nv 207.115933 152.891086 166.875151\nv 208.334869 152.502833 163.314913\nv 208.296147 152.475228 162.556202\nv 207.578716 152.660158 163.342665\nv 208.516186 152.509609 164.064308\nv 207.689165 152.707691 164.827776\nv 206.774395 152.772053 162.608528\nv 216.267393 150.695571 164.753861\nv 215.769167 150.788067 163.899532\nv 215.312125 150.961101 164.773677\nv 216.812668 150.541254 164.712404\nv 217.831249 150.245989 164.707696\nv 217.831247 150.312128 165.796795\nv 218.761595 149.998146 164.959398\nv 216.723450 150.801323 171.119748\nv 217.263011 150.651150 172.086541\nv 218.039779 150.439138 172.529619\nv 217.306655 150.641211 173.899718\nv 218.039779 150.437742 173.414064\nv 218.761597 150.238198 172.798752\nv 217.143227 150.543853 180.494854\nv 215.372032 151.082672 178.681136\nv 216.194863 150.892970 177.720415\nv 215.477084 150.534307 187.871400\nv 217.959807 149.833700 188.318082\nv 217.959807 149.732747 189.401086\nv 218.761597 149.549256 189.072598\nv 217.073839 150.273930 185.800670\nv 217.927224 149.366544 193.214178\nv 218.761597 149.164245 192.968551\nv 217.851892 149.278682 194.149243\nv 217.017519 149.598031 193.374423\nv 217.870449 149.160825 195.064938\nv 216.960744 149.392312 195.225183\nv 217.870449 148.923052 196.960766\nv 217.001986 149.152398 197.045740\nv 217.870449 149.052526 196.009091\nv 218.761597 148.938896 194.933151\nv 217.932880 148.403765 200.569890\nv 218.761597 148.163776 200.642430\nv 215.636074 149.017496 200.632127\nv 216.149258 148.999935 199.855859\nv 217.946449 147.024302 208.509341\nv 218.761597 146.836647 208.315254\nv 217.946449 147.195651 207.655894\nv 217.970359 147.533519 205.782330\nv 217.970359 147.362419 206.738556\nv 218.761597 147.179097 206.505581\nv 217.958393 147.673049 205.034801\nv 218.761597 147.537539 204.489990\nv 217.958393 147.860391 203.975438\nv 217.167155 147.856372 205.267777\nv 217.874355 146.424002 211.607823\nv 217.874355 146.239103 212.436322\nv 218.761597 146.063195 212.074700\nv 217.905220 146.624851 210.602084\nv 217.017978 146.800760 210.963705\nv 216.020997 146.833182 212.125074\nv 217.040185 146.330070 213.098557\nv 216.003454 146.952909 211.574420\nv 216.034318 147.153758 210.568682\nv 217.153459 145.794840 215.325121\nv 216.494031 145.737593 216.389391\nv 217.987629 145.433449 215.858488\nv 217.927427 145.698838 214.761036\nv 218.761597 142.381364 226.119549\nv 217.913550 142.840607 225.473266\nv 217.913550 142.639746 226.138515\nv 217.916086 143.293420 223.971264\nv 217.068039 143.350941 224.655479\nv 217.913550 143.041468 224.808017\nv 218.761597 143.323845 222.953138\nv 217.916086 143.633317 222.800599\nv 217.067536 143.844102 222.983237\nv 217.913047 143.874526 221.965110\nv 218.761597 141.272949 229.535194\nv 217.954075 141.495931 229.653260\nv 216.300978 142.507205 228.175403\nv 216.152365 142.827234 227.286502\nv 215.398963 142.742947 228.285264\nv 217.970015 141.151343 230.644355\nv 217.970015 140.876990 231.408607\nv 218.761597 140.755051 231.035446\nv 217.162493 141.617870 230.026421\nv 217.791882 139.402563 235.568353\nv 217.115258 139.621214 235.606905\nv 217.728771 139.122948 236.358849\nv 217.969983 139.877218 234.181604\nv 217.969983 139.611117 234.869905\nv 218.761597 139.587506 234.235100\nv 214.823314 140.831154 234.361456\nv 214.746111 141.256678 233.249730\nv 216.389008 139.854139 235.647955\nv 216.325897 139.574524 236.438450\nv 217.728730 139.565093 235.202641\nv 213.336475 140.457627 236.594124\nv 213.279493 140.730752 235.889236\nv 206.333010 143.326437 233.567745\nv 207.114335 143.089212 233.749501\nv 206.488613 142.581864 235.580707\nv 207.200620 142.638564 234.973694\nv 208.321171 141.947113 236.176911\nv 209.223980 141.755093 236.122308\nv 208.147248 142.220913 235.524515\nv 201.912108 143.499723 235.552139\nv 203.575348 142.690544 236.987854\nv 204.971602 142.909036 235.578411\nv 204.998191 142.655045 236.273501\nv 205.949447 142.473649 236.241549\nv 205.214852 142.377900 236.932754\nv 207.131268 142.210418 236.223305\nv 206.705273 142.304718 236.239960\nv 206.592102 142.102204 236.884148\nv 197.555901 143.625496 237.152748\nv 199.210449 143.405197 237.113899\nv 190.606173 145.263441 234.483012\nv 189.768036 145.161646 234.998246\nv 190.794068 144.966379 235.338564\nv 192.427126 144.421303 236.551606\nv 191.304972 144.514599 236.568032\nv 192.086448 144.215099 237.256676\nv 182.976375 144.928749 236.588984\nv 183.912292 144.902843 236.600706\nv 185.178496 144.870448 236.595007\nv 184.566300 144.640899 237.331795\nv 184.808893 145.578264 234.485821\nv 186.104973 144.840933 236.591234\nv 186.245873 144.837332 236.590586\nv 185.973404 144.604904 237.325447\nv 187.213043 145.300349 235.037852\nv 187.290680 145.031628 235.836318\nv 188.126281 145.258616 235.017798\nv 187.382172 144.777930 236.580087\nv 187.250603 144.541900 237.314301\nv 186.828823 145.564189 234.282584\nv 190.460113 144.586489 236.563450\nv 189.675598 144.395446 237.288452\nv 190.800790 144.792692 235.858380\nv 210.306947 141.497887 236.049143\nv 209.429028 141.703144 236.113107\nv 209.602951 141.429345 236.765503\nv 208.721344 142.503170 234.357215\nv 209.286934 142.670393 233.472338\nv 210.039597 141.318695 236.745949\nv 210.538545 141.439186 236.038790\nv 210.961716 142.149201 233.736908\nv 210.686379 142.492032 232.970026\nv 212.116893 141.574459 234.497516\nv 211.274047 141.776720 234.557821\nv 211.383938 142.756061 231.701128\nv 212.047226 142.554903 231.754640\nv 212.433575 141.740766 233.774807\nv 212.790076 142.383315 231.656404\nv 212.319203 142.719808 231.064127\nv 213.886927 141.563364 233.108846\nv 214.653403 141.514938 232.589708\nv 213.496231 142.698173 230.144677\nv 214.388660 142.438870 230.132551\nv 216.347065 142.192688 229.104746\nv 217.179597 140.929253 232.022292\nv 217.059942 142.845240 226.334437\nv 216.564292 143.250954 225.495667\nv 216.558731 142.997205 226.337871\nv 216.322574 144.075625 222.964090\nv 216.325613 143.834416 223.799579\nv 216.566828 143.502906 224.658914\nv 215.821866 143.734429 224.639767\nv 215.656716 143.232947 226.447732\nv 215.245298 143.668022 225.419517\nv 213.126129 143.039789 229.395987\nv 213.721307 143.171712 228.462164\nv 212.917028 143.363376 228.534688\nv 213.691093 144.164969 225.250265\nv 213.112713 144.140767 225.856775\nv 212.570780 143.883245 227.161224\nv 212.534696 144.163981 226.284636\nv 211.834721 144.162505 226.892907\nv 212.691951 142.889836 230.217201\nv 213.391480 143.690010 227.076909\nv 212.691506 143.688534 227.685180\nv 210.902417 144.272370 227.306627\nv 209.982065 144.486184 227.371825\nv 209.394432 144.117002 228.982083\nv 209.139648 144.510653 227.915767\nv 208.503979 144.318257 228.997958\nv 211.949101 143.061424 230.315437\nv 211.419911 143.412682 229.622325\nv 211.047162 143.242654 230.469251\nv 210.274037 143.951655 228.838016\nv 209.638367 143.759259 229.920206\nv 210.169405 143.304764 230.948499\nv 209.466055 143.489974 230.884762\nv 207.506788 144.689492 228.526343\nv 207.761573 144.295841 229.592659\nv 206.889740 144.446607 229.728921\nv 207.886930 144.075372 230.200536\nv 206.137650 144.614720 229.697899\nv 206.263008 144.394252 230.305776\nv 207.698894 143.564619 231.928225\nv 206.236128 144.265280 230.726652\nv 205.484039 144.433393 230.695630\nv 204.705241 144.595258 230.664159\nv 204.732121 144.724229 230.243283\nv 206.238495 143.677398 232.545580\nv 205.499637 143.689605 232.982594\nv 204.635792 144.317229 231.564131\nv 203.883874 144.608066 231.111784\nv 203.020133 144.475585 232.007149\nv 201.557173 144.448118 232.877448\nv 200.072395 144.275728 234.130840\nv 199.857717 144.821613 232.572256\nv 199.776397 145.055873 231.894881\nv 198.975195 144.969974 232.531318\nv 199.972510 144.505408 233.480524\nv 200.773712 144.591307 232.844087\nv 198.085179 145.147236 232.373528\nv 198.166500 144.912976 233.050903\nv 196.658617 144.768649 234.100646\nv 195.958427 144.637271 234.765978\nv 196.860265 144.444028 234.996420\nv 197.418469 144.832823 233.612101\nv 196.226303 143.802246 237.183899\nv 195.252506 144.700240 234.822058\nv 194.216838 144.798895 234.869959\nv 194.721111 145.060546 233.918105\nv 194.814268 144.191844 236.491506\nv 193.997728 144.509686 235.807275\nv 181.333704 146.905577 230.338977\nv 184.255366 146.867389 230.313444\nv 184.362946 147.104238 229.516432\nv 183.182371 146.900696 230.293086\nv 184.018128 146.556474 231.366525\nv 183.913446 146.313099 232.170584\nv 185.898786 145.847469 233.514169\nv 185.060709 145.869431 233.530213\nv 187.973405 145.783781 233.411880\nv 187.118607 145.810617 233.450916\nv 188.432033 146.692597 230.332296\nv 187.662512 146.729639 230.350681\nv 188.495908 146.459867 231.080657\nv 189.637958 145.726339 233.268707\nv 188.739153 145.749467 233.373561\nv 191.355227 146.279484 231.039602\nv 192.329826 146.167052 231.131665\nv 192.151756 146.537195 229.948257\nv 191.563457 145.746277 232.747600\nv 190.614537 145.951656 232.308865\nv 190.644697 145.788592 232.833455\nv 194.368142 146.451022 229.534048\nv 193.342910 146.587906 229.425858\nv 194.151586 146.287879 230.148510\nv 195.258267 145.875982 231.153242\nv 194.295448 145.963324 231.184708\nv 196.449397 146.889645 227.240941\nv 195.452047 146.792683 227.981818\nv 196.356377 146.683687 227.990021\nv 197.938281 145.819724 230.242952\nv 197.043116 145.675858 231.102424\nv 197.981846 145.553836 231.097768\nv 198.232690 146.813491 226.713839\nv 197.353732 146.932687 226.704970\nv 198.232684 146.661453 227.258013\nv 199.844254 145.803302 229.407132\nv 198.934522 145.907972 229.499508\nv 199.786743 145.593032 230.145920\nv 200.042193 146.858778 225.641359\nv 200.973147 146.825479 225.258454\nv 200.045100 147.088750 224.786826\nv 201.743728 145.798576 228.431268\nv 200.805260 145.795612 228.947323\nv 201.634942 145.491326 229.537488\nv 203.221050 146.501013 225.125937\nv 201.766958 146.666012 225.401164\nv 202.424333 146.430508 225.837760\nv 203.735901 145.610043 227.907028\nv 202.690530 145.635451 228.461054\nv 203.618780 145.468882 228.467406\nv 205.114826 145.934246 225.887750\nv 206.305096 145.859690 225.343133\nv 205.068696 146.190953 225.017917\nv 206.426341 145.355823 227.030135\nv 205.507688 145.523229 227.063173\nv 205.582803 145.276069 227.880342\nv 206.244412 146.368173 223.568026\nv 207.149217 145.986422 224.282107\nv 207.134663 146.238198 223.376833\nv 207.954952 145.589596 225.099767\nv 207.064700 145.719572 225.290961\nv 208.875421 145.236270 225.629662\nv 209.907218 144.906382 225.997230\nv 207.185946 145.215704 226.977962\nv 207.375325 144.910286 227.889472\nv 209.975197 145.726442 222.995457\nv 209.062546 146.063288 222.528475\nv 210.908003 145.505035 222.979449\nv 210.936021 145.638612 222.475928\nv 211.998877 145.602529 221.659301\nv 211.066071 145.823937 221.675310\nv 211.836893 145.181360 223.346583\nv 210.876069 145.269190 223.866113\nv 212.719731 145.216387 222.394189\nv 212.849781 145.401711 221.593571\nv 212.714748 144.793295 223.938675\nv 212.746681 145.029139 223.052011\nv 213.597586 144.828322 222.986281\nv 213.963149 145.536599 219.998226\nv 214.931752 145.299886 219.881882\nv 214.535820 145.603834 219.147182\nv 213.244004 145.510252 220.795805\nv 213.964859 145.124110 221.530693\nv 215.223002 144.994804 220.719980\nv 215.795673 145.062040 219.868936\nv 214.436841 144.792346 222.278541\nv 214.831063 144.900887 221.480775\nv 216.335658 145.080826 219.184153\nv 217.182597 144.978891 218.616721\nv 216.351361 145.265186 218.463405\nv 216.626908 144.775745 220.022251\nv 217.143057 144.615494 220.044170\nv 215.620798 145.549188 218.177415\nv 216.467737 145.447252 217.609982\nv 181.544316 148.224426 225.552454\nv 181.658307 148.435691 224.760249\nv 182.793803 148.174552 225.716761\nv 182.329053 147.368892 228.700794\nv 182.328586 147.580834 227.938482\nv 184.142868 148.159055 225.684754\nv 184.920306 147.943461 226.400596\nv 185.143967 148.149988 225.616200\nv 183.516755 148.582687 224.108546\nv 182.695163 148.591834 224.129413\nv 183.544938 148.374728 224.921225\nv 183.888853 147.535067 228.009963\nv 183.187836 147.348423 228.740458\nv 183.990967 147.324190 228.765579\nv 187.157196 148.248724 224.962518\nv 186.098224 148.164719 225.446959\nv 186.980377 148.018399 225.847602\nv 187.975472 147.551712 227.413441\nv 187.152800 147.589943 227.407833\nv 187.147981 147.410806 228.072636\nv 188.863351 148.281401 224.508625\nv 188.105817 148.292506 224.631628\nv 188.796883 148.091298 225.240158\nv 189.520064 147.514925 227.225302\nv 188.511550 147.542623 227.336796\nv 188.979167 147.344879 227.966749\nv 190.655561 148.246000 224.213687\nv 189.730113 148.267163 224.379896\nv 190.479865 148.059030 224.950947\nv 191.372323 147.451090 226.981961\nv 190.396878 147.492211 227.095225\nv 190.963126 147.276061 227.741990\nv 192.647056 148.192944 223.815363\nv 191.599611 148.222491 224.041447\nv 192.452758 148.008320 224.558654\nv 193.319743 147.359601 226.711750\nv 192.394955 147.413680 226.817739\nv 192.863359 147.180861 227.522737\nv 194.656215 148.159148 223.202528\nv 193.629986 148.220926 223.361407\nv 194.526432 147.916996 224.173691\nv 196.463337 147.259863 225.876248\nv 195.559002 147.216821 226.412219\nv 196.449403 147.041682 226.696767\nv 196.393385 148.118741 222.641907\nv 195.517250 148.055691 223.265875\nv 196.428796 147.918269 223.390844\nv 200.030842 147.367412 223.726615\nv 199.099888 147.400711 224.109521\nv 198.063466 148.201856 221.532065\nv 197.236034 148.145428 222.159282\nv 198.132362 148.037748 222.139658\nv 200.957946 147.273956 223.577253\nv 200.012734 147.585917 222.899948\nv 205.021961 147.758690 218.977996\nv 204.098892 147.751789 219.681657\nv 205.227975 147.457350 220.058040\nv 206.194884 146.835025 221.831915\nv 205.303887 147.001600 221.810081\nv 205.338862 146.786523 222.640918\nv 206.988933 147.647550 217.918973\nv 206.179617 147.655154 218.537748\nv 206.960360 147.456647 218.735604\nv 208.762316 147.665682 216.302180\nv 207.856659 147.647266 217.188450\nv 208.675333 147.467459 217.230559\nv 209.662286 147.568239 215.905179\nv 210.395438 147.304673 216.328962\nv 210.476734 147.387037 215.889851\nv 211.072955 146.935250 217.226444\nv 210.258507 147.116452 217.241772\nv 211.659341 146.435969 218.713670\nv 210.761347 146.547583 219.126662\nv 211.484664 146.236523 219.701078\nv 211.328619 147.252572 215.653292\nv 212.007550 146.942868 216.252236\nv 212.126283 147.071969 215.591894\nv 212.709069 146.602136 216.964536\nv 211.911405 146.782739 217.025934\nv 213.485768 146.199718 217.833498\nv 213.090070 146.141277 218.500880\nv 213.962915 145.898989 218.596144\nv 212.894885 146.955823 215.280425\nv 213.743762 146.663704 215.576968\nv 213.833433 146.857261 214.666554\nv 214.496971 146.461341 215.621481\nv 213.558422 146.559903 216.235352\nv 215.024402 146.044397 216.801928\nv 215.755787 145.838495 216.840100\nv 215.043016 146.151638 216.318037\nv 214.335122 146.157485 217.104314\nv 215.047893 145.844342 217.626377\nv 217.205980 145.346351 217.159273\nv 216.475417 145.630352 216.873283\nv 217.987629 145.205926 216.782038\nv 218.761597 145.109924 216.217953\nv 198.606827 154.078834 178.977059\nv 198.028878 154.124494 179.518046\nv 199.218391 153.988069 179.803313\nv 197.890769 154.280736 174.576476\nv 198.490132 154.212443 174.578587\nv 199.356160 154.074698 176.352128\nv 198.664486 154.130176 177.175268\nv 197.310638 154.197326 179.508591\nv 197.922202 154.106562 180.334844\nv 194.988333 154.478562 177.795462\nv 195.464845 154.399730 178.701904\nv 195.851531 154.402395 177.765532\nv 196.364219 154.221264 181.127798\nv 197.110680 154.152093 181.132350\nv 196.457503 154.248566 180.320837\nv 198.420549 154.178545 166.799101\nv 198.350491 154.212664 167.558389\nv 197.235457 154.306956 166.926663\nv 195.951488 154.388208 165.383358\nv 195.047825 154.481529 165.635349\nv 195.793027 154.431886 166.469824\nv 193.198831 154.636049 165.554616\nv 194.227463 154.547321 165.522869\nv 195.201032 154.328466 181.087328\nv 195.854209 154.231994 181.898841\nv 194.410445 154.459103 179.515683\nv 194.965143 154.380022 180.307908\nv 195.156345 154.396816 179.524060\nv 194.455132 154.390753 181.078951\nv 193.519803 154.460492 181.049823\nv 193.755693 154.408936 181.829243\nv 191.895927 154.611135 180.216976\nv 192.325928 154.617366 179.460840\nv 191.481204 154.675736 179.403233\nv 190.060820 154.620660 182.270345\nv 190.899018 154.569974 182.371709\nv 190.588969 154.626460 181.554151\nv 188.891242 154.728015 181.234734\nv 189.588700 154.718827 180.768662\nv 188.729171 154.769696 180.550608\nv 189.998291 154.536333 183.891593\nv 189.374626 154.618294 182.952158\nv 189.002048 154.590453 183.755848\nv 186.481654 154.760460 182.423446\nv 187.441578 154.695861 183.004518\nv 187.418459 154.737012 182.235342\nv 184.912485 154.724119 183.815699\nv 184.122711 154.729438 183.913125\nv 184.189240 154.672519 184.921149\nv 183.766608 154.942596 180.044251\nv 182.964242 154.903632 181.057561\nv 183.854989 154.887082 181.086558\nv 184.751655 154.853541 181.440461\nv 185.652245 154.791324 182.230973\nv 185.557945 154.863828 180.863759\nv 182.541731 154.733936 184.221669\nv 197.260884 154.358012 173.104639\nv 196.449435 154.438209 173.150063\nv 197.174350 154.362060 173.800499\nv 193.964386 154.655085 173.112502\nv 194.889458 154.580445 172.223457\nv 194.114086 154.654278 171.365236\nv 195.551330 154.511754 173.908323\nv 194.912242 154.561694 174.482063\nv 195.723814 154.492196 174.419663\nv 192.168085 154.780375 173.560904\nv 193.140098 154.718565 173.183726\nv 192.217001 154.790728 172.631458\nv 194.087954 154.625174 174.553287\nv 193.092336 154.695095 174.931675\nv 194.089108 154.612057 175.371790\nv 190.249878 154.879060 174.584537\nv 191.233277 154.840529 173.722532\nv 190.261589 154.891069 173.870641\nv 192.157528 154.755250 175.093303\nv 191.349653 154.797741 175.634975\nv 192.285615 154.724470 176.291849\nv 188.272338 154.948755 175.675317\nv 189.281612 154.911096 175.546001\nv 188.268916 154.967259 174.861962\nv 189.772952 154.846912 177.382809\nv 188.855560 154.886638 177.350702\nv 189.343478 154.840958 178.374154\nv 186.150471 155.017437 175.903618\nv 187.133545 154.989141 175.858965\nv 186.276569 155.033214 175.035931\nv 187.716767 154.927024 177.534350\nv 186.862827 154.955939 177.572921\nv 187.572147 154.909599 178.380618\nv 184.120165 155.058759 176.089507\nv 185.133762 155.040041 176.078546\nv 184.279899 155.080228 175.091545\nv 182.814462 154.994219 179.023703\nv 183.808458 154.965957 179.492301\nv 183.747059 155.001030 178.500749\nv 182.216905 155.087973 175.904318\nv 183.009682 155.064119 176.567328\nv 181.181292 155.097399 175.881435\nv 182.230688 155.108372 175.079623\nv 181.902308 155.000335 178.968502\nv 181.087644 154.995957 179.111571\nv 193.261644 154.672911 167.460994\nv 192.448397 154.723012 166.964548\nv 192.461401 154.739132 167.928688\nv 190.617301 154.843444 166.951115\nv 189.919175 154.893318 167.521230\nv 190.950028 154.839107 168.002356\nv 188.525894 154.974523 169.124779\nv 189.813675 154.917358 169.339610\nv 188.964122 154.946146 168.357640\nv 186.621304 155.049138 169.825212\nv 187.594872 155.012618 169.027637\nv 186.702773 155.039831 168.940383\nv 188.444425 154.983830 170.009608\nv 187.463078 155.028726 170.773001\nv 188.394100 154.990631 170.870143\nv 184.757353 155.098434 170.214432\nv 185.623378 155.081127 170.294100\nv 184.863181 155.093658 169.658290\nv 186.465151 155.060715 171.241889\nv 185.422612 155.091254 171.779313\nv 186.370213 155.066067 172.170960\nv 182.728828 155.127851 170.497365\nv 183.580566 155.119119 170.558325\nv 183.145419 155.119697 169.517662\nv 181.522325 155.108796 167.568525\nv 181.464826 155.122070 168.626918\nv 182.351180 155.115156 168.398308\nv 183.189361 155.129534 172.659980\nv 182.080790 155.134497 172.346305\nv 181.980966 155.137595 171.395069\nv 181.247765 152.479667 204.997559\nv 180.529939 152.321315 205.984210\nv 181.369587 152.617916 204.121457\nv 182.230313 152.633523 204.019573\nv 181.527886 152.757153 203.222215\nv 183.075657 152.632673 203.947793\nv 182.917358 152.493436 204.847036\nv 184.614517 152.360096 205.497589\nv 183.549546 152.360571 205.634495\nv 184.401362 152.228081 206.356829\nv 183.950168 152.636285 203.842327\nv 183.263123 152.776372 203.014864\nv 185.913382 152.637658 203.493802\nv 185.237276 152.810648 202.499932\nv 184.813740 152.606993 203.903268\nv 188.012610 152.306805 205.116027\nv 187.217969 152.244516 205.739999\nv 188.046014 152.197397 205.807805\nv 188.748886 152.666072 202.584784\nv 187.885099 152.665129 202.857496\nv 188.465128 152.563717 203.339244\nv 189.746952 152.265929 204.831365\nv 188.933556 152.316587 204.788974\nv 189.654051 152.209029 205.226224\nv 190.220177 152.669193 202.026755\nv 189.427342 152.676879 202.283564\nv 190.121749 152.556973 202.809722\nv 191.383033 152.189153 204.688506\nv 190.577811 152.243588 204.672146\nv 191.272670 152.103937 205.284975\nv 191.817055 152.654114 201.396594\nv 191.026627 152.683987 201.562481\nv 191.705012 152.519415 202.387025\nv 193.052675 152.150247 204.159137\nv 192.183770 152.159250 204.531936\nv 192.946796 152.040499 204.928535\nv 193.431389 152.570838 201.170228\nv 192.594632 152.595973 201.451495\nv 193.332198 152.464407 201.939871\nv 194.748217 152.099830 203.565774\nv 193.905194 152.133563 203.829717\nv 194.658724 151.997763 204.291792\nv 195.067678 152.485201 200.780286\nv 194.223241 152.501083 201.199903\nv 195.013393 152.423391 201.238987\nv 196.466507 152.051810 202.801928\nv 195.591443 152.075864 203.220730\nv 196.376812 151.939975 203.609047\nv 196.738282 152.418191 200.088608\nv 195.922801 152.505527 200.071501\nv 196.673312 152.320173 200.836477\nv 198.201512 151.983848 202.009289\nv 197.326171 152.013971 202.467645\nv 198.127218 151.885798 202.731889\nv 198.238976 152.388286 199.156390\nv 197.541698 152.374125 199.805196\nv 198.186072 152.246998 200.204778\nv 199.969863 151.928640 200.927864\nv 199.069032 151.945961 201.589895\nv 199.903390 151.838353 201.611502\nv 200.117234 152.231917 198.614674\nv 199.096289 152.342942 198.755392\nv 199.904294 152.150135 199.415255\nv 201.755508 151.828841 199.965299\nv 200.864730 151.930071 200.112004\nv 201.694999 151.719802 200.802766\nv 200.995667 152.148956 198.416259\nv 201.831547 151.967708 198.874582\nv 203.472937 151.487458 200.650506\nv 202.496982 151.499367 201.590798\nv 203.384141 151.368254 201.585244\nv 204.343999 151.665892 198.361027\nv 203.566649 151.832767 198.001497\nv 204.326326 151.459450 199.919319\nv 205.025605 151.323520 200.095482\nv 204.991834 151.426626 199.369850\nv 205.895836 151.185456 200.072571\nv 205.230327 151.218281 200.622040\nv 205.252300 151.766434 196.471584\nv 204.433676 151.858029 196.815826\nv 205.214066 151.677634 197.184126\nv 206.859966 151.560546 195.876644\nv 206.046881 151.641659 196.392183\nv 206.845774 151.504926 196.324346\nv 208.821832 151.022531 197.240592\nv 208.313290 151.011634 198.126441\nv 211.540556 150.627091 195.990626\nv 210.942220 150.638191 196.939407\nv 208.701963 151.591258 192.617361\nv 208.515747 151.536314 193.438055\nv 209.668560 151.347561 193.154379\nv 212.494479 150.439241 195.807040\nv 213.109669 150.525277 193.814529\nv 212.259733 150.787649 193.151550\nv 214.605145 150.150558 194.042879\nv 213.652444 150.363337 194.157258\nv 213.839314 150.605203 191.443831\nv 213.194538 150.720623 191.799700\nv 215.125077 150.248975 191.851213\nv 215.003193 150.205176 192.604869\nv 215.774956 150.291987 189.712678\nv 215.108231 150.455946 189.757062\nv 215.279789 150.325139 190.678823\nv 215.216084 150.295632 191.161865\nv 182.116559 154.053393 192.671291\nv 184.526914 153.765672 195.054138\nv 183.576717 153.772165 195.158788\nv 184.427018 153.675024 195.918359\nv 185.193291 154.086623 191.887421\nv 184.489745 154.080738 192.107390\nv 185.219243 154.001073 192.698040\nv 186.324967 153.762398 194.673196\nv 185.481054 153.754205 194.981749\nv 186.221127 153.676723 195.505156\nv 186.890404 154.078777 191.476189\nv 186.050965 154.085846 191.683671\nv 186.762229 153.999889 192.270590\nv 187.984327 153.748980 194.231712\nv 187.135688 153.735452 194.689272\nv 187.913678 153.698444 194.739043\nv 188.607061 154.064976 190.906052\nv 187.735815 154.069526 191.246309\nv 188.472913 153.988270 191.722850\nv 189.635185 153.721411 193.770209\nv 188.882383 153.766436 193.701332\nv 189.515118 153.666948 194.350360\nv 190.386014 154.043140 190.143022\nv 189.492939 154.062267 190.461677\nv 190.237234 153.964593 191.063939\nv 191.388387 153.703992 192.960996\nv 190.524665 153.707832 193.434083\nv 191.131641 153.618083 193.946150\nv 192.041163 153.973442 189.778527\nv 191.185863 153.990331 190.220899\nv 191.985609 153.928579 190.302912\nv 193.001404 153.658170 192.325998\nv 192.469789 153.678165 192.497017\nv 192.526978 153.594248 193.302044\nv 193.594559 153.919549 189.085395\nv 192.861820 153.980540 189.030109\nv 193.573648 153.850699 189.915826\nv 194.800103 153.822270 189.180459\nv 194.088275 153.952111 188.294743\nv 197.441233 153.320824 191.810848\nv 196.797936 153.316360 192.502589\nv 197.301862 153.255121 192.620348\nv 197.144988 153.586239 189.288328\nv 197.796332 153.498250 189.490007\nv 197.694269 153.581667 188.693778\nv 199.403658 153.147662 191.374279\nv 198.594368 153.272069 191.004993\nv 198.754450 153.135178 192.297892\nv 199.081575 153.496250 187.883176\nv 198.367581 153.558098 188.128265\nv 199.059607 153.431831 188.650368\nv 201.239562 152.956283 191.010703\nv 200.231890 153.164064 190.081133\nv 200.251249 153.076773 191.010949\nv 202.980056 152.856661 189.504125\nv 202.141895 152.973519 189.429248\nv 202.058365 152.926717 190.155763\nv 201.555196 153.378198 185.450055\nv 200.742548 153.492411 185.308136\nv 200.777302 153.436331 186.005202\nv 204.501358 152.703382 188.652340\nv 203.827174 152.823762 188.359700\nv 203.737771 152.783083 189.070250\nv 202.895475 153.211065 185.177482\nv 201.982009 153.330705 185.324276\nv 202.503416 153.202477 186.000327\nv 205.870812 152.532361 188.091926\nv 205.248266 152.661531 187.659674\nv 205.213307 152.614890 188.374043\nv 204.444108 153.027360 184.439191\nv 203.538545 153.132826 184.944546\nv 204.322445 152.977370 185.348177\nv 207.002929 152.416036 187.080640\nv 206.411335 152.538530 186.753092\nv 206.497364 152.456508 187.705106\nv 206.116895 152.808715 183.560051\nv 205.286385 152.927452 183.905758\nv 206.058519 152.753167 184.497115\nv 208.493307 152.255789 185.556250\nv 207.653606 152.412326 185.420946\nv 207.756601 152.341521 186.263930\nv 207.614567 152.602546 182.557949\nv 206.898508 152.695372 183.171080\nv 207.605089 152.541605 183.538277\nv 209.829636 152.075344 184.348343\nv 209.077968 152.229908 184.122071\nv 209.141980 152.172032 184.939538\nv 211.144038 151.868844 183.291780\nv 210.459467 151.979916 183.821729\nv 210.410722 152.160656 180.436232\nv 209.711229 152.283760 180.892373\nv 210.419181 152.113541 181.363157\nv 211.821778 151.751067 182.775810\nv 211.818313 151.877908 179.936953\nv 211.113031 152.012860 180.414157\nv 211.823956 151.855487 180.429812\nv 213.933697 151.354732 180.964445\nv 213.043906 151.658372 178.307604\nv 212.422295 151.776954 179.055620\nv 213.150849 151.601954 179.204592\nv 214.711830 151.168527 180.767526\nv 214.381758 151.367461 177.204028\nv 213.680494 151.526798 177.663266\nv 214.473724 151.324034 177.997338\nv 215.452301 151.118486 176.110738\nv 214.994076 151.226780 176.647164\nv 215.633214 151.056404 177.001673\nv 215.410527 151.139083 175.361312\nv 216.633377 150.816074 175.600413\nv 216.049665 150.968707 175.715820\nv 217.277106 150.643292 175.444468\nv 182.035240 153.138085 200.474455\nv 181.857478 153.007656 201.407855\nv 181.685087 152.884225 202.315625\nv 182.561004 152.896192 202.212560\nv 183.170405 153.360773 198.675201\nv 183.435515 152.899803 202.107094\nv 184.308597 152.897050 202.026564\nv 183.606478 153.016870 201.224260\nv 186.369967 152.989434 200.954082\nv 185.441288 153.075836 200.480714\nv 185.408239 152.927715 201.617099\nv 187.200580 153.086469 199.980487\nv 187.167530 152.938348 201.116872\nv 187.577326 153.427056 197.259780\nv 186.722915 153.415737 197.608663\nv 187.456132 153.323984 198.079884\nv 188.844782 153.039529 199.810204\nv 188.056606 153.093061 199.681017\nv 188.786319 152.981851 200.272465\nv 189.241818 153.430775 196.615637\nv 188.418227 153.434441 196.913744\nv 189.134133 153.331639 197.432895\nv 190.504504 153.032546 199.181673\nv 189.672192 153.030793 199.565491\nv 190.406807 152.930072 200.017835\nv 190.850150 153.410349 196.026940\nv 190.050590 153.422456 196.321691\nv 190.757283 153.315867 196.840037\nv 192.119663 152.995155 198.668990\nv 191.317448 153.020574 198.897100\nv 192.041335 152.906405 199.405909\nv 192.411539 153.379301 195.377058\nv 191.646164 153.412184 195.554464\nv 192.322219 153.270876 196.367881\nv 193.725359 152.941583 198.146780\nv 192.910175 152.969975 198.429393\nv 193.658734 152.852594 198.895186\nv 193.984981 153.333714 194.758742\nv 193.131715 153.323365 195.441063\nv 193.940860 153.248342 195.508155\nv 195.370188 152.896170 197.386831\nv 194.547490 152.922457 197.768131\nv 195.296615 152.797915 198.231273\nv 195.603567 153.236292 194.357962\nv 194.791632 153.318149 194.297029\nv 195.606060 153.176834 194.886768\nv 197.035630 152.821488 196.680515\nv 196.189475 152.853343 197.121683\nv 196.965467 152.739773 197.408806\nv 197.345734 153.157849 193.537378\nv 196.538280 153.172817 194.129895\nv 197.225449 153.080009 194.355184\nv 197.908854 152.798851 196.113155\nv 198.709857 152.689736 196.257263\nv 198.798322 153.037906 193.214922\nv 197.989032 153.162313 192.845637\nv 200.337093 152.465177 196.552434\nv 199.458660 152.548139 196.750849\nv 200.187662 152.341763 197.756396\nv 202.904328 152.241406 195.541834\nv 202.077098 152.378669 195.301824\nv 202.034120 152.303445 196.051023\nv 202.105694 152.756484 191.859806\nv 201.255228 152.762263 192.896281\nv 202.102002 152.649755 192.815568\nv 204.596090 152.026241 195.201645\nv 203.833788 152.211141 194.546321\nv 203.709608 152.131730 195.447959\nv 203.617469 152.702192 190.219871\nv 202.924496 152.726918 191.004866\nv 203.645439 152.619252 190.994099\nv 206.262282 151.801582 194.730407\nv 205.591881 152.005769 193.908170\nv 205.390671 151.901466 195.122244\nv 205.105290 152.512160 189.736241\nv 204.375183 152.628614 189.785996\nv 205.068519 152.478072 190.159348\nv 207.006321 151.842948 193.208685\nv 207.491080 151.862954 192.164446\nv 206.948250 151.925891 192.472094\nv 206.556462 152.301378 189.374465\nv 205.817240 152.423669 189.457944\nv 206.537848 152.239327 190.026114\nv 208.171398 151.738158 192.173507\nv 207.906247 152.161485 188.207295\nv 207.183014 152.225526 188.987645\nv 208.000302 152.052995 189.162285\nv 211.695199 151.132109 191.164138\nv 211.032660 151.338318 190.483192\nv 210.951211 151.297304 191.059469\nv 208.659918 152.086969 187.390585\nv 209.502963 151.904144 187.525653\nv 211.122071 151.628235 186.792250\nv 211.554951 151.579527 186.231339\nv 210.715272 151.770626 186.108460\nv 213.536968 150.995795 188.041688\nv 212.674611 151.145522 188.601834\nv 213.075087 151.314954 185.137982\nv 212.182947 151.465005 185.867888\nv 212.853890 151.287085 186.185222\nv 214.548400 150.891427 186.203599\nv 213.687644 151.091681 186.282960\nv 214.490014 150.846073 187.031243\nv 214.641388 151.013103 184.008776\nv 213.794828 151.182321 184.585566\nv 215.296117 150.874840 183.602869\nv 216.261249 150.617691 183.691927\nv 217.922473 150.249943 182.222036\nv 218.761597 150.008625 182.477776\nv 217.101252 150.474386 182.204417\nv 214.487517 151.186956 164.797979\nv 213.498085 151.433370 164.829450\nv 213.249821 151.350377 162.357849\nv 212.551939 151.570389 163.191569\nv 211.993209 151.742968 163.985614\nv 213.598400 151.453203 165.668379\nv 213.136529 151.601046 166.507295\nv 212.935348 151.566259 164.821218\nv 212.481096 151.781057 167.191684\nv 212.380231 151.766103 166.344535\nv 211.809218 151.954805 167.697775\nv 210.953829 152.093730 166.454463\nv 211.074839 152.129523 168.153179\nv 210.444758 152.280486 168.748738\nv 211.263558 152.114458 168.962185\nv 210.990418 152.120832 167.484328\nv 210.219450 152.268447 166.909867\nv 209.008778 152.501087 166.461968\nv 208.526320 152.678509 169.203586\nv 208.582020 152.690215 170.515661\nv 209.299098 152.549969 170.360130\nv 208.499366 152.697269 169.988887\nv 209.924961 152.411222 169.695550\nv 204.440608 153.429942 171.102900\nv 204.309015 153.448822 170.196857\nv 204.854441 153.360482 173.009152\nv 205.956738 153.176752 172.700342\nv 204.988805 153.337880 171.731658\nv 205.542906 153.246212 170.794090\nv 206.238883 153.125084 170.777820\nv 206.864266 153.019869 171.768238\nv 206.729903 153.042471 173.045732\nv 207.709860 152.861551 171.129023\nv 206.936695 152.995832 170.783633\nv 208.509591 152.714251 171.500266\nv 200.906853 153.943036 172.875806\nv 201.537111 153.864290 172.049646\nv 203.259160 153.608737 172.893784\nv 203.383562 153.582483 173.797808\nv 204.010909 153.495356 172.944492\nv 204.928252 153.340314 174.513318\nv 205.771785 153.205440 174.577978\nv 204.978842 153.334228 173.913176\nv 206.636184 153.058798 174.034487\nv 206.585594 153.064884 174.634629\nv 200.577890 153.884948 177.944309\nv 201.413173 153.785207 177.741950\nv 200.553137 153.906631 177.099799\nv 202.734792 153.612901 177.101221\nv 202.759545 153.591218 177.945731\nv 198.762029 154.199398 173.723165\nv 201.326618 153.833803 176.076656\nv 201.919216 153.757406 175.864813\nv 201.857415 153.784319 175.044029\nv 201.166598 153.889201 174.463218\nv 200.303320 154.017309 173.680911\nv 202.750828 153.630082 176.251255\nv 203.281625 153.580599 175.218629\nv 204.124274 153.461189 174.726793\nv 203.292662 153.588513 174.340351\nv 203.663969 153.483799 167.378968\nv 204.575870 153.371513 168.361069\nv 203.003059 153.529384 165.530159\nv 202.993547 153.562390 166.504462\nv 202.979630 153.591805 167.462066\nv 202.216289 153.708028 167.648197\nv 202.886712 153.629437 168.522703\nv 202.873345 153.652515 169.468608\nv 202.061109 153.767329 169.541419\nv 202.811084 153.674184 170.301192\nv 201.264150 153.877954 169.723315\nv 200.479566 153.980426 169.796573\nv 201.214264 153.891470 170.447262\nv 199.640165 154.078426 169.041702\nv 200.624962 153.942083 168.330568\nv 199.735675 154.053598 168.299643\nv 200.587503 153.981164 171.300783\nv 199.504453 154.112892 172.112923\nv 197.875409 154.297082 169.875855\nv 198.654430 154.205489 169.781739\nv 197.971857 154.281534 169.104893\nv 197.001096 154.392248 169.866074\nv 197.683669 154.316203 170.542920\nv 195.787564 154.506899 171.465197\nv 196.672663 154.422765 171.493671\nv 195.924257 154.495504 170.504665\nv 194.082006 154.607119 167.573475\nv 194.577481 154.578312 168.187029\nv 195.384839 154.496400 167.335370\nv 194.069002 154.590999 166.609335\nv 191.581480 154.776851 166.551514\nv 192.381723 154.710630 166.083820\nv 191.519432 154.743699 165.112437\nv 192.331914 154.689888 165.141582\nv 190.695814 154.790064 165.113122\nv 190.550627 154.831063 166.070387\nv 190.700439 154.769293 164.554773\nv 190.182864 154.770630 163.754204\nv 189.627978 154.769726 162.960747\nv 182.604207 154.501059 187.506359\nv 183.509417 154.518786 187.203263\nv 182.572044 154.442484 188.251801\nv 182.995363 154.391378 188.851505\nv 185.279030 154.609491 185.543700\nv 184.351844 154.627657 185.566816\nv 184.651859 154.569948 186.286792\nv 186.060579 154.594902 185.487084\nv 185.760564 154.652610 184.767108\nv 185.687081 154.360367 188.617789\nv 184.782697 154.377232 188.678838\nv 185.448354 154.299999 189.429048\nv 186.555851 154.581932 185.463045\nv 186.074317 154.538813 186.239637\nv 187.267094 154.312568 188.595666\nv 186.432498 154.343739 188.566654\nv 187.187334 154.251962 189.397011\nv 188.545629 154.524856 185.203382\nv 187.317327 154.554725 185.447493\nv 187.797891 154.495974 185.971487\nv 189.089857 154.292646 187.896094\nv 188.200099 154.293904 188.395092\nv 188.911688 154.219533 188.927025\nv 190.744174 154.251302 187.327662\nv 190.034215 154.270398 187.592089\nv 190.511405 154.199179 188.163599\nv 190.763878 154.366571 185.762874\nv 190.143482 154.438363 185.248486\nv 189.646588 154.394313 186.241764\nv 192.398919 154.146255 187.348207\nv 191.568235 154.211602 187.197954\nv 192.052048 154.114736 188.049425\nv 192.110572 154.348379 184.836566\nv 191.587939 154.326871 185.633166\nv 192.437739 154.264629 185.700136\nv 195.099566 153.929618 187.554659\nv 193.894022 154.026896 187.459594\nv 196.948340 153.744100 187.685858\nv 196.073788 153.836688 187.634712\nv 198.357102 153.689893 186.462768\nv 197.589206 153.787907 186.222039\nv 197.621653 153.720531 187.120344\nv 196.928209 154.082110 182.760056\nv 196.251890 154.150640 182.717657\nv 196.162703 154.107959 183.538402\nv 199.936227 153.602786 185.103958\nv 199.116227 153.706149 184.954547\nv 199.144655 153.653907 185.713873\nv 201.491454 153.477562 184.035371\nv 200.685133 153.587938 183.831193\nv 200.714121 153.544653 184.548810\nv 199.344379 153.948794 180.339796\nv 198.459517 154.013992 181.104166\nv 199.163455 153.929056 181.099662\nv 202.478515 153.367515 183.693052\nv 202.022715 153.458291 183.101213\nv 201.918267 153.430070 183.909593\nv 200.612749 153.815120 179.779179\nv 199.922328 153.903134 179.798809\nv 200.738738 153.775844 180.315662\nv 203.765777 153.213258 183.144956\nv 203.227154 153.319718 182.569512\nv 203.121586 153.289276 183.460116\nv 202.094573 153.629634 179.494044\nv 201.433543 153.725677 179.441246\nv 202.090189 153.591788 180.348830\nv 205.426088 153.028763 181.670963\nv 204.689381 153.159112 181.313792\nv 204.608053 153.113350 182.611523\nv 204.071785 153.391603 178.117228\nv 203.416191 153.457329 178.853315\nv 203.406813 153.430020 179.665542\nv 206.234610 152.956977 180.300617\nv 206.243105 152.977250 179.749777\nv 205.515911 153.094799 179.822392\nv 204.752982 153.311665 177.286131\nv 204.743604 153.284356 178.098357\nv 207.050717 152.856145 179.230556\nv 206.332018 152.993967 178.752330\nv 205.572997 153.207972 176.222690\nv 204.917216 153.332400 175.391595\nv 204.769018 153.328846 176.436165\nv 208.324016 152.631428 179.051695\nv 207.730334 152.735517 179.156686\nv 206.516095 153.056153 175.683011\nv 207.380495 152.909512 175.139520\nv 209.429767 152.459804 177.803987\nv 208.797700 152.589010 177.450150\nv 208.959061 152.535479 178.376963\nv 210.689365 152.233411 176.587000\nv 210.044845 152.352040 177.226839\nv 209.647016 152.483400 173.986989\nv 208.956153 152.617563 174.582549\nv 209.678030 152.468165 174.536005\nv 211.946964 151.986544 175.012727\nv 211.321478 152.113299 175.905564\nv 213.342583 151.672944 174.465571\nv 212.613354 151.837937 174.540563\nv 212.209330 151.928804 171.654588\nv 211.374662 152.122461 172.037018\nv 212.449135 151.875260 172.489753\nv 214.592477 151.369373 172.682213\nv 213.942238 151.529331 173.564473\nv 211.337140 152.104998 169.430983\nv 211.587830 152.060291 170.253037\nv 211.967221 151.954035 168.835424\nv 212.748451 151.771189 169.180855\nv 214.302253 151.393957 169.787164\nv 213.957366 151.511671 171.235411\nv 214.303096 151.360398 168.304867\nv 215.203610 151.130115 168.276535\nv 181.854434 150.749126 214.684109\nv 182.723612 150.573890 215.493589\nv 181.828624 150.921390 213.836806\nv 183.688877 150.713244 214.760051\nv 183.663036 150.542997 215.567514\nv 185.506320 150.442709 215.841465\nv 184.348878 150.413281 216.132652\nv 185.226897 150.173640 217.140142\nv 187.643212 150.694902 214.260642\nv 186.732552 150.751336 214.183408\nv 187.390260 150.535904 215.065386\nv 188.987738 150.178500 216.396647\nv 188.246879 150.163907 216.657602\nv 189.014213 150.049321 217.005694\nv 189.623193 150.761704 213.440740\nv 188.579954 150.693916 214.050300\nv 189.344159 150.547259 214.533060\nv 191.003113 150.180113 215.796055\nv 189.929834 150.203809 216.025343\nv 190.828352 150.040218 216.515452\nv 191.500276 150.731045 212.976742\nv 190.531495 150.745763 213.242190\nv 191.356179 150.600329 213.658052\nv 192.941751 150.088015 215.537400\nv 191.942511 150.100141 215.869201\nv 192.900871 150.004396 215.954363\nv 193.455506 150.747882 212.091879\nv 192.511045 150.772344 212.364364\nv 193.269421 150.561150 213.120120\nv 194.785501 150.023873 215.072625\nv 193.964419 150.129823 214.927246\nv 194.721193 149.886319 215.767942\nv 195.303186 150.682430 211.583964\nv 194.323913 150.665695 212.150760\nv 195.193156 150.553423 212.280839\nv 196.676154 150.019167 214.164377\nv 195.699898 149.988781 214.816531\nv 196.518531 149.810754 215.261168\nv 197.105009 150.545321 211.309247\nv 196.235880 150.664986 211.194977\nv 197.041557 150.450492 211.828313\nv 198.581365 149.972136 213.315071\nv 197.620280 149.991649 213.790644\nv 198.455872 149.821627 214.133442\nv 198.988000 150.569993 210.020161\nv 198.025524 150.524157 210.868983\nv 198.873162 150.376662 211.093762\nv 200.539980 149.916729 212.326483\nv 199.531621 149.940129 212.890771\nv 200.425316 149.778715 213.093581\nv 200.867871 150.517721 208.961056\nv 199.938742 150.584116 209.274148\nv 200.764767 150.356103 209.931849\nv 202.460507 149.759455 211.733237\nv 201.498124 149.887176 211.810523\nv 202.396058 149.627594 212.452006\nv 202.711384 150.401718 208.148502\nv 201.761139 150.414196 208.867910\nv 202.644141 150.277231 208.899349\nv 204.363763 149.528533 211.379263\nv 203.414721 149.670981 211.444483\nv 204.307482 149.357425 212.309501\nv 204.559638 150.256223 207.304198\nv 203.670298 150.408535 207.276350\nv 204.483725 150.112441 208.207789\nv 206.242064 149.487144 209.909605\nv 205.297004 149.460754 210.924842\nv 206.201583 149.241366 211.229044\nv 206.377220 150.098736 206.452159\nv 205.433562 150.110230 207.328485\nv 206.316723 149.948637 207.359310\nv 208.052246 149.462811 208.217595\nv 207.157507 149.446265 209.246380\nv 208.041383 149.284302 209.185022\nv 208.838241 149.825475 205.317751\nv 207.990106 150.100192 204.674468\nv 208.213825 149.893864 205.624179\nv 210.806725 149.110750 207.035109\nv 209.937973 149.363798 206.649527\nv 211.775295 149.073744 206.016329\nv 212.245208 149.141567 205.029904\nv 209.567941 149.686208 205.294780\nv 209.968661 149.442850 206.176751\nv 211.651836 148.769381 207.878672\nv 211.720474 148.925184 206.929604\nv 212.524221 149.407610 203.087958\nv 212.404628 149.272595 204.049307\nv 213.113660 149.278007 203.024073\nv 213.435402 148.695346 205.971108\nv 214.196517 148.573842 205.618240\nv 213.436342 148.759432 205.593749\nv 214.944601 148.381663 205.635753\nv 214.943661 148.317577 206.013112\nv 215.138869 148.702029 203.429768\nv 213.954486 149.017550 203.305837\nv 216.259011 148.253926 204.376766\nv 217.143741 148.121601 203.741076\nv 216.247563 148.379625 203.597593\nv 215.527289 148.318674 205.131954\nv 217.946945 147.986090 203.196265\nv 217.118227 148.377215 202.163589\nv 181.724155 149.642781 219.832300\nv 181.726854 149.834848 218.975517\nv 181.733538 149.420961 220.758782\nv 182.658873 149.427663 220.714399\nv 181.750384 149.216050 221.600190\nv 181.703662 149.037344 222.345868\nv 182.667618 149.002818 222.478807\nv 183.720035 149.512745 220.270360\nv 183.729418 149.290925 221.196843\nv 184.704591 148.900271 222.742456\nv 183.615315 148.952509 222.608593\nv 183.756256 148.747555 223.450597\nv 186.205652 149.620681 219.531291\nv 185.101299 149.587080 219.829926\nv 185.894932 149.409607 220.454168\nv 187.414941 148.916943 222.255827\nv 186.449787 148.872567 222.621994\nv 187.402190 148.803699 222.731377\nv 188.318530 149.638738 219.056068\nv 187.293751 149.625590 219.327752\nv 188.024065 149.456357 219.883848\nv 189.439616 148.951862 221.674292\nv 188.533686 149.001510 221.685296\nv 189.273274 148.798427 222.354207\nv 190.226195 149.609149 218.697640\nv 189.226182 149.626394 218.900661\nv 190.048857 149.452261 219.409142\nv 191.289800 148.855532 221.568414\nv 190.386628 148.918365 221.571094\nv 191.082376 148.685946 222.340524\nv 192.337170 149.575976 218.167839\nv 191.303064 149.595092 218.439243\nv 192.082976 149.415899 218.934718\nv 193.297200 148.869203 220.833267\nv 192.293820 148.837081 221.326786\nv 192.988928 148.655236 221.844326\nv 194.339371 149.529098 217.598218\nv 193.645875 149.546734 217.798696\nv 193.810579 149.379147 218.462836\nv 195.026449 148.826373 220.327888\nv 194.425253 148.847911 220.486144\nv 194.593504 148.665820 221.192552\nv 196.138123 149.452086 217.133241\nv 194.933640 149.493160 217.503980\nv 195.708557 149.320438 217.891619\nv 197.708948 148.718214 219.512764\nv 195.863327 148.799494 220.070193\nv 197.040320 148.563003 220.476867\nv 198.147521 149.392305 216.360732\nv 197.084223 149.407364 216.869278\nv 197.976337 149.264306 217.012334\nv 199.417410 148.635383 218.961143\nv 198.898397 148.673793 219.084543\nv 199.404954 148.443314 219.796038\nv 200.068371 149.284014 215.713421\nv 199.123485 149.391541 215.811450\nv 199.984521 149.141720 216.405759\nv 200.943639 148.497901 218.643381\nv 200.428686 148.542302 218.767320\nv 200.438919 148.360503 219.548699\nv 202.003711 149.186580 214.889889\nv 201.049315 149.222193 215.379191\nv 201.883803 148.998579 215.818428\nv 203.282221 148.412555 217.451561\nv 201.812718 148.544042 217.863134\nv 202.423375 148.184616 219.013186\nv 203.923402 149.010141 214.299028\nv 202.969006 149.111139 214.562173\nv 203.792595 148.861967 215.065981\nv 207.132023 148.019220 216.175423\nv 206.264298 148.019504 216.905946\nv 207.075916 147.845773 216.990594\nv 205.888229 148.800220 213.679476\nv 204.901304 148.905219 214.023339\nv 205.733917 148.655970 214.458974\nv 208.961321 147.874727 215.173961\nv 208.061351 147.972170 215.570963\nv 208.843611 147.748046 215.863069\nv 207.685195 148.643541 212.815812\nv 206.914630 148.723205 213.147015\nv 207.491406 148.471306 213.783909\nv 211.609135 147.486413 214.312818\nv 210.885161 147.763430 213.752269\nv 210.723378 147.658691 214.432401\nv 208.070662 148.898873 211.200003\nv 208.152650 148.673077 212.218253\nv 209.114892 148.676511 211.239337\nv 211.094510 148.201087 211.451571\nv 210.097558 148.433791 211.390230\nv 210.193833 148.218011 212.318927\nv 213.034300 147.333374 213.439400\nv 212.377737 147.370266 214.001348\nv 211.756772 148.596318 208.666910\nv 210.868161 148.685907 209.253526\nv 211.886846 148.327278 209.936259\nv 212.865353 148.054109 210.140818\nv 211.976742 148.143698 210.727434\nv 213.987522 147.588218 211.055695\nv 213.019647 147.693948 211.720391\nv 214.051919 147.411637 211.844093\nv 214.891369 148.160390 206.923276\nv 215.995652 147.350285 209.624656\nv 217.090071 147.192457 208.903973\nv 216.036882 147.541134 208.570663\nv 214.981129 147.502434 210.235371\nv 216.359231 147.597165 207.850467\nv 217.155211 147.550073 206.932643\nv 217.905220 146.833454 209.563334\nv 218.761597 146.456696 210.207451\nv 181.833955 151.779147 209.230964\nv 183.551724 151.788052 209.099521\nv 182.843524 151.814342 209.013938\nv 183.477204 151.648421 209.863526\nv 185.076618 151.261183 211.795544\nv 184.535568 151.157153 212.437664\nv 185.356465 151.057432 212.863245\nv 185.429134 151.808363 208.762492\nv 184.443336 151.789905 209.004713\nv 185.171202 151.640589 209.706888\nv 186.723584 151.282911 211.391563\nv 185.894029 151.236747 211.811342\nv 186.727071 151.207626 211.801346\nv 187.227683 151.794615 208.482853\nv 186.318057 151.793489 208.688321\nv 187.066626 151.660172 209.259200\nv 188.485266 151.302134 210.875544\nv 187.637479 151.336131 210.911443\nv 188.404414 151.219793 211.345668\nv 188.990506 151.747526 208.284122\nv 188.101028 151.764072 208.449716\nv 188.865730 151.644752 208.888139\nv 190.231951 151.253280 210.623668\nv 189.372723 151.294117 210.677080\nv 190.111428 151.144960 211.256357\nv 190.755953 151.700406 207.962935\nv 189.840824 151.697822 208.305407\nv 190.670337 151.630790 208.380073\nv 192.068768 151.241527 210.009274\nv 191.125357 151.238192 210.401412\nv 191.914066 151.107458 210.810807\nv 192.546397 151.671618 207.401420\nv 191.712307 151.745730 207.346570\nv 192.419555 151.559261 208.092451\nv 193.881886 151.195175 209.468522\nv 192.975909 151.223071 209.737633\nv 193.763453 151.082897 210.149557\nv 194.407276 151.714105 206.230678\nv 193.476866 151.692815 206.816000\nv 194.184055 151.506438 207.561979\nv 195.694171 151.154000 208.767913\nv 194.788592 151.182446 209.098202\nv 195.575009 151.026554 209.550156\nv 196.134078 151.622944 205.817694\nv 195.216188 151.632025 206.307767\nv 196.032355 151.518647 206.486584\nv 197.447530 151.049978 208.315904\nv 196.537184 151.071382 208.766677\nv 197.390933 150.976703 208.769093\nv 197.890165 151.562911 205.037599\nv 197.020901 151.608752 205.352963\nv 197.819509 151.463724 205.681147\nv 199.317645 151.010849 207.286104\nv 198.447362 151.115631 207.293586\nv 199.171563 150.850516 208.310837\nv 199.630235 151.474535 204.294430\nv 198.764787 151.528936 204.624762\nv 199.554220 151.363483 205.035451\nv 201.041959 150.788718 207.278545\nv 200.148691 150.892244 207.371691\nv 200.935114 150.642208 208.210209\nv 201.407750 151.340619 203.643674\nv 200.511370 151.441470 203.788426\nv 201.316048 151.208230 204.560367\nv 202.876910 150.684453 206.354835\nv 201.917995 150.677636 207.226987\nv 202.787296 150.545500 207.244911\nv 203.247446 151.196492 202.877663\nv 202.310307 151.243771 203.470576\nv 203.149566 151.060100 203.822703\nv 204.686155 150.495321 205.794712\nv 203.812231 150.641315 205.770424\nv 204.620135 150.406323 206.397046\nv 205.133899 151.099220 201.510051\nv 204.223400 151.184583 201.937371\nv 204.997203 150.927458 202.802471\nv 206.004130 150.961156 201.487141\nv 206.779352 150.712407 202.189580\nv 208.056931 150.206723 203.928620\nv 208.849508 150.107349 203.592565\nv 208.291917 150.282269 203.153146\nv 209.579209 149.968082 203.569594\nv 209.344222 149.892536 204.345069\nv 211.373377 149.640283 203.222533\nv 210.502745 149.815818 203.326985\nv 211.232550 150.229912 199.471593\nv 210.302010 150.419626 199.532171\nv 213.300400 149.529737 201.113925\nv 212.469983 149.841371 200.229316\nv 212.402836 149.724656 201.178114\nv 213.321472 149.781091 199.274250\nv 212.423907 149.976010 199.338439\nv 214.916424 149.216462 200.586130\nv 214.306585 149.435725 200.059381\nv 213.977386 149.427190 200.691875\nv 215.300525 149.806796 195.448125\nv 216.279997 149.562694 195.309540\nv 214.389868 149.900323 196.458338\nv 216.321240 149.322780 197.130096\nv 216.298555 149.444838 196.225234\nv 215.120278 149.614323 197.269068\nv 218.761597 148.701122 196.828980\nv 199.188655 134.630844 161.203913\nv 183.048496 129.497610 221.934164\nv 187.877445 126.168388 232.028298\nv 183.185365 127.978920 227.178786\nv 185.797732 127.765697 227.576774\nv 187.843522 127.719263 227.380601\nv 189.896957 127.662897 227.096738\nv 192.216770 127.797747 225.974704\nv 191.854041 127.597035 226.748082\nv 193.117283 127.712700 225.947856\nv 196.904439 127.719852 224.329123\nv 197.839993 127.433246 224.797209\nv 200.627585 127.221765 223.968475\nv 199.777856 127.179621 224.595317\nv 199.665183 127.435679 223.804502\nv 200.209835 126.901761 225.287722\nv 195.207694 135.454819 169.496890\nv 194.231712 135.552080 169.417067\nv 195.495197 135.435610 170.412421\nv 193.529946 135.620038 170.093918\nv 194.082961 135.576008 170.790477\nv 193.032229 135.668852 170.656590\nv 192.808982 135.688010 171.519470\nv 195.363402 135.387602 176.347982\nv 195.620688 135.387145 175.268616\nv 191.141184 135.810119 171.946608\nv 193.136639 135.551447 177.624025\nv 191.061614 135.654750 179.041150\nv 191.301762 135.672416 178.120806\nv 189.368750 135.913549 172.644144\nv 190.351937 135.689472 179.288356\nv 189.539224 135.703181 180.040406\nv 189.541690 135.741195 179.137552\nv 187.614855 135.988628 173.563612\nv 185.535743 135.961502 177.959533\nv 186.483323 135.904119 178.574112\nv 187.418246 135.854904 178.851868\nv 188.539697 135.802773 179.010190\nv 187.607526 135.807036 179.731280\nv 186.901960 135.801303 180.528974\nv 186.068055 135.835515 180.392542\nv 186.483941 135.777650 181.348558\nv 185.859383 136.040022 174.384003\nv 184.329675 135.860152 180.863345\nv 183.793201 135.895228 180.300138\nv 182.999667 135.929422 179.835722\nv 182.383354 135.901191 180.471459\nv 195.398666 135.241582 163.571145\nv 195.203379 135.321623 164.576082\nv 191.552126 135.646970 164.679173\nv 191.076123 135.708412 165.515445\nv 187.684411 135.920711 166.245966\nv 186.885519 135.952728 166.159307\nv 186.180395 135.985478 166.519806\nv 185.367527 136.022170 166.994476\nv 186.223829 136.003303 167.366528\nv 184.485865 133.338614 204.083364\nv 183.764904 133.282043 204.497411\nv 185.102721 133.228207 204.618732\nv 186.624877 133.238363 204.231373\nv 188.306138 133.242203 203.730554\nv 189.906322 133.233929 203.208008\nv 191.488811 133.138218 203.101560\nv 194.057424 132.848172 203.506637\nv 193.043587 132.902632 203.746930\nv 193.337773 132.996768 203.000394\nv 193.668673 133.119677 202.063724\nv 193.858272 133.249666 201.134598\nv 193.117650 133.427005 200.481981\nv 197.561293 132.633566 202.397016\nv 197.347959 132.801434 201.509687\nv 198.989034 132.801780 200.127137\nv 200.638635 132.729189 199.021211\nv 202.361863 132.592057 198.074572\nv 204.091526 132.420639 197.137552\nv 205.817396 132.226961 196.122666\nv 207.519158 132.019046 194.994657\nv 209.181220 131.803584 193.716489\nv 211.590404 131.331591 192.708445\nv 210.825679 131.557848 192.402949\nv 212.527404 131.441243 189.266379\nv 217.333056 130.443164 183.282181\nv 182.197779 134.888049 193.138222\nv 184.089082 134.910352 192.668140\nv 185.866189 134.905281 192.294815\nv 187.628757 134.878078 191.920858\nv 189.446526 134.828880 191.494837\nv 192.561382 134.708656 190.578900\nv 193.382529 134.657576 190.412505\nv 193.605129 134.727294 189.507038\nv 195.106874 134.645510 188.863019\nv 196.665621 134.532843 188.284546\nv 198.113047 134.421571 187.596813\nv 199.535458 134.308980 186.731260\nv 201.006681 134.171799 185.806209\nv 202.497678 134.007916 184.849377\nv 203.993535 133.826303 183.772034\nv 205.475535 133.622235 182.636529\nv 206.795254 133.421575 181.485330\nv 207.900607 133.251299 180.107895\nv 209.986135 132.820219 178.879220\nv 209.099732 133.035973 178.642281\nv 213.233721 132.030895 172.575951\nv 213.565739 131.926237 171.841795\nv 181.746028 134.259896 198.264343\nv 182.496223 134.137292 199.076681\nv 184.281342 134.143989 198.797246\nv 186.104184 134.138796 198.455954\nv 187.909529 134.116470 198.072328\nv 189.558637 134.077238 197.703734\nv 190.233937 133.966356 198.221643\nv 191.090270 133.955374 197.843918\nv 193.355380 133.832986 197.428813\nv 193.989587 133.826803 197.030698\nv 193.945529 133.937746 196.205986\nv 195.539176 133.898569 195.267677\nv 197.154289 133.816384 194.474452\nv 198.740503 133.715097 193.672386\nv 200.326681 133.605978 192.713215\nv 201.910283 133.479171 191.665213\nv 203.467572 133.326729 190.652658\nv 204.981179 133.152684 189.673086\nv 206.436947 132.966281 188.627536\nv 207.814131 132.781729 187.433959\nv 209.170944 132.594755 185.987071\nv 210.535184 132.386876 184.333112\nv 211.763981 132.176090 182.671763\nv 212.883844 131.949479 181.192482\nv 205.631022 133.845353 168.318318\nv 204.746393 134.021588 168.249626\nv 201.036313 134.723894 173.216544\nv 200.173427 134.847924 173.659609\nv 200.252706 134.839707 172.855781\nv 203.038420 134.378950 169.723433\nv 203.904149 134.218779 169.707331\nv 203.662394 134.293811 171.836101\nv 203.198994 134.368273 171.220487\nv 199.291235 134.840370 165.255340\nv 200.181878 134.710993 165.453518\nv 196.561437 135.276837 167.872464\nv 183.754434 135.493690 186.575838\nv 185.522973 135.495747 186.035805\nv 192.006836 135.276243 184.489293\nv 192.723118 135.206009 184.732933\nv 193.427331 135.119331 185.119365\nv 194.982289 135.020039 184.503025\nv 195.089043 135.062893 183.720188\nv 196.851754 134.969394 182.195411\nv 199.187492 134.674799 182.359070\nv 198.530268 134.793770 181.692210\nv 200.803285 134.586696 179.535087\nv 203.038718 134.239755 179.552783\nv 202.345368 134.378095 178.836811\nv 204.108211 134.148645 176.558115\nv 205.166613 133.967203 175.765782\nv 205.944634 133.832010 174.385240\nv 206.950880 133.628570 173.021120\nv 183.984764 130.895826 216.351466\nv 185.860737 130.868088 216.220264\nv 187.789495 130.869459 215.821016\nv 189.738617 130.877583 215.255973\nv 191.672753 130.876632 214.597468\nv 193.581535 130.878577 213.796385\nv 195.333091 130.853696 213.056601\nv 197.577927 131.097790 210.632880\nv 200.610545 130.409049 211.723909\nv 199.893591 130.658262 211.092343\nv 201.602725 130.332827 211.311764\nv 202.531243 130.269393 210.855424\nv 201.757707 130.514660 210.332716\nv 203.435471 130.191204 210.430514\nv 203.640599 130.352120 209.476223\nv 205.551853 130.121642 208.721646\nv 207.517398 129.829989 208.041242\nv 210.243626 129.360794 207.117919\nv 209.375728 129.440526 207.804193\nv 209.393961 129.589976 207.028989\nv 211.190145 129.533045 204.921063\nv 210.360100 129.663460 205.406500\nv 213.476932 129.075522 203.914708\nv 214.124745 128.875709 203.968588\nv 213.872964 128.814098 204.703828\nv 212.947796 129.324929 203.389111\nv 185.784676 129.506747 221.634338\nv 188.580384 129.393202 221.500743\nv 190.539946 129.387162 220.982162\nv 192.519373 129.359460 220.411842\nv 194.500413 129.339746 219.680212\nv 196.417477 129.314654 218.866040\nv 198.252687 129.231324 218.197736\nv 200.655305 128.747721 218.581896\nv 201.598763 128.643083 218.344498\nv 199.725193 128.860578 218.749978\nv 200.085760 129.053285 217.767536\nv 199.906640 129.710024 215.292488\nv 205.493811 128.395231 216.276773\nv 204.616553 128.480328 216.672728\nv 204.787974 128.703030 215.629486\nv 206.583791 128.320470 215.585873\nv 206.639358 128.578518 214.480128\nv 209.534355 127.977942 214.038226\nv 208.649744 128.344225 213.440105\nv 211.817028 127.921066 211.615869\nv 212.665834 127.757622 211.268378\nv 210.928529 128.103836 211.904537\nv 210.019654 128.294762 212.157042\nv 213.499478 127.562945 211.008395\nv 214.202813 127.408507 210.717284\nv 212.963950 127.879961 210.323280\nv 215.748110 127.671410 207.244699\nv 182.656438 132.320507 209.845227\nv 182.992857 132.154227 210.617746\nv 185.118303 132.121781 210.557130\nv 187.072737 132.121531 210.198608\nv 188.975475 132.137315 209.605950\nv 190.812996 132.133577 208.987218\nv 192.627720 132.075348 208.512878\nv 194.506738 131.949346 208.194787\nv 194.917031 131.777510 208.860958\nv 196.743723 132.274798 205.155229\nv 198.932997 131.851850 205.815325\nv 200.591818 131.607017 205.794085\nv 200.885637 131.429694 206.519201\nv 202.077996 131.497725 205.083169\nv 205.264710 131.098281 204.029044\nv 205.066897 131.286294 203.171175\nv 210.966800 130.592804 199.202951\nv 213.256062 130.284009 197.070789\nv 212.328712 130.590657 196.759097\nv 213.881296 130.232581 196.155425\nv 213.651844 130.419303 195.275493\nv 214.781474 130.284868 193.661187\nv 165.418725 135.146964 178.350090\nv 165.326685 135.163851 177.387052\nv 164.558365 133.388079 197.127574\nv 180.128745 130.618834 217.658033\nv 179.763407 133.986397 200.127116\nv 147.130070 130.929442 162.877148\nv 158.033703 123.784685 231.538671\nv 173.949778 126.151042 231.940568\nv 178.569341 126.487547 231.658580\nv 177.710980 126.450044 231.686670\nv 158.230998 125.568835 226.733200\nv 157.584488 125.644423 226.052323\nv 158.741773 127.367091 221.363855\nv 158.578335 127.576215 220.511202\nv 160.936761 127.374932 222.854263\nv 159.864264 129.555134 213.917118\nv 160.243848 129.421418 214.765456\nv 161.935796 127.584685 222.765653\nv 161.107158 128.956923 217.258290\nv 162.054866 129.210039 216.891197\nv 162.130628 131.177575 208.297736\nv 166.922687 127.436730 225.861780\nv 165.973483 127.334707 225.767418\nv 166.577263 127.613803 225.121347\nv 165.376648 126.995342 226.596469\nv 164.050932 128.940923 219.172520\nv 163.979079 129.200158 218.140747\nv 165.034946 128.982850 219.590981\nv 164.033473 131.309295 209.017357\nv 163.396439 132.381570 202.704332\nv 165.139905 132.494724 203.418855\nv 165.068582 130.879516 211.739417\nv 165.922352 129.225385 219.116010\nv 168.324981 127.971376 224.687744\nv 168.484225 127.759391 225.448307\nv 167.234640 127.961881 224.270627\nv 168.033155 128.217433 223.742662\nv 166.401487 135.386650 171.893835\nv 163.453214 134.659581 182.989554\nv 162.701656 134.541519 183.259658\nv 159.979178 133.733230 188.280859\nv 156.285105 131.807080 198.592221\nv 154.788466 130.522808 204.295211\nv 152.856139 128.985231 209.619271\nv 164.281819 134.467206 186.919107\nv 163.497349 134.413542 186.340519\nv 161.439403 133.151583 195.634562\nv 163.251084 134.032070 190.244978\nv 159.756584 132.112112 200.886489\nv 158.411815 130.868326 206.520554\nv 156.100310 129.310049 211.676219\nv 153.835720 127.648760 216.166833\nv 154.783542 127.728684 216.785651\nv 153.979129 127.404277 217.219405\nv 164.849784 134.157560 191.066728\nv 161.603430 132.244469 201.924048\nv 163.002977 133.281838 196.380920\nv 160.242056 131.026178 207.474306\nv 157.862375 129.416074 212.845619\nv 159.062374 128.364712 218.050027\nv 158.157502 127.979738 218.753242\nv 156.007436 127.663175 218.111546\nv 155.741931 127.855272 217.182172\nv 157.209693 128.534767 215.857134\nv 158.380069 128.727645 216.083294\nv 157.919494 129.236599 213.641921\nv 161.619999 133.892291 189.278914\nv 160.031089 133.003528 195.034011\nv 157.950176 131.963823 199.734050\nv 156.636085 130.712035 205.444089\nv 154.452952 129.159262 210.655682\nv 152.921613 127.530855 215.708446\nv 148.353462 128.194061 207.217516\nv 150.211807 129.180601 205.109091\nv 150.745032 129.187007 205.880064\nv 152.997539 131.397521 196.323837\nv 156.261644 132.704397 191.615907\nv 156.861895 133.351632 186.215781\nv 159.624079 134.188128 181.286421\nv 162.412360 134.822332 176.381907\nv 164.903075 135.210302 170.833366\nv 147.509377 124.139440 221.471071\nv 149.810458 128.386214 208.425447\nv 149.083691 128.296262 207.821559\nv 152.216933 130.022987 203.583751\nv 152.911262 130.271719 203.197943\nv 154.678462 131.629380 197.466474\nv 157.779092 132.850785 192.946520\nv 158.369132 133.548610 187.264655\nv 161.147088 134.376651 182.204108\nv 163.876108 134.993289 177.394342\nv 164.574874 135.085988 177.051832\nv 168.853295 135.424768 163.686511\nv 167.937072 135.325271 163.537728\nv 170.488052 135.322773 159.531753\nv 165.928203 134.783218 185.522033\nv 169.799965 135.659203 175.331176\nv 170.554950 135.728088 174.904767\nv 168.063911 134.361067 192.388495\nv 166.055942 133.462746 197.886685\nv 168.812917 134.848562 188.202228\nv 169.027858 134.939372 187.483982\nv 170.565003 135.513907 180.879001\nv 168.437791 134.958931 186.518508\nv 172.563023 135.097062 188.583861\nv 174.043656 135.621137 182.828030\nv 174.149115 135.561970 183.717510\nv 172.909675 135.381267 185.220021\nv 172.766302 135.430739 184.454240\nv 173.672686 135.452811 184.860219\nv 174.946920 135.678769 182.444842\nv 167.789261 135.373402 178.708673\nv 167.061031 135.284772 179.257107\nv 169.105229 135.627858 170.081499\nv 172.090453 135.814364 167.319549\nv 172.801828 135.861056 167.519463\nv 166.434318 134.266786 191.745833\nv 171.017951 135.787357 171.682077\nv 171.110599 135.789347 172.590965\nv 173.765447 127.797884 226.947510\nv 173.893361 129.362158 221.597846\nv 174.829011 130.832615 215.999212\nv 175.445612 132.133626 210.141357\nv 175.833826 133.217432 204.340232\nv 176.440521 134.133734 198.506288\nv 177.025855 125.885572 233.229804\nv 177.700707 128.000533 226.960963\nv 176.762485 127.863981 227.279387\nv 176.927913 128.150049 226.370127\nv 176.431526 129.349187 222.171986\nv 176.841632 130.805713 216.510840\nv 179.008249 130.547596 217.875087\nv 178.164903 130.569373 217.699703\nv 178.679925 130.766272 216.921121\nv 177.395645 132.097678 210.696819\nv 179.499727 131.905718 211.884890\nv 178.660513 131.927335 211.709743\nv 179.207255 132.056097 211.120783\nv 177.574929 133.169361 204.983730\nv 179.388119 132.984840 206.299892\nv 178.563116 133.018943 206.023582\nv 179.260096 133.107874 205.564646\nv 178.045824 134.117311 198.964904\nv 179.073344 134.003192 199.943313\nv 179.536539 134.092435 199.342732\nv 178.199395 134.884582 192.857596\nv 179.348205 134.782937 193.992583\nv 180.156294 134.870804 193.281308\nv 178.473535 135.469330 186.815038\nv 179.195809 135.899910 180.321428\nv 181.227509 135.875463 181.173184\nv 180.857732 135.908576 180.383491\nv 171.511833 127.603526 226.993468\nv 172.172728 127.812529 226.494217\nv 172.462962 129.198603 221.835137\nv 173.262011 129.199555 222.050054\nv 172.127778 129.370390 221.075026\nv 172.783033 130.839000 215.415359\nv 173.532191 132.157829 209.502555\nv 174.068492 133.245424 203.666406\nv 174.847119 134.142966 197.963927\nv 176.439610 134.916587 192.129601\nv 176.775248 135.379234 187.434325\nv 176.597922 135.448976 186.475553\nv 177.787444 135.842293 181.033146\nv 177.406952 135.875527 180.088228\nv 180.310803 136.114776 173.539484\nv 175.334253 135.968429 167.211867\nv 172.394332 135.593165 181.792981\nv 172.309480 135.829366 175.682135\nv 173.069241 135.886788 175.121179\nv 170.598225 135.067929 187.487796\nv 170.486788 134.550808 192.508189\nv 169.704492 134.430165 193.059074\nv 167.533507 133.508413 198.693841\nv 168.744609 133.012255 202.646172\nv 168.868749 133.174099 201.729477\nv 169.621591 133.111787 202.550639\nv 168.342298 132.028382 207.992737\nv 169.195420 132.021023 208.475025\nv 167.559374 132.036799 207.531154\nv 166.736897 132.050514 206.965537\nv 169.769913 129.108637 221.266476\nv 170.164203 129.291658 220.712134\nv 168.923170 130.825999 214.002709\nv 170.770108 130.830404 214.746885\nv 169.851160 132.302333 207.337182\nv 169.975957 132.169609 208.074241\nv 170.942734 132.021614 209.264776\nv 171.707051 132.168722 208.812081\nv 170.558023 133.388555 201.335830\nv 170.579621 133.259103 202.140742\nv 171.516895 133.111838 203.492282\nv 172.298804 133.248652 202.989506\nv 171.495275 134.075572 197.026781\nv 173.368749 134.130702 197.492083\nv 172.332454 134.919365 190.242725\nv 173.170801 134.997692 189.963066\nv 173.952564 135.349423 186.424808\nv 174.736941 135.418847 185.952697\nv 174.835309 135.961762 175.783256\nv 174.851401 135.777622 180.401730\nv 175.527471 135.839718 179.580637\nv 174.607644 135.971981 173.982344\nv 176.370855 136.028846 174.574997\nv 176.488734 136.021651 175.487062\nv 175.600627 135.998916 175.181490\nv 177.484283 136.066929 168.757499\nv 145.067393 130.489152 181.798898\nv 159.736887 134.436805 174.474641\nv 157.495411 134.024661 171.201025\nv 159.204231 134.204851 165.499854\nv 150.274243 132.239433 178.783806\nv 152.497151 132.876815 176.342523\nv 149.643963 132.028722 179.517321\nv 149.105324 131.842342 180.199876\nv 146.499713 130.619136 186.847330\nv 147.399184 130.883251 187.050721\nv 154.796710 133.406891 168.431185\nv 157.539234 133.934984 166.885999\nv 148.706664 131.662714 181.638077\nv 149.691157 131.918655 182.011947\nv 158.485551 134.217233 171.259956\nv 158.906464 134.236513 168.009442\nv 158.723420 134.216095 168.744442\nv 149.783208 131.705893 185.704931\nv 150.619626 131.941333 185.640712\nv 150.445558 131.828957 186.433324\nv 149.047555 131.485961 185.867621\nv 150.494711 132.135795 182.126887\nv 163.470159 135.009190 169.560233\nv 156.686547 133.726623 179.474290\nv 154.313362 133.002166 183.613718\nv 149.316039 130.730982 193.913277\nv 153.204710 132.329156 188.727683\nv 148.444428 129.895987 198.116010\nv 148.433185 130.436740 194.189641\nv 146.796902 128.660498 202.356866\nv 160.717251 134.537307 167.318671\nv 155.365136 133.498314 178.211053\nv 153.118310 132.823389 182.051105\nv 154.607885 133.324137 178.422566\nv 150.216934 131.689962 187.329830\nv 149.917007 131.527683 188.138807\nv 145.341417 129.242910 195.705069\nv 146.108764 129.562564 195.310538\nv 146.970380 127.573755 208.030252\nv 148.042327 129.220414 201.401464\nv 151.146092 131.072008 195.199815\nv 154.662961 132.512784 190.232016\nv 155.525859 133.167678 185.037810\nv 158.119612 133.967491 180.430437\nv 160.997587 134.625875 175.420377\nv 165.353789 135.179611 166.813819\nv 164.606673 135.098898 167.470974\nv 166.760972 135.389456 168.798028\nv 168.011239 135.535903 173.593722\nv 165.907741 134.712958 186.367702\nv 164.983226 131.913177 206.529175\nv 165.017410 132.071208 205.723566\nv 165.939604 132.074406 206.353914\nv 167.161992 130.797652 213.281686\nv 168.001179 129.240263 220.043171\nv 170.374436 127.809235 225.964238\nv 171.335279 126.607714 229.982466\nv 172.397490 126.631295 230.200709\nv 144.559663 143.704339 161.009638\nv 144.559663 142.418346 160.782881\nv 144.608872 140.174290 160.387191\nv 145.633665 139.991069 160.354895\nv 144.786390 139.348335 160.241553\nv 218.761597 140.817549 160.500607\nv 217.917643 140.530548 160.450007\nv 217.917643 141.816542 160.676764\nv 216.409776 136.398365 159.721422\nv 216.270159 137.315567 159.883127\nv 217.195166 137.026839 159.832219\nv 217.062776 142.590825 160.813300\nv 216.320805 142.111652 160.728800\nv 216.309892 143.172936 160.915935\nv 216.029112 140.483801 160.441768\nv 215.556589 139.900072 160.338844\nv 215.140202 140.569499 160.456873\nv 212.337967 135.307248 159.529009\nv 213.197361 135.607358 159.581907\nv 212.986965 138.029300 160.008983\nv 213.679320 137.348675 159.888945\nv 210.268736 151.262608 162.342346\nv 211.233401 151.212868 162.333580\nv 209.581369 147.039946 161.597792\nv 210.310310 146.487833 161.500438\nv 209.324977 146.316807 161.470284\nv 207.437342 138.492700 160.090700\nv 208.231089 138.788387 160.142838\nv 208.071765 137.763985 159.962205\nv 205.034816 150.264292 162.166312\nv 204.334350 149.683365 162.063893\nv 204.095279 150.780603 162.257358\nv 205.710594 144.335703 161.120974\nv 205.406311 143.303256 160.938925\nv 204.819241 144.219374 161.100445\nv 162.886724 140.543054 160.452240\nv 162.127607 139.851544 160.330300\nv 161.992746 140.787328 160.495302\nv 194.010006 137.603173 159.933840\nv 193.648485 136.927057 159.814618\nv 193.050399 137.569660 159.927923\nv 195.838908 147.978784 161.763326\nv 196.796944 148.150474 161.793624\nv 196.516259 147.079525 161.604777\nv 197.232612 146.393631 161.483857\nv 196.274576 146.221941 161.453558\nv 197.482874 138.189462 160.037237\nv 197.373564 138.898492 160.162248\nv 198.235356 138.957563 160.172651\nv 199.636037 148.259221 161.812789\nv 198.794362 148.188088 161.800258\nv 199.118477 149.034826 161.949558\nv 200.127469 144.988864 161.236149\nv 199.266620 144.955604 161.230272\nv 199.587413 145.776424 161.375013\nv 160.682596 147.557387 161.689013\nv 161.490767 148.136431 161.791132\nv 161.557109 147.154562 161.618002\nv 162.303472 148.895838 161.925059\nv 163.174318 149.377412 162.009987\nv 163.236125 148.215179 161.805050\nv 200.898494 146.652087 161.529420\nv 201.629150 146.554664 161.512229\nv 201.178919 145.712261 161.363699\nv 201.660908 152.528703 162.565646\nv 202.389998 152.761430 162.606672\nv 202.485507 151.661532 162.412720\nv 203.520724 139.671525 160.298531\nv 203.589452 138.664460 160.120968\nv 191.995108 142.641421 160.822209\nv 192.895932 142.342728 160.769542\nv 192.990869 140.699968 160.479879\nv 192.213585 140.035011 160.362635\nv 193.795965 141.299453 160.585585\nv 193.861810 140.408163 160.428428\nv 169.978405 146.467293 161.496832\nv 169.981779 147.362353 161.654662\nv 170.790791 146.835657 161.561800\nv 169.169510 143.150847 160.912039\nv 168.539101 142.727549 160.837416\nv 168.319864 143.414048 160.958466\nv 167.722795 148.882485 161.922694\nv 166.839921 148.847864 161.916588\nv 168.525680 149.241208 161.985941\nv 168.397700 148.448316 161.846141\nv 150.940835 134.677501 159.417957\nv 150.709243 135.606479 159.581761\nv 151.669807 135.394851 159.544443\nv 149.353871 139.710045 160.305328\nv 149.193742 138.695904 160.126523\nv 148.713533 139.497895 160.267934\nv 148.842735 145.233935 161.279362\nv 147.984980 145.366162 161.302664\nv 149.854543 145.008458 161.239615\nv 150.401739 145.949499 161.405536\nv 150.773725 144.996288 161.237456\nv 149.392746 143.333649 160.944285\nv 150.315907 143.025167 160.889900\nv 149.482123 142.303569 160.762649\nv 156.774426 135.292320 159.526411\nv 156.340948 136.201646 159.686750\nv 157.334184 136.255256 159.696202\nv 154.574979 143.538431 160.980408\nv 153.836012 143.206283 160.921846\nv 154.591331 151.730520 162.424854\nv 153.834579 151.573095 162.397106\nv 156.977903 145.305910 161.292036\nv 156.753960 144.585591 161.165031\nv 156.155391 145.108345 161.257201\nv 158.199625 136.252385 159.695691\nv 159.092062 136.345515 159.712095\nv 158.660100 135.439061 159.552268\nv 155.637928 148.251291 161.811369\nv 156.342163 148.732031 161.896150\nv 156.491363 150.555405 162.217674\nv 156.270827 149.579982 162.045667\nv 155.582598 150.178637 162.151221\nv 160.591280 143.911353 161.046138\nv 159.742111 143.447304 160.964331\nv 159.113002 146.504179 161.503346\nv 158.367378 146.059873 161.424997\nv 158.329768 146.964760 161.584553\nv 189.603786 143.021259 160.889194\nv 188.880418 142.956867 160.877839\nv 189.312646 143.731716 161.014466\nv 188.307921 142.432145 160.785316\nv 188.495440 141.536956 160.627471\nv 187.631802 141.722690 160.660220\nv 186.690964 141.999276 160.708988\nv 185.671569 142.449422 160.788357\nv 186.424888 143.068025 160.897435\nv 187.320690 143.492618 160.972307\nv 187.893187 144.017340 161.064829\nv 188.016780 143.142601 160.910588\nv 184.987908 141.662951 160.649688\nv 184.721832 142.731700 160.838135\nv 180.357501 141.213173 160.570380\nv 180.846116 140.196323 160.391086\nv 179.952306 140.434611 160.433098\nv 177.949691 142.677674 160.828594\nv 176.838501 142.898578 160.867550\nv 177.284789 143.746761 161.017116\nv 177.337950 149.884363 162.099332\nv 176.574077 149.417394 162.016994\nv 176.549313 150.351891 162.181769\nv 176.101743 141.097906 160.550061\nv 175.753963 140.238657 160.398551\nv 175.167520 141.119524 160.553872\nv 174.805202 142.818310 160.853414\nv 175.134352 143.812756 161.028760\nv 175.844450 142.973219 160.880727\nv 171.624010 148.151587 161.793818\nv 172.453957 147.635403 161.702772\nv 171.624112 147.214534 161.628584\nv 170.953481 143.042633 160.892967\nv 171.558165 143.681078 161.005532\nv 171.837216 142.737573 160.839174\nv 170.272358 153.086539 162.663989\nv 170.996828 152.462273 162.553908\nv 170.236235 152.281913 162.522114\nv 171.633862 149.130861 161.966485\nv 170.804018 148.709992 161.892296\nv 218.761597 137.120325 234.642516\nv 218.761597 137.736147 235.234743\nv 218.761597 136.879722 235.479670\nv 218.761597 142.194749 163.132964\nv 218.761597 141.148840 162.759599\nv 218.761597 142.194555 162.396070\nv 218.761597 148.816441 162.697306\nv 218.761597 147.530447 162.470549\nv 218.761597 148.533510 161.861149\nv 218.761597 145.263460 163.643831\nv 218.761597 144.043407 163.556617\nv 218.761597 136.037098 165.143181\nv 218.761597 134.929463 165.026987\nv 218.761597 136.416113 164.271914\nv 218.761597 136.982619 165.136984\nv 218.761597 134.791991 169.097972\nv 218.761597 135.656332 169.099388\nv 218.761597 135.527380 169.773342\nv 218.761597 144.815082 167.576258\nv 218.761597 145.672014 168.129641\nv 218.761597 144.641366 168.459393\nv 218.761597 141.499260 168.853961\nv 218.761597 140.597657 169.040757\nv 218.761597 140.871008 168.187190\nv 218.761597 143.215328 168.567965\nv 218.761597 143.863991 168.785083\nv 218.761597 143.294884 169.447038\nv 218.761597 141.936065 169.468724\nv 218.761597 142.626700 169.866500\nv 218.761597 141.916544 170.105304\nv 218.761597 143.999857 172.045676\nv 218.761597 144.439807 172.875455\nv 218.761597 143.535153 172.824940\nv 218.761597 142.030007 171.787582\nv 218.761597 141.785994 171.041541\nv 218.761597 123.828615 219.772157\nv 218.761597 124.705964 220.226860\nv 218.761597 123.921600 220.722501\nv 218.761597 132.517894 228.114639\nv 218.761597 132.412083 227.232271\nv 218.761597 133.525938 227.770159\nv 218.761597 125.548673 224.396912\nv 218.761597 126.768376 224.047748\nv 218.761597 142.936392 176.010456\nv 218.761597 143.588950 175.299686\nv 218.761597 143.899148 176.130012\nv 218.761597 136.464607 176.009381\nv 218.761597 136.164793 175.319689\nv 218.761597 136.923006 175.317877\nv 218.761597 147.511320 177.301180\nv 218.761597 146.582883 176.810712\nv 218.761597 147.389786 176.481477\nv 218.761597 143.158856 180.853771\nv 218.761597 142.637219 181.640608\nv 218.761597 138.112408 182.292523\nv 218.761597 138.549781 182.999289\nv 218.761597 137.076161 183.383247\nv 218.761597 138.024840 183.645251\nv 218.761597 137.249089 184.070940\nv 218.761597 135.738992 184.684870\nv 218.761597 136.660775 184.751005\nv 218.761597 136.099357 185.626939\nv 218.761597 134.687442 184.745127\nv 218.761597 135.248859 183.869193\nv 218.761596 133.776469 184.698234\nv 218.761596 134.266602 185.513911\nv 218.761597 141.430470 186.199921\nv 218.761597 141.737813 186.870447\nv 218.761597 140.796444 186.704093\nv 218.761597 133.608690 188.030906\nv 218.761597 134.753413 188.189537\nv 218.761597 134.165830 189.006895\nv 218.761597 139.792779 189.821981\nv 218.761597 138.810359 189.736460\nv 218.761597 139.611250 188.917274\nv 218.761597 143.329379 188.583958\nv 218.761597 143.315202 189.487377\nv 218.761597 142.455252 189.091263\nv 218.761597 137.146844 193.455836\nv 218.761597 137.903293 194.135360\nv 218.761597 141.554472 194.964051\nv 218.761597 141.578333 195.787169\nv 218.761597 140.709495 195.389461\nv 218.761597 133.581877 194.614656\nv 218.761597 133.086949 193.837665\nv 218.761597 134.148488 193.862470\nv 218.761597 138.211792 196.834457\nv 218.761597 138.978049 196.236377\nv 218.761597 135.729302 223.114523\nv 218.761597 135.873759 222.305436\nv 218.761597 136.558748 222.880211\nv 218.761597 134.249877 222.001749\nv 218.761597 134.331283 221.049142\nv 218.761597 135.125720 221.587140\nv 218.761597 137.318224 222.889838\nv 218.761597 137.616252 221.911547\nv 218.761597 138.231270 222.730260\nv 218.761597 140.387408 224.565465\nv 218.761597 140.742157 223.911736\nv 218.761597 141.194300 224.918858\nv 218.761597 139.454855 221.543114\nv 218.761597 138.856262 220.947948\nv 218.761597 139.781819 220.739092\nv 218.761597 132.487702 219.104193\nv 218.761597 132.657794 220.171257\nv 218.761597 131.647700 219.683213\nv 218.761597 139.989476 219.847281\nv 218.761597 139.180304 219.342025\nv 218.761597 139.986553 219.045380\nv 218.761597 135.525636 217.486429\nv 218.761597 134.536866 218.073378\nv 218.761597 134.617824 217.004619\nv 218.761597 129.707253 212.074457\nv 218.761597 128.941573 211.711874\nv 218.761597 136.616664 215.781846\nv 218.761597 137.518312 216.318791\nv 218.761597 136.508241 216.954615\nv 218.761597 133.713367 216.574701\nv 218.761597 132.755085 217.036105\nv 218.761597 132.839398 216.019238\nv 218.761597 131.083094 196.774472\nv 218.761597 130.471685 196.182533\nv 218.761597 131.397134 195.981167\nv 218.761597 147.364939 199.344634\nv 218.761597 147.615086 200.113207\nv 218.761597 146.679626 199.683335\nv 218.761597 146.175565 200.450109\nv 218.761597 145.925418 199.681537\nv 218.761597 135.396532 201.413359\nv 218.761597 134.539353 200.828679\nv 218.761597 135.307160 200.506612\nv 218.761597 141.040278 203.576943\nv 218.761597 142.059580 203.512155\nv 218.761597 141.590297 204.400040\nv 218.761597 139.469168 204.134109\nv 218.761597 139.084265 203.247766\nv 218.761597 140.186091 203.578486\nv 218.761597 134.366029 206.312369\nv 218.761597 134.189745 205.395604\nv 218.761597 135.060725 205.681452\nv 218.761597 139.797107 208.441240\nv 218.761597 138.903444 208.747059\nv 218.761597 142.731793 211.831759\nv 218.761597 142.788090 212.604682\nv 218.761597 141.921960 212.287874\nv 218.761597 134.166346 211.173697\nv 218.761597 134.963626 211.313577\nv 218.761597 134.560081 212.141695\nv 218.761597 136.048562 211.430113\nv 218.761597 136.947067 211.719911\nv 218.761597 136.255867 212.571374\nv 218.761597 134.609712 212.956478\nv 218.761597 133.812431 212.816598\nv 144.482640 126.636107 234.157083\nv 144.469577 127.923887 234.384152\nv 144.495063 130.015060 234.752875\nv 144.510764 129.288380 234.624744\nv 145.244230 129.569835 234.674361\nv 218.583496 138.846748 236.310150\nv 218.434777 138.514420 236.251551\nv 218.612877 138.456871 236.241404\nv 146.618475 130.270362 234.797898\nv 147.373796 130.202050 234.785852\nv 147.222259 130.929511 234.914123\nv 216.389988 131.205075 234.962710\nv 216.447484 130.246475 234.793680\nv 218.015293 132.990160 235.277471\nv 217.239881 132.607625 235.210014\nv 217.986185 131.938383 235.092013\nv 143.936373 138.473208 236.244289\nv 144.120524 138.532710 236.254787\nv 145.925973 133.174566 235.309985\nv 146.681289 133.693464 235.401482\nv 145.747387 134.192893 235.489543\nv 214.655284 126.199530 234.080085\nv 214.069173 126.641049 234.157948\nv 213.809747 125.843978 234.017396\nv 147.351214 134.480287 235.540213\nv 148.010860 135.148513 235.658031\nv 153.230539 122.880852 233.494887\nv 153.785551 123.748316 233.647841\nv 150.557566 134.866694 235.608320\nv 151.589217 135.007886 235.633225\nv 150.800527 135.753404 235.764684\nv 149.789430 134.734629 235.585036\nv 150.578121 133.989111 235.453578\nv 150.279755 136.554188 235.905878\nv 151.311406 136.695380 235.930784\nv 213.716187 139.566270 236.436956\nv 214.259775 138.791453 236.300336\nv 214.610986 139.472833 236.420479\nv 211.855374 133.540209 235.374425\nv 212.084102 132.659113 235.219076\nv 212.662224 133.302984 235.332608\nv 214.035196 134.314360 235.510941\nv 213.224059 133.844897 235.428157\nv 214.707668 133.789672 235.418433\nv 214.728242 134.598319 235.561017\nv 152.860237 136.029581 235.813396\nv 153.334425 136.980707 235.981092\nv 152.306365 136.845722 235.957286\nv 207.949157 129.727586 234.702161\nv 207.930356 128.879551 234.552633\nv 208.718630 129.460824 234.655126\nv 208.601614 134.592009 235.559874\nv 208.212083 135.645173 235.745588\nv 207.629843 134.973027 235.627067\nv 207.446056 133.239737 235.321439\nv 207.140145 134.108214 235.474570\nv 206.566828 133.428087 235.354656\nv 207.922500 138.359594 236.224226\nv 208.099595 137.471523 236.067619\nv 208.661965 137.969477 236.155428\nv 206.750614 135.161378 235.660284\nv 206.163509 135.999406 235.808063\nv 205.673811 135.134593 235.655565\nv 203.233363 133.902800 235.438368\nv 203.706174 134.915634 235.616963\nv 202.592347 134.605367 235.562230\nv 203.401533 136.478879 235.892589\nv 202.893805 137.153175 236.011479\nv 202.557430 136.292497 235.859714\nv 157.524748 129.959465 234.743064\nv 158.545378 129.956449 234.742515\nv 158.069791 130.829544 234.896461\nv 159.201324 131.831961 235.073194\nv 158.610732 132.509200 235.192626\nv 158.499829 131.503767 235.015344\nv 160.912495 128.935335 234.562434\nv 161.498895 128.548688 234.494264\nv 161.391731 129.420857 234.648052\nv 161.024507 132.720260 235.229838\nv 160.218988 133.277424 235.328079\nv 160.117746 132.280230 235.152235\nv 166.275144 131.722966 235.053991\nv 166.385928 132.705229 235.227188\nv 165.502113 132.458703 235.183730\nv 167.948471 132.340806 235.162938\nv 167.239029 132.748032 235.234731\nv 168.205207 143.106265 237.061197\nv 169.037482 143.194213 237.076696\nv 169.020622 137.028739 235.989540\nv 169.076743 136.018808 235.811461\nv 169.964811 136.499412 235.896188\nv 170.426146 129.530038 234.667310\nv 170.894898 128.741114 234.528203\nv 171.307756 129.588591 234.677640\nv 175.188669 130.942305 234.916353\nv 176.119415 130.359963 234.813645\nv 176.151521 131.334567 234.985493\nv 178.285921 133.032692 235.284903\nv 178.988240 132.965964 235.273153\nv 178.882075 133.743137 235.410188\nv 178.038120 130.620559 234.859583\nv 178.693030 131.372206 234.992124\nv 177.737177 131.503872 235.015327\nv 180.086509 126.459011 234.125818\nv 180.936957 126.466209 234.127122\nv 179.975208 142.024003 236.870369\nv 179.010599 142.272354 236.914145\nv 179.278621 141.293660 236.741578\nv 189.129913 130.359184 234.813523\nv 189.033712 131.126865 234.948882\nv 188.419357 130.831374 234.896784\nv 188.717379 135.775295 235.768509\nv 188.729199 134.895907 235.613452\nv 189.616408 135.267326 235.678950\nv 187.136367 134.695094 235.578034\nv 186.978882 135.423359 235.706456\nv 186.285079 134.714576 235.581479\nv 187.255295 125.529999 233.961998\nv 187.761244 126.316227 234.100644\nv 186.528944 126.391827 234.113942\nv 184.225590 137.894566 236.142242\nv 184.088874 136.996784 235.983940\nv 184.974890 137.212888 236.022051\nv 184.381886 138.827012 236.306659\nv 183.495870 138.610907 236.268548\nv 185.316617 139.024257 236.341441\nv 183.570734 131.303921 234.980138\nv 182.664407 131.214773 234.964419\nv 183.334063 130.434061 234.826763\nv 182.561017 138.492640 236.247698\nv 181.643430 138.345268 236.221720\nv 182.421988 137.531089 236.078154\nv 182.717313 139.425085 236.412115\nv 200.388226 131.288702 234.977408\nv 199.672151 131.691161 235.048380\nv 199.640903 130.780351 234.887777\nv 200.259923 129.480255 234.658526\nv 201.089566 128.857007 234.548645\nv 201.186621 129.754643 234.706924\nv 200.688221 139.044613 236.345000\nv 199.672103 138.904941 236.320372\nv 200.120419 138.117829 236.181580\nv 198.109432 130.740003 234.880683\nv 198.019023 129.865608 234.726502\nv 198.834418 130.308416 234.804568\nv 198.636008 135.031110 235.637318\nv 199.004275 134.087860 235.470994\nv 199.631995 134.920404 235.617792\nv 199.184014 136.920905 235.970535\nv 199.897267 136.388355 235.876632\nv 199.817554 137.445606 236.063050\nv 195.966609 139.479384 236.421664\nv 195.690059 140.329661 236.571593\nv 195.104459 139.560392 236.435946\nv 195.168048 136.174650 235.838938\nv 195.329960 135.239188 235.673994\nv 196.003602 135.928504 235.795541\nv 194.808657 137.997345 236.160335\nv 195.038997 137.074271 235.997569\nv 195.611350 137.787040 236.123251\nv 193.998421 140.503886 236.602316\nv 194.308716 139.726872 236.465302\nv 192.516402 138.645345 236.274596\nv 193.211714 138.469599 236.243611\nv 192.731495 136.985926 235.981998\nv 191.911164 137.439780 236.062018\nv 192.008754 136.529584 235.901524\nv 143.761597 133.559968 234.645845\nv 143.761597 132.913140 234.531791\nv 143.761597 132.967747 235.273524\nv 143.761597 137.487980 162.397350\nv 143.761597 137.887595 163.274542\nv 143.761597 138.561213 162.632215\nv 143.761597 134.650336 161.782417\nv 143.761597 135.489533 162.098120\nv 143.761597 135.397135 161.308501\nv 143.761597 137.560583 160.787679\nv 143.761597 138.846576 161.014436\nv 143.761597 135.778549 162.805857\nv 143.761597 145.518059 163.558623\nv 143.761597 145.133792 162.925324\nv 143.761597 144.694154 163.585394\nv 143.761597 135.785693 164.929037\nv 143.761597 136.871319 165.174707\nv 143.761597 143.973100 166.597641\nv 143.761597 144.602401 167.371231\nv 143.761597 145.021005 166.510543\nv 143.761597 128.475524 226.709242\nv 143.761597 128.563988 227.690266\nv 143.761597 129.553850 227.175096\nv 143.761597 128.528656 224.847858\nv 143.761597 128.409127 223.957563\nv 143.761597 127.674676 224.520912\nv 143.761597 138.544250 176.070712\nv 143.761597 138.400590 175.414005\nv 143.761597 137.747135 175.754975\nv 143.761597 134.316589 175.675247\nv 143.761597 135.318987 175.326535\nv 143.761597 134.654678 174.890302\nv 143.761597 142.437508 173.428984\nv 143.761597 141.969123 174.389756\nv 143.761597 144.450441 173.185893\nv 143.761597 143.384655 173.345223\nv 143.761597 144.089268 174.096647\nv 143.761597 142.798681 172.518230\nv 143.761597 143.521853 170.842794\nv 143.761597 142.893070 170.121924\nv 143.761597 134.588206 170.056417\nv 143.761597 135.431042 169.602008\nv 143.761597 134.449901 169.189282\nv 143.761597 136.952978 178.382107\nv 143.761597 137.641543 179.251157\nv 143.761597 137.958855 178.567997\nv 143.761597 136.708085 179.829332\nv 143.761597 137.713962 180.015222\nv 143.761597 139.252964 185.302489\nv 143.761597 138.320087 185.491968\nv 143.761597 138.941928 186.181347\nv 143.761597 135.391611 186.458241\nv 143.761597 134.981994 187.279571\nv 143.761597 135.838875 187.272059\nv 143.761597 133.106297 190.447539\nv 143.761597 133.613311 189.668136\nv 143.761597 138.661529 192.152390\nv 143.761597 137.826979 192.671507\nv 143.761597 138.868747 193.225599\nv 143.761597 132.335076 193.414070\nv 143.761597 132.726830 194.146676\nv 143.761597 133.056789 193.498235\nv 143.761597 139.091598 195.149563\nv 143.761597 139.135682 196.100166\nv 143.761597 139.972603 195.535321\nv 143.761597 138.981358 194.164717\nv 143.761597 139.815908 193.645600\nv 143.761597 137.397147 195.339951\nv 143.761597 136.534801 196.068476\nv 143.761597 137.392331 196.442932\nv 143.761597 135.878730 196.558092\nv 143.761597 135.883545 195.455111\nv 143.761597 132.020604 225.243197\nv 143.761597 131.201799 225.841687\nv 143.761597 132.168070 226.185820\nv 143.761597 131.959499 224.304000\nv 143.761597 131.892385 223.351064\nv 143.761597 130.987219 223.946128\nv 143.761597 132.792524 222.741263\nv 143.761597 131.820244 222.383392\nv 143.761597 134.507275 221.534367\nv 143.761597 133.462189 221.122522\nv 143.761597 133.765469 222.185436\nv 143.761597 141.656156 225.364609\nv 143.761597 142.029853 224.123486\nv 143.761597 140.451512 223.340870\nv 143.761597 139.665518 223.330540\nv 143.761597 140.289764 224.112840\nv 143.761597 130.770533 220.114751\nv 143.761597 131.640599 220.429952\nv 143.761597 131.545343 219.470731\nv 143.761597 140.016059 221.631038\nv 143.761597 139.320422 221.042355\nv 143.761597 139.131629 221.969887\nv 143.761597 139.452717 220.041901\nv 143.761597 134.862312 218.961078\nv 143.761597 134.128633 219.562153\nv 143.761597 134.937674 219.870377\nv 143.761597 127.568740 216.434078\nv 143.761597 128.386462 215.519236\nv 143.761597 127.434946 215.293913\nv 143.761597 137.906791 216.842209\nv 143.761597 138.781304 216.355769\nv 143.761597 137.947334 215.841251\nv 143.761597 136.091050 215.993930\nv 143.761597 137.089365 215.327754\nv 143.761597 136.107595 214.993992\nv 143.761597 138.169888 212.842198\nv 143.761597 137.173798 213.347515\nv 143.761597 138.101999 213.822499\nv 143.761597 147.261361 200.674843\nv 143.761597 146.132451 200.679363\nv 143.761597 146.897090 201.522319\nv 143.761597 135.411460 200.395571\nv 143.761597 135.889317 199.692026\nv 143.761597 135.083049 199.606754\nv 143.761597 135.568920 197.249910\nv 143.761597 135.084381 198.115786\nv 143.761597 136.045445 198.037333\nv 143.761597 132.498827 196.373570\nv 143.761597 133.313789 196.502762\nv 143.761597 133.024497 195.655517\nv 143.761597 145.175862 212.360242\nv 143.761597 144.285945 212.695601\nv 143.761597 144.985976 213.249164\nv 143.761597 133.932830 210.026672\nv 143.761597 134.804070 210.264742\nv 143.761597 134.522901 209.469142\nv 143.761597 141.510691 210.700466\nv 143.761597 142.346957 211.178483\nv 143.761597 142.214837 210.265242\nv 143.761597 138.044495 210.911153\nv 143.761597 139.056359 210.741089\nv 143.761597 138.402655 210.119668\nv 143.761597 140.705747 208.981951\nv 143.761597 139.723721 209.063140\nv 143.761597 140.396545 209.868414\nv 143.761598 145.931863 204.178200\nv 143.761598 145.383362 203.338403\nv 143.761597 144.910619 204.109481\nv 143.761597 136.889588 204.214278\nv 143.761597 137.815778 204.217742\nv 143.761597 137.278739 203.426786\nv 143.761597 140.665305 203.998358\nv 143.761597 139.866595 204.049328\nv 143.761597 140.126521 204.907814\nv 143.761597 135.003371 205.457539\nv 143.761597 135.317218 206.284671\nv 143.761597 135.923448 205.671957\nv 143.761597 130.075808 205.286291\nv 143.761597 129.899135 204.316321\nv 143.761597 129.079530 204.940483\nv 157.438874 153.188385 165.368961\nv 179.468705 155.079812 166.838242\nv 180.139155 155.089406 166.928699\nv 166.962128 143.872547 237.196301\nv 152.190665 142.515266 233.157107\nv 152.714700 142.634589 233.200859\nv 145.521703 150.488909 164.760559\nv 152.722477 143.116184 231.802347\nv 153.585794 143.125477 232.399938\nv 155.607874 143.370362 233.012045\nv 160.063938 143.530174 235.183191\nv 160.654253 143.454868 235.715320\nv 164.456538 144.720647 233.663709\nv 165.710699 144.887624 233.682969\nv 163.312957 144.570658 233.632033\nv 176.751266 146.204206 232.355624\nv 174.792103 146.413403 231.390222\nv 175.124097 146.189346 232.176726\nv 173.539767 146.358584 231.325191\nv 172.769891 146.328688 231.266625\nv 171.908218 146.334492 231.033982\nv 169.452200 146.226414 230.727941\nv 167.167703 146.186014 230.064743\nv 165.104015 146.188759 229.236894\nv 165.804757 146.045242 230.010498\nv 162.496622 145.997907 228.640670\nv 160.759165 146.074422 227.465643\nv 159.003497 145.815863 227.330908\nv 157.049424 146.217997 224.655398\nv 156.255868 146.037322 224.752708\nv 155.255500 145.745264 225.044092\nv 179.317968 148.011359 226.291473\nv 179.165527 147.787208 227.111177\nv 176.839652 147.756091 227.020702\nv 176.257085 147.543846 227.718767\nv 172.420056 147.615096 226.715251\nv 173.260494 147.428243 227.598973\nv 161.824015 147.455308 223.018664\nv 161.958192 147.250984 223.880932\nv 159.265117 147.305582 222.013348\nv 157.495779 147.351217 220.633705\nv 157.450369 147.138286 221.435210\nv 155.067568 146.934513 220.435574\nv 154.232241 146.983374 219.524092\nv 154.024678 146.785715 220.149390\nv 153.184076 147.055448 218.336669\nv 152.366197 146.918910 218.149334\nv 150.649250 147.014203 216.091811\nv 148.818506 146.915119 214.541176\nv 168.975135 154.502791 180.033378\nv 168.052615 154.417459 180.379701\nv 168.978669 154.464280 180.885055\nv 172.813249 154.570520 183.611036\nv 172.970757 154.532995 184.478310\nv 173.529319 154.685794 182.023435\nv 175.309530 154.610302 184.668975\nv 176.061170 154.669343 184.098319\nv 176.718465 154.801521 182.023502\nv 175.935888 154.797972 181.621830\nv 175.995719 154.760179 182.365182\nv 166.738874 154.494545 172.795486\nv 168.824324 154.667488 173.447042\nv 170.707212 154.785587 174.373053\nv 172.638871 154.883825 175.199052\nv 174.646884 154.955160 175.998227\nv 176.814369 155.003754 176.829724\nv 179.484170 155.073740 176.148336\nv 178.790894 155.039772 177.005095\nv 179.816895 155.133169 170.945146\nv 177.865825 155.098858 170.347665\nv 175.921590 155.046707 169.542000\nv 174.043719 154.975479 169.111276\nv 166.543903 154.429048 166.929642\nv 165.527959 154.327492 166.802909\nv 165.073958 154.256198 166.017847\nv 178.897315 152.542073 204.464161\nv 179.452921 152.449227 205.092739\nv 175.793369 152.356116 205.131360\nv 174.124713 152.280357 205.178123\nv 172.422732 152.289607 204.538072\nv 170.718161 152.317309 203.657390\nv 169.099364 152.272049 203.155283\nv 167.495176 152.221320 202.576858\nv 165.898359 152.115992 202.249489\nv 164.205996 152.019883 201.653117\nv 162.366866 152.024554 200.083982\nv 162.440458 151.902660 201.001023\nv 160.583250 151.756888 200.274669\nv 158.614429 151.988313 196.410637\nv 156.721469 151.455359 198.118574\nv 154.991049 151.192085 197.818591\nv 155.837297 151.399855 197.400278\nv 151.737396 151.005884 194.087244\nv 149.216808 150.502067 193.609351\nv 149.985835 150.733278 193.082862\nv 148.018839 150.388812 191.915850\nv 179.083656 153.761674 195.272824\nv 175.662308 153.773914 194.382506\nv 174.003535 153.774522 193.753311\nv 172.390574 153.791268 192.823358\nv 170.862973 153.754922 192.278493\nv 169.104718 153.798832 190.592219\nv 169.205476 153.731036 191.335370\nv 162.729764 153.290888 189.261438\nv 161.442374 153.218155 188.225255\nv 160.063614 153.111146 187.249427\nv 158.602926 152.979105 186.176134\nv 157.045961 152.792174 185.350062\nv 155.435955 152.539776 185.024263\nv 152.938996 152.147858 183.900062\nv 153.754016 152.293891 183.986526\nv 147.574032 151.215095 177.661282\nv 177.547156 153.243343 199.310439\nv 176.772314 153.184331 199.626258\nv 176.037742 153.164806 199.587045\nv 174.605049 153.166553 199.152687\nv 173.133767 153.093582 199.178811\nv 171.575546 153.086084 198.543197\nv 170.004389 153.099575 197.612391\nv 168.505802 153.061517 196.987603\nv 167.014540 153.133084 195.316480\nv 167.042050 153.015505 196.320824\nv 163.882873 152.680055 196.403677\nv 159.286231 152.375695 193.878503\nv 158.217236 152.388246 192.205850\nv 156.450282 152.197249 191.271838\nv 154.911129 152.005018 190.450771\nv 153.405351 151.838939 189.160948\nv 152.046489 151.669822 187.961740\nv 150.815962 151.497113 186.850837\nv 148.800099 151.068004 186.483232\nv 147.991823 150.929120 185.709143\nv 149.490769 151.266009 185.951761\nv 161.627540 153.906425 175.405353\nv 161.689296 153.929016 174.685258\nv 161.505182 153.856878 176.780078\nv 162.310434 153.977194 176.124344\nv 161.414781 153.802182 165.155637\nv 160.648837 153.713604 165.679275\nv 159.946615 153.692942 169.251612\nv 159.825579 153.695714 170.633478\nv 161.836041 153.977141 172.520184\nv 161.816528 153.974668 173.232891\nv 162.478005 154.054168 172.993789\nv 164.669643 154.298561 171.871918\nv 164.603664 154.289036 170.932674\nv 164.954553 154.224159 177.979133\nv 179.036670 154.344075 189.376492\nv 178.670579 154.452930 187.952220\nv 178.030520 154.377447 188.728151\nv 176.347924 154.361153 188.424835\nv 174.795250 154.348661 187.919394\nv 173.284651 154.324772 187.386503\nv 171.770132 154.286213 186.840446\nv 170.196034 154.287255 185.500988\nv 170.240177 154.254090 185.979181\nv 164.055819 153.777591 185.000785\nv 164.958791 153.883131 184.788039\nv 163.250593 153.682954 185.013606\nv 163.287037 153.768216 183.734803\nv 161.620883 153.615804 182.887756\nv 159.226531 153.338114 182.038604\nv 159.997403 153.463767 181.636952\nv 158.466674 153.343710 179.394178\nv 156.950510 153.140624 178.273660\nv 155.388459 152.915881 176.690490\nv 153.750136 152.627714 175.912807\nv 149.539905 151.742033 170.933815\nv 177.032806 150.498118 215.571561\nv 174.946454 150.522866 215.084539\nv 172.946681 150.447346 214.950151\nv 170.999827 150.349253 214.808178\nv 169.109158 150.223759 214.691825\nv 167.120291 150.187218 213.969078\nv 165.150893 150.123680 213.257207\nv 163.295440 150.052401 212.495450\nv 161.470784 149.982264 211.623683\nv 159.715740 149.779087 211.348425\nv 157.829556 149.696073 210.224192\nv 155.835879 149.546842 209.131512\nv 153.943254 149.432258 207.786060\nv 150.370554 149.022587 205.796095\nv 150.911894 149.507542 203.731296\nv 150.392279 149.221591 204.694075\nv 176.462867 149.121522 221.635892\nv 174.590927 149.087515 221.442948\nv 172.715127 149.021689 221.278511\nv 170.687160 149.027564 220.648942\nv 168.784634 149.031472 219.964668\nv 167.197809 148.859609 220.046529\nv 163.377006 149.023175 217.425504\nv 162.385156 148.808889 217.798146\nv 159.544649 148.493449 217.300370\nv 157.794217 148.457937 216.154752\nv 155.973229 148.266206 215.538081\nv 154.066673 148.340336 213.472470\nv 153.968937 148.054064 214.700536\nv 152.608772 148.496664 211.307922\nv 151.552824 148.258369 211.275460\nv 149.644440 147.966209 210.537385\nv 149.472553 148.115045 209.577543\nv 150.286188 147.992885 211.181532\nv 148.123264 147.676277 210.081603\nv 148.391196 148.850081 204.059617\nv 179.189743 151.528583 210.541407\nv 178.312677 151.588329 210.120363\nv 174.920857 151.268406 211.286450\nv 173.171114 151.331064 210.470823\nv 171.463485 151.334728 209.877576\nv 169.747594 151.355385 209.069641\nv 168.039491 151.303848 208.555024\nv 166.311239 151.244718 207.941405\nv 164.489469 151.279596 206.603786\nv 162.688010 151.186943 205.865554\nv 160.915594 150.983918 205.649769\nv 159.124991 150.810892 205.100209\nv 157.638109 150.659847 204.589495\nv 151.788210 150.101110 201.067997\nv 149.990596 149.787409 200.499044\nv 147.577283 149.382106 199.343652\nv 148.521585 149.636384 199.151621\nv 147.478835 149.447657 198.679849\nv 147.397940 149.518186 197.992598\nv 147.349541 149.886053 195.065514\nv 182.509628 155.028322 165.133565\nv 183.486231 155.018981 165.126222\nv 208.103429 142.446544 234.919092\nv 207.774717 142.920821 233.806394\nv 214.738992 142.635522 229.248814\nv 214.381278 143.279137 227.498614\nv 208.586450 143.655321 231.028830\nv 186.343926 146.473005 231.370997\nv 190.399363 146.166083 231.642641\nv 193.270217 146.100207 231.076518\nv 192.473688 145.842497 232.167863\nv 192.503848 145.679433 232.692453\nv 196.131750 145.780483 231.106970\nv 196.088184 146.046371 230.252154\nv 196.213199 145.505469 232.003512\nv 197.995792 146.029994 229.504164\nv 199.953040 146.110551 228.300911\nv 201.860848 145.939736 227.870889\nv 204.579439 145.689797 227.056821\nv 207.110831 145.462864 226.160794\nv 208.959937 145.503121 224.620808\nv 209.913793 145.371330 224.324841\nv 210.866332 144.553106 226.430038\nv 182.974991 147.762265 227.238137\nv 183.502464 147.755914 227.226996\nv 183.391734 147.958879 226.480290\nv 186.123356 147.691715 227.199536\nv 186.950848 147.832621 226.540341\nv 185.306694 147.722614 227.183564\nv 184.305595 147.731681 227.252117\nv 188.516369 147.721759 226.671993\nv 189.929260 147.689955 226.465272\nv 191.828706 147.629830 226.170974\nv 194.680542 147.280891 226.504224\nv 194.212137 147.513711 225.799226\nv 197.348040 147.309678 225.307407\nv 196.457639 147.484816 225.022859\nv 198.228243 147.328340 224.811875\nv 198.213986 147.607002 223.751664\nv 201.816755 147.044169 223.944380\nv 201.798647 147.262675 223.117712\nv 206.767221 146.878100 221.210875\nv 207.472694 146.868310 220.693874\nv 206.865381 147.040311 220.484077\nv 206.802196 146.663024 222.041712\nv 208.192108 146.783049 220.443276\nv 209.011001 146.736533 219.934658\nv 208.389748 146.984004 219.458459\nv 209.897656 146.642813 219.531955\nv 210.072332 146.842259 218.544547\nv 212.497791 146.283458 218.513160\nv 211.774474 146.594518 217.938744\nv 213.462277 146.399773 217.009049\nv 197.514216 154.234619 177.870086\nv 196.969580 154.288771 177.860176\nv 196.872678 154.269411 178.681883\nv 196.019543 154.320650 179.494129\nv 196.288502 154.403079 167.083379\nv 193.749989 154.540920 178.780710\nv 193.558787 154.524127 179.564559\nv 192.819491 154.579354 179.552085\nv 193.479947 154.497537 180.287058\nv 191.239185 154.622639 180.907441\nv 192.083909 154.564269 180.965049\nv 190.400987 154.673326 180.806078\nv 189.064577 154.674780 182.134601\nv 188.205048 154.725649 181.916547\nv 185.675365 154.750173 183.000148\nv 183.226045 154.762978 183.559221\nv 195.637863 154.507706 173.212463\nv 193.915470 154.644732 174.041947\nv 192.156374 154.768366 174.274800\nv 190.381387 154.829776 176.596438\nv 190.869305 154.784096 177.619891\nv 190.253299 154.860556 175.397893\nv 188.146240 154.932978 176.543005\nv 185.846118 154.978543 177.747848\nv 184.857542 154.995670 178.022928\nv 185.990737 154.995968 176.901581\nv 190.773217 154.868340 169.416923\nv 191.621259 154.819965 169.637718\nv 191.099944 154.840606 168.793265\nv 186.515476 155.053914 170.381354\nv 184.245825 155.111939 172.123206\nv 184.340762 155.106588 171.194135\nv 186.358853 152.181357 206.325850\nv 186.325449 152.290764 205.634071\nv 188.105511 152.363705 204.721168\nv 189.857315 152.351145 204.234896\nv 191.488911 152.298901 203.919108\nv 193.142168 152.252314 203.433118\nv 194.837912 152.211665 202.758654\nv 196.540801 152.149860 202.079328\nv 198.267984 152.074134 201.325651\nv 200.030371 152.037679 200.090396\nv 203.666630 152.056506 196.197158\nv 203.628396 151.967705 196.909701\nv 206.913482 151.045543 199.785417\nv 207.766262 150.897867 199.742281\nv 205.266491 151.822054 196.023882\nv 208.341321 150.905452 198.911777\nv 207.698372 151.117051 198.186368\nv 206.837490 151.653550 195.152975\nv 211.401900 150.439044 197.724171\nv 207.581530 151.694916 193.631253\nv 208.548126 151.451219 194.168271\nv 210.734263 151.246800 192.037050\nv 210.616373 151.175590 192.911572\nv 211.495860 151.019885 192.614938\nv 213.892338 149.899426 197.417816\nv 212.430664 150.952860 191.263087\nv 212.377624 150.858859 192.277028\nv 214.901191 150.158657 193.303466\nv 214.524038 150.684028 188.881845\nv 214.028871 150.717180 189.847991\nv 214.397724 150.795541 187.962328\nv 182.682260 153.861504 194.384744\nv 184.630754 153.851347 194.222178\nv 186.395616 153.812934 194.165865\nv 188.104394 153.803443 193.651562\nv 189.891931 153.807319 192.785056\nv 191.862813 153.767913 191.984951\nv 193.858421 153.584064 192.400213\nv 193.801233 153.667981 191.595186\nv 195.658407 153.422266 192.490745\nv 195.797778 153.487970 191.681245\nv 197.596106 153.381204 191.006582\nv 198.245314 153.393688 190.082968\nv 197.716237 153.646087 187.926586\nv 200.411330 152.939881 192.303848\nv 202.077723 152.839425 191.085579\nv 203.654240 152.736280 189.796764\nv 201.947255 153.386785 184.627210\nv 205.123904 152.574211 189.084592\nv 203.017138 153.261055 184.268496\nv 206.462406 152.409867 188.419475\nv 204.502485 153.082908 183.502127\nv 207.842630 152.259500 187.215944\nv 206.126374 152.869657 182.579723\nv 206.934895 152.797871 181.209377\nv 207.611439 152.652371 181.691765\nv 209.008832 152.439652 180.579113\nv 209.017290 152.392537 181.506038\nv 210.405079 152.183078 179.943373\nv 213.878816 151.274187 182.806962\nv 213.176208 151.409332 183.398229\nv 211.711370 151.934327 179.039964\nv 214.692140 151.134563 181.701190\nv 212.951940 151.701798 177.514293\nv 214.200845 151.429543 176.313092\nv 184.630175 153.119799 200.316290\nv 185.591904 153.181519 199.653274\nv 187.259043 153.144148 199.518227\nv 188.942479 153.142004 198.974043\nv 190.582833 153.121295 198.444755\nv 192.186289 153.084143 197.920584\nv 193.798932 153.039838 197.302338\nv 195.440350 152.977885 196.658540\nv 197.132861 152.912421 195.826032\nv 201.136493 152.349755 196.684497\nv 200.407491 152.556130 195.678950\nv 200.407638 152.833152 193.259611\nv 207.038700 151.757853 193.938901\nv 212.512113 150.993873 190.686810\nv 212.610664 151.059193 189.780317\nv 211.776148 151.607395 185.184098\nv 213.123885 151.360240 184.268231\nv 214.498355 151.089344 183.309908\nv 214.533546 151.135924 182.401055\nv 200.491335 153.933544 176.279015\nv 200.141793 154.042659 172.886151\nv 201.759196 153.812805 174.251376\nv 202.540913 153.701893 174.289643\nv 201.326412 153.856285 168.890731\nv 198.900920 154.187165 172.918028\nv 198.124689 154.269631 172.949937\nv 197.399775 154.345779 172.299502\nv 183.620268 154.325081 189.548245\nv 183.919065 154.383161 188.793358\nv 184.157792 154.443530 187.982099\nv 185.766842 154.420973 187.816444\nv 187.445263 154.385681 187.564735\nv 189.322626 154.344770 187.060156\nv 191.091045 154.282821 186.626444\nv 192.901825 154.109430 187.368685\nv 192.418012 154.206296 186.517214\nv 195.879534 153.911474 186.799563\nv 193.851626 154.262131 184.199577\nv 195.148059 154.151804 184.279044\nv 199.177102 153.586531 186.612178\nv 197.558807 154.016841 182.722417\nv 197.647995 154.059523 181.901672\nv 200.617133 153.852966 178.924393\nv 206.207701 152.915419 181.281992\nv 204.097200 153.436093 176.455036\nv 206.367898 153.052599 176.727580\nv 208.187566 152.775521 174.062335\nv 208.218580 152.760285 174.611352\nv 208.743031 152.671541 172.310722\nv 208.281285 152.759193 173.073580\nv 209.386886 152.545146 173.270674\nv 210.491744 152.316750 171.854835\nv 210.731549 152.263205 172.690000\nv 209.615191 152.500204 171.697360\nv 215.270995 151.192599 172.593885\nv 214.356613 151.367519 169.029155\nv 183.383612 150.273928 216.866191\nv 187.328846 150.118898 217.057802\nv 187.302372 150.248077 216.448755\nv 189.162500 150.318395 215.677250\nv 191.043994 150.263732 215.379092\nv 193.006059 150.225568 214.842083\nv 194.943124 150.232285 213.975834\nv 196.801647 150.169676 213.346006\nv 198.696029 150.110150 212.547973\nv 200.604429 150.048591 211.607714\nv 202.516788 149.930564 210.803000\nv 204.404244 149.774311 210.059824\nv 206.252928 149.665653 208.942178\nv 208.084477 149.542908 207.745983\nv 213.380581 148.546785 206.884383\nv 212.620407 148.732375 206.859892\nv 216.423467 148.060650 205.275436\nv 214.751065 149.050018 201.922438\nv 215.306875 149.008962 201.264621\nv 213.910239 149.310474 201.640674\nv 214.074079 149.152565 202.344488\nv 183.615953 149.155534 221.770667\nv 185.500343 148.932275 222.498998\nv 185.513093 149.045518 222.023448\nv 187.581283 149.070378 221.575913\nv 189.647040 149.121448 220.902183\nv 191.598073 149.069500 220.557356\nv 193.730146 149.029756 219.968604\nv 195.695076 148.981584 219.363785\nv 197.721404 148.910283 218.677868\nv 199.922130 148.772781 218.055825\nv 201.802485 148.725841 217.081756\nv 204.181913 148.273315 217.412885\nv 203.571255 148.632742 216.262833\nv 205.339569 148.169780 216.972636\nv 205.395676 148.343227 216.157465\nv 209.089233 148.017279 214.376853\nv 209.871493 147.793155 214.668960\nv 210.595095 147.960508 213.126059\nv 212.073017 147.927918 211.656130\nv 213.948856 147.784745 210.111669\nv 215.264812 147.754993 208.571149\nv 214.828436 148.014618 207.834219\nv 214.506087 147.958587 208.554415\nv 183.476777 151.224784 212.180741\nv 183.452879 151.379506 211.335760\nv 185.073132 151.336469 211.385761\nv 186.804437 151.365252 210.921439\nv 188.605789 151.410454 210.242855\nv 190.386652 151.387350 209.822136\nv 192.187200 151.353806 209.328239\nv 194.001048 151.322621 208.686279\nv 195.750768 151.227275 208.314723\nv 197.593612 151.210311 207.291170\nv 199.424490 151.157359 206.354440\nv 201.131572 150.927671 206.388469\nv 202.942930 150.773451 205.752500\nv 205.600926 150.418042 205.347271\nv 204.793023 150.653034 204.720649\nv 207.432515 150.275112 204.235048\nv 210.008030 150.030631 202.574482\nv 212.082410 149.645694 202.197299\nv 212.084040 150.169632 198.516527\nv 213.949072 149.764578 198.305959\nv 213.995148 149.629940 199.196836\nv 189.903892 135.637378 181.035473\nv 190.524926 135.803486 175.993616\nv 190.726291 135.816300 175.162307\nv 191.337597 135.760877 175.694031\nv 189.805747 135.841739 176.187342\nv 192.402531 135.503884 180.314936\nv 192.202517 135.478287 181.198257\nv 193.072572 135.639475 175.210169\nv 192.185142 135.703547 175.466427\nv 192.426393 135.709620 174.606465\nv 193.231547 135.451377 180.046688\nv 194.067844 135.403440 179.642010\nv 193.872533 135.377817 180.528395\nv 194.939075 135.472546 174.609570\nv 194.001344 135.561899 174.954477\nv 194.251554 135.556196 174.005300\nv 197.008105 135.176082 177.556496\nv 197.140003 135.134704 178.557225\nv 190.233990 135.598976 161.690205\nv 191.308107 135.514463 161.548669\nv 182.442863 136.104186 174.539753\nv 181.636875 135.838612 181.922297\nv 182.070051 135.871460 181.142776\nv 186.479651 125.740477 233.505023\nv 185.954994 125.607749 233.975700\nv 192.084415 126.454349 230.160150\nv 195.170593 126.580265 228.691310\nv 196.061182 126.451161 228.700020\nv 196.942144 126.285708 228.789848\nv 198.075744 126.528172 227.545333\nv 200.379986 126.681713 225.882136\nv 183.118831 127.259196 229.469023\nv 182.579251 127.490665 228.774507\nv 183.548996 127.011397 230.176438\nv 184.602692 126.999787 230.112628\nv 185.827568 128.525916 225.137668\nv 184.743846 128.483822 225.401707\nv 185.114694 128.749666 224.473045\nv 188.238220 127.036862 229.476643\nv 189.165471 126.819639 229.901600\nv 188.375735 127.254990 228.785430\nv 187.231577 127.573403 227.986113\nv 186.388064 127.547131 228.213272\nv 188.065559 128.448830 224.975153\nv 186.892968 128.512437 224.999807\nv 187.371006 128.728153 224.184352\nv 189.933683 126.997216 229.212551\nv 188.284928 127.522951 227.940624\nv 190.084645 128.373466 224.750146\nv 189.094837 128.411555 224.857323\nv 189.533404 128.626457 224.052522\nv 192.234783 128.242996 224.514487\nv 191.072855 128.323387 224.628477\nv 191.685140 128.507976 223.831355\nv 194.763047 126.883487 227.975309\nv 192.375820 127.356485 227.364341\nv 195.055439 128.203486 223.584421\nv 193.943042 128.186457 224.080851\nv 193.959465 128.444614 223.220934\nv 193.135295 128.157949 224.487639\nv 192.523011 127.973359 225.284761\nv 196.920364 127.238085 225.910076\nv 196.968738 128.217296 222.636760\nv 196.008103 128.214195 223.109838\nv 196.032497 128.464744 222.251426\nv 195.991681 127.956038 223.969755\nv 197.548745 127.279125 225.471902\nv 199.626866 127.727101 222.847477\nv 198.723783 128.225734 221.673066\nv 197.865976 128.222111 222.147822\nv 197.850939 128.471467 221.303592\nv 199.573815 127.983186 222.004657\nv 201.316243 127.501529 222.586450\nv 201.383220 127.238516 223.436485\nv 200.461861 127.733909 222.334839\nv 202.654412 127.619860 221.297482\nv 204.441875 127.151955 221.606161\nv 203.698514 127.316334 221.584277\nv 205.411247 127.089928 221.064250\nv 207.673157 127.087455 219.164634\nv 206.740430 127.427362 218.774781\nv 208.500724 127.048600 218.543345\nv 208.462623 127.367345 217.422111\nv 210.222477 127.417913 215.486271\nv 209.367395 127.558080 215.856248\nv 197.692356 135.179327 173.591262\nv 198.342415 135.103332 172.989659\nv 198.739762 135.039733 173.900449\nv 196.545281 135.233249 166.089210\nv 196.140910 135.308213 166.982536\nv 197.956874 135.080598 177.061524\nv 198.788557 134.995362 176.400725\nv 198.809953 134.969974 177.314976\nv 196.923760 135.269483 173.829479\nv 195.870898 135.381442 174.319439\nv 196.242147 135.354885 173.170433\nv 197.321107 135.205884 174.740269\nv 194.869641 135.505168 171.065811\nv 195.031048 135.391251 177.264578\nv 191.541246 135.781106 169.372778\nv 191.389436 135.785824 168.577315\nv 190.526220 135.856051 169.642166\nv 194.801382 135.348797 179.363273\nv 195.505283 135.272038 179.631196\nv 189.621055 135.905493 169.967304\nv 189.698113 135.898772 169.110662\nv 188.716667 135.957246 170.371055\nv 187.843299 136.002862 170.862245\nv 187.919580 135.993830 169.926991\nv 186.975941 136.036773 171.350413\nv 188.984929 135.874875 176.684863\nv 189.092803 135.892044 175.959411\nv 187.551755 135.983279 174.411461\nv 186.167056 136.064913 171.740549\nv 186.237328 136.067586 170.808318\nv 185.325462 136.087825 172.077022\nv 184.651561 136.005420 177.440931\nv 184.941040 135.772434 182.308272\nv 184.914503 135.817890 181.443898\nv 185.676573 135.766405 182.076501\nv 185.065207 135.854124 180.631574\nv 185.596391 135.992988 177.056664\nv 186.663532 136.008422 174.921206\nv 186.532889 135.973357 176.685658\nv 185.781057 136.029244 175.258847\nv 185.648708 136.017276 176.167056\nv 184.613766 136.110783 171.445708\nv 184.510784 136.102882 172.324275\nv 183.311802 136.095805 174.319584\nv 183.686845 135.930579 179.586605\nv 184.671957 135.734658 183.150936\nv 183.909887 135.786143 182.518333\nv 189.353217 135.657562 161.746629\nv 193.445665 135.555544 166.181026\nv 192.499588 135.634116 166.227430\nv 191.530059 135.701167 166.285837\nv 190.593632 135.768483 166.353098\nv 189.567351 135.835040 166.507629\nv 188.663565 135.884582 166.516313\nv 188.015852 135.930482 167.162205\nv 187.080880 135.985900 167.745719\nv 187.085638 136.022318 169.508881\nv 186.268480 136.054549 169.948580\nv 184.542933 136.049829 167.490650\nv 184.623295 136.066623 168.367766\nv 184.663188 136.081451 169.186655\nv 183.987539 136.120920 170.978967\nv 183.077008 136.129833 170.966260\nv 182.174074 136.116675 169.254051\nv 182.787536 136.059024 166.587865\nv 182.202926 136.138825 171.180526\nv 183.194278 133.207551 204.998986\nv 184.208601 133.016753 205.987907\nv 183.838382 133.146952 205.283818\nv 184.629079 133.579286 202.635364\nv 183.909050 133.656406 202.261588\nv 185.971718 132.685511 207.613171\nv 185.472940 133.098008 205.322821\nv 184.779226 133.091245 205.486332\nv 186.237166 133.598274 202.206510\nv 185.399440 133.591462 202.417613\nv 185.533160 133.709600 201.675140\nv 187.759106 132.748503 206.810499\nv 187.285733 133.119064 204.777907\nv 186.457291 133.115672 205.001755\nv 187.948285 133.585775 201.793755\nv 187.071123 133.592243 202.014611\nv 187.248047 133.709945 201.243181\nv 189.578142 132.762406 206.130952\nv 189.033225 133.130000 204.171468\nv 188.180406 133.129552 204.448440\nv 189.735204 133.564112 201.285073\nv 188.833535 133.577594 201.541038\nv 189.026877 133.689996 200.766359\nv 191.371283 132.753972 205.463302\nv 190.642117 133.119490 203.609989\nv 189.894753 133.128212 203.855564\nv 191.468851 133.504649 200.845209\nv 190.618953 133.529035 201.097397\nv 190.778444 133.652127 200.258205\nv 193.009855 132.750655 204.675993\nv 193.170592 132.620786 205.370829\nv 192.307039 133.462393 200.686682\nv 194.919999 132.760629 203.495415\nv 195.993692 132.682684 203.251895\nv 196.938354 132.579755 203.243403\nv 196.433050 132.476022 204.222238\nv 193.394002 133.639494 198.871211\nv 192.702440 133.789357 198.150108\nv 198.000652 132.426904 203.367359\nv 198.923213 132.299231 203.357375\nv 196.495244 132.961589 201.163019\nv 197.344208 132.976606 200.399645\nv 195.751791 133.460074 198.476583\nv 199.643249 132.347263 202.460509\nv 200.154689 132.388936 201.745389\nv 199.942870 132.165780 203.296912\nv 198.239073 132.956433 199.805922\nv 199.031185 132.941762 199.186745\nv 197.662966 133.374638 197.468122\nv 200.915874 132.332875 201.375155\nv 201.876891 132.260383 200.853701\nv 201.623924 132.141320 201.878591\nv 199.935368 132.895676 198.634683\nv 200.792857 132.837756 198.147933\nv 199.574004 133.250361 196.541170\nv 202.753256 132.182633 200.413413\nv 203.623743 132.082912 200.072683\nv 203.455427 131.969107 201.016406\nv 201.658978 132.770721 197.673265\nv 202.524716 132.691509 197.213375\nv 201.292538 133.119047 195.569813\nv 204.492326 131.989856 199.645295\nv 205.347708 131.889025 199.204887\nv 205.181296 131.768556 200.235268\nv 203.371767 132.611566 196.732181\nv 204.235692 132.519360 196.255050\nv 202.955199 132.979225 194.544105\nv 206.233710 131.786945 198.703816\nv 207.203087 131.652224 198.189315\nv 207.006056 131.533004 199.280360\nv 205.077761 132.428286 195.745238\nv 205.939706 132.326814 195.207482\nv 204.603862 132.825529 193.448921\nv 208.092875 131.544267 197.579878\nv 209.037302 131.451812 196.693343\nv 208.919861 131.305828 197.879324\nv 206.771110 132.229267 194.645996\nv 207.610927 132.122824 194.055744\nv 206.222578 132.641925 192.338891\nv 208.422896 132.017927 193.434814\nv 209.245142 131.908906 192.746898\nv 207.799773 132.438232 191.163612\nv 210.050768 131.794811 192.056881\nv 210.872981 131.658095 191.431257\nv 209.360602 132.217600 189.843267\nv 212.449229 131.043798 193.164231\nv 211.731338 131.705938 188.801663\nv 210.950820 131.952248 188.448094\nv 212.706508 131.753747 185.241350\nv 215.781858 130.807236 185.451173\nv 182.416276 134.469589 196.676601\nv 183.670212 134.562023 195.875589\nv 182.131387 134.795277 193.980388\nv 183.126431 134.814599 193.697401\nv 183.674941 135.174571 190.325102\nv 182.584484 135.178589 190.360308\nv 182.811954 135.263424 189.537227\nv 185.213564 134.567908 195.566926\nv 184.843421 134.827415 193.299281\nv 183.947161 134.824434 193.486376\nv 185.554787 135.166793 189.976668\nv 184.624334 135.172894 190.157686\nv 184.832863 135.253305 189.321002\nv 186.926319 134.548281 195.221770\nv 186.572357 134.813699 192.937331\nv 185.691510 134.821750 193.123561\nv 187.365007 135.144599 189.478419\nv 186.457996 135.157953 189.756884\nv 186.670326 135.233849 188.861519\nv 188.546742 134.524812 194.783404\nv 188.309309 134.779041 192.567724\nv 187.427587 134.798192 192.755451\nv 188.232359 135.125563 189.255727\nv 190.089336 134.453035 194.610340\nv 190.114746 134.716716 192.195483\nv 189.178698 134.746763 192.433776\nv 189.099780 135.106495 189.015294\nv 189.788457 135.088708 188.785914\nv 191.006895 134.665244 192.127571\nv 192.250222 134.815221 189.798893\nv 192.885602 134.842628 189.008402\nv 192.221891 134.902018 188.948702\nv 194.518879 134.441964 191.535785\nv 194.302718 134.374595 192.399998\nv 193.242009 134.975332 187.250698\nv 192.719556 135.082977 186.421626\nv 194.205835 134.921524 186.871475\nv 195.349791 134.391237 191.249898\nv 196.197871 134.338768 190.879621\nv 196.034714 134.272139 191.734876\nv 195.351173 134.707037 187.985160\nv 194.510116 134.958290 186.044444\nv 197.015245 134.284787 190.518097\nv 197.820180 134.227937 190.101795\nv 197.687729 134.162821 190.948297\nv 196.153758 134.644387 187.736275\nv 196.901955 134.584966 187.450266\nv 196.187821 134.827697 185.534184\nv 198.595455 134.171230 189.686624\nv 199.372801 134.115002 189.236012\nv 199.270010 134.049743 190.081383\nv 197.529001 134.523532 187.284561\nv 198.228230 134.471680 186.882837\nv 198.157630 134.565130 185.917463\nv 197.826616 134.658336 185.293503\nv 200.120961 134.052319 188.815020\nv 200.875668 133.981134 188.373605\nv 200.802064 133.922331 189.189357\nv 198.741676 134.463169 186.229715\nv 199.464857 134.402430 185.765886\nv 201.618200 133.910657 187.908910\nv 202.364793 133.826957 187.456802\nv 202.303363 133.767447 188.295834\nv 200.294392 134.312824 185.362573\nv 201.042433 134.236381 184.901351\nv 199.760482 134.565498 182.923226\nv 203.115700 133.743741 186.977881\nv 203.880839 133.660677 186.437748\nv 203.815095 133.600682 187.303594\nv 201.776183 134.159165 184.450789\nv 202.519138 134.071725 183.955180\nv 201.198584 134.398194 182.288769\nv 204.656814 133.565725 185.878491\nv 205.448768 133.449968 185.335921\nv 205.372188 133.401861 186.220890\nv 203.219243 133.988542 183.414678\nv 203.972145 133.894369 182.832945\nv 202.385045 134.272090 181.282216\nv 206.245509 133.333554 184.787445\nv 207.144737 133.171911 184.401141\nv 207.063370 133.124462 185.292016\nv 204.700775 133.795156 182.310326\nv 205.429873 133.685261 181.756555\nv 203.809746 134.082391 180.155372\nv 207.886154 133.049584 183.846570\nv 208.640346 132.934329 183.027500\nv 206.080295 133.579741 181.353579\nv 206.670916 133.488976 180.756151\nv 206.243654 133.630319 179.791179\nv 205.623840 133.777195 179.343870\nv 209.246823 132.839137 182.299035\nv 206.958613 133.472153 179.922931\nv 207.473345 133.392642 179.142924\nv 208.201540 133.257266 178.334327\nv 208.885933 133.121451 177.648719\nv 210.874432 132.590727 179.145568\nv 209.650034 132.957409 177.094302\nv 208.436089 133.295232 174.967731\nv 213.456495 131.944187 171.014583\nv 182.351983 133.796910 201.462198\nv 183.048449 133.747088 201.735967\nv 183.172215 134.013530 199.894098\nv 184.105360 134.468143 196.512583\nv 183.397892 134.457183 196.661676\nv 185.041216 134.035274 199.465352\nv 184.130073 134.034192 199.621303\nv 185.829284 134.459885 196.217040\nv 184.993399 134.464960 196.376610\nv 186.842471 134.029395 199.068778\nv 185.930772 134.035670 199.254119\nv 187.627842 134.433328 195.860586\nv 186.750971 134.447879 196.046174\nv 188.627760 134.004210 198.645038\nv 187.734114 134.020261 198.843322\nv 189.376286 134.403340 195.356954\nv 188.632734 134.412258 195.609733\nv 189.478474 133.989537 198.391951\nv 190.175328 134.340481 195.436669\nv 193.044652 134.086201 195.723267\nv 193.167892 134.326517 193.714779\nv 194.158530 134.287000 193.280400\nv 195.721633 133.574164 197.628944\nv 196.343949 133.569774 197.150752\nv 195.042446 134.237013 192.985554\nv 195.908799 134.190665 192.577642\nv 197.076651 133.512244 196.944857\nv 198.103205 133.448211 196.504666\nv 196.756880 134.138196 192.207365\nv 197.564838 134.086859 191.804436\nv 198.929393 133.390572 196.122239\nv 199.813877 133.330327 195.635478\nv 198.369772 134.030009 191.388134\nv 199.158991 133.973355 190.923298\nv 200.632058 133.275929 195.128232\nv 201.466108 133.204860 194.643637\nv 199.936337 133.917127 190.472686\nv 200.711325 133.852612 190.003431\nv 202.277515 133.141905 194.097215\nv 203.106125 133.073153 193.556102\nv 201.466032 133.781427 189.562017\nv 202.226246 133.704543 189.102861\nv 203.909622 132.997013 193.005988\nv 204.729675 132.912069 192.451917\nv 202.972839 133.620843 188.650753\nv 203.720497 133.534217 188.171140\nv 205.514970 132.822046 191.924519\nv 206.313632 132.723386 191.368561\nv 204.485636 133.451152 187.631007\nv 205.222143 133.355445 187.107488\nv 207.067090 132.624196 190.852276\nv 207.845623 132.519164 190.232956\nv 206.014097 133.239688 186.564918\nv 206.660068 133.146344 186.118123\nv 208.581775 132.419442 189.596079\nv 209.364071 132.303841 188.895055\nv 210.124703 132.192976 188.140374\nv 210.932624 132.043225 187.446226\nv 209.853743 132.737542 181.490232\nv 213.253577 131.670562 184.271063\nv 213.713761 131.586209 183.536926\nv 206.294733 133.363547 161.666471\nv 207.234751 133.139378 161.595852\nv 206.855668 133.288397 162.463987\nv 206.150022 133.789636 170.609709\nv 204.334221 134.083314 167.537623\nv 206.041561 133.738883 167.647462\nv 205.617554 133.793328 166.758095\nv 206.485407 133.616804 166.882481\nv 204.727384 133.980407 166.744728\nv 204.130774 133.983980 164.367099\nv 204.696089 133.917711 165.122650\nv 203.715745 134.111676 165.210830\nv 201.578066 134.628263 174.625937\nv 201.497737 134.634099 175.352149\nv 199.394944 134.969164 172.400297\nv 200.391404 134.817340 170.102865\nv 199.396912 134.969947 170.593194\nv 198.683532 135.068692 171.110880\nv 201.772885 134.607402 173.823186\nv 202.393917 134.503555 174.428751\nv 202.148909 134.548067 171.261787\nv 200.161029 134.843224 169.181517\nv 203.678546 134.287630 172.672260\nv 204.432173 134.154686 172.505876\nv 202.792436 134.383475 167.634850\nv 202.315672 134.448573 166.971248\nv 202.338879 134.481920 168.362954\nv 205.586259 133.730632 165.136017\nv 206.195605 133.551099 164.301607\nv 205.141066 134.017836 171.852045\nv 205.569246 133.924498 171.249135\nv 202.439136 134.489584 170.479788\nv 199.333871 134.951356 168.786033\nv 197.188356 135.253409 170.658524\nv 197.631003 135.202859 171.700242\nv 198.347538 135.108758 172.091110\nv 199.432982 134.947975 174.144619\nv 199.558891 134.908475 175.822284\nv 200.219007 134.814259 176.063485\nv 182.831658 135.432018 187.531974\nv 185.343081 135.669368 183.818278\nv 184.311927 135.683078 184.028339\nv 181.388806 135.675933 184.568509\nv 182.425769 135.684599 184.347870\nv 184.500728 135.436272 187.151167\nv 183.612291 135.432937 187.382757\nv 183.374021 135.685165 184.232764\nv 186.852913 135.294098 188.023416\nv 185.385680 135.432362 186.904013\nv 186.137819 135.658719 183.641934\nv 187.174105 135.611637 183.811285\nv 191.219094 135.367371 184.041322\nv 192.098032 135.440244 182.001480\nv 193.162719 135.091907 185.860435\nv 193.598373 135.255731 182.917446\nv 193.891361 135.048662 185.602116\nv 194.774728 134.985713 185.303373\nv 195.198357 135.103869 182.883765\nv 194.441598 135.206230 182.507990\nv 195.601045 134.929667 184.945353\nv 196.395381 134.862023 184.733836\nv 194.611273 135.290274 180.922163\nv 195.459660 135.227441 180.490337\nv 197.199409 134.790109 184.488626\nv 198.043868 134.688392 184.459463\nv 196.943382 135.008923 181.387810\nv 197.928490 134.911956 180.944398\nv 198.782483 134.812883 180.717945\nv 198.079488 134.993140 178.972954\nv 199.957251 134.585396 182.029914\nv 198.936498 134.913733 178.180484\nv 200.799698 134.483037 181.753987\nv 201.468042 134.405136 181.448687\nv 200.705594 134.636412 178.767106\nv 201.531774 134.538245 178.101413\nv 202.360679 134.415772 177.789204\nv 201.171731 134.659852 176.263300\nv 203.945301 134.098258 179.127191\nv 203.011892 134.382015 175.161019\nv 203.614034 134.256811 175.899879\nv 204.785216 133.957985 178.833376\nv 205.692727 133.794286 178.447466\nv 204.318864 134.131448 175.748772\nv 204.672435 134.075369 175.107545\nv 204.984255 134.029815 174.233295\nv 183.660413 130.737185 217.054561\nv 184.225266 130.245781 219.070631\nv 184.586055 130.717679 217.048596\nv 184.417003 131.354085 214.353357\nv 184.046574 131.516004 213.688293\nv 185.257767 131.309429 214.443118\nv 186.453662 130.283578 218.578637\nv 185.777275 130.141730 219.282325\nv 186.559752 130.670693 216.944669\nv 185.609421 130.678925 217.069905\nv 187.163299 131.351552 213.910109\nv 186.062180 131.334702 214.195459\nv 186.164513 131.503998 213.436862\nv 189.166517 130.183771 218.399227\nv 188.606639 130.706536 216.326810\nv 187.628214 130.696933 216.600822\nv 189.155796 131.372504 213.291091\nv 188.145826 131.365929 213.608100\nv 188.275602 131.527424 212.834504\nv 191.114707 130.190439 217.768315\nv 190.567930 130.708290 215.734182\nv 189.597234 130.709769 216.025213\nv 191.077350 131.378409 212.621495\nv 190.124714 131.374892 212.962696\nv 190.238209 131.537516 212.176294\nv 193.074424 130.168943 217.117565\nv 192.505869 130.702050 215.043777\nv 191.542428 130.701523 215.411252\nv 192.903409 131.410950 211.729302\nv 192.030605 131.392304 212.183066\nv 192.063649 131.559679 211.381330\nv 195.036045 130.131040 216.385805\nv 194.413968 130.687162 214.264331\nv 193.468627 130.685745 214.697939\nv 194.612163 131.478342 210.556894\nv 193.898422 131.425381 211.188682\nv 193.650195 131.631285 210.295778\nv 197.114910 130.259937 214.694108\nv 197.021903 130.079377 215.537173\nv 195.366317 130.675627 213.831799\nv 196.629869 131.237727 210.554623\nv 197.209283 131.326247 209.777196\nv 195.312581 131.575215 209.681464\nv 195.560807 131.369311 210.574368\nv 200.242272 130.069784 213.536987\nv 200.245761 130.770404 210.355382\nv 200.951460 130.776578 209.787585\nv 201.879978 130.713144 209.331244\nv 203.049833 129.636755 213.263027\nv 204.780197 129.708895 211.449875\nv 204.669901 129.521995 212.372335\nv 202.863323 130.616396 208.941585\nv 203.817697 130.517290 208.541433\nv 202.057076 130.878314 208.396453\nv 202.413486 130.973020 207.594447\nv 205.648217 129.603076 211.106980\nv 206.387457 129.449324 211.044829\nv 206.114918 129.332857 211.852946\nv 204.782530 130.407468 208.157326\nv 205.739410 130.276096 207.802900\nv 204.382181 130.948247 205.787185\nv 207.237636 129.307136 210.821118\nv 208.087818 129.128577 210.704093\nv 207.704341 129.000546 211.673770\nv 206.713257 130.139458 207.426740\nv 207.721922 129.979177 207.100762\nv 206.340032 130.698342 205.034636\nv 210.691208 128.956976 208.481205\nv 210.269874 128.893254 209.302533\nv 209.804060 129.147621 208.714451\nv 208.621531 129.856878 206.637940\nv 209.489429 129.777147 205.951665\nv 208.129051 130.484608 204.019726\nv 210.977015 129.081458 207.511929\nv 211.312610 129.664700 204.034519\nv 210.652030 129.942305 203.523865\nv 213.369874 128.796550 205.532361\nv 212.718274 128.914302 205.893308\nv 212.024160 129.966155 201.287522\nv 211.106928 130.162731 201.649432\nv 215.022716 129.490992 198.784928\nv 183.450838 129.285312 222.683924\nv 184.286092 129.275322 222.666789\nv 184.182428 130.055089 219.805328\nv 185.333737 129.968213 219.997984\nv 186.859738 128.919786 223.618694\nv 184.940386 129.367658 222.239212\nv 188.050645 129.973181 219.489064\nv 187.250028 129.929690 219.814399\nv 187.399505 130.129117 219.037629\nv 186.155351 129.912109 220.078623\nv 189.390115 129.213306 221.966506\nv 188.413754 129.204414 222.238414\nv 189.990697 129.999667 218.875619\nv 189.024301 129.988504 219.188686\nv 191.347842 129.167014 221.554169\nv 190.364640 129.181945 221.800843\nv 191.953715 129.989859 218.261404\nv 190.971921 129.994354 218.579249\nv 193.373300 129.124669 220.970037\nv 192.377076 129.137440 221.293682\nv 193.918751 129.960861 217.588216\nv 192.940828 129.977863 217.921121\nv 195.370382 129.120764 220.131608\nv 194.385568 129.127707 220.539593\nv 195.887193 129.923893 216.795826\nv 194.903495 129.944794 217.194681\nv 197.904691 128.687879 220.473757\nv 196.292932 129.116736 219.695453\nv 197.875117 129.861901 215.932406\nv 196.872956 129.892663 216.382184\nv 198.857424 129.023716 218.653375\nv 198.872350 129.784549 215.628579\nv 202.555531 128.485070 218.251517\nv 203.457415 128.306942 218.244460\nv 202.931541 129.024463 215.845025\nv 203.420061 128.706264 216.719467\nv 204.125898 128.398465 217.366754\nv 203.906161 128.976103 215.281661\nv 204.783420 128.891007 214.885706\nv 205.498626 129.280177 212.665801\nv 205.643403 128.845839 214.325018\nv 208.427216 127.666316 216.363872\nv 206.617529 128.806424 213.571615\nv 206.237866 129.126424 212.603650\nv 207.233822 128.859104 212.758760\nv 210.285996 127.620260 214.660073\nv 208.084004 128.680545 212.641736\nv 211.241806 128.257408 210.871930\nv 209.868016 128.762038 210.348188\nv 209.453915 128.631082 211.358672\nv 208.968625 128.952943 210.546262\nv 210.755165 128.571393 210.114943\nv 212.621617 128.765381 206.772755\nv 183.789259 131.982697 211.433159\nv 182.653938 132.006168 211.402288\nv 184.275377 132.550737 208.571519\nv 185.065114 132.498594 208.735572\nv 185.831868 131.965380 211.244834\nv 184.841744 131.974356 211.336321\nv 186.720215 132.574863 208.029693\nv 185.843911 132.527511 208.455981\nv 187.826775 131.974432 210.763008\nv 186.862465 131.965707 211.030042\nv 188.535598 132.613954 207.300525\nv 187.624515 132.598314 207.676910\nv 189.749332 131.988180 210.120574\nv 188.810905 131.981121 210.446197\nv 190.365558 132.614636 206.675539\nv 189.457605 132.616373 206.978701\nv 191.550123 131.979643 209.488350\nv 190.651030 131.990440 209.781459\nv 192.297383 132.580951 206.009097\nv 191.412195 132.587648 206.373585\nv 192.265047 131.985100 209.153302\nv 193.211503 132.454463 206.281113\nv 199.491273 131.930362 204.977094\nv 200.377976 131.787214 205.009410\nv 201.210081 131.651255 205.043086\nv 200.109536 131.974600 204.226095\nv 201.864155 131.677923 204.298494\nv 202.487634 131.688636 203.648084\nv 204.959504 131.012253 204.843343\nv 203.252400 131.578090 203.481636\nv 204.130532 131.428465 203.406466\nv 205.735879 130.885390 204.684149\nv 206.645238 130.784370 204.220336\nv 207.377841 130.749536 203.505134\nv 208.257501 130.636822 202.954037\nv 207.520523 131.336467 199.775874\nv 209.233987 130.489470 202.483471\nv 210.152492 130.337490 202.037879\nv 209.927215 130.219915 203.023037\nv 208.482778 130.754397 201.968880\nv 209.746405 130.713660 200.393427\nv 208.884776 130.816879 201.029870\nv 209.171917 130.923495 199.924984\nv 209.004490 131.109279 199.027200\nv 208.142860 131.212499 199.663643\nv 212.236435 130.063223 200.410722\nv 210.700841 130.538901 200.004980\nv 210.413699 130.432286 201.109866\nv 213.281812 129.972630 199.094414\nv 214.068361 129.769414 198.882246\nv 212.502394 130.117126 199.608692\nv 211.534438 130.851376 196.463939\nv 212.258962 130.752395 195.757617\nv 215.479439 129.728942 196.252592\nv 212.914436 130.641858 195.243226\nv 216.045012 129.662697 195.421383\nv 180.151113 136.100006 168.230800\nv 176.777343 136.072387 170.235889\nv 177.598992 136.083684 169.686356\nv 177.706928 136.096317 170.597835\nv 180.313504 136.135916 170.097458\nv 168.195318 135.516844 175.296625\nv 167.365292 135.445403 174.886672\nv 168.104136 135.529266 174.445348\nv 163.463039 132.760058 200.357792\nv 162.553774 132.692296 199.954841\nv 164.026147 132.934916 199.718643\nv 164.338196 132.836193 200.634886\nv 179.412162 131.276419 214.819286\nv 180.852331 133.146031 205.466944\nv 180.023888 133.203130 205.080601\nv 179.434427 135.676962 184.404745\nv 180.491846 135.676151 184.579588\nv 180.814724 136.025438 178.075105\nv 160.050202 123.489452 233.602203\nv 177.939147 125.651501 233.983398\nv 156.832611 125.640151 225.534380\nv 157.534027 124.785166 228.510479\nv 163.374030 125.942953 228.733527\nv 162.141767 126.524500 226.348123\nv 162.393630 126.807313 225.630709\nv 159.366979 127.895860 219.992033\nv 158.438439 127.797682 219.640784\nv 160.009489 128.652468 217.645496\nv 159.995335 128.916553 216.591234\nv 160.317938 129.202638 215.704804\nv 159.220269 128.898182 216.092010\nv 164.891553 126.152020 228.877833\nv 164.130953 125.972086 229.050185\nv 162.224418 128.436446 219.968288\nv 161.994823 129.454443 215.893180\nv 161.018914 129.439789 215.264680\nv 161.920733 129.673224 214.953832\nv 160.383166 130.194531 211.525253\nv 159.365758 130.123430 210.991228\nv 161.230246 130.439378 211.055283\nv 160.960920 130.599057 210.118702\nv 162.006166 130.670340 210.605618\nv 167.829007 126.973168 227.746963\nv 166.046689 126.894467 227.195460\nv 164.430114 128.282051 221.836223\nv 166.285437 127.859859 224.176265\nv 164.740221 129.862191 215.985933\nv 163.880581 130.272642 213.685963\nv 163.613986 130.401027 212.951798\nv 163.306195 130.583070 211.919593\nv 162.583283 130.328618 212.574405\nv 161.428412 130.265814 212.012169\nv 163.020229 130.740149 211.005670\nv 162.257762 131.608786 206.094892\nv 161.310056 131.528343 205.717647\nv 163.011246 131.819577 205.553396\nv 163.307548 131.699189 206.440323\nv 162.528239 131.917984 204.652832\nv 163.578025 132.008387 204.998263\nv 164.337415 132.079292 205.183760\nv 164.216723 131.760050 206.803915\nv 164.050931 130.812558 211.383063\nv 165.556893 130.251576 214.815582\nv 166.463472 130.262342 215.282397\nv 165.599511 130.075997 215.590842\nv 164.781510 130.231970 214.444671\nv 165.646800 129.872958 216.452749\nv 166.595927 129.887083 216.909374\nv 166.997899 128.501918 222.301588\nv 166.015867 129.006987 220.003863\nv 166.978129 129.022711 220.403262\nv 168.290118 127.167576 227.294759\nv 169.193511 127.202575 227.517436\nv 167.783616 127.529807 225.923501\nv 165.277243 135.177148 176.538858\nv 164.117867 134.847057 181.007773\nv 164.849346 134.958654 180.690778\nv 162.574390 134.659030 180.696105\nv 163.363569 134.738170 181.286959\nv 161.945766 134.280998 185.263839\nv 162.722270 134.349045 185.801750\nv 161.219181 134.138833 185.625882\nv 161.224117 134.210195 184.761846\nv 159.793223 133.919607 185.547861\nv 160.532033 134.002482 186.028559\nv 161.253683 134.073286 186.530553\nv 159.251126 133.357490 190.696575\nv 160.161543 133.453496 191.222954\nv 158.311312 133.144677 191.081761\nv 158.298940 133.259024 189.989949\nv 158.172901 133.020721 192.029374\nv 157.220716 132.922255 191.322749\nv 158.869688 133.073207 192.705532\nv 158.257481 132.556915 195.956300\nv 158.926285 132.614482 196.427185\nv 157.546596 132.380631 196.226622\nv 157.514007 132.483213 195.435845\nv 156.056180 132.114392 195.993240\nv 156.847137 132.200021 196.554739\nv 157.590611 132.273722 197.075194\nv 156.082320 131.383669 200.939904\nv 156.918738 131.453184 201.544715\nv 155.486016 131.175813 201.399166\nv 155.222319 131.293516 200.364137\nv 153.984084 130.856983 201.306798\nv 154.885881 130.968291 201.868121\nv 155.745882 131.058445 202.443888\nv 154.562866 130.056110 206.438245\nv 155.473256 130.150996 207.006799\nv 153.874560 129.809019 206.818971\nv 153.678808 129.940492 205.934645\nv 153.193035 129.562443 207.239270\nv 154.077093 129.678061 207.742870\nv 153.197631 128.385139 212.562610\nv 152.383352 128.291937 212.050223\nv 152.166447 128.689283 210.090440\nv 150.715589 128.081109 210.962337\nv 151.463005 128.388351 210.533477\nv 151.519530 128.179739 211.512459\nv 151.635936 127.984694 212.479083\nv 164.288655 134.321521 188.553625\nv 163.601940 134.274610 188.086931\nv 164.177704 134.385543 187.672107\nv 162.782895 134.205771 187.576052\nv 162.915629 133.736420 192.501849\nv 163.713488 133.793002 192.944252\nv 162.220101 133.580245 192.957706\nv 162.071021 133.662062 192.076173\nv 160.758933 133.341317 193.115449\nv 161.583944 133.435373 193.399615\nv 162.428551 133.509731 193.825291\nv 161.241551 132.823870 197.726525\nv 162.040515 132.887675 198.135822\nv 160.626879 132.663748 198.120424\nv 160.427507 132.755433 197.283197\nv 159.142632 132.424096 198.036574\nv 159.994856 132.496687 198.558100\nv 160.808900 132.565124 199.001428\nv 159.712618 131.679999 203.362008\nv 160.658031 131.759176 203.851769\nv 159.079470 131.493147 203.762970\nv 158.755359 131.606427 202.783639\nv 157.529616 131.225561 203.602000\nv 158.440364 131.301207 204.186970\nv 159.397622 131.374779 204.765339\nv 158.077791 130.373309 208.652927\nv 158.995760 130.450225 209.139492\nv 157.349200 130.152815 208.986753\nv 157.188260 130.303546 208.107694\nv 155.741184 129.842734 208.823972\nv 156.581663 129.913289 209.365221\nv 157.471194 129.983052 209.910455\nv 155.808177 128.700203 213.908266\nv 156.554652 128.783505 214.271188\nv 155.151125 128.434755 214.350290\nv 154.905279 128.589448 213.491117\nv 153.974270 127.159545 218.104354\nv 153.026448 127.079622 217.485537\nv 153.799006 126.165836 221.388252\nv 164.034274 133.634030 194.618321\nv 163.236933 133.575651 194.224331\nv 163.862050 133.712981 193.777372\nv 162.895549 132.950973 198.574720\nv 163.686590 133.012627 198.914427\nv 162.295957 132.795483 199.002650\nv 161.698740 132.628998 199.515942\nv 161.620396 131.840403 204.285083\nv 160.999094 131.647946 204.774652\nv 160.347690 131.447116 205.284333\nv 159.968894 130.522984 209.657682\nv 159.211865 130.295336 210.050177\nv 158.392624 130.050671 210.473038\nv 157.458878 128.932346 214.481543\nv 164.229307 134.769130 182.706966\nv 162.715909 134.274134 186.666644\nv 162.007816 134.141273 187.037283\nv 161.217541 133.584868 191.594776\nv 160.319496 133.374515 192.160208\nv 159.702934 133.209945 192.743626\nv 159.687668 132.684971 196.892195\nv 159.051452 132.524822 197.212086\nv 158.381249 132.353607 197.571564\nv 157.806836 131.529989 202.149549\nv 157.234115 131.342771 202.579767\nv 156.641518 131.148757 202.997167\nv 156.323781 130.230204 207.566273\nv 155.609144 130.003845 207.882046\nv 154.890658 129.763526 208.264498\nv 154.071866 128.498693 213.020757\nv 153.373993 128.210447 213.474994\nv 152.655839 127.917125 213.916576\nv 151.755393 127.793946 213.408795\nv 151.382147 125.942506 219.817246\nv 147.621949 127.670552 208.559572\nv 148.361564 127.987624 208.192262\nv 148.352179 127.772753 209.163614\nv 149.116136 129.116632 203.814114\nv 148.249545 128.951517 203.276743\nv 149.784292 129.429528 203.153500\nv 149.945515 129.282598 204.202390\nv 151.482482 130.497453 199.704700\nv 150.686266 130.359321 199.247368\nv 152.127546 130.735738 199.207174\nv 152.289671 130.626505 200.202401\nv 153.562463 131.090960 199.229962\nv 152.746199 130.968474 198.728544\nv 151.939010 130.839423 198.230843\nv 153.559179 131.811798 194.097093\nv 152.665397 131.678687 193.415398\nv 154.354267 132.019362 193.860533\nv 154.409428 131.919826 194.771789\nv 156.018793 132.331975 194.277328\nv 155.223425 132.238334 193.677735\nv 154.373175 132.130306 193.003039\nv 154.795097 132.628965 189.302425\nv 155.573119 132.726677 190.031861\nv 154.064166 132.536612 188.595391\nv 154.974323 132.750506 188.395236\nv 156.603148 133.051336 188.815582\nv 155.828078 132.952107 188.215424\nv 155.097146 132.859754 187.508391\nv 157.559863 133.623589 184.198198\nv 156.920765 133.528628 183.818455\nv 158.267154 133.779232 183.781666\nv 158.326836 133.732733 184.633184\nv 159.743939 134.039820 183.805632\nv 158.986765 133.941063 183.327888\nv 158.219792 133.831919 182.892902\nv 160.283678 134.381991 179.229280\nv 159.536813 134.274657 178.826658\nv 161.005624 134.510604 178.811067\nv 161.037897 134.481755 179.664997\nv 162.482495 134.731270 178.936102\nv 161.727586 134.642376 178.384441\nv 160.973367 134.542612 177.948724\nv 163.345392 134.977709 174.522598\nv 162.693947 134.893279 173.992560\nv 164.011860 135.065664 174.281641\nv 163.838554 135.032743 175.076179\nv 146.896945 124.349800 220.073261\nv 147.536168 124.451655 220.490322\nv 149.091833 127.867803 209.781614\nv 149.875429 128.189774 209.389829\nv 149.875469 127.967751 210.375139\nv 152.714355 129.802706 205.403641\nv 153.138443 130.746548 200.747537\nv 153.780375 130.975224 200.264137\nv 154.408104 131.201395 199.789223\nv 155.256877 132.024622 195.407770\nv 156.003819 132.217160 195.120698\nv 156.818096 132.421746 194.862798\nv 156.400054 132.828353 190.668293\nv 156.532191 132.944535 189.738703\nv 157.430084 133.153012 189.452014\nv 159.061521 133.829780 185.094242\nv 159.765829 133.978203 184.670270\nv 160.475642 134.129647 184.259250\nv 161.798404 134.576512 180.108640\nv 162.535829 134.692886 179.834248\nv 164.515228 135.109991 175.519430\nv 165.188075 135.200256 174.992373\nv 165.198280 135.189549 175.676581\nv 164.985864 135.192092 174.100031\nv 165.668917 135.271651 174.257182\nv 164.968534 134.514117 187.385801\nv 165.804858 134.608633 187.406827\nv 165.700743 134.526970 188.159827\nv 166.662873 135.007855 183.367832\nv 165.817974 134.946828 182.878245\nv 167.472935 135.114733 182.943394\nv 167.543152 135.066256 183.816465\nv 167.369128 135.161502 182.056039\nv 169.278438 135.542657 177.668136\nv 168.536204 135.459287 178.168676\nv 168.411828 135.481867 177.202746\nv 168.048356 135.492110 167.191049\nv 165.250439 133.143355 199.413907\nv 165.863718 133.121709 200.029049\nv 166.399512 133.775725 195.762754\nv 165.618004 133.735566 195.373984\nv 167.063411 133.908855 195.269742\nv 167.220130 133.814500 196.138369\nv 168.533117 134.084214 195.063394\nv 167.711709 134.044576 194.745111\nv 166.891090 134.005801 194.369496\nv 168.406310 134.613787 190.198820\nv 167.583454 134.572143 189.811473\nv 169.003450 134.712595 189.733500\nv 169.166892 134.645774 190.556655\nv 170.224662 134.836696 189.542140\nv 169.574041 134.791549 189.461043\nv 168.813459 134.759562 189.103208\nv 170.957858 135.371965 183.608447\nv 170.047793 135.330258 183.216730\nv 169.263987 135.226811 183.743557\nv 171.050651 135.646340 178.551434\nv 170.160034 135.595932 178.145932\nv 171.815059 135.715360 178.042956\nv 171.948455 135.689913 178.936593\nv 171.674922 135.744372 177.126333\nv 172.572726 135.787945 177.511491\nv 168.661671 131.375663 211.432570\nv 167.586794 131.362691 210.928352\nv 168.397524 131.547629 210.458567\nv 169.585232 131.385815 211.820965\nv 168.484816 132.475253 205.720623\nv 169.016572 132.615522 205.216932\nv 170.562324 133.747991 198.913605\nv 169.786196 133.886439 197.439322\nv 170.566615 133.987943 197.136522\nv 170.565451 133.857711 198.111364\nv 168.973243 133.878426 196.946149\nv 170.716019 134.104299 196.354739\nv 170.193742 134.146027 195.733953\nv 172.217316 134.728392 192.002021\nv 171.289723 134.640647 192.220558\nv 171.743894 134.926410 189.786241\nv 171.319480 135.274427 185.320830\nv 172.180954 135.310175 185.612053\nv 174.391191 135.520644 184.398738\nv 171.872124 135.411318 183.967925\nv 172.880995 135.727535 179.370216\nv 173.645371 135.789148 178.841236\nv 173.813503 135.757751 179.783337\nv 173.468073 135.823514 177.872524\nv 174.400581 135.853730 178.285645\nv 165.670021 135.030792 181.158800\nv 166.504390 135.099603 181.609265\nv 165.758287 134.987521 182.044297\nv 167.563034 135.415738 176.720617\nv 166.742764 135.343996 176.306013\nv 168.305268 135.499109 176.220077\nv 169.909916 135.641469 176.254628\nv 169.044112 135.582972 175.778754\nv 171.207011 135.754076 167.256728\nv 165.293542 133.909297 193.663003\nv 166.085242 133.958657 194.024384\nv 165.451092 133.820720 194.532745\nv 166.730554 134.542582 189.214067\nv 165.929133 134.484438 188.905008\nv 167.389967 134.651047 188.778259\nv 168.242326 134.769608 188.474685\nv 168.493507 135.116193 184.427669\nv 169.404279 135.169871 184.779198\nv 170.035659 135.618512 177.180002\nv 170.791512 135.694744 176.732424\nv 171.549178 135.767329 176.200959\nv 171.210982 135.792674 173.491172\nv 172.557194 135.893290 170.581141\nv 172.489393 135.886397 169.727708\nv 173.425824 135.944243 170.897724\nv 173.189145 135.920789 169.174683\nv 176.439340 135.941575 164.762863\nv 173.244480 126.906574 229.614944\nv 172.853891 127.141296 228.804527\nv 171.927550 127.143830 228.561763\nv 173.395853 128.414537 224.856945\nv 172.565869 128.426137 224.624735\nv 173.218919 128.623611 224.130198\nv 174.223333 128.397399 225.110613\nv 173.502637 129.960498 219.275640\nv 172.491597 129.972607 218.964575\nv 173.350982 130.156255 218.494082\nv 174.470327 129.940738 219.597058\nv 173.217917 130.337249 217.705861\nv 172.193369 130.335224 217.417645\nv 174.396012 131.367230 213.583351\nv 173.387051 131.383598 213.254302\nv 174.252786 131.544085 212.744842\nv 175.416722 131.346461 213.909463\nv 174.065074 131.702322 211.940325\nv 173.084362 131.711660 211.609910\nv 174.819021 132.574992 207.774317\nv 173.930583 132.578958 207.487502\nv 174.658893 132.706869 207.012414\nv 175.744259 132.565330 208.059526\nv 174.503649 132.835413 206.227162\nv 173.614394 132.847412 205.881540\nv 175.447816 133.608835 201.909905\nv 174.600060 133.617367 201.600638\nv 175.338921 133.731824 201.111073\nv 176.322778 133.597415 202.210321\nv 175.194784 133.840121 200.291366\nv 174.389615 133.846643 199.986397\nv 176.022426 134.411337 196.398420\nv 175.376378 134.445444 195.940448\nv 176.023075 134.522249 195.567954\nv 176.812854 134.401180 196.688977\nv 176.399216 134.624195 194.792350\nv 177.045265 134.590088 195.250322\nv 175.466525 134.654541 194.240147\nv 177.062720 135.149809 190.191358\nv 176.332775 135.171987 189.747805\nv 175.831765 135.207763 189.102204\nv 177.586047 135.653730 184.234706\nv 177.217837 135.704490 183.440893\nv 176.772525 135.737726 182.591552\nv 178.355971 135.993522 178.070374\nv 177.634643 135.993069 177.714781\nv 178.202463 136.030657 177.159945\nv 176.127868 127.335598 228.903790\nv 174.030892 127.586348 227.689525\nv 174.991146 127.641862 227.712609\nv 175.184233 128.392310 225.323295\nv 175.009804 128.606922 224.575090\nv 175.980198 128.307665 225.738161\nv 175.438547 128.782910 224.044837\nv 176.181766 128.867172 223.876694\nv 174.129138 129.173245 222.364666\nv 175.497017 129.879246 220.035997\nv 175.388711 130.082654 219.244085\nv 176.442813 129.793513 220.530690\nv 174.971288 130.664756 216.752325\nv 176.011235 130.640264 217.083814\nv 176.444254 131.331682 214.194952\nv 176.289278 131.512938 213.359381\nv 177.442215 131.324673 214.411110\nv 175.654787 131.980916 210.956430\nv 176.677816 131.961384 211.263510\nv 176.647451 132.555983 208.312004\nv 176.450523 132.693555 207.551708\nv 177.598244 132.538162 208.570947\nv 175.975804 133.078368 205.203925\nv 176.851515 133.060122 205.508993\nv 177.211648 133.576433 202.497138\nv 177.075546 133.702310 201.707157\nv 178.101581 133.550784 202.813392\nv 176.571788 134.032639 199.275902\nv 177.412966 134.020780 199.556573\nv 177.575439 134.411532 196.771312\nv 177.431709 134.498495 196.108261\nv 178.374769 134.409501 196.938322\nv 177.745618 135.148197 190.375852\nv 177.697394 135.221708 189.672635\nv 178.530256 135.133605 190.681898\nv 178.180173 135.281696 189.077859\nv 177.759037 135.403446 187.485150\nv 178.523575 135.666694 184.345781\nv 178.711049 135.857802 181.097553\nv 179.201027 136.003458 178.191254\nv 177.009676 126.663184 230.990184\nv 177.395410 126.956671 230.213225\nv 177.960498 127.268929 229.323294\nv 178.722398 128.139667 226.603432\nv 175.739828 127.755499 227.479806\nv 176.512622 127.605984 228.070642\nv 178.885055 128.420534 225.693737\nv 177.990173 128.574794 225.110540\nv 178.436127 130.074236 219.698677\nv 177.397213 129.909469 220.213355\nv 177.006183 130.622600 217.318711\nv 178.462900 131.305998 214.600124\nv 178.337495 131.479484 213.833884\nv 177.650211 131.941420 211.512327\nv 178.523672 132.522629 208.760820\nv 178.279143 132.668675 207.994060\nv 177.711679 133.032738 205.813599\nv 179.098768 133.533522 203.051349\nv 178.961602 133.664067 202.231930\nv 178.213618 134.012699 199.750599\nv 179.255044 134.398410 197.120497\nv 179.074570 134.497757 196.372770\nv 178.265629 134.782458 193.808063\nv 179.324630 135.111982 190.990667\nv 179.174667 135.198474 190.165898\nv 179.047634 135.277207 189.273192\nv 179.039525 135.737404 183.554400\nv 179.517818 135.786148 182.769466\nv 179.971231 136.014958 178.086380\nv 179.693995 136.042611 177.410664\nv 171.699007 128.426823 224.366078\nv 170.867218 128.428891 224.091559\nv 171.557147 128.637278 223.623469\nv 171.312524 128.824042 222.867995\nv 170.583050 128.812808 222.662227\nv 171.502718 129.954419 218.713012\nv 170.494758 129.942790 218.412212\nv 171.331982 130.156736 217.882216\nv 171.185409 130.323596 217.116845\nv 170.170061 130.311074 216.797246\nv 172.389960 131.388184 212.898792\nv 171.435366 131.391541 212.556382\nv 172.289230 131.563811 212.073383\nv 172.129767 131.715018 211.267501\nv 171.201205 131.719500 210.903381\nv 173.034880 132.581475 207.170951\nv 172.138178 132.586023 206.835176\nv 172.873753 132.715383 206.389824\nv 172.717692 132.851960 205.545765\nv 171.798665 132.849515 205.195537\nv 173.748421 133.621811 201.284892\nv 172.943132 133.623575 200.957997\nv 173.685876 133.742119 200.474911\nv 173.584326 133.848407 199.659502\nv 172.827498 133.847660 199.358071\nv 174.458313 134.452037 195.553192\nv 173.631469 134.472283 195.025247\nv 174.550183 134.576603 194.582037\nv 174.639682 134.674787 193.712202\nv 173.797535 134.691683 193.202647\nv 174.791037 134.958068 191.144178\nv 174.821425 135.049948 190.305204\nv 174.064551 135.072981 189.745786\nv 174.894182 135.143686 189.448052\nv 175.074891 135.230795 188.542786\nv 176.350622 135.507339 185.626686\nv 175.455446 135.486680 185.491216\nv 175.715962 135.708863 182.467727\nv 176.752265 135.982293 177.404934\nv 176.599820 136.010963 176.448954\nv 178.340420 136.052543 176.266169\nv 179.061749 136.052996 176.621762\nv 177.370048 136.040892 175.842460\nv 178.229334 136.063231 175.304277\nv 178.027817 136.074292 174.327498\nv 178.998190 136.085942 174.751207\nv 177.153504 136.061674 173.964084\nv 176.966663 136.078394 172.097483\nv 177.773951 136.101944 171.533142\nv 179.535765 136.100350 174.041188\nv 179.737281 136.089290 175.017967\nv 180.357754 136.136136 171.882778\nv 174.062773 135.966049 169.374728\nv 174.945178 136.002287 169.618286\nv 174.204257 135.979923 170.243754\nv 174.308229 135.980480 171.141282\nv 175.188167 136.018933 171.445873\nv 173.842326 135.934827 174.584110\nv 171.089026 135.319842 184.454564\nv 170.405214 135.235074 184.961352\nv 170.911636 134.882744 189.621117\nv 170.451006 134.790629 190.170312\nv 170.111973 134.695840 190.845333\nv 169.484782 134.118734 195.472956\nv 168.835695 133.982150 196.054919\nv 168.021578 133.843905 196.536587\nv 168.230625 133.202928 201.172334\nv 167.408950 133.153466 200.943686\nv 166.945389 132.953431 201.860738\nv 166.362572 133.032331 200.979414\nv 167.747195 132.934260 202.524517\nv 169.488629 129.926957 218.082891\nv 168.511907 129.914483 217.728693\nv 169.347300 130.132633 217.227218\nv 169.193340 130.298601 216.443049\nv 168.265892 130.290870 216.075889\nv 170.516349 131.389099 212.205059\nv 170.403518 131.563884 211.346879\nv 170.037157 132.022812 208.854548\nv 171.272575 132.578389 206.516847\nv 171.040818 132.702361 205.739405\nv 170.455481 133.097260 203.057437\nv 172.125451 133.623680 200.592866\nv 172.110101 133.741829 199.780531\nv 172.057013 133.845606 198.990586\nv 171.342743 133.849496 198.610805\nv 172.764256 134.391914 195.286766\nv 172.856127 134.516480 194.315611\nv 172.921436 134.615523 193.447938\nv 172.995631 134.710357 192.596494\nv 173.243558 135.091431 189.105914\nv 173.087338 135.332247 186.018032\nv 174.534564 135.471173 185.164519\nv 175.300637 135.876872 178.629937\nv 174.717430 135.968956 174.871191\nv 176.087475 136.053363 171.775900\nv 175.985970 136.050590 170.817340\nv 175.878035 136.037957 169.905862\nv 148.459453 131.793589 173.045170\nv 155.077755 133.281939 164.401529\nv 155.660863 133.438689 164.850069\nv 161.469952 134.720941 172.209301\nv 161.480498 134.723166 171.266614\nv 162.153070 134.826127 171.640241\nv 158.206998 134.087402 167.506327\nv 158.004977 134.095386 169.321012\nv 158.667753 134.227700 169.701154\nv 155.712494 133.661358 173.001957\nv 156.597217 133.848184 172.935901\nv 153.242909 133.049588 176.959502\nv 153.945876 133.197285 177.699523\nv 152.415781 132.831199 177.304707\nv 152.417170 132.807547 178.284738\nv 160.278762 134.278642 163.528640\nv 148.490886 131.632198 180.810511\nv 160.787006 134.512873 166.421061\nv 159.729285 134.418680 169.809146\nv 160.539252 134.559335 169.720825\nv 159.010842 134.297971 170.385715\nv 156.520462 133.818352 174.558252\nv 156.957115 133.916662 173.771725\nv 157.324655 133.980975 174.582501\nv 155.992159 133.699133 175.373799\nv 153.823548 133.130824 178.644728\nv 153.059660 132.947210 178.811446\nv 153.721670 133.074061 179.534489\nv 151.029506 132.230924 182.934157\nv 151.799795 132.381991 183.754306\nv 148.034347 130.995949 187.951554\nv 148.528165 131.060005 188.871664\nv 159.909586 134.472728 172.038931\nv 160.660708 134.597613 172.570690\nv 161.333280 134.700574 172.944316\nv 158.685744 134.198697 176.529082\nv 159.480230 134.325471 177.059000\nv 158.145321 134.083088 177.127576\nv 158.065687 134.093955 176.153744\nv 156.891077 133.852560 176.916329\nv 157.469688 133.947337 177.528993\nv 158.089745 134.052080 177.904331\nv 155.753035 133.418597 181.703619\nv 156.519697 133.549755 182.154064\nv 155.006859 133.298459 180.930471\nv 153.090684 132.585164 185.347024\nv 153.737456 132.676769 186.089807\nv 152.261820 132.375174 185.403645\nv 152.099114 132.271004 186.278225\nv 151.444683 132.168567 185.494526\nv 152.720367 132.360426 187.070065\nv 151.942237 131.806888 190.771667\nv 152.706930 131.910210 191.554009\nv 150.938316 131.522699 190.949649\nv 151.071495 131.661698 189.997542\nv 150.942918 131.406284 192.048494\nv 148.987705 130.382325 195.792355\nv 149.279147 130.584960 194.931032\nv 148.387273 130.149093 196.209367\nv 165.139678 135.088387 165.000933\nv 164.018911 135.038961 168.031668\nv 163.572469 135.004259 168.827590\nv 160.434877 134.553465 171.164690\nv 161.117995 134.658651 170.595631\nv 159.547083 134.408213 171.367948\nv 157.206634 133.930506 176.060633\nv 157.747056 134.046115 175.462139\nv 156.572446 133.804720 176.224724\nv 154.332196 133.183965 180.247274\nv 152.436252 132.482726 184.563324\nv 150.446151 131.581958 189.168820\nv 149.538431 131.323234 189.145511\nv 149.057309 131.114280 189.901677\nv 147.452383 128.776830 202.862192\nv 148.157750 129.088875 202.350672\nv 150.377723 130.548300 197.409537\nv 150.571104 130.458103 198.349210\nv 151.126975 130.696883 197.769800\nv 151.817917 131.556964 192.684366\nv 152.656538 131.789612 192.454806\nv 153.554410 132.031933 192.285041\nv 153.383936 132.450697 187.820494\nv 153.579822 132.567882 186.937773\nv 154.401025 132.767040 186.840237\nv 156.585684 133.510309 183.009876\nv 157.434194 133.709534 182.490868\nv 158.793800 134.163152 178.390440\nv 159.508392 134.299335 177.939132\nv 160.223243 134.436976 177.495219\nv 162.005860 134.799915 173.419994\nv 162.830611 134.917266 173.155494\nv 163.019950 134.951651 172.288002\nv 165.085227 135.217841 169.906352\nv 164.249405 135.111136 169.523256\nv 167.664527 135.434573 166.474617\nv 167.112072 135.458697 171.642522\nv 166.572619 135.368820 174.592459\nv 165.950091 135.267413 176.011801\nv 166.663801 135.356397 175.443736\nv 164.169620 134.809823 181.873018\nv 164.983606 134.878018 182.427779\nv 165.092809 134.389922 188.883982\nv 164.510830 133.851381 193.338243\nv 164.826304 133.686206 195.012602\nv 164.561746 133.088762 199.191522\nv 165.400158 132.921674 200.946102\nv 165.138917 131.763248 207.434263\nv 166.657519 131.601831 209.224956\nv 166.155459 131.450866 209.659574\nv 166.561457 131.319105 210.568099\nv 167.333647 130.274173 215.668207\nv 167.438334 130.103462 216.465339\nv 167.528172 129.903781 217.317056\nv 169.689378 128.849648 222.206541\nv 169.831687 128.676185 222.893264\nv 169.924427 128.433137 223.754365\nv 169.030756 128.469976 223.298679\nv 169.401112 126.972265 228.300832\nv 170.577221 127.614650 226.662109\nv 172.101524 125.296099 233.920749\nv 145.242703 134.467169 159.380896\nv 144.450699 133.902747 159.281352\nv 144.553600 134.952003 159.466364\nv 143.761597 133.101587 159.140064\nv 218.084702 130.043430 158.600844\nv 218.084702 131.329423 158.827601\nv 218.761597 130.529601 158.686550\nv 216.881027 135.336353 159.534139\nv 218.048190 135.248609 159.518667\nv 217.594434 134.475326 159.382293\nv 218.048190 136.534602 159.745424\nv 215.948862 130.897176 158.751366\nv 216.644780 131.171491 158.799748\nv 216.711890 130.568938 158.693512\nv 217.908399 133.513804 159.212776\nv 216.741236 133.601549 159.228248\nv 217.231504 131.741640 158.900313\nv 216.468476 132.069878 158.958166\nv 213.980770 132.015192 158.948536\nv 214.444370 131.859095 158.921032\nv 146.476450 133.132030 159.145459\nv 147.198832 133.344501 159.182930\nv 147.012784 132.339538 159.005723\nv 146.256993 136.816931 159.795210\nv 146.169430 135.791906 159.614481\nv 145.433168 136.541452 159.746636\nv 214.704460 138.432743 160.080109\nv 215.486604 137.626416 159.937951\nv 214.702625 137.493420 159.914488\nv 213.965163 135.580228 159.577127\nv 214.461464 136.542348 159.746787\nv 214.988468 135.724972 159.602670\nv 213.724364 134.789981 159.437790\nv 213.655784 140.020513 160.360093\nv 213.426096 140.848614 160.506114\nv 214.437991 140.813870 160.499970\nv 215.369079 143.849164 161.035172\nv 214.741874 143.089415 160.901211\nv 214.543032 144.244816 161.104947\nv 214.062065 142.563519 160.808489\nv 213.362430 141.914622 160.694080\nv 213.216191 142.836170 160.856577\nv 212.348669 138.907055 160.163778\nv 213.282185 139.177502 160.211442\nv 213.654733 146.178999 161.446028\nv 214.632433 145.989128 161.412535\nv 214.192538 145.194436 161.272402\nv 213.646117 147.889933 161.747700\nv 214.153234 148.747479 161.898897\nv 211.650097 140.561604 160.455515\nv 211.586431 141.627612 160.643480\nv 212.580222 141.121265 160.554203\nv 210.145905 136.059470 159.661643\nv 210.987623 136.377725 159.717770\nv 210.877654 135.479130 159.559322\nv 210.701417 132.585569 159.049112\nv 209.658709 132.881879 159.101343\nv 212.776313 146.260382 161.460358\nv 212.348917 145.512328 161.328454\nv 211.910391 146.388404 161.482917\nv 212.679055 144.672250 161.180324\nv 213.565333 144.434686 161.138441\nv 213.029549 143.722630 161.012869\nv 208.741282 133.122122 159.143723\nv 207.961041 133.716637 159.248567\nv 209.030875 134.014875 159.301138\nv 209.724910 138.486114 160.089534\nv 209.059976 138.878732 160.158766\nv 209.919375 139.305174 160.233957\nv 206.620091 137.973679 159.999192\nv 206.779415 138.998082 160.179825\nv 202.900375 136.958741 159.820194\nv 203.669995 137.691638 159.949437\nv 203.760119 136.604261 159.757704\nv 206.914314 148.073879 161.780131\nv 207.976297 147.941313 161.756749\nv 207.534053 147.001487 161.591022\nv 206.442101 136.353573 159.713517\nv 206.078210 135.572709 159.575834\nv 209.628457 149.707999 162.068229\nv 208.717188 149.824094 162.088711\nv 209.061650 150.641709 162.232875\nv 208.100057 144.906454 161.221614\nv 207.915540 145.996255 161.413775\nv 208.780553 145.779119 161.375478\nv 206.244632 151.954587 162.464371\nv 205.638106 151.179576 162.327709\nv 205.402271 152.136541 162.496440\nv 207.753470 149.885755 162.099607\nv 206.918513 150.005664 162.120749\nv 163.142346 138.708844 160.128821\nv 162.429540 138.115546 160.024193\nv 162.308780 139.013972 160.182610\nv 160.737142 145.628695 161.348933\nv 161.595224 146.119806 161.435547\nv 161.583428 145.172983 161.268597\nv 159.754033 148.848222 161.916644\nv 159.622766 149.758029 162.077069\nv 160.484987 149.449064 162.022566\nv 194.651493 142.053462 160.718540\nv 193.780552 142.345267 160.769991\nv 195.544771 140.620649 160.465909\nv 195.490827 141.593301 160.637409\nv 196.368691 141.206301 160.569184\nv 197.502618 151.567788 162.396189\nv 196.792902 150.927897 162.283339\nv 196.673520 151.826544 162.441791\nv 197.589069 144.860158 161.213458\nv 197.858746 145.639606 161.350887\nv 198.456887 144.963716 161.231707\nv 198.988650 152.904858 162.631977\nv 199.677084 153.272769 162.696828\nv 199.634438 152.215530 162.510399\nv 198.902470 139.480916 160.264939\nv 199.011779 138.771885 160.139928\nv 198.428746 142.024776 160.713490\nv 197.748584 142.147797 160.735199\nv 198.280613 142.771452 160.845160\nv 201.039645 152.006122 162.473473\nv 200.944135 153.106021 162.667424\nv 199.492805 149.705848 162.067874\nv 199.648050 150.544962 162.215830\nv 200.115399 149.945072 162.110045\nv 199.579986 140.131303 160.379628\nv 200.261480 140.790918 160.495919\nv 200.360387 139.954853 160.348507\nv 199.220927 141.807900 160.675245\nv 199.760599 142.545121 160.805247\nv 200.020751 141.704590 160.657041\nv 200.431049 139.035334 160.186377\nv 200.407216 138.227267 160.043900\nv 199.655060 138.487171 160.089739\nv 161.786643 137.744135 159.958690\nv 161.826675 141.641795 160.645976\nv 161.610582 142.650293 160.823800\nv 162.535769 142.487335 160.795066\nv 164.220659 137.272243 159.875519\nv 164.231684 136.420507 159.725336\nv 163.341755 143.121793 160.906949\nv 163.557849 142.113296 160.729126\nv 163.936503 139.240291 160.222538\nv 164.057264 138.341865 160.064122\nv 163.203130 153.066046 162.660405\nv 163.921279 153.239306 162.690949\nv 163.629108 152.342751 162.532858\nv 165.586107 135.802184 159.616315\nv 166.542723 135.715467 159.601017\nv 165.181338 143.254942 160.930432\nv 166.091770 142.856819 160.860227\nv 165.274267 142.349631 160.770803\nv 165.517682 140.469853 160.439348\nv 165.393305 141.383796 160.600501\nv 166.309075 141.037565 160.539445\nv 165.025707 146.120713 161.435741\nv 165.017539 147.062165 161.601737\nv 165.891887 146.544505 161.510446\nv 166.739267 147.787775 161.729668\nv 165.984373 148.546046 161.863362\nv 165.034683 151.251442 162.340409\nv 164.257665 151.635227 162.408097\nv 163.539516 151.461967 162.377553\nv 166.712751 146.911102 161.575095\nv 166.720919 145.969650 161.409099\nv 199.597617 135.242007 159.517530\nv 200.308327 135.804512 159.616697\nv 200.416757 134.986596 159.472470\nv 201.772177 141.455890 160.613159\nv 200.801153 141.528140 160.625920\nv 201.531447 142.369562 160.774281\nv 198.803563 140.316981 160.412351\nv 202.274948 144.251677 161.106127\nv 201.670898 144.859131 161.213255\nv 202.513625 145.007384 161.239381\nv 202.587633 141.178781 160.564286\nv 203.376286 141.794261 160.672827\nv 203.461447 140.675730 160.475593\nv 203.304705 151.046968 162.304342\nv 204.005171 151.627894 162.406762\nv 194.921560 144.085850 161.076899\nv 195.881818 144.498525 161.149674\nv 195.596337 143.511951 160.975721\nv 193.759948 151.749491 162.428213\nv 192.973108 152.130352 162.495376\nv 193.588117 152.503109 162.561094\nv 192.365234 146.328912 161.472426\nv 193.170378 146.653640 161.529676\nv 192.987419 145.947265 161.405124\nv 169.755234 153.746890 162.780446\nv 170.515827 153.927249 162.812239\nv 169.964542 145.623618 161.348066\nv 169.155530 146.150314 161.440928\nv 168.841257 141.036531 160.539245\nv 168.992881 140.152857 160.383431\nv 168.093002 140.437319 160.433612\nv 168.630386 152.753341 162.605230\nv 169.298787 151.920523 162.458391\nv 168.417407 151.767684 162.431426\nv 168.468292 150.305121 162.173540\nv 168.341725 145.821443 161.382954\nv 168.355588 146.665118 161.531721\nv 168.064796 135.705778 159.599290\nv 168.901474 135.794527 159.614942\nv 167.339040 139.838634 160.328045\nv 167.480892 138.922260 160.166464\nv 166.575305 139.207249 160.216711\nv 149.989905 133.007654 159.123522\nv 149.608164 133.885230 159.278270\nv 150.362011 134.011554 159.300527\nv 147.938484 141.078529 160.546640\nv 148.000798 140.161224 160.384893\nv 147.065620 140.727718 160.484794\nv 147.844622 138.224974 160.043497\nv 148.521768 137.480931 159.912302\nv 147.812985 137.222151 159.866670\nv 146.908793 142.549172 160.805963\nv 147.686621 143.032686 160.891210\nv 147.781134 142.128537 160.731788\nv 147.148845 145.681308 161.358233\nv 146.912534 146.507464 161.503904\nv 146.294333 145.962648 161.407838\nv 150.667261 136.750460 159.783471\nv 150.548864 137.713362 159.953256\nv 151.319819 137.286731 159.878033\nv 146.627892 148.160222 161.795329\nv 146.874534 148.905345 161.926715\nv 147.607656 148.448720 161.846204\nv 152.147314 136.096531 159.668178\nv 152.378905 135.167553 159.504373\nv 151.330135 141.687802 160.654084\nv 151.213209 142.558897 160.807679\nv 152.138059 142.251612 160.753498\nv 153.139669 133.374053 159.188130\nv 152.693580 138.456655 160.084352\nv 151.998973 137.865908 159.980171\nv 151.896029 138.840380 160.151999\nv 148.778851 149.208019 161.980086\nv 149.278220 148.443199 161.845235\nv 148.353665 148.429023 161.842739\nv 148.076925 150.151022 162.146372\nv 149.001479 150.165198 162.148868\nv 150.651931 149.134703 161.967148\nv 151.093190 148.328730 161.825034\nv 150.144665 148.416222 161.840468\nv 152.059778 149.817933 162.087637\nv 151.156143 149.801562 162.084724\nv 151.615466 150.572283 162.220647\nv 152.929773 142.694695 160.831634\nv 152.927372 143.634295 160.997305\nv 155.057622 139.810841 160.323149\nv 155.134030 138.803473 160.145519\nv 154.205504 139.412785 160.252953\nv 152.222355 145.933430 161.402702\nv 151.890647 146.726444 161.542517\nv 152.792081 146.722544 161.541844\nv 155.822974 140.296821 160.408840\nv 156.581055 141.106340 160.551565\nv 156.744229 140.011048 160.358441\nv 155.401083 145.144903 161.263658\nv 155.625026 145.865222 161.390663\nv 154.777300 148.367993 161.831964\nv 155.053167 147.416069 161.664117\nv 157.387959 134.337516 159.358058\nv 158.156506 134.496864 159.386157\nv 156.244020 142.873754 160.863199\nv 155.623898 143.659501 161.001748\nv 156.551571 143.602278 160.991648\nv 155.392256 146.600574 161.520321\nv 154.531629 146.717276 161.540916\nv 156.415746 142.104322 160.727531\nv 157.722201 139.881112 160.335520\nv 158.442094 140.623737 160.466460\nv 158.661985 139.684282 160.300814\nv 158.873366 138.827286 160.149704\nv 159.218114 137.935877 159.992527\nv 159.227431 141.258914 160.578458\nv 158.287647 141.455745 160.613164\nv 158.363541 145.191224 161.271828\nv 157.580308 145.651805 161.353035\nv 157.250928 149.108798 161.962602\nv 158.035701 149.556968 162.041633\nv 158.107037 148.709017 161.892115\nv 158.983601 148.283126 161.817024\nv 158.198828 147.834957 161.737994\nv 161.219221 137.098206 159.844805\nv 161.701308 136.405913 159.722732\nv 159.987235 141.947838 160.699936\nv 160.141683 141.115830 160.553231\nv 159.845823 147.974161 161.762522\nv 159.912165 146.992291 161.589393\nv 157.955720 150.416508 162.193191\nv 158.811829 150.016727 162.122704\nv 191.666819 139.389420 160.248801\nv 192.509948 139.163087 160.208887\nv 190.496605 140.399671 160.426947\nv 190.373064 141.363321 160.596858\nv 190.147467 142.217526 160.747469\nv 189.397156 141.392205 160.601956\nv 192.298488 152.181047 162.504317\nv 191.503773 152.274435 162.520778\nv 192.006562 152.977358 162.644718\nv 189.544043 150.490462 162.206202\nv 190.545803 150.648778 162.234117\nv 189.935615 149.683107 162.063852\nv 190.022757 153.933302 162.813258\nv 190.850376 153.898174 162.807064\nv 190.384226 153.105874 162.667373\nv 190.258950 146.013822 161.416862\nv 190.558787 146.748951 161.546491\nv 190.912086 146.102880 161.432573\nv 187.689425 138.076447 160.017287\nv 188.784857 138.075828 160.017182\nv 188.129530 137.174805 159.858307\nv 188.190420 152.397399 162.542453\nv 187.482439 151.718666 162.422776\nv 186.854791 154.223771 162.864501\nv 187.563667 154.063191 162.836184\nv 187.968844 147.771860 161.726853\nv 187.956974 146.788973 161.553543\nv 187.221081 147.192995 161.624787\nv 184.805144 138.827526 160.149737\nv 185.589831 139.633645 160.291863\nv 185.678188 138.520815 160.095644\nv 184.151169 149.142971 161.968616\nv 184.985119 149.490252 162.029850\nv 184.926779 148.630392 161.878234\nv 184.354948 150.827396 162.265627\nv 183.340279 150.670614 162.237972\nv 183.485717 151.495178 162.383367\nv 182.520803 138.281790 160.053508\nv 182.836948 139.025503 160.184643\nv 183.277635 138.187663 160.036911\nv 180.794282 146.423912 161.489170\nv 179.999269 146.095119 161.431190\nv 181.480446 136.629114 159.762096\nv 180.305420 136.623041 159.761020\nv 179.729506 151.259099 162.341733\nv 179.741285 150.341669 162.179966\nv 178.898132 150.835501 162.267037\nv 181.207183 147.213466 161.628385\nv 181.767223 146.591389 161.518702\nv 179.434882 136.831233 159.797726\nv 178.833142 136.382383 159.718582\nv 178.786472 137.493813 159.914555\nv 178.111549 150.368466 162.184689\nv 178.099770 151.285896 162.346455\nv 178.137445 146.881779 161.569897\nv 178.288996 146.014869 161.417036\nv 177.596736 146.279898 161.463772\nv 176.960943 144.690326 161.183492\nv 178.072132 144.469422 161.144536\nv 176.623068 147.572272 161.691654\nv 176.581833 148.473801 161.850616\nv 177.403950 148.048337 161.775594\nv 176.833538 145.762620 161.372565\nv 176.046195 145.039959 161.245145\nv 175.095246 136.527186 159.744122\nv 175.848870 137.314568 159.882958\nv 175.874678 136.405730 159.722706\nv 178.090342 140.834107 160.503528\nv 177.682733 140.027881 160.361384\nv 177.095794 141.023266 160.536884\nv 175.840585 150.706128 162.244233\nv 176.604458 151.173098 162.326570\nv 175.447427 152.275172 162.520904\nv 176.025949 152.954966 162.640767\nv 176.474253 152.207128 162.508897\nv 175.183344 144.721832 161.189051\nv 174.144096 144.566923 161.161738\nv 174.167293 146.401843 161.485277\nv 173.323573 146.087174 161.429784\nv 173.297778 147.013018 161.593031\nv 173.793889 137.899498 159.986094\nv 174.600988 138.059475 160.014307\nv 174.262340 137.276047 159.876159\nv 172.915993 142.551666 160.806395\nv 173.268502 143.516932 160.976593\nv 173.742595 142.692581 160.831248\nv 174.104912 140.993795 160.531706\nv 174.023426 140.104150 160.374824\nv 173.308600 140.837670 160.504168\nv 170.685012 140.535845 160.450956\nv 170.486834 141.425598 160.607837\nv 171.430710 141.209375 160.569728\nv 170.310640 142.281739 160.758799\nv 169.564942 141.608208 160.640027\nv 218.737723 122.802821 232.653187\nv 218.703852 121.997607 233.339177\nv 218.726174 121.514353 232.425992\nv 218.753854 121.377363 231.659905\nv 218.754630 120.857411 230.840865\nv 218.760821 121.799615 230.920961\nv 218.761597 128.737707 233.738140\nv 218.761597 127.963730 233.740313\nv 218.761597 128.261488 233.003303\nv 218.761597 131.133883 232.078741\nv 218.761597 130.505137 231.249541\nv 218.761597 130.082843 230.489082\nv 218.761597 129.066193 230.641947\nv 218.761597 129.448297 229.787213\nv 218.761597 138.382975 235.348796\nv 218.761597 138.142372 236.185950\nv 218.761597 123.341854 227.217168\nv 218.761597 122.968606 228.214693\nv 218.761597 122.358599 227.374912\nv 218.761597 137.017502 231.648501\nv 218.761597 136.639522 230.714770\nv 218.761597 137.711019 231.114754\nv 218.761597 138.218776 230.186156\nv 218.761597 138.596757 231.119887\nv 218.761597 132.037658 231.517559\nv 218.761597 131.826690 230.530914\nv 218.761597 132.554813 230.893208\nv 218.761597 137.626520 163.598195\nv 218.761597 136.795123 163.504973\nv 218.761597 137.060009 162.837451\nv 218.761597 135.741127 161.960778\nv 218.761597 135.305928 162.737459\nv 218.761597 134.818443 161.954008\nv 218.761597 130.516414 162.308695\nv 218.761597 130.264347 161.375630\nv 218.761597 131.131318 161.562674\nv 218.761597 133.101587 159.140064\nv 218.761597 133.696242 160.281758\nv 218.761597 132.410248 160.055001\nv 218.761597 136.846587 162.125242\nv 218.761597 136.359103 161.341791\nv 218.761597 132.123005 162.734701\nv 218.761597 132.251833 163.526848\nv 218.761597 131.512213 163.287885\nv 218.761597 140.186271 163.749023\nv 218.761597 139.315395 163.201456\nv 218.761597 140.278158 162.948926\nv 218.761597 133.970281 163.506382\nv 218.761597 134.926917 163.504399\nv 218.761597 134.513955 164.280094\nv 218.761597 141.995050 164.015192\nv 218.761597 141.831718 164.778734\nv 218.761597 140.985702 164.260035\nv 218.761597 143.040765 163.651663\nv 218.761597 147.311954 164.618304\nv 218.761597 147.177418 163.795457\nv 218.761597 147.947914 164.129553\nv 218.761597 138.085584 164.924168\nv 218.761597 137.706570 165.795435\nv 218.761597 144.606055 165.122093\nv 218.761597 145.567759 164.960859\nv 218.761597 136.609358 166.930044\nv 218.761595 149.073368 165.500449\nv 218.761595 148.915404 166.354568\nv 218.761597 147.924487 165.806519\nv 218.761597 131.048931 166.461583\nv 218.761597 131.900362 166.645561\nv 218.761597 130.878333 167.261279\nv 218.761597 134.216048 167.814814\nv 218.761597 134.324855 167.130060\nv 218.761597 139.432817 166.933849\nv 218.761597 138.632556 166.396473\nv 218.761597 139.609796 166.119995\nv 218.761597 137.529591 166.609288\nv 218.761595 149.412632 166.990175\nv 218.761596 148.263752 167.296245\nv 218.761597 144.075096 166.903198\nv 218.761597 142.209416 168.615157\nv 218.761597 133.975725 169.227101\nv 218.761597 134.104677 168.553147\nv 218.761597 148.693330 168.778816\nv 218.761597 147.995892 168.207384\nv 218.761597 132.425428 169.684806\nv 218.761597 132.321832 170.382767\nv 218.761597 131.564583 169.612421\nv 218.761597 138.839349 169.507873\nv 218.761597 138.718371 170.254039\nv 218.761597 138.065107 169.649517\nv 218.761597 146.234090 169.604649\nv 218.761597 146.144357 170.391136\nv 218.761597 145.408567 169.799262\nv 218.761597 130.820696 170.523844\nv 218.761597 131.637330 171.042005\nv 218.761597 130.997038 171.255467\nv 218.761597 133.469519 171.578057\nv 218.761597 132.785016 172.237295\nv 218.761597 132.498174 171.114390\nv 218.761597 148.574049 170.454177\nv 218.761597 147.746148 170.739549\nv 218.761597 136.059464 171.401902\nv 218.761597 135.781228 170.507532\nv 218.761597 136.669957 170.669129\nv 218.761597 137.839677 171.633688\nv 218.761597 138.226630 172.453938\nv 218.761597 137.335146 172.383749\nv 218.761597 147.283629 173.432641\nv 218.761597 146.458810 172.861817\nv 218.761597 147.540746 172.437435\nv 218.761597 149.301183 173.345728\nv 218.761597 149.267055 174.324276\nv 218.761597 148.331437 173.986807\nv 218.761597 132.572577 174.895368\nv 218.761597 133.513049 175.242066\nv 218.761597 132.817288 175.721388\nv 218.761597 136.239382 173.795740\nv 218.761597 136.788836 173.083647\nv 218.761597 138.736022 173.276187\nv 218.761597 139.091983 174.121035\nv 218.761597 122.144725 225.446697\nv 218.761597 121.722375 226.526115\nv 218.761597 126.475973 227.245378\nv 218.761597 127.140863 227.718119\nv 218.761597 126.341186 228.156919\nv 218.761597 139.792606 230.995494\nv 218.761597 139.284849 231.924092\nv 218.761597 129.129030 227.186513\nv 218.761597 130.331086 226.912931\nv 218.761597 130.201982 227.850334\nv 218.761597 139.352412 227.121757\nv 218.761597 139.999771 227.876485\nv 218.761597 139.087035 227.872781\nv 218.761597 132.839281 226.344084\nv 218.761597 132.948037 225.441326\nv 218.761597 133.528884 225.985033\nv 218.761597 123.684276 221.440500\nv 218.761597 135.844338 226.793947\nv 218.761597 135.003849 226.946385\nv 218.761597 140.625445 228.713351\nv 218.761597 140.890822 227.962327\nv 218.761597 129.965434 222.426884\nv 218.761597 130.629255 222.725316\nv 218.761597 130.121866 223.209235\nv 218.761597 132.865108 223.714836\nv 218.761597 133.583863 224.166631\nv 218.761597 132.918886 224.630481\nv 218.761597 147.249501 174.411189\nv 218.761597 137.828421 175.450633\nv 218.761597 138.673420 175.790170\nv 218.761597 143.599125 177.696707\nv 218.761597 144.134230 177.015335\nv 218.761597 144.486764 177.871261\nv 218.761597 147.379329 175.478182\nv 218.761597 148.307765 175.968649\nv 218.761597 145.376699 174.638132\nv 218.761597 146.331521 174.924016\nv 218.761597 145.506527 175.705125\nv 218.761597 134.324559 177.788833\nv 218.761597 134.954844 178.253015\nv 218.761597 134.125123 178.508931\nv 218.761597 132.826085 176.592968\nv 218.761597 131.885613 176.246270\nv 218.761597 143.052859 178.415023\nv 218.761597 142.700325 177.559097\nv 218.761597 147.372086 178.303342\nv 218.761597 148.178989 177.974107\nv 218.761597 131.004820 178.609613\nv 218.761597 131.038479 177.691024\nv 218.761597 131.860751 178.036440\nv 218.761597 132.590622 180.248487\nv 218.761597 133.378332 180.633405\nv 218.761597 132.557023 181.082487\nv 218.761597 134.266303 181.006025\nv 218.761597 134.992334 181.462558\nv 218.761597 134.070765 181.923938\nv 218.761597 137.505836 181.771117\nv 218.761597 136.949847 181.076745\nv 218.761597 137.816915 180.933116\nv 218.761597 147.450180 180.569168\nv 218.761597 147.699258 181.297735\nv 218.761597 146.754488 181.147232\nv 218.761597 145.546136 180.320666\nv 218.761597 145.198645 179.545049\nv 218.761597 146.157919 179.643048\nv 218.761597 130.964439 182.053471\nv 218.761597 130.908083 181.238712\nv 218.761597 131.825669 181.512328\nv 218.761597 146.704725 183.349762\nv 218.761597 146.389058 182.584412\nv 218.761597 147.319235 182.641148\nv 218.761597 141.954364 183.935674\nv 218.761597 141.161107 183.896970\nv 218.761597 145.234728 184.019448\nv 218.761597 144.346594 183.996851\nv 218.761597 144.886414 183.270430\nv 218.761597 148.794524 183.500047\nv 218.761597 149.041593 184.365119\nv 218.761597 147.881971 184.271569\nv 218.761597 143.542271 183.993816\nv 218.760862 131.671405 183.763357\nv 218.760862 131.395679 182.996824\nv 218.761597 132.157751 183.093620\nv 218.761597 133.315393 183.894802\nv 218.761597 140.657869 184.600168\nv 218.761597 140.989704 185.355580\nv 218.761597 140.157266 185.278155\nv 218.761597 146.085352 184.055559\nv 218.761597 145.545532 184.781981\nv 218.761597 137.609454 185.013009\nv 218.761597 138.477641 185.102143\nv 218.761597 137.889327 185.782208\nv 218.761597 147.475172 185.636719\nv 218.761597 147.446549 186.547199\nv 218.761597 136.550782 186.475736\nv 218.761597 135.629000 186.409601\nv 218.761597 137.436808 186.481776\nv 218.761597 136.966451 187.264438\nv 218.761597 143.136479 186.157100\nv 218.761597 143.981572 186.614104\nv 218.761597 143.216931 186.823279\nv 218.761597 140.336318 187.365735\nv 218.761597 140.848729 188.188706\nv 218.761597 140.081259 188.179823\nv 218.761597 146.918610 188.382202\nv 218.761597 147.058023 187.354712\nv 218.761597 147.932380 187.985091\nv 218.761597 132.128826 188.485459\nv 218.761597 132.093775 189.305360\nv 218.761597 131.201494 188.942555\nv 218.761597 136.262699 189.703657\nv 218.761597 137.149835 189.416904\nv 218.761597 139.867828 190.870461\nv 218.761597 140.668719 190.051275\nv 218.761597 131.243701 190.528890\nv 218.761597 130.296454 191.218786\nv 218.761597 130.219197 190.452353\nv 218.761597 136.396850 190.785797\nv 218.761597 137.324193 191.291653\nv 218.761597 136.506198 191.835662\nv 218.761597 140.027541 191.658012\nv 218.761597 140.743823 191.996035\nv 218.761597 140.027596 192.554291\nv 218.761597 131.799763 190.053196\nv 218.761597 131.877020 190.819629\nv 218.761597 144.140170 191.884067\nv 218.761597 146.581371 193.513830\nv 218.761597 147.345663 194.081543\nv 218.761597 146.476285 194.475328\nv 218.761597 141.554984 194.117129\nv 218.761597 148.143886 194.516019\nv 218.761597 148.248972 193.554521\nv 218.761597 146.723726 191.533758\nv 218.761597 146.641796 192.555957\nv 218.761597 131.207551 192.625239\nv 218.761597 130.900736 191.877058\nv 218.761597 131.627772 192.043504\nv 218.761597 133.256981 192.349418\nv 218.761597 132.794073 192.938582\nv 218.761597 132.397495 192.202520\nv 218.761597 147.860048 196.386038\nv 218.761597 147.065038 195.968906\nv 218.761597 148.035587 195.460172\nv 218.761597 144.079076 193.691683\nv 218.761597 145.170003 196.564833\nv 218.761597 144.391337 196.742658\nv 218.761597 144.686509 195.851875\nv 218.761597 131.566970 194.247697\nv 218.761597 131.653031 194.989539\nv 218.761597 130.699664 194.647385\nv 218.761597 139.896145 196.655289\nv 218.761597 140.742543 197.073607\nv 218.761597 139.905333 197.516316\nv 218.761597 136.031689 197.085788\nv 218.761597 136.509443 196.458208\nv 218.761597 136.886894 197.198495\nv 218.761597 128.703784 223.010893\nv 218.761597 129.108172 222.283563\nv 218.761597 124.065939 219.054159\nv 218.761597 132.739368 221.966156\nv 218.761597 131.920543 221.609419\nv 218.761597 132.636615 221.107014\nv 218.761597 124.147341 218.785658\nv 218.761597 124.708546 217.943252\nv 218.761597 125.174185 218.434110\nv 218.761597 129.615561 221.799644\nv 218.761597 130.253243 221.112892\nv 218.761597 125.508479 219.430753\nv 218.761597 126.069684 218.588348\nv 218.761597 141.654079 223.441347\nv 218.761597 142.371529 223.370684\nv 218.761597 142.266498 224.194465\nv 218.761597 136.268812 220.231884\nv 218.761597 135.325901 219.594860\nv 218.761597 136.387588 219.192212\nv 218.761597 132.553331 218.103859\nv 218.761597 131.679362 217.548396\nv 218.761597 136.427283 218.023374\nv 218.761597 139.688161 213.754365\nv 218.761597 139.941061 214.550282\nv 218.761597 139.138633 214.268875\nv 218.761597 126.345644 212.090495\nv 218.761597 126.529680 211.219120\nv 218.761597 127.217922 212.064566\nv 218.761597 132.938104 215.054257\nv 218.761597 131.979823 215.515661\nv 218.761597 131.260713 213.978364\nv 218.761597 131.327793 213.087742\nv 218.761597 132.145609 213.660059\nv 218.761597 142.711293 216.672187\nv 218.761597 142.891787 215.841921\nv 218.761597 143.411610 216.408447\nv 218.761597 141.690840 216.833210\nv 218.761597 142.210663 217.399736\nv 218.761597 134.702137 215.987752\nv 218.761597 131.187573 214.826916\nv 218.761597 131.088866 215.791896\nv 218.761597 141.946416 218.260978\nv 218.761597 142.966869 218.099955\nv 218.761597 147.500563 198.347709\nv 218.761597 146.659489 197.904767\nv 218.761597 147.730574 197.337714\nv 218.761597 138.358386 197.714347\nv 218.761597 139.110578 197.966307\nv 218.761597 138.410029 198.582656\nv 218.761597 143.786901 197.402035\nv 218.761597 144.527029 198.294186\nv 218.761597 135.355598 199.631993\nv 218.761597 135.640532 198.678289\nv 218.761597 139.898271 199.982862\nv 218.761597 139.170520 199.562666\nv 218.761597 139.889972 199.254813\nv 218.761597 140.684726 198.804822\nv 218.761597 141.521952 198.615894\nv 218.761597 141.454948 199.486081\nv 218.761597 145.933275 201.079872\nv 218.761597 145.686779 201.707714\nv 218.761597 145.174862 201.076154\nv 218.761597 144.518244 202.868233\nv 218.761597 144.225530 202.167516\nv 218.761597 145.221081 202.404714\nv 218.761597 130.720364 197.861120\nv 218.761597 130.423294 198.708338\nv 218.761597 129.860576 197.823057\nv 218.761597 140.430216 200.460778\nv 218.761597 139.710764 200.768631\nv 218.761597 140.655375 202.690601\nv 218.761597 140.021948 201.969345\nv 218.761597 140.876135 201.967802\nv 218.761597 128.760209 200.453108\nv 218.761597 129.555726 201.159476\nv 218.761597 128.705116 201.399864\nv 218.761597 131.982077 200.372057\nv 218.761597 132.860367 200.623069\nv 218.761597 132.144878 201.210365\nv 218.761597 134.989850 203.133740\nv 218.761597 134.265578 202.447436\nv 218.761597 135.352997 202.421731\nv 218.761597 146.660410 205.154162\nv 218.761597 146.721770 205.864607\nv 218.761597 146.031983 205.469415\nv 218.761597 130.356308 203.775462\nv 218.761597 130.965094 204.283897\nv 218.761597 129.754994 204.666465\nv 218.761597 128.297355 203.667966\nv 218.761597 128.474567 202.642067\nv 218.761597 129.323420 203.132131\nv 218.761597 138.078936 207.425079\nv 218.761597 137.912776 206.418215\nv 218.761597 138.908214 206.742327\nv 218.761597 131.114939 205.310335\nv 218.761597 131.218291 206.076497\nv 218.761597 130.467131 205.941062\nv 218.761597 145.815663 210.018903\nv 218.761597 144.648706 209.932981\nv 218.761597 127.904367 205.652128\nv 218.761597 127.741668 206.439275\nv 218.761597 136.358508 207.824198\nv 218.761597 137.209957 207.937919\nv 218.761597 136.484967 208.661149\nv 218.761597 145.422161 211.886152\nv 218.761597 145.607060 211.057653\nv 218.761597 135.654827 210.462114\nv 218.761597 135.101705 209.446504\nv 218.761597 136.186640 209.563039\nv 218.761597 131.319870 210.277301\nv 218.761597 130.819815 209.188426\nv 218.761597 131.876529 209.520178\nv 218.761597 133.069692 211.305434\nv 218.761597 133.473237 210.477315\nv 218.761597 138.700420 210.661671\nv 218.761597 144.805994 213.390810\nv 218.761597 143.665807 213.013494\nv 218.761597 144.738110 212.525883\nv 218.761597 127.026195 209.726361\nv 218.761597 127.119094 209.321309\nv 218.761597 138.020052 213.167065\nv 218.761597 137.911349 212.219793\nv 218.761597 144.535570 214.586412\nv 218.761597 145.607872 214.098801\nv 218.761597 140.408635 213.188192\nv 218.761597 142.855974 213.469609\nv 218.761597 142.030486 213.861397\nv 216.252808 124.569361 233.792646\nv 215.373748 124.672289 233.810796\nv 217.856639 127.861937 234.373222\nv 217.845090 126.573468 234.146027\nv 218.750048 127.151481 234.247956\nv 216.208675 121.410540 233.235654\nv 216.268270 122.113769 233.359656\nv 215.483814 121.701490 233.286950\nv 146.220404 120.689802 233.108571\nv 146.075026 119.751447 232.943102\nv 146.830375 120.319053 233.043170\nv 148.852168 121.403645 233.234449\nv 147.789419 121.866739 233.316094\nv 148.038502 120.794314 233.126993\nv 145.218744 128.125490 234.419691\nv 145.942269 127.614797 234.329643\nv 145.983456 128.332462 234.456181\nv 216.973182 120.949373 233.154346\nv 216.188725 120.537094 233.081639\nv 215.143016 125.437006 233.945628\nv 215.453205 129.908290 234.734056\nv 216.331485 129.300464 234.626872\nv 146.527381 125.364153 233.932785\nv 147.063804 126.177058 234.076134\nv 149.049596 124.786716 233.830980\nv 148.886062 125.840145 234.016730\nv 149.648078 121.250882 233.207513\nv 149.398995 122.323307 233.396614\nv 144.428894 138.105971 236.179541\nv 144.419520 137.730478 236.113329\nv 148.305015 127.572898 234.322263\nv 147.643861 128.321537 234.454259\nv 147.368135 127.073130 234.234136\nv 148.966165 126.770152 234.180713\nv 149.822938 126.285807 234.095304\nv 150.805986 123.279198 233.565164\nv 150.104143 122.910729 233.500192\nv 150.896748 122.539011 233.434649\nv 147.611159 136.924877 235.971250\nv 146.817020 137.161270 236.012939\nv 215.592484 131.710550 235.051843\nv 216.413269 132.061323 235.113689\nv 213.969933 124.078526 233.706108\nv 213.498397 123.195736 233.550442\nv 214.385785 122.990235 233.514202\nv 150.504259 126.638927 234.157572\nv 151.485859 126.732599 234.174077\nv 150.884640 127.309486 234.275791\nv 146.387506 139.016111 236.339997\nv 146.622720 138.012215 236.162983\nv 147.165108 138.805407 236.302837\nv 149.352610 133.178898 235.310729\nv 149.866719 132.471413 235.185987\nv 150.324095 133.149561 235.305552\nv 152.339975 123.450333 233.595319\nv 152.489155 122.337999 233.399189\nv 152.234618 129.898830 234.732343\nv 153.114049 129.912276 234.734727\nv 152.652893 130.771905 234.886303\nv 153.225724 128.153961 234.424678\nv 152.281007 128.221179 234.436532\nv 152.810957 127.335939 234.280442\nv 153.236685 126.511637 234.135081\nv 153.670354 125.541216 233.963975\nv 154.189342 126.298300 234.097482\nv 155.031559 126.292947 234.096537\nv 154.597891 127.263368 234.267643\nv 155.273578 124.660024 233.808614\nv 154.556377 124.415663 233.765521\nv 155.206944 123.747808 233.647758\nv 209.523761 129.194950 234.608249\nv 210.307156 128.914359 234.558768\nv 211.124017 128.618388 234.506589\nv 211.164555 129.481139 234.658722\nv 209.409546 126.630814 234.156125\nv 210.216477 127.200641 234.256590\nv 211.891299 128.255007 234.442528\nv 211.033901 127.688227 234.342573\nv 216.702874 138.288969 236.211791\nv 217.133908 137.362173 236.048374\nv 217.483182 138.414803 236.233983\nv 212.512409 126.805171 234.186886\nv 211.713079 126.452720 234.124732\nv 212.424306 125.933046 234.033106\nv 214.968178 132.296335 235.155129\nv 214.944898 131.440086 235.004150\nv 212.353760 124.932311 233.856650\nv 213.153090 125.284762 233.918803\nv 210.710287 132.225555 235.142613\nv 209.903302 132.476598 235.186874\nv 207.952334 126.289880 234.096016\nv 207.888217 127.173877 234.251885\nv 207.187793 126.551803 234.142197\nv 211.392794 137.025680 235.988990\nv 211.515888 136.165470 235.837313\nv 212.289980 136.738950 235.938437\nv 206.689672 124.133286 233.715753\nv 205.967492 123.506627 233.605257\nv 206.781730 123.268181 233.563222\nv 207.761953 122.997370 233.515459\nv 208.547109 122.760514 233.473676\nv 208.289066 123.657984 233.631934\nv 155.484287 135.449301 235.711074\nv 154.906751 136.293466 235.859928\nv 154.465833 135.320400 235.688349\nv 154.270635 139.896289 236.495209\nv 154.102441 138.923901 236.323744\nv 154.762337 131.721268 235.053715\nv 154.396909 130.816961 234.894268\nv 152.473640 135.087738 235.647306\nv 152.230679 134.201027 235.490943\nv 149.860655 139.828559 236.483254\nv 150.681657 139.154549 236.364398\nv 150.745402 139.995537 236.512698\nv 151.178519 138.408845 236.232910\nv 210.798362 138.807562 236.303182\nv 210.594455 139.658742 236.453260\nv 209.971208 139.063923 236.348390\nv 209.901278 135.858177 235.783131\nv 209.728881 136.766803 235.943344\nv 209.011457 136.172780 235.838608\nv 207.679070 132.317402 235.158813\nv 208.252388 132.997530 235.278727\nv 205.804231 125.261779 233.914719\nv 205.022412 125.489129 233.954797\nv 205.093615 124.599082 233.797867\nv 207.954677 130.571770 234.851007\nv 207.166403 129.990498 234.748514\nv 207.525899 139.261143 236.383188\nv 206.963530 138.763189 236.295380\nv 205.477247 132.222935 235.142142\nv 204.655606 132.693678 235.225165\nv 204.715353 131.936477 235.091659\nv 204.716948 135.092844 235.648223\nv 204.075933 135.795411 235.772084\nv 206.103095 141.570315 236.790349\nv 205.877511 140.398732 236.583774\nv 206.792513 140.836321 236.660917\nv 202.716082 126.389453 234.113577\nv 202.095639 127.258255 234.266762\nv 201.997727 126.326295 234.102431\nv 200.676167 127.130220 234.244165\nv 200.370447 126.308811 234.099326\nv 201.071563 126.373688 234.110777\nv 204.634636 140.193581 236.547600\nv 204.234093 141.127857 236.712329\nv 203.680635 140.188711 236.546722\nv 202.093378 132.492915 235.189749\nv 201.243347 131.796404 235.066937\nv 155.711906 129.963474 234.743781\nv 156.605739 129.955468 234.742361\nv 156.155327 130.840565 234.898430\nv 156.807245 139.552908 236.434635\nv 157.605948 139.081736 236.351543\nv 157.403850 134.092057 235.471746\nv 158.406060 134.127214 235.477923\nv 157.944063 134.754860 235.588601\nv 158.605819 124.777043 233.829246\nv 158.765869 125.512445 233.958920\nv 159.095574 140.192208 236.547347\nv 159.024069 141.046323 236.697948\nv 159.137071 135.805242 235.773791\nv 158.520990 136.669572 235.926204\nv 158.330192 135.654346 235.747190\nv 157.327982 135.619190 235.741014\nv 161.284801 127.004003 234.221892\nv 160.172119 127.641924 234.334382\nv 160.437261 126.582763 234.147629\nv 159.423827 126.165225 234.074018\nv 159.862402 135.223462 235.671216\nv 160.053199 136.238689 235.850230\nv 160.306033 142.203528 236.902015\nv 160.986358 142.323334 236.923108\nv 161.610230 135.287822 235.682560\nv 160.952139 134.687181 235.576668\nv 161.783840 134.318095 235.511574\nv 163.844594 131.826524 235.072245\nv 163.245663 132.460334 235.183999\nv 163.118419 131.610661 235.034176\nv 162.581438 137.397208 236.054494\nv 161.841389 137.941534 236.150477\nv 161.690827 137.047742 235.992875\nv 162.625228 134.265193 235.502227\nv 161.967137 133.664552 235.396335\nv 164.289300 140.137003 236.537597\nv 164.747272 139.474939 236.420865\nv 163.534333 127.734293 234.350678\nv 163.859102 128.546428 234.493878\nv 167.048149 138.893330 236.318333\nv 166.464407 138.262249 236.207051\nv 166.205475 134.216801 235.493722\nv 165.974427 135.138455 235.656233\nv 165.381850 134.362619 235.519437\nv 164.060496 136.304232 235.861784\nv 164.428547 135.423617 235.706512\nv 164.782751 136.164887 235.837221\nv 166.465998 133.483769 235.364470\nv 165.943707 129.848677 234.723512\nv 166.131605 130.767242 234.885481\nv 165.203430 130.557876 234.848564\nv 168.724729 127.623104 234.331073\nv 167.715416 127.487980 234.307243\nv 168.321219 126.653889 234.160175\nv 168.929266 125.856832 234.019630\nv 170.121767 125.988680 234.042876\nv 167.785585 138.374416 236.226838\nv 167.673715 139.187664 236.370237\nv 167.674371 140.106797 236.532306\nv 168.411807 139.587883 236.440811\nv 169.636270 131.308489 234.980905\nv 169.879177 130.491867 234.836919\nv 170.596097 131.194137 234.960733\nv 170.926326 134.090575 235.471461\nv 170.869265 134.987007 235.629527\nv 170.077993 134.593049 235.560043\nv 171.119881 126.095247 234.061666\nv 170.937258 136.055056 235.817854\nv 170.881137 137.064986 235.995933\nv 171.551634 127.900907 234.380059\nv 172.022134 141.380029 236.756817\nv 171.576779 142.370354 236.931429\nv 174.046608 141.426786 236.765052\nv 173.045148 141.408885 236.761903\nv 173.387403 137.709925 236.109669\nv 172.330215 137.608870 236.091854\nv 172.910771 136.721686 235.935413\nv 175.180992 134.607383 235.562600\nv 174.331155 135.197873 235.666725\nv 174.349369 134.402103 235.526411\nv 176.091605 134.388845 235.524044\nv 176.035963 133.354884 235.341729\nv 176.928362 133.932117 235.443488\nv 177.164828 127.931487 234.385444\nv 176.332136 127.819551 234.365725\nv 176.904848 127.088543 234.236810\nv 175.697672 128.260140 234.443416\nv 175.127945 143.963439 237.212316\nv 174.341361 143.443605 237.120662\nv 175.315804 142.923645 237.028977\nv 177.992665 128.034108 234.403519\nv 177.419953 128.765116 234.532434\nv 176.405396 144.026237 237.223363\nv 176.949315 143.295405 237.094516\nv 177.252324 143.878162 237.197249\nv 177.183456 142.468337 236.948664\nv 176.336528 142.616411 236.974778\nv 176.931192 136.881253 235.963517\nv 177.239041 137.746881 236.116139\nv 178.620881 129.678314 234.693445\nv 177.665028 129.809981 234.716647\nv 179.221542 126.465682 234.126973\nv 178.478564 127.219772 234.259937\nv 178.480517 126.446389 234.123565\nv 179.474191 143.838201 237.190269\nv 180.484743 143.849546 237.192268\nv 179.135688 138.840197 236.308962\nv 179.342338 139.561091 236.436083\nv 178.504385 139.399954 236.407652\nv 178.518719 143.910518 237.203002\nv 178.751714 143.075014 237.055670\nv 178.969360 137.910909 236.145094\nv 178.073893 137.799736 236.125471\nv 178.745518 137.031585 235.990035\nv 179.468120 131.235532 234.968044\nv 179.834310 130.419583 234.824181\nv 180.308457 131.166223 234.955845\nv 188.856202 136.744932 235.939484\nv 187.742025 141.381688 236.757057\nv 188.359071 140.639252 236.626150\nv 188.683594 141.541794 236.785285\nv 188.604077 126.321132 234.101522\nv 187.877725 127.182960 234.253467\nv 187.747572 130.997281 234.926026\nv 187.544565 131.878165 235.081340\nv 186.968981 131.276391 234.975223\nv 187.160811 136.132055 235.831412\nv 186.309523 136.151537 235.834856\nv 186.173525 127.158057 234.249079\nv 185.667576 126.371828 234.110433\nv 185.974287 138.387891 236.229206\nv 186.179298 139.301477 236.390294\nv 185.664813 136.587669 235.911781\nv 185.482884 135.878974 235.786824\nv 184.497149 142.190119 236.899661\nv 185.116151 141.504031 236.778676\nv 185.442648 142.371186 236.931580\nv 182.996743 129.449542 234.653166\nv 183.903070 129.538690 234.668885\nv 184.804446 133.603545 235.385625\nv 185.646988 133.276128 235.327862\nv 185.600023 134.313729 235.510821\nv 184.545901 131.544577 235.022574\nv 183.876245 132.325289 235.160230\nv 183.663876 142.139146 236.890669\nv 183.990373 143.006301 237.043573\nv 183.935986 133.259506 235.324956\nv 182.960819 133.018851 235.282521\nv 182.987316 140.358686 236.576732\nv 182.052463 140.240420 236.555882\nv 182.149841 133.583346 235.382063\nv 182.041707 134.612657 235.563555\nv 181.170988 134.242935 235.498371\nv 180.878050 139.154077 236.364330\nv 180.739021 138.192526 236.194785\nv 180.627254 142.967885 237.036805\nv 180.323624 134.474328 235.539150\nv 180.431758 133.445016 235.357658\nv 181.934894 142.053547 236.875586\nv 180.895276 141.989191 236.864237\nv 181.282848 141.109665 236.709150\nv 181.757156 126.428439 234.120471\nv 181.432120 127.177249 234.252491\nv 181.283627 136.327982 235.866019\nv 180.572693 137.263238 236.030917\nv 180.351920 136.207503 235.844761\nv 200.187555 135.663722 235.748855\nv 200.821094 136.188423 235.841371\nv 200.776553 140.710537 236.638750\nv 201.161536 139.747759 236.468979\nv 201.698185 140.626571 236.623938\nv 199.449302 126.471766 234.128053\nv 199.550493 129.905957 234.733596\nv 199.453438 129.008320 234.575317\nv 200.555822 134.720472 235.582531\nv 198.328113 132.436706 235.179856\nv 198.529165 133.461171 235.360492\nv 197.807237 133.174101 235.309884\nv 199.787537 140.746563 236.645098\nv 200.324186 141.625376 236.800057\nv 197.104570 125.445143 233.947045\nv 198.077530 125.174996 233.899399\nv 197.950593 126.148337 234.071039\nv 197.086902 134.595804 235.560558\nv 196.173659 134.097134 235.472624\nv 197.095047 133.699896 235.402586\nv 196.352089 129.921648 234.736381\nv 196.262935 128.997027 234.573344\nv 197.204883 129.372573 234.639579\nv 196.331332 127.086719 234.236508\nv 195.333903 127.078675 234.235078\nv 195.980205 126.410439 234.117255\nv 196.893995 132.675431 235.221950\nv 195.064151 131.321507 234.983195\nv 195.338228 131.977071 235.098792\nv 194.509882 131.832666 235.073320\nv 197.457003 140.120042 236.534641\nv 196.830833 139.315598 236.392790\nv 196.141159 141.185961 236.722582\nv 195.279009 141.266969 236.736864\nv 197.769885 135.304200 235.685479\nv 196.848498 135.701438 235.755518\nv 194.914870 127.895515 234.379095\nv 194.563742 127.219235 234.259843\nv 194.566039 134.665695 235.572864\nv 195.401593 134.419549 235.529467\nv 193.815775 130.404557 234.821503\nv 194.402943 129.589057 234.677714\nv 194.822973 130.361602 234.813934\nv 195.962207 142.964733 237.036227\nv 195.994205 142.960781 237.035525\nv 194.079412 133.229022 235.319538\nv 194.152556 132.550109 235.199828\nv 194.710816 133.167143 235.308627\nv 193.878478 131.894545 235.084231\nv 193.088802 131.918275 235.088417\nv 193.446128 131.200832 234.961909\nv 193.026099 130.428287 234.825689\nv 191.980371 130.428443 234.825726\nv 193.532695 136.680153 235.928079\nv 193.661746 135.780532 235.769448\nv 194.365356 136.384955 235.876022\nv 194.491566 141.061206 236.700584\nv 193.662078 141.154422 236.717026\nv 195.090294 142.571431 236.966880\nv 191.337955 127.826093 234.366857\nv 190.864285 127.113792 234.241268\nv 191.830958 127.336546 234.280536\nv 190.426984 134.790525 235.594880\nv 190.394855 133.922661 235.441853\nv 191.193610 134.325249 235.512840\nv 192.581215 133.406138 235.350779\nv 192.022194 133.817277 235.423271\nv 191.720502 133.046247 235.287322\nv 191.207081 136.088275 235.823705\nv 190.415163 135.669913 235.749936\nv 192.027412 135.634421 235.743685\nv 190.754661 141.549530 236.786656\nv 191.905789 141.501613 236.778217\nv 191.383895 142.459732 236.947157\nv 190.299768 126.013723 234.047299\nv 191.492120 125.905450 234.028199\nv 188.970390 129.493009 234.660796\nv 188.181858 129.417081 234.647408\nv 187.979401 134.422887 235.530043\nv 188.878430 133.914918 235.440484\nv 143.761653 124.048996 230.438924\nv 143.763344 124.284710 231.473775\nv 143.763289 124.952672 230.844134\nv 143.787780 123.334930 232.317720\nv 143.763337 122.647171 231.480262\nv 143.789408 122.601067 232.729418\nv 143.761597 129.440330 231.756021\nv 143.761597 129.982827 232.401006\nv 143.761597 130.413358 162.408302\nv 143.761597 130.360178 161.829376\nv 143.761597 131.666149 160.448608\nv 143.761597 132.160940 159.747400\nv 143.761597 131.320803 159.614515\nv 143.761597 135.673575 159.593578\nv 143.761597 134.472759 160.179810\nv 143.761597 135.758753 160.406567\nv 143.761597 133.686391 161.579476\nv 143.761597 133.778789 162.369095\nv 143.761597 133.071941 162.962576\nv 143.761597 132.135144 162.814675\nv 143.761597 132.392241 163.611099\nv 143.761597 148.877614 162.712558\nv 143.761597 148.533510 161.861149\nv 143.761597 143.793851 163.577443\nv 143.761597 143.463378 162.754391\nv 143.761597 142.947342 163.379739\nv 143.761597 143.834760 164.969872\nv 143.761597 142.908984 164.948557\nv 143.761597 143.465928 165.715638\nv 143.761597 131.077049 165.068856\nv 143.761597 131.864719 164.304102\nv 143.761597 130.667774 164.227952\nv 143.761597 134.796544 164.742893\nv 143.761597 135.212365 165.545337\nv 143.761597 140.065729 163.836691\nv 143.761597 139.241241 164.307411\nv 143.761597 140.346143 164.634695\nv 143.761597 148.933866 163.603954\nv 143.761597 148.034869 164.209839\nv 143.761597 149.033010 164.476582\nv 143.761597 146.447012 164.894046\nv 143.761597 145.847038 164.211092\nv 143.761597 140.280428 165.396865\nv 143.761597 141.104917 164.926146\nv 143.761597 139.108548 166.395736\nv 143.761597 139.775610 165.855608\nv 143.761597 138.854592 165.645542\nv 143.761597 135.551307 166.372164\nv 143.761597 130.946330 169.188653\nv 143.761597 131.019094 170.058315\nv 143.761597 131.825119 169.466161\nv 143.761597 139.699537 167.962881\nv 143.761597 139.084761 168.731387\nv 143.761597 140.020128 168.861646\nv 143.761597 144.319801 168.250291\nv 143.761597 145.367706 168.163193\nv 143.761597 149.035430 166.679041\nv 143.761597 149.069109 167.448412\nv 143.761597 132.444384 167.375041\nv 143.761597 131.631350 167.696303\nv 143.761597 132.565389 168.275237\nv 143.761597 139.396868 167.219212\nv 143.761597 138.475850 167.009146\nv 143.761597 149.104829 165.695760\nv 143.761597 148.064613 166.065748\nv 143.761597 145.964338 166.434367\nv 143.761597 133.656330 232.464624\nv 143.761597 133.151580 233.123665\nv 143.761597 134.010112 233.245071\nv 143.761597 128.420746 229.453531\nv 143.761597 129.390621 228.960026\nv 143.761597 128.672439 228.649625\nv 143.761597 133.173679 230.211788\nv 143.761597 134.052085 230.207840\nv 143.761597 133.550764 229.461285\nv 143.761597 130.609042 228.245908\nv 143.761597 131.462518 227.560003\nv 143.761597 130.495790 227.470215\nv 143.761597 136.206387 231.235226\nv 143.761597 135.863641 232.009292\nv 143.761597 136.724166 232.060575\nv 143.761597 138.003849 231.055680\nv 143.761597 138.284572 230.340990\nv 143.761597 137.347635 230.571819\nv 143.761597 127.164421 224.980481\nv 143.761597 126.367466 225.170599\nv 143.761597 126.997251 225.601326\nv 143.761597 132.326678 227.205362\nv 143.761597 133.145483 226.606872\nv 143.761597 132.439930 227.981055\nv 143.761597 130.259859 225.546568\nv 143.761597 130.407325 226.489191\nv 143.761597 149.368239 178.331356\nv 143.761597 149.435451 177.424157\nv 143.761597 148.622493 177.761160\nv 143.761597 132.747296 176.391734\nv 143.761597 132.725715 177.320345\nv 143.761597 142.998696 176.992743\nv 143.761597 143.906882 176.908162\nv 143.761597 143.266101 176.066567\nv 143.761597 144.783740 176.857365\nv 143.761597 144.516335 177.783542\nv 143.761597 148.083589 175.475253\nv 143.761597 148.083408 176.385915\nv 143.761597 139.069516 176.554521\nv 143.761597 139.780159 176.987313\nv 143.761597 139.908348 176.162533\nv 143.761597 139.054878 174.889759\nv 143.761597 138.257764 174.574022\nv 143.761597 134.725304 173.974102\nv 143.761597 133.722905 174.322814\nv 143.761597 147.889748 174.707044\nv 143.761597 148.640670 174.142185\nv 143.761597 147.840352 173.816593\nv 143.761597 132.869427 171.801526\nv 143.761597 132.834787 170.909074\nv 143.761597 131.932522 171.228275\nv 143.761597 131.086380 172.304313\nv 143.761597 131.084447 173.241766\nv 143.761597 137.833325 171.674260\nv 143.761597 136.734636 171.655730\nv 143.761597 137.007467 172.449317\nv 143.761597 138.509104 173.258812\nv 143.761597 139.447681 173.329631\nv 143.761597 139.044733 172.538666\nv 143.761597 147.537069 171.173362\nv 143.761597 146.721856 171.665666\nv 143.761597 147.690374 172.130290\nv 143.761597 136.564921 170.674908\nv 143.761597 135.739063 171.449965\nv 143.761597 141.097290 170.281900\nv 143.761597 140.432562 169.571429\nv 143.761597 147.871770 168.616294\nv 143.761597 147.765379 169.350732\nv 143.761597 148.614768 169.193542\nv 143.761597 137.182042 176.295301\nv 143.761597 136.871790 176.938933\nv 143.761597 137.580542 177.055315\nv 143.761597 132.707843 178.232995\nv 143.761597 131.833826 178.541702\nv 143.761597 132.662082 179.152280\nv 143.761597 141.456116 178.770024\nv 143.761597 142.012235 179.601843\nv 143.761597 142.436596 178.771029\nv 143.761597 142.800471 181.336755\nv 143.761597 143.348595 180.485968\nv 143.761597 142.444592 180.453636\nv 143.761597 134.222266 180.329427\nv 143.761597 134.351612 179.302782\nv 143.761597 133.406753 179.870219\nv 143.761597 135.993971 181.061878\nv 143.761597 135.930344 181.746740\nv 143.761597 136.716877 181.278258\nv 143.761597 132.370229 180.913442\nv 143.761597 131.582153 181.718746\nv 143.761597 132.489332 181.702167\nv 143.761597 142.129897 182.275801\nv 143.761597 141.348940 181.975724\nv 143.761597 141.582370 182.947103\nv 143.761597 146.285483 183.967509\nv 143.761597 145.583429 183.794261\nv 143.761597 145.821150 184.629769\nv 143.761597 140.621584 183.414539\nv 143.761597 141.402541 183.714616\nv 143.761597 143.033900 182.308133\nv 143.761597 147.288564 184.032030\nv 143.761597 147.355105 184.998674\nv 143.761597 148.120464 184.227687\nv 143.761597 133.130763 185.865882\nv 143.761597 133.753606 186.539541\nv 143.761597 133.911885 185.792095\nv 143.761597 145.836091 186.245565\nv 143.761597 145.050717 186.807533\nv 143.761597 145.834115 187.109030\nv 143.761597 146.662488 187.581189\nv 143.761597 147.445972 187.860483\nv 143.761597 145.877113 188.143157\nv 143.761597 144.997538 188.530570\nv 143.761597 145.825911 189.002729\nv 143.761597 142.224312 186.980816\nv 143.761597 142.532007 186.080324\nv 143.761597 141.494022 186.244183\nv 143.761597 140.168603 187.452510\nv 143.761597 140.815160 188.045590\nv 143.761597 143.061391 188.485581\nv 143.761597 143.523989 187.643020\nv 143.761597 142.799701 187.659518\nv 143.761597 131.534136 187.037934\nv 143.761597 130.580435 186.711577\nv 143.761597 130.602650 187.701905\nv 143.761597 130.518700 188.645906\nv 143.761597 130.193852 189.548070\nv 143.761597 131.231502 188.930426\nv 143.761597 148.662024 190.241776\nv 143.761597 148.883519 189.459757\nv 143.761597 147.051456 190.485473\nv 143.761597 146.798999 191.234934\nv 143.761597 147.623638 191.073215\nv 143.761597 139.077713 190.203930\nv 143.761597 137.990588 190.574084\nv 143.761597 138.706887 191.228144\nv 143.761597 130.089329 190.487317\nv 143.761597 146.622222 192.166696\nv 143.761597 146.638943 192.978166\nv 143.761597 147.387903 192.634146\nv 143.761597 140.775905 193.055325\nv 143.761597 141.531322 192.573751\nv 143.761597 140.458714 192.224907\nv 143.761597 131.747399 192.851136\nv 143.761597 132.124288 192.015455\nv 143.761597 131.206652 192.100964\nv 143.761597 146.455830 194.068543\nv 143.761597 146.415243 194.989262\nv 143.761597 147.364038 194.366336\nv 143.761597 136.369873 194.048567\nv 143.761597 137.286907 194.355106\nv 143.761597 137.117163 193.438178\nv 143.761597 144.775071 193.858922\nv 143.761597 143.758531 193.955928\nv 143.761597 144.490495 194.788475\nv 143.761597 135.594821 193.796409\nv 143.761597 134.728924 193.657111\nv 143.761597 133.566685 192.809336\nv 143.761597 133.958439 193.541943\nv 143.761597 131.289156 194.382073\nv 143.761597 131.417440 193.499578\nv 143.761597 130.701478 193.819140\nv 143.761597 146.689038 195.968168\nv 143.761597 146.750487 196.712002\nv 143.761597 147.384901 196.030889\nv 143.761597 143.115513 196.995883\nv 143.761597 143.830721 197.070496\nv 143.761597 143.705908 196.371850\nv 143.761597 140.839073 196.824540\nv 143.761597 141.674654 196.290860\nv 143.761597 140.852269 195.952244\nv 143.761597 134.219028 194.346010\nv 143.761597 133.644000 195.007776\nv 143.761597 134.414486 195.122944\nv 143.761597 131.406539 196.245315\nv 143.761597 131.391365 195.113980\nv 143.761597 130.588367 195.832970\nv 143.761597 140.896886 228.103895\nv 143.761597 141.262164 226.991522\nv 143.761597 141.139250 226.150206\nv 143.761597 140.164861 226.535679\nv 143.761597 124.872519 223.286504\nv 143.761597 125.247963 222.449703\nv 143.761597 124.267237 222.501909\nv 143.761597 133.819928 224.209704\nv 143.761597 132.925770 224.648133\nv 143.761597 133.881033 225.148902\nv 143.761597 125.681905 221.714794\nv 143.761597 126.079247 220.765688\nv 143.761597 125.040023 220.716002\nv 143.761597 136.546656 225.190543\nv 143.761597 137.396199 225.671660\nv 143.761597 137.434490 224.646733\nv 143.761597 124.478131 219.299349\nv 143.761597 125.297175 218.803963\nv 143.761597 124.337941 218.336415\nv 143.761597 131.793086 221.423781\nv 143.761597 130.892947 222.033582\nv 143.761597 127.415745 219.166583\nv 143.761597 128.327244 219.385390\nv 143.761597 128.024851 218.413603\nv 143.761597 130.034789 219.728842\nv 143.761597 130.130046 220.688063\nv 143.761597 137.470102 222.760050\nv 143.761597 136.665169 223.183141\nv 143.761597 137.389880 223.742525\nv 143.761597 140.751037 222.351173\nv 143.761597 141.375284 223.133472\nv 143.761597 128.728303 217.645906\nv 143.761597 127.816804 217.427098\nv 143.761597 129.165326 219.467282\nv 143.761597 129.805814 218.893970\nv 143.761597 125.519338 216.029502\nv 143.761597 124.789218 216.845639\nv 143.761597 125.887105 217.024891\nv 143.761597 142.073933 218.846170\nv 143.761597 141.155734 218.246923\nv 143.761597 141.284875 219.327606\nv 143.761597 135.361498 216.617050\nv 143.761597 136.343268 216.950812\nv 143.761597 144.170085 217.733156\nv 143.761597 143.980411 218.503057\nv 143.761597 127.203521 214.348968\nv 143.761597 127.641550 213.427695\nv 143.761597 126.592404 213.397592\nv 143.761597 131.885839 213.906343\nv 143.761597 132.606328 214.564031\nv 143.761597 139.553719 218.042543\nv 143.761597 140.386369 217.730149\nv 143.761597 139.573411 217.044332\nv 143.761597 142.208714 215.151052\nv 143.761597 141.495129 214.602928\nv 143.761597 141.341148 215.435635\nv 143.761597 128.559894 213.275810\nv 143.761597 127.948776 212.324434\nv 143.761597 126.588437 210.953172\nv 143.761597 126.343941 211.860634\nv 143.761597 127.274927 211.568857\nv 143.761597 143.441027 202.710075\nv 143.761597 144.252827 202.344519\nv 143.761597 143.331736 201.784910\nv 143.761597 128.972207 199.560784\nv 143.761597 128.732427 200.327177\nv 143.761597 129.671538 199.952063\nv 143.761597 136.941854 200.607418\nv 143.761597 136.618614 201.238030\nv 143.761597 137.342740 201.364604\nv 143.761597 139.872975 200.351547\nv 143.761597 138.874436 200.871065\nv 143.761597 139.819626 201.279176\nv 143.761597 140.611772 201.949765\nv 143.761597 141.462658 202.645169\nv 143.761597 145.230628 200.765842\nv 143.761597 144.418306 200.712099\nv 143.761597 144.955857 201.473097\nv 143.761597 132.349152 198.018398\nv 143.761597 131.695830 197.092559\nv 143.761597 131.256863 197.890143\nv 143.761597 140.530580 199.642072\nv 143.761597 139.585390 199.233960\nv 143.761597 144.136566 197.975551\nv 143.761597 143.362479 198.380216\nv 143.761597 144.258718 198.661238\nv 143.761597 139.371742 198.196658\nv 143.761597 140.129841 197.505205\nv 143.761597 139.258588 197.177377\nv 143.761597 147.190823 197.480428\nv 143.761597 147.753049 197.986438\nv 143.761597 143.807992 214.355992\nv 143.761597 144.440023 215.160180\nv 143.761597 144.728089 214.388711\nv 143.761597 139.724705 215.121161\nv 143.761597 138.959968 214.335997\nv 143.761597 129.966234 211.024452\nv 143.761597 130.737105 210.885289\nv 143.761597 126.852210 209.873048\nv 143.761597 133.168854 211.635015\nv 143.761597 132.268000 211.927615\nv 143.761597 136.498642 210.912634\nv 143.761597 136.424089 211.951375\nv 143.761597 137.316239 211.328473\nv 143.761597 138.898144 212.424878\nv 143.761597 139.447297 211.577999\nv 143.761597 143.623709 212.170762\nv 143.761597 143.433823 213.059684\nv 143.761597 128.615535 209.542477\nv 143.761597 128.854523 208.500807\nv 143.761597 128.951602 207.609096\nv 143.761597 134.235131 208.540770\nv 143.761597 133.904515 207.553148\nv 143.761597 133.321045 208.243450\nv 143.761597 136.686025 202.709269\nv 143.761597 136.161322 201.932161\nv 143.761597 135.827847 202.646214\nv 143.761597 135.760436 201.174974\nv 143.761597 134.954498 202.599107\nv 143.761597 135.479201 203.376216\nv 143.761597 131.718315 203.184527\nv 143.761597 132.305205 202.553565\nv 143.761597 131.354856 202.295720\nv 143.761597 130.293389 200.535814\nv 143.761597 129.974293 201.133248\nv 143.761597 130.835923 200.950607\nv 143.761597 144.672554 205.145131\nv 143.761597 144.124053 204.305334\nv 143.761597 134.107965 202.550883\nv 143.761597 133.139370 202.607514\nv 143.761597 133.637258 203.385740\nv 143.761597 134.840020 204.727386\nv 143.761597 135.107727 204.086967\nv 143.761597 134.338146 203.969528\nv 143.761597 135.981075 204.134073\nv 143.761597 136.518114 204.925029\nv 143.761597 130.831690 203.794405\nv 143.761597 129.835411 203.448598\nv 143.761597 139.442549 206.621204\nv 143.761597 139.901486 205.672379\nv 143.761597 138.868874 205.907609\nv 143.761597 142.727292 207.442012\nv 143.761597 142.893927 206.519203\nv 143.761597 142.014093 206.769296\nv 143.761597 134.607871 206.960360\nv 143.761597 135.527948 207.174778\nv 143.761597 131.779192 205.004321\nv 143.761597 132.665817 204.394443\nv 143.761597 131.782039 204.052250\nv 143.761597 129.513631 207.071194\nv 143.761597 128.694174 206.448355\nv 143.761597 144.337913 207.860755\nv 143.761597 143.449670 208.097910\nv 143.761597 144.180458 208.766746\nv 143.761597 142.335393 209.395563\nv 143.761597 143.171659 209.873580\nv 143.761597 143.763467 211.274969\nv 143.761597 143.911504 210.463779\nv 158.432100 153.285247 163.579514\nv 159.057970 153.420620 164.431695\nv 157.541878 153.092970 162.665116\nv 154.972875 152.756582 165.340676\nv 175.753202 155.013242 166.955626\nv 178.589257 155.040661 165.923397\nv 178.976588 155.025660 165.338634\nv 178.710691 155.065358 166.682427\nv 178.910527 155.093537 167.483574\nv 178.932412 154.947260 162.992043\nv 180.622870 155.093266 167.007571\nv 179.307462 152.765911 203.063696\nv 180.111939 148.732903 223.587788\nv 176.553567 145.684876 234.045225\nv 148.889541 141.221904 234.267513\nv 146.573081 141.652422 231.049958\nv 159.234757 144.208766 232.692340\nv 177.048087 146.913560 230.048477\nv 177.944263 146.928687 230.096491\nv 176.740451 145.943132 233.219092\nv 175.909351 145.941429 233.120770\nv 175.145979 146.039377 232.678352\nv 175.771638 146.894617 229.952740\nv 175.393569 147.103461 229.198069\nv 173.705729 145.720829 233.461935\nv 172.913972 145.840902 232.901741\nv 173.604183 147.009133 229.183932\nv 170.148868 146.859291 228.787427\nv 170.933176 146.966791 228.653139\nv 171.766534 147.086094 228.467282\nv 168.097830 145.482859 232.709574\nv 170.248168 146.042239 231.568204\nv 167.314629 146.842405 227.908551\nv 168.251704 146.892814 228.062367\nv 168.059801 147.086964 227.323358\nv 169.910809 147.179799 227.609414\nv 169.234934 146.816865 228.655188\nv 164.388071 145.408566 231.522630\nv 165.972365 145.829461 230.801497\nv 167.141018 145.936273 230.894298\nv 165.074716 146.618016 227.757915\nv 166.108015 146.720312 227.834142\nv 166.089426 146.934259 227.093314\nv 163.364962 145.538932 230.626140\nv 164.220463 145.624346 230.731631\nv 164.259224 145.888035 229.869555\nv 165.282332 145.757669 230.766046\nv 163.092830 146.655157 226.704033\nv 164.153436 146.632958 227.284080\nv 163.995520 146.854163 226.437040\nv 161.748767 145.851863 228.769169\nv 162.655869 145.656577 229.892563\nv 161.424638 146.660261 225.798201\nv 162.212440 146.666803 226.206042\nv 162.147111 146.869819 225.449153\nv 159.287451 145.196461 229.596071\nv 160.877247 145.882270 228.195670\nv 159.970695 146.653311 224.964519\nv 160.645680 146.637729 225.430433\nv 157.201632 145.297486 227.968845\nv 158.328844 145.535274 227.888645\nv 157.982904 146.480158 224.323402\nv 158.915932 146.538539 224.706887\nv 154.625096 144.876942 227.619100\nv 157.166501 145.534088 227.130994\nv 155.275954 145.961297 224.297891\nv 154.454819 145.979072 223.622766\nv 153.616407 145.780663 223.661110\nv 149.865305 145.586635 221.085188\nv 149.073931 145.604261 220.242148\nv 148.244699 145.600079 219.416076\nv 149.081497 145.809552 219.461860\nv 177.681464 147.570711 227.793563\nv 178.324501 147.768879 227.125001\nv 179.219379 147.598346 227.816049\nv 177.918119 148.546472 224.165724\nv 178.626472 148.670703 223.754299\nv 177.177405 148.350262 224.839482\nv 176.490717 148.151402 225.507771\nv 175.908346 147.332454 228.450732\nv 177.627612 147.759573 227.088692\nv 174.573387 148.126270 225.289949\nv 175.583159 148.138032 225.418346\nv 175.276933 148.340265 224.602996\nv 173.368140 147.209451 228.404535\nv 172.259180 148.057960 225.022779\nv 173.307120 148.085572 225.161657\nv 173.219220 148.300891 224.335721\nv 172.600678 147.168757 228.387349\nv 170.333798 148.195089 223.959748\nv 171.315630 148.133827 224.476344\nv 171.189448 148.334540 223.680247\nv 168.425112 148.132537 223.547384\nv 169.376179 148.167495 223.739974\nv 169.256549 148.360843 222.971061\nv 166.508426 148.091099 222.928487\nv 167.464119 148.104362 223.271661\nv 167.349789 148.312622 222.435296\nv 164.396555 148.115035 221.845834\nv 165.415148 148.112165 222.348519\nv 165.375503 148.302228 221.589438\nv 161.994994 147.071618 224.591866\nv 162.346074 147.923207 221.500366\nv 163.359617 147.996852 221.752320\nv 163.343368 148.231452 220.834799\nv 160.736744 147.304601 222.958867\nv 160.252841 147.960102 220.085968\nv 161.269628 147.962369 220.709757\nv 157.209802 146.515516 223.674511\nv 156.333316 146.457425 223.279851\nv 159.364762 147.901553 219.730331\nv 155.455187 146.271131 223.331382\nv 155.512181 146.475201 222.604726\nv 153.171220 146.620981 220.094095\nv 155.916708 147.092387 220.476146\nv 154.113048 147.147906 218.773270\nv 154.107772 147.368778 217.872032\nv 151.533734 146.772712 217.972843\nv 149.900647 146.035003 219.393455\nv 149.018730 146.414628 216.901904\nv 150.722080 146.408885 218.681107\nv 147.404563 146.196149 216.034892\nv 148.150010 146.369868 216.147997\nv 145.250575 145.660808 215.757761\nv 165.851340 154.307536 178.188065\nv 165.165189 154.135940 180.898745\nv 166.305894 154.410500 176.232151\nv 167.496004 154.531739 175.954121\nv 167.027718 154.399086 178.654408\nv 167.050581 154.301998 181.091190\nv 166.973036 154.246658 182.108583\nv 169.002841 154.601257 177.667458\nv 169.016573 154.630946 176.923085\nv 169.911908 154.654953 178.060605\nv 169.879531 154.505645 181.454025\nv 169.744521 154.417535 183.057934\nv 170.848998 154.722530 177.865258\nv 171.834988 154.722870 179.395960\nv 170.865071 154.467307 183.414261\nv 172.134940 154.535035 183.644751\nv 172.812051 154.739012 180.183783\nv 172.778728 154.773559 179.343166\nv 173.696100 154.762363 180.636987\nv 174.566645 154.558179 185.129616\nv 174.692748 154.829263 180.089276\nv 176.000656 154.714744 183.242002\nv 176.144170 154.854069 180.663856\nv 179.585495 154.788935 183.147182\nv 178.394198 154.802849 182.635146\nv 177.500168 154.806875 182.233585\nv 176.555073 154.897400 180.019211\nv 178.386004 154.940913 179.969799\nv 177.778850 154.615898 185.637687\nv 166.531499 154.485174 170.184712\nv 166.519578 154.483236 169.448654\nv 167.604949 154.587703 170.538200\nv 168.160415 154.587253 175.913533\nv 167.519605 154.544745 175.196655\nv 165.542685 154.377406 174.539408\nv 166.193120 154.429527 175.265882\nv 168.591214 154.663979 170.607424\nv 168.504978 154.654784 169.677429\nv 169.548090 154.738836 170.729080\nv 168.051087 154.599370 174.239373\nv 169.881538 154.703548 176.243137\nv 169.001778 154.646850 175.991050\nv 170.529488 154.808990 171.525600\nv 170.472641 154.801214 170.543173\nv 171.508840 154.868584 172.293122\nv 171.769411 154.780507 177.713045\nv 170.816744 154.745620 177.022960\nv 172.460227 154.918778 172.682721\nv 172.405426 154.921561 171.729292\nv 173.427751 154.964449 173.052506\nv 172.705736 154.817249 178.125170\nv 174.398235 155.001966 173.461260\nv 174.327297 155.009272 172.527645\nv 175.403429 155.028344 174.091547\nv 174.654883 154.927215 177.234024\nv 175.359366 154.890086 179.334091\nv 176.194114 154.916951 179.257704\nv 176.380853 155.054398 174.427975\nv 176.275206 155.072842 173.272826\nv 177.335846 155.081431 174.421820\nv 177.343650 154.997619 177.677122\nv 178.320199 155.015605 177.675866\nv 178.310917 155.093755 174.671809\nv 178.227702 155.111220 173.859243\nv 179.182315 155.025217 177.794561\nv 180.241420 155.087548 175.939506\nv 179.112887 155.124124 173.257770\nv 179.718916 155.126707 170.011293\nv 178.757418 155.115578 169.889176\nv 178.415757 155.095909 168.233965\nv 178.137816 155.111799 173.007781\nv 177.158628 155.094436 172.678178\nv 176.689423 155.047965 167.732267\nv 177.471435 155.076080 168.168405\nv 177.370501 155.050967 166.891621\nv 176.181203 155.068382 172.341750\nv 175.210912 155.039303 171.968887\nv 174.240427 155.001787 171.560133\nv 173.291038 154.961448 171.225509\nv 174.028994 154.970235 168.325733\nv 172.339651 154.911255 170.835910\nv 171.404143 154.857969 170.411644\nv 170.422744 154.787815 169.615124\nv 169.511319 154.718157 168.925559\nv 169.023504 154.666102 168.060884\nv 169.003428 154.679005 168.881978\nv 168.017163 154.602729 168.812754\nv 167.504190 154.558511 168.771229\nv 165.061591 154.280888 166.819631\nv 178.246756 151.885500 208.483846\nv 178.654817 152.304298 205.953467\nv 179.625412 152.320120 205.937030\nv 178.574082 152.685302 203.512184\nv 178.569240 152.800472 202.756733\nv 178.159092 152.576634 204.157198\nv 176.445638 151.852799 208.394636\nv 176.827954 152.265313 205.935150\nv 177.741392 152.287954 205.928884\nv 176.243521 152.656453 203.325880\nv 177.123339 152.629197 203.660972\nv 176.956041 152.747120 202.870129\nv 174.701621 151.789918 208.371170\nv 175.077593 152.205853 205.929938\nv 175.939673 152.237859 205.920286\nv 174.500175 152.665587 202.832473\nv 175.354501 152.664447 203.062159\nv 175.221897 152.775517 202.305351\nv 172.913383 151.827478 207.627891\nv 173.410132 152.159691 205.739809\nv 174.216707 152.203443 205.702698\nv 172.857302 152.659558 202.318120\nv 173.673782 152.661991 202.592426\nv 173.551091 152.774224 201.801359\nv 171.118269 151.882867 206.662588\nv 171.631283 152.236708 204.588460\nv 172.526690 152.183707 205.265622\nv 171.215731 152.659293 201.631203\nv 172.026970 152.664185 201.956688\nv 171.923372 152.766899 201.201568\nv 169.409991 151.878396 205.906369\nv 170.025115 152.157298 204.391235\nv 170.834280 152.182597 204.594755\nv 169.612451 152.620995 201.099904\nv 170.411109 152.640235 201.374125\nv 170.313474 152.742768 200.601862\nv 167.741192 151.817342 205.401842\nv 168.368347 152.143767 203.618458\nv 169.177980 152.163727 203.917046\nv 167.992104 152.604790 200.243961\nv 168.811158 152.601549 200.782918\nv 168.695761 152.726769 199.788684\nv 166.016484 151.886194 203.875323\nv 166.069710 151.770127 204.667372\nv 166.766330 152.081087 203.076025\nv 167.560886 152.111857 203.355862\nv 166.466418 152.509010 199.943750\nv 167.211391 152.568542 199.993241\nv 167.131734 152.670478 199.200237\nv 165.148512 151.921099 203.048787\nv 165.950774 151.995658 203.096320\nv 164.886844 152.371485 199.759796\nv 165.674173 152.439221 199.857118\nv 165.599432 152.543210 199.053424\nv 163.371124 151.878892 201.969384\nv 164.261225 151.900442 202.518223\nv 164.313640 151.780108 203.365054\nv 163.130561 152.343994 198.468046\nv 163.990407 152.358799 199.113148\nv 162.491023 151.791505 201.821558\nv 162.546252 151.672064 202.686664\nv 161.493934 151.914974 200.067135\nv 160.512164 151.864877 199.444035\nv 162.295780 152.132542 199.253348\nv 156.881863 151.809723 195.615921\nv 154.329085 151.005467 198.356878\nv 153.473179 150.846384 198.270387\nv 155.124539 151.680943 194.084250\nv 152.649088 150.723734 197.977569\nv 151.799632 150.519655 198.222276\nv 152.561842 151.230330 193.655615\nv 153.365086 151.468068 192.986694\nv 150.104424 150.336547 196.810128\nv 148.636848 150.109973 195.873077\nv 151.517405 151.370463 190.183338\nv 147.346796 149.941147 194.598022\nv 149.709965 151.025131 189.637957\nv 146.233309 150.161930 189.628260\nv 179.046942 153.854552 194.384306\nv 181.553671 153.946614 193.702464\nv 178.204072 153.750756 195.246821\nv 175.885102 153.498864 196.980768\nv 176.521314 153.736676 195.004636\nv 177.371316 153.756416 195.007718\nv 176.174528 154.025456 192.180972\nv 177.031165 154.017366 192.474205\nv 176.913534 154.109273 191.572532\nv 174.287481 153.514921 196.346452\nv 174.901842 153.700866 194.835259\nv 175.706888 153.731105 194.804892\nv 174.491016 154.054845 191.252030\nv 175.329845 154.037068 191.782658\nv 175.218067 154.135140 190.748671\nv 172.738628 153.501597 195.815233\nv 173.238510 153.734782 193.815500\nv 174.092238 153.703935 194.475062\nv 172.927848 154.013046 190.965943\nv 173.688296 154.049180 190.945635\nv 173.618790 154.116783 190.238350\nv 171.229204 153.481085 195.199861\nv 171.760587 153.676111 193.612541\nv 172.519820 153.690213 193.882931\nv 171.333854 154.019166 189.940943\nv 172.118654 154.029257 190.333205\nv 172.073542 154.070558 189.866396\nv 169.783638 153.431340 194.764924\nv 170.190272 153.667090 192.717966\nv 170.958640 153.689334 192.992440\nv 169.825084 153.937307 189.701549\nv 170.590915 153.964369 189.995925\nv 170.522911 154.033405 189.179758\nv 168.022341 153.380833 193.910348\nv 168.402039 153.334941 194.659656\nv 169.215360 153.605917 192.612372\nv 169.228644 153.866737 190.004201\nv 168.440273 153.797299 190.078704\nv 169.160640 153.935773 189.188035\nv 167.323075 153.326310 193.844908\nv 167.009301 153.227986 194.534530\nv 167.517716 153.652634 190.738080\nv 167.641642 153.720538 190.150062\nv 161.469189 152.994935 190.851905\nv 162.895984 153.395919 188.286082\nv 162.202352 153.349076 187.854645\nv 162.334334 153.480730 186.429630\nv 163.195319 153.623844 185.855295\nv 161.588170 153.426451 185.871209\nv 159.006929 152.836998 188.794738\nv 159.657875 152.868539 189.493196\nv 160.077428 153.187788 186.320396\nv 158.333381 152.764945 188.441653\nv 157.432043 152.667950 187.928458\nv 157.616571 152.620339 188.882843\nv 159.330764 153.086226 186.248020\nv 158.565080 153.013451 185.657665\nv 159.264979 153.200571 184.498928\nv 156.593774 152.561721 187.565019\nv 155.599564 152.402569 187.358768\nv 155.721024 152.364194 188.163397\nv 158.515465 153.061353 184.869864\nv 157.787627 152.954232 184.797978\nv 157.708243 153.046390 183.221063\nv 158.487527 153.141353 183.639242\nv 158.457757 153.185608 182.850127\nv 155.382560 152.595991 184.045950\nv 156.913182 152.940547 182.794834\nv 156.875214 152.990025 181.805807\nv 154.518279 152.493317 183.098555\nv 155.262752 152.768790 180.682344\nv 152.300316 151.980580 184.593562\nv 152.277412 152.119332 181.974550\nv 151.046808 151.774470 183.698947\nv 153.645205 152.502126 179.861604\nv 149.926817 151.608868 182.220719\nv 152.319108 152.283090 178.646644\nv 151.217098 152.103113 176.796851\nv 149.625727 151.759310 175.683988\nv 147.777607 151.315028 174.937702\nv 177.730022 152.853359 202.244407\nv 175.517372 153.085809 200.057077\nv 176.222220 153.055971 200.468210\nv 175.159821 153.418285 197.411174\nv 175.960571 153.403639 197.740289\nv 173.998293 153.049107 199.859105\nv 174.726139 153.077198 199.882331\nv 173.584486 153.424232 196.806977\nv 174.381356 153.422821 197.112179\nv 172.456493 152.995366 199.670790\nv 173.199928 153.040246 199.621440\nv 172.068807 153.397818 196.349056\nv 172.820791 153.412553 196.575073\nv 170.834863 153.034525 198.594097\nv 171.649649 152.997143 199.279061\nv 170.543705 153.390016 195.582029\nv 171.301145 153.395793 195.971384\nv 169.316767 152.958780 198.337411\nv 170.073138 152.982671 198.583253\nv 169.122954 153.328507 195.237580\nv 169.811080 153.372475 195.283162\nv 167.796248 152.949900 197.417408\nv 168.538464 152.964066 197.796354\nv 165.577994 152.635365 198.277290\nv 166.332199 152.889457 196.815735\nv 167.053736 152.921304 197.103568\nv 166.315274 153.078560 195.251040\nv 165.544215 152.762676 197.199959\nv 165.503387 153.078429 194.549298\nv 162.099146 152.582827 195.409008\nv 157.709058 151.943881 195.610060\nv 159.060540 152.526469 192.164254\nv 156.858701 151.901991 194.786519\nv 156.759962 151.975451 193.949802\nv 158.104330 152.460947 191.354733\nv 155.906270 151.866953 193.626207\nv 154.999303 151.780062 192.918077\nv 157.121345 152.373432 190.656484\nv 156.310601 152.247958 190.531994\nv 154.123076 151.701216 192.104608\nv 153.270591 151.575231 191.715183\nv 155.643688 152.153893 190.298746\nv 154.915279 152.087136 189.602169\nv 155.187326 152.220527 188.703645\nv 154.454767 152.071651 188.855669\nv 153.677398 151.972330 188.262424\nv 152.721716 151.838813 187.615328\nv 149.510894 151.051965 188.782912\nv 148.801618 150.921366 188.395457\nv 148.035475 150.995894 184.817870\nv 143.761597 149.975147 183.164051\nv 155.409994 152.965110 170.663631\nv 157.239933 153.290923 172.864256\nv 158.637420 153.492578 175.188952\nv 158.586412 153.472672 175.965720\nv 159.353461 153.590082 175.770695\nv 162.313084 153.912627 178.545050\nv 161.594388 153.797176 179.368169\nv 163.605483 154.175505 170.193130\nv 162.649769 154.053839 170.101149\nv 161.702146 153.941492 174.163697\nv 163.126746 154.128489 173.344557\nv 163.869356 154.205522 173.955066\nv 164.749019 154.295375 174.355905\nv 177.328667 154.316221 189.335077\nv 178.215411 154.323939 189.454878\nv 177.693502 154.560279 186.341119\nv 176.818105 154.533608 186.431459\nv 175.738741 154.281253 189.199658\nv 176.534593 154.289828 189.383173\nv 175.398849 154.514014 186.137842\nv 176.182382 154.536523 186.140317\nv 174.135874 154.286249 188.397175\nv 174.892695 154.290167 188.719100\nv 173.804766 154.526183 185.135254\nv 174.634166 154.522849 185.626438\nv 172.611984 154.249858 187.943570\nv 173.365761 154.269829 188.154536\nv 172.289317 154.458766 184.989367\nv 173.055805 154.487284 185.149489\nv 171.079212 154.215561 187.251530\nv 171.839954 154.234150 187.586621\nv 171.493357 154.449774 184.260142\nv 171.562686 154.419216 184.933578\nv 170.312916 154.195257 186.847078\nv 170.292817 154.351487 184.703089\nv 165.888736 154.008658 184.329973\nv 165.041038 153.962228 183.701031\nv 164.153383 153.895128 183.304433\nv 164.223836 154.002379 181.592800\nv 163.390382 153.950313 180.740997\nv 161.653774 153.690650 181.605583\nv 160.792009 153.577663 181.621861\nv 160.010627 153.509553 180.793811\nv 158.447247 153.243151 181.620425\nv 159.996475 153.631060 177.876704\nv 159.995222 153.607028 178.665922\nv 159.229219 153.481014 178.985176\nv 157.667372 153.123658 181.642656\nv 156.864114 153.023038 181.016514\nv 158.477217 153.380007 178.595540\nv 156.097660 152.927552 180.282191\nv 157.752035 153.283799 178.094040\nv 157.829884 153.350032 176.283758\nv 156.286500 153.121996 174.715168\nv 157.058628 153.240826 175.518249\nv 155.418727 152.949849 175.745361\nv 155.583955 152.995312 175.093763\nv 153.695947 152.652882 173.680388\nv 150.242412 151.913433 174.826596\nv 150.317686 151.933824 173.910465\nv 147.730915 151.314529 173.942947\nv 150.184633 151.896789 171.038791\nv 150.072397 151.859014 170.097034\nv 150.599117 151.967522 169.217624\nv 147.697967 151.293102 171.050011\nv 179.274923 150.859158 214.102662\nv 178.736790 149.916460 218.502156\nv 177.796179 149.783134 219.015264\nv 177.565196 150.974251 213.281873\nv 178.440193 150.825247 214.184985\nv 178.380707 151.157542 212.476125\nv 175.794762 149.837765 218.501567\nv 176.152083 150.373681 216.039706\nv 177.234268 150.315598 216.470559\nv 175.837553 151.058713 212.618496\nv 176.691218 151.101627 212.527748\nv 176.652046 151.263632 211.663761\nv 173.966591 149.815041 218.232558\nv 174.208147 150.328095 215.857312\nv 175.212314 150.361429 215.913481\nv 172.271750 150.890477 212.561623\nv 173.139517 150.936254 212.572640\nv 173.238599 151.093868 211.788815\nv 174.991545 151.018177 212.641157\nv 172.335566 149.772437 217.992993\nv 172.357616 150.260480 215.678495\nv 173.353223 150.302666 215.756714\nv 170.973921 150.815597 212.512309\nv 171.760603 150.863415 212.530710\nv 171.584150 151.000272 211.759398\nv 170.238572 149.710364 217.583415\nv 170.880410 150.184450 215.548858\nv 171.831657 150.240358 215.612612\nv 169.361316 150.709308 212.438324\nv 170.166773 150.763279 212.468261\nv 167.627755 149.619159 216.968816\nv 168.347324 150.036369 215.287306\nv 169.286745 150.105954 215.339905\nv 167.713474 150.576410 212.369324\nv 168.523538 150.643708 212.393993\nv 168.376490 150.777214 211.656456\nv 165.360654 149.474358 216.537881\nv 166.163516 150.070106 214.080185\nv 167.212963 150.037063 214.750333\nv 165.780027 150.641811 211.027876\nv 166.713083 150.614130 211.674940\nv 166.633371 150.737598 210.984723\nv 163.409193 149.415040 215.717696\nv 164.287033 149.866407 214.043809\nv 165.206985 149.962988 214.085533\nv 163.974377 150.535741 210.482774\nv 164.893942 150.556129 210.945103\nv 164.780750 150.744891 209.875330\nv 161.544261 149.325010 214.963579\nv 162.397673 149.920304 212.590242\nv 163.333174 149.895002 213.310275\nv 162.181289 150.411057 209.962845\nv 163.055630 150.512286 209.999110\nv 162.986843 150.623275 209.376737\nv 159.724358 149.212529 214.209250\nv 160.605263 149.722798 212.327051\nv 161.494418 149.818237 212.478785\nv 160.322599 150.333124 208.973443\nv 161.250010 150.366933 209.502604\nv 161.185091 150.488238 208.811310\nv 157.946964 149.398221 211.857748\nv 157.935816 149.173676 212.997212\nv 158.534545 150.152943 208.427737\nv 159.420943 150.208162 208.887254\nv 159.371282 150.399211 207.822631\nv 157.059492 149.277672 211.723310\nv 156.306570 149.157617 211.641688\nv 156.786208 150.137429 206.868374\nv 157.635057 150.170753 207.519555\nv 157.636036 150.310668 206.711932\nv 153.935453 148.787421 211.227776\nv 153.282751 148.793159 210.543722\nv 153.170877 148.652208 211.146297\nv 155.847514 150.087631 206.198392\nv 152.236671 148.937092 208.617827\nv 152.994826 149.275218 207.626033\nv 152.265637 149.129792 207.585346\nv 152.172757 149.281897 206.613720\nv 147.574527 148.379337 205.640635\nv 148.468104 148.723380 204.914130\nv 179.361797 148.781463 223.358655\nv 176.910053 149.661797 219.437406\nv 177.970674 149.602879 219.810722\nv 175.705347 148.927248 222.332977\nv 176.637348 148.937819 222.429773\nv 175.026977 149.651957 219.172852\nv 175.967773 149.656243 219.313234\nv 173.786966 148.887827 222.111448\nv 174.726904 148.911263 222.207596\nv 173.214258 149.614501 218.922610\nv 174.101633 149.632938 219.051238\nv 171.877181 148.813584 221.928563\nv 172.813043 148.855973 221.996852\nv 171.609269 149.562844 218.687368\nv 172.352920 149.587011 218.798304\nv 169.764018 148.918565 220.815151\nv 170.856122 148.870301 221.376432\nv 169.065433 149.527189 217.977257\nv 170.418777 149.565095 218.275899\nv 168.064233 148.767149 220.818018\nv 168.874654 148.811505 220.941010\nv 166.397993 149.359370 217.547721\nv 167.655466 149.412670 217.863678\nv 164.345973 149.201664 217.202512\nv 165.355601 149.293165 217.317489\nv 163.331545 148.407546 220.062488\nv 162.440226 149.236551 215.940688\nv 163.382059 149.204368 216.645896\nv 161.386796 148.553614 218.274291\nv 160.576587 149.036583 215.627553\nv 161.499686 149.158796 215.676462\nv 158.492455 147.863300 219.286012\nv 158.612282 148.274168 217.613096\nv 158.805106 149.033294 214.354648\nv 159.701910 149.023563 215.060068\nv 157.559450 147.600117 219.689053\nv 156.862366 148.230020 216.456696\nv 157.741076 148.243651 217.081506\nv 157.018101 148.959795 213.251114\nv 157.909839 149.008379 213.757731\nv 155.027569 147.969119 216.092025\nv 155.969847 148.147220 216.083887\nv 156.135250 148.892871 212.790342\nv 153.022512 147.863573 214.707537\nv 152.180818 147.700917 214.616164\nv 154.084527 147.897615 215.553220\nv 150.063315 147.611695 212.766305\nv 147.351770 147.453991 210.217700\nv 146.920861 147.479117 209.510066\nv 148.111106 147.528775 210.813550\nv 147.361244 147.745453 208.755504\nv 147.495395 148.075313 207.218283\nv 148.037688 148.044561 208.141939\nv 145.854203 147.672773 207.012936\nv 146.690426 147.893288 207.056566\nv 146.827261 148.079187 206.249594\nv 180.065836 151.421360 211.187051\nv 178.261428 151.774691 209.089638\nv 177.405598 151.690219 209.456445\nv 174.952373 151.180181 211.777170\nv 175.605927 151.677814 209.207939\nv 176.514639 151.701595 209.239023\nv 174.074849 151.227869 211.309112\nv 173.904063 151.663734 208.869281\nv 174.739367 151.702834 208.861663\nv 172.334864 151.197062 210.950525\nv 173.207082 151.182092 211.298096\nv 172.067904 151.773420 207.662829\nv 173.020838 151.696760 208.413726\nv 170.712770 151.137938 210.686448\nv 171.548182 151.149244 210.932125\nv 170.400953 151.695072 207.453955\nv 171.243133 151.716342 207.668362\nv 168.969755 151.213795 209.523237\nv 169.850234 151.181831 210.085496\nv 168.646651 151.737312 206.374103\nv 169.512749 151.720514 206.915916\nv 167.296648 151.096801 209.345550\nv 168.124272 151.180301 209.297908\nv 167.006745 151.616576 206.214787\nv 167.809446 151.694428 206.177502\nv 165.476742 151.132650 208.099626\nv 166.377370 151.108280 208.760888\nv 165.240786 151.672395 204.764736\nv 166.109568 151.641757 205.536490\nv 163.638353 151.144727 206.818639\nv 164.559494 151.134219 207.494995\nv 164.353499 151.651738 204.234172\nv 163.464350 151.644839 203.636549\nv 161.879660 150.942098 206.695124\nv 162.759977 151.045259 206.757001\nv 162.584249 151.557453 203.488723\nv 161.701423 151.467439 203.356617\nv 160.077850 150.776639 206.189753\nv 160.969949 150.876502 206.343661\nv 161.206630 151.435958 203.126575\nv 160.250556 151.349596 202.819256\nv 157.592999 150.434933 205.914235\nv 158.312649 150.665126 205.236139\nv 159.211153 150.738289 205.631791\nv 159.756495 151.311722 202.589534\nv 158.491319 151.162109 202.254243\nv 157.506836 150.507537 205.382654\nv 157.407893 151.021088 202.087086\nv 150.875830 150.015973 200.315244\nv 147.275406 149.073184 200.951282\nv 183.250939 155.104413 167.848821\nv 183.193440 155.117687 168.907214\nv 184.150656 155.082684 167.458872\nv 183.127217 152.091265 207.371834\nv 184.995192 155.080940 167.933927\nv 185.052650 155.056680 167.035073\nv 185.838759 155.031580 166.715463\nv 186.909411 155.005655 166.940425\nv 201.831851 153.702500 165.516527\nv 207.797794 152.744224 166.299055\nv 205.038738 153.083499 162.663425\nv 188.892029 145.224301 234.979479\nv 188.814392 145.493022 234.181012\nv 210.001036 142.689478 232.910509\nv 210.506180 142.818171 232.180376\nv 210.698595 142.953506 231.641611\nv 211.438373 140.963799 236.683373\nv 215.004083 143.999532 224.560183\nv 214.026025 144.287099 224.492018\nv 214.590379 142.955550 228.359913\nv 213.289604 144.518944 224.402350\nv 207.714618 143.806088 231.165092\nv 206.999373 143.984671 231.099930\nv 206.006187 144.835514 229.061028\nv 206.632919 144.887870 228.484174\nv 203.146757 145.039751 230.176706\nv 203.077308 144.761722 231.076678\nv 202.283017 144.907270 231.072071\nv 201.442381 144.764322 231.969181\nv 199.156401 144.506033 233.859009\nv 198.308485 144.655560 233.769891\nv 197.181583 145.250104 232.425176\nv 197.990278 145.307102 231.905591\nv 182.323587 146.921166 230.253422\nv 182.431167 147.158015 229.456410\nv 185.198703 146.760016 230.589870\nv 186.581164 146.783920 230.317916\nv 186.517289 147.016650 229.569555\nv 189.303860 146.623755 230.387112\nv 188.470464 146.893527 229.657136\nv 190.221293 146.536226 230.459232\nv 190.259724 146.737156 229.784073\nv 190.586879 145.520961 233.707442\nv 190.582419 146.983404 228.855724\nv 191.567044 146.771278 229.344355\nv 190.972306 147.105055 228.343886\nv 192.541643 146.658845 229.436419\nv 192.758198 146.821988 228.821956\nv 195.267922 146.368860 229.493799\nv 194.459246 146.668887 228.771147\nv 192.639530 145.371207 233.619098\nv 194.573587 146.856754 228.073823\nv 194.666608 147.062711 227.324743\nv 196.179288 146.264236 229.489254\nv 197.176638 146.361198 228.748377\nv 198.885443 145.450967 231.046120\nv 199.112893 146.832153 226.218307\nv 198.233942 147.103387 225.665264\nv 198.172880 146.449445 228.004932\nv 199.051837 146.330249 228.013800\nv 199.767965 145.302607 231.087058\nv 200.677697 145.197937 230.994682\nv 201.499555 145.050460 231.038710\nv 201.518333 145.340885 230.097572\nv 201.769864 146.895984 224.546630\nv 200.012844 146.322559 227.553992\nv 200.942143 146.349184 226.977045\nv 200.040941 146.568883 226.689935\nv 202.456800 145.343849 229.581516\nv 204.105992 146.454657 224.738420\nv 203.448616 146.690161 224.301823\nv 201.888946 146.186060 227.006831\nv 203.343038 146.021060 226.731604\nv 203.263366 145.190192 229.616622\nv 204.308737 145.164784 229.062596\nv 205.296262 146.380101 224.193803\nv 205.281709 146.631877 223.288529\nv 205.087534 145.002919 229.094067\nv 207.175867 146.443253 222.613883\nv 214.931517 145.662276 218.479800\nv 184.606031 148.530449 224.242409\nv 185.320787 148.380313 224.731117\nv 183.321276 148.168201 225.705621\nv 187.223665 148.438827 224.230985\nv 188.009820 147.916626 226.055899\nv 186.961972 147.205703 228.834674\nv 187.784645 147.167472 228.840282\nv 189.039047 148.468371 223.771365\nv 188.545898 147.907537 225.979255\nv 189.303432 147.896431 225.856252\nv 188.656472 147.098630 228.895098\nv 189.664986 147.070933 228.783604\nv 190.849859 148.430624 223.470396\nv 190.180245 147.873716 225.726176\nv 191.105694 147.852553 225.559967\nv 191.947751 147.063934 228.230621\nv 192.776839 148.435096 222.844201\nv 192.128326 147.815144 225.395745\nv 193.175771 147.785597 225.169661\nv 192.749018 146.992994 228.220060\nv 193.673807 146.938915 228.114072\nv 194.620803 148.359621 222.453592\nv 194.536570 147.706887 224.962135\nv 195.562799 147.645110 224.803256\nv 196.324488 148.282850 222.034314\nv 196.447501 147.694924 224.234415\nv 197.323636 147.757975 223.610447\nv 198.195281 147.830346 222.908093\nv 199.022712 147.886774 222.280875\nv 202.610565 146.884702 224.087090\nv 201.815668 147.368382 222.695413\nv 202.674478 147.138596 223.062540\nv 201.826394 147.586970 221.844451\nv 200.950563 147.711049 221.899624\nv 203.495507 146.838347 223.699573\nv 204.390712 146.798452 223.266695\nv 203.552661 146.992993 223.051961\nv 203.430651 147.637862 220.617057\nv 203.224638 147.939202 219.537013\nv 203.569682 147.098701 222.629662\nv 205.050535 147.949592 218.161365\nv 206.860949 147.247386 219.660727\nv 206.155476 147.257176 220.177728\nv 207.670265 147.239782 219.041953\nv 208.489159 147.193265 218.533335\nv 209.394816 147.211681 217.647066\nv 210.595467 147.516138 215.229509\nv 211.357799 146.067996 220.486377\nv 212.215954 147.265527 214.681481\nv 214.019718 147.107917 213.325358\nv 198.567584 154.110815 177.996975\nv 197.741278 154.086825 181.094711\nv 196.766003 154.251479 179.498681\nv 198.262551 154.232644 168.323134\nv 193.813985 154.563021 178.030011\nv 194.200671 154.565686 177.093640\nv 192.856942 154.437909 182.568592\nv 192.381984 154.473456 182.522981\nv 192.780508 154.515720 181.037349\nv 191.694472 154.724464 177.740309\nv 192.252031 154.708553 177.080854\nv 191.086037 154.741599 178.526679\nv 191.685385 154.522005 182.450681\nv 191.157236 154.516206 183.166875\nv 192.123766 154.527224 181.727815\nv 190.815820 154.487398 183.928749\nv 191.602188 154.439429 184.007721\nv 188.926357 154.820596 179.213292\nv 188.658049 154.796709 180.075098\nv 187.960591 154.805898 180.541169\nv 188.221724 154.628010 183.747901\nv 188.845389 154.546050 184.687335\nv 187.284920 154.651458 183.936005\nv 187.226565 154.831655 180.543955\nv 187.155444 154.858668 180.068444\nv 186.439976 154.843019 180.862750\nv 187.245124 154.790248 181.335475\nv 186.523443 154.678665 183.951557\nv 185.741894 154.693254 184.008173\nv 187.303589 154.610814 184.694940\nv 183.949290 154.814578 182.453771\nv 184.699205 154.949406 179.521298\nv 185.539386 154.905235 180.072239\nv 197.079321 154.360932 174.621901\nv 194.131897 154.651837 170.423011\nv 195.149053 154.568349 169.987141\nv 194.241791 154.640549 169.933961\nv 193.206824 154.726477 171.312055\nv 196.440233 154.410871 175.195640\nv 195.229873 154.511681 175.926247\nv 192.241773 154.788309 171.257828\nv 192.259583 154.785868 170.315603\nv 191.269760 154.850119 171.635006\nv 194.234255 154.581603 176.304634\nv 193.059906 154.666062 176.539183\nv 190.286377 154.909383 172.599607\nv 190.311148 154.906963 171.225977\nv 189.302978 154.947913 173.461612\nv 188.311487 154.984326 174.031398\nv 188.336274 155.002639 172.760364\nv 187.302213 155.021985 174.160714\nv 188.157778 154.856797 179.203853\nv 186.319139 155.050281 174.205367\nv 187.303839 154.885713 179.242423\nv 183.240524 155.115370 174.442219\nv 184.254121 155.096653 174.431259\nv 183.863545 155.023932 177.554330\nv 194.266798 154.623046 168.961613\nv 191.798070 154.790732 168.223151\nv 190.334989 154.896717 170.184063\nv 187.798989 154.979842 167.256765\nv 188.631395 154.950484 167.306398\nv 189.351606 154.955981 171.148664\nv 186.786763 155.029124 167.826468\nv 185.813196 155.065643 168.624043\nv 188.370259 155.000877 171.912057\nv 187.378768 155.037290 172.481843\nv 184.911202 155.091648 169.047842\nv 184.045178 155.108955 168.968174\nv 186.336228 155.067829 173.019267\nv 185.310585 155.079058 173.894484\nv 184.271210 155.114201 173.245158\nv 184.018830 152.093118 207.277026\nv 183.809656 151.955826 208.155125\nv 185.083801 152.092642 207.140120\nv 186.545594 152.498389 204.254547\nv 186.969130 152.702044 202.851211\nv 185.478090 152.330804 205.558530\nv 184.626274 152.463294 204.836197\nv 185.972723 152.077769 207.065948\nv 185.590191 151.942806 207.986146\nv 186.865243 152.031520 207.171875\nv 187.252887 152.804398 202.096752\nv 186.337206 152.393963 204.972679\nv 187.392953 152.458349 204.330088\nv 187.738589 152.000976 207.138737\nv 187.352459 151.897389 207.878836\nv 188.533229 152.063266 206.514766\nv 188.847313 152.778291 201.801817\nv 188.313899 152.468131 204.003035\nv 189.177686 152.469073 203.730323\nv 189.383547 152.013563 206.536051\nv 189.076122 151.817142 207.866983\nv 190.196944 151.962905 206.578442\nv 190.332220 152.803893 201.036323\nv 190.008544 152.446732 203.571104\nv 190.801379 152.439046 203.314295\nv 191.153299 152.008230 205.962077\nv 190.882795 151.812763 207.271904\nv 191.958521 151.953794 205.978437\nv 191.916246 152.760545 200.626951\nv 191.602116 152.409142 203.157725\nv 192.392544 152.379270 202.991838\nv 192.888989 151.974991 205.393017\nv 192.769618 151.879284 206.070119\nv 193.757893 151.965988 205.020217\nv 193.485675 152.632649 200.711528\nv 193.245063 152.362586 202.662418\nv 194.081821 152.337451 202.381151\nv 194.566806 151.883909 205.097306\nv 194.508998 151.818402 205.561787\nv 195.409829 151.850176 204.833363\nv 195.132649 152.583219 200.032418\nv 194.925046 152.313486 202.036107\nv 195.769484 152.297604 201.616490\nv 196.296653 151.835984 204.368632\nv 196.204734 151.722131 205.174145\nv 197.171717 151.811930 203.949830\nv 196.791187 152.559479 199.040220\nv 196.629148 152.259764 201.282208\nv 197.444629 152.172429 201.299314\nv 198.046339 151.777955 203.536993\nv 197.966180 151.673964 204.296578\nv 198.921681 151.747832 203.078637\nv 198.451916 152.470069 198.355809\nv 198.312149 152.134542 200.879920\nv 199.009427 152.148704 200.231115\nv 199.802815 151.714766 202.572633\nv 199.721937 151.606923 203.377737\nv 200.703646 151.697445 201.910602\nv 201.606204 151.600597 201.737503\nv 201.505629 151.477010 202.698635\nv 205.180124 151.591470 197.891891\nv 205.128681 151.488133 198.724550\nv 206.851515 151.404636 197.120458\nv 205.998748 151.499875 197.547649\nv 206.817573 151.318472 197.828223\nv 207.664600 151.323523 196.604919\nv 208.519313 151.177133 196.455813\nv 209.425315 151.211826 194.742833\nv 210.326170 151.046123 194.578831\nv 210.430157 151.120646 193.732266\nv 214.522057 150.442440 191.412555\nv 213.930321 150.651860 190.754484\nv 213.346129 150.879943 189.879266\nv 182.250795 153.966973 193.443747\nv 184.290477 153.574067 196.808710\nv 184.188996 153.470636 197.696904\nv 183.664690 154.034471 192.665292\nv 183.638738 154.120020 191.854672\nv 183.245148 153.968283 193.353571\nv 184.096155 153.929001 193.606288\nv 185.240674 153.567574 196.704060\nv 185.321467 154.165511 191.093021\nv 185.050296 153.917534 193.533899\nv 185.753842 153.923419 193.313930\nv 186.110662 153.593670 196.301134\nv 186.954574 153.601862 195.992580\nv 187.024552 154.155483 190.659391\nv 186.564564 153.896473 193.330007\nv 187.404003 153.889404 193.122525\nv 187.795476 153.609246 195.646544\nv 187.685011 153.526193 196.442522\nv 188.644114 153.622775 195.188984\nv 188.755841 154.143523 189.985135\nv 188.302059 153.906859 192.592145\nv 189.173305 153.902309 192.251888\nv 189.452887 153.614456 194.895038\nv 189.334684 153.525258 195.802540\nv 190.205688 153.569431 194.963915\nv 190.441567 154.088004 189.618637\nv 190.062785 153.888730 191.915762\nv 190.955860 153.869604 191.597107\nv 191.001702 153.571266 194.491439\nv 190.939470 153.518774 195.036117\nv 191.865424 153.567426 194.018352\nv 192.062073 154.042292 188.948096\nv 192.037262 153.843777 191.133128\nv 192.892562 153.826888 190.690756\nv 192.585600 153.511490 194.082356\nv 192.455660 153.464673 194.627645\nv 193.117214 153.491495 193.911337\nv 193.749580 153.752783 190.764971\nv 194.482318 153.691792 190.820256\nv 193.923866 153.475930 193.449624\nv 193.982487 153.393172 194.229937\nv 194.723694 153.485742 192.718812\nv 195.040984 153.720791 190.007617\nv 195.216915 153.622874 190.856762\nv 195.723852 153.314132 193.540156\nv 196.356443 153.516968 190.868606\nv 197.092179 153.442443 190.888823\nv 196.511316 153.577347 190.064340\nv 198.794595 153.389116 189.488418\nv 199.869128 153.460264 187.134282\nv 200.496902 153.206779 189.243083\nv 199.508589 153.327268 189.243329\nv 200.692981 153.367994 186.985092\nv 200.597454 153.277714 188.256090\nv 202.242447 153.044454 188.442255\nv 201.320756 153.114510 189.093894\nv 202.414493 153.159819 186.728601\nv 201.505629 153.253781 187.127011\nv 202.330172 153.091483 187.708491\nv 203.914899 152.870791 187.625936\nv 203.151312 152.950493 188.043845\nv 204.287958 152.942026 185.914362\nv 203.327959 153.040179 186.581807\nv 204.199036 152.899368 186.642636\nv 205.532402 152.690108 186.676374\nv 204.874898 152.772638 186.958491\nv 206.072454 152.684981 185.485724\nv 205.193521 152.836559 185.409007\nv 206.037967 152.649636 186.051909\nv 207.639671 152.480512 184.432337\nv 206.902965 152.566244 185.140017\nv 208.355730 152.387687 183.819205\nv 209.020418 152.342712 182.372222\nv 208.318020 152.498605 182.058962\nv 209.043386 152.291000 183.228011\nv 183.923871 153.236187 199.519928\nv 184.027325 153.350069 198.644123\nv 183.773256 153.130504 200.347369\nv 182.900174 153.133257 200.427898\nv 185.852927 153.389641 198.011589\nv 185.974121 153.492713 197.191485\nv 184.942462 153.346050 198.541630\nv 185.691256 153.269073 198.958808\nv 186.502369 153.225110 199.123232\nv 188.083499 152.901433 201.123157\nv 187.358395 153.231702 198.823762\nv 188.212806 153.243022 198.474879\nv 188.761956 152.912241 200.821937\nv 189.550132 152.858709 200.951124\nv 189.040215 153.234286 198.230165\nv 189.863806 153.230620 197.932059\nv 190.356582 152.873503 200.486851\nv 191.188895 152.875255 200.103034\nv 190.676750 153.218648 197.647485\nv 191.476310 153.206542 197.352734\nv 191.966472 152.817114 200.157935\nv 192.768686 152.791695 199.929826\nv 192.266822 153.181362 197.113137\nv 193.032198 153.148478 196.935731\nv 193.560538 152.721940 199.959501\nv 194.375722 152.693547 199.676888\nv 193.854329 153.129352 196.557082\nv 194.707594 153.139701 195.874762\nv 195.230844 152.713874 198.968103\nv 196.053541 152.687587 198.586803\nv 195.526881 153.096874 195.609613\nv 196.338816 153.015017 195.670546\nv 196.856958 152.643520 198.303391\nv 197.703113 152.611666 197.862223\nv 197.212040 152.992380 195.103186\nv 198.019494 152.977413 194.510669\nv 198.560426 152.566322 197.461225\nv 198.823797 152.929771 194.121643\nv 199.589215 152.902635 193.573899\nv 201.229213 152.548120 194.831528\nv 202.099421 152.486082 194.322339\nv 202.964636 152.559876 192.536713\nv 202.114170 152.565654 193.573188\nv 203.848537 152.290714 193.797170\nv 202.962055 152.396203 194.043484\nv 204.820279 152.416989 191.180327\nv 203.657608 152.535151 191.751718\nv 204.139475 152.357613 192.722942\nv 205.882818 152.072668 192.833941\nv 205.011208 152.172552 193.225779\nv 206.615818 152.153758 190.768725\nv 205.550386 152.300535 191.130572\nv 206.367577 152.092674 191.789703\nv 208.031811 151.966138 190.053395\nv 207.355039 152.031467 190.685245\nv 208.109781 151.880569 190.796005\nv 209.537612 151.659376 190.271339\nv 208.790099 151.755772 190.805066\nv 208.755044 151.902097 189.273045\nv 209.511204 151.801390 188.727528\nv 209.542713 151.714533 189.618638\nv 210.293773 151.558669 189.725822\nv 210.290633 151.716580 187.871246\nv 211.093468 151.582557 187.450133\nv 207.543712 152.901915 173.102383\nv 199.757097 153.974391 178.282242\nv 204.322381 153.425744 169.250952\nv 203.636686 153.536292 169.282476\nv 201.421921 153.831458 168.148672\nv 202.163871 153.774596 171.196125\nv 201.372087 153.878692 171.227524\nv 199.590279 154.091941 169.765649\nv 198.838818 154.169962 168.246031\nv 199.823615 154.033619 167.534897\nv 197.536468 154.334384 171.338969\nv 196.034152 154.484215 170.015615\nv 196.225892 154.465094 169.348550\nv 195.569631 154.512327 168.723508\nv 183.580180 154.249792 190.451581\nv 184.373049 154.512857 187.088744\nv 184.503881 154.241576 190.393434\nv 185.300235 154.494692 187.065628\nv 185.361555 154.240799 190.189684\nv 186.265939 154.223934 190.128635\nv 186.045652 154.478064 187.014493\nv 186.540924 154.465094 186.990453\nv 187.111350 154.214682 189.898754\nv 187.945947 154.183511 189.927767\nv 189.325952 154.487299 185.211329\nv 187.473928 154.446430 186.789879\nv 188.702230 154.416562 186.545768\nv 188.831824 154.180802 189.483392\nv 189.721583 154.179544 188.984393\nv 190.443242 154.459557 184.732439\nv 190.521431 154.126734 189.062270\nv 191.231390 154.107639 188.797842\nv 192.940645 154.227804 185.720614\nv 193.913115 154.086937 186.628601\nv 193.865326 154.148295 185.799889\nv 193.885053 154.206629 184.982811\nv 194.857523 154.065762 185.890798\nv 195.798076 153.973173 185.990331\nv 195.750286 154.034531 185.161618\nv 196.088612 154.059215 184.378577\nv 197.507747 153.849606 185.412807\nv 196.772298 153.880243 186.070384\nv 197.577008 153.952355 183.729450\nv 196.764930 153.990686 184.420977\nv 197.502917 153.903612 184.569625\nv 199.111397 153.760155 184.111365\nv 198.319825 153.811275 184.721281\nv 199.089646 153.876668 182.236585\nv 198.296794 153.929768 182.871065\nv 199.107847 153.812182 183.243619\nv 200.681583 153.639964 182.963446\nv 199.904249 153.707055 183.476885\nv 200.742500 153.735257 181.081871\nv 199.974508 153.811470 181.472216\nv 200.668691 153.682868 182.218794\nv 202.009823 153.501195 182.356561\nv 201.449575 153.563750 182.573101\nv 202.059790 153.573131 180.828863\nv 201.432921 153.647242 181.062240\nv 202.063552 153.532543 181.595072\nv 203.280883 153.351065 181.808024\nv 202.636692 153.427084 182.123184\nv 203.402576 153.396823 180.449324\nv 202.720820 153.477088 180.881662\nv 203.372176 153.378166 180.929357\nv 204.780674 153.186213 180.435125\nv 203.962639 153.270800 181.375686\nv 204.793407 153.239684 179.100503\nv 204.058170 153.331098 179.713237\nv 204.789169 153.206487 179.884285\nv 206.282215 153.038640 177.750184\nv 205.474603 153.159745 178.269405\nv 208.149081 152.751554 175.659733\nv 208.289701 152.707058 176.532537\nv 210.108762 152.395748 173.224131\nv 210.991680 152.201459 173.406314\nv 212.694091 151.797627 169.938864\nv 212.662303 151.813089 170.705773\nv 213.315591 151.666141 171.340415\nv 213.401740 151.624241 169.815497\nv 184.721858 150.817877 214.169671\nv 184.740736 149.971183 218.169189\nv 184.030754 149.723819 219.347483\nv 185.898178 150.000611 217.878002\nv 185.647507 150.772870 214.246759\nv 185.900459 150.931868 213.442015\nv 185.553951 150.637344 214.911064\nv 186.431970 150.397703 215.918554\nv 186.986278 150.005519 217.674463\nv 186.500117 149.803063 218.703510\nv 187.930785 149.921350 217.883310\nv 187.922246 150.909348 213.168322\nv 187.350002 150.442712 215.518354\nv 188.260662 150.386278 215.595587\nv 188.838437 149.909005 217.727903\nv 188.495868 149.795627 218.344565\nv 189.579296 149.923598 217.466949\nv 189.767290 150.892421 212.759430\nv 189.202758 150.411588 215.224283\nv 190.245997 150.479376 214.614723\nv 190.656165 149.909541 217.208552\nv 190.480389 149.769225 217.930761\nv 191.729444 149.885845 216.979264\nv 191.686361 150.917778 211.948501\nv 191.185395 150.399403 214.687869\nv 192.154176 150.384685 214.422421\nv 193.038149 149.856603 216.610121\nv 192.865962 149.725927 217.303220\nv 194.037389 149.844477 216.278320\nv 193.565537 150.876889 211.395004\nv 193.176843 150.426494 213.812266\nv 194.121305 150.402032 213.539782\nv 194.631658 149.808539 216.184082\nv 194.768936 149.660746 216.839839\nv 195.452740 149.702588 216.329461\nv 195.366638 150.777259 211.064898\nv 195.035702 150.366941 213.283688\nv 196.014975 150.383675 212.716892\nv 196.398841 149.657866 216.065499\nv 196.309306 149.580085 216.481638\nv 197.375097 149.688251 215.413345\nv 197.219847 150.738651 210.235647\nv 196.959101 150.356157 212.343158\nv 197.828229 150.236492 212.457428\nv 198.351061 149.687487 214.864063\nv 198.231371 149.534599 215.668394\nv 199.312147 149.667975 214.388490\nv 199.091104 150.731611 209.049369\nv 198.778485 150.204485 212.033128\nv 199.740962 150.250321 211.184307\nv 200.293090 149.606154 214.054260\nv 200.188279 149.472015 214.784882\nv 201.301449 149.582755 213.489972\nv 200.699106 150.220768 210.668347\nv 201.628235 150.154373 210.355256\nv 202.266744 149.507314 213.162256\nv 202.134518 149.334754 214.122936\nv 203.229127 149.379593 213.084970\nv 202.582449 150.065899 210.066501\nv 203.532694 150.053421 209.347093\nv 204.207029 149.274671 212.809281\nv 204.077715 149.154391 213.519530\nv 205.156070 149.132223 212.744061\nv 204.465935 149.985643 208.892672\nv 205.355275 149.833331 208.920519\nv 206.182471 149.055208 212.211600\nv 206.082018 148.972454 212.711380\nv 207.127531 149.081598 211.196363\nv 207.313036 150.052862 205.731939\nv 206.429875 150.214455 205.701115\nv 206.270717 149.792452 208.257295\nv 207.214376 149.780959 207.380968\nv 208.089774 149.085032 210.217448\nv 208.984513 149.101577 209.188662\nv 208.130483 149.699093 206.847998\nv 209.031272 149.540095 206.740238\nv 208.161171 149.778145 206.375223\nv 212.834647 149.011964 204.966019\nv 184.677114 149.240616 221.326628\nv 185.626558 149.180908 221.449624\nv 186.730911 149.214510 221.150988\nv 187.304661 148.620967 223.498819\nv 188.269815 148.665342 223.132652\nv 187.849657 149.299077 220.580457\nv 188.874436 149.312226 220.308772\nv 189.136576 148.651104 223.003923\nv 190.042507 148.601456 222.992920\nv 189.821448 149.278729 220.205574\nv 190.821461 149.261483 220.002553\nv 190.986557 148.577946 222.820680\nv 191.889728 148.515114 222.818000\nv 191.825482 149.243032 219.760925\nv 192.859588 149.223916 219.489521\nv 192.872658 148.543096 222.364045\nv 193.876038 148.575218 221.870526\nv 193.987640 149.202623 219.142397\nv 194.681137 149.184988 218.941919\nv 194.737073 148.471760 221.933873\nv 195.338269 148.450223 221.775617\nv 195.518015 149.158108 218.684224\nv 196.722497 149.117034 218.313485\nv 196.180919 148.476910 221.292993\nv 198.026540 148.395630 220.735564\nv 197.911946 149.072613 217.885264\nv 198.975244 149.057555 217.376717\nv 199.441880 148.249540 220.592539\nv 198.922868 148.287950 220.715939\nv 199.960541 148.011906 221.280552\nv 200.442628 148.167270 220.360650\nv 199.986520 148.964474 217.182895\nv 200.931407 148.856946 217.084866\nv 200.957580 148.122870 220.236711\nv 201.758843 147.877456 220.760538\nv 201.755134 148.070689 219.948586\nv 201.800486 148.903087 216.304619\nv 202.754881 148.867474 215.815318\nv 203.654573 148.728234 215.776641\nv 204.608969 148.627236 215.513496\nv 207.449951 148.324910 214.498483\nv 206.520623 148.371961 215.102943\nv 207.249733 148.145901 215.486314\nv 205.533698 148.476960 215.446805\nv 208.729425 148.421178 212.855146\nv 208.220516 148.245246 214.167280\nv 209.130687 148.163675 213.662279\nv 210.015570 148.659587 210.371981\nv 209.885495 148.928627 209.102632\nv 209.598142 148.193211 213.064719\nv 212.670521 148.410752 208.561405\nv 213.422584 148.227950 208.583564\nv 213.317649 148.401013 207.795326\nv 214.069462 147.291910 212.394747\nv 215.037337 147.186180 211.730051\nv 214.132644 148.363984 206.906542\nv 213.858960 147.968325 209.320494\nv 184.220563 151.491518 210.659536\nv 183.417720 151.510120 210.625333\nv 185.037973 151.467082 210.675334\nv 186.023771 151.485539 210.433113\nv 186.441510 151.035898 212.799894\nv 187.271066 151.082062 212.380116\nv 186.937666 151.538758 209.952994\nv 187.847292 151.539885 209.747526\nv 188.207807 151.081076 212.169773\nv 189.055594 151.047079 212.133874\nv 188.734749 151.531868 209.549062\nv 189.624227 151.515322 209.383469\nv 189.963896 151.031138 211.935324\nv 190.823124 150.990301 211.881912\nv 190.517633 151.500234 209.161213\nv 191.432762 151.502817 208.818740\nv 191.833893 151.031600 211.269534\nv 192.777303 151.034935 210.877396\nv 192.339903 151.484361 208.547100\nv 193.173993 151.410249 208.601949\nv 193.645710 150.952748 210.936277\nv 194.551687 150.924851 210.667165\nv 194.080700 151.397520 208.231630\nv 195.011110 151.418810 207.646308\nv 195.484381 150.907408 210.278178\nv 196.389960 150.878961 209.947888\nv 195.854123 151.336193 207.645073\nv 196.772013 151.327111 207.155000\nv 197.310475 150.857797 209.507624\nv 198.220821 150.836393 209.056851\nv 197.771844 151.392765 206.132682\nv 198.641108 151.346924 205.817318\nv 199.472154 151.228319 205.902905\nv 200.337602 151.173917 205.572573\nv 201.213639 151.062835 205.521015\nv 202.110018 150.961984 205.376263\nv 203.045340 150.918846 204.791852\nv 203.982478 150.871567 204.198940\nv 204.897249 150.794288 203.751499\nv 205.807748 150.708925 203.324180\nv 206.603567 150.478699 203.881204\nv 206.536742 150.372168 204.627052\nv 206.703521 150.611870 202.932176\nv 207.575171 150.482180 202.746604\nv 203.717820 126.183729 225.273858\nv 211.513472 132.516970 174.379887\nv 149.149151 131.967549 176.681951\nv 148.531304 131.513852 164.710642\nv 144.426115 146.414233 161.487465\nv 144.426115 145.128240 161.260708\nv 143.761597 145.961523 161.407635\nv 144.909809 147.018160 161.593950\nv 145.574327 146.184876 161.447023\nv 218.761597 145.961523 161.407635\nv 217.881625 145.301257 161.291209\nv 217.881625 146.587250 161.517966\nv 145.284860 144.919388 161.223889\nv 145.810638 145.358721 161.301352\nv 146.004866 144.697160 161.184703\nv 144.620342 144.466678 161.144059\nv 145.418409 143.495488 160.972819\nv 210.901278 148.011723 161.769138\nv 211.786821 147.974466 161.762576\nv 211.452244 147.173715 161.621383\nv 209.509494 145.227006 161.278123\nv 205.245951 137.908109 159.987632\nv 204.449196 138.309979 160.058479\nv 205.165408 138.880931 160.159164\nv 204.929495 146.221973 161.453553\nv 205.603768 147.163089 161.619508\nv 205.797797 146.192937 161.448449\nv 204.101678 135.607719 159.581996\nv 195.140072 150.736434 162.249565\nv 196.041698 150.118193 162.140557\nv 195.217966 149.667975 162.061181\nv 194.345648 151.204232 162.332060\nv 195.169380 151.654450 162.411436\nv 196.870796 149.859437 162.094955\nv 198.164620 152.157028 162.500095\nv 198.284002 151.258380 162.341642\nv 198.985730 151.076679 162.309603\nv 198.323728 150.487439 162.205698\nv 200.359083 153.191569 162.682477\nv 200.964407 150.172626 162.150178\nv 201.013531 151.106495 162.314848\nv 201.707294 150.494935 162.207025\nv 162.576312 151.113781 162.316155\nv 163.204868 150.406257 162.191394\nv 165.126549 150.180289 162.151537\nv 165.993161 150.677288 162.239154\nv 167.340246 135.803041 159.616444\nv 202.471562 148.914431 161.928318\nv 202.316839 147.881143 161.746116\nv 192.326030 137.705520 159.951877\nv 191.865890 136.961910 159.820756\nv 191.503043 137.773886 159.963932\nv 169.369360 138.265042 160.050556\nv 170.137382 137.760869 159.961635\nv 169.260609 137.302567 159.880848\nv 146.146684 143.855574 161.036312\nv 151.322575 133.799926 159.263209\nv 147.028463 149.866084 162.096124\nv 146.048700 149.577586 162.045249\nv 153.658164 146.731151 161.543371\nv 161.414801 139.258246 160.225672\nv 161.028552 137.774744 159.964098\nv 190.600220 148.985051 161.940762\nv 191.426991 149.094165 161.960012\nv 191.089838 148.237794 161.809006\nv 182.125469 140.755536 160.489693\nv 182.539872 139.827908 160.326128\nv 181.665713 140.047257 160.364804\nv 182.045388 137.485115 159.913032\nv 181.604702 138.322954 160.060764\nv 179.914567 138.680212 160.123751\nv 180.785104 138.472019 160.087046\nv 180.258750 137.734471 159.956993\nv 173.487947 150.901091 162.278628\nv 173.368205 149.932715 162.107878\nv 172.759117 151.693384 162.418324\nv 173.657528 151.992261 162.471034\nv 218.761597 129.384535 233.852194\nv 218.761597 129.086777 234.589204\nv 218.761597 130.380434 234.817311\nv 218.761597 130.345918 233.852737\nv 218.761597 130.992747 233.966790\nv 218.761597 140.340100 161.148278\nv 218.761597 141.626094 161.375035\nv 218.761597 140.277964 162.212033\nv 218.761597 139.469419 161.337604\nv 218.761597 132.599179 164.181054\nv 218.761597 132.814139 165.063971\nv 218.761597 131.856000 164.962948\nv 218.761597 133.209972 163.627870\nv 218.761597 133.229647 165.810864\nv 218.761597 133.972827 165.028970\nv 218.761597 149.007229 164.411350\nv 218.761597 149.392140 169.064942\nv 218.761597 149.421994 170.322037\nv 218.761597 146.017381 171.226180\nv 218.761597 145.810219 171.981401\nv 218.761597 145.111672 171.340970\nv 218.761597 146.842904 171.031567\nv 218.761597 145.553102 172.976607\nv 218.761597 145.088398 173.755871\nv 218.761597 126.986105 223.153745\nv 218.761597 126.484841 222.322744\nv 218.761597 136.547018 229.674987\nv 218.761597 135.853501 230.208734\nv 218.761597 123.262477 222.463624\nv 218.761597 122.920576 223.413724\nv 218.761597 129.398952 223.640320\nv 218.761597 143.404910 179.288102\nv 218.761597 142.506110 179.150492\nv 218.761597 132.613379 181.897246\nv 218.761597 133.298464 182.116324\nv 218.761597 132.567110 182.546165\nv 218.761597 133.724752 183.347346\nv 218.761597 134.024496 182.572856\nv 218.761597 134.497052 183.154960\nv 218.755509 130.365464 184.534230\nv 218.760838 131.295818 184.497608\nv 218.756220 130.751949 185.365277\nv 218.755761 130.427153 183.582356\nv 218.761597 146.432779 186.944310\nv 218.761597 137.468651 187.931249\nv 218.761597 132.753778 187.899893\nv 218.761597 131.861497 187.537088\nv 218.761597 133.341361 187.082535\nv 218.761597 146.864667 189.457694\nv 218.761597 145.990309 188.827315\nv 218.761597 132.727095 189.596100\nv 218.761597 144.876562 194.219960\nv 218.761597 145.588584 194.790832\nv 218.761597 144.753153 195.103177\nv 218.761597 146.177337 196.284411\nv 218.761597 146.352876 195.358545\nv 218.761597 132.227462 193.690767\nv 218.761597 132.934402 196.443387\nv 218.761597 132.264440 195.581478\nv 218.761597 133.190300 195.451760\nv 218.761597 137.173766 223.698924\nv 218.761597 128.120938 211.803513\nv 218.761597 127.936902 212.674888\nv 218.761597 130.508742 212.570562\nv 218.761597 131.393638 212.252258\nv 218.761597 140.627304 214.884630\nv 218.761597 140.077776 215.399140\nv 218.761597 128.016899 215.181635\nv 218.761597 128.019867 215.986874\nv 218.761597 127.321252 215.581257\nv 218.761597 135.337042 197.180012\nv 218.761597 134.757250 196.329585\nv 218.761597 131.645812 197.659753\nv 218.761597 132.646358 197.356989\nv 218.761597 132.283627 198.443637\nv 218.761597 143.931985 199.951335\nv 218.761597 131.274835 199.852877\nv 218.761597 131.990324 199.265581\nv 218.761597 146.847752 204.094799\nv 218.761597 143.467632 204.374296\nv 218.761597 143.886334 204.988714\nv 218.761597 143.028301 204.949669\nv 218.761597 131.716253 204.419332\nv 218.761597 141.096171 211.927781\nv 218.761597 141.152469 212.700705\nv 145.090602 132.755678 235.236118\nv 144.376834 132.997457 235.278758\nv 144.475365 132.079139 235.116829\nv 144.376834 133.644285 235.392812\nv 217.138723 128.461287 234.478894\nv 218.043681 129.039299 234.580824\nv 143.761597 135.555059 235.729737\nv 144.390235 135.219308 235.670538\nv 144.390235 135.866136 235.784591\nv 147.529799 133.461960 235.360654\nv 145.661157 138.783262 236.298947\nv 210.895656 125.965134 234.038749\nv 210.197260 125.506567 233.957892\nv 210.926581 125.122028 233.890096\nv 216.103361 139.019807 236.340630\nv 207.911753 128.024295 234.401832\nv 209.074341 132.736810 235.232758\nv 209.314362 131.814984 235.070217\nv 155.936067 126.460640 234.126111\nv 156.788094 126.509137 234.134672\nv 156.292136 127.306511 234.275258\nv 209.142601 140.216541 236.551640\nv 208.501385 139.687764 236.458424\nv 209.126086 139.386326 236.405252\nv 207.300221 136.943916 235.974600\nv 206.510535 137.810472 236.127394\nv 206.450625 136.892747 235.965576\nv 159.477454 128.109913 234.416906\nv 160.324994 128.531154 234.491169\nv 158.666621 126.567904 234.145022\nv 161.845678 127.858538 234.372570\nv 162.110820 126.799376 234.185816\nv 163.519291 130.127515 234.772658\nv 162.956926 130.749946 234.882411\nv 162.758868 129.900610 234.732646\nv 162.101113 139.062765 236.348177\nv 162.434169 139.970364 236.508206\nv 164.706251 128.726994 234.525729\nv 165.291508 127.967519 234.391815\nv 165.600789 128.879837 234.552682\nv 164.973512 127.034650 234.227328\nv 165.317230 142.911793 237.026875\nv 165.555140 141.915426 236.851195\nv 166.503215 142.801927 237.007517\nv 167.895616 130.332131 234.808760\nv 167.495405 129.257619 234.619285\nv 168.519138 129.531707 234.667616\nv 167.646286 137.314109 236.039874\nv 168.271852 137.608443 236.091777\nv 172.019328 129.524040 234.666261\nv 171.550575 130.312964 234.805367\nv 174.124376 128.511308 234.487703\nv 174.979896 128.912742 234.558488\nv 174.301043 129.566266 234.673718\nv 173.280367 128.195207 234.431956\nv 173.959219 127.541683 234.316726\nv 175.010500 141.356553 236.752663\nv 174.527888 140.379528 236.580392\nv 183.692178 127.635106 234.333232\nv 182.909034 127.846824 234.370564\nv 198.987434 131.953294 235.094607\nv 198.265506 131.666223 235.043998\nv 197.956793 140.932166 236.677844\nv 197.051998 141.060777 236.700514\nv 198.848484 140.826416 236.659188\nv 192.851978 141.504458 236.778738\nv 193.345123 142.061778 236.877006\nv 191.220985 139.671774 236.455561\nv 190.605931 140.032282 236.519126\nv 143.761597 134.261403 235.501630\nv 143.761597 135.125698 234.998140\nv 143.761597 134.478870 234.884086\nv 143.761597 132.691693 233.790837\nv 143.761597 132.099471 234.418516\nv 143.761597 145.316613 162.039716\nv 143.761597 144.492708 162.066487\nv 143.761597 141.259651 161.457181\nv 143.761597 140.817549 160.500607\nv 143.761597 139.973657 161.230423\nv 143.761597 141.516314 162.371842\nv 143.761597 130.768623 166.936705\nv 143.761597 130.695224 165.894407\nv 143.761597 142.691070 168.775102\nv 143.761597 143.395419 168.382463\nv 143.761597 142.850146 167.850968\nv 143.761597 132.124064 228.900465\nv 143.761597 132.988224 228.545824\nv 143.761597 123.515446 224.200436\nv 143.761597 124.106407 224.816774\nv 143.761597 124.482754 223.955048\nv 143.761597 134.276371 176.564876\nv 143.761597 133.612061 176.128643\nv 143.761597 134.472415 177.403027\nv 143.761597 135.176943 176.949631\nv 143.761597 149.463433 174.359465\nv 143.761597 145.531230 170.728538\nv 143.761597 145.826828 169.875495\nv 143.761597 145.977420 171.400240\nv 143.761597 146.130725 172.357168\nv 143.761597 134.335579 168.344424\nv 143.761597 133.492744 168.798833\nv 143.761597 146.060269 178.636960\nv 143.761597 145.089309 178.659866\nv 143.761597 145.756384 179.564081\nv 143.761597 135.410389 183.978813\nv 143.761597 135.968364 184.775891\nv 143.761597 136.295879 183.954875\nv 143.761597 132.400481 185.583021\nv 143.761597 132.471986 184.699844\nv 143.761597 131.583425 185.164428\nv 143.761597 132.242202 186.330466\nv 143.761597 135.910073 188.920504\nv 143.761597 134.994636 188.890912\nv 143.761597 135.475450 189.718028\nv 143.761597 132.111480 188.838049\nv 143.761597 131.786632 189.740213\nv 143.761597 144.958185 192.768545\nv 143.761597 145.224330 191.820708\nv 143.761597 144.309252 192.078538\nv 143.761597 146.050039 191.578954\nv 143.761597 145.401106 190.888947\nv 143.761597 134.007160 192.050143\nv 143.761597 133.105510 192.006435\nv 143.761597 132.107327 194.794418\nv 143.761597 125.463480 223.902842\nv 143.761597 125.804176 224.560571\nv 143.761597 138.315402 222.350319\nv 143.761597 139.011039 222.939002\nv 143.761597 137.965746 217.797916\nv 143.761597 137.131775 217.283399\nv 143.761597 143.481583 217.455501\nv 143.761597 144.193944 216.863740\nv 143.761597 141.230397 216.357848\nv 143.761597 140.516812 215.809724\nv 143.761597 141.175426 217.248712\nv 143.761597 141.999762 216.874623\nv 143.761597 143.530283 200.913800\nv 143.761597 143.805053 200.206545\nv 143.761597 132.878972 198.803871\nv 143.761597 133.317938 198.006287\nv 143.761597 133.697987 197.274588\nv 143.761597 134.227806 198.060062\nv 143.761597 132.829039 194.878583\nv 143.761597 131.553505 211.305170\nv 143.761597 131.353880 212.356073\nv 143.761597 140.919603 211.618565\nv 143.761597 141.359194 212.392023\nv 143.761597 142.911345 211.639051\nv 143.761597 142.207199 212.074276\nv 143.761597 143.746557 206.266452\nv 143.761597 143.033359 205.593736\nv 143.761597 131.010782 205.638340\nv 213.039183 132.074253 176.316091\nv 171.426069 135.779737 175.288226\nv 171.315251 135.790125 174.385942\nv 171.200540 126.924644 229.013800\nv 144.553600 136.237997 159.693121\nv 215.399642 132.108006 158.964884\nv 214.926479 131.250818 158.813749\nv 215.672402 133.639676 159.234966\nv 214.704850 133.739567 159.252589\nv 215.459719 134.662961 159.415387\nv 213.838022 133.981638 159.295258\nv 214.050706 132.958353 159.114837\nv 146.004051 134.826710 159.444287\nv 146.827877 135.102189 159.492860\nv 147.974755 133.514481 159.212905\nv 147.438421 134.306973 159.352641\nv 148.725200 133.679142 159.241941\nv 145.901149 133.777453 159.259275\nv 212.387798 132.475601 159.029718\nv 213.113942 132.257263 158.991206\nv 212.413584 133.575866 159.223713\nv 211.617504 132.851044 159.095925\nv 214.294080 139.142758 160.205298\nv 215.078059 139.275754 160.228760\nv 215.966969 139.190056 160.213655\nv 215.384176 145.959415 161.407274\nv 216.299884 146.420624 161.488589\nv 215.716493 149.613029 162.051517\nv 216.631239 149.336818 162.002792\nv 217.849976 148.977933 161.939506\nv 211.681331 134.874347 159.452684\nv 212.299926 134.384210 159.366245\nv 214.669830 149.897592 162.101703\nv 211.813133 144.800271 161.202883\nv 210.987215 144.959130 161.230894\nv 211.317353 144.119051 161.082764\nv 210.420091 137.935311 159.992408\nv 211.318879 138.335704 160.063022\nv 211.154661 137.358459 159.890705\nv 209.560692 137.508868 159.917217\nv 211.024849 146.425661 161.489479\nv 210.768457 145.702522 161.361971\nv 208.425554 139.607448 160.287261\nv 208.164998 140.394773 160.426078\nv 208.993885 140.485118 160.442006\nv 207.895970 141.436426 160.609751\nv 207.327638 140.558756 160.455006\nv 205.752887 141.178202 160.564235\nv 206.340732 141.801613 160.674159\nv 206.470765 140.976999 160.528755\nv 208.940015 147.879653 161.745852\nv 208.320277 148.952045 161.934962\nv 209.925348 148.050679 161.776006\nv 210.259924 148.851429 161.917198\nv 204.309376 140.287006 160.407072\nv 206.315223 149.090380 161.959352\nv 205.877177 150.082339 162.134243\nv 194.688611 138.001620 160.004096\nv 195.695106 138.586531 160.107246\nv 195.614587 137.545481 159.923684\nv 194.695054 147.587816 161.694382\nv 194.675393 146.589914 161.518426\nv 193.812224 147.269895 161.638330\nv 196.521859 139.182020 160.212259\nv 197.274341 139.950121 160.347673\nv 197.105732 141.790037 160.672107\nv 197.159676 140.817385 160.500606\nv 196.462962 137.135908 159.851480\nv 197.875549 148.107454 161.786051\nv 198.393108 147.331849 161.649282\nv 198.011381 140.533857 160.450596\nv 198.688897 141.184244 160.565285\nv 197.262498 137.463415 159.909208\nv 197.104377 136.468932 159.733854\nv 197.583556 135.782222 159.612741\nv 198.696550 136.428181 159.726670\nv 198.376193 135.413964 159.547828\nv 199.880092 146.611084 161.522190\nv 200.330323 147.453487 161.670720\nv 163.061651 135.267181 159.521958\nv 164.273826 135.437575 159.552022\nv 162.403395 146.698850 161.537666\nv 164.726666 139.844697 160.329122\nv 165.642436 139.498467 160.268066\nv 164.129165 147.667563 161.708505\nv 163.258320 147.185990 161.623576\nv 164.995344 148.091355 161.783210\nv 167.063038 141.636251 160.645012\nv 167.187415 140.722308 160.483859\nv 166.844149 143.376440 160.951849\nv 166.937077 142.471129 160.792221\nv 165.784289 138.582094 160.106485\nv 165.014816 137.803690 159.969236\nv 201.857338 140.337359 160.415925\nv 201.112544 139.694949 160.302668\nv 200.421492 137.351203 159.889421\nv 201.197481 137.899366 159.986059\nv 192.687551 138.381635 160.071099\nv 192.267977 149.149876 161.969838\nv 193.225614 149.110320 161.962853\nv 191.109716 138.639554 160.116583\nv 190.649577 137.895945 159.985462\nv 191.778359 149.897133 162.101594\nv 169.997375 148.268878 161.814509\nv 168.665062 141.892671 160.690208\nv 167.815416 142.155872 160.736635\nv 170.031589 143.225243 160.925157\nv 168.234085 150.952849 162.287754\nv 167.565684 151.785667 162.434593\nv 168.516564 137.086424 159.842750\nv 167.815992 136.463371 159.732885\nv 167.792014 137.183687 159.859904\nv 166.641828 151.359637 162.359473\nv 149.235201 135.683619 159.595375\nv 149.193219 136.827600 159.797084\nv 149.938289 136.033110 159.656984\nv 149.224855 137.830423 159.973911\nv 149.865193 138.042573 160.011305\nv 150.517750 138.578844 160.105867\nv 152.827391 134.500590 159.386773\nv 153.304897 135.202270 159.510508\nv 150.953423 146.773789 161.550865\nv 150.034241 146.785959 161.553025\nv 153.510367 136.971180 159.822426\nv 153.539219 137.943800 159.993923\nv 154.253061 137.432796 159.903826\nv 153.988796 135.497742 159.562618\nv 153.540311 136.164705 159.680218\nv 155.002700 135.849443 159.624643\nv 155.627515 136.237865 159.693136\nv 154.849025 136.848599 159.800821\nv 152.582405 145.273021 161.286256\nv 151.680971 145.276920 161.286929\nv 152.952831 149.841443 162.091799\nv 152.493508 149.070722 161.955875\nv 156.394723 134.283906 159.348605\nv 154.374311 149.148723 161.969626\nv 153.788834 149.960512 162.112774\nv 154.776585 150.015004 162.122363\nv 155.397344 151.894154 162.453713\nv 154.997121 150.990427 162.294369\nv 159.546358 137.143827 159.852866\nv 156.553107 151.348855 162.357585\nv 157.241336 150.750199 162.252031\nv 159.765098 142.615878 160.817727\nv 160.679351 142.472793 160.792501\nv 158.017464 151.209958 162.333101\nv 160.700308 138.566794 160.103759\nv 160.132885 137.920865 159.989874\nv 159.949775 146.087405 161.429837\nv 159.542784 150.617569 162.228626\nv 190.579694 142.992375 160.884096\nv 189.598461 148.826735 161.912846\nv 190.084358 147.394286 161.660268\nv 190.737494 147.483344 161.675979\nv 188.983753 139.757734 160.313754\nv 189.939502 139.649806 160.294729\nv 189.300502 138.869541 160.157138\nv 188.819297 148.446315 161.845773\nv 189.483902 147.748259 161.722682\nv 188.988957 152.337860 162.531951\nv 189.855419 152.298568 162.525017\nv 189.287770 151.495425 162.383402\nv 188.758070 153.200542 162.684068\nv 186.200260 140.353804 160.418840\nv 186.878483 141.104087 160.551142\nv 187.141098 140.077218 160.370072\nv 186.496839 148.576778 161.868782\nv 186.444310 149.513056 162.033870\nv 187.180421 149.112160 161.963185\nv 186.469705 147.701758 161.714491\nv 188.030874 149.786615 162.082105\nv 187.774600 150.791577 162.259305\nv 188.677582 150.529754 162.213137\nv 184.377479 140.942792 160.522711\nv 185.327216 140.660514 160.472933\nv 186.301295 143.942764 161.051676\nv 186.136335 151.175529 162.327010\nv 185.114743 151.050201 162.304913\nv 185.521978 151.777288 162.433119\nv 183.518899 141.240708 160.575241\nv 183.858207 140.238271 160.398486\nv 184.969305 150.225637 162.159518\nv 185.813219 152.608801 162.579738\nv 184.791626 152.483472 162.557641\nv 182.590296 141.463714 160.614562\nv 183.109568 142.168235 160.738786\nv 183.200832 148.876459 161.921618\nv 183.259172 149.736320 162.073233\nv 182.244480 148.425376 161.842076\nv 183.136477 147.832027 161.737459\nv 182.781940 143.072240 160.898185\nv 183.710543 142.849234 160.858864\nv 181.900986 143.299325 160.938227\nv 180.790682 141.996612 160.708522\nv 181.255510 142.704789 160.833391\nv 181.716138 141.683063 160.653238\nv 180.975530 143.612874 160.993512\nv 180.636855 151.842053 162.444527\nv 181.586050 152.128619 162.495053\nv 181.521854 151.051831 162.305188\nv 182.751672 152.257059 162.517703\nv 181.866673 153.047281 162.657043\nv 179.896873 142.234900 160.750533\nv 179.674131 148.497152 161.854729\nv 178.892503 149.022730 161.947399\nv 179.691539 149.392494 162.012601\nv 180.353704 147.956453 161.759392\nv 179.554668 147.586688 161.694190\nv 179.793702 152.335886 162.531598\nv 178.929835 142.488659 160.795276\nv 179.363016 143.272097 160.933418\nv 178.160140 147.637098 161.703079\nv 178.852401 147.372069 161.656344\nv 178.136313 149.433969 162.019914\nv 178.522544 138.220317 160.042646\nv 178.167079 139.168346 160.209811\nv 179.032746 138.890693 160.160864\nv 177.920804 137.771466 159.963503\nv 179.070486 140.645093 160.470210\nv 178.483547 141.640477 160.645709\nv 177.172531 139.357505 160.243167\nv 176.773061 138.616433 160.112495\nv 176.288716 139.475968 160.264069\nv 176.258774 137.964004 159.997470\nv 177.142590 137.845541 159.976568\nv 175.141045 151.363651 162.360186\nv 174.973912 148.630476 161.878257\nv 174.971224 147.662711 161.707600\nv 174.144185 148.295451 161.819181\nv 175.030144 146.719969 161.541371\nv 175.859870 147.054994 161.600447\nv 173.297676 147.950071 161.758266\nv 174.452693 141.853044 160.683216\nv 173.300364 148.917837 161.928922\nv 172.521695 149.587335 162.046962\nv 172.509486 141.023468 160.536948\nv 172.428000 140.133823 160.380067\nv 171.944701 152.221101 162.511382\nv 171.775121 151.129931 162.318976\nv 171.980824 153.025726 162.653256\nv 218.761178 125.698672 231.344328\nv 218.760661 125.311319 231.986329\nv 218.761185 127.061815 231.763946\nv 218.761136 126.427021 231.135289\nv 218.761548 127.258053 230.952560\nv 218.761542 125.894910 230.532943\nv 218.761590 125.206207 230.018202\nv 218.761548 125.934556 229.809163\nv 218.761597 135.377143 232.873212\nv 218.761597 135.510004 233.735748\nv 218.761597 122.719677 229.237681\nv 218.761597 123.702931 229.079937\nv 218.761597 124.814078 227.870564\nv 218.761597 125.461074 228.489300\nv 218.761597 124.598856 228.675686\nv 218.761597 132.987797 229.279545\nv 218.761597 133.899039 229.610640\nv 218.761597 133.255087 230.237658\nv 218.761597 136.094887 232.234830\nv 218.761597 135.228261 231.886899\nv 218.761597 137.166384 232.634814\nv 218.761597 137.212066 160.663294\nv 218.761597 138.498059 160.890051\nv 218.761597 135.849602 163.511170\nv 218.761597 147.185809 165.265160\nv 218.761597 146.415313 164.931063\nv 218.761597 145.693904 164.314004\nv 218.761597 146.111013 163.614035\nv 218.761597 133.949743 166.490737\nv 218.761597 132.791056 166.525737\nv 218.761597 146.806127 166.953572\nv 218.761597 147.498664 167.571777\nv 218.761597 146.538267 167.864711\nv 218.761597 133.399781 167.943943\nv 218.761597 132.478295 168.798368\nv 218.761597 133.235544 169.568715\nv 218.761597 143.275363 170.083617\nv 218.761597 137.167925 170.085221\nv 218.761597 137.446161 170.979591\nv 218.761597 138.337645 171.049780\nv 218.761597 134.916887 170.506116\nv 218.761597 144.638963 170.729900\nv 218.761597 143.951319 170.269103\nv 218.761597 144.631191 170.124952\nv 218.761597 134.805966 172.832129\nv 218.761597 134.463548 171.970634\nv 218.761597 135.513153 172.101801\nv 218.761597 142.946272 173.568563\nv 218.761597 142.506322 172.738784\nv 218.761597 134.076189 174.426419\nv 218.761597 133.512349 173.558505\nv 218.761597 134.320200 173.568877\nv 218.761597 134.320900 175.252439\nv 218.761597 126.125964 228.962041\nv 218.761597 124.096419 225.116345\nv 218.761597 123.903253 225.987352\nv 218.761597 122.925014 225.506380\nv 218.761597 125.375478 226.640748\nv 218.761597 128.386100 225.574050\nv 218.761597 128.266892 226.527844\nv 218.761597 134.696373 228.910739\nv 218.761597 134.248761 228.170731\nv 218.761597 134.142950 227.288362\nv 218.761597 136.816958 228.914845\nv 218.761597 137.602980 229.420881\nv 218.761597 138.803657 228.644124\nv 218.761597 139.419454 229.409399\nv 218.761597 138.488717 229.426014\nv 218.761597 136.104039 224.944102\nv 218.761597 136.079398 225.842052\nv 218.761597 135.166566 225.305887\nv 218.761597 143.300649 174.417424\nv 218.761597 144.263404 174.536980\nv 218.761597 135.295216 175.223992\nv 218.761597 134.732076 176.039639\nv 218.761597 135.753616 174.532488\nv 218.761597 136.289306 176.659540\nv 218.761597 136.013250 177.420402\nv 218.761597 135.430336 176.772055\nv 218.761597 145.416148 178.028660\nv 218.761597 144.881043 178.710032\nv 218.761597 135.706515 178.197206\nv 218.761597 136.565485 178.084691\nv 218.761597 137.192546 178.687610\nv 218.761597 136.759838 179.550120\nv 218.761597 146.925091 178.921850\nv 218.761597 147.272582 179.697467\nv 218.761597 136.224399 180.391695\nv 218.761597 135.723312 179.703070\nv 218.761597 144.023206 180.953319\nv 218.761597 143.722511 180.123119\nv 218.761597 143.728915 182.465902\nv 218.761597 144.321989 181.727887\nv 218.761597 144.591352 182.509818\nv 218.761597 135.913320 181.229696\nv 218.761597 135.717782 182.147608\nv 218.761597 145.479487 182.532415\nv 218.761597 135.548603 183.094703\nv 218.761597 136.469589 182.861841\nv 218.761597 138.722709 183.686983\nv 218.761597 146.608730 185.477445\nv 218.761597 146.075032 186.149415\nv 218.761597 145.862457 185.490062\nv 218.761597 147.262597 184.977367\nv 218.761597 142.729051 185.553037\nv 218.761597 145.011834 185.453951\nv 218.761597 144.614940 186.054979\nv 218.761597 144.695391 186.721158\nv 218.761573 132.084376 186.140088\nv 218.761596 132.921040 186.209270\nv 218.761597 143.265726 187.734063\nv 218.761597 142.420634 187.277059\nv 218.761597 146.775488 190.489227\nv 218.761597 145.116791 188.365948\nv 218.761597 144.125676 188.130178\nv 218.761597 145.053138 187.516053\nv 218.761597 134.599100 189.846638\nv 218.761597 135.444703 190.247666\nv 218.761597 134.733251 190.928778\nv 218.761597 133.454377 189.688007\nv 218.761597 133.160365 190.435843\nv 218.761597 144.176324 189.948572\nv 218.761597 145.062847 189.441440\nv 218.761597 136.418333 192.689981\nv 218.761597 135.490990 192.184126\nv 218.761597 141.594409 192.391728\nv 218.761597 141.584106 193.280114\nv 218.761597 141.716163 196.780517\nv 218.761597 142.561141 196.355106\nv 218.761597 135.751781 194.604807\nv 218.761597 136.257192 195.457827\nv 218.761597 135.148827 195.492481\nv 218.761597 131.404492 222.988114\nv 218.761597 131.248059 222.205763\nv 218.761597 130.925727 220.516548\nv 218.761597 131.145307 221.346621\nv 218.761597 127.943607 219.027059\nv 218.761597 128.515357 218.265927\nv 218.761597 129.000864 217.685236\nv 218.761597 128.142650 217.524739\nv 218.761597 142.946899 221.264125\nv 218.761597 142.711425 222.200019\nv 218.761597 141.994584 221.681671\nv 218.761597 138.256863 219.986581\nv 218.761597 138.253939 219.184680\nv 218.761597 141.749174 219.255917\nv 218.761597 140.992968 218.555698\nv 218.761597 142.137092 215.383829\nv 218.761597 133.037376 213.200409\nv 218.761597 132.970296 214.091031\nv 218.761597 127.891110 213.467782\nv 218.761597 128.033309 214.387820\nv 218.761597 128.794127 213.206729\nv 218.761597 138.509134 215.105407\nv 218.761597 138.256233 214.309489\nv 218.761597 138.453008 215.901657\nv 218.761597 138.344585 217.074427\nv 218.761597 139.335407 215.861043\nv 218.761597 128.731924 214.793437\nv 218.761597 129.506065 215.345201\nv 218.761597 130.174761 215.962618\nv 218.761597 129.384210 216.204669\nv 218.761597 130.967011 216.651363\nv 218.761597 139.228331 217.598708\nv 218.761597 138.293635 218.015842\nv 218.761597 140.183795 218.050441\nv 218.761597 140.234746 217.109026\nv 218.761597 129.340531 216.883067\nv 218.761597 128.671836 216.265650\nv 218.761597 145.652155 198.185189\nv 218.761597 145.304352 199.023759\nv 218.761597 141.725350 197.641544\nv 218.761597 133.573773 199.853346\nv 218.761597 132.990869 198.962817\nv 218.761597 136.335178 198.584065\nv 218.761597 135.714493 197.920299\nv 218.761597 139.956975 198.384625\nv 218.761597 141.301408 200.352677\nv 218.761597 143.603719 201.700476\nv 218.761597 142.753893 201.830690\nv 218.761597 145.979494 202.408431\nv 218.761597 134.393436 203.962066\nv 218.761597 135.480855 203.936361\nv 218.761597 136.120804 202.099664\nv 218.761597 144.112843 205.719391\nv 218.761597 144.075519 206.504909\nv 218.761597 143.409679 206.349606\nv 218.761597 133.367345 205.278964\nv 218.761597 132.680573 205.736146\nv 218.761597 132.552870 204.988589\nv 218.761597 143.350488 208.966012\nv 218.761597 142.870973 208.035145\nv 218.761597 143.851871 208.065991\nv 218.761597 132.785227 206.477720\nv 218.761597 131.970752 206.187345\nv 218.761597 134.367678 207.380886\nv 218.761597 133.496697 207.095038\nv 218.761597 140.856595 208.326798\nv 218.761597 141.781470 208.227737\nv 218.761597 141.444715 209.034228\nv 218.761597 140.133862 207.634749\nv 218.761597 131.725940 207.680111\nv 218.761597 131.322944 206.818072\nv 218.761597 132.937465 209.386304\nv 218.761597 134.034119 209.254567\nv 218.761597 131.475586 211.172065\nv 218.761597 138.034465 209.259899\nv 218.761597 137.736138 210.161789\nv 218.761597 137.038089 209.676760\nv 218.761597 137.704044 211.078532\nv 218.761597 132.987744 212.385626\nv 218.761597 132.294636 211.689245\nv 218.761597 137.390553 214.003597\nv 218.761597 136.621919 214.721154\nv 218.761597 136.385738 213.578730\nv 146.941896 122.173627 233.370195\nv 146.140754 122.571752 233.440411\nv 146.174611 121.655533 233.278855\nv 143.800788 124.576607 233.793945\nv 144.643988 123.679290 233.635718\nv 144.630925 124.967071 233.862787\nv 145.419262 121.087927 233.178787\nv 145.637938 126.718725 234.171641\nv 146.402650 126.925697 234.208131\nv 214.626589 124.637742 233.804701\nv 214.728829 122.256082 233.384744\nv 214.669234 121.552853 233.260742\nv 149.241891 128.018560 234.400836\nv 144.376834 134.291113 235.506865\nv 145.005472 134.602190 235.561720\nv 150.424157 125.708920 233.993590\nv 147.877555 132.587943 235.206544\nv 148.547479 133.374767 235.345275\nv 217.391240 134.683999 235.576139\nv 216.697280 135.578994 235.733951\nv 216.575029 134.554397 235.553284\nv 216.442377 133.113100 235.299147\nv 149.004854 134.052915 235.464840\nv 152.291968 126.578856 234.146935\nv 148.214431 137.631734 236.095884\nv 154.004035 129.908372 234.734048\nv 153.585760 129.035297 234.580088\nv 211.570559 124.832863 233.839112\nv 210.872163 124.374296 233.758255\nv 214.167607 132.765792 235.237897\nv 214.815193 133.036256 235.285589\nv 213.452787 132.963801 235.272808\nv 213.605772 132.223880 235.142348\nv 212.659948 127.783429 234.359377\nv 212.750065 128.713590 234.523393\nv 213.371175 127.263754 234.267750\nv 211.556488 131.974888 235.098415\nv 212.363338 131.737663 235.056599\nv 211.644212 134.445428 235.534039\nv 211.634001 135.292758 235.683441\nv 212.985264 139.776247 236.473982\nv 208.014552 125.420453 233.942710\nv 208.714975 126.042527 234.052399\nv 153.501700 135.222722 235.671113\nv 154.079236 134.378557 235.522260\nv 157.576413 126.635067 234.156872\nv 153.252871 140.592475 236.617960\nv 151.951991 133.307971 235.333484\nv 152.836414 133.387823 235.347565\nv 151.697965 132.468420 235.185457\nv 151.092230 133.281625 235.328835\nv 210.736815 135.579488 235.733994\nv 209.507087 137.647074 236.098567\nv 209.329993 138.535146 236.255174\nv 204.730622 129.140401 234.598614\nv 204.737352 128.256284 234.442721\nv 205.553685 128.849127 234.547257\nv 206.359439 130.283964 234.800255\nv 206.353919 129.439779 234.651410\nv 204.867327 127.317472 234.277183\nv 204.953634 126.410881 234.117326\nv 205.646722 127.058418 234.231507\nv 203.494117 126.995674 234.220455\nv 204.044264 127.608746 234.328539\nv 203.364142 127.934486 234.385992\nv 204.675469 130.108323 234.769298\nv 205.541974 130.599489 234.855894\nv 204.670489 130.974569 234.922041\nv 202.965276 128.839477 234.545560\nv 202.415129 128.226404 234.437475\nv 202.324582 137.615869 236.093053\nv 203.168685 137.802251 236.125928\nv 200.770076 127.888857 234.377932\nv 201.696773 128.163246 234.426329\nv 200.068959 127.823980 234.366481\nv 156.806354 124.218244 233.730713\nv 156.595350 123.416760 233.589398\nv 157.477560 123.642835 233.629261\nv 158.579534 123.907260 233.675891\nv 157.081327 129.082374 234.588415\nv 155.375176 137.283362 236.034463\nv 156.380310 137.460667 236.065727\nv 158.815332 129.042757 234.581405\nv 158.662457 128.153527 234.424618\nv 158.075073 137.282132 236.034214\nv 158.881951 137.433028 236.060815\nv 158.406258 138.855047 236.311555\nv 157.635725 138.272277 236.208813\nv 160.217830 129.403324 234.644958\nv 160.864654 136.624488 235.918257\nv 160.139323 137.206269 236.020832\nv 159.068611 139.235260 236.378601\nv 159.098388 138.425801 236.235872\nv 159.787704 139.762962 236.471663\nv 161.210502 138.713300 236.286559\nv 160.615483 139.320273 236.393588\nv 160.355760 138.199041 236.195888\nv 163.068583 136.033189 235.813983\nv 163.422788 136.774459 235.944692\nv 162.436403 135.711076 235.757179\nv 163.074111 135.240849 235.674270\nv 163.573350 137.668251 236.102295\nv 164.364379 137.913784 236.145592\nv 164.554339 131.226646 234.966478\nv 164.366441 130.308081 234.804509\nv 164.681583 132.076319 235.116300\nv 166.544568 135.858219 235.783150\nv 165.720943 136.004037 235.808866\nv 165.041427 138.613241 236.268929\nv 166.528964 129.089202 234.589598\nv 167.152486 128.288779 234.448455\nv 168.039155 131.287855 234.977270\nv 167.015421 131.013767 234.928938\nv 167.211819 136.635968 235.920298\nv 166.725552 137.401942 236.055359\nv 168.828666 131.659170 235.042759\nv 169.545586 132.361439 235.166573\nv 171.366336 139.455222 236.417415\nv 170.703730 139.912300 236.497995\nv 170.552097 138.975474 236.332801\nv 169.867590 140.204313 236.549463\nv 172.611016 128.982249 234.570733\nv 172.445859 128.012624 234.399756\nv 172.383860 132.977020 235.275129\nv 171.726269 132.305257 235.156673\nv 172.608771 132.296915 235.155205\nv 174.243569 132.442794 235.180931\nv 175.209990 132.864261 235.255244\nv 174.232784 133.390145 235.347973\nv 173.411818 131.983445 235.099937\nv 174.389025 131.457560 235.007207\nv 176.059905 139.441322 236.414934\nv 175.117547 139.456779 236.417682\nv 176.498169 135.904086 235.791212\nv 177.417028 135.943245 235.798107\nv 176.977493 131.825190 235.071979\nv 177.632403 132.576837 235.204520\nv 177.526237 133.354010 235.341555\nv 176.928001 139.368915 236.402158\nv 177.462883 138.626206 236.271198\nv 177.762853 139.421769 236.411490\nv 177.969503 140.142663 236.538611\nv 178.512524 140.831429 236.660063\nv 177.770991 140.853245 236.663902\nv 179.167177 132.118846 235.123788\nv 189.617974 140.136256 236.537458\nv 188.887391 139.972058 236.508505\nv 189.204724 139.308957 236.391584\nv 187.968993 136.373513 235.873986\nv 187.447303 132.799587 235.243806\nv 187.285598 133.714105 235.405066\nv 186.604269 133.071793 235.291797\nv 187.945822 139.811953 236.480276\nv 187.127235 139.572129 236.437990\nv 187.655555 138.904935 236.320345\nv 186.465073 130.616846 234.858951\nv 185.041320 129.770865 234.709810\nv 184.703999 128.786346 234.536213\nv 184.999274 130.680697 234.870237\nv 184.438954 127.846114 234.370429\nv 185.577204 128.078289 234.411354\nv 182.739783 142.064675 236.877540\nv 183.246559 141.248492 236.733628\nv 181.922821 131.011133 234.928516\nv 179.301548 136.230011 235.848710\nv 180.012482 135.294755 235.683813\nv 179.807313 138.072047 236.173526\nv 202.341315 138.964369 236.330834\nv 201.609853 138.960647 236.330187\nv 201.868001 138.261223 236.206855\nv 201.615459 134.528162 235.548614\nv 199.734757 132.461644 235.184238\nv 197.450111 131.223415 234.965932\nv 198.317891 137.193996 236.018696\nv 195.651319 130.506007 234.839406\nv 196.593267 130.881553 234.905642\nv 197.046682 127.433218 234.297613\nv 196.400381 128.101453 234.415437\nv 196.640948 141.998085 236.865785\nv 192.687497 127.321617 234.277890\nv 193.607537 127.315232 234.276757\nv 193.224669 128.042461 234.404992\nv 192.213826 126.609317 234.152301\nv 191.837726 139.992990 236.512208\nv 191.782157 139.073352 236.350054\nv 193.435105 137.590349 236.088573\nv 190.364756 129.277325 234.622763\nv 190.524279 130.143499 234.775489\nv 189.584745 129.788500 234.712895\nv 191.719076 132.146628 235.128696\nv 191.160055 132.557767 235.201187\nv 190.837786 128.617831 234.506473\nv 189.898252 128.262832 234.443879\nv 190.429969 132.103509 235.121089\nv 189.722789 131.601771 235.032619\nv 190.451448 131.156412 234.954091\nv 143.789416 124.238606 232.722931\nv 143.763289 126.167413 232.121764\nv 143.776352 125.526387 232.949999\nv 143.761597 125.566730 230.119012\nv 143.763289 125.802444 231.153863\nv 143.761597 123.879912 229.412837\nv 143.761653 123.211949 230.042478\nv 143.763281 121.674550 230.993852\nv 143.761653 122.408412 230.582155\nv 143.761597 133.532112 160.787146\nv 143.761597 133.446934 159.974157\nv 143.761597 132.660565 161.373823\nv 143.761597 144.178118 164.210742\nv 143.761597 133.317987 167.227763\nv 143.761597 134.139762 167.483411\nv 143.761597 137.047368 168.325493\nv 143.761597 138.021709 168.512128\nv 143.761597 137.789830 167.645986\nv 143.761597 136.508501 166.595416\nv 143.761597 143.047324 166.576326\nv 143.761597 142.136131 166.319301\nv 143.761597 142.643302 167.201304\nv 143.761597 126.188464 229.497263\nv 143.761597 125.338693 229.187534\nv 143.761597 127.059533 229.785935\nv 143.761597 127.261527 230.653149\nv 143.761597 127.904559 230.010344\nv 143.761597 126.831496 228.854457\nv 143.761597 135.862293 233.607618\nv 143.761597 136.912968 233.714084\nv 143.761597 134.094931 231.772186\nv 143.761597 133.236399 231.650781\nv 143.761597 134.510431 231.071143\nv 143.761597 134.930362 231.884986\nv 143.761597 125.099320 226.548289\nv 143.761597 124.436288 226.949026\nv 143.761597 125.020247 227.446244\nv 143.761597 130.213617 228.899577\nv 143.761597 131.180345 228.989365\nv 143.761597 135.271501 229.585163\nv 143.761597 134.887516 230.320640\nv 143.761597 135.729848 230.448465\nv 143.761597 126.842979 226.507928\nv 143.761597 127.639933 226.317810\nv 143.761597 128.629795 225.802640\nv 143.761597 133.805757 225.950447\nv 143.761597 133.964365 226.969989\nv 143.761597 136.321639 177.743364\nv 143.761597 135.923139 176.983350\nv 143.761597 145.699546 176.812869\nv 143.761597 145.090093 175.937489\nv 143.761597 147.283271 175.149661\nv 143.761597 146.122242 174.159385\nv 143.761597 145.580477 174.915155\nv 143.761597 146.547665 175.137222\nv 143.761597 143.598885 175.118981\nv 143.761597 144.664670 174.959651\nv 143.761597 145.270671 173.014529\nv 143.761597 144.566059 172.263105\nv 143.761597 138.357744 171.074255\nv 143.761597 138.630574 171.867841\nv 143.761597 134.851155 172.918701\nv 143.761597 135.782927 173.486188\nv 143.761597 132.807788 174.617323\nv 143.761597 142.200666 171.769621\nv 143.761597 143.147813 171.685860\nv 143.761597 138.342299 169.410893\nv 143.761597 146.795465 169.741111\nv 143.761597 147.538463 170.318359\nv 143.761597 135.270056 178.774886\nv 143.761597 134.454543 178.315678\nv 143.761597 147.641312 179.104767\nv 143.761597 147.835217 178.059740\nv 143.761597 146.921249 178.496148\nv 143.761597 147.628433 179.974806\nv 143.761597 148.542401 179.538398\nv 143.761597 146.321515 181.480704\nv 143.761597 146.956975 180.556412\nv 143.761597 146.091885 180.465467\nv 143.761597 135.973815 180.177693\nv 143.761597 135.901395 179.413629\nv 143.761597 135.187281 180.646175\nv 143.761597 144.580450 181.379423\nv 143.761597 144.014165 182.230694\nv 143.761597 144.890140 182.241030\nv 143.761597 146.617183 182.351824\nv 143.761597 145.752093 182.260880\nv 143.761597 147.050842 183.196521\nv 143.761597 147.620264 182.416346\nv 143.761597 132.667204 183.716851\nv 143.761597 134.708691 183.155124\nv 143.761597 135.472671 182.344078\nv 143.761597 134.443458 182.341405\nv 143.761597 143.978815 183.965232\nv 143.761597 144.376436 184.647342\nv 143.761597 144.721476 183.774412\nv 143.761597 137.431453 185.561389\nv 143.761597 136.551173 185.601341\nv 143.761597 137.128772 186.410777\nv 143.761597 135.665683 185.625279\nv 143.761597 144.343234 185.391115\nv 143.761597 143.448037 185.827560\nv 143.761597 144.157496 186.380512\nv 143.761597 140.530565 186.568272\nv 143.761597 140.838260 185.667780\nv 143.761597 145.787949 185.373542\nv 143.761597 145.085894 185.200295\nv 143.761597 146.571347 185.675040\nv 143.761597 134.808802 185.632792\nv 143.761597 144.417210 188.070040\nv 143.761597 144.155520 187.243977\nv 143.761597 144.366008 188.929612\nv 143.761597 134.535564 188.065920\nv 143.761597 134.088300 187.252102\nv 143.761597 136.804825 188.911085\nv 143.761597 137.376151 189.648745\nv 143.761597 137.790088 188.812210\nv 143.761597 136.324010 188.083969\nv 143.761597 143.592259 189.155402\nv 143.761597 142.867971 189.171901\nv 143.761597 143.987118 190.486211\nv 143.761597 144.760866 190.260421\nv 143.761597 144.172587 189.615932\nv 143.761597 146.466151 189.631254\nv 143.761597 145.690149 193.601092\nv 143.761597 142.289338 190.854430\nv 143.761597 141.470557 190.970358\nv 143.761597 142.032912 191.627404\nv 143.761597 142.945810 193.215272\nv 143.761597 142.661234 194.144825\nv 143.761597 136.531878 191.482246\nv 143.761597 137.005324 190.672959\nv 143.761597 135.917441 190.556907\nv 143.761597 140.888516 193.994444\nv 143.761597 143.947535 195.665972\nv 143.761597 143.232327 195.591359\nv 143.761597 135.108494 195.202953\nv 143.761597 134.533467 195.864718\nv 143.761597 134.917665 196.636545\nv 143.761597 139.305755 226.314213\nv 143.761597 139.162990 225.411107\nv 143.761597 138.426798 226.030957\nv 143.761597 139.428668 227.155529\nv 143.761597 134.699915 225.512018\nv 143.761597 134.792873 223.653877\nv 143.761597 133.837610 223.153108\nv 143.761597 128.228410 222.868611\nv 143.761597 127.811401 221.935543\nv 143.761597 129.082391 223.195557\nv 143.761597 138.239422 224.223642\nv 143.761597 138.893901 224.615180\nv 143.761597 138.849291 223.710972\nv 143.761597 129.147988 221.204380\nv 143.761597 129.883732 221.590289\nv 143.761597 135.235292 221.759066\nv 143.761597 134.932013 220.696152\nv 143.761597 132.343018 218.772833\nv 143.761597 131.472952 218.457632\nv 143.761597 130.484503 218.220485\nv 143.761597 129.615040 217.958925\nv 143.761597 136.377069 219.702428\nv 143.761597 135.665691 220.095077\nv 143.761597 129.406993 216.972421\nv 143.761597 131.282178 217.522587\nv 143.761597 138.720672 218.368511\nv 143.761597 139.533630 219.054328\nv 143.761597 129.154055 214.919758\nv 143.761597 129.287850 216.059922\nv 143.761597 126.385800 215.263809\nv 143.761597 130.450271 212.673308\nv 143.761597 131.164766 213.295753\nv 143.761598 147.215303 202.462460\nv 143.761598 146.086393 202.466980\nv 143.761597 132.414235 199.526512\nv 143.761597 139.613233 202.469283\nv 143.761597 141.095190 198.729534\nv 143.761597 141.382774 199.847120\nv 143.761597 134.704332 198.847484\nv 143.761597 142.432207 199.671414\nv 143.761597 143.200831 199.737074\nv 143.761597 142.716007 199.000243\nv 143.761597 144.862941 199.130709\nv 143.761597 145.594899 199.918366\nv 143.761597 144.088853 199.535374\nv 143.761597 144.726961 197.351518\nv 143.761597 145.543715 197.452927\nv 143.761597 142.941311 214.722903\nv 143.761597 142.787329 215.555610\nv 143.761597 141.719135 213.744342\nv 143.761597 133.059642 210.053892\nv 143.761597 133.340811 210.849492\nv 143.761597 128.406253 210.488335\nv 143.761597 127.728705 209.715537\nv 143.761597 137.969943 211.949894\nv 143.761597 132.137280 209.792130\nv 143.761597 132.729299 208.969310\nv 143.761597 130.788998 208.469742\nv 143.761597 131.320880 209.372249\nv 143.761597 130.448604 207.423243\nv 143.761597 130.191176 206.262503\nv 143.761597 133.264180 201.004849\nv 143.761597 132.036652 200.295107\nv 143.761597 131.548383 201.008966\nv 143.761597 132.430015 200.950900\nv 143.761597 141.382190 203.580703\nv 143.761597 142.439469 203.086000\nv 143.761597 141.642116 204.439188\nv 143.761597 142.269865 204.934010\nv 143.761597 141.552980 205.351665\nv 143.761597 139.221430 207.516555\nv 143.761597 140.254043 207.281325\nv 143.761597 142.569836 208.348003\nv 143.761597 134.233791 205.340100\nv 143.761597 133.693785 206.663041\nv 143.761597 133.530056 205.708384\nv 143.761597 138.904952 209.315249\nv 143.761597 139.214154 208.428786\nv 143.761597 141.613014 208.739665\nv 178.031079 155.054386 166.568730\nv 171.232692 144.535451 236.513708\nv 170.449554 144.216194 237.256904\nv 171.830690 144.589206 236.501605\nv 172.308807 144.367493 237.283600\nv 156.621956 147.301502 220.197363\nv 157.962379 149.550802 211.090462\nv 208.208000 141.744598 236.821099\nv 191.612911 145.325694 234.047760\nv 202.623948 147.534790 221.556327\nv 211.634094 130.311430 199.919390\nv 144.608872 141.460284 160.613948\nv 145.665958 138.365796 160.068312\nv 146.473511 138.565654 160.103561\nv 146.328285 137.766336 159.962615\nv 217.906730 142.877826 160.863900\nv 217.906730 144.163820 161.090657\nv 217.603548 139.672964 160.298794\nv 216.759594 140.671958 160.474952\nv 216.750524 138.879208 160.158832\nv 216.271994 138.254890 160.048748\nv 216.343206 141.341384 160.592981\nv 215.590323 141.923495 160.695616\nv 146.292040 140.313718 160.411790\nv 146.229726 141.231024 160.573537\nv 146.180517 142.189086 160.742469\nv 145.406938 141.775087 160.669465\nv 146.086005 143.093235 160.901891\nv 146.469559 139.487763 160.266152\nv 211.614099 139.483906 160.265481\nv 210.620307 139.990254 160.354758\nv 211.798728 142.498855 160.797104\nv 211.612085 143.385315 160.953396\nv 212.329913 143.073733 160.898461\nv 210.144332 141.955488 160.701278\nv 210.356629 142.826731 160.854902\nv 210.868603 141.939194 160.698416\nv 209.728252 144.483614 161.147046\nv 210.061896 143.560467 160.984270\nv 209.298714 143.766172 161.020541\nv 210.272676 145.021302 161.241852\nv 207.526935 142.379442 160.776034\nv 208.480165 143.923897 161.048353\nv 205.960259 142.711201 160.834546\nv 205.068906 142.594872 160.814017\nv 205.066510 140.822399 160.501482\nv 205.125786 139.818195 160.324420\nv 205.922542 139.416324 160.253574\nv 206.766354 144.271588 161.109682\nv 207.615152 144.141033 161.086650\nv 207.146462 143.289031 160.936421\nv 206.179284 145.187705 161.271202\nv 206.678137 142.509997 160.799066\nv 206.739794 139.935345 160.345082\nv 203.339883 149.233736 161.984611\nv 204.279420 148.717425 161.893564\nv 204.432213 152.308488 162.526763\nv 204.120599 144.825876 161.207373\nv 203.175630 145.351904 161.300113\nv 204.178554 145.777849 161.375233\nv 204.936476 141.647013 160.646886\nv 204.382529 142.239069 160.751265\nv 194.106625 135.133251 159.498326\nv 193.942447 136.090934 159.667191\nv 192.982840 136.057421 159.661274\nv 196.098984 145.304236 161.291746\nv 196.773761 144.730337 161.190567\nv 195.382632 145.990129 161.412666\nv 197.949401 149.816417 162.087382\nv 197.198197 149.006714 161.944600\nv 197.371903 144.054447 161.071387\nv 198.996943 144.176156 161.092843\nv 198.651129 149.634716 162.055342\nv 200.940242 144.956554 161.230446\nv 200.619448 144.135734 161.085705\nv 199.019243 146.577824 161.516313\nv 162.380593 144.579963 161.164050\nv 161.522511 144.088852 161.077437\nv 161.297693 150.208471 162.156494\nv 161.428960 149.298663 161.996069\nv 165.059090 145.139686 161.262758\nv 165.108483 144.219225 161.100460\nv 165.949448 144.682591 161.182153\nv 203.259269 147.285836 161.641127\nv 202.291155 146.899184 161.572961\nv 202.571580 145.959357 161.407240\nv 194.074112 149.277006 161.992238\nv 191.366537 150.659773 162.236073\nv 169.184989 147.900513 161.749542\nv 168.255125 144.239093 161.103945\nv 167.624717 143.815795 161.029322\nv 148.380938 143.559126 160.984032\nv 151.123831 143.588977 160.989314\nv 149.214721 144.280723 161.111282\nv 151.133775 144.335879 161.121009\nv 152.031077 143.869609 161.038788\nv 153.046700 141.823600 160.678039\nv 156.187272 137.200801 159.862927\nv 156.443427 138.183055 160.036128\nv 155.729994 138.219275 160.042514\nv 154.894448 140.906133 160.516273\nv 153.983755 141.343418 160.593379\nv 153.355105 150.707724 162.244536\nv 157.374082 143.799844 161.026482\nv 156.162969 152.033554 162.478314\nv 156.912942 152.228348 162.512671\nv 158.122338 142.453727 160.789130\nv 158.099350 143.285153 160.935734\nv 159.049995 142.922349 160.871766\nv 158.301740 144.268466 161.109117\nv 160.519135 139.404366 160.251448\nv 159.593260 139.569911 160.280644\nv 160.307754 140.261362 160.402558\nv 161.067558 140.950285 160.524036\nv 161.388445 143.318333 160.941592\nv 190.974965 151.467129 162.378422\nv 191.564266 147.592458 161.695230\nv 191.397262 145.495145 161.325408\nv 191.958411 144.828049 161.207783\nv 191.173398 144.700656 161.185318\nv 190.885280 143.914835 161.046756\nv 191.428961 143.111101 160.905031\nv 189.740606 137.967900 159.998158\nv 190.324132 144.581930 161.164382\nv 189.449985 144.577455 161.163589\nv 189.738103 145.363277 161.302150\nv 189.305194 147.013866 161.593195\nv 188.726617 144.513063 161.152234\nv 188.030526 144.863079 161.213952\nv 185.524683 144.483409 161.147002\nv 184.840440 144.263932 161.108309\nv 184.959629 145.229170 161.278507\nv 184.394204 143.635705 160.997533\nv 183.829151 144.381466 161.129038\nv 183.557511 145.225121 161.277794\nv 182.096979 145.621192 161.347630\nv 180.047175 144.081294 161.076101\nv 179.080138 144.335053 161.120843\nv 179.297001 145.880500 161.393344\nv 178.756292 145.278619 161.287219\nv 175.793195 148.941329 161.933054\nv 175.055939 145.794126 161.378124\nv 175.479342 138.085460 160.018885\nv 175.354492 139.497586 160.267880\nv 173.963910 152.903782 162.631752\nv 174.692740 152.111489 162.492056\nv 171.701703 150.145740 162.145441\nv 170.887288 150.673456 162.238498\nv 172.311309 141.913222 160.693829\nv 170.730924 144.963368 161.231647\nv 171.622252 145.451771 161.317758\nv 171.565759 144.474542 161.145436\nv 218.761597 135.520069 234.568898\nv 218.761597 135.586065 235.251563\nv 218.761597 134.842235 234.933019\nv 218.761597 135.555059 235.729737\nv 218.761597 136.232893 235.365616\nv 218.761597 128.796793 231.462517\nv 218.761597 128.464156 232.291174\nv 218.761597 127.690178 232.293346\nv 218.761597 133.257289 234.640362\nv 218.761597 134.195407 234.818965\nv 218.761597 131.929117 233.447682\nv 218.761597 131.963633 234.412256\nv 218.761597 132.832892 232.886500\nv 218.761597 131.862006 232.441034\nv 218.761597 133.638149 232.202567\nv 218.761597 130.887241 230.394807\nv 218.761597 137.677985 162.218463\nv 218.761597 146.746973 163.125284\nv 218.761597 146.464043 162.289127\nv 218.761597 138.435923 161.953806\nv 218.761597 138.649345 162.666016\nv 218.761597 143.843709 164.438845\nv 218.761597 138.292571 164.133635\nv 218.761597 138.557457 163.466113\nv 218.761597 141.603470 165.603271\nv 218.761597 142.612818 165.358428\nv 218.761597 140.189730 167.515678\nv 218.761597 141.091333 167.328882\nv 218.761597 130.880980 167.324931\nv 218.761597 131.698972 168.179858\nv 218.761597 130.850187 168.059532\nv 218.761597 139.212491 167.792156\nv 218.761597 136.503415 168.813298\nv 218.761597 137.288903 169.339055\nv 218.761597 144.720923 169.338465\nv 218.761597 140.359261 169.909962\nv 218.761597 141.095359 170.643765\nv 218.761597 140.228711 170.846199\nv 218.761597 144.431801 171.485121\nv 218.761597 140.132155 174.207692\nv 218.761597 124.377150 222.200328\nv 218.761597 125.410819 222.186855\nv 218.761597 125.872972 221.313093\nv 218.761597 134.963663 229.868852\nv 218.761597 131.873942 228.741657\nv 218.761597 131.404396 229.770456\nv 218.761597 130.934492 228.605550\nv 218.761597 130.072648 225.777455\nv 218.761597 131.145600 226.441276\nv 218.761597 129.298997 225.309474\nv 218.761597 131.572798 225.553089\nv 218.761597 131.543647 224.742244\nv 218.761597 132.229283 224.989532\nv 218.761597 130.113511 224.837819\nv 218.761597 130.062773 223.938753\nv 218.761597 130.836425 224.406734\nv 218.761597 145.863143 177.410152\nv 218.761597 146.257423 178.248923\nv 218.761597 145.741609 176.590449\nv 218.761597 149.249760 177.480922\nv 218.761597 149.272524 176.523574\nv 218.761597 133.453385 178.922077\nv 218.761597 134.083669 179.386259\nv 218.761597 137.499280 177.910807\nv 218.761597 139.138648 178.360791\nv 218.761597 138.519579 177.600185\nv 218.761597 140.945624 181.579585\nv 218.761597 140.561953 180.726241\nv 218.761597 142.938986 182.438863\nv 218.761597 140.039778 183.078684\nv 218.761597 140.454134 182.339136\nv 218.761597 140.328669 183.819545\nv 218.761597 139.536541 183.781882\nv 218.761597 139.011600 184.427844\nv 218.761597 134.686924 186.387176\nv 218.761596 133.775951 186.340283\nv 218.761597 138.304996 186.570910\nv 218.761597 140.028975 186.695209\nv 218.761597 135.138348 187.235974\nv 218.761597 138.240654 188.051116\nv 218.761597 137.856827 188.711887\nv 218.761597 138.710663 187.313665\nv 218.761597 139.098839 188.094302\nv 218.761597 139.163182 186.614097\nv 218.761597 137.921837 189.536771\nv 218.761597 141.517372 189.498738\nv 218.761597 141.531549 188.595319\nv 218.761597 138.103367 190.441477\nv 218.761597 138.212715 191.491342\nv 218.761597 134.070972 191.231724\nv 218.761597 133.557350 191.774528\nv 218.761597 133.374025 191.070553\nv 218.761597 134.916576 191.632753\nv 218.761597 129.876232 191.800522\nv 218.761597 129.761629 192.809148\nv 218.761597 132.090680 191.454340\nv 218.761597 136.131636 193.804299\nv 218.761597 139.816036 194.133455\nv 218.761597 139.791398 194.970549\nv 218.761597 138.921800 194.537661\nv 218.761597 139.815259 195.793667\nv 218.761597 140.714756 193.729328\nv 218.761597 134.528342 193.061962\nv 218.761597 133.953929 192.510590\nv 218.761597 134.828711 192.487072\nv 218.761597 134.251839 195.476565\nv 218.761597 134.360646 223.829461\nv 218.761597 134.414423 224.745106\nv 218.761597 135.117760 223.473842\nv 218.761597 134.287199 222.895367\nv 218.761597 133.492762 222.357368\nv 218.761597 132.776690 222.859773\nv 218.761597 135.955165 221.352828\nv 218.761597 139.232281 222.655157\nv 218.761597 138.934253 223.633447\nv 218.761597 140.157838 222.446301\nv 218.761597 142.783087 224.789051\nv 218.761597 142.065637 224.859714\nv 218.761597 137.929898 220.790603\nv 218.761597 137.016852 220.950181\nv 218.761597 133.563425 218.591903\nv 218.761597 130.755636 219.449484\nv 218.761597 130.425589 218.521287\nv 218.761597 137.370193 218.660399\nv 218.761597 135.487232 213.288932\nv 218.761597 135.611849 215.356979\nv 218.761597 140.021650 216.195390\nv 218.761597 129.464798 196.050996\nv 218.761597 129.778837 195.257690\nv 218.761597 129.296249 197.223947\nv 218.761597 138.451339 199.432723\nv 218.761597 137.699147 199.180763\nv 218.761597 144.800292 199.790533\nv 218.761597 144.553051 200.609113\nv 218.761597 146.687482 201.081670\nv 218.761597 144.306555 201.236956\nv 218.761597 141.113901 201.138445\nv 218.761597 137.168179 201.429679\nv 218.761597 136.952398 200.561061\nv 218.761597 137.956238 200.899448\nv 218.761597 136.212777 200.216674\nv 218.761597 142.516127 202.660047\nv 218.761597 141.747327 201.859701\nv 218.761597 143.066146 203.483144\nv 218.761597 138.554698 204.769426\nv 218.761597 137.760194 205.463594\nv 218.761597 139.656524 205.100145\nv 218.761597 141.267185 205.198197\nv 218.761597 142.286487 205.133409\nv 218.761597 134.062042 204.648047\nv 218.761597 136.160253 206.849592\nv 218.761597 136.007671 205.894971\nv 218.761597 136.930916 206.146347\nv 218.761597 135.831387 204.978206\nv 218.761597 138.205395 208.262031\nv 218.761597 144.281975 211.508836\nv 218.761597 144.065669 210.694537\nv 218.761597 143.381618 211.334268\nv 144.510764 128.641552 234.510691\nv 144.495063 130.661889 234.866928\nv 145.208831 131.066938 234.938340\nv 144.475365 131.432311 235.002776\nv 143.761597 130.380434 234.817311\nv 217.713854 136.598301 235.913686\nv 218.137544 135.955241 235.800298\nv 218.337907 136.844947 235.957178\nv 218.761597 134.261403 235.501630\nv 218.015293 134.283817 235.505578\nv 218.015293 133.636989 235.391524\nv 218.043681 129.686127 234.694877\nv 145.847734 130.647169 234.864331\nv 145.828035 131.417591 235.000179\nv 146.738496 128.682335 234.517880\nv 146.014972 129.193028 234.607928\nv 146.663407 131.836479 235.074047\nv 146.024504 132.256248 235.148056\nv 145.999271 129.919708 234.736059\nv 216.144443 128.123101 234.419270\nv 145.480804 136.912384 235.969069\nv 146.039418 137.371974 236.050099\nv 145.286504 137.763329 236.119113\nv 144.873381 136.417062 235.881737\nv 144.244744 136.752813 235.940936\nv 147.418728 131.768168 235.062000\nv 148.436407 131.680975 235.046620\nv 145.760788 135.121088 235.653216\nv 145.626295 136.025707 235.812724\nv 148.917625 130.807639 234.892627\nv 149.376452 131.627415 235.037171\nv 213.739201 124.843243 233.840940\nv 152.238842 124.290769 233.743512\nv 152.899528 124.873870 233.846295\nv 152.057011 125.171453 233.898790\nv 151.497459 123.747916 233.647813\nv 150.296837 129.891346 234.731051\nv 151.254734 129.893536 234.731423\nv 150.815566 130.756270 234.883548\nv 151.715890 129.033907 234.579847\nv 151.301122 128.215885 234.435611\nv 215.377111 139.252732 236.381680\nv 213.233007 137.288770 236.035383\nv 213.832052 137.931636 236.148732\nv 212.765930 138.242025 236.203463\nv 212.762737 130.761953 234.884557\nv 211.908570 130.119303 234.771241\nv 212.835583 129.827818 234.719860\nv 210.983759 126.837259 234.192529\nv 214.968419 135.286199 235.682311\nv 215.090099 136.213886 235.845874\nv 213.604232 129.356240 234.636709\nv 215.640891 134.761511 235.589803\nv 218.159806 138.196152 236.195431\nv 216.334851 133.866516 235.431990\nv 214.629477 130.662385 234.867020\nv 214.513478 129.716373 234.700212\nv 214.427960 128.602145 234.503745\nv 211.091709 130.415274 234.823420\nv 210.989524 131.304105 234.980136\nv 210.245508 130.665941 234.867617\nv 209.440377 130.931815 234.914493\nv 209.542562 130.042984 234.757777\nv 211.794247 138.500771 236.249083\nv 211.171000 137.905952 236.144213\nv 212.393292 139.143636 236.362433\nv 208.611416 131.192027 234.960377\nv 154.356722 137.154461 236.011737\nv 153.802850 137.970602 236.155627\nv 154.868621 129.939982 234.739629\nv 155.319033 129.054885 234.583560\nv 154.957927 128.144704 234.423053\nv 155.801213 128.168196 234.427205\nv 207.142280 128.291057 234.448867\nv 207.828662 131.454939 235.006731\nv 208.039686 136.553798 235.905801\nv 207.767999 141.262942 236.736153\nv 208.957902 140.999636 236.689758\nv 207.022331 131.697146 235.049443\nv 206.204867 132.012672 235.105081\nv 206.354458 131.150209 234.952998\nv 205.839208 133.638350 235.391718\nv 206.145120 132.769873 235.238587\nv 204.882345 133.596601 235.384375\nv 205.304053 134.254816 235.500444\nv 205.373822 136.865962 235.960857\nv 204.412307 136.656088 235.923849\nv 204.120451 133.310143 235.333892\nv 203.006624 132.999876 235.279159\nv 201.580542 136.215292 235.846099\nv 202.088270 135.540996 235.727210\nv 156.682779 131.785737 235.065087\nv 157.479199 131.506782 235.015893\nv 157.112817 132.459960 235.183970\nv 155.788946 131.793743 235.066506\nv 157.887543 132.822708 235.247922\nv 158.589037 133.150903 235.305772\nv 159.360375 129.912836 234.734802\nv 161.559885 131.123053 234.948197\nv 161.500917 130.165272 234.779311\nv 162.357996 131.383755 234.994165\nv 161.721377 131.983769 235.099962\nv 161.822618 132.980963 235.275806\nv 162.664006 132.928061 235.266460\nv 162.087318 129.778625 234.711141\nv 162.924281 140.874122 236.667560\nv 161.960337 140.738290 236.643612\nv 161.722974 142.341677 236.926332\nv 162.703778 142.499971 236.954232\nv 163.185213 134.582697 235.558223\nv 163.817393 134.904810 235.615027\nv 163.950167 133.461427 235.360524\nv 164.792368 133.058581 235.289497\nv 164.770696 133.843811 235.427953\nv 167.058575 134.259605 235.501265\nv 167.643254 134.742495 235.586422\nv 169.298575 141.620902 236.799267\nv 168.581963 141.386373 236.757935\nv 169.129076 140.741545 236.644213\nv 168.310505 135.520244 235.723570\nv 169.254694 134.990917 235.630218\nv 169.311755 134.094485 235.472152\nv 170.244122 132.853688 235.253348\nv 170.927274 132.498060 235.190658\nv 170.818206 133.340989 235.339288\nv 171.152185 131.817955 235.070734\nv 171.395091 131.001334 234.926748\nv 172.491980 133.726605 235.407303\nv 173.382947 133.980636 235.452099\nv 172.608566 134.738563 235.585741\nv 172.754227 131.311682 234.981481\nv 172.106663 130.936782 234.915369\nv 174.355636 137.713502 236.110294\nv 174.990146 136.832418 235.954925\nv 175.587556 136.122624 235.829768\nv 174.565368 136.112947 235.828071\nv 175.874340 129.315098 234.629432\nv 176.837192 129.707360 234.698572\nv 176.073391 135.184615 235.664358\nv 176.046747 132.407533 235.174687\nv 177.196170 126.405591 234.116363\nv 177.581880 134.387971 235.523870\nv 178.570932 134.563564 235.554850\nv 177.973057 135.141670 235.656782\nv 179.273252 134.496836 235.543100\nv 179.763331 132.829291 235.249073\nv 179.477133 140.583078 236.616287\nv 180.108436 140.023322 236.517598\nv 189.012234 132.073962 235.115880\nv 188.914971 132.995384 235.278346\nv 189.664770 133.468403 235.361755\nv 188.225894 132.520477 235.194609\nv 187.299635 137.101691 236.002387\nv 187.472393 138.004130 236.161510\nv 185.442537 135.041994 235.639242\nv 184.797827 135.478126 235.716166\nv 201.212099 130.885595 234.906334\nv 199.525151 133.350465 235.340966\nv 197.929869 128.940987 234.563465\nv 197.883232 128.055531 234.407332\nv 198.697371 128.548566 234.494255\nv 196.245234 138.546328 236.257143\nv 195.482882 132.844728 235.251785\nv 195.409738 133.523641 235.371495\nv 194.585266 138.876595 236.315374\nv 194.012914 138.163826 236.189691\nv 192.855996 135.126450 235.654116\nv 192.054322 134.685141 235.576297\nv 191.899660 138.324129 236.217950\nv 191.176919 137.867786 236.137475\nv 143.761597 130.616007 234.315333\nv 143.761597 131.452643 234.304463\nv 143.761597 131.041388 233.688433\nv 143.761597 129.969178 234.201280\nv 143.761597 128.087410 232.424277\nv 143.761597 128.567467 231.680786\nv 143.761597 127.626497 231.621050\nv 143.761597 129.616566 233.091658\nv 143.761597 130.571013 233.008651\nv 143.761597 132.337912 233.010390\nv 143.761597 131.407650 232.997781\nv 143.761597 128.734164 233.479582\nv 143.761597 129.322350 234.087227\nv 143.761597 137.198964 161.689613\nv 143.761597 136.525347 162.331940\nv 143.761597 139.688293 162.848203\nv 143.761597 140.793195 163.175487\nv 143.761597 139.288678 161.971011\nv 143.761597 133.776127 164.559096\nv 143.761597 147.508797 167.911257\nv 143.761597 146.822760 167.166582\nv 143.761597 146.336343 168.028809\nv 143.761597 148.358186 167.754067\nv 143.761597 141.390350 168.168373\nv 143.761597 141.938953 167.593943\nv 143.761597 141.183507 167.518710\nv 143.761597 140.332235 167.349471\nv 143.761597 140.880837 166.775041\nv 143.761597 141.385656 166.316298\nv 143.761597 140.534384 166.147059\nv 143.761597 138.382959 234.758464\nv 143.761597 137.873748 235.025824\nv 143.761597 131.320087 230.278515\nv 143.761597 130.318600 230.335532\nv 143.761597 131.728639 229.554134\nv 143.761597 132.263806 230.189614\nv 143.761597 125.357829 225.921257\nv 143.761597 125.637006 225.181415\nv 143.761597 124.794538 225.311228\nv 143.761597 125.941788 226.418476\nv 143.761597 134.887009 228.680028\nv 143.761597 134.324469 227.764566\nv 143.761597 133.866630 228.541875\nv 143.761597 135.729341 228.807853\nv 143.761597 143.316096 178.718593\nv 143.761597 142.759977 177.886774\nv 143.761597 142.119196 177.045179\nv 143.761597 140.431449 177.370573\nv 143.761597 139.592616 177.762560\nv 143.761597 135.727094 176.145200\nv 143.761597 136.065183 175.360254\nv 143.761597 138.416061 176.895491\nv 143.761597 140.056234 175.126638\nv 143.761597 139.913408 174.286656\nv 143.761597 142.690699 175.203563\nv 143.761597 141.636339 175.337342\nv 143.761597 141.293171 171.826541\nv 143.761597 141.642303 170.994172\nv 143.761597 140.359059 171.830288\nv 143.761597 142.004785 170.224979\nv 143.761597 144.119869 171.591403\nv 143.761597 144.940099 171.420039\nv 143.761597 136.424297 169.830389\nv 143.761597 136.285992 168.963254\nv 143.761597 141.047338 168.802923\nv 143.761597 141.802784 168.878156\nv 143.761597 149.345740 179.207631\nv 143.761597 146.254173 177.591933\nv 143.761597 139.445663 178.791433\nv 143.761597 139.839588 179.518942\nv 143.761597 140.637830 178.873329\nv 143.761597 138.794374 178.408173\nv 143.761597 138.105808 177.539123\nv 143.761597 136.004326 178.426525\nv 143.761597 139.333423 180.351755\nv 143.761597 138.412433 180.491155\nv 143.761597 139.098435 181.405864\nv 143.761597 137.478975 181.069330\nv 143.761597 138.710638 182.235785\nv 143.761597 139.631628 182.096384\nv 143.761597 137.070776 182.546174\nv 143.761597 136.195576 182.560458\nv 143.761597 136.613103 183.143512\nv 143.761597 137.832874 182.337246\nv 143.761597 137.415347 181.754192\nv 143.761597 130.798088 183.878853\nv 143.761597 131.678093 183.394361\nv 143.761597 139.842793 183.554179\nv 143.761597 138.937477 183.769708\nv 143.761597 139.536439 184.397582\nv 143.761597 138.059712 183.871169\nv 143.761597 138.366066 183.027767\nv 143.761597 137.742488 184.682532\nv 143.761597 137.613906 187.222687\nv 143.761597 138.184820 187.917447\nv 143.761597 138.579965 187.065585\nv 143.761597 136.733627 187.262639\nv 143.761597 140.119003 189.902247\nv 143.761597 143.125265 190.676599\nv 143.761597 142.562911 190.019553\nv 143.761597 131.245097 190.548936\nv 143.761597 130.427772 191.203663\nv 143.761597 140.504071 191.300661\nv 143.761597 139.748654 191.782236\nv 143.761597 136.909945 192.364968\nv 143.761597 141.768182 194.411367\nv 143.761597 142.580902 195.152023\nv 143.761597 140.808184 195.001641\nv 143.761597 135.764565 194.713337\nv 143.761597 138.377583 196.791619\nv 143.761597 137.515237 197.520144\nv 143.761597 129.364247 225.239290\nv 143.761597 130.158720 224.591786\nv 143.761597 130.091606 223.638851\nv 143.761597 129.910889 222.549899\nv 143.761597 132.567896 220.779761\nv 143.761597 135.642534 218.421617\nv 143.761597 134.833493 218.113393\nv 143.761597 133.234340 219.219393\nv 143.761597 133.309702 220.128692\nv 143.761597 133.161949 218.206294\nv 143.761597 130.174587 216.372942\nv 143.761597 125.287913 215.084557\nv 143.761597 125.494962 214.337834\nv 143.761597 132.237198 216.161384\nv 143.761597 131.862989 217.016819\nv 143.761597 136.402223 217.906519\nv 143.761597 139.613954 216.043374\nv 143.761597 134.309317 214.977031\nv 143.761597 135.256899 214.555629\nv 143.761597 134.456936 213.872492\nv 143.761597 136.255214 213.889453\nv 143.761597 137.963878 214.841314\nv 143.761597 129.753253 211.953089\nv 143.761597 129.080102 211.243912\nv 143.761597 135.505506 212.493312\nv 143.761597 136.323102 212.909152\nv 143.761597 137.920294 201.896955\nv 143.761597 138.243533 201.266343\nv 143.761601 147.063290 203.428057\nv 143.761597 136.737168 199.856886\nv 143.761597 136.408757 199.068068\nv 143.761597 137.461294 199.983460\nv 143.761597 136.893297 198.202193\nv 143.761597 137.878548 198.550879\nv 143.761597 134.223657 196.556536\nv 143.761597 142.567141 213.426595\nv 143.761597 143.229377 213.951434\nv 143.761597 141.923582 212.852591\nv 143.761597 134.910246 211.178903\nv 143.761597 135.500317 210.621373\nv 143.761597 136.392467 209.998472\nv 143.761597 139.805457 210.786513\nv 143.761597 140.787483 210.705324\nv 143.761597 137.893088 209.485314\nv 143.761597 137.050465 209.301957\nv 143.761597 145.065149 202.398262\nv 143.761597 139.305154 203.285061\nv 143.761597 138.513008 202.614472\nv 143.761597 138.766370 204.194517\nv 143.761597 138.377219 204.982009\nv 143.761597 140.700197 205.621408\nv 143.761597 141.327945 206.116230\nv 143.761597 136.831961 205.752162\nv 143.761597 127.984754 204.520959\nv 143.761597 128.133927 203.799260\nv 143.761597 128.161427 205.490929\nv 143.761597 137.323616 206.677761\nv 143.761597 136.473717 207.406636\nv 143.761597 135.764370 208.082325\nv 167.940415 128.460481 222.881561\nv 156.958248 128.694351 214.977793\nv 176.918419 128.444217 225.419737\nv 177.042458 128.732410 224.478575\nv 147.064547 137.016790 159.830460\nv 143.761597 130.529601 158.686550\nv 144.378810 130.339895 158.653120\nv 145.506713 130.773516 158.729601\nv 218.361549 129.404350 158.488144\nv 217.684655 130.204173 158.629195\nv 217.908399 132.227811 158.986019\nv 215.956020 135.625081 159.585047\nv 215.986367 132.678155 159.065449\nv 147.379233 131.519855 158.861196\nv 146.656851 131.307383 158.823726\nv 147.840669 139.147083 160.206088\nv 147.131886 138.888303 160.160456\nv 148.352237 135.477531 159.559045\nv 147.603800 135.272169 159.522836\nv 147.741693 136.272747 159.699264\nv 149.657276 132.187916 158.979009\nv 149.097307 134.683041 159.418946\nv 145.715102 132.772489 159.082068\nv 146.153903 131.118957 158.790504\nv 145.643213 131.781625 158.907350\nv 213.070220 134.008767 159.300038\nv 216.970004 147.031672 161.596323\nv 214.910514 141.397599 160.602894\nv 214.888112 142.167867 160.738713\nv 210.727203 133.685835 159.243107\nv 210.839613 134.556092 159.396558\nv 213.714202 149.956288 162.112044\nv 212.767696 147.971317 161.762030\nv 213.216207 147.055075 161.600491\nv 212.216730 148.809324 161.909785\nv 209.294728 135.719396 159.601687\nv 209.404697 136.617992 159.760135\nv 213.066524 150.766267 162.254856\nv 212.085548 151.010243 162.297855\nv 212.549928 149.616155 162.052050\nv 209.694818 141.170197 160.562807\nv 209.955374 140.382872 160.423991\nv 208.709515 137.168794 159.857261\nv 207.915769 136.873108 159.805123\nv 208.402077 135.443654 159.553080\nv 207.597098 135.205368 159.511060\nv 207.748541 136.039631 159.658158\nv 207.110790 136.634822 159.763103\nv 202.573664 134.937108 159.463721\nv 203.498202 134.756731 159.431933\nv 204.609382 134.493086 159.385468\nv 206.853557 146.128821 161.437158\nv 205.957275 134.857232 159.449677\nv 206.822626 135.085868 159.489981\nv 205.371181 134.335035 159.357617\nv 205.951402 137.692430 159.949606\nv 206.609330 137.187049 159.860481\nv 208.601341 151.537853 162.390903\nv 209.512610 151.421758 162.370422\nv 203.816317 143.793429 161.025324\nv 205.872978 148.150554 161.793625\nv 205.004676 148.179590 161.798729\nv 162.355230 135.925588 159.638052\nv 162.131726 135.085823 159.489972\nv 160.499354 152.786561 162.611062\nv 159.299583 152.608554 162.579678\nv 158.646400 152.074580 162.485546\nv 159.385030 151.410241 162.368394\nv 196.243733 153.535641 162.743150\nv 196.435671 143.051790 160.894590\nv 195.475413 142.639115 160.821815\nv 195.884623 152.013247 162.474700\nv 196.594339 152.653138 162.587550\nv 194.975738 148.658766 161.883230\nv 195.595883 139.638160 160.292670\nv 194.718018 140.025160 160.360896\nv 197.078523 143.409550 160.957682\nv 196.957599 142.536714 160.803777\nv 198.207266 153.214266 162.686524\nv 197.032630 153.348938 162.710242\nv 198.124289 137.522486 159.919611\nv 197.893831 143.539371 160.980573\nv 198.100429 146.497189 161.502106\nv 199.608324 151.315903 162.351775\nv 200.296758 151.683813 162.416626\nv 198.573993 143.416349 160.958864\nv 199.383726 143.408238 160.957430\nv 199.560207 136.869513 159.804510\nv 198.767570 137.237771 159.869422\nv 198.987946 137.963818 159.997451\nv 200.183549 143.304928 160.939226\nv 200.996322 143.272617 160.933522\nv 203.641639 152.574853 162.573747\nv 202.101128 136.447333 159.730020\nv 202.058983 135.710232 159.600050\nv 201.169613 136.286201 159.701609\nv 163.268900 144.086076 161.076978\nv 164.290980 143.712037 161.011037\nv 161.205443 152.806212 162.614541\nv 160.744302 151.963867 162.466005\nv 160.902056 151.171194 162.326238\nv 160.195967 151.151543 162.322759\nv 161.846028 151.020794 162.299740\nv 165.220354 135.751136 159.607320\nv 163.811748 140.211677 160.393820\nv 163.676887 141.147460 160.558823\nv 162.532979 152.986395 162.646359\nv 162.180675 152.076504 162.485899\nv 161.802695 152.893408 162.629945\nv 164.137521 149.725598 162.071385\nv 164.482873 141.781918 160.670706\nv 167.568299 147.212920 161.628321\nv 165.095999 149.151444 161.970130\nv 166.779410 144.201485 161.097328\nv 166.730017 145.121946 161.259626\nv 167.604872 138.048808 160.012449\nv 201.642149 134.775976 159.435309\nv 202.011004 137.534710 159.921753\nv 202.810073 143.348621 160.946886\nv 201.967347 143.200368 160.920761\nv 202.575615 150.814240 162.263317\nv 202.526492 149.880371 162.098647\nv 203.508715 142.742120 160.839958\nv 204.010209 147.729960 161.719447\nv 203.984525 146.748001 161.546292\nv 194.045708 143.826598 161.031189\nv 194.331189 144.813172 161.205143\nv 193.751460 143.096737 160.902497\nv 194.499802 145.672208 161.356613\nv 193.467712 153.676108 162.767929\nv 193.623950 145.412957 161.310903\nv 191.697099 146.230273 161.455038\nv 191.880058 146.936648 161.579590\nv 192.818806 145.088229 161.253653\nv 192.594942 144.293741 161.113562\nv 193.161089 143.824060 161.030740\nv 192.300694 143.563880 160.984870\nv 191.953387 136.141520 159.676102\nv 191.130399 136.209886 159.688157\nv 192.664990 153.735587 162.778430\nv 168.958283 153.687789 162.769997\nv 170.023257 151.296257 162.348310\nv 169.645518 136.010670 159.653040\nv 170.871165 136.110497 159.670641\nv 169.993634 139.737705 160.310204\nv 169.245380 139.138494 160.204571\nv 168.368607 138.680193 160.123783\nv 168.076904 153.534950 162.743032\nv 169.284586 136.582251 159.753829\nv 166.798842 153.416422 162.722147\nv 168.350823 144.973740 161.233481\nv 167.550881 145.488544 161.324274\nv 168.382104 147.541790 161.686295\nv 166.825151 152.174471 162.503146\nv 150.411124 132.314241 159.001266\nv 148.716312 141.562043 160.631887\nv 151.634854 132.673389 159.064566\nv 147.564030 146.964860 161.584559\nv 146.709518 147.246200 161.634164\nv 152.213677 133.339336 159.181995\nv 149.639473 141.253561 160.577502\nv 148.107024 147.683900 161.711354\nv 150.610787 141.066190 160.544469\nv 149.844977 140.324665 160.413707\nv 150.325185 139.522674 160.272296\nv 151.008856 139.193463 160.214247\nv 151.703463 139.784210 160.318427\nv 152.826468 136.675708 159.770316\nv 152.117370 136.903006 159.810386\nv 151.535638 140.758905 160.490289\nv 149.719479 147.637226 161.703121\nv 154.877876 137.821219 159.972318\nv 153.436274 138.918272 160.165751\nv 153.359865 139.925640 160.343382\nv 153.192041 140.900335 160.515243\nv 152.422811 140.405822 160.428042\nv 152.030414 148.281385 161.816686\nv 151.523149 147.562904 161.690006\nv 150.207618 149.889054 162.100158\nv 150.486767 151.076029 162.309444\nv 149.505692 150.832056 162.266445\nv 151.264177 151.261627 162.342190\nv 152.167813 151.277998 162.345103\nv 152.937316 144.381197 161.128999\nv 152.998576 151.454026 162.376131\nv 156.964120 139.071593 160.192795\nv 154.882530 144.266954 161.108857\nv 157.337001 141.818549 160.677132\nv 160.918451 134.877616 159.453256\nv 157.932017 152.408270 162.544386\nv 190.813353 139.511478 160.270331\nv 190.133932 137.102232 159.845507\nv 190.583114 136.250413 159.695311\nv 189.674143 136.322368 159.708006\nv 191.870274 153.828975 162.794892\nv 190.683039 152.263440 162.518823\nv 189.384804 146.009348 161.416069\nv 188.721038 140.682750 160.476860\nv 187.485951 136.382512 159.718604\nv 188.581383 136.381893 159.718499\nv 186.960176 136.406087 159.722754\nv 188.082037 139.902485 160.339268\nv 189.161829 153.977426 162.821056\nv 188.784347 146.363320 161.478483\nv 188.083403 148.850337 161.917017\nv 186.748486 138.251179 160.048091\nv 187.403814 139.152202 160.206966\nv 188.363292 154.036965 162.831557\nv 187.203154 145.288732 161.289012\nv 188.036584 145.784455 161.376417\nv 186.046091 154.249566 162.869048\nv 186.835731 150.975527 162.291745\nv 186.428496 150.248440 162.163539\nv 186.420484 144.908002 161.221874\nv 184.963047 136.704699 159.775411\nv 185.963799 137.445060 159.905965\nv 186.033345 136.435063 159.727858\nv 185.812325 153.448112 162.727732\nv 185.316634 154.116438 162.845576\nv 185.733595 148.102653 161.785176\nv 185.744915 149.713058 162.069136\nv 184.294300 136.713946 159.777059\nv 184.243640 138.323036 160.060782\nv 184.155283 139.435866 160.257001\nv 184.202321 145.769644 161.373813\nv 184.886564 145.989121 161.412506\nv 184.917858 146.878615 161.569349\nv 184.899645 147.755372 161.723943\nv 183.774696 154.057736 162.835220\nv 182.468322 154.070408 162.837447\nv 183.766340 152.413841 162.545357\nv 184.057581 153.245353 162.691977\nv 182.389942 150.404102 162.190974\nv 182.509881 146.410746 161.486846\nv 183.154690 146.955270 161.582865\nv 183.484446 145.985072 161.411793\nv 184.111042 147.406353 161.662407\nv 182.396547 136.587950 159.754840\nv 183.328294 136.578573 159.753189\nv 183.927495 137.579323 159.929647\nv 183.296703 139.733781 160.309531\nv 181.326646 148.123930 161.788924\nv 181.391001 149.168362 161.973083\nv 181.260519 139.268695 160.227522\nv 181.302701 153.941968 162.814797\nv 180.343476 153.938867 162.814244\nv 181.440747 150.117537 162.140448\nv 179.786734 153.185874 162.681472\nv 179.429158 154.205900 162.861323\nv 180.522913 149.816091 162.087297\nv 179.531974 146.831370 161.561007\nv 179.559101 139.628242 160.290916\nv 178.375669 154.194267 162.859271\nv 177.962596 153.169914 162.678656\nv 177.465849 153.911275 162.809376\nv 177.182981 151.852892 162.446434\nv 177.969564 152.319926 162.528782\nv 178.118905 148.538627 161.862042\nv 177.901441 136.371778 159.716706\nv 176.681987 146.629530 161.525425\nv 177.123226 136.445853 159.729771\nv 177.406517 137.119037 159.848477\nv 176.509352 141.904132 160.692205\nv 175.179508 153.944702 162.815286\nv 174.380589 153.918556 162.810686\nv 176.206335 153.876658 162.803279\nv 173.325087 145.219472 161.276788\nv 173.276095 144.310396 161.116496\nv 172.865842 137.871660 159.981176\nv 173.204491 138.655088 160.119324\nv 174.288147 136.367209 159.715908\nv 175.010891 138.708911 160.128820\nv 174.476138 139.471600 160.263302\nv 173.345376 153.799328 162.789664\nv 172.489526 153.755451 162.781912\nv 172.449493 144.169482 161.091643\nv 173.082345 136.301859 159.704372\nv 173.679825 139.315475 160.235764\nv 172.751779 139.287638 160.230847\nv 171.541652 153.996623 162.824438\nv 171.620738 146.319474 161.470754\nv 172.455573 145.830648 161.384542\nv 171.952666 139.473436 160.263627\nv 171.705905 136.220660 159.690082\nv 172.203781 136.253184 159.695805\nv 172.576676 137.067395 159.839378\nv 171.987278 137.822985 159.972609\nv 170.972122 137.871032 159.981077\nv 171.261288 138.675297 160.122875\nv 170.937510 139.521482 160.272095\nv 170.863371 136.908558 159.811369\nv 218.761597 120.208707 230.244835\nv 218.754630 119.786454 230.983779\nv 218.760297 123.355711 231.882992\nv 218.760821 122.886784 230.921463\nv 218.761597 121.632508 229.237179\nv 218.761597 122.366833 230.102422\nv 218.761597 120.619031 229.299061\nv 218.761597 120.971874 228.434319\nv 218.708434 119.283680 232.118701\nv 218.737975 123.838966 232.796178\nv 218.726950 124.574544 233.793566\nv 218.749524 125.127434 233.023372\nv 218.750048 126.675261 233.513118\nv 218.761597 124.349927 229.698673\nv 218.761548 127.527453 230.131991\nv 218.761597 128.162247 230.760648\nv 218.761185 126.859147 232.476075\nv 218.761597 121.349127 227.523640\nv 218.761597 138.649077 234.660495\nv 218.761597 136.253835 234.054293\nv 218.761597 137.110260 233.809366\nv 218.761548 126.814668 229.476782\nv 218.761597 138.915179 233.972194\nv 218.761597 138.032875 233.223037\nv 218.761597 138.971303 232.797642\nv 218.761597 135.056167 230.908635\nv 218.761597 134.338423 231.547017\nv 218.761597 133.466055 231.224302\nv 218.761597 130.577495 162.973821\nv 218.761597 130.161076 160.428704\nv 218.761597 132.194144 161.846216\nv 218.761597 134.129273 161.187011\nv 218.761597 131.942076 160.913152\nv 218.761597 130.061429 159.544701\nv 218.761597 130.706323 163.765968\nv 218.761597 130.760569 164.536167\nv 218.761597 139.016521 164.792086\nv 218.761597 140.022938 164.512565\nv 218.761597 139.815952 165.303098\nv 218.761597 148.872692 163.588503\nv 218.761597 143.603413 165.217139\nv 218.761597 143.375164 166.041675\nv 218.761597 130.975529 165.419083\nv 218.761597 140.616213 165.840474\nv 218.761597 147.027846 166.119279\nv 218.761597 132.620458 167.325433\nv 218.761597 132.509088 168.063767\nv 218.761597 141.397313 166.420167\nv 218.761597 146.364552 168.747846\nv 218.761597 139.077745 168.638668\nv 218.761597 130.904142 169.346077\nv 218.761597 139.731009 169.243190\nv 218.761597 133.922858 170.113539\nv 218.761597 149.459790 168.217979\nv 218.761597 130.800547 170.044039\nv 218.761597 149.370362 171.150435\nv 218.761597 134.176706 170.847729\nv 218.761597 132.813878 173.172672\nv 218.761597 131.842534 172.709004\nv 218.761597 131.009588 172.128811\nv 218.761597 139.111886 170.908136\nv 218.761597 147.619172 171.574593\nv 218.761597 131.038450 173.064187\nv 218.761597 136.401882 172.263398\nv 218.761597 131.052311 175.129621\nv 218.761597 131.049601 174.264466\nv 218.761597 131.874106 174.509535\nv 218.761597 139.474194 174.980353\nv 218.761597 139.713592 175.876827\nv 218.761597 135.369806 173.700044\nv 218.761597 141.710889 225.513444\nv 218.761597 141.510027 226.178693\nv 218.761597 141.222826 226.955129\nv 218.761597 140.552350 226.349024\nv 218.761597 124.513259 226.827133\nv 218.761597 128.137788 227.465247\nv 218.761597 129.732436 228.879132\nv 218.761597 124.515005 224.410385\nv 218.761597 124.989020 223.209980\nv 218.761597 123.536766 223.929413\nv 218.761597 140.066959 230.231242\nv 218.761597 140.381899 229.449351\nv 218.761597 131.831236 226.688564\nv 218.761597 134.281026 226.545813\nv 218.761597 134.389783 225.643056\nv 218.761597 139.649449 226.322239\nv 218.761597 139.936651 225.545802\nv 218.761597 131.492910 223.843177\nv 218.761597 132.111713 223.323624\nv 218.761597 137.475056 224.594410\nv 218.761597 138.483496 224.613784\nv 218.761597 149.262067 175.520279\nv 218.761597 141.958854 175.918990\nv 218.761597 140.902941 175.862430\nv 218.761597 131.044007 175.792196\nv 218.761597 134.456020 176.800501\nv 218.761597 133.626299 177.056417\nv 218.761597 132.694625 177.581299\nv 218.761597 142.269052 176.749316\nv 218.761597 141.722787 177.467632\nv 218.761597 144.786787 176.304565\nv 218.761597 131.052804 176.663776\nv 218.761597 149.110526 178.483084\nv 218.761597 149.088004 179.360384\nv 218.761597 132.619511 179.377217\nv 218.761597 132.660965 178.499889\nv 218.761597 139.635352 179.091008\nv 218.761597 140.599250 179.049206\nv 218.761597 140.083646 179.932358\nv 218.761597 141.600802 179.083984\nv 218.761597 141.152507 178.242634\nv 218.761597 144.269260 179.387650\nv 218.761597 130.970923 179.487814\nv 218.761597 131.798203 179.826299\nv 218.761597 134.971640 179.758880\nv 218.761597 134.299901 180.172025\nv 218.761597 130.942034 180.359085\nv 218.761597 138.746326 180.800824\nv 218.761597 139.598055 180.768043\nv 218.761597 144.885644 180.997236\nv 218.761597 146.093997 181.823801\nv 218.761597 145.844918 181.095234\nv 218.761597 148.217352 179.847970\nv 218.761597 149.275355 182.839124\nv 218.761597 149.329833 181.723302\nv 218.761597 148.495756 181.402160\nv 218.761597 147.800065 181.980225\nv 218.761597 143.208350 183.220795\nv 218.761597 148.115732 182.745574\nv 218.761597 142.752342 183.966777\nv 218.761597 142.288285 184.708696\nv 218.761597 147.015529 184.112295\nv 218.760862 130.478093 182.723208\nv 218.761597 132.842836 183.312698\nv 218.761597 141.931073 185.521934\nv 218.761597 139.291473 185.197043\nv 218.761597 139.623308 185.952455\nv 218.761597 148.861000 187.473597\nv 218.760911 131.375555 185.988405\nv 218.760935 131.777628 186.799838\nv 218.761597 145.686506 186.956928\nv 218.761597 141.786608 187.781230\nv 218.761597 148.721588 188.501087\nv 218.755582 130.445201 186.025027\nv 218.760935 130.359103 187.009277\nv 218.760935 131.152676 187.385404\nv 218.761597 130.442972 187.746527\nv 218.761597 130.359022 188.690527\nv 218.761597 130.323971 189.510428\nv 218.761597 139.151601 191.428718\nv 218.761597 141.592421 190.547219\nv 218.761597 141.594354 191.495450\nv 218.761597 132.646743 190.978646\nv 218.761597 144.974932 192.421466\nv 218.761597 139.845158 193.296440\nv 218.761597 145.772418 192.949742\nv 218.761597 144.914507 193.379338\nv 218.761597 131.274095 193.348613\nv 218.761597 130.547059 193.182168\nv 218.761597 135.023271 193.838953\nv 218.761597 143.303406 196.689077\nv 218.761597 145.882165 197.175194\nv 218.761597 129.828173 193.532522\nv 218.761597 129.692776 194.515847\nv 218.761597 137.511243 197.450806\nv 218.761597 137.033488 198.078386\nv 218.761597 125.601463 220.381097\nv 218.761597 126.675486 220.516987\nv 218.761597 135.802749 224.048617\nv 218.761597 136.715581 224.584783\nv 218.761597 127.588533 220.698835\nv 218.761597 127.317025 219.766840\nv 218.761597 139.484507 224.538680\nv 218.761597 127.030561 218.845211\nv 218.761597 126.696267 217.848567\nv 218.761597 133.476618 220.527994\nv 218.761597 141.069761 221.975912\nv 218.761597 140.847187 223.087955\nv 218.761597 134.352461 220.113385\nv 218.761597 125.080271 216.714252\nv 218.761597 126.529806 216.989100\nv 218.761597 127.490682 217.245963\nv 218.761597 134.471237 219.073712\nv 218.761597 129.713238 217.624255\nv 218.761597 130.765257 217.719117\nv 218.761597 125.846191 216.585719\nv 218.761597 126.640606 215.983115\nv 218.761597 127.976189 216.665272\nv 218.761597 126.703130 210.532898\nv 218.761597 128.222592 211.101552\nv 218.761597 126.153417 212.851020\nv 218.761597 129.641408 212.909941\nv 218.761597 130.369757 214.254598\nv 218.761597 129.522476 214.551386\nv 218.761597 129.595616 213.702834\nv 218.761597 141.423367 215.197742\nv 218.761597 141.477744 215.919574\nv 218.761597 141.286652 214.348884\nv 218.761597 144.237253 216.359842\nv 218.761597 144.056759 217.190108\nv 218.761597 144.464776 215.436292\nv 218.761597 143.867107 217.959955\nv 218.761597 140.977115 216.647123\nv 218.761597 126.037831 214.857388\nv 218.761597 125.398120 214.961543\nv 218.761597 143.602860 218.821198\nv 218.761597 125.191072 215.708267\nv 218.761597 126.637638 215.177876\nv 218.761597 128.999179 198.071164\nv 218.761597 137.000837 199.686442\nv 218.761597 136.959526 198.836375\nv 218.761597 138.459638 200.160773\nv 218.761597 147.478463 200.981131\nv 218.761597 147.236173 201.610893\nv 218.761597 147.085037 202.571030\nv 218.761597 146.619338 203.268029\nv 218.761597 128.798256 199.303239\nv 218.761597 129.587163 199.441497\nv 218.761597 128.821912 200.074461\nv 218.761597 138.675419 201.029390\nv 218.761597 139.207364 201.507306\nv 218.761597 130.383610 201.532792\nv 218.761597 130.438704 200.586036\nv 218.761597 130.446951 199.479560\nv 218.761597 138.986604 202.230105\nv 218.761597 138.269681 202.785727\nv 218.761597 133.736575 200.691654\nv 218.761597 133.825947 201.598401\nv 218.761597 130.533521 202.749563\nv 218.761597 131.416498 202.176123\nv 218.761597 132.294789 202.427135\nv 218.761597 132.734420 203.276170\nv 218.761597 133.462800 202.310411\nv 218.761597 137.124644 202.438051\nv 218.761597 133.571037 203.845426\nv 218.761597 132.403026 203.962151\nv 218.761597 143.924179 203.522188\nv 218.761597 146.194133 207.432943\nv 218.761597 145.736807 206.791969\nv 218.761597 146.550670 206.820833\nv 218.761597 145.374653 205.316832\nv 218.761597 145.436013 206.027277\nv 218.761597 128.106429 204.614793\nv 218.761597 142.282853 207.327716\nv 218.761597 141.578363 206.725937\nv 218.761597 142.667865 206.533345\nv 218.761597 141.150142 206.097125\nv 218.761597 140.453952 205.363756\nv 218.761597 145.079477 206.639386\nv 218.761597 129.552932 205.703799\nv 218.761597 128.944146 205.195365\nv 218.761597 140.765130 206.891495\nv 218.761597 128.309907 207.071754\nv 218.761597 127.309491 207.278330\nv 218.761597 143.748349 209.758414\nv 218.761597 142.767451 209.727569\nv 218.761597 135.435264 207.572823\nv 218.761597 134.565932 208.355492\nv 218.761597 132.786876 207.546237\nv 218.761597 132.437410 208.297429\nv 218.761597 142.515488 211.017460\nv 218.761597 142.424497 210.367847\nv 218.761597 142.026635 209.575446\nv 218.761597 141.101760 209.674506\nv 218.761597 129.155622 209.762833\nv 218.761597 128.774904 208.849033\nv 218.761597 129.882439 209.031749\nv 218.761597 127.033916 208.486654\nv 218.761597 127.725022 210.386654\nv 218.761597 128.545657 210.295015\nv 218.761597 141.234423 213.548285\nv 145.823126 119.650348 232.925302\nv 144.665579 119.129949 232.833551\nv 144.943021 125.947006 234.035571\nv 143.826914 122.001046 233.339807\nv 144.606723 121.383462 233.230905\nv 144.593660 122.671242 233.457974\nv 217.854266 122.554448 233.437366\nv 217.842717 121.265979 233.210171\nv 216.804286 122.744994 233.470964\nv 216.653670 125.335046 233.927657\nv 217.184422 126.241232 234.087441\nv 218.077832 125.530776 233.962175\nv 218.066283 124.242308 233.734981\nv 145.786222 125.049690 233.877345\nv 146.215285 124.384217 233.760000\nv 146.191082 123.579800 233.618155\nv 146.932241 123.894263 233.673595\nv 145.423797 123.061706 233.526816\nv 147.755562 122.782958 233.477650\nv 148.479721 123.346852 233.577095\nv 147.632198 123.653739 233.631195\nv 215.637563 120.186883 233.019875\nv 214.430860 120.661955 233.103649\nv 214.644203 119.850577 232.960576\nv 216.402069 119.725715 232.938566\nv 216.647617 119.627187 232.921216\nv 215.125958 127.979440 234.393942\nv 144.987508 138.565561 236.260571\nv 147.675377 129.182103 234.606006\nv 148.279161 129.841253 234.722231\nv 149.184868 123.934274 233.680673\nv 149.878108 124.503358 233.781014\nv 151.432398 122.005139 233.340508\nv 149.219205 129.787693 234.712781\nv 150.730555 121.636671 233.275537\nv 149.308233 123.063493 233.527129\nv 218.189187 137.806275 236.126686\nv 214.216712 127.619306 234.330439\nv 150.704853 124.119634 233.713357\nv 150.569581 124.972076 233.863664\nv 151.250902 125.325196 233.925932\nv 150.319523 128.122213 234.419106\nv 149.658373 128.924959 234.560656\nv 148.984300 134.930498 235.619582\nv 147.671447 139.321493 236.393836\nv 147.906662 138.317597 236.216822\nv 150.347937 131.598077 235.031993\nv 151.305833 131.600267 235.032364\nv 151.911587 125.908297 234.028716\nv 153.852185 124.660533 233.808697\nv 148.440799 139.542517 236.432811\nv 148.720770 138.147820 236.186883\nv 149.104956 138.910627 236.321388\nv 149.132754 139.619461 236.446377\nv 154.115710 128.150057 234.423998\nv 152.165594 131.626613 235.037012\nv 155.510275 123.127985 233.538472\nv 155.527518 125.495572 233.955950\nv 209.471764 125.761387 234.002819\nv 209.116807 122.592263 233.444024\nv 209.851937 122.364353 233.403849\nv 209.809351 123.193219 233.549977\nv 209.502689 124.918281 233.854166\nv 210.386333 123.814385 233.659521\nv 209.651203 124.042295 233.699695\nv 210.644715 122.114704 233.359824\nv 211.030311 123.525220 233.608536\nv 216.117334 136.342865 235.868640\nv 213.290351 131.446178 235.005218\nv 216.933546 136.472467 235.891494\nv 214.005171 131.248170 234.970307\nv 215.508239 133.320215 235.335665\nv 211.849136 123.312953 233.571117\nv 212.632338 123.412402 233.588655\nv 212.299343 124.184579 233.724809\nv 211.463540 121.902438 233.322404\nv 211.363306 122.753043 233.472382\nv 212.585367 121.513240 233.253782\nv 213.048190 122.324111 233.396749\nv 212.013580 140.034992 236.519601\nv 207.377911 124.781323 233.830022\nv 206.563672 125.019769 233.872058\nv 205.245418 123.683467 233.636417\nv 208.925707 124.297114 233.744622\nv 208.140552 124.533970 233.786405\nv 154.143771 140.785320 236.651953\nv 155.992611 134.597969 235.560960\nv 156.433528 135.571035 235.732539\nv 156.629125 133.729309 235.407794\nv 155.679883 133.607575 235.386329\nv 154.653274 133.535099 235.373538\nv 155.289788 132.666439 235.220372\nv 153.689141 133.437422 235.356302\nv 156.178085 124.827717 233.838187\nv 156.653241 128.216693 234.435766\nv 151.785593 137.646506 236.098481\nv 210.846401 140.331188 236.571824\nv 210.019248 140.587549 236.617032\nv 210.396908 137.332472 236.043090\nv 208.841328 133.659144 235.395384\nv 209.787650 140.646250 236.627385\nv 209.162950 140.947688 236.680557\nv 206.360649 128.555661 234.495516\nv 206.342046 127.700405 234.344715\nv 206.428353 126.793813 234.184858\nv 206.492470 125.909816 234.028989\nv 204.463599 123.910816 233.676495\nv 207.542415 140.091358 236.529577\nv 206.113934 138.712021 236.286356\nv 202.263682 124.531447 233.785971\nv 203.859136 129.515481 234.664761\nv 204.699423 137.549430 236.081362\nv 204.871059 138.506869 236.250182\nv 205.324054 139.459586 236.418168\nv 203.909543 138.296995 236.213174\nv 205.677100 141.664615 236.807004\nv 201.337519 124.578840 233.794317\nv 201.692007 125.504887 233.957592\nv 203.771844 141.841142 236.838079\nv 204.725845 141.846011 236.838956\nv 203.340321 138.759690 236.294748\nv 203.082173 139.459113 236.418080\nv 202.980466 131.900258 235.085273\nv 202.935602 130.938350 234.915654\nv 203.848848 131.445311 235.005064\nv 202.910124 129.807399 234.716243\nv 202.041742 130.262346 234.796452\nv 159.496790 124.239983 233.734562\nv 158.234371 127.287846 234.271969\nv 157.572249 128.220689 234.436468\nv 156.568538 141.401776 236.760636\nv 157.091123 133.101663 235.297116\nv 156.819658 136.470521 235.891128\nv 157.274763 137.508821 236.074202\nv 157.295736 141.784718 236.828145\nv 159.544305 137.813241 236.127861\nv 159.129250 133.813705 235.422627\nv 162.203797 124.997645 233.868117\nv 159.724758 141.760801 236.823960\nv 160.036011 134.253735 235.500229\nv 163.333514 125.034529 233.874626\nv 162.679660 125.981726 234.041647\nv 163.240537 126.836260 234.192325\nv 160.642446 140.277221 236.562333\nv 161.604702 136.080162 235.822273\nv 161.223721 140.719947 236.640388\nv 160.395942 141.162636 236.718463\nv 163.368510 133.929154 235.442985\nv 163.390182 133.143924 235.304528\nv 164.103173 126.916643 234.206509\nv 165.813678 125.418961 233.942450\nv 165.421329 125.363312 233.932646\nv 164.679716 126.136617 234.068975\nv 164.550990 125.245305 233.911826\nv 163.409801 141.833670 236.836759\nv 163.883634 141.065744 236.701353\nv 164.774820 141.096552 236.706796\nv 166.694604 125.551032 233.965725\nv 164.168383 129.458745 234.654745\nv 164.539648 134.765465 235.590464\nv 167.919953 125.721709 233.995800\nv 167.200038 142.876180 237.020621\nv 166.838702 140.756068 236.646785\nv 165.960806 140.986685 236.687439\nv 167.465303 135.770386 235.767665\nv 167.746294 142.035645 236.872413\nv 167.576794 141.156287 236.717359\nv 169.466319 129.644390 234.687483\nv 169.066107 128.569878 234.498007\nv 169.436518 133.204369 235.315202\nv 169.975380 143.247697 237.086118\nv 169.689360 142.319215 236.922411\nv 169.159920 138.089046 236.176504\nv 169.150321 139.050651 236.346061\nv 169.899091 138.470947 236.243824\nv 169.150977 139.969784 236.508131\nv 171.101432 143.341195 237.102620\nv 171.609478 133.734947 235.408771\nv 170.561696 138.013869 236.163245\nv 171.534143 137.569513 236.084910\nv 172.220984 127.113864 234.241282\nv 172.308403 126.202999 234.080668\nv 172.050953 143.338850 237.102216\nv 172.676558 135.806612 235.774068\nv 171.785591 135.552581 235.729272\nv 173.733746 135.907667 235.791882\nv 174.153655 139.527012 236.430071\nv 173.775081 138.600686 236.266735\nv 172.010775 138.557752 236.259166\nv 174.356918 130.482956 234.835359\nv 176.363478 126.293655 234.096643\nv 176.256394 144.022391 237.222715\nv 175.549944 142.096577 236.883124\nv 176.031225 141.049318 236.698464\nv 176.359875 140.236886 236.555226\nv 177.442340 141.665677 236.807140\nv 178.055127 142.344671 236.926878\nv 176.899320 140.976910 236.685687\nv 178.406080 136.118837 235.829087\nv 179.033536 128.835028 234.544758\nv 178.733689 128.053401 234.406927\nv 179.519436 128.020692 234.401176\nv 179.390342 126.471034 234.127919\nv 179.406628 129.645606 234.687694\nv 179.915755 127.227042 234.261244\nv 180.246965 129.576297 234.675495\nv 190.288597 140.695384 236.636047\nv 189.766704 141.653503 236.804987\nv 189.309835 143.495073 237.129699\nv 190.598531 143.408022 237.114349\nv 188.226725 143.383364 237.109997\nv 189.149658 142.395939 236.935894\nv 187.510073 129.582987 234.676650\nv 186.507118 129.707014 234.698523\nv 187.843772 130.229601 234.790666\nv 186.664211 137.762672 236.118936\nv 185.791639 140.811471 236.656562\nv 186.739577 141.082123 236.704258\nv 187.064099 141.984664 236.863394\nv 186.327821 144.017109 237.221784\nv 187.464120 143.957707 237.211285\nv 187.303943 142.858573 237.017481\nv 186.301495 142.559007 236.964682\nv 186.469565 140.208495 236.550225\nv 185.801529 137.485452 236.070083\nv 185.328075 143.832890 237.189331\nv 185.682492 143.245095 237.085667\nv 186.186921 144.020710 237.222432\nv 183.568705 126.203972 234.080888\nv 184.602897 125.650902 233.983353\nv 183.889020 134.297107 235.507915\nv 183.977436 136.068301 235.820223\nv 183.937089 135.231321 235.672640\nv 183.228136 136.749979 235.940414\nv 184.061870 143.865284 237.195030\nv 181.966377 129.542813 234.669609\nv 182.535383 128.647441 234.511732\nv 181.878668 127.940095 234.387007\nv 183.068629 134.887282 235.611972\nv 181.046276 131.013813 234.928985\nv 181.551192 130.347594 234.811513\nv 180.662150 128.771516 234.533591\nv 180.215602 128.008669 234.399075\nv 181.058470 127.977866 234.393659\nv 182.089776 135.546871 235.728280\nv 182.310549 136.602606 235.914436\nv 181.012845 140.176064 236.544533\nv 180.680086 131.829762 235.072848\nv 180.610695 132.597898 235.208293\nv 182.352211 142.944200 237.032627\nv 181.089832 129.545493 234.670079\nv 202.296647 141.356169 236.752580\nv 203.083596 141.972390 236.861227\nv 202.100151 142.205571 236.902355\nv 200.833672 137.585279 236.087677\nv 201.593120 137.612148 236.092405\nv 201.290254 136.939925 235.973875\nv 201.427903 142.314076 236.921505\nv 202.681630 140.393390 236.582809\nv 199.312892 127.364226 234.285418\nv 198.787143 126.770650 234.180758\nv 199.406801 128.122864 234.419185\nv 198.397605 136.136744 235.832278\nv 199.300851 139.911578 236.497881\nv 200.440300 142.473523 236.949604\nv 199.451284 142.509549 236.955952\nv 196.720216 125.499693 233.956689\nv 197.814183 127.040796 234.228404\nv 196.037151 132.333569 235.161660\nv 196.749341 131.807774 235.068957\nv 195.547586 128.650528 234.512238\nv 195.722787 125.491648 233.955259\nv 194.493562 125.662997 233.985437\nv 195.233573 124.752251 233.824871\nv 196.905044 142.835598 237.013457\nv 194.026570 126.498391 234.132740\nv 194.777425 128.791089 234.537003\nv 193.688656 134.831251 235.602060\nv 193.760289 134.011613 235.457533\nv 193.202029 133.394579 235.348733\nv 193.770227 128.834044 234.544571\nv 193.537356 125.758993 234.002352\nv 192.348659 125.890520 234.025553\nv 192.900338 132.623548 235.212785\nv 194.942666 141.917505 236.851574\nv 194.302851 142.365668 236.930600\nv 193.492751 142.715704 236.992312\nv 193.829541 143.570698 237.143078\nv 192.467987 131.929835 235.090463\nv 191.907540 131.441356 235.004328\nv 192.871813 143.266809 237.089484\nv 190.431396 133.003127 235.279715\nv 191.231459 130.645237 234.863959\nv 191.749659 143.360105 237.105910\nv 192.222743 140.594256 236.618237\nv 188.981404 126.295532 234.096998\nv 189.806766 126.503269 234.133620\nv 189.545920 127.395602 234.290967\nv 143.853041 119.425484 232.885669\nv 143.801906 120.516099 232.363966\nv 143.814970 119.228318 232.136897\nv 143.761597 121.525233 227.139521\nv 143.761597 121.010125 227.808395\nv 143.761597 122.054058 227.681222\nv 143.761597 120.697148 229.295920\nv 143.761597 121.487371 229.222921\nv 143.761597 120.748727 228.423095\nv 143.761597 122.239328 229.556068\nv 143.761597 122.290908 228.683243\nv 143.761597 122.806015 228.014369\nv 143.761597 126.781471 231.396641\nv 143.761597 130.963537 161.090486\nv 143.761597 130.222652 161.054613\nv 143.761597 130.034809 159.387758\nv 143.761597 136.597950 160.722269\nv 143.761597 131.803675 161.223372\nv 143.761597 131.957953 162.015701\nv 143.761597 131.278254 162.664224\nv 143.761597 130.590549 163.207276\nv 143.761597 146.286675 163.551022\nv 143.761597 147.275689 163.770351\nv 143.761597 141.893750 163.360331\nv 143.761597 142.224223 164.183383\nv 143.761597 141.855392 164.929149\nv 143.761597 132.801515 164.452003\nv 143.761597 133.248605 165.252099\nv 143.761597 138.250976 164.063671\nv 143.761597 138.531390 164.861674\nv 143.761597 132.765773 165.823278\nv 143.761597 147.374833 164.642979\nv 143.761597 141.789677 165.691320\nv 143.761597 137.194521 165.958575\nv 143.761597 137.864327 165.401802\nv 143.761597 130.892329 167.901750\nv 143.761597 132.679710 169.120095\nv 143.761597 132.752474 169.989757\nv 143.761597 146.053743 168.907869\nv 143.761597 130.771324 167.001555\nv 143.761597 132.383948 166.648830\nv 143.761597 137.501510 166.822510\nv 143.761597 147.206192 165.333533\nv 143.761597 147.136792 166.316815\nv 143.761597 122.854132 226.037255\nv 143.761597 123.542263 226.531709\nv 143.761597 123.827231 225.556617\nv 143.761597 121.756835 226.547671\nv 143.761597 125.158821 228.206383\nv 143.761597 124.537086 228.828132\nv 143.761597 123.700039 228.431685\nv 143.761597 123.463190 227.429664\nv 143.761597 131.867536 232.330609\nv 143.761597 132.326526 231.628607\nv 143.761597 134.929014 233.483313\nv 143.761597 134.424264 234.142354\nv 143.761597 138.900302 233.869777\nv 143.761597 137.961857 233.704841\nv 143.761597 122.041802 225.572578\nv 143.761597 129.961924 229.703483\nv 143.761597 125.821853 227.805647\nv 143.761597 126.723044 227.895099\nv 143.761597 126.584471 227.134960\nv 143.761597 127.594113 228.183771\nv 143.761597 139.985095 230.548022\nv 143.761597 139.710742 231.312274\nv 143.761597 137.773056 232.051331\nv 143.761597 138.709993 231.820502\nv 143.761597 136.590372 230.499749\nv 143.761597 136.871096 229.785058\nv 143.761597 134.984744 227.108141\nv 143.761597 136.661073 228.994510\nv 143.761597 137.418336 229.066581\nv 143.761597 137.888937 227.605048\nv 143.761597 137.538964 226.574766\nv 143.761597 138.453232 229.379063\nv 143.761597 138.243209 228.588515\nv 143.761597 140.392051 228.865896\nv 143.761597 140.153755 229.586095\nv 143.761597 139.782940 228.138996\nv 143.761597 138.923834 227.917530\nv 143.761597 122.805210 223.703643\nv 143.761597 123.230698 222.521253\nv 143.761597 122.428863 224.565370\nv 143.761597 131.031018 177.944834\nv 143.761597 130.985257 178.864118\nv 143.761597 132.787513 175.502104\nv 143.761597 137.038383 175.638593\nv 143.761597 136.630276 174.819929\nv 143.761597 149.414038 173.469014\nv 143.761597 137.675303 173.096418\nv 143.761597 138.078251 173.887383\nv 143.761597 137.423963 174.411629\nv 143.761597 136.450763 174.133290\nv 143.761597 149.372590 171.776147\nv 143.761597 148.548431 172.444860\nv 143.761597 149.415434 172.583020\nv 143.761597 146.015108 173.279956\nv 143.761597 146.982296 173.502023\nv 143.761597 131.073784 171.429016\nv 143.761597 131.039144 170.536564\nv 143.761597 134.840235 171.956556\nv 143.761597 133.782612 172.444470\nv 143.761597 139.569151 171.938660\nv 143.761597 136.576614 173.077888\nv 143.761597 149.361993 171.329240\nv 143.761597 149.363388 170.474236\nv 143.761597 148.506982 170.782983\nv 143.761597 133.689378 170.563008\nv 143.761597 134.670519 170.975734\nv 143.761597 138.482923 170.255413\nv 143.761597 137.419871 170.036154\nv 143.761597 142.348057 169.409652\nv 143.761597 149.333488 169.216843\nv 143.761597 149.439880 168.482406\nv 143.761597 149.432082 168.153449\nv 143.761597 133.553972 177.930923\nv 143.761597 149.332860 180.077670\nv 143.761597 141.062191 178.042515\nv 143.761597 143.889070 179.594918\nv 143.761597 144.244949 180.478037\nv 143.761597 144.212450 178.710663\nv 143.761597 145.120925 180.488373\nv 143.761597 140.525590 180.433651\nv 143.761597 141.464111 180.452630\nv 143.761597 132.532736 180.178925\nv 143.761597 130.788776 180.478610\nv 143.761597 131.625557 180.195503\nv 143.761597 130.951283 179.744093\nv 143.761597 134.242423 181.213612\nv 143.761597 130.754875 181.356711\nv 143.761597 149.296235 180.886695\nv 143.761597 148.616736 181.116176\nv 143.761597 149.383451 181.594433\nv 143.761597 147.858063 180.990043\nv 143.761597 149.350023 182.279358\nv 143.761597 149.025008 182.997922\nv 143.761597 148.378937 182.542479\nv 143.761597 145.185808 183.112151\nv 143.761597 147.945278 181.697782\nv 143.761597 133.478443 182.024657\nv 143.761597 149.004062 183.427171\nv 143.761597 140.022622 182.786666\nv 143.761597 140.158280 185.086960\nv 143.761597 137.171078 183.940591\nv 143.761597 130.736414 184.842013\nv 143.761597 130.664909 185.725190\nv 143.761597 143.343591 183.169741\nv 143.761597 142.998551 184.042672\nv 143.761597 141.121736 184.762872\nv 143.761597 142.082522 184.295435\nv 143.761597 149.070603 184.393815\nv 143.761597 148.982304 185.698018\nv 143.761597 148.982031 186.653678\nv 143.761597 148.918334 187.547622\nv 143.761597 142.717746 185.090927\nv 143.761597 145.586576 190.018667\nv 143.761597 139.512841 186.876107\nv 143.761597 141.761715 187.823377\nv 143.761597 141.390548 188.724291\nv 143.761597 133.307177 187.325889\nv 143.761597 132.599110 188.033356\nv 143.761597 132.264417 187.320795\nv 143.761597 133.154240 188.843144\nv 143.761597 134.100942 188.863443\nv 143.761597 148.578696 191.135930\nv 143.761597 148.326239 191.885390\nv 143.761597 140.760498 190.527687\nv 143.761597 141.085488 189.571944\nv 143.761597 142.032043 189.349732\nv 143.761597 132.125075 190.456559\nv 143.761597 132.564763 191.256263\nv 143.761597 148.342960 192.696861\nv 143.761597 148.225315 193.722656\nv 143.761597 143.713544 191.321088\nv 143.761597 143.447399 192.268925\nv 143.761597 142.350103 192.457822\nv 143.761597 129.935887 193.051330\nv 143.761597 130.050884 192.039344\nv 143.761597 148.184728 194.643375\nv 143.761597 148.077024 195.582180\nv 143.761597 138.144437 194.729562\nv 143.761597 129.807602 193.933825\nv 143.761597 142.326079 196.730197\nv 143.761597 142.339275 195.857901\nv 143.761597 129.672122 194.917194\nv 143.761597 129.518571 197.222078\nv 143.761597 129.687296 196.048528\nv 143.761597 123.606142 221.684452\nv 143.761597 123.843466 220.966454\nv 143.761597 135.680070 224.438044\nv 143.761597 135.641778 225.462971\nv 143.761597 135.697751 223.381448\nv 143.761597 135.777973 222.398973\nv 143.761597 124.240807 220.017348\nv 143.761597 127.219633 220.951425\nv 143.761597 126.577751 219.952633\nv 143.761597 140.558853 224.908766\nv 143.761597 139.772859 224.898437\nv 143.761597 126.275358 218.980846\nv 143.761597 126.135168 218.017912\nv 143.761597 124.419393 218.067861\nv 143.761597 128.556220 220.220262\nv 143.761597 128.309906 221.122488\nv 143.761597 140.939831 221.423640\nv 143.761597 142.668401 221.966336\nv 143.761597 142.329379 223.133789\nv 143.761597 124.051626 217.072472\nv 143.761597 142.932533 220.857875\nv 143.761597 141.938941 221.035314\nv 143.761597 141.203963 220.315179\nv 143.761597 126.865288 217.201774\nv 143.761597 130.874540 216.779672\nv 143.761597 134.057241 217.918069\nv 143.761597 136.431042 218.754204\nv 143.761597 140.285765 219.715933\nv 143.761597 134.837464 217.378608\nv 143.761597 137.945657 218.809701\nv 143.761597 137.136758 219.187330\nv 143.761597 143.180635 219.941175\nv 143.761597 143.807960 219.140207\nv 143.761597 142.830399 219.125885\nv 143.761597 125.713687 213.542431\nv 143.761597 130.755397 215.867174\nv 143.761597 133.264199 215.171379\nv 143.761597 134.064162 215.854516\nv 143.761597 134.585246 216.421726\nv 143.761597 142.701258 218.045202\nv 143.761597 126.151715 212.621158\nv 143.761597 129.256912 213.996030\nv 143.761597 130.158300 214.536716\nv 143.761597 129.564139 212.892769\nv 143.761597 132.361174 215.441516\nv 143.761597 131.579327 215.554037\nv 143.761597 130.879373 215.147306\nv 143.761597 130.982229 214.223578\nv 143.761597 134.637301 212.922204\nv 143.761597 142.725117 217.175787\nv 143.761597 142.780087 216.284922\nv 143.761597 143.512684 215.856774\nv 143.761597 144.432780 215.889492\nv 143.761597 128.193272 211.416972\nv 143.761597 134.042041 211.607794\nv 143.761597 134.738288 211.964426\nv 143.761597 143.360559 203.645609\nv 143.761597 129.172460 198.332761\nv 143.761597 130.910752 199.000826\nv 143.761597 130.533169 199.769422\nv 143.761597 131.532603 199.584578\nv 143.761597 138.296882 200.338714\nv 143.761597 138.092196 199.588182\nv 143.761597 147.398561 199.803196\nv 143.761597 147.617848 198.980320\nv 143.761597 130.257430 198.074987\nv 143.761597 138.714136 198.906133\nv 143.761597 142.593855 198.314556\nv 143.761597 142.450892 197.428843\nv 143.761597 141.804421 198.048869\nv 143.761597 140.952227 197.843821\nv 143.761597 146.494960 197.417707\nv 143.761597 131.651224 210.456830\nv 143.761597 127.061493 208.927191\nv 143.761597 131.466543 207.661050\nv 143.761597 135.106371 208.778839\nv 143.761597 136.052140 209.010697\nv 143.761597 132.398683 207.981688\nv 143.761597 137.612214 202.712733\nv 143.761597 132.775911 201.718707\nv 143.761597 128.319552 202.700321\nv 143.761597 128.174027 203.583310\nv 143.761597 129.048381 203.087524\nv 143.761597 131.229286 201.606399\nv 143.761597 130.642396 202.237361\nv 143.761598 146.877401 204.478238\nv 143.761597 143.122494 204.681259\nv 143.761597 144.629330 206.013936\nv 143.761597 133.369552 204.026159\nv 143.761597 146.131335 207.368197\nv 143.761597 147.120098 206.799430\nv 143.761597 145.979350 208.289549\nv 143.761597 145.220686 207.608239\nv 143.761597 144.489899 206.939403\nv 143.761597 137.918282 205.930834\nv 143.761597 140.940190 207.934391\nv 143.761597 141.161310 207.039039\nv 143.761597 133.366705 204.978231\nv 143.761597 127.599399 206.028831\nv 143.761597 144.920303 209.356945\nv 143.761597 145.663403 209.951303\nv 143.761597 145.811801 209.123949\nv 143.761597 144.032060 209.594100\nv 199.949815 147.793318 222.131513\nv 205.232407 147.250275 220.881390\nv 204.376385 147.201774 221.690392\nv 200.433114 152.725017 194.166331\nv 200.410791 152.617604 195.145816\nv 144.828184 149.218175 161.981873\nv 144.828184 147.932182 161.755116\nv 143.761597 137.470029 235.332712\nv 143.761597 136.848715 235.957844\nv 193.468747 135.253303 160.214130\nv 192.880693 135.342017 160.769759\nv 218.761597 132.569867 174.030214\nv 143.802471 121.313287 232.502349\nv 143.764400 121.116121 231.753576\nv 143.761597 132.765127 230.936169\nv 143.761597 132.690367 182.829961\nv 143.761597 135.566502 226.264516\nv 145.424356 147.671439 206.388257\nv 145.459099 147.763206 205.953528\nv 208.113327 151.821101 191.436917\nv 218.761597 136.848715 235.957844\nv 218.337907 137.491775 236.071231\nv 143.761597 131.674090 235.045417\nv 209.120263 128.485667 212.355115\nv 218.761597 131.347422 159.771458\nv 218.761597 144.552174 205.144017\nv 218.761597 144.376313 207.269601\nv 218.761597 139.539481 205.999073\nv 218.761597 139.705641 207.005937\nv 218.761597 129.656283 206.469962\nv 218.761597 129.121902 207.175325\nv 218.761597 128.689725 208.014379\nv 218.761597 127.962908 208.745463\nv 217.016303 124.432853 233.768579\nv 144.244744 137.399641 236.054990\nv 143.761597 131.892169 165.970557\nv 143.761597 135.448141 232.710336\nv 143.761597 139.109446 229.862924\nv 143.761597 140.766878 175.559430\nv 217.849976 147.691939 161.712749\nv 218.761597 142.705189 205.747827\nv 218.761597 131.674090 235.045417\nv 218.761597 137.245340 182.436152\nv 210.786167 143.544173 160.981407\nv 218.761597 132.610461 234.526309\nv 143.761597 129.086777 234.589204\nv 218.137544 135.308413 235.686245\nv 143.761597 141.249734 177.267268\nv 143.761597 141.488454 176.373237\nv 143.761597 140.957947 181.285443\nv 143.761597 140.410419 181.956745\nv 209.923526 134.290617 159.349745\nv 209.143285 134.885133 159.454588\nv 206.115597 133.848194 159.271763\nv 207.186569 133.597137 159.227488\nv 145.976396 147.702825 161.714674\nv 178.879385 152.602919 162.578677\nv 218.719983 120.572149 232.345896\nv 218.680754 119.420670 232.884788\nv 218.749636 126.046897 232.983718\nv 144.652516 120.417730 233.060620\nv 217.665421 123.476622 233.599970\nv 217.822767 120.392533 233.056156\nv 143.761597 139.166404 233.181476\nv 143.761597 137.430310 232.825398\nv 143.761597 139.479949 232.307926\nv 143.761597 147.733218 172.937164\nv 143.761597 129.855366 201.876288\nv 143.761597 129.980936 202.565609\nv 192.067672 135.450464 161.399191\nv 181.125735 136.112469 168.734463\nv 195.581573 124.977517 233.074444\nv 195.624952 125.250814 232.334575\nv 181.306589 136.129621 169.719971\nv 181.361843 136.140122 170.617047\nv 181.209841 136.145121 171.558014\nv 145.689141 130.732235 181.311980\nv 161.713833 141.623705 236.799742\nv 184.799983 154.127368 162.847503\nv 143.761597 148.252772 187.932683\nv 143.761597 148.984647 188.374655\nv 192.847671 135.393754 161.543845\nv 218.761597 132.967747 235.273524\nv 214.864575 131.454926 168.955403\nv 214.806680 131.434789 168.038225\nv 177.150524 127.444080 228.703372\nv 217.927427 145.969262 213.565434\nv 218.761597 135.507079 178.917304\nv 200.350472 136.541612 159.746668\nv 206.597871 133.412374 163.429450\nv 205.171230 133.858328 165.979747\nv 143.761597 147.902429 177.152541\nv 143.761597 147.296132 176.684496\nv 143.761597 146.741505 175.905431\nv 143.761597 146.560526 176.672057\nv 217.811218 119.104064 232.828962\nv 207.537889 133.188205 163.358831\nv 185.800204 129.928353 234.737566\nv 207.476162 134.489890 159.384903\nv 216.647501 130.306743 188.177946\nv 184.334767 125.901583 233.297444\nv 203.498202 147.347376 221.700971\nv 143.761597 137.899263 235.765009\nv 143.761597 138.142372 236.185950\nv 218.342244 139.066826 235.954585\nv 218.612877 137.810043 236.127351\nv 143.936373 137.826380 236.130236\n# 23934 vertices, 0 vertices normals\n\n\nusemtl material_0\nf 5986 5987 5988\nf 5989 5990 5991\nf 5992 5993 5994\nf 5995 5996 5997\nf 5998 5999 6000\nf 6001 6002 6003\nf 6004 6005 6006\nf 6007 6008 6009\nf 6010 6011 6012\nf 6013 6014 6015\nf 6016 6017 6018\nf 6019 6020 6021\nf 6022 6009 6023\nf 6024 6025 6026\nf 6027 6028 6029\nf 6030 6031 6032\nf 6032 6025 6033\nf 6026 6034 6035\nf 6036 6037 6038\nf 6039 6040 6041\nf 6042 6043 6040\nf 6044 6045 6046\nf 6047 6048 6049\nf 6050 6049 6051\nf 6051 6052 6006\nf 6053 6054 6055\nf 6054 6056 6045\nf 6047 6057 6044\nf 6053 6058 6059\nf 6060 6061 6062\nf 6063 6064 6065\nf 6066 6067 6068\nf 6069 6070 6071\nf 6072 6073 6074\nf 6075 6076 6077\nf 6078 6079 6080\nf 6081 6082 6083\nf 6084 6085 6082\nf 6086 6087 6088\nf 6089 6090 6091\nf 6091 6092 6093\nf 6094 6095 6096\nf 6094 6097 6098\nf 6099 6100 6101\nf 6102 6103 6104\nf 6104 6105 6106\nf 6107 6108 6109\nf 6110 6111 6112\nf 6113 6114 6115\nf 6116 6117 6118\nf 6119 6116 6120\nf 6121 6122 6123\nf 6124 6125 6126\nf 6127 6125 6128\nf 6128 6129 6130\nf 6130 6131 6132\nf 6133 6134 6135\nf 6136 6137 6138\nf 6139 6140 6141\nf 6142 6143 6144\nf 6145 6146 6147\nf 6148 6149 6150\nf 6151 6152 6153\nf 6153 6154 6155\nf 5993 6156 6157\nf 6158 6159 6160\nf 6161 6158 6162\nf 6163 6164 6165\nf 6166 6167 6168\nf 6169 6170 6171\nf 6171 6172 6173\nf 6174 6175 6176\nf 6177 6178 6179\nf 6180 6175 6181\nf 5986 6182 6183\nf 6184 6185 6186\nf 6182 6187 6184\nf 6188 6189 6190\nf 6191 6192 6193\nf 6192 6194 6195\nf 6196 6197 6198\nf 6199 6200 6201\nf 6202 6203 6204\nf 6205 6206 6119\nf 6206 6114 6207\nf 6208 6209 6210\nf 6211 6212 6213\nf 6131 6214 6134\nf 6135 6215 6002\nf 6216 6217 6110\nf 6218 6219 6220\nf 6221 6222 6223\nf 6224 6225 6226\nf 6227 6228 6229\nf 6230 6231 6232\nf 6233 6234 6235\nf 6003 6236 6237\nf 6238 6239 6240\nf 6241 6242 6243\nf 6244 6245 6246\nf 6247 6248 6249\nf 6250 6251 6252\nf 6253 6254 6255\nf 6256 6257 6258\nf 6259 6260 6261\nf 6262 6263 6264\nf 6265 6266 6136\nf 6267 6268 6269\nf 6270 6271 6272\nf 6273 6274 6089\nf 6275 6276 6277\nf 6278 6279 6280\nf 6281 6282 6283\nf 6282 6284 6285\nf 6286 6287 6288\nf 6289 6290 6291\nf 6292 6293 6294\nf 6295 6296 6297\nf 6298 6299 6300\nf 6301 6302 6303\nf 6304 6305 6306\nf 6307 6308 6309\nf 6310 6311 6312\nf 6313 6314 6315\nf 6316 6317 6318\nf 6319 6320 6321\nf 6322 6323 6324\nf 6325 6326 6327\nf 6328 6329 6330\nf 6331 6332 6333\nf 6334 6335 6336\nf 6337 6338 6339\nf 6340 6341 6342\nf 6343 6344 6345\nf 6346 6347 6348\nf 6349 6350 6351\nf 6352 6353 6354\nf 6355 6356 6357\nf 6358 6359 6360\nf 6361 6000 6359\nf 6362 6363 6364\nf 6365 6366 6367\nf 6368 6369 6370\nf 6371 6372 6373\nf 6374 6375 6376\nf 6377 6378 6379\nf 6380 6381 6382\nf 6383 6384 6385\nf 6386 6387 6388\nf 6389 6390 6391\nf 6392 6393 6394\nf 6395 6396 6397\nf 6397 6398 6399\nf 6400 6401 6402\nf 6403 6404 6405\nf 6406 6407 6408\nf 6409 6410 6411\nf 6412 6413 6414\nf 6412 6415 6063\nf 6416 6417 6418\nf 6419 6420 6421\nf 6421 6422 6423\nf 6424 6425 6169\nf 6426 6427 6428\nf 6429 6430 6431\nf 6432 6433 6434\nf 6435 6436 6437\nf 6438 6439 6440\nf 6441 6442 6443\nf 6444 6445 6446\nf 6447 6448 6449\nf 6450 6451 6452\nf 6453 6454 6455\nf 6456 6457 6458\nf 6459 6460 6461\nf 6462 6463 6464\nf 6464 6465 6466\nf 6467 6468 6469\nf 6470 6471 6472\nf 6473 6474 6475\nf 6476 6477 6478\nf 6479 6480 6481\nf 6482 6483 6484\nf 6485 6486 6487\nf 6488 6489 6490\nf 6491 6492 6033\nf 6493 6494 6495\nf 6496 6497 6385\nf 6498 6499 6500\nf 6501 6502 6503\nf 6503 6504 6505\nf 6506 6507 6508\nf 6509 6510 6511\nf 6512 6513 6514\nf 6515 6516 6517\nf 6518 6519 6520\nf 6521 6522 6523\nf 6524 6525 6526\nf 6527 6528 6529\nf 6530 6531 6532\nf 6533 6534 6535\nf 6536 6537 6538\nf 6539 6540 6541\nf 6542 6543 6544\nf 6545 6546 6547\nf 6548 6549 6550\nf 6550 6551 6552\nf 6068 6553 6554\nf 6555 6556 6557\nf 6558 6559 6560\nf 6561 6562 6563\nf 6564 6565 6566\nf 6567 6568 6569\nf 6570 5997 6567\nf 6570 6571 6572\nf 6573 6574 6575\nf 6576 6577 6578\nf 6579 6580 6581\nf 6582 6583 6584\nf 6585 6586 6587\nf 6587 6588 6589\nf 6590 6591 5991\nf 6592 6593 6594\nf 6595 6596 6597\nf 6598 6599 6600\nf 6601 6602 6603\nf 6604 6605 6606\nf 6607 6608 6609\nf 6610 6072 6611\nf 6612 6613 6614\nf 6615 6616 6617\nf 6618 6619 6620\nf 6621 6622 6623\nf 6624 6554 6625\nf 6626 6627 6628\nf 6629 6630 6631\nf 6632 6633 6414\nf 6634 6635 6631\nf 6636 6637 6638\nf 6639 6640 6641\nf 6374 6642 6643\nf 6644 6645 6646\nf 6647 6648 6649\nf 6650 6651 6652\nf 6653 6654 6655\nf 6656 6657 6658\nf 6658 6659 6660\nf 6661 6662 6663\nf 6664 6665 6666\nf 6667 6668 6669\nf 6665 6669 6670\nf 6671 6672 6673\nf 6674 6675 6676\nf 6677 6674 6678\nf 6679 6678 6680\nf 6676 6681 6682\nf 6683 6684 6685\nf 6686 6687 6688\nf 6687 6689 6685\nf 6690 6691 6688\nf 6605 6692 6693\nf 6694 6695 6696\nf 6697 6695 6698\nf 6698 6699 6700\nf 6701 6702 6703\nf 6704 6705 6697\nf 6706 6707 6708\nf 6709 6710 6711\nf 6712 6713 6714\nf 6713 6715 6716\nf 6717 6718 6719\nf 6720 6721 6722\nf 6722 6723 6712\nf 6724 6725 6726\nf 6727 6728 6729\nf 6721 6719 6730\nf 6731 6732 6733\nf 6734 6735 6736\nf 6737 6738 6739\nf 6740 6741 6742\nf 6743 6744 6745\nf 6746 6747 6748\nf 6749 6750 6751\nf 6752 6753 6754\nf 6755 6756 6757\nf 6758 6759 6760\nf 6761 6762 6763\nf 6763 6764 6765\nf 6766 6767 6768\nf 6769 6770 6771\nf 6772 6773 6774\nf 6775 6776 6777\nf 6778 6779 6780\nf 6781 6782 6783\nf 6784 6783 6785\nf 6785 6786 6771\nf 6787 6788 6789\nf 6788 6790 6791\nf 6791 6792 6793\nf 6792 6794 6795\nf 6796 6795 6781\nf 6797 6787 6798\nf 6798 6799 6800\nf 6801 6802 6803\nf 6804 6803 6805\nf 6806 6807 6808\nf 6809 6810 6811\nf 6812 6813 6814\nf 6815 6816 6817\nf 6818 6819 6820\nf 6808 6821 6822\nf 6595 6823 6824\nf 6825 6826 6827\nf 6828 6829 6830\nf 6831 6832 6833\nf 6834 6835 6836\nf 6837 6838 6839\nf 6840 6841 6842\nf 6843 6844 6845\nf 6846 6847 6848\nf 6849 6850 6851\nf 6852 6853 6854\nf 6855 6856 6857\nf 6858 6859 6860\nf 6861 6862 6863\nf 6813 6864 6865\nf 6866 6867 6868\nf 6869 6870 6871\nf 6872 6873 6874\nf 6875 6876 6877\nf 6865 6878 6879\nf 6880 6881 6879\nf 6882 6883 6884\nf 6883 6885 6886\nf 6887 6888 6889\nf 6890 6891 6892\nf 6893 6894 6895\nf 6896 6897 6789\nf 6898 6899 6900\nf 6899 6901 6902\nf 6903 6904 6905\nf 6906 6907 6908\nf 6909 6910 6911\nf 6912 6913 6914\nf 6915 6914 6801\nf 6916 6917 6918\nf 6919 6920 6921\nf 6835 6922 6923\nf 6924 6925 6904\nf 6926 6927 6928\nf 6929 6930 6931\nf 6932 6933 6934\nf 6935 6936 6937\nf 6936 6938 6939\nf 6940 6941 6942\nf 6943 6944 6945\nf 6946 6947 6948\nf 6949 6950 6951\nf 6952 6953 6954\nf 6955 6956 6957\nf 6956 6958 6959\nf 6960 6961 6962\nf 6963 6964 6600\nf 6598 6965 6966\nf 6967 6968 6969\nf 6970 6971 6972\nf 6973 6971 6974\nf 6975 6775 6976\nf 6977 6978 6979\nf 6980 6969 6981\nf 6978 6982 6983\nf 6984 6985 6986\nf 6987 6988 6989\nf 6990 6657 6991\nf 6992 6993 6994\nf 6995 6996 6997\nf 6655 6998 6999\nf 7000 7001 7002\nf 6650 7003 7004\nf 7005 7006 7007\nf 7008 7009 7010\nf 7011 7012 7013\nf 7014 6652 7015\nf 7016 7017 7018\nf 7019 7020 7021\nf 7022 7015 6647\nf 7023 7024 7025\nf 7026 6649 6644\nf 7027 7028 7029\nf 7030 7031 6621\nf 7032 7033 7034\nf 7035 7036 7037\nf 7038 7039 7040\nf 7041 7042 7043\nf 7044 6062 7045\nf 7046 7047 6646\nf 7048 7049 7050\nf 7051 7052 7053\nf 7054 7055 7056\nf 7057 7058 7059\nf 7060 7061 7062\nf 7063 7064 7065\nf 7066 7067 7068\nf 6643 7069 7070\nf 7071 6741 7072\nf 7073 7074 7075\nf 7076 6738 7077\nf 7078 7079 7080\nf 7080 6732 7081\nf 7082 6737 7083\nf 7084 7085 7086\nf 7087 7088 7089\nf 7090 7091 7092\nf 7093 7094 7095\nf 7096 7097 7098\nf 7095 7099 7100\nf 7101 7102 7103\nf 7104 6720 7105\nf 7106 7107 7108\nf 7109 6714 7110\nf 7111 7106 7112\nf 7113 7114 7115\nf 7116 6716 7117\nf 7118 7087 7119\nf 7120 7121 7122\nf 7123 7124 7125\nf 7126 7127 7128\nf 7129 7096 7130\nf 7131 7132 7133\nf 7134 7101 7135\nf 7136 7137 7138\nf 7139 7140 7141\nf 7142 7143 7144\nf 7145 7146 7147\nf 7148 7144 7149\nf 7147 7150 7151\nf 7152 7153 6691\nf 7153 7154 6693\nf 7155 7156 7157\nf 7158 7126 7159\nf 7160 7131 7161\nf 7162 7163 7164\nf 7165 7136 7166\nf 6679 7167 7168\nf 7169 7142 7170\nf 6677 7171 7172\nf 7173 7174 7175\nf 7176 7177 7178\nf 7179 7180 7181\nf 7182 7183 7184\nf 7185 7186 7187\nf 7188 7189 7190\nf 7191 7192 7193\nf 7194 7195 7196\nf 7197 7198 6664\nf 7199 7200 6667\nf 7201 7202 7203\nf 7204 7205 7206\nf 7207 7208 7209\nf 7210 7211 7085\nf 7212 7213 7214\nf 7191 7215 7183\nf 7216 7217 7218\nf 7219 7220 7221\nf 7222 7223 7224\nf 7225 7226 7227\nf 7228 7229 7230\nf 7231 7232 7233\nf 7234 7235 7236\nf 7237 7238 7239\nf 7240 7241 7242\nf 7243 7244 7245\nf 7246 7247 7248\nf 7249 6757 7250\nf 7251 7252 7253\nf 7254 7255 7256\nf 7257 7255 7258\nf 7259 7260 7261\nf 7262 7263 7264\nf 7265 7266 7267\nf 7268 7269 7270\nf 6766 7271 7272\nf 7273 7274 7275\nf 7276 7277 7278\nf 7279 7280 7281\nf 7282 7283 7284\nf 7285 7286 7287\n\nusemtl material_1\nf 7288 7289 7290\nf 7291 7292 7293\nf 7294 7295 7296\nf 7297 7298 7299\nf 7300 7301 7302\nf 7303 7304 7305\nf 7306 7307 7308\nf 7309 7310 7311\nf 7312 7313 7314\nf 7314 7315 7316\n\nusemtl material_2\nf 7317 7318 7319\nf 7320 7321 7322\nf 7323 7320 7324\nf 7325 7326 7327\nf 7328 7329 7330\nf 7331 7332 7333\nf 7334 7335 7336\nf 7337 7338 7339\nf 7340 7341 7342\nf 6146 7343 7344\nf 7345 7346 7347\nf 7348 7349 7350\nf 7351 7352 7353\nf 7354 7355 7356\nf 7357 7358 7359\n\nusemtl material_3\nf 7360 7361 7362\nf 7363 6205 7364\nf 7365 7366 7367\nf 7368 7369 7370\nf 7371 7372 7373\nf 7374 7375 7376\nf 7377 7378 7379\nf 7380 7381 7382\nf 7383 7384 7385\nf 7386 7387 7388\nf 7389 7390 7391\nf 7392 7393 7394\nf 7395 7396 7397\nf 7398 7399 7400\nf 7401 7402 7403\nf 7404 7405 7406\nf 7407 7408 7409\nf 7410 7411 7412\n\nusemtl material_1\nf 7413 7414 7415\nf 7416 7417 7418\nf 7419 7420 7421\nf 7422 7423 7424\nf 7425 7426 7427\nf 7428 7429 7430\nf 7431 7432 7433\nf 7434 7435 7436\nf 7437 7438 7439\nf 7440 7441 7442\nf 7443 7444 7445\nf 7446 7447 7448\nf 7449 7450 7451\nf 7452 7453 7454\nf 7455 7456 7457\n\nusemtl material_4\nf 7458 7459 7460\nf 7461 7462 7463\nf 7464 7465 7466\nf 7467 7468 7469\nf 7470 7471 7472\nf 7473 7474 7475\nf 7476 7477 7478\nf 7479 7480 7481\nf 7482 7483 7484\nf 7485 7484 7486\nf 7487 7488 7489\nf 7490 7491 7475\nf 7492 7493 7494\nf 7495 7496 7497\nf 7498 7495 7499\nf 7500 7501 7502\nf 7471 7503 7504\nf 7505 7506 7507\nf 7508 7504 7505\nf 7509 7510 7511\nf 7512 7513 7514\nf 7515 7516 7517\nf 7518 7517 7519\nf 7520 7521 7522\nf 7523 7524 7525\nf 7526 7527 7528\nf 7529 7530 7531\nf 7532 7533 7534\nf 7535 7536 7537\nf 7538 7539 7540\nf 7541 7542 7543\nf 7544 7545 7546\nf 7547 7548 7549\nf 7550 7551 7552\nf 7553 7554 7555\nf 7556 7557 7558\nf 7559 7560 7558\nf 7561 7562 7559\nf 7563 7564 7565\nf 7566 7565 7567\nf 7568 7569 7570\nf 7571 7572 7573\nf 7574 7571 7567\nf 7575 7576 7577\nf 7578 7579 7568\nf 7578 7580 7581\nf 7582 7583 7577\nf 7584 7585 7586\nf 7587 7588 7589\nf 7590 7591 7592\nf 7593 7594 7595\nf 7596 7594 7597\nf 7598 7599 7600\nf 7601 7602 7603\nf 7604 7605 7606\nf 7607 7608 7609\nf 7609 7610 7611\nf 7612 7613 7614\nf 7615 7616 7617\nf 7618 7619 7620\nf 7621 7622 7623\nf 7624 7621 7625\nf 7626 7627 7628\nf 7618 7629 7630\nf 7631 7632 7633\nf 7632 7634 7635\nf 7626 7636 7637\nf 7638 7639 7462\nf 7639 7640 7641\nf 7642 7643 7644\nf 7644 7645 7646\nf 7646 7647 7648\nf 7649 7650 7651\nf 7652 7653 7654\nf 7655 7650 7656\nf 7657 7658 7659\nf 7658 7459 7660\nf 7661 7662 7663\nf 7662 7664 7665\nf 7665 7666 7667\nf 7668 7669 7670\nf 7671 7489 7672\nf 7487 7673 7480\nf 7674 7663 7675\nf 7676 7677 7678\nf 7679 7680 7681\nf 7682 7683 7684\nf 7685 7686 7687\nf 7688 7689 7690\nf 7691 7614 7692\nf 7693 7608 7694\nf 7695 7696 7697\nf 7698 7699 7700\nf 7701 7702 7703\nf 7704 7705 7706\nf 7707 7708 7709\nf 7710 7711 7712\nf 7713 7714 7715\nf 7716 7717 7718\nf 7719 7720 7721\nf 7722 7723 7724\nf 7724 7725 7726\nf 7727 7728 7729\nf 7730 7731 7732\nf 7733 7563 7734\nf 7735 7736 7737\nf 7738 7739 7740\nf 7741 7739 7742\nf 7743 7744 7745\nf 7746 7747 7748\nf 7749 7750 7751\nf 7752 7753 7754\nf 7755 7756 7754\nf 7757 7758 7759\nf 7760 7761 7762\nf 7763 7764 7765\nf 7766 7767 7768\nf 7769 7770 7771\nf 7770 7772 7773\nf 7774 7775 7776\nf 7777 7778 7779\nf 7780 7781 7782\nf 7783 7784 7785\nf 7786 7787 7788\nf 7789 7790 7791\nf 7792 7793 7794\nf 7795 7796 7797\nf 7798 7524 7799\nf 7800 7801 7802\nf 7803 7804 7805\nf 7806 7807 7808\nf 7809 7500 7810\nf 7811 7502 7812\nf 7813 7814 7815\nf 7816 7817 7818\nf 7819 7820 7821\nf 7822 7823 7824\nf 7825 7826 7827\nf 7828 7829 7830\nf 7831 7832 7833\nf 7834 7835 7836\nf 7836 7837 7463\nf 7838 7839 7840\nf 7841 7842 7843\nf 7840 7844 7845\nf 7846 7647 7847\nf 7848 7849 7850\nf 7851 7852 7853\nf 7854 7855 7856\nf 7857 7858 7859\nf 7860 7861 7862\nf 7863 7864 7865\nf 7865 7866 7867\nf 7868 7869 7870\nf 7871 7872 7873\nf 7874 7875 7876\nf 7877 7878 7879\nf 7880 7881 7882\nf 7883 7884 7642\nf 7885 7886 7887\nf 7888 7889 7890\nf 7891 7655 7892\nf 7893 7894 7895\nf 7896 7897 7898\nf 7897 7899 7900\nf 7901 7902 7903\nf 7904 7894 7905\nf 7906 7907 7893\nf 7908 7909 7910\nf 7911 7912 7913\nf 7913 7914 7915\nf 7916 7917 7918\nf 7919 7920 7921\nf 7922 7923 7924\nf 7925 7926 7927\nf 7928 7929 7908\nf 7930 7931 7932\nf 7933 7934 7935\nf 7936 7937 7938\nf 7939 7940 7941\nf 7927 7942 7943\nf 7944 7945 7946\nf 7947 7948 7945\nf 7949 7950 7951\nf 7952 7953 7954\nf 7955 7956 7957\nf 7958 7959 7960\nf 7961 7962 7963\nf 7964 7965 7966\nf 7967 7968 7969\nf 7970 7971 7972\nf 7973 7974 7975\nf 7976 7977 7978\nf 7979 7980 7981\nf 7982 7983 7984\nf 7985 7986 7620\nf 7987 7988 7989\nf 7990 7991 7628\nf 7992 7993 7994\nf 7995 7996 7997\nf 7998 7999 8000\nf 8001 8002 8003\nf 8003 8004 7633\nf 8005 8006 8007\nf 8008 8009 8010\nf 8011 8012 8013\nf 8014 8015 8016\nf 7402 8017 8018\nf 8019 8020 8021\nf 8022 8023 8024\nf 8025 8026 7535\nf 8027 8028 8029\nf 8030 8031 8032\nf 8033 8034 8035\nf 8036 8037 8038\nf 8039 7522 8040\nf 8041 8042 8043\nf 8044 8045 8046\nf 8047 8048 8049\nf 8050 8051 8052\nf 8053 8054 8055\nf 8056 8057 8053\nf 8058 8059 8060\nf 8061 8062 8063\nf 8064 8065 8066\nf 8065 8067 8068\nf 8068 8069 8070\nf 8071 8072 8073\nf 8074 8075 8076\nf 8077 8078 8079\nf 8080 8081 8082\nf 8083 8084 8085\nf 8086 8087 8088\nf 8089 8086 8090\nf 8091 8092 8093\nf 8092 8094 8095\nf 8096 8097 8098\nf 8099 8098 8100\nf 8101 8099 8091\nf 8102 8103 8104\nf 8105 8106 8107\nf 8108 8109 8110\nf 8111 8112 8113\nf 8114 8115 8116\nf 8117 8114 8118\nf 8119 8120 8121\nf 8122 8123 8124\nf 8125 8126 8127\nf 8128 8129 8130\nf 8129 8131 8132\nf 8133 8134 8135\nf 8136 8137 8138\nf 8139 8138 8140\nf 8141 8142 8143\nf 8144 8145 8146\nf 8147 8148 8149\nf 8150 8148 8151\nf 8152 8153 8154\nf 8155 8156 8157\nf 8158 8159 8160\nf 8161 8158 8162\nf 8163 8164 8165\nf 8166 8167 8168\nf 8169 8170 8171\nf 8172 8173 8174\nf 8171 8175 8176\nf 8177 8178 8179\nf 8180 8181 8182\nf 8183 8184 8185\nf 8186 8187 8188\nf 8185 8186 8189\nf 8190 8191 8192\nf 8193 8194 8195\nf 8196 8197 8198\nf 8199 8200 8201\nf 8192 8202 8203\nf 8204 8205 8206\nf 8207 8208 8209\nf 8210 8211 8212\nf 8213 8214 8215\nf 8216 8217 8154\nf 8218 8219 8220\nf 8221 8222 8223\nf 8224 8225 8226\nf 8227 8228 8229\nf 8230 8231 8232\nf 8233 8234 8235\nf 8236 8237 8238\nf 8239 8240 8241\nf 8242 8243 8244\nf 8245 8246 8247\nf 8248 8249 8250\nf 8251 8252 8253\nf 8254 8255 8256\nf 8257 8258 8259\nf 8260 8261 8262\nf 8263 8264 8265\nf 8266 8267 8268\nf 8269 8270 8271\nf 8272 8273 8274\nf 8275 8276 8277\nf 8278 8279 8280\nf 8281 8282 8283\nf 8284 8285 8286\nf 8286 8287 8288\nf 8289 8290 8291\nf 8292 8293 8294\nf 8294 8295 8296\nf 8297 8298 8299\nf 8300 8301 8302\nf 8303 8304 8305\nf 8306 8307 8308\nf 8309 8310 8311\nf 8312 8313 8314\nf 8315 8316 8317\nf 8146 8318 8319\nf 8320 8321 8322\nf 8323 8324 8325\nf 8326 8327 8328\nf 8329 8015 8330\nf 8331 8332 8333\nf 8334 8014 8056\nf 8335 8336 8337\nf 8338 8339 8340\nf 8341 8342 8041\nf 8343 8344 8345\nf 8346 8347 8348\nf 8349 8350 8351\nf 8352 8353 8354\nf 8355 8356 8357\nf 8358 8359 8360\nf 8361 8362 8363\nf 8364 8365 8366\nf 8367 8368 8369\nf 8370 8371 8372\nf 8373 8374 8375\nf 8376 8377 8378\nf 8379 8380 8381\nf 8382 8383 8384\nf 8385 8386 8387\nf 8388 8389 8384\nf 8390 8391 8392\nf 8393 8394 8395\nf 8396 8397 8398\nf 8399 8400 8401\nf 8402 8403 8404\nf 8405 8406 8407\nf 8408 8409 8410\nf 8411 8412 8413\nf 8414 8415 8416\nf 8417 8418 8419\nf 8420 8421 8422\nf 8423 8424 8117\nf 8425 8426 8427\nf 8428 8429 8430\nf 8431 8432 8433\nf 8433 8434 8435\nf 8436 8437 8438\nf 8439 8440 8441\nf 8442 8443 8444\nf 8445 8446 8447\nf 8448 8449 8450\nf 8451 8452 8453\nf 8454 8455 8456\nf 8457 8458 8459\nf 8460 8461 8462\nf 8459 8463 8464\nf 8465 8466 8467\nf 8468 8469 8470\nf 8471 8472 8125\nf 8473 8474 8475\nf 8475 8476 8477\nf 8478 8479 8077\nf 8480 8481 8482\nf 8483 8484 8485\nf 8486 8487 8488\nf 8489 8490 8491\nf 8492 8493 8494\nf 8495 8496 8497\nf 8498 8324 8499\nf 8500 8501 8502\nf 8503 8504 8505\nf 8506 8507 8066\nf 8508 8509 8510\nf 8511 8512 8513\nf 8514 8515 8516\nf 8517 8518 8519\nf 8520 8521 8522\nf 8523 8524 8525\nf 8526 8527 8528\nf 8529 8530 8531\nf 8532 8533 8534\nf 8535 8536 8537\nf 8538 8539 8540\nf 8537 8541 8542\nf 8543 8544 8545\nf 8546 8093 8547\nf 8548 8545 8549\nf 8550 8551 8552\nf 8031 8553 8554\nf 8555 8556 8557\nf 8558 8559 8560\nf 8561 8562 8563\nf 8564 8565 8566\nf 8567 8568 8569\nf 8570 8571 8572\nf 8573 8574 8575\nf 7532 8576 8577\nf 8578 8579 8580\nf 8581 8582 8583\nf 8584 8585 8586\nf 8587 8588 8589\nf 8590 8591 8592\nf 8593 8594 8595\nf 8596 8597 8598\nf 8599 8600 8601\nf 8602 8603 8604\nf 8605 8606 8607\n\nusemtl material_0\nf 8608 8609 8610\nf 8611 8612 8613\nf 8614 6452 8615\nf 8616 6178 8617\nf 8618 8619 5990\nf 8620 8619 6163\nf 6156 8621 6161\nf 8622 8623 5996\nf 8624 8625 5999\nf 8626 8625 6145\nf 8627 8628 8629\nf 8627 6015 8630\nf 6526 8630 8631\nf 8632 8633 8634\nf 8635 6016 8636\nf 8637 6017 8638\nf 6007 8639 8640\nf 6018 8641 8642\nf 8637 8640 6021\nf 8643 8644 8645\nf 8646 8647 6490\nf 8648 8649 8650\nf 8646 8649 8644\nf 8643 6023 8651\nf 8647 8652 8653\nf 8650 6489 6024\nf 6484 8654 8655\nf 8656 8654 8657\nf 6034 8658 8656\nf 6004 8659 6043\nf 8660 7070 8661\nf 8661 8662 6058\nf 8663 8664 8665\nf 8666 8663 8667\nf 8668 6060 8669\nf 8670 8671 8672\nf 8673 8674 8675\nf 8676 8677 8678\nf 6415 8679 8680\nf 8681 8682 8683\nf 8684 8685 8686\nf 8687 8688 6573\nf 8689 8685 8687\nf 6527 8690 8691\nf 6619 8692 8693\nf 6067 8694 8695\nf 8696 8697 8698\nf 6070 8699 8700\nf 8701 8702 8703\nf 8704 6074 8705\nf 6076 6073 6609\nf 8705 8706 6079\nf 6075 8707 8706\nf 6081 8707 8708\nf 8709 6086 6084\nf 8710 8711 6085\nf 8712 8713 8711\nf 8714 8715 8716\nf 8717 8714 8718\nf 6092 6280 8719\nf 6095 8720 8721\nf 8722 6096 8723\nf 6097 6101 8724\nf 8722 8725 6099\nf 6100 8726 8727\nf 8724 8728 8729\nf 8728 8730 8731\nf 8732 8731 8733\nf 8730 8727 6102\nf 8734 6240 6107\nf 8735 8733 8736\nf 8737 8738 8739\nf 8740 8741 8742\nf 8740 8743 8739\nf 8743 6217 8744\nf 6207 6218 8745\nf 8746 8747 6121\nf 6122 8748 6124\nf 8749 6140 6143\nf 8750 8751 8752\nf 8753 6149 8754\nf 8753 6147 8750\nf 8755 6363 6566\nf 8756 8757 6541\nf 8758 6173 8759\nf 8759 8760 6591\nf 8761 8762 8763\nf 8761 8764 6176\nf 8764 8765 8616\nf 6174 8617 8766\nf 6474 8767 6190\nf 6185 8768 8769\nf 6186 6188 6447\nf 8769 8770 6189\nf 8771 8770 8772\nf 8773 8774 6204\nf 6196 8775 8776\nf 8777 6200 8778\nf 8775 6199 6014\nf 8777 8779 8780\nf 6201 6202 8631\nf 8781 8782 8783\nf 8780 8782 6203\nf 8784 8785 8786\nf 6117 8745 6208\nf 8787 8788 8789\nf 8790 8788 6210\nf 8791 6129 8748\nf 8791 8789 6211\nf 6214 6213 6227\nf 6111 8742 6221\nf 6112 6219 6113\nf 6220 6223 8792\nf 8793 8794 8792\nf 6209 8794 6224\nf 8790 8795 8796\nf 8797 8795 6226\nf 8796 8798 6212\nf 6228 8798 6230\nf 6215 6229 6233\nf 8799 6234 6232\nf 6235 8800 6236\nf 6237 8801 8802\nf 8735 8734 8803\nf 8804 8805 6238\nf 8806 6243 8807\nf 8808 6239 8806\nf 8805 8809 6241\nf 6242 8810 8811\nf 8807 6246 8741\nf 8811 8812 6244\nf 6245 6249 8813\nf 8812 8814 6247\nf 6248 8815 8816\nf 8813 6252 6222\nf 8816 8817 6250\nf 6251 8818 8793\nf 8818 6255 8819\nf 8817 8820 6253\nf 6254 8821 8822\nf 8819 6258 6225\nf 8822 8823 6256\nf 8797 8824 6231\nf 8823 6312 8825\nf 8825 8826 6259\nf 6260 8827 8799\nf 8827 6264 8828\nf 8826 8829 6262\nf 6263 8830 8831\nf 8828 6138 8800\nf 8831 8832 6265\nf 8832 8833 6267\nf 6268 8834 8835\nf 8836 8837 8838\nf 6270 8839 6269\nf 8835 6142 8840\nf 8841 6271 8840\nf 8842 8843 8844\nf 8845 8846 6278\nf 6090 8847 8845\nf 8848 8849 8850\nf 6279 8851 8852\nf 8853 8854 8855\nf 8856 8854 8857\nf 8858 6283 8723\nf 8859 8860 6281\nf 8861 8862 8863\nf 6285 6288 8725\nf 8864 8865 6286\nf 6287 6289 8726\nf 8866 8867 8868\nf 8869 8867 8870\nf 6291 8871 6103\nf 8872 8873 6292\nf 8871 6294 8874\nf 8873 8875 8876\nf 8876 8877 8878\nf 8879 6297 8809\nf 8878 8880 8881\nf 6296 8882 8810\nf 8882 6300 8883\nf 8884 8881 6298\nf 6299 8885 8886\nf 8883 6303 8814\nf 8886 8887 6301\nf 6302 8888 8815\nf 8888 6306 8889\nf 8887 8890 6304\nf 6305 8891 8892\nf 8889 6309 8820\nf 8892 8893 6307\nf 6308 8894 8821\nf 8893 8895 8896\nf 8894 8897 6310\nf 8896 8898 8897\nf 6311 6315 8899\nf 8898 8900 6313\nf 6314 8901 8902\nf 8899 6318 8829\nf 8902 6319 6316\nf 6317 8903 8830\nf 8903 6321 8904\nf 6320 8905 8906\nf 8904 6324 8833\nf 8906 8907 6322\nf 6323 8908 8834\nf 8908 6327 8749\nf 8907 6354 6325\nf 6326 6150 8909\nf 8909 8752 6141\nf 8910 8911 8912\nf 6077 8910 8913\nf 8914 8915 8912\nf 8916 8917 8918\nf 8916 8919 8920\nf 8921 8922 8923\nf 8924 8925 8926\nf 8709 8927 8924\nf 8928 8929 8930\nf 8931 8932 8933\nf 8934 8935 8936\nf 8937 8938 8939\nf 8850 8940 8937\nf 8941 8942 8943\nf 8944 8945 8946\nf 8857 8848 8947\nf 8948 8949 8950\nf 8863 8951 8952\nf 8953 8954 8948\nf 8955 8956 8957\nf 8958 8959 8960\nf 8961 8962 8963\nf 8964 6328 8877\nf 8965 8966 8967\nf 8968 8969 8970\nf 6330 6333 8971\nf 8972 8973 6331\nf 6332 8974 8975\nf 8976 8977 8978\nf 8979 8980 6557\nf 8974 6336 8890\nf 6335 6337 8891\nf 8981 8982 6338\nf 8983 8984 8977\nf 6339 6340 8895\nf 6342 6345 8900\nf 8985 8986 8987\nf 6344 6346 8901\nf 6343 8988 8985\nf 8989 8990 8991\nf 6348 6349 8905\nf 8992 8989 6350\nf 8993 8994 8995\nf 6351 8996 6352\nf 8991 8997 8998\nf 8999 9000 6356\nf 6353 6355 6148\nf 9001 9002 9003\nf 6360 8626 8754\nf 6358 6357 9004\nf 9005 9006 9007\nf 9005 6362 6361\nf 5998 9008 9009\nf 9008 6364 9010\nf 6154 9011 9010\nf 9012 9013 9014\nf 9015 6368 9016\nf 9017 9018 9019\nf 9020 9021 9022\nf 9023 9020 9024\nf 9025 9026 9027\nf 9028 9029 9030\nf 9031 9032 9033\nf 9034 9035 9036\nf 9037 9038 9039\nf 9040 9037 9041\nf 9042 9043 9044\nf 9045 9046 9047\nf 9048 9049 9050\nf 9051 9052 9053\nf 9054 9051 9055\nf 9056 9057 9058\nf 9059 9060 9061\nf 8611 9062 9063\nf 9064 9065 9066\nf 9067 9065 9068\nf 9069 9070 9071\nf 9072 9073 9074\nf 9075 9076 9077\nf 9078 9079 9080\nf 9081 9082 9083\nf 9084 9085 9086\nf 8665 9085 9087\nf 9088 9089 6640\nf 9090 9091 9092\nf 9093 9094 9095\nf 9096 9097 9098\nf 9099 9100 8660\nf 9101 9098 9102\nf 6377 9099 6055\nf 9096 9103 9104\nf 9105 9104 6379\nf 9106 6378 6057\nf 9105 6380 9107\nf 9108 6050 9109\nf 6382 9110 9111\nf 9110 9112 9113\nf 6038 9114 9115\nf 9116 9117 6387\nf 6383 9118 9119\nf 6391 9120 9121\nf 9122 9123 9124\nf 6386 9125 6036\nf 9126 9127 6389\nf 9121 9128 9129\nf 9015 9130 6367\nf 9126 9131 6393\nf 9016 9132 9133\nf 6394 6395 9113\nf 9134 9135 9136\nf 6399 6400 9111\nf 9137 9138 9139\nf 9140 9141 9142\nf 9097 6405 6407\nf 9143 9144 9145\nf 9146 9147 9148\nf 8688 8683 9149\nf 9150 9151 9152\nf 9153 9154 9155\nf 9156 9157 9158\nf 9159 9160 9161\nf 9162 9163 9164\nf 9165 9166 9167\nf 9168 9169 9170\nf 9171 9172 9173\nf 9174 9175 9176\nf 9177 9178 9179\nf 9180 9181 9182\nf 9183 9184 9185\nf 9186 9187 9188\nf 9189 9190 9191\nf 9189 9192 9193\nf 9194 9195 9196\nf 9197 9198 9199\nf 9200 9201 9202\nf 9203 9204 9205\nf 9206 9207 9208\nf 9209 9210 9211\nf 9212 9213 9214\nf 9215 9216 9217\nf 9218 9219 9220\nf 9221 9222 9223\nf 9224 9225 9226\nf 9227 9228 9229\nf 9230 9231 9232\nf 9233 9234 9235\nf 9236 9237 9238\nf 9239 9240 9241\nf 9242 9243 9244\nf 9245 6416 9246\nf 9247 9248 9249\nf 9250 6419 9251\nf 9252 9248 9253\nf 9254 9255 9256\nf 6423 9257 9258\nf 9259 9255 9260\nf 9261 6427 9254\nf 6170 9262 9263\nf 9264 9262 9265\nf 9266 9267 9268\nf 9269 9267 6428\nf 9263 9270 9271\nf 9268 8762 9272\nf 6430 9272 6180\nf 9273 9274 9275\nf 9276 9277 9278\nf 9279 9280 9281\nf 9282 9283 9284\nf 9285 9286 9287\nf 9288 9289 9290\nf 9291 9292 9293\nf 9294 9295 9296\nf 9297 9298 9299\nf 9300 9301 9302\nf 9303 9304 9305\nf 9306 9307 9308\nf 9309 9310 9311\nf 9312 6432 9313\nf 9314 9315 9316\nf 9317 9318 9319\nf 9320 9321 9322\nf 9323 9324 9325\nf 9326 9327 9328\nf 9329 9330 9331\nf 9332 9333 9334\nf 9335 9336 9337\nf 9338 9339 9340\nf 9341 9342 9343\nf 9344 9345 9346\nf 9347 9348 9349\nf 9350 9351 9352\nf 9353 9354 9355\nf 9356 9357 9358\nf 9359 9360 9361\nf 9362 9363 9364\nf 9365 9366 9367\nf 9368 9369 9370\nf 9371 9372 9373\nf 9374 9375 9376\nf 9377 9378 9379\nf 9380 9381 9382\nf 9383 6435 9384\nf 9385 9381 9386\nf 9387 9388 9389\nf 9386 9390 9391\nf 9380 9388 9392\nf 9393 9394 9395\nf 9396 6438 9397\nf 9393 9398 9399\nf 9400 9398 9401\nf 6443 6444 8767\nf 9400 9402 9403\nf 9404 9402 9405\nf 6446 9406 6448\nf 9407 9408 9409\nf 9410 9411 9412\nf 6449 6450 6183\nf 9413 9414 9415\nf 6453 9414 9416\nf 5987 8614 6195\nf 9417 9418 9419\nf 8773 6457 9420\nf 9417 8784 6193\nf 8781 8785 6458\nf 9421 9422 9423\nf 9424 9425 9426\nf 9427 9428 9429\nf 9430 9431 9432\nf 9433 9434 9435\nf 9436 9437 9438\nf 9439 9440 9441\nf 9442 9443 9444\nf 9445 9446 9447\nf 9448 9449 9450\nf 9451 9452 9178\nf 9453 9454 9455\nf 9456 9457 9458\nf 9459 9457 9305\nf 9460 9461 9462\nf 9463 9464 9465\nf 9466 9467 9468\nf 9469 9470 9471\nf 9472 9473 9474\nf 9475 9476 9477\nf 9478 9479 9480\nf 9481 9482 9483\nf 9484 9485 9486\nf 9487 9488 9489\nf 9490 9491 9492\nf 9493 9494 9495\nf 9496 9497 9498\nf 9499 9500 9501\nf 9502 9503 9504\nf 9505 9506 9507\nf 9508 9509 9510\nf 9511 9512 9513\nf 9514 9515 9516\nf 9517 9518 9519\nf 9520 9521 9522\nf 9523 9524 9525\nf 9526 9527 9528\nf 9529 9530 9531\nf 9532 9533 9534\nf 9535 9536 9537\nf 9538 9533 9539\nf 9540 9541 9542\nf 9543 6462 9269\nf 9544 9541 9545\nf 6466 6467 8763\nf 9546 9547 9548\nf 9549 9550 9551\nf 6469 6470 8765\nf 9549 9552 6471\nf 6473 9552 9553\nf 6472 9554 6179\nf 9554 9555 9556\nf 8771 9555 6475\nf 8638 6476 9557\nf 8635 9558 6477\nf 9559 9558 9560\nf 9561 9562 9563\nf 9559 9564 9562\nf 9565 9564 9566\nf 9567 9568 9569\nf 9570 6479 9571\nf 9572 9573 9574\nf 6481 6493 9575\nf 9115 6482 9116\nf 9576 9577 6028\nf 9578 9579 6485\nf 9580 9581 9582\nf 9583 9584 9585\nf 9586 9587 9588\nf 9589 9590 9591\nf 9592 9593 9591\nf 6486 9594 6492\nf 6030 9594 6029\nf 9592 6487 9595\nf 9596 9595 9597\nf 9598 8653 9599\nf 9600 9601 9602\nf 6495 9603 9604\nf 9565 9603 9605\nf 9606 9607 9608\nf 9609 9610 9611\nf 9612 9613 9614\nf 9615 9613 9616\nf 9617 9615 9618\nf 9619 9620 9621\nf 9622 9623 9624\nf 9625 9626 9627\nf 9628 9629 9630\nf 9631 9632 9633\nf 9634 9635 9636\nf 9637 9638 9639\nf 9640 9641 9642\nf 9643 9644 9645\nf 9646 9647 9648\nf 9649 9650 9651\nf 9652 9653 9654\nf 9655 9656 9657\nf 9658 9652 9659\nf 9660 9661 9662\nf 9663 9664 9665\nf 9666 9667 9668\nf 9669 9667 9670\nf 9671 9672 9673\nf 9674 9675 9676\nf 9669 9677 9678\nf 9679 9677 9680\nf 9681 9675 6498\nf 9682 9683 9684\nf 9685 9686 9687\nf 9688 9689 9690\nf 9691 9692 9693\nf 9694 9695 9696\nf 9697 9698 9699\nf 9700 9701 9702\nf 9703 9704 9705\nf 9706 9707 9708\nf 9709 9710 9711\nf 9712 9713 9714\nf 9715 9716 9717\nf 9718 9719 9720\nf 9721 9722 9723\nf 9724 9725 9726\nf 9727 9728 9729\nf 9730 9731 9732\nf 9733 9734 9735\nf 9736 9737 9738\nf 9739 6501 9389\nf 9736 9740 6504\nf 9741 9740 9571\nf 6505 6506 9742\nf 9741 9743 6507\nf 9744 9743 9575\nf 6508 6509 9401\nf 9744 9745 6510\nf 9746 9745 9604\nf 6511 6512 9405\nf 9746 9747 6513\nf 9748 9747 9566\nf 6514 6515 9412\nf 9748 9749 6516\nf 6518 9749 9560\nf 6517 9750 9416\nf 9751 9750 6520\nf 9752 6519 8636\nf 9751 6521 9753\nf 9752 9754 6522\nf 9755 9754 8642\nf 6523 6524 8774\nf 9755 9756 6525\nf 8633 8628 9756\nf 9757 9758 9759\nf 9757 8694 9760\nf 9761 9762 9763\nf 9764 9765 9766\nf 9767 9768 9769\nf 9770 9771 9772\nf 9773 9774 9775\nf 9776 9777 9778\nf 9779 9780 9781\nf 9782 9783 9784\nf 9785 9786 9787\nf 9788 9789 9790\nf 9791 9792 9793\nf 9794 9795 9796\nf 9797 9798 9799\nf 9800 9801 9802\nf 9803 9804 9805\nf 9806 9807 6532\nf 9808 9809 9810\nf 9811 9809 9812\nf 9811 9813 9814\nf 9815 9816 9817\nf 9818 9819 9820\nf 9821 9822 9823\nf 9824 9825 9826\nf 9827 9828 9829\nf 9830 9831 9832\nf 9833 9834 9835\nf 9836 9837 9838\nf 9839 9840 9841\nf 9842 9843 9844\nf 9845 9846 9847\nf 9848 9849 9850\nf 9851 6537 9852\nf 9853 9854 9855\nf 6539 9856 6538\nf 9857 9858 9851\nf 8756 6542 6162\nf 9859 9860 6543\nf 9861 9862 9863\nf 6544 6547 6157\nf 9864 9862 6545\nf 6546 6548 5994\nf 9861 9865 6549\nf 9866 9865 9867\nf 9866 9868 6551\nf 9869 9868 6164\nf 8698 9870 6617\nf 9871 9872 9873\nf 9874 9875 9876\nf 9877 9878 9879\nf 9880 9881 9882\nf 9883 9884 9885\nf 9886 9887 9888\nf 9889 9890 9891\nf 9892 9893 9894\nf 9895 9896 9897\nf 9898 9899 9900\nf 9901 9902 9903\nf 9904 9905 9906\nf 9907 9908 9909\nf 9910 9911 9912\nf 9913 9914 9915\nf 9916 9917 9918\nf 8970 9919 9920\nf 9921 9922 9923\nf 8979 9924 8976\nf 9925 9926 6560\nf 9927 9928 9929\nf 9930 9931 8983\nf 9927 9932 9933\nf 9934 9935 9936\nf 9937 9938 9939\nf 9940 9941 9942\nf 9943 9944 9945\nf 9946 9947 9948\nf 9949 9948 9950\nf 9951 6562 9952\nf 6564 9953 6563\nf 9954 9955 9956\nf 9954 9957 9951\nf 8755 9958 6155\nf 9959 9958 9960\nf 9853 6569 9956\nf 6151 9959 8623\nf 9855 8757 6571\nf 5995 9961 9962\nf 6160 9961 6572\nf 9963 9964 9965\nf 9963 6528 9966\nf 9967 9968 9969\nf 9970 9971 9972\nf 9973 9974 9975\nf 9976 9977 9978\nf 9979 9980 9981\nf 9982 9983 9984\nf 9985 9986 9987\nf 9988 9989 9990\nf 9991 9992 9993\nf 9994 9995 9996\nf 9997 9998 9999\nf 10000 10001 10002\nf 10003 10004 10005\nf 10006 10007 10003\nf 10008 10007 9185\nf 10009 10010 9812\nf 10011 10012 6581\nf 10013 10014 10015\nf 10016 6582 10017\nf 10018 10019 10020\nf 10021 10022 10023\nf 10024 10025 10026\nf 10027 10028 10029\nf 10030 10031 10032\nf 10033 10034 10035\nf 10036 10037 10038\nf 10039 10040 10041\nf 10042 10043 10044\nf 10045 10046 10047\nf 10048 10049 10050\nf 10051 10052 10053\nf 10054 10055 10056\nf 10057 10058 10059\nf 10060 10061 10062\nf 10063 10064 10065\nf 10066 6585 6165\nf 10063 10067 6588\nf 10068 10067 9251\nf 6589 10069 8620\nf 10068 9258 6166\nf 10069 6168 6590\nf 10070 10071 10072\nf 10073 10074 10075\nf 6603 10076 10077\nf 6761 10078 10079\nf 6606 10080 6700\nf 10081 10082 7227\nf 10083 10084 6610\nf 6607 10084 10085\nf 10086 10087 10088\nf 6613 10087 8701\nf 6614 8914 10089\nf 8700 10086 6615\nf 10090 10091 10092\nf 10090 8691 8692\nf 10093 10091 10094\nf 6622 6620 9760\nf 10095 6624 10096\nf 10095 6623 6066\nf 10097 10098 6616\nf 10099 10100 10101\nf 10102 10103 10104\nf 10102 7037 8689\nf 6627 10103 10105\nf 10106 6628 10107\nf 7034 9966 10108\nf 10109 6633 10110\nf 10109 6630 8679\nf 10111 10112 8676\nf 10113 10114 10115\nf 9423 10116 10113\nf 10117 10118 10119\nf 10117 6637 10120\nf 10121 7038 10111\nf 10122 10118 10123\nf 10124 10125 8673\nf 6636 10126 9638\nf 9641 10127 8674\nf 10128 6641 10129\nf 10130 10131 10132\nf 9095 10133 10134\nf 10135 10133 10136\nf 10137 10138 10139\nf 10140 9093 10141\nf 10142 10143 10144\nf 10142 6990 6993\nf 10145 10146 10147\nf 10148 10146 6660\nf 10148 7225 10149\nf 7197 10081 6663\nf 6673 10150 10151\nf 10152 10153 10154\nf 10155 10156 6682\nf 10155 10157 6672\nf 6680 10156 7162\nf 6681 10158 10154\nf 10152 10159 6670\nf 7148 6690 10160\nf 10080 10161 6701\nf 10162 6705 10163\nf 6704 6703 10164\nf 10165 10166 10163\nf 10167 10164 6709\nf 10162 10168 6696\nf 6708 10169 10170\nf 6729 6734 10171\nf 10172 10173 6718\nf 10172 10171 10174\nf 6725 6736 7081\nf 10175 10176 6726\nf 6724 10177 10174\nf 10178 10179 10180\nf 10178 10181 6739\nf 10182 10183 10180\nf 10184 6744 10185\nf 10186 6746 7219\nf 7195 10187 6749\nf 10188 7239 10187\nf 10189 10190 10191\nf 10192 10190 6750\nf 10193 10194 10195\nf 6753 10194 10196\nf 7256 7249 10197\nf 10197 7270 6758\nf 6759 10198 10199\nf 10200 7269 10201\nf 10202 6764 6768\nf 10203 10204 10205\nf 10202 10203 10206\nf 6601 10207 10205\nf 10208 10209 6769\nf 10210 10209 6780\nf 10211 6774 10212\nf 6975 10213 10214\nf 6776 10215 10216\nf 6779 10215 10217\nf 10218 10219 10220\nf 10221 10222 10223\nf 10221 10218 10224\nf 10225 6839 10226\nf 10227 10228 7028\nf 8911 6608 10229\nf 10230 10083 10231\nf 10230 10232 10233\nf 6834 6833 10234\nf 10235 10236 10237\nf 6807 6826 10238\nf 6934 6822 10239\nf 6821 10240 10241\nf 10241 6597 10242\nf 10243 10223 6823\nf 10244 10245 10246\nf 6840 10247 6825\nf 10248 10249 10244\nf 10250 6827 10251\nf 10252 10253 6828\nf 10251 10254 10255\nf 6829 10256 10257\nf 10256 10258 10259\nf 10253 10255 10260\nf 6851 6836 10261\nf 6838 10248 10262\nf 6842 6811 10262\nf 10263 10264 10265\nf 10264 6841 6843\nf 6845 10266 10267\nf 10266 6830 10268\nf 6844 10250 10252\nf 10269 10257 6846\nf 6863 6848 10270\nf 6847 10271 6850\nf 10272 10273 10274\nf 10275 10276 10277\nf 10226 6810 6870\nf 10225 6853 10278\nf 6871 6857 10279\nf 6809 10263 6855\nf 10280 10281 10282\nf 10282 10283 10284\nf 10284 10285 10286\nf 10286 10287 6873\nf 10288 10289 6874\nf 10290 10291 10292\nf 10274 10293 10291\nf 10294 10295 10296\nf 10297 10298 10299\nf 6864 10300 6852\nf 6878 10301 6866\nf 6854 6869 10301\nf 6867 10302 10303\nf 10304 10305 10306\nf 10307 10305 10308\nf 10309 10310 10311\nf 10312 10313 10314\nf 10315 10316 10317\nf 10318 10319 10320\nf 10321 10322 10323\nf 10324 10325 10326\nf 10327 10328 10329\nf 10330 10331 10332\nf 10333 10334 10335\nf 10336 10337 10338\nf 10336 10339 10340\nf 10341 10342 10343\nf 10344 10345 10346\nf 10347 10348 10349\nf 10350 10351 10352\nf 10353 10354 10303\nf 6868 10355 6880\nf 6881 7282 10356\nf 6814 10356 10357\nf 10358 10359 10360\nf 10361 10362 10363\nf 10364 10365 10366\nf 10367 10368 10369\nf 10370 10371 10372\nf 10373 10374 10375\nf 10376 10377 10378\nf 10379 10380 10381\nf 10382 10383 10384\nf 10385 10386 10387\nf 10388 10389 10390\nf 10391 10392 10393\nf 10394 10395 10396\nf 6884 10395 10397\nf 10398 10393 10399\nf 6882 10400 10401\nf 10402 6886 6983\nf 10403 10404 10405\nf 10404 10401 10406\nf 10407 10408 10409\nf 6885 10403 6979\nf 10410 10407 10411\nf 10405 10412 10413\nf 10414 10415 10416\nf 10415 10417 10418\nf 10419 6957 10420\nf 10421 10419 10422\nf 10416 10422 10423\nf 10420 10424 6891\nf 10425 10424 10426\nf 6892 6893 6796\nf 10425 10427 6894\nf 10428 10427 10429\nf 6895 6896 6793\nf 10428 10430 6897\nf 10431 10432 6599\nf 6799 10430 10432\nf 10433 10434 10435\nf 10436 10437 10438\nf 10439 10440 10441\nf 10442 10443 10444\nf 10445 10446 10447\nf 10448 10449 10450\nf 10451 10452 10453\nf 10454 10455 10456\nf 10457 10458 10459\nf 10460 10461 10462\nf 10463 10464 10465\nf 6900 10466 10467\nf 6898 10468 10469\nf 10470 6902 6945\nf 10471 10472 10473\nf 10472 10474 6903\nf 10475 6929 10476\nf 10477 10475 10478\nf 10473 10478 6906\nf 10479 10480 10481\nf 10480 10482 6909\nf 6907 10483 6953\nf 10484 6937 10485\nf 6913 10481 10485\nf 10486 10487 10488\nf 10489 10487 10490\nf 10491 10492 10493\nf 10494 10495 10496\nf 10497 10498 10499\nf 10500 10501 10502\nf 10503 10504 10505\nf 10506 10507 10508\nf 10509 10510 10511\nf 10512 10513 10514\nf 10515 10516 10517\nf 6923 10518 10519\nf 10520 10521 10522\nf 10469 10523 10524\nf 10525 6926 10526\nf 6927 6925 10234\nf 10527 10237 10528\nf 10529 10527 10530\nf 6930 10526 10530\nf 10531 10532 10533\nf 10532 10534 6932\nf 10535 10242 10536\nf 6931 10537 6910\nf 10239 10535 10538\nf 10533 10538 6935\nf 10536 10539 6938\nf 10540 10541 6596\nf 10486 10539 10541\nf 10542 10543 10544\nf 10545 10546 10547\nf 10548 10549 10550\nf 10551 10552 10553\nf 10554 10555 10556\nf 10557 10558 10559\nf 10560 10561 10562\nf 10563 10564 10565\nf 10566 10567 10568\nf 10569 10570 10571\nf 10398 10572 10573\nf 10574 10397 10575\nf 10576 10577 10578\nf 10579 6944 10400\nf 10580 6946 10581\nf 6947 10582 10583\nf 10584 6908 10585\nf 10586 10587 10580\nf 10588 10584 6950\nf 10408 10581 6949\nf 10589 10590 10591\nf 10590 10592 6952\nf 10593 6912 10594\nf 6951 10595 6888\nf 10596 10593 10597\nf 10591 10597 6955\nf 10594 10598 6958\nf 10599 10598 6915\nf 6959 6960 10426\nf 10599 10600 6961\nf 10601 10600 6804\nf 6962 6963 10429\nf 10601 10602 6964\nf 6916 6965 10602\nf 10211 10603 10076\nf 6602 6967 6772\nf 6968 10204 10604\nf 10605 6767 10606\nf 10605 10607 10604\nf 7272 10608 10609\nf 6986 10610 6973\nf 10611 10612 6970\nf 10613 10614 10615\nf 10616 10617 10618\nf 10619 10620 10621\nf 10622 10623 10624\nf 10625 10626 10627\nf 10628 10629 10630\nf 10631 10632 10633\nf 10634 10635 10636\nf 10637 10638 10639\nf 10640 10641 10642\nf 10643 10644 10645\nf 10646 10647 10648\nf 10649 6770 10650\nf 10651 10217 10652\nf 6784 10649 10653\nf 10654 10651 10655\nf 10650 10656 10414\nf 10657 10658 10659\nf 10658 10660 10214\nf 10661 6773 10662\nf 10413 10663 10657\nf 10664 10661 10665\nf 10659 10665 6977\nf 10666 10667 10668\nf 10667 10669 6980\nf 10670 10607 10671\nf 10672 10573 10668\nf 10672 6981 10670\nf 10673 10674 10675\nf 10676 10677 10678\nf 10679 10680 10681\nf 10682 10683 10684\nf 10685 10686 10687\nf 10688 10689 10690\nf 10691 10692 10693\nf 10694 10695 10696\nf 10697 10698 10699\nf 10700 10701 10702\nf 10703 10704 10705\nf 10706 10707 10708\nf 10709 10358 10710\nf 10711 10712 10713\nf 10714 10715 10646\nf 6653 10716 10145\nf 6656 10716 6995\nf 10717 6996 6999\nf 7001 6994 10718\nf 10719 7007 10720\nf 10719 10717 10721\nf 10722 10723 10724\nf 10725 10726 10727\nf 10728 10729 10730\nf 10731 10732 10733\nf 10734 10735 10736\nf 10737 10738 10739\nf 10738 10740 7004\nf 10741 10742 10743\nf 10744 10745 10746\nf 10747 7002 10748\nf 10749 7009 10747\nf 10749 7006 10750\nf 10751 7005 10752\nf 7011 10752 10753\nf 10739 10753 10721\nf 7021 10754 7014\nf 10755 10756 10757\nf 10758 10759 10760\nf 10761 10762 10763\nf 10764 10765 10766\nf 10767 10768 10769\nf 10770 10771 10772\nf 10773 10774 10775\nf 10776 10777 10778\nf 10779 10780 10781\nf 10782 10783 10784\nf 10785 10786 10787\nf 10788 10789 10787\nf 10790 10791 10792\nf 10793 10794 10795\nf 10796 10797 10798\nf 10799 10800 10801\nf 10802 10803 10804\nf 10805 10806 10807\nf 10808 10809 10810\nf 10734 10811 10812\nf 10813 10814 10815\nf 10816 10743 10817\nf 7016 10742 10818\nf 10819 10820 10750\nf 10751 10821 10822\nf 10823 7048 10824\nf 10825 7020 10826\nf 10825 10827 7013\nf 10828 7019 7022\nf 10829 10830 10831\nf 10832 10833 10834\nf 10835 10836 10837\nf 10838 10839 10731\nf 10840 10841 10773\nf 10842 10843 10844\nf 10845 7050 10846\nf 7023 10847 10826\nf 10828 10848 7024\nf 10849 10848 7026\nf 6817 10850 10851\nf 10852 10853 10854\nf 10855 10856 10857\nf 10858 10859 10860\nf 10861 10862 10863\nf 10864 10865 10866\nf 10867 10868 10869\nf 10870 10871 10872\nf 10873 10874 10875\nf 10876 10877 10878\nf 10879 10880 10881\nf 10882 10883 10884\nf 10885 10886 10887\nf 6816 10888 10889\nf 10890 10891 10892\nf 10893 10894 10895\nf 10896 10897 10898\nf 10899 10900 10901\nf 10902 10903 10904\nf 10905 10906 10907\nf 10908 10909 10910\nf 10911 10912 10913\nf 10914 10915 10916\nf 10917 10918 10919\nf 10920 10921 10922\nf 10923 10924 10925\nf 10926 10927 10928\nf 10929 10930 10931\nf 10932 10933 10934\nf 10935 10936 10937\nf 10938 10939 10940\nf 10941 10942 10943\nf 10888 10944 10945\nf 10946 10947 6612\nf 6815 10948 10949\nf 10950 10951 10952\nf 10953 10096 10954\nf 10955 10956 10957\nf 10958 10959 10960\nf 10961 10962 10963\nf 10964 10965 10966\nf 10967 10968 10969\nf 10970 10971 10972\nf 10973 10974 10975\nf 10976 10977 10978\nf 10979 10980 10981\nf 10982 10983 10984\nf 10985 10986 10987\nf 10988 10989 10990\nf 10991 10992 10993\nf 10994 10995 10996\nf 10997 10998 10999\nf 11000 11001 11002\nf 11003 11004 11005\nf 11006 11007 11008\nf 11009 11010 11011\nf 11012 11013 11014\nf 11015 11016 11017\nf 11018 11019 11020\nf 11021 11022 11023\nf 11024 11025 11026\nf 11027 11028 11029\nf 11030 11031 11032\nf 11033 11034 11035\nf 11036 11037 11038\nf 7064 11039 11040\nf 11041 11042 11043\nf 11044 11045 11046\nf 11047 11048 11049\nf 11050 11051 11047\nf 11052 11053 8666\nf 11054 11055 11056\nf 10849 11057 11058\nf 7025 11059 11060\nf 11061 11062 11063\nf 11064 11065 11066\nf 11067 11068 11069\nf 11070 11071 11072\nf 11073 11074 11075\nf 11076 11077 11078\nf 11079 11080 11081\nf 11082 11083 11084\nf 11085 11086 11087\nf 11088 11089 11090\nf 11091 11092 11093\nf 11094 11095 11096\nf 11097 11098 11099\nf 11097 7051 11100\nf 11101 11102 11103\nf 11104 11105 11106\nf 11107 11108 11109\nf 11110 11111 11112\nf 11113 11114 11115\nf 11116 11117 11118\nf 11119 11120 11121\nf 11122 11123 11124\nf 11125 11126 11127\nf 11128 11129 11130\nf 11131 11132 11133\nf 11134 11135 7066\nf 11136 10799 7067\nf 11137 11138 11139\nf 11140 11141 11142\nf 11143 11144 11145\nf 11146 11147 11148\nf 11149 11061 6594\nf 10134 6592 11150\nf 10140 11151 6642\nf 11060 11152 11153\nf 7069 11057 7047\nf 7046 11154 8662\nf 7074 11155 11156\nf 7076 11156 7072\nf 7079 7075 11157\nf 6733 11157 7077\nf 7082 10175 6731\nf 11158 7214 11159\nf 11160 7091 11161\nf 7094 11162 11163\nf 6735 11164 11165\nf 7097 11166 7093\nf 6728 7099 11167\nf 11168 11169 11170\nf 7104 11171 11172\nf 7107 11173 7103\nf 7109 11174 7105\nf 11175 7114 7111\nf 11176 7112 7110\nf 6707 11176 7116\nf 7121 11177 11178\nf 7088 11179 11180\nf 11181 7122 11182\nf 7129 11182 7125\nf 7132 11183 11184\nf 7134 11184 7130\nf 7137 7133 11185\nf 7139 11185 7135\nf 7138 11186 7143\nf 7141 11187 11186\nf 7149 11188 7152\nf 11187 7145 11188\nf 7151 10161 7154\nf 6686 6692 11189\nf 11190 11191 11192\nf 7158 11192 7157\nf 11193 11194 11195\nf 7160 11196 7159\nf 11197 7164 11198\nf 7165 11199 7161\nf 11197 11200 7167\nf 7166 7169 11200\nf 7171 7168 11201\nf 11202 10160 6684\nf 11202 11201 7170\nf 7172 6683 11203\nf 11204 11205 11206\nf 11207 11208 11209\nf 7203 11210 11211\nf 11212 7207 11213\nf 11214 11215 7180\nf 7210 11216 11217\nf 11218 11219 11220\nf 11221 7182 7233\nf 11222 11223 11224\nf 11225 11222 11226\nf 6747 11227 7194\nf 11228 11229 11230\nf 7198 11230 7199\nf 11231 11229 7230\nf 11232 7204 11194\nf 11232 10151 11233\nf 7155 11234 11235\nf 11236 11237 7176\nf 11180 11236 7208\nf 11238 7213 7181\nf 11239 7071 11240\nf 6742 11241 11242\nf 11242 7215 7222\nf 11243 11244 7193\nf 10184 7220 11245\nf 11246 6661 7226\nf 11228 6662 11247\nf 11248 11249 7228\nf 11250 11251 7229\nf 11252 11253 11254\nf 11255 11256 11257\nf 7186 11258 11259\nf 11260 11261 7235\nf 11262 11221 11263\nf 11264 11265 11266\nf 7190 11267 11268\nf 7238 11269 10192\nf 11270 11269 7260\nf 11271 11272 10191\nf 11271 11273 11274\nf 11275 11272 11276\nf 11277 11278 11279\nf 11280 11281 11282\nf 11283 11284 11285\nf 11286 11287 11288\nf 11289 11290 11291\nf 11292 11293 11294\nf 11295 11296 11297\nf 7246 11298 11299\nf 7267 11300 11301\nf 11302 11303 7251\nf 11304 11303 7275\nf 11305 10196 7252\nf 11305 11306 11307\nf 6754 6755 7257\nf 11308 11309 11310\nf 11311 11312 11313\nf 11314 11312 11315\nf 11316 11317 11315\nf 11318 11319 11320\nf 11214 11321 11322\nf 11323 11324 11325\nf 11326 11327 11328\nf 11329 11330 11331\nf 11332 11333 7264\nf 11334 11335 7261\nf 11336 11337 11338\nf 11339 11340 11341\nf 7242 11342 10193\nf 7271 6762 11343\nf 11344 11343 10201\nf 10198 10200 10079\nf 11345 11346 11347\nf 11345 7268 11348\nf 7250 11349 11350\nf 11351 11352 11353\nf 11354 11355 7273\nf 11356 11357 11358\nf 11359 11360 11361\nf 11362 11363 11364\nf 11365 11366 11367\nf 11368 11369 11370\nf 11371 11372 11373\nf 11374 11375 11376\nf 11377 11378 11379\nf 11380 11381 11382\nf 11383 11384 11385\nf 11386 11387 11388\nf 11389 11390 11391\nf 11392 11393 11394\nf 11395 11396 11397\nf 11395 11393 11398\nf 11399 11400 11401\nf 11402 11403 11404\nf 11405 11406 10728\nf 11407 11408 11409\nf 11410 11411 11412\nf 11413 11414 11415\nf 11416 11417 11418\nf 11419 11420 11421\nf 11422 11423 11424\nf 11425 11426 11427\nf 11428 11429 11430\nf 11431 11432 11433\nf 11434 11435 11436\nf 11437 11438 11439\nf 11440 11441 11442\nf 11443 11444 11445\nf 11446 11447 11448\nf 11449 11450 11451\nf 11452 11453 10355\nf 11454 7285 7284\n\nusemtl material_1\nf 11455 11456 11457\nf 11458 11459 11460\nf 11461 11462 11463\nf 11464 11465 11466\nf 11467 11468 11469\nf 11470 11471 11472\nf 11473 11474 11475\nf 11476 11477 11470\nf 11478 11479 11480\nf 11481 11482 11483\nf 11484 11485 11486\nf 11487 11488 11489\nf 11490 6483 11491\nf 11492 11493 11494\nf 11495 11496 11497\nf 11498 11499 11500\nf 11501 11502 11503\nf 11504 11505 11506\nf 11507 11508 11509\nf 11509 11510 11511\nf 11512 11513 11514\nf 11515 11516 11517\nf 11518 11519 11520\nf 11521 11522 11523\nf 11524 11525 11526\nf 11527 11528 11529\nf 11530 11531 11532\nf 11533 10159 11534\nf 11535 11536 11537\nf 11538 11539 11540\nf 11541 11542 11543\nf 11544 11545 11546\nf 11547 11548 11549\nf 11550 11551 11552\nf 11553 11554 11555\nf 11556 11557 11558\n\nusemtl material_2\nf 11559 11560 11561\nf 11562 11563 11564\nf 11565 11566 11567\nf 11568 11569 11570\nf 11571 11572 11573\nf 11574 11575 11576\nf 11577 11578 11579\nf 11580 11581 11582\nf 11583 11584 11585\nf 11586 11587 11588\nf 11589 11584 11590\nf 11591 11592 11593\nf 11594 11595 11596\nf 8802 11597 11598\nf 11599 11600 11601\nf 11602 11603 11604\nf 11605 11606 11607\nf 11608 11609 11610\nf 11611 11606 11612\nf 11613 11614 11611\nf 11615 11616 11617\nf 11618 11619 11620\nf 11621 8112 11622\nf 11623 11624 11625\nf 11626 11627 11628\nf 11629 11630 11631\nf 11632 11633 11634\nf 11635 11636 11637\nf 11638 11639 11640\nf 11641 11642 11643\nf 11644 11645 11646\nf 11647 11648 11649\nf 11650 11651 11652\nf 11653 11654 11655\nf 11656 11657 11658\nf 11659 11660 11661\nf 11662 11663 11664\nf 11662 11665 11666\nf 11667 11668 11669\nf 11670 11671 11672\nf 11670 11673 11674\nf 11675 11676 11677\nf 11678 11679 11680\nf 11681 11682 11683\nf 11684 11685 11686\nf 11687 11688 11689\nf 11690 11691 11692\nf 7345 11693 11694\nf 11695 11696 11697\nf 11698 11699 11700\nf 11701 11702 11703\nf 11704 11705 11706\nf 11707 11708 11709\nf 11710 11711 7359\n\nusemtl material_3\nf 11712 11713 11714\nf 11715 11716 11717\nf 11718 11719 11720\nf 11721 11722 11723\nf 11724 10540 11725\nf 11726 11727 11728\nf 11729 11730 11731\nf 11731 11732 11733\nf 11734 11735 11736\nf 11737 11738 11739\nf 11740 11741 11742\nf 11743 7371 11744\nf 11745 11746 11747\nf 11748 11736 11749\nf 11750 11751 11752\nf 11753 11754 11751\nf 11755 11756 11757\nf 11758 11759 11760\nf 11761 11762 11763\nf 11764 11765 11766\nf 11767 11768 11769\nf 11770 7580 11771\nf 11772 11773 11774\nf 11775 11776 11777\nf 11778 11779 11780\nf 11781 7566 11782\nf 11783 11784 11785\nf 11786 11787 11788\nf 11789 11790 11791\nf 11792 11793 11794\nf 11795 11796 11797\nf 11798 11799 11800\nf 11801 11802 11803\nf 11804 11805 11806\nf 11807 11808 11809\nf 11810 11811 11812\nf 11813 11814 11815\nf 11816 11817 11818\nf 11819 11820 11821\nf 11822 11823 11824\nf 11825 11826 11827\nf 11828 11829 11830\nf 11831 11832 11833\nf 11834 11835 11836\n\nusemtl material_1\nf 11837 11838 11839\nf 11840 11841 11842\nf 11843 11844 11845\nf 11846 11847 11848\nf 11849 11850 11851\nf 11852 11853 11854\nf 11855 11856 11857\nf 11858 11859 11860\nf 11861 11862 11863\nf 11864 11865 11866\nf 11867 11868 11869\nf 11870 11871 11872\nf 11873 11874 11875\nf 11876 11877 11878\nf 6745 11879 11880\nf 11881 11882 11883\nf 11884 11885 11886\nf 11887 11888 11889\nf 11890 11891 11892\nf 11893 11894 11895\nf 11896 11897 11898\nf 7442 11899 11900\nf 11901 11902 7443\nf 11903 7445 11904\nf 11905 11906 11907\nf 11908 11909 11910\nf 11911 11912 11913\nf 11914 11915 11916\nf 11917 11918 7450\nf 11919 11920 11921\nf 11922 11923 11924\nf 11925 11926 11927\nf 11928 11929 11930\nf 11931 11932 11933\nf 11934 11935 11936\n\nusemtl material_4\nf 7657 11937 7667\nf 11938 11939 7625\nf 11940 11939 11941\nf 11942 11943 11944\nf 11945 7477 11946\nf 11947 11948 7903\nf 7674 11949 11950\nf 11947 11945 11951\nf 11952 11953 11954\nf 11955 11956 11957\nf 11958 7490 11959\nf 11960 11961 11954\nf 11962 11963 11964\nf 7496 11965 11966\nf 7493 11967 7497\nf 11968 11962 11969\nf 7501 11970 11963\nf 11971 11972 7809\nf 11971 11973 11974\nf 7492 11972 11975\nf 7506 11976 7509\nf 7507 11977 11978\nf 11977 7511 11979\nf 11980 11981 7510\nf 11979 11982 11983\nf 11984 11982 11985\nf 11986 11980 11987\nf 11988 11986 11989\nf 11984 7512 11990\nf 11991 11992 11993\nf 11994 7515 7513\nf 7514 11995 11996\nf 11995 7518 11997\nf 11998 11999 12000\nf 12001 12002 12003\nf 11998 12004 12005\nf 12006 12007 12008\nf 12009 12010 12011\nf 7946 8042 7525\nf 12012 7527 12013\nf 12014 12015 12016\nf 12017 12018 12019\nf 12020 7529 7848\nf 12021 8436 7530\nf 7992 7534 12022\nf 12023 12024 12025\nf 12026 12027 12028\nf 7973 12029 12030\nf 8305 12031 12032\nf 7738 12033 12034\nf 12035 12036 7545\nf 12036 12037 7539\nf 12038 12037 12039\nf 7540 7541 12040\nf 12038 12041 7542\nf 12042 12041 12043\nf 8018 8019 12042\nf 12044 7544 12045\nf 12046 12047 7546\nf 12048 12047 12049\nf 12045 12050 7548\nf 12048 12051 12050\nf 12052 12051 12053\nf 7549 12054 12055\nf 7552 12056 12057\nf 7550 12054 12052\nf 12058 7551 12059\nf 12060 12061 12062\nf 7554 12063 7557\nf 12064 12063 12065\nf 12060 7556 12066\nf 12064 12067 7561\nf 12068 12069 12070\nf 12071 7581 12072\nf 12073 12074 7575\nf 7576 7569 7723\nf 12074 12075 7570\nf 12076 7587 12077\nf 7589 12078 7583\nf 12079 12080 12073\nf 12081 12082 12083\nf 12079 12078 12081\nf 12084 12085 12086\nf 12087 12088 7584\nf 12089 12090 12091\nf 12089 12082 12092\nf 7678 12093 7590\nf 12094 12093 12095\nf 12096 12097 7591\nf 12098 12097 12099\nf 7597 12100 12101\nf 12099 12102 12103\nf 7599 12102 12104\nf 12103 7603 12105\nf 12106 12107 7601\nf 7602 12108 12109\nf 7604 12107 12101\nf 12110 7606 7413\nf 12110 12111 12108\nf 12112 7616 12113\nf 11940 7788 12114\nf 7985 7624 7984\nf 7619 12115 7622\nf 12116 12117 12118\nf 12116 12119 12120\nf 7636 12121 12122\nf 7635 12123 12124\nf 12122 12123 12125\nf 7640 12126 12127\nf 12128 8009 12129\nf 12130 12131 7859\nf 7653 12132 7649\nf 7866 12133 7660\nf 7458 12134 12135\nf 12136 12135 12137\nf 7666 12138 7460\nf 12139 12140 7668\nf 12139 7476 11943\nf 11946 7670 7671\nf 7669 12141 7673\nf 7488 12142 12143\nf 12144 12142 12145\nf 7486 12145 7479\nf 12146 12147 7681\nf 12088 7677 12090\nf 12087 12146 12095\nf 12148 7680 7684\nf 7679 12084 12149\nf 12149 12150 12151\nf 12151 12152 7682\nf 7683 12153 7600\nf 12106 7598 12154\nf 12152 12155 7685\nf 7686 12156 12157\nf 12154 12158 7596\nf 12157 7691 7688\nf 7689 12159 7595\nf 12159 12160 12161\nf 7611 12160 7692\nf 7615 12162 12163\nf 7617 12164 12165\nf 7607 7613 12166\nf 12167 12168 12169\nf 12168 7700 12170\nf 7695 12166 7698\nf 12171 7612 12172\nf 12170 7703 12173\nf 7699 12171 12174\nf 7702 12175 12176\nf 12177 7706 7709\nf 7705 12178 12179\nf 12179 12155 12180\nf 12175 12177 12181\nf 12180 12182 7707\nf 12183 12184 12185\nf 12186 12187 12188\nf 12186 12189 12190\nf 12187 7715 12191\nf 12190 7712 7713\nf 7714 12192 7716\nf 12193 12194 12195\nf 12196 12191 12197\nf 12194 7721 12198\nf 12197 7718 7719\nf 7720 12199 12200\nf 12198 12201 12202\nf 12203 12202 12204\nf 12205 12200 7722\nf 12204 12206 12207\nf 12206 12208 12209\nf 12210 7726 12211\nf 12209 12212 12213\nf 12214 12212 12215\nf 7731 7564 12216\nf 12216 12217 12218\nf 12219 12220 7733\nf 12221 7536 7735\nf 7741 7736 12222\nf 7737 12223 12040\nf 12224 12223 12225\nf 12226 12227 12228\nf 12229 12230 12231\nf 12232 12233 12234\nf 12235 12236 12049\nf 12237 12238 12239\nf 12240 12241 12242\nf 12243 12244 12245\nf 12246 12247 12248\nf 12249 12250 12251\nf 12070 12252 12253\nf 12254 12255 12256\nf 12257 12258 12259\nf 12260 12261 12262\nf 12263 12264 12265\nf 12266 12267 12268\nf 12269 12270 12271\nf 12272 12273 12274\nf 12275 12276 12277\nf 12195 12278 12279\nf 12280 12281 12282\nf 7751 12283 12284\nf 12285 12286 12287\nf 12288 7752 12185\nf 7756 7757 12289\nf 12290 12291 12292\nf 12293 12294 12295\nf 7759 12296 12176\nf 12297 7758 12290\nf 12296 7760 12173\nf 12298 12299 7761\nf 12300 12301 12302\nf 7762 12303 12169\nf 12299 12304 7763\nf 12305 12306 12307\nf 12308 7768 12163\nf 12309 12310 12311\nf 7767 12312 12113\nf 12313 12310 7769\nf 12312 7771 12314\nf 12315 12316 7772\nf 12317 12316 12318\nf 12319 8027 8303\nf 12320 12033 12321\nf 12322 12323 12324\nf 12325 12326 12327\nf 12328 12329 12330\nf 12331 12332 12333\nf 12334 12335 12336\nf 12337 12338 12339\nf 12340 12341 12342\nf 12343 12344 12345\nf 12346 12347 12348\nf 12349 12350 12351\nf 12352 12353 12354\nf 12355 12356 12357\nf 12358 12359 12360\nf 12361 12362 12363\nf 12364 12365 12366\nf 12367 12368 12369\nf 12370 12371 12372\nf 12373 12374 12375\nf 12376 12377 12378\nf 12379 12380 12381\nf 12382 12383 12384\nf 12385 12386 12387\nf 12295 12388 12389\nf 7779 12390 12391\nf 12302 12392 12393\nf 12394 12395 12396\nf 12397 12398 12399\nf 12400 12401 12402\nf 12309 7469 12315\nf 12311 12403 12404\nf 12405 12406 12407\nf 12408 12409 12410\nf 12411 12412 12413\nf 12414 12415 12416\nf 12417 12418 12419\nf 12420 12421 12422\nf 12423 12424 12425\nf 12426 12427 12428\nf 12429 12430 12431\nf 12432 12431 12433\nf 12428 12434 12435\nf 12436 12437 12438\nf 12439 12440 12436\nf 12441 12442 12443\nf 7523 12444 7795\nf 7796 8345 12445\nf 12446 12445 7521\nf 7799 12447 7801\nf 12446 12448 12449\nf 12450 12451 12452\nf 12453 12454 7802\nf 12455 12456 12457\nf 12458 12459 12460\nf 12461 12462 12463\nf 12464 12465 12466\nf 12467 12468 12469\nf 12470 12471 12472\nf 12473 12474 12475\nf 12476 12477 12478\nf 12479 12480 12481\nf 12482 12483 12484\nf 12485 12486 12487\nf 12488 12489 12490\nf 12491 12492 12493\nf 12494 12495 12496\nf 12497 12498 12499\nf 12500 12501 12502\nf 12503 12504 12010\nf 8350 12505 12506\nf 12006 12507 12508\nf 12509 12510 12511\nf 12512 12513 12514\nf 12515 12516 12517\nf 12518 12519 12520\nf 12521 12522 12523\nf 12524 12525 12526\nf 12527 12528 12529\nf 12528 12530 12531\nf 12532 12533 11976\nf 12534 12535 12536\nf 12537 12535 12532\nf 12536 12538 12539\nf 12540 7806 12541\nf 12542 7805 12543\nf 11973 7807 7470\nf 12544 7533 12545\nf 12546 12547 12548\nf 12549 12550 12551\nf 12552 12553 12554\nf 12555 12556 12557\nf 12558 12559 12560\nf 12561 12562 12563\nf 12564 12565 12566\nf 12567 12568 12569\nf 12570 12571 12572\nf 12573 12574 12575\nf 12576 12577 12578\nf 12579 12580 12581\nf 12582 12583 12584\nf 12585 12586 12587\nf 12588 12589 12590\nf 12591 12592 12593\nf 12594 12595 12596\nf 12597 7871 12598\nf 12599 7819 12600\nf 12601 12602 12603\nf 12601 12604 12598\nf 12605 12606 12607\nf 12608 12609 7821\nf 12610 7820 12611\nf 12612 7822 12613\nf 12610 12614 12615\nf 12616 12617 12618\nf 12619 12620 12617\nf 12618 12621 12622\nf 12623 12624 12625\nf 12626 7825 12627\nf 12628 12629 12630\nf 12631 7828 12632\nf 12633 12629 12634\nf 12635 12636 12637\nf 12638 12639 12640\nf 12641 12636 12642\nf 12643 12644 12645\nf 12128 7834 7641\nf 12646 12644 12647\nf 12648 7839 12643\nf 12649 7844 7882\nf 7461 7841 12650\nf 7846 7843 7845\nf 12649 12651 7648\nf 12652 12653 7531\nf 12654 8390 12655\nf 7950 12012 12014\nf 12656 12653 12654\nf 7949 12657 12658\nf 12659 12660 12661\nf 12662 12663 12664\nf 12665 12666 12667\nf 12668 12669 12670\nf 12671 12672 12673\nf 12674 12675 12676\nf 12677 12678 12679\nf 12680 12681 12682\nf 12683 12684 12685\nf 12686 12687 12688\nf 12689 12690 12691\nf 12692 12693 12694\nf 12695 12696 12697\nf 12698 12699 12700\nf 12701 12702 12703\nf 12704 12702 12705\nf 12706 12707 12708\nf 7851 12709 12710\nf 12711 12712 12713\nf 12714 12715 12716\nf 12711 12717 12718\nf 12719 12720 12721\nf 12722 12723 12724\nf 12725 12726 12727\nf 12728 12729 12730\nf 12731 12732 12733\nf 12734 12735 12736\nf 12737 12738 12739\nf 12740 12741 12742\nf 12743 12744 12745\nf 12746 12747 12748\nf 12749 12750 12751\nf 12752 12753 12754\nf 12755 12756 12750\nf 12757 12758 12759\nf 12760 12761 12762\nf 12763 12758 12764\nf 12765 12766 12767\nf 7856 12768 12769\nf 12770 12766 12771\nf 12772 12773 12774\nf 12768 12775 12776\nf 12777 12773 12778\nf 12779 12780 12781\nf 12130 7860 7651\nf 12782 12783 12784\nf 7654 7862 12783\nf 7863 12785 12782\nf 12786 7652 12785\nf 12786 12787 12788\nf 12136 12787 7867\nf 12789 12790 12791\nf 7870 12792 12793\nf 12794 12019 12021\nf 12020 12795 12796\nf 12797 12793 12798\nf 12799 12800 12801\nf 12802 12803 12804\nf 12805 12806 12807\nf 12808 12809 12810\nf 12811 12812 12813\nf 12814 12815 12816\nf 12817 12818 12819\nf 12820 12821 12822\nf 12823 12824 12825\nf 12826 12827 12828\nf 12829 12830 12831\nf 12832 12833 12834\nf 12835 12836 12837\nf 12838 12839 12840\nf 12841 12842 12843\nf 12844 12845 12846\nf 12847 12848 12849\nf 12850 12851 12847\nf 12852 12851 12708\nf 12853 12854 12602\nf 12855 12856 7876\nf 12857 12858 12859\nf 12860 12861 12862\nf 12857 12863 12864\nf 12865 12866 12867\nf 12868 12869 12870\nf 12871 12872 12873\nf 12874 12875 12876\nf 12877 12878 12879\nf 12880 12881 12882\nf 12883 12884 12885\nf 12886 12887 12888\nf 12889 12890 12891\nf 12892 12893 12894\nf 12895 7877 12896\nf 12897 12893 12898\nf 12899 12900 12901\nf 12902 12903 12904\nf 12905 12900 12906\nf 12907 12908 12909\nf 12910 12908 12911\nf 12912 12913 12914\nf 12915 7883 12651\nf 12916 12913 12917\nf 12918 7886 12919\nf 12918 12920 12921\nf 12922 12923 12921\nf 12924 7888 12925\nf 12922 12131 7891\nf 7890 7892 12926\nf 12927 12928 12929\nf 12930 12928 7895\nf 12930 7898 12931\nf 7904 12932 7896\nf 7899 11959 11944\nf 12931 7901 12933\nf 7478 7902 7900\nf 7474 12934 11942\nf 12935 12936 12937\nf 12927 12935 12938\nf 7905 12939 7929\nf 7909 12940 12941\nf 12942 12943 12937\nf 12944 12943 12945\nf 12946 12947 12948\nf 12949 7911 12950\nf 12945 12947 12951\nf 7915 12952 12953\nf 12954 12955 12956\nf 12952 7917 7920\nf 7916 12957 12958\nf 12959 12960 12961\nf 12962 12963 12964\nf 7921 12965 12966\nf 12967 12968 12969\nf 12970 12971 12972\nf 12973 12974 11964\nf 12975 12972 12976\nf 12974 7932 12977\nf 12976 12941 7930\nf 12978 12979 11969\nf 12978 12977 12980\nf 12981 12979 12982\nf 12983 7919 12984\nf 12542 12985 12986\nf 12985 12987 12981\nf 12986 12988 12989\nf 12990 12991 7939\nf 12992 12993 12994\nf 12995 7926 7924\nf 12996 12997 12998\nf 12999 13000 12415\nf 13001 7947 13002\nf 13003 13004 13002\nf 7944 13005 13006\nf 13007 13005 7798\nf 13008 7951 13009\nf 13010 13011 13012\nf 13013 13014 13015\nf 13016 13017 13018\nf 13019 13020 13021\nf 13022 13023 13024\nf 13025 13026 13027\nf 13028 13029 13030\nf 13031 13032 13033\nf 13034 13035 13036\nf 13037 13038 13039\nf 13040 13041 13042\nf 13043 13044 13045\nf 13046 13047 13048\nf 13049 13047 13050\nf 13051 13052 12705\nf 13053 13054 13055\nf 13049 13056 13057\nf 13058 13059 12713\nf 13060 13061 13062\nf 13063 13064 13065\nf 13066 13067 13068\nf 13069 13070 13071\nf 13072 13073 13074\nf 13075 13076 13077\nf 13078 13079 13080\nf 13081 13082 13083\nf 13084 13085 13086\nf 13087 13088 13089\nf 13090 7952 13091\nf 13092 7955 13093\nf 13094 13095 13096\nf 13097 13098 13099\nf 13100 13101 13102\nf 13103 13099 13104\nf 13105 13106 13104\nf 13098 13107 13108\nf 13109 13110 13111\nf 13112 13113 13114\nf 13115 13116 13117\nf 13118 13109 12929\nf 13119 7958 13120\nf 13121 13122 13123\nf 13124 11948 13125\nf 13126 13127 7659\nf 13128 7961 13127\nf 13129 7962 11951\nf 7964 11937 7963\nf 13129 7672 13130\nf 12143 7965 13130\nf 7966 13131 7675\nf 13132 13133 12029\nf 13134 13135 13136\nf 13137 8030 13138\nf 13139 13136 13140\nf 13141 13142 13143\nf 13144 13145 13146\nf 13147 13148 13149\nf 13150 13151 13152\nf 13153 13154 13155\nf 13156 13157 13158\nf 13159 13160 13161\nf 13162 13163 13164\nf 13165 13166 13167\nf 13168 13169 13170\nf 13171 13172 13173\nf 13174 13175 13176\nf 13177 13178 13179\nf 13180 13181 13182\nf 13183 13184 13185\nf 13186 13187 13188\nf 13189 13190 13191\nf 13192 13193 13194\nf 13195 13196 13197\nf 13198 13199 13200\nf 13201 13202 13203\nf 13204 13205 13206\nf 13207 13208 13209\nf 13210 13211 13212\nf 13213 13204 13214\nf 13215 13216 13217\nf 13218 13219 7967\nf 13220 13221 13222\nf 13223 13224 13225\nf 7969 13226 13227\nf 13228 13226 13229\nf 13230 13231 13232\nf 13233 13231 13234\nf 13235 7970 13236\nf 13237 13238 13239\nf 7989 13238 13240\nf 12028 7974 13241\nf 13242 7774 13243\nf 13244 13245 13246\nf 13244 13241 13247\nf 13248 13247 13249\nf 13250 13251 13252\nf 13253 13254 13255\nf 13256 13257 13258\nf 13259 13260 13261\nf 13262 13263 13264\nf 13265 13266 13267\nf 13268 13269 13270\nf 13271 13272 13273\nf 13274 13275 13276\nf 13277 13278 13279\nf 13280 13281 13282\nf 13283 13284 13285\nf 13286 13287 13288\nf 13289 13290 13291\nf 13292 13293 13294\nf 13295 13296 13297\nf 13298 13299 13300\nf 13301 13302 13303\nf 13304 13305 13306\nf 13307 13308 13309\nf 13310 13311 13312\nf 13313 13314 13315\nf 12394 13316 13317\nf 12396 13318 13319\nf 13320 13321 13322\nf 12400 13323 13324\nf 7979 13325 13320\nf 13219 13326 13220\nf 13327 13328 13329\nf 13330 7982 12114\nf 13330 13331 13332\nf 13333 13334 13335\nf 13336 13337 7986\nf 7627 12119 13338\nf 13339 13340 7990\nf 13339 13341 13342\nf 13343 13344 12121\nf 13345 13346 7988\nf 13347 13348 12023\nf 13349 13350 13351\nf 13352 13353 13354\nf 13355 13356 13357\nf 13358 13359 13360\nf 13361 13362 13363\nf 13364 13365 13366\nf 13367 13368 13369\nf 13370 13371 13372\nf 13373 13374 13375\nf 13376 13377 13378\nf 13379 13380 13381\nf 13382 13383 13384\nf 13385 13386 13387\nf 13388 13389 13390\nf 13391 13392 13393\nf 13394 13395 13396\nf 13397 13398 13399\nf 13400 13401 13402\nf 13403 13404 13405\nf 13406 13407 13408\nf 13409 13410 13411\nf 13412 13413 13225\nf 13414 13415 13416\nf 13417 13418 13419\nf 12612 13418 13420\nf 13421 13422 13234\nf 13423 13422 7997\nf 13424 13425 13426\nf 13240 7998 13427\nf 13424 13428 13429\nf 13430 13431 13432\nf 13433 13434 13435\nf 13436 13431 13437\nf 13438 13439 13440\nf 13441 13442 13443\nf 13444 13439 13445\nf 13446 13447 13448\nf 13449 13447 13450\nf 8008 8006 13451\nf 7631 13452 11896\nf 13453 13452 8007\nf 13453 13454 13455\nf 12127 13454 8010\nf 13456 13457 8166\nf 8012 13458 13459\nf 13460 13461 13462\nf 8078 13463 13464\nf 13465 13466 13467\nf 8193 8261 13468\nf 12222 8026 8023\nf 8025 8260 13469\nf 13470 13471 13472\nf 8553 13135 13473\nf 13474 13475 13476\nf 13477 8034 13478\nf 13477 13479 13480\nf 13481 13482 13483\nf 13484 12652 13485\nf 13486 8391 13484\nf 13001 13487 13488\nf 12011 13489 13490\nf 13491 13492 12002\nf 13491 13493 13466\nf 12004 13494 13495\nf 13496 8049 13497\nf 8048 13498 13499\nf 13495 13498 13500\nf 13501 13502 13503\nf 13497 13503 13504\nf 8050 13504 13505\nf 13496 13506 13507\nf 13508 13506 8052\nf 13509 8051 13510\nf 13509 13511 13512\nf 13513 13512 13514\nf 13508 13513 13515\nf 8054 13516 13517\nf 8073 13518 8062\nf 8329 8059 13519\nf 13520 13521 13522\nf 13523 13524 8072\nf 13523 8069 13525\nf 8058 13524 13526\nf 13527 13528 8074\nf 13529 13530 13528\nf 13531 13532 13533\nf 13534 13535 8484\nf 13531 13534 13464\nf 13533 13536 8080\nf 13537 13538 13539\nf 13537 8552 13540\nf 13541 13542 13543\nf 13538 8089 8473\nf 8095 13542 8551\nf 13540 13541 8087\nf 13544 8101 8541\nf 13544 8107 13545\nf 13545 13546 8096\nf 8106 8435 13547\nf 13548 13549 13546\nf 13548 13547 8104\nf 13550 8424 8470\nf 13550 8113 8115\nf 13551 8423 13552\nf 8429 8118 8108\nf 8385 8120 13553\nf 13554 8122 8387\nf 13554 13555 13556\nf 8463 8121 13557\nf 13557 8124 8126\nf 8132 13558 13559\nf 13560 13558 13561\nf 13562 13560 13563\nf 13564 13565 8136\nf 13566 13567 13562\nf 13568 8142 13569\nf 13568 8140 8569\nf 13570 8567 13571\nf 13572 13573 13574\nf 13575 13576 13577\nf 13578 13579 13580\nf 13578 13581 13575\nf 13582 13583 13584\nf 13582 13585 13586\nf 13587 8144 13588\nf 13589 13586 13590\nf 13591 8319 13592\nf 13591 13593 13594\nf 13595 13596 13597\nf 13598 13599 13600\nf 13601 13602 13598\nf 13603 13602 13604\nf 13604 8298 8295\nf 13605 8151 13606\nf 13607 13608 13609\nf 13610 13611 13612\nf 13610 13606 13613\nf 13614 13615 13616\nf 13617 13618 13619\nf 13617 8219 8161\nf 13620 8160 13621\nf 13620 13458 13457\nf 13622 13623 13615\nf 8162 13456 13622\nf 13618 13624 8155\nf 8164 13625 13626\nf 8167 8011 13626\nf 13627 8177 13628\nf 8179 13629 13630\nf 13631 13632 13633\nf 8245 13634 8170\nf 8174 13634 8189\nf 8173 13635 8175\nf 13636 8178 8239\nf 13636 8176 13637\nf 13638 13637 13639\nf 13640 13641 13642\nf 8252 13643 8181\nf 8187 8182 13644\nf 13645 13646 13647\nf 13648 8258 8203\nf 13648 13649 13650\nf 11817 13651 8017\nf 13651 13652 8194\nf 13653 13652 13654\nf 8195 8196 13655\nf 13653 13656 8197\nf 13657 13656 13658\nf 13659 13660 13661\nf 13662 13657 13663\nf 8198 13659 13664\nf 13665 8200 13666\nf 13665 13649 13667\nf 13668 8205 13669\nf 13632 13670 13669\nf 13671 8204 13672\nf 13668 13673 13674\nf 13675 8208 13676\nf 13677 13678 8165\nf 13679 8207 13680\nf 13677 8013 13681\nf 13680 13682 13683\nf 13682 8212 8215\nf 8209 13681 8210\nf 8211 13459 13684\nf 13684 13621 13685\nf 13686 8214 13687\nf 13688 8152 13613\nf 8213 13685 8216\nf 8217 8159 13689\nf 13611 13689 8218\nf 8149 13597 13690\nf 13690 13691 13692\nf 13603 13693 13694\nf 13688 8147 13607\nf 13695 13694 13696\nf 13697 13698 8221\nf 13699 13700 13701\nf 8222 13702 13703\nf 13704 13705 13706\nf 13686 13699 13707\nf 13708 13704 13709\nf 8225 13710 13711\nf 13712 13713 13714\nf 13715 13716 13717\nf 13718 13712 13719\nf 13720 13721 8228\nf 13714 13722 13723\nf 13724 13725 13723\nf 13724 13726 13727\nf 8229 13728 8230\nf 13729 13727 13730\nf 13731 13730 13732\nf 13733 13734 13627\nf 8235 13735 8236\nf 13734 8238 8240\nf 13736 13735 13731\nf 8241 8244 8169\nf 8237 13737 8242\nf 8243 13738 8246\nf 8247 13739 8183\nf 13740 13741 13742\nf 13740 13743 13744\nf 8184 8250 8180\nf 13742 13745 13746\nf 13747 13748 13749\nf 13747 13750 8276\nf 13751 8251 8255\nf 13748 13752 8256\nf 13753 13752 13754\nf 7408 8254 13755\nf 13756 13753 8190\nf 13755 13756 8257\nf 13757 8028 7740\nf 13758 13759 13760\nf 13761 8024 13762\nf 13763 8264 13764\nf 13765 8267 13766\nf 13767 13768 13769\nf 13770 8270 13771\nf 13772 13773 13774\nf 13775 13776 13777\nf 13778 13779 13780\nf 13781 13782 8274\nf 13783 13784 13785\nf 13786 13787 13788\nf 13789 13790 13791\nf 13792 13793 13794\nf 13795 13796 13797\nf 13798 13799 13800\nf 13801 13802 13803\nf 13804 13805 13806\nf 13807 13808 13809\nf 13810 13811 13812\nf 13813 13814 13815\nf 13816 13814 13817\nf 13818 8281 13819\nf 8282 13820 13821\nf 8280 13822 13823\nf 13824 13825 13822\nf 13825 13826 13827\nf 13828 13824 13829\nf 13826 13830 13831\nf 13828 13832 13833\nf 13830 13833 13834\nf 13835 13836 13837\nf 13838 13831 13839\nf 13836 13840 13841\nf 13839 13842 13843\nf 13840 13843 8292\nf 13844 13845 13846\nf 13844 13841 13847\nf 13847 8296 13848\nf 8300 13848 8297\nf 13849 13846 13850\nf 13845 8302 8322\nf 13243 13851 13852\nf 13853 13851 12031\nf 13854 13855 8029\nf 13856 13857 13858\nf 13859 13860 13861\nf 13862 13863 13864\nf 13865 13866 13867\nf 13868 13869 13870\nf 13871 13872 13873\nf 13874 13875 13876\nf 13877 13878 13879\nf 13880 13881 13882\nf 13883 13884 13885\nf 13886 13887 13888\nf 13889 13890 13891\nf 13892 13893 13894\nf 13895 13896 13897\nf 13898 13899 13797\nf 13900 13901 13902\nf 13903 13904 13898\nf 13905 13906 13907\nf 13908 13909 13910\nf 13911 13912 13913\nf 13914 13915 13916\nf 13917 13918 13919\nf 13920 13918 13921\nf 13922 13923 13924\nf 13925 13926 13927\nf 13928 13926 13929\nf 13930 13931 13932\nf 13933 13934 13935\nf 13936 13934 13937\nf 13938 13939 13940\nf 13938 13941 13942\nf 13943 13944 13850\nf 13945 13943 8321\nf 13945 13946 13593\nf 13947 13948 13949\nf 13950 8498 13951\nf 13952 8499 13953\nf 13954 13955 13948\nf 13956 13957 13958\nf 13959 13960 13961\nf 8063 13962 13963\nf 13964 13962 8326\nf 13965 13966 13967\nf 13965 8328 8330\nf 13968 13969 8334\nf 13970 13971 13959\nf 13972 13973 13974\nf 13975 13976 13977\nf 13978 13979 13980\nf 13981 13982 13983\nf 13984 13985 13986\nf 13987 13988 13989\nf 13990 13991 13992\nf 13993 13994 13995\nf 13996 13997 13998\nf 13999 14000 14001\nf 8342 14002 12444\nf 14003 14004 14005\nf 14006 14007 14008\nf 14009 14010 14011\nf 14012 14013 14014\nf 14015 14016 14017\nf 14018 14019 14020\nf 14021 14022 14023\nf 14024 14025 14026\nf 14027 14028 14029\nf 14030 14031 14032\nf 14033 14034 14035\nf 14036 14037 14038\nf 14039 14040 14041\nf 14042 8349 14043\nf 14044 14042 14045\nf 14039 14046 8039\nf 14047 14046 8351\nf 14048 14049 14050\nf 14051 14052 14053\nf 14054 14055 14056\nf 14057 14058 14059\nf 14060 14061 14062\nf 14063 14064 14065\nf 14066 14067 14068\nf 14069 14070 14071\nf 14072 14073 14074\nf 14075 14076 13490\nf 14076 14077 8046\nf 13481 14078 14079\nf 14080 14081 14082\nf 14083 14081 14084\nf 14085 14086 14087\nf 14088 14089 14083\nf 14090 14091 14092\nf 14093 14094 14095\nf 14096 14097 14098\nf 14099 14100 14101\nf 14102 14103 14104\nf 14105 14106 14107\nf 14108 14109 14110\nf 14111 14112 14113\nf 14114 14115 14116\nf 14117 14118 14119\nf 14120 14121 14122\nf 14123 14124 14125\nf 14126 14127 14128\nf 14129 14130 14131\nf 14132 14133 14134\nf 14135 14136 14137\nf 14138 14139 14140\nf 14141 14142 14143\nf 8359 14144 14145\nf 14146 14147 14148\nf 14149 14150 8363\nf 14151 14152 14153\nf 14154 14152 14155\nf 14156 14157 14158\nf 14159 14160 14161\nf 8594 14162 14163\nf 14164 8372 14165\nf 14166 14167 14168\nf 14169 8377 14164\nf 14170 14171 8378\nf 14172 14173 8600\nf 14174 14175 8381\nf 8135 14176 14177\nf 14178 14179 14180\nf 8388 8128 13555\nf 8382 14180 14181\nf 14182 8037 12013\nf 14183 14184 14185\nf 14186 14187 14188\nf 14189 14190 14191\nf 14192 14193 14194\nf 14195 14196 14197\nf 14198 14199 14200\nf 14201 14202 14203\nf 14204 14205 14206\nf 14207 14208 14209\nf 14210 14211 14212\nf 14213 14214 14215\nf 14216 14217 14218\nf 14219 14220 14216\nf 14221 14222 14223\nf 14224 14225 14226\nf 14227 14228 14229\nf 14230 14231 14232\nf 14233 14234 14235\nf 14236 14237 14238\nf 14239 14240 14241\nf 14242 14243 14244\nf 14245 14246 14247\nf 14248 14249 14250\nf 14251 14252 14253\nf 14254 14255 14256\nf 14257 14258 14259\nf 14260 14261 14262\nf 14263 14264 14265\nf 14266 14267 14268\nf 14269 8400 14270\nf 14271 14272 14273\nf 8462 8406 14274\nf 14275 14276 14277\nf 14278 8412 8461\nf 14279 14280 14281\nf 8468 8418 14282\nf 14283 14284 14285\nf 13551 14285 8419\nf 14286 14287 14288\nf 8428 14288 13552\nf 8432 8427 14289\nf 14290 14291 8430\nf 14290 14292 8434\nf 8102 14292 8110\nf 14293 12018 14294\nf 14295 14296 14294\nf 14297 13485 8438\nf 14298 14299 14300\nf 14296 14089 14298\nf 14301 14302 14303\nf 14304 14301 14305\nf 14306 14307 14308\nf 14309 14310 14311\nf 14312 14313 14314\nf 14315 14316 14317\nf 14318 14319 14320\nf 14321 14322 14323\nf 14324 14325 14326\nf 14327 14328 14329\nf 14330 14331 14332\nf 14333 14334 14335\nf 14336 14337 14338\nf 14339 14340 14341\nf 14342 14343 14344\nf 8440 14345 14346\nf 14347 14229 14348\nf 14349 14350 14351\nf 14352 14353 14354\nf 14355 14356 14357\nf 14358 14359 14360\nf 14361 14362 14363\nf 14364 14365 14366\nf 14367 14368 14369\nf 14370 14371 14372\nf 14373 14374 14375\nf 14166 8375 14376\nf 14377 14378 14379\nf 14380 14381 14382\nf 8443 14383 14384\nf 14385 14386 14387\nf 14388 8452 14389\nf 14390 14391 14392\nf 14393 14394 14395\nf 14396 14397 8457\nf 8467 14398 14399\nf 14400 8471 14401\nf 8472 14399 8464\nf 14402 14400 8111\nf 13539 14403 8548\nf 14403 8477 14404\nf 8476 14405 14406\nf 14407 14406 8478\nf 14408 14409 8543\nf 14408 14404 14410\nf 14410 14407 8481\nf 14411 14409 14412\nf 8538 14411 14413\nf 14414 14412 8480\nf 8482 8079 8483\nf 14415 14416 14417\nf 14415 14413 14418\nf 14419 14420 8491\nf 8494 8488 13527\nf 13529 14421 8489\nf 14422 14423 14424\nf 14425 14416 8490\nf 14425 14423 8529\nf 8497 14426 14427\nf 14428 14429 14430\nf 8493 14431 14432\nf 14433 14429 14434\nf 14433 14435 14436\nf 14437 14422 14435\nf 14438 8503 14439\nf 14440 14441 14442\nf 14443 14444 14445\nf 14446 14444 14447\nf 14448 14449 14450\nf 14451 14449 14452\nf 13951 8500 14453\nf 14454 14455 14456\nf 8502 14457 14458\nf 14459 14460 14455\nf 14461 14462 14460\nf 8076 14463 14464\nf 8506 14465 14466\nf 14467 14468 14469\nf 14470 14471 14472\nf 14473 14474 14475\nf 14476 14477 14478\nf 14479 8510 14480\nf 14481 14482 14483\nf 14481 14484 14485\nf 14486 14487 14488\nf 14489 14490 14491\nf 13966 13969 14492\nf 14493 14049 14494\nf 14495 14496 8055\nf 14497 13511 14498\nf 14497 14495 14499\nf 14499 13517 14500\nf 13514 14500 14501\nf 14502 14503 8043\nf 14502 7948 14504\nf 14505 14504 13488\nf 14506 14507 14508\nf 14509 14510 14506\nf 14511 14512 14513\nf 14514 14509 14515\nf 14516 14517 14518\nf 14519 14520 14521\nf 14522 14523 14524\nf 14525 14526 14527\nf 14528 14529 14530\nf 14531 14532 14533\nf 14534 14535 14536\nf 14537 14538 14220\nf 14539 14540 8393\nf 14541 14542 14543\nf 14544 14545 14546\nf 14547 14548 14549\nf 14550 14551 14552\nf 14553 14554 14555\nf 14556 14557 14558\nf 14559 14560 14561\nf 14562 14563 14564\nf 14565 14566 14567\nf 14568 14569 14570\nf 14571 14572 14573\nf 14574 14575 14576\nf 14577 14571 14578\nf 14579 14580 14575\nf 14581 14582 14583\nf 14584 8518 14585\nf 14447 14586 14587\nf 14588 14589 14590\nf 14591 8521 14592\nf 14593 14594 14595\nf 14596 8524 14597\nf 14598 8527 14599\nf 14600 14601 14602\nf 14603 8533 14604\nf 14605 8531 14606\nf 8539 14607 14608\nf 8535 14609 14610\nf 8544 8540 14611\nf 8546 14612 8542\nf 8550 8549 8547\nf 14613 8032 14614\nf 14613 8578 14615\nf 14616 14614 14617\nf 14618 14619 14620\nf 14621 14622 14623\nf 14624 14625 14626\nf 14627 14628 14629\nf 14630 14631 14632\nf 14633 14634 14635\nf 14636 14637 14638\nf 14639 14640 14641\nf 14642 14643 14644\nf 14645 14646 14647\nf 14648 14649 14650\nf 14651 14652 14653\nf 14654 14655 14656\nf 14657 14658 14659\nf 14660 14661 14662\nf 14663 14664 14665\nf 14666 14667 14668\nf 14669 14670 14671\nf 14672 14673 14674\nf 14675 14676 14677\nf 14678 14679 14680\nf 14681 14682 14683\nf 14684 14685 14686\nf 14687 14688 14689\nf 14690 14691 8557\nf 8560 14692 14693\nf 8559 14694 14695\nf 14690 14696 14697\nf 14698 14699 14700\nf 14701 14702 14703\nf 14704 14702 14705\nf 14706 14707 8563\nf 14708 14709 14710\nf 14711 8562 14704\nf 14712 8143 14713\nf 14712 14709 13580\nf 13132 14714 14715\nf 14714 14716 14717\nf 14718 12027 14719\nf 14719 13470 14720\nf 14721 14717 14722\nf 14723 14724 14725\nf 14726 14727 14728\nf 14729 14730 14731\nf 14732 14733 14734\nf 14735 14736 14737\nf 14738 14739 14740\nf 14741 14742 14743\nf 14744 14745 14746\nf 14747 14748 14749\nf 14750 14751 14752\nf 14753 14754 14755\nf 14756 14757 14758\nf 14759 14760 14761\nf 14762 14763 14764\nf 14765 14766 14767\nf 14768 14769 14770\nf 14771 14772 14773\nf 14774 14775 14776\nf 14777 14778 14779\nf 14780 14781 14782\nf 14783 14784 14785\nf 14786 14787 14788\nf 14789 14790 14791\nf 14792 14793 14794\nf 14795 14796 14797\nf 14798 14799 14800\nf 14801 14802 14803\nf 14804 8574 14805\nf 14806 14807 14808\nf 14809 14808 14810\nf 14811 14812 14813\nf 14814 13460 14705\nf 14815 14816 14817\nf 14815 14818 13590\nf 13461 14819 14820\nf 14816 14821 13572\nf 14821 13585 14822\nf 8033 14823 7994\nf 14824 14825 14826\nf 14827 14828 14829\nf 14830 14831 14832\nf 14833 14834 14835\nf 14836 14837 14838\nf 14839 14840 14841\nf 14842 14843 14844\nf 14845 14846 14847\nf 14848 14849 14850\nf 14851 14852 14853\nf 14854 14855 14856\nf 14857 14858 14859\nf 14860 14861 14862\nf 14863 14864 14865\nf 14866 14867 14868\nf 14869 14870 14871\nf 14872 14873 14874\nf 14875 14876 14877\nf 14878 14879 14880\nf 14881 14882 14883\nf 14884 14885 14886\nf 14887 14888 14889\nf 14890 14891 14892\nf 14893 14894 14895\nf 14896 14897 14898\nf 8582 14899 14900\nf 14901 14902 14903\nf 14904 14902 14905\nf 14906 14907 8558\nf 8592 14908 14909\nf 14910 14911 14912\nf 14913 14914 14911\nf 14915 14916 14917\nf 8137 8603 13571\nf 14918 14919 8606\nf 14920 14918 8599\nf 14921 13565 14922\nf 14921 14923 8604\nf 14924 13566 13564\n\nusemtl material_0\nf 9577 8655 14925\nf 14925 8658 6031\nf 6553 9875 14926\nf 8844 14927 6088\nf 6106 8804 8736\nf 6276 8847 8842\nf 14928 8922 8920\nf 8921 8929 14929\nf 8928 8935 14930\nf 8934 8942 14931\nf 8941 14932 14933\nf 14934 8949 8945\nf 14935 8962 14936\nf 14937 14938 14939\nf 8956 14938 14940\nf 14941 14942 6366\nf 14941 9628 14943\nf 14944 14945 14946\nf 9025 14946 14947\nf 14948 14949 9019\nf 9042 9026 14950\nf 9048 9035 14951\nf 9047 14952 14953\nf 9056 9043 14954\nf 14955 14956 14957\nf 9069 9057 14958\nf 9072 14959 14960\nf 14961 14962 14963\nf 9076 14964 14963\nf 14965 14964 14966\nf 9081 9070 14967\nf 14968 9091 14969\nf 10129 14970 14971\nf 6381 9106 9108\nf 14972 6390 6388\nf 14972 9119 14973\nf 9131 9129 14974\nf 14974 14975 6396\nf 6401 14976 14977\nf 14977 14978 6404\nf 14979 14978 14980\nf 6065 14981 14982\nf 14981 9154 14983\nf 9153 9160 14984\nf 9159 9166 14985\nf 9165 9172 14986\nf 9171 9181 14987\nf 14988 14989 14990\nf 14991 14992 9188\nf 9190 14992 14993\nf 9194 14994 14995\nf 9200 9195 14996\nf 9206 9201 14997\nf 9212 9207 14998\nf 9218 9213 14999\nf 9224 9219 15000\nf 9230 9225 15001\nf 9236 9231 15002\nf 15003 9237 15004\nf 6418 15005 6420\nf 15006 9264 9266\nf 10123 9277 15007\nf 9276 9283 15008\nf 9282 9289 15009\nf 9288 9295 15010\nf 9294 9301 15011\nf 9300 9310 9308\nf 6433 15012 15013\nf 9320 15013 15014\nf 9323 9321 15015\nf 9329 9324 15016\nf 9335 9330 15017\nf 9338 9336 15018\nf 9344 9339 15019\nf 9350 9345 15020\nf 9356 9351 15021\nf 9362 9357 15022\nf 9368 9363 15023\nf 9371 9369 15024\nf 15025 9372 15026\nf 15027 15028 6442\nf 15027 6440 9399\nf 6455 6456 9419\nf 15029 9425 15030\nf 9424 9431 15031\nf 9430 9437 15032\nf 9436 9443 15033\nf 9442 9449 15034\nf 15035 15036 9452\nf 15037 15038 6460\nf 9463 15038 15039\nf 9469 9464 15040\nf 9475 9470 15041\nf 9481 9476 15042\nf 9487 9482 15043\nf 9493 9488 15044\nf 9499 9494 15045\nf 9505 9500 15046\nf 9511 9506 15047\nf 9517 9512 15048\nf 9523 9518 15049\nf 9529 9524 15050\nf 9535 9530 15051\nf 9536 15052 6463\nf 15053 9568 15054\nf 15055 15056 15057\nf 9602 9563 9605\nf 15058 9587 15059\nf 9608 15060 15061\nf 15062 9578 15063\nf 15062 9619 6497\nf 9622 9620 9618\nf 15064 9624 9629\nf 9640 9647 15065\nf 9646 9653 15066\nf 6499 15067 15068\nf 9685 15069 15068\nf 15070 9687 15071\nf 9697 9695 15072\nf 15073 9698 15074\nf 9709 9707 15075\nf 15076 9710 15077\nf 9721 9719 15078\nf 9727 9722 15079\nf 9733 9728 15080\nf 9734 15081 6502\nf 8690 9762 15082\nf 9761 9768 15083\nf 9767 9774 15084\nf 9773 9780 15085\nf 9779 9786 15086\nf 9785 9792 15087\nf 9791 9801 15088\nf 15089 9808 6531\nf 15090 9806 15091\nf 15090 15092 6534\nf 15093 15092 15094\nf 9821 15095 15096\nf 9827 9822 15097\nf 9833 9828 15098\nf 15099 15100 15101\nf 15102 9840 15103\nf 15104 15105 15106\nf 15104 9846 15107\nf 15108 9884 9877\nf 9883 9890 15109\nf 9889 9896 15110\nf 9895 9902 15111\nf 9901 9908 15112\nf 9907 9917 15113\nf 9916 9922 15114\nf 15115 15116 6556\nf 15115 15117 15118\nf 15119 9928 6559\nf 15120 15121 15122\nf 9940 15123 15124\nf 15125 9941 15126\nf 15127 15128 8995\nf 15129 9944 15130\nf 15131 15132 9002\nf 15131 15128 15133\nf 15134 6568 9960\nf 15135 9968 15136\nf 15135 10105 6575\nf 9967 9974 15137\nf 9973 9980 15138\nf 9979 9986 15139\nf 9985 9992 15140\nf 9991 10001 15141\nf 9995 15142 15143\nf 15144 10013 6580\nf 10011 15145 6583\nf 6584 15146 15147\nf 10024 10019 15148\nf 10033 15149 15150\nf 10039 10034 10038\nf 10045 15151 10042\nf 15152 10046 15153\nf 10057 15154 15155\nf 10058 15156 6586\nf 10808 15157 15158\nf 10494 15159 11419\nf 6818 10089 10229\nf 10094 6618 15160\nf 15161 10116 6635\nf 10157 10153 6668\nf 7150 15162 6702\nf 6710 15162 7115\nf 10238 10219 15163\nf 15164 10889 10228\nf 10085 15165 6819\nf 15166 15165 10233\nf 15167 10235 15168\nf 10259 6831 10271\nf 15169 10519 15170\nf 6849 10272 15171\nf 10512 15172 15173\nf 6860 15174 10290\nf 10296 15175 15176\nf 10506 15177 10323\nf 15178 15179 15180\nf 6872 15179 15181\nf 15182 10294 15183\nf 15182 15184 6877\nf 10321 15185 10333\nf 10299 10318 15172\nf 10500 15186 10327\nf 10330 15177 10326\nf 11425 10328 15187\nf 15188 11434 10340\nf 10343 11440 15189\nf 15190 11446 15191\nf 15190 15192 15193\nf 10715 15194 11399\nf 15195 15196 10363\nf 10542 15197 10369\nf 10703 15196 10366\nf 10697 15197 10372\nf 10554 15198 10378\nf 10694 10548 10375\nf 10560 15199 10384\nf 10688 15198 10381\nf 15200 10390 10566\nf 10682 15199 10387\nf 10572 10576 10394\nf 10423 6890 10653\nf 15201 15202 11407\nf 10492 15203 10441\nf 10545 15204 10438\nf 10497 15205 10447\nf 10551 15203 10444\nf 10503 15206 10453\nf 10557 15205 10450\nf 10509 15207 10459\nf 10563 15206 10456\nf 15208 15209 15210\nf 10569 15207 10462\nf 6905 10525 10477\nf 10436 15211 11413\nf 10073 15212 10499\nf 10442 15213 10496\nf 10324 15214 10505\nf 10448 15212 10502\nf 10297 15215 10511\nf 10454 15214 10508\nf 15216 15217 6921\nf 15218 15219 6919\nf 6920 15220 15221\nf 10460 15215 15222\nf 10709 15157 11402\nf 10434 15223 10544\nf 10439 15224 10550\nf 10370 15223 10547\nf 10445 15225 10556\nf 10373 15224 10553\nf 10451 15226 10562\nf 10379 15225 10559\nf 10457 15227 10568\nf 10385 15226 10565\nf 15228 10575 10578\nf 6942 15227 10571\nf 6948 10471 10588\nf 6972 15229 11346\nf 10673 10606 10609\nf 6974 15230 15231\nf 11356 15232 10621\nf 10615 10618 10685\nf 11362 15233 10627\nf 10691 15232 10624\nf 11365 15234 10630\nf 11371 15235 10636\nf 10700 15234 10633\nf 11377 15236 10642\nf 10706 15235 10639\nf 15237 10714 11383\nf 10711 15236 10645\nf 10417 10655 15238\nf 10402 10666 10396\nf 10610 15239 15240\nf 10391 10671 10675\nf 15241 6988 10613\nf 15241 15242 10684\nf 10388 10678 6985\nf 10619 15243 10690\nf 10382 15242 10687\nf 10625 15244 10696\nf 10376 15243 10693\nf 10628 15245 10699\nf 10634 15246 10705\nf 10367 15245 10702\nf 10640 15247 10710\nf 10361 15246 10708\nf 15248 15247 10713\nf 6997 15249 15250\nf 6998 15251 10737\nf 10832 15211 11412\nf 10806 10840 10838\nf 10835 15252 10730\nf 15253 10811 15254\nf 15187 11424 11098\nf 10830 15255 10763\nf 11091 15256 10760\nf 15257 15258 10769\nf 11085 15255 10766\nf 10839 15259 10772\nf 11079 15258 15260\nf 11076 15259 10775\nf 10793 10792 11088\nf 11082 11136 15261\nf 15262 15263 10802\nf 15264 15265 15266\nf 15267 15262 11137\nf 11405 11408 10364\nf 15268 15269 10810\nf 11396 15270 10813\nf 15271 15272 7017\nf 10758 15159 11418\nf 10764 15273 10834\nf 15260 10726 10837\nf 15274 10843 15275\nf 11064 15272 10846\nf 10855 10894 15276\nf 10858 10903 15277\nf 10864 10909 15278\nf 10870 10915 15279\nf 10876 10921 15280\nf 10882 10927 15281\nf 7029 10945 15282\nf 15283 15284 15285\nf 15286 10956 10951\nf 10908 10962 15287\nf 15288 15160 7031\nf 15288 15289 15290\nf 10914 10968 15291\nf 15292 10106 7033\nf 15292 15293 15294\nf 10920 10974 15295\nf 15296 8686 7036\nf 15296 15297 15298\nf 10926 10980 15299\nf 15161 15300 15301\nf 10929 10986 15302\nf 15303 15304 7039\nf 10935 10124 15305\nf 10941 10995 15306\nf 15307 10991 15308\nf 10854 15309 15310\nf 15311 15312 7042\nf 15311 11000 15313\nf 10863 11006 15314\nf 10869 11012 15315\nf 10875 11018 15316\nf 10881 11024 15317\nf 10887 11030 15318\nf 15319 11036 15320\nf 15321 11041 15322\nf 11056 15323 7045\nf 7049 11062 15324\nf 10842 11067 11072\nf 11138 15325 11078\nf 15326 15327 11075\nf 10800 15328 11081\nf 10770 15325 10804\nf 15329 15330 11087\nf 10767 15328 11084\nf 15331 11093 10788\nf 10761 15330 11090\nf 15332 15333 15334\nf 10756 15331 11094\nf 15335 15336 7055\nf 15337 11429 15338\nf 11002 15339 15340\nf 10776 11111 15341\nf 11008 11107 15342\nf 15343 10779 7058\nf 15343 11117 15344\nf 11014 15345 15346\nf 15347 10782 7061\nf 15347 11123 15348\nf 11020 15349 15350\nf 15351 11129 11127\nf 11026 11125 15352\nf 11131 15353 15354\nf 15355 15356 11038\nf 15357 11142 11073\nf 11043 15358 15359\nf 11069 11144 15360\nf 15361 15362 15363\nf 15364 11146 11149\nf 10182 15365 6743\nf 11160 7078 11165\nf 11175 6706 6711\nf 7163 6671 11193\nf 15366 11279 11380\nf 7177 11211 15367\nf 15368 11209 7205\nf 7174 7179 11213\nf 11217 7185 15369\nf 11238 15370 7084\nf 15371 11219 15372\nf 10186 15373 7189\nf 15374 15373 11226\nf 7202 15375 7156\nf 7206 15376 11191\nf 7184 15377 15378\nf 7218 11240 11155\nf 7221 11243 11225\nf 11257 15367 15379\nf 15380 11254 15381\nf 11326 7234 11259\nf 15382 15383 15384\nf 15382 15385 11263\nf 11218 15386 15378\nf 11334 7237 11268\nf 15385 11265 11224\nf 15387 11385 11316\nf 11374 15388 11285\nf 11318 15366 11282\nf 11368 15389 11291\nf 11323 15388 11288\nf 11329 15389 11294\nf 7247 11359 15390\nf 11332 15391 11297\nf 15392 7244 11354\nf 15392 11302 11301\nf 11336 15393 11340\nf 6756 11307 15394\nf 15395 11314 11252\nf 11283 15396 11322\nf 11255 11277 11320\nf 11289 15397 11328\nf 15398 15396 11325\nf 15384 7262 15399\nf 11260 15397 11331\nf 15399 15400 11266\nf 15401 15402 7266\nf 11339 15402 11274\nf 11270 11337 11273\nf 7265 7253 11342\nf 15403 11344 11347\nf 11304 15404 11306\nf 10611 11348 11350\nf 7277 15405 11358\nf 10616 11353 7274\nf 11295 15406 11364\nf 10622 15405 11361\nf 11292 15407 11367\nf 11286 15408 11373\nf 10631 15407 11370\nf 11280 15409 11379\nf 10637 15408 11376\nf 15409 11382 10643\nf 11308 15410 15411\nf 11390 15410 7280\nf 15412 11386 11389\nf 15412 10745 11398\nf 15413 11400 10722\nf 10805 11403 15269\nf 11410 15204 10433\nf 15414 11409 15252\nf 11416 15213 10491\nf 10829 11414 15273\nf 11422 15186 10075\nf 10755 11420 15256\nf 15415 15416 15417\nf 11436 10777 15418\nf 11442 11105 15419\nf 11448 10998 15420\nf 15421 15422 7283\n\nusemtl material_1\nf 15423 15424 7423\nf 15425 15426 15427\nf 15428 15429 15430\nf 15431 15432 15433\nf 15434 15435 15436\nf 15437 15438 15439\nf 15440 11473 15441\nf 11475 15442 15443\nf 15444 15445 7288\nf 15446 15447 15448\nf 15449 15450 15451\nf 15452 15453 15454\nf 15455 15456 15457\nf 15458 15459 15460\nf 15461 15462 15463\nf 15464 15465 15466\nf 15467 15468 15466\nf 15469 15470 15471\nf 15472 15473 15474\nf 15475 15476 15477\nf 15478 15479 15480\nf 15481 15482 15483\nf 15484 15485 15486\nf 15487 15488 15489\nf 15490 15491 7297\nf 11543 15492 15493\nf 15494 15495 11541\nf 15494 15496 15497\nf 15498 15499 15500\nf 15501 15502 15503\nf 15504 15505 11519\nf 15504 15506 15507\nf 15508 15509 15510\nf 15511 15512 15513\nf 15514 15515 11525\nf 15516 15517 15518\nf 15519 15520 15521\nf 15522 15523 15524\nf 15525 7307 15526\nf 7473 15527 15528\nf 15529 15530 15531\nf 15532 15533 15534\nf 15535 15536 7315\nf 15537 15538 15539\nf 15540 15541 11538\nf 15542 15543 15544\nf 15545 15546 15547\nf 15548 15549 15550\nf 15551 15552 15553\nf 15554 15555 15556\nf 15552 15557 15558\nf 15559 15560 15561\nf 15562 15563 15564\nf 15565 15566 15567\nf 15568 15569 15570\nf 15571 15572 15573\nf 15574 15575 15576\nf 15577 15578 15579\nf 15580 15581 15582\nf 15583 15574 15584\n\nusemtl material_2\nf 15585 15586 15587\nf 15588 15589 15590\nf 15591 15592 15593\nf 15594 15595 7323\nf 15596 11573 15597\nf 15596 15598 15599\nf 15600 15601 15602\nf 15603 15604 15605\nf 15606 15607 15608\nf 15609 15610 15611\nf 15612 15613 15614\nf 15615 15616 15617\nf 15618 15619 11587\nf 15620 15621 15622\nf 15623 15624 15625\nf 11599 15626 15627\nf 15628 15629 15630\nf 15631 15632 15633\nf 15634 15635 15636\nf 11627 15637 15638\nf 15639 11634 15640\nf 15641 15642 15643\nf 15644 15645 15646\nf 15644 15647 15648\nf 15649 15647 15650\nf 15651 15652 15653\nf 15654 15655 15656\nf 15657 15658 15659\nf 15660 15661 15662\nf 15663 11658 15664\nf 15665 15666 15667\nf 15668 15669 15670\nf 15671 11668 15672\nf 15673 15674 15675\nf 15676 15677 15678\nf 15679 15680 15681\nf 15682 15683 15684\nf 15685 15686 15687\nf 15688 15689 15690\nf 15691 15692 15693\nf 15694 15695 15696\nf 15697 15698 11709\nf 15699 15700 15701\nf 15702 15703 15704\nf 15705 15706 15707\nf 15708 15709 15710\nf 15710 15711 15712\nf 15713 15714 15715\nf 15716 15717 15718\nf 15719 15720 15721\nf 15722 15723 15724\nf 15725 11706 15726\nf 15727 15728 15729\nf 15730 15731 15732\nf 15733 15734 15735\nf 15736 15737 15732\n\nusemtl material_3\nf 15738 15739 11842\nf 15740 15741 15742\nf 15743 15744 15745\nf 15746 15747 15748\nf 15749 15750 7362\nf 15751 15752 15753\nf 12111 15754 15755\nf 15756 15757 15758\nf 15759 15760 15761\nf 15762 15763 11723\nf 15764 11724 15765\nf 15766 15767 15768\nf 15766 15769 15770\nf 15771 15768 15772\nf 15773 15774 15775\nf 15776 15777 15778\nf 15779 11730 15780\nf 15779 15781 15782\nf 15783 15784 15785\nf 15786 15787 15788\nf 15789 15790 15791\nf 15792 15793 15794\nf 15795 15796 15797\nf 15798 15799 15800\nf 15801 15802 15803\nf 15804 15805 15806\nf 15807 15808 15809\nf 15810 15811 15812\nf 15813 15814 15815\nf 15816 15817 15818\nf 15819 15820 15821\nf 15822 11788 15823\nf 12066 15824 15825\nf 15826 15827 15828\nf 15829 15830 15831\nf 15832 15833 15834\nf 15835 15836 15837\nf 15838 15839 15840\nf 15841 6611 15842\nf 15843 15844 15845\nf 15846 15847 15848\nf 15849 15850 15851\nf 15852 15853 15854\nf 15855 15856 15857\nf 15858 15859 15860\nf 15861 15862 15858\nf 15861 15863 11811\nf 15864 15865 15866\nf 15867 15868 15869\nf 15867 15862 15870\nf 15871 15872 15873\nf 15874 15875 15876\nf 15877 15878 15879\nf 15880 15881 15882\nf 15883 15884 15885\nf 15886 15887 15888\nf 15889 15890 15891\nf 15892 15893 15894\nf 15895 15896 15897\nf 15898 11835 15899\nf 15900 15901 11834\nf 15902 15903 15904\n\nusemtl material_1\nf 15905 15906 15907\nf 15908 15909 15910\nf 15911 15912 15913\nf 15914 15915 11460\nf 15916 11848 11844\nf 15917 15918 15919\nf 11845 15920 15921\nf 15922 15923 15924\nf 15925 15926 15927\nf 15928 15929 15930\nf 15931 15932 15933\nf 15934 15935 15936\nf 15937 11867 15938\nf 15939 15940 15941\nf 15937 15940 15942\nf 15943 11877 15944\nf 15945 15946 15947\nf 15948 15949 15950\nf 15949 15951 15952\nf 15953 15954 15955\nf 15956 15957 15958\nf 15959 7438 15960\nf 15961 15962 15963\nf 15964 15965 15966\nf 15967 15968 15969\nf 15970 15971 15963\nf 15972 15973 15974\nf 15975 15973 15976\nf 15977 15978 15979\nf 15980 15981 15982\nf 15983 15984 15981\nf 15985 15986 15987\nf 15988 7693 15989\nf 15990 15991 15992\nf 15993 15994 15995\nf 15996 15997 15998\nf 15999 11904 15997\nf 16000 16001 16002\nf 16003 16004 16005\nf 16006 16007 16008\nf 16009 16010 16011\nf 16012 16013 16014\nf 16015 16016 16017\nf 16018 16019 16020\nf 16021 16022 16023\nf 16024 16025 16026\nf 16027 16028 16029\nf 16030 16031 16032\nf 16033 16034 16035\nf 16036 16037 16038\nf 16039 16040 16041\nf 16042 16043 16044\nf 16045 16046 16047\nf 16048 16049 16050\nf 16051 16052 16053\nf 16054 16055 16056\n\nusemtl material_4\nf 11955 16057 11952\nf 11956 11961 7491\nf 16058 16059 12001\nf 12219 16060 7560\nf 16061 7586 16062\nf 13131 12144 16063\nf 12085 12147 16061\nf 7694 7697 12165\nf 7696 12167 12162\nf 16064 16065 12192\nf 16066 7582 12199\nf 16067 16068 7727\nf 16069 12218 16070\nf 16069 12259 16071\nf 7742 12227 12225\nf 12226 12230 16072\nf 12229 16073 16074\nf 16075 16073 7745\nf 16076 16077 12237\nf 12241 16077 7746\nf 16078 12250 12243\nf 12249 12255 16079\nf 12254 16080 16081\nf 12260 12267 16082\nf 12266 12276 16083\nf 12275 12281 16084\nf 16085 16086 7750\nf 12283 16087 7753\nf 12032 16088 16089\nf 12323 16088 7776\nf 16090 12329 16091\nf 12328 12335 12333\nf 12334 16092 16093\nf 12340 12347 12345\nf 12346 12353 12351\nf 12352 12359 12357\nf 12358 12365 12363\nf 12364 16094 16095\nf 12370 12380 16096\nf 12379 16097 16098\nf 16099 16100 16101\nf 16102 16103 7778\nf 13317 16104 7781\nf 13324 12409 16105\nf 16106 12421 16107\nf 7793 16106 16108\nf 16109 16110 12437\nf 12441 16111 12440\nf 16112 12456 16113\nf 16114 16115 16116\nf 12464 12459 16117\nf 12470 12465 16118\nf 12476 12471 16119\nf 12482 12477 16120\nf 12491 12483 16121\nf 12497 12492 16122\nf 16123 12498 16124\nf 12501 7520 14047\nf 12509 8044 16125\nf 12515 12510 16126\nf 12521 12516 16127\nf 12524 12522 16128\nf 12527 12525 11989\nf 12538 16129 7804\nf 16130 16129 12541\nf 16131 7808 7810\nf 7814 16132 16133\nf 12549 12556 16134\nf 12555 12562 16135\nf 12561 12568 16136\nf 12567 12574 16137\nf 12573 12580 16138\nf 12579 12586 16139\nf 12585 12589 16140\nf 12588 12592 16141\nf 12591 16142 16143\nf 12595 16144 7817\nf 12603 16145 12611\nf 12608 16146 7823\nf 12616 16147 16148\nf 7827 16149 7829\nf 16150 12638 7832\nf 16150 7830 16151\nf 12639 16152 7835\nf 7849 12656 16153\nf 12662 12669 16154\nf 12668 12675 16155\nf 12674 12681 16156\nf 12680 12687 16157\nf 12686 16158 16159\nf 12704 12712 7852\nf 12719 12715 16160\nf 12725 12720 16161\nf 12728 12726 16162\nf 12734 12729 16163\nf 12740 12735 16164\nf 12743 12741 16165\nf 16166 12744 16167\nf 12778 16168 7858\nf 12795 12800 16169\nf 16170 12806 16171\nf 12805 12812 16172\nf 12811 12818 16173\nf 12817 12824 16174\nf 12823 12830 16175\nf 12829 12836 16176\nf 12835 16177 16178\nf 12842 16179 7872\nf 12852 12858 7875\nf 12865 12861 16180\nf 12871 12866 16181\nf 12877 12872 16182\nf 12883 12878 16183\nf 12886 12884 16184\nf 12887 16185 7878\nf 12902 7879 16186\nf 16187 16188 7881\nf 16187 12903 16189\nf 12912 12769 12919\nf 7887 12923 7889\nf 7907 12949 12939\nf 12971 16057 7910\nf 12965 12958 12959\nf 12961 16190 16191\nf 16190 16192 16193\nf 16193 12996 12995\nf 16194 11966 16195\nf 7931 7933 16196\nf 16196 7936 12980\nf 16197 12983 7937\nf 16198 16199 16200\nf 16201 16202 7941\nf 7942 12998 16203\nf 12016 13004 16204\nf 16205 13011 16206\nf 13010 13017 16207\nf 13016 13023 16208\nf 13022 13029 16209\nf 13028 13035 16210\nf 13034 16211 16212\nf 16213 13059 16214\nf 13066 16215 16216\nf 13069 13067 16217\nf 16218 13070 16219\nf 13081 13079 16220\nf 7953 13082 16221\nf 7954 16222 7956\nf 7957 16223 13101\nf 13113 13117 7959\nf 13121 7960 16224\nf 13142 13140 13137\nf 13141 13148 16225\nf 13147 13154 16226\nf 13153 13160 16227\nf 13159 13166 16228\nf 13165 13172 16229\nf 13171 13178 16230\nf 13177 13184 16231\nf 13183 13190 16232\nf 13189 13196 16233\nf 13195 13202 16234\nf 16235 13208 13206\nf 13207 13216 16236\nf 13215 13224 16237\nf 13228 16238 7971\nf 16239 13237 16240\nf 13248 13254 16241\nf 13253 13260 16242\nf 13259 13266 16243\nf 13265 13272 16244\nf 13271 13278 16245\nf 13277 13284 16246\nf 13283 13291 13288\nf 13289 16247 16248\nf 13295 13302 16249\nf 13301 13308 16250\nf 13307 13314 16251\nf 13313 16252 16253\nf 13321 16252 7978\nf 16254 13326 16255\nf 16256 13218 16257\nf 16256 13329 16258\nf 16257 13334 16259\nf 13346 13340 16260\nf 16261 16262 13351\nf 13352 13356 16263\nf 13355 13359 16264\nf 13358 13362 16265\nf 13361 13368 16266\nf 13367 13374 16267\nf 13373 13380 16268\nf 13379 13386 16269\nf 13385 13392 16270\nf 13391 13398 16271\nf 13397 13404 16272\nf 13403 13410 16273\nf 12613 13425 7996\nf 13423 16274 8000\nf 13427 16275 13433\nf 16276 13434 16277\nf 16278 16279 8002\nf 13446 16280 13451\nf 13494 13492 16281\nf 13465 13501 16282\nf 8085 8507 8075\nf 16283 13671 16284\nf 13678 13675 8206\nf 13687 8153 16285\nf 8223 13708 16286\nf 8226 13718 13716\nf 13719 16287 13721\nf 13469 8263 13762\nf 8265 8266 16288\nf 8268 8269 13769\nf 8271 13776 16289\nf 16290 13782 13780\nf 16291 13775 16292\nf 16293 13787 16294\nf 16293 13781 16295\nf 13786 13793 16296\nf 13792 13799 16297\nf 13798 13805 16298\nf 13804 13811 16299\nf 13810 13820 16300\nf 16301 16302 8279\nf 16301 13816 13818\nf 13819 16303 8285\nf 8291 13693 8293\nf 16304 16305 16306\nf 16307 13869 16308\nf 16309 13857 16310\nf 13868 13875 16311\nf 13874 13881 16312\nf 13880 13887 16313\nf 13886 16314 16315\nf 13892 16316 16317\nf 16318 13899 16319\nf 13903 16320 16321\nf 16322 16323 16324\nf 16322 13908 16325\nf 16326 16327 16328\nf 16326 16323 8311\nf 16329 13923 16330\nf 16329 16327 8314\nf 13922 16331 16332\nf 13931 16331 8317\nf 13930 13941 16333\nf 13936 13940 8318\nf 16334 16335 16336\nf 13957 13974 16337\nf 13518 8060 8327\nf 13964 16338 8332\nf 14491 16338 13967\nf 16339 16340 13972\nf 16340 16341 16342\nf 13979 16341 8337\nf 13978 16343 16344\nf 16343 16345 13983\nf 13985 16345 8340\nf 16346 13984 16347\nf 13990 14000 16348\nf 13997 8040 8344\nf 16349 8343 14002\nf 14009 14004 16350\nf 14015 14010 16351\nf 14021 14016 16352\nf 16353 14027 16354\nf 16353 14022 16355\nf 14033 14028 16356\nf 16357 16358 8347\nf 16357 14034 16359\nf 16360 16361 16362\nf 14066 14061 16363\nf 16364 14067 16365\nf 13483 14086 14084\nf 16366 14094 16367\nf 14093 14100 16368\nf 14099 14106 16369\nf 14105 14112 16370\nf 14111 14118 16371\nf 14117 14124 16372\nf 14123 14130 16373\nf 14129 14136 16374\nf 14135 14142 16375\nf 14146 14151 8362\nf 14157 16376 16377\nf 14154 16378 8365\nf 16379 16378 8581\nf 14160 16380 14156\nf 16381 14163 16382\nf 16381 16379 8587\nf 8368 16383 14159\nf 16384 14165 8593\nf 14167 16385 16386\nf 14169 8596 8601\nf 16387 16388 16389\nf 16390 14923 14920\nf 16391 16392 14175\nf 14172 8605 16393\nf 14177 8380 16393\nf 16394 16395 14179\nf 8383 8134 8131\nf 16394 13553 16396\nf 14178 8389 8386\nf 8392 14184 16397\nf 14183 14190 16398\nf 14189 14196 16399\nf 14195 14202 16400\nf 14201 14208 16401\nf 14207 14214 16402\nf 14213 16403 16404\nf 16405 14222 16406\nf 16407 14228 16408\nf 16409 14226 14231\nf 14235 14227 16410\nf 14238 14233 16411\nf 14244 14236 16412\nf 14246 16413 14239\nf 14250 14242 16414\nf 14252 16415 14245\nf 14256 14248 16416\nf 14258 16417 14251\nf 14262 14254 16418\nf 14264 16419 14257\nf 14268 14260 8442\nf 8397 16420 16421\nf 14270 14266 8448\nf 16422 16423 14272\nf 14269 8454 14274\nf 16424 14271 14276\nf 16425 8460 16426\nf 16427 14275 14280\nf 14278 16428 14282\nf 16429 14279 14284\nf 16430 14283 14287\nf 14289 14286 14291\nf 16431 14302 16432\nf 14304 14310 16433\nf 14309 14316 16434\nf 14315 14322 16435\nf 14321 14328 16436\nf 14327 14334 16437\nf 14333 14340 16438\nf 14339 14345 16439\nf 14349 16440 16441\nf 16410 16442 14356\nf 14360 14352 16376\nf 14362 16411 14355\nf 14366 14358 16380\nf 14368 16412 14361\nf 16443 14364 16383\nf 14374 16414 14367\nf 16385 14370 16443\nf 14378 16416 14373\nf 16387 14382 8373\nf 14383 16418 14377\nf 16391 16444 14380\nf 14389 8447 16445\nf 16446 14386 14391\nf 14388 16396 14395\nf 16447 14390 14397\nf 14393 8119 8458\nf 16448 14396 14398\nf 8466 16428 16449\nf 8465 14402 8469\nf 14431 14426 14430\nf 8496 8505 14440\nf 13952 16450 8501\nf 16451 14458 14438\nf 16452 16453 8504\nf 14463 14466 14467\nf 14471 16454 14473\nf 16455 16456 14453\nf 16455 16451 14480\nf 14003 16456 16457\nf 14505 16458 16459\nf 16459 14512 16460\nf 14511 14517 16461\nf 14516 14523 16462\nf 14522 14526 16463\nf 14525 14532 16464\nf 14531 16465 16466\nf 14537 14540 16467\nf 8515 16468 16469\nf 14543 14539 16409\nf 14545 13971 8516\nf 14549 14541 16470\nf 16471 16472 14544\nf 14552 14547 14240\nf 14558 14550 16413\nf 14560 13949 14553\nf 14564 14556 16415\nf 14566 16473 14559\nf 14570 14562 16417\nf 14452 14565 14572\nf 16474 14568 16419\nf 16420 14574 16474\nf 16475 14577 14583\nf 14585 14579 8396\nf 16476 14586 14581\nf 14584 8402 14590\nf 14588 8408 14592\nf 16477 16478 14594\nf 14591 8414 14597\nf 16479 16480 16481\nf 14596 8420 14599\nf 16482 16483 14601\nf 14598 8425 14604\nf 8530 16484 16482\nf 14603 8431 16485\nf 14607 14417 14605\nf 16485 8105 8536\nf 14611 16486 14612\nf 16487 14619 14617\nf 16488 14625 16489\nf 14624 14631 16490\nf 14630 14637 16491\nf 14636 14643 16492\nf 14642 14649 16493\nf 14648 14655 16494\nf 14654 14661 16495\nf 14660 14667 16496\nf 14666 14673 16497\nf 14672 14679 16498\nf 14678 14685 16499\nf 14684 8555 16500\nf 16501 14701 16502\nf 14711 16503 14708\nf 16504 8565 16505\nf 16504 16506 16507\nf 8564 14713 8568\nf 14720 14724 16508\nf 16509 14730 16510\nf 16509 14723 8572\nf 14729 14736 16511\nf 14735 14742 16512\nf 14741 14748 16513\nf 14747 14754 16514\nf 14753 14760 16515\nf 14759 14766 16516\nf 14765 14772 16517\nf 14771 14778 16518\nf 14777 16519 16520\nf 16521 14784 16522\nf 16523 14789 16524\nf 14796 8573 16525\nf 8575 14812 16526\nf 14811 14818 16527\nf 16528 16529 16530\nf 13480 16531 16532\nf 14828 16531 8580\nf 14827 14834 16533\nf 14833 14840 16534\nf 14839 14846 16535\nf 14845 14852 16536\nf 14851 14858 16537\nf 14857 14864 16538\nf 14863 14870 16539\nf 14869 14876 16540\nf 14875 14882 16541\nf 14881 14888 16542\nf 14887 14894 16543\nf 14893 16544 16545\nf 16546 14688 14901\nf 14904 14907 16547\nf 14906 14698 16548\nf 14912 8591 16548\nf 16549 14908 14914\nf 14910 16506 14917\nf 16550 14913 16551\nf 14915 16505 13570\nf 14919 14922 13563\n\nusemtl material_0\nf 16552 9059 9680\nf 16552 9077 14956\nf 16553 16554 16555\nf 16553 8612 16556\nf 9061 16557 16558\nf 16559 16560 16561\nf 16562 16563 16564\nf 16565 16566 16567\nf 9030 16568 16569\nf 16570 16571 6392\nf 8664 11054 16572\nf 16573 15307 16574\nf 15029 10115 8677\nf 14928 8702 8699\nf 8712 16575 16576\nf 16575 8718 15855\nf 8717 8710 14927\nf 6257 6261 8824\nf 8843 6274 8715\nf 6275 8849 16577\nf 8853 8846 16577\nf 8855 8859 8851\nf 16578 16579 8860\nf 16580 8864 6284\nf 16580 16579 8862\nf 16581 8866 8865\nf 8868 8872 6290\nf 8869 16582 8875\nf 8874 8879 6105\nf 6293 8884 6295\nf 16583 16584 8919\nf 8915 8703 16584\nf 16585 16586 8708\nf 8927 16586 8918\nf 16585 8913 16583\nf 16587 16588 16589\nf 6069 16588 8923\nf 6087 16590 16591\nf 16592 16590 8926\nf 16593 8925 16594\nf 8917 14929 16594\nf 16595 16596 16597\nf 16587 16596 8930\nf 16591 16598 6277\nf 8940 16598 8933\nf 8931 16592 16599\nf 16593 14930 16599\nf 16600 16601 16602\nf 16595 16601 8936\nf 8932 14931 8938\nf 16603 16604 16605\nf 16600 16604 8943\nf 8856 16606 16578\nf 8951 16606 8946\nf 8944 8947 16607\nf 8939 14933 16607\nf 16608 16609 16610\nf 16603 16611 16612\nf 8959 16581 8861\nf 16613 8952 8954\nf 16614 16615 16616\nf 16608 16615 16617\nf 8958 8957 8870\nf 8955 16618 14936\nf 16613 16618 8960\nf 8961 16619 14939\nf 16620 16621 16622\nf 16614 16621 8963\nf 16620 8969 16623\nf 16624 8972 16625\nf 16624 16626 8967\nf 16626 16619 16623\nf 8966 8980 16627\nf 16628 16629 8978\nf 16629 8973 16627\nf 16630 6334 16628\nf 16631 8982 16632\nf 8984 8981 16630\nf 16631 16633 6341\nf 8988 16633 16634\nf 8987 8992 6347\nf 16635 8986 16636\nf 8998 8999 8996\nf 8993 9001 9000\nf 9003 9006 9004\nf 16637 16638 16639\nf 16640 16641 9124\nf 6365 16641 15064\nf 16642 16643 16644\nf 16645 16646 16647\nf 16645 16637 16648\nf 16649 14943 9012\nf 9014 16647 9021\nf 14942 14944 6369\nf 9634 9017 16648\nf 16642 16568 9018\nf 16565 16646 14949\nf 16650 9034 14948\nf 9023 14945 16649\nf 9024 9040 14947\nf 9022 16567 9038\nf 6370 16651 16652\nf 16653 16651 9027\nf 9029 9031 16650\nf 16654 16563 9032\nf 16654 9028 16655\nf 16559 16566 9036\nf 9041 9054 14950\nf 9039 16561 9052\nf 16653 16656 16657\nf 16658 16656 9044\nf 9033 9045 14951\nf 16562 16557 9046\nf 16555 16560 9050\nf 8613 9049 14953\nf 9055 9067 14954\nf 9066 9053 16554\nf 16658 16659 16660\nf 16661 16659 9058\nf 14955 14952 9060\nf 16556 16662 16663\nf 8609 16662 9063\nf 14962 9062 14957\nf 9064 16663 9080\nf 9068 16664 14958\nf 16661 16665 16666\nf 16667 16665 9071\nf 16668 9088 9087\nf 16669 16670 16671\nf 14968 16672 16670\nf 16668 16673 14959\nf 16671 14966 6373\nf 14965 16672 9073\nf 9075 9670 6371\nf 14960 8610 14961\nf 16674 16664 9079\nf 9078 8608 16675\nf 16674 16676 14967\nf 16677 16675 16673\nf 16677 9084 16676\nf 16678 16667 16679\nf 16679 9083 8668\nf 9086 16680 9082\nf 16680 16572 6061\nf 16681 9089 9074\nf 16681 14969 14970\nf 9090 16574 14971\nf 10131 16573 8670\nf 16669 16682 16683\nf 9109 16684 9112\nf 16570 16684 6005\nf 6384 9117 9576\nf 14973 9123 9120\nf 9122 9130 16685\nf 16686 9128 16685\nf 16687 16688 14975\nf 16687 16686 9133\nf 9134 9132 16652\nf 16688 9136 16689\nf 16690 6398 16689\nf 9137 9135 16657\nf 16690 16691 14976\nf 16692 16691 9139\nf 16693 9138 16660\nf 6402 6403 9107\nf 16692 9141 14980\nf 9143 16694 16666\nf 16693 16694 9142\nf 16695 16696 6410\nf 9140 16697 16696\nf 9147 16697 9145\nf 16698 9144 16678\nf 16698 16699 9148\nf 9146 16700 6411\nf 6406 16701 9102\nf 16699 8669 16702\nf 8682 6413 16703\nf 9149 16704 9152\nf 16705 16703 14982\nf 16706 6064 16707\nf 9150 9157 16708\nf 16709 16710 14983\nf 16705 16710 16704\nf 16711 16712 16713\nf 16706 16712 9155\nf 9156 9163 16714\nf 16715 16716 14984\nf 16709 16716 9158\nf 16717 16718 16719\nf 16711 16718 9161\nf 9162 9169 16720\nf 16721 16722 14985\nf 16715 16722 9164\nf 16723 16724 16725\nf 16717 16724 9167\nf 9168 9175 16726\nf 16727 16728 14986\nf 16721 16728 9170\nf 16729 16730 16731\nf 16723 16730 9173\nf 16732 9183 16733\nf 16732 9174 14989\nf 16727 14987 9176\nf 9180 14991 14990\nf 9177 14993 16734\nf 16729 16734 9182\nf 16735 9187 16736\nf 16737 16738 16736\nf 16739 9179 16740\nf 16741 16742 10014\nf 16741 16737 14994\nf 16743 9186 9193\nf 16743 16744 14995\nf 9197 9192 16745\nf 16746 9196 16747\nf 16746 16748 16742\nf 16749 16750 14996\nf 16749 16744 9199\nf 9203 9198 16751\nf 16752 16753 16754\nf 16752 16747 9202\nf 16755 16756 14997\nf 16755 16750 9205\nf 9209 9204 16757\nf 16758 16759 16760\nf 16758 16753 9208\nf 16761 16762 14998\nf 16761 16756 9211\nf 9215 9210 16763\nf 16764 16765 16766\nf 16764 16759 9214\nf 16767 16768 14999\nf 16767 16762 9217\nf 9221 9216 16769\nf 16770 16771 16772\nf 16770 16765 9220\nf 16773 16774 15000\nf 16773 16768 9223\nf 9227 9222 16775\nf 16776 16777 16778\nf 16776 16771 9226\nf 16779 16780 15001\nf 16779 16774 9229\nf 9233 9228 16781\nf 10048 16777 9232\nf 16782 16783 15002\nf 16782 16780 9235\nf 9239 9234 16784\nf 16785 16786 15004\nf 16785 16783 9241\nf 9242 9240 16787\nf 15003 9245 16788\nf 6417 16786 9244\nf 16789 9243 16790\nf 9246 9250 10065\nf 16789 9252 15005\nf 9253 9259 6422\nf 9256 9247 16791\nf 9260 16792 6425\nf 6426 9265 16792\nf 15006 6429 9270\nf 9274 16793 10112\nf 9273 9280 16794\nf 16795 9275 7040\nf 16795 15007 16796\nf 16797 16798 16799\nf 10120 16798 9278\nf 9279 9286 16800\nf 16801 16802 15008\nf 16796 16802 9281\nf 16803 16804 16805\nf 16797 16804 9284\nf 9285 9292 16806\nf 16807 16808 15009\nf 16801 16808 9287\nf 16809 16810 16811\nf 16803 16810 9290\nf 9291 9298 16812\nf 16813 16814 15010\nf 16807 16814 9293\nf 16809 16815 9296\nf 9297 9303 16816\nf 16817 16818 15011\nf 16813 16818 9299\nf 16819 16820 9302\nf 16819 16815 9662\nf 16821 9307 9312\nf 16821 9304 16817\nf 9311 16820 9673\nf 9306 16822 15012\nf 16823 16822 16824\nf 9314 16824 9309\nf 6434 16825 16826\nf 16823 9318 15014\nf 16827 9316 16828\nf 16827 16829 9319\nf 16830 16831 16832\nf 16830 16825 9322\nf 9317 16833 15015\nf 9326 16829 16834\nf 16835 16836 16837\nf 16835 16831 9325\nf 16838 16839 15016\nf 16838 16833 9328\nf 9332 9327 16840\nf 16841 16842 16843\nf 16841 16836 9331\nf 16844 16845 15017\nf 16844 16839 9334\nf 16846 9333 16847\nf 16848 16849 16850\nf 16848 16842 9337\nf 16851 16852 15018\nf 16851 16845 16846\nf 16853 16854 16855\nf 16853 16849 9340\nf 16856 16857 15019\nf 16856 16852 9343\nf 9347 9342 16858\nf 16859 16860 16861\nf 16859 16854 9346\nf 16862 16863 15020\nf 16862 16857 9349\nf 9353 9348 16864\nf 16865 16866 16867\nf 16865 16860 9352\nf 16868 16869 15021\nf 16868 16863 9355\nf 9359 9354 16870\nf 16871 16872 16873\nf 16871 16866 9358\nf 16874 16875 15022\nf 16874 16869 9361\nf 9365 9360 16876\nf 16877 16878 9522\nf 16877 16872 9364\nf 16879 16880 15023\nf 16879 16875 9367\nf 16881 9366 16882\nf 16883 16878 9370\nf 16884 16885 15024\nf 16884 16880 16881\nf 16886 16887 15026\nf 16886 16885 9376\nf 9377 9375 9729\nf 6436 16888 15025\nf 16887 9379 16889\nf 9382 9378 16890\nf 9397 6441 9553\nf 15028 16891 6445\nf 9420 6454 9753\nf 16892 6629 9422\nf 16892 16893 8680\nf 16893 9428 16707\nf 16894 9421 15030\nf 16895 16896 16794\nf 16793 16896 9426\nf 9427 9434 16713\nf 16897 16898 15031\nf 16894 16898 9429\nf 16899 16900 16800\nf 16895 16900 9432\nf 9433 9440 16719\nf 16901 16902 15032\nf 16897 16902 9435\nf 16903 16904 16806\nf 16899 16904 9438\nf 9439 9446 16725\nf 16905 16906 15033\nf 16901 16906 9441\nf 16907 16908 16812\nf 16903 16908 9444\nf 9445 9451 16731\nf 15035 16909 15034\nf 16905 16909 9447\nf 9448 9455 15036\nf 16910 16907 16816\nf 16910 9456 9450\nf 9458 16911 9453\nf 16739 6459 9191\nf 15037 16740 9454\nf 16911 9461 15039\nf 16912 9459 9313\nf 16912 16913 9462\nf 6461 16914 16745\nf 16915 16914 9465\nf 9460 9467 15040\nf 16916 16913 16826\nf 16916 16917 9468\nf 16918 16919 16751\nf 16918 16915 9471\nf 9466 9473 15041\nf 16920 16917 16832\nf 16920 16921 9474\nf 16922 16923 16757\nf 16922 16919 9477\nf 9472 9479 15042\nf 16924 16921 16837\nf 16924 16925 9480\nf 16926 16927 16763\nf 16926 16923 9483\nf 9478 9485 15043\nf 16928 16925 16843\nf 16928 16929 9486\nf 16930 16931 16769\nf 16930 16927 9489\nf 9484 9491 15044\nf 16932 16929 16850\nf 16932 16933 9492\nf 16934 16935 16775\nf 16934 16931 9495\nf 9490 9497 15045\nf 16936 16933 16855\nf 16936 16937 9498\nf 16938 16939 16781\nf 16938 16935 9501\nf 9496 9503 15046\nf 16940 16937 16861\nf 16940 16941 9504\nf 16942 16943 16784\nf 16942 16939 9507\nf 9502 9509 15047\nf 16944 16941 16867\nf 16944 16945 9510\nf 16946 16947 16787\nf 16946 16943 9513\nf 9508 9515 15048\nf 9516 16945 16873\nf 16948 16949 16790\nf 16948 16947 9519\nf 9514 9521 15049\nf 9249 16949 9525\nf 9520 9527 15050\nf 16883 16950 9528\nf 9531 16951 16791\nf 9526 9538 15051\nf 9534 16950 9373\nf 16951 16952 9261\nf 9543 16952 9537\nf 9539 9544 15052\nf 9542 9532 16888\nf 9545 9546 6465\nf 9547 9540 9383\nf 16953 16954 16955\nf 9570 16956 9569\nf 9586 16957 15054\nf 15053 16958 6480\nf 16959 16960 16958\nf 16961 16957 9574\nf 16962 16963 16964\nf 6496 6027 9579\nf 9631 16965 16966\nf 16967 9581 15057\nf 16968 9582 16969\nf 16970 9627 16969\nf 16965 16971 16972\nf 9583 16971 15055\nf 9580 16973 9584\nf 9609 16968 16974\nf 9585 16975 9725\nf 16976 16975 15060\nf 9572 16977 16978\nf 16979 16977 9588\nf 9589 16978 9614\nf 6488 9597 6491\nf 16960 9600 6494\nf 16980 16981 9601\nf 9598 16962 9596\nf 9567 9606 15059\nf 16982 9607 16983\nf 16979 9610 9612\nf 16973 16984 15061\nf 15058 16984 9611\nf 9617 15063 9590\nf 16985 9616 16974\nf 9118 9621 16640\nf 16985 9626 9623\nf 9013 16986 16987\nf 9625 16986 9630\nf 16638 16988 16967\nf 16970 16988 16987\nf 16989 9635 16639\nf 16989 15056 9633\nf 16990 9632 16991\nf 16990 16643 9636\nf 9637 9644 16799\nf 10127 16992 9639\nf 16993 16994 16682\nf 16995 16996 9642\nf 9643 9650 16805\nf 16997 16998 15065\nf 16992 16998 9645\nf 16999 16994 9648\nf 9649 17000 16811\nf 9655 17001 15066\nf 16997 17001 9651\nf 16993 17002 9654\nf 9660 17000 9657\nf 9665 9656 9658\nf 17003 17002 6372\nf 17003 9666 9659\nf 9671 9661 9664\nf 9668 9676 9663\nf 9681 9315 9672\nf 9678 17004 9674\nf 17004 9683 15067\nf 9679 17005 9684\nf 6500 17006 16828\nf 9682 17007 9686\nf 9688 17005 16558\nf 17008 17009 16834\nf 17008 17006 15069\nf 17010 17011 9692\nf 17011 17007 9690\nf 17012 17013 16840\nf 17012 17009 15070\nf 9694 15071 17010\nf 17014 9689 16564\nf 17014 17015 9693\nf 17016 17017 16847\nf 17016 17013 9696\nf 9691 17018 15072\nf 9700 17015 16655\nf 9341 17017 9699\nf 17019 17020 15074\nf 17019 17018 9702\nf 17021 9701 16569\nf 15073 17022 16858\nf 17020 9704 9706\nf 17021 17023 9705\nf 17024 17025 16864\nf 17024 17022 9708\nf 9703 17026 15075\nf 9712 17023 16644\nf 16870 17025 9711\nf 17027 17028 15077\nf 17027 17026 9714\nf 17029 9713 16991\nf 15076 17030 16876\nf 17028 9716 9718\nf 9717 17029 16966\nf 9715 17031 17032\nf 17033 17034 16882\nf 17033 17030 9720\nf 17032 17035 15078\nf 9724 17031 16972\nf 9374 17034 9723\nf 17035 17036 15079\nf 17037 17036 9726\nf 17037 9731 15080\nf 16976 16982 9732\nf 9739 16890 9735\nf 9730 9737 15081\nf 9738 16983 16956\nf 9758 8693 17038\nf 9759 9765 17039\nf 17040 17038 15082\nf 17041 6529 17042\nf 17041 17043 9763\nf 9764 17044 17045\nf 17046 17047 15083\nf 17040 17047 9766\nf 17048 17049 17050\nf 17043 17049 9769\nf 9770 9777 17051\nf 17052 17053 15084\nf 17046 17053 9772\nf 17054 17055 17056\nf 17048 17055 9775\nf 9776 9783 17057\nf 17058 17059 15085\nf 17052 17059 9778\nf 17060 17061 17062\nf 17054 17061 9781\nf 9782 9789 17063\nf 17064 17065 15086\nf 17058 17065 9784\nf 17066 17067 17068\nf 17060 17067 9787\nf 9788 9798 17069\nf 17070 17071 15087\nf 17064 17071 9790\nf 17072 17073 17074\nf 17066 17073 9793\nf 9797 17075 17076\nf 9803 17075 9796\nf 9794 17077 15088\nf 17070 17077 9799\nf 9800 6530 9795\nf 15089 17078 17079\nf 17072 17080 17081\nf 17082 9804 9807\nf 9810 17083 15091\nf 17082 6533 9929\nf 17084 17085 15094\nf 17084 17083 9814\nf 9818 9813 10017\nf 6535 9817 17086\nf 15093 15095 9815\nf 9816 17087 17088\nf 17089 17090 15096\nf 17089 17085 17091\nf 9824 17092 10020\nf 17093 17094 17095\nf 17093 17087 9823\nf 17096 17097 15097\nf 17096 17090 9826\nf 9830 9825 17098\nf 17099 17100 17101\nf 17099 17094 9829\nf 17102 17103 15098\nf 17102 17097 9832\nf 9836 9831 17104\nf 17105 17106 17107\nf 17108 17109 15101\nf 17108 17103 9838\nf 9842 9837 17110\nf 15099 9839 17111\nf 9845 15102 17112\nf 17113 9848 17112\nf 17114 15106 9955\nf 17114 17115 9847\nf 9850 6536 15107\nf 17116 9849 17117\nf 15105 9856 9854\nf 9859 6540 9858\nf 9864 9860 17118\nf 17119 8697 14926\nf 9872 6071 9870\nf 9871 9881 16589\nf 17119 17120 9873\nf 17121 8695 17039\nf 17121 17122 9876\nf 9880 9879 17123\nf 9887 16597 17123\nf 15108 17124 9874\nf 17120 17124 9882\nf 17125 17126 17127\nf 17122 17045 17128\nf 9886 9893 16602\nf 17129 17130 15109\nf 9878 17130 9888\nf 17131 17132 17051\nf 17125 17132 9891\nf 9892 9899 16605\nf 17133 17134 15110\nf 17129 17134 9894\nf 17135 17136 17057\nf 17131 17136 9897\nf 9898 9905 16610\nf 17137 17138 15111\nf 17133 17138 9900\nf 17139 17140 17063\nf 17135 17140 9903\nf 9904 9914 16616\nf 17141 17142 15112\nf 17137 17142 9906\nf 17143 17144 17069\nf 17139 17144 9909\nf 9913 17145 16622\nf 9919 17145 9912\nf 9910 17146 15113\nf 17141 17146 9915\nf 17147 17148 17076\nf 17143 17148 9918\nf 8968 6555 8965\nf 15117 9920 17149\nf 9911 15114 17149\nf 9921 6558 15118\nf 15119 17150 9805\nf 17147 17150 9923\nf 15116 9926 17151\nf 17152 9924 17151\nf 9925 17153 17154\nf 17152 17155 9930\nf 17154 15121 17155\nf 9931 9939 16632\nf 17156 17157 15122\nf 17156 17153 9933\nf 17158 9936 17088\nf 17159 17157 9934\nf 9935 9932 17086\nf 15120 15123 9937\nf 9938 17160 16634\nf 17161 17162 17163\nf 17158 17095 17162\nf 16635 17164 8990\nf 16636 17160 9942\nf 17165 17163 17101\nf 9943 17164 15125\nf 15129 17166 15127\nf 17167 17168 17169\nf 17106 17170 17167\nf 9950 6561 15133\nf 9952 9947 17171\nf 15132 9953 9007\nf 15134 6565 9957\nf 9965 9971 17042\nf 17172 17173 15136\nf 17174 6574 9151\nf 17174 17175 9969\nf 9970 9977 17050\nf 17176 17177 15137\nf 17172 17177 9972\nf 17178 17179 16708\nf 17175 17179 9975\nf 9976 9983 17056\nf 17180 17181 15138\nf 17176 17181 9978\nf 17182 17183 16714\nf 17178 17183 9981\nf 9982 9989 17062\nf 17184 17185 15139\nf 17180 17185 9984\nf 17186 17187 16720\nf 17182 17187 9987\nf 9988 9998 17068\nf 17188 17189 15140\nf 17184 17189 9990\nf 17190 17191 16726\nf 17186 17191 9993\nf 9997 9996 17074\nf 9994 17192 15141\nf 17188 17192 9999\nf 10000 10005 15142\nf 17193 17190 16733\nf 17193 10006 10002\nf 10009 17079 6576\nf 10004 6579 6578\nf 10016 10010 10012\nf 10015 17194 15145\nf 17195 17196 15146\nf 17195 17194 17197\nf 10021 17197 16748\nf 15147 10018 9819\nf 17198 10023 17199\nf 17198 15148 17196\nf 10027 10022 16754\nf 10026 17200 17098\nf 17201 17202 10025\nf 17201 17199 10029\nf 10030 10028 16760\nf 17203 17204 17104\nf 17203 17200 15149\nf 15150 17202 10032\nf 10036 10031 16766\nf 17205 17206 17110\nf 17205 17204 10035\nf 17207 10037 16772\nf 17208 17209 17210\nf 17208 17206 17211\nf 17212 17213 17214\nf 17215 17214 17216\nf 17116 17217 9852\nf 17218 17219 17212\nf 17220 17221 9857\nf 17220 17222 10047\nf 17223 17224 15153\nf 17223 10044 10050\nf 10054 10049 9238\nf 17221 10053 17118\nf 15152 15154 10051\nf 10052 17225 9863\nf 17226 10060 15155\nf 17226 17224 10056\nf 10061 10055 16788\nf 17227 10066 9867\nf 17227 17225 10059\nf 10062 10064 15156\nf 17228 10071 6593\nf 17229 17230 17231\nf 17232 10138 10072\nf 17233 17234 17235\nf 17236 10074 17237\nf 17236 17238 17239\nf 17240 10108 10092\nf 6625 8696 10099\nf 6632 17241 17242\nf 8684 17241 8681\nf 17243 17244 10125\nf 16995 17244 10132\nf 10988 8675 10126\nf 17245 8667 6639\nf 10144 11246 6659\nf 10165 10167 10170\nf 10224 10245 17246\nf 7286 10227 7384\nf 15282 10232 17247\nf 6928 17248 10529\nf 17249 10254 6806\nf 17249 6933 10236\nf 15163 10243 10240\nf 10246 10220 10247\nf 10260 15167 10258\nf 17248 6832 15168\nf 10261 15169 10273\nf 17250 10267 10283\nf 17251 10269 17252\nf 17251 10285 10268\nf 10270 15171 15174\nf 17253 15170 17254\nf 10293 17253 10275\nf 17255 17256 15175\nf 17257 17256 17258\nf 17259 10281 10307\nf 17259 6856 17260\nf 17250 17260 10265\nf 10287 17252 6862\nf 10292 17261 6876\nf 10295 17261 10277\nf 17262 17263 17264\nf 17262 10313 15176\nf 17265 10298 17266\nf 17267 17268 17269\nf 10353 10304 17270\nf 17271 10280 15181\nf 10308 10302 10279\nf 10306 17271 10351\nf 10309 6858 17272\nf 10311 17273 10289\nf 17272 6875 10345\nf 10316 17264 10320\nf 10315 17274 10314\nf 10312 10341 15183\nf 17275 17276 10339\nf 17277 17276 17278\nf 10319 17279 17278\nf 17280 17269 10322\nf 17265 17267 17279\nf 17281 10325 17282\nf 17281 17283 17284\nf 17285 17286 17283\nf 17287 17286 10329\nf 10332 11432 15185\nf 10331 17284 17288\nf 17280 17289 17277\nf 15188 17289 10335\nf 17290 17291 17292\nf 17290 17293 10338\nf 17293 10317 17275\nf 17292 17294 17274\nf 10342 17294 17295\nf 10344 17296 10310\nf 17297 15184 15189\nf 17297 17298 10346\nf 17299 10349 17300\nf 17299 17270 10350\nf 10347 17301 15191\nf 15178 17301 10352\nf 15248 17302 15158\nf 17303 10359 17304\nf 17305 17306 10362\nf 17307 10365 17308\nf 17307 17309 17310\nf 17311 17312 10368\nf 17313 17312 17309\nf 17314 10371 17315\nf 17314 17316 17317\nf 17318 17319 17316\nf 17318 17320 15244\nf 17321 10374 17322\nf 17321 17323 17324\nf 17325 17326 10377\nf 17327 17326 17323\nf 17328 10380 17329\nf 17328 17330 17331\nf 17332 17333 10383\nf 17334 17333 17330\nf 17335 10386 17336\nf 17335 17337 17338\nf 10680 17339 10389\nf 17340 17339 17337\nf 17341 17342 6940\nf 15200 6941 17343\nf 17344 17345 17346\nf 17347 17346 17342\nf 10412 10586 10410\nf 10418 10409 6887\nf 17348 17349 17350\nf 17351 17349 10435\nf 17352 10437 17353\nf 17352 17354 17355\nf 17356 17357 10440\nf 17358 17357 17354\nf 17359 10443 17360\nf 17359 17361 17362\nf 17363 17364 10446\nf 17365 17364 17361\nf 17366 10449 17367\nf 17366 17368 17369\nf 17370 17371 10452\nf 17372 17371 17368\nf 17373 10455 17374\nf 17373 17375 17376\nf 17377 17378 10458\nf 17379 17378 17375\nf 17380 10461 17381\nf 17380 17382 17383\nf 10465 17382 10516\nf 10463 15208 15228\nf 17384 10466 10470\nf 15210 17384 17385\nf 17386 10524 10474\nf 6901 17386 10583\nf 10483 10476 10482\nf 6954 10479 10596\nf 17387 17388 17389\nf 17358 17388 10493\nf 17390 10495 17391\nf 17390 17392 17360\nf 17365 17393 10498\nf 17237 17393 17392\nf 17394 10501 17285\nf 17394 17395 17367\nf 17372 17396 10504\nf 17282 17396 17395\nf 17397 10507 17268\nf 17397 17398 17374\nf 17379 17399 10510\nf 17266 17399 17398\nf 15222 10514 17400\nf 15209 10515 15219\nf 17258 15221 10513\nf 10518 10468 10522\nf 15218 10520 10467\nf 10523 6922 6924\nf 10537 10528 10534\nf 6911 10531 10484\nf 17401 11406 15195\nf 15202 17402 17308\nf 17313 17403 10543\nf 17351 17403 17402\nf 17404 10546 17355\nf 17404 17405 17315\nf 17320 17406 10549\nf 17356 17406 17405\nf 17407 10552 17362\nf 17407 17408 17322\nf 17327 17409 10555\nf 17363 17409 17408\nf 17410 10558 17369\nf 17410 17411 17329\nf 17334 17412 10561\nf 17370 17412 17411\nf 17413 10564 17376\nf 17413 17414 17336\nf 17340 17415 10567\nf 17377 17415 17414\nf 17416 10570 17383\nf 17416 17417 17341\nf 17418 17417 10464\nf 17418 10577 17419\nf 10574 17385 10579\nf 17420 6943 10582\nf 10587 10406 17420\nf 10595 10585 10592\nf 6889 10589 10421\nf 17421 10608 15403\nf 17421 17422 17423\nf 15240 17422 15229\nf 17424 10612 17425\nf 17424 17426 17427\nf 6987 15230 17427\nf 11351 10614 17426\nf 17428 10617 17429\nf 17428 17430 17431\nf 17432 17433 10620\nf 17434 17433 17430\nf 17435 10623 17436\nf 17435 17437 17438\nf 17439 17440 10626\nf 17441 17440 17437\nf 17442 17443 15406\nf 17442 17444 17445\nf 17446 17447 10629\nf 17448 17447 17445\nf 17449 10632 17450\nf 17449 17451 17452\nf 17453 17454 10635\nf 17455 17454 17451\nf 17456 10638 17457\nf 17456 17458 17459\nf 17460 17461 10641\nf 17462 17461 17458\nf 17463 10644 17464\nf 17463 17465 17466\nf 10656 10210 10654\nf 17467 10652 10660\nf 15238 17468 10411\nf 10663 17468 17467\nf 6982 10662 10669\nf 17469 10674 17423\nf 17469 17470 17471\nf 10677 17470 15239\nf 10681 6984 15231\nf 17338 17472 10683\nf 6989 17472 10679\nf 17473 10686 17431\nf 17473 17474 17332\nf 17331 17475 10689\nf 17432 17475 17474\nf 17476 10692 17438\nf 17476 17477 17325\nf 17324 17478 10695\nf 17439 17478 17477\nf 17479 17319 15233\nf 17479 17443 17480\nf 17317 17481 10698\nf 17446 17481 17480\nf 17482 10701 17452\nf 17482 17483 17311\nf 17310 17484 10704\nf 17453 17484 17483\nf 17485 10707 17459\nf 17485 17486 17305\nf 17460 10360 17486\nf 17487 10712 17466\nf 17487 17488 17489\nf 17490 17465 10647\nf 17490 17491 17488\nf 10718 6991 15250\nf 10720 10748 15249\nf 17492 17493 17494\nf 10725 17493 15414\nf 17495 10729 17496\nf 17495 17497 17498\nf 17499 10733 17497\nf 17500 17501 17502\nf 10746 17503 7008\nf 10744 10741 15270\nf 7012 7003 10754\nf 17504 10757 17505\nf 17506 10759 17507\nf 17506 17508 17509\nf 17510 17511 10762\nf 17512 17511 17508\nf 17513 10765 17514\nf 17513 17515 17516\nf 17517 17518 10768\nf 17519 17518 17515\nf 17520 17521 10771\nf 17522 10732 17521\nf 17523 10774 17524\nf 17523 17525 17526\nf 17527 17528 17525\nf 17529 17530 17531\nf 17529 17532 10778\nf 17531 7056 11113\nf 7059 17533 17534\nf 11101 17533 10781\nf 17534 7053 11119\nf 17535 7062 10785\nf 11095 10786 10784\nf 17536 17537 17538\nf 17536 10789 17539\nf 17540 17541 10791\nf 17540 15351 17537\nf 17542 17543 10797\nf 15329 17543 10794\nf 17544 15353 10796\nf 17545 17546 10801\nf 15263 7065 17547\nf 17548 10803 15265\nf 17549 17550 17551\nf 17552 17553 17550\nf 17554 17555 17556\nf 17499 17555 10807\nf 17557 10809 17558\nf 17557 17559 17502\nf 17560 17561 15253\nf 17233 17561 17559\nf 10815 10735 10724\nf 10816 15274 10814\nf 10818 7010 17562\nf 10820 15271 17562\nf 10819 10822 10845\nf 10824 10821 10827\nf 17563 17564 17565\nf 17512 17564 10831\nf 17566 10833 17567\nf 17566 17568 17514\nf 17519 17569 15257\nf 10727 17569 17568\nf 17570 10836 17498\nf 17522 17571 17570\nf 17501 10841 15268\nf 17500 17572 17524\nf 17527 17573 17574\nf 15275 17575 10736\nf 17576 10817 17577\nf 17576 17578 10844\nf 7018 17579 17577\nf 17580 10823 10847\nf 10850 15164 11454\nf 17581 17582 10890\nf 10853 17582 17583\nf 17584 17585 17586\nf 17584 17587 10857\nf 17586 7043 10899\nf 17588 17589 17590\nf 17588 17591 10860\nf 17590 17592 10905\nf 10862 17592 17593\nf 17594 17595 17596\nf 17594 17597 10866\nf 17596 17598 10911\nf 10868 17598 17599\nf 17600 17601 17602\nf 17600 17603 10872\nf 17602 17604 10917\nf 10874 17604 17605\nf 17606 17607 17608\nf 17606 17609 10878\nf 17608 17610 10923\nf 10880 17610 17611\nf 17612 17613 17614\nf 17612 17615 10884\nf 17614 17616 17617\nf 10886 17616 17618\nf 17619 11034 17620\nf 17620 17621 10932\nf 17622 11039 17623\nf 17623 17624 10938\nf 17625 17626 17627\nf 10948 10892 17628\nf 15276 17629 10852\nf 10891 17629 17630\nf 17631 17587 17632\nf 17631 17633 10895\nf 17632 10901 17634\nf 10897 17635 17634\nf 15277 17636 15312\nf 10900 17636 10898\nf 17637 17591 17638\nf 17637 17639 10904\nf 17638 10907 10958\nf 15278 17640 10861\nf 10906 17640 17641\nf 17642 17597 17643\nf 17642 17644 10910\nf 17643 10913 10964\nf 15279 17645 10867\nf 10912 17645 17646\nf 17647 17603 17648\nf 17647 17649 10916\nf 17648 10919 10970\nf 15280 17650 10873\nf 10918 17650 17651\nf 17652 17609 17653\nf 17652 17654 10922\nf 17653 10925 10976\nf 15281 17655 10879\nf 10924 17655 17656\nf 17657 17615 17658\nf 17657 17659 10928\nf 17658 17617 10982\nf 17660 17619 17661\nf 17660 17662 10931\nf 17661 10934 17663\nf 10933 15319 17664\nf 17622 17665 10937\nf 10939 15321 17666\nf 17625 17667 10943\nf 17668 15166 10944\nf 6820 17669 17670\nf 17668 10949 17669\nf 17671 10947 15283\nf 10893 17672 17630\nf 17673 17672 15284\nf 17674 17675 10097\nf 10098 10952 10100\nf 10902 15286 10896\nf 10955 10954 10101\nf 17676 17677 10960\nf 17639 17677 10957\nf 10953 17676 7030\nf 15287 17678 17641\nf 10959 17678 15289\nf 10961 10093 15290\nf 17679 17644 17680\nf 17679 17240 10963\nf 17680 10966 7032\nf 15291 17681 17646\nf 10965 17681 15293\nf 10967 6626 15294\nf 17682 17649 17683\nf 17682 10104 10969\nf 17683 10972 7035\nf 15295 17684 17651\nf 10971 17684 15297\nf 10973 17242 15298\nf 17685 17654 17686\nf 17685 10110 10975\nf 17686 10978 6634\nf 15299 17687 17656\nf 10977 17687 15300\nf 10979 10114 15301\nf 8678 10981 17688\nf 17659 17689 17688\nf 10121 17689 10984\nf 15302 17690 10885\nf 10983 17690 15303\nf 10985 10122 15304\nf 17691 17662 17692\nf 17691 10119 10987\nf 17692 17693 6638\nf 10989 17693 17663\nf 15305 10990 17664\nf 17243 17665 17694\nf 17695 10992 10130\nf 17695 17694 10940\nf 15306 10993 17666\nf 10994 10128 15308\nf 17696 17667 17697\nf 17696 17245 10996\nf 10997 10856 15310\nf 17698 17699 17700\nf 17698 17585 10999\nf 17700 17701 7041\nf 11001 17701 17702\nf 11003 10859 15313\nf 17703 17704 17705\nf 17703 17589 11005\nf 17705 17706 17593\nf 11007 17706 17707\nf 11009 10865 15314\nf 17708 17709 17710\nf 17708 17595 11011\nf 17710 17711 17599\nf 11013 17711 17712\nf 11015 10871 15315\nf 17713 17714 17715\nf 17713 17601 11017\nf 17715 17716 17605\nf 11019 17716 17717\nf 11021 10877 15316\nf 17718 17719 17720\nf 17718 17607 11023\nf 17720 17721 17611\nf 11025 17721 17722\nf 11027 10883 15317\nf 17723 17724 17725\nf 17723 17613 11029\nf 17725 17726 17618\nf 11031 17726 17727\nf 11035 10930 15318\nf 11033 17728 17729\nf 17729 17730 17731\nf 17731 17732 17621\nf 11037 17732 11134\nf 17733 10936 15320\nf 17733 17734 11040\nf 17735 11042 17624\nf 11044 10942 15322\nf 17736 17626 11046\nf 17736 11140 17737\nf 17738 17739 17627\nf 17738 17740 17741\nf 17740 17737 15362\nf 17742 17743 17741\nf 17742 17744 11050\nf 11051 17745 17746\nf 17743 17747 17748\nf 15323 17747 11049\nf 17749 11048 10139\nf 17739 11052 17697\nf 17748 11055 11053\nf 17580 11153 11063\nf 11148 11065 15324\nf 17750 17751 17752\nf 17750 17579 11066\nf 17752 17753 17578\nf 11068 17753 17754\nf 17755 15327 11070\nf 17528 11074 17552\nf 17526 17549 11077\nf 17548 17756 17520\nf 17571 17757 11080\nf 17545 17757 17756\nf 17758 11083 17544\nf 17758 17759 17517\nf 17516 17760 11086\nf 10798 17760 17759\nf 17761 11089 17541\nf 17761 17762 17510\nf 17509 17763 11092\nf 17539 17763 17762\nf 11096 17764 17765\nf 10783 15333 17764\nf 17766 17767 17765\nf 17766 17768 11099\nf 17768 15332 7052\nf 11100 11103 11426\nf 15335 15337 10780\nf 11102 15338 15417\nf 11104 11004 15340\nf 17769 17770 17771\nf 17769 17704 11106\nf 17771 17772 17707\nf 11108 17772 17773\nf 15341 11109 11438\nf 11110 11010 15342\nf 17774 17532 17775\nf 17774 17709 11112\nf 17775 11115 17712\nf 15344 17776 15336\nf 11114 17776 15345\nf 11116 11016 15346\nf 17777 7057 17778\nf 17777 17714 11118\nf 17778 11121 17717\nf 15348 17779 15334\nf 11120 17779 15349\nf 11122 11022 15350\nf 17780 7060 17781\nf 17780 17719 11124\nf 17781 17782 17722\nf 11126 17782 17783\nf 17538 17783 17535\nf 11128 11028 15352\nf 17724 17784 17785\nf 10790 17784 11130\nf 17786 17787 17727\nf 17786 17785 10795\nf 17542 11133 17787\nf 11132 17728 11032\nf 17788 15261 11135\nf 17788 17730 15354\nf 7068 17789 15355\nf 15264 17789 17546\nf 17734 15356 17790\nf 17790 15266 17547\nf 17735 7063 15267\nf 11139 17551 15358\nf 17791 11045 15359\nf 17791 17553 11141\nf 15357 17792 15363\nf 15360 17792 17755\nf 11143 17744 15361\nf 17793 17754 17794\nf 17793 17745 11145\nf 17795 17751 11147\nf 17795 17229 17794\nf 11059 11058 11151\nf 10141 11150 11152\nf 11167 17796 11164\nf 7092 17796 11163\nf 17797 17798 11196\nf 11190 17798 11195\nf 11198 17797 11199\nf 17799 17800 17801\nf 11208 15380 17802\nf 11235 17803 11210\nf 17804 17803 15381\nf 17805 7178 17806\nf 7209 17805 7175\nf 17807 11215 17808\nf 17807 17809 15370\nf 11216 17809 17810\nf 11220 7187 7236\nf 7188 10188 11227\nf 11205 17811 11231\nf 11234 15376 17802\nf 11237 11177 7201\nf 15371 7217 15369\nf 17812 15377 11241\nf 15372 17812 11239\nf 11247 10143 11248\nf 17813 11206 11251\nf 17813 15395 11207\nf 17814 11253 17815\nf 17816 17804 17814\nf 17817 17818 17819\nf 11256 17818 17806\nf 17820 7173 17817\nf 15398 17821 17808\nf 17810 17822 11258\nf 17823 17822 17821\nf 11261 17824 15386\nf 7231 17824 17825\nf 17826 17827 11267\nf 17826 15374 11264\nf 11276 15401 7241\nf 17828 17829 11278\nf 17830 17829 17799\nf 17831 11281 17832\nf 17831 17833 17834\nf 17835 17836 11284\nf 17837 17836 17833\nf 17838 11287 17839\nf 17838 11290 17840\nf 17841 11293 17842\nf 17843 17844 17845\nf 17846 7263 17844\nf 17847 11296 17848\nf 17847 17849 17850\nf 11299 17849 17851\nf 17852 17853 7276\nf 15390 17853 15393\nf 11341 17854 11300\nf 7245 17854 17852\nf 7281 17855 6992\nf 11249 17855 11310\nf 11311 17856 17857\nf 11313 11250 11309\nf 17858 17859 17800\nf 11317 17859 17815\nf 17860 17858 17828\nf 17860 15379 17816\nf 17861 17862 17834\nf 11319 17862 17819\nf 17820 17863 11321\nf 17835 17863 17861\nf 17864 11324 17840\nf 17823 17864 11327\nf 17843 17865 17841\nf 17866 17867 15400\nf 17866 11333 17850\nf 17827 17867 17868\nf 11298 11335 17868\nf 11338 7259 7248\nf 17869 11349 15394\nf 17869 17870 17425\nf 11352 17870 15404\nf 7278 17871 7243\nf 11355 17872 17429\nf 17434 17873 11357\nf 17871 17873 17872\nf 17874 11360 17851\nf 17874 17875 17436\nf 17441 17876 11363\nf 17848 17876 17875\nf 17877 17444 15391\nf 17877 17846 17878\nf 17448 17879 11366\nf 17842 17879 17878\nf 11369 17880 17450\nf 17455 17881 11372\nf 17839 17881 17880\nf 17882 11375 17837\nf 17882 17883 17457\nf 17462 17884 11378\nf 17832 17884 17883\nf 17885 11381 17830\nf 17885 17886 17464\nf 17887 17801 11384\nf 17887 10648 17886\nf 17888 11392 15237\nf 17888 17889 11387\nf 17890 7279 7000\nf 17890 17503 11391\nf 11394 17891 15194\nf 10723 17891 11397\nf 17892 17491 11401\nf 17302 17489 17893\nf 17558 17893 17894\nf 17306 17303 17895\nf 17554 17304 11404\nf 17401 17895 17896\nf 17496 17896 17556\nf 17492 17350 15201\nf 17348 17897 11411\nf 17567 17897 17494\nf 17353 17898 17389\nf 17563 17898 11415\nf 17387 17899 11417\nf 17507 17899 17565\nf 17391 17900 17238\nf 17504 17900 11421\nf 17239 17901 11423\nf 17767 17901 17505\nf 17288 15415 17902\nf 15416 17287 11427\nf 11431 17903 17904\nf 7054 17903 11430\nf 11428 11433 17902\nf 17904 17905 10334\nf 11435 17905 17530\nf 17906 17773 17907\nf 17906 17291 11439\nf 11437 10337 15418\nf 17907 17908 17295\nf 11441 17908 17770\nf 17909 17702 17910\nf 17909 11443 15339\nf 11445 17298 15419\nf 17910 17911 17912\nf 11447 17911 17699\nf 17300 11450 17913\nf 17914 10348 15420\nf 17914 15309 11451\nf 17913 11452 10354\nf 10357 7287 17915\n\nusemtl material_1\nf 17916 17917 17918\nf 17919 17917 11456\nf 17920 17921 17922\nf 17923 17924 17925\nf 17926 15433 11462\nf 17927 17928 17929\nf 17925 17930 17931\nf 17932 17928 17933\nf 8629 17934 17935\nf 17936 17937 17938\nf 17939 17940 17941\nf 17942 17943 17944\nf 17945 17946 17947\nf 17945 17948 15441\nf 17949 17950 17951\nf 17952 11467 15436\nf 17952 17953 17954\nf 17955 17956 17957\nf 17958 17959 15442\nf 17960 17961 17962\nf 17963 17964 11477\nf 17965 17966 17967\nf 17968 17969 17970\nf 17971 6019 17972\nf 17973 17974 17975\nf 17976 17977 17978\nf 17979 17980 17981\nf 17982 17983 17984\nf 15449 17985 17986\nf 17987 17988 17989\nf 17990 17991 17992\nf 17993 17994 7291\nf 17995 17996 17997\nf 17998 17999 18000\nf 18001 18002 18003\nf 18004 18005 11483\nf 18006 18007 18008\nf 18009 18010 18011\nf 18012 18013 18014\nf 18015 15496 18016\nf 18017 18018 18019\nf 18020 18021 18022\nf 18023 18024 18025\nf 18026 18027 18028\nf 18029 18030 15471\nf 18031 18032 18033\nf 15487 18034 18035\nf 18036 18037 18038\nf 18039 18040 18041\nf 18042 18043 18044\nf 18045 18046 18047\nf 18048 18007 11497\nf 18049 18050 18051\nf 11495 18052 18053\nf 18054 18055 18051\nf 18006 18056 18057\nf 18058 18059 18060\nf 18061 11502 18062\nf 18063 18064 18065\nf 18066 18067 18068\nf 18069 18070 18071\nf 15505 18072 18073\nf 11506 18074 18075\nf 18076 18060 18075\nf 18077 18078 18071\nf 18079 18080 18081\nf 18082 18083 18084\nf 18029 18085 18039\nf 18086 18087 18088\nf 18089 18090 18091\nf 18092 18093 15454\nf 18094 18095 18096\nf 18097 18098 18099\nf 18100 18101 18102\nf 18103 18104 15580\nf 15498 18105 18106\nf 18107 18108 18109\nf 18110 18111 18112\nf 11514 15506 18113\nf 18114 18115 18106\nf 6654 18116 18117\nf 18118 18119 18120\nf 18121 18122 18123\nf 18124 18125 18126\nf 18127 18128 18129\nf 18130 18131 18132\nf 18133 15515 11521\nf 18134 18133 18135\nf 18136 18137 18138\nf 18139 18140 18141\nf 15510 18142 18143\nf 18144 18145 18146\nf 7303 11203 18147\nf 18148 18149 18150\nf 18151 18152 18153\nf 18154 18155 18151\nf 18156 18157 18158\nf 18159 18160 18161\nf 15526 18162 18163\nf 18164 18165 18166\nf 18167 18168 18169\nf 18170 18171 18172\nf 18173 18174 15531\nf 18175 15535 18176\nf 18177 18178 10158\nf 11534 18178 15534\nf 18179 18180 18181\nf 18176 18182 18183\nf 18179 18184 7308\nf 7313 18174 18182\nf 18185 18186 18187\nf 11530 18188 18189\nf 18190 18186 18191\nf 15543 18192 18193\nf 18194 18195 18196\nf 18196 18197 18198\nf 18199 18200 11537\nf 18201 18202 18190\nf 18012 18203 18197\nf 15478 18204 18203\nf 18205 18206 18195\nf 18207 15495 18208\nf 11542 18209 18210\nf 18211 18210 18212\nf 18213 18214 18215\nf 18216 18217 18218\nf 18219 18220 18221\nf 18222 18223 18224\nf 18225 18226 18227\nf 18228 18229 11549\nf 18230 18231 11548\nf 18232 18233 18234\nf 18235 18236 18237\nf 18238 18239 18240\nf 18241 18242 18243\nf 18244 18245 18246\nf 18247 11554 18248\nf 18249 11154 18250\nf 18251 18252 18253\nf 18254 18255 18247\nf 18256 18257 18258\nf 18253 18259 18260\nf 18261 18262 18263\nf 15564 18264 18265\nf 18266 18267 18268\nf 18269 18264 18270\nf 18271 18272 18273\nf 18274 18275 18276\nf 18277 18278 15567\nf 18279 18280 18281\nf 18282 15572 18283\nf 18284 18285 18286\nf 18287 18288 18289\nf 18290 18291 18292\nf 18293 18294 18295\nf 18296 18297 18298\nf 18299 18297 18300\n\nusemtl material_2\nf 18301 18302 18303\nf 18304 18305 18306\nf 18307 18308 18309\nf 18310 7318 18311\nf 18312 18313 18314\nf 18315 18316 15586\nf 18317 18318 18319\nf 18320 18321 18322\nf 18323 18324 18322\nf 18325 18326 18327\nf 18328 18329 18330\nf 18331 18332 18333\nf 18334 18335 18336\nf 18337 18338 18339\nf 18340 18331 18341\nf 18342 18343 18344\nf 18345 18346 18347\nf 18348 18349 18350\nf 18351 18352 18353\nf 18351 15588 18354\nf 18355 18356 18357\nf 15599 18358 18359\nf 11577 18360 18361\nf 11571 18362 11575\nf 18363 18364 18365\nf 18366 18367 18368\nf 11574 18369 18370\nf 18371 18372 18373\nf 18374 18359 18372\nf 18375 18376 18364\nf 15603 18377 11579\nf 18378 15612 15606\nf 15600 18379 18380\nf 18381 7329 18382\nf 18383 18384 18385\nf 18386 18387 18388\nf 18389 18390 18391\nf 18392 18393 18394\nf 18395 18396 18397\nf 7330 18398 18399\nf 18400 18401 18402\nf 18403 18404 18405\nf 18406 18407 18408\nf 18409 18410 18411\nf 18412 18413 18414\nf 11591 18415 18416\nf 18417 18418 11592\nf 6001 18419 18420\nf 18421 18422 18423\nf 18424 18425 18324\nf 18426 18427 18428\nf 18429 18430 18431\nf 18432 18433 18434\nf 18435 6272 15622\nf 18436 11602 18437\nf 18438 18430 18439\nf 18440 18441 18442\nf 18443 18444 18445\nf 18411 18446 18406\nf 11618 18447 18448\nf 18449 18450 18451\nf 15636 18452 18453\nf 18454 18455 18456\nf 18457 18458 18459\nf 18460 18461 18414\nf 18449 18462 18463\nf 18464 15634 18465\nf 18466 18467 18468\nf 18469 18470 18471\nf 18472 18473 18474\nf 18475 18476 18477\nf 18478 18479 18480\nf 18481 18482 18483\nf 18484 18485 18486\nf 18487 18488 18489\nf 11631 18490 18491\nf 18492 18493 18494\nf 18495 18496 18497\nf 11642 18498 18493\nf 18499 18500 18501\nf 15649 11639 18502\nf 18503 18504 18505\nf 18492 18506 18507\nf 18508 18509 18510\nf 18511 11637 18512\nf 18513 18514 15646\nf 18513 18515 18516\nf 18517 18518 18519\nf 18520 18521 18522\nf 18523 18524 18525\nf 18526 18527 18528\nf 18529 7342 18530\nf 18531 15657 18532\nf 18533 18534 18535\nf 18536 18537 18538\nf 18539 18540 18541\nf 18533 18542 18543\nf 11659 11654 18544\nf 18545 18546 18547\nf 18548 11665 15665\nf 18549 18546 18550\nf 18551 11649 18552\nf 18553 18554 18555\nf 18556 18557 18558\nf 18559 18560 18561\nf 11660 18562 11666\nf 18563 18564 18565\nf 18566 18567 18568\nf 18569 18570 18571\nf 18572 18573 18574\nf 18575 7334 18576\nf 8841 18577 15620\nf 18578 18579 18580\nf 18581 18577 6144\nf 18581 18582 18583\nf 18584 11671 18585\nf 18586 18583 18587\nf 18588 18589 18590\nf 15691 11676 15687\nf 18591 18592 18593\nf 18594 18595 15703\nf 15701 18596 15694\nf 18597 18598 18599\nf 18600 18601 18602\nf 18603 15704 18604\nf 18605 18606 18607\nf 18608 18609 18610\nf 18611 18608 18612\nf 15696 15702 18613\nf 18614 18604 18615\nf 18616 18612 18617\nf 18618 18619 18620\nf 18621 18622 18623\nf 11690 18624 18625\nf 18626 11693 18627\nf 18628 18629 18630\nf 18631 18632 18633\nf 18634 18635 18636\nf 18637 18638 18639\nf 18640 18641 18642\nf 18628 18643 18644\nf 18645 18646 18647\nf 18648 18649 18650\nf 18651 18652 18653\nf 18654 18655 18656\nf 18657 18658 18659\nf 18660 18661 18662\nf 18663 18664 18665\nf 18666 18667 18668\nf 18669 18670 18671\nf 11699 18672 18673\nf 8622 18674 18675\nf 18676 18677 18678\nf 13584 18679 18680\nf 18681 18682 18683\nf 18684 18685 18686\nf 15730 18687 18688\nf 18689 11705 7357\nf 18690 18691 18692\nf 18693 9011 18694\nf 11711 18695 18696\nf 18697 18690 18698\nf 11710 18699 18597\nf 18700 11681 18701\n\nusemtl material_3\nf 11712 18702 18703\nf 18704 18705 18706\nf 18707 18708 18709\nf 18710 18711 18712\nf 18713 18714 18715\nf 18716 18717 18718\nf 18719 18707 18720\nf 15759 18721 11716\nf 15750 18722 18723\nf 18724 11718 18725\nf 18726 18727 11720\nf 18728 18729 18713\nf 18730 15755 18731\nf 18732 18733 18734\nf 18735 18727 18736\nf 18737 18738 18739\nf 11721 18740 18741\nf 18742 15749 18743\nf 18744 18745 18746\nf 18747 18748 18749\nf 18750 18751 18752\nf 18753 18754 18755\nf 18756 18757 15764\nf 15771 11727 7367\nf 18758 18759 18760\nf 18761 18762 18763\nf 18764 18765 18766\nf 18767 18768 18766\nf 18769 18770 18771\nf 18772 11738 18773\nf 18774 18775 18773\nf 18776 18777 11737\nf 18778 18774 18779\nf 18780 18781 18782\nf 18783 18784 18785\nf 18786 18787 18742\nf 18785 18788 18789\nf 18790 11734 18791\nf 18792 18793 18794\nf 18795 18796 18797\nf 18798 18799 18800\nf 18801 18802 18803\nf 18804 18805 18806\nf 11741 18807 18808\nf 18809 11745 18810\nf 18811 15767 18812\nf 18813 18814 18815\nf 18816 18814 11728\nf 18817 18818 18819\nf 18820 18821 18822\nf 15792 18823 18824\nf 18825 18826 18827\nf 18828 18829 15786\nf 18830 18831 15795\nf 18832 18833 18834\nf 18835 18836 15802\nf 18837 18838 18839\nf 18840 18841 18842\nf 18843 18844 18845\nf 18846 18847 18848\nf 18849 11824 18850\nf 18851 18852 18853\nf 18854 18855 11766\nf 18856 18857 18858\nf 11760 18859 18860\nf 18861 18862 11764\nf 18863 18864 18865\nf 18866 18858 18865\nf 18867 18868 18869\nf 18870 7376 18869\nf 18863 18871 18872\nf 12072 18873 18874\nf 18875 18876 18877\nf 18878 18879 18880\nf 18881 18882 18883\nf 18884 18877 18885\nf 18886 11777 18887\nf 11774 18888 18889\nf 18890 11784 18891\nf 18892 18893 18894\nf 18895 18896 18897\nf 15820 15823 18898\nf 18899 18900 18901\nf 18902 18903 18904\nf 18905 6812 18906\nf 18907 18908 18890\nf 18909 18908 18910\nf 18911 18912 18913\nf 18914 18915 18916\nf 18906 18917 7381\nf 15828 18918 18919\nf 7382 18920 15830\nf 11789 18921 18922\nf 18923 11800 18924\nf 18925 18926 18927\nf 18928 18929 18930\nf 18931 18932 18933\nf 18934 18935 18936\nf 7388 18935 18937\nf 18938 18939 18940\nf 18941 18942 18934\nf 18943 18944 18945\nf 18946 18944 18947\nf 11802 18948 18949\nf 18950 15838 18951\nf 18952 18953 18954\nf 18955 18956 12043\nf 18957 18958 18959\nf 18955 18960 18961\nf 18962 18963 18964\nf 18965 18966 18967\nf 18968 11806 7392\nf 18969 18970 18971\nf 18972 18973 15856\nf 11808 18973 7389\nf 18974 18975 18976\nf 15853 18977 18978\nf 15857 18979 18980\nf 18981 18982 15863\nf 18978 18983 18984\nf 18985 18986 18987\nf 15866 18988 18989\nf 18990 18991 18992\nf 18993 18994 15864\nf 18995 18985 18996\nf 18994 18997 18998\nf 15870 18999 19000\nf 19001 19002 19003\nf 15868 19004 19005\nf 7403 18956 19006\nf 19003 19007 19008\nf 19009 19010 19011\nf 19012 19013 15842\nf 19014 19015 19016\nf 19010 19006 15843\nf 19017 19018 15887\nf 19019 19020 19021\nf 11755 18844 19022\nf 19023 19024 15874\nf 19025 19017 15885\nf 19026 19027 19028\nf 19029 19019 19030\nf 19031 19032 19033\nf 19034 19035 19036\nf 19037 19038 19039\nf 19040 19041 19042\nf 19036 19043 19028\nf 19044 19045 19046\nf 19047 19048 11825\nf 15890 19049 19050\nf 19051 19052 19034\nf 19041 19053 19054\nf 15893 19055 19056\nf 19057 19058 19059\nf 19060 19061 13751\nf 19062 19063 19064\nf 19065 19066 19067\nf 11832 19068 19069\nf 19070 19071 19072\nf 15898 19073 19074\nf 7407 19075 19060\nf 19076 19077 19078\nf 19079 19080 19081\nf 19082 19083 19084\nf 19085 11804 19086\nf 19085 19087 15904\nf 19088 19089 19090\nf 19091 6273 19092\nf 7391 19093 19094\nf 15850 19095 19096\n\nusemtl material_1\nf 19097 19098 19099\nf 19100 19101 19102\nf 11858 19103 19104\nf 19105 19106 10166\nf 19107 19108 19109\nf 19110 19111 19112\nf 19113 19114 15911\nf 19115 19116 19117\nf 19118 19119 7420\nf 19120 19121 19122\nf 19123 19124 19125\nf 19126 19127 19128\nf 15920 19129 19130\nf 19131 19132 19133\nf 19134 19135 19136\nf 11852 19137 19138\nf 19139 19140 19133\nf 19141 19142 19143\nf 19130 11850 19144\nf 19145 19146 19147\nf 19148 19149 19150\nf 19151 19152 15923\nf 19153 19154 7661\nf 19155 19156 19157\nf 19158 19141 19159\nf 19160 19161 19153\nf 15924 19162 11854\nf 19163 19164 19165\nf 19166 19167 19168\nf 19169 19170 19171\nf 19172 19173 19174\nf 19175 19176 19177\nf 19178 19179 19180\nf 19181 19182 19183\nf 19184 19185 15979\nf 19184 19173 19186\nf 19187 19188 15978\nf 19189 19190 19191\nf 19192 7432 19193\nf 19194 19195 19196\nf 19197 19195 19198\nf 19199 19200 7430\nf 19201 19202 19203\nf 19204 19205 15932\nf 15936 19206 19207\nf 19208 19209 19210\nf 19211 19212 19213\nf 19214 19215 11874\nf 19216 19217 19218\nf 19219 19220 19221\nf 19222 19223 19224\nf 19225 19226 19217\nf 11871 19227 19228\nf 19229 19230 19231\nf 19232 19233 19234\nf 19235 19236 19237\nf 19238 19239 19240\nf 19241 19242 19243\nf 19244 19245 19246\nf 19247 19248 19249\nf 19250 19251 19252\nf 19253 19254 19255\nf 19256 19257 19258\nf 19255 19259 19260\nf 19261 19241 19253\nf 19262 19263 19264\nf 19265 19266 19267\nf 19268 19269 19270\nf 19271 19272 11881\nf 19273 19274 19275\nf 19276 19277 19278\nf 19279 11887 19280\nf 19281 19282 19283\nf 19284 19285 19286\nf 19287 19288 19289\nf 19290 19291 11885\nf 19292 19293 19294\nf 19295 19296 19297\nf 19288 6751 19298\nf 19299 19300 19301\nf 19302 19303 19304\nf 19305 19306 19307\nf 19308 19309 19310\nf 19311 19312 19313\nf 19314 19315 19316\nf 19317 11892 19318\nf 19319 15966 19320\nf 19321 19322 19323\nf 19324 19325 19326\nf 19327 19328 19329\nf 19330 19331 19332\nf 19333 19334 19335\nf 19336 19337 19338\nf 19339 7610 19340\nf 19341 19342 19340\nf 19343 19344 19345\nf 19346 19347 19348\nf 19349 19350 19351\nf 19352 19353 19354\nf 19355 19356 19357\nf 19358 19359 15984\nf 19360 19361 19362\nf 15993 19363 19364\nf 19365 19366 19367\nf 19368 15990 19369\nf 19370 19371 19362\nf 19372 19363 19373\nf 19374 19375 19376\nf 19377 19378 19379\nf 16009 19380 19381\nf 7773 19382 19383\nf 19384 19385 19386\nf 11908 19387 19388\nf 19389 19390 19391\nf 19392 19393 19394\nf 19385 19395 19396\nf 19397 19398 19399\nf 19400 19401 19402\nf 19403 19404 19405\nf 19406 19407 19408\nf 19409 19410 19411\nf 19412 19413 7446\nf 19414 19415 19416\nf 19417 19418 19419\nf 19409 19420 19421\nf 19422 19423 19424\nf 19425 19426 19427\nf 19428 19429 11898\nf 19430 19431 19432\nf 19433 11917 19434\nf 11920 19435 19436\nf 19437 6765 19397\nf 19438 19439 11910\nf 19440 19441 19442\nf 19443 7449 19444\nf 16028 19445 19446\nf 19447 11919 19448\nf 19449 11924 19448\nf 19450 19451 19452\nf 19453 19454 19455\nf 19456 19454 19407\nf 19455 19457 19458\nf 19459 19460 19461\nf 19462 19463 19464\nf 19465 16044 19466\nf 19467 19468 19469\nf 19470 19471 19472\nf 16045 19473 19474\nf 19475 19476 16055\nf 19477 19478 19479\nf 19480 19481 19482\nf 19483 19484 16052\nf 19485 19486 19487\nf 19449 19488 19489\nf 19490 19491 19492\nf 19493 16035 19494\nf 19495 7454 19496\n\nusemtl material_4\nf 16063 7483 11949\nf 7498 19497 19498\nf 11953 19497 19499\nf 19500 11958 12932\nf 19500 7928 11957\nf 12973 16195 12975\nf 16194 11970 7494\nf 11992 11985 11981\nf 11991 19501 11994\nf 7519 19502 19503\nf 16058 19504 19505\nf 11997 11999 19506\nf 19503 12003 12000\nf 12008 19507 16059\nf 7813 12790 19508\nf 13242 13471 19509\nf 12046 7538 19510\nf 12067 12069 16070\nf 12094 19511 12096\nf 19511 12148 12104\nf 12153 7687 19512\nf 19512 7690 12158\nf 12174 7704 7701\nf 12172 12156 12178\nf 7711 12086 16064\nf 7717 12077 16066\nf 12201 12205 19513\nf 12208 19513 12210\nf 7725 7579 16067\nf 12215 12211 7729\nf 12214 7732 16071\nf 7562 12217 12220\nf 19514 19515 12327\nf 12034 19515 12228\nf 19516 16072 19517\nf 12235 19517 19518\nf 19516 19510 12224\nf 7743 19519 19520\nf 19514 19519 12231\nf 12236 19521 12053\nf 19522 19521 12234\nf 12232 19518 16074\nf 7744 19523 7747\nf 12058 12247 7553\nf 12059 19522 12239\nf 16076 12233 16075\nf 19524 12242 19525\nf 7748 19526 19525\nf 19527 12252 12065\nf 19527 12246 12245\nf 16078 19528 12240\nf 12238 19528 12248\nf 19529 19530 19531\nf 19524 19532 19533\nf 12068 19534 12257\nf 19535 12253 19536\nf 12244 16079 19536\nf 19537 19538 19539\nf 19529 19538 12256\nf 12258 12264 12213\nf 19540 19541 19542\nf 19535 16081 19543\nf 19544 19545 19546\nf 19537 19545 12262\nf 12263 12273 12207\nf 19547 19548 16082\nf 19540 19548 12265\nf 19549 19550 19551\nf 19544 19550 12268\nf 12272 19552 12203\nf 12278 19552 12271\nf 12269 19553 16083\nf 19547 19553 12274\nf 19554 19555 12368\nf 19549 19555 12277\nf 12286 12196 12193\nf 19556 12279 19557\nf 12270 16084 19557\nf 19558 19559 12376\nf 19554 19559 12282\nf 12285 12284 19560\nf 12288 12188 19560\nf 7749 19561 12280\nf 19556 19561 12287\nf 16087 16086 19562\nf 19563 12294 19564\nf 12291 7755 19564\nf 19565 19566 12304\nf 12298 12297 12301\nf 12303 7765 12308\nf 12305 12313 7766\nf 7764 19567 12306\nf 19568 19567 19566\nf 12325 12320 19569\nf 19570 19571 16089\nf 12319 19571 12321\nf 19572 7775 19573\nf 19574 19575 12324\nf 12326 16091 19576\nf 12332 19520 19576\nf 16090 19577 12322\nf 19570 19577 19569\nf 19578 19579 19580\nf 19575 19579 12330\nf 12331 19581 19523\nf 19582 19583 19584\nf 19578 19583 12336\nf 19585 12338 19526\nf 19586 19587 19588\nf 19582 19587 12342\nf 12337 12344 19532\nf 19589 19590 19591\nf 19586 19590 12348\nf 12349 12356 19539\nf 19592 19593 19594\nf 19589 19593 12354\nf 12355 12362 19546\nf 19595 19596 19597\nf 19592 19596 12360\nf 12361 19598 19551\nf 19599 19600 19601\nf 19595 19600 12366\nf 12367 19602 12377\nf 19603 19604 13293\nf 19599 19604 12372\nf 19558 19605 16085\nf 19606 19605 12375\nf 12373 12378 16096\nf 19603 19607 12381\nf 19562 19608 19563\nf 19609 19608 19606\nf 12382 12388 19609\nf 12374 16098 12383\nf 12293 12392 12292\nf 19610 12389 16101\nf 12384 19611 16099\nf 16102 19612 19613\nf 12300 12391 19565\nf 7777 12393 19610\nf 19614 16103 12395\nf 19615 12399 19568\nf 7782 19616 12397\nf 12398 12403 12307\nf 7780 19617 19614\nf 12390 19617 19615\nf 7783 16104 12401\nf 19618 12407 7467\nf 19619 19616 7785\nf 19619 19618 12404\nf 12406 7786 12413\nf 12405 7784 16105\nf 19620 7468 12412\nf 19621 16203 13000\nf 12418 12999 19622\nf 19623 7789 19624\nf 12417 12420 19625\nf 12423 19626 19627\nf 12419 19626 16107\nf 7791 19628 19629\nf 19630 19628 12422\nf 12425 19631 16108\nf 19632 12424 13050\nf 19630 7792 19633\nf 19634 7794 12426\nf 19631 12429 12427\nf 19632 19635 12430\nf 16109 12433 19636\nf 19634 19637 19638\nf 19639 19637 12435\nf 16111 12434 12432\nf 16112 12438 19640\nf 19641 19639 12443\nf 19642 16116 12439\nf 12442 16115 19643\nf 12447 7797 19644\nf 19644 12449 19645\nf 19646 12453 19645\nf 19643 12452 19647\nf 16114 19646 12450\nf 12451 12448 19648\nf 12455 19649 7800\nf 16113 12454 19642\nf 12989 19650 19651\nf 19652 19650 12460\nf 12992 12462 16117\nf 19653 19654 19624\nf 19655 19656 12463\nf 19652 19657 19658\nf 19659 19657 12466\nf 19660 12468 16118\nf 19661 19662 19629\nf 19653 19662 12469\nf 19659 19663 19664\nf 19665 19663 12472\nf 12467 12474 16119\nf 19666 19667 19633\nf 19661 19667 12475\nf 19665 19668 19669\nf 19670 19668 12478\nf 12473 12480 16120\nf 12485 19671 19638\nf 19666 19671 12481\nf 19670 19672 19673\nf 19674 19672 12484\nf 12479 19675 16121\nf 12489 19675 12487\nf 19676 12486 19641\nf 19676 19677 12490\nf 19674 19678 19679\nf 19680 19678 12493\nf 12488 19681 16122\nf 12500 12496 19648\nf 19682 19681 12494\nf 12495 19677 19647\nf 19680 19683 19684\nf 12503 19683 12499\nf 19682 19685 16124\nf 12506 19685 12502\nf 19686 14044 12504\nf 19686 16123 12505\nf 12009 8045 19687\nf 8357 19688 16125\nf 19689 19688 12508\nf 19690 12507 19505\nf 19687 19691 19684\nf 19692 19691 12511\nf 19689 12513 16126\nf 19693 19694 19695\nf 19690 19694 12514\nf 19692 19696 19679\nf 19697 19696 12517\nf 12512 12519 16127\nf 12520 19693 19501\nf 19697 19698 19673\nf 19699 19698 12523\nf 12518 19700 16128\nf 11988 19700 11993\nf 19699 19701 19669\nf 19702 19701 12526\nf 19702 19703 19664\nf 19704 19703 12529\nf 11987 12533 12530\nf 12534 19705 12531\nf 19704 19705 19706\nf 19707 19658 19706\nf 12537 7503 12540\nf 19708 7803 19651\nf 19708 19707 12539\nf 16130 16131 19709\nf 7811 12543 19709\nf 12544 12547 19710\nf 19711 19712 16133\nf 14079 19712 12545\nf 19713 19508 19714\nf 19713 19715 16132\nf 12546 12553 19716\nf 19717 19718 12550\nf 19711 19718 12548\nf 19719 19720 19721\nf 19715 19720 12551\nf 12552 12559 19722\nf 19723 19724 16134\nf 19717 19724 12554\nf 19725 19726 19727\nf 19719 19726 12557\nf 12558 12565 19728\nf 19729 19730 16135\nf 19723 19730 12560\nf 19731 19732 19733\nf 19725 19732 12563\nf 12564 12571 19734\nf 19735 19736 16136\nf 19729 19736 12566\nf 19737 19738 19739\nf 19731 19738 12569\nf 12570 12577 19740\nf 19741 19742 16137\nf 19735 19742 12572\nf 19743 19744 19745\nf 19737 19744 12575\nf 12576 12583 19746\nf 19747 19748 16138\nf 19741 19748 12578\nf 19749 19750 19751\nf 19743 19750 12581\nf 12582 19752 19753\nf 19754 19755 16139\nf 19747 19755 12584\nf 19756 19757 19758\nf 19749 19757 12587\nf 19759 19760 16140\nf 19754 19760 19752\nf 19761 19762 19763\nf 19756 19762 12590\nf 19764 19765 16141\nf 19759 19765 19766\nf 19767 19768 12843\nf 19761 19768 12593\nf 12594 19769 16143\nf 19764 19769 19770\nf 19771 19772 16144\nf 19771 16142 19773\nf 12597 19773 19767\nf 12605 7818 12600\nf 19772 12604 12599\nf 13420 12606 12609\nf 16148 16146 12615\nf 12619 12614 19774\nf 19775 19776 13426\nf 19775 7824 16147\nf 12623 12620 19777\nf 19776 12622 19778\nf 12626 19779 19778\nf 12621 12625 7826\nf 19780 12624 19781\nf 12627 12631 19782\nf 19780 12633 16149\nf 12632 7831 19783\nf 12634 12641 16151\nf 12637 12628 19784\nf 7833 19785 16280\nf 12129 19785 12640\nf 12642 12646 16152\nf 12645 12635 19786\nf 12647 19787 7837\nf 7838 7842 19787\nf 19788 7528 12658\nf 7526 12655 19789\nf 7850 12660 12801\nf 19790 16153 19788\nf 12659 12666 19791\nf 19792 19793 12663\nf 19790 19793 12661\nf 19794 19795 19796\nf 12657 19795 12664\nf 12665 12672 19797\nf 19798 19799 16154\nf 19792 19799 12667\nf 19800 19801 19802\nf 19794 19801 12670\nf 12671 12678 19803\nf 19804 19805 16155\nf 19798 19805 12673\nf 19806 19807 19808\nf 19800 19807 12676\nf 12677 12684 19809\nf 19810 19811 16156\nf 19804 19811 12679\nf 19812 19813 19814\nf 19806 19813 12682\nf 12683 12690 19815\nf 19816 19817 16157\nf 19810 19817 12685\nf 19818 19819 19820\nf 19812 19819 12688\nf 12689 19821 19822\nf 12692 19823 16159\nf 19816 19823 12691\nf 19824 19825 16158\nf 19824 19818 19826\nf 19821 19827 19828\nf 12695 19827 12694\nf 19829 12700 12693\nf 12701 19830 13042\nf 19825 19830 19829\nf 12706 12696 12699\nf 12703 12710 12698\nf 12714 12707 12709\nf 12716 19831 12859\nf 7853 19832 16160\nf 19833 19832 12718\nf 19834 12717 19835\nf 19831 12721 12869\nf 19833 12723 16161\nf 19834 19836 12724\nf 12727 19837 19838\nf 12722 19839 16162\nf 12731 19836 13068\nf 19840 19841 19842\nf 19840 19837 12730\nf 19843 19844 16163\nf 19843 19839 12733\nf 19845 12732 13071\nf 19846 19847 19848\nf 19846 19841 12736\nf 19844 19849 19850\nf 19851 19852 19853\nf 19845 19852 19849\nf 12889 19847 12742\nf 12737 19854 16165\nf 12746 19855 19856\nf 19857 12756 16167\nf 19857 19854 12748\nf 12751 12747 19858\nf 16166 12752 19859\nf 12753 12755 19860\nf 12754 12760 19861\nf 19860 12763 12761\nf 12759 12749 19862\nf 12762 7854 19863\nf 12764 12770 7855\nf 12767 12757 19864\nf 12771 12777 12775\nf 12774 12765 19865\nf 12776 7857 12920\nf 12781 12772 19866\nf 16168 12780 7861\nf 12784 12779 19867\nf 12794 12796 12792\nf 7869 12789 12017\nf 19868 12803 19721\nf 19868 19714 7868\nf 16170 12798 16169\nf 12802 12809 19727\nf 19869 19870 16171\nf 12797 19870 12804\nf 19871 19872 19791\nf 12799 19872 12807\nf 12808 12815 19733\nf 19873 19874 16172\nf 19869 19874 12810\nf 19875 19876 19797\nf 19871 19876 12813\nf 12814 12821 19739\nf 19877 19878 16173\nf 19873 19878 12816\nf 19879 19880 19803\nf 19875 19880 12819\nf 12820 12827 19745\nf 19881 19882 16174\nf 19877 19882 12822\nf 19883 19884 19809\nf 19879 19884 12825\nf 12826 12833 19751\nf 19885 19886 16175\nf 19881 19886 12828\nf 19887 19888 19815\nf 19883 19888 12831\nf 12832 12839 19758\nf 19889 19890 16176\nf 19885 19890 12834\nf 19887 19822 12837\nf 12838 19891 19763\nf 19892 19893 16178\nf 19889 19893 12840\nf 19894 16177 19828\nf 19891 19895 12841\nf 19895 19892 12845\nf 12844 12849 16179\nf 12850 19896 12697\nf 19894 19896 12846\nf 12853 7873 19897\nf 12848 7874 19897\nf 12860 12854 12856\nf 12862 19898 16145\nf 12855 12864 16180\nf 12868 19899 12863\nf 19898 19900 19774\nf 19901 19900 12867\nf 19899 19902 16181\nf 12874 12870 19838\nf 19903 19904 19777\nf 19903 19901 12873\nf 19905 19906 16182\nf 19905 19902 12876\nf 12880 12875 19842\nf 19907 19908 19781\nf 19907 19904 12879\nf 19909 19910 16183\nf 19909 19906 12882\nf 19911 12881 19848\nf 12630 19908 12885\nf 19912 19913 16184\nf 19912 19910 19911\nf 12888 12895 19784\nf 19914 12897 16185\nf 19914 19913 12891\nf 12894 12890 12745\nf 12896 19915 19786\nf 12898 12905 16186\nf 12901 12892 19859\nf 19916 7880 12648\nf 19916 19915 12904\nf 12906 12910 16189\nf 12909 12899 19861\nf 16188 19917 12915\nf 12911 12916 19917\nf 12914 12907 19863\nf 12917 7885 7884\nf 7643 12924 19918\nf 12938 19919 7906\nf 12944 7912 19919\nf 12951 19920 7914\nf 12954 7918 19920\nf 12956 19921 12957\nf 19921 19922 19923\nf 19923 12963 12960\nf 12962 12968 16192\nf 19924 12967 19925\nf 12970 11965 19498\nf 12940 12950 7934\nf 11968 12987 7812\nf 16197 7935 12953\nf 19926 16202 12988\nf 19927 7938 12990\nf 19927 19926 12982\nf 12458 16201 12993\nf 12984 16198 12991\nf 19928 16199 12966\nf 19929 7922 19930\nf 19655 19931 7925\nf 19930 19931 12994\nf 19924 12416 12997\nf 13006 16205 13003\nf 19932 19933 16206\nf 16204 19933 13009\nf 19934 13007 19649\nf 13008 13014 19796\nf 19934 19935 13012\nf 13013 13020 19802\nf 19936 19937 16207\nf 19932 19937 13015\nf 19938 19939 12457\nf 19935 19939 13018\nf 13019 13026 19808\nf 19940 19941 16208\nf 19936 19941 13021\nf 19942 19943 19640\nf 19938 19943 13024\nf 13025 13032 19814\nf 19944 19945 16209\nf 19940 19945 13027\nf 19946 19947 16110\nf 19942 19947 13030\nf 13031 13038 19820\nf 19948 19949 16210\nf 19944 19949 13033\nf 19950 19951 19636\nf 19946 19951 13036\nf 13037 13040 19826\nf 13045 19952 16212\nf 19948 19952 13039\nf 19953 19950 19635\nf 19953 13046 16211\nf 13051 13041 13044\nf 13048 13055 13043\nf 13058 13052 13054\nf 13057 19954 13053\nf 19954 19955 16214\nf 13060 13056 19627\nf 16215 19835 16213\nf 19956 19955 13062\nf 19956 13064 16216\nf 19957 13061 19622\nf 19957 19958 13065\nf 13063 19959 16217\nf 13072 19958 12414\nf 19960 19961 16219\nf 19960 19959 13074\nf 13077 13073 19925\nf 16218 19962 19853\nf 19961 13076 13078\nf 19963 19964 12969\nf 13075 19964 19965\nf 19966 19967 19856\nf 19966 19962 13080\nf 19965 19968 16220\nf 13084 19963 12964\nf 19969 13090 19858\nf 19969 19967 13083\nf 19970 13088 16221\nf 19970 19968 13086\nf 19971 13085 19922\nf 19972 19973 12955\nf 19971 19973 13089\nf 13091 13092 19862\nf 13087 19974 16222\nf 19972 12946 19975\nf 13093 13100 19864\nf 13096 13103 16223\nf 13094 19974 19975\nf 19976 13095 12948\nf 13102 13106 19865\nf 19977 13105 19978\nf 13097 19976 12942\nf 19977 13112 19866\nf 13115 19978 13108\nf 13111 13107 12936\nf 13114 19979 19867\nf 19980 13116 13110\nf 19979 13119 7864\nf 19980 19981 16224\nf 19982 13118 12933\nf 19982 13124 19981\nf 19983 13123 13126\nf 19983 12133 13120\nf 13128 13122 13125\nf 13138 13347 19984\nf 19985 13145 19986\nf 19985 13133 13134\nf 19987 19988 19989\nf 19984 19988 13143\nf 13144 13151 19990\nf 19991 19992 16225\nf 13139 19992 13146\nf 19993 19994 19995\nf 19987 19994 13149\nf 13150 13157 19996\nf 19997 19998 16226\nf 19991 19998 13152\nf 19999 20000 20001\nf 20002 20000 13155\nf 13156 13163 20003\nf 20004 20005 16227\nf 19997 20005 13158\nf 20006 20007 20008\nf 19999 20007 13161\nf 13162 13169 20009\nf 20010 20011 16228\nf 20004 20011 13164\nf 20012 20013 13365\nf 20006 20013 13167\nf 13168 13175 20014\nf 20015 20016 16229\nf 20010 20016 13170\nf 20017 20018 20019\nf 20012 20018 13173\nf 13174 13181 20020\nf 20021 20022 16230\nf 20015 20022 13176\nf 20023 20024 20025\nf 20017 20024 13179\nf 13180 13187 20026\nf 20027 20028 16231\nf 20021 20028 13182\nf 20029 20030 20031\nf 20023 20030 13185\nf 13186 13193 20032\nf 20033 20034 16232\nf 20027 20034 13188\nf 20035 20036 20037\nf 20029 20036 13191\nf 13192 13199 20038\nf 20039 20040 16233\nf 20033 20040 13194\nf 20041 20042 20043\nf 20035 20042 13197\nf 13198 20044 20045\nf 20039 16234 13200\nf 20046 20047 20048\nf 20041 20047 13203\nf 20049 13205 20050\nf 20051 20052 20053\nf 20046 20052 13209\nf 20054 20055 20056\nf 13221 20055 13212\nf 13210 13214 16236\nf 20051 20057 13217\nf 20058 20059 20060\nf 20058 7968 13222\nf 13211 16237 20059\nf 20061 13229 20060\nf 20061 13223 13230\nf 13235 13335 13227\nf 13232 16240 16238\nf 20062 7972 20063\nf 13239 16260 20063\nf 19572 13251 19574\nf 19573 20064 13246\nf 20064 19509 12026\nf 20065 20066 19986\nf 12030 20066 13249\nf 13250 13257 19580\nf 20067 20068 16241\nf 13245 20068 13252\nf 20069 20070 19990\nf 20065 20070 13255\nf 13256 13263 19584\nf 20071 20072 16242\nf 20067 20072 13258\nf 20073 20074 19996\nf 20069 20074 13261\nf 13262 13269 19588\nf 20075 20076 16243\nf 20071 20076 13264\nf 20077 20078 20003\nf 20073 20078 13267\nf 13268 13275 19591\nf 20079 20080 16244\nf 20075 20080 13270\nf 20081 20082 20009\nf 20077 20082 13273\nf 13274 13281 19594\nf 20083 20084 16245\nf 20079 20084 13276\nf 20085 20086 20014\nf 20081 20086 13279\nf 13280 13287 19597\nf 20083 16246 13282\nf 20087 20088 20020\nf 20085 20088 13285\nf 13286 20089 19601\nf 20090 20091 20026\nf 20087 20091 16247\nf 13292 20092 13299\nf 20093 20094 20032\nf 20090 20094 13297\nf 13298 20095 19607\nf 20096 13300 16249\nf 20097 20098 20038\nf 20093 20098 13303\nf 20095 13305 20099\nf 20100 20101 16250\nf 20096 20101 13306\nf 20102 20103 20045\nf 20097 20103 13309\nf 13310 13318 19613\nf 20104 20105 16251\nf 20100 20105 13312\nf 7976 20106 20050\nf 20102 20106 13315\nf 20107 20108 13316\nf 20107 20109 16253\nf 20104 20109 13319\nf 16254 13322 20056\nf 7977 13213 20054\nf 7981 20110 13323\nf 12402 20108 13325\nf 16258 7980 16255\nf 12408 13331 7787\nf 12410 20110 13328\nf 20111 20112 7983\nf 20111 20113 16259\nf 13327 20113 13332\nf 20114 13336 20112\nf 20115 20116 13236\nf 13333 20116 20114\nf 20117 13337 20118\nf 13342 20119 20062\nf 13345 13343 7991\nf 12024 13478 20120\nf 12025 13350 19989\nf 16261 20120 7993\nf 20121 12022 19710\nf 20121 20122 16262\nf 19993 20123 20002\nf 13349 13353 19995\nf 20124 20125 19716\nf 20122 20125 13354\nf 20126 20123 16263\nf 20127 20128 19722\nf 20124 20128 13357\nf 20129 20130 16264\nf 20126 20130 20001\nf 20131 20132 19728\nf 20127 20132 13360\nf 20133 20134 16265\nf 20129 20134 20008\nf 20135 20136 19734\nf 20131 20136 13363\nf 13364 13371 20019\nf 20137 20138 16266\nf 20133 20138 13366\nf 20139 20140 19740\nf 20135 20140 13369\nf 13370 13377 20025\nf 20141 20142 16267\nf 20137 20142 13372\nf 20143 20144 19746\nf 20139 20144 13375\nf 13376 13383 20031\nf 20145 20146 16268\nf 20141 20146 13378\nf 20147 20148 19753\nf 20143 20148 13381\nf 13382 13389 20037\nf 20149 20150 16269\nf 20145 20150 13384\nf 20151 20152 13387\nf 20151 20147 19766\nf 13388 13395 20043\nf 20153 20154 16270\nf 20149 20154 13390\nf 20155 20156 13393\nf 20155 20152 19770\nf 13394 13401 20048\nf 20157 20158 16271\nf 20153 20158 13396\nf 20159 20160 13399\nf 20159 20156 12596\nf 13400 20161 20053\nf 20162 20163 16272\nf 20157 20163 13402\nf 20164 20165 13405\nf 20164 20160 7816\nf 13412 20057 13408\nf 13406 20166 16273\nf 20162 20166 20161\nf 13409 13416 13407\nf 20167 20165 12607\nf 20167 13417 13411\nf 13421 13413 13415\nf 13419 7995 13414\nf 20168 13436 16275\nf 20168 16274 13429\nf 13432 13428 19779\nf 13435 20169 7987\nf 13437 13444 16277\nf 13440 13430 19782\nf 20169 13443 13344\nf 16276 16278 13441\nf 13442 8001 12124\nf 13445 13449 16279\nf 13448 13438 19783\nf 13450 8005 8004\nf 13462 13581 16503\nf 20170 14074 20171\nf 20170 20172 13467\nf 13479 13348 14615\nf 13482 8577 20173\nf 13487 12015 8036\nf 13493 19507 14072\nf 16281 16282 13499\nf 20174 20175 20172\nf 13502 20175 20176\nf 13505 20176 20177\nf 20178 8071 13521\nf 13530 20179 8083\nf 8081 20180 8064\nf 13561 8133 8607\nf 13576 14820 13574\nf 13628 16284 8232\nf 13661 20181 20182\nf 13672 20183 8227\nf 20184 13679 20185\nf 20184 20183 13676\nf 8163 13674 20186\nf 13599 13695 13691\nf 13608 13692 13697\nf 13696 20187 13698\nf 20188 20187 8290\nf 13609 20189 16285\nf 20189 16286 13700\nf 20188 20190 13702\nf 13703 8287 13705\nf 13707 13715 13683\nf 13709 8224 13701\nf 13706 16303 13710\nf 13711 8283 13713\nf 13717 13720 20185\nf 13725 20191 16287\nf 20191 20192 13728\nf 13729 8234 20192\nf 8231 8233 13733\nf 20193 13726 20194\nf 13736 20195 20196\nf 20196 20197 13737\nf 20198 13744 13738\nf 13743 20199 13739\nf 20199 20200 8248\nf 13750 20200 13746\nf 8249 13749 8253\nf 20201 13745 20202\nf 20203 13760 20204\nf 13761 20205 13758\nf 20203 13757 8022\nf 13764 8262 13655\nf 20206 13768 20207\nf 20206 20205 16288\nf 13766 13763 13664\nf 13767 20208 20209\nf 20210 20211 20208\nf 13777 13770 20212\nf 20213 20214 20215\nf 20216 20214 13774\nf 16289 13772 20210\nf 20216 13779 20217\nf 16290 13773 16291\nf 13778 20218 20219\nf 8275 8273 13754\nf 16292 20220 8272\nf 20221 13784 20222\nf 20223 20218 16294\nf 20223 20224 13785\nf 20201 16295 8277\nf 20202 20225 13788\nf 13789 20226 20227\nf 20228 20224 16296\nf 20228 20229 13791\nf 20230 20225 13741\nf 20231 20232 20233\nf 13796 13802 20234\nf 20235 20229 16297\nf 20235 20236 20237\nf 20233 20238 13800\nf 13801 20239 20240\nf 20241 20236 16298\nf 20241 20242 13803\nf 20243 20238 20195\nf 20243 20244 13806\nf 20245 13813 20246\nf 20245 20239 13809\nf 13807 20242 16299\nf 20247 20244 13732\nf 20247 20193 13812\nf 13815 8278 20248\nf 13817 13808 16300\nf 13821 20194 13722\nf 13829 16302 8284\nf 13832 8288 20190\nf 13842 13834 8289\nf 20249 13849 13942\nf 13852 13860 13472\nf 16304 8304 13855\nf 20250 20251 8570\nf 13866 20251 13858\nf 20252 13853 16306\nf 20252 13856 13861\nf 8306 13864 13759\nf 16310 16305 13862\nf 13863 13854 20204\nf 13865 13872 20253\nf 8308 16307 16309\nf 16308 20254 13867\nf 20255 8307 20207\nf 20255 20256 13870\nf 13871 13878 20257\nf 20258 20254 16311\nf 20258 20259 13873\nf 20260 20256 20209\nf 20260 20261 13876\nf 13877 13884 20262\nf 20263 20259 16312\nf 20263 20264 13879\nf 20213 20261 20211\nf 20215 20265 13882\nf 13883 13890 20266\nf 20267 20264 16313\nf 20267 20268 13885\nf 13888 20269 20270\nf 13889 13896 20271\nf 20272 20268 16315\nf 20272 20273 13891\nf 13895 13901 20274\nf 20275 20273 16317\nf 20275 20276 13897\nf 20277 20276 16319\nf 20277 20278 13902\nf 20234 20279 16320\nf 20280 16321 20281\nf 20280 20282 20283\nf 20284 20279 20240\nf 20284 20285 20286\nf 20287 13906 20288\nf 20286 20289 20281\nf 13910 20285 20246\nf 13905 13912 20290\nf 20291 20292 16324\nf 20291 20293 13913\nf 8309 16325 20248\nf 13914 13917 14791\nf 20294 20293 16328\nf 20294 20295 13916\nf 8312 8310 13823\nf 13919 13925 20296\nf 13921 20295 16330\nf 20297 8313 13827\nf 20297 8315 13924\nf 13927 13933 20298\nf 13929 13920 16332\nf 13835 8316 13838\nf 13837 20249 13932\nf 13935 8145 20299\nf 13937 13928 16333\nf 13592 13939 13944\nf 13953 16334 20300\nf 13955 20301 14554\nf 20302 13954 16336\nf 8323 13958 16335\nf 13961 20302 16337\nf 20303 8331 14483\nf 13973 13975 13970\nf 13960 16472 20301\nf 20304 13956 20305\nf 20304 8335 16339\nf 13977 20306 8514\nf 20306 20307 8511\nf 20308 13976 16342\nf 20309 8336 20310\nf 20311 8338 13980\nf 20312 13982 20313\nf 20314 20308 16344\nf 20314 20312 20307\nf 20315 20316 20313\nf 13981 16346 13988\nf 20317 8339 14029\nf 20318 20319 13986\nf 13989 20320 20321\nf 20322 20320 13991\nf 20323 20319 20324\nf 20323 20325 20326\nf 20327 20328 14510\nf 13993 20328 16348\nf 20327 20329 20322\nf 13999 13998 20330\nf 16349 13994 20330\nf 20331 20332 8348\nf 20325 20332 14001\nf 14005 20333 13950\nf 14486 14007 16350\nf 20334 20335 20336\nf 20334 20337 14008\nf 20338 20339 8325\nf 20338 20333 14011\nf 14006 14013 16351\nf 20340 20337 20341\nf 20340 20342 14014\nf 20343 20344 20305\nf 20343 20339 14017\nf 14012 14019 16352\nf 20345 20342 20346\nf 20345 20347 14020\nf 20309 16354 20311\nf 20310 20344 14023\nf 14018 14025 16355\nf 20348 20347 20349\nf 20348 20350 14026\nf 20317 20351 20318\nf 14024 14031 16356\nf 14032 20350 20352\nf 20353 8346 20324\nf 20353 20351 14035\nf 14030 14037 16359\nf 20354 14038 20355\nf 20331 14040 13996\nf 14043 20356 14036\nf 16358 20356 14041\nf 14045 20354 13489\nf 20357 8352 20336\nf 14050 20358 8353\nf 14051 14493 14498\nf 8354 16361 20341\nf 16360 14055 20359\nf 16362 20358 14053\nf 20360 20361 13510\nf 14052 20361 14056\nf 20359 20362 20346\nf 14054 14058 14060\nf 20363 20360 20177\nf 20363 20364 14059\nf 20365 20366 20349\nf 20365 20362 14062\nf 14057 14064 16363\nf 20367 20364 20174\nf 20367 20368 14065\nf 20369 20370 20352\nf 20369 20366 14068\nf 14063 14070 16365\nf 14071 20368 20171\nf 20370 20371 20355\nf 14075 20371 16364\nf 14077 14069 8355\nf 12007 8356 14073\nf 14078 14080 7815\nf 14295 12791 14082\nf 20372 20173 20373\nf 20372 20374 14087\nf 14090 20375 20376\nf 20377 20378 14085\nf 14088 20378 14092\nf 20379 20374 20380\nf 20379 20381 16366\nf 20376 14097 20382\nf 20383 20377 16367\nf 20383 20384 20375\nf 20385 20381 20386\nf 20385 20387 14095\nf 14096 14103 20388\nf 20389 20384 16368\nf 20389 20390 14098\nf 20391 20387 20392\nf 20391 20393 14101\nf 14102 14109 20394\nf 20395 20390 16369\nf 20395 20396 14104\nf 20397 20393 20398\nf 20397 20399 14107\nf 14108 14115 20400\nf 20401 20396 16370\nf 20401 20402 14110\nf 20403 20399 20404\nf 20403 20405 14113\nf 14114 14121 20406\nf 20407 20402 16371\nf 20407 20408 14116\nf 20409 20405 20410\nf 20409 20411 14119\nf 14120 14127 20412\nf 20413 20408 16372\nf 20413 20414 14122\nf 20415 20411 20416\nf 20415 20417 14125\nf 14126 14133 20418\nf 20419 20414 16373\nf 20419 20420 14128\nf 20421 20417 20422\nf 20421 20423 14131\nf 14132 14139 20424\nf 20425 20420 16374\nf 20425 20426 14134\nf 20427 20423 20428\nf 20427 20429 14137\nf 14138 14144 14351\nf 14140 20426 16375\nf 20430 20429 20431\nf 20430 14147 14143\nf 8361 14145 14141\nf 20432 14149 20433\nf 16377 8360 14150\nf 14153 8364 20433\nf 20434 20435 20436\nf 20432 20435 14158\nf 8366 16382 20436\nf 20434 20437 14161\nf 8371 20438 14162\nf 20437 20438 8369\nf 8367 20439 16386\nf 8370 20440 20439\nf 16388 14168 20441\nf 8376 20441 20440\nf 8379 14170 14173\nf 16389 14171 16392\nf 14181 20442 14176\nf 14174 20442 20443\nf 20444 16445 16444\nf 19789 20445 14182\nf 20446 13486 20447\nf 20448 14187 20449\nf 20450 20445 16397\nf 20450 20451 20448\nf 14185 20446 20452\nf 14186 14193 20453\nf 20454 20451 16398\nf 20454 20455 14188\nf 20456 20457 14191\nf 14192 14199 20458\nf 20459 20455 16399\nf 20459 20460 14194\nf 20461 20457 20462\nf 20461 20463 14197\nf 14198 14205 20464\nf 20465 20460 16400\nf 20465 20466 14200\nf 20467 20463 20468\nf 20467 20469 14203\nf 14204 14211 20470\nf 20471 20466 16401\nf 20471 20472 14206\nf 20473 20469 20474\nf 20473 20475 14209\nf 14210 14217 20476\nf 20477 20472 16402\nf 20477 20478 14212\nf 20479 20475 20480\nf 20479 20481 14215\nf 20482 20478 16404\nf 20482 20483 14218\nf 20484 20481 20485\nf 20484 20486 16403\nf 14219 20487 8394\nf 20483 20488 20487\nf 16405 20486 20489\nf 20490 20491 20492\nf 20488 16406 20490\nf 14224 8395 20492\nf 16408 20493 14225\nf 16407 20491 14221\nf 20494 16470 14230\nf 20495 20496 14234\nf 20493 20496 14232\nf 20497 20494 20498\nf 20499 20500 14237\nf 20495 20500 20498\nf 20501 20502 20503\nf 20497 20502 14241\nf 20504 20505 14243\nf 20499 20505 20503\nf 20506 20507 20508\nf 20501 20507 14247\nf 20509 20510 14249\nf 20504 20510 20508\nf 20511 20512 20513\nf 20506 20512 14253\nf 20509 14255 20513\nf 20514 20515 14261\nf 20511 20515 14259\nf 20516 14265 20514\nf 20517 16423 20518\nf 14263 20518 16421\nf 20516 14267 20519\nf 8399 20517 20519\nf 8403 8398 16422\nf 8405 14273 8401\nf 8409 8404 16424\nf 8411 14277 8407\nf 8415 8410 16427\nf 8417 14281 8413\nf 8421 8416 16429\nf 8426 8422 16430\nf 14297 20520 20521\nf 20522 16431 20520\nf 20522 20523 14300\nf 20523 8437 14293\nf 20524 14307 20525\nf 20524 20526 20527\nf 20526 20447 20521\nf 14299 14091 14303\nf 20452 20525 20456\nf 20528 20527 16432\nf 20382 20529 14305\nf 14306 14313 20462\nf 20530 20528 16433\nf 20530 20531 14308\nf 20532 20529 20388\nf 20532 20533 14311\nf 14312 14319 20468\nf 20534 20531 16434\nf 20534 20535 14314\nf 20536 20533 20394\nf 20536 20537 14317\nf 14318 14325 20474\nf 20538 20535 16435\nf 20538 20539 14320\nf 20540 20537 20400\nf 20540 20541 14323\nf 14324 14331 20480\nf 20542 20539 16436\nf 20542 20543 14326\nf 20544 20541 20406\nf 20544 20545 14329\nf 14330 14337 20485\nf 20546 20543 16437\nf 20546 20547 14332\nf 20548 20545 20412\nf 20548 20549 14335\nf 14336 14343 20489\nf 20550 20547 16438\nf 20550 20551 14338\nf 20552 20549 20418\nf 20552 20553 14341\nf 14342 14348 14223\nf 20554 20551 16439\nf 20554 20555 14344\nf 20556 20553 20424\nf 20556 14350 14346\nf 8439 20557 20555\nf 20558 14347 20557\nf 20559 14353 20560\nf 20561 14357 20562\nf 20563 20564 14359\nf 20560 20564 20562\nf 20565 20566 20567\nf 20561 20566 14363\nf 20568 20569 14365\nf 20563 20569 20567\nf 20570 20571 20572\nf 20565 20571 14369\nf 20568 14372 20572\nf 20573 20574 20575\nf 20570 20574 14375\nf 20576 20577 8374\nf 20573 20578 14379\nf 20579 20578 20580\nf 20576 20581 20580\nf 20582 14384 20579\nf 8449 8444 14387\nf 20583 8451 14385\nf 8455 8450 16446\nf 8453 14394 14392\nf 16426 8456 16447\nf 16449 16425 16448\nf 14418 14414 14419\nf 14437 16479 16484\nf 8487 14424 14421\nf 14446 20584 14434\nf 14432 14436 8486\nf 14461 14582 14443\nf 14445 14428 14442\nf 20585 20300 13947\nf 20585 16473 14448\nf 14450 14454 16450\nf 14456 16452 14457\nf 14462 14441 16453\nf 16475 14459 14451\nf 14464 20586 8492\nf 20586 20587 14427\nf 14470 20587 14469\nf 13520 20588 14468\nf 20178 14465 8070\nf 14472 20589 8495\nf 20588 14477 16454\nf 20589 20590 14439\nf 14479 20590 14475\nf 14476 20591 14474\nf 20592 14478 20593\nf 13522 8061 20593\nf 20591 14482 8508\nf 20303 20592 13963\nf 20594 14487 16457\nf 20594 8509 14485\nf 20595 14484 20596\nf 20595 20335 14488\nf 20357 20597 14490\nf 8333 20597 20596\nf 14492 14048 14489\nf 14494 13968 14496\nf 8341 14507 13995\nf 8038 20449 20598\nf 20599 14503 16460\nf 20600 16458 20598\nf 20599 20601 14508\nf 20602 20600 20453\nf 20602 20603 14513\nf 14514 14520 20329\nf 20604 20601 16461\nf 20604 20605 14515\nf 20606 20603 20458\nf 20606 20607 14518\nf 14519 20608 20321\nf 20609 20605 16462\nf 20609 20610 14521\nf 20611 20607 20464\nf 20611 20612 14524\nf 20608 14529 20613\nf 14530 20610 16463\nf 20614 20612 20470\nf 20614 20615 14527\nf 14535 14528 16464\nf 14533 20615 20476\nf 14534 8512 20316\nf 16466 20616 14536\nf 16465 14538 20617\nf 20616 20618 20619\nf 20617 20620 20618\nf 16468 8513 20619\nf 20621 20622 20620\nf 20623 16469 20622\nf 20624 20625 14542\nf 20621 16467 20625\nf 20626 20627 20628\nf 20623 20627 14546\nf 20629 20630 14548\nf 20624 20630 20628\nf 20631 20632 20633\nf 20626 20632 16471\nf 20634 20635 14551\nf 20629 20635 20633\nf 20636 20637 20638\nf 20631 20637 14555\nf 20639 20640 14557\nf 20634 20640 20638\nf 20641 20642 20643\nf 20636 20642 14561\nf 20644 20645 14563\nf 20639 20645 20643\nf 20646 20647 20648\nf 20641 20647 14567\nf 20649 20650 14569\nf 20644 20650 20648\nf 20651 20652 20653\nf 20646 20652 14573\nf 20649 14576 20653\nf 20654 20655 14580\nf 20651 20655 14578\nf 20654 8517 16476\nf 8520 20656 20657\nf 14589 20657 8519\nf 16478 14587 20656\nf 16480 20584 16477\nf 8523 14595 8522\nf 16483 20658 20659\nf 14593 20658 16481\nf 8526 20659 8525\nf 8532 14602 8528\nf 20660 20661 20662\nf 14600 20661 14606\nf 8534 14610 20662\nf 20663 14608 20660\nf 20663 14609 16486\nf 8579 14616 20664\nf 20665 13476 20666\nf 20665 20667 14620\nf 20668 14622 20669\nf 20670 20668 20664\nf 20670 14618 20671\nf 20672 20667 20673\nf 20672 20674 16488\nf 14621 14628 20675\nf 20676 20671 16489\nf 20676 20677 14623\nf 20678 20674 20679\nf 20678 20680 14626\nf 14627 14634 20681\nf 20682 20677 16490\nf 20682 20683 14629\nf 20684 20680 20685\nf 20684 20686 14632\nf 14633 14640 20687\nf 20688 20683 16491\nf 20688 20689 14635\nf 20690 20686 20691\nf 20690 20692 14638\nf 14639 14646 20693\nf 20694 20689 16492\nf 20694 20695 14641\nf 20696 20692 20697\nf 20696 20698 14644\nf 14645 14652 20699\nf 20700 20695 16493\nf 20700 20701 14647\nf 20702 20698 20703\nf 20702 20704 14650\nf 14651 14658 20705\nf 20706 20701 16494\nf 20706 20707 14653\nf 20708 20704 20709\nf 20708 20710 14656\nf 14657 14664 20711\nf 20712 20707 16495\nf 20712 20713 14659\nf 20714 20710 20715\nf 20714 20716 14662\nf 14663 14670 14883\nf 20717 20713 16496\nf 20717 20718 14665\nf 20719 20716 20720\nf 20719 20721 14668\nf 14669 14676 14889\nf 20722 20718 16497\nf 20722 20723 14671\nf 20724 20721 20725\nf 20724 20726 14674\nf 14675 14682 14895\nf 20727 20723 16498\nf 20727 20728 14677\nf 20729 20726 20730\nf 20729 20731 14680\nf 14681 20732 20733\nf 20734 20728 16499\nf 20734 20735 14683\nf 20736 20731 14798\nf 20736 20737 14686\nf 14687 14694 14905\nf 20738 20735 16500\nf 20738 20739 20740\nf 14695 20739 14691\nf 14697 16502 14692\nf 14693 20741 14699\nf 14703 8561 20741\nf 8566 14706 14710\nf 16507 14700 14707\nf 14716 7975 14718\nf 14721 14727 20666\nf 20742 14722 16508\nf 20250 14725 13859\nf 14726 14733 20673\nf 20743 20742 16510\nf 20743 20744 14728\nf 20745 8571 20253\nf 20745 20746 14731\nf 14732 14739 20679\nf 20747 20744 16511\nf 20747 20748 14734\nf 20749 20746 20257\nf 20749 20750 14737\nf 14738 14745 20685\nf 20751 20748 16512\nf 20751 20752 14740\nf 20753 20750 20262\nf 20753 20754 14743\nf 14744 14751 20691\nf 20755 20752 16513\nf 20755 20756 14746\nf 20757 20754 20266\nf 20757 20758 14749\nf 14750 14757 20697\nf 20759 20756 16514\nf 20759 20760 14752\nf 20761 20758 20271\nf 20761 20762 14755\nf 14756 14763 20703\nf 20763 20760 16515\nf 20763 20764 14758\nf 20765 20762 20274\nf 20765 20766 14761\nf 14762 14769 20709\nf 20767 20764 16516\nf 20767 20768 14764\nf 20769 14767 20770\nf 20769 20771 20772\nf 14768 14775 20715\nf 20773 20768 16517\nf 20773 20774 14770\nf 20775 14773 20772\nf 20775 20776 20777\nf 14774 14781 20720\nf 20778 20774 16518\nf 20778 20779 14776\nf 14779 20777 20288\nf 14780 14787 20725\nf 20780 20779 16520\nf 20780 20781 14782\nf 14786 14793 20730\nf 20782 20783 20784\nf 20785 20783 14788\nf 14792 20786 14799\nf 20787 14794 20782\nf 20787 16523 20788\nf 14797 16524 20296\nf 20789 14807 20790\nf 14803 20791 16525\nf 14805 14795 20298\nf 20792 20793 20794\nf 14810 14801 16526\nf 20795 14804 20299\nf 20795 20796 14813\nf 14814 20797 16529\nf 20798 14809 16527\nf 20798 16530 20793\nf 13589 20796 13587\nf 14825 8576 14823\nf 14824 14831 20373\nf 20799 20800 16532\nf 8035 20800 14826\nf 14830 14837 20380\nf 20801 20799 16533\nf 20801 20802 14832\nf 20803 14829 20669\nf 20803 20804 14835\nf 14836 14843 20386\nf 20805 20802 16534\nf 20805 20806 14838\nf 20807 20804 20675\nf 20807 20808 14841\nf 14842 14849 20392\nf 20809 20806 16535\nf 20809 20810 14844\nf 20811 20808 20681\nf 20811 20812 14847\nf 14848 14855 20398\nf 20813 20810 16536\nf 20813 20814 14850\nf 20815 20812 20687\nf 20815 20816 14853\nf 14854 14861 20404\nf 20817 20814 16537\nf 20817 20818 14856\nf 20819 20816 20693\nf 20819 20820 14859\nf 14860 14867 20410\nf 20821 20818 16538\nf 20821 20822 14862\nf 20823 20820 20699\nf 20823 20824 14865\nf 14866 14873 20416\nf 20825 20822 16539\nf 20825 20826 14868\nf 20827 20824 20705\nf 20827 20828 14871\nf 14872 14879 20422\nf 20829 20826 16540\nf 20829 20830 14874\nf 14877 20828 20711\nf 14878 14885 20428\nf 20831 20830 16541\nf 20831 20832 14880\nf 14884 14891 20431\nf 20833 20832 16542\nf 20833 20834 14886\nf 14890 14897 14148\nf 20835 20834 16543\nf 20835 20836 14892\nf 14896 14899 14155\nf 20837 20836 16545\nf 20837 20838 14898\nf 16546 20839 20840\nf 20733 20840 16544\nf 20841 20838 20839\nf 20841 20842 14900\nf 14903 8584 20842\nf 8588 8583 8586\nf 8590 8585 16547\nf 8595 8589 14909\nf 8597 16384 16549\nf 16390 8598 16550\nf 8602 16551 14916\n\nusemtl material_0\nf 6108 8808 8738\nf 20843 8975 8885\nf 6375 9100 9103\nf 6437 16889 9385\nf 9390 20844 6439\nf 7211 7216 20845\nf 11161 20845 7073\nf 7119 11158 11162\nf 7140 11173 20846\n\nusemtl material_1\nf 20847 20848 20849\nf 20847 20850 20851\nf 20852 20853 20854\nf 20855 20856 20857\nf 18135 20856 20851\nf 15423 20858 20859\nf 20848 20855 20858\nf 20860 20861 20862\nf 20863 18000 15448\nf 20864 20865 20866\nf 20867 20868 20869\nf 20870 17989 7292\nf 20865 17988 15491\nf 20871 20872 20873\nf 20871 20874 20875\nf 20872 18021 20876\nf 20877 20878 18020\nf 20878 20879 20880\nf 18035 20881 13525\nf 20882 20883 20884\nf 20885 18076 20886\nf 20887 18074 20888\nf 20889 10147 18062\nf 11494 20890 20891\nf 20892 20893 20894\nf 20895 20896 20897\nf 20898 20857 11523\nf 20899 18123 15508\nf 20900 18140 20901\nf 20902 18169 11528\nf 18008 20903 15459\nf 18048 18199 20904\nf 20905 20906 20907\nf 20908 20909 20910\nf 20911 20912 18244\nf 20913 20914 20915\nf 20916 11556 20917\nf 20916 20918 20919\n\nusemtl material_2\nf 18307 20920 20921\nf 20922 20923 20924\nf 20925 15428 20926\nf 20925 20927 20928\nf 20929 20930 20931\nf 20929 18343 20932\nf 20933 20930 20934\nf 18363 20935 13543\nf 20936 8100 20937\nf 20938 20939 20940\nf 20938 18390 20941\nf 15616 20942 20943\nf 20944 20945 7335\nf 20946 18321 20947\nf 20948 20949 8838\nf 11608 18575 20950\nf 18462 20951 20952\nf 20953 20954 20955\nf 20956 20957 20958\nf 20959 20960 20961\nf 20959 9271 20962\nf 18512 18524 20963\nf 18516 20964 7341\nf 20965 18526 20966\nf 20965 20967 15654\nf 20968 20969 18523\nf 18542 18527 20970\nf 20971 20972 20973\nf 20974 20975 18560\nf 15669 20976 18557\nf 20977 20978 20979\nf 15679 20980 15675\nf 18602 20981 20982\nf 20983 20984 18606\nf 18598 20985 20986\nf 20987 20988 20989\nf 20990 7347 20991\nf 20992 20993 20994\nf 7346 20993 20977\nf 11691 20995 7349\nf 20996 20997 18651\nf 18657 20998 13579\nf 20999 21000 21001\nf 21002 18669 18661\nf 7356 21003 7358\nf 21004 21003 15729\n\nusemtl material_3\nf 21005 21006 21007\nf 15907 21006 21008\nf 21009 18704 21010\nf 21011 21012 21013\nf 15762 15757 21014\nf 18750 12105 21015\nf 21016 21017 21018\nf 21019 7369 18780\nf 18793 11739 21020\nf 18791 21021 21022\nf 21023 21024 21025\nf 21026 21027 21028\nf 15793 15791 15798\nf 21029 21030 21031\nf 21032 18868 21033\nf 18870 21034 18860\nf 21035 11773 15814\nf 21035 18867 21036\nf 21037 21038 21039\nf 21040 11775 21041\nf 21042 21043 21044\nf 7377 21043 21045\nf 21046 21047 21048\nf 21046 7734 11781\nf 21049 21050 21051\nf 18907 21052 21053\nf 15831 21054 21055\nf 21056 21057 21058\nf 21056 21059 21060\nf 21061 18923 21062\nf 21063 21064 7399\nf 21065 19026 21066\nf 21067 21068 19047\nf 21067 21069 7406\nf 21070 19074 21071\nf 21072 21073 7411\n\nusemtl material_1\nf 21074 21075 21076\nf 15906 21077 21078\nf 15918 21079 21080\nf 20849 21079 7421\nf 21081 21082 21083\nf 21081 21084 7424\nf 21085 21086 7117\nf 21087 21088 21089\nf 19186 21090 21091\nf 21092 21093 21094\nf 21095 15934 21096\nf 21095 21097 21098\nf 7429 12788 21099\nf 21100 21101 11878\nf 21102 21103 19223\nf 21104 21105 15947\nf 21106 21107 21108\nf 21109 21110 21111\nf 21112 21113 21114\nf 21115 19265 21112\nf 21116 21117 21118\nf 21119 19289 21120\nf 21121 21122 21123\nf 21122 21124 21125\nf 7439 21126 11891\nf 19319 21126 21127\nf 19321 19337 21128\nf 7441 19181 15930\nf 21129 19343 21094\nf 21129 21130 7440\nf 19365 21131 7444\nf 15998 21131 21132\nf 21133 16006 21134\nf 21135 19382 21136\nf 21137 19394 21138\nf 21137 21139 21140\nf 21141 19415 21142\nf 21143 21144 19417\nf 21145 21144 21146\nf 21147 15965 21128\nf 21148 21149 19439\nf 21150 7451 21151\nf 21152 16034 21153\nf 21154 21155 19481\nf 11933 19485 21156\n\nusemtl material_4\nf 12221 7543 8021\nf 7708 12189 12184\nf 8020 13468 7537\nf 13630 13633 16283\nf 13647 13667 8202\n\nusemtl material_0\nf 8880 8971 20843\nf 14937 16625 6329\nf 8994 8997 9945\nf 9101 9094 6376\nf 10008 16738 15144\nf 21157 9396 9551\nf 21157 9384 9391\nf 9392 9394 20844\nf 9395 9387 9742\nf 9407 16891 9403\nf 9404 9411 9408\nf 9548 9550 6468\nf 9834 15100 17107\nf 17113 9843 17210\nf 17161 15124 17159\nf 9964 10107 17173\nf 17207 17216 10040\nf 10812 17235 15413\nf 21158 15254 21159\nf 21158 15326 17574\nf 10851 15422 17581\nf 7089 11212 7212\nf 7090 11159 7086\nf 20846 7113 7146\nf 7223 11244 10185\nf 11223 7192 11262\nf 11388 17856 15411\nf 21160 15421 11453\n\nusemtl material_1\nf 17941 21161 11459\nf 19110 21161 17918\nf 17926 11568 17924\nf 21162 21163 17935\nf 21164 21165 21166\nf 21167 21165 21168\nf 21169 17940 21170\nf 21171 17937 21172\nf 21171 21173 11466\nf 17916 21169 21174\nf 8632 21175 21176\nf 21177 21175 21178\nf 21179 21180 17942\nf 21181 21180 15438\nf 21182 21183 11468\nf 21184 21185 11471\nf 21186 21185 8090\nf 21187 15440 21188\nf 21184 21189 8474\nf 17976 21190 17974\nf 21191 21190 21192\nf 21193 21194 21195\nf 17982 21193 21196\nf 21197 21198 15447\nf 21199 21200 21201\nf 21202 21200 21203\nf 21204 21205 21206\nf 21207 17991 21208\nf 20860 21209 21210\nf 15490 18091 21211\nf 21212 21213 18005\nf 21214 21215 21216\nf 21217 21218 21219\nf 21220 21221 15470\nf 21222 21223 18019\nf 21216 21224 11489\nf 21225 15473 21226\nf 21227 21228 18085\nf 21229 21230 21224\nf 21231 21232 21233\nf 18038 20882 11493\nf 15484 21234 21235\nf 10082 21236 21237\nf 15480 21238 18010\nf 21239 18066 21240\nf 21241 21242 15483\nf 21241 21243 18070\nf 18068 21244 21245\nf 21246 21247 18064\nf 18120 21248 21240\nf 21249 21248 11503\nf 18082 18089 21250\nf 21251 18045 18041\nf 21252 18046 21253\nf 21254 15463 20892\nf 21255 21256 7300\nf 18097 20874 11507\nf 21257 20894 21258\nf 21255 20906 21259\nf 11513 15584 21260\nf 18300 18107 21261\nf 21262 15502 21261\nf 21263 15501 11517\nf 18113 11518 21264\nf 21265 18112 21264\nf 21266 21267 21268\nf 20889 21267 18116\nf 20888 21269 11520\nf 21270 21271 21272\nf 21273 21271 18128\nf 21272 18136 15509\nf 21274 21275 18137\nf 21276 18143 21277\nf 21278 15517 21279\nf 21280 21281 21282\nf 21283 21277 21284\nf 21283 21285 7304\nf 21286 21285 21287\nf 21288 21289 18167\nf 21290 21291 18159\nf 21292 15522 18177\nf 21293 21294 21295\nf 21296 21297 15527\nf 15533 21298 11536\nf 21299 21300 15537\nf 15536 15538 18194\nf 18201 21301 21302\nf 21300 21303 18205\nf 21304 20904 21305\nf 18204 21306 15542\nf 11540 21306 18009\nf 18206 21307 18013\nf 15545 21308 18211\nf 18218 20905 21309\nf 21310 21311 18223\nf 21312 21313 21314\nf 15548 15556 15546\nf 21315 21309 21316\nf 21317 21318 21319\nf 21317 18228 21320\nf 21321 21322 21323\nf 21324 21325 21326\nf 21327 18234 11546\nf 21328 21329 21330\nf 21331 15557 21332\nf 15554 15553 21333\nf 21334 21335 21336\nf 21337 21331 21338\nf 18241 21335 21339\nf 21340 21336 21341\nf 21337 21342 21343\nf 18238 21344 21345\nf 21346 21344 21347\nf 21348 21349 21343\nf 21348 21350 11552\nf 21351 21352 21353\nf 21350 21352 21354\nf 21355 21356 21357\nf 21358 21356 21359\nf 21351 15559 21360\nf 21361 21362 21363\nf 21361 21364 21365\nf 21355 18251 21366\nf 21360 21367 21368\nf 21369 21370 18261\nf 15565 18259 21371\nf 21372 21373 21374\nf 21372 18258 21375\nf 21376 18274 21377\nf 21378 21379 21380\nf 21381 21379 21382\nf 18277 11557 21383\nf 21384 21385 21386\nf 21387 21385 21388\nf 18286 15575 21389\nf 18293 21390 15570\nf 20917 21391 21392\nf 21393 18295 21394\nf 21395 20918 21396\nf 21395 15581 21397\nf 15577 18299 21263\n\nusemtl material_2\nf 21398 21399 11560\nf 21400 21401 21402\nf 21403 21404 21405\nf 11564 21406 21407\nf 21408 18318 21409\nf 21410 21411 21412\nf 21413 21414 21415\nf 21416 21406 21417\nf 21416 18320 21418\nf 21419 18341 11569\nf 21419 11461 21420\nf 15598 21421 18329\nf 18355 21422 21423\nf 21424 15594 21425\nf 18350 15597 20934\nf 18361 21424 21423\nf 18370 21426 11572\nf 21427 20933 21426\nf 21428 21429 21430\nf 21431 18369 18380\nf 18383 21432 21433\nf 21434 15613 15611\nf 21435 21436 18402\nf 18403 21436 21437\nf 18401 21438 15602\nf 18397 18393 18384\nf 21439 21440 21441\nf 21434 21440 11588\nf 21442 21443 21444\nf 21445 21446 15617\nf 21447 21448 21449\nf 21447 21450 18413\nf 18423 21451 21411\nf 21452 21453 21454\nf 18421 21455 11601\nf 11600 21456 21457\nf 21458 21459 11604\nf 21460 21459 15625\nf 11605 21461 11603\nf 20946 21461 21462\nf 21463 21464 21465\nf 21465 18323 21462\nf 20944 11610 15627\nf 21466 21467 21468\nf 18436 21467 11612\nf 15629 21469 21470\nf 21471 21472 21450\nf 21471 21473 15632\nf 21474 21475 21476\nf 21474 15631 11620\nf 18451 21477 21478\nf 21479 21475 21480\nf 21481 11623 21482\nf 21483 21484 18483\nf 21482 21485 21486\nf 21487 15637 21488\nf 21489 21490 21491\nf 21485 18476 21492\nf 21493 18473 21492\nf 21491 21494 18494\nf 21495 21493 21496\nf 21497 15642 15640\nf 11635 18496 8127\nf 21498 21499 21500\nf 21498 21501 18511\nf 11641 18517 21502\nf 21503 21504 11643\nf 21503 18507 21500\nf 21505 18518 21504\nf 21506 11640 21507\nf 18519 21508 21509\nf 21510 20968 11646\nf 21511 21512 21513\nf 21514 21515 21516\nf 21517 15656 21514\nf 21517 21518 20970\nf 21519 21520 11651\nf 21519 11653 15661\nf 18538 21521 21522\nf 21523 11661 21524\nf 11663 20973 18565\nf 21525 15666 21526\nf 21527 21528 21529\nf 18573 21528 11669\nf 15707 18567 20978\nf 21530 18441 21531\nf 18585 21532 21533\nf 11673 21534 21535\nf 21536 21535 21537\nf 21538 21539 21540\nf 15692 21541 21542\nf 18616 21543 21544\nf 18609 21545 11683\nf 21546 21547 18607\nf 11688 21548 21549\nf 21550 21548 20982\nf 21551 21552 18599\nf 21553 21554 15700\nf 21553 21551 21555\nf 20987 21549 21556\nf 21557 21558 21559\nf 21560 21558 18615\nf 21554 21561 21562\nf 21563 21561 21564\nf 21559 21565 21566\nf 21567 21568 18625\nf 18632 21569 11692\nf 11694 21570 21571\nf 21572 18627 21573\nf 18630 21574 18631\nf 7348 21575 18633\nf 7350 21576 21577\nf 21578 18639 18635\nf 21579 18654 21580\nf 21581 18656 15713\nf 18664 6159 18650\nf 18645 15716 15721\nf 21582 21583 21584\nf 21585 21586 21587\nf 21588 21589 21590\nf 21586 21591 21592\nf 21593 21594 15722\nf 21595 21596 21597\nf 21595 15725 21598\nf 21599 11702 21600\nf 21601 21602 18688\nf 11708 18684 21603\nf 21604 21605 21606\nf 21607 21605 18689\nf 18687 21608 21609\nf 21610 21611 21612\n\nusemtl material_3\nf 21613 21614 21615\nf 21616 21617 21618\nf 21619 18710 21615\nf 21620 21621 18717\nf 18721 21622 18703\nf 18746 21623 11713\nf 18709 21623 21624\nf 18734 21621 18725\nf 18732 18735 21625\nf 21012 21626 21627\nf 18736 21628 18747\nf 21629 21630 21014\nf 21631 21632 21633\nf 18743 15752 21634\nf 18753 21635 21630\nf 21636 18764 18763\nf 18740 7365 21637\nf 21638 18759 21639\nf 21640 21018 21641\nf 21642 18786 21643\nf 21642 21644 21645\nf 18778 21646 21647\nf 21646 18783 21648\nf 15777 21649 21650\nf 21651 11729 21652\nf 21653 15773 13625\nf 21654 21655 18792\nf 21656 21657 18806\nf 21024 11758 21658\nf 21659 12091 7372\nf 18815 7373 7676\nf 18812 21660 21661\nf 21662 21660 21663\nf 11749 21664 18820\nf 15797 21665 21666\nf 21667 21668 21669\nf 21670 21671 18829\nf 21672 21673 21674\nf 18826 21673 11752\nf 21675 21676 21677\nf 21675 18840 11750\nf 21678 21679 21680\nf 21677 21681 21682\nf 21683 15805 21684\nf 21685 21686 15875\nf 21685 21687 18843\nf 21688 21689 21690\nf 21691 21690 10222\nf 15807 18852 21692\nf 11742 21693 21694\nf 11740 18854 11763\nf 21032 21695 21696\nf 21697 18864 21698\nf 21699 18855 21700\nf 15813 21701 21033\nf 18872 21702 21703\nf 21704 21699 21705\nf 21704 21706 18861\nf 21707 21708 21709\nf 21710 18895 21711\nf 21710 21712 21713\nf 21714 21715 11776\nf 18901 21716 21717\nf 18878 21716 21718\nf 21719 21720 18893\nf 11783 18887 21721\nf 21050 21722 21723\nf 21724 21725 21049\nf 21726 21052 21727\nf 21728 18911 21729\nf 21730 21731 21732\nf 11791 21733 21731\nf 21734 21735 21059\nf 21054 21734 11794\nf 21736 21737 21738\nf 21739 21740 21741\nf 21739 21742 21743\nf 21744 21745 11803\nf 18948 21746 21747\nf 21748 15840 21749\nf 15835 21750 21749\nf 21751 21752 21753\nf 21754 21755 21756\nf 18965 21757 15839\nf 21758 21759 21760\nf 21761 15849 18968\nf 21762 21763 21764\nf 21765 21766 21767\nf 18976 7395 21768\nf 21769 18989 21770\nf 21771 7397 18993\nf 21772 21773 21770\nf 21772 21063 11815\nf 18995 21774 21775\nf 21776 15865 11819\nf 19016 21777 21778\nf 21779 18957 18962\nf 21780 21781 21782\nf 19025 11822 21783\nf 15872 21784 21065\nf 21785 15880 21066\nf 11830 21786 11826\nf 21787 19037 21788\nf 19040 21789 21790\nf 21068 21791 19049\nf 19068 19057 19067\nf 21792 21793 21794\nf 21792 19078 21795\nf 21796 21072 21797\nf 19070 21798 15902\nf 21799 21800 21801\nf 21802 19084 21803\nf 21804 19076 11833\nf 21804 21799 21805\nf 21801 15846 19093\nf 21806 21807 21808\n\nusemtl material_1\nf 19098 19100 21809\nf 21810 21811 11841\nf 21616 21811 21809\nf 21812 19099 21813\nf 21814 21815 19097\nf 21816 19101 21817\nf 21818 19111 21819\nf 21820 19113 21818\nf 19114 19115 11846\nf 21821 19123 11853\nf 19118 19134 7482\nf 11849 21822 21823\nf 21824 21825 21826\nf 7427 21827 19144\nf 21828 21829 21830\nf 21831 21832 21812\nf 21833 21834 21835\nf 21833 21836 21831\nf 21837 7417 21838\nf 19163 21839 21840\nf 21841 21839 21842\nf 21843 21844 21845\nf 21846 21847 19172\nf 21848 21849 21850\nf 21851 21852 19183\nf 21853 21852 15925\nf 21854 19185 21855\nf 21856 19233 21857\nf 19197 21858 21859\nf 19199 19208 21860\nf 21861 21862 21863\nf 15941 21864 21865\nf 21866 21867 15939\nf 21868 19216 21869\nf 21870 19206 21871\nf 21872 19207 11875\nf 21873 15942 21874\nf 21875 19149 21825\nf 21876 21877 19230\nf 19245 21878 21879\nf 21880 21881 21882\nf 21880 21883 21884\nf 21885 21886 21887\nf 21888 15951 21889\nf 19247 21888 21890\nf 21891 21892 21893\nf 21894 21885 21895\nf 21894 21896 21897\nf 21113 7435 21898\nf 21899 21900 21901\nf 19262 21896 19256\nf 21902 21903 21904\nf 21905 21906 21907\nf 21908 21906 21110\nf 21909 21910 21911\nf 21912 19278 21913\nf 21914 19258 21915\nf 21914 19268 21916\nf 15956 21908 21917\nf 21918 21919 19282\nf 21918 21920 19274\nf 21921 15957 21922\nf 21923 21924 21925\nf 21923 21926 21116\nf 21927 19281 21928\nf 21929 21930 21931\nf 11884 21932 19292\nf 21121 19314 21933\nf 21934 21935 21936\nf 19315 21937 21938\nf 21939 21940 21941\nf 19302 15971 21942\nf 19316 21943 11894\nf 21943 21944 19329\nf 19324 19309 11893\nf 21945 19335 21946\nf 16021 15975 21947\nf 21948 21949 21950\nf 21948 21951 19342\nf 19348 21854 21952\nf 19346 21953 21954\nf 21955 21956 11899\nf 21955 15929 21957\nf 21958 21959 21960\nf 21958 19367 19354\nf 21961 21962 19364\nf 15985 21963 21964\nf 15995 21965 21966\nf 21967 21968 19373\nf 21969 21970 11901\nf 21971 19370 21968\nf 21972 21967 21966\nf 19389 21973 21974\nf 21975 16004 21976\nf 21977 16005 19384\nf 21978 21979 21149\nf 21980 16017 21981\nf 21982 11913 21143\nf 19411 21983 19412\nf 21984 19420 21985\nf 11912 16020 21986\nf 21987 21988 21989\nf 21990 21991 11914\nf 21992 21990 19424\nf 11895 21993 21994\nf 19422 21993 19328\nf 21995 19392 21996\nf 11918 19393 21997\nf 16030 21998 21999\nf 22000 19447 22001\nf 22002 16012 19443\nf 22003 21998 22004\nf 22005 11921 22006\nf 22007 22008 19488\nf 22009 11929 11911\nf 22010 22011 22012\nf 19413 22013 22014\nf 22015 22013 16048\nf 19487 19459 19475\nf 22016 22015 22017\nf 22018 22019 19477\nf 22020 19491 19480\nf 22021 16051 19470\nf 19483 22022 19451\nf 11932 22022 22023\nf 22024 16040 22025\nf 22020 22026 19493\n\nusemtl material_4\nf 7516 19695 22027\nf 22028 12061 22029\nf 22028 22030 12057\nf 22030 22031 12055\nf 12062 12056 7555\nf 12181 12183 12289\nf 12182 12150 7710\nf 12369 19598 16095\nf 19611 22032 12386\nf 20099 22032 16097\nf 20049 20044 22033\nf 13294 20089 13290\nf 13233 7999 16239\nf 8485 20179 14420\nf 13629 13638 13641\nf 13631 13640 22034\nf 22035 8191 20220\nf 13660 13662 8199\nf 8201 13646 20181\nf 20197 20232 20198\nf 13893 16314 20222\nf 16318 16316 20227\nf 22036 20776 20282\nf 20582 8445 20583\nf 16521 16519 20290\n\nusemtl material_0\nf 8953 16617 14935\nf 14940 8964 16582\nf 15151 22037 17218\nf 10288 6861 6859\nf 21159 17575 11071\n\nusemtl material_1\nf 22038 15425 21082\nf 22039 22040 22041\nf 7322 22042 22043\nf 15434 22042 15430\nf 22044 22045 15429\nf 22044 11463 22046\nf 21181 22046 22047\nf 15435 22048 22049\nf 22050 22051 18126\nf 22052 22051 22053\nf 22054 20859 20898\nf 22054 18130 22052\nf 15426 22050 22055\nf 22053 22038 15424\nf 11458 15427 22039\nf 22045 15437 22048\nf 17969 21195 11474\nf 22056 22057 17965\nf 22056 17958 21194\nf 22058 22059 22060\nf 22061 22062 22063\nf 22064 22065 22066\nf 22064 20863 22067\nf 11480 21202 22068\nf 22069 22066 11478\nf 21207 21209 15446\nf 15456 22070 22071\nf 22072 22073 21211\nf 22073 22074 20866\nf 22075 22076 22077\nf 22075 15455 22078\nf 21205 22070 22079\nf 17986 22074 22080\nf 22069 22076 17998\nf 22081 15453 22082\nf 18003 22083 20180\nf 22084 22085 22086\nf 22087 22088 22071\nf 22087 21204 22072\nf 15461 7296 21214\nf 11488 22089 22090\nf 22091 15462 22090\nf 18095 22092 22093\nf 15468 22092 22094\nf 22095 22096 20876\nf 22093 18023 22097\nf 21225 15465 22096\nf 22098 18025 15476\nf 15474 22099 18036\nf 15475 22100 22101\nf 22102 21234 15477\nf 18044 18083 18040\nf 22103 22104 18011\nf 22105 22106 18014\nf 15479 22106 15481\nf 11500 21238 21242\nf 18069 22107 11498\nf 22108 22107 22109\nf 18087 22100 15486\nf 22110 22111 20891\nf 21251 21250 7299\nf 22112 22085 18088\nf 11508 22113 21256\nf 7301 21219 18101\nf 21259 22114 11510\nf 22115 21260 15499\nf 22116 15503 22117\nf 21244 21247 21262\nf 21274 21273 15512\nf 22118 18131 11522\nf 15520 22119 18145\nf 22120 15519 22118\nf 22121 22122 22119\nf 18146 18162 22123\nf 21286 22124 15523\nf 22125 22124 22126\nf 18164 22127 18170\nf 7306 22127 22128\nf 21294 21290 22129\nf 18181 15530 22130\nf 22131 21296 11960\nf 22131 22132 21299\nf 22133 22134 22135\nf 18198 15544 7316\nf 22135 15541 21301\nf 18192 11539 22136\nf 22137 20903 21304\nf 22137 22138 22139\nf 22140 18049 15460\nf 22104 22141 15540\nf 21302 22141 18050\nf 22142 22114 18217\nf 20907 22143 21311\nf 22144 22145 22146\nf 22147 22148 21308\nf 22149 18226 21314\nf 22150 22151 22152\nf 22150 22146 22147\nf 22153 21316 21310\nf 22154 22151 15547\nf 22154 15555 22155\nf 15551 15550 21322\nf 22156 22157 22158\nf 21349 22159 15558\nf 22160 11551 22161\nf 11550 11555 22162\nf 20908 21353 21342\nf 22163 21368 22164\nf 18262 22165 22166\nf 15566 18267 22167\nf 18282 22168 18270\nf 22169 21381 18272\nf 21387 22168 18284\nf 21380 22170 15569\nf 18292 15571 21390\nf 22171 22172 20919\nf 21396 22173 22174\nf 15583 22173 21392\nf 15579 18290 22175\nf 21393 18298 22175\nf 22176 22177 22178\n\nusemtl material_2\nf 22179 22180 22181\nf 22182 22180 22183\nf 22184 7317 22185\nf 18309 22186 22185\nf 22187 11562 22188\nf 20924 22189 22190\nf 22191 22189 22192\nf 11563 22191 22193\nf 18311 18312 22194\nf 18330 18340 22195\nf 22196 22197 15592\nf 20852 22197 7324\nf 22198 22199 22195\nf 7321 15590 20926\nf 20928 22198 21420\nf 18347 20927 15589\nf 22200 18354 15595\nf 22201 18328 22202\nf 18362 18374 7325\nf 22203 18352 22204\nf 15608 22205 22206\nf 22207 22208 22209\nf 22207 6194 18368\nf 22210 18371 22205\nf 11576 22211 15601\nf 22212 22211 7327\nf 18378 11580 15609\nf 15610 15605 22213\nf 22214 22215 22216\nf 15619 22215 15614\nf 11590 15618 21446\nf 22217 21439 20940\nf 22217 15615 11586\nf 11589 11615 22218\nf 18454 21470 20943\nf 21445 21469 11616\nf 22219 20948 18435\nf 20945 22220 22221\nf 21414 21458 22222\nf 22223 22224 22225\nf 22223 15623 21413\nf 18427 22226 22227\nf 11609 22228 21456\nf 22229 22230 22231\nf 18445 18433 22231\nf 22232 22233 22234\nf 18442 22233 20950\nf 22235 22236 21477\nf 22235 22237 15635\nf 22238 22239 8109\nf 22240 18459 22241\nf 22242 21481 21480\nf 22243 22244 7339\nf 11619 22244 22242\nf 11628 22245 22246\nf 22247 11630 15638\nf 20958 21495 15648\nf 22248 11633 22249\nf 18491 18503 22250\nf 22250 22251 22248\nf 21497 22251 22252\nf 18508 15645 15643\nf 15650 22253 22254\nf 18510 22255 18515\nf 15653 18520 22256\nf 15655 22257 7340\nf 20964 22258 22259\nf 22260 22261 22258\nf 22255 22262 22260\nf 22261 18522 15659\nf 18530 22259 22263\nf 22264 22265 15662\nf 15660 21508 21512\nf 18537 22266 22267\nf 22268 22269 22270\nf 22268 21516 22271\nf 22272 22273 8618\nf 18555 22274 18558\nf 21521 15663 22275\nf 22276 22277 22278\nf 22279 22277 15667\nf 18548 22280 21524\nf 22281 22282 22283\nf 11667 15664 22278\nf 15668 22284 20979\nf 22284 21529 20991\nf 15672 22279 18569\nf 18444 22285 22286\nf 22287 22285 22288\nf 22288 22289 15676\nf 22290 18578 22289\nf 15678 22291 15674\nf 22292 22293 15681\nf 22292 15685 22294\nf 18590 22295 22296\nf 22297 21541 15686\nf 22297 15680 22298\nf 22291 18591 22298\nf 15688 18594 22299\nf 22300 11674 22301\nf 18596 22302 18593\nf 21542 22302 21562\nf 22303 11684 15736\nf 22304 18613 11685\nf 22304 21611 15699\nf 22305 21555 20986\nf 22306 22307 15706\nf 22306 22308 6552\nf 18623 22309 22310\nf 22311 22312 20995\nf 22311 21568 15712\nf 15711 22313 18634\nf 22312 18636 22314\nf 18643 21575 22315\nf 22316 22317 22318\nf 18626 22319 15715\nf 22320 22321 21577\nf 22320 22322 15717\nf 22323 22324 11695\nf 22323 15719 22325\nf 22326 15718 22327\nf 15723 21585 22328\nf 22329 22330 22331\nf 22332 22330 15724\nf 18666 22333 18677\nf 18678 21606 18683\nf 18692 22334 18679\nf 22335 22334 22336\nf 18681 15733 15731\nf 18696 15734 21607\nf 21546 21608 15737\n\nusemtl material_3\nf 18716 22337 15739\nf 22338 22339 22340\nf 22338 22341 15740\nf 22342 22343 22344\nf 22345 22346 22347\nf 21010 20921 22348\nf 22339 22349 22350\nf 18718 22351 22352\nf 22350 22353 22354\nf 22355 15742 22352\nf 22355 15746 22349\nf 21009 18723 22356\nf 22357 22358 22359\nf 22360 22361 21013\nf 22362 22363 21629\nf 22362 22353 15748\nf 22364 11722 22365\nf 22363 22366 22367\nf 15761 18789 22368\nf 22369 22370 22371\nf 22369 22372 18756\nf 22373 22374 22375\nf 22376 22377 18762\nf 15770 18755 21663\nf 22378 8168 15775\nf 22379 22380 22381\nf 15774 22380 7370\nf 22382 22383 22384\nf 18784 22385 21016\nf 18777 22385 18779\nf 11732 22386 22387\nf 22388 22384 21647\nf 22389 22386 15782\nf 18782 22390 13616\nf 22391 21633 22389\nf 22392 22393 18722\nf 22394 22393 22388\nf 22395 22396 22397\nf 22398 22399 22397\nf 21652 18796 21664\nf 22400 18817 22401\nf 22400 22381 22402\nf 22398 21022 22403\nf 22404 22405 15784\nf 18810 21638 22406\nf 22407 22408 22409\nf 22410 21020 15787\nf 18828 22403 22411\nf 22412 15790 18822\nf 22413 22414 22034\nf 22415 22416 22417\nf 22418 22419 15794\nf 21029 22412 15796\nf 22416 22419 18832\nf 22420 22418 22421\nf 22422 15799 21031\nf 22421 15800 18835\nf 15804 18836 22423\nf 22424 15801 22425\nf 22426 22427 15806\nf 22428 22429 22430\nf 22428 22431 18853\nf 22432 15811 22433\nf 22434 15808 21695\nf 22434 21701 11769\nf 11768 15818 15810\nf 22435 11767 22436\nf 22437 22438 22435\nf 22439 15816 22438\nf 22439 22440 18885\nf 22441 11772 21039\nf 18880 22437 21038\nf 22442 22443 21041\nf 22444 22445 7573\nf 21713 22446 22447\nf 22448 22449 22450\nf 15821 22449 21718\nf 21722 18899 21044\nf 11780 21727 18891\nf 22451 11787 22452\nf 22453 22454 22455\nf 22456 22457 15827\nf 18916 22457 22458\nf 22459 22460 22461\nf 21737 22460 22462\nf 22463 22462 18913\nf 22464 22465 22466\nf 22465 21741 18930\nf 22467 22468 11793\nf 22467 21742 21738\nf 22469 22470 11801\nf 22471 22470 22472\nf 22473 22474 15833\nf 22475 18928 18931\nf 15834 21748 22476\nf 18954 22477 17247\nf 22478 22479 22480\nf 22478 18933 21750\nf 18949 18963 21752\nf 22481 22479 15837\nf 22482 15836 21757\nf 22483 18958 22484\nf 21807 22485 15847\nf 22486 22487 19096\nf 22486 22488 22485\nf 21761 22489 18977\nf 7394 21767 22490\nf 16576 18980 11814\nf 21763 19095 15852\nf 7396 21764 18991\nf 22491 18984 22492\nf 19001 11820 18998\nf 15882 19023 15873\nf 18850 15871 22493\nf 19032 6098 11756\nf 21784 11823 22494\nf 22495 15881 19039\nf 22495 22496 22497\nf 22498 15897 11828\nf 19044 19059 21787\nf 22499 22500 19064\nf 19056 22500 19035\nf 22501 15891 15899\nf 21798 22502 15901\nf 22503 19087 22504\nf 22505 15900 21797\nf 22505 22506 15903\nf 19081 19083 22504\nf 15851 19079 19086\n\nusemtl material_1\nf 22507 22508 22509\nf 22507 22510 22341\nf 22511 22512 22513\nf 19104 22514 22515\nf 19164 22516 21077\nf 22509 22517 22515\nf 22518 22519 22514\nf 15908 22520 22521\nf 22522 19131 22523\nf 22522 22524 15910\nf 7422 19121 21080\nf 22524 21083 15915\nf 11847 22525 19129\nf 15919 19120 21821\nf 22526 22527 22528\nf 22526 19229 22529\nf 22530 22531 22532\nf 21823 21104 7425\nf 22533 22532 22534\nf 21828 15922 19125\nf 22534 22535 22536\nf 22537 22538 7414\nf 11860 22539 22540\nf 22541 22539 22542\nf 22543 22544 22545\nf 22543 21843 22546\nf 22547 22548 22549\nf 22547 21848 22550\nf 19174 19188 15927\nf 22551 22552 19240\nf 22552 19194 22553\nf 22554 19202 22555\nf 22556 22557 15935\nf 15931 22558 19201\nf 22559 22560 19204\nf 22561 15938 22562\nf 22560 11869 19220\nf 22563 21873 22564\nf 22563 22565 11868\nf 19227 22564 22566\nf 22567 21867 22568\nf 22567 15943 21874\nf 15946 22569 22570\nf 22530 22571 22572\nf 19228 22571 19150\nf 7656 19189 22573\nf 21882 22574 21106\nf 22575 22576 22577\nf 22578 22579 15950\nf 15948 21856 22580\nf 22581 22582 22583\nf 15952 22584 22582\nf 22583 22585 22586\nf 22587 22588 22589\nf 22587 22590 22591\nf 21900 22588 19248\nf 21109 21899 7434\nf 22592 22593 11879\nf 22594 22595 22596\nf 22597 22595 22598\nf 22599 21905 15954\nf 22600 22601 22602\nf 22600 21907 22603\nf 22601 21925 11888\nf 11889 19295 22604\nf 21934 22605 22606\nf 22607 19298 22608\nf 19304 22609 22610\nf 21939 11890 22611\nf 19313 15962 22611\nf 21938 22612 22613\nf 22614 22612 21942\nf 15976 22615 21945\nf 22615 19311 19317\nf 15968 22616 19427\nf 22617 22616 15974\nf 22618 19187 22619\nf 22618 15928 21853\nf 22620 22621 21957\nf 22620 22619 15982\nf 15980 15977 19347\nf 19358 22622 15994\nf 16002 21964 21970\nf 16000 22623 22624\nf 22625 22626 16001\nf 22625 22627 21965\nf 21976 21971 22628\nf 19374 21977 22629\nf 22630 10077 22629\nf 22631 22632 11907\nf 19381 22633 21134\nf 16007 19391 22634\nf 22635 22636 22637\nf 22638 22636 16011\nf 22639 16010 16008\nf 22640 19435 22641\nf 22642 22643 19441\nf 16013 22643 22638\nf 22644 22645 19408\nf 7637 21980 22646\nf 22647 22648 16019\nf 22647 19406 22649\nf 7448 21987 21985\nf 21986 16022 21146\nf 22617 22650 22651\nf 22648 22650 16023\nf 21145 22652 16025\nf 21946 22652 21947\nf 16029 19432 7464\nf 22653 22654 19446\nf 21997 22653 22655\nf 22656 22657 16031\nf 22658 22657 19440\nf 19444 22659 16037\nf 16041 22659 22660\nf 22661 16038 22024\nf 22661 11936 22662\nf 21981 22663 16043\nf 22664 21983 22665\nf 22664 22666 16049\nf 22666 16046 22667\nf 22017 22668 22669\nf 19478 22668 16050\nf 19474 16053 22670\nf 22671 22672 6760\nf 22671 22673 16056\nf 22674 22675 11935\nf 22675 19484 22676\n\nusemtl material_4\nf 7728 7574 7730\nf 16080 12261 19542\nf 16094 12371 19602\nf 12385 19612 16100\nf 16248 13296 20092\nf 16347 20326 13992\nf 16440 8358 14354\nf 14381 8446 20581\nf 16395 20444 20443\n\nusemtl material_0\nf 8671 9092 16683\nf 16735 9184 14988\nf 16999 16996 8672\nf 17044 9771 17127\nf 17092 17091 9820\nf 17169 17100 9835\nf 9841 17115 17171\nf 15103 17109 9844\nf 17126 9885 17128\nf 17111 9946 17105\nf 17263 17257 15173\nf 17273 15192 15180\nf 17296 11444 22677\nf 22677 17912 15193\nf 17345 10676 17343\nf 17344 10392 17471\nf 17400 22678 17381\nf 15220 10517 22678\nf 17419 10399 17347\nf 17234 17894 17892\nf 17573 17572 17560\nf 17674 10088 17671\nf 22679 22680 17675\nf 22679 15285 17633\nf 22680 17635 10950\nf 17889 15387 17857\nf 11449 17583 21160\n\nusemtl material_1\nf 22681 17939 22041\nf 22682 11455 22683\nf 22683 22684 6694\nf 22685 22686 17920\nf 17932 22687 17921\nf 22687 17930 18337\nf 17923 22688 15431\nf 22686 8776 17929\nf 22689 17933 21162\nf 15432 17943 22047\nf 17947 22688 21166\nf 22690 11465 6604\nf 22690 22691 17938\nf 22692 18127 22693\nf 22694 22695 22696\nf 11464 22697 11189\nf 18122 21173 22698\nf 22693 22040 22055\nf 17936 22699 21174\nf 22700 22691 6699\nf 22700 22684 22701\nf 22701 11457 22699\nf 17934 21176 21168\nf 21167 22702 17948\nf 17946 15443 17944\nf 11472 22703 21183\nf 22704 15439 17951\nf 22705 17955 17953\nf 21188 22702 21177\nf 22705 22049 22704\nf 17950 17967 17956\nf 17959 17949 21179\nf 17962 17954 17977\nf 17957 22060 17978\nf 21178 17971 22706\nf 21187 22707 17970\nf 22708 21189 17964\nf 22709 17963 22710\nf 22709 20861 22711\nf 17966 22063 22058\nf 17968 22712 22713\nf 8639 17979 17972\nf 22714 22715 14405\nf 22714 22708 22716\nf 21197 20862 17975\nf 22716 22711 7289\nf 21201 22717 22718\nf 15445 8479 22715\nf 22061 22717 11479\nf 21199 17983 15450\nf 15451 22719 22720\nf 22721 22722 22723\nf 22723 22724 22720\nf 22068 22079 22077\nf 22725 22726 8648\nf 22727 22726 20870\nf 20869 22728 22078\nf 17999 22728 17992\nf 22729 17994 22730\nf 22731 8645 22727\nf 22732 7293 20864\nf 22732 17985 22733\nf 18004 17996 21208\nf 22734 11482 13532\nf 15444 22735 13463\nf 22734 22735 17997\nf 22724 17993 22733\nf 21203 22080 21206\nf 17995 7290 21210\nf 15457 22736 22084\nf 22737 20868 22738\nf 21213 15452 18002\nf 11481 18001 13536\nf 17990 22737 21212\nf 22739 21236 22740\nf 22741 22742 7499\nf 22743 22742 22744\nf 8016 22745 11484\nf 18096 22746 22747\nf 22748 22749 18022\nf 22113 20873 22750\nf 11487 11491 9114\nf 22751 22752 18017\nf 22751 21220 21215\nf 22746 22753 22754\nf 22755 22756 13519\nf 22755 18026 20877\nf 11490 21230 21231\nf 15469 22757 21229\nf 21222 22754 18032\nf 21223 21227 21221\nf 22758 22753 22097\nf 22099 22095 20880\nf 15467 22759 18024\nf 22102 22759 21226\nf 20881 18027 13526\nf 20879 22760 18037\nf 22761 22760 18028\nf 22762 18033 22758\nf 22762 22098 22763\nf 18031 18042 21228\nf 20883 22761 18034\nf 22764 21232 22765\nf 18047 22766 18030\nf 22757 22766 22765\nf 22763 22767 18043\nf 22768 22767 22101\nf 11492 21235 15472\nf 15488 8067 22769\nf 22770 22771 22772\nf 11499 22773 22103\nf 18054 22773 22774\nf 22775 22776 22741\nf 22777 22778 22776\nf 22777 22779 22105\nf 21237 18053 22780\nf 18061 10149 22780\nf 18057 21249 18052\nf 22781 21239 18056\nf 15458 22782 22781\nf 18058 22783 11975\nf 22784 22785 22783\nf 20886 22786 15482\nf 22784 20885 22779\nf 22787 18065 18067\nf 18072 22788 18077\nf 18073 21243 22789\nf 11504 18059 11974\nf 22789 22786 20887\nf 22790 22109 22791\nf 22790 22117 21246\nf 11501 22792 21268\nf 21245 18109 18118\nf 22771 22725 22793\nf 22770 22794 17987\nf 7298 22794 21253\nf 22795 22796 18086\nf 22768 22796 18084\nf 22112 15485 22111\nf 22797 22798 20884\nf 22799 22088 18090\nf 22799 22795 22736\nf 22798 22081 20890\nf 22110 22800 22801\nf 18094 22802 22803\nf 18015 22747 18018\nf 18016 15493 22804\nf 22805 21218 22094\nf 15497 22752 7295\nf 7294 21254 18208\nf 18099 22806 11486\nf 22807 22805 22803\nf 18100 22808 22809\nf 22145 22810 22811\nf 22812 22813 22811\nf 22814 22091 6041\nf 22814 22815 20893\nf 22806 22816 8057\nf 18213 18098 11511\nf 18103 22817 7508\nf 22818 22174 11512\nf 22818 18111 15582\nf 22819 22820 15251\nf 22821 22822 18108\nf 20895 22823 22822\nf 22824 22817 18110\nf 18117 22825 22819\nf 22824 22826 7472\nf 22116 22827 11515\nf 18114 22827 22828\nf 22115 22829 15507\nf 22792 18119 22823\nf 11505 22826 22830\nf 22830 21265 21269\nf 22697 18121 22831\nf 15513 22692 18125\nf 22698 22694 21270\nf 18132 22832 18124\nf 22833 6689 22831\nf 22834 18134 22835\nf 22833 20899 22836\nf 22832 15521 22837\nf 22834 22838 11526\nf 18153 22838 18141\nf 18147 22836 21276\nf 22839 22840 22837\nf 15511 22840 22841\nf 22842 22843 18150\nf 22842 21275 22841\nf 22844 18142 22845\nf 22844 21280 21284\nf 22839 18144 22846\nf 18138 18149 22845\nf 11524 22847 21279\nf 18158 22847 18152\nf 22848 21287 21282\nf 18148 22849 21281\nf 18166 22849 22850\nf 22128 22851 22123\nf 22852 22851 22850\nf 18157 22853 22854\nf 18160 18156 22855\nf 22856 22857 12141\nf 18155 22857 22855\nf 22858 22856 12140\nf 22858 22859 18161\nf 7310 22860 21288\nf 22122 22860 18163\nf 22853 21291 11529\nf 7305 21292 6675\nf 18165 22126 22848\nf 22129 22861 15528\nf 12934 22861 22859\nf 18183 7311 20902\nf 18172 18185 22862\nf 11532 22125 22862\nf 11527 21293 18175\nf 15539 21295 21297\nf 15532 15524 11531\nf 15525 22863 18180\nf 18173 22863 7309\nf 18191 22864 22133\nf 22864 18171 18184\nf 22138 18188 18187\nf 7312 18193 15529\nf 11535 22865 11533\nf 21305 21298 18189\nf 22134 22130 22136\nf 22132 19499 22866\nf 22865 22740 6666\nf 18202 22140 22139\nf 22866 22743 21303\nf 22809 22143 7302\nf 18207 21257 22867\nf 22868 22149 21258\nf 22869 22815 8659\nf 22869 22870 22868\nf 22867 21313 18209\nf 22871 18220 13516\nf 22871 22816 18215\nf 22144 18224 22808\nf 22872 18214 22142\nf 22872 21318 18221\nf 18222 22152 22873\nf 18212 22874 15549\nf 22875 18227 22876\nf 22870 6052 22876\nf 22875 6048 22877\nf 21312 22878 22874\nf 18219 22879 14501\nf 21330 21319 18216\nf 22880 22153 22873\nf 21315 18232 22881\nf 22882 22883 18225\nf 22884 18231 13515\nf 22884 22879 21320\nf 22885 22886 22155\nf 22878 22883 21323\nf 18230 22887 13507\nf 22888 18229 21329\nf 22888 22889 21334\nf 11544 22885 22890\nf 21328 22881 21326\nf 22891 22892 22893\nf 21321 18236 21332\nf 22887 22894 22895\nf 21324 21327 22896\nf 22897 22889 21325\nf 22898 22891 6056\nf 22899 22900 18235\nf 21340 22894 11547\nf 22901 22902 22158\nf 11545 22902 22903\nf 22897 18239 21339\nf 22904 18240 22896\nf 22905 22906 13500\nf 22907 22908 21341\nf 22909 18242 21345\nf 22907 18243 21358\nf 22910 22911 22912\nf 22913 22911 21347\nf 22914 22915 6059\nf 22898 22915 22916\nf 20909 22917 18245\nf 18255 22910 22162\nf 22918 18254 21364\nf 22918 22919 21346\nf 18249 20911 22914\nf 20912 20914 22920\nf 22921 22922 12005\nf 22921 22906 21359\nf 21354 22163 11553\nf 22909 22923 21357\nf 20910 22920 15560\nf 18256 20915 18250\nf 22922 22924 22925\nf 21363 18252 22926\nf 22165 22927 18248\nf 22923 22919 22926\nf 20913 21374 22928\nf 22929 22930 22931\nf 22932 22933 18260\nf 21370 21365 22927\nf 21362 22934 21371\nf 18268 22934 21369\nf 15562 21367 21377\nf 22935 18257 6645\nf 15561 22928 21376\nf 18269 22936 18263\nf 22935 22937 22938\nf 22938 21382 21375\nf 18281 22932 18278\nf 18276 15568 22939\nf 18273 22937 6648\nf 21373 21378 18275\nf 22940 22941 11990\nf 22172 18279 21383\nf 11558 22167 21384\nf 22940 22942 18280\nf 22931 22942 11996\nf 21388 18266 22936\nf 22939 15573 15563\nf 22943 18283 22944\nf 21391 21386 21389\nf 18287 22945 22946\nf 18271 22947 18289\nf 22170 22948 22949\nf 18288 22948 22169\nf 11983 22950 22951\nf 22950 22941 22171\nf 18291 22952 22944\nf 22953 22947 6651\nf 22954 22946 22955\nf 22954 18294 22949\nf 22956 22951 21397\nf 22957 22958 22177\nf 22955 22959 21394\nf 22956 18104 11978\nf 15500 15576 22957\nf 22960 22961 10740\nf 22953 22961 22962\nf 22963 22964 22965\nf 22963 22945 22962\nf 18296 22966 22821\nf 22964 22967 20896\nf 22176 11516 18105\nf 22959 22965 22966\n\nusemtl material_2\nf 22968 18305 22969\nf 22970 22971 11561\nf 22972 21408 22973\nf 22974 22968 6132\nf 22974 22975 22972\nf 22969 22976 6127\nf 18301 22970 22977\nf 22973 22971 18306\nf 22978 22977 22979\nf 22980 18308 18706\nf 21403 21401 21398\nf 21404 11559 22981\nf 21402 22982 22983\nf 21400 22186 22984\nf 6133 22985 22975\nf 18315 22986 8157\nf 22987 22179 21407\nf 22987 22988 15585\nf 22982 22989 11595\nf 21451 22989 21405\nf 22986 22990 13619\nf 21418 22991 22988\nf 22985 18420 18319\nf 21412 22981 21409\nf 18425 8220 22992\nf 22222 20947 22993\nf 22224 18326 22194\nf 22994 22993 21417\nf 22994 22193 22995\nf 18334 22996 8783\nf 21421 18349 18332\nf 22997 18335 8779\nf 18342 22998 11567\nf 18333 11565 22999\nf 23000 22998 18336\nf 22997 6012 23001\nf 23002 23003 8786\nf 23002 22996 18344\nf 18348 20932 11566\nf 22202 22199 18346\nf 22201 23004 18358\nf 23005 23006 23004\nf 23007 15591 8088\nf 23007 20935 18357\nf 22196 18356 21425\nf 23005 18345 18353\nf 23008 22200 18360\nf 23008 23009 22204\nf 23010 18366 6191\nf 23010 23003 20931\nf 18373 23006 23011\nf 23012 21422 18365\nf 23013 18367 21427\nf 21431 23014 23013\nf 23012 21428 11578\nf 22203 23015 23011\nf 22206 23015 11581\nf 21430 23016 15604\nf 22210 23017 7326\nf 18377 11582 23009\nf 22209 23018 5988\nf 21432 22208 23014\nf 22214 23019 15607\nf 23017 23019 18386\nf 18379 23020 21433\nf 20936 18381 23021\nf 23016 7328 18389\nf 23022 18392 6187\nf 23022 23018 18385\nf 21435 22212 18388\nf 23023 18398 20937\nf 21441 22213 18391\nf 23024 21443 18395\nf 21438 23024 23020\nf 23025 23026 18396\nf 18394 23027 8768\nf 11583 23028 22216\nf 18387 23028 21437\nf 7331 23023 8097\nf 23029 20941 18399\nf 23027 23026 23030\nf 11585 18417 18404\nf 18400 23031 21444\nf 18416 23031 18405\nf 18409 7332 13549\nf 23029 7333 18408\nf 20942 20939 18407\nf 23032 23033 23034\nf 23035 23036 18448\nf 18415 21473 23037\nf 15684 22296 23038\nf 23039 23040 23041\nf 18317 21453 23042\nf 23043 11596 18422\nf 23044 18314 11594\nf 23044 18428 22225\nf 23045 23046 15626\nf 23047 23045 21452\nf 20949 23047 11597\nf 18424 23048 13612\nf 23049 23048 21464\nf 22229 23050 22227\nf 23049 18438 13605\nf 21463 11607 18431\nf 18432 15624 23050\nf 21460 23051 18437\nf 23052 23051 18434\nf 22220 23046 22219\nf 18439 23040 8150\nf 11614 23053 18429\nf 23053 23054 23041\nf 23055 22230 22234\nf 23055 21530 23056\nf 11613 23057 23058\nf 23052 22286 21468\nf 8103 23059 18410\nf 11617 23060 23061\nf 18446 18452 18455\nf 23032 23062 9556\nf 21476 23063 21472\nf 23064 23065 18460\nf 7337 23036 23061\nf 23035 18418 22218\nf 15633 11593 18447\nf 23066 18463 23067\nf 23066 23060 15628\nf 23068 18456 22237\nf 15630 23068 18450\nf 23059 22239 18453\nf 23069 18467 6177\nf 23063 18457 23064\nf 22238 23070 18465\nf 23071 23070 8116\nf 21483 22236 18464\nf 23072 23073 22240\nf 23074 23075 23076\nf 23077 23075 23078\nf 18482 23079 21478\nf 18466 23080 8766\nf 18469 23081 23072\nf 22241 23082 23083\nf 23084 18485 6181\nf 18472 18470 23083\nf 11632 23085 23086\nf 11625 23085 18477\nf 21487 23087 21490\nf 23088 23089 18480\nf 11621 23090 23071\nf 23088 18488 21494\nf 14401 23091 23092\nf 18479 23093 23094\nf 18474 20957 20954\nf 22247 21489 23095\nf 22245 11629 22249\nf 18495 23096 23091\nf 23097 23098 18490\nf 23097 23095 18498\nf 18487 23099 18506\nf 21501 23099 18497\nf 18484 18500 23100\nf 18502 23101 20956\nf 23101 18501 20955\nf 23102 15651 18504\nf 23102 23098 21502\nf 22252 23103 18509\nf 23104 23103 18505\nf 23105 11636 8123\nf 23106 21506 23107\nf 20967 21507 22254\nf 18514 22257 22253\nf 22262 23104 22256\nf 23108 21513 21505\nf 23108 21499 20963\nf 23109 22265 18521\nf 23109 15652 21509\nf 11644 23110 13556\nf 23105 23110 18525\nf 23111 23112 6172\nf 23113 23107 20966\nf 21520 21511 20969\nf 23114 23115 8760\nf 23116 23115 18528\nf 15658 22266 22263\nf 18529 18536 21515\nf 18531 18539 23117\nf 23118 18532 22264\nf 11647 11645 8130\nf 21510 18551 11652\nf 23116 18535 5989\nf 22267 23117 11656\nf 23119 21523 18540\nf 23119 23118 11655\nf 23120 22274 18543\nf 23120 21518 22270\nf 22271 21522 22283\nf 18544 11650 23121\nf 18549 13567 18561\nf 23122 22280 22276\nf 23122 11657 18541\nf 18550 11648 13559\nf 23121 23123 23124\nf 18545 23123 18552\nf 23125 23126 18553\nf 22282 18556 22269\nf 18547 20975 20972\nf 23124 20971 18562\nf 22281 23127 15670\nf 22275 21527 23127\nf 18624 23128 18564\nf 11664 23128 21526\nf 18620 18559 14924\nf 20974 23129 18563\nf 23130 23131 9869\nf 22307 23131 18568\nf 18566 23125 20976\nf 21525 21569 18570\nf 18572 21573 20990\nf 18621 23132 15671\nf 23132 23133 18574\nf 18576 18584 18440\nf 23134 23135 22221\nf 23056 22290 18443\nf 15621 18586 23134\nf 21466 23136 23137\nf 15673 23136 22287\nf 20980 23057 23137\nf 21531 21533 18579\nf 23138 11672 7336\nf 23135 23139 23138\nf 15682 23054 23140\nf 23058 22293 23140\nf 23139 23141 21534\nf 23142 23141 18587\nf 18580 15689 23143\nf 13601 18589 21539\nf 23144 23145 22294\nf 15683 23145 18588\nf 23146 15677 23143\nf 21532 22300 15690\nf 23147 18582 6139\nf 23142 23148 23149\nf 21540 23144 11675\nf 21543 11680 11677\nf 23146 23150 18592\nf 15695 23150 22299\nf 21565 23151 21536\nf 22301 23151 23152\nf 23153 23154 23148\nf 20988 21566 23155\nf 8299 21538 11679\nf 21563 21544 15693\nf 23152 21560 18595\nf 23156 18601 9009\nf 20981 23157 15698\nf 21552 21610 18695\nf 18600 23158 8624\nf 23159 15697 20983\nf 23160 23161 23162\nf 23160 18605 18614\nf 11686 18603 21547\nf 23163 21545 23164\nf 23163 20985 23165\nf 23166 23167 18610\nf 23166 23168 13946\nf 23167 8320 23169\nf 23170 23164 18611\nf 23161 21557 21556\nf 7344 23171 23172\nf 22305 23170 21564\nf 11678 23173 8301\nf 23169 23173 18617\nf 23172 23174 8751\nf 20989 23154 23175\nf 18619 21567 23129\nf 18571 21574 18622\nf 15708 18618 8139\nf 22308 18642 23176\nf 20992 18640 15705\nf 23177 23178 22310\nf 23133 23178 21572\nf 22317 22319 23177\nf 18629 23179 22309\nf 23180 15709 13569\nf 23180 23181 22313\nf 23181 8141 23182\nf 22314 18638 21576\nf 23182 23183 21578\nf 23184 23185 23186\nf 23184 5992 23176\nf 20997 20994 21571\nf 23179 23187 22318\nf 23188 23187 18644\nf 22315 22321 18647\nf 7352 23183 20998\nf 23186 18648 8621\nf 23189 18649 23190\nf 20996 23190 23191\nf 23192 23188 18646\nf 23192 15720 23193\nf 21570 23194 18652\nf 23195 23194 15714\nf 23196 18660 18665\nf 23197 18653 23198\nf 23199 23198 23200\nf 11697 23201 23193\nf 22316 23201 21581\nf 23200 23195 18655\nf 23202 23203 23199\nf 23202 21579 22328\nf 11696 22332 21580\nf 23204 20999 22322\nf 23204 18637 7351\nf 23205 23206 23207\nf 23208 18659 23209\nf 18663 23210 9962\nf 23189 23197 23196\nf 23211 23212 23213\nf 22326 23214 23215\nf 11698 23205 13573\nf 23209 23206 23216\nf 23217 23218 18662\nf 21587 21002 23203\nf 21596 23211 21589\nf 23214 23212 23219\nf 18675 23220 23221\nf 21600 18670 21592\nf 21588 23222 23223\nf 23224 22329 18676\nf 23224 23225 21593\nf 23226 23227 21599\nf 15726 21604 22333\nf 23228 7355 23229\nf 21597 23230 23231\nf 23229 23230 23223\nf 23232 23233 23234\nf 23221 23235 6152\nf 11703 18685 23234\nf 21602 23225 18682\nf 18686 23227 21601\nf 7354 11704 23231\nf 15728 18691 18700\nf 23228 22336 15727\nf 18693 23236 23156\nf 23237 23232 11707\nf 23237 23157 23236\nf 21612 22303 15735\nf 20984 21603 21609\nf 21004 23238 18699\nf 23168 11682 18697\nf 18701 23165 23238\n\nusemtl material_3\nf 6800 23239 23240\nf 15738 23241 21620\nf 23242 23243 23244\nf 18302 23245 23246\nf 11714 18708 23247\nf 23248 23249 11717\nf 23250 23251 22978\nf 18724 23252 23253\nf 23252 23241 21618\nf 23253 23254 23255\nf 18715 18712 6966\nf 23256 21614 23254\nf 23257 23258 23259\nf 23257 21613 18714\nf 23259 11719 23255\nf 23260 23261 23262\nf 23260 23263 18720\nf 23264 23263 6123\nf 22356 23265 11715\nf 18730 22359 23266\nf 22360 22365 22357\nf 23267 22351 18733\nf 23267 23268 15747\nf 18726 23269 23270\nf 18757 23271 10490\nf 23268 23272 22366\nf 23273 18728 6918\nf 23273 23271 18739\nf 23258 23274 23269\nf 18738 23274 18729\nf 23266 21015 12109\nf 18751 22358 18741\nf 22390 23275 15744\nf 22368 18744 21622\nf 23265 22394 23276\nf 7364 23261 21624\nf 18737 22372 23277\nf 23278 23270 23277\nf 23278 23279 21628\nf 21625 23280 23281\nf 22377 23280 18749\nf 15769 23282 21635\nf 15763 23282 7366\nf 23283 18752 23284\nf 23285 22375 23286\nf 23285 18754 22367\nf 23287 21636 18748\nf 23287 23279 22371\nf 22370 23288 18765\nf 18770 23288 15765\nf 23283 23289 12098\nf 23290 23284 21637\nf 23291 23292 23289\nf 23291 23290 11726\nf 18761 23293 21639\nf 18758 22374 22376\nf 18813 7592 23292\nf 23286 23294 21662\nf 11747 23294 18760\nf 18768 22408 23293\nf 21689 23295 6824\nf 11725 23295 18771\nf 18767 23296 21023\nf 23297 18776 21655\nf 23298 18802 8744\nf 23298 23299 23300\nf 23301 21017 23297\nf 23300 23302 23303\nf 18775 22383 22395\nf 15778 21644 15780\nf 23304 23299 6216\nf 23302 23305 21641\nf 22378 21019 13623\nf 23306 7368 22387\nf 23307 21650 22382\nf 23306 21632 23308\nf 23307 23309 21645\nf 23310 21634 22391\nf 23310 15781 21643\nf 23311 23312 23313\nf 23304 23314 23315\nf 23315 23311 23305\nf 23309 22392 18787\nf 21640 23313 18788\nf 23276 21648 15760\nf 23316 23314 6115\nf 23316 7363 23317\nf 23312 23317 18745\nf 15776 21651 11735\nf 22379 18797 11733\nf 22396 21649 18790\nf 21653 23318 22402\nf 18801 18800 8737\nf 23319 23320 18798\nf 18799 23321 6109\nf 23322 23323 18803\nf 21654 23319 23323\nf 23322 23303 23301\nf 15788 18772 22399\nf 23324 11762 12083\nf 18804 23325 23326\nf 23327 23325 23328\nf 18805 21693 22404\nf 23328 23329 23330\nf 23331 23329 21657\nf 23324 21659 18807\nf 23332 21688 11759\nf 22409 21025 23333\nf 23296 18769 23332\nf 18809 22431 23330\nf 18851 22406 22407\nf 11746 23331 21661\nf 18811 21656 15783\nf 11743 22405 18808\nf 23334 11744 18816\nf 15785 23334 15772\nf 20186 23335 23318\nf 18818 23335 23336\nf 22401 23337 18795\nf 15789 23338 11748\nf 23338 18824 21021\nf 23339 23336 13673\nf 23339 23340 21026\nf 23337 21665 18821\nf 23341 23342 22410\nf 18794 23343 23344\nf 22415 22411 18823\nf 22414 23340 13670\nf 18819 21028 21666\nf 23345 23321 18827\nf 21679 21670 22417\nf 18825 23320 23344\nf 23345 11754 8803\nf 21672 21668 21676\nf 21027 23346 18830\nf 22413 18839 23346\nf 18831 23347 21030\nf 11753 23348 8732\nf 21678 23349 21667\nf 22420 22424 18833\nf 22422 23350 22423\nf 23351 23347 23352\nf 23351 23353 23350\nf 23354 18837 13642\nf 23355 11757 8729\nf 23355 23348 23356\nf 21686 18841 21682\nf 23356 18842 18845\nf 23357 18847 23358\nf 23353 23359 21684\nf 21780 23359 23360\nf 23361 23362 23363\nf 23364 23362 23365\nf 23365 22493 15876\nf 23364 21681 23349\nf 23366 18859 21691\nf 21034 23367 21658\nf 23333 23368 21692\nf 11761 23369 12080\nf 23327 23370 18856\nf 23371 23372 21694\nf 23371 23326 18866\nf 7374 23366 17246\nf 23368 23367 21696\nf 23373 11771 12075\nf 23373 23369 11765\nf 23374 21705 21698\nf 23375 18857 22433\nf 23372 21697 21700\nf 23376 7375 10249\nf 11770 18862 23377\nf 23374 21703 21709\nf 23378 18876 18871\nf 23378 23375 15817\nf 23379 23380 23376\nf 22436 15815 22441\nf 21036 23380 23381\nf 23382 21706 21708\nf 23383 18875 21712\nf 23383 18883 21702\nf 23382 23384 23385\nf 18884 23386 22446\nf 21714 18881 21711\nf 23387 22440 18879\nf 23387 22448 23386\nf 21040 21707 18882\nf 23388 18888 23381\nf 23389 23390 10278\nf 23390 23391 23392\nf 22445 23393 11782\nf 23394 23393 22442\nf 11778 21721 21715\nf 23395 23394 18886\nf 23396 7378 23389\nf 21045 23388 23391\nf 21037 23397 21717\nf 21042 23397 18889\nf 11779 18897 21720\nf 22447 23398 18896\nf 18894 23398 22450\nf 18898 22451 18892\nf 15819 18900 21725\nf 23399 23396 10300\nf 7379 18903 21723\nf 21048 23400 16060\nf 23401 23402 11785\nf 21047 23395 23402\nf 21719 23403 21726\nf 22456 23403 22452\nf 23399 18905 18904\nf 15824 23400 23404\nf 18909 23405 23401\nf 21728 15822 21724\nf 22454 23404 23405\nf 23406 21051 23407\nf 11786 23408 22458\nf 22459 23408 21729\nf 23409 15825 23410\nf 23410 22453 11790\nf 23411 21053 15826\nf 23412 23411 23413\nf 22455 23414 21733\nf 23412 23414 18910\nf 15829 18912 23406\nf 23407 18902 7380\nf 23415 22029 23409\nf 23416 18914 22461\nf 23413 23417 21732\nf 23418 23417 18919\nf 23419 21735 18920\nf 22463 21055 22468\nf 23420 18917 17915\nf 23420 7383 23419\nf 23421 11799 22031\nf 23421 23415 18922\nf 18921 11795 18924\nf 23422 23423 22466\nf 23422 23424 18927\nf 7386 21060 7385\nf 11798 18939 7547\nf 23425 21745 21062\nf 22472 23424 18929\nf 11797 23426 23425\nf 18926 23427 23418\nf 21740 22476 18932\nf 23428 15832 21743\nf 7387 7027 23429\nf 11792 21058 23428\nf 21057 18937 22473\nf 18938 23430 12044\nf 23431 21061 23432\nf 22475 21746 22471\nf 21751 23433 21744\nf 22477 18936 23429\nf 22474 18942 18951\nf 23434 23435 18946\nf 23436 23432 23433\nf 23430 18943 12035\nf 21756 23434 23436\nf 18947 18940 23431\nf 21747 22480 23437\nf 23438 23439 23440\nf 18953 23439 18941\nf 18945 18960 12039\nf 18959 21754 21753\nf 23441 18952 10231\nf 18950 23438 23442\nf 22483 15845 21755\nf 23435 15844 18961\nf 23437 21777 18964\nf 15841 23443 23441\nf 23442 23444 18966\nf 21758 21073 23445\nf 23446 23445 19088\nf 7412 21760 7393\nf 23447 23448 13666\nf 23447 23449 23450\nf 21759 18970 21765\nf 23450 18971 23446\nf 11807 21773 18979\nf 11809 23451 23452\nf 23453 15848 18974\nf 23453 23451 19094\nf 18975 22488 21762\nf 22489 22490 23454\nf 23455 18986 11812\nf 23456 18969 23457\nf 23458 23459 13663\nf 23460 23461 23457\nf 21766 23462 18982\nf 23463 15860 18983\nf 23463 23454 18981\nf 23464 23465 23466\nf 23461 23465 18987\nf 23462 23456 23455\nf 11813 23467 23468\nf 18992 15854 22491\nf 18990 23469 18997\nf 22492 23470 23471\nf 23472 23470 15859\nf 23473 23464 13654\nf 23473 11816 18996\nf 23467 7398 6078\nf 23474 23475 18988\nf 21064 23475 23476\nf 23469 23471 23477\nf 11810 21775 18999\nf 7400 19012 8704\nf 23478 23479 21776\nf 23480 23481 23482\nf 19002 23477 23483\nf 23484 19014 23483\nf 23484 23472 15869\nf 19000 19011 23485\nf 23486 18967 23478\nf 23486 11821 23487\nf 7401 23488 11818\nf 21774 23488 19009\nf 23489 23444 23480\nf 23489 23474 23479\nf 19005 21779 19015\nf 23487 19008 22482\nf 22481 19007 21778\nf 19004 23485 22484\nf 23490 23491 23492\nf 15888 23493 15879\nf 21782 23494 21683\nf 23495 23494 23493\nf 8172 23496 23492\nf 21781 19020 15877\nf 23490 19021 23497\nf 23498 23499 19022\nf 23498 21687 23500\nf 22497 23500 19024\nf 23501 15886 21786\nf 23502 11827 15878\nf 23502 19029 21069\nf 22494 15884 19027\nf 23503 23496 8188\nf 23503 23504 19030\nf 19031 23505 8720\nf 21789 23506 22496\nf 23499 23506 19033\nf 19043 23507 23508\nf 23509 21790 19038\nf 7404 23504 13644\nf 23510 23511 23512\nf 23510 23505 19042\nf 21788 21785 23508\nf 23507 22499 19045\nf 19048 15889 22498\nf 23513 19061 21791\nf 23513 7405 13643\nf 22502 15895 22501\nf 15883 23501 19051\nf 21793 23514 19054\nf 23515 19053 23509\nf 19055 23516 23517\nf 19062 23517 23518\nf 23519 23515 19058\nf 23520 23521 6093\nf 23520 23511 23514\nf 11831 21794 23519\nf 19065 19046 19063\nf 23518 19082 23522\nf 23516 19071 22503\nf 19050 23523 19073\nf 23524 23523 19075\nf 23524 23525 21071\nf 23526 7409 8259\nf 23527 19066 23522\nf 23527 21802 23528\nf 23525 23526 23529\nf 22487 23530 19080\nf 21803 23530 21806\nf 23531 21808 21800\nf 23531 19069 23528\nf 11805 22506 7410\nf 23532 23529 13650\nf 23532 23448 19090\nf 21796 11836 23533\nf 19089 23533 21070\nf 23534 23535 23536\nf 21805 7390 23536\nf 23534 18972 8716\n\nusemtl material_1\nf 22511 11840 22518\nf 23537 23538 23539\nf 23540 23541 23542\nf 23543 23544 23545\nf 11839 23543 6790\nf 23546 21817 21815\nf 23547 23548 23542\nf 21834 23549 22513\nf 21810 23549 21813\nf 19106 23550 23551\nf 17919 19108 21819\nf 23552 19109 22682\nf 15914 23553 22520\nf 15913 23553 19112\nf 23554 23555 21820\nf 23554 19107 23550\nf 15912 15916 22521\nf 23555 23556 19116\nf 23557 23556 19105\nf 19138 23558 15917\nf 23558 23559 7419\nf 23560 21084 22523\nf 23560 23561 19122\nf 23561 23562 19124\nf 23557 10169 19128\nf 22525 23563 23564\nf 19127 23563 19117\nf 11843 23565 15909\nf 19132 23565 23566\nf 23564 23567 11851\nf 23568 19135 23559\nf 23569 23562 19140\nf 21829 23569 22535\nf 19139 19142 22536\nf 23570 23571 15921\nf 23566 23571 19143\nf 19145 23572 6723\nf 7426 22570 21824\nf 19157 23573 21105\nf 23574 23573 19147\nf 23575 22528 19152\nf 21089 21830 22531\nf 23572 19156 23576\nf 21822 23577 19155\nf 19158 19148 22533\nf 21826 19159 23578\nf 23570 21827 23578\nf 23579 23580 19161\nf 22527 23580 19162\nf 19136 19160 11950\nf 23579 23568 19137\nf 11857 22512 19103\nf 23581 23582 23583\nf 23584 6782 23540\nf 21832 23585 23586\nf 23548 23587 23588\nf 11859 23589 23590\nf 22516 23589 22517\nf 23591 19165 23592\nf 22537 23593 23594\nf 23584 23581 23595\nf 21846 19167 23596\nf 21835 11856 19166\nf 23597 23598 23599\nf 19168 15926 23600\nf 22541 21090 21847\nf 7593 23601 23602\nf 19178 23603 23604\nf 19175 23605 21850\nf 23606 23605 19180\nf 21130 22544 19182\nf 22549 21091 19171\nf 22548 23607 21855\nf 23608 23606 23609\nf 23608 11863 22550\nf 11861 23610 23611\nf 23612 23613 23609\nf 23614 23615 12161\nf 23614 19339 23616\nf 23610 23613 23617\nf 23618 23619 10208\nf 23618 23620 21092\nf 12132 7428 19190\nf 23621 7431 7083\nf 23621 23622 19236\nf 22556 21098 21857\nf 23623 19192 21096\nf 19196 21864 22561\nf 10176 7433 11866\nf 23624 23625 22557\nf 23624 19232 15933\nf 21099 23626 19209\nf 21859 21862 21865\nf 11865 19215 10177\nf 19219 23627 23628\nf 19205 23628 23629\nf 23625 23629 23630\nf 23631 23632 23633\nf 23634 21103 21866\nf 23634 21861 23635\nf 19214 23636 10173\nf 23637 23636 19213\nf 23638 23639 21870\nf 23639 19211 11873\nf 11870 23640 22565\nf 19221 23640 21869\nf 23630 23641 21871\nf 19218 23641 23627\nf 23642 23631 12134\nf 23642 23643 23644\nf 23644 21877 19222\nf 23637 19146 6730\nf 23645 23646 15945\nf 23645 23574 19212\nf 23647 21868 11872\nf 23647 21875 23648\nf 23649 21087 22572\nf 23649 22566 15944\nf 19151 21088 11876\nf 23650 23643 12138\nf 23650 23651 19231\nf 22568 21102 21100\nf 21876 23575 21101\nf 23652 23651 7664\nf 23652 19154 22529\nf 22558 19234 22579\nf 21097 23653 21879\nf 19235 23653 19193\nf 23654 22573 21884\nf 19238 23655 22577\nf 23656 19242 23657\nf 22551 23656 23658\nf 21108 23659 21887\nf 22581 23660 22576\nf 19239 23661 19243\nf 22580 21878 21889\nf 23662 19246 19237\nf 23663 23664 23665\nf 23622 10181 23665\nf 19244 23666 21890\nf 11880 19251 23667\nf 23668 23669 23670\nf 21883 21886 23671\nf 22591 22584 19249\nf 23670 23672 12925\nf 23673 23672 23674\nf 23675 21895 21893\nf 23674 23676 21897\nf 21901 23666 23677\nf 23673 23678 19918\nf 19259 23679 22594\nf 19257 23675 21904\nf 15953 23680 22596\nf 23681 22589 21111\nf 23681 22599 22597\nf 23682 22592 11245\nf 23682 23683 21114\nf 23684 23685 21902\nf 21913 23686 23680\nf 19260 23686 23687\nf 21909 21915 21903\nf 21916 11883 19263\nf 23688 23689 7645\nf 23688 23678 19264\nf 21917 7436 19267\nf 23690 23691 7847\nf 23690 23689 11882\nf 21919 19269 21911\nf 19271 19270 19273\nf 23692 19277 21910\nf 23692 23685 23687\nf 23693 21932 19275\nf 23694 15955 22602\nf 23694 19279 21912\nf 19283 19276 23695\nf 23696 23695 19280\nf 19266 23697 21922\nf 23698 23697 23699\nf 6748 19285 23683\nf 23700 15960 23701\nf 19286 7196 19287\nf 23702 19294 23703\nf 23702 7638 19290\nf 21125 23693 21930\nf 23704 23705 22604\nf 23696 23705 23706\nf 21920 21927 21931\nf 23706 22606 21928\nf 21924 21940 19296\nf 23707 23708 15959\nf 23707 21120 22607\nf 23709 23710 12126\nf 23709 23703 19301\nf 19308 19300 21933\nf 23711 21929 22605\nf 23711 23712 21123\nf 19299 19293 21124\nf 23704 22609 21935\nf 21937 23712 23713\nf 21936 19303 23713\nf 22610 19297 15961\nf 21941 21118 7437\nf 19306 21127 23708\nf 23714 23715 10189\nf 22608 23715 19307\nf 23716 23717 13455\nf 23716 23710 19310\nf 15972 23718 19312\nf 15970 23718 15967\nf 15964 19305 19322\nf 19320 19333 19318\nf 23714 23719 19323\nf 11897 23717 19326\nf 19332 22614 15969\nf 23720 23721 19331\nf 22613 23721 21944\nf 19334 21147 16026\nf 23722 23719 11275\nf 19336 19418 16024\nf 23723 23724 7240\nf 23722 23724 19338\nf 23616 21951 23617\nf 23725 23726 6778\nf 23725 23619 19345\nf 19349 19344 11900\nf 23727 23728 19352\nf 23729 19366 23730\nf 23726 19351 23731\nf 19355 10216 23731\nf 19350 23732 23733\nf 15983 21954 15987\nf 23734 15992 23735\nf 23734 19341 15988\nf 23736 23737 19356\nf 23736 23733 19360\nf 19357 23738 6777\nf 23739 23740 21961\nf 21956 23740 23732\nf 21962 22621 19359\nf 19361 23739 19372\nf 22622 15986 22626\nf 21963 23730 11902\nf 23727 23729 21953\nf 15991 21132 21960\nf 19368 23741 15996\nf 23742 23743 12164\nf 15989 23743 19369\nf 23738 19375 23744\nf 23745 23746 23742\nf 23747 23741 23746\nf 16003 23748 19371\nf 23737 23748 19376\nf 22632 23749 21972\nf 22627 23750 11905\nf 22633 22623 23751\nf 23747 19379 23752\nf 22624 23753 23750\nf 23754 23755 11903\nf 21969 23755 23751\nf 15999 23752 21974\nf 23756 23745 12112\nf 23756 23757 23758\nf 22630 23759 10207\nf 22628 23749 23760\nf 22635 23761 23762\nf 23763 23753 19380\nf 23763 23762 11906\nf 23754 21973 21133\nf 19377 23758 23764\nf 12314 19383 23757\nf 23765 23759 19386\nf 23766 21975 23767\nf 23766 23768 19395\nf 19388 23769 23761\nf 22631 23769 23770\nf 23767 23771 23772\nf 21979 23772 19387\nf 23770 23771 23760\nf 23773 11909 22637\nf 19378 21139 19390\nf 23774 23764 21135\nf 23774 23775 21140\nf 22634 21138 19433\nf 23776 21996 23775\nf 23777 21136 12317\nf 23777 19431 23776\nf 23765 19398 10206\nf 23778 19399 19396\nf 22640 23768 21978\nf 22641 22000 23778\nf 19434 16014 22639\nf 19438 23779 21999\nf 23780 23773 22642\nf 19400 22014 23781\nf 19416 19401 22663\nf 19403 23782 10195\nf 23783 23784 23785\nf 19462 23784 19405\nf 16018 11928 19456\nf 22649 23786 23787\nf 19410 23786 22645\nf 7447 19402 21141\nf 16016 21991 19414\nf 23788 23789 11915\nf 21142 21992 21988\nf 23788 16015 12125\nf 23723 23782 23790\nf 23790 23783 19419\nf 23787 23791 22651\nf 19425 23791 19421\nf 23792 21989 19423\nf 23792 23793 23794\nf 19429 23789 7634\nf 23795 19330 19426\nf 23795 21984 23794\nf 23793 19327 23720\nf 11916 23796 21994\nf 19325 23796 19428\nf 22654 21995 19430\nf 22003 22006 23797\nf 21148 23797 19436\nf 23780 22656 23779\nf 19442 22002 16036\nf 19495 21152 19445\nf 21153 21151 22655\nf 7452 16027 11938\nf 23798 11923 10078\nf 23798 19437 22001\nf 23799 22007 22005\nf 23800 23801 22676\nf 23800 19450 16032\nf 23802 11931 23799\nf 23802 22004 19452\nf 21982 23785 22010\nf 11927 19404 6752\nf 22644 23803 22665\nf 16047 23803 19453\nf 19460 19468 23804\nf 23805 11925 7258\nf 23805 23806 23807\nf 23808 23809 19461\nf 23808 22011 19464\nf 22646 23810 12120\nf 7455 23810 16042\nf 22016 21155 23811\nf 23812 7456 19465\nf 23811 19466 23781\nf 19458 19471 19473\nf 19469 23813 19472\nf 7457 23814 23815\nf 22672 23806 7254\nf 23816 23814 23817\nf 23818 23812 21154\nf 23818 19490 23817\nf 22674 23819 22670\nf 22667 23819 19479\nf 23820 23821 22019\nf 22669 23821 19482\nf 22021 23822 22023\nf 19486 23822 23813\nf 21156 16054 22008\nf 11922 23823 10199\nf 22673 23823 19489\nf 23824 23825 23826\nf 22660 21150 16033\nf 23827 19494 19496\nf 11934 22025 22018\nf 23820 16039 22026\n\nusemtl material_4\nf 22027 19504 19502\nf 19530 12251 19533\nf 19541 19534 19543\nf 12343 12350 19531\nf 19623 19656 7943\nf 12461 19654 19660\nf 22033 13201 16235\nf 13304 13311 12387\nf 20118 20115 20119\nf 8084 13535 8082\nf 20212 13645 22035\nf 13771 13765 20182\nf 20219 20221 20270\nf 13783 13790 13894\nf 13795 20226 20237\nf 20231 13794 20230\nf 20269 20265 20217\nf 23828 20278 13904\nf 13909 23829 23830\nf 13907 23829 20292\nf 13911 13915 14785\nf 13987 20613 20315\nf 20559 23831 23832\nf 20732 20740 14689\nf 8556 20737 20790\nf 14696 14806 20792\n\nusemtl material_0\nf 6008 9557 16954\nf 8652 8651 16953\nf 6120 8746 23262\nf 6408 14979 16695\nf 7118 11166 7124\nf 7128 11181 11183\n\nusemtl material_1\nf 23833 23834 19119\n\nusemtl material_2\nf 18310 18325 22192\n\nusemtl material_1\nf 23835 7416 23836\n\nusemtl material_4\nf 7630 12117 23815\nf 20558 23831 16442\n\nusemtl material_0\nf 6118 8787 8747\nf 23837 23838 6039\nf 10603 6976 23744\nf 10212 10664 10213\nf 7123 11178 11179\nf 7127 15375 7120\nf 15368 11233 11204\n\nusemtl material_1\nf 22748 20875 11485\n\nusemtl material_2\nf 22992 22990 22991\nf 23034 23839 18412\nf 11624 22243 23074\n\nusemtl material_1\nf 23538 23840 23841\nf 23590 21840 23842\nf 22593 21898 23843\nf 23728 21952 23844\nf 22009 22012 23804\nf 23826 12115 23816\n\nusemtl material_4\nf 23845 7629 20117\nf 23845 23846 12118\nf 19585 19581 16093\nf 13338 23846 13341\nf 22295 13600 13596\nf 14376 23847 14371\nf 20797 16501 20794\n\nusemtl material_0\nf 17254 10521 15217\n\nusemtl material_2\nf 15587 23848 22183\n\nusemtl material_3\nf 23849 22344 23848\nf 15812 22429 15809\n\nusemtl material_1\nf 21078 22508 23850\nf 23583 22545 21093\n\nusemtl material_4\nf 16092 12341 12339\nf 16200 19929 7940\nf 14783 14790 20784\n\nusemtl material_0\nf 16701 6409 10136\nf 17170 9949 17166\nf 15130 23851 17168\nf 15126 17165 23851\nf 10276 15216 17255\nf 10150 7200 17811\n\nusemtl material_1\nf 17931 22689 21164\nf 22695 21172 21170\nf 11476 21182 17961\nf 22787 22782 18055\nf 22880 22886 18233\n\nusemtl material_2\nf 22184 22983 18313\nf 18327 21415 22995\nf 18339 23000 23852\nf 21442 23037 21449\nf 21488 20951 23079\nf 21582 21000 23853\nf 23854 21583 23216\nf 18668 23855 23856\nf 18671 23857 23217\nf 23220 23858 23859\nf 23860 23859 23233\n\nusemtl material_3\nf 23861 23248 18702\nf 23862 23836 22361\nf 18846 23352 18838\nf 18848 23497 23360\nf 23379 6837 23392\nf 22426 23495 19018\nf 19077 23535 19091\n\nusemtl material_1\nf 23863 23577 23567\nf 23588 21844 23582\nf 23864 23591 21837\nf 23599 21851 22546\nf 21841 21849 19170\nf 23865 23601 23615\nf 19203 23866 22559\nf 23626 12137 23633\nf 19226 23646 23638\nf 21891 23659 23657\nf 19252 23843 23677\nf 23698 21119 23700\n\nusemtl material_4\nf 19625 7790 19621\nf 19928 16191 7923\nf 20771 23828 20283\nf 20577 20575 23847\nf 20770 20766 13900\nf 20785 20781 16522\nf 16528 14817 14819\n\nusemtl material_1\nf 20854 22703 23867\nf 11469 20853 22043\n\nusemtl material_2\nf 20923 20920 7319\nf 23868 22327 21001\n\nusemtl material_3\nf 21007 23850 22340\nf 22348 20922 7360\nf 23869 15753 7361\n\nusemtl material_1\nf 23592 15905 21076\nf 23863 19126 21086\nf 17927 6013 21163\nf 17960 17973 22710\nf 21191 22067 21198\nf 15516 22120 15514\n\nusemtl material_2\nf 21455 21410 23042\nf 23870 18475 15639\nf 21550 23159 23162\nf 23213 23868 21584\nf 23854 11700 21590\nf 23226 21591 21594\nf 11701 23858 23857\n\nusemtl material_3\nf 23256 21617 23244\nf 23239 10431 18711\nf 22342 18781 23308\nf 21680 18834 23363\nf 21795 19092 23521\n\nusemtl material_1\nf 23840 23242 19102\nf 23585 23597 21845\nf 21892 19261 23684\nf 21926 22603 15958\nf 21117 21921 23701\nf 21950 19353 23611\nf 21949 23735 21959\nf 23871 21192 22059\nf 22062 22065 23871\nf 22810 18102 22807\nf 21289 22121 15518\nf 22156 22890 21333\nf 22160 22157 22159\nf 22166 22164 18265\n\nusemtl material_2\nf 22181 22345 22188\nf 22190 23872 23869\nf 23870 15641 21496\n\nusemtl material_3\nf 15741 23873 22337\nf 21631 22346 23874\nf 22182 22343 23874\nf 21783 15803 22427\nf 22430 22432 23370\n\nusemtl material_1\nf 22510 22519 23873\nf 23842 19169 22542\nf 23875 22554 23655\nf 23875 22553 23876\nf 23877 23878 19254\nf 23679 23878 22586\nf 22696 22681 18129\nf 22706 23879 22707\nf 23880 22721 22712\nf 23880 23879 17981\nf 23881 23882 6022\nf 22713 22719 21196\nf 22718 22057 17984\nf 22731 22729 23881\nf 22744 22778 21307\nf 22745 22756 22749\nf 22785 22775 11967\nf 22774 22108 18063\nf 21217 22750 15464\nf 22967 22960 22820\nf 22825 21266 20897\nf 23883 18139 22835\nf 20900 7481 18154\nf 22846 22852 22843\nf 21278 22854 18168\nf 22882 22892 18237\nf 22893 22877 6046\nf 22900 22917 21338\nf 22903 22913 22904\nf 22912 22901 22161\nf 18246 22899 22916\nf 22925 22929 19506\nf 23884 22924 21366\nf 23884 22933 22930\nf 22952 15578 22178\nf 22958 18285 22943\n\nusemtl material_2\nf 23885 23886 22976\nf 23885 18304 18303\nf 23887 22984 22980\nf 22999 18338 11570\nf 17922 23852 23001\nf 23030 23033 8772\nf 23839 23025 21448\nf 23038 13595 23039\nf 21454 18419 11598\nf 23084 23080 23081\nf 18471 20953 18486\nf 23076 22246 23086\nf 18481 23089 23087\nf 18478 21484 23090\nf 23113 23114 23112\nf 23111 20961 23106\nf 23149 23155 21537\nf 23174 23153 23147\nf 23185 18641 23191\nf 23207 18658 13577\nf 7353 23208 23853\nf 18667 22331 22324\nf 23855 22325 23215\nf 18674 23210 23218\nf 23219 21598 23856\nf 23860 18694 23235\n\nusemtl material_3\nf 23240 23888 23537\nf 23243 23888 21619\nf 23245 23889 23247\nf 18719 23890 23246\nf 23281 22373 23272\nf 23358 23354 13639\nf 23361 22425 18849\nf 18925 22469 23426\nf 11796 21730 23427\nf 23357 13635 23491\n\nusemtl material_1\nf 23539 11837 6797\nf 21816 11838 23841\nf 21085 6715 23576\nf 23587 21814 23586\nf 23864 19176 21842\nf 23891 23593 7605\nf 21838 23594 23892\nf 23595 23620 6786\nf 23596 11855 22540\nf 21836 23600 23598\nf 23893 23891 12100\nf 23893 23602 23604\nf 23892 23603 19177\nf 23866 23876 22562\nf 23894 23635 19210\nf 23894 23632 19224\nf 19225 23648 22569\nf 22575 22555 22578\nf 23877 23661 23660\nf 23664 19250 23662\nf 23667 23663 10183\nf 23668 12926 23654\nf 23671 23676 23669\nf 22598 22585 22590\nf 19284 23699 21115\nf 11862 23844 23607\nf 23801 22658 22662\nf 19467 19457 11930\nf 23895 19463 11926\nf 23896 23807 19476\nf 23896 23809 23895\nf 23824 19492 23827\n\nusemtl material_4\nf 23832 8441 16441\n\nusemtl material_0\nf 23897 16571 6042\nf 17228 10135 23898\n\nusemtl material_1\nf 15593 23867 21186\n\nusemtl material_2\nf 7343 23158 11687\n\nusemtl material_4\nf 16068 12071 7572\n\nusemtl material_0\nf 8719 23899 23512\nf 23900 8852 8858\nf 14934 14932 16612\nf 6037 23837 22089\nf 23901 23898 16700\nf 23901 23902 17232\nf 17749 23903 7044\nf 23902 16702 23903\nf 10179 6740 23904\n\nusemtl material_4\nf 12738 16164 19850\n\nusemtl material_0\nf 23904 7224 15365\n\nusemtl material_1\nf 15489 18092 22797\n\nusemtl material_3\nf 15896 19072 15892\n\nusemtl material_0\nf 16611 16609 8950\nf 22037 17222 17217\nf 17117 17209 17219\nf 17230 15364 10070\nf 10137 17746 17231\n\nusemtl material_1\nf 22828 22791 18078\nf 22769 22083 18093\nf 22788 22829 18115\n\nusemtl material_2\nf 18382 21429 18376\nf 22272 18534 18554\n\nusemtl material_3\nf 18874 23905 22444\n\nusemtl material_4\nf 19851 19855 12739\n\nusemtl material_3\nf 21074 21008 21626\n\nusemtl material_2\nf 23126 23130 22273\n\nusemtl material_3\nf 15894 19052 11829\n\nusemtl material_1\nf 22801 20867 22086\nf 22800 22082 22738\nf 23906 8047 22895\nf 22908 22905 23906\n\nusemtl material_2\nf 23021 18375 8094\nf 23096 18489 23094\nf 23093 11622 23092\nf 11689 23175 23171\n\nusemtl material_3\nf 23377 23385 18873\nf 23384 22443 23905\nf 23423 18918 18915\nf 22464 23416 21736\n\nusemtl material_1\nf 23547 23544 23546\nf 23545 23541 6794\nf 23612 19179 23865\nf 11864 23623 21872\nf 23691 23907 23908\nf 7453 7623 23825\n\nusemtl material_0\nf 23909 23897 23838\nf 23909 9125 9127\n\nusemtl material_3\nf 23910 22347 15751\n\nusemtl material_1\nf 21075 21011 7418\n\nusemtl material_2\nf 23872 22187 23910\n\nusemtl material_0\nf 9406 9409 23911\nf 11172 6727 6717\nf 23911 23912 6451\nf 17628 17673 23913\nf 11171 11170 7100\n\nusemtl material_2\nf 18672 14822 18680\n\nusemtl material_1\nf 11886 23907 19272\n\nusemtl material_4\nf 13588 23914 13583\nf 13594 18698 23914\n\nusemtl material_1\nf 22804 22812 22802\n\nusemtl material_0\nf 17213 17211 10041\nf 17670 23913 10946\n\nusemtl material_2\nf 18673 22335 23222\n\nusemtl material_0\nf 17215 16778 10043\n\nusemtl material_2\nf 21457 18426 23043\nf 22228 22232 22226\nf 18458 21479 23915\n\nusemtl material_1\nf 18079 8657 21233\nf 23916 22764 21252\nf 15492 22148 22813\n\nusemtl material_2\nf 22979 21399 23887\nf 23915 21486 23082\n\nusemtl material_3\nf 21674 23343 23342\nf 23341 21671 21669\n\nusemtl material_0\nf 23900 8721 23899\n\nusemtl material_1\nf 23908 19291 12650\n\nusemtl material_0\nf 8836 8801 6137\nf 8615 9415 9418\nf 7102 7098 11169\nf 7108 11168 11174\nf 6266 8839 8837\n\nusemtl material_4\nf 14800 14802 20789\nf 20791 20786 20788\n\nusemtl material_0\nf 9599 23917 16981\nf 16980 23918 16963\n\nusemtl material_1\nf 18081 22793 6035\n\nusemtl material_2\nf 23069 23062 18461\nf 20952 11626 23077\nf 20962 6431 23100\n\nusemtl material_3\nf 19013 23476 23482\n\nusemtl material_1\nf 19191 23919 21881\nf 23920 23919 19200\nf 23920 23921 23922\n\nusemtl material_2\nf 18499 11638 20960\n\nusemtl material_3\nf 21005 22354 15756\nf 21627 15758 22364\n\nusemtl material_1\nf 21860 21863 23921\nf 22772 18080 23916\n\nusemtl material_2\nf 23067 23078 7338\nf 23065 23073 18468\n\nusemtl material_3\nf 23481 23440 23443\n\nusemtl material_1\nf 23883 20850 23834\n\nusemtl material_0\nf 23912 9410 9413\n\nusemtl material_1\nf 20901 23833 7485\n\nusemtl material_3\nf 23886 23890 23923\nf 23923 23264 6126\n\nusemtl material_0\nf 23924 6478 9561\n\nusemtl material_3\nf 23452 21768 23925\n\nusemtl material_4\nf 7585 12092 7588\nf 16062 12076 16065\n\nusemtl material_0\nf 16964 9573 9593\n\nusemtl material_1\nf 11496 22739 18200\n\nusemtl material_3\nf 21769 23925 21771\n\nusemtl material_0\nf 23917 16955 23924\nf 23918 16959 16961\n\nusemtl material_3\nf 23460 23449 23459\nf 23458 13658 23466\n\nusemtl material_1\nf 23926 17980 23882\nf 22730 22722 23926\n\nusemtl material_0\nf 17845 15383 7232\nf 17825 11330 17865\nf 23927 8758 6167\n\nusemtl material_4\nf 7466 12411 11941\nf 8554 13474 16487\n\nusemtl material_0\nf 9257 6424 23927\n\nusemtl material_4\nf 7465 12318 19620\nf 13473 14715 13475\n\nusemtl material_0\nf 6080 6083 23928\nf 23928 8713 23468\nf 17080 15143 6577\n\nusemtl material_4\nf 20287 22036 23929\n\nusemtl material_0\nf 17078 9802 17081\n\nusemtl material_4\nf 23929 20289 23830\n\nusemtl material_0\nf 6805 10489 6917\nf 10488 6802 6939\n\nusemtl material_3\nf 23861 23889 23251\nf 23250 18705 23249\n\nusemtl material_0\nf 8634 8641 6020\n\nusemtl material_1\nf 19198 23658 21107\nf 22574 23922 21858\nf 23552 10168 23551\n\nusemtl material_0\nf 6197 22685 6011\nf 6198 6010 8778\n\nusemtl material_1\nf 7415 23930 23931\n\nusemtl material_4\nf 23932 15743 8156\nf 13624 13614 23932\n\nusemtl material_3\nf 15745 23933 18316\nf 15754 23931 23934\nf 18731 23934 23862\n\nusemtl material_1\nf 22538 23835 23930\n\nusemtl material_3\nf 23275 23849 23933\n\nusemtl material_0\nf 11 5986 5988\nf 5986 12 5987\nf 5988 5987 159\nf 16 5989 5991\nf 5989 1253 5990\nf 5991 5990 1254\nf 18 5992 5994\nf 5992 19 5993\nf 5994 5993 1255\nf 1563 5995 5997\nf 5995 1256 5996\nf 5997 5996 1257\nf 1376 5998 6000\nf 5998 1258 5999\nf 6000 5999 1374\nf 24 6001 6003\nf 6001 125 6002\nf 6003 6002 1259\nf 53 6004 6006\nf 6004 1268 6005\nf 6006 6005 1395\nf 38 6007 6009\nf 6007 1262 6008\nf 6009 6008 5812\nf 29 6010 6012\nf 6010 5981 6011\nf 6012 6011 28\nf 30 6013 6015\nf 6013 31 6014\nf 6015 6014 1260\nf 37 6016 6018\nf 6016 1481 6017\nf 6018 6017 1263\nf 39 6019 6021\nf 6019 34 6020\nf 6021 6020 1263\nf 26 6022 6023\nf 6022 38 6009\nf 6023 6009 5812\nf 41 6024 6026\nf 6024 44 6025\nf 6026 6025 1267\nf 48 6027 6029\nf 6027 208 6028\nf 6029 6028 2742\nf 1491 6030 6032\nf 6030 2742 6031\nf 6032 6031 1267\nf 1491 6032 6033\nf 6032 1267 6025\nf 6033 6025 44\nf 41 6026 6035\nf 6026 1267 6034\nf 6035 6034 45\nf 50 6036 6038\nf 6036 5922 6037\nf 6038 6037 207\nf 51 6039 6041\nf 6039 5916 6040\nf 6041 6040 54\nf 5916 6042 6040\nf 6042 1268 6043\nf 6040 6043 54\nf 57 6044 6046\nf 6044 55 6045\nf 6046 6045 60\nf 56 6047 6049\nf 6047 57 6048\nf 6049 6048 58\nf 1395 6050 6051\nf 6050 56 6049\nf 6051 6049 58\nf 1395 6051 6006\nf 6051 58 6052\nf 6006 6052 53\nf 1269 6053 6055\nf 6053 59 6054\nf 6055 6054 55\nf 55 6054 6045\nf 6054 59 6056\nf 6045 6056 60\nf 57 6047 6044\nf 6047 56 6057\nf 6044 6057 55\nf 59 6053 6059\nf 6053 1269 6058\nf 6059 6058 62\nf 64 6060 6062\nf 6060 1391 6061\nf 6062 6061 1271\nf 1407 6063 6065\nf 6063 72 6064\nf 6065 6064 2774\nf 1278 6066 6068\nf 6066 76 6067\nf 6068 6067 2744\nf 83 6069 6071\nf 6069 2748 6070\nf 6071 6070 81\nf 85 6072 6074\nf 6072 86 6073\nf 6074 6073 1281\nf 88 6075 6077\nf 6075 1281 6076\nf 6077 6076 1280\nf 89 6078 6080\nf 6078 87 6079\nf 6080 6079 1282\nf 1282 6081 6083\nf 6081 90 6082\nf 6083 6082 1283\nf 90 6084 6082\nf 6084 1284 6085\nf 6082 6085 1283\nf 1284 6086 6088\nf 6086 3936 6087\nf 6088 6087 2745\nf 97 6089 6091\nf 6089 96 6090\nf 6091 6090 1286\nf 97 6091 6093\nf 6091 1286 6092\nf 6093 6092 98\nf 1287 6094 6096\nf 6094 100 6095\nf 6096 6095 5920\nf 100 6094 6098\nf 6094 1287 6097\nf 6098 6097 102\nf 1287 6099 6101\nf 6099 1288 6100\nf 6101 6100 1289\nf 1291 6102 6104\nf 6102 103 6103\nf 6104 6103 1290\nf 1291 6104 6106\nf 6104 1290 6105\nf 6106 6105 2746\nf 106 6107 6109\nf 6107 1293 6108\nf 6109 6108 4800\nf 111 6110 6112\nf 6110 112 6111\nf 6112 6111 1309\nf 111 6113 6115\nf 6113 1294 6114\nf 6115 6114 114\nf 5813 6116 6118\nf 6116 116 6117\nf 6118 6117 1307\nf 115 6119 6120\nf 6119 116 6116\nf 6120 6116 5813\nf 118 6121 6123\nf 6121 117 6122\nf 6123 6122 119\nf 119 6124 6126\nf 6124 121 6125\nf 6126 6125 122\nf 123 6127 6128\nf 6127 122 6125\nf 6128 6125 121\nf 123 6128 6130\nf 6128 121 6129\nf 6130 6129 120\nf 123 6130 6132\nf 6130 120 6131\nf 6132 6131 124\nf 125 6133 6135\nf 6133 124 6134\nf 6135 6134 25\nf 1327 6136 6138\nf 6136 5953 6137\nf 6138 6137 127\nf 134 6139 6141\nf 6139 130 6140\nf 6141 6140 1354\nf 132 6142 6144\nf 6142 131 6143\nf 6144 6143 130\nf 23 6145 6147\nf 6145 133 6146\nf 6147 6146 1295\nf 135 6148 6150\nf 6148 1296 6149\nf 6150 6149 1355\nf 21 6151 6153\nf 6151 136 6152\nf 6153 6152 137\nf 21 6153 6155\nf 6153 137 6154\nf 6155 6154 1297\nf 1255 5993 6157\nf 5993 19 6156\nf 6157 6156 20\nf 1298 6158 6160\nf 6158 139 6159\nf 6160 6159 140\nf 20 6161 6162\nf 6161 139 6158\nf 6162 6158 1298\nf 17 6163 6165\nf 6163 142 6164\nf 6165 6164 143\nf 1584 6166 6168\nf 6166 5973 6167\nf 6168 6167 1585\nf 145 6169 6171\nf 6169 1427 6170\nf 6171 6170 147\nf 145 6171 6173\nf 6171 147 6172\nf 6173 6172 1300\nf 1252 6174 6176\nf 6174 1301 6175\nf 6176 6175 1430\nf 149 6177 6179\nf 6177 150 6178\nf 6179 6178 15\nf 146 6180 6181\nf 6180 1430 6175\nf 6181 6175 1301\nf 12 5986 6183\nf 5986 11 6182\nf 6183 6182 154\nf 154 6184 6186\nf 6184 155 6185\nf 6186 6185 1303\nf 154 6182 6184\nf 6182 11 6187\nf 6184 6187 155\nf 152 6188 6190\nf 6188 1303 6189\nf 6190 6189 1302\nf 157 6191 6193\nf 6191 158 6192\nf 6193 6192 13\nf 13 6192 6195\nf 6192 158 6194\nf 6195 6194 159\nf 1305 6196 6198\nf 6196 27 6197\nf 6198 6197 5981\nf 1260 6199 6201\nf 6199 1305 6200\nf 6201 6200 1306\nf 33 6202 6204\nf 6202 1306 6203\nf 6204 6203 1304\nf 115 6205 6119\nf 6205 114 6206\nf 6119 6206 116\nf 116 6206 6207\nf 6206 114 6114\nf 6207 6114 1294\nf 1307 6208 6210\nf 6208 113 6209\nf 6210 6209 1311\nf 120 6211 6213\nf 6211 163 6212\nf 6213 6212 1308\nf 124 6131 6134\nf 6131 120 6214\nf 6134 6214 25\nf 125 6135 6002\nf 6135 25 6215\nf 6002 6215 1259\nf 111 6216 6110\nf 6216 110 6217\nf 6110 6217 112\nf 113 6218 6220\nf 6218 1294 6219\nf 6220 6219 1309\nf 1309 6221 6223\nf 6221 109 6222\nf 6223 6222 1310\nf 1311 6224 6226\nf 6224 164 6225\nf 6226 6225 1312\nf 25 6227 6229\nf 6227 1308 6228\nf 6229 6228 1313\nf 1313 6230 6232\nf 6230 165 6231\nf 6232 6231 1314\nf 1259 6233 6235\nf 6233 1313 6234\nf 6235 6234 129\nf 24 6003 6237\nf 6003 1259 6236\nf 6237 6236 127\nf 1292 6238 6240\nf 6238 1315 6239\nf 6240 6239 1293\nf 1315 6241 6243\nf 6241 1316 6242\nf 6243 6242 1317\nf 1317 6244 6246\nf 6244 1318 6245\nf 6246 6245 109\nf 1318 6247 6249\nf 6247 1319 6248\nf 6249 6248 1320\nf 1320 6250 6252\nf 6250 1321 6251\nf 6252 6251 1310\nf 1321 6253 6255\nf 6253 1322 6254\nf 6255 6254 1323\nf 1323 6256 6258\nf 6256 1324 6257\nf 6258 6257 1312\nf 1324 6259 6261\nf 6259 1325 6260\nf 6261 6260 1314\nf 1325 6262 6264\nf 6262 1326 6263\nf 6264 6263 1327\nf 1327 6265 6136\nf 6265 1328 6266\nf 6136 6266 5953\nf 1328 6267 6269\nf 6267 1329 6268\nf 6269 6268 1330\nf 126 6270 6272\nf 6270 1330 6271\nf 6272 6271 1331\nf 97 6273 6089\nf 6273 95 6274\nf 6089 6274 96\nf 94 6275 6277\nf 6275 2747 6276\nf 6277 6276 2745\nf 1286 6278 6280\nf 6278 1332 6279\nf 6280 6279 5943\nf 1333 6281 6283\nf 6281 1334 6282\nf 6283 6282 101\nf 101 6282 6285\nf 6282 1334 6284\nf 6285 6284 1335\nf 1335 6286 6288\nf 6286 1336 6287\nf 6288 6287 1288\nf 103 6289 6291\nf 6289 1336 6290\nf 6291 6290 1337\nf 1337 6292 6294\nf 6292 1338 6293\nf 6294 6293 3932\nf 3932 6295 6297\nf 6295 1340 6296\nf 6297 6296 1316\nf 1340 6298 6300\nf 6298 4801 6299\nf 6300 6299 1342\nf 1342 6301 6303\nf 6301 1343 6302\nf 6303 6302 1319\nf 1343 6304 6306\nf 6304 1344 6305\nf 6306 6305 1345\nf 1345 6307 6309\nf 6307 1346 6308\nf 6309 6308 1322\nf 168 6310 6312\nf 6310 1347 6311\nf 6312 6311 169\nf 1347 6313 6315\nf 6313 1348 6314\nf 6315 6314 1349\nf 1349 6316 6318\nf 6316 1350 6317\nf 6318 6317 1326\nf 1350 6319 6321\nf 6319 1351 6320\nf 6321 6320 1352\nf 1352 6322 6324\nf 6322 1353 6323\nf 6324 6323 1329\nf 1353 6325 6327\nf 6325 135 6326\nf 6327 6326 1354\nf 174 6328 6330\nf 6328 4950 6329\nf 6330 6329 1364\nf 1364 6331 6333\nf 6331 1365 6332\nf 6333 6332 1341\nf 1365 6334 6336\nf 6334 1366 6335\nf 6336 6335 1344\nf 176 6337 6339\nf 6337 1366 6338\nf 6339 6338 1367\nf 177 6340 6342\nf 6340 1367 6341\nf 6342 6341 1368\nf 1368 6343 6345\nf 6343 1369 6344\nf 6345 6344 1348\nf 1351 6346 6348\nf 6346 1369 6347\nf 6348 6347 1370\nf 178 6349 6351\nf 6349 1370 6350\nf 6351 6350 1371\nf 178 6352 6354\nf 6352 1372 6353\nf 6354 6353 135\nf 1296 6355 6357\nf 6355 1372 6356\nf 6357 6356 1373\nf 1296 6358 6360\nf 6358 1375 6359\nf 6360 6359 1374\nf 1375 6361 6359\nf 6361 1376 6000\nf 6359 6000 1374\nf 1376 6362 6364\nf 6362 138 6363\nf 6364 6363 1297\nf 193 6365 6367\nf 6365 2757 6366\nf 6367 6366 2758\nf 195 6368 6370\nf 6368 2758 6369\nf 6370 6369 2759\nf 2766 6371 6373\nf 6371 202 6372\nf 6373 6372 200\nf 1270 6374 6376\nf 6374 61 6375\nf 6376 6375 4802\nf 1393 6377 6379\nf 6377 55 6378\nf 6379 6378 1394\nf 205 6380 6382\nf 6380 1394 6381\nf 6382 6381 2769\nf 2834 6383 6385\nf 6383 1396 6384\nf 6385 6384 208\nf 1397 6386 6388\nf 6386 50 6387\nf 6388 6387 1396\nf 1399 6389 6391\nf 6389 1397 6390\nf 6391 6390 2770\nf 52 6392 6394\nf 6392 49 6393\nf 6394 6393 2771\nf 206 6395 6397\nf 6395 2771 6396\nf 6397 6396 1401\nf 206 6397 6399\nf 6397 1401 6398\nf 6399 6398 1402\nf 205 6400 6402\nf 6400 1402 6401\nf 6402 6401 2772\nf 204 6403 6405\nf 6403 2772 6404\nf 6405 6404 2773\nf 5814 6406 6408\nf 6406 203 6407\nf 6408 6407 2773\nf 1406 6409 6411\nf 6409 5814 6410\nf 6411 6410 1405\nf 1276 6412 6414\nf 6412 1407 6413\nf 6414 6413 1597\nf 1407 6412 6063\nf 6412 1276 6415\nf 6063 6415 72\nf 2790 6416 6418\nf 6416 2789 6417\nf 6418 6417 1424\nf 144 6419 6421\nf 6419 2790 6420\nf 6421 6420 1425\nf 144 6421 6423\nf 6421 1425 6422\nf 6423 6422 1426\nf 145 6424 6169\nf 6424 1426 6425\nf 6169 6425 1427\nf 1428 6426 6428\nf 6426 3991 6427\nf 6428 6427 242\nf 1299 6429 6431\nf 6429 1429 6430\nf 6431 6430 146\nf 254 6432 6434\nf 6432 2796 6433\nf 6434 6433 2797\nf 4803 6435 6437\nf 6435 276 6436\nf 6437 6436 1449\nf 2807 6438 6440\nf 6438 4804 6439\nf 6440 6439 1451\nf 151 6441 6443\nf 6441 2807 6442\nf 6443 6442 2808\nf 152 6444 6446\nf 6444 2808 6445\nf 6446 6445 1453\nf 154 6447 6449\nf 6447 152 6448\nf 6449 6448 5941\nf 12 6450 6452\nf 6450 5941 6451\nf 6452 6451 5954\nf 1455 6453 6455\nf 6453 284 6454\nf 6455 6454 2809\nf 1456 6456 6458\nf 6456 2809 6457\nf 6458 6457 1304\nf 222 6459 6461\nf 6459 2814 6460\nf 6461 6460 2815\nf 148 6462 6464\nf 6462 2827 6463\nf 6464 6463 1477\nf 148 6464 6466\nf 6464 1477 6465\nf 6466 6465 1478\nf 14 6467 6469\nf 6467 1478 6468\nf 6469 6468 1479\nf 15 6470 6472\nf 6470 1479 6471\nf 6472 6471 1480\nf 1480 6473 6475\nf 6473 151 6474\nf 6475 6474 1302\nf 42 6476 6478\nf 6476 1481 6477\nf 6478 6477 1482\nf 288 6479 6481\nf 6479 2829 6480\nf 6481 6480 1486\nf 1487 6482 6484\nf 6482 46 6483\nf 6484 6483 47\nf 1488 6485 6487\nf 6485 48 6486\nf 6487 6486 2830\nf 1492 6488 6490\nf 6488 44 6489\nf 6490 6489 1265\nf 44 6491 6033\nf 6491 2830 6492\nf 6033 6492 1491\nf 290 6493 6495\nf 6493 1486 6494\nf 6495 6494 1493\nf 208 6496 6385\nf 6496 2833 6497\nf 6385 6497 2834\nf 255 6498 6500\nf 6498 2840 6499\nf 6500 6499 2841\nf 278 6501 6503\nf 6501 2849 6502\nf 6503 6502 1512\nf 278 6503 6505\nf 6503 1512 6504\nf 6505 6504 1513\nf 280 6506 6508\nf 6506 1513 6507\nf 6508 6507 1514\nf 281 6509 6511\nf 6509 1514 6510\nf 6511 6510 1515\nf 282 6512 6514\nf 6512 1515 6513\nf 6514 6513 1516\nf 283 6515 6517\nf 6515 1516 6516\nf 6517 6516 1517\nf 1517 6518 6520\nf 6518 36 6519\nf 6520 6519 1518\nf 160 6521 6523\nf 6521 1518 6522\nf 6523 6522 1519\nf 33 6524 6526\nf 6524 1519 6525\nf 6526 6525 1261\nf 2850 6527 6529\nf 6527 75 6528\nf 6529 6528 78\nf 1528 6530 6532\nf 6530 4063 6531\nf 6532 6531 1529\nf 313 6533 6535\nf 6533 2857 6534\nf 6535 6534 2858\nf 1537 6536 6538\nf 6536 4071 6537\nf 6538 6537 1538\nf 141 6539 6541\nf 6539 1538 6540\nf 6541 6540 1539\nf 20 6542 6544\nf 6542 1539 6543\nf 6544 6543 1540\nf 1540 6545 6547\nf 6545 1541 6546\nf 6547 6546 1255\nf 18 6548 6550\nf 6548 1541 6549\nf 6550 6549 1542\nf 18 6550 6552\nf 6550 1542 6551\nf 6552 6551 1543\nf 1278 6068 6554\nf 6068 2744 6553\nf 6554 6553 80\nf 186 6555 6557\nf 6555 4084 6556\nf 6557 6556 2871\nf 1552 6558 6560\nf 6558 4085 6559\nf 6560 6559 1553\nf 1559 6561 6563\nf 6561 4090 6562\nf 6563 6562 1560\nf 138 6564 6566\nf 6564 1560 6565\nf 6566 6565 1561\nf 1562 6567 6569\nf 6567 1257 6568\nf 6569 6568 2878\nf 1562 6570 6567\nf 6570 1563 5997\nf 6567 5997 1257\nf 1563 6570 6572\nf 6570 1562 6571\nf 6572 6571 1298\nf 1277 6573 6575\nf 6573 74 6574\nf 6575 6574 2879\nf 1572 6576 6578\nf 6576 5976 6577\nf 6578 6577 1570\nf 1572 6579 6581\nf 6579 2886 6580\nf 6581 6580 1573\nf 314 6582 6584\nf 6582 2887 6583\nf 6584 6583 1574\nf 17 6585 6587\nf 6585 2895 6586\nf 6587 6586 1583\nf 17 6587 6589\nf 6587 1583 6588\nf 6589 6588 1584\nf 1254 6590 5991\nf 6590 1585 6591\nf 5991 6591 16\nf 602 6592 6594\nf 6592 1603 6593\nf 6594 6593 1586\nf 1651 6595 6597\nf 6595 334 6596\nf 6597 6596 335\nf 1743 6598 6600\nf 6598 337 6599\nf 6600 6599 338\nf 1633 6601 6603\nf 6601 1744 6602\nf 6603 6602 1635\nf 342 6604 6606\nf 6604 343 6605\nf 6606 6605 1615\nf 86 6607 6609\nf 6607 2898 6608\nf 6609 6608 1280\nf 348 6610 6611\nf 6610 86 6072\nf 6611 6072 85\nf 349 6612 6614\nf 6612 1591 6613\nf 6614 6613 1590\nf 81 6615 6617\nf 6615 350 6616\nf 6617 6616 1592\nf 2899 6618 6620\nf 6618 1593 6619\nf 6620 6619 77\nf 351 6621 6623\nf 6621 2899 6622\nf 6623 6622 76\nf 4105 6624 6625\nf 6624 1278 6554\nf 6625 6554 80\nf 1595 6626 6628\nf 6626 4163 6627\nf 6628 6627 4091\nf 2900 6629 6631\nf 6629 70 6630\nf 6631 6630 354\nf 1597 6632 6414\nf 6632 4165 6633\nf 6414 6633 1276\nf 354 6634 6631\nf 6634 4166 6635\nf 6631 6635 2900\nf 2901 6636 6638\nf 6636 68 6637\nf 6638 6637 356\nf 4172 6639 6641\nf 6639 65 6640\nf 6641 6640 3965\nf 61 6374 6643\nf 6374 1270 6642\nf 6643 6642 1604\nf 359 6644 6646\nf 6644 566 6645\nf 6646 6645 360\nf 565 6647 6649\nf 6647 361 6648\nf 6649 6648 566\nf 536 6650 6652\nf 6650 364 6651\nf 6652 6651 361\nf 365 6653 6655\nf 6653 366 6654\nf 6655 6654 528\nf 1606 6656 6658\nf 6656 1769 6657\nf 6658 6657 1605\nf 1606 6658 6660\nf 6658 1605 6659\nf 6660 6659 1607\nf 1589 6661 6663\nf 6661 4107 6662\nf 6663 6662 1608\nf 345 6664 6666\nf 6664 370 6665\nf 6666 6665 371\nf 370 6667 6669\nf 6667 1609 6668\nf 6669 6668 1610\nf 371 6665 6670\nf 6665 370 6669\nf 6670 6669 1610\nf 372 6671 6673\nf 6671 373 6672\nf 6673 6672 1609\nf 1612 6674 6676\nf 6674 374 6675\nf 6676 6675 377\nf 375 6677 6678\nf 6677 374 6674\nf 6678 6674 1612\nf 376 6679 6680\nf 6679 375 6678\nf 6680 6678 1612\nf 1612 6676 6682\nf 6676 377 6681\nf 6682 6681 1611\nf 379 6683 6685\nf 6683 1872 6684\nf 6685 6684 1614\nf 1866 6686 6688\nf 6686 380 6687\nf 6688 6687 1614\nf 1614 6687 6685\nf 6687 380 6689\nf 6685 6689 379\nf 1614 6690 6688\nf 6690 381 6691\nf 6688 6691 1866\nf 1615 6605 6693\nf 6605 343 6692\nf 6693 6692 1866\nf 384 6694 6696\nf 6694 385 6695\nf 6696 6695 1616\nf 344 6697 6698\nf 6697 1616 6695\nf 6698 6695 385\nf 344 6698 6700\nf 6698 385 6699\nf 6700 6699 342\nf 344 6701 6703\nf 6701 382 6702\nf 6703 6702 2903\nf 344 6704 6697\nf 6704 1618 6705\nf 6697 6705 1616\nf 1617 6706 6708\nf 6706 1858 6707\nf 6708 6707 388\nf 1617 6709 6711\nf 6709 2903 6710\nf 6711 6710 2902\nf 389 6712 6714\nf 6712 390 6713\nf 6714 6713 391\nf 391 6713 6716\nf 6713 390 6715\nf 6716 6715 392\nf 393 6717 6719\nf 6717 1620 6718\nf 6719 6718 394\nf 389 6720 6722\nf 6720 393 6721\nf 6722 6721 395\nf 389 6722 6712\nf 6722 395 6723\nf 6712 6723 390\nf 397 6724 6726\nf 6724 1619 6725\nf 6726 6725 1621\nf 1620 6727 6729\nf 6727 5942 6728\nf 6729 6728 396\nf 395 6721 6730\nf 6721 393 6719\nf 6730 6719 394\nf 402 6731 6733\nf 6731 1621 6732\nf 6733 6732 1851\nf 1619 6734 6736\nf 6734 396 6735\nf 6736 6735 399\nf 401 6737 6739\nf 6737 402 6738\nf 6739 6738 403\nf 405 6740 6742\nf 6740 403 6741\nf 6742 6741 3082\nf 404 6743 6745\nf 6743 1623 6744\nf 6745 6744 1624\nf 406 6746 6748\nf 6746 3093 6747\nf 6748 6747 1625\nf 408 6749 6751\nf 6749 1626 6750\nf 6751 6750 1627\nf 414 6752 6754\nf 6752 412 6753\nf 6754 6753 413\nf 1909 6755 6757\nf 6755 413 6756\nf 6757 6756 3117\nf 416 6758 6760\nf 6758 1629 6759\nf 6760 6759 1630\nf 340 6761 6763\nf 6761 341 6762\nf 6763 6762 1631\nf 340 6763 6765\nf 6763 1631 6764\nf 6765 6764 1632\nf 1631 6766 6768\nf 6766 419 6767\nf 6768 6767 1745\nf 429 6769 6771\nf 6769 1764 6770\nf 6771 6770 1763\nf 1635 6772 6774\nf 6772 423 6773\nf 6774 6773 1636\nf 424 6775 6777\nf 6775 422 6776\nf 6777 6776 425\nf 421 6778 6780\nf 6778 1637 6779\nf 6780 6779 1634\nf 428 6781 6783\nf 6781 433 6782\nf 6783 6782 427\nf 1763 6784 6785\nf 6784 428 6783\nf 6785 6783 427\nf 1763 6785 6771\nf 6785 427 6786\nf 6771 6786 429\nf 435 6787 6789\nf 6787 430 6788\nf 6789 6788 431\nf 431 6788 6791\nf 6788 430 6790\nf 6791 6790 432\nf 431 6791 6793\nf 6791 432 6792\nf 6793 6792 426\nf 426 6792 6795\nf 6792 432 6794\nf 6795 6794 433\nf 428 6796 6781\nf 6796 426 6795\nf 6781 6795 433\nf 434 6797 6798\nf 6797 430 6787\nf 6798 6787 435\nf 434 6798 6800\nf 6798 435 6799\nf 6800 6799 436\nf 437 6801 6803\nf 6801 1729 6802\nf 6803 6802 5978\nf 439 6804 6805\nf 6804 437 6803\nf 6805 6803 5978\nf 1648 6806 6808\nf 6806 442 6807\nf 6808 6807 2904\nf 1656 6809 6811\nf 6809 1663 6810\nf 6811 6810 1641\nf 448 6812 6814\nf 6812 460 6813\nf 6814 6813 1642\nf 450 6815 6817\nf 6815 452 6816\nf 6817 6816 2905\nf 349 6818 6820\nf 6818 2898 6819\nf 6820 6819 4157\nf 1648 6808 6822\nf 6808 2904 6821\nf 6822 6821 1650\nf 334 6595 6824\nf 6595 1651 6823\nf 6824 6823 333\nf 445 6825 6827\nf 6825 1640 6826\nf 6827 6826 442\nf 1657 6828 6830\nf 6828 1654 6829\nf 6830 6829 2908\nf 1655 6831 6833\nf 6831 1647 6832\nf 6833 6832 4109\nf 1655 6834 6836\nf 6834 1732 6835\nf 6836 6835 2907\nf 447 6837 6839\nf 6837 444 6838\nf 6839 6838 1641\nf 1652 6840 6842\nf 6840 445 6841\nf 6842 6841 1656\nf 1658 6843 6845\nf 6843 445 6844\nf 6845 6844 1657\nf 1659 6846 6848\nf 6846 456 6847\nf 6848 6847 2909\nf 1660 6849 6851\nf 6849 2909 6850\nf 6851 6850 1655\nf 1670 6852 6854\nf 6852 446 6853\nf 6854 6853 461\nf 1663 6855 6857\nf 6855 1664 6856\nf 6857 6856 1665\nf 463 6858 6860\nf 6858 1667 6859\nf 6860 6859 1666\nf 1666 6861 6863\nf 6861 2914 6862\nf 6863 6862 1659\nf 1642 6813 6865\nf 6813 460 6864\nf 6865 6864 1670\nf 1681 6866 6868\nf 6866 1671 6867\nf 6868 6867 4125\nf 1671 6869 6871\nf 6869 461 6870\nf 6871 6870 1663\nf 5327 6872 6874\nf 6872 462 6873\nf 6874 6873 2914\nf 2915 6875 6877\nf 6875 463 6876\nf 6877 6876 2916\nf 1642 6865 6879\nf 6865 1670 6878\nf 6879 6878 1681\nf 1681 6880 6879\nf 6880 3154 6881\nf 6879 6881 1642\nf 1694 6882 6884\nf 6882 1696 6883\nf 6884 6883 1695\nf 1695 6883 6886\nf 6883 1696 6885\nf 6886 6885 490\nf 1703 6887 6889\nf 6887 491 6888\nf 6889 6888 4134\nf 428 6890 6892\nf 6890 1704 6891\nf 6892 6891 1706\nf 426 6893 6895\nf 6893 1706 6894\nf 6895 6894 1707\nf 431 6896 6789\nf 6896 1707 6897\nf 6789 6897 435\nf 1719 6898 6900\nf 6898 1721 6899\nf 6900 6899 1720\nf 1720 6899 6902\nf 6899 1721 6901\nf 6902 6901 507\nf 1724 6903 6905\nf 6903 506 6904\nf 6905 6904 4130\nf 1726 6906 6908\nf 6906 1725 6907\nf 6908 6907 509\nf 1728 6909 6911\nf 6909 508 6910\nf 6911 6910 4131\nf 510 6912 6914\nf 6912 1730 6913\nf 6914 6913 1729\nf 437 6915 6801\nf 6915 510 6914\nf 6801 6914 1729\nf 336 6916 6918\nf 6916 439 6917\nf 6918 6917 438\nf 2955 6919 6921\nf 6919 2956 6920\nf 6921 6920 4113\nf 2907 6835 6923\nf 6835 1732 6922\nf 6923 6922 1731\nf 506 6924 6904\nf 6924 1732 6925\nf 6904 6925 4130\nf 1733 6926 6928\nf 6926 4130 6927\nf 6928 6927 4109\nf 508 6929 6931\nf 6929 1723 6930\nf 6931 6930 1734\nf 1735 6932 6934\nf 6932 455 6933\nf 6934 6933 1648\nf 1727 6935 6937\nf 6935 1736 6936\nf 6937 6936 1729\nf 1729 6936 6939\nf 6936 1736 6938\nf 6939 6938 1638\nf 2969 6940 6942\nf 6940 5521 6941\nf 6942 6941 2970\nf 507 6943 6945\nf 6943 489 6944\nf 6945 6944 1722\nf 1737 6946 6948\nf 6946 4133 6947\nf 6948 6947 4128\nf 491 6949 6951\nf 6949 1737 6950\nf 6951 6950 1738\nf 1739 6952 6954\nf 6952 509 6953\nf 6954 6953 4129\nf 1702 6955 6957\nf 6955 1740 6956\nf 6957 6956 492\nf 492 6956 6959\nf 6956 1740 6958\nf 6959 6958 1741\nf 493 6960 6962\nf 6960 1741 6961\nf 6962 6961 1742\nf 338 6963 6600\nf 6963 1742 6964\nf 6600 6964 1743\nf 337 6598 6966\nf 6598 1743 6965\nf 6966 6965 336\nf 423 6967 6969\nf 6967 1744 6968\nf 6969 6968 1746\nf 512 6970 6972\nf 6970 2973 6971\nf 6972 6971 2971\nf 513 6973 6974\nf 6973 2971 6971\nf 6974 6971 2973\nf 5822 6975 6976\nf 6975 422 6775\nf 6976 6775 424\nf 1701 6977 6979\nf 6977 1767 6978\nf 6979 6978 490\nf 1768 6980 6981\nf 6980 423 6969\nf 6981 6969 1746\nf 490 6978 6983\nf 6978 1767 6982\nf 6983 6982 2986\nf 513 6984 6986\nf 6984 2991 6985\nf 6986 6985 2987\nf 1750 6987 6989\nf 6987 2990 6988\nf 6989 6988 2989\nf 3002 6990 6991\nf 6990 1605 6657\nf 6991 6657 1769\nf 367 6992 6994\nf 6992 368 6993\nf 6994 6993 3002\nf 1769 6995 6997\nf 6995 365 6996\nf 6997 6996 3003\nf 365 6655 6999\nf 6655 528 6998\nf 6999 6998 526\nf 527 7000 7002\nf 7000 367 7001\nf 7002 7001 3004\nf 364 6650 7004\nf 6650 536 7003\nf 7004 7003 1776\nf 529 7005 7007\nf 7005 1779 7006\nf 7007 7006 1770\nf 530 7008 7010\nf 7008 527 7009\nf 7010 7009 1778\nf 537 7011 7013\nf 7011 1776 7012\nf 7013 7012 1780\nf 362 7014 7015\nf 7014 536 6652\nf 7015 6652 361\nf 3023 7016 7018\nf 7016 3024 7017\nf 7018 7017 3025\nf 362 7019 7021\nf 7019 1801 7020\nf 7021 7020 1780\nf 565 7022 6647\nf 7022 362 7015\nf 6647 7015 361\nf 567 7023 7025\nf 7023 1801 7024\nf 7025 7024 1803\nf 359 7026 6644\nf 7026 565 6649\nf 6644 6649 566\nf 453 7027 7029\nf 7027 449 7028\nf 7029 7028 1644\nf 351 7030 6621\nf 7030 4160 7031\nf 6621 7031 2899\nf 352 7032 7034\nf 7032 4162 7033\nf 7034 7033 1596\nf 353 7035 7037\nf 7035 4164 7036\nf 7037 7036 3041\nf 3992 7038 7040\nf 7038 4167 7039\nf 7040 7039 1600\nf 569 7041 7043\nf 7041 3046 7042\nf 7043 7042 3047\nf 3056 7044 7045\nf 7044 64 6062\nf 7045 6062 1271\nf 360 7046 6646\nf 7046 1848 7047\nf 6646 7047 359\nf 4141 7048 7050\nf 7048 3057 7049\nf 7050 7049 3058\nf 552 7051 7053\nf 7051 4184 7052\nf 7053 7052 3065\nf 550 7054 7056\nf 7054 3066 7055\nf 7056 7055 3067\nf 553 7057 7059\nf 7057 3071 7058\nf 7059 7058 3072\nf 555 7060 7062\nf 7060 3074 7061\nf 7062 7061 3075\nf 561 7063 7065\nf 7063 583 7064\nf 7065 7064 4194\nf 3080 7066 7068\nf 7066 559 7067\nf 7068 7067 4193\nf 61 6643 7070\nf 6643 1604 7069\nf 7070 7069 1848\nf 1849 7071 7072\nf 7071 3082 6741\nf 7072 6741 403\nf 604 7073 7075\nf 7073 603 7074\nf 7075 7074 1850\nf 1850 7076 7077\nf 7076 403 6738\nf 7077 6738 402\nf 399 7078 7080\nf 7078 604 7079\nf 7080 7079 1851\nf 399 7080 7081\nf 7080 1851 6732\nf 7081 6732 1621\nf 400 7082 7083\nf 7082 402 6737\nf 7083 6737 401\nf 1852 7084 7086\nf 7084 1880 7085\nf 7086 7085 4805\nf 4806 7087 7089\nf 7087 5815 7088\nf 7089 7088 605\nf 1853 7090 7092\nf 7090 4805 7091\nf 7092 7091 3083\nf 1855 7093 7095\nf 7093 606 7094\nf 7095 7094 1854\nf 608 7096 7098\nf 7096 607 7097\nf 7098 7097 1855\nf 1855 7095 7100\nf 7095 1854 7099\nf 7100 7099 5942\nf 609 7101 7103\nf 7101 608 7102\nf 7103 7102 5955\nf 1856 7104 7105\nf 7104 393 6720\nf 7105 6720 389\nf 1857 7106 7108\nf 7106 610 7107\nf 7108 7107 5955\nf 1857 7109 7110\nf 7109 389 6714\nf 7110 6714 391\nf 1858 7111 7112\nf 7111 610 7106\nf 7112 7106 1857\nf 387 7113 7115\nf 7113 610 7114\nf 7115 7114 2902\nf 388 7116 7117\nf 7116 391 6716\nf 7117 6716 392\nf 606 7118 7119\nf 7118 5815 7087\nf 7119 7087 4806\nf 5816 7120 7122\nf 7120 611 7121\nf 7122 7121 1860\nf 1860 7123 7125\nf 7123 5815 7124\nf 7125 7124 607\nf 613 7126 7128\nf 7126 612 7127\nf 7128 7127 5816\nf 1861 7129 7130\nf 7129 607 7096\nf 7130 7096 608\nf 614 7131 7133\nf 7131 613 7132\nf 7133 7132 1862\nf 1862 7134 7135\nf 7134 608 7101\nf 7135 7101 609\nf 615 7136 7138\nf 7136 614 7137\nf 7138 7137 1863\nf 1863 7139 7141\nf 7139 609 7140\nf 7141 7140 4807\nf 378 7142 7144\nf 7142 615 7143\nf 7144 7143 1864\nf 1865 7145 7147\nf 7145 4807 7146\nf 7147 7146 387\nf 381 7148 7149\nf 7148 378 7144\nf 7149 7144 1864\nf 1865 7147 7151\nf 7147 387 7150\nf 7151 7150 382\nf 381 7152 6691\nf 7152 1865 7153\nf 6691 7153 1866\nf 1866 7153 6693\nf 7153 1865 7154\nf 6693 7154 1615\nf 1867 7155 7157\nf 7155 3095 7156\nf 7157 7156 612\nf 1868 7158 7159\nf 7158 612 7126\nf 7159 7126 613\nf 1869 7160 7161\nf 7160 613 7131\nf 7161 7131 614\nf 376 7162 7164\nf 7162 373 7163\nf 7164 7163 3085\nf 1870 7165 7166\nf 7165 614 7136\nf 7166 7136 615\nf 375 6679 7168\nf 6679 376 7167\nf 7168 7167 1871\nf 1871 7169 7170\nf 7169 615 7142\nf 7170 7142 378\nf 374 6677 7172\nf 6677 375 7171\nf 7172 7171 1872\nf 1877 7173 7175\nf 7173 621 7174\nf 7175 7174 3087\nf 1878 7176 7178\nf 7176 3089 7177\nf 7178 7177 3088\nf 622 7179 7181\nf 7179 621 7180\nf 7181 7180 3091\nf 1881 7182 7184\nf 7182 626 7183\nf 7184 7183 3097\nf 3092 7185 7187\nf 7185 3090 7186\nf 7187 7186 623\nf 409 7188 7190\nf 7188 3093 7189\nf 7190 7189 3094\nf 4961 7191 7193\nf 7191 626 7192\nf 7193 7192 1884\nf 1625 7194 7196\nf 7194 1885 7195\nf 7196 7195 408\nf 345 7197 6664\nf 7197 1608 7198\nf 6664 7198 370\nf 370 7199 6667\nf 7199 1886 7200\nf 6667 7200 1609\nf 3089 7201 7203\nf 7201 611 7202\nf 7203 7202 3095\nf 3084 7204 7206\nf 7204 620 7205\nf 7206 7205 3096\nf 3087 7207 7209\nf 7207 605 7208\nf 7209 7208 1878\nf 1880 7210 7085\nf 7210 624 7211\nf 7085 7211 4805\nf 4806 7212 7214\nf 7212 622 7213\nf 7214 7213 1852\nf 626 7191 7183\nf 7191 4961 7215\nf 7183 7215 3097\nf 603 7216 7218\nf 7216 624 7217\nf 7218 7217 3098\nf 407 7219 7221\nf 7219 406 7220\nf 7221 7220 3099\nf 405 7222 7224\nf 7222 4961 7223\nf 7224 7223 1623\nf 346 7225 7227\nf 7225 1607 7226\nf 7227 7226 1589\nf 347 7228 7230\nf 7228 1887 7229\nf 7230 7229 1874\nf 1881 7231 7233\nf 7231 5972 7232\nf 7233 7232 3102\nf 623 7234 7236\nf 7234 630 7235\nf 7236 7235 3103\nf 409 7237 7239\nf 7237 631 7238\nf 7239 7238 1626\nf 632 7240 7242\nf 7240 1896 7241\nf 7242 7241 1895\nf 1905 7243 7245\nf 7243 3115 7244\nf 7245 7244 3114\nf 3121 7246 7248\nf 7246 3112 7247\nf 7248 7247 3116\nf 417 7249 7250\nf 7249 1909 6757\nf 7250 6757 3117\nf 411 7251 7253\nf 7251 1908 7252\nf 7253 7252 1628\nf 416 7254 7256\nf 7254 415 7255\nf 7256 7255 1909\nf 414 7257 7258\nf 7257 1909 7255\nf 7258 7255 415\nf 3121 7259 7261\nf 7259 3124 7260\nf 7261 7260 631\nf 3122 7262 7264\nf 7262 1902 7263\nf 7264 7263 639\nf 411 7265 7267\nf 7265 1895 7266\nf 7267 7266 3123\nf 417 7268 7270\nf 7268 1910 7269\nf 7270 7269 1629\nf 419 6766 7272\nf 6766 1631 7271\nf 7272 7271 3125\nf 640 7273 7275\nf 7273 3130 7274\nf 7275 7274 3126\nf 1905 7276 7278\nf 7276 3129 7277\nf 7278 7277 3128\nf 367 7279 7281\nf 7279 3140 7280\nf 7281 7280 3139\nf 474 7282 7284\nf 7282 3154 7283\nf 7284 7283 1804\nf 474 7285 7287\nf 7285 1643 7286\nf 7287 7286 451\n\nusemtl material_1\nf 5545 7288 7290\nf 7288 5539 7289\nf 7290 7289 4813\nf 4816 7291 7293\nf 7291 4817 7292\nf 7293 7292 4815\nf 3175 7294 7296\nf 7294 4234 7295\nf 7296 7295 4224\nf 1932 7297 7299\nf 7297 4221 7298\nf 7299 7298 4825\nf 1946 7300 7302\nf 7300 1936 7301\nf 7302 7301 3192\nf 374 7303 7305\nf 7303 5009 7304\nf 7305 7304 4830\nf 1959 7306 7308\nf 7306 1957 7307\nf 7308 7307 4831\nf 3208 7309 7311\nf 7309 3206 7310\nf 7311 7310 3204\nf 3212 7312 7314\nf 7312 1960 7313\nf 7314 7313 3211\nf 3212 7314 7316\nf 7314 3211 7315\nf 7316 7315 4832\n\nusemtl material_2\nf 3245 7317 7319\nf 7317 5817 7318\nf 7319 7318 4841\nf 3156 7320 7322\nf 7320 4843 7321\nf 7322 7321 4845\nf 3248 7323 7324\nf 7323 4843 7320\nf 7324 7320 3156\nf 3252 7325 7327\nf 7325 4847 7326\nf 7327 7326 1989\nf 5601 7328 7330\nf 7328 4278 7329\nf 7330 7329 4848\nf 4849 7331 7333\nf 7331 683 7332\nf 7333 7332 5606\nf 4309 7334 7336\nf 7334 4852 7335\nf 7336 7335 5118\nf 5614 7337 7339\nf 7337 2001 7338\nf 7339 7338 4855\nf 5105 7340 7342\nf 7340 4860 7341\nf 7342 7341 3274\nf 1295 6146 7344\nf 6146 133 7343\nf 7344 7343 5918\nf 3301 7345 7347\nf 7345 4870 7346\nf 7347 7346 4869\nf 4321 7348 7350\nf 7348 4871 7349\nf 7350 7349 3302\nf 4874 7351 7353\nf 7351 5645 7352\nf 7353 7352 4873\nf 4875 7354 7356\nf 7354 4328 7355\nf 7356 7355 3310\nf 3311 7357 7359\nf 7357 4875 7358\nf 7359 7358 4876\n\nusemtl material_3\nf 3315 7360 7362\nf 7360 4842 7361\nf 7362 7361 3318\nf 4879 7363 7364\nf 7363 114 6205\nf 7364 6205 115\nf 3326 7365 7367\nf 7365 5154 7366\nf 7367 7366 3328\nf 3329 7368 7370\nf 7368 5671 7369\nf 7370 7369 4882\nf 5163 7371 7373\nf 7371 3338 7372\nf 7373 7372 715\nf 4890 7374 7376\nf 7374 443 7375\nf 7376 7375 5692\nf 3360 7377 7379\nf 7377 5695 7378\nf 7379 7378 5698\nf 4895 7380 7382\nf 7380 5699 7381\nf 7382 7381 5702\nf 4372 7383 7385\nf 7383 451 7384\nf 7385 7384 449\nf 4897 7386 7388\nf 7386 449 7387\nf 7388 7387 5705\nf 5712 7389 7391\nf 7389 5221 7390\nf 7391 7390 3379\nf 3381 7392 7394\nf 7392 3407 7393\nf 7394 7393 4375\nf 5207 7395 7397\nf 7395 2080 7396\nf 7397 7396 3384\nf 87 7398 7400\nf 7398 5208 7399\nf 7400 7399 4902\nf 5718 7401 7403\nf 7401 740 7402\nf 7403 7402 741\nf 5722 7404 7406\nf 7404 745 7405\nf 7406 7405 4905\nf 5726 7407 7409\nf 7407 747 7408\nf 7409 7408 2088\nf 3407 7410 7412\nf 7410 3406 7411\nf 7412 7411 4908\n\nusemtl material_1\nf 706 7413 7415\nf 7413 2100 7414\nf 7415 7414 5982\nf 4878 7416 7418\nf 7416 5234 7417\nf 7418 7417 4909\nf 4911 7419 7421\nf 7419 5228 7420\nf 7421 7420 4808\nf 4912 7422 7424\nf 7422 3155 7423\nf 7424 7423 4913\nf 3421 7425 7427\nf 7425 5230 7426\nf 7427 7426 3419\nf 5963 7428 7430\nf 7428 756 7429\nf 7430 7429 5241\nf 400 7431 7433\nf 7431 5746 7432\nf 7433 7432 5748\nf 4922 7434 7436\nf 7434 4921 7435\nf 7436 7435 3440\nf 3445 7437 7439\nf 7437 4924 7438\nf 7439 7438 3444\nf 3451 7440 7442\nf 7440 3426 7441\nf 7442 7441 4928\nf 5783 7443 7445\nf 7443 4931 7444\nf 7445 7444 4932\nf 3469 7446 7448\nf 7446 5304 7447\nf 7448 7447 4936\nf 4938 7449 7451\nf 7449 2141 7450\nf 7451 7450 5296\nf 4939 7452 7454\nf 7452 777 7453\nf 7454 7453 5805\nf 2148 7455 7457\nf 7455 5802 7456\nf 7457 7456 4942\n\nusemtl material_4\nf 759 7458 7460\nf 7458 2204 7459\nf 7460 7459 2152\nf 2302 7461 7463\nf 7461 766 7462\nf 7463 7462 784\nf 2142 7464 7466\nf 7464 773 7465\nf 7466 7465 5974\nf 4502 7467 7469\nf 7467 3481 7468\nf 7469 7468 786\nf 656 7470 7472\nf 7470 788 7471\nf 7472 7471 659\nf 663 7473 7475\nf 7473 1958 7474\nf 7475 7474 789\nf 2353 7476 7478\nf 7476 2205 7477\nf 7478 7477 2154\nf 660 7479 7481\nf 7479 792 7480\nf 7481 7480 661\nf 641 7482 7484\nf 7482 749 7483\nf 7484 7483 2155\nf 660 7485 7486\nf 7485 641 7484\nf 7486 7484 2155\nf 2206 7487 7489\nf 7487 792 7488\nf 7489 7488 855\nf 789 7490 7475\nf 7490 3483 7491\nf 7475 7491 663\nf 2158 7492 7494\nf 7492 654 7493\nf 7494 7493 2159\nf 647 7495 7497\nf 7495 3609 7496\nf 7497 7496 2159\nf 664 7498 7499\nf 7498 3609 7495\nf 7499 7495 647\nf 3547 7500 7502\nf 7500 2158 7501\nf 7502 7501 2160\nf 659 7471 7504\nf 7471 788 7503\nf 7504 7503 798\nf 658 7505 7507\nf 7505 798 7506\nf 7507 7506 2162\nf 658 7508 7505\nf 7508 659 7504\nf 7505 7504 798\nf 2162 7509 7511\nf 7509 799 7510\nf 7511 7510 2163\nf 673 7512 7514\nf 7512 2164 7513\nf 7514 7513 2165\nf 2165 7515 7517\nf 7515 801 7516\nf 7517 7516 5311\nf 4459 7518 7519\nf 7518 2165 7517\nf 7519 7517 5311\nf 807 7520 7522\nf 7520 808 7521\nf 7522 7521 809\nf 810 7523 7525\nf 7523 3528 7524\nf 7525 7524 812\nf 2305 7526 7528\nf 7526 2170 7527\nf 7528 7527 4538\nf 815 7529 7531\nf 7529 2324 7530\nf 7531 7530 816\nf 819 7532 7534\nf 7532 818 7533\nf 7534 7533 820\nf 830 7535 7537\nf 7535 829 7536\nf 7537 7536 4945\nf 832 7538 7540\nf 7538 2178 7539\nf 7540 7539 2179\nf 831 7541 7543\nf 7541 2179 7542\nf 7543 7542 2177\nf 2180 7544 7546\nf 7544 732 7545\nf 7546 7545 2178\nf 730 7547 7549\nf 7547 731 7548\nf 7549 7548 2181\nf 5312 7550 7552\nf 7550 834 7551\nf 7552 7551 2182\nf 2182 7553 7555\nf 7553 835 7554\nf 7555 7554 2183\nf 2069 7556 7558\nf 7556 2183 7557\nf 7558 7557 2184\nf 2184 7559 7558\nf 7559 2186 7560\nf 7558 7560 2069\nf 2184 7561 7559\nf 7561 2185 7562\nf 7559 7562 2186\nf 726 7563 7565\nf 7563 837 7564\nf 7565 7564 838\nf 725 7566 7567\nf 7566 726 7565\nf 7567 7565 838\nf 723 7568 7570\nf 7568 839 7569\nf 7570 7569 2189\nf 725 7571 7573\nf 7571 4946 7572\nf 7573 7572 724\nf 838 7574 7567\nf 7574 4946 7571\nf 7567 7571 725\nf 2188 7575 7577\nf 7575 2189 7576\nf 7577 7576 840\nf 723 7578 7568\nf 7578 2187 7579\nf 7568 7579 839\nf 2187 7578 7581\nf 7578 723 7580\nf 7581 7580 5919\nf 840 7582 7577\nf 7582 2191 7583\nf 7577 7583 2188\nf 2192 7584 7586\nf 7584 2193 7585\nf 7586 7585 5968\nf 2191 7587 7589\nf 7587 5968 7588\nf 7589 7588 2190\nf 710 7590 7592\nf 7590 2194 7591\nf 7592 7591 2049\nf 754 7593 7595\nf 7593 753 7594\nf 7595 7594 2195\nf 844 7596 7597\nf 7596 2195 7594\nf 7597 7594 753\nf 4463 7598 7600\nf 7598 2197 7599\nf 7600 7599 2196\nf 2197 7601 7603\nf 7601 2198 7602\nf 7603 7602 2045\nf 2198 7604 7606\nf 7604 752 7605\nf 7606 7605 2100\nf 2199 7607 7609\nf 7607 2214 7608\nf 7609 7608 770\nf 2199 7609 7611\nf 7609 770 7610\nf 7611 7610 755\nf 845 7612 7614\nf 7612 787 7613\nf 7614 7613 2199\nf 3488 7615 7617\nf 7615 846 7616\nf 7617 7616 771\nf 2201 7618 7620\nf 7618 778 7619\nf 7620 7619 2200\nf 777 7621 7623\nf 7621 2200 7622\nf 7623 7622 779\nf 785 7624 7625\nf 7624 2200 7621\nf 7625 7621 777\nf 2202 7626 7628\nf 7626 774 7627\nf 7628 7627 848\nf 778 7618 7630\nf 7618 2201 7629\nf 7630 7629 5819\nf 2446 7631 7633\nf 7631 776 7632\nf 7633 7632 850\nf 850 7632 7635\nf 7632 776 7634\nf 7635 7634 775\nf 774 7626 7637\nf 7626 2202 7636\nf 7637 7636 2137\nf 766 7638 7462\nf 7638 767 7639\nf 7462 7639 784\nf 784 7639 7641\nf 7639 767 7640\nf 7641 7640 2203\nf 783 7642 7644\nf 7642 3603 7643\nf 7644 7643 763\nf 783 7644 7646\nf 7644 763 7645\nf 7646 7645 764\nf 783 7646 7648\nf 7646 764 7647\nf 7648 7647 2304\nf 782 7649 7651\nf 7649 2105 7650\nf 7651 7650 2349\nf 2322 7652 7654\nf 7652 756 7653\nf 7654 7653 782\nf 761 7655 7656\nf 7655 2349 7650\nf 7656 7650 2105\nf 780 7657 7659\nf 7657 2152 7658\nf 7659 7658 854\nf 854 7658 7660\nf 7658 2152 7459\nf 7660 7459 2204\nf 751 7661 7663\nf 7661 750 7662\nf 7663 7662 781\nf 781 7662 7665\nf 7662 750 7664\nf 7665 7664 760\nf 781 7665 7667\nf 7665 760 7666\nf 7667 7666 2152\nf 2205 7668 7670\nf 7668 1956 7669\nf 7670 7669 2206\nf 793 7671 7672\nf 7671 2206 7489\nf 7672 7489 855\nf 792 7487 7480\nf 7487 2206 7673\nf 7480 7673 661\nf 3487 7674 7675\nf 7674 751 7663\nf 7675 7663 781\nf 710 7676 7678\nf 7676 715 7677\nf 7678 7677 842\nf 2207 7679 7681\nf 7679 2208 7680\nf 7681 7680 4462\nf 2208 7682 7684\nf 7682 2210 7683\nf 7684 7683 2196\nf 2210 7685 7687\nf 7685 2211 7686\nf 7687 7686 2212\nf 2212 7688 7690\nf 7688 2213 7689\nf 7690 7689 2195\nf 2213 7691 7692\nf 7691 845 7614\nf 7692 7614 2199\nf 2127 7693 7694\nf 7693 770 7608\nf 7694 7608 2214\nf 2214 7695 7697\nf 7695 2215 7696\nf 7697 7696 3488\nf 2215 7698 7700\nf 7698 787 7699\nf 7700 7699 2216\nf 2216 7701 7703\nf 7701 2217 7702\nf 7703 7702 2218\nf 2217 7704 7706\nf 7704 4464 7705\nf 7706 7705 2219\nf 2219 7707 7709\nf 7707 2221 7708\nf 7709 7708 4947\nf 2221 7710 7712\nf 7710 2209 7711\nf 7712 7711 3489\nf 2222 7713 7715\nf 7713 3489 7714\nf 7715 7714 2223\nf 2223 7716 7718\nf 7716 841 7717\nf 7718 7717 3490\nf 2224 7719 7721\nf 7719 3490 7720\nf 7721 7720 2225\nf 2226 7722 7724\nf 7722 840 7723\nf 7724 7723 839\nf 2226 7724 7726\nf 7724 839 7725\nf 7726 7725 2227\nf 2227 7727 7729\nf 7727 4946 7728\nf 7729 7728 2228\nf 2228 7730 7732\nf 7730 838 7731\nf 7732 7731 2229\nf 727 7733 7734\nf 7733 837 7563\nf 7734 7563 726\nf 831 7735 7737\nf 7735 829 7736\nf 7737 7736 2230\nf 827 7738 7740\nf 7738 3493 7739\nf 7740 7739 2176\nf 2230 7741 7742\nf 7741 2176 7739\nf 7742 7739 3493\nf 3495 7743 7745\nf 7743 865 7744\nf 7745 7744 3496\nf 3497 7746 7748\nf 7746 3496 7747\nf 7748 7747 866\nf 4479 7749 7751\nf 7749 3504 7750\nf 7751 7750 2240\nf 2220 7752 7754\nf 7752 3505 7753\nf 7754 7753 4480\nf 4480 7755 7754\nf 7755 2241 7756\nf 7754 7756 2220\nf 858 7757 7759\nf 7757 2241 7758\nf 7759 7758 2242\nf 857 7760 7762\nf 7760 2242 7761\nf 7762 7761 2243\nf 2243 7763 7765\nf 7763 2244 7764\nf 7765 7764 2245\nf 2245 7766 7768\nf 7766 2246 7767\nf 7768 7767 846\nf 2246 7769 7771\nf 7769 2247 7770\nf 7771 7770 772\nf 772 7770 7773\nf 7770 2247 7772\nf 7773 7772 2134\nf 3507 7774 7776\nf 7774 825 7775\nf 7776 7775 3508\nf 4499 7777 7779\nf 7777 2251 7778\nf 7779 7778 2252\nf 4500 7780 7782\nf 7780 3520 7781\nf 7782 7781 2253\nf 2253 7783 7785\nf 7783 3521 7784\nf 7785 7784 2254\nf 2153 7786 7788\nf 7786 4503 7787\nf 7788 7787 847\nf 891 7789 7791\nf 7789 3522 7790\nf 7791 7790 3523\nf 896 7792 7794\nf 7792 3524 7793\nf 7794 7793 3525\nf 3528 7795 7797\nf 7795 2261 7796\nf 7797 7796 2262\nf 811 7798 7799\nf 7798 812 7524\nf 7799 7524 3528\nf 4512 7800 7802\nf 7800 811 7801\nf 7802 7801 3529\nf 901 7803 7805\nf 7803 3545 7804\nf 7805 7804 3546\nf 2279 7806 7808\nf 7806 788 7807\nf 7808 7807 2161\nf 2161 7809 7810\nf 7809 2158 7500\nf 7810 7500 3547\nf 797 7811 7812\nf 7811 3547 7502\nf 7812 7502 2160\nf 1040 7813 7815\nf 7813 3549 7814\nf 7815 7814 3548\nf 928 7816 7818\nf 7816 3558 7817\nf 7818 7817 2291\nf 2293 7819 7821\nf 7819 3559 7820\nf 7821 7820 2294\nf 932 7822 7824\nf 7822 3560 7823\nf 7824 7823 2295\nf 3563 7825 7827\nf 7825 3562 7826\nf 7827 7826 2298\nf 3564 7828 7830\nf 7828 3563 7829\nf 7830 7829 2299\nf 939 7831 7833\nf 7831 3564 7832\nf 7833 7832 3565\nf 784 7834 7836\nf 7834 3566 7835\nf 7836 7835 2301\nf 784 7836 7463\nf 7836 2301 7837\nf 7463 7837 2302\nf 2303 7838 7840\nf 7838 4537 7839\nf 7840 7839 942\nf 765 7841 7843\nf 7841 2302 7842\nf 7843 7842 2303\nf 2303 7840 7845\nf 7840 942 7844\nf 7845 7844 2304\nf 765 7846 7847\nf 7846 2304 7647\nf 7847 7647 764\nf 943 7848 7850\nf 7848 815 7849\nf 7850 7849 4539\nf 2315 7851 7853\nf 7851 3573 7852\nf 7853 7852 2314\nf 978 7854 7856\nf 7854 3580 7855\nf 7856 7855 3581\nf 852 7857 7859\nf 7857 3582 7858\nf 7859 7858 3583\nf 782 7860 7862\nf 7860 3583 7861\nf 7862 7861 4556\nf 2323 7863 7865\nf 7863 983 7864\nf 7865 7864 853\nf 2323 7865 7867\nf 7865 853 7866\nf 7867 7866 2204\nf 4558 7868 7870\nf 7868 817 7869\nf 7870 7869 4557\nf 927 7871 7873\nf 7871 3592 7872\nf 7873 7872 2334\nf 2335 7874 7876\nf 7874 3593 7875\nf 7876 7875 2336\nf 3599 7877 7879\nf 7877 3598 7878\nf 7879 7878 2343\nf 942 7880 7882\nf 7880 3600 7881\nf 7882 7881 3601\nf 783 7883 7642\nf 7883 2346 7884\nf 7642 7884 3603\nf 3603 7885 7887\nf 7885 3602 7886\nf 7887 7886 2347\nf 2115 7888 7890\nf 7888 3603 7889\nf 7890 7889 2348\nf 2348 7891 7892\nf 7891 2349 7655\nf 7892 7655 761\nf 2350 7893 7895\nf 7893 3604 7894\nf 7895 7894 2351\nf 2351 7896 7898\nf 7896 2157 7897\nf 7898 7897 2352\nf 2352 7897 7900\nf 7897 2157 7899\nf 7900 7899 2353\nf 791 7901 7903\nf 7901 2352 7902\nf 7903 7902 2154\nf 794 7904 7905\nf 7904 2351 7894\nf 7905 7894 3604\nf 2350 7906 7893\nf 7906 2354 7907\nf 7893 7907 3604\nf 3482 7908 7910\nf 7908 987 7909\nf 7910 7909 3605\nf 2356 7911 7913\nf 7911 2354 7912\nf 7913 7912 2355\nf 2356 7913 7915\nf 7913 2355 7914\nf 7915 7914 3606\nf 2357 7916 7918\nf 7916 3607 7917\nf 7918 7917 3606\nf 990 7919 7921\nf 7919 2358 7920\nf 7921 7920 3607\nf 993 7922 7924\nf 7922 5843 7923\nf 7924 7923 3608\nf 890 7925 7927\nf 7925 993 7926\nf 7927 7926 2361\nf 3482 7928 7908\nf 7928 794 7929\nf 7908 7929 987\nf 2362 7930 7932\nf 7930 3610 7931\nf 7932 7931 2363\nf 3611 7933 7935\nf 7933 3610 7934\nf 7935 7934 2356\nf 4581 7936 7938\nf 7936 3611 7937\nf 7938 7937 2364\nf 2365 7939 7941\nf 7939 3612 7940\nf 7941 7940 2366\nf 890 7927 7943\nf 7927 2361 7942\nf 7943 7942 3522\nf 812 7944 7946\nf 7944 2368 7945\nf 7946 7945 2169\nf 2368 7947 7945\nf 7947 2367 7948\nf 7945 7948 2169\nf 945 7949 7951\nf 7949 4538 7950\nf 7951 7950 3614\nf 3624 7952 7954\nf 7952 3623 7953\nf 7954 7953 2383\nf 3625 7955 7957\nf 7955 3624 7956\nf 7957 7956 2384\nf 3628 7958 7960\nf 7958 3627 7959\nf 7960 7959 2386\nf 780 7961 7963\nf 7961 790 7962\nf 7963 7962 2389\nf 781 7964 7966\nf 7964 2389 7965\nf 7966 7965 2390\nf 1021 7967 7969\nf 7967 4615 7968\nf 7969 7968 2405\nf 1025 7970 7972\nf 7970 3643 7971\nf 7972 7971 2407\nf 2173 7973 7975\nf 7973 2409 7974\nf 7975 7974 2174\nf 3656 7976 7978\nf 7976 1018 7977\nf 7978 7977 3657\nf 4630 7979 7981\nf 7979 3658 7980\nf 7981 7980 2420\nf 785 7982 7984\nf 7982 4632 7983\nf 7984 7983 2423\nf 2200 7985 7620\nf 7985 2423 7986\nf 7620 7986 2201\nf 1026 7987 7989\nf 7987 849 7988\nf 7989 7988 3660\nf 848 7990 7628\nf 7990 2424 7991\nf 7628 7991 2202\nf 819 7992 7994\nf 7992 3661 7993\nf 7994 7993 2425\nf 2440 7995 7997\nf 7995 3673 7996\nf 7997 7996 2441\nf 2442 7998 8000\nf 7998 1024 7999\nf 8000 7999 3674\nf 850 8001 8003\nf 8001 3676 8002\nf 8003 8002 2445\nf 850 8003 7633\nf 8003 2445 8004\nf 7633 8004 2446\nf 2446 8005 8007\nf 8005 3677 8006\nf 8007 8006 2447\nf 2447 8008 8010\nf 8008 851 8009\nf 8010 8009 2203\nf 1028 8011 8013\nf 8011 2449 8012\nf 8013 8012 2448\nf 648 8014 8016\nf 8014 1032 8015\nf 8016 8015 649\nf 741 7402 8018\nf 7402 740 8017\nf 8018 8017 2500\nf 2177 8019 8021\nf 8019 2500 8020\nf 8021 8020 4945\nf 4661 8022 8024\nf 8022 2176 8023\nf 8024 8023 2452\nf 830 8025 7535\nf 8025 2452 8026\nf 7535 8026 829\nf 826 8027 8029\nf 8027 827 8028\nf 8029 8028 1036\nf 2172 8030 8032\nf 8030 2392 8031\nf 8032 8031 4754\nf 4785 8033 8035\nf 8033 2425 8034\nf 8035 8034 2454\nf 3830 8036 8038\nf 8036 813 8037\nf 8038 8037 1041\nf 1042 8039 8040\nf 8039 807 7522\nf 8040 7522 809\nf 4746 8041 8043\nf 8041 810 8042\nf 8043 8042 2169\nf 2273 8044 8046\nf 8044 3538 8045\nf 8046 8045 2458\nf 668 8047 8049\nf 8047 669 8048\nf 8049 8048 2459\nf 2460 8050 8052\nf 8050 1045 8051\nf 8052 8051 2461\nf 1047 8053 8055\nf 8053 657 8054\nf 8055 8054 2463\nf 1047 8056 8053\nf 8056 648 8057\nf 8053 8057 657\nf 2464 8058 8060\nf 8058 650 8059\nf 8060 8059 2465\nf 1049 8061 8063\nf 8061 1048 8062\nf 8063 8062 3680\nf 4650 8064 8066\nf 8064 653 8065\nf 8066 8065 1050\nf 1050 8065 8068\nf 8065 653 8067\nf 8068 8067 652\nf 1050 8068 8070\nf 8068 652 8069\nf 8070 8069 2466\nf 1048 8071 8073\nf 8071 2466 8072\nf 8073 8072 2464\nf 1051 8074 8076\nf 8074 3681 8075\nf 8076 8075 2467\nf 2450 8077 8079\nf 8077 645 8078\nf 8079 8078 1031\nf 2469 8080 8082\nf 8080 1933 8081\nf 8082 8081 4650\nf 3681 8083 8085\nf 8083 5319 8084\nf 8085 8084 4650\nf 642 8086 8088\nf 8086 2471 8087\nf 8088 8087 679\nf 643 8089 8090\nf 8089 2471 8086\nf 8090 8086 642\nf 1054 8091 8093\nf 8091 681 8092\nf 8093 8092 2690\nf 2690 8092 8095\nf 8092 681 8094\nf 8095 8094 680\nf 2473 8096 8098\nf 8096 683 8097\nf 8098 8097 682\nf 681 8099 8100\nf 8099 2473 8098\nf 8100 8098 682\nf 1054 8101 8091\nf 8101 2473 8099\nf 8091 8099 681\nf 2474 8102 8104\nf 8102 688 8103\nf 8104 8103 684\nf 1055 8105 8107\nf 8105 1056 8106\nf 8107 8106 2472\nf 1058 8108 8110\nf 8108 2002 8109\nf 8110 8109 688\nf 2475 8111 8113\nf 8111 2004 8112\nf 8113 8112 689\nf 2002 8114 8116\nf 8114 2476 8115\nf 8116 8115 689\nf 1057 8117 8118\nf 8117 2476 8114\nf 8118 8114 2002\nf 1061 8119 8121\nf 8119 1060 8120\nf 8121 8120 2478\nf 2478 8122 8124\nf 8122 692 8123\nf 8124 8123 691\nf 690 8125 8127\nf 8125 2479 8126\nf 8127 8126 691\nf 693 8128 8130\nf 8128 1062 8129\nf 8130 8129 694\nf 694 8129 8132\nf 8129 1062 8131\nf 8132 8131 2480\nf 1063 8133 8135\nf 8133 2480 8134\nf 8135 8134 3771\nf 697 8136 8138\nf 8136 1064 8137\nf 8138 8137 1065\nf 701 8139 8140\nf 8139 697 8138\nf 8140 8138 1065\nf 702 8141 8143\nf 8141 2030 8142\nf 8143 8142 2482\nf 5946 8144 8146\nf 8144 1068 8145\nf 8146 8145 3723\nf 1070 8147 8149\nf 8147 2487 8148\nf 8149 8148 685\nf 687 8150 8151\nf 8150 685 8148\nf 8151 8148 2487\nf 2488 8152 8154\nf 8152 1071 8153\nf 8154 8153 2508\nf 1982 8155 8157\nf 8155 5983 8156\nf 8157 8156 676\nf 2489 8158 8160\nf 8158 1072 8159\nf 8160 8159 2490\nf 2491 8161 8162\nf 8161 1072 8158\nf 8162 8158 2489\nf 2504 8163 8165\nf 8163 712 8164\nf 8165 8164 1028\nf 711 8166 8168\nf 8166 2449 8167\nf 8168 8167 2054\nf 1074 8169 8171\nf 8169 2494 8170\nf 8171 8170 2495\nf 743 8172 8174\nf 8172 742 8173\nf 8174 8173 2495\nf 1074 8171 8176\nf 8171 2495 8175\nf 8176 8175 721\nf 3682 8177 8179\nf 8177 2496 8178\nf 8179 8178 2492\nf 2498 8180 8182\nf 8180 2497 8181\nf 8182 8181 745\nf 1075 8183 8185\nf 8183 2523 8184\nf 8185 8184 2498\nf 743 8186 8188\nf 8186 2498 8187\nf 8188 8187 744\nf 1075 8185 8189\nf 8185 2498 8186\nf 8189 8186 743\nf 2527 8190 8192\nf 8190 1076 8191\nf 8192 8191 4949\nf 1035 8193 8195\nf 8193 2500 8194\nf 8195 8194 2501\nf 1077 8196 8198\nf 8196 2501 8197\nf 8198 8197 2502\nf 5320 8199 8201\nf 8199 736 8200\nf 8201 8200 3683\nf 2527 8192 8203\nf 8192 4949 8202\nf 8203 8202 2499\nf 3684 8204 8206\nf 8204 2503 8205\nf 8206 8205 2504\nf 3686 8207 8209\nf 8207 3685 8208\nf 8209 8208 2505\nf 3686 8210 8212\nf 8210 2448 8211\nf 8212 8211 2507\nf 2507 8213 8215\nf 8213 2508 8214\nf 8215 8214 1080\nf 2508 8216 8154\nf 8216 2490 8217\nf 8154 8217 2488\nf 678 8218 8220\nf 8218 1072 8219\nf 8220 8219 677\nf 4652 8221 8223\nf 8221 4653 8222\nf 8223 8222 3687\nf 4655 8224 8226\nf 8224 4654 8225\nf 8226 8225 3688\nf 2493 8227 8229\nf 8227 2506 8228\nf 8229 8228 2516\nf 2493 8230 8232\nf 8230 2517 8231\nf 8232 8231 1073\nf 2518 8233 8235\nf 8233 2517 8234\nf 8235 8234 4658\nf 2518 8236 8238\nf 8236 2519 8237\nf 8238 8237 2520\nf 1074 8239 8241\nf 8239 2496 8240\nf 8241 8240 2520\nf 2520 8242 8244\nf 8242 2521 8243\nf 8244 8243 2494\nf 1075 8245 8247\nf 8245 2494 8246\nf 8247 8246 2522\nf 2523 8248 8250\nf 8248 2524 8249\nf 8250 8249 2497\nf 2525 8251 8253\nf 8251 746 8252\nf 8253 8252 2497\nf 2526 8254 8256\nf 8254 747 8255\nf 8256 8255 2525\nf 2088 8257 8259\nf 8257 2527 8258\nf 8259 8258 748\nf 3690 8260 8262\nf 8260 830 8261\nf 8262 8261 1035\nf 2528 8263 8265\nf 8263 3690 8264\nf 8265 8264 3691\nf 4663 8266 8268\nf 8266 3691 8267\nf 8268 8267 3692\nf 4664 8269 8271\nf 8269 3692 8270\nf 8271 8270 3693\nf 3695 8272 8274\nf 8272 1076 8273\nf 8274 8273 3696\nf 3696 8275 8277\nf 8275 1089 8276\nf 8277 8276 4660\nf 1097 8278 8280\nf 8278 3703 8279\nf 8280 8279 3704\nf 2514 8281 8283\nf 8281 2536 8282\nf 8283 8282 1083\nf 2537 8284 8286\nf 8284 3705 8285\nf 8286 8285 1082\nf 2537 8286 8288\nf 8286 1082 8287\nf 8288 8287 2512\nf 3706 8289 8291\nf 8289 1081 8290\nf 8291 8290 2511\nf 2541 8292 8294\nf 8292 3706 8293\nf 8294 8293 1069\nf 2541 8294 8296\nf 8294 1069 8295\nf 8296 8295 2486\nf 2023 8297 8299\nf 8297 2486 8298\nf 8299 8298 698\nf 2542 8300 8302\nf 8300 2023 8301\nf 8302 8301 699\nf 2175 8303 8305\nf 8303 826 8304\nf 8305 8304 2544\nf 3708 8306 8308\nf 8306 1090 8307\nf 8308 8307 3709\nf 3717 8309 8311\nf 8309 1097 8310\nf 8311 8310 3718\nf 3718 8312 8314\nf 8312 1098 8313\nf 8314 8313 3719\nf 3720 8315 8317\nf 8315 1099 8316\nf 8317 8316 3721\nf 5946 8146 8319\nf 8146 3723 8318\nf 8319 8318 2484\nf 699 8320 8322\nf 8320 2025 8321\nf 8322 8321 2543\nf 1118 8323 8325\nf 8323 3724 8324\nf 8325 8324 1113\nf 2561 8326 8328\nf 8326 3680 8327\nf 8328 8327 2465\nf 2465 8329 8330\nf 8329 649 8015\nf 8330 8015 1032\nf 1120 8331 8333\nf 8331 3727 8332\nf 8333 8332 3728\nf 1047 8334 8056\nf 8334 1032 8014\nf 8056 8014 648\nf 3729 8335 8337\nf 8335 1122 8336\nf 8337 8336 3730\nf 3731 8338 8340\nf 8338 1124 8339\nf 8340 8339 3732\nf 4746 8341 8041\nf 8341 2568 8342\nf 8041 8342 810\nf 2261 8343 8345\nf 8343 2569 8344\nf 8345 8344 809\nf 1129 8346 8348\nf 8346 3739 8347\nf 8348 8347 3740\nf 2577 8349 8351\nf 8349 805 8350\nf 8351 8350 2272\nf 1133 8352 8354\nf 8352 2578 8353\nf 8354 8353 2579\nf 2273 8355 8357\nf 8355 1033 8356\nf 8357 8356 2168\nf 1159 8358 8360\nf 8358 1157 8359\nf 8360 8359 2593\nf 2593 8361 8363\nf 8361 2592 8362\nf 8363 8362 2594\nf 2595 8364 8366\nf 8364 3758 8365\nf 8366 8365 3759\nf 2597 8367 8369\nf 8367 1165 8368\nf 8369 8368 3761\nf 3764 8370 8372\nf 8370 2597 8371\nf 8372 8371 3762\nf 3765 8373 8375\nf 8373 3814 8374\nf 8375 8374 5835\nf 2598 8376 8378\nf 8376 3764 8377\nf 8378 8377 3766\nf 2599 8379 8381\nf 8379 3768 8380\nf 8381 8380 3769\nf 2601 8382 8384\nf 8382 3771 8383\nf 8384 8383 1062\nf 2478 8385 8387\nf 8385 3772 8386\nf 8387 8386 2477\nf 1062 8388 8384\nf 8388 2477 8389\nf 8384 8389 2601\nf 2457 8390 8392\nf 8390 2456 8391\nf 8392 8391 3773\nf 1187 8393 8395\nf 8393 1185 8394\nf 8395 8394 4726\nf 1205 8396 8398\nf 8396 1203 8397\nf 8398 8397 3790\nf 2617 8399 8401\nf 8399 2616 8400\nf 8401 8400 3791\nf 1207 8402 8404\nf 8402 1205 8403\nf 8404 8403 3792\nf 2618 8405 8407\nf 8405 3791 8406\nf 8407 8406 3793\nf 1209 8408 8410\nf 8408 1207 8409\nf 8410 8409 3794\nf 2619 8411 8413\nf 8411 3793 8412\nf 8413 8412 3795\nf 1211 8414 8416\nf 8414 1209 8415\nf 8416 8415 3796\nf 2620 8417 8419\nf 8417 3795 8418\nf 8419 8418 1059\nf 1212 8420 8422\nf 8420 1211 8421\nf 8422 8421 3797\nf 1057 8423 8117\nf 8423 1059 8424\nf 8117 8424 2476\nf 1213 8425 8427\nf 8425 1212 8426\nf 8427 8426 3798\nf 2622 8428 8430\nf 8428 1057 8429\nf 8430 8429 1058\nf 1056 8431 8433\nf 8431 1213 8432\nf 8433 8432 2623\nf 1056 8433 8435\nf 8433 2623 8434\nf 8435 8434 2474\nf 816 8436 8438\nf 8436 2171 8437\nf 8438 8437 2624\nf 5820 8439 8441\nf 8439 2633 8440\nf 8441 8440 2634\nf 1204 8442 8444\nf 8442 1202 8443\nf 8444 8443 2641\nf 3817 8445 8447\nf 8445 3816 8446\nf 8447 8446 5324\nf 1206 8448 8450\nf 8448 1204 8449\nf 8450 8449 3818\nf 2642 8451 8453\nf 8451 3817 8452\nf 8453 8452 3819\nf 1208 8454 8456\nf 8454 1206 8455\nf 8456 8455 3820\nf 2643 8457 8459\nf 8457 3821 8458\nf 8459 8458 1061\nf 1208 8460 8462\nf 8460 1210 8461\nf 8462 8461 3793\nf 2643 8459 8464\nf 8459 1061 8463\nf 8464 8463 2479\nf 2644 8465 8467\nf 8465 3824 8466\nf 8467 8466 3823\nf 1059 8468 8470\nf 8468 3824 8469\nf 8470 8469 2475\nf 690 8471 8125\nf 8471 2644 8472\nf 8125 8472 2479\nf 1053 8473 8475\nf 8473 643 8474\nf 8475 8474 644\nf 1053 8475 8477\nf 8475 644 8476\nf 8477 8476 2645\nf 2450 8478 8077\nf 8478 1928 8479\nf 8077 8479 645\nf 2647 8480 8482\nf 8480 2646 8481\nf 8482 8481 2450\nf 2647 8483 8485\nf 8483 1031 8484\nf 8485 8484 5319\nf 2649 8486 8488\nf 8486 2650 8487\nf 8488 8487 3825\nf 2468 8489 8491\nf 8489 2651 8490\nf 8491 8490 2648\nf 1051 8492 8494\nf 8492 2654 8493\nf 8494 8493 2649\nf 1219 8495 8497\nf 8495 2657 8496\nf 8497 8496 2652\nf 3826 8498 8499\nf 8498 1113 8324\nf 8499 8324 3724\nf 2661 8500 8502\nf 8500 3826 8501\nf 8502 8501 2659\nf 2657 8503 8505\nf 8503 3827 8504\nf 8505 8504 2655\nf 1050 8506 8066\nf 8506 2467 8507\nf 8066 8507 4650\nf 2665 8508 8510\nf 8508 2666 8509\nf 8510 8509 2667\nf 1123 8511 8513\nf 8511 4692 8512\nf 8513 8512 4751\nf 1121 8514 8516\nf 8514 1123 8515\nf 8516 8515 3837\nf 3850 8517 8519\nf 8517 2681 8518\nf 8519 8518 3851\nf 2683 8520 8522\nf 8520 2682 8521\nf 8522 8521 3853\nf 2684 8523 8525\nf 8523 3853 8524\nf 8525 8524 3855\nf 2685 8526 8528\nf 8526 3855 8527\nf 8528 8527 3857\nf 1217 8529 8531\nf 8529 1218 8530\nf 8531 8530 3858\nf 2686 8532 8534\nf 8532 3857 8533\nf 8534 8533 3859\nf 2688 8535 8537\nf 8535 3859 8536\nf 8537 8536 1055\nf 1215 8538 8540\nf 8538 1216 8539\nf 8540 8539 3861\nf 2688 8537 8542\nf 8537 1055 8541\nf 8542 8541 1054\nf 1214 8543 8545\nf 8543 1215 8544\nf 8545 8544 2689\nf 2689 8546 8547\nf 8546 1054 8093\nf 8547 8093 2690\nf 1052 8548 8549\nf 8548 1214 8545\nf 8549 8545 2689\nf 1052 8550 8552\nf 8550 2690 8551\nf 8552 8551 2470\nf 4754 8031 8554\nf 8031 2392 8553\nf 8554 8553 5975\nf 2703 8555 8557\nf 8555 3875 8556\nf 8557 8556 5811\nf 4768 8558 8560\nf 8558 1247 8559\nf 8560 8559 2704\nf 2706 8561 8563\nf 8561 3877 8562\nf 8563 8562 2707\nf 2708 8564 8566\nf 8564 3879 8565\nf 8566 8565 3878\nf 1065 8567 8569\nf 8567 3879 8568\nf 8569 8568 2482\nf 3881 8570 8572\nf 8570 1101 8571\nf 8572 8571 3882\nf 2721 8573 8575\nf 8573 3894 8574\nf 8575 8574 3895\nf 818 7532 8577\nf 7532 819 8576\nf 8577 8576 1039\nf 3898 8578 8580\nf 8578 1038 8579\nf 8580 8579 3899\nf 1164 8581 8583\nf 8581 1162 8582\nf 8583 8582 2739\nf 2739 8584 8586\nf 8584 3912 8585\nf 8586 8585 2740\nf 1166 8587 8589\nf 8587 1164 8588\nf 8589 8588 2740\nf 2740 8590 8592\nf 8590 4799 8591\nf 8592 8591 3913\nf 3914 8593 8595\nf 8593 3762 8594\nf 8595 8594 1166\nf 1169 8596 8598\nf 8596 1168 8597\nf 8598 8597 3916\nf 1169 8599 8601\nf 8599 1170 8600\nf 8601 8600 3766\nf 3918 8602 8604\nf 8602 3917 8603\nf 8604 8603 1064\nf 1063 8605 8607\nf 8605 1170 8606\nf 8607 8606 3919\n\nusemtl material_0\nf 3962 8608 8610\nf 8608 1 8609\nf 8610 8609 3920\nf 1385 8611 8613\nf 8611 2762 8612\nf 8613 8612 3921\nf 13 8614 8615\nf 8614 12 6452\nf 8615 6452 5954\nf 1252 8616 8617\nf 8616 15 6178\nf 8617 6178 150\nf 1253 8618 5990\nf 8618 142 8619\nf 5990 8619 1254\nf 17 8620 6163\nf 8620 1254 8619\nf 6163 8619 142\nf 20 6156 6161\nf 6156 19 8621\nf 6161 8621 139\nf 1256 8622 5996\nf 8622 136 8623\nf 5996 8623 1257\nf 1258 8624 5999\nf 8624 133 8625\nf 5999 8625 1374\nf 23 8626 6145\nf 8626 1374 8625\nf 6145 8625 133\nf 30 8627 8629\nf 8627 1261 8628\nf 8629 8628 32\nf 1261 8627 8630\nf 8627 30 6015\nf 8630 6015 1260\nf 33 6526 8631\nf 6526 1261 8630\nf 8631 8630 1260\nf 34 8632 8634\nf 8632 32 8633\nf 8634 8633 35\nf 36 8635 8636\nf 8635 1481 6016\nf 8636 6016 37\nf 1262 8637 8638\nf 8637 1263 6017\nf 8638 6017 1481\nf 1262 6007 8640\nf 6007 38 8639\nf 8640 8639 39\nf 37 6018 8642\nf 6018 1263 8641\nf 8642 8641 35\nf 1263 8637 6021\nf 8637 1262 8640\nf 6021 8640 39\nf 26 8643 8645\nf 8643 40 8644\nf 8645 8644 1264\nf 1265 8646 6490\nf 8646 40 8647\nf 6490 8647 1492\nf 41 8648 8650\nf 8648 1264 8649\nf 8650 8649 1265\nf 40 8646 8644\nf 8646 1265 8649\nf 8644 8649 1264\nf 40 8643 8651\nf 8643 26 6023\nf 8651 6023 5812\nf 1492 8647 8653\nf 8647 40 8652\nf 8653 8652 43\nf 41 8650 6024\nf 8650 1265 6489\nf 6024 6489 44\nf 1487 6484 8655\nf 6484 47 8654\nf 8655 8654 1266\nf 45 8656 8657\nf 8656 1266 8654\nf 8657 8654 47\nf 45 6034 8656\nf 6034 1267 8658\nf 8656 8658 1266\nf 1268 6004 6043\nf 6004 53 8659\nf 6043 8659 54\nf 1269 8660 8661\nf 8660 61 7070\nf 8661 7070 1848\nf 1269 8661 6058\nf 8661 1848 8662\nf 6058 8662 62\nf 65 8663 8665\nf 8663 66 8664\nf 8665 8664 3926\nf 358 8666 8667\nf 8666 66 8663\nf 8667 8663 65\nf 3964 8668 8669\nf 8668 1391 6060\nf 8669 6060 64\nf 67 8670 8672\nf 8670 3966 8671\nf 8672 8671 5516\nf 1601 8673 8675\nf 8673 4106 8674\nf 8675 8674 3927\nf 355 8676 8678\nf 8676 2743 8677\nf 8678 8677 69\nf 72 6415 8680\nf 6415 1276 8679\nf 8680 8679 70\nf 73 8681 8683\nf 8681 1597 8682\nf 8683 8682 3974\nf 1598 8684 8686\nf 8684 73 8685\nf 8686 8685 3041\nf 1277 8687 6573\nf 8687 73 8688\nf 6573 8688 74\nf 1277 8689 8687\nf 8689 3041 8685\nf 8687 8685 73\nf 75 6527 8691\nf 6527 2850 8690\nf 8691 8690 1520\nf 77 6619 8693\nf 6619 1593 8692\nf 8693 8692 1520\nf 2744 6067 8695\nf 6067 76 8694\nf 8695 8694 79\nf 1592 8696 8698\nf 8696 80 8697\nf 8698 8697 4074\nf 81 6070 8700\nf 6070 2748 8699\nf 8700 8699 84\nf 1590 8701 8703\nf 8701 84 8702\nf 8703 8702 1279\nf 87 8704 8705\nf 8704 85 6074\nf 8705 6074 1281\nf 1280 6076 6609\nf 6076 1281 6073\nf 6609 6073 86\nf 87 8705 6079\nf 8705 1281 8706\nf 6079 8706 1282\nf 1281 6075 8706\nf 6075 88 8707\nf 8706 8707 1282\nf 90 6081 8708\nf 6081 1282 8707\nf 8708 8707 88\nf 90 8709 6084\nf 8709 3936 6086\nf 6084 6086 1284\nf 1284 8710 6085\nf 8710 3928 8711\nf 6085 8711 1283\nf 3928 8712 8711\nf 8712 91 8713\nf 8711 8713 1283\nf 92 8714 8716\nf 8714 1285 8715\nf 8716 8715 95\nf 3928 8717 8718\nf 8717 1285 8714\nf 8718 8714 92\nf 98 6092 8719\nf 6092 1286 6280\nf 8719 6280 5943\nf 5920 6095 8721\nf 6095 100 8720\nf 8721 8720 99\nf 101 8722 8723\nf 8722 1287 6096\nf 8723 6096 5920\nf 102 6097 8724\nf 6097 1287 6101\nf 8724 6101 1289\nf 1287 8722 6099\nf 8722 101 8725\nf 6099 8725 1288\nf 1289 6100 8727\nf 6100 1288 8726\nf 8727 8726 103\nf 102 8724 8729\nf 8724 1289 8728\nf 8729 8728 104\nf 104 8728 8731\nf 8728 1289 8730\nf 8731 8730 1291\nf 105 8732 8733\nf 8732 104 8731\nf 8733 8731 1291\nf 1291 8730 6102\nf 8730 1289 8727\nf 6102 8727 103\nf 106 8734 6107\nf 8734 1292 6240\nf 6107 6240 1293\nf 1292 8735 8736\nf 8735 105 8733\nf 8736 8733 1291\nf 108 8737 8739\nf 8737 4800 8738\nf 8739 8738 107\nf 112 8740 8742\nf 8740 107 8741\nf 8742 8741 109\nf 107 8740 8739\nf 8740 112 8743\nf 8739 8743 108\nf 108 8743 8744\nf 8743 112 6217\nf 8744 6217 110\nf 116 6207 8745\nf 6207 1294 6218\nf 8745 6218 113\nf 118 8746 6121\nf 8746 5813 8747\nf 6121 8747 117\nf 119 6122 6124\nf 6122 117 8748\nf 6124 8748 121\nf 131 8749 6143\nf 8749 1354 6140\nf 6143 6140 130\nf 1355 8750 8752\nf 8750 1295 8751\nf 8752 8751 134\nf 23 8753 8754\nf 8753 1355 6149\nf 8754 6149 1296\nf 1355 8753 8750\nf 8753 23 6147\nf 8750 6147 1295\nf 1561 8755 6566\nf 8755 1297 6363\nf 6566 6363 138\nf 1539 8756 6541\nf 8756 1298 8757\nf 6541 8757 141\nf 1585 8758 8759\nf 8758 145 6173\nf 8759 6173 1300\nf 1585 8759 6591\nf 8759 1300 8760\nf 6591 8760 16\nf 14 8761 8763\nf 8761 1430 8762\nf 8763 8762 148\nf 1430 8761 6176\nf 8761 14 8764\nf 6176 8764 1252\nf 1252 8764 8616\nf 8764 14 8765\nf 8616 8765 15\nf 1301 6174 8766\nf 6174 1252 8617\nf 8766 8617 150\nf 1302 6474 6190\nf 6474 151 8767\nf 6190 8767 152\nf 1303 6185 8769\nf 6185 155 8768\nf 8769 8768 156\nf 154 6186 6447\nf 6186 1303 6188\nf 6447 6188 152\nf 1303 8769 6189\nf 8769 156 8770\nf 6189 8770 1302\nf 153 8771 8772\nf 8771 1302 8770\nf 8772 8770 156\nf 1304 8773 6204\nf 8773 160 8774\nf 6204 8774 33\nf 27 6196 8776\nf 6196 1305 8775\nf 8776 8775 31\nf 29 8777 8778\nf 8777 1306 6200\nf 8778 6200 1305\nf 31 8775 6014\nf 8775 1305 6199\nf 6014 6199 1260\nf 1306 8777 8780\nf 8777 29 8779\nf 8780 8779 161\nf 1260 6201 8631\nf 6201 1306 6202\nf 8631 6202 33\nf 162 8781 8783\nf 8781 1304 8782\nf 8783 8782 161\nf 1306 8780 6203\nf 8780 161 8782\nf 6203 8782 1304\nf 157 8784 8786\nf 8784 1456 8785\nf 8786 8785 162\nf 1307 6117 6208\nf 6117 116 8745\nf 6208 8745 113\nf 117 8787 8789\nf 8787 1307 8788\nf 8789 8788 163\nf 1311 8790 6210\nf 8790 163 8788\nf 6210 8788 1307\nf 117 8791 8748\nf 8791 120 6129\nf 8748 6129 121\nf 120 8791 6211\nf 8791 117 8789\nf 6211 8789 163\nf 25 6214 6227\nf 6214 120 6213\nf 6227 6213 1308\nf 1309 6111 6221\nf 6111 112 8742\nf 6221 8742 109\nf 111 6112 6113\nf 6112 1309 6219\nf 6113 6219 1294\nf 113 6220 8792\nf 6220 1309 6223\nf 8792 6223 1310\nf 1310 8793 8792\nf 8793 164 8794\nf 8792 8794 113\nf 1311 6209 6224\nf 6209 113 8794\nf 6224 8794 164\nf 163 8790 8796\nf 8790 1311 8795\nf 8796 8795 165\nf 1312 8797 6226\nf 8797 165 8795\nf 6226 8795 1311\nf 163 8796 6212\nf 8796 165 8798\nf 6212 8798 1308\nf 1313 6228 6230\nf 6228 1308 8798\nf 6230 8798 165\nf 1259 6215 6233\nf 6215 25 6229\nf 6233 6229 1313\nf 1314 8799 6232\nf 8799 129 6234\nf 6232 6234 1313\nf 1259 6235 6236\nf 6235 129 8800\nf 6236 8800 127\nf 24 6237 8802\nf 6237 127 8801\nf 8802 8801 128\nf 105 8735 8803\nf 8735 1292 8734\nf 8803 8734 106\nf 1292 8804 6238\nf 8804 2746 8805\nf 6238 8805 1315\nf 107 8806 8807\nf 8806 1315 6243\nf 8807 6243 1317\nf 107 8808 8806\nf 8808 1293 6239\nf 8806 6239 1315\nf 1315 8805 6241\nf 8805 2746 8809\nf 6241 8809 1316\nf 1317 6242 8811\nf 6242 1316 8810\nf 8811 8810 166\nf 107 8807 8741\nf 8807 1317 6246\nf 8741 6246 109\nf 1317 8811 6244\nf 8811 166 8812\nf 6244 8812 1318\nf 109 6245 8813\nf 6245 1318 6249\nf 8813 6249 1320\nf 1318 8812 6247\nf 8812 166 8814\nf 6247 8814 1319\nf 1320 6248 8816\nf 6248 1319 8815\nf 8816 8815 167\nf 109 8813 6222\nf 8813 1320 6252\nf 6222 6252 1310\nf 1320 8816 6250\nf 8816 167 8817\nf 6250 8817 1321\nf 1310 6251 8793\nf 6251 1321 8818\nf 8793 8818 164\nf 164 8818 8819\nf 8818 1321 6255\nf 8819 6255 1323\nf 1321 8817 6253\nf 8817 167 8820\nf 6253 8820 1322\nf 1323 6254 8822\nf 6254 1322 8821\nf 8822 8821 168\nf 164 8819 6225\nf 8819 1323 6258\nf 6225 6258 1312\nf 1323 8822 6256\nf 8822 168 8823\nf 6256 8823 1324\nf 165 8797 6231\nf 8797 1312 8824\nf 6231 8824 1314\nf 1324 8823 8825\nf 8823 168 6312\nf 8825 6312 169\nf 1324 8825 6259\nf 8825 169 8826\nf 6259 8826 1325\nf 1314 6260 8799\nf 6260 1325 8827\nf 8799 8827 129\nf 129 8827 8828\nf 8827 1325 6264\nf 8828 6264 1327\nf 1325 8826 6262\nf 8826 169 8829\nf 6262 8829 1326\nf 1327 6263 8831\nf 6263 1326 8830\nf 8831 8830 170\nf 129 8828 8800\nf 8828 1327 6138\nf 8800 6138 127\nf 1327 8831 6265\nf 8831 170 8832\nf 6265 8832 1328\nf 1328 8832 6267\nf 8832 170 8833\nf 6267 8833 1329\nf 1330 6268 8835\nf 6268 1329 8834\nf 8835 8834 131\nf 128 8836 8838\nf 8836 5953 8837\nf 8838 8837 126\nf 1330 6270 6269\nf 6270 126 8839\nf 6269 8839 1328\nf 1330 8835 8840\nf 8835 131 6142\nf 8840 6142 132\nf 132 8841 8840\nf 8841 1331 6271\nf 8840 6271 1330\nf 2745 8842 8844\nf 8842 96 8843\nf 8844 8843 1285\nf 1286 8845 6278\nf 8845 2747 8846\nf 6278 8846 1332\nf 1286 6090 8845\nf 6090 96 8847\nf 8845 8847 2747\nf 3940 8848 8850\nf 8848 171 8849\nf 8850 8849 94\nf 5943 6279 8852\nf 6279 1332 8851\nf 8852 8851 1333\nf 1332 8853 8855\nf 8853 171 8854\nf 8855 8854 3929\nf 3941 8856 8857\nf 8856 3929 8854\nf 8857 8854 171\nf 5920 8858 8723\nf 8858 1333 6283\nf 8723 6283 101\nf 1333 8859 6281\nf 8859 3929 8860\nf 6281 8860 1334\nf 3943 8861 8863\nf 8861 3930 8862\nf 8863 8862 172\nf 101 6285 8725\nf 6285 1335 6288\nf 8725 6288 1288\nf 1335 8864 6286\nf 8864 3930 8865\nf 6286 8865 1336\nf 1288 6287 8726\nf 6287 1336 6289\nf 8726 6289 103\nf 1336 8866 8868\nf 8866 173 8867\nf 8868 8867 3931\nf 2755 8869 8870\nf 8869 3931 8867\nf 8870 8867 173\nf 103 6291 6103\nf 6291 1337 8871\nf 6103 8871 1290\nf 1337 8872 6292\nf 8872 3931 8873\nf 6292 8873 1338\nf 1290 8871 8874\nf 8871 1337 6294\nf 8874 6294 3932\nf 1338 8873 8876\nf 8873 3931 8875\nf 8876 8875 1339\nf 1338 8876 8878\nf 8876 1339 8877\nf 8878 8877 174\nf 2746 8879 8809\nf 8879 3932 6297\nf 8809 6297 1316\nf 1338 8878 8881\nf 8878 174 8880\nf 8881 8880 4801\nf 1316 6296 8810\nf 6296 1340 8882\nf 8810 8882 166\nf 166 8882 8883\nf 8882 1340 6300\nf 8883 6300 1342\nf 1340 8884 6298\nf 8884 1338 8881\nf 6298 8881 4801\nf 1342 6299 8886\nf 6299 4801 8885\nf 8886 8885 175\nf 166 8883 8814\nf 8883 1342 6303\nf 8814 6303 1319\nf 1342 8886 6301\nf 8886 175 8887\nf 6301 8887 1343\nf 1319 6302 8815\nf 6302 1343 8888\nf 8815 8888 167\nf 167 8888 8889\nf 8888 1343 6306\nf 8889 6306 1345\nf 1343 8887 6304\nf 8887 175 8890\nf 6304 8890 1344\nf 1345 6305 8892\nf 6305 1344 8891\nf 8892 8891 176\nf 167 8889 8820\nf 8889 1345 6309\nf 8820 6309 1322\nf 1345 8892 6307\nf 8892 176 8893\nf 6307 8893 1346\nf 1322 6308 8821\nf 6308 1346 8894\nf 8821 8894 168\nf 1346 8893 8896\nf 8893 176 8895\nf 8896 8895 177\nf 168 8894 6310\nf 8894 1346 8897\nf 6310 8897 1347\nf 1346 8896 8897\nf 8896 177 8898\nf 8897 8898 1347\nf 169 6311 8899\nf 6311 1347 6315\nf 8899 6315 1349\nf 1347 8898 6313\nf 8898 177 8900\nf 6313 8900 1348\nf 1349 6314 8902\nf 6314 1348 8901\nf 8902 8901 1351\nf 169 8899 8829\nf 8899 1349 6318\nf 8829 6318 1326\nf 1349 8902 6316\nf 8902 1351 6319\nf 6316 6319 1350\nf 1326 6317 8830\nf 6317 1350 8903\nf 8830 8903 170\nf 170 8903 8904\nf 8903 1350 6321\nf 8904 6321 1352\nf 1352 6320 8906\nf 6320 1351 8905\nf 8906 8905 178\nf 170 8904 8833\nf 8904 1352 6324\nf 8833 6324 1329\nf 1352 8906 6322\nf 8906 178 8907\nf 6322 8907 1353\nf 1329 6323 8834\nf 6323 1353 8908\nf 8834 8908 131\nf 131 8908 8749\nf 8908 1353 6327\nf 8749 6327 1354\nf 1353 8907 6325\nf 8907 178 6354\nf 6325 6354 135\nf 1354 6326 8909\nf 6326 135 6150\nf 8909 6150 1355\nf 1354 8909 6141\nf 8909 1355 8752\nf 6141 8752 134\nf 3933 8910 8912\nf 8910 1280 8911\nf 8912 8911 82\nf 88 6077 8913\nf 6077 1280 8910\nf 8913 8910 3933\nf 82 8914 8912\nf 8914 1590 8915\nf 8912 8915 3933\nf 3934 8916 8918\nf 8916 1356 8917\nf 8918 8917 3935\nf 1356 8916 8920\nf 8916 3934 8919\nf 8920 8919 1279\nf 2749 8921 8923\nf 8921 1356 8922\nf 8923 8922 2748\nf 3936 8924 8926\nf 8924 3935 8925\nf 8926 8925 3937\nf 3936 8709 8924\nf 8709 90 8927\nf 8924 8927 3935\nf 2750 8928 8930\nf 8928 1357 8929\nf 8930 8929 2749\nf 3938 8931 8933\nf 8931 1358 8932\nf 8933 8932 3939\nf 2751 8934 8936\nf 8934 1358 8935\nf 8936 8935 2750\nf 3940 8937 8939\nf 8937 3939 8938\nf 8939 8938 1359\nf 3940 8850 8937\nf 8850 94 8940\nf 8937 8940 3939\nf 2752 8941 8943\nf 8941 1359 8942\nf 8943 8942 2751\nf 3941 8944 8946\nf 8944 1360 8945\nf 8946 8945 3942\nf 3941 8857 8947\nf 8857 171 8848\nf 8947 8848 3940\nf 2753 8948 8950\nf 8948 3942 8949\nf 8950 8949 5921\nf 3943 8863 8952\nf 8863 172 8951\nf 8952 8951 3942\nf 2753 8953 8948\nf 8953 1361 8954\nf 8948 8954 3942\nf 3944 8955 8957\nf 8955 1362 8956\nf 8957 8956 2755\nf 3944 8958 8960\nf 8958 173 8959\nf 8960 8959 3943\nf 3945 8961 8963\nf 8961 1362 8962\nf 8963 8962 2754\nf 1339 8964 8877\nf 8964 4950 6328\nf 8877 6328 174\nf 3946 8965 8967\nf 8965 186 8966\nf 8967 8966 3947\nf 4084 8968 8970\nf 8968 3946 8969\nf 8970 8969 185\nf 174 6330 8971\nf 6330 1364 6333\nf 8971 6333 1341\nf 1364 8972 6331\nf 8972 3947 8973\nf 6331 8973 1365\nf 1341 6332 8975\nf 6332 1365 8974\nf 8975 8974 175\nf 3948 8976 8978\nf 8976 187 8977\nf 8978 8977 3949\nf 2871 8979 6557\nf 8979 3948 8980\nf 6557 8980 186\nf 175 8974 8890\nf 8974 1365 6336\nf 8890 6336 1344\nf 1344 6335 8891\nf 6335 1366 6337\nf 8891 6337 176\nf 1366 8981 6338\nf 8981 3950 8982\nf 6338 8982 1367\nf 187 8983 8977\nf 8983 3950 8984\nf 8977 8984 3949\nf 176 6339 8895\nf 6339 1367 6340\nf 8895 6340 177\nf 177 6342 8900\nf 6342 1368 6345\nf 8900 6345 1348\nf 1369 8985 8987\nf 8985 188 8986\nf 8987 8986 3952\nf 1348 6344 8901\nf 6344 1369 6346\nf 8901 6346 1351\nf 1369 6343 8985\nf 6343 1368 8988\nf 8985 8988 188\nf 1371 8989 8991\nf 8989 3952 8990\nf 8991 8990 189\nf 1351 6348 8905\nf 6348 1370 6349\nf 8905 6349 178\nf 1370 8992 6350\nf 8992 3952 8989\nf 6350 8989 1371\nf 2877 8993 8995\nf 8993 3953 8994\nf 8995 8994 2876\nf 178 6351 6352\nf 6351 1371 8996\nf 6352 8996 1372\nf 1371 8991 8998\nf 8991 189 8997\nf 8998 8997 3953\nf 1372 8999 6356\nf 8999 3953 9000\nf 6356 9000 1373\nf 135 6353 6148\nf 6353 1372 6355\nf 6148 6355 1296\nf 1373 9001 9003\nf 9001 2877 9002\nf 9003 9002 190\nf 1296 6360 8754\nf 6360 1374 8626\nf 8754 8626 23\nf 1375 6358 9004\nf 6358 1296 6357\nf 9004 6357 1373\nf 138 9005 9007\nf 9005 1375 9006\nf 9007 9006 190\nf 1375 9005 6361\nf 9005 138 6362\nf 6361 6362 1376\nf 1258 5998 9009\nf 5998 1376 9008\nf 9009 9008 22\nf 22 9008 9010\nf 9008 1376 6364\nf 9010 6364 1297\nf 1297 6154 9010\nf 6154 137 9011\nf 9010 9011 22\nf 3955 9012 9014\nf 9012 2756 9013\nf 9014 9013 192\nf 3967 9015 9016\nf 9015 2758 6368\nf 9016 6368 195\nf 1379 9017 9019\nf 9017 3954 9018\nf 9019 9018 1251\nf 3956 9020 9022\nf 9020 3955 9021\nf 9022 9021 8\nf 1380 9023 9024\nf 9023 3955 9020\nf 9024 9020 3956\nf 2759 9025 9027\nf 9025 1382 9026\nf 9027 9026 2760\nf 9 9028 9030\nf 9028 3957 9029\nf 9030 9029 1251\nf 1381 9031 9033\nf 9031 3957 9032\nf 9033 9032 3924\nf 3925 9034 9036\nf 9034 1381 9035\nf 9036 9035 3923\nf 3958 9037 9039\nf 9037 3956 9038\nf 9039 9038 6\nf 1382 9040 9041\nf 9040 3956 9037\nf 9041 9037 3958\nf 2760 9042 9044\nf 9042 1384 9043\nf 9044 9043 2761\nf 1383 9045 9047\nf 9045 3924 9046\nf 9047 9046 3922\nf 3923 9048 9050\nf 9048 1383 9049\nf 9050 9049 3921\nf 3959 9051 9053\nf 9051 3958 9052\nf 9053 9052 5515\nf 1384 9054 9055\nf 9054 3958 9051\nf 9055 9051 3959\nf 2761 9056 9058\nf 9056 1386 9057\nf 9058 9057 2764\nf 3 9059 9061\nf 9059 2763 9060\nf 9061 9060 3922\nf 2762 8611 9063\nf 8611 1385 9062\nf 9063 9062 3920\nf 4 9064 9066\nf 9064 3960 9065\nf 9066 9065 3959\nf 1386 9067 9068\nf 9067 3959 9065\nf 9068 9065 3960\nf 2764 9069 9071\nf 9069 1389 9070\nf 9071 9070 2767\nf 2765 9072 9074\nf 9072 1388 9073\nf 9074 9073 1387\nf 2 9075 9077\nf 9075 2766 9076\nf 9077 9076 1250\nf 1 9078 9080\nf 9078 3963 9079\nf 9080 9079 3960\nf 2767 9081 9083\nf 9081 1390 9082\nf 9083 9082 1391\nf 1390 9084 9086\nf 9084 201 9085\nf 9086 9085 3926\nf 65 8665 9087\nf 8665 3926 9085\nf 9087 9085 201\nf 65 9088 6640\nf 9088 2765 9089\nf 6640 9089 3965\nf 3966 9090 9092\nf 9090 1392 9091\nf 9092 9091 2768\nf 325 9093 9095\nf 9093 1270 9094\nf 9095 9094 63\nf 4802 9096 9098\nf 9096 204 9097\nf 9098 9097 203\nf 1269 9099 8660\nf 9099 1393 9100\nf 8660 9100 61\nf 63 9101 9102\nf 9101 4802 9098\nf 9102 9098 203\nf 55 6377 6055\nf 6377 1393 9099\nf 6055 9099 1269\nf 204 9096 9104\nf 9096 4802 9103\nf 9104 9103 1393\nf 1394 9105 6379\nf 9105 204 9104\nf 6379 9104 1393\nf 56 9106 6057\nf 9106 1394 6378\nf 6057 6378 55\nf 204 9105 9107\nf 9105 1394 6380\nf 9107 6380 205\nf 2769 9108 9109\nf 9108 56 6050\nf 9109 6050 1395\nf 205 6382 9111\nf 6382 2769 9110\nf 9111 9110 206\nf 206 9110 9113\nf 9110 2769 9112\nf 9113 9112 52\nf 50 6038 9115\nf 6038 207 9114\nf 9115 9114 46\nf 50 9116 6387\nf 9116 1487 9117\nf 6387 9117 1396\nf 1396 6383 9119\nf 6383 2834 9118\nf 9119 9118 194\nf 1399 6391 9121\nf 6391 2770 9120\nf 9121 9120 1398\nf 193 9122 9124\nf 9122 1398 9123\nf 9124 9123 194\nf 50 6386 6036\nf 6386 1397 9125\nf 6036 9125 5922\nf 1399 9126 6389\nf 9126 49 9127\nf 6389 9127 1397\nf 1399 9121 9129\nf 9121 1398 9128\nf 9129 9128 1400\nf 2758 9015 6367\nf 9015 3967 9130\nf 6367 9130 193\nf 49 9126 6393\nf 9126 1399 9131\nf 6393 9131 2771\nf 3967 9016 9133\nf 9016 195 9132\nf 9133 9132 3968\nf 52 6394 9113\nf 6394 2771 6395\nf 9113 6395 206\nf 3968 9134 9136\nf 9134 196 9135\nf 9136 9135 3969\nf 206 6399 9111\nf 6399 1402 6400\nf 9111 6400 205\nf 3969 9137 9139\nf 9137 197 9138\nf 9139 9138 3970\nf 3971 9140 9142\nf 9140 1404 9141\nf 9142 9141 3970\nf 203 9097 6407\nf 9097 204 6405\nf 6407 6405 2773\nf 3971 9143 9145\nf 9143 199 9144\nf 9145 9144 3972\nf 3973 9146 9148\nf 9146 1405 9147\nf 9148 9147 3972\nf 74 8688 9149\nf 8688 73 8683\nf 9149 8683 3974\nf 3975 9150 9152\nf 9150 209 9151\nf 9152 9151 74\nf 2775 9153 9155\nf 9153 1409 9154\nf 9155 9154 2774\nf 3976 9156 9158\nf 9156 211 9157\nf 9158 9157 3975\nf 2776 9159 9161\nf 9159 1410 9160\nf 9161 9160 2775\nf 3977 9162 9164\nf 9162 213 9163\nf 9164 9163 3976\nf 2777 9165 9167\nf 9165 1411 9166\nf 9167 9166 2776\nf 3978 9168 9170\nf 9168 215 9169\nf 9170 9169 3977\nf 2778 9171 9173\nf 9171 1412 9172\nf 9173 9172 2777\nf 1413 9174 9176\nf 9174 217 9175\nf 9176 9175 3978\nf 2780 9177 9179\nf 9177 218 9178\nf 9179 9178 220\nf 3979 9180 9182\nf 9180 1413 9181\nf 9182 9181 2778\nf 219 9183 9185\nf 9183 2779 9184\nf 9185 9184 4951\nf 1415 9186 9188\nf 9186 2781 9187\nf 9188 9187 1414\nf 222 9189 9191\nf 9189 1415 9190\nf 9191 9190 2780\nf 1415 9189 9193\nf 9189 222 9192\nf 9193 9192 3980\nf 2782 9194 9196\nf 9194 1416 9195\nf 9196 9195 2783\nf 3980 9197 9199\nf 9197 223 9198\nf 9199 9198 3981\nf 2783 9200 9202\nf 9200 1417 9201\nf 9202 9201 2784\nf 3981 9203 9205\nf 9203 225 9204\nf 9205 9204 3982\nf 2784 9206 9208\nf 9206 1418 9207\nf 9208 9207 2785\nf 3982 9209 9211\nf 9209 227 9210\nf 9211 9210 3983\nf 2785 9212 9214\nf 9212 1419 9213\nf 9214 9213 2786\nf 3983 9215 9217\nf 9215 229 9216\nf 9217 9216 3984\nf 2786 9218 9220\nf 9218 1420 9219\nf 9220 9219 2787\nf 3984 9221 9223\nf 9221 231 9222\nf 9223 9222 3985\nf 2787 9224 9226\nf 9224 1421 9225\nf 9226 9225 2788\nf 3985 9227 9229\nf 9227 233 9228\nf 9229 9228 3986\nf 2788 9230 9232\nf 9230 1422 9231\nf 9232 9231 235\nf 3986 9233 9235\nf 9233 234 9234\nf 9235 9234 3987\nf 235 9236 9238\nf 9236 1423 9237\nf 9238 9237 237\nf 3987 9239 9241\nf 9239 236 9240\nf 9241 9240 3988\nf 3988 9242 9244\nf 9242 238 9243\nf 9244 9243 1424\nf 4104 9245 9246\nf 9245 2789 6416\nf 9246 6416 2790\nf 240 9247 9249\nf 9247 3990 9248\nf 9249 9248 3989\nf 239 9250 9251\nf 9250 2790 6419\nf 9251 6419 144\nf 1425 9252 9253\nf 9252 3989 9248\nf 9253 9248 3990\nf 241 9254 9256\nf 9254 3991 9255\nf 9256 9255 3990\nf 144 6423 9258\nf 6423 1426 9257\nf 9258 9257 5973\nf 1426 9259 9260\nf 9259 3990 9255\nf 9260 9255 3991\nf 241 9261 9254\nf 9261 242 6427\nf 9254 6427 3991\nf 147 6170 9263\nf 6170 1427 9262\nf 9263 9262 2791\nf 1428 9264 9265\nf 9264 2791 9262\nf 9265 9262 1427\nf 1429 9266 9268\nf 9266 1428 9267\nf 9268 9267 148\nf 242 9269 6428\nf 9269 148 9267\nf 6428 9267 1428\nf 147 9263 9271\nf 9263 2791 9270\nf 9271 9270 1299\nf 1429 9268 9272\nf 9268 148 8762\nf 9272 8762 1430\nf 146 6430 6180\nf 6430 1429 9272\nf 6180 9272 1430\nf 3993 9273 9275\nf 9273 71 9274\nf 9275 9274 3992\nf 2792 9276 9278\nf 9276 1431 9277\nf 9278 9277 1274\nf 3994 9279 9281\nf 9279 243 9280\nf 9281 9280 3993\nf 2793 9282 9284\nf 9282 1432 9283\nf 9284 9283 2792\nf 3995 9285 9287\nf 9285 245 9286\nf 9287 9286 3994\nf 2794 9288 9290\nf 9288 1433 9289\nf 9290 9289 2793\nf 3996 9291 9293\nf 9291 247 9292\nf 9293 9292 3995\nf 2795 9294 9296\nf 9294 1434 9295\nf 9296 9295 2794\nf 3997 9297 9299\nf 9297 248 9298\nf 9299 9298 3996\nf 3998 9300 9302\nf 9300 1435 9301\nf 9302 9301 2795\nf 250 9303 9305\nf 9303 3997 9304\nf 9305 9304 252\nf 1436 9306 9308\nf 9306 2796 9307\nf 9308 9307 1435\nf 253 9309 9311\nf 9309 1436 9310\nf 9311 9310 3998\nf 252 9312 9313\nf 9312 2796 6432\nf 9313 6432 254\nf 3999 9314 9316\nf 9314 253 9315\nf 9316 9315 255\nf 4000 9317 9319\nf 9317 1438 9318\nf 9319 9318 3999\nf 2797 9320 9322\nf 9320 1438 9321\nf 9322 9321 2798\nf 2798 9323 9325\nf 9323 1439 9324\nf 9325 9324 2799\nf 4000 9326 9328\nf 9326 259 9327\nf 9328 9327 4001\nf 2799 9329 9331\nf 9329 1440 9330\nf 9331 9330 2800\nf 4001 9332 9334\nf 9332 261 9333\nf 9334 9333 4002\nf 2800 9335 9337\nf 9335 1441 9336\nf 9337 9336 2801\nf 2801 9338 9340\nf 9338 1442 9339\nf 9340 9339 2802\nf 4003 9341 9343\nf 9341 264 9342\nf 9343 9342 4004\nf 2802 9344 9346\nf 9344 1443 9345\nf 9346 9345 2803\nf 4004 9347 9349\nf 9347 266 9348\nf 9349 9348 4005\nf 2803 9350 9352\nf 9350 1444 9351\nf 9352 9351 2804\nf 4005 9353 9355\nf 9353 268 9354\nf 9355 9354 4006\nf 2804 9356 9358\nf 9356 1445 9357\nf 9358 9357 2805\nf 4006 9359 9361\nf 9359 270 9360\nf 9361 9360 4007\nf 2805 9362 9364\nf 9362 1446 9363\nf 9364 9363 2806\nf 4007 9365 9367\nf 9365 271 9366\nf 9367 9366 4008\nf 2806 9368 9370\nf 9368 1447 9369\nf 9370 9369 272\nf 272 9371 9373\nf 9371 1448 9372\nf 9373 9372 274\nf 4009 9374 9376\nf 9374 273 9375\nf 9376 9375 4010\nf 4010 9377 9379\nf 9377 275 9378\nf 9379 9378 4011\nf 277 9380 9382\nf 9380 1450 9381\nf 9382 9381 4011\nf 4954 9383 9384\nf 9383 276 6435\nf 9384 6435 4803\nf 4803 9385 9386\nf 9385 4011 9381\nf 9386 9381 1450\nf 278 9387 9389\nf 9387 4952 9388\nf 9389 9388 277\nf 4803 9386 9391\nf 9386 1450 9390\nf 9391 9390 4804\nf 1450 9380 9392\nf 9380 277 9388\nf 9392 9388 4952\nf 280 9393 9395\nf 9393 1451 9394\nf 9395 9394 4952\nf 279 9396 9397\nf 9396 4804 6438\nf 9397 6438 2807\nf 1451 9393 9399\nf 9393 280 9398\nf 9399 9398 1452\nf 281 9400 9401\nf 9400 1452 9398\nf 9401 9398 280\nf 151 6443 8767\nf 6443 2808 6444\nf 8767 6444 152\nf 1452 9400 9403\nf 9400 281 9402\nf 9403 9402 4953\nf 282 9404 9405\nf 9404 4953 9402\nf 9405 9402 281\nf 152 6446 6448\nf 6446 1453 9406\nf 6448 9406 5941\nf 1453 9407 9409\nf 9407 4953 9408\nf 9409 9408 1454\nf 283 9410 9412\nf 9410 1454 9411\nf 9412 9411 282\nf 154 6449 6183\nf 6449 5941 6450\nf 6183 6450 12\nf 5954 9413 9415\nf 9413 283 9414\nf 9415 9414 1455\nf 284 6453 9416\nf 6453 1455 9414\nf 9416 9414 283\nf 159 5987 6195\nf 5987 12 8614\nf 6195 8614 13\nf 1456 9417 9419\nf 9417 13 9418\nf 9419 9418 1455\nf 160 8773 9420\nf 8773 1304 6457\nf 9420 6457 2809\nf 13 9417 6193\nf 9417 1456 8784\nf 6193 8784 157\nf 1304 8781 6458\nf 8781 162 8785\nf 6458 8785 1456\nf 1275 9421 9423\nf 9421 4012 9422\nf 9423 9422 2900\nf 2810 9424 9426\nf 9424 1457 9425\nf 9426 9425 2743\nf 4013 9427 9429\nf 9427 210 9428\nf 9429 9428 4012\nf 2811 9430 9432\nf 9430 1458 9431\nf 9432 9431 2810\nf 4014 9433 9435\nf 9433 212 9434\nf 9435 9434 4013\nf 2812 9436 9438\nf 9436 1459 9437\nf 9438 9437 2811\nf 4015 9439 9441\nf 9439 214 9440\nf 9441 9440 4014\nf 2813 9442 9444\nf 9442 1460 9443\nf 9444 9443 2812\nf 4016 9445 9447\nf 9445 216 9446\nf 9447 9446 4015\nf 1462 9448 9450\nf 9448 1461 9449\nf 9450 9449 2813\nf 218 9451 9178\nf 9451 4016 9452\nf 9178 9452 220\nf 1462 9453 9455\nf 9453 1463 9454\nf 9455 9454 220\nf 1462 9456 9458\nf 9456 250 9457\nf 9458 9457 4017\nf 252 9459 9305\nf 9459 4017 9457\nf 9305 9457 250\nf 4018 9460 9462\nf 9460 1464 9461\nf 9462 9461 4017\nf 2815 9463 9465\nf 9463 1464 9464\nf 9465 9464 2816\nf 4019 9466 9468\nf 9466 1465 9467\nf 9468 9467 4018\nf 2816 9469 9471\nf 9469 1465 9470\nf 9471 9470 2817\nf 4020 9472 9474\nf 9472 1466 9473\nf 9474 9473 4019\nf 2817 9475 9477\nf 9475 1466 9476\nf 9477 9476 2818\nf 4021 9478 9480\nf 9478 1467 9479\nf 9480 9479 4020\nf 2818 9481 9483\nf 9481 1467 9482\nf 9483 9482 2819\nf 4022 9484 9486\nf 9484 1468 9485\nf 9486 9485 4021\nf 2819 9487 9489\nf 9487 1468 9488\nf 9489 9488 2820\nf 4023 9490 9492\nf 9490 1469 9491\nf 9492 9491 4022\nf 2820 9493 9495\nf 9493 1469 9494\nf 9495 9494 2821\nf 4024 9496 9498\nf 9496 1470 9497\nf 9498 9497 4023\nf 2821 9499 9501\nf 9499 1470 9500\nf 9501 9500 2822\nf 4025 9502 9504\nf 9502 1471 9503\nf 9504 9503 4024\nf 2822 9505 9507\nf 9505 1471 9506\nf 9507 9506 2823\nf 4026 9508 9510\nf 9508 1472 9509\nf 9510 9509 4025\nf 2823 9511 9513\nf 9511 1472 9512\nf 9513 9512 2824\nf 4027 9514 9516\nf 9514 1473 9515\nf 9516 9515 4026\nf 2824 9517 9519\nf 9517 1473 9518\nf 9519 9518 2825\nf 4028 9520 9522\nf 9520 1474 9521\nf 9522 9521 4027\nf 2825 9523 9525\nf 9523 1474 9524\nf 9525 9524 240\nf 4029 9526 9528\nf 9526 1475 9527\nf 9528 9527 4028\nf 240 9529 9531\nf 9529 1475 9530\nf 9531 9530 2826\nf 274 9532 9534\nf 9532 4030 9533\nf 9534 9533 4029\nf 2826 9535 9537\nf 9535 1476 9536\nf 9537 9536 2827\nf 1476 9538 9539\nf 9538 4029 9533\nf 9539 9533 4030\nf 276 9540 9542\nf 9540 4031 9541\nf 9542 9541 4030\nf 242 9543 9269\nf 9543 2827 6462\nf 9269 6462 148\nf 1477 9544 9545\nf 9544 4030 9541\nf 9545 9541 4031\nf 148 6466 8763\nf 6466 1478 6467\nf 8763 6467 14\nf 1478 9546 9548\nf 9546 4031 9547\nf 9548 9547 4954\nf 279 9549 9551\nf 9549 1479 9550\nf 9551 9550 4954\nf 14 6469 8765\nf 6469 1479 6470\nf 8765 6470 15\nf 1479 9549 6471\nf 9549 279 9552\nf 6471 9552 1480\nf 151 6473 9553\nf 6473 1480 9552\nf 9553 9552 279\nf 15 6472 6179\nf 6472 1480 9554\nf 6179 9554 149\nf 149 9554 9556\nf 9554 1480 9555\nf 9556 9555 153\nf 1302 8771 6475\nf 8771 153 9555\nf 6475 9555 1480\nf 1262 8638 9557\nf 8638 1481 6476\nf 9557 6476 42\nf 1481 8635 6477\nf 8635 36 9558\nf 6477 9558 1482\nf 285 9559 9560\nf 9559 1482 9558\nf 9560 9558 36\nf 2828 9561 9563\nf 9561 1482 9562\nf 9563 9562 1483\nf 1482 9559 9562\nf 9559 285 9564\nf 9562 9564 1483\nf 286 9565 9566\nf 9565 1483 9564\nf 9566 9564 285\nf 4032 9567 9569\nf 9567 1484 9568\nf 9569 9568 2829\nf 4055 9570 9571\nf 9570 2829 6479\nf 9571 6479 288\nf 4033 9572 9574\nf 9572 287 9573\nf 9574 9573 5969\nf 288 6481 9575\nf 6481 1486 6493\nf 9575 6493 290\nf 50 9115 9116\nf 9115 46 6482\nf 9116 6482 1487\nf 208 9576 6028\nf 9576 1487 9577\nf 6028 9577 2742\nf 1488 9578 6485\nf 9578 2833 9579\nf 6485 9579 48\nf 4037 9580 9582\nf 9580 1489 9581\nf 9582 9581 4036\nf 296 9583 9585\nf 9583 1489 9584\nf 9585 9584 1490\nf 4033 9586 9588\nf 9586 1484 9587\nf 9588 9587 2831\nf 287 9589 9591\nf 9589 4038 9590\nf 9591 9590 1488\nf 1488 9592 9591\nf 9592 289 9593\nf 9591 9593 287\nf 2830 6486 6492\nf 6486 48 9594\nf 6492 9594 1491\nf 2742 6030 6029\nf 6030 1491 9594\nf 6029 9594 48\nf 289 9592 9595\nf 9592 1488 6487\nf 9595 6487 2830\nf 1492 9596 9597\nf 9596 289 9595\nf 9597 9595 2830\nf 5957 9598 9599\nf 9598 1492 8653\nf 9599 8653 43\nf 1493 9600 9602\nf 9600 4034 9601\nf 9602 9601 2828\nf 290 6495 9604\nf 6495 1493 9603\nf 9604 9603 286\nf 1483 9565 9605\nf 9565 286 9603\nf 9605 9603 1493\nf 1494 9606 9608\nf 9606 4032 9607\nf 9608 9607 2832\nf 4037 9609 9611\nf 9609 297 9610\nf 9611 9610 2831\nf 291 9612 9614\nf 9612 297 9613\nf 9614 9613 4038\nf 4039 9615 9616\nf 9615 4038 9613\nf 9616 9613 297\nf 1495 9617 9618\nf 9617 4038 9615\nf 9618 9615 4039\nf 2834 9619 9621\nf 9619 1495 9620\nf 9621 9620 2835\nf 2835 9622 9624\nf 9622 4039 9623\nf 9624 9623 1496\nf 293 9625 9627\nf 9625 1496 9626\nf 9627 9626 295\nf 2756 9628 9630\nf 9628 2757 9629\nf 9630 9629 1496\nf 4035 9631 9633\nf 9631 292 9632\nf 9633 9632 4040\nf 3954 9634 9636\nf 9634 1377 9635\nf 9636 9635 4040\nf 4041 9637 9639\nf 9637 68 9638\nf 9639 9638 3927\nf 2837 9640 9642\nf 9640 1273 9641\nf 9642 9641 4106\nf 4042 9643 9645\nf 9643 244 9644\nf 9645 9644 4041\nf 2838 9646 9648\nf 9646 1497 9647\nf 9648 9647 2837\nf 4043 9649 9651\nf 9649 246 9650\nf 9651 9650 4042\nf 2839 9652 9654\nf 9652 1498 9653\nf 9654 9653 2838\nf 4043 9655 9657\nf 9655 1498 9656\nf 9657 9656 1499\nf 4044 9658 9659\nf 9658 1498 9652\nf 9659 9652 2839\nf 249 9660 9662\nf 9660 1499 9661\nf 9662 9661 251\nf 4044 9663 9665\nf 9663 1500 9664\nf 9665 9664 1499\nf 4044 9666 9668\nf 9666 202 9667\nf 9668 9667 1501\nf 2 9669 9670\nf 9669 1501 9667\nf 9670 9667 202\nf 251 9671 9673\nf 9671 1500 9672\nf 9673 9672 253\nf 1501 9674 9676\nf 9674 2840 9675\nf 9676 9675 1500\nf 1501 9669 9678\nf 9669 2 9677\nf 9678 9677 4045\nf 3 9679 9680\nf 9679 4045 9677\nf 9680 9677 2\nf 255 9681 6498\nf 9681 1500 9675\nf 6498 9675 2840\nf 4046 9682 9684\nf 9682 1502 9683\nf 9684 9683 4045\nf 2842 9685 9687\nf 9685 1502 9686\nf 9687 9686 1503\nf 4046 9688 9690\nf 9688 5 9689\nf 9690 9689 4047\nf 4048 9691 9693\nf 9691 1504 9692\nf 9693 9692 4047\nf 2843 9694 9696\nf 9694 1504 9695\nf 9696 9695 2844\nf 2844 9697 9699\nf 9697 1505 9698\nf 9699 9698 264\nf 4048 9700 9702\nf 9700 9 9701\nf 9702 9701 4049\nf 4050 9703 9705\nf 9703 1506 9704\nf 9705 9704 4049\nf 2845 9706 9708\nf 9706 1506 9707\nf 9708 9707 2846\nf 2846 9709 9711\nf 9709 1507 9710\nf 9711 9710 270\nf 4050 9712 9714\nf 9712 191 9713\nf 9714 9713 4051\nf 294 9715 9717\nf 9715 1508 9716\nf 9717 9716 4051\nf 2847 9718 9720\nf 9718 1508 9719\nf 9720 9719 2848\nf 2848 9721 9723\nf 9721 1509 9722\nf 9723 9722 273\nf 4052 9724 9726\nf 9724 296 9725\nf 9726 9725 4053\nf 273 9727 9729\nf 9727 1510 9728\nf 9729 9728 275\nf 4054 9730 9732\nf 9730 1511 9731\nf 9732 9731 4053\nf 275 9733 9735\nf 9733 1511 9734\nf 9735 9734 2849\nf 4055 9736 9738\nf 9736 1512 9737\nf 9738 9737 4054\nf 277 9739 9389\nf 9739 2849 6501\nf 9389 6501 278\nf 1512 9736 6504\nf 9736 4055 9740\nf 6504 9740 1513\nf 288 9741 9571\nf 9741 1513 9740\nf 9571 9740 4055\nf 278 6505 9742\nf 6505 1513 6506\nf 9742 6506 280\nf 1513 9741 6507\nf 9741 288 9743\nf 6507 9743 1514\nf 290 9744 9575\nf 9744 1514 9743\nf 9575 9743 288\nf 280 6508 9401\nf 6508 1514 6509\nf 9401 6509 281\nf 1514 9744 6510\nf 9744 290 9745\nf 6510 9745 1515\nf 286 9746 9604\nf 9746 1515 9745\nf 9604 9745 290\nf 281 6511 9405\nf 6511 1515 6512\nf 9405 6512 282\nf 1515 9746 6513\nf 9746 286 9747\nf 6513 9747 1516\nf 285 9748 9566\nf 9748 1516 9747\nf 9566 9747 286\nf 282 6514 9412\nf 6514 1516 6515\nf 9412 6515 283\nf 1516 9748 6516\nf 9748 285 9749\nf 6516 9749 1517\nf 36 6518 9560\nf 6518 1517 9749\nf 9560 9749 285\nf 283 6517 9416\nf 6517 1517 9750\nf 9416 9750 284\nf 1518 9751 6520\nf 9751 284 9750\nf 6520 9750 1517\nf 37 9752 8636\nf 9752 1518 6519\nf 8636 6519 36\nf 284 9751 9753\nf 9751 1518 6521\nf 9753 6521 160\nf 1518 9752 6522\nf 9752 37 9754\nf 6522 9754 1519\nf 35 9755 8642\nf 9755 1519 9754\nf 8642 9754 37\nf 160 6523 8774\nf 6523 1519 6524\nf 8774 6524 33\nf 1519 9755 6525\nf 9755 35 9756\nf 6525 9756 1261\nf 35 8633 9756\nf 8633 32 8628\nf 9756 8628 1261\nf 79 9757 9759\nf 9757 77 9758\nf 9759 9758 4056\nf 77 9757 9760\nf 9757 79 8694\nf 9760 8694 76\nf 2851 9761 9763\nf 9761 1521 9762\nf 9763 9762 2850\nf 4057 9764 9766\nf 9764 298 9765\nf 9766 9765 4056\nf 2852 9767 9769\nf 9767 1522 9768\nf 9769 9768 2851\nf 4058 9770 9772\nf 9770 300 9771\nf 9772 9771 4057\nf 2853 9773 9775\nf 9773 1523 9774\nf 9775 9774 2852\nf 4059 9776 9778\nf 9776 302 9777\nf 9778 9777 4058\nf 2854 9779 9781\nf 9779 1524 9780\nf 9781 9780 2853\nf 4060 9782 9784\nf 9782 304 9783\nf 9784 9783 4059\nf 2855 9785 9787\nf 9785 1525 9786\nf 9787 9786 2854\nf 4061 9788 9790\nf 9788 306 9789\nf 9790 9789 4060\nf 2856 9791 9793\nf 9791 1526 9792\nf 9793 9792 2855\nf 4062 9794 9796\nf 9794 1527 9795\nf 9796 9795 1528\nf 4062 9797 9799\nf 9797 308 9798\nf 9799 9798 4061\nf 4063 9800 9802\nf 9800 1527 9801\nf 9802 9801 2856\nf 309 9803 9805\nf 9803 1528 9804\nf 9805 9804 311\nf 1529 9806 6532\nf 9806 2857 9807\nf 6532 9807 1528\nf 1529 9808 9810\nf 9808 310 9809\nf 9810 9809 4064\nf 312 9811 9812\nf 9811 4064 9809\nf 9812 9809 310\nf 4064 9811 9814\nf 9811 312 9813\nf 9814 9813 4065\nf 2858 9815 9817\nf 9815 2859 9816\nf 9817 9816 4066\nf 4065 9818 9820\nf 9818 314 9819\nf 9820 9819 5518\nf 2859 9821 9823\nf 9821 1532 9822\nf 9823 9822 2860\nf 4067 9824 9826\nf 9824 2888 9825\nf 9826 9825 4068\nf 2860 9827 9829\nf 9827 1533 9828\nf 9829 9828 2861\nf 4068 9830 9832\nf 9830 316 9831\nf 9832 9831 4069\nf 2861 9833 9835\nf 9833 1534 9834\nf 9835 9834 4955\nf 4069 9836 9838\nf 9836 317 9837\nf 9838 9837 4070\nf 5519 9839 9841\nf 9839 1535 9840\nf 9841 9840 2862\nf 4070 9842 9844\nf 9842 319 9843\nf 9844 9843 4956\nf 2862 9845 9847\nf 9845 1536 9846\nf 9847 9846 2863\nf 1536 9848 9850\nf 9848 321 9849\nf 9850 9849 4071\nf 323 9851 9852\nf 9851 1538 6537\nf 9852 6537 4071\nf 1562 9853 9855\nf 9853 322 9854\nf 9855 9854 141\nf 1538 6539 6538\nf 6539 141 9856\nf 6538 9856 1537\nf 323 9857 9851\nf 9857 4072 9858\nf 9851 9858 1538\nf 1298 8756 6162\nf 8756 1539 6542\nf 6162 6542 20\nf 1539 9859 6543\nf 9859 4072 9860\nf 6543 9860 1540\nf 324 9861 9863\nf 9861 1541 9862\nf 9863 9862 4073\nf 20 6544 6157\nf 6544 1540 6547\nf 6157 6547 1255\nf 1540 9864 6545\nf 9864 4073 9862\nf 6545 9862 1541\nf 1255 6546 5994\nf 6546 1541 6548\nf 5994 6548 18\nf 1541 9861 6549\nf 9861 324 9865\nf 6549 9865 1542\nf 143 9866 9867\nf 9866 1542 9865\nf 9867 9865 324\nf 1542 9866 6551\nf 9866 143 9868\nf 6551 9868 1543\nf 142 9869 6164\nf 9869 1543 9868\nf 6164 9868 143\nf 1592 8698 6617\nf 8698 4074 9870\nf 6617 9870 81\nf 4075 9871 9873\nf 9871 83 9872\nf 9873 9872 4074\nf 2864 9874 9876\nf 9874 1544 9875\nf 9876 9875 2744\nf 4076 9877 9879\nf 9877 1545 9878\nf 9879 9878 4077\nf 4076 9880 9882\nf 9880 179 9881\nf 9882 9881 4075\nf 2865 9883 9885\nf 9883 1545 9884\nf 9885 9884 2864\nf 4078 9886 9888\nf 9886 180 9887\nf 9888 9887 4077\nf 2866 9889 9891\nf 9889 1546 9890\nf 9891 9890 2865\nf 4079 9892 9894\nf 9892 181 9893\nf 9894 9893 4078\nf 2867 9895 9897\nf 9895 1547 9896\nf 9897 9896 2866\nf 4080 9898 9900\nf 9898 182 9899\nf 9900 9899 4079\nf 2868 9901 9903\nf 9901 1548 9902\nf 9903 9902 2867\nf 4081 9904 9906\nf 9904 183 9905\nf 9906 9905 4080\nf 2869 9907 9909\nf 9907 1549 9908\nf 9909 9908 2868\nf 4082 9910 9912\nf 9910 1550 9911\nf 9912 9911 4083\nf 4082 9913 9915\nf 9913 184 9914\nf 9915 9914 4081\nf 2870 9916 9918\nf 9916 1550 9917\nf 9918 9917 2869\nf 4084 8970 9920\nf 8970 185 9919\nf 9920 9919 4083\nf 4085 9921 9923\nf 9921 1551 9922\nf 9923 9922 2870\nf 3948 8979 8976\nf 8979 2871 9924\nf 8976 9924 187\nf 1553 9925 6560\nf 9925 2872 9926\nf 6560 9926 1552\nf 313 9927 9929\nf 9927 1553 9928\nf 9929 9928 311\nf 187 9930 8983\nf 9930 2873 9931\nf 8983 9931 3950\nf 1553 9927 9933\nf 9927 313 9932\nf 9933 9932 4086\nf 4087 9934 9936\nf 9934 4086 9935\nf 9936 9935 4066\nf 2873 9937 9939\nf 9937 2874 9938\nf 9939 9938 3951\nf 2874 9940 9942\nf 9940 1556 9941\nf 9942 9941 2875\nf 189 9943 9945\nf 9943 1557 9944\nf 9945 9944 2876\nf 4089 9946 9948\nf 9946 5519 9947\nf 9948 9947 4090\nf 1558 9949 9950\nf 9949 4089 9948\nf 9950 9948 4090\nf 320 9951 9952\nf 9951 1560 6562\nf 9952 6562 4090\nf 1560 6564 6563\nf 6564 138 9953\nf 6563 9953 1559\nf 2878 9954 9956\nf 9954 320 9955\nf 9956 9955 322\nf 320 9954 9951\nf 9954 2878 9957\nf 9951 9957 1560\nf 1297 8755 6155\nf 8755 1561 9958\nf 6155 9958 21\nf 1257 9959 9960\nf 9959 21 9958\nf 9960 9958 1561\nf 322 9853 9956\nf 9853 1562 6569\nf 9956 6569 2878\nf 136 6151 8623\nf 6151 21 9959\nf 8623 9959 1257\nf 1562 9855 6571\nf 9855 141 8757\nf 6571 8757 1298\nf 1256 5995 9962\nf 5995 1563 9961\nf 9962 9961 140\nf 1298 6160 6572\nf 6160 140 9961\nf 6572 9961 1563\nf 78 9963 9965\nf 9963 1596 9964\nf 9965 9964 4092\nf 1596 9963 9966\nf 9963 78 6528\nf 9966 6528 75\nf 2880 9967 9969\nf 9967 1564 9968\nf 9969 9968 2879\nf 4093 9970 9972\nf 9970 299 9971\nf 9972 9971 4092\nf 2881 9973 9975\nf 9973 1565 9974\nf 9975 9974 2880\nf 4094 9976 9978\nf 9976 301 9977\nf 9978 9977 4093\nf 2882 9979 9981\nf 9979 1566 9980\nf 9981 9980 2881\nf 4095 9982 9984\nf 9982 303 9983\nf 9984 9983 4094\nf 2883 9985 9987\nf 9985 1567 9986\nf 9987 9986 2882\nf 4096 9988 9990\nf 9988 305 9989\nf 9990 9989 4095\nf 2884 9991 9993\nf 9991 1568 9992\nf 9993 9992 2883\nf 4097 9994 9996\nf 9994 1569 9995\nf 9996 9995 2885\nf 4097 9997 9999\nf 9997 307 9998\nf 9999 9998 4096\nf 1571 10000 10002\nf 10000 1569 10001\nf 10002 10001 2884\nf 1571 10003 10005\nf 10003 2886 10004\nf 10005 10004 1570\nf 1571 10006 10003\nf 10006 219 10007\nf 10003 10007 2886\nf 4951 10008 9185\nf 10008 2886 10007\nf 9185 10007 219\nf 310 10009 9812\nf 10009 1572 10010\nf 9812 10010 312\nf 1573 10011 6581\nf 10011 2887 10012\nf 6581 10012 1572\nf 1573 10013 10015\nf 10013 221 10014\nf 10015 10014 4098\nf 312 10016 10017\nf 10016 2887 6582\nf 10017 6582 314\nf 5518 10018 10020\nf 10018 1575 10019\nf 10020 10019 2888\nf 4099 10021 10023\nf 10021 224 10022\nf 10023 10022 4100\nf 2888 10024 10026\nf 10024 1576 10025\nf 10026 10025 1577\nf 4100 10027 10029\nf 10027 226 10028\nf 10029 10028 4101\nf 4101 10030 10032\nf 10030 228 10031\nf 10032 10031 1578\nf 2889 10033 10035\nf 10033 1578 10034\nf 10035 10034 2890\nf 1578 10036 10038\nf 10036 230 10037\nf 10038 10037 4957\nf 2890 10039 10041\nf 10039 4957 10040\nf 10041 10040 5948\nf 1580 10042 10044\nf 10042 1579 10043\nf 10044 10043 5326\nf 2892 10045 10047\nf 10045 1580 10046\nf 10047 10046 2893\nf 5326 10048 10050\nf 10048 235 10049\nf 10050 10049 4102\nf 2893 10051 10053\nf 10051 2894 10052\nf 10053 10052 4073\nf 4102 10054 10056\nf 10054 237 10055\nf 10056 10055 4103\nf 2894 10057 10059\nf 10057 1582 10058\nf 10059 10058 2895\nf 1582 10060 10062\nf 10060 4103 10061\nf 10062 10061 4104\nf 239 10063 10065\nf 10063 1583 10064\nf 10065 10064 4104\nf 143 10066 6165\nf 10066 2895 6585\nf 6165 6585 17\nf 1583 10063 6588\nf 10063 239 10067\nf 6588 10067 1584\nf 144 10068 9251\nf 10068 1584 10067\nf 9251 10067 239\nf 17 6589 8620\nf 6589 1584 10069\nf 8620 10069 1254\nf 1584 10068 6166\nf 10068 144 9258\nf 6166 9258 5973\nf 1254 10069 6590\nf 10069 1584 6168\nf 6590 6168 1585\nf 5929 10070 10072\nf 10070 1586 10071\nf 10072 10071 5917\nf 331 10073 10075\nf 10073 2949 10074\nf 10075 10074 3148\nf 1633 6603 10077\nf 6603 1635 10076\nf 10077 10076 339\nf 341 6761 10079\nf 6761 340 10078\nf 10079 10078 418\nf 342 6606 6700\nf 6606 1615 10080\nf 6700 10080 344\nf 1589 10081 7227\nf 10081 345 10082\nf 7227 10082 346\nf 348 10083 6610\nf 10083 1645 10084\nf 6610 10084 86\nf 2898 6607 10085\nf 6607 86 10084\nf 10085 10084 1645\nf 350 10086 10088\nf 10086 84 10087\nf 10088 10087 1591\nf 1590 6613 8701\nf 6613 1591 10087\nf 8701 10087 84\nf 349 6614 10089\nf 6614 1590 8914\nf 10089 8914 82\nf 81 8700 6615\nf 8700 84 10086\nf 6615 10086 350\nf 75 10090 10092\nf 10090 1593 10091\nf 10092 10091 4161\nf 1593 10090 8692\nf 10090 75 8691\nf 8692 8691 1520\nf 1594 10093 10094\nf 10093 4161 10091\nf 10094 10091 1593\nf 76 6622 9760\nf 6622 2899 6620\nf 9760 6620 77\nf 351 10095 10096\nf 10095 1278 6624\nf 10096 6624 4105\nf 1278 10095 6066\nf 10095 351 6623\nf 6066 6623 76\nf 350 10097 6616\nf 10097 5524 10098\nf 6616 10098 1592\nf 4105 10099 10101\nf 10099 1592 10100\nf 10101 10100 1821\nf 353 10102 10104\nf 10102 1277 10103\nf 10104 10103 4163\nf 1277 10102 8689\nf 10102 353 7037\nf 8689 7037 3041\nf 4091 6627 10105\nf 6627 4163 10103\nf 10105 10103 1277\nf 1596 10106 10107\nf 10106 1595 6628\nf 10107 6628 4091\nf 352 7034 10108\nf 7034 1596 9966\nf 10108 9966 75\nf 354 10109 10110\nf 10109 1276 6633\nf 10110 6633 4165\nf 1276 10109 8679\nf 10109 354 6630\nf 8679 6630 70\nf 355 10111 8676\nf 10111 3992 10112\nf 8676 10112 2743\nf 1275 10113 10115\nf 10113 1599 10114\nf 10115 10114 69\nf 1275 9423 10113\nf 9423 2900 10116\nf 10113 10116 1599\nf 356 10117 10119\nf 10117 1274 10118\nf 10119 10118 4168\nf 1274 10117 10120\nf 10117 356 6637\nf 10120 6637 68\nf 355 10121 10111\nf 10121 4167 7038\nf 10111 7038 3992\nf 1600 10122 10123\nf 10122 4168 10118\nf 10123 10118 1274\nf 1601 10124 8673\nf 10124 4170 10125\nf 8673 10125 4106\nf 68 6636 9638\nf 6636 2901 10126\nf 9638 10126 3927\nf 4106 9641 8674\nf 9641 1273 10127\nf 8674 10127 3927\nf 1272 10128 10129\nf 10128 4172 6641\nf 10129 6641 3965\nf 357 10130 10132\nf 10130 1602 10131\nf 10132 10131 67\nf 325 9095 10134\nf 9095 63 10133\nf 10134 10133 1603\nf 1406 10135 10136\nf 10135 1603 10133\nf 10136 10133 63\nf 326 10137 10139\nf 10137 5929 10138\nf 10139 10138 5923\nf 4199 10140 10141\nf 10140 1270 9093\nf 10141 9093 325\nf 1605 10142 10144\nf 10142 368 10143\nf 10144 10143 4107\nf 368 10142 6993\nf 10142 1605 6990\nf 6993 6990 3002\nf 366 10145 10147\nf 10145 1606 10146\nf 10147 10146 369\nf 1607 10148 6660\nf 10148 369 10146\nf 6660 10146 1606\nf 369 10148 10149\nf 10148 1607 7225\nf 10149 7225 346\nf 1608 7197 6663\nf 7197 345 10081\nf 6663 10081 1589\nf 372 6673 10151\nf 6673 1609 10150\nf 10151 10150 5823\nf 1613 10152 10154\nf 10152 1610 10153\nf 10154 10153 1611\nf 1611 10155 6682\nf 10155 373 10156\nf 6682 10156 1612\nf 373 10155 6672\nf 10155 1611 10157\nf 6672 10157 1609\nf 376 6680 7162\nf 6680 1612 10156\nf 7162 10156 373\nf 1611 6681 10154\nf 6681 377 10158\nf 10154 10158 1613\nf 1610 10152 6670\nf 10152 1613 10159\nf 6670 10159 371\nf 378 7148 10160\nf 7148 381 6690\nf 10160 6690 1614\nf 344 10080 6701\nf 10080 1615 10161\nf 6701 10161 382\nf 383 10162 10163\nf 10162 1616 6705\nf 10163 6705 1618\nf 1618 6704 10164\nf 6704 344 6703\nf 10164 6703 2903\nf 1618 10165 10163\nf 10165 386 10166\nf 10163 10166 383\nf 1617 10167 6709\nf 10167 1618 10164\nf 6709 10164 2903\nf 1616 10162 6696\nf 10162 383 10168\nf 6696 10168 384\nf 1617 6708 10170\nf 6708 388 10169\nf 10170 10169 386\nf 1620 6729 10171\nf 6729 396 6734\nf 10171 6734 1619\nf 1620 10172 6718\nf 10172 398 10173\nf 6718 10173 394\nf 398 10172 10174\nf 10172 1620 10171\nf 10174 10171 1619\nf 1621 6725 7081\nf 6725 1619 6736\nf 7081 6736 399\nf 1621 10175 6726\nf 10175 400 10176\nf 6726 10176 397\nf 1619 6724 10174\nf 6724 397 10177\nf 10174 10177 398\nf 1622 10178 10180\nf 10178 403 10179\nf 10180 10179 5924\nf 403 10178 6739\nf 10178 1622 10181\nf 6739 10181 401\nf 5924 10182 10180\nf 10182 404 10183\nf 10180 10183 1622\nf 3099 10184 10185\nf 10184 1624 6744\nf 10185 6744 1623\nf 407 10186 7219\nf 10186 3093 6746\nf 7219 6746 406\nf 408 7195 6749\nf 7195 1885 10187\nf 6749 10187 1626\nf 1885 10188 10187\nf 10188 409 7239\nf 10187 7239 1626\nf 410 10189 10191\nf 10189 1627 10190\nf 10191 10190 1894\nf 1626 10192 6750\nf 10192 1894 10190\nf 6750 10190 1627\nf 632 10193 10195\nf 10193 1628 10194\nf 10195 10194 412\nf 413 6753 10196\nf 6753 412 10194\nf 10196 10194 1628\nf 416 7256 10197\nf 7256 1909 7249\nf 10197 7249 417\nf 416 10197 6758\nf 10197 417 7270\nf 6758 7270 1629\nf 1630 6759 10199\nf 6759 1629 10198\nf 10199 10198 418\nf 341 10200 10201\nf 10200 1629 7269\nf 10201 7269 1910\nf 1745 10202 6768\nf 10202 1632 6764\nf 6768 6764 1631\nf 420 10203 10205\nf 10203 1745 10204\nf 10205 10204 1744\nf 1632 10202 10206\nf 10202 1745 10203\nf 10206 10203 420\nf 1744 6601 10205\nf 6601 1633 10207\nf 10205 10207 420\nf 429 10208 6769\nf 10208 421 10209\nf 6769 10209 1764\nf 1634 10210 6780\nf 10210 1764 10209\nf 6780 10209 421\nf 5822 10211 10212\nf 10211 1635 6774\nf 10212 6774 1636\nf 422 6975 10214\nf 6975 5822 10213\nf 10214 10213 1766\nf 425 6776 10216\nf 6776 422 10215\nf 10216 10215 1637\nf 1634 6779 10217\nf 6779 1637 10215\nf 10217 10215 422\nf 4108 10218 10220\nf 10218 1639 10219\nf 10220 10219 1640\nf 1639 10221 10223\nf 10221 441 10222\nf 10223 10222 333\nf 441 10221 10224\nf 10221 1639 10218\nf 10224 10218 4108\nf 461 10225 10226\nf 10225 447 6839\nf 10226 6839 1641\nf 449 10227 7028\nf 10227 1643 10228\nf 7028 10228 1644\nf 82 8911 10229\nf 8911 1280 6608\nf 10229 6608 2898\nf 454 10230 10231\nf 10230 1645 10083\nf 10231 10083 348\nf 1645 10230 10233\nf 10230 454 10232\nf 10233 10232 1646\nf 1732 6834 10234\nf 6834 1655 6833\nf 10234 6833 4109\nf 1649 10235 10237\nf 10235 2906 10236\nf 10237 10236 455\nf 2904 6807 10238\nf 6807 442 6826\nf 10238 6826 1640\nf 1735 6934 10239\nf 6934 1648 6822\nf 10239 6822 1650\nf 1650 6821 10241\nf 6821 2904 10240\nf 10241 10240 1651\nf 1650 10241 10242\nf 10241 1651 6597\nf 10242 6597 335\nf 1651 10243 6823\nf 10243 1639 10223\nf 6823 10223 333\nf 1652 10244 10246\nf 10244 443 10245\nf 10246 10245 4108\nf 445 6840 6825\nf 6840 1652 10247\nf 6825 10247 1640\nf 1652 10248 10244\nf 10248 444 10249\nf 10244 10249 443\nf 1653 10250 10251\nf 10250 445 6827\nf 10251 6827 442\nf 1657 10252 6828\nf 10252 1653 10253\nf 6828 10253 1654\nf 1653 10251 10255\nf 10251 442 10254\nf 10255 10254 2906\nf 2908 6829 10257\nf 6829 1654 10256\nf 10257 10256 456\nf 456 10256 10259\nf 10256 1654 10258\nf 10259 10258 1647\nf 1654 10253 10260\nf 10253 1653 10255\nf 10260 10255 2906\nf 1660 6851 10261\nf 6851 1655 6836\nf 10261 6836 2907\nf 1641 6838 10262\nf 6838 444 10248\nf 10262 10248 1652\nf 1652 6842 10262\nf 6842 1656 6811\nf 10262 6811 1641\nf 1664 10263 10265\nf 10263 1656 10264\nf 10265 10264 1658\nf 1658 10264 6843\nf 10264 1656 6841\nf 6843 6841 445\nf 1658 6845 10267\nf 6845 1657 10266\nf 10267 10266 4111\nf 4111 10266 10268\nf 10266 1657 6830\nf 10268 6830 2908\nf 1657 6844 10252\nf 6844 445 10250\nf 10252 10250 1653\nf 1659 10269 6846\nf 10269 2908 10257\nf 6846 10257 456\nf 1666 6863 10270\nf 6863 1659 6848\nf 10270 6848 2909\nf 2909 6847 6850\nf 6847 456 10271\nf 6850 10271 1655\nf 1661 10272 10274\nf 10272 1660 10273\nf 10274 10273 4112\nf 458 10275 10277\nf 10275 5837 10276\nf 10277 10276 2911\nf 461 10226 6870\nf 10226 1641 6810\nf 6870 6810 1663\nf 447 10225 10278\nf 10225 461 6853\nf 10278 6853 446\nf 1671 6871 10279\nf 6871 1663 6857\nf 10279 6857 1665\nf 1663 6809 6855\nf 6809 1656 10263\nf 6855 10263 1664\nf 462 10280 10282\nf 10280 4115 10281\nf 10282 10281 4114\nf 462 10282 10284\nf 10282 4114 10283\nf 10284 10283 4111\nf 462 10284 10286\nf 10284 4111 10285\nf 10286 10285 457\nf 462 10286 6873\nf 10286 457 10287\nf 6873 10287 2914\nf 2914 10288 6874\nf 10288 1667 10289\nf 6874 10289 5327\nf 463 10290 10292\nf 10290 1661 10291\nf 10292 10291 458\nf 1661 10274 10291\nf 10274 4112 10293\nf 10291 10293 458\nf 1668 10294 10296\nf 10294 2916 10295\nf 10296 10295 2911\nf 459 10297 10299\nf 10297 2953 10298\nf 10299 10298 2918\nf 1670 6864 6852\nf 6864 460 10300\nf 6852 10300 446\nf 1681 6878 6866\nf 6878 1670 10301\nf 6866 10301 1671\nf 1670 6854 10301\nf 6854 461 6869\nf 10301 6869 1671\nf 4125 6867 10303\nf 6867 1671 10302\nf 10303 10302 4117\nf 466 10304 10306\nf 10304 4117 10305\nf 10306 10305 4115\nf 1665 10307 10308\nf 10307 4115 10305\nf 10308 10305 4117\nf 1667 10309 10311\nf 10309 467 10310\nf 10311 10310 5520\nf 4118 10312 10314\nf 10312 1668 10313\nf 10314 10313 4116\nf 468 10315 10317\nf 10315 4116 10316\nf 10317 10316 4119\nf 464 10318 10320\nf 10318 2918 10319\nf 10320 10319 4119\nf 469 10321 10323\nf 10321 2917 10322\nf 10323 10322 2912\nf 465 10324 10326\nf 10324 2951 10325\nf 10326 10325 2920\nf 2919 10327 10329\nf 10327 330 10328\nf 10329 10328 2921\nf 469 10330 10332\nf 10330 2920 10331\nf 10332 10331 4120\nf 2917 10333 10335\nf 10333 470 10334\nf 10335 10334 2922\nf 4121 10336 10338\nf 10336 1678 10337\nf 10338 10337 4204\nf 1678 10336 10340\nf 10336 4121 10339\nf 10340 10339 1675\nf 1673 10341 10343\nf 10341 4118 10342\nf 10343 10342 2923\nf 4122 10344 10346\nf 10344 467 10345\nf 10346 10345 2915\nf 4123 10347 10349\nf 10347 1680 10348\nf 10349 10348 4124\nf 4123 10350 10352\nf 10350 466 10351\nf 10352 10351 2913\nf 4117 10353 10303\nf 10353 473 10354\nf 10303 10354 4125\nf 1681 6868 6880\nf 6868 4125 10355\nf 6880 10355 3154\nf 1642 6881 10356\nf 6881 3154 7282\nf 10356 7282 474\nf 448 6814 10357\nf 6814 1642 10356\nf 10357 10356 474\nf 2999 10358 10360\nf 10358 2958 10359\nf 10360 10359 2927\nf 478 10361 10363\nf 10361 3000 10362\nf 10363 10362 2926\nf 477 10364 10366\nf 10364 494 10365\nf 10366 10365 2929\nf 480 10367 10369\nf 10367 2998 10368\nf 10369 10368 2928\nf 479 10370 10372\nf 10370 2961 10371\nf 10372 10371 2930\nf 481 10373 10375\nf 10373 2963 10374\nf 10375 10374 2932\nf 484 10376 10378\nf 10376 2995 10377\nf 10378 10377 2931\nf 483 10379 10381\nf 10379 2965 10380\nf 10381 10380 2934\nf 486 10382 10384\nf 10382 2993 10383\nf 10384 10383 2933\nf 485 10385 10387\nf 10385 2967 10386\nf 10387 10386 2936\nf 487 10388 10390\nf 10388 2991 10389\nf 10390 10389 2935\nf 488 10391 10393\nf 10391 2988 10392\nf 10393 10392 2937\nf 1697 10394 10396\nf 10394 4132 10395\nf 10396 10395 1695\nf 1694 6884 10397\nf 6884 1695 10395\nf 10397 10395 4132\nf 4958 10398 10399\nf 10398 488 10393\nf 10399 10393 2937\nf 1696 6882 10401\nf 6882 1694 10400\nf 10401 10400 489\nf 2986 10402 6983\nf 10402 1695 6886\nf 6983 6886 490\nf 1701 10403 10405\nf 10403 1696 10404\nf 10405 10404 1699\nf 1699 10404 10406\nf 10404 1696 10401\nf 10406 10401 489\nf 1700 10407 10409\nf 10407 1698 10408\nf 10409 10408 491\nf 490 6885 6979\nf 6885 1696 10403\nf 6979 10403 1701\nf 4126 10410 10411\nf 10410 1698 10407\nf 10411 10407 1700\nf 1701 10405 10413\nf 10405 1699 10412\nf 10413 10412 4126\nf 1705 10414 10416\nf 10414 2985 10415\nf 10416 10415 1703\nf 1703 10415 10418\nf 10415 2985 10417\nf 10418 10417 1700\nf 1704 10419 10420\nf 10419 1702 6957\nf 10420 6957 492\nf 1703 10421 10422\nf 10421 1702 10419\nf 10422 10419 1704\nf 1705 10416 10423\nf 10416 1703 10422\nf 10423 10422 1704\nf 1704 10420 6891\nf 10420 492 10424\nf 6891 10424 1706\nf 493 10425 10426\nf 10425 1706 10424\nf 10426 10424 492\nf 428 6892 6796\nf 6892 1706 6893\nf 6796 6893 426\nf 1706 10425 6894\nf 10425 493 10427\nf 6894 10427 1707\nf 338 10428 10429\nf 10428 1707 10427\nf 10429 10427 493\nf 426 6895 6793\nf 6895 1707 6896\nf 6793 6896 431\nf 1707 10428 6897\nf 10428 338 10430\nf 6897 10430 435\nf 337 10431 6599\nf 10431 436 10432\nf 6599 10432 338\nf 436 6799 10432\nf 6799 435 10430\nf 10432 10430 338\nf 3144 10433 10435\nf 10433 496 10434\nf 10435 10434 2959\nf 495 10436 10438\nf 10436 2948 10437\nf 10438 10437 2939\nf 498 10439 10441\nf 10439 2960 10440\nf 10441 10440 2938\nf 497 10442 10444\nf 10442 2950 10443\nf 10444 10443 2941\nf 500 10445 10447\nf 10445 2962 10446\nf 10447 10446 2940\nf 499 10448 10450\nf 10448 2952 10449\nf 10450 10449 2943\nf 502 10451 10453\nf 10451 2964 10452\nf 10453 10452 2942\nf 501 10454 10456\nf 10454 2954 10455\nf 10456 10455 2945\nf 504 10457 10459\nf 10457 2966 10458\nf 10459 10458 2944\nf 503 10460 10462\nf 10460 2957 10461\nf 10462 10461 2947\nf 2946 10463 10465\nf 10463 2968 10464\nf 10465 10464 1718\nf 1719 6900 10467\nf 6900 1720 10466\nf 10467 10466 4127\nf 1721 6898 10469\nf 6898 1719 10468\nf 10469 10468 1731\nf 1722 10470 6945\nf 10470 1720 6902\nf 6945 6902 507\nf 1726 10471 10473\nf 10471 4128 10472\nf 10473 10472 1724\nf 1724 10472 6903\nf 10472 4128 10474\nf 6903 10474 506\nf 1725 10475 10476\nf 10475 1723 6929\nf 10476 6929 508\nf 1724 10477 10478\nf 10477 1723 10475\nf 10478 10475 1725\nf 1726 10473 6906\nf 10473 1724 10478\nf 6906 10478 1725\nf 1730 10479 10481\nf 10479 4129 10480\nf 10481 10480 1728\nf 1728 10480 6909\nf 10480 4129 10482\nf 6909 10482 508\nf 509 6907 6953\nf 6907 1725 10483\nf 6953 10483 4129\nf 1728 10484 10485\nf 10484 1727 6937\nf 10485 6937 1729\nf 1729 6913 10485\nf 6913 1730 10481\nf 10485 10481 1728\nf 1638 10486 10488\nf 10486 440 10487\nf 10488 10487 5978\nf 438 10489 10490\nf 10489 5978 10487\nf 10490 10487 440\nf 3146 10491 10493\nf 10491 497 10492\nf 10493 10492 2938\nf 332 10494 10496\nf 10494 2897 10495\nf 10496 10495 2950\nf 499 10497 10499\nf 10497 2940 10498\nf 10499 10498 2949\nf 331 10500 10502\nf 10500 2919 10501\nf 10502 10501 2952\nf 501 10503 10505\nf 10503 2942 10504\nf 10505 10504 2951\nf 465 10506 10508\nf 10506 2912 10507\nf 10508 10507 2954\nf 503 10509 10511\nf 10509 2944 10510\nf 10511 10510 2953\nf 459 10512 10514\nf 10512 2910 10513\nf 10514 10513 5522\nf 2956 10515 10517\nf 10515 2946 10516\nf 10517 10516 1717\nf 2907 6923 10519\nf 6923 1731 10518\nf 10519 10518 4110\nf 1719 10520 10522\nf 10520 2955 10521\nf 10522 10521 4110\nf 1721 10469 10524\nf 10469 1731 10523\nf 10524 10523 506\nf 1723 10525 10526\nf 10525 4130 6926\nf 10526 6926 1733\nf 4109 6927 10234\nf 6927 4130 6925\nf 10234 6925 1732\nf 1734 10527 10528\nf 10527 1649 10237\nf 10528 10237 455\nf 1733 10529 10530\nf 10529 1649 10527\nf 10530 10527 1734\nf 1734 6930 10530\nf 6930 1723 10526\nf 10530 10526 1733\nf 1727 10531 10533\nf 10531 4131 10532\nf 10533 10532 1735\nf 1735 10532 6932\nf 10532 4131 10534\nf 6932 10534 455\nf 1736 10535 10536\nf 10535 1650 10242\nf 10536 10242 335\nf 508 6931 6910\nf 6931 1734 10537\nf 6910 10537 4131\nf 1735 10239 10538\nf 10239 1650 10535\nf 10538 10535 1736\nf 1727 10533 6935\nf 10533 1735 10538\nf 6935 10538 1736\nf 1736 10536 6938\nf 10536 335 10539\nf 6938 10539 1638\nf 334 10540 6596\nf 10540 440 10541\nf 6596 10541 335\nf 440 10486 10541\nf 10486 1638 10539\nf 10541 10539 335\nf 479 10542 10544\nf 10542 2928 10543\nf 10544 10543 2959\nf 496 10545 10547\nf 10545 2939 10546\nf 10547 10546 2961\nf 481 10548 10550\nf 10548 482 10549\nf 10550 10549 2960\nf 498 10551 10553\nf 10551 2941 10552\nf 10553 10552 2963\nf 483 10554 10556\nf 10554 2931 10555\nf 10556 10555 2962\nf 500 10557 10559\nf 10557 2943 10558\nf 10559 10558 2965\nf 485 10560 10562\nf 10560 2933 10561\nf 10562 10561 2964\nf 502 10563 10565\nf 10563 2945 10564\nf 10565 10564 2967\nf 2970 10566 10568\nf 10566 2935 10567\nf 10568 10567 2966\nf 504 10569 10571\nf 10569 2947 10570\nf 10571 10570 2969\nf 488 10398 10573\nf 10398 4958 10572\nf 10573 10572 1697\nf 505 10574 10575\nf 10574 1694 10397\nf 10575 10397 4132\nf 4132 10576 10578\nf 10576 4958 10577\nf 10578 10577 2968\nf 1694 10579 10400\nf 10579 1722 6944\nf 10400 6944 489\nf 1698 10580 10581\nf 10580 4133 6946\nf 10581 6946 1737\nf 4128 6947 10583\nf 6947 4133 10582\nf 10583 10582 507\nf 1738 10584 10585\nf 10584 1726 6908\nf 10585 6908 509\nf 1698 10586 10580\nf 10586 1699 10587\nf 10580 10587 4133\nf 1737 10588 6950\nf 10588 1726 10584\nf 6950 10584 1738\nf 491 10408 6949\nf 10408 1698 10581\nf 6949 10581 1737\nf 1702 10589 10591\nf 10589 4134 10590\nf 10591 10590 1739\nf 1739 10590 6952\nf 10590 4134 10592\nf 6952 10592 509\nf 1740 10593 10594\nf 10593 1730 6912\nf 10594 6912 510\nf 491 6951 6888\nf 6951 1738 10595\nf 6888 10595 4134\nf 1739 10596 10597\nf 10596 1730 10593\nf 10597 10593 1740\nf 1702 10591 6955\nf 10591 1739 10597\nf 6955 10597 1740\nf 1740 10594 6958\nf 10594 510 10598\nf 6958 10598 1741\nf 437 10599 6915\nf 10599 1741 10598\nf 6915 10598 510\nf 492 6959 10426\nf 6959 1741 6960\nf 10426 6960 493\nf 1741 10599 6961\nf 10599 437 10600\nf 6961 10600 1742\nf 439 10601 6804\nf 10601 1742 10600\nf 6804 10600 437\nf 493 6962 10429\nf 6962 1742 6963\nf 10429 6963 338\nf 1742 10601 6964\nf 10601 439 10602\nf 6964 10602 1743\nf 439 6916 10602\nf 6916 336 6965\nf 10602 6965 1743\nf 1635 10211 10076\nf 10211 5822 10603\nf 10076 10603 339\nf 1635 6602 6772\nf 6602 1744 6967\nf 6772 6967 423\nf 1746 6968 10604\nf 6968 1744 10204\nf 10604 10204 1745\nf 511 10605 10606\nf 10605 1745 6767\nf 10606 6767 419\nf 1745 10605 10604\nf 10605 511 10607\nf 10604 10607 1746\nf 419 7272 10609\nf 7272 3125 10608\nf 10609 10608 2972\nf 513 6986 6973\nf 6986 2987 10610\nf 6973 10610 2971\nf 512 10611 6970\nf 10611 3127 10612\nf 6970 10612 2973\nf 515 10613 10615\nf 10613 2990 10614\nf 10615 10614 514\nf 514 10616 10618\nf 10616 3130 10617\nf 10618 10617 2975\nf 517 10619 10621\nf 10619 2992 10620\nf 10621 10620 2974\nf 516 10622 10624\nf 10622 3132 10623\nf 10624 10623 2977\nf 519 10625 10627\nf 10625 2994 10626\nf 10627 10626 2976\nf 521 10628 10630\nf 10628 2996 10629\nf 10630 10629 2978\nf 520 10631 10633\nf 10631 3135 10632\nf 10633 10632 2980\nf 523 10634 10636\nf 10634 2997 10635\nf 10636 10635 2979\nf 522 10637 10639\nf 10637 3137 10638\nf 10639 10638 2982\nf 525 10640 10642\nf 10640 2999 10641\nf 10642 10641 2981\nf 524 10643 10645\nf 10643 3138 10644\nf 10645 10644 2984\nf 2983 10646 10648\nf 10646 2925 10647\nf 10648 10647 1761\nf 1705 10649 10650\nf 10649 1763 6770\nf 10650 6770 1764\nf 1765 10651 10652\nf 10651 1634 10217\nf 10652 10217 422\nf 428 6784 10653\nf 6784 1763 10649\nf 10653 10649 1705\nf 2985 10654 10655\nf 10654 1634 10651\nf 10655 10651 1765\nf 1705 10650 10414\nf 10650 1764 10656\nf 10414 10656 2985\nf 1701 10657 10659\nf 10657 4135 10658\nf 10659 10658 1766\nf 1766 10658 10214\nf 10658 4135 10660\nf 10214 10660 422\nf 1767 10661 10662\nf 10661 1636 6773\nf 10662 6773 423\nf 1701 10413 10657\nf 10413 4126 10663\nf 10657 10663 4135\nf 1766 10664 10665\nf 10664 1636 10661\nf 10665 10661 1767\nf 1701 10659 6977\nf 10659 1766 10665\nf 6977 10665 1767\nf 1697 10666 10668\nf 10666 2986 10667\nf 10668 10667 1768\nf 1768 10667 6980\nf 10667 2986 10669\nf 6980 10669 423\nf 488 10670 10671\nf 10670 1746 10607\nf 10671 10607 511\nf 1768 10672 10668\nf 10672 488 10573\nf 10668 10573 1697\nf 488 10672 10670\nf 10672 1768 6981\nf 10670 6981 1746\nf 511 10673 10675\nf 10673 2972 10674\nf 10675 10674 2988\nf 487 10676 10678\nf 10676 1693 10677\nf 10678 10677 2987\nf 1750 10679 10681\nf 10679 1691 10680\nf 10681 10680 2991\nf 486 10682 10684\nf 10682 2936 10683\nf 10684 10683 2989\nf 515 10685 10687\nf 10685 2975 10686\nf 10687 10686 2993\nf 484 10688 10690\nf 10688 2934 10689\nf 10690 10689 2992\nf 517 10691 10693\nf 10691 2977 10692\nf 10693 10692 2995\nf 482 10694 10696\nf 10694 2932 10695\nf 10696 10695 2994\nf 480 10697 10699\nf 10697 2930 10698\nf 10699 10698 2996\nf 521 10700 10702\nf 10700 2980 10701\nf 10702 10701 2998\nf 478 10703 10705\nf 10703 2929 10704\nf 10705 10704 2997\nf 523 10706 10708\nf 10706 2982 10707\nf 10708 10707 3000\nf 476 10709 10710\nf 10709 2958 10358\nf 10710 10358 2999\nf 525 10711 10713\nf 10711 2984 10712\nf 10713 10712 3001\nf 2983 10714 10646\nf 10714 475 10715\nf 10646 10715 2925\nf 366 6653 10145\nf 6653 365 10716\nf 10145 10716 1606\nf 1769 6656 6995\nf 6656 1606 10716\nf 6995 10716 365\nf 526 10717 6999\nf 10717 3003 6996\nf 6999 6996 365\nf 3004 7001 10718\nf 7001 367 6994\nf 10718 6994 3002\nf 3003 10719 10720\nf 10719 529 7007\nf 10720 7007 1770\nf 529 10719 10721\nf 10719 3003 10717\nf 10721 10717 526\nf 535 10722 10724\nf 10722 328 10723\nf 10724 10723 1771\nf 1772 10725 10727\nf 10725 533 10726\nf 10727 10726 543\nf 532 10728 10730\nf 10728 3021 10729\nf 10730 10729 3007\nf 3006 10731 10733\nf 10731 3014 10732\nf 10733 10732 1774\nf 4960 10734 10736\nf 10734 535 10735\nf 10736 10735 4139\nf 526 10737 10739\nf 10737 363 10738\nf 10739 10738 1776\nf 1776 10738 7004\nf 10738 363 10740\nf 7004 10740 364\nf 4136 10741 10743\nf 10741 530 10742\nf 10743 10742 3023\nf 530 10744 10746\nf 10744 1777 10745\nf 10746 10745 3141\nf 1770 10747 10748\nf 10747 527 7002\nf 10748 7002 3004\nf 1770 10749 10747\nf 10749 1778 7009\nf 10747 7009 527\nf 1778 10749 10750\nf 10749 1770 7006\nf 10750 7006 1779\nf 537 10751 10752\nf 10751 1779 7005\nf 10752 7005 529\nf 1776 7011 10753\nf 7011 537 10752\nf 10753 10752 529\nf 526 10739 10721\nf 10739 1776 10753\nf 10721 10753 529\nf 362 7021 7014\nf 7021 1780 10754\nf 7014 10754 536\nf 3149 10755 10757\nf 10755 540 10756\nf 10757 10756 1781\nf 539 10758 10760\nf 10758 3026 10759\nf 10760 10759 3011\nf 542 10761 10763\nf 10761 3064 10762\nf 10763 10762 3010\nf 541 10764 10766\nf 10764 3027 10765\nf 10766 10765 3013\nf 544 10767 10769\nf 10767 3062 10768\nf 10769 10768 3012\nf 546 10770 10772\nf 10770 3060 10771\nf 10772 10771 3014\nf 545 10773 10775\nf 10773 3028 10774\nf 10775 10774 3016\nf 3069 10776 10778\nf 10776 1790 10777\nf 10778 10777 3151\nf 3072 10779 10781\nf 10779 1791 10780\nf 10781 10780 4137\nf 3075 10782 10784\nf 10782 1792 10783\nf 10784 10783 4183\nf 4138 10785 10787\nf 10785 3075 10786\nf 10787 10786 554\nf 554 10788 10787\nf 10788 3063 10789\nf 10787 10789 4138\nf 557 10790 10792\nf 10790 3077 10791\nf 10792 10791 3017\nf 557 10793 10795\nf 10793 556 10794\nf 10795 10794 4191\nf 1795 10796 10798\nf 10796 1796 10797\nf 10798 10797 3061\nf 4193 10799 10801\nf 10799 558 10800\nf 10801 10800 3059\nf 560 10802 10804\nf 10802 1798 10803\nf 10804 10803 3060\nf 3143 10805 10807\nf 10805 534 10806\nf 10807 10806 3006\nf 329 10808 10810\nf 10808 2896 10809\nf 10810 10809 3022\nf 535 10734 10812\nf 10734 4960 10811\nf 10812 10811 4959\nf 1771 10813 10815\nf 10813 4136 10814\nf 10815 10814 4139\nf 4140 10816 10817\nf 10816 4136 10743\nf 10817 10743 3023\nf 3024 7016 10818\nf 7016 3023 10742\nf 10818 10742 530\nf 1779 10819 10750\nf 10819 1800 10820\nf 10750 10820 1778\nf 1779 10751 10822\nf 10751 537 10821\nf 10822 10821 4141\nf 564 10823 10824\nf 10823 3057 7048\nf 10824 7048 4141\nf 564 10825 10826\nf 10825 1780 7020\nf 10826 7020 1801\nf 1780 10825 7013\nf 10825 564 10827\nf 7013 10827 537\nf 565 10828 7022\nf 10828 1801 7019\nf 7022 7019 362\nf 3147 10829 10831\nf 10829 541 10830\nf 10831 10830 3010\nf 531 10832 10834\nf 10832 3005 10833\nf 10834 10833 3027\nf 533 10835 10837\nf 10835 3007 10836\nf 10837 10836 1786\nf 3006 10838 10731\nf 10838 545 10839\nf 10731 10839 3014\nf 545 10840 10773\nf 10840 534 10841\nf 10773 10841 3028\nf 4142 10842 10844\nf 10842 1802 10843\nf 10844 10843 4140\nf 1800 10845 10846\nf 10845 4141 7050\nf 10846 7050 3058\nf 1801 7023 10826\nf 7023 567 10847\nf 10826 10847 564\nf 1801 10828 7024\nf 10828 565 10848\nf 7024 10848 1803\nf 359 10849 7026\nf 10849 1803 10848\nf 7026 10848 565\nf 450 6817 10851\nf 6817 2905 10850\nf 10851 10850 1804\nf 1805 10852 10854\nf 10852 4143 10853\nf 10854 10853 3045\nf 3029 10855 10857\nf 10855 1805 10856\nf 10857 10856 4144\nf 3030 10858 10860\nf 10858 1806 10859\nf 10860 10859 4173\nf 1807 10861 10863\nf 10861 4145 10862\nf 10863 10862 3048\nf 3031 10864 10866\nf 10864 1807 10865\nf 10866 10865 4174\nf 1808 10867 10869\nf 10867 4146 10868\nf 10869 10868 3049\nf 3032 10870 10872\nf 10870 1808 10871\nf 10872 10871 4175\nf 1809 10873 10875\nf 10873 4147 10874\nf 10875 10874 3050\nf 3033 10876 10878\nf 10876 1809 10877\nf 10878 10877 4176\nf 1810 10879 10881\nf 10879 4148 10880\nf 10881 10880 3051\nf 3034 10882 10884\nf 10882 1810 10883\nf 10884 10883 4177\nf 1811 10885 10887\nf 10885 4156 10886\nf 10887 10886 3052\nf 2905 6816 10889\nf 6816 452 10888\nf 10889 10888 1644\nf 450 10890 10892\nf 10890 4143 10891\nf 10892 10891 4149\nf 1820 10893 10895\nf 10893 1813 10894\nf 10895 10894 3029\nf 1814 10896 10898\nf 10896 4151 10897\nf 10898 10897 4150\nf 570 10899 10901\nf 10899 3047 10900\nf 10901 10900 4150\nf 3037 10902 10904\nf 10902 1814 10903\nf 10904 10903 3030\nf 572 10905 10907\nf 10905 4145 10906\nf 10907 10906 4152\nf 3038 10908 10910\nf 10908 1815 10909\nf 10910 10909 3031\nf 574 10911 10913\nf 10911 4146 10912\nf 10913 10912 4153\nf 3039 10914 10916\nf 10914 1816 10915\nf 10916 10915 3032\nf 576 10917 10919\nf 10917 4147 10918\nf 10919 10918 4154\nf 3040 10920 10922\nf 10920 1817 10921\nf 10922 10921 3033\nf 578 10923 10925\nf 10923 4148 10924\nf 10925 10924 4155\nf 3042 10926 10928\nf 10926 1818 10927\nf 10928 10927 3034\nf 3043 10929 10931\nf 10929 1811 10930\nf 10931 10930 3035\nf 582 10932 10934\nf 10932 3053 10933\nf 10934 10933 4169\nf 4170 10935 10937\nf 10935 1819 10936\nf 10937 10936 3036\nf 593 10938 10940\nf 10938 3054 10939\nf 10940 10939 4171\nf 3044 10941 10943\nf 10941 1812 10942\nf 10943 10942 4178\nf 1644 10888 10945\nf 10888 452 10944\nf 10945 10944 1646\nf 349 10946 6612\nf 10946 4158 10947\nf 6612 10947 1591\nf 452 6815 10949\nf 6815 450 10948\nf 10949 10948 5944\nf 5524 10950 10952\nf 10950 4151 10951\nf 10952 10951 1821\nf 4159 10953 10954\nf 10953 351 10096\nf 10954 10096 4105\nf 4159 10955 10957\nf 10955 1821 10956\nf 10957 10956 3037\nf 587 10958 10960\nf 10958 4152 10959\nf 10960 10959 4160\nf 4161 10961 10963\nf 10961 1822 10962\nf 10963 10962 3038\nf 588 10964 10966\nf 10964 4153 10965\nf 10966 10965 4162\nf 4163 10967 10969\nf 10967 1823 10968\nf 10969 10968 3039\nf 589 10970 10972\nf 10970 4154 10971\nf 10972 10971 4164\nf 4165 10973 10975\nf 10973 1824 10974\nf 10975 10974 3040\nf 590 10976 10978\nf 10976 4155 10977\nf 10978 10977 4166\nf 69 10979 10981\nf 10979 1825 10980\nf 10981 10980 3042\nf 591 10982 10984\nf 10982 4156 10983\nf 10984 10983 4167\nf 4168 10985 10987\nf 10985 1826 10986\nf 10987 10986 3043\nf 1601 10988 10990\nf 10988 2901 10989\nf 10990 10989 4169\nf 1827 10991 10993\nf 10991 1602 10992\nf 10993 10992 4171\nf 4172 10994 10996\nf 10994 1827 10995\nf 10996 10995 3044\nf 4144 10997 10999\nf 10997 1828 10998\nf 10999 10998 3153\nf 1829 11000 11002\nf 11000 3046 11001\nf 11002 11001 3068\nf 4173 11003 11005\nf 11003 1829 11004\nf 11005 11004 4185\nf 1830 11006 11008\nf 11006 3048 11007\nf 11008 11007 3070\nf 4174 11009 11011\nf 11009 1830 11010\nf 11011 11010 4187\nf 1831 11012 11014\nf 11012 3049 11013\nf 11014 11013 3073\nf 4175 11015 11017\nf 11015 1831 11016\nf 11017 11016 4188\nf 1832 11018 11020\nf 11018 3050 11019\nf 11020 11019 3076\nf 4176 11021 11023\nf 11021 1832 11022\nf 11023 11022 4189\nf 1833 11024 11026\nf 11024 3051 11025\nf 11026 11025 3078\nf 4177 11027 11029\nf 11027 1833 11028\nf 11029 11028 4190\nf 1834 11030 11032\nf 11030 3052 11031\nf 11032 11031 3079\nf 1834 11033 11035\nf 11033 581 11034\nf 11035 11034 3035\nf 1835 11036 11038\nf 11036 3053 11037\nf 11038 11037 3080\nf 4194 7064 11040\nf 7064 583 11039\nf 11040 11039 3036\nf 1836 11041 11043\nf 11041 3054 11042\nf 11043 11042 4195\nf 4178 11044 11046\nf 11044 1836 11045\nf 11046 11045 4196\nf 4180 11047 11049\nf 11047 326 11048\nf 11049 11048 3056\nf 4180 11050 11047\nf 11050 4198 11051\nf 11047 11051 326\nf 358 11052 8666\nf 11052 3055 11053\nf 8666 11053 66\nf 1271 11054 11056\nf 11054 66 11055\nf 11056 11055 1837\nf 1803 10849 11058\nf 10849 359 11057\nf 11058 11057 1604\nf 567 7025 11060\nf 7025 1803 11059\nf 11060 11059 4199\nf 602 11061 11063\nf 11061 1838 11062\nf 11063 11062 3057\nf 3025 11064 11066\nf 11064 3058 11065\nf 11066 11065 4181\nf 1799 11067 11069\nf 11067 4142 11068\nf 11069 11068 4182\nf 1799 11070 11072\nf 11070 547 11071\nf 11072 11071 1802\nf 562 11073 11075\nf 11073 3019 11074\nf 11075 11074 3015\nf 546 11076 11078\nf 11076 3016 11077\nf 11078 11077 3020\nf 544 11079 11081\nf 11079 1786 11080\nf 11081 11080 3059\nf 558 11082 11084\nf 11082 3018 11083\nf 11084 11083 3062\nf 542 11085 11087\nf 11085 3013 11086\nf 11087 11086 3061\nf 556 11088 11090\nf 11088 3017 11089\nf 11090 11089 3064\nf 540 11091 11093\nf 11091 3011 11092\nf 11093 11092 3063\nf 1781 11094 11096\nf 11094 554 11095\nf 11096 11095 4183\nf 4184 11097 11099\nf 11097 538 11098\nf 11099 11098 3009\nf 538 11097 11100\nf 11097 4184 7051\nf 11100 7051 552\nf 552 11101 11103\nf 11101 4137 11102\nf 11103 11102 3150\nf 4185 11104 11106\nf 11104 1841 11105\nf 11106 11105 3152\nf 1842 11107 11109\nf 11107 3070 11108\nf 11109 11108 4186\nf 4187 11110 11112\nf 11110 1842 11111\nf 11112 11111 3069\nf 551 11113 11115\nf 11113 3067 11114\nf 11115 11114 3073\nf 4188 11116 11118\nf 11116 1843 11117\nf 11118 11117 3071\nf 553 11119 11121\nf 11119 3065 11120\nf 11121 11120 3076\nf 4189 11122 11124\nf 11122 1844 11123\nf 11124 11123 3074\nf 1845 11125 11127\nf 11125 3078 11126\nf 11127 11126 1794\nf 4190 11128 11130\nf 11128 1845 11129\nf 11130 11129 3077\nf 1796 11131 11133\nf 11131 4192 11132\nf 11133 11132 3079\nf 3080 11134 7066\nf 11134 600 11135\nf 7066 11135 559\nf 559 11136 7067\nf 11136 558 10799\nf 7067 10799 4193\nf 4195 11137 11139\nf 11137 560 11138\nf 11139 11138 3020\nf 601 11140 11142\nf 11140 4196 11141\nf 11142 11141 3019\nf 4198 11143 11145\nf 11143 4197 11144\nf 11145 11144 4182\nf 1838 11146 11148\nf 11146 3081 11147\nf 11148 11147 4181\nf 1586 11149 6594\nf 11149 1838 11061\nf 6594 11061 602\nf 325 10134 11150\nf 10134 1603 6592\nf 11150 6592 602\nf 1270 10140 6642\nf 10140 4199 11151\nf 6642 11151 1604\nf 567 11060 11153\nf 11060 4199 11152\nf 11153 11152 602\nf 1848 7069 7047\nf 7069 1604 11057\nf 7047 11057 359\nf 1848 7046 8662\nf 7046 360 11154\nf 8662 11154 62\nf 1850 7074 11156\nf 7074 603 11155\nf 11156 11155 1849\nf 403 7076 7072\nf 7076 1850 11156\nf 7072 11156 1849\nf 1851 7079 11157\nf 7079 604 7075\nf 11157 7075 1850\nf 402 6733 7077\nf 6733 1851 11157\nf 7077 11157 1850\nf 402 7082 6731\nf 7082 400 10175\nf 6731 10175 1621\nf 1853 11158 11159\nf 11158 4806 7214\nf 11159 7214 1852\nf 604 11160 11161\nf 11160 3083 7091\nf 11161 7091 4805\nf 1854 7094 11163\nf 7094 606 11162\nf 11163 11162 1853\nf 399 6735 11165\nf 6735 396 11164\nf 11165 11164 3083\nf 1855 7097 7093\nf 7097 607 11166\nf 7093 11166 606\nf 396 6728 11167\nf 6728 5942 7099\nf 11167 7099 1854\nf 1856 11168 11170\nf 11168 5955 11169\nf 11170 11169 1855\nf 393 7104 11172\nf 7104 1856 11171\nf 11172 11171 5942\nf 5955 7107 7103\nf 7107 610 11173\nf 7103 11173 609\nf 389 7109 7105\nf 7109 1857 11174\nf 7105 11174 1856\nf 1858 11175 7111\nf 11175 2902 7114\nf 7111 7114 610\nf 391 11176 7110\nf 11176 1858 7112\nf 7110 7112 1857\nf 388 6707 7116\nf 6707 1858 11176\nf 7116 11176 391\nf 1860 7121 11178\nf 7121 611 11177\nf 11178 11177 1859\nf 605 7088 11180\nf 7088 5815 11179\nf 11180 11179 1859\nf 1861 11181 11182\nf 11181 5816 7122\nf 11182 7122 1860\nf 607 7129 7125\nf 7129 1861 11182\nf 7125 11182 1860\nf 1862 7132 11184\nf 7132 613 11183\nf 11184 11183 1861\nf 608 7134 7130\nf 7134 1862 11184\nf 7130 11184 1861\nf 1863 7137 11185\nf 7137 614 7133\nf 11185 7133 1862\nf 609 7139 7135\nf 7139 1863 11185\nf 7135 11185 1862\nf 615 7138 7143\nf 7138 1863 11186\nf 7143 11186 1864\nf 1863 7141 11186\nf 7141 4807 11187\nf 11186 11187 1864\nf 381 7149 7152\nf 7149 1864 11188\nf 7152 11188 1865\nf 1864 11187 11188\nf 11187 4807 7145\nf 11188 7145 1865\nf 1865 7151 7154\nf 7151 382 10161\nf 7154 10161 1615\nf 380 6686 11189\nf 6686 1866 6692\nf 11189 6692 343\nf 1868 11190 11192\nf 11190 3084 11191\nf 11192 11191 1867\nf 612 7158 7157\nf 7158 1868 11192\nf 7157 11192 1867\nf 3085 11193 11195\nf 11193 372 11194\nf 11195 11194 3084\nf 613 7160 7159\nf 7160 1869 11196\nf 7159 11196 1868\nf 1870 11197 11198\nf 11197 376 7164\nf 11198 7164 3085\nf 614 7165 7161\nf 7165 1870 11199\nf 7161 11199 1869\nf 376 11197 7167\nf 11197 1870 11200\nf 7167 11200 1871\nf 1870 7166 11200\nf 7166 615 7169\nf 11200 7169 1871\nf 1872 7171 11201\nf 7171 375 7168\nf 11201 7168 1871\nf 1872 11202 6684\nf 11202 378 10160\nf 6684 10160 1614\nf 378 11202 7170\nf 11202 1872 11201\nf 7170 11201 1871\nf 374 7172 11203\nf 7172 1872 6683\nf 11203 6683 379\nf 619 11204 11206\nf 11204 5823 11205\nf 11206 11205 1874\nf 619 11207 11209\nf 11207 627 11208\nf 11209 11208 3096\nf 3089 7203 11211\nf 7203 3095 11210\nf 11211 11210 3100\nf 622 11212 11213\nf 11212 605 7207\nf 11213 7207 3087\nf 621 11214 7180\nf 11214 629 11215\nf 7180 11215 3091\nf 624 7210 11217\nf 7210 1880 11216\nf 11217 11216 3090\nf 3103 11218 11220\nf 11218 1882 11219\nf 11220 11219 3092\nf 3102 11221 7233\nf 11221 626 7182\nf 7233 7182 1881\nf 1883 11222 11224\nf 11222 1884 11223\nf 11224 11223 625\nf 407 11225 11226\nf 11225 1884 11222\nf 11226 11222 1883\nf 1625 6747 7194\nf 6747 3093 11227\nf 7194 11227 1885\nf 1608 11228 11230\nf 11228 347 11229\nf 11230 11229 1886\nf 370 7198 7199\nf 7198 1608 11230\nf 7199 11230 1886\nf 1874 11231 7230\nf 11231 1886 11229\nf 7230 11229 347\nf 372 11232 11194\nf 11232 620 7204\nf 11194 7204 3084\nf 620 11232 11233\nf 11232 372 10151\nf 11233 10151 5823\nf 3095 7155 11235\nf 7155 1867 11234\nf 11235 11234 1876\nf 1878 11236 7176\nf 11236 1859 11237\nf 7176 11237 3089\nf 605 11180 7208\nf 11180 1859 11236\nf 7208 11236 1878\nf 3091 11238 7181\nf 11238 1852 7213\nf 7181 7213 622\nf 3098 11239 11240\nf 11239 3082 7071\nf 11240 7071 1849\nf 405 6742 11242\nf 6742 3082 11241\nf 11242 11241 3097\nf 405 11242 7222\nf 11242 3097 7215\nf 7222 7215 4961\nf 1884 11243 7193\nf 11243 3099 11244\nf 7193 11244 4961\nf 1624 10184 11245\nf 10184 3099 7220\nf 11245 7220 406\nf 1607 11246 7226\nf 11246 4107 6661\nf 7226 6661 1589\nf 347 11228 11247\nf 11228 1608 6662\nf 11247 6662 4107\nf 347 11248 7228\nf 11248 368 11249\nf 7228 11249 1887\nf 1887 11250 7229\nf 11250 4200 11251\nf 7229 11251 1874\nf 627 11252 11254\nf 11252 3118 11253\nf 11254 11253 1875\nf 628 11255 11257\nf 11255 3120 11256\nf 11257 11256 3088\nf 623 7186 11259\nf 7186 3090 11258\nf 11259 11258 3101\nf 630 11260 7235\nf 11260 1891 11261\nf 7235 11261 3103\nf 625 11262 11263\nf 11262 626 11221\nf 11263 11221 3102\nf 1892 11264 11266\nf 11264 1883 11265\nf 11266 11265 3105\nf 409 7190 11268\nf 7190 3094 11267\nf 11268 11267 3104\nf 1626 7238 10192\nf 7238 631 11269\nf 10192 11269 1894\nf 3124 11270 7260\nf 11270 1894 11269\nf 7260 11269 631\nf 1894 11271 10191\nf 11271 4201 11272\nf 10191 11272 410\nf 4201 11271 11274\nf 11271 1894 11273\nf 11274 11273 1893\nf 1896 11275 11276\nf 11275 410 11272\nf 11276 11272 4201\nf 633 11277 11279\nf 11277 628 11278\nf 11279 11278 3086\nf 618 11280 11282\nf 11280 3136 11281\nf 11282 11281 3108\nf 635 11283 11285\nf 11283 3119 11284\nf 11285 11284 3107\nf 634 11286 11288\nf 11286 3134 11287\nf 11288 11287 3110\nf 637 11289 11291\nf 11289 1900 11290\nf 11291 11290 3109\nf 636 11292 11294\nf 11292 3133 11293\nf 11294 11293 3111\nf 638 11295 11297\nf 11295 3131 11296\nf 11297 11296 3113\nf 3112 7246 11299\nf 7246 3121 11298\nf 11299 11298 1904\nf 411 7267 11301\nf 7267 3123 11300\nf 11301 11300 3114\nf 411 11302 7251\nf 11302 640 11303\nf 7251 11303 1908\nf 3126 11304 7275\nf 11304 1908 11303\nf 7275 11303 640\nf 1908 11305 7252\nf 11305 413 10196\nf 7252 10196 1628\nf 413 11305 11307\nf 11305 1908 11306\nf 11307 11306 1907\nf 414 6754 7257\nf 6754 413 6755\nf 7257 6755 1909\nf 3139 11308 11310\nf 11308 1911 11309\nf 11310 11309 1887\nf 1911 11311 11313\nf 11311 616 11312\nf 11313 11312 4200\nf 3118 11314 11315\nf 11314 4200 11312\nf 11315 11312 616\nf 616 11316 11315\nf 11316 3106 11317\nf 11315 11317 3118\nf 633 11318 11320\nf 11318 3108 11319\nf 11320 11319 3120\nf 629 11214 11322\nf 11214 621 11321\nf 11322 11321 3119\nf 635 11323 11325\nf 11323 3110 11324\nf 11325 11324 1890\nf 630 11326 11328\nf 11326 3101 11327\nf 11328 11327 1900\nf 637 11329 11331\nf 11329 3111 11330\nf 11331 11330 1891\nf 639 11332 7264\nf 11332 3113 11333\nf 7264 11333 3122\nf 631 11334 7261\nf 11334 3104 11335\nf 7261 11335 3121\nf 3116 11336 11338\nf 11336 1893 11337\nf 11338 11337 3124\nf 3123 11339 11341\nf 11339 1893 11340\nf 11341 11340 1906\nf 632 7242 10193\nf 7242 1895 11342\nf 10193 11342 1628\nf 3125 7271 11343\nf 7271 1631 6762\nf 11343 6762 341\nf 1910 11344 10201\nf 11344 3125 11343\nf 10201 11343 341\nf 418 10198 10079\nf 10198 1629 10200\nf 10079 10200 341\nf 1910 11345 11347\nf 11345 512 11346\nf 11347 11346 1747\nf 512 11345 11348\nf 11345 1910 7268\nf 11348 7268 417\nf 417 7250 11350\nf 7250 3117 11349\nf 11350 11349 3127\nf 514 11351 11353\nf 11351 1749 11352\nf 11353 11352 3126\nf 640 11354 7273\nf 11354 3115 11355\nf 7273 11355 3130\nf 516 11356 11358\nf 11356 2974 11357\nf 11358 11357 3128\nf 3129 11359 11361\nf 11359 3112 11360\nf 11361 11360 3132\nf 518 11362 11364\nf 11362 2976 11363\nf 11364 11363 3131\nf 520 11365 11367\nf 11365 2978 11366\nf 11367 11366 3133\nf 636 11368 11370\nf 11368 3109 11369\nf 11370 11369 3135\nf 522 11371 11373\nf 11371 2979 11372\nf 11373 11372 3134\nf 634 11374 11376\nf 11374 3107 11375\nf 11376 11375 3137\nf 524 11377 11379\nf 11377 2981 11378\nf 11379 11378 3136\nf 618 11380 11382\nf 11380 3086 11381\nf 11382 11381 3138\nf 617 11383 11385\nf 11383 2983 11384\nf 11385 11384 3106\nf 1912 11386 11388\nf 11386 1913 11387\nf 11388 11387 4962\nf 3141 11389 11391\nf 11389 1912 11390\nf 11391 11390 3140\nf 475 11392 11394\nf 11392 1913 11393\nf 11394 11393 4202\nf 4202 11395 11397\nf 11395 1777 11396\nf 11397 11396 1771\nf 1777 11395 11398\nf 11395 4202 11393\nf 11398 11393 1913\nf 2925 11399 11401\nf 11399 328 11400\nf 11401 11400 3142\nf 2958 11402 11404\nf 11402 329 11403\nf 11404 11403 3143\nf 532 11405 10728\nf 11405 477 11406\nf 10728 11406 3021\nf 3145 11407 11409\nf 11407 494 11408\nf 11409 11408 532\nf 495 11410 11412\nf 11410 3144 11411\nf 11412 11411 3005\nf 2948 11413 11415\nf 11413 531 11414\nf 11415 11414 3147\nf 332 11416 11418\nf 11416 3146 11417\nf 11418 11417 3026\nf 2897 11419 11421\nf 11419 539 11420\nf 11421 11420 3149\nf 330 11422 11424\nf 11422 3148 11423\nf 11424 11423 3009\nf 2921 11425 11427\nf 11425 538 11426\nf 11427 11426 3150\nf 4203 11428 11430\nf 11428 1840 11429\nf 11430 11429 3066\nf 4203 11431 11433\nf 11431 470 11432\nf 11433 11432 4120\nf 1678 11434 11436\nf 11434 2922 11435\nf 11436 11435 3151\nf 4204 11437 11439\nf 11437 1790 11438\nf 11439 11438 4186\nf 1679 11440 11442\nf 11440 2923 11441\nf 11442 11441 3152\nf 1841 11443 11445\nf 11443 472 11444\nf 11445 11444 4122\nf 1680 11446 11448\nf 11446 2924 11447\nf 11448 11447 3153\nf 3045 11449 11451\nf 11449 4963 11450\nf 11451 11450 4124\nf 4125 11452 10355\nf 11452 4963 11453\nf 10355 11453 3154\nf 1804 11454 7284\nf 11454 1643 7285\nf 7284 7285 474\n\nusemtl material_1\nf 4965 11455 11457\nf 11455 5525 11456\nf 11457 11456 4964\nf 1919 11458 11460\nf 11458 5331 11459\nf 11460 11459 4966\nf 1920 11461 11463\nf 11461 4967 11462\nf 11463 11462 4968\nf 5532 11464 11466\nf 11464 343 11465\nf 11466 11465 4970\nf 4213 11467 11469\nf 11467 3161 11468\nf 11469 11468 5877\nf 4214 11470 11472\nf 11470 4973 11471\nf 11472 11471 5533\nf 4812 11473 11475\nf 11473 3162 11474\nf 11475 11474 5334\nf 4214 11476 11470\nf 11476 5848 11477\nf 11470 11477 4973\nf 3170 11478 11480\nf 11478 1927 11479\nf 11480 11479 5335\nf 4979 11481 11483\nf 11481 646 11482\nf 11483 11482 5544\nf 648 11484 11486\nf 11484 5824 11485\nf 11486 11485 4998\nf 5548 11487 11489\nf 11487 207 11488\nf 11489 11488 4982\nf 5548 11490 11491\nf 11490 47 6483\nf 11491 6483 46\nf 3190 11492 11494\nf 11492 3181 11493\nf 11494 11493 4985\nf 4229 11495 11497\nf 11495 4988 11496\nf 11497 11496 4986\nf 4989 11498 11500\nf 11498 1943 11499\nf 11500 11499 1942\nf 4990 11501 11503\nf 11501 5555 11502\nf 11503 11502 4991\nf 5554 11504 11506\nf 11504 656 11505\nf 11506 11505 3188\nf 3193 11507 11509\nf 11507 3176 11508\nf 11509 11508 4997\nf 3193 11509 11511\nf 11509 4997 11510\nf 11511 11510 3216\nf 3194 11512 11514\nf 11512 3240 11513\nf 11514 11513 5000\nf 5002 11515 11517\nf 11515 1948 11516\nf 11517 11516 5050\nf 4237 11518 11520\nf 11518 3196 11519\nf 11520 11519 3187\nf 4240 11521 11523\nf 11521 1952 11522\nf 11523 11522 4239\nf 3200 11524 11526\nf 11524 3201 11525\nf 11526 11525 3199\nf 4246 11527 11529\nf 11527 3209 11528\nf 11529 11528 3205\nf 4247 11530 11532\nf 11530 3210 11531\nf 11532 11531 5010\nf 5015 11533 11534\nf 11533 371 10159\nf 11534 10159 1613\nf 5568 11535 11537\nf 11535 5015 11536\nf 11537 11536 5016\nf 5018 11538 11540\nf 11538 5357 11539\nf 11540 11539 5019\nf 4233 11541 11543\nf 11541 5021 11542\nf 11543 11542 4235\nf 5574 11544 11546\nf 11544 1969 11545\nf 11546 11545 5575\nf 5031 11547 11549\nf 11547 5030 11548\nf 11549 11548 5029\nf 5037 11550 11552\nf 11550 1971 11551\nf 11552 11551 5032\nf 5037 11553 11555\nf 11553 5580 11554\nf 11555 11554 1972\nf 5045 11556 11558\nf 11556 3238 11557\nf 11558 11557 5042\n\nusemtl material_2\nf 4271 11559 11561\nf 11559 5051 11560\nf 11561 11560 4268\nf 3242 11562 11564\nf 11562 5367 11563\nf 11564 11563 5053\nf 4274 11565 11567\nf 11565 1985 11566\nf 11567 11566 4273\nf 4207 11568 11570\nf 11568 4967 11569\nf 11570 11569 5059\nf 1987 11571 11573\nf 11571 5064 11572\nf 11573 11572 3250\nf 5067 11574 11576\nf 11574 5064 11575\nf 11576 11575 3252\nf 5066 11577 11579\nf 11577 3251 11578\nf 11579 11578 4279\nf 3253 11580 11582\nf 11580 5375 11581\nf 11582 11581 1988\nf 5069 11583 11585\nf 11583 1992 11584\nf 11585 11584 1993\nf 5073 11586 11588\nf 11586 5377 11587\nf 11588 11587 5074\nf 5075 11589 11590\nf 11589 1993 11584\nf 11590 11584 1992\nf 3262 11591 11593\nf 11591 5605 11592\nf 11593 11592 5076\nf 5379 11594 11596\nf 11594 5369 11595\nf 11596 11595 5078\nf 24 8802 11598\nf 8802 128 11597\nf 11598 11597 5826\nf 5608 11599 11601\nf 11599 5080 11600\nf 11601 11600 4285\nf 4286 11602 11604\nf 11602 5082 11603\nf 11604 11603 5083\nf 4287 11605 11607\nf 11605 5082 11606\nf 11607 11606 5610\nf 4852 11608 11610\nf 11608 1998 11609\nf 11610 11609 5080\nf 1996 11611 11612\nf 11611 5610 11606\nf 11612 11606 5082\nf 1996 11613 11611\nf 11613 4288 11614\nf 11611 11614 5610\nf 1994 11615 11617\nf 11615 5075 11616\nf 11617 11616 5086\nf 5383 11618 11620\nf 11618 5614 11619\nf 11620 11619 5091\nf 5853 11621 11622\nf 11621 689 8112\nf 11622 8112 2004\nf 5094 11623 11625\nf 11623 5092 11624\nf 11625 11624 5827\nf 2003 11626 11628\nf 11626 5095 11627\nf 11628 11627 5096\nf 2006 11629 11631\nf 11629 5096 11630\nf 11631 11630 5098\nf 5099 11632 11634\nf 11632 2005 11633\nf 11634 11633 5100\nf 5101 11635 11637\nf 11635 691 11636\nf 11637 11636 5623\nf 4859 11638 11640\nf 11638 3268 11639\nf 11640 11639 3270\nf 5103 11641 11643\nf 11641 2007 11642\nf 11643 11642 4295\nf 5624 11644 11646\nf 11644 693 11645\nf 11646 11645 5108\nf 5108 11647 11649\nf 11647 694 11648\nf 11649 11648 5629\nf 5109 11650 11652\nf 11650 4303 11651\nf 11652 11651 3275\nf 4302 11653 11655\nf 11653 4303 11654\nf 11655 11654 2015\nf 5110 11656 11658\nf 11656 3279 11657\nf 11658 11657 2016\nf 2015 11659 11661\nf 11659 5627 11660\nf 11661 11660 3281\nf 3283 11662 11664\nf 11662 3282 11663\nf 11664 11663 5111\nf 3282 11662 11666\nf 11662 3283 11665\nf 11666 11665 3281\nf 5113 11667 11669\nf 11667 2017 11668\nf 11669 11668 5114\nf 4310 11670 11672\nf 11670 4311 11671\nf 11672 11671 4309\nf 4311 11670 11674\nf 11670 4310 11673\nf 11674 11673 5121\nf 5122 11675 11677\nf 11675 3293 11676\nf 11677 11676 3294\nf 5636 11678 11680\nf 11678 2023 11679\nf 11680 11679 5122\nf 5126 11681 11683\nf 11681 4333 11682\nf 11683 11682 5127\nf 5398 11684 11686\nf 11684 2024 11685\nf 11686 11685 2026\nf 5918 11687 11689\nf 11687 5638 11688\nf 11689 11688 5128\nf 4308 11690 11692\nf 11690 4320 11691\nf 11692 11691 4871\nf 4870 7345 11694\nf 7345 3301 11693\nf 11694 11693 5130\nf 2033 11695 11697\nf 11695 2035 11696\nf 11697 11696 5134\nf 5139 11698 11700\nf 11698 704 11699\nf 11700 11699 5652\nf 5653 11701 11703\nf 11701 5859 11702\nf 11703 11702 5143\nf 3308 11704 11706\nf 11704 4875 11705\nf 11706 11705 2038\nf 4332 11707 11709\nf 11707 4329 11708\nf 11709 11708 4865\nf 4876 11710 7359\nf 11710 5637 11711\nf 7359 11711 3311\n\nusemtl material_3\nf 5861 11712 11714\nf 11712 4340 11713\nf 11714 11713 4335\nf 3316 11715 11717\nf 11715 2046 11716\nf 11717 11716 5416\nf 4341 11718 11720\nf 11718 4337 11719\nf 11720 11719 4338\nf 5154 11721 11723\nf 11721 3320 11722\nf 11723 11722 3322\nf 5155 11724 11725\nf 11724 440 10540\nf 11725 10540 334\nf 5666 11726 11728\nf 11726 3326 11727\nf 11728 11727 5680\nf 4352 11729 11731\nf 11729 3334 11730\nf 11731 11730 4883\nf 4352 11731 11733\nf 11731 4883 11732\nf 11733 11732 3329\nf 2056 11734 11736\nf 11734 5158 11735\nf 11736 11735 3337\nf 4346 11737 11739\nf 11737 2052 11738\nf 11739 11738 3335\nf 4362 11740 11742\nf 11740 5675 11741\nf 11742 11741 5160\nf 4355 11743 11744\nf 11743 3338 7371\nf 11744 7371 5163\nf 2051 11745 11747\nf 11745 2057 11746\nf 11747 11746 5164\nf 5165 11748 11749\nf 11748 2056 11736\nf 11749 11736 3337\nf 5166 11750 11752\nf 11750 5168 11751\nf 11752 11751 5683\nf 5168 11753 11751\nf 11753 105 11754\nf 11751 11754 5683\nf 5686 11755 11757\nf 11755 5458 11756\nf 11757 11756 102\nf 5688 11758 11760\nf 11758 4885 11759\nf 11760 11759 5173\nf 5174 11761 11763\nf 11761 713 11762\nf 11763 11762 5675\nf 5178 11764 11766\nf 11764 5691 11765\nf 11766 11765 5174\nf 5179 11767 11769\nf 11767 5436 11768\nf 11769 11768 5175\nf 5691 11770 11771\nf 11770 5919 7580\nf 11771 7580 723\nf 5694 11772 11774\nf 11772 5182 11773\nf 11774 11773 3355\nf 4365 11775 11777\nf 11775 4893 11776\nf 11777 11776 5188\nf 4366 11778 11780\nf 11778 2065 11779\nf 11780 11779 5189\nf 4894 11781 11782\nf 11781 726 7566\nf 11782 7566 725\nf 5190 11783 11785\nf 11783 4366 11784\nf 11785 11784 4367\nf 5441 11786 11788\nf 11786 4370 11787\nf 11788 11787 5440\nf 3366 11789 11791\nf 11789 5700 11790\nf 11791 11790 5194\nf 3367 11792 11794\nf 11792 3368 11793\nf 11794 11793 5196\nf 5200 11795 11797\nf 11795 3366 11796\nf 11797 11796 5911\nf 5199 11798 11800\nf 11798 730 11799\nf 11800 11799 5703\nf 5198 11801 11803\nf 11801 2075 11802\nf 11803 11802 4373\nf 2079 11804 11806\nf 11804 5729 11805\nf 11806 11805 3407\nf 5967 11807 11809\nf 11807 5452 11808\nf 11809 11808 5712\nf 4380 11810 11812\nf 11810 3385 11811\nf 11812 11811 4379\nf 5208 11813 11815\nf 11813 91 11814\nf 11815 11814 3383\nf 5209 11816 11818\nf 11816 739 11817\nf 11818 11817 740\nf 4383 11819 11821\nf 11819 3389 11820\nf 11821 11820 5455\nf 2061 11822 11824\nf 11822 3393 11823\nf 11824 11823 2083\nf 3396 11825 11827\nf 11825 5213 11826\nf 11827 11826 3395\nf 5213 11828 11830\nf 11828 5927 11829\nf 11830 11829 3397\nf 4394 11831 11833\nf 11831 4392 11832\nf 11833 11832 4395\nf 3404 11834 11836\nf 11834 3402 11835\nf 11836 11835 3405\n\nusemtl material_1\nf 430 11837 11839\nf 11837 5828 11838\nf 11839 11838 5730\nf 2041 11840 11842\nf 11840 5222 11841\nf 11842 11841 5223\nf 2095 11843 11845\nf 11843 2093 11844\nf 11845 11844 4401\nf 5226 11846 11848\nf 11846 3413 11847\nf 11848 11847 4401\nf 5229 11849 11851\nf 11849 3421 11850\nf 11851 11850 4402\nf 3415 11852 11854\nf 11852 5227 11853\nf 11854 11853 3414\nf 2101 11855 11857\nf 11855 5913 11856\nf 11857 11856 5233\nf 2101 11858 11860\nf 11858 2092 11859\nf 11860 11859 5829\nf 5744 11861 11863\nf 11861 5240 11862\nf 11863 11862 4410\nf 5748 11864 11866\nf 11864 5248 11865\nf 11866 11865 397\nf 5474 11867 11869\nf 11867 5244 11868\nf 11869 11868 2110\nf 5245 11870 11872\nf 11870 2111 11871\nf 11872 11871 2112\nf 5247 11873 11875\nf 11873 5753 11874\nf 11875 11874 5248\nf 5252 11876 11878\nf 11876 2098 11877\nf 11878 11877 3432\nf 404 6745 11880\nf 6745 1624 11879\nf 11880 11879 5875\nf 5265 11881 11883\nf 11881 5763 11882\nf 11883 11882 5761\nf 5267 11884 11886\nf 11884 5768 11885\nf 11886 11885 5945\nf 2118 11887 11889\nf 11887 2117 11888\nf 11889 11888 5270\nf 2122 11890 11892\nf 11890 3445 11891\nf 11892 11891 4926\nf 4432 11893 11895\nf 11893 4428 11894\nf 11895 11894 5275\nf 776 11896 11898\nf 11896 769 11897\nf 11898 11897 5276\nf 3451 7442 11900\nf 7442 4928 11899\nf 11900 11899 3452\nf 5783 11901 7443\nf 11901 3456 11902\nf 7443 11902 4931\nf 4439 11903 11904\nf 11903 5783 7445\nf 11904 7445 4932\nf 5286 11905 11907\nf 11905 3459 11906\nf 11907 11906 3460\nf 3465 11908 11910\nf 11908 2133 11909\nf 11910 11909 5792\nf 5302 11911 11913\nf 11911 3466 11912\nf 11913 11912 3470\nf 4445 11914 11916\nf 11914 5794 11915\nf 11916 11915 5798\nf 2141 11917 7450\nf 11917 4446 11918\nf 7450 11918 5296\nf 5299 11919 11921\nf 11919 4447 11920\nf 11921 11920 5297\nf 5301 11922 11924\nf 11922 418 11923\nf 11924 11923 5830\nf 414 11925 11927\nf 11925 5915 11926\nf 11927 11926 5303\nf 4450 11928 11930\nf 11928 3466 11929\nf 11930 11929 5831\nf 3480 11931 11933\nf 11931 5509 11932\nf 11933 11932 4944\nf 5309 11934 11936\nf 11934 2151 11935\nf 11936 11935 5508\n\nusemtl material_4\nf 2152 7657 7667\nf 7657 780 11937\nf 7667 11937 781\nf 777 11938 7625\nf 11938 2142 11939\nf 7625 11939 785\nf 2153 11940 11941\nf 11940 785 11939\nf 11941 11939 2142\nf 789 11942 11944\nf 11942 662 11943\nf 11944 11943 2353\nf 793 11945 11946\nf 11945 2154 7477\nf 11946 7477 2205\nf 2154 11947 7903\nf 11947 790 11948\nf 7903 11948 791\nf 751 7674 11950\nf 7674 3487 11949\nf 11950 11949 749\nf 790 11947 11951\nf 11947 2154 11945\nf 11951 11945 793\nf 2156 11952 11954\nf 11952 4456 11953\nf 11954 11953 1963\nf 3482 11955 11957\nf 11955 2156 11956\nf 11957 11956 3483\nf 2157 11958 11959\nf 11958 3483 7490\nf 11959 7490 789\nf 1963 11960 11954\nf 11960 663 11961\nf 11954 11961 2156\nf 795 11962 11964\nf 11962 2160 11963\nf 11964 11963 4457\nf 2159 7496 11966\nf 7496 3609 11965\nf 11966 11965 796\nf 2159 7493 7497\nf 7493 654 11967\nf 7497 11967 647\nf 4580 11968 11969\nf 11968 2160 11962\nf 11969 11962 795\nf 2160 7501 11963\nf 7501 2158 11970\nf 11963 11970 4457\nf 2161 11971 7809\nf 11971 655 11972\nf 7809 11972 2158\nf 655 11971 11974\nf 11971 2161 11973\nf 11974 11973 656\nf 654 7492 11975\nf 7492 2158 11972\nf 11975 11972 655\nf 2162 7506 7509\nf 7506 798 11976\nf 7509 11976 799\nf 658 7507 11978\nf 7507 2162 11977\nf 11978 11977 675\nf 675 11977 11979\nf 11977 2162 7511\nf 11979 7511 2163\nf 799 11980 7510\nf 11980 4458 11981\nf 7510 11981 2163\nf 675 11979 11983\nf 11979 2163 11982\nf 11983 11982 674\nf 2164 11984 11985\nf 11984 674 11982\nf 11985 11982 2163\nf 800 11986 11987\nf 11986 4458 11980\nf 11987 11980 799\nf 2277 11988 11989\nf 11988 4458 11986\nf 11989 11986 800\nf 674 11984 11990\nf 11984 2164 7512\nf 11990 7512 673\nf 4523 11991 11993\nf 11991 2164 11992\nf 11993 11992 4458\nf 2164 11994 7513\nf 11994 801 7515\nf 7513 7515 2165\nf 673 7514 11996\nf 7514 2165 11995\nf 11996 11995 672\nf 672 11995 11997\nf 11995 2165 7518\nf 11997 7518 4459\nf 2167 11998 12000\nf 11998 671 11999\nf 12000 11999 4459\nf 2166 12001 12003\nf 12001 804 12002\nf 12003 12002 2167\nf 671 11998 12005\nf 11998 2167 12004\nf 12005 12004 670\nf 803 12006 12008\nf 12006 2168 12007\nf 12008 12007 4460\nf 2458 12009 12011\nf 12009 806 12010\nf 12011 12010 3484\nf 812 7946 7525\nf 7946 2169 8042\nf 7525 8042 810\nf 813 12012 12013\nf 12012 4538 7527\nf 12013 7527 2170\nf 3614 12014 12016\nf 12014 813 12015\nf 12016 12015 814\nf 4557 12017 12019\nf 12017 2455 12018\nf 12019 12018 2171\nf 943 12020 7848\nf 12020 2324 7529\nf 7848 7529 815\nf 2324 12021 7530\nf 12021 2171 8436\nf 7530 8436 816\nf 3661 7992 12022\nf 7992 819 7534\nf 12022 7534 820\nf 822 12023 12025\nf 12023 821 12024\nf 12025 12024 4635\nf 4616 12026 12028\nf 12026 2453 12027\nf 12028 12027 2174\nf 2409 7973 12030\nf 7973 2173 12029\nf 12030 12029 824\nf 2175 8305 12032\nf 8305 2544 12031\nf 12032 12031 3507\nf 3493 7738 12034\nf 7738 827 12033\nf 12034 12033 828\nf 732 12035 7545\nf 12035 733 12036\nf 7545 12036 2178\nf 2178 12036 7539\nf 12036 733 12037\nf 7539 12037 2179\nf 734 12038 12039\nf 12038 2179 12037\nf 12039 12037 733\nf 832 7540 12040\nf 7540 2179 7541\nf 12040 7541 831\nf 2179 12038 7542\nf 12038 734 12041\nf 7542 12041 2177\nf 741 12042 12043\nf 12042 2177 12041\nf 12043 12041 734\nf 741 8018 12042\nf 8018 2500 8019\nf 12042 8019 2177\nf 731 12044 12045\nf 12044 732 7544\nf 12045 7544 2180\nf 2178 12046 7546\nf 12046 4461 12047\nf 7546 12047 2180\nf 833 12048 12049\nf 12048 2180 12047\nf 12049 12047 4461\nf 731 12045 7548\nf 12045 2180 12050\nf 7548 12050 2181\nf 2180 12048 12050\nf 12048 833 12051\nf 12050 12051 2181\nf 834 12052 12053\nf 12052 2181 12051\nf 12053 12051 833\nf 730 7549 12055\nf 7549 2181 12054\nf 12055 12054 5312\nf 5312 7552 12057\nf 7552 2182 12056\nf 12057 12056 5313\nf 834 7550 12052\nf 7550 5312 12054\nf 12052 12054 2181\nf 4470 12058 12059\nf 12058 2182 7551\nf 12059 7551 834\nf 2183 12060 12062\nf 12060 728 12061\nf 12062 12061 5313\nf 2183 7554 7557\nf 7554 835 12063\nf 7557 12063 2184\nf 836 12064 12065\nf 12064 2184 12063\nf 12065 12063 835\nf 728 12060 12066\nf 12060 2183 7556\nf 12066 7556 2069\nf 2184 12064 7561\nf 12064 836 12067\nf 7561 12067 2185\nf 4473 12068 12070\nf 12068 3492 12069\nf 12070 12069 836\nf 724 12071 12072\nf 12071 2187 7581\nf 12072 7581 5919\nf 2188 12073 7575\nf 12073 722 12074\nf 7575 12074 2189\nf 840 7576 7723\nf 7576 2189 7569\nf 7723 7569 839\nf 2189 12074 7570\nf 12074 722 12075\nf 7570 12075 723\nf 841 12076 12077\nf 12076 5968 7587\nf 12077 7587 2191\nf 2191 7589 7583\nf 7589 2190 12078\nf 7583 12078 2188\nf 2188 12079 12073\nf 12079 713 12080\nf 12073 12080 722\nf 713 12081 12083\nf 12081 2190 12082\nf 12083 12082 714\nf 713 12079 12081\nf 12079 2188 12078\nf 12081 12078 2190\nf 2209 12084 12086\nf 12084 2207 12085\nf 12086 12085 3485\nf 2192 12087 7584\nf 12087 842 12088\nf 7584 12088 2193\nf 714 12089 12091\nf 12089 2193 12090\nf 12091 12090 715\nf 2193 12089 12092\nf 12089 714 12082\nf 12092 12082 2190\nf 710 7678 7590\nf 7678 842 12093\nf 7590 12093 2194\nf 4462 12094 12095\nf 12094 2194 12093\nf 12095 12093 842\nf 2194 12096 7591\nf 12096 843 12097\nf 7591 12097 2049\nf 709 12098 12099\nf 12098 2049 12097\nf 12099 12097 843\nf 844 7597 12101\nf 7597 753 12100\nf 12101 12100 752\nf 709 12099 12103\nf 12099 843 12102\nf 12103 12102 2197\nf 2196 7599 12104\nf 7599 2197 12102\nf 12104 12102 843\nf 709 12103 12105\nf 12103 2197 7603\nf 12105 7603 2045\nf 2197 12106 7601\nf 12106 844 12107\nf 7601 12107 2198\nf 2045 7602 12109\nf 7602 2198 12108\nf 12109 12108 707\nf 752 7604 12101\nf 7604 2198 12107\nf 12101 12107 844\nf 706 12110 7413\nf 12110 2198 7606\nf 7413 7606 2100\nf 2198 12110 12108\nf 12110 706 12111\nf 12108 12111 707\nf 2131 12112 12113\nf 12112 771 7616\nf 12113 7616 846\nf 785 11940 12114\nf 11940 2153 7788\nf 12114 7788 847\nf 2423 7985 7984\nf 7985 2200 7624\nf 7984 7624 785\nf 2200 7619 7622\nf 7619 778 12115\nf 7622 12115 779\nf 5832 12116 12118\nf 12116 2148 12117\nf 12118 12117 5819\nf 2148 12116 12120\nf 12116 5832 12119\nf 12120 12119 774\nf 2137 7636 12122\nf 7636 2202 12121\nf 12122 12121 3486\nf 850 7635 12124\nf 7635 775 12123\nf 12124 12123 3486\nf 2137 12122 12125\nf 12122 3486 12123\nf 12125 12123 775\nf 2203 7640 12127\nf 7640 767 12126\nf 12127 12126 768\nf 3566 12128 12129\nf 12128 2203 8009\nf 12129 8009 851\nf 3583 12130 7859\nf 12130 2349 12131\nf 7859 12131 852\nf 782 7653 7649\nf 7653 756 12132\nf 7649 12132 2105\nf 2204 7866 7660\nf 7866 853 12133\nf 7660 12133 854\nf 2204 7458 12135\nf 7458 759 12134\nf 12135 12134 758\nf 757 12136 12137\nf 12136 2204 12135\nf 12137 12135 758\nf 2152 7666 7460\nf 7666 760 12138\nf 7460 12138 759\nf 2205 12139 7668\nf 12139 662 12140\nf 7668 12140 1956\nf 662 12139 11943\nf 12139 2205 7476\nf 11943 7476 2353\nf 793 11946 7671\nf 11946 2205 7670\nf 7671 7670 2206\nf 2206 7669 7673\nf 7669 1956 12141\nf 7673 12141 661\nf 855 7488 12143\nf 7488 792 12142\nf 12143 12142 2390\nf 2155 12144 12145\nf 12144 2390 12142\nf 12145 12142 792\nf 660 7486 7479\nf 7486 2155 12145\nf 7479 12145 792\nf 4462 12146 7681\nf 12146 2192 12147\nf 7681 12147 2207\nf 2193 12088 12090\nf 12088 842 7677\nf 12090 7677 715\nf 842 12087 12095\nf 12087 2192 12146\nf 12095 12146 4462\nf 2196 12148 7684\nf 12148 4462 7680\nf 7684 7680 2208\nf 2208 7679 12149\nf 7679 2207 12084\nf 12149 12084 2209\nf 2208 12149 12151\nf 12149 2209 12150\nf 12151 12150 856\nf 2208 12151 7682\nf 12151 856 12152\nf 7682 12152 2210\nf 2196 7683 7600\nf 7683 2210 12153\nf 7600 12153 4463\nf 844 12106 12154\nf 12106 2197 7598\nf 12154 7598 4463\nf 2210 12152 7685\nf 12152 856 12155\nf 7685 12155 2211\nf 2212 7686 12157\nf 7686 2211 12156\nf 12157 12156 845\nf 844 12154 7596\nf 12154 4463 12158\nf 7596 12158 2195\nf 2212 12157 7688\nf 12157 845 7691\nf 7688 7691 2213\nf 2195 7689 7595\nf 7689 2213 12159\nf 7595 12159 754\nf 754 12159 12161\nf 12159 2213 12160\nf 12161 12160 755\nf 2199 7611 7692\nf 7611 755 12160\nf 7692 12160 2213\nf 846 7615 12163\nf 7615 3488 12162\nf 12163 12162 3506\nf 3488 7617 12165\nf 7617 771 12164\nf 12165 12164 2127\nf 2214 7607 12166\nf 7607 2199 7613\nf 12166 7613 787\nf 3506 12167 12169\nf 12167 2215 12168\nf 12169 12168 857\nf 857 12168 12170\nf 12168 2215 7700\nf 12170 7700 2216\nf 2215 7695 7698\nf 7695 2214 12166\nf 7698 12166 787\nf 4464 12171 12172\nf 12171 787 7612\nf 12172 7612 845\nf 857 12170 12173\nf 12170 2216 7703\nf 12173 7703 2218\nf 2216 7699 12174\nf 7699 787 12171\nf 12174 12171 4464\nf 2218 7702 12176\nf 7702 2217 12175\nf 12176 12175 858\nf 4947 12177 7709\nf 12177 2217 7706\nf 7709 7706 2219\nf 2219 7705 12179\nf 7705 4464 12178\nf 12179 12178 2211\nf 2219 12179 12180\nf 12179 2211 12155\nf 12180 12155 856\nf 858 12175 12181\nf 12175 2217 12177\nf 12181 12177 4947\nf 2219 12180 7707\nf 12180 856 12182\nf 7707 12182 2221\nf 2220 12183 12185\nf 12183 4947 12184\nf 12185 12184 859\nf 859 12186 12188\nf 12186 2222 12187\nf 12188 12187 860\nf 2222 12186 12190\nf 12186 859 12189\nf 12190 12189 2221\nf 860 12187 12191\nf 12187 2222 7715\nf 12191 7715 2223\nf 2222 12190 7713\nf 12190 2221 7712\nf 7713 7712 3489\nf 2223 7714 7716\nf 7714 3489 12192\nf 7716 12192 841\nf 4478 12193 12195\nf 12193 2224 12194\nf 12195 12194 861\nf 2224 12196 12197\nf 12196 860 12191\nf 12197 12191 2223\nf 861 12194 12198\nf 12194 2224 7721\nf 12198 7721 2225\nf 2224 12197 7719\nf 12197 2223 7718\nf 7719 7718 3490\nf 2225 7720 12200\nf 7720 3490 12199\nf 12200 12199 840\nf 861 12198 12202\nf 12198 2225 12201\nf 12202 12201 4465\nf 862 12203 12204\nf 12203 861 12202\nf 12204 12202 4465\nf 2226 12205 7722\nf 12205 2225 12200\nf 7722 12200 840\nf 862 12204 12207\nf 12204 4465 12206\nf 12207 12206 863\nf 863 12206 12209\nf 12206 4465 12208\nf 12209 12208 4466\nf 4466 12210 12211\nf 12210 2226 7726\nf 12211 7726 2227\nf 863 12209 12213\nf 12209 4466 12212\nf 12213 12212 3491\nf 2228 12214 12215\nf 12214 3491 12212\nf 12215 12212 4466\nf 2229 7731 12216\nf 7731 838 7564\nf 12216 7564 837\nf 2229 12216 12218\nf 12216 837 12217\nf 12218 12217 2185\nf 727 12219 7733\nf 12219 2186 12220\nf 7733 12220 837\nf 831 12221 7735\nf 12221 4945 7536\nf 7735 7536 829\nf 2176 7741 12222\nf 7741 2230 7736\nf 12222 7736 829\nf 831 7737 12040\nf 7737 2230 12223\nf 12040 12223 832\nf 2231 12224 12225\nf 12224 832 12223\nf 12225 12223 2230\nf 3494 12226 12228\nf 12226 2231 12227\nf 12228 12227 3493\nf 3495 12229 12231\nf 12229 4467 12230\nf 12231 12230 3494\nf 4468 12232 12234\nf 12232 2232 12233\nf 12234 12233 4469\nf 4461 12235 12049\nf 12235 4468 12236\nf 12049 12236 833\nf 4469 12237 12239\nf 12237 2233 12238\nf 12239 12238 4470\nf 3498 12240 12242\nf 12240 2233 12241\nf 12242 12241 3497\nf 4471 12243 12245\nf 12243 2234 12244\nf 12245 12244 4472\nf 4471 12246 12248\nf 12246 835 12247\nf 12248 12247 4470\nf 3499 12249 12251\nf 12249 2234 12250\nf 12251 12250 3498\nf 4473 12070 12253\nf 12070 836 12252\nf 12253 12252 4472\nf 3500 12254 12256\nf 12254 2235 12255\nf 12256 12255 3499\nf 3492 12257 12259\nf 12257 4474 12258\nf 12259 12258 3491\nf 3501 12260 12262\nf 12260 2236 12261\nf 12262 12261 3500\nf 4475 12263 12265\nf 12263 863 12264\nf 12265 12264 4474\nf 3502 12266 12268\nf 12266 2237 12267\nf 12268 12267 3501\nf 4476 12269 12271\nf 12269 2238 12270\nf 12271 12270 4477\nf 4476 12272 12274\nf 12272 862 12273\nf 12274 12273 4475\nf 3503 12275 12277\nf 12275 2238 12276\nf 12277 12276 3502\nf 4478 12195 12279\nf 12195 861 12278\nf 12279 12278 4477\nf 3504 12280 12282\nf 12280 2239 12281\nf 12282 12281 3503\nf 4479 7751 12284\nf 7751 2240 12283\nf 12284 12283 3505\nf 4479 12285 12287\nf 12285 860 12286\nf 12287 12286 4478\nf 859 12288 12185\nf 12288 3505 7752\nf 12185 7752 2220\nf 2220 7756 12289\nf 7756 2241 7757\nf 12289 7757 858\nf 874 12290 12292\nf 12290 2241 12291\nf 12292 12291 4481\nf 4498 12293 12295\nf 12293 4481 12294\nf 12295 12294 873\nf 858 7759 12176\nf 7759 2242 12296\nf 12176 12296 2218\nf 874 12297 12290\nf 12297 2242 7758\nf 12290 7758 2241\nf 2218 12296 12173\nf 12296 2242 7760\nf 12173 7760 857\nf 2242 12298 7761\nf 12298 4482 12299\nf 7761 12299 2243\nf 4499 12300 12302\nf 12300 4482 12301\nf 12302 12301 874\nf 857 7762 12169\nf 7762 2243 12303\nf 12169 12303 3506\nf 2243 12299 7763\nf 12299 4482 12304\nf 7763 12304 2244\nf 876 12305 12307\nf 12305 2245 12306\nf 12307 12306 4483\nf 3506 12308 12163\nf 12308 2245 7768\nf 12163 7768 846\nf 4502 12309 12311\nf 12309 2247 12310\nf 12311 12310 876\nf 846 7767 12113\nf 7767 2246 12312\nf 12113 12312 2131\nf 2246 12313 7769\nf 12313 876 12310\nf 7769 12310 2247\nf 2131 12312 12314\nf 12312 2246 7771\nf 12314 7771 772\nf 2247 12315 7772\nf 12315 786 12316\nf 7772 12316 2134\nf 773 12317 12318\nf 12317 2134 12316\nf 12318 12316 786\nf 2175 12319 8303\nf 12319 827 8027\nf 8303 8027 826\nf 4484 12320 12321\nf 12320 828 12033\nf 12321 12033 827\nf 3509 12322 12324\nf 12322 2248 12323\nf 12324 12323 3508\nf 828 12325 12327\nf 12325 4485 12326\nf 12327 12326 864\nf 3510 12328 12330\nf 12328 4486 12329\nf 12330 12329 3509\nf 4487 12331 12333\nf 12331 865 12332\nf 12333 12332 4486\nf 3511 12334 12336\nf 12334 4487 12335\nf 12336 12335 3510\nf 4488 12337 12339\nf 12337 867 12338\nf 12339 12338 5833\nf 3512 12340 12342\nf 12340 4488 12341\nf 12342 12341 3511\nf 4489 12343 12345\nf 12343 5806 12344\nf 12345 12344 4488\nf 3513 12346 12348\nf 12346 4489 12347\nf 12348 12347 3512\nf 4490 12349 12351\nf 12349 868 12350\nf 12351 12350 4489\nf 3514 12352 12354\nf 12352 4490 12353\nf 12354 12353 3513\nf 4491 12355 12357\nf 12355 869 12356\nf 12357 12356 4490\nf 3515 12358 12360\nf 12358 4491 12359\nf 12360 12359 3514\nf 4492 12361 12363\nf 12361 870 12362\nf 12363 12362 4491\nf 3516 12364 12366\nf 12364 4492 12365\nf 12366 12365 3515\nf 5314 12367 12369\nf 12367 872 12368\nf 12369 12368 871\nf 3517 12370 12372\nf 12370 4493 12371\nf 12372 12371 3516\nf 4494 12373 12375\nf 12373 2249 12374\nf 12375 12374 4495\nf 4494 12376 12378\nf 12376 872 12377\nf 12378 12377 4493\nf 3518 12379 12381\nf 12379 2249 12380\nf 12381 12380 3517\nf 4497 12382 12384\nf 12382 4495 12383\nf 12384 12383 2250\nf 3519 12385 12387\nf 12385 5315 12386\nf 12387 12386 5316\nf 4498 12295 12389\nf 12295 873 12388\nf 12389 12388 4497\nf 4499 7779 12391\nf 7779 2252 12390\nf 12391 12390 875\nf 4499 12302 12393\nf 12302 874 12392\nf 12393 12392 4498\nf 4629 12394 12396\nf 12394 3520 12395\nf 12396 12395 886\nf 4500 12397 12399\nf 12397 4501 12398\nf 12399 12398 4483\nf 4630 12400 12402\nf 12400 3521 12401\nf 12402 12401 887\nf 2247 12309 12315\nf 12309 4502 7469\nf 12315 7469 786\nf 4502 12311 12404\nf 12311 876 12403\nf 12404 12403 4501\nf 2254 12405 12407\nf 12405 4503 12406\nf 12407 12406 3481\nf 4631 12408 12410\nf 12408 4503 12409\nf 12410 12409 888\nf 2153 12411 12413\nf 12411 5974 12412\nf 12413 12412 3481\nf 995 12414 12416\nf 12414 889 12415\nf 12416 12415 2255\nf 4505 12417 12419\nf 12417 4504 12418\nf 12419 12418 892\nf 3523 12420 12422\nf 12420 4505 12421\nf 12422 12421 3524\nf 2256 12423 12425\nf 12423 894 12424\nf 12425 12424 4506\nf 3526 12426 12428\nf 12426 3525 12427\nf 12428 12427 2257\nf 2257 12429 12431\nf 12429 4506 12430\nf 12431 12430 4507\nf 2258 12432 12433\nf 12432 2257 12431\nf 12433 12431 4507\nf 3526 12428 12435\nf 12428 2257 12434\nf 12435 12434 3527\nf 2260 12436 12438\nf 12436 2258 12437\nf 12438 12437 4508\nf 2260 12439 12436\nf 12439 2259 12440\nf 12436 12440 2258\nf 3527 12441 12443\nf 12441 2259 12442\nf 12443 12442 4509\nf 3528 7523 7795\nf 7523 810 12444\nf 7795 12444 2261\nf 2262 7796 12445\nf 7796 2261 8345\nf 12445 8345 809\nf 808 12446 7521\nf 12446 2262 12445\nf 7521 12445 809\nf 811 7799 7801\nf 7799 3528 12447\nf 7801 12447 3529\nf 2262 12446 12449\nf 12446 808 12448\nf 12449 12448 4510\nf 3530 12450 12452\nf 12450 4510 12451\nf 12452 12451 4511\nf 3529 12453 7802\nf 12453 2263 12454\nf 7802 12454 4512\nf 900 12455 12457\nf 12455 4512 12456\nf 12457 12456 899\nf 3613 12458 12460\nf 12458 2264 12459\nf 12460 12459 3531\nf 5807 12461 12463\nf 12461 2265 12462\nf 12463 12462 4513\nf 3531 12464 12466\nf 12464 2265 12465\nf 12466 12465 3532\nf 4515 12467 12469\nf 12467 2266 12468\nf 12469 12468 4514\nf 3532 12470 12472\nf 12470 2266 12471\nf 12472 12471 3533\nf 4516 12473 12475\nf 12473 2267 12474\nf 12475 12474 4515\nf 3533 12476 12478\nf 12476 2267 12477\nf 12478 12477 3534\nf 4517 12479 12481\nf 12479 2268 12480\nf 12481 12480 4516\nf 3534 12482 12484\nf 12482 2268 12483\nf 12484 12483 3535\nf 4517 12485 12487\nf 12485 898 12486\nf 12487 12486 4518\nf 4519 12488 12490\nf 12488 2269 12489\nf 12490 12489 4518\nf 3535 12491 12493\nf 12491 2269 12492\nf 12493 12492 3536\nf 4520 12494 12496\nf 12494 4519 12495\nf 12496 12495 4511\nf 3536 12497 12499\nf 12497 2270 12498\nf 12499 12498 3537\nf 4520 12500 12502\nf 12500 808 12501\nf 12502 12501 2272\nf 806 12503 12010\nf 12503 3537 12504\nf 12010 12504 3484\nf 2272 8350 12506\nf 8350 805 12505\nf 12506 12505 2271\nf 2168 12006 12508\nf 12006 803 12507\nf 12508 12507 4521\nf 3538 12509 12511\nf 12509 2274 12510\nf 12511 12510 3539\nf 4522 12512 12514\nf 12512 2275 12513\nf 12514 12513 4521\nf 3539 12515 12517\nf 12515 2275 12516\nf 12517 12516 3540\nf 4523 12518 12520\nf 12518 2276 12519\nf 12520 12519 4522\nf 3540 12521 12523\nf 12521 2276 12522\nf 12523 12522 3541\nf 3541 12524 12526\nf 12524 2277 12525\nf 12526 12525 3542\nf 3542 12527 12529\nf 12527 800 12528\nf 12529 12528 3543\nf 3543 12528 12531\nf 12528 800 12530\nf 12531 12530 4524\nf 798 12532 11976\nf 12532 4524 12533\nf 11976 12533 799\nf 3544 12534 12536\nf 12534 4524 12535\nf 12536 12535 2278\nf 798 12537 12532\nf 12537 2278 12535\nf 12532 12535 4524\nf 3544 12536 12539\nf 12536 2278 12538\nf 12539 12538 3545\nf 2278 12540 12541\nf 12540 788 7806\nf 12541 7806 2279\nf 797 12542 12543\nf 12542 901 7805\nf 12543 7805 3546\nf 656 11973 7470\nf 11973 2161 7807\nf 7470 7807 788\nf 4525 12544 12545\nf 12544 820 7533\nf 12545 7533 818\nf 4526 12546 12548\nf 12546 908 12547\nf 12548 12547 4525\nf 3550 12549 12551\nf 12549 2281 12550\nf 12551 12550 2280\nf 4527 12552 12554\nf 12552 910 12553\nf 12554 12553 4526\nf 3551 12555 12557\nf 12555 2282 12556\nf 12557 12556 3550\nf 4528 12558 12560\nf 12558 912 12559\nf 12560 12559 4527\nf 3552 12561 12563\nf 12561 2283 12562\nf 12563 12562 3551\nf 4529 12564 12566\nf 12564 914 12565\nf 12566 12565 4528\nf 3553 12567 12569\nf 12567 2284 12568\nf 12569 12568 3552\nf 4530 12570 12572\nf 12570 916 12571\nf 12572 12571 4529\nf 3554 12573 12575\nf 12573 2285 12574\nf 12575 12574 3553\nf 4531 12576 12578\nf 12576 918 12577\nf 12578 12577 4530\nf 3555 12579 12581\nf 12579 2286 12580\nf 12581 12580 3554\nf 4532 12582 12584\nf 12582 920 12583\nf 12584 12583 4531\nf 3556 12585 12587\nf 12585 2287 12586\nf 12587 12586 3555\nf 3557 12588 12590\nf 12588 2288 12589\nf 12590 12589 3556\nf 4533 12591 12593\nf 12591 2289 12592\nf 12593 12592 3557\nf 926 12594 12596\nf 12594 2290 12595\nf 12596 12595 3558\nf 2292 12597 12598\nf 12597 3592 7871\nf 12598 7871 927\nf 2291 12599 12600\nf 12599 3559 7819\nf 12600 7819 2293\nf 3559 12601 12603\nf 12601 927 12602\nf 12603 12602 929\nf 927 12601 12598\nf 12601 3559 12604\nf 12598 12604 2292\nf 928 12605 12607\nf 12605 2293 12606\nf 12607 12606 930\nf 2294 12608 7821\nf 12608 3560 12609\nf 7821 12609 2293\nf 931 12610 12611\nf 12610 2294 7820\nf 12611 7820 3559\nf 3673 12612 12613\nf 12612 3560 7822\nf 12613 7822 932\nf 2294 12610 12615\nf 12610 931 12614\nf 12615 12614 2296\nf 3561 12616 12618\nf 12616 2296 12617\nf 12618 12617 2297\nf 2296 12619 12617\nf 12619 933 12620\nf 12617 12620 2297\nf 3561 12618 12622\nf 12618 2297 12621\nf 12622 12621 3562\nf 2297 12623 12625\nf 12623 935 12624\nf 12625 12624 2298\nf 936 12626 12627\nf 12626 3562 7825\nf 12627 7825 3563\nf 938 12628 12630\nf 12628 4535 12629\nf 12630 12629 4534\nf 937 12631 12632\nf 12631 3563 7828\nf 12632 7828 3564\nf 2299 12633 12634\nf 12633 4534 12629\nf 12634 12629 4535\nf 940 12635 12637\nf 12635 4536 12636\nf 12637 12636 4535\nf 3565 12638 12640\nf 12638 2300 12639\nf 12640 12639 3566\nf 2300 12641 12642\nf 12641 4535 12636\nf 12642 12636 4536\nf 941 12643 12645\nf 12643 4537 12644\nf 12645 12644 4536\nf 2203 12128 7641\nf 12128 3566 7834\nf 7641 7834 784\nf 2301 12646 12647\nf 12646 4536 12644\nf 12647 12644 4537\nf 941 12648 12643\nf 12648 942 7839\nf 12643 7839 4537\nf 3601 12649 7882\nf 12649 2304 7844\nf 7882 7844 942\nf 766 7461 12650\nf 7461 2302 7841\nf 12650 7841 765\nf 2304 7846 7845\nf 7846 765 7843\nf 7845 7843 2303\nf 2304 12649 7648\nf 12649 3601 12651\nf 7648 12651 783\nf 816 12652 7531\nf 12652 2456 12653\nf 7531 12653 815\nf 2305 12654 12655\nf 12654 2456 8390\nf 12655 8390 2457\nf 3614 7950 12014\nf 7950 4538 12012\nf 12014 12012 813\nf 2305 12656 12654\nf 12656 815 12653\nf 12654 12653 2456\nf 4538 7949 12658\nf 7949 945 12657\nf 12658 12657 3567\nf 4540 12659 12661\nf 12659 944 12660\nf 12661 12660 4539\nf 3568 12662 12664\nf 12662 2306 12663\nf 12664 12663 3567\nf 4541 12665 12667\nf 12665 946 12666\nf 12667 12666 4540\nf 3569 12668 12670\nf 12668 2307 12669\nf 12670 12669 3568\nf 4542 12671 12673\nf 12671 948 12672\nf 12673 12672 4541\nf 3570 12674 12676\nf 12674 2308 12675\nf 12676 12675 3569\nf 4543 12677 12679\nf 12677 950 12678\nf 12679 12678 4542\nf 3571 12680 12682\nf 12680 2309 12681\nf 12682 12681 3570\nf 4544 12683 12685\nf 12683 952 12684\nf 12685 12684 4543\nf 3572 12686 12688\nf 12686 2310 12687\nf 12688 12687 3571\nf 4545 12689 12691\nf 12689 954 12690\nf 12691 12690 4544\nf 4545 12692 12694\nf 12692 2311 12693\nf 12694 12693 2312\nf 957 12695 12697\nf 12695 2312 12696\nf 12697 12696 959\nf 4546 12698 12700\nf 12698 2313 12699\nf 12700 12699 2312\nf 4546 12701 12703\nf 12701 958 12702\nf 12703 12702 3573\nf 960 12704 12705\nf 12704 3573 12702\nf 12705 12702 958\nf 959 12706 12708\nf 12706 2313 12707\nf 12708 12707 961\nf 3573 7851 12710\nf 7851 2315 12709\nf 12710 12709 2313\nf 962 12711 12713\nf 12711 2314 12712\nf 12713 12712 960\nf 961 12714 12716\nf 12714 2315 12715\nf 12716 12715 3574\nf 2314 12711 12718\nf 12711 962 12717\nf 12718 12717 4547\nf 3574 12719 12721\nf 12719 2316 12720\nf 12721 12720 964\nf 4548 12722 12724\nf 12722 2317 12723\nf 12724 12723 4547\nf 964 12725 12727\nf 12725 2317 12726\nf 12727 12726 3575\nf 3575 12728 12730\nf 12728 2318 12729\nf 12730 12729 3576\nf 4548 12731 12733\nf 12731 967 12732\nf 12733 12732 4549\nf 3576 12734 12736\nf 12734 2319 12735\nf 12736 12735 3577\nf 4550 12737 12739\nf 12737 2320 12738\nf 12739 12738 5925\nf 3577 12740 12742\nf 12740 2320 12741\nf 12742 12741 971\nf 971 12743 12745\nf 12743 2321 12744\nf 12745 12744 973\nf 4550 12746 12748\nf 12746 972 12747\nf 12748 12747 4551\nf 975 12749 12751\nf 12749 4552 12750\nf 12751 12750 4551\nf 974 12752 12754\nf 12752 3578 12753\nf 12754 12753 3579\nf 4552 12755 12750\nf 12755 3578 12756\nf 12750 12756 4551\nf 977 12757 12759\nf 12757 4553 12758\nf 12759 12758 4552\nf 976 12760 12762\nf 12760 3579 12761\nf 12762 12761 3580\nf 3580 12763 12764\nf 12763 4552 12758\nf 12764 12758 4553\nf 979 12765 12767\nf 12765 4554 12766\nf 12767 12766 4553\nf 978 7856 12769\nf 7856 3581 12768\nf 12769 12768 980\nf 3581 12770 12771\nf 12770 4553 12766\nf 12771 12766 4554\nf 981 12772 12774\nf 12772 4555 12773\nf 12774 12773 4554\nf 980 12768 12776\nf 12768 3581 12775\nf 12776 12775 3582\nf 3582 12777 12778\nf 12777 4554 12773\nf 12778 12773 4555\nf 982 12779 12781\nf 12779 4556 12780\nf 12781 12780 4555\nf 2349 12130 7651\nf 12130 3583 7860\nf 7651 7860 782\nf 983 12782 12784\nf 12782 2322 12783\nf 12784 12783 4556\nf 2322 7654 12783\nf 7654 782 7862\nf 12783 7862 4556\nf 983 7863 12782\nf 7863 2323 12785\nf 12782 12785 2322\nf 2323 12786 12785\nf 12786 756 7652\nf 12785 7652 2322\nf 756 12786 12788\nf 12786 2323 12787\nf 12788 12787 757\nf 2204 12136 7867\nf 12136 757 12787\nf 7867 12787 2323\nf 2455 12789 12791\nf 12789 817 12790\nf 12791 12790 1040\nf 4558 7870 12793\nf 7870 4557 12792\nf 12793 12792 3584\nf 2324 12794 12021\nf 12794 4557 12019\nf 12021 12019 2171\nf 2324 12020 12796\nf 12020 943 12795\nf 12796 12795 3584\nf 2325 12797 12798\nf 12797 4558 12793\nf 12798 12793 3584\nf 944 12799 12801\nf 12799 3585 12800\nf 12801 12800 943\nf 4559 12802 12804\nf 12802 911 12803\nf 12804 12803 4558\nf 3586 12805 12807\nf 12805 2326 12806\nf 12807 12806 3585\nf 4560 12808 12810\nf 12808 913 12809\nf 12810 12809 4559\nf 3587 12811 12813\nf 12811 2327 12812\nf 12813 12812 3586\nf 4561 12814 12816\nf 12814 915 12815\nf 12816 12815 4560\nf 3588 12817 12819\nf 12817 2328 12818\nf 12819 12818 3587\nf 4562 12820 12822\nf 12820 917 12821\nf 12822 12821 4561\nf 3589 12823 12825\nf 12823 2329 12824\nf 12825 12824 3588\nf 4563 12826 12828\nf 12826 919 12827\nf 12828 12827 4562\nf 3590 12829 12831\nf 12829 2330 12830\nf 12831 12830 3589\nf 4564 12832 12834\nf 12832 921 12833\nf 12834 12833 4563\nf 3591 12835 12837\nf 12835 2331 12836\nf 12837 12836 3590\nf 4565 12838 12840\nf 12838 923 12839\nf 12840 12839 4564\nf 925 12841 12843\nf 12841 2333 12842\nf 12843 12842 3592\nf 4566 12844 12846\nf 12844 2333 12845\nf 12846 12845 2332\nf 4566 12847 12849\nf 12847 3593 12848\nf 12849 12848 2334\nf 4566 12850 12847\nf 12850 959 12851\nf 12847 12851 3593\nf 961 12852 12708\nf 12852 3593 12851\nf 12708 12851 959\nf 927 12853 12602\nf 12853 2335 12854\nf 12602 12854 929\nf 2336 12855 7876\nf 12855 2337 12856\nf 7876 12856 2335\nf 963 12857 12859\nf 12857 2336 12858\nf 12859 12858 961\nf 929 12860 12862\nf 12860 2337 12861\nf 12862 12861 3594\nf 2336 12857 12864\nf 12857 963 12863\nf 12864 12863 2338\nf 3594 12865 12867\nf 12865 2338 12866\nf 12867 12866 3595\nf 4567 12868 12870\nf 12868 963 12869\nf 12870 12869 964\nf 3595 12871 12873\nf 12871 2339 12872\nf 12873 12872 3596\nf 4567 12874 12876\nf 12874 966 12875\nf 12876 12875 4568\nf 3596 12877 12879\nf 12877 2340 12878\nf 12879 12878 3597\nf 4568 12880 12882\nf 12880 968 12881\nf 12882 12881 4569\nf 3597 12883 12885\nf 12883 2341 12884\nf 12885 12884 938\nf 938 12886 12888\nf 12886 2342 12887\nf 12888 12887 3598\nf 4570 12889 12891\nf 12889 971 12890\nf 12891 12890 4571\nf 973 12892 12894\nf 12892 4572 12893\nf 12894 12893 4571\nf 940 12895 12896\nf 12895 3598 7877\nf 12896 7877 3599\nf 2343 12897 12898\nf 12897 4571 12893\nf 12898 12893 4572\nf 974 12899 12901\nf 12899 4573 12900\nf 12901 12900 4572\nf 3599 12902 12904\nf 12902 2344 12903\nf 12904 12903 3600\nf 2344 12905 12906\nf 12905 4572 12900\nf 12906 12900 4573\nf 976 12907 12909\nf 12907 4574 12908\nf 12909 12908 4573\nf 2345 12910 12911\nf 12910 4573 12908\nf 12911 12908 4574\nf 978 12912 12914\nf 12912 3602 12913\nf 12914 12913 4574\nf 3601 12915 12651\nf 12915 2346 7883\nf 12651 7883 783\nf 2346 12916 12917\nf 12916 4574 12913\nf 12917 12913 3602\nf 980 12918 12919\nf 12918 2347 7886\nf 12919 7886 3602\nf 2347 12918 12921\nf 12918 980 12920\nf 12921 12920 852\nf 852 12922 12921\nf 12922 2348 12923\nf 12921 12923 2347\nf 762 12924 12925\nf 12924 3603 7888\nf 12925 7888 2115\nf 2348 12922 7891\nf 12922 852 12131\nf 7891 12131 2349\nf 2115 7890 12926\nf 7890 2348 7892\nf 12926 7892 761\nf 984 12927 12929\nf 12927 2350 12928\nf 12929 12928 985\nf 2351 12930 7895\nf 12930 985 12928\nf 7895 12928 2350\nf 985 12930 12931\nf 12930 2351 7898\nf 12931 7898 2352\nf 2351 7904 7896\nf 7904 794 12932\nf 7896 12932 2157\nf 2353 7899 11944\nf 7899 2157 11959\nf 11944 11959 789\nf 985 12931 12933\nf 12931 2352 7901\nf 12933 7901 791\nf 2353 7478 7900\nf 7478 2154 7902\nf 7900 7902 2352\nf 789 7474 11942\nf 7474 1958 12934\nf 11942 12934 662\nf 4575 12935 12937\nf 12935 984 12936\nf 12937 12936 986\nf 2350 12927 12938\nf 12927 984 12935\nf 12938 12935 4575\nf 794 7905 7929\nf 7905 3604 12939\nf 7929 12939 987\nf 3605 7909 12941\nf 7909 987 12940\nf 12941 12940 3610\nf 986 12942 12937\nf 12942 988 12943\nf 12937 12943 4575\nf 2355 12944 12945\nf 12944 4575 12943\nf 12945 12943 988\nf 989 12946 12948\nf 12946 4576 12947\nf 12948 12947 988\nf 987 12949 12950\nf 12949 2354 7911\nf 12950 7911 2356\nf 2355 12945 12951\nf 12945 988 12947\nf 12951 12947 4576\nf 2356 7915 12953\nf 7915 3606 12952\nf 12953 12952 2358\nf 2357 12954 12956\nf 12954 4576 12955\nf 12956 12955 4577\nf 2358 12952 7920\nf 12952 3606 7917\nf 7920 7917 3607\nf 3607 7916 12958\nf 7916 2357 12957\nf 12958 12957 4578\nf 2360 12959 12961\nf 12959 4578 12960\nf 12961 12960 2359\nf 992 12962 12964\nf 12962 2359 12963\nf 12964 12963 991\nf 990 7921 12966\nf 7921 3607 12965\nf 12966 12965 2360\nf 994 12967 12969\nf 12967 4579 12968\nf 12969 12968 992\nf 796 12970 12972\nf 12970 4456 12971\nf 12972 12971 3605\nf 4457 12973 11964\nf 12973 2362 12974\nf 11964 12974 795\nf 2362 12975 12976\nf 12975 796 12972\nf 12976 12972 3605\nf 795 12974 12977\nf 12974 2362 7932\nf 12977 7932 2363\nf 2362 12976 7930\nf 12976 3605 12941\nf 7930 12941 3610\nf 795 12978 11969\nf 12978 4581 12979\nf 11969 12979 4580\nf 4581 12978 12980\nf 12978 795 12977\nf 12980 12977 2363\nf 4582 12981 12982\nf 12981 4580 12979\nf 12982 12979 4581\nf 2364 12983 12984\nf 12983 2358 7919\nf 12984 7919 990\nf 901 12542 12986\nf 12542 797 12985\nf 12986 12985 4582\nf 4582 12985 12981\nf 12985 797 12987\nf 12981 12987 4580\nf 901 12986 12989\nf 12986 4582 12988\nf 12989 12988 3613\nf 2365 12990 7939\nf 12990 2364 12991\nf 7939 12991 3612\nf 4513 12992 12994\nf 12992 2264 12993\nf 12994 12993 2366\nf 3608 12995 7924\nf 12995 2361 7926\nf 7924 7926 993\nf 2361 12996 12998\nf 12996 4579 12997\nf 12998 12997 2255\nf 889 12999 12415\nf 12999 4504 13000\nf 12415 13000 2255\nf 814 13001 13002\nf 13001 2367 7947\nf 13002 7947 2368\nf 2368 13003 13002\nf 13003 2369 13004\nf 13002 13004 814\nf 2368 7944 13006\nf 7944 812 13005\nf 13006 13005 3615\nf 811 13007 7798\nf 13007 3615 13005\nf 7798 13005 812\nf 4583 13008 13009\nf 13008 945 7951\nf 13009 7951 3614\nf 3616 13010 13012\nf 13010 2370 13011\nf 13012 13011 3615\nf 4584 13013 13015\nf 13013 947 13014\nf 13015 13014 4583\nf 3617 13016 13018\nf 13016 2371 13017\nf 13018 13017 3616\nf 4585 13019 13021\nf 13019 949 13020\nf 13021 13020 4584\nf 3618 13022 13024\nf 13022 2372 13023\nf 13024 13023 3617\nf 4586 13025 13027\nf 13025 951 13026\nf 13027 13026 4585\nf 3619 13028 13030\nf 13028 2373 13029\nf 13030 13029 3618\nf 4587 13031 13033\nf 13031 953 13032\nf 13033 13032 4586\nf 3620 13034 13036\nf 13034 2374 13035\nf 13036 13035 3619\nf 4588 13037 13039\nf 13037 955 13038\nf 13039 13038 4587\nf 956 13040 13042\nf 13040 4588 13041\nf 13042 13041 958\nf 4589 13043 13045\nf 13043 2375 13044\nf 13045 13044 4588\nf 4589 13046 13048\nf 13046 895 13047\nf 13048 13047 2376\nf 894 13049 13050\nf 13049 2376 13047\nf 13050 13047 895\nf 958 13051 12705\nf 13051 2375 13052\nf 12705 13052 960\nf 2376 13053 13055\nf 13053 2377 13054\nf 13055 13054 2375\nf 2376 13049 13057\nf 13049 894 13056\nf 13057 13056 4590\nf 960 13058 12713\nf 13058 2377 13059\nf 12713 13059 962\nf 4590 13060 13062\nf 13060 892 13061\nf 13062 13061 4591\nf 4592 13063 13065\nf 13063 2379 13064\nf 13065 13064 4591\nf 965 13066 13068\nf 13066 2379 13067\nf 13068 13067 967\nf 967 13069 13071\nf 13069 2380 13070\nf 13071 13070 969\nf 4592 13072 13074\nf 13072 995 13073\nf 13074 13073 4593\nf 994 13075 13077\nf 13075 2381 13076\nf 13077 13076 4593\nf 3621 13078 13080\nf 13078 2381 13079\nf 13080 13079 3622\nf 3622 13081 13083\nf 13081 2382 13082\nf 13083 13082 3623\nf 4594 13084 13086\nf 13084 991 13085\nf 13086 13085 4595\nf 4596 13087 13089\nf 13087 2383 13088\nf 13089 13088 4595\nf 975 13090 13091\nf 13090 3623 7952\nf 13091 7952 3624\nf 977 13092 13093\nf 13092 3624 7955\nf 13093 7955 3625\nf 2384 13094 13096\nf 13094 989 13095\nf 13096 13095 4597\nf 4597 13097 13099\nf 13097 986 13098\nf 13099 13098 4598\nf 979 13100 13102\nf 13100 3625 13101\nf 13102 13101 3626\nf 3626 13103 13104\nf 13103 4597 13099\nf 13104 13099 4598\nf 4598 13105 13104\nf 13105 981 13106\nf 13104 13106 3626\nf 4598 13098 13108\nf 13098 986 13107\nf 13108 13107 4599\nf 984 13109 13111\nf 13109 4600 13110\nf 13111 13110 4599\nf 982 13112 13114\nf 13112 2385 13113\nf 13114 13113 3627\nf 2385 13115 13117\nf 13115 4599 13116\nf 13117 13116 2386\nf 985 13118 12929\nf 13118 4600 13109\nf 12929 13109 984\nf 853 13119 13120\nf 13119 3627 7958\nf 13120 7958 3628\nf 3628 13121 13123\nf 13121 2387 13122\nf 13123 13122 2388\nf 2387 13124 13125\nf 13124 791 11948\nf 13125 11948 790\nf 854 13126 7659\nf 13126 2388 13127\nf 7659 13127 780\nf 2388 13128 13127\nf 13128 790 7961\nf 13127 7961 780\nf 793 13129 11951\nf 13129 2389 7962\nf 11951 7962 790\nf 2389 7964 7963\nf 7964 781 11937\nf 7963 11937 780\nf 2389 13129 13130\nf 13129 793 7672\nf 13130 7672 855\nf 855 12143 13130\nf 12143 2390 7965\nf 13130 7965 2389\nf 781 7966 7675\nf 7966 2390 13131\nf 7675 13131 3487\nf 2173 13132 12029\nf 13132 2391 13133\nf 12029 13133 824\nf 4601 13134 13136\nf 13134 2391 13135\nf 13136 13135 2392\nf 3629 13137 13138\nf 13137 2392 8030\nf 13138 8030 2172\nf 2393 13139 13140\nf 13139 4601 13136\nf 13140 13136 2392\nf 3630 13141 13143\nf 13141 2393 13142\nf 13143 13142 3629\nf 4602 13144 13146\nf 13144 996 13145\nf 13146 13145 4601\nf 3631 13147 13149\nf 13147 2394 13148\nf 13149 13148 3630\nf 4603 13150 13152\nf 13150 998 13151\nf 13152 13151 4602\nf 3632 13153 13155\nf 13153 2395 13154\nf 13155 13154 3631\nf 4604 13156 13158\nf 13156 1000 13157\nf 13158 13157 4603\nf 3633 13159 13161\nf 13159 2396 13160\nf 13161 13160 3632\nf 4605 13162 13164\nf 13162 1002 13163\nf 13164 13163 4604\nf 3634 13165 13167\nf 13165 2397 13166\nf 13167 13166 3633\nf 4606 13168 13170\nf 13168 1004 13169\nf 13170 13169 4605\nf 3635 13171 13173\nf 13171 2398 13172\nf 13173 13172 3634\nf 4607 13174 13176\nf 13174 1006 13175\nf 13176 13175 4606\nf 3636 13177 13179\nf 13177 2399 13178\nf 13179 13178 3635\nf 4608 13180 13182\nf 13180 1008 13181\nf 13182 13181 4607\nf 3637 13183 13185\nf 13183 2400 13184\nf 13185 13184 3636\nf 4609 13186 13188\nf 13186 1010 13187\nf 13188 13187 4608\nf 3638 13189 13191\nf 13189 2401 13190\nf 13191 13190 3637\nf 4610 13192 13194\nf 13192 1012 13193\nf 13194 13193 4609\nf 3639 13195 13197\nf 13195 2402 13196\nf 13197 13196 3638\nf 4611 13198 13200\nf 13198 1014 13199\nf 13200 13199 4610\nf 3640 13201 13203\nf 13201 4611 13202\nf 13203 13202 3639\nf 4612 13204 13206\nf 13204 1018 13205\nf 13206 13205 5317\nf 3641 13207 13209\nf 13207 4612 13208\nf 13209 13208 3640\nf 4613 13210 13212\nf 13210 2403 13211\nf 13212 13211 4614\nf 4613 13213 13214\nf 13213 1018 13204\nf 13214 13204 4612\nf 3642 13215 13217\nf 13215 2403 13216\nf 13217 13216 3641\nf 1021 13218 7967\nf 13218 3659 13219\nf 7967 13219 4615\nf 4615 13220 13222\nf 13220 1020 13221\nf 13222 13221 4614\nf 1022 13223 13225\nf 13223 2404 13224\nf 13225 13224 3642\nf 1021 7969 13227\nf 7969 2405 13226\nf 13227 13226 3643\nf 2406 13228 13229\nf 13228 3643 13226\nf 13229 13226 2405\nf 2406 13230 13232\nf 13230 1022 13231\nf 13232 13231 3644\nf 3674 13233 13234\nf 13233 3644 13231\nf 13234 13231 1022\nf 1023 13235 13236\nf 13235 3643 7970\nf 13236 7970 1025\nf 2407 13237 13239\nf 13237 1024 13238\nf 13239 13238 3660\nf 1026 7989 13240\nf 7989 3660 13238\nf 13240 13238 1024\nf 4616 12028 13241\nf 12028 2174 7974\nf 13241 7974 2409\nf 823 13242 13243\nf 13242 825 7774\nf 13243 7774 3507\nf 4616 13244 13246\nf 13244 2410 13245\nf 13246 13245 4617\nf 2410 13244 13247\nf 13244 4616 13241\nf 13247 13241 2409\nf 3645 13248 13249\nf 13248 2410 13247\nf 13249 13247 2409\nf 4618 13250 13252\nf 13250 877 13251\nf 13252 13251 4617\nf 3646 13253 13255\nf 13253 2411 13254\nf 13255 13254 3645\nf 4619 13256 13258\nf 13256 878 13257\nf 13258 13257 4618\nf 3647 13259 13261\nf 13259 2412 13260\nf 13261 13260 3646\nf 4620 13262 13264\nf 13262 879 13263\nf 13264 13263 4619\nf 3648 13265 13267\nf 13265 2413 13266\nf 13267 13266 3647\nf 4621 13268 13270\nf 13268 880 13269\nf 13270 13269 4620\nf 3649 13271 13273\nf 13271 2414 13272\nf 13273 13272 3648\nf 4622 13274 13276\nf 13274 881 13275\nf 13276 13275 4621\nf 3650 13277 13279\nf 13277 2415 13278\nf 13279 13278 3649\nf 4623 13280 13282\nf 13280 882 13281\nf 13282 13281 4622\nf 3651 13283 13285\nf 13283 4623 13284\nf 13285 13284 3650\nf 4624 13286 13288\nf 13286 883 13287\nf 13288 13287 4623\nf 3651 13289 13291\nf 13289 5318 13290\nf 13291 13290 4624\nf 5318 13292 13294\nf 13292 885 13293\nf 13294 13293 884\nf 3653 13295 13297\nf 13295 4625 13296\nf 13297 13296 3652\nf 4626 13298 13300\nf 13298 885 13299\nf 13300 13299 4625\nf 3654 13301 13303\nf 13301 2416 13302\nf 13303 13302 3653\nf 4627 13304 13306\nf 13304 5316 13305\nf 13306 13305 4626\nf 3655 13307 13309\nf 13307 2417 13308\nf 13309 13308 3654\nf 4628 13310 13312\nf 13310 3519 13311\nf 13312 13311 4627\nf 3656 13313 13315\nf 13313 2418 13314\nf 13315 13314 3655\nf 3520 12394 13317\nf 12394 4629 13316\nf 13317 13316 887\nf 4629 12396 13319\nf 12396 886 13318\nf 13319 13318 4628\nf 3658 13320 13322\nf 13320 2419 13321\nf 13322 13321 3657\nf 3521 12400 13324\nf 12400 4630 13323\nf 13324 13323 888\nf 3658 7979 13320\nf 7979 4630 13325\nf 13320 13325 2419\nf 4615 13219 13220\nf 13219 3659 13326\nf 13220 13326 1020\nf 2421 13327 13329\nf 13327 4631 13328\nf 13329 13328 2420\nf 847 13330 12114\nf 13330 4632 7982\nf 12114 7982 785\nf 4632 13330 13332\nf 13330 847 13331\nf 13332 13331 4631\nf 1023 13333 13335\nf 13333 2422 13334\nf 13335 13334 1021\nf 2423 13336 7986\nf 13336 4633 13337\nf 7986 13337 2201\nf 848 7627 13338\nf 7627 774 12119\nf 13338 12119 5832\nf 848 13339 7990\nf 13339 2408 13340\nf 7990 13340 2424\nf 2408 13339 13342\nf 13339 848 13341\nf 13342 13341 4634\nf 2202 13343 12121\nf 13343 849 13344\nf 12121 13344 3486\nf 849 13345 7988\nf 13345 2424 13346\nf 7988 13346 3660\nf 822 13347 12023\nf 13347 2172 13348\nf 12023 13348 821\nf 2426 13349 13351\nf 13349 997 13350\nf 13351 13350 4635\nf 3662 13352 13354\nf 13352 4636 13353\nf 13354 13353 2426\nf 3663 13355 13357\nf 13355 2427 13356\nf 13357 13356 3662\nf 3664 13358 13360\nf 13358 2428 13359\nf 13360 13359 3663\nf 3665 13361 13363\nf 13361 2429 13362\nf 13363 13362 3664\nf 4637 13364 13366\nf 13364 1005 13365\nf 13366 13365 1003\nf 3666 13367 13369\nf 13367 2430 13368\nf 13369 13368 3665\nf 4638 13370 13372\nf 13370 1007 13371\nf 13372 13371 4637\nf 3667 13373 13375\nf 13373 2431 13374\nf 13375 13374 3666\nf 4639 13376 13378\nf 13376 1009 13377\nf 13378 13377 4638\nf 3668 13379 13381\nf 13379 2432 13380\nf 13381 13380 3667\nf 4640 13382 13384\nf 13382 1011 13383\nf 13384 13383 4639\nf 3669 13385 13387\nf 13385 2433 13386\nf 13387 13386 3668\nf 4641 13388 13390\nf 13388 1013 13389\nf 13390 13389 4640\nf 3670 13391 13393\nf 13391 2434 13392\nf 13393 13392 3669\nf 4642 13394 13396\nf 13394 1015 13395\nf 13396 13395 4641\nf 3671 13397 13399\nf 13397 2435 13398\nf 13399 13398 3670\nf 4643 13400 13402\nf 13400 1017 13401\nf 13402 13401 4642\nf 3672 13403 13405\nf 13403 2436 13404\nf 13405 13404 3671\nf 1019 13406 13408\nf 13406 2437 13407\nf 13408 13407 2438\nf 2439 13409 13411\nf 13409 2437 13410\nf 13411 13410 3672\nf 3642 13412 13225\nf 13412 2438 13413\nf 13225 13413 1022\nf 2439 13414 13416\nf 13414 2440 13415\nf 13416 13415 2438\nf 2439 13417 13419\nf 13417 930 13418\nf 13419 13418 3673\nf 3560 12612 13420\nf 12612 3673 13418\nf 13420 13418 930\nf 1022 13421 13234\nf 13421 2440 13422\nf 13234 13422 3674\nf 2441 13423 7997\nf 13423 3674 13422\nf 7997 13422 2440\nf 934 13424 13426\nf 13424 2441 13425\nf 13426 13425 932\nf 1026 13240 13427\nf 13240 1024 7998\nf 13427 7998 2442\nf 2441 13424 13429\nf 13424 934 13428\nf 13429 13428 4644\nf 936 13430 13432\nf 13430 4645 13431\nf 13432 13431 4644\nf 1026 13433 13435\nf 13433 2443 13434\nf 13435 13434 3675\nf 2443 13436 13437\nf 13436 4644 13431\nf 13437 13431 4645\nf 937 13438 13440\nf 13438 4646 13439\nf 13440 13439 4645\nf 3675 13441 13443\nf 13441 3676 13442\nf 13443 13442 3486\nf 2444 13444 13445\nf 13444 4645 13439\nf 13445 13439 4646\nf 939 13446 13448\nf 13446 3677 13447\nf 13448 13447 4646\nf 2445 13449 13450\nf 13449 4646 13447\nf 13450 13447 3677\nf 851 8008 13451\nf 8008 2447 8006\nf 13451 8006 3677\nf 776 7631 11896\nf 7631 2446 13452\nf 11896 13452 769\nf 2447 13453 8007\nf 13453 769 13452\nf 8007 13452 2446\nf 769 13453 13455\nf 13453 2447 13454\nf 13455 13454 768\nf 2203 12127 8010\nf 12127 768 13454\nf 8010 13454 2447\nf 711 13456 8166\nf 13456 2489 13457\nf 8166 13457 2449\nf 2448 8012 13459\nf 8012 2449 13458\nf 13459 13458 1027\nf 1030 13460 13462\nf 13460 3897 13461\nf 13462 13461 4647\nf 1031 8078 13464\nf 8078 645 13463\nf 13464 13463 1930\nf 3679 13465 13467\nf 13465 2451 13466\nf 13467 13466 4648\nf 2500 8193 13468\nf 8193 1035 8261\nf 13468 8261 830\nf 2176 12222 8023\nf 12222 829 8026\nf 8023 8026 2452\nf 2452 8025 13469\nf 8025 830 8260\nf 13469 8260 3690\nf 3880 13470 13472\nf 13470 2453 13471\nf 13472 13471 823\nf 5975 8553 13473\nf 8553 2392 13135\nf 13473 13135 2391\nf 3862 13474 13476\nf 13474 5975 13475\nf 13476 13475 1037\nf 821 13477 13478\nf 13477 2454 8034\nf 13478 8034 2425\nf 2454 13477 13480\nf 13477 821 13479\nf 13480 13479 3898\nf 2582 13481 13483\nf 13481 818 13482\nf 13483 13482 3746\nf 4729 13484 13485\nf 13484 2456 12652\nf 13485 12652 816\nf 4729 13486 13484\nf 13486 3773 8391\nf 13484 8391 2456\nf 2367 13001 13488\nf 13001 814 13487\nf 13488 13487 3830\nf 2458 12011 13490\nf 12011 3484 13489\nf 13490 13489 1043\nf 804 13491 12002\nf 13491 2451 13492\nf 12002 13492 2167\nf 2451 13491 13466\nf 13491 804 13493\nf 13466 13493 4648\nf 670 12004 13495\nf 12004 2167 13494\nf 13495 13494 3678\nf 2460 13496 13497\nf 13496 668 8049\nf 13497 8049 2459\nf 2459 8048 13499\nf 8048 669 13498\nf 13499 13498 3678\nf 670 13495 13500\nf 13495 3678 13498\nf 13500 13498 669\nf 2459 13501 13503\nf 13501 3679 13502\nf 13503 13502 4649\nf 2460 13497 13504\nf 13497 2459 13503\nf 13504 13503 4649\nf 1045 8050 13505\nf 8050 2460 13504\nf 13505 13504 4649\nf 668 13496 13507\nf 13496 2460 13506\nf 13507 13506 667\nf 2461 13508 8052\nf 13508 667 13506\nf 8052 13506 2460\nf 1046 13509 13510\nf 13509 2461 8051\nf 13510 8051 1045\nf 2461 13509 13512\nf 13509 1046 13511\nf 13512 13511 2462\nf 666 13513 13514\nf 13513 2461 13512\nf 13514 13512 2462\nf 667 13508 13515\nf 13508 2461 13513\nf 13515 13513 666\nf 2463 8054 13517\nf 8054 657 13516\nf 13517 13516 665\nf 1048 8073 8062\nf 8073 2464 13518\nf 8062 13518 3680\nf 649 8329 13519\nf 8329 2465 8059\nf 13519 8059 650\nf 4742 13520 13522\nf 13520 2662 13521\nf 13522 13521 1048\nf 2466 13523 8072\nf 13523 651 13524\nf 8072 13524 2464\nf 651 13523 13525\nf 13523 2466 8069\nf 13525 8069 652\nf 650 8058 13526\nf 8058 2464 13524\nf 13526 13524 651\nf 1051 13527 8074\nf 13527 3825 13528\nf 8074 13528 3681\nf 3825 13529 13528\nf 13529 2468 13530\nf 13528 13530 3681\nf 2469 13531 13533\nf 13531 1930 13532\nf 13533 13532 646\nf 1031 13534 8484\nf 13534 2469 13535\nf 8484 13535 5319\nf 1930 13531 13464\nf 13531 2469 13534\nf 13464 13534 1031\nf 2469 13533 8080\nf 13533 646 13536\nf 8080 13536 1933\nf 1052 13537 13539\nf 13537 2471 13538\nf 13539 13538 1053\nf 2471 13537 13540\nf 13537 1052 8552\nf 13540 8552 2470\nf 679 13541 13543\nf 13541 2470 13542\nf 13543 13542 680\nf 1053 13538 8473\nf 13538 2471 8089\nf 8473 8089 643\nf 2690 8095 8551\nf 8095 680 13542\nf 8551 13542 2470\nf 2471 13540 8087\nf 13540 2470 13541\nf 8087 13541 679\nf 1055 13544 8541\nf 13544 2473 8101\nf 8541 8101 1054\nf 2473 13544 13545\nf 13544 1055 8107\nf 13545 8107 2472\nf 2473 13545 8096\nf 13545 2472 13546\nf 8096 13546 683\nf 2472 8106 13547\nf 8106 1056 8435\nf 13547 8435 2474\nf 2472 13548 13546\nf 13548 684 13549\nf 13546 13549 683\nf 684 13548 8104\nf 13548 2472 13547\nf 8104 13547 2474\nf 2475 13550 8470\nf 13550 2476 8424\nf 8470 8424 1059\nf 2476 13550 8115\nf 13550 2475 8113\nf 8115 8113 689\nf 2621 13551 13552\nf 13551 1059 8423\nf 13552 8423 1057\nf 1058 8429 8108\nf 8429 1057 8118\nf 8108 8118 2002\nf 3772 8385 13553\nf 8385 2478 8120\nf 13553 8120 1060\nf 2477 13554 8387\nf 13554 692 8122\nf 8387 8122 2478\nf 692 13554 13556\nf 13554 2477 13555\nf 13556 13555 693\nf 2479 8463 13557\nf 8463 1061 8121\nf 13557 8121 2478\nf 2479 13557 8126\nf 13557 2478 8124\nf 8126 8124 691\nf 694 8132 13559\nf 8132 2480 13558\nf 13559 13558 695\nf 3919 13560 13561\nf 13560 695 13558\nf 13561 13558 2480\nf 2481 13562 13563\nf 13562 695 13560\nf 13563 13560 3919\nf 697 13564 8136\nf 13564 2481 13565\nf 8136 13565 1064\nf 2481 13566 13562\nf 13566 696 13567\nf 13562 13567 695\nf 701 13568 13569\nf 13568 2482 8142\nf 13569 8142 2030\nf 2482 13568 8569\nf 13568 701 8140\nf 8569 8140 1065\nf 3917 13570 13571\nf 13570 3879 8567\nf 13571 8567 1065\nf 2724 13572 13574\nf 13572 704 13573\nf 13574 13573 703\nf 2034 13575 13577\nf 13575 4647 13576\nf 13577 13576 703\nf 1029 13578 13580\nf 13578 2034 13579\nf 13580 13579 702\nf 2034 13578 13575\nf 13578 1029 13581\nf 13575 13581 4647\nf 705 13582 13584\nf 13582 2483 13583\nf 13584 13583 2039\nf 2483 13582 13586\nf 13582 705 13585\nf 13586 13585 1067\nf 2483 13587 13588\nf 13587 1068 8144\nf 13588 8144 5946\nf 3896 13589 13590\nf 13589 2483 13586\nf 13590 13586 1067\nf 4689 13591 13592\nf 13591 5946 8319\nf 13592 8319 2484\nf 5946 13591 13594\nf 13591 4689 13593\nf 13594 13593 700\nf 685 13595 13597\nf 13595 5834 13596\nf 13597 13596 4651\nf 2019 13598 13600\nf 13598 2485 13599\nf 13600 13599 4651\nf 2019 13601 13598\nf 13601 698 13602\nf 13598 13602 2485\nf 1069 13603 13604\nf 13603 2485 13602\nf 13604 13602 698\nf 1069 13604 8295\nf 13604 698 8298\nf 8295 8298 2486\nf 686 13605 13606\nf 13605 687 8151\nf 13606 8151 2487\nf 1071 13607 13609\nf 13607 1070 13608\nf 13609 13608 4652\nf 686 13610 13612\nf 13610 2488 13611\nf 13612 13611 678\nf 2488 13610 13613\nf 13610 686 13606\nf 13613 13606 2487\nf 708 13614 13616\nf 13614 2491 13615\nf 13616 13615 2053\nf 677 13617 13619\nf 13617 2491 13618\nf 13619 13618 1982\nf 2491 13617 8161\nf 13617 677 8219\nf 8161 8219 1072\nf 1027 13620 13621\nf 13620 2489 8160\nf 13621 8160 2490\nf 2489 13620 13457\nf 13620 1027 13458\nf 13457 13458 2449\nf 2491 13622 13615\nf 13622 711 13623\nf 13615 13623 2053\nf 2491 8162 13622\nf 8162 2489 13456\nf 13622 13456 711\nf 1982 13618 8155\nf 13618 2491 13624\nf 8155 13624 5983\nf 1028 8164 13626\nf 8164 712 13625\nf 13626 13625 2054\nf 2054 8167 13626\nf 8167 2449 8011\nf 13626 8011 1028\nf 1073 13627 13628\nf 13627 2496 8177\nf 13628 8177 3682\nf 3682 8179 13630\nf 8179 2492 13629\nf 13630 13629 4948\nf 4948 13631 13633\nf 13631 718 13632\nf 13633 13632 2503\nf 2494 8245 8170\nf 8245 1075 13634\nf 8170 13634 2495\nf 743 8174 8189\nf 8174 2495 13634\nf 8189 13634 1075\nf 2495 8173 8175\nf 8173 742 13635\nf 8175 13635 721\nf 1074 13636 8239\nf 13636 2492 8178\nf 8239 8178 2496\nf 2492 13636 13637\nf 13636 1074 8176\nf 13637 8176 721\nf 720 13638 13639\nf 13638 2492 13637\nf 13639 13637 721\nf 719 13640 13642\nf 13640 4948 13641\nf 13642 13641 720\nf 2497 8252 8181\nf 8252 746 13643\nf 8181 13643 745\nf 744 8187 13644\nf 8187 2498 8182\nf 13644 8182 745\nf 4949 13645 13647\nf 13645 5808 13646\nf 13647 13646 3683\nf 2499 13648 8203\nf 13648 748 8258\nf 8203 8258 2527\nf 748 13648 13650\nf 13648 2499 13649\nf 13650 13649 735\nf 740 11817 8017\nf 11817 739 13651\nf 8017 13651 2500\nf 2500 13651 8194\nf 13651 739 13652\nf 8194 13652 2501\nf 738 13653 13654\nf 13653 2501 13652\nf 13654 13652 739\nf 1035 8195 13655\nf 8195 2501 8196\nf 13655 8196 1077\nf 2501 13653 8197\nf 13653 738 13656\nf 8197 13656 2502\nf 737 13657 13658\nf 13657 2502 13656\nf 13658 13656 738\nf 1078 13659 13661\nf 13659 2502 13660\nf 13661 13660 5320\nf 736 13662 13663\nf 13662 2502 13657\nf 13663 13657 737\nf 1077 8198 13664\nf 8198 2502 13659\nf 13664 13659 1078\nf 735 13665 13666\nf 13665 3683 8200\nf 13666 8200 736\nf 3683 13665 13667\nf 13665 735 13649\nf 13667 13649 2499\nf 717 13668 13669\nf 13668 2504 8205\nf 13669 8205 2503\nf 2503 13632 13669\nf 13632 718 13670\nf 13669 13670 717\nf 2493 13671 13672\nf 13671 2503 8204\nf 13672 8204 3684\nf 2504 13668 13674\nf 13668 717 13673\nf 13674 13673 716\nf 3684 13675 13676\nf 13675 2505 8208\nf 13676 8208 3685\nf 1028 13677 8165\nf 13677 2505 13678\nf 8165 13678 2504\nf 1079 13679 13680\nf 13679 3685 8207\nf 13680 8207 3686\nf 2505 13677 13681\nf 13677 1028 8013\nf 13681 8013 2448\nf 1079 13680 13683\nf 13680 3686 13682\nf 13683 13682 1080\nf 1080 13682 8215\nf 13682 3686 8212\nf 8215 8212 2507\nf 3686 8209 8210\nf 8209 2505 13681\nf 8210 13681 2448\nf 2507 8211 13684\nf 8211 2448 13459\nf 13684 13459 1027\nf 2507 13684 13685\nf 13684 1027 13621\nf 13685 13621 2490\nf 2509 13686 13687\nf 13686 1080 8214\nf 13687 8214 2508\nf 2487 13688 13613\nf 13688 1071 8152\nf 13613 8152 2488\nf 2508 8213 8216\nf 8213 2507 13685\nf 8216 13685 2490\nf 2488 8217 13689\nf 8217 2490 8159\nf 13689 8159 1072\nf 678 13611 8218\nf 13611 2488 13689\nf 8218 13689 1072\nf 1070 8149 13690\nf 8149 685 13597\nf 13690 13597 4651\nf 1070 13690 13692\nf 13690 4651 13691\nf 13692 13691 2510\nf 2485 13603 13694\nf 13603 1069 13693\nf 13694 13693 2511\nf 1071 13688 13607\nf 13688 2487 8147\nf 13607 8147 1070\nf 2510 13695 13696\nf 13695 2485 13694\nf 13696 13694 2511\nf 4652 13697 8221\nf 13697 2510 13698\nf 8221 13698 4653\nf 4655 13699 13701\nf 13699 2509 13700\nf 13701 13700 2513\nf 3687 8222 13703\nf 8222 4653 13702\nf 13703 13702 2512\nf 4654 13704 13706\nf 13704 3687 13705\nf 13706 13705 1082\nf 1080 13686 13707\nf 13686 2509 13699\nf 13707 13699 4655\nf 2513 13708 13709\nf 13708 3687 13704\nf 13709 13704 4654\nf 3688 8225 13711\nf 8225 4654 13710\nf 13711 13710 2514\nf 2515 13712 13714\nf 13712 3688 13713\nf 13714 13713 1083\nf 1079 13715 13717\nf 13715 4655 13716\nf 13717 13716 3689\nf 3689 13718 13719\nf 13718 3688 13712\nf 13719 13712 2515\nf 2506 13720 8228\nf 13720 3689 13721\nf 8228 13721 2516\nf 2515 13714 13723\nf 13714 1083 13722\nf 13723 13722 1084\nf 1084 13724 13723\nf 13724 4656 13725\nf 13723 13725 2515\nf 4656 13724 13727\nf 13724 1084 13726\nf 13727 13726 4657\nf 2493 8229 8230\nf 8229 2516 13728\nf 8230 13728 2517\nf 4658 13729 13730\nf 13729 4656 13727\nf 13730 13727 4657\nf 1085 13731 13732\nf 13731 4658 13730\nf 13732 13730 4657\nf 1073 13733 13627\nf 13733 2518 13734\nf 13627 13734 2496\nf 2518 8235 8236\nf 8235 4658 13735\nf 8236 13735 2519\nf 2496 13734 8240\nf 13734 2518 8238\nf 8240 8238 2520\nf 1085 13736 13731\nf 13736 2519 13735\nf 13731 13735 4658\nf 1074 8241 8169\nf 8241 2520 8244\nf 8169 8244 2494\nf 2520 8237 8242\nf 8237 2519 13737\nf 8242 13737 2521\nf 2494 8243 8246\nf 8243 2521 13738\nf 8246 13738 2522\nf 1075 8247 8183\nf 8247 2522 13739\nf 8183 13739 2523\nf 4659 13740 13742\nf 13740 1087 13741\nf 13742 13741 1088\nf 1087 13740 13744\nf 13740 4659 13743\nf 13744 13743 2522\nf 2498 8184 8180\nf 8184 2523 8250\nf 8180 8250 2497\nf 4659 13742 13746\nf 13742 1088 13745\nf 13746 13745 4660\nf 2524 13747 13749\nf 13747 1089 13748\nf 13749 13748 2525\nf 1089 13747 8276\nf 13747 2524 13750\nf 8276 13750 4660\nf 747 13751 8255\nf 13751 746 8251\nf 8255 8251 2525\nf 2525 13748 8256\nf 13748 1089 13752\nf 8256 13752 2526\nf 1076 13753 13754\nf 13753 2526 13752\nf 13754 13752 1089\nf 2088 7408 13755\nf 7408 747 8254\nf 13755 8254 2526\nf 2527 13756 8190\nf 13756 2526 13753\nf 8190 13753 1076\nf 2088 13755 8257\nf 13755 2526 13756\nf 8257 13756 2527\nf 2176 13757 7740\nf 13757 1036 8028\nf 7740 8028 827\nf 4661 13758 13760\nf 13758 1090 13759\nf 13760 13759 4662\nf 2528 13761 13762\nf 13761 4661 8024\nf 13762 8024 2452\nf 1077 13763 13764\nf 13763 3691 8264\nf 13764 8264 3690\nf 1078 13765 13766\nf 13765 3692 8267\nf 13766 8267 3691\nf 4664 13767 13769\nf 13767 1091 13768\nf 13769 13768 4663\nf 5808 13770 13771\nf 13770 3693 8270\nf 13771 8270 3692\nf 4665 13772 13774\nf 13772 2529 13773\nf 13774 13773 4666\nf 3694 13775 13777\nf 13775 2529 13776\nf 13777 13776 3693\nf 2530 13778 13780\nf 13778 5809 13779\nf 13780 13779 4666\nf 3696 13781 8274\nf 13781 2530 13782\nf 8274 13782 3695\nf 4668 13783 13785\nf 13783 5321 13784\nf 13785 13784 4667\nf 3698 13786 13788\nf 13786 2531 13787\nf 13788 13787 3697\nf 4669 13789 13791\nf 13789 3714 13790\nf 13791 13790 4668\nf 3699 13792 13794\nf 13792 2532 13793\nf 13794 13793 3698\nf 5322 13795 13797\nf 13795 4670 13796\nf 13797 13796 3715\nf 3700 13798 13800\nf 13798 2533 13799\nf 13800 13799 3699\nf 4671 13801 13803\nf 13801 1094 13802\nf 13803 13802 4670\nf 3701 13804 13806\nf 13804 2534 13805\nf 13806 13805 3700\nf 4671 13807 13809\nf 13807 2535 13808\nf 13809 13808 4672\nf 3702 13810 13812\nf 13810 2535 13811\nf 13812 13811 3701\nf 1096 13813 13815\nf 13813 4672 13814\nf 13815 13814 3703\nf 2536 13816 13817\nf 13816 3703 13814\nf 13817 13814 4672\nf 3705 13818 13819\nf 13818 2536 8281\nf 13819 8281 2514\nf 1083 8282 13821\nf 8282 2536 13820\nf 13821 13820 3702\nf 1097 8280 13823\nf 8280 3704 13822\nf 13823 13822 1098\nf 3704 13824 13822\nf 13824 2538 13825\nf 13822 13825 1098\nf 1098 13825 13827\nf 13825 2538 13826\nf 13827 13826 1099\nf 2537 13828 13829\nf 13828 2538 13824\nf 13829 13824 3704\nf 1099 13826 13831\nf 13826 2538 13830\nf 13831 13830 2539\nf 2538 13828 13833\nf 13828 2537 13832\nf 13833 13832 1081\nf 2539 13830 13834\nf 13830 2538 13833\nf 13834 13833 1081\nf 3721 13835 13837\nf 13835 2540 13836\nf 13837 13836 4673\nf 2540 13838 13839\nf 13838 1099 13831\nf 13839 13831 2539\nf 4673 13836 13841\nf 13836 2540 13840\nf 13841 13840 2541\nf 2540 13839 13843\nf 13839 2539 13842\nf 13843 13842 3706\nf 2541 13840 8292\nf 13840 2540 13843\nf 8292 13843 3706\nf 4673 13844 13846\nf 13844 2542 13845\nf 13846 13845 2543\nf 2542 13844 13847\nf 13844 4673 13841\nf 13847 13841 2541\nf 2542 13847 13848\nf 13847 2541 8296\nf 13848 8296 2486\nf 2023 8300 8297\nf 8300 2542 13848\nf 8297 13848 2486\nf 1100 13849 13850\nf 13849 4673 13846\nf 13850 13846 2543\nf 2543 13845 8322\nf 13845 2542 8302\nf 8322 8302 699\nf 823 13243 13852\nf 13243 3507 13851\nf 13852 13851 4674\nf 2544 13853 12031\nf 13853 4674 13851\nf 12031 13851 3507\nf 1036 13854 8029\nf 13854 3707 13855\nf 8029 13855 826\nf 4675 13856 13858\nf 13856 2545 13857\nf 13858 13857 4676\nf 4675 13859 13861\nf 13859 3880 13860\nf 13861 13860 4674\nf 3708 13862 13864\nf 13862 3707 13863\nf 13864 13863 4662\nf 4677 13865 13867\nf 13865 1101 13866\nf 13867 13866 4676\nf 3710 13868 13870\nf 13868 2546 13869\nf 13870 13869 3709\nf 4678 13871 13873\nf 13871 1102 13872\nf 13873 13872 4677\nf 3711 13874 13876\nf 13874 2547 13875\nf 13876 13875 3710\nf 4679 13877 13879\nf 13877 1103 13878\nf 13879 13878 4678\nf 3712 13880 13882\nf 13880 2548 13881\nf 13882 13881 3711\nf 4680 13883 13885\nf 13883 1104 13884\nf 13885 13884 4679\nf 3713 13886 13888\nf 13886 2549 13887\nf 13888 13887 3712\nf 4681 13889 13891\nf 13889 1105 13890\nf 13891 13890 4680\nf 3714 13892 13894\nf 13892 2550 13893\nf 13894 13893 5321\nf 4682 13895 13897\nf 13895 1106 13896\nf 13897 13896 4681\nf 3715 13898 13797\nf 13898 2552 13899\nf 13797 13899 5322\nf 4683 13900 13902\nf 13900 1107 13901\nf 13902 13901 4682\nf 3715 13903 13898\nf 13903 5511 13904\nf 13898 13904 2552\nf 4684 13905 13907\nf 13905 3891 13906\nf 13907 13906 5977\nf 1096 13908 13910\nf 13908 2553 13909\nf 13910 13909 5512\nf 4685 13911 13913\nf 13911 5325 13912\nf 13913 13912 4684\nf 4686 13914 13916\nf 13914 3892 13915\nf 13916 13915 4685\nf 1110 13917 13919\nf 13917 4686 13918\nf 13919 13918 4687\nf 2556 13920 13921\nf 13920 4687 13918\nf 13921 13918 4686\nf 3720 13922 13924\nf 13922 2556 13923\nf 13924 13923 3719\nf 1111 13925 13927\nf 13925 4687 13926\nf 13927 13926 4688\nf 2557 13928 13929\nf 13928 4688 13926\nf 13929 13926 4687\nf 3722 13930 13932\nf 13930 2557 13931\nf 13932 13931 3721\nf 1112 13933 13935\nf 13933 4688 13934\nf 13935 13934 3723\nf 2558 13936 13937\nf 13936 3723 13934\nf 13937 13934 4688\nf 2558 13938 13940\nf 13938 1100 13939\nf 13940 13939 2484\nf 1100 13938 13942\nf 13938 2558 13941\nf 13942 13941 3722\nf 2543 13943 13850\nf 13943 4689 13944\nf 13850 13944 1100\nf 2025 13945 8321\nf 13945 4689 13943\nf 8321 13943 2543\nf 4689 13945 13593\nf 13945 2025 13946\nf 13593 13946 700\nf 1115 13947 13949\nf 13947 2559 13948\nf 13949 13948 1114\nf 1116 13950 13951\nf 13950 1113 8498\nf 13951 8498 3826\nf 2658 13952 13953\nf 13952 3826 8499\nf 13953 8499 3724\nf 2559 13954 13948\nf 13954 4690 13955\nf 13948 13955 1114\nf 1118 13956 13958\nf 13956 3726 13957\nf 13958 13957 3725\nf 2560 13959 13961\nf 13959 1119 13960\nf 13961 13960 4690\nf 1049 8063 13963\nf 8063 3680 13962\nf 13963 13962 3727\nf 2561 13964 8326\nf 13964 3727 13962\nf 8326 13962 3680\nf 2561 13965 13967\nf 13965 1032 13966\nf 13967 13966 2562\nf 1032 13965 8330\nf 13965 2561 8328\nf 8330 8328 2465\nf 1047 13968 8334\nf 13968 4745 13969\nf 8334 13969 1032\nf 2560 13970 13959\nf 13970 1121 13971\nf 13959 13971 1119\nf 3726 13972 13974\nf 13972 2563 13973\nf 13974 13973 2560\nf 1121 13975 13977\nf 13975 2563 13976\nf 13977 13976 4691\nf 3731 13978 13980\nf 13978 2564 13979\nf 13980 13979 3730\nf 2566 13981 13983\nf 13981 4693 13982\nf 13983 13982 2565\nf 3733 13984 13986\nf 13984 2566 13985\nf 13986 13985 3732\nf 1127 13987 13989\nf 13987 4693 13988\nf 13989 13988 5513\nf 4694 13990 13992\nf 13990 4695 13991\nf 13992 13991 5513\nf 1131 13993 13995\nf 13993 2567 13994\nf 13995 13994 2568\nf 4696 13996 13998\nf 13996 1042 13997\nf 13998 13997 2569\nf 4696 13999 14001\nf 13999 2567 14000\nf 14001 14000 4694\nf 810 8342 12444\nf 8342 2568 14002\nf 12444 14002 2261\nf 1116 14003 14005\nf 14003 2570 14004\nf 14005 14004 3734\nf 4698 14006 14008\nf 14006 2571 14007\nf 14008 14007 4697\nf 3734 14009 14011\nf 14009 2571 14010\nf 14011 14010 3735\nf 4699 14012 14014\nf 14012 2572 14013\nf 14014 14013 4698\nf 3735 14015 14017\nf 14015 2572 14016\nf 14017 14016 3736\nf 4700 14018 14020\nf 14018 2573 14019\nf 14020 14019 4699\nf 3736 14021 14023\nf 14021 2573 14022\nf 14023 14022 3737\nf 4701 14024 14026\nf 14024 2574 14025\nf 14026 14025 4700\nf 1124 14027 14029\nf 14027 2574 14028\nf 14029 14028 3738\nf 4702 14030 14032\nf 14030 2575 14031\nf 14032 14031 4701\nf 3738 14033 14035\nf 14033 2575 14034\nf 14035 14034 3739\nf 3741 14036 14038\nf 14036 2576 14037\nf 14038 14037 4702\nf 2577 14039 14041\nf 14039 1042 14040\nf 14041 14040 3740\nf 3741 14042 14043\nf 14042 805 8349\nf 14043 8349 2577\nf 3484 14044 14045\nf 14044 805 14042\nf 14045 14042 3741\nf 1042 14039 8039\nf 14039 2577 14046\nf 8039 14046 807\nf 2272 14047 8351\nf 14047 807 14046\nf 8351 14046 2577\nf 2578 14048 14050\nf 14048 4745 14049\nf 14050 14049 4703\nf 4703 14051 14053\nf 14051 1046 14052\nf 14053 14052 4704\nf 4705 14054 14056\nf 14054 3742 14055\nf 14056 14055 4704\nf 4706 14057 14059\nf 14057 2580 14058\nf 14059 14058 4705\nf 3742 14060 14062\nf 14060 2580 14061\nf 14062 14061 3743\nf 4707 14063 14065\nf 14063 2581 14064\nf 14065 14064 4706\nf 3743 14066 14068\nf 14066 2581 14067\nf 14068 14067 3744\nf 1033 14069 14071\nf 14069 3745 14070\nf 14071 14070 4707\nf 4648 14072 14074\nf 14072 4460 14073\nf 14074 14073 1033\nf 1043 14075 13490\nf 14075 3745 14076\nf 13490 14076 2458\nf 2458 14076 8046\nf 14076 3745 14077\nf 8046 14077 2273\nf 818 13481 14079\nf 13481 2582 14078\nf 14079 14078 3548\nf 1040 14080 14082\nf 14080 2582 14081\nf 14082 14081 4708\nf 2583 14083 14084\nf 14083 4708 14081\nf 14084 14081 2582\nf 3747 14085 14087\nf 14085 2583 14086\nf 14087 14086 3746\nf 2583 14088 14083\nf 14088 1138 14089\nf 14083 14089 4708\nf 4709 14090 14092\nf 14090 3800 14091\nf 14092 14091 1138\nf 3749 14093 14095\nf 14093 2584 14094\nf 14095 14094 3748\nf 4711 14096 14098\nf 14096 1141 14097\nf 14098 14097 4710\nf 3750 14099 14101\nf 14099 2585 14100\nf 14101 14100 3749\nf 4712 14102 14104\nf 14102 1143 14103\nf 14104 14103 4711\nf 3751 14105 14107\nf 14105 2586 14106\nf 14107 14106 3750\nf 4713 14108 14110\nf 14108 1145 14109\nf 14110 14109 4712\nf 3752 14111 14113\nf 14111 2587 14112\nf 14113 14112 3751\nf 4714 14114 14116\nf 14114 1147 14115\nf 14116 14115 4713\nf 3753 14117 14119\nf 14117 2588 14118\nf 14119 14118 3752\nf 4715 14120 14122\nf 14120 1149 14121\nf 14122 14121 4714\nf 3754 14123 14125\nf 14123 2589 14124\nf 14125 14124 3753\nf 4716 14126 14128\nf 14126 1151 14127\nf 14128 14127 4715\nf 3755 14129 14131\nf 14129 2590 14130\nf 14131 14130 3754\nf 4717 14132 14134\nf 14132 1153 14133\nf 14134 14133 4716\nf 3756 14135 14137\nf 14135 2591 14136\nf 14137 14136 3755\nf 4718 14138 14140\nf 14138 1155 14139\nf 14140 14139 4717\nf 2592 14141 14143\nf 14141 4718 14142\nf 14143 14142 3756\nf 2593 8359 14145\nf 8359 1157 14144\nf 14145 14144 4718\nf 1160 14146 14148\nf 14146 2592 14147\nf 14148 14147 1158\nf 2594 14149 8363\nf 14149 3757 14150\nf 8363 14150 2593\nf 2594 14151 14153\nf 14151 1160 14152\nf 14153 14152 3758\nf 1162 14154 14155\nf 14154 3758 14152\nf 14155 14152 1160\nf 3760 14156 14158\nf 14156 1161 14157\nf 14158 14157 3757\nf 3761 14159 14161\nf 14159 1163 14160\nf 14161 14160 3760\nf 1166 8594 14163\nf 8594 3762 14162\nf 14163 14162 2596\nf 1168 14164 14165\nf 14164 3764 8372\nf 14165 8372 3762\nf 3765 14166 14168\nf 14166 1167 14167\nf 14168 14167 3763\nf 1168 14169 14164\nf 14169 3766 8377\nf 14164 8377 3764\nf 3766 14170 8378\nf 14170 2599 14171\nf 8378 14171 2598\nf 1170 14172 8600\nf 14172 3768 14173\nf 8600 14173 3766\nf 3769 14174 8381\nf 14174 3770 14175\nf 8381 14175 2599\nf 1063 8135 14177\nf 8135 3771 14176\nf 14177 14176 3769\nf 2601 14178 14180\nf 14178 3772 14179\nf 14180 14179 2600\nf 2477 8388 13555\nf 8388 1062 8128\nf 13555 8128 693\nf 3771 8382 14181\nf 8382 2601 14180\nf 14181 14180 2600\nf 2170 14182 12013\nf 14182 1041 8037\nf 12013 8037 813\nf 3774 14183 14185\nf 14183 2602 14184\nf 14185 14184 3773\nf 4720 14186 14188\nf 14186 1173 14187\nf 14188 14187 4719\nf 3775 14189 14191\nf 14189 2603 14190\nf 14191 14190 3774\nf 4721 14192 14194\nf 14192 1174 14193\nf 14194 14193 4720\nf 3776 14195 14197\nf 14195 2604 14196\nf 14197 14196 3775\nf 4722 14198 14200\nf 14198 1176 14199\nf 14200 14199 4721\nf 3777 14201 14203\nf 14201 2605 14202\nf 14203 14202 3776\nf 4723 14204 14206\nf 14204 1178 14205\nf 14206 14205 4722\nf 3778 14207 14209\nf 14207 2606 14208\nf 14209 14208 3777\nf 4724 14210 14212\nf 14210 1180 14211\nf 14212 14211 4723\nf 3779 14213 14215\nf 14213 2607 14214\nf 14215 14214 3778\nf 4725 14216 14218\nf 14216 1182 14217\nf 14218 14217 4724\nf 4725 14219 14216\nf 14219 1185 14220\nf 14216 14220 1182\nf 1188 14221 14223\nf 14221 2609 14222\nf 14223 14222 1186\nf 1187 14224 14226\nf 14224 4727 14225\nf 14226 14225 3780\nf 1190 14227 14229\nf 14227 4728 14228\nf 14229 14228 1188\nf 2610 14230 14232\nf 14230 1189 14231\nf 14232 14231 3780\nf 1192 14233 14235\nf 14233 3781 14234\nf 14235 14234 4728\nf 1194 14236 14238\nf 14236 3782 14237\nf 14238 14237 3781\nf 3783 14239 14241\nf 14239 1193 14240\nf 14241 14240 1191\nf 1196 14242 14244\nf 14242 3784 14243\nf 14244 14243 3782\nf 3785 14245 14247\nf 14245 1195 14246\nf 14247 14246 3783\nf 1198 14248 14250\nf 14248 3786 14249\nf 14250 14249 3784\nf 3787 14251 14253\nf 14251 1197 14252\nf 14253 14252 3785\nf 1200 14254 14256\nf 14254 2614 14255\nf 14256 14255 3786\nf 3788 14257 14259\nf 14257 1199 14258\nf 14259 14258 3787\nf 1202 14260 14262\nf 14260 3789 14261\nf 14262 14261 2614\nf 2615 14263 14265\nf 14263 1201 14264\nf 14265 14264 3788\nf 1204 14266 14268\nf 14266 2616 14267\nf 14268 14267 3789\nf 1206 14269 14270\nf 14269 3791 8400\nf 14270 8400 2616\nf 2618 14271 14273\nf 14271 3792 14272\nf 14273 14272 2617\nf 1208 8462 14274\nf 8462 3793 8406\nf 14274 8406 3791\nf 2619 14275 14277\nf 14275 3794 14276\nf 14277 14276 2618\nf 1210 14278 8461\nf 14278 3795 8412\nf 8461 8412 3793\nf 2620 14279 14281\nf 14279 3796 14280\nf 14281 14280 2619\nf 3824 8468 14282\nf 8468 1059 8418\nf 14282 8418 3795\nf 2621 14283 14285\nf 14283 3797 14284\nf 14285 14284 2620\nf 1059 13551 8419\nf 13551 2621 14285\nf 8419 14285 2620\nf 2622 14286 14288\nf 14286 3798 14287\nf 14288 14287 2621\nf 1057 8428 13552\nf 8428 2622 14288\nf 13552 14288 2621\nf 2623 8432 14289\nf 8432 1213 8427\nf 14289 8427 3798\nf 1058 14290 8430\nf 14290 2623 14291\nf 8430 14291 2622\nf 2623 14290 8434\nf 14290 1058 14292\nf 8434 14292 2474\nf 688 8102 8110\nf 8102 2474 14292\nf 8110 14292 1058\nf 4730 14293 14294\nf 14293 2171 12018\nf 14294 12018 2455\nf 2455 14295 14294\nf 14295 4708 14296\nf 14294 14296 4730\nf 2624 14297 8438\nf 14297 4729 13485\nf 8438 13485 816\nf 4730 14298 14300\nf 14298 1138 14299\nf 14300 14299 3799\nf 4730 14296 14298\nf 14296 4708 14089\nf 14298 14089 1138\nf 3800 14301 14303\nf 14301 2626 14302\nf 14303 14302 3799\nf 3801 14304 14305\nf 14304 2626 14301\nf 14305 14301 3800\nf 4732 14306 14308\nf 14306 1175 14307\nf 14308 14307 4731\nf 3802 14309 14311\nf 14309 2627 14310\nf 14311 14310 3801\nf 4733 14312 14314\nf 14312 1177 14313\nf 14314 14313 4732\nf 3803 14315 14317\nf 14315 2628 14316\nf 14317 14316 3802\nf 4734 14318 14320\nf 14318 1179 14319\nf 14320 14319 4733\nf 3804 14321 14323\nf 14321 2629 14322\nf 14323 14322 3803\nf 4735 14324 14326\nf 14324 1181 14325\nf 14326 14325 4734\nf 3805 14327 14329\nf 14327 2630 14328\nf 14329 14328 3804\nf 4736 14330 14332\nf 14330 1183 14331\nf 14332 14331 4735\nf 3806 14333 14335\nf 14333 2631 14334\nf 14335 14334 3805\nf 4737 14336 14338\nf 14336 1184 14337\nf 14338 14337 4736\nf 3807 14339 14341\nf 14339 2632 14340\nf 14341 14340 3806\nf 2635 14342 14344\nf 14342 1186 14343\nf 14344 14343 4737\nf 2634 8440 14346\nf 8440 2633 14345\nf 14346 14345 3807\nf 2635 14347 14348\nf 14347 1190 14229\nf 14348 14229 1188\nf 1157 14349 14351\nf 14349 2634 14350\nf 14351 14350 1155\nf 1159 14352 14354\nf 14352 4738 14353\nf 14354 14353 5514\nf 3808 14355 14357\nf 14355 1192 14356\nf 14357 14356 2636\nf 1161 14358 14360\nf 14358 3809 14359\nf 14360 14359 4738\nf 3810 14361 14363\nf 14361 1194 14362\nf 14363 14362 3808\nf 1163 14364 14366\nf 14364 3811 14365\nf 14366 14365 3809\nf 3812 14367 14369\nf 14367 1196 14368\nf 14369 14368 3810\nf 3811 14370 14372\nf 14370 1167 14371\nf 14372 14371 2639\nf 3813 14373 14375\nf 14373 1198 14374\nf 14375 14374 3812\nf 1167 14166 14376\nf 14166 3765 8375\nf 14376 8375 5835\nf 3815 14377 14379\nf 14377 1200 14378\nf 14379 14378 3813\nf 3767 14380 14382\nf 14380 5324 14381\nf 14382 14381 3814\nf 2641 8443 14384\nf 8443 1202 14383\nf 14384 14383 3815\nf 2641 14385 14387\nf 14385 2642 14386\nf 14387 14386 3818\nf 1171 14388 14389\nf 14388 3819 8452\nf 14389 8452 3817\nf 3821 14390 14392\nf 14390 3820 14391\nf 14392 14391 2642\nf 1060 14393 14395\nf 14393 3821 14394\nf 14395 14394 3819\nf 2643 14396 8457\nf 14396 3822 14397\nf 8457 14397 3821\nf 2644 8467 14399\nf 8467 3823 14398\nf 14399 14398 2643\nf 2004 14400 14401\nf 14400 2644 8471\nf 14401 8471 690\nf 2479 8472 8464\nf 8472 2644 14399\nf 8464 14399 2643\nf 2475 14402 8111\nf 14402 2644 14400\nf 8111 14400 2004\nf 1052 13539 8548\nf 13539 1053 14403\nf 8548 14403 1214\nf 1214 14403 14404\nf 14403 1053 8477\nf 14404 8477 2645\nf 2645 8476 14406\nf 8476 644 14405\nf 14406 14405 1928\nf 2450 14407 8478\nf 14407 2645 14406\nf 8478 14406 1928\nf 1214 14408 8543\nf 14408 2646 14409\nf 8543 14409 1215\nf 2646 14408 14410\nf 14408 1214 14404\nf 14410 14404 2645\nf 2646 14410 8481\nf 14410 2645 14407\nf 8481 14407 2450\nf 4739 14411 14412\nf 14411 1215 14409\nf 14412 14409 2646\nf 1216 8538 14413\nf 8538 1215 14411\nf 14413 14411 4739\nf 2647 14414 8480\nf 14414 4739 14412\nf 8480 14412 2646\nf 2647 8482 8483\nf 8482 2450 8079\nf 8483 8079 1031\nf 1216 14415 14417\nf 14415 2648 14416\nf 14417 14416 1217\nf 2648 14415 14418\nf 14415 1216 14413\nf 14418 14413 4739\nf 2648 14419 8491\nf 14419 2647 14420\nf 8491 14420 2468\nf 1051 8494 13527\nf 8494 2649 8488\nf 13527 8488 3825\nf 2468 13529 8489\nf 13529 3825 14421\nf 8489 14421 2651\nf 2650 14422 14424\nf 14422 1218 14423\nf 14424 14423 2651\nf 2651 14425 8490\nf 14425 1217 14416\nf 8490 14416 2648\nf 1217 14425 8529\nf 14425 2651 14423\nf 8529 14423 1218\nf 1219 8497 14427\nf 8497 2652 14426\nf 14427 14426 2654\nf 2652 14428 14430\nf 14428 4740 14429\nf 14430 14429 2653\nf 2649 8493 14432\nf 8493 2654 14431\nf 14432 14431 2653\nf 1220 14433 14434\nf 14433 2653 14429\nf 14434 14429 4740\nf 2653 14433 14436\nf 14433 1220 14435\nf 14436 14435 2650\nf 1220 14437 14435\nf 14437 1218 14422\nf 14435 14422 2650\nf 1221 14438 14439\nf 14438 3827 8503\nf 14439 8503 2657\nf 2652 14440 14442\nf 14440 2655 14441\nf 14442 14441 2656\nf 2656 14443 14445\nf 14443 1223 14444\nf 14445 14444 4740\nf 3852 14446 14447\nf 14446 4740 14444\nf 14447 14444 1223\nf 2658 14448 14450\nf 14448 1224 14449\nf 14450 14449 4741\nf 1225 14451 14452\nf 14451 4741 14449\nf 14452 14449 1224\nf 1116 13951 14453\nf 13951 3826 8500\nf 14453 8500 2661\nf 2659 14454 14456\nf 14454 4741 14455\nf 14456 14455 2660\nf 2661 8502 14458\nf 8502 2659 14457\nf 14458 14457 3827\nf 4741 14459 14455\nf 14459 1222 14460\nf 14455 14460 2660\nf 1222 14461 14460\nf 14461 2656 14462\nf 14460 14462 2660\nf 1051 8076 14464\nf 8076 2467 14463\nf 14464 14463 3828\nf 2467 8506 14466\nf 8506 1050 14465\nf 14466 14465 2662\nf 3828 14467 14469\nf 14467 2662 14468\nf 14469 14468 2663\nf 1219 14470 14472\nf 14470 2663 14471\nf 14472 14471 3829\nf 3829 14473 14475\nf 14473 2664 14474\nf 14475 14474 2665\nf 4743 14476 14478\nf 14476 2664 14477\nf 14478 14477 4742\nf 1221 14479 14480\nf 14479 2665 8510\nf 14480 8510 2667\nf 1120 14481 14483\nf 14481 2666 14482\nf 14483 14482 4743\nf 2666 14481 14485\nf 14481 1120 14484\nf 14485 14484 4744\nf 4697 14486 14488\nf 14486 2570 14487\nf 14488 14487 4744\nf 2562 14489 14491\nf 14489 2578 14490\nf 14491 14490 3728\nf 2562 13966 14492\nf 13966 1032 13969\nf 14492 13969 4745\nf 1137 14493 14494\nf 14493 4703 14049\nf 14494 14049 4745\nf 2463 14495 8055\nf 14495 1137 14496\nf 8055 14496 1047\nf 1137 14497 14498\nf 14497 2462 13511\nf 14498 13511 1046\nf 2462 14497 14499\nf 14497 1137 14495\nf 14499 14495 2463\nf 2462 14499 14500\nf 14499 2463 13517\nf 14500 13517 665\nf 666 13514 14501\nf 13514 2462 14500\nf 14501 14500 665\nf 2169 14502 8043\nf 14502 2668 14503\nf 8043 14503 4746\nf 2668 14502 14504\nf 14502 2169 7948\nf 14504 7948 2367\nf 3830 14505 13488\nf 14505 2668 14504\nf 13488 14504 2367\nf 4747 14506 14508\nf 14506 1131 14507\nf 14508 14507 4746\nf 4747 14509 14506\nf 14509 1130 14510\nf 14506 14510 1131\nf 3832 14511 14513\nf 14511 2669 14512\nf 14513 14512 3831\nf 4748 14514 14515\nf 14514 1130 14509\nf 14515 14509 4747\nf 3833 14516 14518\nf 14516 2670 14517\nf 14518 14517 3832\nf 4749 14519 14521\nf 14519 1128 14520\nf 14521 14520 4748\nf 3834 14522 14524\nf 14522 2671 14523\nf 14524 14523 3833\nf 3835 14525 14527\nf 14525 2672 14526\nf 14527 14526 3834\nf 2672 14528 14530\nf 14528 1125 14529\nf 14530 14529 4749\nf 1182 14531 14533\nf 14531 4750 14532\nf 14533 14532 3835\nf 4751 14534 14536\nf 14534 1125 14535\nf 14536 14535 4750\nf 1185 14537 14220\nf 14537 3836 14538\nf 14220 14538 1182\nf 1187 14539 8393\nf 14539 4753 14540\nf 8393 14540 1185\nf 1189 14541 14543\nf 14541 3838 14542\nf 14543 14542 4753\nf 3839 14544 14546\nf 14544 1119 14545\nf 14546 14545 3837\nf 1191 14547 14549\nf 14547 3840 14548\nf 14549 14548 3838\nf 1193 14550 14552\nf 14550 3841 14551\nf 14552 14551 3840\nf 3842 14553 14555\nf 14553 1114 14554\nf 14555 14554 1117\nf 1195 14556 14558\nf 14556 3843 14557\nf 14558 14557 3841\nf 3844 14559 14561\nf 14559 1115 14560\nf 14561 14560 3842\nf 1197 14562 14564\nf 14562 3845 14563\nf 14564 14563 3843\nf 3846 14565 14567\nf 14565 1224 14566\nf 14567 14566 3844\nf 1199 14568 14570\nf 14568 3847 14569\nf 14570 14569 3845\nf 3848 14571 14573\nf 14571 1225 14572\nf 14573 14572 3846\nf 3847 14574 14576\nf 14574 1203 14575\nf 14576 14575 2680\nf 3849 14577 14578\nf 14577 1225 14571\nf 14578 14571 3848\nf 1203 14579 14575\nf 14579 2681 14580\nf 14575 14580 2680\nf 3849 14581 14583\nf 14581 1223 14582\nf 14583 14582 1222\nf 1205 14584 14585\nf 14584 3851 8518\nf 14585 8518 2681\nf 3852 14447 14587\nf 14447 1223 14586\nf 14587 14586 3850\nf 1207 14588 14590\nf 14588 2682 14589\nf 14590 14589 3851\nf 1209 14591 14592\nf 14591 3853 8521\nf 14592 8521 2682\nf 2684 14593 14595\nf 14593 3854 14594\nf 14595 14594 2683\nf 1211 14596 14597\nf 14596 3855 8524\nf 14597 8524 3853\nf 1212 14598 14599\nf 14598 3857 8527\nf 14599 8527 3855\nf 2686 14600 14602\nf 14600 3858 14601\nf 14602 14601 2685\nf 1213 14603 14604\nf 14603 3859 8533\nf 14604 8533 3857\nf 3860 14605 14606\nf 14605 1217 8531\nf 14606 8531 3858\nf 3861 8539 14608\nf 8539 1216 14607\nf 14608 14607 3860\nf 3859 8535 14610\nf 8535 2688 14609\nf 14610 14609 2687\nf 2689 8544 14611\nf 8544 1215 8540\nf 14611 8540 3861\nf 1054 8546 8542\nf 8546 2689 14612\nf 8542 14612 2688\nf 2690 8550 8547\nf 8550 1052 8549\nf 8547 8549 2689\nf 1038 14613 14614\nf 14613 2172 8032\nf 14614 8032 4754\nf 2172 14613 14615\nf 14613 1038 8578\nf 14615 8578 3898\nf 2691 14616 14617\nf 14616 1038 14614\nf 14617 14614 4754\nf 3863 14618 14620\nf 14618 2691 14619\nf 14620 14619 3862\nf 4756 14621 14623\nf 14621 1227 14622\nf 14623 14622 4755\nf 3865 14624 14626\nf 14624 2692 14625\nf 14626 14625 3864\nf 4757 14627 14629\nf 14627 1229 14628\nf 14629 14628 4756\nf 3866 14630 14632\nf 14630 2693 14631\nf 14632 14631 3865\nf 4758 14633 14635\nf 14633 1231 14634\nf 14635 14634 4757\nf 3867 14636 14638\nf 14636 2694 14637\nf 14638 14637 3866\nf 4759 14639 14641\nf 14639 1233 14640\nf 14641 14640 4758\nf 3868 14642 14644\nf 14642 2695 14643\nf 14644 14643 3867\nf 4760 14645 14647\nf 14645 1235 14646\nf 14647 14646 4759\nf 3869 14648 14650\nf 14648 2696 14649\nf 14650 14649 3868\nf 4761 14651 14653\nf 14651 1237 14652\nf 14653 14652 4760\nf 3870 14654 14656\nf 14654 2697 14655\nf 14656 14655 3869\nf 4762 14657 14659\nf 14657 1239 14658\nf 14659 14658 4761\nf 3871 14660 14662\nf 14660 2698 14661\nf 14662 14661 3870\nf 4763 14663 14665\nf 14663 3908 14664\nf 14665 14664 4762\nf 3872 14666 14668\nf 14666 2699 14667\nf 14668 14667 3871\nf 4764 14669 14671\nf 14669 3909 14670\nf 14671 14670 4763\nf 3873 14672 14674\nf 14672 2700 14673\nf 14674 14673 3872\nf 4765 14675 14677\nf 14675 3910 14676\nf 14677 14676 4764\nf 3874 14678 14680\nf 14678 2701 14679\nf 14680 14679 3873\nf 4766 14681 14683\nf 14681 3911 14682\nf 14683 14682 4765\nf 3875 14684 14686\nf 14684 2702 14685\nf 14686 14685 3874\nf 4767 14687 14689\nf 14687 1245 14688\nf 14689 14688 5810\nf 5811 14690 8557\nf 14690 2704 14691\nf 8557 14691 2703\nf 4768 8560 14693\nf 8560 2704 14692\nf 14693 14692 2705\nf 2704 8559 14695\nf 8559 1247 14694\nf 14695 14694 4767\nf 2704 14690 14697\nf 14690 5811 14696\nf 14697 14696 3876\nf 1249 14698 14700\nf 14698 4768 14699\nf 14700 14699 2706\nf 2705 14701 14703\nf 14701 1248 14702\nf 14703 14702 3877\nf 1030 14704 14705\nf 14704 3877 14702\nf 14705 14702 1248\nf 2707 14706 8563\nf 14706 3878 14707\nf 8563 14707 2706\nf 2707 14708 14710\nf 14708 1029 14709\nf 14710 14709 2708\nf 1030 14711 14704\nf 14711 2707 8562\nf 14704 8562 3877\nf 2708 14712 14713\nf 14712 702 8143\nf 14713 8143 2482\nf 702 14712 13580\nf 14712 2708 14709\nf 13580 14709 1029\nf 2391 13132 14715\nf 13132 2173 14714\nf 14715 14714 1037\nf 1037 14714 14717\nf 14714 2173 14716\nf 14717 14716 4769\nf 4769 14718 14719\nf 14718 2174 12027\nf 14719 12027 2453\nf 4769 14719 14720\nf 14719 2453 13470\nf 14720 13470 3880\nf 4770 14721 14722\nf 14721 1037 14717\nf 14722 14717 4769\nf 3881 14723 14725\nf 14723 2709 14724\nf 14725 14724 3880\nf 4771 14726 14728\nf 14726 1226 14727\nf 14728 14727 4770\nf 3883 14729 14731\nf 14729 2710 14730\nf 14731 14730 3882\nf 4772 14732 14734\nf 14732 1228 14733\nf 14734 14733 4771\nf 3884 14735 14737\nf 14735 2711 14736\nf 14737 14736 3883\nf 4773 14738 14740\nf 14738 1230 14739\nf 14740 14739 4772\nf 3885 14741 14743\nf 14741 2712 14742\nf 14743 14742 3884\nf 4774 14744 14746\nf 14744 1232 14745\nf 14746 14745 4773\nf 3886 14747 14749\nf 14747 2713 14748\nf 14749 14748 3885\nf 4775 14750 14752\nf 14750 1234 14751\nf 14752 14751 4774\nf 3887 14753 14755\nf 14753 2714 14754\nf 14755 14754 3886\nf 4776 14756 14758\nf 14756 1236 14757\nf 14758 14757 4775\nf 3888 14759 14761\nf 14759 2715 14760\nf 14761 14760 3887\nf 4777 14762 14764\nf 14762 1238 14763\nf 14764 14763 4776\nf 3889 14765 14767\nf 14765 2716 14766\nf 14767 14766 3888\nf 4778 14768 14770\nf 14768 1240 14769\nf 14770 14769 4777\nf 3890 14771 14773\nf 14771 2717 14772\nf 14773 14772 3889\nf 4779 14774 14776\nf 14774 1241 14775\nf 14776 14775 4778\nf 3891 14777 14779\nf 14777 2718 14778\nf 14779 14778 3890\nf 4780 14780 14782\nf 14780 1242 14781\nf 14782 14781 4779\nf 3892 14783 14785\nf 14783 5844 14784\nf 14785 14784 5325\nf 4781 14786 14788\nf 14786 1243 14787\nf 14788 14787 4780\nf 1110 14789 14791\nf 14789 2720 14790\nf 14791 14790 3892\nf 4782 14792 14794\nf 14792 1244 14793\nf 14794 14793 4781\nf 1111 14795 14797\nf 14795 3894 14796\nf 14797 14796 3893\nf 1246 14798 14800\nf 14798 1244 14799\nf 14800 14799 5956\nf 2721 14801 14803\nf 14801 4783 14802\nf 14803 14802 5956\nf 1112 14804 14805\nf 14804 3895 8574\nf 14805 8574 3894\nf 4784 14806 14808\nf 14806 5811 14807\nf 14808 14807 4783\nf 2722 14809 14810\nf 14809 4784 14808\nf 14810 14808 4783\nf 3896 14811 14813\nf 14811 2722 14812\nf 14813 14812 3895\nf 1248 14814 14705\nf 14814 3897 13460\nf 14705 13460 1030\nf 2723 14815 14817\nf 14815 1067 14816\nf 14817 14816 2724\nf 1067 14815 13590\nf 14815 2723 14818\nf 13590 14818 3896\nf 4647 13461 14820\nf 13461 3897 14819\nf 14820 14819 2724\nf 2724 14816 13572\nf 14816 1067 14821\nf 13572 14821 704\nf 704 14821 14822\nf 14821 1067 13585\nf 14822 13585 705\nf 2425 8033 7994\nf 8033 4785 14823\nf 7994 14823 819\nf 4786 14824 14826\nf 14824 1039 14825\nf 14826 14825 4785\nf 3900 14827 14829\nf 14827 2725 14828\nf 14829 14828 3899\nf 4787 14830 14832\nf 14830 1139 14831\nf 14832 14831 4786\nf 3901 14833 14835\nf 14833 2726 14834\nf 14835 14834 3900\nf 4788 14836 14838\nf 14836 1140 14837\nf 14838 14837 4787\nf 3902 14839 14841\nf 14839 2727 14840\nf 14841 14840 3901\nf 4789 14842 14844\nf 14842 1142 14843\nf 14844 14843 4788\nf 3903 14845 14847\nf 14845 2728 14846\nf 14847 14846 3902\nf 4790 14848 14850\nf 14848 1144 14849\nf 14850 14849 4789\nf 3904 14851 14853\nf 14851 2729 14852\nf 14853 14852 3903\nf 4791 14854 14856\nf 14854 1146 14855\nf 14856 14855 4790\nf 3905 14857 14859\nf 14857 2730 14858\nf 14859 14858 3904\nf 4792 14860 14862\nf 14860 1148 14861\nf 14862 14861 4791\nf 3906 14863 14865\nf 14863 2731 14864\nf 14865 14864 3905\nf 4793 14866 14868\nf 14866 1150 14867\nf 14868 14867 4792\nf 3907 14869 14871\nf 14869 2732 14870\nf 14871 14870 3906\nf 4794 14872 14874\nf 14872 1152 14873\nf 14874 14873 4793\nf 3908 14875 14877\nf 14875 2733 14876\nf 14877 14876 3907\nf 4795 14878 14880\nf 14878 1154 14879\nf 14880 14879 4794\nf 3909 14881 14883\nf 14881 2734 14882\nf 14883 14882 3908\nf 4796 14884 14886\nf 14884 1156 14885\nf 14886 14885 4795\nf 3910 14887 14889\nf 14887 2735 14888\nf 14889 14888 3909\nf 4797 14890 14892\nf 14890 1158 14891\nf 14892 14891 4796\nf 3911 14893 14895\nf 14893 2736 14894\nf 14895 14894 3910\nf 4798 14896 14898\nf 14896 1160 14897\nf 14898 14897 4797\nf 2739 8582 14900\nf 8582 1162 14899\nf 14900 14899 4798\nf 2738 14901 14903\nf 14901 1245 14902\nf 14903 14902 3912\nf 1247 14904 14905\nf 14904 3912 14902\nf 14905 14902 1245\nf 4768 14906 8558\nf 14906 4799 14907\nf 8558 14907 1247\nf 2740 8592 14909\nf 8592 3913 14908\nf 14909 14908 3914\nf 1249 14910 14912\nf 14910 3915 14911\nf 14912 14911 3913\nf 3915 14913 14911\nf 14913 3916 14914\nf 14911 14914 3913\nf 1066 14915 14917\nf 14915 3917 14916\nf 14917 14916 3915\nf 1065 8137 13571\nf 8137 1064 8603\nf 13571 8603 3917\nf 1170 14918 8606\nf 14918 2741 14919\nf 8606 14919 3919\nf 1169 14920 8599\nf 14920 2741 14918\nf 8599 14918 1170\nf 2741 14921 14922\nf 14921 1064 13565\nf 14922 13565 2481\nf 1064 14921 8604\nf 14921 2741 14923\nf 8604 14923 3918\nf 697 14924 13564\nf 14924 696 13566\nf 13564 13566 2481\n\nusemtl material_0\nf 2742 9577 14925\nf 9577 1487 8655\nf 14925 8655 1266\nf 2742 14925 6031\nf 14925 1266 8658\nf 6031 8658 1267\nf 80 6553 14926\nf 6553 2744 9875\nf 14926 9875 1544\nf 2745 8844 6088\nf 8844 1285 14927\nf 6088 14927 1284\nf 1291 6106 8736\nf 6106 2746 8804\nf 8736 8804 1292\nf 2745 6276 8842\nf 6276 2747 8847\nf 8842 8847 96\nf 1279 14928 8920\nf 14928 2748 8922\nf 8920 8922 1356\nf 1356 8921 14929\nf 8921 2749 8929\nf 14929 8929 1357\nf 1357 8928 14930\nf 8928 2750 8935\nf 14930 8935 1358\nf 1358 8934 14931\nf 8934 2751 8942\nf 14931 8942 1359\nf 1359 8941 14933\nf 8941 2752 14932\nf 14933 14932 1360\nf 1360 14934 8945\nf 14934 5921 8949\nf 8945 8949 3942\nf 1361 14935 14936\nf 14935 2754 8962\nf 14936 8962 1362\nf 1363 14937 14939\nf 14937 4950 14938\nf 14939 14938 1362\nf 2755 8956 14940\nf 8956 1362 14938\nf 14940 14938 4950\nf 2757 14941 6366\nf 14941 1378 14942\nf 6366 14942 2758\nf 1378 14941 14943\nf 14941 2757 9628\nf 14943 9628 2756\nf 2759 14944 14946\nf 14944 1378 14945\nf 14946 14945 1380\nf 1382 9025 14947\nf 9025 2759 14946\nf 14947 14946 1380\nf 1251 14948 9019\nf 14948 3925 14949\nf 9019 14949 1379\nf 1384 9042 14950\nf 9042 2760 9026\nf 14950 9026 1382\nf 1383 9048 14951\nf 9048 3923 9035\nf 14951 9035 1381\nf 1383 9047 14953\nf 9047 3922 14952\nf 14953 14952 1385\nf 1386 9056 14954\nf 9056 2761 9043\nf 14954 9043 1384\nf 1385 14955 14957\nf 14955 2763 14956\nf 14957 14956 1250\nf 1389 9069 14958\nf 9069 2764 9057\nf 14958 9057 1386\nf 1388 9072 14960\nf 9072 2765 14959\nf 14960 14959 3962\nf 1388 14961 14963\nf 14961 3920 14962\nf 14963 14962 1250\nf 1250 9076 14963\nf 9076 2766 14964\nf 14963 14964 1388\nf 3961 14965 14966\nf 14965 1388 14964\nf 14966 14964 2766\nf 1390 9081 14967\nf 9081 2767 9070\nf 14967 9070 1389\nf 1387 14968 14969\nf 14968 2768 9091\nf 14969 9091 1392\nf 1272 10129 14971\nf 10129 3965 14970\nf 14971 14970 1392\nf 2769 6381 9108\nf 6381 1394 9106\nf 9108 9106 56\nf 1396 14972 6388\nf 14972 2770 6390\nf 6388 6390 1397\nf 2770 14972 14973\nf 14972 1396 9119\nf 14973 9119 194\nf 2771 9131 14974\nf 9131 1399 9129\nf 14974 9129 1400\nf 2771 14974 6396\nf 14974 1400 14975\nf 6396 14975 1401\nf 2772 6401 14977\nf 6401 1402 14976\nf 14977 14976 1403\nf 2772 14977 6404\nf 14977 1403 14978\nf 6404 14978 2773\nf 1404 14979 14980\nf 14979 2773 14978\nf 14980 14978 1403\nf 1407 6065 14982\nf 6065 2774 14981\nf 14982 14981 1408\nf 1408 14981 14983\nf 14981 2774 9154\nf 14983 9154 1409\nf 1409 9153 14984\nf 9153 2775 9160\nf 14984 9160 1410\nf 1410 9159 14985\nf 9159 2776 9166\nf 14985 9166 1411\nf 1411 9165 14986\nf 9165 2777 9172\nf 14986 9172 1412\nf 1412 9171 14987\nf 9171 2778 9181\nf 14987 9181 1413\nf 1414 14988 14990\nf 14988 2779 14989\nf 14990 14989 1413\nf 1414 14991 9188\nf 14991 3979 14992\nf 9188 14992 1415\nf 2780 9190 14993\nf 9190 1415 14992\nf 14993 14992 3979\nf 1416 9194 14995\nf 9194 2782 14994\nf 14995 14994 2781\nf 1417 9200 14996\nf 9200 2783 9195\nf 14996 9195 1416\nf 1418 9206 14997\nf 9206 2784 9201\nf 14997 9201 1417\nf 1419 9212 14998\nf 9212 2785 9207\nf 14998 9207 1418\nf 1420 9218 14999\nf 9218 2786 9213\nf 14999 9213 1419\nf 1421 9224 15000\nf 9224 2787 9219\nf 15000 9219 1420\nf 1422 9230 15001\nf 9230 2788 9225\nf 15001 9225 1421\nf 1423 9236 15002\nf 9236 235 9231\nf 15002 9231 1422\nf 2789 15003 15004\nf 15003 237 9237\nf 15004 9237 1423\nf 2790 6418 6420\nf 6418 1424 15005\nf 6420 15005 1425\nf 1429 15006 9266\nf 15006 2791 9264\nf 9266 9264 1428\nf 1600 10123 15007\nf 10123 1274 9277\nf 15007 9277 1431\nf 1431 9276 15008\nf 9276 2792 9283\nf 15008 9283 1432\nf 1432 9282 15009\nf 9282 2793 9289\nf 15009 9289 1433\nf 1433 9288 15010\nf 9288 2794 9295\nf 15010 9295 1434\nf 1434 9294 15011\nf 9294 2795 9301\nf 15011 9301 1435\nf 1435 9300 9308\nf 9300 3998 9310\nf 9308 9310 1436\nf 2797 6433 15013\nf 6433 2796 15012\nf 15013 15012 1437\nf 1438 9320 15014\nf 9320 2797 15013\nf 15014 15013 1437\nf 1439 9323 15015\nf 9323 2798 9321\nf 15015 9321 1438\nf 1440 9329 15016\nf 9329 2799 9324\nf 15016 9324 1439\nf 1441 9335 15017\nf 9335 2800 9330\nf 15017 9330 1440\nf 1442 9338 15018\nf 9338 2801 9336\nf 15018 9336 1441\nf 1443 9344 15019\nf 9344 2802 9339\nf 15019 9339 1442\nf 1444 9350 15020\nf 9350 2803 9345\nf 15020 9345 1443\nf 1445 9356 15021\nf 9356 2804 9351\nf 15021 9351 1444\nf 1446 9362 15022\nf 9362 2805 9357\nf 15022 9357 1445\nf 1447 9368 15023\nf 9368 2806 9363\nf 15023 9363 1446\nf 1448 9371 15024\nf 9371 272 9369\nf 15024 9369 1447\nf 1449 15025 15026\nf 15025 274 9372\nf 15026 9372 1448\nf 2807 15027 6442\nf 15027 1452 15028\nf 6442 15028 2808\nf 1452 15027 9399\nf 15027 2807 6440\nf 9399 6440 1451\nf 1455 6455 9419\nf 6455 2809 6456\nf 9419 6456 1456\nf 1275 15029 15030\nf 15029 2743 9425\nf 15030 9425 1457\nf 1457 9424 15031\nf 9424 2810 9431\nf 15031 9431 1458\nf 1458 9430 15032\nf 9430 2811 9437\nf 15032 9437 1459\nf 1459 9436 15033\nf 9436 2812 9443\nf 15033 9443 1460\nf 1460 9442 15034\nf 9442 2813 9449\nf 15034 9449 1461\nf 4016 15035 9452\nf 15035 1461 15036\nf 9452 15036 220\nf 2814 15037 6460\nf 15037 1463 15038\nf 6460 15038 2815\nf 1464 9463 15039\nf 9463 2815 15038\nf 15039 15038 1463\nf 1465 9469 15040\nf 9469 2816 9464\nf 15040 9464 1464\nf 1466 9475 15041\nf 9475 2817 9470\nf 15041 9470 1465\nf 1467 9481 15042\nf 9481 2818 9476\nf 15042 9476 1466\nf 1468 9487 15043\nf 9487 2819 9482\nf 15043 9482 1467\nf 1469 9493 15044\nf 9493 2820 9488\nf 15044 9488 1468\nf 1470 9499 15045\nf 9499 2821 9494\nf 15045 9494 1469\nf 1471 9505 15046\nf 9505 2822 9500\nf 15046 9500 1470\nf 1472 9511 15047\nf 9511 2823 9506\nf 15047 9506 1471\nf 1473 9517 15048\nf 9517 2824 9512\nf 15048 9512 1472\nf 1474 9523 15049\nf 9523 2825 9518\nf 15049 9518 1473\nf 1475 9529 15050\nf 9529 240 9524\nf 15050 9524 1474\nf 1476 9535 15051\nf 9535 2826 9530\nf 15051 9530 1475\nf 2827 9536 6463\nf 9536 1476 15052\nf 6463 15052 1477\nf 1485 15053 15054\nf 15053 2829 9568\nf 15054 9568 1484\nf 1489 15055 15057\nf 15055 4035 15056\nf 15057 15056 2836\nf 1493 9602 9605\nf 9602 2828 9563\nf 9605 9563 1483\nf 1494 15058 15059\nf 15058 2831 9587\nf 15059 9587 1484\nf 1494 9608 15061\nf 9608 2832 15060\nf 15061 15060 1490\nf 1495 15062 15063\nf 15062 2833 9578\nf 15063 9578 1488\nf 2833 15062 6497\nf 15062 1495 9619\nf 6497 9619 2834\nf 4039 9622 9618\nf 9622 2835 9620\nf 9618 9620 1495\nf 2757 15064 9629\nf 15064 2835 9624\nf 9629 9624 1496\nf 1273 9640 15065\nf 9640 2837 9647\nf 15065 9647 1497\nf 1497 9646 15066\nf 9646 2838 9653\nf 15066 9653 1498\nf 2841 6499 15068\nf 6499 2840 15067\nf 15068 15067 1502\nf 1502 9685 15068\nf 9685 2842 15069\nf 15068 15069 2841\nf 2843 15070 15071\nf 15070 2842 9687\nf 15071 9687 1503\nf 1505 9697 15072\nf 9697 2844 9695\nf 15072 9695 1504\nf 2845 15073 15074\nf 15073 264 9698\nf 15074 9698 1505\nf 1507 9709 15075\nf 9709 2846 9707\nf 15075 9707 1506\nf 2847 15076 15077\nf 15076 270 9710\nf 15077 9710 1507\nf 1509 9721 15078\nf 9721 2848 9719\nf 15078 9719 1508\nf 1510 9727 15079\nf 9727 273 9722\nf 15079 9722 1509\nf 1511 9733 15080\nf 9733 275 9728\nf 15080 9728 1510\nf 2849 9734 6502\nf 9734 1511 15081\nf 6502 15081 1512\nf 1520 8690 15082\nf 8690 2850 9762\nf 15082 9762 1521\nf 1521 9761 15083\nf 9761 2851 9768\nf 15083 9768 1522\nf 1522 9767 15084\nf 9767 2852 9774\nf 15084 9774 1523\nf 1523 9773 15085\nf 9773 2853 9780\nf 15085 9780 1524\nf 1524 9779 15086\nf 9779 2854 9786\nf 15086 9786 1525\nf 1525 9785 15087\nf 9785 2855 9792\nf 15087 9792 1526\nf 1526 9791 15088\nf 9791 2856 9801\nf 15088 9801 1527\nf 4063 15089 6531\nf 15089 310 9808\nf 6531 9808 1529\nf 1530 15090 15091\nf 15090 2857 9806\nf 15091 9806 1529\nf 2857 15090 6534\nf 15090 1530 15092\nf 6534 15092 2858\nf 1531 15093 15094\nf 15093 2858 15092\nf 15094 15092 1530\nf 1532 9821 15096\nf 9821 2859 15095\nf 15096 15095 1531\nf 1533 9827 15097\nf 9827 2860 9822\nf 15097 9822 1532\nf 1534 9833 15098\nf 9833 2861 9828\nf 15098 9828 1533\nf 1535 15099 15101\nf 15099 318 15100\nf 15101 15100 1534\nf 4956 15102 15103\nf 15102 2862 9840\nf 15103 9840 1535\nf 2863 15104 15106\nf 15104 1537 15105\nf 15106 15105 322\nf 1537 15104 15107\nf 15104 2863 9846\nf 15107 9846 1536\nf 4076 15108 9877\nf 15108 2864 9884\nf 9877 9884 1545\nf 1545 9883 15109\nf 9883 2865 9890\nf 15109 9890 1546\nf 1546 9889 15110\nf 9889 2866 9896\nf 15110 9896 1547\nf 1547 9895 15111\nf 9895 2867 9902\nf 15111 9902 1548\nf 1548 9901 15112\nf 9901 2868 9908\nf 15112 9908 1549\nf 1549 9907 15113\nf 9907 2869 9917\nf 15113 9917 1550\nf 1550 9916 15114\nf 9916 2870 9922\nf 15114 9922 1551\nf 4084 15115 6556\nf 15115 1552 15116\nf 6556 15116 2871\nf 1552 15115 15118\nf 15115 4084 15117\nf 15118 15117 1551\nf 4085 15119 6559\nf 15119 311 9928\nf 6559 9928 1553\nf 1555 15120 15122\nf 15120 2873 15121\nf 15122 15121 1554\nf 1556 9940 15124\nf 9940 2874 15123\nf 15124 15123 1555\nf 1557 15125 15126\nf 15125 2875 9941\nf 15126 9941 1556\nf 2876 15127 8995\nf 15127 1558 15128\nf 8995 15128 2877\nf 5845 15129 15130\nf 15129 2876 9944\nf 15130 9944 1557\nf 2877 15131 9002\nf 15131 1559 15132\nf 9002 15132 190\nf 1559 15131 15133\nf 15131 2877 15128\nf 15133 15128 1558\nf 1561 15134 9960\nf 15134 2878 6568\nf 9960 6568 1257\nf 4091 15135 15136\nf 15135 2879 9968\nf 15136 9968 1564\nf 2879 15135 6575\nf 15135 4091 10105\nf 6575 10105 1277\nf 1564 9967 15137\nf 9967 2880 9974\nf 15137 9974 1565\nf 1565 9973 15138\nf 9973 2881 9980\nf 15138 9980 1566\nf 1566 9979 15139\nf 9979 2882 9986\nf 15139 9986 1567\nf 1567 9985 15140\nf 9985 2883 9992\nf 15140 9992 1568\nf 1568 9991 15141\nf 9991 2884 10001\nf 15141 10001 1569\nf 2885 9995 15143\nf 9995 1569 15142\nf 15143 15142 1570\nf 2886 15144 6580\nf 15144 221 10013\nf 6580 10013 1573\nf 2887 10011 6583\nf 10011 1573 15145\nf 6583 15145 1574\nf 314 6584 15147\nf 6584 1574 15146\nf 15147 15146 1575\nf 1576 10024 15148\nf 10024 2888 10019\nf 15148 10019 1575\nf 1578 10033 15150\nf 10033 2889 15149\nf 15150 15149 1577\nf 4957 10039 10038\nf 10039 2890 10034\nf 10038 10034 1578\nf 1580 10045 10042\nf 10045 2892 15151\nf 10042 15151 1579\nf 1581 15152 15153\nf 15152 2893 10046\nf 15153 10046 1580\nf 1582 10057 15155\nf 10057 2894 15154\nf 15155 15154 1581\nf 2895 10058 6586\nf 10058 1582 15156\nf 6586 15156 1583\nf 2896 10808 15158\nf 10808 329 15157\nf 15158 15157 476\nf 2897 10494 11419\nf 10494 332 15159\nf 11419 15159 539\nf 2898 6818 10229\nf 6818 349 10089\nf 10229 10089 82\nf 1594 10094 15160\nf 10094 1593 6618\nf 15160 6618 2899\nf 4166 15161 6635\nf 15161 1599 10116\nf 6635 10116 2900\nf 1609 10157 6668\nf 10157 1611 10153\nf 6668 10153 1610\nf 382 7150 6702\nf 7150 387 15162\nf 6702 15162 2903\nf 2902 6710 7115\nf 6710 2903 15162\nf 7115 15162 387\nf 2904 10238 15163\nf 10238 1640 10219\nf 15163 10219 1639\nf 1643 15164 10228\nf 15164 2905 10889\nf 10228 10889 1644\nf 2898 10085 6819\nf 10085 1645 15165\nf 6819 15165 4157\nf 1646 15166 10233\nf 15166 4157 15165\nf 10233 15165 1645\nf 1647 15167 15168\nf 15167 2906 10235\nf 15168 10235 1649\nf 456 10259 10271\nf 10259 1647 6831\nf 10271 6831 1655\nf 4112 15169 15170\nf 15169 2907 10519\nf 15170 10519 4110\nf 2909 6849 15171\nf 6849 1660 10272\nf 15171 10272 1661\nf 2910 10512 15173\nf 10512 459 15172\nf 15173 15172 464\nf 463 6860 10290\nf 6860 1666 15174\nf 10290 15174 1661\nf 1668 10296 15176\nf 10296 2911 15175\nf 15176 15175 1662\nf 2912 10506 10323\nf 10506 465 15177\nf 10323 15177 469\nf 1672 15178 15180\nf 15178 2913 15179\nf 15180 15179 5327\nf 462 6872 15181\nf 6872 5327 15179\nf 15181 15179 2913\nf 1673 15182 15183\nf 15182 2916 10294\nf 15183 10294 1668\nf 2916 15182 6877\nf 15182 1673 15184\nf 6877 15184 2915\nf 2917 10321 10333\nf 10321 469 15185\nf 10333 15185 470\nf 459 10299 15172\nf 10299 2918 10318\nf 15172 10318 464\nf 2919 10500 10327\nf 10500 331 15186\nf 10327 15186 330\nf 2920 10330 10326\nf 10330 469 15177\nf 10326 15177 465\nf 538 11425 15187\nf 11425 2921 10328\nf 15187 10328 330\nf 1675 15188 10340\nf 15188 2922 11434\nf 10340 11434 1678\nf 1673 10343 15189\nf 10343 2923 11440\nf 15189 11440 1679\nf 1672 15190 15191\nf 15190 2924 11446\nf 15191 11446 1680\nf 2924 15190 15193\nf 15190 1672 15192\nf 15193 15192 5520\nf 2925 10715 11399\nf 10715 475 15194\nf 11399 15194 328\nf 2926 15195 10363\nf 15195 477 15196\nf 10363 15196 478\nf 2928 10542 10369\nf 10542 479 15197\nf 10369 15197 480\nf 2929 10703 10366\nf 10703 478 15196\nf 10366 15196 477\nf 2930 10697 10372\nf 10697 480 15197\nf 10372 15197 479\nf 2931 10554 10378\nf 10554 483 15198\nf 10378 15198 484\nf 2932 10694 10375\nf 10694 482 10548\nf 10375 10548 481\nf 2933 10560 10384\nf 10560 485 15199\nf 10384 15199 486\nf 2934 10688 10381\nf 10688 484 15198\nf 10381 15198 483\nf 2970 15200 10566\nf 15200 487 10390\nf 10566 10390 2935\nf 2936 10682 10387\nf 10682 486 15199\nf 10387 15199 485\nf 1697 10572 10394\nf 10572 4958 10576\nf 10394 10576 4132\nf 1705 10423 10653\nf 10423 1704 6890\nf 10653 6890 428\nf 3145 15201 11407\nf 15201 1708 15202\nf 11407 15202 494\nf 2938 10492 10441\nf 10492 497 15203\nf 10441 15203 498\nf 2939 10545 10438\nf 10545 496 15204\nf 10438 15204 495\nf 2940 10497 10447\nf 10497 499 15205\nf 10447 15205 500\nf 2941 10551 10444\nf 10551 498 15203\nf 10444 15203 497\nf 2942 10503 10453\nf 10503 501 15206\nf 10453 15206 502\nf 2943 10557 10450\nf 10557 500 15205\nf 10450 15205 499\nf 2944 10509 10459\nf 10509 503 15207\nf 10459 15207 504\nf 2945 10563 10456\nf 10563 502 15206\nf 10456 15206 501\nf 505 15208 15210\nf 15208 2946 15209\nf 15210 15209 4127\nf 2947 10569 10462\nf 10569 504 15207\nf 10462 15207 503\nf 1724 6905 10477\nf 6905 4130 10525\nf 10477 10525 1723\nf 2948 10436 11413\nf 10436 495 15211\nf 11413 15211 531\nf 2949 10073 10499\nf 10073 331 15212\nf 10499 15212 499\nf 2950 10442 10496\nf 10442 497 15213\nf 10496 15213 332\nf 2951 10324 10505\nf 10324 465 15214\nf 10505 15214 501\nf 2952 10448 10502\nf 10448 499 15212\nf 10502 15212 331\nf 2953 10297 10511\nf 10297 459 15215\nf 10511 15215 503\nf 2954 10454 10508\nf 10454 501 15214\nf 10508 15214 465\nf 4113 15216 6921\nf 15216 5837 15217\nf 6921 15217 2955\nf 2955 15218 6919\nf 15218 4127 15219\nf 6919 15219 2956\nf 4113 6920 15221\nf 6920 2956 15220\nf 15221 15220 5522\nf 2957 10460 15222\nf 10460 503 15215\nf 15222 15215 459\nf 2958 10709 11402\nf 10709 476 15157\nf 11402 15157 329\nf 2959 10434 10544\nf 10434 496 15223\nf 10544 15223 479\nf 2960 10439 10550\nf 10439 498 15224\nf 10550 15224 481\nf 2961 10370 10547\nf 10370 479 15223\nf 10547 15223 496\nf 2962 10445 10556\nf 10445 500 15225\nf 10556 15225 483\nf 2963 10373 10553\nf 10373 481 15224\nf 10553 15224 498\nf 2964 10451 10562\nf 10451 502 15226\nf 10562 15226 485\nf 2965 10379 10559\nf 10379 483 15225\nf 10559 15225 500\nf 2966 10457 10568\nf 10457 504 15227\nf 10568 15227 2970\nf 2967 10385 10565\nf 10385 485 15226\nf 10565 15226 502\nf 2968 15228 10578\nf 15228 505 10575\nf 10578 10575 4132\nf 2969 6942 10571\nf 6942 2970 15227\nf 10571 15227 504\nf 1737 6948 10588\nf 6948 4128 10471\nf 10588 10471 1726\nf 512 6972 11346\nf 6972 2971 15229\nf 11346 15229 1747\nf 2972 10673 10609\nf 10673 511 10606\nf 10609 10606 419\nf 513 6974 15231\nf 6974 2973 15230\nf 15231 15230 1750\nf 2974 11356 10621\nf 11356 516 15232\nf 10621 15232 517\nf 515 10615 10685\nf 10615 514 10618\nf 10685 10618 2975\nf 2976 11362 10627\nf 11362 518 15233\nf 10627 15233 519\nf 2977 10691 10624\nf 10691 517 15232\nf 10624 15232 516\nf 2978 11365 10630\nf 11365 520 15234\nf 10630 15234 521\nf 2979 11371 10636\nf 11371 522 15235\nf 10636 15235 523\nf 2980 10700 10633\nf 10700 521 15234\nf 10633 15234 520\nf 2981 11377 10642\nf 11377 524 15236\nf 10642 15236 525\nf 2982 10706 10639\nf 10706 523 15235\nf 10639 15235 522\nf 617 15237 11383\nf 15237 475 10714\nf 11383 10714 2983\nf 2984 10711 10645\nf 10711 525 15236\nf 10645 15236 524\nf 1700 10417 15238\nf 10417 2985 10655\nf 15238 10655 1765\nf 1695 10402 10396\nf 10402 2986 10666\nf 10396 10666 1697\nf 2971 10610 15240\nf 10610 2987 15239\nf 15240 15239 1748\nf 2988 10391 10675\nf 10391 488 10671\nf 10675 10671 511\nf 515 15241 10613\nf 15241 2989 6988\nf 10613 6988 2990\nf 2989 15241 10684\nf 15241 515 15242\nf 10684 15242 486\nf 2991 10388 6985\nf 10388 487 10678\nf 6985 10678 2987\nf 2992 10619 10690\nf 10619 517 15243\nf 10690 15243 484\nf 2993 10382 10687\nf 10382 486 15242\nf 10687 15242 515\nf 2994 10625 10696\nf 10625 519 15244\nf 10696 15244 482\nf 2995 10376 10693\nf 10376 484 15243\nf 10693 15243 517\nf 2996 10628 10699\nf 10628 521 15245\nf 10699 15245 480\nf 2997 10634 10705\nf 10634 523 15246\nf 10705 15246 478\nf 2998 10367 10702\nf 10367 480 15245\nf 10702 15245 521\nf 2999 10640 10710\nf 10640 525 15247\nf 10710 15247 476\nf 3000 10361 10708\nf 10361 478 15246\nf 10708 15246 523\nf 3001 15248 10713\nf 15248 476 15247\nf 10713 15247 525\nf 1769 6997 15250\nf 6997 3003 15249\nf 15250 15249 3004\nf 526 6998 10737\nf 6998 528 15251\nf 10737 15251 363\nf 3005 10832 11412\nf 10832 531 15211\nf 11412 15211 495\nf 3006 10806 10838\nf 10806 534 10840\nf 10838 10840 545\nf 3007 10835 10730\nf 10835 533 15252\nf 10730 15252 532\nf 3008 15253 15254\nf 15253 4959 10811\nf 15254 10811 4960\nf 538 15187 11098\nf 15187 330 11424\nf 11098 11424 3009\nf 3010 10830 10763\nf 10830 541 15255\nf 10763 15255 542\nf 3011 11091 10760\nf 11091 540 15256\nf 10760 15256 539\nf 3012 15257 10769\nf 15257 543 15258\nf 10769 15258 544\nf 3013 11085 10766\nf 11085 542 15255\nf 10766 15255 541\nf 3014 10839 10772\nf 10839 545 15259\nf 10772 15259 546\nf 1786 11079 15260\nf 11079 544 15258\nf 15260 15258 543\nf 3016 11076 10775\nf 11076 546 15259\nf 10775 15259 545\nf 556 10793 11088\nf 10793 557 10792\nf 11088 10792 3017\nf 3018 11082 15261\nf 11082 558 11136\nf 15261 11136 559\nf 560 15262 10802\nf 15262 561 15263\nf 10802 15263 1798\nf 1846 15264 15266\nf 15264 1797 15265\nf 15266 15265 1798\nf 4195 15267 11137\nf 15267 561 15262\nf 11137 15262 560\nf 477 11405 10364\nf 11405 532 11408\nf 10364 11408 494\nf 3022 15268 10810\nf 15268 534 15269\nf 10810 15269 329\nf 1771 11396 10813\nf 11396 1777 15270\nf 10813 15270 4136\nf 3024 15271 7017\nf 15271 1800 15272\nf 7017 15272 3025\nf 3026 10758 11418\nf 10758 539 15159\nf 11418 15159 332\nf 3027 10764 10834\nf 10764 541 15273\nf 10834 15273 531\nf 1786 15260 10837\nf 15260 543 10726\nf 10837 10726 533\nf 4139 15274 15275\nf 15274 4140 10843\nf 15275 10843 1802\nf 3058 11064 10846\nf 11064 3025 15272\nf 10846 15272 1800\nf 1805 10855 15276\nf 10855 3029 10894\nf 15276 10894 1813\nf 1806 10858 15277\nf 10858 3030 10903\nf 15277 10903 1814\nf 1807 10864 15278\nf 10864 3031 10909\nf 15278 10909 1815\nf 1808 10870 15279\nf 10870 3032 10915\nf 15279 10915 1816\nf 1809 10876 15280\nf 10876 3033 10921\nf 15280 10921 1817\nf 1810 10882 15281\nf 10882 3034 10927\nf 15281 10927 1818\nf 453 7029 15282\nf 7029 1644 10945\nf 15282 10945 1646\nf 5523 15283 15285\nf 15283 4158 15284\nf 15285 15284 1820\nf 4151 15286 10951\nf 15286 3037 10956\nf 10951 10956 1821\nf 1815 10908 15287\nf 10908 3038 10962\nf 15287 10962 1822\nf 4160 15288 7031\nf 15288 1594 15160\nf 7031 15160 2899\nf 1594 15288 15290\nf 15288 4160 15289\nf 15290 15289 1822\nf 1816 10914 15291\nf 10914 3039 10968\nf 15291 10968 1823\nf 4162 15292 7033\nf 15292 1595 10106\nf 7033 10106 1596\nf 1595 15292 15294\nf 15292 4162 15293\nf 15294 15293 1823\nf 1817 10920 15295\nf 10920 3040 10974\nf 15295 10974 1824\nf 4164 15296 7036\nf 15296 1598 8686\nf 7036 8686 3041\nf 1598 15296 15298\nf 15296 4164 15297\nf 15298 15297 1824\nf 1818 10926 15299\nf 10926 3042 10980\nf 15299 10980 1825\nf 1599 15161 15301\nf 15161 4166 15300\nf 15301 15300 1825\nf 1811 10929 15302\nf 10929 3043 10986\nf 15302 10986 1826\nf 4167 15303 7039\nf 15303 1826 15304\nf 7039 15304 1600\nf 1819 10935 15305\nf 10935 4170 10124\nf 15305 10124 1601\nf 1812 10941 15306\nf 10941 3044 10995\nf 15306 10995 1827\nf 1272 15307 15308\nf 15307 1602 10991\nf 15308 10991 1827\nf 1805 10854 15310\nf 10854 3045 15309\nf 15310 15309 1828\nf 3046 15311 7042\nf 15311 1806 15312\nf 7042 15312 3047\nf 1806 15311 15313\nf 15311 3046 11000\nf 15313 11000 1829\nf 1807 10863 15314\nf 10863 3048 11006\nf 15314 11006 1830\nf 1808 10869 15315\nf 10869 3049 11012\nf 15315 11012 1831\nf 1809 10875 15316\nf 10875 3050 11018\nf 15316 11018 1832\nf 1810 10881 15317\nf 10881 3051 11024\nf 15317 11024 1833\nf 1811 10887 15318\nf 10887 3052 11030\nf 15318 11030 1834\nf 1819 15319 15320\nf 15319 3053 11036\nf 15320 11036 1835\nf 1812 15321 15322\nf 15321 3054 11041\nf 15322 11041 1836\nf 1271 11056 7045\nf 11056 1837 15323\nf 7045 15323 3056\nf 3058 7049 15324\nf 7049 3057 11062\nf 15324 11062 1838\nf 1802 10842 11072\nf 10842 4142 11067\nf 11072 11067 1799\nf 3020 11138 11078\nf 11138 560 15325\nf 11078 15325 546\nf 3015 15326 11075\nf 15326 547 15327\nf 11075 15327 562\nf 3059 10800 11081\nf 10800 558 15328\nf 11081 15328 544\nf 3060 10770 10804\nf 10770 546 15325\nf 10804 15325 560\nf 3061 15329 11087\nf 15329 556 15330\nf 11087 15330 542\nf 3062 10767 11084\nf 10767 544 15328\nf 11084 15328 558\nf 554 15331 10788\nf 15331 540 11093\nf 10788 11093 3063\nf 3064 10761 11090\nf 10761 542 15330\nf 11090 15330 556\nf 3065 15332 15334\nf 15332 1839 15333\nf 15334 15333 1792\nf 1781 10756 11094\nf 10756 540 15331\nf 11094 15331 554\nf 3066 15335 7055\nf 15335 1791 15336\nf 7055 15336 3067\nf 4137 15337 15338\nf 15337 3066 11429\nf 15338 11429 1840\nf 1829 11002 15340\nf 11002 3068 15339\nf 15340 15339 1841\nf 1790 10776 15341\nf 10776 3069 11111\nf 15341 11111 1842\nf 1830 11008 15342\nf 11008 3070 11107\nf 15342 11107 1842\nf 3071 15343 7058\nf 15343 1791 10779\nf 7058 10779 3072\nf 1791 15343 15344\nf 15343 3071 11117\nf 15344 11117 1843\nf 1831 11014 15346\nf 11014 3073 15345\nf 15346 15345 1843\nf 3074 15347 7061\nf 15347 1792 10782\nf 7061 10782 3075\nf 1792 15347 15348\nf 15347 3074 11123\nf 15348 11123 1844\nf 1832 11020 15350\nf 11020 3076 15349\nf 15350 15349 1844\nf 1794 15351 11127\nf 15351 3077 11129\nf 11127 11129 1845\nf 1833 11026 15352\nf 11026 3078 11125\nf 15352 11125 1845\nf 4192 11131 15354\nf 11131 1796 15353\nf 15354 15353 3018\nf 3080 15355 11038\nf 15355 1846 15356\nf 11038 15356 1835\nf 562 15357 11073\nf 15357 601 11142\nf 11073 11142 3019\nf 1836 11043 15359\nf 11043 4195 15358\nf 15359 15358 1847\nf 1799 11069 15360\nf 11069 4182 11144\nf 15360 11144 4197\nf 4197 15361 15363\nf 15361 4179 15362\nf 15363 15362 601\nf 1586 15364 11149\nf 15364 3081 11146\nf 11149 11146 1838\nf 404 10182 6743\nf 10182 5924 15365\nf 6743 15365 1623\nf 3083 11160 11165\nf 11160 604 7078\nf 11165 7078 399\nf 2902 11175 6711\nf 11175 1858 6706\nf 6711 6706 1617\nf 3085 7163 11193\nf 7163 373 6671\nf 11193 6671 372\nf 618 15366 11380\nf 15366 633 11279\nf 11380 11279 3086\nf 3088 7177 15367\nf 7177 3089 11211\nf 15367 11211 3100\nf 620 15368 7205\nf 15368 619 11209\nf 7205 11209 3096\nf 3087 7174 11213\nf 7174 621 7179\nf 11213 7179 622\nf 624 11217 15369\nf 11217 3090 7185\nf 15369 7185 3092\nf 1852 11238 7084\nf 11238 3091 15370\nf 7084 15370 1880\nf 3098 15371 15372\nf 15371 3092 11219\nf 15372 11219 1882\nf 3093 10186 7189\nf 10186 407 15373\nf 7189 15373 3094\nf 1883 15374 11226\nf 15374 3094 15373\nf 11226 15373 407\nf 3095 7202 7156\nf 7202 611 15375\nf 7156 15375 612\nf 3084 7206 11191\nf 7206 3096 15376\nf 11191 15376 1867\nf 1881 7184 15378\nf 7184 3097 15377\nf 15378 15377 1882\nf 603 7218 11155\nf 7218 3098 11240\nf 11155 11240 1849\nf 407 7221 11225\nf 7221 3099 11243\nf 11225 11243 1884\nf 628 11257 15379\nf 11257 3088 15367\nf 15379 15367 3100\nf 1876 15380 15381\nf 15380 627 11254\nf 15381 11254 1875\nf 3101 11326 11259\nf 11326 630 7234\nf 11259 7234 623\nf 3105 15382 15384\nf 15382 3102 15383\nf 15384 15383 1902\nf 3102 15382 11263\nf 15382 3105 15385\nf 11263 15385 625\nf 1882 11218 15378\nf 11218 3103 15386\nf 15378 15386 1881\nf 3104 11334 11268\nf 11334 631 7237\nf 11268 7237 409\nf 625 15385 11224\nf 15385 3105 11265\nf 11224 11265 1883\nf 616 15387 11316\nf 15387 617 11385\nf 11316 11385 3106\nf 3107 11374 11285\nf 11374 634 15388\nf 11285 15388 635\nf 3108 11318 11282\nf 11318 633 15366\nf 11282 15366 618\nf 3109 11368 11291\nf 11368 636 15389\nf 11291 15389 637\nf 3110 11323 11288\nf 11323 635 15388\nf 11288 15388 634\nf 3111 11329 11294\nf 11329 637 15389\nf 11294 15389 636\nf 3116 7247 15390\nf 7247 3112 11359\nf 15390 11359 3129\nf 3113 11332 11297\nf 11332 639 15391\nf 11297 15391 638\nf 640 15392 11354\nf 15392 3114 7244\nf 11354 7244 3115\nf 3114 15392 11301\nf 15392 640 11302\nf 11301 11302 411\nf 1893 11336 11340\nf 11336 3116 15393\nf 11340 15393 1906\nf 3117 6756 15394\nf 6756 413 11307\nf 15394 11307 1907\nf 627 15395 11252\nf 15395 4200 11314\nf 11252 11314 3118\nf 3119 11283 11322\nf 11283 635 15396\nf 11322 15396 629\nf 3120 11255 11320\nf 11255 628 11277\nf 11320 11277 633\nf 1900 11289 11328\nf 11289 637 15397\nf 11328 15397 630\nf 1890 15398 11325\nf 15398 629 15396\nf 11325 15396 635\nf 3105 15384 15399\nf 15384 1902 7262\nf 15399 7262 3122\nf 1891 11260 11331\nf 11260 630 15397\nf 11331 15397 637\nf 3105 15399 11266\nf 15399 3122 15400\nf 11266 15400 1892\nf 1895 15401 7266\nf 15401 4201 15402\nf 7266 15402 3123\nf 1893 11339 11274\nf 11339 3123 15402\nf 11274 15402 4201\nf 1894 11270 11273\nf 11270 3124 11337\nf 11273 11337 1893\nf 1895 7265 11342\nf 7265 411 7253\nf 11342 7253 1628\nf 1747 15403 11347\nf 15403 3125 11344\nf 11347 11344 1910\nf 1908 11304 11306\nf 11304 3126 15404\nf 11306 15404 1907\nf 3127 10611 11350\nf 10611 512 11348\nf 11350 11348 417\nf 3128 7277 11358\nf 7277 3129 15405\nf 11358 15405 516\nf 3130 10616 7274\nf 10616 514 11353\nf 7274 11353 3126\nf 3131 11295 11364\nf 11295 638 15406\nf 11364 15406 518\nf 3132 10622 11361\nf 10622 516 15405\nf 11361 15405 3129\nf 3133 11292 11367\nf 11292 636 15407\nf 11367 15407 520\nf 3134 11286 11373\nf 11286 634 15408\nf 11373 15408 522\nf 3135 10631 11370\nf 10631 520 15407\nf 11370 15407 636\nf 3136 11280 11379\nf 11280 618 15409\nf 11379 15409 524\nf 3137 10637 11376\nf 10637 522 15408\nf 11376 15408 634\nf 524 15409 10643\nf 15409 618 11382\nf 10643 11382 3138\nf 1911 11308 15411\nf 11308 3139 15410\nf 15411 15410 1912\nf 3140 11390 7280\nf 11390 1912 15410\nf 7280 15410 3139\nf 3141 15412 11389\nf 15412 1913 11386\nf 11389 11386 1912\nf 1913 15412 11398\nf 15412 3141 10745\nf 11398 10745 1777\nf 535 15413 10722\nf 15413 3142 11400\nf 10722 11400 328\nf 534 10805 15269\nf 10805 3143 11403\nf 15269 11403 329\nf 3144 11410 10433\nf 11410 495 15204\nf 10433 15204 496\nf 533 15414 15252\nf 15414 3145 11409\nf 15252 11409 532\nf 3146 11416 10491\nf 11416 332 15213\nf 10491 15213 497\nf 541 10829 15273\nf 10829 3147 11414\nf 15273 11414 531\nf 3148 11422 10075\nf 11422 330 15186\nf 10075 15186 331\nf 540 10755 15256\nf 10755 3149 11420\nf 15256 11420 539\nf 1840 15415 15417\nf 15415 1677 15416\nf 15417 15416 3150\nf 1678 11436 15418\nf 11436 3151 10777\nf 15418 10777 1790\nf 1679 11442 15419\nf 11442 3152 11105\nf 15419 11105 1841\nf 1680 11448 15420\nf 11448 3153 10998\nf 15420 10998 1828\nf 3154 15421 7283\nf 15421 568 15422\nf 7283 15422 1804\n\nusemtl material_1\nf 3155 15423 7423\nf 15423 4811 15424\nf 7423 15424 4913\nf 1919 15425 15427\nf 15425 5330 15426\nf 15427 15426 1923\nf 4845 15428 15430\nf 15428 1920 15429\nf 15430 15429 5328\nf 4206 15431 15433\nf 15431 5529 15432\nf 15433 15432 4968\nf 4213 15434 15436\nf 15434 5328 15435\nf 15436 15435 5332\nf 1924 15437 15439\nf 15437 5329 15438\nf 15439 15438 5333\nf 3160 15440 15441\nf 15440 3162 11473\nf 15441 11473 4812\nf 4812 11475 15443\nf 11475 5334 15442\nf 15443 15442 3159\nf 5545 15444 7288\nf 15444 645 15445\nf 7288 15445 5539\nf 4978 15446 15448\nf 15446 3164 15447\nf 15448 15447 3165\nf 4219 15449 15451\nf 15449 3171 15450\nf 15451 15450 4217\nf 5338 15452 15454\nf 15452 3173 15453\nf 15454 15453 4994\nf 1929 15455 15457\nf 15455 1931 15456\nf 15457 15456 5339\nf 1934 15458 15460\nf 15458 3174 15459\nf 15460 15459 3215\nf 3175 15461 15463\nf 15461 4982 15462\nf 15463 15462 4995\nf 4980 15464 15466\nf 15464 3177 15465\nf 15466 15465 5340\nf 5340 15467 15466\nf 15467 5341 15468\nf 15466 15468 4980\nf 4227 15469 15471\nf 15469 4225 15470\nf 15471 15470 4228\nf 3181 15472 15474\nf 15472 1938 15473\nf 15474 15473 4983\nf 5344 15475 15477\nf 15475 1939 15476\nf 15477 15476 5343\nf 3184 15478 15480\nf 15478 4223 15479\nf 15480 15479 5347\nf 5347 15481 15483\nf 15481 3185 15482\nf 15483 15482 3186\nf 5344 15484 15486\nf 15484 3190 15485\nf 15486 15485 5350\nf 5551 15487 15489\nf 15487 652 15488\nf 15489 15488 5926\nf 1932 15490 7297\nf 15490 3167 15491\nf 7297 15491 4221\nf 4233 11543 15493\nf 11543 4235 15492\nf 15493 15492 5947\nf 4233 15494 11541\nf 15494 4234 15495\nf 11541 15495 5021\nf 4234 15494 15497\nf 15494 4233 15496\nf 15497 15496 4818\nf 3241 15498 15500\nf 15498 5003 15499\nf 15500 15499 1947\nf 5002 15501 15503\nf 15501 4236 15502\nf 15503 15502 3197\nf 3196 15504 11519\nf 15504 1944 15505\nf 11519 15505 3187\nf 1944 15504 15507\nf 15504 3196 15506\nf 15507 15506 5000\nf 5560 15508 15510\nf 15508 4238 15509\nf 15510 15509 4241\nf 1951 15511 15513\nf 15511 5005 15512\nf 15513 15512 1950\nf 3201 15514 11525\nf 15514 1952 15515\nf 11525 15515 3199\nf 5007 15516 15518\nf 15516 3201 15517\nf 15518 15517 5880\nf 5354 15519 15521\nf 15519 5007 15520\nf 15521 15520 1953\nf 5011 15522 15524\nf 15522 4830 15523\nf 15524 15523 5010\nf 3206 15525 15526\nf 15525 4831 7307\nf 15526 7307 1957\nf 1958 7473 15528\nf 7473 663 15527\nf 15528 15527 5012\nf 1960 15529 15531\nf 15529 5567 15530\nf 15531 15530 5355\nf 5011 15532 15534\nf 15532 3210 15533\nf 15534 15533 5015\nf 3211 15535 7315\nf 15535 5014 15536\nf 7315 15536 4832\nf 5013 15537 15539\nf 15537 4248 15538\nf 15539 15538 5014\nf 5018 15540 11538\nf 15540 1965 15541\nf 11538 15541 5357\nf 3214 15542 15544\nf 15542 5019 15543\nf 15544 15543 3212\nf 5023 15545 15547\nf 15545 3221 15546\nf 15547 15546 5026\nf 5027 15548 15550\nf 15548 3221 15549\nf 15550 15549 3223\nf 5027 15551 15553\nf 15551 3224 15552\nf 15553 15552 5359\nf 5027 15554 15556\nf 15554 1968 15555\nf 15556 15555 5026\nf 5359 15552 15558\nf 15552 3224 15557\nf 15558 15557 5033\nf 3230 15559 15561\nf 15559 3228 15560\nf 15561 15560 3229\nf 1975 15562 15564\nf 15562 3232 15563\nf 15564 15563 1976\nf 4260 15565 15567\nf 15565 4259 15566\nf 15567 15566 5042\nf 3235 15568 15570\nf 15568 4261 15569\nf 15570 15569 3236\nf 3235 15571 15573\nf 15571 1977 15572\nf 15573 15572 1976\nf 1947 15574 15576\nf 15574 1978 15575\nf 15576 15575 5362\nf 4266 15577 15579\nf 15577 5050 15578\nf 15579 15578 5363\nf 5557 15580 15582\nf 15580 5049 15581\nf 15582 15581 5364\nf 3240 15583 15584\nf 15583 1978 15574\nf 15584 15574 1947\n\nusemtl material_2\nf 5365 15585 15587\nf 15585 5592 15586\nf 15587 15586 5838\nf 4843 15588 15590\nf 15588 1986 15589\nf 15590 15589 4844\nf 642 15591 15593\nf 15591 5371 15592\nf 15593 15592 4809\nf 3248 15594 7323\nf 15594 5063 15595\nf 7323 15595 4843\nf 3249 15596 15597\nf 15596 1987 11573\nf 15597 11573 3250\nf 1987 15596 15599\nf 15596 3249 15598\nf 15599 15598 5060\nf 5072 15600 15602\nf 15600 5067 15601\nf 15602 15601 4281\nf 3253 15603 15605\nf 15603 4279 15604\nf 15605 15604 3254\nf 5375 15606 15608\nf 15606 5068 15607\nf 15608 15607 5598\nf 1990 15609 15611\nf 15609 3253 15610\nf 15611 15610 3255\nf 5068 15612 15614\nf 15612 1990 15613\nf 15614 15613 5074\nf 5377 15615 15617\nf 15615 3256 15616\nf 15617 15616 3257\nf 5377 15618 11587\nf 15618 1992 15619\nf 11587 15619 5074\nf 1331 15620 15622\nf 15620 5632 15621\nf 15622 15621 5378\nf 5081 15623 15625\nf 15623 1997 15624\nf 15625 15624 5611\nf 5080 11599 15627\nf 11599 5608 15626\nf 15627 15626 3259\nf 4854 15628 15630\nf 15628 5086 15629\nf 15630 15629 5382\nf 5383 15631 15633\nf 15631 3263 15632\nf 15633 15632 3262\nf 5089 15634 15636\nf 15634 5090 15635\nf 15636 15635 5088\nf 5096 11627 15638\nf 11627 5095 15637\nf 15638 15637 5097\nf 5384 15639 15640\nf 15639 5099 11634\nf 15640 11634 5100\nf 3269 15641 15643\nf 15641 5384 15642\nf 15643 15642 5385\nf 4298 15644 15646\nf 15644 3269 15645\nf 15646 15645 2009\nf 3269 15644 15648\nf 15644 4298 15647\nf 15648 15647 4858\nf 3270 15649 15650\nf 15649 4858 15647\nf 15650 15647 4298\nf 2010 15651 15653\nf 15651 3271 15652\nf 15653 15652 5386\nf 5107 15654 15656\nf 15654 3272 15655\nf 15656 15655 5105\nf 2013 15657 15659\nf 15657 2014 15658\nf 15659 15658 5388\nf 2012 15660 15662\nf 15660 3276 15661\nf 15662 15661 4302\nf 5113 15663 15664\nf 15663 5110 11658\nf 15664 11658 2016\nf 5391 15665 15667\nf 15665 3283 15666\nf 15667 15666 5112\nf 3284 15668 15670\nf 15668 3286 15669\nf 15670 15669 4863\nf 5392 15671 15672\nf 15671 5114 11668\nf 15672 11668 2017\nf 3289 15673 15675\nf 15673 5119 15674\nf 15675 15674 3290\nf 5119 15676 15678\nf 15676 3291 15677\nf 15678 15677 5396\nf 5633 15679 15681\nf 15679 3290 15680\nf 15681 15680 5120\nf 5394 15682 15684\nf 15682 3292 15683\nf 15684 15683 5395\nf 3293 15685 15687\nf 15685 5120 15686\nf 15687 15686 4313\nf 5397 15688 15690\nf 15688 2020 15689\nf 15690 15689 5393\nf 3294 15691 15693\nf 15691 4313 15692\nf 15693 15692 4864\nf 2027 15694 15696\nf 15694 5124 15695\nf 15696 15695 2021\nf 4865 15697 11709\nf 15697 4866 15698\nf 11709 15698 4332\nf 2027 15699 15701\nf 15699 5129 15700\nf 15701 15700 3295\nf 2026 15702 15704\nf 15702 2021 15703\nf 15704 15703 2022\nf 3300 15705 15707\nf 15705 5644 15706\nf 15707 15706 5115\nf 5400 15708 15710\nf 15708 701 15709\nf 15710 15709 5402\nf 5400 15710 15712\nf 15710 5402 15711\nf 15712 15711 5401\nf 5133 15713 15715\nf 15713 4323 15714\nf 15715 15714 5130\nf 5406 15716 15718\nf 15716 5405 15717\nf 15718 15717 3305\nf 5406 15719 15721\nf 15719 2033 15720\nf 15721 15720 5136\nf 5141 15722 15724\nf 15722 5140 15723\nf 15724 15723 5407\nf 5408 15725 15726\nf 15725 3308 11706\nf 15726 11706 2038\nf 3310 15727 15729\nf 15727 5409 15728\nf 15729 15728 3312\nf 5148 15730 15732\nf 15730 5146 15731\nf 15732 15731 2040\nf 2040 15733 15735\nf 15733 4330 15734\nf 15735 15734 5411\nf 2040 15736 15732\nf 15736 5398 15737\nf 15732 15737 5148\n\nusemtl material_3\nf 5223 15738 11842\nf 15738 5412 15739\nf 11842 15739 2041\nf 5413 15740 15742\nf 15740 5893 15741\nf 15742 15741 5414\nf 676 15743 15745\nf 15743 708 15744\nf 15745 15744 5984\nf 5417 15746 15748\nf 15746 2043 15747\nf 15748 15747 3319\nf 3318 15749 7362\nf 15749 2047 15750\nf 7362 15750 3315\nf 5940 15751 15753\nf 15751 4884 15752\nf 15753 15752 3318\nf 707 12111 15755\nf 12111 706 15754\nf 15755 15754 5985\nf 5965 15756 15758\nf 15756 3321 15757\nf 15758 15757 3322\nf 4339 15759 15761\nf 15759 2046 15760\nf 15761 15760 4350\nf 3322 15762 11723\nf 15762 3324 15763\nf 11723 15763 5154\nf 5420 15764 15765\nf 15764 440 11724\nf 15765 11724 5155\nf 3328 15766 15768\nf 15766 2050 15767\nf 15768 15767 4356\nf 2050 15766 15770\nf 15766 3328 15769\nf 15770 15769 2048\nf 5680 15771 15772\nf 15771 3328 15768\nf 15772 15768 4356\nf 2054 15773 15775\nf 15773 5159 15774\nf 15775 15774 4882\nf 3334 15776 15778\nf 15776 5158 15777\nf 15778 15777 5423\nf 3331 15779 15780\nf 15779 4883 11730\nf 15780 11730 3334\nf 4883 15779 15782\nf 15779 3331 15781\nf 15782 15781 5425\nf 4356 15783 15785\nf 15783 5161 15784\nf 15785 15784 4355\nf 3341 15786 15788\nf 15786 4358 15787\nf 15788 15787 3335\nf 2058 15789 15791\nf 15789 5165 15790\nf 15791 15790 3345\nf 4889 15792 15794\nf 15792 2058 15793\nf 15794 15793 5167\nf 3344 15795 15797\nf 15795 5433 15796\nf 15797 15796 3342\nf 5167 15798 15800\nf 15798 3345 15799\nf 15800 15799 5170\nf 2061 15801 15803\nf 15801 5169 15802\nf 15803 15802 5171\nf 5171 15804 15806\nf 15804 3348 15805\nf 15806 15805 5435\nf 5176 15807 15809\nf 15807 3351 15808\nf 15809 15808 5175\nf 5175 15810 15812\nf 15810 2063 15811\nf 15812 15811 5839\nf 5179 15813 15815\nf 15813 3354 15814\nf 15815 15814 5182\nf 5436 15816 15818\nf 15816 2064 15817\nf 15818 15817 2063\nf 5439 15819 15821\nf 15819 3361 15820\nf 15821 15820 2067\nf 3361 15822 15823\nf 15822 5441 11788\nf 15823 11788 5440\nf 728 12066 15825\nf 12066 2069 15824\nf 15825 15824 5442\nf 5701 15826 15828\nf 15826 5191 15827\nf 15828 15827 5443\nf 5444 15829 15831\nf 15829 4895 15830\nf 15831 15830 4896\nf 3371 15832 15834\nf 15832 5704 15833\nf 15834 15833 3372\nf 5203 15835 15837\nf 15835 3376 15836\nf 15837 15836 5448\nf 3372 15838 15840\nf 15838 3377 15839\nf 15840 15839 3376\nf 5962 15841 15842\nf 15841 348 6611\nf 15842 6611 85\nf 4899 15843 15845\nf 15843 3378 15844\nf 15845 15844 3375\nf 4900 15846 15848\nf 15846 5220 15847\nf 15848 15847 3380\nf 2079 15849 15851\nf 15849 5206 15850\nf 15851 15850 5451\nf 5453 15852 15854\nf 15852 5206 15853\nf 15854 15853 3382\nf 93 15855 15857\nf 15855 92 15856\nf 15857 15856 5452\nf 2081 15858 15860\nf 15858 4381 15859\nf 15860 15859 5715\nf 2081 15861 15858\nf 15861 3385 15862\nf 15858 15862 4381\nf 3385 15861 11811\nf 15861 2081 15863\nf 11811 15863 4379\nf 3386 15864 15866\nf 15864 3389 15865\nf 15866 15865 5210\nf 4381 15867 15869\nf 15867 3390 15868\nf 15869 15868 5717\nf 3390 15867 15870\nf 15867 4381 15862\nf 15870 15862 3385\nf 5456 15871 15873\nf 15871 2083 15872\nf 15873 15872 3392\nf 5456 15874 15876\nf 15874 3391 15875\nf 15876 15875 4360\nf 4386 15877 15879\nf 15877 4387 15878\nf 15879 15878 3395\nf 3392 15880 15882\nf 15880 4389 15881\nf 15882 15881 5459\nf 5460 15883 15885\nf 15883 5723 15884\nf 15885 15884 3393\nf 3395 15886 15888\nf 15886 5460 15887\nf 15888 15887 5720\nf 3399 15889 15891\nf 15889 4390 15890\nf 15891 15890 3400\nf 5927 15892 15894\nf 15892 5464 15893\nf 15894 15893 5462\nf 3399 15895 15897\nf 15895 2087 15896\nf 15897 15896 5927\nf 3400 15898 15899\nf 15898 3405 11835\nf 15899 11835 3402\nf 3404 15900 11834\nf 15900 5217 15901\nf 11834 15901 3402\nf 5218 15902 15904\nf 15902 5217 15903\nf 15904 15903 5729\n\nusemtl material_1\nf 3314 15905 15907\nf 15905 5740 15906\nf 15907 15906 5840\nf 5467 15908 15910\nf 15908 2093 15909\nf 15910 15909 5468\nf 5225 15911 15913\nf 15911 5226 15912\nf 15913 15912 3412\nf 4966 15914 11460\nf 15914 5467 15915\nf 11460 15915 1919\nf 2093 15916 11844\nf 15916 5226 11848\nf 11844 11848 4401\nf 5227 15917 15919\nf 15917 4911 15918\nf 15919 15918 3410\nf 2095 11845 15921\nf 11845 4401 15920\nf 15921 15920 3422\nf 3414 15922 15924\nf 15922 3417 15923\nf 15924 15923 4405\nf 5239 15925 15927\nf 15925 4408 15926\nf 15927 15926 5238\nf 2103 15928 15930\nf 15928 3450 15929\nf 15930 15929 4928\nf 5473 15931 15933\nf 15931 2107 15932\nf 15933 15932 5749\nf 5243 15934 15936\nf 15934 3429 15935\nf 15936 15935 4415\nf 5242 15937 15938\nf 15937 5244 11867\nf 15938 11867 5474\nf 3430 15939 15941\nf 15939 5249 15940\nf 15941 15940 5242\nf 5244 15937 15942\nf 15937 5242 15940\nf 15942 15940 5249\nf 5250 15943 15944\nf 15943 3432 11877\nf 15944 11877 2098\nf 3433 15945 15947\nf 15945 4418 15946\nf 15947 15946 5230\nf 5476 15948 15950\nf 15948 3436 15949\nf 15950 15949 5255\nf 5255 15949 15952\nf 15949 3436 15951\nf 15952 15951 5256\nf 5264 15953 15955\nf 15953 5480 15954\nf 15955 15954 2116\nf 5481 15956 15958\nf 15956 3442 15957\nf 15958 15957 5842\nf 4923 15959 15960\nf 15959 3444 7438\nf 15960 7438 4924\nf 2121 15961 15963\nf 15961 5482 15962\nf 15963 15962 5485\nf 3446 15964 15966\nf 15964 4430 15965\nf 15966 15965 5775\nf 5486 15967 15969\nf 15967 2123 15968\nf 15969 15968 2124\nf 5485 15970 15963\nf 15970 5486 15971\nf 15963 15971 2121\nf 2123 15972 15974\nf 15972 5487 15973\nf 15974 15973 5278\nf 3449 15975 15976\nf 15975 5278 15973\nf 15976 15973 5487\nf 2104 15977 15979\nf 15977 5489 15978\nf 15979 15978 5488\nf 5489 15980 15982\nf 15980 2125 15981\nf 15982 15981 5490\nf 2125 15983 15981\nf 15983 4437 15984\nf 15981 15984 5490\nf 2126 15985 15987\nf 15985 5284 15986\nf 15987 15986 4437\nf 3454 15988 15989\nf 15988 770 7693\nf 15989 7693 2127\nf 3454 15990 15992\nf 15990 3457 15991\nf 15992 15991 5282\nf 5285 15993 15995\nf 15993 5283 15994\nf 15995 15994 2128\nf 3457 15996 15998\nf 15996 3458 15997\nf 15998 15997 4932\nf 3458 15999 15997\nf 15999 4439 11904\nf 15997 11904 4932\nf 2129 16000 16002\nf 16000 5491 16001\nf 16002 16001 5284\nf 5492 16003 16005\nf 16003 4440 16004\nf 16005 16004 5288\nf 2132 16006 16008\nf 16006 3462 16007\nf 16008 16007 3464\nf 5788 16009 16011\nf 16009 2132 16010\nf 16011 16010 5290\nf 2141 16012 16014\nf 16012 5498 16013\nf 16014 16013 5290\nf 2137 16015 16017\nf 16015 5794 16016\nf 16017 16016 3467\nf 3466 16018 16020\nf 16018 5292 16019\nf 16020 16019 5495\nf 5278 16021 16023\nf 16021 3471 16022\nf 16023 16022 5495\nf 3472 16024 16026\nf 16024 5496 16025\nf 16026 16025 5277\nf 2142 16027 16029\nf 16027 4939 16028\nf 16029 16028 5499\nf 5800 16030 16032\nf 16030 5298 16031\nf 16032 16031 5300\nf 3476 16033 16035\nf 16033 3475 16034\nf 16035 16034 4940\nf 2143 16036 16038\nf 16036 5501 16037\nf 16038 16037 5502\nf 3476 16039 16041\nf 16039 2150 16040\nf 16041 16040 5502\nf 5802 16042 16044\nf 16042 5291 16043\nf 16044 16043 4941\nf 2146 16045 16047\nf 16045 2147 16046\nf 16047 16046 5503\nf 3478 16048 16050\nf 16048 2145 16049\nf 16050 16049 5504\nf 5505 16051 16053\nf 16051 3479 16052\nf 16053 16052 4454\nf 5507 16054 16056\nf 16054 5307 16055\nf 16056 16055 5506\n\nusemtl material_4\nf 2156 11955 11952\nf 11955 3482 16057\nf 11952 16057 4456\nf 3483 11956 7491\nf 11956 2156 11961\nf 7491 11961 663\nf 2166 16058 12001\nf 16058 803 16059\nf 12001 16059 804\nf 2186 12219 7560\nf 12219 727 16060\nf 7560 16060 2069\nf 3485 16061 16062\nf 16061 2192 7586\nf 16062 7586 5968\nf 3487 13131 16063\nf 13131 2390 12144\nf 16063 12144 2155\nf 3485 12085 16061\nf 12085 2207 12147\nf 16061 12147 2192\nf 2127 7694 12165\nf 7694 2214 7697\nf 12165 7697 3488\nf 3488 7696 12162\nf 7696 2215 12167\nf 12162 12167 3506\nf 3489 16064 12192\nf 16064 3485 16065\nf 12192 16065 841\nf 3490 16066 12199\nf 16066 2191 7582\nf 12199 7582 840\nf 2227 16067 7727\nf 16067 2187 16068\nf 7727 16068 4946\nf 3492 16069 16070\nf 16069 2229 12218\nf 16070 12218 2185\nf 2229 16069 16071\nf 16069 3492 12259\nf 16071 12259 3491\nf 2230 7742 12225\nf 7742 3493 12227\nf 12225 12227 2231\nf 2231 12226 16072\nf 12226 3494 12230\nf 16072 12230 4467\nf 4467 12229 16074\nf 12229 3495 16073\nf 16074 16073 2232\nf 3496 16075 7745\nf 16075 2232 16073\nf 7745 16073 3495\nf 4469 16076 12237\nf 16076 3496 16077\nf 12237 16077 2233\nf 3497 12241 7746\nf 12241 2233 16077\nf 7746 16077 3496\nf 4471 16078 12243\nf 16078 3498 12250\nf 12243 12250 2234\nf 2234 12249 16079\nf 12249 3499 12255\nf 16079 12255 2235\nf 2235 12254 16081\nf 12254 3500 16080\nf 16081 16080 5510\nf 2236 12260 16082\nf 12260 3501 12267\nf 16082 12267 2237\nf 2237 12266 16083\nf 12266 3502 12276\nf 16083 12276 2238\nf 2238 12275 16084\nf 12275 3503 12281\nf 16084 12281 2239\nf 3504 16085 7750\nf 16085 4496 16086\nf 7750 16086 2240\nf 3505 12283 7753\nf 12283 2240 16087\nf 7753 16087 4480\nf 2175 12032 16089\nf 12032 3507 16088\nf 16089 16088 2248\nf 3508 12323 7776\nf 12323 2248 16088\nf 7776 16088 3507\nf 4485 16090 16091\nf 16090 3509 12329\nf 16091 12329 4486\nf 4486 12328 12333\nf 12328 3510 12335\nf 12333 12335 4487\nf 4487 12334 16093\nf 12334 3511 16092\nf 16093 16092 5833\nf 4488 12340 12345\nf 12340 3512 12347\nf 12345 12347 4489\nf 4489 12346 12351\nf 12346 3513 12353\nf 12351 12353 4490\nf 4490 12352 12357\nf 12352 3514 12359\nf 12357 12359 4491\nf 4491 12358 12363\nf 12358 3515 12365\nf 12363 12365 4492\nf 4492 12364 16095\nf 12364 3516 16094\nf 16095 16094 5314\nf 4493 12370 16096\nf 12370 3517 12380\nf 16096 12380 2249\nf 2249 12379 16098\nf 12379 3518 16097\nf 16098 16097 2250\nf 4497 16099 16101\nf 16099 5315 16100\nf 16101 16100 2251\nf 2251 16102 7778\nf 16102 886 16103\nf 7778 16103 2252\nf 3520 13317 7781\nf 13317 887 16104\nf 7781 16104 2253\nf 3521 13324 16105\nf 13324 888 12409\nf 16105 12409 4503\nf 2256 16106 16107\nf 16106 3524 12421\nf 16107 12421 4505\nf 3525 7793 16108\nf 7793 3524 16106\nf 16108 16106 2256\nf 2258 16109 12437\nf 16109 897 16110\nf 12437 16110 4508\nf 2259 12441 12440\nf 12441 3527 16111\nf 12440 16111 2258\nf 2260 16112 16113\nf 16112 899 12456\nf 16113 12456 4512\nf 2263 16114 16116\nf 16114 3530 16115\nf 16116 16115 2259\nf 2265 12464 16117\nf 12464 3531 12459\nf 16117 12459 2264\nf 2266 12470 16118\nf 12470 3532 12465\nf 16118 12465 2265\nf 2267 12476 16119\nf 12476 3533 12471\nf 16119 12471 2266\nf 2268 12482 16120\nf 12482 3534 12477\nf 16120 12477 2267\nf 2269 12491 16121\nf 12491 3535 12483\nf 16121 12483 2268\nf 2270 12497 16122\nf 12497 3536 12492\nf 16122 12492 2269\nf 2271 16123 16124\nf 16123 3537 12498\nf 16124 12498 2270\nf 2272 12501 14047\nf 12501 808 7520\nf 14047 7520 807\nf 2274 12509 16125\nf 12509 3538 8044\nf 16125 8044 2273\nf 2275 12515 16126\nf 12515 3539 12510\nf 16126 12510 2274\nf 2276 12521 16127\nf 12521 3540 12516\nf 16127 12516 2275\nf 2277 12524 16128\nf 12524 3541 12522\nf 16128 12522 2276\nf 800 12527 11989\nf 12527 3542 12525\nf 11989 12525 2277\nf 3545 12538 7804\nf 12538 2278 16129\nf 7804 16129 3546\nf 2279 16130 12541\nf 16130 3546 16129\nf 12541 16129 2278\nf 3547 16131 7810\nf 16131 2279 7808\nf 7810 7808 2161\nf 3548 7814 16133\nf 7814 3549 16132\nf 16133 16132 2280\nf 2281 12549 16134\nf 12549 3550 12556\nf 16134 12556 2282\nf 2282 12555 16135\nf 12555 3551 12562\nf 16135 12562 2283\nf 2283 12561 16136\nf 12561 3552 12568\nf 16136 12568 2284\nf 2284 12567 16137\nf 12567 3553 12574\nf 16137 12574 2285\nf 2285 12573 16138\nf 12573 3554 12580\nf 16138 12580 2286\nf 2286 12579 16139\nf 12579 3555 12586\nf 16139 12586 2287\nf 2287 12585 16140\nf 12585 3556 12589\nf 16140 12589 2288\nf 2288 12588 16141\nf 12588 3557 12592\nf 16141 12592 2289\nf 2289 12591 16143\nf 12591 4533 16142\nf 16143 16142 2290\nf 3558 12595 7817\nf 12595 2290 16144\nf 7817 16144 2291\nf 3559 12603 12611\nf 12603 929 16145\nf 12611 16145 931\nf 3560 12608 7823\nf 12608 2294 16146\nf 7823 16146 2295\nf 2296 12616 16148\nf 12616 3561 16147\nf 16148 16147 2295\nf 3563 7827 7829\nf 7827 2298 16149\nf 7829 16149 2299\nf 3564 16150 7832\nf 16150 2300 12638\nf 7832 12638 3565\nf 2300 16150 16151\nf 16150 3564 7830\nf 16151 7830 2299\nf 3566 12639 7835\nf 12639 2300 16152\nf 7835 16152 2301\nf 4539 7849 16153\nf 7849 815 12656\nf 16153 12656 2305\nf 2306 12662 16154\nf 12662 3568 12669\nf 16154 12669 2307\nf 2307 12668 16155\nf 12668 3569 12675\nf 16155 12675 2308\nf 2308 12674 16156\nf 12674 3570 12681\nf 16156 12681 2309\nf 2309 12680 16157\nf 12680 3571 12687\nf 16157 12687 2310\nf 2310 12686 16159\nf 12686 3572 16158\nf 16159 16158 2311\nf 3573 12704 7852\nf 12704 960 12712\nf 7852 12712 2314\nf 2316 12719 16160\nf 12719 3574 12715\nf 16160 12715 2315\nf 2317 12725 16161\nf 12725 964 12720\nf 16161 12720 2316\nf 2318 12728 16162\nf 12728 3575 12726\nf 16162 12726 2317\nf 2319 12734 16163\nf 12734 3576 12729\nf 16163 12729 2318\nf 2320 12740 16164\nf 12740 3577 12735\nf 16164 12735 2319\nf 2321 12743 16165\nf 12743 971 12741\nf 16165 12741 2320\nf 3578 16166 16167\nf 16166 973 12744\nf 16167 12744 2321\nf 3582 12778 7858\nf 12778 4555 16168\nf 7858 16168 3583\nf 3584 12795 16169\nf 12795 943 12800\nf 16169 12800 3585\nf 2325 16170 16171\nf 16170 3585 12806\nf 16171 12806 2326\nf 2326 12805 16172\nf 12805 3586 12812\nf 16172 12812 2327\nf 2327 12811 16173\nf 12811 3587 12818\nf 16173 12818 2328\nf 2328 12817 16174\nf 12817 3588 12824\nf 16174 12824 2329\nf 2329 12823 16175\nf 12823 3589 12830\nf 16175 12830 2330\nf 2330 12829 16176\nf 12829 3590 12836\nf 16176 12836 2331\nf 2331 12835 16178\nf 12835 3591 16177\nf 16178 16177 2332\nf 3592 12842 7872\nf 12842 2333 16179\nf 7872 16179 2334\nf 3593 12852 7875\nf 12852 961 12858\nf 7875 12858 2336\nf 2338 12865 16180\nf 12865 3594 12861\nf 16180 12861 2337\nf 2339 12871 16181\nf 12871 3595 12866\nf 16181 12866 2338\nf 2340 12877 16182\nf 12877 3596 12872\nf 16182 12872 2339\nf 2341 12883 16183\nf 12883 3597 12878\nf 16183 12878 2340\nf 2342 12886 16184\nf 12886 938 12884\nf 16184 12884 2341\nf 3598 12887 7878\nf 12887 2342 16185\nf 7878 16185 2343\nf 2344 12902 16186\nf 12902 3599 7879\nf 16186 7879 2343\nf 3600 16187 7881\nf 16187 2345 16188\nf 7881 16188 3601\nf 2345 16187 16189\nf 16187 3600 12903\nf 16189 12903 2344\nf 3602 12912 12919\nf 12912 978 12769\nf 12919 12769 980\nf 3603 7887 7889\nf 7887 2347 12923\nf 7889 12923 2348\nf 3604 7907 12939\nf 7907 2354 12949\nf 12939 12949 987\nf 3605 12971 7910\nf 12971 4456 16057\nf 7910 16057 3482\nf 2360 12965 12959\nf 12965 3607 12958\nf 12959 12958 4578\nf 2360 12961 16191\nf 12961 2359 16190\nf 16191 16190 3608\nf 3608 16190 16193\nf 16190 2359 16192\nf 16193 16192 4579\nf 3608 16193 12995\nf 16193 4579 12996\nf 12995 12996 2361\nf 4457 16194 16195\nf 16194 2159 11966\nf 16195 11966 796\nf 2363 7931 16196\nf 7931 3610 7933\nf 16196 7933 3611\nf 2363 16196 12980\nf 16196 3611 7936\nf 12980 7936 4581\nf 3611 16197 7937\nf 16197 2358 12983\nf 7937 12983 2364\nf 3612 16198 16200\nf 16198 990 16199\nf 16200 16199 5843\nf 2366 16201 7941\nf 16201 3613 16202\nf 7941 16202 2365\nf 3522 7942 16203\nf 7942 2361 12998\nf 16203 12998 2255\nf 3614 12016 16204\nf 12016 814 13004\nf 16204 13004 2369\nf 2369 16205 16206\nf 16205 3615 13011\nf 16206 13011 2370\nf 2370 13010 16207\nf 13010 3616 13017\nf 16207 13017 2371\nf 2371 13016 16208\nf 13016 3617 13023\nf 16208 13023 2372\nf 2372 13022 16209\nf 13022 3618 13029\nf 16209 13029 2373\nf 2373 13028 16210\nf 13028 3619 13035\nf 16210 13035 2374\nf 2374 13034 16212\nf 13034 3620 16211\nf 16212 16211 4589\nf 2378 16213 16214\nf 16213 962 13059\nf 16214 13059 2377\nf 2379 13066 16216\nf 13066 965 16215\nf 16216 16215 2378\nf 2380 13069 16217\nf 13069 967 13067\nf 16217 13067 2379\nf 3621 16218 16219\nf 16218 969 13070\nf 16219 13070 2380\nf 2382 13081 16220\nf 13081 3622 13079\nf 16220 13079 2381\nf 2383 7953 16221\nf 7953 3623 13082\nf 16221 13082 2382\nf 3624 7954 7956\nf 7954 2383 16222\nf 7956 16222 2384\nf 3625 7957 13101\nf 7957 2384 16223\nf 13101 16223 3626\nf 3627 13113 7959\nf 13113 2385 13117\nf 7959 13117 2386\nf 2387 13121 16224\nf 13121 3628 7960\nf 16224 7960 2386\nf 3629 13142 13137\nf 13142 2393 13140\nf 13137 13140 2392\nf 2393 13141 16225\nf 13141 3630 13148\nf 16225 13148 2394\nf 2394 13147 16226\nf 13147 3631 13154\nf 16226 13154 2395\nf 2395 13153 16227\nf 13153 3632 13160\nf 16227 13160 2396\nf 2396 13159 16228\nf 13159 3633 13166\nf 16228 13166 2397\nf 2397 13165 16229\nf 13165 3634 13172\nf 16229 13172 2398\nf 2398 13171 16230\nf 13171 3635 13178\nf 16230 13178 2399\nf 2399 13177 16231\nf 13177 3636 13184\nf 16231 13184 2400\nf 2400 13183 16232\nf 13183 3637 13190\nf 16232 13190 2401\nf 2401 13189 16233\nf 13189 3638 13196\nf 16233 13196 2402\nf 2402 13195 16234\nf 13195 3639 13202\nf 16234 13202 4611\nf 5317 16235 13206\nf 16235 3640 13208\nf 13206 13208 4612\nf 4612 13207 16236\nf 13207 3641 13216\nf 16236 13216 2403\nf 2403 13215 16237\nf 13215 3642 13224\nf 16237 13224 2404\nf 3643 13228 7971\nf 13228 2406 16238\nf 7971 16238 2407\nf 3644 16239 16240\nf 16239 1024 13237\nf 16240 13237 2407\nf 2410 13248 16241\nf 13248 3645 13254\nf 16241 13254 2411\nf 2411 13253 16242\nf 13253 3646 13260\nf 16242 13260 2412\nf 2412 13259 16243\nf 13259 3647 13266\nf 16243 13266 2413\nf 2413 13265 16244\nf 13265 3648 13272\nf 16244 13272 2414\nf 2414 13271 16245\nf 13271 3649 13278\nf 16245 13278 2415\nf 2415 13277 16246\nf 13277 3650 13284\nf 16246 13284 4623\nf 4623 13283 13288\nf 13283 3651 13291\nf 13288 13291 4624\nf 5318 13289 16248\nf 13289 3651 16247\nf 16248 16247 3652\nf 4625 13295 16249\nf 13295 3653 13302\nf 16249 13302 2416\nf 2416 13301 16250\nf 13301 3654 13308\nf 16250 13308 2417\nf 2417 13307 16251\nf 13307 3655 13314\nf 16251 13314 2418\nf 2418 13313 16253\nf 13313 3656 16252\nf 16253 16252 2419\nf 3657 13321 7978\nf 13321 2419 16252\nf 7978 16252 3656\nf 3658 16254 16255\nf 16254 1020 13326\nf 16255 13326 3659\nf 2421 16256 16257\nf 16256 3659 13218\nf 16257 13218 1021\nf 3659 16256 16258\nf 16256 2421 13329\nf 16258 13329 2420\nf 2421 16257 16259\nf 16257 1021 13334\nf 16259 13334 2422\nf 3660 13346 16260\nf 13346 2424 13340\nf 16260 13340 2408\nf 4635 16261 13351\nf 16261 3661 16262\nf 13351 16262 2426\nf 4636 13352 16263\nf 13352 3662 13356\nf 16263 13356 2427\nf 2427 13355 16264\nf 13355 3663 13359\nf 16264 13359 2428\nf 2428 13358 16265\nf 13358 3664 13362\nf 16265 13362 2429\nf 2429 13361 16266\nf 13361 3665 13368\nf 16266 13368 2430\nf 2430 13367 16267\nf 13367 3666 13374\nf 16267 13374 2431\nf 2431 13373 16268\nf 13373 3667 13380\nf 16268 13380 2432\nf 2432 13379 16269\nf 13379 3668 13386\nf 16269 13386 2433\nf 2433 13385 16270\nf 13385 3669 13392\nf 16270 13392 2434\nf 2434 13391 16271\nf 13391 3670 13398\nf 16271 13398 2435\nf 2435 13397 16272\nf 13397 3671 13404\nf 16272 13404 2436\nf 2436 13403 16273\nf 13403 3672 13410\nf 16273 13410 2437\nf 3673 12613 7996\nf 12613 932 13425\nf 7996 13425 2441\nf 3674 13423 8000\nf 13423 2441 16274\nf 8000 16274 2442\nf 1026 13427 13433\nf 13427 2442 16275\nf 13433 16275 2443\nf 2444 16276 16277\nf 16276 3675 13434\nf 16277 13434 2443\nf 3676 16278 8002\nf 16278 2444 16279\nf 8002 16279 2445\nf 3677 13446 13451\nf 13446 939 16280\nf 13451 16280 851\nf 3678 13494 16281\nf 13494 2167 13492\nf 16281 13492 2451\nf 2451 13465 16282\nf 13465 3679 13501\nf 16282 13501 2459\nf 3681 8085 8075\nf 8085 4650 8507\nf 8075 8507 2467\nf 3682 16283 16284\nf 16283 2503 13671\nf 16284 13671 2493\nf 2504 13678 8206\nf 13678 2505 13675\nf 8206 13675 3684\nf 2509 13687 16285\nf 13687 2508 8153\nf 16285 8153 1071\nf 4652 8223 16286\nf 8223 3687 13708\nf 16286 13708 2513\nf 4655 8226 13716\nf 8226 3688 13718\nf 13716 13718 3689\nf 3689 13719 13721\nf 13719 2515 16287\nf 13721 16287 2516\nf 2452 13469 13762\nf 13469 3690 8263\nf 13762 8263 2528\nf 2528 8265 16288\nf 8265 3691 8266\nf 16288 8266 4663\nf 4663 8268 13769\nf 8268 3692 8269\nf 13769 8269 4664\nf 4664 8271 16289\nf 8271 3693 13776\nf 16289 13776 2529\nf 4666 16290 13780\nf 16290 3695 13782\nf 13780 13782 2530\nf 3695 16291 16292\nf 16291 2529 13775\nf 16292 13775 3694\nf 2530 16293 16294\nf 16293 3697 13787\nf 16294 13787 2531\nf 3697 16293 16295\nf 16293 2530 13781\nf 16295 13781 3696\nf 2531 13786 16296\nf 13786 3698 13793\nf 16296 13793 2532\nf 2532 13792 16297\nf 13792 3699 13799\nf 16297 13799 2533\nf 2533 13798 16298\nf 13798 3700 13805\nf 16298 13805 2534\nf 2534 13804 16299\nf 13804 3701 13811\nf 16299 13811 2535\nf 2535 13810 16300\nf 13810 3702 13820\nf 16300 13820 2536\nf 3703 16301 8279\nf 16301 3705 16302\nf 8279 16302 3704\nf 3705 16301 13818\nf 16301 3703 13816\nf 13818 13816 2536\nf 3705 13819 8285\nf 13819 2514 16303\nf 8285 16303 1082\nf 3706 8291 8293\nf 8291 2511 13693\nf 8293 13693 1069\nf 2544 16304 16306\nf 16304 3707 16305\nf 16306 16305 2545\nf 4676 16307 16308\nf 16307 3709 13869\nf 16308 13869 2546\nf 3708 16309 16310\nf 16309 4676 13857\nf 16310 13857 2545\nf 2546 13868 16311\nf 13868 3710 13875\nf 16311 13875 2547\nf 2547 13874 16312\nf 13874 3711 13881\nf 16312 13881 2548\nf 2548 13880 16313\nf 13880 3712 13887\nf 16313 13887 2549\nf 2549 13886 16315\nf 13886 3713 16314\nf 16315 16314 2550\nf 2550 13892 16317\nf 13892 3714 16316\nf 16317 16316 2551\nf 2551 16318 16319\nf 16318 5322 13899\nf 16319 13899 2552\nf 5511 13903 16321\nf 13903 3715 16320\nf 16321 16320 3716\nf 2553 16322 16324\nf 16322 3717 16323\nf 16324 16323 2554\nf 3717 16322 16325\nf 16322 2553 13908\nf 16325 13908 1096\nf 2554 16326 16328\nf 16326 3718 16327\nf 16328 16327 2555\nf 3718 16326 8311\nf 16326 2554 16323\nf 8311 16323 3717\nf 2555 16329 16330\nf 16329 3719 13923\nf 16330 13923 2556\nf 3719 16329 8314\nf 16329 2555 16327\nf 8314 16327 3718\nf 2556 13922 16332\nf 13922 3720 16331\nf 16332 16331 2557\nf 3721 13931 8317\nf 13931 2557 16331\nf 8317 16331 3720\nf 2557 13930 16333\nf 13930 3722 13941\nf 16333 13941 2558\nf 3723 13936 8318\nf 13936 2558 13940\nf 8318 13940 2484\nf 2559 16334 16336\nf 16334 3724 16335\nf 16336 16335 3725\nf 3725 13957 16337\nf 13957 3726 13974\nf 16337 13974 2560\nf 3680 13518 8327\nf 13518 2464 8060\nf 8327 8060 2465\nf 3727 13964 8332\nf 13964 2561 16338\nf 8332 16338 3728\nf 2562 14491 13967\nf 14491 3728 16338\nf 13967 16338 2561\nf 3726 16339 13972\nf 16339 3729 16340\nf 13972 16340 2563\nf 2563 16340 16342\nf 16340 3729 16341\nf 16342 16341 2564\nf 3730 13979 8337\nf 13979 2564 16341\nf 8337 16341 3729\nf 2564 13978 16344\nf 13978 3731 16343\nf 16344 16343 2565\nf 2565 16343 13983\nf 16343 3731 16345\nf 13983 16345 2566\nf 3732 13985 8340\nf 13985 2566 16345\nf 8340 16345 3731\nf 5513 16346 16347\nf 16346 2566 13984\nf 16347 13984 3733\nf 4695 13990 16348\nf 13990 4694 14000\nf 16348 14000 2567\nf 2569 13997 8344\nf 13997 1042 8040\nf 8344 8040 809\nf 2568 16349 14002\nf 16349 2569 8343\nf 14002 8343 2261\nf 2571 14009 16350\nf 14009 3734 14004\nf 16350 14004 2570\nf 2572 14015 16351\nf 14015 3735 14010\nf 16351 14010 2571\nf 2573 14021 16352\nf 14021 3736 14016\nf 16352 14016 2572\nf 3737 16353 16354\nf 16353 2574 14027\nf 16354 14027 1124\nf 2574 16353 16355\nf 16353 3737 14022\nf 16355 14022 2573\nf 2575 14033 16356\nf 14033 3738 14028\nf 16356 14028 2574\nf 3739 16357 8347\nf 16357 2576 16358\nf 8347 16358 3740\nf 2576 16357 16359\nf 16357 3739 14034\nf 16359 14034 2575\nf 4704 16360 16362\nf 16360 1134 16361\nf 16362 16361 2579\nf 2581 14066 16363\nf 14066 3743 14061\nf 16363 14061 2580\nf 3745 16364 16365\nf 16364 3744 14067\nf 16365 14067 2581\nf 2582 13483 14084\nf 13483 3746 14086\nf 14084 14086 2583\nf 3747 16366 16367\nf 16366 3748 14094\nf 16367 14094 2584\nf 2584 14093 16368\nf 14093 3749 14100\nf 16368 14100 2585\nf 2585 14099 16369\nf 14099 3750 14106\nf 16369 14106 2586\nf 2586 14105 16370\nf 14105 3751 14112\nf 16370 14112 2587\nf 2587 14111 16371\nf 14111 3752 14118\nf 16371 14118 2588\nf 2588 14117 16372\nf 14117 3753 14124\nf 16372 14124 2589\nf 2589 14123 16373\nf 14123 3754 14130\nf 16373 14130 2590\nf 2590 14129 16374\nf 14129 3755 14136\nf 16374 14136 2591\nf 2591 14135 16375\nf 14135 3756 14142\nf 16375 14142 4718\nf 2592 14146 8362\nf 14146 1160 14151\nf 8362 14151 2594\nf 3757 14157 16377\nf 14157 1161 16376\nf 16377 16376 1159\nf 3758 14154 8365\nf 14154 1162 16378\nf 8365 16378 3759\nf 1164 16379 8581\nf 16379 3759 16378\nf 8581 16378 1162\nf 3760 14160 14156\nf 14160 1163 16380\nf 14156 16380 1161\nf 3759 16381 16382\nf 16381 1166 14163\nf 16382 14163 2596\nf 1166 16381 8587\nf 16381 3759 16379\nf 8587 16379 1164\nf 3761 8368 14159\nf 8368 1165 16383\nf 14159 16383 1163\nf 3914 16384 8593\nf 16384 1168 14165\nf 8593 14165 3762\nf 3763 14167 16386\nf 14167 1167 16385\nf 16386 16385 1165\nf 3766 14169 8601\nf 14169 1168 8596\nf 8601 8596 1169\nf 3767 16387 16389\nf 16387 3765 16388\nf 16389 16388 2598\nf 1169 16390 14920\nf 16390 3918 14923\nf 14920 14923 2741\nf 3770 16391 14175\nf 16391 3767 16392\nf 14175 16392 2599\nf 3768 14172 16393\nf 14172 1170 8605\nf 16393 8605 1063\nf 1063 14177 16393\nf 14177 3769 8380\nf 16393 8380 3768\nf 3772 16394 14179\nf 16394 1171 16395\nf 14179 16395 2600\nf 1062 8383 8131\nf 8383 3771 8134\nf 8131 8134 2480\nf 1171 16394 16396\nf 16394 3772 13553\nf 16396 13553 1060\nf 3772 14178 8386\nf 14178 2601 8389\nf 8386 8389 2477\nf 2457 8392 16397\nf 8392 3773 14184\nf 16397 14184 2602\nf 2602 14183 16398\nf 14183 3774 14190\nf 16398 14190 2603\nf 2603 14189 16399\nf 14189 3775 14196\nf 16399 14196 2604\nf 2604 14195 16400\nf 14195 3776 14202\nf 16400 14202 2605\nf 2605 14201 16401\nf 14201 3777 14208\nf 16401 14208 2606\nf 2606 14207 16402\nf 14207 3778 14214\nf 16402 14214 2607\nf 2607 14213 16404\nf 14213 3779 16403\nf 16404 16403 2608\nf 2608 16405 16406\nf 16405 1186 14222\nf 16406 14222 2609\nf 4727 16407 16408\nf 16407 1188 14228\nf 16408 14228 4728\nf 1189 16409 14231\nf 16409 1187 14226\nf 14231 14226 3780\nf 1192 14235 16410\nf 14235 4728 14227\nf 16410 14227 1190\nf 1194 14238 16411\nf 14238 3781 14233\nf 16411 14233 1192\nf 1196 14244 16412\nf 14244 3782 14236\nf 16412 14236 1194\nf 3783 14246 14239\nf 14246 1195 16413\nf 14239 16413 1193\nf 1198 14250 16414\nf 14250 3784 14242\nf 16414 14242 1196\nf 3785 14252 14245\nf 14252 1197 16415\nf 14245 16415 1195\nf 1200 14256 16416\nf 14256 3786 14248\nf 16416 14248 1198\nf 3787 14258 14251\nf 14258 1199 16417\nf 14251 16417 1197\nf 1202 14262 16418\nf 14262 2614 14254\nf 16418 14254 1200\nf 3788 14264 14257\nf 14264 1201 16419\nf 14257 16419 1199\nf 1204 14268 8442\nf 14268 3789 14260\nf 8442 14260 1202\nf 3790 8397 16421\nf 8397 1203 16420\nf 16421 16420 1201\nf 1206 14270 8448\nf 14270 2616 14266\nf 8448 14266 1204\nf 3792 16422 14272\nf 16422 3790 16423\nf 14272 16423 2617\nf 3791 14269 14274\nf 14269 1206 8454\nf 14274 8454 1208\nf 3794 16424 14276\nf 16424 3792 14271\nf 14276 14271 2618\nf 3822 16425 16426\nf 16425 1210 8460\nf 16426 8460 1208\nf 3796 16427 14280\nf 16427 3794 14275\nf 14280 14275 2619\nf 3795 14278 14282\nf 14278 1210 16428\nf 14282 16428 3824\nf 3797 16429 14284\nf 16429 3796 14279\nf 14284 14279 2620\nf 3798 16430 14287\nf 16430 3797 14283\nf 14287 14283 2621\nf 2623 14289 14291\nf 14289 3798 14286\nf 14291 14286 2622\nf 2625 16431 16432\nf 16431 3799 14302\nf 16432 14302 2626\nf 2626 14304 16433\nf 14304 3801 14310\nf 16433 14310 2627\nf 2627 14309 16434\nf 14309 3802 14316\nf 16434 14316 2628\nf 2628 14315 16435\nf 14315 3803 14322\nf 16435 14322 2629\nf 2629 14321 16436\nf 14321 3804 14328\nf 16436 14328 2630\nf 2630 14327 16437\nf 14327 3805 14334\nf 16437 14334 2631\nf 2631 14333 16438\nf 14333 3806 14340\nf 16438 14340 2632\nf 2632 14339 16439\nf 14339 3807 14345\nf 16439 14345 2633\nf 2634 14349 16441\nf 14349 1157 16440\nf 16441 16440 5514\nf 1192 16410 14356\nf 16410 1190 16442\nf 14356 16442 2636\nf 1161 14360 16376\nf 14360 4738 14352\nf 16376 14352 1159\nf 3808 14362 14355\nf 14362 1194 16411\nf 14355 16411 1192\nf 1163 14366 16380\nf 14366 3809 14358\nf 16380 14358 1161\nf 3810 14368 14361\nf 14368 1196 16412\nf 14361 16412 1194\nf 1165 16443 16383\nf 16443 3811 14364\nf 16383 14364 1163\nf 3812 14374 14367\nf 14374 1198 16414\nf 14367 16414 1196\nf 1165 16385 16443\nf 16385 1167 14370\nf 16443 14370 3811\nf 3813 14378 14373\nf 14378 1200 16416\nf 14373 16416 1198\nf 3765 16387 8373\nf 16387 3767 14382\nf 8373 14382 3814\nf 3815 14383 14377\nf 14383 1202 16418\nf 14377 16418 1200\nf 3767 16391 14380\nf 16391 3770 16444\nf 14380 16444 5324\nf 1171 14389 16445\nf 14389 3817 8447\nf 16445 8447 5324\nf 3820 16446 14391\nf 16446 3818 14386\nf 14391 14386 2642\nf 3819 14388 14395\nf 14388 1171 16396\nf 14395 16396 1060\nf 3822 16447 14397\nf 16447 3820 14390\nf 14397 14390 3821\nf 3821 14393 8458\nf 14393 1060 8119\nf 8458 8119 1061\nf 3823 16448 14398\nf 16448 3822 14396\nf 14398 14396 2643\nf 3823 8466 16449\nf 8466 3824 16428\nf 16449 16428 1210\nf 3824 8465 8469\nf 8465 2644 14402\nf 8469 14402 2475\nf 2653 14431 14430\nf 14431 2654 14426\nf 14430 14426 2652\nf 2652 8496 14440\nf 8496 2657 8505\nf 14440 8505 2655\nf 3826 13952 8501\nf 13952 2658 16450\nf 8501 16450 2659\nf 1221 16451 14438\nf 16451 2661 14458\nf 14438 14458 3827\nf 3827 16452 8504\nf 16452 2660 16453\nf 8504 16453 2655\nf 3828 14463 14467\nf 14463 2467 14466\nf 14467 14466 2662\nf 3829 14471 14473\nf 14471 2663 16454\nf 14473 16454 2664\nf 2661 16455 14453\nf 16455 2667 16456\nf 14453 16456 1116\nf 2667 16455 14480\nf 16455 2661 16451\nf 14480 16451 1221\nf 2570 14003 16457\nf 14003 1116 16456\nf 16457 16456 2667\nf 2668 14505 16459\nf 14505 3830 16458\nf 16459 16458 3831\nf 2668 16459 16460\nf 16459 3831 14512\nf 16460 14512 2669\nf 2669 14511 16461\nf 14511 3832 14517\nf 16461 14517 2670\nf 2670 14516 16462\nf 14516 3833 14523\nf 16462 14523 2671\nf 2671 14522 16463\nf 14522 3834 14526\nf 16463 14526 2672\nf 2672 14525 16464\nf 14525 3835 14532\nf 16464 14532 4750\nf 4750 14531 16466\nf 14531 1182 16465\nf 16466 16465 2673\nf 3836 14537 16467\nf 14537 1185 14540\nf 16467 14540 4753\nf 3837 8515 16469\nf 8515 1123 16468\nf 16469 16468 4752\nf 1189 14543 16409\nf 14543 4753 14539\nf 16409 14539 1187\nf 3837 14545 8516\nf 14545 1119 13971\nf 8516 13971 1121\nf 1191 14549 16470\nf 14549 3838 14541\nf 16470 14541 1189\nf 3839 16471 14544\nf 16471 1117 16472\nf 14544 16472 1119\nf 1193 14552 14240\nf 14552 3840 14547\nf 14240 14547 1191\nf 1195 14558 16413\nf 14558 3841 14550\nf 16413 14550 1193\nf 3842 14560 14553\nf 14560 1115 13949\nf 14553 13949 1114\nf 1197 14564 16415\nf 14564 3843 14556\nf 16415 14556 1195\nf 3844 14566 14559\nf 14566 1224 16473\nf 14559 16473 1115\nf 1199 14570 16417\nf 14570 3845 14562\nf 16417 14562 1197\nf 1225 14452 14572\nf 14452 1224 14565\nf 14572 14565 3846\nf 1201 16474 16419\nf 16474 3847 14568\nf 16419 14568 1199\nf 1201 16420 16474\nf 16420 1203 14574\nf 16474 14574 3847\nf 1222 16475 14583\nf 16475 1225 14577\nf 14583 14577 3849\nf 1205 14585 8396\nf 14585 2681 14579\nf 8396 14579 1203\nf 3849 16476 14581\nf 16476 3850 14586\nf 14581 14586 1223\nf 3851 14584 14590\nf 14584 1205 8402\nf 14590 8402 1207\nf 2682 14588 14592\nf 14588 1207 8408\nf 14592 8408 1209\nf 3854 16477 14594\nf 16477 3852 16478\nf 14594 16478 2683\nf 3853 14591 14597\nf 14591 1209 8414\nf 14597 8414 1211\nf 3856 16479 16481\nf 16479 1220 16480\nf 16481 16480 3854\nf 3855 14596 14599\nf 14596 1211 8420\nf 14599 8420 1212\nf 3858 16482 14601\nf 16482 3856 16483\nf 14601 16483 2685\nf 3857 14598 14604\nf 14598 1212 8425\nf 14604 8425 1213\nf 3858 8530 16482\nf 8530 1218 16484\nf 16482 16484 3856\nf 3859 14603 16485\nf 14603 1213 8431\nf 16485 8431 1056\nf 3860 14607 14605\nf 14607 1216 14417\nf 14605 14417 1217\nf 3859 16485 8536\nf 16485 1056 8105\nf 8536 8105 1055\nf 2689 14611 14612\nf 14611 3861 16486\nf 14612 16486 2688\nf 4754 16487 14617\nf 16487 3862 14619\nf 14617 14619 2691\nf 3863 16488 16489\nf 16488 3864 14625\nf 16489 14625 2692\nf 2692 14624 16490\nf 14624 3865 14631\nf 16490 14631 2693\nf 2693 14630 16491\nf 14630 3866 14637\nf 16491 14637 2694\nf 2694 14636 16492\nf 14636 3867 14643\nf 16492 14643 2695\nf 2695 14642 16493\nf 14642 3868 14649\nf 16493 14649 2696\nf 2696 14648 16494\nf 14648 3869 14655\nf 16494 14655 2697\nf 2697 14654 16495\nf 14654 3870 14661\nf 16495 14661 2698\nf 2698 14660 16496\nf 14660 3871 14667\nf 16496 14667 2699\nf 2699 14666 16497\nf 14666 3872 14673\nf 16497 14673 2700\nf 2700 14672 16498\nf 14672 3873 14679\nf 16498 14679 2701\nf 2701 14678 16499\nf 14678 3874 14685\nf 16499 14685 2702\nf 2702 14684 16500\nf 14684 3875 8555\nf 16500 8555 2703\nf 3876 16501 16502\nf 16501 1248 14701\nf 16502 14701 2705\nf 2707 14711 14708\nf 14711 1030 16503\nf 14708 16503 1029\nf 1066 16504 16505\nf 16504 3878 8565\nf 16505 8565 3879\nf 3878 16504 16507\nf 16504 1066 16506\nf 16507 16506 1249\nf 3879 8564 8568\nf 8564 2708 14713\nf 8568 14713 2482\nf 4769 14720 16508\nf 14720 3880 14724\nf 16508 14724 2709\nf 2709 16509 16510\nf 16509 3882 14730\nf 16510 14730 2710\nf 3882 16509 8572\nf 16509 2709 14723\nf 8572 14723 3881\nf 2710 14729 16511\nf 14729 3883 14736\nf 16511 14736 2711\nf 2711 14735 16512\nf 14735 3884 14742\nf 16512 14742 2712\nf 2712 14741 16513\nf 14741 3885 14748\nf 16513 14748 2713\nf 2713 14747 16514\nf 14747 3886 14754\nf 16514 14754 2714\nf 2714 14753 16515\nf 14753 3887 14760\nf 16515 14760 2715\nf 2715 14759 16516\nf 14759 3888 14766\nf 16516 14766 2716\nf 2716 14765 16517\nf 14765 3889 14772\nf 16517 14772 2717\nf 2717 14771 16518\nf 14771 3890 14778\nf 16518 14778 2718\nf 2718 14777 16520\nf 14777 3891 16519\nf 16520 16519 2719\nf 2719 16521 16522\nf 16521 5325 14784\nf 16522 14784 5844\nf 3893 16523 16524\nf 16523 2720 14789\nf 16524 14789 1110\nf 3893 14796 16525\nf 14796 3894 8573\nf 16525 8573 2721\nf 2721 8575 16526\nf 8575 3895 14812\nf 16526 14812 2722\nf 2722 14811 16527\nf 14811 3896 14818\nf 16527 14818 2723\nf 2723 16528 16530\nf 16528 3897 16529\nf 16530 16529 5836\nf 2454 13480 16532\nf 13480 3898 16531\nf 16532 16531 2725\nf 3899 14828 8580\nf 14828 2725 16531\nf 8580 16531 3898\nf 2725 14827 16533\nf 14827 3900 14834\nf 16533 14834 2726\nf 2726 14833 16534\nf 14833 3901 14840\nf 16534 14840 2727\nf 2727 14839 16535\nf 14839 3902 14846\nf 16535 14846 2728\nf 2728 14845 16536\nf 14845 3903 14852\nf 16536 14852 2729\nf 2729 14851 16537\nf 14851 3904 14858\nf 16537 14858 2730\nf 2730 14857 16538\nf 14857 3905 14864\nf 16538 14864 2731\nf 2731 14863 16539\nf 14863 3906 14870\nf 16539 14870 2732\nf 2732 14869 16540\nf 14869 3907 14876\nf 16540 14876 2733\nf 2733 14875 16541\nf 14875 3908 14882\nf 16541 14882 2734\nf 2734 14881 16542\nf 14881 3909 14888\nf 16542 14888 2735\nf 2735 14887 16543\nf 14887 3910 14894\nf 16543 14894 2736\nf 2736 14893 16545\nf 14893 3911 16544\nf 16545 16544 2737\nf 2738 16546 14901\nf 16546 5810 14688\nf 14901 14688 1245\nf 3912 14904 16547\nf 14904 1247 14907\nf 16547 14907 4799\nf 4799 14906 16548\nf 14906 4768 14698\nf 16548 14698 1249\nf 1249 14912 16548\nf 14912 3913 8591\nf 16548 8591 4799\nf 3916 16549 14914\nf 16549 3914 14908\nf 14914 14908 3913\nf 3915 14910 14917\nf 14910 1249 16506\nf 14917 16506 1066\nf 3918 16550 16551\nf 16550 3916 14913\nf 16551 14913 3915\nf 3917 14915 13570\nf 14915 1066 16505\nf 13570 16505 3879\nf 3919 14919 13563\nf 14919 2741 14922\nf 13563 14922 2481\n\nusemtl material_0\nf 2 16552 9680\nf 16552 2763 9059\nf 9680 9059 3\nf 2763 16552 14956\nf 16552 2 9077\nf 14956 9077 1250\nf 3921 16553 16555\nf 16553 4 16554\nf 16555 16554 5515\nf 4 16553 16556\nf 16553 3921 8612\nf 16556 8612 2762\nf 3 9061 16558\nf 9061 3922 16557\nf 16558 16557 5\nf 6 16559 16561\nf 16559 3923 16560\nf 16561 16560 5515\nf 5 16562 16564\nf 16562 3924 16563\nf 16564 16563 7\nf 8 16565 16567\nf 16565 3925 16566\nf 16567 16566 6\nf 9 9030 16569\nf 9030 1251 16568\nf 16569 16568 10\nf 52 16570 6392\nf 16570 1268 16571\nf 6392 16571 49\nf 3926 8664 16572\nf 8664 66 11054\nf 16572 11054 1271\nf 3966 16573 16574\nf 16573 1602 15307\nf 16574 15307 1272\nf 2743 15029 8677\nf 15029 1275 10115\nf 8677 10115 69\nf 2748 14928 8699\nf 14928 1279 8702\nf 8699 8702 84\nf 91 8712 16576\nf 8712 3928 16575\nf 16576 16575 93\nf 93 16575 15855\nf 16575 3928 8718\nf 15855 8718 92\nf 1285 8717 14927\nf 8717 3928 8710\nf 14927 8710 1284\nf 1312 6257 8824\nf 6257 1324 6261\nf 8824 6261 1314\nf 1285 8843 8715\nf 8843 96 6274\nf 8715 6274 95\nf 2747 6275 16577\nf 6275 94 8849\nf 16577 8849 171\nf 171 8853 16577\nf 8853 1332 8846\nf 16577 8846 2747\nf 1332 8855 8851\nf 8855 3929 8859\nf 8851 8859 1333\nf 3929 16578 8860\nf 16578 172 16579\nf 8860 16579 1334\nf 1334 16580 6284\nf 16580 3930 8864\nf 6284 8864 1335\nf 3930 16580 8862\nf 16580 1334 16579\nf 8862 16579 172\nf 3930 16581 8865\nf 16581 173 8866\nf 8865 8866 1336\nf 1336 8868 6290\nf 8868 3931 8872\nf 6290 8872 1337\nf 3931 8869 8875\nf 8869 2755 16582\nf 8875 16582 1339\nf 1290 8874 6105\nf 8874 3932 8879\nf 6105 8879 2746\nf 3932 6293 6295\nf 6293 1338 8884\nf 6295 8884 1340\nf 3934 16583 8919\nf 16583 3933 16584\nf 8919 16584 1279\nf 3933 8915 16584\nf 8915 1590 8703\nf 16584 8703 1279\nf 88 16585 8708\nf 16585 3934 16586\nf 8708 16586 90\nf 3935 8927 8918\nf 8927 90 16586\nf 8918 16586 3934\nf 3934 16585 16583\nf 16585 88 8913\nf 16583 8913 3933\nf 179 16587 16589\nf 16587 2749 16588\nf 16589 16588 83\nf 2748 6069 8923\nf 6069 83 16588\nf 8923 16588 2749\nf 2745 6087 16591\nf 6087 3936 16590\nf 16591 16590 3938\nf 3937 16592 8926\nf 16592 3938 16590\nf 8926 16590 3936\nf 1357 16593 16594\nf 16593 3937 8925\nf 16594 8925 3935\nf 3935 8917 16594\nf 8917 1356 14929\nf 16594 14929 1357\nf 180 16595 16597\nf 16595 2750 16596\nf 16597 16596 179\nf 2749 16587 8930\nf 16587 179 16596\nf 8930 16596 2750\nf 2745 16591 6277\nf 16591 3938 16598\nf 6277 16598 94\nf 3939 8940 8933\nf 8940 94 16598\nf 8933 16598 3938\nf 1358 8931 16599\nf 8931 3938 16592\nf 16599 16592 3937\nf 3937 16593 16599\nf 16593 1357 14930\nf 16599 14930 1358\nf 181 16600 16602\nf 16600 2751 16601\nf 16602 16601 180\nf 2750 16595 8936\nf 16595 180 16601\nf 8936 16601 2751\nf 3939 8932 8938\nf 8932 1358 14931\nf 8938 14931 1359\nf 182 16603 16605\nf 16603 2752 16604\nf 16605 16604 181\nf 2751 16600 8943\nf 16600 181 16604\nf 8943 16604 2752\nf 3929 8856 16578\nf 8856 3941 16606\nf 16578 16606 172\nf 3942 8951 8946\nf 8951 172 16606\nf 8946 16606 3941\nf 1360 8944 16607\nf 8944 3941 8947\nf 16607 8947 3940\nf 3940 8939 16607\nf 8939 1359 14933\nf 16607 14933 1360\nf 183 16608 16610\nf 16608 2753 16609\nf 16610 16609 182\nf 2752 16603 16612\nf 16603 182 16611\nf 16612 16611 5921\nf 3943 8959 8861\nf 8959 173 16581\nf 8861 16581 3930\nf 1361 16613 8954\nf 16613 3943 8952\nf 8954 8952 3942\nf 184 16614 16616\nf 16614 2754 16615\nf 16616 16615 183\nf 2753 16608 16617\nf 16608 183 16615\nf 16617 16615 2754\nf 173 8958 8870\nf 8958 3944 8957\nf 8870 8957 2755\nf 1362 8955 14936\nf 8955 3944 16618\nf 14936 16618 1361\nf 3943 16613 8960\nf 16613 1361 16618\nf 8960 16618 3944\nf 1362 8961 14939\nf 8961 3945 16619\nf 14939 16619 1363\nf 185 16620 16622\nf 16620 3945 16621\nf 16622 16621 184\nf 2754 16614 8963\nf 16614 184 16621\nf 8963 16621 3945\nf 3945 16620 16623\nf 16620 185 8969\nf 16623 8969 3946\nf 1363 16624 16625\nf 16624 3947 8972\nf 16625 8972 1364\nf 3947 16624 8967\nf 16624 1363 16626\nf 8967 16626 3946\nf 3946 16626 16623\nf 16626 1363 16619\nf 16623 16619 3945\nf 3947 8966 16627\nf 8966 186 8980\nf 16627 8980 3948\nf 3949 16628 8978\nf 16628 1365 16629\nf 8978 16629 3948\nf 3948 16629 16627\nf 16629 1365 8973\nf 16627 8973 3947\nf 3949 16630 16628\nf 16630 1366 6334\nf 16628 6334 1365\nf 3951 16631 16632\nf 16631 1367 8982\nf 16632 8982 3950\nf 3949 8984 16630\nf 8984 3950 8981\nf 16630 8981 1366\nf 1367 16631 6341\nf 16631 3951 16633\nf 6341 16633 1368\nf 188 8988 16634\nf 8988 1368 16633\nf 16634 16633 3951\nf 1369 8987 6347\nf 8987 3952 8992\nf 6347 8992 1370\nf 2875 16635 16636\nf 16635 3952 8986\nf 16636 8986 188\nf 1371 8998 8996\nf 8998 3953 8999\nf 8996 8999 1372\nf 3953 8993 9000\nf 8993 2877 9001\nf 9000 9001 1373\nf 1373 9003 9004\nf 9003 190 9006\nf 9004 9006 1375\nf 1377 16637 16639\nf 16637 192 16638\nf 16639 16638 2836\nf 194 16640 9124\nf 16640 2835 16641\nf 9124 16641 193\nf 2757 6365 15064\nf 6365 193 16641\nf 15064 16641 2835\nf 10 16642 16644\nf 16642 3954 16643\nf 16644 16643 191\nf 192 16645 16647\nf 16645 1379 16646\nf 16647 16646 8\nf 1379 16645 16648\nf 16645 192 16637\nf 16648 16637 1377\nf 3955 16649 9012\nf 16649 1378 14943\nf 9012 14943 2756\nf 3955 9014 9021\nf 9014 192 16647\nf 9021 16647 8\nf 2758 14942 6369\nf 14942 1378 14944\nf 6369 14944 2759\nf 1377 9634 16648\nf 9634 3954 9017\nf 16648 9017 1379\nf 3954 16642 9018\nf 16642 10 16568\nf 9018 16568 1251\nf 3925 16565 14949\nf 16565 8 16646\nf 14949 16646 1379\nf 1251 16650 14948\nf 16650 1381 9034\nf 14948 9034 3925\nf 3955 9023 16649\nf 9023 1380 14945\nf 16649 14945 1378\nf 1380 9024 14947\nf 9024 3956 9040\nf 14947 9040 1382\nf 3956 9022 9038\nf 9022 8 16567\nf 9038 16567 6\nf 195 6370 16652\nf 6370 2759 16651\nf 16652 16651 196\nf 2760 16653 9027\nf 16653 196 16651\nf 9027 16651 2759\nf 1251 9029 16650\nf 9029 3957 9031\nf 16650 9031 1381\nf 3957 16654 9032\nf 16654 7 16563\nf 9032 16563 3924\nf 7 16654 16655\nf 16654 3957 9028\nf 16655 9028 9\nf 3923 16559 9036\nf 16559 6 16566\nf 9036 16566 3925\nf 1382 9041 14950\nf 9041 3958 9054\nf 14950 9054 1384\nf 3958 9039 9052\nf 9039 6 16561\nf 9052 16561 5515\nf 196 16653 16657\nf 16653 2760 16656\nf 16657 16656 197\nf 2761 16658 9044\nf 16658 197 16656\nf 9044 16656 2760\nf 1381 9033 14951\nf 9033 3924 9045\nf 14951 9045 1383\nf 3924 16562 9046\nf 16562 5 16557\nf 9046 16557 3922\nf 3921 16555 9050\nf 16555 5515 16560\nf 9050 16560 3923\nf 1385 8613 14953\nf 8613 3921 9049\nf 14953 9049 1383\nf 1384 9055 14954\nf 9055 3959 9067\nf 14954 9067 1386\nf 4 9066 16554\nf 9066 3959 9053\nf 16554 9053 5515\nf 197 16658 16660\nf 16658 2761 16659\nf 16660 16659 198\nf 2764 16661 9058\nf 16661 198 16659\nf 9058 16659 2761\nf 2763 14955 9060\nf 14955 1385 14952\nf 9060 14952 3922\nf 4 16556 16663\nf 16556 2762 16662\nf 16663 16662 1\nf 3920 8609 9063\nf 8609 1 16662\nf 9063 16662 2762\nf 1250 14962 14957\nf 14962 3920 9062\nf 14957 9062 1385\nf 3960 9064 9080\nf 9064 4 16663\nf 9080 16663 1\nf 1386 9068 14958\nf 9068 3960 16664\nf 14958 16664 1389\nf 198 16661 16666\nf 16661 2764 16665\nf 16666 16665 199\nf 2767 16667 9071\nf 16667 199 16665\nf 9071 16665 2764\nf 201 16668 9087\nf 16668 2765 9088\nf 9087 9088 65\nf 200 16669 16671\nf 16669 2768 16670\nf 16671 16670 3961\nf 2768 14968 16670\nf 14968 1387 16672\nf 16670 16672 3961\nf 2765 16668 14959\nf 16668 201 16673\nf 14959 16673 3962\nf 200 16671 6373\nf 16671 3961 14966\nf 6373 14966 2766\nf 1388 14965 9073\nf 14965 3961 16672\nf 9073 16672 1387\nf 2766 9075 6371\nf 9075 2 9670\nf 6371 9670 202\nf 1388 14960 14961\nf 14960 3962 8610\nf 14961 8610 3920\nf 3963 16674 9079\nf 16674 1389 16664\nf 9079 16664 3960\nf 3963 9078 16675\nf 9078 1 8608\nf 16675 8608 3962\nf 1389 16674 14967\nf 16674 3963 16676\nf 14967 16676 1390\nf 201 16677 16673\nf 16677 3963 16675\nf 16673 16675 3962\nf 3963 16677 16676\nf 16677 201 9084\nf 16676 9084 1390\nf 3964 16678 16679\nf 16678 199 16667\nf 16679 16667 2767\nf 3964 16679 8668\nf 16679 2767 9083\nf 8668 9083 1391\nf 1390 9086 9082\nf 9086 3926 16680\nf 9082 16680 1391\nf 1391 16680 6061\nf 16680 3926 16572\nf 6061 16572 1271\nf 1387 16681 9074\nf 16681 3965 9089\nf 9074 9089 2765\nf 3965 16681 14970\nf 16681 1387 14969\nf 14970 14969 1392\nf 1392 9090 14971\nf 9090 3966 16574\nf 14971 16574 1272\nf 67 10131 8670\nf 10131 1602 16573\nf 8670 16573 3966\nf 2768 16669 16683\nf 16669 200 16682\nf 16683 16682 5516\nf 2769 9109 9112\nf 9109 1395 16684\nf 9112 16684 52\nf 1268 16570 6005\nf 16570 52 16684\nf 6005 16684 1395\nf 208 6384 9576\nf 6384 1396 9117\nf 9576 9117 1487\nf 2770 14973 9120\nf 14973 194 9123\nf 9120 9123 1398\nf 1398 9122 16685\nf 9122 193 9130\nf 16685 9130 3967\nf 3967 16686 16685\nf 16686 1400 9128\nf 16685 9128 1398\nf 1400 16687 14975\nf 16687 3968 16688\nf 14975 16688 1401\nf 3968 16687 9133\nf 16687 1400 16686\nf 9133 16686 3967\nf 196 9134 16652\nf 9134 3968 9132\nf 16652 9132 195\nf 1401 16688 16689\nf 16688 3968 9136\nf 16689 9136 3969\nf 3969 16690 16689\nf 16690 1402 6398\nf 16689 6398 1401\nf 197 9137 16657\nf 9137 3969 9135\nf 16657 9135 196\nf 1402 16690 14976\nf 16690 3969 16691\nf 14976 16691 1403\nf 3970 16692 9139\nf 16692 1403 16691\nf 9139 16691 3969\nf 198 16693 16660\nf 16693 3970 9138\nf 16660 9138 197\nf 205 6402 9107\nf 6402 2772 6403\nf 9107 6403 204\nf 1403 16692 14980\nf 16692 3970 9141\nf 14980 9141 1404\nf 199 9143 16666\nf 9143 3971 16694\nf 16666 16694 198\nf 3970 16693 9142\nf 16693 198 16694\nf 9142 16694 3971\nf 5814 16695 6410\nf 16695 1404 16696\nf 6410 16696 1405\nf 1404 9140 16696\nf 9140 3971 16697\nf 16696 16697 1405\nf 3972 9147 9145\nf 9147 1405 16697\nf 9145 16697 3971\nf 3964 16698 16678\nf 16698 3972 9144\nf 16678 9144 199\nf 3972 16698 9148\nf 16698 3964 16699\nf 9148 16699 3973\nf 1405 9146 6411\nf 9146 3973 16700\nf 6411 16700 1406\nf 203 6406 9102\nf 6406 5814 16701\nf 9102 16701 63\nf 3973 16699 16702\nf 16699 3964 8669\nf 16702 8669 64\nf 3974 8682 16703\nf 8682 1597 6413\nf 16703 6413 1407\nf 74 9149 9152\nf 9149 3974 16704\nf 9152 16704 3975\nf 1408 16705 14982\nf 16705 3974 16703\nf 14982 16703 1407\nf 210 16706 16707\nf 16706 2774 6064\nf 16707 6064 72\nf 209 9150 16708\nf 9150 3975 9157\nf 16708 9157 211\nf 1409 16709 14983\nf 16709 3975 16710\nf 14983 16710 1408\nf 3974 16705 16704\nf 16705 1408 16710\nf 16704 16710 3975\nf 212 16711 16713\nf 16711 2775 16712\nf 16713 16712 210\nf 2774 16706 9155\nf 16706 210 16712\nf 9155 16712 2775\nf 211 9156 16714\nf 9156 3976 9163\nf 16714 9163 213\nf 1410 16715 14984\nf 16715 3976 16716\nf 14984 16716 1409\nf 3975 16709 9158\nf 16709 1409 16716\nf 9158 16716 3976\nf 214 16717 16719\nf 16717 2776 16718\nf 16719 16718 212\nf 2775 16711 9161\nf 16711 212 16718\nf 9161 16718 2776\nf 213 9162 16720\nf 9162 3977 9169\nf 16720 9169 215\nf 1411 16721 14985\nf 16721 3977 16722\nf 14985 16722 1410\nf 3976 16715 9164\nf 16715 1410 16722\nf 9164 16722 3977\nf 216 16723 16725\nf 16723 2777 16724\nf 16725 16724 214\nf 2776 16717 9167\nf 16717 214 16724\nf 9167 16724 2777\nf 215 9168 16726\nf 9168 3978 9175\nf 16726 9175 217\nf 1412 16727 14986\nf 16727 3978 16728\nf 14986 16728 1411\nf 3977 16721 9170\nf 16721 1411 16728\nf 9170 16728 3978\nf 218 16729 16731\nf 16729 2778 16730\nf 16731 16730 216\nf 2777 16723 9173\nf 16723 216 16730\nf 9173 16730 2778\nf 217 16732 16733\nf 16732 2779 9183\nf 16733 9183 219\nf 2779 16732 14989\nf 16732 217 9174\nf 14989 9174 1413\nf 3978 16727 9176\nf 16727 1412 14987\nf 9176 14987 1413\nf 1413 9180 14990\nf 9180 3979 14991\nf 14990 14991 1414\nf 218 9177 16734\nf 9177 2780 14993\nf 16734 14993 3979\nf 2778 16729 9182\nf 16729 218 16734\nf 9182 16734 3979\nf 4951 16735 16736\nf 16735 1414 9187\nf 16736 9187 2781\nf 2781 16737 16736\nf 16737 221 16738\nf 16736 16738 4951\nf 2814 16739 16740\nf 16739 2780 9179\nf 16740 9179 220\nf 221 16741 10014\nf 16741 2782 16742\nf 10014 16742 4098\nf 2782 16741 14994\nf 16741 221 16737\nf 14994 16737 2781\nf 3980 16743 9193\nf 16743 2781 9186\nf 9193 9186 1415\nf 2781 16743 14995\nf 16743 3980 16744\nf 14995 16744 1416\nf 223 9197 16745\nf 9197 3980 9192\nf 16745 9192 222\nf 224 16746 16747\nf 16746 2782 9196\nf 16747 9196 2783\nf 2782 16746 16742\nf 16746 224 16748\nf 16742 16748 4098\nf 1416 16749 14996\nf 16749 3981 16750\nf 14996 16750 1417\nf 3981 16749 9199\nf 16749 1416 16744\nf 9199 16744 3980\nf 225 9203 16751\nf 9203 3981 9198\nf 16751 9198 223\nf 224 16752 16754\nf 16752 2784 16753\nf 16754 16753 226\nf 2784 16752 9202\nf 16752 224 16747\nf 9202 16747 2783\nf 1417 16755 14997\nf 16755 3982 16756\nf 14997 16756 1418\nf 3982 16755 9205\nf 16755 1417 16750\nf 9205 16750 3981\nf 227 9209 16757\nf 9209 3982 9204\nf 16757 9204 225\nf 226 16758 16760\nf 16758 2785 16759\nf 16760 16759 228\nf 2785 16758 9208\nf 16758 226 16753\nf 9208 16753 2784\nf 1418 16761 14998\nf 16761 3983 16762\nf 14998 16762 1419\nf 3983 16761 9211\nf 16761 1418 16756\nf 9211 16756 3982\nf 229 9215 16763\nf 9215 3983 9210\nf 16763 9210 227\nf 228 16764 16766\nf 16764 2786 16765\nf 16766 16765 230\nf 2786 16764 9214\nf 16764 228 16759\nf 9214 16759 2785\nf 1419 16767 14999\nf 16767 3984 16768\nf 14999 16768 1420\nf 3984 16767 9217\nf 16767 1419 16762\nf 9217 16762 3983\nf 231 9221 16769\nf 9221 3984 9216\nf 16769 9216 229\nf 230 16770 16772\nf 16770 2787 16771\nf 16772 16771 232\nf 2787 16770 9220\nf 16770 230 16765\nf 9220 16765 2786\nf 1420 16773 15000\nf 16773 3985 16774\nf 15000 16774 1421\nf 3985 16773 9223\nf 16773 1420 16768\nf 9223 16768 3984\nf 233 9227 16775\nf 9227 3985 9222\nf 16775 9222 231\nf 232 16776 16778\nf 16776 2788 16777\nf 16778 16777 5326\nf 2788 16776 9226\nf 16776 232 16771\nf 9226 16771 2787\nf 1421 16779 15001\nf 16779 3986 16780\nf 15001 16780 1422\nf 3986 16779 9229\nf 16779 1421 16774\nf 9229 16774 3985\nf 234 9233 16781\nf 9233 3986 9228\nf 16781 9228 233\nf 235 10048 9232\nf 10048 5326 16777\nf 9232 16777 2788\nf 1422 16782 15002\nf 16782 3987 16783\nf 15002 16783 1423\nf 3987 16782 9235\nf 16782 1422 16780\nf 9235 16780 3986\nf 236 9239 16784\nf 9239 3987 9234\nf 16784 9234 234\nf 1423 16785 15004\nf 16785 3988 16786\nf 15004 16786 2789\nf 3988 16785 9241\nf 16785 1423 16783\nf 9241 16783 3987\nf 238 9242 16787\nf 9242 3988 9240\nf 16787 9240 236\nf 237 15003 16788\nf 15003 2789 9245\nf 16788 9245 4104\nf 1424 6417 9244\nf 6417 2789 16786\nf 9244 16786 3988\nf 3989 16789 16790\nf 16789 1424 9243\nf 16790 9243 238\nf 4104 9246 10065\nf 9246 2790 9250\nf 10065 9250 239\nf 1424 16789 15005\nf 16789 3989 9252\nf 15005 9252 1425\nf 1425 9253 6422\nf 9253 3990 9259\nf 6422 9259 1426\nf 241 9256 16791\nf 9256 3990 9247\nf 16791 9247 240\nf 1426 9260 6425\nf 9260 3991 16792\nf 6425 16792 1427\nf 3991 6426 16792\nf 6426 1428 9265\nf 16792 9265 1427\nf 2791 15006 9270\nf 15006 1429 6429\nf 9270 6429 1299\nf 3992 9274 10112\nf 9274 71 16793\nf 10112 16793 2743\nf 71 9273 16794\nf 9273 3993 9280\nf 16794 9280 243\nf 1600 16795 7040\nf 16795 3993 9275\nf 7040 9275 3992\nf 3993 16795 16796\nf 16795 1600 15007\nf 16796 15007 1431\nf 244 16797 16799\nf 16797 2792 16798\nf 16799 16798 68\nf 1274 10120 9278\nf 10120 68 16798\nf 9278 16798 2792\nf 243 9279 16800\nf 9279 3994 9286\nf 16800 9286 245\nf 1432 16801 15008\nf 16801 3994 16802\nf 15008 16802 1431\nf 3993 16796 9281\nf 16796 1431 16802\nf 9281 16802 3994\nf 246 16803 16805\nf 16803 2793 16804\nf 16805 16804 244\nf 2792 16797 9284\nf 16797 244 16804\nf 9284 16804 2793\nf 245 9285 16806\nf 9285 3995 9292\nf 16806 9292 247\nf 1433 16807 15009\nf 16807 3995 16808\nf 15009 16808 1432\nf 3994 16801 9287\nf 16801 1432 16808\nf 9287 16808 3995\nf 249 16809 16811\nf 16809 2794 16810\nf 16811 16810 246\nf 2793 16803 9290\nf 16803 246 16810\nf 9290 16810 2794\nf 247 9291 16812\nf 9291 3996 9298\nf 16812 9298 248\nf 1434 16813 15010\nf 16813 3996 16814\nf 15010 16814 1433\nf 3995 16807 9293\nf 16807 1433 16814\nf 9293 16814 3996\nf 2794 16809 9296\nf 16809 249 16815\nf 9296 16815 2795\nf 248 9297 16816\nf 9297 3997 9303\nf 16816 9303 250\nf 1435 16817 15011\nf 16817 3997 16818\nf 15011 16818 1434\nf 3996 16813 9299\nf 16813 1434 16818\nf 9299 16818 3997\nf 2795 16819 9302\nf 16819 251 16820\nf 9302 16820 3998\nf 251 16819 9662\nf 16819 2795 16815\nf 9662 16815 249\nf 252 16821 9312\nf 16821 1435 9307\nf 9312 9307 2796\nf 1435 16821 16817\nf 16821 252 9304\nf 16817 9304 3997\nf 253 9311 9673\nf 9311 3998 16820\nf 9673 16820 251\nf 2796 9306 15012\nf 9306 1436 16822\nf 15012 16822 1437\nf 3999 16823 16824\nf 16823 1437 16822\nf 16824 16822 1436\nf 253 9314 9309\nf 9314 3999 16824\nf 9309 16824 1436\nf 254 6434 16826\nf 6434 2797 16825\nf 16826 16825 256\nf 1437 16823 15014\nf 16823 3999 9318\nf 15014 9318 1438\nf 257 16827 16828\nf 16827 3999 9316\nf 16828 9316 255\nf 3999 16827 9319\nf 16827 257 16829\nf 9319 16829 4000\nf 256 16830 16832\nf 16830 2798 16831\nf 16832 16831 258\nf 2798 16830 9322\nf 16830 256 16825\nf 9322 16825 2797\nf 1438 9317 15015\nf 9317 4000 16833\nf 15015 16833 1439\nf 259 9326 16834\nf 9326 4000 16829\nf 16834 16829 257\nf 258 16835 16837\nf 16835 2799 16836\nf 16837 16836 260\nf 2799 16835 9325\nf 16835 258 16831\nf 9325 16831 2798\nf 1439 16838 15016\nf 16838 4001 16839\nf 15016 16839 1440\nf 4001 16838 9328\nf 16838 1439 16833\nf 9328 16833 4000\nf 261 9332 16840\nf 9332 4001 9327\nf 16840 9327 259\nf 260 16841 16843\nf 16841 2800 16842\nf 16843 16842 262\nf 2800 16841 9331\nf 16841 260 16836\nf 9331 16836 2799\nf 1440 16844 15017\nf 16844 4002 16845\nf 15017 16845 1441\nf 4002 16844 9334\nf 16844 1440 16839\nf 9334 16839 4001\nf 4003 16846 16847\nf 16846 4002 9333\nf 16847 9333 261\nf 262 16848 16850\nf 16848 2801 16849\nf 16850 16849 263\nf 2801 16848 9337\nf 16848 262 16842\nf 9337 16842 2800\nf 1441 16851 15018\nf 16851 4003 16852\nf 15018 16852 1442\nf 4003 16851 16846\nf 16851 1441 16845\nf 16846 16845 4002\nf 263 16853 16855\nf 16853 2802 16854\nf 16855 16854 265\nf 2802 16853 9340\nf 16853 263 16849\nf 9340 16849 2801\nf 1442 16856 15019\nf 16856 4004 16857\nf 15019 16857 1443\nf 4004 16856 9343\nf 16856 1442 16852\nf 9343 16852 4003\nf 266 9347 16858\nf 9347 4004 9342\nf 16858 9342 264\nf 265 16859 16861\nf 16859 2803 16860\nf 16861 16860 267\nf 2803 16859 9346\nf 16859 265 16854\nf 9346 16854 2802\nf 1443 16862 15020\nf 16862 4005 16863\nf 15020 16863 1444\nf 4005 16862 9349\nf 16862 1443 16857\nf 9349 16857 4004\nf 268 9353 16864\nf 9353 4005 9348\nf 16864 9348 266\nf 267 16865 16867\nf 16865 2804 16866\nf 16867 16866 269\nf 2804 16865 9352\nf 16865 267 16860\nf 9352 16860 2803\nf 1444 16868 15021\nf 16868 4006 16869\nf 15021 16869 1445\nf 4006 16868 9355\nf 16868 1444 16863\nf 9355 16863 4005\nf 270 9359 16870\nf 9359 4006 9354\nf 16870 9354 268\nf 269 16871 16873\nf 16871 2805 16872\nf 16873 16872 4027\nf 2805 16871 9358\nf 16871 269 16866\nf 9358 16866 2804\nf 1445 16874 15022\nf 16874 4007 16875\nf 15022 16875 1446\nf 4007 16874 9361\nf 16874 1445 16869\nf 9361 16869 4006\nf 271 9365 16876\nf 9365 4007 9360\nf 16876 9360 270\nf 4027 16877 9522\nf 16877 2806 16878\nf 9522 16878 4028\nf 2806 16877 9364\nf 16877 4027 16872\nf 9364 16872 2805\nf 1446 16879 15023\nf 16879 4008 16880\nf 15023 16880 1447\nf 4008 16879 9367\nf 16879 1446 16875\nf 9367 16875 4007\nf 4009 16881 16882\nf 16881 4008 9366\nf 16882 9366 271\nf 272 16883 9370\nf 16883 4028 16878\nf 9370 16878 2806\nf 1447 16884 15024\nf 16884 4009 16885\nf 15024 16885 1448\nf 4009 16884 16881\nf 16884 1447 16880\nf 16881 16880 4008\nf 1448 16886 15026\nf 16886 4010 16887\nf 15026 16887 1449\nf 4010 16886 9376\nf 16886 1448 16885\nf 9376 16885 4009\nf 275 9377 9729\nf 9377 4010 9375\nf 9729 9375 273\nf 1449 6436 15025\nf 6436 276 16888\nf 15025 16888 274\nf 1449 16887 16889\nf 16887 4010 9379\nf 16889 9379 4011\nf 277 9382 16890\nf 9382 4011 9378\nf 16890 9378 275\nf 279 9397 9553\nf 9397 2807 6441\nf 9553 6441 151\nf 2808 15028 6445\nf 15028 1452 16891\nf 6445 16891 1453\nf 160 9420 9753\nf 9420 2809 6454\nf 9753 6454 284\nf 4012 16892 9422\nf 16892 70 6629\nf 9422 6629 2900\nf 70 16892 8680\nf 16892 4012 16893\nf 8680 16893 72\nf 72 16893 16707\nf 16893 4012 9428\nf 16707 9428 210\nf 1457 16894 15030\nf 16894 4012 9421\nf 15030 9421 1275\nf 243 16895 16794\nf 16895 2810 16896\nf 16794 16896 71\nf 2743 16793 9426\nf 16793 71 16896\nf 9426 16896 2810\nf 210 9427 16713\nf 9427 4013 9434\nf 16713 9434 212\nf 1458 16897 15031\nf 16897 4013 16898\nf 15031 16898 1457\nf 4012 16894 9429\nf 16894 1457 16898\nf 9429 16898 4013\nf 245 16899 16800\nf 16899 2811 16900\nf 16800 16900 243\nf 2810 16895 9432\nf 16895 243 16900\nf 9432 16900 2811\nf 212 9433 16719\nf 9433 4014 9440\nf 16719 9440 214\nf 1459 16901 15032\nf 16901 4014 16902\nf 15032 16902 1458\nf 4013 16897 9435\nf 16897 1458 16902\nf 9435 16902 4014\nf 247 16903 16806\nf 16903 2812 16904\nf 16806 16904 245\nf 2811 16899 9438\nf 16899 245 16904\nf 9438 16904 2812\nf 214 9439 16725\nf 9439 4015 9446\nf 16725 9446 216\nf 1460 16905 15033\nf 16905 4015 16906\nf 15033 16906 1459\nf 4014 16901 9441\nf 16901 1459 16906\nf 9441 16906 4015\nf 248 16907 16812\nf 16907 2813 16908\nf 16812 16908 247\nf 2812 16903 9444\nf 16903 247 16908\nf 9444 16908 2813\nf 216 9445 16731\nf 9445 4016 9451\nf 16731 9451 218\nf 1461 15035 15034\nf 15035 4016 16909\nf 15034 16909 1460\nf 4015 16905 9447\nf 16905 1460 16909\nf 9447 16909 4016\nf 1461 9448 15036\nf 9448 1462 9455\nf 15036 9455 220\nf 250 16910 16816\nf 16910 2813 16907\nf 16816 16907 248\nf 2813 16910 9450\nf 16910 250 9456\nf 9450 9456 1462\nf 1462 9458 9453\nf 9458 4017 16911\nf 9453 16911 1463\nf 2780 16739 9191\nf 16739 2814 6459\nf 9191 6459 222\nf 1463 15037 9454\nf 15037 2814 16740\nf 9454 16740 220\nf 1463 16911 15039\nf 16911 4017 9461\nf 15039 9461 1464\nf 254 16912 9313\nf 16912 4017 9459\nf 9313 9459 252\nf 4017 16912 9462\nf 16912 254 16913\nf 9462 16913 4018\nf 222 6461 16745\nf 6461 2815 16914\nf 16745 16914 223\nf 2816 16915 9465\nf 16915 223 16914\nf 9465 16914 2815\nf 1464 9460 15040\nf 9460 4018 9467\nf 15040 9467 1465\nf 256 16916 16826\nf 16916 4018 16913\nf 16826 16913 254\nf 4018 16916 9468\nf 16916 256 16917\nf 9468 16917 4019\nf 223 16918 16751\nf 16918 2817 16919\nf 16751 16919 225\nf 2817 16918 9471\nf 16918 223 16915\nf 9471 16915 2816\nf 1465 9466 15041\nf 9466 4019 9473\nf 15041 9473 1466\nf 258 16920 16832\nf 16920 4019 16917\nf 16832 16917 256\nf 4019 16920 9474\nf 16920 258 16921\nf 9474 16921 4020\nf 225 16922 16757\nf 16922 2818 16923\nf 16757 16923 227\nf 2818 16922 9477\nf 16922 225 16919\nf 9477 16919 2817\nf 1466 9472 15042\nf 9472 4020 9479\nf 15042 9479 1467\nf 260 16924 16837\nf 16924 4020 16921\nf 16837 16921 258\nf 4020 16924 9480\nf 16924 260 16925\nf 9480 16925 4021\nf 227 16926 16763\nf 16926 2819 16927\nf 16763 16927 229\nf 2819 16926 9483\nf 16926 227 16923\nf 9483 16923 2818\nf 1467 9478 15043\nf 9478 4021 9485\nf 15043 9485 1468\nf 262 16928 16843\nf 16928 4021 16925\nf 16843 16925 260\nf 4021 16928 9486\nf 16928 262 16929\nf 9486 16929 4022\nf 229 16930 16769\nf 16930 2820 16931\nf 16769 16931 231\nf 2820 16930 9489\nf 16930 229 16927\nf 9489 16927 2819\nf 1468 9484 15044\nf 9484 4022 9491\nf 15044 9491 1469\nf 263 16932 16850\nf 16932 4022 16929\nf 16850 16929 262\nf 4022 16932 9492\nf 16932 263 16933\nf 9492 16933 4023\nf 231 16934 16775\nf 16934 2821 16935\nf 16775 16935 233\nf 2821 16934 9495\nf 16934 231 16931\nf 9495 16931 2820\nf 1469 9490 15045\nf 9490 4023 9497\nf 15045 9497 1470\nf 265 16936 16855\nf 16936 4023 16933\nf 16855 16933 263\nf 4023 16936 9498\nf 16936 265 16937\nf 9498 16937 4024\nf 233 16938 16781\nf 16938 2822 16939\nf 16781 16939 234\nf 2822 16938 9501\nf 16938 233 16935\nf 9501 16935 2821\nf 1470 9496 15046\nf 9496 4024 9503\nf 15046 9503 1471\nf 267 16940 16861\nf 16940 4024 16937\nf 16861 16937 265\nf 4024 16940 9504\nf 16940 267 16941\nf 9504 16941 4025\nf 234 16942 16784\nf 16942 2823 16943\nf 16784 16943 236\nf 2823 16942 9507\nf 16942 234 16939\nf 9507 16939 2822\nf 1471 9502 15047\nf 9502 4025 9509\nf 15047 9509 1472\nf 269 16944 16867\nf 16944 4025 16941\nf 16867 16941 267\nf 4025 16944 9510\nf 16944 269 16945\nf 9510 16945 4026\nf 236 16946 16787\nf 16946 2824 16947\nf 16787 16947 238\nf 2824 16946 9513\nf 16946 236 16943\nf 9513 16943 2823\nf 1472 9508 15048\nf 9508 4026 9515\nf 15048 9515 1473\nf 4027 9516 16873\nf 9516 4026 16945\nf 16873 16945 269\nf 238 16948 16790\nf 16948 2825 16949\nf 16790 16949 3989\nf 2825 16948 9519\nf 16948 238 16947\nf 9519 16947 2824\nf 1473 9514 15049\nf 9514 4027 9521\nf 15049 9521 1474\nf 240 9249 9525\nf 9249 3989 16949\nf 9525 16949 2825\nf 1474 9520 15050\nf 9520 4028 9527\nf 15050 9527 1475\nf 4028 16883 9528\nf 16883 272 16950\nf 9528 16950 4029\nf 240 9531 16791\nf 9531 2826 16951\nf 16791 16951 241\nf 1475 9526 15051\nf 9526 4029 9538\nf 15051 9538 1476\nf 274 9534 9373\nf 9534 4029 16950\nf 9373 16950 272\nf 241 16951 9261\nf 16951 2826 16952\nf 9261 16952 242\nf 2827 9543 9537\nf 9543 242 16952\nf 9537 16952 2826\nf 1476 9539 15052\nf 9539 4030 9544\nf 15052 9544 1477\nf 276 9542 16888\nf 9542 4030 9532\nf 16888 9532 274\nf 1477 9545 6465\nf 9545 4031 9546\nf 6465 9546 1478\nf 4954 9547 9383\nf 9547 4031 9540\nf 9383 9540 276\nf 43 16953 16955\nf 16953 5812 16954\nf 16955 16954 42\nf 2829 9570 9569\nf 9570 4055 16956\nf 9569 16956 4032\nf 1484 9586 15054\nf 9586 4033 16957\nf 15054 16957 1485\nf 2829 15053 6480\nf 15053 1485 16958\nf 6480 16958 1486\nf 1485 16959 16958\nf 16959 4034 16960\nf 16958 16960 1486\nf 5969 16961 9574\nf 16961 1485 16957\nf 9574 16957 4033\nf 289 16962 16964\nf 16962 5957 16963\nf 16964 16963 5969\nf 2833 6496 9579\nf 6496 208 6027\nf 9579 6027 48\nf 292 9631 16966\nf 9631 4035 16965\nf 16966 16965 294\nf 2836 16967 15057\nf 16967 4036 9581\nf 15057 9581 1489\nf 295 16968 16969\nf 16968 4037 9582\nf 16969 9582 4036\nf 4036 16970 16969\nf 16970 293 9627\nf 16969 9627 295\nf 294 16965 16972\nf 16965 4035 16971\nf 16972 16971 296\nf 1489 9583 15055\nf 9583 296 16971\nf 15055 16971 4035\nf 1489 9580 9584\nf 9580 4037 16973\nf 9584 16973 1490\nf 297 9609 16974\nf 9609 4037 16968\nf 16974 16968 295\nf 296 9585 9725\nf 9585 1490 16975\nf 9725 16975 4053\nf 2832 16976 15060\nf 16976 4053 16975\nf 15060 16975 1490\nf 287 9572 16978\nf 9572 4033 16977\nf 16978 16977 291\nf 2831 16979 9588\nf 16979 291 16977\nf 9588 16977 4033\nf 4038 9589 9614\nf 9589 287 16978\nf 9614 16978 291\nf 44 6488 6491\nf 6488 1492 9597\nf 6491 9597 2830\nf 1486 16960 6494\nf 16960 4034 9600\nf 6494 9600 1493\nf 4034 16980 9601\nf 16980 5957 16981\nf 9601 16981 2828\nf 1492 9598 9596\nf 9598 5957 16962\nf 9596 16962 289\nf 1484 9567 15059\nf 9567 4032 9606\nf 15059 9606 1494\nf 4054 16982 16983\nf 16982 2832 9607\nf 16983 9607 4032\nf 291 16979 9612\nf 16979 2831 9610\nf 9612 9610 297\nf 1490 16973 15061\nf 16973 4037 16984\nf 15061 16984 1494\nf 2831 15058 9611\nf 15058 1494 16984\nf 9611 16984 4037\nf 4038 9617 9590\nf 9617 1495 15063\nf 9590 15063 1488\nf 295 16985 16974\nf 16985 4039 9616\nf 16974 9616 297\nf 194 9118 16640\nf 9118 2834 9621\nf 16640 9621 2835\nf 4039 16985 9623\nf 16985 295 9626\nf 9623 9626 1496\nf 192 9013 16987\nf 9013 2756 16986\nf 16987 16986 293\nf 1496 9625 9630\nf 9625 293 16986\nf 9630 16986 2756\nf 2836 16638 16967\nf 16638 192 16988\nf 16967 16988 4036\nf 293 16970 16987\nf 16970 4036 16988\nf 16987 16988 192\nf 2836 16989 16639\nf 16989 4040 9635\nf 16639 9635 1377\nf 4040 16989 9633\nf 16989 2836 15056\nf 9633 15056 4035\nf 191 16990 16991\nf 16990 4040 9632\nf 16991 9632 292\nf 4040 16990 9636\nf 16990 191 16643\nf 9636 16643 3954\nf 68 9637 16799\nf 9637 4041 9644\nf 16799 9644 244\nf 3927 10127 9639\nf 10127 1273 16992\nf 9639 16992 4041\nf 200 16993 16682\nf 16993 2838 16994\nf 16682 16994 5516\nf 4106 16995 9642\nf 16995 67 16996\nf 9642 16996 2837\nf 244 9643 16805\nf 9643 4042 9650\nf 16805 9650 246\nf 1497 16997 15065\nf 16997 4042 16998\nf 15065 16998 1273\nf 4041 16992 9645\nf 16992 1273 16998\nf 9645 16998 4042\nf 2837 16999 9648\nf 16999 5516 16994\nf 9648 16994 2838\nf 246 9649 16811\nf 9649 4043 17000\nf 16811 17000 249\nf 1498 9655 15066\nf 9655 4043 17001\nf 15066 17001 1497\nf 4042 16997 9651\nf 16997 1497 17001\nf 9651 17001 4043\nf 2838 16993 9654\nf 16993 200 17002\nf 9654 17002 2839\nf 1499 9660 9657\nf 9660 249 17000\nf 9657 17000 4043\nf 4044 9665 9658\nf 9665 1499 9656\nf 9658 9656 1498\nf 202 17003 6372\nf 17003 2839 17002\nf 6372 17002 200\nf 2839 17003 9659\nf 17003 202 9666\nf 9659 9666 4044\nf 1500 9671 9664\nf 9671 251 9661\nf 9664 9661 1499\nf 4044 9668 9663\nf 9668 1501 9676\nf 9663 9676 1500\nf 1500 9681 9672\nf 9681 255 9315\nf 9672 9315 253\nf 1501 9678 9674\nf 9678 4045 17004\nf 9674 17004 2840\nf 2840 17004 15067\nf 17004 4045 9683\nf 15067 9683 1502\nf 4045 9679 9684\nf 9679 3 17005\nf 9684 17005 4046\nf 255 6500 16828\nf 6500 2841 17006\nf 16828 17006 257\nf 1502 9682 9686\nf 9682 4046 17007\nf 9686 17007 1503\nf 5 9688 16558\nf 9688 4046 17005\nf 16558 17005 3\nf 257 17008 16834\nf 17008 2842 17009\nf 16834 17009 259\nf 2842 17008 15069\nf 17008 257 17006\nf 15069 17006 2841\nf 1504 17010 9692\nf 17010 1503 17011\nf 9692 17011 4047\nf 4047 17011 9690\nf 17011 1503 17007\nf 9690 17007 4046\nf 259 17012 16840\nf 17012 2843 17013\nf 16840 17013 261\nf 2843 17012 15070\nf 17012 259 17009\nf 15070 17009 2842\nf 1504 9694 17010\nf 9694 2843 15071\nf 17010 15071 1503\nf 7 17014 16564\nf 17014 4047 9689\nf 16564 9689 5\nf 4047 17014 9693\nf 17014 7 17015\nf 9693 17015 4048\nf 261 17016 16847\nf 17016 2844 17017\nf 16847 17017 4003\nf 2844 17016 9696\nf 17016 261 17013\nf 9696 17013 2843\nf 1504 9691 15072\nf 9691 4048 17018\nf 15072 17018 1505\nf 9 9700 16655\nf 9700 4048 17015\nf 16655 17015 7\nf 264 9341 9699\nf 9341 4003 17017\nf 9699 17017 2844\nf 1505 17019 15074\nf 17019 4049 17020\nf 15074 17020 2845\nf 4049 17019 9702\nf 17019 1505 17018\nf 9702 17018 4048\nf 10 17021 16569\nf 17021 4049 9701\nf 16569 9701 9\nf 264 15073 16858\nf 15073 2845 17022\nf 16858 17022 266\nf 2845 17020 9706\nf 17020 4049 9704\nf 9706 9704 1506\nf 4049 17021 9705\nf 17021 10 17023\nf 9705 17023 4050\nf 266 17024 16864\nf 17024 2846 17025\nf 16864 17025 268\nf 2846 17024 9708\nf 17024 266 17022\nf 9708 17022 2845\nf 1506 9703 15075\nf 9703 4050 17026\nf 15075 17026 1507\nf 191 9712 16644\nf 9712 4050 17023\nf 16644 17023 10\nf 270 16870 9711\nf 16870 268 17025\nf 9711 17025 2846\nf 1507 17027 15077\nf 17027 4051 17028\nf 15077 17028 2847\nf 4051 17027 9714\nf 17027 1507 17026\nf 9714 17026 4050\nf 292 17029 16991\nf 17029 4051 9713\nf 16991 9713 191\nf 270 15076 16876\nf 15076 2847 17030\nf 16876 17030 271\nf 2847 17028 9718\nf 17028 4051 9716\nf 9718 9716 1508\nf 294 9717 16966\nf 9717 4051 17029\nf 16966 17029 292\nf 1508 9715 17032\nf 9715 294 17031\nf 17032 17031 4052\nf 271 17033 16882\nf 17033 2848 17034\nf 16882 17034 4009\nf 2848 17033 9720\nf 17033 271 17030\nf 9720 17030 2847\nf 1508 17032 15078\nf 17032 4052 17035\nf 15078 17035 1509\nf 296 9724 16972\nf 9724 4052 17031\nf 16972 17031 294\nf 273 9374 9723\nf 9374 4009 17034\nf 9723 17034 2848\nf 1509 17035 15079\nf 17035 4052 17036\nf 15079 17036 1510\nf 4053 17037 9726\nf 17037 1510 17036\nf 9726 17036 4052\nf 1510 17037 15080\nf 17037 4053 9731\nf 15080 9731 1511\nf 4053 16976 9732\nf 16976 2832 16982\nf 9732 16982 4054\nf 2849 9739 9735\nf 9739 277 16890\nf 9735 16890 275\nf 1511 9730 15081\nf 9730 4054 9737\nf 15081 9737 1512\nf 4055 9738 16956\nf 9738 4054 16983\nf 16956 16983 4032\nf 4056 9758 17038\nf 9758 77 8693\nf 17038 8693 1520\nf 79 9759 17039\nf 9759 4056 9765\nf 17039 9765 298\nf 1521 17040 15082\nf 17040 4056 17038\nf 15082 17038 1520\nf 299 17041 17042\nf 17041 2850 6529\nf 17042 6529 78\nf 2850 17041 9763\nf 17041 299 17043\nf 9763 17043 2851\nf 298 9764 17045\nf 9764 4057 17044\nf 17045 17044 5517\nf 1522 17046 15083\nf 17046 4057 17047\nf 15083 17047 1521\nf 4056 17040 9766\nf 17040 1521 17047\nf 9766 17047 4057\nf 301 17048 17050\nf 17048 2852 17049\nf 17050 17049 299\nf 2851 17043 9769\nf 17043 299 17049\nf 9769 17049 2852\nf 300 9770 17051\nf 9770 4058 9777\nf 17051 9777 302\nf 1523 17052 15084\nf 17052 4058 17053\nf 15084 17053 1522\nf 4057 17046 9772\nf 17046 1522 17053\nf 9772 17053 4058\nf 303 17054 17056\nf 17054 2853 17055\nf 17056 17055 301\nf 2852 17048 9775\nf 17048 301 17055\nf 9775 17055 2853\nf 302 9776 17057\nf 9776 4059 9783\nf 17057 9783 304\nf 1524 17058 15085\nf 17058 4059 17059\nf 15085 17059 1523\nf 4058 17052 9778\nf 17052 1523 17059\nf 9778 17059 4059\nf 305 17060 17062\nf 17060 2854 17061\nf 17062 17061 303\nf 2853 17054 9781\nf 17054 303 17061\nf 9781 17061 2854\nf 304 9782 17063\nf 9782 4060 9789\nf 17063 9789 306\nf 1525 17064 15086\nf 17064 4060 17065\nf 15086 17065 1524\nf 4059 17058 9784\nf 17058 1524 17065\nf 9784 17065 4060\nf 307 17066 17068\nf 17066 2855 17067\nf 17068 17067 305\nf 2854 17060 9787\nf 17060 305 17067\nf 9787 17067 2855\nf 306 9788 17069\nf 9788 4061 9798\nf 17069 9798 308\nf 1526 17070 15087\nf 17070 4061 17071\nf 15087 17071 1525\nf 4060 17064 9790\nf 17064 1525 17071\nf 9790 17071 4061\nf 2885 17072 17074\nf 17072 2856 17073\nf 17074 17073 307\nf 2855 17066 9793\nf 17066 307 17073\nf 9793 17073 2856\nf 308 9797 17076\nf 9797 4062 17075\nf 17076 17075 309\nf 1528 9803 9796\nf 9803 309 17075\nf 9796 17075 4062\nf 1527 9794 15088\nf 9794 4062 17077\nf 15088 17077 1526\nf 4061 17070 9799\nf 17070 1526 17077\nf 9799 17077 4062\nf 1527 9800 9795\nf 9800 4063 6530\nf 9795 6530 1528\nf 310 15089 17079\nf 15089 4063 17078\nf 17079 17078 5976\nf 2856 17072 17081\nf 17072 2885 17080\nf 17081 17080 5976\nf 2857 17082 9807\nf 17082 311 9804\nf 9807 9804 1528\nf 1529 9810 15091\nf 9810 4064 17083\nf 15091 17083 1530\nf 311 17082 9929\nf 17082 2857 6533\nf 9929 6533 313\nf 1530 17084 15094\nf 17084 4065 17085\nf 15094 17085 1531\nf 4065 17084 9814\nf 17084 1530 17083\nf 9814 17083 4064\nf 314 9818 10017\nf 9818 4065 9813\nf 10017 9813 312\nf 313 6535 17086\nf 6535 2858 9817\nf 17086 9817 4066\nf 2858 15093 9815\nf 15093 1531 15095\nf 9815 15095 2859\nf 4066 9816 17088\nf 9816 2859 17087\nf 17088 17087 315\nf 1531 17089 15096\nf 17089 4067 17090\nf 15096 17090 1532\nf 4067 17089 17091\nf 17089 1531 17085\nf 17091 17085 4065\nf 2888 9824 10020\nf 9824 4067 17092\nf 10020 17092 5518\nf 315 17093 17095\nf 17093 2860 17094\nf 17095 17094 4088\nf 2860 17093 9823\nf 17093 315 17087\nf 9823 17087 2859\nf 1532 17096 15097\nf 17096 4068 17097\nf 15097 17097 1533\nf 4068 17096 9826\nf 17096 1532 17090\nf 9826 17090 4067\nf 316 9830 17098\nf 9830 4068 9825\nf 17098 9825 2888\nf 4088 17099 17101\nf 17099 2861 17100\nf 17101 17100 5821\nf 2861 17099 9829\nf 17099 4088 17094\nf 9829 17094 2860\nf 1533 17102 15098\nf 17102 4069 17103\nf 15098 17103 1534\nf 4069 17102 9832\nf 17102 1533 17097\nf 9832 17097 4068\nf 317 9836 17104\nf 9836 4069 9831\nf 17104 9831 316\nf 318 17105 17107\nf 17105 4089 17106\nf 17107 17106 4955\nf 1534 17108 15101\nf 17108 4070 17109\nf 15101 17109 1535\nf 4070 17108 9838\nf 17108 1534 17103\nf 9838 17103 4069\nf 319 9842 17110\nf 9842 4070 9837\nf 17110 9837 317\nf 318 15099 17111\nf 15099 1535 9839\nf 17111 9839 5519\nf 1536 9845 17112\nf 9845 2862 15102\nf 17112 15102 4956\nf 4956 17113 17112\nf 17113 321 9848\nf 17112 9848 1536\nf 320 17114 9955\nf 17114 2863 15106\nf 9955 15106 322\nf 2863 17114 9847\nf 17114 320 17115\nf 9847 17115 2862\nf 1536 9850 15107\nf 9850 4071 6536\nf 15107 6536 1537\nf 5928 17116 17117\nf 17116 4071 9849\nf 17117 9849 321\nf 322 15105 9854\nf 15105 1537 9856\nf 9854 9856 141\nf 4072 9859 9858\nf 9859 1539 6540\nf 9858 6540 1538\nf 4073 9864 17118\nf 9864 1540 9860\nf 17118 9860 4072\nf 1544 17119 14926\nf 17119 4074 8697\nf 14926 8697 80\nf 4074 9872 9870\nf 9872 83 6071\nf 9870 6071 81\nf 83 9871 16589\nf 9871 4075 9881\nf 16589 9881 179\nf 4074 17119 9873\nf 17119 1544 17120\nf 9873 17120 4075\nf 298 17121 17039\nf 17121 2744 8695\nf 17039 8695 79\nf 2744 17121 9876\nf 17121 298 17122\nf 9876 17122 2864\nf 179 9880 17123\nf 9880 4076 9879\nf 17123 9879 4077\nf 4077 9887 17123\nf 9887 180 16597\nf 17123 16597 179\nf 2864 15108 9874\nf 15108 4076 17124\nf 9874 17124 1544\nf 4075 17120 9882\nf 17120 1544 17124\nf 9882 17124 4076\nf 300 17125 17127\nf 17125 2865 17126\nf 17127 17126 5517\nf 2864 17122 17128\nf 17122 298 17045\nf 17128 17045 5517\nf 180 9886 16602\nf 9886 4078 9893\nf 16602 9893 181\nf 1546 17129 15109\nf 17129 4078 17130\nf 15109 17130 1545\nf 4077 9878 9888\nf 9878 1545 17130\nf 9888 17130 4078\nf 302 17131 17051\nf 17131 2866 17132\nf 17051 17132 300\nf 2865 17125 9891\nf 17125 300 17132\nf 9891 17132 2866\nf 181 9892 16605\nf 9892 4079 9899\nf 16605 9899 182\nf 1547 17133 15110\nf 17133 4079 17134\nf 15110 17134 1546\nf 4078 17129 9894\nf 17129 1546 17134\nf 9894 17134 4079\nf 304 17135 17057\nf 17135 2867 17136\nf 17057 17136 302\nf 2866 17131 9897\nf 17131 302 17136\nf 9897 17136 2867\nf 182 9898 16610\nf 9898 4080 9905\nf 16610 9905 183\nf 1548 17137 15111\nf 17137 4080 17138\nf 15111 17138 1547\nf 4079 17133 9900\nf 17133 1547 17138\nf 9900 17138 4080\nf 306 17139 17063\nf 17139 2868 17140\nf 17063 17140 304\nf 2867 17135 9903\nf 17135 304 17140\nf 9903 17140 2868\nf 183 9904 16616\nf 9904 4081 9914\nf 16616 9914 184\nf 1549 17141 15112\nf 17141 4081 17142\nf 15112 17142 1548\nf 4080 17137 9906\nf 17137 1548 17142\nf 9906 17142 4081\nf 308 17143 17069\nf 17143 2869 17144\nf 17069 17144 306\nf 2868 17139 9909\nf 17139 306 17144\nf 9909 17144 2869\nf 184 9913 16622\nf 9913 4082 17145\nf 16622 17145 185\nf 4083 9919 9912\nf 9919 185 17145\nf 9912 17145 4082\nf 1550 9910 15113\nf 9910 4082 17146\nf 15113 17146 1549\nf 4081 17141 9915\nf 17141 1549 17146\nf 9915 17146 4082\nf 309 17147 17076\nf 17147 2870 17148\nf 17076 17148 308\nf 2869 17143 9918\nf 17143 308 17148\nf 9918 17148 2870\nf 3946 8968 8965\nf 8968 4084 6555\nf 8965 6555 186\nf 1551 15117 17149\nf 15117 4084 9920\nf 17149 9920 4083\nf 4083 9911 17149\nf 9911 1550 15114\nf 17149 15114 1551\nf 1551 9921 15118\nf 9921 4085 6558\nf 15118 6558 1552\nf 311 15119 9805\nf 15119 4085 17150\nf 9805 17150 309\nf 2870 17147 9923\nf 17147 309 17150\nf 9923 17150 4085\nf 2871 15116 17151\nf 15116 1552 9926\nf 17151 9926 2872\nf 2872 17152 17151\nf 17152 187 9924\nf 17151 9924 2871\nf 2872 9925 17154\nf 9925 1553 17153\nf 17154 17153 1554\nf 187 17152 9930\nf 17152 2872 17155\nf 9930 17155 2873\nf 2872 17154 17155\nf 17154 1554 15121\nf 17155 15121 2873\nf 3950 9931 16632\nf 9931 2873 9939\nf 16632 9939 3951\nf 1554 17156 15122\nf 17156 4086 17157\nf 15122 17157 1555\nf 4086 17156 9933\nf 17156 1554 17153\nf 9933 17153 1553\nf 315 17158 17088\nf 17158 4087 9936\nf 17088 9936 4066\nf 4087 17159 9934\nf 17159 1555 17157\nf 9934 17157 4086\nf 4066 9935 17086\nf 9935 4086 9932\nf 17086 9932 313\nf 2873 15120 9937\nf 15120 1555 15123\nf 9937 15123 2874\nf 3951 9938 16634\nf 9938 2874 17160\nf 16634 17160 188\nf 1556 17161 17163\nf 17161 4087 17162\nf 17163 17162 4088\nf 4087 17158 17162\nf 17158 315 17095\nf 17162 17095 4088\nf 3952 16635 8990\nf 16635 2875 17164\nf 8990 17164 189\nf 2875 16636 9942\nf 16636 188 17160\nf 9942 17160 2874\nf 5821 17165 17101\nf 17165 1556 17163\nf 17101 17163 4088\nf 1557 9943 15125\nf 9943 189 17164\nf 15125 17164 2875\nf 2876 15129 15127\nf 15129 5845 17166\nf 15127 17166 1558\nf 4955 17167 17169\nf 17167 5845 17168\nf 17169 17168 5821\nf 4955 17106 17167\nf 17106 4089 17170\nf 17167 17170 5845\nf 1558 9950 15133\nf 9950 4090 6561\nf 15133 6561 1559\nf 320 9952 17171\nf 9952 4090 9947\nf 17171 9947 5519\nf 190 15132 9007\nf 15132 1559 9953\nf 9007 9953 138\nf 2878 15134 9957\nf 15134 1561 6565\nf 9957 6565 1560\nf 78 9965 17042\nf 9965 4092 9971\nf 17042 9971 299\nf 1564 17172 15136\nf 17172 4092 17173\nf 15136 17173 4091\nf 209 17174 9151\nf 17174 2879 6574\nf 9151 6574 74\nf 2879 17174 9969\nf 17174 209 17175\nf 9969 17175 2880\nf 299 9970 17050\nf 9970 4093 9977\nf 17050 9977 301\nf 1565 17176 15137\nf 17176 4093 17177\nf 15137 17177 1564\nf 4092 17172 9972\nf 17172 1564 17177\nf 9972 17177 4093\nf 211 17178 16708\nf 17178 2881 17179\nf 16708 17179 209\nf 2880 17175 9975\nf 17175 209 17179\nf 9975 17179 2881\nf 301 9976 17056\nf 9976 4094 9983\nf 17056 9983 303\nf 1566 17180 15138\nf 17180 4094 17181\nf 15138 17181 1565\nf 4093 17176 9978\nf 17176 1565 17181\nf 9978 17181 4094\nf 213 17182 16714\nf 17182 2882 17183\nf 16714 17183 211\nf 2881 17178 9981\nf 17178 211 17183\nf 9981 17183 2882\nf 303 9982 17062\nf 9982 4095 9989\nf 17062 9989 305\nf 1567 17184 15139\nf 17184 4095 17185\nf 15139 17185 1566\nf 4094 17180 9984\nf 17180 1566 17185\nf 9984 17185 4095\nf 215 17186 16720\nf 17186 2883 17187\nf 16720 17187 213\nf 2882 17182 9987\nf 17182 213 17187\nf 9987 17187 2883\nf 305 9988 17068\nf 9988 4096 9998\nf 17068 9998 307\nf 1568 17188 15140\nf 17188 4096 17189\nf 15140 17189 1567\nf 4095 17184 9990\nf 17184 1567 17189\nf 9990 17189 4096\nf 217 17190 16726\nf 17190 2884 17191\nf 16726 17191 215\nf 2883 17186 9993\nf 17186 215 17191\nf 9993 17191 2884\nf 307 9997 17074\nf 9997 4097 9996\nf 17074 9996 2885\nf 1569 9994 15141\nf 9994 4097 17192\nf 15141 17192 1568\nf 4096 17188 9999\nf 17188 1568 17192\nf 9999 17192 4097\nf 1569 10000 15142\nf 10000 1571 10005\nf 15142 10005 1570\nf 219 17193 16733\nf 17193 2884 17190\nf 16733 17190 217\nf 2884 17193 10002\nf 17193 219 10006\nf 10002 10006 1571\nf 1572 10009 6576\nf 10009 310 17079\nf 6576 17079 5976\nf 1570 10004 6578\nf 10004 2886 6579\nf 6578 6579 1572\nf 2887 10016 10012\nf 10016 312 10010\nf 10012 10010 1572\nf 1573 10015 15145\nf 10015 4098 17194\nf 15145 17194 1574\nf 1574 17195 15146\nf 17195 4099 17196\nf 15146 17196 1575\nf 4099 17195 17197\nf 17195 1574 17194\nf 17197 17194 4098\nf 224 10021 16748\nf 10021 4099 17197\nf 16748 17197 4098\nf 314 15147 9819\nf 15147 1575 10018\nf 9819 10018 5518\nf 1576 17198 17199\nf 17198 4099 10023\nf 17199 10023 4100\nf 4099 17198 17196\nf 17198 1576 15148\nf 17196 15148 1575\nf 226 10027 16754\nf 10027 4100 10022\nf 16754 10022 224\nf 2888 10026 17098\nf 10026 1577 17200\nf 17098 17200 316\nf 1576 17201 10025\nf 17201 4101 17202\nf 10025 17202 1577\nf 4101 17201 10029\nf 17201 1576 17199\nf 10029 17199 4100\nf 228 10030 16760\nf 10030 4101 10028\nf 16760 10028 226\nf 316 17203 17104\nf 17203 2889 17204\nf 17104 17204 317\nf 2889 17203 15149\nf 17203 316 17200\nf 15149 17200 1577\nf 1578 15150 10032\nf 15150 1577 17202\nf 10032 17202 4101\nf 230 10036 16766\nf 10036 1578 10031\nf 16766 10031 228\nf 317 17205 17110\nf 17205 2890 17206\nf 17110 17206 319\nf 2890 17205 10035\nf 17205 317 17204\nf 10035 17204 2889\nf 232 17207 16772\nf 17207 4957 10037\nf 16772 10037 230\nf 319 17208 17210\nf 17208 2891 17209\nf 17210 17209 321\nf 2891 17208 17211\nf 17208 319 17206\nf 17211 17206 2890\nf 1579 17212 17214\nf 17212 2891 17213\nf 17214 17213 5948\nf 232 17215 17216\nf 17215 1579 17214\nf 17216 17214 5948\nf 4071 17116 9852\nf 17116 5928 17217\nf 9852 17217 323\nf 1579 17218 17212\nf 17218 5928 17219\nf 17212 17219 2891\nf 323 17220 9857\nf 17220 2893 17221\nf 9857 17221 4072\nf 2893 17220 10047\nf 17220 323 17222\nf 10047 17222 2892\nf 1580 17223 15153\nf 17223 4102 17224\nf 15153 17224 1581\nf 4102 17223 10050\nf 17223 1580 10044\nf 10050 10044 5326\nf 237 10054 9238\nf 10054 4102 10049\nf 9238 10049 235\nf 4072 17221 17118\nf 17221 2893 10053\nf 17118 10053 4073\nf 2893 15152 10051\nf 15152 1581 15154\nf 10051 15154 2894\nf 4073 10052 9863\nf 10052 2894 17225\nf 9863 17225 324\nf 1581 17226 15155\nf 17226 4103 10060\nf 15155 10060 1582\nf 4103 17226 10056\nf 17226 1581 17224\nf 10056 17224 4102\nf 4104 10061 16788\nf 10061 4103 10055\nf 16788 10055 237\nf 324 17227 9867\nf 17227 2895 10066\nf 9867 10066 143\nf 2895 17227 10059\nf 17227 324 17225\nf 10059 17225 2894\nf 1582 10062 15156\nf 10062 4104 10064\nf 15156 10064 1583\nf 1603 17228 6593\nf 17228 5917 10071\nf 6593 10071 1586\nf 327 17229 17231\nf 17229 3081 17230\nf 17231 17230 5929\nf 5917 17232 10072\nf 17232 5923 10138\nf 10072 10138 5929\nf 4959 17233 17235\nf 17233 1587 17234\nf 17235 17234 3142\nf 1588 17236 17237\nf 17236 3148 10074\nf 17237 10074 2949\nf 3148 17236 17239\nf 17236 1588 17238\nf 17239 17238 1918\nf 4161 17240 10092\nf 17240 352 10108\nf 10092 10108 75\nf 4105 6625 10099\nf 6625 80 8696\nf 10099 8696 1592\nf 4165 6632 17242\nf 6632 1597 17241\nf 17242 17241 1598\nf 73 8684 8681\nf 8684 1598 17241\nf 8681 17241 1597\nf 4170 17243 10125\nf 17243 357 17244\nf 10125 17244 4106\nf 67 16995 10132\nf 16995 4106 17244\nf 10132 17244 357\nf 2901 10988 10126\nf 10988 1601 8675\nf 10126 8675 3927\nf 4172 17245 6639\nf 17245 358 8667\nf 6639 8667 65\nf 1605 10144 6659\nf 10144 4107 11246\nf 6659 11246 1607\nf 386 10165 10170\nf 10165 1618 10167\nf 10170 10167 1617\nf 441 10224 17246\nf 10224 4108 10245\nf 17246 10245 443\nf 451 7286 7384\nf 7286 1643 10227\nf 7384 10227 449\nf 453 15282 17247\nf 15282 1646 10232\nf 17247 10232 454\nf 1733 6928 10529\nf 6928 4109 17248\nf 10529 17248 1649\nf 1648 17249 6806\nf 17249 2906 10254\nf 6806 10254 442\nf 2906 17249 10236\nf 17249 1648 6933\nf 10236 6933 455\nf 2904 15163 10240\nf 15163 1639 10243\nf 10240 10243 1651\nf 1652 10246 10247\nf 10246 4108 10220\nf 10247 10220 1640\nf 1654 10260 10258\nf 10260 2906 15167\nf 10258 15167 1647\nf 1649 17248 15168\nf 17248 4109 6832\nf 15168 6832 1647\nf 1660 10261 10273\nf 10261 2907 15169\nf 10273 15169 4112\nf 4114 17250 10283\nf 17250 1658 10267\nf 10283 10267 4111\nf 457 17251 17252\nf 17251 2908 10269\nf 17252 10269 1659\nf 2908 17251 10268\nf 17251 457 10285\nf 10268 10285 4111\nf 1666 10270 15174\nf 10270 2909 15171\nf 15174 15171 1661\nf 5837 17253 17254\nf 17253 4112 15170\nf 17254 15170 4110\nf 458 10293 10275\nf 10293 4112 17253\nf 10275 17253 5837\nf 2911 17255 15175\nf 17255 4113 17256\nf 15175 17256 1662\nf 2910 17257 17258\nf 17257 1662 17256\nf 17258 17256 4113\nf 1665 17259 10307\nf 17259 4114 10281\nf 10307 10281 4115\nf 4114 17259 17260\nf 17259 1665 6856\nf 17260 6856 1664\nf 1658 17250 10265\nf 17250 4114 17260\nf 10265 17260 1664\nf 2914 10287 6862\nf 10287 457 17252\nf 6862 17252 1659\nf 463 10292 6876\nf 10292 458 17261\nf 6876 17261 2916\nf 2911 10295 10277\nf 10295 2916 17261\nf 10277 17261 458\nf 4116 17262 17264\nf 17262 1662 17263\nf 17264 17263 464\nf 1662 17262 15176\nf 17262 4116 10313\nf 15176 10313 1668\nf 1669 17265 17266\nf 17265 2918 10298\nf 17266 10298 2953\nf 1674 17267 17269\nf 17267 1669 17268\nf 17269 17268 2912\nf 473 10353 17270\nf 10353 4117 10304\nf 17270 10304 466\nf 2913 17271 15181\nf 17271 4115 10280\nf 15181 10280 462\nf 1665 10308 10279\nf 10308 4117 10302\nf 10279 10302 1671\nf 466 10306 10351\nf 10306 4115 17271\nf 10351 17271 2913\nf 467 10309 17272\nf 10309 1667 6858\nf 17272 6858 463\nf 1667 10311 10289\nf 10311 5520 17273\nf 10289 17273 5327\nf 467 17272 10345\nf 17272 463 6875\nf 10345 6875 2915\nf 4119 10316 10320\nf 10316 4116 17264\nf 10320 17264 464\nf 4116 10315 10314\nf 10315 468 17274\nf 10314 17274 4118\nf 1668 10312 15183\nf 10312 4118 10341\nf 15183 10341 1673\nf 4121 17275 10339\nf 17275 4119 17276\nf 10339 17276 1675\nf 1674 17277 17278\nf 17277 1675 17276\nf 17278 17276 4119\nf 4119 10319 17278\nf 10319 2918 17279\nf 17278 17279 1674\nf 2917 17280 10322\nf 17280 1674 17269\nf 10322 17269 2912\nf 2918 17265 17279\nf 17265 1669 17267\nf 17279 17267 1674\nf 1676 17281 17282\nf 17281 2920 10325\nf 17282 10325 2951\nf 2920 17281 17284\nf 17281 1676 17283\nf 17284 17283 1677\nf 1676 17285 17283\nf 17285 2919 17286\nf 17283 17286 1677\nf 2921 17287 10329\nf 17287 1677 17286\nf 10329 17286 2919\nf 469 10332 15185\nf 10332 4120 11432\nf 15185 11432 470\nf 4120 10331 17288\nf 10331 2920 17284\nf 17288 17284 1677\nf 1674 17280 17277\nf 17280 2917 17289\nf 17277 17289 1675\nf 2922 15188 10335\nf 15188 1675 17289\nf 10335 17289 2917\nf 468 17290 17292\nf 17290 4204 17291\nf 17292 17291 471\nf 4204 17290 10338\nf 17290 468 17293\nf 10338 17293 4121\nf 4121 17293 17275\nf 17293 468 10317\nf 17275 10317 4119\nf 468 17292 17274\nf 17292 471 17294\nf 17274 17294 4118\nf 2923 10342 17295\nf 10342 4118 17294\nf 17295 17294 471\nf 467 10344 10310\nf 10344 4122 17296\nf 10310 17296 5520\nf 1679 17297 15189\nf 17297 2915 15184\nf 15189 15184 1673\nf 2915 17297 10346\nf 17297 1679 17298\nf 10346 17298 4122\nf 473 17299 17300\nf 17299 4123 10349\nf 17300 10349 4124\nf 4123 17299 10350\nf 17299 473 17270\nf 10350 17270 466\nf 1680 10347 15191\nf 10347 4123 17301\nf 15191 17301 1672\nf 2913 15178 10352\nf 15178 1672 17301\nf 10352 17301 4123\nf 476 15248 15158\nf 15248 3001 17302\nf 15158 17302 2896\nf 1915 17303 17304\nf 17303 2927 10359\nf 17304 10359 2958\nf 3000 17305 10362\nf 17305 2927 17306\nf 10362 17306 2926\nf 1682 17307 17308\nf 17307 2929 10365\nf 17308 10365 494\nf 2929 17307 17310\nf 17307 1682 17309\nf 17310 17309 1683\nf 2998 17311 10368\nf 17311 1683 17312\nf 10368 17312 2928\nf 1682 17313 17309\nf 17313 2928 17312\nf 17309 17312 1683\nf 1684 17314 17315\nf 17314 2930 10371\nf 17315 10371 2961\nf 2930 17314 17317\nf 17314 1684 17316\nf 17317 17316 1685\nf 1684 17318 17316\nf 17318 519 17319\nf 17316 17319 1685\nf 519 17318 15244\nf 17318 1684 17320\nf 15244 17320 482\nf 1686 17321 17322\nf 17321 2932 10374\nf 17322 10374 2963\nf 2932 17321 17324\nf 17321 1686 17323\nf 17324 17323 1687\nf 2995 17325 10377\nf 17325 1687 17326\nf 10377 17326 2931\nf 1686 17327 17323\nf 17327 2931 17326\nf 17323 17326 1687\nf 1688 17328 17329\nf 17328 2934 10380\nf 17329 10380 2965\nf 2934 17328 17331\nf 17328 1688 17330\nf 17331 17330 1689\nf 2993 17332 10383\nf 17332 1689 17333\nf 10383 17333 2933\nf 1688 17334 17330\nf 17334 2933 17333\nf 17330 17333 1689\nf 1690 17335 17336\nf 17335 2936 10386\nf 17336 10386 2967\nf 2936 17335 17338\nf 17335 1690 17337\nf 17338 17337 1691\nf 2991 10680 10389\nf 10680 1691 17339\nf 10389 17339 2935\nf 1690 17340 17337\nf 17340 2935 17339\nf 17337 17339 1691\nf 2969 17341 6940\nf 17341 1692 17342\nf 6940 17342 5521\nf 487 15200 17343\nf 15200 2970 6941\nf 17343 6941 5521\nf 2937 17344 17346\nf 17344 1693 17345\nf 17346 17345 5521\nf 1692 17347 17342\nf 17347 2937 17346\nf 17342 17346 5521\nf 4126 10412 10410\nf 10412 1699 10586\nf 10410 10586 1698\nf 1703 10418 6887\nf 10418 1700 10409\nf 6887 10409 491\nf 1916 17348 17350\nf 17348 3144 17349\nf 17350 17349 1708\nf 2959 17351 10435\nf 17351 1708 17349\nf 10435 17349 3144\nf 1709 17352 17353\nf 17352 2939 10437\nf 17353 10437 2948\nf 2939 17352 17355\nf 17352 1709 17354\nf 17355 17354 1710\nf 2960 17356 10440\nf 17356 1710 17357\nf 10440 17357 2938\nf 1709 17358 17354\nf 17358 2938 17357\nf 17354 17357 1710\nf 1711 17359 17360\nf 17359 2941 10443\nf 17360 10443 2950\nf 2941 17359 17362\nf 17359 1711 17361\nf 17362 17361 1712\nf 2962 17363 10446\nf 17363 1712 17364\nf 10446 17364 2940\nf 1711 17365 17361\nf 17365 2940 17364\nf 17361 17364 1712\nf 1713 17366 17367\nf 17366 2943 10449\nf 17367 10449 2952\nf 2943 17366 17369\nf 17366 1713 17368\nf 17369 17368 1714\nf 2964 17370 10452\nf 17370 1714 17371\nf 10452 17371 2942\nf 1713 17372 17368\nf 17372 2942 17371\nf 17368 17371 1714\nf 1715 17373 17374\nf 17373 2945 10455\nf 17374 10455 2954\nf 2945 17373 17376\nf 17373 1715 17375\nf 17376 17375 1716\nf 2966 17377 10458\nf 17377 1716 17378\nf 10458 17378 2944\nf 1715 17379 17375\nf 17379 2944 17378\nf 17375 17378 1716\nf 1717 17380 17381\nf 17380 2947 10461\nf 17381 10461 2957\nf 2947 17380 17383\nf 17380 1717 17382\nf 17383 17382 1718\nf 2946 10465 10516\nf 10465 1718 17382\nf 10516 17382 1717\nf 2968 10463 15228\nf 10463 2946 15208\nf 15228 15208 505\nf 1722 17384 10470\nf 17384 4127 10466\nf 10470 10466 1720\nf 505 15210 17385\nf 15210 4127 17384\nf 17385 17384 1722\nf 4128 17386 10474\nf 17386 1721 10524\nf 10474 10524 506\nf 507 6901 10583\nf 6901 1721 17386\nf 10583 17386 4128\nf 4129 10483 10482\nf 10483 1725 10476\nf 10482 10476 508\nf 1739 6954 10596\nf 6954 4129 10479\nf 10596 10479 1730\nf 1917 17387 17389\nf 17387 3146 17388\nf 17389 17388 1709\nf 2938 17358 10493\nf 17358 1709 17388\nf 10493 17388 3146\nf 1588 17390 17391\nf 17390 2950 10495\nf 17391 10495 2897\nf 2950 17390 17360\nf 17390 1588 17392\nf 17360 17392 1711\nf 2940 17365 10498\nf 17365 1711 17393\nf 10498 17393 2949\nf 1588 17237 17392\nf 17237 2949 17393\nf 17392 17393 1711\nf 1676 17394 17285\nf 17394 2952 10501\nf 17285 10501 2919\nf 2952 17394 17367\nf 17394 1676 17395\nf 17367 17395 1713\nf 2942 17372 10504\nf 17372 1713 17396\nf 10504 17396 2951\nf 1676 17282 17395\nf 17282 2951 17396\nf 17395 17396 1713\nf 1669 17397 17268\nf 17397 2954 10507\nf 17268 10507 2912\nf 2954 17397 17374\nf 17397 1669 17398\nf 17374 17398 1715\nf 2944 17379 10510\nf 17379 1715 17399\nf 10510 17399 2953\nf 1669 17266 17398\nf 17266 2953 17399\nf 17398 17399 1715\nf 2957 15222 17400\nf 15222 459 10514\nf 17400 10514 5522\nf 4127 15209 15219\nf 15209 2946 10515\nf 15219 10515 2956\nf 2910 17258 10513\nf 17258 4113 15221\nf 10513 15221 5522\nf 4110 10518 10522\nf 10518 1731 10468\nf 10522 10468 1719\nf 4127 15218 10467\nf 15218 2955 10520\nf 10467 10520 1719\nf 506 10523 6924\nf 10523 1731 6922\nf 6924 6922 1732\nf 4131 10537 10534\nf 10537 1734 10528\nf 10534 10528 455\nf 1728 6911 10484\nf 6911 4131 10531\nf 10484 10531 1727\nf 2926 17401 15195\nf 17401 3021 11406\nf 15195 11406 477\nf 494 15202 17308\nf 15202 1708 17402\nf 17308 17402 1682\nf 2928 17313 10543\nf 17313 1682 17403\nf 10543 17403 2959\nf 1708 17351 17402\nf 17351 2959 17403\nf 17402 17403 1682\nf 1710 17404 17355\nf 17404 2961 10546\nf 17355 10546 2939\nf 2961 17404 17315\nf 17404 1710 17405\nf 17315 17405 1684\nf 482 17320 10549\nf 17320 1684 17406\nf 10549 17406 2960\nf 1710 17356 17405\nf 17356 2960 17406\nf 17405 17406 1684\nf 1712 17407 17362\nf 17407 2963 10552\nf 17362 10552 2941\nf 2963 17407 17322\nf 17407 1712 17408\nf 17322 17408 1686\nf 2931 17327 10555\nf 17327 1686 17409\nf 10555 17409 2962\nf 1712 17363 17408\nf 17363 2962 17409\nf 17408 17409 1686\nf 1714 17410 17369\nf 17410 2965 10558\nf 17369 10558 2943\nf 2965 17410 17329\nf 17410 1714 17411\nf 17329 17411 1688\nf 2933 17334 10561\nf 17334 1688 17412\nf 10561 17412 2964\nf 1714 17370 17411\nf 17370 2964 17412\nf 17411 17412 1688\nf 1716 17413 17376\nf 17413 2967 10564\nf 17376 10564 2945\nf 2967 17413 17336\nf 17413 1716 17414\nf 17336 17414 1690\nf 2935 17340 10567\nf 17340 1690 17415\nf 10567 17415 2966\nf 1716 17377 17414\nf 17377 2966 17415\nf 17414 17415 1690\nf 1718 17416 17383\nf 17416 2969 10570\nf 17383 10570 2947\nf 2969 17416 17341\nf 17416 1718 17417\nf 17341 17417 1692\nf 2968 17418 10464\nf 17418 1692 17417\nf 10464 17417 1718\nf 1692 17418 17419\nf 17418 2968 10577\nf 17419 10577 4958\nf 1694 10574 10579\nf 10574 505 17385\nf 10579 17385 1722\nf 4133 17420 10582\nf 17420 489 6943\nf 10582 6943 507\nf 4133 10587 17420\nf 10587 1699 10406\nf 17420 10406 489\nf 4134 10595 10592\nf 10595 1738 10585\nf 10592 10585 509\nf 1703 6889 10421\nf 6889 4134 10589\nf 10421 10589 1702\nf 1747 17421 15403\nf 17421 2972 10608\nf 15403 10608 3125\nf 2972 17421 17423\nf 17421 1747 17422\nf 17423 17422 1748\nf 2971 15240 15229\nf 15240 1748 17422\nf 15229 17422 1747\nf 1749 17424 17425\nf 17424 2973 10612\nf 17425 10612 3127\nf 2973 17424 17427\nf 17424 1749 17426\nf 17427 17426 2990\nf 2990 6987 17427\nf 6987 1750 15230\nf 17427 15230 2973\nf 1749 11351 17426\nf 11351 514 10614\nf 17426 10614 2990\nf 1751 17428 17429\nf 17428 2975 10617\nf 17429 10617 3130\nf 2975 17428 17431\nf 17428 1751 17430\nf 17431 17430 1752\nf 2992 17432 10620\nf 17432 1752 17433\nf 10620 17433 2974\nf 1751 17434 17430\nf 17434 2974 17433\nf 17430 17433 1752\nf 1753 17435 17436\nf 17435 2977 10623\nf 17436 10623 3132\nf 2977 17435 17438\nf 17435 1753 17437\nf 17438 17437 1754\nf 2994 17439 10626\nf 17439 1754 17440\nf 10626 17440 2976\nf 1753 17441 17437\nf 17441 2976 17440\nf 17437 17440 1754\nf 638 17442 15406\nf 17442 1756 17443\nf 15406 17443 518\nf 1756 17442 17445\nf 17442 638 17444\nf 17445 17444 1755\nf 2996 17446 10629\nf 17446 1756 17447\nf 10629 17447 2978\nf 1755 17448 17445\nf 17448 2978 17447\nf 17445 17447 1756\nf 1757 17449 17450\nf 17449 2980 10632\nf 17450 10632 3135\nf 2980 17449 17452\nf 17449 1757 17451\nf 17452 17451 1758\nf 2997 17453 10635\nf 17453 1758 17454\nf 10635 17454 2979\nf 1757 17455 17451\nf 17455 2979 17454\nf 17451 17454 1758\nf 1759 17456 17457\nf 17456 2982 10638\nf 17457 10638 3137\nf 2982 17456 17459\nf 17456 1759 17458\nf 17459 17458 1760\nf 2999 17460 10641\nf 17460 1760 17461\nf 10641 17461 2981\nf 1759 17462 17458\nf 17462 2981 17461\nf 17458 17461 1760\nf 1761 17463 17464\nf 17463 2984 10644\nf 17464 10644 3138\nf 2984 17463 17466\nf 17463 1761 17465\nf 17466 17465 1762\nf 2985 10656 10654\nf 10656 1764 10210\nf 10654 10210 1634\nf 4135 17467 10660\nf 17467 1765 10652\nf 10660 10652 422\nf 1700 15238 10411\nf 15238 1765 17468\nf 10411 17468 4126\nf 4135 10663 17467\nf 10663 4126 17468\nf 17467 17468 1765\nf 2986 6982 10669\nf 6982 1767 10662\nf 10669 10662 423\nf 1748 17469 17423\nf 17469 2988 10674\nf 17423 10674 2972\nf 2988 17469 17471\nf 17469 1748 17470\nf 17471 17470 1693\nf 2987 10677 15239\nf 10677 1693 17470\nf 15239 17470 1748\nf 1750 10681 15231\nf 10681 2991 6984\nf 15231 6984 513\nf 2936 17338 10683\nf 17338 1691 17472\nf 10683 17472 2989\nf 1750 6989 10679\nf 6989 2989 17472\nf 10679 17472 1691\nf 1752 17473 17431\nf 17473 2993 10686\nf 17431 10686 2975\nf 2993 17473 17332\nf 17473 1752 17474\nf 17332 17474 1689\nf 2934 17331 10689\nf 17331 1689 17475\nf 10689 17475 2992\nf 1752 17432 17474\nf 17432 2992 17475\nf 17474 17475 1689\nf 1754 17476 17438\nf 17476 2995 10692\nf 17438 10692 2977\nf 2995 17476 17325\nf 17476 1754 17477\nf 17325 17477 1687\nf 2932 17324 10695\nf 17324 1687 17478\nf 10695 17478 2994\nf 1754 17439 17477\nf 17439 2994 17478\nf 17477 17478 1687\nf 518 17479 15233\nf 17479 1685 17319\nf 15233 17319 519\nf 1685 17479 17480\nf 17479 518 17443\nf 17480 17443 1756\nf 2930 17317 10698\nf 17317 1685 17481\nf 10698 17481 2996\nf 1756 17446 17480\nf 17446 2996 17481\nf 17480 17481 1685\nf 1758 17482 17452\nf 17482 2998 10701\nf 17452 10701 2980\nf 2998 17482 17311\nf 17482 1758 17483\nf 17311 17483 1683\nf 2929 17310 10704\nf 17310 1683 17484\nf 10704 17484 2997\nf 1758 17453 17483\nf 17453 2997 17484\nf 17483 17484 1683\nf 1760 17485 17459\nf 17485 3000 10707\nf 17459 10707 2982\nf 3000 17485 17305\nf 17485 1760 17486\nf 17305 17486 2927\nf 1760 17460 17486\nf 17460 2999 10360\nf 17486 10360 2927\nf 1762 17487 17466\nf 17487 3001 10712\nf 17466 10712 2984\nf 3001 17487 17489\nf 17487 1762 17488\nf 17489 17488 1914\nf 2925 17490 10647\nf 17490 1762 17465\nf 10647 17465 1761\nf 1762 17490 17488\nf 17490 2925 17491\nf 17488 17491 1914\nf 3004 10718 15250\nf 10718 3002 6991\nf 15250 6991 1769\nf 3003 10720 15249\nf 10720 1770 10748\nf 15249 10748 3004\nf 1916 17492 17494\nf 17492 3145 17493\nf 17494 17493 1772\nf 533 10725 15414\nf 10725 1772 17493\nf 15414 17493 3145\nf 1773 17495 17496\nf 17495 3007 10729\nf 17496 10729 3021\nf 3007 17495 17498\nf 17495 1773 17497\nf 17498 17497 1774\nf 1773 17499 17497\nf 17499 3006 10733\nf 17497 10733 1774\nf 1775 17500 17502\nf 17500 3028 17501\nf 17502 17501 3022\nf 530 10746 7008\nf 10746 3141 17503\nf 7008 17503 527\nf 1777 10744 15270\nf 10744 530 10741\nf 15270 10741 4136\nf 1780 7012 10754\nf 7012 1776 7003\nf 10754 7003 536\nf 1918 17504 17505\nf 17504 3149 10757\nf 17505 10757 1781\nf 1782 17506 17507\nf 17506 3011 10759\nf 17507 10759 3026\nf 3011 17506 17509\nf 17506 1782 17508\nf 17509 17508 1783\nf 3064 17510 10762\nf 17510 1783 17511\nf 10762 17511 3010\nf 1782 17512 17508\nf 17512 3010 17511\nf 17508 17511 1783\nf 1784 17513 17514\nf 17513 3013 10765\nf 17514 10765 3027\nf 3013 17513 17516\nf 17513 1784 17515\nf 17516 17515 1785\nf 3062 17517 10768\nf 17517 1785 17518\nf 10768 17518 3012\nf 1784 17519 17515\nf 17519 3012 17518\nf 17515 17518 1785\nf 3060 17520 10771\nf 17520 1787 17521\nf 10771 17521 3014\nf 1787 17522 17521\nf 17522 1774 10732\nf 17521 10732 3014\nf 1788 17523 17524\nf 17523 3016 10774\nf 17524 10774 3028\nf 3016 17523 17526\nf 17523 1788 17525\nf 17526 17525 1789\nf 1788 17527 17525\nf 17527 3015 17528\nf 17525 17528 1789\nf 551 17529 17531\nf 17529 3151 17530\nf 17531 17530 550\nf 3151 17529 10778\nf 17529 551 17532\nf 10778 17532 3069\nf 551 17531 11113\nf 17531 550 7056\nf 11113 7056 3067\nf 553 7059 17534\nf 7059 3072 17533\nf 17534 17533 552\nf 4137 11101 10781\nf 11101 552 17533\nf 10781 17533 3072\nf 553 17534 11119\nf 17534 552 7053\nf 11119 7053 3065\nf 4138 17535 10785\nf 17535 555 7062\nf 10785 7062 3075\nf 4183 11095 10784\nf 11095 554 10786\nf 10784 10786 3075\nf 4138 17536 17538\nf 17536 1793 17537\nf 17538 17537 1794\nf 1793 17536 17539\nf 17536 4138 10789\nf 17539 10789 3063\nf 3077 17540 10791\nf 17540 1793 17541\nf 10791 17541 3017\nf 1793 17540 17537\nf 17540 3077 15351\nf 17537 15351 1794\nf 1796 17542 10797\nf 17542 4191 17543\nf 10797 17543 3061\nf 556 15329 10794\nf 15329 3061 17543\nf 10794 17543 4191\nf 1795 17544 10796\nf 17544 3018 15353\nf 10796 15353 1796\nf 3059 17545 10801\nf 17545 1797 17546\nf 10801 17546 4193\nf 1798 15263 17547\nf 15263 561 7065\nf 17547 7065 4194\nf 1797 17548 15265\nf 17548 3060 10803\nf 15265 10803 1798\nf 3020 17549 17551\nf 17549 1789 17550\nf 17551 17550 1847\nf 1789 17552 17550\nf 17552 3019 17553\nf 17550 17553 1847\nf 1915 17554 17556\nf 17554 3143 17555\nf 17556 17555 1773\nf 3006 17499 10807\nf 17499 1773 17555\nf 10807 17555 3143\nf 1587 17557 17558\nf 17557 3022 10809\nf 17558 10809 2896\nf 3022 17557 17502\nf 17557 1587 17559\nf 17502 17559 1775\nf 3008 17560 15253\nf 17560 1775 17561\nf 15253 17561 4959\nf 1587 17233 17559\nf 17233 4959 17561\nf 17559 17561 1775\nf 1771 10815 10724\nf 10815 4139 10735\nf 10724 10735 535\nf 4136 10816 10814\nf 10816 4140 15274\nf 10814 15274 4139\nf 3024 10818 17562\nf 10818 530 7010\nf 17562 7010 1778\nf 1778 10820 17562\nf 10820 1800 15271\nf 17562 15271 3024\nf 1800 10819 10845\nf 10819 1779 10822\nf 10845 10822 4141\nf 564 10824 10827\nf 10824 4141 10821\nf 10827 10821 537\nf 1917 17563 17565\nf 17563 3147 17564\nf 17565 17564 1782\nf 3010 17512 10831\nf 17512 1782 17564\nf 10831 17564 3147\nf 1772 17566 17567\nf 17566 3027 10833\nf 17567 10833 3005\nf 3027 17566 17514\nf 17566 1772 17568\nf 17514 17568 1784\nf 3012 17519 15257\nf 17519 1784 17569\nf 15257 17569 543\nf 1772 10727 17568\nf 10727 543 17569\nf 17568 17569 1784\nf 1774 17570 17498\nf 17570 1786 10836\nf 17498 10836 3007\nf 1774 17522 17570\nf 17522 1787 17571\nf 17570 17571 1786\nf 3022 17501 15268\nf 17501 3028 10841\nf 15268 10841 534\nf 3028 17500 17524\nf 17500 1775 17572\nf 17524 17572 1788\nf 3015 17527 17574\nf 17527 1788 17573\nf 17574 17573 3008\nf 4139 15275 10736\nf 15275 1802 17575\nf 10736 17575 4960\nf 548 17576 17577\nf 17576 4140 10817\nf 17577 10817 3023\nf 4140 17576 10844\nf 17576 548 17578\nf 10844 17578 4142\nf 3023 7018 17577\nf 7018 3025 17579\nf 17577 17579 548\nf 567 17580 10847\nf 17580 3057 10823\nf 10847 10823 564\nf 1804 10850 11454\nf 10850 2905 15164\nf 11454 15164 1643\nf 450 17581 10890\nf 17581 568 17582\nf 10890 17582 4143\nf 3045 10853 17583\nf 10853 4143 17582\nf 17583 17582 568\nf 570 17584 17586\nf 17584 4144 17585\nf 17586 17585 569\nf 4144 17584 10857\nf 17584 570 17587\nf 10857 17587 3029\nf 570 17586 10899\nf 17586 569 7043\nf 10899 7043 3047\nf 572 17588 17590\nf 17588 4173 17589\nf 17590 17589 571\nf 4173 17588 10860\nf 17588 572 17591\nf 10860 17591 3030\nf 572 17590 10905\nf 17590 571 17592\nf 10905 17592 4145\nf 3048 10862 17593\nf 10862 4145 17592\nf 17593 17592 571\nf 574 17594 17596\nf 17594 4174 17595\nf 17596 17595 573\nf 4174 17594 10866\nf 17594 574 17597\nf 10866 17597 3031\nf 574 17596 10911\nf 17596 573 17598\nf 10911 17598 4146\nf 3049 10868 17599\nf 10868 4146 17598\nf 17599 17598 573\nf 576 17600 17602\nf 17600 4175 17601\nf 17602 17601 575\nf 4175 17600 10872\nf 17600 576 17603\nf 10872 17603 3032\nf 576 17602 10917\nf 17602 575 17604\nf 10917 17604 4147\nf 3050 10874 17605\nf 10874 4147 17604\nf 17605 17604 575\nf 578 17606 17608\nf 17606 4176 17607\nf 17608 17607 577\nf 4176 17606 10878\nf 17606 578 17609\nf 10878 17609 3033\nf 578 17608 10923\nf 17608 577 17610\nf 10923 17610 4148\nf 3051 10880 17611\nf 10880 4148 17610\nf 17611 17610 577\nf 580 17612 17614\nf 17612 4177 17613\nf 17614 17613 579\nf 4177 17612 10884\nf 17612 580 17615\nf 10884 17615 3034\nf 580 17614 17617\nf 17614 579 17616\nf 17617 17616 4156\nf 3052 10886 17618\nf 10886 4156 17616\nf 17618 17616 579\nf 582 17619 17620\nf 17619 3035 11034\nf 17620 11034 581\nf 582 17620 10932\nf 17620 581 17621\nf 10932 17621 3053\nf 593 17622 17623\nf 17622 3036 11039\nf 17623 11039 583\nf 593 17623 10938\nf 17623 583 17624\nf 10938 17624 3054\nf 585 17625 17627\nf 17625 4178 17626\nf 17627 17626 584\nf 5944 10948 17628\nf 10948 450 10892\nf 17628 10892 4149\nf 1805 15276 10852\nf 15276 1813 17629\nf 10852 17629 4143\nf 4149 10891 17630\nf 10891 4143 17629\nf 17630 17629 1813\nf 586 17631 17632\nf 17631 3029 17587\nf 17632 17587 570\nf 3029 17631 10895\nf 17631 586 17633\nf 10895 17633 1820\nf 586 17632 17634\nf 17632 570 10901\nf 17634 10901 4150\nf 4150 10897 17634\nf 10897 4151 17635\nf 17634 17635 586\nf 1806 15277 15312\nf 15277 1814 17636\nf 15312 17636 3047\nf 4150 10900 10898\nf 10900 3047 17636\nf 10898 17636 1814\nf 587 17637 17638\nf 17637 3030 17591\nf 17638 17591 572\nf 3030 17637 10904\nf 17637 587 17639\nf 10904 17639 3037\nf 587 17638 10958\nf 17638 572 10907\nf 10958 10907 4152\nf 1807 15278 10861\nf 15278 1815 17640\nf 10861 17640 4145\nf 4152 10906 17641\nf 10906 4145 17640\nf 17641 17640 1815\nf 588 17642 17643\nf 17642 3031 17597\nf 17643 17597 574\nf 3031 17642 10910\nf 17642 588 17644\nf 10910 17644 3038\nf 588 17643 10964\nf 17643 574 10913\nf 10964 10913 4153\nf 1808 15279 10867\nf 15279 1816 17645\nf 10867 17645 4146\nf 4153 10912 17646\nf 10912 4146 17645\nf 17646 17645 1816\nf 589 17647 17648\nf 17647 3032 17603\nf 17648 17603 576\nf 3032 17647 10916\nf 17647 589 17649\nf 10916 17649 3039\nf 589 17648 10970\nf 17648 576 10919\nf 10970 10919 4154\nf 1809 15280 10873\nf 15280 1817 17650\nf 10873 17650 4147\nf 4154 10918 17651\nf 10918 4147 17650\nf 17651 17650 1817\nf 590 17652 17653\nf 17652 3033 17609\nf 17653 17609 578\nf 3033 17652 10922\nf 17652 590 17654\nf 10922 17654 3040\nf 590 17653 10976\nf 17653 578 10925\nf 10976 10925 4155\nf 1810 15281 10879\nf 15281 1818 17655\nf 10879 17655 4148\nf 4155 10924 17656\nf 10924 4148 17655\nf 17656 17655 1818\nf 591 17657 17658\nf 17657 3034 17615\nf 17658 17615 580\nf 3034 17657 10928\nf 17657 591 17659\nf 10928 17659 3042\nf 591 17658 10982\nf 17658 580 17617\nf 10982 17617 4156\nf 592 17660 17661\nf 17660 3035 17619\nf 17661 17619 582\nf 3035 17660 10931\nf 17660 592 17662\nf 10931 17662 3043\nf 592 17661 17663\nf 17661 582 10934\nf 17663 10934 4169\nf 4169 10933 17664\nf 10933 3053 15319\nf 17664 15319 1819\nf 3036 17622 10937\nf 17622 593 17665\nf 10937 17665 4170\nf 4171 10939 17666\nf 10939 3054 15321\nf 17666 15321 1812\nf 4178 17625 10943\nf 17625 585 17667\nf 10943 17667 3044\nf 452 17668 10944\nf 17668 4157 15166\nf 10944 15166 1646\nf 349 6820 17670\nf 6820 4157 17669\nf 17670 17669 5944\nf 4157 17668 17669\nf 17668 452 10949\nf 17669 10949 5944\nf 5523 17671 15283\nf 17671 1591 10947\nf 15283 10947 4158\nf 1813 10893 17630\nf 10893 1820 17672\nf 17630 17672 4149\nf 4158 17673 15284\nf 17673 4149 17672\nf 15284 17672 1820\nf 350 17674 10097\nf 17674 5523 17675\nf 10097 17675 5524\nf 1592 10098 10100\nf 10098 5524 10952\nf 10100 10952 1821\nf 1814 10902 10896\nf 10902 3037 15286\nf 10896 15286 4151\nf 1821 10955 10101\nf 10955 4159 10954\nf 10101 10954 4105\nf 4160 17676 10960\nf 17676 4159 17677\nf 10960 17677 587\nf 3037 17639 10957\nf 17639 587 17677\nf 10957 17677 4159\nf 351 10953 7030\nf 10953 4159 17676\nf 7030 17676 4160\nf 1815 15287 17641\nf 15287 1822 17678\nf 17641 17678 4152\nf 4160 10959 15289\nf 10959 4152 17678\nf 15289 17678 1822\nf 1822 10961 15290\nf 10961 4161 10093\nf 15290 10093 1594\nf 352 17679 17680\nf 17679 3038 17644\nf 17680 17644 588\nf 3038 17679 10963\nf 17679 352 17240\nf 10963 17240 4161\nf 352 17680 7032\nf 17680 588 10966\nf 7032 10966 4162\nf 1816 15291 17646\nf 15291 1823 17681\nf 17646 17681 4153\nf 4162 10965 15293\nf 10965 4153 17681\nf 15293 17681 1823\nf 1823 10967 15294\nf 10967 4163 6626\nf 15294 6626 1595\nf 353 17682 17683\nf 17682 3039 17649\nf 17683 17649 589\nf 3039 17682 10969\nf 17682 353 10104\nf 10969 10104 4163\nf 353 17683 7035\nf 17683 589 10972\nf 7035 10972 4164\nf 1817 15295 17651\nf 15295 1824 17684\nf 17651 17684 4154\nf 4164 10971 15297\nf 10971 4154 17684\nf 15297 17684 1824\nf 1824 10973 15298\nf 10973 4165 17242\nf 15298 17242 1598\nf 354 17685 17686\nf 17685 3040 17654\nf 17686 17654 590\nf 3040 17685 10975\nf 17685 354 10110\nf 10975 10110 4165\nf 354 17686 6634\nf 17686 590 10978\nf 6634 10978 4166\nf 1818 15299 17656\nf 15299 1825 17687\nf 17656 17687 4155\nf 4166 10977 15300\nf 10977 4155 17687\nf 15300 17687 1825\nf 1825 10979 15301\nf 10979 69 10114\nf 15301 10114 1599\nf 355 8678 17688\nf 8678 69 10981\nf 17688 10981 3042\nf 3042 17659 17688\nf 17659 591 17689\nf 17688 17689 355\nf 4167 10121 10984\nf 10121 355 17689\nf 10984 17689 591\nf 1811 15302 10885\nf 15302 1826 17690\nf 10885 17690 4156\nf 4167 10983 15303\nf 10983 4156 17690\nf 15303 17690 1826\nf 1826 10985 15304\nf 10985 4168 10122\nf 15304 10122 1600\nf 356 17691 17692\nf 17691 3043 17662\nf 17692 17662 592\nf 3043 17691 10987\nf 17691 356 10119\nf 10987 10119 4168\nf 356 17692 6638\nf 17692 592 17693\nf 6638 17693 2901\nf 4169 10989 17663\nf 10989 2901 17693\nf 17663 17693 592\nf 1819 15305 17664\nf 15305 1601 10990\nf 17664 10990 4169\nf 357 17243 17694\nf 17243 4170 17665\nf 17694 17665 593\nf 357 17695 10130\nf 17695 4171 10992\nf 10130 10992 1602\nf 4171 17695 10940\nf 17695 357 17694\nf 10940 17694 593\nf 1812 15306 17666\nf 15306 1827 10993\nf 17666 10993 4171\nf 1827 10994 15308\nf 10994 4172 10128\nf 15308 10128 1272\nf 358 17696 17697\nf 17696 3044 17667\nf 17697 17667 585\nf 3044 17696 10996\nf 17696 358 17245\nf 10996 17245 4172\nf 1828 10997 15310\nf 10997 4144 10856\nf 15310 10856 1805\nf 569 17698 17700\nf 17698 3153 17699\nf 17700 17699 594\nf 3153 17698 10999\nf 17698 569 17585\nf 10999 17585 4144\nf 569 17700 7041\nf 17700 594 17701\nf 7041 17701 3046\nf 3068 11001 17702\nf 11001 3046 17701\nf 17702 17701 594\nf 1829 11003 15313\nf 11003 4173 10859\nf 15313 10859 1806\nf 571 17703 17705\nf 17703 4185 17704\nf 17705 17704 595\nf 4185 17703 11005\nf 17703 571 17589\nf 11005 17589 4173\nf 571 17705 17593\nf 17705 595 17706\nf 17593 17706 3048\nf 3070 11007 17707\nf 11007 3048 17706\nf 17707 17706 595\nf 1830 11009 15314\nf 11009 4174 10865\nf 15314 10865 1807\nf 573 17708 17710\nf 17708 4187 17709\nf 17710 17709 596\nf 4187 17708 11011\nf 17708 573 17595\nf 11011 17595 4174\nf 573 17710 17599\nf 17710 596 17711\nf 17599 17711 3049\nf 3073 11013 17712\nf 11013 3049 17711\nf 17712 17711 596\nf 1831 11015 15315\nf 11015 4175 10871\nf 15315 10871 1808\nf 575 17713 17715\nf 17713 4188 17714\nf 17715 17714 597\nf 4188 17713 11017\nf 17713 575 17601\nf 11017 17601 4175\nf 575 17715 17605\nf 17715 597 17716\nf 17605 17716 3050\nf 3076 11019 17717\nf 11019 3050 17716\nf 17717 17716 597\nf 1832 11021 15316\nf 11021 4176 10877\nf 15316 10877 1809\nf 577 17718 17720\nf 17718 4189 17719\nf 17720 17719 598\nf 4189 17718 11023\nf 17718 577 17607\nf 11023 17607 4176\nf 577 17720 17611\nf 17720 598 17721\nf 17611 17721 3051\nf 3078 11025 17722\nf 11025 3051 17721\nf 17722 17721 598\nf 1833 11027 15317\nf 11027 4177 10883\nf 15317 10883 1810\nf 579 17723 17725\nf 17723 4190 17724\nf 17725 17724 599\nf 4190 17723 11029\nf 17723 579 17613\nf 11029 17613 4177\nf 579 17725 17618\nf 17725 599 17726\nf 17618 17726 3052\nf 3079 11031 17727\nf 11031 3052 17726\nf 17727 17726 599\nf 1834 11035 15318\nf 11035 3035 10930\nf 15318 10930 1811\nf 581 11033 17729\nf 11033 1834 17728\nf 17729 17728 4192\nf 581 17729 17731\nf 17729 4192 17730\nf 17731 17730 600\nf 581 17731 17621\nf 17731 600 17732\nf 17621 17732 3053\nf 3080 11037 11134\nf 11037 3053 17732\nf 11134 17732 600\nf 1835 17733 15320\nf 17733 3036 10936\nf 15320 10936 1819\nf 3036 17733 11040\nf 17733 1835 17734\nf 11040 17734 4194\nf 583 17735 17624\nf 17735 4195 11042\nf 17624 11042 3054\nf 1836 11044 15322\nf 11044 4178 10942\nf 15322 10942 1812\nf 4196 17736 11046\nf 17736 584 17626\nf 11046 17626 4178\nf 584 17736 17737\nf 17736 4196 11140\nf 17737 11140 601\nf 584 17738 17627\nf 17738 3055 17739\nf 17627 17739 585\nf 3055 17738 17741\nf 17738 584 17740\nf 17741 17740 4179\nf 4179 17740 15362\nf 17740 584 17737\nf 15362 17737 601\nf 4179 17742 17741\nf 17742 4180 17743\nf 17741 17743 3055\nf 4180 17742 11050\nf 17742 4179 17744\nf 11050 17744 4198\nf 326 11051 17746\nf 11051 4198 17745\nf 17746 17745 327\nf 3055 17743 17748\nf 17743 4180 17747\nf 17748 17747 1837\nf 3056 15323 11049\nf 15323 1837 17747\nf 11049 17747 4180\nf 5923 17749 10139\nf 17749 3056 11048\nf 10139 11048 326\nf 585 17739 17697\nf 17739 3055 11052\nf 17697 11052 358\nf 3055 17748 11053\nf 17748 1837 11055\nf 11053 11055 66\nf 3057 17580 11063\nf 17580 567 11153\nf 11063 11153 602\nf 1838 11148 15324\nf 11148 4181 11065\nf 15324 11065 3058\nf 548 17750 17752\nf 17750 4181 17751\nf 17752 17751 563\nf 4181 17750 11066\nf 17750 548 17579\nf 11066 17579 3025\nf 548 17752 17578\nf 17752 563 17753\nf 17578 17753 4142\nf 4182 11068 17754\nf 11068 4142 17753\nf 17754 17753 563\nf 1799 17755 11070\nf 17755 562 15327\nf 11070 15327 547\nf 1789 17528 17552\nf 17528 3015 11074\nf 17552 11074 3019\nf 3016 17526 11077\nf 17526 1789 17549\nf 11077 17549 3020\nf 3060 17548 17520\nf 17548 1797 17756\nf 17520 17756 1787\nf 1786 17571 11080\nf 17571 1787 17757\nf 11080 17757 3059\nf 1797 17545 17756\nf 17545 3059 17757\nf 17756 17757 1787\nf 1795 17758 17544\nf 17758 3062 11083\nf 17544 11083 3018\nf 3062 17758 17517\nf 17758 1795 17759\nf 17517 17759 1785\nf 3013 17516 11086\nf 17516 1785 17760\nf 11086 17760 3061\nf 1795 10798 17759\nf 10798 3061 17760\nf 17759 17760 1785\nf 1793 17761 17541\nf 17761 3064 11089\nf 17541 11089 3017\nf 3064 17761 17510\nf 17761 1793 17762\nf 17510 17762 1783\nf 3011 17509 11092\nf 17509 1783 17763\nf 11092 17763 3063\nf 1793 17539 17762\nf 17539 3063 17763\nf 17762 17763 1783\nf 1781 11096 17765\nf 11096 4183 17764\nf 17765 17764 1839\nf 4183 10783 17764\nf 10783 1792 15333\nf 17764 15333 1839\nf 1839 17766 17765\nf 17766 3009 17767\nf 17765 17767 1781\nf 3009 17766 11099\nf 17766 1839 17768\nf 11099 17768 4184\nf 4184 17768 7052\nf 17768 1839 15332\nf 7052 15332 3065\nf 538 11100 11426\nf 11100 552 11103\nf 11426 11103 3150\nf 1791 15335 10780\nf 15335 3066 15337\nf 10780 15337 4137\nf 3150 11102 15417\nf 11102 4137 15338\nf 15417 15338 1840\nf 1841 11104 15340\nf 11104 4185 11004\nf 15340 11004 1829\nf 595 17769 17771\nf 17769 3152 17770\nf 17771 17770 549\nf 3152 17769 11106\nf 17769 595 17704\nf 11106 17704 4185\nf 595 17771 17707\nf 17771 549 17772\nf 17707 17772 3070\nf 4186 11108 17773\nf 11108 3070 17772\nf 17773 17772 549\nf 1790 15341 11438\nf 15341 1842 11109\nf 11438 11109 4186\nf 1842 11110 15342\nf 11110 4187 11010\nf 15342 11010 1830\nf 596 17774 17775\nf 17774 3069 17532\nf 17775 17532 551\nf 3069 17774 11112\nf 17774 596 17709\nf 11112 17709 4187\nf 596 17775 17712\nf 17775 551 11115\nf 17712 11115 3073\nf 1791 15344 15336\nf 15344 1843 17776\nf 15336 17776 3067\nf 3073 11114 15345\nf 11114 3067 17776\nf 15345 17776 1843\nf 1843 11116 15346\nf 11116 4188 11016\nf 15346 11016 1831\nf 597 17777 17778\nf 17777 3071 7057\nf 17778 7057 553\nf 3071 17777 11118\nf 17777 597 17714\nf 11118 17714 4188\nf 597 17778 17717\nf 17778 553 11121\nf 17717 11121 3076\nf 1792 15348 15334\nf 15348 1844 17779\nf 15334 17779 3065\nf 3076 11120 15349\nf 11120 3065 17779\nf 15349 17779 1844\nf 1844 11122 15350\nf 11122 4189 11022\nf 15350 11022 1832\nf 598 17780 17781\nf 17780 3074 7060\nf 17781 7060 555\nf 3074 17780 11124\nf 17780 598 17719\nf 11124 17719 4189\nf 598 17781 17722\nf 17781 555 17782\nf 17722 17782 3078\nf 1794 11126 17783\nf 11126 3078 17782\nf 17783 17782 555\nf 4138 17538 17535\nf 17538 1794 17783\nf 17535 17783 555\nf 1845 11128 15352\nf 11128 4190 11028\nf 15352 11028 1833\nf 599 17724 17785\nf 17724 4190 17784\nf 17785 17784 557\nf 3077 10790 11130\nf 10790 557 17784\nf 11130 17784 4190\nf 599 17786 17727\nf 17786 4191 17787\nf 17727 17787 3079\nf 4191 17786 10795\nf 17786 599 17785\nf 10795 17785 557\nf 4191 17542 17787\nf 17542 1796 11133\nf 17787 11133 3079\nf 3079 11132 11032\nf 11132 4192 17728\nf 11032 17728 1834\nf 600 17788 11135\nf 17788 3018 15261\nf 11135 15261 559\nf 3018 17788 15354\nf 17788 600 17730\nf 15354 17730 4192\nf 3080 7068 15355\nf 7068 4193 17789\nf 15355 17789 1846\nf 1797 15264 17546\nf 15264 1846 17789\nf 17546 17789 4193\nf 4194 17734 17790\nf 17734 1835 15356\nf 17790 15356 1846\nf 4194 17790 17547\nf 17790 1846 15266\nf 17547 15266 1798\nf 4195 17735 15267\nf 17735 583 7063\nf 15267 7063 561\nf 4195 11139 15358\nf 11139 3020 17551\nf 15358 17551 1847\nf 1847 17791 15359\nf 17791 4196 11045\nf 15359 11045 1836\nf 4196 17791 11141\nf 17791 1847 17553\nf 11141 17553 3019\nf 601 15357 15363\nf 15357 562 17792\nf 15363 17792 4197\nf 1799 15360 17755\nf 15360 4197 17792\nf 17755 17792 562\nf 4197 11143 15361\nf 11143 4198 17744\nf 15361 17744 4179\nf 327 17793 17794\nf 17793 4182 17754\nf 17794 17754 563\nf 4182 17793 11145\nf 17793 327 17745\nf 11145 17745 4198\nf 3081 17795 11147\nf 17795 563 17751\nf 11147 17751 4181\nf 563 17795 17794\nf 17795 3081 17229\nf 17794 17229 327\nf 4199 11059 11151\nf 11059 1803 11058\nf 11151 11058 1604\nf 4199 10141 11152\nf 10141 325 11150\nf 11152 11150 602\nf 396 11167 11164\nf 11167 1854 17796\nf 11164 17796 3083\nf 1853 7092 11163\nf 7092 3083 17796\nf 11163 17796 1854\nf 1869 17797 11196\nf 17797 3085 17798\nf 11196 17798 1868\nf 3084 11190 11195\nf 11190 1868 17798\nf 11195 17798 3085\nf 1870 11198 11199\nf 11198 3085 17797\nf 11199 17797 1869\nf 1873 17799 17801\nf 17799 1897 17800\nf 17801 17800 3106\nf 3096 11208 17802\nf 11208 627 15380\nf 17802 15380 1876\nf 3095 11235 11210\nf 11235 1876 17803\nf 11210 17803 3100\nf 1875 17804 15381\nf 17804 3100 17803\nf 15381 17803 1876\nf 1877 17805 17806\nf 17805 1878 7178\nf 17806 7178 3088\nf 3087 7209 7175\nf 7209 1878 17805\nf 7175 17805 1877\nf 1879 17807 17808\nf 17807 3091 11215\nf 17808 11215 629\nf 3091 17807 15370\nf 17807 1879 17809\nf 15370 17809 1880\nf 3090 11216 17810\nf 11216 1880 17809\nf 17810 17809 1879\nf 3103 11220 7236\nf 11220 3092 7187\nf 7236 7187 623\nf 3093 7188 11227\nf 7188 409 10188\nf 11227 10188 1885\nf 1874 11205 11231\nf 11205 5823 17811\nf 11231 17811 1886\nf 1876 11234 17802\nf 11234 1867 15376\nf 17802 15376 3096\nf 3089 11237 7201\nf 11237 1859 11177\nf 7201 11177 611\nf 3092 15371 15369\nf 15371 3098 7217\nf 15369 7217 624\nf 3082 17812 11241\nf 17812 1882 15377\nf 11241 15377 3097\nf 3098 15372 11239\nf 15372 1882 17812\nf 11239 17812 3082\nf 347 11247 11248\nf 11247 4107 10143\nf 11248 10143 368\nf 4200 17813 11251\nf 17813 619 11206\nf 11251 11206 1874\nf 619 17813 11207\nf 17813 4200 15395\nf 11207 15395 627\nf 1888 17814 17815\nf 17814 1875 11253\nf 17815 11253 3118\nf 1888 17816 17814\nf 17816 3100 17804\nf 17814 17804 1875\nf 1889 17817 17819\nf 17817 1877 17818\nf 17819 17818 3120\nf 3088 11256 17806\nf 11256 3120 17818\nf 17806 17818 1877\nf 1889 17820 17817\nf 17820 621 7173\nf 17817 7173 1877\nf 629 15398 17808\nf 15398 1890 17821\nf 17808 17821 1879\nf 3090 17810 11258\nf 17810 1879 17822\nf 11258 17822 3101\nf 1890 17823 17821\nf 17823 3101 17822\nf 17821 17822 1879\nf 3103 11261 15386\nf 11261 1891 17824\nf 15386 17824 1881\nf 5972 7231 17825\nf 7231 1881 17824\nf 17825 17824 1891\nf 3094 17826 11267\nf 17826 1892 17827\nf 11267 17827 3104\nf 1892 17826 11264\nf 17826 3094 15374\nf 11264 15374 1883\nf 1896 11276 7241\nf 11276 4201 15401\nf 7241 15401 1895\nf 628 17828 11278\nf 17828 1897 17829\nf 11278 17829 3086\nf 1873 17830 17799\nf 17830 3086 17829\nf 17799 17829 1897\nf 1898 17831 17832\nf 17831 3108 11281\nf 17832 11281 3136\nf 3108 17831 17834\nf 17831 1898 17833\nf 17834 17833 1899\nf 3119 17835 11284\nf 17835 1899 17836\nf 11284 17836 3107\nf 1898 17837 17833\nf 17837 3107 17836\nf 17833 17836 1899\nf 3109 17838 17839\nf 17838 3110 11287\nf 17839 11287 3134\nf 3110 17838 17840\nf 17838 3109 11290\nf 17840 11290 1900\nf 1901 17841 17842\nf 17841 3111 11293\nf 17842 11293 3133\nf 5972 17843 17845\nf 17843 1901 17844\nf 17845 17844 1902\nf 1901 17846 17844\nf 17846 639 7263\nf 17844 7263 1902\nf 1903 17847 17848\nf 17847 3113 11296\nf 17848 11296 3131\nf 3113 17847 17850\nf 17847 1903 17849\nf 17850 17849 1904\nf 3112 11299 17851\nf 11299 1904 17849\nf 17851 17849 1903\nf 1905 17852 7276\nf 17852 1906 17853\nf 7276 17853 3129\nf 3116 15390 15393\nf 15390 3129 17853\nf 15393 17853 1906\nf 3123 11341 11300\nf 11341 1906 17854\nf 11300 17854 3114\nf 1905 7245 17852\nf 7245 3114 17854\nf 17852 17854 1906\nf 367 7281 6992\nf 7281 3139 17855\nf 6992 17855 368\nf 1887 11249 11310\nf 11249 368 17855\nf 11310 17855 3139\nf 616 11311 17857\nf 11311 1911 17856\nf 17857 17856 4962\nf 1911 11313 11309\nf 11313 4200 11250\nf 11309 11250 1887\nf 1897 17858 17800\nf 17858 1888 17859\nf 17800 17859 3106\nf 3118 11317 17815\nf 11317 3106 17859\nf 17815 17859 1888\nf 628 17860 17828\nf 17860 1888 17858\nf 17828 17858 1897\nf 1888 17860 17816\nf 17860 628 15379\nf 17816 15379 3100\nf 1899 17861 17834\nf 17861 1889 17862\nf 17834 17862 3108\nf 3120 11319 17819\nf 11319 3108 17862\nf 17819 17862 1889\nf 621 17820 11321\nf 17820 1889 17863\nf 11321 17863 3119\nf 1899 17835 17861\nf 17835 3119 17863\nf 17861 17863 1889\nf 1900 17864 17840\nf 17864 1890 11324\nf 17840 11324 3110\nf 3101 17823 11327\nf 17823 1890 17864\nf 11327 17864 1900\nf 1901 17843 17841\nf 17843 5972 17865\nf 17841 17865 3111\nf 3122 17866 15400\nf 17866 1904 17867\nf 15400 17867 1892\nf 1904 17866 17850\nf 17866 3122 11333\nf 17850 11333 3113\nf 3104 17827 17868\nf 17827 1892 17867\nf 17868 17867 1904\nf 1904 11298 17868\nf 11298 3121 11335\nf 17868 11335 3104\nf 3116 11338 7248\nf 11338 3124 7259\nf 7248 7259 3121\nf 1907 17869 15394\nf 17869 3127 11349\nf 15394 11349 3117\nf 3127 17869 17425\nf 17869 1907 17870\nf 17425 17870 1749\nf 3126 11352 15404\nf 11352 1749 17870\nf 15404 17870 1907\nf 1905 7278 7243\nf 7278 3128 17871\nf 7243 17871 3115\nf 3130 11355 17429\nf 11355 3115 17872\nf 17429 17872 1751\nf 2974 17434 11357\nf 17434 1751 17873\nf 11357 17873 3128\nf 3115 17871 17872\nf 17871 3128 17873\nf 17872 17873 1751\nf 1903 17874 17851\nf 17874 3132 11360\nf 17851 11360 3112\nf 3132 17874 17436\nf 17874 1903 17875\nf 17436 17875 1753\nf 2976 17441 11363\nf 17441 1753 17876\nf 11363 17876 3131\nf 1903 17848 17875\nf 17848 3131 17876\nf 17875 17876 1753\nf 639 17877 15391\nf 17877 1755 17444\nf 15391 17444 638\nf 1755 17877 17878\nf 17877 639 17846\nf 17878 17846 1901\nf 2978 17448 11366\nf 17448 1755 17879\nf 11366 17879 3133\nf 1901 17842 17878\nf 17842 3133 17879\nf 17878 17879 1755\nf 3135 11369 17450\nf 11369 3109 17880\nf 17450 17880 1757\nf 2979 17455 11372\nf 17455 1757 17881\nf 11372 17881 3134\nf 3109 17839 17880\nf 17839 3134 17881\nf 17880 17881 1757\nf 1898 17882 17837\nf 17882 3137 11375\nf 17837 11375 3107\nf 3137 17882 17457\nf 17882 1898 17883\nf 17457 17883 1759\nf 2981 17462 11378\nf 17462 1759 17884\nf 11378 17884 3136\nf 1898 17832 17883\nf 17832 3136 17884\nf 17883 17884 1759\nf 1873 17885 17830\nf 17885 3138 11381\nf 17830 11381 3086\nf 3138 17885 17464\nf 17885 1873 17886\nf 17464 17886 1761\nf 2983 17887 11384\nf 17887 1873 17801\nf 11384 17801 3106\nf 1873 17887 17886\nf 17887 2983 10648\nf 17886 10648 1761\nf 617 17888 15237\nf 17888 1913 11392\nf 15237 11392 475\nf 1913 17888 11387\nf 17888 617 17889\nf 11387 17889 4962\nf 527 17890 7000\nf 17890 3140 7279\nf 7000 7279 367\nf 3140 17890 11391\nf 17890 527 17503\nf 11391 17503 3141\nf 475 11394 15194\nf 11394 4202 17891\nf 15194 17891 328\nf 1771 10723 11397\nf 10723 328 17891\nf 11397 17891 4202\nf 3142 17892 11401\nf 17892 1914 17491\nf 11401 17491 2925\nf 2896 17302 17893\nf 17302 3001 17489\nf 17893 17489 1914\nf 1587 17558 17894\nf 17558 2896 17893\nf 17894 17893 1914\nf 2926 17306 17895\nf 17306 2927 17303\nf 17895 17303 1915\nf 3143 17554 11404\nf 17554 1915 17304\nf 11404 17304 2958\nf 3021 17401 17896\nf 17401 2926 17895\nf 17896 17895 1915\nf 1773 17496 17556\nf 17496 3021 17896\nf 17556 17896 1915\nf 3145 17492 15201\nf 17492 1916 17350\nf 15201 17350 1708\nf 3144 17348 11411\nf 17348 1916 17897\nf 11411 17897 3005\nf 1772 17567 17494\nf 17567 3005 17897\nf 17494 17897 1916\nf 1709 17353 17389\nf 17353 2948 17898\nf 17389 17898 1917\nf 3147 17563 11415\nf 17563 1917 17898\nf 11415 17898 2948\nf 3146 17387 11417\nf 17387 1917 17899\nf 11417 17899 3026\nf 1782 17507 17565\nf 17507 3026 17899\nf 17565 17899 1917\nf 1588 17391 17238\nf 17391 2897 17900\nf 17238 17900 1918\nf 3149 17504 11421\nf 17504 1918 17900\nf 11421 17900 2897\nf 3148 17239 11423\nf 17239 1918 17901\nf 11423 17901 3009\nf 1781 17767 17505\nf 17767 3009 17901\nf 17505 17901 1918\nf 4120 17288 17902\nf 17288 1677 15415\nf 17902 15415 1840\nf 3150 15416 11427\nf 15416 1677 17287\nf 11427 17287 2921\nf 470 11431 17904\nf 11431 4203 17903\nf 17904 17903 550\nf 3066 7054 11430\nf 7054 550 17903\nf 11430 17903 4203\nf 1840 11428 17902\nf 11428 4203 11433\nf 17902 11433 4120\nf 470 17904 10334\nf 17904 550 17905\nf 10334 17905 2922\nf 3151 11435 17530\nf 11435 2922 17905\nf 17530 17905 550\nf 471 17906 17907\nf 17906 4186 17773\nf 17907 17773 549\nf 4186 17906 11439\nf 17906 471 17291\nf 11439 17291 4204\nf 1790 11437 15418\nf 11437 4204 10337\nf 15418 10337 1678\nf 471 17907 17295\nf 17907 549 17908\nf 17295 17908 2923\nf 3152 11441 17770\nf 11441 2923 17908\nf 17770 17908 549\nf 472 17909 17910\nf 17909 3068 17702\nf 17910 17702 594\nf 3068 17909 15339\nf 17909 472 11443\nf 15339 11443 1841\nf 1841 11445 15419\nf 11445 4122 17298\nf 15419 17298 1679\nf 472 17910 17912\nf 17910 594 17911\nf 17912 17911 2924\nf 3153 11447 17699\nf 11447 2924 17911\nf 17699 17911 594\nf 473 17300 17913\nf 17300 4124 11450\nf 17913 11450 4963\nf 1828 17914 15420\nf 17914 4124 10348\nf 15420 10348 1680\nf 4124 17914 11451\nf 17914 1828 15309\nf 11451 15309 3045\nf 473 17913 10354\nf 17913 4963 11452\nf 10354 11452 4125\nf 448 10357 17915\nf 10357 474 7287\nf 17915 7287 451\n\nusemtl material_1\nf 4971 17916 17918\nf 17916 4964 17917\nf 17918 17917 4205\nf 5525 17919 11456\nf 17919 4205 17917\nf 11456 17917 4964\nf 28 17920 17922\nf 17920 5526 17921\nf 17922 17921 5527\nf 4208 17923 17925\nf 17923 4206 17924\nf 17925 17924 4207\nf 4967 17926 11462\nf 17926 4206 15433\nf 11462 15433 4968\nf 31 17927 17929\nf 17927 5846 17928\nf 17929 17928 5526\nf 4208 17925 17931\nf 17925 4207 17930\nf 17931 17930 5528\nf 5528 17932 17933\nf 17932 5526 17928\nf 17933 17928 5846\nf 30 8629 17935\nf 8629 32 17934\nf 17935 17934 4969\nf 4212 17936 17938\nf 17936 4210 17937\nf 17938 17937 4970\nf 5331 17939 17941\nf 17939 5847 17940\nf 17941 17940 4971\nf 3159 17942 17944\nf 17942 1921 17943\nf 17944 17943 5529\nf 4209 17945 17947\nf 17945 4812 17946\nf 17947 17946 5529\nf 4812 17945 15441\nf 17945 4209 17948\nf 15441 17948 3160\nf 5333 17949 17951\nf 17949 1926 17950\nf 17951 17950 5534\nf 5332 17952 15436\nf 17952 3161 11467\nf 15436 11467 4213\nf 3161 17952 17954\nf 17952 5332 17953\nf 17954 17953 1925\nf 1925 17955 17957\nf 17955 5534 17956\nf 17957 17956 5536\nf 5334 17958 15442\nf 17958 1926 17959\nf 15442 17959 3159\nf 4215 17960 17962\nf 17960 5848 17961\nf 17962 17961 3161\nf 5848 17963 11477\nf 17963 5537 17964\nf 11477 17964 4973\nf 1926 17965 17967\nf 17965 5888 17966\nf 17967 17966 5536\nf 5538 17968 17970\nf 17968 4216 17969\nf 17970 17969 3162\nf 5849 17971 17972\nf 17971 34 6019\nf 17972 6019 39\nf 3163 17973 17975\nf 17973 4215 17974\nf 17975 17974 5879\nf 4974 17976 17978\nf 17976 4215 17977\nf 17978 17977 1925\nf 5849 17979 17981\nf 17979 38 17980\nf 17981 17980 5897\nf 4976 17982 17984\nf 17982 4217 17983\nf 17984 17983 5540\nf 3171 15449 17986\nf 15449 4219 17985\nf 17986 17985 3166\nf 5542 17987 17989\nf 17987 4221 17988\nf 17989 17988 4815\nf 5543 17990 17992\nf 17990 4220 17991\nf 17992 17991 4978\nf 4816 17993 7291\nf 17993 5541 17994\nf 7291 17994 4817\nf 5545 17995 17997\nf 17995 3169 17996\nf 17997 17996 5544\nf 4814 17998 18000\nf 17998 3168 17999\nf 18000 17999 4978\nf 1933 18001 18003\nf 18001 4979 18002\nf 18003 18002 5338\nf 5544 18004 11483\nf 18004 4220 18005\nf 11483 18005 4979\nf 3174 18006 18008\nf 18006 4229 18007\nf 18008 18007 4833\nf 5018 18009 18011\nf 18009 3184 18010\nf 18011 18010 1942\nf 4223 18012 18014\nf 18012 4249 18013\nf 18014 18013 4222\nf 5546 18015 18016\nf 18015 4818 15496\nf 18016 15496 4233\nf 4981 18017 18019\nf 18017 4818 18018\nf 18019 18018 5547\nf 4820 18020 18022\nf 18020 3178 18021\nf 18022 18021 4819\nf 3179 18023 18025\nf 18023 5341 18024\nf 18025 18024 5343\nf 5549 18026 18028\nf 18026 650 18027\nf 18028 18027 4821\nf 4228 18029 15471\nf 18029 3183 18030\nf 15471 18030 4227\nf 5550 18031 18033\nf 18031 3180 18032\nf 18033 18032 5342\nf 652 15487 18035\nf 15487 5551 18034\nf 18035 18034 4821\nf 3181 18036 18038\nf 18036 4226 18037\nf 18038 18037 3182\nf 3183 18039 18041\nf 18039 1940 18040\nf 18041 18040 4232\nf 1940 18042 18044\nf 18042 5550 18043\nf 18044 18043 5345\nf 3183 18045 18047\nf 18045 4825 18046\nf 18047 18046 5552\nf 4986 18048 11497\nf 18048 4833 18007\nf 11497 18007 4229\nf 1934 18049 18051\nf 18049 5569 18050\nf 18051 18050 5346\nf 4988 11495 18053\nf 11495 4229 18052\nf 18053 18052 4991\nf 5346 18054 18051\nf 18054 5850 18055\nf 18051 18055 1934\nf 4229 18006 18057\nf 18006 3174 18056\nf 18057 18056 4230\nf 4823 18058 18060\nf 18058 655 18059\nf 18060 18059 5554\nf 369 18061 18062\nf 18061 4991 11502\nf 18062 11502 5555\nf 5850 18063 18065\nf 18063 3189 18064\nf 18065 18064 5553\nf 4231 18066 18068\nf 18066 4987 18067\nf 18068 18067 5553\nf 5349 18069 18071\nf 18069 4989 18070\nf 18071 18070 5348\nf 3187 15505 18073\nf 15505 1944 18072\nf 18073 18072 5348\nf 5554 11506 18075\nf 11506 3188 18074\nf 18075 18074 4824\nf 4824 18076 18075\nf 18076 4823 18060\nf 18075 18060 5554\nf 5348 18077 18071\nf 18077 5930 18078\nf 18071 18078 5349\nf 45 18079 18081\nf 18079 5951 18080\nf 18081 18080 5958\nf 4992 18082 18084\nf 18082 4232 18083\nf 18084 18083 5345\nf 3183 18029 18039\nf 18029 4228 18085\nf 18039 18085 1940\nf 1945 18086 18088\nf 18086 1941 18087\nf 18088 18087 5350\nf 1932 18089 18091\nf 18089 4992 18090\nf 18091 18090 4826\nf 4994 18092 15454\nf 18092 5926 18093\nf 15454 18093 5338\nf 5546 18094 18096\nf 18094 1935 18095\nf 18096 18095 1937\nf 4998 18097 18099\nf 18097 3193 18098\nf 18099 18098 5556\nf 3217 18100 18102\nf 18100 3192 18101\nf 18102 18101 5890\nf 5557 18103 15580\nf 18103 658 18104\nf 15580 18104 5049\nf 5003 15498 18106\nf 15498 3241 18105\nf 18106 18105 1948\nf 3195 18107 18109\nf 18107 5001 18108\nf 18109 18108 5352\nf 5558 18110 18112\nf 18110 5557 18111\nf 18112 18111 3194\nf 3194 11514 18113\nf 11514 5000 15506\nf 18113 15506 3196\nf 1948 18114 18106\nf 18114 5930 18115\nf 18106 18115 5003\nf 528 6654 18117\nf 6654 366 18116\nf 18117 18116 4827\nf 4231 18118 18120\nf 18118 5352 18119\nf 18120 18119 4990\nf 4828 18121 18123\nf 18121 5532 18122\nf 18123 18122 4238\nf 1949 18124 18126\nf 18124 1951 18125\nf 18126 18125 1922\nf 5531 18127 18129\nf 18127 1950 18128\nf 18129 18128 5530\nf 1949 18130 18132\nf 18130 4239 18131\nf 18132 18131 5354\nf 4240 18133 11521\nf 18133 3199 15515\nf 11521 15515 1952\nf 4810 18134 18135\nf 18134 3199 18133\nf 18135 18133 4240\nf 4241 18136 18138\nf 18136 3198 18137\nf 18138 18137 4242\nf 5559 18139 18141\nf 18139 5966 18140\nf 18141 18140 4829\nf 5560 15510 18143\nf 15510 4241 18142\nf 18143 18142 5006\nf 1955 18144 18146\nf 18144 1953 18145\nf 18146 18145 1954\nf 5009 7303 18147\nf 7303 374 11203\nf 18147 11203 379\nf 5008 18148 18150\nf 18148 4243 18149\nf 18150 18149 4242\nf 4829 18151 18153\nf 18151 5562 18152\nf 18153 18152 3200\nf 4829 18154 18151\nf 18154 661 18155\nf 18151 18155 5562\nf 5562 18156 18158\nf 18156 5565 18157\nf 18158 18157 3202\nf 5566 18159 18161\nf 18159 5565 18160\nf 18161 18160 5564\nf 3206 15526 18163\nf 15526 1957 18162\nf 18163 18162 1954\nf 5563 18164 18166\nf 18164 3207 18165\nf 18166 18165 3203\nf 3204 18167 18169\nf 18167 5880 18168\nf 18169 18168 3205\nf 3207 18170 18172\nf 18170 1959 18171\nf 18172 18171 1962\nf 5355 18173 15531\nf 18173 3208 18174\nf 15531 18174 1960\nf 3209 18175 18176\nf 18175 5014 15535\nf 18176 15535 3211\nf 377 18177 10158\nf 18177 5011 18178\nf 10158 18178 1613\nf 5015 11534 15534\nf 11534 1613 18178\nf 15534 18178 5011\nf 1961 18179 18181\nf 18179 4831 18180\nf 18181 18180 5355\nf 3209 18176 18183\nf 18176 3211 18182\nf 18183 18182 3208\nf 4831 18179 7308\nf 18179 1961 18184\nf 7308 18184 1959\nf 3211 7313 18182\nf 7313 1960 18174\nf 18182 18174 3208\nf 4247 18185 18187\nf 18185 1962 18186\nf 18187 18186 3213\nf 3210 11530 18189\nf 11530 4247 18188\nf 18189 18188 5017\nf 1964 18190 18191\nf 18190 3213 18186\nf 18191 18186 1962\nf 3212 15543 18193\nf 15543 5019 18192\nf 18193 18192 5567\nf 4832 18194 18196\nf 18194 4248 18195\nf 18196 18195 4249\nf 4832 18196 18198\nf 18196 4249 18197\nf 18198 18197 3214\nf 5016 18199 11537\nf 18199 4986 18200\nf 11537 18200 5568\nf 1964 18201 18190\nf 18201 5569 18202\nf 18190 18202 3213\nf 4249 18012 18197\nf 18012 4223 18203\nf 18197 18203 3214\nf 4223 15478 18203\nf 15478 3184 18204\nf 18203 18204 3214\nf 4248 18205 18195\nf 18205 5020 18206\nf 18195 18206 4249\nf 4996 18207 18208\nf 18207 5021 15495\nf 18208 15495 4234\nf 4235 11542 18210\nf 11542 5021 18209\nf 18210 18209 3219\nf 3221 18211 18212\nf 18211 4235 18210\nf 18212 18210 3219\nf 5556 18213 18215\nf 18213 3216 18214\nf 18215 18214 5571\nf 5022 18216 18218\nf 18216 4834 18217\nf 18218 18217 5572\nf 5025 18219 18221\nf 18219 665 18220\nf 18221 18220 5571\nf 3222 18222 18224\nf 18222 5024 18223\nf 18224 18223 1966\nf 5900 18225 18227\nf 18225 5573 18226\nf 18227 18226 5570\nf 5029 18228 11549\nf 18228 4250 18229\nf 11549 18229 5031\nf 5030 18230 11548\nf 18230 667 18231\nf 11548 18231 5029\nf 4251 18232 18234\nf 18232 5851 18233\nf 18234 18233 5574\nf 5577 18235 18237\nf 18235 3225 18236\nf 18237 18236 4835\nf 5576 18238 18240\nf 18238 4254 18239\nf 18240 18239 5028\nf 5034 18241 18243\nf 18241 4254 18242\nf 18243 18242 5036\nf 4837 18244 18246\nf 18244 4836 18245\nf 18246 18245 5901\nf 5038 18247 18248\nf 18247 1972 11554\nf 18248 11554 5580\nf 5579 18249 18250\nf 18249 62 11154\nf 18250 11154 360\nf 5041 18251 18253\nf 18251 4256 18252\nf 18253 18252 4258\nf 5038 18254 18247\nf 18254 5578 18255\nf 18247 18255 1972\nf 5581 18256 18258\nf 18256 360 18257\nf 18258 18257 5583\nf 5041 18253 18260\nf 18253 4258 18259\nf 18260 18259 4260\nf 1974 18261 18263\nf 18261 1973 18262\nf 18263 18262 5360\nf 1975 15564 18265\nf 15564 1976 18264\nf 18265 18264 5360\nf 1974 18266 18268\nf 18266 3233 18267\nf 18268 18267 4259\nf 5043 18269 18270\nf 18269 5360 18264\nf 18270 18264 1976\nf 361 18271 18273\nf 18271 5361 18272\nf 18273 18272 4838\nf 3232 18274 18276\nf 18274 3231 18275\nf 18276 18275 4261\nf 5042 18277 15567\nf 18277 4262 18278\nf 15567 18278 4260\nf 4262 18279 18281\nf 18279 5585 18280\nf 18281 18280 5584\nf 3237 18282 18283\nf 18282 1976 15572\nf 18283 15572 1977\nf 5044 18284 18286\nf 18284 3237 18285\nf 18286 18285 5362\nf 5046 18287 18289\nf 18287 4263 18288\nf 18289 18288 5361\nf 4264 18290 18292\nf 18290 5363 18291\nf 18292 18291 1977\nf 4264 18293 18295\nf 18293 3236 18294\nf 18295 18294 5047\nf 5048 18296 18298\nf 18296 5001 18297\nf 18298 18297 4266\nf 4236 18299 18300\nf 18299 4266 18297\nf 18300 18297 5001\n\nusemtl material_2\nf 5588 18301 18303\nf 18301 4269 18302\nf 18303 18302 5589\nf 5588 18304 18306\nf 18304 5905 18305\nf 18306 18305 5587\nf 3245 18307 18309\nf 18307 1979 18308\nf 18309 18308 5591\nf 1981 18310 18311\nf 18310 4841 7318\nf 18311 7318 5817\nf 1983 18312 18314\nf 18312 5817 18313\nf 18314 18313 5369\nf 5592 18315 15586\nf 18315 676 18316\nf 15586 18316 5838\nf 5079 18317 18319\nf 18317 3246 18318\nf 18319 18318 5052\nf 5057 18320 18322\nf 18320 4272 18321\nf 18322 18321 4851\nf 4851 18323 18322\nf 18323 5609 18324\nf 18322 18324 5057\nf 5368 18325 18327\nf 18325 1981 18326\nf 18327 18326 5056\nf 1984 18328 18330\nf 18328 5060 18329\nf 18330 18329 5370\nf 5059 18331 18333\nf 18331 5370 18332\nf 18333 18332 1985\nf 5593 18334 18336\nf 18334 161 18335\nf 18336 18335 5594\nf 5527 18337 18339\nf 18337 4207 18338\nf 18339 18338 4274\nf 3247 18340 18341\nf 18340 5370 18331\nf 18341 18331 5059\nf 5593 18342 18344\nf 18342 4273 18343\nf 18344 18343 5596\nf 1986 18345 18347\nf 18345 5595 18346\nf 18347 18346 5372\nf 5062 18348 18350\nf 18348 1985 18349\nf 18350 18349 3249\nf 1986 18351 18353\nf 18351 4276 18352\nf 18353 18352 5374\nf 4276 18351 18354\nf 18351 1986 15588\nf 18354 15588 4843\nf 5061 18355 18357\nf 18355 4275 18356\nf 18357 18356 5371\nf 1987 15599 18359\nf 15599 5060 18358\nf 18359 18358 5373\nf 3251 11577 18361\nf 11577 5066 18360\nf 18361 18360 5063\nf 5064 11571 11575\nf 11571 1987 18362\nf 11575 18362 3252\nf 5061 18363 18365\nf 18363 680 18364\nf 18365 18364 4846\nf 158 18366 18368\nf 18366 5065 18367\nf 18368 18367 5376\nf 5064 11574 18370\nf 11574 5067 18369\nf 18370 18369 4277\nf 5597 18371 18373\nf 18371 4847 18372\nf 18373 18372 5373\nf 4847 18374 18372\nf 18374 1987 18359\nf 18372 18359 5373\nf 680 18375 18364\nf 18375 5931 18376\nf 18364 18376 4846\nf 4279 15603 11579\nf 15603 3253 18377\nf 11579 18377 5066\nf 5375 18378 15606\nf 18378 1990 15612\nf 15606 15612 5068\nf 5067 15600 18380\nf 15600 5072 18379\nf 18380 18379 4280\nf 5931 18381 18382\nf 18381 4848 7329\nf 18382 7329 4278\nf 5599 18383 18385\nf 18383 5070 18384\nf 18385 18384 5071\nf 1989 18386 18388\nf 18386 1991 18387\nf 18388 18387 5600\nf 3254 18389 18391\nf 18389 5601 18390\nf 18391 18390 5602\nf 155 18392 18394\nf 18392 5071 18393\nf 18394 18393 5603\nf 5070 18395 18397\nf 18395 5852 18396\nf 18397 18396 5603\nf 5601 7330 18399\nf 7330 4848 18398\nf 18399 18398 4849\nf 5604 18400 18402\nf 18400 4282 18401\nf 18402 18401 4281\nf 5604 18403 18405\nf 18403 5069 18404\nf 18405 18404 5605\nf 5606 18406 18408\nf 18406 3258 18407\nf 18408 18407 4850\nf 5606 18409 18411\nf 18409 684 18410\nf 18411 18410 4853\nf 5607 18412 18414\nf 18412 5077 18413\nf 18414 18413 5613\nf 5605 11591 18416\nf 11591 3262 18415\nf 18416 18415 4283\nf 5605 18417 11592\nf 18417 1993 18418\nf 11592 18418 5076\nf 125 6001 18420\nf 6001 24 18419\nf 18420 18419 5079\nf 4284 18421 18423\nf 18421 4285 18422\nf 18423 18422 5078\nf 5609 18424 18324\nf 18424 678 18425\nf 18324 18425 5057\nf 5379 18426 18428\nf 18426 5949 18427\nf 18428 18427 1997\nf 5610 18429 18431\nf 18429 5612 18430\nf 18431 18430 5084\nf 5611 18432 18434\nf 18432 1999 18433\nf 18434 18433 5381\nf 5378 18435 15622\nf 18435 126 6272\nf 15622 6272 1331\nf 2000 18436 18437\nf 18436 5082 11602\nf 18437 11602 4286\nf 687 18438 18439\nf 18438 5084 18430\nf 18439 18430 5612\nf 1995 18440 18442\nf 18440 3288 18441\nf 18442 18441 5117\nf 3261 18443 18445\nf 18443 3287 18444\nf 18445 18444 5381\nf 5606 18411 18406\nf 18411 4853 18446\nf 18406 18446 3258\nf 5614 11618 18448\nf 11618 5383 18447\nf 18448 18447 5076\nf 4290 18449 18451\nf 18449 4854 18450\nf 18451 18450 3264\nf 5089 15636 18453\nf 15636 5088 18452\nf 18453 18452 4853\nf 5382 18454 18456\nf 18454 3258 18455\nf 18456 18455 5088\nf 5615 18457 18459\nf 18457 4289 18458\nf 18459 18458 5950\nf 5613 18460 18414\nf 18460 5959 18461\nf 18414 18461 5607\nf 4854 18449 18463\nf 18449 4290 18462\nf 18463 18462 5960\nf 5093 18464 18465\nf 18464 5090 15634\nf 18465 15634 5089\nf 5616 18466 18468\nf 18466 150 18467\nf 18468 18467 5959\nf 5906 18469 18471\nf 18469 4856 18470\nf 18471 18470 5617\nf 5617 18472 18474\nf 18472 4292 18473\nf 18474 18473 3267\nf 5099 18475 18477\nf 18475 5881 18476\nf 18477 18476 5094\nf 5618 18478 18480\nf 18478 5853 18479\nf 18480 18479 5619\nf 5618 18481 18483\nf 18481 5854 18482\nf 18483 18482 4291\nf 5620 18484 18486\nf 18484 146 18485\nf 18486 18485 5906\nf 5621 18487 18489\nf 18487 4294 18488\nf 18489 18488 5619\nf 2006 11631 18491\nf 11631 5098 18490\nf 18491 18490 5622\nf 4294 18492 18494\nf 18492 4295 18493\nf 18494 18493 4293\nf 5621 18495 18497\nf 18495 690 18496\nf 18497 18496 5101\nf 4295 11642 18493\nf 11642 2007 18498\nf 18493 18498 4293\nf 3268 18499 18501\nf 18499 5961 18500\nf 18501 18500 5620\nf 4858 15649 18502\nf 15649 3270 11639\nf 18502 11639 3268\nf 2008 18503 18505\nf 18503 5622 18504\nf 18505 18504 2010\nf 4295 18492 18507\nf 18492 4294 18506\nf 18507 18506 4296\nf 2009 18508 18510\nf 18508 5385 18509\nf 18510 18509 5387\nf 5102 18511 18512\nf 18511 5101 11637\nf 18512 11637 5623\nf 2009 18513 15646\nf 18513 4860 18514\nf 15646 18514 4298\nf 4860 18513 18516\nf 18513 2009 18515\nf 18516 18515 2011\nf 3271 18517 18519\nf 18517 5103 18518\nf 18519 18518 5104\nf 3273 18520 18522\nf 18520 5386 18521\nf 18522 18521 2013\nf 5624 18523 18525\nf 18523 4300 18524\nf 18525 18524 5623\nf 4861 18526 18528\nf 18526 5107 18527\nf 18528 18527 5106\nf 5625 18529 18530\nf 18529 5105 7342\nf 18530 7342 3274\nf 5626 18531 18532\nf 18531 2014 15657\nf 18532 15657 2013\nf 5106 18533 18535\nf 18533 5390 18534\nf 18535 18534 1253\nf 3277 18536 18538\nf 18536 5625 18537\nf 18538 18537 5110\nf 3279 18539 18541\nf 18539 5626 18540\nf 18541 18540 5389\nf 5390 18533 18543\nf 18533 5106 18542\nf 18543 18542 3278\nf 5627 11659 18544\nf 11659 2015 11654\nf 18544 11654 4303\nf 4304 18545 18547\nf 18545 5629 18546\nf 18547 18546 5628\nf 5391 18548 15665\nf 18548 3281 11665\nf 15665 11665 3283\nf 695 18549 18550\nf 18549 5628 18546\nf 18550 18546 5629\nf 5109 18551 18552\nf 18551 5108 11649\nf 18552 11649 5629\nf 4306 18553 18555\nf 18553 5932 18554\nf 18555 18554 5390\nf 3280 18556 18558\nf 18556 4863 18557\nf 18558 18557 4306\nf 696 18559 18561\nf 18559 5643 18560\nf 18561 18560 5628\nf 3281 11660 11666\nf 11660 5627 18562\nf 11666 18562 3282\nf 4307 18563 18565\nf 18563 4319 18564\nf 18565 18564 5111\nf 5630 18566 18568\nf 18566 3286 18567\nf 18568 18567 5115\nf 5392 18569 18571\nf 18569 5112 18570\nf 18571 18570 2018\nf 5631 18572 18574\nf 18572 3285 18573\nf 18574 18573 5114\nf 1995 18575 18576\nf 18575 4852 7334\nf 18576 7334 4309\nf 1331 8841 15620\nf 8841 132 18577\nf 15620 18577 5632\nf 3291 18578 18580\nf 18578 5116 18579\nf 18580 18579 5393\nf 130 18581 6144\nf 18581 5632 18577\nf 6144 18577 132\nf 5632 18581 18583\nf 18581 130 18582\nf 18583 18582 5635\nf 3288 18584 18585\nf 18584 4309 11671\nf 18585 11671 4311\nf 5634 18586 18587\nf 18586 5632 18583\nf 18587 18583 5635\nf 5395 18588 18590\nf 18588 5123 18589\nf 18590 18589 2019\nf 4313 15691 15687\nf 15691 3294 11676\nf 15687 11676 3293\nf 5125 18591 18593\nf 18591 5396 18592\nf 18593 18592 5124\nf 2021 18594 15703\nf 18594 5397 18595\nf 15703 18595 2022\nf 2027 15701 15694\nf 15701 3295 18596\nf 15694 18596 5124\nf 5637 18597 18599\nf 18597 4315 18598\nf 18599 18598 3296\nf 5638 18600 18602\nf 18600 1258 18601\nf 18602 18601 5655\nf 5639 18603 18604\nf 18603 2026 15704\nf 18604 15704 2022\nf 5639 18605 18607\nf 18605 4316 18606\nf 18607 18606 3313\nf 5641 18608 18610\nf 18608 4867 18609\nf 18610 18609 5127\nf 5642 18611 18612\nf 18611 4867 18608\nf 18612 18608 5641\nf 2027 15696 18613\nf 15696 2021 15702\nf 18613 15702 2026\nf 5640 18614 18615\nf 18614 5639 18604\nf 18615 18604 2022\nf 5636 18616 18617\nf 18616 5642 18612\nf 18617 18612 5641\nf 697 18618 18620\nf 18618 5400 18619\nf 18620 18619 5643\nf 2028 18621 18623\nf 18621 5392 18622\nf 18623 18622 5399\nf 4320 11690 18625\nf 11690 4308 18624\nf 18625 18624 4319\nf 2029 18626 18627\nf 18626 5130 11693\nf 18627 11693 3301\nf 3303 18628 18630\nf 18628 5403 18629\nf 18630 18629 5399\nf 3303 18631 18633\nf 18631 2018 18632\nf 18633 18632 4871\nf 5401 18634 18636\nf 18634 5132 18635\nf 18636 18635 5131\nf 5645 18637 18639\nf 18637 4322 18638\nf 18639 18638 5131\nf 5644 18640 18642\nf 18640 5646 18641\nf 18642 18641 5855\nf 5403 18628 18644\nf 18628 3303 18643\nf 18644 18643 5404\nf 5405 18645 18647\nf 18645 5136 18646\nf 18647 18646 5404\nf 139 18648 18650\nf 18648 4872 18649\nf 18650 18649 5135\nf 5647 18651 18653\nf 18651 3304 18652\nf 18653 18652 5648\nf 5134 18654 18656\nf 18654 4324 18655\nf 18656 18655 4323\nf 4873 18657 18659\nf 18657 2034 18658\nf 18659 18658 5909\nf 5650 18660 18662\nf 18660 4325 18661\nf 18662 18661 5651\nf 5650 18663 18665\nf 18663 140 18664\nf 18665 18664 5135\nf 5408 18666 18668\nf 18666 2036 18667\nf 18668 18667 5858\nf 5651 18669 18671\nf 18669 3307 18670\nf 18671 18670 5859\nf 5652 11699 18673\nf 11699 704 18672\nf 18673 18672 5145\nf 136 8622 18675\nf 8622 1256 18674\nf 18675 18674 5144\nf 2037 18676 18678\nf 18676 2036 18677\nf 18678 18677 5147\nf 705 13584 18680\nf 13584 2039 18679\nf 18680 18679 5145\nf 4330 18681 18683\nf 18681 5146 18682\nf 18683 18682 2037\nf 4331 18684 18686\nf 18684 4329 18685\nf 18686 18685 5143\nf 5146 15730 18688\nf 15730 5148 18687\nf 18688 18687 4331\nf 3311 18689 7357\nf 18689 2038 11705\nf 7357 11705 4875\nf 2039 18690 18692\nf 18690 4333 18691\nf 18692 18691 5409\nf 5654 18693 18694\nf 18693 22 9011\nf 18694 9011 137\nf 3311 11711 18696\nf 11711 5637 18695\nf 18696 18695 5411\nf 700 18697 18698\nf 18697 4333 18690\nf 18698 18690 2039\nf 5637 11710 18597\nf 11710 4876 18699\nf 18597 18699 4315\nf 3312 18700 18701\nf 18700 4333 11681\nf 18701 11681 5126\n\nusemtl material_3\nf 4340 11712 18703\nf 11712 5861 18702\nf 18703 18702 5416\nf 1979 18704 18706\nf 18704 3316 18705\nf 18706 18705 5590\nf 5150 18707 18709\nf 18707 5910 18708\nf 18709 18708 4335\nf 5658 18710 18712\nf 18710 5883 18711\nf 18712 18711 337\nf 336 18713 18715\nf 18713 5659 18714\nf 18715 18714 5658\nf 5414 18716 18718\nf 18716 5412 18717\nf 18718 18717 5660\nf 5657 18719 18720\nf 18719 5910 18707\nf 18720 18707 5150\nf 2046 15759 11716\nf 15759 4339 18721\nf 11716 18721 5416\nf 3315 15750 18723\nf 15750 2047 18722\nf 18723 18722 5418\nf 2042 18724 18725\nf 18724 4337 11718\nf 18725 11718 4341\nf 4338 18726 11720\nf 18726 5151 18727\nf 11720 18727 4341\nf 336 18728 18713\nf 18728 5662 18729\nf 18713 18729 5659\nf 5661 18730 18731\nf 18730 707 15755\nf 18731 15755 5985\nf 4341 18732 18734\nf 18732 5663 18733\nf 18734 18733 5660\nf 4343 18735 18736\nf 18735 4341 18727\nf 18736 18727 5151\nf 5419 18737 18739\nf 18737 4342 18738\nf 18739 18738 5662\nf 3320 11721 18741\nf 11721 5154 18740\nf 18741 18740 3323\nf 3333 18742 18743\nf 18742 2047 15749\nf 18743 15749 3318\nf 4340 18744 18746\nf 18744 4351 18745\nf 18746 18745 4879\nf 4343 18747 18749\nf 18747 5152 18748\nf 18749 18748 3325\nf 709 18750 18752\nf 18750 4880 18751\nf 18752 18751 3323\nf 2048 18753 18755\nf 18753 5153 18754\nf 18755 18754 5422\nf 5420 18756 15764\nf 18756 5419 18757\nf 15764 18757 440\nf 3328 15771 7367\nf 15771 5680 11727\nf 7367 11727 3326\nf 3327 18758 18760\nf 18758 5665 18759\nf 18760 18759 2051\nf 5156 18761 18763\nf 18761 5665 18762\nf 18763 18762 3325\nf 5156 18764 18766\nf 18764 4345 18765\nf 18766 18765 4886\nf 4886 18767 18766\nf 18767 3339 18768\nf 18766 18768 5156\nf 5677 18769 18771\nf 18769 4886 18770\nf 18771 18770 5155\nf 2055 18772 18773\nf 18772 3335 11738\nf 18773 11738 2052\nf 2052 18774 18773\nf 18774 5424 18775\nf 18773 18775 2055\nf 4346 18776 11737\nf 18776 4881 18777\nf 11737 18777 2052\nf 4349 18778 18779\nf 18778 5424 18774\nf 18779 18774 2052\nf 2053 18780 18782\nf 18780 5671 18781\nf 18782 18781 5426\nf 4350 18783 18785\nf 18783 4349 18784\nf 18785 18784 5672\nf 3333 18786 18742\nf 18786 5157 18787\nf 18742 18787 2047\nf 4350 18785 18789\nf 18785 5672 18788\nf 18789 18788 4351\nf 5428 18790 18791\nf 18790 5158 11734\nf 18791 11734 2056\nf 3340 18792 18794\nf 18792 4346 18793\nf 18794 18793 5431\nf 3336 18795 18797\nf 18795 4357 18796\nf 18797 18796 4352\nf 5674 18798 18800\nf 18798 5682 18799\nf 18800 18799 4800\nf 5674 18801 18803\nf 18801 108 18802\nf 18803 18802 5669\nf 4354 18804 18806\nf 18804 4353 18805\nf 18806 18805 5161\nf 5160 11741 18808\nf 11741 5675 18807\nf 18808 18807 3338\nf 5678 18809 18810\nf 18809 2057 11745\nf 18810 11745 2051\nf 5679 18811 18812\nf 18811 4356 15767\nf 18812 15767 2050\nf 710 18813 18815\nf 18813 5666 18814\nf 18815 18814 5163\nf 5680 18816 11728\nf 18816 5163 18814\nf 11728 18814 5666\nf 4887 18817 18819\nf 18817 5429 18818\nf 18819 18818 4888\nf 5165 18820 18822\nf 18820 4357 18821\nf 18822 18821 3342\nf 2058 15792 18824\nf 15792 4889 18823\nf 18824 18823 5432\nf 5682 18825 18827\nf 18825 4359 18826\nf 18827 18826 5683\nf 3341 18828 15786\nf 18828 3343 18829\nf 15786 18829 4358\nf 3344 18830 15795\nf 18830 5685 18831\nf 15795 18831 5433\nf 2059 18832 18834\nf 18832 2060 18833\nf 18834 18833 3347\nf 5169 18835 15802\nf 18835 5170 18836\nf 15802 18836 5171\nf 719 18837 18839\nf 18837 5862 18838\nf 18839 18838 5685\nf 5168 18840 18842\nf 18840 3349 18841\nf 18842 18841 5172\nf 5172 18843 18845\nf 18843 4903 18844\nf 18845 18844 5686\nf 5687 18846 18848\nf 18846 5862 18847\nf 18848 18847 5863\nf 5457 18849 18850\nf 18849 2061 11824\nf 18850 11824 2083\nf 5678 18851 18853\nf 18851 4361 18852\nf 18853 18852 5176\nf 5174 18854 11766\nf 18854 4362 18855\nf 11766 18855 5178\nf 5689 18856 18858\nf 18856 2062 18857\nf 18858 18857 5177\nf 5688 11760 18860\nf 11760 5173 18859\nf 18860 18859 4890\nf 5178 18861 11764\nf 18861 5693 18862\nf 11764 18862 5691\nf 5177 18863 18865\nf 18863 5180 18864\nf 18865 18864 5690\nf 5690 18866 18865\nf 18866 5689 18858\nf 18865 18858 5177\nf 5692 18867 18869\nf 18867 3354 18868\nf 18869 18868 3352\nf 3352 18870 18869\nf 18870 4890 7376\nf 18869 7376 5692\nf 5180 18863 18872\nf 18863 5177 18871\nf 18872 18871 5181\nf 724 12072 18874\nf 12072 5919 18873\nf 18874 18873 5933\nf 5183 18875 18877\nf 18875 5181 18876\nf 18877 18876 2064\nf 3358 18878 18880\nf 18878 5187 18879\nf 18880 18879 5437\nf 5186 18881 18883\nf 18881 4893 18882\nf 18883 18882 5185\nf 3356 18884 18885\nf 18884 5183 18877\nf 18885 18877 2064\nf 5190 18886 18887\nf 18886 4365 11777\nf 18887 11777 5188\nf 5694 11774 18889\nf 11774 3355 18888\nf 18889 18888 5696\nf 3364 18890 18891\nf 18890 4367 11784\nf 18891 11784 4366\nf 2067 18892 18894\nf 18892 2068 18893\nf 18894 18893 5697\nf 2065 18895 18897\nf 18895 5184 18896\nf 18897 18896 5697\nf 2067 15820 18898\nf 15820 3361 15823\nf 18898 15823 5440\nf 3359 18899 18901\nf 18899 3362 18900\nf 18901 18900 5439\nf 5699 18902 18904\nf 18902 4369 18903\nf 18904 18903 5698\nf 5699 18905 18906\nf 18905 460 6812\nf 18906 6812 448\nf 3364 18907 18890\nf 18907 2070 18908\nf 18890 18908 4367\nf 3365 18909 18910\nf 18909 4367 18908\nf 18910 18908 2070\nf 5445 18911 18913\nf 18911 4368 18912\nf 18913 18912 5444\nf 2071 18914 18916\nf 18914 5938 18915\nf 18916 18915 5443\nf 5699 18906 7381\nf 18906 448 18917\nf 7381 18917 5702\nf 5701 15828 18919\nf 15828 5443 18918\nf 18919 18918 5193\nf 4895 7382 15830\nf 7382 5702 18920\nf 15830 18920 4896\nf 5700 11789 18922\nf 11789 3366 18921\nf 18922 18921 5703\nf 5200 18923 18924\nf 18923 5199 11800\nf 18924 11800 5703\nf 3369 18925 18927\nf 18925 5911 18926\nf 18927 18926 5193\nf 2074 18928 18930\nf 18928 5446 18929\nf 18930 18929 2073\nf 3374 18931 18933\nf 18931 2074 18932\nf 18933 18932 2076\nf 5201 18934 18936\nf 18934 5202 18935\nf 18936 18935 5705\nf 4897 7388 18937\nf 7388 5705 18935\nf 18937 18935 5202\nf 5706 18938 18940\nf 18938 731 18939\nf 18940 18939 5199\nf 5201 18941 18934\nf 18941 3373 18942\nf 18934 18942 5202\nf 733 18943 18945\nf 18943 5706 18944\nf 18945 18944 5708\nf 5707 18946 18947\nf 18946 5708 18944\nf 18947 18944 5706\nf 4373 11802 18949\nf 11802 2075 18948\nf 18949 18948 5447\nf 3373 18950 18951\nf 18950 3377 15838\nf 18951 15838 3372\nf 454 18952 18954\nf 18952 5449 18953\nf 18954 18953 5201\nf 734 18955 12043\nf 18955 3378 18956\nf 12043 18956 741\nf 2078 18957 18959\nf 18957 4385 18958\nf 18959 18958 5204\nf 3378 18955 18961\nf 18955 734 18960\nf 18961 18960 5708\nf 5211 18962 18964\nf 18962 2078 18963\nf 18964 18963 5447\nf 5719 18965 18967\nf 18965 3377 18966\nf 18967 18966 4374\nf 3381 18968 7392\nf 18968 2079 11806\nf 7392 11806 3407\nf 5711 18969 18971\nf 18969 4377 18970\nf 18971 18970 5205\nf 92 18972 15856\nf 18972 5221 18973\nf 15856 18973 5452\nf 5712 11808 7389\nf 11808 5452 18973\nf 7389 18973 5221\nf 4376 18974 18976\nf 18974 3380 18975\nf 18976 18975 2080\nf 3382 15853 18978\nf 15853 5206 18977\nf 18978 18977 5713\nf 93 15857 18980\nf 15857 5452 18979\nf 18980 18979 3383\nf 2081 18981 15863\nf 18981 4378 18982\nf 15863 18982 4379\nf 3382 18978 18984\nf 18978 5713 18983\nf 18984 18983 5715\nf 4901 18985 18987\nf 18985 4380 18986\nf 18987 18986 5714\nf 3386 15866 18989\nf 15866 5210 18988\nf 18989 18988 3387\nf 2082 18990 18992\nf 18990 3384 18991\nf 18992 18991 5453\nf 3386 18993 15864\nf 18993 3384 18994\nf 15864 18994 3389\nf 5209 18995 18996\nf 18995 4380 18985\nf 18996 18985 4901\nf 3389 18994 18998\nf 18994 3384 18997\nf 18998 18997 5454\nf 3390 15870 19000\nf 15870 3385 18999\nf 19000 18999 4382\nf 5455 19001 19003\nf 19001 5454 19002\nf 19003 19002 4384\nf 5717 15868 19005\nf 15868 3390 19004\nf 19005 19004 4385\nf 5718 7403 19006\nf 7403 741 18956\nf 19006 18956 3378\nf 5455 19003 19008\nf 19003 4384 19007\nf 19008 19007 5448\nf 4382 19009 19011\nf 19009 5718 19010\nf 19011 19010 4899\nf 85 19012 15842\nf 19012 4902 19013\nf 15842 19013 5962\nf 4384 19014 19016\nf 19014 5717 19015\nf 19016 19015 5211\nf 4899 19010 15843\nf 19010 5718 19006\nf 15843 19006 3378\nf 5460 19017 15887\nf 19017 5864 19018\nf 15887 19018 5720\nf 5721 19019 19021\nf 19019 4387 19020\nf 19021 19020 5212\nf 5458 11755 19022\nf 11755 5686 18844\nf 19022 18844 4903\nf 5456 19023 15874\nf 19023 5459 19024\nf 15874 19024 3391\nf 3393 19025 15885\nf 19025 5864 19017\nf 15885 19017 5460\nf 2084 19026 19028\nf 19026 4904 19027\nf 19028 19027 5723\nf 5722 19029 19030\nf 19029 4387 19019\nf 19030 19019 5721\nf 5724 19031 19033\nf 19031 100 19032\nf 19033 19032 5458\nf 5723 19034 19036\nf 19034 5462 19035\nf 19036 19035 2085\nf 4389 19037 19039\nf 19037 5214 19038\nf 19039 19038 4388\nf 5724 19040 19042\nf 19040 3398 19041\nf 19042 19041 4906\nf 5723 19036 19028\nf 19036 2085 19043\nf 19028 19043 2084\nf 4391 19044 19046\nf 19044 5461 19045\nf 19046 19045 2086\nf 3396 19047 11825\nf 19047 4390 19048\nf 11825 19048 5213\nf 3400 15890 19050\nf 15890 4390 19049\nf 19050 19049 3401\nf 5723 19051 19034\nf 19051 3397 19052\nf 19034 19052 5462\nf 4906 19041 19054\nf 19041 3398 19053\nf 19054 19053 5215\nf 5462 15893 19056\nf 15893 5464 19055\nf 19056 19055 5463\nf 4391 19057 19059\nf 19057 4392 19058\nf 19059 19058 5214\nf 747 19060 13751\nf 19060 3401 19061\nf 13751 19061 746\nf 5463 19062 19064\nf 19062 5725 19063\nf 19064 19063 2086\nf 4391 19065 19067\nf 19065 5725 19066\nf 19067 19066 4393\nf 4395 11832 19069\nf 11832 4392 19068\nf 19069 19068 4393\nf 2087 19070 19072\nf 19070 5218 19071\nf 19072 19071 5464\nf 3405 15898 19074\nf 15898 3400 19073\nf 19074 19073 3403\nf 747 7407 19060\nf 7407 5726 19075\nf 19060 19075 3401\nf 4394 19076 19078\nf 19076 5728 19077\nf 19078 19077 5865\nf 2090 19079 19081\nf 19079 5451 19080\nf 19081 19080 5465\nf 5727 19082 19084\nf 19082 2089 19083\nf 19084 19083 5465\nf 2090 19085 19086\nf 19085 5729 11804\nf 19086 11804 2079\nf 5729 19085 15904\nf 19085 2090 19087\nf 15904 19087 5218\nf 5710 19088 19090\nf 19088 3408 19089\nf 19090 19089 4907\nf 5865 19091 19092\nf 19091 95 6273\nf 19092 6273 97\nf 5712 7391 19094\nf 7391 3379 19093\nf 19094 19093 4900\nf 5451 15850 19096\nf 15850 5206 19095\nf 19096 19095 5450\n\nusemtl material_1\nf 5232 19097 19099\nf 19097 4397 19098\nf 19099 19098 4396\nf 4334 19100 19102\nf 19100 4397 19101\nf 19102 19101 5886\nf 2092 11858 19104\nf 11858 2101 19103\nf 19104 19103 5466\nf 386 19105 10166\nf 19105 4398 19106\nf 10166 19106 383\nf 5731 19107 19109\nf 19107 4399 19108\nf 19109 19108 5525\nf 4966 19110 19112\nf 19110 4205 19111\nf 19112 19111 5225\nf 5225 19113 15911\nf 19113 4400 19114\nf 15911 19114 5226\nf 3413 19115 19117\nf 19115 4400 19116\nf 19117 19116 5733\nf 5228 19118 7420\nf 19118 641 19119\nf 7420 19119 4808\nf 5732 19120 19122\nf 19120 3410 19121\nf 19122 19121 4912\nf 3414 19123 19125\nf 19123 5732 19124\nf 19125 19124 2097\nf 388 19126 19128\nf 19126 5734 19127\nf 19128 19127 5733\nf 3422 15920 19130\nf 15920 4401 19129\nf 19130 19129 4402\nf 2094 19131 19133\nf 19131 5468 19132\nf 19133 19132 5469\nf 749 19134 19136\nf 19134 5228 19135\nf 19136 19135 5738\nf 5227 11852 19138\nf 11852 3415 19137\nf 19138 19137 4403\nf 5469 19139 19133\nf 19139 2096 19140\nf 19133 19140 2094\nf 5735 19141 19143\nf 19141 2099 19142\nf 19143 19142 5469\nf 3422 19130 19144\nf 19130 4402 11850\nf 19144 11850 3421\nf 5736 19145 19147\nf 19145 395 19146\nf 19147 19146 5251\nf 3418 19148 19150\nf 19148 5737 19149\nf 19150 19149 2112\nf 3417 19151 15923\nf 19151 5252 19152\nf 15923 19152 4405\nf 751 19153 7661\nf 19153 3420 19154\nf 7661 19154 750\nf 4404 19155 19157\nf 19155 5866 19156\nf 19157 19156 5736\nf 5737 19158 19159\nf 19158 2099 19141\nf 19159 19141 5735\nf 751 19160 19153\nf 19160 5738 19161\nf 19153 19161 3420\nf 3414 15924 11854\nf 15924 4405 19162\nf 11854 19162 3415\nf 4407 19163 19165\nf 19163 5235 19164\nf 19165 19164 5740\nf 5741 19166 19168\nf 19166 5913 19167\nf 19168 19167 5238\nf 4915 19169 19171\nf 19169 5236 19170\nf 19171 19170 5472\nf 5238 19172 19174\nf 19172 3424 19173\nf 19174 19173 5488\nf 5870 19175 19177\nf 19175 3423 19176\nf 19177 19176 5868\nf 5870 19178 19180\nf 19178 5871 19179\nf 19180 19179 5742\nf 2103 19181 19183\nf 19181 3426 19182\nf 19183 19182 3425\nf 5488 19184 15979\nf 19184 5743 19185\nf 15979 19185 2104\nf 5743 19184 19186\nf 19184 5488 19173\nf 19186 19173 3424\nf 5489 19187 15978\nf 19187 5239 19188\nf 15978 19188 5488\nf 5253 19189 19191\nf 19189 2105 19190\nf 19191 19190 5963\nf 5745 19192 19193\nf 19192 5748 7432\nf 19193 7432 5746\nf 5747 19194 19196\nf 19194 4412 19195\nf 19196 19195 2108\nf 5980 19197 19198\nf 19197 2108 19195\nf 19198 19195 4412\nf 5241 19199 7430\nf 19199 5964 19200\nf 7430 19200 5963\nf 2107 19201 19203\nf 19201 2106 19202\nf 19203 19202 5872\nf 2107 19204 15932\nf 19204 2109 19205\nf 15932 19205 5749\nf 5243 15936 19207\nf 15936 4415 19206\nf 19207 19206 5247\nf 5750 19208 19210\nf 19208 5241 19209\nf 19210 19209 5873\nf 5753 19211 19213\nf 19211 4417 19212\nf 19213 19212 5251\nf 5753 19214 11874\nf 19214 398 19215\nf 11874 19215 5248\nf 5754 19216 19218\nf 19216 5246 19217\nf 19218 19217 4416\nf 5754 19219 19221\nf 19219 2109 19220\nf 19221 19220 2110\nf 5755 19222 19224\nf 19222 4917 19223\nf 19224 19223 5752\nf 5246 19225 19217\nf 19225 4418 19226\nf 19217 19226 4416\nf 2112 11871 19228\nf 11871 2111 19227\nf 19228 19227 5475\nf 5756 19229 19231\nf 19229 3416 19230\nf 19231 19230 4916\nf 5473 19232 19234\nf 19232 3428 19233\nf 19234 19233 5476\nf 4920 19235 19237\nf 19235 5746 19236\nf 19237 19236 4919\nf 4918 19238 19240\nf 19238 2113 19239\nf 19240 19239 5757\nf 5257 19241 19243\nf 19241 5874 19242\nf 19243 19242 5757\nf 5758 19244 19246\nf 19244 3437 19245\nf 19246 19245 4920\nf 5256 19247 19249\nf 19247 3438 19248\nf 19249 19248 5259\nf 5758 19250 19252\nf 19250 5914 19251\nf 19252 19251 5875\nf 5760 19253 19255\nf 19253 5257 19254\nf 19255 19254 5258\nf 5266 19256 19258\nf 19256 4422 19257\nf 19258 19257 5262\nf 5760 19255 19260\nf 19255 5258 19259\nf 19260 19259 3439\nf 5760 19261 19253\nf 19261 5874 19241\nf 19253 19241 5257\nf 5260 19262 19264\nf 19262 5266 19263\nf 19264 19263 5761\nf 3440 19265 19267\nf 19265 5766 19266\nf 19267 19266 3442\nf 5265 19268 19270\nf 19268 4424 19269\nf 19270 19269 5268\nf 5265 19271 11881\nf 19271 5267 19272\nf 11881 19272 5763\nf 5267 19273 19275\nf 19273 5268 19274\nf 19275 19274 5764\nf 5765 19276 19278\nf 19276 4425 19277\nf 19278 19277 5263\nf 5765 19279 19280\nf 19279 2117 11887\nf 19280 11887 2118\nf 5769 19281 19283\nf 19281 4426 19282\nf 19283 19282 4425\nf 5767 19284 19286\nf 19284 5762 19285\nf 19286 19285 1625\nf 5767 19287 19289\nf 19287 408 19288\nf 19289 19288 5770\nf 5768 19290 11885\nf 19290 766 19291\nf 11885 19291 5945\nf 5768 19292 19294\nf 19292 5273 19293\nf 19294 19293 5771\nf 2119 19295 19297\nf 19295 5270 19296\nf 19297 19296 5482\nf 5770 19288 19298\nf 19288 408 6751\nf 19298 6751 1627\nf 5771 19299 19301\nf 19299 4427 19300\nf 19301 19300 5772\nf 2121 19302 19304\nf 19302 4429 19303\nf 19304 19303 5484\nf 5774 19305 19307\nf 19305 3446 19306\nf 19307 19306 5483\nf 5772 19308 19310\nf 19308 4428 19309\nf 19310 19309 5773\nf 2122 19311 19313\nf 19311 5487 19312\nf 19313 19312 5485\nf 4428 19314 19316\nf 19314 5274 19315\nf 19316 19315 3447\nf 3448 19317 19318\nf 19317 2122 11892\nf 19318 11892 4926\nf 4926 19319 19320\nf 19319 3446 15966\nf 19320 15966 5775\nf 4927 19321 19323\nf 19321 4430 19322\nf 19323 19322 5774\nf 5773 19324 19326\nf 19324 4432 19325\nf 19326 19325 5276\nf 4431 19327 19329\nf 19327 5797 19328\nf 19329 19328 5275\nf 2124 19330 19332\nf 19330 5777 19331\nf 19332 19331 5776\nf 3448 19333 19335\nf 19333 5775 19334\nf 19335 19334 5277\nf 5795 19336 19338\nf 19336 3472 19337\nf 19338 19337 4927\nf 5778 19339 19340\nf 19339 755 7610\nf 19340 7610 770\nf 770 19341 19340\nf 19341 5281 19342\nf 19340 19342 5778\nf 4929 19343 19345\nf 19343 3451 19344\nf 19345 19344 4930\nf 5279 19346 19348\nf 19346 2125 19347\nf 19348 19347 2104\nf 4930 19349 19351\nf 19349 3452 19350\nf 19351 19350 5779\nf 4434 19352 19354\nf 19352 5240 19353\nf 19354 19353 5887\nf 425 19355 19357\nf 19355 5779 19356\nf 19357 19356 5780\nf 4437 19358 15984\nf 19358 5283 19359\nf 15984 19359 5490\nf 4436 19360 19362\nf 19360 4435 19361\nf 19362 19361 4438\nf 5283 15993 19364\nf 15993 5285 19363\nf 19364 19363 5781\nf 3455 19365 19367\nf 19365 4931 19366\nf 19367 19366 4434\nf 5782 19368 19369\nf 19368 3457 15990\nf 19369 15990 3454\nf 4438 19370 19362\nf 19370 4440 19371\nf 19362 19371 4436\nf 4438 19372 19373\nf 19372 5781 19363\nf 19373 19363 5285\nf 5492 19374 19376\nf 19374 339 19375\nf 19376 19375 5780\nf 5785 19377 19379\nf 19377 3461 19378\nf 19379 19378 5287\nf 2132 16009 19381\nf 16009 5788 19380\nf 19381 19380 5784\nf 772 7773 19383\nf 7773 2134 19382\nf 19383 19382 5786\nf 5787 19384 19386\nf 19384 5288 19385\nf 19386 19385 5289\nf 2133 11908 19388\nf 11908 3465 19387\nf 19388 19387 5789\nf 3462 19389 19391\nf 19389 5287 19390\nf 19391 19390 3463\nf 4935 19392 19394\nf 19392 3474 19393\nf 19394 19393 4446\nf 5289 19385 19396\nf 19385 5288 19395\nf 19396 19395 5791\nf 5799 19397 19399\nf 19397 1632 19398\nf 19399 19398 5289\nf 5304 19400 19402\nf 19400 4941 19401\nf 19402 19401 3468\nf 5793 19403 19405\nf 19403 412 19404\nf 19405 19404 5303\nf 4443 19406 19408\nf 19406 5292 19407\nf 19408 19407 2136\nf 3469 19409 19411\nf 19409 5293 19410\nf 19411 19410 5494\nf 3469 19412 7446\nf 19412 2145 19413\nf 7446 19413 5304\nf 3467 19414 19416\nf 19414 5294 19415\nf 19416 19415 3468\nf 4937 19417 19419\nf 19417 5496 19418\nf 19419 19418 5795\nf 5293 19409 19421\nf 19409 3469 19420\nf 19421 19420 5796\nf 4445 19422 19424\nf 19422 5797 19423\nf 19424 19423 5295\nf 2139 19425 19427\nf 19425 5796 19426\nf 19427 19426 2124\nf 5276 19428 11898\nf 19428 5798 19429\nf 11898 19429 776\nf 5499 19430 19432\nf 19430 5790 19431\nf 19432 19431 773\nf 3464 19433 19434\nf 19433 4446 11917\nf 19434 11917 2141\nf 5297 11920 19436\nf 11920 4447 19435\nf 19436 19435 5497\nf 5799 19437 19397\nf 19437 340 6765\nf 19397 6765 1632\nf 5792 19438 11910\nf 19438 3473 19439\nf 11910 19439 3465\nf 2143 19440 19442\nf 19440 2140 19441\nf 19442 19441 5498\nf 5501 19443 19444\nf 19443 2141 7449\nf 19444 7449 4938\nf 5499 16028 19446\nf 16028 4939 19445\nf 19446 19445 5500\nf 5830 19447 19448\nf 19447 4447 11919\nf 19448 11919 5299\nf 5299 19449 19448\nf 19449 5301 11924\nf 19448 11924 5830\nf 5800 19450 19452\nf 19450 2144 19451\nf 19452 19451 5509\nf 2146 19453 19455\nf 19453 2136 19454\nf 19455 19454 4450\nf 5292 19456 19407\nf 19456 4450 19454\nf 19407 19454 2136\nf 2146 19455 19458\nf 19455 4450 19457\nf 19458 19457 5803\nf 5306 19459 19461\nf 19459 4452 19460\nf 19461 19460 4451\nf 4449 19462 19464\nf 19462 5303 19463\nf 19464 19463 5801\nf 3477 19465 19466\nf 19465 5802 16044\nf 19466 16044 4941\nf 5803 19467 19469\nf 19467 5831 19468\nf 19469 19468 4452\nf 2149 19470 19472\nf 19470 5505 19471\nf 19472 19471 5803\nf 2147 16045 19474\nf 16045 2146 19473\nf 19474 19473 5505\nf 5307 19475 16055\nf 19475 5306 19476\nf 16055 19476 5506\nf 2151 19477 19479\nf 19477 5308 19478\nf 19479 19478 5504\nf 4455 19480 19482\nf 19480 4453 19481\nf 19482 19481 4943\nf 3479 19483 16052\nf 19483 2144 19484\nf 16052 19484 4454\nf 5307 19485 19487\nf 19485 4944 19486\nf 19487 19486 4452\nf 5301 19449 19489\nf 19449 5299 19488\nf 19489 19488 5507\nf 5804 19490 19492\nf 19490 4453 19491\nf 19492 19491 5310\nf 5310 19493 19494\nf 19493 3476 16035\nf 19494 16035 4940\nf 4940 19495 19496\nf 19495 4939 7454\nf 19496 7454 5805\n\nusemtl material_4\nf 3487 16063 11949\nf 16063 2155 7483\nf 11949 7483 749\nf 3609 7498 19498\nf 7498 664 19497\nf 19498 19497 4456\nf 1963 11953 19499\nf 11953 4456 19497\nf 19499 19497 664\nf 794 19500 12932\nf 19500 3483 11958\nf 12932 11958 2157\nf 3483 19500 11957\nf 19500 794 7928\nf 11957 7928 3482\nf 2362 12973 12975\nf 12973 4457 16195\nf 12975 16195 796\nf 2159 16194 7494\nf 16194 4457 11970\nf 7494 11970 2158\nf 4458 11992 11981\nf 11992 2164 11985\nf 11981 11985 2163\nf 2164 11991 11994\nf 11991 4523 19501\nf 11994 19501 801\nf 4459 7519 19503\nf 7519 5311 19502\nf 19503 19502 2166\nf 803 16058 19505\nf 16058 2166 19504\nf 19505 19504 802\nf 672 11997 19506\nf 11997 4459 11999\nf 19506 11999 671\nf 4459 19503 12000\nf 19503 2166 12003\nf 12000 12003 2167\nf 803 12008 16059\nf 12008 4460 19507\nf 16059 19507 804\nf 3549 7813 19508\nf 7813 1040 12790\nf 19508 12790 817\nf 825 13242 19509\nf 13242 823 13471\nf 19509 13471 2453\nf 4461 12046 19510\nf 12046 2178 7538\nf 19510 7538 832\nf 2185 12067 16070\nf 12067 836 12069\nf 16070 12069 3492\nf 2194 12094 12096\nf 12094 4462 19511\nf 12096 19511 843\nf 843 19511 12104\nf 19511 4462 12148\nf 12104 12148 2196\nf 4463 12153 19512\nf 12153 2210 7687\nf 19512 7687 2212\nf 4463 19512 12158\nf 19512 2212 7690\nf 12158 7690 2195\nf 2216 12174 7701\nf 12174 4464 7704\nf 7701 7704 2217\nf 4464 12172 12178\nf 12172 845 12156\nf 12178 12156 2211\nf 3489 7711 16064\nf 7711 2209 12086\nf 16064 12086 3485\nf 3490 7717 16066\nf 7717 841 12077\nf 16066 12077 2191\nf 4465 12201 19513\nf 12201 2225 12205\nf 19513 12205 2226\nf 4466 12208 12210\nf 12208 4465 19513\nf 12210 19513 2226\nf 2227 7725 16067\nf 7725 839 7579\nf 16067 7579 2187\nf 2228 12215 7729\nf 12215 4466 12211\nf 7729 12211 2227\nf 3491 12214 16071\nf 12214 2228 7732\nf 16071 7732 2229\nf 2186 7562 12220\nf 7562 2185 12217\nf 12220 12217 837\nf 864 19514 12327\nf 19514 3494 19515\nf 12327 19515 828\nf 3493 12034 12228\nf 12034 828 19515\nf 12228 19515 3494\nf 4461 19516 19517\nf 19516 2231 16072\nf 19517 16072 4467\nf 4468 12235 19518\nf 12235 4461 19517\nf 19518 19517 4467\nf 2231 19516 12224\nf 19516 4461 19510\nf 12224 19510 832\nf 865 7743 19520\nf 7743 3495 19519\nf 19520 19519 864\nf 3494 19514 12231\nf 19514 864 19519\nf 12231 19519 3495\nf 833 12236 12053\nf 12236 4468 19521\nf 12053 19521 834\nf 4469 19522 12234\nf 19522 834 19521\nf 12234 19521 4468\nf 2232 12232 16074\nf 12232 4468 19518\nf 16074 19518 4467\nf 3496 7744 7747\nf 7744 865 19523\nf 7747 19523 866\nf 2182 12058 7553\nf 12058 4470 12247\nf 7553 12247 835\nf 4470 12059 12239\nf 12059 834 19522\nf 12239 19522 4469\nf 3496 16076 16075\nf 16076 4469 12233\nf 16075 12233 2232\nf 867 19524 19525\nf 19524 3498 12242\nf 19525 12242 3497\nf 3497 7748 19525\nf 7748 866 19526\nf 19525 19526 867\nf 835 19527 12065\nf 19527 4472 12252\nf 12065 12252 836\nf 4472 19527 12245\nf 19527 835 12246\nf 12245 12246 4471\nf 3498 16078 12240\nf 16078 4471 19528\nf 12240 19528 2233\nf 4470 12238 12248\nf 12238 2233 19528\nf 12248 19528 4471\nf 868 19529 19531\nf 19529 3499 19530\nf 19531 19530 5806\nf 3498 19524 19533\nf 19524 867 19532\nf 19533 19532 5806\nf 3492 12068 12257\nf 12068 4473 19534\nf 12257 19534 4474\nf 2235 19535 19536\nf 19535 4473 12253\nf 19536 12253 4472\nf 4472 12244 19536\nf 12244 2234 16079\nf 19536 16079 2235\nf 869 19537 19539\nf 19537 3500 19538\nf 19539 19538 868\nf 3499 19529 12256\nf 19529 868 19538\nf 12256 19538 3500\nf 3491 12258 12213\nf 12258 4474 12264\nf 12213 12264 863\nf 2236 19540 19542\nf 19540 4474 19541\nf 19542 19541 5510\nf 4473 19535 19543\nf 19535 2235 16081\nf 19543 16081 5510\nf 870 19544 19546\nf 19544 3501 19545\nf 19546 19545 869\nf 3500 19537 12262\nf 19537 869 19545\nf 12262 19545 3501\nf 863 12263 12207\nf 12263 4475 12273\nf 12207 12273 862\nf 2237 19547 16082\nf 19547 4475 19548\nf 16082 19548 2236\nf 4474 19540 12265\nf 19540 2236 19548\nf 12265 19548 4475\nf 871 19549 19551\nf 19549 3502 19550\nf 19551 19550 870\nf 3501 19544 12268\nf 19544 870 19550\nf 12268 19550 3502\nf 862 12272 12203\nf 12272 4476 19552\nf 12203 19552 861\nf 4477 12278 12271\nf 12278 861 19552\nf 12271 19552 4476\nf 2238 12269 16083\nf 12269 4476 19553\nf 16083 19553 2237\nf 4475 19547 12274\nf 19547 2237 19553\nf 12274 19553 4476\nf 872 19554 12368\nf 19554 3503 19555\nf 12368 19555 871\nf 3502 19549 12277\nf 19549 871 19555\nf 12277 19555 3503\nf 4478 12286 12193\nf 12286 860 12196\nf 12193 12196 2224\nf 2239 19556 19557\nf 19556 4478 12279\nf 19557 12279 4477\nf 4477 12270 19557\nf 12270 2238 16084\nf 19557 16084 2239\nf 4494 19558 12376\nf 19558 3504 19559\nf 12376 19559 872\nf 3503 19554 12282\nf 19554 872 19559\nf 12282 19559 3504\nf 860 12285 19560\nf 12285 4479 12284\nf 19560 12284 3505\nf 3505 12288 19560\nf 12288 859 12188\nf 19560 12188 860\nf 3504 7749 12280\nf 7749 4479 19561\nf 12280 19561 2239\nf 4478 19556 12287\nf 19556 2239 19561\nf 12287 19561 4479\nf 4480 16087 19562\nf 16087 2240 16086\nf 19562 16086 4496\nf 4480 19563 19564\nf 19563 873 12294\nf 19564 12294 4481\nf 4481 12291 19564\nf 12291 2241 7755\nf 19564 7755 4480\nf 4482 19565 12304\nf 19565 875 19566\nf 12304 19566 2244\nf 4482 12298 12301\nf 12298 2242 12297\nf 12301 12297 874\nf 3506 12303 12308\nf 12303 2243 7765\nf 12308 7765 2245\nf 2245 12305 7766\nf 12305 876 12313\nf 7766 12313 2246\nf 2245 7764 12306\nf 7764 2244 19567\nf 12306 19567 4483\nf 875 19568 19566\nf 19568 4483 19567\nf 19566 19567 2244\nf 4485 12325 19569\nf 12325 828 12320\nf 19569 12320 4484\nf 2248 19570 16089\nf 19570 4484 19571\nf 16089 19571 2175\nf 827 12319 12321\nf 12319 2175 19571\nf 12321 19571 4484\nf 4617 19572 19573\nf 19572 3508 7775\nf 19573 7775 825\nf 3508 19574 12324\nf 19574 877 19575\nf 12324 19575 3509\nf 864 12326 19576\nf 12326 4485 16091\nf 19576 16091 4486\nf 4486 12332 19576\nf 12332 865 19520\nf 19576 19520 864\nf 3509 16090 12322\nf 16090 4485 19577\nf 12322 19577 2248\nf 4484 19570 19569\nf 19570 2248 19577\nf 19569 19577 4485\nf 878 19578 19580\nf 19578 3510 19579\nf 19580 19579 877\nf 3509 19575 12330\nf 19575 877 19579\nf 12330 19579 3510\nf 865 12331 19523\nf 12331 4487 19581\nf 19523 19581 866\nf 879 19582 19584\nf 19582 3511 19583\nf 19584 19583 878\nf 3510 19578 12336\nf 19578 878 19583\nf 12336 19583 3511\nf 866 19585 19526\nf 19585 5833 12338\nf 19526 12338 867\nf 880 19586 19588\nf 19586 3512 19587\nf 19588 19587 879\nf 3511 19582 12342\nf 19582 879 19587\nf 12342 19587 3512\nf 867 12337 19532\nf 12337 4488 12344\nf 19532 12344 5806\nf 881 19589 19591\nf 19589 3513 19590\nf 19591 19590 880\nf 3512 19586 12348\nf 19586 880 19590\nf 12348 19590 3513\nf 868 12349 19539\nf 12349 4490 12356\nf 19539 12356 869\nf 882 19592 19594\nf 19592 3514 19593\nf 19594 19593 881\nf 3513 19589 12354\nf 19589 881 19593\nf 12354 19593 3514\nf 869 12355 19546\nf 12355 4491 12362\nf 19546 12362 870\nf 883 19595 19597\nf 19595 3515 19596\nf 19597 19596 882\nf 3514 19592 12360\nf 19592 882 19596\nf 12360 19596 3515\nf 870 12361 19551\nf 12361 4492 19598\nf 19551 19598 871\nf 884 19599 19601\nf 19599 3516 19600\nf 19601 19600 883\nf 3515 19595 12366\nf 19595 883 19600\nf 12366 19600 3516\nf 872 12367 12377\nf 12367 5314 19602\nf 12377 19602 4493\nf 885 19603 13293\nf 19603 3517 19604\nf 13293 19604 884\nf 3516 19599 12372\nf 19599 884 19604\nf 12372 19604 3517\nf 3504 19558 16085\nf 19558 4494 19605\nf 16085 19605 4496\nf 4495 19606 12375\nf 19606 4496 19605\nf 12375 19605 4494\nf 2249 12373 16096\nf 12373 4494 12378\nf 16096 12378 4493\nf 3517 19603 12381\nf 19603 885 19607\nf 12381 19607 3518\nf 4480 19562 19563\nf 19562 4496 19608\nf 19563 19608 873\nf 4495 19609 19606\nf 19609 873 19608\nf 19606 19608 4496\nf 4495 12382 19609\nf 12382 4497 12388\nf 19609 12388 873\nf 4495 12374 12383\nf 12374 2249 16098\nf 12383 16098 2250\nf 4481 12293 12292\nf 12293 4498 12392\nf 12292 12392 874\nf 2251 19610 16101\nf 19610 4498 12389\nf 16101 12389 4497\nf 4497 12384 16099\nf 12384 2250 19611\nf 16099 19611 5315\nf 886 16102 19613\nf 16102 2251 19612\nf 19613 19612 3519\nf 4482 12300 19565\nf 12300 4499 12391\nf 19565 12391 875\nf 2251 7777 19610\nf 7777 4499 12393\nf 19610 12393 4498\nf 3520 19614 12395\nf 19614 2252 16103\nf 12395 16103 886\nf 875 19615 19568\nf 19615 4500 12399\nf 19568 12399 4483\nf 4500 7782 12397\nf 7782 2253 19616\nf 12397 19616 4501\nf 4483 12398 12307\nf 12398 4501 12403\nf 12307 12403 876\nf 3520 7780 19614\nf 7780 4500 19617\nf 19614 19617 2252\nf 875 12390 19615\nf 12390 2252 19617\nf 19615 19617 4500\nf 3521 7783 12401\nf 7783 2253 16104\nf 12401 16104 887\nf 4502 19618 7467\nf 19618 2254 12407\nf 7467 12407 3481\nf 2254 19619 7785\nf 19619 4501 19616\nf 7785 19616 2253\nf 4501 19619 12404\nf 19619 2254 19618\nf 12404 19618 4502\nf 3481 12406 12413\nf 12406 4503 7786\nf 12413 7786 2153\nf 4503 12405 16105\nf 12405 2254 7784\nf 16105 7784 3521\nf 5974 19620 12412\nf 19620 786 7468\nf 12412 7468 3481\nf 4504 19621 13000\nf 19621 3522 16203\nf 13000 16203 2255\nf 892 12418 19622\nf 12418 4504 12999\nf 19622 12999 889\nf 5807 19623 19624\nf 19623 3522 7789\nf 19624 7789 891\nf 4504 12417 19625\nf 12417 4505 12420\nf 19625 12420 3523\nf 894 12423 19627\nf 12423 2256 19626\nf 19627 19626 892\nf 4505 12419 16107\nf 12419 892 19626\nf 16107 19626 2256\nf 891 7791 19629\nf 7791 3523 19628\nf 19629 19628 893\nf 3524 19630 12422\nf 19630 893 19628\nf 12422 19628 3523\nf 2256 12425 16108\nf 12425 4506 19631\nf 16108 19631 3525\nf 895 19632 13050\nf 19632 4506 12424\nf 13050 12424 894\nf 893 19630 19633\nf 19630 3524 7792\nf 19633 7792 896\nf 3526 19634 12426\nf 19634 896 7794\nf 12426 7794 3525\nf 3525 19631 12427\nf 19631 4506 12429\nf 12427 12429 2257\nf 4506 19632 12430\nf 19632 895 19635\nf 12430 19635 4507\nf 897 16109 19636\nf 16109 2258 12433\nf 19636 12433 4507\nf 896 19634 19638\nf 19634 3526 19637\nf 19638 19637 898\nf 3527 19639 12435\nf 19639 898 19637\nf 12435 19637 3526\nf 2258 16111 12432\nf 16111 3527 12434\nf 12432 12434 2257\nf 899 16112 19640\nf 16112 2260 12438\nf 19640 12438 4508\nf 4509 19641 12443\nf 19641 898 19639\nf 12443 19639 3527\nf 2260 19642 12439\nf 19642 2263 16116\nf 12439 16116 2259\nf 4509 12442 19643\nf 12442 2259 16115\nf 19643 16115 3530\nf 3529 12447 19644\nf 12447 3528 7797\nf 19644 7797 2262\nf 3529 19644 19645\nf 19644 2262 12449\nf 19645 12449 4510\nf 4510 19646 19645\nf 19646 2263 12453\nf 19645 12453 3529\nf 4509 19643 19647\nf 19643 3530 12452\nf 19647 12452 4511\nf 3530 16114 12450\nf 16114 2263 19646\nf 12450 19646 4510\nf 4511 12451 19648\nf 12451 4510 12448\nf 19648 12448 808\nf 4512 12455 7800\nf 12455 900 19649\nf 7800 19649 811\nf 2260 16113 19642\nf 16113 4512 12454\nf 19642 12454 2263\nf 901 12989 19651\nf 12989 3613 19650\nf 19651 19650 902\nf 3531 19652 12460\nf 19652 902 19650\nf 12460 19650 3613\nf 2264 12992 16117\nf 12992 4513 12462\nf 16117 12462 2265\nf 891 19653 19624\nf 19653 4514 19654\nf 19624 19654 5807\nf 4513 19655 12463\nf 19655 890 19656\nf 12463 19656 5807\nf 902 19652 19658\nf 19652 3531 19657\nf 19658 19657 903\nf 3532 19659 12466\nf 19659 903 19657\nf 12466 19657 3531\nf 2265 19660 16118\nf 19660 4514 12468\nf 16118 12468 2266\nf 893 19661 19629\nf 19661 4515 19662\nf 19629 19662 891\nf 4514 19653 12469\nf 19653 891 19662\nf 12469 19662 4515\nf 903 19659 19664\nf 19659 3532 19663\nf 19664 19663 904\nf 3533 19665 12472\nf 19665 904 19663\nf 12472 19663 3532\nf 2266 12467 16119\nf 12467 4515 12474\nf 16119 12474 2267\nf 896 19666 19633\nf 19666 4516 19667\nf 19633 19667 893\nf 4515 19661 12475\nf 19661 893 19667\nf 12475 19667 4516\nf 904 19665 19669\nf 19665 3533 19668\nf 19669 19668 905\nf 3534 19670 12478\nf 19670 905 19668\nf 12478 19668 3533\nf 2267 12473 16120\nf 12473 4516 12480\nf 16120 12480 2268\nf 898 12485 19638\nf 12485 4517 19671\nf 19638 19671 896\nf 4516 19666 12481\nf 19666 896 19671\nf 12481 19671 4517\nf 905 19670 19673\nf 19670 3534 19672\nf 19673 19672 906\nf 3535 19674 12484\nf 19674 906 19672\nf 12484 19672 3534\nf 2268 12479 16121\nf 12479 4517 19675\nf 16121 19675 2269\nf 4518 12489 12487\nf 12489 2269 19675\nf 12487 19675 4517\nf 4509 19676 19641\nf 19676 4518 12486\nf 19641 12486 898\nf 4518 19676 12490\nf 19676 4509 19677\nf 12490 19677 4519\nf 906 19674 19679\nf 19674 3535 19678\nf 19679 19678 907\nf 3536 19680 12493\nf 19680 907 19678\nf 12493 19678 3535\nf 2269 12488 16122\nf 12488 4519 19681\nf 16122 19681 2270\nf 808 12500 19648\nf 12500 4520 12496\nf 19648 12496 4511\nf 4520 19682 12494\nf 19682 2270 19681\nf 12494 19681 4519\nf 4511 12495 19647\nf 12495 4519 19677\nf 19647 19677 4509\nf 907 19680 19684\nf 19680 3536 19683\nf 19684 19683 806\nf 3537 12503 12499\nf 12503 806 19683\nf 12499 19683 3536\nf 2270 19682 16124\nf 19682 4520 19685\nf 16124 19685 2271\nf 2272 12506 12502\nf 12506 2271 19685\nf 12502 19685 4520\nf 3537 19686 12504\nf 19686 805 14044\nf 12504 14044 3484\nf 805 19686 12505\nf 19686 3537 16123\nf 12505 16123 2271\nf 806 12009 19687\nf 12009 2458 8045\nf 19687 8045 3538\nf 2273 8357 16125\nf 8357 2168 19688\nf 16125 19688 2274\nf 4521 19689 12508\nf 19689 2274 19688\nf 12508 19688 2168\nf 802 19690 19505\nf 19690 4521 12507\nf 19505 12507 803\nf 806 19687 19684\nf 19687 3538 19691\nf 19684 19691 907\nf 3539 19692 12511\nf 19692 907 19691\nf 12511 19691 3538\nf 2274 19689 16126\nf 19689 4521 12513\nf 16126 12513 2275\nf 801 19693 19695\nf 19693 4522 19694\nf 19695 19694 802\nf 4521 19690 12514\nf 19690 802 19694\nf 12514 19694 4522\nf 907 19692 19679\nf 19692 3539 19696\nf 19679 19696 906\nf 3540 19697 12517\nf 19697 906 19696\nf 12517 19696 3539\nf 2275 12512 16127\nf 12512 4522 12519\nf 16127 12519 2276\nf 4523 12520 19501\nf 12520 4522 19693\nf 19501 19693 801\nf 906 19697 19673\nf 19697 3540 19698\nf 19673 19698 905\nf 3541 19699 12523\nf 19699 905 19698\nf 12523 19698 3540\nf 2276 12518 16128\nf 12518 4523 19700\nf 16128 19700 2277\nf 4458 11988 11993\nf 11988 2277 19700\nf 11993 19700 4523\nf 905 19699 19669\nf 19699 3541 19701\nf 19669 19701 904\nf 3542 19702 12526\nf 19702 904 19701\nf 12526 19701 3541\nf 904 19702 19664\nf 19702 3542 19703\nf 19664 19703 903\nf 3543 19704 12529\nf 19704 903 19703\nf 12529 19703 3542\nf 800 11987 12530\nf 11987 799 12533\nf 12530 12533 4524\nf 4524 12534 12531\nf 12534 3544 19705\nf 12531 19705 3543\nf 903 19704 19706\nf 19704 3543 19705\nf 19706 19705 3544\nf 3544 19707 19706\nf 19707 902 19658\nf 19706 19658 903\nf 2278 12537 12540\nf 12537 798 7503\nf 12540 7503 788\nf 902 19708 19651\nf 19708 3545 7803\nf 19651 7803 901\nf 3545 19708 12539\nf 19708 902 19707\nf 12539 19707 3544\nf 3546 16130 19709\nf 16130 2279 16131\nf 19709 16131 3547\nf 3547 7811 19709\nf 7811 797 12543\nf 19709 12543 3546\nf 820 12544 19710\nf 12544 4525 12547\nf 19710 12547 908\nf 2280 19711 16133\nf 19711 4525 19712\nf 16133 19712 3548\nf 818 14079 12545\nf 14079 3548 19712\nf 12545 19712 4525\nf 909 19713 19714\nf 19713 3549 19508\nf 19714 19508 817\nf 3549 19713 16132\nf 19713 909 19715\nf 16132 19715 2280\nf 908 12546 19716\nf 12546 4526 12553\nf 19716 12553 910\nf 2281 19717 12550\nf 19717 4526 19718\nf 12550 19718 2280\nf 4525 19711 12548\nf 19711 2280 19718\nf 12548 19718 4526\nf 911 19719 19721\nf 19719 3550 19720\nf 19721 19720 909\nf 2280 19715 12551\nf 19715 909 19720\nf 12551 19720 3550\nf 910 12552 19722\nf 12552 4527 12559\nf 19722 12559 912\nf 2282 19723 16134\nf 19723 4527 19724\nf 16134 19724 2281\nf 4526 19717 12554\nf 19717 2281 19724\nf 12554 19724 4527\nf 913 19725 19727\nf 19725 3551 19726\nf 19727 19726 911\nf 3550 19719 12557\nf 19719 911 19726\nf 12557 19726 3551\nf 912 12558 19728\nf 12558 4528 12565\nf 19728 12565 914\nf 2283 19729 16135\nf 19729 4528 19730\nf 16135 19730 2282\nf 4527 19723 12560\nf 19723 2282 19730\nf 12560 19730 4528\nf 915 19731 19733\nf 19731 3552 19732\nf 19733 19732 913\nf 3551 19725 12563\nf 19725 913 19732\nf 12563 19732 3552\nf 914 12564 19734\nf 12564 4529 12571\nf 19734 12571 916\nf 2284 19735 16136\nf 19735 4529 19736\nf 16136 19736 2283\nf 4528 19729 12566\nf 19729 2283 19736\nf 12566 19736 4529\nf 917 19737 19739\nf 19737 3553 19738\nf 19739 19738 915\nf 3552 19731 12569\nf 19731 915 19738\nf 12569 19738 3553\nf 916 12570 19740\nf 12570 4530 12577\nf 19740 12577 918\nf 2285 19741 16137\nf 19741 4530 19742\nf 16137 19742 2284\nf 4529 19735 12572\nf 19735 2284 19742\nf 12572 19742 4530\nf 919 19743 19745\nf 19743 3554 19744\nf 19745 19744 917\nf 3553 19737 12575\nf 19737 917 19744\nf 12575 19744 3554\nf 918 12576 19746\nf 12576 4531 12583\nf 19746 12583 920\nf 2286 19747 16138\nf 19747 4531 19748\nf 16138 19748 2285\nf 4530 19741 12578\nf 19741 2285 19748\nf 12578 19748 4531\nf 921 19749 19751\nf 19749 3555 19750\nf 19751 19750 919\nf 3554 19743 12581\nf 19743 919 19750\nf 12581 19750 3555\nf 920 12582 19753\nf 12582 4532 19752\nf 19753 19752 922\nf 2287 19754 16139\nf 19754 4532 19755\nf 16139 19755 2286\nf 4531 19747 12584\nf 19747 2286 19755\nf 12584 19755 4532\nf 923 19756 19758\nf 19756 3556 19757\nf 19758 19757 921\nf 3555 19749 12587\nf 19749 921 19757\nf 12587 19757 3556\nf 2288 19759 16140\nf 19759 922 19760\nf 16140 19760 2287\nf 4532 19754 19752\nf 19754 2287 19760\nf 19752 19760 922\nf 925 19761 19763\nf 19761 3557 19762\nf 19763 19762 923\nf 3556 19756 12590\nf 19756 923 19762\nf 12590 19762 3557\nf 2289 19764 16141\nf 19764 924 19765\nf 16141 19765 2288\nf 922 19759 19766\nf 19759 2288 19765\nf 19766 19765 924\nf 3592 19767 12843\nf 19767 4533 19768\nf 12843 19768 925\nf 3557 19761 12593\nf 19761 925 19768\nf 12593 19768 4533\nf 2290 12594 16143\nf 12594 926 19769\nf 16143 19769 2289\nf 924 19764 19770\nf 19764 2289 19769\nf 19770 19769 926\nf 2290 19771 16144\nf 19771 2292 19772\nf 16144 19772 2291\nf 2292 19771 19773\nf 19771 2290 16142\nf 19773 16142 4533\nf 3592 12597 19767\nf 12597 2292 19773\nf 19767 19773 4533\nf 2293 12605 12600\nf 12605 928 7818\nf 12600 7818 2291\nf 2291 19772 12599\nf 19772 2292 12604\nf 12599 12604 3559\nf 3560 13420 12609\nf 13420 930 12606\nf 12609 12606 2293\nf 2296 16148 12615\nf 16148 2295 16146\nf 12615 16146 2294\nf 933 12619 19774\nf 12619 2296 12614\nf 19774 12614 931\nf 932 19775 13426\nf 19775 3561 19776\nf 13426 19776 934\nf 3561 19775 16147\nf 19775 932 7824\nf 16147 7824 2295\nf 935 12623 19777\nf 12623 2297 12620\nf 19777 12620 933\nf 934 19776 19778\nf 19776 3561 12622\nf 19778 12622 3562\nf 3562 12626 19778\nf 12626 936 19779\nf 19778 19779 934\nf 3562 12621 7826\nf 12621 2297 12625\nf 7826 12625 2298\nf 4534 19780 19781\nf 19780 2298 12624\nf 19781 12624 935\nf 936 12627 19782\nf 12627 3563 12631\nf 19782 12631 937\nf 2298 19780 16149\nf 19780 4534 12633\nf 16149 12633 2299\nf 937 12632 19783\nf 12632 3564 7831\nf 19783 7831 939\nf 2299 12634 16151\nf 12634 4535 12641\nf 16151 12641 2300\nf 940 12637 19784\nf 12637 4535 12628\nf 19784 12628 938\nf 939 7833 16280\nf 7833 3565 19785\nf 16280 19785 851\nf 3566 12129 12640\nf 12129 851 19785\nf 12640 19785 3565\nf 2300 12642 16152\nf 12642 4536 12646\nf 16152 12646 2301\nf 941 12645 19786\nf 12645 4536 12635\nf 19786 12635 940\nf 2301 12647 7837\nf 12647 4537 19787\nf 7837 19787 2302\nf 4537 7838 19787\nf 7838 2303 7842\nf 19787 7842 2302\nf 3567 19788 12658\nf 19788 2305 7528\nf 12658 7528 4538\nf 2170 7526 19789\nf 7526 2305 12655\nf 19789 12655 2457\nf 943 7850 12801\nf 7850 4539 12660\nf 12801 12660 944\nf 3567 19790 19788\nf 19790 4539 16153\nf 19788 16153 2305\nf 944 12659 19791\nf 12659 4540 12666\nf 19791 12666 946\nf 2306 19792 12663\nf 19792 4540 19793\nf 12663 19793 3567\nf 4539 19790 12661\nf 19790 3567 19793\nf 12661 19793 4540\nf 947 19794 19796\nf 19794 3568 19795\nf 19796 19795 945\nf 3567 12657 12664\nf 12657 945 19795\nf 12664 19795 3568\nf 946 12665 19797\nf 12665 4541 12672\nf 19797 12672 948\nf 2307 19798 16154\nf 19798 4541 19799\nf 16154 19799 2306\nf 4540 19792 12667\nf 19792 2306 19799\nf 12667 19799 4541\nf 949 19800 19802\nf 19800 3569 19801\nf 19802 19801 947\nf 3568 19794 12670\nf 19794 947 19801\nf 12670 19801 3569\nf 948 12671 19803\nf 12671 4542 12678\nf 19803 12678 950\nf 2308 19804 16155\nf 19804 4542 19805\nf 16155 19805 2307\nf 4541 19798 12673\nf 19798 2307 19805\nf 12673 19805 4542\nf 951 19806 19808\nf 19806 3570 19807\nf 19808 19807 949\nf 3569 19800 12676\nf 19800 949 19807\nf 12676 19807 3570\nf 950 12677 19809\nf 12677 4543 12684\nf 19809 12684 952\nf 2309 19810 16156\nf 19810 4543 19811\nf 16156 19811 2308\nf 4542 19804 12679\nf 19804 2308 19811\nf 12679 19811 4543\nf 953 19812 19814\nf 19812 3571 19813\nf 19814 19813 951\nf 3570 19806 12682\nf 19806 951 19813\nf 12682 19813 3571\nf 952 12683 19815\nf 12683 4544 12690\nf 19815 12690 954\nf 2310 19816 16157\nf 19816 4544 19817\nf 16157 19817 2309\nf 4543 19810 12685\nf 19810 2309 19817\nf 12685 19817 4544\nf 955 19818 19820\nf 19818 3572 19819\nf 19820 19819 953\nf 3571 19812 12688\nf 19812 953 19819\nf 12688 19819 3572\nf 954 12689 19822\nf 12689 4545 19821\nf 19822 19821 3591\nf 2311 12692 16159\nf 12692 4545 19823\nf 16159 19823 2310\nf 4544 19816 12691\nf 19816 2310 19823\nf 12691 19823 4545\nf 3572 19824 16158\nf 19824 956 19825\nf 16158 19825 2311\nf 956 19824 19826\nf 19824 3572 19818\nf 19826 19818 955\nf 3591 19821 19828\nf 19821 4545 19827\nf 19828 19827 957\nf 2312 12695 12694\nf 12695 957 19827\nf 12694 19827 4545\nf 2311 19829 12693\nf 19829 4546 12700\nf 12693 12700 2312\nf 958 12701 13042\nf 12701 4546 19830\nf 13042 19830 956\nf 2311 19825 19829\nf 19825 956 19830\nf 19829 19830 4546\nf 2313 12706 12699\nf 12706 959 12696\nf 12699 12696 2312\nf 4546 12703 12698\nf 12703 3573 12710\nf 12698 12710 2313\nf 2315 12714 12709\nf 12714 961 12707\nf 12709 12707 2313\nf 961 12716 12859\nf 12716 3574 19831\nf 12859 19831 963\nf 2315 7853 16160\nf 7853 2314 19832\nf 16160 19832 2316\nf 4547 19833 12718\nf 19833 2316 19832\nf 12718 19832 2314\nf 965 19834 19835\nf 19834 4547 12717\nf 19835 12717 962\nf 963 19831 12869\nf 19831 3574 12721\nf 12869 12721 964\nf 2316 19833 16161\nf 19833 4547 12723\nf 16161 12723 2317\nf 4547 19834 12724\nf 19834 965 19836\nf 12724 19836 4548\nf 964 12727 19838\nf 12727 3575 19837\nf 19838 19837 966\nf 2317 12722 16162\nf 12722 4548 19839\nf 16162 19839 2318\nf 967 12731 13068\nf 12731 4548 19836\nf 13068 19836 965\nf 966 19840 19842\nf 19840 3576 19841\nf 19842 19841 968\nf 3576 19840 12730\nf 19840 966 19837\nf 12730 19837 3575\nf 2318 19843 16163\nf 19843 4549 19844\nf 16163 19844 2319\nf 4549 19843 12733\nf 19843 2318 19839\nf 12733 19839 4548\nf 969 19845 13071\nf 19845 4549 12732\nf 13071 12732 967\nf 968 19846 19848\nf 19846 3577 19847\nf 19848 19847 4570\nf 3577 19846 12736\nf 19846 968 19841\nf 12736 19841 3576\nf 2319 19844 19850\nf 19844 4549 19849\nf 19850 19849 5925\nf 970 19851 19853\nf 19851 5925 19852\nf 19853 19852 969\nf 4549 19845 19849\nf 19845 969 19852\nf 19849 19852 5925\nf 971 12889 12742\nf 12889 4570 19847\nf 12742 19847 3577\nf 2320 12737 16165\nf 12737 4550 19854\nf 16165 19854 2321\nf 972 12746 19856\nf 12746 4550 19855\nf 19856 19855 970\nf 2321 19857 16167\nf 19857 4551 12756\nf 16167 12756 3578\nf 4551 19857 12748\nf 19857 2321 19854\nf 12748 19854 4550\nf 975 12751 19858\nf 12751 4551 12747\nf 19858 12747 972\nf 973 16166 19859\nf 16166 3578 12752\nf 19859 12752 974\nf 3579 12753 19860\nf 12753 3578 12755\nf 19860 12755 4552\nf 974 12754 19861\nf 12754 3579 12760\nf 19861 12760 976\nf 3579 19860 12761\nf 19860 4552 12763\nf 12761 12763 3580\nf 977 12759 19862\nf 12759 4552 12749\nf 19862 12749 975\nf 976 12762 19863\nf 12762 3580 7854\nf 19863 7854 978\nf 3580 12764 7855\nf 12764 4553 12770\nf 7855 12770 3581\nf 979 12767 19864\nf 12767 4553 12757\nf 19864 12757 977\nf 3581 12771 12775\nf 12771 4554 12777\nf 12775 12777 3582\nf 981 12774 19865\nf 12774 4554 12765\nf 19865 12765 979\nf 980 12776 12920\nf 12776 3582 7857\nf 12920 7857 852\nf 982 12781 19866\nf 12781 4555 12772\nf 19866 12772 981\nf 3583 16168 7861\nf 16168 4555 12780\nf 7861 12780 4556\nf 983 12784 19867\nf 12784 4556 12779\nf 19867 12779 982\nf 4557 12794 12792\nf 12794 2324 12796\nf 12792 12796 3584\nf 4557 7869 12017\nf 7869 817 12789\nf 12017 12789 2455\nf 909 19868 19721\nf 19868 4558 12803\nf 19721 12803 911\nf 4558 19868 7868\nf 19868 909 19714\nf 7868 19714 817\nf 3585 16170 16169\nf 16170 2325 12798\nf 16169 12798 3584\nf 911 12802 19727\nf 12802 4559 12809\nf 19727 12809 913\nf 2326 19869 16171\nf 19869 4559 19870\nf 16171 19870 2325\nf 4558 12797 12804\nf 12797 2325 19870\nf 12804 19870 4559\nf 946 19871 19791\nf 19871 3586 19872\nf 19791 19872 944\nf 3585 12799 12807\nf 12799 944 19872\nf 12807 19872 3586\nf 913 12808 19733\nf 12808 4560 12815\nf 19733 12815 915\nf 2327 19873 16172\nf 19873 4560 19874\nf 16172 19874 2326\nf 4559 19869 12810\nf 19869 2326 19874\nf 12810 19874 4560\nf 948 19875 19797\nf 19875 3587 19876\nf 19797 19876 946\nf 3586 19871 12813\nf 19871 946 19876\nf 12813 19876 3587\nf 915 12814 19739\nf 12814 4561 12821\nf 19739 12821 917\nf 2328 19877 16173\nf 19877 4561 19878\nf 16173 19878 2327\nf 4560 19873 12816\nf 19873 2327 19878\nf 12816 19878 4561\nf 950 19879 19803\nf 19879 3588 19880\nf 19803 19880 948\nf 3587 19875 12819\nf 19875 948 19880\nf 12819 19880 3588\nf 917 12820 19745\nf 12820 4562 12827\nf 19745 12827 919\nf 2329 19881 16174\nf 19881 4562 19882\nf 16174 19882 2328\nf 4561 19877 12822\nf 19877 2328 19882\nf 12822 19882 4562\nf 952 19883 19809\nf 19883 3589 19884\nf 19809 19884 950\nf 3588 19879 12825\nf 19879 950 19884\nf 12825 19884 3589\nf 919 12826 19751\nf 12826 4563 12833\nf 19751 12833 921\nf 2330 19885 16175\nf 19885 4563 19886\nf 16175 19886 2329\nf 4562 19881 12828\nf 19881 2329 19886\nf 12828 19886 4563\nf 954 19887 19815\nf 19887 3590 19888\nf 19815 19888 952\nf 3589 19883 12831\nf 19883 952 19888\nf 12831 19888 3590\nf 921 12832 19758\nf 12832 4564 12839\nf 19758 12839 923\nf 2331 19889 16176\nf 19889 4564 19890\nf 16176 19890 2330\nf 4563 19885 12834\nf 19885 2330 19890\nf 12834 19890 4564\nf 3590 19887 12837\nf 19887 954 19822\nf 12837 19822 3591\nf 923 12838 19763\nf 12838 4565 19891\nf 19763 19891 925\nf 2332 19892 16178\nf 19892 4565 19893\nf 16178 19893 2331\nf 4564 19889 12840\nf 19889 2331 19893\nf 12840 19893 4565\nf 957 19894 19828\nf 19894 2332 16177\nf 19828 16177 3591\nf 925 19891 12841\nf 19891 4565 19895\nf 12841 19895 2333\nf 2333 19895 12845\nf 19895 4565 19892\nf 12845 19892 2332\nf 2333 12844 16179\nf 12844 4566 12849\nf 16179 12849 2334\nf 959 12850 12697\nf 12850 4566 19896\nf 12697 19896 957\nf 2332 19894 12846\nf 19894 957 19896\nf 12846 19896 4566\nf 2335 12853 19897\nf 12853 927 7873\nf 19897 7873 2334\nf 2334 12848 19897\nf 12848 3593 7874\nf 19897 7874 2335\nf 2337 12860 12856\nf 12860 929 12854\nf 12856 12854 2335\nf 929 12862 16145\nf 12862 3594 19898\nf 16145 19898 931\nf 2337 12855 16180\nf 12855 2336 12864\nf 16180 12864 2338\nf 963 12868 12863\nf 12868 4567 19899\nf 12863 19899 2338\nf 931 19898 19774\nf 19898 3594 19900\nf 19774 19900 933\nf 3595 19901 12867\nf 19901 933 19900\nf 12867 19900 3594\nf 2338 19899 16181\nf 19899 4567 19902\nf 16181 19902 2339\nf 966 12874 19838\nf 12874 4567 12870\nf 19838 12870 964\nf 933 19903 19777\nf 19903 3596 19904\nf 19777 19904 935\nf 3596 19903 12873\nf 19903 933 19901\nf 12873 19901 3595\nf 2339 19905 16182\nf 19905 4568 19906\nf 16182 19906 2340\nf 4568 19905 12876\nf 19905 2339 19902\nf 12876 19902 4567\nf 968 12880 19842\nf 12880 4568 12875\nf 19842 12875 966\nf 935 19907 19781\nf 19907 3597 19908\nf 19781 19908 4534\nf 3597 19907 12879\nf 19907 935 19904\nf 12879 19904 3596\nf 2340 19909 16183\nf 19909 4569 19910\nf 16183 19910 2341\nf 4569 19909 12882\nf 19909 2340 19906\nf 12882 19906 4568\nf 4570 19911 19848\nf 19911 4569 12881\nf 19848 12881 968\nf 938 12630 12885\nf 12630 4534 19908\nf 12885 19908 3597\nf 2341 19912 16184\nf 19912 4570 19913\nf 16184 19913 2342\nf 4570 19912 19911\nf 19912 2341 19910\nf 19911 19910 4569\nf 938 12888 19784\nf 12888 3598 12895\nf 19784 12895 940\nf 2342 19914 16185\nf 19914 4571 12897\nf 16185 12897 2343\nf 4571 19914 12891\nf 19914 2342 19913\nf 12891 19913 4570\nf 973 12894 12745\nf 12894 4571 12890\nf 12745 12890 971\nf 940 12896 19786\nf 12896 3599 19915\nf 19786 19915 941\nf 2343 12898 16186\nf 12898 4572 12905\nf 16186 12905 2344\nf 974 12901 19859\nf 12901 4572 12892\nf 19859 12892 973\nf 941 19916 12648\nf 19916 3600 7880\nf 12648 7880 942\nf 3600 19916 12904\nf 19916 941 19915\nf 12904 19915 3599\nf 2344 12906 16189\nf 12906 4573 12910\nf 16189 12910 2345\nf 976 12909 19861\nf 12909 4573 12899\nf 19861 12899 974\nf 3601 16188 12915\nf 16188 2345 19917\nf 12915 19917 2346\nf 2345 12911 19917\nf 12911 4574 12916\nf 19917 12916 2346\nf 978 12914 19863\nf 12914 4574 12907\nf 19863 12907 976\nf 2346 12917 7884\nf 12917 3602 7885\nf 7884 7885 3603\nf 763 7643 19918\nf 7643 3603 12924\nf 19918 12924 762\nf 2350 12938 7906\nf 12938 4575 19919\nf 7906 19919 2354\nf 4575 12944 19919\nf 12944 2355 7912\nf 19919 7912 2354\nf 2355 12951 7914\nf 12951 4576 19920\nf 7914 19920 3606\nf 4576 12954 19920\nf 12954 2357 7918\nf 19920 7918 3606\nf 2357 12956 12957\nf 12956 4577 19921\nf 12957 19921 4578\nf 4578 19921 19923\nf 19921 4577 19922\nf 19923 19922 991\nf 4578 19923 12960\nf 19923 991 12963\nf 12960 12963 2359\nf 2359 12962 16192\nf 12962 992 12968\nf 16192 12968 4579\nf 995 19924 19925\nf 19924 4579 12967\nf 19925 12967 994\nf 4456 12970 19498\nf 12970 796 11965\nf 19498 11965 3609\nf 3610 12940 7934\nf 12940 987 12950\nf 7934 12950 2356\nf 2160 11968 7812\nf 11968 4580 12987\nf 7812 12987 797\nf 2358 16197 12953\nf 16197 3611 7935\nf 12953 7935 2356\nf 4582 19926 12988\nf 19926 2365 16202\nf 12988 16202 3613\nf 2365 19927 12990\nf 19927 4581 7938\nf 12990 7938 2364\nf 4581 19927 12982\nf 19927 2365 19926\nf 12982 19926 4582\nf 2264 12458 12993\nf 12458 3613 16201\nf 12993 16201 2366\nf 2364 12984 12991\nf 12984 990 16198\nf 12991 16198 3612\nf 2360 19928 12966\nf 19928 5843 16199\nf 12966 16199 990\nf 2366 19929 19930\nf 19929 5843 7922\nf 19930 7922 993\nf 890 19655 7925\nf 19655 4513 19931\nf 7925 19931 993\nf 2366 19930 12994\nf 19930 993 19931\nf 12994 19931 4513\nf 4579 19924 12997\nf 19924 995 12416\nf 12997 12416 2255\nf 2368 13006 13003\nf 13006 3615 16205\nf 13003 16205 2369\nf 2370 19932 16206\nf 19932 4583 19933\nf 16206 19933 2369\nf 3614 16204 13009\nf 16204 2369 19933\nf 13009 19933 4583\nf 900 19934 19649\nf 19934 3615 13007\nf 19649 13007 811\nf 945 13008 19796\nf 13008 4583 13014\nf 19796 13014 947\nf 3615 19934 13012\nf 19934 900 19935\nf 13012 19935 3616\nf 947 13013 19802\nf 13013 4584 13020\nf 19802 13020 949\nf 2371 19936 16207\nf 19936 4584 19937\nf 16207 19937 2370\nf 4583 19932 13015\nf 19932 2370 19937\nf 13015 19937 4584\nf 899 19938 12457\nf 19938 3617 19939\nf 12457 19939 900\nf 3616 19935 13018\nf 19935 900 19939\nf 13018 19939 3617\nf 949 13019 19808\nf 13019 4585 13026\nf 19808 13026 951\nf 2372 19940 16208\nf 19940 4585 19941\nf 16208 19941 2371\nf 4584 19936 13021\nf 19936 2371 19941\nf 13021 19941 4585\nf 4508 19942 19640\nf 19942 3618 19943\nf 19640 19943 899\nf 3617 19938 13024\nf 19938 899 19943\nf 13024 19943 3618\nf 951 13025 19814\nf 13025 4586 13032\nf 19814 13032 953\nf 2373 19944 16209\nf 19944 4586 19945\nf 16209 19945 2372\nf 4585 19940 13027\nf 19940 2372 19945\nf 13027 19945 4586\nf 897 19946 16110\nf 19946 3619 19947\nf 16110 19947 4508\nf 3618 19942 13030\nf 19942 4508 19947\nf 13030 19947 3619\nf 953 13031 19820\nf 13031 4587 13038\nf 19820 13038 955\nf 2374 19948 16210\nf 19948 4587 19949\nf 16210 19949 2373\nf 4586 19944 13033\nf 19944 2373 19949\nf 13033 19949 4587\nf 4507 19950 19636\nf 19950 3620 19951\nf 19636 19951 897\nf 3619 19946 13036\nf 19946 897 19951\nf 13036 19951 3620\nf 955 13037 19826\nf 13037 4588 13040\nf 19826 13040 956\nf 4589 13045 16212\nf 13045 4588 19952\nf 16212 19952 2374\nf 4587 19948 13039\nf 19948 2374 19952\nf 13039 19952 4588\nf 895 19953 19635\nf 19953 3620 19950\nf 19635 19950 4507\nf 3620 19953 16211\nf 19953 895 13046\nf 16211 13046 4589\nf 2375 13051 13044\nf 13051 958 13041\nf 13044 13041 4588\nf 4589 13048 13043\nf 13048 2376 13055\nf 13043 13055 2375\nf 2377 13058 13054\nf 13058 960 13052\nf 13054 13052 2375\nf 2376 13057 13053\nf 13057 4590 19954\nf 13053 19954 2377\nf 2377 19954 16214\nf 19954 4590 19955\nf 16214 19955 2378\nf 892 13060 19627\nf 13060 4590 13056\nf 19627 13056 894\nf 2378 16215 16213\nf 16215 965 19835\nf 16213 19835 962\nf 4591 19956 13062\nf 19956 2378 19955\nf 13062 19955 4590\nf 2378 19956 16216\nf 19956 4591 13064\nf 16216 13064 2379\nf 889 19957 19622\nf 19957 4591 13061\nf 19622 13061 892\nf 4591 19957 13065\nf 19957 889 19958\nf 13065 19958 4592\nf 2379 13063 16217\nf 13063 4592 19959\nf 16217 19959 2380\nf 995 13072 12414\nf 13072 4592 19958\nf 12414 19958 889\nf 2380 19960 16219\nf 19960 4593 19961\nf 16219 19961 3621\nf 4593 19960 13074\nf 19960 2380 19959\nf 13074 19959 4592\nf 994 13077 19925\nf 13077 4593 13073\nf 19925 13073 995\nf 969 16218 19853\nf 16218 3621 19962\nf 19853 19962 970\nf 3621 19961 13078\nf 19961 4593 13076\nf 13078 13076 2381\nf 992 19963 12969\nf 19963 4594 19964\nf 12969 19964 994\nf 2381 13075 19965\nf 13075 994 19964\nf 19965 19964 4594\nf 970 19966 19856\nf 19966 3622 19967\nf 19856 19967 972\nf 3622 19966 13080\nf 19966 970 19962\nf 13080 19962 3621\nf 2381 19965 16220\nf 19965 4594 19968\nf 16220 19968 2382\nf 991 13084 12964\nf 13084 4594 19963\nf 12964 19963 992\nf 972 19969 19858\nf 19969 3623 13090\nf 19858 13090 975\nf 3623 19969 13083\nf 19969 972 19967\nf 13083 19967 3622\nf 2382 19970 16221\nf 19970 4595 13088\nf 16221 13088 2383\nf 4595 19970 13086\nf 19970 2382 19968\nf 13086 19968 4594\nf 4577 19971 19922\nf 19971 4595 13085\nf 19922 13085 991\nf 4576 19972 12955\nf 19972 4596 19973\nf 12955 19973 4577\nf 4595 19971 13089\nf 19971 4577 19973\nf 13089 19973 4596\nf 975 13091 19862\nf 13091 3624 13092\nf 19862 13092 977\nf 2383 13087 16222\nf 13087 4596 19974\nf 16222 19974 2384\nf 4596 19972 19975\nf 19972 4576 12946\nf 19975 12946 989\nf 977 13093 19864\nf 13093 3625 13100\nf 19864 13100 979\nf 2384 13096 16223\nf 13096 4597 13103\nf 16223 13103 3626\nf 989 13094 19975\nf 13094 2384 19974\nf 19975 19974 4596\nf 988 19976 12948\nf 19976 4597 13095\nf 12948 13095 989\nf 979 13102 19865\nf 13102 3626 13106\nf 19865 13106 981\nf 2385 19977 19978\nf 19977 981 13105\nf 19978 13105 4598\nf 986 13097 12942\nf 13097 4597 19976\nf 12942 19976 988\nf 981 19977 19866\nf 19977 2385 13112\nf 19866 13112 982\nf 4599 13115 13108\nf 13115 2385 19978\nf 13108 19978 4598\nf 984 13111 12936\nf 13111 4599 13107\nf 12936 13107 986\nf 982 13114 19867\nf 13114 3627 19979\nf 19867 19979 983\nf 4600 19980 13110\nf 19980 2386 13116\nf 13110 13116 4599\nf 983 19979 7864\nf 19979 3627 13119\nf 7864 13119 853\nf 2386 19980 16224\nf 19980 4600 19981\nf 16224 19981 2387\nf 791 19982 12933\nf 19982 4600 13118\nf 12933 13118 985\nf 4600 19982 19981\nf 19982 791 13124\nf 19981 13124 2387\nf 854 19983 13126\nf 19983 3628 13123\nf 13126 13123 2388\nf 3628 19983 13120\nf 19983 854 12133\nf 13120 12133 853\nf 790 13128 13125\nf 13128 2388 13122\nf 13125 13122 2387\nf 3629 13138 19984\nf 13138 2172 13347\nf 19984 13347 822\nf 824 19985 19986\nf 19985 4601 13145\nf 19986 13145 996\nf 4601 19985 13134\nf 19985 824 13133\nf 13134 13133 2391\nf 997 19987 19989\nf 19987 3630 19988\nf 19989 19988 822\nf 3629 19984 13143\nf 19984 822 19988\nf 13143 19988 3630\nf 996 13144 19990\nf 13144 4602 13151\nf 19990 13151 998\nf 2394 19991 16225\nf 19991 4602 19992\nf 16225 19992 2393\nf 4601 13139 13146\nf 13139 2393 19992\nf 13146 19992 4602\nf 4636 19993 19995\nf 19993 3631 19994\nf 19995 19994 997\nf 3630 19987 13149\nf 19987 997 19994\nf 13149 19994 3631\nf 998 13150 19996\nf 13150 4603 13157\nf 19996 13157 1000\nf 2395 19997 16226\nf 19997 4603 19998\nf 16226 19998 2394\nf 4602 19991 13152\nf 19991 2394 19998\nf 13152 19998 4603\nf 1001 19999 20001\nf 19999 3632 20000\nf 20001 20000 999\nf 3631 20002 13155\nf 20002 999 20000\nf 13155 20000 3632\nf 1000 13156 20003\nf 13156 4604 13163\nf 20003 13163 1002\nf 2396 20004 16227\nf 20004 4604 20005\nf 16227 20005 2395\nf 4603 19997 13158\nf 19997 2395 20005\nf 13158 20005 4604\nf 1003 20006 20008\nf 20006 3633 20007\nf 20008 20007 1001\nf 3632 19999 13161\nf 19999 1001 20007\nf 13161 20007 3633\nf 1002 13162 20009\nf 13162 4605 13169\nf 20009 13169 1004\nf 2397 20010 16228\nf 20010 4605 20011\nf 16228 20011 2396\nf 4604 20004 13164\nf 20004 2396 20011\nf 13164 20011 4605\nf 1005 20012 13365\nf 20012 3634 20013\nf 13365 20013 1003\nf 3633 20006 13167\nf 20006 1003 20013\nf 13167 20013 3634\nf 1004 13168 20014\nf 13168 4606 13175\nf 20014 13175 1006\nf 2398 20015 16229\nf 20015 4606 20016\nf 16229 20016 2397\nf 4605 20010 13170\nf 20010 2397 20016\nf 13170 20016 4606\nf 1007 20017 20019\nf 20017 3635 20018\nf 20019 20018 1005\nf 3634 20012 13173\nf 20012 1005 20018\nf 13173 20018 3635\nf 1006 13174 20020\nf 13174 4607 13181\nf 20020 13181 1008\nf 2399 20021 16230\nf 20021 4607 20022\nf 16230 20022 2398\nf 4606 20015 13176\nf 20015 2398 20022\nf 13176 20022 4607\nf 1009 20023 20025\nf 20023 3636 20024\nf 20025 20024 1007\nf 3635 20017 13179\nf 20017 1007 20024\nf 13179 20024 3636\nf 1008 13180 20026\nf 13180 4608 13187\nf 20026 13187 1010\nf 2400 20027 16231\nf 20027 4608 20028\nf 16231 20028 2399\nf 4607 20021 13182\nf 20021 2399 20028\nf 13182 20028 4608\nf 1011 20029 20031\nf 20029 3637 20030\nf 20031 20030 1009\nf 3636 20023 13185\nf 20023 1009 20030\nf 13185 20030 3637\nf 1010 13186 20032\nf 13186 4609 13193\nf 20032 13193 1012\nf 2401 20033 16232\nf 20033 4609 20034\nf 16232 20034 2400\nf 4608 20027 13188\nf 20027 2400 20034\nf 13188 20034 4609\nf 1013 20035 20037\nf 20035 3638 20036\nf 20037 20036 1011\nf 3637 20029 13191\nf 20029 1011 20036\nf 13191 20036 3638\nf 1012 13192 20038\nf 13192 4610 13199\nf 20038 13199 1014\nf 2402 20039 16233\nf 20039 4610 20040\nf 16233 20040 2401\nf 4609 20033 13194\nf 20033 2401 20040\nf 13194 20040 4610\nf 1015 20041 20043\nf 20041 3639 20042\nf 20043 20042 1013\nf 3638 20035 13197\nf 20035 1013 20042\nf 13197 20042 3639\nf 1014 13198 20045\nf 13198 4611 20044\nf 20045 20044 1016\nf 4610 20039 13200\nf 20039 2402 16234\nf 13200 16234 4611\nf 1017 20046 20048\nf 20046 3640 20047\nf 20048 20047 1015\nf 3639 20041 13203\nf 20041 1015 20047\nf 13203 20047 3640\nf 1016 20049 20050\nf 20049 5317 13205\nf 20050 13205 1018\nf 1019 20051 20053\nf 20051 3641 20052\nf 20053 20052 1017\nf 3640 20046 13209\nf 20046 1017 20052\nf 13209 20052 3641\nf 3657 20054 20056\nf 20054 4613 20055\nf 20056 20055 1020\nf 4614 13221 13212\nf 13221 1020 20055\nf 13212 20055 4613\nf 2403 13210 16236\nf 13210 4613 13214\nf 16236 13214 4612\nf 3641 20051 13217\nf 20051 1019 20057\nf 13217 20057 3642\nf 2405 20058 20060\nf 20058 4614 20059\nf 20060 20059 2404\nf 4614 20058 13222\nf 20058 2405 7968\nf 13222 7968 4615\nf 4614 13211 20059\nf 13211 2403 16237\nf 20059 16237 2404\nf 2404 20061 20060\nf 20061 2406 13229\nf 20060 13229 2405\nf 2406 20061 13230\nf 20061 2404 13223\nf 13230 13223 1022\nf 3643 13235 13227\nf 13235 1023 13335\nf 13227 13335 1021\nf 2406 13232 16238\nf 13232 3644 16240\nf 16238 16240 2407\nf 2408 20062 20063\nf 20062 1025 7972\nf 20063 7972 2407\nf 2407 13239 20063\nf 13239 3660 16260\nf 20063 16260 2408\nf 3508 19572 19574\nf 19572 4617 13251\nf 19574 13251 877\nf 4617 19573 13246\nf 19573 825 20064\nf 13246 20064 4616\nf 4616 20064 12026\nf 20064 825 19509\nf 12026 19509 2453\nf 996 20065 19986\nf 20065 3645 20066\nf 19986 20066 824\nf 2409 12030 13249\nf 12030 824 20066\nf 13249 20066 3645\nf 877 13250 19580\nf 13250 4618 13257\nf 19580 13257 878\nf 2411 20067 16241\nf 20067 4618 20068\nf 16241 20068 2410\nf 4617 13245 13252\nf 13245 2410 20068\nf 13252 20068 4618\nf 998 20069 19990\nf 20069 3646 20070\nf 19990 20070 996\nf 3645 20065 13255\nf 20065 996 20070\nf 13255 20070 3646\nf 878 13256 19584\nf 13256 4619 13263\nf 19584 13263 879\nf 2412 20071 16242\nf 20071 4619 20072\nf 16242 20072 2411\nf 4618 20067 13258\nf 20067 2411 20072\nf 13258 20072 4619\nf 1000 20073 19996\nf 20073 3647 20074\nf 19996 20074 998\nf 3646 20069 13261\nf 20069 998 20074\nf 13261 20074 3647\nf 879 13262 19588\nf 13262 4620 13269\nf 19588 13269 880\nf 2413 20075 16243\nf 20075 4620 20076\nf 16243 20076 2412\nf 4619 20071 13264\nf 20071 2412 20076\nf 13264 20076 4620\nf 1002 20077 20003\nf 20077 3648 20078\nf 20003 20078 1000\nf 3647 20073 13267\nf 20073 1000 20078\nf 13267 20078 3648\nf 880 13268 19591\nf 13268 4621 13275\nf 19591 13275 881\nf 2414 20079 16244\nf 20079 4621 20080\nf 16244 20080 2413\nf 4620 20075 13270\nf 20075 2413 20080\nf 13270 20080 4621\nf 1004 20081 20009\nf 20081 3649 20082\nf 20009 20082 1002\nf 3648 20077 13273\nf 20077 1002 20082\nf 13273 20082 3649\nf 881 13274 19594\nf 13274 4622 13281\nf 19594 13281 882\nf 2415 20083 16245\nf 20083 4622 20084\nf 16245 20084 2414\nf 4621 20079 13276\nf 20079 2414 20084\nf 13276 20084 4622\nf 1006 20085 20014\nf 20085 3650 20086\nf 20014 20086 1004\nf 3649 20081 13279\nf 20081 1004 20086\nf 13279 20086 3650\nf 882 13280 19597\nf 13280 4623 13287\nf 19597 13287 883\nf 4622 20083 13282\nf 20083 2415 16246\nf 13282 16246 4623\nf 1008 20087 20020\nf 20087 3651 20088\nf 20020 20088 1006\nf 3650 20085 13285\nf 20085 1006 20088\nf 13285 20088 3651\nf 883 13286 19601\nf 13286 4624 20089\nf 19601 20089 884\nf 1010 20090 20026\nf 20090 3652 20091\nf 20026 20091 1008\nf 3651 20087 16247\nf 20087 1008 20091\nf 16247 20091 3652\nf 885 13292 13299\nf 13292 5318 20092\nf 13299 20092 4625\nf 1012 20093 20032\nf 20093 3653 20094\nf 20032 20094 1010\nf 3652 20090 13297\nf 20090 1010 20094\nf 13297 20094 3653\nf 885 13298 19607\nf 13298 4626 20095\nf 19607 20095 3518\nf 2416 20096 16249\nf 20096 4626 13300\nf 16249 13300 4625\nf 1014 20097 20038\nf 20097 3654 20098\nf 20038 20098 1012\nf 3653 20093 13303\nf 20093 1012 20098\nf 13303 20098 3654\nf 3518 20095 20099\nf 20095 4626 13305\nf 20099 13305 5316\nf 2417 20100 16250\nf 20100 4627 20101\nf 16250 20101 2416\nf 4626 20096 13306\nf 20096 2416 20101\nf 13306 20101 4627\nf 1016 20102 20045\nf 20102 3655 20103\nf 20045 20103 1014\nf 3654 20097 13309\nf 20097 1014 20103\nf 13309 20103 3655\nf 3519 13310 19613\nf 13310 4628 13318\nf 19613 13318 886\nf 2418 20104 16251\nf 20104 4628 20105\nf 16251 20105 2417\nf 4627 20100 13312\nf 20100 2417 20105\nf 13312 20105 4628\nf 1018 7976 20050\nf 7976 3656 20106\nf 20050 20106 1016\nf 3655 20102 13315\nf 20102 1016 20106\nf 13315 20106 3656\nf 4629 20107 13316\nf 20107 2419 20108\nf 13316 20108 887\nf 2419 20107 16253\nf 20107 4629 20109\nf 16253 20109 2418\nf 4628 20104 13319\nf 20104 2418 20109\nf 13319 20109 4629\nf 1020 16254 20056\nf 16254 3658 13322\nf 20056 13322 3657\nf 3657 7977 20054\nf 7977 1018 13213\nf 20054 13213 4613\nf 4630 7981 13323\nf 7981 2420 20110\nf 13323 20110 888\nf 4630 12402 13325\nf 12402 887 20108\nf 13325 20108 2419\nf 3659 16258 16255\nf 16258 2420 7980\nf 16255 7980 3658\nf 4503 12408 7787\nf 12408 4631 13331\nf 7787 13331 847\nf 4631 12410 13328\nf 12410 888 20110\nf 13328 20110 2420\nf 4632 20111 7983\nf 20111 2422 20112\nf 7983 20112 2423\nf 2422 20111 16259\nf 20111 4632 20113\nf 16259 20113 2421\nf 4631 13327 13332\nf 13327 2421 20113\nf 13332 20113 4632\nf 2422 20114 20112\nf 20114 4633 13336\nf 20112 13336 2423\nf 1025 20115 13236\nf 20115 4633 20116\nf 13236 20116 1023\nf 2422 13333 20114\nf 13333 1023 20116\nf 20114 20116 4633\nf 4634 20117 20118\nf 20117 2201 13337\nf 20118 13337 4633\nf 2408 13342 20062\nf 13342 4634 20119\nf 20062 20119 1025\nf 2424 13345 7991\nf 13345 849 13343\nf 7991 13343 2202\nf 4635 12024 20120\nf 12024 821 13478\nf 20120 13478 2425\nf 822 12025 19989\nf 12025 4635 13350\nf 19989 13350 997\nf 3661 16261 7993\nf 16261 4635 20120\nf 7993 20120 2425\nf 908 20121 19710\nf 20121 3661 12022\nf 19710 12022 820\nf 3661 20121 16262\nf 20121 908 20122\nf 16262 20122 2426\nf 3631 19993 20002\nf 19993 4636 20123\nf 20002 20123 999\nf 997 13349 19995\nf 13349 2426 13353\nf 19995 13353 4636\nf 910 20124 19716\nf 20124 3662 20125\nf 19716 20125 908\nf 2426 20122 13354\nf 20122 908 20125\nf 13354 20125 3662\nf 2427 20126 16263\nf 20126 999 20123\nf 16263 20123 4636\nf 912 20127 19722\nf 20127 3663 20128\nf 19722 20128 910\nf 3662 20124 13357\nf 20124 910 20128\nf 13357 20128 3663\nf 2428 20129 16264\nf 20129 1001 20130\nf 16264 20130 2427\nf 999 20126 20001\nf 20126 2427 20130\nf 20001 20130 1001\nf 914 20131 19728\nf 20131 3664 20132\nf 19728 20132 912\nf 3663 20127 13360\nf 20127 912 20132\nf 13360 20132 3664\nf 2429 20133 16265\nf 20133 1003 20134\nf 16265 20134 2428\nf 1001 20129 20008\nf 20129 2428 20134\nf 20008 20134 1003\nf 916 20135 19734\nf 20135 3665 20136\nf 19734 20136 914\nf 3664 20131 13363\nf 20131 914 20136\nf 13363 20136 3665\nf 1005 13364 20019\nf 13364 4637 13371\nf 20019 13371 1007\nf 2430 20137 16266\nf 20137 4637 20138\nf 16266 20138 2429\nf 1003 20133 13366\nf 20133 2429 20138\nf 13366 20138 4637\nf 918 20139 19740\nf 20139 3666 20140\nf 19740 20140 916\nf 3665 20135 13369\nf 20135 916 20140\nf 13369 20140 3666\nf 1007 13370 20025\nf 13370 4638 13377\nf 20025 13377 1009\nf 2431 20141 16267\nf 20141 4638 20142\nf 16267 20142 2430\nf 4637 20137 13372\nf 20137 2430 20142\nf 13372 20142 4638\nf 920 20143 19746\nf 20143 3667 20144\nf 19746 20144 918\nf 3666 20139 13375\nf 20139 918 20144\nf 13375 20144 3667\nf 1009 13376 20031\nf 13376 4639 13383\nf 20031 13383 1011\nf 2432 20145 16268\nf 20145 4639 20146\nf 16268 20146 2431\nf 4638 20141 13378\nf 20141 2431 20146\nf 13378 20146 4639\nf 922 20147 19753\nf 20147 3668 20148\nf 19753 20148 920\nf 3667 20143 13381\nf 20143 920 20148\nf 13381 20148 3668\nf 1011 13382 20037\nf 13382 4640 13389\nf 20037 13389 1013\nf 2433 20149 16269\nf 20149 4640 20150\nf 16269 20150 2432\nf 4639 20145 13384\nf 20145 2432 20150\nf 13384 20150 4640\nf 3668 20151 13387\nf 20151 924 20152\nf 13387 20152 3669\nf 924 20151 19766\nf 20151 3668 20147\nf 19766 20147 922\nf 1013 13388 20043\nf 13388 4641 13395\nf 20043 13395 1015\nf 2434 20153 16270\nf 20153 4641 20154\nf 16270 20154 2433\nf 4640 20149 13390\nf 20149 2433 20154\nf 13390 20154 4641\nf 3669 20155 13393\nf 20155 926 20156\nf 13393 20156 3670\nf 926 20155 19770\nf 20155 3669 20152\nf 19770 20152 924\nf 1015 13394 20048\nf 13394 4642 13401\nf 20048 13401 1017\nf 2435 20157 16271\nf 20157 4642 20158\nf 16271 20158 2434\nf 4641 20153 13396\nf 20153 2434 20158\nf 13396 20158 4642\nf 3670 20159 13399\nf 20159 3558 20160\nf 13399 20160 3671\nf 3558 20159 12596\nf 20159 3670 20156\nf 12596 20156 926\nf 1017 13400 20053\nf 13400 4643 20161\nf 20053 20161 1019\nf 2436 20162 16272\nf 20162 4643 20163\nf 16272 20163 2435\nf 4642 20157 13402\nf 20157 2435 20163\nf 13402 20163 4643\nf 3671 20164 13405\nf 20164 928 20165\nf 13405 20165 3672\nf 928 20164 7816\nf 20164 3671 20160\nf 7816 20160 3558\nf 2438 13412 13408\nf 13412 3642 20057\nf 13408 20057 1019\nf 2437 13406 16273\nf 13406 1019 20166\nf 16273 20166 2436\nf 4643 20162 20161\nf 20162 2436 20166\nf 20161 20166 1019\nf 2437 13409 13407\nf 13409 2439 13416\nf 13407 13416 2438\nf 930 20167 12607\nf 20167 3672 20165\nf 12607 20165 928\nf 3672 20167 13411\nf 20167 930 13417\nf 13411 13417 2439\nf 2440 13421 13415\nf 13421 1022 13413\nf 13415 13413 2438\nf 2439 13419 13414\nf 13419 3673 7995\nf 13414 7995 2440\nf 2442 20168 16275\nf 20168 4644 13436\nf 16275 13436 2443\nf 4644 20168 13429\nf 20168 2442 16274\nf 13429 16274 2441\nf 936 13432 19779\nf 13432 4644 13428\nf 19779 13428 934\nf 1026 13435 7987\nf 13435 3675 20169\nf 7987 20169 849\nf 2443 13437 16277\nf 13437 4645 13444\nf 16277 13444 2444\nf 937 13440 19782\nf 13440 4645 13430\nf 19782 13430 936\nf 849 20169 13344\nf 20169 3675 13443\nf 13344 13443 3486\nf 3675 16276 13441\nf 16276 2444 16278\nf 13441 16278 3676\nf 3486 13442 12124\nf 13442 3676 8001\nf 12124 8001 850\nf 2444 13445 16279\nf 13445 4646 13449\nf 16279 13449 2445\nf 939 13448 19783\nf 13448 4646 13438\nf 19783 13438 937\nf 2445 13450 8004\nf 13450 3677 8005\nf 8004 8005 2446\nf 1030 13462 16503\nf 13462 4647 13581\nf 16503 13581 1029\nf 1034 20170 20171\nf 20170 4648 14074\nf 20171 14074 1033\nf 4648 20170 13467\nf 20170 1034 20172\nf 13467 20172 3679\nf 3898 13479 14615\nf 13479 821 13348\nf 14615 13348 2172\nf 3746 13482 20173\nf 13482 818 8577\nf 20173 8577 1039\nf 3830 13487 8036\nf 13487 814 12015\nf 8036 12015 813\nf 4648 13493 14072\nf 13493 804 19507\nf 14072 19507 4460\nf 3678 16281 13499\nf 16281 2451 16282\nf 13499 16282 2459\nf 1034 20174 20172\nf 20174 1044 20175\nf 20172 20175 3679\nf 4649 13502 20176\nf 13502 3679 20175\nf 20176 20175 1044\nf 1045 13505 20177\nf 13505 4649 20176\nf 20177 20176 1044\nf 2662 20178 13521\nf 20178 2466 8071\nf 13521 8071 1048\nf 3681 13530 8083\nf 13530 2468 20179\nf 8083 20179 5319\nf 4650 8081 8064\nf 8081 1933 20180\nf 8064 20180 653\nf 3919 13561 8607\nf 13561 2480 8133\nf 8607 8133 1063\nf 703 13576 13574\nf 13576 4647 14820\nf 13574 14820 2724\nf 1073 13628 8232\nf 13628 3682 16284\nf 8232 16284 2493\nf 1078 13661 20182\nf 13661 5320 20181\nf 20182 20181 5808\nf 2493 13672 8227\nf 13672 3684 20183\nf 8227 20183 2506\nf 2506 20184 20185\nf 20184 3685 13679\nf 20185 13679 1079\nf 3685 20184 13676\nf 20184 2506 20183\nf 13676 20183 3684\nf 712 8163 20186\nf 8163 2504 13674\nf 20186 13674 716\nf 4651 13599 13691\nf 13599 2485 13695\nf 13691 13695 2510\nf 4652 13608 13697\nf 13608 1070 13692\nf 13697 13692 2510\nf 2510 13696 13698\nf 13696 2511 20187\nf 13698 20187 4653\nf 1081 20188 8290\nf 20188 4653 20187\nf 8290 20187 2511\nf 1071 13609 16285\nf 13609 4652 20189\nf 16285 20189 2509\nf 2509 20189 13700\nf 20189 4652 16286\nf 13700 16286 2513\nf 4653 20188 13702\nf 20188 1081 20190\nf 13702 20190 2512\nf 3687 13703 13705\nf 13703 2512 8287\nf 13705 8287 1082\nf 1080 13707 13683\nf 13707 4655 13715\nf 13683 13715 1079\nf 2513 13709 13701\nf 13709 4654 8224\nf 13701 8224 4655\nf 4654 13706 13710\nf 13706 1082 16303\nf 13710 16303 2514\nf 3688 13711 13713\nf 13711 2514 8283\nf 13713 8283 1083\nf 1079 13717 20185\nf 13717 3689 13720\nf 20185 13720 2506\nf 2515 13725 16287\nf 13725 4656 20191\nf 16287 20191 2516\nf 2516 20191 13728\nf 20191 4656 20192\nf 13728 20192 2517\nf 4656 13729 20192\nf 13729 4658 8234\nf 20192 8234 2517\nf 1073 8231 13733\nf 8231 2517 8233\nf 13733 8233 2518\nf 3702 20193 20194\nf 20193 4657 13726\nf 20194 13726 1084\nf 2519 13736 20196\nf 13736 1085 20195\nf 20196 20195 1086\nf 2519 20196 13737\nf 20196 1086 20197\nf 13737 20197 2521\nf 2521 20198 13738\nf 20198 1087 13744\nf 13738 13744 2522\nf 2522 13743 13739\nf 13743 4659 20199\nf 13739 20199 2523\nf 2523 20199 8248\nf 20199 4659 20200\nf 8248 20200 2524\nf 4660 13750 13746\nf 13750 2524 20200\nf 13746 20200 4659\nf 2497 8249 8253\nf 8249 2524 13749\nf 8253 13749 2525\nf 3697 20201 20202\nf 20201 4660 13745\nf 20202 13745 1088\nf 1036 20203 20204\nf 20203 4661 13760\nf 20204 13760 4662\nf 4661 13761 13758\nf 13761 2528 20205\nf 13758 20205 1090\nf 4661 20203 8022\nf 20203 1036 13757\nf 8022 13757 2176\nf 1077 13764 13655\nf 13764 3690 8262\nf 13655 8262 1035\nf 1090 20206 20207\nf 20206 4663 13768\nf 20207 13768 1091\nf 4663 20206 16288\nf 20206 1090 20205\nf 16288 20205 2528\nf 1078 13766 13664\nf 13766 3691 13763\nf 13664 13763 1077\nf 1091 13767 20209\nf 13767 4664 20208\nf 20209 20208 1092\nf 4664 20210 20208\nf 20210 4665 20211\nf 20208 20211 1092\nf 3694 13777 20212\nf 13777 3693 13770\nf 20212 13770 5808\nf 3711 20213 20215\nf 20213 4665 20214\nf 20215 20214 1093\nf 4666 20216 13774\nf 20216 1093 20214\nf 13774 20214 4665\nf 4664 16289 20210\nf 16289 2529 13772\nf 20210 13772 4665\nf 1093 20216 20217\nf 20216 4666 13779\nf 20217 13779 5809\nf 3695 16290 16291\nf 16290 4666 13773\nf 16291 13773 2529\nf 5809 13778 20219\nf 13778 2530 20218\nf 20219 20218 4667\nf 1089 8275 13754\nf 8275 3696 8273\nf 13754 8273 1076\nf 3695 16292 8272\nf 16292 3694 20220\nf 8272 20220 1076\nf 3713 20221 20222\nf 20221 4667 13784\nf 20222 13784 5321\nf 2531 20223 16294\nf 20223 4667 20218\nf 16294 20218 2530\nf 4667 20223 13785\nf 20223 2531 20224\nf 13785 20224 4668\nf 4660 20201 8277\nf 20201 3697 16295\nf 8277 16295 3696\nf 3697 20202 13788\nf 20202 1088 20225\nf 13788 20225 3698\nf 3714 13789 20227\nf 13789 4669 20226\nf 20227 20226 5322\nf 2532 20228 16296\nf 20228 4668 20224\nf 16296 20224 2531\nf 4668 20228 13791\nf 20228 2532 20229\nf 13791 20229 4669\nf 1087 20230 13741\nf 20230 3698 20225\nf 13741 20225 1088\nf 3699 20231 20233\nf 20231 1087 20232\nf 20233 20232 1086\nf 3715 13796 20234\nf 13796 4670 13802\nf 20234 13802 1094\nf 2533 20235 16297\nf 20235 4669 20229\nf 16297 20229 2532\nf 4669 20235 20237\nf 20235 2533 20236\nf 20237 20236 4670\nf 3699 20233 13800\nf 20233 1086 20238\nf 13800 20238 3700\nf 1094 13801 20240\nf 13801 4671 20239\nf 20240 20239 1095\nf 2534 20241 16298\nf 20241 4670 20236\nf 16298 20236 2533\nf 4670 20241 13803\nf 20241 2534 20242\nf 13803 20242 4671\nf 1085 20243 20195\nf 20243 3700 20238\nf 20195 20238 1086\nf 3700 20243 13806\nf 20243 1085 20244\nf 13806 20244 3701\nf 1095 20245 20246\nf 20245 4672 13813\nf 20246 13813 1096\nf 4672 20245 13809\nf 20245 1095 20239\nf 13809 20239 4671\nf 2535 13807 16299\nf 13807 4671 20242\nf 16299 20242 2534\nf 4657 20247 13732\nf 20247 3701 20244\nf 13732 20244 1085\nf 3701 20247 13812\nf 20247 4657 20193\nf 13812 20193 3702\nf 1096 13815 20248\nf 13815 3703 8278\nf 20248 8278 1097\nf 2536 13817 16300\nf 13817 4672 13808\nf 16300 13808 2535\nf 1083 13821 13722\nf 13821 3702 20194\nf 13722 20194 1084\nf 2537 13829 8284\nf 13829 3704 16302\nf 8284 16302 3705\nf 1081 13832 20190\nf 13832 2537 8288\nf 20190 8288 2512\nf 3706 13842 8289\nf 13842 2539 13834\nf 8289 13834 1081\nf 3722 20249 13942\nf 20249 4673 13849\nf 13942 13849 1100\nf 823 13852 13472\nf 13852 4674 13860\nf 13472 13860 3880\nf 3707 16304 13855\nf 16304 2544 8304\nf 13855 8304 826\nf 3881 20250 8570\nf 20250 4675 20251\nf 8570 20251 1101\nf 4676 13866 13858\nf 13866 1101 20251\nf 13858 20251 4675\nf 2545 20252 16306\nf 20252 4674 13853\nf 16306 13853 2544\nf 4674 20252 13861\nf 20252 2545 13856\nf 13861 13856 4675\nf 1090 8306 13759\nf 8306 3708 13864\nf 13759 13864 4662\nf 3708 16310 13862\nf 16310 2545 16305\nf 13862 16305 3707\nf 4662 13863 20204\nf 13863 3707 13854\nf 20204 13854 1036\nf 1101 13865 20253\nf 13865 4677 13872\nf 20253 13872 1102\nf 3708 8308 16309\nf 8308 3709 16307\nf 16309 16307 4676\nf 4676 16308 13867\nf 16308 2546 20254\nf 13867 20254 4677\nf 1091 20255 20207\nf 20255 3709 8307\nf 20207 8307 1090\nf 3709 20255 13870\nf 20255 1091 20256\nf 13870 20256 3710\nf 1102 13871 20257\nf 13871 4678 13878\nf 20257 13878 1103\nf 2547 20258 16311\nf 20258 4677 20254\nf 16311 20254 2546\nf 4677 20258 13873\nf 20258 2547 20259\nf 13873 20259 4678\nf 1092 20260 20209\nf 20260 3710 20256\nf 20209 20256 1091\nf 3710 20260 13876\nf 20260 1092 20261\nf 13876 20261 3711\nf 1103 13877 20262\nf 13877 4679 13884\nf 20262 13884 1104\nf 2548 20263 16312\nf 20263 4678 20259\nf 16312 20259 2547\nf 4678 20263 13879\nf 20263 2548 20264\nf 13879 20264 4679\nf 4665 20213 20211\nf 20213 3711 20261\nf 20211 20261 1092\nf 3711 20215 13882\nf 20215 1093 20265\nf 13882 20265 3712\nf 1104 13883 20266\nf 13883 4680 13890\nf 20266 13890 1105\nf 2549 20267 16313\nf 20267 4679 20264\nf 16313 20264 2548\nf 4679 20267 13885\nf 20267 2549 20268\nf 13885 20268 4680\nf 3713 13888 20270\nf 13888 3712 20269\nf 20270 20269 5809\nf 1105 13889 20271\nf 13889 4681 13896\nf 20271 13896 1106\nf 2550 20272 16315\nf 20272 4680 20268\nf 16315 20268 2549\nf 4680 20272 13891\nf 20272 2550 20273\nf 13891 20273 4681\nf 1106 13895 20274\nf 13895 4682 13901\nf 20274 13901 1107\nf 2551 20275 16317\nf 20275 4681 20273\nf 16317 20273 2550\nf 4681 20275 13897\nf 20275 2551 20276\nf 13897 20276 4682\nf 2552 20277 16319\nf 20277 4682 20276\nf 16319 20276 2551\nf 4682 20277 13902\nf 20277 2552 20278\nf 13902 20278 4683\nf 3715 20234 16320\nf 20234 1094 20279\nf 16320 20279 3716\nf 5323 20280 20281\nf 20280 5511 16321\nf 20281 16321 3716\nf 5511 20280 20283\nf 20280 5323 20282\nf 20283 20282 1108\nf 1095 20284 20240\nf 20284 3716 20279\nf 20240 20279 1094\nf 3716 20284 20286\nf 20284 1095 20285\nf 20286 20285 5512\nf 1109 20287 20288\nf 20287 5977 13906\nf 20288 13906 3891\nf 3716 20286 20281\nf 20286 5512 20289\nf 20281 20289 5323\nf 1096 13910 20246\nf 13910 5512 20285\nf 20246 20285 1095\nf 3891 13905 20290\nf 13905 4684 13912\nf 20290 13912 5325\nf 2554 20291 16324\nf 20291 4684 20292\nf 16324 20292 2553\nf 4684 20291 13913\nf 20291 2554 20293\nf 13913 20293 4685\nf 1097 8309 20248\nf 8309 3717 16325\nf 20248 16325 1096\nf 3892 13914 14791\nf 13914 4686 13917\nf 14791 13917 1110\nf 2555 20294 16328\nf 20294 4685 20293\nf 16328 20293 2554\nf 4685 20294 13916\nf 20294 2555 20295\nf 13916 20295 4686\nf 1098 8312 13823\nf 8312 3718 8310\nf 13823 8310 1097\nf 1110 13919 20296\nf 13919 4687 13925\nf 20296 13925 1111\nf 2556 13921 16330\nf 13921 4686 20295\nf 16330 20295 2555\nf 1099 20297 13827\nf 20297 3719 8313\nf 13827 8313 1098\nf 3719 20297 13924\nf 20297 1099 8315\nf 13924 8315 3720\nf 1111 13927 20298\nf 13927 4688 13933\nf 20298 13933 1112\nf 2557 13929 16332\nf 13929 4687 13920\nf 16332 13920 2556\nf 2540 13835 13838\nf 13835 3721 8316\nf 13838 8316 1099\nf 3721 13837 13932\nf 13837 4673 20249\nf 13932 20249 3722\nf 1112 13935 20299\nf 13935 3723 8145\nf 20299 8145 1068\nf 2558 13937 16333\nf 13937 4688 13928\nf 16333 13928 2557\nf 4689 13592 13944\nf 13592 2484 13939\nf 13944 13939 1100\nf 2658 13953 20300\nf 13953 3724 16334\nf 20300 16334 2559\nf 1114 13955 14554\nf 13955 4690 20301\nf 14554 20301 1117\nf 3725 20302 16336\nf 20302 4690 13954\nf 16336 13954 2559\nf 3724 8323 16335\nf 8323 1118 13958\nf 16335 13958 3725\nf 2560 13961 16337\nf 13961 4690 20302\nf 16337 20302 3725\nf 4743 20303 14483\nf 20303 3727 8331\nf 14483 8331 1120\nf 2560 13973 13970\nf 13973 2563 13975\nf 13970 13975 1121\nf 4690 13960 20301\nf 13960 1119 16472\nf 20301 16472 1117\nf 1122 20304 20305\nf 20304 3726 13956\nf 20305 13956 1118\nf 3726 20304 16339\nf 20304 1122 8335\nf 16339 8335 3729\nf 1121 13977 8514\nf 13977 4691 20306\nf 8514 20306 1123\nf 1123 20306 8511\nf 20306 4691 20307\nf 8511 20307 4692\nf 2564 20308 16342\nf 20308 4691 13976\nf 16342 13976 2563\nf 3737 20309 20310\nf 20309 3730 8336\nf 20310 8336 1122\nf 3730 20311 13980\nf 20311 1124 8338\nf 13980 8338 3731\nf 4692 20312 20313\nf 20312 2565 13982\nf 20313 13982 4693\nf 2565 20314 16344\nf 20314 4691 20308\nf 16344 20308 2564\nf 4691 20314 20307\nf 20314 2565 20312\nf 20307 20312 4692\nf 4693 20315 20313\nf 20315 1125 20316\nf 20313 20316 4692\nf 4693 13981 13988\nf 13981 2566 16346\nf 13988 16346 5513\nf 3738 20317 14029\nf 20317 3732 8339\nf 14029 8339 1124\nf 3732 20318 13986\nf 20318 1126 20319\nf 13986 20319 3733\nf 1127 13989 20321\nf 13989 5513 20320\nf 20321 20320 1128\nf 4695 20322 13991\nf 20322 1128 20320\nf 13991 20320 5513\nf 1129 20323 20324\nf 20323 3733 20319\nf 20324 20319 1126\nf 3733 20323 20326\nf 20323 1129 20325\nf 20326 20325 4694\nf 1130 20327 14510\nf 20327 4695 20328\nf 14510 20328 1131\nf 2567 13993 16348\nf 13993 1131 20328\nf 16348 20328 4695\nf 4695 20327 20322\nf 20327 1130 20329\nf 20322 20329 1128\nf 2567 13999 20330\nf 13999 4696 13998\nf 20330 13998 2569\nf 2569 16349 20330\nf 16349 2568 13994\nf 20330 13994 2567\nf 3740 20331 8348\nf 20331 4696 20332\nf 8348 20332 1129\nf 4694 20325 14001\nf 20325 1129 20332\nf 14001 20332 4696\nf 1116 14005 13950\nf 14005 3734 20333\nf 13950 20333 1113\nf 2570 14486 16350\nf 14486 4697 14007\nf 16350 14007 2571\nf 1133 20334 20336\nf 20334 4697 20335\nf 20336 20335 1132\nf 4697 20334 14008\nf 20334 1133 20337\nf 14008 20337 4698\nf 1113 20338 8325\nf 20338 3735 20339\nf 8325 20339 1118\nf 3735 20338 14011\nf 20338 1113 20333\nf 14011 20333 3734\nf 2571 14006 16351\nf 14006 4698 14013\nf 16351 14013 2572\nf 1134 20340 20341\nf 20340 4698 20337\nf 20341 20337 1133\nf 4698 20340 14014\nf 20340 1134 20342\nf 14014 20342 4699\nf 1118 20343 20305\nf 20343 3736 20344\nf 20305 20344 1122\nf 3736 20343 14017\nf 20343 1118 20339\nf 14017 20339 3735\nf 2572 14012 16352\nf 14012 4699 14019\nf 16352 14019 2573\nf 1135 20345 20346\nf 20345 4699 20342\nf 20346 20342 1134\nf 4699 20345 14020\nf 20345 1135 20347\nf 14020 20347 4700\nf 3730 20309 20311\nf 20309 3737 16354\nf 20311 16354 1124\nf 3737 20310 14023\nf 20310 1122 20344\nf 14023 20344 3736\nf 2573 14018 16355\nf 14018 4700 14025\nf 16355 14025 2574\nf 1136 20348 20349\nf 20348 4700 20347\nf 20349 20347 1135\nf 4700 20348 14026\nf 20348 1136 20350\nf 14026 20350 4701\nf 3732 20317 20318\nf 20317 3738 20351\nf 20318 20351 1126\nf 2574 14024 16356\nf 14024 4701 14031\nf 16356 14031 2575\nf 4702 14032 20352\nf 14032 4701 20350\nf 20352 20350 1136\nf 1126 20353 20324\nf 20353 3739 8346\nf 20324 8346 1129\nf 3739 20353 14035\nf 20353 1126 20351\nf 14035 20351 3738\nf 2575 14030 16359\nf 14030 4702 14037\nf 16359 14037 2576\nf 1043 20354 20355\nf 20354 3741 14038\nf 20355 14038 4702\nf 4696 20331 13996\nf 20331 3740 14040\nf 13996 14040 1042\nf 3741 14043 14036\nf 14043 2577 20356\nf 14036 20356 2576\nf 3740 16358 14041\nf 16358 2576 20356\nf 14041 20356 2577\nf 3484 14045 13489\nf 14045 3741 20354\nf 13489 20354 1043\nf 1132 20357 20336\nf 20357 2578 8352\nf 20336 8352 1133\nf 2578 14050 8353\nf 14050 4703 20358\nf 8353 20358 2579\nf 1046 14051 14498\nf 14051 4703 14493\nf 14498 14493 1137\nf 1133 8354 20341\nf 8354 2579 16361\nf 20341 16361 1134\nf 1134 16360 20359\nf 16360 4704 14055\nf 20359 14055 3742\nf 4704 16362 14053\nf 16362 2579 20358\nf 14053 20358 4703\nf 1045 20360 13510\nf 20360 4705 20361\nf 13510 20361 1046\nf 4704 14052 14056\nf 14052 1046 20361\nf 14056 20361 4705\nf 1134 20359 20346\nf 20359 3742 20362\nf 20346 20362 1135\nf 3742 14054 14060\nf 14054 4705 14058\nf 14060 14058 2580\nf 1044 20363 20177\nf 20363 4705 20360\nf 20177 20360 1045\nf 4705 20363 14059\nf 20363 1044 20364\nf 14059 20364 4706\nf 1135 20365 20349\nf 20365 3743 20366\nf 20349 20366 1136\nf 3743 20365 14062\nf 20365 1135 20362\nf 14062 20362 3742\nf 2580 14057 16363\nf 14057 4706 14064\nf 16363 14064 2581\nf 1034 20367 20174\nf 20367 4706 20364\nf 20174 20364 1044\nf 4706 20367 14065\nf 20367 1034 20368\nf 14065 20368 4707\nf 1136 20369 20352\nf 20369 3744 20370\nf 20352 20370 4702\nf 3744 20369 14068\nf 20369 1136 20366\nf 14068 20366 3743\nf 2581 14063 16365\nf 14063 4707 14070\nf 16365 14070 3745\nf 1033 14071 20171\nf 14071 4707 20368\nf 20171 20368 1034\nf 4702 20370 20355\nf 20370 3744 20371\nf 20355 20371 1043\nf 3745 14075 16364\nf 14075 1043 20371\nf 16364 20371 3744\nf 2273 14077 8355\nf 14077 3745 14069\nf 8355 14069 1033\nf 4460 12007 14073\nf 12007 2168 8356\nf 14073 8356 1033\nf 3548 14078 7815\nf 14078 2582 14080\nf 7815 14080 1040\nf 4708 14295 14082\nf 14295 2455 12791\nf 14082 12791 1040\nf 1139 20372 20373\nf 20372 3746 20173\nf 20373 20173 1039\nf 3746 20372 14087\nf 20372 1139 20374\nf 14087 20374 3747\nf 3800 14090 20376\nf 14090 4709 20375\nf 20376 20375 4710\nf 3747 20377 14085\nf 20377 4709 20378\nf 14085 20378 2583\nf 1138 14088 14092\nf 14088 2583 20378\nf 14092 20378 4709\nf 1140 20379 20380\nf 20379 3747 20374\nf 20380 20374 1139\nf 3747 20379 16366\nf 20379 1140 20381\nf 16366 20381 3748\nf 3800 20376 20382\nf 20376 4710 14097\nf 20382 14097 1141\nf 2584 20383 16367\nf 20383 4709 20377\nf 16367 20377 3747\nf 4709 20383 20375\nf 20383 2584 20384\nf 20375 20384 4710\nf 1142 20385 20386\nf 20385 3748 20381\nf 20386 20381 1140\nf 3748 20385 14095\nf 20385 1142 20387\nf 14095 20387 3749\nf 1141 14096 20388\nf 14096 4711 14103\nf 20388 14103 1143\nf 2585 20389 16368\nf 20389 4710 20384\nf 16368 20384 2584\nf 4710 20389 14098\nf 20389 2585 20390\nf 14098 20390 4711\nf 1144 20391 20392\nf 20391 3749 20387\nf 20392 20387 1142\nf 3749 20391 14101\nf 20391 1144 20393\nf 14101 20393 3750\nf 1143 14102 20394\nf 14102 4712 14109\nf 20394 14109 1145\nf 2586 20395 16369\nf 20395 4711 20390\nf 16369 20390 2585\nf 4711 20395 14104\nf 20395 2586 20396\nf 14104 20396 4712\nf 1146 20397 20398\nf 20397 3750 20393\nf 20398 20393 1144\nf 3750 20397 14107\nf 20397 1146 20399\nf 14107 20399 3751\nf 1145 14108 20400\nf 14108 4713 14115\nf 20400 14115 1147\nf 2587 20401 16370\nf 20401 4712 20396\nf 16370 20396 2586\nf 4712 20401 14110\nf 20401 2587 20402\nf 14110 20402 4713\nf 1148 20403 20404\nf 20403 3751 20399\nf 20404 20399 1146\nf 3751 20403 14113\nf 20403 1148 20405\nf 14113 20405 3752\nf 1147 14114 20406\nf 14114 4714 14121\nf 20406 14121 1149\nf 2588 20407 16371\nf 20407 4713 20402\nf 16371 20402 2587\nf 4713 20407 14116\nf 20407 2588 20408\nf 14116 20408 4714\nf 1150 20409 20410\nf 20409 3752 20405\nf 20410 20405 1148\nf 3752 20409 14119\nf 20409 1150 20411\nf 14119 20411 3753\nf 1149 14120 20412\nf 14120 4715 14127\nf 20412 14127 1151\nf 2589 20413 16372\nf 20413 4714 20408\nf 16372 20408 2588\nf 4714 20413 14122\nf 20413 2589 20414\nf 14122 20414 4715\nf 1152 20415 20416\nf 20415 3753 20411\nf 20416 20411 1150\nf 3753 20415 14125\nf 20415 1152 20417\nf 14125 20417 3754\nf 1151 14126 20418\nf 14126 4716 14133\nf 20418 14133 1153\nf 2590 20419 16373\nf 20419 4715 20414\nf 16373 20414 2589\nf 4715 20419 14128\nf 20419 2590 20420\nf 14128 20420 4716\nf 1154 20421 20422\nf 20421 3754 20417\nf 20422 20417 1152\nf 3754 20421 14131\nf 20421 1154 20423\nf 14131 20423 3755\nf 1153 14132 20424\nf 14132 4717 14139\nf 20424 14139 1155\nf 2591 20425 16374\nf 20425 4716 20420\nf 16374 20420 2590\nf 4716 20425 14134\nf 20425 2591 20426\nf 14134 20426 4717\nf 1156 20427 20428\nf 20427 3755 20423\nf 20428 20423 1154\nf 3755 20427 14137\nf 20427 1156 20429\nf 14137 20429 3756\nf 1155 14138 14351\nf 14138 4718 14144\nf 14351 14144 1157\nf 4718 14140 16375\nf 14140 4717 20426\nf 16375 20426 2591\nf 1158 20430 20431\nf 20430 3756 20429\nf 20431 20429 1156\nf 3756 20430 14143\nf 20430 1158 14147\nf 14143 14147 2592\nf 2592 8361 14141\nf 8361 2593 14145\nf 14141 14145 4718\nf 2595 20432 20433\nf 20432 3757 14149\nf 20433 14149 2594\nf 3757 16377 14150\nf 16377 1159 8360\nf 14150 8360 2593\nf 2594 14153 20433\nf 14153 3758 8364\nf 20433 8364 2595\nf 2596 20434 20436\nf 20434 3760 20435\nf 20436 20435 2595\nf 3757 20432 14158\nf 20432 2595 20435\nf 14158 20435 3760\nf 2595 8366 20436\nf 8366 3759 16382\nf 20436 16382 2596\nf 3760 20434 14161\nf 20434 2596 20437\nf 14161 20437 3761\nf 3762 8371 14162\nf 8371 2597 20438\nf 14162 20438 2596\nf 3761 20437 8369\nf 20437 2596 20438\nf 8369 20438 2597\nf 1165 8367 16386\nf 8367 2597 20439\nf 16386 20439 3763\nf 2597 8370 20439\nf 8370 3764 20440\nf 20439 20440 3763\nf 2598 16388 20441\nf 16388 3765 14168\nf 20441 14168 3763\nf 3764 8376 20440\nf 8376 2598 20441\nf 20440 20441 3763\nf 3768 8379 14173\nf 8379 2599 14170\nf 14173 14170 3766\nf 3767 16389 16392\nf 16389 2598 14171\nf 16392 14171 2599\nf 3771 14181 14176\nf 14181 2600 20442\nf 14176 20442 3769\nf 3770 14174 20443\nf 14174 3769 20442\nf 20443 20442 2600\nf 3770 20444 16444\nf 20444 1171 16445\nf 16444 16445 5324\nf 2170 19789 14182\nf 19789 2457 20445\nf 14182 20445 1041\nf 1172 20446 20447\nf 20446 3773 13486\nf 20447 13486 4729\nf 1041 20448 20449\nf 20448 4719 14187\nf 20449 14187 1173\nf 2602 20450 16397\nf 20450 1041 20445\nf 16397 20445 2457\nf 1041 20450 20448\nf 20450 2602 20451\nf 20448 20451 4719\nf 3774 14185 20452\nf 14185 3773 20446\nf 20452 20446 1172\nf 1173 14186 20453\nf 14186 4720 14193\nf 20453 14193 1174\nf 2603 20454 16398\nf 20454 4719 20451\nf 16398 20451 2602\nf 4719 20454 14188\nf 20454 2603 20455\nf 14188 20455 4720\nf 3774 20456 14191\nf 20456 1175 20457\nf 14191 20457 3775\nf 1174 14192 20458\nf 14192 4721 14199\nf 20458 14199 1176\nf 2604 20459 16399\nf 20459 4720 20455\nf 16399 20455 2603\nf 4720 20459 14194\nf 20459 2604 20460\nf 14194 20460 4721\nf 1177 20461 20462\nf 20461 3775 20457\nf 20462 20457 1175\nf 3775 20461 14197\nf 20461 1177 20463\nf 14197 20463 3776\nf 1176 14198 20464\nf 14198 4722 14205\nf 20464 14205 1178\nf 2605 20465 16400\nf 20465 4721 20460\nf 16400 20460 2604\nf 4721 20465 14200\nf 20465 2605 20466\nf 14200 20466 4722\nf 1179 20467 20468\nf 20467 3776 20463\nf 20468 20463 1177\nf 3776 20467 14203\nf 20467 1179 20469\nf 14203 20469 3777\nf 1178 14204 20470\nf 14204 4723 14211\nf 20470 14211 1180\nf 2606 20471 16401\nf 20471 4722 20466\nf 16401 20466 2605\nf 4722 20471 14206\nf 20471 2606 20472\nf 14206 20472 4723\nf 1181 20473 20474\nf 20473 3777 20469\nf 20474 20469 1179\nf 3777 20473 14209\nf 20473 1181 20475\nf 14209 20475 3778\nf 1180 14210 20476\nf 14210 4724 14217\nf 20476 14217 1182\nf 2607 20477 16402\nf 20477 4723 20472\nf 16402 20472 2606\nf 4723 20477 14212\nf 20477 2607 20478\nf 14212 20478 4724\nf 1183 20479 20480\nf 20479 3778 20475\nf 20480 20475 1181\nf 3778 20479 14215\nf 20479 1183 20481\nf 14215 20481 3779\nf 2608 20482 16404\nf 20482 4724 20478\nf 16404 20478 2607\nf 4724 20482 14218\nf 20482 2608 20483\nf 14218 20483 4725\nf 1184 20484 20485\nf 20484 3779 20481\nf 20485 20481 1183\nf 3779 20484 16403\nf 20484 1184 20486\nf 16403 20486 2608\nf 1185 14219 8394\nf 14219 4725 20487\nf 8394 20487 4726\nf 4725 20483 20487\nf 20483 2608 20488\nf 20487 20488 4726\nf 1186 16405 20489\nf 16405 2608 20486\nf 20489 20486 1184\nf 4726 20490 20492\nf 20490 2609 20491\nf 20492 20491 4727\nf 4726 20488 20490\nf 20488 2608 16406\nf 20490 16406 2609\nf 4727 14224 20492\nf 14224 1187 8395\nf 20492 8395 4726\nf 4727 16408 14225\nf 16408 4728 20493\nf 14225 20493 3780\nf 1188 16407 14221\nf 16407 4727 20491\nf 14221 20491 2609\nf 2610 20494 14230\nf 20494 1191 16470\nf 14230 16470 1189\nf 3781 20495 14234\nf 20495 2610 20496\nf 14234 20496 4728\nf 3780 20493 14232\nf 20493 4728 20496\nf 14232 20496 2610\nf 2611 20497 20498\nf 20497 1191 20494\nf 20498 20494 2610\nf 3782 20499 14237\nf 20499 2611 20500\nf 14237 20500 3781\nf 2610 20495 20498\nf 20495 3781 20500\nf 20498 20500 2611\nf 2612 20501 20503\nf 20501 3783 20502\nf 20503 20502 2611\nf 1191 20497 14241\nf 20497 2611 20502\nf 14241 20502 3783\nf 3784 20504 14243\nf 20504 2612 20505\nf 14243 20505 3782\nf 2611 20499 20503\nf 20499 3782 20505\nf 20503 20505 2612\nf 2613 20506 20508\nf 20506 3785 20507\nf 20508 20507 2612\nf 3783 20501 14247\nf 20501 2612 20507\nf 14247 20507 3785\nf 3786 20509 14249\nf 20509 2613 20510\nf 14249 20510 3784\nf 2612 20504 20508\nf 20504 3784 20510\nf 20508 20510 2613\nf 2614 20511 20513\nf 20511 3787 20512\nf 20513 20512 2613\nf 3785 20506 14253\nf 20506 2613 20512\nf 14253 20512 3787\nf 2613 20509 20513\nf 20509 3786 14255\nf 20513 14255 2614\nf 3789 20514 14261\nf 20514 3788 20515\nf 14261 20515 2614\nf 3787 20511 14259\nf 20511 2614 20515\nf 14259 20515 3788\nf 3789 20516 20514\nf 20516 2615 14265\nf 20514 14265 3788\nf 2615 20517 20518\nf 20517 2617 16423\nf 20518 16423 3790\nf 1201 14263 16421\nf 14263 2615 20518\nf 16421 20518 3790\nf 2615 20516 20519\nf 20516 3789 14267\nf 20519 14267 2616\nf 2616 8399 20519\nf 8399 2617 20517\nf 20519 20517 2615\nf 3792 8403 16422\nf 8403 1205 8398\nf 16422 8398 3790\nf 3791 8405 8401\nf 8405 2618 14273\nf 8401 14273 2617\nf 3794 8409 16424\nf 8409 1207 8404\nf 16424 8404 3792\nf 3793 8411 8407\nf 8411 2619 14277\nf 8407 14277 2618\nf 3796 8415 16427\nf 8415 1209 8410\nf 16427 8410 3794\nf 3795 8417 8413\nf 8417 2620 14281\nf 8413 14281 2619\nf 3797 8421 16429\nf 8421 1211 8416\nf 16429 8416 3796\nf 3798 8426 16430\nf 8426 1212 8422\nf 16430 8422 3797\nf 4729 14297 20521\nf 14297 2624 20520\nf 20521 20520 2625\nf 2624 20522 20520\nf 20522 3799 16431\nf 20520 16431 2625\nf 3799 20522 14300\nf 20522 2624 20523\nf 14300 20523 4730\nf 4730 20523 14293\nf 20523 2624 8437\nf 14293 8437 2171\nf 1172 20524 20525\nf 20524 4731 14307\nf 20525 14307 1175\nf 4731 20524 20527\nf 20524 1172 20526\nf 20527 20526 2625\nf 2625 20526 20521\nf 20526 1172 20447\nf 20521 20447 4729\nf 3799 14299 14303\nf 14299 1138 14091\nf 14303 14091 3800\nf 3774 20452 20456\nf 20452 1172 20525\nf 20456 20525 1175\nf 2626 20528 16432\nf 20528 4731 20527\nf 16432 20527 2625\nf 3800 20382 14305\nf 20382 1141 20529\nf 14305 20529 3801\nf 1175 14306 20462\nf 14306 4732 14313\nf 20462 14313 1177\nf 2627 20530 16433\nf 20530 4731 20528\nf 16433 20528 2626\nf 4731 20530 14308\nf 20530 2627 20531\nf 14308 20531 4732\nf 1143 20532 20388\nf 20532 3801 20529\nf 20388 20529 1141\nf 3801 20532 14311\nf 20532 1143 20533\nf 14311 20533 3802\nf 1177 14312 20468\nf 14312 4733 14319\nf 20468 14319 1179\nf 2628 20534 16434\nf 20534 4732 20531\nf 16434 20531 2627\nf 4732 20534 14314\nf 20534 2628 20535\nf 14314 20535 4733\nf 1145 20536 20394\nf 20536 3802 20533\nf 20394 20533 1143\nf 3802 20536 14317\nf 20536 1145 20537\nf 14317 20537 3803\nf 1179 14318 20474\nf 14318 4734 14325\nf 20474 14325 1181\nf 2629 20538 16435\nf 20538 4733 20535\nf 16435 20535 2628\nf 4733 20538 14320\nf 20538 2629 20539\nf 14320 20539 4734\nf 1147 20540 20400\nf 20540 3803 20537\nf 20400 20537 1145\nf 3803 20540 14323\nf 20540 1147 20541\nf 14323 20541 3804\nf 1181 14324 20480\nf 14324 4735 14331\nf 20480 14331 1183\nf 2630 20542 16436\nf 20542 4734 20539\nf 16436 20539 2629\nf 4734 20542 14326\nf 20542 2630 20543\nf 14326 20543 4735\nf 1149 20544 20406\nf 20544 3804 20541\nf 20406 20541 1147\nf 3804 20544 14329\nf 20544 1149 20545\nf 14329 20545 3805\nf 1183 14330 20485\nf 14330 4736 14337\nf 20485 14337 1184\nf 2631 20546 16437\nf 20546 4735 20543\nf 16437 20543 2630\nf 4735 20546 14332\nf 20546 2631 20547\nf 14332 20547 4736\nf 1151 20548 20412\nf 20548 3805 20545\nf 20412 20545 1149\nf 3805 20548 14335\nf 20548 1151 20549\nf 14335 20549 3806\nf 1184 14336 20489\nf 14336 4737 14343\nf 20489 14343 1186\nf 2632 20550 16438\nf 20550 4736 20547\nf 16438 20547 2631\nf 4736 20550 14338\nf 20550 2632 20551\nf 14338 20551 4737\nf 1153 20552 20418\nf 20552 3806 20549\nf 20418 20549 1151\nf 3806 20552 14341\nf 20552 1153 20553\nf 14341 20553 3807\nf 1186 14342 14223\nf 14342 2635 14348\nf 14223 14348 1188\nf 2633 20554 16439\nf 20554 4737 20551\nf 16439 20551 2632\nf 4737 20554 14344\nf 20554 2633 20555\nf 14344 20555 2635\nf 1155 20556 20424\nf 20556 3807 20553\nf 20424 20553 1153\nf 3807 20556 14346\nf 20556 1155 14350\nf 14346 14350 2634\nf 2633 8439 20555\nf 8439 5820 20557\nf 20555 20557 2635\nf 5820 20558 20557\nf 20558 1190 14347\nf 20557 14347 2635\nf 2636 20559 20560\nf 20559 5514 14353\nf 20560 14353 4738\nf 2637 20561 20562\nf 20561 3808 14357\nf 20562 14357 2636\nf 3809 20563 14359\nf 20563 2637 20564\nf 14359 20564 4738\nf 2636 20560 20562\nf 20560 4738 20564\nf 20562 20564 2637\nf 2638 20565 20567\nf 20565 3810 20566\nf 20567 20566 2637\nf 3808 20561 14363\nf 20561 2637 20566\nf 14363 20566 3810\nf 3811 20568 14365\nf 20568 2638 20569\nf 14365 20569 3809\nf 2637 20563 20567\nf 20563 3809 20569\nf 20567 20569 2638\nf 2639 20570 20572\nf 20570 3812 20571\nf 20572 20571 2638\nf 3810 20565 14369\nf 20565 2638 20571\nf 14369 20571 3812\nf 2638 20568 20572\nf 20568 3811 14372\nf 20572 14372 2639\nf 2640 20573 20575\nf 20573 3813 20574\nf 20575 20574 2639\nf 3812 20570 14375\nf 20570 2639 20574\nf 14375 20574 3813\nf 3814 20576 8374\nf 20576 2640 20577\nf 8374 20577 5835\nf 3813 20573 14379\nf 20573 2640 20578\nf 14379 20578 3815\nf 3816 20579 20580\nf 20579 3815 20578\nf 20580 20578 2640\nf 2640 20576 20580\nf 20576 3814 20581\nf 20580 20581 3816\nf 3816 20582 20579\nf 20582 2641 14384\nf 20579 14384 3815\nf 3818 8449 14387\nf 8449 1204 8444\nf 14387 8444 2641\nf 2641 20583 14385\nf 20583 3817 8451\nf 14385 8451 2642\nf 3820 8455 16446\nf 8455 1206 8450\nf 16446 8450 3818\nf 2642 8453 14392\nf 8453 3819 14394\nf 14392 14394 3821\nf 3822 16426 16447\nf 16426 1208 8456\nf 16447 8456 3820\nf 3823 16449 16448\nf 16449 1210 16425\nf 16448 16425 3822\nf 2648 14418 14419\nf 14418 4739 14414\nf 14419 14414 2647\nf 1218 14437 16484\nf 14437 1220 16479\nf 16484 16479 3856\nf 3825 8487 14421\nf 8487 2650 14424\nf 14421 14424 2651\nf 4740 14446 14434\nf 14446 3852 20584\nf 14434 20584 1220\nf 2649 14432 8486\nf 14432 2653 14436\nf 8486 14436 2650\nf 2656 14461 14443\nf 14461 1222 14582\nf 14443 14582 1223\nf 2656 14445 14442\nf 14445 4740 14428\nf 14442 14428 2652\nf 1115 20585 13947\nf 20585 2658 20300\nf 13947 20300 2559\nf 2658 20585 14448\nf 20585 1115 16473\nf 14448 16473 1224\nf 2658 14450 16450\nf 14450 4741 14454\nf 16450 14454 2659\nf 2659 14456 14457\nf 14456 2660 16452\nf 14457 16452 3827\nf 2660 14462 16453\nf 14462 2656 14441\nf 16453 14441 2655\nf 1225 16475 14451\nf 16475 1222 14459\nf 14451 14459 4741\nf 1051 14464 8492\nf 14464 3828 20586\nf 8492 20586 2654\nf 2654 20586 14427\nf 20586 3828 20587\nf 14427 20587 1219\nf 2663 14470 14469\nf 14470 1219 20587\nf 14469 20587 3828\nf 2662 13520 14468\nf 13520 4742 20588\nf 14468 20588 2663\nf 2466 20178 8070\nf 20178 2662 14465\nf 8070 14465 1050\nf 1219 14472 8495\nf 14472 3829 20589\nf 8495 20589 2657\nf 2663 20588 16454\nf 20588 4742 14477\nf 16454 14477 2664\nf 2657 20589 14439\nf 20589 3829 20590\nf 14439 20590 1221\nf 2665 14479 14475\nf 14479 1221 20590\nf 14475 20590 3829\nf 2664 14476 14474\nf 14476 4743 20591\nf 14474 20591 2665\nf 1049 20592 20593\nf 20592 4743 14478\nf 20593 14478 4742\nf 4742 13522 20593\nf 13522 1048 8061\nf 20593 8061 1049\nf 2665 20591 8508\nf 20591 4743 14482\nf 8508 14482 2666\nf 3727 20303 13963\nf 20303 4743 20592\nf 13963 20592 1049\nf 2667 20594 16457\nf 20594 4744 14487\nf 16457 14487 2570\nf 4744 20594 14485\nf 20594 2667 8509\nf 14485 8509 2666\nf 1132 20595 20596\nf 20595 4744 14484\nf 20596 14484 1120\nf 4744 20595 14488\nf 20595 1132 20335\nf 14488 20335 4697\nf 2578 20357 14490\nf 20357 1132 20597\nf 14490 20597 3728\nf 1120 8333 20596\nf 8333 3728 20597\nf 20596 20597 1132\nf 2562 14492 14489\nf 14492 4745 14048\nf 14489 14048 2578\nf 1137 14494 14496\nf 14494 4745 13968\nf 14496 13968 1047\nf 2568 8341 13995\nf 8341 4746 14507\nf 13995 14507 1131\nf 3830 8038 20598\nf 8038 1041 20449\nf 20598 20449 1173\nf 2669 20599 16460\nf 20599 4746 14503\nf 16460 14503 2668\nf 1173 20600 20598\nf 20600 3831 16458\nf 20598 16458 3830\nf 4746 20599 14508\nf 20599 2669 20601\nf 14508 20601 4747\nf 1174 20602 20453\nf 20602 3831 20600\nf 20453 20600 1173\nf 3831 20602 14513\nf 20602 1174 20603\nf 14513 20603 3832\nf 1130 14514 20329\nf 14514 4748 14520\nf 20329 14520 1128\nf 2670 20604 16461\nf 20604 4747 20601\nf 16461 20601 2669\nf 4747 20604 14515\nf 20604 2670 20605\nf 14515 20605 4748\nf 1176 20606 20458\nf 20606 3832 20603\nf 20458 20603 1174\nf 3832 20606 14518\nf 20606 1176 20607\nf 14518 20607 3833\nf 1128 14519 20321\nf 14519 4749 20608\nf 20321 20608 1127\nf 2671 20609 16462\nf 20609 4748 20605\nf 16462 20605 2670\nf 4748 20609 14521\nf 20609 2671 20610\nf 14521 20610 4749\nf 1178 20611 20464\nf 20611 3833 20607\nf 20464 20607 1176\nf 3833 20611 14524\nf 20611 1178 20612\nf 14524 20612 3834\nf 1127 20608 20613\nf 20608 4749 14529\nf 20613 14529 1125\nf 2672 14530 16463\nf 14530 4749 20610\nf 16463 20610 2671\nf 1180 20614 20470\nf 20614 3834 20612\nf 20470 20612 1178\nf 3834 20614 14527\nf 20614 1180 20615\nf 14527 20615 3835\nf 4750 14535 16464\nf 14535 1125 14528\nf 16464 14528 2672\nf 1182 14533 20476\nf 14533 3835 20615\nf 20476 20615 1180\nf 1125 14534 20316\nf 14534 4751 8512\nf 20316 8512 4692\nf 4750 16466 14536\nf 16466 2673 20616\nf 14536 20616 4751\nf 2673 16465 20617\nf 16465 1182 14538\nf 20617 14538 3836\nf 4751 20616 20619\nf 20616 2673 20618\nf 20619 20618 4752\nf 2673 20617 20618\nf 20617 3836 20620\nf 20618 20620 4752\nf 4752 16468 20619\nf 16468 1123 8513\nf 20619 8513 4751\nf 3836 20621 20620\nf 20621 2674 20622\nf 20620 20622 4752\nf 2674 20623 20622\nf 20623 3837 16469\nf 20622 16469 4752\nf 3838 20624 14542\nf 20624 2674 20625\nf 14542 20625 4753\nf 2674 20621 20625\nf 20621 3836 16467\nf 20625 16467 4753\nf 2675 20626 20628\nf 20626 3839 20627\nf 20628 20627 2674\nf 3837 20623 14546\nf 20623 2674 20627\nf 14546 20627 3839\nf 3840 20629 14548\nf 20629 2675 20630\nf 14548 20630 3838\nf 2674 20624 20628\nf 20624 3838 20630\nf 20628 20630 2675\nf 2676 20631 20633\nf 20631 1117 20632\nf 20633 20632 2675\nf 3839 20626 16471\nf 20626 2675 20632\nf 16471 20632 1117\nf 3841 20634 14551\nf 20634 2676 20635\nf 14551 20635 3840\nf 2675 20629 20633\nf 20629 3840 20635\nf 20633 20635 2676\nf 2677 20636 20638\nf 20636 3842 20637\nf 20638 20637 2676\nf 1117 20631 14555\nf 20631 2676 20637\nf 14555 20637 3842\nf 3843 20639 14557\nf 20639 2677 20640\nf 14557 20640 3841\nf 2676 20634 20638\nf 20634 3841 20640\nf 20638 20640 2677\nf 2678 20641 20643\nf 20641 3844 20642\nf 20643 20642 2677\nf 3842 20636 14561\nf 20636 2677 20642\nf 14561 20642 3844\nf 3845 20644 14563\nf 20644 2678 20645\nf 14563 20645 3843\nf 2677 20639 20643\nf 20639 3843 20645\nf 20643 20645 2678\nf 2679 20646 20648\nf 20646 3846 20647\nf 20648 20647 2678\nf 3844 20641 14567\nf 20641 2678 20647\nf 14567 20647 3846\nf 3847 20649 14569\nf 20649 2679 20650\nf 14569 20650 3845\nf 2678 20644 20648\nf 20644 3845 20650\nf 20648 20650 2679\nf 2680 20651 20653\nf 20651 3848 20652\nf 20653 20652 2679\nf 3846 20646 14573\nf 20646 2679 20652\nf 14573 20652 3848\nf 2679 20649 20653\nf 20649 3847 14576\nf 20653 14576 2680\nf 2681 20654 14580\nf 20654 3849 20655\nf 14580 20655 2680\nf 3848 20651 14578\nf 20651 2680 20655\nf 14578 20655 3849\nf 3849 20654 16476\nf 20654 2681 8517\nf 16476 8517 3850\nf 2682 8520 20657\nf 8520 2683 20656\nf 20657 20656 3850\nf 3851 14589 8519\nf 14589 2682 20657\nf 8519 20657 3850\nf 2683 16478 20656\nf 16478 3852 14587\nf 20656 14587 3850\nf 3854 16480 16477\nf 16480 1220 20584\nf 16477 20584 3852\nf 3853 8523 8522\nf 8523 2684 14595\nf 8522 14595 2683\nf 2685 16483 20659\nf 16483 3856 20658\nf 20659 20658 2684\nf 3854 14593 16481\nf 14593 2684 20658\nf 16481 20658 3856\nf 3855 8526 8525\nf 8526 2685 20659\nf 8525 20659 2684\nf 3857 8532 8528\nf 8532 2686 14602\nf 8528 14602 2685\nf 2687 20660 20662\nf 20660 3860 20661\nf 20662 20661 2686\nf 3858 14600 14606\nf 14600 2686 20661\nf 14606 20661 3860\nf 2686 8534 20662\nf 8534 3859 14610\nf 20662 14610 2687\nf 2687 20663 20660\nf 20663 3861 14608\nf 20660 14608 3860\nf 3861 20663 16486\nf 20663 2687 14609\nf 16486 14609 2688\nf 3899 8579 20664\nf 8579 1038 14616\nf 20664 14616 2691\nf 1226 20665 20666\nf 20665 3862 13476\nf 20666 13476 1037\nf 3862 20665 14620\nf 20665 1226 20667\nf 14620 20667 3863\nf 3899 20668 20669\nf 20668 4755 14622\nf 20669 14622 1227\nf 2691 20670 20664\nf 20670 4755 20668\nf 20664 20668 3899\nf 4755 20670 20671\nf 20670 2691 14618\nf 20671 14618 3863\nf 1228 20672 20673\nf 20672 3863 20667\nf 20673 20667 1226\nf 3863 20672 16488\nf 20672 1228 20674\nf 16488 20674 3864\nf 1227 14621 20675\nf 14621 4756 14628\nf 20675 14628 1229\nf 2692 20676 16489\nf 20676 4755 20671\nf 16489 20671 3863\nf 4755 20676 14623\nf 20676 2692 20677\nf 14623 20677 4756\nf 1230 20678 20679\nf 20678 3864 20674\nf 20679 20674 1228\nf 3864 20678 14626\nf 20678 1230 20680\nf 14626 20680 3865\nf 1229 14627 20681\nf 14627 4757 14634\nf 20681 14634 1231\nf 2693 20682 16490\nf 20682 4756 20677\nf 16490 20677 2692\nf 4756 20682 14629\nf 20682 2693 20683\nf 14629 20683 4757\nf 1232 20684 20685\nf 20684 3865 20680\nf 20685 20680 1230\nf 3865 20684 14632\nf 20684 1232 20686\nf 14632 20686 3866\nf 1231 14633 20687\nf 14633 4758 14640\nf 20687 14640 1233\nf 2694 20688 16491\nf 20688 4757 20683\nf 16491 20683 2693\nf 4757 20688 14635\nf 20688 2694 20689\nf 14635 20689 4758\nf 1234 20690 20691\nf 20690 3866 20686\nf 20691 20686 1232\nf 3866 20690 14638\nf 20690 1234 20692\nf 14638 20692 3867\nf 1233 14639 20693\nf 14639 4759 14646\nf 20693 14646 1235\nf 2695 20694 16492\nf 20694 4758 20689\nf 16492 20689 2694\nf 4758 20694 14641\nf 20694 2695 20695\nf 14641 20695 4759\nf 1236 20696 20697\nf 20696 3867 20692\nf 20697 20692 1234\nf 3867 20696 14644\nf 20696 1236 20698\nf 14644 20698 3868\nf 1235 14645 20699\nf 14645 4760 14652\nf 20699 14652 1237\nf 2696 20700 16493\nf 20700 4759 20695\nf 16493 20695 2695\nf 4759 20700 14647\nf 20700 2696 20701\nf 14647 20701 4760\nf 1238 20702 20703\nf 20702 3868 20698\nf 20703 20698 1236\nf 3868 20702 14650\nf 20702 1238 20704\nf 14650 20704 3869\nf 1237 14651 20705\nf 14651 4761 14658\nf 20705 14658 1239\nf 2697 20706 16494\nf 20706 4760 20701\nf 16494 20701 2696\nf 4760 20706 14653\nf 20706 2697 20707\nf 14653 20707 4761\nf 1240 20708 20709\nf 20708 3869 20704\nf 20709 20704 1238\nf 3869 20708 14656\nf 20708 1240 20710\nf 14656 20710 3870\nf 1239 14657 20711\nf 14657 4762 14664\nf 20711 14664 3908\nf 2698 20712 16495\nf 20712 4761 20707\nf 16495 20707 2697\nf 4761 20712 14659\nf 20712 2698 20713\nf 14659 20713 4762\nf 1241 20714 20715\nf 20714 3870 20710\nf 20715 20710 1240\nf 3870 20714 14662\nf 20714 1241 20716\nf 14662 20716 3871\nf 3908 14663 14883\nf 14663 4763 14670\nf 14883 14670 3909\nf 2699 20717 16496\nf 20717 4762 20713\nf 16496 20713 2698\nf 4762 20717 14665\nf 20717 2699 20718\nf 14665 20718 4763\nf 1242 20719 20720\nf 20719 3871 20716\nf 20720 20716 1241\nf 3871 20719 14668\nf 20719 1242 20721\nf 14668 20721 3872\nf 3909 14669 14889\nf 14669 4764 14676\nf 14889 14676 3910\nf 2700 20722 16497\nf 20722 4763 20718\nf 16497 20718 2699\nf 4763 20722 14671\nf 20722 2700 20723\nf 14671 20723 4764\nf 1243 20724 20725\nf 20724 3872 20721\nf 20725 20721 1242\nf 3872 20724 14674\nf 20724 1243 20726\nf 14674 20726 3873\nf 3910 14675 14895\nf 14675 4765 14682\nf 14895 14682 3911\nf 2701 20727 16498\nf 20727 4764 20723\nf 16498 20723 2700\nf 4764 20727 14677\nf 20727 2701 20728\nf 14677 20728 4765\nf 1244 20729 20730\nf 20729 3873 20726\nf 20730 20726 1243\nf 3873 20729 14680\nf 20729 1244 20731\nf 14680 20731 3874\nf 3911 14681 20733\nf 14681 4766 20732\nf 20733 20732 5810\nf 2702 20734 16499\nf 20734 4765 20728\nf 16499 20728 2701\nf 4765 20734 14683\nf 20734 2702 20735\nf 14683 20735 4766\nf 1246 20736 14798\nf 20736 3874 20731\nf 14798 20731 1244\nf 3874 20736 14686\nf 20736 1246 20737\nf 14686 20737 3875\nf 1245 14687 14905\nf 14687 4767 14694\nf 14905 14694 1247\nf 2703 20738 16500\nf 20738 4766 20735\nf 16500 20735 2702\nf 4766 20738 20740\nf 20738 2703 20739\nf 20740 20739 4767\nf 2704 14695 14691\nf 14695 4767 20739\nf 14691 20739 2703\nf 2704 14697 14692\nf 14697 3876 16502\nf 14692 16502 2705\nf 4768 14693 14699\nf 14693 2705 20741\nf 14699 20741 2706\nf 2705 14703 20741\nf 14703 3877 8561\nf 20741 8561 2706\nf 2708 8566 14710\nf 8566 3878 14706\nf 14710 14706 2707\nf 3878 16507 14707\nf 16507 1249 14700\nf 14707 14700 2706\nf 4769 14716 14718\nf 14716 2173 7975\nf 14718 7975 2174\nf 1037 14721 20666\nf 14721 4770 14727\nf 20666 14727 1226\nf 2709 20742 16508\nf 20742 4770 14722\nf 16508 14722 4769\nf 4675 20250 13859\nf 20250 3881 14725\nf 13859 14725 3880\nf 1226 14726 20673\nf 14726 4771 14733\nf 20673 14733 1228\nf 2710 20743 16510\nf 20743 4770 20742\nf 16510 20742 2709\nf 4770 20743 14728\nf 20743 2710 20744\nf 14728 20744 4771\nf 1102 20745 20253\nf 20745 3882 8571\nf 20253 8571 1101\nf 3882 20745 14731\nf 20745 1102 20746\nf 14731 20746 3883\nf 1228 14732 20679\nf 14732 4772 14739\nf 20679 14739 1230\nf 2711 20747 16511\nf 20747 4771 20744\nf 16511 20744 2710\nf 4771 20747 14734\nf 20747 2711 20748\nf 14734 20748 4772\nf 1103 20749 20257\nf 20749 3883 20746\nf 20257 20746 1102\nf 3883 20749 14737\nf 20749 1103 20750\nf 14737 20750 3884\nf 1230 14738 20685\nf 14738 4773 14745\nf 20685 14745 1232\nf 2712 20751 16512\nf 20751 4772 20748\nf 16512 20748 2711\nf 4772 20751 14740\nf 20751 2712 20752\nf 14740 20752 4773\nf 1104 20753 20262\nf 20753 3884 20750\nf 20262 20750 1103\nf 3884 20753 14743\nf 20753 1104 20754\nf 14743 20754 3885\nf 1232 14744 20691\nf 14744 4774 14751\nf 20691 14751 1234\nf 2713 20755 16513\nf 20755 4773 20752\nf 16513 20752 2712\nf 4773 20755 14746\nf 20755 2713 20756\nf 14746 20756 4774\nf 1105 20757 20266\nf 20757 3885 20754\nf 20266 20754 1104\nf 3885 20757 14749\nf 20757 1105 20758\nf 14749 20758 3886\nf 1234 14750 20697\nf 14750 4775 14757\nf 20697 14757 1236\nf 2714 20759 16514\nf 20759 4774 20756\nf 16514 20756 2713\nf 4774 20759 14752\nf 20759 2714 20760\nf 14752 20760 4775\nf 1106 20761 20271\nf 20761 3886 20758\nf 20271 20758 1105\nf 3886 20761 14755\nf 20761 1106 20762\nf 14755 20762 3887\nf 1236 14756 20703\nf 14756 4776 14763\nf 20703 14763 1238\nf 2715 20763 16515\nf 20763 4775 20760\nf 16515 20760 2714\nf 4775 20763 14758\nf 20763 2715 20764\nf 14758 20764 4776\nf 1107 20765 20274\nf 20765 3887 20762\nf 20274 20762 1106\nf 3887 20765 14761\nf 20765 1107 20766\nf 14761 20766 3888\nf 1238 14762 20709\nf 14762 4777 14769\nf 20709 14769 1240\nf 2716 20767 16516\nf 20767 4776 20764\nf 16516 20764 2715\nf 4776 20767 14764\nf 20767 2716 20768\nf 14764 20768 4777\nf 4683 20769 20770\nf 20769 3889 14767\nf 20770 14767 3888\nf 3889 20769 20772\nf 20769 4683 20771\nf 20772 20771 1108\nf 1240 14768 20715\nf 14768 4778 14775\nf 20715 14775 1241\nf 2717 20773 16517\nf 20773 4777 20768\nf 16517 20768 2716\nf 4777 20773 14770\nf 20773 2717 20774\nf 14770 20774 4778\nf 1108 20775 20772\nf 20775 3890 14773\nf 20772 14773 3889\nf 3890 20775 20777\nf 20775 1108 20776\nf 20777 20776 1109\nf 1241 14774 20720\nf 14774 4779 14781\nf 20720 14781 1242\nf 2718 20778 16518\nf 20778 4778 20774\nf 16518 20774 2717\nf 4778 20778 14776\nf 20778 2718 20779\nf 14776 20779 4779\nf 3891 14779 20288\nf 14779 3890 20777\nf 20288 20777 1109\nf 1242 14780 20725\nf 14780 4780 14787\nf 20725 14787 1243\nf 2719 20780 16520\nf 20780 4779 20779\nf 16520 20779 2718\nf 4779 20780 14782\nf 20780 2719 20781\nf 14782 20781 4780\nf 1243 14786 20730\nf 14786 4781 14793\nf 20730 14793 1244\nf 2720 20782 20784\nf 20782 4781 20783\nf 20784 20783 5844\nf 4780 20785 14788\nf 20785 5844 20783\nf 14788 20783 4781\nf 1244 14792 14799\nf 14792 4782 20786\nf 14799 20786 5956\nf 2720 20787 20782\nf 20787 4782 14794\nf 20782 14794 4781\nf 4782 20787 20788\nf 20787 2720 16523\nf 20788 16523 3893\nf 1111 14797 20296\nf 14797 3893 16524\nf 20296 16524 1110\nf 1246 20789 20790\nf 20789 4783 14807\nf 20790 14807 5811\nf 2721 14803 16525\nf 14803 5956 20791\nf 16525 20791 3893\nf 1112 14805 20298\nf 14805 3894 14795\nf 20298 14795 1111\nf 3876 20792 20794\nf 20792 4784 20793\nf 20794 20793 5836\nf 2722 14810 16526\nf 14810 4783 14801\nf 16526 14801 2721\nf 1068 20795 20299\nf 20795 3895 14804\nf 20299 14804 1112\nf 3895 20795 14813\nf 20795 1068 20796\nf 14813 20796 3896\nf 3897 14814 16529\nf 14814 1248 20797\nf 16529 20797 5836\nf 2723 20798 16527\nf 20798 4784 14809\nf 16527 14809 2722\nf 4784 20798 20793\nf 20798 2723 16530\nf 20793 16530 5836\nf 2483 13589 13587\nf 13589 3896 20796\nf 13587 20796 1068\nf 4785 14825 14823\nf 14825 1039 8576\nf 14823 8576 819\nf 1039 14824 20373\nf 14824 4786 14831\nf 20373 14831 1139\nf 2725 20799 16532\nf 20799 4786 20800\nf 16532 20800 2454\nf 4785 8035 14826\nf 8035 2454 20800\nf 14826 20800 4786\nf 1139 14830 20380\nf 14830 4787 14837\nf 20380 14837 1140\nf 2726 20801 16533\nf 20801 4786 20799\nf 16533 20799 2725\nf 4786 20801 14832\nf 20801 2726 20802\nf 14832 20802 4787\nf 1227 20803 20669\nf 20803 3900 14829\nf 20669 14829 3899\nf 3900 20803 14835\nf 20803 1227 20804\nf 14835 20804 3901\nf 1140 14836 20386\nf 14836 4788 14843\nf 20386 14843 1142\nf 2727 20805 16534\nf 20805 4787 20802\nf 16534 20802 2726\nf 4787 20805 14838\nf 20805 2727 20806\nf 14838 20806 4788\nf 1229 20807 20675\nf 20807 3901 20804\nf 20675 20804 1227\nf 3901 20807 14841\nf 20807 1229 20808\nf 14841 20808 3902\nf 1142 14842 20392\nf 14842 4789 14849\nf 20392 14849 1144\nf 2728 20809 16535\nf 20809 4788 20806\nf 16535 20806 2727\nf 4788 20809 14844\nf 20809 2728 20810\nf 14844 20810 4789\nf 1231 20811 20681\nf 20811 3902 20808\nf 20681 20808 1229\nf 3902 20811 14847\nf 20811 1231 20812\nf 14847 20812 3903\nf 1144 14848 20398\nf 14848 4790 14855\nf 20398 14855 1146\nf 2729 20813 16536\nf 20813 4789 20810\nf 16536 20810 2728\nf 4789 20813 14850\nf 20813 2729 20814\nf 14850 20814 4790\nf 1233 20815 20687\nf 20815 3903 20812\nf 20687 20812 1231\nf 3903 20815 14853\nf 20815 1233 20816\nf 14853 20816 3904\nf 1146 14854 20404\nf 14854 4791 14861\nf 20404 14861 1148\nf 2730 20817 16537\nf 20817 4790 20814\nf 16537 20814 2729\nf 4790 20817 14856\nf 20817 2730 20818\nf 14856 20818 4791\nf 1235 20819 20693\nf 20819 3904 20816\nf 20693 20816 1233\nf 3904 20819 14859\nf 20819 1235 20820\nf 14859 20820 3905\nf 1148 14860 20410\nf 14860 4792 14867\nf 20410 14867 1150\nf 2731 20821 16538\nf 20821 4791 20818\nf 16538 20818 2730\nf 4791 20821 14862\nf 20821 2731 20822\nf 14862 20822 4792\nf 1237 20823 20699\nf 20823 3905 20820\nf 20699 20820 1235\nf 3905 20823 14865\nf 20823 1237 20824\nf 14865 20824 3906\nf 1150 14866 20416\nf 14866 4793 14873\nf 20416 14873 1152\nf 2732 20825 16539\nf 20825 4792 20822\nf 16539 20822 2731\nf 4792 20825 14868\nf 20825 2732 20826\nf 14868 20826 4793\nf 1239 20827 20705\nf 20827 3906 20824\nf 20705 20824 1237\nf 3906 20827 14871\nf 20827 1239 20828\nf 14871 20828 3907\nf 1152 14872 20422\nf 14872 4794 14879\nf 20422 14879 1154\nf 2733 20829 16540\nf 20829 4793 20826\nf 16540 20826 2732\nf 4793 20829 14874\nf 20829 2733 20830\nf 14874 20830 4794\nf 3908 14877 20711\nf 14877 3907 20828\nf 20711 20828 1239\nf 1154 14878 20428\nf 14878 4795 14885\nf 20428 14885 1156\nf 2734 20831 16541\nf 20831 4794 20830\nf 16541 20830 2733\nf 4794 20831 14880\nf 20831 2734 20832\nf 14880 20832 4795\nf 1156 14884 20431\nf 14884 4796 14891\nf 20431 14891 1158\nf 2735 20833 16542\nf 20833 4795 20832\nf 16542 20832 2734\nf 4795 20833 14886\nf 20833 2735 20834\nf 14886 20834 4796\nf 1158 14890 14148\nf 14890 4797 14897\nf 14148 14897 1160\nf 2736 20835 16543\nf 20835 4796 20834\nf 16543 20834 2735\nf 4796 20835 14892\nf 20835 2736 20836\nf 14892 20836 4797\nf 1160 14896 14155\nf 14896 4798 14899\nf 14155 14899 1162\nf 2737 20837 16545\nf 20837 4797 20836\nf 16545 20836 2736\nf 4797 20837 14898\nf 20837 2737 20838\nf 14898 20838 4798\nf 5810 16546 20840\nf 16546 2738 20839\nf 20840 20839 2737\nf 3911 20733 16544\nf 20733 5810 20840\nf 16544 20840 2737\nf 2738 20841 20839\nf 20841 4798 20838\nf 20839 20838 2737\nf 4798 20841 14900\nf 20841 2738 20842\nf 14900 20842 2739\nf 2738 14903 20842\nf 14903 3912 8584\nf 20842 8584 2739\nf 2740 8588 8586\nf 8588 1164 8583\nf 8586 8583 2739\nf 4799 8590 16547\nf 8590 2740 8585\nf 16547 8585 3912\nf 3914 8595 14909\nf 8595 1166 8589\nf 14909 8589 2740\nf 3916 8597 16549\nf 8597 1168 16384\nf 16549 16384 3914\nf 3918 16390 16550\nf 16390 1169 8598\nf 16550 8598 3916\nf 3917 8602 14916\nf 8602 3918 16551\nf 14916 16551 3915\n\nusemtl material_0\nf 4800 6108 8738\nf 6108 1293 8808\nf 8738 8808 107\nf 4801 20843 8885\nf 20843 1341 8975\nf 8885 8975 175\nf 4802 6375 9103\nf 6375 61 9100\nf 9103 9100 1393\nf 4803 6437 9385\nf 6437 1449 16889\nf 9385 16889 4011\nf 4804 9390 6439\nf 9390 1450 20844\nf 6439 20844 1451\nf 4805 7211 20845\nf 7211 624 7216\nf 20845 7216 603\nf 604 11161 7073\nf 11161 4805 20845\nf 7073 20845 603\nf 606 7119 11162\nf 7119 4806 11158\nf 11162 11158 1853\nf 4807 7140 20846\nf 7140 609 11173\nf 20846 11173 610\n\nusemtl material_1\nf 4808 20847 20849\nf 20847 3158 20848\nf 20849 20848 3155\nf 3158 20847 20851\nf 20847 4808 20850\nf 20851 20850 4810\nf 4809 20852 20854\nf 20852 3156 20853\nf 20854 20853 5877\nf 3157 20855 20857\nf 20855 3158 20856\nf 20857 20856 4240\nf 4810 18135 20851\nf 18135 4240 20856\nf 20851 20856 3158\nf 4811 15423 20859\nf 15423 3155 20858\nf 20859 20858 3157\nf 3155 20848 20858\nf 20848 3158 20855\nf 20858 20855 3157\nf 3164 20860 20862\nf 20860 4813 20861\nf 20862 20861 3163\nf 3165 20863 15448\nf 20863 4814 18000\nf 15448 18000 4978\nf 3166 20864 20866\nf 20864 4815 20865\nf 20866 20865 3167\nf 1929 20867 20869\nf 20867 5935 20868\nf 20869 20868 5543\nf 4817 20870 7292\nf 20870 5542 17989\nf 7292 17989 4815\nf 3167 20865 15491\nf 20865 4815 17988\nf 15491 17988 4221\nf 3176 20871 20873\nf 20871 4819 20872\nf 20873 20872 3177\nf 4819 20871 20875\nf 20871 3176 20874\nf 20875 20874 4998\nf 3177 20872 20876\nf 20872 4819 18021\nf 20876 18021 3178\nf 4820 20877 18020\nf 20877 5549 20878\nf 18020 20878 3178\nf 3178 20878 20880\nf 20878 5549 20879\nf 20880 20879 4226\nf 652 18035 13525\nf 18035 4821 20881\nf 13525 20881 651\nf 4985 20882 20884\nf 20882 3182 20883\nf 20884 20883 5551\nf 3185 20885 20886\nf 20885 4823 18076\nf 20886 18076 4824\nf 3187 20887 20888\nf 20887 4824 18074\nf 20888 18074 3188\nf 5555 20889 18062\nf 20889 366 10147\nf 18062 10147 369\nf 3190 11494 20891\nf 11494 4985 20890\nf 20891 20890 3191\nf 4996 20892 20894\nf 20892 4995 20893\nf 20894 20893 4999\nf 5004 20895 20897\nf 20895 4267 20896\nf 20897 20896 5899\nf 4239 20898 11523\nf 20898 3157 20857\nf 11523 20857 4240\nf 5560 20899 15508\nf 20899 4828 18123\nf 15508 18123 4238\nf 660 20900 20901\nf 20900 4829 18140\nf 20901 18140 5966\nf 3209 20902 11528\nf 20902 3204 18169\nf 11528 18169 3205\nf 3174 18008 15459\nf 18008 4833 20903\nf 15459 20903 3215\nf 4833 18048 20904\nf 18048 4986 18199\nf 20904 18199 5016\nf 3218 20905 20907\nf 20905 5572 20906\nf 20907 20906 1946\nf 3228 20908 20910\nf 20908 3226 20909\nf 20910 20909 4836\nf 4837 20911 18244\nf 20911 5579 20912\nf 18244 20912 4836\nf 5581 20913 20915\nf 20913 3229 20914\nf 20915 20914 5579\nf 3239 20916 20917\nf 20916 3238 11556\nf 20917 11556 5045\nf 3238 20916 20919\nf 20916 3239 20918\nf 20919 20918 4840\n\nusemtl material_2\nf 1979 18307 20921\nf 18307 3245 20920\nf 20921 20920 5878\nf 4842 20922 20924\nf 20922 5878 20923\nf 20924 20923 4841\nf 4844 20925 20926\nf 20925 1920 15428\nf 20926 15428 4845\nf 1920 20925 20928\nf 20925 4844 20927\nf 20928 20927 5372\nf 5596 20929 20931\nf 20929 5062 20930\nf 20931 20930 5065\nf 5062 20929 20932\nf 20929 5596 18343\nf 20932 18343 4273\nf 3250 20933 20934\nf 20933 5065 20930\nf 20934 20930 5062\nf 680 18363 13543\nf 18363 5061 20935\nf 13543 20935 679\nf 4848 20936 20937\nf 20936 681 8100\nf 20937 8100 682\nf 5602 20938 20940\nf 20938 4850 20939\nf 20940 20939 3256\nf 4850 20938 20941\nf 20938 5602 18390\nf 20941 18390 5601\nf 3257 15616 20943\nf 15616 3256 20942\nf 20943 20942 3258\nf 4852 20944 7335\nf 20944 3259 20945\nf 7335 20945 5118\nf 5083 20946 20947\nf 20946 4851 18321\nf 20947 18321 4272\nf 126 20948 8838\nf 20948 3260 20949\nf 8838 20949 128\nf 1998 11608 20950\nf 11608 4852 18575\nf 20950 18575 1995\nf 5960 18462 20952\nf 18462 4290 20951\nf 20952 20951 5095\nf 5620 20953 20955\nf 20953 5617 20954\nf 20955 20954 4857\nf 4858 20956 20958\nf 20956 4857 20957\nf 20958 20957 3267\nf 147 20959 20961\nf 20959 5961 20960\nf 20961 20960 4859\nf 5961 20959 20962\nf 20959 147 9271\nf 20962 9271 1299\nf 5102 18512 20963\nf 18512 5623 18524\nf 20963 18524 4300\nf 4860 18516 7341\nf 18516 2011 20964\nf 7341 20964 3274\nf 4299 20965 20966\nf 20965 5107 18526\nf 20966 18526 4861\nf 5107 20965 15654\nf 20965 4299 20967\nf 15654 20967 3272\nf 5624 20968 18523\nf 20968 3275 20969\nf 18523 20969 4300\nf 3278 18542 20970\nf 18542 5106 18527\nf 20970 18527 5107\nf 3282 20971 20973\nf 20971 4304 20972\nf 20973 20972 4307\nf 5643 20974 18560\nf 20974 4307 20975\nf 18560 20975 5628\nf 4863 15669 18557\nf 15669 3286 20976\nf 18557 20976 4306\nf 4869 20977 20979\nf 20977 3300 20978\nf 20979 20978 3286\nf 3290 15679 15675\nf 15679 5633 20980\nf 15675 20980 3289\nf 5638 18602 20982\nf 18602 5655 20981\nf 20982 20981 4866\nf 4316 20983 18606\nf 20983 4865 20984\nf 18606 20984 3313\nf 3296 18598 20986\nf 18598 4315 20985\nf 20986 20985 3297\nf 5128 20987 20989\nf 20987 4318 20988\nf 20989 20988 5908\nf 3285 20990 20991\nf 20990 3301 7347\nf 20991 7347 4869\nf 5646 20992 20994\nf 20992 3300 20993\nf 20994 20993 4870\nf 4869 7346 20977\nf 7346 4870 20993\nf 20977 20993 3300\nf 4871 11691 7349\nf 11691 4320 20995\nf 7349 20995 3302\nf 5647 20996 18651\nf 20996 5646 20997\nf 18651 20997 3304\nf 2034 18657 13579\nf 18657 4873 20998\nf 13579 20998 702\nf 3305 20999 21001\nf 20999 4874 21000\nf 21001 21000 5856\nf 4325 21002 18661\nf 21002 3307 18669\nf 18661 18669 5651\nf 4875 7356 7358\nf 7356 3310 21003\nf 7358 21003 4876\nf 3312 21004 15729\nf 21004 4876 21003\nf 15729 21003 3310\n\nusemtl material_3\nf 4877 21005 21007\nf 21005 5965 21006\nf 21007 21006 5840\nf 3314 15907 21008\nf 15907 5840 21006\nf 21008 21006 5965\nf 3315 21009 21010\nf 21009 3316 18704\nf 21010 18704 1979\nf 4878 21011 21013\nf 21011 5934 21012\nf 21013 21012 3317\nf 3324 15762 21014\nf 15762 3322 15757\nf 21014 15757 3321\nf 4880 18750 21015\nf 18750 709 12105\nf 21015 12105 2045\nf 5672 21016 21018\nf 21016 4881 21017\nf 21018 21017 5670\nf 2053 21019 18780\nf 21019 4882 7369\nf 18780 7369 5671\nf 5431 18793 21020\nf 18793 4346 11739\nf 21020 11739 3335\nf 5428 18791 21022\nf 18791 2056 21021\nf 21022 21021 5432\nf 3339 21023 21025\nf 21023 4885 21024\nf 21025 21024 5162\nf 4888 21026 21028\nf 21026 5681 21027\nf 21028 21027 3344\nf 5167 15793 15798\nf 15793 2058 15791\nf 15798 15791 3345\nf 3345 21029 21031\nf 21029 5433 21030\nf 21031 21030 3346\nf 3353 21032 21033\nf 21032 3352 18868\nf 21033 18868 3354\nf 4890 18870 18860\nf 18870 3352 21034\nf 18860 21034 5688\nf 3354 21035 15814\nf 21035 3355 11773\nf 15814 11773 5182\nf 3355 21035 21036\nf 21035 3354 18867\nf 21036 18867 5692\nf 5694 21037 21039\nf 21037 3358 21038\nf 21039 21038 4892\nf 3357 21040 21041\nf 21040 4893 11775\nf 21041 11775 4365\nf 3359 21042 21044\nf 21042 5696 21043\nf 21044 21043 3360\nf 5695 7377 21045\nf 7377 3360 21043\nf 21045 21043 5696\nf 727 21046 21048\nf 21046 4894 21047\nf 21048 21047 3363\nf 4894 21046 11781\nf 21046 727 7734\nf 11781 7734 726\nf 4368 21049 21051\nf 21049 3362 21050\nf 21051 21050 4369\nf 2070 18907 21053\nf 18907 3364 21052\nf 21053 21052 5191\nf 5444 15831 21055\nf 15831 4896 21054\nf 21055 21054 5196\nf 3367 21056 21058\nf 21056 4897 21057\nf 21058 21057 5704\nf 4897 21056 21060\nf 21056 3367 21059\nf 21060 21059 4372\nf 3370 21061 21062\nf 21061 5199 18923\nf 21062 18923 5200\nf 5208 21063 7399\nf 21063 3387 21064\nf 7399 21064 4902\nf 3392 21065 21066\nf 21065 4904 19026\nf 21066 19026 2084\nf 3396 21067 19047\nf 21067 4905 21068\nf 19047 21068 4390\nf 4905 21067 7406\nf 21067 3396 21069\nf 7406 21069 5722\nf 4907 21070 21071\nf 21070 3405 19074\nf 21071 19074 3403\nf 3406 21072 7411\nf 21072 3408 21073\nf 7411 21073 4908\n\nusemtl material_1\nf 3314 21074 21076\nf 21074 5934 21075\nf 21076 21075 4909\nf 5840 15906 21078\nf 15906 5740 21077\nf 21078 21077 4910\nf 3410 15918 21080\nf 15918 4911 21079\nf 21080 21079 3155\nf 4808 20849 7421\nf 20849 3155 21079\nf 7421 21079 4911\nf 3411 21081 21083\nf 21081 4913 21082\nf 21083 21082 1919\nf 4913 21081 7424\nf 21081 3411 21084\nf 7424 21084 4912\nf 392 21085 7117\nf 21085 5866 21086\nf 7117 21086 388\nf 4914 21087 21089\nf 21087 2098 21088\nf 21089 21088 3417\nf 5743 19186 21091\nf 19186 3424 21090\nf 21091 21090 4915\nf 4929 21092 21094\nf 21092 5841 21093\nf 21094 21093 5471\nf 5745 21095 21096\nf 21095 3429 15934\nf 21096 15934 5243\nf 3429 21095 21098\nf 21095 5745 21097\nf 21098 21097 4413\nf 5241 7429 21099\nf 7429 756 12788\nf 21099 12788 757\nf 3432 21100 11878\nf 21100 4917 21101\nf 11878 21101 5252\nf 4917 21102 19223\nf 21102 3431 21103\nf 19223 21103 5752\nf 5230 21104 15947\nf 21104 4404 21105\nf 15947 21105 3433\nf 4419 21106 21108\nf 21106 5980 21107\nf 21108 21107 3435\nf 5477 21109 21111\nf 21109 4922 21110\nf 21111 21110 3441\nf 5762 21112 21114\nf 21112 3440 21113\nf 21114 21113 5478\nf 5762 21115 21112\nf 21115 5766 19265\nf 21112 19265 3440\nf 3443 21116 21118\nf 21116 5842 21117\nf 21118 21117 4924\nf 4923 21119 21120\nf 21119 5767 19289\nf 21120 19289 5770\nf 5274 21121 21123\nf 21121 4427 21122\nf 21123 21122 4925\nf 4925 21122 21125\nf 21122 4427 21124\nf 21125 21124 5273\nf 3445 7439 11891\nf 7439 3444 21126\nf 11891 21126 4926\nf 3446 19319 21127\nf 19319 4926 21126\nf 21127 21126 3444\nf 4430 19321 21128\nf 19321 4927 19337\nf 21128 19337 3472\nf 4928 7441 15930\nf 7441 3426 19181\nf 15930 19181 2103\nf 5471 21129 21094\nf 21129 3451 19343\nf 21094 19343 4929\nf 3451 21129 7440\nf 21129 5471 21130\nf 7440 21130 3426\nf 4931 19365 7444\nf 19365 3455 21131\nf 7444 21131 4932\nf 3457 15998 21132\nf 15998 4932 21131\nf 21132 21131 3455\nf 2130 21133 21134\nf 21133 3462 16006\nf 21134 16006 2132\nf 4934 21135 21136\nf 21135 5786 19382\nf 21136 19382 2134\nf 3463 21137 21138\nf 21137 4935 19394\nf 21138 19394 4446\nf 4935 21137 21140\nf 21137 3463 21139\nf 21140 21139 3461\nf 4936 21141 21142\nf 21141 3468 19415\nf 21142 19415 5294\nf 4937 21143 19417\nf 21143 3470 21144\nf 19417 21144 5496\nf 3471 21145 21146\nf 21145 5496 21144\nf 21146 21144 3470\nf 3472 21147 21128\nf 21147 5775 15965\nf 21128 15965 4430\nf 3473 21148 19439\nf 21148 5497 21149\nf 19439 21149 3465\nf 3475 21150 21151\nf 21150 4938 7451\nf 21151 7451 5296\nf 5500 21152 21153\nf 21152 4940 16034\nf 21153 16034 3475\nf 4453 21154 19481\nf 21154 3477 21155\nf 19481 21155 4943\nf 3480 11933 21156\nf 11933 4944 19485\nf 21156 19485 5307\n\nusemtl material_4\nf 4945 12221 8021\nf 12221 831 7543\nf 8021 7543 2177\nf 4947 7708 12184\nf 7708 2221 12189\nf 12184 12189 859\nf 4945 8020 7537\nf 8020 2500 13468\nf 7537 13468 830\nf 3682 13630 16283\nf 13630 4948 13633\nf 16283 13633 2503\nf 4949 13647 8202\nf 13647 3683 13667\nf 8202 13667 2499\n\nusemtl material_0\nf 4801 8880 20843\nf 8880 174 8971\nf 20843 8971 1341\nf 4950 14937 6329\nf 14937 1363 16625\nf 6329 16625 1364\nf 2876 8994 9945\nf 8994 3953 8997\nf 9945 8997 189\nf 4802 9101 6376\nf 9101 63 9094\nf 6376 9094 1270\nf 2886 10008 15144\nf 10008 4951 16738\nf 15144 16738 221\nf 4954 21157 9551\nf 21157 4804 9396\nf 9551 9396 279\nf 4804 21157 9391\nf 21157 4954 9384\nf 9391 9384 4803\nf 1450 9392 20844\nf 9392 4952 9394\nf 20844 9394 1451\nf 280 9395 9742\nf 9395 4952 9387\nf 9742 9387 278\nf 4953 9407 9403\nf 9407 1453 16891\nf 9403 16891 1452\nf 4953 9404 9408\nf 9404 282 9411\nf 9408 9411 1454\nf 1478 9548 6468\nf 9548 4954 9550\nf 6468 9550 1479\nf 4955 9834 17107\nf 9834 1534 15100\nf 17107 15100 318\nf 321 17113 17210\nf 17113 4956 9843\nf 17210 9843 319\nf 4087 17161 17159\nf 17161 1556 15124\nf 17159 15124 1555\nf 4092 9964 17173\nf 9964 1596 10107\nf 17173 10107 4091\nf 4957 17207 10040\nf 17207 232 17216\nf 10040 17216 5948\nf 535 10812 15413\nf 10812 4959 17235\nf 15413 17235 3142\nf 547 21158 21159\nf 21158 3008 15254\nf 21159 15254 4960\nf 3008 21158 17574\nf 21158 547 15326\nf 17574 15326 3015\nf 450 10851 17581\nf 10851 1804 15422\nf 17581 15422 568\nf 4806 7089 7212\nf 7089 605 11212\nf 7212 11212 622\nf 4805 7090 7086\nf 7090 1853 11159\nf 7086 11159 1852\nf 4807 20846 7146\nf 20846 610 7113\nf 7146 7113 387\nf 1623 7223 10185\nf 7223 4961 11244\nf 10185 11244 3099\nf 625 11223 11262\nf 11223 1884 7192\nf 11262 7192 626\nf 1912 11388 15411\nf 11388 4962 17856\nf 15411 17856 1911\nf 4963 21160 11453\nf 21160 568 15421\nf 11453 15421 3154\n\nusemtl material_1\nf 5331 17941 11459\nf 17941 4971 21161\nf 11459 21161 4966\nf 4205 19110 17918\nf 19110 4966 21161\nf 17918 21161 4971\nf 4206 17926 17924\nf 17926 4967 11568\nf 17924 11568 4207\nf 4969 21162 17935\nf 21162 5846 21163\nf 17935 21163 30\nf 4208 21164 21166\nf 21164 4969 21165\nf 21166 21165 4209\nf 4972 21167 21168\nf 21167 4209 21165\nf 21168 21165 4969\nf 4210 21169 21170\nf 21169 4971 17940\nf 21170 17940 5847\nf 4211 21171 21172\nf 21171 4970 17937\nf 21172 17937 4210\nf 4970 21171 11466\nf 21171 4211 21173\nf 11466 21173 5532\nf 4964 17916 21174\nf 17916 4971 21169\nf 21174 21169 4210\nf 32 8632 21176\nf 8632 34 21175\nf 21176 21175 4972\nf 5535 21177 21178\nf 21177 4972 21175\nf 21178 21175 34\nf 3159 21179 17942\nf 21179 5333 21180\nf 17942 21180 1921\nf 5329 21181 15438\nf 21181 1921 21180\nf 15438 21180 5333\nf 3161 21182 11468\nf 21182 4214 21183\nf 11468 21183 5877\nf 4973 21184 11471\nf 21184 643 21185\nf 11471 21185 5533\nf 642 21186 8090\nf 21186 5533 21185\nf 8090 21185 643\nf 5535 21187 21188\nf 21187 3162 15440\nf 21188 15440 3160\nf 643 21184 8474\nf 21184 4973 21189\nf 8474 21189 644\nf 4215 17976 17974\nf 17976 4974 21190\nf 17974 21190 5879\nf 4975 21191 21192\nf 21191 5879 21190\nf 21192 21190 4974\nf 4216 21193 21195\nf 21193 4976 21194\nf 21195 21194 5334\nf 4217 17982 21196\nf 17982 4976 21193\nf 21196 21193 4216\nf 3164 21197 15447\nf 21197 5879 21198\nf 15447 21198 3165\nf 5540 21199 21201\nf 21199 3171 21200\nf 21201 21200 5335\nf 4977 21202 21203\nf 21202 5335 21200\nf 21203 21200 3171\nf 5336 21204 21206\nf 21204 5337 21205\nf 21206 21205 4977\nf 3169 21207 21208\nf 21207 4978 17991\nf 21208 17991 4220\nf 4813 20860 21210\nf 20860 3164 21209\nf 21210 21209 3169\nf 3167 15490 21211\nf 15490 1932 18091\nf 21211 18091 4826\nf 4220 21212 18005\nf 21212 3173 21213\nf 18005 21213 4979\nf 4982 21214 21216\nf 21214 4224 21215\nf 21216 21215 4225\nf 1936 21217 21219\nf 21217 4980 21218\nf 21219 21218 5890\nf 4225 21220 15470\nf 21220 4981 21221\nf 15470 21221 4228\nf 5547 21222 18019\nf 21222 3180 21223\nf 18019 21223 4981\nf 4982 21216 11489\nf 21216 4225 21224\nf 11489 21224 5548\nf 5340 21225 21226\nf 21225 4983 15473\nf 21226 15473 1938\nf 4228 21227 18085\nf 21227 3180 21228\nf 18085 21228 1940\nf 4225 21229 21224\nf 21229 4984 21230\nf 21224 21230 5548\nf 47 21231 21233\nf 21231 4984 21232\nf 21233 21232 5951\nf 3181 18038 11493\nf 18038 3182 20882\nf 11493 20882 4985\nf 3190 15484 21235\nf 15484 5344 21234\nf 21235 21234 1938\nf 346 10082 21237\nf 10082 345 21236\nf 21237 21236 4988\nf 3184 15480 18010\nf 15480 5347 21238\nf 18010 21238 1942\nf 4230 21239 21240\nf 21239 4987 18066\nf 21240 18066 4231\nf 3186 21241 15483\nf 21241 4989 21242\nf 15483 21242 5347\nf 4989 21241 18070\nf 21241 3186 21243\nf 18070 21243 5348\nf 4231 18068 21245\nf 18068 5553 21244\nf 21245 21244 3195\nf 3189 21246 18064\nf 21246 3197 21247\nf 18064 21247 5553\nf 4231 18120 21240\nf 18120 4990 21248\nf 21240 21248 4230\nf 4991 21249 11503\nf 21249 4230 21248\nf 11503 21248 4990\nf 4232 18082 21250\nf 18082 4992 18089\nf 21250 18089 1932\nf 4232 21251 18041\nf 21251 4825 18045\nf 18041 18045 3183\nf 4993 21252 21253\nf 21252 5552 18046\nf 21253 18046 4825\nf 4996 21254 20892\nf 21254 3175 15463\nf 20892 15463 4995\nf 1946 21255 7300\nf 21255 4997 21256\nf 7300 21256 1936\nf 3193 18097 11507\nf 18097 4998 20874\nf 11507 20874 3176\nf 3220 21257 21258\nf 21257 4996 20894\nf 21258 20894 4999\nf 4997 21255 21259\nf 21255 1946 20906\nf 21259 20906 5572\nf 5000 11513 21260\nf 11513 3240 15584\nf 21260 15584 1947\nf 4236 18300 21261\nf 18300 5001 18107\nf 21261 18107 3195\nf 3195 21262 21261\nf 21262 3197 15502\nf 21261 15502 4236\nf 5050 21263 11517\nf 21263 4236 15501\nf 11517 15501 5002\nf 3194 18113 21264\nf 18113 3196 11518\nf 21264 11518 4237\nf 4237 21265 21264\nf 21265 5558 18112\nf 21264 18112 3194\nf 5004 21266 21268\nf 21266 4827 21267\nf 21268 21267 5555\nf 366 20889 18116\nf 20889 5555 21267\nf 18116 21267 4827\nf 3187 20888 11520\nf 20888 3188 21269\nf 11520 21269 4237\nf 4238 21270 21272\nf 21270 5530 21271\nf 21272 21271 3198\nf 1950 21273 18128\nf 21273 3198 21271\nf 18128 21271 5530\nf 4238 21272 15509\nf 21272 3198 18136\nf 15509 18136 4241\nf 3198 21274 18137\nf 21274 5005 21275\nf 18137 21275 4242\nf 5009 21276 21277\nf 21276 5560 18143\nf 21277 18143 5006\nf 3202 21278 21279\nf 21278 5880 15517\nf 21279 15517 3201\nf 4244 21280 21282\nf 21280 4243 21281\nf 21282 21281 3203\nf 4244 21283 21284\nf 21283 5009 21277\nf 21284 21277 5006\nf 5009 21283 7304\nf 21283 4244 21285\nf 7304 21285 4830\nf 4245 21286 21287\nf 21286 4830 21285\nf 21287 21285 4244\nf 3204 21288 18167\nf 21288 5891 21289\nf 18167 21289 5880\nf 5566 21290 18159\nf 21290 4246 21291\nf 18159 21291 5565\nf 377 21292 18177\nf 21292 4830 15522\nf 18177 15522 5011\nf 5014 21293 21295\nf 21293 4246 21294\nf 21295 21294 5012\nf 663 21296 15527\nf 21296 5013 21297\nf 15527 21297 5012\nf 5015 15533 11536\nf 15533 3210 21298\nf 11536 21298 5016\nf 5013 21299 15537\nf 21299 5356 21300\nf 15537 21300 4248\nf 4832 15536 18194\nf 15536 5014 15538\nf 18194 15538 4248\nf 5569 18201 21302\nf 18201 1964 21301\nf 21302 21301 1965\nf 4248 21300 18205\nf 21300 5356 21303\nf 18205 21303 5020\nf 5017 21304 21305\nf 21304 4833 20904\nf 21305 20904 5016\nf 3214 18204 15542\nf 18204 3184 21306\nf 15542 21306 5019\nf 5018 11540 18009\nf 11540 5019 21306\nf 18009 21306 3184\nf 4249 18206 18013\nf 18206 5020 21307\nf 18013 21307 4222\nf 3221 15545 18211\nf 15545 5023 21308\nf 18211 21308 4235\nf 5022 18218 21309\nf 18218 5572 20905\nf 21309 20905 3218\nf 5024 21310 18223\nf 21310 3218 21311\nf 18223 21311 1966\nf 5573 21312 21314\nf 21312 3219 21313\nf 21314 21313 3220\nf 3221 15548 15546\nf 15548 5027 15556\nf 15546 15556 5026\nf 5851 21315 21316\nf 21315 5022 21309\nf 21316 21309 3218\nf 4250 21317 21319\nf 21317 5025 21318\nf 21319 21318 4834\nf 5025 21317 21320\nf 21317 4250 18228\nf 21320 18228 5029\nf 4835 21321 21323\nf 21321 3224 21322\nf 21323 21322 3223\nf 4251 21324 21326\nf 21324 5028 21325\nf 21326 21325 4252\nf 5575 21327 11546\nf 21327 4251 18234\nf 11546 18234 5574\nf 5022 21328 21330\nf 21328 4252 21329\nf 21330 21329 4250\nf 3225 21331 21332\nf 21331 5033 15557\nf 21332 15557 3224\nf 1968 15554 21333\nf 15554 5027 15553\nf 21333 15553 5359\nf 5031 21334 21336\nf 21334 4253 21335\nf 21336 21335 5034\nf 3226 21337 21338\nf 21337 5033 21331\nf 21338 21331 3225\nf 4254 18241 21339\nf 18241 5034 21335\nf 21339 21335 4253\nf 5936 21340 21341\nf 21340 5031 21336\nf 21341 21336 5034\nf 5033 21337 21343\nf 21337 3226 21342\nf 21343 21342 3227\nf 4254 18238 21345\nf 18238 5576 21344\nf 21345 21344 4255\nf 5578 21346 21347\nf 21346 4255 21344\nf 21347 21344 5576\nf 3227 21348 21343\nf 21348 5032 21349\nf 21343 21349 5033\nf 5032 21348 11552\nf 21348 3227 21350\nf 11552 21350 5037\nf 3228 21351 21353\nf 21351 5040 21352\nf 21353 21352 3227\nf 5037 21350 21354\nf 21350 3227 21352\nf 21354 21352 5040\nf 4256 21355 21357\nf 21355 5039 21356\nf 21357 21356 5036\nf 5035 21358 21359\nf 21358 5036 21356\nf 21359 21356 5039\nf 5040 21351 21360\nf 21351 3228 15559\nf 21360 15559 3230\nf 4257 21361 21363\nf 21361 5582 21362\nf 21363 21362 4258\nf 5582 21361 21365\nf 21361 4257 21364\nf 21365 21364 5038\nf 5039 21355 21366\nf 21355 4256 18251\nf 21366 18251 5041\nf 5040 21360 21368\nf 21360 3230 21367\nf 21368 21367 1975\nf 1974 21369 18261\nf 21369 5582 21370\nf 18261 21370 1973\nf 4259 15565 21371\nf 15565 4260 18259\nf 21371 18259 4258\nf 5581 21372 21374\nf 21372 4839 21373\nf 21374 21373 3231\nf 4839 21372 21375\nf 21372 5581 18258\nf 21375 18258 5583\nf 3230 21376 21377\nf 21376 3231 18274\nf 21377 18274 3232\nf 4261 21378 21380\nf 21378 4839 21379\nf 21380 21379 3234\nf 4838 21381 21382\nf 21381 3234 21379\nf 21382 21379 4839\nf 4262 18277 21383\nf 18277 5042 11557\nf 21383 11557 3238\nf 5045 21384 21386\nf 21384 3233 21385\nf 21386 21385 5044\nf 5043 21387 21388\nf 21387 5044 21385\nf 21388 21385 3233\nf 5044 18286 21389\nf 18286 5362 15575\nf 21389 15575 1978\nf 3236 18293 15570\nf 18293 4264 21390\nf 15570 21390 3235\nf 3239 20917 21392\nf 20917 5045 21391\nf 21392 21391 1978\nf 5048 21393 21394\nf 21393 4264 18295\nf 21394 18295 5047\nf 5364 21395 21396\nf 21395 4840 20918\nf 21396 20918 3239\nf 4840 21395 21397\nf 21395 5364 15581\nf 21397 15581 5049\nf 5050 15577 21263\nf 15577 4266 18299\nf 21263 18299 4236\n\nusemtl material_2\nf 5051 21398 11560\nf 21398 4270 21399\nf 11560 21399 4268\nf 3243 21400 21402\nf 21400 4270 21401\nf 21402 21401 1980\nf 1980 21403 21405\nf 21403 5051 21404\nf 21405 21404 5054\nf 3242 11564 21407\nf 11564 5053 21406\nf 21407 21406 5058\nf 4271 21408 21409\nf 21408 5052 18318\nf 21409 18318 3246\nf 3246 21410 21412\nf 21410 4284 21411\nf 21412 21411 5054\nf 5056 21413 21415\nf 21413 5081 21414\nf 21415 21414 5055\nf 4272 21416 21417\nf 21416 5058 21406\nf 21417 21406 5053\nf 5058 21416 21418\nf 21416 4272 18320\nf 21418 18320 5057\nf 4967 21419 11569\nf 21419 3247 18341\nf 11569 18341 5059\nf 3247 21419 21420\nf 21419 4967 11461\nf 21420 11461 1920\nf 5060 15598 18329\nf 15598 3249 21421\nf 18329 21421 5370\nf 4275 18355 21423\nf 18355 5061 21422\nf 21423 21422 3251\nf 4275 21424 21425\nf 21424 5063 15594\nf 21425 15594 3248\nf 5062 18350 20934\nf 18350 3249 15597\nf 20934 15597 3250\nf 3251 18361 21423\nf 18361 5063 21424\nf 21423 21424 4275\nf 5064 18370 11572\nf 18370 4277 21426\nf 11572 21426 3250\nf 4277 21427 21426\nf 21427 5065 20933\nf 21426 20933 3250\nf 4279 21428 21430\nf 21428 4846 21429\nf 21430 21429 4278\nf 4280 21431 18380\nf 21431 4277 18369\nf 18380 18369 5067\nf 5070 18383 21433\nf 18383 5599 21432\nf 21433 21432 4280\nf 3255 21434 15611\nf 21434 5074 15613\nf 15611 15613 1990\nf 4281 21435 18402\nf 21435 5600 21436\nf 18402 21436 5604\nf 5069 18403 21437\nf 18403 5604 21436\nf 21437 21436 5600\nf 4281 18401 15602\nf 18401 4282 21438\nf 15602 21438 5072\nf 5070 18397 18384\nf 18397 5603 18393\nf 18384 18393 5071\nf 5602 21439 21441\nf 21439 5073 21440\nf 21441 21440 3255\nf 5074 21434 11588\nf 21434 3255 21440\nf 11588 21440 5073\nf 4283 21442 21444\nf 21442 5852 21443\nf 21444 21443 4282\nf 3257 21445 15617\nf 21445 5075 21446\nf 15617 21446 5377\nf 5087 21447 21449\nf 21447 5077 21448\nf 21449 21448 5852\nf 5077 21447 18413\nf 21447 5087 21450\nf 18413 21450 5613\nf 4284 18423 21411\nf 18423 5078 21451\nf 21411 21451 5054\nf 5826 21452 21454\nf 21452 5608 21453\nf 21454 21453 5079\nf 4285 18421 11601\nf 18421 4284 21455\nf 11601 21455 5608\nf 4285 11600 21457\nf 11600 5080 21456\nf 21457 21456 5949\nf 5083 21458 11604\nf 21458 5081 21459\nf 11604 21459 4286\nf 5611 21460 15625\nf 21460 4286 21459\nf 15625 21459 5081\nf 5082 11605 11603\nf 11605 4287 21461\nf 11603 21461 5083\nf 4851 20946 21462\nf 20946 5083 21461\nf 21462 21461 4287\nf 4287 21463 21465\nf 21463 5084 21464\nf 21465 21464 5609\nf 4287 21465 21462\nf 21465 5609 18323\nf 21462 18323 4851\nf 3259 20944 15627\nf 20944 4852 11610\nf 15627 11610 5080\nf 5085 21466 21468\nf 21466 1996 21467\nf 21468 21467 2000\nf 5082 18436 11612\nf 18436 2000 21467\nf 11612 21467 1996\nf 5382 15629 21470\nf 15629 5086 21469\nf 21470 21469 3257\nf 5087 21471 21450\nf 21471 3263 21472\nf 21450 21472 5613\nf 3263 21471 15632\nf 21471 5087 21473\nf 15632 21473 3262\nf 3263 21474 21476\nf 21474 5091 21475\nf 21476 21475 4289\nf 5091 21474 11620\nf 21474 3263 15631\nf 11620 15631 5383\nf 4290 18451 21478\nf 18451 3264 21477\nf 21478 21477 4291\nf 3265 21479 21480\nf 21479 4289 21475\nf 21480 21475 5091\nf 3265 21481 21482\nf 21481 5092 11623\nf 21482 11623 5094\nf 4291 21483 18483\nf 21483 5093 21484\nf 18483 21484 5618\nf 3265 21482 21486\nf 21482 5094 21485\nf 21486 21485 4292\nf 5854 21487 21488\nf 21487 5097 15637\nf 21488 15637 5095\nf 4293 21489 21491\nf 21489 5097 21490\nf 21491 21490 3266\nf 4292 21485 21492\nf 21485 5094 18476\nf 21492 18476 5881\nf 5881 21493 21492\nf 21493 3267 18473\nf 21492 18473 4292\nf 4293 21491 18494\nf 21491 3266 21494\nf 18494 21494 4294\nf 3269 21495 21496\nf 21495 3267 21493\nf 21496 21493 5881\nf 5100 21497 15640\nf 21497 5385 15642\nf 15640 15642 5384\nf 691 11635 8127\nf 11635 5101 18496\nf 8127 18496 690\nf 4296 21498 21500\nf 21498 5102 21499\nf 21500 21499 4297\nf 5102 21498 18511\nf 21498 4296 21501\nf 18511 21501 5101\nf 2007 11641 21502\nf 11641 5103 18517\nf 21502 18517 3271\nf 4295 21503 11643\nf 21503 4297 21504\nf 11643 21504 5103\nf 4297 21503 21500\nf 21503 4295 18507\nf 21500 18507 4296\nf 4297 21505 21504\nf 21505 5104 18518\nf 21504 18518 5103\nf 4299 21506 21507\nf 21506 4859 11640\nf 21507 11640 3270\nf 3271 18519 21509\nf 18519 5104 21508\nf 21509 21508 2012\nf 5108 21510 11646\nf 21510 3275 20968\nf 11646 20968 5624\nf 4300 21511 21513\nf 21511 3276 21512\nf 21513 21512 5104\nf 4301 21514 21516\nf 21514 5105 21515\nf 21516 21515 3277\nf 4301 21517 21514\nf 21517 5107 15656\nf 21514 15656 5105\nf 5107 21517 20970\nf 21517 4301 21518\nf 20970 21518 3278\nf 4303 21519 11651\nf 21519 3276 21520\nf 11651 21520 3275\nf 3276 21519 15661\nf 21519 4303 11653\nf 15661 11653 4302\nf 3277 18538 21522\nf 18538 5110 21521\nf 21522 21521 4305\nf 5389 21523 21524\nf 21523 2015 11661\nf 21524 11661 3281\nf 5111 11663 18565\nf 11663 3282 20973\nf 18565 20973 4307\nf 4308 21525 21526\nf 21525 5112 15666\nf 21526 15666 3283\nf 3284 21527 21529\nf 21527 5113 21528\nf 21529 21528 3285\nf 5114 18573 11669\nf 18573 3285 21528\nf 11669 21528 5113\nf 3300 15707 20978\nf 15707 5115 18567\nf 20978 18567 3286\nf 5116 21530 21531\nf 21530 5117 18441\nf 21531 18441 3288\nf 3288 18585 21533\nf 18585 4311 21532\nf 21533 21532 5393\nf 5121 11673 21535\nf 11673 4310 21534\nf 21535 21534 4312\nf 4314 21536 21537\nf 21536 5121 21535\nf 21537 21535 4312\nf 5122 21538 21540\nf 21538 698 21539\nf 21540 21539 5123\nf 4864 15692 21542\nf 15692 4313 21541\nf 21542 21541 5125\nf 5642 18616 21544\nf 18616 5636 21543\nf 21544 21543 3294\nf 5127 18609 11683\nf 18609 4867 21545\nf 11683 21545 5126\nf 3313 21546 18607\nf 21546 5398 21547\nf 18607 21547 5639\nf 5128 11688 21549\nf 11688 5638 21548\nf 21549 21548 4317\nf 4866 21550 20982\nf 21550 4317 21548\nf 20982 21548 5638\nf 3296 21551 18599\nf 21551 5129 21552\nf 18599 21552 5637\nf 5129 21553 15700\nf 21553 3298 21554\nf 15700 21554 3295\nf 3298 21553 21555\nf 21553 5129 21551\nf 21555 21551 3296\nf 4318 20987 21556\nf 20987 5128 21549\nf 21556 21549 4317\nf 4318 21557 21559\nf 21557 5640 21558\nf 21559 21558 3299\nf 2022 21560 18615\nf 21560 3299 21558\nf 18615 21558 5640\nf 3295 21554 21562\nf 21554 3298 21561\nf 21562 21561 4864\nf 5642 21563 21564\nf 21563 4864 21561\nf 21564 21561 3298\nf 4318 21559 21566\nf 21559 3299 21565\nf 21566 21565 4314\nf 4319 21567 18625\nf 21567 5400 21568\nf 18625 21568 4320\nf 4871 18632 11692\nf 18632 2018 21569\nf 11692 21569 4308\nf 4870 11694 21571\nf 11694 5130 21570\nf 21571 21570 3304\nf 5631 21572 21573\nf 21572 2029 18627\nf 21573 18627 3301\nf 3303 18630 18631\nf 18630 5399 21574\nf 18631 21574 2018\nf 4871 7348 18633\nf 7348 4321 21575\nf 18633 21575 3303\nf 4321 7350 21577\nf 7350 3302 21576\nf 21577 21576 4322\nf 5132 21578 18635\nf 21578 5645 18639\nf 18635 18639 5131\nf 5407 21579 21580\nf 21579 4324 18654\nf 21580 18654 5134\nf 5133 21581 15713\nf 21581 5134 18656\nf 15713 18656 4323\nf 5135 18664 18650\nf 18664 140 6159\nf 18650 6159 139\nf 5136 18645 15721\nf 18645 5405 15716\nf 15721 15716 5406\nf 5856 21582 21584\nf 21582 5138 21583\nf 21584 21583 5857\nf 5137 21585 21587\nf 21585 5140 21586\nf 21587 21586 3307\nf 5652 21588 21590\nf 21588 4326 21589\nf 21590 21589 5857\nf 3307 21586 21592\nf 21586 5140 21591\nf 21592 21591 4327\nf 5141 21593 15722\nf 21593 3309 21594\nf 15722 21594 5140\nf 3308 21595 21597\nf 21595 5142 21596\nf 21597 21596 4326\nf 5142 21595 21598\nf 21595 3308 15725\nf 21598 15725 5408\nf 4327 21599 21600\nf 21599 5143 11702\nf 21600 11702 5859\nf 4331 21601 18688\nf 21601 3309 21602\nf 18688 21602 5146\nf 4865 11708 21603\nf 11708 4329 18684\nf 21603 18684 4331\nf 5147 21604 21606\nf 21604 2038 21605\nf 21606 21605 4330\nf 3311 21607 18689\nf 21607 4330 21605\nf 18689 21605 2038\nf 4331 18687 21609\nf 18687 5148 21608\nf 21609 21608 3313\nf 5411 21610 21612\nf 21610 5129 21611\nf 21612 21611 2024\n\nusemtl material_3\nf 5658 21613 21615\nf 21613 5149 21614\nf 21615 21614 5882\nf 5223 21616 21618\nf 21616 4334 21617\nf 21618 21617 4336\nf 5882 21619 21615\nf 21619 5883 18710\nf 21615 18710 5658\nf 5412 21620 18717\nf 21620 2042 21621\nf 18717 21621 5660\nf 5416 18721 18703\nf 18721 4339 21622\nf 18703 21622 4340\nf 4340 18746 11713\nf 18746 4879 21623\nf 11713 21623 4335\nf 5150 18709 21624\nf 18709 4335 21623\nf 21624 21623 4879\nf 4341 18734 18725\nf 18734 5660 21621\nf 18725 21621 2042\nf 5663 18732 21625\nf 18732 4341 18735\nf 21625 18735 4343\nf 3317 21012 21627\nf 21012 5934 21626\nf 21627 21626 5965\nf 4343 18736 18747\nf 18736 5151 21628\nf 18747 21628 5152\nf 3321 21629 21014\nf 21629 5153 21630\nf 21014 21630 3324\nf 4884 21631 21633\nf 21631 5884 21632\nf 21633 21632 3332\nf 3333 18743 21634\nf 18743 3318 15752\nf 21634 15752 4884\nf 5153 18753 21630\nf 18753 2048 21635\nf 21630 21635 3324\nf 3325 21636 18763\nf 21636 4345 18764\nf 18763 18764 5156\nf 3323 18740 21637\nf 18740 5154 7365\nf 21637 7365 3326\nf 5430 21638 21639\nf 21638 2051 18759\nf 21639 18759 5665\nf 4348 21640 21641\nf 21640 5672 21018\nf 21641 21018 5670\nf 3331 21642 21643\nf 21642 5157 18786\nf 21643 18786 3333\nf 5157 21642 21645\nf 21642 3331 21644\nf 21645 21644 5423\nf 5424 18778 21647\nf 18778 4349 21646\nf 21647 21646 5427\nf 5427 21646 21648\nf 21646 4349 18783\nf 21648 18783 4350\nf 5423 15777 21650\nf 15777 5158 21649\nf 21650 21649 4347\nf 3337 21651 21652\nf 21651 3334 11729\nf 21652 11729 4352\nf 712 21653 13625\nf 21653 5159 15773\nf 13625 15773 2054\nf 3340 21654 18792\nf 21654 5667 21655\nf 18792 21655 4346\nf 5161 21656 18806\nf 21656 5679 21657\nf 18806 21657 4354\nf 5162 21024 21658\nf 21024 4885 11758\nf 21658 11758 5688\nf 3338 21659 7372\nf 21659 714 12091\nf 7372 12091 715\nf 710 18815 7676\nf 18815 5163 7373\nf 7676 7373 715\nf 5679 18812 21661\nf 18812 2050 21660\nf 21661 21660 5164\nf 5422 21662 21663\nf 21662 5164 21660\nf 21663 21660 2050\nf 5165 11749 18820\nf 11749 3337 21664\nf 18820 21664 4357\nf 3344 15797 21666\nf 15797 3342 21665\nf 21666 21665 4887\nf 5684 21667 21669\nf 21667 5434 21668\nf 21669 21668 5952\nf 3343 21670 18829\nf 21670 5684 21671\nf 18829 21671 4358\nf 5952 21672 21674\nf 21672 5166 21673\nf 21674 21673 4359\nf 5683 18826 11752\nf 18826 4359 21673\nf 11752 21673 5166\nf 3349 21675 21677\nf 21675 5166 21676\nf 21677 21676 5434\nf 5166 21675 11750\nf 21675 3349 18840\nf 11750 18840 5168\nf 5885 21678 21680\nf 21678 5684 21679\nf 21680 21679 2059\nf 3349 21677 21682\nf 21677 5434 21681\nf 21682 21681 4360\nf 3350 21683 21684\nf 21683 5435 15805\nf 21684 15805 3348\nf 3391 21685 15875\nf 21685 5172 21686\nf 15875 21686 4360\nf 5172 21685 18843\nf 21685 3391 21687\nf 18843 21687 4903\nf 5173 21688 21690\nf 21688 5677 21689\nf 21690 21689 333\nf 441 21691 10222\nf 21691 5173 21690\nf 10222 21690 333\nf 3351 15807 21692\nf 15807 5176 18852\nf 21692 18852 4361\nf 4362 11742 21694\nf 11742 5160 21693\nf 21694 21693 4353\nf 5675 11740 11763\nf 11740 4362 18854\nf 11763 18854 5174\nf 3352 21032 21696\nf 21032 3353 21695\nf 21696 21695 3351\nf 4363 21697 21698\nf 21697 5690 18864\nf 21698 18864 5180\nf 4363 21699 21700\nf 21699 5178 18855\nf 21700 18855 4362\nf 3354 15813 21033\nf 15813 5179 21701\nf 21033 21701 3353\nf 5180 18872 21703\nf 18872 5181 21702\nf 21703 21702 5185\nf 4364 21704 21705\nf 21704 5178 21699\nf 21705 21699 4363\nf 5178 21704 18861\nf 21704 4364 21706\nf 18861 21706 5693\nf 5185 21707 21709\nf 21707 3357 21708\nf 21709 21708 4364\nf 5186 21710 21711\nf 21710 5184 18895\nf 21711 18895 2065\nf 5184 21710 21713\nf 21710 5186 21712\nf 21713 21712 5183\nf 4893 21714 11776\nf 21714 2065 21715\nf 11776 21715 5188\nf 3359 18901 21717\nf 18901 5439 21716\nf 21717 21716 3358\nf 5187 18878 21718\nf 18878 3358 21716\nf 21718 21716 5439\nf 2068 21719 18893\nf 21719 5189 21720\nf 18893 21720 5697\nf 4366 11783 21721\nf 11783 5190 18887\nf 21721 18887 5188\nf 4369 21050 21723\nf 21050 3362 21722\nf 21723 21722 3360\nf 4368 21724 21049\nf 21724 3361 21725\nf 21049 21725 3362\nf 5189 21726 21727\nf 21726 5191 21052\nf 21727 21052 3364\nf 5441 21728 21729\nf 21728 4368 18911\nf 21729 18911 5445\nf 4371 21730 21732\nf 21730 3366 21731\nf 21732 21731 5192\nf 3366 11791 21731\nf 11791 5194 21733\nf 21731 21733 5192\nf 3367 21734 21059\nf 21734 4896 21735\nf 21059 21735 4372\nf 5196 21054 11794\nf 21054 4896 21734\nf 11794 21734 3367\nf 5197 21736 21738\nf 21736 2072 21737\nf 21738 21737 5195\nf 5197 21739 21741\nf 21739 3371 21740\nf 21741 21740 2074\nf 3371 21739 21743\nf 21739 5197 21742\nf 21743 21742 3368\nf 4373 21744 11803\nf 21744 3370 21745\nf 11803 21745 5198\nf 5447 18948 21747\nf 18948 2075 21746\nf 21747 21746 3374\nf 2076 21748 21749\nf 21748 3372 15840\nf 21749 15840 3376\nf 3376 15835 21749\nf 15835 5203 21750\nf 21749 21750 2076\nf 4898 21751 21753\nf 21751 4373 21752\nf 21753 21752 2078\nf 4898 21754 21756\nf 21754 5204 21755\nf 21756 21755 3375\nf 3377 18965 15839\nf 18965 5719 21757\nf 15839 21757 3376\nf 4908 21758 21760\nf 21758 5205 21759\nf 21760 21759 4375\nf 3381 21761 18968\nf 21761 5206 15849\nf 18968 15849 2079\nf 2080 21762 21764\nf 21762 5450 21763\nf 21764 21763 5453\nf 4375 21765 21767\nf 21765 4377 21766\nf 21767 21766 4378\nf 4376 18976 21768\nf 18976 2080 7395\nf 21768 7395 5207\nf 5967 21769 21770\nf 21769 3386 18989\nf 21770 18989 3387\nf 3386 21771 18993\nf 21771 5207 7397\nf 18993 7397 3384\nf 3387 21772 21770\nf 21772 3383 21773\nf 21770 21773 5967\nf 3383 21772 11815\nf 21772 3387 21063\nf 11815 21063 5208\nf 4380 18995 21775\nf 18995 5209 21774\nf 21775 21774 4382\nf 4383 21776 11819\nf 21776 5210 15865\nf 11819 15865 3389\nf 4384 19016 21778\nf 19016 5211 21777\nf 21778 21777 2077\nf 5211 21779 18962\nf 21779 4385 18957\nf 18962 18957 2078\nf 3350 21780 21782\nf 21780 5212 21781\nf 21782 21781 4386\nf 5864 19025 21783\nf 19025 3393 11822\nf 21783 11822 2061\nf 3392 15872 21065\nf 15872 2083 21784\nf 21065 21784 4904\nf 2084 21785 21066\nf 21785 4389 15880\nf 21066 15880 3392\nf 5213 11830 11826\nf 11830 3397 21786\nf 11826 21786 3395\nf 5461 21787 21788\nf 21787 5214 19037\nf 21788 19037 4389\nf 3398 19040 21790\nf 19040 5724 21789\nf 21790 21789 4388\nf 4390 21068 19049\nf 21068 4905 21791\nf 19049 21791 3401\nf 4393 19068 19067\nf 19068 4392 19057\nf 19067 19057 4391\nf 4394 21792 21794\nf 21792 5216 21793\nf 21794 21793 5215\nf 5216 21792 21795\nf 21792 4394 19078\nf 21795 19078 5865\nf 3404 21796 21797\nf 21796 3408 21072\nf 21797 21072 3406\nf 5218 19070 15902\nf 19070 2087 21798\nf 15902 21798 5217\nf 3379 21799 21801\nf 21799 4395 21800\nf 21801 21800 5220\nf 5219 21802 21803\nf 21802 5727 19084\nf 21803 19084 5465\nf 4395 21804 11833\nf 21804 5728 19076\nf 11833 19076 4394\nf 5728 21804 21805\nf 21804 4395 21799\nf 21805 21799 3379\nf 3379 21801 19093\nf 21801 5220 15846\nf 19093 15846 4900\nf 5219 21806 21808\nf 21806 2091 21807\nf 21808 21807 5220\n\nusemtl material_1\nf 4396 19098 21809\nf 19098 4397 19100\nf 21809 19100 4334\nf 5222 21810 11841\nf 21810 4396 21811\nf 11841 21811 5223\nf 4334 21616 21809\nf 21616 5223 21811\nf 21809 21811 4396\nf 5224 21812 21813\nf 21812 5232 19099\nf 21813 19099 4396\nf 5232 21814 19097\nf 21814 5231 21815\nf 19097 21815 4397\nf 5730 21816 21817\nf 21816 5886 19101\nf 21817 19101 4397\nf 4399 21818 21819\nf 21818 5225 19111\nf 21819 19111 4205\nf 4399 21820 21818\nf 21820 4400 19113\nf 21818 19113 5225\nf 5226 19114 11846\nf 19114 4400 19115\nf 11846 19115 3413\nf 5227 21821 11853\nf 21821 5732 19123\nf 11853 19123 3414\nf 641 19118 7482\nf 19118 5228 19134\nf 7482 19134 749\nf 3421 11849 21823\nf 11849 5229 21822\nf 21823 21822 4404\nf 3419 21824 21826\nf 21824 3434 21825\nf 21826 21825 5737\nf 3421 7427 19144\nf 7427 3419 21827\nf 19144 21827 3422\nf 3417 21828 21830\nf 21828 2097 21829\nf 21830 21829 5470\nf 5224 21831 21812\nf 21831 4406 21832\nf 21812 21832 5232\nf 5741 21833 21835\nf 21833 5224 21834\nf 21835 21834 5233\nf 5224 21833 21831\nf 21833 5741 21836\nf 21831 21836 4406\nf 5868 21837 21838\nf 21837 4909 7417\nf 21838 7417 5234\nf 5235 19163 21840\nf 19163 4407 21839\nf 21840 21839 5236\nf 3423 21841 21842\nf 21841 5236 21839\nf 21842 21839 4407\nf 5869 21843 21845\nf 21843 5237 21844\nf 21845 21844 5867\nf 5238 21846 19172\nf 21846 2102 21847\nf 19172 21847 3424\nf 4409 21848 21850\nf 21848 5472 21849\nf 21850 21849 3423\nf 3425 21851 19183\nf 21851 4408 21852\nf 19183 21852 2103\nf 5239 21853 15925\nf 21853 2103 21852\nf 15925 21852 4408\nf 5280 21854 21855\nf 21854 2104 19185\nf 21855 19185 5743\nf 4413 21856 21857\nf 21856 5476 19233\nf 21857 19233 3428\nf 2108 19197 21859\nf 19197 5980 21858\nf 21859 21858 4414\nf 5964 19199 21860\nf 19199 5241 19208\nf 21860 19208 5750\nf 5750 21861 21863\nf 21861 3430 21862\nf 21863 21862 4414\nf 3430 15941 21865\nf 15941 5242 21864\nf 21865 21864 2108\nf 3430 21866 15939\nf 21866 3431 21867\nf 15939 21867 5249\nf 5245 21868 21869\nf 21868 5246 19216\nf 21869 19216 5754\nf 4416 21870 21871\nf 21870 5247 19206\nf 21871 19206 4415\nf 5248 21872 11875\nf 21872 5243 19207\nf 11875 19207 5247\nf 5250 21873 21874\nf 21873 5244 15942\nf 21874 15942 5249\nf 3434 21875 21825\nf 21875 2112 19149\nf 21825 19149 5737\nf 3416 21876 19230\nf 21876 4917 21877\nf 19230 21877 4916\nf 4920 19245 21879\nf 19245 3437 21878\nf 21879 21878 4413\nf 4419 21880 21882\nf 21880 5253 21881\nf 21882 21881 3427\nf 5253 21880 21884\nf 21880 4419 21883\nf 21884 21883 5254\nf 4420 21885 21887\nf 21885 5261 21886\nf 21887 21886 4419\nf 3437 21888 21889\nf 21888 5256 15951\nf 21889 15951 3436\nf 3438 19247 21890\nf 19247 5256 21888\nf 21890 21888 3437\nf 4420 21891 21893\nf 21891 5874 21892\nf 21893 21892 4421\nf 4422 21894 21895\nf 21894 5261 21885\nf 21895 21885 4420\nf 5261 21894 21897\nf 21894 4422 21896\nf 21897 21896 5260\nf 5478 21113 21898\nf 21113 3440 7435\nf 21898 7435 4921\nf 4921 21899 21901\nf 21899 5477 21900\nf 21901 21900 3438\nf 5266 19262 19256\nf 19262 5260 21896\nf 19256 21896 4422\nf 4421 21902 21904\nf 21902 4423 21903\nf 21904 21903 5262\nf 2116 21905 21907\nf 21905 3441 21906\nf 21907 21906 5481\nf 4922 21908 21110\nf 21908 5481 21906\nf 21110 21906 3441\nf 4424 21909 21911\nf 21909 4423 21910\nf 21911 21910 4425\nf 5264 21912 21913\nf 21912 5765 19278\nf 21913 19278 5263\nf 4424 21914 21915\nf 21914 5266 19258\nf 21915 19258 5262\nf 5266 21914 21916\nf 21914 4424 19268\nf 21916 19268 5265\nf 3442 15956 21917\nf 15956 5481 21908\nf 21917 21908 4922\nf 4426 21918 19282\nf 21918 5268 21919\nf 19282 21919 4425\nf 5268 21918 19274\nf 21918 4426 21920\nf 19274 21920 5764\nf 5876 21921 21922\nf 21921 5842 15957\nf 21922 15957 3442\nf 5269 21923 21925\nf 21923 3443 21924\nf 21925 21924 5270\nf 3443 21923 21116\nf 21923 5269 21926\nf 21116 21926 5842\nf 5271 21927 21928\nf 21927 4426 19281\nf 21928 19281 5769\nf 5271 21929 21931\nf 21929 4925 21930\nf 21931 21930 5764\nf 5768 11884 19292\nf 11884 5267 21932\nf 19292 21932 5273\nf 4427 21121 21933\nf 21121 5274 19314\nf 21933 19314 4428\nf 2120 21934 21936\nf 21934 5272 21935\nf 21936 21935 5484\nf 3447 19315 21938\nf 19315 5274 21937\nf 21938 21937 4429\nf 3445 21939 21941\nf 21939 5482 21940\nf 21941 21940 3443\nf 4429 19302 21942\nf 19302 2121 15971\nf 21942 15971 5486\nf 4428 19316 11894\nf 19316 3447 21943\nf 11894 21943 5275\nf 5275 21943 19329\nf 21943 3447 21944\nf 19329 21944 4431\nf 4432 19324 11893\nf 19324 5773 19309\nf 11893 19309 4428\nf 3449 21945 21946\nf 21945 3448 19335\nf 21946 19335 5277\nf 3471 16021 21947\nf 16021 5278 15975\nf 21947 15975 3449\nf 4411 21948 21950\nf 21948 5281 21949\nf 21950 21949 5887\nf 5281 21948 19342\nf 21948 4411 21951\nf 19342 21951 5778\nf 5279 19348 21952\nf 19348 2104 21854\nf 21952 21854 5280\nf 2125 19346 21954\nf 19346 5279 21953\nf 21954 21953 2126\nf 4928 21955 11899\nf 21955 3453 21956\nf 11899 21956 3452\nf 3453 21955 21957\nf 21955 4928 15929\nf 21957 15929 3450\nf 3455 21958 21960\nf 21958 5887 21959\nf 21960 21959 5282\nf 5887 21958 19354\nf 21958 3455 19367\nf 19354 19367 4434\nf 5781 21961 19364\nf 21961 3453 21962\nf 19364 21962 5283\nf 5284 15985 21964\nf 15985 2126 21963\nf 21964 21963 3456\nf 5285 15995 21966\nf 15995 2128 21965\nf 21966 21965 5286\nf 5285 21967 19373\nf 21967 4933 21968\nf 19373 21968 4438\nf 5783 21969 11901\nf 21969 2129 21970\nf 11901 21970 3456\nf 4933 21971 21968\nf 21971 4440 19370\nf 21968 19370 4438\nf 5286 21972 21966\nf 21972 4933 21967\nf 21966 21967 5285\nf 5287 19389 21974\nf 19389 3462 21973\nf 21974 21973 4439\nf 4441 21975 21976\nf 21975 5288 16004\nf 21976 16004 4440\nf 5787 21977 19384\nf 21977 5492 16005\nf 19384 16005 5288\nf 5497 21978 21149\nf 21978 4442 21979\nf 21149 21979 3465\nf 5291 21980 21981\nf 21980 2137 16017\nf 21981 16017 3467\nf 4937 21982 21143\nf 21982 5302 11913\nf 21143 11913 3470\nf 3469 19411 19412\nf 19411 5494 21983\nf 19412 21983 2145\nf 4444 21984 21985\nf 21984 5796 19420\nf 21985 19420 3469\nf 3470 11912 21986\nf 11912 3466 16020\nf 21986 16020 5495\nf 4444 21987 21989\nf 21987 4936 21988\nf 21989 21988 5295\nf 4445 21990 11914\nf 21990 5294 21991\nf 11914 21991 5794\nf 5295 21992 19424\nf 21992 5294 21990\nf 19424 21990 4445\nf 4432 11895 21994\nf 11895 5275 21993\nf 21994 21993 4445\nf 5797 19422 19328\nf 19422 4445 21993\nf 19328 21993 5275\nf 5790 21995 21996\nf 21995 3474 19392\nf 21996 19392 4935\nf 5296 11918 21997\nf 11918 4446 19393\nf 21997 19393 3474\nf 5298 16030 21999\nf 16030 5800 21998\nf 21999 21998 3473\nf 5799 22000 22001\nf 22000 4447 19447\nf 22001 19447 5830\nf 5501 22002 19443\nf 22002 5498 16012\nf 19443 16012 2141\nf 4448 22003 22004\nf 22003 3473 21998\nf 22004 21998 5800\nf 4448 22005 22006\nf 22005 5299 11921\nf 22006 11921 5297\nf 5299 22007 19488\nf 22007 3480 22008\nf 19488 22008 5507\nf 5302 22009 11911\nf 22009 5831 11929\nf 11911 11929 3466\nf 5302 22010 22012\nf 22010 4449 22011\nf 22012 22011 4451\nf 5304 19413 22014\nf 19413 2145 22013\nf 22014 22013 5305\nf 3478 22015 16048\nf 22015 5305 22013\nf 16048 22013 2145\nf 5307 19487 19475\nf 19487 4452 19459\nf 19475 19459 5306\nf 4943 22016 22017\nf 22016 5305 22015\nf 22017 22015 3478\nf 2151 22018 19477\nf 22018 2150 22019\nf 19477 22019 5308\nf 4455 22020 19480\nf 22020 5310 19491\nf 19480 19491 4453\nf 2149 22021 19470\nf 22021 3479 16051\nf 19470 16051 5505\nf 2144 19483 19451\nf 19483 3479 22022\nf 19451 22022 5509\nf 4944 11932 22023\nf 11932 5509 22022\nf 22023 22022 3479\nf 5309 22024 22025\nf 22024 5502 16040\nf 22025 16040 2150\nf 5310 22020 19493\nf 22020 4455 22026\nf 19493 22026 3476\n\nusemtl material_4\nf 5311 7516 22027\nf 7516 801 19695\nf 22027 19695 802\nf 729 22028 22029\nf 22028 5313 12061\nf 22029 12061 728\nf 5313 22028 12057\nf 22028 729 22030\nf 12057 22030 5312\nf 5312 22030 12055\nf 22030 729 22031\nf 12055 22031 730\nf 2183 12062 7555\nf 12062 5313 12056\nf 7555 12056 2182\nf 858 12181 12289\nf 12181 4947 12183\nf 12289 12183 2220\nf 2221 12182 7710\nf 12182 856 12150\nf 7710 12150 2209\nf 5314 12369 16095\nf 12369 871 19598\nf 16095 19598 4492\nf 5315 19611 12386\nf 19611 2250 22032\nf 12386 22032 5316\nf 3518 20099 16097\nf 20099 5316 22032\nf 16097 22032 2250\nf 5317 20049 22033\nf 20049 1016 20044\nf 22033 20044 4611\nf 5318 13294 13290\nf 13294 884 20089\nf 13290 20089 4624\nf 3644 13233 16239\nf 13233 3674 7999\nf 16239 7999 1024\nf 2647 8485 14420\nf 8485 5319 20179\nf 14420 20179 2468\nf 4948 13629 13641\nf 13629 2492 13638\nf 13641 13638 720\nf 718 13631 22034\nf 13631 4948 13640\nf 22034 13640 719\nf 3694 22035 20220\nf 22035 4949 8191\nf 20220 8191 1076\nf 5320 13660 8199\nf 13660 2502 13662\nf 8199 13662 736\nf 5320 8201 20181\nf 8201 3683 13646\nf 20181 13646 5808\nf 2521 20197 20198\nf 20197 1086 20232\nf 20198 20232 1087\nf 5321 13893 20222\nf 13893 2550 16314\nf 20222 16314 3713\nf 5322 16318 20227\nf 16318 2551 16316\nf 20227 16316 3714\nf 5323 22036 20282\nf 22036 1109 20776\nf 20282 20776 1108\nf 2641 20582 20583\nf 20582 3816 8445\nf 20583 8445 3817\nf 5325 16521 20290\nf 16521 2719 16519\nf 20290 16519 3891\n\nusemtl material_0\nf 1361 8953 14935\nf 8953 2753 16617\nf 14935 16617 2754\nf 2755 14940 16582\nf 14940 4950 8964\nf 16582 8964 1339\nf 1579 15151 17218\nf 15151 2892 22037\nf 17218 22037 5928\nf 1667 10288 6859\nf 10288 2914 6861\nf 6859 6861 1666\nf 547 21159 11071\nf 21159 4960 17575\nf 11071 17575 1802\n\nusemtl material_1\nf 4913 22038 21082\nf 22038 5330 15425\nf 21082 15425 1919\nf 5331 22039 22041\nf 22039 1923 22040\nf 22041 22040 5531\nf 3156 7322 22043\nf 7322 4845 22042\nf 22043 22042 4213\nf 5328 15434 15430\nf 15434 4213 22042\nf 15430 22042 4845\nf 1920 22044 15429\nf 22044 5329 22045\nf 15429 22045 5328\nf 5329 22044 22046\nf 22044 1920 11463\nf 22046 11463 4968\nf 1921 21181 22047\nf 21181 5329 22046\nf 22047 22046 4968\nf 5332 15435 22049\nf 15435 5328 22048\nf 22049 22048 1924\nf 1922 22050 18126\nf 22050 5330 22051\nf 18126 22051 1949\nf 4811 22052 22053\nf 22052 1949 22051\nf 22053 22051 5330\nf 4239 22054 20898\nf 22054 4811 20859\nf 20898 20859 3157\nf 4811 22054 22052\nf 22054 4239 18130\nf 22052 18130 1949\nf 1923 15426 22055\nf 15426 5330 22050\nf 22055 22050 1922\nf 4811 22053 15424\nf 22053 5330 22038\nf 15424 22038 4913\nf 5331 11458 22039\nf 11458 1919 15427\nf 22039 15427 1923\nf 5328 22045 22048\nf 22045 5329 15437\nf 22048 15437 1924\nf 3162 17969 11474\nf 17969 4216 21195\nf 11474 21195 5334\nf 1926 22056 17965\nf 22056 4976 22057\nf 17965 22057 5888\nf 4976 22056 21194\nf 22056 1926 17958\nf 21194 17958 5334\nf 5536 22058 22060\nf 22058 5889 22059\nf 22060 22059 4974\nf 5888 22061 22063\nf 22061 1927 22062\nf 22063 22062 5889\nf 4814 22064 22066\nf 22064 4975 22065\nf 22066 22065 1927\nf 4975 22064 22067\nf 22064 4814 20863\nf 22067 20863 3165\nf 3170 11480 22068\nf 11480 5335 21202\nf 22068 21202 4977\nf 3170 22069 11478\nf 22069 4814 22066\nf 11478 22066 1927\nf 4978 21207 15446\nf 21207 3169 21209\nf 15446 21209 3164\nf 5339 15456 22071\nf 15456 1931 22070\nf 22071 22070 5337\nf 4826 22072 21211\nf 22072 5336 22073\nf 21211 22073 3167\nf 3167 22073 20866\nf 22073 5336 22074\nf 20866 22074 3166\nf 1931 22075 22077\nf 22075 3168 22076\nf 22077 22076 3170\nf 3168 22075 22078\nf 22075 1931 15455\nf 22078 15455 1929\nf 4977 21205 22079\nf 21205 5337 22070\nf 22079 22070 1931\nf 3171 17986 22080\nf 17986 3166 22074\nf 22080 22074 5336\nf 4814 22069 17998\nf 22069 3170 22076\nf 17998 22076 3168\nf 3191 22081 22082\nf 22081 4994 15453\nf 22082 15453 3173\nf 1933 18003 20180\nf 18003 5338 22083\nf 20180 22083 653\nf 1929 22084 22086\nf 22084 1945 22085\nf 22086 22085 3172\nf 5337 22087 22071\nf 22087 4826 22088\nf 22071 22088 5339\nf 4826 22087 22072\nf 22087 5337 21204\nf 22072 21204 5336\nf 4982 15461 21214\nf 15461 3175 7296\nf 21214 7296 4224\nf 4982 11488 22090\nf 11488 207 22089\nf 22090 22089 51\nf 51 22091 22090\nf 22091 4995 15462\nf 22090 15462 4982\nf 1937 18095 22093\nf 18095 1935 22092\nf 22093 22092 5341\nf 4980 15468 22094\nf 15468 5341 22092\nf 22094 22092 1935\nf 3178 22095 20876\nf 22095 4983 22096\nf 20876 22096 3177\nf 1937 22093 22097\nf 22093 5341 18023\nf 22097 18023 3179\nf 4983 21225 22096\nf 21225 5340 15465\nf 22096 15465 3177\nf 1939 22098 15476\nf 22098 3179 18025\nf 15476 18025 5343\nf 3181 15474 18036\nf 15474 4983 22099\nf 18036 22099 4226\nf 1939 15475 22101\nf 15475 5344 22100\nf 22101 22100 1941\nf 5343 22102 15477\nf 22102 1938 21234\nf 15477 21234 5344\nf 1940 18044 18040\nf 18044 5345 18083\nf 18040 18083 4232\nf 1942 22103 18011\nf 22103 5346 22104\nf 18011 22104 5018\nf 4222 22105 18014\nf 22105 3185 22106\nf 18014 22106 4223\nf 5347 15479 15481\nf 15479 4223 22106\nf 15481 22106 3185\nf 4989 11500 21242\nf 11500 1942 21238\nf 21242 21238 5347\nf 4989 18069 11498\nf 18069 5349 22107\nf 11498 22107 1943\nf 3189 22108 22109\nf 22108 1943 22107\nf 22109 22107 5349\nf 5350 18087 15486\nf 18087 1941 22100\nf 15486 22100 5344\nf 3191 22110 20891\nf 22110 3172 22111\nf 20891 22111 3190\nf 4825 21251 7299\nf 21251 4232 21250\nf 7299 21250 1932\nf 5350 22112 18088\nf 22112 3172 22085\nf 18088 22085 1945\nf 4997 11508 21256\nf 11508 3176 22113\nf 21256 22113 1936\nf 3192 7301 18101\nf 7301 1936 21219\nf 18101 21219 5890\nf 4997 21259 11510\nf 21259 5572 22114\nf 11510 22114 3216\nf 5003 22115 15499\nf 22115 5000 21260\nf 15499 21260 1947\nf 5353 22116 22117\nf 22116 5002 15503\nf 22117 15503 3197\nf 3195 21244 21262\nf 21244 5553 21247\nf 21262 21247 3197\nf 5005 21274 15512\nf 21274 3198 21273\nf 15512 21273 1950\nf 1952 22118 11522\nf 22118 5354 18131\nf 11522 18131 4239\nf 1953 15520 18145\nf 15520 5007 22119\nf 18145 22119 1954\nf 1952 22120 22118\nf 22120 5007 15519\nf 22118 15519 5354\nf 5007 22121 22119\nf 22121 5891 22122\nf 22119 22122 1954\nf 1955 18146 22123\nf 18146 1954 18162\nf 22123 18162 1957\nf 4830 21286 15523\nf 21286 4245 22124\nf 15523 22124 5010\nf 3207 22125 22126\nf 22125 5010 22124\nf 22126 22124 4245\nf 3207 18164 18170\nf 18164 5563 22127\nf 18170 22127 1959\nf 1957 7306 22128\nf 7306 1959 22127\nf 22128 22127 5563\nf 5012 21294 22129\nf 21294 4246 21290\nf 22129 21290 5566\nf 1961 18181 22130\nf 18181 5355 15530\nf 22130 15530 5567\nf 1963 22131 11960\nf 22131 5013 21296\nf 11960 21296 663\nf 5013 22131 21299\nf 22131 1963 22132\nf 21299 22132 5356\nf 1964 22133 22135\nf 22133 1961 22134\nf 22135 22134 5357\nf 4832 18198 7316\nf 18198 3214 15544\nf 7316 15544 3212\nf 1964 22135 21301\nf 22135 5357 15541\nf 21301 15541 1965\nf 5567 18192 22136\nf 18192 5019 11539\nf 22136 11539 5357\nf 5017 22137 21304\nf 22137 3215 20903\nf 21304 20903 4833\nf 3215 22137 22139\nf 22137 5017 22138\nf 22139 22138 3213\nf 3215 22140 15460\nf 22140 5569 18049\nf 15460 18049 1934\nf 5018 22104 15540\nf 22104 5346 22141\nf 15540 22141 1965\nf 5569 21302 18050\nf 21302 1965 22141\nf 18050 22141 5346\nf 4834 22142 18217\nf 22142 3216 22114\nf 18217 22114 5572\nf 3218 20907 21311\nf 20907 1946 22143\nf 21311 22143 1966\nf 3222 22144 22146\nf 22144 3217 22145\nf 22146 22145 5358\nf 5023 22147 21308\nf 22147 5358 22148\nf 21308 22148 4235\nf 3220 22149 21314\nf 22149 5570 18226\nf 21314 18226 5573\nf 3222 22150 22152\nf 22150 5023 22151\nf 22152 22151 1967\nf 5023 22150 22147\nf 22150 3222 22146\nf 22147 22146 5358\nf 5024 22153 21310\nf 22153 5851 21316\nf 21310 21316 3218\nf 5026 22154 15547\nf 22154 1967 22151\nf 15547 22151 5023\nf 1967 22154 22155\nf 22154 5026 15555\nf 22155 15555 1968\nf 3224 15551 21322\nf 15551 5027 15550\nf 21322 15550 3223\nf 1969 22156 22158\nf 22156 5359 22157\nf 22158 22157 1970\nf 5033 21349 15558\nf 21349 5032 22159\nf 15558 22159 5359\nf 1970 22160 22161\nf 22160 5032 11551\nf 22161 11551 1971\nf 1971 11550 22162\nf 11550 5037 11555\nf 22162 11555 1972\nf 3226 20908 21342\nf 20908 3228 21353\nf 21342 21353 3227\nf 5580 22163 22164\nf 22163 5040 21368\nf 22164 21368 1975\nf 5360 18262 22166\nf 18262 1973 22165\nf 22166 22165 5580\nf 5042 15566 22167\nf 15566 4259 18267\nf 22167 18267 3233\nf 1976 18282 18270\nf 18282 3237 22168\nf 18270 22168 5043\nf 5361 22169 18272\nf 22169 3234 21381\nf 18272 21381 4838\nf 5044 21387 18284\nf 21387 5043 22168\nf 18284 22168 3237\nf 4261 21380 15569\nf 21380 3234 22170\nf 15569 22170 3236\nf 4264 18292 21390\nf 18292 1977 15571\nf 21390 15571 3235\nf 4840 22171 20919\nf 22171 5585 22172\nf 20919 22172 3238\nf 5364 21396 22174\nf 21396 3239 22173\nf 22174 22173 3240\nf 1978 15583 21392\nf 15583 3240 22173\nf 21392 22173 3239\nf 4266 15579 22175\nf 15579 5363 18290\nf 22175 18290 4264\nf 4264 21393 22175\nf 21393 5048 18298\nf 22175 18298 4266\nf 5050 22176 22178\nf 22176 3241 22177\nf 22178 22177 5904\n\nusemtl material_2\nf 3242 22179 22181\nf 22179 5365 22180\nf 22181 22180 5892\nf 5366 22182 22183\nf 22182 5892 22180\nf 22183 22180 5365\nf 3243 22184 22185\nf 22184 5817 7317\nf 22185 7317 3245\nf 3245 18309 22185\nf 18309 5591 22186\nf 22185 22186 3243\nf 3244 22187 22188\nf 22187 5367 11562\nf 22188 11562 3242\nf 4842 20924 22190\nf 20924 4841 22189\nf 22190 22189 5367\nf 5368 22191 22192\nf 22191 5367 22189\nf 22192 22189 4841\nf 5053 11563 22193\nf 11563 5367 22191\nf 22193 22191 5368\nf 1981 18311 22194\nf 18311 5817 18312\nf 22194 18312 1983\nf 1984 18330 22195\nf 18330 5370 18340\nf 22195 18340 3247\nf 5371 22196 15592\nf 22196 3248 22197\nf 15592 22197 4809\nf 3156 20852 7324\nf 20852 4809 22197\nf 7324 22197 3248\nf 3247 22198 22195\nf 22198 5372 22199\nf 22195 22199 1984\nf 4845 7321 20926\nf 7321 4843 15590\nf 20926 15590 4844\nf 1920 20928 21420\nf 20928 5372 22198\nf 21420 22198 3247\nf 1986 18347 15589\nf 18347 5372 20927\nf 15589 20927 4844\nf 5063 22200 15595\nf 22200 4276 18354\nf 15595 18354 4843\nf 5595 22201 22202\nf 22201 5060 18328\nf 22202 18328 1984\nf 3252 18362 7325\nf 18362 1987 18374\nf 7325 18374 4847\nf 1988 22203 22204\nf 22203 5374 18352\nf 22204 18352 4276\nf 5375 15608 22206\nf 15608 5598 22205\nf 22206 22205 5597\nf 159 22207 22209\nf 22207 5376 22208\nf 22209 22208 5599\nf 5376 22207 18368\nf 22207 159 6194\nf 18368 6194 158\nf 5598 22210 22205\nf 22210 4847 18371\nf 22205 18371 5597\nf 5067 11576 15601\nf 11576 3252 22211\nf 15601 22211 4281\nf 1989 22212 7327\nf 22212 4281 22211\nf 7327 22211 3252\nf 1990 18378 15609\nf 18378 5375 11580\nf 15609 11580 3253\nf 3255 15610 22213\nf 15610 3253 15605\nf 22213 15605 3254\nf 1991 22214 22216\nf 22214 5068 22215\nf 22216 22215 1992\nf 5074 15619 15614\nf 15619 1992 22215\nf 15614 22215 5068\nf 5075 11590 21446\nf 11590 1992 15618\nf 21446 15618 5377\nf 3256 22217 20940\nf 22217 5073 21439\nf 20940 21439 5602\nf 5073 22217 11586\nf 22217 3256 15615\nf 11586 15615 5377\nf 1993 11589 22218\nf 11589 5075 11615\nf 22218 11615 1994\nf 3258 18454 20943\nf 18454 5382 21470\nf 20943 21470 3257\nf 5075 21445 11616\nf 21445 3257 21469\nf 11616 21469 5086\nf 5378 22219 18435\nf 22219 3260 20948\nf 18435 20948 126\nf 5118 20945 22221\nf 20945 3259 22220\nf 22221 22220 5378\nf 5055 21414 22222\nf 21414 5081 21458\nf 22222 21458 5083\nf 1997 22223 22225\nf 22223 5056 22224\nf 22225 22224 1983\nf 5056 22223 21413\nf 22223 1997 15623\nf 21413 15623 5081\nf 1997 18427 22227\nf 18427 5949 22226\nf 22227 22226 5380\nf 5080 11609 21456\nf 11609 1998 22228\nf 21456 22228 5949\nf 1999 22229 22231\nf 22229 5380 22230\nf 22231 22230 3261\nf 3261 18445 22231\nf 18445 5381 18433\nf 22231 18433 1999\nf 5380 22232 22234\nf 22232 1998 22233\nf 22234 22233 5117\nf 1995 18442 20950\nf 18442 5117 22233\nf 20950 22233 1998\nf 3264 22235 21477\nf 22235 5090 22236\nf 21477 22236 4291\nf 5090 22235 15635\nf 22235 3264 22237\nf 15635 22237 5088\nf 2002 22238 8109\nf 22238 5089 22239\nf 8109 22239 688\nf 4856 22240 22241\nf 22240 5615 18459\nf 22241 18459 5950\nf 5091 22242 21480\nf 22242 5092 21481\nf 21480 21481 3265\nf 4855 22243 7339\nf 22243 5092 22244\nf 7339 22244 5614\nf 5091 11619 22242\nf 11619 5614 22244\nf 22242 22244 5092\nf 2003 11628 22246\nf 11628 5096 22245\nf 22246 22245 2005\nf 5097 22247 15638\nf 22247 5098 11630\nf 15638 11630 5096\nf 4858 20958 15648\nf 20958 3267 21495\nf 15648 21495 3269\nf 2006 22248 22249\nf 22248 5100 11633\nf 22249 11633 2005\nf 2006 18491 22250\nf 18491 5622 18503\nf 22250 18503 2008\nf 2006 22250 22248\nf 22250 2008 22251\nf 22248 22251 5100\nf 5385 21497 22252\nf 21497 5100 22251\nf 22252 22251 2008\nf 5385 18508 15643\nf 18508 2009 15645\nf 15643 15645 3269\nf 3270 15650 22254\nf 15650 4298 22253\nf 22254 22253 3272\nf 2009 18510 18515\nf 18510 5387 22255\nf 18515 22255 2011\nf 2010 15653 22256\nf 15653 5386 18520\nf 22256 18520 3273\nf 5105 15655 7340\nf 15655 3272 22257\nf 7340 22257 4860\nf 3274 20964 22259\nf 20964 2011 22258\nf 22259 22258 5388\nf 2011 22260 22258\nf 22260 3273 22261\nf 22258 22261 5388\nf 2011 22255 22260\nf 22255 5387 22262\nf 22260 22262 3273\nf 5388 22261 15659\nf 22261 3273 18522\nf 15659 18522 2013\nf 5625 18530 22263\nf 18530 3274 22259\nf 22263 22259 5388\nf 4302 22264 15662\nf 22264 2013 22265\nf 15662 22265 2012\nf 3276 15660 21512\nf 15660 2012 21508\nf 21512 21508 5104\nf 5110 18537 22267\nf 18537 5625 22266\nf 22267 22266 2014\nf 4301 22268 22270\nf 22268 4862 22269\nf 22270 22269 3280\nf 4862 22268 22271\nf 22268 4301 21516\nf 22271 21516 3277\nf 1253 22272 8618\nf 22272 5932 22273\nf 8618 22273 142\nf 4306 18555 18558\nf 18555 5390 22274\nf 18558 22274 3280\nf 4305 21521 22275\nf 21521 5110 15663\nf 22275 15663 5113\nf 2016 22276 22278\nf 22276 5391 22277\nf 22278 22277 2017\nf 5112 22279 15667\nf 22279 2017 22277\nf 15667 22277 5391\nf 3281 18548 21524\nf 18548 5391 22280\nf 21524 22280 5389\nf 4305 22281 22283\nf 22281 4863 22282\nf 22283 22282 4862\nf 2017 11667 22278\nf 11667 5113 15664\nf 22278 15664 2016\nf 3286 15668 20979\nf 15668 3284 22284\nf 20979 22284 4869\nf 4869 22284 20991\nf 22284 3284 21529\nf 20991 21529 3285\nf 5392 15672 18569\nf 15672 2017 22279\nf 18569 22279 5112\nf 5381 18444 22286\nf 18444 3287 22285\nf 22286 22285 5085\nf 5119 22287 22288\nf 22287 5085 22285\nf 22288 22285 3287\nf 5119 22288 15676\nf 22288 3287 22289\nf 15676 22289 3291\nf 3287 22290 22289\nf 22290 5116 18578\nf 22289 18578 3291\nf 5119 15678 15674\nf 15678 5396 22291\nf 15674 22291 3290\nf 5120 22292 15681\nf 22292 3292 22293\nf 15681 22293 5633\nf 3292 22292 22294\nf 22292 5120 15685\nf 22294 15685 3293\nf 5395 18590 22296\nf 18590 2019 22295\nf 22296 22295 5834\nf 5120 22297 15686\nf 22297 5125 21541\nf 15686 21541 4313\nf 5125 22297 22298\nf 22297 5120 15680\nf 22298 15680 3290\nf 3290 22291 22298\nf 22291 5396 18591\nf 22298 18591 5125\nf 2020 15688 22299\nf 15688 5397 18594\nf 22299 18594 2021\nf 5397 22300 22301\nf 22300 4311 11674\nf 22301 11674 5121\nf 5124 18596 18593\nf 18596 3295 22302\nf 18593 22302 5125\nf 4864 21542 21562\nf 21542 5125 22302\nf 21562 22302 3295\nf 2040 22303 15736\nf 22303 2024 11684\nf 15736 11684 5398\nf 2024 22304 11685\nf 22304 2027 18613\nf 11685 18613 2026\nf 2027 22304 15699\nf 22304 2024 21611\nf 15699 21611 5129\nf 3297 22305 20986\nf 22305 3298 21555\nf 20986 21555 3296\nf 5644 22306 15706\nf 22306 1543 22307\nf 15706 22307 5115\nf 1543 22306 6552\nf 22306 5644 22308\nf 6552 22308 18\nf 2028 18623 22310\nf 18623 5399 22309\nf 22310 22309 2031\nf 4320 22311 20995\nf 22311 5401 22312\nf 20995 22312 3302\nf 5401 22311 15712\nf 22311 4320 21568\nf 15712 21568 5400\nf 5401 15711 18634\nf 15711 5402 22313\nf 18634 22313 5132\nf 3302 22312 22314\nf 22312 5401 18636\nf 22314 18636 5131\nf 5404 18643 22315\nf 18643 3303 21575\nf 22315 21575 4321\nf 2032 22316 22318\nf 22316 5133 22317\nf 22318 22317 2031\nf 5130 18626 15715\nf 18626 2029 22319\nf 15715 22319 5133\nf 4322 22320 21577\nf 22320 5405 22321\nf 21577 22321 4321\nf 5405 22320 15717\nf 22320 4322 22322\nf 15717 22322 3305\nf 2033 22323 11695\nf 22323 5858 22324\nf 11695 22324 2035\nf 5858 22323 22325\nf 22323 2033 15719\nf 22325 15719 5406\nf 3306 22326 22327\nf 22326 5406 15718\nf 22327 15718 3305\nf 5407 15723 22328\nf 15723 5140 21585\nf 22328 21585 5137\nf 2036 22329 22331\nf 22329 5141 22330\nf 22331 22330 2035\nf 5407 22332 15724\nf 22332 2035 22330\nf 15724 22330 5141\nf 2036 18666 18677\nf 18666 5408 22333\nf 18677 22333 5147\nf 2037 18678 18683\nf 18678 5147 21606\nf 18683 21606 4330\nf 2039 18692 18679\nf 18692 5409 22334\nf 18679 22334 5145\nf 5410 22335 22336\nf 22335 5145 22334\nf 22336 22334 5409\nf 5146 18681 15731\nf 18681 4330 15733\nf 15731 15733 2040\nf 3311 18696 21607\nf 18696 5411 15734\nf 21607 15734 4330\nf 5398 21546 15737\nf 21546 3313 21608\nf 15737 21608 5148\n\nusemtl material_3\nf 5412 18716 15739\nf 18716 5414 22337\nf 15739 22337 2041\nf 5415 22338 22340\nf 22338 5413 22339\nf 22340 22339 4877\nf 5413 22338 15740\nf 22338 5415 22341\nf 15740 22341 5893\nf 5426 22342 22344\nf 22342 5884 22343\nf 22344 22343 5366\nf 3244 22345 22347\nf 22345 5892 22346\nf 22347 22346 4884\nf 3315 21010 22348\nf 21010 1979 20921\nf 22348 20921 5878\nf 4877 22339 22350\nf 22339 5413 22349\nf 22350 22349 5417\nf 5414 18718 22352\nf 18718 5660 22351\nf 22352 22351 2043\nf 4877 22350 22354\nf 22350 5417 22353\nf 22354 22353 3321\nf 2043 22355 22352\nf 22355 5413 15742\nf 22352 15742 5414\nf 5413 22355 22349\nf 22355 2043 15746\nf 22349 15746 5417\nf 3316 21009 22356\nf 21009 3315 18723\nf 22356 18723 5418\nf 5661 22357 22359\nf 22357 3320 22358\nf 22359 22358 4880\nf 3317 22360 21013\nf 22360 5661 22361\nf 21013 22361 4878\nf 3321 22362 21629\nf 22362 3319 22363\nf 21629 22363 5153\nf 3319 22362 15748\nf 22362 3321 22353\nf 15748 22353 5417\nf 3317 22364 22365\nf 22364 3322 11722\nf 22365 11722 3320\nf 5153 22363 22367\nf 22363 3319 22366\nf 22367 22366 2044\nf 4339 15761 22368\nf 15761 4350 18789\nf 22368 18789 4351\nf 4344 22369 22371\nf 22369 5420 22370\nf 22371 22370 4345\nf 5420 22369 18756\nf 22369 4344 22372\nf 18756 22372 5419\nf 2044 22373 22375\nf 22373 5421 22374\nf 22375 22374 3327\nf 5665 22376 18762\nf 22376 5421 22377\nf 18762 22377 3325\nf 2050 15770 21663\nf 15770 2048 18755\nf 21663 18755 5422\nf 4882 22378 15775\nf 22378 711 8168\nf 15775 8168 2054\nf 3336 22379 22381\nf 22379 3329 22380\nf 22381 22380 5159\nf 4882 15774 7370\nf 15774 5159 22380\nf 7370 22380 3329\nf 3330 22382 22384\nf 22382 4347 22383\nf 22384 22383 5424\nf 5672 18784 21016\nf 18784 4349 22385\nf 21016 22385 4881\nf 2052 18777 18779\nf 18777 4881 22385\nf 18779 22385 4349\nf 3329 11732 22387\nf 11732 4883 22386\nf 22387 22386 3332\nf 5427 22388 21647\nf 22388 3330 22384\nf 21647 22384 5424\nf 5425 22389 15782\nf 22389 3332 22386\nf 15782 22386 4883\nf 2053 18782 13616\nf 18782 5426 22390\nf 13616 22390 708\nf 5425 22391 22389\nf 22391 4884 21633\nf 22389 21633 3332\nf 2047 22392 18722\nf 22392 3330 22393\nf 18722 22393 5418\nf 5427 22394 22388\nf 22394 5418 22393\nf 22388 22393 3330\nf 2055 22395 22397\nf 22395 4347 22396\nf 22397 22396 5428\nf 5428 22398 22397\nf 22398 3341 22399\nf 22397 22399 2055\nf 3337 21652 21664\nf 21652 4352 18796\nf 21664 18796 4357\nf 3336 22400 22401\nf 22400 5429 18817\nf 22401 18817 4887\nf 5429 22400 22402\nf 22400 3336 22381\nf 22402 22381 5159\nf 3341 22398 22403\nf 22398 5428 21022\nf 22403 21022 5432\nf 5161 22404 15784\nf 22404 5160 22405\nf 15784 22405 4355\nf 5678 18810 22406\nf 18810 2051 21638\nf 22406 21638 5430\nf 4361 22407 22409\nf 22407 5430 22408\nf 22409 22408 3339\nf 4358 22410 15787\nf 22410 5431 21020\nf 15787 21020 3335\nf 3343 18828 22411\nf 18828 3341 22403\nf 22411 22403 5432\nf 3342 22412 18822\nf 22412 3345 15790\nf 18822 15790 5165\nf 719 22413 22034\nf 22413 5681 22414\nf 22034 22414 718\nf 3343 22415 22417\nf 22415 4889 22416\nf 22417 22416 2059\nf 5167 22418 15794\nf 22418 2060 22419\nf 15794 22419 4889\nf 5433 21029 15796\nf 21029 3345 22412\nf 15796 22412 3342\nf 2059 22416 18832\nf 22416 4889 22419\nf 18832 22419 2060\nf 5169 22420 22421\nf 22420 2060 22418\nf 22421 22418 5167\nf 3346 22422 21031\nf 22422 5170 15799\nf 21031 15799 3345\nf 5169 22421 18835\nf 22421 5167 15800\nf 18835 15800 5170\nf 3348 15804 22423\nf 15804 5171 18836\nf 22423 18836 5170\nf 3347 22424 22425\nf 22424 5169 15801\nf 22425 15801 2061\nf 5435 22426 15806\nf 22426 5864 22427\nf 15806 22427 5171\nf 5676 22428 22430\nf 22428 5176 22429\nf 22430 22429 5839\nf 5176 22428 18853\nf 22428 5676 22431\nf 18853 22431 5678\nf 2062 22432 22433\nf 22432 5839 15811\nf 22433 15811 2063\nf 3353 22434 21695\nf 22434 5175 15808\nf 21695 15808 3351\nf 5175 22434 11769\nf 22434 3353 21701\nf 11769 21701 5179\nf 5175 11768 15810\nf 11768 5436 15818\nf 15810 15818 2063\nf 4892 22435 22436\nf 22435 5436 11767\nf 22436 11767 5179\nf 4892 22437 22435\nf 22437 5437 22438\nf 22435 22438 5436\nf 5437 22439 22438\nf 22439 2064 15816\nf 22438 15816 5436\nf 2064 22439 18885\nf 22439 5437 22440\nf 18885 22440 3356\nf 4892 22441 21039\nf 22441 5182 11772\nf 21039 11772 5694\nf 3358 18880 21038\nf 18880 5437 22437\nf 21038 22437 4892\nf 4365 22442 21041\nf 22442 5438 22443\nf 21041 22443 3357\nf 724 22444 7573\nf 22444 5438 22445\nf 7573 22445 725\nf 5184 21713 22447\nf 21713 5183 22446\nf 22447 22446 2066\nf 2066 22448 22450\nf 22448 5187 22449\nf 22450 22449 2067\nf 5439 15821 21718\nf 15821 2067 22449\nf 21718 22449 5187\nf 3360 21722 21044\nf 21722 3362 18899\nf 21044 18899 3359\nf 4366 11780 18891\nf 11780 5189 21727\nf 18891 21727 3364\nf 2068 22451 22452\nf 22451 5440 11787\nf 22452 11787 4370\nf 5194 22453 22455\nf 22453 5442 22454\nf 22455 22454 3365\nf 5191 22456 15827\nf 22456 4370 22457\nf 15827 22457 5443\nf 2071 18916 22458\nf 18916 5443 22457\nf 22458 22457 4370\nf 2071 22459 22461\nf 22459 5445 22460\nf 22461 22460 2072\nf 5195 21737 22462\nf 21737 2072 22460\nf 22462 22460 5445\nf 5444 22463 18913\nf 22463 5195 22462\nf 18913 22462 5445\nf 5938 22464 22466\nf 22464 5197 22465\nf 22466 22465 2073\nf 2073 22465 18930\nf 22465 5197 21741\nf 18930 21741 2074\nf 3368 22467 11793\nf 22467 5195 22468\nf 11793 22468 5196\nf 5195 22467 21738\nf 22467 3368 21742\nf 21738 21742 5197\nf 5198 22469 11801\nf 22469 3369 22470\nf 11801 22470 2075\nf 5446 22471 22472\nf 22471 2075 22470\nf 22472 22470 3369\nf 5704 22473 15833\nf 22473 5202 22474\nf 15833 22474 3372\nf 3374 22475 18931\nf 22475 5446 18928\nf 18931 18928 2074\nf 3371 15834 22476\nf 15834 3372 21748\nf 22476 21748 2076\nf 454 18954 17247\nf 18954 5201 22477\nf 17247 22477 453\nf 3374 22478 22480\nf 22478 5203 22479\nf 22480 22479 2077\nf 5203 22478 21750\nf 22478 3374 18933\nf 21750 18933 2076\nf 4373 18949 21752\nf 18949 5447 18963\nf 21752 18963 2078\nf 5448 22481 15837\nf 22481 2077 22479\nf 15837 22479 5203\nf 5719 22482 21757\nf 22482 5448 15836\nf 21757 15836 3376\nf 4899 22483 22484\nf 22483 5204 18958\nf 22484 18958 4385\nf 5220 21807 15847\nf 21807 2091 22485\nf 15847 22485 3380\nf 5450 22486 19096\nf 22486 2091 22487\nf 19096 22487 5451\nf 2091 22486 22485\nf 22486 5450 22488\nf 22485 22488 3380\nf 5206 21761 18977\nf 21761 3381 22489\nf 18977 22489 5713\nf 3381 7394 22490\nf 7394 4375 21767\nf 22490 21767 4378\nf 91 16576 11814\nf 16576 93 18980\nf 11814 18980 3383\nf 5453 21763 15852\nf 21763 5450 19095\nf 15852 19095 5206\nf 3384 7396 18991\nf 7396 2080 21764\nf 18991 21764 5453\nf 2082 22491 22492\nf 22491 3382 18984\nf 22492 18984 5715\nf 5454 19001 18998\nf 19001 5455 11820\nf 18998 11820 3389\nf 3392 15882 15873\nf 15882 5459 19023\nf 15873 19023 5456\nf 5457 18850 22493\nf 18850 2083 15871\nf 22493 15871 5456\nf 5458 19032 11756\nf 19032 100 6098\nf 11756 6098 102\nf 4904 21784 22494\nf 21784 2083 11823\nf 22494 11823 3393\nf 4388 22495 19039\nf 22495 5459 15881\nf 19039 15881 4389\nf 5459 22495 22497\nf 22495 4388 22496\nf 22497 22496 3394\nf 5213 22498 11828\nf 22498 3399 15897\nf 11828 15897 5927\nf 5461 19044 21787\nf 19044 4391 19059\nf 21787 19059 5214\nf 2086 22499 19064\nf 22499 2085 22500\nf 19064 22500 5463\nf 5462 19056 19035\nf 19056 5463 22500\nf 19035 22500 2085\nf 3402 22501 15899\nf 22501 3399 15891\nf 15899 15891 3400\nf 5217 21798 15901\nf 21798 2087 22502\nf 15901 22502 3402\nf 2089 22503 22504\nf 22503 5218 19087\nf 22504 19087 2090\nf 3406 22505 21797\nf 22505 5217 15900\nf 21797 15900 3404\nf 5217 22505 15903\nf 22505 3406 22506\nf 15903 22506 5729\nf 2090 19081 22504\nf 19081 5465 19083\nf 22504 19083 2089\nf 2079 15851 19086\nf 15851 5451 19079\nf 19086 19079 2090\n\nusemtl material_1\nf 3409 22507 22509\nf 22507 5415 22508\nf 22509 22508 4910\nf 5415 22507 22341\nf 22507 3409 22510\nf 22341 22510 5893\nf 5222 22511 22513\nf 22511 5466 22512\nf 22513 22512 5233\nf 2092 19104 22515\nf 19104 5466 22514\nf 22515 22514 3409\nf 5740 19164 21077\nf 19164 5235 22516\nf 21077 22516 4910\nf 3409 22509 22515\nf 22509 4910 22517\nf 22515 22517 2092\nf 5466 22518 22514\nf 22518 2041 22519\nf 22514 22519 3409\nf 2093 15908 22521\nf 15908 5467 22520\nf 22521 22520 3412\nf 3411 22522 22523\nf 22522 5468 19131\nf 22523 19131 2094\nf 5468 22522 15910\nf 22522 3411 22524\nf 15910 22524 5467\nf 3155 7422 21080\nf 7422 4912 19121\nf 21080 19121 3410\nf 5467 22524 15915\nf 22524 3411 21083\nf 15915 21083 1919\nf 4401 11847 19129\nf 11847 3413 22525\nf 19129 22525 4402\nf 5227 15919 21821\nf 15919 3410 19120\nf 21821 19120 5732\nf 3416 22526 22528\nf 22526 3420 22527\nf 22528 22527 4405\nf 3420 22526 22529\nf 22526 3416 19229\nf 22529 19229 5756\nf 3418 22530 22532\nf 22530 4914 22531\nf 22532 22531 5470\nf 3421 21823 7425\nf 21823 4404 21104\nf 7425 21104 5230\nf 2099 22533 22534\nf 22533 3418 22532\nf 22534 22532 5470\nf 2097 21828 19125\nf 21828 3417 15922\nf 19125 15922 3414\nf 2099 22534 22536\nf 22534 5470 22535\nf 22536 22535 2096\nf 2100 22537 7414\nf 22537 5234 22538\nf 7414 22538 5982\nf 2101 11860 22540\nf 11860 5829 22539\nf 22540 22539 2102\nf 4915 22541 22542\nf 22541 2102 22539\nf 22542 22539 5829\nf 5237 22543 22545\nf 22543 3425 22544\nf 22545 22544 5471\nf 3425 22543 22546\nf 22543 5237 21843\nf 22546 21843 5869\nf 5472 22547 22549\nf 22547 4410 22548\nf 22549 22548 5743\nf 4410 22547 22550\nf 22547 5472 21848\nf 22550 21848 4409\nf 5238 19174 15927\nf 19174 5488 19188\nf 15927 19188 5239\nf 5757 22551 19240\nf 22551 4412 22552\nf 19240 22552 4918\nf 4918 22552 22553\nf 22552 4412 19194\nf 22553 19194 5747\nf 5894 22554 22555\nf 22554 5872 19202\nf 22555 19202 2106\nf 3429 22556 15935\nf 22556 3428 22557\nf 15935 22557 4415\nf 2107 15931 19201\nf 15931 5473 22558\nf 19201 22558 2106\nf 2107 22559 19204\nf 22559 5474 22560\nf 19204 22560 2109\nf 5747 22561 22562\nf 22561 5242 15938\nf 22562 15938 5474\nf 2109 22560 19220\nf 22560 5474 11869\nf 19220 11869 2110\nf 2111 22563 22564\nf 22563 5244 21873\nf 22564 21873 5250\nf 5244 22563 11868\nf 22563 2111 22565\nf 11868 22565 2110\nf 5475 19227 22566\nf 19227 2111 22564\nf 22566 22564 5250\nf 3432 22567 22568\nf 22567 5249 21867\nf 22568 21867 3431\nf 5249 22567 21874\nf 22567 3432 15943\nf 21874 15943 5250\nf 5230 15946 22570\nf 15946 4418 22569\nf 22570 22569 3434\nf 4914 22530 22572\nf 22530 3418 22571\nf 22572 22571 5475\nf 2112 19228 19150\nf 19228 5475 22571\nf 19150 22571 3418\nf 761 7656 22573\nf 7656 2105 19189\nf 22573 19189 5253\nf 4419 21882 21106\nf 21882 3427 22574\nf 21106 22574 5980\nf 5894 22575 22577\nf 22575 5255 22576\nf 22577 22576 2113\nf 5255 22578 15950\nf 22578 2106 22579\nf 15950 22579 5476\nf 3436 15948 22580\nf 15948 5476 21856\nf 22580 21856 4413\nf 5895 22581 22583\nf 22581 5255 22582\nf 22583 22582 2114\nf 5255 15952 22582\nf 15952 5256 22584\nf 22582 22584 2114\nf 5895 22583 22586\nf 22583 2114 22585\nf 22586 22585 5896\nf 5479 22587 22589\nf 22587 5259 22588\nf 22589 22588 5477\nf 5259 22587 22591\nf 22587 5479 22590\nf 22591 22590 2114\nf 3438 21900 19248\nf 21900 5477 22588\nf 19248 22588 5259\nf 4922 21109 7434\nf 21109 5477 21899\nf 7434 21899 4921\nf 1624 22592 11879\nf 22592 5478 22593\nf 11879 22593 5875\nf 3439 22594 22596\nf 22594 5896 22595\nf 22596 22595 5480\nf 5479 22597 22598\nf 22597 5480 22595\nf 22598 22595 5896\nf 5480 22599 15954\nf 22599 3441 21905\nf 15954 21905 2116\nf 2116 22600 22602\nf 22600 5269 22601\nf 22602 22601 2117\nf 5269 22600 22603\nf 22600 2116 21907\nf 22603 21907 5481\nf 2117 22601 11888\nf 22601 5269 21925\nf 11888 21925 5270\nf 2118 11889 22604\nf 11889 5270 19295\nf 22604 19295 2119\nf 5272 21934 22606\nf 21934 2120 22605\nf 22606 22605 5271\nf 5483 22607 22608\nf 22607 5770 19298\nf 22608 19298 1627\nf 2121 19304 22610\nf 19304 5484 22609\nf 22610 22609 2119\nf 5482 21939 22611\nf 21939 3445 11890\nf 22611 11890 2122\nf 2122 19313 22611\nf 19313 5485 15962\nf 22611 15962 5482\nf 3447 21938 22613\nf 21938 4429 22612\nf 22613 22612 5776\nf 5486 22614 21942\nf 22614 5776 22612\nf 21942 22612 4429\nf 3449 15976 21945\nf 15976 5487 22615\nf 21945 22615 3448\nf 3448 22615 19317\nf 22615 5487 19311\nf 19317 19311 2122\nf 2124 15968 19427\nf 15968 2123 22616\nf 19427 22616 2139\nf 5278 22617 15974\nf 22617 2139 22616\nf 15974 22616 2123\nf 3450 22618 22619\nf 22618 5239 19187\nf 22619 19187 5489\nf 5239 22618 21853\nf 22618 3450 15928\nf 21853 15928 2103\nf 3450 22620 21957\nf 22620 5490 22621\nf 21957 22621 3453\nf 5490 22620 15982\nf 22620 3450 22619\nf 15982 22619 5489\nf 2125 15980 19347\nf 15980 5489 15977\nf 19347 15977 2104\nf 5283 19358 15994\nf 19358 4437 22622\nf 15994 22622 2128\nf 2129 16002 21970\nf 16002 5284 21964\nf 21970 21964 3456\nf 5491 16000 22624\nf 16000 2129 22623\nf 22624 22623 5784\nf 5491 22625 16001\nf 22625 2128 22626\nf 16001 22626 5284\nf 2128 22625 21965\nf 22625 5491 22627\nf 21965 22627 5286\nf 4441 21976 22628\nf 21976 4440 21971\nf 22628 21971 4933\nf 339 19374 22629\nf 19374 5492 21977\nf 22629 21977 5787\nf 5787 22630 22629\nf 22630 1633 10077\nf 22629 10077 339\nf 3460 22631 11907\nf 22631 5493 22632\nf 11907 22632 5286\nf 2132 19381 21134\nf 19381 5784 22633\nf 21134 22633 2130\nf 3464 16007 22634\nf 16007 3462 19391\nf 22634 19391 3463\nf 2133 22635 22637\nf 22635 5788 22636\nf 22637 22636 2135\nf 5290 22638 16011\nf 22638 2135 22636\nf 16011 22636 5788\nf 3464 22639 16008\nf 22639 5290 16010\nf 16008 16010 2132\nf 5791 22640 22641\nf 22640 5497 19435\nf 22641 19435 4447\nf 2140 22642 19441\nf 22642 2135 22643\nf 19441 22643 5498\nf 5290 16013 22638\nf 16013 5498 22643\nf 22638 22643 2135\nf 2136 22644 19408\nf 22644 5494 22645\nf 19408 22645 4443\nf 774 7637 22646\nf 7637 2137 21980\nf 22646 21980 5291\nf 5292 22647 16019\nf 22647 2138 22648\nf 16019 22648 5495\nf 2138 22647 22649\nf 22647 5292 19406\nf 22649 19406 4443\nf 3469 7448 21985\nf 7448 4936 21987\nf 21985 21987 4444\nf 3470 21986 21146\nf 21986 5495 16022\nf 21146 16022 3471\nf 2139 22617 22651\nf 22617 5278 22650\nf 22651 22650 2138\nf 5495 22648 16023\nf 22648 2138 22650\nf 16023 22650 5278\nf 5496 21145 16025\nf 21145 3471 22652\nf 16025 22652 5277\nf 3449 21946 21947\nf 21946 5277 22652\nf 21947 22652 3471\nf 2142 16029 7464\nf 16029 5499 19432\nf 7464 19432 773\nf 5500 22653 19446\nf 22653 3474 22654\nf 19446 22654 5499\nf 5296 21997 22655\nf 21997 3474 22653\nf 22655 22653 5500\nf 5298 22656 16031\nf 22656 2140 22657\nf 16031 22657 5300\nf 2143 22658 19440\nf 22658 5300 22657\nf 19440 22657 2140\nf 5501 19444 16037\nf 19444 4938 22659\nf 16037 22659 5502\nf 3476 16041 22660\nf 16041 5502 22659\nf 22660 22659 4938\nf 5309 22661 22024\nf 22661 2143 16038\nf 22024 16038 5502\nf 2143 22661 22662\nf 22661 5309 11936\nf 22662 11936 5508\nf 5291 21981 16043\nf 21981 3467 22663\nf 16043 22663 4941\nf 5503 22664 22665\nf 22664 2145 21983\nf 22665 21983 5494\nf 2145 22664 16049\nf 22664 5503 22666\nf 16049 22666 5504\nf 5504 22666 22667\nf 22666 5503 16046\nf 22667 16046 2147\nf 4943 22017 22669\nf 22017 3478 22668\nf 22669 22668 5308\nf 5504 19478 16050\nf 19478 5308 22668\nf 16050 22668 3478\nf 2147 19474 22670\nf 19474 5505 16053\nf 22670 16053 4454\nf 1630 22671 6760\nf 22671 5506 22672\nf 6760 22672 416\nf 5506 22671 16056\nf 22671 1630 22673\nf 16056 22673 5507\nf 2151 22674 11935\nf 22674 4454 22675\nf 11935 22675 5508\nf 5508 22675 22676\nf 22675 4454 19484\nf 22676 19484 2144\n\nusemtl material_4\nf 2228 7728 7730\nf 7728 4946 7574\nf 7730 7574 838\nf 5510 16080 19542\nf 16080 3500 12261\nf 19542 12261 2236\nf 5314 16094 19602\nf 16094 3516 12371\nf 19602 12371 4493\nf 5315 12385 16100\nf 12385 3519 19612\nf 16100 19612 2251\nf 5318 16248 20092\nf 16248 3652 13296\nf 20092 13296 4625\nf 5513 16347 13992\nf 16347 3733 20326\nf 13992 20326 4694\nf 5514 16440 14354\nf 16440 1157 8358\nf 14354 8358 1159\nf 3814 14381 20581\nf 14381 5324 8446\nf 20581 8446 3816\nf 2600 16395 20443\nf 16395 1171 20444\nf 20443 20444 3770\n\nusemtl material_0\nf 5516 8671 16683\nf 8671 3966 9092\nf 16683 9092 2768\nf 1414 16735 14988\nf 16735 4951 9184\nf 14988 9184 2779\nf 5516 16999 8672\nf 16999 2837 16996\nf 8672 16996 67\nf 5517 17044 17127\nf 17044 4057 9771\nf 17127 9771 300\nf 5518 17092 9820\nf 17092 4067 17091\nf 9820 17091 4065\nf 4955 17169 9835\nf 17169 5821 17100\nf 9835 17100 2861\nf 5519 9841 17171\nf 9841 2862 17115\nf 17171 17115 320\nf 4956 15103 9844\nf 15103 1535 17109\nf 9844 17109 4070\nf 5517 17126 17128\nf 17126 2865 9885\nf 17128 9885 2864\nf 318 17111 17105\nf 17111 5519 9946\nf 17105 9946 4089\nf 464 17263 15173\nf 17263 1662 17257\nf 15173 17257 2910\nf 5327 17273 15180\nf 17273 5520 15192\nf 15180 15192 1672\nf 5520 17296 22677\nf 17296 4122 11444\nf 22677 11444 472\nf 5520 22677 15193\nf 22677 472 17912\nf 15193 17912 2924\nf 5521 17345 17343\nf 17345 1693 10676\nf 17343 10676 487\nf 1693 17344 17471\nf 17344 2937 10392\nf 17471 10392 2988\nf 2957 17400 17381\nf 17400 5522 22678\nf 17381 22678 1717\nf 5522 15220 22678\nf 15220 2956 10517\nf 22678 10517 1717\nf 1692 17419 17347\nf 17419 4958 10399\nf 17347 10399 2937\nf 3142 17234 17892\nf 17234 1587 17894\nf 17892 17894 1914\nf 3008 17573 17560\nf 17573 1788 17572\nf 17560 17572 1775\nf 5523 17674 17671\nf 17674 350 10088\nf 17671 10088 1591\nf 5523 22679 17675\nf 22679 586 22680\nf 17675 22680 5524\nf 586 22679 17633\nf 22679 5523 15285\nf 17633 15285 1820\nf 5524 22680 10950\nf 22680 586 17635\nf 10950 17635 4151\nf 4962 17889 17857\nf 17889 617 15387\nf 17857 15387 616\nf 4963 11449 21160\nf 11449 3045 17583\nf 21160 17583 568\n\nusemtl material_1\nf 5531 22681 22041\nf 22681 5847 17939\nf 22041 17939 5331\nf 384 22682 22683\nf 22682 5525 11455\nf 22683 11455 4965\nf 384 22683 6694\nf 22683 4965 22684\nf 6694 22684 385\nf 28 22685 17920\nf 22685 27 22686\nf 17920 22686 5526\nf 5526 17932 17921\nf 17932 5528 22687\nf 17921 22687 5527\nf 5527 22687 18337\nf 22687 5528 17930\nf 18337 17930 4207\nf 4206 17923 15431\nf 17923 4208 22688\nf 15431 22688 5529\nf 5526 22686 17929\nf 22686 27 8776\nf 17929 8776 31\nf 4969 22689 21162\nf 22689 5528 17933\nf 21162 17933 5846\nf 4968 15432 22047\nf 15432 5529 17943\nf 22047 17943 1921\nf 4209 17947 21166\nf 17947 5529 22688\nf 21166 22688 4208\nf 342 22690 6604\nf 22690 4970 11465\nf 6604 11465 343\nf 4970 22690 17938\nf 22690 342 22691\nf 17938 22691 4212\nf 1922 22692 22693\nf 22692 1950 18127\nf 22693 18127 5531\nf 5530 22694 22696\nf 22694 4211 22695\nf 22696 22695 5847\nf 343 11464 11189\nf 11464 5532 22697\nf 11189 22697 380\nf 4238 18122 22698\nf 18122 5532 21173\nf 22698 21173 4211\nf 1922 22693 22055\nf 22693 5531 22040\nf 22055 22040 1923\nf 4210 17936 21174\nf 17936 4212 22699\nf 21174 22699 4964\nf 385 22700 6699\nf 22700 4212 22691\nf 6699 22691 342\nf 4212 22700 22701\nf 22700 385 22684\nf 22701 22684 4965\nf 4212 22701 22699\nf 22701 4965 11457\nf 22699 11457 4964\nf 4969 17934 21168\nf 17934 32 21176\nf 21168 21176 4972\nf 4209 21167 17948\nf 21167 4972 22702\nf 17948 22702 3160\nf 5529 17946 17944\nf 17946 4812 15443\nf 17944 15443 3159\nf 4214 11472 21183\nf 11472 5533 22703\nf 21183 22703 5877\nf 5534 22704 17951\nf 22704 1924 15439\nf 17951 15439 5333\nf 5332 22705 17953\nf 22705 5534 17955\nf 17953 17955 1925\nf 5535 21188 21177\nf 21188 3160 22702\nf 21177 22702 4972\nf 5534 22705 22704\nf 22705 5332 22049\nf 22704 22049 1924\nf 5534 17950 17956\nf 17950 1926 17967\nf 17956 17967 5536\nf 3159 17959 21179\nf 17959 1926 17949\nf 21179 17949 5333\nf 4215 17962 17977\nf 17962 3161 17954\nf 17977 17954 1925\nf 1925 17957 17978\nf 17957 5536 22060\nf 17978 22060 4974\nf 5535 21178 22706\nf 21178 34 17971\nf 22706 17971 5849\nf 3162 21187 17970\nf 21187 5535 22707\nf 17970 22707 5538\nf 5537 22708 17964\nf 22708 644 21189\nf 17964 21189 4973\nf 3163 22709 22710\nf 22709 5537 17963\nf 22710 17963 5848\nf 5537 22709 22711\nf 22709 3163 20861\nf 22711 20861 4813\nf 5536 17966 22058\nf 17966 5888 22063\nf 22058 22063 5889\nf 4216 17968 22713\nf 17968 5538 22712\nf 22713 22712 4218\nf 39 8639 17972\nf 8639 38 17979\nf 17972 17979 5849\nf 644 22714 14405\nf 22714 5539 22715\nf 14405 22715 1928\nf 5539 22714 22716\nf 22714 644 22708\nf 22716 22708 5537\nf 5879 21197 17975\nf 21197 3164 20862\nf 17975 20862 3163\nf 5539 22716 7289\nf 22716 5537 22711\nf 7289 22711 4813\nf 5540 21201 22718\nf 21201 5335 22717\nf 22718 22717 5888\nf 5539 15445 22715\nf 15445 645 8479\nf 22715 8479 1928\nf 1927 22061 11479\nf 22061 5888 22717\nf 11479 22717 5335\nf 3171 21199 15450\nf 21199 5540 17983\nf 15450 17983 4217\nf 4219 15451 22720\nf 15451 4217 22719\nf 22720 22719 4218\nf 4218 22721 22723\nf 22721 5897 22722\nf 22723 22722 5541\nf 4218 22723 22720\nf 22723 5541 22724\nf 22720 22724 4219\nf 3170 22068 22077\nf 22068 4977 22079\nf 22077 22079 1931\nf 41 22725 8648\nf 22725 5542 22726\nf 8648 22726 1264\nf 4817 22727 20870\nf 22727 1264 22726\nf 20870 22726 5542\nf 1929 20869 22078\nf 20869 5543 22728\nf 22078 22728 3168\nf 4978 17999 17992\nf 17999 3168 22728\nf 17992 22728 5543\nf 5971 22729 22730\nf 22729 4817 17994\nf 22730 17994 5541\nf 4817 22731 22727\nf 22731 26 8645\nf 22727 8645 1264\nf 3166 22732 20864\nf 22732 4816 7293\nf 20864 7293 4815\nf 4816 22732 22733\nf 22732 3166 17985\nf 22733 17985 4219\nf 4220 18004 21208\nf 18004 5544 17996\nf 21208 17996 3169\nf 1930 22734 13532\nf 22734 5544 11482\nf 13532 11482 646\nf 645 15444 13463\nf 15444 5545 22735\nf 13463 22735 1930\nf 5544 22734 17997\nf 22734 1930 22735\nf 17997 22735 5545\nf 4219 22724 22733\nf 22724 5541 17993\nf 22733 17993 4816\nf 4977 21203 21206\nf 21203 3171 22080\nf 21206 22080 5336\nf 3169 17995 21210\nf 17995 5545 7290\nf 21210 7290 4813\nf 1929 15457 22084\nf 15457 5339 22736\nf 22084 22736 1945\nf 3173 22737 22738\nf 22737 5543 20868\nf 22738 20868 5935\nf 4979 21213 18002\nf 21213 3173 15452\nf 18002 15452 5338\nf 646 11481 13536\nf 11481 4979 18001\nf 13536 18001 1933\nf 4220 17990 21212\nf 17990 5543 22737\nf 21212 22737 3173\nf 5568 22739 22740\nf 22739 4988 21236\nf 22740 21236 345\nf 647 22741 7499\nf 22741 5898 22742\nf 7499 22742 664\nf 5020 22743 22744\nf 22743 664 22742\nf 22744 22742 5898\nf 648 8016 11484\nf 8016 649 22745\nf 11484 22745 5824\nf 5546 18096 22747\nf 18096 1937 22746\nf 22747 22746 5547\nf 4819 22748 18022\nf 22748 5824 22749\nf 18022 22749 4820\nf 1936 22113 22750\nf 22113 3176 20873\nf 22750 20873 3177\nf 207 11487 9114\nf 11487 5548 11491\nf 9114 11491 46\nf 4981 22751 18017\nf 22751 4224 22752\nf 18017 22752 4818\nf 4224 22751 21215\nf 22751 4981 21220\nf 21215 21220 4225\nf 5547 22746 22754\nf 22746 1937 22753\nf 22754 22753 5342\nf 650 22755 13519\nf 22755 4820 22756\nf 13519 22756 649\nf 4820 22755 20877\nf 22755 650 18026\nf 20877 18026 5549\nf 47 11490 21231\nf 11490 5548 21230\nf 21231 21230 4984\nf 4225 15469 21229\nf 15469 4227 22757\nf 21229 22757 4984\nf 3180 21222 18032\nf 21222 5547 22754\nf 18032 22754 5342\nf 4981 21223 21221\nf 21223 3180 21227\nf 21221 21227 4228\nf 3179 22758 22097\nf 22758 5342 22753\nf 22097 22753 1937\nf 4226 22099 20880\nf 22099 4983 22095\nf 20880 22095 3178\nf 5341 15467 18024\nf 15467 5340 22759\nf 18024 22759 5343\nf 1938 22102 21226\nf 22102 5343 22759\nf 21226 22759 5340\nf 651 20881 13526\nf 20881 4821 18027\nf 13526 18027 650\nf 4226 20879 18037\nf 20879 5549 22760\nf 18037 22760 3182\nf 4821 22761 18028\nf 22761 3182 22760\nf 18028 22760 5549\nf 3179 22762 22758\nf 22762 5550 18033\nf 22758 18033 5342\nf 5550 22762 22763\nf 22762 3179 22098\nf 22763 22098 1939\nf 3180 18031 21228\nf 18031 5550 18042\nf 21228 18042 1940\nf 5551 20883 18034\nf 20883 3182 22761\nf 18034 22761 4821\nf 5552 22764 22765\nf 22764 5951 21232\nf 22765 21232 4984\nf 3183 18047 18030\nf 18047 5552 22766\nf 18030 22766 4227\nf 4984 22757 22765\nf 22757 4227 22766\nf 22765 22766 5552\nf 5550 22763 18043\nf 22763 1939 22767\nf 18043 22767 5345\nf 1941 22768 22101\nf 22768 5345 22767\nf 22101 22767 1939\nf 3181 11492 15472\nf 11492 3190 21235\nf 15472 21235 1938\nf 5926 15488 22769\nf 15488 652 8067\nf 22769 8067 653\nf 4993 22770 22772\nf 22770 5542 22771\nf 22772 22771 5958\nf 1942 11499 22103\nf 11499 1943 22773\nf 22103 22773 5346\nf 5850 18054 22774\nf 18054 5346 22773\nf 22774 22773 1943\nf 647 22775 22741\nf 22775 4822 22776\nf 22741 22776 5898\nf 4822 22777 22776\nf 22777 4222 22778\nf 22776 22778 5898\nf 4222 22777 22105\nf 22777 4822 22779\nf 22105 22779 3185\nf 346 21237 22780\nf 21237 4988 18053\nf 22780 18053 4991\nf 4991 18061 22780\nf 18061 369 10149\nf 22780 10149 346\nf 4229 18057 18052\nf 18057 4230 21249\nf 18052 21249 4991\nf 3174 22781 18056\nf 22781 4987 21239\nf 18056 21239 4230\nf 3174 15458 22781\nf 15458 1934 22782\nf 22781 22782 4987\nf 655 18058 11975\nf 18058 4823 22783\nf 11975 22783 654\nf 4823 22784 22783\nf 22784 4822 22785\nf 22783 22785 654\nf 3185 20886 15482\nf 20886 4824 22786\nf 15482 22786 3186\nf 4822 22784 22779\nf 22784 4823 20885\nf 22779 20885 3185\nf 4987 22787 18067\nf 22787 5850 18065\nf 18067 18065 5553\nf 5348 18072 18077\nf 18072 1944 22788\nf 18077 22788 5930\nf 3187 18073 22789\nf 18073 5348 21243\nf 22789 21243 3186\nf 656 11504 11974\nf 11504 5554 18059\nf 11974 18059 655\nf 3187 22789 20887\nf 22789 3186 22786\nf 20887 22786 4824\nf 5353 22790 22791\nf 22790 3189 22109\nf 22791 22109 5349\nf 3189 22790 21246\nf 22790 5353 22117\nf 21246 22117 3197\nf 5555 11501 21268\nf 11501 4990 22792\nf 21268 22792 5004\nf 4231 21245 18118\nf 21245 3195 18109\nf 18118 18109 5352\nf 5958 22771 22793\nf 22771 5542 22725\nf 22793 22725 41\nf 5542 22770 17987\nf 22770 4993 22794\nf 17987 22794 4221\nf 4825 7298 21253\nf 7298 4221 22794\nf 21253 22794 4993\nf 1945 22795 18086\nf 22795 4992 22796\nf 18086 22796 1941\nf 5345 22768 18084\nf 22768 1941 22796\nf 18084 22796 4992\nf 3172 22112 22111\nf 22112 5350 15485\nf 22111 15485 3190\nf 5551 22797 20884\nf 22797 4994 22798\nf 20884 22798 4985\nf 4992 22799 18090\nf 22799 5339 22088\nf 18090 22088 4826\nf 5339 22799 22736\nf 22799 4992 22795\nf 22736 22795 1945\nf 4985 22798 20890\nf 22798 4994 22081\nf 20890 22081 3191\nf 3172 22110 22801\nf 22110 3191 22800\nf 22801 22800 5935\nf 1935 18094 22803\nf 18094 5546 22802\nf 22803 22802 5351\nf 4818 18015 18018\nf 18015 5546 22747\nf 18018 22747 5547\nf 5546 18016 22804\nf 18016 4233 15493\nf 22804 15493 5947\nf 1935 22805 22094\nf 22805 5890 21218\nf 22094 21218 4980\nf 4234 15497 7295\nf 15497 4818 22752\nf 7295 22752 4224\nf 4234 7294 18208\nf 7294 3175 21254\nf 18208 21254 4996\nf 4998 18099 11486\nf 18099 5556 22806\nf 11486 22806 648\nf 5351 22807 22803\nf 22807 5890 22805\nf 22803 22805 1935\nf 3192 18100 22809\nf 18100 3217 22808\nf 22809 22808 1966\nf 5358 22145 22811\nf 22145 3217 22810\nf 22811 22810 5351\nf 5351 22812 22811\nf 22812 5947 22813\nf 22811 22813 5358\nf 54 22814 6041\nf 22814 4995 22091\nf 6041 22091 51\nf 4995 22814 20893\nf 22814 54 22815\nf 20893 22815 4999\nf 648 22806 8057\nf 22806 5556 22816\nf 8057 22816 657\nf 3216 18213 11511\nf 18213 5556 18098\nf 11511 18098 3193\nf 658 18103 7508\nf 18103 5557 22817\nf 7508 22817 659\nf 3194 22818 11512\nf 22818 5364 22174\nf 11512 22174 3240\nf 5364 22818 15582\nf 22818 3194 18111\nf 15582 18111 5557\nf 528 22819 15251\nf 22819 5899 22820\nf 15251 22820 363\nf 5001 22821 18108\nf 22821 4267 22822\nf 18108 22822 5352\nf 4267 20895 22822\nf 20895 5004 22823\nf 22822 22823 5352\nf 5558 22824 18110\nf 22824 659 22817\nf 18110 22817 5557\nf 528 18117 22819\nf 18117 4827 22825\nf 22819 22825 5899\nf 659 22824 7472\nf 22824 5558 22826\nf 7472 22826 656\nf 5002 22116 11515\nf 22116 5353 22827\nf 11515 22827 1948\nf 5930 18114 22828\nf 18114 1948 22827\nf 22828 22827 5353\nf 5000 22115 15507\nf 22115 5003 22829\nf 15507 22829 1944\nf 5004 22792 22823\nf 22792 4990 18119\nf 22823 18119 5352\nf 3188 11505 22830\nf 11505 656 22826\nf 22830 22826 5558\nf 3188 22830 21269\nf 22830 5558 21265\nf 21269 21265 4237\nf 380 22697 22831\nf 22697 5532 18121\nf 22831 18121 4828\nf 1951 15513 18125\nf 15513 1950 22692\nf 18125 22692 1922\nf 4238 22698 21270\nf 22698 4211 22694\nf 21270 22694 5530\nf 1949 18132 18124\nf 18132 5354 22832\nf 18124 22832 1951\nf 4828 22833 22831\nf 22833 379 6689\nf 22831 6689 380\nf 5559 22834 22835\nf 22834 3199 18134\nf 22835 18134 4810\nf 379 22833 22836\nf 22833 4828 20899\nf 22836 20899 5560\nf 1951 22832 22837\nf 22832 5354 15521\nf 22837 15521 1953\nf 3199 22834 11526\nf 22834 5559 22838\nf 11526 22838 3200\nf 4829 18153 18141\nf 18153 3200 22838\nf 18141 22838 5559\nf 5009 18147 21276\nf 18147 379 22836\nf 21276 22836 5560\nf 1953 22839 22837\nf 22839 5561 22840\nf 22837 22840 1951\nf 5005 15511 22841\nf 15511 1951 22840\nf 22841 22840 5561\nf 4242 22842 18150\nf 22842 5561 22843\nf 18150 22843 5008\nf 5561 22842 22841\nf 22842 4242 21275\nf 22841 21275 5005\nf 4243 22844 22845\nf 22844 5006 18142\nf 22845 18142 4241\nf 5006 22844 21284\nf 22844 4243 21280\nf 21284 21280 4244\nf 5561 22839 22846\nf 22839 1953 18144\nf 22846 18144 1955\nf 4241 18138 22845\nf 18138 4242 18149\nf 22845 18149 4243\nf 3201 11524 21279\nf 11524 3200 22847\nf 21279 22847 3202\nf 5562 18158 18152\nf 18158 3202 22847\nf 18152 22847 3200\nf 3203 22848 21282\nf 22848 4245 21287\nf 21282 21287 4244\nf 4243 18148 21281\nf 18148 5008 22849\nf 21281 22849 3203\nf 5563 18166 22850\nf 18166 3203 22849\nf 22850 22849 5008\nf 1957 22128 22123\nf 22128 5563 22851\nf 22123 22851 1955\nf 5008 22852 22850\nf 22852 1955 22851\nf 22850 22851 5563\nf 3202 18157 22854\nf 18157 5565 22853\nf 22854 22853 3205\nf 5564 18160 22855\nf 18160 5565 18156\nf 22855 18156 5562\nf 1956 22856 12141\nf 22856 5564 22857\nf 12141 22857 661\nf 5562 18155 22855\nf 18155 661 22857\nf 22855 22857 5564\nf 662 22858 12140\nf 22858 5564 22856\nf 12140 22856 1956\nf 5564 22858 18161\nf 22858 662 22859\nf 18161 22859 5566\nf 3204 7310 21288\nf 7310 3206 22860\nf 21288 22860 5891\nf 1954 22122 18163\nf 22122 5891 22860\nf 18163 22860 3206\nf 3205 22853 11529\nf 22853 5565 21291\nf 11529 21291 4246\nf 374 7305 6675\nf 7305 4830 21292\nf 6675 21292 377\nf 3203 18165 22848\nf 18165 3207 22126\nf 22848 22126 4245\nf 5012 22129 15528\nf 22129 5566 22861\nf 15528 22861 1958\nf 662 12934 22859\nf 12934 1958 22861\nf 22859 22861 5566\nf 3209 18183 20902\nf 18183 3208 7311\nf 20902 7311 3204\nf 3207 18172 22862\nf 18172 1962 18185\nf 22862 18185 4247\nf 4247 11532 22862\nf 11532 5010 22125\nf 22862 22125 3207\nf 3209 11527 18175\nf 11527 4246 21293\nf 18175 21293 5014\nf 5013 15539 21297\nf 15539 5014 21295\nf 21297 21295 5012\nf 3210 15532 11531\nf 15532 5011 15524\nf 11531 15524 5010\nf 4831 15525 18180\nf 15525 3206 22863\nf 18180 22863 5355\nf 3208 18173 7309\nf 18173 5355 22863\nf 7309 22863 3206\nf 1964 18191 22133\nf 18191 1962 22864\nf 22133 22864 1961\nf 1961 22864 18184\nf 22864 1962 18171\nf 18184 18171 1959\nf 3213 22138 18187\nf 22138 5017 18188\nf 18187 18188 4247\nf 1960 7312 15529\nf 7312 3212 18193\nf 15529 18193 5567\nf 5015 11535 11533\nf 11535 5568 22865\nf 11533 22865 371\nf 5017 21305 18189\nf 21305 5016 21298\nf 18189 21298 3210\nf 5357 22134 22136\nf 22134 1961 22130\nf 22136 22130 5567\nf 5356 22132 22866\nf 22132 1963 19499\nf 22866 19499 664\nf 371 22865 6666\nf 22865 5568 22740\nf 6666 22740 345\nf 3213 18202 22139\nf 18202 5569 22140\nf 22139 22140 3215\nf 5356 22866 21303\nf 22866 664 22743\nf 21303 22743 5020\nf 3192 22809 7302\nf 22809 1966 22143\nf 7302 22143 1946\nf 5021 18207 22867\nf 18207 4996 21257\nf 22867 21257 3220\nf 4999 22868 21258\nf 22868 5570 22149\nf 21258 22149 3220\nf 53 22869 8659\nf 22869 4999 22815\nf 8659 22815 54\nf 4999 22869 22868\nf 22869 53 22870\nf 22868 22870 5570\nf 5021 22867 18209\nf 22867 3220 21313\nf 18209 21313 3219\nf 657 22871 13516\nf 22871 5571 18220\nf 13516 18220 665\nf 5571 22871 18215\nf 22871 657 22816\nf 18215 22816 5556\nf 3217 22144 22808\nf 22144 3222 18224\nf 22808 18224 1966\nf 4834 22872 22142\nf 22872 5571 18214\nf 22142 18214 3216\nf 5571 22872 18221\nf 22872 4834 21318\nf 18221 21318 5025\nf 5024 18222 22873\nf 18222 3222 22152\nf 22873 22152 1967\nf 3221 18212 15549\nf 18212 3219 22874\nf 15549 22874 3223\nf 58 22875 22876\nf 22875 5900 18227\nf 22876 18227 5570\nf 5570 22870 22876\nf 22870 53 6052\nf 22876 6052 58\nf 5900 22875 22877\nf 22875 58 6048\nf 22877 6048 57\nf 3219 21312 22874\nf 21312 5573 22878\nf 22874 22878 3223\nf 665 18219 14501\nf 18219 5025 22879\nf 14501 22879 666\nf 5022 21330 18216\nf 21330 4250 21319\nf 18216 21319 4834\nf 1967 22880 22873\nf 22880 5851 22153\nf 22873 22153 5024\nf 5022 21315 22881\nf 21315 5851 18232\nf 22881 18232 4251\nf 5900 22882 18225\nf 22882 4835 22883\nf 18225 22883 5573\nf 666 22884 13515\nf 22884 5029 18231\nf 13515 18231 667\nf 5029 22884 21320\nf 22884 666 22879\nf 21320 22879 5025\nf 1968 22885 22155\nf 22885 5574 22886\nf 22155 22886 1967\nf 3223 22878 21323\nf 22878 5573 22883\nf 21323 22883 4835\nf 667 18230 13507\nf 18230 5030 22887\nf 13507 22887 668\nf 4252 22888 21329\nf 22888 5031 18229\nf 21329 18229 4250\nf 5031 22888 21334\nf 22888 4252 22889\nf 21334 22889 4253\nf 1969 11544 22890\nf 11544 5574 22885\nf 22890 22885 1968\nf 4252 21328 21326\nf 21328 5022 22881\nf 21326 22881 4251\nf 60 22891 22893\nf 22891 5577 22892\nf 22893 22892 5900\nf 3224 21321 21332\nf 21321 4835 18236\nf 21332 18236 3225\nf 668 22887 22895\nf 22887 5030 22894\nf 22895 22894 5936\nf 5028 21324 22896\nf 21324 4251 21327\nf 22896 21327 5575\nf 5028 22897 21325\nf 22897 4253 22889\nf 21325 22889 4252\nf 59 22898 6056\nf 22898 5577 22891\nf 6056 22891 60\nf 5577 22899 18235\nf 22899 5901 22900\nf 18235 22900 3225\nf 5031 21340 11547\nf 21340 5936 22894\nf 11547 22894 5030\nf 1970 22901 22158\nf 22901 5902 22902\nf 22158 22902 1969\nf 5575 11545 22903\nf 11545 1969 22902\nf 22903 22902 5902\nf 4253 22897 21339\nf 22897 5028 18239\nf 21339 18239 4254\nf 5575 22904 22896\nf 22904 5576 18240\nf 22896 18240 5028\nf 669 22905 13500\nf 22905 5035 22906\nf 13500 22906 670\nf 5034 22907 21341\nf 22907 5035 22908\nf 21341 22908 5936\nf 4255 22909 21345\nf 22909 5036 18242\nf 21345 18242 4254\nf 5035 22907 21358\nf 22907 5034 18243\nf 21358 18243 5036\nf 1971 22910 22912\nf 22910 5578 22911\nf 22912 22911 5902\nf 5576 22913 21347\nf 22913 5902 22911\nf 21347 22911 5578\nf 62 22914 6059\nf 22914 4837 22915\nf 6059 22915 59\nf 5577 22898 22916\nf 22898 59 22915\nf 22916 22915 4837\nf 4836 20909 18245\nf 20909 3226 22917\nf 18245 22917 5901\nf 1972 18255 22162\nf 18255 5578 22910\nf 22162 22910 1971\nf 4257 22918 21364\nf 22918 5578 18254\nf 21364 18254 5038\nf 5578 22918 21346\nf 22918 4257 22919\nf 21346 22919 4255\nf 62 18249 22914\nf 18249 5579 20911\nf 22914 20911 4837\nf 4836 20912 22920\nf 20912 5579 20914\nf 22920 20914 3229\nf 670 22921 12005\nf 22921 5039 22922\nf 12005 22922 671\nf 5039 22921 21359\nf 22921 670 22906\nf 21359 22906 5035\nf 5037 21354 11553\nf 21354 5040 22163\nf 11553 22163 5580\nf 5036 22909 21357\nf 22909 4255 22923\nf 21357 22923 4256\nf 3228 20910 15560\nf 20910 4836 22920\nf 15560 22920 3229\nf 360 18256 18250\nf 18256 5581 20915\nf 18250 20915 5579\nf 671 22922 22925\nf 22922 5039 22924\nf 22925 22924 5903\nf 4257 21363 22926\nf 21363 4258 18252\nf 22926 18252 4256\nf 5580 22165 18248\nf 22165 1973 22927\nf 18248 22927 5038\nf 4256 22923 22926\nf 22923 4255 22919\nf 22926 22919 4257\nf 3229 20913 22928\nf 20913 5581 21374\nf 22928 21374 3231\nf 672 22929 22931\nf 22929 5903 22930\nf 22931 22930 5584\nf 4260 22932 18260\nf 22932 5584 22933\nf 18260 22933 5041\nf 1973 21370 22927\nf 21370 5582 21365\nf 22927 21365 5038\nf 4258 21362 21371\nf 21362 5582 22934\nf 21371 22934 4259\nf 1974 18268 21369\nf 18268 4259 22934\nf 21369 22934 5582\nf 3232 15562 21377\nf 15562 1975 21367\nf 21377 21367 3230\nf 566 22935 6645\nf 22935 5583 18257\nf 6645 18257 360\nf 3230 15561 21376\nf 15561 3229 22928\nf 21376 22928 3231\nf 5360 18269 18263\nf 18269 5043 22936\nf 18263 22936 1974\nf 5583 22935 22938\nf 22935 566 22937\nf 22938 22937 4838\nf 5583 22938 21375\nf 22938 4838 21382\nf 21375 21382 4839\nf 4262 18281 18278\nf 18281 5584 22932\nf 18278 22932 4260\nf 3232 18276 22939\nf 18276 4261 15568\nf 22939 15568 3235\nf 361 18273 6648\nf 18273 4838 22937\nf 6648 22937 566\nf 3231 21373 18275\nf 21373 4839 21378\nf 18275 21378 4261\nf 673 22940 11990\nf 22940 5585 22941\nf 11990 22941 674\nf 3238 22172 21383\nf 22172 5585 18279\nf 21383 18279 4262\nf 5045 11558 21384\nf 11558 5042 22167\nf 21384 22167 3233\nf 5585 22940 18280\nf 22940 673 22942\nf 18280 22942 5584\nf 672 22931 11996\nf 22931 5584 22942\nf 11996 22942 673\nf 5043 21388 22936\nf 21388 3233 18266\nf 22936 18266 1974\nf 3232 22939 15563\nf 22939 3235 15573\nf 15563 15573 1976\nf 5904 22943 22944\nf 22943 3237 18283\nf 22944 18283 1977\nf 1978 21391 21389\nf 21391 5045 21386\nf 21389 21386 5044\nf 4263 18287 22946\nf 18287 5046 22945\nf 22946 22945 4265\nf 5361 18271 18289\nf 18271 361 22947\nf 18289 22947 5046\nf 3236 22170 22949\nf 22170 3234 22948\nf 22949 22948 4263\nf 5361 18288 22169\nf 18288 4263 22948\nf 22169 22948 3234\nf 675 11983 22951\nf 11983 674 22950\nf 22951 22950 4840\nf 4840 22950 22171\nf 22950 674 22941\nf 22171 22941 5585\nf 1977 18291 22944\nf 18291 5363 22952\nf 22944 22952 5904\nf 364 22953 6651\nf 22953 5046 22947\nf 6651 22947 361\nf 5047 22954 22955\nf 22954 4263 22946\nf 22955 22946 4265\nf 4263 22954 22949\nf 22954 5047 18294\nf 22949 18294 3236\nf 5049 22956 21397\nf 22956 675 22951\nf 21397 22951 4840\nf 3241 22957 22177\nf 22957 5362 22958\nf 22177 22958 5904\nf 5047 22955 21394\nf 22955 4265 22959\nf 21394 22959 5048\nf 675 22956 11978\nf 22956 5049 18104\nf 11978 18104 658\nf 3241 15500 22957\nf 15500 1947 15576\nf 22957 15576 5362\nf 363 22960 10740\nf 22960 5586 22961\nf 10740 22961 364\nf 5046 22953 22962\nf 22953 364 22961\nf 22962 22961 5586\nf 4265 22963 22965\nf 22963 5586 22964\nf 22965 22964 4267\nf 5586 22963 22962\nf 22963 4265 22945\nf 22962 22945 5046\nf 5001 18296 22821\nf 18296 5048 22966\nf 22821 22966 4267\nf 4267 22964 20896\nf 22964 5586 22967\nf 20896 22967 5899\nf 3241 22176 18105\nf 22176 5050 11516\nf 18105 11516 1948\nf 5048 22959 22966\nf 22959 4265 22965\nf 22966 22965 4267\n\nusemtl material_2\nf 123 22968 22969\nf 22968 5587 18305\nf 22969 18305 5905\nf 4268 22970 11561\nf 22970 5588 22971\nf 11561 22971 4271\nf 5587 22972 22973\nf 22972 5052 21408\nf 22973 21408 4271\nf 124 22974 6132\nf 22974 5587 22968\nf 6132 22968 123\nf 5587 22974 22972\nf 22974 124 22975\nf 22972 22975 5052\nf 123 22969 6127\nf 22969 5905 22976\nf 6127 22976 122\nf 4269 18301 22977\nf 18301 5588 22970\nf 22977 22970 4268\nf 5587 22973 18306\nf 22973 4271 22971\nf 18306 22971 5588\nf 5590 22978 22979\nf 22978 4269 22977\nf 22979 22977 4268\nf 5590 22980 18706\nf 22980 5591 18308\nf 18706 18308 1979\nf 5051 21403 21398\nf 21403 1980 21401\nf 21398 21401 4270\nf 5054 21404 22981\nf 21404 5051 11559\nf 22981 11559 4271\nf 3243 21402 22983\nf 21402 1980 22982\nf 22983 22982 5369\nf 4270 21400 22984\nf 21400 3243 22186\nf 22984 22186 5591\nf 124 6133 22975\nf 6133 125 22985\nf 22975 22985 5052\nf 676 18315 8157\nf 18315 5592 22986\nf 8157 22986 1982\nf 5058 22987 21407\nf 22987 5365 22179\nf 21407 22179 3242\nf 5365 22987 15585\nf 22987 5058 22988\nf 15585 22988 5592\nf 5369 22982 11595\nf 22982 1980 22989\nf 11595 22989 5078\nf 5054 21451 21405\nf 21451 5078 22989\nf 21405 22989 1980\nf 1982 22986 13619\nf 22986 5592 22990\nf 13619 22990 677\nf 5058 21418 22988\nf 21418 5057 22991\nf 22988 22991 5592\nf 5052 22985 18319\nf 22985 125 18420\nf 18319 18420 5079\nf 3246 21412 21409\nf 21412 5054 22981\nf 21409 22981 4271\nf 5057 18425 22992\nf 18425 678 8220\nf 22992 8220 677\nf 5055 22222 22993\nf 22222 5083 20947\nf 22993 20947 4272\nf 1983 22224 22194\nf 22224 5056 18326\nf 22194 18326 1981\nf 5053 22994 21417\nf 22994 5055 22993\nf 21417 22993 4272\nf 5055 22994 22995\nf 22994 5053 22193\nf 22995 22193 5368\nf 161 18334 8783\nf 18334 5593 22996\nf 8783 22996 162\nf 5370 21421 18332\nf 21421 3249 18349\nf 18332 18349 1985\nf 29 22997 8779\nf 22997 5594 18335\nf 8779 18335 161\nf 4273 18342 11567\nf 18342 5593 22998\nf 11567 22998 4274\nf 5059 18333 22999\nf 18333 1985 11565\nf 22999 11565 4274\nf 5594 23000 18336\nf 23000 4274 22998\nf 18336 22998 5593\nf 5594 22997 23001\nf 22997 29 6012\nf 23001 6012 28\nf 162 23002 8786\nf 23002 5596 23003\nf 8786 23003 157\nf 5596 23002 18344\nf 23002 162 22996\nf 18344 22996 5593\nf 1985 18348 11566\nf 18348 5062 20932\nf 11566 20932 4273\nf 5595 22202 18346\nf 22202 1984 22199\nf 18346 22199 5372\nf 5060 22201 18358\nf 22201 5595 23004\nf 18358 23004 5373\nf 5595 23005 23004\nf 23005 5374 23006\nf 23004 23006 5373\nf 679 23007 8088\nf 23007 5371 15591\nf 8088 15591 642\nf 5371 23007 18357\nf 23007 679 20935\nf 18357 20935 5061\nf 3248 22196 21425\nf 22196 5371 18356\nf 21425 18356 4275\nf 5374 23005 18353\nf 23005 5595 18345\nf 18353 18345 1986\nf 5066 23008 18360\nf 23008 4276 22200\nf 18360 22200 5063\nf 4276 23008 22204\nf 23008 5066 23009\nf 22204 23009 1988\nf 157 23010 6191\nf 23010 5065 18366\nf 6191 18366 158\nf 5065 23010 20931\nf 23010 157 23003\nf 20931 23003 5596\nf 5597 18373 23011\nf 18373 5373 23006\nf 23011 23006 5374\nf 4846 23012 18365\nf 23012 3251 21422\nf 18365 21422 5061\nf 4277 23013 21427\nf 23013 5376 18367\nf 21427 18367 5065\nf 4277 21431 23013\nf 21431 4280 23014\nf 23013 23014 5376\nf 3251 23012 11578\nf 23012 4846 21428\nf 11578 21428 4279\nf 5374 22203 23011\nf 22203 1988 23015\nf 23011 23015 5597\nf 5375 22206 11581\nf 22206 5597 23015\nf 11581 23015 1988\nf 4279 21430 15604\nf 21430 4278 23016\nf 15604 23016 3254\nf 4847 22210 7326\nf 22210 5598 23017\nf 7326 23017 1989\nf 5066 18377 23009\nf 18377 3253 11582\nf 23009 11582 1988\nf 159 22209 5988\nf 22209 5599 23018\nf 5988 23018 11\nf 4280 21432 23014\nf 21432 5599 22208\nf 23014 22208 5376\nf 5068 22214 15607\nf 22214 1991 23019\nf 15607 23019 5598\nf 1989 23017 18386\nf 23017 5598 23019\nf 18386 23019 1991\nf 4280 18379 21433\nf 18379 5072 23020\nf 21433 23020 5070\nf 681 20936 23021\nf 20936 4848 18381\nf 23021 18381 5931\nf 3254 23016 18389\nf 23016 4278 7328\nf 18389 7328 5601\nf 11 23022 6187\nf 23022 5071 18392\nf 6187 18392 155\nf 5071 23022 18385\nf 23022 11 23018\nf 18385 23018 5599\nf 5600 21435 18388\nf 21435 4281 22212\nf 18388 22212 1989\nf 682 23023 20937\nf 23023 4849 18398\nf 20937 18398 4848\nf 5602 21441 18391\nf 21441 3255 22213\nf 18391 22213 3254\nf 5070 23024 18395\nf 23024 4282 21443\nf 18395 21443 5852\nf 5072 21438 23020\nf 21438 4282 23024\nf 23020 23024 5070\nf 5852 23025 18396\nf 23025 5825 23026\nf 18396 23026 5603\nf 155 18394 8768\nf 18394 5603 23027\nf 8768 23027 156\nf 1992 11583 22216\nf 11583 5069 23028\nf 22216 23028 1991\nf 5600 18387 21437\nf 18387 1991 23028\nf 21437 23028 5069\nf 683 7331 8097\nf 7331 4849 23023\nf 8097 23023 682\nf 4849 23029 18399\nf 23029 4850 20941\nf 18399 20941 5601\nf 156 23027 23030\nf 23027 5603 23026\nf 23030 23026 5825\nf 5069 11585 18404\nf 11585 1993 18417\nf 18404 18417 5605\nf 4282 18400 21444\nf 18400 5604 23031\nf 21444 23031 4283\nf 5605 18416 18405\nf 18416 4283 23031\nf 18405 23031 5604\nf 684 18409 13549\nf 18409 5606 7332\nf 13549 7332 683\nf 4850 23029 18408\nf 23029 4849 7333\nf 18408 7333 5606\nf 3258 20942 18407\nf 20942 3256 20939\nf 18407 20939 4850\nf 5607 23032 23034\nf 23032 153 23033\nf 23034 23033 5825\nf 5076 23035 18448\nf 23035 1994 23036\nf 18448 23036 5614\nf 4283 18415 23037\nf 18415 3262 21473\nf 23037 21473 5087\nf 5394 15684 23038\nf 15684 5395 22296\nf 23038 22296 5834\nf 5394 23039 23041\nf 23039 685 23040\nf 23041 23040 5612\nf 3246 18317 23042\nf 18317 5079 21453\nf 23042 21453 5608\nf 4285 23043 18422\nf 23043 5379 11596\nf 18422 11596 5078\nf 5379 23044 11594\nf 23044 1983 18314\nf 11594 18314 5369\nf 1983 23044 22225\nf 23044 5379 18428\nf 22225 18428 1997\nf 5608 23045 15626\nf 23045 3260 23046\nf 15626 23046 3259\nf 5826 23047 21452\nf 23047 3260 23045\nf 21452 23045 5608\nf 128 20949 11597\nf 20949 3260 23047\nf 11597 23047 5826\nf 678 18424 13612\nf 18424 5609 23048\nf 13612 23048 686\nf 5084 23049 21464\nf 23049 686 23048\nf 21464 23048 5609\nf 5380 22229 22227\nf 22229 1999 23050\nf 22227 23050 1997\nf 686 23049 13605\nf 23049 5084 18438\nf 13605 18438 687\nf 5084 21463 18431\nf 21463 4287 11607\nf 18431 11607 5610\nf 1999 18432 23050\nf 18432 5611 15624\nf 23050 15624 1997\nf 4286 21460 18437\nf 21460 5611 23051\nf 18437 23051 2000\nf 5381 23052 18434\nf 23052 2000 23051\nf 18434 23051 5611\nf 5378 22220 22219\nf 22220 3259 23046\nf 22219 23046 3260\nf 687 18439 8150\nf 18439 5612 23040\nf 8150 23040 685\nf 5610 11614 18429\nf 11614 4288 23053\nf 18429 23053 5612\nf 5612 23053 23041\nf 23053 4288 23054\nf 23041 23054 5394\nf 5117 23055 22234\nf 23055 3261 22230\nf 22234 22230 5380\nf 3261 23055 23056\nf 23055 5117 21530\nf 23056 21530 5116\nf 4288 11613 23058\nf 11613 1996 23057\nf 23058 23057 5633\nf 2000 23052 21468\nf 23052 5381 22286\nf 21468 22286 5085\nf 684 8103 18410\nf 8103 688 23059\nf 18410 23059 4853\nf 1994 11617 23061\nf 11617 5086 23060\nf 23061 23060 2001\nf 3258 18446 18455\nf 18446 4853 18452\nf 18455 18452 5088\nf 153 23032 9556\nf 23032 5607 23062\nf 9556 23062 149\nf 3263 21476 21472\nf 21476 4289 23063\nf 21472 23063 5613\nf 5613 23064 18460\nf 23064 5615 23065\nf 18460 23065 5959\nf 2001 7337 23061\nf 7337 5614 23036\nf 23061 23036 1994\nf 1994 23035 22218\nf 23035 5076 18418\nf 22218 18418 1993\nf 5383 15633 18447\nf 15633 3262 11593\nf 18447 11593 5076\nf 2001 23066 23067\nf 23066 4854 18463\nf 23067 18463 5960\nf 4854 23066 15628\nf 23066 2001 23060\nf 15628 23060 5086\nf 3264 23068 22237\nf 23068 5382 18456\nf 22237 18456 5088\nf 4854 15630 18450\nf 15630 5382 23068\nf 18450 23068 3264\nf 4853 23059 18453\nf 23059 688 22239\nf 18453 22239 5089\nf 149 23069 6177\nf 23069 5959 18467\nf 6177 18467 150\nf 5613 23063 23064\nf 23063 4289 18457\nf 23064 18457 5615\nf 5089 22238 18465\nf 22238 2002 23070\nf 18465 23070 5093\nf 689 23071 8116\nf 23071 5093 23070\nf 8116 23070 2002\nf 5093 21483 18464\nf 21483 4291 22236\nf 18464 22236 5090\nf 4856 23072 22240\nf 23072 5616 23073\nf 22240 23073 5615\nf 5827 23074 23076\nf 23074 4855 23075\nf 23076 23075 2003\nf 5960 23077 23078\nf 23077 2003 23075\nf 23078 23075 4855\nf 4291 18482 21478\nf 18482 5854 23079\nf 21478 23079 4290\nf 150 18466 8766\nf 18466 5616 23080\nf 8766 23080 1301\nf 4856 18469 23072\nf 18469 5906 23081\nf 23072 23081 5616\nf 4856 22241 23083\nf 22241 5950 23082\nf 23083 23082 4292\nf 1301 23084 6181\nf 23084 5906 18485\nf 6181 18485 146\nf 4292 18472 23083\nf 18472 5617 18470\nf 23083 18470 4856\nf 2005 11632 23086\nf 11632 5099 23085\nf 23086 23085 5827\nf 5094 11625 18477\nf 11625 5827 23085\nf 18477 23085 5099\nf 5097 21487 21490\nf 21487 5854 23087\nf 21490 23087 3266\nf 5619 23088 18480\nf 23088 3266 23089\nf 18480 23089 5618\nf 689 11621 23071\nf 11621 5853 23090\nf 23071 23090 5093\nf 3266 23088 21494\nf 23088 5619 18488\nf 21494 18488 4294\nf 2004 14401 23092\nf 14401 690 23091\nf 23092 23091 5937\nf 5619 18479 23094\nf 18479 5853 23093\nf 23094 23093 5937\nf 5617 18474 20954\nf 18474 3267 20957\nf 20954 20957 4857\nf 5098 22247 23095\nf 22247 5097 21489\nf 23095 21489 4293\nf 2005 22245 22249\nf 22245 5096 11629\nf 22249 11629 2006\nf 690 18495 23091\nf 18495 5621 23096\nf 23091 23096 5937\nf 5098 23097 18490\nf 23097 2007 23098\nf 18490 23098 5622\nf 2007 23097 18498\nf 23097 5098 23095\nf 18498 23095 4293\nf 4294 18487 18506\nf 18487 5621 23099\nf 18506 23099 4296\nf 5101 21501 18497\nf 21501 4296 23099\nf 18497 23099 5621\nf 146 18484 23100\nf 18484 5620 18500\nf 23100 18500 5961\nf 4858 18502 20956\nf 18502 3268 23101\nf 20956 23101 4857\nf 4857 23101 20955\nf 23101 3268 18501\nf 20955 18501 5620\nf 5622 23102 18504\nf 23102 3271 15651\nf 18504 15651 2010\nf 3271 23102 21502\nf 23102 5622 23098\nf 21502 23098 2007\nf 5385 22252 18509\nf 22252 2008 23103\nf 18509 23103 5387\nf 2010 23104 18505\nf 23104 5387 23103\nf 18505 23103 2008\nf 692 23105 8123\nf 23105 5623 11636\nf 8123 11636 691\nf 5907 23106 23107\nf 23106 4859 21506\nf 23107 21506 4299\nf 3272 20967 22254\nf 20967 4299 21507\nf 22254 21507 3270\nf 4298 18514 22253\nf 18514 4860 22257\nf 22253 22257 3272\nf 3273 22262 22256\nf 22262 5387 23104\nf 22256 23104 2010\nf 4297 23108 21505\nf 23108 4300 21513\nf 21505 21513 5104\nf 4300 23108 20963\nf 23108 4297 21499\nf 20963 21499 5102\nf 5386 23109 18521\nf 23109 2012 22265\nf 18521 22265 2013\nf 2012 23109 21509\nf 23109 5386 15652\nf 21509 15652 3271\nf 693 11644 13556\nf 11644 5624 23110\nf 13556 23110 692\nf 5623 23105 18525\nf 23105 692 23110\nf 18525 23110 5624\nf 147 23111 6172\nf 23111 5907 23112\nf 6172 23112 1300\nf 4861 23113 20966\nf 23113 5907 23107\nf 20966 23107 4299\nf 3275 21520 20969\nf 21520 3276 21511\nf 20969 21511 4300\nf 1300 23114 8760\nf 23114 4861 23115\nf 8760 23115 16\nf 5106 23116 18528\nf 23116 16 23115\nf 18528 23115 4861\nf 5388 15658 22263\nf 15658 2014 22266\nf 22263 22266 5625\nf 5105 18529 21515\nf 18529 5625 18536\nf 21515 18536 3277\nf 2014 18531 23117\nf 18531 5626 18539\nf 23117 18539 3279\nf 4302 23118 22264\nf 23118 5626 18532\nf 22264 18532 2013\nf 694 11647 8130\nf 11647 5108 11645\nf 8130 11645 693\nf 3275 21510 11652\nf 21510 5108 18551\nf 11652 18551 5109\nf 16 23116 5989\nf 23116 5106 18535\nf 5989 18535 1253\nf 5110 22267 11656\nf 22267 2014 23117\nf 11656 23117 3279\nf 5626 23119 18540\nf 23119 2015 21523\nf 18540 21523 5389\nf 2015 23119 11655\nf 23119 5626 23118\nf 11655 23118 4302\nf 3278 23120 18543\nf 23120 3280 22274\nf 18543 22274 5390\nf 3280 23120 22270\nf 23120 3278 21518\nf 22270 21518 4301\nf 4862 22271 22283\nf 22271 3277 21522\nf 22283 21522 4305\nf 5627 18544 23121\nf 18544 4303 11650\nf 23121 11650 5109\nf 5628 18549 18561\nf 18549 695 13567\nf 18561 13567 696\nf 2016 23122 22276\nf 23122 5389 22280\nf 22276 22280 5391\nf 5389 23122 18541\nf 23122 2016 11657\nf 18541 11657 3279\nf 695 18550 13559\nf 18550 5629 11648\nf 13559 11648 694\nf 5627 23121 23124\nf 23121 5109 23123\nf 23124 23123 4304\nf 5629 18545 18552\nf 18545 4304 23123\nf 18552 23123 5109\nf 4306 23125 18553\nf 23125 5630 23126\nf 18553 23126 5932\nf 4862 22282 22269\nf 22282 4863 18556\nf 22269 18556 3280\nf 4304 18547 20972\nf 18547 5628 20975\nf 20972 20975 4307\nf 5627 23124 18562\nf 23124 4304 20971\nf 18562 20971 3282\nf 4863 22281 15670\nf 22281 4305 23127\nf 15670 23127 3284\nf 4305 22275 23127\nf 22275 5113 21527\nf 23127 21527 3284\nf 4319 18624 18564\nf 18624 4308 23128\nf 18564 23128 5111\nf 3283 11664 21526\nf 11664 5111 23128\nf 21526 23128 4308\nf 697 18620 14924\nf 18620 5643 18559\nf 14924 18559 696\nf 4307 20974 18563\nf 20974 5643 23129\nf 18563 23129 4319\nf 142 23130 9869\nf 23130 5630 23131\nf 9869 23131 1543\nf 5115 22307 18568\nf 22307 1543 23131\nf 18568 23131 5630\nf 3286 18566 20976\nf 18566 5630 23125\nf 20976 23125 4306\nf 5112 21525 18570\nf 21525 4308 21569\nf 18570 21569 2018\nf 3285 18572 20990\nf 18572 5631 21573\nf 20990 21573 3301\nf 5392 18621 15671\nf 18621 2028 23132\nf 15671 23132 5114\nf 5114 23132 18574\nf 23132 2028 23133\nf 18574 23133 5631\nf 1995 18576 18440\nf 18576 4309 18584\nf 18440 18584 3288\nf 5378 23134 22221\nf 23134 5634 23135\nf 22221 23135 5118\nf 3261 23056 18443\nf 23056 5116 22290\nf 18443 22290 3287\nf 5378 15621 23134\nf 15621 5632 18586\nf 23134 18586 5634\nf 1996 21466 23137\nf 21466 5085 23136\nf 23137 23136 3289\nf 5119 15673 22287\nf 15673 3289 23136\nf 22287 23136 5085\nf 3289 20980 23137\nf 20980 5633 23057\nf 23137 23057 1996\nf 5116 21531 18579\nf 21531 3288 21533\nf 18579 21533 5393\nf 5118 23138 7336\nf 23138 4310 11672\nf 7336 11672 4309\nf 5118 23135 23138\nf 23135 5634 23139\nf 23138 23139 4310\nf 3292 15682 23140\nf 15682 5394 23054\nf 23140 23054 4288\nf 4288 23058 23140\nf 23058 5633 22293\nf 23140 22293 3292\nf 4310 23139 21534\nf 23139 5634 23141\nf 21534 23141 4312\nf 5635 23142 18587\nf 23142 4312 23141\nf 18587 23141 5634\nf 3291 18580 23143\nf 18580 5393 15689\nf 23143 15689 2020\nf 698 13601 21539\nf 13601 2019 18589\nf 21539 18589 5123\nf 3293 23144 22294\nf 23144 5123 23145\nf 22294 23145 3292\nf 5395 15683 18588\nf 15683 3292 23145\nf 18588 23145 5123\nf 2020 23146 23143\nf 23146 5396 15677\nf 23143 15677 3291\nf 5393 21532 15690\nf 21532 4311 22300\nf 15690 22300 5397\nf 134 23147 6139\nf 23147 5635 18582\nf 6139 18582 130\nf 4312 23142 23149\nf 23142 5635 23148\nf 23149 23148 5908\nf 5122 21540 11675\nf 21540 5123 23144\nf 11675 23144 3293\nf 3294 21543 11677\nf 21543 5636 11680\nf 11677 11680 5122\nf 5396 23146 18592\nf 23146 2020 23150\nf 18592 23150 5124\nf 2021 15695 22299\nf 15695 5124 23150\nf 22299 23150 2020\nf 4314 21565 21536\nf 21565 3299 23151\nf 21536 23151 5121\nf 5397 22301 23152\nf 22301 5121 23151\nf 23152 23151 3299\nf 5635 23153 23148\nf 23153 4868 23154\nf 23148 23154 5908\nf 5908 20988 23155\nf 20988 4318 21566\nf 23155 21566 4314\nf 2023 8299 11679\nf 8299 698 21538\nf 11679 21538 5122\nf 4864 21563 15693\nf 21563 5642 21544\nf 15693 21544 3294\nf 5397 23152 18595\nf 23152 3299 21560\nf 18595 21560 2022\nf 22 23156 9009\nf 23156 5655 18601\nf 9009 18601 1258\nf 4866 20981 15698\nf 20981 5655 23157\nf 15698 23157 4332\nf 5637 21552 18695\nf 21552 5129 21610\nf 18695 21610 5411\nf 1258 18600 8624\nf 18600 5638 23158\nf 8624 23158 133\nf 4316 23159 20983\nf 23159 4866 15697\nf 20983 15697 4865\nf 4316 23160 23162\nf 23160 5640 23161\nf 23162 23161 4317\nf 5640 23160 18614\nf 23160 4316 18605\nf 18614 18605 5639\nf 5398 11686 21547\nf 11686 2026 18603\nf 21547 18603 5639\nf 3297 23163 23164\nf 23163 5126 21545\nf 23164 21545 4867\nf 5126 23163 23165\nf 23163 3297 20985\nf 23165 20985 4315\nf 5127 23166 18610\nf 23166 2025 23167\nf 18610 23167 5641\nf 2025 23166 13946\nf 23166 5127 23168\nf 13946 23168 700\nf 5641 23167 23169\nf 23167 2025 8320\nf 23169 8320 699\nf 5642 23170 18611\nf 23170 3297 23164\nf 18611 23164 4867\nf 4317 23161 21556\nf 23161 5640 21557\nf 21556 21557 4318\nf 1295 7344 23172\nf 7344 5918 23171\nf 23172 23171 4868\nf 3298 22305 21564\nf 22305 3297 23170\nf 21564 23170 5642\nf 2023 11678 8301\nf 11678 5636 23173\nf 8301 23173 699\nf 5641 23169 18617\nf 23169 699 23173\nf 18617 23173 5636\nf 1295 23172 8751\nf 23172 4868 23174\nf 8751 23174 134\nf 5128 20989 23175\nf 20989 5908 23154\nf 23175 23154 4868\nf 5643 18619 23129\nf 18619 5400 21567\nf 23129 21567 4319\nf 5392 18571 18622\nf 18571 2018 21574\nf 18622 21574 5399\nf 701 15708 8139\nf 15708 5400 18618\nf 8139 18618 697\nf 18 22308 23176\nf 22308 5644 18642\nf 23176 18642 5855\nf 3300 20992 15705\nf 20992 5646 18640\nf 15705 18640 5644\nf 2031 23177 22310\nf 23177 2029 23178\nf 22310 23178 2028\nf 5631 23133 21572\nf 23133 2028 23178\nf 21572 23178 2029\nf 2031 22317 23177\nf 22317 5133 22319\nf 23177 22319 2029\nf 5399 18629 22309\nf 18629 5403 23179\nf 22309 23179 2031\nf 2030 23180 13569\nf 23180 5402 15709\nf 13569 15709 701\nf 5402 23180 22313\nf 23180 2030 23181\nf 22313 23181 5132\nf 5132 23181 23182\nf 23181 2030 8141\nf 23182 8141 702\nf 3302 22314 21576\nf 22314 5131 18638\nf 21576 18638 4322\nf 5132 23182 21578\nf 23182 702 23183\nf 21578 23183 5645\nf 19 23184 23186\nf 23184 5855 23185\nf 23186 23185 4872\nf 5855 23184 23176\nf 23184 19 5992\nf 23176 5992 18\nf 3304 20997 21571\nf 20997 5646 20994\nf 21571 20994 4870\nf 2031 23179 22318\nf 23179 5403 23187\nf 22318 23187 2032\nf 5404 23188 18644\nf 23188 2032 23187\nf 18644 23187 5403\nf 5404 22315 18647\nf 22315 4321 22321\nf 18647 22321 5405\nf 4873 7352 20998\nf 7352 5645 23183\nf 20998 23183 702\nf 19 23186 8621\nf 23186 4872 18648\nf 8621 18648 139\nf 5647 23189 23190\nf 23189 5135 18649\nf 23190 18649 4872\nf 5646 20996 23191\nf 20996 5647 23190\nf 23191 23190 4872\nf 5136 23192 18646\nf 23192 2032 23188\nf 18646 23188 5404\nf 2032 23192 23193\nf 23192 5136 15720\nf 23193 15720 2033\nf 3304 21570 18652\nf 21570 5130 23194\nf 18652 23194 5648\nf 4323 23195 15714\nf 23195 5648 23194\nf 15714 23194 5130\nf 5135 23196 18665\nf 23196 4325 18660\nf 18665 18660 5650\nf 4325 23197 23198\nf 23197 5647 18653\nf 23198 18653 5648\nf 4324 23199 23200\nf 23199 4325 23198\nf 23200 23198 5648\nf 2033 11697 23193\nf 11697 5134 23201\nf 23193 23201 2032\nf 5133 22316 21581\nf 22316 2032 23201\nf 21581 23201 5134\nf 4324 23200 18655\nf 23200 5648 23195\nf 18655 23195 4323\nf 4324 23202 23199\nf 23202 5137 23203\nf 23199 23203 4325\nf 5137 23202 22328\nf 23202 4324 21579\nf 22328 21579 5407\nf 5134 11696 21580\nf 11696 2035 22332\nf 21580 22332 5407\nf 4322 23204 22322\nf 23204 4874 20999\nf 22322 20999 3305\nf 4874 23204 7351\nf 23204 4322 18637\nf 7351 18637 5645\nf 703 23205 23207\nf 23205 5139 23206\nf 23207 23206 5909\nf 5138 23208 23209\nf 23208 4873 18659\nf 23209 18659 5909\nf 140 18663 9962\nf 18663 5650 23210\nf 9962 23210 1256\nf 5135 23189 23196\nf 23189 5647 23197\nf 23196 23197 4325\nf 5857 23211 23213\nf 23211 5142 23212\nf 23213 23212 3306\nf 5406 22326 23215\nf 22326 3306 23214\nf 23215 23214 5649\nf 704 11698 13573\nf 11698 5139 23205\nf 13573 23205 703\nf 5138 23209 23216\nf 23209 5909 23206\nf 23216 23206 5139\nf 5651 23217 18662\nf 23217 5144 23218\nf 18662 23218 5650\nf 5137 21587 23203\nf 21587 3307 21002\nf 23203 21002 4325\nf 4326 21596 21589\nf 21596 5142 23211\nf 21589 23211 5857\nf 5649 23214 23219\nf 23214 3306 23212\nf 23219 23212 5142\nf 136 18675 23221\nf 18675 5144 23220\nf 23221 23220 5860\nf 4327 21600 21592\nf 21600 5859 18670\nf 21592 18670 3307\nf 4326 21588 23223\nf 21588 5652 23222\nf 23223 23222 5410\nf 2037 23224 18676\nf 23224 5141 22329\nf 18676 22329 2036\nf 5141 23224 21593\nf 23224 2037 23225\nf 21593 23225 3309\nf 4327 23226 21599\nf 23226 3309 23227\nf 21599 23227 5143\nf 5408 15726 22333\nf 15726 2038 21604\nf 22333 21604 5147\nf 5410 23228 23229\nf 23228 3310 7355\nf 23229 7355 4328\nf 3308 21597 23231\nf 21597 4326 23230\nf 23231 23230 4328\nf 5410 23229 23223\nf 23229 4328 23230\nf 23223 23230 4326\nf 4329 23232 23234\nf 23232 5654 23233\nf 23234 23233 5653\nf 136 23221 6152\nf 23221 5860 23235\nf 6152 23235 137\nf 5653 11703 23234\nf 11703 5143 18685\nf 23234 18685 4329\nf 5146 21602 18682\nf 21602 3309 23225\nf 18682 23225 2037\nf 4331 18686 21601\nf 18686 5143 23227\nf 21601 23227 3309\nf 4328 7354 23231\nf 7354 4875 11704\nf 23231 11704 3308\nf 3312 15728 18700\nf 15728 5409 18691\nf 18700 18691 4333\nf 3310 23228 15727\nf 23228 5410 22336\nf 15727 22336 5409\nf 22 18693 23156\nf 18693 5654 23236\nf 23156 23236 5655\nf 4332 23237 11707\nf 23237 5654 23232\nf 11707 23232 4329\nf 5654 23237 23236\nf 23237 4332 23157\nf 23236 23157 5655\nf 5411 21612 15735\nf 21612 2024 22303\nf 15735 22303 2040\nf 3313 20984 21609\nf 20984 4865 21603\nf 21609 21603 4331\nf 4876 21004 18699\nf 21004 3312 23238\nf 18699 23238 4315\nf 700 23168 18697\nf 23168 5127 11682\nf 18697 11682 4333\nf 3312 18701 23238\nf 18701 5126 23165\nf 23238 23165 4315\n\nusemtl material_3\nf 434 6800 23240\nf 6800 436 23239\nf 23240 23239 5883\nf 5412 15738 21620\nf 15738 5223 23241\nf 21620 23241 2042\nf 4334 23242 23244\nf 23242 5656 23243\nf 23244 23243 5882\nf 5589 18302 23246\nf 18302 4269 23245\nf 23246 23245 5910\nf 5861 11714 23247\nf 11714 4335 18708\nf 23247 18708 5910\nf 5416 23248 11717\nf 23248 5979 23249\nf 11717 23249 3316\nf 5590 23250 22978\nf 23250 5979 23251\nf 22978 23251 4269\nf 4337 18724 23253\nf 18724 2042 23252\nf 23253 23252 4336\nf 4336 23252 21618\nf 23252 2042 23241\nf 21618 23241 5223\nf 4337 23253 23255\nf 23253 4336 23254\nf 23255 23254 5149\nf 336 18715 6966\nf 18715 5658 18712\nf 6966 18712 337\nf 4336 23256 23254\nf 23256 5882 21614\nf 23254 21614 5149\nf 5149 23257 23259\nf 23257 5659 23258\nf 23259 23258 4338\nf 5659 23257 18714\nf 23257 5149 21613\nf 18714 21613 5658\nf 5149 23259 23255\nf 23259 4338 11719\nf 23255 11719 4337\nf 118 23260 23262\nf 23260 5150 23261\nf 23262 23261 115\nf 5150 23260 18720\nf 23260 118 23263\nf 18720 23263 5657\nf 119 23264 6123\nf 23264 5657 23263\nf 6123 23263 118\nf 3316 22356 11715\nf 22356 5418 23265\nf 11715 23265 2046\nf 707 18730 23266\nf 18730 5661 22359\nf 23266 22359 4880\nf 5661 22360 22357\nf 22360 3317 22365\nf 22357 22365 3320\nf 5663 23267 18733\nf 23267 2043 22351\nf 18733 22351 5660\nf 2043 23267 15747\nf 23267 5663 23268\nf 15747 23268 3319\nf 5151 18726 23270\nf 18726 4338 23269\nf 23270 23269 4342\nf 440 18757 10490\nf 18757 5419 23271\nf 10490 23271 438\nf 3319 23268 22366\nf 23268 5663 23272\nf 22366 23272 2044\nf 438 23273 6918\nf 23273 5662 18728\nf 6918 18728 336\nf 5662 23273 18739\nf 23273 438 23271\nf 18739 23271 5419\nf 4338 23258 23269\nf 23258 5659 23274\nf 23269 23274 4342\nf 5662 18738 18729\nf 18738 4342 23274\nf 18729 23274 5659\nf 707 23266 12109\nf 23266 4880 21015\nf 12109 21015 2045\nf 3323 18751 18741\nf 18751 4880 22358\nf 18741 22358 3320\nf 708 22390 15744\nf 22390 5426 23275\nf 15744 23275 5984\nf 4339 22368 21622\nf 22368 4351 18744\nf 21622 18744 4340\nf 2046 23265 23276\nf 23265 5418 22394\nf 23276 22394 5427\nf 4879 7364 21624\nf 7364 115 23261\nf 21624 23261 5150\nf 4342 18737 23277\nf 18737 5419 22372\nf 23277 22372 4344\nf 4344 23278 23277\nf 23278 5151 23270\nf 23277 23270 4342\nf 5151 23278 21628\nf 23278 4344 23279\nf 21628 23279 5152\nf 5663 21625 23281\nf 21625 4343 23280\nf 23281 23280 5421\nf 3325 22377 18749\nf 22377 5421 23280\nf 18749 23280 4343\nf 2048 15769 21635\nf 15769 3328 23282\nf 21635 23282 3324\nf 5154 15763 7366\nf 15763 3324 23282\nf 7366 23282 3328\nf 5664 23283 23284\nf 23283 709 18752\nf 23284 18752 3323\nf 5422 23285 23286\nf 23285 2044 22375\nf 23286 22375 3327\nf 2044 23285 22367\nf 23285 5422 18754\nf 22367 18754 5153\nf 5152 23287 18748\nf 23287 4345 21636\nf 18748 21636 3325\nf 4345 23287 22371\nf 23287 5152 23279\nf 22371 23279 4344\nf 4345 22370 18765\nf 22370 5420 23288\nf 18765 23288 4886\nf 5155 18770 15765\nf 18770 4886 23288\nf 15765 23288 5420\nf 709 23283 12098\nf 23283 5664 23289\nf 12098 23289 2049\nf 3326 23290 21637\nf 23290 5664 23284\nf 21637 23284 3323\nf 5664 23291 23289\nf 23291 5666 23292\nf 23289 23292 2049\nf 5666 23291 11726\nf 23291 5664 23290\nf 11726 23290 3326\nf 5665 18761 21639\nf 18761 5156 23293\nf 21639 23293 5430\nf 5665 18758 22376\nf 18758 3327 22374\nf 22376 22374 5421\nf 5666 18813 23292\nf 18813 710 7592\nf 23292 7592 2049\nf 5422 23286 21662\nf 23286 3327 23294\nf 21662 23294 5164\nf 2051 11747 18760\nf 11747 5164 23294\nf 18760 23294 3327\nf 5156 18768 23293\nf 18768 3339 22408\nf 23293 22408 5430\nf 333 21689 6824\nf 21689 5677 23295\nf 6824 23295 334\nf 5155 11725 18771\nf 11725 334 23295\nf 18771 23295 5677\nf 3339 18767 21023\nf 18767 4886 23296\nf 21023 23296 4885\nf 5667 23297 21655\nf 23297 4881 18776\nf 21655 18776 4346\nf 110 23298 8744\nf 23298 5669 18802\nf 8744 18802 108\nf 5669 23298 23300\nf 23298 110 23299\nf 23300 23299 5668\nf 5667 23301 23297\nf 23301 5670 21017\nf 23297 21017 4881\nf 5669 23300 23303\nf 23300 5668 23302\nf 23303 23302 5670\nf 2055 18775 22395\nf 18775 5424 22383\nf 22395 22383 4347\nf 3334 15778 15780\nf 15778 5423 21644\nf 15780 21644 3331\nf 111 23304 6216\nf 23304 5668 23299\nf 6216 23299 110\nf 5670 23302 21641\nf 23302 5668 23305\nf 21641 23305 4348\nf 711 22378 13623\nf 22378 4882 21019\nf 13623 21019 2053\nf 3332 23306 22387\nf 23306 5671 7368\nf 22387 7368 3329\nf 3330 23307 22382\nf 23307 5423 21650\nf 22382 21650 4347\nf 5671 23306 23308\nf 23306 3332 21632\nf 23308 21632 5884\nf 5423 23307 21645\nf 23307 3330 23309\nf 21645 23309 5157\nf 5425 23310 22391\nf 23310 3333 21634\nf 22391 21634 4884\nf 3333 23310 21643\nf 23310 5425 15781\nf 21643 15781 3331\nf 4348 23311 23313\nf 23311 5673 23312\nf 23313 23312 4351\nf 5668 23304 23315\nf 23304 111 23314\nf 23315 23314 5673\nf 5668 23315 23305\nf 23315 5673 23311\nf 23305 23311 4348\nf 5157 23309 18787\nf 23309 3330 22392\nf 18787 22392 2047\nf 5672 21640 18788\nf 21640 4348 23313\nf 18788 23313 4351\nf 2046 23276 15760\nf 23276 5427 21648\nf 15760 21648 4350\nf 114 23316 6115\nf 23316 5673 23314\nf 6115 23314 111\nf 5673 23316 23317\nf 23316 114 7363\nf 23317 7363 4879\nf 4351 23312 18745\nf 23312 5673 23317\nf 18745 23317 4879\nf 5158 15776 11735\nf 15776 3334 21651\nf 11735 21651 3337\nf 3329 22379 11733\nf 22379 3336 18797\nf 11733 18797 4352\nf 5428 22396 18790\nf 22396 4347 21649\nf 18790 21649 5158\nf 5159 21653 22402\nf 21653 712 23318\nf 22402 23318 5429\nf 108 18801 8737\nf 18801 5674 18800\nf 8737 18800 4800\nf 5674 23319 18798\nf 23319 3340 23320\nf 18798 23320 5682\nf 4800 18799 6109\nf 18799 5682 23321\nf 6109 23321 106\nf 5669 23322 18803\nf 23322 5667 23323\nf 18803 23323 5674\nf 5667 21654 23323\nf 21654 3340 23319\nf 23323 23319 5674\nf 5667 23322 23301\nf 23322 5669 23303\nf 23301 23303 5670\nf 3341 15788 22399\nf 15788 3335 18772\nf 22399 18772 2055\nf 714 23324 12083\nf 23324 5675 11762\nf 12083 11762 713\nf 4353 18804 23326\nf 18804 4354 23325\nf 23326 23325 5689\nf 5676 23327 23328\nf 23327 5689 23325\nf 23328 23325 4354\nf 5161 18805 22404\nf 18805 4353 21693\nf 22404 21693 5160\nf 5676 23328 23330\nf 23328 4354 23329\nf 23330 23329 2057\nf 5679 23331 21657\nf 23331 2057 23329\nf 21657 23329 4354\nf 5675 23324 18807\nf 23324 714 21659\nf 18807 21659 3338\nf 4885 23332 11759\nf 23332 5677 21688\nf 11759 21688 5173\nf 4361 22409 23333\nf 22409 3339 21025\nf 23333 21025 5162\nf 4885 23296 23332\nf 23296 4886 18769\nf 23332 18769 5677\nf 2057 18809 23330\nf 18809 5678 22431\nf 23330 22431 5676\nf 4361 18851 22407\nf 18851 5678 22406\nf 22407 22406 5430\nf 5164 11746 21661\nf 11746 2057 23331\nf 21661 23331 5679\nf 4356 18811 15783\nf 18811 5679 21656\nf 15783 21656 5161\nf 3338 11743 18808\nf 11743 4355 22405\nf 18808 22405 5160\nf 5680 23334 18816\nf 23334 4355 11744\nf 18816 11744 5163\nf 4356 15785 15772\nf 15785 4355 23334\nf 15772 23334 5680\nf 712 20186 23318\nf 20186 716 23335\nf 23318 23335 5429\nf 4888 18818 23336\nf 18818 5429 23335\nf 23336 23335 716\nf 3336 22401 18795\nf 22401 4887 23337\nf 18795 23337 4357\nf 5165 15789 11748\nf 15789 2058 23338\nf 11748 23338 2056\nf 2056 23338 21021\nf 23338 2058 18824\nf 21021 18824 5432\nf 717 23339 13673\nf 23339 4888 23336\nf 13673 23336 716\nf 4888 23339 21026\nf 23339 717 23340\nf 21026 23340 5681\nf 4357 23337 18821\nf 23337 4887 21665\nf 18821 21665 3342\nf 4358 23341 22410\nf 23341 5952 23342\nf 22410 23342 5431\nf 3340 18794 23344\nf 18794 5431 23343\nf 23344 23343 4359\nf 4889 22415 18823\nf 22415 3343 22411\nf 18823 22411 5432\nf 718 22414 13670\nf 22414 5681 23340\nf 13670 23340 717\nf 4887 18819 21666\nf 18819 4888 21028\nf 21666 21028 3344\nf 5683 23345 18827\nf 23345 106 23321\nf 18827 23321 5682\nf 2059 21679 22417\nf 21679 5684 21670\nf 22417 21670 3343\nf 4359 18825 23344\nf 18825 5682 23320\nf 23344 23320 3340\nf 106 23345 8803\nf 23345 5683 11754\nf 8803 11754 105\nf 5166 21672 21676\nf 21672 5952 21668\nf 21676 21668 5434\nf 3344 21027 18830\nf 21027 5681 23346\nf 18830 23346 5685\nf 5681 22413 23346\nf 22413 719 18839\nf 23346 18839 5685\nf 5433 18831 21030\nf 18831 5685 23347\nf 21030 23347 3346\nf 105 11753 8732\nf 11753 5168 23348\nf 8732 23348 104\nf 5684 21678 21667\nf 21678 5885 23349\nf 21667 23349 5434\nf 2060 22420 18833\nf 22420 5169 22424\nf 18833 22424 3347\nf 5170 22422 22423\nf 22422 3346 23350\nf 22423 23350 3348\nf 5687 23351 23352\nf 23351 3346 23347\nf 23352 23347 5685\nf 3346 23351 23350\nf 23351 5687 23353\nf 23350 23353 3348\nf 720 23354 13642\nf 23354 5862 18837\nf 13642 18837 719\nf 104 23355 8729\nf 23355 5686 11757\nf 8729 11757 102\nf 5686 23355 23356\nf 23355 104 23348\nf 23356 23348 5168\nf 4360 21686 21682\nf 21686 5172 18841\nf 21682 18841 3349\nf 5686 23356 18845\nf 23356 5168 18842\nf 18845 18842 5172\nf 721 23357 23358\nf 23357 5863 18847\nf 23358 18847 5862\nf 3348 23353 21684\nf 23353 5687 23359\nf 21684 23359 3350\nf 5212 21780 23360\nf 21780 3350 23359\nf 23360 23359 5687\nf 3347 23361 23363\nf 23361 5457 23362\nf 23363 23362 5885\nf 4360 23364 23365\nf 23364 5885 23362\nf 23365 23362 5457\nf 4360 23365 15876\nf 23365 5457 22493\nf 15876 22493 5456\nf 5885 23364 23349\nf 23364 4360 21681\nf 23349 21681 5434\nf 441 23366 21691\nf 23366 4890 18859\nf 21691 18859 5173\nf 5688 21034 21658\nf 21034 3352 23367\nf 21658 23367 5162\nf 4361 23333 21692\nf 23333 5162 23368\nf 21692 23368 3351\nf 713 11761 12080\nf 11761 5174 23369\nf 12080 23369 722\nf 5689 23327 18856\nf 23327 5676 23370\nf 18856 23370 2062\nf 4353 23371 21694\nf 23371 5690 23372\nf 21694 23372 4362\nf 5690 23371 18866\nf 23371 4353 23326\nf 18866 23326 5689\nf 443 7374 17246\nf 7374 4890 23366\nf 17246 23366 441\nf 3351 23368 21696\nf 23368 5162 23367\nf 21696 23367 3352\nf 722 23373 12075\nf 23373 5691 11771\nf 12075 11771 723\nf 5691 23373 11765\nf 23373 722 23369\nf 11765 23369 5174\nf 5180 23374 21698\nf 23374 4364 21705\nf 21698 21705 4363\nf 2063 23375 22433\nf 23375 5177 18857\nf 22433 18857 2062\nf 4362 23372 21700\nf 23372 5690 21697\nf 21700 21697 4363\nf 444 23376 10249\nf 23376 5692 7375\nf 10249 7375 443\nf 5919 11770 23377\nf 11770 5691 18862\nf 23377 18862 5693\nf 4364 23374 21709\nf 23374 5180 21703\nf 21709 21703 5185\nf 5177 23378 18871\nf 23378 2064 18876\nf 18871 18876 5181\nf 2064 23378 15817\nf 23378 5177 23375\nf 15817 23375 2063\nf 444 23379 23376\nf 23379 4891 23380\nf 23376 23380 5692\nf 4892 22436 22441\nf 22436 5179 15815\nf 22441 15815 5182\nf 3355 21036 23381\nf 21036 5692 23380\nf 23381 23380 4891\nf 3357 23382 21708\nf 23382 5693 21706\nf 21708 21706 4364\nf 5186 23383 21712\nf 23383 5181 18875\nf 21712 18875 5183\nf 5181 23383 21702\nf 23383 5186 18883\nf 21702 18883 5185\nf 5693 23382 23385\nf 23382 3357 23384\nf 23385 23384 5933\nf 5183 18884 22446\nf 18884 3356 23386\nf 22446 23386 2066\nf 2065 21714 21711\nf 21714 4893 18881\nf 21711 18881 5186\nf 5187 23387 18879\nf 23387 3356 22440\nf 18879 22440 5437\nf 3356 23387 23386\nf 23387 5187 22448\nf 23386 22448 2066\nf 4893 21040 18882\nf 21040 3357 21707\nf 18882 21707 5185\nf 4891 23388 23381\nf 23388 5696 18888\nf 23381 18888 3355\nf 446 23389 10278\nf 23389 5695 23390\nf 10278 23390 447\nf 447 23390 23392\nf 23390 5695 23391\nf 23392 23391 4891\nf 725 22445 11782\nf 22445 5438 23393\nf 11782 23393 4894\nf 4365 23394 22442\nf 23394 4894 23393\nf 22442 23393 5438\nf 2065 11778 21715\nf 11778 4366 21721\nf 21715 21721 5188\nf 5190 23395 18886\nf 23395 4894 23394\nf 18886 23394 4365\nf 446 23396 23389\nf 23396 5698 7378\nf 23389 7378 5695\nf 5695 21045 23391\nf 21045 5696 23388\nf 23391 23388 4891\nf 3358 21037 21717\nf 21037 5694 23397\nf 21717 23397 3359\nf 5696 21042 18889\nf 21042 3359 23397\nf 18889 23397 5694\nf 5189 11779 21720\nf 11779 2065 18897\nf 21720 18897 5697\nf 5184 22447 18896\nf 22447 2066 23398\nf 18896 23398 5697\nf 2067 18894 22450\nf 18894 5697 23398\nf 22450 23398 2066\nf 2067 18898 18892\nf 18898 5440 22451\nf 18892 22451 2068\nf 3361 15819 21725\nf 15819 5439 18900\nf 21725 18900 3362\nf 460 23399 10300\nf 23399 5698 23396\nf 10300 23396 446\nf 3360 7379 21723\nf 7379 5698 18903\nf 21723 18903 4369\nf 727 21048 16060\nf 21048 3363 23400\nf 16060 23400 2069\nf 4367 23401 11785\nf 23401 3363 23402\nf 11785 23402 5190\nf 3363 21047 23402\nf 21047 4894 23395\nf 23402 23395 5190\nf 5189 21719 21726\nf 21719 2068 23403\nf 21726 23403 5191\nf 4370 22456 22452\nf 22456 5191 23403\nf 22452 23403 2068\nf 5698 23399 18904\nf 23399 460 18905\nf 18904 18905 5699\nf 5442 15824 23404\nf 15824 2069 23400\nf 23404 23400 3363\nf 4367 18909 23401\nf 18909 3365 23405\nf 23401 23405 3363\nf 4368 21728 21724\nf 21728 5441 15822\nf 21724 15822 3361\nf 3365 22454 23405\nf 22454 5442 23404\nf 23405 23404 3363\nf 4895 23406 23407\nf 23406 4368 21051\nf 23407 21051 4369\nf 4370 11786 22458\nf 11786 5441 23408\nf 22458 23408 2071\nf 5445 22459 21729\nf 22459 2071 23408\nf 21729 23408 5441\nf 5700 23409 23410\nf 23409 728 15825\nf 23410 15825 5442\nf 5700 23410 11790\nf 23410 5442 22453\nf 11790 22453 5194\nf 5701 23411 15826\nf 23411 2070 21053\nf 15826 21053 5191\nf 5192 23412 23413\nf 23412 2070 23411\nf 23413 23411 5701\nf 5194 22455 21733\nf 22455 3365 23414\nf 21733 23414 5192\nf 2070 23412 18910\nf 23412 5192 23414\nf 18910 23414 3365\nf 4895 15829 23406\nf 15829 5444 18912\nf 23406 18912 4368\nf 4895 23407 7380\nf 23407 4369 18902\nf 7380 18902 5699\nf 5700 23415 23409\nf 23415 729 22029\nf 23409 22029 728\nf 2072 23416 22461\nf 23416 5938 18914\nf 22461 18914 2071\nf 5192 23413 21732\nf 23413 5701 23417\nf 21732 23417 4371\nf 5193 23418 18919\nf 23418 4371 23417\nf 18919 23417 5701\nf 5702 23419 18920\nf 23419 4372 21735\nf 18920 21735 4896\nf 5195 22463 22468\nf 22463 5444 21055\nf 22468 21055 5196\nf 451 23420 17915\nf 23420 5702 18917\nf 17915 18917 448\nf 5702 23420 23419\nf 23420 451 7383\nf 23419 7383 4372\nf 729 23421 22031\nf 23421 5703 11799\nf 22031 11799 730\nf 5703 23421 18922\nf 23421 729 23415\nf 18922 23415 5700\nf 5703 18921 18924\nf 18921 3366 11795\nf 18924 11795 5200\nf 2073 23422 22466\nf 23422 5193 23423\nf 22466 23423 5938\nf 5193 23422 18927\nf 23422 2073 23424\nf 18927 23424 3369\nf 449 7386 7385\nf 7386 4897 21060\nf 7385 21060 4372\nf 730 11798 7547\nf 11798 5199 18939\nf 7547 18939 731\nf 5200 23425 21062\nf 23425 5198 21745\nf 21062 21745 3370\nf 5446 22472 18929\nf 22472 3369 23424\nf 18929 23424 2073\nf 5200 11797 23425\nf 11797 5911 23426\nf 23425 23426 5198\nf 5193 18926 23418\nf 18926 5911 23427\nf 23418 23427 4371\nf 2074 21740 18932\nf 21740 3371 22476\nf 18932 22476 2076\nf 3368 23428 21743\nf 23428 5704 15832\nf 21743 15832 3371\nf 5705 7387 23429\nf 7387 449 7027\nf 23429 7027 453\nf 3368 11792 23428\nf 11792 3367 21058\nf 23428 21058 5704\nf 5704 21057 22473\nf 21057 4897 18937\nf 22473 18937 5202\nf 731 18938 12044\nf 18938 5706 23430\nf 12044 23430 732\nf 5707 23431 23432\nf 23431 5199 21061\nf 23432 21061 3370\nf 5446 22475 22471\nf 22475 3374 21746\nf 22471 21746 2075\nf 4373 21751 21744\nf 21751 4898 23433\nf 21744 23433 3370\nf 453 22477 23429\nf 22477 5201 18936\nf 23429 18936 5705\nf 3372 22474 18951\nf 22474 5202 18942\nf 18951 18942 3373\nf 5707 23434 18946\nf 23434 3375 23435\nf 18946 23435 5708\nf 4898 23436 23433\nf 23436 5707 23432\nf 23433 23432 3370\nf 732 23430 12035\nf 23430 5706 18943\nf 12035 18943 733\nf 4898 21756 23436\nf 21756 3375 23434\nf 23436 23434 5707\nf 5707 18947 23431\nf 18947 5706 18940\nf 23431 18940 5199\nf 5447 21747 23437\nf 21747 3374 22480\nf 23437 22480 2077\nf 5709 23438 23440\nf 23438 3373 23439\nf 23440 23439 5449\nf 5201 18953 18941\nf 18953 5449 23439\nf 18941 23439 3373\nf 733 18945 12039\nf 18945 5708 18960\nf 12039 18960 734\nf 2078 18959 21753\nf 18959 5204 21754\nf 21753 21754 4898\nf 348 23441 10231\nf 23441 5449 18952\nf 10231 18952 454\nf 3377 18950 23442\nf 18950 3373 23438\nf 23442 23438 5709\nf 5204 22483 21755\nf 22483 4899 15845\nf 21755 15845 3375\nf 5708 23435 18961\nf 23435 3375 15844\nf 18961 15844 3378\nf 5447 23437 18964\nf 23437 2077 21777\nf 18964 21777 5211\nf 348 15841 23441\nf 15841 5962 23443\nf 23441 23443 5449\nf 3377 23442 18966\nf 23442 5709 23444\nf 18966 23444 4374\nf 5205 21758 23445\nf 21758 4908 21073\nf 23445 21073 3408\nf 5710 23446 19088\nf 23446 5205 23445\nf 19088 23445 3408\nf 3407 7412 7393\nf 7412 4908 21760\nf 7393 21760 4375\nf 736 23447 13666\nf 23447 5710 23448\nf 13666 23448 735\nf 5710 23447 23450\nf 23447 736 23449\nf 23450 23449 5711\nf 4375 21759 21765\nf 21759 5205 18970\nf 21765 18970 4377\nf 5710 23450 23446\nf 23450 5711 18971\nf 23446 18971 5205\nf 5452 11807 18979\nf 11807 5967 21773\nf 18979 21773 3383\nf 5967 11809 23452\nf 11809 5712 23451\nf 23452 23451 4376\nf 4376 23453 18974\nf 23453 4900 15848\nf 18974 15848 3380\nf 4900 23453 19094\nf 23453 4376 23451\nf 19094 23451 5712\nf 2080 18975 21762\nf 18975 3380 22488\nf 21762 22488 5450\nf 5713 22489 23454\nf 22489 3381 22490\nf 23454 22490 4378\nf 4379 23455 11812\nf 23455 5714 18986\nf 11812 18986 4380\nf 5714 23456 23457\nf 23456 4377 18969\nf 23457 18969 5711\nf 737 23458 13663\nf 23458 5970 23459\nf 13663 23459 736\nf 5711 23460 23457\nf 23460 5970 23461\nf 23457 23461 5714\nf 4378 21766 18982\nf 21766 4377 23462\nf 18982 23462 4379\nf 5713 23463 18983\nf 23463 2081 15860\nf 18983 15860 5715\nf 2081 23463 18981\nf 23463 5713 23454\nf 18981 23454 4378\nf 738 23464 23466\nf 23464 4901 23465\nf 23466 23465 5970\nf 5714 23461 18987\nf 23461 5970 23465\nf 18987 23465 4901\nf 4379 23462 23455\nf 23462 4377 23456\nf 23455 23456 5714\nf 91 11813 23468\nf 11813 5208 23467\nf 23468 23467 89\nf 2082 18992 22491\nf 18992 5453 15854\nf 22491 15854 3382\nf 3384 18990 18997\nf 18990 2082 23469\nf 18997 23469 5454\nf 2082 22492 23471\nf 22492 5715 23470\nf 23471 23470 3388\nf 4381 23472 15859\nf 23472 3388 23470\nf 15859 23470 5715\nf 739 23473 13654\nf 23473 4901 23464\nf 13654 23464 738\nf 4901 23473 18996\nf 23473 739 11816\nf 18996 11816 5209\nf 89 23467 6078\nf 23467 5208 7398\nf 6078 7398 87\nf 5210 23474 18988\nf 23474 5716 23475\nf 18988 23475 3387\nf 4902 21064 23476\nf 21064 3387 23475\nf 23476 23475 5716\nf 5454 23469 23477\nf 23469 2082 23471\nf 23477 23471 3388\nf 3385 11810 18999\nf 11810 4380 21775\nf 18999 21775 4382\nf 87 7400 8704\nf 7400 4902 19012\nf 8704 19012 85\nf 4383 23478 21776\nf 23478 4374 23479\nf 21776 23479 5210\nf 5716 23480 23482\nf 23480 5709 23481\nf 23482 23481 5962\nf 4384 19002 23483\nf 19002 5454 23477\nf 23483 23477 3388\nf 3388 23484 23483\nf 23484 5717 19014\nf 23483 19014 4384\nf 5717 23484 15869\nf 23484 3388 23472\nf 15869 23472 4381\nf 3390 19000 23485\nf 19000 4382 19011\nf 23485 19011 4899\nf 4383 23486 23478\nf 23486 5719 18967\nf 23478 18967 4374\nf 5719 23486 23487\nf 23486 4383 11821\nf 23487 11821 5455\nf 740 7401 11818\nf 7401 5718 23488\nf 11818 23488 5209\nf 4382 21774 19009\nf 21774 5209 23488\nf 19009 23488 5718\nf 5716 23489 23480\nf 23489 4374 23444\nf 23480 23444 5709\nf 4374 23489 23479\nf 23489 5716 23474\nf 23479 23474 5210\nf 5717 19005 19015\nf 19005 4385 21779\nf 19015 21779 5211\nf 5719 23487 22482\nf 23487 5455 19008\nf 22482 19008 5448\nf 2077 22481 21778\nf 22481 5448 19007\nf 21778 19007 4384\nf 4385 19004 22484\nf 19004 3390 23485\nf 22484 23485 4899\nf 5721 23490 23492\nf 23490 5863 23491\nf 23492 23491 742\nf 3395 15888 15879\nf 15888 5720 23493\nf 15879 23493 4386\nf 3350 21782 21683\nf 21782 4386 23494\nf 21683 23494 5435\nf 5720 23495 23493\nf 23495 5435 23494\nf 23493 23494 4386\nf 742 8172 23492\nf 8172 743 23496\nf 23492 23496 5721\nf 4386 21781 15877\nf 21781 5212 19020\nf 15877 19020 4387\nf 5863 23490 23497\nf 23490 5721 19021\nf 23497 19021 5212\nf 4903 23498 19022\nf 23498 3394 23499\nf 19022 23499 5458\nf 3394 23498 23500\nf 23498 4903 21687\nf 23500 21687 3391\nf 5459 22497 19024\nf 22497 3394 23500\nf 19024 23500 3391\nf 3397 23501 21786\nf 23501 5460 15886\nf 21786 15886 3395\nf 4387 23502 15878\nf 23502 3396 11827\nf 15878 11827 3395\nf 3396 23502 21069\nf 23502 4387 19029\nf 21069 19029 5722\nf 4904 22494 19027\nf 22494 3393 15884\nf 19027 15884 5723\nf 744 23503 8188\nf 23503 5721 23496\nf 8188 23496 743\nf 5721 23503 19030\nf 23503 744 23504\nf 19030 23504 5722\nf 100 19031 8720\nf 19031 5724 23505\nf 8720 23505 99\nf 4388 21789 22496\nf 21789 5724 23506\nf 22496 23506 3394\nf 5458 23499 19033\nf 23499 3394 23506\nf 19033 23506 5724\nf 2084 19043 23508\nf 19043 2085 23507\nf 23508 23507 5461\nf 5214 23509 19038\nf 23509 3398 21790\nf 19038 21790 4388\nf 745 7404 13644\nf 7404 5722 23504\nf 13644 23504 744\nf 99 23510 23512\nf 23510 4906 23511\nf 23512 23511 98\nf 4906 23510 19042\nf 23510 99 23505\nf 19042 23505 5724\nf 5461 21788 23508\nf 21788 4389 21785\nf 23508 21785 2084\nf 5461 23507 19045\nf 23507 2085 22499\nf 19045 22499 2086\nf 5213 19048 22498\nf 19048 4390 15889\nf 22498 15889 3399\nf 4905 23513 21791\nf 23513 746 19061\nf 21791 19061 3401\nf 746 23513 13643\nf 23513 4905 7405\nf 13643 7405 745\nf 3402 22502 22501\nf 22502 2087 15895\nf 22501 15895 3399\nf 5723 15883 19051\nf 15883 5460 23501\nf 19051 23501 3397\nf 5215 21793 19054\nf 21793 5216 23514\nf 19054 23514 4906\nf 5214 23515 23509\nf 23515 5215 19053\nf 23509 19053 3398\nf 5463 19055 23517\nf 19055 5464 23516\nf 23517 23516 2089\nf 5725 19062 23518\nf 19062 5463 23517\nf 23518 23517 2089\nf 4392 23519 19058\nf 23519 5215 23515\nf 19058 23515 5214\nf 98 23520 6093\nf 23520 5216 23521\nf 6093 23521 97\nf 5216 23520 23514\nf 23520 98 23511\nf 23514 23511 4906\nf 4392 11831 23519\nf 11831 4394 21794\nf 23519 21794 5215\nf 5725 19065 19063\nf 19065 4391 19046\nf 19063 19046 2086\nf 5725 23518 23522\nf 23518 2089 19082\nf 23522 19082 5727\nf 2089 23516 22503\nf 23516 5464 19071\nf 22503 19071 5218\nf 3400 19050 19073\nf 19050 3401 23523\nf 19073 23523 3403\nf 5726 23524 19075\nf 23524 3403 23523\nf 19075 23523 3401\nf 3403 23524 21071\nf 23524 5726 23525\nf 21071 23525 4907\nf 748 23526 8259\nf 23526 5726 7409\nf 8259 7409 2088\nf 5727 23527 23522\nf 23527 4393 19066\nf 23522 19066 5725\nf 4393 23527 23528\nf 23527 5727 21802\nf 23528 21802 5219\nf 4907 23525 23529\nf 23525 5726 23526\nf 23529 23526 748\nf 5451 22487 19080\nf 22487 2091 23530\nf 19080 23530 5465\nf 5219 21803 21806\nf 21803 5465 23530\nf 21806 23530 2091\nf 4395 23531 21800\nf 23531 5219 21808\nf 21800 21808 5220\nf 5219 23531 23528\nf 23531 4395 19069\nf 23528 19069 4393\nf 3407 11805 7410\nf 11805 5729 22506\nf 7410 22506 3406\nf 735 23532 13650\nf 23532 4907 23529\nf 13650 23529 748\nf 4907 23532 19090\nf 23532 735 23448\nf 19090 23448 5710\nf 3408 21796 23533\nf 21796 3404 11836\nf 23533 11836 3405\nf 4907 19089 21070\nf 19089 3408 23533\nf 21070 23533 3405\nf 5221 23534 23536\nf 23534 95 23535\nf 23536 23535 5728\nf 5728 21805 23536\nf 21805 3379 7390\nf 23536 7390 5221\nf 95 23534 8716\nf 23534 5221 18972\nf 8716 18972 92\n\nusemtl material_1\nf 5466 22511 22518\nf 22511 5222 11840\nf 22518 11840 2041\nf 434 23537 23539\nf 23537 5656 23538\nf 23539 23538 5828\nf 5739 23540 23542\nf 23540 433 23541\nf 23542 23541 5939\nf 432 23543 23545\nf 23543 5730 23544\nf 23545 23544 5939\nf 430 11839 6790\nf 11839 5730 23543\nf 6790 23543 432\nf 5231 23546 21815\nf 23546 5730 21817\nf 21815 21817 4397\nf 5939 23547 23542\nf 23547 5231 23548\nf 23542 23548 5739\nf 5233 21834 22513\nf 21834 5224 23549\nf 22513 23549 5222\nf 4396 21810 21813\nf 21810 5222 23549\nf 21813 23549 5224\nf 383 19106 23551\nf 19106 4398 23550\nf 23551 23550 5731\nf 4205 17919 21819\nf 17919 5525 19108\nf 21819 19108 4399\nf 384 23552 22682\nf 23552 5731 19109\nf 22682 19109 5525\nf 5467 15914 22520\nf 15914 4966 23553\nf 22520 23553 3412\nf 5225 15913 19112\nf 15913 3412 23553\nf 19112 23553 4966\nf 4399 23554 21820\nf 23554 4398 23555\nf 21820 23555 4400\nf 4398 23554 23550\nf 23554 4399 19107\nf 23550 19107 5731\nf 3412 15912 22521\nf 15912 5226 15916\nf 22521 15916 2093\nf 4400 23555 19116\nf 23555 4398 23556\nf 19116 23556 5733\nf 386 23557 19105\nf 23557 5733 23556\nf 19105 23556 4398\nf 5227 19138 15917\nf 19138 4403 23558\nf 15917 23558 4911\nf 4911 23558 7419\nf 23558 4403 23559\nf 7419 23559 5228\nf 2094 23560 22523\nf 23560 4912 21084\nf 22523 21084 3411\nf 4912 23560 19122\nf 23560 2094 23561\nf 19122 23561 5732\nf 5732 23561 19124\nf 23561 2094 23562\nf 19124 23562 2097\nf 5733 23557 19128\nf 23557 386 10169\nf 19128 10169 388\nf 4402 22525 23564\nf 22525 3413 23563\nf 23564 23563 5734\nf 5733 19127 19117\nf 19127 5734 23563\nf 19117 23563 3413\nf 2093 11843 15909\nf 11843 2095 23565\nf 15909 23565 5468\nf 5469 19132 23566\nf 19132 5468 23565\nf 23566 23565 2095\nf 4402 23564 11851\nf 23564 5734 23567\nf 11851 23567 5229\nf 4403 23568 23559\nf 23568 5738 19135\nf 23559 19135 5228\nf 2096 23569 19140\nf 23569 2097 23562\nf 19140 23562 2094\nf 5470 21829 22535\nf 21829 2097 23569\nf 22535 23569 2096\nf 2096 19139 22536\nf 19139 5469 19142\nf 22536 19142 2099\nf 3422 23570 15921\nf 23570 5735 23571\nf 15921 23571 2095\nf 5469 23566 19143\nf 23566 2095 23571\nf 19143 23571 5735\nf 395 19145 6723\nf 19145 5736 23572\nf 6723 23572 390\nf 3419 7426 21824\nf 7426 5230 22570\nf 21824 22570 3434\nf 4404 19157 21105\nf 19157 5736 23573\nf 21105 23573 3433\nf 5251 23574 19147\nf 23574 3433 23573\nf 19147 23573 5736\nf 5252 23575 19152\nf 23575 3416 22528\nf 19152 22528 4405\nf 4914 21089 22531\nf 21089 3417 21830\nf 22531 21830 5470\nf 390 23572 23576\nf 23572 5736 19156\nf 23576 19156 5866\nf 4404 21822 19155\nf 21822 5229 23577\nf 19155 23577 5866\nf 2099 19158 22533\nf 19158 5737 19148\nf 22533 19148 3418\nf 3419 21826 23578\nf 21826 5737 19159\nf 23578 19159 5735\nf 5735 23570 23578\nf 23570 3422 21827\nf 23578 21827 3419\nf 5738 23579 19161\nf 23579 3415 23580\nf 19161 23580 3420\nf 4405 22527 19162\nf 22527 3420 23580\nf 19162 23580 3415\nf 749 19136 11950\nf 19136 5738 19160\nf 11950 19160 751\nf 3415 23579 19137\nf 23579 5738 23568\nf 19137 23568 4403\nf 2101 11857 19103\nf 11857 5233 22512\nf 19103 22512 5466\nf 5841 23581 23583\nf 23581 5739 23582\nf 23583 23582 5237\nf 5739 23584 23540\nf 23584 427 6782\nf 23540 6782 433\nf 5232 21832 23586\nf 21832 4406 23585\nf 23586 23585 5867\nf 5739 23548 23588\nf 23548 5231 23587\nf 23588 23587 5867\nf 5829 11859 23590\nf 11859 2092 23589\nf 23590 23589 5235\nf 4910 22516 22517\nf 22516 5235 23589\nf 22517 23589 2092\nf 4909 23591 23592\nf 23591 4407 19165\nf 23592 19165 5740\nf 5234 22537 23594\nf 22537 2100 23593\nf 23594 23593 5912\nf 427 23584 23595\nf 23584 5739 23581\nf 23595 23581 5841\nf 2102 21846 23596\nf 21846 5238 19167\nf 23596 19167 5913\nf 5741 21835 19166\nf 21835 5233 11856\nf 19166 11856 5913\nf 5869 23597 23599\nf 23597 4406 23598\nf 23599 23598 4408\nf 5741 19168 23600\nf 19168 5238 15926\nf 23600 15926 4408\nf 2102 22541 21847\nf 22541 4915 21090\nf 21847 21090 3424\nf 753 7593 23602\nf 7593 754 23601\nf 23602 23601 5871\nf 5871 19178 23604\nf 19178 5870 23603\nf 23604 23603 5912\nf 3423 19175 21850\nf 19175 5870 23605\nf 21850 23605 4409\nf 5742 23606 19180\nf 23606 4409 23605\nf 19180 23605 5870\nf 3426 21130 19182\nf 21130 5471 22544\nf 19182 22544 3425\nf 5472 22549 19171\nf 22549 5743 21091\nf 19171 21091 4915\nf 5743 22548 21855\nf 22548 4410 23607\nf 21855 23607 5280\nf 5744 23608 23609\nf 23608 4409 23606\nf 23609 23606 5742\nf 4409 23608 22550\nf 23608 5744 11863\nf 22550 11863 4410\nf 5240 11861 23611\nf 11861 5744 23610\nf 23611 23610 4411\nf 5742 23612 23609\nf 23612 4433 23613\nf 23609 23613 5744\nf 755 23614 12161\nf 23614 4433 23615\nf 12161 23615 754\nf 4433 23614 23616\nf 23614 755 19339\nf 23616 19339 5778\nf 4411 23610 23617\nf 23610 5744 23613\nf 23617 23613 4433\nf 429 23618 10208\nf 23618 4929 23619\nf 10208 23619 421\nf 4929 23618 21092\nf 23618 429 23620\nf 21092 23620 5841\nf 2105 12132 19190\nf 12132 756 7428\nf 19190 7428 5963\nf 401 23621 7083\nf 23621 5746 7431\nf 7083 7431 400\nf 5746 23621 19236\nf 23621 401 23622\nf 19236 23622 4919\nf 3428 22556 21857\nf 22556 3429 21098\nf 21857 21098 4413\nf 5243 23623 21096\nf 23623 5748 19192\nf 21096 19192 5745\nf 5747 19196 22561\nf 19196 2108 21864\nf 22561 21864 5242\nf 397 10176 11866\nf 10176 400 7433\nf 11866 7433 5748\nf 3428 23624 22557\nf 23624 5749 23625\nf 22557 23625 4415\nf 5749 23624 15933\nf 23624 3428 19232\nf 15933 19232 5473\nf 5241 21099 19209\nf 21099 757 23626\nf 19209 23626 5873\nf 2108 21859 21865\nf 21859 4414 21862\nf 21865 21862 3430\nf 397 11865 10177\nf 11865 5248 19215\nf 10177 19215 398\nf 2109 19219 23628\nf 19219 5754 23627\nf 23628 23627 5751\nf 5749 19205 23629\nf 19205 2109 23628\nf 23629 23628 5751\nf 4415 23625 23630\nf 23625 5749 23629\nf 23630 23629 5751\nf 758 23631 23633\nf 23631 5755 23632\nf 23633 23632 5873\nf 3430 23634 21866\nf 23634 5752 21103\nf 21866 21103 3431\nf 5752 23634 23635\nf 23634 3430 21861\nf 23635 21861 5750\nf 398 19214 10173\nf 19214 5753 23636\nf 10173 23636 394\nf 5251 23637 19213\nf 23637 394 23636\nf 19213 23636 5753\nf 4416 23638 21870\nf 23638 4417 23639\nf 21870 23639 5247\nf 5247 23639 11873\nf 23639 4417 19211\nf 11873 19211 5753\nf 2111 11870 22565\nf 11870 5245 23640\nf 22565 23640 2110\nf 5754 19221 21869\nf 19221 2110 23640\nf 21869 23640 5245\nf 4415 23630 21871\nf 23630 5751 23641\nf 21871 23641 4416\nf 5754 19218 23627\nf 19218 4416 23641\nf 23627 23641 5751\nf 759 23642 12134\nf 23642 5755 23631\nf 12134 23631 758\nf 5755 23642 23644\nf 23642 759 23643\nf 23644 23643 4916\nf 5755 23644 19222\nf 23644 4916 21877\nf 19222 21877 4917\nf 394 23637 6730\nf 23637 5251 19146\nf 6730 19146 395\nf 3433 23645 15945\nf 23645 4417 23646\nf 15945 23646 4418\nf 4417 23645 19212\nf 23645 3433 23574\nf 19212 23574 5251\nf 2112 23647 11872\nf 23647 5246 21868\nf 11872 21868 5245\nf 5246 23647 23648\nf 23647 2112 21875\nf 23648 21875 3434\nf 5475 23649 22572\nf 23649 2098 21087\nf 22572 21087 4914\nf 2098 23649 15944\nf 23649 5475 22566\nf 15944 22566 5250\nf 5252 19151 11876\nf 19151 3417 21088\nf 11876 21088 2098\nf 760 23650 12138\nf 23650 4916 23643\nf 12138 23643 759\nf 4916 23650 19231\nf 23650 760 23651\nf 19231 23651 5756\nf 3432 22568 21100\nf 22568 3431 21102\nf 21100 21102 4917\nf 4917 21876 21101\nf 21876 3416 23575\nf 21101 23575 5252\nf 750 23652 7664\nf 23652 5756 23651\nf 7664 23651 760\nf 5756 23652 22529\nf 23652 750 19154\nf 22529 19154 3420\nf 2106 22558 22579\nf 22558 5473 19234\nf 22579 19234 5476\nf 4413 21097 21879\nf 21097 5745 23653\nf 21879 23653 4920\nf 5746 19235 19193\nf 19235 4920 23653\nf 19193 23653 5745\nf 5254 23654 21884\nf 23654 761 22573\nf 21884 22573 5253\nf 2113 19238 22577\nf 19238 4918 23655\nf 22577 23655 5894\nf 3435 23656 23657\nf 23656 5757 19242\nf 23657 19242 5874\nf 4412 22551 23658\nf 22551 5757 23656\nf 23658 23656 3435\nf 4419 21108 21887\nf 21108 3435 23659\nf 21887 23659 4420\nf 5255 22581 22576\nf 22581 5895 23660\nf 22576 23660 2113\nf 5757 19239 19243\nf 19239 2113 23661\nf 19243 23661 5257\nf 3436 22580 21889\nf 22580 4413 21878\nf 21889 21878 3437\nf 4919 23662 19237\nf 23662 5758 19246\nf 19237 19246 4920\nf 1622 23663 23665\nf 23663 5914 23664\nf 23665 23664 4919\nf 4919 23622 23665\nf 23622 401 10181\nf 23665 10181 1622\nf 3437 19244 21890\nf 19244 5758 23666\nf 21890 23666 3438\nf 404 11880 23667\nf 11880 5875 19251\nf 23667 19251 5914\nf 2115 23668 23670\nf 23668 5254 23669\nf 23670 23669 5759\nf 5254 21883 23671\nf 21883 4419 21886\nf 23671 21886 5261\nf 5259 22591 19249\nf 22591 2114 22584\nf 19249 22584 5256\nf 2115 23670 12925\nf 23670 5759 23672\nf 12925 23672 762\nf 5260 23673 23674\nf 23673 762 23672\nf 23674 23672 5759\nf 4421 23675 21893\nf 23675 4422 21895\nf 21893 21895 4420\nf 5260 23674 21897\nf 23674 5759 23676\nf 21897 23676 5261\nf 4921 21901 23677\nf 21901 3438 23666\nf 23677 23666 5758\nf 762 23673 19918\nf 23673 5260 23678\nf 19918 23678 763\nf 3439 19259 22594\nf 19259 5258 23679\nf 22594 23679 5896\nf 5262 19257 21904\nf 19257 4422 23675\nf 21904 23675 4421\nf 5480 15953 22596\nf 15953 5264 23680\nf 22596 23680 3439\nf 3441 23681 21111\nf 23681 5479 22589\nf 21111 22589 5477\nf 5479 23681 22597\nf 23681 3441 22599\nf 22597 22599 5480\nf 406 23682 11245\nf 23682 5478 22592\nf 11245 22592 1624\nf 5478 23682 21114\nf 23682 406 23683\nf 21114 23683 5762\nf 4421 23684 21902\nf 23684 5760 23685\nf 21902 23685 4423\nf 5264 21913 23680\nf 21913 5263 23686\nf 23680 23686 3439\nf 5760 19260 23687\nf 19260 3439 23686\nf 23687 23686 5263\nf 4423 21909 21903\nf 21909 4424 21915\nf 21903 21915 5262\nf 5266 21916 19263\nf 21916 5265 11883\nf 19263 11883 5761\nf 763 23688 7645\nf 23688 5761 23689\nf 7645 23689 764\nf 5761 23688 19264\nf 23688 763 23678\nf 19264 23678 5260\nf 3442 21917 19267\nf 21917 4922 7436\nf 19267 7436 3440\nf 764 23690 7847\nf 23690 5763 23691\nf 7847 23691 765\nf 5763 23690 11882\nf 23690 764 23689\nf 11882 23689 5761\nf 4425 21919 21911\nf 21919 5268 19269\nf 21911 19269 4424\nf 5267 19271 19273\nf 19271 5265 19270\nf 19273 19270 5268\nf 4423 23692 21910\nf 23692 5263 19277\nf 21910 19277 4425\nf 5263 23692 23687\nf 23692 4423 23685\nf 23687 23685 5760\nf 5764 23693 19275\nf 23693 5273 21932\nf 19275 21932 5267\nf 2117 23694 22602\nf 23694 5264 15955\nf 22602 15955 2116\nf 5264 23694 21912\nf 23694 2117 19279\nf 21912 19279 5765\nf 5769 19283 23695\nf 19283 4425 19276\nf 23695 19276 5765\nf 2118 23696 19280\nf 23696 5769 23695\nf 19280 23695 5765\nf 3442 19266 21922\nf 19266 5766 23697\nf 21922 23697 5876\nf 5767 23698 23699\nf 23698 5876 23697\nf 23699 23697 5766\nf 406 6748 23683\nf 6748 1625 19285\nf 23683 19285 5762\nf 5876 23700 23701\nf 23700 4923 15960\nf 23701 15960 4924\nf 5767 19286 19287\nf 19286 1625 7196\nf 19287 7196 408\nf 767 23702 23703\nf 23702 5768 19294\nf 23703 19294 5771\nf 5768 23702 19290\nf 23702 767 7638\nf 19290 7638 766\nf 4925 21125 21930\nf 21125 5273 23693\nf 21930 23693 5764\nf 2119 23704 22604\nf 23704 5272 23705\nf 22604 23705 2118\nf 5769 23696 23706\nf 23696 2118 23705\nf 23706 23705 5272\nf 5764 21920 21931\nf 21920 4426 21927\nf 21931 21927 5271\nf 5769 23706 21928\nf 23706 5272 22606\nf 21928 22606 5271\nf 5270 21924 19296\nf 21924 3443 21940\nf 19296 21940 5482\nf 4923 23707 15959\nf 23707 5483 23708\nf 15959 23708 3444\nf 5483 23707 22607\nf 23707 4923 21120\nf 22607 21120 5770\nf 767 23709 12126\nf 23709 5772 23710\nf 12126 23710 768\nf 5772 23709 19301\nf 23709 767 23703\nf 19301 23703 5771\nf 4428 19308 21933\nf 19308 5772 19300\nf 21933 19300 4427\nf 2120 23711 22605\nf 23711 4925 21929\nf 22605 21929 5271\nf 4925 23711 21123\nf 23711 2120 23712\nf 21123 23712 5274\nf 4427 19299 21124\nf 19299 5771 19293\nf 21124 19293 5273\nf 5272 23704 21935\nf 23704 2119 22609\nf 21935 22609 5484\nf 4429 21937 23713\nf 21937 5274 23712\nf 23713 23712 2120\nf 2120 21936 23713\nf 21936 5484 19303\nf 23713 19303 4429\nf 2121 22610 15961\nf 22610 2119 19297\nf 15961 19297 5482\nf 3445 21941 7437\nf 21941 3443 21118\nf 7437 21118 4924\nf 5483 19306 23708\nf 19306 3446 21127\nf 23708 21127 3444\nf 410 23714 10189\nf 23714 5774 23715\nf 10189 23715 1627\nf 5483 22608 19307\nf 22608 1627 23715\nf 19307 23715 5774\nf 768 23716 13455\nf 23716 5773 23717\nf 13455 23717 769\nf 5773 23716 19310\nf 23716 768 23710\nf 19310 23710 5772\nf 5487 15972 19312\nf 15972 2123 23718\nf 19312 23718 5485\nf 5486 15970 15967\nf 15970 5485 23718\nf 15967 23718 2123\nf 4430 15964 19322\nf 15964 3446 19305\nf 19322 19305 5774\nf 4926 19320 19318\nf 19320 5775 19333\nf 19318 19333 3448\nf 5774 23714 19323\nf 23714 410 23719\nf 19323 23719 4927\nf 5276 11897 19326\nf 11897 769 23717\nf 19326 23717 5773\nf 2124 19332 15969\nf 19332 5776 22614\nf 15969 22614 5486\nf 5777 23720 19331\nf 23720 4431 23721\nf 19331 23721 5776\nf 3447 22613 21944\nf 22613 5776 23721\nf 21944 23721 4431\nf 5277 19334 16026\nf 19334 5775 21147\nf 16026 21147 3472\nf 1896 23722 11275\nf 23722 4927 23719\nf 11275 23719 410\nf 3472 19336 16024\nf 19336 5795 19418\nf 16024 19418 5496\nf 632 23723 7240\nf 23723 5795 23724\nf 7240 23724 1896\nf 4927 23722 19338\nf 23722 1896 23724\nf 19338 23724 5795\nf 4433 23616 23617\nf 23616 5778 21951\nf 23617 21951 4411\nf 421 23725 6778\nf 23725 4930 23726\nf 6778 23726 1637\nf 4930 23725 19345\nf 23725 421 23619\nf 19345 23619 4929\nf 3452 19349 11900\nf 19349 4930 19344\nf 11900 19344 3451\nf 4434 23727 19352\nf 23727 5279 23728\nf 19352 23728 5240\nf 2126 23729 23730\nf 23729 4434 19366\nf 23730 19366 4931\nf 1637 23726 23731\nf 23726 4930 19351\nf 23731 19351 5779\nf 5779 19355 23731\nf 19355 425 10216\nf 23731 10216 1637\nf 5779 19350 23733\nf 19350 3452 23732\nf 23733 23732 4435\nf 4437 15983 15987\nf 15983 2125 21954\nf 15987 21954 2126\nf 5281 23734 23735\nf 23734 3454 15992\nf 23735 15992 5282\nf 3454 23734 15988\nf 23734 5281 19341\nf 15988 19341 770\nf 5779 23736 19356\nf 23736 4436 23737\nf 19356 23737 5780\nf 4436 23736 19360\nf 23736 5779 23733\nf 19360 23733 4435\nf 425 19357 6777\nf 19357 5780 23738\nf 6777 23738 424\nf 5781 23739 21961\nf 23739 4435 23740\nf 21961 23740 3453\nf 3452 21956 23732\nf 21956 3453 23740\nf 23732 23740 4435\nf 5283 21962 19359\nf 21962 3453 22621\nf 19359 22621 5490\nf 4438 19361 19372\nf 19361 4435 23739\nf 19372 23739 5781\nf 2128 22622 22626\nf 22622 4437 15986\nf 22626 15986 5284\nf 3456 21963 11902\nf 21963 2126 23730\nf 11902 23730 4931\nf 5279 23727 21953\nf 23727 4434 23729\nf 21953 23729 2126\nf 5282 15991 21960\nf 15991 3457 21132\nf 21960 21132 3455\nf 3457 19368 15996\nf 19368 5782 23741\nf 15996 23741 3458\nf 771 23742 12164\nf 23742 5782 23743\nf 12164 23743 2127\nf 3454 15989 19369\nf 15989 2127 23743\nf 19369 23743 5782\nf 424 23738 23744\nf 23738 5780 19375\nf 23744 19375 339\nf 771 23745 23742\nf 23745 5785 23746\nf 23742 23746 5782\nf 5785 23747 23746\nf 23747 3458 23741\nf 23746 23741 5782\nf 4440 16003 19371\nf 16003 5492 23748\nf 19371 23748 4436\nf 5780 23737 19376\nf 23737 4436 23748\nf 19376 23748 5492\nf 5286 22632 21972\nf 22632 5493 23749\nf 21972 23749 4933\nf 5286 22627 11905\nf 22627 5491 23750\nf 11905 23750 3459\nf 2130 22633 23751\nf 22633 5784 22623\nf 23751 22623 2129\nf 3458 23747 23752\nf 23747 5785 19379\nf 23752 19379 5287\nf 5491 22624 23750\nf 22624 5784 23753\nf 23750 23753 3459\nf 4439 23754 11903\nf 23754 2130 23755\nf 11903 23755 5783\nf 2129 21969 23751\nf 21969 5783 23755\nf 23751 23755 2130\nf 4439 15999 21974\nf 15999 3458 23752\nf 21974 23752 5287\nf 2131 23756 12112\nf 23756 5785 23745\nf 12112 23745 771\nf 5785 23756 23758\nf 23756 2131 23757\nf 23758 23757 5786\nf 1633 22630 10207\nf 22630 5787 23759\nf 10207 23759 420\nf 4441 22628 23760\nf 22628 4933 23749\nf 23760 23749 5493\nf 5788 22635 23762\nf 22635 2133 23761\nf 23762 23761 3460\nf 5788 23763 19380\nf 23763 3459 23753\nf 19380 23753 5784\nf 3459 23763 11906\nf 23763 5788 23762\nf 11906 23762 3460\nf 2130 23754 21133\nf 23754 4439 21973\nf 21133 21973 3462\nf 3461 19377 23764\nf 19377 5785 23758\nf 23764 23758 5786\nf 2131 12314 23757\nf 12314 772 19383\nf 23757 19383 5786\nf 5289 23765 19386\nf 23765 420 23759\nf 19386 23759 5787\nf 4442 23766 23767\nf 23766 5288 21975\nf 23767 21975 4441\nf 5288 23766 19395\nf 23766 4442 23768\nf 19395 23768 5791\nf 2133 19388 23761\nf 19388 5789 23769\nf 23761 23769 3460\nf 5493 22631 23770\nf 22631 3460 23769\nf 23770 23769 5789\nf 4442 23767 23772\nf 23767 4441 23771\nf 23772 23771 5789\nf 3465 21979 19387\nf 21979 4442 23772\nf 19387 23772 5789\nf 5493 23770 23760\nf 23770 5789 23771\nf 23760 23771 4441\nf 2135 23773 22637\nf 23773 5792 11909\nf 22637 11909 2133\nf 5287 19378 19390\nf 19378 3461 21139\nf 19390 21139 3463\nf 4934 23774 21135\nf 23774 3461 23764\nf 21135 23764 5786\nf 3461 23774 21140\nf 23774 4934 23775\nf 21140 23775 4935\nf 3464 22634 19433\nf 22634 3463 21138\nf 19433 21138 4446\nf 4934 23776 23775\nf 23776 5790 21996\nf 23775 21996 4935\nf 773 23777 12317\nf 23777 4934 21136\nf 12317 21136 2134\nf 4934 23777 23776\nf 23777 773 19431\nf 23776 19431 5790\nf 420 23765 10206\nf 23765 5289 19398\nf 10206 19398 1632\nf 5791 23778 19396\nf 23778 5799 19399\nf 19396 19399 5289\nf 5497 22640 21978\nf 22640 5791 23768\nf 21978 23768 4442\nf 5791 22641 23778\nf 22641 4447 22000\nf 23778 22000 5799\nf 3464 19434 22639\nf 19434 2141 16014\nf 22639 16014 5290\nf 3473 19438 21999\nf 19438 5792 23779\nf 21999 23779 5298\nf 2140 23780 22642\nf 23780 5792 23773\nf 22642 23773 2135\nf 4941 19400 23781\nf 19400 5304 22014\nf 23781 22014 5305\nf 3467 19416 22663\nf 19416 3468 19401\nf 22663 19401 4941\nf 412 19403 10195\nf 19403 5793 23782\nf 10195 23782 632\nf 4937 23783 23785\nf 23783 5793 23784\nf 23785 23784 4449\nf 5303 19462 19405\nf 19462 4449 23784\nf 19405 23784 5793\nf 5292 16018 19456\nf 16018 3466 11928\nf 19456 11928 4450\nf 2138 22649 23787\nf 22649 4443 23786\nf 23787 23786 5293\nf 5494 19410 22645\nf 19410 5293 23786\nf 22645 23786 4443\nf 4936 7447 21141\nf 7447 5304 19402\nf 21141 19402 3468\nf 3467 16016 19414\nf 16016 5794 21991\nf 19414 21991 5294\nf 5794 23788 11915\nf 23788 775 23789\nf 11915 23789 5798\nf 4936 21142 21988\nf 21142 5294 21992\nf 21988 21992 5295\nf 775 23788 12125\nf 23788 5794 16015\nf 12125 16015 2137\nf 5795 23723 23790\nf 23723 632 23782\nf 23790 23782 5793\nf 5795 23790 19419\nf 23790 5793 23783\nf 19419 23783 4937\nf 2138 23787 22651\nf 23787 5293 23791\nf 22651 23791 2139\nf 5796 19425 19421\nf 19425 2139 23791\nf 19421 23791 5293\nf 5797 23792 19423\nf 23792 4444 21989\nf 19423 21989 5295\nf 4444 23792 23794\nf 23792 5797 23793\nf 23794 23793 5777\nf 776 19429 7634\nf 19429 5798 23789\nf 7634 23789 775\nf 5796 23795 19426\nf 23795 5777 19330\nf 19426 19330 2124\nf 5777 23795 23794\nf 23795 5796 21984\nf 23794 21984 4444\nf 5777 23793 23720\nf 23793 5797 19327\nf 23720 19327 4431\nf 4445 11916 21994\nf 11916 5798 23796\nf 21994 23796 4432\nf 5276 19325 19428\nf 19325 4432 23796\nf 19428 23796 5798\nf 5499 22654 19430\nf 22654 3474 21995\nf 19430 21995 5790\nf 3473 22003 23797\nf 22003 4448 22006\nf 23797 22006 5297\nf 5497 21148 19436\nf 21148 3473 23797\nf 19436 23797 5297\nf 5792 23780 23779\nf 23780 2140 22656\nf 23779 22656 5298\nf 2143 19442 16036\nf 19442 5498 22002\nf 16036 22002 5501\nf 4939 19495 19445\nf 19495 4940 21152\nf 19445 21152 5500\nf 5500 21153 22655\nf 21153 3475 21151\nf 22655 21151 5296\nf 777 7452 11938\nf 7452 4939 16027\nf 11938 16027 2142\nf 340 23798 10078\nf 23798 5830 11923\nf 10078 11923 418\nf 5830 23798 22001\nf 23798 340 19437\nf 22001 19437 5799\nf 4448 23799 22005\nf 23799 3480 22007\nf 22005 22007 5299\nf 2144 23800 22676\nf 23800 5300 23801\nf 22676 23801 5508\nf 5300 23800 16032\nf 23800 2144 19450\nf 16032 19450 5800\nf 4448 23802 23799\nf 23802 5509 11931\nf 23799 11931 3480\nf 5509 23802 19452\nf 23802 4448 22004\nf 19452 22004 5800\nf 5302 21982 22010\nf 21982 4937 23785\nf 22010 23785 4449\nf 414 11927 6752\nf 11927 5303 19404\nf 6752 19404 412\nf 5494 22644 22665\nf 22644 2136 23803\nf 22665 23803 5503\nf 2146 16047 19453\nf 16047 5503 23803\nf 19453 23803 2136\nf 4451 19460 23804\nf 19460 4452 19468\nf 23804 19468 5831\nf 415 23805 7258\nf 23805 5915 11925\nf 7258 11925 414\nf 5915 23805 23807\nf 23805 415 23806\nf 23807 23806 5506\nf 4451 23808 19461\nf 23808 5801 23809\nf 19461 23809 5306\nf 5801 23808 19464\nf 23808 4451 22011\nf 19464 22011 4449\nf 774 22646 12120\nf 22646 5291 23810\nf 12120 23810 2148\nf 5802 7455 16042\nf 7455 2148 23810\nf 16042 23810 5291\nf 5305 22016 23811\nf 22016 4943 21155\nf 23811 21155 3477\nf 3477 23812 19465\nf 23812 4942 7456\nf 19465 7456 5802\nf 5305 23811 23781\nf 23811 3477 19466\nf 23781 19466 4941\nf 2146 19458 19473\nf 19458 5803 19471\nf 19473 19471 5505\nf 5803 19469 19472\nf 19469 4452 23813\nf 19472 23813 2149\nf 2148 7457 23815\nf 7457 4942 23814\nf 23815 23814 778\nf 416 22672 7254\nf 22672 5506 23806\nf 7254 23806 415\nf 5804 23816 23817\nf 23816 778 23814\nf 23817 23814 4942\nf 4453 23818 21154\nf 23818 4942 23812\nf 21154 23812 3477\nf 4942 23818 23817\nf 23818 4453 19490\nf 23817 19490 5804\nf 4454 22674 22670\nf 22674 2151 23819\nf 22670 23819 2147\nf 5504 22667 19479\nf 22667 2147 23819\nf 19479 23819 2151\nf 2150 23820 22019\nf 23820 4455 23821\nf 22019 23821 5308\nf 4943 22669 19482\nf 22669 5308 23821\nf 19482 23821 4455\nf 3479 22021 22023\nf 22021 2149 23822\nf 22023 23822 4944\nf 4452 19486 23813\nf 19486 4944 23822\nf 23813 23822 2149\nf 3480 21156 22008\nf 21156 5307 16054\nf 22008 16054 5507\nf 418 11922 10199\nf 11922 5301 23823\nf 10199 23823 1630\nf 5507 22673 19489\nf 22673 1630 23823\nf 19489 23823 5301\nf 5804 23824 23826\nf 23824 5805 23825\nf 23826 23825 779\nf 3476 22660 16033\nf 22660 4938 21150\nf 16033 21150 3475\nf 5805 23827 19496\nf 23827 5310 19494\nf 19496 19494 4940\nf 2151 11934 22018\nf 11934 5309 22025\nf 22018 22025 2150\nf 4455 23820 22026\nf 23820 2150 16039\nf 22026 16039 3476\n\nusemtl material_4\nf 5311 22027 19502\nf 22027 802 19504\nf 19502 19504 2166\nf 5806 19530 19533\nf 19530 3499 12251\nf 19533 12251 3498\nf 5510 19541 19543\nf 19541 4474 19534\nf 19543 19534 4473\nf 5806 12343 19531\nf 12343 4489 12350\nf 19531 12350 868\nf 3522 19623 7943\nf 19623 5807 19656\nf 7943 19656 890\nf 2265 12461 19660\nf 12461 5807 19654\nf 19660 19654 4514\nf 5317 22033 16235\nf 22033 4611 13201\nf 16235 13201 3640\nf 5316 13304 12387\nf 13304 4627 13311\nf 12387 13311 3519\nf 4634 20118 20119\nf 20118 4633 20115\nf 20119 20115 1025\nf 4650 8084 8082\nf 8084 5319 13535\nf 8082 13535 2469\nf 3694 20212 22035\nf 20212 5808 13645\nf 22035 13645 4949\nf 5808 13771 20182\nf 13771 3692 13765\nf 20182 13765 1078\nf 5809 20219 20270\nf 20219 4667 20221\nf 20270 20221 3713\nf 5321 13783 13894\nf 13783 4668 13790\nf 13894 13790 3714\nf 4670 13795 20237\nf 13795 5322 20226\nf 20237 20226 4669\nf 1087 20231 20230\nf 20231 3699 13794\nf 20230 13794 3698\nf 5809 20269 20217\nf 20269 3712 20265\nf 20217 20265 1093\nf 5511 23828 13904\nf 23828 4683 20278\nf 13904 20278 2552\nf 5512 13909 23830\nf 13909 2553 23829\nf 23830 23829 5977\nf 4684 13907 20292\nf 13907 5977 23829\nf 20292 23829 2553\nf 5325 13911 14785\nf 13911 4685 13915\nf 14785 13915 3892\nf 4693 13987 20315\nf 13987 1127 20613\nf 20315 20613 1125\nf 5514 20559 23832\nf 20559 2636 23831\nf 23832 23831 5820\nf 5810 20732 14689\nf 20732 4766 20740\nf 14689 20740 4767\nf 5811 8556 20790\nf 8556 3875 20737\nf 20790 20737 1246\nf 3876 14696 20792\nf 14696 5811 14806\nf 20792 14806 4784\n\nusemtl material_0\nf 5812 6008 16954\nf 6008 1262 9557\nf 16954 9557 42\nf 43 8652 16953\nf 8652 40 8651\nf 16953 8651 5812\nf 115 6120 23262\nf 6120 5813 8746\nf 23262 8746 118\nf 5814 6408 16695\nf 6408 2773 14979\nf 16695 14979 1404\nf 5815 7118 7124\nf 7118 606 11166\nf 7124 11166 607\nf 613 7128 11183\nf 7128 5816 11181\nf 11183 11181 1861\n\nusemtl material_1\nf 641 23833 19119\nf 23833 5966 23834\nf 19119 23834 4808\n\nusemtl material_2\nf 4841 18310 22192\nf 18310 1981 18325\nf 22192 18325 5368\n\nusemtl material_1\nf 5818 23835 23836\nf 23835 5234 7416\nf 23836 7416 4878\n\nusemtl material_4\nf 778 7630 23815\nf 7630 5819 12117\nf 23815 12117 2148\nf 1190 20558 16442\nf 20558 5820 23831\nf 16442 23831 2636\n\nusemtl material_0\nf 5813 6118 8747\nf 6118 1307 8787\nf 8747 8787 117\nf 51 23837 6039\nf 23837 5922 23838\nf 6039 23838 5916\nf 339 10603 23744\nf 10603 5822 6976\nf 23744 6976 424\nf 5822 10212 10213\nf 10212 1636 10664\nf 10213 10664 1766\nf 5815 7123 11179\nf 7123 1860 11178\nf 11179 11178 1859\nf 5816 7127 7120\nf 7127 612 15375\nf 7120 15375 611\nf 619 15368 11204\nf 15368 620 11233\nf 11204 11233 5823\n\nusemtl material_1\nf 5824 22748 11485\nf 22748 4819 20875\nf 11485 20875 4998\n\nusemtl material_2\nf 5057 22992 22991\nf 22992 677 22990\nf 22991 22990 5592\nf 5607 23034 18412\nf 23034 5825 23839\nf 18412 23839 5077\nf 5827 11624 23074\nf 11624 5092 22243\nf 23074 22243 4855\n\nusemtl material_1\nf 5828 23538 23841\nf 23538 5656 23840\nf 23841 23840 5886\nf 5829 23590 23842\nf 23590 5235 21840\nf 23842 21840 5236\nf 5875 22593 23843\nf 22593 5478 21898\nf 23843 21898 4921\nf 5240 23728 23844\nf 23728 5279 21952\nf 23844 21952 5280\nf 5831 22009 23804\nf 22009 5302 22012\nf 23804 22012 4451\nf 5804 23826 23816\nf 23826 779 12115\nf 23816 12115 778\n\nusemtl material_4\nf 4634 23845 20117\nf 23845 5819 7629\nf 20117 7629 2201\nf 5819 23845 12118\nf 23845 4634 23846\nf 12118 23846 5832\nf 5833 19585 16093\nf 19585 866 19581\nf 16093 19581 4487\nf 848 13338 13341\nf 13338 5832 23846\nf 13341 23846 4634\nf 5834 22295 13596\nf 22295 2019 13600\nf 13596 13600 4651\nf 1167 14376 14371\nf 14376 5835 23847\nf 14371 23847 2639\nf 5836 20797 20794\nf 20797 1248 16501\nf 20794 16501 3876\n\nusemtl material_0\nf 5837 17254 15217\nf 17254 4110 10521\nf 15217 10521 2955\n\nusemtl material_2\nf 5365 15587 22183\nf 15587 5838 23848\nf 22183 23848 5366\n\nusemtl material_3\nf 5838 23849 23848\nf 23849 5426 22344\nf 23848 22344 5366\nf 5175 15812 15809\nf 15812 5839 22429\nf 15809 22429 5176\n\nusemtl material_1\nf 5840 21078 23850\nf 21078 4910 22508\nf 23850 22508 5415\nf 5841 23583 21093\nf 23583 5237 22545\nf 21093 22545 5471\n\nusemtl material_4\nf 5833 16092 12339\nf 16092 3511 12341\nf 12339 12341 4488\nf 3612 16200 7940\nf 16200 5843 19929\nf 7940 19929 2366\nf 5844 14783 20784\nf 14783 3892 14790\nf 20784 14790 2720\n\nusemtl material_0\nf 63 16701 10136\nf 16701 5814 6409\nf 10136 6409 1406\nf 5845 17170 17166\nf 17170 4089 9949\nf 17166 9949 1558\nf 5845 15130 17168\nf 15130 1557 23851\nf 17168 23851 5821\nf 1557 15126 23851\nf 15126 1556 17165\nf 23851 17165 5821\nf 2911 10276 17255\nf 10276 5837 15216\nf 17255 15216 4113\nf 5823 10150 17811\nf 10150 1609 7200\nf 17811 7200 1886\n\nusemtl material_1\nf 4208 17931 21164\nf 17931 5528 22689\nf 21164 22689 4969\nf 5847 22695 21170\nf 22695 4211 21172\nf 21170 21172 4210\nf 5848 11476 17961\nf 11476 4214 21182\nf 17961 21182 3161\nf 5850 22787 18055\nf 22787 4987 22782\nf 18055 22782 1934\nf 5851 22880 18233\nf 22880 1967 22886\nf 18233 22886 5574\n\nusemtl material_2\nf 5817 22184 18313\nf 22184 3243 22983\nf 18313 22983 5369\nf 5368 18327 22995\nf 18327 5056 21415\nf 22995 21415 5055\nf 5527 18339 23852\nf 18339 4274 23000\nf 23852 23000 5594\nf 5852 21442 21449\nf 21442 4283 23037\nf 21449 23037 5087\nf 5854 21488 23079\nf 21488 5095 20951\nf 23079 20951 4290\nf 5138 21582 23853\nf 21582 5856 21000\nf 23853 21000 4874\nf 5139 23854 23216\nf 23854 5857 21583\nf 23216 21583 5138\nf 5408 18668 23856\nf 18668 5858 23855\nf 23856 23855 5649\nf 5651 18671 23217\nf 18671 5859 23857\nf 23217 23857 5144\nf 5860 23220 23859\nf 23220 5144 23858\nf 23859 23858 5653\nf 5654 23860 23233\nf 23860 5860 23859\nf 23233 23859 5653\n\nusemtl material_3\nf 5861 23861 18702\nf 23861 5979 23248\nf 18702 23248 5416\nf 5661 23862 22361\nf 23862 5818 23836\nf 22361 23836 4878\nf 5862 18846 18838\nf 18846 5687 23352\nf 18838 23352 5685\nf 5687 18848 23360\nf 18848 5863 23497\nf 23360 23497 5212\nf 4891 23379 23392\nf 23379 444 6837\nf 23392 6837 447\nf 5864 22426 19018\nf 22426 5435 23495\nf 19018 23495 5720\nf 5865 19077 19091\nf 19077 5728 23535\nf 19091 23535 95\n\nusemtl material_1\nf 5734 23863 23567\nf 23863 5866 23577\nf 23567 23577 5229\nf 5739 23588 23582\nf 23588 5867 21844\nf 23582 21844 5237\nf 5868 23864 21837\nf 23864 4407 23591\nf 21837 23591 4909\nf 5869 23599 22546\nf 23599 4408 21851\nf 22546 21851 3425\nf 5236 21841 19170\nf 21841 3423 21849\nf 19170 21849 5472\nf 4433 23865 23615\nf 23865 5871 23601\nf 23615 23601 754\nf 2107 19203 22559\nf 19203 5872 23866\nf 22559 23866 5474\nf 5873 23626 23633\nf 23626 757 12137\nf 23633 12137 758\nf 4416 19226 23638\nf 19226 4418 23646\nf 23638 23646 4417\nf 5874 21891 23657\nf 21891 4420 23659\nf 23657 23659 3435\nf 5758 19252 23677\nf 19252 5875 23843\nf 23677 23843 4921\nf 5876 23698 23700\nf 23698 5767 21119\nf 23700 21119 4923\n\nusemtl material_4\nf 4504 19625 19621\nf 19625 3523 7790\nf 19621 7790 3522\nf 5843 19928 7923\nf 19928 2360 16191\nf 7923 16191 3608\nf 1108 20771 20283\nf 20771 4683 23828\nf 20283 23828 5511\nf 5835 20577 23847\nf 20577 2640 20575\nf 23847 20575 2639\nf 4683 20770 13900\nf 20770 3888 20766\nf 13900 20766 1107\nf 5844 20785 16522\nf 20785 4780 20781\nf 16522 20781 2719\nf 3897 16528 14819\nf 16528 2723 14817\nf 14819 14817 2724\n\nusemtl material_1\nf 4809 20854 23867\nf 20854 5877 22703\nf 23867 22703 5533\nf 4213 11469 22043\nf 11469 5877 20853\nf 22043 20853 3156\n\nusemtl material_2\nf 4841 20923 7319\nf 20923 5878 20920\nf 7319 20920 3245\nf 5856 23868 21001\nf 23868 3306 22327\nf 21001 22327 3305\n\nusemtl material_3\nf 4877 21007 22340\nf 21007 5840 23850\nf 22340 23850 5415\nf 3315 22348 7360\nf 22348 5878 20922\nf 7360 20922 4842\nf 4842 23869 7361\nf 23869 5940 15753\nf 7361 15753 3318\n\nusemtl material_1\nf 4909 23592 21076\nf 23592 5740 15905\nf 21076 15905 3314\nf 5866 23863 21086\nf 23863 5734 19126\nf 21086 19126 388\nf 5846 17927 21163\nf 17927 31 6013\nf 21163 6013 30\nf 5848 17960 22710\nf 17960 4215 17973\nf 22710 17973 3163\nf 5879 21191 21198\nf 21191 4975 22067\nf 21198 22067 3165\nf 3201 15516 15514\nf 15516 5007 22120\nf 15514 22120 1952\n\nusemtl material_2\nf 5608 21455 23042\nf 21455 4284 21410\nf 23042 21410 3246\nf 5384 23870 15639\nf 23870 5881 18475\nf 15639 18475 5099\nf 4317 21550 23162\nf 21550 4866 23159\nf 23162 23159 4316\nf 5857 23213 21584\nf 23213 3306 23868\nf 21584 23868 5856\nf 5857 23854 21590\nf 23854 5139 11700\nf 21590 11700 5652\nf 3309 23226 21594\nf 23226 4327 21591\nf 21594 21591 5140\nf 5859 11701 23857\nf 11701 5653 23858\nf 23857 23858 5144\n\nusemtl material_3\nf 5882 23256 23244\nf 23256 4336 21617\nf 23244 21617 4334\nf 5883 23239 18711\nf 23239 436 10431\nf 18711 10431 337\nf 5884 22342 23308\nf 22342 5426 18781\nf 23308 18781 5671\nf 5885 21680 23363\nf 21680 2059 18834\nf 23363 18834 3347\nf 5216 21795 23521\nf 21795 5865 19092\nf 23521 19092 97\n\nusemtl material_1\nf 5886 23840 19102\nf 23840 5656 23242\nf 19102 23242 4334\nf 5867 23585 21845\nf 23585 4406 23597\nf 21845 23597 5869\nf 4421 21892 23684\nf 21892 5874 19261\nf 23684 19261 5760\nf 5842 21926 15958\nf 21926 5269 22603\nf 15958 22603 5481\nf 4924 21117 23701\nf 21117 5842 21921\nf 23701 21921 5876\nf 4411 21950 23611\nf 21950 5887 19353\nf 23611 19353 5240\nf 5887 21949 21959\nf 21949 5281 23735\nf 21959 23735 5282\nf 5889 23871 22059\nf 23871 4975 21192\nf 22059 21192 4974\nf 5889 22062 23871\nf 22062 1927 22065\nf 23871 22065 4975\nf 5351 22810 22807\nf 22810 3217 18102\nf 22807 18102 5890\nf 5880 21289 15518\nf 21289 5891 22121\nf 15518 22121 5007\nf 5359 22156 21333\nf 22156 1969 22890\nf 21333 22890 1968\nf 5032 22160 22159\nf 22160 1970 22157\nf 22159 22157 5359\nf 5360 22166 18265\nf 22166 5580 22164\nf 18265 22164 1975\n\nusemtl material_2\nf 3242 22181 22188\nf 22181 5892 22345\nf 22188 22345 3244\nf 4842 22190 23869\nf 22190 5367 23872\nf 23869 23872 5940\nf 5881 23870 21496\nf 23870 5384 15641\nf 21496 15641 3269\n\nusemtl material_3\nf 5414 15741 22337\nf 15741 5893 23873\nf 22337 23873 2041\nf 5884 21631 23874\nf 21631 4884 22346\nf 23874 22346 5892\nf 5892 22182 23874\nf 22182 5366 22343\nf 23874 22343 5884\nf 5864 21783 22427\nf 21783 2061 15803\nf 22427 15803 5171\nf 5676 22430 23370\nf 22430 5839 22432\nf 23370 22432 2062\n\nusemtl material_1\nf 5893 22510 23873\nf 22510 3409 22519\nf 23873 22519 2041\nf 5829 23842 22542\nf 23842 5236 19169\nf 22542 19169 4915\nf 4918 23875 23655\nf 23875 5872 22554\nf 23655 22554 5894\nf 5872 23875 23876\nf 23875 4918 22553\nf 23876 22553 5747\nf 5257 23877 19254\nf 23877 5895 23878\nf 19254 23878 5258\nf 5896 23679 22586\nf 23679 5258 23878\nf 22586 23878 5895\nf 5530 22696 18129\nf 22696 5847 22681\nf 18129 22681 5531\nf 5535 22706 22707\nf 22706 5849 23879\nf 22707 23879 5538\nf 5538 23880 22712\nf 23880 5897 22721\nf 22712 22721 4218\nf 5897 23880 17981\nf 23880 5538 23879\nf 17981 23879 5849\nf 26 23881 6022\nf 23881 5971 23882\nf 6022 23882 38\nf 4216 22713 21196\nf 22713 4218 22719\nf 21196 22719 4217\nf 5540 22718 17984\nf 22718 5888 22057\nf 17984 22057 4976\nf 26 22731 23881\nf 22731 4817 22729\nf 23881 22729 5971\nf 5020 22744 21307\nf 22744 5898 22778\nf 21307 22778 4222\nf 5824 22745 22749\nf 22745 649 22756\nf 22749 22756 4820\nf 654 22785 11967\nf 22785 4822 22775\nf 11967 22775 647\nf 5850 22774 18063\nf 22774 1943 22108\nf 18063 22108 3189\nf 4980 21217 15464\nf 21217 1936 22750\nf 15464 22750 3177\nf 5899 22967 22820\nf 22967 5586 22960\nf 22820 22960 363\nf 5899 22825 20897\nf 22825 4827 21266\nf 20897 21266 5004\nf 4810 23883 22835\nf 23883 5966 18139\nf 22835 18139 5559\nf 4829 20900 18154\nf 20900 660 7481\nf 18154 7481 661\nf 5561 22846 22843\nf 22846 1955 22852\nf 22843 22852 5008\nf 5880 21278 18168\nf 21278 3202 22854\nf 18168 22854 3205\nf 4835 22882 18237\nf 22882 5900 22892\nf 18237 22892 5577\nf 60 22893 6046\nf 22893 5900 22877\nf 6046 22877 57\nf 3225 22900 21338\nf 22900 5901 22917\nf 21338 22917 3226\nf 5575 22903 22904\nf 22903 5902 22913\nf 22904 22913 5576\nf 1971 22912 22161\nf 22912 5902 22901\nf 22161 22901 1970\nf 4837 18246 22916\nf 18246 5901 22899\nf 22916 22899 5577\nf 671 22925 19506\nf 22925 5903 22929\nf 19506 22929 672\nf 5041 23884 21366\nf 23884 5903 22924\nf 21366 22924 5039\nf 5903 23884 22930\nf 23884 5041 22933\nf 22930 22933 5584\nf 5904 22952 22178\nf 22952 5363 15578\nf 22178 15578 5050\nf 5904 22958 22943\nf 22958 5362 18285\nf 22943 18285 3237\n\nusemtl material_2\nf 5905 23885 22976\nf 23885 5589 23886\nf 22976 23886 122\nf 5589 23885 18303\nf 23885 5905 18304\nf 18303 18304 5588\nf 5590 23887 22980\nf 23887 4270 22984\nf 22980 22984 5591\nf 5059 22999 11570\nf 22999 4274 18338\nf 11570 18338 4207\nf 28 17922 23001\nf 17922 5527 23852\nf 23001 23852 5594\nf 156 23030 8772\nf 23030 5825 23033\nf 8772 23033 153\nf 5077 23839 21448\nf 23839 5825 23025\nf 21448 23025 5852\nf 5394 23038 23039\nf 23038 5834 13595\nf 23039 13595 685\nf 5826 21454 11598\nf 21454 5079 18419\nf 11598 18419 24\nf 5906 23084 23081\nf 23084 1301 23080\nf 23081 23080 5616\nf 5906 18471 18486\nf 18471 5617 20953\nf 18486 20953 5620\nf 5827 23076 23086\nf 23076 2003 22246\nf 23086 22246 2005\nf 5854 18481 23087\nf 18481 5618 23089\nf 23087 23089 3266\nf 5853 18478 23090\nf 18478 5618 21484\nf 23090 21484 5093\nf 5907 23113 23112\nf 23113 4861 23114\nf 23112 23114 1300\nf 5907 23111 23106\nf 23111 147 20961\nf 23106 20961 4859\nf 4312 23149 21537\nf 23149 5908 23155\nf 21537 23155 4314\nf 134 23174 23147\nf 23174 4868 23153\nf 23147 23153 5635\nf 4872 23185 23191\nf 23185 5855 18641\nf 23191 18641 5646\nf 703 23207 13577\nf 23207 5909 18658\nf 13577 18658 2034\nf 4874 7353 23853\nf 7353 4873 23208\nf 23853 23208 5138\nf 5858 18667 22324\nf 18667 2036 22331\nf 22324 22331 2035\nf 5649 23855 23215\nf 23855 5858 22325\nf 23215 22325 5406\nf 5144 18674 23218\nf 18674 1256 23210\nf 23218 23210 5650\nf 5649 23219 23856\nf 23219 5142 21598\nf 23856 21598 5408\nf 5860 23860 23235\nf 23860 5654 18694\nf 23235 18694 137\n\nusemtl material_3\nf 434 23240 23537\nf 23240 5883 23888\nf 23537 23888 5656\nf 5882 23243 21619\nf 23243 5656 23888\nf 21619 23888 5883\nf 5910 23245 23247\nf 23245 4269 23889\nf 23247 23889 5861\nf 5910 18719 23246\nf 18719 5657 23890\nf 23246 23890 5589\nf 5663 23281 23272\nf 23281 5421 22373\nf 23272 22373 2044\nf 721 23358 13639\nf 23358 5862 23354\nf 13639 23354 720\nf 5457 23361 18849\nf 23361 3347 22425\nf 18849 22425 2061\nf 5911 18925 23426\nf 18925 3369 22469\nf 23426 22469 5198\nf 5911 11796 23427\nf 11796 3366 21730\nf 23427 21730 4371\nf 5863 23357 23491\nf 23357 721 13635\nf 23491 13635 742\n\nusemtl material_1\nf 434 23539 6797\nf 23539 5828 11837\nf 6797 11837 430\nf 5886 21816 23841\nf 21816 5730 11838\nf 23841 11838 5828\nf 5866 21085 23576\nf 21085 392 6715\nf 23576 6715 390\nf 5867 23587 23586\nf 23587 5231 21814\nf 23586 21814 5232\nf 4407 23864 21842\nf 23864 5868 19176\nf 21842 19176 3423\nf 752 23891 7605\nf 23891 5912 23593\nf 7605 23593 2100\nf 5868 21838 23892\nf 21838 5234 23594\nf 23892 23594 5912\nf 427 23595 6786\nf 23595 5841 23620\nf 6786 23620 429\nf 2102 23596 22540\nf 23596 5913 11855\nf 22540 11855 2101\nf 4406 21836 23598\nf 21836 5741 23600\nf 23598 23600 4408\nf 753 23893 12100\nf 23893 5912 23891\nf 12100 23891 752\nf 5912 23893 23604\nf 23893 753 23602\nf 23604 23602 5871\nf 5868 23892 19177\nf 23892 5912 23603\nf 19177 23603 5870\nf 5474 23866 22562\nf 23866 5872 23876\nf 22562 23876 5747\nf 5873 23894 19210\nf 23894 5752 23635\nf 19210 23635 5750\nf 5752 23894 19224\nf 23894 5873 23632\nf 19224 23632 5755\nf 4418 19225 22569\nf 19225 5246 23648\nf 22569 23648 3434\nf 5255 22575 22578\nf 22575 5894 22555\nf 22578 22555 2106\nf 5895 23877 23660\nf 23877 5257 23661\nf 23660 23661 2113\nf 4919 23664 23662\nf 23664 5914 19250\nf 23662 19250 5758\nf 404 23667 10183\nf 23667 5914 23663\nf 10183 23663 1622\nf 5254 23668 23654\nf 23668 2115 12926\nf 23654 12926 761\nf 5254 23671 23669\nf 23671 5261 23676\nf 23669 23676 5759\nf 5479 22598 22590\nf 22598 5896 22585\nf 22590 22585 2114\nf 5762 19284 21115\nf 19284 5767 23699\nf 21115 23699 5766\nf 4410 11862 23607\nf 11862 5240 23844\nf 23607 23844 5280\nf 5508 23801 22662\nf 23801 5300 22658\nf 22662 22658 2143\nf 5831 19467 11930\nf 19467 5803 19457\nf 11930 19457 4450\nf 5915 23895 11926\nf 23895 5801 19463\nf 11926 19463 5303\nf 5306 23896 19476\nf 23896 5915 23807\nf 19476 23807 5506\nf 5915 23896 23895\nf 23896 5306 23809\nf 23895 23809 5801\nf 5805 23824 23827\nf 23824 5804 19492\nf 23827 19492 5310\n\nusemtl material_4\nf 5514 23832 16441\nf 23832 5820 8441\nf 16441 8441 2634\n\nusemtl material_0\nf 5916 23897 6042\nf 23897 49 16571\nf 6042 16571 1268\nf 5917 17228 23898\nf 17228 1603 10135\nf 23898 10135 1406\n\nusemtl material_1\nf 642 15593 21186\nf 15593 4809 23867\nf 21186 23867 5533\n\nusemtl material_2\nf 5918 7343 11687\nf 7343 133 23158\nf 11687 23158 5638\n\nusemtl material_4\nf 4946 16068 7572\nf 16068 2187 12071\nf 7572 12071 724\n\nusemtl material_0\nf 98 8719 23512\nf 8719 5943 23899\nf 23512 23899 99\nf 5920 23900 8858\nf 23900 5943 8852\nf 8858 8852 1333\nf 5921 14934 16612\nf 14934 1360 14932\nf 16612 14932 2752\nf 207 6037 22089\nf 6037 5922 23837\nf 22089 23837 51\nf 3973 23901 16700\nf 23901 5917 23898\nf 16700 23898 1406\nf 5917 23901 17232\nf 23901 3973 23902\nf 17232 23902 5923\nf 3056 17749 7044\nf 17749 5923 23903\nf 7044 23903 64\nf 5923 23902 23903\nf 23902 3973 16702\nf 23903 16702 64\nf 5924 10179 23904\nf 10179 403 6740\nf 23904 6740 405\n\nusemtl material_4\nf 5925 12738 19850\nf 12738 2320 16164\nf 19850 16164 2319\n\nusemtl material_0\nf 5924 23904 15365\nf 23904 405 7224\nf 15365 7224 1623\n\nusemtl material_1\nf 5551 15489 22797\nf 15489 5926 18092\nf 22797 18092 4994\n\nusemtl material_3\nf 5927 15896 15892\nf 15896 2087 19072\nf 15892 19072 5464\n\nusemtl material_0\nf 5921 16611 8950\nf 16611 182 16609\nf 8950 16609 2753\nf 5928 22037 17217\nf 22037 2892 17222\nf 17217 17222 323\nf 5928 17117 17219\nf 17117 321 17209\nf 17219 17209 2891\nf 5929 17230 10070\nf 17230 3081 15364\nf 10070 15364 1586\nf 5929 10137 17231\nf 10137 326 17746\nf 17231 17746 327\n\nusemtl material_1\nf 5930 22828 18078\nf 22828 5353 22791\nf 18078 22791 5349\nf 5926 22769 18093\nf 22769 653 22083\nf 18093 22083 5338\nf 5930 22788 18115\nf 22788 1944 22829\nf 18115 22829 5003\n\nusemtl material_2\nf 5931 18382 18376\nf 18382 4278 21429\nf 18376 21429 4846\nf 5932 22272 18554\nf 22272 1253 18534\nf 18554 18534 5390\n\nusemtl material_3\nf 724 18874 22444\nf 18874 5933 23905\nf 22444 23905 5438\n\nusemtl material_4\nf 5925 19851 12739\nf 19851 970 19855\nf 12739 19855 4550\n\nusemtl material_3\nf 5934 21074 21626\nf 21074 3314 21008\nf 21626 21008 5965\n\nusemtl material_2\nf 5932 23126 22273\nf 23126 5630 23130\nf 22273 23130 142\n\nusemtl material_3\nf 5927 15894 11829\nf 15894 5462 19052\nf 11829 19052 3397\n\nusemtl material_1\nf 3172 22801 22086\nf 22801 5935 20867\nf 22086 20867 1929\nf 5935 22800 22738\nf 22800 3191 22082\nf 22738 22082 3173\nf 5936 23906 22895\nf 23906 669 8047\nf 22895 8047 668\nf 5936 22908 23906\nf 22908 5035 22905\nf 23906 22905 669\n\nusemtl material_2\nf 681 23021 8094\nf 23021 5931 18375\nf 8094 18375 680\nf 5937 23096 23094\nf 23096 5621 18489\nf 23094 18489 5619\nf 5937 23093 23092\nf 23093 5853 11622\nf 23092 11622 2004\nf 5918 11689 23171\nf 11689 5128 23175\nf 23171 23175 4868\n\nusemtl material_3\nf 5919 23377 18873\nf 23377 5693 23385\nf 18873 23385 5933\nf 5933 23384 23905\nf 23384 3357 22443\nf 23905 22443 5438\nf 5938 23423 18915\nf 23423 5193 18918\nf 18915 18918 5443\nf 5197 22464 21736\nf 22464 5938 23416\nf 21736 23416 2072\n\nusemtl material_1\nf 5231 23547 23546\nf 23547 5939 23544\nf 23546 23544 5730\nf 432 23545 6794\nf 23545 5939 23541\nf 6794 23541 433\nf 4433 23612 23865\nf 23612 5742 19179\nf 23865 19179 5871\nf 5248 11864 21872\nf 11864 5748 23623\nf 21872 23623 5243\nf 765 23691 23908\nf 23691 5763 23907\nf 23908 23907 5945\nf 5805 7453 23825\nf 7453 777 7623\nf 23825 7623 779\n\nusemtl material_0\nf 5922 23909 23838\nf 23909 49 23897\nf 23838 23897 5916\nf 49 23909 9127\nf 23909 5922 9125\nf 9127 9125 1397\n\nusemtl material_3\nf 5940 23910 15751\nf 23910 3244 22347\nf 15751 22347 4884\n\nusemtl material_1\nf 4909 21075 7418\nf 21075 5934 21011\nf 7418 21011 4878\n\nusemtl material_2\nf 5940 23872 23910\nf 23872 5367 22187\nf 23910 22187 3244\n\nusemtl material_0\nf 5941 9406 23911\nf 9406 1453 9409\nf 23911 9409 1454\nf 393 11172 6717\nf 11172 5942 6727\nf 6717 6727 1620\nf 5941 23911 6451\nf 23911 1454 23912\nf 6451 23912 5954\nf 5944 17628 23913\nf 17628 4149 17673\nf 23913 17673 4158\nf 5942 11171 7100\nf 11171 1856 11170\nf 7100 11170 1855\n\nusemtl material_2\nf 5145 18672 18680\nf 18672 704 14822\nf 18680 14822 705\n\nusemtl material_1\nf 5267 11886 19272\nf 11886 5945 23907\nf 19272 23907 5763\n\nusemtl material_4\nf 2483 13588 13583\nf 13588 5946 23914\nf 13583 23914 2039\nf 5946 13594 23914\nf 13594 700 18698\nf 23914 18698 2039\n\nusemtl material_1\nf 5546 22804 22802\nf 22804 5947 22812\nf 22802 22812 5351\n\nusemtl material_0\nf 5948 17213 10041\nf 17213 2891 17211\nf 10041 17211 2890\nf 349 17670 10946\nf 17670 5944 23913\nf 10946 23913 4158\n\nusemtl material_2\nf 5652 18673 23222\nf 18673 5145 22335\nf 23222 22335 5410\n\nusemtl material_0\nf 1579 17215 10043\nf 17215 232 16778\nf 10043 16778 5326\n\nusemtl material_2\nf 4285 21457 23043\nf 21457 5949 18426\nf 23043 18426 5379\nf 5949 22228 22226\nf 22228 1998 22232\nf 22226 22232 5380\nf 5950 18458 23915\nf 18458 4289 21479\nf 23915 21479 3265\n\nusemtl material_1\nf 5951 18079 21233\nf 18079 45 8657\nf 21233 8657 47\nf 4993 23916 21252\nf 23916 5951 22764\nf 21252 22764 5552\nf 5947 15492 22813\nf 15492 4235 22148\nf 22813 22148 5358\n\nusemtl material_2\nf 5590 22979 23887\nf 22979 4268 21399\nf 23887 21399 4270\nf 5950 23915 23082\nf 23915 3265 21486\nf 23082 21486 4292\n\nusemtl material_3\nf 5952 21674 23342\nf 21674 4359 23343\nf 23342 23343 5431\nf 5952 23341 21669\nf 23341 4358 21671\nf 21669 21671 5684\n\nusemtl material_0\nf 5943 23900 23899\nf 23900 5920 8721\nf 23899 8721 99\n\nusemtl material_1\nf 765 23908 12650\nf 23908 5945 19291\nf 12650 19291 766\n\nusemtl material_0\nf 5953 8836 6137\nf 8836 128 8801\nf 6137 8801 127\nf 13 8615 9418\nf 8615 5954 9415\nf 9418 9415 1455\nf 5955 7102 11169\nf 7102 608 7098\nf 11169 7098 1855\nf 1857 7108 11174\nf 7108 5955 11168\nf 11174 11168 1856\nf 5953 6266 8837\nf 6266 1328 8839\nf 8837 8839 126\n\nusemtl material_4\nf 1246 14800 20789\nf 14800 5956 14802\nf 20789 14802 4783\nf 3893 20791 20788\nf 20791 5956 20786\nf 20788 20786 4782\n\nusemtl material_0\nf 5957 9599 16981\nf 9599 43 23917\nf 16981 23917 2828\nf 5957 16980 16963\nf 16980 4034 23918\nf 16963 23918 5969\n\nusemtl material_1\nf 45 18081 6035\nf 18081 5958 22793\nf 6035 22793 41\n\nusemtl material_2\nf 5959 23069 18461\nf 23069 149 23062\nf 18461 23062 5607\nf 5960 20952 23077\nf 20952 5095 11626\nf 23077 11626 2003\nf 5961 20962 23100\nf 20962 1299 6431\nf 23100 6431 146\n\nusemtl material_3\nf 5962 19013 23482\nf 19013 4902 23476\nf 23482 23476 5716\n\nusemtl material_1\nf 5253 19191 21881\nf 19191 5963 23919\nf 21881 23919 3427\nf 5964 23920 19200\nf 23920 3427 23919\nf 19200 23919 5963\nf 3427 23920 23922\nf 23920 5964 23921\nf 23922 23921 4414\n\nusemtl material_2\nf 5961 18499 20960\nf 18499 3268 11638\nf 20960 11638 4859\n\nusemtl material_3\nf 5965 21005 15756\nf 21005 4877 22354\nf 15756 22354 3321\nf 3317 21627 22364\nf 21627 5965 15758\nf 22364 15758 3322\n\nusemtl material_1\nf 5964 21860 23921\nf 21860 5750 21863\nf 23921 21863 4414\nf 4993 22772 23916\nf 22772 5958 18080\nf 23916 18080 5951\n\nusemtl material_2\nf 2001 23067 7338\nf 23067 5960 23078\nf 7338 23078 4855\nf 5959 23065 18468\nf 23065 5615 23073\nf 18468 23073 5616\n\nusemtl material_3\nf 5962 23481 23443\nf 23481 5709 23440\nf 23443 23440 5449\n\nusemtl material_1\nf 5966 23883 23834\nf 23883 4810 20850\nf 23834 20850 4808\n\nusemtl material_0\nf 5954 23912 9413\nf 23912 1454 9410\nf 9413 9410 283\n\nusemtl material_1\nf 660 20901 7485\nf 20901 5966 23833\nf 7485 23833 641\n\nusemtl material_3\nf 122 23886 23923\nf 23886 5589 23890\nf 23923 23890 5657\nf 122 23923 6126\nf 23923 5657 23264\nf 6126 23264 119\n\nusemtl material_0\nf 2828 23924 9561\nf 23924 42 6478\nf 9561 6478 1482\n\nusemtl material_3\nf 5967 23452 23925\nf 23452 4376 21768\nf 23925 21768 5207\n\nusemtl material_4\nf 5968 7585 7588\nf 7585 2193 12092\nf 7588 12092 2190\nf 3485 16062 16065\nf 16062 5968 12076\nf 16065 12076 841\n\nusemtl material_0\nf 289 16964 9593\nf 16964 5969 9573\nf 9593 9573 287\n\nusemtl material_1\nf 4986 11496 18200\nf 11496 4988 22739\nf 18200 22739 5568\n\nusemtl material_3\nf 3386 21769 21771\nf 21769 5967 23925\nf 21771 23925 5207\n\nusemtl material_0\nf 2828 23917 23924\nf 23917 43 16955\nf 23924 16955 42\nf 5969 23918 16961\nf 23918 4034 16959\nf 16961 16959 1485\n\nusemtl material_3\nf 5970 23460 23459\nf 23460 5711 23449\nf 23459 23449 736\nf 5970 23458 23466\nf 23458 737 13658\nf 23466 13658 738\n\nusemtl material_1\nf 5971 23926 23882\nf 23926 5897 17980\nf 23882 17980 38\nf 5971 22730 23926\nf 22730 5541 22722\nf 23926 22722 5897\n\nusemtl material_0\nf 5972 17845 7232\nf 17845 1902 15383\nf 7232 15383 3102\nf 5972 17825 17865\nf 17825 1891 11330\nf 17865 11330 3111\nf 5973 23927 6167\nf 23927 145 8758\nf 6167 8758 1585\n\nusemtl material_4\nf 2142 7466 11941\nf 7466 5974 12411\nf 11941 12411 2153\nf 4754 8554 16487\nf 8554 5975 13474\nf 16487 13474 3862\n\nusemtl material_0\nf 5973 9257 23927\nf 9257 1426 6424\nf 23927 6424 145\n\nusemtl material_4\nf 5974 7465 19620\nf 7465 773 12318\nf 19620 12318 786\nf 5975 13473 13475\nf 13473 2391 14715\nf 13475 14715 1037\n\nusemtl material_0\nf 89 6080 23928\nf 6080 1282 6083\nf 23928 6083 1283\nf 89 23928 23468\nf 23928 1283 8713\nf 23468 8713 91\nf 5976 17080 6577\nf 17080 2885 15143\nf 6577 15143 1570\n\nusemtl material_4\nf 5977 20287 23929\nf 20287 1109 22036\nf 23929 22036 5323\n\nusemtl material_0\nf 5976 17078 17081\nf 17078 4063 9802\nf 17081 9802 2856\n\nusemtl material_4\nf 5977 23929 23830\nf 23929 5323 20289\nf 23830 20289 5512\n\nusemtl material_0\nf 439 6805 6917\nf 6805 5978 10489\nf 6917 10489 438\nf 1638 10488 6939\nf 10488 5978 6802\nf 6939 6802 1729\n\nusemtl material_3\nf 5979 23861 23251\nf 23861 5861 23889\nf 23251 23889 4269\nf 5979 23250 23249\nf 23250 5590 18705\nf 23249 18705 3316\n\nusemtl material_0\nf 34 8634 6020\nf 8634 35 8641\nf 6020 8641 1263\n\nusemtl material_1\nf 5980 19198 21107\nf 19198 4412 23658\nf 21107 23658 3435\nf 5980 22574 21858\nf 22574 3427 23922\nf 21858 23922 4414\nf 5731 23552 23551\nf 23552 384 10168\nf 23551 10168 383\n\nusemtl material_0\nf 5981 6197 6011\nf 6197 27 22685\nf 6011 22685 28\nf 1305 6198 8778\nf 6198 5981 6010\nf 8778 6010 29\n\nusemtl material_1\nf 706 7415 23931\nf 7415 5982 23930\nf 23931 23930 5818\n\nusemtl material_4\nf 5983 23932 8156\nf 23932 708 15743\nf 8156 15743 676\nf 5983 13624 23932\nf 13624 2491 13614\nf 23932 13614 708\n\nusemtl material_3\nf 676 15745 18316\nf 15745 5984 23933\nf 18316 23933 5838\nf 5985 15754 23934\nf 15754 706 23931\nf 23934 23931 5818\nf 5661 18731 23862\nf 18731 5985 23934\nf 23862 23934 5818\n\nusemtl material_1\nf 5982 22538 23930\nf 22538 5234 23835\nf 23930 23835 5818\n\nusemtl material_3\nf 5984 23275 23933\nf 23275 5426 23849\nf 23933 23849 5838\n# 47864 faces, 0 coords texture\n\n# End of File\n"
  },
  {
    "path": "components/quad_from_patches/test_tri.obj.mtl",
    "content": "#\n# Wavefront material file\n# Converted by Meshlab Group\n#\n\nnewmtl material_0\nKa 0.200000 0.200000 0.200000\nKd 0.898039 0.627451 0.627451\nKs 1.000000 1.000000 1.000000\nTr 1.000000\nillum 2\nNs 0.000000\n\nnewmtl material_1\nKa 0.200000 0.200000 0.200000\nKd 0.627451 0.627451 0.898039\nKs 1.000000 1.000000 1.000000\nTr 1.000000\nillum 2\nNs 0.000000\n\nnewmtl material_2\nKa 0.200000 0.200000 0.200000\nKd 0.627451 0.898039 0.627451\nKs 1.000000 1.000000 1.000000\nTr 1.000000\nillum 2\nNs 0.000000\n\nnewmtl material_3\nKa 0.200000 0.200000 0.200000\nKd 0.898039 0.898039 0.627451\nKs 1.000000 1.000000 1.000000\nTr 1.000000\nillum 2\nNs 0.000000\n\nnewmtl material_4\nKa 0.200000 0.200000 0.200000\nKd 0.627451 0.898039 0.898039\nKs 1.000000 1.000000 1.000000\nTr 1.000000\nillum 2\nNs 0.000000\n\n"
  },
  {
    "path": "components/results_processing/lazy_website/index.php",
    "content": "<html><head><style>\n\n@keyframes fadeinout {\n\t0% { opacity:1;\t}\n\t45% { opacity:1; }\n\t55% { opacity:0; }\n\t100% { opacity:0; }\n}\n\n#bigimgcontainer img.top {\nanimation-name: fadeinout;\nanimation-timing-function: linear;\nanimation-iteration-count: infinite;\nanimation-duration: 3s;\nanimation-direction: alternate;\n}\n\n#bigimgcontainer {\n  position:relative;\n  height:80%;\n  width:80%;\n  margin:0 auto;\n  overflow: hidden;\n}\n\n#bigimgcontainer img {\n  position:absolute;\n  left:0;\n}\n\n#bigimgcontainer img.top:hover {\n opacity:0;\n -webkit-transition: opacity 1s ease-in-out;\n -moz-transition: opacity 1s ease-in-out;\n -o-transition: opacity 1s ease-in-out;\n transition: opacity 1s ease-in-out;\n}\n\n.grid-container {\n\tdisplay: grid;\n\t/* grid-gap: 10px;\n\tpadding: 10px; */\n\tgrid-template-columns: 1fr;\n\tgrid-template-rows:  1fr 250px;\n\toverflow: hidden;\n}\n\n.t{\n\twidth: 180px;\n\theight: 180px;\n\tborder: 0;\n\tobject-fit: cover;\n\tbackground-position: -150px -150px; \n\tbackground-size: 600px 600px;\n\tbackground-color: #E4E4E4;\n\tborder-radius:20px;\n\tmargin: 5px;\n\ttransition: background-image 0.35s ease-in-out,background-color 0.35s ease-in-out;\n\tfloat: left;\n}\n.bigimg{\n\tdisplay:block;\n\twidth: auto;\n\theight: 100%;\n\tborder: 0;\n\tmargin: 5px;\n}\n\n.thumb{\n\tdisplay:block;\n\twidth: auto;\n}\n.panel{\n\twidth: 780px;\n\theight: 100%;\n\toverflow: scroll;\n\tmargin:0;\n\tposition:relative;\n\tpadding:0;\n\tbackground-color:#CCC;\n\tborder-radius:0;\n\tfloat: left;\n}\n.t.sel,#show{\n\tbackground-color: #FFF;\n}\nimg{\n\tborder:0; padding:0;bottom:0;\n}\nimg.histo{\n\twidth:25%;\n\theight:25%;\n\tposition:absolute;\n}\n\nimg.get{\n\tposition:absolute;\n\twidth:80px;\n\t/* //height:49px; */\n\ttop:20px;\n\tcursor:pointer;\n\tz-index: 3;\n}\n\nimg.get.input{ right:120px; }\nimg.get.output{ right:20px; }\n\n#voroArea{ left:0;}\n#flatness{ left:25%;}\n#torsion{ left:50%;}\n#edgeLen{ left:75%;}\n\nbody{\n\tbackground-color:#CCC;\n\ttext-align:center;\n\tpadding:0;\n\tmargin:0;\n\toverflow: hidden;\n}\n\n\n#show{\n\twidth:  calc(100% - 780px);\n\theight: 99%;\n\tposition:relative;\n\tfloat: left;\n\tvisibility:hidden;\n}\n\n#histocontainer{\n\twidth: 100%;\n\theight: 100%;\n}\n\n.modal {\n  display: none; /* Hidden by default */\n  position: fixed; /* Stay in place */\n  z-index: 1; /* Sit on top */\n  padding-top: 100px; /* Location of the box */  \n  left: 0;\n  top: 0;\n  width: 100%; /* Full width */\n  height: 100%; /* Full height */\n  overflow: auto; /* Enable scroll if needed */\n  background-color: rgb(0,0,0); /* Fallback color */\n  background-color: rgba(0,0,0,0.4); /* Black w/ opacity */\n}\n\n/* Modal Content */\n.plotContent {\n  background-color: #fefefe;\n  margin: auto;\n  padding: 5px;\n  border: 1px solid #888;\n  width: 70%;\n}\n\nimg.modalHisto{\n\twidth:100%;\n\theight:auto;\n}\n\n/* The Close Button */\n.close {\n  color: #aaaaaa;\n  float: right;\n  font-size: 28px;\n  font-weight: bold;\n}\n\n.close:hover,\n.close:focus {\n  color: #000;\n  text-decoration: none;\n  cursor: pointer;\n}\n\n<?php\n$dir = dirname(__FILE__);\n$files = array_filter(glob('*'), 'is_dir');\n\n$n = 0;\nforeach ($files as $file) {\n\t$ext =  pathinfo($file, PATHINFO_EXTENSION) ;\n\tif ($ext!=\"\" || $file[0]==\".\")\n\t{\n\t\tunset($files, $fiels[n]);\n\t\tcontinue;\n\t}\t\n\t//$name =  str_replace(   \".jpg\" , \"\", $file);\n\t//$search =  str_replace(   \"-\" , \"+\", $name,);\n\t//$search =  str_replace(   \" \" , \"+\", $search);\n\t//if (($ext==\"jpg\")||($ext==\"png\")||($ext==\"jpeg\"))\n\t//else if (($ext==\"php\")||($ext==\"\")) {} \n\t//else \n\t// print \".a$n       { background-image:url('$file/$file.obj.jpg');}\".PHP_EOL;\n\t// print \".a$n:hover,.a$n.b{ background-image:url('\".$file.\"/\".$file.\"_rem_p0_0_quadrangulation_smooth.obj.jpg');}\".PHP_EOL;\n\t$n++;\n}\n$files = array_values($files);\n?>\n</style>\n</head>\n<body>\n\n<div id=\"plotBox\" class=\"modal\">\n  <div class=\"plotContent\">\n    <span class=\"close\" onclick=\"closeModal()\">&times;</span>\n\t<img id=\"modalPlot\" loading=\"lazy\" class=\"modalHisto\" src=\"\">\n  </div>\n\n</div>\n<div class=\"panel\">\n<?php\nforeach ($files as $key => $value)\n{\n\tprint \"\t<img class='t a$key' onclick='show($key)'  loading='lazy' src='./thumbnails/{$value}_rem_p0_0_quadrangulation_smooth.obj.jpg'>\".PHP_EOL;\n}\t\n?>\n</div>\n<div id=\"show\">\n\t\t\t<a id=\"input\" >\n\t\t<img class=\"get input\" title=\"Download input for this dataset\" src=\"./download_input.png\">\n\t\t</a>\n\t\t<a id=\"output\" >\n\t\t<img class=\"get output\" title=\"Download output for this dataset\" src=\"./download_output.png\">\n\t\t</a>\n<div class=\"gridcontainer\">\n<!-- <div  id=\"bigimgcontainer\" class=\"imgarea\"> -->\n\t<div  id=\"bigimgcontainer\">\n\t\t<img id=\"showimgbottom\" class=\"bigimg bottom\">\n\t\t<img id=\"showimgtop\" class=\"bigimg top\"/>\n\t</div>\n<!-- <div class=\"histoarea\"> -->\n\t<div id=\"histocontainer\">\n\t\t<img id=\"edgeLen\" loading=\"lazy\" class=\"histo\" title=\"Edge Length distribution\" onclick=\"openModal(this)\" src=\"bimba/edgeLenHistogram.png\">\n\t\t<img id=\"flatness\" loading=\"lazy\" class=\"histo\" title=\"Flatness distribution\" onclick=\"openModal(this)\"  src=\"bimba/flatnessHistogram.png\">\n\t\t<img id=\"angleDev\" loading=\"lazy\" class=\"histo\" title=\"Angle Deviation distribution\" onclick=\"openModal(this)\" src=\"bimba/angleDevHistogram.png\">\n\t\t<img id=\"voroArea\" loading=\"lazy\" class=\"histo\" title=\"Voronoi Area distribution\" onclick=\"openModal(this)\"  src=\"bimba/voroAreaHistogram.png\">\n\t</div>\n</div>\n</body>\n<script>\nd = document.getElementById(\"show\");\nvar sel = null;\nvar b = true;\nvar files = [\n\t<?php\n\t$dir = dirname(__FILE__);\n\t$files = scandir($dir);\n\t$n = 0;\n\tforeach ($files as $file) {\n\t\t$ext =  pathinfo($file, PATHINFO_EXTENSION) ;\n\t\tif ($ext!=\"\") continue;\n\t\tif ($file[0]==\".\") continue;\n\t\t//$name =  str_replace(   \".jpg\" , \"\", $file);\n\t\t//$search =  str_replace(   \"-\" , \"+\", $name,);\n\t\t//$search =  str_replace(   \" \" , \"+\", $search);\n\t\t//if (($ext==\"jpg\")||($ext==\"png\")||($ext==\"jpeg\"))\n\t\t//else if (($ext==\"php\")||($ext==\"\")) {} \n\t\t//else \n\t\techo \"'$file', \";\n\t}\n\t?>];\n\n\tshow = function(a){\n\t\tif (sel!=null) sel.classList.remove(\"sel\");\n\t\tsel = document.getElementsByClassName(\"a\"+a)[0];\n\t\tsel.classList.add(\"sel\");\n\t\td.className = \"\";\n\t\td.classList.add(\"a\"+a);\n\t\thisto = [\"edgeLen\",\"flatness\",\"angleDev\",\"voroArea\"];\n\t\tfor (var i=0; i<4; i++) {\n\t\t\tel = document.getElementById(histo[i]);\n\t\t\tel.src = files[a]+\"/\"+histo[i]+\"Histogram.png\";\n\t\t}\n\t\tdocument.getElementById(\"show\").style.visibility = \"visible\";\n\t\tdocument.getElementById(\"showimgbottom\").src = files[a]+\"/\"+files[a]+\"_rem_p0_0_quadrangulation_smooth.obj.jpg\";\n\t\tdocument.getElementById(\"showimgtop\").src = files[a]+\"/\"+files[a]+\".obj.jpg\";\n\t\tdocument.getElementById(\"output\").href = files[a]+\"/\"+files[a]+\"_rem_p0_0_quadrangulation_smooth.zip\";\n\t\tdocument.getElementById(\"input\").href = files[a]+\"/\"+files[a]+\".zip\";\n\t\t\n\t}\n\ttoggle = function(){ if (b) d.classList.add(\"b\"); else d.classList.remove(\"b\"); b=!b; }\n\tsetInterval( toggle ,1000);\n\n\n\t// Get the modal box\n\tvar modal = document.getElementById(\"plotBox\");\n\t//get the modal plot img\n\tvar modalPlot = document.getElementById(\"modalPlot\");\n\t// Get the <span> element that closes the modal\n\tvar span = document.getElementsByClassName(\"close\")[0];\n\n\t// When the user clicks the button, open the modal \n\topenModal = function(whom) {\n\t\tmodalPlot.src = whom.src;\n\t\tmodal.style.display = \"block\";\n\t}\n\n\t// When the user clicks on <span> (x), close the modal\n\tcloseModal = function() {\n\t\tmodal.style.display = \"none\";\n\t}\n\n\t// When the user clicks anywhere outside of the modal, close it\n\twindow.onclick = function(event) {\n\t\tif (event.target == modal) {\n\t\t\tmodal.style.display = \"none\";\n\t\t}\n\t}\n\n\t</script>\n\t</html>"
  },
  {
    "path": "components/results_processing/libs.pri",
    "content": "LIBS_DIR = $$PWD/../../../../\nmessage($$PWD)\nmessage($$LIBS_DIR)\n# VCGlib\ncontains(LIBS_EXTERNAL, vcg) {\n\tisEmpty(VCG_DIR) {\n                VCG_DIR = $$LIBS_DIR/vcglib\n\t}\n\tINCLUDEPATH *= $$VCG_DIR\n\tDEPENDPATH  *= $$VCG_DIR\n\n\tcontains(LIBS_EXTERNAL, glew) {\n\t\t# trackball\n\t\tSOURCES += $$VCG_DIR/wrap/gui/trackmode.cpp\n\t\tSOURCES += $$VCG_DIR/wrap/gui/trackball.cpp\n\t}\n\t# ply format\n\tSOURCES += $$VCG_DIR/wrap/ply/plylib.cpp\n}\n\n# VCGlibfork\ncontains(LIBS_EXTERNAL, vcgfork) {\n        isEmpty(VCG_DIR) {\n                VCG_DIR = C:\\Users\\thoma\\Documents\\GitHub\\vcglib\n        }\n        INCLUDEPATH *= $$VCG_DIR\n        DEPENDPATH  *= $$VCG_DIR\n\n        contains(LIBS_EXTERNAL, glew) {\n                # trackball\n                SOURCES += $$VCG_DIR/wrap/gui/trackmode.cpp\n                SOURCES += $$VCG_DIR/wrap/gui/trackball.cpp\n        }\n        # ply format\n        SOURCES += $$VCG_DIR/wrap/ply/plylib.cpp\n}\n\n# libigl\ncontains(LIBS_EXTERNAL, igl) {\n\t# libigl dep\n\tLIBS_EXTERNAL *= eigen\n\tisEmpty(LIBIGL_DIR) {\n\t\tLIBIGL_DIR = $$LIBS_DIR/libigl\n\t}\n\tINCLUDEPATH *= $$LIBIGL_DIR/include\n\tDEPENDPATH  *= $$LIBIGL_DIR/include\n}\n\n#cinolib\ncontains(LIBS_EXTERNAL, cino) {\n        # libigl dep\n        LIBS_EXTERNAL *= eigen\n        isEmpty(CINOLIB_DIR) {\n                CINOLIB_DIR = $$LIBS_DIR/cinolib\n        }\n        INCLUDEPATH *= $$CINOLIB_DIR/include\n        DEPENDPATH  *= $$CINOLIB_DIR/include\n        message($$INCLUDEPATH)\n}\n\n# Eigen\ncontains(LIBS_EXTERNAL, eigen) {\n\tisEmpty(EIGEN_DIR) {\n\t\tEIGEN_DIR = $$LIBS_DIR/eigen\n\t}\n\t# To use standard Eigen includes\n\tINCLUDEPATH *= $$EIGEN_DIR\n\tDEPENDPATH  *= $$EIGEN_DIR\n}\n\n# GLEW\ncontains(LIBS_EXTERNAL, glew) {\n\tisEmpty(GLEW_DIR) {\n                GLEW_DIR = $$LIBS_DIR/glew-2.0.0\n\t}\n\n        #DEFINES     *= GLEW_STATIC\n\tINCLUDEPATH *= $$GLEW_DIR/include\n\tDEPENDPATH  *= $$GLEW_DIR/include\n        win32 {\n            LIBS *= $$GLEW_DIR\\lib\\Release\\x64\\glew32.lib\n            LIBS *= -L$$GLEW_DIR\\bin\\Release\\x64\n            LIBS *= -lopengl32 -lGLU32\n        }\n\n        SOURCES *= $$GLEW_DIR/src/glew.c\n\n\tlinux {\n\t\tLIBS    *= -lGLU\n\t}\n}\n\n#GLFW\ncontains (LIBS_EXTERNAL, glfw) {\n    isEmpty(GLFW_DIR) {\n        GLFW_DIR = $$LIBS_DIR/glfw\n    }\n\n    INCLUDEPATH *= $$GLFW_DIR/include\n    DEPENDPATH  *= $$GLFW_DIR/include\n\n    win32 {\n        LIBS *= -L$$GLFW_DIR/lib\n        LIBS *= -lglfw3\n        LIBS *= -lopengl32\n    }\n}\n\n#imgui\ncontains (LIBS_EXTERNAL, imgui) {\n    isEmpty (IMGUI_DIR) {\n        IMGUI_DIR = $$LIBS_DIR/imgui\n    }\n\n    INCLUDEPATH *= $$IMGUI_DIR\n    DEPENDPATH  *= $$IMGUI_DIR\n\n    SOURCES *= \\\n        $$IMGUI_DIR\\imgui.cpp \\\n        $$IMGUI_DIR\\imgui_draw.cpp \\\n        $$IMGUI_DIR\\imgui_demo.cpp \\\n        $$IMGUI_DIR\\imgui_widgets.cpp \\\n        $$IMGUI_DIR\\imgui_impl_glfw.cpp \\\n        $$IMGUI_DIR\\imgui_impl_opengl3.cpp\n\n    HEADERS *= \\\n        $$IMGUI_DIR\\imgui.h \\\n        $$IMGUI_DIR\\imgui_internal.h \\\n        $$IMGUI_DIR\\imgui_impl_glfw.h \\\n        $$IMGUI_DIR\\imgui_impl_opengl3.h\n\n    LIBS *= -lgdi32\n\n\n\n    contains(LIBS_EXTERNAL, glew) {\n        DEFINES *= IMGUI_IMPL_OPENGL_LOADER_GLEW\n    }\n}\n\n#nanogui\ncontains (LIBS_EXTERNAL, nanogui) {\n    LIBS_EXTERNAL *= eigen\n    isEmpty(NANOGUI_DIR) {\n        NANOGUI_DIR = $$LIBS_DIR/nanogui\n    }\n\n    DEFINES *= NANOGUI_GLAD NANOGUI_SHARED\n\n    INCLUDEPATH *= $$NANOGUI_DIR/include\n    DEPENDPATH  *= $$NANOGUI_DIR/include\n\n    INCLUDEPATH *= $$NANOGUI_DIR/ext/nanovg/src\n    DEPENDPATH  *= $$NANOGUI_DIR/ext/nanovg/src\n\n    INCLUDEPATH *= $$NANOGUI_DIR/ext/glad/include\n    DEPENDPATH  *= $$NANOGUI_DIR/ext/glad/include\n\n#    SOURCES *= $$NANOGUI_DIR/ext/glad/src/glad.c\n\n    INCLUDEPATH *= $$NANOGUI_DIR/ext/glfw/include\n    DEPENDPATH  *= $$NANOGUI_DIR/ext/glfw/include\n\n\n    win32 {\n        CONFIG(release, debug|release) {\n            message(\"NANOGUI release\")\n            LIBS *= $$NANOGUI_DIR/lib/Release/nanogui.lib\n        }\n\n        CONFIG(debug, debug|release) {\n            message(\"NANOGUI debug\")\n            LIBS *= $$NANOGUI_DIR/lib/Debug/nanogui.lib\n        }\n    }\n\n}\n# anttweakbar\ncontains(LIBS_EXTERNAL, anttweakbar) {\n\tisEmpty(ANTTWEAKBAR_DIR) {\n\t\tANTTWEAKBAR_DIR  = $$LIBS_DIR/AntTweakBar1.16\n\t}\n\n\tcontains(LIBS_EXTERNAL , vcg) {\n\t\tSOURCES         *= $$VCG_DIR/wrap/qt/anttweakbarMapperNew.cpp\n\t}\n\n\tINCLUDEPATH     *= $$ANTTWEAKBAR_DIR/include\n\t\n\t# Awful problem with windows..\n\twin32 {\n                #DEFINES += NOMINMAX\n                LIBS    += -L$$ANTTWEAKBAR_DIR/lib -lAntTweakBar64\n\t}\n\n\tlinux {\n\t\tLIBS    *= -L$$ANTTWEAKBAR_DIR/lib -lAntTweakBar\n\t}\n\t\n\tmac {\n\t\t# include specific anttweakbar version using different std library\n\t\tmacx-g++49 {\n\t\t\tANTTWEAKLIB = libAntTweakBar.dylib\n\t\t} else {\n\t\t\tcontains(CONFIG, c++11) {\n\t\t\t\tANTTWEAKLIB = libAntTweakBar_libc++.dylib\n\t\t\t} else {\n\t\t\t\tANTTWEAKLIB = libAntTweakBar.dylib\n\t\t\t}\n\t\t}\n\t\tLIBS *= $$ANTTWEAKBAR_DIR/lib/$$ANTTWEAKLIB\n\n#\t\tequals(TEMPLATE, app) {\n\t\t\tQMAKE_POST_LINK += \"cp -P $$ANTTWEAKBAR_DIR/lib/$$ANTTWEAKLIB $$DESTDIR/libAntTweakBar.dylib ;\"\n\t\t\tQMAKE_POST_LINK += \"install_name_tool -change ../lib/libAntTweakBar.dylib ./libAntTweakBar.dylib $$DESTDIR/$$TARGET ;\"\n#\t\t}\n\t}\n}\n\n# Clipper\ncontains(LIBS_EXTERNAL, clipper) {\n\tisEmpty(CLIPPER_DIR) {\n\t\tCLIPPER_DIR = $$LIBS_DIR/clipper_ver6.4.2/cpp\n\t}\n\tINCLUDEPATH *= $$CLIPPER_DIR\n\tDEPENDPATH  *= $$CLIPPER_DIR\n\tSOURCES     *= $$CLIPPER_DIR/clipper.cpp\n}\n\n# Triangle\ncontains(LIBS_EXTERNAL, triangle) {\n\tisEmpty(TRIANGLE_DIR) {\n\t\tTRIANGLE_DIR = $$LIBS_DIR/triangle\n\t}\n\tINCLUDEPATH *= $$TRIANGLE_DIR\n\tDEPENDPATH  *= $$TRIANGLE_DIR\n\tSOURCES     *= $$TRIANGLE_DIR/triangle.c\n}\n\n# clang OpenMP\ncontains(LIBS_EXTERNAL, omp) {\n    isEmpty(OMP_DIR) {\n#\t\t-I/opt/local/include/libomp -L/opt/local/lib/libomp -fopenmp\n        OMP_DIR = /opt/local\n    }\n\twin32 {\n\t\tQMAKE_CXXFLAGS *= -openmp\n\t}\n\tmacx {\n\t\tINCLUDEPATH    *= $$OMP_DIR/include/libomp\n\t\tLIBS           *= -L$$OMP_DIR/lib/libomp\n\n\t\tQMAKE_CXXFLAGS *= -fopenmp\n\t\tQMAKE_LFLAGS   *= -fopenmp\n\t}\n\n        unix:!macx {\n                QMAKE_CXXFLAGS *= -fopenmp\n                QMAKE_LFLAGS += -fopenmp -lgomp\n        }\n}\n\n#\n# ShapeOp\ncontains(LIBS_EXTERNAL, shapeop) {\n\tisEmpty(SHAPEOP_DIR) {\n\t\tSHAPEOP_DIR = $$LIBS_DIR/shapeop010/libShapeOp\n\t}\n\tDEFINES     += SHAPEOP_HEADER_ONLY=1\n\tINCLUDEPATH *= $$SHAPEOP_DIR/src\n\tDEPENDPATH  *= $$SHAPEOP_DIR/src\n\n\tcontains(LIBS_EXTERNAL, omp) {\n\t\tDEFINES *= OMP_NESTED=TRUE\n\t\tDEFINES += SHAPEOP_OPENMP\n\t\tDEFINES *= EIGEN_DONT_PARALLELIZE\n\t}\n}\n\n# OpenVDB\ncontains(LIBS_EXTERNAL, openvdb) {\n\tisEmpty(OPENVDB_DIR) {\n\t\tOPENVDB_DIR = $$LIBS_DIR/openvdb\n    }\n\n\n    win32 {\n        OPENVDB_DIR = $$LIBS_DIR/libs/include\n        QMAKE_CXXFLAGS *= -DOPENVDB_3_ABI_COMPATIBLE -DOPENVDB_DLL -DOPENEXR_DLL -DWIN32 -D_WINDOWS -D_WIN320\n        QMAKE_CXXFLAGS *= -DNOMINMAX\n        INCLUDEPATH *= C:\\local\\boost_1_63_0\n Release:\n{\n    message(\"Openvdb in release mode..\")\n    LIBS += -LC:\\local\\boost_1_63_0\\lib64-msvc-14.0 \\\n            -L$$LIBS_DIR/libs/lib -lHalf \\\n            -L$$LIBS_DIR/libs/lib/zlib -lzlib \\\n            -L$$LIBS_DIR/libs/lib/GLFW -lglfw3 \\\n            -L$$LIBS_DIR/libs/lib/blosc -lblosc \\\n            -L$$LIBS_DIR/libs/lib/glew -lglew32 \\\n            -L$$LIBS_DIR/libs/lib/tbb -ltbb \\\n            -L$$LIBS_DIR/libs/lib/tbb -ltbbmalloc \\\n            -L$$LIBS_DIR/libs/lib/tbb -ltbbproxy \\\n            -L$$LIBS_DIR/libs/lib -lIex \\\n            -L$$LIBS_DIR/libs/lib/ -lopenvdb \\\n}\n    Debug: {\n        message(\"Openvdb in debug mode..\")\n     LIBS += -LC:\\local\\boost_1_63_0\\lib64-msvc-14.0 \\\n            -L$$LIBS_DIR/libs/lib -lHalfd \\\n            -L$$LIBS_DIR/libs/lib/zlib -lzlibd \\\n            -L$$LIBS_DIR/libs/lib/GLFW -lglfw3d \\\n            -L$$LIBS_DIR/libs/lib/blosc -lbloscd \\\n            -L$$LIBS_DIR/libs/lib/glew -lglew32 \\\n            -L$$LIBS_DIR/libs/lib/tbb -ltbb_debug \\\n            -L$$LIBS_DIR/libs/lib/tbb -ltbbmalloc_debug \\\n            -L$$LIBS_DIR/libs/lib/tbb -ltbbproxy_debug \\\n            -L$$LIBS_DIR/libs/lib -lIexd \\\n            -L$$LIBS_DIR/libs/lib/ -lopenvdbd \\\n}\n    }\n        INCLUDEPATH *= $$OPENVDB_DIR\n        DEPENDPATH  *= $$OPENVDB_DIR\n#        QMAKE_CXXFLAGS *= -DOPENVDB_3_ABI_COMPATIBLE\n\n\tmacx {\n        INCLUDEPATH *= $$OPENVDB_DIR\n        DEPENDPATH  *= $$OPENVDB_DIR\n\n\t\tLIBS *= -L$$OPENVDB_DIR/build/openvdb\n\t\tLIBS *= /Users/mal/devel/openvdb/build/openvdb/libopenvdb.a\n\n\t\tINCLUDEPATH *= /opt/local/include\n\n\t\tLIBS *= -lz\n\n\t\tLIBS *= -L/opt/local/lib\n\t\tLIBS *= -lboost_iostreams-mt -lboost_system-mt -lboost_thread-mt\n\n\t\tLIBS *= -lblosc\n\n\t\tLIBS *= -ltbb -ltbbmalloc -ltbbmalloc_proxy\n\t\tLIBS *= -lHalf\n\t\tLIBS *= -lIex\n\t\tLIBS *= -lIlmThread\n\t\tLIBS *= -lImath\n\t}\n        linux {\n#                INCLUDEPATH *= $$OPENVDB_DIR\n#                DEPENDPATH  *= $$OPENVDB_DIR\n\n        LIBS *= -L/usr/local/lib\n#        LIBS *= /usr/local/lib/libopenvdb.a\n\n                INCLUDEPATH *= /usr/local/include\n                DEPENDPATH  *= /usr/local/include\n\n                LIBS *= -lz\n            message(\"linking openvdb [linux]..\")\n#                LIBS *= -L/opt/local/lib\n                LIBS *= -lboost_iostreams -lboost_system -lboost_thread\n                LIBS *= -lblosc\n                LIBS *= -ltbb -ltbbmalloc -ltbbmalloc_proxy\n                LIBS *= -lHalf\n                LIBS *= -lIex\n                LIBS *= -lIlmThread\n                LIBS *= -lImath\n                LIBS *= -lopenvdb\n        }\n}\n\n#GUROBI\ncontains (LIBS_EXTERNAL, gurobi) {\nwin32 {\n        LIBS += -L$$LIBS_DIR/gurobi9/win64/lib\n\n        CONFIG(debug, debug|release){\n            message(debug)\n            LIBS += -lgurobi_c++mdd2015 -lgurobi90\n        } else {\n            message(release)\n            LIBS += -lgurobi_c++md2015 -lgurobi90\n        }\n\n    INCLUDEPATH += $$LIBS_DIR/gurobi9/win64/include\n    DEPENDPATH += $$LIBS_DIR/gurobi9/win64/include\n}\n}\n# CGAL\ncontains(LIBS_EXTERNAL, cgal) {\n\nwin32 {\n\n    # gmp\n    LIBS += C:\\local\\CGAL-4.11\\auxiliary\\gmp\\lib\\libgmp-10.lib\n    # mpfr\n    LIBS += C:\\local\\CGAL-4.11\\auxiliary\\gmp\\lib\\libmpfr-4.lib\n    # CGAL\n    INCLUDEPATH += C:/local/CGAL-4.11/include\n    INCLUDEPATH += C:\\local\\CGAL-4.11\\auxiliary\\gmp\\include\n\n    Release: {\n        LIBS +=  \\\n                -LC:\\local\\CGAL-4.11\\build\\lib\\ -lCGAL_Core-vc140-mt-4.11 \\\n                -LC:\\local\\CGAL-4.11\\build\\lib\\ -lCGAL-vc140-mt-4.11 \\\n\n    }\n    Debug: {\n        LIBS += \\\n                C:\\local\\CGAL-4.11\\build\\lib\\CGAL_Core-vc140-mt-gd-4.11.lib \\\n                C:\\local\\CGAL-4.11\\build\\lib\\CGAL-vc140-mt-gd-4.11.lib \\\n    }\n\n    Release: LIBS += -LC:/local/boost_1_63_0/lib64-msvc-14.0/ -lboost_thread-vc140-mt-1_63\n    Debug: LIBS += -LC:/local/boost_1_63_0/lib64-msvc-14.0/ -lboost_thread-vc140-mt-gd-1_63\n    INCLUDEPATH += C:\\local\\boost_1_63_0\n    INCLUDEPATH += C:/local/boost_1_63_0/lib64-msvc-14.0\n    DEPENDPATH += C:/local/boost_1_63_0/lib64-msvc-14.0\n}\n\n\tmacx {\n\t\tisEmpty(CGAL_DIR) {\n\t\t\tCGAL_DIR = /opt/local\n\t\t}\n\n#\t\tLIBS_EXTERNAL *= boost\n\t\tINCLUDEPATH *= $$CGAL_DIR/include\n\t\tLIBS *= -L$$CGAL_DIR/lib\n\n\t\tLIBS *= -L/opt/local/lib\n\t\tLIBS *= -lboost_iostreams-mt -lboost_system-mt -lboost_thread-mt\n\t\tLIBS *= -lCGAL -lCGAL_Core\n\t\tLIBS *= -lmpfr\n\t\tLIBS *= -lgmp\n\t\tLIBS  *= -frounding-math\n\t}\n\tlinux {\n\t\tisEmpty(CGAL_DIR) {\n\t\t\tCGAL_DIR = /opt/local\n\t\t}\n\n\t\tINCLUDEPATH *= $$CGAL_DIR/include\n\t\tLIBS *= -L$$CGAL_DIR/lib\n\n\t\tLIBS *= -L/opt/local/lib\n\t\tLIBS *= -lboost_iostreams -lboost_system -lboost_thread\n\t\tLIBS *= -lCGAL -lCGAL_Core\n\t\tLIBS *= -lmpfr\n\t\tLIBS *= -lgmp\n\t\tLIBS *= -frounding-math\n\t}\n}\n\n"
  },
  {
    "path": "components/results_processing/orientability_check/main.cpp",
    "content": "#include <iostream>\n\n#include <QDir>\n#include <QFile>\n#include <QTextStream>\n#include <QDirIterator>\n\n#include <mesh_def.h>\n\nusing namespace std;\n\nstatic void writeDataToFile(const std::vector<std::string> & data, const std::string & filename)\n{\n    QFile txtFile(filename.c_str());\n\n    if(!txtFile.open(QFile::WriteOnly |QFile::Truncate))\n    {\n        std::cerr << \"[orientability_check] Error opening text file \" << filename << std::endl;\n        std::cerr << \"[orientability_check] Continuing...\" << std::endl;\n        return;\n    }\n\n    QTextStream txtStream(&txtFile);\n\n    for (size_t i = 0; i < data.size(); ++i)\n        txtStream << data[i].c_str() << \"\\n\";\n    txtStream.flush();\n\n    txtFile.close();\n}\n\n\nstatic int openMesh(PolyMesh & m, std::string & name)\n{\n\tint mask;\n\tint err = vcg::tri::io::ImporterOBJ<PolyMesh>::Open(m, name.c_str(), mask);\n\tif (err)\n\t{\n\t\tstd::cerr << \"[polyMetrics] Import Error: \" << vcg::tri::io::ImporterOBJ<PolyMesh>::ErrorMsg(err) <<  std::endl;\n\t\treturn err;\n\t}\n\n\treturn 0;\n}\n\nint main(int argc, char * argv[])\n{\n\n\tif (argc < 3)\n\t{\n        std::cout <<  \"[USAGE] polyMetrics baseDirectory globpattern\" << std::endl;\n        std::cout << \"BaseDirectory: the directory that contains all the target subdirectories\" << std::endl;\n        std::cout << \"globpattern: the pattern that matches the filename of the quad mesh to compute the metrics\" << std::endl;\n\n\t\treturn 1;\n\t}\n\n\tQDir dir;\n\tQString basePath = dir.currentPath();\n\tQString targetDir = argv[1];\n\tQString globPattern = argv[2];\n\n    std::cout << \"Target Dir: \" << targetDir.toStdString() << \" glob pattern: \" << globPattern.toStdString() << std::endl;\n\n    std::vector<std::string> notOrientables;\n\n    QDirIterator it(targetDir, QStringList() << globPattern, QDir::Files, QDirIterator::Subdirectories);\n\twhile (it.hasNext())\n\t{\n        it.next();\n        dir.setCurrent(it.fileInfo().dir().path());\n        std::cout << dir.currentPath().toStdString() << std::endl;\n\n\t\tPolyMesh m;\n        std::string mesh = it.fileName().toStdString();// + \"_rem_p0_0_quadrangulation_smooth.obj\";\n\t\tint err = openMesh(m, mesh);\n\n\t\tstd::cout << mesh << \" \" << m.VN() << std::endl;\n\n\t\tif (err)\n\t\t\tcontinue;\n\n        std::cout << \"computing orientability...\" << std::endl;\n\n        bool isOriented = false;\n        bool isOrientable = false;\n\n        vcg::tri::UpdateTopology<PolyMesh>::FaceFace(m);\n        vcg::tri::Clean<PolyMesh>::OrientCoherentlyMesh(m, isOriented, isOrientable);\n\n        std::string baseName = dir.current().dirName().toStdString();\n\n        if (!isOrientable)\n        {\n           notOrientables.push_back(baseName);\n        }\n\n\t\tdir.setCurrent(basePath);\n\t}\n\n    writeDataToFile(notOrientables, \"notOrientable.txt\");\n\n\treturn 0;\n}\n"
  },
  {
    "path": "components/results_processing/orientability_check/mesh_def.h",
    "content": "#ifndef MESH_DEF_H\n#define MESH_DEF_H\n\n\n#include <vcg/complex/complex.h>\n#include <vcg/complex/algorithms/polygon_support.h>\n#include <vcg/complex/algorithms/polygonal_algorithms.h>\n\n#include <wrap/io_trimesh/import_obj.h>\n#include <wrap/io_trimesh/export_obj.h>\n\n\nclass PolyVertex;\nclass PolyEdge;\nclass PolyFace;\n\nstruct MyUsedTypes : public vcg::UsedTypes<\n        vcg::Use<PolyVertex>::AsVertexType,\n        //        vcg::Use<PolyEdge>::AsEdgeType,\n        vcg::Use<PolyFace>::AsFaceType\n        > {};\n\nclass PolyVertex : public vcg::Vertex<\n        MyUsedTypes,\n        vcg::vertex::Coord3d,\n        vcg::vertex::Qualityd,\n        vcg::vertex::Normal3d,\n        vcg::vertex::Color4b,\n        vcg::vertex::Mark,\n        vcg::vertex::BitFlags,\n        vcg::vertex::VFAdj\n        > {};\n\nclass PolyFace : public vcg::Face<\n        MyUsedTypes,\n        vcg::face::Color4b,\n        vcg::face::Normal3d,\n        vcg::face::VertexRef,\n        vcg::face::BitFlags,\n        vcg::face::Mark,\n        vcg::face::PolyInfo,\n        vcg::face::FFAdj,\n        vcg::face::Qualityd\n        > {};\n\n\nclass PolyMesh : public vcg::tri::TriMesh<\n        std::vector<PolyVertex>,\n        std::vector<PolyFace >\n        >{};\n\n\ntypedef typename PolyVertex::CoordType CoordType;\ntypedef typename PolyVertex::ScalarType ScalarType;\n\ntypedef typename PolyMesh::VertexType VertexType;\ntypedef typename PolyMesh::VertexPointer VertexPointer;\n\ntypedef typename PolyMesh::FaceType FaceType;\ntypedef typename PolyMesh::FacePointer FacePointer;\n\n\n#endif // MESH_DEF_H\n"
  },
  {
    "path": "components/results_processing/orientability_check/orientability_check.pro",
    "content": "QT += core\n\nDEFINES *= QT_NO_OPENGL_ES_2\nDEFINES *= QT_NO_KEYWORDS\n\nCONFIG += c++11\n\nTARGET = orientability_check\n\nCONFIG -= app_bundle\nCONFIG += console\n\n\nCONFIG(release, debug|release): DEFINES += NDEBUG\n\nLIBS_EXTERNAL = vcg eigen omp json\ninclude(../libs.pri)\n\nSOURCES *= \\\n    main.cpp\n\nHEADERS += \\\n    mesh_def.h\n\n\n\n\n\n"
  },
  {
    "path": "components/results_processing/orientability_check/readme.txt",
    "content": "To compile correctly setup the ../libs.pri file point to the vcg\n\n"
  },
  {
    "path": "components/results_processing/polyMetrics/external/matplotlib-cpp/.gitignore",
    "content": "# Compiled Object files\n*.slo\n*.lo\n*.o\n*.obj\n\n# Precompiled Headers\n*.gch\n*.pch\n\n# Compiled Dynamic libraries\n*.so\n*.dylib\n*.dll\n\n# Fortran module files\n*.mod\n\n# Compiled Static libraries\n*.lai\n*.la\n*.a\n*.lib\n\n# Executables\n*.exe\n*.out\n*.app\n\n# Logfiles\n*.tlog\n*.log\n\n# Build\n/examples/build/*\n"
  },
  {
    "path": "components/results_processing/polyMetrics/external/matplotlib-cpp/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014 Benno Evers\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "components/results_processing/polyMetrics/external/matplotlib-cpp/LICENSE.matplotlib",
    "content": "This library does not contain any files from the matplotlib project, nor\ndoes it make any changes to it. On the other hand, the code contained herein\nis perfectly useless without a separate installation of matplotlib.\nI don't know enough about US copyright law to decide whether this implies\nthat this library \"uses\" or is \"based on\" matplotlib.\nIn any case, matplotlib comes with the following license:\n\nLicense agreement for matplotlib 1.4.3\n1. This LICENSE AGREEMENT is between the Matplotlib Development Team (“MDT”),\n   and the Individual or Organization (“Licensee”) accessing and otherwise\n   using matplotlib software in source or binary form and its associated documentation.\n\n2. Subject to the terms and conditions of this License Agreement, MDT hereby grants\n   Licensee a nonexclusive, royalty-free, world-wide license to reproduce, analyze,\n   test, perform and/or display publicly, prepare derivative works, distribute, and\n   otherwise use matplotlib 1.4.3 alone or in any derivative version, provided, however,\n   that MDT’s License Agreement and MDT’s notice of copyright, i.e.,\n   “Copyright (c) 2012-2013 Matplotlib Development Team; All Rights Reserved” are retained\n   in matplotlib 1.4.3 alone or in any derivative version prepared by Licensee.\n\n3. In the event Licensee prepares a derivative work that is based on or incorporates\n   matplotlib 1.4.3 or any part thereof, and wants to make the derivative work available\n   to others as provided herein, then Licensee hereby agrees to include in any such work a\n   brief summary of the changes made to matplotlib 1.4.3.\n\n4. MDT is making matplotlib 1.4.3 available to Licensee on an “AS IS” basis. MDT MAKES NO\n   REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION,\n   MDT MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS\n   FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF MATPLOTLIB 1.4.3 WILL NOT INFRINGE ANY\n   THIRD PARTY RIGHTS.\n\n5. MDT SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF MATPLOTLIB 1.4.3 FOR ANY\n   INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF MODIFYING,\n   DISTRIBUTING, OR OTHERWISE USING MATPLOTLIB 1.4.3, OR ANY DERIVATIVE THEREOF,\n   EVEN IF ADVISED OF THE POSSIBILITY THEREOF.\n\n6. This License Agreement will automatically terminate upon a material breach of\n   its terms and conditions.\n\n7. Nothing in this License Agreement shall be deemed to create any relationship of\n   agency, partnership, or joint venture between MDT and Licensee. This License\n   Agreement does not grant permission to use MDT trademarks or trade name in a\n   trademark sense to endorse or promote products or services of Licensee, or any\n   third party.\n\n8. By copying, installing or otherwise using matplotlib 1.4.3, Licensee agrees to be\n   bound by the terms and conditions of this License Agreement.\n"
  },
  {
    "path": "components/results_processing/polyMetrics/external/matplotlib-cpp/README.md",
    "content": "matplotlib-cpp\n==============\n\nWelcome to matplotlib-cpp, possibly the simplest C++ plotting library.\nIt is built to resemble the plotting API used by Matlab and matplotlib.\n\n\n\nUsage\n-----\nComplete minimal example:\n```cpp\n#include \"matplotlibcpp.h\"\nnamespace plt = matplotlibcpp;\nint main() {\n    plt::plot({1,3,2,4});\n    plt::show();\n}\n```\n    g++ minimal.cpp -std=c++11 -I/usr/include/python2.7 -lpython2.7\n\n**Result:**\n\n![Minimal example](./examples/minimal.png)\n\nA more comprehensive example:\n```cpp\n#include \"matplotlibcpp.h\"\n#include <cmath>\n\nnamespace plt = matplotlibcpp;\n\nint main() \n{\n    // Prepare data.\n    int n = 5000;\n    std::vector<double> x(n), y(n), z(n), w(n,2);\n    for(int i=0; i<n; ++i) {\n        x.at(i) = i*i;\n        y.at(i) = sin(2*M_PI*i/360.0);\n        z.at(i) = log(i);\n    }\n\n    // Set the size of output image to 1200x780 pixels\n    plt::figure_size(1200, 780);\n    // Plot line from given x and y data. Color is selected automatically.\n    plt::plot(x, y);\n    // Plot a red dashed line from given x and y data.\n    plt::plot(x, w,\"r--\");\n    // Plot a line whose name will show up as \"log(x)\" in the legend.\n    plt::named_plot(\"log(x)\", x, z);\n    // Set x-axis to interval [0,1000000]\n    plt::xlim(0, 1000*1000);\n    // Add graph title\n    plt::title(\"Sample figure\");\n    // Enable legend.\n    plt::legend();\n    // Save the image (file format is determined by the extension)\n    plt::save(\"./basic.png\");\n}\n```\n    g++ basic.cpp -I/usr/include/python2.7 -lpython2.7\n\n**Result:**\n\n![Basic example](./examples/basic.png)\n\nAlternatively, matplotlib-cpp also supports some C++11-powered syntactic sugar:\n```cpp\n#include <cmath>\n#include \"matplotlibcpp.h\"\n\nusing namespace std;\nnamespace plt = matplotlibcpp;\n\nint main() \n{    \n    // Prepare data.\n    int n = 5000; // number of data points\n    vector<double> x(n),y(n); \n    for(int i=0; i<n; ++i) {\n        double t = 2*M_PI*i/n;\n        x.at(i) = 16*sin(t)*sin(t)*sin(t);\n        y.at(i) = 13*cos(t) - 5*cos(2*t) - 2*cos(3*t) - cos(4*t);\n    }\n\n    // plot() takes an arbitrary number of (x,y,format)-triples. \n    // x must be iterable (that is, anything providing begin(x) and end(x)),\n    // y must either be callable (providing operator() const) or iterable. \n    plt::plot(x, y, \"r-\", x, [](double d) { return 12.5+abs(sin(d)); }, \"k-\");\n\n\n    // show plots\n    plt::show();\n} \n```\n    g++ modern.cpp -std=c++11 -I/usr/include/python2.7 -lpython\n\n**Result:**\n\n![Modern example](./examples/modern.png)\n\nOr some *funny-looking xkcd-styled* example:\n```cpp\n#include \"matplotlibcpp.h\"\n#include <vector>\n#include <cmath>\n\nnamespace plt = matplotlibcpp;\n\nint main() {\n    std::vector<double> t(1000);\n    std::vector<double> x(t.size());\n\n    for(size_t i = 0; i < t.size(); i++) {\n        t[i] = i / 100.0;\n        x[i] = sin(2.0 * M_PI * 1.0 * t[i]);\n    }\n\n    plt::xkcd();\n    plt::plot(t, x);\n    plt::title(\"AN ORDINARY SIN WAVE\");\n    plt::save(\"xkcd.png\");\n}\n\n```\n    g++ xkcd.cpp -std=c++11 -I/usr/include/python2.7 -lpython2.7\n\n**Result:**\n\n![xkcd example](./examples/xkcd.png)\n\nWhen working with vector fields, you might be interested in quiver plots:\n```cpp\n#include \"../matplotlibcpp.h\"\n\nnamespace plt = matplotlibcpp;\n\nint main()\n{\n    // u and v are respectively the x and y components of the arrows we're plotting\n    std::vector<int> x, y, u, v;\n    for (int i = -5; i <= 5; i++) {\n        for (int j = -5; j <= 5; j++) {\n            x.push_back(i);\n            u.push_back(-i);\n            y.push_back(j);\n            v.push_back(-j);\n        }\n    }\n\n    plt::quiver(x, y, u, v);\n    plt::show();\n}\n```\n    g++ quiver.cpp -std=c++11 -I/usr/include/python2.7 -lpython2.7\n\n**Result:**\n\n![quiver example](./examples/quiver.png)\n\nWhen working with 3d functions, you might be interested in 3d plots:\n```cpp\n#include \"../matplotlibcpp.h\"\n\nnamespace plt = matplotlibcpp;\n\nint main()\n{\n    std::vector<std::vector<double>> x, y, z;\n    for (double i = -5; i <= 5;  i += 0.25) {\n        std::vector<double> x_row, y_row, z_row;\n        for (double j = -5; j <= 5; j += 0.25) {\n            x_row.push_back(i);\n            y_row.push_back(j);\n            z_row.push_back(::std::sin(::std::hypot(i, j)));\n        }\n        x.push_back(x_row);\n        y.push_back(y_row);\n        z.push_back(z_row);\n    }\n\n    plt::plot_surface(x, y, z);\n    plt::show();\n}\n```\n\n**Result:**\n\n![surface example](./examples/surface.png)\n\nInstallation\n------------\n\nmatplotlib-cpp works by wrapping the popular python plotting library matplotlib. (matplotlib.org)\nThis means you have to have a working python installation, including development headers.\nOn Ubuntu:\n\n    sudo apt-get install python-matplotlib python-numpy python2.7-dev\n\nIf, for some reason, you're unable to get a working installation of numpy on your system,\nyou can add the define `WITHOUT_NUMPY` to erase this dependency.\n\nThe C++-part of the library consists of the single header file `matplotlibcpp.h` which can be placed\nanywhere.\n\nSince a python interpreter is opened internally, it is necessary to link against `libpython2.7` in order to use\nmatplotlib-cpp.\n\n# CMake\n\nIf you prefer to use CMake as build system, you will want to add something like this to your\nCMakeLists.txt:\n\n**Recommended way (since CMake 3.12):**\n\nIt's easy to use cmake official [docs](https://cmake.org/cmake/help/git-stage/module/FindPython2.html#module:FindPython2) to find Python 2(or 3) interpreter, compiler and development environment (include directories and libraries).\n\nNumPy is optional here, delete it from cmake script, if you don't need it.\n\n```cmake\nfind_package(Python2 COMPONENTS Development NumPy)\ntarget_include_directories(myproject PRIVATE ${Python2_INCLUDE_DIRS} ${Python2_NumPy_INCLUDE_DIRS})\ntarget_link_libraries(myproject Python2::Python Python2::NumPy)\n```\n\n**Alternative way (for CMake <= 3.11):**\n\n```cmake\nfind_package(PythonLibs 2.7)\ntarget_include_directories(myproject PRIVATE ${PYTHON_INCLUDE_DIRS})\ntarget_link_libraries(myproject ${PYTHON_LIBRARIES})\n```\n\n# C++11\n\nCurrently, c++11 is required to build matplotlib-cpp. The last working commit that did\nnot have this requirement was `717e98e752260245407c5329846f5d62605eff08`.\n\nNote that support for c++98 was dropped more or less accidentally, so if you have to work\nwith an ancient compiler and still want to enjoy the latest additional features, I'd\nprobably merge a PR that restores support.\n\n# Python 3\n\nThis library supports both python2 and python3 (although the python3 support is probably far less tested,\nso it is recommended to prefer python2.7). To switch the used python version, simply change\nthe compiler flags accordingly.\n\n    g++ example.cpp -I/usr/include/python3.6 -lpython3.6\n\nThe same technique can be used for linking against a custom build of python\n\n    g++ example.cpp -I/usr/local/include/fancy-python4 -L/usr/local/lib -lfancy-python4\n\n\nWhy?\n----\nI initially started this library during my diploma thesis. The usual approach of \nwriting data from the c++ algorithm to a file and afterwards parsing and plotting\nit in python using matplotlib proved insufficient: Keeping the algorithm\nand plotting code in sync requires a lot of effort when the C++ code frequently and substantially \nchanges. Additionally, the python yaml parser was not able to cope with files that\nexceed a few hundred megabytes in size.\n\nTherefore, I was looking for a C++ plotting library that was extremely easy to use\nand to add into an existing codebase, preferably header-only. When I found\nnone, I decided to write one myself, which is basically a C++ wrapper around\nmatplotlib. As you can see from the above examples, plotting data and saving it\nto an image file can be done as few as two lines of code.\n\nThe general approach of providing a simple C++ API for utilizing python code\nwas later generalized and extracted into a separate, more powerful\nlibrary in another project of mine, [wrappy](http://www.github.com/lava/wrappy).\n\n\nTodo/Issues/Wishlist\n--------------------\n* This library is not thread safe. Protect all concurrent access with a mutex.\n  Sadly, this is not easy to fix since it is not caused by the library itself but\n  by the python interpreter, which is itself not thread-safe.\n\n* It would be nice to have a more object-oriented design with a Plot class which would allow\n  multiple independent plots per program.\n\n* Right now, only a small subset of matplotlibs functionality is exposed. Stuff like xlabel()/ylabel() etc. should\n  be easy to add.\n\n* If you use Anaconda on Windows, you might need to set PYTHONHOME to Anaconda home directory and QT_QPA_PLATFORM_PLUGIN_PATH to %PYTHONHOME%Library/plugins/platforms. The latter is for especially when you get the error which says 'This application failed to start because it could not find or load the Qt platform plugin \"windows\"\nin \"\".'\n\n* MacOS: `Unable to import matplotlib.pyplot`. Cause: In mac os image rendering back end of matplotlib (what-is-a-backend to render using the API of Cocoa by default). There is Qt4Agg and GTKAgg and as a back-end is not the default. Set the back end of macosx that is differ compare with other windows or linux os.\nSolution is discribed [here](https://stackoverflow.com/questions/21784641/installation-issue-with-matplotlib-python?noredirect=1&lq=1), additional information can be found there too(see links in answers).\n"
  },
  {
    "path": "components/results_processing/polyMetrics/external/matplotlib-cpp/contrib/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.7)\nproject (MatplotlibCPP_Test)\n\nset(CMAKE_CXX_STANDARD 11)\nset(CMAKE_CXX_STANDARD_REQUIRED ON)\n\ninclude_directories(${PYTHONHOME}/include)\ninclude_directories(${PYTHONHOME}/Lib/site-packages/numpy/core/include)\nlink_directories(${PYTHONHOME}/libs)\n\nadd_definitions(-DMATPLOTLIBCPP_PYTHON_HEADER=Python.h)\n\n# message(STATUS \"*** dump start cmake variables ***\")\n# get_cmake_property(_variableNames VARIABLES)\n# foreach(_variableName ${_variableNames})\n#         message(STATUS \"${_variableName}=${${_variableName}}\")\n# endforeach()\n# message(STATUS \"*** dump end ***\")\n\nadd_executable(minimal ${CMAKE_CURRENT_SOURCE_DIR}/../examples/minimal.cpp)\nadd_executable(basic ${CMAKE_CURRENT_SOURCE_DIR}/../examples/basic.cpp)\nadd_executable(modern ${CMAKE_CURRENT_SOURCE_DIR}/../examples/modern.cpp)\nadd_executable(animation ${CMAKE_CURRENT_SOURCE_DIR}/../examples/animation.cpp)\nadd_executable(nonblock ${CMAKE_CURRENT_SOURCE_DIR}/../examples/nonblock.cpp)\nadd_executable(xkcd ${CMAKE_CURRENT_SOURCE_DIR}/../examples/xkcd.cpp)\nadd_executable(bar ${CMAKE_CURRENT_SOURCE_DIR}/../examples/bar.cpp)\n"
  },
  {
    "path": "components/results_processing/polyMetrics/external/matplotlib-cpp/contrib/README.md",
    "content": "# contrib/\n\nThis folder contains contributions that may be useful to users of this library, but\nhave a too specialized audience to become part of the main tree.\n\nIn particular, things in here will have a higher rate of bit-rot, since\ncontributors are not required to and may be unable to check whether their\nchanges break any of them.\n\n## Windows support\nTested on the following environment\n* Windows 10 - 64bit\n* Anaconda 4.3 (64 bit)\n* Python 3.6.0\n* CMake 3.9.4\n* Visual Studio 2017, 2015, 2013\n\n### Configuring and Building Samples\n1. Edit WinBuild.cmd for your environment(Line:5-7)\n    if NOT DEFINED MSVC_VERSION set MSVC_VERSION=[Your Visual Studio Version(12, 14, 15)]\n    if NOT DEFINED CMAKE_CONFIG set CMAKE_CONFIG=Release\n    if NOT DEFINED PYTHONHOME   set PYTHONHOME=[Your Python Path]\n\n2. Run WinBuild.cmd to build\n```cmd\n> cd contrib\n> WinBuild.cmd\n```\nThe `WinBuild.cmd` will set up temporal ENV variables and build binaries in (matplotlib root)/examples with the Release configuration.\n\n3. Find exe files in examples/build/Release\nNote: platforms folder is necessary to make qt works.\n"
  },
  {
    "path": "components/results_processing/polyMetrics/external/matplotlib-cpp/examples/.gitignore",
    "content": "animation\nbar\nbasic\nfill\nfill_inbetween\nimshow\nminimal\nmodern\nnonblock\nquiver\nsubplot\nsurface\nupdate\nxkcd\n"
  },
  {
    "path": "components/results_processing/polyMetrics/external/matplotlib-cpp/examples/animation.cpp",
    "content": "#define _USE_MATH_DEFINES\n#include <cmath>\n#include \"../matplotlibcpp.h\"\n\nnamespace plt = matplotlibcpp;\n\nint main()\n{\n\tint n = 1000;\n\tstd::vector<double> x, y, z;\n\n\tfor(int i=0; i<n; i++) {\n\t\tx.push_back(i*i);\n\t\ty.push_back(sin(2*M_PI*i/360.0));\n\t\tz.push_back(log(i));\n\n\t\tif (i % 10 == 0) {\n\t\t\t// Clear previous plot\n\t\t\tplt::clf();\n\t\t\t// Plot line from given x and y data. Color is selected automatically.\n\t\t\tplt::plot(x, y);\n\t\t\t// Plot a line whose name will show up as \"log(x)\" in the legend.\n\t\t\tplt::named_plot(\"log(x)\", x, z);\n\n\t\t\t// Set x-axis to interval [0,1000000]\n\t\t\tplt::xlim(0, n*n);\n\n\t\t\t// Add graph title\n\t\t\tplt::title(\"Sample figure\");\n\t\t\t// Enable legend.\n\t\t\tplt::legend();\n\t\t\t// Display plot continuously\n\t\t\tplt::pause(0.01);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "components/results_processing/polyMetrics/external/matplotlib-cpp/examples/bar.cpp",
    "content": "#define _USE_MATH_DEFINES\n\n#include <iostream>\n#include <string>\n#include \"../matplotlibcpp.h\"\nnamespace plt = matplotlibcpp;\n\nint main(int argc, char **argv) {\n    std::vector<int> test_data;\n    for (int i = 0; i < 20; i++) {\n        test_data.push_back(i);\n    }\n\n    plt::bar(test_data);\n    plt::show();\n\n    return (0);\n}\n"
  },
  {
    "path": "components/results_processing/polyMetrics/external/matplotlib-cpp/examples/basic.cpp",
    "content": "#define _USE_MATH_DEFINES\n#include <iostream>\n#include <cmath>\n#include \"../matplotlibcpp.h\"\n\nnamespace plt = matplotlibcpp;\n\nint main() \n{\n    // Prepare data.\n    int n = 5000;\n    std::vector<double> x(n), y(n), z(n), w(n,2);\n    for(int i=0; i<n; ++i) {\n        x.at(i) = i*i;\n        y.at(i) = sin(2*M_PI*i/360.0);\n        z.at(i) = log(i);\n    }\n    \n    // Set the size of output image = 1200x780 pixels\n    plt::figure_size(1200, 780);\n\n    // Plot line from given x and y data. Color is selected automatically.\n    plt::plot(x, y);\n\n    // Plot a red dashed line from given x and y data.\n    plt::plot(x, w,\"r--\");\n\n    // Plot a line whose name will show up as \"log(x)\" in the legend.\n    plt::named_plot(\"log(x)\", x, z);\n\n    // Set x-axis to interval [0,1000000]\n    plt::xlim(0, 1000*1000);\n\n    // Add graph title\n    plt::title(\"Sample figure\");\n\n    // Enable legend.\n    plt::legend();\n\n    // save figure\n    const char* filename = \"./basic.png\";\n    std::cout << \"Saving result to \" << filename << std::endl;;\n    plt::save(filename);\n}\n"
  },
  {
    "path": "components/results_processing/polyMetrics/external/matplotlib-cpp/examples/fill.cpp",
    "content": "#define _USE_MATH_DEFINES\n#include \"../matplotlibcpp.h\"\n#include <cmath>\n\nusing namespace std;\nnamespace plt = matplotlibcpp;\n\n// Example fill plot taken from:\n// https://matplotlib.org/gallery/misc/fill_spiral.html\nint main() {\n    // Prepare data.\n    vector<double> theta;\n    for (double d = 0; d < 8 * M_PI; d += 0.1)\n        theta.push_back(d);\n\n    const int a = 1;\n    const double b = 0.2;\n\n    for (double dt = 0; dt < 2 * M_PI; dt += M_PI/2.0) {\n        vector<double> x1, y1, x2, y2;\n        for (double th : theta) {\n            x1.push_back( a*cos(th + dt) * exp(b*th) );\n            y1.push_back( a*sin(th + dt) * exp(b*th) );\n\n            x2.push_back( a*cos(th + dt + M_PI/4.0) * exp(b*th) );\n            y2.push_back( a*sin(th + dt + M_PI/4.0) * exp(b*th) );\n        }\n\n        x1.insert(x1.end(), x2.rbegin(), x2.rend());\n        y1.insert(y1.end(), y2.rbegin(), y2.rend());\n\n        plt::fill(x1, y1, {});\n    }\n    plt::show();\n}\n"
  },
  {
    "path": "components/results_processing/polyMetrics/external/matplotlib-cpp/examples/fill_inbetween.cpp",
    "content": "#define _USE_MATH_DEFINES\n#include \"../matplotlibcpp.h\"\n#include <cmath>\n#include <iostream>\n\nusing namespace std;\nnamespace plt = matplotlibcpp;\n\nint main() {\n  // Prepare data.\n  int n = 5000;\n  std::vector<double> x(n), y(n), z(n), w(n, 2);\n  for (int i = 0; i < n; ++i) {\n    x.at(i) = i * i;\n    y.at(i) = sin(2 * M_PI * i / 360.0);\n    z.at(i) = log(i);\n  }\n\n  // Prepare keywords to pass to PolyCollection. See\n  // https://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.fill_between.html\n  std::map<string, string> keywords;\n  keywords[\"alpha\"] = \"0.4\";\n  keywords[\"color\"] = \"grey\";\n  keywords[\"hatch\"] = \"-\";\n\n  plt::fill_between(x, y, z, keywords);\n  plt::show();\n}\n"
  },
  {
    "path": "components/results_processing/polyMetrics/external/matplotlib-cpp/examples/imshow.cpp",
    "content": "#define _USE_MATH_DEFINES\n#include <cmath>\n#include <iostream>\n#include \"../matplotlibcpp.h\"\n\nusing namespace std;\nnamespace plt = matplotlibcpp;\n\nint main()\n{\n    // Prepare data\n    int ncols = 500, nrows = 300;\n    std::vector<float> z(ncols * nrows);\n    for (int j=0; j<nrows; ++j) {\n        for (int i=0; i<ncols; ++i) {\n            z.at(ncols * j + i) = std::sin(std::hypot(i - ncols/2, j - nrows/2));\n        }\n    }\n\n    const float* zptr = &(z[0]);\n    const int colors = 1;\n\n    plt::title(\"My matrix\");\n    plt::imshow(zptr, nrows, ncols, colors);\n\n    // Show plots\n    plt::save(\"imshow.png\");\n    std::cout << \"Result saved to 'imshow.png'.\\n\";\n}\n"
  },
  {
    "path": "components/results_processing/polyMetrics/external/matplotlib-cpp/examples/minimal.cpp",
    "content": "#include \"../matplotlibcpp.h\"\n\nnamespace plt = matplotlibcpp;\n\nint main() {\n    plt::plot({1,3,2,4});\n    plt::show();\n}\n"
  },
  {
    "path": "components/results_processing/polyMetrics/external/matplotlib-cpp/examples/modern.cpp",
    "content": "#define _USE_MATH_DEFINES\n#include <cmath>\n#include \"../matplotlibcpp.h\"\n\nusing namespace std;\nnamespace plt = matplotlibcpp;\n\nint main() \n{\n\t// plot(y) - the x-coordinates are implicitly set to [0,1,...,n)\n\t//plt::plot({1,2,3,4}); \n\t\n\t// Prepare data for parametric plot.\n\tint n = 5000; // number of data points\n\tvector<double> x(n),y(n); \n\tfor(int i=0; i<n; ++i) {\n\t\tdouble t = 2*M_PI*i/n;\n\t\tx.at(i) = 16*sin(t)*sin(t)*sin(t);\n\t\ty.at(i) = 13*cos(t) - 5*cos(2*t) - 2*cos(3*t) - cos(4*t);\n\t}\n\n\t// plot() takes an arbitrary number of (x,y,format)-triples. \n\t// x must be iterable (that is, anything providing begin(x) and end(x)),\n\t// y must either be callable (providing operator() const) or iterable. \n\tplt::plot(x, y, \"r-\", x, [](double d) { return 12.5+abs(sin(d)); }, \"k-\");\n\n\n\t// show plots\n\tplt::show();\n}\n"
  },
  {
    "path": "components/results_processing/polyMetrics/external/matplotlib-cpp/examples/nonblock.cpp",
    "content": "#define _USE_MATH_DEFINES\n#include <cmath>\n#include \"../matplotlibcpp.h\"\n\nnamespace plt = matplotlibcpp;\n\n\nusing namespace matplotlibcpp;\nusing namespace std;\n\nint main()\n{\n    // Prepare data.\n    int n = 5000;\n    std::vector<double> x(n), y(n), z(n), w(n,2);\n    for(int i=0; i<n; ++i) {\n        x.at(i) = i*i;\n        y.at(i) = sin(2*M_PI*i/360.0);\n        z.at(i) = log(i);\n    }\n\n    // Plot line from given x and y data. Color is selected automatically.\n    plt::subplot(2,2,1);\n    plt::plot(x, y);\n\n    // Plot a red dashed line from given x and y data.\n    plt::subplot(2,2,2);\n    plt::plot(x, w,\"r--\");\n\n    // Plot a line whose name will show up as \"log(x)\" in the legend.\n    plt::subplot(2,2,3);\n    plt::named_plot(\"log(x)\", x, z);\n\n    // Set x-axis to interval [0,1000000]\n    plt::xlim(0, 1000*1000);\n\n    // Add graph title\n    plt::title(\"Sample figure\");\n    // Enable legend.\n    plt::legend();\n\n    plt::show(false);\n\n    cout << \"matplotlibcpp::show() is working in an non-blocking mode\" << endl;\n    getchar();\n}\n"
  },
  {
    "path": "components/results_processing/polyMetrics/external/matplotlib-cpp/examples/quiver.cpp",
    "content": "#include \"../matplotlibcpp.h\"\n\nnamespace plt = matplotlibcpp;\n\nint main()\n{\n    // u and v are respectively the x and y components of the arrows we're plotting\n    std::vector<int> x, y, u, v;\n    for (int i = -5; i <= 5; i++) {\n        for (int j = -5; j <= 5; j++) {\n            x.push_back(i);\n            u.push_back(-i);\n            y.push_back(j);\n            v.push_back(-j);\n        }\n    }\n\n    plt::quiver(x, y, u, v);\n    plt::show();\n}"
  },
  {
    "path": "components/results_processing/polyMetrics/external/matplotlib-cpp/examples/subplot.cpp",
    "content": "#define _USE_MATH_DEFINES\n#include <cmath>\n#include \"../matplotlibcpp.h\"\n\nusing namespace std;\nnamespace plt = matplotlibcpp;\n\nint main() \n{\n    // Prepare data\n\tint n = 500;\n\tstd::vector<double> x(n), y(n), z(n), w(n,2);\n\tfor(int i=0; i<n; ++i) {\n\t\tx.at(i) = i;\n\t\ty.at(i) = sin(2*M_PI*i/360.0);\n\t\tz.at(i) = 100.0 / i;\n\t}\n\n    // Set the \"super title\"\n    plt::suptitle(\"My plot\");\n    plt::subplot(1, 2, 1);\n\tplt::plot(x, y, \"r-\");\n    plt::subplot(1, 2, 2);\n    plt::plot(x, z, \"k-\");\n    // Add some text to the plot\n    plt::text(100, 90, \"Hello!\");\n\n\n\t// Show plots\n\tplt::show();\n}\n"
  },
  {
    "path": "components/results_processing/polyMetrics/external/matplotlib-cpp/examples/subplot2grid.cpp",
    "content": "#define _USE_MATH_DEFINES\n#include <cmath>\n#include \"../matplotlibcpp.h\"\n\nusing namespace std;\nnamespace plt = matplotlibcpp;\n\nint main()\n{\n    // Prepare data\n\tint n = 500;\n\tstd::vector<double> x(n), u(n), v(n), w(n);\n\tfor(int i=0; i<n; ++i) {\n\t\tx.at(i) = i;\n\t\tu.at(i) = sin(2*M_PI*i/500.0);\n\t\tv.at(i) = 100.0 / i;\n\t\tw.at(i) = sin(2*M_PI*i/1000.0);\n\t}\n\n    // Set the \"super title\"\n    plt::suptitle(\"My plot\");\n\n    const long nrows=3, ncols=3;\n    long row = 2, col = 2;\n\n    plt::subplot2grid(nrows, ncols, row, col);\n\tplt::plot(x, w, \"g-\");\n\n    long spanr = 1, spanc = 2;\n    col = 0;\n    plt::subplot2grid(nrows, ncols, row, col, spanr, spanc);\n\tplt::plot(x, v, \"r-\");\n\n    spanr = 2, spanc = 3;\n    row = 0, col = 0;\n    plt::subplot2grid(nrows, ncols, row, col, spanr, spanc);\n    plt::plot(x, u, \"b-\");\n    // Add some text to the plot\n    plt::text(100., -0.5, \"Hello!\");\n\n\n    // Show plots\n\tplt::show();\n}\n"
  },
  {
    "path": "components/results_processing/polyMetrics/external/matplotlib-cpp/examples/surface.cpp",
    "content": "#include \"../matplotlibcpp.h\"\n\n#include <cmath>\n\nnamespace plt = matplotlibcpp;\n\nint main()\n{\n    std::vector<std::vector<double>> x, y, z;\n    for (double i = -5; i <= 5;  i += 0.25) {\n        std::vector<double> x_row, y_row, z_row;\n        for (double j = -5; j <= 5; j += 0.25) {\n            x_row.push_back(i);\n            y_row.push_back(j);\n            z_row.push_back(::std::sin(::std::hypot(i, j)));\n        }\n        x.push_back(x_row);\n        y.push_back(y_row);\n        z.push_back(z_row);\n    }\n\n    plt::plot_surface(x, y, z);\n    plt::show();\n}\n"
  },
  {
    "path": "components/results_processing/polyMetrics/external/matplotlib-cpp/examples/update.cpp",
    "content": "#define _USE_MATH_DEFINES\n#include <cmath>\n#include \"../matplotlibcpp.h\"\n#include <chrono>\n\nnamespace plt = matplotlibcpp;\n\nvoid update_window(const double x, const double y, const double t,\n                   std::vector<double> &xt, std::vector<double> &yt)\n{\n    const double target_length = 300;\n    const double half_win = (target_length/(2.*sqrt(1.+t*t)));\n\n    xt[0] = x - half_win;\n    xt[1] = x + half_win;\n    yt[0] = y - half_win*t;\n    yt[1] = y + half_win*t;\n}\n\n\nint main()\n{\n    size_t n = 1000;\n    std::vector<double> x, y;\n\n    const double w = 0.05;\n    const double a = n/2;\n\n    for (size_t i=0; i<n; i++) {\n        x.push_back(i);\n        y.push_back(a*sin(w*i));\n    }\n\n    std::vector<double> xt(2), yt(2);\n\n    plt::title(\"Tangent of a sine curve\");\n    plt::xlim(x.front(), x.back());\n    plt::ylim(-a, a);\n    plt::axis(\"equal\");\n\n    // Plot sin once and for all.\n    plt::named_plot(\"sin\", x, y);\n\n    // Prepare plotting the tangent.\n    plt::Plot plot(\"tangent\");\n\n    plt::legend();\n\n    for (size_t i=0; i<n; i++) {\n        if (i % 10 == 0) {\n            update_window(x[i], y[i], a*w*cos(w*x[i]), xt, yt);\n\n            // Just update data for this plot.\n            plot.update(xt, yt);\n\n            // Small pause so the viewer has a chance to enjoy the animation.\n            plt::pause(0.1);\n        }\n   }\n}\n"
  },
  {
    "path": "components/results_processing/polyMetrics/external/matplotlib-cpp/examples/xkcd.cpp",
    "content": "#define _USE_MATH_DEFINES\n#include <cmath>\n#include \"../matplotlibcpp.h\"\n#include <vector>\n\nnamespace plt = matplotlibcpp;\n\nint main() {\n    std::vector<double> t(1000);\n    std::vector<double> x(t.size());\n\n    for(size_t i = 0; i < t.size(); i++) {\n        t[i] = i / 100.0;\n        x[i] = sin(2.0 * M_PI * 1.0 * t[i]);\n    }\n\n    plt::xkcd();\n    plt::plot(t, x);\n    plt::title(\"AN ORDINARY SIN WAVE\");\n    plt::show();\n}\n\n"
  },
  {
    "path": "components/results_processing/polyMetrics/external/matplotlib-cpp/matplotlibcpp.h",
    "content": "#pragma once\n\n#include <vector>\n#include <map>\n#include <array>\n#include <numeric>\n#include <algorithm>\n#include <stdexcept>\n#include <iostream>\n#include <cstdint> // <cstdint> requires c++11 support\n#include <functional>\n#include <unordered_map>\n\n#include <Python.h>\n\n#ifndef WITHOUT_NUMPY\n#  define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION\n#  include <numpy/arrayobject.h>\n\n#  ifdef WITH_OPENCV\n#    include <opencv2/opencv.hpp>\n#  endif // WITH_OPENCV\n\n/*\n * A bunch of constants were removed in OpenCV 4 in favour of enum classes, so\n * define the ones we need here.\n */\n#  if CV_MAJOR_VERSION > 3\n#    define CV_BGR2RGB cv::COLOR_BGR2RGB\n#    define CV_BGRA2RGBA cv::COLOR_BGRA2RGBA\n#  endif\n#endif // WITHOUT_NUMPY\n\n#if PY_MAJOR_VERSION >= 3\n#  define PyString_FromString PyUnicode_FromString\n#  define PyInt_FromLong PyLong_FromLong\n#  define PyString_FromString PyUnicode_FromString\n#endif\n\n\nnamespace matplotlibcpp {\nnamespace detail {\n\nstatic std::string s_backend;\n\nstruct _interpreter {\n    PyObject *s_python_function_show;\n    PyObject *s_python_function_close;\n    PyObject *s_python_function_draw;\n    PyObject *s_python_function_pause;\n    PyObject *s_python_function_save;\n    PyObject *s_python_function_figure;\n    PyObject *s_python_function_fignum_exists;\n    PyObject *s_python_function_plot;\n    PyObject *s_python_function_quiver;\n    PyObject *s_python_function_semilogx;\n    PyObject *s_python_function_semilogy;\n    PyObject *s_python_function_loglog;\n    PyObject *s_python_function_fill;\n    PyObject *s_python_function_fill_between;\n    PyObject *s_python_function_hist;\n    PyObject *s_python_function_imshow;\n    PyObject *s_python_function_scatter;\n    PyObject *s_python_function_subplot;\n    PyObject *s_python_function_subplot2grid;\n    PyObject *s_python_function_legend;\n    PyObject *s_python_function_xlim;\n    PyObject *s_python_function_ion;\n    PyObject *s_python_function_ginput;\n    PyObject *s_python_function_ylim;\n    PyObject *s_python_function_title;\n    PyObject *s_python_function_axis;\n    PyObject *s_python_function_xlabel;\n    PyObject *s_python_function_ylabel;\n    PyObject *s_python_function_xticks;\n    PyObject *s_python_function_yticks;\n    PyObject *s_python_function_tick_params;\n    PyObject *s_python_function_grid;\n    PyObject *s_python_function_clf;\n    PyObject *s_python_function_errorbar;\n    PyObject *s_python_function_annotate;\n    PyObject *s_python_function_tight_layout;\n    PyObject *s_python_colormap;\n    PyObject *s_python_empty_tuple;\n    PyObject *s_python_function_stem;\n    PyObject *s_python_function_xkcd;\n    PyObject *s_python_function_text;\n    PyObject *s_python_function_suptitle;\n    PyObject *s_python_function_bar;\n    PyObject *s_python_function_subplots_adjust;\n\n\n    /* For now, _interpreter is implemented as a singleton since its currently not possible to have\n       multiple independent embedded python interpreters without patching the python source code\n       or starting a separate process for each.\n        http://bytes.com/topic/python/answers/793370-multiple-independent-python-interpreters-c-c-program\n       */\n\n    static _interpreter& get() {\n        static _interpreter ctx;\n        return ctx;\n    }\n\n    PyObject* safe_import(PyObject* module, std::string fname) {\n        PyObject* fn = PyObject_GetAttrString(module, fname.c_str());\n\n        if (!fn)\n            throw std::runtime_error(std::string(\"Couldn't find required function: \") + fname);\n\n        if (!PyFunction_Check(fn))\n            throw std::runtime_error(fname + std::string(\" is unexpectedly not a PyFunction.\"));\n\n        return fn;\n    }\n\nprivate:\n\n#ifndef WITHOUT_NUMPY\n#  if PY_MAJOR_VERSION >= 3\n\n    void *import_numpy() {\n        import_array(); // initialize C-API\n        return NULL;\n    }\n\n#  else\n\n    void import_numpy() {\n        import_array(); // initialize C-API\n    }\n\n#  endif\n#endif\n\n    _interpreter() {\n\n        // optional but recommended\n#if PY_MAJOR_VERSION >= 3\n        wchar_t name[] = L\"plotting\";\n#else\n        char name[] = \"plotting\";\n#endif\n        Py_SetProgramName(name);\n        Py_Initialize();\n\n#ifndef WITHOUT_NUMPY\n        import_numpy(); // initialize numpy C-API\n#endif\n\n        PyObject* matplotlibname = PyString_FromString(\"matplotlib\");\n        PyObject* pyplotname = PyString_FromString(\"matplotlib.pyplot\");\n        PyObject* cmname  = PyString_FromString(\"matplotlib.cm\");\n        PyObject* pylabname  = PyString_FromString(\"pylab\");\n        if (!pyplotname || !pylabname || !matplotlibname || !cmname) {\n            throw std::runtime_error(\"couldnt create string\");\n        }\n\n        PyObject* matplotlib = PyImport_Import(matplotlibname);\n        Py_DECREF(matplotlibname);\n        if (!matplotlib) {\n            PyErr_Print();\n            throw std::runtime_error(\"Error loading module matplotlib!\");\n        }\n\n        // matplotlib.use() must be called *before* pylab, matplotlib.pyplot,\n        // or matplotlib.backends is imported for the first time\n        if (!s_backend.empty()) {\n            PyObject_CallMethod(matplotlib, const_cast<char*>(\"use\"), const_cast<char*>(\"s\"), s_backend.c_str());\n        }\n\n        PyObject* pymod = PyImport_Import(pyplotname);\n        Py_DECREF(pyplotname);\n        if (!pymod) { throw std::runtime_error(\"Error loading module matplotlib.pyplot!\"); }\n\n        s_python_colormap = PyImport_Import(cmname);\n        Py_DECREF(cmname);\n        if (!s_python_colormap) { throw std::runtime_error(\"Error loading module matplotlib.cm!\"); }\n\n        PyObject* pylabmod = PyImport_Import(pylabname);\n        Py_DECREF(pylabname);\n        if (!pylabmod) { throw std::runtime_error(\"Error loading module pylab!\"); }\n\n        s_python_function_show = safe_import(pymod, \"show\");\n        s_python_function_close = safe_import(pymod, \"close\");\n        s_python_function_draw = safe_import(pymod, \"draw\");\n        s_python_function_pause = safe_import(pymod, \"pause\");\n        s_python_function_figure = safe_import(pymod, \"figure\");\n        s_python_function_fignum_exists = safe_import(pymod, \"fignum_exists\");\n        s_python_function_plot = safe_import(pymod, \"plot\");\n        s_python_function_quiver = safe_import(pymod, \"quiver\");\n        s_python_function_semilogx = safe_import(pymod, \"semilogx\");\n        s_python_function_semilogy = safe_import(pymod, \"semilogy\");\n        s_python_function_loglog = safe_import(pymod, \"loglog\");\n        s_python_function_fill = safe_import(pymod, \"fill\");\n        s_python_function_fill_between = safe_import(pymod, \"fill_between\");\n        s_python_function_hist = safe_import(pymod,\"hist\");\n        s_python_function_scatter = safe_import(pymod,\"scatter\");\n        s_python_function_subplot = safe_import(pymod, \"subplot\");\n        s_python_function_subplot2grid = safe_import(pymod, \"subplot2grid\");\n        s_python_function_legend = safe_import(pymod, \"legend\");\n        s_python_function_ylim = safe_import(pymod, \"ylim\");\n        s_python_function_title = safe_import(pymod, \"title\");\n        s_python_function_axis = safe_import(pymod, \"axis\");\n        s_python_function_xlabel = safe_import(pymod, \"xlabel\");\n        s_python_function_ylabel = safe_import(pymod, \"ylabel\");\n        s_python_function_xticks = safe_import(pymod, \"xticks\");\n        s_python_function_yticks = safe_import(pymod, \"yticks\");\n    \ts_python_function_tick_params = safe_import(pymod, \"tick_params\");\n        s_python_function_grid = safe_import(pymod, \"grid\");\n        s_python_function_xlim = safe_import(pymod, \"xlim\");\n        s_python_function_ion = safe_import(pymod, \"ion\");\n        s_python_function_ginput = safe_import(pymod, \"ginput\");\n        s_python_function_save = safe_import(pylabmod, \"savefig\");\n        s_python_function_annotate = safe_import(pymod,\"annotate\");\n        s_python_function_clf = safe_import(pymod, \"clf\");\n        s_python_function_errorbar = safe_import(pymod, \"errorbar\");\n        s_python_function_tight_layout = safe_import(pymod, \"tight_layout\");\n        s_python_function_stem = safe_import(pymod, \"stem\");\n        s_python_function_xkcd = safe_import(pymod, \"xkcd\");\n        s_python_function_text = safe_import(pymod, \"text\");\n        s_python_function_suptitle = safe_import(pymod, \"suptitle\");\n        s_python_function_bar = safe_import(pymod,\"bar\");\n        s_python_function_subplots_adjust = safe_import(pymod,\"subplots_adjust\");\n#ifndef WITHOUT_NUMPY\n        s_python_function_imshow = safe_import(pymod, \"imshow\");\n#endif\n\n        s_python_empty_tuple = PyTuple_New(0);\n    }\n\n    ~_interpreter() {\n        Py_Finalize();\n    }\n};\n\n} // end namespace detail\n\n// must be called before the first regular call to matplotlib to have any effect\ninline void backend(const std::string& name)\n{\n    detail::s_backend = name;\n}\n\ninline bool annotate(std::string annotation, double x, double y)\n{\n    PyObject * xy = PyTuple_New(2);\n    PyObject * str = PyString_FromString(annotation.c_str());\n\n    PyTuple_SetItem(xy,0,PyFloat_FromDouble(x));\n    PyTuple_SetItem(xy,1,PyFloat_FromDouble(y));\n\n    PyObject* kwargs = PyDict_New();\n    PyDict_SetItemString(kwargs, \"xy\", xy);\n\n    PyObject* args = PyTuple_New(1);\n    PyTuple_SetItem(args, 0, str);\n\n    PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_annotate, args, kwargs);\n\n    Py_DECREF(args);\n    Py_DECREF(kwargs);\n\n    if(res) Py_DECREF(res);\n\n    return res;\n}\n\n#ifndef WITHOUT_NUMPY\n// Type selector for numpy array conversion\ntemplate <typename T> struct select_npy_type { const static NPY_TYPES type = NPY_NOTYPE; }; //Default\ntemplate <> struct select_npy_type<double> { const static NPY_TYPES type = NPY_DOUBLE; };\ntemplate <> struct select_npy_type<float> { const static NPY_TYPES type = NPY_FLOAT; };\ntemplate <> struct select_npy_type<bool> { const static NPY_TYPES type = NPY_BOOL; };\ntemplate <> struct select_npy_type<int8_t> { const static NPY_TYPES type = NPY_INT8; };\ntemplate <> struct select_npy_type<int16_t> { const static NPY_TYPES type = NPY_SHORT; };\ntemplate <> struct select_npy_type<int32_t> { const static NPY_TYPES type = NPY_INT; };\ntemplate <> struct select_npy_type<int64_t> { const static NPY_TYPES type = NPY_INT64; };\ntemplate <> struct select_npy_type<uint8_t> { const static NPY_TYPES type = NPY_UINT8; };\ntemplate <> struct select_npy_type<uint16_t> { const static NPY_TYPES type = NPY_USHORT; };\ntemplate <> struct select_npy_type<uint32_t> { const static NPY_TYPES type = NPY_ULONG; };\ntemplate <> struct select_npy_type<uint64_t> { const static NPY_TYPES type = NPY_UINT64; };\n\ntemplate<typename Numeric>\nPyObject* get_array(const std::vector<Numeric>& v)\n{\n    detail::_interpreter::get();    //interpreter needs to be initialized for the numpy commands to work\n    NPY_TYPES type = select_npy_type<Numeric>::type;\n    if (type == NPY_NOTYPE)\n    {\n        std::vector<double> vd(v.size());\n        npy_intp vsize = v.size();\n        std::copy(v.begin(),v.end(),vd.begin());\n        PyObject* varray = PyArray_SimpleNewFromData(1, &vsize, NPY_DOUBLE, (void*)(vd.data()));\n        return varray;\n    }\n\n    npy_intp vsize = v.size();\n    PyObject* varray = PyArray_SimpleNewFromData(1, &vsize, type, (void*)(v.data()));\n    return varray;\n}\n\ntemplate<typename Numeric>\nPyObject* get_2darray(const std::vector<::std::vector<Numeric>>& v)\n{\n    detail::_interpreter::get();    //interpreter needs to be initialized for the numpy commands to work\n    if (v.size() < 1) throw std::runtime_error(\"get_2d_array v too small\");\n\n    npy_intp vsize[2] = {static_cast<npy_intp>(v.size()),\n                         static_cast<npy_intp>(v[0].size())};\n\n    PyArrayObject *varray =\n        (PyArrayObject *)PyArray_SimpleNew(2, vsize, NPY_DOUBLE);\n\n    double *vd_begin = static_cast<double *>(PyArray_DATA(varray));\n\n    for (const ::std::vector<Numeric> &v_row : v) {\n      if (v_row.size() != static_cast<size_t>(vsize[1]))\n        throw std::runtime_error(\"Missmatched array size\");\n      std::copy(v_row.begin(), v_row.end(), vd_begin);\n      vd_begin += vsize[1];\n    }\n\n    return reinterpret_cast<PyObject *>(varray);\n}\n\n#else // fallback if we don't have numpy: copy every element of the given vector\n\ntemplate<typename Numeric>\nPyObject* get_array(const std::vector<Numeric>& v)\n{\n    PyObject* list = PyList_New(v.size());\n    for(size_t i = 0; i < v.size(); ++i) {\n        PyList_SetItem(list, i, PyFloat_FromDouble(v.at(i)));\n    }\n    return list;\n}\n\n#endif // WITHOUT_NUMPY\n\ntemplate<typename Numeric>\nbool plot(const std::vector<Numeric> &x, const std::vector<Numeric> &y, const std::map<std::string, std::string>& keywords)\n{\n    assert(x.size() == y.size());\n\n    // using numpy arrays\n    PyObject* xarray = get_array(x);\n    PyObject* yarray = get_array(y);\n\n    // construct positional args\n    PyObject* args = PyTuple_New(2);\n    PyTuple_SetItem(args, 0, xarray);\n    PyTuple_SetItem(args, 1, yarray);\n\n    // construct keyword args\n    PyObject* kwargs = PyDict_New();\n    for(std::map<std::string, std::string>::const_iterator it = keywords.begin(); it != keywords.end(); ++it)\n    {\n        PyDict_SetItemString(kwargs, it->first.c_str(), PyString_FromString(it->second.c_str()));\n    }\n\n    PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_plot, args, kwargs);\n\n    Py_DECREF(args);\n    Py_DECREF(kwargs);\n    if(res) Py_DECREF(res);\n\n    return res;\n}\n\n// TODO - it should be possible to make this work by implementing\n// a non-numpy alternative for `get_2darray()`.\n#ifndef WITHOUT_NUMPY\ntemplate <typename Numeric>\nvoid plot_surface(const std::vector<::std::vector<Numeric>> &x,\n                  const std::vector<::std::vector<Numeric>> &y,\n                  const std::vector<::std::vector<Numeric>> &z,\n                  const std::map<std::string, std::string> &keywords =\n                      std::map<std::string, std::string>())\n{\n  // We lazily load the modules here the first time this function is called\n  // because I'm not sure that we can assume \"matplotlib installed\" implies\n  // \"mpl_toolkits installed\" on all platforms, and we don't want to require\n  // it for people who don't need 3d plots.\n  static PyObject *mpl_toolkitsmod = nullptr, *axis3dmod = nullptr;\n  if (!mpl_toolkitsmod) {\n    detail::_interpreter::get();\n\n    PyObject* mpl_toolkits = PyString_FromString(\"mpl_toolkits\");\n    PyObject* axis3d = PyString_FromString(\"mpl_toolkits.mplot3d\");\n    if (!mpl_toolkits || !axis3d) { throw std::runtime_error(\"couldnt create string\"); }\n\n    mpl_toolkitsmod = PyImport_Import(mpl_toolkits);\n    Py_DECREF(mpl_toolkits);\n    if (!mpl_toolkitsmod) { throw std::runtime_error(\"Error loading module mpl_toolkits!\"); }\n\n    axis3dmod = PyImport_Import(axis3d);\n    Py_DECREF(axis3d);\n    if (!axis3dmod) { throw std::runtime_error(\"Error loading module mpl_toolkits.mplot3d!\"); }\n  }\n\n  assert(x.size() == y.size());\n  assert(y.size() == z.size());\n\n  // using numpy arrays\n  PyObject *xarray = get_2darray(x);\n  PyObject *yarray = get_2darray(y);\n  PyObject *zarray = get_2darray(z);\n\n  // construct positional args\n  PyObject *args = PyTuple_New(3);\n  PyTuple_SetItem(args, 0, xarray);\n  PyTuple_SetItem(args, 1, yarray);\n  PyTuple_SetItem(args, 2, zarray);\n\n  // Build up the kw args.\n  PyObject *kwargs = PyDict_New();\n  PyDict_SetItemString(kwargs, \"rstride\", PyInt_FromLong(1));\n  PyDict_SetItemString(kwargs, \"cstride\", PyInt_FromLong(1));\n\n  PyObject *python_colormap_coolwarm = PyObject_GetAttrString(\n      detail::_interpreter::get().s_python_colormap, \"coolwarm\");\n\n  PyDict_SetItemString(kwargs, \"cmap\", python_colormap_coolwarm);\n\n  for (std::map<std::string, std::string>::const_iterator it = keywords.begin();\n       it != keywords.end(); ++it) {\n    PyDict_SetItemString(kwargs, it->first.c_str(),\n                         PyString_FromString(it->second.c_str()));\n  }\n\n\n  PyObject *fig =\n      PyObject_CallObject(detail::_interpreter::get().s_python_function_figure,\n                          detail::_interpreter::get().s_python_empty_tuple);\n  if (!fig) throw std::runtime_error(\"Call to figure() failed.\");\n\n  PyObject *gca_kwargs = PyDict_New();\n  PyDict_SetItemString(gca_kwargs, \"projection\", PyString_FromString(\"3d\"));\n\n  PyObject *gca = PyObject_GetAttrString(fig, \"gca\");\n  if (!gca) throw std::runtime_error(\"No gca\");\n  Py_INCREF(gca);\n  PyObject *axis = PyObject_Call(\n      gca, detail::_interpreter::get().s_python_empty_tuple, gca_kwargs);\n\n  if (!axis) throw std::runtime_error(\"No axis\");\n  Py_INCREF(axis);\n\n  Py_DECREF(gca);\n  Py_DECREF(gca_kwargs);\n\n  PyObject *plot_surface = PyObject_GetAttrString(axis, \"plot_surface\");\n  if (!plot_surface) throw std::runtime_error(\"No surface\");\n  Py_INCREF(plot_surface);\n  PyObject *res = PyObject_Call(plot_surface, args, kwargs);\n  if (!res) throw std::runtime_error(\"failed surface\");\n  Py_DECREF(plot_surface);\n\n  Py_DECREF(axis);\n  Py_DECREF(args);\n  Py_DECREF(kwargs);\n  if (res) Py_DECREF(res);\n}\n#endif // WITHOUT_NUMPY\n\n\ntemplate<typename Numeric>\nbool stem(const std::vector<Numeric> &x, const std::vector<Numeric> &y, const std::map<std::string, std::string>& keywords)\n{\n    assert(x.size() == y.size());\n\n    // using numpy arrays\n    PyObject* xarray = get_array(x);\n    PyObject* yarray = get_array(y);\n\n    // construct positional args\n    PyObject* args = PyTuple_New(2);\n    PyTuple_SetItem(args, 0, xarray);\n    PyTuple_SetItem(args, 1, yarray);\n\n    // construct keyword args\n    PyObject* kwargs = PyDict_New();\n    for (std::map<std::string, std::string>::const_iterator it =\n            keywords.begin(); it != keywords.end(); ++it) {\n        PyDict_SetItemString(kwargs, it->first.c_str(),\n                PyString_FromString(it->second.c_str()));\n    }\n\n    PyObject* res = PyObject_Call(\n            detail::_interpreter::get().s_python_function_stem, args, kwargs);\n\n    Py_DECREF(args);\n    Py_DECREF(kwargs);\n    if (res)\n        Py_DECREF(res);\n\n    return res;\n}\n\ntemplate< typename Numeric >\nbool fill(const std::vector<Numeric>& x, const std::vector<Numeric>& y, const std::map<std::string, std::string>& keywords)\n{\n    assert(x.size() == y.size());\n\n    // using numpy arrays\n    PyObject* xarray = get_array(x);\n    PyObject* yarray = get_array(y);\n\n    // construct positional args\n    PyObject* args = PyTuple_New(2);\n    PyTuple_SetItem(args, 0, xarray);\n    PyTuple_SetItem(args, 1, yarray);\n\n    // construct keyword args\n    PyObject* kwargs = PyDict_New();\n    for (auto it = keywords.begin(); it != keywords.end(); ++it) {\n        PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str()));\n    }\n\n    PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_fill, args, kwargs);\n\n    Py_DECREF(args);\n    Py_DECREF(kwargs);\n\n    if (res) Py_DECREF(res);\n\n    return res;\n}\n\ntemplate< typename Numeric >\nbool fill_between(const std::vector<Numeric>& x, const std::vector<Numeric>& y1, const std::vector<Numeric>& y2, const std::map<std::string, std::string>& keywords)\n{\n    assert(x.size() == y1.size());\n    assert(x.size() == y2.size());\n\n    // using numpy arrays\n    PyObject* xarray = get_array(x);\n    PyObject* y1array = get_array(y1);\n    PyObject* y2array = get_array(y2);\n\n    // construct positional args\n    PyObject* args = PyTuple_New(3);\n    PyTuple_SetItem(args, 0, xarray);\n    PyTuple_SetItem(args, 1, y1array);\n    PyTuple_SetItem(args, 2, y2array);\n\n    // construct keyword args\n    PyObject* kwargs = PyDict_New();\n    for(std::map<std::string, std::string>::const_iterator it = keywords.begin(); it != keywords.end(); ++it) {\n        PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str()));\n    }\n\n    PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_fill_between, args, kwargs);\n\n    Py_DECREF(args);\n    Py_DECREF(kwargs);\n    if(res) Py_DECREF(res);\n\n    return res;\n}\n\ntemplate< typename Numeric>\nbool hist(const std::vector<Numeric>& y, long bins=10,std::string color=\"b\",\n          double alpha=1.0, bool cumulative=false)\n{\n\n    PyObject* yarray = get_array(y);\n\n    PyObject* kwargs = PyDict_New();\n    PyDict_SetItemString(kwargs, \"bins\", PyLong_FromLong(bins));\n    PyDict_SetItemString(kwargs, \"color\", PyString_FromString(color.c_str()));\n    PyDict_SetItemString(kwargs, \"alpha\", PyFloat_FromDouble(alpha));\n    PyDict_SetItemString(kwargs, \"cumulative\", cumulative ? Py_True : Py_False);\n\tPyDict_SetItemString(kwargs, \"rwidth\", PyFloat_FromDouble(.85));\n\n    PyObject* plot_args = PyTuple_New(1);\n\n    PyTuple_SetItem(plot_args, 0, yarray);\n\n\n    PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_hist, plot_args, kwargs);\n\n\n    Py_DECREF(plot_args);\n    Py_DECREF(kwargs);\n    if(res) Py_DECREF(res);\n\n    return res;\n}\n\n#ifndef WITHOUT_NUMPY\n    namespace internal {\n        inline void imshow(void *ptr, const NPY_TYPES type, const int rows, const int columns, const int colors, const std::map<std::string, std::string> &keywords)\n        {\n            assert(type == NPY_UINT8 || type == NPY_FLOAT);\n            assert(colors == 1 || colors == 3 || colors == 4);\n\n            detail::_interpreter::get();    //interpreter needs to be initialized for the numpy commands to work\n\n            // construct args\n            npy_intp dims[3] = { rows, columns, colors };\n            PyObject *args = PyTuple_New(1);\n            PyTuple_SetItem(args, 0, PyArray_SimpleNewFromData(colors == 1 ? 2 : 3, dims, type, ptr));\n\n            // construct keyword args\n            PyObject* kwargs = PyDict_New();\n            for(std::map<std::string, std::string>::const_iterator it = keywords.begin(); it != keywords.end(); ++it)\n            {\n                PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str()));\n            }\n\n            PyObject *res = PyObject_Call(detail::_interpreter::get().s_python_function_imshow, args, kwargs);\n            Py_DECREF(args);\n            Py_DECREF(kwargs);\n            if (!res)\n                throw std::runtime_error(\"Call to imshow() failed\");\n            Py_DECREF(res);\n        }\n    }\n\n    inline void imshow(const unsigned char *ptr, const int rows, const int columns, const int colors, const std::map<std::string, std::string> &keywords = {})\n    {\n        internal::imshow((void *) ptr, NPY_UINT8, rows, columns, colors, keywords);\n    }\n\n    inline void imshow(const float *ptr, const int rows, const int columns, const int colors, const std::map<std::string, std::string> &keywords = {})\n    {\n        internal::imshow((void *) ptr, NPY_FLOAT, rows, columns, colors, keywords);\n    }\n\n#ifdef WITH_OPENCV\n    void imshow(const cv::Mat &image, const std::map<std::string, std::string> &keywords = {})\n    {\n        // Convert underlying type of matrix, if needed\n        cv::Mat image2;\n        NPY_TYPES npy_type = NPY_UINT8;\n        switch (image.type() & CV_MAT_DEPTH_MASK) {\n        case CV_8U:\n            image2 = image;\n            break;\n        case CV_32F:\n            image2 = image;\n            npy_type = NPY_FLOAT;\n            break;\n        default:\n            image.convertTo(image2, CV_MAKETYPE(CV_8U, image.channels()));\n        }\n\n        // If color image, convert from BGR to RGB\n        switch (image2.channels()) {\n        case 3:\n            cv::cvtColor(image2, image2, CV_BGR2RGB);\n            break;\n        case 4:\n            cv::cvtColor(image2, image2, CV_BGRA2RGBA);\n        }\n\n        internal::imshow(image2.data, npy_type, image2.rows, image2.cols, image2.channels(), keywords);\n    }\n#endif // WITH_OPENCV\n#endif // WITHOUT_NUMPY\n\ntemplate<typename NumericX, typename NumericY>\nbool scatter(const std::vector<NumericX>& x,\n             const std::vector<NumericY>& y,\n             const double s=1.0, // The marker size in points**2\n             const std::unordered_map<std::string, std::string> & keywords = {})\n{\n    assert(x.size() == y.size());\n\n    PyObject* xarray = get_array(x);\n    PyObject* yarray = get_array(y);\n\n    PyObject* kwargs = PyDict_New();\n    PyDict_SetItemString(kwargs, \"s\", PyLong_FromLong(s));\n    for (const auto& it : keywords)\n    {\n        PyDict_SetItemString(kwargs, it.first.c_str(), PyString_FromString(it.second.c_str()));\n    }\n\n    PyObject* plot_args = PyTuple_New(2);\n    PyTuple_SetItem(plot_args, 0, xarray);\n    PyTuple_SetItem(plot_args, 1, yarray);\n\n    PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_scatter, plot_args, kwargs);\n\n    Py_DECREF(plot_args);\n    Py_DECREF(kwargs);\n    if(res) Py_DECREF(res);\n\n    return res;\n}\n\ntemplate <typename Numeric>\nbool bar(const std::vector<Numeric> &               x,\n         const std::vector<Numeric> &               y,\n         std::string                                ec       = \"black\",\n         std::string                                ls       = \"-\",\n         double                                     lw       = 1.0,\n         const std::map<std::string, std::string> & keywords = {}) {\n  PyObject * xarray = get_array(x);\n  PyObject * yarray = get_array(y);\n\n  PyObject * kwargs = PyDict_New();\n\n  PyDict_SetItemString(kwargs, \"ec\", PyString_FromString(ec.c_str()));\n  PyDict_SetItemString(kwargs, \"ls\", PyString_FromString(ls.c_str()));\n  PyDict_SetItemString(kwargs, \"lw\", PyFloat_FromDouble(lw));\n\n  for (std::map<std::string, std::string>::const_iterator it =\n         keywords.begin();\n       it != keywords.end();\n       ++it) {\n    PyDict_SetItemString(\n      kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str()));\n  }\n\n  PyObject * plot_args = PyTuple_New(2);\n  PyTuple_SetItem(plot_args, 0, xarray);\n  PyTuple_SetItem(plot_args, 1, yarray);\n\n  PyObject * res = PyObject_Call(\n    detail::_interpreter::get().s_python_function_bar, plot_args, kwargs);\n\n  Py_DECREF(plot_args);\n  Py_DECREF(kwargs);\n  if (res) Py_DECREF(res);\n\n  return res;\n}\n\ntemplate <typename Numeric>\nbool bar(const std::vector<Numeric> &               y,\n         std::string                                ec       = \"black\",\n         std::string                                ls       = \"-\",\n         double                                     lw       = 1.0,\n         const std::map<std::string, std::string> & keywords = {}) {\n  using T = typename std::remove_reference<decltype(y)>::type::value_type;\n\n  std::vector<T> x;\n  for (std::size_t i = 0; i < y.size(); i++) { x.push_back(i); }\n\n  return bar(x, y, ec, ls, lw, keywords);\n}\n\ninline bool subplots_adjust(const std::map<std::string, double>& keywords = {})\n{\n\n    PyObject* kwargs = PyDict_New();\n    for (std::map<std::string, double>::const_iterator it =\n            keywords.begin(); it != keywords.end(); ++it) {\n        PyDict_SetItemString(kwargs, it->first.c_str(),\n                             PyFloat_FromDouble(it->second));\n    }\n\n\n    PyObject* plot_args = PyTuple_New(0);\n\n    PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_subplots_adjust, plot_args, kwargs);\n\n    Py_DECREF(plot_args);\n    Py_DECREF(kwargs);\n    if(res) Py_DECREF(res);\n\n    return res;\n}\n\ntemplate< typename Numeric>\nbool named_hist(std::string label,const std::vector<Numeric>& y, long bins=10, std::string color=\"b\", double alpha=1.0)\n{\n    PyObject* yarray = get_array(y);\n\n    PyObject* kwargs = PyDict_New();\n    PyDict_SetItemString(kwargs, \"label\", PyString_FromString(label.c_str()));\n    PyDict_SetItemString(kwargs, \"bins\", PyLong_FromLong(bins));\n    PyDict_SetItemString(kwargs, \"color\", PyString_FromString(color.c_str()));\n    PyDict_SetItemString(kwargs, \"alpha\", PyFloat_FromDouble(alpha));\n\n\n    PyObject* plot_args = PyTuple_New(1);\n    PyTuple_SetItem(plot_args, 0, yarray);\n\n    PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_hist, plot_args, kwargs);\n\n    Py_DECREF(plot_args);\n    Py_DECREF(kwargs);\n    if(res) Py_DECREF(res);\n\n    return res;\n}\n\ntemplate<typename NumericX, typename NumericY>\nbool plot(const std::vector<NumericX>& x, const std::vector<NumericY>& y, const std::string& s = \"\")\n{\n    assert(x.size() == y.size());\n\n    PyObject* xarray = get_array(x);\n    PyObject* yarray = get_array(y);\n\n    PyObject* pystring = PyString_FromString(s.c_str());\n\n    PyObject* plot_args = PyTuple_New(3);\n    PyTuple_SetItem(plot_args, 0, xarray);\n    PyTuple_SetItem(plot_args, 1, yarray);\n    PyTuple_SetItem(plot_args, 2, pystring);\n\n    PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_plot, plot_args);\n\n    Py_DECREF(plot_args);\n    if(res) Py_DECREF(res);\n\n    return res;\n}\n\ntemplate<typename NumericX, typename NumericY, typename NumericU, typename NumericW>\nbool quiver(const std::vector<NumericX>& x, const std::vector<NumericY>& y, const std::vector<NumericU>& u, const std::vector<NumericW>& w, const std::map<std::string, std::string>& keywords = {})\n{\n    assert(x.size() == y.size() && x.size() == u.size() && u.size() == w.size());\n\n    PyObject* xarray = get_array(x);\n    PyObject* yarray = get_array(y);\n    PyObject* uarray = get_array(u);\n    PyObject* warray = get_array(w);\n\n    PyObject* plot_args = PyTuple_New(4);\n    PyTuple_SetItem(plot_args, 0, xarray);\n    PyTuple_SetItem(plot_args, 1, yarray);\n    PyTuple_SetItem(plot_args, 2, uarray);\n    PyTuple_SetItem(plot_args, 3, warray);\n\n    // construct keyword args\n    PyObject* kwargs = PyDict_New();\n    for(std::map<std::string, std::string>::const_iterator it = keywords.begin(); it != keywords.end(); ++it)\n    {\n        PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str()));\n    }\n\n    PyObject* res = PyObject_Call(\n            detail::_interpreter::get().s_python_function_quiver, plot_args, kwargs);\n\n    Py_DECREF(kwargs);\n    Py_DECREF(plot_args);\n    if (res)\n        Py_DECREF(res);\n\n    return res;\n}\n\ntemplate<typename NumericX, typename NumericY>\nbool stem(const std::vector<NumericX>& x, const std::vector<NumericY>& y, const std::string& s = \"\")\n{\n    assert(x.size() == y.size());\n\n    PyObject* xarray = get_array(x);\n    PyObject* yarray = get_array(y);\n\n    PyObject* pystring = PyString_FromString(s.c_str());\n\n    PyObject* plot_args = PyTuple_New(3);\n    PyTuple_SetItem(plot_args, 0, xarray);\n    PyTuple_SetItem(plot_args, 1, yarray);\n    PyTuple_SetItem(plot_args, 2, pystring);\n\n    PyObject* res = PyObject_CallObject(\n            detail::_interpreter::get().s_python_function_stem, plot_args);\n\n    Py_DECREF(plot_args);\n    if (res)\n        Py_DECREF(res);\n\n    return res;\n}\n\ntemplate<typename NumericX, typename NumericY>\nbool semilogx(const std::vector<NumericX>& x, const std::vector<NumericY>& y, const std::string& s = \"\")\n{\n    assert(x.size() == y.size());\n\n    PyObject* xarray = get_array(x);\n    PyObject* yarray = get_array(y);\n\n    PyObject* pystring = PyString_FromString(s.c_str());\n\n    PyObject* plot_args = PyTuple_New(3);\n    PyTuple_SetItem(plot_args, 0, xarray);\n    PyTuple_SetItem(plot_args, 1, yarray);\n    PyTuple_SetItem(plot_args, 2, pystring);\n\n    PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_semilogx, plot_args);\n\n    Py_DECREF(plot_args);\n    if(res) Py_DECREF(res);\n\n    return res;\n}\n\ntemplate<typename NumericX, typename NumericY>\nbool semilogy(const std::vector<NumericX>& x, const std::vector<NumericY>& y, const std::string& s = \"\")\n{\n    assert(x.size() == y.size());\n\n    PyObject* xarray = get_array(x);\n    PyObject* yarray = get_array(y);\n\n    PyObject* pystring = PyString_FromString(s.c_str());\n\n    PyObject* plot_args = PyTuple_New(3);\n    PyTuple_SetItem(plot_args, 0, xarray);\n    PyTuple_SetItem(plot_args, 1, yarray);\n    PyTuple_SetItem(plot_args, 2, pystring);\n\n    PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_semilogy, plot_args);\n\n    Py_DECREF(plot_args);\n    if(res) Py_DECREF(res);\n\n    return res;\n}\n\ntemplate<typename NumericX, typename NumericY>\nbool loglog(const std::vector<NumericX>& x, const std::vector<NumericY>& y, const std::string& s = \"\")\n{\n    assert(x.size() == y.size());\n\n    PyObject* xarray = get_array(x);\n    PyObject* yarray = get_array(y);\n\n    PyObject* pystring = PyString_FromString(s.c_str());\n\n    PyObject* plot_args = PyTuple_New(3);\n    PyTuple_SetItem(plot_args, 0, xarray);\n    PyTuple_SetItem(plot_args, 1, yarray);\n    PyTuple_SetItem(plot_args, 2, pystring);\n\n    PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_loglog, plot_args);\n\n    Py_DECREF(plot_args);\n    if(res) Py_DECREF(res);\n\n    return res;\n}\n\ntemplate<typename NumericX, typename NumericY>\nbool errorbar(const std::vector<NumericX> &x, const std::vector<NumericY> &y, const std::vector<NumericX> &yerr, const std::map<std::string, std::string> &keywords = {})\n{\n    assert(x.size() == y.size());\n\n    PyObject* xarray = get_array(x);\n    PyObject* yarray = get_array(y);\n    PyObject* yerrarray = get_array(yerr);\n\n    // construct keyword args\n    PyObject* kwargs = PyDict_New();\n    for(std::map<std::string, std::string>::const_iterator it = keywords.begin(); it != keywords.end(); ++it)\n    {\n        PyDict_SetItemString(kwargs, it->first.c_str(), PyString_FromString(it->second.c_str()));\n    }\n\n    PyDict_SetItemString(kwargs, \"yerr\", yerrarray);\n\n    PyObject *plot_args = PyTuple_New(2);\n    PyTuple_SetItem(plot_args, 0, xarray);\n    PyTuple_SetItem(plot_args, 1, yarray);\n\n    PyObject *res = PyObject_Call(detail::_interpreter::get().s_python_function_errorbar, plot_args, kwargs);\n\n    Py_DECREF(kwargs);\n    Py_DECREF(plot_args);\n\n    if (res)\n        Py_DECREF(res);\n    else\n        throw std::runtime_error(\"Call to errorbar() failed.\");\n\n    return res;\n}\n\ntemplate<typename Numeric>\nbool named_plot(const std::string& name, const std::vector<Numeric>& y, const std::string& format = \"\")\n{\n    PyObject* kwargs = PyDict_New();\n    PyDict_SetItemString(kwargs, \"label\", PyString_FromString(name.c_str()));\n\n    PyObject* yarray = get_array(y);\n\n    PyObject* pystring = PyString_FromString(format.c_str());\n\n    PyObject* plot_args = PyTuple_New(2);\n\n    PyTuple_SetItem(plot_args, 0, yarray);\n    PyTuple_SetItem(plot_args, 1, pystring);\n\n    PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_plot, plot_args, kwargs);\n\n    Py_DECREF(kwargs);\n    Py_DECREF(plot_args);\n    if (res) Py_DECREF(res);\n\n    return res;\n}\n\ntemplate<typename Numeric>\nbool named_plot(const std::string& name, const std::vector<Numeric>& x, const std::vector<Numeric>& y, const std::string& format = \"\")\n{\n    PyObject* kwargs = PyDict_New();\n    PyDict_SetItemString(kwargs, \"label\", PyString_FromString(name.c_str()));\n\n    PyObject* xarray = get_array(x);\n    PyObject* yarray = get_array(y);\n\n    PyObject* pystring = PyString_FromString(format.c_str());\n\n    PyObject* plot_args = PyTuple_New(3);\n    PyTuple_SetItem(plot_args, 0, xarray);\n    PyTuple_SetItem(plot_args, 1, yarray);\n    PyTuple_SetItem(plot_args, 2, pystring);\n\n    PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_plot, plot_args, kwargs);\n\n    Py_DECREF(kwargs);\n    Py_DECREF(plot_args);\n    if (res) Py_DECREF(res);\n\n    return res;\n}\n\ntemplate<typename Numeric>\nbool named_semilogx(const std::string& name, const std::vector<Numeric>& x, const std::vector<Numeric>& y, const std::string& format = \"\")\n{\n    PyObject* kwargs = PyDict_New();\n    PyDict_SetItemString(kwargs, \"label\", PyString_FromString(name.c_str()));\n\n    PyObject* xarray = get_array(x);\n    PyObject* yarray = get_array(y);\n\n    PyObject* pystring = PyString_FromString(format.c_str());\n\n    PyObject* plot_args = PyTuple_New(3);\n    PyTuple_SetItem(plot_args, 0, xarray);\n    PyTuple_SetItem(plot_args, 1, yarray);\n    PyTuple_SetItem(plot_args, 2, pystring);\n\n    PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_semilogx, plot_args, kwargs);\n\n    Py_DECREF(kwargs);\n    Py_DECREF(plot_args);\n    if (res) Py_DECREF(res);\n\n    return res;\n}\n\ntemplate<typename Numeric>\nbool named_semilogy(const std::string& name, const std::vector<Numeric>& x, const std::vector<Numeric>& y, const std::string& format = \"\")\n{\n    PyObject* kwargs = PyDict_New();\n    PyDict_SetItemString(kwargs, \"label\", PyString_FromString(name.c_str()));\n\n    PyObject* xarray = get_array(x);\n    PyObject* yarray = get_array(y);\n\n    PyObject* pystring = PyString_FromString(format.c_str());\n\n    PyObject* plot_args = PyTuple_New(3);\n    PyTuple_SetItem(plot_args, 0, xarray);\n    PyTuple_SetItem(plot_args, 1, yarray);\n    PyTuple_SetItem(plot_args, 2, pystring);\n\n    PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_semilogy, plot_args, kwargs);\n\n    Py_DECREF(kwargs);\n    Py_DECREF(plot_args);\n    if (res) Py_DECREF(res);\n\n    return res;\n}\n\ntemplate<typename Numeric>\nbool named_loglog(const std::string& name, const std::vector<Numeric>& x, const std::vector<Numeric>& y, const std::string& format = \"\")\n{\n    PyObject* kwargs = PyDict_New();\n    PyDict_SetItemString(kwargs, \"label\", PyString_FromString(name.c_str()));\n\n    PyObject* xarray = get_array(x);\n    PyObject* yarray = get_array(y);\n\n    PyObject* pystring = PyString_FromString(format.c_str());\n\n    PyObject* plot_args = PyTuple_New(3);\n    PyTuple_SetItem(plot_args, 0, xarray);\n    PyTuple_SetItem(plot_args, 1, yarray);\n    PyTuple_SetItem(plot_args, 2, pystring);\n    PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_loglog, plot_args, kwargs);\n\n    Py_DECREF(kwargs);\n    Py_DECREF(plot_args);\n    if (res) Py_DECREF(res);\n\n    return res;\n}\n\ntemplate<typename Numeric>\nbool plot(const std::vector<Numeric>& y, const std::string& format = \"\")\n{\n    std::vector<Numeric> x(y.size());\n    for(size_t i=0; i<x.size(); ++i) x.at(i) = i;\n    return plot(x,y,format);\n}\n\ntemplate<typename Numeric>\nbool plot(const std::vector<Numeric>& y, const std::map<std::string, std::string>& keywords)\n{\n    std::vector<Numeric> x(y.size());\n    for(size_t i=0; i<x.size(); ++i) x.at(i) = i;\n    return plot(x,y,keywords);\n}\n\ntemplate<typename Numeric>\nbool stem(const std::vector<Numeric>& y, const std::string& format = \"\")\n{\n    std::vector<Numeric> x(y.size());\n    for (size_t i = 0; i < x.size(); ++i) x.at(i) = i;\n    return stem(x, y, format);\n}\n\ntemplate<typename Numeric>\nvoid text(Numeric x, Numeric y, const std::string& s = \"\")\n{\n    PyObject* args = PyTuple_New(3);\n    PyTuple_SetItem(args, 0, PyFloat_FromDouble(x));\n    PyTuple_SetItem(args, 1, PyFloat_FromDouble(y));\n    PyTuple_SetItem(args, 2, PyString_FromString(s.c_str()));\n\n    PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_text, args);\n    if(!res) throw std::runtime_error(\"Call to text() failed.\");\n\n    Py_DECREF(args);\n    Py_DECREF(res);\n}\n\n\ninline long figure(long number = -1)\n{\n    PyObject *res;\n    if (number == -1)\n        res = PyObject_CallObject(detail::_interpreter::get().s_python_function_figure, detail::_interpreter::get().s_python_empty_tuple);\n    else {\n        assert(number > 0);\n\n        // Make sure interpreter is initialised\n        detail::_interpreter::get();\n\n        PyObject *args = PyTuple_New(1);\n        PyTuple_SetItem(args, 0, PyLong_FromLong(number));\n        res = PyObject_CallObject(detail::_interpreter::get().s_python_function_figure, args);\n        Py_DECREF(args);\n    }\n\n    if(!res) throw std::runtime_error(\"Call to figure() failed.\");\n\n    PyObject* num = PyObject_GetAttrString(res, \"number\");\n    if (!num) throw std::runtime_error(\"Could not get number attribute of figure object\");\n    const long figureNumber = PyLong_AsLong(num);\n\n    Py_DECREF(num);\n    Py_DECREF(res);\n\n    return figureNumber;\n}\n\ninline bool fignum_exists(long number)\n{\n    // Make sure interpreter is initialised\n    detail::_interpreter::get();\n\n    PyObject *args = PyTuple_New(1);\n    PyTuple_SetItem(args, 0, PyLong_FromLong(number));\n    PyObject *res = PyObject_CallObject(detail::_interpreter::get().s_python_function_fignum_exists, args);\n    if(!res) throw std::runtime_error(\"Call to fignum_exists() failed.\");\n\n    bool ret = PyObject_IsTrue(res);\n    Py_DECREF(res);\n    Py_DECREF(args);\n\n    return ret;\n}\n\ninline void figure_size(size_t w, size_t h)\n{\n    // Make sure interpreter is initialised\n    detail::_interpreter::get();\n\n    const size_t dpi = 100;\n    PyObject* size = PyTuple_New(2);\n    PyTuple_SetItem(size, 0, PyFloat_FromDouble((double)w / dpi));\n    PyTuple_SetItem(size, 1, PyFloat_FromDouble((double)h / dpi));\n\n    PyObject* kwargs = PyDict_New();\n    PyDict_SetItemString(kwargs, \"figsize\", size);\n    PyDict_SetItemString(kwargs, \"dpi\", PyLong_FromSize_t(dpi));\n\n    PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_figure,\n            detail::_interpreter::get().s_python_empty_tuple, kwargs);\n\n    Py_DECREF(kwargs);\n\n    if(!res) throw std::runtime_error(\"Call to figure_size() failed.\");\n    Py_DECREF(res);\n}\n\ninline void legend()\n{\n    PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_legend, detail::_interpreter::get().s_python_empty_tuple);\n    if(!res) throw std::runtime_error(\"Call to legend() failed.\");\n\n    Py_DECREF(res);\n}\n\ntemplate<typename Numeric>\nvoid ylim(Numeric left, Numeric right)\n{\n    PyObject* list = PyList_New(2);\n    PyList_SetItem(list, 0, PyFloat_FromDouble(left));\n    PyList_SetItem(list, 1, PyFloat_FromDouble(right));\n\n    PyObject* args = PyTuple_New(1);\n    PyTuple_SetItem(args, 0, list);\n\n    PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_ylim, args);\n    if(!res) throw std::runtime_error(\"Call to ylim() failed.\");\n\n    Py_DECREF(args);\n    Py_DECREF(res);\n}\n\ntemplate<typename Numeric>\nvoid xlim(Numeric left, Numeric right)\n{\n    PyObject* list = PyList_New(2);\n    PyList_SetItem(list, 0, PyFloat_FromDouble(left));\n    PyList_SetItem(list, 1, PyFloat_FromDouble(right));\n\n    PyObject* args = PyTuple_New(1);\n    PyTuple_SetItem(args, 0, list);\n\n    PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_xlim, args);\n    if(!res) throw std::runtime_error(\"Call to xlim() failed.\");\n\n    Py_DECREF(args);\n    Py_DECREF(res);\n}\n\n\ninline double* xlim()\n{\n    PyObject* args = PyTuple_New(0);\n    PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_xlim, args);\n    PyObject* left = PyTuple_GetItem(res,0);\n    PyObject* right = PyTuple_GetItem(res,1);\n\n    double* arr = new double[2];\n    arr[0] = PyFloat_AsDouble(left);\n    arr[1] = PyFloat_AsDouble(right);\n\n    if(!res) throw std::runtime_error(\"Call to xlim() failed.\");\n\n    Py_DECREF(res);\n    return arr;\n}\n\n\ninline double* ylim()\n{\n    PyObject* args = PyTuple_New(0);\n    PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_ylim, args);\n    PyObject* left = PyTuple_GetItem(res,0);\n    PyObject* right = PyTuple_GetItem(res,1);\n\n    double* arr = new double[2];\n    arr[0] = PyFloat_AsDouble(left);\n    arr[1] = PyFloat_AsDouble(right);\n\n    if(!res) throw std::runtime_error(\"Call to ylim() failed.\");\n\n    Py_DECREF(res);\n    return arr;\n}\n\ntemplate<typename Numeric>\ninline void xticks(const std::vector<Numeric> &ticks, const std::vector<std::string> &labels = {}, const std::map<std::string, std::string>& keywords = {})\n{\n    assert(labels.size() == 0 || ticks.size() == labels.size());\n\n    // using numpy array\n    PyObject* ticksarray = get_array(ticks);\n\n    PyObject* args;\n    if(labels.size() == 0) {\n        // construct positional args\n        args = PyTuple_New(1);\n        PyTuple_SetItem(args, 0, ticksarray);\n    } else {\n        // make tuple of tick labels\n        PyObject* labelstuple = PyTuple_New(labels.size());\n        for (size_t i = 0; i < labels.size(); i++)\n            PyTuple_SetItem(labelstuple, i, PyUnicode_FromString(labels[i].c_str()));\n\n        // construct positional args\n        args = PyTuple_New(2);\n        PyTuple_SetItem(args, 0, ticksarray);\n        PyTuple_SetItem(args, 1, labelstuple);\n    }\n\n    // construct keyword args\n    PyObject* kwargs = PyDict_New();\n    for(std::map<std::string, std::string>::const_iterator it = keywords.begin(); it != keywords.end(); ++it)\n    {\n        PyDict_SetItemString(kwargs, it->first.c_str(), PyString_FromString(it->second.c_str()));\n    }\n\n    PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_xticks, args, kwargs);\n\n    Py_DECREF(args);\n    Py_DECREF(kwargs);\n    if(!res) throw std::runtime_error(\"Call to xticks() failed\");\n\n    Py_DECREF(res);\n}\n\ntemplate<typename Numeric>\ninline void xticks(const std::vector<Numeric> &ticks, const std::map<std::string, std::string>& keywords)\n{\n    xticks(ticks, {}, keywords);\n}\n\ntemplate<typename Numeric>\ninline void yticks(const std::vector<Numeric> &ticks, const std::vector<std::string> &labels = {}, const std::map<std::string, std::string>& keywords = {})\n{\n    assert(labels.size() == 0 || ticks.size() == labels.size());\n\n    // using numpy array\n    PyObject* ticksarray = get_array(ticks);\n\n    PyObject* args;\n    if(labels.size() == 0) {\n        // construct positional args\n        args = PyTuple_New(1);\n        PyTuple_SetItem(args, 0, ticksarray);\n    } else {\n        // make tuple of tick labels\n        PyObject* labelstuple = PyTuple_New(labels.size());\n        for (size_t i = 0; i < labels.size(); i++)\n            PyTuple_SetItem(labelstuple, i, PyUnicode_FromString(labels[i].c_str()));\n\n        // construct positional args\n        args = PyTuple_New(2);\n        PyTuple_SetItem(args, 0, ticksarray);\n        PyTuple_SetItem(args, 1, labelstuple);\n    }\n\n    // construct keyword args\n    PyObject* kwargs = PyDict_New();\n    for(std::map<std::string, std::string>::const_iterator it = keywords.begin(); it != keywords.end(); ++it)\n    {\n        PyDict_SetItemString(kwargs, it->first.c_str(), PyString_FromString(it->second.c_str()));\n    }\n\n    PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_yticks, args, kwargs);\n\n    Py_DECREF(args);\n    Py_DECREF(kwargs);\n    if(!res) throw std::runtime_error(\"Call to yticks() failed\");\n\n    Py_DECREF(res);\n}\n\ntemplate<typename Numeric>\ninline void yticks(const std::vector<Numeric> &ticks, const std::map<std::string, std::string>& keywords)\n{\n    yticks(ticks, {}, keywords);\n}\n\ninline void tick_params(const std::map<std::string, std::string>& keywords, const std::string axis = \"both\")\n{\n  // construct positional args\n  PyObject* args;\n  args = PyTuple_New(1);\n  PyTuple_SetItem(args, 0, PyString_FromString(axis.c_str()));\n  \n  // construct keyword args\n  PyObject* kwargs = PyDict_New();\n  for (std::map<std::string, std::string>::const_iterator it = keywords.begin(); it != keywords.end(); ++it)\n  {\n    PyDict_SetItemString(kwargs, it->first.c_str(), PyString_FromString(it->second.c_str()));\n  }\n  \n  \n  PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_tick_params, args, kwargs);\n  \n  Py_DECREF(args);\n  Py_DECREF(kwargs);\n  if (!res) throw std::runtime_error(\"Call to tick_params() failed\");\n  \n  Py_DECREF(res);\n}\n\ninline void subplot(long nrows, long ncols, long plot_number)\n{\n    // construct positional args\n    PyObject* args = PyTuple_New(3);\n    PyTuple_SetItem(args, 0, PyFloat_FromDouble(nrows));\n    PyTuple_SetItem(args, 1, PyFloat_FromDouble(ncols));\n    PyTuple_SetItem(args, 2, PyFloat_FromDouble(plot_number));\n\n    PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_subplot, args);\n    if(!res) throw std::runtime_error(\"Call to subplot() failed.\");\n\n    Py_DECREF(args);\n    Py_DECREF(res);\n}\n\ninline void subplot2grid(long nrows, long ncols, long rowid=0, long colid=0, long rowspan=1, long colspan=1)\n{\n    PyObject* shape = PyTuple_New(2);\n    PyTuple_SetItem(shape, 0, PyLong_FromLong(nrows));\n    PyTuple_SetItem(shape, 1, PyLong_FromLong(ncols));\n\n    PyObject* loc = PyTuple_New(2);\n    PyTuple_SetItem(loc, 0, PyLong_FromLong(rowid));\n    PyTuple_SetItem(loc, 1, PyLong_FromLong(colid));\n\n    PyObject* args = PyTuple_New(4);\n    PyTuple_SetItem(args, 0, shape);\n    PyTuple_SetItem(args, 1, loc);\n    PyTuple_SetItem(args, 2, PyLong_FromLong(rowspan));\n    PyTuple_SetItem(args, 3, PyLong_FromLong(colspan));\n\n    PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_subplot2grid, args);\n    if(!res) throw std::runtime_error(\"Call to subplot2grid() failed.\");\n\n    Py_DECREF(shape);\n    Py_DECREF(loc);\n    Py_DECREF(args);\n    Py_DECREF(res);\n}\n\ninline void title(const std::string &titlestr, const std::map<std::string, std::string> &keywords = {})\n{\n    PyObject* pytitlestr = PyString_FromString(titlestr.c_str());\n    PyObject* args = PyTuple_New(1);\n    PyTuple_SetItem(args, 0, pytitlestr);\n\n    PyObject* kwargs = PyDict_New();\n    for (auto it = keywords.begin(); it != keywords.end(); ++it) {\n        PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str()));\n    }\n\n    PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_title, args, kwargs);\n    if(!res) throw std::runtime_error(\"Call to title() failed.\");\n\n    Py_DECREF(args);\n    Py_DECREF(kwargs);\n    Py_DECREF(res);\n}\n\ninline void suptitle(const std::string &suptitlestr, const std::map<std::string, std::string> &keywords = {})\n{\n    PyObject* pysuptitlestr = PyString_FromString(suptitlestr.c_str());\n    PyObject* args = PyTuple_New(1);\n    PyTuple_SetItem(args, 0, pysuptitlestr);\n\n    PyObject* kwargs = PyDict_New();\n    for (auto it = keywords.begin(); it != keywords.end(); ++it) {\n        PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str()));\n    }\n\n    PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_suptitle, args, kwargs);\n    if(!res) throw std::runtime_error(\"Call to suptitle() failed.\");\n\n    Py_DECREF(args);\n    Py_DECREF(kwargs);\n    Py_DECREF(res);\n}\n\ninline void axis(const std::string &axisstr)\n{\n    PyObject* str = PyString_FromString(axisstr.c_str());\n    PyObject* args = PyTuple_New(1);\n    PyTuple_SetItem(args, 0, str);\n\n    PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_axis, args);\n    if(!res) throw std::runtime_error(\"Call to title() failed.\");\n\n    Py_DECREF(args);\n    Py_DECREF(res);\n}\n\ninline void xlabel(const std::string &str, const std::map<std::string, std::string> &keywords = {})\n{\n    PyObject* pystr = PyString_FromString(str.c_str());\n    PyObject* args = PyTuple_New(1);\n    PyTuple_SetItem(args, 0, pystr);\n\n    PyObject* kwargs = PyDict_New();\n    for (auto it = keywords.begin(); it != keywords.end(); ++it) {\n        PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str()));\n    }\n\n    PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_xlabel, args, kwargs);\n    if(!res) throw std::runtime_error(\"Call to xlabel() failed.\");\n\n    Py_DECREF(args);\n    Py_DECREF(kwargs);\n    Py_DECREF(res);\n}\n\ninline void ylabel(const std::string &str, const std::map<std::string, std::string>& keywords = {})\n{\n    PyObject* pystr = PyString_FromString(str.c_str());\n    PyObject* args = PyTuple_New(1);\n    PyTuple_SetItem(args, 0, pystr);\n\n    PyObject* kwargs = PyDict_New();\n    for (auto it = keywords.begin(); it != keywords.end(); ++it) {\n        PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str()));\n    }\n\n    PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_ylabel, args, kwargs);\n    if(!res) throw std::runtime_error(\"Call to ylabel() failed.\");\n\n    Py_DECREF(args);\n    Py_DECREF(kwargs);\n    Py_DECREF(res);\n}\n\ninline void grid(bool show, const std::string which = \"both\", const std::string axis = \"both\", const std::map<std::string, std::string>& keywords = {})\n{\n\tPyObject* pyflag = show ? Py_True : Py_False;\n    Py_INCREF(pyflag);\n\n\tPyObject* args = PyTuple_New(3);\n    PyTuple_SetItem(args, 0, pyflag);\n\tPyTuple_SetItem(args, 1, PyString_FromString(which.c_str()));\n\tPyTuple_SetItem(args, 2, PyString_FromString(axis.c_str()));\n\n\tPyObject* kwargs = PyDict_New();\n\tfor (auto it = keywords.begin(); it != keywords.end(); ++it) {\n\t\tPyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str()));\n\t}\n\n\tPyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_grid, args, kwargs);\n    if(!res) throw std::runtime_error(\"Call to grid() failed.\");\n\n    Py_DECREF(args);\n    Py_DECREF(res);\n}\n\ninline void show(const bool block = true)\n{\n    PyObject* res;\n    if(block)\n    {\n        res = PyObject_CallObject(\n                detail::_interpreter::get().s_python_function_show,\n                detail::_interpreter::get().s_python_empty_tuple);\n    }\n    else\n    {\n        PyObject *kwargs = PyDict_New();\n        PyDict_SetItemString(kwargs, \"block\", Py_False);\n        res = PyObject_Call( detail::_interpreter::get().s_python_function_show, detail::_interpreter::get().s_python_empty_tuple, kwargs);\n       Py_DECREF(kwargs);\n    }\n\n\n    if (!res) throw std::runtime_error(\"Call to show() failed.\");\n\n    Py_DECREF(res);\n}\n\ninline void close()\n{\n    PyObject* res = PyObject_CallObject(\n            detail::_interpreter::get().s_python_function_close,\n            detail::_interpreter::get().s_python_empty_tuple);\n\n    if (!res) throw std::runtime_error(\"Call to close() failed.\");\n\n    Py_DECREF(res);\n}\n\ninline void xkcd() {\n    PyObject* res;\n    PyObject *kwargs = PyDict_New();\n\n    res = PyObject_Call(detail::_interpreter::get().s_python_function_xkcd,\n            detail::_interpreter::get().s_python_empty_tuple, kwargs);\n\n    Py_DECREF(kwargs);\n\n    if (!res)\n        throw std::runtime_error(\"Call to show() failed.\");\n\n    Py_DECREF(res);\n}\n\ninline void draw()\n{\n    PyObject* res = PyObject_CallObject(\n        detail::_interpreter::get().s_python_function_draw,\n        detail::_interpreter::get().s_python_empty_tuple);\n\n    if (!res) throw std::runtime_error(\"Call to draw() failed.\");\n\n    Py_DECREF(res);\n}\n\ntemplate<typename Numeric>\ninline void pause(Numeric interval)\n{\n    PyObject* args = PyTuple_New(1);\n    PyTuple_SetItem(args, 0, PyFloat_FromDouble(interval));\n\n    PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_pause, args);\n    if(!res) throw std::runtime_error(\"Call to pause() failed.\");\n\n    Py_DECREF(args);\n    Py_DECREF(res);\n}\n\ninline void save(const std::string& filename)\n{\n    PyObject* pyfilename = PyString_FromString(filename.c_str());\n\n    PyObject* args = PyTuple_New(1);\n    PyTuple_SetItem(args, 0, pyfilename);\n\n    PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_save, args);\n    if (!res) throw std::runtime_error(\"Call to save() failed.\");\n\n    Py_DECREF(args);\n    Py_DECREF(res);\n}\n\ninline void clf() {\n    PyObject *res = PyObject_CallObject(\n        detail::_interpreter::get().s_python_function_clf,\n        detail::_interpreter::get().s_python_empty_tuple);\n\n    if (!res) throw std::runtime_error(\"Call to clf() failed.\");\n\n    Py_DECREF(res);\n}\n\n    inline void ion() {\n    PyObject *res = PyObject_CallObject(\n        detail::_interpreter::get().s_python_function_ion,\n        detail::_interpreter::get().s_python_empty_tuple);\n\n    if (!res) throw std::runtime_error(\"Call to ion() failed.\");\n\n    Py_DECREF(res);\n}\n\ninline std::vector<std::array<double, 2>> ginput(const int numClicks = 1, const std::map<std::string, std::string>& keywords = {})\n{\n    PyObject *args = PyTuple_New(1);\n    PyTuple_SetItem(args, 0, PyLong_FromLong(numClicks));\n\n    // construct keyword args\n    PyObject* kwargs = PyDict_New();\n    for(std::map<std::string, std::string>::const_iterator it = keywords.begin(); it != keywords.end(); ++it)\n    {\n        PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str()));\n    }\n\n    PyObject* res = PyObject_Call(\n        detail::_interpreter::get().s_python_function_ginput, args, kwargs);\n\n    Py_DECREF(kwargs);\n    Py_DECREF(args);\n    if (!res) throw std::runtime_error(\"Call to ginput() failed.\");\n\n    const size_t len = PyList_Size(res);\n    std::vector<std::array<double, 2>> out;\n    out.reserve(len);\n    for (size_t i = 0; i < len; i++) {\n        PyObject *current = PyList_GetItem(res, i);\n        std::array<double, 2> position;\n        position[0] = PyFloat_AsDouble(PyTuple_GetItem(current, 0));\n        position[1] = PyFloat_AsDouble(PyTuple_GetItem(current, 1));\n        out.push_back(position);\n    }\n    Py_DECREF(res);\n\n    return out;\n}\n\n// Actually, is there any reason not to call this automatically for every plot?\ninline void tight_layout() {\n    PyObject *res = PyObject_CallObject(\n        detail::_interpreter::get().s_python_function_tight_layout,\n        detail::_interpreter::get().s_python_empty_tuple);\n\n    if (!res) throw std::runtime_error(\"Call to tight_layout() failed.\");\n\n    Py_DECREF(res);\n}\n\n// Support for variadic plot() and initializer lists:\n\nnamespace detail {\n\ntemplate<typename T>\nusing is_function = typename std::is_function<std::remove_pointer<std::remove_reference<T>>>::type;\n\ntemplate<bool obj, typename T>\nstruct is_callable_impl;\n\ntemplate<typename T>\nstruct is_callable_impl<false, T>\n{\n    typedef is_function<T> type;\n}; // a non-object is callable iff it is a function\n\ntemplate<typename T>\nstruct is_callable_impl<true, T>\n{\n    struct Fallback { void operator()(); };\n    struct Derived : T, Fallback { };\n\n    template<typename U, U> struct Check;\n\n    template<typename U>\n    static std::true_type test( ... ); // use a variadic function to make sure (1) it accepts everything and (2) its always the worst match\n\n    template<typename U>\n    static std::false_type test( Check<void(Fallback::*)(), &U::operator()>* );\n\npublic:\n    typedef decltype(test<Derived>(nullptr)) type;\n    typedef decltype(&Fallback::operator()) dtype;\n    static constexpr bool value = type::value;\n}; // an object is callable iff it defines operator()\n\ntemplate<typename T>\nstruct is_callable\n{\n    // dispatch to is_callable_impl<true, T> or is_callable_impl<false, T> depending on whether T is of class type or not\n    typedef typename is_callable_impl<std::is_class<T>::value, T>::type type;\n};\n\ntemplate<typename IsYDataCallable>\nstruct plot_impl { };\n\ntemplate<>\nstruct plot_impl<std::false_type>\n{\n    template<typename IterableX, typename IterableY>\n    bool operator()(const IterableX& x, const IterableY& y, const std::string& format)\n    {\n        // 2-phase lookup for distance, begin, end\n        using std::distance;\n        using std::begin;\n        using std::end;\n\n        auto xs = distance(begin(x), end(x));\n        auto ys = distance(begin(y), end(y));\n        assert(xs == ys && \"x and y data must have the same number of elements!\");\n\n        PyObject* xlist = PyList_New(xs);\n        PyObject* ylist = PyList_New(ys);\n        PyObject* pystring = PyString_FromString(format.c_str());\n\n        auto itx = begin(x), ity = begin(y);\n        for(size_t i = 0; i < xs; ++i) {\n            PyList_SetItem(xlist, i, PyFloat_FromDouble(*itx++));\n            PyList_SetItem(ylist, i, PyFloat_FromDouble(*ity++));\n        }\n\n        PyObject* plot_args = PyTuple_New(3);\n        PyTuple_SetItem(plot_args, 0, xlist);\n        PyTuple_SetItem(plot_args, 1, ylist);\n        PyTuple_SetItem(plot_args, 2, pystring);\n\n        PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_plot, plot_args);\n\n        Py_DECREF(plot_args);\n        if(res) Py_DECREF(res);\n\n        return res;\n    }\n};\n\ntemplate<>\nstruct plot_impl<std::true_type>\n{\n    template<typename Iterable, typename Callable>\n    bool operator()(const Iterable& ticks, const Callable& f, const std::string& format)\n    {\n        if(begin(ticks) == end(ticks)) return true;\n\n        // We could use additional meta-programming to deduce the correct element type of y,\n        // but all values have to be convertible to double anyways\n        std::vector<double> y;\n        for(auto x : ticks) y.push_back(f(x));\n        return plot_impl<std::false_type>()(ticks,y,format);\n    }\n};\n\n} // end namespace detail\n\n// recursion stop for the above\ntemplate<typename... Args>\nbool plot() { return true; }\n\ntemplate<typename A, typename B, typename... Args>\nbool plot(const A& a, const B& b, const std::string& format, Args... args)\n{\n    return detail::plot_impl<typename detail::is_callable<B>::type>()(a,b,format) && plot(args...);\n}\n\n/*\n * This group of plot() functions is needed to support initializer lists, i.e. calling\n *    plot( {1,2,3,4} )\n */\ninline bool plot(const std::vector<double>& x, const std::vector<double>& y, const std::string& format = \"\") {\n    return plot<double,double>(x,y,format);\n}\n\ninline bool plot(const std::vector<double>& y, const std::string& format = \"\") {\n    return plot<double>(y,format);\n}\n\ninline bool plot(const std::vector<double>& x, const std::vector<double>& y, const std::map<std::string, std::string>& keywords) {\n    return plot<double>(x,y,keywords);\n}\n\n/*\n * This class allows dynamic plots, ie changing the plotted data without clearing and re-plotting\n */\n\nclass Plot\n{\npublic:\n    // default initialization with plot label, some data and format\n    template<typename Numeric>\n    Plot(const std::string& name, const std::vector<Numeric>& x, const std::vector<Numeric>& y, const std::string& format = \"\") {\n\n        assert(x.size() == y.size());\n\n        PyObject* kwargs = PyDict_New();\n        if(name != \"\")\n            PyDict_SetItemString(kwargs, \"label\", PyString_FromString(name.c_str()));\n\n        PyObject* xarray = get_array(x);\n        PyObject* yarray = get_array(y);\n\n        PyObject* pystring = PyString_FromString(format.c_str());\n\n        PyObject* plot_args = PyTuple_New(3);\n        PyTuple_SetItem(plot_args, 0, xarray);\n        PyTuple_SetItem(plot_args, 1, yarray);\n        PyTuple_SetItem(plot_args, 2, pystring);\n\n        PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_plot, plot_args, kwargs);\n\n        Py_DECREF(kwargs);\n        Py_DECREF(plot_args);\n\n        if(res)\n        {\n            line= PyList_GetItem(res, 0);\n\n            if(line)\n                set_data_fct = PyObject_GetAttrString(line,\"set_data\");\n            else\n                Py_DECREF(line);\n            Py_DECREF(res);\n        }\n    }\n\n    // shorter initialization with name or format only\n    // basically calls line, = plot([], [])\n    Plot(const std::string& name = \"\", const std::string& format = \"\")\n        : Plot(name, std::vector<double>(), std::vector<double>(), format) {}\n\n    template<typename Numeric>\n    bool update(const std::vector<Numeric>& x, const std::vector<Numeric>& y) {\n        assert(x.size() == y.size());\n        if(set_data_fct)\n        {\n            PyObject* xarray = get_array(x);\n            PyObject* yarray = get_array(y);\n\n            PyObject* plot_args = PyTuple_New(2);\n            PyTuple_SetItem(plot_args, 0, xarray);\n            PyTuple_SetItem(plot_args, 1, yarray);\n\n            PyObject* res = PyObject_CallObject(set_data_fct, plot_args);\n            if (res) Py_DECREF(res);\n            return res;\n        }\n        return false;\n    }\n\n    // clears the plot but keep it available\n    bool clear() {\n        return update(std::vector<double>(), std::vector<double>());\n    }\n\n    // definitely remove this line\n    void remove() {\n        if(line)\n        {\n            auto remove_fct = PyObject_GetAttrString(line,\"remove\");\n            PyObject* args = PyTuple_New(0);\n            PyObject* res = PyObject_CallObject(remove_fct, args);\n            if (res) Py_DECREF(res);\n        }\n        decref();\n    }\n\n    ~Plot() {\n        decref();\n    }\nprivate:\n\n    void decref() {\n        if(line)\n            Py_DECREF(line);\n        if(set_data_fct)\n            Py_DECREF(set_data_fct);\n    }\n\n\n    PyObject* line = nullptr;\n    PyObject* set_data_fct = nullptr;\n};\n\n} // end namespace matplotlibcpp\n"
  },
  {
    "path": "components/results_processing/polyMetrics/external/matplotlib-cpp/numpy_flags.py",
    "content": "from os import path\n\ntry:\n    from numpy import __file__ as numpyloc\n\n    # Get numpy directory\n    numpy_dir = path.dirname(numpyloc)\n\n    # Print the result of joining this to core and include\n    print(\"-I\" + path.join(numpy_dir, \"core\", \"include\"))\nexcept:\n    print(\"-DWITHOUT_NUMPY\")\n"
  },
  {
    "path": "components/results_processing/polyMetrics/external/nlohmann/json.hpp",
    "content": "/*\n    __ _____ _____ _____\n __|  |   __|     |   | |  JSON for Modern C++\n|  |  |__   |  |  | | | |  version 3.9.1\n|_____|_____|_____|_|___|  https://github.com/nlohmann/json\n\nLicensed under the MIT License <http://opensource.org/licenses/MIT>.\nSPDX-License-Identifier: MIT\nCopyright (c) 2013-2019 Niels Lohmann <http://nlohmann.me>.\n\nPermission is hereby  granted, free of charge, to any  person obtaining a copy\nof this software and associated  documentation files (the \"Software\"), to deal\nin the Software  without restriction, including without  limitation the rights\nto  use, copy,  modify, merge,  publish, distribute,  sublicense, and/or  sell\ncopies  of  the Software,  and  to  permit persons  to  whom  the Software  is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE  IS PROVIDED \"AS  IS\", WITHOUT WARRANTY  OF ANY KIND,  EXPRESS OR\nIMPLIED,  INCLUDING BUT  NOT  LIMITED TO  THE  WARRANTIES OF  MERCHANTABILITY,\nFITNESS FOR  A PARTICULAR PURPOSE AND  NONINFRINGEMENT. IN NO EVENT  SHALL THE\nAUTHORS  OR COPYRIGHT  HOLDERS  BE  LIABLE FOR  ANY  CLAIM,  DAMAGES OR  OTHER\nLIABILITY, WHETHER IN AN ACTION OF  CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE  OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n*/\n\n#ifndef INCLUDE_NLOHMANN_JSON_HPP_\n#define INCLUDE_NLOHMANN_JSON_HPP_\n\n#define NLOHMANN_JSON_VERSION_MAJOR 3\n#define NLOHMANN_JSON_VERSION_MINOR 9\n#define NLOHMANN_JSON_VERSION_PATCH 1\n\n#include <algorithm> // all_of, find, for_each\n#include <cstddef> // nullptr_t, ptrdiff_t, size_t\n#include <functional> // hash, less\n#include <initializer_list> // initializer_list\n#include <iosfwd> // istream, ostream\n#include <iterator> // random_access_iterator_tag\n#include <memory> // unique_ptr\n#include <numeric> // accumulate\n#include <string> // string, stoi, to_string\n#include <utility> // declval, forward, move, pair, swap\n#include <vector> // vector\n\n// #include <nlohmann/adl_serializer.hpp>\n\n\n#include <utility>\n\n// #include <nlohmann/detail/conversions/from_json.hpp>\n\n\n#include <algorithm> // transform\n#include <array> // array\n#include <forward_list> // forward_list\n#include <iterator> // inserter, front_inserter, end\n#include <map> // map\n#include <string> // string\n#include <tuple> // tuple, make_tuple\n#include <type_traits> // is_arithmetic, is_same, is_enum, underlying_type, is_convertible\n#include <unordered_map> // unordered_map\n#include <utility> // pair, declval\n#include <valarray> // valarray\n\n// #include <nlohmann/detail/exceptions.hpp>\n\n\n#include <exception> // exception\n#include <stdexcept> // runtime_error\n#include <string> // to_string\n\n// #include <nlohmann/detail/input/position_t.hpp>\n\n\n#include <cstddef> // size_t\n\nnamespace nlohmann\n{\nnamespace detail\n{\n/// struct to capture the start position of the current token\nstruct position_t\n{\n    /// the total number of characters read\n    std::size_t chars_read_total = 0;\n    /// the number of characters read in the current line\n    std::size_t chars_read_current_line = 0;\n    /// the number of lines read\n    std::size_t lines_read = 0;\n\n    /// conversion to size_t to preserve SAX interface\n    constexpr operator size_t() const\n    {\n        return chars_read_total;\n    }\n};\n\n} // namespace detail\n} // namespace nlohmann\n\n// #include <nlohmann/detail/macro_scope.hpp>\n\n\n#include <utility> // pair\n// #include <nlohmann/thirdparty/hedley/hedley.hpp>\n/* Hedley - https://nemequ.github.io/hedley\n * Created by Evan Nemerson <evan@nemerson.com>\n *\n * To the extent possible under law, the author(s) have dedicated all\n * copyright and related and neighboring rights to this software to\n * the public domain worldwide. This software is distributed without\n * any warranty.\n *\n * For details, see <http://creativecommons.org/publicdomain/zero/1.0/>.\n * SPDX-License-Identifier: CC0-1.0\n */\n\n#if !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < 13)\n#if defined(JSON_HEDLEY_VERSION)\n    #undef JSON_HEDLEY_VERSION\n#endif\n#define JSON_HEDLEY_VERSION 13\n\n#if defined(JSON_HEDLEY_STRINGIFY_EX)\n    #undef JSON_HEDLEY_STRINGIFY_EX\n#endif\n#define JSON_HEDLEY_STRINGIFY_EX(x) #x\n\n#if defined(JSON_HEDLEY_STRINGIFY)\n    #undef JSON_HEDLEY_STRINGIFY\n#endif\n#define JSON_HEDLEY_STRINGIFY(x) JSON_HEDLEY_STRINGIFY_EX(x)\n\n#if defined(JSON_HEDLEY_CONCAT_EX)\n    #undef JSON_HEDLEY_CONCAT_EX\n#endif\n#define JSON_HEDLEY_CONCAT_EX(a,b) a##b\n\n#if defined(JSON_HEDLEY_CONCAT)\n    #undef JSON_HEDLEY_CONCAT\n#endif\n#define JSON_HEDLEY_CONCAT(a,b) JSON_HEDLEY_CONCAT_EX(a,b)\n\n#if defined(JSON_HEDLEY_CONCAT3_EX)\n    #undef JSON_HEDLEY_CONCAT3_EX\n#endif\n#define JSON_HEDLEY_CONCAT3_EX(a,b,c) a##b##c\n\n#if defined(JSON_HEDLEY_CONCAT3)\n    #undef JSON_HEDLEY_CONCAT3\n#endif\n#define JSON_HEDLEY_CONCAT3(a,b,c) JSON_HEDLEY_CONCAT3_EX(a,b,c)\n\n#if defined(JSON_HEDLEY_VERSION_ENCODE)\n    #undef JSON_HEDLEY_VERSION_ENCODE\n#endif\n#define JSON_HEDLEY_VERSION_ENCODE(major,minor,revision) (((major) * 1000000) + ((minor) * 1000) + (revision))\n\n#if defined(JSON_HEDLEY_VERSION_DECODE_MAJOR)\n    #undef JSON_HEDLEY_VERSION_DECODE_MAJOR\n#endif\n#define JSON_HEDLEY_VERSION_DECODE_MAJOR(version) ((version) / 1000000)\n\n#if defined(JSON_HEDLEY_VERSION_DECODE_MINOR)\n    #undef JSON_HEDLEY_VERSION_DECODE_MINOR\n#endif\n#define JSON_HEDLEY_VERSION_DECODE_MINOR(version) (((version) % 1000000) / 1000)\n\n#if defined(JSON_HEDLEY_VERSION_DECODE_REVISION)\n    #undef JSON_HEDLEY_VERSION_DECODE_REVISION\n#endif\n#define JSON_HEDLEY_VERSION_DECODE_REVISION(version) ((version) % 1000)\n\n#if defined(JSON_HEDLEY_GNUC_VERSION)\n    #undef JSON_HEDLEY_GNUC_VERSION\n#endif\n#if defined(__GNUC__) && defined(__GNUC_PATCHLEVEL__)\n    #define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__)\n#elif defined(__GNUC__)\n    #define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, 0)\n#endif\n\n#if defined(JSON_HEDLEY_GNUC_VERSION_CHECK)\n    #undef JSON_HEDLEY_GNUC_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_GNUC_VERSION)\n    #define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GNUC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_MSVC_VERSION)\n    #undef JSON_HEDLEY_MSVC_VERSION\n#endif\n#if defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 140000000)\n    #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 10000000, (_MSC_FULL_VER % 10000000) / 100000, (_MSC_FULL_VER % 100000) / 100)\n#elif defined(_MSC_FULL_VER)\n    #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 1000000, (_MSC_FULL_VER % 1000000) / 10000, (_MSC_FULL_VER % 10000) / 10)\n#elif defined(_MSC_VER)\n    #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_VER / 100, _MSC_VER % 100, 0)\n#endif\n\n#if defined(JSON_HEDLEY_MSVC_VERSION_CHECK)\n    #undef JSON_HEDLEY_MSVC_VERSION_CHECK\n#endif\n#if !defined(_MSC_VER)\n    #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (0)\n#elif defined(_MSC_VER) && (_MSC_VER >= 1400)\n    #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 10000000) + (minor * 100000) + (patch)))\n#elif defined(_MSC_VER) && (_MSC_VER >= 1200)\n    #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 1000000) + (minor * 10000) + (patch)))\n#else\n    #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_VER >= ((major * 100) + (minor)))\n#endif\n\n#if defined(JSON_HEDLEY_INTEL_VERSION)\n    #undef JSON_HEDLEY_INTEL_VERSION\n#endif\n#if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE)\n    #define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, __INTEL_COMPILER_UPDATE)\n#elif defined(__INTEL_COMPILER)\n    #define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, 0)\n#endif\n\n#if defined(JSON_HEDLEY_INTEL_VERSION_CHECK)\n    #undef JSON_HEDLEY_INTEL_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_INTEL_VERSION)\n    #define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_INTEL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_PGI_VERSION)\n    #undef JSON_HEDLEY_PGI_VERSION\n#endif\n#if defined(__PGI) && defined(__PGIC__) && defined(__PGIC_MINOR__) && defined(__PGIC_PATCHLEVEL__)\n    #define JSON_HEDLEY_PGI_VERSION JSON_HEDLEY_VERSION_ENCODE(__PGIC__, __PGIC_MINOR__, __PGIC_PATCHLEVEL__)\n#endif\n\n#if defined(JSON_HEDLEY_PGI_VERSION_CHECK)\n    #undef JSON_HEDLEY_PGI_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_PGI_VERSION)\n    #define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PGI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_SUNPRO_VERSION)\n    #undef JSON_HEDLEY_SUNPRO_VERSION\n#endif\n#if defined(__SUNPRO_C) && (__SUNPRO_C > 0x1000)\n    #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_C >> 16) & 0xf) * 10) + ((__SUNPRO_C >> 12) & 0xf), (((__SUNPRO_C >> 8) & 0xf) * 10) + ((__SUNPRO_C >> 4) & 0xf), (__SUNPRO_C & 0xf) * 10)\n#elif defined(__SUNPRO_C)\n    #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_C >> 8) & 0xf, (__SUNPRO_C >> 4) & 0xf, (__SUNPRO_C) & 0xf)\n#elif defined(__SUNPRO_CC) && (__SUNPRO_CC > 0x1000)\n    #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_CC >> 16) & 0xf) * 10) + ((__SUNPRO_CC >> 12) & 0xf), (((__SUNPRO_CC >> 8) & 0xf) * 10) + ((__SUNPRO_CC >> 4) & 0xf), (__SUNPRO_CC & 0xf) * 10)\n#elif defined(__SUNPRO_CC)\n    #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_CC >> 8) & 0xf, (__SUNPRO_CC >> 4) & 0xf, (__SUNPRO_CC) & 0xf)\n#endif\n\n#if defined(JSON_HEDLEY_SUNPRO_VERSION_CHECK)\n    #undef JSON_HEDLEY_SUNPRO_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_SUNPRO_VERSION)\n    #define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_SUNPRO_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION)\n    #undef JSON_HEDLEY_EMSCRIPTEN_VERSION\n#endif\n#if defined(__EMSCRIPTEN__)\n    #define JSON_HEDLEY_EMSCRIPTEN_VERSION JSON_HEDLEY_VERSION_ENCODE(__EMSCRIPTEN_major__, __EMSCRIPTEN_minor__, __EMSCRIPTEN_tiny__)\n#endif\n\n#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK)\n    #undef JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION)\n    #define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_EMSCRIPTEN_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_ARM_VERSION)\n    #undef JSON_HEDLEY_ARM_VERSION\n#endif\n#if defined(__CC_ARM) && defined(__ARMCOMPILER_VERSION)\n    #define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCOMPILER_VERSION / 1000000, (__ARMCOMPILER_VERSION % 1000000) / 10000, (__ARMCOMPILER_VERSION % 10000) / 100)\n#elif defined(__CC_ARM) && defined(__ARMCC_VERSION)\n    #define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCC_VERSION / 1000000, (__ARMCC_VERSION % 1000000) / 10000, (__ARMCC_VERSION % 10000) / 100)\n#endif\n\n#if defined(JSON_HEDLEY_ARM_VERSION_CHECK)\n    #undef JSON_HEDLEY_ARM_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_ARM_VERSION)\n    #define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_ARM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_IBM_VERSION)\n    #undef JSON_HEDLEY_IBM_VERSION\n#endif\n#if defined(__ibmxl__)\n    #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ibmxl_version__, __ibmxl_release__, __ibmxl_modification__)\n#elif defined(__xlC__) && defined(__xlC_ver__)\n    #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, (__xlC_ver__ >> 8) & 0xff)\n#elif defined(__xlC__)\n    #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, 0)\n#endif\n\n#if defined(JSON_HEDLEY_IBM_VERSION_CHECK)\n    #undef JSON_HEDLEY_IBM_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_IBM_VERSION)\n    #define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IBM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_TI_VERSION)\n    #undef JSON_HEDLEY_TI_VERSION\n#endif\n#if \\\n    defined(__TI_COMPILER_VERSION__) && \\\n    ( \\\n      defined(__TMS470__) || defined(__TI_ARM__) || \\\n      defined(__MSP430__) || \\\n      defined(__TMS320C2000__) \\\n    )\n#if (__TI_COMPILER_VERSION__ >= 16000000)\n    #define JSON_HEDLEY_TI_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))\n#endif\n#endif\n\n#if defined(JSON_HEDLEY_TI_VERSION_CHECK)\n    #undef JSON_HEDLEY_TI_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_TI_VERSION)\n    #define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_TI_CL2000_VERSION)\n    #undef JSON_HEDLEY_TI_CL2000_VERSION\n#endif\n#if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C2000__)\n    #define JSON_HEDLEY_TI_CL2000_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))\n#endif\n\n#if defined(JSON_HEDLEY_TI_CL2000_VERSION_CHECK)\n    #undef JSON_HEDLEY_TI_CL2000_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_TI_CL2000_VERSION)\n    #define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL2000_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_TI_CL430_VERSION)\n    #undef JSON_HEDLEY_TI_CL430_VERSION\n#endif\n#if defined(__TI_COMPILER_VERSION__) && defined(__MSP430__)\n    #define JSON_HEDLEY_TI_CL430_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))\n#endif\n\n#if defined(JSON_HEDLEY_TI_CL430_VERSION_CHECK)\n    #undef JSON_HEDLEY_TI_CL430_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_TI_CL430_VERSION)\n    #define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL430_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_TI_ARMCL_VERSION)\n    #undef JSON_HEDLEY_TI_ARMCL_VERSION\n#endif\n#if defined(__TI_COMPILER_VERSION__) && (defined(__TMS470__) || defined(__TI_ARM__))\n    #define JSON_HEDLEY_TI_ARMCL_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))\n#endif\n\n#if defined(JSON_HEDLEY_TI_ARMCL_VERSION_CHECK)\n    #undef JSON_HEDLEY_TI_ARMCL_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_TI_ARMCL_VERSION)\n    #define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_ARMCL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_TI_CL6X_VERSION)\n    #undef JSON_HEDLEY_TI_CL6X_VERSION\n#endif\n#if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C6X__)\n    #define JSON_HEDLEY_TI_CL6X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))\n#endif\n\n#if defined(JSON_HEDLEY_TI_CL6X_VERSION_CHECK)\n    #undef JSON_HEDLEY_TI_CL6X_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_TI_CL6X_VERSION)\n    #define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL6X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_TI_CL7X_VERSION)\n    #undef JSON_HEDLEY_TI_CL7X_VERSION\n#endif\n#if defined(__TI_COMPILER_VERSION__) && defined(__C7000__)\n    #define JSON_HEDLEY_TI_CL7X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))\n#endif\n\n#if defined(JSON_HEDLEY_TI_CL7X_VERSION_CHECK)\n    #undef JSON_HEDLEY_TI_CL7X_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_TI_CL7X_VERSION)\n    #define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL7X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_TI_CLPRU_VERSION)\n    #undef JSON_HEDLEY_TI_CLPRU_VERSION\n#endif\n#if defined(__TI_COMPILER_VERSION__) && defined(__PRU__)\n    #define JSON_HEDLEY_TI_CLPRU_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))\n#endif\n\n#if defined(JSON_HEDLEY_TI_CLPRU_VERSION_CHECK)\n    #undef JSON_HEDLEY_TI_CLPRU_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_TI_CLPRU_VERSION)\n    #define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CLPRU_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_CRAY_VERSION)\n    #undef JSON_HEDLEY_CRAY_VERSION\n#endif\n#if defined(_CRAYC)\n    #if defined(_RELEASE_PATCHLEVEL)\n        #define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, _RELEASE_PATCHLEVEL)\n    #else\n        #define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, 0)\n    #endif\n#endif\n\n#if defined(JSON_HEDLEY_CRAY_VERSION_CHECK)\n    #undef JSON_HEDLEY_CRAY_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_CRAY_VERSION)\n    #define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_CRAY_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_IAR_VERSION)\n    #undef JSON_HEDLEY_IAR_VERSION\n#endif\n#if defined(__IAR_SYSTEMS_ICC__)\n    #if __VER__ > 1000\n        #define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE((__VER__ / 1000000), ((__VER__ / 1000) % 1000), (__VER__ % 1000))\n    #else\n        #define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE(VER / 100, __VER__ % 100, 0)\n    #endif\n#endif\n\n#if defined(JSON_HEDLEY_IAR_VERSION_CHECK)\n    #undef JSON_HEDLEY_IAR_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_IAR_VERSION)\n    #define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IAR_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_TINYC_VERSION)\n    #undef JSON_HEDLEY_TINYC_VERSION\n#endif\n#if defined(__TINYC__)\n    #define JSON_HEDLEY_TINYC_VERSION JSON_HEDLEY_VERSION_ENCODE(__TINYC__ / 1000, (__TINYC__ / 100) % 10, __TINYC__ % 100)\n#endif\n\n#if defined(JSON_HEDLEY_TINYC_VERSION_CHECK)\n    #undef JSON_HEDLEY_TINYC_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_TINYC_VERSION)\n    #define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TINYC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_DMC_VERSION)\n    #undef JSON_HEDLEY_DMC_VERSION\n#endif\n#if defined(__DMC__)\n    #define JSON_HEDLEY_DMC_VERSION JSON_HEDLEY_VERSION_ENCODE(__DMC__ >> 8, (__DMC__ >> 4) & 0xf, __DMC__ & 0xf)\n#endif\n\n#if defined(JSON_HEDLEY_DMC_VERSION_CHECK)\n    #undef JSON_HEDLEY_DMC_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_DMC_VERSION)\n    #define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_DMC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_COMPCERT_VERSION)\n    #undef JSON_HEDLEY_COMPCERT_VERSION\n#endif\n#if defined(__COMPCERT_VERSION__)\n    #define JSON_HEDLEY_COMPCERT_VERSION JSON_HEDLEY_VERSION_ENCODE(__COMPCERT_VERSION__ / 10000, (__COMPCERT_VERSION__ / 100) % 100, __COMPCERT_VERSION__ % 100)\n#endif\n\n#if defined(JSON_HEDLEY_COMPCERT_VERSION_CHECK)\n    #undef JSON_HEDLEY_COMPCERT_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_COMPCERT_VERSION)\n    #define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_COMPCERT_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_PELLES_VERSION)\n    #undef JSON_HEDLEY_PELLES_VERSION\n#endif\n#if defined(__POCC__)\n    #define JSON_HEDLEY_PELLES_VERSION JSON_HEDLEY_VERSION_ENCODE(__POCC__ / 100, __POCC__ % 100, 0)\n#endif\n\n#if defined(JSON_HEDLEY_PELLES_VERSION_CHECK)\n    #undef JSON_HEDLEY_PELLES_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_PELLES_VERSION)\n    #define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PELLES_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_GCC_VERSION)\n    #undef JSON_HEDLEY_GCC_VERSION\n#endif\n#if \\\n    defined(JSON_HEDLEY_GNUC_VERSION) && \\\n    !defined(__clang__) && \\\n    !defined(JSON_HEDLEY_INTEL_VERSION) && \\\n    !defined(JSON_HEDLEY_PGI_VERSION) && \\\n    !defined(JSON_HEDLEY_ARM_VERSION) && \\\n    !defined(JSON_HEDLEY_TI_VERSION) && \\\n    !defined(JSON_HEDLEY_TI_ARMCL_VERSION) && \\\n    !defined(JSON_HEDLEY_TI_CL430_VERSION) && \\\n    !defined(JSON_HEDLEY_TI_CL2000_VERSION) && \\\n    !defined(JSON_HEDLEY_TI_CL6X_VERSION) && \\\n    !defined(JSON_HEDLEY_TI_CL7X_VERSION) && \\\n    !defined(JSON_HEDLEY_TI_CLPRU_VERSION) && \\\n    !defined(__COMPCERT__)\n    #define JSON_HEDLEY_GCC_VERSION JSON_HEDLEY_GNUC_VERSION\n#endif\n\n#if defined(JSON_HEDLEY_GCC_VERSION_CHECK)\n    #undef JSON_HEDLEY_GCC_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_GCC_VERSION)\n    #define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GCC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_HAS_ATTRIBUTE)\n    #undef JSON_HEDLEY_HAS_ATTRIBUTE\n#endif\n#if defined(__has_attribute)\n    #define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) __has_attribute(attribute)\n#else\n    #define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) (0)\n#endif\n\n#if defined(JSON_HEDLEY_GNUC_HAS_ATTRIBUTE)\n    #undef JSON_HEDLEY_GNUC_HAS_ATTRIBUTE\n#endif\n#if defined(__has_attribute)\n    #define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) __has_attribute(attribute)\n#else\n    #define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_GCC_HAS_ATTRIBUTE)\n    #undef JSON_HEDLEY_GCC_HAS_ATTRIBUTE\n#endif\n#if defined(__has_attribute)\n    #define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) __has_attribute(attribute)\n#else\n    #define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE)\n    #undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE\n#endif\n#if \\\n    defined(__has_cpp_attribute) && \\\n    defined(__cplusplus) && \\\n    (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0))\n    #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) __has_cpp_attribute(attribute)\n#else\n    #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) (0)\n#endif\n\n#if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS)\n    #undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS\n#endif\n#if !defined(__cplusplus) || !defined(__has_cpp_attribute)\n    #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0)\n#elif \\\n    !defined(JSON_HEDLEY_PGI_VERSION) && \\\n    !defined(JSON_HEDLEY_IAR_VERSION) && \\\n    (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0)) && \\\n    (!defined(JSON_HEDLEY_MSVC_VERSION) || JSON_HEDLEY_MSVC_VERSION_CHECK(19,20,0))\n    #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(ns::attribute)\n#else\n    #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0)\n#endif\n\n#if defined(JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE)\n    #undef JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE\n#endif\n#if defined(__has_cpp_attribute) && defined(__cplusplus)\n    #define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute)\n#else\n    #define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE)\n    #undef JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE\n#endif\n#if defined(__has_cpp_attribute) && defined(__cplusplus)\n    #define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute)\n#else\n    #define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_HAS_BUILTIN)\n    #undef JSON_HEDLEY_HAS_BUILTIN\n#endif\n#if defined(__has_builtin)\n    #define JSON_HEDLEY_HAS_BUILTIN(builtin) __has_builtin(builtin)\n#else\n    #define JSON_HEDLEY_HAS_BUILTIN(builtin) (0)\n#endif\n\n#if defined(JSON_HEDLEY_GNUC_HAS_BUILTIN)\n    #undef JSON_HEDLEY_GNUC_HAS_BUILTIN\n#endif\n#if defined(__has_builtin)\n    #define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin)\n#else\n    #define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_GCC_HAS_BUILTIN)\n    #undef JSON_HEDLEY_GCC_HAS_BUILTIN\n#endif\n#if defined(__has_builtin)\n    #define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin)\n#else\n    #define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_HAS_FEATURE)\n    #undef JSON_HEDLEY_HAS_FEATURE\n#endif\n#if defined(__has_feature)\n    #define JSON_HEDLEY_HAS_FEATURE(feature) __has_feature(feature)\n#else\n    #define JSON_HEDLEY_HAS_FEATURE(feature) (0)\n#endif\n\n#if defined(JSON_HEDLEY_GNUC_HAS_FEATURE)\n    #undef JSON_HEDLEY_GNUC_HAS_FEATURE\n#endif\n#if defined(__has_feature)\n    #define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature)\n#else\n    #define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_GCC_HAS_FEATURE)\n    #undef JSON_HEDLEY_GCC_HAS_FEATURE\n#endif\n#if defined(__has_feature)\n    #define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature)\n#else\n    #define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_HAS_EXTENSION)\n    #undef JSON_HEDLEY_HAS_EXTENSION\n#endif\n#if defined(__has_extension)\n    #define JSON_HEDLEY_HAS_EXTENSION(extension) __has_extension(extension)\n#else\n    #define JSON_HEDLEY_HAS_EXTENSION(extension) (0)\n#endif\n\n#if defined(JSON_HEDLEY_GNUC_HAS_EXTENSION)\n    #undef JSON_HEDLEY_GNUC_HAS_EXTENSION\n#endif\n#if defined(__has_extension)\n    #define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension)\n#else\n    #define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_GCC_HAS_EXTENSION)\n    #undef JSON_HEDLEY_GCC_HAS_EXTENSION\n#endif\n#if defined(__has_extension)\n    #define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension)\n#else\n    #define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE)\n    #undef JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE\n#endif\n#if defined(__has_declspec_attribute)\n    #define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) __has_declspec_attribute(attribute)\n#else\n    #define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) (0)\n#endif\n\n#if defined(JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE)\n    #undef JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE\n#endif\n#if defined(__has_declspec_attribute)\n    #define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute)\n#else\n    #define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE)\n    #undef JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE\n#endif\n#if defined(__has_declspec_attribute)\n    #define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute)\n#else\n    #define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_HAS_WARNING)\n    #undef JSON_HEDLEY_HAS_WARNING\n#endif\n#if defined(__has_warning)\n    #define JSON_HEDLEY_HAS_WARNING(warning) __has_warning(warning)\n#else\n    #define JSON_HEDLEY_HAS_WARNING(warning) (0)\n#endif\n\n#if defined(JSON_HEDLEY_GNUC_HAS_WARNING)\n    #undef JSON_HEDLEY_GNUC_HAS_WARNING\n#endif\n#if defined(__has_warning)\n    #define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning)\n#else\n    #define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_GCC_HAS_WARNING)\n    #undef JSON_HEDLEY_GCC_HAS_WARNING\n#endif\n#if defined(__has_warning)\n    #define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning)\n#else\n    #define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)\n#endif\n\n/* JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_ is for\n   HEDLEY INTERNAL USE ONLY.  API subject to change without notice. */\n#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_)\n    #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_\n#endif\n#if defined(__cplusplus)\n#  if JSON_HEDLEY_HAS_WARNING(\"-Wc++98-compat\")\n#    if JSON_HEDLEY_HAS_WARNING(\"-Wc++17-extensions\")\n#      define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \\\n    JSON_HEDLEY_DIAGNOSTIC_PUSH \\\n    _Pragma(\"clang diagnostic ignored \\\"-Wc++98-compat\\\"\") \\\n    _Pragma(\"clang diagnostic ignored \\\"-Wc++17-extensions\\\"\") \\\n    xpr \\\n    JSON_HEDLEY_DIAGNOSTIC_POP\n#    else\n#      define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \\\n    JSON_HEDLEY_DIAGNOSTIC_PUSH \\\n    _Pragma(\"clang diagnostic ignored \\\"-Wc++98-compat\\\"\") \\\n    xpr \\\n    JSON_HEDLEY_DIAGNOSTIC_POP\n#    endif\n#  endif\n#endif\n#if !defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(x) x\n#endif\n\n#if defined(JSON_HEDLEY_CONST_CAST)\n    #undef JSON_HEDLEY_CONST_CAST\n#endif\n#if defined(__cplusplus)\n#  define JSON_HEDLEY_CONST_CAST(T, expr) (const_cast<T>(expr))\n#elif \\\n  JSON_HEDLEY_HAS_WARNING(\"-Wcast-qual\") || \\\n  JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) || \\\n  JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)\n#  define JSON_HEDLEY_CONST_CAST(T, expr) (__extension__ ({ \\\n        JSON_HEDLEY_DIAGNOSTIC_PUSH \\\n        JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL \\\n        ((T) (expr)); \\\n        JSON_HEDLEY_DIAGNOSTIC_POP \\\n    }))\n#else\n#  define JSON_HEDLEY_CONST_CAST(T, expr) ((T) (expr))\n#endif\n\n#if defined(JSON_HEDLEY_REINTERPRET_CAST)\n    #undef JSON_HEDLEY_REINTERPRET_CAST\n#endif\n#if defined(__cplusplus)\n    #define JSON_HEDLEY_REINTERPRET_CAST(T, expr) (reinterpret_cast<T>(expr))\n#else\n    #define JSON_HEDLEY_REINTERPRET_CAST(T, expr) ((T) (expr))\n#endif\n\n#if defined(JSON_HEDLEY_STATIC_CAST)\n    #undef JSON_HEDLEY_STATIC_CAST\n#endif\n#if defined(__cplusplus)\n    #define JSON_HEDLEY_STATIC_CAST(T, expr) (static_cast<T>(expr))\n#else\n    #define JSON_HEDLEY_STATIC_CAST(T, expr) ((T) (expr))\n#endif\n\n#if defined(JSON_HEDLEY_CPP_CAST)\n    #undef JSON_HEDLEY_CPP_CAST\n#endif\n#if defined(__cplusplus)\n#  if JSON_HEDLEY_HAS_WARNING(\"-Wold-style-cast\")\n#    define JSON_HEDLEY_CPP_CAST(T, expr) \\\n    JSON_HEDLEY_DIAGNOSTIC_PUSH \\\n    _Pragma(\"clang diagnostic ignored \\\"-Wold-style-cast\\\"\") \\\n    ((T) (expr)) \\\n    JSON_HEDLEY_DIAGNOSTIC_POP\n#  elif JSON_HEDLEY_IAR_VERSION_CHECK(8,3,0)\n#    define JSON_HEDLEY_CPP_CAST(T, expr) \\\n    JSON_HEDLEY_DIAGNOSTIC_PUSH \\\n    _Pragma(\"diag_suppress=Pe137\") \\\n    JSON_HEDLEY_DIAGNOSTIC_POP \\\n#  else\n#    define JSON_HEDLEY_CPP_CAST(T, expr) ((T) (expr))\n#  endif\n#else\n#  define JSON_HEDLEY_CPP_CAST(T, expr) (expr)\n#endif\n\n#if \\\n    (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \\\n    defined(__clang__) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \\\n    JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \\\n    JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \\\n    JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \\\n    JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \\\n    JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,0,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \\\n    JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0) || \\\n    JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,17) || \\\n    JSON_HEDLEY_SUNPRO_VERSION_CHECK(8,0,0) || \\\n    (JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) && defined(__C99_PRAGMA_OPERATOR))\n    #define JSON_HEDLEY_PRAGMA(value) _Pragma(#value)\n#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0)\n    #define JSON_HEDLEY_PRAGMA(value) __pragma(value)\n#else\n    #define JSON_HEDLEY_PRAGMA(value)\n#endif\n\n#if defined(JSON_HEDLEY_DIAGNOSTIC_PUSH)\n    #undef JSON_HEDLEY_DIAGNOSTIC_PUSH\n#endif\n#if defined(JSON_HEDLEY_DIAGNOSTIC_POP)\n    #undef JSON_HEDLEY_DIAGNOSTIC_POP\n#endif\n#if defined(__clang__)\n    #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma(\"clang diagnostic push\")\n    #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma(\"clang diagnostic pop\")\n#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma(\"warning(push)\")\n    #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma(\"warning(pop)\")\n#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma(\"GCC diagnostic push\")\n    #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma(\"GCC diagnostic pop\")\n#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_PUSH __pragma(warning(push))\n    #define JSON_HEDLEY_DIAGNOSTIC_POP __pragma(warning(pop))\n#elif JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma(\"push\")\n    #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma(\"pop\")\n#elif \\\n    JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \\\n    JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \\\n    JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,4,0) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma(\"diag_push\")\n    #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma(\"diag_pop\")\n#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma(\"warning(push)\")\n    #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma(\"warning(pop)\")\n#else\n    #define JSON_HEDLEY_DIAGNOSTIC_PUSH\n    #define JSON_HEDLEY_DIAGNOSTIC_POP\n#endif\n\n#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED)\n    #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED\n#endif\n#if JSON_HEDLEY_HAS_WARNING(\"-Wdeprecated-declarations\")\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma(\"clang diagnostic ignored \\\"-Wdeprecated-declarations\\\"\")\n#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma(\"warning(disable:1478 1786)\")\n#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma(\"diag_suppress 1215,1444\")\n#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma(\"GCC diagnostic ignored \\\"-Wdeprecated-declarations\\\"\")\n#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED __pragma(warning(disable:4996))\n#elif \\\n    JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \\\n    (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \\\n    (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \\\n    (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \\\n    (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma(\"diag_suppress 1291,1718\")\n#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && !defined(__cplusplus)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma(\"error_messages(off,E_DEPRECATED_ATT,E_DEPRECATED_ATT_MESS)\")\n#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && defined(__cplusplus)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma(\"error_messages(off,symdeprecated,symdeprecated2)\")\n#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma(\"diag_suppress=Pe1444,Pe1215\")\n#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma(\"warn(disable:2241)\")\n#else\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED\n#endif\n\n#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS)\n    #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS\n#endif\n#if JSON_HEDLEY_HAS_WARNING(\"-Wunknown-pragmas\")\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma(\"clang diagnostic ignored \\\"-Wunknown-pragmas\\\"\")\n#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma(\"warning(disable:161)\")\n#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma(\"diag_suppress 1675\")\n#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma(\"GCC diagnostic ignored \\\"-Wunknown-pragmas\\\"\")\n#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS __pragma(warning(disable:4068))\n#elif \\\n    JSON_HEDLEY_TI_VERSION_CHECK(16,9,0) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma(\"diag_suppress 163\")\n#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma(\"diag_suppress 163\")\n#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma(\"diag_suppress=Pe161\")\n#else\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS\n#endif\n\n#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES)\n    #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES\n#endif\n#if JSON_HEDLEY_HAS_WARNING(\"-Wunknown-attributes\")\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma(\"clang diagnostic ignored \\\"-Wunknown-attributes\\\"\")\n#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma(\"GCC diagnostic ignored \\\"-Wdeprecated-declarations\\\"\")\n#elif JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma(\"warning(disable:1292)\")\n#elif JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES __pragma(warning(disable:5030))\n#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma(\"diag_suppress 1097\")\n#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma(\"error_messages(off,attrskipunsup)\")\n#elif \\\n    JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma(\"diag_suppress 1173\")\n#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma(\"diag_suppress=Pe1097\")\n#else\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES\n#endif\n\n#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL)\n    #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL\n#endif\n#if JSON_HEDLEY_HAS_WARNING(\"-Wcast-qual\")\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma(\"clang diagnostic ignored \\\"-Wcast-qual\\\"\")\n#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma(\"warning(disable:2203 2331)\")\n#elif JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma(\"GCC diagnostic ignored \\\"-Wcast-qual\\\"\")\n#else\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL\n#endif\n\n#if defined(JSON_HEDLEY_DEPRECATED)\n    #undef JSON_HEDLEY_DEPRECATED\n#endif\n#if defined(JSON_HEDLEY_DEPRECATED_FOR)\n    #undef JSON_HEDLEY_DEPRECATED_FOR\n#endif\n#if JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0)\n    #define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated(\"Since \" # since))\n    #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated(\"Since \" #since \"; use \" #replacement))\n#elif defined(__cplusplus) && (__cplusplus >= 201402L)\n    #define JSON_HEDLEY_DEPRECATED(since) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated(\"Since \" #since)]])\n    #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated(\"Since \" #since \"; use \" #replacement)]])\n#elif \\\n    JSON_HEDLEY_HAS_EXTENSION(attribute_deprecated_with_message) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \\\n    JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) || \\\n    JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \\\n    JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \\\n    JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(18,1,0) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0)\n    #define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__(\"Since \" #since)))\n    #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__(\"Since \" #since \"; use \" #replacement)))\n#elif \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(deprecated) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \\\n    JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \\\n    (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \\\n    (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \\\n    (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \\\n    (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)\n    #define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__))\n    #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__))\n#elif \\\n    JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \\\n    JSON_HEDLEY_PELLES_VERSION_CHECK(6,50,0)\n    #define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated)\n    #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated)\n#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)\n    #define JSON_HEDLEY_DEPRECATED(since) _Pragma(\"deprecated\")\n    #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) _Pragma(\"deprecated\")\n#else\n    #define JSON_HEDLEY_DEPRECATED(since)\n    #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement)\n#endif\n\n#if defined(JSON_HEDLEY_UNAVAILABLE)\n    #undef JSON_HEDLEY_UNAVAILABLE\n#endif\n#if \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(warning) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)\n    #define JSON_HEDLEY_UNAVAILABLE(available_since) __attribute__((__warning__(\"Not available until \" #available_since)))\n#else\n    #define JSON_HEDLEY_UNAVAILABLE(available_since)\n#endif\n\n#if defined(JSON_HEDLEY_WARN_UNUSED_RESULT)\n    #undef JSON_HEDLEY_WARN_UNUSED_RESULT\n#endif\n#if defined(JSON_HEDLEY_WARN_UNUSED_RESULT_MSG)\n    #undef JSON_HEDLEY_WARN_UNUSED_RESULT_MSG\n#endif\n#if (JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard) >= 201907L)\n    #define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]])\n    #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard(msg)]])\n#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard)\n    #define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]])\n    #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]])\n#elif \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(warn_unused_result) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \\\n    (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \\\n    (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \\\n    (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \\\n    (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \\\n    (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \\\n    JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0)\n    #define JSON_HEDLEY_WARN_UNUSED_RESULT __attribute__((__warn_unused_result__))\n    #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) __attribute__((__warn_unused_result__))\n#elif defined(_Check_return_) /* SAL */\n    #define JSON_HEDLEY_WARN_UNUSED_RESULT _Check_return_\n    #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) _Check_return_\n#else\n    #define JSON_HEDLEY_WARN_UNUSED_RESULT\n    #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg)\n#endif\n\n#if defined(JSON_HEDLEY_SENTINEL)\n    #undef JSON_HEDLEY_SENTINEL\n#endif\n#if \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(sentinel) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0)\n    #define JSON_HEDLEY_SENTINEL(position) __attribute__((__sentinel__(position)))\n#else\n    #define JSON_HEDLEY_SENTINEL(position)\n#endif\n\n#if defined(JSON_HEDLEY_NO_RETURN)\n    #undef JSON_HEDLEY_NO_RETURN\n#endif\n#if JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)\n    #define JSON_HEDLEY_NO_RETURN __noreturn\n#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)\n    #define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__))\n#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L\n    #define JSON_HEDLEY_NO_RETURN _Noreturn\n#elif defined(__cplusplus) && (__cplusplus >= 201103L)\n    #define JSON_HEDLEY_NO_RETURN JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[noreturn]])\n#elif \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(noreturn) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(3,2,0) || \\\n    JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \\\n    JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \\\n    JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \\\n    (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \\\n    (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \\\n    (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \\\n    (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)\n    #define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__))\n#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0)\n    #define JSON_HEDLEY_NO_RETURN _Pragma(\"does_not_return\")\n#elif JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0)\n    #define JSON_HEDLEY_NO_RETURN __declspec(noreturn)\n#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus)\n    #define JSON_HEDLEY_NO_RETURN _Pragma(\"FUNC_NEVER_RETURNS;\")\n#elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0)\n    #define JSON_HEDLEY_NO_RETURN __attribute((noreturn))\n#elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0)\n    #define JSON_HEDLEY_NO_RETURN __declspec(noreturn)\n#else\n    #define JSON_HEDLEY_NO_RETURN\n#endif\n\n#if defined(JSON_HEDLEY_NO_ESCAPE)\n    #undef JSON_HEDLEY_NO_ESCAPE\n#endif\n#if JSON_HEDLEY_HAS_ATTRIBUTE(noescape)\n    #define JSON_HEDLEY_NO_ESCAPE __attribute__((__noescape__))\n#else\n    #define JSON_HEDLEY_NO_ESCAPE\n#endif\n\n#if defined(JSON_HEDLEY_UNREACHABLE)\n    #undef JSON_HEDLEY_UNREACHABLE\n#endif\n#if defined(JSON_HEDLEY_UNREACHABLE_RETURN)\n    #undef JSON_HEDLEY_UNREACHABLE_RETURN\n#endif\n#if defined(JSON_HEDLEY_ASSUME)\n    #undef JSON_HEDLEY_ASSUME\n#endif\n#if \\\n    JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)\n    #define JSON_HEDLEY_ASSUME(expr) __assume(expr)\n#elif JSON_HEDLEY_HAS_BUILTIN(__builtin_assume)\n    #define JSON_HEDLEY_ASSUME(expr) __builtin_assume(expr)\n#elif \\\n    JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0)\n    #if defined(__cplusplus)\n        #define JSON_HEDLEY_ASSUME(expr) std::_nassert(expr)\n    #else\n        #define JSON_HEDLEY_ASSUME(expr) _nassert(expr)\n    #endif\n#endif\n#if \\\n    (JSON_HEDLEY_HAS_BUILTIN(__builtin_unreachable) && (!defined(JSON_HEDLEY_ARM_VERSION))) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \\\n    JSON_HEDLEY_PGI_VERSION_CHECK(18,10,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_IBM_VERSION_CHECK(13,1,5)\n    #define JSON_HEDLEY_UNREACHABLE() __builtin_unreachable()\n#elif defined(JSON_HEDLEY_ASSUME)\n    #define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0)\n#endif\n#if !defined(JSON_HEDLEY_ASSUME)\n    #if defined(JSON_HEDLEY_UNREACHABLE)\n        #define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, ((expr) ? 1 : (JSON_HEDLEY_UNREACHABLE(), 1)))\n    #else\n        #define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, expr)\n    #endif\n#endif\n#if defined(JSON_HEDLEY_UNREACHABLE)\n    #if  \\\n        JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \\\n        JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0)\n        #define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (JSON_HEDLEY_STATIC_CAST(void, JSON_HEDLEY_ASSUME(0)), (value))\n    #else\n        #define JSON_HEDLEY_UNREACHABLE_RETURN(value) JSON_HEDLEY_UNREACHABLE()\n    #endif\n#else\n    #define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (value)\n#endif\n#if !defined(JSON_HEDLEY_UNREACHABLE)\n    #define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0)\n#endif\n\nJSON_HEDLEY_DIAGNOSTIC_PUSH\n#if JSON_HEDLEY_HAS_WARNING(\"-Wpedantic\")\n    #pragma clang diagnostic ignored \"-Wpedantic\"\n#endif\n#if JSON_HEDLEY_HAS_WARNING(\"-Wc++98-compat-pedantic\") && defined(__cplusplus)\n    #pragma clang diagnostic ignored \"-Wc++98-compat-pedantic\"\n#endif\n#if JSON_HEDLEY_GCC_HAS_WARNING(\"-Wvariadic-macros\",4,0,0)\n    #if defined(__clang__)\n        #pragma clang diagnostic ignored \"-Wvariadic-macros\"\n    #elif defined(JSON_HEDLEY_GCC_VERSION)\n        #pragma GCC diagnostic ignored \"-Wvariadic-macros\"\n    #endif\n#endif\n#if defined(JSON_HEDLEY_NON_NULL)\n    #undef JSON_HEDLEY_NON_NULL\n#endif\n#if \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(nonnull) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0)\n    #define JSON_HEDLEY_NON_NULL(...) __attribute__((__nonnull__(__VA_ARGS__)))\n#else\n    #define JSON_HEDLEY_NON_NULL(...)\n#endif\nJSON_HEDLEY_DIAGNOSTIC_POP\n\n#if defined(JSON_HEDLEY_PRINTF_FORMAT)\n    #undef JSON_HEDLEY_PRINTF_FORMAT\n#endif\n#if defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && !defined(__USE_MINGW_ANSI_STDIO)\n    #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(ms_printf, string_idx, first_to_check)))\n#elif defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && defined(__USE_MINGW_ANSI_STDIO)\n    #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(gnu_printf, string_idx, first_to_check)))\n#elif \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(format) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \\\n    JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \\\n    JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \\\n    (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \\\n    (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \\\n    (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \\\n    (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)\n    #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(__printf__, string_idx, first_to_check)))\n#elif JSON_HEDLEY_PELLES_VERSION_CHECK(6,0,0)\n    #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __declspec(vaformat(printf,string_idx,first_to_check))\n#else\n    #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check)\n#endif\n\n#if defined(JSON_HEDLEY_CONSTEXPR)\n    #undef JSON_HEDLEY_CONSTEXPR\n#endif\n#if defined(__cplusplus)\n    #if __cplusplus >= 201103L\n        #define JSON_HEDLEY_CONSTEXPR JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(constexpr)\n    #endif\n#endif\n#if !defined(JSON_HEDLEY_CONSTEXPR)\n    #define JSON_HEDLEY_CONSTEXPR\n#endif\n\n#if defined(JSON_HEDLEY_PREDICT)\n    #undef JSON_HEDLEY_PREDICT\n#endif\n#if defined(JSON_HEDLEY_LIKELY)\n    #undef JSON_HEDLEY_LIKELY\n#endif\n#if defined(JSON_HEDLEY_UNLIKELY)\n    #undef JSON_HEDLEY_UNLIKELY\n#endif\n#if defined(JSON_HEDLEY_UNPREDICTABLE)\n    #undef JSON_HEDLEY_UNPREDICTABLE\n#endif\n#if JSON_HEDLEY_HAS_BUILTIN(__builtin_unpredictable)\n    #define JSON_HEDLEY_UNPREDICTABLE(expr) __builtin_unpredictable((expr))\n#endif\n#if \\\n  JSON_HEDLEY_HAS_BUILTIN(__builtin_expect_with_probability) || \\\n  JSON_HEDLEY_GCC_VERSION_CHECK(9,0,0)\n#  define JSON_HEDLEY_PREDICT(expr, value, probability) __builtin_expect_with_probability(  (expr), (value), (probability))\n#  define JSON_HEDLEY_PREDICT_TRUE(expr, probability)   __builtin_expect_with_probability(!!(expr),    1   , (probability))\n#  define JSON_HEDLEY_PREDICT_FALSE(expr, probability)  __builtin_expect_with_probability(!!(expr),    0   , (probability))\n#  define JSON_HEDLEY_LIKELY(expr)                      __builtin_expect                 (!!(expr),    1                  )\n#  define JSON_HEDLEY_UNLIKELY(expr)                    __builtin_expect                 (!!(expr),    0                  )\n#elif \\\n  JSON_HEDLEY_HAS_BUILTIN(__builtin_expect) || \\\n  JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \\\n  JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n  (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \\\n  JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \\\n  JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \\\n  JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \\\n  JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \\\n  JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \\\n  JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \\\n  JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \\\n  JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n  JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \\\n  JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,27) || \\\n  JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0)\n#  define JSON_HEDLEY_PREDICT(expr, expected, probability) \\\n    (((probability) >= 0.9) ? __builtin_expect((expr), (expected)) : (JSON_HEDLEY_STATIC_CAST(void, expected), (expr)))\n#  define JSON_HEDLEY_PREDICT_TRUE(expr, probability) \\\n    (__extension__ ({ \\\n        double hedley_probability_ = (probability); \\\n        ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 1) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 0) : !!(expr))); \\\n    }))\n#  define JSON_HEDLEY_PREDICT_FALSE(expr, probability) \\\n    (__extension__ ({ \\\n        double hedley_probability_ = (probability); \\\n        ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 0) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 1) : !!(expr))); \\\n    }))\n#  define JSON_HEDLEY_LIKELY(expr)   __builtin_expect(!!(expr), 1)\n#  define JSON_HEDLEY_UNLIKELY(expr) __builtin_expect(!!(expr), 0)\n#else\n#  define JSON_HEDLEY_PREDICT(expr, expected, probability) (JSON_HEDLEY_STATIC_CAST(void, expected), (expr))\n#  define JSON_HEDLEY_PREDICT_TRUE(expr, probability) (!!(expr))\n#  define JSON_HEDLEY_PREDICT_FALSE(expr, probability) (!!(expr))\n#  define JSON_HEDLEY_LIKELY(expr) (!!(expr))\n#  define JSON_HEDLEY_UNLIKELY(expr) (!!(expr))\n#endif\n#if !defined(JSON_HEDLEY_UNPREDICTABLE)\n    #define JSON_HEDLEY_UNPREDICTABLE(expr) JSON_HEDLEY_PREDICT(expr, 1, 0.5)\n#endif\n\n#if defined(JSON_HEDLEY_MALLOC)\n    #undef JSON_HEDLEY_MALLOC\n#endif\n#if \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(malloc) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \\\n    JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \\\n    JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \\\n    (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \\\n    (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \\\n    (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \\\n    (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)\n    #define JSON_HEDLEY_MALLOC __attribute__((__malloc__))\n#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0)\n    #define JSON_HEDLEY_MALLOC _Pragma(\"returns_new_memory\")\n#elif JSON_HEDLEY_MSVC_VERSION_CHECK(14, 0, 0)\n    #define JSON_HEDLEY_MALLOC __declspec(restrict)\n#else\n    #define JSON_HEDLEY_MALLOC\n#endif\n\n#if defined(JSON_HEDLEY_PURE)\n    #undef JSON_HEDLEY_PURE\n#endif\n#if \\\n  JSON_HEDLEY_HAS_ATTRIBUTE(pure) || \\\n  JSON_HEDLEY_GCC_VERSION_CHECK(2,96,0) || \\\n  JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n  JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \\\n  JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \\\n  JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \\\n  JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \\\n  (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n  JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \\\n  (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n  JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \\\n  (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n  JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \\\n  (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n  JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \\\n  JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n  JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \\\n  JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0)\n#  define JSON_HEDLEY_PURE __attribute__((__pure__))\n#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0)\n#  define JSON_HEDLEY_PURE _Pragma(\"does_not_write_global_data\")\n#elif defined(__cplusplus) && \\\n    ( \\\n      JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \\\n      JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) || \\\n      JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) \\\n    )\n#  define JSON_HEDLEY_PURE _Pragma(\"FUNC_IS_PURE;\")\n#else\n#  define JSON_HEDLEY_PURE\n#endif\n\n#if defined(JSON_HEDLEY_CONST)\n    #undef JSON_HEDLEY_CONST\n#endif\n#if \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(const) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(2,5,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \\\n    JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \\\n    JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \\\n    (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \\\n    (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \\\n    (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \\\n    (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \\\n    JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0)\n    #define JSON_HEDLEY_CONST __attribute__((__const__))\n#elif \\\n    JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0)\n    #define JSON_HEDLEY_CONST _Pragma(\"no_side_effect\")\n#else\n    #define JSON_HEDLEY_CONST JSON_HEDLEY_PURE\n#endif\n\n#if defined(JSON_HEDLEY_RESTRICT)\n    #undef JSON_HEDLEY_RESTRICT\n#endif\n#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && !defined(__cplusplus)\n    #define JSON_HEDLEY_RESTRICT restrict\n#elif \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \\\n    JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \\\n    JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \\\n    JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \\\n    JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \\\n    JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,4) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus)) || \\\n    JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \\\n    defined(__clang__)\n    #define JSON_HEDLEY_RESTRICT __restrict\n#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,3,0) && !defined(__cplusplus)\n    #define JSON_HEDLEY_RESTRICT _Restrict\n#else\n    #define JSON_HEDLEY_RESTRICT\n#endif\n\n#if defined(JSON_HEDLEY_INLINE)\n    #undef JSON_HEDLEY_INLINE\n#endif\n#if \\\n    (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \\\n    (defined(__cplusplus) && (__cplusplus >= 199711L))\n    #define JSON_HEDLEY_INLINE inline\n#elif \\\n    defined(JSON_HEDLEY_GCC_VERSION) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(6,2,0)\n    #define JSON_HEDLEY_INLINE __inline__\n#elif \\\n    JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \\\n    JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,1,0) || \\\n    JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \\\n    JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)\n    #define JSON_HEDLEY_INLINE __inline\n#else\n    #define JSON_HEDLEY_INLINE\n#endif\n\n#if defined(JSON_HEDLEY_ALWAYS_INLINE)\n    #undef JSON_HEDLEY_ALWAYS_INLINE\n#endif\n#if \\\n  JSON_HEDLEY_HAS_ATTRIBUTE(always_inline) || \\\n  JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \\\n  JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n  JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \\\n  JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \\\n  JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \\\n  JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \\\n  (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n  JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \\\n  (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n  JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \\\n  (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n  JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \\\n  (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n  JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \\\n  JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n  JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)\n#  define JSON_HEDLEY_ALWAYS_INLINE __attribute__((__always_inline__)) JSON_HEDLEY_INLINE\n#elif JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0)\n#  define JSON_HEDLEY_ALWAYS_INLINE __forceinline\n#elif defined(__cplusplus) && \\\n    ( \\\n      JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \\\n      JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \\\n      JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \\\n      JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \\\n      JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n      JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) \\\n    )\n#  define JSON_HEDLEY_ALWAYS_INLINE _Pragma(\"FUNC_ALWAYS_INLINE;\")\n#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)\n#  define JSON_HEDLEY_ALWAYS_INLINE _Pragma(\"inline=forced\")\n#else\n#  define JSON_HEDLEY_ALWAYS_INLINE JSON_HEDLEY_INLINE\n#endif\n\n#if defined(JSON_HEDLEY_NEVER_INLINE)\n    #undef JSON_HEDLEY_NEVER_INLINE\n#endif\n#if \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(noinline) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \\\n    JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \\\n    JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \\\n    (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \\\n    (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \\\n    (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \\\n    (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)\n    #define JSON_HEDLEY_NEVER_INLINE __attribute__((__noinline__))\n#elif JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0)\n    #define JSON_HEDLEY_NEVER_INLINE __declspec(noinline)\n#elif JSON_HEDLEY_PGI_VERSION_CHECK(10,2,0)\n    #define JSON_HEDLEY_NEVER_INLINE _Pragma(\"noinline\")\n#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus)\n    #define JSON_HEDLEY_NEVER_INLINE _Pragma(\"FUNC_CANNOT_INLINE;\")\n#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)\n    #define JSON_HEDLEY_NEVER_INLINE _Pragma(\"inline=never\")\n#elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0)\n    #define JSON_HEDLEY_NEVER_INLINE __attribute((noinline))\n#elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0)\n    #define JSON_HEDLEY_NEVER_INLINE __declspec(noinline)\n#else\n    #define JSON_HEDLEY_NEVER_INLINE\n#endif\n\n#if defined(JSON_HEDLEY_PRIVATE)\n    #undef JSON_HEDLEY_PRIVATE\n#endif\n#if defined(JSON_HEDLEY_PUBLIC)\n    #undef JSON_HEDLEY_PUBLIC\n#endif\n#if defined(JSON_HEDLEY_IMPORT)\n    #undef JSON_HEDLEY_IMPORT\n#endif\n#if defined(_WIN32) || defined(__CYGWIN__)\n#  define JSON_HEDLEY_PRIVATE\n#  define JSON_HEDLEY_PUBLIC   __declspec(dllexport)\n#  define JSON_HEDLEY_IMPORT   __declspec(dllimport)\n#else\n#  if \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(visibility) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \\\n    JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \\\n    JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \\\n    ( \\\n      defined(__TI_EABI__) && \\\n      ( \\\n        (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n        JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) \\\n      ) \\\n    )\n#    define JSON_HEDLEY_PRIVATE __attribute__((__visibility__(\"hidden\")))\n#    define JSON_HEDLEY_PUBLIC  __attribute__((__visibility__(\"default\")))\n#  else\n#    define JSON_HEDLEY_PRIVATE\n#    define JSON_HEDLEY_PUBLIC\n#  endif\n#  define JSON_HEDLEY_IMPORT    extern\n#endif\n\n#if defined(JSON_HEDLEY_NO_THROW)\n    #undef JSON_HEDLEY_NO_THROW\n#endif\n#if \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(nothrow) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)\n    #define JSON_HEDLEY_NO_THROW __attribute__((__nothrow__))\n#elif \\\n    JSON_HEDLEY_MSVC_VERSION_CHECK(13,1,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0)\n    #define JSON_HEDLEY_NO_THROW __declspec(nothrow)\n#else\n    #define JSON_HEDLEY_NO_THROW\n#endif\n\n#if defined(JSON_HEDLEY_FALL_THROUGH)\n    #undef JSON_HEDLEY_FALL_THROUGH\n#endif\n#if \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(fallthrough) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(7,0,0)\n    #define JSON_HEDLEY_FALL_THROUGH __attribute__((__fallthrough__))\n#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(clang,fallthrough)\n    #define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[clang::fallthrough]])\n#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(fallthrough)\n    #define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[fallthrough]])\n#elif defined(__fallthrough) /* SAL */\n    #define JSON_HEDLEY_FALL_THROUGH __fallthrough\n#else\n    #define JSON_HEDLEY_FALL_THROUGH\n#endif\n\n#if defined(JSON_HEDLEY_RETURNS_NON_NULL)\n    #undef JSON_HEDLEY_RETURNS_NON_NULL\n#endif\n#if \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(returns_nonnull) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0)\n    #define JSON_HEDLEY_RETURNS_NON_NULL __attribute__((__returns_nonnull__))\n#elif defined(_Ret_notnull_) /* SAL */\n    #define JSON_HEDLEY_RETURNS_NON_NULL _Ret_notnull_\n#else\n    #define JSON_HEDLEY_RETURNS_NON_NULL\n#endif\n\n#if defined(JSON_HEDLEY_ARRAY_PARAM)\n    #undef JSON_HEDLEY_ARRAY_PARAM\n#endif\n#if \\\n    defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \\\n    !defined(__STDC_NO_VLA__) && \\\n    !defined(__cplusplus) && \\\n    !defined(JSON_HEDLEY_PGI_VERSION) && \\\n    !defined(JSON_HEDLEY_TINYC_VERSION)\n    #define JSON_HEDLEY_ARRAY_PARAM(name) (name)\n#else\n    #define JSON_HEDLEY_ARRAY_PARAM(name)\n#endif\n\n#if defined(JSON_HEDLEY_IS_CONSTANT)\n    #undef JSON_HEDLEY_IS_CONSTANT\n#endif\n#if defined(JSON_HEDLEY_REQUIRE_CONSTEXPR)\n    #undef JSON_HEDLEY_REQUIRE_CONSTEXPR\n#endif\n/* JSON_HEDLEY_IS_CONSTEXPR_ is for\n   HEDLEY INTERNAL USE ONLY.  API subject to change without notice. */\n#if defined(JSON_HEDLEY_IS_CONSTEXPR_)\n    #undef JSON_HEDLEY_IS_CONSTEXPR_\n#endif\n#if \\\n    JSON_HEDLEY_HAS_BUILTIN(__builtin_constant_p) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,19) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \\\n    JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \\\n    (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) && !defined(__cplusplus)) || \\\n    JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0)\n    #define JSON_HEDLEY_IS_CONSTANT(expr) __builtin_constant_p(expr)\n#endif\n#if !defined(__cplusplus)\n#  if \\\n       JSON_HEDLEY_HAS_BUILTIN(__builtin_types_compatible_p) || \\\n       JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \\\n       JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n       JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \\\n       JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \\\n       JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0) || \\\n       JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,24)\n#if defined(__INTPTR_TYPE__)\n    #define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0)), int*)\n#else\n    #include <stdint.h>\n    #define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((intptr_t) ((expr) * 0)) : (int*) 0)), int*)\n#endif\n#  elif \\\n       ( \\\n          defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) && \\\n          !defined(JSON_HEDLEY_SUNPRO_VERSION) && \\\n          !defined(JSON_HEDLEY_PGI_VERSION) && \\\n          !defined(JSON_HEDLEY_IAR_VERSION)) || \\\n       JSON_HEDLEY_HAS_EXTENSION(c_generic_selections) || \\\n       JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0) || \\\n       JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0) || \\\n       JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \\\n       JSON_HEDLEY_ARM_VERSION_CHECK(5,3,0)\n#if defined(__INTPTR_TYPE__)\n    #define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0), int*: 1, void*: 0)\n#else\n    #include <stdint.h>\n    #define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((intptr_t) * 0) : (int*) 0), int*: 1, void*: 0)\n#endif\n#  elif \\\n       defined(JSON_HEDLEY_GCC_VERSION) || \\\n       defined(JSON_HEDLEY_INTEL_VERSION) || \\\n       defined(JSON_HEDLEY_TINYC_VERSION) || \\\n       defined(JSON_HEDLEY_TI_ARMCL_VERSION) || \\\n       JSON_HEDLEY_TI_CL430_VERSION_CHECK(18,12,0) || \\\n       defined(JSON_HEDLEY_TI_CL2000_VERSION) || \\\n       defined(JSON_HEDLEY_TI_CL6X_VERSION) || \\\n       defined(JSON_HEDLEY_TI_CL7X_VERSION) || \\\n       defined(JSON_HEDLEY_TI_CLPRU_VERSION) || \\\n       defined(__clang__)\n#    define JSON_HEDLEY_IS_CONSTEXPR_(expr) ( \\\n        sizeof(void) != \\\n        sizeof(*( \\\n                  1 ? \\\n                  ((void*) ((expr) * 0L) ) : \\\n((struct { char v[sizeof(void) * 2]; } *) 1) \\\n                ) \\\n              ) \\\n                                            )\n#  endif\n#endif\n#if defined(JSON_HEDLEY_IS_CONSTEXPR_)\n    #if !defined(JSON_HEDLEY_IS_CONSTANT)\n        #define JSON_HEDLEY_IS_CONSTANT(expr) JSON_HEDLEY_IS_CONSTEXPR_(expr)\n    #endif\n    #define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (JSON_HEDLEY_IS_CONSTEXPR_(expr) ? (expr) : (-1))\n#else\n    #if !defined(JSON_HEDLEY_IS_CONSTANT)\n        #define JSON_HEDLEY_IS_CONSTANT(expr) (0)\n    #endif\n    #define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (expr)\n#endif\n\n#if defined(JSON_HEDLEY_BEGIN_C_DECLS)\n    #undef JSON_HEDLEY_BEGIN_C_DECLS\n#endif\n#if defined(JSON_HEDLEY_END_C_DECLS)\n    #undef JSON_HEDLEY_END_C_DECLS\n#endif\n#if defined(JSON_HEDLEY_C_DECL)\n    #undef JSON_HEDLEY_C_DECL\n#endif\n#if defined(__cplusplus)\n    #define JSON_HEDLEY_BEGIN_C_DECLS extern \"C\" {\n    #define JSON_HEDLEY_END_C_DECLS }\n    #define JSON_HEDLEY_C_DECL extern \"C\"\n#else\n    #define JSON_HEDLEY_BEGIN_C_DECLS\n    #define JSON_HEDLEY_END_C_DECLS\n    #define JSON_HEDLEY_C_DECL\n#endif\n\n#if defined(JSON_HEDLEY_STATIC_ASSERT)\n    #undef JSON_HEDLEY_STATIC_ASSERT\n#endif\n#if \\\n  !defined(__cplusplus) && ( \\\n      (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)) || \\\n      JSON_HEDLEY_HAS_FEATURE(c_static_assert) || \\\n      JSON_HEDLEY_GCC_VERSION_CHECK(6,0,0) || \\\n      JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n      defined(_Static_assert) \\\n    )\n#  define JSON_HEDLEY_STATIC_ASSERT(expr, message) _Static_assert(expr, message)\n#elif \\\n  (defined(__cplusplus) && (__cplusplus >= 201103L)) || \\\n  JSON_HEDLEY_MSVC_VERSION_CHECK(16,0,0)\n#  define JSON_HEDLEY_STATIC_ASSERT(expr, message) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(static_assert(expr, message))\n#else\n#  define JSON_HEDLEY_STATIC_ASSERT(expr, message)\n#endif\n\n#if defined(JSON_HEDLEY_NULL)\n    #undef JSON_HEDLEY_NULL\n#endif\n#if defined(__cplusplus)\n    #if __cplusplus >= 201103L\n        #define JSON_HEDLEY_NULL JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(nullptr)\n    #elif defined(NULL)\n        #define JSON_HEDLEY_NULL NULL\n    #else\n        #define JSON_HEDLEY_NULL JSON_HEDLEY_STATIC_CAST(void*, 0)\n    #endif\n#elif defined(NULL)\n    #define JSON_HEDLEY_NULL NULL\n#else\n    #define JSON_HEDLEY_NULL ((void*) 0)\n#endif\n\n#if defined(JSON_HEDLEY_MESSAGE)\n    #undef JSON_HEDLEY_MESSAGE\n#endif\n#if JSON_HEDLEY_HAS_WARNING(\"-Wunknown-pragmas\")\n#  define JSON_HEDLEY_MESSAGE(msg) \\\n    JSON_HEDLEY_DIAGNOSTIC_PUSH \\\n    JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \\\n    JSON_HEDLEY_PRAGMA(message msg) \\\n    JSON_HEDLEY_DIAGNOSTIC_POP\n#elif \\\n  JSON_HEDLEY_GCC_VERSION_CHECK(4,4,0) || \\\n  JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)\n#  define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message msg)\n#elif JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0)\n#  define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(_CRI message msg)\n#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)\n#  define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg))\n#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,0,0)\n#  define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg))\n#else\n#  define JSON_HEDLEY_MESSAGE(msg)\n#endif\n\n#if defined(JSON_HEDLEY_WARNING)\n    #undef JSON_HEDLEY_WARNING\n#endif\n#if JSON_HEDLEY_HAS_WARNING(\"-Wunknown-pragmas\")\n#  define JSON_HEDLEY_WARNING(msg) \\\n    JSON_HEDLEY_DIAGNOSTIC_PUSH \\\n    JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \\\n    JSON_HEDLEY_PRAGMA(clang warning msg) \\\n    JSON_HEDLEY_DIAGNOSTIC_POP\n#elif \\\n  JSON_HEDLEY_GCC_VERSION_CHECK(4,8,0) || \\\n  JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \\\n  JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)\n#  define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(GCC warning msg)\n#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0)\n#  define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(message(msg))\n#else\n#  define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_MESSAGE(msg)\n#endif\n\n#if defined(JSON_HEDLEY_REQUIRE)\n    #undef JSON_HEDLEY_REQUIRE\n#endif\n#if defined(JSON_HEDLEY_REQUIRE_MSG)\n    #undef JSON_HEDLEY_REQUIRE_MSG\n#endif\n#if JSON_HEDLEY_HAS_ATTRIBUTE(diagnose_if)\n#  if JSON_HEDLEY_HAS_WARNING(\"-Wgcc-compat\")\n#    define JSON_HEDLEY_REQUIRE(expr) \\\n    JSON_HEDLEY_DIAGNOSTIC_PUSH \\\n    _Pragma(\"clang diagnostic ignored \\\"-Wgcc-compat\\\"\") \\\n    __attribute__((diagnose_if(!(expr), #expr, \"error\"))) \\\n    JSON_HEDLEY_DIAGNOSTIC_POP\n#    define JSON_HEDLEY_REQUIRE_MSG(expr,msg) \\\n    JSON_HEDLEY_DIAGNOSTIC_PUSH \\\n    _Pragma(\"clang diagnostic ignored \\\"-Wgcc-compat\\\"\") \\\n    __attribute__((diagnose_if(!(expr), msg, \"error\"))) \\\n    JSON_HEDLEY_DIAGNOSTIC_POP\n#  else\n#    define JSON_HEDLEY_REQUIRE(expr) __attribute__((diagnose_if(!(expr), #expr, \"error\")))\n#    define JSON_HEDLEY_REQUIRE_MSG(expr,msg) __attribute__((diagnose_if(!(expr), msg, \"error\")))\n#  endif\n#else\n#  define JSON_HEDLEY_REQUIRE(expr)\n#  define JSON_HEDLEY_REQUIRE_MSG(expr,msg)\n#endif\n\n#if defined(JSON_HEDLEY_FLAGS)\n    #undef JSON_HEDLEY_FLAGS\n#endif\n#if JSON_HEDLEY_HAS_ATTRIBUTE(flag_enum)\n    #define JSON_HEDLEY_FLAGS __attribute__((__flag_enum__))\n#endif\n\n#if defined(JSON_HEDLEY_FLAGS_CAST)\n    #undef JSON_HEDLEY_FLAGS_CAST\n#endif\n#if JSON_HEDLEY_INTEL_VERSION_CHECK(19,0,0)\n#  define JSON_HEDLEY_FLAGS_CAST(T, expr) (__extension__ ({ \\\n        JSON_HEDLEY_DIAGNOSTIC_PUSH \\\n        _Pragma(\"warning(disable:188)\") \\\n        ((T) (expr)); \\\n        JSON_HEDLEY_DIAGNOSTIC_POP \\\n    }))\n#else\n#  define JSON_HEDLEY_FLAGS_CAST(T, expr) JSON_HEDLEY_STATIC_CAST(T, expr)\n#endif\n\n#if defined(JSON_HEDLEY_EMPTY_BASES)\n    #undef JSON_HEDLEY_EMPTY_BASES\n#endif\n#if JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,23918) && !JSON_HEDLEY_MSVC_VERSION_CHECK(20,0,0)\n    #define JSON_HEDLEY_EMPTY_BASES __declspec(empty_bases)\n#else\n    #define JSON_HEDLEY_EMPTY_BASES\n#endif\n\n/* Remaining macros are deprecated. */\n\n#if defined(JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK)\n    #undef JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK\n#endif\n#if defined(__clang__)\n    #define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) (0)\n#else\n    #define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_CLANG_HAS_ATTRIBUTE)\n    #undef JSON_HEDLEY_CLANG_HAS_ATTRIBUTE\n#endif\n#define JSON_HEDLEY_CLANG_HAS_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_ATTRIBUTE(attribute)\n\n#if defined(JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE)\n    #undef JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE\n#endif\n#define JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute)\n\n#if defined(JSON_HEDLEY_CLANG_HAS_BUILTIN)\n    #undef JSON_HEDLEY_CLANG_HAS_BUILTIN\n#endif\n#define JSON_HEDLEY_CLANG_HAS_BUILTIN(builtin) JSON_HEDLEY_HAS_BUILTIN(builtin)\n\n#if defined(JSON_HEDLEY_CLANG_HAS_FEATURE)\n    #undef JSON_HEDLEY_CLANG_HAS_FEATURE\n#endif\n#define JSON_HEDLEY_CLANG_HAS_FEATURE(feature) JSON_HEDLEY_HAS_FEATURE(feature)\n\n#if defined(JSON_HEDLEY_CLANG_HAS_EXTENSION)\n    #undef JSON_HEDLEY_CLANG_HAS_EXTENSION\n#endif\n#define JSON_HEDLEY_CLANG_HAS_EXTENSION(extension) JSON_HEDLEY_HAS_EXTENSION(extension)\n\n#if defined(JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE)\n    #undef JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE\n#endif\n#define JSON_HEDLEY_CLANG_HAS_DECLSPEC_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute)\n\n#if defined(JSON_HEDLEY_CLANG_HAS_WARNING)\n    #undef JSON_HEDLEY_CLANG_HAS_WARNING\n#endif\n#define JSON_HEDLEY_CLANG_HAS_WARNING(warning) JSON_HEDLEY_HAS_WARNING(warning)\n\n#endif /* !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < X) */\n\n\n// This file contains all internal macro definitions\n// You MUST include macro_unscope.hpp at the end of json.hpp to undef all of them\n\n// exclude unsupported compilers\n#if !defined(JSON_SKIP_UNSUPPORTED_COMPILER_CHECK)\n    #if defined(__clang__)\n        #if (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) < 30400\n            #error \"unsupported Clang version - see https://github.com/nlohmann/json#supported-compilers\"\n        #endif\n    #elif defined(__GNUC__) && !(defined(__ICC) || defined(__INTEL_COMPILER))\n        #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40800\n            #error \"unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers\"\n        #endif\n    #endif\n#endif\n\n// C++ language standard detection\n#if (defined(__cplusplus) && __cplusplus >= 202002L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 202002L)\n    #define JSON_HAS_CPP_20\n    #define JSON_HAS_CPP_17\n    #define JSON_HAS_CPP_14\n#elif (defined(__cplusplus) && __cplusplus >= 201703L) || (defined(_HAS_CXX17) && _HAS_CXX17 == 1) // fix for issue #464\n    #define JSON_HAS_CPP_17\n    #define JSON_HAS_CPP_14\n#elif (defined(__cplusplus) && __cplusplus >= 201402L) || (defined(_HAS_CXX14) && _HAS_CXX14 == 1)\n    #define JSON_HAS_CPP_14\n#endif\n\n// disable float-equal warnings on GCC/clang\n#if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__)\n    #pragma GCC diagnostic push\n    #pragma GCC diagnostic ignored \"-Wfloat-equal\"\n#endif\n\n// disable documentation warnings on clang\n#if defined(__clang__)\n    #pragma GCC diagnostic push\n    #pragma GCC diagnostic ignored \"-Wdocumentation\"\n#endif\n\n// allow to disable exceptions\n#if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(JSON_NOEXCEPTION)\n    #define JSON_THROW(exception) throw exception\n    #define JSON_TRY try\n    #define JSON_CATCH(exception) catch(exception)\n    #define JSON_INTERNAL_CATCH(exception) catch(exception)\n#else\n    #include <cstdlib>\n    #define JSON_THROW(exception) std::abort()\n    #define JSON_TRY if(true)\n    #define JSON_CATCH(exception) if(false)\n    #define JSON_INTERNAL_CATCH(exception) if(false)\n#endif\n\n// override exception macros\n#if defined(JSON_THROW_USER)\n    #undef JSON_THROW\n    #define JSON_THROW JSON_THROW_USER\n#endif\n#if defined(JSON_TRY_USER)\n    #undef JSON_TRY\n    #define JSON_TRY JSON_TRY_USER\n#endif\n#if defined(JSON_CATCH_USER)\n    #undef JSON_CATCH\n    #define JSON_CATCH JSON_CATCH_USER\n    #undef JSON_INTERNAL_CATCH\n    #define JSON_INTERNAL_CATCH JSON_CATCH_USER\n#endif\n#if defined(JSON_INTERNAL_CATCH_USER)\n    #undef JSON_INTERNAL_CATCH\n    #define JSON_INTERNAL_CATCH JSON_INTERNAL_CATCH_USER\n#endif\n\n// allow to override assert\n#if !defined(JSON_ASSERT)\n    #include <cassert> // assert\n    #define JSON_ASSERT(x) assert(x)\n#endif\n\n/*!\n@brief macro to briefly define a mapping between an enum and JSON\n@def NLOHMANN_JSON_SERIALIZE_ENUM\n@since version 3.4.0\n*/\n#define NLOHMANN_JSON_SERIALIZE_ENUM(ENUM_TYPE, ...)                                            \\\n    template<typename BasicJsonType>                                                            \\\n    inline void to_json(BasicJsonType& j, const ENUM_TYPE& e)                                   \\\n    {                                                                                           \\\n        static_assert(std::is_enum<ENUM_TYPE>::value, #ENUM_TYPE \" must be an enum!\");          \\\n        static const std::pair<ENUM_TYPE, BasicJsonType> m[] = __VA_ARGS__;                     \\\n        auto it = std::find_if(std::begin(m), std::end(m),                                      \\\n                               [e](const std::pair<ENUM_TYPE, BasicJsonType>& ej_pair) -> bool  \\\n        {                                                                                       \\\n            return ej_pair.first == e;                                                          \\\n        });                                                                                     \\\n        j = ((it != std::end(m)) ? it : std::begin(m))->second;                                 \\\n    }                                                                                           \\\n    template<typename BasicJsonType>                                                            \\\n    inline void from_json(const BasicJsonType& j, ENUM_TYPE& e)                                 \\\n    {                                                                                           \\\n        static_assert(std::is_enum<ENUM_TYPE>::value, #ENUM_TYPE \" must be an enum!\");          \\\n        static const std::pair<ENUM_TYPE, BasicJsonType> m[] = __VA_ARGS__;                     \\\n        auto it = std::find_if(std::begin(m), std::end(m),                                      \\\n                               [&j](const std::pair<ENUM_TYPE, BasicJsonType>& ej_pair) -> bool \\\n        {                                                                                       \\\n            return ej_pair.second == j;                                                         \\\n        });                                                                                     \\\n        e = ((it != std::end(m)) ? it : std::begin(m))->first;                                  \\\n    }\n\n// Ugly macros to avoid uglier copy-paste when specializing basic_json. They\n// may be removed in the future once the class is split.\n\n#define NLOHMANN_BASIC_JSON_TPL_DECLARATION                                \\\n    template<template<typename, typename, typename...> class ObjectType,   \\\n             template<typename, typename...> class ArrayType,              \\\n             class StringType, class BooleanType, class NumberIntegerType, \\\n             class NumberUnsignedType, class NumberFloatType,              \\\n             template<typename> class AllocatorType,                       \\\n             template<typename, typename = void> class JSONSerializer,     \\\n             class BinaryType>\n\n#define NLOHMANN_BASIC_JSON_TPL                                            \\\n    basic_json<ObjectType, ArrayType, StringType, BooleanType,             \\\n    NumberIntegerType, NumberUnsignedType, NumberFloatType,                \\\n    AllocatorType, JSONSerializer, BinaryType>\n\n// Macros to simplify conversion from/to types\n\n#define NLOHMANN_JSON_EXPAND( x ) x\n#define NLOHMANN_JSON_GET_MACRO(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64, NAME,...) NAME\n#define NLOHMANN_JSON_PASTE(...) NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_GET_MACRO(__VA_ARGS__, \\\n        NLOHMANN_JSON_PASTE64, \\\n        NLOHMANN_JSON_PASTE63, \\\n        NLOHMANN_JSON_PASTE62, \\\n        NLOHMANN_JSON_PASTE61, \\\n        NLOHMANN_JSON_PASTE60, \\\n        NLOHMANN_JSON_PASTE59, \\\n        NLOHMANN_JSON_PASTE58, \\\n        NLOHMANN_JSON_PASTE57, \\\n        NLOHMANN_JSON_PASTE56, \\\n        NLOHMANN_JSON_PASTE55, \\\n        NLOHMANN_JSON_PASTE54, \\\n        NLOHMANN_JSON_PASTE53, \\\n        NLOHMANN_JSON_PASTE52, \\\n        NLOHMANN_JSON_PASTE51, \\\n        NLOHMANN_JSON_PASTE50, \\\n        NLOHMANN_JSON_PASTE49, \\\n        NLOHMANN_JSON_PASTE48, \\\n        NLOHMANN_JSON_PASTE47, \\\n        NLOHMANN_JSON_PASTE46, \\\n        NLOHMANN_JSON_PASTE45, \\\n        NLOHMANN_JSON_PASTE44, \\\n        NLOHMANN_JSON_PASTE43, \\\n        NLOHMANN_JSON_PASTE42, \\\n        NLOHMANN_JSON_PASTE41, \\\n        NLOHMANN_JSON_PASTE40, \\\n        NLOHMANN_JSON_PASTE39, \\\n        NLOHMANN_JSON_PASTE38, \\\n        NLOHMANN_JSON_PASTE37, \\\n        NLOHMANN_JSON_PASTE36, \\\n        NLOHMANN_JSON_PASTE35, \\\n        NLOHMANN_JSON_PASTE34, \\\n        NLOHMANN_JSON_PASTE33, \\\n        NLOHMANN_JSON_PASTE32, \\\n        NLOHMANN_JSON_PASTE31, \\\n        NLOHMANN_JSON_PASTE30, \\\n        NLOHMANN_JSON_PASTE29, \\\n        NLOHMANN_JSON_PASTE28, \\\n        NLOHMANN_JSON_PASTE27, \\\n        NLOHMANN_JSON_PASTE26, \\\n        NLOHMANN_JSON_PASTE25, \\\n        NLOHMANN_JSON_PASTE24, \\\n        NLOHMANN_JSON_PASTE23, \\\n        NLOHMANN_JSON_PASTE22, \\\n        NLOHMANN_JSON_PASTE21, \\\n        NLOHMANN_JSON_PASTE20, \\\n        NLOHMANN_JSON_PASTE19, \\\n        NLOHMANN_JSON_PASTE18, \\\n        NLOHMANN_JSON_PASTE17, \\\n        NLOHMANN_JSON_PASTE16, \\\n        NLOHMANN_JSON_PASTE15, \\\n        NLOHMANN_JSON_PASTE14, \\\n        NLOHMANN_JSON_PASTE13, \\\n        NLOHMANN_JSON_PASTE12, \\\n        NLOHMANN_JSON_PASTE11, \\\n        NLOHMANN_JSON_PASTE10, \\\n        NLOHMANN_JSON_PASTE9, \\\n        NLOHMANN_JSON_PASTE8, \\\n        NLOHMANN_JSON_PASTE7, \\\n        NLOHMANN_JSON_PASTE6, \\\n        NLOHMANN_JSON_PASTE5, \\\n        NLOHMANN_JSON_PASTE4, \\\n        NLOHMANN_JSON_PASTE3, \\\n        NLOHMANN_JSON_PASTE2, \\\n        NLOHMANN_JSON_PASTE1)(__VA_ARGS__))\n#define NLOHMANN_JSON_PASTE2(func, v1) func(v1)\n#define NLOHMANN_JSON_PASTE3(func, v1, v2) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE2(func, v2)\n#define NLOHMANN_JSON_PASTE4(func, v1, v2, v3) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE3(func, v2, v3)\n#define NLOHMANN_JSON_PASTE5(func, v1, v2, v3, v4) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE4(func, v2, v3, v4)\n#define NLOHMANN_JSON_PASTE6(func, v1, v2, v3, v4, v5) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE5(func, v2, v3, v4, v5)\n#define NLOHMANN_JSON_PASTE7(func, v1, v2, v3, v4, v5, v6) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE6(func, v2, v3, v4, v5, v6)\n#define NLOHMANN_JSON_PASTE8(func, v1, v2, v3, v4, v5, v6, v7) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE7(func, v2, v3, v4, v5, v6, v7)\n#define NLOHMANN_JSON_PASTE9(func, v1, v2, v3, v4, v5, v6, v7, v8) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE8(func, v2, v3, v4, v5, v6, v7, v8)\n#define NLOHMANN_JSON_PASTE10(func, v1, v2, v3, v4, v5, v6, v7, v8, v9) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE9(func, v2, v3, v4, v5, v6, v7, v8, v9)\n#define NLOHMANN_JSON_PASTE11(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE10(func, v2, v3, v4, v5, v6, v7, v8, v9, v10)\n#define NLOHMANN_JSON_PASTE12(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE11(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11)\n#define NLOHMANN_JSON_PASTE13(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE12(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12)\n#define NLOHMANN_JSON_PASTE14(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE13(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13)\n#define NLOHMANN_JSON_PASTE15(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE14(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14)\n#define NLOHMANN_JSON_PASTE16(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE15(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15)\n#define NLOHMANN_JSON_PASTE17(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE16(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16)\n#define NLOHMANN_JSON_PASTE18(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE17(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17)\n#define NLOHMANN_JSON_PASTE19(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE18(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18)\n#define NLOHMANN_JSON_PASTE20(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE19(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19)\n#define NLOHMANN_JSON_PASTE21(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE20(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20)\n#define NLOHMANN_JSON_PASTE22(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE21(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21)\n#define NLOHMANN_JSON_PASTE23(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE22(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22)\n#define NLOHMANN_JSON_PASTE24(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE23(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23)\n#define NLOHMANN_JSON_PASTE25(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE24(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24)\n#define NLOHMANN_JSON_PASTE26(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE25(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25)\n#define NLOHMANN_JSON_PASTE27(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE26(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26)\n#define NLOHMANN_JSON_PASTE28(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE27(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27)\n#define NLOHMANN_JSON_PASTE29(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE28(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28)\n#define NLOHMANN_JSON_PASTE30(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE29(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29)\n#define NLOHMANN_JSON_PASTE31(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE30(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30)\n#define NLOHMANN_JSON_PASTE32(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE31(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31)\n#define NLOHMANN_JSON_PASTE33(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE32(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32)\n#define NLOHMANN_JSON_PASTE34(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE33(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33)\n#define NLOHMANN_JSON_PASTE35(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE34(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34)\n#define NLOHMANN_JSON_PASTE36(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE35(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35)\n#define NLOHMANN_JSON_PASTE37(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE36(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36)\n#define NLOHMANN_JSON_PASTE38(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE37(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37)\n#define NLOHMANN_JSON_PASTE39(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE38(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38)\n#define NLOHMANN_JSON_PASTE40(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE39(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39)\n#define NLOHMANN_JSON_PASTE41(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE40(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40)\n#define NLOHMANN_JSON_PASTE42(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE41(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41)\n#define NLOHMANN_JSON_PASTE43(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE42(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42)\n#define NLOHMANN_JSON_PASTE44(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE43(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43)\n#define NLOHMANN_JSON_PASTE45(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE44(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44)\n#define NLOHMANN_JSON_PASTE46(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE45(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45)\n#define NLOHMANN_JSON_PASTE47(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE46(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46)\n#define NLOHMANN_JSON_PASTE48(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE47(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47)\n#define NLOHMANN_JSON_PASTE49(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE48(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48)\n#define NLOHMANN_JSON_PASTE50(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE49(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49)\n#define NLOHMANN_JSON_PASTE51(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE50(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50)\n#define NLOHMANN_JSON_PASTE52(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE51(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51)\n#define NLOHMANN_JSON_PASTE53(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE52(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52)\n#define NLOHMANN_JSON_PASTE54(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE53(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53)\n#define NLOHMANN_JSON_PASTE55(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE54(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54)\n#define NLOHMANN_JSON_PASTE56(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE55(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55)\n#define NLOHMANN_JSON_PASTE57(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE56(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56)\n#define NLOHMANN_JSON_PASTE58(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE57(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57)\n#define NLOHMANN_JSON_PASTE59(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE58(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58)\n#define NLOHMANN_JSON_PASTE60(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE59(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59)\n#define NLOHMANN_JSON_PASTE61(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE60(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60)\n#define NLOHMANN_JSON_PASTE62(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE61(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61)\n#define NLOHMANN_JSON_PASTE63(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE62(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62)\n#define NLOHMANN_JSON_PASTE64(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE63(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63)\n\n#define NLOHMANN_JSON_TO(v1) nlohmann_json_j[#v1] = nlohmann_json_t.v1;\n#define NLOHMANN_JSON_FROM(v1) nlohmann_json_j.at(#v1).get_to(nlohmann_json_t.v1);\n\n/*!\n@brief macro\n@def NLOHMANN_DEFINE_TYPE_INTRUSIVE\n@since version 3.9.0\n*/\n#define NLOHMANN_DEFINE_TYPE_INTRUSIVE(Type, ...)  \\\n    friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \\\n    friend void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) }\n\n/*!\n@brief macro\n@def NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE\n@since version 3.9.0\n*/\n#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(Type, ...)  \\\n    inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \\\n    inline void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) }\n\n#ifndef JSON_USE_IMPLICIT_CONVERSIONS\n    #define JSON_USE_IMPLICIT_CONVERSIONS 1\n#endif\n\n#if JSON_USE_IMPLICIT_CONVERSIONS\n    #define JSON_EXPLICIT\n#else\n    #define JSON_EXPLICIT explicit\n#endif\n\n\nnamespace nlohmann\n{\nnamespace detail\n{\n////////////////\n// exceptions //\n////////////////\n\n/*!\n@brief general exception of the @ref basic_json class\n\nThis class is an extension of `std::exception` objects with a member @a id for\nexception ids. It is used as the base class for all exceptions thrown by the\n@ref basic_json class. This class can hence be used as \"wildcard\" to catch\nexceptions.\n\nSubclasses:\n- @ref parse_error for exceptions indicating a parse error\n- @ref invalid_iterator for exceptions indicating errors with iterators\n- @ref type_error for exceptions indicating executing a member function with\n                  a wrong type\n- @ref out_of_range for exceptions indicating access out of the defined range\n- @ref other_error for exceptions indicating other library errors\n\n@internal\n@note To have nothrow-copy-constructible exceptions, we internally use\n      `std::runtime_error` which can cope with arbitrary-length error messages.\n      Intermediate strings are built with static functions and then passed to\n      the actual constructor.\n@endinternal\n\n@liveexample{The following code shows how arbitrary library exceptions can be\ncaught.,exception}\n\n@since version 3.0.0\n*/\nclass exception : public std::exception\n{\n  public:\n    /// returns the explanatory string\n    JSON_HEDLEY_RETURNS_NON_NULL\n    const char* what() const noexcept override\n    {\n        return m.what();\n    }\n\n    /// the id of the exception\n    const int id;\n\n  protected:\n    JSON_HEDLEY_NON_NULL(3)\n    exception(int id_, const char* what_arg) : id(id_), m(what_arg) {}\n\n    static std::string name(const std::string& ename, int id_)\n    {\n        return \"[json.exception.\" + ename + \".\" + std::to_string(id_) + \"] \";\n    }\n\n  private:\n    /// an exception object as storage for error messages\n    std::runtime_error m;\n};\n\n/*!\n@brief exception indicating a parse error\n\nThis exception is thrown by the library when a parse error occurs. Parse errors\ncan occur during the deserialization of JSON text, CBOR, MessagePack, as well\nas when using JSON Patch.\n\nMember @a byte holds the byte index of the last read character in the input\nfile.\n\nExceptions have ids 1xx.\n\nname / id                      | example message | description\n------------------------------ | --------------- | -------------------------\njson.exception.parse_error.101 | parse error at 2: unexpected end of input; expected string literal | This error indicates a syntax error while deserializing a JSON text. The error message describes that an unexpected token (character) was encountered, and the member @a byte indicates the error position.\njson.exception.parse_error.102 | parse error at 14: missing or wrong low surrogate | JSON uses the `\\uxxxx` format to describe Unicode characters. Code points above above 0xFFFF are split into two `\\uxxxx` entries (\"surrogate pairs\"). This error indicates that the surrogate pair is incomplete or contains an invalid code point.\njson.exception.parse_error.103 | parse error: code points above 0x10FFFF are invalid | Unicode supports code points up to 0x10FFFF. Code points above 0x10FFFF are invalid.\njson.exception.parse_error.104 | parse error: JSON patch must be an array of objects | [RFC 6902](https://tools.ietf.org/html/rfc6902) requires a JSON Patch document to be a JSON document that represents an array of objects.\njson.exception.parse_error.105 | parse error: operation must have string member 'op' | An operation of a JSON Patch document must contain exactly one \"op\" member, whose value indicates the operation to perform. Its value must be one of \"add\", \"remove\", \"replace\", \"move\", \"copy\", or \"test\"; other values are errors.\njson.exception.parse_error.106 | parse error: array index '01' must not begin with '0' | An array index in a JSON Pointer ([RFC 6901](https://tools.ietf.org/html/rfc6901)) may be `0` or any number without a leading `0`.\njson.exception.parse_error.107 | parse error: JSON pointer must be empty or begin with '/' - was: 'foo' | A JSON Pointer must be a Unicode string containing a sequence of zero or more reference tokens, each prefixed by a `/` character.\njson.exception.parse_error.108 | parse error: escape character '~' must be followed with '0' or '1' | In a JSON Pointer, only `~0` and `~1` are valid escape sequences.\njson.exception.parse_error.109 | parse error: array index 'one' is not a number | A JSON Pointer array index must be a number.\njson.exception.parse_error.110 | parse error at 1: cannot read 2 bytes from vector | When parsing CBOR or MessagePack, the byte vector ends before the complete value has been read.\njson.exception.parse_error.112 | parse error at 1: error reading CBOR; last byte: 0xF8 | Not all types of CBOR or MessagePack are supported. This exception occurs if an unsupported byte was read.\njson.exception.parse_error.113 | parse error at 2: expected a CBOR string; last byte: 0x98 | While parsing a map key, a value that is not a string has been read.\njson.exception.parse_error.114 | parse error: Unsupported BSON record type 0x0F | The parsing of the corresponding BSON record type is not implemented (yet).\njson.exception.parse_error.115 | parse error at byte 5: syntax error while parsing UBJSON high-precision number: invalid number text: 1A | A UBJSON high-precision number could not be parsed.\n\n@note For an input with n bytes, 1 is the index of the first character and n+1\n      is the index of the terminating null byte or the end of file. This also\n      holds true when reading a byte vector (CBOR or MessagePack).\n\n@liveexample{The following code shows how a `parse_error` exception can be\ncaught.,parse_error}\n\n@sa - @ref exception for the base class of the library exceptions\n@sa - @ref invalid_iterator for exceptions indicating errors with iterators\n@sa - @ref type_error for exceptions indicating executing a member function with\n                    a wrong type\n@sa - @ref out_of_range for exceptions indicating access out of the defined range\n@sa - @ref other_error for exceptions indicating other library errors\n\n@since version 3.0.0\n*/\nclass parse_error : public exception\n{\n  public:\n    /*!\n    @brief create a parse error exception\n    @param[in] id_       the id of the exception\n    @param[in] pos       the position where the error occurred (or with\n                         chars_read_total=0 if the position cannot be\n                         determined)\n    @param[in] what_arg  the explanatory string\n    @return parse_error object\n    */\n    static parse_error create(int id_, const position_t& pos, const std::string& what_arg)\n    {\n        std::string w = exception::name(\"parse_error\", id_) + \"parse error\" +\n                        position_string(pos) + \": \" + what_arg;\n        return parse_error(id_, pos.chars_read_total, w.c_str());\n    }\n\n    static parse_error create(int id_, std::size_t byte_, const std::string& what_arg)\n    {\n        std::string w = exception::name(\"parse_error\", id_) + \"parse error\" +\n                        (byte_ != 0 ? (\" at byte \" + std::to_string(byte_)) : \"\") +\n                        \": \" + what_arg;\n        return parse_error(id_, byte_, w.c_str());\n    }\n\n    /*!\n    @brief byte index of the parse error\n\n    The byte index of the last read character in the input file.\n\n    @note For an input with n bytes, 1 is the index of the first character and\n          n+1 is the index of the terminating null byte or the end of file.\n          This also holds true when reading a byte vector (CBOR or MessagePack).\n    */\n    const std::size_t byte;\n\n  private:\n    parse_error(int id_, std::size_t byte_, const char* what_arg)\n        : exception(id_, what_arg), byte(byte_) {}\n\n    static std::string position_string(const position_t& pos)\n    {\n        return \" at line \" + std::to_string(pos.lines_read + 1) +\n               \", column \" + std::to_string(pos.chars_read_current_line);\n    }\n};\n\n/*!\n@brief exception indicating errors with iterators\n\nThis exception is thrown if iterators passed to a library function do not match\nthe expected semantics.\n\nExceptions have ids 2xx.\n\nname / id                           | example message | description\n----------------------------------- | --------------- | -------------------------\njson.exception.invalid_iterator.201 | iterators are not compatible | The iterators passed to constructor @ref basic_json(InputIT first, InputIT last) are not compatible, meaning they do not belong to the same container. Therefore, the range (@a first, @a last) is invalid.\njson.exception.invalid_iterator.202 | iterator does not fit current value | In an erase or insert function, the passed iterator @a pos does not belong to the JSON value for which the function was called. It hence does not define a valid position for the deletion/insertion.\njson.exception.invalid_iterator.203 | iterators do not fit current value | Either iterator passed to function @ref erase(IteratorType first, IteratorType last) does not belong to the JSON value from which values shall be erased. It hence does not define a valid range to delete values from.\njson.exception.invalid_iterator.204 | iterators out of range | When an iterator range for a primitive type (number, boolean, or string) is passed to a constructor or an erase function, this range has to be exactly (@ref begin(), @ref end()), because this is the only way the single stored value is expressed. All other ranges are invalid.\njson.exception.invalid_iterator.205 | iterator out of range | When an iterator for a primitive type (number, boolean, or string) is passed to an erase function, the iterator has to be the @ref begin() iterator, because it is the only way to address the stored value. All other iterators are invalid.\njson.exception.invalid_iterator.206 | cannot construct with iterators from null | The iterators passed to constructor @ref basic_json(InputIT first, InputIT last) belong to a JSON null value and hence to not define a valid range.\njson.exception.invalid_iterator.207 | cannot use key() for non-object iterators | The key() member function can only be used on iterators belonging to a JSON object, because other types do not have a concept of a key.\njson.exception.invalid_iterator.208 | cannot use operator[] for object iterators | The operator[] to specify a concrete offset cannot be used on iterators belonging to a JSON object, because JSON objects are unordered.\njson.exception.invalid_iterator.209 | cannot use offsets with object iterators | The offset operators (+, -, +=, -=) cannot be used on iterators belonging to a JSON object, because JSON objects are unordered.\njson.exception.invalid_iterator.210 | iterators do not fit | The iterator range passed to the insert function are not compatible, meaning they do not belong to the same container. Therefore, the range (@a first, @a last) is invalid.\njson.exception.invalid_iterator.211 | passed iterators may not belong to container | The iterator range passed to the insert function must not be a subrange of the container to insert to.\njson.exception.invalid_iterator.212 | cannot compare iterators of different containers | When two iterators are compared, they must belong to the same container.\njson.exception.invalid_iterator.213 | cannot compare order of object iterators | The order of object iterators cannot be compared, because JSON objects are unordered.\njson.exception.invalid_iterator.214 | cannot get value | Cannot get value for iterator: Either the iterator belongs to a null value or it is an iterator to a primitive type (number, boolean, or string), but the iterator is different to @ref begin().\n\n@liveexample{The following code shows how an `invalid_iterator` exception can be\ncaught.,invalid_iterator}\n\n@sa - @ref exception for the base class of the library exceptions\n@sa - @ref parse_error for exceptions indicating a parse error\n@sa - @ref type_error for exceptions indicating executing a member function with\n                    a wrong type\n@sa - @ref out_of_range for exceptions indicating access out of the defined range\n@sa - @ref other_error for exceptions indicating other library errors\n\n@since version 3.0.0\n*/\nclass invalid_iterator : public exception\n{\n  public:\n    static invalid_iterator create(int id_, const std::string& what_arg)\n    {\n        std::string w = exception::name(\"invalid_iterator\", id_) + what_arg;\n        return invalid_iterator(id_, w.c_str());\n    }\n\n  private:\n    JSON_HEDLEY_NON_NULL(3)\n    invalid_iterator(int id_, const char* what_arg)\n        : exception(id_, what_arg) {}\n};\n\n/*!\n@brief exception indicating executing a member function with a wrong type\n\nThis exception is thrown in case of a type error; that is, a library function is\nexecuted on a JSON value whose type does not match the expected semantics.\n\nExceptions have ids 3xx.\n\nname / id                     | example message | description\n----------------------------- | --------------- | -------------------------\njson.exception.type_error.301 | cannot create object from initializer list | To create an object from an initializer list, the initializer list must consist only of a list of pairs whose first element is a string. When this constraint is violated, an array is created instead.\njson.exception.type_error.302 | type must be object, but is array | During implicit or explicit value conversion, the JSON type must be compatible to the target type. For instance, a JSON string can only be converted into string types, but not into numbers or boolean types.\njson.exception.type_error.303 | incompatible ReferenceType for get_ref, actual type is object | To retrieve a reference to a value stored in a @ref basic_json object with @ref get_ref, the type of the reference must match the value type. For instance, for a JSON array, the @a ReferenceType must be @ref array_t &.\njson.exception.type_error.304 | cannot use at() with string | The @ref at() member functions can only be executed for certain JSON types.\njson.exception.type_error.305 | cannot use operator[] with string | The @ref operator[] member functions can only be executed for certain JSON types.\njson.exception.type_error.306 | cannot use value() with string | The @ref value() member functions can only be executed for certain JSON types.\njson.exception.type_error.307 | cannot use erase() with string | The @ref erase() member functions can only be executed for certain JSON types.\njson.exception.type_error.308 | cannot use push_back() with string | The @ref push_back() and @ref operator+= member functions can only be executed for certain JSON types.\njson.exception.type_error.309 | cannot use insert() with | The @ref insert() member functions can only be executed for certain JSON types.\njson.exception.type_error.310 | cannot use swap() with number | The @ref swap() member functions can only be executed for certain JSON types.\njson.exception.type_error.311 | cannot use emplace_back() with string | The @ref emplace_back() member function can only be executed for certain JSON types.\njson.exception.type_error.312 | cannot use update() with string | The @ref update() member functions can only be executed for certain JSON types.\njson.exception.type_error.313 | invalid value to unflatten | The @ref unflatten function converts an object whose keys are JSON Pointers back into an arbitrary nested JSON value. The JSON Pointers must not overlap, because then the resulting value would not be well defined.\njson.exception.type_error.314 | only objects can be unflattened | The @ref unflatten function only works for an object whose keys are JSON Pointers.\njson.exception.type_error.315 | values in object must be primitive | The @ref unflatten function only works for an object whose keys are JSON Pointers and whose values are primitive.\njson.exception.type_error.316 | invalid UTF-8 byte at index 10: 0x7E | The @ref dump function only works with UTF-8 encoded strings; that is, if you assign a `std::string` to a JSON value, make sure it is UTF-8 encoded. |\njson.exception.type_error.317 | JSON value cannot be serialized to requested format | The dynamic type of the object cannot be represented in the requested serialization format (e.g. a raw `true` or `null` JSON object cannot be serialized to BSON) |\n\n@liveexample{The following code shows how a `type_error` exception can be\ncaught.,type_error}\n\n@sa - @ref exception for the base class of the library exceptions\n@sa - @ref parse_error for exceptions indicating a parse error\n@sa - @ref invalid_iterator for exceptions indicating errors with iterators\n@sa - @ref out_of_range for exceptions indicating access out of the defined range\n@sa - @ref other_error for exceptions indicating other library errors\n\n@since version 3.0.0\n*/\nclass type_error : public exception\n{\n  public:\n    static type_error create(int id_, const std::string& what_arg)\n    {\n        std::string w = exception::name(\"type_error\", id_) + what_arg;\n        return type_error(id_, w.c_str());\n    }\n\n  private:\n    JSON_HEDLEY_NON_NULL(3)\n    type_error(int id_, const char* what_arg) : exception(id_, what_arg) {}\n};\n\n/*!\n@brief exception indicating access out of the defined range\n\nThis exception is thrown in case a library function is called on an input\nparameter that exceeds the expected range, for instance in case of array\nindices or nonexisting object keys.\n\nExceptions have ids 4xx.\n\nname / id                       | example message | description\n------------------------------- | --------------- | -------------------------\njson.exception.out_of_range.401 | array index 3 is out of range | The provided array index @a i is larger than @a size-1.\njson.exception.out_of_range.402 | array index '-' (3) is out of range | The special array index `-` in a JSON Pointer never describes a valid element of the array, but the index past the end. That is, it can only be used to add elements at this position, but not to read it.\njson.exception.out_of_range.403 | key 'foo' not found | The provided key was not found in the JSON object.\njson.exception.out_of_range.404 | unresolved reference token 'foo' | A reference token in a JSON Pointer could not be resolved.\njson.exception.out_of_range.405 | JSON pointer has no parent | The JSON Patch operations 'remove' and 'add' can not be applied to the root element of the JSON value.\njson.exception.out_of_range.406 | number overflow parsing '10E1000' | A parsed number could not be stored as without changing it to NaN or INF.\njson.exception.out_of_range.407 | number overflow serializing '9223372036854775808' | UBJSON and BSON only support integer numbers up to 9223372036854775807. (until version 3.8.0) |\njson.exception.out_of_range.408 | excessive array size: 8658170730974374167 | The size (following `#`) of an UBJSON array or object exceeds the maximal capacity. |\njson.exception.out_of_range.409 | BSON key cannot contain code point U+0000 (at byte 2) | Key identifiers to be serialized to BSON cannot contain code point U+0000, since the key is stored as zero-terminated c-string |\n\n@liveexample{The following code shows how an `out_of_range` exception can be\ncaught.,out_of_range}\n\n@sa - @ref exception for the base class of the library exceptions\n@sa - @ref parse_error for exceptions indicating a parse error\n@sa - @ref invalid_iterator for exceptions indicating errors with iterators\n@sa - @ref type_error for exceptions indicating executing a member function with\n                    a wrong type\n@sa - @ref other_error for exceptions indicating other library errors\n\n@since version 3.0.0\n*/\nclass out_of_range : public exception\n{\n  public:\n    static out_of_range create(int id_, const std::string& what_arg)\n    {\n        std::string w = exception::name(\"out_of_range\", id_) + what_arg;\n        return out_of_range(id_, w.c_str());\n    }\n\n  private:\n    JSON_HEDLEY_NON_NULL(3)\n    out_of_range(int id_, const char* what_arg) : exception(id_, what_arg) {}\n};\n\n/*!\n@brief exception indicating other library errors\n\nThis exception is thrown in case of errors that cannot be classified with the\nother exception types.\n\nExceptions have ids 5xx.\n\nname / id                      | example message | description\n------------------------------ | --------------- | -------------------------\njson.exception.other_error.501 | unsuccessful: {\"op\":\"test\",\"path\":\"/baz\", \"value\":\"bar\"} | A JSON Patch operation 'test' failed. The unsuccessful operation is also printed.\n\n@sa - @ref exception for the base class of the library exceptions\n@sa - @ref parse_error for exceptions indicating a parse error\n@sa - @ref invalid_iterator for exceptions indicating errors with iterators\n@sa - @ref type_error for exceptions indicating executing a member function with\n                    a wrong type\n@sa - @ref out_of_range for exceptions indicating access out of the defined range\n\n@liveexample{The following code shows how an `other_error` exception can be\ncaught.,other_error}\n\n@since version 3.0.0\n*/\nclass other_error : public exception\n{\n  public:\n    static other_error create(int id_, const std::string& what_arg)\n    {\n        std::string w = exception::name(\"other_error\", id_) + what_arg;\n        return other_error(id_, w.c_str());\n    }\n\n  private:\n    JSON_HEDLEY_NON_NULL(3)\n    other_error(int id_, const char* what_arg) : exception(id_, what_arg) {}\n};\n}  // namespace detail\n}  // namespace nlohmann\n\n// #include <nlohmann/detail/macro_scope.hpp>\n\n// #include <nlohmann/detail/meta/cpp_future.hpp>\n\n\n#include <cstddef> // size_t\n#include <type_traits> // conditional, enable_if, false_type, integral_constant, is_constructible, is_integral, is_same, remove_cv, remove_reference, true_type\n\nnamespace nlohmann\n{\nnamespace detail\n{\n// alias templates to reduce boilerplate\ntemplate<bool B, typename T = void>\nusing enable_if_t = typename std::enable_if<B, T>::type;\n\ntemplate<typename T>\nusing uncvref_t = typename std::remove_cv<typename std::remove_reference<T>::type>::type;\n\n// implementation of C++14 index_sequence and affiliates\n// source: https://stackoverflow.com/a/32223343\ntemplate<std::size_t... Ints>\nstruct index_sequence\n{\n    using type = index_sequence;\n    using value_type = std::size_t;\n    static constexpr std::size_t size() noexcept\n    {\n        return sizeof...(Ints);\n    }\n};\n\ntemplate<class Sequence1, class Sequence2>\nstruct merge_and_renumber;\n\ntemplate<std::size_t... I1, std::size_t... I2>\nstruct merge_and_renumber<index_sequence<I1...>, index_sequence<I2...>>\n        : index_sequence < I1..., (sizeof...(I1) + I2)... > {};\n\ntemplate<std::size_t N>\nstruct make_index_sequence\n    : merge_and_renumber < typename make_index_sequence < N / 2 >::type,\n      typename make_index_sequence < N - N / 2 >::type > {};\n\ntemplate<> struct make_index_sequence<0> : index_sequence<> {};\ntemplate<> struct make_index_sequence<1> : index_sequence<0> {};\n\ntemplate<typename... Ts>\nusing index_sequence_for = make_index_sequence<sizeof...(Ts)>;\n\n// dispatch utility (taken from ranges-v3)\ntemplate<unsigned N> struct priority_tag : priority_tag < N - 1 > {};\ntemplate<> struct priority_tag<0> {};\n\n// taken from ranges-v3\ntemplate<typename T>\nstruct static_const\n{\n    static constexpr T value{};\n};\n\ntemplate<typename T>\nconstexpr T static_const<T>::value;\n}  // namespace detail\n}  // namespace nlohmann\n\n// #include <nlohmann/detail/meta/type_traits.hpp>\n\n\n#include <limits> // numeric_limits\n#include <type_traits> // false_type, is_constructible, is_integral, is_same, true_type\n#include <utility> // declval\n\n// #include <nlohmann/detail/iterators/iterator_traits.hpp>\n\n\n#include <iterator> // random_access_iterator_tag\n\n// #include <nlohmann/detail/meta/void_t.hpp>\n\n\nnamespace nlohmann\n{\nnamespace detail\n{\ntemplate<typename ...Ts> struct make_void\n{\n    using type = void;\n};\ntemplate<typename ...Ts> using void_t = typename make_void<Ts...>::type;\n} // namespace detail\n}  // namespace nlohmann\n\n// #include <nlohmann/detail/meta/cpp_future.hpp>\n\n\nnamespace nlohmann\n{\nnamespace detail\n{\ntemplate<typename It, typename = void>\nstruct iterator_types {};\n\ntemplate<typename It>\nstruct iterator_types <\n    It,\n    void_t<typename It::difference_type, typename It::value_type, typename It::pointer,\n    typename It::reference, typename It::iterator_category >>\n{\n    using difference_type = typename It::difference_type;\n    using value_type = typename It::value_type;\n    using pointer = typename It::pointer;\n    using reference = typename It::reference;\n    using iterator_category = typename It::iterator_category;\n};\n\n// This is required as some compilers implement std::iterator_traits in a way that\n// doesn't work with SFINAE. See https://github.com/nlohmann/json/issues/1341.\ntemplate<typename T, typename = void>\nstruct iterator_traits\n{\n};\n\ntemplate<typename T>\nstruct iterator_traits < T, enable_if_t < !std::is_pointer<T>::value >>\n            : iterator_types<T>\n{\n};\n\ntemplate<typename T>\nstruct iterator_traits<T*, enable_if_t<std::is_object<T>::value>>\n{\n    using iterator_category = std::random_access_iterator_tag;\n    using value_type = T;\n    using difference_type = ptrdiff_t;\n    using pointer = T*;\n    using reference = T&;\n};\n} // namespace detail\n} // namespace nlohmann\n\n// #include <nlohmann/detail/macro_scope.hpp>\n\n// #include <nlohmann/detail/meta/cpp_future.hpp>\n\n// #include <nlohmann/detail/meta/detected.hpp>\n\n\n#include <type_traits>\n\n// #include <nlohmann/detail/meta/void_t.hpp>\n\n\n// https://en.cppreference.com/w/cpp/experimental/is_detected\nnamespace nlohmann\n{\nnamespace detail\n{\nstruct nonesuch\n{\n    nonesuch() = delete;\n    ~nonesuch() = delete;\n    nonesuch(nonesuch const&) = delete;\n    nonesuch(nonesuch const&&) = delete;\n    void operator=(nonesuch const&) = delete;\n    void operator=(nonesuch&&) = delete;\n};\n\ntemplate<class Default,\n         class AlwaysVoid,\n         template<class...> class Op,\n         class... Args>\nstruct detector\n{\n    using value_t = std::false_type;\n    using type = Default;\n};\n\ntemplate<class Default, template<class...> class Op, class... Args>\nstruct detector<Default, void_t<Op<Args...>>, Op, Args...>\n{\n    using value_t = std::true_type;\n    using type = Op<Args...>;\n};\n\ntemplate<template<class...> class Op, class... Args>\nusing is_detected = typename detector<nonesuch, void, Op, Args...>::value_t;\n\ntemplate<template<class...> class Op, class... Args>\nusing detected_t = typename detector<nonesuch, void, Op, Args...>::type;\n\ntemplate<class Default, template<class...> class Op, class... Args>\nusing detected_or = detector<Default, void, Op, Args...>;\n\ntemplate<class Default, template<class...> class Op, class... Args>\nusing detected_or_t = typename detected_or<Default, Op, Args...>::type;\n\ntemplate<class Expected, template<class...> class Op, class... Args>\nusing is_detected_exact = std::is_same<Expected, detected_t<Op, Args...>>;\n\ntemplate<class To, template<class...> class Op, class... Args>\nusing is_detected_convertible =\n    std::is_convertible<detected_t<Op, Args...>, To>;\n}  // namespace detail\n}  // namespace nlohmann\n\n// #include <nlohmann/json_fwd.hpp>\n#ifndef INCLUDE_NLOHMANN_JSON_FWD_HPP_\n#define INCLUDE_NLOHMANN_JSON_FWD_HPP_\n\n#include <cstdint> // int64_t, uint64_t\n#include <map> // map\n#include <memory> // allocator\n#include <string> // string\n#include <vector> // vector\n\n/*!\n@brief namespace for Niels Lohmann\n@see https://github.com/nlohmann\n@since version 1.0.0\n*/\nnamespace nlohmann\n{\n/*!\n@brief default JSONSerializer template argument\n\nThis serializer ignores the template arguments and uses ADL\n([argument-dependent lookup](https://en.cppreference.com/w/cpp/language/adl))\nfor serialization.\n*/\ntemplate<typename T = void, typename SFINAE = void>\nstruct adl_serializer;\n\ntemplate<template<typename U, typename V, typename... Args> class ObjectType =\n         std::map,\n         template<typename U, typename... Args> class ArrayType = std::vector,\n         class StringType = std::string, class BooleanType = bool,\n         class NumberIntegerType = std::int64_t,\n         class NumberUnsignedType = std::uint64_t,\n         class NumberFloatType = double,\n         template<typename U> class AllocatorType = std::allocator,\n         template<typename T, typename SFINAE = void> class JSONSerializer =\n         adl_serializer,\n         class BinaryType = std::vector<std::uint8_t>>\nclass basic_json;\n\n/*!\n@brief JSON Pointer\n\nA JSON pointer defines a string syntax for identifying a specific value\nwithin a JSON document. It can be used with functions `at` and\n`operator[]`. Furthermore, JSON pointers are the base for JSON patches.\n\n@sa [RFC 6901](https://tools.ietf.org/html/rfc6901)\n\n@since version 2.0.0\n*/\ntemplate<typename BasicJsonType>\nclass json_pointer;\n\n/*!\n@brief default JSON class\n\nThis type is the default specialization of the @ref basic_json class which\nuses the standard template types.\n\n@since version 1.0.0\n*/\nusing json = basic_json<>;\n\ntemplate<class Key, class T, class IgnoredLess, class Allocator>\nstruct ordered_map;\n\n/*!\n@brief ordered JSON class\n\nThis type preserves the insertion order of object keys.\n\n@since version 3.9.0\n*/\nusing ordered_json = basic_json<nlohmann::ordered_map>;\n\n}  // namespace nlohmann\n\n#endif  // INCLUDE_NLOHMANN_JSON_FWD_HPP_\n\n\nnamespace nlohmann\n{\n/*!\n@brief detail namespace with internal helper functions\n\nThis namespace collects functions that should not be exposed,\nimplementations of some @ref basic_json methods, and meta-programming helpers.\n\n@since version 2.1.0\n*/\nnamespace detail\n{\n/////////////\n// helpers //\n/////////////\n\n// Note to maintainers:\n//\n// Every trait in this file expects a non CV-qualified type.\n// The only exceptions are in the 'aliases for detected' section\n// (i.e. those of the form: decltype(T::member_function(std::declval<T>())))\n//\n// In this case, T has to be properly CV-qualified to constraint the function arguments\n// (e.g. to_json(BasicJsonType&, const T&))\n\ntemplate<typename> struct is_basic_json : std::false_type {};\n\nNLOHMANN_BASIC_JSON_TPL_DECLARATION\nstruct is_basic_json<NLOHMANN_BASIC_JSON_TPL> : std::true_type {};\n\n//////////////////////\n// json_ref helpers //\n//////////////////////\n\ntemplate<typename>\nclass json_ref;\n\ntemplate<typename>\nstruct is_json_ref : std::false_type {};\n\ntemplate<typename T>\nstruct is_json_ref<json_ref<T>> : std::true_type {};\n\n//////////////////////////\n// aliases for detected //\n//////////////////////////\n\ntemplate<typename T>\nusing mapped_type_t = typename T::mapped_type;\n\ntemplate<typename T>\nusing key_type_t = typename T::key_type;\n\ntemplate<typename T>\nusing value_type_t = typename T::value_type;\n\ntemplate<typename T>\nusing difference_type_t = typename T::difference_type;\n\ntemplate<typename T>\nusing pointer_t = typename T::pointer;\n\ntemplate<typename T>\nusing reference_t = typename T::reference;\n\ntemplate<typename T>\nusing iterator_category_t = typename T::iterator_category;\n\ntemplate<typename T>\nusing iterator_t = typename T::iterator;\n\ntemplate<typename T, typename... Args>\nusing to_json_function = decltype(T::to_json(std::declval<Args>()...));\n\ntemplate<typename T, typename... Args>\nusing from_json_function = decltype(T::from_json(std::declval<Args>()...));\n\ntemplate<typename T, typename U>\nusing get_template_function = decltype(std::declval<T>().template get<U>());\n\n// trait checking if JSONSerializer<T>::from_json(json const&, udt&) exists\ntemplate<typename BasicJsonType, typename T, typename = void>\nstruct has_from_json : std::false_type {};\n\n// trait checking if j.get<T> is valid\n// use this trait instead of std::is_constructible or std::is_convertible,\n// both rely on, or make use of implicit conversions, and thus fail when T\n// has several constructors/operator= (see https://github.com/nlohmann/json/issues/958)\ntemplate <typename BasicJsonType, typename T>\nstruct is_getable\n{\n    static constexpr bool value = is_detected<get_template_function, const BasicJsonType&, T>::value;\n};\n\ntemplate<typename BasicJsonType, typename T>\nstruct has_from_json < BasicJsonType, T,\n           enable_if_t < !is_basic_json<T>::value >>\n{\n    using serializer = typename BasicJsonType::template json_serializer<T, void>;\n\n    static constexpr bool value =\n        is_detected_exact<void, from_json_function, serializer,\n        const BasicJsonType&, T&>::value;\n};\n\n// This trait checks if JSONSerializer<T>::from_json(json const&) exists\n// this overload is used for non-default-constructible user-defined-types\ntemplate<typename BasicJsonType, typename T, typename = void>\nstruct has_non_default_from_json : std::false_type {};\n\ntemplate<typename BasicJsonType, typename T>\nstruct has_non_default_from_json < BasicJsonType, T, enable_if_t < !is_basic_json<T>::value >>\n{\n    using serializer = typename BasicJsonType::template json_serializer<T, void>;\n\n    static constexpr bool value =\n        is_detected_exact<T, from_json_function, serializer,\n        const BasicJsonType&>::value;\n};\n\n// This trait checks if BasicJsonType::json_serializer<T>::to_json exists\n// Do not evaluate the trait when T is a basic_json type, to avoid template instantiation infinite recursion.\ntemplate<typename BasicJsonType, typename T, typename = void>\nstruct has_to_json : std::false_type {};\n\ntemplate<typename BasicJsonType, typename T>\nstruct has_to_json < BasicJsonType, T, enable_if_t < !is_basic_json<T>::value >>\n{\n    using serializer = typename BasicJsonType::template json_serializer<T, void>;\n\n    static constexpr bool value =\n        is_detected_exact<void, to_json_function, serializer, BasicJsonType&,\n        T>::value;\n};\n\n\n///////////////////\n// is_ functions //\n///////////////////\n\ntemplate<typename T, typename = void>\nstruct is_iterator_traits : std::false_type {};\n\ntemplate<typename T>\nstruct is_iterator_traits<iterator_traits<T>>\n{\n  private:\n    using traits = iterator_traits<T>;\n\n  public:\n    static constexpr auto value =\n        is_detected<value_type_t, traits>::value &&\n        is_detected<difference_type_t, traits>::value &&\n        is_detected<pointer_t, traits>::value &&\n        is_detected<iterator_category_t, traits>::value &&\n        is_detected<reference_t, traits>::value;\n};\n\n// source: https://stackoverflow.com/a/37193089/4116453\n\ntemplate<typename T, typename = void>\nstruct is_complete_type : std::false_type {};\n\ntemplate<typename T>\nstruct is_complete_type<T, decltype(void(sizeof(T)))> : std::true_type {};\n\ntemplate<typename BasicJsonType, typename CompatibleObjectType,\n         typename = void>\nstruct is_compatible_object_type_impl : std::false_type {};\n\ntemplate<typename BasicJsonType, typename CompatibleObjectType>\nstruct is_compatible_object_type_impl <\n    BasicJsonType, CompatibleObjectType,\n    enable_if_t < is_detected<mapped_type_t, CompatibleObjectType>::value&&\n    is_detected<key_type_t, CompatibleObjectType>::value >>\n{\n\n    using object_t = typename BasicJsonType::object_t;\n\n    // macOS's is_constructible does not play well with nonesuch...\n    static constexpr bool value =\n        std::is_constructible<typename object_t::key_type,\n        typename CompatibleObjectType::key_type>::value &&\n        std::is_constructible<typename object_t::mapped_type,\n        typename CompatibleObjectType::mapped_type>::value;\n};\n\ntemplate<typename BasicJsonType, typename CompatibleObjectType>\nstruct is_compatible_object_type\n    : is_compatible_object_type_impl<BasicJsonType, CompatibleObjectType> {};\n\ntemplate<typename BasicJsonType, typename ConstructibleObjectType,\n         typename = void>\nstruct is_constructible_object_type_impl : std::false_type {};\n\ntemplate<typename BasicJsonType, typename ConstructibleObjectType>\nstruct is_constructible_object_type_impl <\n    BasicJsonType, ConstructibleObjectType,\n    enable_if_t < is_detected<mapped_type_t, ConstructibleObjectType>::value&&\n    is_detected<key_type_t, ConstructibleObjectType>::value >>\n{\n    using object_t = typename BasicJsonType::object_t;\n\n    static constexpr bool value =\n        (std::is_default_constructible<ConstructibleObjectType>::value &&\n         (std::is_move_assignable<ConstructibleObjectType>::value ||\n          std::is_copy_assignable<ConstructibleObjectType>::value) &&\n         (std::is_constructible<typename ConstructibleObjectType::key_type,\n          typename object_t::key_type>::value &&\n          std::is_same <\n          typename object_t::mapped_type,\n          typename ConstructibleObjectType::mapped_type >::value)) ||\n        (has_from_json<BasicJsonType,\n         typename ConstructibleObjectType::mapped_type>::value ||\n         has_non_default_from_json <\n         BasicJsonType,\n         typename ConstructibleObjectType::mapped_type >::value);\n};\n\ntemplate<typename BasicJsonType, typename ConstructibleObjectType>\nstruct is_constructible_object_type\n    : is_constructible_object_type_impl<BasicJsonType,\n      ConstructibleObjectType> {};\n\ntemplate<typename BasicJsonType, typename CompatibleStringType,\n         typename = void>\nstruct is_compatible_string_type_impl : std::false_type {};\n\ntemplate<typename BasicJsonType, typename CompatibleStringType>\nstruct is_compatible_string_type_impl <\n    BasicJsonType, CompatibleStringType,\n    enable_if_t<is_detected_exact<typename BasicJsonType::string_t::value_type,\n    value_type_t, CompatibleStringType>::value >>\n{\n    static constexpr auto value =\n        std::is_constructible<typename BasicJsonType::string_t, CompatibleStringType>::value;\n};\n\ntemplate<typename BasicJsonType, typename ConstructibleStringType>\nstruct is_compatible_string_type\n    : is_compatible_string_type_impl<BasicJsonType, ConstructibleStringType> {};\n\ntemplate<typename BasicJsonType, typename ConstructibleStringType,\n         typename = void>\nstruct is_constructible_string_type_impl : std::false_type {};\n\ntemplate<typename BasicJsonType, typename ConstructibleStringType>\nstruct is_constructible_string_type_impl <\n    BasicJsonType, ConstructibleStringType,\n    enable_if_t<is_detected_exact<typename BasicJsonType::string_t::value_type,\n    value_type_t, ConstructibleStringType>::value >>\n{\n    static constexpr auto value =\n        std::is_constructible<ConstructibleStringType,\n        typename BasicJsonType::string_t>::value;\n};\n\ntemplate<typename BasicJsonType, typename ConstructibleStringType>\nstruct is_constructible_string_type\n    : is_constructible_string_type_impl<BasicJsonType, ConstructibleStringType> {};\n\ntemplate<typename BasicJsonType, typename CompatibleArrayType, typename = void>\nstruct is_compatible_array_type_impl : std::false_type {};\n\ntemplate<typename BasicJsonType, typename CompatibleArrayType>\nstruct is_compatible_array_type_impl <\n    BasicJsonType, CompatibleArrayType,\n    enable_if_t < is_detected<value_type_t, CompatibleArrayType>::value&&\n    is_detected<iterator_t, CompatibleArrayType>::value&&\n// This is needed because json_reverse_iterator has a ::iterator type...\n// Therefore it is detected as a CompatibleArrayType.\n// The real fix would be to have an Iterable concept.\n    !is_iterator_traits <\n    iterator_traits<CompatibleArrayType >>::value >>\n{\n    static constexpr bool value =\n        std::is_constructible<BasicJsonType,\n        typename CompatibleArrayType::value_type>::value;\n};\n\ntemplate<typename BasicJsonType, typename CompatibleArrayType>\nstruct is_compatible_array_type\n    : is_compatible_array_type_impl<BasicJsonType, CompatibleArrayType> {};\n\ntemplate<typename BasicJsonType, typename ConstructibleArrayType, typename = void>\nstruct is_constructible_array_type_impl : std::false_type {};\n\ntemplate<typename BasicJsonType, typename ConstructibleArrayType>\nstruct is_constructible_array_type_impl <\n    BasicJsonType, ConstructibleArrayType,\n    enable_if_t<std::is_same<ConstructibleArrayType,\n    typename BasicJsonType::value_type>::value >>\n            : std::true_type {};\n\ntemplate<typename BasicJsonType, typename ConstructibleArrayType>\nstruct is_constructible_array_type_impl <\n    BasicJsonType, ConstructibleArrayType,\n    enable_if_t < !std::is_same<ConstructibleArrayType,\n    typename BasicJsonType::value_type>::value&&\n    std::is_default_constructible<ConstructibleArrayType>::value&&\n(std::is_move_assignable<ConstructibleArrayType>::value ||\n std::is_copy_assignable<ConstructibleArrayType>::value)&&\nis_detected<value_type_t, ConstructibleArrayType>::value&&\nis_detected<iterator_t, ConstructibleArrayType>::value&&\nis_complete_type <\ndetected_t<value_type_t, ConstructibleArrayType >>::value >>\n{\n    static constexpr bool value =\n        // This is needed because json_reverse_iterator has a ::iterator type,\n        // furthermore, std::back_insert_iterator (and other iterators) have a\n        // base class `iterator`... Therefore it is detected as a\n        // ConstructibleArrayType. The real fix would be to have an Iterable\n        // concept.\n        !is_iterator_traits<iterator_traits<ConstructibleArrayType>>::value &&\n\n        (std::is_same<typename ConstructibleArrayType::value_type,\n         typename BasicJsonType::array_t::value_type>::value ||\n         has_from_json<BasicJsonType,\n         typename ConstructibleArrayType::value_type>::value ||\n         has_non_default_from_json <\n         BasicJsonType, typename ConstructibleArrayType::value_type >::value);\n};\n\ntemplate<typename BasicJsonType, typename ConstructibleArrayType>\nstruct is_constructible_array_type\n    : is_constructible_array_type_impl<BasicJsonType, ConstructibleArrayType> {};\n\ntemplate<typename RealIntegerType, typename CompatibleNumberIntegerType,\n         typename = void>\nstruct is_compatible_integer_type_impl : std::false_type {};\n\ntemplate<typename RealIntegerType, typename CompatibleNumberIntegerType>\nstruct is_compatible_integer_type_impl <\n    RealIntegerType, CompatibleNumberIntegerType,\n    enable_if_t < std::is_integral<RealIntegerType>::value&&\n    std::is_integral<CompatibleNumberIntegerType>::value&&\n    !std::is_same<bool, CompatibleNumberIntegerType>::value >>\n{\n    // is there an assert somewhere on overflows?\n    using RealLimits = std::numeric_limits<RealIntegerType>;\n    using CompatibleLimits = std::numeric_limits<CompatibleNumberIntegerType>;\n\n    static constexpr auto value =\n        std::is_constructible<RealIntegerType,\n        CompatibleNumberIntegerType>::value &&\n        CompatibleLimits::is_integer &&\n        RealLimits::is_signed == CompatibleLimits::is_signed;\n};\n\ntemplate<typename RealIntegerType, typename CompatibleNumberIntegerType>\nstruct is_compatible_integer_type\n    : is_compatible_integer_type_impl<RealIntegerType,\n      CompatibleNumberIntegerType> {};\n\ntemplate<typename BasicJsonType, typename CompatibleType, typename = void>\nstruct is_compatible_type_impl: std::false_type {};\n\ntemplate<typename BasicJsonType, typename CompatibleType>\nstruct is_compatible_type_impl <\n    BasicJsonType, CompatibleType,\n    enable_if_t<is_complete_type<CompatibleType>::value >>\n{\n    static constexpr bool value =\n        has_to_json<BasicJsonType, CompatibleType>::value;\n};\n\ntemplate<typename BasicJsonType, typename CompatibleType>\nstruct is_compatible_type\n    : is_compatible_type_impl<BasicJsonType, CompatibleType> {};\n\n// https://en.cppreference.com/w/cpp/types/conjunction\ntemplate<class...> struct conjunction : std::true_type { };\ntemplate<class B1> struct conjunction<B1> : B1 { };\ntemplate<class B1, class... Bn>\nstruct conjunction<B1, Bn...>\n: std::conditional<bool(B1::value), conjunction<Bn...>, B1>::type {};\n\ntemplate<typename T1, typename T2>\nstruct is_constructible_tuple : std::false_type {};\n\ntemplate<typename T1, typename... Args>\nstruct is_constructible_tuple<T1, std::tuple<Args...>> : conjunction<std::is_constructible<T1, Args>...> {};\n}  // namespace detail\n}  // namespace nlohmann\n\n// #include <nlohmann/detail/value_t.hpp>\n\n\n#include <array> // array\n#include <cstddef> // size_t\n#include <cstdint> // uint8_t\n#include <string> // string\n\nnamespace nlohmann\n{\nnamespace detail\n{\n///////////////////////////\n// JSON type enumeration //\n///////////////////////////\n\n/*!\n@brief the JSON type enumeration\n\nThis enumeration collects the different JSON types. It is internally used to\ndistinguish the stored values, and the functions @ref basic_json::is_null(),\n@ref basic_json::is_object(), @ref basic_json::is_array(),\n@ref basic_json::is_string(), @ref basic_json::is_boolean(),\n@ref basic_json::is_number() (with @ref basic_json::is_number_integer(),\n@ref basic_json::is_number_unsigned(), and @ref basic_json::is_number_float()),\n@ref basic_json::is_discarded(), @ref basic_json::is_primitive(), and\n@ref basic_json::is_structured() rely on it.\n\n@note There are three enumeration entries (number_integer, number_unsigned, and\nnumber_float), because the library distinguishes these three types for numbers:\n@ref basic_json::number_unsigned_t is used for unsigned integers,\n@ref basic_json::number_integer_t is used for signed integers, and\n@ref basic_json::number_float_t is used for floating-point numbers or to\napproximate integers which do not fit in the limits of their respective type.\n\n@sa @ref basic_json::basic_json(const value_t value_type) -- create a JSON\nvalue with the default value for a given type\n\n@since version 1.0.0\n*/\nenum class value_t : std::uint8_t\n{\n    null,             ///< null value\n    object,           ///< object (unordered set of name/value pairs)\n    array,            ///< array (ordered collection of values)\n    string,           ///< string value\n    boolean,          ///< boolean value\n    number_integer,   ///< number value (signed integer)\n    number_unsigned,  ///< number value (unsigned integer)\n    number_float,     ///< number value (floating-point)\n    binary,           ///< binary array (ordered collection of bytes)\n    discarded         ///< discarded by the parser callback function\n};\n\n/*!\n@brief comparison operator for JSON types\n\nReturns an ordering that is similar to Python:\n- order: null < boolean < number < object < array < string < binary\n- furthermore, each type is not smaller than itself\n- discarded values are not comparable\n- binary is represented as a b\"\" string in python and directly comparable to a\n  string; however, making a binary array directly comparable with a string would\n  be surprising behavior in a JSON file.\n\n@since version 1.0.0\n*/\ninline bool operator<(const value_t lhs, const value_t rhs) noexcept\n{\n    static constexpr std::array<std::uint8_t, 9> order = {{\n            0 /* null */, 3 /* object */, 4 /* array */, 5 /* string */,\n            1 /* boolean */, 2 /* integer */, 2 /* unsigned */, 2 /* float */,\n            6 /* binary */\n        }\n    };\n\n    const auto l_index = static_cast<std::size_t>(lhs);\n    const auto r_index = static_cast<std::size_t>(rhs);\n    return l_index < order.size() && r_index < order.size() && order[l_index] < order[r_index];\n}\n}  // namespace detail\n}  // namespace nlohmann\n\n\nnamespace nlohmann\n{\nnamespace detail\n{\ntemplate<typename BasicJsonType>\nvoid from_json(const BasicJsonType& j, typename std::nullptr_t& n)\n{\n    if (JSON_HEDLEY_UNLIKELY(!j.is_null()))\n    {\n        JSON_THROW(type_error::create(302, \"type must be null, but is \" + std::string(j.type_name())));\n    }\n    n = nullptr;\n}\n\n// overloads for basic_json template parameters\ntemplate < typename BasicJsonType, typename ArithmeticType,\n           enable_if_t < std::is_arithmetic<ArithmeticType>::value&&\n                         !std::is_same<ArithmeticType, typename BasicJsonType::boolean_t>::value,\n                         int > = 0 >\nvoid get_arithmetic_value(const BasicJsonType& j, ArithmeticType& val)\n{\n    switch (static_cast<value_t>(j))\n    {\n        case value_t::number_unsigned:\n        {\n            val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_unsigned_t*>());\n            break;\n        }\n        case value_t::number_integer:\n        {\n            val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_integer_t*>());\n            break;\n        }\n        case value_t::number_float:\n        {\n            val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_float_t*>());\n            break;\n        }\n\n        default:\n            JSON_THROW(type_error::create(302, \"type must be number, but is \" + std::string(j.type_name())));\n    }\n}\n\ntemplate<typename BasicJsonType>\nvoid from_json(const BasicJsonType& j, typename BasicJsonType::boolean_t& b)\n{\n    if (JSON_HEDLEY_UNLIKELY(!j.is_boolean()))\n    {\n        JSON_THROW(type_error::create(302, \"type must be boolean, but is \" + std::string(j.type_name())));\n    }\n    b = *j.template get_ptr<const typename BasicJsonType::boolean_t*>();\n}\n\ntemplate<typename BasicJsonType>\nvoid from_json(const BasicJsonType& j, typename BasicJsonType::string_t& s)\n{\n    if (JSON_HEDLEY_UNLIKELY(!j.is_string()))\n    {\n        JSON_THROW(type_error::create(302, \"type must be string, but is \" + std::string(j.type_name())));\n    }\n    s = *j.template get_ptr<const typename BasicJsonType::string_t*>();\n}\n\ntemplate <\n    typename BasicJsonType, typename ConstructibleStringType,\n    enable_if_t <\n        is_constructible_string_type<BasicJsonType, ConstructibleStringType>::value&&\n        !std::is_same<typename BasicJsonType::string_t,\n                      ConstructibleStringType>::value,\n        int > = 0 >\nvoid from_json(const BasicJsonType& j, ConstructibleStringType& s)\n{\n    if (JSON_HEDLEY_UNLIKELY(!j.is_string()))\n    {\n        JSON_THROW(type_error::create(302, \"type must be string, but is \" + std::string(j.type_name())));\n    }\n\n    s = *j.template get_ptr<const typename BasicJsonType::string_t*>();\n}\n\ntemplate<typename BasicJsonType>\nvoid from_json(const BasicJsonType& j, typename BasicJsonType::number_float_t& val)\n{\n    get_arithmetic_value(j, val);\n}\n\ntemplate<typename BasicJsonType>\nvoid from_json(const BasicJsonType& j, typename BasicJsonType::number_unsigned_t& val)\n{\n    get_arithmetic_value(j, val);\n}\n\ntemplate<typename BasicJsonType>\nvoid from_json(const BasicJsonType& j, typename BasicJsonType::number_integer_t& val)\n{\n    get_arithmetic_value(j, val);\n}\n\ntemplate<typename BasicJsonType, typename EnumType,\n         enable_if_t<std::is_enum<EnumType>::value, int> = 0>\nvoid from_json(const BasicJsonType& j, EnumType& e)\n{\n    typename std::underlying_type<EnumType>::type val;\n    get_arithmetic_value(j, val);\n    e = static_cast<EnumType>(val);\n}\n\n// forward_list doesn't have an insert method\ntemplate<typename BasicJsonType, typename T, typename Allocator,\n         enable_if_t<is_getable<BasicJsonType, T>::value, int> = 0>\nvoid from_json(const BasicJsonType& j, std::forward_list<T, Allocator>& l)\n{\n    if (JSON_HEDLEY_UNLIKELY(!j.is_array()))\n    {\n        JSON_THROW(type_error::create(302, \"type must be array, but is \" + std::string(j.type_name())));\n    }\n    l.clear();\n    std::transform(j.rbegin(), j.rend(),\n                   std::front_inserter(l), [](const BasicJsonType & i)\n    {\n        return i.template get<T>();\n    });\n}\n\n// valarray doesn't have an insert method\ntemplate<typename BasicJsonType, typename T,\n         enable_if_t<is_getable<BasicJsonType, T>::value, int> = 0>\nvoid from_json(const BasicJsonType& j, std::valarray<T>& l)\n{\n    if (JSON_HEDLEY_UNLIKELY(!j.is_array()))\n    {\n        JSON_THROW(type_error::create(302, \"type must be array, but is \" + std::string(j.type_name())));\n    }\n    l.resize(j.size());\n    std::transform(j.begin(), j.end(), std::begin(l),\n                   [](const BasicJsonType & elem)\n    {\n        return elem.template get<T>();\n    });\n}\n\ntemplate<typename BasicJsonType, typename T, std::size_t N>\nauto from_json(const BasicJsonType& j, T (&arr)[N])\n-> decltype(j.template get<T>(), void())\n{\n    for (std::size_t i = 0; i < N; ++i)\n    {\n        arr[i] = j.at(i).template get<T>();\n    }\n}\n\ntemplate<typename BasicJsonType>\nvoid from_json_array_impl(const BasicJsonType& j, typename BasicJsonType::array_t& arr, priority_tag<3> /*unused*/)\n{\n    arr = *j.template get_ptr<const typename BasicJsonType::array_t*>();\n}\n\ntemplate<typename BasicJsonType, typename T, std::size_t N>\nauto from_json_array_impl(const BasicJsonType& j, std::array<T, N>& arr,\n                          priority_tag<2> /*unused*/)\n-> decltype(j.template get<T>(), void())\n{\n    for (std::size_t i = 0; i < N; ++i)\n    {\n        arr[i] = j.at(i).template get<T>();\n    }\n}\n\ntemplate<typename BasicJsonType, typename ConstructibleArrayType>\nauto from_json_array_impl(const BasicJsonType& j, ConstructibleArrayType& arr, priority_tag<1> /*unused*/)\n-> decltype(\n    arr.reserve(std::declval<typename ConstructibleArrayType::size_type>()),\n    j.template get<typename ConstructibleArrayType::value_type>(),\n    void())\n{\n    using std::end;\n\n    ConstructibleArrayType ret;\n    ret.reserve(j.size());\n    std::transform(j.begin(), j.end(),\n                   std::inserter(ret, end(ret)), [](const BasicJsonType & i)\n    {\n        // get<BasicJsonType>() returns *this, this won't call a from_json\n        // method when value_type is BasicJsonType\n        return i.template get<typename ConstructibleArrayType::value_type>();\n    });\n    arr = std::move(ret);\n}\n\ntemplate<typename BasicJsonType, typename ConstructibleArrayType>\nvoid from_json_array_impl(const BasicJsonType& j, ConstructibleArrayType& arr,\n                          priority_tag<0> /*unused*/)\n{\n    using std::end;\n\n    ConstructibleArrayType ret;\n    std::transform(\n        j.begin(), j.end(), std::inserter(ret, end(ret)),\n        [](const BasicJsonType & i)\n    {\n        // get<BasicJsonType>() returns *this, this won't call a from_json\n        // method when value_type is BasicJsonType\n        return i.template get<typename ConstructibleArrayType::value_type>();\n    });\n    arr = std::move(ret);\n}\n\ntemplate < typename BasicJsonType, typename ConstructibleArrayType,\n           enable_if_t <\n               is_constructible_array_type<BasicJsonType, ConstructibleArrayType>::value&&\n               !is_constructible_object_type<BasicJsonType, ConstructibleArrayType>::value&&\n               !is_constructible_string_type<BasicJsonType, ConstructibleArrayType>::value&&\n               !std::is_same<ConstructibleArrayType, typename BasicJsonType::binary_t>::value&&\n               !is_basic_json<ConstructibleArrayType>::value,\n               int > = 0 >\nauto from_json(const BasicJsonType& j, ConstructibleArrayType& arr)\n-> decltype(from_json_array_impl(j, arr, priority_tag<3> {}),\nj.template get<typename ConstructibleArrayType::value_type>(),\nvoid())\n{\n    if (JSON_HEDLEY_UNLIKELY(!j.is_array()))\n    {\n        JSON_THROW(type_error::create(302, \"type must be array, but is \" +\n                                      std::string(j.type_name())));\n    }\n\n    from_json_array_impl(j, arr, priority_tag<3> {});\n}\n\ntemplate<typename BasicJsonType>\nvoid from_json(const BasicJsonType& j, typename BasicJsonType::binary_t& bin)\n{\n    if (JSON_HEDLEY_UNLIKELY(!j.is_binary()))\n    {\n        JSON_THROW(type_error::create(302, \"type must be binary, but is \" + std::string(j.type_name())));\n    }\n\n    bin = *j.template get_ptr<const typename BasicJsonType::binary_t*>();\n}\n\ntemplate<typename BasicJsonType, typename ConstructibleObjectType,\n         enable_if_t<is_constructible_object_type<BasicJsonType, ConstructibleObjectType>::value, int> = 0>\nvoid from_json(const BasicJsonType& j, ConstructibleObjectType& obj)\n{\n    if (JSON_HEDLEY_UNLIKELY(!j.is_object()))\n    {\n        JSON_THROW(type_error::create(302, \"type must be object, but is \" + std::string(j.type_name())));\n    }\n\n    ConstructibleObjectType ret;\n    auto inner_object = j.template get_ptr<const typename BasicJsonType::object_t*>();\n    using value_type = typename ConstructibleObjectType::value_type;\n    std::transform(\n        inner_object->begin(), inner_object->end(),\n        std::inserter(ret, ret.begin()),\n        [](typename BasicJsonType::object_t::value_type const & p)\n    {\n        return value_type(p.first, p.second.template get<typename ConstructibleObjectType::mapped_type>());\n    });\n    obj = std::move(ret);\n}\n\n// overload for arithmetic types, not chosen for basic_json template arguments\n// (BooleanType, etc..); note: Is it really necessary to provide explicit\n// overloads for boolean_t etc. in case of a custom BooleanType which is not\n// an arithmetic type?\ntemplate < typename BasicJsonType, typename ArithmeticType,\n           enable_if_t <\n               std::is_arithmetic<ArithmeticType>::value&&\n               !std::is_same<ArithmeticType, typename BasicJsonType::number_unsigned_t>::value&&\n               !std::is_same<ArithmeticType, typename BasicJsonType::number_integer_t>::value&&\n               !std::is_same<ArithmeticType, typename BasicJsonType::number_float_t>::value&&\n               !std::is_same<ArithmeticType, typename BasicJsonType::boolean_t>::value,\n               int > = 0 >\nvoid from_json(const BasicJsonType& j, ArithmeticType& val)\n{\n    switch (static_cast<value_t>(j))\n    {\n        case value_t::number_unsigned:\n        {\n            val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_unsigned_t*>());\n            break;\n        }\n        case value_t::number_integer:\n        {\n            val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_integer_t*>());\n            break;\n        }\n        case value_t::number_float:\n        {\n            val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_float_t*>());\n            break;\n        }\n        case value_t::boolean:\n        {\n            val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::boolean_t*>());\n            break;\n        }\n\n        default:\n            JSON_THROW(type_error::create(302, \"type must be number, but is \" + std::string(j.type_name())));\n    }\n}\n\ntemplate<typename BasicJsonType, typename A1, typename A2>\nvoid from_json(const BasicJsonType& j, std::pair<A1, A2>& p)\n{\n    p = {j.at(0).template get<A1>(), j.at(1).template get<A2>()};\n}\n\ntemplate<typename BasicJsonType, typename Tuple, std::size_t... Idx>\nvoid from_json_tuple_impl(const BasicJsonType& j, Tuple& t, index_sequence<Idx...> /*unused*/)\n{\n    t = std::make_tuple(j.at(Idx).template get<typename std::tuple_element<Idx, Tuple>::type>()...);\n}\n\ntemplate<typename BasicJsonType, typename... Args>\nvoid from_json(const BasicJsonType& j, std::tuple<Args...>& t)\n{\n    from_json_tuple_impl(j, t, index_sequence_for<Args...> {});\n}\n\ntemplate < typename BasicJsonType, typename Key, typename Value, typename Compare, typename Allocator,\n           typename = enable_if_t < !std::is_constructible <\n                                        typename BasicJsonType::string_t, Key >::value >>\nvoid from_json(const BasicJsonType& j, std::map<Key, Value, Compare, Allocator>& m)\n{\n    if (JSON_HEDLEY_UNLIKELY(!j.is_array()))\n    {\n        JSON_THROW(type_error::create(302, \"type must be array, but is \" + std::string(j.type_name())));\n    }\n    m.clear();\n    for (const auto& p : j)\n    {\n        if (JSON_HEDLEY_UNLIKELY(!p.is_array()))\n        {\n            JSON_THROW(type_error::create(302, \"type must be array, but is \" + std::string(p.type_name())));\n        }\n        m.emplace(p.at(0).template get<Key>(), p.at(1).template get<Value>());\n    }\n}\n\ntemplate < typename BasicJsonType, typename Key, typename Value, typename Hash, typename KeyEqual, typename Allocator,\n           typename = enable_if_t < !std::is_constructible <\n                                        typename BasicJsonType::string_t, Key >::value >>\nvoid from_json(const BasicJsonType& j, std::unordered_map<Key, Value, Hash, KeyEqual, Allocator>& m)\n{\n    if (JSON_HEDLEY_UNLIKELY(!j.is_array()))\n    {\n        JSON_THROW(type_error::create(302, \"type must be array, but is \" + std::string(j.type_name())));\n    }\n    m.clear();\n    for (const auto& p : j)\n    {\n        if (JSON_HEDLEY_UNLIKELY(!p.is_array()))\n        {\n            JSON_THROW(type_error::create(302, \"type must be array, but is \" + std::string(p.type_name())));\n        }\n        m.emplace(p.at(0).template get<Key>(), p.at(1).template get<Value>());\n    }\n}\n\nstruct from_json_fn\n{\n    template<typename BasicJsonType, typename T>\n    auto operator()(const BasicJsonType& j, T& val) const\n    noexcept(noexcept(from_json(j, val)))\n    -> decltype(from_json(j, val), void())\n    {\n        return from_json(j, val);\n    }\n};\n}  // namespace detail\n\n/// namespace to hold default `from_json` function\n/// to see why this is required:\n/// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4381.html\nnamespace\n{\nconstexpr const auto& from_json = detail::static_const<detail::from_json_fn>::value;\n} // namespace\n} // namespace nlohmann\n\n// #include <nlohmann/detail/conversions/to_json.hpp>\n\n\n#include <algorithm> // copy\n#include <iterator> // begin, end\n#include <string> // string\n#include <tuple> // tuple, get\n#include <type_traits> // is_same, is_constructible, is_floating_point, is_enum, underlying_type\n#include <utility> // move, forward, declval, pair\n#include <valarray> // valarray\n#include <vector> // vector\n\n// #include <nlohmann/detail/iterators/iteration_proxy.hpp>\n\n\n#include <cstddef> // size_t\n#include <iterator> // input_iterator_tag\n#include <string> // string, to_string\n#include <tuple> // tuple_size, get, tuple_element\n\n// #include <nlohmann/detail/meta/type_traits.hpp>\n\n// #include <nlohmann/detail/value_t.hpp>\n\n\nnamespace nlohmann\n{\nnamespace detail\n{\ntemplate<typename string_type>\nvoid int_to_string( string_type& target, std::size_t value )\n{\n    // For ADL\n    using std::to_string;\n    target = to_string(value);\n}\ntemplate<typename IteratorType> class iteration_proxy_value\n{\n  public:\n    using difference_type = std::ptrdiff_t;\n    using value_type = iteration_proxy_value;\n    using pointer = value_type * ;\n    using reference = value_type & ;\n    using iterator_category = std::input_iterator_tag;\n    using string_type = typename std::remove_cv< typename std::remove_reference<decltype( std::declval<IteratorType>().key() ) >::type >::type;\n\n  private:\n    /// the iterator\n    IteratorType anchor;\n    /// an index for arrays (used to create key names)\n    std::size_t array_index = 0;\n    /// last stringified array index\n    mutable std::size_t array_index_last = 0;\n    /// a string representation of the array index\n    mutable string_type array_index_str = \"0\";\n    /// an empty string (to return a reference for primitive values)\n    const string_type empty_str = \"\";\n\n  public:\n    explicit iteration_proxy_value(IteratorType it) noexcept : anchor(it) {}\n\n    /// dereference operator (needed for range-based for)\n    iteration_proxy_value& operator*()\n    {\n        return *this;\n    }\n\n    /// increment operator (needed for range-based for)\n    iteration_proxy_value& operator++()\n    {\n        ++anchor;\n        ++array_index;\n\n        return *this;\n    }\n\n    /// equality operator (needed for InputIterator)\n    bool operator==(const iteration_proxy_value& o) const\n    {\n        return anchor == o.anchor;\n    }\n\n    /// inequality operator (needed for range-based for)\n    bool operator!=(const iteration_proxy_value& o) const\n    {\n        return anchor != o.anchor;\n    }\n\n    /// return key of the iterator\n    const string_type& key() const\n    {\n        JSON_ASSERT(anchor.m_object != nullptr);\n\n        switch (anchor.m_object->type())\n        {\n            // use integer array index as key\n            case value_t::array:\n            {\n                if (array_index != array_index_last)\n                {\n                    int_to_string( array_index_str, array_index );\n                    array_index_last = array_index;\n                }\n                return array_index_str;\n            }\n\n            // use key from the object\n            case value_t::object:\n                return anchor.key();\n\n            // use an empty key for all primitive types\n            default:\n                return empty_str;\n        }\n    }\n\n    /// return value of the iterator\n    typename IteratorType::reference value() const\n    {\n        return anchor.value();\n    }\n};\n\n/// proxy class for the items() function\ntemplate<typename IteratorType> class iteration_proxy\n{\n  private:\n    /// the container to iterate\n    typename IteratorType::reference container;\n\n  public:\n    /// construct iteration proxy from a container\n    explicit iteration_proxy(typename IteratorType::reference cont) noexcept\n        : container(cont) {}\n\n    /// return iterator begin (needed for range-based for)\n    iteration_proxy_value<IteratorType> begin() noexcept\n    {\n        return iteration_proxy_value<IteratorType>(container.begin());\n    }\n\n    /// return iterator end (needed for range-based for)\n    iteration_proxy_value<IteratorType> end() noexcept\n    {\n        return iteration_proxy_value<IteratorType>(container.end());\n    }\n};\n// Structured Bindings Support\n// For further reference see https://blog.tartanllama.xyz/structured-bindings/\n// And see https://github.com/nlohmann/json/pull/1391\ntemplate<std::size_t N, typename IteratorType, enable_if_t<N == 0, int> = 0>\nauto get(const nlohmann::detail::iteration_proxy_value<IteratorType>& i) -> decltype(i.key())\n{\n    return i.key();\n}\n// Structured Bindings Support\n// For further reference see https://blog.tartanllama.xyz/structured-bindings/\n// And see https://github.com/nlohmann/json/pull/1391\ntemplate<std::size_t N, typename IteratorType, enable_if_t<N == 1, int> = 0>\nauto get(const nlohmann::detail::iteration_proxy_value<IteratorType>& i) -> decltype(i.value())\n{\n    return i.value();\n}\n}  // namespace detail\n}  // namespace nlohmann\n\n// The Addition to the STD Namespace is required to add\n// Structured Bindings Support to the iteration_proxy_value class\n// For further reference see https://blog.tartanllama.xyz/structured-bindings/\n// And see https://github.com/nlohmann/json/pull/1391\nnamespace std\n{\n#if defined(__clang__)\n    // Fix: https://github.com/nlohmann/json/issues/1401\n    #pragma clang diagnostic push\n    #pragma clang diagnostic ignored \"-Wmismatched-tags\"\n#endif\ntemplate<typename IteratorType>\nclass tuple_size<::nlohmann::detail::iteration_proxy_value<IteratorType>>\n            : public std::integral_constant<std::size_t, 2> {};\n\ntemplate<std::size_t N, typename IteratorType>\nclass tuple_element<N, ::nlohmann::detail::iteration_proxy_value<IteratorType >>\n{\n  public:\n    using type = decltype(\n                     get<N>(std::declval <\n                            ::nlohmann::detail::iteration_proxy_value<IteratorType >> ()));\n};\n#if defined(__clang__)\n    #pragma clang diagnostic pop\n#endif\n} // namespace std\n\n// #include <nlohmann/detail/meta/cpp_future.hpp>\n\n// #include <nlohmann/detail/meta/type_traits.hpp>\n\n// #include <nlohmann/detail/value_t.hpp>\n\n\nnamespace nlohmann\n{\nnamespace detail\n{\n//////////////////\n// constructors //\n//////////////////\n\ntemplate<value_t> struct external_constructor;\n\ntemplate<>\nstruct external_constructor<value_t::boolean>\n{\n    template<typename BasicJsonType>\n    static void construct(BasicJsonType& j, typename BasicJsonType::boolean_t b) noexcept\n    {\n        j.m_type = value_t::boolean;\n        j.m_value = b;\n        j.assert_invariant();\n    }\n};\n\ntemplate<>\nstruct external_constructor<value_t::string>\n{\n    template<typename BasicJsonType>\n    static void construct(BasicJsonType& j, const typename BasicJsonType::string_t& s)\n    {\n        j.m_type = value_t::string;\n        j.m_value = s;\n        j.assert_invariant();\n    }\n\n    template<typename BasicJsonType>\n    static void construct(BasicJsonType& j, typename BasicJsonType::string_t&& s)\n    {\n        j.m_type = value_t::string;\n        j.m_value = std::move(s);\n        j.assert_invariant();\n    }\n\n    template < typename BasicJsonType, typename CompatibleStringType,\n               enable_if_t < !std::is_same<CompatibleStringType, typename BasicJsonType::string_t>::value,\n                             int > = 0 >\n    static void construct(BasicJsonType& j, const CompatibleStringType& str)\n    {\n        j.m_type = value_t::string;\n        j.m_value.string = j.template create<typename BasicJsonType::string_t>(str);\n        j.assert_invariant();\n    }\n};\n\ntemplate<>\nstruct external_constructor<value_t::binary>\n{\n    template<typename BasicJsonType>\n    static void construct(BasicJsonType& j, const typename BasicJsonType::binary_t& b)\n    {\n        j.m_type = value_t::binary;\n        typename BasicJsonType::binary_t value{b};\n        j.m_value = value;\n        j.assert_invariant();\n    }\n\n    template<typename BasicJsonType>\n    static void construct(BasicJsonType& j, typename BasicJsonType::binary_t&& b)\n    {\n        j.m_type = value_t::binary;\n        typename BasicJsonType::binary_t value{std::move(b)};\n        j.m_value = value;\n        j.assert_invariant();\n    }\n};\n\ntemplate<>\nstruct external_constructor<value_t::number_float>\n{\n    template<typename BasicJsonType>\n    static void construct(BasicJsonType& j, typename BasicJsonType::number_float_t val) noexcept\n    {\n        j.m_type = value_t::number_float;\n        j.m_value = val;\n        j.assert_invariant();\n    }\n};\n\ntemplate<>\nstruct external_constructor<value_t::number_unsigned>\n{\n    template<typename BasicJsonType>\n    static void construct(BasicJsonType& j, typename BasicJsonType::number_unsigned_t val) noexcept\n    {\n        j.m_type = value_t::number_unsigned;\n        j.m_value = val;\n        j.assert_invariant();\n    }\n};\n\ntemplate<>\nstruct external_constructor<value_t::number_integer>\n{\n    template<typename BasicJsonType>\n    static void construct(BasicJsonType& j, typename BasicJsonType::number_integer_t val) noexcept\n    {\n        j.m_type = value_t::number_integer;\n        j.m_value = val;\n        j.assert_invariant();\n    }\n};\n\ntemplate<>\nstruct external_constructor<value_t::array>\n{\n    template<typename BasicJsonType>\n    static void construct(BasicJsonType& j, const typename BasicJsonType::array_t& arr)\n    {\n        j.m_type = value_t::array;\n        j.m_value = arr;\n        j.assert_invariant();\n    }\n\n    template<typename BasicJsonType>\n    static void construct(BasicJsonType& j, typename BasicJsonType::array_t&& arr)\n    {\n        j.m_type = value_t::array;\n        j.m_value = std::move(arr);\n        j.assert_invariant();\n    }\n\n    template < typename BasicJsonType, typename CompatibleArrayType,\n               enable_if_t < !std::is_same<CompatibleArrayType, typename BasicJsonType::array_t>::value,\n                             int > = 0 >\n    static void construct(BasicJsonType& j, const CompatibleArrayType& arr)\n    {\n        using std::begin;\n        using std::end;\n        j.m_type = value_t::array;\n        j.m_value.array = j.template create<typename BasicJsonType::array_t>(begin(arr), end(arr));\n        j.assert_invariant();\n    }\n\n    template<typename BasicJsonType>\n    static void construct(BasicJsonType& j, const std::vector<bool>& arr)\n    {\n        j.m_type = value_t::array;\n        j.m_value = value_t::array;\n        j.m_value.array->reserve(arr.size());\n        for (const bool x : arr)\n        {\n            j.m_value.array->push_back(x);\n        }\n        j.assert_invariant();\n    }\n\n    template<typename BasicJsonType, typename T,\n             enable_if_t<std::is_convertible<T, BasicJsonType>::value, int> = 0>\n    static void construct(BasicJsonType& j, const std::valarray<T>& arr)\n    {\n        j.m_type = value_t::array;\n        j.m_value = value_t::array;\n        j.m_value.array->resize(arr.size());\n        if (arr.size() > 0)\n        {\n            std::copy(std::begin(arr), std::end(arr), j.m_value.array->begin());\n        }\n        j.assert_invariant();\n    }\n};\n\ntemplate<>\nstruct external_constructor<value_t::object>\n{\n    template<typename BasicJsonType>\n    static void construct(BasicJsonType& j, const typename BasicJsonType::object_t& obj)\n    {\n        j.m_type = value_t::object;\n        j.m_value = obj;\n        j.assert_invariant();\n    }\n\n    template<typename BasicJsonType>\n    static void construct(BasicJsonType& j, typename BasicJsonType::object_t&& obj)\n    {\n        j.m_type = value_t::object;\n        j.m_value = std::move(obj);\n        j.assert_invariant();\n    }\n\n    template < typename BasicJsonType, typename CompatibleObjectType,\n               enable_if_t < !std::is_same<CompatibleObjectType, typename BasicJsonType::object_t>::value, int > = 0 >\n    static void construct(BasicJsonType& j, const CompatibleObjectType& obj)\n    {\n        using std::begin;\n        using std::end;\n\n        j.m_type = value_t::object;\n        j.m_value.object = j.template create<typename BasicJsonType::object_t>(begin(obj), end(obj));\n        j.assert_invariant();\n    }\n};\n\n/////////////\n// to_json //\n/////////////\n\ntemplate<typename BasicJsonType, typename T,\n         enable_if_t<std::is_same<T, typename BasicJsonType::boolean_t>::value, int> = 0>\nvoid to_json(BasicJsonType& j, T b) noexcept\n{\n    external_constructor<value_t::boolean>::construct(j, b);\n}\n\ntemplate<typename BasicJsonType, typename CompatibleString,\n         enable_if_t<std::is_constructible<typename BasicJsonType::string_t, CompatibleString>::value, int> = 0>\nvoid to_json(BasicJsonType& j, const CompatibleString& s)\n{\n    external_constructor<value_t::string>::construct(j, s);\n}\n\ntemplate<typename BasicJsonType>\nvoid to_json(BasicJsonType& j, typename BasicJsonType::string_t&& s)\n{\n    external_constructor<value_t::string>::construct(j, std::move(s));\n}\n\ntemplate<typename BasicJsonType, typename FloatType,\n         enable_if_t<std::is_floating_point<FloatType>::value, int> = 0>\nvoid to_json(BasicJsonType& j, FloatType val) noexcept\n{\n    external_constructor<value_t::number_float>::construct(j, static_cast<typename BasicJsonType::number_float_t>(val));\n}\n\ntemplate<typename BasicJsonType, typename CompatibleNumberUnsignedType,\n         enable_if_t<is_compatible_integer_type<typename BasicJsonType::number_unsigned_t, CompatibleNumberUnsignedType>::value, int> = 0>\nvoid to_json(BasicJsonType& j, CompatibleNumberUnsignedType val) noexcept\n{\n    external_constructor<value_t::number_unsigned>::construct(j, static_cast<typename BasicJsonType::number_unsigned_t>(val));\n}\n\ntemplate<typename BasicJsonType, typename CompatibleNumberIntegerType,\n         enable_if_t<is_compatible_integer_type<typename BasicJsonType::number_integer_t, CompatibleNumberIntegerType>::value, int> = 0>\nvoid to_json(BasicJsonType& j, CompatibleNumberIntegerType val) noexcept\n{\n    external_constructor<value_t::number_integer>::construct(j, static_cast<typename BasicJsonType::number_integer_t>(val));\n}\n\ntemplate<typename BasicJsonType, typename EnumType,\n         enable_if_t<std::is_enum<EnumType>::value, int> = 0>\nvoid to_json(BasicJsonType& j, EnumType e) noexcept\n{\n    using underlying_type = typename std::underlying_type<EnumType>::type;\n    external_constructor<value_t::number_integer>::construct(j, static_cast<underlying_type>(e));\n}\n\ntemplate<typename BasicJsonType>\nvoid to_json(BasicJsonType& j, const std::vector<bool>& e)\n{\n    external_constructor<value_t::array>::construct(j, e);\n}\n\ntemplate < typename BasicJsonType, typename CompatibleArrayType,\n           enable_if_t < is_compatible_array_type<BasicJsonType,\n                         CompatibleArrayType>::value&&\n                         !is_compatible_object_type<BasicJsonType, CompatibleArrayType>::value&&\n                         !is_compatible_string_type<BasicJsonType, CompatibleArrayType>::value&&\n                         !std::is_same<typename BasicJsonType::binary_t, CompatibleArrayType>::value&&\n                         !is_basic_json<CompatibleArrayType>::value,\n                         int > = 0 >\nvoid to_json(BasicJsonType& j, const CompatibleArrayType& arr)\n{\n    external_constructor<value_t::array>::construct(j, arr);\n}\n\ntemplate<typename BasicJsonType>\nvoid to_json(BasicJsonType& j, const typename BasicJsonType::binary_t& bin)\n{\n    external_constructor<value_t::binary>::construct(j, bin);\n}\n\ntemplate<typename BasicJsonType, typename T,\n         enable_if_t<std::is_convertible<T, BasicJsonType>::value, int> = 0>\nvoid to_json(BasicJsonType& j, const std::valarray<T>& arr)\n{\n    external_constructor<value_t::array>::construct(j, std::move(arr));\n}\n\ntemplate<typename BasicJsonType>\nvoid to_json(BasicJsonType& j, typename BasicJsonType::array_t&& arr)\n{\n    external_constructor<value_t::array>::construct(j, std::move(arr));\n}\n\ntemplate < typename BasicJsonType, typename CompatibleObjectType,\n           enable_if_t < is_compatible_object_type<BasicJsonType, CompatibleObjectType>::value&& !is_basic_json<CompatibleObjectType>::value, int > = 0 >\nvoid to_json(BasicJsonType& j, const CompatibleObjectType& obj)\n{\n    external_constructor<value_t::object>::construct(j, obj);\n}\n\ntemplate<typename BasicJsonType>\nvoid to_json(BasicJsonType& j, typename BasicJsonType::object_t&& obj)\n{\n    external_constructor<value_t::object>::construct(j, std::move(obj));\n}\n\ntemplate <\n    typename BasicJsonType, typename T, std::size_t N,\n    enable_if_t < !std::is_constructible<typename BasicJsonType::string_t,\n                  const T(&)[N]>::value,\n                  int > = 0 >\nvoid to_json(BasicJsonType& j, const T(&arr)[N])\n{\n    external_constructor<value_t::array>::construct(j, arr);\n}\n\ntemplate < typename BasicJsonType, typename T1, typename T2, enable_if_t < std::is_constructible<BasicJsonType, T1>::value&& std::is_constructible<BasicJsonType, T2>::value, int > = 0 >\nvoid to_json(BasicJsonType& j, const std::pair<T1, T2>& p)\n{\n    j = { p.first, p.second };\n}\n\n// for https://github.com/nlohmann/json/pull/1134\ntemplate<typename BasicJsonType, typename T,\n         enable_if_t<std::is_same<T, iteration_proxy_value<typename BasicJsonType::iterator>>::value, int> = 0>\nvoid to_json(BasicJsonType& j, const T& b)\n{\n    j = { {b.key(), b.value()} };\n}\n\ntemplate<typename BasicJsonType, typename Tuple, std::size_t... Idx>\nvoid to_json_tuple_impl(BasicJsonType& j, const Tuple& t, index_sequence<Idx...> /*unused*/)\n{\n    j = { std::get<Idx>(t)... };\n}\n\ntemplate<typename BasicJsonType, typename T, enable_if_t<is_constructible_tuple<BasicJsonType, T>::value, int > = 0>\nvoid to_json(BasicJsonType& j, const T& t)\n{\n    to_json_tuple_impl(j, t, make_index_sequence<std::tuple_size<T>::value> {});\n}\n\nstruct to_json_fn\n{\n    template<typename BasicJsonType, typename T>\n    auto operator()(BasicJsonType& j, T&& val) const noexcept(noexcept(to_json(j, std::forward<T>(val))))\n    -> decltype(to_json(j, std::forward<T>(val)), void())\n    {\n        return to_json(j, std::forward<T>(val));\n    }\n};\n}  // namespace detail\n\n/// namespace to hold default `to_json` function\nnamespace\n{\nconstexpr const auto& to_json = detail::static_const<detail::to_json_fn>::value;\n} // namespace\n} // namespace nlohmann\n\n\nnamespace nlohmann\n{\n\ntemplate<typename, typename>\nstruct adl_serializer\n{\n    /*!\n    @brief convert a JSON value to any value type\n\n    This function is usually called by the `get()` function of the\n    @ref basic_json class (either explicit or via conversion operators).\n\n    @param[in] j        JSON value to read from\n    @param[in,out] val  value to write to\n    */\n    template<typename BasicJsonType, typename ValueType>\n    static auto from_json(BasicJsonType&& j, ValueType& val) noexcept(\n        noexcept(::nlohmann::from_json(std::forward<BasicJsonType>(j), val)))\n    -> decltype(::nlohmann::from_json(std::forward<BasicJsonType>(j), val), void())\n    {\n        ::nlohmann::from_json(std::forward<BasicJsonType>(j), val);\n    }\n\n    /*!\n    @brief convert any value type to a JSON value\n\n    This function is usually called by the constructors of the @ref basic_json\n    class.\n\n    @param[in,out] j  JSON value to write to\n    @param[in] val    value to read from\n    */\n    template<typename BasicJsonType, typename ValueType>\n    static auto to_json(BasicJsonType& j, ValueType&& val) noexcept(\n        noexcept(::nlohmann::to_json(j, std::forward<ValueType>(val))))\n    -> decltype(::nlohmann::to_json(j, std::forward<ValueType>(val)), void())\n    {\n        ::nlohmann::to_json(j, std::forward<ValueType>(val));\n    }\n};\n\n}  // namespace nlohmann\n\n// #include <nlohmann/byte_container_with_subtype.hpp>\n\n\n#include <cstdint> // uint8_t\n#include <tuple> // tie\n#include <utility> // move\n\nnamespace nlohmann\n{\n\n/*!\n@brief an internal type for a backed binary type\n\nThis type extends the template parameter @a BinaryType provided to `basic_json`\nwith a subtype used by BSON and MessagePack. This type exists so that the user\ndoes not have to specify a type themselves with a specific naming scheme in\norder to override the binary type.\n\n@tparam BinaryType container to store bytes (`std::vector<std::uint8_t>` by\n                   default)\n\n@since version 3.8.0\n*/\ntemplate<typename BinaryType>\nclass byte_container_with_subtype : public BinaryType\n{\n  public:\n    /// the type of the underlying container\n    using container_type = BinaryType;\n\n    byte_container_with_subtype() noexcept(noexcept(container_type()))\n        : container_type()\n    {}\n\n    byte_container_with_subtype(const container_type& b) noexcept(noexcept(container_type(b)))\n        : container_type(b)\n    {}\n\n    byte_container_with_subtype(container_type&& b) noexcept(noexcept(container_type(std::move(b))))\n        : container_type(std::move(b))\n    {}\n\n    byte_container_with_subtype(const container_type& b, std::uint8_t subtype) noexcept(noexcept(container_type(b)))\n        : container_type(b)\n        , m_subtype(subtype)\n        , m_has_subtype(true)\n    {}\n\n    byte_container_with_subtype(container_type&& b, std::uint8_t subtype) noexcept(noexcept(container_type(std::move(b))))\n        : container_type(std::move(b))\n        , m_subtype(subtype)\n        , m_has_subtype(true)\n    {}\n\n    bool operator==(const byte_container_with_subtype& rhs) const\n    {\n        return std::tie(static_cast<const BinaryType&>(*this), m_subtype, m_has_subtype) ==\n               std::tie(static_cast<const BinaryType&>(rhs), rhs.m_subtype, rhs.m_has_subtype);\n    }\n\n    bool operator!=(const byte_container_with_subtype& rhs) const\n    {\n        return !(rhs == *this);\n    }\n\n    /*!\n    @brief sets the binary subtype\n\n    Sets the binary subtype of the value, also flags a binary JSON value as\n    having a subtype, which has implications for serialization.\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this member function never throws\n    exceptions.\n\n    @sa @ref subtype() -- return the binary subtype\n    @sa @ref clear_subtype() -- clears the binary subtype\n    @sa @ref has_subtype() -- returns whether or not the binary value has a\n    subtype\n\n    @since version 3.8.0\n    */\n    void set_subtype(std::uint8_t subtype) noexcept\n    {\n        m_subtype = subtype;\n        m_has_subtype = true;\n    }\n\n    /*!\n    @brief return the binary subtype\n\n    Returns the numerical subtype of the value if it has a subtype. If it does\n    not have a subtype, this function will return size_t(-1) as a sentinel\n    value.\n\n    @return the numerical subtype of the binary value\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this member function never throws\n    exceptions.\n\n    @sa @ref set_subtype() -- sets the binary subtype\n    @sa @ref clear_subtype() -- clears the binary subtype\n    @sa @ref has_subtype() -- returns whether or not the binary value has a\n    subtype\n\n    @since version 3.8.0\n    */\n    constexpr std::uint8_t subtype() const noexcept\n    {\n        return m_subtype;\n    }\n\n    /*!\n    @brief return whether the value has a subtype\n\n    @return whether the value has a subtype\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this member function never throws\n    exceptions.\n\n    @sa @ref subtype() -- return the binary subtype\n    @sa @ref set_subtype() -- sets the binary subtype\n    @sa @ref clear_subtype() -- clears the binary subtype\n\n    @since version 3.8.0\n    */\n    constexpr bool has_subtype() const noexcept\n    {\n        return m_has_subtype;\n    }\n\n    /*!\n    @brief clears the binary subtype\n\n    Clears the binary subtype and flags the value as not having a subtype, which\n    has implications for serialization; for instance MessagePack will prefer the\n    bin family over the ext family.\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this member function never throws\n    exceptions.\n\n    @sa @ref subtype() -- return the binary subtype\n    @sa @ref set_subtype() -- sets the binary subtype\n    @sa @ref has_subtype() -- returns whether or not the binary value has a\n    subtype\n\n    @since version 3.8.0\n    */\n    void clear_subtype() noexcept\n    {\n        m_subtype = 0;\n        m_has_subtype = false;\n    }\n\n  private:\n    std::uint8_t m_subtype = 0;\n    bool m_has_subtype = false;\n};\n\n}  // namespace nlohmann\n\n// #include <nlohmann/detail/conversions/from_json.hpp>\n\n// #include <nlohmann/detail/conversions/to_json.hpp>\n\n// #include <nlohmann/detail/exceptions.hpp>\n\n// #include <nlohmann/detail/hash.hpp>\n\n\n#include <cstddef> // size_t, uint8_t\n#include <functional> // hash\n\nnamespace nlohmann\n{\nnamespace detail\n{\n\n// boost::hash_combine\ninline std::size_t combine(std::size_t seed, std::size_t h) noexcept\n{\n    seed ^= h + 0x9e3779b9 + (seed << 6U) + (seed >> 2U);\n    return seed;\n}\n\n/*!\n@brief hash a JSON value\n\nThe hash function tries to rely on std::hash where possible. Furthermore, the\ntype of the JSON value is taken into account to have different hash values for\nnull, 0, 0U, and false, etc.\n\n@tparam BasicJsonType basic_json specialization\n@param j JSON value to hash\n@return hash value of j\n*/\ntemplate<typename BasicJsonType>\nstd::size_t hash(const BasicJsonType& j)\n{\n    using string_t = typename BasicJsonType::string_t;\n    using number_integer_t = typename BasicJsonType::number_integer_t;\n    using number_unsigned_t = typename BasicJsonType::number_unsigned_t;\n    using number_float_t = typename BasicJsonType::number_float_t;\n\n    const auto type = static_cast<std::size_t>(j.type());\n    switch (j.type())\n    {\n        case BasicJsonType::value_t::null:\n        case BasicJsonType::value_t::discarded:\n        {\n            return combine(type, 0);\n        }\n\n        case BasicJsonType::value_t::object:\n        {\n            auto seed = combine(type, j.size());\n            for (const auto& element : j.items())\n            {\n                const auto h = std::hash<string_t> {}(element.key());\n                seed = combine(seed, h);\n                seed = combine(seed, hash(element.value()));\n            }\n            return seed;\n        }\n\n        case BasicJsonType::value_t::array:\n        {\n            auto seed = combine(type, j.size());\n            for (const auto& element : j)\n            {\n                seed = combine(seed, hash(element));\n            }\n            return seed;\n        }\n\n        case BasicJsonType::value_t::string:\n        {\n            const auto h = std::hash<string_t> {}(j.template get_ref<const string_t&>());\n            return combine(type, h);\n        }\n\n        case BasicJsonType::value_t::boolean:\n        {\n            const auto h = std::hash<bool> {}(j.template get<bool>());\n            return combine(type, h);\n        }\n\n        case BasicJsonType::value_t::number_integer:\n        {\n            const auto h = std::hash<number_integer_t> {}(j.template get<number_integer_t>());\n            return combine(type, h);\n        }\n\n        case nlohmann::detail::value_t::number_unsigned:\n        {\n            const auto h = std::hash<number_unsigned_t> {}(j.template get<number_unsigned_t>());\n            return combine(type, h);\n        }\n\n        case nlohmann::detail::value_t::number_float:\n        {\n            const auto h = std::hash<number_float_t> {}(j.template get<number_float_t>());\n            return combine(type, h);\n        }\n\n        case nlohmann::detail::value_t::binary:\n        {\n            auto seed = combine(type, j.get_binary().size());\n            const auto h = std::hash<bool> {}(j.get_binary().has_subtype());\n            seed = combine(seed, h);\n            seed = combine(seed, j.get_binary().subtype());\n            for (const auto byte : j.get_binary())\n            {\n                seed = combine(seed, std::hash<std::uint8_t> {}(byte));\n            }\n            return seed;\n        }\n\n        default: // LCOV_EXCL_LINE\n            JSON_ASSERT(false); // LCOV_EXCL_LINE\n    }\n}\n\n}  // namespace detail\n}  // namespace nlohmann\n\n// #include <nlohmann/detail/input/binary_reader.hpp>\n\n\n#include <algorithm> // generate_n\n#include <array> // array\n#include <cmath> // ldexp\n#include <cstddef> // size_t\n#include <cstdint> // uint8_t, uint16_t, uint32_t, uint64_t\n#include <cstdio> // snprintf\n#include <cstring> // memcpy\n#include <iterator> // back_inserter\n#include <limits> // numeric_limits\n#include <string> // char_traits, string\n#include <utility> // make_pair, move\n\n// #include <nlohmann/detail/exceptions.hpp>\n\n// #include <nlohmann/detail/input/input_adapters.hpp>\n\n\n#include <array> // array\n#include <cstddef> // size_t\n#include <cstdio> //FILE *\n#include <cstring> // strlen\n#include <istream> // istream\n#include <iterator> // begin, end, iterator_traits, random_access_iterator_tag, distance, next\n#include <memory> // shared_ptr, make_shared, addressof\n#include <numeric> // accumulate\n#include <string> // string, char_traits\n#include <type_traits> // enable_if, is_base_of, is_pointer, is_integral, remove_pointer\n#include <utility> // pair, declval\n\n// #include <nlohmann/detail/iterators/iterator_traits.hpp>\n\n// #include <nlohmann/detail/macro_scope.hpp>\n\n\nnamespace nlohmann\n{\nnamespace detail\n{\n/// the supported input formats\nenum class input_format_t { json, cbor, msgpack, ubjson, bson };\n\n////////////////////\n// input adapters //\n////////////////////\n\n/*!\nInput adapter for stdio file access. This adapter read only 1 byte and do not use any\n buffer. This adapter is a very low level adapter.\n*/\nclass file_input_adapter\n{\n  public:\n    using char_type = char;\n\n    JSON_HEDLEY_NON_NULL(2)\n    explicit file_input_adapter(std::FILE* f) noexcept\n        : m_file(f)\n    {}\n\n    // make class move-only\n    file_input_adapter(const file_input_adapter&) = delete;\n    file_input_adapter(file_input_adapter&&) = default;\n    file_input_adapter& operator=(const file_input_adapter&) = delete;\n    file_input_adapter& operator=(file_input_adapter&&) = delete;\n\n    std::char_traits<char>::int_type get_character() noexcept\n    {\n        return std::fgetc(m_file);\n    }\n\n  private:\n    /// the file pointer to read from\n    std::FILE* m_file;\n};\n\n\n/*!\nInput adapter for a (caching) istream. Ignores a UFT Byte Order Mark at\nbeginning of input. Does not support changing the underlying std::streambuf\nin mid-input. Maintains underlying std::istream and std::streambuf to support\nsubsequent use of standard std::istream operations to process any input\ncharacters following those used in parsing the JSON input.  Clears the\nstd::istream flags; any input errors (e.g., EOF) will be detected by the first\nsubsequent call for input from the std::istream.\n*/\nclass input_stream_adapter\n{\n  public:\n    using char_type = char;\n\n    ~input_stream_adapter()\n    {\n        // clear stream flags; we use underlying streambuf I/O, do not\n        // maintain ifstream flags, except eof\n        if (is != nullptr)\n        {\n            is->clear(is->rdstate() & std::ios::eofbit);\n        }\n    }\n\n    explicit input_stream_adapter(std::istream& i)\n        : is(&i), sb(i.rdbuf())\n    {}\n\n    // delete because of pointer members\n    input_stream_adapter(const input_stream_adapter&) = delete;\n    input_stream_adapter& operator=(input_stream_adapter&) = delete;\n    input_stream_adapter& operator=(input_stream_adapter&& rhs) = delete;\n\n    input_stream_adapter(input_stream_adapter&& rhs) noexcept : is(rhs.is), sb(rhs.sb)\n    {\n        rhs.is = nullptr;\n        rhs.sb = nullptr;\n    }\n\n    // std::istream/std::streambuf use std::char_traits<char>::to_int_type, to\n    // ensure that std::char_traits<char>::eof() and the character 0xFF do not\n    // end up as the same value, eg. 0xFFFFFFFF.\n    std::char_traits<char>::int_type get_character()\n    {\n        auto res = sb->sbumpc();\n        // set eof manually, as we don't use the istream interface.\n        if (JSON_HEDLEY_UNLIKELY(res == EOF))\n        {\n            is->clear(is->rdstate() | std::ios::eofbit);\n        }\n        return res;\n    }\n\n  private:\n    /// the associated input stream\n    std::istream* is = nullptr;\n    std::streambuf* sb = nullptr;\n};\n\n// General-purpose iterator-based adapter. It might not be as fast as\n// theoretically possible for some containers, but it is extremely versatile.\ntemplate<typename IteratorType>\nclass iterator_input_adapter\n{\n  public:\n    using char_type = typename std::iterator_traits<IteratorType>::value_type;\n\n    iterator_input_adapter(IteratorType first, IteratorType last)\n        : current(std::move(first)), end(std::move(last)) {}\n\n    typename std::char_traits<char_type>::int_type get_character()\n    {\n        if (JSON_HEDLEY_LIKELY(current != end))\n        {\n            auto result = std::char_traits<char_type>::to_int_type(*current);\n            std::advance(current, 1);\n            return result;\n        }\n        else\n        {\n            return std::char_traits<char_type>::eof();\n        }\n    }\n\n  private:\n    IteratorType current;\n    IteratorType end;\n\n    template<typename BaseInputAdapter, size_t T>\n    friend struct wide_string_input_helper;\n\n    bool empty() const\n    {\n        return current == end;\n    }\n\n};\n\n\ntemplate<typename BaseInputAdapter, size_t T>\nstruct wide_string_input_helper;\n\ntemplate<typename BaseInputAdapter>\nstruct wide_string_input_helper<BaseInputAdapter, 4>\n{\n    // UTF-32\n    static void fill_buffer(BaseInputAdapter& input,\n                            std::array<std::char_traits<char>::int_type, 4>& utf8_bytes,\n                            size_t& utf8_bytes_index,\n                            size_t& utf8_bytes_filled)\n    {\n        utf8_bytes_index = 0;\n\n        if (JSON_HEDLEY_UNLIKELY(input.empty()))\n        {\n            utf8_bytes[0] = std::char_traits<char>::eof();\n            utf8_bytes_filled = 1;\n        }\n        else\n        {\n            // get the current character\n            const auto wc = input.get_character();\n\n            // UTF-32 to UTF-8 encoding\n            if (wc < 0x80)\n            {\n                utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(wc);\n                utf8_bytes_filled = 1;\n            }\n            else if (wc <= 0x7FF)\n            {\n                utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xC0u | ((static_cast<unsigned int>(wc) >> 6u) & 0x1Fu));\n                utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu));\n                utf8_bytes_filled = 2;\n            }\n            else if (wc <= 0xFFFF)\n            {\n                utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xE0u | ((static_cast<unsigned int>(wc) >> 12u) & 0x0Fu));\n                utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | ((static_cast<unsigned int>(wc) >> 6u) & 0x3Fu));\n                utf8_bytes[2] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu));\n                utf8_bytes_filled = 3;\n            }\n            else if (wc <= 0x10FFFF)\n            {\n                utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xF0u | ((static_cast<unsigned int>(wc) >> 18u) & 0x07u));\n                utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | ((static_cast<unsigned int>(wc) >> 12u) & 0x3Fu));\n                utf8_bytes[2] = static_cast<std::char_traits<char>::int_type>(0x80u | ((static_cast<unsigned int>(wc) >> 6u) & 0x3Fu));\n                utf8_bytes[3] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu));\n                utf8_bytes_filled = 4;\n            }\n            else\n            {\n                // unknown character\n                utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(wc);\n                utf8_bytes_filled = 1;\n            }\n        }\n    }\n};\n\ntemplate<typename BaseInputAdapter>\nstruct wide_string_input_helper<BaseInputAdapter, 2>\n{\n    // UTF-16\n    static void fill_buffer(BaseInputAdapter& input,\n                            std::array<std::char_traits<char>::int_type, 4>& utf8_bytes,\n                            size_t& utf8_bytes_index,\n                            size_t& utf8_bytes_filled)\n    {\n        utf8_bytes_index = 0;\n\n        if (JSON_HEDLEY_UNLIKELY(input.empty()))\n        {\n            utf8_bytes[0] = std::char_traits<char>::eof();\n            utf8_bytes_filled = 1;\n        }\n        else\n        {\n            // get the current character\n            const auto wc = input.get_character();\n\n            // UTF-16 to UTF-8 encoding\n            if (wc < 0x80)\n            {\n                utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(wc);\n                utf8_bytes_filled = 1;\n            }\n            else if (wc <= 0x7FF)\n            {\n                utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xC0u | ((static_cast<unsigned int>(wc) >> 6u)));\n                utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu));\n                utf8_bytes_filled = 2;\n            }\n            else if (0xD800 > wc || wc >= 0xE000)\n            {\n                utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xE0u | ((static_cast<unsigned int>(wc) >> 12u)));\n                utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | ((static_cast<unsigned int>(wc) >> 6u) & 0x3Fu));\n                utf8_bytes[2] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu));\n                utf8_bytes_filled = 3;\n            }\n            else\n            {\n                if (JSON_HEDLEY_UNLIKELY(!input.empty()))\n                {\n                    const auto wc2 = static_cast<unsigned int>(input.get_character());\n                    const auto charcode = 0x10000u + (((static_cast<unsigned int>(wc) & 0x3FFu) << 10u) | (wc2 & 0x3FFu));\n                    utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xF0u | (charcode >> 18u));\n                    utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | ((charcode >> 12u) & 0x3Fu));\n                    utf8_bytes[2] = static_cast<std::char_traits<char>::int_type>(0x80u | ((charcode >> 6u) & 0x3Fu));\n                    utf8_bytes[3] = static_cast<std::char_traits<char>::int_type>(0x80u | (charcode & 0x3Fu));\n                    utf8_bytes_filled = 4;\n                }\n                else\n                {\n                    utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(wc);\n                    utf8_bytes_filled = 1;\n                }\n            }\n        }\n    }\n};\n\n// Wraps another input apdater to convert wide character types into individual bytes.\ntemplate<typename BaseInputAdapter, typename WideCharType>\nclass wide_string_input_adapter\n{\n  public:\n    using char_type = char;\n\n    wide_string_input_adapter(BaseInputAdapter base)\n        : base_adapter(base) {}\n\n    typename std::char_traits<char>::int_type get_character() noexcept\n    {\n        // check if buffer needs to be filled\n        if (utf8_bytes_index == utf8_bytes_filled)\n        {\n            fill_buffer<sizeof(WideCharType)>();\n\n            JSON_ASSERT(utf8_bytes_filled > 0);\n            JSON_ASSERT(utf8_bytes_index == 0);\n        }\n\n        // use buffer\n        JSON_ASSERT(utf8_bytes_filled > 0);\n        JSON_ASSERT(utf8_bytes_index < utf8_bytes_filled);\n        return utf8_bytes[utf8_bytes_index++];\n    }\n\n  private:\n    BaseInputAdapter base_adapter;\n\n    template<size_t T>\n    void fill_buffer()\n    {\n        wide_string_input_helper<BaseInputAdapter, T>::fill_buffer(base_adapter, utf8_bytes, utf8_bytes_index, utf8_bytes_filled);\n    }\n\n    /// a buffer for UTF-8 bytes\n    std::array<std::char_traits<char>::int_type, 4> utf8_bytes = {{0, 0, 0, 0}};\n\n    /// index to the utf8_codes array for the next valid byte\n    std::size_t utf8_bytes_index = 0;\n    /// number of valid bytes in the utf8_codes array\n    std::size_t utf8_bytes_filled = 0;\n};\n\n\ntemplate<typename IteratorType, typename Enable = void>\nstruct iterator_input_adapter_factory\n{\n    using iterator_type = IteratorType;\n    using char_type = typename std::iterator_traits<iterator_type>::value_type;\n    using adapter_type = iterator_input_adapter<iterator_type>;\n\n    static adapter_type create(IteratorType first, IteratorType last)\n    {\n        return adapter_type(std::move(first), std::move(last));\n    }\n};\n\ntemplate<typename T>\nstruct is_iterator_of_multibyte\n{\n    using value_type = typename std::iterator_traits<T>::value_type;\n    enum\n    {\n        value = sizeof(value_type) > 1\n    };\n};\n\ntemplate<typename IteratorType>\nstruct iterator_input_adapter_factory<IteratorType, enable_if_t<is_iterator_of_multibyte<IteratorType>::value>>\n{\n    using iterator_type = IteratorType;\n    using char_type = typename std::iterator_traits<iterator_type>::value_type;\n    using base_adapter_type = iterator_input_adapter<iterator_type>;\n    using adapter_type = wide_string_input_adapter<base_adapter_type, char_type>;\n\n    static adapter_type create(IteratorType first, IteratorType last)\n    {\n        return adapter_type(base_adapter_type(std::move(first), std::move(last)));\n    }\n};\n\n// General purpose iterator-based input\ntemplate<typename IteratorType>\ntypename iterator_input_adapter_factory<IteratorType>::adapter_type input_adapter(IteratorType first, IteratorType last)\n{\n    using factory_type = iterator_input_adapter_factory<IteratorType>;\n    return factory_type::create(first, last);\n}\n\n// Convenience shorthand from container to iterator\ntemplate<typename ContainerType>\nauto input_adapter(const ContainerType& container) -> decltype(input_adapter(begin(container), end(container)))\n{\n    // Enable ADL\n    using std::begin;\n    using std::end;\n\n    return input_adapter(begin(container), end(container));\n}\n\n// Special cases with fast paths\ninline file_input_adapter input_adapter(std::FILE* file)\n{\n    return file_input_adapter(file);\n}\n\ninline input_stream_adapter input_adapter(std::istream& stream)\n{\n    return input_stream_adapter(stream);\n}\n\ninline input_stream_adapter input_adapter(std::istream&& stream)\n{\n    return input_stream_adapter(stream);\n}\n\nusing contiguous_bytes_input_adapter = decltype(input_adapter(std::declval<const char*>(), std::declval<const char*>()));\n\n// Null-delimited strings, and the like.\ntemplate < typename CharT,\n           typename std::enable_if <\n               std::is_pointer<CharT>::value&&\n               !std::is_array<CharT>::value&&\n               std::is_integral<typename std::remove_pointer<CharT>::type>::value&&\n               sizeof(typename std::remove_pointer<CharT>::type) == 1,\n               int >::type = 0 >\ncontiguous_bytes_input_adapter input_adapter(CharT b)\n{\n    auto length = std::strlen(reinterpret_cast<const char*>(b));\n    const auto* ptr = reinterpret_cast<const char*>(b);\n    return input_adapter(ptr, ptr + length);\n}\n\ntemplate<typename T, std::size_t N>\nauto input_adapter(T (&array)[N]) -> decltype(input_adapter(array, array + N))\n{\n    return input_adapter(array, array + N);\n}\n\n// This class only handles inputs of input_buffer_adapter type.\n// It's required so that expressions like {ptr, len} can be implicitely casted\n// to the correct adapter.\nclass span_input_adapter\n{\n  public:\n    template < typename CharT,\n               typename std::enable_if <\n                   std::is_pointer<CharT>::value&&\n                   std::is_integral<typename std::remove_pointer<CharT>::type>::value&&\n                   sizeof(typename std::remove_pointer<CharT>::type) == 1,\n                   int >::type = 0 >\n    span_input_adapter(CharT b, std::size_t l)\n        : ia(reinterpret_cast<const char*>(b), reinterpret_cast<const char*>(b) + l) {}\n\n    template<class IteratorType,\n             typename std::enable_if<\n                 std::is_same<typename iterator_traits<IteratorType>::iterator_category, std::random_access_iterator_tag>::value,\n                 int>::type = 0>\n    span_input_adapter(IteratorType first, IteratorType last)\n        : ia(input_adapter(first, last)) {}\n\n    contiguous_bytes_input_adapter&& get()\n    {\n        return std::move(ia);\n    }\n\n  private:\n    contiguous_bytes_input_adapter ia;\n};\n}  // namespace detail\n}  // namespace nlohmann\n\n// #include <nlohmann/detail/input/json_sax.hpp>\n\n\n#include <cstddef>\n#include <string> // string\n#include <utility> // move\n#include <vector> // vector\n\n// #include <nlohmann/detail/exceptions.hpp>\n\n// #include <nlohmann/detail/macro_scope.hpp>\n\n\nnamespace nlohmann\n{\n\n/*!\n@brief SAX interface\n\nThis class describes the SAX interface used by @ref nlohmann::json::sax_parse.\nEach function is called in different situations while the input is parsed. The\nboolean return value informs the parser whether to continue processing the\ninput.\n*/\ntemplate<typename BasicJsonType>\nstruct json_sax\n{\n    using number_integer_t = typename BasicJsonType::number_integer_t;\n    using number_unsigned_t = typename BasicJsonType::number_unsigned_t;\n    using number_float_t = typename BasicJsonType::number_float_t;\n    using string_t = typename BasicJsonType::string_t;\n    using binary_t = typename BasicJsonType::binary_t;\n\n    /*!\n    @brief a null value was read\n    @return whether parsing should proceed\n    */\n    virtual bool null() = 0;\n\n    /*!\n    @brief a boolean value was read\n    @param[in] val  boolean value\n    @return whether parsing should proceed\n    */\n    virtual bool boolean(bool val) = 0;\n\n    /*!\n    @brief an integer number was read\n    @param[in] val  integer value\n    @return whether parsing should proceed\n    */\n    virtual bool number_integer(number_integer_t val) = 0;\n\n    /*!\n    @brief an unsigned integer number was read\n    @param[in] val  unsigned integer value\n    @return whether parsing should proceed\n    */\n    virtual bool number_unsigned(number_unsigned_t val) = 0;\n\n    /*!\n    @brief an floating-point number was read\n    @param[in] val  floating-point value\n    @param[in] s    raw token value\n    @return whether parsing should proceed\n    */\n    virtual bool number_float(number_float_t val, const string_t& s) = 0;\n\n    /*!\n    @brief a string was read\n    @param[in] val  string value\n    @return whether parsing should proceed\n    @note It is safe to move the passed string.\n    */\n    virtual bool string(string_t& val) = 0;\n\n    /*!\n    @brief a binary string was read\n    @param[in] val  binary value\n    @return whether parsing should proceed\n    @note It is safe to move the passed binary.\n    */\n    virtual bool binary(binary_t& val) = 0;\n\n    /*!\n    @brief the beginning of an object was read\n    @param[in] elements  number of object elements or -1 if unknown\n    @return whether parsing should proceed\n    @note binary formats may report the number of elements\n    */\n    virtual bool start_object(std::size_t elements) = 0;\n\n    /*!\n    @brief an object key was read\n    @param[in] val  object key\n    @return whether parsing should proceed\n    @note It is safe to move the passed string.\n    */\n    virtual bool key(string_t& val) = 0;\n\n    /*!\n    @brief the end of an object was read\n    @return whether parsing should proceed\n    */\n    virtual bool end_object() = 0;\n\n    /*!\n    @brief the beginning of an array was read\n    @param[in] elements  number of array elements or -1 if unknown\n    @return whether parsing should proceed\n    @note binary formats may report the number of elements\n    */\n    virtual bool start_array(std::size_t elements) = 0;\n\n    /*!\n    @brief the end of an array was read\n    @return whether parsing should proceed\n    */\n    virtual bool end_array() = 0;\n\n    /*!\n    @brief a parse error occurred\n    @param[in] position    the position in the input where the error occurs\n    @param[in] last_token  the last read token\n    @param[in] ex          an exception object describing the error\n    @return whether parsing should proceed (must return false)\n    */\n    virtual bool parse_error(std::size_t position,\n                             const std::string& last_token,\n                             const detail::exception& ex) = 0;\n\n    virtual ~json_sax() = default;\n};\n\n\nnamespace detail\n{\n/*!\n@brief SAX implementation to create a JSON value from SAX events\n\nThis class implements the @ref json_sax interface and processes the SAX events\nto create a JSON value which makes it basically a DOM parser. The structure or\nhierarchy of the JSON value is managed by the stack `ref_stack` which contains\na pointer to the respective array or object for each recursion depth.\n\nAfter successful parsing, the value that is passed by reference to the\nconstructor contains the parsed value.\n\n@tparam BasicJsonType  the JSON type\n*/\ntemplate<typename BasicJsonType>\nclass json_sax_dom_parser\n{\n  public:\n    using number_integer_t = typename BasicJsonType::number_integer_t;\n    using number_unsigned_t = typename BasicJsonType::number_unsigned_t;\n    using number_float_t = typename BasicJsonType::number_float_t;\n    using string_t = typename BasicJsonType::string_t;\n    using binary_t = typename BasicJsonType::binary_t;\n\n    /*!\n    @param[in, out] r  reference to a JSON value that is manipulated while\n                       parsing\n    @param[in] allow_exceptions_  whether parse errors yield exceptions\n    */\n    explicit json_sax_dom_parser(BasicJsonType& r, const bool allow_exceptions_ = true)\n        : root(r), allow_exceptions(allow_exceptions_)\n    {}\n\n    // make class move-only\n    json_sax_dom_parser(const json_sax_dom_parser&) = delete;\n    json_sax_dom_parser(json_sax_dom_parser&&) = default;\n    json_sax_dom_parser& operator=(const json_sax_dom_parser&) = delete;\n    json_sax_dom_parser& operator=(json_sax_dom_parser&&) = default;\n    ~json_sax_dom_parser() = default;\n\n    bool null()\n    {\n        handle_value(nullptr);\n        return true;\n    }\n\n    bool boolean(bool val)\n    {\n        handle_value(val);\n        return true;\n    }\n\n    bool number_integer(number_integer_t val)\n    {\n        handle_value(val);\n        return true;\n    }\n\n    bool number_unsigned(number_unsigned_t val)\n    {\n        handle_value(val);\n        return true;\n    }\n\n    bool number_float(number_float_t val, const string_t& /*unused*/)\n    {\n        handle_value(val);\n        return true;\n    }\n\n    bool string(string_t& val)\n    {\n        handle_value(val);\n        return true;\n    }\n\n    bool binary(binary_t& val)\n    {\n        handle_value(std::move(val));\n        return true;\n    }\n\n    bool start_object(std::size_t len)\n    {\n        ref_stack.push_back(handle_value(BasicJsonType::value_t::object));\n\n        if (JSON_HEDLEY_UNLIKELY(len != std::size_t(-1) && len > ref_stack.back()->max_size()))\n        {\n            JSON_THROW(out_of_range::create(408,\n                                            \"excessive object size: \" + std::to_string(len)));\n        }\n\n        return true;\n    }\n\n    bool key(string_t& val)\n    {\n        // add null at given key and store the reference for later\n        object_element = &(ref_stack.back()->m_value.object->operator[](val));\n        return true;\n    }\n\n    bool end_object()\n    {\n        ref_stack.pop_back();\n        return true;\n    }\n\n    bool start_array(std::size_t len)\n    {\n        ref_stack.push_back(handle_value(BasicJsonType::value_t::array));\n\n        if (JSON_HEDLEY_UNLIKELY(len != std::size_t(-1) && len > ref_stack.back()->max_size()))\n        {\n            JSON_THROW(out_of_range::create(408,\n                                            \"excessive array size: \" + std::to_string(len)));\n        }\n\n        return true;\n    }\n\n    bool end_array()\n    {\n        ref_stack.pop_back();\n        return true;\n    }\n\n    template<class Exception>\n    bool parse_error(std::size_t /*unused*/, const std::string& /*unused*/,\n                     const Exception& ex)\n    {\n        errored = true;\n        static_cast<void>(ex);\n        if (allow_exceptions)\n        {\n            JSON_THROW(ex);\n        }\n        return false;\n    }\n\n    constexpr bool is_errored() const\n    {\n        return errored;\n    }\n\n  private:\n    /*!\n    @invariant If the ref stack is empty, then the passed value will be the new\n               root.\n    @invariant If the ref stack contains a value, then it is an array or an\n               object to which we can add elements\n    */\n    template<typename Value>\n    JSON_HEDLEY_RETURNS_NON_NULL\n    BasicJsonType* handle_value(Value&& v)\n    {\n        if (ref_stack.empty())\n        {\n            root = BasicJsonType(std::forward<Value>(v));\n            return &root;\n        }\n\n        JSON_ASSERT(ref_stack.back()->is_array() || ref_stack.back()->is_object());\n\n        if (ref_stack.back()->is_array())\n        {\n            ref_stack.back()->m_value.array->emplace_back(std::forward<Value>(v));\n            return &(ref_stack.back()->m_value.array->back());\n        }\n\n        JSON_ASSERT(ref_stack.back()->is_object());\n        JSON_ASSERT(object_element);\n        *object_element = BasicJsonType(std::forward<Value>(v));\n        return object_element;\n    }\n\n    /// the parsed JSON value\n    BasicJsonType& root;\n    /// stack to model hierarchy of values\n    std::vector<BasicJsonType*> ref_stack {};\n    /// helper to hold the reference for the next object element\n    BasicJsonType* object_element = nullptr;\n    /// whether a syntax error occurred\n    bool errored = false;\n    /// whether to throw exceptions in case of errors\n    const bool allow_exceptions = true;\n};\n\ntemplate<typename BasicJsonType>\nclass json_sax_dom_callback_parser\n{\n  public:\n    using number_integer_t = typename BasicJsonType::number_integer_t;\n    using number_unsigned_t = typename BasicJsonType::number_unsigned_t;\n    using number_float_t = typename BasicJsonType::number_float_t;\n    using string_t = typename BasicJsonType::string_t;\n    using binary_t = typename BasicJsonType::binary_t;\n    using parser_callback_t = typename BasicJsonType::parser_callback_t;\n    using parse_event_t = typename BasicJsonType::parse_event_t;\n\n    json_sax_dom_callback_parser(BasicJsonType& r,\n                                 const parser_callback_t cb,\n                                 const bool allow_exceptions_ = true)\n        : root(r), callback(cb), allow_exceptions(allow_exceptions_)\n    {\n        keep_stack.push_back(true);\n    }\n\n    // make class move-only\n    json_sax_dom_callback_parser(const json_sax_dom_callback_parser&) = delete;\n    json_sax_dom_callback_parser(json_sax_dom_callback_parser&&) = default;\n    json_sax_dom_callback_parser& operator=(const json_sax_dom_callback_parser&) = delete;\n    json_sax_dom_callback_parser& operator=(json_sax_dom_callback_parser&&) = default;\n    ~json_sax_dom_callback_parser() = default;\n\n    bool null()\n    {\n        handle_value(nullptr);\n        return true;\n    }\n\n    bool boolean(bool val)\n    {\n        handle_value(val);\n        return true;\n    }\n\n    bool number_integer(number_integer_t val)\n    {\n        handle_value(val);\n        return true;\n    }\n\n    bool number_unsigned(number_unsigned_t val)\n    {\n        handle_value(val);\n        return true;\n    }\n\n    bool number_float(number_float_t val, const string_t& /*unused*/)\n    {\n        handle_value(val);\n        return true;\n    }\n\n    bool string(string_t& val)\n    {\n        handle_value(val);\n        return true;\n    }\n\n    bool binary(binary_t& val)\n    {\n        handle_value(std::move(val));\n        return true;\n    }\n\n    bool start_object(std::size_t len)\n    {\n        // check callback for object start\n        const bool keep = callback(static_cast<int>(ref_stack.size()), parse_event_t::object_start, discarded);\n        keep_stack.push_back(keep);\n\n        auto val = handle_value(BasicJsonType::value_t::object, true);\n        ref_stack.push_back(val.second);\n\n        // check object limit\n        if (ref_stack.back() && JSON_HEDLEY_UNLIKELY(len != std::size_t(-1) && len > ref_stack.back()->max_size()))\n        {\n            JSON_THROW(out_of_range::create(408, \"excessive object size: \" + std::to_string(len)));\n        }\n\n        return true;\n    }\n\n    bool key(string_t& val)\n    {\n        BasicJsonType k = BasicJsonType(val);\n\n        // check callback for key\n        const bool keep = callback(static_cast<int>(ref_stack.size()), parse_event_t::key, k);\n        key_keep_stack.push_back(keep);\n\n        // add discarded value at given key and store the reference for later\n        if (keep && ref_stack.back())\n        {\n            object_element = &(ref_stack.back()->m_value.object->operator[](val) = discarded);\n        }\n\n        return true;\n    }\n\n    bool end_object()\n    {\n        if (ref_stack.back() && !callback(static_cast<int>(ref_stack.size()) - 1, parse_event_t::object_end, *ref_stack.back()))\n        {\n            // discard object\n            *ref_stack.back() = discarded;\n        }\n\n        JSON_ASSERT(!ref_stack.empty());\n        JSON_ASSERT(!keep_stack.empty());\n        ref_stack.pop_back();\n        keep_stack.pop_back();\n\n        if (!ref_stack.empty() && ref_stack.back() && ref_stack.back()->is_structured())\n        {\n            // remove discarded value\n            for (auto it = ref_stack.back()->begin(); it != ref_stack.back()->end(); ++it)\n            {\n                if (it->is_discarded())\n                {\n                    ref_stack.back()->erase(it);\n                    break;\n                }\n            }\n        }\n\n        return true;\n    }\n\n    bool start_array(std::size_t len)\n    {\n        const bool keep = callback(static_cast<int>(ref_stack.size()), parse_event_t::array_start, discarded);\n        keep_stack.push_back(keep);\n\n        auto val = handle_value(BasicJsonType::value_t::array, true);\n        ref_stack.push_back(val.second);\n\n        // check array limit\n        if (ref_stack.back() && JSON_HEDLEY_UNLIKELY(len != std::size_t(-1) && len > ref_stack.back()->max_size()))\n        {\n            JSON_THROW(out_of_range::create(408, \"excessive array size: \" + std::to_string(len)));\n        }\n\n        return true;\n    }\n\n    bool end_array()\n    {\n        bool keep = true;\n\n        if (ref_stack.back())\n        {\n            keep = callback(static_cast<int>(ref_stack.size()) - 1, parse_event_t::array_end, *ref_stack.back());\n            if (!keep)\n            {\n                // discard array\n                *ref_stack.back() = discarded;\n            }\n        }\n\n        JSON_ASSERT(!ref_stack.empty());\n        JSON_ASSERT(!keep_stack.empty());\n        ref_stack.pop_back();\n        keep_stack.pop_back();\n\n        // remove discarded value\n        if (!keep && !ref_stack.empty() && ref_stack.back()->is_array())\n        {\n            ref_stack.back()->m_value.array->pop_back();\n        }\n\n        return true;\n    }\n\n    template<class Exception>\n    bool parse_error(std::size_t /*unused*/, const std::string& /*unused*/,\n                     const Exception& ex)\n    {\n        errored = true;\n        static_cast<void>(ex);\n        if (allow_exceptions)\n        {\n            JSON_THROW(ex);\n        }\n        return false;\n    }\n\n    constexpr bool is_errored() const\n    {\n        return errored;\n    }\n\n  private:\n    /*!\n    @param[in] v  value to add to the JSON value we build during parsing\n    @param[in] skip_callback  whether we should skip calling the callback\n               function; this is required after start_array() and\n               start_object() SAX events, because otherwise we would call the\n               callback function with an empty array or object, respectively.\n\n    @invariant If the ref stack is empty, then the passed value will be the new\n               root.\n    @invariant If the ref stack contains a value, then it is an array or an\n               object to which we can add elements\n\n    @return pair of boolean (whether value should be kept) and pointer (to the\n            passed value in the ref_stack hierarchy; nullptr if not kept)\n    */\n    template<typename Value>\n    std::pair<bool, BasicJsonType*> handle_value(Value&& v, const bool skip_callback = false)\n    {\n        JSON_ASSERT(!keep_stack.empty());\n\n        // do not handle this value if we know it would be added to a discarded\n        // container\n        if (!keep_stack.back())\n        {\n            return {false, nullptr};\n        }\n\n        // create value\n        auto value = BasicJsonType(std::forward<Value>(v));\n\n        // check callback\n        const bool keep = skip_callback || callback(static_cast<int>(ref_stack.size()), parse_event_t::value, value);\n\n        // do not handle this value if we just learnt it shall be discarded\n        if (!keep)\n        {\n            return {false, nullptr};\n        }\n\n        if (ref_stack.empty())\n        {\n            root = std::move(value);\n            return {true, &root};\n        }\n\n        // skip this value if we already decided to skip the parent\n        // (https://github.com/nlohmann/json/issues/971#issuecomment-413678360)\n        if (!ref_stack.back())\n        {\n            return {false, nullptr};\n        }\n\n        // we now only expect arrays and objects\n        JSON_ASSERT(ref_stack.back()->is_array() || ref_stack.back()->is_object());\n\n        // array\n        if (ref_stack.back()->is_array())\n        {\n            ref_stack.back()->m_value.array->push_back(std::move(value));\n            return {true, &(ref_stack.back()->m_value.array->back())};\n        }\n\n        // object\n        JSON_ASSERT(ref_stack.back()->is_object());\n        // check if we should store an element for the current key\n        JSON_ASSERT(!key_keep_stack.empty());\n        const bool store_element = key_keep_stack.back();\n        key_keep_stack.pop_back();\n\n        if (!store_element)\n        {\n            return {false, nullptr};\n        }\n\n        JSON_ASSERT(object_element);\n        *object_element = std::move(value);\n        return {true, object_element};\n    }\n\n    /// the parsed JSON value\n    BasicJsonType& root;\n    /// stack to model hierarchy of values\n    std::vector<BasicJsonType*> ref_stack {};\n    /// stack to manage which values to keep\n    std::vector<bool> keep_stack {};\n    /// stack to manage which object keys to keep\n    std::vector<bool> key_keep_stack {};\n    /// helper to hold the reference for the next object element\n    BasicJsonType* object_element = nullptr;\n    /// whether a syntax error occurred\n    bool errored = false;\n    /// callback function\n    const parser_callback_t callback = nullptr;\n    /// whether to throw exceptions in case of errors\n    const bool allow_exceptions = true;\n    /// a discarded value for the callback\n    BasicJsonType discarded = BasicJsonType::value_t::discarded;\n};\n\ntemplate<typename BasicJsonType>\nclass json_sax_acceptor\n{\n  public:\n    using number_integer_t = typename BasicJsonType::number_integer_t;\n    using number_unsigned_t = typename BasicJsonType::number_unsigned_t;\n    using number_float_t = typename BasicJsonType::number_float_t;\n    using string_t = typename BasicJsonType::string_t;\n    using binary_t = typename BasicJsonType::binary_t;\n\n    bool null()\n    {\n        return true;\n    }\n\n    bool boolean(bool /*unused*/)\n    {\n        return true;\n    }\n\n    bool number_integer(number_integer_t /*unused*/)\n    {\n        return true;\n    }\n\n    bool number_unsigned(number_unsigned_t /*unused*/)\n    {\n        return true;\n    }\n\n    bool number_float(number_float_t /*unused*/, const string_t& /*unused*/)\n    {\n        return true;\n    }\n\n    bool string(string_t& /*unused*/)\n    {\n        return true;\n    }\n\n    bool binary(binary_t& /*unused*/)\n    {\n        return true;\n    }\n\n    bool start_object(std::size_t /*unused*/ = std::size_t(-1))\n    {\n        return true;\n    }\n\n    bool key(string_t& /*unused*/)\n    {\n        return true;\n    }\n\n    bool end_object()\n    {\n        return true;\n    }\n\n    bool start_array(std::size_t /*unused*/ = std::size_t(-1))\n    {\n        return true;\n    }\n\n    bool end_array()\n    {\n        return true;\n    }\n\n    bool parse_error(std::size_t /*unused*/, const std::string& /*unused*/, const detail::exception& /*unused*/)\n    {\n        return false;\n    }\n};\n}  // namespace detail\n\n}  // namespace nlohmann\n\n// #include <nlohmann/detail/input/lexer.hpp>\n\n\n#include <array> // array\n#include <clocale> // localeconv\n#include <cstddef> // size_t\n#include <cstdio> // snprintf\n#include <cstdlib> // strtof, strtod, strtold, strtoll, strtoull\n#include <initializer_list> // initializer_list\n#include <string> // char_traits, string\n#include <utility> // move\n#include <vector> // vector\n\n// #include <nlohmann/detail/input/input_adapters.hpp>\n\n// #include <nlohmann/detail/input/position_t.hpp>\n\n// #include <nlohmann/detail/macro_scope.hpp>\n\n\nnamespace nlohmann\n{\nnamespace detail\n{\n///////////\n// lexer //\n///////////\n\ntemplate<typename BasicJsonType>\nclass lexer_base\n{\n  public:\n    /// token types for the parser\n    enum class token_type\n    {\n        uninitialized,    ///< indicating the scanner is uninitialized\n        literal_true,     ///< the `true` literal\n        literal_false,    ///< the `false` literal\n        literal_null,     ///< the `null` literal\n        value_string,     ///< a string -- use get_string() for actual value\n        value_unsigned,   ///< an unsigned integer -- use get_number_unsigned() for actual value\n        value_integer,    ///< a signed integer -- use get_number_integer() for actual value\n        value_float,      ///< an floating point number -- use get_number_float() for actual value\n        begin_array,      ///< the character for array begin `[`\n        begin_object,     ///< the character for object begin `{`\n        end_array,        ///< the character for array end `]`\n        end_object,       ///< the character for object end `}`\n        name_separator,   ///< the name separator `:`\n        value_separator,  ///< the value separator `,`\n        parse_error,      ///< indicating a parse error\n        end_of_input,     ///< indicating the end of the input buffer\n        literal_or_value  ///< a literal or the begin of a value (only for diagnostics)\n    };\n\n    /// return name of values of type token_type (only used for errors)\n    JSON_HEDLEY_RETURNS_NON_NULL\n    JSON_HEDLEY_CONST\n    static const char* token_type_name(const token_type t) noexcept\n    {\n        switch (t)\n        {\n            case token_type::uninitialized:\n                return \"<uninitialized>\";\n            case token_type::literal_true:\n                return \"true literal\";\n            case token_type::literal_false:\n                return \"false literal\";\n            case token_type::literal_null:\n                return \"null literal\";\n            case token_type::value_string:\n                return \"string literal\";\n            case token_type::value_unsigned:\n            case token_type::value_integer:\n            case token_type::value_float:\n                return \"number literal\";\n            case token_type::begin_array:\n                return \"'['\";\n            case token_type::begin_object:\n                return \"'{'\";\n            case token_type::end_array:\n                return \"']'\";\n            case token_type::end_object:\n                return \"'}'\";\n            case token_type::name_separator:\n                return \"':'\";\n            case token_type::value_separator:\n                return \"','\";\n            case token_type::parse_error:\n                return \"<parse error>\";\n            case token_type::end_of_input:\n                return \"end of input\";\n            case token_type::literal_or_value:\n                return \"'[', '{', or a literal\";\n            // LCOV_EXCL_START\n            default: // catch non-enum values\n                return \"unknown token\";\n                // LCOV_EXCL_STOP\n        }\n    }\n};\n/*!\n@brief lexical analysis\n\nThis class organizes the lexical analysis during JSON deserialization.\n*/\ntemplate<typename BasicJsonType, typename InputAdapterType>\nclass lexer : public lexer_base<BasicJsonType>\n{\n    using number_integer_t = typename BasicJsonType::number_integer_t;\n    using number_unsigned_t = typename BasicJsonType::number_unsigned_t;\n    using number_float_t = typename BasicJsonType::number_float_t;\n    using string_t = typename BasicJsonType::string_t;\n    using char_type = typename InputAdapterType::char_type;\n    using char_int_type = typename std::char_traits<char_type>::int_type;\n\n  public:\n    using token_type = typename lexer_base<BasicJsonType>::token_type;\n\n    explicit lexer(InputAdapterType&& adapter, bool ignore_comments_ = false)\n        : ia(std::move(adapter))\n        , ignore_comments(ignore_comments_)\n        , decimal_point_char(static_cast<char_int_type>(get_decimal_point()))\n    {}\n\n    // delete because of pointer members\n    lexer(const lexer&) = delete;\n    lexer(lexer&&) = default;\n    lexer& operator=(lexer&) = delete;\n    lexer& operator=(lexer&&) = default;\n    ~lexer() = default;\n\n  private:\n    /////////////////////\n    // locales\n    /////////////////////\n\n    /// return the locale-dependent decimal point\n    JSON_HEDLEY_PURE\n    static char get_decimal_point() noexcept\n    {\n        const auto* loc = localeconv();\n        JSON_ASSERT(loc != nullptr);\n        return (loc->decimal_point == nullptr) ? '.' : *(loc->decimal_point);\n    }\n\n    /////////////////////\n    // scan functions\n    /////////////////////\n\n    /*!\n    @brief get codepoint from 4 hex characters following `\\u`\n\n    For input \"\\u c1 c2 c3 c4\" the codepoint is:\n      (c1 * 0x1000) + (c2 * 0x0100) + (c3 * 0x0010) + c4\n    = (c1 << 12) + (c2 << 8) + (c3 << 4) + (c4 << 0)\n\n    Furthermore, the possible characters '0'..'9', 'A'..'F', and 'a'..'f'\n    must be converted to the integers 0x0..0x9, 0xA..0xF, 0xA..0xF, resp. The\n    conversion is done by subtracting the offset (0x30, 0x37, and 0x57)\n    between the ASCII value of the character and the desired integer value.\n\n    @return codepoint (0x0000..0xFFFF) or -1 in case of an error (e.g. EOF or\n            non-hex character)\n    */\n    int get_codepoint()\n    {\n        // this function only makes sense after reading `\\u`\n        JSON_ASSERT(current == 'u');\n        int codepoint = 0;\n\n        const auto factors = { 12u, 8u, 4u, 0u };\n        for (const auto factor : factors)\n        {\n            get();\n\n            if (current >= '0' && current <= '9')\n            {\n                codepoint += static_cast<int>((static_cast<unsigned int>(current) - 0x30u) << factor);\n            }\n            else if (current >= 'A' && current <= 'F')\n            {\n                codepoint += static_cast<int>((static_cast<unsigned int>(current) - 0x37u) << factor);\n            }\n            else if (current >= 'a' && current <= 'f')\n            {\n                codepoint += static_cast<int>((static_cast<unsigned int>(current) - 0x57u) << factor);\n            }\n            else\n            {\n                return -1;\n            }\n        }\n\n        JSON_ASSERT(0x0000 <= codepoint && codepoint <= 0xFFFF);\n        return codepoint;\n    }\n\n    /*!\n    @brief check if the next byte(s) are inside a given range\n\n    Adds the current byte and, for each passed range, reads a new byte and\n    checks if it is inside the range. If a violation was detected, set up an\n    error message and return false. Otherwise, return true.\n\n    @param[in] ranges  list of integers; interpreted as list of pairs of\n                       inclusive lower and upper bound, respectively\n\n    @pre The passed list @a ranges must have 2, 4, or 6 elements; that is,\n         1, 2, or 3 pairs. This precondition is enforced by an assertion.\n\n    @return true if and only if no range violation was detected\n    */\n    bool next_byte_in_range(std::initializer_list<char_int_type> ranges)\n    {\n        JSON_ASSERT(ranges.size() == 2 || ranges.size() == 4 || ranges.size() == 6);\n        add(current);\n\n        for (auto range = ranges.begin(); range != ranges.end(); ++range)\n        {\n            get();\n            if (JSON_HEDLEY_LIKELY(*range <= current && current <= *(++range)))\n            {\n                add(current);\n            }\n            else\n            {\n                error_message = \"invalid string: ill-formed UTF-8 byte\";\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    /*!\n    @brief scan a string literal\n\n    This function scans a string according to Sect. 7 of RFC 7159. While\n    scanning, bytes are escaped and copied into buffer token_buffer. Then the\n    function returns successfully, token_buffer is *not* null-terminated (as it\n    may contain \\0 bytes), and token_buffer.size() is the number of bytes in the\n    string.\n\n    @return token_type::value_string if string could be successfully scanned,\n            token_type::parse_error otherwise\n\n    @note In case of errors, variable error_message contains a textual\n          description.\n    */\n    token_type scan_string()\n    {\n        // reset token_buffer (ignore opening quote)\n        reset();\n\n        // we entered the function by reading an open quote\n        JSON_ASSERT(current == '\\\"');\n\n        while (true)\n        {\n            // get next character\n            switch (get())\n            {\n                // end of file while parsing string\n                case std::char_traits<char_type>::eof():\n                {\n                    error_message = \"invalid string: missing closing quote\";\n                    return token_type::parse_error;\n                }\n\n                // closing quote\n                case '\\\"':\n                {\n                    return token_type::value_string;\n                }\n\n                // escapes\n                case '\\\\':\n                {\n                    switch (get())\n                    {\n                        // quotation mark\n                        case '\\\"':\n                            add('\\\"');\n                            break;\n                        // reverse solidus\n                        case '\\\\':\n                            add('\\\\');\n                            break;\n                        // solidus\n                        case '/':\n                            add('/');\n                            break;\n                        // backspace\n                        case 'b':\n                            add('\\b');\n                            break;\n                        // form feed\n                        case 'f':\n                            add('\\f');\n                            break;\n                        // line feed\n                        case 'n':\n                            add('\\n');\n                            break;\n                        // carriage return\n                        case 'r':\n                            add('\\r');\n                            break;\n                        // tab\n                        case 't':\n                            add('\\t');\n                            break;\n\n                        // unicode escapes\n                        case 'u':\n                        {\n                            const int codepoint1 = get_codepoint();\n                            int codepoint = codepoint1; // start with codepoint1\n\n                            if (JSON_HEDLEY_UNLIKELY(codepoint1 == -1))\n                            {\n                                error_message = \"invalid string: '\\\\u' must be followed by 4 hex digits\";\n                                return token_type::parse_error;\n                            }\n\n                            // check if code point is a high surrogate\n                            if (0xD800 <= codepoint1 && codepoint1 <= 0xDBFF)\n                            {\n                                // expect next \\uxxxx entry\n                                if (JSON_HEDLEY_LIKELY(get() == '\\\\' && get() == 'u'))\n                                {\n                                    const int codepoint2 = get_codepoint();\n\n                                    if (JSON_HEDLEY_UNLIKELY(codepoint2 == -1))\n                                    {\n                                        error_message = \"invalid string: '\\\\u' must be followed by 4 hex digits\";\n                                        return token_type::parse_error;\n                                    }\n\n                                    // check if codepoint2 is a low surrogate\n                                    if (JSON_HEDLEY_LIKELY(0xDC00 <= codepoint2 && codepoint2 <= 0xDFFF))\n                                    {\n                                        // overwrite codepoint\n                                        codepoint = static_cast<int>(\n                                                        // high surrogate occupies the most significant 22 bits\n                                                        (static_cast<unsigned int>(codepoint1) << 10u)\n                                                        // low surrogate occupies the least significant 15 bits\n                                                        + static_cast<unsigned int>(codepoint2)\n                                                        // there is still the 0xD800, 0xDC00 and 0x10000 noise\n                                                        // in the result so we have to subtract with:\n                                                        // (0xD800 << 10) + DC00 - 0x10000 = 0x35FDC00\n                                                        - 0x35FDC00u);\n                                    }\n                                    else\n                                    {\n                                        error_message = \"invalid string: surrogate U+D800..U+DBFF must be followed by U+DC00..U+DFFF\";\n                                        return token_type::parse_error;\n                                    }\n                                }\n                                else\n                                {\n                                    error_message = \"invalid string: surrogate U+D800..U+DBFF must be followed by U+DC00..U+DFFF\";\n                                    return token_type::parse_error;\n                                }\n                            }\n                            else\n                            {\n                                if (JSON_HEDLEY_UNLIKELY(0xDC00 <= codepoint1 && codepoint1 <= 0xDFFF))\n                                {\n                                    error_message = \"invalid string: surrogate U+DC00..U+DFFF must follow U+D800..U+DBFF\";\n                                    return token_type::parse_error;\n                                }\n                            }\n\n                            // result of the above calculation yields a proper codepoint\n                            JSON_ASSERT(0x00 <= codepoint && codepoint <= 0x10FFFF);\n\n                            // translate codepoint into bytes\n                            if (codepoint < 0x80)\n                            {\n                                // 1-byte characters: 0xxxxxxx (ASCII)\n                                add(static_cast<char_int_type>(codepoint));\n                            }\n                            else if (codepoint <= 0x7FF)\n                            {\n                                // 2-byte characters: 110xxxxx 10xxxxxx\n                                add(static_cast<char_int_type>(0xC0u | (static_cast<unsigned int>(codepoint) >> 6u)));\n                                add(static_cast<char_int_type>(0x80u | (static_cast<unsigned int>(codepoint) & 0x3Fu)));\n                            }\n                            else if (codepoint <= 0xFFFF)\n                            {\n                                // 3-byte characters: 1110xxxx 10xxxxxx 10xxxxxx\n                                add(static_cast<char_int_type>(0xE0u | (static_cast<unsigned int>(codepoint) >> 12u)));\n                                add(static_cast<char_int_type>(0x80u | ((static_cast<unsigned int>(codepoint) >> 6u) & 0x3Fu)));\n                                add(static_cast<char_int_type>(0x80u | (static_cast<unsigned int>(codepoint) & 0x3Fu)));\n                            }\n                            else\n                            {\n                                // 4-byte characters: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx\n                                add(static_cast<char_int_type>(0xF0u | (static_cast<unsigned int>(codepoint) >> 18u)));\n                                add(static_cast<char_int_type>(0x80u | ((static_cast<unsigned int>(codepoint) >> 12u) & 0x3Fu)));\n                                add(static_cast<char_int_type>(0x80u | ((static_cast<unsigned int>(codepoint) >> 6u) & 0x3Fu)));\n                                add(static_cast<char_int_type>(0x80u | (static_cast<unsigned int>(codepoint) & 0x3Fu)));\n                            }\n\n                            break;\n                        }\n\n                        // other characters after escape\n                        default:\n                            error_message = \"invalid string: forbidden character after backslash\";\n                            return token_type::parse_error;\n                    }\n\n                    break;\n                }\n\n                // invalid control characters\n                case 0x00:\n                {\n                    error_message = \"invalid string: control character U+0000 (NUL) must be escaped to \\\\u0000\";\n                    return token_type::parse_error;\n                }\n\n                case 0x01:\n                {\n                    error_message = \"invalid string: control character U+0001 (SOH) must be escaped to \\\\u0001\";\n                    return token_type::parse_error;\n                }\n\n                case 0x02:\n                {\n                    error_message = \"invalid string: control character U+0002 (STX) must be escaped to \\\\u0002\";\n                    return token_type::parse_error;\n                }\n\n                case 0x03:\n                {\n                    error_message = \"invalid string: control character U+0003 (ETX) must be escaped to \\\\u0003\";\n                    return token_type::parse_error;\n                }\n\n                case 0x04:\n                {\n                    error_message = \"invalid string: control character U+0004 (EOT) must be escaped to \\\\u0004\";\n                    return token_type::parse_error;\n                }\n\n                case 0x05:\n                {\n                    error_message = \"invalid string: control character U+0005 (ENQ) must be escaped to \\\\u0005\";\n                    return token_type::parse_error;\n                }\n\n                case 0x06:\n                {\n                    error_message = \"invalid string: control character U+0006 (ACK) must be escaped to \\\\u0006\";\n                    return token_type::parse_error;\n                }\n\n                case 0x07:\n                {\n                    error_message = \"invalid string: control character U+0007 (BEL) must be escaped to \\\\u0007\";\n                    return token_type::parse_error;\n                }\n\n                case 0x08:\n                {\n                    error_message = \"invalid string: control character U+0008 (BS) must be escaped to \\\\u0008 or \\\\b\";\n                    return token_type::parse_error;\n                }\n\n                case 0x09:\n                {\n                    error_message = \"invalid string: control character U+0009 (HT) must be escaped to \\\\u0009 or \\\\t\";\n                    return token_type::parse_error;\n                }\n\n                case 0x0A:\n                {\n                    error_message = \"invalid string: control character U+000A (LF) must be escaped to \\\\u000A or \\\\n\";\n                    return token_type::parse_error;\n                }\n\n                case 0x0B:\n                {\n                    error_message = \"invalid string: control character U+000B (VT) must be escaped to \\\\u000B\";\n                    return token_type::parse_error;\n                }\n\n                case 0x0C:\n                {\n                    error_message = \"invalid string: control character U+000C (FF) must be escaped to \\\\u000C or \\\\f\";\n                    return token_type::parse_error;\n                }\n\n                case 0x0D:\n                {\n                    error_message = \"invalid string: control character U+000D (CR) must be escaped to \\\\u000D or \\\\r\";\n                    return token_type::parse_error;\n                }\n\n                case 0x0E:\n                {\n                    error_message = \"invalid string: control character U+000E (SO) must be escaped to \\\\u000E\";\n                    return token_type::parse_error;\n                }\n\n                case 0x0F:\n                {\n                    error_message = \"invalid string: control character U+000F (SI) must be escaped to \\\\u000F\";\n                    return token_type::parse_error;\n                }\n\n                case 0x10:\n                {\n                    error_message = \"invalid string: control character U+0010 (DLE) must be escaped to \\\\u0010\";\n                    return token_type::parse_error;\n                }\n\n                case 0x11:\n                {\n                    error_message = \"invalid string: control character U+0011 (DC1) must be escaped to \\\\u0011\";\n                    return token_type::parse_error;\n                }\n\n                case 0x12:\n                {\n                    error_message = \"invalid string: control character U+0012 (DC2) must be escaped to \\\\u0012\";\n                    return token_type::parse_error;\n                }\n\n                case 0x13:\n                {\n                    error_message = \"invalid string: control character U+0013 (DC3) must be escaped to \\\\u0013\";\n                    return token_type::parse_error;\n                }\n\n                case 0x14:\n                {\n                    error_message = \"invalid string: control character U+0014 (DC4) must be escaped to \\\\u0014\";\n                    return token_type::parse_error;\n                }\n\n                case 0x15:\n                {\n                    error_message = \"invalid string: control character U+0015 (NAK) must be escaped to \\\\u0015\";\n                    return token_type::parse_error;\n                }\n\n                case 0x16:\n                {\n                    error_message = \"invalid string: control character U+0016 (SYN) must be escaped to \\\\u0016\";\n                    return token_type::parse_error;\n                }\n\n                case 0x17:\n                {\n                    error_message = \"invalid string: control character U+0017 (ETB) must be escaped to \\\\u0017\";\n                    return token_type::parse_error;\n                }\n\n                case 0x18:\n                {\n                    error_message = \"invalid string: control character U+0018 (CAN) must be escaped to \\\\u0018\";\n                    return token_type::parse_error;\n                }\n\n                case 0x19:\n                {\n                    error_message = \"invalid string: control character U+0019 (EM) must be escaped to \\\\u0019\";\n                    return token_type::parse_error;\n                }\n\n                case 0x1A:\n                {\n                    error_message = \"invalid string: control character U+001A (SUB) must be escaped to \\\\u001A\";\n                    return token_type::parse_error;\n                }\n\n                case 0x1B:\n                {\n                    error_message = \"invalid string: control character U+001B (ESC) must be escaped to \\\\u001B\";\n                    return token_type::parse_error;\n                }\n\n                case 0x1C:\n                {\n                    error_message = \"invalid string: control character U+001C (FS) must be escaped to \\\\u001C\";\n                    return token_type::parse_error;\n                }\n\n                case 0x1D:\n                {\n                    error_message = \"invalid string: control character U+001D (GS) must be escaped to \\\\u001D\";\n                    return token_type::parse_error;\n                }\n\n                case 0x1E:\n                {\n                    error_message = \"invalid string: control character U+001E (RS) must be escaped to \\\\u001E\";\n                    return token_type::parse_error;\n                }\n\n                case 0x1F:\n                {\n                    error_message = \"invalid string: control character U+001F (US) must be escaped to \\\\u001F\";\n                    return token_type::parse_error;\n                }\n\n                // U+0020..U+007F (except U+0022 (quote) and U+005C (backspace))\n                case 0x20:\n                case 0x21:\n                case 0x23:\n                case 0x24:\n                case 0x25:\n                case 0x26:\n                case 0x27:\n                case 0x28:\n                case 0x29:\n                case 0x2A:\n                case 0x2B:\n                case 0x2C:\n                case 0x2D:\n                case 0x2E:\n                case 0x2F:\n                case 0x30:\n                case 0x31:\n                case 0x32:\n                case 0x33:\n                case 0x34:\n                case 0x35:\n                case 0x36:\n                case 0x37:\n                case 0x38:\n                case 0x39:\n                case 0x3A:\n                case 0x3B:\n                case 0x3C:\n                case 0x3D:\n                case 0x3E:\n                case 0x3F:\n                case 0x40:\n                case 0x41:\n                case 0x42:\n                case 0x43:\n                case 0x44:\n                case 0x45:\n                case 0x46:\n                case 0x47:\n                case 0x48:\n                case 0x49:\n                case 0x4A:\n                case 0x4B:\n                case 0x4C:\n                case 0x4D:\n                case 0x4E:\n                case 0x4F:\n                case 0x50:\n                case 0x51:\n                case 0x52:\n                case 0x53:\n                case 0x54:\n                case 0x55:\n                case 0x56:\n                case 0x57:\n                case 0x58:\n                case 0x59:\n                case 0x5A:\n                case 0x5B:\n                case 0x5D:\n                case 0x5E:\n                case 0x5F:\n                case 0x60:\n                case 0x61:\n                case 0x62:\n                case 0x63:\n                case 0x64:\n                case 0x65:\n                case 0x66:\n                case 0x67:\n                case 0x68:\n                case 0x69:\n                case 0x6A:\n                case 0x6B:\n                case 0x6C:\n                case 0x6D:\n                case 0x6E:\n                case 0x6F:\n                case 0x70:\n                case 0x71:\n                case 0x72:\n                case 0x73:\n                case 0x74:\n                case 0x75:\n                case 0x76:\n                case 0x77:\n                case 0x78:\n                case 0x79:\n                case 0x7A:\n                case 0x7B:\n                case 0x7C:\n                case 0x7D:\n                case 0x7E:\n                case 0x7F:\n                {\n                    add(current);\n                    break;\n                }\n\n                // U+0080..U+07FF: bytes C2..DF 80..BF\n                case 0xC2:\n                case 0xC3:\n                case 0xC4:\n                case 0xC5:\n                case 0xC6:\n                case 0xC7:\n                case 0xC8:\n                case 0xC9:\n                case 0xCA:\n                case 0xCB:\n                case 0xCC:\n                case 0xCD:\n                case 0xCE:\n                case 0xCF:\n                case 0xD0:\n                case 0xD1:\n                case 0xD2:\n                case 0xD3:\n                case 0xD4:\n                case 0xD5:\n                case 0xD6:\n                case 0xD7:\n                case 0xD8:\n                case 0xD9:\n                case 0xDA:\n                case 0xDB:\n                case 0xDC:\n                case 0xDD:\n                case 0xDE:\n                case 0xDF:\n                {\n                    if (JSON_HEDLEY_UNLIKELY(!next_byte_in_range({0x80, 0xBF})))\n                    {\n                        return token_type::parse_error;\n                    }\n                    break;\n                }\n\n                // U+0800..U+0FFF: bytes E0 A0..BF 80..BF\n                case 0xE0:\n                {\n                    if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0xA0, 0xBF, 0x80, 0xBF}))))\n                    {\n                        return token_type::parse_error;\n                    }\n                    break;\n                }\n\n                // U+1000..U+CFFF: bytes E1..EC 80..BF 80..BF\n                // U+E000..U+FFFF: bytes EE..EF 80..BF 80..BF\n                case 0xE1:\n                case 0xE2:\n                case 0xE3:\n                case 0xE4:\n                case 0xE5:\n                case 0xE6:\n                case 0xE7:\n                case 0xE8:\n                case 0xE9:\n                case 0xEA:\n                case 0xEB:\n                case 0xEC:\n                case 0xEE:\n                case 0xEF:\n                {\n                    if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0xBF, 0x80, 0xBF}))))\n                    {\n                        return token_type::parse_error;\n                    }\n                    break;\n                }\n\n                // U+D000..U+D7FF: bytes ED 80..9F 80..BF\n                case 0xED:\n                {\n                    if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0x9F, 0x80, 0xBF}))))\n                    {\n                        return token_type::parse_error;\n                    }\n                    break;\n                }\n\n                // U+10000..U+3FFFF F0 90..BF 80..BF 80..BF\n                case 0xF0:\n                {\n                    if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x90, 0xBF, 0x80, 0xBF, 0x80, 0xBF}))))\n                    {\n                        return token_type::parse_error;\n                    }\n                    break;\n                }\n\n                // U+40000..U+FFFFF F1..F3 80..BF 80..BF 80..BF\n                case 0xF1:\n                case 0xF2:\n                case 0xF3:\n                {\n                    if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0xBF, 0x80, 0xBF, 0x80, 0xBF}))))\n                    {\n                        return token_type::parse_error;\n                    }\n                    break;\n                }\n\n                // U+100000..U+10FFFF F4 80..8F 80..BF 80..BF\n                case 0xF4:\n                {\n                    if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0x8F, 0x80, 0xBF, 0x80, 0xBF}))))\n                    {\n                        return token_type::parse_error;\n                    }\n                    break;\n                }\n\n                // remaining bytes (80..C1 and F5..FF) are ill-formed\n                default:\n                {\n                    error_message = \"invalid string: ill-formed UTF-8 byte\";\n                    return token_type::parse_error;\n                }\n            }\n        }\n    }\n\n    /*!\n     * @brief scan a comment\n     * @return whether comment could be scanned successfully\n     */\n    bool scan_comment()\n    {\n        switch (get())\n        {\n            // single-line comments skip input until a newline or EOF is read\n            case '/':\n            {\n                while (true)\n                {\n                    switch (get())\n                    {\n                        case '\\n':\n                        case '\\r':\n                        case std::char_traits<char_type>::eof():\n                        case '\\0':\n                            return true;\n\n                        default:\n                            break;\n                    }\n                }\n            }\n\n            // multi-line comments skip input until */ is read\n            case '*':\n            {\n                while (true)\n                {\n                    switch (get())\n                    {\n                        case std::char_traits<char_type>::eof():\n                        case '\\0':\n                        {\n                            error_message = \"invalid comment; missing closing '*/'\";\n                            return false;\n                        }\n\n                        case '*':\n                        {\n                            switch (get())\n                            {\n                                case '/':\n                                    return true;\n\n                                default:\n                                {\n                                    unget();\n                                    continue;\n                                }\n                            }\n                        }\n\n                        default:\n                            continue;\n                    }\n                }\n            }\n\n            // unexpected character after reading '/'\n            default:\n            {\n                error_message = \"invalid comment; expecting '/' or '*' after '/'\";\n                return false;\n            }\n        }\n    }\n\n    JSON_HEDLEY_NON_NULL(2)\n    static void strtof(float& f, const char* str, char** endptr) noexcept\n    {\n        f = std::strtof(str, endptr);\n    }\n\n    JSON_HEDLEY_NON_NULL(2)\n    static void strtof(double& f, const char* str, char** endptr) noexcept\n    {\n        f = std::strtod(str, endptr);\n    }\n\n    JSON_HEDLEY_NON_NULL(2)\n    static void strtof(long double& f, const char* str, char** endptr) noexcept\n    {\n        f = std::strtold(str, endptr);\n    }\n\n    /*!\n    @brief scan a number literal\n\n    This function scans a string according to Sect. 6 of RFC 7159.\n\n    The function is realized with a deterministic finite state machine derived\n    from the grammar described in RFC 7159. Starting in state \"init\", the\n    input is read and used to determined the next state. Only state \"done\"\n    accepts the number. State \"error\" is a trap state to model errors. In the\n    table below, \"anything\" means any character but the ones listed before.\n\n    state    | 0        | 1-9      | e E      | +       | -       | .        | anything\n    ---------|----------|----------|----------|---------|---------|----------|-----------\n    init     | zero     | any1     | [error]  | [error] | minus   | [error]  | [error]\n    minus    | zero     | any1     | [error]  | [error] | [error] | [error]  | [error]\n    zero     | done     | done     | exponent | done    | done    | decimal1 | done\n    any1     | any1     | any1     | exponent | done    | done    | decimal1 | done\n    decimal1 | decimal2 | decimal2 | [error]  | [error] | [error] | [error]  | [error]\n    decimal2 | decimal2 | decimal2 | exponent | done    | done    | done     | done\n    exponent | any2     | any2     | [error]  | sign    | sign    | [error]  | [error]\n    sign     | any2     | any2     | [error]  | [error] | [error] | [error]  | [error]\n    any2     | any2     | any2     | done     | done    | done    | done     | done\n\n    The state machine is realized with one label per state (prefixed with\n    \"scan_number_\") and `goto` statements between them. The state machine\n    contains cycles, but any cycle can be left when EOF is read. Therefore,\n    the function is guaranteed to terminate.\n\n    During scanning, the read bytes are stored in token_buffer. This string is\n    then converted to a signed integer, an unsigned integer, or a\n    floating-point number.\n\n    @return token_type::value_unsigned, token_type::value_integer, or\n            token_type::value_float if number could be successfully scanned,\n            token_type::parse_error otherwise\n\n    @note The scanner is independent of the current locale. Internally, the\n          locale's decimal point is used instead of `.` to work with the\n          locale-dependent converters.\n    */\n    token_type scan_number()  // lgtm [cpp/use-of-goto]\n    {\n        // reset token_buffer to store the number's bytes\n        reset();\n\n        // the type of the parsed number; initially set to unsigned; will be\n        // changed if minus sign, decimal point or exponent is read\n        token_type number_type = token_type::value_unsigned;\n\n        // state (init): we just found out we need to scan a number\n        switch (current)\n        {\n            case '-':\n            {\n                add(current);\n                goto scan_number_minus;\n            }\n\n            case '0':\n            {\n                add(current);\n                goto scan_number_zero;\n            }\n\n            case '1':\n            case '2':\n            case '3':\n            case '4':\n            case '5':\n            case '6':\n            case '7':\n            case '8':\n            case '9':\n            {\n                add(current);\n                goto scan_number_any1;\n            }\n\n            // all other characters are rejected outside scan_number()\n            default:            // LCOV_EXCL_LINE\n                JSON_ASSERT(false);  // LCOV_EXCL_LINE\n        }\n\nscan_number_minus:\n        // state: we just parsed a leading minus sign\n        number_type = token_type::value_integer;\n        switch (get())\n        {\n            case '0':\n            {\n                add(current);\n                goto scan_number_zero;\n            }\n\n            case '1':\n            case '2':\n            case '3':\n            case '4':\n            case '5':\n            case '6':\n            case '7':\n            case '8':\n            case '9':\n            {\n                add(current);\n                goto scan_number_any1;\n            }\n\n            default:\n            {\n                error_message = \"invalid number; expected digit after '-'\";\n                return token_type::parse_error;\n            }\n        }\n\nscan_number_zero:\n        // state: we just parse a zero (maybe with a leading minus sign)\n        switch (get())\n        {\n            case '.':\n            {\n                add(decimal_point_char);\n                goto scan_number_decimal1;\n            }\n\n            case 'e':\n            case 'E':\n            {\n                add(current);\n                goto scan_number_exponent;\n            }\n\n            default:\n                goto scan_number_done;\n        }\n\nscan_number_any1:\n        // state: we just parsed a number 0-9 (maybe with a leading minus sign)\n        switch (get())\n        {\n            case '0':\n            case '1':\n            case '2':\n            case '3':\n            case '4':\n            case '5':\n            case '6':\n            case '7':\n            case '8':\n            case '9':\n            {\n                add(current);\n                goto scan_number_any1;\n            }\n\n            case '.':\n            {\n                add(decimal_point_char);\n                goto scan_number_decimal1;\n            }\n\n            case 'e':\n            case 'E':\n            {\n                add(current);\n                goto scan_number_exponent;\n            }\n\n            default:\n                goto scan_number_done;\n        }\n\nscan_number_decimal1:\n        // state: we just parsed a decimal point\n        number_type = token_type::value_float;\n        switch (get())\n        {\n            case '0':\n            case '1':\n            case '2':\n            case '3':\n            case '4':\n            case '5':\n            case '6':\n            case '7':\n            case '8':\n            case '9':\n            {\n                add(current);\n                goto scan_number_decimal2;\n            }\n\n            default:\n            {\n                error_message = \"invalid number; expected digit after '.'\";\n                return token_type::parse_error;\n            }\n        }\n\nscan_number_decimal2:\n        // we just parsed at least one number after a decimal point\n        switch (get())\n        {\n            case '0':\n            case '1':\n            case '2':\n            case '3':\n            case '4':\n            case '5':\n            case '6':\n            case '7':\n            case '8':\n            case '9':\n            {\n                add(current);\n                goto scan_number_decimal2;\n            }\n\n            case 'e':\n            case 'E':\n            {\n                add(current);\n                goto scan_number_exponent;\n            }\n\n            default:\n                goto scan_number_done;\n        }\n\nscan_number_exponent:\n        // we just parsed an exponent\n        number_type = token_type::value_float;\n        switch (get())\n        {\n            case '+':\n            case '-':\n            {\n                add(current);\n                goto scan_number_sign;\n            }\n\n            case '0':\n            case '1':\n            case '2':\n            case '3':\n            case '4':\n            case '5':\n            case '6':\n            case '7':\n            case '8':\n            case '9':\n            {\n                add(current);\n                goto scan_number_any2;\n            }\n\n            default:\n            {\n                error_message =\n                    \"invalid number; expected '+', '-', or digit after exponent\";\n                return token_type::parse_error;\n            }\n        }\n\nscan_number_sign:\n        // we just parsed an exponent sign\n        switch (get())\n        {\n            case '0':\n            case '1':\n            case '2':\n            case '3':\n            case '4':\n            case '5':\n            case '6':\n            case '7':\n            case '8':\n            case '9':\n            {\n                add(current);\n                goto scan_number_any2;\n            }\n\n            default:\n            {\n                error_message = \"invalid number; expected digit after exponent sign\";\n                return token_type::parse_error;\n            }\n        }\n\nscan_number_any2:\n        // we just parsed a number after the exponent or exponent sign\n        switch (get())\n        {\n            case '0':\n            case '1':\n            case '2':\n            case '3':\n            case '4':\n            case '5':\n            case '6':\n            case '7':\n            case '8':\n            case '9':\n            {\n                add(current);\n                goto scan_number_any2;\n            }\n\n            default:\n                goto scan_number_done;\n        }\n\nscan_number_done:\n        // unget the character after the number (we only read it to know that\n        // we are done scanning a number)\n        unget();\n\n        char* endptr = nullptr;\n        errno = 0;\n\n        // try to parse integers first and fall back to floats\n        if (number_type == token_type::value_unsigned)\n        {\n            const auto x = std::strtoull(token_buffer.data(), &endptr, 10);\n\n            // we checked the number format before\n            JSON_ASSERT(endptr == token_buffer.data() + token_buffer.size());\n\n            if (errno == 0)\n            {\n                value_unsigned = static_cast<number_unsigned_t>(x);\n                if (value_unsigned == x)\n                {\n                    return token_type::value_unsigned;\n                }\n            }\n        }\n        else if (number_type == token_type::value_integer)\n        {\n            const auto x = std::strtoll(token_buffer.data(), &endptr, 10);\n\n            // we checked the number format before\n            JSON_ASSERT(endptr == token_buffer.data() + token_buffer.size());\n\n            if (errno == 0)\n            {\n                value_integer = static_cast<number_integer_t>(x);\n                if (value_integer == x)\n                {\n                    return token_type::value_integer;\n                }\n            }\n        }\n\n        // this code is reached if we parse a floating-point number or if an\n        // integer conversion above failed\n        strtof(value_float, token_buffer.data(), &endptr);\n\n        // we checked the number format before\n        JSON_ASSERT(endptr == token_buffer.data() + token_buffer.size());\n\n        return token_type::value_float;\n    }\n\n    /*!\n    @param[in] literal_text  the literal text to expect\n    @param[in] length        the length of the passed literal text\n    @param[in] return_type   the token type to return on success\n    */\n    JSON_HEDLEY_NON_NULL(2)\n    token_type scan_literal(const char_type* literal_text, const std::size_t length,\n                            token_type return_type)\n    {\n        JSON_ASSERT(std::char_traits<char_type>::to_char_type(current) == literal_text[0]);\n        for (std::size_t i = 1; i < length; ++i)\n        {\n            if (JSON_HEDLEY_UNLIKELY(std::char_traits<char_type>::to_char_type(get()) != literal_text[i]))\n            {\n                error_message = \"invalid literal\";\n                return token_type::parse_error;\n            }\n        }\n        return return_type;\n    }\n\n    /////////////////////\n    // input management\n    /////////////////////\n\n    /// reset token_buffer; current character is beginning of token\n    void reset() noexcept\n    {\n        token_buffer.clear();\n        token_string.clear();\n        token_string.push_back(std::char_traits<char_type>::to_char_type(current));\n    }\n\n    /*\n    @brief get next character from the input\n\n    This function provides the interface to the used input adapter. It does\n    not throw in case the input reached EOF, but returns a\n    `std::char_traits<char>::eof()` in that case.  Stores the scanned characters\n    for use in error messages.\n\n    @return character read from the input\n    */\n    char_int_type get()\n    {\n        ++position.chars_read_total;\n        ++position.chars_read_current_line;\n\n        if (next_unget)\n        {\n            // just reset the next_unget variable and work with current\n            next_unget = false;\n        }\n        else\n        {\n            current = ia.get_character();\n        }\n\n        if (JSON_HEDLEY_LIKELY(current != std::char_traits<char_type>::eof()))\n        {\n            token_string.push_back(std::char_traits<char_type>::to_char_type(current));\n        }\n\n        if (current == '\\n')\n        {\n            ++position.lines_read;\n            position.chars_read_current_line = 0;\n        }\n\n        return current;\n    }\n\n    /*!\n    @brief unget current character (read it again on next get)\n\n    We implement unget by setting variable next_unget to true. The input is not\n    changed - we just simulate ungetting by modifying chars_read_total,\n    chars_read_current_line, and token_string. The next call to get() will\n    behave as if the unget character is read again.\n    */\n    void unget()\n    {\n        next_unget = true;\n\n        --position.chars_read_total;\n\n        // in case we \"unget\" a newline, we have to also decrement the lines_read\n        if (position.chars_read_current_line == 0)\n        {\n            if (position.lines_read > 0)\n            {\n                --position.lines_read;\n            }\n        }\n        else\n        {\n            --position.chars_read_current_line;\n        }\n\n        if (JSON_HEDLEY_LIKELY(current != std::char_traits<char_type>::eof()))\n        {\n            JSON_ASSERT(!token_string.empty());\n            token_string.pop_back();\n        }\n    }\n\n    /// add a character to token_buffer\n    void add(char_int_type c)\n    {\n        token_buffer.push_back(static_cast<typename string_t::value_type>(c));\n    }\n\n  public:\n    /////////////////////\n    // value getters\n    /////////////////////\n\n    /// return integer value\n    constexpr number_integer_t get_number_integer() const noexcept\n    {\n        return value_integer;\n    }\n\n    /// return unsigned integer value\n    constexpr number_unsigned_t get_number_unsigned() const noexcept\n    {\n        return value_unsigned;\n    }\n\n    /// return floating-point value\n    constexpr number_float_t get_number_float() const noexcept\n    {\n        return value_float;\n    }\n\n    /// return current string value (implicitly resets the token; useful only once)\n    string_t& get_string()\n    {\n        return token_buffer;\n    }\n\n    /////////////////////\n    // diagnostics\n    /////////////////////\n\n    /// return position of last read token\n    constexpr position_t get_position() const noexcept\n    {\n        return position;\n    }\n\n    /// return the last read token (for errors only).  Will never contain EOF\n    /// (an arbitrary value that is not a valid char value, often -1), because\n    /// 255 may legitimately occur.  May contain NUL, which should be escaped.\n    std::string get_token_string() const\n    {\n        // escape control characters\n        std::string result;\n        for (const auto c : token_string)\n        {\n            if (static_cast<unsigned char>(c) <= '\\x1F')\n            {\n                // escape control characters\n                std::array<char, 9> cs{{}};\n                (std::snprintf)(cs.data(), cs.size(), \"<U+%.4X>\", static_cast<unsigned char>(c));\n                result += cs.data();\n            }\n            else\n            {\n                // add character as is\n                result.push_back(static_cast<std::string::value_type>(c));\n            }\n        }\n\n        return result;\n    }\n\n    /// return syntax error message\n    JSON_HEDLEY_RETURNS_NON_NULL\n    constexpr const char* get_error_message() const noexcept\n    {\n        return error_message;\n    }\n\n    /////////////////////\n    // actual scanner\n    /////////////////////\n\n    /*!\n    @brief skip the UTF-8 byte order mark\n    @return true iff there is no BOM or the correct BOM has been skipped\n    */\n    bool skip_bom()\n    {\n        if (get() == 0xEF)\n        {\n            // check if we completely parse the BOM\n            return get() == 0xBB && get() == 0xBF;\n        }\n\n        // the first character is not the beginning of the BOM; unget it to\n        // process is later\n        unget();\n        return true;\n    }\n\n    void skip_whitespace()\n    {\n        do\n        {\n            get();\n        }\n        while (current == ' ' || current == '\\t' || current == '\\n' || current == '\\r');\n    }\n\n    token_type scan()\n    {\n        // initially, skip the BOM\n        if (position.chars_read_total == 0 && !skip_bom())\n        {\n            error_message = \"invalid BOM; must be 0xEF 0xBB 0xBF if given\";\n            return token_type::parse_error;\n        }\n\n        // read next character and ignore whitespace\n        skip_whitespace();\n\n        // ignore comments\n        while (ignore_comments && current == '/')\n        {\n            if (!scan_comment())\n            {\n                return token_type::parse_error;\n            }\n\n            // skip following whitespace\n            skip_whitespace();\n        }\n\n        switch (current)\n        {\n            // structural characters\n            case '[':\n                return token_type::begin_array;\n            case ']':\n                return token_type::end_array;\n            case '{':\n                return token_type::begin_object;\n            case '}':\n                return token_type::end_object;\n            case ':':\n                return token_type::name_separator;\n            case ',':\n                return token_type::value_separator;\n\n            // literals\n            case 't':\n            {\n                std::array<char_type, 4> true_literal = {{'t', 'r', 'u', 'e'}};\n                return scan_literal(true_literal.data(), true_literal.size(), token_type::literal_true);\n            }\n            case 'f':\n            {\n                std::array<char_type, 5> false_literal = {{'f', 'a', 'l', 's', 'e'}};\n                return scan_literal(false_literal.data(), false_literal.size(), token_type::literal_false);\n            }\n            case 'n':\n            {\n                std::array<char_type, 4> null_literal = {{'n', 'u', 'l', 'l'}};\n                return scan_literal(null_literal.data(), null_literal.size(), token_type::literal_null);\n            }\n\n            // string\n            case '\\\"':\n                return scan_string();\n\n            // number\n            case '-':\n            case '0':\n            case '1':\n            case '2':\n            case '3':\n            case '4':\n            case '5':\n            case '6':\n            case '7':\n            case '8':\n            case '9':\n                return scan_number();\n\n            // end of input (the null byte is needed when parsing from\n            // string literals)\n            case '\\0':\n            case std::char_traits<char_type>::eof():\n                return token_type::end_of_input;\n\n            // error\n            default:\n                error_message = \"invalid literal\";\n                return token_type::parse_error;\n        }\n    }\n\n  private:\n    /// input adapter\n    InputAdapterType ia;\n\n    /// whether comments should be ignored (true) or signaled as errors (false)\n    const bool ignore_comments = false;\n\n    /// the current character\n    char_int_type current = std::char_traits<char_type>::eof();\n\n    /// whether the next get() call should just return current\n    bool next_unget = false;\n\n    /// the start position of the current token\n    position_t position {};\n\n    /// raw input token string (for error messages)\n    std::vector<char_type> token_string {};\n\n    /// buffer for variable-length tokens (numbers, strings)\n    string_t token_buffer {};\n\n    /// a description of occurred lexer errors\n    const char* error_message = \"\";\n\n    // number values\n    number_integer_t value_integer = 0;\n    number_unsigned_t value_unsigned = 0;\n    number_float_t value_float = 0;\n\n    /// the decimal point\n    const char_int_type decimal_point_char = '.';\n};\n}  // namespace detail\n}  // namespace nlohmann\n\n// #include <nlohmann/detail/macro_scope.hpp>\n\n// #include <nlohmann/detail/meta/is_sax.hpp>\n\n\n#include <cstdint> // size_t\n#include <utility> // declval\n#include <string> // string\n\n// #include <nlohmann/detail/meta/detected.hpp>\n\n// #include <nlohmann/detail/meta/type_traits.hpp>\n\n\nnamespace nlohmann\n{\nnamespace detail\n{\ntemplate<typename T>\nusing null_function_t = decltype(std::declval<T&>().null());\n\ntemplate<typename T>\nusing boolean_function_t =\n    decltype(std::declval<T&>().boolean(std::declval<bool>()));\n\ntemplate<typename T, typename Integer>\nusing number_integer_function_t =\n    decltype(std::declval<T&>().number_integer(std::declval<Integer>()));\n\ntemplate<typename T, typename Unsigned>\nusing number_unsigned_function_t =\n    decltype(std::declval<T&>().number_unsigned(std::declval<Unsigned>()));\n\ntemplate<typename T, typename Float, typename String>\nusing number_float_function_t = decltype(std::declval<T&>().number_float(\n                                    std::declval<Float>(), std::declval<const String&>()));\n\ntemplate<typename T, typename String>\nusing string_function_t =\n    decltype(std::declval<T&>().string(std::declval<String&>()));\n\ntemplate<typename T, typename Binary>\nusing binary_function_t =\n    decltype(std::declval<T&>().binary(std::declval<Binary&>()));\n\ntemplate<typename T>\nusing start_object_function_t =\n    decltype(std::declval<T&>().start_object(std::declval<std::size_t>()));\n\ntemplate<typename T, typename String>\nusing key_function_t =\n    decltype(std::declval<T&>().key(std::declval<String&>()));\n\ntemplate<typename T>\nusing end_object_function_t = decltype(std::declval<T&>().end_object());\n\ntemplate<typename T>\nusing start_array_function_t =\n    decltype(std::declval<T&>().start_array(std::declval<std::size_t>()));\n\ntemplate<typename T>\nusing end_array_function_t = decltype(std::declval<T&>().end_array());\n\ntemplate<typename T, typename Exception>\nusing parse_error_function_t = decltype(std::declval<T&>().parse_error(\n        std::declval<std::size_t>(), std::declval<const std::string&>(),\n        std::declval<const Exception&>()));\n\ntemplate<typename SAX, typename BasicJsonType>\nstruct is_sax\n{\n  private:\n    static_assert(is_basic_json<BasicJsonType>::value,\n                  \"BasicJsonType must be of type basic_json<...>\");\n\n    using number_integer_t = typename BasicJsonType::number_integer_t;\n    using number_unsigned_t = typename BasicJsonType::number_unsigned_t;\n    using number_float_t = typename BasicJsonType::number_float_t;\n    using string_t = typename BasicJsonType::string_t;\n    using binary_t = typename BasicJsonType::binary_t;\n    using exception_t = typename BasicJsonType::exception;\n\n  public:\n    static constexpr bool value =\n        is_detected_exact<bool, null_function_t, SAX>::value &&\n        is_detected_exact<bool, boolean_function_t, SAX>::value &&\n        is_detected_exact<bool, number_integer_function_t, SAX, number_integer_t>::value &&\n        is_detected_exact<bool, number_unsigned_function_t, SAX, number_unsigned_t>::value &&\n        is_detected_exact<bool, number_float_function_t, SAX, number_float_t, string_t>::value &&\n        is_detected_exact<bool, string_function_t, SAX, string_t>::value &&\n        is_detected_exact<bool, binary_function_t, SAX, binary_t>::value &&\n        is_detected_exact<bool, start_object_function_t, SAX>::value &&\n        is_detected_exact<bool, key_function_t, SAX, string_t>::value &&\n        is_detected_exact<bool, end_object_function_t, SAX>::value &&\n        is_detected_exact<bool, start_array_function_t, SAX>::value &&\n        is_detected_exact<bool, end_array_function_t, SAX>::value &&\n        is_detected_exact<bool, parse_error_function_t, SAX, exception_t>::value;\n};\n\ntemplate<typename SAX, typename BasicJsonType>\nstruct is_sax_static_asserts\n{\n  private:\n    static_assert(is_basic_json<BasicJsonType>::value,\n                  \"BasicJsonType must be of type basic_json<...>\");\n\n    using number_integer_t = typename BasicJsonType::number_integer_t;\n    using number_unsigned_t = typename BasicJsonType::number_unsigned_t;\n    using number_float_t = typename BasicJsonType::number_float_t;\n    using string_t = typename BasicJsonType::string_t;\n    using binary_t = typename BasicJsonType::binary_t;\n    using exception_t = typename BasicJsonType::exception;\n\n  public:\n    static_assert(is_detected_exact<bool, null_function_t, SAX>::value,\n                  \"Missing/invalid function: bool null()\");\n    static_assert(is_detected_exact<bool, boolean_function_t, SAX>::value,\n                  \"Missing/invalid function: bool boolean(bool)\");\n    static_assert(is_detected_exact<bool, boolean_function_t, SAX>::value,\n                  \"Missing/invalid function: bool boolean(bool)\");\n    static_assert(\n        is_detected_exact<bool, number_integer_function_t, SAX,\n        number_integer_t>::value,\n        \"Missing/invalid function: bool number_integer(number_integer_t)\");\n    static_assert(\n        is_detected_exact<bool, number_unsigned_function_t, SAX,\n        number_unsigned_t>::value,\n        \"Missing/invalid function: bool number_unsigned(number_unsigned_t)\");\n    static_assert(is_detected_exact<bool, number_float_function_t, SAX,\n                  number_float_t, string_t>::value,\n                  \"Missing/invalid function: bool number_float(number_float_t, const string_t&)\");\n    static_assert(\n        is_detected_exact<bool, string_function_t, SAX, string_t>::value,\n        \"Missing/invalid function: bool string(string_t&)\");\n    static_assert(\n        is_detected_exact<bool, binary_function_t, SAX, binary_t>::value,\n        \"Missing/invalid function: bool binary(binary_t&)\");\n    static_assert(is_detected_exact<bool, start_object_function_t, SAX>::value,\n                  \"Missing/invalid function: bool start_object(std::size_t)\");\n    static_assert(is_detected_exact<bool, key_function_t, SAX, string_t>::value,\n                  \"Missing/invalid function: bool key(string_t&)\");\n    static_assert(is_detected_exact<bool, end_object_function_t, SAX>::value,\n                  \"Missing/invalid function: bool end_object()\");\n    static_assert(is_detected_exact<bool, start_array_function_t, SAX>::value,\n                  \"Missing/invalid function: bool start_array(std::size_t)\");\n    static_assert(is_detected_exact<bool, end_array_function_t, SAX>::value,\n                  \"Missing/invalid function: bool end_array()\");\n    static_assert(\n        is_detected_exact<bool, parse_error_function_t, SAX, exception_t>::value,\n        \"Missing/invalid function: bool parse_error(std::size_t, const \"\n        \"std::string&, const exception&)\");\n};\n}  // namespace detail\n}  // namespace nlohmann\n\n// #include <nlohmann/detail/value_t.hpp>\n\n\nnamespace nlohmann\n{\nnamespace detail\n{\n\n/// how to treat CBOR tags\nenum class cbor_tag_handler_t\n{\n    error,  ///< throw a parse_error exception in case of a tag\n    ignore   ///< ignore tags\n};\n\n/*!\n@brief determine system byte order\n\n@return true if and only if system's byte order is little endian\n\n@note from https://stackoverflow.com/a/1001328/266378\n*/\nstatic inline bool little_endianess(int num = 1) noexcept\n{\n    return *reinterpret_cast<char*>(&num) == 1;\n}\n\n\n///////////////////\n// binary reader //\n///////////////////\n\n/*!\n@brief deserialization of CBOR, MessagePack, and UBJSON values\n*/\ntemplate<typename BasicJsonType, typename InputAdapterType, typename SAX = json_sax_dom_parser<BasicJsonType>>\nclass binary_reader\n{\n    using number_integer_t = typename BasicJsonType::number_integer_t;\n    using number_unsigned_t = typename BasicJsonType::number_unsigned_t;\n    using number_float_t = typename BasicJsonType::number_float_t;\n    using string_t = typename BasicJsonType::string_t;\n    using binary_t = typename BasicJsonType::binary_t;\n    using json_sax_t = SAX;\n    using char_type = typename InputAdapterType::char_type;\n    using char_int_type = typename std::char_traits<char_type>::int_type;\n\n  public:\n    /*!\n    @brief create a binary reader\n\n    @param[in] adapter  input adapter to read from\n    */\n    explicit binary_reader(InputAdapterType&& adapter) : ia(std::move(adapter))\n    {\n        (void)detail::is_sax_static_asserts<SAX, BasicJsonType> {};\n    }\n\n    // make class move-only\n    binary_reader(const binary_reader&) = delete;\n    binary_reader(binary_reader&&) = default;\n    binary_reader& operator=(const binary_reader&) = delete;\n    binary_reader& operator=(binary_reader&&) = default;\n    ~binary_reader() = default;\n\n    /*!\n    @param[in] format  the binary format to parse\n    @param[in] sax_    a SAX event processor\n    @param[in] strict  whether to expect the input to be consumed completed\n    @param[in] tag_handler  how to treat CBOR tags\n\n    @return\n    */\n    JSON_HEDLEY_NON_NULL(3)\n    bool sax_parse(const input_format_t format,\n                   json_sax_t* sax_,\n                   const bool strict = true,\n                   const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error)\n    {\n        sax = sax_;\n        bool result = false;\n\n        switch (format)\n        {\n            case input_format_t::bson:\n                result = parse_bson_internal();\n                break;\n\n            case input_format_t::cbor:\n                result = parse_cbor_internal(true, tag_handler);\n                break;\n\n            case input_format_t::msgpack:\n                result = parse_msgpack_internal();\n                break;\n\n            case input_format_t::ubjson:\n                result = parse_ubjson_internal();\n                break;\n\n            default:            // LCOV_EXCL_LINE\n                JSON_ASSERT(false);  // LCOV_EXCL_LINE\n        }\n\n        // strict mode: next byte must be EOF\n        if (result && strict)\n        {\n            if (format == input_format_t::ubjson)\n            {\n                get_ignore_noop();\n            }\n            else\n            {\n                get();\n            }\n\n            if (JSON_HEDLEY_UNLIKELY(current != std::char_traits<char_type>::eof()))\n            {\n                return sax->parse_error(chars_read, get_token_string(),\n                                        parse_error::create(110, chars_read, exception_message(format, \"expected end of input; last byte: 0x\" + get_token_string(), \"value\")));\n            }\n        }\n\n        return result;\n    }\n\n  private:\n    //////////\n    // BSON //\n    //////////\n\n    /*!\n    @brief Reads in a BSON-object and passes it to the SAX-parser.\n    @return whether a valid BSON-value was passed to the SAX parser\n    */\n    bool parse_bson_internal()\n    {\n        std::int32_t document_size{};\n        get_number<std::int32_t, true>(input_format_t::bson, document_size);\n\n        if (JSON_HEDLEY_UNLIKELY(!sax->start_object(std::size_t(-1))))\n        {\n            return false;\n        }\n\n        if (JSON_HEDLEY_UNLIKELY(!parse_bson_element_list(/*is_array*/false)))\n        {\n            return false;\n        }\n\n        return sax->end_object();\n    }\n\n    /*!\n    @brief Parses a C-style string from the BSON input.\n    @param[in, out] result  A reference to the string variable where the read\n                            string is to be stored.\n    @return `true` if the \\x00-byte indicating the end of the string was\n             encountered before the EOF; false` indicates an unexpected EOF.\n    */\n    bool get_bson_cstr(string_t& result)\n    {\n        auto out = std::back_inserter(result);\n        while (true)\n        {\n            get();\n            if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::bson, \"cstring\")))\n            {\n                return false;\n            }\n            if (current == 0x00)\n            {\n                return true;\n            }\n            *out++ = static_cast<typename string_t::value_type>(current);\n        }\n    }\n\n    /*!\n    @brief Parses a zero-terminated string of length @a len from the BSON\n           input.\n    @param[in] len  The length (including the zero-byte at the end) of the\n                    string to be read.\n    @param[in, out] result  A reference to the string variable where the read\n                            string is to be stored.\n    @tparam NumberType The type of the length @a len\n    @pre len >= 1\n    @return `true` if the string was successfully parsed\n    */\n    template<typename NumberType>\n    bool get_bson_string(const NumberType len, string_t& result)\n    {\n        if (JSON_HEDLEY_UNLIKELY(len < 1))\n        {\n            auto last_token = get_token_string();\n            return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::bson, \"string length must be at least 1, is \" + std::to_string(len), \"string\")));\n        }\n\n        return get_string(input_format_t::bson, len - static_cast<NumberType>(1), result) && get() != std::char_traits<char_type>::eof();\n    }\n\n    /*!\n    @brief Parses a byte array input of length @a len from the BSON input.\n    @param[in] len  The length of the byte array to be read.\n    @param[in, out] result  A reference to the binary variable where the read\n                            array is to be stored.\n    @tparam NumberType The type of the length @a len\n    @pre len >= 0\n    @return `true` if the byte array was successfully parsed\n    */\n    template<typename NumberType>\n    bool get_bson_binary(const NumberType len, binary_t& result)\n    {\n        if (JSON_HEDLEY_UNLIKELY(len < 0))\n        {\n            auto last_token = get_token_string();\n            return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::bson, \"byte array length cannot be negative, is \" + std::to_string(len), \"binary\")));\n        }\n\n        // All BSON binary values have a subtype\n        std::uint8_t subtype{};\n        get_number<std::uint8_t>(input_format_t::bson, subtype);\n        result.set_subtype(subtype);\n\n        return get_binary(input_format_t::bson, len, result);\n    }\n\n    /*!\n    @brief Read a BSON document element of the given @a element_type.\n    @param[in] element_type The BSON element type, c.f. http://bsonspec.org/spec.html\n    @param[in] element_type_parse_position The position in the input stream,\n               where the `element_type` was read.\n    @warning Not all BSON element types are supported yet. An unsupported\n             @a element_type will give rise to a parse_error.114:\n             Unsupported BSON record type 0x...\n    @return whether a valid BSON-object/array was passed to the SAX parser\n    */\n    bool parse_bson_element_internal(const char_int_type element_type,\n                                     const std::size_t element_type_parse_position)\n    {\n        switch (element_type)\n        {\n            case 0x01: // double\n            {\n                double number{};\n                return get_number<double, true>(input_format_t::bson, number) && sax->number_float(static_cast<number_float_t>(number), \"\");\n            }\n\n            case 0x02: // string\n            {\n                std::int32_t len{};\n                string_t value;\n                return get_number<std::int32_t, true>(input_format_t::bson, len) && get_bson_string(len, value) && sax->string(value);\n            }\n\n            case 0x03: // object\n            {\n                return parse_bson_internal();\n            }\n\n            case 0x04: // array\n            {\n                return parse_bson_array();\n            }\n\n            case 0x05: // binary\n            {\n                std::int32_t len{};\n                binary_t value;\n                return get_number<std::int32_t, true>(input_format_t::bson, len) && get_bson_binary(len, value) && sax->binary(value);\n            }\n\n            case 0x08: // boolean\n            {\n                return sax->boolean(get() != 0);\n            }\n\n            case 0x0A: // null\n            {\n                return sax->null();\n            }\n\n            case 0x10: // int32\n            {\n                std::int32_t value{};\n                return get_number<std::int32_t, true>(input_format_t::bson, value) && sax->number_integer(value);\n            }\n\n            case 0x12: // int64\n            {\n                std::int64_t value{};\n                return get_number<std::int64_t, true>(input_format_t::bson, value) && sax->number_integer(value);\n            }\n\n            default: // anything else not supported (yet)\n            {\n                std::array<char, 3> cr{{}};\n                (std::snprintf)(cr.data(), cr.size(), \"%.2hhX\", static_cast<unsigned char>(element_type));\n                return sax->parse_error(element_type_parse_position, std::string(cr.data()), parse_error::create(114, element_type_parse_position, \"Unsupported BSON record type 0x\" + std::string(cr.data())));\n            }\n        }\n    }\n\n    /*!\n    @brief Read a BSON element list (as specified in the BSON-spec)\n\n    The same binary layout is used for objects and arrays, hence it must be\n    indicated with the argument @a is_array which one is expected\n    (true --> array, false --> object).\n\n    @param[in] is_array Determines if the element list being read is to be\n                        treated as an object (@a is_array == false), or as an\n                        array (@a is_array == true).\n    @return whether a valid BSON-object/array was passed to the SAX parser\n    */\n    bool parse_bson_element_list(const bool is_array)\n    {\n        string_t key;\n\n        while (auto element_type = get())\n        {\n            if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::bson, \"element list\")))\n            {\n                return false;\n            }\n\n            const std::size_t element_type_parse_position = chars_read;\n            if (JSON_HEDLEY_UNLIKELY(!get_bson_cstr(key)))\n            {\n                return false;\n            }\n\n            if (!is_array && !sax->key(key))\n            {\n                return false;\n            }\n\n            if (JSON_HEDLEY_UNLIKELY(!parse_bson_element_internal(element_type, element_type_parse_position)))\n            {\n                return false;\n            }\n\n            // get_bson_cstr only appends\n            key.clear();\n        }\n\n        return true;\n    }\n\n    /*!\n    @brief Reads an array from the BSON input and passes it to the SAX-parser.\n    @return whether a valid BSON-array was passed to the SAX parser\n    */\n    bool parse_bson_array()\n    {\n        std::int32_t document_size{};\n        get_number<std::int32_t, true>(input_format_t::bson, document_size);\n\n        if (JSON_HEDLEY_UNLIKELY(!sax->start_array(std::size_t(-1))))\n        {\n            return false;\n        }\n\n        if (JSON_HEDLEY_UNLIKELY(!parse_bson_element_list(/*is_array*/true)))\n        {\n            return false;\n        }\n\n        return sax->end_array();\n    }\n\n    //////////\n    // CBOR //\n    //////////\n\n    /*!\n    @param[in] get_char  whether a new character should be retrieved from the\n                         input (true) or whether the last read character should\n                         be considered instead (false)\n    @param[in] tag_handler how CBOR tags should be treated\n\n    @return whether a valid CBOR value was passed to the SAX parser\n    */\n    bool parse_cbor_internal(const bool get_char,\n                             const cbor_tag_handler_t tag_handler)\n    {\n        switch (get_char ? get() : current)\n        {\n            // EOF\n            case std::char_traits<char_type>::eof():\n                return unexpect_eof(input_format_t::cbor, \"value\");\n\n            // Integer 0x00..0x17 (0..23)\n            case 0x00:\n            case 0x01:\n            case 0x02:\n            case 0x03:\n            case 0x04:\n            case 0x05:\n            case 0x06:\n            case 0x07:\n            case 0x08:\n            case 0x09:\n            case 0x0A:\n            case 0x0B:\n            case 0x0C:\n            case 0x0D:\n            case 0x0E:\n            case 0x0F:\n            case 0x10:\n            case 0x11:\n            case 0x12:\n            case 0x13:\n            case 0x14:\n            case 0x15:\n            case 0x16:\n            case 0x17:\n                return sax->number_unsigned(static_cast<number_unsigned_t>(current));\n\n            case 0x18: // Unsigned integer (one-byte uint8_t follows)\n            {\n                std::uint8_t number{};\n                return get_number(input_format_t::cbor, number) && sax->number_unsigned(number);\n            }\n\n            case 0x19: // Unsigned integer (two-byte uint16_t follows)\n            {\n                std::uint16_t number{};\n                return get_number(input_format_t::cbor, number) && sax->number_unsigned(number);\n            }\n\n            case 0x1A: // Unsigned integer (four-byte uint32_t follows)\n            {\n                std::uint32_t number{};\n                return get_number(input_format_t::cbor, number) && sax->number_unsigned(number);\n            }\n\n            case 0x1B: // Unsigned integer (eight-byte uint64_t follows)\n            {\n                std::uint64_t number{};\n                return get_number(input_format_t::cbor, number) && sax->number_unsigned(number);\n            }\n\n            // Negative integer -1-0x00..-1-0x17 (-1..-24)\n            case 0x20:\n            case 0x21:\n            case 0x22:\n            case 0x23:\n            case 0x24:\n            case 0x25:\n            case 0x26:\n            case 0x27:\n            case 0x28:\n            case 0x29:\n            case 0x2A:\n            case 0x2B:\n            case 0x2C:\n            case 0x2D:\n            case 0x2E:\n            case 0x2F:\n            case 0x30:\n            case 0x31:\n            case 0x32:\n            case 0x33:\n            case 0x34:\n            case 0x35:\n            case 0x36:\n            case 0x37:\n                return sax->number_integer(static_cast<std::int8_t>(0x20 - 1 - current));\n\n            case 0x38: // Negative integer (one-byte uint8_t follows)\n            {\n                std::uint8_t number{};\n                return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast<number_integer_t>(-1) - number);\n            }\n\n            case 0x39: // Negative integer -1-n (two-byte uint16_t follows)\n            {\n                std::uint16_t number{};\n                return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast<number_integer_t>(-1) - number);\n            }\n\n            case 0x3A: // Negative integer -1-n (four-byte uint32_t follows)\n            {\n                std::uint32_t number{};\n                return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast<number_integer_t>(-1) - number);\n            }\n\n            case 0x3B: // Negative integer -1-n (eight-byte uint64_t follows)\n            {\n                std::uint64_t number{};\n                return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast<number_integer_t>(-1)\n                        - static_cast<number_integer_t>(number));\n            }\n\n            // Binary data (0x00..0x17 bytes follow)\n            case 0x40:\n            case 0x41:\n            case 0x42:\n            case 0x43:\n            case 0x44:\n            case 0x45:\n            case 0x46:\n            case 0x47:\n            case 0x48:\n            case 0x49:\n            case 0x4A:\n            case 0x4B:\n            case 0x4C:\n            case 0x4D:\n            case 0x4E:\n            case 0x4F:\n            case 0x50:\n            case 0x51:\n            case 0x52:\n            case 0x53:\n            case 0x54:\n            case 0x55:\n            case 0x56:\n            case 0x57:\n            case 0x58: // Binary data (one-byte uint8_t for n follows)\n            case 0x59: // Binary data (two-byte uint16_t for n follow)\n            case 0x5A: // Binary data (four-byte uint32_t for n follow)\n            case 0x5B: // Binary data (eight-byte uint64_t for n follow)\n            case 0x5F: // Binary data (indefinite length)\n            {\n                binary_t b;\n                return get_cbor_binary(b) && sax->binary(b);\n            }\n\n            // UTF-8 string (0x00..0x17 bytes follow)\n            case 0x60:\n            case 0x61:\n            case 0x62:\n            case 0x63:\n            case 0x64:\n            case 0x65:\n            case 0x66:\n            case 0x67:\n            case 0x68:\n            case 0x69:\n            case 0x6A:\n            case 0x6B:\n            case 0x6C:\n            case 0x6D:\n            case 0x6E:\n            case 0x6F:\n            case 0x70:\n            case 0x71:\n            case 0x72:\n            case 0x73:\n            case 0x74:\n            case 0x75:\n            case 0x76:\n            case 0x77:\n            case 0x78: // UTF-8 string (one-byte uint8_t for n follows)\n            case 0x79: // UTF-8 string (two-byte uint16_t for n follow)\n            case 0x7A: // UTF-8 string (four-byte uint32_t for n follow)\n            case 0x7B: // UTF-8 string (eight-byte uint64_t for n follow)\n            case 0x7F: // UTF-8 string (indefinite length)\n            {\n                string_t s;\n                return get_cbor_string(s) && sax->string(s);\n            }\n\n            // array (0x00..0x17 data items follow)\n            case 0x80:\n            case 0x81:\n            case 0x82:\n            case 0x83:\n            case 0x84:\n            case 0x85:\n            case 0x86:\n            case 0x87:\n            case 0x88:\n            case 0x89:\n            case 0x8A:\n            case 0x8B:\n            case 0x8C:\n            case 0x8D:\n            case 0x8E:\n            case 0x8F:\n            case 0x90:\n            case 0x91:\n            case 0x92:\n            case 0x93:\n            case 0x94:\n            case 0x95:\n            case 0x96:\n            case 0x97:\n                return get_cbor_array(static_cast<std::size_t>(static_cast<unsigned int>(current) & 0x1Fu), tag_handler);\n\n            case 0x98: // array (one-byte uint8_t for n follows)\n            {\n                std::uint8_t len{};\n                return get_number(input_format_t::cbor, len) && get_cbor_array(static_cast<std::size_t>(len), tag_handler);\n            }\n\n            case 0x99: // array (two-byte uint16_t for n follow)\n            {\n                std::uint16_t len{};\n                return get_number(input_format_t::cbor, len) && get_cbor_array(static_cast<std::size_t>(len), tag_handler);\n            }\n\n            case 0x9A: // array (four-byte uint32_t for n follow)\n            {\n                std::uint32_t len{};\n                return get_number(input_format_t::cbor, len) && get_cbor_array(static_cast<std::size_t>(len), tag_handler);\n            }\n\n            case 0x9B: // array (eight-byte uint64_t for n follow)\n            {\n                std::uint64_t len{};\n                return get_number(input_format_t::cbor, len) && get_cbor_array(static_cast<std::size_t>(len), tag_handler);\n            }\n\n            case 0x9F: // array (indefinite length)\n                return get_cbor_array(std::size_t(-1), tag_handler);\n\n            // map (0x00..0x17 pairs of data items follow)\n            case 0xA0:\n            case 0xA1:\n            case 0xA2:\n            case 0xA3:\n            case 0xA4:\n            case 0xA5:\n            case 0xA6:\n            case 0xA7:\n            case 0xA8:\n            case 0xA9:\n            case 0xAA:\n            case 0xAB:\n            case 0xAC:\n            case 0xAD:\n            case 0xAE:\n            case 0xAF:\n            case 0xB0:\n            case 0xB1:\n            case 0xB2:\n            case 0xB3:\n            case 0xB4:\n            case 0xB5:\n            case 0xB6:\n            case 0xB7:\n                return get_cbor_object(static_cast<std::size_t>(static_cast<unsigned int>(current) & 0x1Fu), tag_handler);\n\n            case 0xB8: // map (one-byte uint8_t for n follows)\n            {\n                std::uint8_t len{};\n                return get_number(input_format_t::cbor, len) && get_cbor_object(static_cast<std::size_t>(len), tag_handler);\n            }\n\n            case 0xB9: // map (two-byte uint16_t for n follow)\n            {\n                std::uint16_t len{};\n                return get_number(input_format_t::cbor, len) && get_cbor_object(static_cast<std::size_t>(len), tag_handler);\n            }\n\n            case 0xBA: // map (four-byte uint32_t for n follow)\n            {\n                std::uint32_t len{};\n                return get_number(input_format_t::cbor, len) && get_cbor_object(static_cast<std::size_t>(len), tag_handler);\n            }\n\n            case 0xBB: // map (eight-byte uint64_t for n follow)\n            {\n                std::uint64_t len{};\n                return get_number(input_format_t::cbor, len) && get_cbor_object(static_cast<std::size_t>(len), tag_handler);\n            }\n\n            case 0xBF: // map (indefinite length)\n                return get_cbor_object(std::size_t(-1), tag_handler);\n\n            case 0xC6: // tagged item\n            case 0xC7:\n            case 0xC8:\n            case 0xC9:\n            case 0xCA:\n            case 0xCB:\n            case 0xCC:\n            case 0xCD:\n            case 0xCE:\n            case 0xCF:\n            case 0xD0:\n            case 0xD1:\n            case 0xD2:\n            case 0xD3:\n            case 0xD4:\n            case 0xD8: // tagged item (1 bytes follow)\n            case 0xD9: // tagged item (2 bytes follow)\n            case 0xDA: // tagged item (4 bytes follow)\n            case 0xDB: // tagged item (8 bytes follow)\n            {\n                switch (tag_handler)\n                {\n                    case cbor_tag_handler_t::error:\n                    {\n                        auto last_token = get_token_string();\n                        return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::cbor, \"invalid byte: 0x\" + last_token, \"value\")));\n                    }\n\n                    case cbor_tag_handler_t::ignore:\n                    {\n                        switch (current)\n                        {\n                            case 0xD8:\n                            {\n                                std::uint8_t len{};\n                                get_number(input_format_t::cbor, len);\n                                break;\n                            }\n                            case 0xD9:\n                            {\n                                std::uint16_t len{};\n                                get_number(input_format_t::cbor, len);\n                                break;\n                            }\n                            case 0xDA:\n                            {\n                                std::uint32_t len{};\n                                get_number(input_format_t::cbor, len);\n                                break;\n                            }\n                            case 0xDB:\n                            {\n                                std::uint64_t len{};\n                                get_number(input_format_t::cbor, len);\n                                break;\n                            }\n                            default:\n                                break;\n                        }\n                        return parse_cbor_internal(true, tag_handler);\n                    }\n\n                    default:            // LCOV_EXCL_LINE\n                        JSON_ASSERT(false);  // LCOV_EXCL_LINE\n                }\n            }\n\n            case 0xF4: // false\n                return sax->boolean(false);\n\n            case 0xF5: // true\n                return sax->boolean(true);\n\n            case 0xF6: // null\n                return sax->null();\n\n            case 0xF9: // Half-Precision Float (two-byte IEEE 754)\n            {\n                const auto byte1_raw = get();\n                if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, \"number\")))\n                {\n                    return false;\n                }\n                const auto byte2_raw = get();\n                if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, \"number\")))\n                {\n                    return false;\n                }\n\n                const auto byte1 = static_cast<unsigned char>(byte1_raw);\n                const auto byte2 = static_cast<unsigned char>(byte2_raw);\n\n                // code from RFC 7049, Appendix D, Figure 3:\n                // As half-precision floating-point numbers were only added\n                // to IEEE 754 in 2008, today's programming platforms often\n                // still only have limited support for them. It is very\n                // easy to include at least decoding support for them even\n                // without such support. An example of a small decoder for\n                // half-precision floating-point numbers in the C language\n                // is shown in Fig. 3.\n                const auto half = static_cast<unsigned int>((byte1 << 8u) + byte2);\n                const double val = [&half]\n                {\n                    const int exp = (half >> 10u) & 0x1Fu;\n                    const unsigned int mant = half & 0x3FFu;\n                    JSON_ASSERT(0 <= exp&& exp <= 32);\n                    JSON_ASSERT(mant <= 1024);\n                    switch (exp)\n                    {\n                        case 0:\n                            return std::ldexp(mant, -24);\n                        case 31:\n                            return (mant == 0)\n                            ? std::numeric_limits<double>::infinity()\n                            : std::numeric_limits<double>::quiet_NaN();\n                        default:\n                            return std::ldexp(mant + 1024, exp - 25);\n                    }\n                }();\n                return sax->number_float((half & 0x8000u) != 0\n                                         ? static_cast<number_float_t>(-val)\n                                         : static_cast<number_float_t>(val), \"\");\n            }\n\n            case 0xFA: // Single-Precision Float (four-byte IEEE 754)\n            {\n                float number{};\n                return get_number(input_format_t::cbor, number) && sax->number_float(static_cast<number_float_t>(number), \"\");\n            }\n\n            case 0xFB: // Double-Precision Float (eight-byte IEEE 754)\n            {\n                double number{};\n                return get_number(input_format_t::cbor, number) && sax->number_float(static_cast<number_float_t>(number), \"\");\n            }\n\n            default: // anything else (0xFF is handled inside the other types)\n            {\n                auto last_token = get_token_string();\n                return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::cbor, \"invalid byte: 0x\" + last_token, \"value\")));\n            }\n        }\n    }\n\n    /*!\n    @brief reads a CBOR string\n\n    This function first reads starting bytes to determine the expected\n    string length and then copies this number of bytes into a string.\n    Additionally, CBOR's strings with indefinite lengths are supported.\n\n    @param[out] result  created string\n\n    @return whether string creation completed\n    */\n    bool get_cbor_string(string_t& result)\n    {\n        if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, \"string\")))\n        {\n            return false;\n        }\n\n        switch (current)\n        {\n            // UTF-8 string (0x00..0x17 bytes follow)\n            case 0x60:\n            case 0x61:\n            case 0x62:\n            case 0x63:\n            case 0x64:\n            case 0x65:\n            case 0x66:\n            case 0x67:\n            case 0x68:\n            case 0x69:\n            case 0x6A:\n            case 0x6B:\n            case 0x6C:\n            case 0x6D:\n            case 0x6E:\n            case 0x6F:\n            case 0x70:\n            case 0x71:\n            case 0x72:\n            case 0x73:\n            case 0x74:\n            case 0x75:\n            case 0x76:\n            case 0x77:\n            {\n                return get_string(input_format_t::cbor, static_cast<unsigned int>(current) & 0x1Fu, result);\n            }\n\n            case 0x78: // UTF-8 string (one-byte uint8_t for n follows)\n            {\n                std::uint8_t len{};\n                return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result);\n            }\n\n            case 0x79: // UTF-8 string (two-byte uint16_t for n follow)\n            {\n                std::uint16_t len{};\n                return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result);\n            }\n\n            case 0x7A: // UTF-8 string (four-byte uint32_t for n follow)\n            {\n                std::uint32_t len{};\n                return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result);\n            }\n\n            case 0x7B: // UTF-8 string (eight-byte uint64_t for n follow)\n            {\n                std::uint64_t len{};\n                return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result);\n            }\n\n            case 0x7F: // UTF-8 string (indefinite length)\n            {\n                while (get() != 0xFF)\n                {\n                    string_t chunk;\n                    if (!get_cbor_string(chunk))\n                    {\n                        return false;\n                    }\n                    result.append(chunk);\n                }\n                return true;\n            }\n\n            default:\n            {\n                auto last_token = get_token_string();\n                return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::cbor, \"expected length specification (0x60-0x7B) or indefinite string type (0x7F); last byte: 0x\" + last_token, \"string\")));\n            }\n        }\n    }\n\n    /*!\n    @brief reads a CBOR byte array\n\n    This function first reads starting bytes to determine the expected\n    byte array length and then copies this number of bytes into the byte array.\n    Additionally, CBOR's byte arrays with indefinite lengths are supported.\n\n    @param[out] result  created byte array\n\n    @return whether byte array creation completed\n    */\n    bool get_cbor_binary(binary_t& result)\n    {\n        if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, \"binary\")))\n        {\n            return false;\n        }\n\n        switch (current)\n        {\n            // Binary data (0x00..0x17 bytes follow)\n            case 0x40:\n            case 0x41:\n            case 0x42:\n            case 0x43:\n            case 0x44:\n            case 0x45:\n            case 0x46:\n            case 0x47:\n            case 0x48:\n            case 0x49:\n            case 0x4A:\n            case 0x4B:\n            case 0x4C:\n            case 0x4D:\n            case 0x4E:\n            case 0x4F:\n            case 0x50:\n            case 0x51:\n            case 0x52:\n            case 0x53:\n            case 0x54:\n            case 0x55:\n            case 0x56:\n            case 0x57:\n            {\n                return get_binary(input_format_t::cbor, static_cast<unsigned int>(current) & 0x1Fu, result);\n            }\n\n            case 0x58: // Binary data (one-byte uint8_t for n follows)\n            {\n                std::uint8_t len{};\n                return get_number(input_format_t::cbor, len) &&\n                       get_binary(input_format_t::cbor, len, result);\n            }\n\n            case 0x59: // Binary data (two-byte uint16_t for n follow)\n            {\n                std::uint16_t len{};\n                return get_number(input_format_t::cbor, len) &&\n                       get_binary(input_format_t::cbor, len, result);\n            }\n\n            case 0x5A: // Binary data (four-byte uint32_t for n follow)\n            {\n                std::uint32_t len{};\n                return get_number(input_format_t::cbor, len) &&\n                       get_binary(input_format_t::cbor, len, result);\n            }\n\n            case 0x5B: // Binary data (eight-byte uint64_t for n follow)\n            {\n                std::uint64_t len{};\n                return get_number(input_format_t::cbor, len) &&\n                       get_binary(input_format_t::cbor, len, result);\n            }\n\n            case 0x5F: // Binary data (indefinite length)\n            {\n                while (get() != 0xFF)\n                {\n                    binary_t chunk;\n                    if (!get_cbor_binary(chunk))\n                    {\n                        return false;\n                    }\n                    result.insert(result.end(), chunk.begin(), chunk.end());\n                }\n                return true;\n            }\n\n            default:\n            {\n                auto last_token = get_token_string();\n                return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::cbor, \"expected length specification (0x40-0x5B) or indefinite binary array type (0x5F); last byte: 0x\" + last_token, \"binary\")));\n            }\n        }\n    }\n\n    /*!\n    @param[in] len  the length of the array or std::size_t(-1) for an\n                    array of indefinite size\n    @param[in] tag_handler how CBOR tags should be treated\n    @return whether array creation completed\n    */\n    bool get_cbor_array(const std::size_t len,\n                        const cbor_tag_handler_t tag_handler)\n    {\n        if (JSON_HEDLEY_UNLIKELY(!sax->start_array(len)))\n        {\n            return false;\n        }\n\n        if (len != std::size_t(-1))\n        {\n            for (std::size_t i = 0; i < len; ++i)\n            {\n                if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(true, tag_handler)))\n                {\n                    return false;\n                }\n            }\n        }\n        else\n        {\n            while (get() != 0xFF)\n            {\n                if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(false, tag_handler)))\n                {\n                    return false;\n                }\n            }\n        }\n\n        return sax->end_array();\n    }\n\n    /*!\n    @param[in] len  the length of the object or std::size_t(-1) for an\n                    object of indefinite size\n    @param[in] tag_handler how CBOR tags should be treated\n    @return whether object creation completed\n    */\n    bool get_cbor_object(const std::size_t len,\n                         const cbor_tag_handler_t tag_handler)\n    {\n        if (JSON_HEDLEY_UNLIKELY(!sax->start_object(len)))\n        {\n            return false;\n        }\n\n        string_t key;\n        if (len != std::size_t(-1))\n        {\n            for (std::size_t i = 0; i < len; ++i)\n            {\n                get();\n                if (JSON_HEDLEY_UNLIKELY(!get_cbor_string(key) || !sax->key(key)))\n                {\n                    return false;\n                }\n\n                if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(true, tag_handler)))\n                {\n                    return false;\n                }\n                key.clear();\n            }\n        }\n        else\n        {\n            while (get() != 0xFF)\n            {\n                if (JSON_HEDLEY_UNLIKELY(!get_cbor_string(key) || !sax->key(key)))\n                {\n                    return false;\n                }\n\n                if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(true, tag_handler)))\n                {\n                    return false;\n                }\n                key.clear();\n            }\n        }\n\n        return sax->end_object();\n    }\n\n    /////////////\n    // MsgPack //\n    /////////////\n\n    /*!\n    @return whether a valid MessagePack value was passed to the SAX parser\n    */\n    bool parse_msgpack_internal()\n    {\n        switch (get())\n        {\n            // EOF\n            case std::char_traits<char_type>::eof():\n                return unexpect_eof(input_format_t::msgpack, \"value\");\n\n            // positive fixint\n            case 0x00:\n            case 0x01:\n            case 0x02:\n            case 0x03:\n            case 0x04:\n            case 0x05:\n            case 0x06:\n            case 0x07:\n            case 0x08:\n            case 0x09:\n            case 0x0A:\n            case 0x0B:\n            case 0x0C:\n            case 0x0D:\n            case 0x0E:\n            case 0x0F:\n            case 0x10:\n            case 0x11:\n            case 0x12:\n            case 0x13:\n            case 0x14:\n            case 0x15:\n            case 0x16:\n            case 0x17:\n            case 0x18:\n            case 0x19:\n            case 0x1A:\n            case 0x1B:\n            case 0x1C:\n            case 0x1D:\n            case 0x1E:\n            case 0x1F:\n            case 0x20:\n            case 0x21:\n            case 0x22:\n            case 0x23:\n            case 0x24:\n            case 0x25:\n            case 0x26:\n            case 0x27:\n            case 0x28:\n            case 0x29:\n            case 0x2A:\n            case 0x2B:\n            case 0x2C:\n            case 0x2D:\n            case 0x2E:\n            case 0x2F:\n            case 0x30:\n            case 0x31:\n            case 0x32:\n            case 0x33:\n            case 0x34:\n            case 0x35:\n            case 0x36:\n            case 0x37:\n            case 0x38:\n            case 0x39:\n            case 0x3A:\n            case 0x3B:\n            case 0x3C:\n            case 0x3D:\n            case 0x3E:\n            case 0x3F:\n            case 0x40:\n            case 0x41:\n            case 0x42:\n            case 0x43:\n            case 0x44:\n            case 0x45:\n            case 0x46:\n            case 0x47:\n            case 0x48:\n            case 0x49:\n            case 0x4A:\n            case 0x4B:\n            case 0x4C:\n            case 0x4D:\n            case 0x4E:\n            case 0x4F:\n            case 0x50:\n            case 0x51:\n            case 0x52:\n            case 0x53:\n            case 0x54:\n            case 0x55:\n            case 0x56:\n            case 0x57:\n            case 0x58:\n            case 0x59:\n            case 0x5A:\n            case 0x5B:\n            case 0x5C:\n            case 0x5D:\n            case 0x5E:\n            case 0x5F:\n            case 0x60:\n            case 0x61:\n            case 0x62:\n            case 0x63:\n            case 0x64:\n            case 0x65:\n            case 0x66:\n            case 0x67:\n            case 0x68:\n            case 0x69:\n            case 0x6A:\n            case 0x6B:\n            case 0x6C:\n            case 0x6D:\n            case 0x6E:\n            case 0x6F:\n            case 0x70:\n            case 0x71:\n            case 0x72:\n            case 0x73:\n            case 0x74:\n            case 0x75:\n            case 0x76:\n            case 0x77:\n            case 0x78:\n            case 0x79:\n            case 0x7A:\n            case 0x7B:\n            case 0x7C:\n            case 0x7D:\n            case 0x7E:\n            case 0x7F:\n                return sax->number_unsigned(static_cast<number_unsigned_t>(current));\n\n            // fixmap\n            case 0x80:\n            case 0x81:\n            case 0x82:\n            case 0x83:\n            case 0x84:\n            case 0x85:\n            case 0x86:\n            case 0x87:\n            case 0x88:\n            case 0x89:\n            case 0x8A:\n            case 0x8B:\n            case 0x8C:\n            case 0x8D:\n            case 0x8E:\n            case 0x8F:\n                return get_msgpack_object(static_cast<std::size_t>(static_cast<unsigned int>(current) & 0x0Fu));\n\n            // fixarray\n            case 0x90:\n            case 0x91:\n            case 0x92:\n            case 0x93:\n            case 0x94:\n            case 0x95:\n            case 0x96:\n            case 0x97:\n            case 0x98:\n            case 0x99:\n            case 0x9A:\n            case 0x9B:\n            case 0x9C:\n            case 0x9D:\n            case 0x9E:\n            case 0x9F:\n                return get_msgpack_array(static_cast<std::size_t>(static_cast<unsigned int>(current) & 0x0Fu));\n\n            // fixstr\n            case 0xA0:\n            case 0xA1:\n            case 0xA2:\n            case 0xA3:\n            case 0xA4:\n            case 0xA5:\n            case 0xA6:\n            case 0xA7:\n            case 0xA8:\n            case 0xA9:\n            case 0xAA:\n            case 0xAB:\n            case 0xAC:\n            case 0xAD:\n            case 0xAE:\n            case 0xAF:\n            case 0xB0:\n            case 0xB1:\n            case 0xB2:\n            case 0xB3:\n            case 0xB4:\n            case 0xB5:\n            case 0xB6:\n            case 0xB7:\n            case 0xB8:\n            case 0xB9:\n            case 0xBA:\n            case 0xBB:\n            case 0xBC:\n            case 0xBD:\n            case 0xBE:\n            case 0xBF:\n            case 0xD9: // str 8\n            case 0xDA: // str 16\n            case 0xDB: // str 32\n            {\n                string_t s;\n                return get_msgpack_string(s) && sax->string(s);\n            }\n\n            case 0xC0: // nil\n                return sax->null();\n\n            case 0xC2: // false\n                return sax->boolean(false);\n\n            case 0xC3: // true\n                return sax->boolean(true);\n\n            case 0xC4: // bin 8\n            case 0xC5: // bin 16\n            case 0xC6: // bin 32\n            case 0xC7: // ext 8\n            case 0xC8: // ext 16\n            case 0xC9: // ext 32\n            case 0xD4: // fixext 1\n            case 0xD5: // fixext 2\n            case 0xD6: // fixext 4\n            case 0xD7: // fixext 8\n            case 0xD8: // fixext 16\n            {\n                binary_t b;\n                return get_msgpack_binary(b) && sax->binary(b);\n            }\n\n            case 0xCA: // float 32\n            {\n                float number{};\n                return get_number(input_format_t::msgpack, number) && sax->number_float(static_cast<number_float_t>(number), \"\");\n            }\n\n            case 0xCB: // float 64\n            {\n                double number{};\n                return get_number(input_format_t::msgpack, number) && sax->number_float(static_cast<number_float_t>(number), \"\");\n            }\n\n            case 0xCC: // uint 8\n            {\n                std::uint8_t number{};\n                return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number);\n            }\n\n            case 0xCD: // uint 16\n            {\n                std::uint16_t number{};\n                return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number);\n            }\n\n            case 0xCE: // uint 32\n            {\n                std::uint32_t number{};\n                return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number);\n            }\n\n            case 0xCF: // uint 64\n            {\n                std::uint64_t number{};\n                return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number);\n            }\n\n            case 0xD0: // int 8\n            {\n                std::int8_t number{};\n                return get_number(input_format_t::msgpack, number) && sax->number_integer(number);\n            }\n\n            case 0xD1: // int 16\n            {\n                std::int16_t number{};\n                return get_number(input_format_t::msgpack, number) && sax->number_integer(number);\n            }\n\n            case 0xD2: // int 32\n            {\n                std::int32_t number{};\n                return get_number(input_format_t::msgpack, number) && sax->number_integer(number);\n            }\n\n            case 0xD3: // int 64\n            {\n                std::int64_t number{};\n                return get_number(input_format_t::msgpack, number) && sax->number_integer(number);\n            }\n\n            case 0xDC: // array 16\n            {\n                std::uint16_t len{};\n                return get_number(input_format_t::msgpack, len) && get_msgpack_array(static_cast<std::size_t>(len));\n            }\n\n            case 0xDD: // array 32\n            {\n                std::uint32_t len{};\n                return get_number(input_format_t::msgpack, len) && get_msgpack_array(static_cast<std::size_t>(len));\n            }\n\n            case 0xDE: // map 16\n            {\n                std::uint16_t len{};\n                return get_number(input_format_t::msgpack, len) && get_msgpack_object(static_cast<std::size_t>(len));\n            }\n\n            case 0xDF: // map 32\n            {\n                std::uint32_t len{};\n                return get_number(input_format_t::msgpack, len) && get_msgpack_object(static_cast<std::size_t>(len));\n            }\n\n            // negative fixint\n            case 0xE0:\n            case 0xE1:\n            case 0xE2:\n            case 0xE3:\n            case 0xE4:\n            case 0xE5:\n            case 0xE6:\n            case 0xE7:\n            case 0xE8:\n            case 0xE9:\n            case 0xEA:\n            case 0xEB:\n            case 0xEC:\n            case 0xED:\n            case 0xEE:\n            case 0xEF:\n            case 0xF0:\n            case 0xF1:\n            case 0xF2:\n            case 0xF3:\n            case 0xF4:\n            case 0xF5:\n            case 0xF6:\n            case 0xF7:\n            case 0xF8:\n            case 0xF9:\n            case 0xFA:\n            case 0xFB:\n            case 0xFC:\n            case 0xFD:\n            case 0xFE:\n            case 0xFF:\n                return sax->number_integer(static_cast<std::int8_t>(current));\n\n            default: // anything else\n            {\n                auto last_token = get_token_string();\n                return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::msgpack, \"invalid byte: 0x\" + last_token, \"value\")));\n            }\n        }\n    }\n\n    /*!\n    @brief reads a MessagePack string\n\n    This function first reads starting bytes to determine the expected\n    string length and then copies this number of bytes into a string.\n\n    @param[out] result  created string\n\n    @return whether string creation completed\n    */\n    bool get_msgpack_string(string_t& result)\n    {\n        if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::msgpack, \"string\")))\n        {\n            return false;\n        }\n\n        switch (current)\n        {\n            // fixstr\n            case 0xA0:\n            case 0xA1:\n            case 0xA2:\n            case 0xA3:\n            case 0xA4:\n            case 0xA5:\n            case 0xA6:\n            case 0xA7:\n            case 0xA8:\n            case 0xA9:\n            case 0xAA:\n            case 0xAB:\n            case 0xAC:\n            case 0xAD:\n            case 0xAE:\n            case 0xAF:\n            case 0xB0:\n            case 0xB1:\n            case 0xB2:\n            case 0xB3:\n            case 0xB4:\n            case 0xB5:\n            case 0xB6:\n            case 0xB7:\n            case 0xB8:\n            case 0xB9:\n            case 0xBA:\n            case 0xBB:\n            case 0xBC:\n            case 0xBD:\n            case 0xBE:\n            case 0xBF:\n            {\n                return get_string(input_format_t::msgpack, static_cast<unsigned int>(current) & 0x1Fu, result);\n            }\n\n            case 0xD9: // str 8\n            {\n                std::uint8_t len{};\n                return get_number(input_format_t::msgpack, len) && get_string(input_format_t::msgpack, len, result);\n            }\n\n            case 0xDA: // str 16\n            {\n                std::uint16_t len{};\n                return get_number(input_format_t::msgpack, len) && get_string(input_format_t::msgpack, len, result);\n            }\n\n            case 0xDB: // str 32\n            {\n                std::uint32_t len{};\n                return get_number(input_format_t::msgpack, len) && get_string(input_format_t::msgpack, len, result);\n            }\n\n            default:\n            {\n                auto last_token = get_token_string();\n                return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::msgpack, \"expected length specification (0xA0-0xBF, 0xD9-0xDB); last byte: 0x\" + last_token, \"string\")));\n            }\n        }\n    }\n\n    /*!\n    @brief reads a MessagePack byte array\n\n    This function first reads starting bytes to determine the expected\n    byte array length and then copies this number of bytes into a byte array.\n\n    @param[out] result  created byte array\n\n    @return whether byte array creation completed\n    */\n    bool get_msgpack_binary(binary_t& result)\n    {\n        // helper function to set the subtype\n        auto assign_and_return_true = [&result](std::int8_t subtype)\n        {\n            result.set_subtype(static_cast<std::uint8_t>(subtype));\n            return true;\n        };\n\n        switch (current)\n        {\n            case 0xC4: // bin 8\n            {\n                std::uint8_t len{};\n                return get_number(input_format_t::msgpack, len) &&\n                       get_binary(input_format_t::msgpack, len, result);\n            }\n\n            case 0xC5: // bin 16\n            {\n                std::uint16_t len{};\n                return get_number(input_format_t::msgpack, len) &&\n                       get_binary(input_format_t::msgpack, len, result);\n            }\n\n            case 0xC6: // bin 32\n            {\n                std::uint32_t len{};\n                return get_number(input_format_t::msgpack, len) &&\n                       get_binary(input_format_t::msgpack, len, result);\n            }\n\n            case 0xC7: // ext 8\n            {\n                std::uint8_t len{};\n                std::int8_t subtype{};\n                return get_number(input_format_t::msgpack, len) &&\n                       get_number(input_format_t::msgpack, subtype) &&\n                       get_binary(input_format_t::msgpack, len, result) &&\n                       assign_and_return_true(subtype);\n            }\n\n            case 0xC8: // ext 16\n            {\n                std::uint16_t len{};\n                std::int8_t subtype{};\n                return get_number(input_format_t::msgpack, len) &&\n                       get_number(input_format_t::msgpack, subtype) &&\n                       get_binary(input_format_t::msgpack, len, result) &&\n                       assign_and_return_true(subtype);\n            }\n\n            case 0xC9: // ext 32\n            {\n                std::uint32_t len{};\n                std::int8_t subtype{};\n                return get_number(input_format_t::msgpack, len) &&\n                       get_number(input_format_t::msgpack, subtype) &&\n                       get_binary(input_format_t::msgpack, len, result) &&\n                       assign_and_return_true(subtype);\n            }\n\n            case 0xD4: // fixext 1\n            {\n                std::int8_t subtype{};\n                return get_number(input_format_t::msgpack, subtype) &&\n                       get_binary(input_format_t::msgpack, 1, result) &&\n                       assign_and_return_true(subtype);\n            }\n\n            case 0xD5: // fixext 2\n            {\n                std::int8_t subtype{};\n                return get_number(input_format_t::msgpack, subtype) &&\n                       get_binary(input_format_t::msgpack, 2, result) &&\n                       assign_and_return_true(subtype);\n            }\n\n            case 0xD6: // fixext 4\n            {\n                std::int8_t subtype{};\n                return get_number(input_format_t::msgpack, subtype) &&\n                       get_binary(input_format_t::msgpack, 4, result) &&\n                       assign_and_return_true(subtype);\n            }\n\n            case 0xD7: // fixext 8\n            {\n                std::int8_t subtype{};\n                return get_number(input_format_t::msgpack, subtype) &&\n                       get_binary(input_format_t::msgpack, 8, result) &&\n                       assign_and_return_true(subtype);\n            }\n\n            case 0xD8: // fixext 16\n            {\n                std::int8_t subtype{};\n                return get_number(input_format_t::msgpack, subtype) &&\n                       get_binary(input_format_t::msgpack, 16, result) &&\n                       assign_and_return_true(subtype);\n            }\n\n            default:           // LCOV_EXCL_LINE\n                return false;  // LCOV_EXCL_LINE\n        }\n    }\n\n    /*!\n    @param[in] len  the length of the array\n    @return whether array creation completed\n    */\n    bool get_msgpack_array(const std::size_t len)\n    {\n        if (JSON_HEDLEY_UNLIKELY(!sax->start_array(len)))\n        {\n            return false;\n        }\n\n        for (std::size_t i = 0; i < len; ++i)\n        {\n            if (JSON_HEDLEY_UNLIKELY(!parse_msgpack_internal()))\n            {\n                return false;\n            }\n        }\n\n        return sax->end_array();\n    }\n\n    /*!\n    @param[in] len  the length of the object\n    @return whether object creation completed\n    */\n    bool get_msgpack_object(const std::size_t len)\n    {\n        if (JSON_HEDLEY_UNLIKELY(!sax->start_object(len)))\n        {\n            return false;\n        }\n\n        string_t key;\n        for (std::size_t i = 0; i < len; ++i)\n        {\n            get();\n            if (JSON_HEDLEY_UNLIKELY(!get_msgpack_string(key) || !sax->key(key)))\n            {\n                return false;\n            }\n\n            if (JSON_HEDLEY_UNLIKELY(!parse_msgpack_internal()))\n            {\n                return false;\n            }\n            key.clear();\n        }\n\n        return sax->end_object();\n    }\n\n    ////////////\n    // UBJSON //\n    ////////////\n\n    /*!\n    @param[in] get_char  whether a new character should be retrieved from the\n                         input (true, default) or whether the last read\n                         character should be considered instead\n\n    @return whether a valid UBJSON value was passed to the SAX parser\n    */\n    bool parse_ubjson_internal(const bool get_char = true)\n    {\n        return get_ubjson_value(get_char ? get_ignore_noop() : current);\n    }\n\n    /*!\n    @brief reads a UBJSON string\n\n    This function is either called after reading the 'S' byte explicitly\n    indicating a string, or in case of an object key where the 'S' byte can be\n    left out.\n\n    @param[out] result   created string\n    @param[in] get_char  whether a new character should be retrieved from the\n                         input (true, default) or whether the last read\n                         character should be considered instead\n\n    @return whether string creation completed\n    */\n    bool get_ubjson_string(string_t& result, const bool get_char = true)\n    {\n        if (get_char)\n        {\n            get();  // TODO(niels): may we ignore N here?\n        }\n\n        if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::ubjson, \"value\")))\n        {\n            return false;\n        }\n\n        switch (current)\n        {\n            case 'U':\n            {\n                std::uint8_t len{};\n                return get_number(input_format_t::ubjson, len) && get_string(input_format_t::ubjson, len, result);\n            }\n\n            case 'i':\n            {\n                std::int8_t len{};\n                return get_number(input_format_t::ubjson, len) && get_string(input_format_t::ubjson, len, result);\n            }\n\n            case 'I':\n            {\n                std::int16_t len{};\n                return get_number(input_format_t::ubjson, len) && get_string(input_format_t::ubjson, len, result);\n            }\n\n            case 'l':\n            {\n                std::int32_t len{};\n                return get_number(input_format_t::ubjson, len) && get_string(input_format_t::ubjson, len, result);\n            }\n\n            case 'L':\n            {\n                std::int64_t len{};\n                return get_number(input_format_t::ubjson, len) && get_string(input_format_t::ubjson, len, result);\n            }\n\n            default:\n                auto last_token = get_token_string();\n                return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::ubjson, \"expected length type specification (U, i, I, l, L); last byte: 0x\" + last_token, \"string\")));\n        }\n    }\n\n    /*!\n    @param[out] result  determined size\n    @return whether size determination completed\n    */\n    bool get_ubjson_size_value(std::size_t& result)\n    {\n        switch (get_ignore_noop())\n        {\n            case 'U':\n            {\n                std::uint8_t number{};\n                if (JSON_HEDLEY_UNLIKELY(!get_number(input_format_t::ubjson, number)))\n                {\n                    return false;\n                }\n                result = static_cast<std::size_t>(number);\n                return true;\n            }\n\n            case 'i':\n            {\n                std::int8_t number{};\n                if (JSON_HEDLEY_UNLIKELY(!get_number(input_format_t::ubjson, number)))\n                {\n                    return false;\n                }\n                result = static_cast<std::size_t>(number);\n                return true;\n            }\n\n            case 'I':\n            {\n                std::int16_t number{};\n                if (JSON_HEDLEY_UNLIKELY(!get_number(input_format_t::ubjson, number)))\n                {\n                    return false;\n                }\n                result = static_cast<std::size_t>(number);\n                return true;\n            }\n\n            case 'l':\n            {\n                std::int32_t number{};\n                if (JSON_HEDLEY_UNLIKELY(!get_number(input_format_t::ubjson, number)))\n                {\n                    return false;\n                }\n                result = static_cast<std::size_t>(number);\n                return true;\n            }\n\n            case 'L':\n            {\n                std::int64_t number{};\n                if (JSON_HEDLEY_UNLIKELY(!get_number(input_format_t::ubjson, number)))\n                {\n                    return false;\n                }\n                result = static_cast<std::size_t>(number);\n                return true;\n            }\n\n            default:\n            {\n                auto last_token = get_token_string();\n                return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::ubjson, \"expected length type specification (U, i, I, l, L) after '#'; last byte: 0x\" + last_token, \"size\")));\n            }\n        }\n    }\n\n    /*!\n    @brief determine the type and size for a container\n\n    In the optimized UBJSON format, a type and a size can be provided to allow\n    for a more compact representation.\n\n    @param[out] result  pair of the size and the type\n\n    @return whether pair creation completed\n    */\n    bool get_ubjson_size_type(std::pair<std::size_t, char_int_type>& result)\n    {\n        result.first = string_t::npos; // size\n        result.second = 0; // type\n\n        get_ignore_noop();\n\n        if (current == '$')\n        {\n            result.second = get();  // must not ignore 'N', because 'N' maybe the type\n            if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::ubjson, \"type\")))\n            {\n                return false;\n            }\n\n            get_ignore_noop();\n            if (JSON_HEDLEY_UNLIKELY(current != '#'))\n            {\n                if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::ubjson, \"value\")))\n                {\n                    return false;\n                }\n                auto last_token = get_token_string();\n                return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::ubjson, \"expected '#' after type information; last byte: 0x\" + last_token, \"size\")));\n            }\n\n            return get_ubjson_size_value(result.first);\n        }\n\n        if (current == '#')\n        {\n            return get_ubjson_size_value(result.first);\n        }\n\n        return true;\n    }\n\n    /*!\n    @param prefix  the previously read or set type prefix\n    @return whether value creation completed\n    */\n    bool get_ubjson_value(const char_int_type prefix)\n    {\n        switch (prefix)\n        {\n            case std::char_traits<char_type>::eof():  // EOF\n                return unexpect_eof(input_format_t::ubjson, \"value\");\n\n            case 'T':  // true\n                return sax->boolean(true);\n            case 'F':  // false\n                return sax->boolean(false);\n\n            case 'Z':  // null\n                return sax->null();\n\n            case 'U':\n            {\n                std::uint8_t number{};\n                return get_number(input_format_t::ubjson, number) && sax->number_unsigned(number);\n            }\n\n            case 'i':\n            {\n                std::int8_t number{};\n                return get_number(input_format_t::ubjson, number) && sax->number_integer(number);\n            }\n\n            case 'I':\n            {\n                std::int16_t number{};\n                return get_number(input_format_t::ubjson, number) && sax->number_integer(number);\n            }\n\n            case 'l':\n            {\n                std::int32_t number{};\n                return get_number(input_format_t::ubjson, number) && sax->number_integer(number);\n            }\n\n            case 'L':\n            {\n                std::int64_t number{};\n                return get_number(input_format_t::ubjson, number) && sax->number_integer(number);\n            }\n\n            case 'd':\n            {\n                float number{};\n                return get_number(input_format_t::ubjson, number) && sax->number_float(static_cast<number_float_t>(number), \"\");\n            }\n\n            case 'D':\n            {\n                double number{};\n                return get_number(input_format_t::ubjson, number) && sax->number_float(static_cast<number_float_t>(number), \"\");\n            }\n\n            case 'H':\n            {\n                return get_ubjson_high_precision_number();\n            }\n\n            case 'C':  // char\n            {\n                get();\n                if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::ubjson, \"char\")))\n                {\n                    return false;\n                }\n                if (JSON_HEDLEY_UNLIKELY(current > 127))\n                {\n                    auto last_token = get_token_string();\n                    return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::ubjson, \"byte after 'C' must be in range 0x00..0x7F; last byte: 0x\" + last_token, \"char\")));\n                }\n                string_t s(1, static_cast<typename string_t::value_type>(current));\n                return sax->string(s);\n            }\n\n            case 'S':  // string\n            {\n                string_t s;\n                return get_ubjson_string(s) && sax->string(s);\n            }\n\n            case '[':  // array\n                return get_ubjson_array();\n\n            case '{':  // object\n                return get_ubjson_object();\n\n            default: // anything else\n            {\n                auto last_token = get_token_string();\n                return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::ubjson, \"invalid byte: 0x\" + last_token, \"value\")));\n            }\n        }\n    }\n\n    /*!\n    @return whether array creation completed\n    */\n    bool get_ubjson_array()\n    {\n        std::pair<std::size_t, char_int_type> size_and_type;\n        if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_type(size_and_type)))\n        {\n            return false;\n        }\n\n        if (size_and_type.first != string_t::npos)\n        {\n            if (JSON_HEDLEY_UNLIKELY(!sax->start_array(size_and_type.first)))\n            {\n                return false;\n            }\n\n            if (size_and_type.second != 0)\n            {\n                if (size_and_type.second != 'N')\n                {\n                    for (std::size_t i = 0; i < size_and_type.first; ++i)\n                    {\n                        if (JSON_HEDLEY_UNLIKELY(!get_ubjson_value(size_and_type.second)))\n                        {\n                            return false;\n                        }\n                    }\n                }\n            }\n            else\n            {\n                for (std::size_t i = 0; i < size_and_type.first; ++i)\n                {\n                    if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal()))\n                    {\n                        return false;\n                    }\n                }\n            }\n        }\n        else\n        {\n            if (JSON_HEDLEY_UNLIKELY(!sax->start_array(std::size_t(-1))))\n            {\n                return false;\n            }\n\n            while (current != ']')\n            {\n                if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal(false)))\n                {\n                    return false;\n                }\n                get_ignore_noop();\n            }\n        }\n\n        return sax->end_array();\n    }\n\n    /*!\n    @return whether object creation completed\n    */\n    bool get_ubjson_object()\n    {\n        std::pair<std::size_t, char_int_type> size_and_type;\n        if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_type(size_and_type)))\n        {\n            return false;\n        }\n\n        string_t key;\n        if (size_and_type.first != string_t::npos)\n        {\n            if (JSON_HEDLEY_UNLIKELY(!sax->start_object(size_and_type.first)))\n            {\n                return false;\n            }\n\n            if (size_and_type.second != 0)\n            {\n                for (std::size_t i = 0; i < size_and_type.first; ++i)\n                {\n                    if (JSON_HEDLEY_UNLIKELY(!get_ubjson_string(key) || !sax->key(key)))\n                    {\n                        return false;\n                    }\n                    if (JSON_HEDLEY_UNLIKELY(!get_ubjson_value(size_and_type.second)))\n                    {\n                        return false;\n                    }\n                    key.clear();\n                }\n            }\n            else\n            {\n                for (std::size_t i = 0; i < size_and_type.first; ++i)\n                {\n                    if (JSON_HEDLEY_UNLIKELY(!get_ubjson_string(key) || !sax->key(key)))\n                    {\n                        return false;\n                    }\n                    if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal()))\n                    {\n                        return false;\n                    }\n                    key.clear();\n                }\n            }\n        }\n        else\n        {\n            if (JSON_HEDLEY_UNLIKELY(!sax->start_object(std::size_t(-1))))\n            {\n                return false;\n            }\n\n            while (current != '}')\n            {\n                if (JSON_HEDLEY_UNLIKELY(!get_ubjson_string(key, false) || !sax->key(key)))\n                {\n                    return false;\n                }\n                if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal()))\n                {\n                    return false;\n                }\n                get_ignore_noop();\n                key.clear();\n            }\n        }\n\n        return sax->end_object();\n    }\n\n    // Note, no reader for UBJSON binary types is implemented because they do\n    // not exist\n\n    bool get_ubjson_high_precision_number()\n    {\n        // get size of following number string\n        std::size_t size{};\n        auto res = get_ubjson_size_value(size);\n        if (JSON_HEDLEY_UNLIKELY(!res))\n        {\n            return res;\n        }\n\n        // get number string\n        std::vector<char> number_vector;\n        for (std::size_t i = 0; i < size; ++i)\n        {\n            get();\n            if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::ubjson, \"number\")))\n            {\n                return false;\n            }\n            number_vector.push_back(static_cast<char>(current));\n        }\n\n        // parse number string\n        auto number_ia = detail::input_adapter(std::forward<decltype(number_vector)>(number_vector));\n        auto number_lexer = detail::lexer<BasicJsonType, decltype(number_ia)>(std::move(number_ia), false);\n        const auto result_number = number_lexer.scan();\n        const auto number_string = number_lexer.get_token_string();\n        const auto result_remainder = number_lexer.scan();\n\n        using token_type = typename detail::lexer_base<BasicJsonType>::token_type;\n\n        if (JSON_HEDLEY_UNLIKELY(result_remainder != token_type::end_of_input))\n        {\n            return sax->parse_error(chars_read, number_string, parse_error::create(115, chars_read, exception_message(input_format_t::ubjson, \"invalid number text: \" + number_lexer.get_token_string(), \"high-precision number\")));\n        }\n\n        switch (result_number)\n        {\n            case token_type::value_integer:\n                return sax->number_integer(number_lexer.get_number_integer());\n            case token_type::value_unsigned:\n                return sax->number_unsigned(number_lexer.get_number_unsigned());\n            case token_type::value_float:\n                return sax->number_float(number_lexer.get_number_float(), std::move(number_string));\n            default:\n                return sax->parse_error(chars_read, number_string, parse_error::create(115, chars_read, exception_message(input_format_t::ubjson, \"invalid number text: \" + number_lexer.get_token_string(), \"high-precision number\")));\n        }\n    }\n\n    ///////////////////////\n    // Utility functions //\n    ///////////////////////\n\n    /*!\n    @brief get next character from the input\n\n    This function provides the interface to the used input adapter. It does\n    not throw in case the input reached EOF, but returns a -'ve valued\n    `std::char_traits<char_type>::eof()` in that case.\n\n    @return character read from the input\n    */\n    char_int_type get()\n    {\n        ++chars_read;\n        return current = ia.get_character();\n    }\n\n    /*!\n    @return character read from the input after ignoring all 'N' entries\n    */\n    char_int_type get_ignore_noop()\n    {\n        do\n        {\n            get();\n        }\n        while (current == 'N');\n\n        return current;\n    }\n\n    /*\n    @brief read a number from the input\n\n    @tparam NumberType the type of the number\n    @param[in] format   the current format (for diagnostics)\n    @param[out] result  number of type @a NumberType\n\n    @return whether conversion completed\n\n    @note This function needs to respect the system's endianess, because\n          bytes in CBOR, MessagePack, and UBJSON are stored in network order\n          (big endian) and therefore need reordering on little endian systems.\n    */\n    template<typename NumberType, bool InputIsLittleEndian = false>\n    bool get_number(const input_format_t format, NumberType& result)\n    {\n        // step 1: read input into array with system's byte order\n        std::array<std::uint8_t, sizeof(NumberType)> vec;\n        for (std::size_t i = 0; i < sizeof(NumberType); ++i)\n        {\n            get();\n            if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(format, \"number\")))\n            {\n                return false;\n            }\n\n            // reverse byte order prior to conversion if necessary\n            if (is_little_endian != InputIsLittleEndian)\n            {\n                vec[sizeof(NumberType) - i - 1] = static_cast<std::uint8_t>(current);\n            }\n            else\n            {\n                vec[i] = static_cast<std::uint8_t>(current); // LCOV_EXCL_LINE\n            }\n        }\n\n        // step 2: convert array into number of type T and return\n        std::memcpy(&result, vec.data(), sizeof(NumberType));\n        return true;\n    }\n\n    /*!\n    @brief create a string by reading characters from the input\n\n    @tparam NumberType the type of the number\n    @param[in] format the current format (for diagnostics)\n    @param[in] len number of characters to read\n    @param[out] result string created by reading @a len bytes\n\n    @return whether string creation completed\n\n    @note We can not reserve @a len bytes for the result, because @a len\n          may be too large. Usually, @ref unexpect_eof() detects the end of\n          the input before we run out of string memory.\n    */\n    template<typename NumberType>\n    bool get_string(const input_format_t format,\n                    const NumberType len,\n                    string_t& result)\n    {\n        bool success = true;\n        for (NumberType i = 0; i < len; i++)\n        {\n            get();\n            if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(format, \"string\")))\n            {\n                success = false;\n                break;\n            }\n            result.push_back(static_cast<typename string_t::value_type>(current));\n        };\n        return success;\n    }\n\n    /*!\n    @brief create a byte array by reading bytes from the input\n\n    @tparam NumberType the type of the number\n    @param[in] format the current format (for diagnostics)\n    @param[in] len number of bytes to read\n    @param[out] result byte array created by reading @a len bytes\n\n    @return whether byte array creation completed\n\n    @note We can not reserve @a len bytes for the result, because @a len\n          may be too large. Usually, @ref unexpect_eof() detects the end of\n          the input before we run out of memory.\n    */\n    template<typename NumberType>\n    bool get_binary(const input_format_t format,\n                    const NumberType len,\n                    binary_t& result)\n    {\n        bool success = true;\n        for (NumberType i = 0; i < len; i++)\n        {\n            get();\n            if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(format, \"binary\")))\n            {\n                success = false;\n                break;\n            }\n            result.push_back(static_cast<std::uint8_t>(current));\n        }\n        return success;\n    }\n\n    /*!\n    @param[in] format   the current format (for diagnostics)\n    @param[in] context  further context information (for diagnostics)\n    @return whether the last read character is not EOF\n    */\n    JSON_HEDLEY_NON_NULL(3)\n    bool unexpect_eof(const input_format_t format, const char* context) const\n    {\n        if (JSON_HEDLEY_UNLIKELY(current == std::char_traits<char_type>::eof()))\n        {\n            return sax->parse_error(chars_read, \"<end of file>\",\n                                    parse_error::create(110, chars_read, exception_message(format, \"unexpected end of input\", context)));\n        }\n        return true;\n    }\n\n    /*!\n    @return a string representation of the last read byte\n    */\n    std::string get_token_string() const\n    {\n        std::array<char, 3> cr{{}};\n        (std::snprintf)(cr.data(), cr.size(), \"%.2hhX\", static_cast<unsigned char>(current));\n        return std::string{cr.data()};\n    }\n\n    /*!\n    @param[in] format   the current format\n    @param[in] detail   a detailed error message\n    @param[in] context  further context information\n    @return a message string to use in the parse_error exceptions\n    */\n    std::string exception_message(const input_format_t format,\n                                  const std::string& detail,\n                                  const std::string& context) const\n    {\n        std::string error_msg = \"syntax error while parsing \";\n\n        switch (format)\n        {\n            case input_format_t::cbor:\n                error_msg += \"CBOR\";\n                break;\n\n            case input_format_t::msgpack:\n                error_msg += \"MessagePack\";\n                break;\n\n            case input_format_t::ubjson:\n                error_msg += \"UBJSON\";\n                break;\n\n            case input_format_t::bson:\n                error_msg += \"BSON\";\n                break;\n\n            default:            // LCOV_EXCL_LINE\n                JSON_ASSERT(false);  // LCOV_EXCL_LINE\n        }\n\n        return error_msg + \" \" + context + \": \" + detail;\n    }\n\n  private:\n    /// input adapter\n    InputAdapterType ia;\n\n    /// the current character\n    char_int_type current = std::char_traits<char_type>::eof();\n\n    /// the number of characters read\n    std::size_t chars_read = 0;\n\n    /// whether we can assume little endianess\n    const bool is_little_endian = little_endianess();\n\n    /// the SAX parser\n    json_sax_t* sax = nullptr;\n};\n}  // namespace detail\n}  // namespace nlohmann\n\n// #include <nlohmann/detail/input/input_adapters.hpp>\n\n// #include <nlohmann/detail/input/lexer.hpp>\n\n// #include <nlohmann/detail/input/parser.hpp>\n\n\n#include <cmath> // isfinite\n#include <cstdint> // uint8_t\n#include <functional> // function\n#include <string> // string\n#include <utility> // move\n#include <vector> // vector\n\n// #include <nlohmann/detail/exceptions.hpp>\n\n// #include <nlohmann/detail/input/input_adapters.hpp>\n\n// #include <nlohmann/detail/input/json_sax.hpp>\n\n// #include <nlohmann/detail/input/lexer.hpp>\n\n// #include <nlohmann/detail/macro_scope.hpp>\n\n// #include <nlohmann/detail/meta/is_sax.hpp>\n\n// #include <nlohmann/detail/value_t.hpp>\n\n\nnamespace nlohmann\n{\nnamespace detail\n{\n////////////\n// parser //\n////////////\n\nenum class parse_event_t : uint8_t\n{\n    /// the parser read `{` and started to process a JSON object\n    object_start,\n    /// the parser read `}` and finished processing a JSON object\n    object_end,\n    /// the parser read `[` and started to process a JSON array\n    array_start,\n    /// the parser read `]` and finished processing a JSON array\n    array_end,\n    /// the parser read a key of a value in an object\n    key,\n    /// the parser finished reading a JSON value\n    value\n};\n\ntemplate<typename BasicJsonType>\nusing parser_callback_t =\n    std::function<bool(int depth, parse_event_t event, BasicJsonType& parsed)>;\n\n/*!\n@brief syntax analysis\n\nThis class implements a recursive descent parser.\n*/\ntemplate<typename BasicJsonType, typename InputAdapterType>\nclass parser\n{\n    using number_integer_t = typename BasicJsonType::number_integer_t;\n    using number_unsigned_t = typename BasicJsonType::number_unsigned_t;\n    using number_float_t = typename BasicJsonType::number_float_t;\n    using string_t = typename BasicJsonType::string_t;\n    using lexer_t = lexer<BasicJsonType, InputAdapterType>;\n    using token_type = typename lexer_t::token_type;\n\n  public:\n    /// a parser reading from an input adapter\n    explicit parser(InputAdapterType&& adapter,\n                    const parser_callback_t<BasicJsonType> cb = nullptr,\n                    const bool allow_exceptions_ = true,\n                    const bool skip_comments = false)\n        : callback(cb)\n        , m_lexer(std::move(adapter), skip_comments)\n        , allow_exceptions(allow_exceptions_)\n    {\n        // read first token\n        get_token();\n    }\n\n    /*!\n    @brief public parser interface\n\n    @param[in] strict      whether to expect the last token to be EOF\n    @param[in,out] result  parsed JSON value\n\n    @throw parse_error.101 in case of an unexpected token\n    @throw parse_error.102 if to_unicode fails or surrogate error\n    @throw parse_error.103 if to_unicode fails\n    */\n    void parse(const bool strict, BasicJsonType& result)\n    {\n        if (callback)\n        {\n            json_sax_dom_callback_parser<BasicJsonType> sdp(result, callback, allow_exceptions);\n            sax_parse_internal(&sdp);\n            result.assert_invariant();\n\n            // in strict mode, input must be completely read\n            if (strict && (get_token() != token_type::end_of_input))\n            {\n                sdp.parse_error(m_lexer.get_position(),\n                                m_lexer.get_token_string(),\n                                parse_error::create(101, m_lexer.get_position(),\n                                                    exception_message(token_type::end_of_input, \"value\")));\n            }\n\n            // in case of an error, return discarded value\n            if (sdp.is_errored())\n            {\n                result = value_t::discarded;\n                return;\n            }\n\n            // set top-level value to null if it was discarded by the callback\n            // function\n            if (result.is_discarded())\n            {\n                result = nullptr;\n            }\n        }\n        else\n        {\n            json_sax_dom_parser<BasicJsonType> sdp(result, allow_exceptions);\n            sax_parse_internal(&sdp);\n            result.assert_invariant();\n\n            // in strict mode, input must be completely read\n            if (strict && (get_token() != token_type::end_of_input))\n            {\n                sdp.parse_error(m_lexer.get_position(),\n                                m_lexer.get_token_string(),\n                                parse_error::create(101, m_lexer.get_position(),\n                                                    exception_message(token_type::end_of_input, \"value\")));\n            }\n\n            // in case of an error, return discarded value\n            if (sdp.is_errored())\n            {\n                result = value_t::discarded;\n                return;\n            }\n        }\n    }\n\n    /*!\n    @brief public accept interface\n\n    @param[in] strict  whether to expect the last token to be EOF\n    @return whether the input is a proper JSON text\n    */\n    bool accept(const bool strict = true)\n    {\n        json_sax_acceptor<BasicJsonType> sax_acceptor;\n        return sax_parse(&sax_acceptor, strict);\n    }\n\n    template<typename SAX>\n    JSON_HEDLEY_NON_NULL(2)\n    bool sax_parse(SAX* sax, const bool strict = true)\n    {\n        (void)detail::is_sax_static_asserts<SAX, BasicJsonType> {};\n        const bool result = sax_parse_internal(sax);\n\n        // strict mode: next byte must be EOF\n        if (result && strict && (get_token() != token_type::end_of_input))\n        {\n            return sax->parse_error(m_lexer.get_position(),\n                                    m_lexer.get_token_string(),\n                                    parse_error::create(101, m_lexer.get_position(),\n                                            exception_message(token_type::end_of_input, \"value\")));\n        }\n\n        return result;\n    }\n\n  private:\n    template<typename SAX>\n    JSON_HEDLEY_NON_NULL(2)\n    bool sax_parse_internal(SAX* sax)\n    {\n        // stack to remember the hierarchy of structured values we are parsing\n        // true = array; false = object\n        std::vector<bool> states;\n        // value to avoid a goto (see comment where set to true)\n        bool skip_to_state_evaluation = false;\n\n        while (true)\n        {\n            if (!skip_to_state_evaluation)\n            {\n                // invariant: get_token() was called before each iteration\n                switch (last_token)\n                {\n                    case token_type::begin_object:\n                    {\n                        if (JSON_HEDLEY_UNLIKELY(!sax->start_object(std::size_t(-1))))\n                        {\n                            return false;\n                        }\n\n                        // closing } -> we are done\n                        if (get_token() == token_type::end_object)\n                        {\n                            if (JSON_HEDLEY_UNLIKELY(!sax->end_object()))\n                            {\n                                return false;\n                            }\n                            break;\n                        }\n\n                        // parse key\n                        if (JSON_HEDLEY_UNLIKELY(last_token != token_type::value_string))\n                        {\n                            return sax->parse_error(m_lexer.get_position(),\n                                                    m_lexer.get_token_string(),\n                                                    parse_error::create(101, m_lexer.get_position(),\n                                                            exception_message(token_type::value_string, \"object key\")));\n                        }\n                        if (JSON_HEDLEY_UNLIKELY(!sax->key(m_lexer.get_string())))\n                        {\n                            return false;\n                        }\n\n                        // parse separator (:)\n                        if (JSON_HEDLEY_UNLIKELY(get_token() != token_type::name_separator))\n                        {\n                            return sax->parse_error(m_lexer.get_position(),\n                                                    m_lexer.get_token_string(),\n                                                    parse_error::create(101, m_lexer.get_position(),\n                                                            exception_message(token_type::name_separator, \"object separator\")));\n                        }\n\n                        // remember we are now inside an object\n                        states.push_back(false);\n\n                        // parse values\n                        get_token();\n                        continue;\n                    }\n\n                    case token_type::begin_array:\n                    {\n                        if (JSON_HEDLEY_UNLIKELY(!sax->start_array(std::size_t(-1))))\n                        {\n                            return false;\n                        }\n\n                        // closing ] -> we are done\n                        if (get_token() == token_type::end_array)\n                        {\n                            if (JSON_HEDLEY_UNLIKELY(!sax->end_array()))\n                            {\n                                return false;\n                            }\n                            break;\n                        }\n\n                        // remember we are now inside an array\n                        states.push_back(true);\n\n                        // parse values (no need to call get_token)\n                        continue;\n                    }\n\n                    case token_type::value_float:\n                    {\n                        const auto res = m_lexer.get_number_float();\n\n                        if (JSON_HEDLEY_UNLIKELY(!std::isfinite(res)))\n                        {\n                            return sax->parse_error(m_lexer.get_position(),\n                                                    m_lexer.get_token_string(),\n                                                    out_of_range::create(406, \"number overflow parsing '\" + m_lexer.get_token_string() + \"'\"));\n                        }\n\n                        if (JSON_HEDLEY_UNLIKELY(!sax->number_float(res, m_lexer.get_string())))\n                        {\n                            return false;\n                        }\n\n                        break;\n                    }\n\n                    case token_type::literal_false:\n                    {\n                        if (JSON_HEDLEY_UNLIKELY(!sax->boolean(false)))\n                        {\n                            return false;\n                        }\n                        break;\n                    }\n\n                    case token_type::literal_null:\n                    {\n                        if (JSON_HEDLEY_UNLIKELY(!sax->null()))\n                        {\n                            return false;\n                        }\n                        break;\n                    }\n\n                    case token_type::literal_true:\n                    {\n                        if (JSON_HEDLEY_UNLIKELY(!sax->boolean(true)))\n                        {\n                            return false;\n                        }\n                        break;\n                    }\n\n                    case token_type::value_integer:\n                    {\n                        if (JSON_HEDLEY_UNLIKELY(!sax->number_integer(m_lexer.get_number_integer())))\n                        {\n                            return false;\n                        }\n                        break;\n                    }\n\n                    case token_type::value_string:\n                    {\n                        if (JSON_HEDLEY_UNLIKELY(!sax->string(m_lexer.get_string())))\n                        {\n                            return false;\n                        }\n                        break;\n                    }\n\n                    case token_type::value_unsigned:\n                    {\n                        if (JSON_HEDLEY_UNLIKELY(!sax->number_unsigned(m_lexer.get_number_unsigned())))\n                        {\n                            return false;\n                        }\n                        break;\n                    }\n\n                    case token_type::parse_error:\n                    {\n                        // using \"uninitialized\" to avoid \"expected\" message\n                        return sax->parse_error(m_lexer.get_position(),\n                                                m_lexer.get_token_string(),\n                                                parse_error::create(101, m_lexer.get_position(),\n                                                        exception_message(token_type::uninitialized, \"value\")));\n                    }\n\n                    default: // the last token was unexpected\n                    {\n                        return sax->parse_error(m_lexer.get_position(),\n                                                m_lexer.get_token_string(),\n                                                parse_error::create(101, m_lexer.get_position(),\n                                                        exception_message(token_type::literal_or_value, \"value\")));\n                    }\n                }\n            }\n            else\n            {\n                skip_to_state_evaluation = false;\n            }\n\n            // we reached this line after we successfully parsed a value\n            if (states.empty())\n            {\n                // empty stack: we reached the end of the hierarchy: done\n                return true;\n            }\n\n            if (states.back())  // array\n            {\n                // comma -> next value\n                if (get_token() == token_type::value_separator)\n                {\n                    // parse a new value\n                    get_token();\n                    continue;\n                }\n\n                // closing ]\n                if (JSON_HEDLEY_LIKELY(last_token == token_type::end_array))\n                {\n                    if (JSON_HEDLEY_UNLIKELY(!sax->end_array()))\n                    {\n                        return false;\n                    }\n\n                    // We are done with this array. Before we can parse a\n                    // new value, we need to evaluate the new state first.\n                    // By setting skip_to_state_evaluation to false, we\n                    // are effectively jumping to the beginning of this if.\n                    JSON_ASSERT(!states.empty());\n                    states.pop_back();\n                    skip_to_state_evaluation = true;\n                    continue;\n                }\n\n                return sax->parse_error(m_lexer.get_position(),\n                                        m_lexer.get_token_string(),\n                                        parse_error::create(101, m_lexer.get_position(),\n                                                exception_message(token_type::end_array, \"array\")));\n            }\n            else  // object\n            {\n                // comma -> next value\n                if (get_token() == token_type::value_separator)\n                {\n                    // parse key\n                    if (JSON_HEDLEY_UNLIKELY(get_token() != token_type::value_string))\n                    {\n                        return sax->parse_error(m_lexer.get_position(),\n                                                m_lexer.get_token_string(),\n                                                parse_error::create(101, m_lexer.get_position(),\n                                                        exception_message(token_type::value_string, \"object key\")));\n                    }\n\n                    if (JSON_HEDLEY_UNLIKELY(!sax->key(m_lexer.get_string())))\n                    {\n                        return false;\n                    }\n\n                    // parse separator (:)\n                    if (JSON_HEDLEY_UNLIKELY(get_token() != token_type::name_separator))\n                    {\n                        return sax->parse_error(m_lexer.get_position(),\n                                                m_lexer.get_token_string(),\n                                                parse_error::create(101, m_lexer.get_position(),\n                                                        exception_message(token_type::name_separator, \"object separator\")));\n                    }\n\n                    // parse values\n                    get_token();\n                    continue;\n                }\n\n                // closing }\n                if (JSON_HEDLEY_LIKELY(last_token == token_type::end_object))\n                {\n                    if (JSON_HEDLEY_UNLIKELY(!sax->end_object()))\n                    {\n                        return false;\n                    }\n\n                    // We are done with this object. Before we can parse a\n                    // new value, we need to evaluate the new state first.\n                    // By setting skip_to_state_evaluation to false, we\n                    // are effectively jumping to the beginning of this if.\n                    JSON_ASSERT(!states.empty());\n                    states.pop_back();\n                    skip_to_state_evaluation = true;\n                    continue;\n                }\n\n                return sax->parse_error(m_lexer.get_position(),\n                                        m_lexer.get_token_string(),\n                                        parse_error::create(101, m_lexer.get_position(),\n                                                exception_message(token_type::end_object, \"object\")));\n            }\n        }\n    }\n\n    /// get next token from lexer\n    token_type get_token()\n    {\n        return last_token = m_lexer.scan();\n    }\n\n    std::string exception_message(const token_type expected, const std::string& context)\n    {\n        std::string error_msg = \"syntax error \";\n\n        if (!context.empty())\n        {\n            error_msg += \"while parsing \" + context + \" \";\n        }\n\n        error_msg += \"- \";\n\n        if (last_token == token_type::parse_error)\n        {\n            error_msg += std::string(m_lexer.get_error_message()) + \"; last read: '\" +\n                         m_lexer.get_token_string() + \"'\";\n        }\n        else\n        {\n            error_msg += \"unexpected \" + std::string(lexer_t::token_type_name(last_token));\n        }\n\n        if (expected != token_type::uninitialized)\n        {\n            error_msg += \"; expected \" + std::string(lexer_t::token_type_name(expected));\n        }\n\n        return error_msg;\n    }\n\n  private:\n    /// callback function\n    const parser_callback_t<BasicJsonType> callback = nullptr;\n    /// the type of the last read token\n    token_type last_token = token_type::uninitialized;\n    /// the lexer\n    lexer_t m_lexer;\n    /// whether to throw exceptions in case of errors\n    const bool allow_exceptions = true;\n};\n}  // namespace detail\n}  // namespace nlohmann\n\n// #include <nlohmann/detail/iterators/internal_iterator.hpp>\n\n\n// #include <nlohmann/detail/iterators/primitive_iterator.hpp>\n\n\n#include <cstddef> // ptrdiff_t\n#include <limits>  // numeric_limits\n\nnamespace nlohmann\n{\nnamespace detail\n{\n/*\n@brief an iterator for primitive JSON types\n\nThis class models an iterator for primitive JSON types (boolean, number,\nstring). It's only purpose is to allow the iterator/const_iterator classes\nto \"iterate\" over primitive values. Internally, the iterator is modeled by\na `difference_type` variable. Value begin_value (`0`) models the begin,\nend_value (`1`) models past the end.\n*/\nclass primitive_iterator_t\n{\n  private:\n    using difference_type = std::ptrdiff_t;\n    static constexpr difference_type begin_value = 0;\n    static constexpr difference_type end_value = begin_value + 1;\n\n    /// iterator as signed integer type\n    difference_type m_it = (std::numeric_limits<std::ptrdiff_t>::min)();\n\n  public:\n    constexpr difference_type get_value() const noexcept\n    {\n        return m_it;\n    }\n\n    /// set iterator to a defined beginning\n    void set_begin() noexcept\n    {\n        m_it = begin_value;\n    }\n\n    /// set iterator to a defined past the end\n    void set_end() noexcept\n    {\n        m_it = end_value;\n    }\n\n    /// return whether the iterator can be dereferenced\n    constexpr bool is_begin() const noexcept\n    {\n        return m_it == begin_value;\n    }\n\n    /// return whether the iterator is at end\n    constexpr bool is_end() const noexcept\n    {\n        return m_it == end_value;\n    }\n\n    friend constexpr bool operator==(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept\n    {\n        return lhs.m_it == rhs.m_it;\n    }\n\n    friend constexpr bool operator<(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept\n    {\n        return lhs.m_it < rhs.m_it;\n    }\n\n    primitive_iterator_t operator+(difference_type n) noexcept\n    {\n        auto result = *this;\n        result += n;\n        return result;\n    }\n\n    friend constexpr difference_type operator-(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept\n    {\n        return lhs.m_it - rhs.m_it;\n    }\n\n    primitive_iterator_t& operator++() noexcept\n    {\n        ++m_it;\n        return *this;\n    }\n\n    primitive_iterator_t const operator++(int) noexcept\n    {\n        auto result = *this;\n        ++m_it;\n        return result;\n    }\n\n    primitive_iterator_t& operator--() noexcept\n    {\n        --m_it;\n        return *this;\n    }\n\n    primitive_iterator_t const operator--(int) noexcept\n    {\n        auto result = *this;\n        --m_it;\n        return result;\n    }\n\n    primitive_iterator_t& operator+=(difference_type n) noexcept\n    {\n        m_it += n;\n        return *this;\n    }\n\n    primitive_iterator_t& operator-=(difference_type n) noexcept\n    {\n        m_it -= n;\n        return *this;\n    }\n};\n}  // namespace detail\n}  // namespace nlohmann\n\n\nnamespace nlohmann\n{\nnamespace detail\n{\n/*!\n@brief an iterator value\n\n@note This structure could easily be a union, but MSVC currently does not allow\nunions members with complex constructors, see https://github.com/nlohmann/json/pull/105.\n*/\ntemplate<typename BasicJsonType> struct internal_iterator\n{\n    /// iterator for JSON objects\n    typename BasicJsonType::object_t::iterator object_iterator {};\n    /// iterator for JSON arrays\n    typename BasicJsonType::array_t::iterator array_iterator {};\n    /// generic iterator for all other types\n    primitive_iterator_t primitive_iterator {};\n};\n}  // namespace detail\n}  // namespace nlohmann\n\n// #include <nlohmann/detail/iterators/iter_impl.hpp>\n\n\n#include <iterator> // iterator, random_access_iterator_tag, bidirectional_iterator_tag, advance, next\n#include <type_traits> // conditional, is_const, remove_const\n\n// #include <nlohmann/detail/exceptions.hpp>\n\n// #include <nlohmann/detail/iterators/internal_iterator.hpp>\n\n// #include <nlohmann/detail/iterators/primitive_iterator.hpp>\n\n// #include <nlohmann/detail/macro_scope.hpp>\n\n// #include <nlohmann/detail/meta/cpp_future.hpp>\n\n// #include <nlohmann/detail/meta/type_traits.hpp>\n\n// #include <nlohmann/detail/value_t.hpp>\n\n\nnamespace nlohmann\n{\nnamespace detail\n{\n// forward declare, to be able to friend it later on\ntemplate<typename IteratorType> class iteration_proxy;\ntemplate<typename IteratorType> class iteration_proxy_value;\n\n/*!\n@brief a template for a bidirectional iterator for the @ref basic_json class\nThis class implements a both iterators (iterator and const_iterator) for the\n@ref basic_json class.\n@note An iterator is called *initialized* when a pointer to a JSON value has\n      been set (e.g., by a constructor or a copy assignment). If the iterator is\n      default-constructed, it is *uninitialized* and most methods are undefined.\n      **The library uses assertions to detect calls on uninitialized iterators.**\n@requirement The class satisfies the following concept requirements:\n-\n[BidirectionalIterator](https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator):\n  The iterator that can be moved can be moved in both directions (i.e.\n  incremented and decremented).\n@since version 1.0.0, simplified in version 2.0.9, change to bidirectional\n       iterators in version 3.0.0 (see https://github.com/nlohmann/json/issues/593)\n*/\ntemplate<typename BasicJsonType>\nclass iter_impl\n{\n    /// allow basic_json to access private members\n    friend iter_impl<typename std::conditional<std::is_const<BasicJsonType>::value, typename std::remove_const<BasicJsonType>::type, const BasicJsonType>::type>;\n    friend BasicJsonType;\n    friend iteration_proxy<iter_impl>;\n    friend iteration_proxy_value<iter_impl>;\n\n    using object_t = typename BasicJsonType::object_t;\n    using array_t = typename BasicJsonType::array_t;\n    // make sure BasicJsonType is basic_json or const basic_json\n    static_assert(is_basic_json<typename std::remove_const<BasicJsonType>::type>::value,\n                  \"iter_impl only accepts (const) basic_json\");\n\n  public:\n\n    /// The std::iterator class template (used as a base class to provide typedefs) is deprecated in C++17.\n    /// The C++ Standard has never required user-defined iterators to derive from std::iterator.\n    /// A user-defined iterator should provide publicly accessible typedefs named\n    /// iterator_category, value_type, difference_type, pointer, and reference.\n    /// Note that value_type is required to be non-const, even for constant iterators.\n    using iterator_category = std::bidirectional_iterator_tag;\n\n    /// the type of the values when the iterator is dereferenced\n    using value_type = typename BasicJsonType::value_type;\n    /// a type to represent differences between iterators\n    using difference_type = typename BasicJsonType::difference_type;\n    /// defines a pointer to the type iterated over (value_type)\n    using pointer = typename std::conditional<std::is_const<BasicJsonType>::value,\n          typename BasicJsonType::const_pointer,\n          typename BasicJsonType::pointer>::type;\n    /// defines a reference to the type iterated over (value_type)\n    using reference =\n        typename std::conditional<std::is_const<BasicJsonType>::value,\n        typename BasicJsonType::const_reference,\n        typename BasicJsonType::reference>::type;\n\n    /// default constructor\n    iter_impl() = default;\n\n    /*!\n    @brief constructor for a given JSON instance\n    @param[in] object  pointer to a JSON object for this iterator\n    @pre object != nullptr\n    @post The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    explicit iter_impl(pointer object) noexcept : m_object(object)\n    {\n        JSON_ASSERT(m_object != nullptr);\n\n        switch (m_object->m_type)\n        {\n            case value_t::object:\n            {\n                m_it.object_iterator = typename object_t::iterator();\n                break;\n            }\n\n            case value_t::array:\n            {\n                m_it.array_iterator = typename array_t::iterator();\n                break;\n            }\n\n            default:\n            {\n                m_it.primitive_iterator = primitive_iterator_t();\n                break;\n            }\n        }\n    }\n\n    /*!\n    @note The conventional copy constructor and copy assignment are implicitly\n          defined. Combined with the following converting constructor and\n          assignment, they support: (1) copy from iterator to iterator, (2)\n          copy from const iterator to const iterator, and (3) conversion from\n          iterator to const iterator. However conversion from const iterator\n          to iterator is not defined.\n    */\n\n    /*!\n    @brief const copy constructor\n    @param[in] other const iterator to copy from\n    @note This copy constructor had to be defined explicitly to circumvent a bug\n          occurring on msvc v19.0 compiler (VS 2015) debug build. For more\n          information refer to: https://github.com/nlohmann/json/issues/1608\n    */\n    iter_impl(const iter_impl<const BasicJsonType>& other) noexcept\n        : m_object(other.m_object), m_it(other.m_it)\n    {}\n\n    /*!\n    @brief converting assignment\n    @param[in] other const iterator to copy from\n    @return const/non-const iterator\n    @note It is not checked whether @a other is initialized.\n    */\n    iter_impl& operator=(const iter_impl<const BasicJsonType>& other) noexcept\n    {\n        m_object = other.m_object;\n        m_it = other.m_it;\n        return *this;\n    }\n\n    /*!\n    @brief converting constructor\n    @param[in] other  non-const iterator to copy from\n    @note It is not checked whether @a other is initialized.\n    */\n    iter_impl(const iter_impl<typename std::remove_const<BasicJsonType>::type>& other) noexcept\n        : m_object(other.m_object), m_it(other.m_it)\n    {}\n\n    /*!\n    @brief converting assignment\n    @param[in] other  non-const iterator to copy from\n    @return const/non-const iterator\n    @note It is not checked whether @a other is initialized.\n    */\n    iter_impl& operator=(const iter_impl<typename std::remove_const<BasicJsonType>::type>& other) noexcept\n    {\n        m_object = other.m_object;\n        m_it = other.m_it;\n        return *this;\n    }\n\n  private:\n    /*!\n    @brief set the iterator to the first value\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    void set_begin() noexcept\n    {\n        JSON_ASSERT(m_object != nullptr);\n\n        switch (m_object->m_type)\n        {\n            case value_t::object:\n            {\n                m_it.object_iterator = m_object->m_value.object->begin();\n                break;\n            }\n\n            case value_t::array:\n            {\n                m_it.array_iterator = m_object->m_value.array->begin();\n                break;\n            }\n\n            case value_t::null:\n            {\n                // set to end so begin()==end() is true: null is empty\n                m_it.primitive_iterator.set_end();\n                break;\n            }\n\n            default:\n            {\n                m_it.primitive_iterator.set_begin();\n                break;\n            }\n        }\n    }\n\n    /*!\n    @brief set the iterator past the last value\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    void set_end() noexcept\n    {\n        JSON_ASSERT(m_object != nullptr);\n\n        switch (m_object->m_type)\n        {\n            case value_t::object:\n            {\n                m_it.object_iterator = m_object->m_value.object->end();\n                break;\n            }\n\n            case value_t::array:\n            {\n                m_it.array_iterator = m_object->m_value.array->end();\n                break;\n            }\n\n            default:\n            {\n                m_it.primitive_iterator.set_end();\n                break;\n            }\n        }\n    }\n\n  public:\n    /*!\n    @brief return a reference to the value pointed to by the iterator\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    reference operator*() const\n    {\n        JSON_ASSERT(m_object != nullptr);\n\n        switch (m_object->m_type)\n        {\n            case value_t::object:\n            {\n                JSON_ASSERT(m_it.object_iterator != m_object->m_value.object->end());\n                return m_it.object_iterator->second;\n            }\n\n            case value_t::array:\n            {\n                JSON_ASSERT(m_it.array_iterator != m_object->m_value.array->end());\n                return *m_it.array_iterator;\n            }\n\n            case value_t::null:\n                JSON_THROW(invalid_iterator::create(214, \"cannot get value\"));\n\n            default:\n            {\n                if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.is_begin()))\n                {\n                    return *m_object;\n                }\n\n                JSON_THROW(invalid_iterator::create(214, \"cannot get value\"));\n            }\n        }\n    }\n\n    /*!\n    @brief dereference the iterator\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    pointer operator->() const\n    {\n        JSON_ASSERT(m_object != nullptr);\n\n        switch (m_object->m_type)\n        {\n            case value_t::object:\n            {\n                JSON_ASSERT(m_it.object_iterator != m_object->m_value.object->end());\n                return &(m_it.object_iterator->second);\n            }\n\n            case value_t::array:\n            {\n                JSON_ASSERT(m_it.array_iterator != m_object->m_value.array->end());\n                return &*m_it.array_iterator;\n            }\n\n            default:\n            {\n                if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.is_begin()))\n                {\n                    return m_object;\n                }\n\n                JSON_THROW(invalid_iterator::create(214, \"cannot get value\"));\n            }\n        }\n    }\n\n    /*!\n    @brief post-increment (it++)\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    iter_impl const operator++(int)\n    {\n        auto result = *this;\n        ++(*this);\n        return result;\n    }\n\n    /*!\n    @brief pre-increment (++it)\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    iter_impl& operator++()\n    {\n        JSON_ASSERT(m_object != nullptr);\n\n        switch (m_object->m_type)\n        {\n            case value_t::object:\n            {\n                std::advance(m_it.object_iterator, 1);\n                break;\n            }\n\n            case value_t::array:\n            {\n                std::advance(m_it.array_iterator, 1);\n                break;\n            }\n\n            default:\n            {\n                ++m_it.primitive_iterator;\n                break;\n            }\n        }\n\n        return *this;\n    }\n\n    /*!\n    @brief post-decrement (it--)\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    iter_impl const operator--(int)\n    {\n        auto result = *this;\n        --(*this);\n        return result;\n    }\n\n    /*!\n    @brief pre-decrement (--it)\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    iter_impl& operator--()\n    {\n        JSON_ASSERT(m_object != nullptr);\n\n        switch (m_object->m_type)\n        {\n            case value_t::object:\n            {\n                std::advance(m_it.object_iterator, -1);\n                break;\n            }\n\n            case value_t::array:\n            {\n                std::advance(m_it.array_iterator, -1);\n                break;\n            }\n\n            default:\n            {\n                --m_it.primitive_iterator;\n                break;\n            }\n        }\n\n        return *this;\n    }\n\n    /*!\n    @brief  comparison: equal\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    bool operator==(const iter_impl& other) const\n    {\n        // if objects are not the same, the comparison is undefined\n        if (JSON_HEDLEY_UNLIKELY(m_object != other.m_object))\n        {\n            JSON_THROW(invalid_iterator::create(212, \"cannot compare iterators of different containers\"));\n        }\n\n        JSON_ASSERT(m_object != nullptr);\n\n        switch (m_object->m_type)\n        {\n            case value_t::object:\n                return (m_it.object_iterator == other.m_it.object_iterator);\n\n            case value_t::array:\n                return (m_it.array_iterator == other.m_it.array_iterator);\n\n            default:\n                return (m_it.primitive_iterator == other.m_it.primitive_iterator);\n        }\n    }\n\n    /*!\n    @brief  comparison: not equal\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    bool operator!=(const iter_impl& other) const\n    {\n        return !operator==(other);\n    }\n\n    /*!\n    @brief  comparison: smaller\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    bool operator<(const iter_impl& other) const\n    {\n        // if objects are not the same, the comparison is undefined\n        if (JSON_HEDLEY_UNLIKELY(m_object != other.m_object))\n        {\n            JSON_THROW(invalid_iterator::create(212, \"cannot compare iterators of different containers\"));\n        }\n\n        JSON_ASSERT(m_object != nullptr);\n\n        switch (m_object->m_type)\n        {\n            case value_t::object:\n                JSON_THROW(invalid_iterator::create(213, \"cannot compare order of object iterators\"));\n\n            case value_t::array:\n                return (m_it.array_iterator < other.m_it.array_iterator);\n\n            default:\n                return (m_it.primitive_iterator < other.m_it.primitive_iterator);\n        }\n    }\n\n    /*!\n    @brief  comparison: less than or equal\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    bool operator<=(const iter_impl& other) const\n    {\n        return !other.operator < (*this);\n    }\n\n    /*!\n    @brief  comparison: greater than\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    bool operator>(const iter_impl& other) const\n    {\n        return !operator<=(other);\n    }\n\n    /*!\n    @brief  comparison: greater than or equal\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    bool operator>=(const iter_impl& other) const\n    {\n        return !operator<(other);\n    }\n\n    /*!\n    @brief  add to iterator\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    iter_impl& operator+=(difference_type i)\n    {\n        JSON_ASSERT(m_object != nullptr);\n\n        switch (m_object->m_type)\n        {\n            case value_t::object:\n                JSON_THROW(invalid_iterator::create(209, \"cannot use offsets with object iterators\"));\n\n            case value_t::array:\n            {\n                std::advance(m_it.array_iterator, i);\n                break;\n            }\n\n            default:\n            {\n                m_it.primitive_iterator += i;\n                break;\n            }\n        }\n\n        return *this;\n    }\n\n    /*!\n    @brief  subtract from iterator\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    iter_impl& operator-=(difference_type i)\n    {\n        return operator+=(-i);\n    }\n\n    /*!\n    @brief  add to iterator\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    iter_impl operator+(difference_type i) const\n    {\n        auto result = *this;\n        result += i;\n        return result;\n    }\n\n    /*!\n    @brief  addition of distance and iterator\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    friend iter_impl operator+(difference_type i, const iter_impl& it)\n    {\n        auto result = it;\n        result += i;\n        return result;\n    }\n\n    /*!\n    @brief  subtract from iterator\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    iter_impl operator-(difference_type i) const\n    {\n        auto result = *this;\n        result -= i;\n        return result;\n    }\n\n    /*!\n    @brief  return difference\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    difference_type operator-(const iter_impl& other) const\n    {\n        JSON_ASSERT(m_object != nullptr);\n\n        switch (m_object->m_type)\n        {\n            case value_t::object:\n                JSON_THROW(invalid_iterator::create(209, \"cannot use offsets with object iterators\"));\n\n            case value_t::array:\n                return m_it.array_iterator - other.m_it.array_iterator;\n\n            default:\n                return m_it.primitive_iterator - other.m_it.primitive_iterator;\n        }\n    }\n\n    /*!\n    @brief  access to successor\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    reference operator[](difference_type n) const\n    {\n        JSON_ASSERT(m_object != nullptr);\n\n        switch (m_object->m_type)\n        {\n            case value_t::object:\n                JSON_THROW(invalid_iterator::create(208, \"cannot use operator[] for object iterators\"));\n\n            case value_t::array:\n                return *std::next(m_it.array_iterator, n);\n\n            case value_t::null:\n                JSON_THROW(invalid_iterator::create(214, \"cannot get value\"));\n\n            default:\n            {\n                if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.get_value() == -n))\n                {\n                    return *m_object;\n                }\n\n                JSON_THROW(invalid_iterator::create(214, \"cannot get value\"));\n            }\n        }\n    }\n\n    /*!\n    @brief  return the key of an object iterator\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    const typename object_t::key_type& key() const\n    {\n        JSON_ASSERT(m_object != nullptr);\n\n        if (JSON_HEDLEY_LIKELY(m_object->is_object()))\n        {\n            return m_it.object_iterator->first;\n        }\n\n        JSON_THROW(invalid_iterator::create(207, \"cannot use key() for non-object iterators\"));\n    }\n\n    /*!\n    @brief  return the value of an iterator\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    reference value() const\n    {\n        return operator*();\n    }\n\n  private:\n    /// associated JSON instance\n    pointer m_object = nullptr;\n    /// the actual iterator of the associated instance\n    internal_iterator<typename std::remove_const<BasicJsonType>::type> m_it {};\n};\n} // namespace detail\n} // namespace nlohmann\n\n// #include <nlohmann/detail/iterators/iteration_proxy.hpp>\n\n// #include <nlohmann/detail/iterators/json_reverse_iterator.hpp>\n\n\n#include <cstddef> // ptrdiff_t\n#include <iterator> // reverse_iterator\n#include <utility> // declval\n\nnamespace nlohmann\n{\nnamespace detail\n{\n//////////////////////\n// reverse_iterator //\n//////////////////////\n\n/*!\n@brief a template for a reverse iterator class\n\n@tparam Base the base iterator type to reverse. Valid types are @ref\niterator (to create @ref reverse_iterator) and @ref const_iterator (to\ncreate @ref const_reverse_iterator).\n\n@requirement The class satisfies the following concept requirements:\n-\n[BidirectionalIterator](https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator):\n  The iterator that can be moved can be moved in both directions (i.e.\n  incremented and decremented).\n- [OutputIterator](https://en.cppreference.com/w/cpp/named_req/OutputIterator):\n  It is possible to write to the pointed-to element (only if @a Base is\n  @ref iterator).\n\n@since version 1.0.0\n*/\ntemplate<typename Base>\nclass json_reverse_iterator : public std::reverse_iterator<Base>\n{\n  public:\n    using difference_type = std::ptrdiff_t;\n    /// shortcut to the reverse iterator adapter\n    using base_iterator = std::reverse_iterator<Base>;\n    /// the reference type for the pointed-to element\n    using reference = typename Base::reference;\n\n    /// create reverse iterator from iterator\n    explicit json_reverse_iterator(const typename base_iterator::iterator_type& it) noexcept\n        : base_iterator(it) {}\n\n    /// create reverse iterator from base class\n    explicit json_reverse_iterator(const base_iterator& it) noexcept : base_iterator(it) {}\n\n    /// post-increment (it++)\n    json_reverse_iterator const operator++(int)\n    {\n        return static_cast<json_reverse_iterator>(base_iterator::operator++(1));\n    }\n\n    /// pre-increment (++it)\n    json_reverse_iterator& operator++()\n    {\n        return static_cast<json_reverse_iterator&>(base_iterator::operator++());\n    }\n\n    /// post-decrement (it--)\n    json_reverse_iterator const operator--(int)\n    {\n        return static_cast<json_reverse_iterator>(base_iterator::operator--(1));\n    }\n\n    /// pre-decrement (--it)\n    json_reverse_iterator& operator--()\n    {\n        return static_cast<json_reverse_iterator&>(base_iterator::operator--());\n    }\n\n    /// add to iterator\n    json_reverse_iterator& operator+=(difference_type i)\n    {\n        return static_cast<json_reverse_iterator&>(base_iterator::operator+=(i));\n    }\n\n    /// add to iterator\n    json_reverse_iterator operator+(difference_type i) const\n    {\n        return static_cast<json_reverse_iterator>(base_iterator::operator+(i));\n    }\n\n    /// subtract from iterator\n    json_reverse_iterator operator-(difference_type i) const\n    {\n        return static_cast<json_reverse_iterator>(base_iterator::operator-(i));\n    }\n\n    /// return difference\n    difference_type operator-(const json_reverse_iterator& other) const\n    {\n        return base_iterator(*this) - base_iterator(other);\n    }\n\n    /// access to successor\n    reference operator[](difference_type n) const\n    {\n        return *(this->operator+(n));\n    }\n\n    /// return the key of an object iterator\n    auto key() const -> decltype(std::declval<Base>().key())\n    {\n        auto it = --this->base();\n        return it.key();\n    }\n\n    /// return the value of an iterator\n    reference value() const\n    {\n        auto it = --this->base();\n        return it.operator * ();\n    }\n};\n}  // namespace detail\n}  // namespace nlohmann\n\n// #include <nlohmann/detail/iterators/primitive_iterator.hpp>\n\n// #include <nlohmann/detail/json_pointer.hpp>\n\n\n#include <algorithm> // all_of\n#include <cctype> // isdigit\n#include <limits> // max\n#include <numeric> // accumulate\n#include <string> // string\n#include <utility> // move\n#include <vector> // vector\n\n// #include <nlohmann/detail/exceptions.hpp>\n\n// #include <nlohmann/detail/macro_scope.hpp>\n\n// #include <nlohmann/detail/value_t.hpp>\n\n\nnamespace nlohmann\n{\ntemplate<typename BasicJsonType>\nclass json_pointer\n{\n    // allow basic_json to access private members\n    NLOHMANN_BASIC_JSON_TPL_DECLARATION\n    friend class basic_json;\n\n  public:\n    /*!\n    @brief create JSON pointer\n\n    Create a JSON pointer according to the syntax described in\n    [Section 3 of RFC6901](https://tools.ietf.org/html/rfc6901#section-3).\n\n    @param[in] s  string representing the JSON pointer; if omitted, the empty\n                  string is assumed which references the whole JSON value\n\n    @throw parse_error.107 if the given JSON pointer @a s is nonempty and does\n                           not begin with a slash (`/`); see example below\n\n    @throw parse_error.108 if a tilde (`~`) in the given JSON pointer @a s is\n    not followed by `0` (representing `~`) or `1` (representing `/`); see\n    example below\n\n    @liveexample{The example shows the construction several valid JSON pointers\n    as well as the exceptional behavior.,json_pointer}\n\n    @since version 2.0.0\n    */\n    explicit json_pointer(const std::string& s = \"\")\n        : reference_tokens(split(s))\n    {}\n\n    /*!\n    @brief return a string representation of the JSON pointer\n\n    @invariant For each JSON pointer `ptr`, it holds:\n    @code {.cpp}\n    ptr == json_pointer(ptr.to_string());\n    @endcode\n\n    @return a string representation of the JSON pointer\n\n    @liveexample{The example shows the result of `to_string`.,json_pointer__to_string}\n\n    @since version 2.0.0\n    */\n    std::string to_string() const\n    {\n        return std::accumulate(reference_tokens.begin(), reference_tokens.end(),\n                               std::string{},\n                               [](const std::string & a, const std::string & b)\n        {\n            return a + \"/\" + escape(b);\n        });\n    }\n\n    /// @copydoc to_string()\n    operator std::string() const\n    {\n        return to_string();\n    }\n\n    /*!\n    @brief append another JSON pointer at the end of this JSON pointer\n\n    @param[in] ptr  JSON pointer to append\n    @return JSON pointer with @a ptr appended\n\n    @liveexample{The example shows the usage of `operator/=`.,json_pointer__operator_add}\n\n    @complexity Linear in the length of @a ptr.\n\n    @sa @ref operator/=(std::string) to append a reference token\n    @sa @ref operator/=(std::size_t) to append an array index\n    @sa @ref operator/(const json_pointer&, const json_pointer&) for a binary operator\n\n    @since version 3.6.0\n    */\n    json_pointer& operator/=(const json_pointer& ptr)\n    {\n        reference_tokens.insert(reference_tokens.end(),\n                                ptr.reference_tokens.begin(),\n                                ptr.reference_tokens.end());\n        return *this;\n    }\n\n    /*!\n    @brief append an unescaped reference token at the end of this JSON pointer\n\n    @param[in] token  reference token to append\n    @return JSON pointer with @a token appended without escaping @a token\n\n    @liveexample{The example shows the usage of `operator/=`.,json_pointer__operator_add}\n\n    @complexity Amortized constant.\n\n    @sa @ref operator/=(const json_pointer&) to append a JSON pointer\n    @sa @ref operator/=(std::size_t) to append an array index\n    @sa @ref operator/(const json_pointer&, std::size_t) for a binary operator\n\n    @since version 3.6.0\n    */\n    json_pointer& operator/=(std::string token)\n    {\n        push_back(std::move(token));\n        return *this;\n    }\n\n    /*!\n    @brief append an array index at the end of this JSON pointer\n\n    @param[in] array_idx  array index to append\n    @return JSON pointer with @a array_idx appended\n\n    @liveexample{The example shows the usage of `operator/=`.,json_pointer__operator_add}\n\n    @complexity Amortized constant.\n\n    @sa @ref operator/=(const json_pointer&) to append a JSON pointer\n    @sa @ref operator/=(std::string) to append a reference token\n    @sa @ref operator/(const json_pointer&, std::string) for a binary operator\n\n    @since version 3.6.0\n    */\n    json_pointer& operator/=(std::size_t array_idx)\n    {\n        return *this /= std::to_string(array_idx);\n    }\n\n    /*!\n    @brief create a new JSON pointer by appending the right JSON pointer at the end of the left JSON pointer\n\n    @param[in] lhs  JSON pointer\n    @param[in] rhs  JSON pointer\n    @return a new JSON pointer with @a rhs appended to @a lhs\n\n    @liveexample{The example shows the usage of `operator/`.,json_pointer__operator_add_binary}\n\n    @complexity Linear in the length of @a lhs and @a rhs.\n\n    @sa @ref operator/=(const json_pointer&) to append a JSON pointer\n\n    @since version 3.6.0\n    */\n    friend json_pointer operator/(const json_pointer& lhs,\n                                  const json_pointer& rhs)\n    {\n        return json_pointer(lhs) /= rhs;\n    }\n\n    /*!\n    @brief create a new JSON pointer by appending the unescaped token at the end of the JSON pointer\n\n    @param[in] ptr  JSON pointer\n    @param[in] token  reference token\n    @return a new JSON pointer with unescaped @a token appended to @a ptr\n\n    @liveexample{The example shows the usage of `operator/`.,json_pointer__operator_add_binary}\n\n    @complexity Linear in the length of @a ptr.\n\n    @sa @ref operator/=(std::string) to append a reference token\n\n    @since version 3.6.0\n    */\n    friend json_pointer operator/(const json_pointer& ptr, std::string token)\n    {\n        return json_pointer(ptr) /= std::move(token);\n    }\n\n    /*!\n    @brief create a new JSON pointer by appending the array-index-token at the end of the JSON pointer\n\n    @param[in] ptr  JSON pointer\n    @param[in] array_idx  array index\n    @return a new JSON pointer with @a array_idx appended to @a ptr\n\n    @liveexample{The example shows the usage of `operator/`.,json_pointer__operator_add_binary}\n\n    @complexity Linear in the length of @a ptr.\n\n    @sa @ref operator/=(std::size_t) to append an array index\n\n    @since version 3.6.0\n    */\n    friend json_pointer operator/(const json_pointer& ptr, std::size_t array_idx)\n    {\n        return json_pointer(ptr) /= array_idx;\n    }\n\n    /*!\n    @brief returns the parent of this JSON pointer\n\n    @return parent of this JSON pointer; in case this JSON pointer is the root,\n            the root itself is returned\n\n    @complexity Linear in the length of the JSON pointer.\n\n    @liveexample{The example shows the result of `parent_pointer` for different\n    JSON Pointers.,json_pointer__parent_pointer}\n\n    @since version 3.6.0\n    */\n    json_pointer parent_pointer() const\n    {\n        if (empty())\n        {\n            return *this;\n        }\n\n        json_pointer res = *this;\n        res.pop_back();\n        return res;\n    }\n\n    /*!\n    @brief remove last reference token\n\n    @pre not `empty()`\n\n    @liveexample{The example shows the usage of `pop_back`.,json_pointer__pop_back}\n\n    @complexity Constant.\n\n    @throw out_of_range.405 if JSON pointer has no parent\n\n    @since version 3.6.0\n    */\n    void pop_back()\n    {\n        if (JSON_HEDLEY_UNLIKELY(empty()))\n        {\n            JSON_THROW(detail::out_of_range::create(405, \"JSON pointer has no parent\"));\n        }\n\n        reference_tokens.pop_back();\n    }\n\n    /*!\n    @brief return last reference token\n\n    @pre not `empty()`\n    @return last reference token\n\n    @liveexample{The example shows the usage of `back`.,json_pointer__back}\n\n    @complexity Constant.\n\n    @throw out_of_range.405 if JSON pointer has no parent\n\n    @since version 3.6.0\n    */\n    const std::string& back() const\n    {\n        if (JSON_HEDLEY_UNLIKELY(empty()))\n        {\n            JSON_THROW(detail::out_of_range::create(405, \"JSON pointer has no parent\"));\n        }\n\n        return reference_tokens.back();\n    }\n\n    /*!\n    @brief append an unescaped token at the end of the reference pointer\n\n    @param[in] token  token to add\n\n    @complexity Amortized constant.\n\n    @liveexample{The example shows the result of `push_back` for different\n    JSON Pointers.,json_pointer__push_back}\n\n    @since version 3.6.0\n    */\n    void push_back(const std::string& token)\n    {\n        reference_tokens.push_back(token);\n    }\n\n    /// @copydoc push_back(const std::string&)\n    void push_back(std::string&& token)\n    {\n        reference_tokens.push_back(std::move(token));\n    }\n\n    /*!\n    @brief return whether pointer points to the root document\n\n    @return true iff the JSON pointer points to the root document\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this function never throws exceptions.\n\n    @liveexample{The example shows the result of `empty` for different JSON\n    Pointers.,json_pointer__empty}\n\n    @since version 3.6.0\n    */\n    bool empty() const noexcept\n    {\n        return reference_tokens.empty();\n    }\n\n  private:\n    /*!\n    @param[in] s  reference token to be converted into an array index\n\n    @return integer representation of @a s\n\n    @throw parse_error.106  if an array index begins with '0'\n    @throw parse_error.109  if an array index begins not with a digit\n    @throw out_of_range.404 if string @a s could not be converted to an integer\n    @throw out_of_range.410 if an array index exceeds size_type\n    */\n    static typename BasicJsonType::size_type array_index(const std::string& s)\n    {\n        using size_type = typename BasicJsonType::size_type;\n\n        // error condition (cf. RFC 6901, Sect. 4)\n        if (JSON_HEDLEY_UNLIKELY(s.size() > 1 && s[0] == '0'))\n        {\n            JSON_THROW(detail::parse_error::create(106, 0,\n                                                   \"array index '\" + s +\n                                                   \"' must not begin with '0'\"));\n        }\n\n        // error condition (cf. RFC 6901, Sect. 4)\n        if (JSON_HEDLEY_UNLIKELY(s.size() > 1 && !(s[0] >= '1' && s[0] <= '9')))\n        {\n            JSON_THROW(detail::parse_error::create(109, 0, \"array index '\" + s + \"' is not a number\"));\n        }\n\n        std::size_t processed_chars = 0;\n        unsigned long long res = 0;\n        JSON_TRY\n        {\n            res = std::stoull(s, &processed_chars);\n        }\n        JSON_CATCH(std::out_of_range&)\n        {\n            JSON_THROW(detail::out_of_range::create(404, \"unresolved reference token '\" + s + \"'\"));\n        }\n\n        // check if the string was completely read\n        if (JSON_HEDLEY_UNLIKELY(processed_chars != s.size()))\n        {\n            JSON_THROW(detail::out_of_range::create(404, \"unresolved reference token '\" + s + \"'\"));\n        }\n\n        // only triggered on special platforms (like 32bit), see also\n        // https://github.com/nlohmann/json/pull/2203\n        if (res >= static_cast<unsigned long long>((std::numeric_limits<size_type>::max)()))\n        {\n            JSON_THROW(detail::out_of_range::create(410, \"array index \" + s + \" exceeds size_type\")); // LCOV_EXCL_LINE\n        }\n\n        return static_cast<size_type>(res);\n    }\n\n    json_pointer top() const\n    {\n        if (JSON_HEDLEY_UNLIKELY(empty()))\n        {\n            JSON_THROW(detail::out_of_range::create(405, \"JSON pointer has no parent\"));\n        }\n\n        json_pointer result = *this;\n        result.reference_tokens = {reference_tokens[0]};\n        return result;\n    }\n\n    /*!\n    @brief create and return a reference to the pointed to value\n\n    @complexity Linear in the number of reference tokens.\n\n    @throw parse_error.109 if array index is not a number\n    @throw type_error.313 if value cannot be unflattened\n    */\n    BasicJsonType& get_and_create(BasicJsonType& j) const\n    {\n        auto result = &j;\n\n        // in case no reference tokens exist, return a reference to the JSON value\n        // j which will be overwritten by a primitive value\n        for (const auto& reference_token : reference_tokens)\n        {\n            switch (result->type())\n            {\n                case detail::value_t::null:\n                {\n                    if (reference_token == \"0\")\n                    {\n                        // start a new array if reference token is 0\n                        result = &result->operator[](0);\n                    }\n                    else\n                    {\n                        // start a new object otherwise\n                        result = &result->operator[](reference_token);\n                    }\n                    break;\n                }\n\n                case detail::value_t::object:\n                {\n                    // create an entry in the object\n                    result = &result->operator[](reference_token);\n                    break;\n                }\n\n                case detail::value_t::array:\n                {\n                    // create an entry in the array\n                    result = &result->operator[](array_index(reference_token));\n                    break;\n                }\n\n                /*\n                The following code is only reached if there exists a reference\n                token _and_ the current value is primitive. In this case, we have\n                an error situation, because primitive values may only occur as\n                single value; that is, with an empty list of reference tokens.\n                */\n                default:\n                    JSON_THROW(detail::type_error::create(313, \"invalid value to unflatten\"));\n            }\n        }\n\n        return *result;\n    }\n\n    /*!\n    @brief return a reference to the pointed to value\n\n    @note This version does not throw if a value is not present, but tries to\n          create nested values instead. For instance, calling this function\n          with pointer `\"/this/that\"` on a null value is equivalent to calling\n          `operator[](\"this\").operator[](\"that\")` on that value, effectively\n          changing the null value to an object.\n\n    @param[in] ptr  a JSON value\n\n    @return reference to the JSON value pointed to by the JSON pointer\n\n    @complexity Linear in the length of the JSON pointer.\n\n    @throw parse_error.106   if an array index begins with '0'\n    @throw parse_error.109   if an array index was not a number\n    @throw out_of_range.404  if the JSON pointer can not be resolved\n    */\n    BasicJsonType& get_unchecked(BasicJsonType* ptr) const\n    {\n        for (const auto& reference_token : reference_tokens)\n        {\n            // convert null values to arrays or objects before continuing\n            if (ptr->is_null())\n            {\n                // check if reference token is a number\n                const bool nums =\n                    std::all_of(reference_token.begin(), reference_token.end(),\n                                [](const unsigned char x)\n                {\n                    return std::isdigit(x);\n                });\n\n                // change value to array for numbers or \"-\" or to object otherwise\n                *ptr = (nums || reference_token == \"-\")\n                       ? detail::value_t::array\n                       : detail::value_t::object;\n            }\n\n            switch (ptr->type())\n            {\n                case detail::value_t::object:\n                {\n                    // use unchecked object access\n                    ptr = &ptr->operator[](reference_token);\n                    break;\n                }\n\n                case detail::value_t::array:\n                {\n                    if (reference_token == \"-\")\n                    {\n                        // explicitly treat \"-\" as index beyond the end\n                        ptr = &ptr->operator[](ptr->m_value.array->size());\n                    }\n                    else\n                    {\n                        // convert array index to number; unchecked access\n                        ptr = &ptr->operator[](array_index(reference_token));\n                    }\n                    break;\n                }\n\n                default:\n                    JSON_THROW(detail::out_of_range::create(404, \"unresolved reference token '\" + reference_token + \"'\"));\n            }\n        }\n\n        return *ptr;\n    }\n\n    /*!\n    @throw parse_error.106   if an array index begins with '0'\n    @throw parse_error.109   if an array index was not a number\n    @throw out_of_range.402  if the array index '-' is used\n    @throw out_of_range.404  if the JSON pointer can not be resolved\n    */\n    BasicJsonType& get_checked(BasicJsonType* ptr) const\n    {\n        for (const auto& reference_token : reference_tokens)\n        {\n            switch (ptr->type())\n            {\n                case detail::value_t::object:\n                {\n                    // note: at performs range check\n                    ptr = &ptr->at(reference_token);\n                    break;\n                }\n\n                case detail::value_t::array:\n                {\n                    if (JSON_HEDLEY_UNLIKELY(reference_token == \"-\"))\n                    {\n                        // \"-\" always fails the range check\n                        JSON_THROW(detail::out_of_range::create(402,\n                                                                \"array index '-' (\" + std::to_string(ptr->m_value.array->size()) +\n                                                                \") is out of range\"));\n                    }\n\n                    // note: at performs range check\n                    ptr = &ptr->at(array_index(reference_token));\n                    break;\n                }\n\n                default:\n                    JSON_THROW(detail::out_of_range::create(404, \"unresolved reference token '\" + reference_token + \"'\"));\n            }\n        }\n\n        return *ptr;\n    }\n\n    /*!\n    @brief return a const reference to the pointed to value\n\n    @param[in] ptr  a JSON value\n\n    @return const reference to the JSON value pointed to by the JSON\n    pointer\n\n    @throw parse_error.106   if an array index begins with '0'\n    @throw parse_error.109   if an array index was not a number\n    @throw out_of_range.402  if the array index '-' is used\n    @throw out_of_range.404  if the JSON pointer can not be resolved\n    */\n    const BasicJsonType& get_unchecked(const BasicJsonType* ptr) const\n    {\n        for (const auto& reference_token : reference_tokens)\n        {\n            switch (ptr->type())\n            {\n                case detail::value_t::object:\n                {\n                    // use unchecked object access\n                    ptr = &ptr->operator[](reference_token);\n                    break;\n                }\n\n                case detail::value_t::array:\n                {\n                    if (JSON_HEDLEY_UNLIKELY(reference_token == \"-\"))\n                    {\n                        // \"-\" cannot be used for const access\n                        JSON_THROW(detail::out_of_range::create(402,\n                                                                \"array index '-' (\" + std::to_string(ptr->m_value.array->size()) +\n                                                                \") is out of range\"));\n                    }\n\n                    // use unchecked array access\n                    ptr = &ptr->operator[](array_index(reference_token));\n                    break;\n                }\n\n                default:\n                    JSON_THROW(detail::out_of_range::create(404, \"unresolved reference token '\" + reference_token + \"'\"));\n            }\n        }\n\n        return *ptr;\n    }\n\n    /*!\n    @throw parse_error.106   if an array index begins with '0'\n    @throw parse_error.109   if an array index was not a number\n    @throw out_of_range.402  if the array index '-' is used\n    @throw out_of_range.404  if the JSON pointer can not be resolved\n    */\n    const BasicJsonType& get_checked(const BasicJsonType* ptr) const\n    {\n        for (const auto& reference_token : reference_tokens)\n        {\n            switch (ptr->type())\n            {\n                case detail::value_t::object:\n                {\n                    // note: at performs range check\n                    ptr = &ptr->at(reference_token);\n                    break;\n                }\n\n                case detail::value_t::array:\n                {\n                    if (JSON_HEDLEY_UNLIKELY(reference_token == \"-\"))\n                    {\n                        // \"-\" always fails the range check\n                        JSON_THROW(detail::out_of_range::create(402,\n                                                                \"array index '-' (\" + std::to_string(ptr->m_value.array->size()) +\n                                                                \") is out of range\"));\n                    }\n\n                    // note: at performs range check\n                    ptr = &ptr->at(array_index(reference_token));\n                    break;\n                }\n\n                default:\n                    JSON_THROW(detail::out_of_range::create(404, \"unresolved reference token '\" + reference_token + \"'\"));\n            }\n        }\n\n        return *ptr;\n    }\n\n    /*!\n    @throw parse_error.106   if an array index begins with '0'\n    @throw parse_error.109   if an array index was not a number\n    */\n    bool contains(const BasicJsonType* ptr) const\n    {\n        for (const auto& reference_token : reference_tokens)\n        {\n            switch (ptr->type())\n            {\n                case detail::value_t::object:\n                {\n                    if (!ptr->contains(reference_token))\n                    {\n                        // we did not find the key in the object\n                        return false;\n                    }\n\n                    ptr = &ptr->operator[](reference_token);\n                    break;\n                }\n\n                case detail::value_t::array:\n                {\n                    if (JSON_HEDLEY_UNLIKELY(reference_token == \"-\"))\n                    {\n                        // \"-\" always fails the range check\n                        return false;\n                    }\n                    if (JSON_HEDLEY_UNLIKELY(reference_token.size() == 1 && !(\"0\" <= reference_token && reference_token <= \"9\")))\n                    {\n                        // invalid char\n                        return false;\n                    }\n                    if (JSON_HEDLEY_UNLIKELY(reference_token.size() > 1))\n                    {\n                        if (JSON_HEDLEY_UNLIKELY(!('1' <= reference_token[0] && reference_token[0] <= '9')))\n                        {\n                            // first char should be between '1' and '9'\n                            return false;\n                        }\n                        for (std::size_t i = 1; i < reference_token.size(); i++)\n                        {\n                            if (JSON_HEDLEY_UNLIKELY(!('0' <= reference_token[i] && reference_token[i] <= '9')))\n                            {\n                                // other char should be between '0' and '9'\n                                return false;\n                            }\n                        }\n                    }\n\n                    const auto idx = array_index(reference_token);\n                    if (idx >= ptr->size())\n                    {\n                        // index out of range\n                        return false;\n                    }\n\n                    ptr = &ptr->operator[](idx);\n                    break;\n                }\n\n                default:\n                {\n                    // we do not expect primitive values if there is still a\n                    // reference token to process\n                    return false;\n                }\n            }\n        }\n\n        // no reference token left means we found a primitive value\n        return true;\n    }\n\n    /*!\n    @brief split the string input to reference tokens\n\n    @note This function is only called by the json_pointer constructor.\n          All exceptions below are documented there.\n\n    @throw parse_error.107  if the pointer is not empty or begins with '/'\n    @throw parse_error.108  if character '~' is not followed by '0' or '1'\n    */\n    static std::vector<std::string> split(const std::string& reference_string)\n    {\n        std::vector<std::string> result;\n\n        // special case: empty reference string -> no reference tokens\n        if (reference_string.empty())\n        {\n            return result;\n        }\n\n        // check if nonempty reference string begins with slash\n        if (JSON_HEDLEY_UNLIKELY(reference_string[0] != '/'))\n        {\n            JSON_THROW(detail::parse_error::create(107, 1,\n                                                   \"JSON pointer must be empty or begin with '/' - was: '\" +\n                                                   reference_string + \"'\"));\n        }\n\n        // extract the reference tokens:\n        // - slash: position of the last read slash (or end of string)\n        // - start: position after the previous slash\n        for (\n            // search for the first slash after the first character\n            std::size_t slash = reference_string.find_first_of('/', 1),\n            // set the beginning of the first reference token\n            start = 1;\n            // we can stop if start == 0 (if slash == std::string::npos)\n            start != 0;\n            // set the beginning of the next reference token\n            // (will eventually be 0 if slash == std::string::npos)\n            start = (slash == std::string::npos) ? 0 : slash + 1,\n            // find next slash\n            slash = reference_string.find_first_of('/', start))\n        {\n            // use the text between the beginning of the reference token\n            // (start) and the last slash (slash).\n            auto reference_token = reference_string.substr(start, slash - start);\n\n            // check reference tokens are properly escaped\n            for (std::size_t pos = reference_token.find_first_of('~');\n                    pos != std::string::npos;\n                    pos = reference_token.find_first_of('~', pos + 1))\n            {\n                JSON_ASSERT(reference_token[pos] == '~');\n\n                // ~ must be followed by 0 or 1\n                if (JSON_HEDLEY_UNLIKELY(pos == reference_token.size() - 1 ||\n                                         (reference_token[pos + 1] != '0' &&\n                                          reference_token[pos + 1] != '1')))\n                {\n                    JSON_THROW(detail::parse_error::create(108, 0, \"escape character '~' must be followed with '0' or '1'\"));\n                }\n            }\n\n            // finally, store the reference token\n            unescape(reference_token);\n            result.push_back(reference_token);\n        }\n\n        return result;\n    }\n\n    /*!\n    @brief replace all occurrences of a substring by another string\n\n    @param[in,out] s  the string to manipulate; changed so that all\n                   occurrences of @a f are replaced with @a t\n    @param[in]     f  the substring to replace with @a t\n    @param[in]     t  the string to replace @a f\n\n    @pre The search string @a f must not be empty. **This precondition is\n    enforced with an assertion.**\n\n    @since version 2.0.0\n    */\n    static void replace_substring(std::string& s, const std::string& f,\n                                  const std::string& t)\n    {\n        JSON_ASSERT(!f.empty());\n        for (auto pos = s.find(f);                // find first occurrence of f\n                pos != std::string::npos;         // make sure f was found\n                s.replace(pos, f.size(), t),      // replace with t, and\n                pos = s.find(f, pos + t.size()))  // find next occurrence of f\n        {}\n    }\n\n    /// escape \"~\" to \"~0\" and \"/\" to \"~1\"\n    static std::string escape(std::string s)\n    {\n        replace_substring(s, \"~\", \"~0\");\n        replace_substring(s, \"/\", \"~1\");\n        return s;\n    }\n\n    /// unescape \"~1\" to tilde and \"~0\" to slash (order is important!)\n    static void unescape(std::string& s)\n    {\n        replace_substring(s, \"~1\", \"/\");\n        replace_substring(s, \"~0\", \"~\");\n    }\n\n    /*!\n    @param[in] reference_string  the reference string to the current value\n    @param[in] value             the value to consider\n    @param[in,out] result        the result object to insert values to\n\n    @note Empty objects or arrays are flattened to `null`.\n    */\n    static void flatten(const std::string& reference_string,\n                        const BasicJsonType& value,\n                        BasicJsonType& result)\n    {\n        switch (value.type())\n        {\n            case detail::value_t::array:\n            {\n                if (value.m_value.array->empty())\n                {\n                    // flatten empty array as null\n                    result[reference_string] = nullptr;\n                }\n                else\n                {\n                    // iterate array and use index as reference string\n                    for (std::size_t i = 0; i < value.m_value.array->size(); ++i)\n                    {\n                        flatten(reference_string + \"/\" + std::to_string(i),\n                                value.m_value.array->operator[](i), result);\n                    }\n                }\n                break;\n            }\n\n            case detail::value_t::object:\n            {\n                if (value.m_value.object->empty())\n                {\n                    // flatten empty object as null\n                    result[reference_string] = nullptr;\n                }\n                else\n                {\n                    // iterate object and use keys as reference string\n                    for (const auto& element : *value.m_value.object)\n                    {\n                        flatten(reference_string + \"/\" + escape(element.first), element.second, result);\n                    }\n                }\n                break;\n            }\n\n            default:\n            {\n                // add primitive value with its reference string\n                result[reference_string] = value;\n                break;\n            }\n        }\n    }\n\n    /*!\n    @param[in] value  flattened JSON\n\n    @return unflattened JSON\n\n    @throw parse_error.109 if array index is not a number\n    @throw type_error.314  if value is not an object\n    @throw type_error.315  if object values are not primitive\n    @throw type_error.313  if value cannot be unflattened\n    */\n    static BasicJsonType\n    unflatten(const BasicJsonType& value)\n    {\n        if (JSON_HEDLEY_UNLIKELY(!value.is_object()))\n        {\n            JSON_THROW(detail::type_error::create(314, \"only objects can be unflattened\"));\n        }\n\n        BasicJsonType result;\n\n        // iterate the JSON object values\n        for (const auto& element : *value.m_value.object)\n        {\n            if (JSON_HEDLEY_UNLIKELY(!element.second.is_primitive()))\n            {\n                JSON_THROW(detail::type_error::create(315, \"values in object must be primitive\"));\n            }\n\n            // assign value to reference pointed to by JSON pointer; Note that if\n            // the JSON pointer is \"\" (i.e., points to the whole value), function\n            // get_and_create returns a reference to result itself. An assignment\n            // will then create a primitive value.\n            json_pointer(element.first).get_and_create(result) = element.second;\n        }\n\n        return result;\n    }\n\n    /*!\n    @brief compares two JSON pointers for equality\n\n    @param[in] lhs  JSON pointer to compare\n    @param[in] rhs  JSON pointer to compare\n    @return whether @a lhs is equal to @a rhs\n\n    @complexity Linear in the length of the JSON pointer\n\n    @exceptionsafety No-throw guarantee: this function never throws exceptions.\n    */\n    friend bool operator==(json_pointer const& lhs,\n                           json_pointer const& rhs) noexcept\n    {\n        return lhs.reference_tokens == rhs.reference_tokens;\n    }\n\n    /*!\n    @brief compares two JSON pointers for inequality\n\n    @param[in] lhs  JSON pointer to compare\n    @param[in] rhs  JSON pointer to compare\n    @return whether @a lhs is not equal @a rhs\n\n    @complexity Linear in the length of the JSON pointer\n\n    @exceptionsafety No-throw guarantee: this function never throws exceptions.\n    */\n    friend bool operator!=(json_pointer const& lhs,\n                           json_pointer const& rhs) noexcept\n    {\n        return !(lhs == rhs);\n    }\n\n    /// the reference tokens\n    std::vector<std::string> reference_tokens;\n};\n}  // namespace nlohmann\n\n// #include <nlohmann/detail/json_ref.hpp>\n\n\n#include <initializer_list>\n#include <utility>\n\n// #include <nlohmann/detail/meta/type_traits.hpp>\n\n\nnamespace nlohmann\n{\nnamespace detail\n{\ntemplate<typename BasicJsonType>\nclass json_ref\n{\n  public:\n    using value_type = BasicJsonType;\n\n    json_ref(value_type&& value)\n        : owned_value(std::move(value))\n        , value_ref(&owned_value)\n        , is_rvalue(true)\n    {}\n\n    json_ref(const value_type& value)\n        : value_ref(const_cast<value_type*>(&value))\n        , is_rvalue(false)\n    {}\n\n    json_ref(std::initializer_list<json_ref> init)\n        : owned_value(init)\n        , value_ref(&owned_value)\n        , is_rvalue(true)\n    {}\n\n    template <\n        class... Args,\n        enable_if_t<std::is_constructible<value_type, Args...>::value, int> = 0 >\n    json_ref(Args && ... args)\n        : owned_value(std::forward<Args>(args)...)\n        , value_ref(&owned_value)\n        , is_rvalue(true)\n    {}\n\n    // class should be movable only\n    json_ref(json_ref&&) = default;\n    json_ref(const json_ref&) = delete;\n    json_ref& operator=(const json_ref&) = delete;\n    json_ref& operator=(json_ref&&) = delete;\n    ~json_ref() = default;\n\n    value_type moved_or_copied() const\n    {\n        if (is_rvalue)\n        {\n            return std::move(*value_ref);\n        }\n        return *value_ref;\n    }\n\n    value_type const& operator*() const\n    {\n        return *static_cast<value_type const*>(value_ref);\n    }\n\n    value_type const* operator->() const\n    {\n        return static_cast<value_type const*>(value_ref);\n    }\n\n  private:\n    mutable value_type owned_value = nullptr;\n    value_type* value_ref = nullptr;\n    const bool is_rvalue = true;\n};\n}  // namespace detail\n}  // namespace nlohmann\n\n// #include <nlohmann/detail/macro_scope.hpp>\n\n// #include <nlohmann/detail/meta/cpp_future.hpp>\n\n// #include <nlohmann/detail/meta/type_traits.hpp>\n\n// #include <nlohmann/detail/output/binary_writer.hpp>\n\n\n#include <algorithm> // reverse\n#include <array> // array\n#include <cstdint> // uint8_t, uint16_t, uint32_t, uint64_t\n#include <cstring> // memcpy\n#include <limits> // numeric_limits\n#include <string> // string\n#include <cmath> // isnan, isinf\n\n// #include <nlohmann/detail/input/binary_reader.hpp>\n\n// #include <nlohmann/detail/macro_scope.hpp>\n\n// #include <nlohmann/detail/output/output_adapters.hpp>\n\n\n#include <algorithm> // copy\n#include <cstddef> // size_t\n#include <ios> // streamsize\n#include <iterator> // back_inserter\n#include <memory> // shared_ptr, make_shared\n#include <ostream> // basic_ostream\n#include <string> // basic_string\n#include <vector> // vector\n// #include <nlohmann/detail/macro_scope.hpp>\n\n\nnamespace nlohmann\n{\nnamespace detail\n{\n/// abstract output adapter interface\ntemplate<typename CharType> struct output_adapter_protocol\n{\n    virtual void write_character(CharType c) = 0;\n    virtual void write_characters(const CharType* s, std::size_t length) = 0;\n    virtual ~output_adapter_protocol() = default;\n};\n\n/// a type to simplify interfaces\ntemplate<typename CharType>\nusing output_adapter_t = std::shared_ptr<output_adapter_protocol<CharType>>;\n\n/// output adapter for byte vectors\ntemplate<typename CharType>\nclass output_vector_adapter : public output_adapter_protocol<CharType>\n{\n  public:\n    explicit output_vector_adapter(std::vector<CharType>& vec) noexcept\n        : v(vec)\n    {}\n\n    void write_character(CharType c) override\n    {\n        v.push_back(c);\n    }\n\n    JSON_HEDLEY_NON_NULL(2)\n    void write_characters(const CharType* s, std::size_t length) override\n    {\n        std::copy(s, s + length, std::back_inserter(v));\n    }\n\n  private:\n    std::vector<CharType>& v;\n};\n\n/// output adapter for output streams\ntemplate<typename CharType>\nclass output_stream_adapter : public output_adapter_protocol<CharType>\n{\n  public:\n    explicit output_stream_adapter(std::basic_ostream<CharType>& s) noexcept\n        : stream(s)\n    {}\n\n    void write_character(CharType c) override\n    {\n        stream.put(c);\n    }\n\n    JSON_HEDLEY_NON_NULL(2)\n    void write_characters(const CharType* s, std::size_t length) override\n    {\n        stream.write(s, static_cast<std::streamsize>(length));\n    }\n\n  private:\n    std::basic_ostream<CharType>& stream;\n};\n\n/// output adapter for basic_string\ntemplate<typename CharType, typename StringType = std::basic_string<CharType>>\nclass output_string_adapter : public output_adapter_protocol<CharType>\n{\n  public:\n    explicit output_string_adapter(StringType& s) noexcept\n        : str(s)\n    {}\n\n    void write_character(CharType c) override\n    {\n        str.push_back(c);\n    }\n\n    JSON_HEDLEY_NON_NULL(2)\n    void write_characters(const CharType* s, std::size_t length) override\n    {\n        str.append(s, length);\n    }\n\n  private:\n    StringType& str;\n};\n\ntemplate<typename CharType, typename StringType = std::basic_string<CharType>>\nclass output_adapter\n{\n  public:\n    output_adapter(std::vector<CharType>& vec)\n        : oa(std::make_shared<output_vector_adapter<CharType>>(vec)) {}\n\n    output_adapter(std::basic_ostream<CharType>& s)\n        : oa(std::make_shared<output_stream_adapter<CharType>>(s)) {}\n\n    output_adapter(StringType& s)\n        : oa(std::make_shared<output_string_adapter<CharType, StringType>>(s)) {}\n\n    operator output_adapter_t<CharType>()\n    {\n        return oa;\n    }\n\n  private:\n    output_adapter_t<CharType> oa = nullptr;\n};\n}  // namespace detail\n}  // namespace nlohmann\n\n\nnamespace nlohmann\n{\nnamespace detail\n{\n///////////////////\n// binary writer //\n///////////////////\n\n/*!\n@brief serialization to CBOR and MessagePack values\n*/\ntemplate<typename BasicJsonType, typename CharType>\nclass binary_writer\n{\n    using string_t = typename BasicJsonType::string_t;\n    using binary_t = typename BasicJsonType::binary_t;\n    using number_float_t = typename BasicJsonType::number_float_t;\n\n  public:\n    /*!\n    @brief create a binary writer\n\n    @param[in] adapter  output adapter to write to\n    */\n    explicit binary_writer(output_adapter_t<CharType> adapter) : oa(adapter)\n    {\n        JSON_ASSERT(oa);\n    }\n\n    /*!\n    @param[in] j  JSON value to serialize\n    @pre       j.type() == value_t::object\n    */\n    void write_bson(const BasicJsonType& j)\n    {\n        switch (j.type())\n        {\n            case value_t::object:\n            {\n                write_bson_object(*j.m_value.object);\n                break;\n            }\n\n            default:\n            {\n                JSON_THROW(type_error::create(317, \"to serialize to BSON, top-level type must be object, but is \" + std::string(j.type_name())));\n            }\n        }\n    }\n\n    /*!\n    @param[in] j  JSON value to serialize\n    */\n    void write_cbor(const BasicJsonType& j)\n    {\n        switch (j.type())\n        {\n            case value_t::null:\n            {\n                oa->write_character(to_char_type(0xF6));\n                break;\n            }\n\n            case value_t::boolean:\n            {\n                oa->write_character(j.m_value.boolean\n                                    ? to_char_type(0xF5)\n                                    : to_char_type(0xF4));\n                break;\n            }\n\n            case value_t::number_integer:\n            {\n                if (j.m_value.number_integer >= 0)\n                {\n                    // CBOR does not differentiate between positive signed\n                    // integers and unsigned integers. Therefore, we used the\n                    // code from the value_t::number_unsigned case here.\n                    if (j.m_value.number_integer <= 0x17)\n                    {\n                        write_number(static_cast<std::uint8_t>(j.m_value.number_integer));\n                    }\n                    else if (j.m_value.number_integer <= (std::numeric_limits<std::uint8_t>::max)())\n                    {\n                        oa->write_character(to_char_type(0x18));\n                        write_number(static_cast<std::uint8_t>(j.m_value.number_integer));\n                    }\n                    else if (j.m_value.number_integer <= (std::numeric_limits<std::uint16_t>::max)())\n                    {\n                        oa->write_character(to_char_type(0x19));\n                        write_number(static_cast<std::uint16_t>(j.m_value.number_integer));\n                    }\n                    else if (j.m_value.number_integer <= (std::numeric_limits<std::uint32_t>::max)())\n                    {\n                        oa->write_character(to_char_type(0x1A));\n                        write_number(static_cast<std::uint32_t>(j.m_value.number_integer));\n                    }\n                    else\n                    {\n                        oa->write_character(to_char_type(0x1B));\n                        write_number(static_cast<std::uint64_t>(j.m_value.number_integer));\n                    }\n                }\n                else\n                {\n                    // The conversions below encode the sign in the first\n                    // byte, and the value is converted to a positive number.\n                    const auto positive_number = -1 - j.m_value.number_integer;\n                    if (j.m_value.number_integer >= -24)\n                    {\n                        write_number(static_cast<std::uint8_t>(0x20 + positive_number));\n                    }\n                    else if (positive_number <= (std::numeric_limits<std::uint8_t>::max)())\n                    {\n                        oa->write_character(to_char_type(0x38));\n                        write_number(static_cast<std::uint8_t>(positive_number));\n                    }\n                    else if (positive_number <= (std::numeric_limits<std::uint16_t>::max)())\n                    {\n                        oa->write_character(to_char_type(0x39));\n                        write_number(static_cast<std::uint16_t>(positive_number));\n                    }\n                    else if (positive_number <= (std::numeric_limits<std::uint32_t>::max)())\n                    {\n                        oa->write_character(to_char_type(0x3A));\n                        write_number(static_cast<std::uint32_t>(positive_number));\n                    }\n                    else\n                    {\n                        oa->write_character(to_char_type(0x3B));\n                        write_number(static_cast<std::uint64_t>(positive_number));\n                    }\n                }\n                break;\n            }\n\n            case value_t::number_unsigned:\n            {\n                if (j.m_value.number_unsigned <= 0x17)\n                {\n                    write_number(static_cast<std::uint8_t>(j.m_value.number_unsigned));\n                }\n                else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint8_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x18));\n                    write_number(static_cast<std::uint8_t>(j.m_value.number_unsigned));\n                }\n                else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint16_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x19));\n                    write_number(static_cast<std::uint16_t>(j.m_value.number_unsigned));\n                }\n                else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint32_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x1A));\n                    write_number(static_cast<std::uint32_t>(j.m_value.number_unsigned));\n                }\n                else\n                {\n                    oa->write_character(to_char_type(0x1B));\n                    write_number(static_cast<std::uint64_t>(j.m_value.number_unsigned));\n                }\n                break;\n            }\n\n            case value_t::number_float:\n            {\n                if (std::isnan(j.m_value.number_float))\n                {\n                    // NaN is 0xf97e00 in CBOR\n                    oa->write_character(to_char_type(0xF9));\n                    oa->write_character(to_char_type(0x7E));\n                    oa->write_character(to_char_type(0x00));\n                }\n                else if (std::isinf(j.m_value.number_float))\n                {\n                    // Infinity is 0xf97c00, -Infinity is 0xf9fc00\n                    oa->write_character(to_char_type(0xf9));\n                    oa->write_character(j.m_value.number_float > 0 ? to_char_type(0x7C) : to_char_type(0xFC));\n                    oa->write_character(to_char_type(0x00));\n                }\n                else\n                {\n                    write_compact_float(j.m_value.number_float, detail::input_format_t::cbor);\n                }\n                break;\n            }\n\n            case value_t::string:\n            {\n                // step 1: write control byte and the string length\n                const auto N = j.m_value.string->size();\n                if (N <= 0x17)\n                {\n                    write_number(static_cast<std::uint8_t>(0x60 + N));\n                }\n                else if (N <= (std::numeric_limits<std::uint8_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x78));\n                    write_number(static_cast<std::uint8_t>(N));\n                }\n                else if (N <= (std::numeric_limits<std::uint16_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x79));\n                    write_number(static_cast<std::uint16_t>(N));\n                }\n                else if (N <= (std::numeric_limits<std::uint32_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x7A));\n                    write_number(static_cast<std::uint32_t>(N));\n                }\n                // LCOV_EXCL_START\n                else if (N <= (std::numeric_limits<std::uint64_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x7B));\n                    write_number(static_cast<std::uint64_t>(N));\n                }\n                // LCOV_EXCL_STOP\n\n                // step 2: write the string\n                oa->write_characters(\n                    reinterpret_cast<const CharType*>(j.m_value.string->c_str()),\n                    j.m_value.string->size());\n                break;\n            }\n\n            case value_t::array:\n            {\n                // step 1: write control byte and the array size\n                const auto N = j.m_value.array->size();\n                if (N <= 0x17)\n                {\n                    write_number(static_cast<std::uint8_t>(0x80 + N));\n                }\n                else if (N <= (std::numeric_limits<std::uint8_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x98));\n                    write_number(static_cast<std::uint8_t>(N));\n                }\n                else if (N <= (std::numeric_limits<std::uint16_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x99));\n                    write_number(static_cast<std::uint16_t>(N));\n                }\n                else if (N <= (std::numeric_limits<std::uint32_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x9A));\n                    write_number(static_cast<std::uint32_t>(N));\n                }\n                // LCOV_EXCL_START\n                else if (N <= (std::numeric_limits<std::uint64_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x9B));\n                    write_number(static_cast<std::uint64_t>(N));\n                }\n                // LCOV_EXCL_STOP\n\n                // step 2: write each element\n                for (const auto& el : *j.m_value.array)\n                {\n                    write_cbor(el);\n                }\n                break;\n            }\n\n            case value_t::binary:\n            {\n                if (j.m_value.binary->has_subtype())\n                {\n                    write_number(static_cast<std::uint8_t>(0xd8));\n                    write_number(j.m_value.binary->subtype());\n                }\n\n                // step 1: write control byte and the binary array size\n                const auto N = j.m_value.binary->size();\n                if (N <= 0x17)\n                {\n                    write_number(static_cast<std::uint8_t>(0x40 + N));\n                }\n                else if (N <= (std::numeric_limits<std::uint8_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x58));\n                    write_number(static_cast<std::uint8_t>(N));\n                }\n                else if (N <= (std::numeric_limits<std::uint16_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x59));\n                    write_number(static_cast<std::uint16_t>(N));\n                }\n                else if (N <= (std::numeric_limits<std::uint32_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x5A));\n                    write_number(static_cast<std::uint32_t>(N));\n                }\n                // LCOV_EXCL_START\n                else if (N <= (std::numeric_limits<std::uint64_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x5B));\n                    write_number(static_cast<std::uint64_t>(N));\n                }\n                // LCOV_EXCL_STOP\n\n                // step 2: write each element\n                oa->write_characters(\n                    reinterpret_cast<const CharType*>(j.m_value.binary->data()),\n                    N);\n\n                break;\n            }\n\n            case value_t::object:\n            {\n                // step 1: write control byte and the object size\n                const auto N = j.m_value.object->size();\n                if (N <= 0x17)\n                {\n                    write_number(static_cast<std::uint8_t>(0xA0 + N));\n                }\n                else if (N <= (std::numeric_limits<std::uint8_t>::max)())\n                {\n                    oa->write_character(to_char_type(0xB8));\n                    write_number(static_cast<std::uint8_t>(N));\n                }\n                else if (N <= (std::numeric_limits<std::uint16_t>::max)())\n                {\n                    oa->write_character(to_char_type(0xB9));\n                    write_number(static_cast<std::uint16_t>(N));\n                }\n                else if (N <= (std::numeric_limits<std::uint32_t>::max)())\n                {\n                    oa->write_character(to_char_type(0xBA));\n                    write_number(static_cast<std::uint32_t>(N));\n                }\n                // LCOV_EXCL_START\n                else if (N <= (std::numeric_limits<std::uint64_t>::max)())\n                {\n                    oa->write_character(to_char_type(0xBB));\n                    write_number(static_cast<std::uint64_t>(N));\n                }\n                // LCOV_EXCL_STOP\n\n                // step 2: write each element\n                for (const auto& el : *j.m_value.object)\n                {\n                    write_cbor(el.first);\n                    write_cbor(el.second);\n                }\n                break;\n            }\n\n            default:\n                break;\n        }\n    }\n\n    /*!\n    @param[in] j  JSON value to serialize\n    */\n    void write_msgpack(const BasicJsonType& j)\n    {\n        switch (j.type())\n        {\n            case value_t::null: // nil\n            {\n                oa->write_character(to_char_type(0xC0));\n                break;\n            }\n\n            case value_t::boolean: // true and false\n            {\n                oa->write_character(j.m_value.boolean\n                                    ? to_char_type(0xC3)\n                                    : to_char_type(0xC2));\n                break;\n            }\n\n            case value_t::number_integer:\n            {\n                if (j.m_value.number_integer >= 0)\n                {\n                    // MessagePack does not differentiate between positive\n                    // signed integers and unsigned integers. Therefore, we used\n                    // the code from the value_t::number_unsigned case here.\n                    if (j.m_value.number_unsigned < 128)\n                    {\n                        // positive fixnum\n                        write_number(static_cast<std::uint8_t>(j.m_value.number_integer));\n                    }\n                    else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint8_t>::max)())\n                    {\n                        // uint 8\n                        oa->write_character(to_char_type(0xCC));\n                        write_number(static_cast<std::uint8_t>(j.m_value.number_integer));\n                    }\n                    else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint16_t>::max)())\n                    {\n                        // uint 16\n                        oa->write_character(to_char_type(0xCD));\n                        write_number(static_cast<std::uint16_t>(j.m_value.number_integer));\n                    }\n                    else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint32_t>::max)())\n                    {\n                        // uint 32\n                        oa->write_character(to_char_type(0xCE));\n                        write_number(static_cast<std::uint32_t>(j.m_value.number_integer));\n                    }\n                    else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint64_t>::max)())\n                    {\n                        // uint 64\n                        oa->write_character(to_char_type(0xCF));\n                        write_number(static_cast<std::uint64_t>(j.m_value.number_integer));\n                    }\n                }\n                else\n                {\n                    if (j.m_value.number_integer >= -32)\n                    {\n                        // negative fixnum\n                        write_number(static_cast<std::int8_t>(j.m_value.number_integer));\n                    }\n                    else if (j.m_value.number_integer >= (std::numeric_limits<std::int8_t>::min)() &&\n                             j.m_value.number_integer <= (std::numeric_limits<std::int8_t>::max)())\n                    {\n                        // int 8\n                        oa->write_character(to_char_type(0xD0));\n                        write_number(static_cast<std::int8_t>(j.m_value.number_integer));\n                    }\n                    else if (j.m_value.number_integer >= (std::numeric_limits<std::int16_t>::min)() &&\n                             j.m_value.number_integer <= (std::numeric_limits<std::int16_t>::max)())\n                    {\n                        // int 16\n                        oa->write_character(to_char_type(0xD1));\n                        write_number(static_cast<std::int16_t>(j.m_value.number_integer));\n                    }\n                    else if (j.m_value.number_integer >= (std::numeric_limits<std::int32_t>::min)() &&\n                             j.m_value.number_integer <= (std::numeric_limits<std::int32_t>::max)())\n                    {\n                        // int 32\n                        oa->write_character(to_char_type(0xD2));\n                        write_number(static_cast<std::int32_t>(j.m_value.number_integer));\n                    }\n                    else if (j.m_value.number_integer >= (std::numeric_limits<std::int64_t>::min)() &&\n                             j.m_value.number_integer <= (std::numeric_limits<std::int64_t>::max)())\n                    {\n                        // int 64\n                        oa->write_character(to_char_type(0xD3));\n                        write_number(static_cast<std::int64_t>(j.m_value.number_integer));\n                    }\n                }\n                break;\n            }\n\n            case value_t::number_unsigned:\n            {\n                if (j.m_value.number_unsigned < 128)\n                {\n                    // positive fixnum\n                    write_number(static_cast<std::uint8_t>(j.m_value.number_integer));\n                }\n                else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint8_t>::max)())\n                {\n                    // uint 8\n                    oa->write_character(to_char_type(0xCC));\n                    write_number(static_cast<std::uint8_t>(j.m_value.number_integer));\n                }\n                else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint16_t>::max)())\n                {\n                    // uint 16\n                    oa->write_character(to_char_type(0xCD));\n                    write_number(static_cast<std::uint16_t>(j.m_value.number_integer));\n                }\n                else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint32_t>::max)())\n                {\n                    // uint 32\n                    oa->write_character(to_char_type(0xCE));\n                    write_number(static_cast<std::uint32_t>(j.m_value.number_integer));\n                }\n                else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint64_t>::max)())\n                {\n                    // uint 64\n                    oa->write_character(to_char_type(0xCF));\n                    write_number(static_cast<std::uint64_t>(j.m_value.number_integer));\n                }\n                break;\n            }\n\n            case value_t::number_float:\n            {\n                write_compact_float(j.m_value.number_float, detail::input_format_t::msgpack);\n                break;\n            }\n\n            case value_t::string:\n            {\n                // step 1: write control byte and the string length\n                const auto N = j.m_value.string->size();\n                if (N <= 31)\n                {\n                    // fixstr\n                    write_number(static_cast<std::uint8_t>(0xA0 | N));\n                }\n                else if (N <= (std::numeric_limits<std::uint8_t>::max)())\n                {\n                    // str 8\n                    oa->write_character(to_char_type(0xD9));\n                    write_number(static_cast<std::uint8_t>(N));\n                }\n                else if (N <= (std::numeric_limits<std::uint16_t>::max)())\n                {\n                    // str 16\n                    oa->write_character(to_char_type(0xDA));\n                    write_number(static_cast<std::uint16_t>(N));\n                }\n                else if (N <= (std::numeric_limits<std::uint32_t>::max)())\n                {\n                    // str 32\n                    oa->write_character(to_char_type(0xDB));\n                    write_number(static_cast<std::uint32_t>(N));\n                }\n\n                // step 2: write the string\n                oa->write_characters(\n                    reinterpret_cast<const CharType*>(j.m_value.string->c_str()),\n                    j.m_value.string->size());\n                break;\n            }\n\n            case value_t::array:\n            {\n                // step 1: write control byte and the array size\n                const auto N = j.m_value.array->size();\n                if (N <= 15)\n                {\n                    // fixarray\n                    write_number(static_cast<std::uint8_t>(0x90 | N));\n                }\n                else if (N <= (std::numeric_limits<std::uint16_t>::max)())\n                {\n                    // array 16\n                    oa->write_character(to_char_type(0xDC));\n                    write_number(static_cast<std::uint16_t>(N));\n                }\n                else if (N <= (std::numeric_limits<std::uint32_t>::max)())\n                {\n                    // array 32\n                    oa->write_character(to_char_type(0xDD));\n                    write_number(static_cast<std::uint32_t>(N));\n                }\n\n                // step 2: write each element\n                for (const auto& el : *j.m_value.array)\n                {\n                    write_msgpack(el);\n                }\n                break;\n            }\n\n            case value_t::binary:\n            {\n                // step 0: determine if the binary type has a set subtype to\n                // determine whether or not to use the ext or fixext types\n                const bool use_ext = j.m_value.binary->has_subtype();\n\n                // step 1: write control byte and the byte string length\n                const auto N = j.m_value.binary->size();\n                if (N <= (std::numeric_limits<std::uint8_t>::max)())\n                {\n                    std::uint8_t output_type{};\n                    bool fixed = true;\n                    if (use_ext)\n                    {\n                        switch (N)\n                        {\n                            case 1:\n                                output_type = 0xD4; // fixext 1\n                                break;\n                            case 2:\n                                output_type = 0xD5; // fixext 2\n                                break;\n                            case 4:\n                                output_type = 0xD6; // fixext 4\n                                break;\n                            case 8:\n                                output_type = 0xD7; // fixext 8\n                                break;\n                            case 16:\n                                output_type = 0xD8; // fixext 16\n                                break;\n                            default:\n                                output_type = 0xC7; // ext 8\n                                fixed = false;\n                                break;\n                        }\n\n                    }\n                    else\n                    {\n                        output_type = 0xC4; // bin 8\n                        fixed = false;\n                    }\n\n                    oa->write_character(to_char_type(output_type));\n                    if (!fixed)\n                    {\n                        write_number(static_cast<std::uint8_t>(N));\n                    }\n                }\n                else if (N <= (std::numeric_limits<std::uint16_t>::max)())\n                {\n                    std::uint8_t output_type = use_ext\n                                               ? 0xC8 // ext 16\n                                               : 0xC5; // bin 16\n\n                    oa->write_character(to_char_type(output_type));\n                    write_number(static_cast<std::uint16_t>(N));\n                }\n                else if (N <= (std::numeric_limits<std::uint32_t>::max)())\n                {\n                    std::uint8_t output_type = use_ext\n                                               ? 0xC9 // ext 32\n                                               : 0xC6; // bin 32\n\n                    oa->write_character(to_char_type(output_type));\n                    write_number(static_cast<std::uint32_t>(N));\n                }\n\n                // step 1.5: if this is an ext type, write the subtype\n                if (use_ext)\n                {\n                    write_number(static_cast<std::int8_t>(j.m_value.binary->subtype()));\n                }\n\n                // step 2: write the byte string\n                oa->write_characters(\n                    reinterpret_cast<const CharType*>(j.m_value.binary->data()),\n                    N);\n\n                break;\n            }\n\n            case value_t::object:\n            {\n                // step 1: write control byte and the object size\n                const auto N = j.m_value.object->size();\n                if (N <= 15)\n                {\n                    // fixmap\n                    write_number(static_cast<std::uint8_t>(0x80 | (N & 0xF)));\n                }\n                else if (N <= (std::numeric_limits<std::uint16_t>::max)())\n                {\n                    // map 16\n                    oa->write_character(to_char_type(0xDE));\n                    write_number(static_cast<std::uint16_t>(N));\n                }\n                else if (N <= (std::numeric_limits<std::uint32_t>::max)())\n                {\n                    // map 32\n                    oa->write_character(to_char_type(0xDF));\n                    write_number(static_cast<std::uint32_t>(N));\n                }\n\n                // step 2: write each element\n                for (const auto& el : *j.m_value.object)\n                {\n                    write_msgpack(el.first);\n                    write_msgpack(el.second);\n                }\n                break;\n            }\n\n            default:\n                break;\n        }\n    }\n\n    /*!\n    @param[in] j  JSON value to serialize\n    @param[in] use_count   whether to use '#' prefixes (optimized format)\n    @param[in] use_type    whether to use '$' prefixes (optimized format)\n    @param[in] add_prefix  whether prefixes need to be used for this value\n    */\n    void write_ubjson(const BasicJsonType& j, const bool use_count,\n                      const bool use_type, const bool add_prefix = true)\n    {\n        switch (j.type())\n        {\n            case value_t::null:\n            {\n                if (add_prefix)\n                {\n                    oa->write_character(to_char_type('Z'));\n                }\n                break;\n            }\n\n            case value_t::boolean:\n            {\n                if (add_prefix)\n                {\n                    oa->write_character(j.m_value.boolean\n                                        ? to_char_type('T')\n                                        : to_char_type('F'));\n                }\n                break;\n            }\n\n            case value_t::number_integer:\n            {\n                write_number_with_ubjson_prefix(j.m_value.number_integer, add_prefix);\n                break;\n            }\n\n            case value_t::number_unsigned:\n            {\n                write_number_with_ubjson_prefix(j.m_value.number_unsigned, add_prefix);\n                break;\n            }\n\n            case value_t::number_float:\n            {\n                write_number_with_ubjson_prefix(j.m_value.number_float, add_prefix);\n                break;\n            }\n\n            case value_t::string:\n            {\n                if (add_prefix)\n                {\n                    oa->write_character(to_char_type('S'));\n                }\n                write_number_with_ubjson_prefix(j.m_value.string->size(), true);\n                oa->write_characters(\n                    reinterpret_cast<const CharType*>(j.m_value.string->c_str()),\n                    j.m_value.string->size());\n                break;\n            }\n\n            case value_t::array:\n            {\n                if (add_prefix)\n                {\n                    oa->write_character(to_char_type('['));\n                }\n\n                bool prefix_required = true;\n                if (use_type && !j.m_value.array->empty())\n                {\n                    JSON_ASSERT(use_count);\n                    const CharType first_prefix = ubjson_prefix(j.front());\n                    const bool same_prefix = std::all_of(j.begin() + 1, j.end(),\n                                                         [this, first_prefix](const BasicJsonType & v)\n                    {\n                        return ubjson_prefix(v) == first_prefix;\n                    });\n\n                    if (same_prefix)\n                    {\n                        prefix_required = false;\n                        oa->write_character(to_char_type('$'));\n                        oa->write_character(first_prefix);\n                    }\n                }\n\n                if (use_count)\n                {\n                    oa->write_character(to_char_type('#'));\n                    write_number_with_ubjson_prefix(j.m_value.array->size(), true);\n                }\n\n                for (const auto& el : *j.m_value.array)\n                {\n                    write_ubjson(el, use_count, use_type, prefix_required);\n                }\n\n                if (!use_count)\n                {\n                    oa->write_character(to_char_type(']'));\n                }\n\n                break;\n            }\n\n            case value_t::binary:\n            {\n                if (add_prefix)\n                {\n                    oa->write_character(to_char_type('['));\n                }\n\n                if (use_type && !j.m_value.binary->empty())\n                {\n                    JSON_ASSERT(use_count);\n                    oa->write_character(to_char_type('$'));\n                    oa->write_character('U');\n                }\n\n                if (use_count)\n                {\n                    oa->write_character(to_char_type('#'));\n                    write_number_with_ubjson_prefix(j.m_value.binary->size(), true);\n                }\n\n                if (use_type)\n                {\n                    oa->write_characters(\n                        reinterpret_cast<const CharType*>(j.m_value.binary->data()),\n                        j.m_value.binary->size());\n                }\n                else\n                {\n                    for (size_t i = 0; i < j.m_value.binary->size(); ++i)\n                    {\n                        oa->write_character(to_char_type('U'));\n                        oa->write_character(j.m_value.binary->data()[i]);\n                    }\n                }\n\n                if (!use_count)\n                {\n                    oa->write_character(to_char_type(']'));\n                }\n\n                break;\n            }\n\n            case value_t::object:\n            {\n                if (add_prefix)\n                {\n                    oa->write_character(to_char_type('{'));\n                }\n\n                bool prefix_required = true;\n                if (use_type && !j.m_value.object->empty())\n                {\n                    JSON_ASSERT(use_count);\n                    const CharType first_prefix = ubjson_prefix(j.front());\n                    const bool same_prefix = std::all_of(j.begin(), j.end(),\n                                                         [this, first_prefix](const BasicJsonType & v)\n                    {\n                        return ubjson_prefix(v) == first_prefix;\n                    });\n\n                    if (same_prefix)\n                    {\n                        prefix_required = false;\n                        oa->write_character(to_char_type('$'));\n                        oa->write_character(first_prefix);\n                    }\n                }\n\n                if (use_count)\n                {\n                    oa->write_character(to_char_type('#'));\n                    write_number_with_ubjson_prefix(j.m_value.object->size(), true);\n                }\n\n                for (const auto& el : *j.m_value.object)\n                {\n                    write_number_with_ubjson_prefix(el.first.size(), true);\n                    oa->write_characters(\n                        reinterpret_cast<const CharType*>(el.first.c_str()),\n                        el.first.size());\n                    write_ubjson(el.second, use_count, use_type, prefix_required);\n                }\n\n                if (!use_count)\n                {\n                    oa->write_character(to_char_type('}'));\n                }\n\n                break;\n            }\n\n            default:\n                break;\n        }\n    }\n\n  private:\n    //////////\n    // BSON //\n    //////////\n\n    /*!\n    @return The size of a BSON document entry header, including the id marker\n            and the entry name size (and its null-terminator).\n    */\n    static std::size_t calc_bson_entry_header_size(const string_t& name)\n    {\n        const auto it = name.find(static_cast<typename string_t::value_type>(0));\n        if (JSON_HEDLEY_UNLIKELY(it != BasicJsonType::string_t::npos))\n        {\n            JSON_THROW(out_of_range::create(409,\n                                            \"BSON key cannot contain code point U+0000 (at byte \" + std::to_string(it) + \")\"));\n        }\n\n        return /*id*/ 1ul + name.size() + /*zero-terminator*/1u;\n    }\n\n    /*!\n    @brief Writes the given @a element_type and @a name to the output adapter\n    */\n    void write_bson_entry_header(const string_t& name,\n                                 const std::uint8_t element_type)\n    {\n        oa->write_character(to_char_type(element_type)); // boolean\n        oa->write_characters(\n            reinterpret_cast<const CharType*>(name.c_str()),\n            name.size() + 1u);\n    }\n\n    /*!\n    @brief Writes a BSON element with key @a name and boolean value @a value\n    */\n    void write_bson_boolean(const string_t& name,\n                            const bool value)\n    {\n        write_bson_entry_header(name, 0x08);\n        oa->write_character(value ? to_char_type(0x01) : to_char_type(0x00));\n    }\n\n    /*!\n    @brief Writes a BSON element with key @a name and double value @a value\n    */\n    void write_bson_double(const string_t& name,\n                           const double value)\n    {\n        write_bson_entry_header(name, 0x01);\n        write_number<double, true>(value);\n    }\n\n    /*!\n    @return The size of the BSON-encoded string in @a value\n    */\n    static std::size_t calc_bson_string_size(const string_t& value)\n    {\n        return sizeof(std::int32_t) + value.size() + 1ul;\n    }\n\n    /*!\n    @brief Writes a BSON element with key @a name and string value @a value\n    */\n    void write_bson_string(const string_t& name,\n                           const string_t& value)\n    {\n        write_bson_entry_header(name, 0x02);\n\n        write_number<std::int32_t, true>(static_cast<std::int32_t>(value.size() + 1ul));\n        oa->write_characters(\n            reinterpret_cast<const CharType*>(value.c_str()),\n            value.size() + 1);\n    }\n\n    /*!\n    @brief Writes a BSON element with key @a name and null value\n    */\n    void write_bson_null(const string_t& name)\n    {\n        write_bson_entry_header(name, 0x0A);\n    }\n\n    /*!\n    @return The size of the BSON-encoded integer @a value\n    */\n    static std::size_t calc_bson_integer_size(const std::int64_t value)\n    {\n        return (std::numeric_limits<std::int32_t>::min)() <= value && value <= (std::numeric_limits<std::int32_t>::max)()\n               ? sizeof(std::int32_t)\n               : sizeof(std::int64_t);\n    }\n\n    /*!\n    @brief Writes a BSON element with key @a name and integer @a value\n    */\n    void write_bson_integer(const string_t& name,\n                            const std::int64_t value)\n    {\n        if ((std::numeric_limits<std::int32_t>::min)() <= value && value <= (std::numeric_limits<std::int32_t>::max)())\n        {\n            write_bson_entry_header(name, 0x10); // int32\n            write_number<std::int32_t, true>(static_cast<std::int32_t>(value));\n        }\n        else\n        {\n            write_bson_entry_header(name, 0x12); // int64\n            write_number<std::int64_t, true>(static_cast<std::int64_t>(value));\n        }\n    }\n\n    /*!\n    @return The size of the BSON-encoded unsigned integer in @a j\n    */\n    static constexpr std::size_t calc_bson_unsigned_size(const std::uint64_t value) noexcept\n    {\n        return (value <= static_cast<std::uint64_t>((std::numeric_limits<std::int32_t>::max)()))\n               ? sizeof(std::int32_t)\n               : sizeof(std::int64_t);\n    }\n\n    /*!\n    @brief Writes a BSON element with key @a name and unsigned @a value\n    */\n    void write_bson_unsigned(const string_t& name,\n                             const std::uint64_t value)\n    {\n        if (value <= static_cast<std::uint64_t>((std::numeric_limits<std::int32_t>::max)()))\n        {\n            write_bson_entry_header(name, 0x10 /* int32 */);\n            write_number<std::int32_t, true>(static_cast<std::int32_t>(value));\n        }\n        else if (value <= static_cast<std::uint64_t>((std::numeric_limits<std::int64_t>::max)()))\n        {\n            write_bson_entry_header(name, 0x12 /* int64 */);\n            write_number<std::int64_t, true>(static_cast<std::int64_t>(value));\n        }\n        else\n        {\n            JSON_THROW(out_of_range::create(407, \"integer number \" + std::to_string(value) + \" cannot be represented by BSON as it does not fit int64\"));\n        }\n    }\n\n    /*!\n    @brief Writes a BSON element with key @a name and object @a value\n    */\n    void write_bson_object_entry(const string_t& name,\n                                 const typename BasicJsonType::object_t& value)\n    {\n        write_bson_entry_header(name, 0x03); // object\n        write_bson_object(value);\n    }\n\n    /*!\n    @return The size of the BSON-encoded array @a value\n    */\n    static std::size_t calc_bson_array_size(const typename BasicJsonType::array_t& value)\n    {\n        std::size_t array_index = 0ul;\n\n        const std::size_t embedded_document_size = std::accumulate(std::begin(value), std::end(value), std::size_t(0), [&array_index](std::size_t result, const typename BasicJsonType::array_t::value_type & el)\n        {\n            return result + calc_bson_element_size(std::to_string(array_index++), el);\n        });\n\n        return sizeof(std::int32_t) + embedded_document_size + 1ul;\n    }\n\n    /*!\n    @return The size of the BSON-encoded binary array @a value\n    */\n    static std::size_t calc_bson_binary_size(const typename BasicJsonType::binary_t& value)\n    {\n        return sizeof(std::int32_t) + value.size() + 1ul;\n    }\n\n    /*!\n    @brief Writes a BSON element with key @a name and array @a value\n    */\n    void write_bson_array(const string_t& name,\n                          const typename BasicJsonType::array_t& value)\n    {\n        write_bson_entry_header(name, 0x04); // array\n        write_number<std::int32_t, true>(static_cast<std::int32_t>(calc_bson_array_size(value)));\n\n        std::size_t array_index = 0ul;\n\n        for (const auto& el : value)\n        {\n            write_bson_element(std::to_string(array_index++), el);\n        }\n\n        oa->write_character(to_char_type(0x00));\n    }\n\n    /*!\n    @brief Writes a BSON element with key @a name and binary value @a value\n    */\n    void write_bson_binary(const string_t& name,\n                           const binary_t& value)\n    {\n        write_bson_entry_header(name, 0x05);\n\n        write_number<std::int32_t, true>(static_cast<std::int32_t>(value.size()));\n        write_number(value.has_subtype() ? value.subtype() : std::uint8_t(0x00));\n\n        oa->write_characters(reinterpret_cast<const CharType*>(value.data()), value.size());\n    }\n\n    /*!\n    @brief Calculates the size necessary to serialize the JSON value @a j with its @a name\n    @return The calculated size for the BSON document entry for @a j with the given @a name.\n    */\n    static std::size_t calc_bson_element_size(const string_t& name,\n            const BasicJsonType& j)\n    {\n        const auto header_size = calc_bson_entry_header_size(name);\n        switch (j.type())\n        {\n            case value_t::object:\n                return header_size + calc_bson_object_size(*j.m_value.object);\n\n            case value_t::array:\n                return header_size + calc_bson_array_size(*j.m_value.array);\n\n            case value_t::binary:\n                return header_size + calc_bson_binary_size(*j.m_value.binary);\n\n            case value_t::boolean:\n                return header_size + 1ul;\n\n            case value_t::number_float:\n                return header_size + 8ul;\n\n            case value_t::number_integer:\n                return header_size + calc_bson_integer_size(j.m_value.number_integer);\n\n            case value_t::number_unsigned:\n                return header_size + calc_bson_unsigned_size(j.m_value.number_unsigned);\n\n            case value_t::string:\n                return header_size + calc_bson_string_size(*j.m_value.string);\n\n            case value_t::null:\n                return header_size + 0ul;\n\n            // LCOV_EXCL_START\n            default:\n                JSON_ASSERT(false);\n                return 0ul;\n                // LCOV_EXCL_STOP\n        }\n    }\n\n    /*!\n    @brief Serializes the JSON value @a j to BSON and associates it with the\n           key @a name.\n    @param name The name to associate with the JSON entity @a j within the\n                current BSON document\n    @return The size of the BSON entry\n    */\n    void write_bson_element(const string_t& name,\n                            const BasicJsonType& j)\n    {\n        switch (j.type())\n        {\n            case value_t::object:\n                return write_bson_object_entry(name, *j.m_value.object);\n\n            case value_t::array:\n                return write_bson_array(name, *j.m_value.array);\n\n            case value_t::binary:\n                return write_bson_binary(name, *j.m_value.binary);\n\n            case value_t::boolean:\n                return write_bson_boolean(name, j.m_value.boolean);\n\n            case value_t::number_float:\n                return write_bson_double(name, j.m_value.number_float);\n\n            case value_t::number_integer:\n                return write_bson_integer(name, j.m_value.number_integer);\n\n            case value_t::number_unsigned:\n                return write_bson_unsigned(name, j.m_value.number_unsigned);\n\n            case value_t::string:\n                return write_bson_string(name, *j.m_value.string);\n\n            case value_t::null:\n                return write_bson_null(name);\n\n            // LCOV_EXCL_START\n            default:\n                JSON_ASSERT(false);\n                return;\n                // LCOV_EXCL_STOP\n        }\n    }\n\n    /*!\n    @brief Calculates the size of the BSON serialization of the given\n           JSON-object @a j.\n    @param[in] j  JSON value to serialize\n    @pre       j.type() == value_t::object\n    */\n    static std::size_t calc_bson_object_size(const typename BasicJsonType::object_t& value)\n    {\n        std::size_t document_size = std::accumulate(value.begin(), value.end(), std::size_t(0),\n                                    [](size_t result, const typename BasicJsonType::object_t::value_type & el)\n        {\n            return result += calc_bson_element_size(el.first, el.second);\n        });\n\n        return sizeof(std::int32_t) + document_size + 1ul;\n    }\n\n    /*!\n    @param[in] j  JSON value to serialize\n    @pre       j.type() == value_t::object\n    */\n    void write_bson_object(const typename BasicJsonType::object_t& value)\n    {\n        write_number<std::int32_t, true>(static_cast<std::int32_t>(calc_bson_object_size(value)));\n\n        for (const auto& el : value)\n        {\n            write_bson_element(el.first, el.second);\n        }\n\n        oa->write_character(to_char_type(0x00));\n    }\n\n    //////////\n    // CBOR //\n    //////////\n\n    static constexpr CharType get_cbor_float_prefix(float /*unused*/)\n    {\n        return to_char_type(0xFA);  // Single-Precision Float\n    }\n\n    static constexpr CharType get_cbor_float_prefix(double /*unused*/)\n    {\n        return to_char_type(0xFB);  // Double-Precision Float\n    }\n\n    /////////////\n    // MsgPack //\n    /////////////\n\n    static constexpr CharType get_msgpack_float_prefix(float /*unused*/)\n    {\n        return to_char_type(0xCA);  // float 32\n    }\n\n    static constexpr CharType get_msgpack_float_prefix(double /*unused*/)\n    {\n        return to_char_type(0xCB);  // float 64\n    }\n\n    ////////////\n    // UBJSON //\n    ////////////\n\n    // UBJSON: write number (floating point)\n    template<typename NumberType, typename std::enable_if<\n                 std::is_floating_point<NumberType>::value, int>::type = 0>\n    void write_number_with_ubjson_prefix(const NumberType n,\n                                         const bool add_prefix)\n    {\n        if (add_prefix)\n        {\n            oa->write_character(get_ubjson_float_prefix(n));\n        }\n        write_number(n);\n    }\n\n    // UBJSON: write number (unsigned integer)\n    template<typename NumberType, typename std::enable_if<\n                 std::is_unsigned<NumberType>::value, int>::type = 0>\n    void write_number_with_ubjson_prefix(const NumberType n,\n                                         const bool add_prefix)\n    {\n        if (n <= static_cast<std::uint64_t>((std::numeric_limits<std::int8_t>::max)()))\n        {\n            if (add_prefix)\n            {\n                oa->write_character(to_char_type('i'));  // int8\n            }\n            write_number(static_cast<std::uint8_t>(n));\n        }\n        else if (n <= (std::numeric_limits<std::uint8_t>::max)())\n        {\n            if (add_prefix)\n            {\n                oa->write_character(to_char_type('U'));  // uint8\n            }\n            write_number(static_cast<std::uint8_t>(n));\n        }\n        else if (n <= static_cast<std::uint64_t>((std::numeric_limits<std::int16_t>::max)()))\n        {\n            if (add_prefix)\n            {\n                oa->write_character(to_char_type('I'));  // int16\n            }\n            write_number(static_cast<std::int16_t>(n));\n        }\n        else if (n <= static_cast<std::uint64_t>((std::numeric_limits<std::int32_t>::max)()))\n        {\n            if (add_prefix)\n            {\n                oa->write_character(to_char_type('l'));  // int32\n            }\n            write_number(static_cast<std::int32_t>(n));\n        }\n        else if (n <= static_cast<std::uint64_t>((std::numeric_limits<std::int64_t>::max)()))\n        {\n            if (add_prefix)\n            {\n                oa->write_character(to_char_type('L'));  // int64\n            }\n            write_number(static_cast<std::int64_t>(n));\n        }\n        else\n        {\n            if (add_prefix)\n            {\n                oa->write_character(to_char_type('H'));  // high-precision number\n            }\n\n            const auto number = BasicJsonType(n).dump();\n            write_number_with_ubjson_prefix(number.size(), true);\n            for (std::size_t i = 0; i < number.size(); ++i)\n            {\n                oa->write_character(to_char_type(static_cast<std::uint8_t>(number[i])));\n            }\n        }\n    }\n\n    // UBJSON: write number (signed integer)\n    template < typename NumberType, typename std::enable_if <\n                   std::is_signed<NumberType>::value&&\n                   !std::is_floating_point<NumberType>::value, int >::type = 0 >\n    void write_number_with_ubjson_prefix(const NumberType n,\n                                         const bool add_prefix)\n    {\n        if ((std::numeric_limits<std::int8_t>::min)() <= n && n <= (std::numeric_limits<std::int8_t>::max)())\n        {\n            if (add_prefix)\n            {\n                oa->write_character(to_char_type('i'));  // int8\n            }\n            write_number(static_cast<std::int8_t>(n));\n        }\n        else if (static_cast<std::int64_t>((std::numeric_limits<std::uint8_t>::min)()) <= n && n <= static_cast<std::int64_t>((std::numeric_limits<std::uint8_t>::max)()))\n        {\n            if (add_prefix)\n            {\n                oa->write_character(to_char_type('U'));  // uint8\n            }\n            write_number(static_cast<std::uint8_t>(n));\n        }\n        else if ((std::numeric_limits<std::int16_t>::min)() <= n && n <= (std::numeric_limits<std::int16_t>::max)())\n        {\n            if (add_prefix)\n            {\n                oa->write_character(to_char_type('I'));  // int16\n            }\n            write_number(static_cast<std::int16_t>(n));\n        }\n        else if ((std::numeric_limits<std::int32_t>::min)() <= n && n <= (std::numeric_limits<std::int32_t>::max)())\n        {\n            if (add_prefix)\n            {\n                oa->write_character(to_char_type('l'));  // int32\n            }\n            write_number(static_cast<std::int32_t>(n));\n        }\n        else if ((std::numeric_limits<std::int64_t>::min)() <= n && n <= (std::numeric_limits<std::int64_t>::max)())\n        {\n            if (add_prefix)\n            {\n                oa->write_character(to_char_type('L'));  // int64\n            }\n            write_number(static_cast<std::int64_t>(n));\n        }\n        // LCOV_EXCL_START\n        else\n        {\n            if (add_prefix)\n            {\n                oa->write_character(to_char_type('H'));  // high-precision number\n            }\n\n            const auto number = BasicJsonType(n).dump();\n            write_number_with_ubjson_prefix(number.size(), true);\n            for (std::size_t i = 0; i < number.size(); ++i)\n            {\n                oa->write_character(to_char_type(static_cast<std::uint8_t>(number[i])));\n            }\n        }\n        // LCOV_EXCL_STOP\n    }\n\n    /*!\n    @brief determine the type prefix of container values\n    */\n    CharType ubjson_prefix(const BasicJsonType& j) const noexcept\n    {\n        switch (j.type())\n        {\n            case value_t::null:\n                return 'Z';\n\n            case value_t::boolean:\n                return j.m_value.boolean ? 'T' : 'F';\n\n            case value_t::number_integer:\n            {\n                if ((std::numeric_limits<std::int8_t>::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits<std::int8_t>::max)())\n                {\n                    return 'i';\n                }\n                if ((std::numeric_limits<std::uint8_t>::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits<std::uint8_t>::max)())\n                {\n                    return 'U';\n                }\n                if ((std::numeric_limits<std::int16_t>::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits<std::int16_t>::max)())\n                {\n                    return 'I';\n                }\n                if ((std::numeric_limits<std::int32_t>::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits<std::int32_t>::max)())\n                {\n                    return 'l';\n                }\n                if ((std::numeric_limits<std::int64_t>::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits<std::int64_t>::max)())\n                {\n                    return 'L';\n                }\n                // anything else is treated as high-precision number\n                return 'H'; // LCOV_EXCL_LINE\n            }\n\n            case value_t::number_unsigned:\n            {\n                if (j.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int8_t>::max)()))\n                {\n                    return 'i';\n                }\n                if (j.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::uint8_t>::max)()))\n                {\n                    return 'U';\n                }\n                if (j.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int16_t>::max)()))\n                {\n                    return 'I';\n                }\n                if (j.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int32_t>::max)()))\n                {\n                    return 'l';\n                }\n                if (j.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int64_t>::max)()))\n                {\n                    return 'L';\n                }\n                // anything else is treated as high-precision number\n                return 'H'; // LCOV_EXCL_LINE\n            }\n\n            case value_t::number_float:\n                return get_ubjson_float_prefix(j.m_value.number_float);\n\n            case value_t::string:\n                return 'S';\n\n            case value_t::array: // fallthrough\n            case value_t::binary:\n                return '[';\n\n            case value_t::object:\n                return '{';\n\n            default:  // discarded values\n                return 'N';\n        }\n    }\n\n    static constexpr CharType get_ubjson_float_prefix(float /*unused*/)\n    {\n        return 'd';  // float 32\n    }\n\n    static constexpr CharType get_ubjson_float_prefix(double /*unused*/)\n    {\n        return 'D';  // float 64\n    }\n\n    ///////////////////////\n    // Utility functions //\n    ///////////////////////\n\n    /*\n    @brief write a number to output input\n    @param[in] n number of type @a NumberType\n    @tparam NumberType the type of the number\n    @tparam OutputIsLittleEndian Set to true if output data is\n                                 required to be little endian\n\n    @note This function needs to respect the system's endianess, because bytes\n          in CBOR, MessagePack, and UBJSON are stored in network order (big\n          endian) and therefore need reordering on little endian systems.\n    */\n    template<typename NumberType, bool OutputIsLittleEndian = false>\n    void write_number(const NumberType n)\n    {\n        // step 1: write number to array of length NumberType\n        std::array<CharType, sizeof(NumberType)> vec;\n        std::memcpy(vec.data(), &n, sizeof(NumberType));\n\n        // step 2: write array to output (with possible reordering)\n        if (is_little_endian != OutputIsLittleEndian)\n        {\n            // reverse byte order prior to conversion if necessary\n            std::reverse(vec.begin(), vec.end());\n        }\n\n        oa->write_characters(vec.data(), sizeof(NumberType));\n    }\n\n    void write_compact_float(const number_float_t n, detail::input_format_t format)\n    {\n        if (static_cast<double>(n) >= static_cast<double>(std::numeric_limits<float>::lowest()) &&\n                static_cast<double>(n) <= static_cast<double>((std::numeric_limits<float>::max)()) &&\n                static_cast<double>(static_cast<float>(n)) == static_cast<double>(n))\n        {\n            oa->write_character(format == detail::input_format_t::cbor\n                                ? get_cbor_float_prefix(static_cast<float>(n))\n                                : get_msgpack_float_prefix(static_cast<float>(n)));\n            write_number(static_cast<float>(n));\n        }\n        else\n        {\n            oa->write_character(format == detail::input_format_t::cbor\n                                ? get_cbor_float_prefix(n)\n                                : get_msgpack_float_prefix(n));\n            write_number(n);\n        }\n    }\n\n  public:\n    // The following to_char_type functions are implement the conversion\n    // between uint8_t and CharType. In case CharType is not unsigned,\n    // such a conversion is required to allow values greater than 128.\n    // See <https://github.com/nlohmann/json/issues/1286> for a discussion.\n    template < typename C = CharType,\n               enable_if_t < std::is_signed<C>::value && std::is_signed<char>::value > * = nullptr >\n    static constexpr CharType to_char_type(std::uint8_t x) noexcept\n    {\n        return *reinterpret_cast<char*>(&x);\n    }\n\n    template < typename C = CharType,\n               enable_if_t < std::is_signed<C>::value && std::is_unsigned<char>::value > * = nullptr >\n    static CharType to_char_type(std::uint8_t x) noexcept\n    {\n        static_assert(sizeof(std::uint8_t) == sizeof(CharType), \"size of CharType must be equal to std::uint8_t\");\n        static_assert(std::is_trivial<CharType>::value, \"CharType must be trivial\");\n        CharType result;\n        std::memcpy(&result, &x, sizeof(x));\n        return result;\n    }\n\n    template<typename C = CharType,\n             enable_if_t<std::is_unsigned<C>::value>* = nullptr>\n    static constexpr CharType to_char_type(std::uint8_t x) noexcept\n    {\n        return x;\n    }\n\n    template < typename InputCharType, typename C = CharType,\n               enable_if_t <\n                   std::is_signed<C>::value &&\n                   std::is_signed<char>::value &&\n                   std::is_same<char, typename std::remove_cv<InputCharType>::type>::value\n                   > * = nullptr >\n    static constexpr CharType to_char_type(InputCharType x) noexcept\n    {\n        return x;\n    }\n\n  private:\n    /// whether we can assume little endianess\n    const bool is_little_endian = little_endianess();\n\n    /// the output\n    output_adapter_t<CharType> oa = nullptr;\n};\n}  // namespace detail\n}  // namespace nlohmann\n\n// #include <nlohmann/detail/output/output_adapters.hpp>\n\n// #include <nlohmann/detail/output/serializer.hpp>\n\n\n#include <algorithm> // reverse, remove, fill, find, none_of\n#include <array> // array\n#include <clocale> // localeconv, lconv\n#include <cmath> // labs, isfinite, isnan, signbit\n#include <cstddef> // size_t, ptrdiff_t\n#include <cstdint> // uint8_t\n#include <cstdio> // snprintf\n#include <limits> // numeric_limits\n#include <string> // string, char_traits\n#include <type_traits> // is_same\n#include <utility> // move\n\n// #include <nlohmann/detail/conversions/to_chars.hpp>\n\n\n#include <array> // array\n#include <cmath>   // signbit, isfinite\n#include <cstdint> // intN_t, uintN_t\n#include <cstring> // memcpy, memmove\n#include <limits> // numeric_limits\n#include <type_traits> // conditional\n\n// #include <nlohmann/detail/macro_scope.hpp>\n\n\nnamespace nlohmann\n{\nnamespace detail\n{\n\n/*!\n@brief implements the Grisu2 algorithm for binary to decimal floating-point\nconversion.\n\nThis implementation is a slightly modified version of the reference\nimplementation which may be obtained from\nhttp://florian.loitsch.com/publications (bench.tar.gz).\n\nThe code is distributed under the MIT license, Copyright (c) 2009 Florian Loitsch.\n\nFor a detailed description of the algorithm see:\n\n[1] Loitsch, \"Printing Floating-Point Numbers Quickly and Accurately with\n    Integers\", Proceedings of the ACM SIGPLAN 2010 Conference on Programming\n    Language Design and Implementation, PLDI 2010\n[2] Burger, Dybvig, \"Printing Floating-Point Numbers Quickly and Accurately\",\n    Proceedings of the ACM SIGPLAN 1996 Conference on Programming Language\n    Design and Implementation, PLDI 1996\n*/\nnamespace dtoa_impl\n{\n\ntemplate<typename Target, typename Source>\nTarget reinterpret_bits(const Source source)\n{\n    static_assert(sizeof(Target) == sizeof(Source), \"size mismatch\");\n\n    Target target;\n    std::memcpy(&target, &source, sizeof(Source));\n    return target;\n}\n\nstruct diyfp // f * 2^e\n{\n    static constexpr int kPrecision = 64; // = q\n\n    std::uint64_t f = 0;\n    int e = 0;\n\n    constexpr diyfp(std::uint64_t f_, int e_) noexcept : f(f_), e(e_) {}\n\n    /*!\n    @brief returns x - y\n    @pre x.e == y.e and x.f >= y.f\n    */\n    static diyfp sub(const diyfp& x, const diyfp& y) noexcept\n    {\n        JSON_ASSERT(x.e == y.e);\n        JSON_ASSERT(x.f >= y.f);\n\n        return {x.f - y.f, x.e};\n    }\n\n    /*!\n    @brief returns x * y\n    @note The result is rounded. (Only the upper q bits are returned.)\n    */\n    static diyfp mul(const diyfp& x, const diyfp& y) noexcept\n    {\n        static_assert(kPrecision == 64, \"internal error\");\n\n        // Computes:\n        //  f = round((x.f * y.f) / 2^q)\n        //  e = x.e + y.e + q\n\n        // Emulate the 64-bit * 64-bit multiplication:\n        //\n        // p = u * v\n        //   = (u_lo + 2^32 u_hi) (v_lo + 2^32 v_hi)\n        //   = (u_lo v_lo         ) + 2^32 ((u_lo v_hi         ) + (u_hi v_lo         )) + 2^64 (u_hi v_hi         )\n        //   = (p0                ) + 2^32 ((p1                ) + (p2                )) + 2^64 (p3                )\n        //   = (p0_lo + 2^32 p0_hi) + 2^32 ((p1_lo + 2^32 p1_hi) + (p2_lo + 2^32 p2_hi)) + 2^64 (p3                )\n        //   = (p0_lo             ) + 2^32 (p0_hi + p1_lo + p2_lo                      ) + 2^64 (p1_hi + p2_hi + p3)\n        //   = (p0_lo             ) + 2^32 (Q                                          ) + 2^64 (H                 )\n        //   = (p0_lo             ) + 2^32 (Q_lo + 2^32 Q_hi                           ) + 2^64 (H                 )\n        //\n        // (Since Q might be larger than 2^32 - 1)\n        //\n        //   = (p0_lo + 2^32 Q_lo) + 2^64 (Q_hi + H)\n        //\n        // (Q_hi + H does not overflow a 64-bit int)\n        //\n        //   = p_lo + 2^64 p_hi\n\n        const std::uint64_t u_lo = x.f & 0xFFFFFFFFu;\n        const std::uint64_t u_hi = x.f >> 32u;\n        const std::uint64_t v_lo = y.f & 0xFFFFFFFFu;\n        const std::uint64_t v_hi = y.f >> 32u;\n\n        const std::uint64_t p0 = u_lo * v_lo;\n        const std::uint64_t p1 = u_lo * v_hi;\n        const std::uint64_t p2 = u_hi * v_lo;\n        const std::uint64_t p3 = u_hi * v_hi;\n\n        const std::uint64_t p0_hi = p0 >> 32u;\n        const std::uint64_t p1_lo = p1 & 0xFFFFFFFFu;\n        const std::uint64_t p1_hi = p1 >> 32u;\n        const std::uint64_t p2_lo = p2 & 0xFFFFFFFFu;\n        const std::uint64_t p2_hi = p2 >> 32u;\n\n        std::uint64_t Q = p0_hi + p1_lo + p2_lo;\n\n        // The full product might now be computed as\n        //\n        // p_hi = p3 + p2_hi + p1_hi + (Q >> 32)\n        // p_lo = p0_lo + (Q << 32)\n        //\n        // But in this particular case here, the full p_lo is not required.\n        // Effectively we only need to add the highest bit in p_lo to p_hi (and\n        // Q_hi + 1 does not overflow).\n\n        Q += std::uint64_t{1} << (64u - 32u - 1u); // round, ties up\n\n        const std::uint64_t h = p3 + p2_hi + p1_hi + (Q >> 32u);\n\n        return {h, x.e + y.e + 64};\n    }\n\n    /*!\n    @brief normalize x such that the significand is >= 2^(q-1)\n    @pre x.f != 0\n    */\n    static diyfp normalize(diyfp x) noexcept\n    {\n        JSON_ASSERT(x.f != 0);\n\n        while ((x.f >> 63u) == 0)\n        {\n            x.f <<= 1u;\n            x.e--;\n        }\n\n        return x;\n    }\n\n    /*!\n    @brief normalize x such that the result has the exponent E\n    @pre e >= x.e and the upper e - x.e bits of x.f must be zero.\n    */\n    static diyfp normalize_to(const diyfp& x, const int target_exponent) noexcept\n    {\n        const int delta = x.e - target_exponent;\n\n        JSON_ASSERT(delta >= 0);\n        JSON_ASSERT(((x.f << delta) >> delta) == x.f);\n\n        return {x.f << delta, target_exponent};\n    }\n};\n\nstruct boundaries\n{\n    diyfp w;\n    diyfp minus;\n    diyfp plus;\n};\n\n/*!\nCompute the (normalized) diyfp representing the input number 'value' and its\nboundaries.\n\n@pre value must be finite and positive\n*/\ntemplate<typename FloatType>\nboundaries compute_boundaries(FloatType value)\n{\n    JSON_ASSERT(std::isfinite(value));\n    JSON_ASSERT(value > 0);\n\n    // Convert the IEEE representation into a diyfp.\n    //\n    // If v is denormal:\n    //      value = 0.F * 2^(1 - bias) = (          F) * 2^(1 - bias - (p-1))\n    // If v is normalized:\n    //      value = 1.F * 2^(E - bias) = (2^(p-1) + F) * 2^(E - bias - (p-1))\n\n    static_assert(std::numeric_limits<FloatType>::is_iec559,\n                  \"internal error: dtoa_short requires an IEEE-754 floating-point implementation\");\n\n    constexpr int      kPrecision = std::numeric_limits<FloatType>::digits; // = p (includes the hidden bit)\n    constexpr int      kBias      = std::numeric_limits<FloatType>::max_exponent - 1 + (kPrecision - 1);\n    constexpr int      kMinExp    = 1 - kBias;\n    constexpr std::uint64_t kHiddenBit = std::uint64_t{1} << (kPrecision - 1); // = 2^(p-1)\n\n    using bits_type = typename std::conditional<kPrecision == 24, std::uint32_t, std::uint64_t >::type;\n\n    const std::uint64_t bits = reinterpret_bits<bits_type>(value);\n    const std::uint64_t E = bits >> (kPrecision - 1);\n    const std::uint64_t F = bits & (kHiddenBit - 1);\n\n    const bool is_denormal = E == 0;\n    const diyfp v = is_denormal\n                    ? diyfp(F, kMinExp)\n                    : diyfp(F + kHiddenBit, static_cast<int>(E) - kBias);\n\n    // Compute the boundaries m- and m+ of the floating-point value\n    // v = f * 2^e.\n    //\n    // Determine v- and v+, the floating-point predecessor and successor if v,\n    // respectively.\n    //\n    //      v- = v - 2^e        if f != 2^(p-1) or e == e_min                (A)\n    //         = v - 2^(e-1)    if f == 2^(p-1) and e > e_min                (B)\n    //\n    //      v+ = v + 2^e\n    //\n    // Let m- = (v- + v) / 2 and m+ = (v + v+) / 2. All real numbers _strictly_\n    // between m- and m+ round to v, regardless of how the input rounding\n    // algorithm breaks ties.\n    //\n    //      ---+-------------+-------------+-------------+-------------+---  (A)\n    //         v-            m-            v             m+            v+\n    //\n    //      -----------------+------+------+-------------+-------------+---  (B)\n    //                       v-     m-     v             m+            v+\n\n    const bool lower_boundary_is_closer = F == 0 && E > 1;\n    const diyfp m_plus = diyfp(2 * v.f + 1, v.e - 1);\n    const diyfp m_minus = lower_boundary_is_closer\n                          ? diyfp(4 * v.f - 1, v.e - 2)  // (B)\n                          : diyfp(2 * v.f - 1, v.e - 1); // (A)\n\n    // Determine the normalized w+ = m+.\n    const diyfp w_plus = diyfp::normalize(m_plus);\n\n    // Determine w- = m- such that e_(w-) = e_(w+).\n    const diyfp w_minus = diyfp::normalize_to(m_minus, w_plus.e);\n\n    return {diyfp::normalize(v), w_minus, w_plus};\n}\n\n// Given normalized diyfp w, Grisu needs to find a (normalized) cached\n// power-of-ten c, such that the exponent of the product c * w = f * 2^e lies\n// within a certain range [alpha, gamma] (Definition 3.2 from [1])\n//\n//      alpha <= e = e_c + e_w + q <= gamma\n//\n// or\n//\n//      f_c * f_w * 2^alpha <= f_c 2^(e_c) * f_w 2^(e_w) * 2^q\n//                          <= f_c * f_w * 2^gamma\n//\n// Since c and w are normalized, i.e. 2^(q-1) <= f < 2^q, this implies\n//\n//      2^(q-1) * 2^(q-1) * 2^alpha <= c * w * 2^q < 2^q * 2^q * 2^gamma\n//\n// or\n//\n//      2^(q - 2 + alpha) <= c * w < 2^(q + gamma)\n//\n// The choice of (alpha,gamma) determines the size of the table and the form of\n// the digit generation procedure. Using (alpha,gamma)=(-60,-32) works out well\n// in practice:\n//\n// The idea is to cut the number c * w = f * 2^e into two parts, which can be\n// processed independently: An integral part p1, and a fractional part p2:\n//\n//      f * 2^e = ( (f div 2^-e) * 2^-e + (f mod 2^-e) ) * 2^e\n//              = (f div 2^-e) + (f mod 2^-e) * 2^e\n//              = p1 + p2 * 2^e\n//\n// The conversion of p1 into decimal form requires a series of divisions and\n// modulos by (a power of) 10. These operations are faster for 32-bit than for\n// 64-bit integers, so p1 should ideally fit into a 32-bit integer. This can be\n// achieved by choosing\n//\n//      -e >= 32   or   e <= -32 := gamma\n//\n// In order to convert the fractional part\n//\n//      p2 * 2^e = p2 / 2^-e = d[-1] / 10^1 + d[-2] / 10^2 + ...\n//\n// into decimal form, the fraction is repeatedly multiplied by 10 and the digits\n// d[-i] are extracted in order:\n//\n//      (10 * p2) div 2^-e = d[-1]\n//      (10 * p2) mod 2^-e = d[-2] / 10^1 + ...\n//\n// The multiplication by 10 must not overflow. It is sufficient to choose\n//\n//      10 * p2 < 16 * p2 = 2^4 * p2 <= 2^64.\n//\n// Since p2 = f mod 2^-e < 2^-e,\n//\n//      -e <= 60   or   e >= -60 := alpha\n\nconstexpr int kAlpha = -60;\nconstexpr int kGamma = -32;\n\nstruct cached_power // c = f * 2^e ~= 10^k\n{\n    std::uint64_t f;\n    int e;\n    int k;\n};\n\n/*!\nFor a normalized diyfp w = f * 2^e, this function returns a (normalized) cached\npower-of-ten c = f_c * 2^e_c, such that the exponent of the product w * c\nsatisfies (Definition 3.2 from [1])\n\n     alpha <= e_c + e + q <= gamma.\n*/\ninline cached_power get_cached_power_for_binary_exponent(int e)\n{\n    // Now\n    //\n    //      alpha <= e_c + e + q <= gamma                                    (1)\n    //      ==> f_c * 2^alpha <= c * 2^e * 2^q\n    //\n    // and since the c's are normalized, 2^(q-1) <= f_c,\n    //\n    //      ==> 2^(q - 1 + alpha) <= c * 2^(e + q)\n    //      ==> 2^(alpha - e - 1) <= c\n    //\n    // If c were an exact power of ten, i.e. c = 10^k, one may determine k as\n    //\n    //      k = ceil( log_10( 2^(alpha - e - 1) ) )\n    //        = ceil( (alpha - e - 1) * log_10(2) )\n    //\n    // From the paper:\n    // \"In theory the result of the procedure could be wrong since c is rounded,\n    //  and the computation itself is approximated [...]. In practice, however,\n    //  this simple function is sufficient.\"\n    //\n    // For IEEE double precision floating-point numbers converted into\n    // normalized diyfp's w = f * 2^e, with q = 64,\n    //\n    //      e >= -1022      (min IEEE exponent)\n    //           -52        (p - 1)\n    //           -52        (p - 1, possibly normalize denormal IEEE numbers)\n    //           -11        (normalize the diyfp)\n    //         = -1137\n    //\n    // and\n    //\n    //      e <= +1023      (max IEEE exponent)\n    //           -52        (p - 1)\n    //           -11        (normalize the diyfp)\n    //         = 960\n    //\n    // This binary exponent range [-1137,960] results in a decimal exponent\n    // range [-307,324]. One does not need to store a cached power for each\n    // k in this range. For each such k it suffices to find a cached power\n    // such that the exponent of the product lies in [alpha,gamma].\n    // This implies that the difference of the decimal exponents of adjacent\n    // table entries must be less than or equal to\n    //\n    //      floor( (gamma - alpha) * log_10(2) ) = 8.\n    //\n    // (A smaller distance gamma-alpha would require a larger table.)\n\n    // NB:\n    // Actually this function returns c, such that -60 <= e_c + e + 64 <= -34.\n\n    constexpr int kCachedPowersMinDecExp = -300;\n    constexpr int kCachedPowersDecStep = 8;\n\n    static constexpr std::array<cached_power, 79> kCachedPowers =\n    {\n        {\n            { 0xAB70FE17C79AC6CA, -1060, -300 },\n            { 0xFF77B1FCBEBCDC4F, -1034, -292 },\n            { 0xBE5691EF416BD60C, -1007, -284 },\n            { 0x8DD01FAD907FFC3C,  -980, -276 },\n            { 0xD3515C2831559A83,  -954, -268 },\n            { 0x9D71AC8FADA6C9B5,  -927, -260 },\n            { 0xEA9C227723EE8BCB,  -901, -252 },\n            { 0xAECC49914078536D,  -874, -244 },\n            { 0x823C12795DB6CE57,  -847, -236 },\n            { 0xC21094364DFB5637,  -821, -228 },\n            { 0x9096EA6F3848984F,  -794, -220 },\n            { 0xD77485CB25823AC7,  -768, -212 },\n            { 0xA086CFCD97BF97F4,  -741, -204 },\n            { 0xEF340A98172AACE5,  -715, -196 },\n            { 0xB23867FB2A35B28E,  -688, -188 },\n            { 0x84C8D4DFD2C63F3B,  -661, -180 },\n            { 0xC5DD44271AD3CDBA,  -635, -172 },\n            { 0x936B9FCEBB25C996,  -608, -164 },\n            { 0xDBAC6C247D62A584,  -582, -156 },\n            { 0xA3AB66580D5FDAF6,  -555, -148 },\n            { 0xF3E2F893DEC3F126,  -529, -140 },\n            { 0xB5B5ADA8AAFF80B8,  -502, -132 },\n            { 0x87625F056C7C4A8B,  -475, -124 },\n            { 0xC9BCFF6034C13053,  -449, -116 },\n            { 0x964E858C91BA2655,  -422, -108 },\n            { 0xDFF9772470297EBD,  -396, -100 },\n            { 0xA6DFBD9FB8E5B88F,  -369,  -92 },\n            { 0xF8A95FCF88747D94,  -343,  -84 },\n            { 0xB94470938FA89BCF,  -316,  -76 },\n            { 0x8A08F0F8BF0F156B,  -289,  -68 },\n            { 0xCDB02555653131B6,  -263,  -60 },\n            { 0x993FE2C6D07B7FAC,  -236,  -52 },\n            { 0xE45C10C42A2B3B06,  -210,  -44 },\n            { 0xAA242499697392D3,  -183,  -36 },\n            { 0xFD87B5F28300CA0E,  -157,  -28 },\n            { 0xBCE5086492111AEB,  -130,  -20 },\n            { 0x8CBCCC096F5088CC,  -103,  -12 },\n            { 0xD1B71758E219652C,   -77,   -4 },\n            { 0x9C40000000000000,   -50,    4 },\n            { 0xE8D4A51000000000,   -24,   12 },\n            { 0xAD78EBC5AC620000,     3,   20 },\n            { 0x813F3978F8940984,    30,   28 },\n            { 0xC097CE7BC90715B3,    56,   36 },\n            { 0x8F7E32CE7BEA5C70,    83,   44 },\n            { 0xD5D238A4ABE98068,   109,   52 },\n            { 0x9F4F2726179A2245,   136,   60 },\n            { 0xED63A231D4C4FB27,   162,   68 },\n            { 0xB0DE65388CC8ADA8,   189,   76 },\n            { 0x83C7088E1AAB65DB,   216,   84 },\n            { 0xC45D1DF942711D9A,   242,   92 },\n            { 0x924D692CA61BE758,   269,  100 },\n            { 0xDA01EE641A708DEA,   295,  108 },\n            { 0xA26DA3999AEF774A,   322,  116 },\n            { 0xF209787BB47D6B85,   348,  124 },\n            { 0xB454E4A179DD1877,   375,  132 },\n            { 0x865B86925B9BC5C2,   402,  140 },\n            { 0xC83553C5C8965D3D,   428,  148 },\n            { 0x952AB45CFA97A0B3,   455,  156 },\n            { 0xDE469FBD99A05FE3,   481,  164 },\n            { 0xA59BC234DB398C25,   508,  172 },\n            { 0xF6C69A72A3989F5C,   534,  180 },\n            { 0xB7DCBF5354E9BECE,   561,  188 },\n            { 0x88FCF317F22241E2,   588,  196 },\n            { 0xCC20CE9BD35C78A5,   614,  204 },\n            { 0x98165AF37B2153DF,   641,  212 },\n            { 0xE2A0B5DC971F303A,   667,  220 },\n            { 0xA8D9D1535CE3B396,   694,  228 },\n            { 0xFB9B7CD9A4A7443C,   720,  236 },\n            { 0xBB764C4CA7A44410,   747,  244 },\n            { 0x8BAB8EEFB6409C1A,   774,  252 },\n            { 0xD01FEF10A657842C,   800,  260 },\n            { 0x9B10A4E5E9913129,   827,  268 },\n            { 0xE7109BFBA19C0C9D,   853,  276 },\n            { 0xAC2820D9623BF429,   880,  284 },\n            { 0x80444B5E7AA7CF85,   907,  292 },\n            { 0xBF21E44003ACDD2D,   933,  300 },\n            { 0x8E679C2F5E44FF8F,   960,  308 },\n            { 0xD433179D9C8CB841,   986,  316 },\n            { 0x9E19DB92B4E31BA9,  1013,  324 },\n        }\n    };\n\n    // This computation gives exactly the same results for k as\n    //      k = ceil((kAlpha - e - 1) * 0.30102999566398114)\n    // for |e| <= 1500, but doesn't require floating-point operations.\n    // NB: log_10(2) ~= 78913 / 2^18\n    JSON_ASSERT(e >= -1500);\n    JSON_ASSERT(e <=  1500);\n    const int f = kAlpha - e - 1;\n    const int k = (f * 78913) / (1 << 18) + static_cast<int>(f > 0);\n\n    const int index = (-kCachedPowersMinDecExp + k + (kCachedPowersDecStep - 1)) / kCachedPowersDecStep;\n    JSON_ASSERT(index >= 0);\n    JSON_ASSERT(static_cast<std::size_t>(index) < kCachedPowers.size());\n\n    const cached_power cached = kCachedPowers[static_cast<std::size_t>(index)];\n    JSON_ASSERT(kAlpha <= cached.e + e + 64);\n    JSON_ASSERT(kGamma >= cached.e + e + 64);\n\n    return cached;\n}\n\n/*!\nFor n != 0, returns k, such that pow10 := 10^(k-1) <= n < 10^k.\nFor n == 0, returns 1 and sets pow10 := 1.\n*/\ninline int find_largest_pow10(const std::uint32_t n, std::uint32_t& pow10)\n{\n    // LCOV_EXCL_START\n    if (n >= 1000000000)\n    {\n        pow10 = 1000000000;\n        return 10;\n    }\n    // LCOV_EXCL_STOP\n    else if (n >= 100000000)\n    {\n        pow10 = 100000000;\n        return  9;\n    }\n    else if (n >= 10000000)\n    {\n        pow10 = 10000000;\n        return  8;\n    }\n    else if (n >= 1000000)\n    {\n        pow10 = 1000000;\n        return  7;\n    }\n    else if (n >= 100000)\n    {\n        pow10 = 100000;\n        return  6;\n    }\n    else if (n >= 10000)\n    {\n        pow10 = 10000;\n        return  5;\n    }\n    else if (n >= 1000)\n    {\n        pow10 = 1000;\n        return  4;\n    }\n    else if (n >= 100)\n    {\n        pow10 = 100;\n        return  3;\n    }\n    else if (n >= 10)\n    {\n        pow10 = 10;\n        return  2;\n    }\n    else\n    {\n        pow10 = 1;\n        return 1;\n    }\n}\n\ninline void grisu2_round(char* buf, int len, std::uint64_t dist, std::uint64_t delta,\n                         std::uint64_t rest, std::uint64_t ten_k)\n{\n    JSON_ASSERT(len >= 1);\n    JSON_ASSERT(dist <= delta);\n    JSON_ASSERT(rest <= delta);\n    JSON_ASSERT(ten_k > 0);\n\n    //               <--------------------------- delta ---->\n    //                                  <---- dist --------->\n    // --------------[------------------+-------------------]--------------\n    //               M-                 w                   M+\n    //\n    //                                  ten_k\n    //                                <------>\n    //                                       <---- rest ---->\n    // --------------[------------------+----+--------------]--------------\n    //                                  w    V\n    //                                       = buf * 10^k\n    //\n    // ten_k represents a unit-in-the-last-place in the decimal representation\n    // stored in buf.\n    // Decrement buf by ten_k while this takes buf closer to w.\n\n    // The tests are written in this order to avoid overflow in unsigned\n    // integer arithmetic.\n\n    while (rest < dist\n            && delta - rest >= ten_k\n            && (rest + ten_k < dist || dist - rest > rest + ten_k - dist))\n    {\n        JSON_ASSERT(buf[len - 1] != '0');\n        buf[len - 1]--;\n        rest += ten_k;\n    }\n}\n\n/*!\nGenerates V = buffer * 10^decimal_exponent, such that M- <= V <= M+.\nM- and M+ must be normalized and share the same exponent -60 <= e <= -32.\n*/\ninline void grisu2_digit_gen(char* buffer, int& length, int& decimal_exponent,\n                             diyfp M_minus, diyfp w, diyfp M_plus)\n{\n    static_assert(kAlpha >= -60, \"internal error\");\n    static_assert(kGamma <= -32, \"internal error\");\n\n    // Generates the digits (and the exponent) of a decimal floating-point\n    // number V = buffer * 10^decimal_exponent in the range [M-, M+]. The diyfp's\n    // w, M- and M+ share the same exponent e, which satisfies alpha <= e <= gamma.\n    //\n    //               <--------------------------- delta ---->\n    //                                  <---- dist --------->\n    // --------------[------------------+-------------------]--------------\n    //               M-                 w                   M+\n    //\n    // Grisu2 generates the digits of M+ from left to right and stops as soon as\n    // V is in [M-,M+].\n\n    JSON_ASSERT(M_plus.e >= kAlpha);\n    JSON_ASSERT(M_plus.e <= kGamma);\n\n    std::uint64_t delta = diyfp::sub(M_plus, M_minus).f; // (significand of (M+ - M-), implicit exponent is e)\n    std::uint64_t dist  = diyfp::sub(M_plus, w      ).f; // (significand of (M+ - w ), implicit exponent is e)\n\n    // Split M+ = f * 2^e into two parts p1 and p2 (note: e < 0):\n    //\n    //      M+ = f * 2^e\n    //         = ((f div 2^-e) * 2^-e + (f mod 2^-e)) * 2^e\n    //         = ((p1        ) * 2^-e + (p2        )) * 2^e\n    //         = p1 + p2 * 2^e\n\n    const diyfp one(std::uint64_t{1} << -M_plus.e, M_plus.e);\n\n    auto p1 = static_cast<std::uint32_t>(M_plus.f >> -one.e); // p1 = f div 2^-e (Since -e >= 32, p1 fits into a 32-bit int.)\n    std::uint64_t p2 = M_plus.f & (one.f - 1);                    // p2 = f mod 2^-e\n\n    // 1)\n    //\n    // Generate the digits of the integral part p1 = d[n-1]...d[1]d[0]\n\n    JSON_ASSERT(p1 > 0);\n\n    std::uint32_t pow10;\n    const int k = find_largest_pow10(p1, pow10);\n\n    //      10^(k-1) <= p1 < 10^k, pow10 = 10^(k-1)\n    //\n    //      p1 = (p1 div 10^(k-1)) * 10^(k-1) + (p1 mod 10^(k-1))\n    //         = (d[k-1]         ) * 10^(k-1) + (p1 mod 10^(k-1))\n    //\n    //      M+ = p1                                             + p2 * 2^e\n    //         = d[k-1] * 10^(k-1) + (p1 mod 10^(k-1))          + p2 * 2^e\n    //         = d[k-1] * 10^(k-1) + ((p1 mod 10^(k-1)) * 2^-e + p2) * 2^e\n    //         = d[k-1] * 10^(k-1) + (                         rest) * 2^e\n    //\n    // Now generate the digits d[n] of p1 from left to right (n = k-1,...,0)\n    //\n    //      p1 = d[k-1]...d[n] * 10^n + d[n-1]...d[0]\n    //\n    // but stop as soon as\n    //\n    //      rest * 2^e = (d[n-1]...d[0] * 2^-e + p2) * 2^e <= delta * 2^e\n\n    int n = k;\n    while (n > 0)\n    {\n        // Invariants:\n        //      M+ = buffer * 10^n + (p1 + p2 * 2^e)    (buffer = 0 for n = k)\n        //      pow10 = 10^(n-1) <= p1 < 10^n\n        //\n        const std::uint32_t d = p1 / pow10;  // d = p1 div 10^(n-1)\n        const std::uint32_t r = p1 % pow10;  // r = p1 mod 10^(n-1)\n        //\n        //      M+ = buffer * 10^n + (d * 10^(n-1) + r) + p2 * 2^e\n        //         = (buffer * 10 + d) * 10^(n-1) + (r + p2 * 2^e)\n        //\n        JSON_ASSERT(d <= 9);\n        buffer[length++] = static_cast<char>('0' + d); // buffer := buffer * 10 + d\n        //\n        //      M+ = buffer * 10^(n-1) + (r + p2 * 2^e)\n        //\n        p1 = r;\n        n--;\n        //\n        //      M+ = buffer * 10^n + (p1 + p2 * 2^e)\n        //      pow10 = 10^n\n        //\n\n        // Now check if enough digits have been generated.\n        // Compute\n        //\n        //      p1 + p2 * 2^e = (p1 * 2^-e + p2) * 2^e = rest * 2^e\n        //\n        // Note:\n        // Since rest and delta share the same exponent e, it suffices to\n        // compare the significands.\n        const std::uint64_t rest = (std::uint64_t{p1} << -one.e) + p2;\n        if (rest <= delta)\n        {\n            // V = buffer * 10^n, with M- <= V <= M+.\n\n            decimal_exponent += n;\n\n            // We may now just stop. But instead look if the buffer could be\n            // decremented to bring V closer to w.\n            //\n            // pow10 = 10^n is now 1 ulp in the decimal representation V.\n            // The rounding procedure works with diyfp's with an implicit\n            // exponent of e.\n            //\n            //      10^n = (10^n * 2^-e) * 2^e = ulp * 2^e\n            //\n            const std::uint64_t ten_n = std::uint64_t{pow10} << -one.e;\n            grisu2_round(buffer, length, dist, delta, rest, ten_n);\n\n            return;\n        }\n\n        pow10 /= 10;\n        //\n        //      pow10 = 10^(n-1) <= p1 < 10^n\n        // Invariants restored.\n    }\n\n    // 2)\n    //\n    // The digits of the integral part have been generated:\n    //\n    //      M+ = d[k-1]...d[1]d[0] + p2 * 2^e\n    //         = buffer            + p2 * 2^e\n    //\n    // Now generate the digits of the fractional part p2 * 2^e.\n    //\n    // Note:\n    // No decimal point is generated: the exponent is adjusted instead.\n    //\n    // p2 actually represents the fraction\n    //\n    //      p2 * 2^e\n    //          = p2 / 2^-e\n    //          = d[-1] / 10^1 + d[-2] / 10^2 + ...\n    //\n    // Now generate the digits d[-m] of p1 from left to right (m = 1,2,...)\n    //\n    //      p2 * 2^e = d[-1]d[-2]...d[-m] * 10^-m\n    //                      + 10^-m * (d[-m-1] / 10^1 + d[-m-2] / 10^2 + ...)\n    //\n    // using\n    //\n    //      10^m * p2 = ((10^m * p2) div 2^-e) * 2^-e + ((10^m * p2) mod 2^-e)\n    //                = (                   d) * 2^-e + (                   r)\n    //\n    // or\n    //      10^m * p2 * 2^e = d + r * 2^e\n    //\n    // i.e.\n    //\n    //      M+ = buffer + p2 * 2^e\n    //         = buffer + 10^-m * (d + r * 2^e)\n    //         = (buffer * 10^m + d) * 10^-m + 10^-m * r * 2^e\n    //\n    // and stop as soon as 10^-m * r * 2^e <= delta * 2^e\n\n    JSON_ASSERT(p2 > delta);\n\n    int m = 0;\n    for (;;)\n    {\n        // Invariant:\n        //      M+ = buffer * 10^-m + 10^-m * (d[-m-1] / 10 + d[-m-2] / 10^2 + ...) * 2^e\n        //         = buffer * 10^-m + 10^-m * (p2                                 ) * 2^e\n        //         = buffer * 10^-m + 10^-m * (1/10 * (10 * p2)                   ) * 2^e\n        //         = buffer * 10^-m + 10^-m * (1/10 * ((10*p2 div 2^-e) * 2^-e + (10*p2 mod 2^-e)) * 2^e\n        //\n        JSON_ASSERT(p2 <= (std::numeric_limits<std::uint64_t>::max)() / 10);\n        p2 *= 10;\n        const std::uint64_t d = p2 >> -one.e;     // d = (10 * p2) div 2^-e\n        const std::uint64_t r = p2 & (one.f - 1); // r = (10 * p2) mod 2^-e\n        //\n        //      M+ = buffer * 10^-m + 10^-m * (1/10 * (d * 2^-e + r) * 2^e\n        //         = buffer * 10^-m + 10^-m * (1/10 * (d + r * 2^e))\n        //         = (buffer * 10 + d) * 10^(-m-1) + 10^(-m-1) * r * 2^e\n        //\n        JSON_ASSERT(d <= 9);\n        buffer[length++] = static_cast<char>('0' + d); // buffer := buffer * 10 + d\n        //\n        //      M+ = buffer * 10^(-m-1) + 10^(-m-1) * r * 2^e\n        //\n        p2 = r;\n        m++;\n        //\n        //      M+ = buffer * 10^-m + 10^-m * p2 * 2^e\n        // Invariant restored.\n\n        // Check if enough digits have been generated.\n        //\n        //      10^-m * p2 * 2^e <= delta * 2^e\n        //              p2 * 2^e <= 10^m * delta * 2^e\n        //                    p2 <= 10^m * delta\n        delta *= 10;\n        dist  *= 10;\n        if (p2 <= delta)\n        {\n            break;\n        }\n    }\n\n    // V = buffer * 10^-m, with M- <= V <= M+.\n\n    decimal_exponent -= m;\n\n    // 1 ulp in the decimal representation is now 10^-m.\n    // Since delta and dist are now scaled by 10^m, we need to do the\n    // same with ulp in order to keep the units in sync.\n    //\n    //      10^m * 10^-m = 1 = 2^-e * 2^e = ten_m * 2^e\n    //\n    const std::uint64_t ten_m = one.f;\n    grisu2_round(buffer, length, dist, delta, p2, ten_m);\n\n    // By construction this algorithm generates the shortest possible decimal\n    // number (Loitsch, Theorem 6.2) which rounds back to w.\n    // For an input number of precision p, at least\n    //\n    //      N = 1 + ceil(p * log_10(2))\n    //\n    // decimal digits are sufficient to identify all binary floating-point\n    // numbers (Matula, \"In-and-Out conversions\").\n    // This implies that the algorithm does not produce more than N decimal\n    // digits.\n    //\n    //      N = 17 for p = 53 (IEEE double precision)\n    //      N = 9  for p = 24 (IEEE single precision)\n}\n\n/*!\nv = buf * 10^decimal_exponent\nlen is the length of the buffer (number of decimal digits)\nThe buffer must be large enough, i.e. >= max_digits10.\n*/\nJSON_HEDLEY_NON_NULL(1)\ninline void grisu2(char* buf, int& len, int& decimal_exponent,\n                   diyfp m_minus, diyfp v, diyfp m_plus)\n{\n    JSON_ASSERT(m_plus.e == m_minus.e);\n    JSON_ASSERT(m_plus.e == v.e);\n\n    //  --------(-----------------------+-----------------------)--------    (A)\n    //          m-                      v                       m+\n    //\n    //  --------------------(-----------+-----------------------)--------    (B)\n    //                      m-          v                       m+\n    //\n    // First scale v (and m- and m+) such that the exponent is in the range\n    // [alpha, gamma].\n\n    const cached_power cached = get_cached_power_for_binary_exponent(m_plus.e);\n\n    const diyfp c_minus_k(cached.f, cached.e); // = c ~= 10^-k\n\n    // The exponent of the products is = v.e + c_minus_k.e + q and is in the range [alpha,gamma]\n    const diyfp w       = diyfp::mul(v,       c_minus_k);\n    const diyfp w_minus = diyfp::mul(m_minus, c_minus_k);\n    const diyfp w_plus  = diyfp::mul(m_plus,  c_minus_k);\n\n    //  ----(---+---)---------------(---+---)---------------(---+---)----\n    //          w-                      w                       w+\n    //          = c*m-                  = c*v                   = c*m+\n    //\n    // diyfp::mul rounds its result and c_minus_k is approximated too. w, w- and\n    // w+ are now off by a small amount.\n    // In fact:\n    //\n    //      w - v * 10^k < 1 ulp\n    //\n    // To account for this inaccuracy, add resp. subtract 1 ulp.\n    //\n    //  --------+---[---------------(---+---)---------------]---+--------\n    //          w-  M-                  w                   M+  w+\n    //\n    // Now any number in [M-, M+] (bounds included) will round to w when input,\n    // regardless of how the input rounding algorithm breaks ties.\n    //\n    // And digit_gen generates the shortest possible such number in [M-, M+].\n    // Note that this does not mean that Grisu2 always generates the shortest\n    // possible number in the interval (m-, m+).\n    const diyfp M_minus(w_minus.f + 1, w_minus.e);\n    const diyfp M_plus (w_plus.f  - 1, w_plus.e );\n\n    decimal_exponent = -cached.k; // = -(-k) = k\n\n    grisu2_digit_gen(buf, len, decimal_exponent, M_minus, w, M_plus);\n}\n\n/*!\nv = buf * 10^decimal_exponent\nlen is the length of the buffer (number of decimal digits)\nThe buffer must be large enough, i.e. >= max_digits10.\n*/\ntemplate<typename FloatType>\nJSON_HEDLEY_NON_NULL(1)\nvoid grisu2(char* buf, int& len, int& decimal_exponent, FloatType value)\n{\n    static_assert(diyfp::kPrecision >= std::numeric_limits<FloatType>::digits + 3,\n                  \"internal error: not enough precision\");\n\n    JSON_ASSERT(std::isfinite(value));\n    JSON_ASSERT(value > 0);\n\n    // If the neighbors (and boundaries) of 'value' are always computed for double-precision\n    // numbers, all float's can be recovered using strtod (and strtof). However, the resulting\n    // decimal representations are not exactly \"short\".\n    //\n    // The documentation for 'std::to_chars' (https://en.cppreference.com/w/cpp/utility/to_chars)\n    // says \"value is converted to a string as if by std::sprintf in the default (\"C\") locale\"\n    // and since sprintf promotes float's to double's, I think this is exactly what 'std::to_chars'\n    // does.\n    // On the other hand, the documentation for 'std::to_chars' requires that \"parsing the\n    // representation using the corresponding std::from_chars function recovers value exactly\". That\n    // indicates that single precision floating-point numbers should be recovered using\n    // 'std::strtof'.\n    //\n    // NB: If the neighbors are computed for single-precision numbers, there is a single float\n    //     (7.0385307e-26f) which can't be recovered using strtod. The resulting double precision\n    //     value is off by 1 ulp.\n#if 0\n    const boundaries w = compute_boundaries(static_cast<double>(value));\n#else\n    const boundaries w = compute_boundaries(value);\n#endif\n\n    grisu2(buf, len, decimal_exponent, w.minus, w.w, w.plus);\n}\n\n/*!\n@brief appends a decimal representation of e to buf\n@return a pointer to the element following the exponent.\n@pre -1000 < e < 1000\n*/\nJSON_HEDLEY_NON_NULL(1)\nJSON_HEDLEY_RETURNS_NON_NULL\ninline char* append_exponent(char* buf, int e)\n{\n    JSON_ASSERT(e > -1000);\n    JSON_ASSERT(e <  1000);\n\n    if (e < 0)\n    {\n        e = -e;\n        *buf++ = '-';\n    }\n    else\n    {\n        *buf++ = '+';\n    }\n\n    auto k = static_cast<std::uint32_t>(e);\n    if (k < 10)\n    {\n        // Always print at least two digits in the exponent.\n        // This is for compatibility with printf(\"%g\").\n        *buf++ = '0';\n        *buf++ = static_cast<char>('0' + k);\n    }\n    else if (k < 100)\n    {\n        *buf++ = static_cast<char>('0' + k / 10);\n        k %= 10;\n        *buf++ = static_cast<char>('0' + k);\n    }\n    else\n    {\n        *buf++ = static_cast<char>('0' + k / 100);\n        k %= 100;\n        *buf++ = static_cast<char>('0' + k / 10);\n        k %= 10;\n        *buf++ = static_cast<char>('0' + k);\n    }\n\n    return buf;\n}\n\n/*!\n@brief prettify v = buf * 10^decimal_exponent\n\nIf v is in the range [10^min_exp, 10^max_exp) it will be printed in fixed-point\nnotation. Otherwise it will be printed in exponential notation.\n\n@pre min_exp < 0\n@pre max_exp > 0\n*/\nJSON_HEDLEY_NON_NULL(1)\nJSON_HEDLEY_RETURNS_NON_NULL\ninline char* format_buffer(char* buf, int len, int decimal_exponent,\n                           int min_exp, int max_exp)\n{\n    JSON_ASSERT(min_exp < 0);\n    JSON_ASSERT(max_exp > 0);\n\n    const int k = len;\n    const int n = len + decimal_exponent;\n\n    // v = buf * 10^(n-k)\n    // k is the length of the buffer (number of decimal digits)\n    // n is the position of the decimal point relative to the start of the buffer.\n\n    if (k <= n && n <= max_exp)\n    {\n        // digits[000]\n        // len <= max_exp + 2\n\n        std::memset(buf + k, '0', static_cast<size_t>(n) - static_cast<size_t>(k));\n        // Make it look like a floating-point number (#362, #378)\n        buf[n + 0] = '.';\n        buf[n + 1] = '0';\n        return buf + (static_cast<size_t>(n) + 2);\n    }\n\n    if (0 < n && n <= max_exp)\n    {\n        // dig.its\n        // len <= max_digits10 + 1\n\n        JSON_ASSERT(k > n);\n\n        std::memmove(buf + (static_cast<size_t>(n) + 1), buf + n, static_cast<size_t>(k) - static_cast<size_t>(n));\n        buf[n] = '.';\n        return buf + (static_cast<size_t>(k) + 1U);\n    }\n\n    if (min_exp < n && n <= 0)\n    {\n        // 0.[000]digits\n        // len <= 2 + (-min_exp - 1) + max_digits10\n\n        std::memmove(buf + (2 + static_cast<size_t>(-n)), buf, static_cast<size_t>(k));\n        buf[0] = '0';\n        buf[1] = '.';\n        std::memset(buf + 2, '0', static_cast<size_t>(-n));\n        return buf + (2U + static_cast<size_t>(-n) + static_cast<size_t>(k));\n    }\n\n    if (k == 1)\n    {\n        // dE+123\n        // len <= 1 + 5\n\n        buf += 1;\n    }\n    else\n    {\n        // d.igitsE+123\n        // len <= max_digits10 + 1 + 5\n\n        std::memmove(buf + 2, buf + 1, static_cast<size_t>(k) - 1);\n        buf[1] = '.';\n        buf += 1 + static_cast<size_t>(k);\n    }\n\n    *buf++ = 'e';\n    return append_exponent(buf, n - 1);\n}\n\n} // namespace dtoa_impl\n\n/*!\n@brief generates a decimal representation of the floating-point number value in [first, last).\n\nThe format of the resulting decimal representation is similar to printf's %g\nformat. Returns an iterator pointing past-the-end of the decimal representation.\n\n@note The input number must be finite, i.e. NaN's and Inf's are not supported.\n@note The buffer must be large enough.\n@note The result is NOT null-terminated.\n*/\ntemplate<typename FloatType>\nJSON_HEDLEY_NON_NULL(1, 2)\nJSON_HEDLEY_RETURNS_NON_NULL\nchar* to_chars(char* first, const char* last, FloatType value)\n{\n    static_cast<void>(last); // maybe unused - fix warning\n    JSON_ASSERT(std::isfinite(value));\n\n    // Use signbit(value) instead of (value < 0) since signbit works for -0.\n    if (std::signbit(value))\n    {\n        value = -value;\n        *first++ = '-';\n    }\n\n    if (value == 0) // +-0\n    {\n        *first++ = '0';\n        // Make it look like a floating-point number (#362, #378)\n        *first++ = '.';\n        *first++ = '0';\n        return first;\n    }\n\n    JSON_ASSERT(last - first >= std::numeric_limits<FloatType>::max_digits10);\n\n    // Compute v = buffer * 10^decimal_exponent.\n    // The decimal digits are stored in the buffer, which needs to be interpreted\n    // as an unsigned decimal integer.\n    // len is the length of the buffer, i.e. the number of decimal digits.\n    int len = 0;\n    int decimal_exponent = 0;\n    dtoa_impl::grisu2(first, len, decimal_exponent, value);\n\n    JSON_ASSERT(len <= std::numeric_limits<FloatType>::max_digits10);\n\n    // Format the buffer like printf(\"%.*g\", prec, value)\n    constexpr int kMinExp = -4;\n    // Use digits10 here to increase compatibility with version 2.\n    constexpr int kMaxExp = std::numeric_limits<FloatType>::digits10;\n\n    JSON_ASSERT(last - first >= kMaxExp + 2);\n    JSON_ASSERT(last - first >= 2 + (-kMinExp - 1) + std::numeric_limits<FloatType>::max_digits10);\n    JSON_ASSERT(last - first >= std::numeric_limits<FloatType>::max_digits10 + 6);\n\n    return dtoa_impl::format_buffer(first, len, decimal_exponent, kMinExp, kMaxExp);\n}\n\n} // namespace detail\n} // namespace nlohmann\n\n// #include <nlohmann/detail/exceptions.hpp>\n\n// #include <nlohmann/detail/macro_scope.hpp>\n\n// #include <nlohmann/detail/meta/cpp_future.hpp>\n\n// #include <nlohmann/detail/output/binary_writer.hpp>\n\n// #include <nlohmann/detail/output/output_adapters.hpp>\n\n// #include <nlohmann/detail/value_t.hpp>\n\n\nnamespace nlohmann\n{\nnamespace detail\n{\n///////////////////\n// serialization //\n///////////////////\n\n/// how to treat decoding errors\nenum class error_handler_t\n{\n    strict,  ///< throw a type_error exception in case of invalid UTF-8\n    replace, ///< replace invalid UTF-8 sequences with U+FFFD\n    ignore   ///< ignore invalid UTF-8 sequences\n};\n\ntemplate<typename BasicJsonType>\nclass serializer\n{\n    using string_t = typename BasicJsonType::string_t;\n    using number_float_t = typename BasicJsonType::number_float_t;\n    using number_integer_t = typename BasicJsonType::number_integer_t;\n    using number_unsigned_t = typename BasicJsonType::number_unsigned_t;\n    using binary_char_t = typename BasicJsonType::binary_t::value_type;\n    static constexpr std::uint8_t UTF8_ACCEPT = 0;\n    static constexpr std::uint8_t UTF8_REJECT = 1;\n\n  public:\n    /*!\n    @param[in] s  output stream to serialize to\n    @param[in] ichar  indentation character to use\n    @param[in] error_handler_  how to react on decoding errors\n    */\n    serializer(output_adapter_t<char> s, const char ichar,\n               error_handler_t error_handler_ = error_handler_t::strict)\n        : o(std::move(s))\n        , loc(std::localeconv())\n        , thousands_sep(loc->thousands_sep == nullptr ? '\\0' : std::char_traits<char>::to_char_type(* (loc->thousands_sep)))\n        , decimal_point(loc->decimal_point == nullptr ? '\\0' : std::char_traits<char>::to_char_type(* (loc->decimal_point)))\n        , indent_char(ichar)\n        , indent_string(512, indent_char)\n        , error_handler(error_handler_)\n    {}\n\n    // delete because of pointer members\n    serializer(const serializer&) = delete;\n    serializer& operator=(const serializer&) = delete;\n    serializer(serializer&&) = delete;\n    serializer& operator=(serializer&&) = delete;\n    ~serializer() = default;\n\n    /*!\n    @brief internal implementation of the serialization function\n\n    This function is called by the public member function dump and organizes\n    the serialization internally. The indentation level is propagated as\n    additional parameter. In case of arrays and objects, the function is\n    called recursively.\n\n    - strings and object keys are escaped using `escape_string()`\n    - integer numbers are converted implicitly via `operator<<`\n    - floating-point numbers are converted to a string using `\"%g\"` format\n    - binary values are serialized as objects containing the subtype and the\n      byte array\n\n    @param[in] val               value to serialize\n    @param[in] pretty_print      whether the output shall be pretty-printed\n    @param[in] ensure_ascii If @a ensure_ascii is true, all non-ASCII characters\n    in the output are escaped with `\\uXXXX` sequences, and the result consists\n    of ASCII characters only.\n    @param[in] indent_step       the indent level\n    @param[in] current_indent    the current indent level (only used internally)\n    */\n    void dump(const BasicJsonType& val,\n              const bool pretty_print,\n              const bool ensure_ascii,\n              const unsigned int indent_step,\n              const unsigned int current_indent = 0)\n    {\n        switch (val.m_type)\n        {\n            case value_t::object:\n            {\n                if (val.m_value.object->empty())\n                {\n                    o->write_characters(\"{}\", 2);\n                    return;\n                }\n\n                if (pretty_print)\n                {\n                    o->write_characters(\"{\\n\", 2);\n\n                    // variable to hold indentation for recursive calls\n                    const auto new_indent = current_indent + indent_step;\n                    if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent))\n                    {\n                        indent_string.resize(indent_string.size() * 2, ' ');\n                    }\n\n                    // first n-1 elements\n                    auto i = val.m_value.object->cbegin();\n                    for (std::size_t cnt = 0; cnt < val.m_value.object->size() - 1; ++cnt, ++i)\n                    {\n                        o->write_characters(indent_string.c_str(), new_indent);\n                        o->write_character('\\\"');\n                        dump_escaped(i->first, ensure_ascii);\n                        o->write_characters(\"\\\": \", 3);\n                        dump(i->second, true, ensure_ascii, indent_step, new_indent);\n                        o->write_characters(\",\\n\", 2);\n                    }\n\n                    // last element\n                    JSON_ASSERT(i != val.m_value.object->cend());\n                    JSON_ASSERT(std::next(i) == val.m_value.object->cend());\n                    o->write_characters(indent_string.c_str(), new_indent);\n                    o->write_character('\\\"');\n                    dump_escaped(i->first, ensure_ascii);\n                    o->write_characters(\"\\\": \", 3);\n                    dump(i->second, true, ensure_ascii, indent_step, new_indent);\n\n                    o->write_character('\\n');\n                    o->write_characters(indent_string.c_str(), current_indent);\n                    o->write_character('}');\n                }\n                else\n                {\n                    o->write_character('{');\n\n                    // first n-1 elements\n                    auto i = val.m_value.object->cbegin();\n                    for (std::size_t cnt = 0; cnt < val.m_value.object->size() - 1; ++cnt, ++i)\n                    {\n                        o->write_character('\\\"');\n                        dump_escaped(i->first, ensure_ascii);\n                        o->write_characters(\"\\\":\", 2);\n                        dump(i->second, false, ensure_ascii, indent_step, current_indent);\n                        o->write_character(',');\n                    }\n\n                    // last element\n                    JSON_ASSERT(i != val.m_value.object->cend());\n                    JSON_ASSERT(std::next(i) == val.m_value.object->cend());\n                    o->write_character('\\\"');\n                    dump_escaped(i->first, ensure_ascii);\n                    o->write_characters(\"\\\":\", 2);\n                    dump(i->second, false, ensure_ascii, indent_step, current_indent);\n\n                    o->write_character('}');\n                }\n\n                return;\n            }\n\n            case value_t::array:\n            {\n                if (val.m_value.array->empty())\n                {\n                    o->write_characters(\"[]\", 2);\n                    return;\n                }\n\n                if (pretty_print)\n                {\n                    o->write_characters(\"[\\n\", 2);\n\n                    // variable to hold indentation for recursive calls\n                    const auto new_indent = current_indent + indent_step;\n                    if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent))\n                    {\n                        indent_string.resize(indent_string.size() * 2, ' ');\n                    }\n\n                    // first n-1 elements\n                    for (auto i = val.m_value.array->cbegin();\n                            i != val.m_value.array->cend() - 1; ++i)\n                    {\n                        o->write_characters(indent_string.c_str(), new_indent);\n                        dump(*i, true, ensure_ascii, indent_step, new_indent);\n                        o->write_characters(\",\\n\", 2);\n                    }\n\n                    // last element\n                    JSON_ASSERT(!val.m_value.array->empty());\n                    o->write_characters(indent_string.c_str(), new_indent);\n                    dump(val.m_value.array->back(), true, ensure_ascii, indent_step, new_indent);\n\n                    o->write_character('\\n');\n                    o->write_characters(indent_string.c_str(), current_indent);\n                    o->write_character(']');\n                }\n                else\n                {\n                    o->write_character('[');\n\n                    // first n-1 elements\n                    for (auto i = val.m_value.array->cbegin();\n                            i != val.m_value.array->cend() - 1; ++i)\n                    {\n                        dump(*i, false, ensure_ascii, indent_step, current_indent);\n                        o->write_character(',');\n                    }\n\n                    // last element\n                    JSON_ASSERT(!val.m_value.array->empty());\n                    dump(val.m_value.array->back(), false, ensure_ascii, indent_step, current_indent);\n\n                    o->write_character(']');\n                }\n\n                return;\n            }\n\n            case value_t::string:\n            {\n                o->write_character('\\\"');\n                dump_escaped(*val.m_value.string, ensure_ascii);\n                o->write_character('\\\"');\n                return;\n            }\n\n            case value_t::binary:\n            {\n                if (pretty_print)\n                {\n                    o->write_characters(\"{\\n\", 2);\n\n                    // variable to hold indentation for recursive calls\n                    const auto new_indent = current_indent + indent_step;\n                    if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent))\n                    {\n                        indent_string.resize(indent_string.size() * 2, ' ');\n                    }\n\n                    o->write_characters(indent_string.c_str(), new_indent);\n\n                    o->write_characters(\"\\\"bytes\\\": [\", 10);\n\n                    if (!val.m_value.binary->empty())\n                    {\n                        for (auto i = val.m_value.binary->cbegin();\n                                i != val.m_value.binary->cend() - 1; ++i)\n                        {\n                            dump_integer(*i);\n                            o->write_characters(\", \", 2);\n                        }\n                        dump_integer(val.m_value.binary->back());\n                    }\n\n                    o->write_characters(\"],\\n\", 3);\n                    o->write_characters(indent_string.c_str(), new_indent);\n\n                    o->write_characters(\"\\\"subtype\\\": \", 11);\n                    if (val.m_value.binary->has_subtype())\n                    {\n                        dump_integer(val.m_value.binary->subtype());\n                    }\n                    else\n                    {\n                        o->write_characters(\"null\", 4);\n                    }\n                    o->write_character('\\n');\n                    o->write_characters(indent_string.c_str(), current_indent);\n                    o->write_character('}');\n                }\n                else\n                {\n                    o->write_characters(\"{\\\"bytes\\\":[\", 10);\n\n                    if (!val.m_value.binary->empty())\n                    {\n                        for (auto i = val.m_value.binary->cbegin();\n                                i != val.m_value.binary->cend() - 1; ++i)\n                        {\n                            dump_integer(*i);\n                            o->write_character(',');\n                        }\n                        dump_integer(val.m_value.binary->back());\n                    }\n\n                    o->write_characters(\"],\\\"subtype\\\":\", 12);\n                    if (val.m_value.binary->has_subtype())\n                    {\n                        dump_integer(val.m_value.binary->subtype());\n                        o->write_character('}');\n                    }\n                    else\n                    {\n                        o->write_characters(\"null}\", 5);\n                    }\n                }\n                return;\n            }\n\n            case value_t::boolean:\n            {\n                if (val.m_value.boolean)\n                {\n                    o->write_characters(\"true\", 4);\n                }\n                else\n                {\n                    o->write_characters(\"false\", 5);\n                }\n                return;\n            }\n\n            case value_t::number_integer:\n            {\n                dump_integer(val.m_value.number_integer);\n                return;\n            }\n\n            case value_t::number_unsigned:\n            {\n                dump_integer(val.m_value.number_unsigned);\n                return;\n            }\n\n            case value_t::number_float:\n            {\n                dump_float(val.m_value.number_float);\n                return;\n            }\n\n            case value_t::discarded:\n            {\n                o->write_characters(\"<discarded>\", 11);\n                return;\n            }\n\n            case value_t::null:\n            {\n                o->write_characters(\"null\", 4);\n                return;\n            }\n\n            default:            // LCOV_EXCL_LINE\n                JSON_ASSERT(false);  // LCOV_EXCL_LINE\n        }\n    }\n\n  private:\n    /*!\n    @brief dump escaped string\n\n    Escape a string by replacing certain special characters by a sequence of an\n    escape character (backslash) and another character and other control\n    characters by a sequence of \"\\u\" followed by a four-digit hex\n    representation. The escaped string is written to output stream @a o.\n\n    @param[in] s  the string to escape\n    @param[in] ensure_ascii  whether to escape non-ASCII characters with\n                             \\uXXXX sequences\n\n    @complexity Linear in the length of string @a s.\n    */\n    void dump_escaped(const string_t& s, const bool ensure_ascii)\n    {\n        std::uint32_t codepoint;\n        std::uint8_t state = UTF8_ACCEPT;\n        std::size_t bytes = 0;  // number of bytes written to string_buffer\n\n        // number of bytes written at the point of the last valid byte\n        std::size_t bytes_after_last_accept = 0;\n        std::size_t undumped_chars = 0;\n\n        for (std::size_t i = 0; i < s.size(); ++i)\n        {\n            const auto byte = static_cast<uint8_t>(s[i]);\n\n            switch (decode(state, codepoint, byte))\n            {\n                case UTF8_ACCEPT:  // decode found a new code point\n                {\n                    switch (codepoint)\n                    {\n                        case 0x08: // backspace\n                        {\n                            string_buffer[bytes++] = '\\\\';\n                            string_buffer[bytes++] = 'b';\n                            break;\n                        }\n\n                        case 0x09: // horizontal tab\n                        {\n                            string_buffer[bytes++] = '\\\\';\n                            string_buffer[bytes++] = 't';\n                            break;\n                        }\n\n                        case 0x0A: // newline\n                        {\n                            string_buffer[bytes++] = '\\\\';\n                            string_buffer[bytes++] = 'n';\n                            break;\n                        }\n\n                        case 0x0C: // formfeed\n                        {\n                            string_buffer[bytes++] = '\\\\';\n                            string_buffer[bytes++] = 'f';\n                            break;\n                        }\n\n                        case 0x0D: // carriage return\n                        {\n                            string_buffer[bytes++] = '\\\\';\n                            string_buffer[bytes++] = 'r';\n                            break;\n                        }\n\n                        case 0x22: // quotation mark\n                        {\n                            string_buffer[bytes++] = '\\\\';\n                            string_buffer[bytes++] = '\\\"';\n                            break;\n                        }\n\n                        case 0x5C: // reverse solidus\n                        {\n                            string_buffer[bytes++] = '\\\\';\n                            string_buffer[bytes++] = '\\\\';\n                            break;\n                        }\n\n                        default:\n                        {\n                            // escape control characters (0x00..0x1F) or, if\n                            // ensure_ascii parameter is used, non-ASCII characters\n                            if ((codepoint <= 0x1F) || (ensure_ascii && (codepoint >= 0x7F)))\n                            {\n                                if (codepoint <= 0xFFFF)\n                                {\n                                    (std::snprintf)(string_buffer.data() + bytes, 7, \"\\\\u%04x\",\n                                                    static_cast<std::uint16_t>(codepoint));\n                                    bytes += 6;\n                                }\n                                else\n                                {\n                                    (std::snprintf)(string_buffer.data() + bytes, 13, \"\\\\u%04x\\\\u%04x\",\n                                                    static_cast<std::uint16_t>(0xD7C0u + (codepoint >> 10u)),\n                                                    static_cast<std::uint16_t>(0xDC00u + (codepoint & 0x3FFu)));\n                                    bytes += 12;\n                                }\n                            }\n                            else\n                            {\n                                // copy byte to buffer (all previous bytes\n                                // been copied have in default case above)\n                                string_buffer[bytes++] = s[i];\n                            }\n                            break;\n                        }\n                    }\n\n                    // write buffer and reset index; there must be 13 bytes\n                    // left, as this is the maximal number of bytes to be\n                    // written (\"\\uxxxx\\uxxxx\\0\") for one code point\n                    if (string_buffer.size() - bytes < 13)\n                    {\n                        o->write_characters(string_buffer.data(), bytes);\n                        bytes = 0;\n                    }\n\n                    // remember the byte position of this accept\n                    bytes_after_last_accept = bytes;\n                    undumped_chars = 0;\n                    break;\n                }\n\n                case UTF8_REJECT:  // decode found invalid UTF-8 byte\n                {\n                    switch (error_handler)\n                    {\n                        case error_handler_t::strict:\n                        {\n                            std::string sn(3, '\\0');\n                            (std::snprintf)(&sn[0], sn.size(), \"%.2X\", byte);\n                            JSON_THROW(type_error::create(316, \"invalid UTF-8 byte at index \" + std::to_string(i) + \": 0x\" + sn));\n                        }\n\n                        case error_handler_t::ignore:\n                        case error_handler_t::replace:\n                        {\n                            // in case we saw this character the first time, we\n                            // would like to read it again, because the byte\n                            // may be OK for itself, but just not OK for the\n                            // previous sequence\n                            if (undumped_chars > 0)\n                            {\n                                --i;\n                            }\n\n                            // reset length buffer to the last accepted index;\n                            // thus removing/ignoring the invalid characters\n                            bytes = bytes_after_last_accept;\n\n                            if (error_handler == error_handler_t::replace)\n                            {\n                                // add a replacement character\n                                if (ensure_ascii)\n                                {\n                                    string_buffer[bytes++] = '\\\\';\n                                    string_buffer[bytes++] = 'u';\n                                    string_buffer[bytes++] = 'f';\n                                    string_buffer[bytes++] = 'f';\n                                    string_buffer[bytes++] = 'f';\n                                    string_buffer[bytes++] = 'd';\n                                }\n                                else\n                                {\n                                    string_buffer[bytes++] = detail::binary_writer<BasicJsonType, char>::to_char_type('\\xEF');\n                                    string_buffer[bytes++] = detail::binary_writer<BasicJsonType, char>::to_char_type('\\xBF');\n                                    string_buffer[bytes++] = detail::binary_writer<BasicJsonType, char>::to_char_type('\\xBD');\n                                }\n\n                                // write buffer and reset index; there must be 13 bytes\n                                // left, as this is the maximal number of bytes to be\n                                // written (\"\\uxxxx\\uxxxx\\0\") for one code point\n                                if (string_buffer.size() - bytes < 13)\n                                {\n                                    o->write_characters(string_buffer.data(), bytes);\n                                    bytes = 0;\n                                }\n\n                                bytes_after_last_accept = bytes;\n                            }\n\n                            undumped_chars = 0;\n\n                            // continue processing the string\n                            state = UTF8_ACCEPT;\n                            break;\n                        }\n\n                        default:            // LCOV_EXCL_LINE\n                            JSON_ASSERT(false);  // LCOV_EXCL_LINE\n                    }\n                    break;\n                }\n\n                default:  // decode found yet incomplete multi-byte code point\n                {\n                    if (!ensure_ascii)\n                    {\n                        // code point will not be escaped - copy byte to buffer\n                        string_buffer[bytes++] = s[i];\n                    }\n                    ++undumped_chars;\n                    break;\n                }\n            }\n        }\n\n        // we finished processing the string\n        if (JSON_HEDLEY_LIKELY(state == UTF8_ACCEPT))\n        {\n            // write buffer\n            if (bytes > 0)\n            {\n                o->write_characters(string_buffer.data(), bytes);\n            }\n        }\n        else\n        {\n            // we finish reading, but do not accept: string was incomplete\n            switch (error_handler)\n            {\n                case error_handler_t::strict:\n                {\n                    std::string sn(3, '\\0');\n                    (std::snprintf)(&sn[0], sn.size(), \"%.2X\", static_cast<std::uint8_t>(s.back()));\n                    JSON_THROW(type_error::create(316, \"incomplete UTF-8 string; last byte: 0x\" + sn));\n                }\n\n                case error_handler_t::ignore:\n                {\n                    // write all accepted bytes\n                    o->write_characters(string_buffer.data(), bytes_after_last_accept);\n                    break;\n                }\n\n                case error_handler_t::replace:\n                {\n                    // write all accepted bytes\n                    o->write_characters(string_buffer.data(), bytes_after_last_accept);\n                    // add a replacement character\n                    if (ensure_ascii)\n                    {\n                        o->write_characters(\"\\\\ufffd\", 6);\n                    }\n                    else\n                    {\n                        o->write_characters(\"\\xEF\\xBF\\xBD\", 3);\n                    }\n                    break;\n                }\n\n                default:            // LCOV_EXCL_LINE\n                    JSON_ASSERT(false);  // LCOV_EXCL_LINE\n            }\n        }\n    }\n\n    /*!\n    @brief count digits\n\n    Count the number of decimal (base 10) digits for an input unsigned integer.\n\n    @param[in] x  unsigned integer number to count its digits\n    @return    number of decimal digits\n    */\n    inline unsigned int count_digits(number_unsigned_t x) noexcept\n    {\n        unsigned int n_digits = 1;\n        for (;;)\n        {\n            if (x < 10)\n            {\n                return n_digits;\n            }\n            if (x < 100)\n            {\n                return n_digits + 1;\n            }\n            if (x < 1000)\n            {\n                return n_digits + 2;\n            }\n            if (x < 10000)\n            {\n                return n_digits + 3;\n            }\n            x = x / 10000u;\n            n_digits += 4;\n        }\n    }\n\n    /*!\n    @brief dump an integer\n\n    Dump a given integer to output stream @a o. Works internally with\n    @a number_buffer.\n\n    @param[in] x  integer number (signed or unsigned) to dump\n    @tparam NumberType either @a number_integer_t or @a number_unsigned_t\n    */\n    template < typename NumberType, detail::enable_if_t <\n                   std::is_same<NumberType, number_unsigned_t>::value ||\n                   std::is_same<NumberType, number_integer_t>::value ||\n                   std::is_same<NumberType, binary_char_t>::value,\n                   int > = 0 >\n    void dump_integer(NumberType x)\n    {\n        static constexpr std::array<std::array<char, 2>, 100> digits_to_99\n        {\n            {\n                {{'0', '0'}}, {{'0', '1'}}, {{'0', '2'}}, {{'0', '3'}}, {{'0', '4'}}, {{'0', '5'}}, {{'0', '6'}}, {{'0', '7'}}, {{'0', '8'}}, {{'0', '9'}},\n                {{'1', '0'}}, {{'1', '1'}}, {{'1', '2'}}, {{'1', '3'}}, {{'1', '4'}}, {{'1', '5'}}, {{'1', '6'}}, {{'1', '7'}}, {{'1', '8'}}, {{'1', '9'}},\n                {{'2', '0'}}, {{'2', '1'}}, {{'2', '2'}}, {{'2', '3'}}, {{'2', '4'}}, {{'2', '5'}}, {{'2', '6'}}, {{'2', '7'}}, {{'2', '8'}}, {{'2', '9'}},\n                {{'3', '0'}}, {{'3', '1'}}, {{'3', '2'}}, {{'3', '3'}}, {{'3', '4'}}, {{'3', '5'}}, {{'3', '6'}}, {{'3', '7'}}, {{'3', '8'}}, {{'3', '9'}},\n                {{'4', '0'}}, {{'4', '1'}}, {{'4', '2'}}, {{'4', '3'}}, {{'4', '4'}}, {{'4', '5'}}, {{'4', '6'}}, {{'4', '7'}}, {{'4', '8'}}, {{'4', '9'}},\n                {{'5', '0'}}, {{'5', '1'}}, {{'5', '2'}}, {{'5', '3'}}, {{'5', '4'}}, {{'5', '5'}}, {{'5', '6'}}, {{'5', '7'}}, {{'5', '8'}}, {{'5', '9'}},\n                {{'6', '0'}}, {{'6', '1'}}, {{'6', '2'}}, {{'6', '3'}}, {{'6', '4'}}, {{'6', '5'}}, {{'6', '6'}}, {{'6', '7'}}, {{'6', '8'}}, {{'6', '9'}},\n                {{'7', '0'}}, {{'7', '1'}}, {{'7', '2'}}, {{'7', '3'}}, {{'7', '4'}}, {{'7', '5'}}, {{'7', '6'}}, {{'7', '7'}}, {{'7', '8'}}, {{'7', '9'}},\n                {{'8', '0'}}, {{'8', '1'}}, {{'8', '2'}}, {{'8', '3'}}, {{'8', '4'}}, {{'8', '5'}}, {{'8', '6'}}, {{'8', '7'}}, {{'8', '8'}}, {{'8', '9'}},\n                {{'9', '0'}}, {{'9', '1'}}, {{'9', '2'}}, {{'9', '3'}}, {{'9', '4'}}, {{'9', '5'}}, {{'9', '6'}}, {{'9', '7'}}, {{'9', '8'}}, {{'9', '9'}},\n            }\n        };\n\n        // special case for \"0\"\n        if (x == 0)\n        {\n            o->write_character('0');\n            return;\n        }\n\n        // use a pointer to fill the buffer\n        auto buffer_ptr = number_buffer.begin();\n\n        const bool is_negative = std::is_same<NumberType, number_integer_t>::value && !(x >= 0); // see issue #755\n        number_unsigned_t abs_value;\n\n        unsigned int n_chars;\n\n        if (is_negative)\n        {\n            *buffer_ptr = '-';\n            abs_value = remove_sign(static_cast<number_integer_t>(x));\n\n            // account one more byte for the minus sign\n            n_chars = 1 + count_digits(abs_value);\n        }\n        else\n        {\n            abs_value = static_cast<number_unsigned_t>(x);\n            n_chars = count_digits(abs_value);\n        }\n\n        // spare 1 byte for '\\0'\n        JSON_ASSERT(n_chars < number_buffer.size() - 1);\n\n        // jump to the end to generate the string from backward\n        // so we later avoid reversing the result\n        buffer_ptr += n_chars;\n\n        // Fast int2ascii implementation inspired by \"Fastware\" talk by Andrei Alexandrescu\n        // See: https://www.youtube.com/watch?v=o4-CwDo2zpg\n        while (abs_value >= 100)\n        {\n            const auto digits_index = static_cast<unsigned>((abs_value % 100));\n            abs_value /= 100;\n            *(--buffer_ptr) = digits_to_99[digits_index][1];\n            *(--buffer_ptr) = digits_to_99[digits_index][0];\n        }\n\n        if (abs_value >= 10)\n        {\n            const auto digits_index = static_cast<unsigned>(abs_value);\n            *(--buffer_ptr) = digits_to_99[digits_index][1];\n            *(--buffer_ptr) = digits_to_99[digits_index][0];\n        }\n        else\n        {\n            *(--buffer_ptr) = static_cast<char>('0' + abs_value);\n        }\n\n        o->write_characters(number_buffer.data(), n_chars);\n    }\n\n    /*!\n    @brief dump a floating-point number\n\n    Dump a given floating-point number to output stream @a o. Works internally\n    with @a number_buffer.\n\n    @param[in] x  floating-point number to dump\n    */\n    void dump_float(number_float_t x)\n    {\n        // NaN / inf\n        if (!std::isfinite(x))\n        {\n            o->write_characters(\"null\", 4);\n            return;\n        }\n\n        // If number_float_t is an IEEE-754 single or double precision number,\n        // use the Grisu2 algorithm to produce short numbers which are\n        // guaranteed to round-trip, using strtof and strtod, resp.\n        //\n        // NB: The test below works if <long double> == <double>.\n        static constexpr bool is_ieee_single_or_double\n            = (std::numeric_limits<number_float_t>::is_iec559 && std::numeric_limits<number_float_t>::digits == 24 && std::numeric_limits<number_float_t>::max_exponent == 128) ||\n              (std::numeric_limits<number_float_t>::is_iec559 && std::numeric_limits<number_float_t>::digits == 53 && std::numeric_limits<number_float_t>::max_exponent == 1024);\n\n        dump_float(x, std::integral_constant<bool, is_ieee_single_or_double>());\n    }\n\n    void dump_float(number_float_t x, std::true_type /*is_ieee_single_or_double*/)\n    {\n        char* begin = number_buffer.data();\n        char* end = ::nlohmann::detail::to_chars(begin, begin + number_buffer.size(), x);\n\n        o->write_characters(begin, static_cast<size_t>(end - begin));\n    }\n\n    void dump_float(number_float_t x, std::false_type /*is_ieee_single_or_double*/)\n    {\n        // get number of digits for a float -> text -> float round-trip\n        static constexpr auto d = std::numeric_limits<number_float_t>::max_digits10;\n\n        // the actual conversion\n        std::ptrdiff_t len = (std::snprintf)(number_buffer.data(), number_buffer.size(), \"%.*g\", d, x);\n\n        // negative value indicates an error\n        JSON_ASSERT(len > 0);\n        // check if buffer was large enough\n        JSON_ASSERT(static_cast<std::size_t>(len) < number_buffer.size());\n\n        // erase thousands separator\n        if (thousands_sep != '\\0')\n        {\n            const auto end = std::remove(number_buffer.begin(),\n                                         number_buffer.begin() + len, thousands_sep);\n            std::fill(end, number_buffer.end(), '\\0');\n            JSON_ASSERT((end - number_buffer.begin()) <= len);\n            len = (end - number_buffer.begin());\n        }\n\n        // convert decimal point to '.'\n        if (decimal_point != '\\0' && decimal_point != '.')\n        {\n            const auto dec_pos = std::find(number_buffer.begin(), number_buffer.end(), decimal_point);\n            if (dec_pos != number_buffer.end())\n            {\n                *dec_pos = '.';\n            }\n        }\n\n        o->write_characters(number_buffer.data(), static_cast<std::size_t>(len));\n\n        // determine if need to append \".0\"\n        const bool value_is_int_like =\n            std::none_of(number_buffer.begin(), number_buffer.begin() + len + 1,\n                         [](char c)\n        {\n            return c == '.' || c == 'e';\n        });\n\n        if (value_is_int_like)\n        {\n            o->write_characters(\".0\", 2);\n        }\n    }\n\n    /*!\n    @brief check whether a string is UTF-8 encoded\n\n    The function checks each byte of a string whether it is UTF-8 encoded. The\n    result of the check is stored in the @a state parameter. The function must\n    be called initially with state 0 (accept). State 1 means the string must\n    be rejected, because the current byte is not allowed. If the string is\n    completely processed, but the state is non-zero, the string ended\n    prematurely; that is, the last byte indicated more bytes should have\n    followed.\n\n    @param[in,out] state  the state of the decoding\n    @param[in,out] codep  codepoint (valid only if resulting state is UTF8_ACCEPT)\n    @param[in] byte       next byte to decode\n    @return               new state\n\n    @note The function has been edited: a std::array is used.\n\n    @copyright Copyright (c) 2008-2009 Bjoern Hoehrmann <bjoern@hoehrmann.de>\n    @sa http://bjoern.hoehrmann.de/utf-8/decoder/dfa/\n    */\n    static std::uint8_t decode(std::uint8_t& state, std::uint32_t& codep, const std::uint8_t byte) noexcept\n    {\n        static const std::array<std::uint8_t, 400> utf8d =\n        {\n            {\n                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 00..1F\n                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 20..3F\n                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 40..5F\n                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 60..7F\n                1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 80..9F\n                7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // A0..BF\n                8, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // C0..DF\n                0xA, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x4, 0x3, 0x3, // E0..EF\n                0xB, 0x6, 0x6, 0x6, 0x5, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, // F0..FF\n                0x0, 0x1, 0x2, 0x3, 0x5, 0x8, 0x7, 0x1, 0x1, 0x1, 0x4, 0x6, 0x1, 0x1, 0x1, 0x1, // s0..s0\n                1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, // s1..s2\n                1, 2, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, // s3..s4\n                1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 3, 1, 1, 1, 1, 1, 1, // s5..s6\n                1, 3, 1, 1, 1, 1, 1, 3, 1, 3, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // s7..s8\n            }\n        };\n\n        const std::uint8_t type = utf8d[byte];\n\n        codep = (state != UTF8_ACCEPT)\n                ? (byte & 0x3fu) | (codep << 6u)\n                : (0xFFu >> type) & (byte);\n\n        std::size_t index = 256u + static_cast<size_t>(state) * 16u + static_cast<size_t>(type);\n        JSON_ASSERT(index < 400);\n        state = utf8d[index];\n        return state;\n    }\n\n    /*\n     * Overload to make the compiler happy while it is instantiating\n     * dump_integer for number_unsigned_t.\n     * Must never be called.\n     */\n    number_unsigned_t remove_sign(number_unsigned_t x)\n    {\n        JSON_ASSERT(false); // LCOV_EXCL_LINE\n        return x; // LCOV_EXCL_LINE\n    }\n\n    /*\n     * Helper function for dump_integer\n     *\n     * This function takes a negative signed integer and returns its absolute\n     * value as unsigned integer. The plus/minus shuffling is necessary as we can\n     * not directly remove the sign of an arbitrary signed integer as the\n     * absolute values of INT_MIN and INT_MAX are usually not the same. See\n     * #1708 for details.\n     */\n    inline number_unsigned_t remove_sign(number_integer_t x) noexcept\n    {\n        JSON_ASSERT(x < 0 && x < (std::numeric_limits<number_integer_t>::max)());\n        return static_cast<number_unsigned_t>(-(x + 1)) + 1;\n    }\n\n  private:\n    /// the output of the serializer\n    output_adapter_t<char> o = nullptr;\n\n    /// a (hopefully) large enough character buffer\n    std::array<char, 64> number_buffer{{}};\n\n    /// the locale\n    const std::lconv* loc = nullptr;\n    /// the locale's thousand separator character\n    const char thousands_sep = '\\0';\n    /// the locale's decimal point character\n    const char decimal_point = '\\0';\n\n    /// string buffer\n    std::array<char, 512> string_buffer{{}};\n\n    /// the indentation character\n    const char indent_char;\n    /// the indentation string\n    string_t indent_string;\n\n    /// error_handler how to react on decoding errors\n    const error_handler_t error_handler;\n};\n}  // namespace detail\n}  // namespace nlohmann\n\n// #include <nlohmann/detail/value_t.hpp>\n\n// #include <nlohmann/json_fwd.hpp>\n\n// #include <nlohmann/ordered_map.hpp>\n\n\n#include <functional> // less\n#include <memory> // allocator\n#include <utility> // pair\n#include <vector> // vector\n\nnamespace nlohmann\n{\n\n/// ordered_map: a minimal map-like container that preserves insertion order\n/// for use within nlohmann::basic_json<ordered_map>\ntemplate <class Key, class T, class IgnoredLess = std::less<Key>,\n          class Allocator = std::allocator<std::pair<const Key, T>>>\n                  struct ordered_map : std::vector<std::pair<const Key, T>, Allocator>\n{\n    using key_type = Key;\n    using mapped_type = T;\n    using Container = std::vector<std::pair<const Key, T>, Allocator>;\n    using typename Container::iterator;\n    using typename Container::const_iterator;\n    using typename Container::size_type;\n    using typename Container::value_type;\n\n    // Explicit constructors instead of `using Container::Container`\n    // otherwise older compilers choke on it (GCC <= 5.5, xcode <= 9.4)\n    ordered_map(const Allocator& alloc = Allocator()) : Container{alloc} {}\n    template <class It>\n    ordered_map(It first, It last, const Allocator& alloc = Allocator())\n        : Container{first, last, alloc} {}\n    ordered_map(std::initializer_list<T> init, const Allocator& alloc = Allocator() )\n        : Container{init, alloc} {}\n\n    std::pair<iterator, bool> emplace(const key_type& key, T&& t)\n    {\n        for (auto it = this->begin(); it != this->end(); ++it)\n        {\n            if (it->first == key)\n            {\n                return {it, false};\n            }\n        }\n        Container::emplace_back(key, t);\n        return {--this->end(), true};\n    }\n\n    T& operator[](const Key& key)\n    {\n        return emplace(key, T{}).first->second;\n    }\n\n    const T& operator[](const Key& key) const\n    {\n        return at(key);\n    }\n\n    T& at(const Key& key)\n    {\n        for (auto it = this->begin(); it != this->end(); ++it)\n        {\n            if (it->first == key)\n            {\n                return it->second;\n            }\n        }\n\n        throw std::out_of_range(\"key not found\");\n    }\n\n    const T& at(const Key& key) const\n    {\n        for (auto it = this->begin(); it != this->end(); ++it)\n        {\n            if (it->first == key)\n            {\n                return it->second;\n            }\n        }\n\n        throw std::out_of_range(\"key not found\");\n    }\n\n    size_type erase(const Key& key)\n    {\n        for (auto it = this->begin(); it != this->end(); ++it)\n        {\n            if (it->first == key)\n            {\n                // Since we cannot move const Keys, re-construct them in place\n                for (auto next = it; ++next != this->end(); ++it)\n                {\n                    it->~value_type(); // Destroy but keep allocation\n                    new (&*it) value_type{std::move(*next)};\n                }\n                Container::pop_back();\n                return 1;\n            }\n        }\n        return 0;\n    }\n\n    iterator erase(iterator pos)\n    {\n        auto it = pos;\n\n        // Since we cannot move const Keys, re-construct them in place\n        for (auto next = it; ++next != this->end(); ++it)\n        {\n            it->~value_type(); // Destroy but keep allocation\n            new (&*it) value_type{std::move(*next)};\n        }\n        Container::pop_back();\n        return pos;\n    }\n\n    size_type count(const Key& key) const\n    {\n        for (auto it = this->begin(); it != this->end(); ++it)\n        {\n            if (it->first == key)\n            {\n                return 1;\n            }\n        }\n        return 0;\n    }\n\n    iterator find(const Key& key)\n    {\n        for (auto it = this->begin(); it != this->end(); ++it)\n        {\n            if (it->first == key)\n            {\n                return it;\n            }\n        }\n        return Container::end();\n    }\n\n    const_iterator find(const Key& key) const\n    {\n        for (auto it = this->begin(); it != this->end(); ++it)\n        {\n            if (it->first == key)\n            {\n                return it;\n            }\n        }\n        return Container::end();\n    }\n\n    std::pair<iterator, bool> insert( value_type&& value )\n    {\n        return emplace(value.first, std::move(value.second));\n    }\n\n    std::pair<iterator, bool> insert( const value_type& value )\n    {\n        for (auto it = this->begin(); it != this->end(); ++it)\n        {\n            if (it->first == value.first)\n            {\n                return {it, false};\n            }\n        }\n        Container::push_back(value);\n        return {--this->end(), true};\n    }\n};\n\n}  // namespace nlohmann\n\n\n/*!\n@brief namespace for Niels Lohmann\n@see https://github.com/nlohmann\n@since version 1.0.0\n*/\nnamespace nlohmann\n{\n\n/*!\n@brief a class to store JSON values\n\n@tparam ObjectType type for JSON objects (`std::map` by default; will be used\nin @ref object_t)\n@tparam ArrayType type for JSON arrays (`std::vector` by default; will be used\nin @ref array_t)\n@tparam StringType type for JSON strings and object keys (`std::string` by\ndefault; will be used in @ref string_t)\n@tparam BooleanType type for JSON booleans (`bool` by default; will be used\nin @ref boolean_t)\n@tparam NumberIntegerType type for JSON integer numbers (`int64_t` by\ndefault; will be used in @ref number_integer_t)\n@tparam NumberUnsignedType type for JSON unsigned integer numbers (@c\n`uint64_t` by default; will be used in @ref number_unsigned_t)\n@tparam NumberFloatType type for JSON floating-point numbers (`double` by\ndefault; will be used in @ref number_float_t)\n@tparam BinaryType type for packed binary data for compatibility with binary\nserialization formats (`std::vector<std::uint8_t>` by default; will be used in\n@ref binary_t)\n@tparam AllocatorType type of the allocator to use (`std::allocator` by\ndefault)\n@tparam JSONSerializer the serializer to resolve internal calls to `to_json()`\nand `from_json()` (@ref adl_serializer by default)\n\n@requirement The class satisfies the following concept requirements:\n- Basic\n - [DefaultConstructible](https://en.cppreference.com/w/cpp/named_req/DefaultConstructible):\n   JSON values can be default constructed. The result will be a JSON null\n   value.\n - [MoveConstructible](https://en.cppreference.com/w/cpp/named_req/MoveConstructible):\n   A JSON value can be constructed from an rvalue argument.\n - [CopyConstructible](https://en.cppreference.com/w/cpp/named_req/CopyConstructible):\n   A JSON value can be copy-constructed from an lvalue expression.\n - [MoveAssignable](https://en.cppreference.com/w/cpp/named_req/MoveAssignable):\n   A JSON value van be assigned from an rvalue argument.\n - [CopyAssignable](https://en.cppreference.com/w/cpp/named_req/CopyAssignable):\n   A JSON value can be copy-assigned from an lvalue expression.\n - [Destructible](https://en.cppreference.com/w/cpp/named_req/Destructible):\n   JSON values can be destructed.\n- Layout\n - [StandardLayoutType](https://en.cppreference.com/w/cpp/named_req/StandardLayoutType):\n   JSON values have\n   [standard layout](https://en.cppreference.com/w/cpp/language/data_members#Standard_layout):\n   All non-static data members are private and standard layout types, the\n   class has no virtual functions or (virtual) base classes.\n- Library-wide\n - [EqualityComparable](https://en.cppreference.com/w/cpp/named_req/EqualityComparable):\n   JSON values can be compared with `==`, see @ref\n   operator==(const_reference,const_reference).\n - [LessThanComparable](https://en.cppreference.com/w/cpp/named_req/LessThanComparable):\n   JSON values can be compared with `<`, see @ref\n   operator<(const_reference,const_reference).\n - [Swappable](https://en.cppreference.com/w/cpp/named_req/Swappable):\n   Any JSON lvalue or rvalue of can be swapped with any lvalue or rvalue of\n   other compatible types, using unqualified function call @ref swap().\n - [NullablePointer](https://en.cppreference.com/w/cpp/named_req/NullablePointer):\n   JSON values can be compared against `std::nullptr_t` objects which are used\n   to model the `null` value.\n- Container\n - [Container](https://en.cppreference.com/w/cpp/named_req/Container):\n   JSON values can be used like STL containers and provide iterator access.\n - [ReversibleContainer](https://en.cppreference.com/w/cpp/named_req/ReversibleContainer);\n   JSON values can be used like STL containers and provide reverse iterator\n   access.\n\n@invariant The member variables @a m_value and @a m_type have the following\nrelationship:\n- If `m_type == value_t::object`, then `m_value.object != nullptr`.\n- If `m_type == value_t::array`, then `m_value.array != nullptr`.\n- If `m_type == value_t::string`, then `m_value.string != nullptr`.\nThe invariants are checked by member function assert_invariant().\n\n@internal\n@note ObjectType trick from https://stackoverflow.com/a/9860911\n@endinternal\n\n@see [RFC 7159: The JavaScript Object Notation (JSON) Data Interchange\nFormat](http://rfc7159.net/rfc7159)\n\n@since version 1.0.0\n\n@nosubgrouping\n*/\nNLOHMANN_BASIC_JSON_TPL_DECLARATION\nclass basic_json\n{\n  private:\n    template<detail::value_t> friend struct detail::external_constructor;\n    friend ::nlohmann::json_pointer<basic_json>;\n\n    template<typename BasicJsonType, typename InputType>\n    friend class ::nlohmann::detail::parser;\n    friend ::nlohmann::detail::serializer<basic_json>;\n    template<typename BasicJsonType>\n    friend class ::nlohmann::detail::iter_impl;\n    template<typename BasicJsonType, typename CharType>\n    friend class ::nlohmann::detail::binary_writer;\n    template<typename BasicJsonType, typename InputType, typename SAX>\n    friend class ::nlohmann::detail::binary_reader;\n    template<typename BasicJsonType>\n    friend class ::nlohmann::detail::json_sax_dom_parser;\n    template<typename BasicJsonType>\n    friend class ::nlohmann::detail::json_sax_dom_callback_parser;\n\n    /// workaround type for MSVC\n    using basic_json_t = NLOHMANN_BASIC_JSON_TPL;\n\n    // convenience aliases for types residing in namespace detail;\n    using lexer = ::nlohmann::detail::lexer_base<basic_json>;\n\n    template<typename InputAdapterType>\n    static ::nlohmann::detail::parser<basic_json, InputAdapterType> parser(\n        InputAdapterType adapter,\n        detail::parser_callback_t<basic_json>cb = nullptr,\n        const bool allow_exceptions = true,\n        const bool ignore_comments = false\n                                 )\n    {\n        return ::nlohmann::detail::parser<basic_json, InputAdapterType>(std::move(adapter),\n                std::move(cb), allow_exceptions, ignore_comments);\n    }\n\n    using primitive_iterator_t = ::nlohmann::detail::primitive_iterator_t;\n    template<typename BasicJsonType>\n    using internal_iterator = ::nlohmann::detail::internal_iterator<BasicJsonType>;\n    template<typename BasicJsonType>\n    using iter_impl = ::nlohmann::detail::iter_impl<BasicJsonType>;\n    template<typename Iterator>\n    using iteration_proxy = ::nlohmann::detail::iteration_proxy<Iterator>;\n    template<typename Base> using json_reverse_iterator = ::nlohmann::detail::json_reverse_iterator<Base>;\n\n    template<typename CharType>\n    using output_adapter_t = ::nlohmann::detail::output_adapter_t<CharType>;\n\n    template<typename InputType>\n    using binary_reader = ::nlohmann::detail::binary_reader<basic_json, InputType>;\n    template<typename CharType> using binary_writer = ::nlohmann::detail::binary_writer<basic_json, CharType>;\n\n    using serializer = ::nlohmann::detail::serializer<basic_json>;\n\n  public:\n    using value_t = detail::value_t;\n    /// JSON Pointer, see @ref nlohmann::json_pointer\n    using json_pointer = ::nlohmann::json_pointer<basic_json>;\n    template<typename T, typename SFINAE>\n    using json_serializer = JSONSerializer<T, SFINAE>;\n    /// how to treat decoding errors\n    using error_handler_t = detail::error_handler_t;\n    /// how to treat CBOR tags\n    using cbor_tag_handler_t = detail::cbor_tag_handler_t;\n    /// helper type for initializer lists of basic_json values\n    using initializer_list_t = std::initializer_list<detail::json_ref<basic_json>>;\n\n    using input_format_t = detail::input_format_t;\n    /// SAX interface type, see @ref nlohmann::json_sax\n    using json_sax_t = json_sax<basic_json>;\n\n    ////////////////\n    // exceptions //\n    ////////////////\n\n    /// @name exceptions\n    /// Classes to implement user-defined exceptions.\n    /// @{\n\n    /// @copydoc detail::exception\n    using exception = detail::exception;\n    /// @copydoc detail::parse_error\n    using parse_error = detail::parse_error;\n    /// @copydoc detail::invalid_iterator\n    using invalid_iterator = detail::invalid_iterator;\n    /// @copydoc detail::type_error\n    using type_error = detail::type_error;\n    /// @copydoc detail::out_of_range\n    using out_of_range = detail::out_of_range;\n    /// @copydoc detail::other_error\n    using other_error = detail::other_error;\n\n    /// @}\n\n\n    /////////////////////\n    // container types //\n    /////////////////////\n\n    /// @name container types\n    /// The canonic container types to use @ref basic_json like any other STL\n    /// container.\n    /// @{\n\n    /// the type of elements in a basic_json container\n    using value_type = basic_json;\n\n    /// the type of an element reference\n    using reference = value_type&;\n    /// the type of an element const reference\n    using const_reference = const value_type&;\n\n    /// a type to represent differences between iterators\n    using difference_type = std::ptrdiff_t;\n    /// a type to represent container sizes\n    using size_type = std::size_t;\n\n    /// the allocator type\n    using allocator_type = AllocatorType<basic_json>;\n\n    /// the type of an element pointer\n    using pointer = typename std::allocator_traits<allocator_type>::pointer;\n    /// the type of an element const pointer\n    using const_pointer = typename std::allocator_traits<allocator_type>::const_pointer;\n\n    /// an iterator for a basic_json container\n    using iterator = iter_impl<basic_json>;\n    /// a const iterator for a basic_json container\n    using const_iterator = iter_impl<const basic_json>;\n    /// a reverse iterator for a basic_json container\n    using reverse_iterator = json_reverse_iterator<typename basic_json::iterator>;\n    /// a const reverse iterator for a basic_json container\n    using const_reverse_iterator = json_reverse_iterator<typename basic_json::const_iterator>;\n\n    /// @}\n\n\n    /*!\n    @brief returns the allocator associated with the container\n    */\n    static allocator_type get_allocator()\n    {\n        return allocator_type();\n    }\n\n    /*!\n    @brief returns version information on the library\n\n    This function returns a JSON object with information about the library,\n    including the version number and information on the platform and compiler.\n\n    @return JSON object holding version information\n    key         | description\n    ----------- | ---------------\n    `compiler`  | Information on the used compiler. It is an object with the following keys: `c++` (the used C++ standard), `family` (the compiler family; possible values are `clang`, `icc`, `gcc`, `ilecpp`, `msvc`, `pgcpp`, `sunpro`, and `unknown`), and `version` (the compiler version).\n    `copyright` | The copyright line for the library as string.\n    `name`      | The name of the library as string.\n    `platform`  | The used platform as string. Possible values are `win32`, `linux`, `apple`, `unix`, and `unknown`.\n    `url`       | The URL of the project as string.\n    `version`   | The version of the library. It is an object with the following keys: `major`, `minor`, and `patch` as defined by [Semantic Versioning](http://semver.org), and `string` (the version string).\n\n    @liveexample{The following code shows an example output of the `meta()`\n    function.,meta}\n\n    @exceptionsafety Strong guarantee: if an exception is thrown, there are no\n    changes to any JSON value.\n\n    @complexity Constant.\n\n    @since 2.1.0\n    */\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json meta()\n    {\n        basic_json result;\n\n        result[\"copyright\"] = \"(C) 2013-2020 Niels Lohmann\";\n        result[\"name\"] = \"JSON for Modern C++\";\n        result[\"url\"] = \"https://github.com/nlohmann/json\";\n        result[\"version\"][\"string\"] =\n            std::to_string(NLOHMANN_JSON_VERSION_MAJOR) + \".\" +\n            std::to_string(NLOHMANN_JSON_VERSION_MINOR) + \".\" +\n            std::to_string(NLOHMANN_JSON_VERSION_PATCH);\n        result[\"version\"][\"major\"] = NLOHMANN_JSON_VERSION_MAJOR;\n        result[\"version\"][\"minor\"] = NLOHMANN_JSON_VERSION_MINOR;\n        result[\"version\"][\"patch\"] = NLOHMANN_JSON_VERSION_PATCH;\n\n#ifdef _WIN32\n        result[\"platform\"] = \"win32\";\n#elif defined __linux__\n        result[\"platform\"] = \"linux\";\n#elif defined __APPLE__\n        result[\"platform\"] = \"apple\";\n#elif defined __unix__\n        result[\"platform\"] = \"unix\";\n#else\n        result[\"platform\"] = \"unknown\";\n#endif\n\n#if defined(__ICC) || defined(__INTEL_COMPILER)\n        result[\"compiler\"] = {{\"family\", \"icc\"}, {\"version\", __INTEL_COMPILER}};\n#elif defined(__clang__)\n        result[\"compiler\"] = {{\"family\", \"clang\"}, {\"version\", __clang_version__}};\n#elif defined(__GNUC__) || defined(__GNUG__)\n        result[\"compiler\"] = {{\"family\", \"gcc\"}, {\"version\", std::to_string(__GNUC__) + \".\" + std::to_string(__GNUC_MINOR__) + \".\" + std::to_string(__GNUC_PATCHLEVEL__)}};\n#elif defined(__HP_cc) || defined(__HP_aCC)\n        result[\"compiler\"] = \"hp\"\n#elif defined(__IBMCPP__)\n        result[\"compiler\"] = {{\"family\", \"ilecpp\"}, {\"version\", __IBMCPP__}};\n#elif defined(_MSC_VER)\n        result[\"compiler\"] = {{\"family\", \"msvc\"}, {\"version\", _MSC_VER}};\n#elif defined(__PGI)\n        result[\"compiler\"] = {{\"family\", \"pgcpp\"}, {\"version\", __PGI}};\n#elif defined(__SUNPRO_CC)\n        result[\"compiler\"] = {{\"family\", \"sunpro\"}, {\"version\", __SUNPRO_CC}};\n#else\n        result[\"compiler\"] = {{\"family\", \"unknown\"}, {\"version\", \"unknown\"}};\n#endif\n\n#ifdef __cplusplus\n        result[\"compiler\"][\"c++\"] = std::to_string(__cplusplus);\n#else\n        result[\"compiler\"][\"c++\"] = \"unknown\";\n#endif\n        return result;\n    }\n\n\n    ///////////////////////////\n    // JSON value data types //\n    ///////////////////////////\n\n    /// @name JSON value data types\n    /// The data types to store a JSON value. These types are derived from\n    /// the template arguments passed to class @ref basic_json.\n    /// @{\n\n#if defined(JSON_HAS_CPP_14)\n    // Use transparent comparator if possible, combined with perfect forwarding\n    // on find() and count() calls prevents unnecessary string construction.\n    using object_comparator_t = std::less<>;\n#else\n    using object_comparator_t = std::less<StringType>;\n#endif\n\n    /*!\n    @brief a type for an object\n\n    [RFC 7159](http://rfc7159.net/rfc7159) describes JSON objects as follows:\n    > An object is an unordered collection of zero or more name/value pairs,\n    > where a name is a string and a value is a string, number, boolean, null,\n    > object, or array.\n\n    To store objects in C++, a type is defined by the template parameters\n    described below.\n\n    @tparam ObjectType  the container to store objects (e.g., `std::map` or\n    `std::unordered_map`)\n    @tparam StringType the type of the keys or names (e.g., `std::string`).\n    The comparison function `std::less<StringType>` is used to order elements\n    inside the container.\n    @tparam AllocatorType the allocator to use for objects (e.g.,\n    `std::allocator`)\n\n    #### Default type\n\n    With the default values for @a ObjectType (`std::map`), @a StringType\n    (`std::string`), and @a AllocatorType (`std::allocator`), the default\n    value for @a object_t is:\n\n    @code {.cpp}\n    std::map<\n      std::string, // key_type\n      basic_json, // value_type\n      std::less<std::string>, // key_compare\n      std::allocator<std::pair<const std::string, basic_json>> // allocator_type\n    >\n    @endcode\n\n    #### Behavior\n\n    The choice of @a object_t influences the behavior of the JSON class. With\n    the default type, objects have the following behavior:\n\n    - When all names are unique, objects will be interoperable in the sense\n      that all software implementations receiving that object will agree on\n      the name-value mappings.\n    - When the names within an object are not unique, it is unspecified which\n      one of the values for a given key will be chosen. For instance,\n      `{\"key\": 2, \"key\": 1}` could be equal to either `{\"key\": 1}` or\n      `{\"key\": 2}`.\n    - Internally, name/value pairs are stored in lexicographical order of the\n      names. Objects will also be serialized (see @ref dump) in this order.\n      For instance, `{\"b\": 1, \"a\": 2}` and `{\"a\": 2, \"b\": 1}` will be stored\n      and serialized as `{\"a\": 2, \"b\": 1}`.\n    - When comparing objects, the order of the name/value pairs is irrelevant.\n      This makes objects interoperable in the sense that they will not be\n      affected by these differences. For instance, `{\"b\": 1, \"a\": 2}` and\n      `{\"a\": 2, \"b\": 1}` will be treated as equal.\n\n    #### Limits\n\n    [RFC 7159](http://rfc7159.net/rfc7159) specifies:\n    > An implementation may set limits on the maximum depth of nesting.\n\n    In this class, the object's limit of nesting is not explicitly constrained.\n    However, a maximum depth of nesting may be introduced by the compiler or\n    runtime environment. A theoretical limit can be queried by calling the\n    @ref max_size function of a JSON object.\n\n    #### Storage\n\n    Objects are stored as pointers in a @ref basic_json type. That is, for any\n    access to object values, a pointer of type `object_t*` must be\n    dereferenced.\n\n    @sa @ref array_t -- type for an array value\n\n    @since version 1.0.0\n\n    @note The order name/value pairs are added to the object is *not*\n    preserved by the library. Therefore, iterating an object may return\n    name/value pairs in a different order than they were originally stored. In\n    fact, keys will be traversed in alphabetical order as `std::map` with\n    `std::less` is used by default. Please note this behavior conforms to [RFC\n    7159](http://rfc7159.net/rfc7159), because any order implements the\n    specified \"unordered\" nature of JSON objects.\n    */\n    using object_t = ObjectType<StringType,\n          basic_json,\n          object_comparator_t,\n          AllocatorType<std::pair<const StringType,\n          basic_json>>>;\n\n    /*!\n    @brief a type for an array\n\n    [RFC 7159](http://rfc7159.net/rfc7159) describes JSON arrays as follows:\n    > An array is an ordered sequence of zero or more values.\n\n    To store objects in C++, a type is defined by the template parameters\n    explained below.\n\n    @tparam ArrayType  container type to store arrays (e.g., `std::vector` or\n    `std::list`)\n    @tparam AllocatorType allocator to use for arrays (e.g., `std::allocator`)\n\n    #### Default type\n\n    With the default values for @a ArrayType (`std::vector`) and @a\n    AllocatorType (`std::allocator`), the default value for @a array_t is:\n\n    @code {.cpp}\n    std::vector<\n      basic_json, // value_type\n      std::allocator<basic_json> // allocator_type\n    >\n    @endcode\n\n    #### Limits\n\n    [RFC 7159](http://rfc7159.net/rfc7159) specifies:\n    > An implementation may set limits on the maximum depth of nesting.\n\n    In this class, the array's limit of nesting is not explicitly constrained.\n    However, a maximum depth of nesting may be introduced by the compiler or\n    runtime environment. A theoretical limit can be queried by calling the\n    @ref max_size function of a JSON array.\n\n    #### Storage\n\n    Arrays are stored as pointers in a @ref basic_json type. That is, for any\n    access to array values, a pointer of type `array_t*` must be dereferenced.\n\n    @sa @ref object_t -- type for an object value\n\n    @since version 1.0.0\n    */\n    using array_t = ArrayType<basic_json, AllocatorType<basic_json>>;\n\n    /*!\n    @brief a type for a string\n\n    [RFC 7159](http://rfc7159.net/rfc7159) describes JSON strings as follows:\n    > A string is a sequence of zero or more Unicode characters.\n\n    To store objects in C++, a type is defined by the template parameter\n    described below. Unicode values are split by the JSON class into\n    byte-sized characters during deserialization.\n\n    @tparam StringType  the container to store strings (e.g., `std::string`).\n    Note this container is used for keys/names in objects, see @ref object_t.\n\n    #### Default type\n\n    With the default values for @a StringType (`std::string`), the default\n    value for @a string_t is:\n\n    @code {.cpp}\n    std::string\n    @endcode\n\n    #### Encoding\n\n    Strings are stored in UTF-8 encoding. Therefore, functions like\n    `std::string::size()` or `std::string::length()` return the number of\n    bytes in the string rather than the number of characters or glyphs.\n\n    #### String comparison\n\n    [RFC 7159](http://rfc7159.net/rfc7159) states:\n    > Software implementations are typically required to test names of object\n    > members for equality. Implementations that transform the textual\n    > representation into sequences of Unicode code units and then perform the\n    > comparison numerically, code unit by code unit, are interoperable in the\n    > sense that implementations will agree in all cases on equality or\n    > inequality of two strings. For example, implementations that compare\n    > strings with escaped characters unconverted may incorrectly find that\n    > `\"a\\\\b\"` and `\"a\\u005Cb\"` are not equal.\n\n    This implementation is interoperable as it does compare strings code unit\n    by code unit.\n\n    #### Storage\n\n    String values are stored as pointers in a @ref basic_json type. That is,\n    for any access to string values, a pointer of type `string_t*` must be\n    dereferenced.\n\n    @since version 1.0.0\n    */\n    using string_t = StringType;\n\n    /*!\n    @brief a type for a boolean\n\n    [RFC 7159](http://rfc7159.net/rfc7159) implicitly describes a boolean as a\n    type which differentiates the two literals `true` and `false`.\n\n    To store objects in C++, a type is defined by the template parameter @a\n    BooleanType which chooses the type to use.\n\n    #### Default type\n\n    With the default values for @a BooleanType (`bool`), the default value for\n    @a boolean_t is:\n\n    @code {.cpp}\n    bool\n    @endcode\n\n    #### Storage\n\n    Boolean values are stored directly inside a @ref basic_json type.\n\n    @since version 1.0.0\n    */\n    using boolean_t = BooleanType;\n\n    /*!\n    @brief a type for a number (integer)\n\n    [RFC 7159](http://rfc7159.net/rfc7159) describes numbers as follows:\n    > The representation of numbers is similar to that used in most\n    > programming languages. A number is represented in base 10 using decimal\n    > digits. It contains an integer component that may be prefixed with an\n    > optional minus sign, which may be followed by a fraction part and/or an\n    > exponent part. Leading zeros are not allowed. (...) Numeric values that\n    > cannot be represented in the grammar below (such as Infinity and NaN)\n    > are not permitted.\n\n    This description includes both integer and floating-point numbers.\n    However, C++ allows more precise storage if it is known whether the number\n    is a signed integer, an unsigned integer or a floating-point number.\n    Therefore, three different types, @ref number_integer_t, @ref\n    number_unsigned_t and @ref number_float_t are used.\n\n    To store integer numbers in C++, a type is defined by the template\n    parameter @a NumberIntegerType which chooses the type to use.\n\n    #### Default type\n\n    With the default values for @a NumberIntegerType (`int64_t`), the default\n    value for @a number_integer_t is:\n\n    @code {.cpp}\n    int64_t\n    @endcode\n\n    #### Default behavior\n\n    - The restrictions about leading zeros is not enforced in C++. Instead,\n      leading zeros in integer literals lead to an interpretation as octal\n      number. Internally, the value will be stored as decimal number. For\n      instance, the C++ integer literal `010` will be serialized to `8`.\n      During deserialization, leading zeros yield an error.\n    - Not-a-number (NaN) values will be serialized to `null`.\n\n    #### Limits\n\n    [RFC 7159](http://rfc7159.net/rfc7159) specifies:\n    > An implementation may set limits on the range and precision of numbers.\n\n    When the default type is used, the maximal integer number that can be\n    stored is `9223372036854775807` (INT64_MAX) and the minimal integer number\n    that can be stored is `-9223372036854775808` (INT64_MIN). Integer numbers\n    that are out of range will yield over/underflow when used in a\n    constructor. During deserialization, too large or small integer numbers\n    will be automatically be stored as @ref number_unsigned_t or @ref\n    number_float_t.\n\n    [RFC 7159](http://rfc7159.net/rfc7159) further states:\n    > Note that when such software is used, numbers that are integers and are\n    > in the range \\f$[-2^{53}+1, 2^{53}-1]\\f$ are interoperable in the sense\n    > that implementations will agree exactly on their numeric values.\n\n    As this range is a subrange of the exactly supported range [INT64_MIN,\n    INT64_MAX], this class's integer type is interoperable.\n\n    #### Storage\n\n    Integer number values are stored directly inside a @ref basic_json type.\n\n    @sa @ref number_float_t -- type for number values (floating-point)\n\n    @sa @ref number_unsigned_t -- type for number values (unsigned integer)\n\n    @since version 1.0.0\n    */\n    using number_integer_t = NumberIntegerType;\n\n    /*!\n    @brief a type for a number (unsigned)\n\n    [RFC 7159](http://rfc7159.net/rfc7159) describes numbers as follows:\n    > The representation of numbers is similar to that used in most\n    > programming languages. A number is represented in base 10 using decimal\n    > digits. It contains an integer component that may be prefixed with an\n    > optional minus sign, which may be followed by a fraction part and/or an\n    > exponent part. Leading zeros are not allowed. (...) Numeric values that\n    > cannot be represented in the grammar below (such as Infinity and NaN)\n    > are not permitted.\n\n    This description includes both integer and floating-point numbers.\n    However, C++ allows more precise storage if it is known whether the number\n    is a signed integer, an unsigned integer or a floating-point number.\n    Therefore, three different types, @ref number_integer_t, @ref\n    number_unsigned_t and @ref number_float_t are used.\n\n    To store unsigned integer numbers in C++, a type is defined by the\n    template parameter @a NumberUnsignedType which chooses the type to use.\n\n    #### Default type\n\n    With the default values for @a NumberUnsignedType (`uint64_t`), the\n    default value for @a number_unsigned_t is:\n\n    @code {.cpp}\n    uint64_t\n    @endcode\n\n    #### Default behavior\n\n    - The restrictions about leading zeros is not enforced in C++. Instead,\n      leading zeros in integer literals lead to an interpretation as octal\n      number. Internally, the value will be stored as decimal number. For\n      instance, the C++ integer literal `010` will be serialized to `8`.\n      During deserialization, leading zeros yield an error.\n    - Not-a-number (NaN) values will be serialized to `null`.\n\n    #### Limits\n\n    [RFC 7159](http://rfc7159.net/rfc7159) specifies:\n    > An implementation may set limits on the range and precision of numbers.\n\n    When the default type is used, the maximal integer number that can be\n    stored is `18446744073709551615` (UINT64_MAX) and the minimal integer\n    number that can be stored is `0`. Integer numbers that are out of range\n    will yield over/underflow when used in a constructor. During\n    deserialization, too large or small integer numbers will be automatically\n    be stored as @ref number_integer_t or @ref number_float_t.\n\n    [RFC 7159](http://rfc7159.net/rfc7159) further states:\n    > Note that when such software is used, numbers that are integers and are\n    > in the range \\f$[-2^{53}+1, 2^{53}-1]\\f$ are interoperable in the sense\n    > that implementations will agree exactly on their numeric values.\n\n    As this range is a subrange (when considered in conjunction with the\n    number_integer_t type) of the exactly supported range [0, UINT64_MAX],\n    this class's integer type is interoperable.\n\n    #### Storage\n\n    Integer number values are stored directly inside a @ref basic_json type.\n\n    @sa @ref number_float_t -- type for number values (floating-point)\n    @sa @ref number_integer_t -- type for number values (integer)\n\n    @since version 2.0.0\n    */\n    using number_unsigned_t = NumberUnsignedType;\n\n    /*!\n    @brief a type for a number (floating-point)\n\n    [RFC 7159](http://rfc7159.net/rfc7159) describes numbers as follows:\n    > The representation of numbers is similar to that used in most\n    > programming languages. A number is represented in base 10 using decimal\n    > digits. It contains an integer component that may be prefixed with an\n    > optional minus sign, which may be followed by a fraction part and/or an\n    > exponent part. Leading zeros are not allowed. (...) Numeric values that\n    > cannot be represented in the grammar below (such as Infinity and NaN)\n    > are not permitted.\n\n    This description includes both integer and floating-point numbers.\n    However, C++ allows more precise storage if it is known whether the number\n    is a signed integer, an unsigned integer or a floating-point number.\n    Therefore, three different types, @ref number_integer_t, @ref\n    number_unsigned_t and @ref number_float_t are used.\n\n    To store floating-point numbers in C++, a type is defined by the template\n    parameter @a NumberFloatType which chooses the type to use.\n\n    #### Default type\n\n    With the default values for @a NumberFloatType (`double`), the default\n    value for @a number_float_t is:\n\n    @code {.cpp}\n    double\n    @endcode\n\n    #### Default behavior\n\n    - The restrictions about leading zeros is not enforced in C++. Instead,\n      leading zeros in floating-point literals will be ignored. Internally,\n      the value will be stored as decimal number. For instance, the C++\n      floating-point literal `01.2` will be serialized to `1.2`. During\n      deserialization, leading zeros yield an error.\n    - Not-a-number (NaN) values will be serialized to `null`.\n\n    #### Limits\n\n    [RFC 7159](http://rfc7159.net/rfc7159) states:\n    > This specification allows implementations to set limits on the range and\n    > precision of numbers accepted. Since software that implements IEEE\n    > 754-2008 binary64 (double precision) numbers is generally available and\n    > widely used, good interoperability can be achieved by implementations\n    > that expect no more precision or range than these provide, in the sense\n    > that implementations will approximate JSON numbers within the expected\n    > precision.\n\n    This implementation does exactly follow this approach, as it uses double\n    precision floating-point numbers. Note values smaller than\n    `-1.79769313486232e+308` and values greater than `1.79769313486232e+308`\n    will be stored as NaN internally and be serialized to `null`.\n\n    #### Storage\n\n    Floating-point number values are stored directly inside a @ref basic_json\n    type.\n\n    @sa @ref number_integer_t -- type for number values (integer)\n\n    @sa @ref number_unsigned_t -- type for number values (unsigned integer)\n\n    @since version 1.0.0\n    */\n    using number_float_t = NumberFloatType;\n\n    /*!\n    @brief a type for a packed binary type\n\n    This type is a type designed to carry binary data that appears in various\n    serialized formats, such as CBOR's Major Type 2, MessagePack's bin, and\n    BSON's generic binary subtype. This type is NOT a part of standard JSON and\n    exists solely for compatibility with these binary types. As such, it is\n    simply defined as an ordered sequence of zero or more byte values.\n\n    Additionally, as an implementation detail, the subtype of the binary data is\n    carried around as a `std::uint8_t`, which is compatible with both of the\n    binary data formats that use binary subtyping, (though the specific\n    numbering is incompatible with each other, and it is up to the user to\n    translate between them).\n\n    [CBOR's RFC 7049](https://tools.ietf.org/html/rfc7049) describes this type\n    as:\n    > Major type 2: a byte string. The string's length in bytes is represented\n    > following the rules for positive integers (major type 0).\n\n    [MessagePack's documentation on the bin type\n    family](https://github.com/msgpack/msgpack/blob/master/spec.md#bin-format-family)\n    describes this type as:\n    > Bin format family stores an byte array in 2, 3, or 5 bytes of extra bytes\n    > in addition to the size of the byte array.\n\n    [BSON's specifications](http://bsonspec.org/spec.html) describe several\n    binary types; however, this type is intended to represent the generic binary\n    type which has the description:\n    > Generic binary subtype - This is the most commonly used binary subtype and\n    > should be the 'default' for drivers and tools.\n\n    None of these impose any limitations on the internal representation other\n    than the basic unit of storage be some type of array whose parts are\n    decomposable into bytes.\n\n    The default representation of this binary format is a\n    `std::vector<std::uint8_t>`, which is a very common way to represent a byte\n    array in modern C++.\n\n    #### Default type\n\n    The default values for @a BinaryType is `std::vector<std::uint8_t>`\n\n    #### Storage\n\n    Binary Arrays are stored as pointers in a @ref basic_json type. That is,\n    for any access to array values, a pointer of the type `binary_t*` must be\n    dereferenced.\n\n    #### Notes on subtypes\n\n    - CBOR\n       - Binary values are represented as byte strings. No subtypes are\n         supported and will be ignored when CBOR is written.\n    - MessagePack\n       - If a subtype is given and the binary array contains exactly 1, 2, 4, 8,\n         or 16 elements, the fixext family (fixext1, fixext2, fixext4, fixext8)\n         is used. For other sizes, the ext family (ext8, ext16, ext32) is used.\n         The subtype is then added as singed 8-bit integer.\n       - If no subtype is given, the bin family (bin8, bin16, bin32) is used.\n    - BSON\n       - If a subtype is given, it is used and added as unsigned 8-bit integer.\n       - If no subtype is given, the generic binary subtype 0x00 is used.\n\n    @sa @ref binary -- create a binary array\n\n    @since version 3.8.0\n    */\n    using binary_t = nlohmann::byte_container_with_subtype<BinaryType>;\n    /// @}\n\n  private:\n\n    /// helper for exception-safe object creation\n    template<typename T, typename... Args>\n    JSON_HEDLEY_RETURNS_NON_NULL\n    static T* create(Args&& ... args)\n    {\n        AllocatorType<T> alloc;\n        using AllocatorTraits = std::allocator_traits<AllocatorType<T>>;\n\n        auto deleter = [&](T * object)\n        {\n            AllocatorTraits::deallocate(alloc, object, 1);\n        };\n        std::unique_ptr<T, decltype(deleter)> object(AllocatorTraits::allocate(alloc, 1), deleter);\n        AllocatorTraits::construct(alloc, object.get(), std::forward<Args>(args)...);\n        JSON_ASSERT(object != nullptr);\n        return object.release();\n    }\n\n    ////////////////////////\n    // JSON value storage //\n    ////////////////////////\n\n    /*!\n    @brief a JSON value\n\n    The actual storage for a JSON value of the @ref basic_json class. This\n    union combines the different storage types for the JSON value types\n    defined in @ref value_t.\n\n    JSON type | value_t type    | used type\n    --------- | --------------- | ------------------------\n    object    | object          | pointer to @ref object_t\n    array     | array           | pointer to @ref array_t\n    string    | string          | pointer to @ref string_t\n    boolean   | boolean         | @ref boolean_t\n    number    | number_integer  | @ref number_integer_t\n    number    | number_unsigned | @ref number_unsigned_t\n    number    | number_float    | @ref number_float_t\n    binary    | binary          | pointer to @ref binary_t\n    null      | null            | *no value is stored*\n\n    @note Variable-length types (objects, arrays, and strings) are stored as\n    pointers. The size of the union should not exceed 64 bits if the default\n    value types are used.\n\n    @since version 1.0.0\n    */\n    union json_value\n    {\n        /// object (stored with pointer to save storage)\n        object_t* object;\n        /// array (stored with pointer to save storage)\n        array_t* array;\n        /// string (stored with pointer to save storage)\n        string_t* string;\n        /// binary (stored with pointer to save storage)\n        binary_t* binary;\n        /// boolean\n        boolean_t boolean;\n        /// number (integer)\n        number_integer_t number_integer;\n        /// number (unsigned integer)\n        number_unsigned_t number_unsigned;\n        /// number (floating-point)\n        number_float_t number_float;\n\n        /// default constructor (for null values)\n        json_value() = default;\n        /// constructor for booleans\n        json_value(boolean_t v) noexcept : boolean(v) {}\n        /// constructor for numbers (integer)\n        json_value(number_integer_t v) noexcept : number_integer(v) {}\n        /// constructor for numbers (unsigned)\n        json_value(number_unsigned_t v) noexcept : number_unsigned(v) {}\n        /// constructor for numbers (floating-point)\n        json_value(number_float_t v) noexcept : number_float(v) {}\n        /// constructor for empty values of a given type\n        json_value(value_t t)\n        {\n            switch (t)\n            {\n                case value_t::object:\n                {\n                    object = create<object_t>();\n                    break;\n                }\n\n                case value_t::array:\n                {\n                    array = create<array_t>();\n                    break;\n                }\n\n                case value_t::string:\n                {\n                    string = create<string_t>(\"\");\n                    break;\n                }\n\n                case value_t::binary:\n                {\n                    binary = create<binary_t>();\n                    break;\n                }\n\n                case value_t::boolean:\n                {\n                    boolean = boolean_t(false);\n                    break;\n                }\n\n                case value_t::number_integer:\n                {\n                    number_integer = number_integer_t(0);\n                    break;\n                }\n\n                case value_t::number_unsigned:\n                {\n                    number_unsigned = number_unsigned_t(0);\n                    break;\n                }\n\n                case value_t::number_float:\n                {\n                    number_float = number_float_t(0.0);\n                    break;\n                }\n\n                case value_t::null:\n                {\n                    object = nullptr;  // silence warning, see #821\n                    break;\n                }\n\n                default:\n                {\n                    object = nullptr;  // silence warning, see #821\n                    if (JSON_HEDLEY_UNLIKELY(t == value_t::null))\n                    {\n                        JSON_THROW(other_error::create(500, \"961c151d2e87f2686a955a9be24d316f1362bf21 3.9.1\")); // LCOV_EXCL_LINE\n                    }\n                    break;\n                }\n            }\n        }\n\n        /// constructor for strings\n        json_value(const string_t& value)\n        {\n            string = create<string_t>(value);\n        }\n\n        /// constructor for rvalue strings\n        json_value(string_t&& value)\n        {\n            string = create<string_t>(std::move(value));\n        }\n\n        /// constructor for objects\n        json_value(const object_t& value)\n        {\n            object = create<object_t>(value);\n        }\n\n        /// constructor for rvalue objects\n        json_value(object_t&& value)\n        {\n            object = create<object_t>(std::move(value));\n        }\n\n        /// constructor for arrays\n        json_value(const array_t& value)\n        {\n            array = create<array_t>(value);\n        }\n\n        /// constructor for rvalue arrays\n        json_value(array_t&& value)\n        {\n            array = create<array_t>(std::move(value));\n        }\n\n        /// constructor for binary arrays\n        json_value(const typename binary_t::container_type& value)\n        {\n            binary = create<binary_t>(value);\n        }\n\n        /// constructor for rvalue binary arrays\n        json_value(typename binary_t::container_type&& value)\n        {\n            binary = create<binary_t>(std::move(value));\n        }\n\n        /// constructor for binary arrays (internal type)\n        json_value(const binary_t& value)\n        {\n            binary = create<binary_t>(value);\n        }\n\n        /// constructor for rvalue binary arrays (internal type)\n        json_value(binary_t&& value)\n        {\n            binary = create<binary_t>(std::move(value));\n        }\n\n        void destroy(value_t t) noexcept\n        {\n            // flatten the current json_value to a heap-allocated stack\n            std::vector<basic_json> stack;\n\n            // move the top-level items to stack\n            if (t == value_t::array)\n            {\n                stack.reserve(array->size());\n                std::move(array->begin(), array->end(), std::back_inserter(stack));\n            }\n            else if (t == value_t::object)\n            {\n                stack.reserve(object->size());\n                for (auto&& it : *object)\n                {\n                    stack.push_back(std::move(it.second));\n                }\n            }\n\n            while (!stack.empty())\n            {\n                // move the last item to local variable to be processed\n                basic_json current_item(std::move(stack.back()));\n                stack.pop_back();\n\n                // if current_item is array/object, move\n                // its children to the stack to be processed later\n                if (current_item.is_array())\n                {\n                    std::move(current_item.m_value.array->begin(), current_item.m_value.array->end(),\n                              std::back_inserter(stack));\n\n                    current_item.m_value.array->clear();\n                }\n                else if (current_item.is_object())\n                {\n                    for (auto&& it : *current_item.m_value.object)\n                    {\n                        stack.push_back(std::move(it.second));\n                    }\n\n                    current_item.m_value.object->clear();\n                }\n\n                // it's now safe that current_item get destructed\n                // since it doesn't have any children\n            }\n\n            switch (t)\n            {\n                case value_t::object:\n                {\n                    AllocatorType<object_t> alloc;\n                    std::allocator_traits<decltype(alloc)>::destroy(alloc, object);\n                    std::allocator_traits<decltype(alloc)>::deallocate(alloc, object, 1);\n                    break;\n                }\n\n                case value_t::array:\n                {\n                    AllocatorType<array_t> alloc;\n                    std::allocator_traits<decltype(alloc)>::destroy(alloc, array);\n                    std::allocator_traits<decltype(alloc)>::deallocate(alloc, array, 1);\n                    break;\n                }\n\n                case value_t::string:\n                {\n                    AllocatorType<string_t> alloc;\n                    std::allocator_traits<decltype(alloc)>::destroy(alloc, string);\n                    std::allocator_traits<decltype(alloc)>::deallocate(alloc, string, 1);\n                    break;\n                }\n\n                case value_t::binary:\n                {\n                    AllocatorType<binary_t> alloc;\n                    std::allocator_traits<decltype(alloc)>::destroy(alloc, binary);\n                    std::allocator_traits<decltype(alloc)>::deallocate(alloc, binary, 1);\n                    break;\n                }\n\n                default:\n                {\n                    break;\n                }\n            }\n        }\n    };\n\n    /*!\n    @brief checks the class invariants\n\n    This function asserts the class invariants. It needs to be called at the\n    end of every constructor to make sure that created objects respect the\n    invariant. Furthermore, it has to be called each time the type of a JSON\n    value is changed, because the invariant expresses a relationship between\n    @a m_type and @a m_value.\n    */\n    void assert_invariant() const noexcept\n    {\n        JSON_ASSERT(m_type != value_t::object || m_value.object != nullptr);\n        JSON_ASSERT(m_type != value_t::array || m_value.array != nullptr);\n        JSON_ASSERT(m_type != value_t::string || m_value.string != nullptr);\n        JSON_ASSERT(m_type != value_t::binary || m_value.binary != nullptr);\n    }\n\n  public:\n    //////////////////////////\n    // JSON parser callback //\n    //////////////////////////\n\n    /*!\n    @brief parser event types\n\n    The parser callback distinguishes the following events:\n    - `object_start`: the parser read `{` and started to process a JSON object\n    - `key`: the parser read a key of a value in an object\n    - `object_end`: the parser read `}` and finished processing a JSON object\n    - `array_start`: the parser read `[` and started to process a JSON array\n    - `array_end`: the parser read `]` and finished processing a JSON array\n    - `value`: the parser finished reading a JSON value\n\n    @image html callback_events.png \"Example when certain parse events are triggered\"\n\n    @sa @ref parser_callback_t for more information and examples\n    */\n    using parse_event_t = detail::parse_event_t;\n\n    /*!\n    @brief per-element parser callback type\n\n    With a parser callback function, the result of parsing a JSON text can be\n    influenced. When passed to @ref parse, it is called on certain events\n    (passed as @ref parse_event_t via parameter @a event) with a set recursion\n    depth @a depth and context JSON value @a parsed. The return value of the\n    callback function is a boolean indicating whether the element that emitted\n    the callback shall be kept or not.\n\n    We distinguish six scenarios (determined by the event type) in which the\n    callback function can be called. The following table describes the values\n    of the parameters @a depth, @a event, and @a parsed.\n\n    parameter @a event | description | parameter @a depth | parameter @a parsed\n    ------------------ | ----------- | ------------------ | -------------------\n    parse_event_t::object_start | the parser read `{` and started to process a JSON object | depth of the parent of the JSON object | a JSON value with type discarded\n    parse_event_t::key | the parser read a key of a value in an object | depth of the currently parsed JSON object | a JSON string containing the key\n    parse_event_t::object_end | the parser read `}` and finished processing a JSON object | depth of the parent of the JSON object | the parsed JSON object\n    parse_event_t::array_start | the parser read `[` and started to process a JSON array | depth of the parent of the JSON array | a JSON value with type discarded\n    parse_event_t::array_end | the parser read `]` and finished processing a JSON array | depth of the parent of the JSON array | the parsed JSON array\n    parse_event_t::value | the parser finished reading a JSON value | depth of the value | the parsed JSON value\n\n    @image html callback_events.png \"Example when certain parse events are triggered\"\n\n    Discarding a value (i.e., returning `false`) has different effects\n    depending on the context in which function was called:\n\n    - Discarded values in structured types are skipped. That is, the parser\n      will behave as if the discarded value was never read.\n    - In case a value outside a structured type is skipped, it is replaced\n      with `null`. This case happens if the top-level element is skipped.\n\n    @param[in] depth  the depth of the recursion during parsing\n\n    @param[in] event  an event of type parse_event_t indicating the context in\n    the callback function has been called\n\n    @param[in,out] parsed  the current intermediate parse result; note that\n    writing to this value has no effect for parse_event_t::key events\n\n    @return Whether the JSON value which called the function during parsing\n    should be kept (`true`) or not (`false`). In the latter case, it is either\n    skipped completely or replaced by an empty discarded object.\n\n    @sa @ref parse for examples\n\n    @since version 1.0.0\n    */\n    using parser_callback_t = detail::parser_callback_t<basic_json>;\n\n    //////////////////\n    // constructors //\n    //////////////////\n\n    /// @name constructors and destructors\n    /// Constructors of class @ref basic_json, copy/move constructor, copy\n    /// assignment, static functions creating objects, and the destructor.\n    /// @{\n\n    /*!\n    @brief create an empty value with a given type\n\n    Create an empty JSON value with a given type. The value will be default\n    initialized with an empty value which depends on the type:\n\n    Value type  | initial value\n    ----------- | -------------\n    null        | `null`\n    boolean     | `false`\n    string      | `\"\"`\n    number      | `0`\n    object      | `{}`\n    array       | `[]`\n    binary      | empty array\n\n    @param[in] v  the type of the value to create\n\n    @complexity Constant.\n\n    @exceptionsafety Strong guarantee: if an exception is thrown, there are no\n    changes to any JSON value.\n\n    @liveexample{The following code shows the constructor for different @ref\n    value_t values,basic_json__value_t}\n\n    @sa @ref clear() -- restores the postcondition of this constructor\n\n    @since version 1.0.0\n    */\n    basic_json(const value_t v)\n        : m_type(v), m_value(v)\n    {\n        assert_invariant();\n    }\n\n    /*!\n    @brief create a null object\n\n    Create a `null` JSON value. It either takes a null pointer as parameter\n    (explicitly creating `null`) or no parameter (implicitly creating `null`).\n    The passed null pointer itself is not read -- it is only used to choose\n    the right constructor.\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this constructor never throws\n    exceptions.\n\n    @liveexample{The following code shows the constructor with and without a\n    null pointer parameter.,basic_json__nullptr_t}\n\n    @since version 1.0.0\n    */\n    basic_json(std::nullptr_t = nullptr) noexcept\n        : basic_json(value_t::null)\n    {\n        assert_invariant();\n    }\n\n    /*!\n    @brief create a JSON value\n\n    This is a \"catch all\" constructor for all compatible JSON types; that is,\n    types for which a `to_json()` method exists. The constructor forwards the\n    parameter @a val to that method (to `json_serializer<U>::to_json` method\n    with `U = uncvref_t<CompatibleType>`, to be exact).\n\n    Template type @a CompatibleType includes, but is not limited to, the\n    following types:\n    - **arrays**: @ref array_t and all kinds of compatible containers such as\n      `std::vector`, `std::deque`, `std::list`, `std::forward_list`,\n      `std::array`, `std::valarray`, `std::set`, `std::unordered_set`,\n      `std::multiset`, and `std::unordered_multiset` with a `value_type` from\n      which a @ref basic_json value can be constructed.\n    - **objects**: @ref object_t and all kinds of compatible associative\n      containers such as `std::map`, `std::unordered_map`, `std::multimap`,\n      and `std::unordered_multimap` with a `key_type` compatible to\n      @ref string_t and a `value_type` from which a @ref basic_json value can\n      be constructed.\n    - **strings**: @ref string_t, string literals, and all compatible string\n      containers can be used.\n    - **numbers**: @ref number_integer_t, @ref number_unsigned_t,\n      @ref number_float_t, and all convertible number types such as `int`,\n      `size_t`, `int64_t`, `float` or `double` can be used.\n    - **boolean**: @ref boolean_t / `bool` can be used.\n    - **binary**: @ref binary_t / `std::vector<uint8_t>` may be used,\n      unfortunately because string literals cannot be distinguished from binary\n      character arrays by the C++ type system, all types compatible with `const\n      char*` will be directed to the string constructor instead.  This is both\n      for backwards compatibility, and due to the fact that a binary type is not\n      a standard JSON type.\n\n    See the examples below.\n\n    @tparam CompatibleType a type such that:\n    - @a CompatibleType is not derived from `std::istream`,\n    - @a CompatibleType is not @ref basic_json (to avoid hijacking copy/move\n         constructors),\n    - @a CompatibleType is not a different @ref basic_json type (i.e. with different template arguments)\n    - @a CompatibleType is not a @ref basic_json nested type (e.g.,\n         @ref json_pointer, @ref iterator, etc ...)\n    - @ref @ref json_serializer<U> has a\n         `to_json(basic_json_t&, CompatibleType&&)` method\n\n    @tparam U = `uncvref_t<CompatibleType>`\n\n    @param[in] val the value to be forwarded to the respective constructor\n\n    @complexity Usually linear in the size of the passed @a val, also\n                depending on the implementation of the called `to_json()`\n                method.\n\n    @exceptionsafety Depends on the called constructor. For types directly\n    supported by the library (i.e., all types for which no `to_json()` function\n    was provided), strong guarantee holds: if an exception is thrown, there are\n    no changes to any JSON value.\n\n    @liveexample{The following code shows the constructor with several\n    compatible types.,basic_json__CompatibleType}\n\n    @since version 2.1.0\n    */\n    template < typename CompatibleType,\n               typename U = detail::uncvref_t<CompatibleType>,\n               detail::enable_if_t <\n                   !detail::is_basic_json<U>::value && detail::is_compatible_type<basic_json_t, U>::value, int > = 0 >\n    basic_json(CompatibleType && val) noexcept(noexcept(\n                JSONSerializer<U>::to_json(std::declval<basic_json_t&>(),\n                                           std::forward<CompatibleType>(val))))\n    {\n        JSONSerializer<U>::to_json(*this, std::forward<CompatibleType>(val));\n        assert_invariant();\n    }\n\n    /*!\n    @brief create a JSON value from an existing one\n\n    This is a constructor for existing @ref basic_json types.\n    It does not hijack copy/move constructors, since the parameter has different\n    template arguments than the current ones.\n\n    The constructor tries to convert the internal @ref m_value of the parameter.\n\n    @tparam BasicJsonType a type such that:\n    - @a BasicJsonType is a @ref basic_json type.\n    - @a BasicJsonType has different template arguments than @ref basic_json_t.\n\n    @param[in] val the @ref basic_json value to be converted.\n\n    @complexity Usually linear in the size of the passed @a val, also\n                depending on the implementation of the called `to_json()`\n                method.\n\n    @exceptionsafety Depends on the called constructor. For types directly\n    supported by the library (i.e., all types for which no `to_json()` function\n    was provided), strong guarantee holds: if an exception is thrown, there are\n    no changes to any JSON value.\n\n    @since version 3.2.0\n    */\n    template < typename BasicJsonType,\n               detail::enable_if_t <\n                   detail::is_basic_json<BasicJsonType>::value&& !std::is_same<basic_json, BasicJsonType>::value, int > = 0 >\n    basic_json(const BasicJsonType& val)\n    {\n        using other_boolean_t = typename BasicJsonType::boolean_t;\n        using other_number_float_t = typename BasicJsonType::number_float_t;\n        using other_number_integer_t = typename BasicJsonType::number_integer_t;\n        using other_number_unsigned_t = typename BasicJsonType::number_unsigned_t;\n        using other_string_t = typename BasicJsonType::string_t;\n        using other_object_t = typename BasicJsonType::object_t;\n        using other_array_t = typename BasicJsonType::array_t;\n        using other_binary_t = typename BasicJsonType::binary_t;\n\n        switch (val.type())\n        {\n            case value_t::boolean:\n                JSONSerializer<other_boolean_t>::to_json(*this, val.template get<other_boolean_t>());\n                break;\n            case value_t::number_float:\n                JSONSerializer<other_number_float_t>::to_json(*this, val.template get<other_number_float_t>());\n                break;\n            case value_t::number_integer:\n                JSONSerializer<other_number_integer_t>::to_json(*this, val.template get<other_number_integer_t>());\n                break;\n            case value_t::number_unsigned:\n                JSONSerializer<other_number_unsigned_t>::to_json(*this, val.template get<other_number_unsigned_t>());\n                break;\n            case value_t::string:\n                JSONSerializer<other_string_t>::to_json(*this, val.template get_ref<const other_string_t&>());\n                break;\n            case value_t::object:\n                JSONSerializer<other_object_t>::to_json(*this, val.template get_ref<const other_object_t&>());\n                break;\n            case value_t::array:\n                JSONSerializer<other_array_t>::to_json(*this, val.template get_ref<const other_array_t&>());\n                break;\n            case value_t::binary:\n                JSONSerializer<other_binary_t>::to_json(*this, val.template get_ref<const other_binary_t&>());\n                break;\n            case value_t::null:\n                *this = nullptr;\n                break;\n            case value_t::discarded:\n                m_type = value_t::discarded;\n                break;\n            default:            // LCOV_EXCL_LINE\n                JSON_ASSERT(false);  // LCOV_EXCL_LINE\n        }\n        assert_invariant();\n    }\n\n    /*!\n    @brief create a container (array or object) from an initializer list\n\n    Creates a JSON value of type array or object from the passed initializer\n    list @a init. In case @a type_deduction is `true` (default), the type of\n    the JSON value to be created is deducted from the initializer list @a init\n    according to the following rules:\n\n    1. If the list is empty, an empty JSON object value `{}` is created.\n    2. If the list consists of pairs whose first element is a string, a JSON\n       object value is created where the first elements of the pairs are\n       treated as keys and the second elements are as values.\n    3. In all other cases, an array is created.\n\n    The rules aim to create the best fit between a C++ initializer list and\n    JSON values. The rationale is as follows:\n\n    1. The empty initializer list is written as `{}` which is exactly an empty\n       JSON object.\n    2. C++ has no way of describing mapped types other than to list a list of\n       pairs. As JSON requires that keys must be of type string, rule 2 is the\n       weakest constraint one can pose on initializer lists to interpret them\n       as an object.\n    3. In all other cases, the initializer list could not be interpreted as\n       JSON object type, so interpreting it as JSON array type is safe.\n\n    With the rules described above, the following JSON values cannot be\n    expressed by an initializer list:\n\n    - the empty array (`[]`): use @ref array(initializer_list_t)\n      with an empty initializer list in this case\n    - arrays whose elements satisfy rule 2: use @ref\n      array(initializer_list_t) with the same initializer list\n      in this case\n\n    @note When used without parentheses around an empty initializer list, @ref\n    basic_json() is called instead of this function, yielding the JSON null\n    value.\n\n    @param[in] init  initializer list with JSON values\n\n    @param[in] type_deduction internal parameter; when set to `true`, the type\n    of the JSON value is deducted from the initializer list @a init; when set\n    to `false`, the type provided via @a manual_type is forced. This mode is\n    used by the functions @ref array(initializer_list_t) and\n    @ref object(initializer_list_t).\n\n    @param[in] manual_type internal parameter; when @a type_deduction is set\n    to `false`, the created JSON value will use the provided type (only @ref\n    value_t::array and @ref value_t::object are valid); when @a type_deduction\n    is set to `true`, this parameter has no effect\n\n    @throw type_error.301 if @a type_deduction is `false`, @a manual_type is\n    `value_t::object`, but @a init contains an element which is not a pair\n    whose first element is a string. In this case, the constructor could not\n    create an object. If @a type_deduction would have be `true`, an array\n    would have been created. See @ref object(initializer_list_t)\n    for an example.\n\n    @complexity Linear in the size of the initializer list @a init.\n\n    @exceptionsafety Strong guarantee: if an exception is thrown, there are no\n    changes to any JSON value.\n\n    @liveexample{The example below shows how JSON values are created from\n    initializer lists.,basic_json__list_init_t}\n\n    @sa @ref array(initializer_list_t) -- create a JSON array\n    value from an initializer list\n    @sa @ref object(initializer_list_t) -- create a JSON object\n    value from an initializer list\n\n    @since version 1.0.0\n    */\n    basic_json(initializer_list_t init,\n               bool type_deduction = true,\n               value_t manual_type = value_t::array)\n    {\n        // check if each element is an array with two elements whose first\n        // element is a string\n        bool is_an_object = std::all_of(init.begin(), init.end(),\n                                        [](const detail::json_ref<basic_json>& element_ref)\n        {\n            return element_ref->is_array() && element_ref->size() == 2 && (*element_ref)[0].is_string();\n        });\n\n        // adjust type if type deduction is not wanted\n        if (!type_deduction)\n        {\n            // if array is wanted, do not create an object though possible\n            if (manual_type == value_t::array)\n            {\n                is_an_object = false;\n            }\n\n            // if object is wanted but impossible, throw an exception\n            if (JSON_HEDLEY_UNLIKELY(manual_type == value_t::object && !is_an_object))\n            {\n                JSON_THROW(type_error::create(301, \"cannot create object from initializer list\"));\n            }\n        }\n\n        if (is_an_object)\n        {\n            // the initializer list is a list of pairs -> create object\n            m_type = value_t::object;\n            m_value = value_t::object;\n\n            std::for_each(init.begin(), init.end(), [this](const detail::json_ref<basic_json>& element_ref)\n            {\n                auto element = element_ref.moved_or_copied();\n                m_value.object->emplace(\n                    std::move(*((*element.m_value.array)[0].m_value.string)),\n                    std::move((*element.m_value.array)[1]));\n            });\n        }\n        else\n        {\n            // the initializer list describes an array -> create array\n            m_type = value_t::array;\n            m_value.array = create<array_t>(init.begin(), init.end());\n        }\n\n        assert_invariant();\n    }\n\n    /*!\n    @brief explicitly create a binary array (without subtype)\n\n    Creates a JSON binary array value from a given binary container. Binary\n    values are part of various binary formats, such as CBOR, MessagePack, and\n    BSON. This constructor is used to create a value for serialization to those\n    formats.\n\n    @note Note, this function exists because of the difficulty in correctly\n    specifying the correct template overload in the standard value ctor, as both\n    JSON arrays and JSON binary arrays are backed with some form of a\n    `std::vector`. Because JSON binary arrays are a non-standard extension it\n    was decided that it would be best to prevent automatic initialization of a\n    binary array type, for backwards compatibility and so it does not happen on\n    accident.\n\n    @param[in] init container containing bytes to use as binary type\n\n    @return JSON binary array value\n\n    @complexity Linear in the size of @a init.\n\n    @exceptionsafety Strong guarantee: if an exception is thrown, there are no\n    changes to any JSON value.\n\n    @since version 3.8.0\n    */\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json binary(const typename binary_t::container_type& init)\n    {\n        auto res = basic_json();\n        res.m_type = value_t::binary;\n        res.m_value = init;\n        return res;\n    }\n\n    /*!\n    @brief explicitly create a binary array (with subtype)\n\n    Creates a JSON binary array value from a given binary container. Binary\n    values are part of various binary formats, such as CBOR, MessagePack, and\n    BSON. This constructor is used to create a value for serialization to those\n    formats.\n\n    @note Note, this function exists because of the difficulty in correctly\n    specifying the correct template overload in the standard value ctor, as both\n    JSON arrays and JSON binary arrays are backed with some form of a\n    `std::vector`. Because JSON binary arrays are a non-standard extension it\n    was decided that it would be best to prevent automatic initialization of a\n    binary array type, for backwards compatibility and so it does not happen on\n    accident.\n\n    @param[in] init container containing bytes to use as binary type\n    @param[in] subtype subtype to use in MessagePack and BSON\n\n    @return JSON binary array value\n\n    @complexity Linear in the size of @a init.\n\n    @exceptionsafety Strong guarantee: if an exception is thrown, there are no\n    changes to any JSON value.\n\n    @since version 3.8.0\n    */\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json binary(const typename binary_t::container_type& init, std::uint8_t subtype)\n    {\n        auto res = basic_json();\n        res.m_type = value_t::binary;\n        res.m_value = binary_t(init, subtype);\n        return res;\n    }\n\n    /// @copydoc binary(const typename binary_t::container_type&)\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json binary(typename binary_t::container_type&& init)\n    {\n        auto res = basic_json();\n        res.m_type = value_t::binary;\n        res.m_value = std::move(init);\n        return res;\n    }\n\n    /// @copydoc binary(const typename binary_t::container_type&, std::uint8_t)\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json binary(typename binary_t::container_type&& init, std::uint8_t subtype)\n    {\n        auto res = basic_json();\n        res.m_type = value_t::binary;\n        res.m_value = binary_t(std::move(init), subtype);\n        return res;\n    }\n\n    /*!\n    @brief explicitly create an array from an initializer list\n\n    Creates a JSON array value from a given initializer list. That is, given a\n    list of values `a, b, c`, creates the JSON value `[a, b, c]`. If the\n    initializer list is empty, the empty array `[]` is created.\n\n    @note This function is only needed to express two edge cases that cannot\n    be realized with the initializer list constructor (@ref\n    basic_json(initializer_list_t, bool, value_t)). These cases\n    are:\n    1. creating an array whose elements are all pairs whose first element is a\n    string -- in this case, the initializer list constructor would create an\n    object, taking the first elements as keys\n    2. creating an empty array -- passing the empty initializer list to the\n    initializer list constructor yields an empty object\n\n    @param[in] init  initializer list with JSON values to create an array from\n    (optional)\n\n    @return JSON array value\n\n    @complexity Linear in the size of @a init.\n\n    @exceptionsafety Strong guarantee: if an exception is thrown, there are no\n    changes to any JSON value.\n\n    @liveexample{The following code shows an example for the `array`\n    function.,array}\n\n    @sa @ref basic_json(initializer_list_t, bool, value_t) --\n    create a JSON value from an initializer list\n    @sa @ref object(initializer_list_t) -- create a JSON object\n    value from an initializer list\n\n    @since version 1.0.0\n    */\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json array(initializer_list_t init = {})\n    {\n        return basic_json(init, false, value_t::array);\n    }\n\n    /*!\n    @brief explicitly create an object from an initializer list\n\n    Creates a JSON object value from a given initializer list. The initializer\n    lists elements must be pairs, and their first elements must be strings. If\n    the initializer list is empty, the empty object `{}` is created.\n\n    @note This function is only added for symmetry reasons. In contrast to the\n    related function @ref array(initializer_list_t), there are\n    no cases which can only be expressed by this function. That is, any\n    initializer list @a init can also be passed to the initializer list\n    constructor @ref basic_json(initializer_list_t, bool, value_t).\n\n    @param[in] init  initializer list to create an object from (optional)\n\n    @return JSON object value\n\n    @throw type_error.301 if @a init is not a list of pairs whose first\n    elements are strings. In this case, no object can be created. When such a\n    value is passed to @ref basic_json(initializer_list_t, bool, value_t),\n    an array would have been created from the passed initializer list @a init.\n    See example below.\n\n    @complexity Linear in the size of @a init.\n\n    @exceptionsafety Strong guarantee: if an exception is thrown, there are no\n    changes to any JSON value.\n\n    @liveexample{The following code shows an example for the `object`\n    function.,object}\n\n    @sa @ref basic_json(initializer_list_t, bool, value_t) --\n    create a JSON value from an initializer list\n    @sa @ref array(initializer_list_t) -- create a JSON array\n    value from an initializer list\n\n    @since version 1.0.0\n    */\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json object(initializer_list_t init = {})\n    {\n        return basic_json(init, false, value_t::object);\n    }\n\n    /*!\n    @brief construct an array with count copies of given value\n\n    Constructs a JSON array value by creating @a cnt copies of a passed value.\n    In case @a cnt is `0`, an empty array is created.\n\n    @param[in] cnt  the number of JSON copies of @a val to create\n    @param[in] val  the JSON value to copy\n\n    @post `std::distance(begin(),end()) == cnt` holds.\n\n    @complexity Linear in @a cnt.\n\n    @exceptionsafety Strong guarantee: if an exception is thrown, there are no\n    changes to any JSON value.\n\n    @liveexample{The following code shows examples for the @ref\n    basic_json(size_type\\, const basic_json&)\n    constructor.,basic_json__size_type_basic_json}\n\n    @since version 1.0.0\n    */\n    basic_json(size_type cnt, const basic_json& val)\n        : m_type(value_t::array)\n    {\n        m_value.array = create<array_t>(cnt, val);\n        assert_invariant();\n    }\n\n    /*!\n    @brief construct a JSON container given an iterator range\n\n    Constructs the JSON value with the contents of the range `[first, last)`.\n    The semantics depends on the different types a JSON value can have:\n    - In case of a null type, invalid_iterator.206 is thrown.\n    - In case of other primitive types (number, boolean, or string), @a first\n      must be `begin()` and @a last must be `end()`. In this case, the value is\n      copied. Otherwise, invalid_iterator.204 is thrown.\n    - In case of structured types (array, object), the constructor behaves as\n      similar versions for `std::vector` or `std::map`; that is, a JSON array\n      or object is constructed from the values in the range.\n\n    @tparam InputIT an input iterator type (@ref iterator or @ref\n    const_iterator)\n\n    @param[in] first begin of the range to copy from (included)\n    @param[in] last end of the range to copy from (excluded)\n\n    @pre Iterators @a first and @a last must be initialized. **This\n         precondition is enforced with an assertion (see warning).** If\n         assertions are switched off, a violation of this precondition yields\n         undefined behavior.\n\n    @pre Range `[first, last)` is valid. Usually, this precondition cannot be\n         checked efficiently. Only certain edge cases are detected; see the\n         description of the exceptions below. A violation of this precondition\n         yields undefined behavior.\n\n    @warning A precondition is enforced with a runtime assertion that will\n             result in calling `std::abort` if this precondition is not met.\n             Assertions can be disabled by defining `NDEBUG` at compile time.\n             See https://en.cppreference.com/w/cpp/error/assert for more\n             information.\n\n    @throw invalid_iterator.201 if iterators @a first and @a last are not\n    compatible (i.e., do not belong to the same JSON value). In this case,\n    the range `[first, last)` is undefined.\n    @throw invalid_iterator.204 if iterators @a first and @a last belong to a\n    primitive type (number, boolean, or string), but @a first does not point\n    to the first element any more. In this case, the range `[first, last)` is\n    undefined. See example code below.\n    @throw invalid_iterator.206 if iterators @a first and @a last belong to a\n    null value. In this case, the range `[first, last)` is undefined.\n\n    @complexity Linear in distance between @a first and @a last.\n\n    @exceptionsafety Strong guarantee: if an exception is thrown, there are no\n    changes to any JSON value.\n\n    @liveexample{The example below shows several ways to create JSON values by\n    specifying a subrange with iterators.,basic_json__InputIt_InputIt}\n\n    @since version 1.0.0\n    */\n    template < class InputIT, typename std::enable_if <\n                   std::is_same<InputIT, typename basic_json_t::iterator>::value ||\n                   std::is_same<InputIT, typename basic_json_t::const_iterator>::value, int >::type = 0 >\n    basic_json(InputIT first, InputIT last)\n    {\n        JSON_ASSERT(first.m_object != nullptr);\n        JSON_ASSERT(last.m_object != nullptr);\n\n        // make sure iterator fits the current value\n        if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object))\n        {\n            JSON_THROW(invalid_iterator::create(201, \"iterators are not compatible\"));\n        }\n\n        // copy type from first iterator\n        m_type = first.m_object->m_type;\n\n        // check if iterator range is complete for primitive values\n        switch (m_type)\n        {\n            case value_t::boolean:\n            case value_t::number_float:\n            case value_t::number_integer:\n            case value_t::number_unsigned:\n            case value_t::string:\n            {\n                if (JSON_HEDLEY_UNLIKELY(!first.m_it.primitive_iterator.is_begin()\n                                         || !last.m_it.primitive_iterator.is_end()))\n                {\n                    JSON_THROW(invalid_iterator::create(204, \"iterators out of range\"));\n                }\n                break;\n            }\n\n            default:\n                break;\n        }\n\n        switch (m_type)\n        {\n            case value_t::number_integer:\n            {\n                m_value.number_integer = first.m_object->m_value.number_integer;\n                break;\n            }\n\n            case value_t::number_unsigned:\n            {\n                m_value.number_unsigned = first.m_object->m_value.number_unsigned;\n                break;\n            }\n\n            case value_t::number_float:\n            {\n                m_value.number_float = first.m_object->m_value.number_float;\n                break;\n            }\n\n            case value_t::boolean:\n            {\n                m_value.boolean = first.m_object->m_value.boolean;\n                break;\n            }\n\n            case value_t::string:\n            {\n                m_value = *first.m_object->m_value.string;\n                break;\n            }\n\n            case value_t::object:\n            {\n                m_value.object = create<object_t>(first.m_it.object_iterator,\n                                                  last.m_it.object_iterator);\n                break;\n            }\n\n            case value_t::array:\n            {\n                m_value.array = create<array_t>(first.m_it.array_iterator,\n                                                last.m_it.array_iterator);\n                break;\n            }\n\n            case value_t::binary:\n            {\n                m_value = *first.m_object->m_value.binary;\n                break;\n            }\n\n            default:\n                JSON_THROW(invalid_iterator::create(206, \"cannot construct with iterators from \" +\n                                                    std::string(first.m_object->type_name())));\n        }\n\n        assert_invariant();\n    }\n\n\n    ///////////////////////////////////////\n    // other constructors and destructor //\n    ///////////////////////////////////////\n\n    template<typename JsonRef,\n             detail::enable_if_t<detail::conjunction<detail::is_json_ref<JsonRef>,\n                                 std::is_same<typename JsonRef::value_type, basic_json>>::value, int> = 0 >\n    basic_json(const JsonRef& ref) : basic_json(ref.moved_or_copied()) {}\n\n    /*!\n    @brief copy constructor\n\n    Creates a copy of a given JSON value.\n\n    @param[in] other  the JSON value to copy\n\n    @post `*this == other`\n\n    @complexity Linear in the size of @a other.\n\n    @exceptionsafety Strong guarantee: if an exception is thrown, there are no\n    changes to any JSON value.\n\n    @requirement This function helps `basic_json` satisfying the\n    [Container](https://en.cppreference.com/w/cpp/named_req/Container)\n    requirements:\n    - The complexity is linear.\n    - As postcondition, it holds: `other == basic_json(other)`.\n\n    @liveexample{The following code shows an example for the copy\n    constructor.,basic_json__basic_json}\n\n    @since version 1.0.0\n    */\n    basic_json(const basic_json& other)\n        : m_type(other.m_type)\n    {\n        // check of passed value is valid\n        other.assert_invariant();\n\n        switch (m_type)\n        {\n            case value_t::object:\n            {\n                m_value = *other.m_value.object;\n                break;\n            }\n\n            case value_t::array:\n            {\n                m_value = *other.m_value.array;\n                break;\n            }\n\n            case value_t::string:\n            {\n                m_value = *other.m_value.string;\n                break;\n            }\n\n            case value_t::boolean:\n            {\n                m_value = other.m_value.boolean;\n                break;\n            }\n\n            case value_t::number_integer:\n            {\n                m_value = other.m_value.number_integer;\n                break;\n            }\n\n            case value_t::number_unsigned:\n            {\n                m_value = other.m_value.number_unsigned;\n                break;\n            }\n\n            case value_t::number_float:\n            {\n                m_value = other.m_value.number_float;\n                break;\n            }\n\n            case value_t::binary:\n            {\n                m_value = *other.m_value.binary;\n                break;\n            }\n\n            default:\n                break;\n        }\n\n        assert_invariant();\n    }\n\n    /*!\n    @brief move constructor\n\n    Move constructor. Constructs a JSON value with the contents of the given\n    value @a other using move semantics. It \"steals\" the resources from @a\n    other and leaves it as JSON null value.\n\n    @param[in,out] other  value to move to this object\n\n    @post `*this` has the same value as @a other before the call.\n    @post @a other is a JSON null value.\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this constructor never throws\n    exceptions.\n\n    @requirement This function helps `basic_json` satisfying the\n    [MoveConstructible](https://en.cppreference.com/w/cpp/named_req/MoveConstructible)\n    requirements.\n\n    @liveexample{The code below shows the move constructor explicitly called\n    via std::move.,basic_json__moveconstructor}\n\n    @since version 1.0.0\n    */\n    basic_json(basic_json&& other) noexcept\n        : m_type(std::move(other.m_type)),\n          m_value(std::move(other.m_value))\n    {\n        // check that passed value is valid\n        other.assert_invariant();\n\n        // invalidate payload\n        other.m_type = value_t::null;\n        other.m_value = {};\n\n        assert_invariant();\n    }\n\n    /*!\n    @brief copy assignment\n\n    Copy assignment operator. Copies a JSON value via the \"copy and swap\"\n    strategy: It is expressed in terms of the copy constructor, destructor,\n    and the `swap()` member function.\n\n    @param[in] other  value to copy from\n\n    @complexity Linear.\n\n    @requirement This function helps `basic_json` satisfying the\n    [Container](https://en.cppreference.com/w/cpp/named_req/Container)\n    requirements:\n    - The complexity is linear.\n\n    @liveexample{The code below shows and example for the copy assignment. It\n    creates a copy of value `a` which is then swapped with `b`. Finally\\, the\n    copy of `a` (which is the null value after the swap) is\n    destroyed.,basic_json__copyassignment}\n\n    @since version 1.0.0\n    */\n    basic_json& operator=(basic_json other) noexcept (\n        std::is_nothrow_move_constructible<value_t>::value&&\n        std::is_nothrow_move_assignable<value_t>::value&&\n        std::is_nothrow_move_constructible<json_value>::value&&\n        std::is_nothrow_move_assignable<json_value>::value\n    )\n    {\n        // check that passed value is valid\n        other.assert_invariant();\n\n        using std::swap;\n        swap(m_type, other.m_type);\n        swap(m_value, other.m_value);\n\n        assert_invariant();\n        return *this;\n    }\n\n    /*!\n    @brief destructor\n\n    Destroys the JSON value and frees all allocated memory.\n\n    @complexity Linear.\n\n    @requirement This function helps `basic_json` satisfying the\n    [Container](https://en.cppreference.com/w/cpp/named_req/Container)\n    requirements:\n    - The complexity is linear.\n    - All stored elements are destroyed and all memory is freed.\n\n    @since version 1.0.0\n    */\n    ~basic_json() noexcept\n    {\n        assert_invariant();\n        m_value.destroy(m_type);\n    }\n\n    /// @}\n\n  public:\n    ///////////////////////\n    // object inspection //\n    ///////////////////////\n\n    /// @name object inspection\n    /// Functions to inspect the type of a JSON value.\n    /// @{\n\n    /*!\n    @brief serialization\n\n    Serialization function for JSON values. The function tries to mimic\n    Python's `json.dumps()` function, and currently supports its @a indent\n    and @a ensure_ascii parameters.\n\n    @param[in] indent If indent is nonnegative, then array elements and object\n    members will be pretty-printed with that indent level. An indent level of\n    `0` will only insert newlines. `-1` (the default) selects the most compact\n    representation.\n    @param[in] indent_char The character to use for indentation if @a indent is\n    greater than `0`. The default is ` ` (space).\n    @param[in] ensure_ascii If @a ensure_ascii is true, all non-ASCII characters\n    in the output are escaped with `\\uXXXX` sequences, and the result consists\n    of ASCII characters only.\n    @param[in] error_handler  how to react on decoding errors; there are three\n    possible values: `strict` (throws and exception in case a decoding error\n    occurs; default), `replace` (replace invalid UTF-8 sequences with U+FFFD),\n    and `ignore` (ignore invalid UTF-8 sequences during serialization; all\n    bytes are copied to the output unchanged).\n\n    @return string containing the serialization of the JSON value\n\n    @throw type_error.316 if a string stored inside the JSON value is not\n                          UTF-8 encoded and @a error_handler is set to strict\n\n    @note Binary values are serialized as object containing two keys:\n      - \"bytes\": an array of bytes as integers\n      - \"subtype\": the subtype as integer or \"null\" if the binary has no subtype\n\n    @complexity Linear.\n\n    @exceptionsafety Strong guarantee: if an exception is thrown, there are no\n    changes in the JSON value.\n\n    @liveexample{The following example shows the effect of different @a indent\\,\n    @a indent_char\\, and @a ensure_ascii parameters to the result of the\n    serialization.,dump}\n\n    @see https://docs.python.org/2/library/json.html#json.dump\n\n    @since version 1.0.0; indentation character @a indent_char, option\n           @a ensure_ascii and exceptions added in version 3.0.0; error\n           handlers added in version 3.4.0; serialization of binary values added\n           in version 3.8.0.\n    */\n    string_t dump(const int indent = -1,\n                  const char indent_char = ' ',\n                  const bool ensure_ascii = false,\n                  const error_handler_t error_handler = error_handler_t::strict) const\n    {\n        string_t result;\n        serializer s(detail::output_adapter<char, string_t>(result), indent_char, error_handler);\n\n        if (indent >= 0)\n        {\n            s.dump(*this, true, ensure_ascii, static_cast<unsigned int>(indent));\n        }\n        else\n        {\n            s.dump(*this, false, ensure_ascii, 0);\n        }\n\n        return result;\n    }\n\n    /*!\n    @brief return the type of the JSON value (explicit)\n\n    Return the type of the JSON value as a value from the @ref value_t\n    enumeration.\n\n    @return the type of the JSON value\n            Value type                | return value\n            ------------------------- | -------------------------\n            null                      | value_t::null\n            boolean                   | value_t::boolean\n            string                    | value_t::string\n            number (integer)          | value_t::number_integer\n            number (unsigned integer) | value_t::number_unsigned\n            number (floating-point)   | value_t::number_float\n            object                    | value_t::object\n            array                     | value_t::array\n            binary                    | value_t::binary\n            discarded                 | value_t::discarded\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this member function never throws\n    exceptions.\n\n    @liveexample{The following code exemplifies `type()` for all JSON\n    types.,type}\n\n    @sa @ref operator value_t() -- return the type of the JSON value (implicit)\n    @sa @ref type_name() -- return the type as string\n\n    @since version 1.0.0\n    */\n    constexpr value_t type() const noexcept\n    {\n        return m_type;\n    }\n\n    /*!\n    @brief return whether type is primitive\n\n    This function returns true if and only if the JSON type is primitive\n    (string, number, boolean, or null).\n\n    @return `true` if type is primitive (string, number, boolean, or null),\n    `false` otherwise.\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this member function never throws\n    exceptions.\n\n    @liveexample{The following code exemplifies `is_primitive()` for all JSON\n    types.,is_primitive}\n\n    @sa @ref is_structured() -- returns whether JSON value is structured\n    @sa @ref is_null() -- returns whether JSON value is `null`\n    @sa @ref is_string() -- returns whether JSON value is a string\n    @sa @ref is_boolean() -- returns whether JSON value is a boolean\n    @sa @ref is_number() -- returns whether JSON value is a number\n    @sa @ref is_binary() -- returns whether JSON value is a binary array\n\n    @since version 1.0.0\n    */\n    constexpr bool is_primitive() const noexcept\n    {\n        return is_null() || is_string() || is_boolean() || is_number() || is_binary();\n    }\n\n    /*!\n    @brief return whether type is structured\n\n    This function returns true if and only if the JSON type is structured\n    (array or object).\n\n    @return `true` if type is structured (array or object), `false` otherwise.\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this member function never throws\n    exceptions.\n\n    @liveexample{The following code exemplifies `is_structured()` for all JSON\n    types.,is_structured}\n\n    @sa @ref is_primitive() -- returns whether value is primitive\n    @sa @ref is_array() -- returns whether value is an array\n    @sa @ref is_object() -- returns whether value is an object\n\n    @since version 1.0.0\n    */\n    constexpr bool is_structured() const noexcept\n    {\n        return is_array() || is_object();\n    }\n\n    /*!\n    @brief return whether value is null\n\n    This function returns true if and only if the JSON value is null.\n\n    @return `true` if type is null, `false` otherwise.\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this member function never throws\n    exceptions.\n\n    @liveexample{The following code exemplifies `is_null()` for all JSON\n    types.,is_null}\n\n    @since version 1.0.0\n    */\n    constexpr bool is_null() const noexcept\n    {\n        return m_type == value_t::null;\n    }\n\n    /*!\n    @brief return whether value is a boolean\n\n    This function returns true if and only if the JSON value is a boolean.\n\n    @return `true` if type is boolean, `false` otherwise.\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this member function never throws\n    exceptions.\n\n    @liveexample{The following code exemplifies `is_boolean()` for all JSON\n    types.,is_boolean}\n\n    @since version 1.0.0\n    */\n    constexpr bool is_boolean() const noexcept\n    {\n        return m_type == value_t::boolean;\n    }\n\n    /*!\n    @brief return whether value is a number\n\n    This function returns true if and only if the JSON value is a number. This\n    includes both integer (signed and unsigned) and floating-point values.\n\n    @return `true` if type is number (regardless whether integer, unsigned\n    integer or floating-type), `false` otherwise.\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this member function never throws\n    exceptions.\n\n    @liveexample{The following code exemplifies `is_number()` for all JSON\n    types.,is_number}\n\n    @sa @ref is_number_integer() -- check if value is an integer or unsigned\n    integer number\n    @sa @ref is_number_unsigned() -- check if value is an unsigned integer\n    number\n    @sa @ref is_number_float() -- check if value is a floating-point number\n\n    @since version 1.0.0\n    */\n    constexpr bool is_number() const noexcept\n    {\n        return is_number_integer() || is_number_float();\n    }\n\n    /*!\n    @brief return whether value is an integer number\n\n    This function returns true if and only if the JSON value is a signed or\n    unsigned integer number. This excludes floating-point values.\n\n    @return `true` if type is an integer or unsigned integer number, `false`\n    otherwise.\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this member function never throws\n    exceptions.\n\n    @liveexample{The following code exemplifies `is_number_integer()` for all\n    JSON types.,is_number_integer}\n\n    @sa @ref is_number() -- check if value is a number\n    @sa @ref is_number_unsigned() -- check if value is an unsigned integer\n    number\n    @sa @ref is_number_float() -- check if value is a floating-point number\n\n    @since version 1.0.0\n    */\n    constexpr bool is_number_integer() const noexcept\n    {\n        return m_type == value_t::number_integer || m_type == value_t::number_unsigned;\n    }\n\n    /*!\n    @brief return whether value is an unsigned integer number\n\n    This function returns true if and only if the JSON value is an unsigned\n    integer number. This excludes floating-point and signed integer values.\n\n    @return `true` if type is an unsigned integer number, `false` otherwise.\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this member function never throws\n    exceptions.\n\n    @liveexample{The following code exemplifies `is_number_unsigned()` for all\n    JSON types.,is_number_unsigned}\n\n    @sa @ref is_number() -- check if value is a number\n    @sa @ref is_number_integer() -- check if value is an integer or unsigned\n    integer number\n    @sa @ref is_number_float() -- check if value is a floating-point number\n\n    @since version 2.0.0\n    */\n    constexpr bool is_number_unsigned() const noexcept\n    {\n        return m_type == value_t::number_unsigned;\n    }\n\n    /*!\n    @brief return whether value is a floating-point number\n\n    This function returns true if and only if the JSON value is a\n    floating-point number. This excludes signed and unsigned integer values.\n\n    @return `true` if type is a floating-point number, `false` otherwise.\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this member function never throws\n    exceptions.\n\n    @liveexample{The following code exemplifies `is_number_float()` for all\n    JSON types.,is_number_float}\n\n    @sa @ref is_number() -- check if value is number\n    @sa @ref is_number_integer() -- check if value is an integer number\n    @sa @ref is_number_unsigned() -- check if value is an unsigned integer\n    number\n\n    @since version 1.0.0\n    */\n    constexpr bool is_number_float() const noexcept\n    {\n        return m_type == value_t::number_float;\n    }\n\n    /*!\n    @brief return whether value is an object\n\n    This function returns true if and only if the JSON value is an object.\n\n    @return `true` if type is object, `false` otherwise.\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this member function never throws\n    exceptions.\n\n    @liveexample{The following code exemplifies `is_object()` for all JSON\n    types.,is_object}\n\n    @since version 1.0.0\n    */\n    constexpr bool is_object() const noexcept\n    {\n        return m_type == value_t::object;\n    }\n\n    /*!\n    @brief return whether value is an array\n\n    This function returns true if and only if the JSON value is an array.\n\n    @return `true` if type is array, `false` otherwise.\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this member function never throws\n    exceptions.\n\n    @liveexample{The following code exemplifies `is_array()` for all JSON\n    types.,is_array}\n\n    @since version 1.0.0\n    */\n    constexpr bool is_array() const noexcept\n    {\n        return m_type == value_t::array;\n    }\n\n    /*!\n    @brief return whether value is a string\n\n    This function returns true if and only if the JSON value is a string.\n\n    @return `true` if type is string, `false` otherwise.\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this member function never throws\n    exceptions.\n\n    @liveexample{The following code exemplifies `is_string()` for all JSON\n    types.,is_string}\n\n    @since version 1.0.0\n    */\n    constexpr bool is_string() const noexcept\n    {\n        return m_type == value_t::string;\n    }\n\n    /*!\n    @brief return whether value is a binary array\n\n    This function returns true if and only if the JSON value is a binary array.\n\n    @return `true` if type is binary array, `false` otherwise.\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this member function never throws\n    exceptions.\n\n    @liveexample{The following code exemplifies `is_binary()` for all JSON\n    types.,is_binary}\n\n    @since version 3.8.0\n    */\n    constexpr bool is_binary() const noexcept\n    {\n        return m_type == value_t::binary;\n    }\n\n    /*!\n    @brief return whether value is discarded\n\n    This function returns true if and only if the JSON value was discarded\n    during parsing with a callback function (see @ref parser_callback_t).\n\n    @note This function will always be `false` for JSON values after parsing.\n    That is, discarded values can only occur during parsing, but will be\n    removed when inside a structured value or replaced by null in other cases.\n\n    @return `true` if type is discarded, `false` otherwise.\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this member function never throws\n    exceptions.\n\n    @liveexample{The following code exemplifies `is_discarded()` for all JSON\n    types.,is_discarded}\n\n    @since version 1.0.0\n    */\n    constexpr bool is_discarded() const noexcept\n    {\n        return m_type == value_t::discarded;\n    }\n\n    /*!\n    @brief return the type of the JSON value (implicit)\n\n    Implicitly return the type of the JSON value as a value from the @ref\n    value_t enumeration.\n\n    @return the type of the JSON value\n\n    @complexity Constant.\n\n    @exceptionsafety No-throw guarantee: this member function never throws\n    exceptions.\n\n    @liveexample{The following code exemplifies the @ref value_t operator for\n    all JSON types.,operator__value_t}\n\n    @sa @ref type() -- return the type of the JSON value (explicit)\n    @sa @ref type_name() -- return the type as string\n\n    @since version 1.0.0\n    */\n    constexpr operator value_t() const noexcept\n    {\n        return m_type;\n    }\n\n    /// @}\n\n  private:\n    //////////////////\n    // value access //\n    //////////////////\n\n    /// get a boolean (explicit)\n    boolean_t get_impl(boolean_t* /*unused*/) const\n    {\n        if (JSON_HEDLEY_LIKELY(is_boolean()))\n        {\n            return m_value.boolean;\n        }\n\n        JSON_THROW(type_error::create(302, \"type must be boolean, but is \" + std::string(type_name())));\n    }\n\n    /// get a pointer to the value (object)\n    object_t* get_impl_ptr(object_t* /*unused*/) noexcept\n    {\n        return is_object() ? m_value.object : nullptr;\n    }\n\n    /// get a pointer to the value (object)\n    constexpr const object_t* get_impl_ptr(const object_t* /*unused*/) const noexcept\n    {\n        return is_object() ? m_value.object : nullptr;\n    }\n\n    /// get a pointer to the value (array)\n    array_t* get_impl_ptr(array_t* /*unused*/) noexcept\n    {\n        return is_array() ? m_value.array : nullptr;\n    }\n\n    /// get a pointer to the value (array)\n    constexpr const array_t* get_impl_ptr(const array_t* /*unused*/) const noexcept\n    {\n        return is_array() ? m_value.array : nullptr;\n    }\n\n    /// get a pointer to the value (string)\n    string_t* get_impl_ptr(string_t* /*unused*/) noexcept\n    {\n        return is_string() ? m_value.string : nullptr;\n    }\n\n    /// get a pointer to the value (string)\n    constexpr const string_t* get_impl_ptr(const string_t* /*unused*/) const noexcept\n    {\n        return is_string() ? m_value.string : nullptr;\n    }\n\n    /// get a pointer to the value (boolean)\n    boolean_t* get_impl_ptr(boolean_t* /*unused*/) noexcept\n    {\n        return is_boolean() ? &m_value.boolean : nullptr;\n    }\n\n    /// get a pointer to the value (boolean)\n    constexpr const boolean_t* get_impl_ptr(const boolean_t* /*unused*/) const noexcept\n    {\n        return is_boolean() ? &m_value.boolean : nullptr;\n    }\n\n    /// get a pointer to the value (integer number)\n    number_integer_t* get_impl_ptr(number_integer_t* /*unused*/) noexcept\n    {\n        return is_number_integer() ? &m_value.number_integer : nullptr;\n    }\n\n    /// get a pointer to the value (integer number)\n    constexpr const number_integer_t* get_impl_ptr(const number_integer_t* /*unused*/) const noexcept\n    {\n        return is_number_integer() ? &m_value.number_integer : nullptr;\n    }\n\n    /// get a pointer to the value (unsigned number)\n    number_unsigned_t* get_impl_ptr(number_unsigned_t* /*unused*/) noexcept\n    {\n        return is_number_unsigned() ? &m_value.number_unsigned : nullptr;\n    }\n\n    /// get a pointer to the value (unsigned number)\n    constexpr const number_unsigned_t* get_impl_ptr(const number_unsigned_t* /*unused*/) const noexcept\n    {\n        return is_number_unsigned() ? &m_value.number_unsigned : nullptr;\n    }\n\n    /// get a pointer to the value (floating-point number)\n    number_float_t* get_impl_ptr(number_float_t* /*unused*/) noexcept\n    {\n        return is_number_float() ? &m_value.number_float : nullptr;\n    }\n\n    /// get a pointer to the value (floating-point number)\n    constexpr const number_float_t* get_impl_ptr(const number_float_t* /*unused*/) const noexcept\n    {\n        return is_number_float() ? &m_value.number_float : nullptr;\n    }\n\n    /// get a pointer to the value (binary)\n    binary_t* get_impl_ptr(binary_t* /*unused*/) noexcept\n    {\n        return is_binary() ? m_value.binary : nullptr;\n    }\n\n    /// get a pointer to the value (binary)\n    constexpr const binary_t* get_impl_ptr(const binary_t* /*unused*/) const noexcept\n    {\n        return is_binary() ? m_value.binary : nullptr;\n    }\n\n    /*!\n    @brief helper function to implement get_ref()\n\n    This function helps to implement get_ref() without code duplication for\n    const and non-const overloads\n\n    @tparam ThisType will be deduced as `basic_json` or `const basic_json`\n\n    @throw type_error.303 if ReferenceType does not match underlying value\n    type of the current JSON\n    */\n    template<typename ReferenceType, typename ThisType>\n    static ReferenceType get_ref_impl(ThisType& obj)\n    {\n        // delegate the call to get_ptr<>()\n        auto ptr = obj.template get_ptr<typename std::add_pointer<ReferenceType>::type>();\n\n        if (JSON_HEDLEY_LIKELY(ptr != nullptr))\n        {\n            return *ptr;\n        }\n\n        JSON_THROW(type_error::create(303, \"incompatible ReferenceType for get_ref, actual type is \" + std::string(obj.type_name())));\n    }\n\n  public:\n    /// @name value access\n    /// Direct access to the stored value of a JSON value.\n    /// @{\n\n    /*!\n    @brief get special-case overload\n\n    This overloads avoids a lot of template boilerplate, it can be seen as the\n    identity method\n\n    @tparam BasicJsonType == @ref basic_json\n\n    @return a copy of *this\n\n    @complexity Constant.\n\n    @since version 2.1.0\n    */\n    template<typename BasicJsonType, detail::enable_if_t<\n                 std::is_same<typename std::remove_const<BasicJsonType>::type, basic_json_t>::value,\n                 int> = 0>\n    basic_json get() const\n    {\n        return *this;\n    }\n\n    /*!\n    @brief get special-case overload\n\n    This overloads converts the current @ref basic_json in a different\n    @ref basic_json type\n\n    @tparam BasicJsonType == @ref basic_json\n\n    @return a copy of *this, converted into @tparam BasicJsonType\n\n    @complexity Depending on the implementation of the called `from_json()`\n                method.\n\n    @since version 3.2.0\n    */\n    template < typename BasicJsonType, detail::enable_if_t <\n                   !std::is_same<BasicJsonType, basic_json>::value&&\n                   detail::is_basic_json<BasicJsonType>::value, int > = 0 >\n    BasicJsonType get() const\n    {\n        return *this;\n    }\n\n    /*!\n    @brief get a value (explicit)\n\n    Explicit type conversion between the JSON value and a compatible value\n    which is [CopyConstructible](https://en.cppreference.com/w/cpp/named_req/CopyConstructible)\n    and [DefaultConstructible](https://en.cppreference.com/w/cpp/named_req/DefaultConstructible).\n    The value is converted by calling the @ref json_serializer<ValueType>\n    `from_json()` method.\n\n    The function is equivalent to executing\n    @code {.cpp}\n    ValueType ret;\n    JSONSerializer<ValueType>::from_json(*this, ret);\n    return ret;\n    @endcode\n\n    This overloads is chosen if:\n    - @a ValueType is not @ref basic_json,\n    - @ref json_serializer<ValueType> has a `from_json()` method of the form\n      `void from_json(const basic_json&, ValueType&)`, and\n    - @ref json_serializer<ValueType> does not have a `from_json()` method of\n      the form `ValueType from_json(const basic_json&)`\n\n    @tparam ValueTypeCV the provided value type\n    @tparam ValueType the returned value type\n\n    @return copy of the JSON value, converted to @a ValueType\n\n    @throw what @ref json_serializer<ValueType> `from_json()` method throws\n\n    @liveexample{The example below shows several conversions from JSON values\n    to other types. There a few things to note: (1) Floating-point numbers can\n    be converted to integers\\, (2) A JSON array can be converted to a standard\n    `std::vector<short>`\\, (3) A JSON object can be converted to C++\n    associative containers such as `std::unordered_map<std::string\\,\n    json>`.,get__ValueType_const}\n\n    @since version 2.1.0\n    */\n    template < typename ValueTypeCV, typename ValueType = detail::uncvref_t<ValueTypeCV>,\n               detail::enable_if_t <\n                   !detail::is_basic_json<ValueType>::value &&\n                   detail::has_from_json<basic_json_t, ValueType>::value &&\n                   !detail::has_non_default_from_json<basic_json_t, ValueType>::value,\n                   int > = 0 >\n    ValueType get() const noexcept(noexcept(\n                                       JSONSerializer<ValueType>::from_json(std::declval<const basic_json_t&>(), std::declval<ValueType&>())))\n    {\n        // we cannot static_assert on ValueTypeCV being non-const, because\n        // there is support for get<const basic_json_t>(), which is why we\n        // still need the uncvref\n        static_assert(!std::is_reference<ValueTypeCV>::value,\n                      \"get() cannot be used with reference types, you might want to use get_ref()\");\n        static_assert(std::is_default_constructible<ValueType>::value,\n                      \"types must be DefaultConstructible when used with get()\");\n\n        ValueType ret;\n        JSONSerializer<ValueType>::from_json(*this, ret);\n        return ret;\n    }\n\n    /*!\n    @brief get a value (explicit); special case\n\n    Explicit type conversion between the JSON value and a compatible value\n    which is **not** [CopyConstructible](https://en.cppreference.com/w/cpp/named_req/CopyConstructible)\n    and **not** [DefaultConstructible](https://en.cppreference.com/w/cpp/named_req/DefaultConstructible).\n    The value is converted by calling the @ref json_serializer<ValueType>\n    `from_json()` method.\n\n    The function is equivalent to executing\n    @code {.cpp}\n    return JSONSerializer<ValueTypeCV>::from_json(*this);\n    @endcode\n\n    This overloads is chosen if:\n    - @a ValueType is not @ref basic_json and\n    - @ref json_serializer<ValueType> has a `from_json()` method of the form\n      `ValueType from_json(const basic_json&)`\n\n    @note If @ref json_serializer<ValueType> has both overloads of\n    `from_json()`, this one is chosen.\n\n    @tparam ValueTypeCV the provided value type\n    @tparam ValueType the returned value type\n\n    @return copy of the JSON value, converted to @a ValueType\n\n    @throw what @ref json_serializer<ValueType> `from_json()` method throws\n\n    @since version 2.1.0\n    */\n    template < typename ValueTypeCV, typename ValueType = detail::uncvref_t<ValueTypeCV>,\n               detail::enable_if_t < !std::is_same<basic_json_t, ValueType>::value &&\n                                     detail::has_non_default_from_json<basic_json_t, ValueType>::value,\n                                     int > = 0 >\n    ValueType get() const noexcept(noexcept(\n                                       JSONSerializer<ValueType>::from_json(std::declval<const basic_json_t&>())))\n    {\n        static_assert(!std::is_reference<ValueTypeCV>::value,\n                      \"get() cannot be used with reference types, you might want to use get_ref()\");\n        return JSONSerializer<ValueType>::from_json(*this);\n    }\n\n    /*!\n    @brief get a value (explicit)\n\n    Explicit type conversion between the JSON value and a compatible value.\n    The value is filled into the input parameter by calling the @ref json_serializer<ValueType>\n    `from_json()` method.\n\n    The function is equivalent to executing\n    @code {.cpp}\n    ValueType v;\n    JSONSerializer<ValueType>::from_json(*this, v);\n    @endcode\n\n    This overloads is chosen if:\n    - @a ValueType is not @ref basic_json,\n    - @ref json_serializer<ValueType> has a `from_json()` method of the form\n      `void from_json(const basic_json&, ValueType&)`, and\n\n    @tparam ValueType the input parameter type.\n\n    @return the input parameter, allowing chaining calls.\n\n    @throw what @ref json_serializer<ValueType> `from_json()` method throws\n\n    @liveexample{The example below shows several conversions from JSON values\n    to other types. There a few things to note: (1) Floating-point numbers can\n    be converted to integers\\, (2) A JSON array can be converted to a standard\n    `std::vector<short>`\\, (3) A JSON object can be converted to C++\n    associative containers such as `std::unordered_map<std::string\\,\n    json>`.,get_to}\n\n    @since version 3.3.0\n    */\n    template < typename ValueType,\n               detail::enable_if_t <\n                   !detail::is_basic_json<ValueType>::value&&\n                   detail::has_from_json<basic_json_t, ValueType>::value,\n                   int > = 0 >\n    ValueType & get_to(ValueType& v) const noexcept(noexcept(\n                JSONSerializer<ValueType>::from_json(std::declval<const basic_json_t&>(), v)))\n    {\n        JSONSerializer<ValueType>::from_json(*this, v);\n        return v;\n    }\n\n    // specialization to allow to call get_to with a basic_json value\n    // see https://github.com/nlohmann/json/issues/2175\n    template<typename ValueType,\n             detail::enable_if_t <\n                 detail::is_basic_json<ValueType>::value,\n                 int> = 0>\n    ValueType & get_to(ValueType& v) const\n    {\n        v = *this;\n        return v;\n    }\n\n    template <\n        typename T, std::size_t N,\n        typename Array = T (&)[N],\n        detail::enable_if_t <\n            detail::has_from_json<basic_json_t, Array>::value, int > = 0 >\n    Array get_to(T (&v)[N]) const\n    noexcept(noexcept(JSONSerializer<Array>::from_json(\n                          std::declval<const basic_json_t&>(), v)))\n    {\n        JSONSerializer<Array>::from_json(*this, v);\n        return v;\n    }\n\n\n    /*!\n    @brief get a pointer value (implicit)\n\n    Implicit pointer access to the internally stored JSON value. No copies are\n    made.\n\n    @warning Writing data to the pointee of the result yields an undefined\n    state.\n\n    @tparam PointerType pointer type; must be a pointer to @ref array_t, @ref\n    object_t, @ref string_t, @ref boolean_t, @ref number_integer_t,\n    @ref number_unsigned_t, or @ref number_float_t. Enforced by a static\n    assertion.\n\n    @return pointer to the internally stored JSON value if the requested\n    pointer type @a PointerType fits to the JSON value; `nullptr` otherwise\n\n    @complexity Constant.\n\n    @liveexample{The example below shows how pointers to internal values of a\n    JSON value can be requested. Note that no type conversions are made and a\n    `nullptr` is returned if the value and the requested pointer type does not\n    match.,get_ptr}\n\n    @since version 1.0.0\n    */\n    template<typename PointerType, typename std::enable_if<\n                 std::is_pointer<PointerType>::value, int>::type = 0>\n    auto get_ptr() noexcept -> decltype(std::declval<basic_json_t&>().get_impl_ptr(std::declval<PointerType>()))\n    {\n        // delegate the call to get_impl_ptr<>()\n        return get_impl_ptr(static_cast<PointerType>(nullptr));\n    }\n\n    /*!\n    @brief get a pointer value (implicit)\n    @copydoc get_ptr()\n    */\n    template < typename PointerType, typename std::enable_if <\n                   std::is_pointer<PointerType>::value&&\n                   std::is_const<typename std::remove_pointer<PointerType>::type>::value, int >::type = 0 >\n    constexpr auto get_ptr() const noexcept -> decltype(std::declval<const basic_json_t&>().get_impl_ptr(std::declval<PointerType>()))\n    {\n        // delegate the call to get_impl_ptr<>() const\n        return get_impl_ptr(static_cast<PointerType>(nullptr));\n    }\n\n    /*!\n    @brief get a pointer value (explicit)\n\n    Explicit pointer access to the internally stored JSON value. No copies are\n    made.\n\n    @warning The pointer becomes invalid if the underlying JSON object\n    changes.\n\n    @tparam PointerType pointer type; must be a pointer to @ref array_t, @ref\n    object_t, @ref string_t, @ref boolean_t, @ref number_integer_t,\n    @ref number_unsigned_t, or @ref number_float_t.\n\n    @return pointer to the internally stored JSON value if the requested\n    pointer type @a PointerType fits to the JSON value; `nullptr` otherwise\n\n    @complexity Constant.\n\n    @liveexample{The example below shows how pointers to internal values of a\n    JSON value can be requested. Note that no type conversions are made and a\n    `nullptr` is returned if the value and the requested pointer type does not\n    match.,get__PointerType}\n\n    @sa @ref get_ptr() for explicit pointer-member access\n\n    @since version 1.0.0\n    */\n    template<typename PointerType, typename std::enable_if<\n                 std::is_pointer<PointerType>::value, int>::type = 0>\n    auto get() noexcept -> decltype(std::declval<basic_json_t&>().template get_ptr<PointerType>())\n    {\n        // delegate the call to get_ptr\n        return get_ptr<PointerType>();\n    }\n\n    /*!\n    @brief get a pointer value (explicit)\n    @copydoc get()\n    */\n    template<typename PointerType, typename std::enable_if<\n                 std::is_pointer<PointerType>::value, int>::type = 0>\n    constexpr auto get() const noexcept -> decltype(std::declval<const basic_json_t&>().template get_ptr<PointerType>())\n    {\n        // delegate the call to get_ptr\n        return get_ptr<PointerType>();\n    }\n\n    /*!\n    @brief get a reference value (implicit)\n\n    Implicit reference access to the internally stored JSON value. No copies\n    are made.\n\n    @warning Writing data to the referee of the result yields an undefined\n    state.\n\n    @tparam ReferenceType reference type; must be a reference to @ref array_t,\n    @ref object_t, @ref string_t, @ref boolean_t, @ref number_integer_t, or\n    @ref number_float_t. Enforced by static assertion.\n\n    @return reference to the internally stored JSON value if the requested\n    reference type @a ReferenceType fits to the JSON value; throws\n    type_error.303 otherwise\n\n    @throw type_error.303 in case passed type @a ReferenceType is incompatible\n    with the stored JSON value; see example below\n\n    @complexity Constant.\n\n    @liveexample{The example shows several calls to `get_ref()`.,get_ref}\n\n    @since version 1.1.0\n    */\n    template<typename ReferenceType, typename std::enable_if<\n                 std::is_reference<ReferenceType>::value, int>::type = 0>\n    ReferenceType get_ref()\n    {\n        // delegate call to get_ref_impl\n        return get_ref_impl<ReferenceType>(*this);\n    }\n\n    /*!\n    @brief get a reference value (implicit)\n    @copydoc get_ref()\n    */\n    template < typename ReferenceType, typename std::enable_if <\n                   std::is_reference<ReferenceType>::value&&\n                   std::is_const<typename std::remove_reference<ReferenceType>::type>::value, int >::type = 0 >\n    ReferenceType get_ref() const\n    {\n        // delegate call to get_ref_impl\n        return get_ref_impl<ReferenceType>(*this);\n    }\n\n    /*!\n    @brief get a value (implicit)\n\n    Implicit type conversion between the JSON value and a compatible value.\n    The call is realized by calling @ref get() const.\n\n    @tparam ValueType non-pointer type compatible to the JSON value, for\n    instance `int` for JSON integer numbers, `bool` for JSON booleans, or\n    `std::vector` types for JSON arrays. The character type of @ref string_t\n    as well as an initializer list of this type is excluded to avoid\n    ambiguities as these types implicitly convert to `std::string`.\n\n    @return copy of the JSON value, converted to type @a ValueType\n\n    @throw type_error.302 in case passed type @a ValueType is incompatible\n    to the JSON value type (e.g., the JSON value is of type boolean, but a\n    string is requested); see example below\n\n    @complexity Linear in the size of the JSON value.\n\n    @liveexample{The example below shows several conversions from JSON values\n    to other types. There a few things to note: (1) Floating-point numbers can\n    be converted to integers\\, (2) A JSON array can be converted to a standard\n    `std::vector<short>`\\, (3) A JSON object can be converted to C++\n    associative containers such as `std::unordered_map<std::string\\,\n    json>`.,operator__ValueType}\n\n    @since version 1.0.0\n    */\n    template < typename ValueType, typename std::enable_if <\n                   !std::is_pointer<ValueType>::value&&\n                   !std::is_same<ValueType, detail::json_ref<basic_json>>::value&&\n                   !std::is_same<ValueType, typename string_t::value_type>::value&&\n                   !detail::is_basic_json<ValueType>::value\n                   && !std::is_same<ValueType, std::initializer_list<typename string_t::value_type>>::value\n#if defined(JSON_HAS_CPP_17) && (defined(__GNUC__) || (defined(_MSC_VER) && _MSC_VER >= 1910 && _MSC_VER <= 1914))\n                   && !std::is_same<ValueType, typename std::string_view>::value\n#endif\n                   && detail::is_detected<detail::get_template_function, const basic_json_t&, ValueType>::value\n                   , int >::type = 0 >\n    JSON_EXPLICIT operator ValueType() const\n    {\n        // delegate the call to get<>() const\n        return get<ValueType>();\n    }\n\n    /*!\n    @return reference to the binary value\n\n    @throw type_error.302 if the value is not binary\n\n    @sa @ref is_binary() to check if the value is binary\n\n    @since version 3.8.0\n    */\n    binary_t& get_binary()\n    {\n        if (!is_binary())\n        {\n            JSON_THROW(type_error::create(302, \"type must be binary, but is \" + std::string(type_name())));\n        }\n\n        return *get_ptr<binary_t*>();\n    }\n\n    /// @copydoc get_binary()\n    const binary_t& get_binary() const\n    {\n        if (!is_binary())\n        {\n            JSON_THROW(type_error::create(302, \"type must be binary, but is \" + std::string(type_name())));\n        }\n\n        return *get_ptr<const binary_t*>();\n    }\n\n    /// @}\n\n\n    ////////////////////\n    // element access //\n    ////////////////////\n\n    /// @name element access\n    /// Access to the JSON value.\n    /// @{\n\n    /*!\n    @brief access specified array element with bounds checking\n\n    Returns a reference to the element at specified location @a idx, with\n    bounds checking.\n\n    @param[in] idx  index of the element to access\n\n    @return reference to the element at index @a idx\n\n    @throw type_error.304 if the JSON value is not an array; in this case,\n    calling `at` with an index makes no sense. See example below.\n    @throw out_of_range.401 if the index @a idx is out of range of the array;\n    that is, `idx >= size()`. See example below.\n\n    @exceptionsafety Strong guarantee: if an exception is thrown, there are no\n    changes in the JSON value.\n\n    @complexity Constant.\n\n    @since version 1.0.0\n\n    @liveexample{The example below shows how array elements can be read and\n    written using `at()`. It also demonstrates the different exceptions that\n    can be thrown.,at__size_type}\n    */\n    reference at(size_type idx)\n    {\n        // at only works for arrays\n        if (JSON_HEDLEY_LIKELY(is_array()))\n        {\n            JSON_TRY\n            {\n                return m_value.array->at(idx);\n            }\n            JSON_CATCH (std::out_of_range&)\n            {\n                // create better exception explanation\n                JSON_THROW(out_of_range::create(401, \"array index \" + std::to_string(idx) + \" is out of range\"));\n            }\n        }\n        else\n        {\n            JSON_THROW(type_error::create(304, \"cannot use at() with \" + std::string(type_name())));\n        }\n    }\n\n    /*!\n    @brief access specified array element with bounds checking\n\n    Returns a const reference to the element at specified location @a idx,\n    with bounds checking.\n\n    @param[in] idx  index of the element to access\n\n    @return const reference to the element at index @a idx\n\n    @throw type_error.304 if the JSON value is not an array; in this case,\n    calling `at` with an index makes no sense. See example below.\n    @throw out_of_range.401 if the index @a idx is out of range of the array;\n    that is, `idx >= size()`. See example below.\n\n    @exceptionsafety Strong guarantee: if an exception is thrown, there are no\n    changes in the JSON value.\n\n    @complexity Constant.\n\n    @since version 1.0.0\n\n    @liveexample{The example below shows how array elements can be read using\n    `at()`. It also demonstrates the different exceptions that can be thrown.,\n    at__size_type_const}\n    */\n    const_reference at(size_type idx) const\n    {\n        // at only works for arrays\n        if (JSON_HEDLEY_LIKELY(is_array()))\n        {\n            JSON_TRY\n            {\n                return m_value.array->at(idx);\n            }\n            JSON_CATCH (std::out_of_range&)\n            {\n                // create better exception explanation\n                JSON_THROW(out_of_range::create(401, \"array index \" + std::to_string(idx) + \" is out of range\"));\n            }\n        }\n        else\n        {\n            JSON_THROW(type_error::create(304, \"cannot use at() with \" + std::string(type_name())));\n        }\n    }\n\n    /*!\n    @brief access specified object element with bounds checking\n\n    Returns a reference to the element at with specified key @a key, with\n    bounds checking.\n\n    @param[in] key  key of the element to access\n\n    @return reference to the element at key @a key\n\n    @throw type_error.304 if the JSON value is not an object; in this case,\n    calling `at` with a key makes no sense. See example below.\n    @throw out_of_range.403 if the key @a key is is not stored in the object;\n    that is, `find(key) == end()`. See example below.\n\n    @exceptionsafety Strong guarantee: if an exception is thrown, there are no\n    changes in the JSON value.\n\n    @complexity Logarithmic in the size of the container.\n\n    @sa @ref operator[](const typename object_t::key_type&) for unchecked\n    access by reference\n    @sa @ref value() for access by value with a default value\n\n    @since version 1.0.0\n\n    @liveexample{The example below shows how object elements can be read and\n    written using `at()`. It also demonstrates the different exceptions that\n    can be thrown.,at__object_t_key_type}\n    */\n    reference at(const typename object_t::key_type& key)\n    {\n        // at only works for objects\n        if (JSON_HEDLEY_LIKELY(is_object()))\n        {\n            JSON_TRY\n            {\n                return m_value.object->at(key);\n            }\n            JSON_CATCH (std::out_of_range&)\n            {\n                // create better exception explanation\n                JSON_THROW(out_of_range::create(403, \"key '\" + key + \"' not found\"));\n            }\n        }\n        else\n        {\n            JSON_THROW(type_error::create(304, \"cannot use at() with \" + std::string(type_name())));\n        }\n    }\n\n    /*!\n    @brief access specified object element with bounds checking\n\n    Returns a const reference to the element at with specified key @a key,\n    with bounds checking.\n\n    @param[in] key  key of the element to access\n\n    @return const reference to the element at key @a key\n\n    @throw type_error.304 if the JSON value is not an object; in this case,\n    calling `at` with a key makes no sense. See example below.\n    @throw out_of_range.403 if the key @a key is is not stored in the object;\n    that is, `find(key) == end()`. See example below.\n\n    @exceptionsafety Strong guarantee: if an exception is thrown, there are no\n    changes in the JSON value.\n\n    @complexity Logarithmic in the size of the container.\n\n    @sa @ref operator[](const typename object_t::key_type&) for unchecked\n    access by reference\n    @sa @ref value() for access by value with a default value\n\n    @since version 1.0.0\n\n    @liveexample{The example below shows how object elements can be read using\n    `at()`. It also demonstrates the different exceptions that can be thrown.,\n    at__object_t_key_type_const}\n    */\n    const_reference at(const typename object_t::key_type& key) const\n    {\n        // at only works for objects\n        if (JSON_HEDLEY_LIKELY(is_object()))\n        {\n            JSON_TRY\n            {\n                return m_value.object->at(key);\n            }\n            JSON_CATCH (std::out_of_range&)\n            {\n                // create better exception explanation\n                JSON_THROW(out_of_range::create(403, \"key '\" + key + \"' not found\"));\n            }\n        }\n        else\n        {\n            JSON_THROW(type_error::create(304, \"cannot use at() with \" + std::string(type_name())));\n        }\n    }\n\n    /*!\n    @brief access specified array element\n\n    Returns a reference to the element at specified location @a idx.\n\n    @note If @a idx is beyond the range of the array (i.e., `idx >= size()`),\n    then the array is silently filled up with `null` values to make `idx` a\n    valid reference to the last stored element.\n\n    @param[in] idx  index of the element to access\n\n    @return reference to the element at index @a idx\n\n    @throw type_error.305 if the JSON value is not an array or null; in that\n    cases, using the [] operator with an index makes no sense.\n\n    @complexity Constant if @a idx is in the range of the array. Otherwise\n    linear in `idx - size()`.\n\n    @liveexample{The example below shows how array elements can be read and\n    written using `[]` operator. Note the addition of `null`\n    values.,operatorarray__size_type}\n\n    @since version 1.0.0\n    */\n    reference operator[](size_type idx)\n    {\n        // implicitly convert null value to an empty array\n        if (is_null())\n        {\n            m_type = value_t::array;\n            m_value.array = create<array_t>();\n            assert_invariant();\n        }\n\n        // operator[] only works for arrays\n        if (JSON_HEDLEY_LIKELY(is_array()))\n        {\n            // fill up array with null values if given idx is outside range\n            if (idx >= m_value.array->size())\n            {\n                m_value.array->insert(m_value.array->end(),\n                                      idx - m_value.array->size() + 1,\n                                      basic_json());\n            }\n\n            return m_value.array->operator[](idx);\n        }\n\n        JSON_THROW(type_error::create(305, \"cannot use operator[] with a numeric argument with \" + std::string(type_name())));\n    }\n\n    /*!\n    @brief access specified array element\n\n    Returns a const reference to the element at specified location @a idx.\n\n    @param[in] idx  index of the element to access\n\n    @return const reference to the element at index @a idx\n\n    @throw type_error.305 if the JSON value is not an array; in that case,\n    using the [] operator with an index makes no sense.\n\n    @complexity Constant.\n\n    @liveexample{The example below shows how array elements can be read using\n    the `[]` operator.,operatorarray__size_type_const}\n\n    @since version 1.0.0\n    */\n    const_reference operator[](size_type idx) const\n    {\n        // const operator[] only works for arrays\n        if (JSON_HEDLEY_LIKELY(is_array()))\n        {\n            return m_value.array->operator[](idx);\n        }\n\n        JSON_THROW(type_error::create(305, \"cannot use operator[] with a numeric argument with \" + std::string(type_name())));\n    }\n\n    /*!\n    @brief access specified object element\n\n    Returns a reference to the element at with specified key @a key.\n\n    @note If @a key is not found in the object, then it is silently added to\n    the object and filled with a `null` value to make `key` a valid reference.\n    In case the value was `null` before, it is converted to an object.\n\n    @param[in] key  key of the element to access\n\n    @return reference to the element at key @a key\n\n    @throw type_error.305 if the JSON value is not an object or null; in that\n    cases, using the [] operator with a key makes no sense.\n\n    @complexity Logarithmic in the size of the container.\n\n    @liveexample{The example below shows how object elements can be read and\n    written using the `[]` operator.,operatorarray__key_type}\n\n    @sa @ref at(const typename object_t::key_type&) for access by reference\n    with range checking\n    @sa @ref value() for access by value with a default value\n\n    @since version 1.0.0\n    */\n    reference operator[](const typename object_t::key_type& key)\n    {\n        // implicitly convert null value to an empty object\n        if (is_null())\n        {\n            m_type = value_t::object;\n            m_value.object = create<object_t>();\n            assert_invariant();\n        }\n\n        // operator[] only works for objects\n        if (JSON_HEDLEY_LIKELY(is_object()))\n        {\n            return m_value.object->operator[](key);\n        }\n\n        JSON_THROW(type_error::create(305, \"cannot use operator[] with a string argument with \" + std::string(type_name())));\n    }\n\n    /*!\n    @brief read-only access specified object element\n\n    Returns a const reference to the element at with specified key @a key. No\n    bounds checking is performed.\n\n    @warning If the element with key @a key does not exist, the behavior is\n    undefined.\n\n    @param[in] key  key of the element to access\n\n    @return const reference to the element at key @a key\n\n    @pre The element with key @a key must exist. **This precondition is\n         enforced with an assertion.**\n\n    @throw type_error.305 if the JSON value is not an object; in that case,\n    using the [] operator with a key makes no sense.\n\n    @complexity Logarithmic in the size of the container.\n\n    @liveexample{The example below shows how object elements can be read using\n    the `[]` operator.,operatorarray__key_type_const}\n\n    @sa @ref at(const typename object_t::key_type&) for access by reference\n    with range checking\n    @sa @ref value() for access by value with a default value\n\n    @since version 1.0.0\n    */\n    const_reference operator[](const typename object_t::key_type& key) const\n    {\n        // const operator[] only works for objects\n        if (JSON_HEDLEY_LIKELY(is_object()))\n        {\n            JSON_ASSERT(m_value.object->find(key) != m_value.object->end());\n            return m_value.object->find(key)->second;\n        }\n\n        JSON_THROW(type_error::create(305, \"cannot use operator[] with a string argument with \" + std::string(type_name())));\n    }\n\n    /*!\n    @brief access specified object element\n\n    Returns a reference to the element at with specified key @a key.\n\n    @note If @a key is not found in the object, then it is silently added to\n    the object and filled with a `null` value to make `key` a valid reference.\n    In case the value was `null` before, it is converted to an object.\n\n    @param[in] key  key of the element to access\n\n    @return reference to the element at key @a key\n\n    @throw type_error.305 if the JSON value is not an object or null; in that\n    cases, using the [] operator with a key makes no sense.\n\n    @complexity Logarithmic in the size of the container.\n\n    @liveexample{The example below shows how object elements can be read and\n    written using the `[]` operator.,operatorarray__key_type}\n\n    @sa @ref at(const typename object_t::key_type&) for access by reference\n    with range checking\n    @sa @ref value() for access by value with a default value\n\n    @since version 1.1.0\n    */\n    template<typename T>\n    JSON_HEDLEY_NON_NULL(2)\n    reference operator[](T* key)\n    {\n        // implicitly convert null to object\n        if (is_null())\n        {\n            m_type = value_t::object;\n            m_value = value_t::object;\n            assert_invariant();\n        }\n\n        // at only works for objects\n        if (JSON_HEDLEY_LIKELY(is_object()))\n        {\n            return m_value.object->operator[](key);\n        }\n\n        JSON_THROW(type_error::create(305, \"cannot use operator[] with a string argument with \" + std::string(type_name())));\n    }\n\n    /*!\n    @brief read-only access specified object element\n\n    Returns a const reference to the element at with specified key @a key. No\n    bounds checking is performed.\n\n    @warning If the element with key @a key does not exist, the behavior is\n    undefined.\n\n    @param[in] key  key of the element to access\n\n    @return const reference to the element at key @a key\n\n    @pre The element with key @a key must exist. **This precondition is\n         enforced with an assertion.**\n\n    @throw type_error.305 if the JSON value is not an object; in that case,\n    using the [] operator with a key makes no sense.\n\n    @complexity Logarithmic in the size of the container.\n\n    @liveexample{The example below shows how object elements can be read using\n    the `[]` operator.,operatorarray__key_type_const}\n\n    @sa @ref at(const typename object_t::key_type&) for access by reference\n    with range checking\n    @sa @ref value() for access by value with a default value\n\n    @since version 1.1.0\n    */\n    template<typename T>\n    JSON_HEDLEY_NON_NULL(2)\n    const_reference operator[](T* key) const\n    {\n        // at only works for objects\n        if (JSON_HEDLEY_LIKELY(is_object()))\n        {\n            JSON_ASSERT(m_value.object->find(key) != m_value.object->end());\n            return m_value.object->find(key)->second;\n        }\n\n        JSON_THROW(type_error::create(305, \"cannot use operator[] with a string argument with \" + std::string(type_name())));\n    }\n\n    /*!\n    @brief access specified object element with default value\n\n    Returns either a copy of an object's element at the specified key @a key\n    or a given default value if no element with key @a key exists.\n\n    The function is basically equivalent to executing\n    @code {.cpp}\n    try {\n        return at(key);\n    } catch(out_of_range) {\n        return default_value;\n    }\n    @endcode\n\n    @note Unlike @ref at(const typename object_t::key_type&), this function\n    does not throw if the given key @a key was not found.\n\n    @note Unlike @ref operator[](const typename object_t::key_type& key), this\n    function does not implicitly add an element to the position defined by @a\n    key. This function is furthermore also applicable to const objects.\n\n    @param[in] key  key of the element to access\n    @param[in] default_value  the value to return if @a key is not found\n\n    @tparam ValueType type compatible to JSON values, for instance `int` for\n    JSON integer numbers, `bool` for JSON booleans, or `std::vector` types for\n    JSON arrays. Note the type of the expected value at @a key and the default\n    value @a default_value must be compatible.\n\n    @return copy of the element at key @a key or @a default_value if @a key\n    is not found\n\n    @throw type_error.302 if @a default_value does not match the type of the\n    value at @a key\n    @throw type_error.306 if the JSON value is not an object; in that case,\n    using `value()` with a key makes no sense.\n\n    @complexity Logarithmic in the size of the container.\n\n    @liveexample{The example below shows how object elements can be queried\n    with a default value.,basic_json__value}\n\n    @sa @ref at(const typename object_t::key_type&) for access by reference\n    with range checking\n    @sa @ref operator[](const typename object_t::key_type&) for unchecked\n    access by reference\n\n    @since version 1.0.0\n    */\n    // using std::is_convertible in a std::enable_if will fail when using explicit conversions\n    template < class ValueType, typename std::enable_if <\n                   detail::is_getable<basic_json_t, ValueType>::value\n                   && !std::is_same<value_t, ValueType>::value, int >::type = 0 >\n    ValueType value(const typename object_t::key_type& key, const ValueType& default_value) const\n    {\n        // at only works for objects\n        if (JSON_HEDLEY_LIKELY(is_object()))\n        {\n            // if key is found, return value and given default value otherwise\n            const auto it = find(key);\n            if (it != end())\n            {\n                return it->template get<ValueType>();\n            }\n\n            return default_value;\n        }\n\n        JSON_THROW(type_error::create(306, \"cannot use value() with \" + std::string(type_name())));\n    }\n\n    /*!\n    @brief overload for a default value of type const char*\n    @copydoc basic_json::value(const typename object_t::key_type&, const ValueType&) const\n    */\n    string_t value(const typename object_t::key_type& key, const char* default_value) const\n    {\n        return value(key, string_t(default_value));\n    }\n\n    /*!\n    @brief access specified object element via JSON Pointer with default value\n\n    Returns either a copy of an object's element at the specified key @a key\n    or a given default value if no element with key @a key exists.\n\n    The function is basically equivalent to executing\n    @code {.cpp}\n    try {\n        return at(ptr);\n    } catch(out_of_range) {\n        return default_value;\n    }\n    @endcode\n\n    @note Unlike @ref at(const json_pointer&), this function does not throw\n    if the given key @a key was not found.\n\n    @param[in] ptr  a JSON pointer to the element to access\n    @param[in] default_value  the value to return if @a ptr found no value\n\n    @tparam ValueType type compatible to JSON values, for instance `int` for\n    JSON integer numbers, `bool` for JSON booleans, or `std::vector` types for\n    JSON arrays. Note the type of the expected value at @a key and the default\n    value @a default_value must be compatible.\n\n    @return copy of the element at key @a key or @a default_value if @a key\n    is not found\n\n    @throw type_error.302 if @a default_value does not match the type of the\n    value at @a ptr\n    @throw type_error.306 if the JSON value is not an object; in that case,\n    using `value()` with a key makes no sense.\n\n    @complexity Logarithmic in the size of the container.\n\n    @liveexample{The example below shows how object elements can be queried\n    with a default value.,basic_json__value_ptr}\n\n    @sa @ref operator[](const json_pointer&) for unchecked access by reference\n\n    @since version 2.0.2\n    */\n    template<class ValueType, typename std::enable_if<\n                 detail::is_getable<basic_json_t, ValueType>::value, int>::type = 0>\n    ValueType value(const json_pointer& ptr, const ValueType& default_value) const\n    {\n        // at only works for objects\n        if (JSON_HEDLEY_LIKELY(is_object()))\n        {\n            // if pointer resolves a value, return it or use default value\n            JSON_TRY\n            {\n                return ptr.get_checked(this).template get<ValueType>();\n            }\n            JSON_INTERNAL_CATCH (out_of_range&)\n            {\n                return default_value;\n            }\n        }\n\n        JSON_THROW(type_error::create(306, \"cannot use value() with \" + std::string(type_name())));\n    }\n\n    /*!\n    @brief overload for a default value of type const char*\n    @copydoc basic_json::value(const json_pointer&, ValueType) const\n    */\n    JSON_HEDLEY_NON_NULL(3)\n    string_t value(const json_pointer& ptr, const char* default_value) const\n    {\n        return value(ptr, string_t(default_value));\n    }\n\n    /*!\n    @brief access the first element\n\n    Returns a reference to the first element in the container. For a JSON\n    container `c`, the expression `c.front()` is equivalent to `*c.begin()`.\n\n    @return In case of a structured type (array or object), a reference to the\n    first element is returned. In case of number, string, boolean, or binary\n    values, a reference to the value is returned.\n\n    @complexity Constant.\n\n    @pre The JSON value must not be `null` (would throw `std::out_of_range`)\n    or an empty array or object (undefined behavior, **guarded by\n    assertions**).\n    @post The JSON value remains unchanged.\n\n    @throw invalid_iterator.214 when called on `null` value\n\n    @liveexample{The following code shows an example for `front()`.,front}\n\n    @sa @ref back() -- access the last element\n\n    @since version 1.0.0\n    */\n    reference front()\n    {\n        return *begin();\n    }\n\n    /*!\n    @copydoc basic_json::front()\n    */\n    const_reference front() const\n    {\n        return *cbegin();\n    }\n\n    /*!\n    @brief access the last element\n\n    Returns a reference to the last element in the container. For a JSON\n    container `c`, the expression `c.back()` is equivalent to\n    @code {.cpp}\n    auto tmp = c.end();\n    --tmp;\n    return *tmp;\n    @endcode\n\n    @return In case of a structured type (array or object), a reference to the\n    last element is returned. In case of number, string, boolean, or binary\n    values, a reference to the value is returned.\n\n    @complexity Constant.\n\n    @pre The JSON value must not be `null` (would throw `std::out_of_range`)\n    or an empty array or object (undefined behavior, **guarded by\n    assertions**).\n    @post The JSON value remains unchanged.\n\n    @throw invalid_iterator.214 when called on a `null` value. See example\n    below.\n\n    @liveexample{The following code shows an example for `back()`.,back}\n\n    @sa @ref front() -- access the first element\n\n    @since version 1.0.0\n    */\n    reference back()\n    {\n        auto tmp = end();\n        --tmp;\n        return *tmp;\n    }\n\n    /*!\n    @copydoc basic_json::back()\n    */\n    const_reference back() const\n    {\n        auto tmp = cend();\n        --tmp;\n        return *tmp;\n    }\n\n    /*!\n    @brief remove element given an iterator\n\n    Removes the element specified by iterator @a pos. The iterator @a pos must\n    be valid and dereferenceable. Thus the `end()` iterator (which is valid,\n    but is not dereferenceable) cannot be used as a value for @a pos.\n\n    If called on a primitive type other than `null`, the resulting JSON value\n    will be `null`.\n\n    @param[in] pos iterator to the element to remove\n    @return Iterator following the last removed element. If the iterator @a\n    pos refers to the last element, the `end()` iterator is returned.\n\n    @tparam IteratorType an @ref iterator or @ref const_iterator\n\n    @post Invalidates iterators and references at or after the point of the\n    erase, including the `end()` iterator.\n\n    @throw type_error.307 if called on a `null` value; example: `\"cannot use\n    erase() with null\"`\n    @throw invalid_iterator.202 if called on an iterator which does not belong\n    to the current JSON value; example: `\"iterator does not fit current\n    value\"`\n    @throw invalid_iterator.205 if called on a primitive type with invalid\n    iterator (i.e., any iterator which is not `begin()`); example: `\"iterator\n    out of range\"`\n\n    @complexity The complexity depends on the type:\n    - objects: amortized constant\n    - arrays: linear in distance between @a pos and the end of the container\n    - strings and binary: linear in the length of the member\n    - other types: constant\n\n    @liveexample{The example shows the result of `erase()` for different JSON\n    types.,erase__IteratorType}\n\n    @sa @ref erase(IteratorType, IteratorType) -- removes the elements in\n    the given range\n    @sa @ref erase(const typename object_t::key_type&) -- removes the element\n    from an object at the given key\n    @sa @ref erase(const size_type) -- removes the element from an array at\n    the given index\n\n    @since version 1.0.0\n    */\n    template < class IteratorType, typename std::enable_if <\n                   std::is_same<IteratorType, typename basic_json_t::iterator>::value ||\n                   std::is_same<IteratorType, typename basic_json_t::const_iterator>::value, int >::type\n               = 0 >\n    IteratorType erase(IteratorType pos)\n    {\n        // make sure iterator fits the current value\n        if (JSON_HEDLEY_UNLIKELY(this != pos.m_object))\n        {\n            JSON_THROW(invalid_iterator::create(202, \"iterator does not fit current value\"));\n        }\n\n        IteratorType result = end();\n\n        switch (m_type)\n        {\n            case value_t::boolean:\n            case value_t::number_float:\n            case value_t::number_integer:\n            case value_t::number_unsigned:\n            case value_t::string:\n            case value_t::binary:\n            {\n                if (JSON_HEDLEY_UNLIKELY(!pos.m_it.primitive_iterator.is_begin()))\n                {\n                    JSON_THROW(invalid_iterator::create(205, \"iterator out of range\"));\n                }\n\n                if (is_string())\n                {\n                    AllocatorType<string_t> alloc;\n                    std::allocator_traits<decltype(alloc)>::destroy(alloc, m_value.string);\n                    std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_value.string, 1);\n                    m_value.string = nullptr;\n                }\n                else if (is_binary())\n                {\n                    AllocatorType<binary_t> alloc;\n                    std::allocator_traits<decltype(alloc)>::destroy(alloc, m_value.binary);\n                    std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_value.binary, 1);\n                    m_value.binary = nullptr;\n                }\n\n                m_type = value_t::null;\n                assert_invariant();\n                break;\n            }\n\n            case value_t::object:\n            {\n                result.m_it.object_iterator = m_value.object->erase(pos.m_it.object_iterator);\n                break;\n            }\n\n            case value_t::array:\n            {\n                result.m_it.array_iterator = m_value.array->erase(pos.m_it.array_iterator);\n                break;\n            }\n\n            default:\n                JSON_THROW(type_error::create(307, \"cannot use erase() with \" + std::string(type_name())));\n        }\n\n        return result;\n    }\n\n    /*!\n    @brief remove elements given an iterator range\n\n    Removes the element specified by the range `[first; last)`. The iterator\n    @a first does not need to be dereferenceable if `first == last`: erasing\n    an empty range is a no-op.\n\n    If called on a primitive type other than `null`, the resulting JSON value\n    will be `null`.\n\n    @param[in] first iterator to the beginning of the range to remove\n    @param[in] last iterator past the end of the range to remove\n    @return Iterator following the last removed element. If the iterator @a\n    second refers to the last element, the `end()` iterator is returned.\n\n    @tparam IteratorType an @ref iterator or @ref const_iterator\n\n    @post Invalidates iterators and references at or after the point of the\n    erase, including the `end()` iterator.\n\n    @throw type_error.307 if called on a `null` value; example: `\"cannot use\n    erase() with null\"`\n    @throw invalid_iterator.203 if called on iterators which does not belong\n    to the current JSON value; example: `\"iterators do not fit current value\"`\n    @throw invalid_iterator.204 if called on a primitive type with invalid\n    iterators (i.e., if `first != begin()` and `last != end()`); example:\n    `\"iterators out of range\"`\n\n    @complexity The complexity depends on the type:\n    - objects: `log(size()) + std::distance(first, last)`\n    - arrays: linear in the distance between @a first and @a last, plus linear\n      in the distance between @a last and end of the container\n    - strings and binary: linear in the length of the member\n    - other types: constant\n\n    @liveexample{The example shows the result of `erase()` for different JSON\n    types.,erase__IteratorType_IteratorType}\n\n    @sa @ref erase(IteratorType) -- removes the element at a given position\n    @sa @ref erase(const typename object_t::key_type&) -- removes the element\n    from an object at the given key\n    @sa @ref erase(const size_type) -- removes the element from an array at\n    the given index\n\n    @since version 1.0.0\n    */\n    template < class IteratorType, typename std::enable_if <\n                   std::is_same<IteratorType, typename basic_json_t::iterator>::value ||\n                   std::is_same<IteratorType, typename basic_json_t::const_iterator>::value, int >::type\n               = 0 >\n    IteratorType erase(IteratorType first, IteratorType last)\n    {\n        // make sure iterator fits the current value\n        if (JSON_HEDLEY_UNLIKELY(this != first.m_object || this != last.m_object))\n        {\n            JSON_THROW(invalid_iterator::create(203, \"iterators do not fit current value\"));\n        }\n\n        IteratorType result = end();\n\n        switch (m_type)\n        {\n            case value_t::boolean:\n            case value_t::number_float:\n            case value_t::number_integer:\n            case value_t::number_unsigned:\n            case value_t::string:\n            case value_t::binary:\n            {\n                if (JSON_HEDLEY_LIKELY(!first.m_it.primitive_iterator.is_begin()\n                                       || !last.m_it.primitive_iterator.is_end()))\n                {\n                    JSON_THROW(invalid_iterator::create(204, \"iterators out of range\"));\n                }\n\n                if (is_string())\n                {\n                    AllocatorType<string_t> alloc;\n                    std::allocator_traits<decltype(alloc)>::destroy(alloc, m_value.string);\n                    std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_value.string, 1);\n                    m_value.string = nullptr;\n                }\n                else if (is_binary())\n                {\n                    AllocatorType<binary_t> alloc;\n                    std::allocator_traits<decltype(alloc)>::destroy(alloc, m_value.binary);\n                    std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_value.binary, 1);\n                    m_value.binary = nullptr;\n                }\n\n                m_type = value_t::null;\n                assert_invariant();\n                break;\n            }\n\n            case value_t::object:\n            {\n                result.m_it.object_iterator = m_value.object->erase(first.m_it.object_iterator,\n                                              last.m_it.object_iterator);\n                break;\n            }\n\n            case value_t::array:\n            {\n                result.m_it.array_iterator = m_value.array->erase(first.m_it.array_iterator,\n                                             last.m_it.array_iterator);\n                break;\n            }\n\n            default:\n                JSON_THROW(type_error::create(307, \"cannot use erase() with \" + std::string(type_name())));\n        }\n\n        return result;\n    }\n\n    /*!\n    @brief remove element from a JSON object given a key\n\n    Removes elements from a JSON object with the key value @a key.\n\n    @param[in] key value of the elements to remove\n\n    @return Number of elements removed. If @a ObjectType is the default\n    `std::map` type, the return value will always be `0` (@a key was not\n    found) or `1` (@a key was found).\n\n    @post References and iterators to the erased elements are invalidated.\n    Other references and iterators are not affected.\n\n    @throw type_error.307 when called on a type other than JSON object;\n    example: `\"cannot use erase() with null\"`\n\n    @complexity `log(size()) + count(key)`\n\n    @liveexample{The example shows the effect of `erase()`.,erase__key_type}\n\n    @sa @ref erase(IteratorType) -- removes the element at a given position\n    @sa @ref erase(IteratorType, IteratorType) -- removes the elements in\n    the given range\n    @sa @ref erase(const size_type) -- removes the element from an array at\n    the given index\n\n    @since version 1.0.0\n    */\n    size_type erase(const typename object_t::key_type& key)\n    {\n        // this erase only works for objects\n        if (JSON_HEDLEY_LIKELY(is_object()))\n        {\n            return m_value.object->erase(key);\n        }\n\n        JSON_THROW(type_error::create(307, \"cannot use erase() with \" + std::string(type_name())));\n    }\n\n    /*!\n    @brief remove element from a JSON array given an index\n\n    Removes element from a JSON array at the index @a idx.\n\n    @param[in] idx index of the element to remove\n\n    @throw type_error.307 when called on a type other than JSON object;\n    example: `\"cannot use erase() with null\"`\n    @throw out_of_range.401 when `idx >= size()`; example: `\"array index 17\n    is out of range\"`\n\n    @complexity Linear in distance between @a idx and the end of the container.\n\n    @liveexample{The example shows the effect of `erase()`.,erase__size_type}\n\n    @sa @ref erase(IteratorType) -- removes the element at a given position\n    @sa @ref erase(IteratorType, IteratorType) -- removes the elements in\n    the given range\n    @sa @ref erase(const typename object_t::key_type&) -- removes the element\n    from an object at the given key\n\n    @since version 1.0.0\n    */\n    void erase(const size_type idx)\n    {\n        // this erase only works for arrays\n        if (JSON_HEDLEY_LIKELY(is_array()))\n        {\n            if (JSON_HEDLEY_UNLIKELY(idx >= size()))\n            {\n                JSON_THROW(out_of_range::create(401, \"array index \" + std::to_string(idx) + \" is out of range\"));\n            }\n\n            m_value.array->erase(m_value.array->begin() + static_cast<difference_type>(idx));\n        }\n        else\n        {\n            JSON_THROW(type_error::create(307, \"cannot use erase() with \" + std::string(type_name())));\n        }\n    }\n\n    /// @}\n\n\n    ////////////\n    // lookup //\n    ////////////\n\n    /// @name lookup\n    /// @{\n\n    /*!\n    @brief find an element in a JSON object\n\n    Finds an element in a JSON object with key equivalent to @a key. If the\n    element is not found or the JSON value is not an object, end() is\n    returned.\n\n    @note This method always returns @ref end() when executed on a JSON type\n          that is not an object.\n\n    @param[in] key key value of the element to search for.\n\n    @return Iterator to an element with key equivalent to @a key. If no such\n    element is found or the JSON value is not an object, past-the-end (see\n    @ref end()) iterator is returned.\n\n    @complexity Logarithmic in the size of the JSON object.\n\n    @liveexample{The example shows how `find()` is used.,find__key_type}\n\n    @sa @ref contains(KeyT&&) const -- checks whether a key exists\n\n    @since version 1.0.0\n    */\n    template<typename KeyT>\n    iterator find(KeyT&& key)\n    {\n        auto result = end();\n\n        if (is_object())\n        {\n            result.m_it.object_iterator = m_value.object->find(std::forward<KeyT>(key));\n        }\n\n        return result;\n    }\n\n    /*!\n    @brief find an element in a JSON object\n    @copydoc find(KeyT&&)\n    */\n    template<typename KeyT>\n    const_iterator find(KeyT&& key) const\n    {\n        auto result = cend();\n\n        if (is_object())\n        {\n            result.m_it.object_iterator = m_value.object->find(std::forward<KeyT>(key));\n        }\n\n        return result;\n    }\n\n    /*!\n    @brief returns the number of occurrences of a key in a JSON object\n\n    Returns the number of elements with key @a key. If ObjectType is the\n    default `std::map` type, the return value will always be `0` (@a key was\n    not found) or `1` (@a key was found).\n\n    @note This method always returns `0` when executed on a JSON type that is\n          not an object.\n\n    @param[in] key key value of the element to count\n\n    @return Number of elements with key @a key. If the JSON value is not an\n    object, the return value will be `0`.\n\n    @complexity Logarithmic in the size of the JSON object.\n\n    @liveexample{The example shows how `count()` is used.,count}\n\n    @since version 1.0.0\n    */\n    template<typename KeyT>\n    size_type count(KeyT&& key) const\n    {\n        // return 0 for all nonobject types\n        return is_object() ? m_value.object->count(std::forward<KeyT>(key)) : 0;\n    }\n\n    /*!\n    @brief check the existence of an element in a JSON object\n\n    Check whether an element exists in a JSON object with key equivalent to\n    @a key. If the element is not found or the JSON value is not an object,\n    false is returned.\n\n    @note This method always returns false when executed on a JSON type\n          that is not an object.\n\n    @param[in] key key value to check its existence.\n\n    @return true if an element with specified @a key exists. If no such\n    element with such key is found or the JSON value is not an object,\n    false is returned.\n\n    @complexity Logarithmic in the size of the JSON object.\n\n    @liveexample{The following code shows an example for `contains()`.,contains}\n\n    @sa @ref find(KeyT&&) -- returns an iterator to an object element\n    @sa @ref contains(const json_pointer&) const -- checks the existence for a JSON pointer\n\n    @since version 3.6.0\n    */\n    template < typename KeyT, typename std::enable_if <\n                   !std::is_same<typename std::decay<KeyT>::type, json_pointer>::value, int >::type = 0 >\n    bool contains(KeyT && key) const\n    {\n        return is_object() && m_value.object->find(std::forward<KeyT>(key)) != m_value.object->end();\n    }\n\n    /*!\n    @brief check the existence of an element in a JSON object given a JSON pointer\n\n    Check whether the given JSON pointer @a ptr can be resolved in the current\n    JSON value.\n\n    @note This method can be executed on any JSON value type.\n\n    @param[in] ptr JSON pointer to check its existence.\n\n    @return true if the JSON pointer can be resolved to a stored value, false\n    otherwise.\n\n    @post If `j.contains(ptr)` returns true, it is safe to call `j[ptr]`.\n\n    @throw parse_error.106   if an array index begins with '0'\n    @throw parse_error.109   if an array index was not a number\n\n    @complexity Logarithmic in the size of the JSON object.\n\n    @liveexample{The following code shows an example for `contains()`.,contains_json_pointer}\n\n    @sa @ref contains(KeyT &&) const -- checks the existence of a key\n\n    @since version 3.7.0\n    */\n    bool contains(const json_pointer& ptr) const\n    {\n        return ptr.contains(this);\n    }\n\n    /// @}\n\n\n    ///////////////\n    // iterators //\n    ///////////////\n\n    /// @name iterators\n    /// @{\n\n    /*!\n    @brief returns an iterator to the first element\n\n    Returns an iterator to the first element.\n\n    @image html range-begin-end.svg \"Illustration from cppreference.com\"\n\n    @return iterator to the first element\n\n    @complexity Constant.\n\n    @requirement This function helps `basic_json` satisfying the\n    [Container](https://en.cppreference.com/w/cpp/named_req/Container)\n    requirements:\n    - The complexity is constant.\n\n    @liveexample{The following code shows an example for `begin()`.,begin}\n\n    @sa @ref cbegin() -- returns a const iterator to the beginning\n    @sa @ref end() -- returns an iterator to the end\n    @sa @ref cend() -- returns a const iterator to the end\n\n    @since version 1.0.0\n    */\n    iterator begin() noexcept\n    {\n        iterator result(this);\n        result.set_begin();\n        return result;\n    }\n\n    /*!\n    @copydoc basic_json::cbegin()\n    */\n    const_iterator begin() const noexcept\n    {\n        return cbegin();\n    }\n\n    /*!\n    @brief returns a const iterator to the first element\n\n    Returns a const iterator to the first element.\n\n    @image html range-begin-end.svg \"Illustration from cppreference.com\"\n\n    @return const iterator to the first element\n\n    @complexity Constant.\n\n    @requirement This function helps `basic_json` satisfying the\n    [Container](https://en.cppreference.com/w/cpp/named_req/Container)\n    requirements:\n    - The complexity is constant.\n    - Has the semantics of `const_cast<const basic_json&>(*this).begin()`.\n\n    @liveexample{The following code shows an example for `cbegin()`.,cbegin}\n\n    @sa @ref begin() -- returns an iterator to the beginning\n    @sa @ref end() -- returns an iterator to the end\n    @sa @ref cend() -- returns a const iterator to the end\n\n    @since version 1.0.0\n    */\n    const_iterator cbegin() const noexcept\n    {\n        const_iterator result(this);\n        result.set_begin();\n        return result;\n    }\n\n    /*!\n    @brief returns an iterator to one past the last element\n\n    Returns an iterator to one past the last element.\n\n    @image html range-begin-end.svg \"Illustration from cppreference.com\"\n\n    @return iterator one past the last element\n\n    @complexity Constant.\n\n    @requirement This function helps `basic_json` satisfying the\n    [Container](https://en.cppreference.com/w/cpp/named_req/Container)\n    requirements:\n    - The complexity is constant.\n\n    @liveexample{The following code shows an example for `end()`.,end}\n\n    @sa @ref cend() -- returns a const iterator to the end\n    @sa @ref begin() -- returns an iterator to the beginning\n    @sa @ref cbegin() -- returns a const iterator to the beginning\n\n    @since version 1.0.0\n    */\n    iterator end() noexcept\n    {\n        iterator result(this);\n        result.set_end();\n        return result;\n    }\n\n    /*!\n    @copydoc basic_json::cend()\n    */\n    const_iterator end() const noexcept\n    {\n        return cend();\n    }\n\n    /*!\n    @brief returns a const iterator to one past the last element\n\n    Returns a const iterator to one past the last element.\n\n    @image html range-begin-end.svg \"Illustration from cppreference.com\"\n\n    @return const iterator one past the last element\n\n    @complexity Constant.\n\n    @requirement This function helps `basic_json` satisfying the\n    [Container](https://en.cppreference.com/w/cpp/named_req/Container)\n    requirements:\n    - The complexity is constant.\n    - Has the semantics of `const_cast<const basic_json&>(*this).end()`.\n\n    @liveexample{The following code shows an example for `cend()`.,cend}\n\n    @sa @ref end() -- returns an iterator to the end\n    @sa @ref begin() -- returns an iterator to the beginning\n    @sa @ref cbegin() -- returns a const iterator to the beginning\n\n    @since version 1.0.0\n    */\n    const_iterator cend() const noexcept\n    {\n        const_iterator result(this);\n        result.set_end();\n        return result;\n    }\n\n    /*!\n    @brief returns an iterator to the reverse-beginning\n\n    Returns an iterator to the reverse-beginning; that is, the last element.\n\n    @image html range-rbegin-rend.svg \"Illustration from cppreference.com\"\n\n    @complexity Constant.\n\n    @requirement This function helps `basic_json` satisfying the\n    [ReversibleContainer](https://en.cppreference.com/w/cpp/named_req/ReversibleContainer)\n    requirements:\n    - The complexity is constant.\n    - Has the semantics of `reverse_iterator(end())`.\n\n    @liveexample{The following code shows an example for `rbegin()`.,rbegin}\n\n    @sa @ref crbegin() -- returns a const reverse iterator to the beginning\n    @sa @ref rend() -- returns a reverse iterator to the end\n    @sa @ref crend() -- returns a const reverse iterator to the end\n\n    @since version 1.0.0\n    */\n    reverse_iterator rbegin() noexcept\n    {\n        return reverse_iterator(end());\n    }\n\n    /*!\n    @copydoc basic_json::crbegin()\n    */\n    const_reverse_iterator rbegin() const noexcept\n    {\n        return crbegin();\n    }\n\n    /*!\n    @brief returns an iterator to the reverse-end\n\n    Returns an iterator to the reverse-end; that is, one before the first\n    element.\n\n    @image html range-rbegin-rend.svg \"Illustration from cppreference.com\"\n\n    @complexity Constant.\n\n    @requirement This function helps `basic_json` satisfying the\n    [ReversibleContainer](https://en.cppreference.com/w/cpp/named_req/ReversibleContainer)\n    requirements:\n    - The complexity is constant.\n    - Has the semantics of `reverse_iterator(begin())`.\n\n    @liveexample{The following code shows an example for `rend()`.,rend}\n\n    @sa @ref crend() -- returns a const reverse iterator to the end\n    @sa @ref rbegin() -- returns a reverse iterator to the beginning\n    @sa @ref crbegin() -- returns a const reverse iterator to the beginning\n\n    @since version 1.0.0\n    */\n    reverse_iterator rend() noexcept\n    {\n        return reverse_iterator(begin());\n    }\n\n    /*!\n    @copydoc basic_json::crend()\n    */\n    const_reverse_iterator rend() const noexcept\n    {\n        return crend();\n    }\n\n    /*!\n    @brief returns a const reverse iterator to the last element\n\n    Returns a const iterator to the reverse-beginning; that is, the last\n    element.\n\n    @image html range-rbegin-rend.svg \"Illustration from cppreference.com\"\n\n    @complexity Constant.\n\n    @requirement This function helps `basic_json` satisfying the\n    [ReversibleContainer](https://en.cppreference.com/w/cpp/named_req/ReversibleContainer)\n    requirements:\n    - The complexity is constant.\n    - Has the semantics of `const_cast<const basic_json&>(*this).rbegin()`.\n\n    @liveexample{The following code shows an example for `crbegin()`.,crbegin}\n\n    @sa @ref rbegin() -- returns a reverse iterator to the beginning\n    @sa @ref rend() -- returns a reverse iterator to the end\n    @sa @ref crend() -- returns a const reverse iterator to the end\n\n    @since version 1.0.0\n    */\n    const_reverse_iterator crbegin() const noexcept\n    {\n        return const_reverse_iterator(cend());\n    }\n\n    /*!\n    @brief returns a const reverse iterator to one before the first\n\n    Returns a const reverse iterator to the reverse-end; that is, one before\n    the first element.\n\n    @image html range-rbegin-rend.svg \"Illustration from cppreference.com\"\n\n    @complexity Constant.\n\n    @requirement This function helps `basic_json` satisfying the\n    [ReversibleContainer](https://en.cppreference.com/w/cpp/named_req/ReversibleContainer)\n    requirements:\n    - The complexity is constant.\n    - Has the semantics of `const_cast<const basic_json&>(*this).rend()`.\n\n    @liveexample{The following code shows an example for `crend()`.,crend}\n\n    @sa @ref rend() -- returns a reverse iterator to the end\n    @sa @ref rbegin() -- returns a reverse iterator to the beginning\n    @sa @ref crbegin() -- returns a const reverse iterator to the beginning\n\n    @since version 1.0.0\n    */\n    const_reverse_iterator crend() const noexcept\n    {\n        return const_reverse_iterator(cbegin());\n    }\n\n  public:\n    /*!\n    @brief wrapper to access iterator member functions in range-based for\n\n    This function allows to access @ref iterator::key() and @ref\n    iterator::value() during range-based for loops. In these loops, a\n    reference to the JSON values is returned, so there is no access to the\n    underlying iterator.\n\n    For loop without iterator_wrapper:\n\n    @code{cpp}\n    for (auto it = j_object.begin(); it != j_object.end(); ++it)\n    {\n        std::cout << \"key: \" << it.key() << \", value:\" << it.value() << '\\n';\n    }\n    @endcode\n\n    Range-based for loop without iterator proxy:\n\n    @code{cpp}\n    for (auto it : j_object)\n    {\n        // \"it\" is of type json::reference and has no key() member\n        std::cout << \"value: \" << it << '\\n';\n    }\n    @endcode\n\n    Range-based for loop with iterator proxy:\n\n    @code{cpp}\n    for (auto it : json::iterator_wrapper(j_object))\n    {\n        std::cout << \"key: \" << it.key() << \", value:\" << it.value() << '\\n';\n    }\n    @endcode\n\n    @note When iterating over an array, `key()` will return the index of the\n          element as string (see example).\n\n    @param[in] ref  reference to a JSON value\n    @return iteration proxy object wrapping @a ref with an interface to use in\n            range-based for loops\n\n    @liveexample{The following code shows how the wrapper is used,iterator_wrapper}\n\n    @exceptionsafety Strong guarantee: if an exception is thrown, there are no\n    changes in the JSON value.\n\n    @complexity Constant.\n\n    @note The name of this function is not yet final and may change in the\n    future.\n\n    @deprecated This stream operator is deprecated and will be removed in\n                future 4.0.0 of the library. Please use @ref items() instead;\n                that is, replace `json::iterator_wrapper(j)` with `j.items()`.\n    */\n    JSON_HEDLEY_DEPRECATED_FOR(3.1.0, items())\n    static iteration_proxy<iterator> iterator_wrapper(reference ref) noexcept\n    {\n        return ref.items();\n    }\n\n    /*!\n    @copydoc iterator_wrapper(reference)\n    */\n    JSON_HEDLEY_DEPRECATED_FOR(3.1.0, items())\n    static iteration_proxy<const_iterator> iterator_wrapper(const_reference ref) noexcept\n    {\n        return ref.items();\n    }\n\n    /*!\n    @brief helper to access iterator member functions in range-based for\n\n    This function allows to access @ref iterator::key() and @ref\n    iterator::value() during range-based for loops. In these loops, a\n    reference to the JSON values is returned, so there is no access to the\n    underlying iterator.\n\n    For loop without `items()` function:\n\n    @code{cpp}\n    for (auto it = j_object.begin(); it != j_object.end(); ++it)\n    {\n        std::cout << \"key: \" << it.key() << \", value:\" << it.value() << '\\n';\n    }\n    @endcode\n\n    Range-based for loop without `items()` function:\n\n    @code{cpp}\n    for (auto it : j_object)\n    {\n        // \"it\" is of type json::reference and has no key() member\n        std::cout << \"value: \" << it << '\\n';\n    }\n    @endcode\n\n    Range-based for loop with `items()` function:\n\n    @code{cpp}\n    for (auto& el : j_object.items())\n    {\n        std::cout << \"key: \" << el.key() << \", value:\" << el.value() << '\\n';\n    }\n    @endcode\n\n    The `items()` function also allows to use\n    [structured bindings](https://en.cppreference.com/w/cpp/language/structured_binding)\n    (C++17):\n\n    @code{cpp}\n    for (auto& [key, val] : j_object.items())\n    {\n        std::cout << \"key: \" << key << \", value:\" << val << '\\n';\n    }\n    @endcode\n\n    @note When iterating over an array, `key()` will return the index of the\n          element as string (see example). For primitive types (e.g., numbers),\n          `key()` returns an empty string.\n\n    @warning Using `items()` on temporary objects is dangerous. Make sure the\n             object's lifetime exeeds the iteration. See\n             <https://github.com/nlohmann/json/issues/2040> for more\n             information.\n\n    @return iteration proxy object wrapping @a ref with an interface to use in\n            range-based for loops\n\n    @liveexample{The following code shows how the function is used.,items}\n\n    @exceptionsafety Strong guarantee: if an exception is thrown, there are no\n    changes in the JSON value.\n\n    @complexity Constant.\n\n    @since version 3.1.0, structured bindings support since 3.5.0.\n    */\n    iteration_proxy<iterator> items() noexcept\n    {\n        return iteration_proxy<iterator>(*this);\n    }\n\n    /*!\n    @copydoc items()\n    */\n    iteration_proxy<const_iterator> items() const noexcept\n    {\n        return iteration_proxy<const_iterator>(*this);\n    }\n\n    /// @}\n\n\n    //////////////\n    // capacity //\n    //////////////\n\n    /// @name capacity\n    /// @{\n\n    /*!\n    @brief checks whether the container is empty.\n\n    Checks if a JSON value has no elements (i.e. whether its @ref size is `0`).\n\n    @return The return value depends on the different types and is\n            defined as follows:\n            Value type  | return value\n            ----------- | -------------\n            null        | `true`\n            boolean     | `false`\n            string      | `false`\n            number      | `false`\n            binary      | `false`\n            object      | result of function `object_t::empty()`\n            array       | result of function `array_t::empty()`\n\n    @liveexample{The following code uses `empty()` to check if a JSON\n    object contains any elements.,empty}\n\n    @complexity Constant, as long as @ref array_t and @ref object_t satisfy\n    the Container concept; that is, their `empty()` functions have constant\n    complexity.\n\n    @iterators No changes.\n\n    @exceptionsafety No-throw guarantee: this function never throws exceptions.\n\n    @note This function does not return whether a string stored as JSON value\n    is empty - it returns whether the JSON container itself is empty which is\n    false in the case of a string.\n\n    @requirement This function helps `basic_json` satisfying the\n    [Container](https://en.cppreference.com/w/cpp/named_req/Container)\n    requirements:\n    - The complexity is constant.\n    - Has the semantics of `begin() == end()`.\n\n    @sa @ref size() -- returns the number of elements\n\n    @since version 1.0.0\n    */\n    bool empty() const noexcept\n    {\n        switch (m_type)\n        {\n            case value_t::null:\n            {\n                // null values are empty\n                return true;\n            }\n\n            case value_t::array:\n            {\n                // delegate call to array_t::empty()\n                return m_value.array->empty();\n            }\n\n            case value_t::object:\n            {\n                // delegate call to object_t::empty()\n                return m_value.object->empty();\n            }\n\n            default:\n            {\n                // all other types are nonempty\n                return false;\n            }\n        }\n    }\n\n    /*!\n    @brief returns the number of elements\n\n    Returns the number of elements in a JSON value.\n\n    @return The return value depends on the different types and is\n            defined as follows:\n            Value type  | return value\n            ----------- | -------------\n            null        | `0`\n            boolean     | `1`\n            string      | `1`\n            number      | `1`\n            binary      | `1`\n            object      | result of function object_t::size()\n            array       | result of function array_t::size()\n\n    @liveexample{The following code calls `size()` on the different value\n    types.,size}\n\n    @complexity Constant, as long as @ref array_t and @ref object_t satisfy\n    the Container concept; that is, their size() functions have constant\n    complexity.\n\n    @iterators No changes.\n\n    @exceptionsafety No-throw guarantee: this function never throws exceptions.\n\n    @note This function does not return the length of a string stored as JSON\n    value - it returns the number of elements in the JSON value which is 1 in\n    the case of a string.\n\n    @requirement This function helps `basic_json` satisfying the\n    [Container](https://en.cppreference.com/w/cpp/named_req/Container)\n    requirements:\n    - The complexity is constant.\n    - Has the semantics of `std::distance(begin(), end())`.\n\n    @sa @ref empty() -- checks whether the container is empty\n    @sa @ref max_size() -- returns the maximal number of elements\n\n    @since version 1.0.0\n    */\n    size_type size() const noexcept\n    {\n        switch (m_type)\n        {\n            case value_t::null:\n            {\n                // null values are empty\n                return 0;\n            }\n\n            case value_t::array:\n            {\n                // delegate call to array_t::size()\n                return m_value.array->size();\n            }\n\n            case value_t::object:\n            {\n                // delegate call to object_t::size()\n                return m_value.object->size();\n            }\n\n            default:\n            {\n                // all other types have size 1\n                return 1;\n            }\n        }\n    }\n\n    /*!\n    @brief returns the maximum possible number of elements\n\n    Returns the maximum number of elements a JSON value is able to hold due to\n    system or library implementation limitations, i.e. `std::distance(begin(),\n    end())` for the JSON value.\n\n    @return The return value depends on the different types and is\n            defined as follows:\n            Value type  | return value\n            ----------- | -------------\n            null        | `0` (same as `size()`)\n            boolean     | `1` (same as `size()`)\n            string      | `1` (same as `size()`)\n            number      | `1` (same as `size()`)\n            binary      | `1` (same as `size()`)\n            object      | result of function `object_t::max_size()`\n            array       | result of function `array_t::max_size()`\n\n    @liveexample{The following code calls `max_size()` on the different value\n    types. Note the output is implementation specific.,max_size}\n\n    @complexity Constant, as long as @ref array_t and @ref object_t satisfy\n    the Container concept; that is, their `max_size()` functions have constant\n    complexity.\n\n    @iterators No changes.\n\n    @exceptionsafety No-throw guarantee: this function never throws exceptions.\n\n    @requirement This function helps `basic_json` satisfying the\n    [Container](https://en.cppreference.com/w/cpp/named_req/Container)\n    requirements:\n    - The complexity is constant.\n    - Has the semantics of returning `b.size()` where `b` is the largest\n      possible JSON value.\n\n    @sa @ref size() -- returns the number of elements\n\n    @since version 1.0.0\n    */\n    size_type max_size() const noexcept\n    {\n        switch (m_type)\n        {\n            case value_t::array:\n            {\n                // delegate call to array_t::max_size()\n                return m_value.array->max_size();\n            }\n\n            case value_t::object:\n            {\n                // delegate call to object_t::max_size()\n                return m_value.object->max_size();\n            }\n\n            default:\n            {\n                // all other types have max_size() == size()\n                return size();\n            }\n        }\n    }\n\n    /// @}\n\n\n    ///////////////\n    // modifiers //\n    ///////////////\n\n    /// @name modifiers\n    /// @{\n\n    /*!\n    @brief clears the contents\n\n    Clears the content of a JSON value and resets it to the default value as\n    if @ref basic_json(value_t) would have been called with the current value\n    type from @ref type():\n\n    Value type  | initial value\n    ----------- | -------------\n    null        | `null`\n    boolean     | `false`\n    string      | `\"\"`\n    number      | `0`\n    binary      | An empty byte vector\n    object      | `{}`\n    array       | `[]`\n\n    @post Has the same effect as calling\n    @code {.cpp}\n    *this = basic_json(type());\n    @endcode\n\n    @liveexample{The example below shows the effect of `clear()` to different\n    JSON types.,clear}\n\n    @complexity Linear in the size of the JSON value.\n\n    @iterators All iterators, pointers and references related to this container\n               are invalidated.\n\n    @exceptionsafety No-throw guarantee: this function never throws exceptions.\n\n    @sa @ref basic_json(value_t) -- constructor that creates an object with the\n        same value than calling `clear()`\n\n    @since version 1.0.0\n    */\n    void clear() noexcept\n    {\n        switch (m_type)\n        {\n            case value_t::number_integer:\n            {\n                m_value.number_integer = 0;\n                break;\n            }\n\n            case value_t::number_unsigned:\n            {\n                m_value.number_unsigned = 0;\n                break;\n            }\n\n            case value_t::number_float:\n            {\n                m_value.number_float = 0.0;\n                break;\n            }\n\n            case value_t::boolean:\n            {\n                m_value.boolean = false;\n                break;\n            }\n\n            case value_t::string:\n            {\n                m_value.string->clear();\n                break;\n            }\n\n            case value_t::binary:\n            {\n                m_value.binary->clear();\n                break;\n            }\n\n            case value_t::array:\n            {\n                m_value.array->clear();\n                break;\n            }\n\n            case value_t::object:\n            {\n                m_value.object->clear();\n                break;\n            }\n\n            default:\n                break;\n        }\n    }\n\n    /*!\n    @brief add an object to an array\n\n    Appends the given element @a val to the end of the JSON value. If the\n    function is called on a JSON null value, an empty array is created before\n    appending @a val.\n\n    @param[in] val the value to add to the JSON array\n\n    @throw type_error.308 when called on a type other than JSON array or\n    null; example: `\"cannot use push_back() with number\"`\n\n    @complexity Amortized constant.\n\n    @liveexample{The example shows how `push_back()` and `+=` can be used to\n    add elements to a JSON array. Note how the `null` value was silently\n    converted to a JSON array.,push_back}\n\n    @since version 1.0.0\n    */\n    void push_back(basic_json&& val)\n    {\n        // push_back only works for null objects or arrays\n        if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_array())))\n        {\n            JSON_THROW(type_error::create(308, \"cannot use push_back() with \" + std::string(type_name())));\n        }\n\n        // transform null object into an array\n        if (is_null())\n        {\n            m_type = value_t::array;\n            m_value = value_t::array;\n            assert_invariant();\n        }\n\n        // add element to array (move semantics)\n        m_value.array->push_back(std::move(val));\n        // if val is moved from, basic_json move constructor marks it null so we do not call the destructor\n    }\n\n    /*!\n    @brief add an object to an array\n    @copydoc push_back(basic_json&&)\n    */\n    reference operator+=(basic_json&& val)\n    {\n        push_back(std::move(val));\n        return *this;\n    }\n\n    /*!\n    @brief add an object to an array\n    @copydoc push_back(basic_json&&)\n    */\n    void push_back(const basic_json& val)\n    {\n        // push_back only works for null objects or arrays\n        if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_array())))\n        {\n            JSON_THROW(type_error::create(308, \"cannot use push_back() with \" + std::string(type_name())));\n        }\n\n        // transform null object into an array\n        if (is_null())\n        {\n            m_type = value_t::array;\n            m_value = value_t::array;\n            assert_invariant();\n        }\n\n        // add element to array\n        m_value.array->push_back(val);\n    }\n\n    /*!\n    @brief add an object to an array\n    @copydoc push_back(basic_json&&)\n    */\n    reference operator+=(const basic_json& val)\n    {\n        push_back(val);\n        return *this;\n    }\n\n    /*!\n    @brief add an object to an object\n\n    Inserts the given element @a val to the JSON object. If the function is\n    called on a JSON null value, an empty object is created before inserting\n    @a val.\n\n    @param[in] val the value to add to the JSON object\n\n    @throw type_error.308 when called on a type other than JSON object or\n    null; example: `\"cannot use push_back() with number\"`\n\n    @complexity Logarithmic in the size of the container, O(log(`size()`)).\n\n    @liveexample{The example shows how `push_back()` and `+=` can be used to\n    add elements to a JSON object. Note how the `null` value was silently\n    converted to a JSON object.,push_back__object_t__value}\n\n    @since version 1.0.0\n    */\n    void push_back(const typename object_t::value_type& val)\n    {\n        // push_back only works for null objects or objects\n        if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_object())))\n        {\n            JSON_THROW(type_error::create(308, \"cannot use push_back() with \" + std::string(type_name())));\n        }\n\n        // transform null object into an object\n        if (is_null())\n        {\n            m_type = value_t::object;\n            m_value = value_t::object;\n            assert_invariant();\n        }\n\n        // add element to array\n        m_value.object->insert(val);\n    }\n\n    /*!\n    @brief add an object to an object\n    @copydoc push_back(const typename object_t::value_type&)\n    */\n    reference operator+=(const typename object_t::value_type& val)\n    {\n        push_back(val);\n        return *this;\n    }\n\n    /*!\n    @brief add an object to an object\n\n    This function allows to use `push_back` with an initializer list. In case\n\n    1. the current value is an object,\n    2. the initializer list @a init contains only two elements, and\n    3. the first element of @a init is a string,\n\n    @a init is converted into an object element and added using\n    @ref push_back(const typename object_t::value_type&). Otherwise, @a init\n    is converted to a JSON value and added using @ref push_back(basic_json&&).\n\n    @param[in] init  an initializer list\n\n    @complexity Linear in the size of the initializer list @a init.\n\n    @note This function is required to resolve an ambiguous overload error,\n          because pairs like `{\"key\", \"value\"}` can be both interpreted as\n          `object_t::value_type` or `std::initializer_list<basic_json>`, see\n          https://github.com/nlohmann/json/issues/235 for more information.\n\n    @liveexample{The example shows how initializer lists are treated as\n    objects when possible.,push_back__initializer_list}\n    */\n    void push_back(initializer_list_t init)\n    {\n        if (is_object() && init.size() == 2 && (*init.begin())->is_string())\n        {\n            basic_json&& key = init.begin()->moved_or_copied();\n            push_back(typename object_t::value_type(\n                          std::move(key.get_ref<string_t&>()), (init.begin() + 1)->moved_or_copied()));\n        }\n        else\n        {\n            push_back(basic_json(init));\n        }\n    }\n\n    /*!\n    @brief add an object to an object\n    @copydoc push_back(initializer_list_t)\n    */\n    reference operator+=(initializer_list_t init)\n    {\n        push_back(init);\n        return *this;\n    }\n\n    /*!\n    @brief add an object to an array\n\n    Creates a JSON value from the passed parameters @a args to the end of the\n    JSON value. If the function is called on a JSON null value, an empty array\n    is created before appending the value created from @a args.\n\n    @param[in] args arguments to forward to a constructor of @ref basic_json\n    @tparam Args compatible types to create a @ref basic_json object\n\n    @return reference to the inserted element\n\n    @throw type_error.311 when called on a type other than JSON array or\n    null; example: `\"cannot use emplace_back() with number\"`\n\n    @complexity Amortized constant.\n\n    @liveexample{The example shows how `push_back()` can be used to add\n    elements to a JSON array. Note how the `null` value was silently converted\n    to a JSON array.,emplace_back}\n\n    @since version 2.0.8, returns reference since 3.7.0\n    */\n    template<class... Args>\n    reference emplace_back(Args&& ... args)\n    {\n        // emplace_back only works for null objects or arrays\n        if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_array())))\n        {\n            JSON_THROW(type_error::create(311, \"cannot use emplace_back() with \" + std::string(type_name())));\n        }\n\n        // transform null object into an array\n        if (is_null())\n        {\n            m_type = value_t::array;\n            m_value = value_t::array;\n            assert_invariant();\n        }\n\n        // add element to array (perfect forwarding)\n#ifdef JSON_HAS_CPP_17\n        return m_value.array->emplace_back(std::forward<Args>(args)...);\n#else\n        m_value.array->emplace_back(std::forward<Args>(args)...);\n        return m_value.array->back();\n#endif\n    }\n\n    /*!\n    @brief add an object to an object if key does not exist\n\n    Inserts a new element into a JSON object constructed in-place with the\n    given @a args if there is no element with the key in the container. If the\n    function is called on a JSON null value, an empty object is created before\n    appending the value created from @a args.\n\n    @param[in] args arguments to forward to a constructor of @ref basic_json\n    @tparam Args compatible types to create a @ref basic_json object\n\n    @return a pair consisting of an iterator to the inserted element, or the\n            already-existing element if no insertion happened, and a bool\n            denoting whether the insertion took place.\n\n    @throw type_error.311 when called on a type other than JSON object or\n    null; example: `\"cannot use emplace() with number\"`\n\n    @complexity Logarithmic in the size of the container, O(log(`size()`)).\n\n    @liveexample{The example shows how `emplace()` can be used to add elements\n    to a JSON object. Note how the `null` value was silently converted to a\n    JSON object. Further note how no value is added if there was already one\n    value stored with the same key.,emplace}\n\n    @since version 2.0.8\n    */\n    template<class... Args>\n    std::pair<iterator, bool> emplace(Args&& ... args)\n    {\n        // emplace only works for null objects or arrays\n        if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_object())))\n        {\n            JSON_THROW(type_error::create(311, \"cannot use emplace() with \" + std::string(type_name())));\n        }\n\n        // transform null object into an object\n        if (is_null())\n        {\n            m_type = value_t::object;\n            m_value = value_t::object;\n            assert_invariant();\n        }\n\n        // add element to array (perfect forwarding)\n        auto res = m_value.object->emplace(std::forward<Args>(args)...);\n        // create result iterator and set iterator to the result of emplace\n        auto it = begin();\n        it.m_it.object_iterator = res.first;\n\n        // return pair of iterator and boolean\n        return {it, res.second};\n    }\n\n    /// Helper for insertion of an iterator\n    /// @note: This uses std::distance to support GCC 4.8,\n    ///        see https://github.com/nlohmann/json/pull/1257\n    template<typename... Args>\n    iterator insert_iterator(const_iterator pos, Args&& ... args)\n    {\n        iterator result(this);\n        JSON_ASSERT(m_value.array != nullptr);\n\n        auto insert_pos = std::distance(m_value.array->begin(), pos.m_it.array_iterator);\n        m_value.array->insert(pos.m_it.array_iterator, std::forward<Args>(args)...);\n        result.m_it.array_iterator = m_value.array->begin() + insert_pos;\n\n        // This could have been written as:\n        // result.m_it.array_iterator = m_value.array->insert(pos.m_it.array_iterator, cnt, val);\n        // but the return value of insert is missing in GCC 4.8, so it is written this way instead.\n\n        return result;\n    }\n\n    /*!\n    @brief inserts element\n\n    Inserts element @a val before iterator @a pos.\n\n    @param[in] pos iterator before which the content will be inserted; may be\n    the end() iterator\n    @param[in] val element to insert\n    @return iterator pointing to the inserted @a val.\n\n    @throw type_error.309 if called on JSON values other than arrays;\n    example: `\"cannot use insert() with string\"`\n    @throw invalid_iterator.202 if @a pos is not an iterator of *this;\n    example: `\"iterator does not fit current value\"`\n\n    @complexity Constant plus linear in the distance between @a pos and end of\n    the container.\n\n    @liveexample{The example shows how `insert()` is used.,insert}\n\n    @since version 1.0.0\n    */\n    iterator insert(const_iterator pos, const basic_json& val)\n    {\n        // insert only works for arrays\n        if (JSON_HEDLEY_LIKELY(is_array()))\n        {\n            // check if iterator pos fits to this JSON value\n            if (JSON_HEDLEY_UNLIKELY(pos.m_object != this))\n            {\n                JSON_THROW(invalid_iterator::create(202, \"iterator does not fit current value\"));\n            }\n\n            // insert to array and return iterator\n            return insert_iterator(pos, val);\n        }\n\n        JSON_THROW(type_error::create(309, \"cannot use insert() with \" + std::string(type_name())));\n    }\n\n    /*!\n    @brief inserts element\n    @copydoc insert(const_iterator, const basic_json&)\n    */\n    iterator insert(const_iterator pos, basic_json&& val)\n    {\n        return insert(pos, val);\n    }\n\n    /*!\n    @brief inserts elements\n\n    Inserts @a cnt copies of @a val before iterator @a pos.\n\n    @param[in] pos iterator before which the content will be inserted; may be\n    the end() iterator\n    @param[in] cnt number of copies of @a val to insert\n    @param[in] val element to insert\n    @return iterator pointing to the first element inserted, or @a pos if\n    `cnt==0`\n\n    @throw type_error.309 if called on JSON values other than arrays; example:\n    `\"cannot use insert() with string\"`\n    @throw invalid_iterator.202 if @a pos is not an iterator of *this;\n    example: `\"iterator does not fit current value\"`\n\n    @complexity Linear in @a cnt plus linear in the distance between @a pos\n    and end of the container.\n\n    @liveexample{The example shows how `insert()` is used.,insert__count}\n\n    @since version 1.0.0\n    */\n    iterator insert(const_iterator pos, size_type cnt, const basic_json& val)\n    {\n        // insert only works for arrays\n        if (JSON_HEDLEY_LIKELY(is_array()))\n        {\n            // check if iterator pos fits to this JSON value\n            if (JSON_HEDLEY_UNLIKELY(pos.m_object != this))\n            {\n                JSON_THROW(invalid_iterator::create(202, \"iterator does not fit current value\"));\n            }\n\n            // insert to array and return iterator\n            return insert_iterator(pos, cnt, val);\n        }\n\n        JSON_THROW(type_error::create(309, \"cannot use insert() with \" + std::string(type_name())));\n    }\n\n    /*!\n    @brief inserts elements\n\n    Inserts elements from range `[first, last)` before iterator @a pos.\n\n    @param[in] pos iterator before which the content will be inserted; may be\n    the end() iterator\n    @param[in] first begin of the range of elements to insert\n    @param[in] last end of the range of elements to insert\n\n    @throw type_error.309 if called on JSON values other than arrays; example:\n    `\"cannot use insert() with string\"`\n    @throw invalid_iterator.202 if @a pos is not an iterator of *this;\n    example: `\"iterator does not fit current value\"`\n    @throw invalid_iterator.210 if @a first and @a last do not belong to the\n    same JSON value; example: `\"iterators do not fit\"`\n    @throw invalid_iterator.211 if @a first or @a last are iterators into\n    container for which insert is called; example: `\"passed iterators may not\n    belong to container\"`\n\n    @return iterator pointing to the first element inserted, or @a pos if\n    `first==last`\n\n    @complexity Linear in `std::distance(first, last)` plus linear in the\n    distance between @a pos and end of the container.\n\n    @liveexample{The example shows how `insert()` is used.,insert__range}\n\n    @since version 1.0.0\n    */\n    iterator insert(const_iterator pos, const_iterator first, const_iterator last)\n    {\n        // insert only works for arrays\n        if (JSON_HEDLEY_UNLIKELY(!is_array()))\n        {\n            JSON_THROW(type_error::create(309, \"cannot use insert() with \" + std::string(type_name())));\n        }\n\n        // check if iterator pos fits to this JSON value\n        if (JSON_HEDLEY_UNLIKELY(pos.m_object != this))\n        {\n            JSON_THROW(invalid_iterator::create(202, \"iterator does not fit current value\"));\n        }\n\n        // check if range iterators belong to the same JSON object\n        if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object))\n        {\n            JSON_THROW(invalid_iterator::create(210, \"iterators do not fit\"));\n        }\n\n        if (JSON_HEDLEY_UNLIKELY(first.m_object == this))\n        {\n            JSON_THROW(invalid_iterator::create(211, \"passed iterators may not belong to container\"));\n        }\n\n        // insert to array and return iterator\n        return insert_iterator(pos, first.m_it.array_iterator, last.m_it.array_iterator);\n    }\n\n    /*!\n    @brief inserts elements\n\n    Inserts elements from initializer list @a ilist before iterator @a pos.\n\n    @param[in] pos iterator before which the content will be inserted; may be\n    the end() iterator\n    @param[in] ilist initializer list to insert the values from\n\n    @throw type_error.309 if called on JSON values other than arrays; example:\n    `\"cannot use insert() with string\"`\n    @throw invalid_iterator.202 if @a pos is not an iterator of *this;\n    example: `\"iterator does not fit current value\"`\n\n    @return iterator pointing to the first element inserted, or @a pos if\n    `ilist` is empty\n\n    @complexity Linear in `ilist.size()` plus linear in the distance between\n    @a pos and end of the container.\n\n    @liveexample{The example shows how `insert()` is used.,insert__ilist}\n\n    @since version 1.0.0\n    */\n    iterator insert(const_iterator pos, initializer_list_t ilist)\n    {\n        // insert only works for arrays\n        if (JSON_HEDLEY_UNLIKELY(!is_array()))\n        {\n            JSON_THROW(type_error::create(309, \"cannot use insert() with \" + std::string(type_name())));\n        }\n\n        // check if iterator pos fits to this JSON value\n        if (JSON_HEDLEY_UNLIKELY(pos.m_object != this))\n        {\n            JSON_THROW(invalid_iterator::create(202, \"iterator does not fit current value\"));\n        }\n\n        // insert to array and return iterator\n        return insert_iterator(pos, ilist.begin(), ilist.end());\n    }\n\n    /*!\n    @brief inserts elements\n\n    Inserts elements from range `[first, last)`.\n\n    @param[in] first begin of the range of elements to insert\n    @param[in] last end of the range of elements to insert\n\n    @throw type_error.309 if called on JSON values other than objects; example:\n    `\"cannot use insert() with string\"`\n    @throw invalid_iterator.202 if iterator @a first or @a last does does not\n    point to an object; example: `\"iterators first and last must point to\n    objects\"`\n    @throw invalid_iterator.210 if @a first and @a last do not belong to the\n    same JSON value; example: `\"iterators do not fit\"`\n\n    @complexity Logarithmic: `O(N*log(size() + N))`, where `N` is the number\n    of elements to insert.\n\n    @liveexample{The example shows how `insert()` is used.,insert__range_object}\n\n    @since version 3.0.0\n    */\n    void insert(const_iterator first, const_iterator last)\n    {\n        // insert only works for objects\n        if (JSON_HEDLEY_UNLIKELY(!is_object()))\n        {\n            JSON_THROW(type_error::create(309, \"cannot use insert() with \" + std::string(type_name())));\n        }\n\n        // check if range iterators belong to the same JSON object\n        if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object))\n        {\n            JSON_THROW(invalid_iterator::create(210, \"iterators do not fit\"));\n        }\n\n        // passed iterators must belong to objects\n        if (JSON_HEDLEY_UNLIKELY(!first.m_object->is_object()))\n        {\n            JSON_THROW(invalid_iterator::create(202, \"iterators first and last must point to objects\"));\n        }\n\n        m_value.object->insert(first.m_it.object_iterator, last.m_it.object_iterator);\n    }\n\n    /*!\n    @brief updates a JSON object from another object, overwriting existing keys\n\n    Inserts all values from JSON object @a j and overwrites existing keys.\n\n    @param[in] j  JSON object to read values from\n\n    @throw type_error.312 if called on JSON values other than objects; example:\n    `\"cannot use update() with string\"`\n\n    @complexity O(N*log(size() + N)), where N is the number of elements to\n                insert.\n\n    @liveexample{The example shows how `update()` is used.,update}\n\n    @sa https://docs.python.org/3.6/library/stdtypes.html#dict.update\n\n    @since version 3.0.0\n    */\n    void update(const_reference j)\n    {\n        // implicitly convert null value to an empty object\n        if (is_null())\n        {\n            m_type = value_t::object;\n            m_value.object = create<object_t>();\n            assert_invariant();\n        }\n\n        if (JSON_HEDLEY_UNLIKELY(!is_object()))\n        {\n            JSON_THROW(type_error::create(312, \"cannot use update() with \" + std::string(type_name())));\n        }\n        if (JSON_HEDLEY_UNLIKELY(!j.is_object()))\n        {\n            JSON_THROW(type_error::create(312, \"cannot use update() with \" + std::string(j.type_name())));\n        }\n\n        for (auto it = j.cbegin(); it != j.cend(); ++it)\n        {\n            m_value.object->operator[](it.key()) = it.value();\n        }\n    }\n\n    /*!\n    @brief updates a JSON object from another object, overwriting existing keys\n\n    Inserts all values from from range `[first, last)` and overwrites existing\n    keys.\n\n    @param[in] first begin of the range of elements to insert\n    @param[in] last end of the range of elements to insert\n\n    @throw type_error.312 if called on JSON values other than objects; example:\n    `\"cannot use update() with string\"`\n    @throw invalid_iterator.202 if iterator @a first or @a last does does not\n    point to an object; example: `\"iterators first and last must point to\n    objects\"`\n    @throw invalid_iterator.210 if @a first and @a last do not belong to the\n    same JSON value; example: `\"iterators do not fit\"`\n\n    @complexity O(N*log(size() + N)), where N is the number of elements to\n                insert.\n\n    @liveexample{The example shows how `update()` is used__range.,update}\n\n    @sa https://docs.python.org/3.6/library/stdtypes.html#dict.update\n\n    @since version 3.0.0\n    */\n    void update(const_iterator first, const_iterator last)\n    {\n        // implicitly convert null value to an empty object\n        if (is_null())\n        {\n            m_type = value_t::object;\n            m_value.object = create<object_t>();\n            assert_invariant();\n        }\n\n        if (JSON_HEDLEY_UNLIKELY(!is_object()))\n        {\n            JSON_THROW(type_error::create(312, \"cannot use update() with \" + std::string(type_name())));\n        }\n\n        // check if range iterators belong to the same JSON object\n        if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object))\n        {\n            JSON_THROW(invalid_iterator::create(210, \"iterators do not fit\"));\n        }\n\n        // passed iterators must belong to objects\n        if (JSON_HEDLEY_UNLIKELY(!first.m_object->is_object()\n                                 || !last.m_object->is_object()))\n        {\n            JSON_THROW(invalid_iterator::create(202, \"iterators first and last must point to objects\"));\n        }\n\n        for (auto it = first; it != last; ++it)\n        {\n            m_value.object->operator[](it.key()) = it.value();\n        }\n    }\n\n    /*!\n    @brief exchanges the values\n\n    Exchanges the contents of the JSON value with those of @a other. Does not\n    invoke any move, copy, or swap operations on individual elements. All\n    iterators and references remain valid. The past-the-end iterator is\n    invalidated.\n\n    @param[in,out] other JSON value to exchange the contents with\n\n    @complexity Constant.\n\n    @liveexample{The example below shows how JSON values can be swapped with\n    `swap()`.,swap__reference}\n\n    @since version 1.0.0\n    */\n    void swap(reference other) noexcept (\n        std::is_nothrow_move_constructible<value_t>::value&&\n        std::is_nothrow_move_assignable<value_t>::value&&\n        std::is_nothrow_move_constructible<json_value>::value&&\n        std::is_nothrow_move_assignable<json_value>::value\n    )\n    {\n        std::swap(m_type, other.m_type);\n        std::swap(m_value, other.m_value);\n        assert_invariant();\n    }\n\n    /*!\n    @brief exchanges the values\n\n    Exchanges the contents of the JSON value from @a left with those of @a right. Does not\n    invoke any move, copy, or swap operations on individual elements. All\n    iterators and references remain valid. The past-the-end iterator is\n    invalidated. implemented as a friend function callable via ADL.\n\n    @param[in,out] left JSON value to exchange the contents with\n    @param[in,out] right JSON value to exchange the contents with\n\n    @complexity Constant.\n\n    @liveexample{The example below shows how JSON values can be swapped with\n    `swap()`.,swap__reference}\n\n    @since version 1.0.0\n    */\n    friend void swap(reference left, reference right) noexcept (\n        std::is_nothrow_move_constructible<value_t>::value&&\n        std::is_nothrow_move_assignable<value_t>::value&&\n        std::is_nothrow_move_constructible<json_value>::value&&\n        std::is_nothrow_move_assignable<json_value>::value\n    )\n    {\n        left.swap(right);\n    }\n\n    /*!\n    @brief exchanges the values\n\n    Exchanges the contents of a JSON array with those of @a other. Does not\n    invoke any move, copy, or swap operations on individual elements. All\n    iterators and references remain valid. The past-the-end iterator is\n    invalidated.\n\n    @param[in,out] other array to exchange the contents with\n\n    @throw type_error.310 when JSON value is not an array; example: `\"cannot\n    use swap() with string\"`\n\n    @complexity Constant.\n\n    @liveexample{The example below shows how arrays can be swapped with\n    `swap()`.,swap__array_t}\n\n    @since version 1.0.0\n    */\n    void swap(array_t& other)\n    {\n        // swap only works for arrays\n        if (JSON_HEDLEY_LIKELY(is_array()))\n        {\n            std::swap(*(m_value.array), other);\n        }\n        else\n        {\n            JSON_THROW(type_error::create(310, \"cannot use swap() with \" + std::string(type_name())));\n        }\n    }\n\n    /*!\n    @brief exchanges the values\n\n    Exchanges the contents of a JSON object with those of @a other. Does not\n    invoke any move, copy, or swap operations on individual elements. All\n    iterators and references remain valid. The past-the-end iterator is\n    invalidated.\n\n    @param[in,out] other object to exchange the contents with\n\n    @throw type_error.310 when JSON value is not an object; example:\n    `\"cannot use swap() with string\"`\n\n    @complexity Constant.\n\n    @liveexample{The example below shows how objects can be swapped with\n    `swap()`.,swap__object_t}\n\n    @since version 1.0.0\n    */\n    void swap(object_t& other)\n    {\n        // swap only works for objects\n        if (JSON_HEDLEY_LIKELY(is_object()))\n        {\n            std::swap(*(m_value.object), other);\n        }\n        else\n        {\n            JSON_THROW(type_error::create(310, \"cannot use swap() with \" + std::string(type_name())));\n        }\n    }\n\n    /*!\n    @brief exchanges the values\n\n    Exchanges the contents of a JSON string with those of @a other. Does not\n    invoke any move, copy, or swap operations on individual elements. All\n    iterators and references remain valid. The past-the-end iterator is\n    invalidated.\n\n    @param[in,out] other string to exchange the contents with\n\n    @throw type_error.310 when JSON value is not a string; example: `\"cannot\n    use swap() with boolean\"`\n\n    @complexity Constant.\n\n    @liveexample{The example below shows how strings can be swapped with\n    `swap()`.,swap__string_t}\n\n    @since version 1.0.0\n    */\n    void swap(string_t& other)\n    {\n        // swap only works for strings\n        if (JSON_HEDLEY_LIKELY(is_string()))\n        {\n            std::swap(*(m_value.string), other);\n        }\n        else\n        {\n            JSON_THROW(type_error::create(310, \"cannot use swap() with \" + std::string(type_name())));\n        }\n    }\n\n    /*!\n    @brief exchanges the values\n\n    Exchanges the contents of a JSON string with those of @a other. Does not\n    invoke any move, copy, or swap operations on individual elements. All\n    iterators and references remain valid. The past-the-end iterator is\n    invalidated.\n\n    @param[in,out] other binary to exchange the contents with\n\n    @throw type_error.310 when JSON value is not a string; example: `\"cannot\n    use swap() with boolean\"`\n\n    @complexity Constant.\n\n    @liveexample{The example below shows how strings can be swapped with\n    `swap()`.,swap__binary_t}\n\n    @since version 3.8.0\n    */\n    void swap(binary_t& other)\n    {\n        // swap only works for strings\n        if (JSON_HEDLEY_LIKELY(is_binary()))\n        {\n            std::swap(*(m_value.binary), other);\n        }\n        else\n        {\n            JSON_THROW(type_error::create(310, \"cannot use swap() with \" + std::string(type_name())));\n        }\n    }\n\n    /// @copydoc swap(binary_t)\n    void swap(typename binary_t::container_type& other)\n    {\n        // swap only works for strings\n        if (JSON_HEDLEY_LIKELY(is_binary()))\n        {\n            std::swap(*(m_value.binary), other);\n        }\n        else\n        {\n            JSON_THROW(type_error::create(310, \"cannot use swap() with \" + std::string(type_name())));\n        }\n    }\n\n    /// @}\n\n  public:\n    //////////////////////////////////////////\n    // lexicographical comparison operators //\n    //////////////////////////////////////////\n\n    /// @name lexicographical comparison operators\n    /// @{\n\n    /*!\n    @brief comparison: equal\n\n    Compares two JSON values for equality according to the following rules:\n    - Two JSON values are equal if (1) they are from the same type and (2)\n      their stored values are the same according to their respective\n      `operator==`.\n    - Integer and floating-point numbers are automatically converted before\n      comparison. Note that two NaN values are always treated as unequal.\n    - Two JSON null values are equal.\n\n    @note Floating-point inside JSON values numbers are compared with\n    `json::number_float_t::operator==` which is `double::operator==` by\n    default. To compare floating-point while respecting an epsilon, an alternative\n    [comparison function](https://github.com/mariokonrad/marnav/blob/master/include/marnav/math/floatingpoint.hpp#L34-#L39)\n    could be used, for instance\n    @code {.cpp}\n    template<typename T, typename = typename std::enable_if<std::is_floating_point<T>::value, T>::type>\n    inline bool is_same(T a, T b, T epsilon = std::numeric_limits<T>::epsilon()) noexcept\n    {\n        return std::abs(a - b) <= epsilon;\n    }\n    @endcode\n    Or you can self-defined operator equal function like this:\n    @code {.cpp}\n    bool my_equal(const_reference lhs, const_reference rhs) {\n    const auto lhs_type lhs.type();\n    const auto rhs_type rhs.type();\n    if (lhs_type == rhs_type) {\n        switch(lhs_type)\n            // self_defined case\n            case value_t::number_float:\n                return std::abs(lhs - rhs) <= std::numeric_limits<float>::epsilon();\n            // other cases remain the same with the original\n            ...\n    }\n    ...\n    }\n    @endcode\n\n    @note NaN values never compare equal to themselves or to other NaN values.\n\n    @param[in] lhs  first JSON value to consider\n    @param[in] rhs  second JSON value to consider\n    @return whether the values @a lhs and @a rhs are equal\n\n    @exceptionsafety No-throw guarantee: this function never throws exceptions.\n\n    @complexity Linear.\n\n    @liveexample{The example demonstrates comparing several JSON\n    types.,operator__equal}\n\n    @since version 1.0.0\n    */\n    friend bool operator==(const_reference lhs, const_reference rhs) noexcept\n    {\n        const auto lhs_type = lhs.type();\n        const auto rhs_type = rhs.type();\n\n        if (lhs_type == rhs_type)\n        {\n            switch (lhs_type)\n            {\n                case value_t::array:\n                    return *lhs.m_value.array == *rhs.m_value.array;\n\n                case value_t::object:\n                    return *lhs.m_value.object == *rhs.m_value.object;\n\n                case value_t::null:\n                    return true;\n\n                case value_t::string:\n                    return *lhs.m_value.string == *rhs.m_value.string;\n\n                case value_t::boolean:\n                    return lhs.m_value.boolean == rhs.m_value.boolean;\n\n                case value_t::number_integer:\n                    return lhs.m_value.number_integer == rhs.m_value.number_integer;\n\n                case value_t::number_unsigned:\n                    return lhs.m_value.number_unsigned == rhs.m_value.number_unsigned;\n\n                case value_t::number_float:\n                    return lhs.m_value.number_float == rhs.m_value.number_float;\n\n                case value_t::binary:\n                    return *lhs.m_value.binary == *rhs.m_value.binary;\n\n                default:\n                    return false;\n            }\n        }\n        else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_float)\n        {\n            return static_cast<number_float_t>(lhs.m_value.number_integer) == rhs.m_value.number_float;\n        }\n        else if (lhs_type == value_t::number_float && rhs_type == value_t::number_integer)\n        {\n            return lhs.m_value.number_float == static_cast<number_float_t>(rhs.m_value.number_integer);\n        }\n        else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_float)\n        {\n            return static_cast<number_float_t>(lhs.m_value.number_unsigned) == rhs.m_value.number_float;\n        }\n        else if (lhs_type == value_t::number_float && rhs_type == value_t::number_unsigned)\n        {\n            return lhs.m_value.number_float == static_cast<number_float_t>(rhs.m_value.number_unsigned);\n        }\n        else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_integer)\n        {\n            return static_cast<number_integer_t>(lhs.m_value.number_unsigned) == rhs.m_value.number_integer;\n        }\n        else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_unsigned)\n        {\n            return lhs.m_value.number_integer == static_cast<number_integer_t>(rhs.m_value.number_unsigned);\n        }\n\n        return false;\n    }\n\n    /*!\n    @brief comparison: equal\n    @copydoc operator==(const_reference, const_reference)\n    */\n    template<typename ScalarType, typename std::enable_if<\n                 std::is_scalar<ScalarType>::value, int>::type = 0>\n    friend bool operator==(const_reference lhs, const ScalarType rhs) noexcept\n    {\n        return lhs == basic_json(rhs);\n    }\n\n    /*!\n    @brief comparison: equal\n    @copydoc operator==(const_reference, const_reference)\n    */\n    template<typename ScalarType, typename std::enable_if<\n                 std::is_scalar<ScalarType>::value, int>::type = 0>\n    friend bool operator==(const ScalarType lhs, const_reference rhs) noexcept\n    {\n        return basic_json(lhs) == rhs;\n    }\n\n    /*!\n    @brief comparison: not equal\n\n    Compares two JSON values for inequality by calculating `not (lhs == rhs)`.\n\n    @param[in] lhs  first JSON value to consider\n    @param[in] rhs  second JSON value to consider\n    @return whether the values @a lhs and @a rhs are not equal\n\n    @complexity Linear.\n\n    @exceptionsafety No-throw guarantee: this function never throws exceptions.\n\n    @liveexample{The example demonstrates comparing several JSON\n    types.,operator__notequal}\n\n    @since version 1.0.0\n    */\n    friend bool operator!=(const_reference lhs, const_reference rhs) noexcept\n    {\n        return !(lhs == rhs);\n    }\n\n    /*!\n    @brief comparison: not equal\n    @copydoc operator!=(const_reference, const_reference)\n    */\n    template<typename ScalarType, typename std::enable_if<\n                 std::is_scalar<ScalarType>::value, int>::type = 0>\n    friend bool operator!=(const_reference lhs, const ScalarType rhs) noexcept\n    {\n        return lhs != basic_json(rhs);\n    }\n\n    /*!\n    @brief comparison: not equal\n    @copydoc operator!=(const_reference, const_reference)\n    */\n    template<typename ScalarType, typename std::enable_if<\n                 std::is_scalar<ScalarType>::value, int>::type = 0>\n    friend bool operator!=(const ScalarType lhs, const_reference rhs) noexcept\n    {\n        return basic_json(lhs) != rhs;\n    }\n\n    /*!\n    @brief comparison: less than\n\n    Compares whether one JSON value @a lhs is less than another JSON value @a\n    rhs according to the following rules:\n    - If @a lhs and @a rhs have the same type, the values are compared using\n      the default `<` operator.\n    - Integer and floating-point numbers are automatically converted before\n      comparison\n    - In case @a lhs and @a rhs have different types, the values are ignored\n      and the order of the types is considered, see\n      @ref operator<(const value_t, const value_t).\n\n    @param[in] lhs  first JSON value to consider\n    @param[in] rhs  second JSON value to consider\n    @return whether @a lhs is less than @a rhs\n\n    @complexity Linear.\n\n    @exceptionsafety No-throw guarantee: this function never throws exceptions.\n\n    @liveexample{The example demonstrates comparing several JSON\n    types.,operator__less}\n\n    @since version 1.0.0\n    */\n    friend bool operator<(const_reference lhs, const_reference rhs) noexcept\n    {\n        const auto lhs_type = lhs.type();\n        const auto rhs_type = rhs.type();\n\n        if (lhs_type == rhs_type)\n        {\n            switch (lhs_type)\n            {\n                case value_t::array:\n                    // note parentheses are necessary, see\n                    // https://github.com/nlohmann/json/issues/1530\n                    return (*lhs.m_value.array) < (*rhs.m_value.array);\n\n                case value_t::object:\n                    return (*lhs.m_value.object) < (*rhs.m_value.object);\n\n                case value_t::null:\n                    return false;\n\n                case value_t::string:\n                    return (*lhs.m_value.string) < (*rhs.m_value.string);\n\n                case value_t::boolean:\n                    return (lhs.m_value.boolean) < (rhs.m_value.boolean);\n\n                case value_t::number_integer:\n                    return (lhs.m_value.number_integer) < (rhs.m_value.number_integer);\n\n                case value_t::number_unsigned:\n                    return (lhs.m_value.number_unsigned) < (rhs.m_value.number_unsigned);\n\n                case value_t::number_float:\n                    return (lhs.m_value.number_float) < (rhs.m_value.number_float);\n\n                case value_t::binary:\n                    return (*lhs.m_value.binary) < (*rhs.m_value.binary);\n\n                default:\n                    return false;\n            }\n        }\n        else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_float)\n        {\n            return static_cast<number_float_t>(lhs.m_value.number_integer) < rhs.m_value.number_float;\n        }\n        else if (lhs_type == value_t::number_float && rhs_type == value_t::number_integer)\n        {\n            return lhs.m_value.number_float < static_cast<number_float_t>(rhs.m_value.number_integer);\n        }\n        else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_float)\n        {\n            return static_cast<number_float_t>(lhs.m_value.number_unsigned) < rhs.m_value.number_float;\n        }\n        else if (lhs_type == value_t::number_float && rhs_type == value_t::number_unsigned)\n        {\n            return lhs.m_value.number_float < static_cast<number_float_t>(rhs.m_value.number_unsigned);\n        }\n        else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_unsigned)\n        {\n            return lhs.m_value.number_integer < static_cast<number_integer_t>(rhs.m_value.number_unsigned);\n        }\n        else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_integer)\n        {\n            return static_cast<number_integer_t>(lhs.m_value.number_unsigned) < rhs.m_value.number_integer;\n        }\n\n        // We only reach this line if we cannot compare values. In that case,\n        // we compare types. Note we have to call the operator explicitly,\n        // because MSVC has problems otherwise.\n        return operator<(lhs_type, rhs_type);\n    }\n\n    /*!\n    @brief comparison: less than\n    @copydoc operator<(const_reference, const_reference)\n    */\n    template<typename ScalarType, typename std::enable_if<\n                 std::is_scalar<ScalarType>::value, int>::type = 0>\n    friend bool operator<(const_reference lhs, const ScalarType rhs) noexcept\n    {\n        return lhs < basic_json(rhs);\n    }\n\n    /*!\n    @brief comparison: less than\n    @copydoc operator<(const_reference, const_reference)\n    */\n    template<typename ScalarType, typename std::enable_if<\n                 std::is_scalar<ScalarType>::value, int>::type = 0>\n    friend bool operator<(const ScalarType lhs, const_reference rhs) noexcept\n    {\n        return basic_json(lhs) < rhs;\n    }\n\n    /*!\n    @brief comparison: less than or equal\n\n    Compares whether one JSON value @a lhs is less than or equal to another\n    JSON value by calculating `not (rhs < lhs)`.\n\n    @param[in] lhs  first JSON value to consider\n    @param[in] rhs  second JSON value to consider\n    @return whether @a lhs is less than or equal to @a rhs\n\n    @complexity Linear.\n\n    @exceptionsafety No-throw guarantee: this function never throws exceptions.\n\n    @liveexample{The example demonstrates comparing several JSON\n    types.,operator__greater}\n\n    @since version 1.0.0\n    */\n    friend bool operator<=(const_reference lhs, const_reference rhs) noexcept\n    {\n        return !(rhs < lhs);\n    }\n\n    /*!\n    @brief comparison: less than or equal\n    @copydoc operator<=(const_reference, const_reference)\n    */\n    template<typename ScalarType, typename std::enable_if<\n                 std::is_scalar<ScalarType>::value, int>::type = 0>\n    friend bool operator<=(const_reference lhs, const ScalarType rhs) noexcept\n    {\n        return lhs <= basic_json(rhs);\n    }\n\n    /*!\n    @brief comparison: less than or equal\n    @copydoc operator<=(const_reference, const_reference)\n    */\n    template<typename ScalarType, typename std::enable_if<\n                 std::is_scalar<ScalarType>::value, int>::type = 0>\n    friend bool operator<=(const ScalarType lhs, const_reference rhs) noexcept\n    {\n        return basic_json(lhs) <= rhs;\n    }\n\n    /*!\n    @brief comparison: greater than\n\n    Compares whether one JSON value @a lhs is greater than another\n    JSON value by calculating `not (lhs <= rhs)`.\n\n    @param[in] lhs  first JSON value to consider\n    @param[in] rhs  second JSON value to consider\n    @return whether @a lhs is greater than to @a rhs\n\n    @complexity Linear.\n\n    @exceptionsafety No-throw guarantee: this function never throws exceptions.\n\n    @liveexample{The example demonstrates comparing several JSON\n    types.,operator__lessequal}\n\n    @since version 1.0.0\n    */\n    friend bool operator>(const_reference lhs, const_reference rhs) noexcept\n    {\n        return !(lhs <= rhs);\n    }\n\n    /*!\n    @brief comparison: greater than\n    @copydoc operator>(const_reference, const_reference)\n    */\n    template<typename ScalarType, typename std::enable_if<\n                 std::is_scalar<ScalarType>::value, int>::type = 0>\n    friend bool operator>(const_reference lhs, const ScalarType rhs) noexcept\n    {\n        return lhs > basic_json(rhs);\n    }\n\n    /*!\n    @brief comparison: greater than\n    @copydoc operator>(const_reference, const_reference)\n    */\n    template<typename ScalarType, typename std::enable_if<\n                 std::is_scalar<ScalarType>::value, int>::type = 0>\n    friend bool operator>(const ScalarType lhs, const_reference rhs) noexcept\n    {\n        return basic_json(lhs) > rhs;\n    }\n\n    /*!\n    @brief comparison: greater than or equal\n\n    Compares whether one JSON value @a lhs is greater than or equal to another\n    JSON value by calculating `not (lhs < rhs)`.\n\n    @param[in] lhs  first JSON value to consider\n    @param[in] rhs  second JSON value to consider\n    @return whether @a lhs is greater than or equal to @a rhs\n\n    @complexity Linear.\n\n    @exceptionsafety No-throw guarantee: this function never throws exceptions.\n\n    @liveexample{The example demonstrates comparing several JSON\n    types.,operator__greaterequal}\n\n    @since version 1.0.0\n    */\n    friend bool operator>=(const_reference lhs, const_reference rhs) noexcept\n    {\n        return !(lhs < rhs);\n    }\n\n    /*!\n    @brief comparison: greater than or equal\n    @copydoc operator>=(const_reference, const_reference)\n    */\n    template<typename ScalarType, typename std::enable_if<\n                 std::is_scalar<ScalarType>::value, int>::type = 0>\n    friend bool operator>=(const_reference lhs, const ScalarType rhs) noexcept\n    {\n        return lhs >= basic_json(rhs);\n    }\n\n    /*!\n    @brief comparison: greater than or equal\n    @copydoc operator>=(const_reference, const_reference)\n    */\n    template<typename ScalarType, typename std::enable_if<\n                 std::is_scalar<ScalarType>::value, int>::type = 0>\n    friend bool operator>=(const ScalarType lhs, const_reference rhs) noexcept\n    {\n        return basic_json(lhs) >= rhs;\n    }\n\n    /// @}\n\n    ///////////////////\n    // serialization //\n    ///////////////////\n\n    /// @name serialization\n    /// @{\n\n    /*!\n    @brief serialize to stream\n\n    Serialize the given JSON value @a j to the output stream @a o. The JSON\n    value will be serialized using the @ref dump member function.\n\n    - The indentation of the output can be controlled with the member variable\n      `width` of the output stream @a o. For instance, using the manipulator\n      `std::setw(4)` on @a o sets the indentation level to `4` and the\n      serialization result is the same as calling `dump(4)`.\n\n    - The indentation character can be controlled with the member variable\n      `fill` of the output stream @a o. For instance, the manipulator\n      `std::setfill('\\\\t')` sets indentation to use a tab character rather than\n      the default space character.\n\n    @param[in,out] o  stream to serialize to\n    @param[in] j  JSON value to serialize\n\n    @return the stream @a o\n\n    @throw type_error.316 if a string stored inside the JSON value is not\n                          UTF-8 encoded\n\n    @complexity Linear.\n\n    @liveexample{The example below shows the serialization with different\n    parameters to `width` to adjust the indentation level.,operator_serialize}\n\n    @since version 1.0.0; indentation character added in version 3.0.0\n    */\n    friend std::ostream& operator<<(std::ostream& o, const basic_json& j)\n    {\n        // read width member and use it as indentation parameter if nonzero\n        const bool pretty_print = o.width() > 0;\n        const auto indentation = pretty_print ? o.width() : 0;\n\n        // reset width to 0 for subsequent calls to this stream\n        o.width(0);\n\n        // do the actual serialization\n        serializer s(detail::output_adapter<char>(o), o.fill());\n        s.dump(j, pretty_print, false, static_cast<unsigned int>(indentation));\n        return o;\n    }\n\n    /*!\n    @brief serialize to stream\n    @deprecated This stream operator is deprecated and will be removed in\n                future 4.0.0 of the library. Please use\n                @ref operator<<(std::ostream&, const basic_json&)\n                instead; that is, replace calls like `j >> o;` with `o << j;`.\n    @since version 1.0.0; deprecated since version 3.0.0\n    */\n    JSON_HEDLEY_DEPRECATED_FOR(3.0.0, operator<<(std::ostream&, const basic_json&))\n    friend std::ostream& operator>>(const basic_json& j, std::ostream& o)\n    {\n        return o << j;\n    }\n\n    /// @}\n\n\n    /////////////////////\n    // deserialization //\n    /////////////////////\n\n    /// @name deserialization\n    /// @{\n\n    /*!\n    @brief deserialize from a compatible input\n\n    @tparam InputType A compatible input, for instance\n    - an std::istream object\n    - a FILE pointer\n    - a C-style array of characters\n    - a pointer to a null-terminated string of single byte characters\n    - an object obj for which begin(obj) and end(obj) produces a valid pair of\n      iterators.\n\n    @param[in] i  input to read from\n    @param[in] cb  a parser callback function of type @ref parser_callback_t\n    which is used to control the deserialization by filtering unwanted values\n    (optional)\n    @param[in] allow_exceptions  whether to throw exceptions in case of a\n    parse error (optional, true by default)\n    @param[in] ignore_comments  whether comments should be ignored and treated\n    like whitespace (true) or yield a parse error (true); (optional, false by\n    default)\n\n    @return deserialized JSON value; in case of a parse error and\n            @a allow_exceptions set to `false`, the return value will be\n            value_t::discarded.\n\n    @throw parse_error.101 if a parse error occurs; example: `\"\"unexpected end\n    of input; expected string literal\"\"`\n    @throw parse_error.102 if to_unicode fails or surrogate error\n    @throw parse_error.103 if to_unicode fails\n\n    @complexity Linear in the length of the input. The parser is a predictive\n    LL(1) parser. The complexity can be higher if the parser callback function\n    @a cb or reading from the input @a i has a super-linear complexity.\n\n    @note A UTF-8 byte order mark is silently ignored.\n\n    @liveexample{The example below demonstrates the `parse()` function reading\n    from an array.,parse__array__parser_callback_t}\n\n    @liveexample{The example below demonstrates the `parse()` function with\n    and without callback function.,parse__string__parser_callback_t}\n\n    @liveexample{The example below demonstrates the `parse()` function with\n    and without callback function.,parse__istream__parser_callback_t}\n\n    @liveexample{The example below demonstrates the `parse()` function reading\n    from a contiguous container.,parse__contiguouscontainer__parser_callback_t}\n\n    @since version 2.0.3 (contiguous containers); version 3.9.0 allowed to\n    ignore comments.\n    */\n    template<typename InputType>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json parse(InputType&& i,\n                            const parser_callback_t cb = nullptr,\n                            const bool allow_exceptions = true,\n                            const bool ignore_comments = false)\n    {\n        basic_json result;\n        parser(detail::input_adapter(std::forward<InputType>(i)), cb, allow_exceptions, ignore_comments).parse(true, result);\n        return result;\n    }\n\n    /*!\n    @brief deserialize from a pair of character iterators\n\n    The value_type of the iterator must be a integral type with size of 1, 2 or\n    4 bytes, which will be interpreted respectively as UTF-8, UTF-16 and UTF-32.\n\n    @param[in] first iterator to start of character range\n    @param[in] last  iterator to end of character range\n    @param[in] cb  a parser callback function of type @ref parser_callback_t\n    which is used to control the deserialization by filtering unwanted values\n    (optional)\n    @param[in] allow_exceptions  whether to throw exceptions in case of a\n    parse error (optional, true by default)\n    @param[in] ignore_comments  whether comments should be ignored and treated\n    like whitespace (true) or yield a parse error (true); (optional, false by\n    default)\n\n    @return deserialized JSON value; in case of a parse error and\n            @a allow_exceptions set to `false`, the return value will be\n            value_t::discarded.\n\n    @throw parse_error.101 if a parse error occurs; example: `\"\"unexpected end\n    of input; expected string literal\"\"`\n    @throw parse_error.102 if to_unicode fails or surrogate error\n    @throw parse_error.103 if to_unicode fails\n    */\n    template<typename IteratorType>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json parse(IteratorType first,\n                            IteratorType last,\n                            const parser_callback_t cb = nullptr,\n                            const bool allow_exceptions = true,\n                            const bool ignore_comments = false)\n    {\n        basic_json result;\n        parser(detail::input_adapter(std::move(first), std::move(last)), cb, allow_exceptions, ignore_comments).parse(true, result);\n        return result;\n    }\n\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    JSON_HEDLEY_DEPRECATED_FOR(3.8.0, parse(ptr, ptr + len))\n    static basic_json parse(detail::span_input_adapter&& i,\n                            const parser_callback_t cb = nullptr,\n                            const bool allow_exceptions = true,\n                            const bool ignore_comments = false)\n    {\n        basic_json result;\n        parser(i.get(), cb, allow_exceptions, ignore_comments).parse(true, result);\n        return result;\n    }\n\n    /*!\n    @brief check if the input is valid JSON\n\n    Unlike the @ref parse(InputType&&, const parser_callback_t,const bool)\n    function, this function neither throws an exception in case of invalid JSON\n    input (i.e., a parse error) nor creates diagnostic information.\n\n    @tparam InputType A compatible input, for instance\n    - an std::istream object\n    - a FILE pointer\n    - a C-style array of characters\n    - a pointer to a null-terminated string of single byte characters\n    - an object obj for which begin(obj) and end(obj) produces a valid pair of\n      iterators.\n\n    @param[in] i input to read from\n    @param[in] ignore_comments  whether comments should be ignored and treated\n    like whitespace (true) or yield a parse error (true); (optional, false by\n    default)\n\n    @return Whether the input read from @a i is valid JSON.\n\n    @complexity Linear in the length of the input. The parser is a predictive\n    LL(1) parser.\n\n    @note A UTF-8 byte order mark is silently ignored.\n\n    @liveexample{The example below demonstrates the `accept()` function reading\n    from a string.,accept__string}\n    */\n    template<typename InputType>\n    static bool accept(InputType&& i,\n                       const bool ignore_comments = false)\n    {\n        return parser(detail::input_adapter(std::forward<InputType>(i)), nullptr, false, ignore_comments).accept(true);\n    }\n\n    template<typename IteratorType>\n    static bool accept(IteratorType first, IteratorType last,\n                       const bool ignore_comments = false)\n    {\n        return parser(detail::input_adapter(std::move(first), std::move(last)), nullptr, false, ignore_comments).accept(true);\n    }\n\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    JSON_HEDLEY_DEPRECATED_FOR(3.8.0, accept(ptr, ptr + len))\n    static bool accept(detail::span_input_adapter&& i,\n                       const bool ignore_comments = false)\n    {\n        return parser(i.get(), nullptr, false, ignore_comments).accept(true);\n    }\n\n    /*!\n    @brief generate SAX events\n\n    The SAX event lister must follow the interface of @ref json_sax.\n\n    This function reads from a compatible input. Examples are:\n    - an std::istream object\n    - a FILE pointer\n    - a C-style array of characters\n    - a pointer to a null-terminated string of single byte characters\n    - an object obj for which begin(obj) and end(obj) produces a valid pair of\n      iterators.\n\n    @param[in] i  input to read from\n    @param[in,out] sax  SAX event listener\n    @param[in] format  the format to parse (JSON, CBOR, MessagePack, or UBJSON)\n    @param[in] strict  whether the input has to be consumed completely\n    @param[in] ignore_comments  whether comments should be ignored and treated\n    like whitespace (true) or yield a parse error (true); (optional, false by\n    default); only applies to the JSON file format.\n\n    @return return value of the last processed SAX event\n\n    @throw parse_error.101 if a parse error occurs; example: `\"\"unexpected end\n    of input; expected string literal\"\"`\n    @throw parse_error.102 if to_unicode fails or surrogate error\n    @throw parse_error.103 if to_unicode fails\n\n    @complexity Linear in the length of the input. The parser is a predictive\n    LL(1) parser. The complexity can be higher if the SAX consumer @a sax has\n    a super-linear complexity.\n\n    @note A UTF-8 byte order mark is silently ignored.\n\n    @liveexample{The example below demonstrates the `sax_parse()` function\n    reading from string and processing the events with a user-defined SAX\n    event consumer.,sax_parse}\n\n    @since version 3.2.0\n    */\n    template <typename InputType, typename SAX>\n    JSON_HEDLEY_NON_NULL(2)\n    static bool sax_parse(InputType&& i, SAX* sax,\n                          input_format_t format = input_format_t::json,\n                          const bool strict = true,\n                          const bool ignore_comments = false)\n    {\n        auto ia = detail::input_adapter(std::forward<InputType>(i));\n        return format == input_format_t::json\n               ? parser(std::move(ia), nullptr, true, ignore_comments).sax_parse(sax, strict)\n               : detail::binary_reader<basic_json, decltype(ia), SAX>(std::move(ia)).sax_parse(format, sax, strict);\n    }\n\n    template<class IteratorType, class SAX>\n    JSON_HEDLEY_NON_NULL(3)\n    static bool sax_parse(IteratorType first, IteratorType last, SAX* sax,\n                          input_format_t format = input_format_t::json,\n                          const bool strict = true,\n                          const bool ignore_comments = false)\n    {\n        auto ia = detail::input_adapter(std::move(first), std::move(last));\n        return format == input_format_t::json\n               ? parser(std::move(ia), nullptr, true, ignore_comments).sax_parse(sax, strict)\n               : detail::binary_reader<basic_json, decltype(ia), SAX>(std::move(ia)).sax_parse(format, sax, strict);\n    }\n\n    template <typename SAX>\n    JSON_HEDLEY_DEPRECATED_FOR(3.8.0, sax_parse(ptr, ptr + len, ...))\n    JSON_HEDLEY_NON_NULL(2)\n    static bool sax_parse(detail::span_input_adapter&& i, SAX* sax,\n                          input_format_t format = input_format_t::json,\n                          const bool strict = true,\n                          const bool ignore_comments = false)\n    {\n        auto ia = i.get();\n        return format == input_format_t::json\n               ? parser(std::move(ia), nullptr, true, ignore_comments).sax_parse(sax, strict)\n               : detail::binary_reader<basic_json, decltype(ia), SAX>(std::move(ia)).sax_parse(format, sax, strict);\n    }\n\n    /*!\n    @brief deserialize from stream\n    @deprecated This stream operator is deprecated and will be removed in\n                version 4.0.0 of the library. Please use\n                @ref operator>>(std::istream&, basic_json&)\n                instead; that is, replace calls like `j << i;` with `i >> j;`.\n    @since version 1.0.0; deprecated since version 3.0.0\n    */\n    JSON_HEDLEY_DEPRECATED_FOR(3.0.0, operator>>(std::istream&, basic_json&))\n    friend std::istream& operator<<(basic_json& j, std::istream& i)\n    {\n        return operator>>(i, j);\n    }\n\n    /*!\n    @brief deserialize from stream\n\n    Deserializes an input stream to a JSON value.\n\n    @param[in,out] i  input stream to read a serialized JSON value from\n    @param[in,out] j  JSON value to write the deserialized input to\n\n    @throw parse_error.101 in case of an unexpected token\n    @throw parse_error.102 if to_unicode fails or surrogate error\n    @throw parse_error.103 if to_unicode fails\n\n    @complexity Linear in the length of the input. The parser is a predictive\n    LL(1) parser.\n\n    @note A UTF-8 byte order mark is silently ignored.\n\n    @liveexample{The example below shows how a JSON value is constructed by\n    reading a serialization from a stream.,operator_deserialize}\n\n    @sa parse(std::istream&, const parser_callback_t) for a variant with a\n    parser callback function to filter values while parsing\n\n    @since version 1.0.0\n    */\n    friend std::istream& operator>>(std::istream& i, basic_json& j)\n    {\n        parser(detail::input_adapter(i)).parse(false, j);\n        return i;\n    }\n\n    /// @}\n\n    ///////////////////////////\n    // convenience functions //\n    ///////////////////////////\n\n    /*!\n    @brief return the type as string\n\n    Returns the type name as string to be used in error messages - usually to\n    indicate that a function was called on a wrong JSON type.\n\n    @return a string representation of a the @a m_type member:\n            Value type  | return value\n            ----------- | -------------\n            null        | `\"null\"`\n            boolean     | `\"boolean\"`\n            string      | `\"string\"`\n            number      | `\"number\"` (for all number types)\n            object      | `\"object\"`\n            array       | `\"array\"`\n            binary      | `\"binary\"`\n            discarded   | `\"discarded\"`\n\n    @exceptionsafety No-throw guarantee: this function never throws exceptions.\n\n    @complexity Constant.\n\n    @liveexample{The following code exemplifies `type_name()` for all JSON\n    types.,type_name}\n\n    @sa @ref type() -- return the type of the JSON value\n    @sa @ref operator value_t() -- return the type of the JSON value (implicit)\n\n    @since version 1.0.0, public since 2.1.0, `const char*` and `noexcept`\n    since 3.0.0\n    */\n    JSON_HEDLEY_RETURNS_NON_NULL\n    const char* type_name() const noexcept\n    {\n        {\n            switch (m_type)\n            {\n                case value_t::null:\n                    return \"null\";\n                case value_t::object:\n                    return \"object\";\n                case value_t::array:\n                    return \"array\";\n                case value_t::string:\n                    return \"string\";\n                case value_t::boolean:\n                    return \"boolean\";\n                case value_t::binary:\n                    return \"binary\";\n                case value_t::discarded:\n                    return \"discarded\";\n                default:\n                    return \"number\";\n            }\n        }\n    }\n\n\n  private:\n    //////////////////////\n    // member variables //\n    //////////////////////\n\n    /// the type of the current element\n    value_t m_type = value_t::null;\n\n    /// the value of the current element\n    json_value m_value = {};\n\n    //////////////////////////////////////////\n    // binary serialization/deserialization //\n    //////////////////////////////////////////\n\n    /// @name binary serialization/deserialization support\n    /// @{\n\n  public:\n    /*!\n    @brief create a CBOR serialization of a given JSON value\n\n    Serializes a given JSON value @a j to a byte vector using the CBOR (Concise\n    Binary Object Representation) serialization format. CBOR is a binary\n    serialization format which aims to be more compact than JSON itself, yet\n    more efficient to parse.\n\n    The library uses the following mapping from JSON values types to\n    CBOR types according to the CBOR specification (RFC 7049):\n\n    JSON value type | value/range                                | CBOR type                          | first byte\n    --------------- | ------------------------------------------ | ---------------------------------- | ---------------\n    null            | `null`                                     | Null                               | 0xF6\n    boolean         | `true`                                     | True                               | 0xF5\n    boolean         | `false`                                    | False                              | 0xF4\n    number_integer  | -9223372036854775808..-2147483649          | Negative integer (8 bytes follow)  | 0x3B\n    number_integer  | -2147483648..-32769                        | Negative integer (4 bytes follow)  | 0x3A\n    number_integer  | -32768..-129                               | Negative integer (2 bytes follow)  | 0x39\n    number_integer  | -128..-25                                  | Negative integer (1 byte follow)   | 0x38\n    number_integer  | -24..-1                                    | Negative integer                   | 0x20..0x37\n    number_integer  | 0..23                                      | Integer                            | 0x00..0x17\n    number_integer  | 24..255                                    | Unsigned integer (1 byte follow)   | 0x18\n    number_integer  | 256..65535                                 | Unsigned integer (2 bytes follow)  | 0x19\n    number_integer  | 65536..4294967295                          | Unsigned integer (4 bytes follow)  | 0x1A\n    number_integer  | 4294967296..18446744073709551615           | Unsigned integer (8 bytes follow)  | 0x1B\n    number_unsigned | 0..23                                      | Integer                            | 0x00..0x17\n    number_unsigned | 24..255                                    | Unsigned integer (1 byte follow)   | 0x18\n    number_unsigned | 256..65535                                 | Unsigned integer (2 bytes follow)  | 0x19\n    number_unsigned | 65536..4294967295                          | Unsigned integer (4 bytes follow)  | 0x1A\n    number_unsigned | 4294967296..18446744073709551615           | Unsigned integer (8 bytes follow)  | 0x1B\n    number_float    | *any value representable by a float*       | Single-Precision Float             | 0xFA\n    number_float    | *any value NOT representable by a float*   | Double-Precision Float             | 0xFB\n    string          | *length*: 0..23                            | UTF-8 string                       | 0x60..0x77\n    string          | *length*: 23..255                          | UTF-8 string (1 byte follow)       | 0x78\n    string          | *length*: 256..65535                       | UTF-8 string (2 bytes follow)      | 0x79\n    string          | *length*: 65536..4294967295                | UTF-8 string (4 bytes follow)      | 0x7A\n    string          | *length*: 4294967296..18446744073709551615 | UTF-8 string (8 bytes follow)      | 0x7B\n    array           | *size*: 0..23                              | array                              | 0x80..0x97\n    array           | *size*: 23..255                            | array (1 byte follow)              | 0x98\n    array           | *size*: 256..65535                         | array (2 bytes follow)             | 0x99\n    array           | *size*: 65536..4294967295                  | array (4 bytes follow)             | 0x9A\n    array           | *size*: 4294967296..18446744073709551615   | array (8 bytes follow)             | 0x9B\n    object          | *size*: 0..23                              | map                                | 0xA0..0xB7\n    object          | *size*: 23..255                            | map (1 byte follow)                | 0xB8\n    object          | *size*: 256..65535                         | map (2 bytes follow)               | 0xB9\n    object          | *size*: 65536..4294967295                  | map (4 bytes follow)               | 0xBA\n    object          | *size*: 4294967296..18446744073709551615   | map (8 bytes follow)               | 0xBB\n    binary          | *size*: 0..23                              | byte string                        | 0x40..0x57\n    binary          | *size*: 23..255                            | byte string (1 byte follow)        | 0x58\n    binary          | *size*: 256..65535                         | byte string (2 bytes follow)       | 0x59\n    binary          | *size*: 65536..4294967295                  | byte string (4 bytes follow)       | 0x5A\n    binary          | *size*: 4294967296..18446744073709551615   | byte string (8 bytes follow)       | 0x5B\n\n    @note The mapping is **complete** in the sense that any JSON value type\n          can be converted to a CBOR value.\n\n    @note If NaN or Infinity are stored inside a JSON number, they are\n          serialized properly. This behavior differs from the @ref dump()\n          function which serializes NaN or Infinity to `null`.\n\n    @note The following CBOR types are not used in the conversion:\n          - UTF-8 strings terminated by \"break\" (0x7F)\n          - arrays terminated by \"break\" (0x9F)\n          - maps terminated by \"break\" (0xBF)\n          - byte strings terminated by \"break\" (0x5F)\n          - date/time (0xC0..0xC1)\n          - bignum (0xC2..0xC3)\n          - decimal fraction (0xC4)\n          - bigfloat (0xC5)\n          - expected conversions (0xD5..0xD7)\n          - simple values (0xE0..0xF3, 0xF8)\n          - undefined (0xF7)\n          - half-precision floats (0xF9)\n          - break (0xFF)\n\n    @param[in] j  JSON value to serialize\n    @return CBOR serialization as byte vector\n\n    @complexity Linear in the size of the JSON value @a j.\n\n    @liveexample{The example shows the serialization of a JSON value to a byte\n    vector in CBOR format.,to_cbor}\n\n    @sa http://cbor.io\n    @sa @ref from_cbor(detail::input_adapter&&, const bool, const bool, const cbor_tag_handler_t) for the\n        analogous deserialization\n    @sa @ref to_msgpack(const basic_json&) for the related MessagePack format\n    @sa @ref to_ubjson(const basic_json&, const bool, const bool) for the\n             related UBJSON format\n\n    @since version 2.0.9; compact representation of floating-point numbers\n           since version 3.8.0\n    */\n    static std::vector<uint8_t> to_cbor(const basic_json& j)\n    {\n        std::vector<uint8_t> result;\n        to_cbor(j, result);\n        return result;\n    }\n\n    static void to_cbor(const basic_json& j, detail::output_adapter<uint8_t> o)\n    {\n        binary_writer<uint8_t>(o).write_cbor(j);\n    }\n\n    static void to_cbor(const basic_json& j, detail::output_adapter<char> o)\n    {\n        binary_writer<char>(o).write_cbor(j);\n    }\n\n    /*!\n    @brief create a MessagePack serialization of a given JSON value\n\n    Serializes a given JSON value @a j to a byte vector using the MessagePack\n    serialization format. MessagePack is a binary serialization format which\n    aims to be more compact than JSON itself, yet more efficient to parse.\n\n    The library uses the following mapping from JSON values types to\n    MessagePack types according to the MessagePack specification:\n\n    JSON value type | value/range                       | MessagePack type | first byte\n    --------------- | --------------------------------- | ---------------- | ----------\n    null            | `null`                            | nil              | 0xC0\n    boolean         | `true`                            | true             | 0xC3\n    boolean         | `false`                           | false            | 0xC2\n    number_integer  | -9223372036854775808..-2147483649 | int64            | 0xD3\n    number_integer  | -2147483648..-32769               | int32            | 0xD2\n    number_integer  | -32768..-129                      | int16            | 0xD1\n    number_integer  | -128..-33                         | int8             | 0xD0\n    number_integer  | -32..-1                           | negative fixint  | 0xE0..0xFF\n    number_integer  | 0..127                            | positive fixint  | 0x00..0x7F\n    number_integer  | 128..255                          | uint 8           | 0xCC\n    number_integer  | 256..65535                        | uint 16          | 0xCD\n    number_integer  | 65536..4294967295                 | uint 32          | 0xCE\n    number_integer  | 4294967296..18446744073709551615  | uint 64          | 0xCF\n    number_unsigned | 0..127                            | positive fixint  | 0x00..0x7F\n    number_unsigned | 128..255                          | uint 8           | 0xCC\n    number_unsigned | 256..65535                        | uint 16          | 0xCD\n    number_unsigned | 65536..4294967295                 | uint 32          | 0xCE\n    number_unsigned | 4294967296..18446744073709551615  | uint 64          | 0xCF\n    number_float    | *any value representable by a float*     | float 32 | 0xCA\n    number_float    | *any value NOT representable by a float* | float 64 | 0xCB\n    string          | *length*: 0..31                   | fixstr           | 0xA0..0xBF\n    string          | *length*: 32..255                 | str 8            | 0xD9\n    string          | *length*: 256..65535              | str 16           | 0xDA\n    string          | *length*: 65536..4294967295       | str 32           | 0xDB\n    array           | *size*: 0..15                     | fixarray         | 0x90..0x9F\n    array           | *size*: 16..65535                 | array 16         | 0xDC\n    array           | *size*: 65536..4294967295         | array 32         | 0xDD\n    object          | *size*: 0..15                     | fix map          | 0x80..0x8F\n    object          | *size*: 16..65535                 | map 16           | 0xDE\n    object          | *size*: 65536..4294967295         | map 32           | 0xDF\n    binary          | *size*: 0..255                    | bin 8            | 0xC4\n    binary          | *size*: 256..65535                | bin 16           | 0xC5\n    binary          | *size*: 65536..4294967295         | bin 32           | 0xC6\n\n    @note The mapping is **complete** in the sense that any JSON value type\n          can be converted to a MessagePack value.\n\n    @note The following values can **not** be converted to a MessagePack value:\n          - strings with more than 4294967295 bytes\n          - byte strings with more than 4294967295 bytes\n          - arrays with more than 4294967295 elements\n          - objects with more than 4294967295 elements\n\n    @note Any MessagePack output created @ref to_msgpack can be successfully\n          parsed by @ref from_msgpack.\n\n    @note If NaN or Infinity are stored inside a JSON number, they are\n          serialized properly. This behavior differs from the @ref dump()\n          function which serializes NaN or Infinity to `null`.\n\n    @param[in] j  JSON value to serialize\n    @return MessagePack serialization as byte vector\n\n    @complexity Linear in the size of the JSON value @a j.\n\n    @liveexample{The example shows the serialization of a JSON value to a byte\n    vector in MessagePack format.,to_msgpack}\n\n    @sa http://msgpack.org\n    @sa @ref from_msgpack for the analogous deserialization\n    @sa @ref to_cbor(const basic_json& for the related CBOR format\n    @sa @ref to_ubjson(const basic_json&, const bool, const bool) for the\n             related UBJSON format\n\n    @since version 2.0.9\n    */\n    static std::vector<uint8_t> to_msgpack(const basic_json& j)\n    {\n        std::vector<uint8_t> result;\n        to_msgpack(j, result);\n        return result;\n    }\n\n    static void to_msgpack(const basic_json& j, detail::output_adapter<uint8_t> o)\n    {\n        binary_writer<uint8_t>(o).write_msgpack(j);\n    }\n\n    static void to_msgpack(const basic_json& j, detail::output_adapter<char> o)\n    {\n        binary_writer<char>(o).write_msgpack(j);\n    }\n\n    /*!\n    @brief create a UBJSON serialization of a given JSON value\n\n    Serializes a given JSON value @a j to a byte vector using the UBJSON\n    (Universal Binary JSON) serialization format. UBJSON aims to be more compact\n    than JSON itself, yet more efficient to parse.\n\n    The library uses the following mapping from JSON values types to\n    UBJSON types according to the UBJSON specification:\n\n    JSON value type | value/range                       | UBJSON type | marker\n    --------------- | --------------------------------- | ----------- | ------\n    null            | `null`                            | null        | `Z`\n    boolean         | `true`                            | true        | `T`\n    boolean         | `false`                           | false       | `F`\n    number_integer  | -9223372036854775808..-2147483649 | int64       | `L`\n    number_integer  | -2147483648..-32769               | int32       | `l`\n    number_integer  | -32768..-129                      | int16       | `I`\n    number_integer  | -128..127                         | int8        | `i`\n    number_integer  | 128..255                          | uint8       | `U`\n    number_integer  | 256..32767                        | int16       | `I`\n    number_integer  | 32768..2147483647                 | int32       | `l`\n    number_integer  | 2147483648..9223372036854775807   | int64       | `L`\n    number_unsigned | 0..127                            | int8        | `i`\n    number_unsigned | 128..255                          | uint8       | `U`\n    number_unsigned | 256..32767                        | int16       | `I`\n    number_unsigned | 32768..2147483647                 | int32       | `l`\n    number_unsigned | 2147483648..9223372036854775807   | int64       | `L`\n    number_unsigned | 2147483649..18446744073709551615  | high-precision | `H`\n    number_float    | *any value*                       | float64     | `D`\n    string          | *with shortest length indicator*  | string      | `S`\n    array           | *see notes on optimized format*   | array       | `[`\n    object          | *see notes on optimized format*   | map         | `{`\n\n    @note The mapping is **complete** in the sense that any JSON value type\n          can be converted to a UBJSON value.\n\n    @note The following values can **not** be converted to a UBJSON value:\n          - strings with more than 9223372036854775807 bytes (theoretical)\n\n    @note The following markers are not used in the conversion:\n          - `Z`: no-op values are not created.\n          - `C`: single-byte strings are serialized with `S` markers.\n\n    @note Any UBJSON output created @ref to_ubjson can be successfully parsed\n          by @ref from_ubjson.\n\n    @note If NaN or Infinity are stored inside a JSON number, they are\n          serialized properly. This behavior differs from the @ref dump()\n          function which serializes NaN or Infinity to `null`.\n\n    @note The optimized formats for containers are supported: Parameter\n          @a use_size adds size information to the beginning of a container and\n          removes the closing marker. Parameter @a use_type further checks\n          whether all elements of a container have the same type and adds the\n          type marker to the beginning of the container. The @a use_type\n          parameter must only be used together with @a use_size = true. Note\n          that @a use_size = true alone may result in larger representations -\n          the benefit of this parameter is that the receiving side is\n          immediately informed on the number of elements of the container.\n\n    @note If the JSON data contains the binary type, the value stored is a list\n          of integers, as suggested by the UBJSON documentation.  In particular,\n          this means that serialization and the deserialization of a JSON\n          containing binary values into UBJSON and back will result in a\n          different JSON object.\n\n    @param[in] j  JSON value to serialize\n    @param[in] use_size  whether to add size annotations to container types\n    @param[in] use_type  whether to add type annotations to container types\n                         (must be combined with @a use_size = true)\n    @return UBJSON serialization as byte vector\n\n    @complexity Linear in the size of the JSON value @a j.\n\n    @liveexample{The example shows the serialization of a JSON value to a byte\n    vector in UBJSON format.,to_ubjson}\n\n    @sa http://ubjson.org\n    @sa @ref from_ubjson(detail::input_adapter&&, const bool, const bool) for the\n        analogous deserialization\n    @sa @ref to_cbor(const basic_json& for the related CBOR format\n    @sa @ref to_msgpack(const basic_json&) for the related MessagePack format\n\n    @since version 3.1.0\n    */\n    static std::vector<uint8_t> to_ubjson(const basic_json& j,\n                                          const bool use_size = false,\n                                          const bool use_type = false)\n    {\n        std::vector<uint8_t> result;\n        to_ubjson(j, result, use_size, use_type);\n        return result;\n    }\n\n    static void to_ubjson(const basic_json& j, detail::output_adapter<uint8_t> o,\n                          const bool use_size = false, const bool use_type = false)\n    {\n        binary_writer<uint8_t>(o).write_ubjson(j, use_size, use_type);\n    }\n\n    static void to_ubjson(const basic_json& j, detail::output_adapter<char> o,\n                          const bool use_size = false, const bool use_type = false)\n    {\n        binary_writer<char>(o).write_ubjson(j, use_size, use_type);\n    }\n\n\n    /*!\n    @brief Serializes the given JSON object `j` to BSON and returns a vector\n           containing the corresponding BSON-representation.\n\n    BSON (Binary JSON) is a binary format in which zero or more ordered key/value pairs are\n    stored as a single entity (a so-called document).\n\n    The library uses the following mapping from JSON values types to BSON types:\n\n    JSON value type | value/range                       | BSON type   | marker\n    --------------- | --------------------------------- | ----------- | ------\n    null            | `null`                            | null        | 0x0A\n    boolean         | `true`, `false`                   | boolean     | 0x08\n    number_integer  | -9223372036854775808..-2147483649 | int64       | 0x12\n    number_integer  | -2147483648..2147483647           | int32       | 0x10\n    number_integer  | 2147483648..9223372036854775807   | int64       | 0x12\n    number_unsigned | 0..2147483647                     | int32       | 0x10\n    number_unsigned | 2147483648..9223372036854775807   | int64       | 0x12\n    number_unsigned | 9223372036854775808..18446744073709551615| --   | --\n    number_float    | *any value*                       | double      | 0x01\n    string          | *any value*                       | string      | 0x02\n    array           | *any value*                       | document    | 0x04\n    object          | *any value*                       | document    | 0x03\n    binary          | *any value*                       | binary      | 0x05\n\n    @warning The mapping is **incomplete**, since only JSON-objects (and things\n    contained therein) can be serialized to BSON.\n    Also, integers larger than 9223372036854775807 cannot be serialized to BSON,\n    and the keys may not contain U+0000, since they are serialized a\n    zero-terminated c-strings.\n\n    @throw out_of_range.407  if `j.is_number_unsigned() && j.get<std::uint64_t>() > 9223372036854775807`\n    @throw out_of_range.409  if a key in `j` contains a NULL (U+0000)\n    @throw type_error.317    if `!j.is_object()`\n\n    @pre The input `j` is required to be an object: `j.is_object() == true`.\n\n    @note Any BSON output created via @ref to_bson can be successfully parsed\n          by @ref from_bson.\n\n    @param[in] j  JSON value to serialize\n    @return BSON serialization as byte vector\n\n    @complexity Linear in the size of the JSON value @a j.\n\n    @liveexample{The example shows the serialization of a JSON value to a byte\n    vector in BSON format.,to_bson}\n\n    @sa http://bsonspec.org/spec.html\n    @sa @ref from_bson(detail::input_adapter&&, const bool strict) for the\n        analogous deserialization\n    @sa @ref to_ubjson(const basic_json&, const bool, const bool) for the\n             related UBJSON format\n    @sa @ref to_cbor(const basic_json&) for the related CBOR format\n    @sa @ref to_msgpack(const basic_json&) for the related MessagePack format\n    */\n    static std::vector<uint8_t> to_bson(const basic_json& j)\n    {\n        std::vector<uint8_t> result;\n        to_bson(j, result);\n        return result;\n    }\n\n    /*!\n    @brief Serializes the given JSON object `j` to BSON and forwards the\n           corresponding BSON-representation to the given output_adapter `o`.\n    @param j The JSON object to convert to BSON.\n    @param o The output adapter that receives the binary BSON representation.\n    @pre The input `j` shall be an object: `j.is_object() == true`\n    @sa @ref to_bson(const basic_json&)\n    */\n    static void to_bson(const basic_json& j, detail::output_adapter<uint8_t> o)\n    {\n        binary_writer<uint8_t>(o).write_bson(j);\n    }\n\n    /*!\n    @copydoc to_bson(const basic_json&, detail::output_adapter<uint8_t>)\n    */\n    static void to_bson(const basic_json& j, detail::output_adapter<char> o)\n    {\n        binary_writer<char>(o).write_bson(j);\n    }\n\n\n    /*!\n    @brief create a JSON value from an input in CBOR format\n\n    Deserializes a given input @a i to a JSON value using the CBOR (Concise\n    Binary Object Representation) serialization format.\n\n    The library maps CBOR types to JSON value types as follows:\n\n    CBOR type              | JSON value type | first byte\n    ---------------------- | --------------- | ----------\n    Integer                | number_unsigned | 0x00..0x17\n    Unsigned integer       | number_unsigned | 0x18\n    Unsigned integer       | number_unsigned | 0x19\n    Unsigned integer       | number_unsigned | 0x1A\n    Unsigned integer       | number_unsigned | 0x1B\n    Negative integer       | number_integer  | 0x20..0x37\n    Negative integer       | number_integer  | 0x38\n    Negative integer       | number_integer  | 0x39\n    Negative integer       | number_integer  | 0x3A\n    Negative integer       | number_integer  | 0x3B\n    Byte string            | binary          | 0x40..0x57\n    Byte string            | binary          | 0x58\n    Byte string            | binary          | 0x59\n    Byte string            | binary          | 0x5A\n    Byte string            | binary          | 0x5B\n    UTF-8 string           | string          | 0x60..0x77\n    UTF-8 string           | string          | 0x78\n    UTF-8 string           | string          | 0x79\n    UTF-8 string           | string          | 0x7A\n    UTF-8 string           | string          | 0x7B\n    UTF-8 string           | string          | 0x7F\n    array                  | array           | 0x80..0x97\n    array                  | array           | 0x98\n    array                  | array           | 0x99\n    array                  | array           | 0x9A\n    array                  | array           | 0x9B\n    array                  | array           | 0x9F\n    map                    | object          | 0xA0..0xB7\n    map                    | object          | 0xB8\n    map                    | object          | 0xB9\n    map                    | object          | 0xBA\n    map                    | object          | 0xBB\n    map                    | object          | 0xBF\n    False                  | `false`         | 0xF4\n    True                   | `true`          | 0xF5\n    Null                   | `null`          | 0xF6\n    Half-Precision Float   | number_float    | 0xF9\n    Single-Precision Float | number_float    | 0xFA\n    Double-Precision Float | number_float    | 0xFB\n\n    @warning The mapping is **incomplete** in the sense that not all CBOR\n             types can be converted to a JSON value. The following CBOR types\n             are not supported and will yield parse errors (parse_error.112):\n             - date/time (0xC0..0xC1)\n             - bignum (0xC2..0xC3)\n             - decimal fraction (0xC4)\n             - bigfloat (0xC5)\n             - expected conversions (0xD5..0xD7)\n             - simple values (0xE0..0xF3, 0xF8)\n             - undefined (0xF7)\n\n    @warning CBOR allows map keys of any type, whereas JSON only allows\n             strings as keys in object values. Therefore, CBOR maps with keys\n             other than UTF-8 strings are rejected (parse_error.113).\n\n    @note Any CBOR output created @ref to_cbor can be successfully parsed by\n          @ref from_cbor.\n\n    @param[in] i  an input in CBOR format convertible to an input adapter\n    @param[in] strict  whether to expect the input to be consumed until EOF\n                       (true by default)\n    @param[in] allow_exceptions  whether to throw exceptions in case of a\n    parse error (optional, true by default)\n    @param[in] tag_handler how to treat CBOR tags (optional, error by default)\n\n    @return deserialized JSON value; in case of a parse error and\n            @a allow_exceptions set to `false`, the return value will be\n            value_t::discarded.\n\n    @throw parse_error.110 if the given input ends prematurely or the end of\n    file was not reached when @a strict was set to true\n    @throw parse_error.112 if unsupported features from CBOR were\n    used in the given input @a v or if the input is not valid CBOR\n    @throw parse_error.113 if a string was expected as map key, but not found\n\n    @complexity Linear in the size of the input @a i.\n\n    @liveexample{The example shows the deserialization of a byte vector in CBOR\n    format to a JSON value.,from_cbor}\n\n    @sa http://cbor.io\n    @sa @ref to_cbor(const basic_json&) for the analogous serialization\n    @sa @ref from_msgpack(detail::input_adapter&&, const bool, const bool) for the\n        related MessagePack format\n    @sa @ref from_ubjson(detail::input_adapter&&, const bool, const bool) for the\n        related UBJSON format\n\n    @since version 2.0.9; parameter @a start_index since 2.1.1; changed to\n           consume input adapters, removed start_index parameter, and added\n           @a strict parameter since 3.0.0; added @a allow_exceptions parameter\n           since 3.2.0; added @a tag_handler parameter since 3.9.0.\n    */\n    template<typename InputType>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json from_cbor(InputType&& i,\n                                const bool strict = true,\n                                const bool allow_exceptions = true,\n                                const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error)\n    {\n        basic_json result;\n        detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);\n        auto ia = detail::input_adapter(std::forward<InputType>(i));\n        const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler);\n        return res ? result : basic_json(value_t::discarded);\n    }\n\n    /*!\n    @copydoc from_cbor(detail::input_adapter&&, const bool, const bool, const cbor_tag_handler_t)\n    */\n    template<typename IteratorType>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json from_cbor(IteratorType first, IteratorType last,\n                                const bool strict = true,\n                                const bool allow_exceptions = true,\n                                const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error)\n    {\n        basic_json result;\n        detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);\n        auto ia = detail::input_adapter(std::move(first), std::move(last));\n        const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler);\n        return res ? result : basic_json(value_t::discarded);\n    }\n\n    template<typename T>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_cbor(ptr, ptr + len))\n    static basic_json from_cbor(const T* ptr, std::size_t len,\n                                const bool strict = true,\n                                const bool allow_exceptions = true,\n                                const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error)\n    {\n        return from_cbor(ptr, ptr + len, strict, allow_exceptions, tag_handler);\n    }\n\n\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_cbor(ptr, ptr + len))\n    static basic_json from_cbor(detail::span_input_adapter&& i,\n                                const bool strict = true,\n                                const bool allow_exceptions = true,\n                                const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error)\n    {\n        basic_json result;\n        detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);\n        auto ia = i.get();\n        const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler);\n        return res ? result : basic_json(value_t::discarded);\n    }\n\n    /*!\n    @brief create a JSON value from an input in MessagePack format\n\n    Deserializes a given input @a i to a JSON value using the MessagePack\n    serialization format.\n\n    The library maps MessagePack types to JSON value types as follows:\n\n    MessagePack type | JSON value type | first byte\n    ---------------- | --------------- | ----------\n    positive fixint  | number_unsigned | 0x00..0x7F\n    fixmap           | object          | 0x80..0x8F\n    fixarray         | array           | 0x90..0x9F\n    fixstr           | string          | 0xA0..0xBF\n    nil              | `null`          | 0xC0\n    false            | `false`         | 0xC2\n    true             | `true`          | 0xC3\n    float 32         | number_float    | 0xCA\n    float 64         | number_float    | 0xCB\n    uint 8           | number_unsigned | 0xCC\n    uint 16          | number_unsigned | 0xCD\n    uint 32          | number_unsigned | 0xCE\n    uint 64          | number_unsigned | 0xCF\n    int 8            | number_integer  | 0xD0\n    int 16           | number_integer  | 0xD1\n    int 32           | number_integer  | 0xD2\n    int 64           | number_integer  | 0xD3\n    str 8            | string          | 0xD9\n    str 16           | string          | 0xDA\n    str 32           | string          | 0xDB\n    array 16         | array           | 0xDC\n    array 32         | array           | 0xDD\n    map 16           | object          | 0xDE\n    map 32           | object          | 0xDF\n    bin 8            | binary          | 0xC4\n    bin 16           | binary          | 0xC5\n    bin 32           | binary          | 0xC6\n    ext 8            | binary          | 0xC7\n    ext 16           | binary          | 0xC8\n    ext 32           | binary          | 0xC9\n    fixext 1         | binary          | 0xD4\n    fixext 2         | binary          | 0xD5\n    fixext 4         | binary          | 0xD6\n    fixext 8         | binary          | 0xD7\n    fixext 16        | binary          | 0xD8\n    negative fixint  | number_integer  | 0xE0-0xFF\n\n    @note Any MessagePack output created @ref to_msgpack can be successfully\n          parsed by @ref from_msgpack.\n\n    @param[in] i  an input in MessagePack format convertible to an input\n                  adapter\n    @param[in] strict  whether to expect the input to be consumed until EOF\n                       (true by default)\n    @param[in] allow_exceptions  whether to throw exceptions in case of a\n    parse error (optional, true by default)\n\n    @return deserialized JSON value; in case of a parse error and\n            @a allow_exceptions set to `false`, the return value will be\n            value_t::discarded.\n\n    @throw parse_error.110 if the given input ends prematurely or the end of\n    file was not reached when @a strict was set to true\n    @throw parse_error.112 if unsupported features from MessagePack were\n    used in the given input @a i or if the input is not valid MessagePack\n    @throw parse_error.113 if a string was expected as map key, but not found\n\n    @complexity Linear in the size of the input @a i.\n\n    @liveexample{The example shows the deserialization of a byte vector in\n    MessagePack format to a JSON value.,from_msgpack}\n\n    @sa http://msgpack.org\n    @sa @ref to_msgpack(const basic_json&) for the analogous serialization\n    @sa @ref from_cbor(detail::input_adapter&&, const bool, const bool, const cbor_tag_handler_t) for the\n        related CBOR format\n    @sa @ref from_ubjson(detail::input_adapter&&, const bool, const bool) for\n        the related UBJSON format\n    @sa @ref from_bson(detail::input_adapter&&, const bool, const bool) for\n        the related BSON format\n\n    @since version 2.0.9; parameter @a start_index since 2.1.1; changed to\n           consume input adapters, removed start_index parameter, and added\n           @a strict parameter since 3.0.0; added @a allow_exceptions parameter\n           since 3.2.0\n    */\n    template<typename InputType>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json from_msgpack(InputType&& i,\n                                   const bool strict = true,\n                                   const bool allow_exceptions = true)\n    {\n        basic_json result;\n        detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);\n        auto ia = detail::input_adapter(std::forward<InputType>(i));\n        const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::msgpack, &sdp, strict);\n        return res ? result : basic_json(value_t::discarded);\n    }\n\n    /*!\n    @copydoc from_msgpack(detail::input_adapter&&, const bool, const bool)\n    */\n    template<typename IteratorType>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json from_msgpack(IteratorType first, IteratorType last,\n                                   const bool strict = true,\n                                   const bool allow_exceptions = true)\n    {\n        basic_json result;\n        detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);\n        auto ia = detail::input_adapter(std::move(first), std::move(last));\n        const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::msgpack, &sdp, strict);\n        return res ? result : basic_json(value_t::discarded);\n    }\n\n\n    template<typename T>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_msgpack(ptr, ptr + len))\n    static basic_json from_msgpack(const T* ptr, std::size_t len,\n                                   const bool strict = true,\n                                   const bool allow_exceptions = true)\n    {\n        return from_msgpack(ptr, ptr + len, strict, allow_exceptions);\n    }\n\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_msgpack(ptr, ptr + len))\n    static basic_json from_msgpack(detail::span_input_adapter&& i,\n                                   const bool strict = true,\n                                   const bool allow_exceptions = true)\n    {\n        basic_json result;\n        detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);\n        auto ia = i.get();\n        const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::msgpack, &sdp, strict);\n        return res ? result : basic_json(value_t::discarded);\n    }\n\n\n    /*!\n    @brief create a JSON value from an input in UBJSON format\n\n    Deserializes a given input @a i to a JSON value using the UBJSON (Universal\n    Binary JSON) serialization format.\n\n    The library maps UBJSON types to JSON value types as follows:\n\n    UBJSON type | JSON value type                         | marker\n    ----------- | --------------------------------------- | ------\n    no-op       | *no value, next value is read*          | `N`\n    null        | `null`                                  | `Z`\n    false       | `false`                                 | `F`\n    true        | `true`                                  | `T`\n    float32     | number_float                            | `d`\n    float64     | number_float                            | `D`\n    uint8       | number_unsigned                         | `U`\n    int8        | number_integer                          | `i`\n    int16       | number_integer                          | `I`\n    int32       | number_integer                          | `l`\n    int64       | number_integer                          | `L`\n    high-precision number | number_integer, number_unsigned, or number_float - depends on number string | 'H'\n    string      | string                                  | `S`\n    char        | string                                  | `C`\n    array       | array (optimized values are supported)  | `[`\n    object      | object (optimized values are supported) | `{`\n\n    @note The mapping is **complete** in the sense that any UBJSON value can\n          be converted to a JSON value.\n\n    @param[in] i  an input in UBJSON format convertible to an input adapter\n    @param[in] strict  whether to expect the input to be consumed until EOF\n                       (true by default)\n    @param[in] allow_exceptions  whether to throw exceptions in case of a\n    parse error (optional, true by default)\n\n    @return deserialized JSON value; in case of a parse error and\n            @a allow_exceptions set to `false`, the return value will be\n            value_t::discarded.\n\n    @throw parse_error.110 if the given input ends prematurely or the end of\n    file was not reached when @a strict was set to true\n    @throw parse_error.112 if a parse error occurs\n    @throw parse_error.113 if a string could not be parsed successfully\n\n    @complexity Linear in the size of the input @a i.\n\n    @liveexample{The example shows the deserialization of a byte vector in\n    UBJSON format to a JSON value.,from_ubjson}\n\n    @sa http://ubjson.org\n    @sa @ref to_ubjson(const basic_json&, const bool, const bool) for the\n             analogous serialization\n    @sa @ref from_cbor(detail::input_adapter&&, const bool, const bool, const cbor_tag_handler_t) for the\n        related CBOR format\n    @sa @ref from_msgpack(detail::input_adapter&&, const bool, const bool) for\n        the related MessagePack format\n    @sa @ref from_bson(detail::input_adapter&&, const bool, const bool) for\n        the related BSON format\n\n    @since version 3.1.0; added @a allow_exceptions parameter since 3.2.0\n    */\n    template<typename InputType>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json from_ubjson(InputType&& i,\n                                  const bool strict = true,\n                                  const bool allow_exceptions = true)\n    {\n        basic_json result;\n        detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);\n        auto ia = detail::input_adapter(std::forward<InputType>(i));\n        const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::ubjson, &sdp, strict);\n        return res ? result : basic_json(value_t::discarded);\n    }\n\n    /*!\n    @copydoc from_ubjson(detail::input_adapter&&, const bool, const bool)\n    */\n    template<typename IteratorType>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json from_ubjson(IteratorType first, IteratorType last,\n                                  const bool strict = true,\n                                  const bool allow_exceptions = true)\n    {\n        basic_json result;\n        detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);\n        auto ia = detail::input_adapter(std::move(first), std::move(last));\n        const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::ubjson, &sdp, strict);\n        return res ? result : basic_json(value_t::discarded);\n    }\n\n    template<typename T>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_ubjson(ptr, ptr + len))\n    static basic_json from_ubjson(const T* ptr, std::size_t len,\n                                  const bool strict = true,\n                                  const bool allow_exceptions = true)\n    {\n        return from_ubjson(ptr, ptr + len, strict, allow_exceptions);\n    }\n\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_ubjson(ptr, ptr + len))\n    static basic_json from_ubjson(detail::span_input_adapter&& i,\n                                  const bool strict = true,\n                                  const bool allow_exceptions = true)\n    {\n        basic_json result;\n        detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);\n        auto ia = i.get();\n        const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::ubjson, &sdp, strict);\n        return res ? result : basic_json(value_t::discarded);\n    }\n\n\n    /*!\n    @brief Create a JSON value from an input in BSON format\n\n    Deserializes a given input @a i to a JSON value using the BSON (Binary JSON)\n    serialization format.\n\n    The library maps BSON record types to JSON value types as follows:\n\n    BSON type       | BSON marker byte | JSON value type\n    --------------- | ---------------- | ---------------------------\n    double          | 0x01             | number_float\n    string          | 0x02             | string\n    document        | 0x03             | object\n    array           | 0x04             | array\n    binary          | 0x05             | still unsupported\n    undefined       | 0x06             | still unsupported\n    ObjectId        | 0x07             | still unsupported\n    boolean         | 0x08             | boolean\n    UTC Date-Time   | 0x09             | still unsupported\n    null            | 0x0A             | null\n    Regular Expr.   | 0x0B             | still unsupported\n    DB Pointer      | 0x0C             | still unsupported\n    JavaScript Code | 0x0D             | still unsupported\n    Symbol          | 0x0E             | still unsupported\n    JavaScript Code | 0x0F             | still unsupported\n    int32           | 0x10             | number_integer\n    Timestamp       | 0x11             | still unsupported\n    128-bit decimal float | 0x13       | still unsupported\n    Max Key         | 0x7F             | still unsupported\n    Min Key         | 0xFF             | still unsupported\n\n    @warning The mapping is **incomplete**. The unsupported mappings\n             are indicated in the table above.\n\n    @param[in] i  an input in BSON format convertible to an input adapter\n    @param[in] strict  whether to expect the input to be consumed until EOF\n                       (true by default)\n    @param[in] allow_exceptions  whether to throw exceptions in case of a\n    parse error (optional, true by default)\n\n    @return deserialized JSON value; in case of a parse error and\n            @a allow_exceptions set to `false`, the return value will be\n            value_t::discarded.\n\n    @throw parse_error.114 if an unsupported BSON record type is encountered\n\n    @complexity Linear in the size of the input @a i.\n\n    @liveexample{The example shows the deserialization of a byte vector in\n    BSON format to a JSON value.,from_bson}\n\n    @sa http://bsonspec.org/spec.html\n    @sa @ref to_bson(const basic_json&) for the analogous serialization\n    @sa @ref from_cbor(detail::input_adapter&&, const bool, const bool, const cbor_tag_handler_t) for the\n        related CBOR format\n    @sa @ref from_msgpack(detail::input_adapter&&, const bool, const bool) for\n        the related MessagePack format\n    @sa @ref from_ubjson(detail::input_adapter&&, const bool, const bool) for the\n        related UBJSON format\n    */\n    template<typename InputType>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json from_bson(InputType&& i,\n                                const bool strict = true,\n                                const bool allow_exceptions = true)\n    {\n        basic_json result;\n        detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);\n        auto ia = detail::input_adapter(std::forward<InputType>(i));\n        const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::bson, &sdp, strict);\n        return res ? result : basic_json(value_t::discarded);\n    }\n\n    /*!\n    @copydoc from_bson(detail::input_adapter&&, const bool, const bool)\n    */\n    template<typename IteratorType>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json from_bson(IteratorType first, IteratorType last,\n                                const bool strict = true,\n                                const bool allow_exceptions = true)\n    {\n        basic_json result;\n        detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);\n        auto ia = detail::input_adapter(std::move(first), std::move(last));\n        const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::bson, &sdp, strict);\n        return res ? result : basic_json(value_t::discarded);\n    }\n\n    template<typename T>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_bson(ptr, ptr + len))\n    static basic_json from_bson(const T* ptr, std::size_t len,\n                                const bool strict = true,\n                                const bool allow_exceptions = true)\n    {\n        return from_bson(ptr, ptr + len, strict, allow_exceptions);\n    }\n\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_bson(ptr, ptr + len))\n    static basic_json from_bson(detail::span_input_adapter&& i,\n                                const bool strict = true,\n                                const bool allow_exceptions = true)\n    {\n        basic_json result;\n        detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);\n        auto ia = i.get();\n        const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::bson, &sdp, strict);\n        return res ? result : basic_json(value_t::discarded);\n    }\n    /// @}\n\n    //////////////////////////\n    // JSON Pointer support //\n    //////////////////////////\n\n    /// @name JSON Pointer functions\n    /// @{\n\n    /*!\n    @brief access specified element via JSON Pointer\n\n    Uses a JSON pointer to retrieve a reference to the respective JSON value.\n    No bound checking is performed. Similar to @ref operator[](const typename\n    object_t::key_type&), `null` values are created in arrays and objects if\n    necessary.\n\n    In particular:\n    - If the JSON pointer points to an object key that does not exist, it\n      is created an filled with a `null` value before a reference to it\n      is returned.\n    - If the JSON pointer points to an array index that does not exist, it\n      is created an filled with a `null` value before a reference to it\n      is returned. All indices between the current maximum and the given\n      index are also filled with `null`.\n    - The special value `-` is treated as a synonym for the index past the\n      end.\n\n    @param[in] ptr  a JSON pointer\n\n    @return reference to the element pointed to by @a ptr\n\n    @complexity Constant.\n\n    @throw parse_error.106   if an array index begins with '0'\n    @throw parse_error.109   if an array index was not a number\n    @throw out_of_range.404  if the JSON pointer can not be resolved\n\n    @liveexample{The behavior is shown in the example.,operatorjson_pointer}\n\n    @since version 2.0.0\n    */\n    reference operator[](const json_pointer& ptr)\n    {\n        return ptr.get_unchecked(this);\n    }\n\n    /*!\n    @brief access specified element via JSON Pointer\n\n    Uses a JSON pointer to retrieve a reference to the respective JSON value.\n    No bound checking is performed. The function does not change the JSON\n    value; no `null` values are created. In particular, the special value\n    `-` yields an exception.\n\n    @param[in] ptr  JSON pointer to the desired element\n\n    @return const reference to the element pointed to by @a ptr\n\n    @complexity Constant.\n\n    @throw parse_error.106   if an array index begins with '0'\n    @throw parse_error.109   if an array index was not a number\n    @throw out_of_range.402  if the array index '-' is used\n    @throw out_of_range.404  if the JSON pointer can not be resolved\n\n    @liveexample{The behavior is shown in the example.,operatorjson_pointer_const}\n\n    @since version 2.0.0\n    */\n    const_reference operator[](const json_pointer& ptr) const\n    {\n        return ptr.get_unchecked(this);\n    }\n\n    /*!\n    @brief access specified element via JSON Pointer\n\n    Returns a reference to the element at with specified JSON pointer @a ptr,\n    with bounds checking.\n\n    @param[in] ptr  JSON pointer to the desired element\n\n    @return reference to the element pointed to by @a ptr\n\n    @throw parse_error.106 if an array index in the passed JSON pointer @a ptr\n    begins with '0'. See example below.\n\n    @throw parse_error.109 if an array index in the passed JSON pointer @a ptr\n    is not a number. See example below.\n\n    @throw out_of_range.401 if an array index in the passed JSON pointer @a ptr\n    is out of range. See example below.\n\n    @throw out_of_range.402 if the array index '-' is used in the passed JSON\n    pointer @a ptr. As `at` provides checked access (and no elements are\n    implicitly inserted), the index '-' is always invalid. See example below.\n\n    @throw out_of_range.403 if the JSON pointer describes a key of an object\n    which cannot be found. See example below.\n\n    @throw out_of_range.404 if the JSON pointer @a ptr can not be resolved.\n    See example below.\n\n    @exceptionsafety Strong guarantee: if an exception is thrown, there are no\n    changes in the JSON value.\n\n    @complexity Constant.\n\n    @since version 2.0.0\n\n    @liveexample{The behavior is shown in the example.,at_json_pointer}\n    */\n    reference at(const json_pointer& ptr)\n    {\n        return ptr.get_checked(this);\n    }\n\n    /*!\n    @brief access specified element via JSON Pointer\n\n    Returns a const reference to the element at with specified JSON pointer @a\n    ptr, with bounds checking.\n\n    @param[in] ptr  JSON pointer to the desired element\n\n    @return reference to the element pointed to by @a ptr\n\n    @throw parse_error.106 if an array index in the passed JSON pointer @a ptr\n    begins with '0'. See example below.\n\n    @throw parse_error.109 if an array index in the passed JSON pointer @a ptr\n    is not a number. See example below.\n\n    @throw out_of_range.401 if an array index in the passed JSON pointer @a ptr\n    is out of range. See example below.\n\n    @throw out_of_range.402 if the array index '-' is used in the passed JSON\n    pointer @a ptr. As `at` provides checked access (and no elements are\n    implicitly inserted), the index '-' is always invalid. See example below.\n\n    @throw out_of_range.403 if the JSON pointer describes a key of an object\n    which cannot be found. See example below.\n\n    @throw out_of_range.404 if the JSON pointer @a ptr can not be resolved.\n    See example below.\n\n    @exceptionsafety Strong guarantee: if an exception is thrown, there are no\n    changes in the JSON value.\n\n    @complexity Constant.\n\n    @since version 2.0.0\n\n    @liveexample{The behavior is shown in the example.,at_json_pointer_const}\n    */\n    const_reference at(const json_pointer& ptr) const\n    {\n        return ptr.get_checked(this);\n    }\n\n    /*!\n    @brief return flattened JSON value\n\n    The function creates a JSON object whose keys are JSON pointers (see [RFC\n    6901](https://tools.ietf.org/html/rfc6901)) and whose values are all\n    primitive. The original JSON value can be restored using the @ref\n    unflatten() function.\n\n    @return an object that maps JSON pointers to primitive values\n\n    @note Empty objects and arrays are flattened to `null` and will not be\n          reconstructed correctly by the @ref unflatten() function.\n\n    @complexity Linear in the size the JSON value.\n\n    @liveexample{The following code shows how a JSON object is flattened to an\n    object whose keys consist of JSON pointers.,flatten}\n\n    @sa @ref unflatten() for the reverse function\n\n    @since version 2.0.0\n    */\n    basic_json flatten() const\n    {\n        basic_json result(value_t::object);\n        json_pointer::flatten(\"\", *this, result);\n        return result;\n    }\n\n    /*!\n    @brief unflatten a previously flattened JSON value\n\n    The function restores the arbitrary nesting of a JSON value that has been\n    flattened before using the @ref flatten() function. The JSON value must\n    meet certain constraints:\n    1. The value must be an object.\n    2. The keys must be JSON pointers (see\n       [RFC 6901](https://tools.ietf.org/html/rfc6901))\n    3. The mapped values must be primitive JSON types.\n\n    @return the original JSON from a flattened version\n\n    @note Empty objects and arrays are flattened by @ref flatten() to `null`\n          values and can not unflattened to their original type. Apart from\n          this example, for a JSON value `j`, the following is always true:\n          `j == j.flatten().unflatten()`.\n\n    @complexity Linear in the size the JSON value.\n\n    @throw type_error.314  if value is not an object\n    @throw type_error.315  if object values are not primitive\n\n    @liveexample{The following code shows how a flattened JSON object is\n    unflattened into the original nested JSON object.,unflatten}\n\n    @sa @ref flatten() for the reverse function\n\n    @since version 2.0.0\n    */\n    basic_json unflatten() const\n    {\n        return json_pointer::unflatten(*this);\n    }\n\n    /// @}\n\n    //////////////////////////\n    // JSON Patch functions //\n    //////////////////////////\n\n    /// @name JSON Patch functions\n    /// @{\n\n    /*!\n    @brief applies a JSON patch\n\n    [JSON Patch](http://jsonpatch.com) defines a JSON document structure for\n    expressing a sequence of operations to apply to a JSON) document. With\n    this function, a JSON Patch is applied to the current JSON value by\n    executing all operations from the patch.\n\n    @param[in] json_patch  JSON patch document\n    @return patched document\n\n    @note The application of a patch is atomic: Either all operations succeed\n          and the patched document is returned or an exception is thrown. In\n          any case, the original value is not changed: the patch is applied\n          to a copy of the value.\n\n    @throw parse_error.104 if the JSON patch does not consist of an array of\n    objects\n\n    @throw parse_error.105 if the JSON patch is malformed (e.g., mandatory\n    attributes are missing); example: `\"operation add must have member path\"`\n\n    @throw out_of_range.401 if an array index is out of range.\n\n    @throw out_of_range.403 if a JSON pointer inside the patch could not be\n    resolved successfully in the current JSON value; example: `\"key baz not\n    found\"`\n\n    @throw out_of_range.405 if JSON pointer has no parent (\"add\", \"remove\",\n    \"move\")\n\n    @throw other_error.501 if \"test\" operation was unsuccessful\n\n    @complexity Linear in the size of the JSON value and the length of the\n    JSON patch. As usually only a fraction of the JSON value is affected by\n    the patch, the complexity can usually be neglected.\n\n    @liveexample{The following code shows how a JSON patch is applied to a\n    value.,patch}\n\n    @sa @ref diff -- create a JSON patch by comparing two JSON values\n\n    @sa [RFC 6902 (JSON Patch)](https://tools.ietf.org/html/rfc6902)\n    @sa [RFC 6901 (JSON Pointer)](https://tools.ietf.org/html/rfc6901)\n\n    @since version 2.0.0\n    */\n    basic_json patch(const basic_json& json_patch) const\n    {\n        // make a working copy to apply the patch to\n        basic_json result = *this;\n\n        // the valid JSON Patch operations\n        enum class patch_operations {add, remove, replace, move, copy, test, invalid};\n\n        const auto get_op = [](const std::string & op)\n        {\n            if (op == \"add\")\n            {\n                return patch_operations::add;\n            }\n            if (op == \"remove\")\n            {\n                return patch_operations::remove;\n            }\n            if (op == \"replace\")\n            {\n                return patch_operations::replace;\n            }\n            if (op == \"move\")\n            {\n                return patch_operations::move;\n            }\n            if (op == \"copy\")\n            {\n                return patch_operations::copy;\n            }\n            if (op == \"test\")\n            {\n                return patch_operations::test;\n            }\n\n            return patch_operations::invalid;\n        };\n\n        // wrapper for \"add\" operation; add value at ptr\n        const auto operation_add = [&result](json_pointer & ptr, basic_json val)\n        {\n            // adding to the root of the target document means replacing it\n            if (ptr.empty())\n            {\n                result = val;\n                return;\n            }\n\n            // make sure the top element of the pointer exists\n            json_pointer top_pointer = ptr.top();\n            if (top_pointer != ptr)\n            {\n                result.at(top_pointer);\n            }\n\n            // get reference to parent of JSON pointer ptr\n            const auto last_path = ptr.back();\n            ptr.pop_back();\n            basic_json& parent = result[ptr];\n\n            switch (parent.m_type)\n            {\n                case value_t::null:\n                case value_t::object:\n                {\n                    // use operator[] to add value\n                    parent[last_path] = val;\n                    break;\n                }\n\n                case value_t::array:\n                {\n                    if (last_path == \"-\")\n                    {\n                        // special case: append to back\n                        parent.push_back(val);\n                    }\n                    else\n                    {\n                        const auto idx = json_pointer::array_index(last_path);\n                        if (JSON_HEDLEY_UNLIKELY(idx > parent.size()))\n                        {\n                            // avoid undefined behavior\n                            JSON_THROW(out_of_range::create(401, \"array index \" + std::to_string(idx) + \" is out of range\"));\n                        }\n\n                        // default case: insert add offset\n                        parent.insert(parent.begin() + static_cast<difference_type>(idx), val);\n                    }\n                    break;\n                }\n\n                // if there exists a parent it cannot be primitive\n                default:            // LCOV_EXCL_LINE\n                    JSON_ASSERT(false);  // LCOV_EXCL_LINE\n            }\n        };\n\n        // wrapper for \"remove\" operation; remove value at ptr\n        const auto operation_remove = [&result](json_pointer & ptr)\n        {\n            // get reference to parent of JSON pointer ptr\n            const auto last_path = ptr.back();\n            ptr.pop_back();\n            basic_json& parent = result.at(ptr);\n\n            // remove child\n            if (parent.is_object())\n            {\n                // perform range check\n                auto it = parent.find(last_path);\n                if (JSON_HEDLEY_LIKELY(it != parent.end()))\n                {\n                    parent.erase(it);\n                }\n                else\n                {\n                    JSON_THROW(out_of_range::create(403, \"key '\" + last_path + \"' not found\"));\n                }\n            }\n            else if (parent.is_array())\n            {\n                // note erase performs range check\n                parent.erase(json_pointer::array_index(last_path));\n            }\n        };\n\n        // type check: top level value must be an array\n        if (JSON_HEDLEY_UNLIKELY(!json_patch.is_array()))\n        {\n            JSON_THROW(parse_error::create(104, 0, \"JSON patch must be an array of objects\"));\n        }\n\n        // iterate and apply the operations\n        for (const auto& val : json_patch)\n        {\n            // wrapper to get a value for an operation\n            const auto get_value = [&val](const std::string & op,\n                                          const std::string & member,\n                                          bool string_type) -> basic_json &\n            {\n                // find value\n                auto it = val.m_value.object->find(member);\n\n                // context-sensitive error message\n                const auto error_msg = (op == \"op\") ? \"operation\" : \"operation '\" + op + \"'\";\n\n                // check if desired value is present\n                if (JSON_HEDLEY_UNLIKELY(it == val.m_value.object->end()))\n                {\n                    JSON_THROW(parse_error::create(105, 0, error_msg + \" must have member '\" + member + \"'\"));\n                }\n\n                // check if result is of type string\n                if (JSON_HEDLEY_UNLIKELY(string_type && !it->second.is_string()))\n                {\n                    JSON_THROW(parse_error::create(105, 0, error_msg + \" must have string member '\" + member + \"'\"));\n                }\n\n                // no error: return value\n                return it->second;\n            };\n\n            // type check: every element of the array must be an object\n            if (JSON_HEDLEY_UNLIKELY(!val.is_object()))\n            {\n                JSON_THROW(parse_error::create(104, 0, \"JSON patch must be an array of objects\"));\n            }\n\n            // collect mandatory members\n            const auto op = get_value(\"op\", \"op\", true).template get<std::string>();\n            const auto path = get_value(op, \"path\", true).template get<std::string>();\n            json_pointer ptr(path);\n\n            switch (get_op(op))\n            {\n                case patch_operations::add:\n                {\n                    operation_add(ptr, get_value(\"add\", \"value\", false));\n                    break;\n                }\n\n                case patch_operations::remove:\n                {\n                    operation_remove(ptr);\n                    break;\n                }\n\n                case patch_operations::replace:\n                {\n                    // the \"path\" location must exist - use at()\n                    result.at(ptr) = get_value(\"replace\", \"value\", false);\n                    break;\n                }\n\n                case patch_operations::move:\n                {\n                    const auto from_path = get_value(\"move\", \"from\", true).template get<std::string>();\n                    json_pointer from_ptr(from_path);\n\n                    // the \"from\" location must exist - use at()\n                    basic_json v = result.at(from_ptr);\n\n                    // The move operation is functionally identical to a\n                    // \"remove\" operation on the \"from\" location, followed\n                    // immediately by an \"add\" operation at the target\n                    // location with the value that was just removed.\n                    operation_remove(from_ptr);\n                    operation_add(ptr, v);\n                    break;\n                }\n\n                case patch_operations::copy:\n                {\n                    const auto from_path = get_value(\"copy\", \"from\", true).template get<std::string>();\n                    const json_pointer from_ptr(from_path);\n\n                    // the \"from\" location must exist - use at()\n                    basic_json v = result.at(from_ptr);\n\n                    // The copy is functionally identical to an \"add\"\n                    // operation at the target location using the value\n                    // specified in the \"from\" member.\n                    operation_add(ptr, v);\n                    break;\n                }\n\n                case patch_operations::test:\n                {\n                    bool success = false;\n                    JSON_TRY\n                    {\n                        // check if \"value\" matches the one at \"path\"\n                        // the \"path\" location must exist - use at()\n                        success = (result.at(ptr) == get_value(\"test\", \"value\", false));\n                    }\n                    JSON_INTERNAL_CATCH (out_of_range&)\n                    {\n                        // ignore out of range errors: success remains false\n                    }\n\n                    // throw an exception if test fails\n                    if (JSON_HEDLEY_UNLIKELY(!success))\n                    {\n                        JSON_THROW(other_error::create(501, \"unsuccessful: \" + val.dump()));\n                    }\n\n                    break;\n                }\n\n                default:\n                {\n                    // op must be \"add\", \"remove\", \"replace\", \"move\", \"copy\", or\n                    // \"test\"\n                    JSON_THROW(parse_error::create(105, 0, \"operation value '\" + op + \"' is invalid\"));\n                }\n            }\n        }\n\n        return result;\n    }\n\n    /*!\n    @brief creates a diff as a JSON patch\n\n    Creates a [JSON Patch](http://jsonpatch.com) so that value @a source can\n    be changed into the value @a target by calling @ref patch function.\n\n    @invariant For two JSON values @a source and @a target, the following code\n    yields always `true`:\n    @code {.cpp}\n    source.patch(diff(source, target)) == target;\n    @endcode\n\n    @note Currently, only `remove`, `add`, and `replace` operations are\n          generated.\n\n    @param[in] source  JSON value to compare from\n    @param[in] target  JSON value to compare against\n    @param[in] path    helper value to create JSON pointers\n\n    @return a JSON patch to convert the @a source to @a target\n\n    @complexity Linear in the lengths of @a source and @a target.\n\n    @liveexample{The following code shows how a JSON patch is created as a\n    diff for two JSON values.,diff}\n\n    @sa @ref patch -- apply a JSON patch\n    @sa @ref merge_patch -- apply a JSON Merge Patch\n\n    @sa [RFC 6902 (JSON Patch)](https://tools.ietf.org/html/rfc6902)\n\n    @since version 2.0.0\n    */\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json diff(const basic_json& source, const basic_json& target,\n                           const std::string& path = \"\")\n    {\n        // the patch\n        basic_json result(value_t::array);\n\n        // if the values are the same, return empty patch\n        if (source == target)\n        {\n            return result;\n        }\n\n        if (source.type() != target.type())\n        {\n            // different types: replace value\n            result.push_back(\n            {\n                {\"op\", \"replace\"}, {\"path\", path}, {\"value\", target}\n            });\n            return result;\n        }\n\n        switch (source.type())\n        {\n            case value_t::array:\n            {\n                // first pass: traverse common elements\n                std::size_t i = 0;\n                while (i < source.size() && i < target.size())\n                {\n                    // recursive call to compare array values at index i\n                    auto temp_diff = diff(source[i], target[i], path + \"/\" + std::to_string(i));\n                    result.insert(result.end(), temp_diff.begin(), temp_diff.end());\n                    ++i;\n                }\n\n                // i now reached the end of at least one array\n                // in a second pass, traverse the remaining elements\n\n                // remove my remaining elements\n                const auto end_index = static_cast<difference_type>(result.size());\n                while (i < source.size())\n                {\n                    // add operations in reverse order to avoid invalid\n                    // indices\n                    result.insert(result.begin() + end_index, object(\n                    {\n                        {\"op\", \"remove\"},\n                        {\"path\", path + \"/\" + std::to_string(i)}\n                    }));\n                    ++i;\n                }\n\n                // add other remaining elements\n                while (i < target.size())\n                {\n                    result.push_back(\n                    {\n                        {\"op\", \"add\"},\n                        {\"path\", path + \"/-\"},\n                        {\"value\", target[i]}\n                    });\n                    ++i;\n                }\n\n                break;\n            }\n\n            case value_t::object:\n            {\n                // first pass: traverse this object's elements\n                for (auto it = source.cbegin(); it != source.cend(); ++it)\n                {\n                    // escape the key name to be used in a JSON patch\n                    const auto key = json_pointer::escape(it.key());\n\n                    if (target.find(it.key()) != target.end())\n                    {\n                        // recursive call to compare object values at key it\n                        auto temp_diff = diff(it.value(), target[it.key()], path + \"/\" + key);\n                        result.insert(result.end(), temp_diff.begin(), temp_diff.end());\n                    }\n                    else\n                    {\n                        // found a key that is not in o -> remove it\n                        result.push_back(object(\n                        {\n                            {\"op\", \"remove\"}, {\"path\", path + \"/\" + key}\n                        }));\n                    }\n                }\n\n                // second pass: traverse other object's elements\n                for (auto it = target.cbegin(); it != target.cend(); ++it)\n                {\n                    if (source.find(it.key()) == source.end())\n                    {\n                        // found a key that is not in this -> add it\n                        const auto key = json_pointer::escape(it.key());\n                        result.push_back(\n                        {\n                            {\"op\", \"add\"}, {\"path\", path + \"/\" + key},\n                            {\"value\", it.value()}\n                        });\n                    }\n                }\n\n                break;\n            }\n\n            default:\n            {\n                // both primitive type: replace value\n                result.push_back(\n                {\n                    {\"op\", \"replace\"}, {\"path\", path}, {\"value\", target}\n                });\n                break;\n            }\n        }\n\n        return result;\n    }\n\n    /// @}\n\n    ////////////////////////////////\n    // JSON Merge Patch functions //\n    ////////////////////////////////\n\n    /// @name JSON Merge Patch functions\n    /// @{\n\n    /*!\n    @brief applies a JSON Merge Patch\n\n    The merge patch format is primarily intended for use with the HTTP PATCH\n    method as a means of describing a set of modifications to a target\n    resource's content. This function applies a merge patch to the current\n    JSON value.\n\n    The function implements the following algorithm from Section 2 of\n    [RFC 7396 (JSON Merge Patch)](https://tools.ietf.org/html/rfc7396):\n\n    ```\n    define MergePatch(Target, Patch):\n      if Patch is an Object:\n        if Target is not an Object:\n          Target = {} // Ignore the contents and set it to an empty Object\n        for each Name/Value pair in Patch:\n          if Value is null:\n            if Name exists in Target:\n              remove the Name/Value pair from Target\n          else:\n            Target[Name] = MergePatch(Target[Name], Value)\n        return Target\n      else:\n        return Patch\n    ```\n\n    Thereby, `Target` is the current object; that is, the patch is applied to\n    the current value.\n\n    @param[in] apply_patch  the patch to apply\n\n    @complexity Linear in the lengths of @a patch.\n\n    @liveexample{The following code shows how a JSON Merge Patch is applied to\n    a JSON document.,merge_patch}\n\n    @sa @ref patch -- apply a JSON patch\n    @sa [RFC 7396 (JSON Merge Patch)](https://tools.ietf.org/html/rfc7396)\n\n    @since version 3.0.0\n    */\n    void merge_patch(const basic_json& apply_patch)\n    {\n        if (apply_patch.is_object())\n        {\n            if (!is_object())\n            {\n                *this = object();\n            }\n            for (auto it = apply_patch.begin(); it != apply_patch.end(); ++it)\n            {\n                if (it.value().is_null())\n                {\n                    erase(it.key());\n                }\n                else\n                {\n                    operator[](it.key()).merge_patch(it.value());\n                }\n            }\n        }\n        else\n        {\n            *this = apply_patch;\n        }\n    }\n\n    /// @}\n};\n\n/*!\n@brief user-defined to_string function for JSON values\n\nThis function implements a user-defined to_string  for JSON objects.\n\n@param[in] j  a JSON object\n@return a std::string object\n*/\n\nNLOHMANN_BASIC_JSON_TPL_DECLARATION\nstd::string to_string(const NLOHMANN_BASIC_JSON_TPL& j)\n{\n    return j.dump();\n}\n} // namespace nlohmann\n\n///////////////////////\n// nonmember support //\n///////////////////////\n\n// specialization of std::swap, and std::hash\nnamespace std\n{\n\n/// hash value for JSON objects\ntemplate<>\nstruct hash<nlohmann::json>\n{\n    /*!\n    @brief return a hash value for a JSON object\n\n    @since version 1.0.0\n    */\n    std::size_t operator()(const nlohmann::json& j) const\n    {\n        return nlohmann::detail::hash(j);\n    }\n};\n\n/// specialization for std::less<value_t>\n/// @note: do not remove the space after '<',\n///        see https://github.com/nlohmann/json/pull/679\ntemplate<>\nstruct less<::nlohmann::detail::value_t>\n{\n    /*!\n    @brief compare two value_t enum values\n    @since version 3.0.0\n    */\n    bool operator()(nlohmann::detail::value_t lhs,\n                    nlohmann::detail::value_t rhs) const noexcept\n    {\n        return nlohmann::detail::operator<(lhs, rhs);\n    }\n};\n\n// C++20 prohibit function specialization in the std namespace.\n#ifndef JSON_HAS_CPP_20\n\n/*!\n@brief exchanges the values of two JSON objects\n\n@since version 1.0.0\n*/\ntemplate<>\ninline void swap<nlohmann::json>(nlohmann::json& j1, nlohmann::json& j2) noexcept(\n    is_nothrow_move_constructible<nlohmann::json>::value&&\n    is_nothrow_move_assignable<nlohmann::json>::value\n                              )\n{\n    j1.swap(j2);\n}\n\n#endif\n\n} // namespace std\n\n/*!\n@brief user-defined string literal for JSON values\n\nThis operator implements a user-defined string literal for JSON objects. It\ncan be used by adding `\"_json\"` to a string literal and returns a JSON object\nif no parse error occurred.\n\n@param[in] s  a string representation of a JSON object\n@param[in] n  the length of string @a s\n@return a JSON object\n\n@since version 1.0.0\n*/\nJSON_HEDLEY_NON_NULL(1)\ninline nlohmann::json operator \"\" _json(const char* s, std::size_t n)\n{\n    return nlohmann::json::parse(s, s + n);\n}\n\n/*!\n@brief user-defined string literal for JSON pointer\n\nThis operator implements a user-defined string literal for JSON Pointers. It\ncan be used by adding `\"_json_pointer\"` to a string literal and returns a JSON pointer\nobject if no parse error occurred.\n\n@param[in] s  a string representation of a JSON Pointer\n@param[in] n  the length of string @a s\n@return a JSON pointer object\n\n@since version 2.0.0\n*/\nJSON_HEDLEY_NON_NULL(1)\ninline nlohmann::json::json_pointer operator \"\" _json_pointer(const char* s, std::size_t n)\n{\n    return nlohmann::json::json_pointer(std::string(s, n));\n}\n\n// #include <nlohmann/detail/macro_unscope.hpp>\n\n\n// restore GCC/clang diagnostic settings\n#if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__)\n    #pragma GCC diagnostic pop\n#endif\n#if defined(__clang__)\n    #pragma GCC diagnostic pop\n#endif\n\n// clean up\n#undef JSON_ASSERT\n#undef JSON_INTERNAL_CATCH\n#undef JSON_CATCH\n#undef JSON_THROW\n#undef JSON_TRY\n#undef JSON_HAS_CPP_14\n#undef JSON_HAS_CPP_17\n#undef NLOHMANN_BASIC_JSON_TPL_DECLARATION\n#undef NLOHMANN_BASIC_JSON_TPL\n#undef JSON_EXPLICIT\n\n// #include <nlohmann/thirdparty/hedley/hedley_undef.hpp>\n#undef JSON_HEDLEY_ALWAYS_INLINE\n#undef JSON_HEDLEY_ARM_VERSION\n#undef JSON_HEDLEY_ARM_VERSION_CHECK\n#undef JSON_HEDLEY_ARRAY_PARAM\n#undef JSON_HEDLEY_ASSUME\n#undef JSON_HEDLEY_BEGIN_C_DECLS\n#undef JSON_HEDLEY_CLANG_HAS_ATTRIBUTE\n#undef JSON_HEDLEY_CLANG_HAS_BUILTIN\n#undef JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE\n#undef JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE\n#undef JSON_HEDLEY_CLANG_HAS_EXTENSION\n#undef JSON_HEDLEY_CLANG_HAS_FEATURE\n#undef JSON_HEDLEY_CLANG_HAS_WARNING\n#undef JSON_HEDLEY_COMPCERT_VERSION\n#undef JSON_HEDLEY_COMPCERT_VERSION_CHECK\n#undef JSON_HEDLEY_CONCAT\n#undef JSON_HEDLEY_CONCAT3\n#undef JSON_HEDLEY_CONCAT3_EX\n#undef JSON_HEDLEY_CONCAT_EX\n#undef JSON_HEDLEY_CONST\n#undef JSON_HEDLEY_CONSTEXPR\n#undef JSON_HEDLEY_CONST_CAST\n#undef JSON_HEDLEY_CPP_CAST\n#undef JSON_HEDLEY_CRAY_VERSION\n#undef JSON_HEDLEY_CRAY_VERSION_CHECK\n#undef JSON_HEDLEY_C_DECL\n#undef JSON_HEDLEY_DEPRECATED\n#undef JSON_HEDLEY_DEPRECATED_FOR\n#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL\n#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_\n#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED\n#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES\n#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS\n#undef JSON_HEDLEY_DIAGNOSTIC_POP\n#undef JSON_HEDLEY_DIAGNOSTIC_PUSH\n#undef JSON_HEDLEY_DMC_VERSION\n#undef JSON_HEDLEY_DMC_VERSION_CHECK\n#undef JSON_HEDLEY_EMPTY_BASES\n#undef JSON_HEDLEY_EMSCRIPTEN_VERSION\n#undef JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK\n#undef JSON_HEDLEY_END_C_DECLS\n#undef JSON_HEDLEY_FLAGS\n#undef JSON_HEDLEY_FLAGS_CAST\n#undef JSON_HEDLEY_GCC_HAS_ATTRIBUTE\n#undef JSON_HEDLEY_GCC_HAS_BUILTIN\n#undef JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE\n#undef JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE\n#undef JSON_HEDLEY_GCC_HAS_EXTENSION\n#undef JSON_HEDLEY_GCC_HAS_FEATURE\n#undef JSON_HEDLEY_GCC_HAS_WARNING\n#undef JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK\n#undef JSON_HEDLEY_GCC_VERSION\n#undef JSON_HEDLEY_GCC_VERSION_CHECK\n#undef JSON_HEDLEY_GNUC_HAS_ATTRIBUTE\n#undef JSON_HEDLEY_GNUC_HAS_BUILTIN\n#undef JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE\n#undef JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE\n#undef JSON_HEDLEY_GNUC_HAS_EXTENSION\n#undef JSON_HEDLEY_GNUC_HAS_FEATURE\n#undef JSON_HEDLEY_GNUC_HAS_WARNING\n#undef JSON_HEDLEY_GNUC_VERSION\n#undef JSON_HEDLEY_GNUC_VERSION_CHECK\n#undef JSON_HEDLEY_HAS_ATTRIBUTE\n#undef JSON_HEDLEY_HAS_BUILTIN\n#undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE\n#undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS\n#undef JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE\n#undef JSON_HEDLEY_HAS_EXTENSION\n#undef JSON_HEDLEY_HAS_FEATURE\n#undef JSON_HEDLEY_HAS_WARNING\n#undef JSON_HEDLEY_IAR_VERSION\n#undef JSON_HEDLEY_IAR_VERSION_CHECK\n#undef JSON_HEDLEY_IBM_VERSION\n#undef JSON_HEDLEY_IBM_VERSION_CHECK\n#undef JSON_HEDLEY_IMPORT\n#undef JSON_HEDLEY_INLINE\n#undef JSON_HEDLEY_INTEL_VERSION\n#undef JSON_HEDLEY_INTEL_VERSION_CHECK\n#undef JSON_HEDLEY_IS_CONSTANT\n#undef JSON_HEDLEY_IS_CONSTEXPR_\n#undef JSON_HEDLEY_LIKELY\n#undef JSON_HEDLEY_MALLOC\n#undef JSON_HEDLEY_MESSAGE\n#undef JSON_HEDLEY_MSVC_VERSION\n#undef JSON_HEDLEY_MSVC_VERSION_CHECK\n#undef JSON_HEDLEY_NEVER_INLINE\n#undef JSON_HEDLEY_NON_NULL\n#undef JSON_HEDLEY_NO_ESCAPE\n#undef JSON_HEDLEY_NO_RETURN\n#undef JSON_HEDLEY_NO_THROW\n#undef JSON_HEDLEY_NULL\n#undef JSON_HEDLEY_PELLES_VERSION\n#undef JSON_HEDLEY_PELLES_VERSION_CHECK\n#undef JSON_HEDLEY_PGI_VERSION\n#undef JSON_HEDLEY_PGI_VERSION_CHECK\n#undef JSON_HEDLEY_PREDICT\n#undef JSON_HEDLEY_PRINTF_FORMAT\n#undef JSON_HEDLEY_PRIVATE\n#undef JSON_HEDLEY_PUBLIC\n#undef JSON_HEDLEY_PURE\n#undef JSON_HEDLEY_REINTERPRET_CAST\n#undef JSON_HEDLEY_REQUIRE\n#undef JSON_HEDLEY_REQUIRE_CONSTEXPR\n#undef JSON_HEDLEY_REQUIRE_MSG\n#undef JSON_HEDLEY_RESTRICT\n#undef JSON_HEDLEY_RETURNS_NON_NULL\n#undef JSON_HEDLEY_SENTINEL\n#undef JSON_HEDLEY_STATIC_ASSERT\n#undef JSON_HEDLEY_STATIC_CAST\n#undef JSON_HEDLEY_STRINGIFY\n#undef JSON_HEDLEY_STRINGIFY_EX\n#undef JSON_HEDLEY_SUNPRO_VERSION\n#undef JSON_HEDLEY_SUNPRO_VERSION_CHECK\n#undef JSON_HEDLEY_TINYC_VERSION\n#undef JSON_HEDLEY_TINYC_VERSION_CHECK\n#undef JSON_HEDLEY_TI_ARMCL_VERSION\n#undef JSON_HEDLEY_TI_ARMCL_VERSION_CHECK\n#undef JSON_HEDLEY_TI_CL2000_VERSION\n#undef JSON_HEDLEY_TI_CL2000_VERSION_CHECK\n#undef JSON_HEDLEY_TI_CL430_VERSION\n#undef JSON_HEDLEY_TI_CL430_VERSION_CHECK\n#undef JSON_HEDLEY_TI_CL6X_VERSION\n#undef JSON_HEDLEY_TI_CL6X_VERSION_CHECK\n#undef JSON_HEDLEY_TI_CL7X_VERSION\n#undef JSON_HEDLEY_TI_CL7X_VERSION_CHECK\n#undef JSON_HEDLEY_TI_CLPRU_VERSION\n#undef JSON_HEDLEY_TI_CLPRU_VERSION_CHECK\n#undef JSON_HEDLEY_TI_VERSION\n#undef JSON_HEDLEY_TI_VERSION_CHECK\n#undef JSON_HEDLEY_UNAVAILABLE\n#undef JSON_HEDLEY_UNLIKELY\n#undef JSON_HEDLEY_UNPREDICTABLE\n#undef JSON_HEDLEY_UNREACHABLE\n#undef JSON_HEDLEY_UNREACHABLE_RETURN\n#undef JSON_HEDLEY_VERSION\n#undef JSON_HEDLEY_VERSION_DECODE_MAJOR\n#undef JSON_HEDLEY_VERSION_DECODE_MINOR\n#undef JSON_HEDLEY_VERSION_DECODE_REVISION\n#undef JSON_HEDLEY_VERSION_ENCODE\n#undef JSON_HEDLEY_WARNING\n#undef JSON_HEDLEY_WARN_UNUSED_RESULT\n#undef JSON_HEDLEY_WARN_UNUSED_RESULT_MSG\n#undef JSON_HEDLEY_FALL_THROUGH\n\n\n\n#endif  // INCLUDE_NLOHMANN_JSON_HPP_\n"
  },
  {
    "path": "components/results_processing/polyMetrics/main.cpp",
    "content": "#include <iostream>\n\n#include <QDir>\n#include <QFile>\n#include <QTextStream>\n#include <QDirIterator>\n\n#include <mesh_def.h>\n\n#include <json.hpp>\n\n#define WITHOUT_NUMPY\n#include <matplotlibcpp.h>\n\n#define GENERATE_CSV\n\nusing namespace std;\n\ntypedef vcg::Histogram<ScalarType> Histogram;\n\n/// Dumps histogram h to stream with the following schema:\n/// h.sum,h.min,h.max,h.avg,h.p(25),h.p(50),h.p(75),h.p(90),h.p(95);\nstatic void dumpHistogram(Histogram & h, QTextStream & stream)\n{\n\tstream << h.Sum() << \",\" << h.MinV() << \",\" << h.MaxV() << \",\" << h.Avg() << \",\";\n\tstream << h.Percentile(.25) << \",\" << h.Percentile(.5) << \",\" << h.Percentile(.75) << \",\" << h.Percentile(.90) << \",\" << h.Percentile(.95);\n}\n\nstatic nlohmann::json dumpHistogram(Histogram & h)\n{\n\tnlohmann::json j = {\n\t    { \"total\", h.Sum() },\n\t    { \"min\",   h.MinV() },\n\t    { \"max\",   h.MaxV() },\n\t    { \"mean\",  h.Avg() },\n\t    { \"P25\",   h.Percentile(.25) },\n\t    { \"P50\",   h.Percentile(.50) },\n\t    { \"P75\",   h.Percentile(.75) },\n\t    { \"P90\",   h.Percentile(.90) },\n\t    { \"P95\",   h.Percentile(.95) }\n\t};\n\n\treturn j;\n}\n\nstatic void writeDataToFile(const std::vector<ScalarType> & data, const std::string & filename)\n{\n\tQFile txtFile(filename.c_str());\n\n\tif(!txtFile.open(QFile::WriteOnly |QFile::Truncate))\n\t{\n\t\tstd::cerr << \"[PolyMetrics] Error opening text file \" << filename << std::endl;\n\t\tstd::cerr << \"[polyMetrics] Continuing...\" << std::endl;\n\t\treturn;\n\t}\n\n\tQTextStream txtStream(&txtFile);\n\n\tfor (size_t i = 0; i < data.size(); ++i)\n\t\ttxtStream << data[i] << \"\\n\";\n\ttxtStream.flush();\n\n\ttxtFile.close();\n}\n\nstatic void dumpVertQualityFile(PolyMesh & m, const std::string filename)\n{\n\tstd::vector<ScalarType> quality(size_t(m.VN()));\n\n\tfor (size_t i = 0; i < size_t(m.VN()); ++i)\n\t\tquality[i] = m.vert[i].cQ();\n\n\twriteDataToFile(quality, filename);\n}\n\nstatic void dumpFaceQualityFile(PolyMesh & m, const std::string filename)\n{\n\tstd::vector<ScalarType> quality(size_t(m.FN()));\n\n\tfor (size_t i = 0; i < size_t(m.FN()); ++i)\n\t\tquality[i] = m.face[i].cQ();\n\n\twriteDataToFile(quality, filename);\n}\n\nstatic void createHistPlot (const std::vector<ScalarType> & data, const std::string & title, const std::string & filename)\n{\n\tstd::cout << filename << std::endl;\n\tmatplotlibcpp::figure_size(1920,1080);\n\tstd::map<std::string, std::string> gridPref;\n\tgridPref[\"linestyle\"] = \"--\";\n//\tgridPref[\"alpha\"]     = \"1\";\n\tmatplotlibcpp::grid(true, \"both\", \"y\", gridPref);\n\tmatplotlibcpp::hist(data, 50);\n\tmatplotlibcpp::title(title);\n\tmatplotlibcpp::save(filename);\n\tmatplotlibcpp::close();\n}\n\nstatic void dumpVertQualityHistogramPlot(PolyMesh & m, const std::string title, const std::string filename)\n{\n\tstd::vector<ScalarType> quality(size_t(m.VN()));\n\n\tfor (size_t i = 0; i < size_t(m.VN()); ++i)\n\t\tquality[i] = m.vert[i].cQ();\n\n\tcreateHistPlot(quality, title, filename);\n}\nstatic void dumpFaceQualityHistogramPlot(PolyMesh & m, const std::string title, const std::string  filename)\n{\n\tstd::vector<ScalarType> quality(size_t(m.FN()));\n\n\tfor (size_t i = 0; i < size_t(m.FN()); ++i)\n\t\tquality[i] = m.face[i].cQ();\n\n\tcreateHistPlot(quality, title, filename);\n\n}\n\n\n\nstatic void computeModelStatsAndDump(PolyMesh & m, std::string & m_id, nlohmann::json & json)\n{\n\t/* valence stats */\n\tvcg::tri::UpdateTopology<PolyMesh>::FaceFace(m);\n\tvcg::Histogram<ScalarType> valenceHist;\n\tvcg::tri::UpdateQuality<PolyMesh>::VertexValence(m);\n\tvcg::tri::Stat<PolyMesh>::ComputePerVertexQualityHistogram(m, valenceHist);\n\n\tint non_manifold_edges    = vcg::tri::Clean<PolyMesh>::CountNonManifoldEdgeFF(m);\n\tint non_manifold_vertices = vcg::tri::Clean<PolyMesh>::CountNonManifoldVertexFF(m);\n\n\tint num_edges = 0; int num_nonManifold_edges = 0; int num_boundary_edges = 0;\n\tvcg::tri::Clean<PolyMesh>::CountEdgeNum(m, num_edges, num_boundary_edges, num_nonManifold_edges);\n\tint num_holes = -1;//vcg::tri::Clean<PolyMesh>::CountHoles(m);\n\n\tbool manifold = (non_manifold_edges + non_manifold_vertices) == 0;\n\n\tint num_cc = vcg::tri::Clean<PolyMesh>::CountConnectedComponents(m);\n\n\tint genus = vcg::tri::Clean<PolyMesh>::MeshGenus(m.VN(), num_edges, m.FN(), num_holes, num_cc);\n\tint euler = m.VN() - num_edges + m.FN();\n\n\tbool watertight = vcg::tri::Clean<PolyMesh>::IsWaterTight(m);\n\n\t//\ttopologyStream << \"ID,NUM_VERTS,NUM_EDGES,NUM_FACES,EULER,GENUS,NUM_HOLES,NUM_COMPONENTS,IS_WATERTIGHT,IS_MANIFOLD\\n\";\n\tjson[\"id\"] = m_id;\n\tjson[\"num_verts\"] = m.VN();\n\tjson[\"num_edges\"] = num_edges;\n\tjson[\"num_faces\"] = m.FN();\n\tjson[\"euler_num\"] = euler;\n\tjson[\"genus\"] = genus;\n\tjson[\"num_holes\"] = num_holes;\n\tjson[\"num_cc\"] = num_cc;\n\tjson[\"is_watertight\"] = watertight;\n\tjson[\"is_manifold\"] = manifold;\n\n\tstd::cout<<\"computing geo stats\" << std::endl;\n\t/* area stats */\n\tHistogram areaHist;\n\tfor (size_t i = 0; i < m.face.size(); ++i)\n\t\tm.face[i].Q() = vcg::PolyArea(m.face[i]);\n\tvcg::tri::Stat<PolyMesh>::ComputePerFaceQualityHistogram(m, areaHist);\n\n\tjson[\"area\"] = dumpHistogram(areaHist);\n\tdumpFaceQualityHistogramPlot(m, \"Quad Area\", \"areaHistogram.png\");\n\tdumpFaceQualityFile(m, \"faceArea.txt\");\n\n\n\t/* */\n\tHistogram faceAngleDeviationHist;\n\tvcg::PolygonalAlgorithm<PolyMesh>::UpdateQuality(m, vcg::PolygonalAlgorithm<PolyMesh>::QAngle);\n\tfor (size_t i = 0; i < size_t(m.FN()); ++i)\n\t\tm.face[i].Q() *= 90;\n\n\tvcg::tri::Stat<PolyMesh>::ComputePerFaceQualityHistogram(m, faceAngleDeviationHist);\n\n\tjson[\"angledeviation\"] = dumpHistogram(faceAngleDeviationHist);\n\tdumpFaceQualityHistogramPlot(m, \"Angle Deviation\", \"angleDevHistogram.png\");\n\tdumpFaceQualityFile(m, \"faceAngleDeviation.txt\");\n\n\t/* */\n\tHistogram faceFlatnessHist;\n\tvcg::PolygonalAlgorithm<PolyMesh>::UpdateQuality(m, vcg::PolygonalAlgorithm<PolyMesh>::QPlanar);\n\tvcg::tri::Stat<PolyMesh>::ComputePerFaceQualityHistogram(m, faceFlatnessHist);\n\n\tjson[\"flatness\"] = dumpHistogram(faceFlatnessHist);\n\tdumpFaceQualityHistogramPlot(m, \"Flatness\", \"flatnessHistogram.png\");\n\tdumpFaceQualityFile(m, \"faceFlatness.txt\");\n\n\t/* */\n//\tHistogram faceAspectHist;\n//\tvcg::PolygonalAlgorithm<PolyMesh>::UpdateQuality(m, vcg::PolygonalAlgorithm<PolyMesh>::QTemplate);\n//\tvcg::tri::Stat<PolyMesh>::ComputePerFaceQualityHistogram(m, faceAspectHist);\n\n//\tjson[\"template\"] = dumpHistogram(faceAspectHist);\n//\tdumpFaceQualityFile(m, \"faceAspectRatio.txt\");\n//\tdumpFaceQualityHistogramPlot(m, \"Template\", \"aspectRatioHistogram.png\");\n\n\t/* */\n\tHistogram faceBendingHist;\n\tvcg::PolygonalAlgorithm<PolyMesh>::InitQualityFaceBending(m);\n\tvcg::tri::Stat<PolyMesh>::ComputePerFaceQualityHistogram(m, faceBendingHist);\n\n\tjson[\"bending\"] = dumpHistogram(faceBendingHist);\n\tdumpFaceQualityHistogramPlot(m, \"Bending\", \"bendingHistogram.png\");\n\tdumpFaceQualityFile(m, \"faceBending.txt\");\n\n\t/* */\n\tHistogram faceTorsionHist;\n\tvcg::PolygonalAlgorithm<PolyMesh>::InitQualityFaceTorsion(m);\n\tvcg::tri::Stat<PolyMesh>::ComputePerFaceQualityHistogram(m, faceTorsionHist);\n\n\tjson[\"torsion\"] = dumpHistogram(faceTorsionHist);\n\tdumpFaceQualityHistogramPlot(m, \"Torsion\", \"torsionHistogram.png\");\n\tdumpFaceQualityFile(m, \"faceTorsion.txt\");\n\n\t/* */\n\tHistogram vertEdgeLenHist, vertEdgeLenDevHist;\n\tvcg::PolygonalAlgorithm<PolyMesh>::InitQualityVertEdgeLenght(m);\n\tvcg::tri::Stat<PolyMesh>::ComputePerVertexQualityHistogram(m, vertEdgeLenHist);\n\n\tdouble avg = vertEdgeLenHist.Avg();\n\tfor (size_t i = 0; i < size_t(m.VN()); ++i)\n\t\tm.vert[i].Q() = (std::fabs(m.vert[i].Q() - avg) / avg) * 100.;\n\n\tvcg::tri::Stat<PolyMesh>::ComputePerVertexQualityHistogram(m, vertEdgeLenDevHist);\n\n\tjson[\"edgelength\"] = dumpHistogram(vertEdgeLenDevHist);\n\tdumpVertQualityHistogramPlot(m, \"Mean Edge Length Deviaiton\", \"edgeLenHistogram.png\");\n\tdumpVertQualityFile(m, \"vertEdgeLen.txt\");\n\n\t/* */\n\tHistogram vertVoronoiAreaHist;\n\tvcg::PolygonalAlgorithm<PolyMesh>::InitQualityVertVoronoiArea(m);\n\tvcg::tri::Stat<PolyMesh>::ComputePerVertexQualityHistogram(m, vertVoronoiAreaHist);\n\n\tjson[\"voroarea\"] = dumpHistogram(vertVoronoiAreaHist);\n\tdumpVertQualityHistogramPlot(m, \"Voronoi Area\", \"voroAreaHistogram.png\");\n\tdumpVertQualityFile(m, \"vertVoroArea.txt\");\n\n\tstd::ofstream out(\"stats.json\");\n\tout << json;\n\tout.close();\n}\n\n\nstatic void computeModelStatsAndDump(PolyMesh & m, std::string & m_id, QTextStream &topologyStream, QTextStream &geometryStream, std::string & dataPath)\n{\n\t/* valence stats */\n\tvcg::tri::UpdateTopology<PolyMesh>::FaceFace(m);\n\tvcg::Histogram<ScalarType> valenceHist;\n\tvcg::tri::UpdateQuality<PolyMesh>::VertexValence(m);\n\tvcg::tri::Stat<PolyMesh>::ComputePerVertexQualityHistogram(m, valenceHist);\n\n\tint non_manifold_edges    = vcg::tri::Clean<PolyMesh>::CountNonManifoldEdgeFF(m);\n\tint non_manifold_vertices = vcg::tri::Clean<PolyMesh>::CountNonManifoldVertexFF(m);\n\n\tint num_edges = 0; int num_nonManifold_edges = 0; int num_boundary_edges = 0;\n\tvcg::tri::Clean<PolyMesh>::CountEdgeNum(m, num_edges, num_boundary_edges, num_nonManifold_edges);\n\n\tint num_holes = vcg::tri::Clean<PolyMesh>::CountHoles(m);\n\n\tbool manifold = (non_manifold_edges + non_manifold_vertices) == 0;\n\n\tint num_cc = vcg::tri::Clean<PolyMesh>::CountConnectedComponents(m);\n\n\tint genus = vcg::tri::Clean<PolyMesh>::MeshGenus(m.VN(), num_edges, m.FN(), num_holes, num_cc);\n\tint euler = m.VN() - num_edges + m.FN();\n\n\tbool watertight = vcg::tri::Clean<PolyMesh>::IsWaterTight(m);\n\n\t//\ttopologyStream << \"ID,NUM_VERTS,NUM_EDGES,NUM_FACES,EULER,GENUS,NUM_HOLES,NUM_COMPONENTS,IS_WATERTIGHT,IS_MANIFOLD\\n\";\n\ttopologyStream << m_id.c_str() << \",\" << m.VN() << \",\" << num_edges << \",\" << m.FN() << \",\" << euler << \",\" << genus << \",\";\n\ttopologyStream << num_holes << \",\" << num_cc << \",\" << watertight << \",\" << manifold << \"\\n\";\n\ttopologyStream.flush();\n\n\tstd::cout<<\"computing geo stats\" << std::endl;\n\tgeometryStream << m_id.c_str() << \",\";\n\t/* area stats */\n\tHistogram areaHist;\n\tfor (size_t i = 0; i < m.face.size(); ++i)\n\t\tm.face[i].Q() = vcg::PolyArea(m.face[i]);\n\tvcg::tri::Stat<PolyMesh>::ComputePerFaceQualityHistogram(m, areaHist);\n\n\tstd::cout << dataPath << std::endl;\n\n\tdumpHistogram(areaHist, geometryStream);\n\tdumpFaceQualityHistogramPlot(m, \"Quad Area\", dataPath + \"areaHistogram.png\");\n\tdumpFaceQualityFile(m, dataPath + \"faceArea.txt\");\n\n\n\t/* */\n\tHistogram faceAngleDeviationHist;\n\tvcg::PolygonalAlgorithm<PolyMesh>::UpdateQuality(m, vcg::PolygonalAlgorithm<PolyMesh>::QAngle);\n\tfor (size_t i = 0; i < size_t(m.FN()); ++i)\n\t\tm.face[i].Q() *= 90;\n\n\tvcg::tri::Stat<PolyMesh>::ComputePerFaceQualityHistogram(m, faceAngleDeviationHist);\n\n\n\tdumpHistogram(faceAngleDeviationHist, geometryStream);\n\tdumpFaceQualityHistogramPlot(m, \"Angle Deviation\", dataPath + \"angleDevHistogram.png\");\n\tdumpFaceQualityFile(m, dataPath + \"faceAngleDeviation.txt\");\n\n\t/* */\n\tHistogram faceFlatnessHist;\n\tvcg::PolygonalAlgorithm<PolyMesh>::UpdateQuality(m, vcg::PolygonalAlgorithm<PolyMesh>::QPlanar);\n\tvcg::tri::Stat<PolyMesh>::ComputePerFaceQualityHistogram(m, faceFlatnessHist);\n\n\tdumpHistogram(faceFlatnessHist, geometryStream);\n\tdumpFaceQualityHistogramPlot(m, \"Flatness\", dataPath + \"flatnessHistogram.png\");\n\tdumpFaceQualityFile(m, dataPath + \"faceFlatness.txt\");\n\n\t/* */\n//\tHistogram faceAspectHist;\n//\tvcg::PolygonalAlgorithm<PolyMesh>::UpdateQuality(m, vcg::PolygonalAlgorithm<PolyMesh>::QTemplate);\n//\tvcg::tri::Stat<PolyMesh>::ComputePerFaceQualityHistogram(m, faceAspectHist);\n\n//\tdumpHistogram(faceAspectHist, geometryStream);\n//\tdumpFaceQualityHistogramPlot(m, \"aspectRatioHistogram.png\");\n\n\t/* */\n\tHistogram faceBendingHist;\n\tvcg::PolygonalAlgorithm<PolyMesh>::InitQualityFaceBending(m);\n\tvcg::tri::Stat<PolyMesh>::ComputePerFaceQualityHistogram(m, faceBendingHist);\n\n\tdumpHistogram(faceBendingHist, geometryStream);\n\tdumpFaceQualityHistogramPlot(m, \"Bending\", dataPath + \"bendingHistogram.png\");\n\tdumpFaceQualityFile(m, dataPath + \"faceBending.txt\");\n\n\t/* */\n\tHistogram faceTorsionHist;\n\tvcg::PolygonalAlgorithm<PolyMesh>::InitQualityFaceTorsion(m);\n\tvcg::tri::Stat<PolyMesh>::ComputePerFaceQualityHistogram(m, faceTorsionHist);\n\n\tdumpHistogram(faceTorsionHist, geometryStream);\n\tdumpFaceQualityHistogramPlot(m, \"Torsion\", dataPath + \"torsionHistogram.png\");\n\tdumpFaceQualityFile(m, dataPath + \"faceTorsion.txt\");\n\n\t/* */\n\tHistogram vertEdgeLenHist, vertEdgeLenDevHist;\n\tvcg::PolygonalAlgorithm<PolyMesh>::InitQualityVertEdgeLenght(m);\n\tvcg::tri::Stat<PolyMesh>::ComputePerVertexQualityHistogram(m, vertEdgeLenHist);\n\n\tdouble avg = vertEdgeLenHist.Avg();\n\tfor (size_t i = 0; i < size_t(m.VN()); ++i)\n\t\tm.vert[i].Q() = (std::fabs(m.vert[i].Q() - avg) / avg) * 100.;\n\n\tvcg::tri::Stat<PolyMesh>::ComputePerVertexQualityHistogram(m, vertEdgeLenDevHist);\n\n\tdumpVertQualityHistogramPlot(m, \"Mean Edge Length Deviaiton\", \"edgeLenHistogram.png\");\n\tdumpVertQualityFile(m, \"vertEdgeLen.txt\");\n\t/* */\n\tHistogram vertVoronoiAreaHist;\n\tvcg::PolygonalAlgorithm<PolyMesh>::InitQualityVertVoronoiArea(m);\n\tvcg::tri::Stat<PolyMesh>::ComputePerVertexQualityHistogram(m, vertVoronoiAreaHist);\n\n\tdumpHistogram(vertVoronoiAreaHist, geometryStream);\n\tdumpVertQualityHistogramPlot(m, \"Voronoi Area\", dataPath + \"voroAreaHistogram.png\");\n\tdumpVertQualityFile(m, dataPath + \"vertVoroArea.txt\");\n\tgeometryStream << \"\\n\";\n\tgeometryStream.flush();\n}\n\n#ifdef GENERATE_CSV\nstatic void computeModelStatsCSV(PolyMesh & m, std::string & m_id, QTextStream &topologyStream, QTextStream &geometryStream, std::string & dataPath)\n{\n    /* valence stats */\n    vcg::tri::UpdateTopology<PolyMesh>::FaceFace(m);\n    vcg::Histogram<ScalarType> valenceHist;\n    vcg::tri::UpdateQuality<PolyMesh>::VertexValence(m);\n    vcg::tri::Stat<PolyMesh>::ComputePerVertexQualityHistogram(m, valenceHist);\n\n    int non_manifold_edges    = vcg::tri::Clean<PolyMesh>::CountNonManifoldEdgeFF(m);\n    int non_manifold_vertices = vcg::tri::Clean<PolyMesh>::CountNonManifoldVertexFF(m);\n\n    int num_edges = 0; int num_nonManifold_edges = 0; int num_boundary_edges = 0;\n    vcg::tri::Clean<PolyMesh>::CountEdgeNum(m, num_edges, num_boundary_edges, num_nonManifold_edges);\n\n    int num_holes = vcg::tri::Clean<PolyMesh>::CountHoles(m);\n\n    bool manifold = (non_manifold_edges + non_manifold_vertices) == 0;\n\n    int num_cc = vcg::tri::Clean<PolyMesh>::CountConnectedComponents(m);\n\n    int genus = vcg::tri::Clean<PolyMesh>::MeshGenus(m.VN(), num_edges, m.FN(), num_holes, num_cc);\n    int euler = m.VN() - num_edges + m.FN();\n\n    bool watertight = vcg::tri::Clean<PolyMesh>::IsWaterTight(m);\n\n    int numSingularities = 0;\n    vcg::tri::UpdateQuality<PolyMesh>::VertexValence(m);\n    for (size_t i = 0; i < m.vert.size(); i++) {\n        if (m.vert[i].Q() != 4) {\n            numSingularities++;\n        }\n    }\n\n    //\ttopologyStream << \"ID,NUM_VERTS,NUM_EDGES,NUM_FACES,EULER,GENUS,NUM_HOLES,NUM_COMPONENTS,IS_WATERTIGHT,IS_MANIFOLD,NUM_SINGULARITIES\\n\";\n    topologyStream << m_id.c_str() << \",\" << m.VN() << \",\" << num_edges << \",\" << m.FN() << \",\" << euler << \",\" << genus << \",\";\n    topologyStream << num_holes << \",\" << num_cc << \",\" << watertight << \",\" << manifold << \",\" << numSingularities << \"\\n\";\n    topologyStream.flush();\n\n    //   geometryStream << \"ID,\"\n    std::cout<<\"computing geo stats\" << std::endl;\n    geometryStream << m_id.c_str() << \",\";\n\n\n    /* area stats */\n    //   geometryStream << \"TOTAL_AREA,MIN_AREA,MAX_AREA,MEAN_AREA,P25AREA,P50AREA,P75AREA,P90AREA,P95AREA,\";\n    Histogram areaHist;\n    for (size_t i = 0; i < m.face.size(); ++i)\n        m.face[i].Q() = vcg::PolyArea(m.face[i]);\n    vcg::tri::Stat<PolyMesh>::ComputePerFaceQualityHistogram(m, areaHist);\n    std::cout << dataPath << std::endl;\n    dumpHistogram(areaHist, geometryStream);\n    geometryStream << \",\";\n\n    /* */\n    //   geometryStream << \"TOTAL_ANGLEDEV,MIN_ANGLEDEV,MAX_ANGLEDEV,MEAN_ANGLEDEV,P25ANGLEDEV,P50ANGLEDEV,P75ANGLEDEV,P90ANGLEDEV,P95ANGLEDEV,\";\n    Histogram faceAngleDeviationHist;\n    vcg::PolygonalAlgorithm<PolyMesh>::UpdateQuality(m, vcg::PolygonalAlgorithm<PolyMesh>::QAngle);\n\n\tfor (size_t i = 0; i < size_t(m.FN()); ++i)\n\t\tm.face[i].Q() *= 90;\n\n\n    vcg::tri::Stat<PolyMesh>::ComputePerFaceQualityHistogram(m, faceAngleDeviationHist);\n    dumpHistogram(faceAngleDeviationHist, geometryStream);\n    geometryStream << \",\";\n\n    /* */\n    //   geometryStream << \"TOTAL_FLATNESS,MIN_FLATNESS,MAX_FLATNESS,MEAN_FLATNESS,P25FLATNESS,P50FLATNESS,P75FLATNESS,P90FLATNESS,P95FLATNESS,\";\n    Histogram faceFlatnessHist;\n    vcg::PolygonalAlgorithm<PolyMesh>::UpdateQuality(m, vcg::PolygonalAlgorithm<PolyMesh>::QPlanar);\n    vcg::tri::Stat<PolyMesh>::ComputePerFaceQualityHistogram(m, faceFlatnessHist);\n    dumpHistogram(faceFlatnessHist, geometryStream);\n    geometryStream << \",\";\n\n    /* */\n    //   geometryStream << \"TOTAL_TEMPLATE,MIN_TEMPLATE,MAX_TEMPLATE,MEAN_TEMPLATE,P25TEMPLATE,P50TEMPLATE,P75TEMPLATE,P90TEMPLATE,P95TEMPLATE,\";\n//    Histogram faceAspectHist;\n//    vcg::PolygonalAlgorithm<PolyMesh>::UpdateQuality(m, vcg::PolygonalAlgorithm<PolyMesh>::QTemplate);\n//    vcg::tri::Stat<PolyMesh>::ComputePerFaceQualityHistogram(m, faceAspectHist);\n//    dumpHistogram(faceAspectHist, geometryStream);\n//    geometryStream << \",\";\n\n    /* */\n    //   geometryStream << \"TOTAL_BENDING,MIN_BENDING,MAX_BENDING,MEAN_BENDING,P25BENDING,P50BENDING,P75BENDING,P90BENDING,P95BENDING,\";\n    Histogram faceBendingHist;\n    vcg::PolygonalAlgorithm<PolyMesh>::InitQualityFaceBending(m);\n    vcg::tri::Stat<PolyMesh>::ComputePerFaceQualityHistogram(m, faceBendingHist);\n    dumpHistogram(faceBendingHist, geometryStream);\n    geometryStream << \",\";\n\n    /* */\n    //   geometryStream << \"TOTAL_TORSION,MIN_TORSION,MAX_TORSION,MEAN_TORSION,P25TORSION,P50TORSION,P75TORSION,P90TORSION,P95TORSION,\";\n    Histogram faceTorsionHist;\n    vcg::PolygonalAlgorithm<PolyMesh>::InitQualityFaceTorsion(m);\n    vcg::tri::Stat<PolyMesh>::ComputePerFaceQualityHistogram(m, faceTorsionHist);\n    dumpHistogram(faceTorsionHist, geometryStream);\n    geometryStream << \",\";\n\n    /* */\n    //   geometryStream << \"TOTAL_EDGELEN,MIN_EDGELEN,MAX_EDGELEN,MEAN_EDGELEN,P25EDGELEN,P50EDGELEN,P75EDGELEN,P90EDGELEN,P95EDGELEN,\";\n\tHistogram vertEdgeLenHist, vertEdgeLenDevHist;\n\tvcg::PolygonalAlgorithm<PolyMesh>::InitQualityVertEdgeLenght(m);\n\tvcg::tri::Stat<PolyMesh>::ComputePerVertexQualityHistogram(m, vertEdgeLenHist);\n\n\tdouble avg = vertEdgeLenHist.Avg();\n\tfor (size_t i = 0; i < size_t(m.VN()); ++i)\n\t\tm.vert[i].Q() = (std::fabs(m.vert[i].Q() - avg) / avg) * 100.;\n\n\tdumpHistogram(vertEdgeLenDevHist, geometryStream);\n    geometryStream << \",\";\n\n    /* */\n    //   geometryStream << \"TOTAL_VOROAREA,MIN_VOROAREA,MAX_VOROAREA,MEAN_VOROAREA,P25VOROAREA,P50VOROAREA,P75VOROAREA,P90VOROAREA,P95VOROAREA,\";\n    Histogram vertVoronoiAreaHist;\n    vcg::PolygonalAlgorithm<PolyMesh>::InitQualityVertVoronoiArea(m);\n    vcg::tri::Stat<PolyMesh>::ComputePerVertexQualityHistogram(m, vertVoronoiAreaHist);\n    dumpHistogram(vertVoronoiAreaHist, geometryStream);\n\n    geometryStream << \"\\n\";\n    geometryStream.flush();\n}\n#endif\n\n\nstatic int openMesh(PolyMesh & m, std::string & name)\n{\n\tint mask;\n\tint err = vcg::tri::io::ImporterOBJ<PolyMesh>::Open(m, name.c_str(), mask);\n\tif (err)\n\t{\n\t\tstd::cerr << \"[polyMetrics] Import Error: \" << vcg::tri::io::ImporterOBJ<PolyMesh>::ErrorMsg(err) <<  std::endl;\n\t\treturn err;\n\t}\n\n\treturn 0;\n}\n\nint main(int argc, char * argv[])\n{\n\n\tif (argc < 3)\n\t{\n        std::cout <<  \"[USAGE] polyMetrics baseDirectory globpattern\" << std::endl;\n        std::cout << \"BaseDirectory: the directory that contains all the target subdirectories\" << std::endl;\n        std::cout << \"globpattern: the pattern that matches the filename of the quad mesh to compute the metrics\" << std::endl;\n\n\t\treturn 1;\n\t}\n\n\tmatplotlibcpp::backend(\"WXAgg\");\n\n#ifdef GENERATE_CSV\n    QFile topologyFile(\"./topology.csv\");\n    QFile geometryFile(\"./geometry.csv\");\n\n    if(!topologyFile.open(QFile::WriteOnly |QFile::Truncate) || !geometryFile.open(QFile::WriteOnly |QFile::Truncate))\n    {\n        std::cerr << \"[PolyMetrics] Error opening files\" << std::endl;\n        return -1;\n    }\n\n    QTextStream topologyStream(&topologyFile);\n    QTextStream geometryStream(&geometryFile);\n\n    topologyStream << \"ID,NUM_VERTS,NUM_EDGES,NUM_FACES,EULER,GENUS,NUM_HOLES,NUM_COMPONENTS,IS_WATERTIGHT,IS_MANIFOLD,NUM_SINGULARITIES\\n\";\n\n    geometryStream << \"ID,TOTAL_AREA,MIN_AREA,MAX_AREA,MEAN_AREA,P25AREA,P50AREA,P75AREA,P90AREA,P95AREA,\";\n    geometryStream << \"TOTAL_ANGLEDEV,MIN_ANGLEDEV,MAX_ANGLEDEV,MEAN_ANGLEDEV,P25ANGLEDEV,P50ANGLEDEV,P75ANGLEDEV,P90ANGLEDEV,P95ANGLEDEV,\";\n    geometryStream << \"TOTAL_FLATNESS,MIN_FLATNESS,MAX_FLATNESS,MEAN_FLATNESS,P25FLATNESS,P50FLATNESS,P75FLATNESS,P90FLATNESS,P95FLATNESS,\";\n//    geometryStream << \"TOTAL_TEMPLATE,MIN_TEMPLATE,MAX_TEMPLATE,MEAN_TEMPLATE,P25TEMPLATE,P50TEMPLATE,P75TEMPLATE,P90TEMPLATE,P95TEMPLATE,\";\n    geometryStream << \"TOTAL_BENDING,MIN_BENDING,MAX_BENDING,MEAN_BENDING,P25BENDING,P50BENDING,P75BENDING,P90BENDING,P95BENDING,\";\n    geometryStream << \"TOTAL_TORSION,MIN_TORSION,MAX_TORSION,MEAN_TORSION,P25TORSION,P50TORSION,P75TORSION,P90TORSION,P95TORSION,\";\n    geometryStream << \"TOTAL_EDGELEN,MIN_EDGELEN,MAX_EDGELEN,MEAN_EDGELEN,P25EDGELEN,P50EDGELEN,P75EDGELEN,P90EDGELEN,P95EDGELEN,\";\n    geometryStream << \"TOTAL_VOROAREA,MIN_VOROAREA,MAX_VOROAREA,MEAN_VOROAREA,P25VOROAREA,P50VOROAREA,P75VOROAREA,P90VOROAREA,P95VOROAREA\\n\";\n#endif\n\n\tQDir dir;\n\tQString basePath = dir.currentPath();\n\tQString targetDir = argv[1];\n\tQString globPattern = argv[2];\n\n    std::cout << \"Target Dir: \" << targetDir.toStdString() << \" glob pattern: \" << globPattern.toStdString() << std::endl;\n\n//\tQDirIterator it(targetDir, QStringList() << globPattern, QDir::Dirs);\n    QDirIterator it(targetDir, QStringList() << globPattern, QDir::Files, QDirIterator::Subdirectories);\n\twhile (it.hasNext())\n\t{\n        it.next();\n        dir.setCurrent(it.fileInfo().dir().path());\n        std::cout << dir.currentPath().toStdString() << std::endl;\n\n//\t\tif (dir.exists(\"edgeLenHistogram.png\") && dir.exists(\"flatnessHistogram.png\") && dir.exists(\"voroAreaHistogram.png\") && dir.exists(\"torsionHistogram.png\"))\n//\t\t{\n//\t\t\tdir.setCurrent(basePath);\n//\t\t\tcontinue;\n//\t\t}\n\n\t\tnlohmann::json json;\n//\t\tstd::string dataDirName = QDir::toNativeSeparators(dir.absolutePath() + QDir::separator() + outDirName + QDir::separator()).toStdString();\n\n\t\tPolyMesh m;\n        std::string mesh = it.fileName().toStdString();// + \"_rem_p0_0_quadrangulation_smooth.obj\";\n\t\tint err = openMesh(m, mesh);\n\n\t\tstd::cout << mesh << \" \" << m.VN() << std::endl;\n\n\t\tif (err)\n\t\t\tcontinue;\n\n\t\tstd::cout << \"computing stats...\" << std::endl;\n\n\t\tstd::string baseName = it.fileInfo().baseName().toStdString();\n\t\tcomputeModelStatsAndDump(m, baseName, json);\n\t\t\n#ifdef GENERATE_CSV\n        std::string dataDirName = targetDir.toStdString();\n        computeModelStatsCSV(m, baseName, topologyStream, geometryStream, dataDirName);\n#endif\n\n\t\tdir.setCurrent(basePath);\n\t}\n\n\n#ifdef GENERATE_CSV\n\ttopologyFile.close();\n\tgeometryFile.close();\n#endif\n\n\n\treturn 0;\n}\n"
  },
  {
    "path": "components/results_processing/polyMetrics/mesh_def.h",
    "content": "#ifndef MESH_DEF_H\n#define MESH_DEF_H\n\n\n#include <vcg/complex/complex.h>\n#include <vcg/complex/algorithms/polygon_support.h>\n#include <vcg/complex/algorithms/polygonal_algorithms.h>\n\n#include <wrap/io_trimesh/import_obj.h>\n#include <wrap/io_trimesh/export_obj.h>\n\n\nclass PolyVertex;\nclass PolyEdge;\nclass PolyFace;\n\nstruct MyUsedTypes : public vcg::UsedTypes<\n        vcg::Use<PolyVertex>::AsVertexType,\n        //        vcg::Use<PolyEdge>::AsEdgeType,\n        vcg::Use<PolyFace>::AsFaceType\n        > {};\n\nclass PolyVertex : public vcg::Vertex<\n        MyUsedTypes,\n        vcg::vertex::Coord3d,\n        vcg::vertex::Qualityd,\n        vcg::vertex::Normal3d,\n        vcg::vertex::Color4b,\n        vcg::vertex::Mark,\n        vcg::vertex::BitFlags,\n        vcg::vertex::VFAdj\n        > {};\n\nclass PolyFace : public vcg::Face<\n        MyUsedTypes,\n        vcg::face::Color4b,\n        vcg::face::Normal3d,\n        vcg::face::VertexRef,\n        vcg::face::BitFlags,\n        vcg::face::Mark,\n        vcg::face::PolyInfo,\n        vcg::face::PFVAdj,\n        vcg::face::PFFAdj,\n        vcg::face::Qualityd\n        > {};\n\n\nclass PolyMesh : public vcg::tri::TriMesh<\n        std::vector<PolyVertex>,\n        std::vector<PolyFace >\n        >{};\n\n\ntypedef typename PolyVertex::CoordType CoordType;\ntypedef typename PolyVertex::ScalarType ScalarType;\n\ntypedef typename PolyMesh::VertexType VertexType;\ntypedef typename PolyMesh::VertexPointer VertexPointer;\n\ntypedef typename PolyMesh::FaceType FaceType;\ntypedef typename PolyMesh::FacePointer FacePointer;\n\n\n#endif // MESH_DEF_H\n"
  },
  {
    "path": "components/results_processing/polyMetrics/polyMetrics.pro",
    "content": "QT += core\n\nDEFINES *= QT_NO_OPENGL_ES_2\nDEFINES *= QT_NO_KEYWORDS\n\nCONFIG += c++11\n\nTARGET = polyMetrics\n\nCONFIG -= app_bundle\nCONFIG += console\n\n\nCONFIG(release, debug|release): DEFINES += NDEBUG\n\nwin32 {\n    QMAKE_CXXFLAGS_DEBUG *= -bigobj\n}\n\nLIBS_EXTERNAL = vcg eigen omp json\ninclude(../libs.pri)\n\nINCLUDEPATH *= ./external/matplotlib-cpp\nDEPENDPATH  *= ./external/matplotlib-cpp\nINCLUDEPATH *= ./external/nlohmann\n\nINCLUDEPATH *= C:\\Python27\\include\nLIBS *= -LC:\\Python27\\libs -lpython27\n\nSOURCES *= \\\n    main.cpp\n\nHEADERS += \\\n    mesh_def.h \\\n    matplotlibcpp.h\n\n\n\n\n\n"
  },
  {
    "path": "components/results_processing/polyMetrics/readme.txt",
    "content": "To compile correctly setup the ../libs.pri file and the following in polyMetrics.pro\n\nINCLUDEPATH *= /pathtopython/Python27/include\nLIBS *= -LC:\\Python27\\libs -lpython27\n\n"
  },
  {
    "path": "components/results_processing/snapshotRenderer/blenderBatchFolderRender.py",
    "content": "import bpy\nimport glob, os, sys\n\n# takes directory basename and returns names of files to be rendered\ndef getToRenderNames(dirName):\n    return [ dirName + \".obj\", dirName + \"_rem_p0_0_quadrangulation_smooth.obj\", dirName + \"_rem_p0_0_quadrangulation.obj\"]\n\nargv = sys.argv\nargv = argv[argv.index(\"--\") + 1:]\n\nbaseDirectory = os.path.abspath(argv[0])\n\nprint(baseDirectory)\n\nscene = bpy.context.scene\ndata  = bpy.data\n\n# get all the subdirectories names\nsubDirectories = next(os.walk(baseDirectory))[1]\n\nfor dirName in subDirectories:\n    \n    # get path to the directory\n    dirPath = os.path.join(baseDirectory, dirName)\n\n    # move to subdirectory\n    os.chdir(dirPath)    \n\n    meshes = getToRenderNames(dirName)\n\n    for mesh in meshes:\n        \n        success = bpy.ops.import_scene.obj(filepath=os.path.join('.', mesh), axis_forward='-Z', axis_up='Y')\n\n        # the imported objects...\n        obj_objects = bpy.context.selected_objects[:]\n\n        if (len(obj_objects) == 0):\n            continue\n\n        print(mesh)\n\n        obj = bpy.context.selected_objects[0]\n\n        bpy.ops.object.origin_set(type='ORIGIN_CENTER_OF_MASS', center='MEDIAN')\n        obj.location = (0, 0, 0)\n        obj.scale = obj.scale / max(obj.dimensions)\n\n        for edge in obj.data.edges:\n            edge.use_freestyle_mark = True\n\n        for mat in obj.material_slots:\n            mat.material = bpy.data.materials['diffuse']\n\n        bpy.context.scene.render.image_settings.file_format='JPEG'\n        bpy.context.scene.render.image_settings.quality=85\n        bpy.context.scene.render.filepath = os.path.join(os.getcwd(), mesh + \".jpg\")\n        bpy.ops.render.render(write_still = True)\n        bpy.ops.object.delete()\n\n\n\n    \n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "components/results_processing/snapshotRenderer/blenderBatchRender.py",
    "content": "import bpy\nimport glob, os, sys\n\nargv = sys.argv\nargv = argv[argv.index(\"--\") + 1:]\n\ndirectory = os.path.abspath(argv[0])\npatternglob = argv[1]\nimageDir  = os.path.abspath(argv[2])\n\nprint(directory)\nprint(imageDir)\n\npattern = os.path.join(directory, patternglob)\n\nprint (pattern)\n\nscene = bpy.context.scene\ndata  = bpy.data\n\nfor file in glob.glob(pattern):\n    print(file)\n    \n    name = os.path.basename(file)\n    \n    success = bpy.ops.import_scene.obj(filepath=file, axis_forward='-Z', axis_up='Y')\n\n    # the imported objects...\n    obj_objects = bpy.context.selected_objects[:]\n\n    if (len(obj_objects) == 0):\n        continue\n\n    obj = bpy.context.selected_objects[0]\n\n    bpy.ops.object.origin_set(type='ORIGIN_CENTER_OF_MASS', center='MEDIAN')\n    obj.location = (0, 0, 0)\n    obj.scale = obj.scale / max(obj.dimensions)\n\n    for edge in obj.data.edges:\n        edge.use_freestyle_mark = True\n\n    for mat in obj.material_slots:\n        mat.material = bpy.data.materials['diffuse']\n\n    bpy.context.scene.render.filepath = os.path.join(imageDir, name + \".png\")\n    bpy.ops.render.render(write_still = True)\n    bpy.ops.object.delete()\n    \n\n\n\n\n        \n\n\n\n\n\n\n"
  },
  {
    "path": "components/results_processing/snapshotRenderer/readme.txt",
    "content": "SIMPLE script for batch mesh rendering.\n\nFILES:\n\t- blenderBatchRender.py : \n\t\t\tPython script for executing the batch processing. \n\t\t\tTakes as input 3 arguments: <inputDIR> <globPattern> <outputDIR>\n\t\t\t<inputDIR> contains the input meshes\n\t\t\t<globPattern> glob pattern used to retrieve the meshes inside <inputDIR>\n\t\t\t<outputDIR> directory to store the snapshot images\n\t\t\t\t\t\n\t- snapshots.blend : \n\t\t\tBlender project file used to setup scene related stuff, like lighting, materials, base scene etc..\n\nUSAGE:\n\n\t- Setup your scene tuning snapshots.blend, then call the script like this:\n\t\tblender --background snapshots.blend -P blenderBatchRender.py -- <directoryIN> <globPattern> <directoryOUT>"
  },
  {
    "path": "components/viz_mesh_results/configuration.pri",
    "content": "LIBIGL_PATH = /Users/nicopietroni/Desktop/sandbox/pietroni/lib/libigl\nEIGEN_PATH = $$LIBIGL_PATH/external/nanogui/ext/eigen\n#EIGEN_PATH =/Users/nicopietroni/Desktop/sandbox/pietroni/lib/libigl/external/nanogui/ext/eigen\n#BOOST_PATH = /opt/local/include\n#LIBIGL_PATH = /Users/nicopietroni/Desktop/quadrangulate_patches/quad_from_patches/field_computation/lib/libigl/\n#VCGLIB_PATH = /opt/vcglib\n#GUROBI_PATH = /opt/gurobi903/linux64/\n#GUROBI_PATH = /Library/gurobi900/mac64/\nVCGLIB_PATH = /Users/nicopietroni/Desktop/vcglib\n\n#Retopology library\n#QUADRETOPOLOGY_PATH = $$PWD/libs/quadretopology\n"
  },
  {
    "path": "components/viz_mesh_results/main.cpp",
    "content": "#include <vcg/complex/complex.h>\n#include <vcg/complex/algorithms/polygonal_algorithms.h>\n#include <vcg/complex/algorithms/update/topology.h>\n#include <vcg/complex/algorithms/update/bounding.h>\n#include <stdio.h>\n\n#include \"mesh_types.h\"\n#include <QFileInfo>\n#include <QString>\n#include <wrap/io_trimesh/import.h>\n#include <wrap/io_trimesh/export.h>\n\nstd::string pathM,pathF,pathS,pathPatch,pathMeshPatch,pathProject;\n\nTriangleMesh mesh,patch_mesh;\n\nint main(int argc, char *argv[])\n{\n    //MESH LOAD\n    pathM=std::string(argv[1]);\n    QString pathMQ=QString(pathM.c_str());\n    QFileInfo f_infoM(pathMQ);\n    if (!f_infoM.exists())\n    {\n        std::cout<<\"error: mesh fileneme wrong\"<<std::endl;\n        fflush(stdout);\n        exit(0);\n    }\n    else\n        std::cout<<\"Mesh file correct\"<<std::endl;\n    mesh.LoadMesh(pathM.c_str());\n    mesh.UpdateAttributes();\n\n    std::cout<<\"Loaded \"<<mesh.fn<<\" faces\"<<std::endl;\n    std::cout<<\"Loaded \"<<mesh.vn<<\" vertices\"<<std::endl;\n\n    pathProject=pathM;\n    pathProject.erase(pathProject.find_last_of(\".\"));\n\n    //FIELD LOAD\n    pathF=pathProject;\n    pathF.append(\".rosy\");\n    QString pathFQ=QString(pathF.c_str());\n    QFileInfo f_infoF(pathFQ);\n    if (!f_infoF.exists())\n    {\n        printf(\"error: field fileneme wrong\\n\");\n        fflush(stdout);\n        exit(0);\n    }\n    else\n        std::cout<<\"Field file correct\"<<std::endl;\n\n    mesh.LoadField(pathF.c_str());\n    TriangleMesh FieldMesh;\n    mesh.GenerateFieldMesh(FieldMesh);\n    std::string pathFMesh=pathProject;\n    pathFMesh.append(\"_field_mesh.ply\");\n    vcg::tri::io::ExporterPLY<TriangleMesh>::Save(FieldMesh,pathFMesh.c_str(),\n                                                  vcg::tri::io::Mask::IOM_FACECOLOR);\n\n    TriangleMesh SingMesh;\n    mesh.GenerateSingMesh(SingMesh);\n    std::string pathSingMesh=pathProject;\n    pathSingMesh.append(\"_sing_mesh.ply\");\n    vcg::tri::io::ExporterPLY<TriangleMesh>::Save(SingMesh,pathSingMesh.c_str(),\n                                                  vcg::tri::io::Mask::IOM_FACECOLOR);\n//    GenerateSingMesh(TriangleMesh &SingMesh,\n//                              ScalarType scale=0.01)\n    //SHARP LOAD\n    pathS=pathProject;\n    pathS.append(\".sharp\");\n    QString pathSQ=QString(pathS.c_str());\n    QFileInfo f_infoS(pathSQ);\n    if (!f_infoS.exists())\n    {\n        printf(\"no feature line \\n\");\n        fflush(stdout);\n        exit(0);\n    }\n    else\n    {\n       std::cout<<\"Sharp file correct\"<<std::endl;\n    }\n    mesh.LoadSharpFeatures(pathS);\n    TriangleMesh SharpMesh;\n    mesh.GenerateEdgeSelMesh(SharpMesh,0.02);\n    std::string pathSharpMesh=pathProject;\n    pathSharpMesh.append(\"_sharp_mesh.ply\");\n    vcg::tri::io::ExporterPLY<TriangleMesh>::Save(SharpMesh,pathSharpMesh.c_str(),\n                                                  vcg::tri::io::Mask::IOM_FACECOLOR);\n\n\n    //PATCH MESH LOAD\n    pathMeshPatch=pathProject;\n    pathMeshPatch.append(\"_p0.obj\");\n    QString pathMPQ=QString(pathMeshPatch.c_str());\n    QFileInfo f_infoMP(pathMPQ);\n    if (!f_infoMP.exists())\n    {\n        printf(\"no mesh patch file \\n\");\n        fflush(stdout);\n        exit(0);\n    }\n    else\n    {\n       std::cout<<\"Patch mesh file correct\"<<std::endl;\n    }\n    patch_mesh.LoadMesh(pathMeshPatch.c_str());\n    patch_mesh.UpdateAttributes();\n    std::cout<<\"Loaded \"<<patch_mesh.fn<<\" faces\"<<std::endl;\n    std::cout<<\"Loaded \"<<patch_mesh.vn<<\" vertices\"<<std::endl;\n\n    //PATCH LOAD\n    pathPatch=pathProject;\n    pathPatch.append(\"_p0.patch\");\n    QString pathPQ=QString(pathPatch.c_str());\n    QFileInfo f_infoP(pathPQ);\n    if (!f_infoP.exists())\n    {\n        printf(\"no patch file \\n\");\n        fflush(stdout);\n        exit(0);\n    }\n    else\n    {\n       std::cout<<\"Patch file correct\"<<std::endl;\n    }\n    patch_mesh.loadPatchesIntoQ(pathPatch.c_str());\n    patch_mesh.SelectPatchBorders();\n    patch_mesh.ColorByPartition();\n\n    TriangleMesh BorderPatchMesh;\n    patch_mesh.GenerateEdgeSelMesh(BorderPatchMesh,0.02);\n    std::string pathBorderPatchMesh=pathProject;\n    pathBorderPatchMesh.append(\"_borderpatch_mesh.ply\");\n    vcg::tri::io::ExporterPLY<TriangleMesh>::Save(BorderPatchMesh,pathBorderPatchMesh.c_str(),\n                                                  vcg::tri::io::Mask::IOM_FACECOLOR);\n\n    std::string ColorPatchMesh=pathProject;\n    ColorPatchMesh.append(\"_colorpatch_mesh.ply\");\n    vcg::tri::io::ExporterPLY<TriangleMesh>::Save(patch_mesh,ColorPatchMesh.c_str(),\n                                                  vcg::tri::io::Mask::IOM_FACECOLOR);\n\n\n}\n"
  },
  {
    "path": "components/viz_mesh_results/mesh_types.h",
    "content": "#ifndef DEFAULTMESHTYPES_H\n#define DEFAULTMESHTYPES_H\n\n#include <wrap/io_trimesh/import.h>\n#include <wrap/io_trimesh/import_field.h>\n#include <vcg/complex/complex.h>\n#include <vcg/complex/algorithms/create/platonic.h>\n#include <vcg/complex/algorithms/update/color.h>\n\n/* ----- Triangle mesh ----- */\n\nclass TriangleVertex;\nclass TriangleFace;\nstruct MyTriangleTypes : public vcg::UsedTypes<\n        vcg::Use<TriangleVertex>::AsVertexType,\n        vcg::Use<TriangleFace>::AsFaceType>{};\n\nclass TriangleVertex : public vcg::Vertex<\n        MyTriangleTypes,\n        vcg::vertex::Coord3d,\n        vcg::vertex::Normal3d,\n        vcg::vertex::VFAdj,\n        vcg::vertex::Color4b,\n        vcg::vertex::Qualityd,\n        vcg::vertex::BitFlags,\n        vcg::vertex::CurvatureDird>{};\n\nclass TriangleFace : public vcg::Face<\n        MyTriangleTypes,\n        vcg::face::VertexRef,\n        vcg::face::Normal3d,\n        vcg::face::Color4b,\n        vcg::face::Qualityd,\n        vcg::face::BitFlags,\n        vcg::face::FFAdj,\n        vcg::face::VFAdj,\n        vcg::face::CurvatureDird,\n        vcg::face::Mark,\n        vcg::face::WedgeTexCoord2d> {};\n\nclass TriangleMesh : public vcg::tri::TriMesh<\n        std::vector<TriangleVertex>,\n        std::vector<TriangleFace> >\n{\npublic:\n\n    bool LoadMesh(std::string filename)\n    {\n        Clear();\n        if(filename.empty()) return false;\n        int position0=filename.find(\".ply\");\n        int position1=filename.find(\".obj\");\n        int position2=filename.find(\".off\");\n\n        if (position0!=-1)\n        {\n            int err=vcg::tri::io::ImporterPLY<TriangleMesh>::Open(*this,filename.c_str());\n            if (err!=vcg::ply::E_NOERROR)return false;\n            return true;\n        }\n        if (position1!=-1)\n        {\n            int mask;\n            vcg::tri::io::ImporterOBJ<TriangleMesh>::LoadMask(filename.c_str(),mask);\n            int err=vcg::tri::io::ImporterOBJ<TriangleMesh>::Open(*this,filename.c_str(),mask);\n            if ((err!=0)&&(err!=5))return false;\n            return true;\n        }\n        if (position2!=-1)\n        {\n            int err=vcg::tri::io::ImporterOFF<TriangleMesh>::Open(*this,filename.c_str());\n            if (err!=0)return false;\n            return true;\n        }\n        return false;\n    }\n\n    bool LoadField(std::string field_filename)\n    {\n        int position0=field_filename.find(\".ffield\");\n        int position1=field_filename.find(\".rosy\");\n\n\n        if (position0!=-1)\n        {\n            bool loaded=vcg::tri::io::ImporterFIELD<TriangleMesh>::LoadFFIELD(*this,field_filename.c_str());\n            if (!loaded)return false;\n            vcg::tri::CrossField<TriangleMesh>::OrientDirectionFaceCoherently(*this);\n            vcg::tri::CrossField<TriangleMesh>::UpdateSingularByCross(*this,true);\n            return true;\n        }\n        if (position1!=-1)\n        {\n            std::cout<<\"Importing ROSY field\"<<std::endl;\n            bool loaded=vcg::tri::io::ImporterFIELD<TriangleMesh>::Load4ROSY(*this,field_filename.c_str());\n            std::cout<<\"Imported ROSY field\"<<std::endl;\n            if (!loaded)return false;\n            vcg::tri::CrossField<TriangleMesh>::OrientDirectionFaceCoherently(*this);\n            vcg::tri::CrossField<TriangleMesh>::UpdateSingularByCross(*this,true);\n            return true;\n        }\n        return false;\n    }\n\n    void UpdateAttributes()\n    {\n        vcg::tri::UpdateNormal<TriangleMesh>::PerFaceNormalized(*this);\n        vcg::tri::UpdateNormal<TriangleMesh>::PerVertexNormalized(*this);\n        vcg::tri::UpdateBounding<TriangleMesh>::Box(*this);\n        vcg::tri::UpdateTopology<TriangleMesh>::FaceFace(*this);\n        vcg::tri::UpdateTopology<TriangleMesh>::VertexFace(*this);\n        vcg::tri::UpdateFlags<TriangleMesh>::FaceBorderFromFF(*this);\n        vcg::tri::UpdateFlags<TriangleMesh>::VertexBorderFromFaceBorder(*this);\n    }\n\n    bool LoadSharpFeatures(std::string &FeaturePath)\n    {\n        std::cout<<\"Loading Sharp Features\"<<std::endl;\n        FILE *f=NULL;\n        f=fopen(FeaturePath.c_str(),\"rt\");\n        if(f==NULL) return false;\n        int Num=0;\n        fscanf(f,\"%d\\n\",&Num);\n        std::cout<<\"Num \"<<Num<<std::endl;\n        for (size_t i=0;i<(size_t)Num;i++)\n        {\n            int FIndex,EIndex;\n            int FType;\n            fscanf(f,\"%d,%d,%d\\n\",&FType,&FIndex,&EIndex);\n            assert(FIndex>=0);\n            assert(FIndex<(int)face.size());\n            assert(EIndex>=0);\n            assert(EIndex<4);\n            face[FIndex].SetFaceEdgeS(EIndex);\n        }\n        fclose(f);\n        std::cout<<\"Loaded Sharp Features\"<<std::endl;\n        return true;\n    }\n\n\n\n    void loadPatchesIntoQ(const std::string& filename)\n    {\n        std::ifstream input;\n        input.open(filename.c_str());\n        if (!input.is_open())\n        {\n            std::cout<<\"ERROR LOADING PATCH FILE\"<<std::endl;\n            exit(0);\n        }\n\n        size_t numFaces;\n        input >> numFaces;\n\n        for (size_t i=0; i < numFaces;i++)\n        {\n            int CurrP;\n            input >> CurrP;\n            face[i].Q()=CurrP;\n        }\n\n        input.close();\n    }\n\n    void GenerateSingMesh(TriangleMesh &SingMesh,\n                          ScalarType scale=0.005)\n    {\n       SingMesh.Clear();\n        // query if an attribute is present or not\n       bool hasSingular = vcg::tri::HasPerVertexAttribute(*this,std::string(\"Singular\"));\n       bool hasSingularIndex = vcg::tri::HasPerVertexAttribute(*this,std::string(\"SingularIndex\"));\n\n       if (!hasSingular)return;\n       if(!hasSingularIndex)return;\n\n       typename MeshType::template PerVertexAttributeHandle<bool> Handle_Singular;\n       Handle_Singular=vcg::tri::Allocator<MeshType>::template GetPerVertexAttribute<bool>(*this,std::string(\"Singular\"));\n       typename MeshType::template PerVertexAttributeHandle<int> Handle_SingularIndex;\n       Handle_SingularIndex =vcg::tri::Allocator<MeshType>::template GetPerVertexAttribute<int>(*this,std::string(\"SingularIndex\"));\n\n       ScalarType sizeP=bbox.Diag()*scale;\n       for (size_t i=0;i<vert.size();i++)\n       {\n           if (vert[i].IsD())continue;\n           if (!Handle_Singular[i])continue;\n\n\n           int SingIndex=Handle_SingularIndex[i];\n\n           vcg::Color4b colSing;\n\n           switch (SingIndex)\n           {\n             case 1:colSing=vcg::Color4b(0,0,255,255);      break;\n             case 2:colSing=vcg::Color4b(0,255,0,255);    break;\n             case 3:colSing=vcg::Color4b(255,0,0,255);      break;\n             case 4:colSing=vcg::Color4b(255,255,0,255);      break;\n             default:colSing=vcg::Color4b(255,0,255,255);\n           }\n\n           TriangleMesh vertMesh;\n           vcg::tri::Sphere<TriangleMesh>(vertMesh);\n           for (size_t j=0;j<vertMesh.vert.size();j++)\n           {\n               vertMesh.vert[j].P()*=sizeP;\n               vertMesh.vert[j].P()+=vert[i].P();\n           }\n\n           vcg::tri::UpdateColor<TriangleMesh>::PerFaceConstant(vertMesh,colSing);\n           vcg::tri::Append<TriangleMesh,TriangleMesh>::Mesh(SingMesh,vertMesh);\n       }\n    }\n\n    void GenerateFieldMesh(TriangleMesh &FieldMesh,\n                           ScalarType scale=0.01)\n    {\n        FieldMesh.Clear();\n        ScalarType sizeF=bbox.Diag()*scale;\n        for (size_t i=0;i<face.size();i++)\n        {\n            CoordType Pos0=(face[i].P(0)+face[i].P(1)+face[i].P(2))/3;\n            CoordType Dir[4];\n            Dir[0]=face[i].PD1();\n            Dir[1]=face[i].PD2();\n            Dir[2]=-face[i].PD1();\n            Dir[3]=-face[i].PD2();\n            CoordType Pos[4];\n            for (size_t j=0;j<4;j++)\n                Pos[j]=Pos0+Dir[j]*sizeF;\n\n            for (size_t j=0;j<4;j++)\n            {\n                TriangleMesh cylMesh;\n                vcg::tri::OrientedCylinder<TriangleMesh>(cylMesh, Pos0, Pos[j], sizeF/20, true,4,4);\n                vcg::tri::UpdateColor<TriangleMesh>::PerFaceConstant(cylMesh,vcg::Color4b::Black);\n                vcg::tri::Append<TriangleMesh,TriangleMesh>::Mesh(FieldMesh,cylMesh);\n            }\n        }\n        FieldMesh.UpdateAttributes();\n    }\n\n    void GenerateEdgeSelMesh(TriangleMesh &SharpMesh,ScalarType scale=0.01)\n    {\n        SharpMesh.Clear();\n        ScalarType sizeS=bbox.Diag()*scale;\n        for (size_t i=0;i<face.size();i++)\n        {\n            for (size_t j=0;j<3;j++)\n            {\n                bool IsB=vcg::face::IsBorder(face[i],j);\n                bool IsS=face[i].IsFaceEdgeS(j);\n                if (!IsB)\n                    IsS|=face[i].FFp(j)->IsFaceEdgeS(face[i].FFi(j));\n\n                bool Order=(face[i].V0(j)<face[i].V1(j));\n                bool AddCyl=IsB;\n                AddCyl|=(IsS && Order);\n                if (!AddCyl)continue;\n                CoordType Pos0=face[i].P0(j);\n                CoordType Pos1=face[i].P1(j);\n                TriangleMesh cylMesh;\n                vcg::tri::OrientedCylinder<TriangleMesh>(cylMesh, Pos0, Pos1, sizeS/10, true,4,4);\n                vcg::tri::UpdateColor<TriangleMesh>::PerFaceConstant(cylMesh,vcg::Color4b::Green);\n                vcg::tri::Append<TriangleMesh,TriangleMesh>::Mesh(SharpMesh,cylMesh);\n            }\n        }\n        SharpMesh.UpdateAttributes();\n    }\n\n    void SelectPatchBorders()\n    {\n        vcg::tri::UpdateSelection<TriangleMesh>::FaceClear(*this);\n        for (size_t i=0;i<face.size();i++)\n        {\n            for (size_t j=0;j<3;j++)\n            {\n                bool IsB=vcg::face::IsBorder(face[i],j);\n                if (IsB)\n                {\n                    face[i].SetFaceEdgeS(j);\n                    continue;\n                }\n                int Q0=face[i].Q();\n                int Q1=face[i].FFp(j)->Q();\n                if (Q0!=Q1)\n                    face[i].SetFaceEdgeS(j);\n            }\n        }\n    }\n\n    void ColorByPartition()\n    {\n        int MaxQ=0;\n        for (size_t i=0;i<face.size();i++)\n            MaxQ=std::max(MaxQ,(int)face[i].Q());\n        for (size_t i=0;i<face.size();i++)\n            face[i].C()=vcg::Color4b::Scatter(MaxQ,face[i].Q());\n    }\n};\n\n\n#endif // DEFAULTMESHTYPES_H\n"
  },
  {
    "path": "components/viz_mesh_results/viz_mesh_results.pro",
    "content": "############################ TARGET AND FLAGS ############################\n\n#App config\nTARGET = viz_mesh_result\nTEMPLATE = app\nCONFIG += c++11\nCONFIG -= app_bundle\n\n#Debug/release optimization flags\nCONFIG(debug, debug|release){\n    DEFINES += DEBUG\n}\nCONFIG(release, debug|release){\n    DEFINES -= DEBUG\n    #just uncomment next line if you want to ignore asserts and got a more optimized binary\n    CONFIG += FINAL_RELEASE\n}\n\n#Final release optimization flag\nFINAL_RELEASE {\n    unix:!macx{\n        QMAKE_CXXFLAGS_RELEASE -= -g -O2\n        QMAKE_CXXFLAGS += -O3 -DNDEBUG\n    }\n}\n\nmacx {\n    QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.13\n    QMAKE_MAC_SDK = macosx10.13\n}\n\n\n############################ LIBRARIES ############################\n\n#Setting library paths and configuration\ninclude(configuration.pri)\n\n#Libigl\n#INCLUDEPATH += $$LIBIGL_PATH/include/\n#QMAKE_CXXFLAGS += -isystem $$LIBIGL_PATH/include/\n\n#Vcglib\nINCLUDEPATH += $$VCGLIB_PATH\n\n#Eigen\nINCLUDEPATH += $$EIGEN_PATH\n\n\n\n############################ PROJECT FILES ############################\n\nSOURCES +=  \\\n    main.cpp \\\n\nHEADERS += \\\n    mesh_types.h \\\n\n#Vcg ply (needed to save ply files)\nHEADERS += \\\n    $$VCGLIB_PATH/wrap/ply/plylib.h\nSOURCES += \\\n    $$VCGLIB_PATH/wrap/ply/plylib.cpp\n"
  },
  {
    "path": "libs/CoMISo/CHANGELOG",
    "content": "#============================================================================================\n\nCoMISo 1.0-rc1:\n- Initial release\n\nCoMISo 1.1:\n- Only 2 external dependencies: header libraries GMM++ and Eigen3\n- Efficient re-solve with updated (system and/or constraints) right hand sides \n\n\nFeatures:\n - /NSolver     -- simple non-linear solver c++ interfaces:\n    * Gurobi [1],\n    * IPOPT [2],\n    * TAO/PETSc [3],\n    * CPLEX [4],\n    * an the inhouse Newton Solver and more!\n\n - /EigenSolver -- interface for large-scale eigenvalue problems ARPACK [5]\n\n - /Solver      -- several interfaces for common linear system solvers:\n    * sparse Cholesky (Cholmod, LDLT)\n    * SparseQR [6]\n    * TAUCS [7]\n    * UMFPACK  [8]\n    and of course the Constrained and Constrained Mixed Integer Solvers (CoMISo)\n\n\n\nReferences:\n[1] www.gurobi.com\n[2] https://projects.coin-or.org/Ipopt\n[3] http://www.mcs.anl.gov/research/projects/tao/\n[4] http://www-01.ibm.com/software/integration/optimization/cplex-optimizer/\n[5] http://www.caam.rice.edu/software/ARPACK/\n[6] http://www.cise.ufl.edu/research/sparse/SPQR/\n[7] http://www.tau.ac.il/~stoledo/taucs/\n[8] http://www.cise.ufl.edu/research/sparse/umfpack/\n"
  },
  {
    "path": "libs/CoMISo/CMakeLists LIBIGL.txt",
    "content": "cmake_minimum_required (VERSION 2.6)\r\n\r\nproject(CoMISo)\r\n\r\nSET(CMAKE_SKIP_RPATH  TRUE)\r\n\r\n# add our macro directory to cmake search path\r\nset (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake)\r\n\r\ninclude (ACGCommon)\r\n\r\nif (false)\r\nacg_qt4 ()\r\n# change to 0 if QT should not be used\r\nset( WANT_COMISO_QT 0 )\r\nif( QT4_FOUND)\r\n  #message( WARNING \" QT4 FOUND\" )\r\n  if( WANT_COMISO_QT )\r\n    add_definitions (-DQT4_FOUND)\r\n  #  message( WARNING \" USING QT4\" )\r\n  endif ()\r\n  set (COMISO_QT4_CONFIG_FILE_SETTINGS \"#define COMISO_QT4_AVAILABLE 1\" )\r\nelse()\r\n  set (COMISO_QT4_CONFIG_FILE_SETTINGS \"#define COMISO_QT4_AVAILABLE 0\" )\r\nendif ()\r\nendif(false)\r\n\r\nacg_get_version ()\r\n\r\ninclude (ACGOutput)\r\n\r\nset(COMISO_INCLUDE_DIRECTORIES \"\")\r\nset(COMISO_LINK_DIRECTORIES \"\")\r\nset(COMISO_LINK_LIBRARIES \"\")\r\nlist( APPEND COMISO_INCLUDE_DIRECTORIES \"${CMAKE_CURRENT_SOURCE_DIR}/gmm/include\" )\r\nlist( APPEND COMISO_INCLUDE_DIRECTORIES \"${CMAKE_CURRENT_SOURCE_DIR}/../libigl/external/nanogui/ext/eigen\" )\r\n\r\nset (COMISO_Eigen3_CONFIG_FILE_SETTINGS \"#define COMISO_Eigen3_AVAILABLE 1\" )\r\nset (COMISO_GMM_CONFIG_FILE_SETTINGS \"#define COMISO_GMM_AVAILABLE 1\" )\r\n\r\n\r\n# We require cgal with its blas on windows\r\nif (WIN32)\r\n  find_package(CGAL)\r\n  if (CGAL_FOUND)\r\n    list( APPEND COMISO_INCLUDE_DIRECTORIES ${CGAL_INCLUDE_DIR} )\r\n    list( APPEND COMISO_LINK_DIRECTORIES   ${CGAL_LIBRARY_DIR} )\r\n    list( APPEND COMISO_LINK_LIBRARIES  ${CGAL_LIBRARIES} )\r\n  endif()\r\nendif()\r\n\r\nfind_package (BLAS)\r\nif (BLAS_FOUND )\r\n  set (COMISO_BLAS_CONFIG_FILE_SETTINGS \"#define COMISO_BLAS_AVAILABLE 1\" )\r\n  \r\n  list( APPEND COMISO_INCLUDE_DIRECTORIES ${BLAS_INCLUDE_DIRS} )\r\n  list( APPEND COMISO_LINK_DIRECTORIES   ${BLAS_LIBRARY_DIRS} )\r\n  list( APPEND COMISO_LINK_LIBRARIES  ${BLAS_LIBRARIES} )\r\nelse()\r\n  set (COMISO_BLAS_CONFIG_FILE_SETTINGS \"#define COMISO_BLAS_AVAILABLE 0\" )\r\n  message (FATAL_ERROR \"BLAS not found!\")\r\nendif ()\r\n\r\ninclude_directories (\r\n  ..\r\n  ${CMAKE_CURRENT_SOURCE_DIR}\r\n  ${CMAKE_CURRENT_SOURCE_DIR}/../\r\n  ${CMAKE_CURRENT_BINARY_DIR}\r\n  ${COMISO_INCLUDE_DIRECTORIES}\r\n)\r\n\r\n# generate dllexport macros on windows\r\nif (WIN32)\r\n  add_definitions(-DCOMISODLL)\r\nendif ()\r\n\r\n\r\nlink_directories (\r\n  ${COMISO_LINK_DIRECTORIES}\r\n)\r\n\r\n# source code directories\r\nset (directories \r\n  .\r\n  Solver\r\n  NSolver\r\n  EigenSolver\r\n  Config\r\n  Utils\r\n  QtWidgets\r\n)\r\n\r\n# generate dllexport macros on windows\r\nif (WIN32)\r\n  add_definitions(-DCOMISODLL)\r\nendif ()\r\n\r\nif (WIN32)\r\n  add_definitions(\r\n      -D_USE_MATH_DEFINES -DNOMINMAX\r\n  )\r\nendif ()\r\n\r\n# collect all header,source and ui files\r\nacg_append_files (headers \"*.hh\" ${directories})\r\nacg_append_files (sources \"*.cc\" ${directories})\r\nacg_append_files (ui \"*.ui\" ${directories})\r\n\r\n\r\nmacro (of_list_filter _list)\r\n  if (WIN32)\r\n   foreach (_element ${${_list}})\r\n     if (_element MATCHES \"gnuplot_i\\\\.(cc|hh)$\")\r\n       list (REMOVE_ITEM ${_list} ${_element})\r\n     endif ()\r\n   endforeach ()\r\n  endif ()\r\nendmacro ()\r\n\r\nof_list_filter  ( headers )\r\nof_list_filter  ( sources )\r\n\r\n\r\n# remove template cc files from source file list\r\nacg_drop_templates (sources)\r\n\r\nif( QT4_FOUND)\r\n# genereate uic and moc targets\r\nacg_qt4_autouic (uic_targets ${ui})\r\nacg_qt4_automoc (moc_targets ${headers})\r\nendif()\r\nacg_add_library (CoMISo SHARED ${uic_targets} ${sources} ${headers} ${moc_targets})\r\n\r\nif (NOT APPLE)\r\n\ttarget_link_libraries (CoMISo \r\n\t  ${QT_LIBRARIES}\r\n\t  ${COMISO_LINK_LIBRARIES}\r\n\t)\r\nelse(NOT APPLE)\r\n\ttarget_link_libraries (CoMISo\r\n\t  ${QT_LIBRARIES}\r\n\t  ${COMISO_LINK_LIBRARIES}\r\n\t)\r\nendif(NOT APPLE)\r\n\r\n# display results\r\nacg_print_configure_header (COMISO \"CoMISo\")\r\n\r\n# write config file\r\nconfigure_file (\"${CMAKE_CURRENT_SOURCE_DIR}/Config/config.hh.in\"\r\n     \"${CMAKE_CURRENT_SOURCE_DIR}/Config/config.hh\" @ONLY IMMEDIATE)\r\n     \r\n\r\n\r\n"
  },
  {
    "path": "libs/CoMISo/CMakeLists.txt",
    "content": "cmake_minimum_required (VERSION 2.6)\r\n\r\nproject(CoMISo)\r\n\r\nSET(CMAKE_SKIP_RPATH  TRUE)\r\n\r\n# add our macro directory to cmake search path\r\nset (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake)\r\n\r\ninclude (ACGCommon)\r\n\r\nif (false)\r\nacg_qt4 ()\r\n# change to 0 if QT should not be used\r\nset( WANT_COMISO_QT 0 )\r\nif( QT4_FOUND)\r\n  #message( WARNING \" QT4 FOUND\" )\r\n  if( WANT_COMISO_QT )\r\n    add_definitions (-DQT4_FOUND)\r\n  #  message( WARNING \" USING QT4\" )\r\n  endif ()\r\n  set (COMISO_QT4_CONFIG_FILE_SETTINGS \"#define COMISO_QT4_AVAILABLE 1\" )\r\nelse()\r\n  set (COMISO_QT4_CONFIG_FILE_SETTINGS \"#define COMISO_QT4_AVAILABLE 0\" )\r\nendif ()\r\nendif(false)\r\n\r\nacg_get_version ()\r\n\r\ninclude (ACGOutput)\r\n\r\nset(COMISO_INCLUDE_DIRECTORIES \"\")\r\nset(COMISO_LINK_DIRECTORIES \"\")\r\nset(COMISO_LINK_LIBRARIES \"\")\r\nlist( APPEND COMISO_INCLUDE_DIRECTORIES \"${CMAKE_CURRENT_SOURCE_DIR}/gmm/include\" )\r\nlist( APPEND COMISO_INCLUDE_DIRECTORIES \"${CMAKE_CURRENT_SOURCE_DIR}/../eigen\" )\r\n\r\nset (COMISO_Eigen3_CONFIG_FILE_SETTINGS \"#define COMISO_Eigen3_AVAILABLE 1\" )\r\nset (COMISO_GMM_CONFIG_FILE_SETTINGS \"#define COMISO_GMM_AVAILABLE 1\" )\r\n\r\n\r\n# We require cgal with its blas on windows\r\nif (WIN32)\r\n  find_package(CGAL)\r\n  if (CGAL_FOUND)\r\n    list( APPEND COMISO_INCLUDE_DIRECTORIES ${CGAL_INCLUDE_DIR} )\r\n    list( APPEND COMISO_LINK_DIRECTORIES   ${CGAL_LIBRARY_DIR} )\r\n    list( APPEND COMISO_LINK_LIBRARIES  ${CGAL_LIBRARIES} )\r\n  endif()\r\nendif()\r\n\r\nfind_package (BLAS)\r\nif (BLAS_FOUND )\r\n  set (COMISO_BLAS_CONFIG_FILE_SETTINGS \"#define COMISO_BLAS_AVAILABLE 1\" )\r\n  \r\n  list( APPEND COMISO_INCLUDE_DIRECTORIES ${BLAS_INCLUDE_DIRS} )\r\n  list( APPEND COMISO_LINK_DIRECTORIES   ${BLAS_LIBRARY_DIRS} )\r\n  list( APPEND COMISO_LINK_LIBRARIES  ${BLAS_LIBRARIES} )\r\nelse()\r\n  set (COMISO_BLAS_CONFIG_FILE_SETTINGS \"#define COMISO_BLAS_AVAILABLE 0\" )\r\n  message (FATAL_ERROR \"BLAS not found!\")\r\nendif ()\r\n\r\ninclude_directories (\r\n  ..\r\n  ${CMAKE_CURRENT_SOURCE_DIR}\r\n  ${CMAKE_CURRENT_SOURCE_DIR}/../\r\n  ${CMAKE_CURRENT_BINARY_DIR}\r\n  ${COMISO_INCLUDE_DIRECTORIES}\r\n)\r\n\r\n# generate dllexport macros on windows\r\nif (WIN32)\r\n  add_definitions(-DCOMISODLL)\r\nendif ()\r\n\r\n\r\nlink_directories (\r\n  ${COMISO_LINK_DIRECTORIES}\r\n)\r\n\r\n# source code directories\r\nset (directories \r\n  .\r\n  Solver\r\n  NSolver\r\n  EigenSolver\r\n  Config\r\n  Utils\r\n  QtWidgets\r\n)\r\n\r\n# generate dllexport macros on windows\r\nif (WIN32)\r\n  add_definitions(-DCOMISODLL)\r\nendif ()\r\n\r\nif (WIN32)\r\n  add_definitions(\r\n      -D_USE_MATH_DEFINES -DNOMINMAX\r\n  )\r\nendif ()\r\n\r\n# collect all header,source and ui files\r\nacg_append_files (headers \"*.hh\" ${directories})\r\nacg_append_files (sources \"*.cc\" ${directories})\r\nacg_append_files (ui \"*.ui\" ${directories})\r\n\r\n\r\nmacro (of_list_filter _list)\r\n  if (WIN32)\r\n   foreach (_element ${${_list}})\r\n     if (_element MATCHES \"gnuplot_i\\\\.(cc|hh)$\")\r\n       list (REMOVE_ITEM ${_list} ${_element})\r\n     endif ()\r\n   endforeach ()\r\n  endif ()\r\nendmacro ()\r\n\r\nof_list_filter  ( headers )\r\nof_list_filter  ( sources )\r\n\r\n\r\n# remove template cc files from source file list\r\nacg_drop_templates (sources)\r\n\r\nif( QT4_FOUND)\r\n# genereate uic and moc targets\r\nacg_qt4_autouic (uic_targets ${ui})\r\nacg_qt4_automoc (moc_targets ${headers})\r\nendif()\r\nacg_add_library (CoMISo SHARED ${uic_targets} ${sources} ${headers} ${moc_targets})\r\n\r\nif (NOT APPLE)\r\n\ttarget_link_libraries (CoMISo \r\n\t  ${QT_LIBRARIES}\r\n\t  ${COMISO_LINK_LIBRARIES}\r\n\t)\r\nelse(NOT APPLE)\r\n\ttarget_link_libraries (CoMISo\r\n\t  ${QT_LIBRARIES}\r\n\t  ${COMISO_LINK_LIBRARIES}\r\n\t)\r\nendif(NOT APPLE)\r\n\r\n# display results\r\nacg_print_configure_header (COMISO \"CoMISo\")\r\n\r\n# write config file\r\nconfigure_file (\"${CMAKE_CURRENT_SOURCE_DIR}/Config/config.hh.in\"\r\n     \"${CMAKE_CURRENT_SOURCE_DIR}/Config/config.hh\" @ONLY IMMEDIATE)\r\n     \r\n\r\n\r\n"
  },
  {
    "path": "libs/CoMISo/CMakeListsOLD.txt",
    "content": "cmake_minimum_required (VERSION 2.6)\r\n\r\nproject(CoMISo)\r\n\r\n# add our macro directory to cmake search path\r\nset (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake)\r\n\r\ninclude (ACGCommon)\r\n\r\nacg_qt4 ()\r\n# change to 0 if QT should not be used\r\nset( WANT_COMISO_QT 1 )\r\nif( QT4_FOUND)\r\n  #message( WARNING \" QT4 FOUND\" )\r\n  if( WANT_COMISO_QT )\r\n    add_definitions (-DQT4_FOUND)\r\n  #  message( WARNING \" USING QT4\" )\r\n  endif ()\r\n  set (COMISO_QT4_CONFIG_FILE_SETTINGS \"#define COMISO_QT4_AVAILABLE 1\" )\r\nelse()\r\n  set (COMISO_QT4_CONFIG_FILE_SETTINGS \"#define COMISO_QT4_AVAILABLE 0\" )\r\nendif ()\r\n\r\nacg_get_version ()\r\n\r\ninclude (ACGOutput)\r\n\r\nset(COMISO_INCLUDE_DIRECTORIES ““)\r\nset(COMISO_LINK_DIRECTORIES \"\")\r\nset(COMISO_LINK_LIBRARIES \"\")\r\n#set(GMM_INCLUDE_DIR “”)\n\r\nfind_package (GMM)\r\nif (GMM_FOUND)\r\n  set (COMISO_GMM_CONFIG_FILE_SETTINGS \"#define COMISO_GMM_AVAILABLE 1\" )\r\n  list( APPEND COMISO_INCLUDE_DIRECTORIES ${GMM_INCLUDE_DIR} )\r\nelse()\r\n  set (COMISO_GMM_CONFIG_FILE_SETTINGS \"#define COMISO_GMM_AVAILABLE 0\" )\r\n  message (FATAL_ERROR \"GMM not found!\")\r\nendif ()\r\n\r\n# We require cgal with its blas on windows\r\nif (WIN32)\r\n  find_package(CGAL)\r\n  if (CGAL_FOUND)\r\n    list( APPEND COMISO_INCLUDE_DIRECTORIES ${CGAL_INCLUDE_DIR} )\r\n    list( APPEND COMISO_LINK_DIRECTORIES   ${CGAL_LIBRARY_DIR} )\r\n    list( APPEND COMISO_LINK_LIBRARIES  ${CGAL_LIBRARIES} )\r\n  endif()\r\nendif()\r\n\r\nfind_package (BLAS)\r\nif (BLAS_FOUND )\r\n  set (COMISO_BLAS_CONFIG_FILE_SETTINGS \"#define COMISO_BLAS_AVAILABLE 1\" )\r\n  \r\n  list( APPEND COMISO_INCLUDE_DIRECTORIES ${BLAS_INCLUDE_DIRS} )\r\n  list( APPEND COMISO_LINK_DIRECTORIES   ${BLAS_LIBRARY_DIRS} )\r\n  list( APPEND COMISO_LINK_LIBRARIES  ${BLAS_LIBRARIES} )\r\nelse()\r\n  set (COMISO_BLAS_CONFIG_FILE_SETTINGS \"#define COMISO_BLAS_AVAILABLE 0\" )\r\n  message (FATAL_ERROR \"BLAS not found!\")\r\nendif ()\r\n\r\nfind_package (SUITESPARSE)\r\nif (SUITESPARSE_FOUND )\r\n  set (COMISO_SUITESPARSE_CONFIG_FILE_SETTINGS \"#define COMISO_SUITESPARSE_AVAILABLE 1\" )\r\n  \r\n  list( APPEND COMISO_INCLUDE_DIRECTORIES ${SUITESPARSE_INCLUDE_DIRS} )\r\n  list( APPEND COMISO_LINK_DIRECTORIES   ${SUITESPARSE_LIBRARY_DIRS} )\r\n  list( APPEND COMISO_LINK_LIBRARIES  ${SUITESPARSE_LIBRARIES} )\r\nelse ()\r\n  message (STATUS \"SUITESPARSE not found!\")\r\n  set (COMISO_SUITESPARSE_CONFIG_FILE_SETTINGS \"#define COMISO_SUITESPARSE_AVAILABLE 0\" )\r\nendif ()\r\n# special handling, since spqr is incorrect in several distributions\r\nif(SUITESPARSE_SPQR_VALID)\r\n  set (COMISO_SUITESPARSE_SPQR_CONFIG_FILE_SETTINGS \"#define COMISO_SUITESPARSE_SPQR_AVAILABLE 1\" )\r\nelse()\r\n  message (STATUS \"SUITESPARSE SPQR seems to be invalid!\")\r\n  set (COMISO_SUITESPARSE_SPQR_CONFIG_FILE_SETTINGS \"#define COMISO_SUITESPARSE_SPQR_AVAILABLE 0\" )\r\nendif()\r\n\r\nfind_package (MPI)\r\nif (MPI_FOUND )\r\n  set (COMISO_MPI_CONFIG_FILE_SETTINGS \"#define COMISO_MPI_AVAILABLE 1\" )\r\n  list( APPEND COMISO_INCLUDE_DIRECTORIES ${MPI_INCLUDE_PATH} )\r\n  list( APPEND COMISO_LINK_LIBRARIES  ${MPI_CXX_LIBRARIES} )\r\nelse ()\r\n  message (STATUS \"MPI not found!\")\r\n  set (COMISO_MPI_CONFIG_FILE_SETTINGS \"#define COMISO_MPI_AVAILABLE 0\" )\r\nendif ()\r\n\r\nfind_package (PETSC)\r\nif (PETSC_FOUND AND MPI_FOUND)\r\n  set (COMISO_PETSC_CONFIG_FILE_SETTINGS \"#define COMISO_PETSC_AVAILABLE 1\" )\r\n  list( APPEND COMISO_INCLUDE_DIRECTORIES ${PETSC_INCLUDE_DIRS} )\r\n  list( APPEND COMISO_LINK_DIRECTORIES ${PETSC_LIBRARY_DIR} )\r\n  list( APPEND COMISO_LINK_LIBRARIES  ${PETSC_LIBRARY} )\r\nelse ()\r\n  message (STATUS \"PETSC or dependency not found!\")\r\n  set (COMISO_PETSC_CONFIG_FILE_SETTINGS \"#define COMISO_PETSC_AVAILABLE 0\" )\r\nendif ()\r\n\r\n\r\nfind_package (TAO)\r\nif (TAO_FOUND AND PETSC_FOUND AND MPI_FOUND)\r\n  set (COMISO_TAO_CONFIG_FILE_SETTINGS \"#define COMISO_TAO_AVAILABLE 1\" )\r\n  list( APPEND COMISO_INCLUDE_DIRECTORIES ${TAO_INCLUDE_DIRS} )\r\n  list( APPEND COMISO_LINK_DIRECTORIES ${TAO_LIBRARY_DIR} )\r\n  list( APPEND COMISO_LINK_LIBRARIES  ${TAO_LIBRARY} )\r\nelse ()\r\n  message (STATUS \"TAO or dependency not found!\")\r\n  set (COMISO_TAO_CONFIG_FILE_SETTINGS \"#define COMISO_TAO_AVAILABLE 0\" )\r\nendif ()\r\n\r\nfind_package (METIS)\r\nif (METIS_FOUND )\r\n  set (COMISO_METIS_CONFIG_FILE_SETTINGS \"#define COMISO_METIS_AVAILABLE 1\" )\r\n  \r\n  list( APPEND COMISO_INCLUDE_DIRECTORIES ${METIS_INCLUDE_DIRS} )\r\n  list( APPEND COMISO_LINK_DIRECTORIES   ${METIS_LIBRARY_DIRS} )\r\n  list( APPEND COMISO_LINK_LIBRARIES  ${METIS_LIBRARIES} )\r\nelse()\r\n  set (COMISO_METIS_CONFIG_FILE_SETTINGS \"#define COMISO_METIS_AVAILABLE 0\" )\r\n  message (STATUS \"METIS not found!\")\r\nendif ()\r\n\r\nfind_package (MUMPS)\r\nif (MUMPS_FOUND )\r\n  set (COMISO_MUMPS_CONFIG_FILE_SETTINGS \"#define COMISO_MUMPS_AVAILABLE 1\" )\r\n  list( APPEND COMISO_INCLUDE_DIRECTORIES ${MUMPS_INCLUDE_DIR} )\r\n  list( APPEND COMISO_LINK_LIBRARIES ${MUMPS_LIBRARY} )\r\nelse ()\r\n  message (STATUS \"MUMPS not found!\")\r\n  set (COMISO_MUMPS_CONFIG_FILE_SETTINGS \"#define COMISO_MUMPS_AVAILABLE 0\" )\r\nendif ()\r\n\r\nfind_package (IPOPT)\r\nif (IPOPT_FOUND)\r\n  set (COMISO_IPOPT_CONFIG_FILE_SETTINGS \"#define COMISO_IPOPT_AVAILABLE 1\" )\r\n  list( APPEND COMISO_INCLUDE_DIRECTORIES ${IPOPT_INCLUDE_DIR} )\r\n  list( APPEND COMISO_LINK_DIRECTORIES ${IPOPT_LIBRARY_DIR} )\r\n  list( APPEND COMISO_LINK_LIBRARIES ${IPOPT_LIBRARY} )\r\n  if ( IPOPT_HSL_LIBRARY_DIR )\r\n\tset (COMISO_HSL_CONFIG_FILE_SETTINGS \"#define COMISO_HSL_AVAILABLE 1\" )\r\n  else ()\r\n\tset (COMISO_HSL_CONFIG_FILE_SETTINGS \"#define COMISO_HSL_AVAILABLE 0\" )\r\n  endif()\r\nelse ()\r\n  message (STATUS \"IPOPT or dependency not found!\")\r\n  set (COMISO_IPOPT_CONFIG_FILE_SETTINGS \"#define COMISO_IPOPT_AVAILABLE 0\" )\r\n  set (COMISO_HSL_CONFIG_FILE_SETTINGS \"#define COMISO_HSL_AVAILABLE 0\" )\r\nendif ()\r\n\r\nfind_package (Eigen3)\r\nif (Eigen3_FOUND )\r\n  set (COMISO_Eigen3_CONFIG_FILE_SETTINGS \"#define COMISO_Eigen3_AVAILABLE 1\" )\r\n  list( APPEND COMISO_INCLUDE_DIRECTORIES ${Eigen3_INCLUDE_DIR} )\r\nelse ()\r\n  message (STATUS \"Eigen3 not found!\")\r\n  set (COMISO_Eigen3_CONFIG_FILE_SETTINGS \"#define COMISO_Eigen3_AVAILABLE 0\" )\r\nendif ()\r\n\r\nfind_package (Taucs)\r\nif (TAUCS_FOUND )\r\n  set (COMISO_TAUCS_CONFIG_FILE_SETTINGS \"#define COMISO_TAUCS_AVAILABLE 1\" )\r\n  list( APPEND COMISO_INCLUDE_DIRECTORIES ${TAUCS_INCLUDE_DIR} )\r\n  list( APPEND COMISO_INCLUDE_DIRECTORIES ${LAPACK_INCLUDE_DIR} )\r\n  list( APPEND COMISO_LINK_DIRECTORIES    ${LAPACK_LIBRARY_DIR} )\r\n  list( APPEND COMISO_LINK_LIBRARIES  ${TAUCS_LIBRARY} )\r\n  list( APPEND COMISO_LINK_LIBRARIES  ${LAPACK_LIBRARIES} )\r\nelse ()\r\n  message (STATUS \"TAUCS not found!\")\r\n  set (COMISO_TAUCS_CONFIG_FILE_SETTINGS \"#define COMISO_TAUCS_AVAILABLE 0\" )\r\nendif ()\r\n\r\nfind_package (GUROBI)\r\nif (GUROBI_FOUND )\r\n  set (COMISO_GUROBI_CONFIG_FILE_SETTINGS \"#define COMISO_GUROBI_AVAILABLE 1\" )\r\n  list( APPEND COMISO_INCLUDE_DIRECTORIES ${GUROBI_INCLUDE_DIR} )\r\n  list( APPEND COMISO_LINK_DIRECTORIES    ${GUROBI_LIBRARY_DIR} )\r\n  list( APPEND COMISO_LINK_LIBRARIES  ${GUROBI_LIBRARY} )\r\nelse ()\r\n  message (STATUS \"GUROBI not found!\")\r\n  set (COMISO_GUROBI_CONFIG_FILE_SETTINGS \"#define COMISO_GUROBI_AVAILABLE 0\" )\r\nendif ()\r\n\r\nfind_package (ARPACK)\r\nif (ARPACK_FOUND )\r\n  set (COMISO_ARPACK_CONFIG_FILE_SETTINGS \"#define COMISO_ARPACK_AVAILABLE 1\" )\r\n  list( APPEND COMISO_INCLUDE_DIRECTORIES ${ARPACK_INCLUDE_DIR} )\r\n#  list( APPEND COMISO_LINK_DIRECTORIES    ${ARPACK_LIBRARY_DIR} )\r\n  list( APPEND COMISO_LINK_LIBRARIES  ${ARPACK_LIBRARY} )\r\nelse ()\r\n  message (STATUS \"ARPACK not found!\")\r\n  set (COMISO_ARPACK_CONFIG_FILE_SETTINGS \"#define COMISO_ARPACK_AVAILABLE 0\" )\r\nendif ()\r\n\r\nfind_package (CPLEX)\r\nif (CPLEX_FOUND )\r\n  set (COMISO_CPLEX_CONFIG_FILE_SETTINGS \"#define COMISO_CPLEX_AVAILABLE 1\" )\r\n  list( APPEND COMISO_INCLUDE_DIRECTORIES ${CPLEX_INCLUDE_DIRS} )\r\n#  list( APPEND COMISO_LINK_DIRECTORIES    ${CPLEX_LIBRARY_DIR} )\r\n#  list( APPEND COMISO_LINK_DIRECTORIES    ${CPLEX_CONCERT_LIBRARY_DIR} )\r\n  list( APPEND COMISO_LINK_LIBRARIES  ${CPLEX_LIBRARIES} )\r\n  \r\n  #enable c++ support\r\n   add_definitions(-DIL_STD)\r\nelse ()\r\n  message (STATUS \"CPLEX not found!\")\r\n  set (COMISO_CPLEX_CONFIG_FILE_SETTINGS \"#define COMISO_CPLEX_AVAILABLE 0\" )\r\nendif ()\r\n\r\ninclude_directories (\r\n  ..\r\n  ${CMAKE_CURRENT_SOURCE_DIR}\r\n  ${CMAKE_CURRENT_SOURCE_DIR}/../\r\n  ${CMAKE_CURRENT_BINARY_DIR}\r\n  ${COMISO_INCLUDE_DIRECTORIES}\r\n)\r\n\r\n# generate dllexport macros on windows\r\nif (WIN32)\r\n  add_definitions(-DCOMISODLL)\r\nendif ()\r\n\r\n\r\nlink_directories (\r\n  ${COMISO_LINK_DIRECTORIES}\r\n)\r\n\r\n# source code directories\r\nset (directories \r\n  .\r\n  Solver\r\n  NSolver\r\n  EigenSolver\r\n  Config\r\n  Utils\r\n  QtWidgets\r\n)\r\n\r\n# generate dllexport macros on windows\r\nif (WIN32)\r\n  add_definitions(-DCOMISODLL)\r\nendif ()\r\n\r\nif (WIN32)\r\n  add_definitions(\r\n      -D_USE_MATH_DEFINES -DNOMINMAX\r\n  )\r\nendif ()\r\n\r\n# collect all header,source and ui files\r\nacg_append_files (headers \"*.hh\" ${directories})\r\nacg_append_files (sources \"*.cc\" ${directories})\r\nacg_append_files (ui \"*.ui\" ${directories})\r\n\r\n\r\nmacro (of_list_filter _list)\r\n  if (WIN32)\r\n   foreach (_element ${${_list}})\r\n     if (_element MATCHES \"gnuplot_i\\\\.(cc|hh)$\")\r\n       list (REMOVE_ITEM ${_list} ${_element})\r\n     endif ()\r\n   endforeach ()\r\n  endif ()\r\nendmacro ()\r\n\r\nof_list_filter  ( headers )\r\nof_list_filter  ( sources )\r\n\r\n\r\n# remove template cc files from source file list\r\nacg_drop_templates (sources)\r\n\r\nif( QT4_FOUND)\r\n# genereate uic and moc targets\r\nacg_qt4_autouic (uic_targets ${ui})\r\nacg_qt4_automoc (moc_targets ${headers})\r\nendif()\r\nacg_add_library (CoMISo SHARED ${uic_targets} ${sources} ${headers} ${moc_targets})\r\n\r\nif (NOT APPLE)\r\n\ttarget_link_libraries (CoMISo \r\n\t  ${QT_LIBRARIES}\r\n\t  ${COMISO_LINK_LIBRARIES}\r\n\t)\r\nelse(NOT APPLE)\r\n\ttarget_link_libraries (CoMISo\r\n\t  ${QT_LIBRARIES}\r\n\t  ${COMISO_LINK_LIBRARIES}\r\n\t)\r\nendif(NOT APPLE)\r\n\r\n# display results\r\nacg_print_configure_header (COMISO \"CoMISo\")\r\n\r\n# write config file\r\nconfigure_file (\"${CMAKE_CURRENT_SOURCE_DIR}/Config/config.hh.in\"\r\n     \"${CMAKE_CURRENT_SOURCE_DIR}/Config/config.hh\" @ONLY IMMEDIATE)\r\n     \r\n     \r\n     \r\n#######################################################################\r\n# Configure the examples last to be sure, that all configure files\r\n# of the library are already there\r\n#######################################################################\r\nif( EXISTS \"${CMAKE_SOURCE_DIR}/Examples/factored_solver/CMakeLists.txt\" )\r\n\tadd_subdirectory (Examples/factored_solver)\r\nendif()\r\n\r\nif( EXISTS \"${CMAKE_SOURCE_DIR}/Examples/quadratic_solver/CMakeLists.txt\" )\r\n\tadd_subdirectory (Examples/quadratic_solver)\r\nendif()\r\nif( EXISTS \"${CMAKE_SOURCE_DIR}/Examples/test2/CMakeLists.txt\" )\r\n\tadd_subdirectory (Examples/test2)\r\nendif()\r\nif( EXISTS \"${CMAKE_SOURCE_DIR}/Examples/small_quadratic_example/CMakeLists.txt\" )\r\n\tadd_subdirectory (Examples/small_quadratic_example)\r\nendif()\r\nif( EXISTS \"${CMAKE_SOURCE_DIR}/Examples/small_factored_example/CMakeLists.txt\" )\r\n\tadd_subdirectory (Examples/small_factored_example)\r\nendif()\r\nif( EXISTS \"${CMAKE_SOURCE_DIR}/Examples/super_sparse_matrix/CMakeLists.txt\" )\r\n\tadd_subdirectory (Examples/super_sparse_matrix)\r\nendif()\r\nif( EXISTS \"${CMAKE_SOURCE_DIR}/Examples/eigen_solver/CMakeLists.txt\" )\r\n\tadd_subdirectory (Examples/eigen_solver)\r\nendif()\r\nif( EXISTS \"${CMAKE_SOURCE_DIR}/Examples/small_nsolver/CMakeLists.txt\" )\r\n\tadd_subdirectory (Examples/small_nsolver)\r\nendif()\r\nif( EXISTS \"${CMAKE_SOURCE_DIR}/Examples/small_eigenproblem/CMakeLists.txt\" )\r\n\tadd_subdirectory (Examples/small_eigenproblem)\r\nendif()\r\nif( EXISTS \"${CMAKE_SOURCE_DIR}/Examples/small_miqp/CMakeLists.txt\" )\r\n\tadd_subdirectory (Examples/small_miqp)\r\nendif()\r\nif( EXISTS \"${CMAKE_SOURCE_DIR}/Examples/small_nleast_squares/CMakeLists.txt\" )\r\n\tadd_subdirectory (Examples/small_nleast_squares)\r\nendif()\r\nif( EXISTS \"${CMAKE_SOURCE_DIR}/Examples/small_sparseqr/CMakeLists.txt\" )\r\n\tadd_subdirectory (Examples/small_sparseqr)\r\nendif()\r\nif( EXISTS \"${CMAKE_SOURCE_DIR}/Examples/small_quadratic_resolve_example/CMakeLists.txt\" )\r\n\tadd_subdirectory (Examples/small_quadratic_resolve_example)\r\nendif()\r\n"
  },
  {
    "path": "libs/CoMISo/COPYING",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://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 <http://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<http://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<http://www.gnu.org/philosophy/why-not-lgpl.html>.\n\n"
  },
  {
    "path": "libs/CoMISo/CoMISo.cmake",
    "content": "# add our macro directory to cmake search path\nset (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake)\n"
  },
  {
    "path": "libs/CoMISo/CoMISo_BUILD_LINUX.txt",
    "content": "#Install\nsudo apt-get install g++\nsudo apt-get install cmake\nsudo apt-get install libboost-dev\nsudo apt-get install libblas-dev\nsudo apt-get install libsuitesparse-dev\n\n#From the directory where this txt file is located:\ncd CoMISo\nrm -r build\nmkdir build\ncd build\ncmake ..\nmake\n"
  },
  {
    "path": "libs/CoMISo/Config/CoMISoDefines.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               CoMISo                                      *\n *      Copyright (C) 2008-2009 by Computer Graphics Group, RWTH Aachen      *\n *                           www.rwth-graphics.de                            *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of CoMISo.                                             *\n *                                                                           *\n *  CoMISo 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 *  CoMISo 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 CoMISo.  If not, see <http://www.gnu.org/licenses/>.          *\n *                                                                           *\n\\*===========================================================================*/ \n\n#ifndef COMISODLLEXPORT\n\t#ifdef WIN32\n\t\t#ifdef COMISODLL\n\t\t\t#ifdef USECOMISO\n\t\t\t\t#define COMISODLLEXPORT __declspec(dllimport)\n\t\t\t\t#define COMISODLLEXPORTONLY \n\t\t\t#else\n\t\t\t\t#define COMISODLLEXPORT __declspec(dllexport)\n\t\t\t\t#define COMISODLLEXPORTONLY __declspec(dllexport)\n\t\t\t#endif\n\t\t#else\t\t\n\t\t\t#define COMISODLLEXPORT\t\n\t\t\t#define COMISODLLEXPORTONLY\n\t\t#endif\n\t#else\n\t\t#define COMISODLLEXPORT\n\t\t#define COMISODLLEXPORTONLY\n\t#endif\n#endif\n\n#undef min\n#undef max\n\n\n"
  },
  {
    "path": "libs/CoMISo/Config/config.hh",
    "content": "// Build time dependencies for CoMiso\n\n\n#define COMISO_BLAS_AVAILABLE 1\n#define COMISO_GMM_AVAILABLE 1\n\n\n\n\n\n\n\n\n\n\n\n\n\n#define COMISO_Eigen3_AVAILABLE 1\n\n\n"
  },
  {
    "path": "libs/CoMISo/Config/config.hh.in",
    "content": "// Build time dependencies for CoMiso\n\n@COMISO_QT4_CONFIG_FILE_SETTINGS@\n@COMISO_BLAS_CONFIG_FILE_SETTINGS@\n@COMISO_GMM_CONFIG_FILE_SETTINGS@\n@COMISO_SUITESPARSE_CONFIG_FILE_SETTINGS@\n@COMISO_SUITESPARSE_SPQR_CONFIG_FILE_SETTINGS@\n@COMISO_MPI_CONFIG_FILE_SETTINGS@\n@COMISO_HSL_CONFIG_FILE_SETTINGS@\n@COMISO_PETSC_CONFIG_FILE_SETTINGS@\n@COMISO_TAO_CONFIG_FILE_SETTINGS@\n@COMISO_IPOPT_CONFIG_FILE_SETTINGS@\n@COMISO_MUMPS_CONFIG_FILE_SETTINGS@\n@COMISO_METIS_CONFIG_FILE_SETTINGS@\n@COMISO_TAUCS_CONFIG_FILE_SETTINGS@\n@COMISO_GUROBI_CONFIG_FILE_SETTINGS@\n@COMISO_ARPACK_CONFIG_FILE_SETTINGS@\n@COMISO_CPLEX_CONFIG_FILE_SETTINGS@\n@COMISO_Eigen3_CONFIG_FILE_SETTINGS@\n\n\n"
  },
  {
    "path": "libs/CoMISo/EigenSolver/ArpackSolver.cc",
    "content": "//=============================================================================\n//\n//  CLASS ArpackSolver - IMPLEMENTATION\n//\n//=============================================================================\n\n#define COMISO_ARPACKSOLVER_C\n\n//== INCLUDES =================================================================\n\n#include \"ArpackSolver.hh\"\n\n//== COMPILE-TIME PACKAGE REQUIREMENTS ========================================\n#if (COMISO_ARPACK_AVAILABLE && COMISO_SUITESPARSE_AVAILABLE && COMISO_Eigen3_AVAILABLE)\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== IMPLEMENTATION ==========================================================\n\n\ntemplate<class MatrixT,class MatrixT2>\nvoid\nArpackSolver::\nsolve(const MatrixT&       _A,\n      std::vector<double>& _eigenvalues,\n      MatrixT2&            _eigenvectors,\n      const int            _n_eigvalues,\n      const char*          _which_eigs  )\n{\n    Matrix A(_A);\n//    ARSymStdEig<double, Matrix> eig_prob(A.matrix().cols(), _n_eigvalues, &A, &Matrix::mult_Mv, (char*)_which_eigs,\n//                                         0, 0.0, 2000);\n\n    ARSymStdEig<double, Matrix> eig_prob(A.matrix().cols(), _n_eigvalues, &A, &Matrix::mult_Mv, (char*)_which_eigs,\n                                         0, 0.0, 100000);\n\n    int n_converged = eig_prob.FindEigenvectors();\n\n    // store result\n    _eigenvalues.resize(n_converged);\n    _eigenvectors.resize(A.matrix().rows(),n_converged);\n\n    for( int i=0; i<n_converged; ++i)\n    {\n      _eigenvalues[i] = eig_prob.Eigenvalue(i);\n      for(int j = 0; j<A.matrix().rows(); ++j)\n        _eigenvectors.coeffRef(j,i) = eig_prob.RawEigenvector(i)[j];\n    }\n}\n\n\n//-----------------------------------------------------------------------------\n\n\ntemplate<class MatrixT,class MatrixT2>\nvoid\nArpackSolver::\nsolve_inverse(const MatrixT&       _A,\n    std::vector<double>& _eigenvalues,\n    MatrixT2&            _eigenvectors,\n    const int            _n_eigvalues,\n    const char*          _which_eigs)\n{\n  Matrix A(_A,true);\n  ARSymStdEig<double, Matrix> eig_prob(A.matrix().cols(), _n_eigvalues, &A, &Matrix::mult_M_inv_v, (char*)_which_eigs,\n      0, 0.0, 2000);\n\n  //    ARSymStdEig(int np, int nevp, ARFOP* objOPp,\n  //                void (ARFOP::* MultOPxp)(ARFLOAT[], ARFLOAT[]),\n  //                char* whichp = \"LM\", int ncvp = 0, ARFLOAT tolp = 0.0,\n  //                int maxitp = 0, ARFLOAT* residp = NULL, bool ishiftp = true);\n\n  int n_converged = eig_prob.FindEigenvectors();\n\n  // store result\n  _eigenvalues.resize(n_converged);\n  _eigenvectors.resize(A.matrix().rows(),n_converged);\n\n  for( int i=0; i<n_converged; ++i)\n  {\n    _eigenvalues[i] = eig_prob.Eigenvalue(i);\n    for(int j = 0; j<A.matrix().rows(); ++j)\n      _eigenvectors.coeffRef(j,i) = eig_prob.RawEigenvector(i)[j];\n  }\n}\n\n\n//-----------------------------------------------------------------------------\n\n\ntemplate<class MatrixT,class MatrixT2>\nvoid\nArpackSolver::\ncheck_result(const MatrixT& _A, std::vector<double>& _eigenvalues, MatrixT2& _eigenvectors)\n{\n  int n=_eigenvectors.rows();\n\n  if(n<20)\n    std::cerr << _A << std::endl;\n\n  for(unsigned int i=0; i<_eigenvalues.size(); ++i)\n  {\n    std::cerr << \"eigenvalue \" << i << \": \" << _eigenvalues[i] << \", \";\n    if(n < 20)\n    {\n      std::cerr << \"eigenvector: \";\n      for(int j=0; j<n; ++j)\n      {\n        std::cerr << _eigenvectors.coeffRef(j,i) << \", \";\n      }\n    }\n\n    // compute residuum\n    Eigen::Matrix<double, Eigen::Dynamic, 1> v = _eigenvectors.block(0,i,n,1);\n    std::cerr << \"residuum norm: \" << (_A*v - _eigenvalues[i]*v).norm() << std::endl;\n  }\n}\n\n//-----------------------------------------------------------------------------\n\n\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n\n//=============================================================================\n#endif // COMISO_SUITESPARSE_AVAILABLE\n//============================================================================="
  },
  {
    "path": "libs/CoMISo/EigenSolver/ArpackSolver.hh",
    "content": "//=============================================================================\n//\n//  CLASS ArpackSolver\n//\n//=============================================================================\n\n\n#ifndef COMISO_ARPACKSOLVER_HH\n#define COMISO_ARPACKSOLVER_HH\n\n//== COMPILE-TIME PACKAGE REQUIREMENTS ========================================\n#include <CoMISo/Config/config.hh>\n#if (COMISO_ARPACK_AVAILABLE && COMISO_SUITESPARSE_AVAILABLE && COMISO_Eigen3_AVAILABLE)\n\n//== INCLUDES =================================================================\n#include <CoMISo/Config/CoMISoDefines.hh>\n\n#include <Eigen/Eigen>\n#include \"EigenArpackMatrixT.hh\"\n\n#include <arpack++/arssym.h>\n\n//== FORWARDDECLARATIONS ======================================================\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== CLASS DEFINITION =========================================================\n\n\n\n\t      \n/** \\class ArpackSolver ArpackSolver.hh <COMISO/.../ArpackSolver.hh>\n\n    Brief Description.\n  \n    A more elaborate description follows.\n*/\n\n\nclass COMISODLLEXPORT ArpackSolver\n{\npublic:\n\n  // sparse matrix type\n  typedef EigenArpackMatrixT<double,Eigen::SparseMatrix<double,Eigen::ColMajor> > Matrix;\n\n\n  /// Constructor\n  ArpackSolver() {}\n \n  /// Destructor\n  ~ArpackSolver() {}\n\n  // solve eigenproblem\n  // number of desired eigenvalues -> _n_eigenvalues\n  // which eigenvalues -> one of {LA (largest algebraic), SA (smalles algebraic), LM (largest magnitude), SM(smallest magnitued), BE(both ends)}\n  template<class MatrixT,class MatrixT2>\n  void solve(const MatrixT&       _A,\n             std::vector<double>& _eigenvalues,\n             MatrixT2&            _eigenvectors,\n             const int            _n_eigvalues = 1,\n             const char*          _which_eigs = \"SM\");\n\n  // solve eigenproblem\n  // number of desired eigenvalues -> _n_eigenvalues\n  // which eigenvalues -> one of {LA (largest algebraic), SA (smalles algebraic), LM (largest magnitude), SM(smallest magnitued), BE(both ends)}\n  template<class MatrixT,class MatrixT2>\n  void solve_inverse(const MatrixT&       _A,\n                     std::vector<double>& _eigenvalues,\n                     MatrixT2&            _eigenvectors,\n                     const int            _n_eigvalues = 1,\n                     const char*          _which_eigs = \"LM\");\n\n\n  // check resulting eigenvalues/eigenvectors\n  template<class MatrixT,class MatrixT2>\n  void check_result(const MatrixT& _A, std::vector<double>& _eigenvalues, MatrixT2& _eigenvectors);\n\nprivate:\n  \n};\n\n\n//=============================================================================\n} // namespace ACG\n//=============================================================================\n#if defined(INCLUDE_TEMPLATES) && !defined(COMISO_ARPACKSOLVER_C)\n#define COMISO_ARPACKSOLVER_TEMPLATES\n#include \"ArpackSolver.cc\"\n#endif\n//=============================================================================\n#endif // COMISO_SUITESPARSE_AVAILABLE\n//=============================================================================\n#endif // ACG_ARPACKSOLVER_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/CoMISo/EigenSolver/EigenArpackMatrixT.cc",
    "content": "//=============================================================================\n//\n//  CLASS EigenArpackMatrixT - IMPLEMENTATION\n//\n//=============================================================================\n\n#define COMISO_EIGENARPACKMATRIXT_C\n\n//== COMPILE-TIME PACKAGE REQUIREMENTS ========================================\n#include <CoMISo/Config/config.hh>\n#if COMISO_SUITESPARSE_AVAILABLE\n//=============================================================================\n\n\n//== INCLUDES =================================================================\n\n#include \"EigenArpackMatrixT.hh\"\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== IMPLEMENTATION ==========================================================\n\n\n\n//-----------------------------------------------------------------------------\n\n\n\n//=============================================================================\n} // namespace ACG\n//=============================================================================\n#endif // COMISO_SUITESPARSE_AVAILABLE\n//=============================================================================\n"
  },
  {
    "path": "libs/CoMISo/EigenSolver/EigenArpackMatrixT.hh",
    "content": "//=============================================================================\n//\n//  CLASS EigenArpackMatrixT\n//\n//=============================================================================\n\n\n#ifndef COMISO_EIGENARPACKMATRIXT_HH\n#define COMISO_EIGENARPACKMATRIXT_HH\n\n//== COMPILE-TIME PACKAGE REQUIREMENTS ========================================\n#include <CoMISo/Config/config.hh>\n#if (COMISO_SUITESPARSE_AVAILABLE && COMISO_Eigen3_AVAILABLE)\n//=============================================================================\n\n\n//== INCLUDES =================================================================\n\n#include <iostream>\n#include <Eigen/Eigen>\n\n#if EIGEN_VERSION_AT_LEAST(3,1,0)\n  #include <Eigen/CholmodSupport>\n#else\n  #define EIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET\n  #include <unsupported/Eigen/CholmodSupport>\n#endif\n#include <Eigen/Sparse>\n\n//== FORWARDDECLARATIONS ======================================================\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== CLASS DEFINITION =========================================================\n\n\n/** \\class EigenArpackMatrixT EigenArpackMatrixT.hh <COMISO/.../EigenArpackMatrixT.hh>\n\n    Brief Description.\n  \n    A more elaborate description follows.\n*/\n\ntemplate <class RealT,class MatrixT>\nclass EigenArpackMatrixT\n{\npublic:\n\n  typedef MatrixT Matrix;\n  typedef RealT   Real;\n   \n  /// Constructor\n  template<class MatrixT2>\n  EigenArpackMatrixT(const MatrixT2& _m, bool _use_inverse = false)\n  {\n    mat_ = _m;\n\n    if(_use_inverse)\n    {\n      sllt_.compute(mat_);\n\n#if EIGEN_VERSION_AT_LEAST(3,1,0)      \n      if ( !sllt_.info() != Eigen::Success )\n#else\n      if ( !sllt_.succeeded() )\n#endif      \n        std::cout << \"[ERROR] EigenArpackMatrix(): Could not compute llt factorization.\" << std::endl;\n    }\n  }\n \n  /// Destructor\n  ~EigenArpackMatrixT() {}\n  \n  // get reference on matrix\n  Matrix& matrix() { return mat_; }\n\n  // matrix-vector multiplication _w = mat_*_v\n  void mult_Mv(Real* _v, Real* _w)\n  {\n    Eigen::Map<Eigen::Matrix<Real, Eigen::Dynamic, 1> >  v(_v,mat_.rows());     // uses v as a ArrayXf object\n    Eigen::Map<Eigen::Matrix<Real, Eigen::Dynamic, 1> >  w(_w,mat_.cols());     // uses w as a ArrayXf object\n\n    w = mat_*v;\n  }\n\n  // matrix-vector multiplication _w = mat_*_v\n  void mult_M_inv_v(Real* _v, Real* _w)\n  {\n    Eigen::Map<Eigen::Matrix<Real, Eigen::Dynamic, 1> >  v(_v,mat_.rows());     // uses v as a ArrayXf object\n    Eigen::Map<Eigen::Matrix<Real, Eigen::Dynamic, 1> >  w(_w,mat_.cols());     // uses w as a ArrayXf object\n\n    w = sllt_.solve(v);\n\n//    std::cerr << \"input:\" << std::endl;\n//    std::cerr << v << std::endl;\n//    std::cerr << \"output:\" << std::endl;\n//    std::cerr << w << std::endl;\n  }\n\nprivate:\n\n  Matrix mat_;\n\n#if EIGEN_VERSION_AT_LEAST(3,1,0) \n  Eigen::CholmodSupernodalLLT<Eigen::SparseMatrix<Real> > sllt_;\n#else\n  Eigen::SparseLLT<Eigen::SparseMatrix<Real>, Eigen::Cholmod> sllt_;\n#endif\n};\n\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n#if defined(INCLUDE_TEMPLATES) && !defined(COMISO_EIGENARPACKMATRIXT_C)\n#define COMISO_EIGENARPACKMATRIXT_TEMPLATES\n#include \"EigenArpackMatrixT.cc\"\n#endif\n//=============================================================================\n#endif // COMISO_SUITESPARSE_AVAILABLE\n//=============================================================================\n#endif // COMISO_EIGENARPACKMATRIXT_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/CoMISo/Examples/factored_solver/CMakeLists.txt",
    "content": "include (ACGCommon)\ninclude (CoMISoExample)\n\n# source code directories\nset (directories \n  . \n)\n\n# collect all header and source files\nacg_append_files (headers \"*.hh\" ${directories})\nacg_append_files (sources \"*.cc\" ${directories})\n\n# remove template cc files from source file list\nacg_drop_templates (sources)\n\nif (WIN32)\n  acg_add_executable (factored_solver WIN32 ${sources} ${headers} )\nelseif (APPLE)\n  # generate bundle on mac\n  acg_add_executable (factored_solver MACOSX_BUNDLE ${sources} ${headers} )\nelse ()\n  acg_add_executable (factored_solver ${sources} ${headers} )\nendif ()\n\n# enable rpath linking\nset_target_properties(factored_solver PROPERTIES INSTALL_RPATH_USE_LINK_PATH 1)\n\ntarget_link_libraries (factored_solver\n  CoMISo\n  ${COMISO_LINK_LIBRARIES}\n)\n\nif (APPLE)\n   # create bundle in \"Build\" directory and set icon\n   # no install needed here, because the whole bundle will be installed in the\n   # toplevel CMakeLists.txt\n   set_target_properties (\n      factored_solver PROPERTIES\n      RUNTIME_OUTPUT_DIRECTORY \"${CMAKE_BINARY_DIR}/Build\"\n      MACOSX_BUNDLE_INFO_STRING \"CoMISo factored_solver\"\n   )\nendif ()\n\n"
  },
  {
    "path": "libs/CoMISo/Examples/factored_solver/main.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               CoMISo                                      *\n *      Copyright (C) 2008-2009 by Computer Graphics Group, RWTH Aachen      *\n *                           www.rwth-graphics.de                            *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of CoMISo.                                             *\n *                                                                           *\n *  CoMISo 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 *  CoMISo 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 CoMISo.  If not, see <http://www.gnu.org/licenses/>.          *\n *                                                                           *\n\\*===========================================================================*/ \n\n\n\n#include <CoMISo/Utils/StopWatch.hh>\n#include <gmm/gmm.h>\n#include <vector>\n#include <CoMISo/Solver/ConstrainedSolver.hh>\n#include <CoMISo/Solver/MISolver.hh>\n#include <CoMISo/Solver/GMM_Tools.hh>\n\n/// function to setup a random sparse row matrix of dimension _m x _n\n/// for the simplicity of this example only integer valued entries are used\ntemplate<class MatrixT>\nvoid random_sparse_row_matrix( MatrixT& _B, int _m, int _n, double _density = 0.7)\n{\n  gmm::resize(_B,  _m, _n);\n\n  for( int i=0; i<_m; ++i)\n    for( int j=0; j<_n; ++j)\n      if( (rand()-1.0*_density*RAND_MAX)/RAND_MAX> 0) // for sparseness\n        _B(i,j) = round(((rand()-0.4*RAND_MAX)/RAND_MAX)*10.0);\n}\n\n/// function to setup a random sparse constraint row matrix of dimension _c x _n\n/// for the simplicity of the example only -1, 0, 1 constraints are used\ntemplate<class MatrixT>\nvoid simple_constraint_row_matrix( MatrixT& _C, int _c, int _n, double _distribution = 0.2)\n{\n  gmm::resize( _C, _c, _n);\n  for( int i=0; i<_c; ++i)\n    for( int j=0; j<_n; ++j)\n    {\n      double randnum = (double(rand())/double(RAND_MAX));\n      if ( randnum < _distribution)\n        _C( i,j) = -1;\n      else if( randnum > (1.0-_distribution))\n        _C( i,j) = 1;\n      else\n        _C( i,j) = 0;\n    }\n}\n\n/// function to print the equations corresponding to the matrices of an equation system\ntemplate<class MatrixT>\nvoid print_equations( const MatrixT& _B)\n{\n  int m = gmm::mat_nrows( _B);\n  int n = gmm::mat_ncols( _B);\n  for( int i = 0; i < m; ++i)\n  {\n    for( int j = 0; j < n-1; ++j)\n    {\n      if( _B(i,j) != 0.0)\n        std::cout << _B(i,j) << \"*x\" << j;\n      else\n        std::cout << \"   0 \";\n      if( j < n-2 ) std::cout << \" + \";\n    }\n    std::cout << \" = \" << _B(i, n-1) << std::endl;\n  }\n}\n\n\n// Example main\nint main(void)\n{\n  std::cout << \"---------- 1) setup an (m x n) sparse row matrix B (i.e. the B in the system ((Bx)^T)Bx)\" << std::endl;\n  int m = 9;\n  int n = 5+1;\n  gmm::row_matrix< gmm::wsvector< double > > B;\n  random_sparse_row_matrix( B, m, n, 0.85);\n  std::cout << B << std::endl << std::endl;\n  //gmm::inspect_matrix( B );\n  std::cout << std::endl;\n\n  std::cout << \"---------- 2) define a set of linear constraints as an (c x n) row matrix C\" << std::endl;\n  int c = 2;\n  gmm::row_matrix< gmm::wsvector< double > > C;\n  simple_constraint_row_matrix( C, c, n);\n  std::cout << C << std::endl;\n  std::cout << \"corresponding to the following linear equations : \" << std::endl;\n  print_equations( C );\n  std::cout << std::endl;\n\n  std::cout << \"---------- 3) we now explicitly carry out the steps performed internally by the constrained solver and compare the two results at the end...\" << std::endl;\n  // copy the matrices\n  gmm::row_matrix< gmm::wsvector< double > > Bcpy( B );\n  gmm::row_matrix< gmm::wsvector< double > > Ccpy( C );\n\n  // create a constrained solver\n  COMISO::ConstrainedSolver cs;\n  // vector of indices to round (this is the mixed-integer part)\n  std::vector< int > ids_to_round;\n  // lets say we want to round the third variable\n  ids_to_round.push_back(2);\n\n  // vector of independent variables to be eliminated (computed by the make_constraints_independent function)\n  std::vector< int > ids_to_elim;\n\n  std::cout << \"---------- ---------- 3.1) make the constraints independent (gauss elimination on C)\" << std::endl;\n  print_equations( Ccpy );\n  cs.make_constraints_independent( Ccpy, ids_to_round, ids_to_elim);\n  std::cout << \"                      constraints after gauss elimination...\" << std::endl;\n  std::cout << Ccpy << std::endl;\n  std::cout << \"                      the variables to be eliminated are: \" << std::endl;\n  std::cout << ids_to_elim << std::endl << std::endl;\n\n  std::cout << \"---------- ---------- 3.2) eliminate constraints from system matrix B\" << std::endl;\n  // this is the column matrix later used by the solver, it is setup by the eliminate_constraints function\n  gmm::col_matrix< gmm::wsvector< double > > Bcol;\n\n  // this re-indexing is also used by the solver, to know which variables are still there (!=-1) and which have been eliminated (=-1) it is setup by eliminate_constraints\n  std::vector< int > new_idx;\n  \n  cs.eliminate_constraints( Ccpy, Bcpy, ids_to_round, ids_to_elim, new_idx, Bcol);\n  std::cout << \"                      B matrix after elimination of constraints...\" << std::endl;\n  std::cout << Bcol << std::endl;\n\n  std::cout << \"---------- ---------- 3.3) setup the linear system Ax=b, where by forming B^TB and extracting the right hand side\" << std::endl;\n  \n  // this is the solution vector x\n  std::vector< double > x;\n\n  int new_n = gmm::mat_ncols( Bcol);\n  // set up B transposed\n  gmm::col_matrix< gmm::wsvector< double > > Bt( new_n, m);\n  gmm::copy( gmm::transposed( Bcol), Bt);\n\n  // setup BtB\n  gmm::col_matrix< gmm::wsvector< double > > BtB( new_n, new_n);\n  gmm::mult( Bt, Bcol, BtB);\n\n  // extract rhs\n  std::vector< double > rhs( new_n);\n  gmm::copy( gmm::scaled(gmm::mat_const_col( BtB, new_n - 1),-1.0), rhs);\n  rhs.resize( new_n - 1);\n\n  // resize BtB to only contain the actual system matrix (and not the rhs)\n  gmm::resize( BtB, new_n - 1, new_n - 1);\n  x.resize( new_n - 1);\n\n  // BtB -> CSC\n  gmm::csc_matrix<double> BtBCSC;\n  BtBCSC.init_with_good_format( BtB);\n\n  std::cout << \"                      the linear system now looks like...\" << std::endl;\n  std::cout << \"                      Matrix A\\n \" << BtBCSC << std::endl;\n  std::cout << \"                      Right hand side b\\n\" << rhs << std::endl << std::endl;\n\n  std::cout << \"---------- ---------- 3.4) solve the system using the mixed-integer solver...\" << std::endl;\n  // create solver\n  COMISO::MISolver miso;\n  // miso solve\n  miso.solve( BtBCSC, x, rhs, ids_to_round);\n  std::cout << \"                      solution vector x is\\n\" << x << std::endl << std::endl;\n\n  std::cout << \"---------- ---------- 3.5) now the solution must be re-indexed to the expected/original form/size....\" << std::endl;\n  cs.restore_eliminated_vars( Ccpy, x, ids_to_elim, new_idx);\n  std::cout << \"                      fullsize solution vector x is\\n\" << x << std::endl << std::endl;\n\n  std::cout << \"---------- ---------- 4) the same result is obtained by one call to the constrained solver, which takes care of re-indexing etc. internally...\" << std::endl;\n  // ids_to_round is altered by previous steps...\n  ids_to_round.clear();\n  ids_to_round.push_back(2);\n  cs.solve( C, B, x, ids_to_round, 0.0, false, true);\n  std::cout << \"                      fullsize solution vector x is\\n\" << x << std::endl << std::endl;\n\n  return -1;\n}\n\n"
  },
  {
    "path": "libs/CoMISo/Examples/quadratic_solver/CMakeLists.txt",
    "content": "include (ACGCommon)\ninclude (CoMISoExample)\n\n# source code directories\nset (directories \n  . \n)\n\n# collect all header and source files\nacg_append_files (headers \"*.hh\" ${directories})\nacg_append_files (sources \"*.cc\" ${directories})\n\n# remove template cc files from source file list\nacg_drop_templates (sources)\n\nif (WIN32)\n  acg_add_executable (quadratic_solver WIN32 ${sources} ${headers} )\nelseif (APPLE)\n  # generate bundle on mac\n  acg_add_executable (quadratic_solver MACOSX_BUNDLE ${sources} ${headers} )\nelse ()\n  acg_add_executable (quadratic_solver ${sources} ${headers} )\nendif ()\n\n# enable rpath linking\nset_target_properties(quadratic_solver PROPERTIES INSTALL_RPATH_USE_LINK_PATH 1)\n\ntarget_link_libraries (quadratic_solver\n  CoMISo\n  ${COMISO_LINK_LIBRARIES}\n)\n\nif (APPLE)\n   # create bundle in \"Build\" directory and set icon\n   # no install needed here, because the whole bundle will be installed in the\n   # toplevel CMakeLists.txt\n   set_target_properties (\n      quadratic_solver PROPERTIES\n      RUNTIME_OUTPUT_DIRECTORY \"${CMAKE_BINARY_DIR}/Build\"\n      MACOSX_BUNDLE_INFO_STRING \"CoMISo quadratic_solver\"\n   )\nendif ()\n"
  },
  {
    "path": "libs/CoMISo/Examples/quadratic_solver/main.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               CoMISo                                      *\n *      Copyright (C) 2008-2009 by Computer Graphics Group, RWTH Aachen      *\n *                           www.rwth-graphics.de                            *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of CoMISo.                                             *\n *                                                                           *\n *  CoMISo 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 *  CoMISo 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 CoMISo.  If not, see <http://www.gnu.org/licenses/>.          *\n *                                                                           *\n\\*===========================================================================*/ \n\n#include <CoMISo/Utils/StopWatch.hh>\n#include <gmm/gmm.h>\n#include <vector>\n#include <CoMISo/Solver/ConstrainedSolver.hh>\n#include <CoMISo/Solver/MISolver.hh>\n#include <CoMISo/Solver/GMM_Tools.hh>\n\n/// function to setup a random sparse row matrix of dimension _m x _n\n/// for the simplicity of this example only integer valued entries are used\ntemplate<class MatrixT>\nvoid random_sparse_row_matrix( MatrixT& _B, int _m, int _n, double _density = 0.7)\n{\n  gmm::resize(_B,  _m, _n);\n\n  for( int i=0; i<_m; ++i)\n    for( int j=0; j<_n; ++j)\n      if( (rand()-1.0*_density*RAND_MAX)/RAND_MAX> 0) // for sparseness\n        _B(i,j) = round(((rand()-0.4*RAND_MAX)/RAND_MAX)*10.0);\n}\n\n/// function to extract the actual system Ax=b of linear equation from a B^tB matrix\ntemplate<class RMatrixT, class CMatrixT>\nvoid extract_Axb( const RMatrixT& _B, CMatrixT& _A, std::vector< double >& _b)\n{\n  int dimm = gmm::mat_nrows(_B);\n  int dimn = gmm::mat_ncols(_B);\n  gmm::col_matrix< gmm::wsvector< double > > Btcol;\n  gmm::col_matrix< gmm::wsvector< double > > Bcol;\n  gmm::resize( Btcol, dimn, dimm);\n  gmm::resize( Bcol, dimm, dimn);\n  gmm::resize( _A, dimn, dimn);\n  gmm::copy( _B, Bcol);\n  gmm::copy( gmm::transposed( Bcol), Btcol);\n  gmm::mult( Btcol, Bcol, _A);\n  _b.resize( dimn);\n  gmm::copy( _A.col(dimn-1), _b);\n  _b.resize( dimn-1);\n  gmm::resize( _A, dimn-1, dimn-1);\n  gmm::scale(_b, -1.0);\n}\n\n/// function to setup a random sparse constraint row matrix of dimension _c x _n\n/// for the simplicity of the example only -1, 0, 1 constraints are used\ntemplate<class MatrixT>\nvoid simple_constraint_row_matrix( MatrixT& _C, int _c, int _n, double _distribution = 0.2)\n{\n  gmm::resize( _C, _c, _n);\n  for( int i=0; i<_c; ++i)\n    for( int j=0; j<_n; ++j)\n    {\n      double randnum = (double(rand())/double(RAND_MAX));\n      if ( randnum < _distribution)\n        _C( i,j) = -1;\n      else if( randnum > (1.0-_distribution))\n        _C( i,j) = 1;\n      else\n        _C( i,j) = 0;\n    }\n}\n\n/// function to print the equations corresponding to the matrices of an equation system\ntemplate<class MatrixT>\nvoid print_equations( const MatrixT& _B)\n{\n  int m = gmm::mat_nrows( _B);\n  int n = gmm::mat_ncols( _B);\n  for( int i = 0; i < m; ++i)\n  {\n    for( int j = 0; j < n-1; ++j)\n    {\n      if( _B(i,j) != 0.0)\n        std::cout << _B(i,j) << \"*x\" << j;\n      else\n        std::cout << \"   0 \";\n      if( j < n-2 ) std::cout << \" + \";\n    }\n    std::cout << \" = \" << _B(i, n-1) << std::endl;\n  }\n}\n\n\n// Example main\nint main(void)\n{\n  std::cout << \"---------- 1) setup an (m x n) sparse row matrix B (i.e. the B in the system ((Bx)^T)Bx)\" << std::endl;\n  int m = 9;\n  int n = 5+1;\n  gmm::row_matrix< gmm::wsvector< double > > B;\n  random_sparse_row_matrix( B, m, n, 0.85);\n  std::cout << B << std::endl << std::endl;\n\n  std::cout << \"---------- 2) extract the Ax=b equation system, A (n-1 x n-1)\" << std::endl;\n  gmm::col_matrix< gmm::wsvector< double > > A;\n  std::vector< double > b;\n  extract_Axb( B, A, b);\n  std::cout << \"           A \" << std::endl;\n  std::cout << A << \" \" << b << std::endl;\n  \n  //gmm::inspect_matrix( B );\n  std::cout << std::endl;\n\n  std::cout << \"---------- 3) define a set of linear constraints as an (c x n) row matrix C\" << std::endl;\n  int c = 2;\n  gmm::row_matrix< gmm::wsvector< double > > C;\n  simple_constraint_row_matrix( C, c, n);\n  std::cout << C << std::endl;\n  std::cout << \"corresponding to the following linear equations : \" << std::endl;\n  print_equations( C );\n  std::cout << std::endl;\n\n  std::cout << \"---------- 4) we now explicitly carry out the steps performed internally by the constrained solver and compare the two results at the end...\" << std::endl;\n  // copy the matrices\n  gmm::col_matrix< gmm::wsvector< double > > Acpy( A );\n\n  // create a constrained solver\n  COMISO::ConstrainedSolver cs;\n  // vector of indices to round (this is the mixed-integer part)\n  std::vector< int > ids_to_round;\n  // lets say we want to round the third variable\n  ids_to_round.push_back(2);\n\n  // vector of independent variables to be eliminated (computed by the make_constraints_independent function)\n  std::vector< int > ids_to_elim;\n\n  std::cout << \"---------- ---------- 4.1) make the constraints independent (gauss elimination on C)\" << std::endl;\n  print_equations( C );\n  cs.make_constraints_independent( C, ids_to_round, ids_to_elim);\n  std::cout << \"                      constraints after gauss elimination...\" << std::endl;\n  std::cout << C << std::endl;\n  std::cout << \"                      the variables to be eliminated are: \" << std::endl;\n  std::cout << ids_to_elim << std::endl << std::endl;\n  gmm::row_matrix< gmm::wsvector< double > > Ccpy( C );\n  \n\n  std::cout << \"---------- ---------- 4.2) eliminate constraints from system matrix A\" << std::endl;\n\n  // CSC matrix later initialized and used by solver\n  gmm::csc_matrix< double > Acsc;\n\n  // this re-indexing is also used by the solver, to know which variables are still there (!=-1) and which have been eliminated (=-1) it is setup by eliminate_constraints\n  std::vector< int > new_idx;\n \n  std::vector< double > x(b.size()); \n  std::vector< double > b_cpy(b); \n\n  cs.eliminate_constraints( Ccpy, Acpy, x, b, ids_to_round, ids_to_elim, new_idx, Acsc);\n  std::cout << \"                      A matrix after elimination of constraints...\" << std::endl;\n  std::cout << Acsc << std::endl;\n\n\n  std::cout << \"---------- ---------- 4.3) solve the system using the mixed-integer solver...\" << std::endl;\n  // create solver\n  COMISO::MISolver miso;\n  // miso solve\n  miso.solve( Acsc, x, b, ids_to_round);\n  std::cout << \"                      solution vector x is\\n\" << x << std::endl << std::endl;\n\n\n  std::cout << \"---------- ---------- 4.4) now the solution must be re-indexed to the expected/original form/size....\" << std::endl;\n  cs.restore_eliminated_vars( Ccpy, x, ids_to_elim, new_idx);\n  std::cout << \"                      fullsize solution vector x is\\n\" << x << std::endl << std::endl;\n\n  \n  std::cout << \"---------- ---------- 5) the same result is obtained by one call to the constrained solver, which takes care of re-indexing etc. internally...\" << std::endl;\n  // ids_to_round is altered by previous steps...\n  ids_to_round.clear();\n  ids_to_round.push_back(2);\n  x.resize(gmm::mat_nrows(A));\n  b.resize(gmm::mat_nrows(A));\n  cs.solve( C, A, x, b_cpy, ids_to_round, 0.0, false, true);\n  std::cout << \"                      fullsize solution vector x is\\n\" << x << std::endl << std::endl;\n\n  return -1;\n}\n\n"
  },
  {
    "path": "libs/CoMISo/Examples/small_eigenproblem/CMakeLists.txt",
    "content": "include (ACGCommon)\ninclude (CoMISoExample)\n\n# source code directories\nset (directories \n  . \n)\n\n# collect all header and source files\nacg_append_files (headers \"*.hh\" ${directories})\nacg_append_files (sources \"*.cc\" ${directories})\n\n# remove template cc files from source file list\nacg_drop_templates (sources)\n\nif (WIN32)\n  acg_add_executable (small_eigenproblem WIN32 ${sources} ${headers} )\nelseif (APPLE)\n  # generate bundle on mac\n  acg_add_executable (small_eigenproblem MACOSX_BUNDLE ${sources} ${headers} )\nelse ()\n  acg_add_executable (small_eigenproblem ${sources} ${headers} )\nendif ()\n\n# enable rpath linking\nset_target_properties(small_eigenproblem PROPERTIES INSTALL_RPATH_USE_LINK_PATH 1)\n\ntarget_link_libraries (small_eigenproblem\n  CoMISo\n  ${COMISO_LINK_LIBRARIES}\n)\n\nif (APPLE)\n   # create bundle in \"Build\" directory and set icon\n   # no install needed here, because the whole bundle will be installed in the\n   # toplevel CMakeLists.txt\n   set_target_properties (\n      small_eigenproblem PROPERTIES\n      RUNTIME_OUTPUT_DIRECTORY \"${CMAKE_BINARY_DIR}/Build\"\n      MACOSX_BUNDLE_INFO_STRING \"CoMISo eigenproblem\"\n   )\nendif ()\n"
  },
  {
    "path": "libs/CoMISo/Examples/small_eigenproblem/main.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               CoMISo                                      *\n *      Copyright (C) 2008-2009 by Computer Graphics Group, RWTH Aachen      *\n *                           www.rwth-graphics.de                            *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of CoMISo.                                             *\n *                                                                           *\n *  CoMISo 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 *  CoMISo 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 CoMISo.  If not, see <http://www.gnu.org/licenses/>.          *\n *                                                                           *\n\\*===========================================================================*/ \n\n#include <iostream>\n\n\n//== COMPILE-TIME PACKAGE REQUIREMENTS ========================================\n#include <CoMISo/Config/config.hh>\n#if (COMISO_ARPACK_AVAILABLE && COMISO_SUITESPARSE_AVAILABLE && COMISO_Eigen3_AVAILABLE)\n//=============================================================================\n\n#include <CoMISo/Utils/StopWatch.hh>\n#include <vector>\n#include <CoMISo/EigenSolver/ArpackSolver.hh>\n#define EIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET\n#include <Eigen/Sparse>\n#include <Eigen/Dense>\n\n\n//------------------------------------------------------------------------------------------------------\n\n// Example main\nint main(void)\n{\n  // matrix types\n#if EIGEN_VERSION_AT_LEAST(3,1,0)\n  typedef Eigen::SparseMatrix<double,Eigen::ColMajor>           SMatrix;\n#else\n  typedef Eigen::DynamicSparseMatrix<double,Eigen::ColMajor>    SMatrix;\n#endif\n  typedef Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>  Matrix;\n  \n  std::cout << \"---------- 1) Setting up matrix...\" << std::endl;\n  unsigned int n=5;\n  SMatrix A(n,n);\n  // 1D Laplacian\n  for(unsigned int i=0; i<n; ++i)\n  {\n    int count = 0;\n    if( i > 0)\n    {\n      A.coeffRef(i,i-1) = -1.0;\n      ++count;\n    }\n    if(i<n-1)\n    {\n      A.coeffRef(i,i+1) = -1.0;\n      ++count;\n    }\n\n    A.coeffRef(i,i) = count;\n  }\n  \n  \n  std::cout << \"---------- 2) Solving for m smallest eigenvalues and eigenvectors...\" << std::endl;\n  unsigned int m=3;\n  COMISO::ArpackSolver arsolv;\n  std::vector<double> evals;\n  Matrix evects;\n  arsolv.solve(A, evals, evects, m);\n  \n  std::cout << \"---------- 3) printing results...\" << std::endl;\n  std::cerr << \"********* eigenvalues: \";\n  for(unsigned int i=0; i<evals.size(); ++i)\n    std::cerr << evals[i] << \", \";\n  std::cerr << std::endl;\n  \n  std::cerr <<\"********* eigenvectors:\" << std::endl;\n  std::cerr << evects << std::endl;\n \n  return 0;\n}\n\n//=============================================================================\n#else\n//=============================================================================\n\n// Example main\nint main(void)\n{\n  std::cerr << \"Info: required dependencies are missing, abort...\\n\";\n  return 0;\n}\n//=============================================================================\n#endif // COMISO_SUITESPARSE_AVAILABLE\n//=============================================================================\n"
  },
  {
    "path": "libs/CoMISo/Examples/small_factored_example/CMakeLists.txt",
    "content": "include (ACGCommon)\ninclude (CoMISoExample)\n\n# source code directories\nset (directories \n  . \n)\n\n# collect all header and source files\nacg_append_files (headers \"*.hh\" ${directories})\nacg_append_files (sources \"*.cc\" ${directories})\n\n# remove template cc files from source file list\nacg_drop_templates (sources)\n\nif (WIN32)\n  acg_add_executable (small_factored_solver WIN32 ${sources} ${headers} )\nelseif (APPLE)\n  # generate bundle on mac\n  acg_add_executable (small_factored_solver MACOSX_BUNDLE ${sources} ${headers} )\nelse ()\n  acg_add_executable (small_factored_solver ${sources} ${headers} )\nendif ()\n\n# enable rpath linking\nset_target_properties(small_factored_solver PROPERTIES INSTALL_RPATH_USE_LINK_PATH 1)\n\ntarget_link_libraries (small_factored_solver\n  CoMISo\n  ${COMISO_LINK_LIBRARIES}\n)\n\nif (APPLE)\n   # create bundle in \"Build\" directory and set icon\n   # no install needed here, because the whole bundle will be installed in the\n   # toplevel CMakeLists.txt\n   set_target_properties (\n      small_factored_solver PROPERTIES\n      RUNTIME_OUTPUT_DIRECTORY \"${CMAKE_BINARY_DIR}/Build\"\n      MACOSX_BUNDLE_INFO_STRING \"CoMISo small_factored_solver\"\n   )\nendif ()\n"
  },
  {
    "path": "libs/CoMISo/Examples/small_factored_example/main.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               CoMISo                                      *\n *      Copyright (C) 2008-2009 by Computer Graphics Group, RWTH Aachen      *\n *                           www.rwth-graphics.de                            *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of CoMISo.                                             *\n *                                                                           *\n *  CoMISo 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 *  CoMISo 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 CoMISo.  If not, see <http://www.gnu.org/licenses/>.          *\n *                                                                           *\n\\*===========================================================================*/ \n\n\n#include <CoMISo/Utils/StopWatch.hh>\n#include <gmm/gmm.h>\n#include <vector>\n#include <CoMISo/Solver/ConstrainedSolver.hh>\n#include <CoMISo/Solver/MISolver.hh>\n#include <CoMISo/Solver/GMM_Tools.hh>\n\n\n/// function to initialize a simple row matrix of equations\ntemplate<class MatrixT>\nvoid init_fac( MatrixT& _B )\n{\n  _B(0,0) = 0   ; _B(0,1) = 4 ; _B(0,2) = -2 ; _B(0,3) = 0 ; _B(0,4) = -1;\n  _B(1,0) = 0   ; _B(1,1) = 0 ; _B(1,2) = 0  ; _B(1,3) = 0 ; _B(1,4) = 0 ;\n  _B(2,0) = 5   ; _B(2,1) = 0 ; _B(2,2) = -3 ; _B(2,3) = 0 ; _B(2,4) = 0 ; \n  _B(3,0) = 0   ; _B(3,1) = 0 ; _B(3,2) = -2 ; _B(3,3) = 0 ; _B(3,4) = 0 ; \n  _B(4,0) = 0   ; _B(4,1) = -2; _B(4,2) = 0  ; _B(4,3) = 2 ; _B(4,4) = 0 ; \n}\n\n/// function to print the equations corresponding to the matrices of an equation system\ntemplate<class MatrixT>\nvoid print_equations( const MatrixT& _B)\n{\n  int m = gmm::mat_nrows( _B);\n  int n = gmm::mat_ncols( _B);\n  for( int i = 0; i < m; ++i)\n  {\n    for( int j = 0; j < n-1; ++j)\n    {\n      if( _B(i,j) != 0.0)\n        std::cout << _B(i,j) << \"*x\" << j;\n      else\n        std::cout << \"   0 \";\n      if( j < n-2 ) std::cout << \" + \";\n    }\n    std::cout << \" = \" << _B(i, n-1) << std::endl;\n  }\n}\n\n\n// Example main\nint main(void)\n{\n  std::cout << \"---------- 1) Setup a number of equations (i.e. the B matrix of a factored system of linear equations B^tB)...\" << std::endl;\n  int n = 4;\n  gmm::row_matrix< gmm::wsvector< double > > B(n+1,n+1);\n  std::vector< double > x(n);\n\n  init_fac( B );\n\n  // create an empty constraint matrix (will be used later)\n  gmm::row_matrix< gmm::wsvector< double > > constraints(0,n+1); //n+1 because of right hand side\n  // create an empty vector of variable indices to be rounded (will be used later)\n  std::vector< int > ids_to_round;\n\n  std::cout << B << std::endl << std::endl;\n\n\n  std::cout << \"---------- 2) The original solution to this system is...\" << std::endl;\n\n  COMISO::ConstrainedSolver cs;\n  //  void solve( RMatrixT& _constraints, RMatrixT& _B, VectorT&  _x, VectorIT& _idx_to_round, double    _reg_factor = 0.0, bool      _show_miso_settings = true, bool      _show_timings = true );\n  //_show_miso_settings requires a QT context and hence must be false in this example\n  cs.solve( constraints, B, x, ids_to_round, 0.0, false, true);  \n  // copy this solution for later\n  std::vector< double > org_x( x); \n  std::cout << x << std::endl;\n\n\n  std::cout << \"---------- 3) Rounding: forcing the second variable to lie on an integer, changes the solution to...\" << std::endl;\n  // reset system \n  init_fac( B );\n  ids_to_round.push_back(1);\n  cs.solve( constraints, B, x, ids_to_round, 0.0, false, true);  \n  std::cout << x << std::endl;\n\n\n  std::cout << \"---------- 4) Constraining: forcing the first variable to equal the second changes the solution to...\" << std::endl;\n  // reset system \n  init_fac( B );\n  ids_to_round.clear();\n  ids_to_round.push_back(1);\n  // setup constraint x0*1+x1*0+x2*(-1)+x3*0=0\n  gmm::resize( constraints, 1, n+1);\n  constraints( 0, 0 ) = 1.0;\n  constraints( 0, 1 ) = -1.0;\n  std::cout << \"           the constraint equation looks like this:\" << std::endl;\n  print_equations( constraints);\n  cs.solve( constraints, B, x, ids_to_round, 0.0, false, true);  \n  std::cout << x << std::endl;\n\n  return -1;\n}\n\n"
  },
  {
    "path": "libs/CoMISo/Examples/small_miqp/CMakeLists.txt",
    "content": "include (ACGCommon)\ninclude (CoMISoExample)\n\n# source code directories\nset (directories \n   .\n)\n\n# collect all header and source files\nacg_append_files (headers \"*.hh\" ${directories})\nacg_append_files (sources \"*.cc\" ${directories})\n\n# remove template cc files from source file list\nacg_drop_templates (sources)\n\nif (WIN32)\n  acg_add_executable (small_miqp WIN32 ${sources} ${headers} )\nelseif (APPLE)\n  # generate bundle on mac\n  acg_add_executable (small_miqp MACOSX_BUNDLE ${sources} ${headers} )\nelse ()\n  acg_add_executable (small_miqp ${sources} ${headers} )\nendif ()\n\n# enable rpath linking\nset_target_properties(small_miqp PROPERTIES INSTALL_RPATH_USE_LINK_PATH 1)\n\ntarget_link_libraries (small_miqp\n  CoMISo\n  ${COMISO_LINK_LIBRARIES}\n)\n\nif (APPLE)\n   # create bundle in \"Build\" directory and set icon\n   # no install needed here, because the whole bundle will be installed in the\n   # toplevel CMakeLists.txt\n   set_target_properties (\n      small_miqp PROPERTIES\n      RUNTIME_OUTPUT_DIRECTORY \"${CMAKE_BINARY_DIR}/Build\"\n      MACOSX_BUNDLE_INFO_STRING \"CoMISo small_miqp\"\n   )\nendif ()\n"
  },
  {
    "path": "libs/CoMISo/Examples/small_miqp/main.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               CoMISo                                      *\n *      Copyright (C) 2008-2009 by Computer Graphics Group, RWTH Aachen      *\n *                           www.rwth-graphics.de                            *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of CoMISo.                                             *\n *                                                                           *\n *  CoMISo 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 *  CoMISo 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 CoMISo.  If not, see <http://www.gnu.org/licenses/>.          *\n *                                                                           *\n\\*===========================================================================*/ \n\n#include <CoMISo/Config/config.hh>\n\n#include <CoMISo/Utils/StopWatch.hh>\n#include <vector>\n#include <CoMISo/NSolver/NProblemInterface.hh>\n#include <CoMISo/NSolver/NPDerivativeChecker.hh>\n#include <CoMISo/NSolver/GUROBISolver.hh>\n#include <CoMISo/NSolver/CPLEXSolver.hh>\n#include <CoMISo/NSolver/LinearConstraint.hh>\n#include <CoMISo/NSolver/VariableType.hh>\n\n\n// generate an instance of a nonlinear problem by deriving from base class NProblemInterface\n// implement all virtual functions in order to solve this problem by any of the solvers located\n// in CoMISo/NSolver\n\nclass SmallNProblem : public COMISO::NProblemInterface\n{\npublic:\n\n  // Sparse Matrix Type\n  //  typedef Eigen::DynamicSparseMatrix<double,Eigen::ColMajor> SMatrixNP;\n\n\n  // specify a function which has several local minima\n  // f(x,y)=(x-2y+1)^2 + (x-5)^2\n\n  // number of unknown variables, here x and y = 2\n  virtual int    n_unknowns   (                                )\n  {\n    return 2;\n  }\n\n  // initial value where the optimization should start from\n  virtual void   initial_x    (       double* _x               )\n  {\n    _x[0] = 0.0;\n    _x[1] = 0.0;\n  }\n\n  // function evaluation at location _x\n  virtual double eval_f       ( const double* _x               )\n  {\n    double term  = _x[0] - 2.0*_x[1] + 1.0;\n    double term2 = _x[0] - 5.0;\n\n    return term*term + term2*term2;\n  }\n\n  // gradient evaluation at location _x\n  virtual void   eval_gradient( const double* _x, double*    _g)\n  {\n    double term  = _x[0] - 2.0*_x[1] + 1.0;\n    double term2 = _x[0] - 5.0;\n\n    _g[0] =  2.0*term + 2.0*term2;\n    _g[1] = -4.0*term;\n   }\n\n  // hessian matrix evaluation at location _x\n  virtual void   eval_hessian ( const double* _x, SMatrixNP& _H)\n  {\n    _H.resize(n_unknowns(), n_unknowns());\n    _H.setZero();\n\n    _H.coeffRef(0,0) =  4.0;\n    _H.coeffRef(1,0) = -4.0;\n    _H.coeffRef(0,1) = -4.0;\n    _H.coeffRef(1,1) =  8.0;\n  }\n\n  // print result\n  virtual void   store_result ( const double* _x               )\n  {\n    std::cerr << \"Energy: \" << eval_f(_x) << std::endl;\n    std::cerr << \"(x,y) = (\" << _x[0] << \",\" << _x[1] << \")\" << std::endl;\n  }\n\n  // advanced properties\n  virtual bool   constant_hessian() { return true; }\n};\n\n\n//------------------------------------------------------------------------------------------------------\n\n// Example main\nint main(void)\n{\n  std::cout << \"---------- 1) Get an instance of a NProblem...\" << std::endl;\n  SmallNProblem snp;\n\n  std::cout << \"---------- 2) (optional for debugging) Check derivatives of problem...\" << std::endl;\n  COMISO::NPDerivativeChecker npd;\n  npd.check_all(&snp);\n\n  std::cout << \"---------- 3) setup list of integer variables...\" << std::endl;\n  std::vector<COMISO::PairIndexVtype> discrete_variables;\n  discrete_variables.push_back( COMISO::PairIndexVtype(0,COMISO::Integer) );\n\n  std::cout << \"---------- 4) setup constraints...\" << std::endl;\n  std::vector<COMISO::NConstraintInterface*> constraints;\n  // setup constraint x+y <= 6.5\n  COMISO::LinearConstraint::SVectorNC coeffs(2);\n  coeffs.coeffRef(0) = 1.0;\n  coeffs.coeffRef(1) = 1.0;\n  COMISO::LinearConstraint lc(coeffs, -6.5, COMISO::LinearConstraint::NC_LESS_EQUAL);\n  constraints.push_back(&lc);\n\n\n// check if IPOPT solver available in current configuration\n#if( COMISO_GUROBI_AVAILABLE)\n  std::cout << \"---------- 5) Get GUROBI solver... \" << std::endl;\n  COMISO::GUROBISolver gsol;\n\n  std::cout << \"---------- 4) Solve...\" << std::endl;\n\n  gsol.solve(&snp, constraints, discrete_variables);\n#endif\n\n  // check if TAO solver available in current configuration\n#if( COMISO_CPLEX_AVAILABLE)\n  std::cout << \"---------- 5) Solve with CPLEX solver... \" << std::endl;\n  COMISO::CPLEXSolver csol;\n\n  std::cout << \"---------- 4) Solve...\" << std::endl;\n\n  csol.solve(&snp, constraints, discrete_variables);\n#endif\n\n  return 0;\n}\n\n"
  },
  {
    "path": "libs/CoMISo/Examples/small_nleast_squares/CMakeLists.txt",
    "content": "include (ACGCommon)\ninclude (CoMISoExample)\n\n# source code directories\nset (directories \n  . \n)\n\n# collect all header and source files\nacg_append_files (headers \"*.hh\" ${directories})\nacg_append_files (sources \"*.cc\" ${directories})\n\n# remove template cc files from source file list\nacg_drop_templates (sources)\n\nif (WIN32)\n  acg_add_executable (small_nleast_squares WIN32 ${sources} ${headers} )\nelseif (APPLE)\n  # generate bundle on mac\n  acg_add_executable (small_nleast_squares MACOSX_BUNDLE ${sources} ${headers} )\nelse ()\n  acg_add_executable (small_nleast_squares ${sources} ${headers} )\nendif ()\n\n# enable rpath linking\nset_target_properties(small_nleast_squares PROPERTIES INSTALL_RPATH_USE_LINK_PATH 1)\n\ntarget_link_libraries (small_nleast_squares\n  CoMISo\n  ${COMISO_LINK_LIBRARIES}\n)\n\nif (APPLE)\n   # create bundle in \"Build\" directory and set icon\n   # no install needed here, because the whole bundle will be installed in the\n   # toplevel CMakeLists.txt\n   set_target_properties (\n      small_nsolver PROPERTIES\n      RUNTIME_OUTPUT_DIRECTORY \"${CMAKE_BINARY_DIR}/Build\"\n      MACOSX_BUNDLE_INFO_STRING \"CoMISo small_nleast_squares\"\n   )\nendif ()\n"
  },
  {
    "path": "libs/CoMISo/Examples/small_nleast_squares/main.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               CoMISo                                      *\n *      Copyright (C) 2008-2009 by Computer Graphics Group, RWTH Aachen      *\n *                           www.rwth-graphics.de                            *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of CoMISo.                                             *\n *                                                                           *\n *  CoMISo 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 *  CoMISo 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 CoMISo.  If not, see <http://www.gnu.org/licenses/>.          *\n *                                                                           *\n\\*===========================================================================*/ \n\n#include <CoMISo/Config/config.hh>\n\n#include <CoMISo/Utils/StopWatch.hh>\n#include <vector>\n#include <CoMISo/NSolver/LeastSquaresProblem.hh>\n#include <CoMISo/NSolver/LinearConstraint.hh>\n#include <CoMISo/NSolver/NPDerivativeChecker.hh>\n#include <CoMISo/NSolver/IPOPTSolver.hh>\n\n\n// solve least squares problem for x=1, y=2 and x-2y = 1\n\n// Example main\nint main(void)\n{\n  std::cout << \"---------- 1) Get an instance of a LeastSquaresProblem...\" << std::endl;\n  // number of unknowns\n  const int n = 2;\n  COMISO::LeastSquaresProblem lsqp(n);\n\n  // term0\n  COMISO::LinearConstraint::SVectorNC coeffs0(n);\n  coeffs0.coeffRef(0) = 1.0;\n  COMISO::LinearConstraint term0(coeffs0,-1.0,COMISO::NConstraintInterface::NC_EQUAL);\n  lsqp.add_term(&term0);\n\n    // term1\n  COMISO::LinearConstraint::SVectorNC coeffs1(n);\n  coeffs1.coeffRef(1) = 1.0;\n  COMISO::LinearConstraint term1(coeffs1,-2.0,COMISO::NConstraintInterface::NC_EQUAL);\n  lsqp.add_term(&term1);\n  \n    // term2\n  COMISO::LinearConstraint::SVectorNC coeffs2(n);\n  coeffs2.coeffRef(0) =  1.0;\n  coeffs2.coeffRef(1) = -2.0;\n  COMISO::LinearConstraint term2(coeffs2,-1.0,COMISO::NConstraintInterface::NC_EQUAL);\n  lsqp.add_term(&term2);\n  \n  std::cout << \"---------- 2) (optional for debugging) Check derivatives of problem...\" << std::endl;\n  COMISO::NPDerivativeChecker npd;\n  npd.check_all(&lsqp);\n\n// check if IPOPT solver available in current configuration\n#if( COMISO_IPOPT_AVAILABLE)\n  std::cout << \"---------- 3) Get IPOPT solver... \" << std::endl;\n  COMISO::IPOPTSolver ipsol;\n\n  std::cout << \"---------- 4) Solve...\" << std::endl;\n  // there are no constraints -> provide an empty vector\n  std::vector<COMISO::NConstraintInterface*> constraints;\n  ipsol.solve(&lsqp, constraints);\n#endif\n\n  std::cout << \"---------- 5) Print solution...\" << std::endl;\n  for( int i=0; i<n; ++i)\n    std::cerr << \"x_\" << i << \" = \" << lsqp.x()[i] << std::endl;\n  \n  return 0;\n}\n\n"
  },
  {
    "path": "libs/CoMISo/Examples/small_nsolver/CMakeLists.txt",
    "content": "include (ACGCommon)\ninclude (CoMISoExample)\n\n# source code directories\nset (directories \n  . \n)\n\n# collect all header and source files\nacg_append_files (headers \"*.hh\" ${directories})\nacg_append_files (sources \"*.cc\" ${directories})\n\n# remove template cc files from source file list\nacg_drop_templates (sources)\n\nif (WIN32)\n  acg_add_executable (small_nsolver WIN32 ${sources} ${headers} )\nelseif (APPLE)\n  # generate bundle on mac\n  acg_add_executable (small_nsolver MACOSX_BUNDLE ${sources} ${headers} )\nelse ()\n  acg_add_executable (small_nsolver ${sources} ${headers} )\nendif ()\n\n# enable rpath linking\nset_target_properties(small_nsolver PROPERTIES INSTALL_RPATH_USE_LINK_PATH 1)\n\ntarget_link_libraries (small_nsolver\n  CoMISo\n  ${COMISO_LINK_LIBRARIES}\n)\n\nif (APPLE)\n   # create bundle in \"Build\" directory and set icon\n   # no install needed here, because the whole bundle will be installed in the\n   # toplevel CMakeLists.txt\n   set_target_properties (\n      small_nsolver PROPERTIES\n      RUNTIME_OUTPUT_DIRECTORY \"${CMAKE_BINARY_DIR}/Build\"\n      MACOSX_BUNDLE_INFO_STRING \"CoMISo small_nleast_squares\"\n   )\nendif ()\n"
  },
  {
    "path": "libs/CoMISo/Examples/small_nsolver/main.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               CoMISo                                      *\n *      Copyright (C) 2008-2009 by Computer Graphics Group, RWTH Aachen      *\n *                           www.rwth-graphics.de                            *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of CoMISo.                                             *\n *                                                                           *\n *  CoMISo 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 *  CoMISo 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 CoMISo.  If not, see <http://www.gnu.org/licenses/>.          *\n *                                                                           *\n\\*===========================================================================*/ \n\n#include <CoMISo/Config/config.hh>\n\n#include <CoMISo/Utils/StopWatch.hh>\n#include <vector>\n#include <CoMISo/NSolver/LeastSquaresProblem.hh>\n#include <CoMISo/NSolver/LinearConstraint.hh>\n#include <CoMISo/NSolver/NPDerivativeChecker.hh>\n#include <CoMISo/NSolver/IPOPTSolver.hh>\n\n\n// solve least squares problem for x=1, y=2 and x-2y = 1\n\n// Example main\nint main(void)\n{\n  std::cout << \"---------- 1) Get an instance of a LeastSquaresProblem...\" << std::endl;\n  // number of unknowns\n  const int n = 2;\n  COMISO::LeastSquaresProblem lsqp(n);\n\n  // term0\n  COMISO::LinearConstraint::SVectorNC coeffs0(n);\n  coeffs0.coeffRef(0) = 1.0;\n  COMISO::LinearConstraint term0(coeffs0,-1.0,COMISO::NConstraintInterface::NC_EQUAL);\n  lsqp.add_term(&term0);\n\n    // term1\n  COMISO::LinearConstraint::SVectorNC coeffs1(n);\n  coeffs1.coeffRef(1) = 1.0;\n  COMISO::LinearConstraint term1(coeffs1,-2.0,COMISO::NConstraintInterface::NC_EQUAL);\n  lsqp.add_term(&term1);\n  \n    // term2\n  COMISO::LinearConstraint::SVectorNC coeffs2(n);\n  coeffs2.coeffRef(0) =  1.0;\n  coeffs2.coeffRef(1) = -2.0;\n  COMISO::LinearConstraint term2(coeffs2,-1.0,COMISO::NConstraintInterface::NC_EQUAL);\n  lsqp.add_term(&term2);\n  \n  std::cout << \"---------- 2) (optional for debugging) Check derivatives of problem...\" << std::endl;\n  COMISO::NPDerivativeChecker npd;\n  npd.check_all(&lsqp);\n\n// check if IPOPT solver available in current configuration\n#if( COMISO_IPOPT_AVAILABLE)\n  std::cout << \"---------- 3) Get IPOPT solver... \" << std::endl;\n  COMISO::IPOPTSolver ipsol;\n\n  std::cout << \"---------- 4) Solve...\" << std::endl;\n  // there are no constraints -> provide an empty vector\n  std::vector<COMISO::NConstraintInterface*> constraints;\n  ipsol.solve(&lsqp, constraints);\n#endif\n\n  std::cout << \"---------- 5) Print solution...\" << std::endl;\n  for( int i=0; i<n; ++i)\n    std::cerr << \"x_\" << i << \" = \" << lsqp.x()[i] << std::endl;\n  \n  return 0;\n}\n\n"
  },
  {
    "path": "libs/CoMISo/Examples/small_quadratic_example/CMakeLists.txt",
    "content": "include (ACGCommon)\ninclude (CoMISoExample)\n\n# source code directories\nset (directories \n  . \n)\n\n# collect all header and source files\nacg_append_files (headers \"*.hh\" ${directories})\nacg_append_files (sources \"*.cc\" ${directories})\n\n# remove template cc files from source file list\nacg_drop_templates (sources)\n\nif (WIN32)\n  acg_add_executable (small_quadratic_solver WIN32 ${sources} ${headers} )\nelseif (APPLE)\n  # generate bundle on mac\n  acg_add_executable (small_quadratic_solver MACOSX_BUNDLE ${sources} ${headers} )\nelse ()\n  acg_add_executable (small_quadratic_solver ${sources} ${headers} )\nendif ()\n\n# enable rpath linking\nset_target_properties(small_quadratic_solver PROPERTIES INSTALL_RPATH_USE_LINK_PATH 1)\n\ntarget_link_libraries (small_quadratic_solver\n  CoMISo\n  ${COMISO_LINK_LIBRARIES}\n)\n\nif (APPLE)\n   # create bundle in \"Build\" directory and set icon\n   # no install needed here, because the whole bundle will be installed in the\n   # toplevel CMakeLists.txt\n   set_target_properties (\n      small_quadratic_solver PROPERTIES\n      RUNTIME_OUTPUT_DIRECTORY \"${CMAKE_BINARY_DIR}/Build\"\n      MACOSX_BUNDLE_INFO_STRING \"CoMISo small_quadratic_solver\"\n   )\nendif ()\n"
  },
  {
    "path": "libs/CoMISo/Examples/small_quadratic_example/main.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               CoMISo                                      *\n *      Copyright (C) 2008-2009 by Computer Graphics Group, RWTH Aachen      *\n *                           www.rwth-graphics.de                            *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of CoMISo.                                             *\n *                                                                           *\n *  CoMISo 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 *  CoMISo 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 CoMISo.  If not, see <http://www.gnu.org/licenses/>.          *\n *                                                                           *\n\\*===========================================================================*/ \n\n\n\n#include <CoMISo/Utils/StopWatch.hh>\n#include <gmm/gmm.h>\n#include <vector>\n#include <CoMISo/Solver/ConstrainedSolver.hh>\n#include <CoMISo/Solver/MISolver.hh>\n#include <CoMISo/Solver/GMM_Tools.hh>\n\n\n/// function to initialize a simple system of linear equations\ntemplate<class MatrixT>\nvoid init_les( MatrixT& _A, std::vector< double >& _b)\n{\n  _A(0,0) = 25  ; _A(0,1) = 0 ; _A(0,2) = -15; _A(0,3) = 0 ; \n  _A(1,0) = 0   ; _A(1,1) = 20; _A(1,2) = -8 ; _A(1,3) = -4; \n  _A(2,0) = -15 ; _A(2,1) = -8; _A(2,2) = 17 ; _A(2,3) = 0 ; \n  _A(3,0) = 0   ; _A(3,1) = -4; _A(3,2) = 0  ; _A(3,3) = 4 ; \n\n  _b[0] = 0; _b[1] = 4; _b[2] = -2; _b[3] = 0;\n}\n\n/// function to print the equations corresponding to the matrices of an equation system\ntemplate<class MatrixT>\nvoid print_equations( const MatrixT& _B)\n{\n  int m = gmm::mat_nrows( _B);\n  int n = gmm::mat_ncols( _B);\n  for( int i = 0; i < m; ++i)\n  {\n    for( int j = 0; j < n-1; ++j)\n    {\n      if( _B(i,j) != 0.0)\n        std::cout << _B(i,j) << \"*x\" << j;\n      else\n        std::cout << \"   0 \";\n      if( j < n-2 ) std::cout << \" + \";\n    }\n    std::cout << \" = \" << _B(i, n-1) << std::endl;\n  }\n}\n\n\n// Example main\nint main(void)\n{\n  std::cout << \"---------- 1) Setup small (symmetric) test equation system Ax=b...\" << std::endl;\n  int n = 4;\n  gmm::col_matrix< gmm::wsvector< double > > A(n,n);\n  std::vector< double > x(n);\n  std::vector< double > b(n);\n\n  init_les( A, b);\n\n  // create an empty constraint matrix (will be used later)\n  gmm::row_matrix< gmm::wsvector< double > > constraints(0,n+1); //n+1 because of right hand side\n  // create an empty vector of variable indices to be rounded (will be used later)\n  std::vector< int > ids_to_round;\n\n  std::cout << A << std::endl << b << std::endl;\n\n\n  std::cout << \"---------- 2) The original solution to this system is...\" << std::endl;\n\n  COMISO::ConstrainedSolver cs;\n  //void solve( RMatrixT& _constraints, CMatrixT& _A, VectorT&  _x, VectorT&  _rhs, VectorIT& _idx_to_round, double    _reg_factor = 0.0, bool      _show_miso_settings = true, bool      _show_timings = true );\n  //_show_miso_settings requires a QT context and hence must be false in this example\n  cs.solve( constraints, A, x, b, ids_to_round, 0.0, false, true);  \n  // copy this solution for later\n  std::vector< double > org_x( x); \n  std::cout << x << std::endl;\n\n\n  std::cout << \"---------- 3) Rounding: forcing the second variable to lie on an integer, changes the solution to...\" << std::endl;\n  // reset system \n  init_les( A, b);\n  ids_to_round.push_back(1);\n  cs.solve( constraints, A, x, b, ids_to_round, 0.0, false, true);  \n  std::cout << x << std::endl;\n\n\n  std::cout << \"---------- 4) Constraining: forcing the first variable to equal the second changes the solution to...\" << std::endl;\n  // reset system \n  init_les( A, b);\n  ids_to_round.clear();\n  ids_to_round.push_back(1);\n  // setup constraint x0*1+x1*0+x2*(-1)+x3*0=0\n  gmm::resize( constraints, 1, n+1);\n  constraints( 0, 0 ) = 1.0;\n  constraints( 0, 1 ) = -1.0;\n  std::cout << \"           the constraint equation looks like this:\" << std::endl;\n  print_equations( constraints);\n  cs.solve( constraints, A, x, b, ids_to_round, 0.0, false, true);  \n  std::cout << x << std::endl;\n\n  return -1;\n}\n\n"
  },
  {
    "path": "libs/CoMISo/Examples/small_quadratic_resolve_example/CMakeLists.txt",
    "content": "include (ACGCommon)\ninclude (CoMISoExample)\n\n# source code directories\nset (directories \n  . \n)\n\n# collect all header and source files\nacg_append_files (headers \"*.hh\" ${directories})\nacg_append_files (sources \"*.cc\" ${directories})\n\n# remove template cc files from source file list\nacg_drop_templates (sources)\n\nif (WIN32)\n  acg_add_executable (small_quadratic_resolve WIN32 ${sources} ${headers} )\nelseif (APPLE)\n  # generate bundle on mac\n  acg_add_executable (small_quadratic_resolve MACOSX_BUNDLE ${sources} ${headers} )\nelse ()\n  acg_add_executable (small_quadratic_resolve ${sources} ${headers} )\nendif ()\n\n# enable rpath linking\nset_target_properties(small_quadratic_resolve PROPERTIES INSTALL_RPATH_USE_LINK_PATH 1)\n\ntarget_link_libraries (small_quadratic_resolve\n  CoMISo\n  ${COMISO_LINK_LIBRARIES}\n)\n\nif (APPLE)\n   # create bundle in \"Build\" directory and set icon\n   # no install needed here, because the whole bundle will be installed in the\n   # toplevel CMakeLists.txt\n   set_target_properties (\n      small_quadratic_solver PROPERTIES\n      RUNTIME_OUTPUT_DIRECTORY \"${CMAKE_BINARY_DIR}/Build\"\n      MACOSX_BUNDLE_INFO_STRING \"CoMISo small_quadratic_resolve\"\n   )\nendif ()\n"
  },
  {
    "path": "libs/CoMISo/Examples/small_quadratic_resolve_example/main.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               CoMISo                                      *\n *      Copyright (C) 2008-2009 by Computer Graphics Group, RWTH Aachen      *\n *                           www.rwth-graphics.de                            *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of CoMISo.                                             *\n *                                                                           *\n *  CoMISo 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 *  CoMISo 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 CoMISo.  If not, see <http://www.gnu.org/licenses/>.          *\n *                                                                           *\n\\*===========================================================================*/ \n\n\n\n#include <CoMISo/Utils/StopWatch.hh>\n#include <gmm/gmm.h>\n#include <vector>\n#include <CoMISo/Solver/ConstrainedSolver.hh>\n#include <CoMISo/Solver/MISolver.hh>\n#include <CoMISo/Solver/GMM_Tools.hh>\n\n\n/// function to initialize a simple system of linear equations\ntemplate<class MatrixT>\nvoid init_les( MatrixT& _A, std::vector< double >& _b)\n{\n  _A(0,0) = 25  ; _A(0,1) = 0 ; _A(0,2) = -15; _A(0,3) = 0 ; \n  _A(1,0) = 0   ; _A(1,1) = 20; _A(1,2) = -8 ; _A(1,3) = -4; \n  _A(2,0) = -15 ; _A(2,1) = -8; _A(2,2) = 17 ; _A(2,3) = 0 ; \n  _A(3,0) = 0   ; _A(3,1) = -4; _A(3,2) = 0  ; _A(3,3) = 4 ; \n\n  _b[0] = 0; _b[1] = 4; _b[2] = -2; _b[3] = 0;\n}\n\n/// function to print the equations corresponding to the matrices of an equation system\ntemplate<class MatrixT>\nvoid print_equations( const MatrixT& _B)\n{\n  int m = gmm::mat_nrows( _B);\n  int n = gmm::mat_ncols( _B);\n  for( int i = 0; i < m; ++i)\n  {\n    for( int j = 0; j < n-1; ++j)\n    {\n      if( _B(i,j) != 0.0)\n        std::cout << _B(i,j) << \"*x\" << j;\n      else\n        std::cout << \"   0 \";\n      if( j < n-2 ) std::cout << \" + \";\n    }\n    std::cout << \" = \" << -_B(i, n-1) << std::endl;\n  }\n}\n\n\n// Example main\nint main(void)\n{\n  std::cout << \"---------- 1) Setup small (symmetric) test equation system Ax=b...\" << std::endl;\n  int n = 4;\n  gmm::col_matrix< gmm::wsvector< double > > A(n,n);\n  std::vector< double > x(n);\n  std::vector< double > b(n);\n  \n  std::vector<double> x_bak;\n\n  std::cout << \"---------- 1) Set up problem...\" << std::endl;\n\n  init_les( A, b);\n\n  // create an empty constraint matrix (will be used later)\n  gmm::row_matrix< gmm::wsvector< double > > constraints(0,n+1); //n+1 because of right hand side\n  // create an empty vector of variable indices to be rounded (will be used later)\n  std::vector< int > ids_to_round;\n\n  std::cout << A << std::endl << b << std::endl;\n\n  // setup constraints\n  gmm::resize( constraints, 3, n+1);\n  constraints( 0, 0 ) = 1.0;\n  constraints( 0, 1 ) = -1.0;\n  constraints( 0, n ) = 2.0;\n  constraints( 1, 3 ) = 1.0;\n  constraints( 1, n ) = -1.0;\n  // add one redundant constraint (this will be filtered out during Gaussian elimination)\n  constraints( 2, 0 ) = 1.0;\n  constraints( 2, 1 ) = -1.0;\n  constraints( 2, n ) = 2.0;\n  std::cout << \"           the constraint equations looks like this:\" << std::endl;\n  print_equations( constraints);\n\n  std::cout << \"---------- 2) Solve full ...\" << std::endl;\n  COMISO::ConstrainedSolver cs;\n  cs.solve_const( constraints, A, x, b, ids_to_round, 0.0, false, true);  \n  x_bak = x;\n  \n  // first test: resolve with identical rhs's\n  std::vector<double> constraint_rhs(3); \n  std::vector<double> b_new = b;\n  constraint_rhs[0] = -2.0;\n  constraint_rhs[1] =  1.0;\n  constraint_rhs[2] = -2.0;\n\n  std::cout << \"---------- 2) Solve same rhs pre-factorized ...\" << std::endl;\n  cs.resolve(x, &constraint_rhs, &b_new);\n  std::cout << \"orig    result:    \" << x_bak << std::endl;\n  std::cout << \"resolve result:    \" << x     << std::endl;\n\n  // second test: resolve with changed rhs\n  constraint_rhs[0] =  4.0;\n  constraint_rhs[1] = -2.0;\n  constraint_rhs[2] =  4.0;\n  b_new[0] =  1.0; \n  b_new[1] = -2.0; \n  b_new[2] =  3.0; \n  b_new[3] = -5.0;\n\n  std::cout << \"---------- 3) Solve different rhs pre-factorized ...\" << std::endl;\n  cs.resolve(x, &constraint_rhs, &b_new);\n\n  \n  // solve with new factorization\n  constraints( 0, n ) = -4.0;\n  constraints( 1, n ) =  2.0;\n  constraints( 2, n ) = -4.0;\n  std::cout << \"---------- 4) Solve different rhs full ...\" << std::endl;\n  cs.solve_const( constraints, A, x_bak, b_new, ids_to_round, 0.0, false, true);  \n\n  std::cout << \"orig     result (with different rhs's):    \" << x_bak << std::endl;\n  std::cout << \"resolve  result (with different rhs's):    \" << x     << std::endl;\n  \n  return 0;\n}\n\n"
  },
  {
    "path": "libs/CoMISo/Examples/small_sparseqr/CMakeLists.txt",
    "content": "include (ACGCommon)\ninclude (CoMISoExample)\n\n# source code directories\nset (directories \n  . \n)\n\n# collect all header and source files\nacg_append_files (headers \"*.hh\" ${directories})\nacg_append_files (sources \"*.cc\" ${directories})\n\n# remove template cc files from source file list\nacg_drop_templates (sources)\n\nif (WIN32)\n  acg_add_executable (small_sparseqr WIN32 ${sources} ${headers} )\nelseif (APPLE)\n  # generate bundle on mac\n  acg_add_executable (small_sparseqr MACOSX_BUNDLE ${sources} ${headers} )\nelse ()\n  acg_add_executable (small_sparseqr ${sources} ${headers} )\nendif ()\n\n# enable rpath linking\nset_target_properties(small_sparseqr PROPERTIES INSTALL_RPATH_USE_LINK_PATH 1)\n\ntarget_link_libraries (small_sparseqr\n  CoMISo\n  ${COMISO_LINK_LIBRARIES}\n)\n\nif (APPLE)\n   # create bundle in \"Build\" directory and set icon\n   # no install needed here, because the whole bundle will be installed in the\n   # toplevel CMakeLists.txt\n   set_target_properties (\n      small_sparseqr PROPERTIES\n      RUNTIME_OUTPUT_DIRECTORY \"${CMAKE_BINARY_DIR}/Build\"\n      MACOSX_BUNDLE_INFO_STRING \"CoMISo small_sparseqr\"\n   )\nendif ()\n"
  },
  {
    "path": "libs/CoMISo/Examples/small_sparseqr/main.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               CoMISo                                      *\n *      Copyright (C) 2008-2009 by Computer Graphics Group, RWTH Aachen      *\n *                           www.rwth-graphics.de                            *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of CoMISo.                                             *\n *                                                                           *\n *  CoMISo 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 *  CoMISo 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 CoMISo.  If not, see <http://www.gnu.org/licenses/>.          *\n *                                                                           *\n\\*===========================================================================*/ \n\n#include <CoMISo/Config/config.hh>\n#include <vector>\n#include <cstdlib>\n#include <iostream>\n\n//------------------------------------------------------------------------------------------------------\n#if COMISO_SUITESPARSE_SPQR_AVAILABLE // additional spqr library required\n//------------------------------------------------------------------------------------------------------\n\n#include <CoMISo/Utils/StopWatch.hh>\n#include <Eigen/Sparse>\n#include <CoMISo/Solver/SparseQRSolver.hh>\n#include <CoMISo/Solver/Eigen_Tools.hh>\n\n\n//------------------------------------------------------------------------------------------------------\n\n// Example main\nint main(void)\n{\n  std::cout << \"---------- 0) Using Sparse QR for solving underdetermined equations and computing Null spaces \" << std::endl;\n\n  typedef Eigen::SparseMatrix< double > SpMatrix;\n  typedef Eigen::MatrixXd DenMatrix;\n  typedef Eigen::Triplet< double > Triplet;\n\n  int dimr(4+1);\n  int dimc(4+2);\n\n  std::cout << \"---------- 1) Creating matrix \" << std::endl;\n  std::vector< Triplet > triplets;\n  for( int i = 0; i < dimc*dimr/2; ++i)\n  {\n    int x( rand()%(dimr-1));\n    int y( rand()%dimc);\n    double val( rand()%10);\n    //std::cerr << \" setting (\" << x << \", \" << y << \") to \" << val << std::endl;\n    triplets.push_back( Triplet( x, y, val));\n  }\n  SpMatrix A(dimr,dimc);\n  A.setFromTriplets(triplets.begin(), triplets.end());\n  \n  std::cerr << DenMatrix(A) << std::endl;\n  int m = dimr;\n  int n = dimc;\n\n  if( m < n )\n  {\n    std::swap( m,n);\n    std::cerr << \" ... m < n -> form transposed ...\" << std::endl;\n    A = SpMatrix(A.transpose());\n    // test make also row -rank-deficinet\n    A.middleCols(n-1,1) = A.middleCols(0,1);\n    A.middleCols(0,1) = A.middleCols(n-2,1);\n    std::cerr << DenMatrix(A) << std::endl;\n  }\n\n\n  std::cerr << \" ... m = \" << m << \"; n = \" << n << std::endl;\n  std::cerr << std::endl;\n\n  std::cout << \"---------- 2) Sparse QR \" << std::endl;\n  COMISO::SparseQRSolver spqr;\n  SpMatrix Q,R;\n  std::vector< size_t > P;\n  int rank = spqr.factorize_system_eigen( A, Q, R, P);\n  int nullity(dimc-rank);\n  // setup permutation matrix\n  SpMatrix Pm( n, n);\n  if( !P.empty())\n  {\n    for( size_t i = 0; i < P.size(); ++i)\n    {\n      Pm.coeffRef( i, P[i]) = 1;\n    }\n  }\n\n  std::cout << \"---------- 3) Result \" << std::endl;\n  std::cerr << \" Q         \" << std::endl << DenMatrix(Q) << std::endl;\n  std::cerr << \" R         \" << std::endl << DenMatrix(R) << std::endl;\n  std::cerr << \" P         \" << std::endl << P << std::endl;\n  std::cerr << \" P matrix  \" << std::endl << DenMatrix(Pm) << std::endl;\n  std::cerr << \" Rank      \" << rank << std::endl;\n  std::cerr << \" Nullity   \" << nullity << std::endl;\n  // extract nullspace\n  SpMatrix NullSpace( Q.middleCols( std::max( 0, m-nullity), nullity));\n  std::cerr << \" Nullspace \" << std::endl << DenMatrix(NullSpace) << std::endl;\n  // non nullspace part of R\n  //// assuming superflous column in R is the last (if A is also row deficient)\n  //SpMatrix Rtmp(R.middleCols(0,std::min(n,n-(n-rank))).transpose());\n  //SpMatrix R1( R.transpose().middleCols(0, m-nullity));\n  SpMatrix Rtmp(R.transpose());\n  SpMatrix R1t( Rtmp.middleCols(0,m-nullity));\n  SpMatrix R1( R1t.transpose());\n  std::cerr << \" Non-Nullspace R \" << std::endl << DenMatrix(R1) << std::endl;\n  \n\n\n  std::cout << \"---------- 4) Verification \" << std::endl;\n  SpMatrix reconstructedA(Q*R*Pm.transpose());\n  std::cerr << \" Q orthogonal? \\t \" << ((fabs((Q.transpose()*Q).squaredNorm()-m) < 1e-8)?\"yes\":\"no\") << std::endl;\n  std::cerr << \" A = QR?       \\t \" << (((reconstructedA-A).squaredNorm() < 1e-8)? \"yes\":\"no\") << std::endl;\n\n\n  std::cerr << std::endl << std::endl;\n  std::cout << \"---------- 5) Solving Ax=b (with x without nullspace component)\" << std::endl;\n  // NOTE: A was transposed above to be m>n\n  SpMatrix b(n,1);\n  SpMatrix x(m,1);\n  for( int i = 0; i < n; ++i)\n    b.coeffRef(i,0) = rand()%10;\n  std::cerr << \" ... System Ax = b .. \\n\";\n  std::cerr << \" A \" << std::endl << DenMatrix(A.transpose()) << \" x \" << std::endl << DenMatrix(x) << \" b \" << std::endl << DenMatrix(b) << std::endl;\n\n  std::cout << \"---------- 5.1) test: solve using sparse QR solving ..\" << std::endl;\n  SpMatrix At(A.transpose());\n  spqr.solve_system_eigen( At, b, x);\n\n  std::cerr << \" ... solution x .. \" << std::endl;\n  std::cerr << DenMatrix(x) << std::endl;\n\n  std::cerr << \" ... test: is a solution ? \" << (((A.transpose()*x-b).squaredNorm()<1e-8)?\"yes\":\"no\") << std::endl;\n  std::cerr << \" ... test: has nullspace component ? \" << ((x.transpose()*NullSpace).squaredNorm()<1e-8?\"yes\":\"no\") << std::endl;\n  std::cerr << \" ... Nullspace projections : \" << (x.transpose()*NullSpace) << std::endl;\n\n  std::cout << \"---------- 5.2) test: solve without nullspace ..\" << std::endl;\n  SpMatrix Atnull(At);\n  SpMatrix bnull(b);\n  SpMatrix xnull(m,1);\n  spqr.solve_system_eigen_min2norm( Atnull, bnull, xnull);\n  std::cerr << \" ... solution x .. \" << std::endl;\n  std::cerr << DenMatrix(xnull) << std::endl;\n\n  std::cerr << \" ... test: is a solution ? \" << (((A.transpose()*xnull-bnull).squaredNorm()<1e-8)?\"yes\":\"no\") << std::endl;\n  std::cerr << \" ... test: has nullspace component ? \" << ((xnull.transpose()*NullSpace).squaredNorm()<1e-8?\"yes\":\"no\") << std::endl;\n  std::cerr << \" ... Nullspace projections : \" << (xnull.transpose()*NullSpace) << std::endl;\n\n\n\n  return 0;\n}\n\n#else // COMISO_SUITESPARSE_SPQR_AVAILABLE\n\nint main(void)\n{\n  std::cerr << \" SUITESPARSE_SPQR not available, please re-configure!\\n\";\n  return 0;\n}\n\n#endif  // COMISO_SUITESPARSE_SPQR_AVAILABLE\n\n"
  },
  {
    "path": "libs/CoMISo/NSolver/BoundConstraint.cc",
    "content": "//=============================================================================\n//\n//  CLASS BoundConstraint - IMPLEMENTATION\n//\n//=============================================================================\n\n\n//== INCLUDES =================================================================\n\n#include \"BoundConstraint.hh\"\n\n\n//== FORWARDDECLARATIONS ======================================================\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO { \n\n//== CLASS DEFINITION =========================================================\n\n\t      \n\nBoundConstraint::\nBoundConstraint(const unsigned int  _var_idx,   // index of variable for bound constraint\n                const double        _bound,     // bound: x(_var_idx) #_type, <,=,># _bound\n                const unsigned int   _n,        // number of unknowns in problem\n                const ConstraintType _type)     // type of bound upper, lower or both (equal)\n  : NConstraintInterface(_type), idx_(_var_idx), bound_(_bound), n_(_n)\n{\n}\n\n\n//-----------------------------------------------------------------------------\n\nBoundConstraint::\n~BoundConstraint()\n{\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nint\nBoundConstraint::\nn_unknowns()\n{\n  return n_;\n}\n\n\n//-----------------------------------------------------------------------------\n\ndouble\nBoundConstraint::\neval_constraint ( const double* _x                     )\n{\n  return _x[idx_] - bound_;\n}\n\n\n//-----------------------------------------------------------------------------\n\nvoid\nBoundConstraint::\neval_gradient   ( const double* _x, SVectorNC& _g      )\n{\n  _g.resize(n_); _g.coeffRef(idx_) = 1.0;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid\nBoundConstraint::\neval_hessian    ( const double* _x, SMatrixNC& _h      )\n{\n  _h.clear(); _h.resize(n_,n_);\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nbool\nBoundConstraint::\nis_linear()\n{\n  return true;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nunsigned int&\nBoundConstraint::\nidx()\n{\n  return idx_;\n}\n\n//-----------------------------------------------------------------------------\n\n\ndouble&\nBoundConstraint::\nbound()\n{\n  return bound_;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nunsigned int&\nBoundConstraint::\nn()\n{\n  return n_;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid\nBoundConstraint::\nresize(const unsigned int _n)\n{\n  n_ = _n;\n}\n\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n"
  },
  {
    "path": "libs/CoMISo/NSolver/BoundConstraint.hh",
    "content": "//=============================================================================\n//\n//  CLASS BoundConstraint\n//\n//=============================================================================\n\n\n#ifndef COMISO_BOUNDCONSTRAINT_HH\n#define COMISO_BOUNDCONSTRAINT_HH\n\n\n//== INCLUDES =================================================================\n\n#include <CoMISo/Config/CoMISoDefines.hh>\n#include \"NConstraintInterface.hh\"\n\n\n//== FORWARDDECLARATIONS ======================================================\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO { \n\n//== CLASS DEFINITION =========================================================\n\n\t      \n\n/** \\class BoundConstraint\n\n    Brief Description.\n  \n    A more elaborate description follows.\n*/\nclass COMISODLLEXPORT BoundConstraint : public NConstraintInterface\n{\npublic:\n  \n//  inherited from NConstraintInterface\n//  typedef Eigen::SparseVector<double> SVectorNC;\n//  typedef SuperSparseMatrixT<double>  SMatrixNC;\n//  // different types of constraints\n//  enum ConstraintType {NC_EQUAL, NC_LESS_EQUAL, NC_GREATER_EQUAL};\n\n  /// Default constructor\n  BoundConstraint(const unsigned int  _var_idx = 0,   // index of variable for bound constraint\n                  const double        _bound   = 0.0, // bound: x(_var_idx) #_type, <,=,># _bound\n                  const unsigned int   _n      = 0,   // number of unknowns in problem\n                  const ConstraintType _type   = NC_LESS_EQUAL); // type of bound upper, lower or both (equal)\n\n \n  /// Destructor\n  virtual ~BoundConstraint();\n\n  virtual int    n_unknowns      (                                      );\n  virtual double eval_constraint ( const double* _x                     );\n  virtual void   eval_gradient   ( const double* _x, SVectorNC& _g      );\n  virtual void   eval_hessian    ( const double* _x, SMatrixNC& _h      );\n\n  virtual bool   is_linear();\n\n  // set/get values\n  unsigned int& idx();\n  double&       bound();\n  unsigned int& n();\n  void resize(const unsigned int _n);\n\nprivate:\n  // variable idx\n  unsigned int idx_;\n  // variable bound\n  double bound_;\n  // number of unknowns\n  unsigned int n_;\n};\n\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n#endif // ACG_BOUNDCONSTRAINT_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/CoMISo/NSolver/COMISOSolver.cc",
    "content": "//=============================================================================\n//\n//  CLASS COMISOSolver - IMPLEMENTATION\n//\n//=============================================================================\n\n//== INCLUDES =================================================================\n\n//== COMPILE-TIME PACKAGE REQUIREMENTS ========================================\n#include <CoMISo/Config/config.hh>\n//=============================================================================\n\n#include <vector>\n#include \"COMISOSolver.hh\"\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== IMPLEMENTATION ========================================================== \n\n\n// ********** SOLVE **************** //\nvoid\nCOMISOSolver::\nsolve(NProblemInterface*                  _problem,\n      std::vector<NConstraintInterface*>& _constraints,\n      std::vector<PairUiV>&               _discrete_constraints,\n      double                              _reg_factor,\n      bool                                _show_miso_settings,\n      bool                                _show_timings        )\n{\n\n  //----------------------------------------------\n  // 1. identify integer variables\n  //----------------------------------------------\n\n  // identify integer variables\n  std::vector<int> round_idxs;\n  for(unsigned int i=0; i<_discrete_constraints.size(); ++i)\n    switch(_discrete_constraints[i].second)\n    {\n      case Binary :\n      case Integer:\n        round_idxs.push_back(_discrete_constraints[i].first); break;\n      default     : break;\n    }\n\n\n  //----------------------------------------------\n  // 2. setup constraints\n  //----------------------------------------------\n  int n = _problem->n_unknowns();\n  gmm::row_matrix< gmm::wsvector< double > > C(_constraints.size(), n+1);\n  int n_constraints = 0;\n\n  // get zero vector\n  std::vector<double> x(n, 0.0);\n\n  for(unsigned int i=0; i<_constraints.size();  ++i)\n    if(_constraints[i]->constraint_type() == NConstraintInterface::NC_EQUAL)\n    {\n      if(!_constraints[i]->is_linear())\n        std::cerr << \"Warning: COMISOSolver received a problem with non-linear constraints!!!\" << std::endl;\n\n      // get linear part\n      NConstraintInterface::SVectorNC gc;\n      _constraints[i]->eval_gradient(P(x), gc);\n\n      NConstraintInterface::SVectorNC::InnerIterator v_it(gc);\n      for(; v_it; ++v_it)\n        C(n_constraints, v_it.index()) = v_it.value();\n\n      // get constant part\n      C(n_constraints, n) = _constraints[i]->eval_constraint(P(x));\n\n      // move to next constraint\n      ++n_constraints;\n    }\n\n  // resize matrix to final number of constraints\n  gmm::resize(C,n_constraints, n+1);\n\n\n  //----------------------------------------------\n  // 3. setup energy\n  //----------------------------------------------\n\n  if(!_problem->constant_hessian())\n    std::cerr << \"Warning: COMISOSolver received a problem with non-constant hessian!!!\" << std::endl;\n\n\n  // get hessian matrix\n  gmm::col_matrix< gmm::wsvector< double > > A(n,n);\n  NProblemInterface::SMatrixNP H;\n  _problem->eval_hessian(P(x), H);\n  for( int i=0; i<H.outerSize(); ++i)\n    for (NProblemInterface::SMatrixNP::InnerIterator it(H,i); it; ++it)\n      A(it.row(),it.col()) = it.value();\n\n\n  // get negative gradient\n  std::vector<double> rhs(_problem->n_unknowns());\n  _problem->eval_gradient(P(x), P(rhs));\n  for(unsigned int i=0; i<rhs.size(); ++i)\n    rhs[i] = -rhs[i];\n\n//  // add constant part\n//  objective += _problem->eval_f(P(x));\n\n  //----------------------------------------------\n  // 4. solve problem\n  //----------------------------------------------\n\n  cs_.solve(C,A,x,rhs,round_idxs,\n            _reg_factor, _show_miso_settings, _show_timings);\n\n  //  void solve(\n  //      RMatrixT& _constraints,\n  //      CMatrixT& _A,\n  //      VectorT&  _x,\n  //      VectorT&  _rhs,\n  //      VectorIT& _idx_to_round,\n  //      double    _reg_factor = 0.0,\n  //      bool      _show_miso_settings = true,\n  //      bool      _show_timings = true );\n\n  //----------------------------------------------\n  // 5. store result\n  //----------------------------------------------\n\n  _problem->store_result(P(x));\n\n//  std::cout << \"COMISO Objective: \" << model.get(GRB_DoubleAttr_ObjVal) << std::endl;\n}\n\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n"
  },
  {
    "path": "libs/CoMISo/NSolver/COMISOSolver.hh",
    "content": "//=============================================================================\n//\n//  CLASS COMISOSolver\n//\n//=============================================================================\n\n\n#ifndef COMISO_COMISOSOLVER_HH\n#define COMISO_COMISOSOLVER_HH\n\n\n//== COMPILE-TIME PACKAGE REQUIREMENTS ========================================\n#include <CoMISo/Config/config.hh>\n\n//== INCLUDES =================================================================\n\n#include <CoMISo/Config/CoMISoDefines.hh>\n#include <CoMISo/Solver/ConstrainedSolver.hh>\n#include <vector>\n#include \"NProblemInterface.hh\"\n#include \"NConstraintInterface.hh\"\n#include \"VariableType.hh\"\n\n\n//== FORWARDDECLARATIONS ======================================================\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== CLASS DEFINITION =========================================================\n\n\t      \n\n/** \\class NewtonSolver GUROBISolver.hh\n\n    Brief Description.\n  \n    A more elaborate description follows.\n*/\nclass COMISODLLEXPORT COMISOSolver\n{\npublic:\n   \n  typedef std::pair<unsigned int, VariableType> PairUiV;\n\n  /// Default constructor\n  COMISOSolver() {}\n \n  /// Destructor\n  ~COMISOSolver() {}\n\n  // ********** SOLVE **************** //\n  void solve(NProblemInterface*                  _problem,                      // problem instance\n             std::vector<NConstraintInterface*>& _constraints,                  // linear constraints\n             std::vector<PairUiV>&               _discrete_constraints,         // discrete constraint\n             double                              _reg_factor = 0.0,             // reguluarization factor\n             bool                                _show_miso_settings = true,    // show settings dialog\n             bool                                _show_timings = true        ); // show timings\n\n\n  // get reference to ConstrainedSolver to manipulate parameters\n  ConstrainedSolver& solver() { return cs_;}\n\nprotected:\n  double* P(std::vector<double>& _v)\n  {\n    if( !_v.empty())\n      return ((double*)&_v[0]);\n    else\n      return 0;\n  }\n\nprivate:\n  ConstrainedSolver cs_;\n};\n\n\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n#endif // ACG_GUROBISOLVER_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/CoMISo/NSolver/CPLEXSolver.cc",
    "content": "//=============================================================================\n//\n//  CLASS CPLEXSolver - IMPLEMENTATION\n//\n//=============================================================================\n\n//== INCLUDES =================================================================\n\n//== COMPILE-TIME PACKAGE REQUIREMENTS ========================================\n#include \"CPLEXSolver.hh\"\n#if COMISO_CPLEX_AVAILABLE\n//=============================================================================\n\n\n#include <stdexcept>\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== IMPLEMENTATION ========================================================== \n\n\n\nCPLEXSolver::\nCPLEXSolver()\n{\n}\n\n\n//-----------------------------------------------------------------------------\n\n\n//void\n//CPLEXSolver::\n//set_problem_output_path( const std::string &_problem_output_path)\n//{\n//  problem_output_path_ = _problem_output_path;\n//}\n//\n//\n////-----------------------------------------------------------------------------\n//\n//\n//void\n//CPLEXSolver::\n//set_problem_env_output_path( const std::string &_problem_env_output_path)\n//{\n//  problem_env_output_path_ = _problem_env_output_path;\n//}\n//\n//\n////-----------------------------------------------------------------------------\n//\n//\n//void\n//CPLEXSolver::\n//set_solution_input_path(const std::string &_solution_input_path)\n//{\n//  solution_input_path_ = _solution_input_path;\n//}\n\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n#endif // COMISO_CPLEX_AVAILABLE\n//=============================================================================\n"
  },
  {
    "path": "libs/CoMISo/NSolver/CPLEXSolver.hh",
    "content": "//=============================================================================\n//\n//  CLASS CPLEXSolver\n//\n//=============================================================================\n\n\n#ifndef COMISO_CPLEXSOLVER_HH\n#define COMISO_CPLEXSOLVER_HH\n\n\n//== COMPILE-TIME PACKAGE REQUIREMENTS ========================================\n#include <CoMISo/Config/config.hh>\n#if COMISO_CPLEX_AVAILABLE\n\n//== INCLUDES =================================================================\n\n#include <CoMISo/Config/CoMISoDefines.hh>\n#include <vector>\n#include <string>\n#include \"NProblemInterface.hh\"\n#include \"NConstraintInterface.hh\"\n#include \"VariableType.hh\"\n\n#include <ilcplex/ilocplex.h>\nILOSTLBEGIN\n\n//== FORWARDDECLARATIONS ======================================================\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== CLASS DEFINITION =========================================================\n\n\t      \n\n/** \\class NewtonSolver CPLEXSolver.hh\n\n    Brief Description.\n  \n    A more elaborate description follows.\n*/\nclass COMISODLLEXPORT CPLEXSolver\n{\npublic:\n\n  /// Default constructor\n  CPLEXSolver();\n \n  /// Destructor\n  ~CPLEXSolver() { /*env_.end();*/}\n\n  // ********** SOLVE **************** //\n  // this function has to be inline due to static linking issues\n  inline bool solve(NProblemInterface*                  _problem,                // problem instance\n                    std::vector<NConstraintInterface*>& _constraints,            // linear constraints\n                    std::vector<PairIndexVtype>&        _discrete_constraints,   // discrete constraints\n                    const double                        _time_limit = 60,\n                    const bool                          _silent = false);  // time limit in seconds\n\n//  void set_problem_output_path    ( const std::string &_problem_output_path);\n//  void set_problem_env_output_path( const std::string &_problem_env_output_path);\n//  void set_solution_input_path    ( const std::string &_solution_input_path);\n\nprotected:\n  double* P(std::vector<double>& _v)\n  {\n    if( !_v.empty())\n      return ((double*)&_v[0]);\n    else\n      return 0;\n  }\n\nprivate:\n\n  // CPLEX environment\n//  IloEnv env_;\n\n  // filenames for exporting/importing gurobi solutions\n  // if string is empty nothing is imported or exported\n//  std::string problem_output_path_;\n//  std::string problem_env_output_path_;\n//  std::string solution_input_path_;\n};\n\n\n\n//=============================================================================\n} // namespace COMISO\n\n//=============================================================================\n#endif // COMISO_CPLEX_AVAILABLE\n//=============================================================================\n#if defined(INCLUDE_TEMPLATES) && !defined(COMISO_CPLEXSOLVER_C)\n#define COMISO_CPLEXSOLVER_TEMPLATES\n#include \"CPLEXSolverT.cc\"\n#endif\n//=============================================================================\n#endif // ACG_CPLEXSOLVER_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/CoMISo/NSolver/CPLEXSolverT.cc",
    "content": "//=============================================================================\n//\n//  CLASS GCPLEXSolver - IMPLEMENTATION\n//\n//=============================================================================\n\n#define COMISO_CPLEXSOLVER_C\n\n//== INCLUDES =================================================================\n\n//== COMPILE-TIME PACKAGE REQUIREMENTS ========================================\n#include \"CPLEXSolver.hh\"\n#if COMISO_CPLEX_AVAILABLE\n//=============================================================================\n\n\n#include <stdexcept>\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== IMPLEMENTATION ========================================================== \n\n\n\n// ********** SOLVE **************** //\nbool\nCPLEXSolver::\nsolve(NProblemInterface*                  _problem,\n      std::vector<NConstraintInterface*>& _constraints,\n      std::vector<PairIndexVtype>&        _discrete_constraints,\n      const double                        _time_limit,\n      const bool                          _silent)\n{\n  try\n  {\n    //----------------------------------------------\n    // 0. set up environment\n    //----------------------------------------------\n    if(!_silent)\n      std::cerr << \"cplex -> get environment...\\n\";\n    IloEnv env_;\n\n    if(!_silent)\n      std::cerr << \"cplex -> get model...\\n\";\n    IloModel model(env_);\n    //    model.getEnv().set(GRB_DoubleParam_TimeLimit, _time_limit);\n\n    //----------------------------------------------\n    // 1. allocate variables\n    //----------------------------------------------\n    if(!_silent)\n      std::cerr << \"cplex -> allocate variables...\\n\";\n    // determine variable types: 0->real, 1->integer, 2->bool\n    std::vector<char> vtypes(_problem->n_unknowns(),0);\n    for(unsigned int i=0; i<_discrete_constraints.size(); ++i)\n      if(_discrete_constraints[i].first < vtypes.size())\n      {\n        switch(_discrete_constraints[i].second)\n        {\n          case Integer: vtypes[_discrete_constraints[i].first] = 1; break;\n          case Binary : vtypes[_discrete_constraints[i].first] = 2; break;\n          default     : break;\n        }\n      }\n      else\n        std::cerr << \"ERROR: requested a discrete variable which is above the total number of variables\"\n                  << _discrete_constraints[i].first << \" vs \" << vtypes.size() << std::endl;\n\n    // CPLEX variables\n    std::vector<IloNumVar> vars;\n    // first all\n    for( int i=0; i<_problem->n_unknowns(); ++i)\n      switch(vtypes[i])\n      {\n        case 0 : vars.push_back( IloNumVar(env_,-IloInfinity, IloInfinity, IloNumVar::Float) ); break;\n        case 1 : vars.push_back( IloNumVar(env_,  -IloIntMax,   IloIntMax, IloNumVar::Int)   ); break;\n        case 2 : vars.push_back( IloNumVar(env_,           0,           1, IloNumVar::Bool)  ); break;\n      }\n\n\n    // Integrate new variables\n//    model.update();\n\n    //----------------------------------------------\n    // 2. setup constraints\n    //----------------------------------------------\n    if(!_silent)\n      std::cerr << \"cplex -> setup constraints...\\n\";\n\n    // get zero vector\n    std::vector<double> x(_problem->n_unknowns(), 0.0);\n\n    for(unsigned int i=0; i<_constraints.size();  ++i)\n    {\n      if(!_constraints[i]->is_linear())\n        std::cerr << \"Warning: CPLEXSolver received a problem with non-linear constraints!!!\" << std::endl;\n\n      IloExpr lin_expr(env_);\n      NConstraintInterface::SVectorNC gc;\n      _constraints[i]->eval_gradient(P(x), gc);\n\n      NConstraintInterface::SVectorNC::InnerIterator v_it(gc);\n      for(; v_it; ++v_it)\n        lin_expr += vars[v_it.index()]*v_it.value();\n\n      double b = _constraints[i]->eval_constraint(P(x));\n\n\n      switch(_constraints[i]->constraint_type())\n      {\n        case NConstraintInterface::NC_EQUAL         : model.add(lin_expr + b == 0); break;\n        case NConstraintInterface::NC_LESS_EQUAL    : model.add(lin_expr + b <= 0); break;\n        case NConstraintInterface::NC_GREATER_EQUAL : model.add(lin_expr + b >= 0); break;\n      }\n\n    }\n\n//    model.update();\n\n    //----------------------------------------------\n    // 3. setup energy\n    //----------------------------------------------\n    if(!_silent)\n      std::cerr << \"cplex -> setup energy...\\n\";\n\n    if(!_problem->constant_hessian())\n      std::cerr << \"Warning: CPLEXSolver received a problem with non-constant hessian!!!\" << std::endl;\n\n//    GRBQuadExpr objective;\n    IloExpr objective(env_);\n\n    // add quadratic part\n    NProblemInterface::SMatrixNP H;\n    _problem->eval_hessian(P(x), H);\n    for( int i=0; i<H.outerSize(); ++i)\n      for (NProblemInterface::SMatrixNP::InnerIterator it(H,i); it; ++it)\n        objective += 0.5*it.value()*vars[it.row()]*vars[it.col()];\n\n\n    // add linear part\n    std::vector<double> g(_problem->n_unknowns());\n    _problem->eval_gradient(P(x), P(g));\n    for(unsigned int i=0; i<g.size(); ++i)\n      objective += g[i]*vars[i];\n\n    // add constant part\n    objective += _problem->eval_f(P(x));\n\n    model.add(IloMinimize(env_,objective));\n\n//    model.set(GRB_IntAttr_ModelSense, 1);\n//    model.setObjective(objective);\n//    model.update();\n\n\n    //----------------------------------------------\n    // 4. solve problem\n    //----------------------------------------------\n    if(!_silent)\n      std::cerr << \"cplex -> generate model...\\n\";\n    IloCplex cplex(model);\n    cplex.setParam(IloCplex::TiLim, _time_limit);\n    { // hack\n//    0 [CPX_NODESEL_DFS] Depth-first search\n//    1 [CPX_NODESEL_BESTBOUND] Best-bound search\n//    2 [CPX_NODESEL_BESTEST] Best-estimate search\n//    3 [CPX_NODESEL_BESTEST_ALT] Alternative best-estimate search\n//    cplex.setParam(IloCplex::NodeSel , 0);\n    }\n    if(!_silent)\n      std::cerr << \"cplex -> solve...\\n\";\n\n    // silent mode?\n    if(_silent)\n      cplex.setOut(env_.getNullStream());\n\n    IloBool solution_found = cplex.solve();\n\n\n//    if (solution_input_path_.empty())\n//    {\n//      if (!problem_env_output_path_.empty())\n//      {\n//        std::cout << \"Writing problem's environment into file \\\"\" << problem_env_output_path_ << \"\\\".\" << std::endl;\n//        model.getEnv().writeParams(problem_env_output_path_);\n//      }\n//      if (!problem_output_path_.empty())\n//      {\n//        std::cout << \"Writing problem into file \\\"\" << problem_output_path_ << \"\\\".\" << std::endl;\n//        GurobiHelper::outputModelToMpsGz(model, problem_output_path_);\n//      }\n//\n//      model.optimize();\n//    }\n//    else\n//    {\n//        std::cout << \"Reading solution from file \\\"\" << solution_input_path_ << \"\\\".\" << std::endl;\n//    }\n//\n    //----------------------------------------------\n    // 5. store result\n    //----------------------------------------------\n\n    if(solution_found != IloFalse)\n    {\n      if(!_silent)\n        std::cerr << \"cplex -> store result...\\n\";\n      // store computed result\n      for(unsigned int i=0; i<vars.size(); ++i)\n        x[i] = cplex.getValue(vars[i]);\n\n      _problem->store_result(P(x));\n    }\n\n/*\n    if (solution_input_path_.empty())\n    {\n      // store computed result\n      for(unsigned int i=0; i<vars.size(); ++i)\n        x[i] = vars[i].get(GRB_DoubleAttr_X);\n    }\n*/\n//    else\n//    {\n//        std::cout << \"Loading stored solution from \\\"\" << solution_input_path_ << \"\\\".\" << std::endl;\n//        // store loaded result\n//        const size_t oldSize = x.size();\n//        x.clear();\n//        GurobiHelper::readSolutionVectorFromSOL(x, solution_input_path_);\n//        if (oldSize != x.size()) {\n//            std::cerr << \"oldSize != x.size() <=> \" << oldSize << \" != \" << x.size() << std::endl;\n//            throw std::runtime_error(\"Loaded solution vector doesn't have expected dimension.\");\n//        }\n//    }\n//\n//    _problem->store_result(P(x));\n//\n//    // ObjVal is only available if the optimize was called.\n//    if (solution_input_path_.empty())\n//        std::cout << \"GUROBI Objective: \" << model.get(GRB_DoubleAttr_ObjVal) << std::endl;\n    return solution_found;\n  }\n  catch (IloException& e)\n  {\n     cerr << \"Concert exception caught: \" << e << endl;\n     return false;\n  }\n  catch (...)\n  {\n     cerr << \"Unknown exception caught\" << endl;\n     return false;\n  }\n\n  return false;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\n//void\n//CPLEXSolver::\n//set_problem_output_path( const std::string &_problem_output_path)\n//{\n//  problem_output_path_ = _problem_output_path;\n//}\n//\n//\n////-----------------------------------------------------------------------------\n//\n//\n//void\n//CPLEXSolver::\n//set_problem_env_output_path( const std::string &_problem_env_output_path)\n//{\n//  problem_env_output_path_ = _problem_env_output_path;\n//}\n//\n//\n////-----------------------------------------------------------------------------\n//\n//\n//void\n//CPLEXSolver::\n//set_solution_input_path(const std::string &_solution_input_path)\n//{\n//  solution_input_path_ = _solution_input_path;\n//}\n\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n#endif // COMISO_CPLEX_AVAILABLE\n//=============================================================================\n"
  },
  {
    "path": "libs/CoMISo/NSolver/GUROBISolver.cc",
    "content": "//=============================================================================\n//\n//  CLASS GUROBISolver - IMPLEMENTATION\n//\n//=============================================================================\n\n//== INCLUDES =================================================================\n\n//== COMPILE-TIME PACKAGE REQUIREMENTS ========================================\n#include <CoMISo/Config/config.hh>\n#if COMISO_GUROBI_AVAILABLE\n//=============================================================================\n\n\n#include \"GUROBISolver.hh\"\n\n#include <stdexcept>\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== IMPLEMENTATION ========================================================== \n\n\n\nGUROBISolver::\nGUROBISolver()\n{\n}\n\n//-----------------------------------------------------------------------------\n\n// ********** SOLVE **************** //\nbool\nGUROBISolver::\nsolve(NProblemInterface*                  _problem,\n      std::vector<NConstraintInterface*>& _constraints,\n      std::vector<PairIndexVtype>&        _discrete_constraints,\n      const double                        _time_limit)\n{\n  try\n  {\n    //----------------------------------------------\n    // 0. set up environment\n    //----------------------------------------------\n\n    GRBEnv   env   = GRBEnv();\n    GRBModel model = GRBModel(env);\n\n    model.getEnv().set(GRB_DoubleParam_TimeLimit, _time_limit);\n\n\n    //----------------------------------------------\n    // 1. allocate variables\n    //----------------------------------------------\n\n    // determine variable types: 0->real, 1->integer, 2->bool\n    std::vector<char> vtypes(_problem->n_unknowns(),0);\n    for(unsigned int i=0; i<_discrete_constraints.size(); ++i)\n      switch(_discrete_constraints[i].second)\n      {\n        case Integer: vtypes[_discrete_constraints[i].first] = 1; break;\n        case Binary : vtypes[_discrete_constraints[i].first] = 2; break;\n        default     : break;\n      }\n\n    // GUROBI variables\n    std::vector<GRBVar> vars;\n    // first all\n    for( int i=0; i<_problem->n_unknowns(); ++i)\n      switch(vtypes[i])\n      {\n        case 0 : vars.push_back( model.addVar(-GRB_INFINITY, GRB_INFINITY, 0.0, GRB_CONTINUOUS) ); break;\n        case 1 : vars.push_back( model.addVar(-GRB_INFINITY, GRB_INFINITY, 0.0, GRB_INTEGER   ) ); break;\n        case 2 : vars.push_back( model.addVar(-GRB_INFINITY, GRB_INFINITY, 0.0, GRB_BINARY    ) ); break;\n      }\n\n\n    // Integrate new variables\n    model.update();\n\n    //----------------------------------------------\n    // 2. setup constraints\n    //----------------------------------------------\n\n    // get zero vector\n    std::vector<double> x(_problem->n_unknowns(), 0.0);\n\n    for(unsigned int i=0; i<_constraints.size();  ++i)\n    {\n      if(!_constraints[i]->is_linear())\n        std::cerr << \"Warning: GUROBISolver received a problem with non-linear constraints!!!\" << std::endl;\n\n      GRBLinExpr lin_expr;\n      NConstraintInterface::SVectorNC gc;\n      _constraints[i]->eval_gradient(P(x), gc);\n\n      NConstraintInterface::SVectorNC::InnerIterator v_it(gc);\n      for(; v_it; ++v_it)\n//        lin_expr += v_it.value()*vars[v_it.index()];\n        lin_expr = lin_expr + vars[v_it.index()]*v_it.value();\n\n      double b = _constraints[i]->eval_constraint(P(x));\n\n      switch(_constraints[i]->constraint_type())\n      {\n        case NConstraintInterface::NC_EQUAL         : model.addConstr(lin_expr + b == 0); break;\n        case NConstraintInterface::NC_LESS_EQUAL    : model.addConstr(lin_expr + b <= 0); break;\n        case NConstraintInterface::NC_GREATER_EQUAL : model.addConstr(lin_expr + b >= 0); break;\n      }\n    }\n    model.update();\n\n    //----------------------------------------------\n    // 3. setup energy\n    //----------------------------------------------\n\n    if(!_problem->constant_hessian())\n      std::cerr << \"Warning: GUROBISolver received a problem with non-constant hessian!!!\" << std::endl;\n\n    GRBQuadExpr objective;\n\n    // add quadratic part\n    NProblemInterface::SMatrixNP H;\n    _problem->eval_hessian(P(x), H);\n    for( int i=0; i<H.outerSize(); ++i)\n      for (NProblemInterface::SMatrixNP::InnerIterator it(H,i); it; ++it)\n        objective += 0.5*it.value()*vars[it.row()]*vars[it.col()];\n\n\n    // add linear part\n    std::vector<double> g(_problem->n_unknowns());\n    _problem->eval_gradient(P(x), P(g));\n    for(unsigned int i=0; i<g.size(); ++i)\n      objective += g[i]*vars[i];\n\n    // add constant part\n    objective += _problem->eval_f(P(x));\n\n    model.set(GRB_IntAttr_ModelSense, 1);\n    model.setObjective(objective);\n    model.update();\n\n\n    //----------------------------------------------\n    // 4. solve problem\n    //----------------------------------------------\n\n\n    if (solution_input_path_.empty())\n    {\n      if (!problem_env_output_path_.empty())\n      {\n        std::cout << \"Writing problem's environment into file \\\"\" << problem_env_output_path_ << \"\\\".\" << std::endl;\n        model.getEnv().writeParams(problem_env_output_path_);\n      }\n      if (!problem_output_path_.empty())\n      {\n        std::cout << \"Writing problem into file \\\"\" << problem_output_path_ << \"\\\".\" << std::endl;\n        GurobiHelper::outputModelToMpsGz(model, problem_output_path_);\n      }\n\n      model.optimize();\n    }\n    else\n    {\n        std::cout << \"Reading solution from file \\\"\" << solution_input_path_ << \"\\\".\" << std::endl;\n    }\n\n    //----------------------------------------------\n    // 5. store result\n    //----------------------------------------------\n\n    if (solution_input_path_.empty())\n    {\n      // store computed result\n      for(unsigned int i=0; i<vars.size(); ++i)\n        x[i] = vars[i].get(GRB_DoubleAttr_X);\n    }\n    else\n    {\n        std::cout << \"Loading stored solution from \\\"\" << solution_input_path_ << \"\\\".\" << std::endl;\n        // store loaded result\n        const size_t oldSize = x.size();\n        x.clear();\n        GurobiHelper::readSolutionVectorFromSOL(x, solution_input_path_);\n        if (oldSize != x.size()) {\n            std::cerr << \"oldSize != x.size() <=> \" << oldSize << \" != \" << x.size() << std::endl;\n            throw std::runtime_error(\"Loaded solution vector doesn't have expected dimension.\");\n        }\n    }\n\n    _problem->store_result(P(x));\n\n    // ObjVal is only available if the optimize was called.\n    if (solution_input_path_.empty())\n        std::cout << \"GUROBI Objective: \" << model.get(GRB_DoubleAttr_ObjVal) << std::endl;\n    return true;\n  }\n  catch(GRBException& e)\n  {\n    std::cout << \"Error code = \" << e.getErrorCode() << std::endl;\n    std::cout << e.getMessage() << std::endl;\n    return false;\n  }\n  catch(...)\n  {\n    std::cout << \"Exception during optimization\" << std::endl;\n    return false;\n  }\n\n  return false;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid\nGUROBISolver::\nset_problem_output_path( const std::string &_problem_output_path)\n{\n  problem_output_path_ = _problem_output_path;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid\nGUROBISolver::\nset_problem_env_output_path( const std::string &_problem_env_output_path)\n{\n  problem_env_output_path_ = _problem_env_output_path;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid\nGUROBISolver::\nset_solution_input_path(const std::string &_solution_input_path)\n{\n  solution_input_path_ = _solution_input_path;\n}\n\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n#endif // COMISO_GUROBI_AVAILABLE\n//=============================================================================\n"
  },
  {
    "path": "libs/CoMISo/NSolver/GUROBISolver.hh",
    "content": "//=============================================================================\n//\n//  CLASS GUROBISolver\n//\n//=============================================================================\n\n\n#ifndef COMISO_GUROBISOLVER_HH\n#define COMISO_GUROBISOLVER_HH\n\n\n//== COMPILE-TIME PACKAGE REQUIREMENTS ========================================\n#include <CoMISo/Config/config.hh>\n#if COMISO_GUROBI_AVAILABLE\n\n//== INCLUDES =================================================================\n\n#include <CoMISo/Config/CoMISoDefines.hh>\n#include <vector>\n#include <string>\n#include \"NProblemInterface.hh\"\n#include \"NConstraintInterface.hh\"\n#include \"VariableType.hh\"\n#include \"GurobiHelper.hh\"\n\n#include <gurobi_c++.h>\n\n//== FORWARDDECLARATIONS ======================================================\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== CLASS DEFINITION =========================================================\n\n\t      \n\n/** \\class NewtonSolver GUROBISolver.hh\n\n    Brief Description.\n  \n    A more elaborate description follows.\n*/\nclass COMISODLLEXPORT GUROBISolver\n{\npublic:\n\n  /// Default constructor\n  GUROBISolver();\n \n  /// Destructor\n  ~GUROBISolver() {}\n\n  // ********** SOLVE **************** //\n  bool solve(NProblemInterface*                  _problem,                // problem instance\n             std::vector<NConstraintInterface*>& _constraints,            // linear constraints\n             std::vector<PairIndexVtype>&        _discrete_constraints,   // discrete constraints\n             const double                        _time_limit = 60     ); // time limit in seconds\n\n  void set_problem_output_path    ( const std::string &_problem_output_path);\n  void set_problem_env_output_path( const std::string &_problem_env_output_path);\n  void set_solution_input_path    ( const std::string &_solution_input_path);\n\nprotected:\n  double* P(std::vector<double>& _v)\n  {\n    if( !_v.empty())\n      return ((double*)&_v[0]);\n    else\n      return 0;\n  }\n\nprivate:\n\n  // filenames for exporting/importing gurobi solutions\n  // if string is empty nothing is imported or exported\n  std::string problem_output_path_;\n  std::string problem_env_output_path_;\n  std::string solution_input_path_;\n};\n\n\n\n//=============================================================================\n} // namespace COMISO\n\n//=============================================================================\n#endif // COMISO_GUROBI_AVAILABLE\n//=============================================================================\n#endif // ACG_GUROBISOLVER_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/CoMISo/NSolver/GurobiHelper.cc",
    "content": "/*\n * GurobiHelper.cc\n *\n *  Created on: Jan 4, 2012\n *      Author: ebke\n */\n\n#include \"GurobiHelper.hh\"\n\n#if COMISO_GUROBI_AVAILABLE\n\n#include <QTemporaryFile>\n#include <QFileInfo>\n#include <boost/filesystem.hpp>\n#include <boost/scoped_ptr.hpp>\n#include <boost/regex.hpp>\n#include <boost/lexical_cast.hpp>\n\n#include <iostream>\n#include <cstdio>\n#include <fstream>\n#include <string>\n\n#define OUTPUT_UNCOMPRESSED_WITH_CONSTANT_COMMENT 0\n#define OUTPUT_CONSTANT_AS_CONT 1\n\nnamespace COMISO {\n\n/**\n * Helper class that ensures exception safe deletion\n * of a temporary file.\n */\nclass TempFileGuard {\n    public:\n        TempFileGuard(const std::string &_filePath) : filePath_(_filePath) {\n        }\n\n        ~TempFileGuard() {\n            if (boost::filesystem::exists(filePath_))\n                boost::filesystem::remove(filePath_);\n        }\n\n        const boost::filesystem::path &filePath() const { return filePath_; };\n\n    private:\n        boost::filesystem::path filePath_;\n};\n\nstatic void moveConstantTermIntoConstrainedVariable(GRBModel &model) {\n    const double constantTerm = model.getObjective().getLinExpr().getConstant();\n    //tmpModel.getObjective().addConstant(-constantTerm);\n    model.getObjective() -= constantTerm;\n#if OUTPUT_CONSTANT_AS_CONT\n    model.addVar(constantTerm, constantTerm, 1, GRB_CONTINUOUS, \"MIQ_synthetic_constant\");\n#else\n    model.addVar(1, 1, constantTerm, GRB_INTEGER, \"MIQ_synthetic_constant\");\n#endif\n}\n\nstatic void copyFile(const char *from, const char *to) {\n    FILE *inF = fopen(from, \"r\");\n    FILE *outF = fopen(to, \"w\");\n\n    const int bufsize = 4096;\n    unsigned char buffer[bufsize];\n\n    do {\n        size_t readBytes = fread(buffer, 1, bufsize, inF);\n        fwrite(buffer, 1, readBytes, outF);\n    } while(!feof(inF));\n\n    fclose(inF);\n    fclose(outF);\n}\n\n/**\n * WARNING: Never call outputModelToMpsGz and importInitialSolutionIntoModel\n * on the same model. Both try to move the constant term into a variable and\n * consequently, the second attempt to do so will fail.\n */\nvoid GurobiHelper::outputModelToMpsGz(GRBModel &model, const std::string &problem_output_path_) {\n#if OUTPUT_UNCOMPRESSED_WITH_CONSTANT_COMMENT\n    boost::scoped_ptr<TempFileGuard> tempFileGuard;\n    {\n        QTemporaryFile tempFile(\"XXXXXX.mps\");\n        tempFile.setAutoRemove(false);\n        tempFile.open();\n\n        // In order to minimize the likelihood of race conditions,\n        // we initialize tempFileGuard right here.\n        tempFileGuard.reset(new TempFileGuard(QFileInfo(tempFile).absoluteFilePath().toStdString()));\n        tempFile.close();\n    }\n\n    const std::string fileName = tempFileGuard->filePath().string();\n\n    model.write(fileName);\n    const double constantTerm = model.getObjective().getLinExpr().getConstant();\n\n    FILE *inF = fopen(fileName.c_str(), \"r\");\n    FILE *outF = fopen(problem_output_path_.c_str(), \"w\");\n\n    fprintf(outF, \"* Constant Term: %.16e\\n\", constantTerm);\n    const int bufsize = 4096;\n    unsigned char buffer[bufsize];\n    int readBytes;\n    do {\n        readBytes = fread(buffer, 1, bufsize, inF);\n        fwrite(buffer, 1, readBytes, outF);\n    } while(!feof(inF));\n    fclose(inF);\n    fclose(outF);\n#else\n    GRBModel tmpModel(model);\n\n    moveConstantTermIntoConstrainedVariable(tmpModel);\n\n    tmpModel.update();\n    tmpModel.write(problem_output_path_);\n#endif\n}\n\n/**\n * WARNING: Never call outputModelToMpsGz and importInitialSolutionIntoModel\n * on the same model. Both try to move the constant term into a variable and\n * consequently, the second attempt to do so will fail.\n */\nvoid GurobiHelper::importInitialSolutionIntoModel(GRBModel &model, const std::string &solution_path_) {\n    boost::scoped_ptr<TempFileGuard> tempFileGuard;\n    {\n        QTemporaryFile tempFile(\"XXXXXX.mst\");\n        tempFile.setAutoRemove(false);\n        tempFile.open();\n\n        // In order to minimize the likelihood of race conditions,\n        // we initialize tempFileGuard right here.\n        tempFileGuard.reset(new TempFileGuard(QFileInfo(tempFile).absoluteFilePath().toStdString()));\n        tempFile.close();\n    }\n\n    const std::string fileName = tempFileGuard->filePath().string();\n\n    copyFile(solution_path_.c_str(), fileName.c_str());\n\n    //moveConstantTermIntoConstrainedVariable(model);\n    const double constantTerm = model.getObjective().getLinExpr().getConstant();\n    model.addVar(constantTerm, constantTerm, 0, GRB_CONTINUOUS, \"MIQ_synthetic_constant\");\n\n    model.update();\n    model.read(fileName);\n    model.update();\n}\n\nvoid GurobiHelper::readSolutionVectorFromSOL(std::vector<double> &out_solution_, const std::string &fileName_) {\n    std::ifstream solFile(fileName_.c_str());\n    //if (!solFile.good())\n    //    throw std::runtime_error(\"Unable to open file \\\"\" + fileName + \"\\\".\");\n\n    static const boost::regex commentRe(\"\\\\s*#\", boost::regex_constants::perl);\n    static const boost::regex variableRe(\"\\\\s*(\\\\S+)\\\\s+([-+]?[0-9]*\\\\.?[0-9]+(?:[eE][-+]?[0-9]+)?)\", boost::regex_constants::perl);\n\n    std::string line;\n    while (solFile) {\n        std::getline(solFile, line);\n        if (boost::regex_search(line, commentRe, boost::match_continuous)) continue;\n        boost::smatch match;\n        if (boost::regex_search(line, match, variableRe, boost::match_continuous) && match[1] != \"MIQ_synthetic_constant\") {\n            out_solution_.push_back(boost::lexical_cast<double>(match[2]));\n        }\n    }\n}\n\n} /* namespace COMISO */\n\n#endif\n"
  },
  {
    "path": "libs/CoMISo/NSolver/GurobiHelper.hh",
    "content": "/*\n * GurobiHelper.hh\n *\n *  Created on: Jan 4, 2012\n *      Author: ebke\n */\n\n\n#ifndef GUROBIHELPER_HH_\n#define GUROBIHELPER_HH_\n\n//== COMPILE-TIME PACKAGE REQUIREMENTS ========================================\n#include <CoMISo/Config/config.hh>\n#if COMISO_GUROBI_AVAILABLE\n//=============================================================================\n\n#include <gurobi_c++.h>\n#include <string>\n#include <vector>\n\nnamespace COMISO {\n\nclass GurobiHelper {\n    public:\n\n        /**\n         * WARNING: Never call outputModelToMpsGz and importInitialSolutionIntoModel\n         * on the same model. Both try to move the constant term into a variable and\n         * consequently, the second attempt to do so will fail.\n         */\n        static void outputModelToMpsGz(GRBModel &model, const std::string &problem_output_path_);\n\n        /**\n         * WARNING: Never call outputModelToMpsGz and importInitialSolutionIntoModel\n         * on the same model. Both try to move the constant term into a variable and\n         * consequently, the second attempt to do so will fail.\n         */\n        static void importInitialSolutionIntoModel(GRBModel &model, const std::string &solution_path_);\n\n        /**\n         * Reads the solution vector from a SOL file and appends it to\n         * out_solution_.\n         */\n        static void readSolutionVectorFromSOL(std::vector<double> &out_solution_, const std::string &fileName_);\n};\n\n} /* namespace COMISO */\n#endif /* COMISO_GUROBI_AVAILABLE */\n#endif /* GUROBIHELPER_HH_ */\n\n\n"
  },
  {
    "path": "libs/CoMISo/NSolver/IPOPTSolver.cc",
    "content": "//=============================================================================\n//\n//  CLASS IPOPTSolver - IMPLEMENTATION\n//\n//=============================================================================\n\n//== INCLUDES =================================================================\n\n//== COMPILE-TIME PACKAGE REQUIREMENTS ========================================\n#include <CoMISo/Config/config.hh>\n#if COMISO_IPOPT_AVAILABLE\n//=============================================================================\n\n\n#include \"IPOPTSolver.hh\"\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== IMPLEMENTATION ========================================================== \n\n\n// Constructor\nIPOPTSolver::\nIPOPTSolver()\n{\n  // Create an instance of the IpoptApplication\n  app_ = IpoptApplicationFactory();\n\n  // Switch to HSL if available in Comiso\n  #if COMISO_HSL_AVAILABLE\n    app_->Options()->SetStringValue(\"linear_solver\", \"ma57\");\n  #endif\n\n  // Restrict memory to be able to run larger problems on windows\n  // with the default mumps solver\n  #ifdef WIN32\n    app_->Options()->SetIntegerValue(\"mumps_mem_percent\", 5);\n  #endif\n\n  // set default parameters\n  app_->Options()->SetIntegerValue(\"max_iter\", 100);\n  //  app->Options()->SetStringValue(\"derivative_test\", \"second-order\");\n  //  app->Options()->SetIntegerValue(\"print_level\", 0);\n  //  app->Options()->SetStringValue(\"expect_infeasible_problem\", \"yes\");\n\n}\n\n\n//-----------------------------------------------------------------------------\n\n\n\nint\nIPOPTSolver::\nsolve(NProblemInterface* _problem, const std::vector<NConstraintInterface*>& _constraints)\n{\n  //----------------------------------------------------------------------------\n  // 1. Create an instance of IPOPT NLP\n  //----------------------------------------------------------------------------\n  Ipopt::SmartPtr<Ipopt::TNLP> np = new NProblemIPOPT(_problem, _constraints);\n\n  //----------------------------------------------------------------------------\n  // 2. solve problem\n  //----------------------------------------------------------------------------\n\n  // Initialize the IpoptApplication and process the options\n  Ipopt::ApplicationReturnStatus status;\n  status = app_->Initialize();\n  if (status != Ipopt::Solve_Succeeded)\n  {\n    printf(\"\\n\\n*** Error IPOPT during initialization!\\n\");\n  }\n\n  //----------------------------------------------------------------------------\n  // 3. solve problem\n  //----------------------------------------------------------------------------\n  status = app_->OptimizeTNLP(np);\n\n  //----------------------------------------------------------------------------\n  // 4. output statistics\n  //----------------------------------------------------------------------------\n  if (status == Ipopt::Solve_Succeeded || status == Ipopt::Solved_To_Acceptable_Level)\n  {\n    // Retrieve some statistics about the solve\n    Ipopt::Index iter_count = app_->Statistics()->IterationCount();\n    printf(\"\\n\\n*** IPOPT: The problem solved in %d iterations!\\n\", iter_count);\n\n    Ipopt::Number final_obj = app_->Statistics()->FinalObjective();\n    printf(\"\\n\\n*** IPOPT: The final value of the objective function is %e.\\n\", final_obj);\n  }\n\n  return status;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nint\nIPOPTSolver::\nsolve(NProblemInterface*    _problem)\n{\n  std::vector<NConstraintInterface*> constraints;\n  return this->solve(_problem, constraints);\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nint\nIPOPTSolver::\nsolve(NProblemGmmInterface* _problem, std::vector<NConstraintInterface*>& _constraints)\n{\n  std::cerr << \"****** Warning: NProblemGmmInterface is deprecated!!! -> use NProblemInterface *******\\n\";\n\n  //----------------------------------------------------------------------------\n  // 1. Create an instance of IPOPT NLP\n  //----------------------------------------------------------------------------\n  Ipopt::SmartPtr<Ipopt::TNLP> np = new NProblemGmmIPOPT(_problem, _constraints);\n\n  //----------------------------------------------------------------------------\n  // 2. solve problem\n  //----------------------------------------------------------------------------\n\n  // Initialize the IpoptApplication and process the options\n  Ipopt::ApplicationReturnStatus status;\n  status = app_->Initialize();\n  if (status != Ipopt::Solve_Succeeded)\n  {\n    printf(\"\\n\\n*** Error IPOPT during initialization!\\n\");\n  }\n\n  //----------------------------------------------------------------------------\n  // 3. solve problem\n  //----------------------------------------------------------------------------\n  status = app_->OptimizeTNLP(np);\n\n  //----------------------------------------------------------------------------\n  // 4. output statistics\n  //----------------------------------------------------------------------------\n  if (status == Ipopt::Solve_Succeeded || status == Ipopt::Solved_To_Acceptable_Level)\n  {\n    // Retrieve some statistics about the solve\n    Ipopt::Index iter_count = app_->Statistics()->IterationCount();\n    printf(\"\\n\\n*** IPOPT: The problem solved in %d iterations!\\n\", iter_count);\n\n    Ipopt::Number final_obj = app_->Statistics()->FinalObjective();\n    printf(\"\\n\\n*** IPOPT: The final value of the objective function is %e.\\n\", final_obj);\n  }\n\n  return status;\n}\n\n\n//== IMPLEMENTATION PROBLEM INSTANCE==========================================================\n\n\nvoid\nNProblemIPOPT::\nsplit_constraints(const std::vector<NConstraintInterface*>& _constraints)\n{\n  // split user-provided constraints into general-constraints and bound-constraints\n  constraints_      .clear();       constraints_.reserve(_constraints.size());\n  bound_constraints_.clear(); bound_constraints_.reserve(_constraints.size());\n\n  for(unsigned int i=0; i<_constraints.size(); ++i)\n  {\n    BoundConstraint* bnd_ptr = dynamic_cast<BoundConstraint*>(_constraints[i]);\n\n    if(bnd_ptr)\n      bound_constraints_.push_back(bnd_ptr);\n    else\n      constraints_.push_back(_constraints[i]);\n  }\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nbool NProblemIPOPT::get_nlp_info(Index& n, Index& m, Index& nnz_jac_g,\n                         Index& nnz_h_lag, IndexStyleEnum& index_style)\n{\n  // number of variables\n  n = problem_->n_unknowns();\n\n  // number of constraints\n  m = constraints_.size();\n\n  // get non-zeros of hessian of lagrangian and jacobi of constraints\n  nnz_jac_g = 0;\n  nnz_h_lag = 0;\n\n  // get nonzero structure\n  std::vector<double> x(n);\n  problem_->initial_x(P(x));\n\n  // nonzeros in the jacobian of C_ and the hessian of the lagrangian\n  SMatrixNP HP;\n  SVectorNC g;\n  SMatrixNC H;\n  problem_->eval_hessian(P(x), HP);\n\n  // get nonzero structure of hessian of problem\n  for(int i=0; i<HP.outerSize(); ++i)\n    for (SMatrixNP::InnerIterator it(HP,i); it; ++it)\n      if(it.row() >= it.col())\n        ++nnz_h_lag;\n\n  // get nonzero structure of constraints\n  for( int i=0; i<m; ++i)\n  {\n    constraints_[i]->eval_gradient(P(x),g);\n\n    nnz_jac_g += g.nonZeros();\n\n    // count lower triangular elements\n    constraints_[i]->eval_hessian (P(x),H);\n\n    SMatrixNC::iterator m_it = H.begin();\n    for(; m_it != H.end(); ++m_it)\n      if( m_it.row() >= m_it.col())\n        ++nnz_h_lag;\n  }\n\n  // We use the standard fortran index style for row/col entries\n  index_style = C_STYLE;\n\n  return true;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nbool NProblemIPOPT::get_bounds_info(Index n, Number* x_l, Number* x_u,\n                            Index m, Number* g_l, Number* g_u)\n{\n  // check dimensions\n  if( n != (Index)problem_->n_unknowns())\n    std::cerr << \"Warning: IPOPT #unknowns != n \" << n << problem_->n_unknowns() << std::endl;\n  if( m != (Index)constraints_.size())\n    std::cerr << \"Warning: IPOPT #constraints != m \" << m << constraints_.size() << std::endl;\n\n\n  // first clear all variable bounds\n  for( int i=0; i<n; ++i)\n  {\n    // x_l[i] = Ipopt::nlp_lower_bound_inf;\n    // x_u[i] = Ipopt::nlp_upper_bound_inf;\n\n    x_l[i] = -1.0e19;\n    x_u[i] =  1.0e19;\n  }\n\n  // iterate over bound constraints and set them\n  for(unsigned int i=0; i<bound_constraints_.size(); ++i)\n  {\n    if((Index)(bound_constraints_[i]->idx()) < n)\n    {\n      switch(bound_constraints_[i]->constraint_type())\n      {\n      case NConstraintInterface::NC_LESS_EQUAL:\n      {\n        x_u[bound_constraints_[i]->idx()] = bound_constraints_[i]->bound();\n      }break;\n\n      case NConstraintInterface::NC_GREATER_EQUAL:\n      {\n        x_l[bound_constraints_[i]->idx()] = bound_constraints_[i]->bound();\n      }break;\n\n      case NConstraintInterface::NC_EQUAL:\n      {\n        x_l[bound_constraints_[i]->idx()] = bound_constraints_[i]->bound();\n        x_u[bound_constraints_[i]->idx()] = bound_constraints_[i]->bound();\n      }break;\n      }\n    }\n    else\n      std::cerr << \"Warning: invalid bound constraint in IPOPTSolver!!!\" << std::endl;\n  }\n\n  // set bounds for constraints\n  for( int i=0; i<m; ++i)\n  {\n    // enum ConstraintType {NC_EQUAL, NC_LESS_EQUAL, NC_GREATER_EQUAL};\n    switch(constraints_[i]->constraint_type())\n    {\n      case NConstraintInterface::NC_EQUAL         : g_u[i] = 0.0   ; g_l[i] =  0.0   ; break;\n      case NConstraintInterface::NC_LESS_EQUAL    : g_u[i] = 0.0   ; g_l[i] = -1.0e19; break;\n      case NConstraintInterface::NC_GREATER_EQUAL : g_u[i] = 1.0e19; g_l[i] =  0.0   ; break;\n      default                                     : g_u[i] = 1.0e19; g_l[i] = -1.0e19; break;\n    }\n  }\n\n  return true;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nbool NProblemIPOPT::get_starting_point(Index n, bool init_x, Number* x,\n                               bool init_z, Number* z_L, Number* z_U,\n                               Index m, bool init_lambda,\n                               Number* lambda)\n{\n  // get initial value of problem instance\n  problem_->initial_x(x);\n\n  return true;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nbool NProblemIPOPT::eval_f(Index n, const Number* x, bool new_x, Number& obj_value)\n{\n  // return the value of the objective function\n  obj_value = problem_->eval_f(x);\n  return true;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nbool NProblemIPOPT::eval_grad_f(Index n, const Number* x, bool new_x, Number* grad_f)\n{\n  problem_->eval_gradient(x, grad_f);\n\n  return true;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nbool NProblemIPOPT::eval_g(Index n, const Number* x, bool new_x, Index m, Number* g)\n{\n  // evaluate all constraint functions\n  for( int i=0; i<m; ++i)\n    g[i] = constraints_[i]->eval_constraint(x);\n\n  return true;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nbool NProblemIPOPT::eval_jac_g(Index n, const Number* x, bool new_x,\n                       Index m, Index nele_jac, Index* iRow, Index *jCol,\n                       Number* values)\n{\n  if (values == NULL)\n  {\n    // get x for evaluation (arbitrary position should be ok)\n    std::vector<double> x_rnd(problem_->n_unknowns(), 0.0);\n\n    int gi = 0;\n    SVectorNC g;\n    for( int i=0; i<m; ++i)\n    {\n      constraints_[i]->eval_gradient(&(x_rnd[0]), g);\n      SVectorNC::InnerIterator v_it(g);\n      for( ; v_it; ++v_it)\n      {\n        iRow[gi] = i;\n        jCol[gi] = v_it.index();\n        ++gi;\n      }\n    }\n  }\n  else\n  {\n    // return the values of the jacobian of the constraints\n\n    // return the structure of the jacobian of the constraints\n    // global index\n    int gi = 0;\n    SVectorNC g;\n\n    for( int i=0; i<m; ++i)\n    {\n      constraints_[i]->eval_gradient(x, g);\n\n      SVectorNC::InnerIterator v_it(g);\n\n      for( ; v_it; ++v_it)\n      {\n        values[gi] = v_it.value();\n        ++gi;\n      }\n    }\n\n    if( gi != nele_jac)\n      std::cerr << \"Warning: number of non-zeros in Jacobian of C is incorrect: \"\n                << gi << \" vs \" << nele_jac << std::endl;\n  }\n\n  return true;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nbool NProblemIPOPT::eval_h(Index n, const Number* x, bool new_x,\n                   Number obj_factor, Index m, const Number* lambda,\n                   bool new_lambda, Index nele_hess, Index* iRow,\n                   Index* jCol, Number* values)\n{\n  if (values == NULL)\n  {\n    // return structure\n\n    // get x for evaluation (arbitrary position should be ok)\n    std::vector<double> x_rnd(problem_->n_unknowns(), 0.0);\n\n     // global index\n     int gi = 0;\n     // get hessian of problem\n     SMatrixNP HP;\n     problem_->eval_hessian(&(x_rnd[0]), HP);\n\n     for(int i=0; i<HP.outerSize(); ++i)\n       for (SMatrixNP::InnerIterator it(HP,i); it; ++it)\n       {\n         // store lower triangular part only\n         if(it.row() >= it.col())\n         {\n           //         it.value();\n           iRow[gi] = it.row();\n           jCol[gi] = it.col();\n           ++gi;\n         }\n       }\n\n    // Hessians of Constraints\n    for(unsigned int j=0; j<constraints_.size(); ++j)\n    {\n      SMatrixNC H;\n      constraints_[j]->eval_hessian(&(x_rnd[0]), H);\n\n      SMatrixNC::iterator m_it  = H.begin();\n      SMatrixNC::iterator m_end = H.end();\n\n      for(; m_it != m_end; ++m_it)\n      {\n        // store lower triangular part only\n        if( m_it.row() >= m_it.col())\n        {\n          iRow[gi] = m_it.row();\n          jCol[gi] = m_it.col();\n          ++gi;\n        }\n      }\n    }\n\n    // error check\n    if( gi != nele_hess)\n      std::cerr << \"Warning: number of non-zeros in Hessian of Lagrangian is incorrect while indexing: \"\n                << gi << \" vs \" << nele_hess << std::endl;\n  }\n  else\n  {\n    // return values.\n\n    // global index\n    int gi = 0;\n    // get hessian of problem\n    SMatrixNP HP;\n    problem_->eval_hessian(x, HP);\n\n    for(int i=0; i<HP.outerSize(); ++i)\n      for (SMatrixNP::InnerIterator it(HP,i); it; ++it)\n      {\n        // store lower triangular part only\n        if(it.row() >= it.col())\n        {\n          values[gi] = it.value();\n          ++gi;\n        }\n      }\n\n    // Hessians of Constraints\n    for(unsigned int j=0; j<constraints_.size(); ++j)\n    {\n      SMatrixNC H;\n      constraints_[j]->eval_hessian(x, H);\n\n      SMatrixNC::iterator m_it  = H.begin();\n      SMatrixNC::iterator m_end = H.end();\n\n      for(; m_it != m_end; ++m_it)\n      {\n        // store lower triangular part only\n        if( m_it.row() >= m_it.col())\n        {\n          values[gi] = lambda[j]*(*m_it);\n          ++gi;\n        }\n      }\n    }\n\n    // error check\n    if( gi != nele_hess)\n      std::cerr << \"Warning: number of non-zeros in Hessian of Lagrangian is incorrect: \"\n                << gi << \" vs \" << nele_hess << std::endl;\n  }\n  return true;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid NProblemIPOPT::finalize_solution(SolverReturn status,\n                              Index n, const Number* x, const Number* z_L, const Number* z_U,\n                              Index m, const Number* g, const Number* lambda,\n                              Number obj_value,\n                              const IpoptData* ip_data,\n                              IpoptCalculatedQuantities* ip_cq)\n{\n  // problem knows what to do\n  problem_->store_result(x);\n}\n\n\n\n//== IMPLEMENTATION PROBLEM INSTANCE==========================================================\n\n\nbool NProblemGmmIPOPT::get_nlp_info(Index& n, Index& m, Index& nnz_jac_g,\n                         Index& nnz_h_lag, IndexStyleEnum& index_style)\n{\n  // number of variables\n  n = problem_->n_unknowns();\n\n  // number of constraints\n  m = constraints_.size();\n\n  // get nonzero structure\n  std::vector<double> x(n);\n  problem_->initial_x(&(x[0]));\n  // ToDo: perturb x\n\n  // nonzeros in the jacobian of C_ and the hessian of the lagrangian\n  SMatrixNP HP;\n  SVectorNC g;\n  SMatrixNC H;\n  problem_->eval_hessian(&(x[0]), HP);\n  nnz_jac_g = 0;\n  nnz_h_lag = 0;\n\n  // clear old data\n  jac_g_iRow_.clear();\n  jac_g_jCol_.clear();\n  h_lag_iRow_.clear();\n  h_lag_jCol_.clear();\n\n  // get non-zero structure of initial hessian\n  // iterate over rows\n  for( int i=0; i<n; ++i)\n  {\n    SVectorNP& ri = HP.row(i);\n\n    SVectorNP_citer v_it  = gmm::vect_const_begin(ri);\n    SVectorNP_citer v_end = gmm::vect_const_end  (ri);\n\n    for(; v_it != v_end; ++v_it)\n    {\n      // store lower triangular part only\n      if( i >= (int)v_it.index())\n      {\n        h_lag_iRow_.push_back(i);\n        h_lag_jCol_.push_back(v_it.index());\n        ++nnz_h_lag;\n      }\n    }\n  }\n\n\n  // get nonzero structure of constraints\n  for( int i=0; i<m; ++i)\n  {\n    constraints_[i]->eval_gradient(&(x[0]),g);\n    constraints_[i]->eval_hessian (&(x[0]),H);\n\n    // iterate over sparse vector\n    SVectorNC::InnerIterator v_it(g);\n    for(; v_it; ++v_it)\n    {\n      jac_g_iRow_.push_back(i);\n      jac_g_jCol_.push_back(v_it.index());\n      ++nnz_jac_g;\n    }\n\n    // iterate over superSparseMatrix\n    SMatrixNC::iterator m_it  = H.begin();\n    SMatrixNC::iterator m_end = H.end();\n    for(; m_it != m_end; ++m_it)\n      if( m_it.row() >= m_it.col())\n      {\n        h_lag_iRow_.push_back(m_it.row());\n        h_lag_jCol_.push_back(m_it.col());\n        ++nnz_h_lag;\n      }\n  }\n\n  // store for error checking...\n  nnz_jac_g_ = nnz_jac_g;\n  nnz_h_lag_ = nnz_h_lag;\n\n  // We use the standard fortran index style for row/col entries\n  index_style = C_STYLE;\n\n  return true;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nbool NProblemGmmIPOPT::get_bounds_info(Index n, Number* x_l, Number* x_u,\n                            Index m, Number* g_l, Number* g_u)\n{\n  // first clear all variable bounds\n  for( int i=0; i<n; ++i)\n  {\n    // x_l[i] = Ipopt::nlp_lower_bound_inf;\n    // x_u[i] = Ipopt::nlp_upper_bound_inf;\n\n    x_l[i] = -1.0e19;\n    x_u[i] =  1.0e19;\n  }\n\n  // set bounds for constraints\n  for( int i=0; i<m; ++i)\n  {\n    // enum ConstraintType {NC_EQUAL, NC_LESS_EQUAL, NC_GREATER_EQUAL};\n    switch(constraints_[i]->constraint_type())\n    {\n      case NConstraintInterface::NC_EQUAL         : g_u[i] = 0.0   ; g_l[i] =  0.0   ; break;\n      case NConstraintInterface::NC_LESS_EQUAL    : g_u[i] = 0.0   ; g_l[i] = -1.0e19; break;\n      case NConstraintInterface::NC_GREATER_EQUAL : g_u[i] = 1.0e19; g_l[i] =  0.0   ; break;\n      default                                     : g_u[i] = 1.0e19; g_l[i] = -1.0e19; break;\n    }\n  }\n\n  return true;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nbool NProblemGmmIPOPT::get_starting_point(Index n, bool init_x, Number* x,\n                               bool init_z, Number* z_L, Number* z_U,\n                               Index m, bool init_lambda,\n                               Number* lambda)\n{\n  // get initial value of problem instance\n  problem_->initial_x(x);\n\n  return true;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nbool NProblemGmmIPOPT::eval_f(Index n, const Number* x, bool new_x, Number& obj_value)\n{\n  // return the value of the objective function\n  obj_value = problem_->eval_f(x);\n  return true;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nbool NProblemGmmIPOPT::eval_grad_f(Index n, const Number* x, bool new_x, Number* grad_f)\n{\n  problem_->eval_gradient(x, grad_f);\n\n  return true;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nbool NProblemGmmIPOPT::eval_g(Index n, const Number* x, bool new_x, Index m, Number* g)\n{\n  // evaluate all constraint functions\n  for( int i=0; i<m; ++i)\n    g[i] = constraints_[i]->eval_constraint(x);\n\n  return true;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nbool NProblemGmmIPOPT::eval_jac_g(Index n, const Number* x, bool new_x,\n                       Index m, Index nele_jac, Index* iRow, Index *jCol,\n                       Number* values)\n{\n  if (values == NULL)\n  {\n    // return the (cached) structure of the jacobian of the constraints\n    gmm::copy(jac_g_iRow_, VectorPTi(iRow, jac_g_iRow_.size()));\n    gmm::copy(jac_g_jCol_, VectorPTi(jCol, jac_g_jCol_.size()));\n  }\n  else\n  {\n    // return the values of the jacobian of the constraints\n\n    // return the structure of the jacobian of the constraints\n    // global index\n    int gi = 0;\n    SVectorNC g;\n\n    for( int i=0; i<m; ++i)\n    {\n      constraints_[i]->eval_gradient(x, g);\n\n      SVectorNC::InnerIterator v_it(g);\n\n      for( ; v_it; ++v_it)\n      {\n        if(gi < nele_jac)\n          values[gi] = v_it.value();\n        ++gi;\n      }\n    }\n\n    if( gi != nele_jac)\n      std::cerr << \"Warning: number of non-zeros in Jacobian of C is incorrect: \"\n                << gi << \" vs \" << nele_jac << std::endl;\n  }\n\n  return true;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nbool NProblemGmmIPOPT::eval_h(Index n, const Number* x, bool new_x,\n                   Number obj_factor, Index m, const Number* lambda,\n                   bool new_lambda, Index nele_hess, Index* iRow,\n                   Index* jCol, Number* values)\n{\n  if (values == NULL)\n  {\n    // return the (cached) structure of the hessian\n    gmm::copy(h_lag_iRow_, VectorPTi(iRow, h_lag_iRow_.size()));\n    gmm::copy(h_lag_jCol_, VectorPTi(jCol, h_lag_jCol_.size()));\n  }\n  else\n  {\n    // return values.\n\n    // global index\n    int gi = 0;\n\n    // get hessian of problem\n    problem_->eval_hessian(x, HP_);\n\n    for( int i=0; i<n; ++i)\n    {\n      SVectorNP& ri = HP_.row(i);\n\n      SVectorNP_citer v_it  = gmm::vect_const_begin(ri);\n      SVectorNP_citer v_end = gmm::vect_const_end  (ri);\n\n      for(; v_it != v_end; ++v_it)\n      {\n        // store lower triangular part only\n        if( i >= (int)v_it.index())\n        {\n          if( gi < nele_hess)\n            values[gi] = obj_factor*(*v_it);\n          ++gi;\n        }\n      }\n    }\n\n    // Hessians of Constraints\n    for(unsigned int j=0; j<constraints_.size(); ++j)\n    {\n      SMatrixNC H;\n      constraints_[j]->eval_hessian(x, H);\n\n      SMatrixNC::iterator m_it  = H.begin();\n      SMatrixNC::iterator m_end = H.end();\n\n      for(; m_it != m_end; ++m_it)\n      {\n        // store lower triangular part only\n        if( m_it.row() >= m_it.col())\n        {\n          if( gi < nele_hess)\n            values[gi] = lambda[j]*(*m_it);\n          ++gi;\n        }\n      }\n    }\n\n    // error check\n    if( gi != nele_hess)\n      std::cerr << \"Warning: number of non-zeros in Hessian of Lagrangian is incorrect: \"\n                << gi << \" vs \" << nele_hess << std::endl;\n  }\n  return true;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid NProblemGmmIPOPT::finalize_solution(SolverReturn status,\n                              Index n, const Number* x, const Number* z_L, const Number* z_U,\n                              Index m, const Number* g, const Number* lambda,\n                              Number obj_value,\n                              const IpoptData* ip_data,\n                              IpoptCalculatedQuantities* ip_cq)\n{\n  // problem knows what to do\n  problem_->store_result(x);\n}\n\n\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n#endif // COMISO_IPOPT_AVAILABLE\n//=============================================================================\n"
  },
  {
    "path": "libs/CoMISo/NSolver/IPOPTSolver.hh",
    "content": "//=============================================================================\n//\n//  CLASS IPOPTSolver\n//\n//=============================================================================\n\n\n#ifndef COMISO_IPOPTSOLVER_HH\n#define COMISO_IPOPTSOLVER_HH\n\n\n//== COMPILE-TIME PACKAGE REQUIREMENTS ========================================\n#include <CoMISo/Config/config.hh>\n#if COMISO_IPOPT_AVAILABLE\n\n//== INCLUDES =================================================================\n\n#include <CoMISo/Config/CoMISoDefines.hh>\n#include <vector>\n#include <cstddef>\n#include <gmm/gmm.h>\n#include \"NProblemGmmInterface.hh\"\n#include \"NProblemInterface.hh\"\n#include \"NConstraintInterface.hh\"\n#include \"BoundConstraint.hh\"\n#include <IpTNLP.hpp>\n#include <IpIpoptApplication.hpp>\n#include <IpSolveStatistics.hpp>\n\n//== FORWARDDECLARATIONS ======================================================\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== CLASS DEFINITION =========================================================\n\n\t      \n\n/** \\class NewtonSolver NewtonSolver.hh <ACG/.../NewtonSolver.hh>\n\n    Brief Description.\n  \n    A more elaborate description follows.\n*/\nclass COMISODLLEXPORT IPOPTSolver\n{\npublic:\n   \n  /// Default constructor -> set up IpOptApplication\n  IPOPTSolver();\n \n  /// Destructor\n  ~IPOPTSolver() {}\n\n  // ********** SOLVE **************** //\n  // solve -> returns ipopt status code\n//------------------------------------------------------\n//  enum ApplicationReturnStatus\n//    {\n//      Solve_Succeeded=0,\n//      Solved_To_Acceptable_Level=1,\n//      Infeasible_Problem_Detected=2,\n//      Search_Direction_Becomes_Too_Small=3,\n//      Diverging_Iterates=4,\n//      User_Requested_Stop=5,\n//      Feasible_Point_Found=6,\n//\n//      Maximum_Iterations_Exceeded=-1,\n//      Restoration_Failed=-2,\n//      Error_In_Step_Computation=-3,\n//      Maximum_CpuTime_Exceeded=-4,\n//      Not_Enough_Degrees_Of_Freedom=-10,\n//      Invalid_Problem_Definition=-11,\n//      Invalid_Option=-12,\n//      Invalid_Number_Detected=-13,\n//\n//      Unrecoverable_Exception=-100,\n//      NonIpopt_Exception_Thrown=-101,\n//      Insufficient_Memory=-102,\n//      Internal_Error=-199\n//    };\n//------------------------------------------------------\n\n  int solve(NProblemInterface*    _problem, const std::vector<NConstraintInterface*>& _constraints);\n\n  // for convenience, if no constraints are given\n  int solve(NProblemInterface*    _problem);\n\n  // deprecated interface for backwards compatibility\n  int solve(NProblemGmmInterface* _problem, std::vector<NConstraintInterface*>& _constraints);\n\n  // ********* CONFIGURATION ********************* //\n  // access the ipopt-application (for setting parameters etc.)\n  // example: app().Options()->SetIntegerValue(\"max_iter\", 100);\n  Ipopt::IpoptApplication& app() {return (*app_); }\n\n\nprotected:\n  double* P(std::vector<double>& _v)\n  {\n    if( !_v.empty())\n      return ((double*)&_v[0]);\n    else\n      return 0;\n  }\n\nprivate:\n\n  // smart pointer to IpoptApplication to set options etc.\n  Ipopt::SmartPtr<Ipopt::IpoptApplication> app_;\n};\n\n\n//== CLASS DEFINITION PROBLEM INSTANCE=========================================================\n\n\nclass NProblemIPOPT : public Ipopt::TNLP\n{\npublic:\n\n  // Ipopt Types\n  typedef Ipopt::Number                    Number;\n  typedef Ipopt::Index                     Index;\n  typedef Ipopt::SolverReturn              SolverReturn;\n  typedef Ipopt::IpoptData                 IpoptData;\n  typedef Ipopt::IpoptCalculatedQuantities IpoptCalculatedQuantities;\n\n  // sparse matrix and vector types\n  typedef NConstraintInterface::SVectorNC SVectorNC;\n  typedef NConstraintInterface::SMatrixNC SMatrixNC;\n  typedef NProblemInterface::SMatrixNP    SMatrixNP;\n\n  /** default constructor */\n  NProblemIPOPT(NProblemInterface* _problem, const std::vector<NConstraintInterface*>& _constraints)\n   : problem_(_problem) { split_constraints(_constraints);}\n\n  /** default destructor */\n  virtual ~NProblemIPOPT() {};\n\n  /**@name Overloaded from TNLP */\n  //@{\n  /** Method to return some info about the nlp */\n  virtual bool get_nlp_info(Index& n, Index& m, Index& nnz_jac_g,\n                            Index& nnz_h_lag, IndexStyleEnum& index_style);\n\n  /** Method to return the bounds for my problem */\n  virtual bool get_bounds_info(Index n, Number* x_l, Number* x_u,\n                               Index m, Number* g_l, Number* g_u);\n\n  /** Method to return the starting point for the algorithm */\n  virtual bool get_starting_point(Index n, bool init_x, Number* x,\n                                  bool init_z, Number* z_L, Number* z_U,\n                                  Index m, bool init_lambda,\n                                  Number* lambda);\n\n  /** Method to return the objective value */\n  virtual bool eval_f(Index n, const Number* x, bool new_x, Number& obj_value);\n\n  /** Method to return the gradient of the objective */\n  virtual bool eval_grad_f(Index n, const Number* x, bool new_x, Number* grad_f);\n\n  /** Method to return the constraint residuals */\n  virtual bool eval_g(Index n, const Number* x, bool new_x, Index m, Number* g);\n\n  /** Method to return:\n   *   1) The structure of the jacobian (if \"values\" is NULL)\n   *   2) The values of the jacobian (if \"values\" is not NULL)\n   */\n  virtual bool eval_jac_g(Index n, const Number* x, bool new_x,\n                          Index m, Index nele_jac, Index* iRow, Index *jCol,\n                          Number* values);\n\n  /** Method to return:\n   *   1) The structure of the hessian of the lagrangian (if \"values\" is NULL)\n   *   2) The values of the hessian of the lagrangian (if \"values\" is not NULL)\n   */\n  virtual bool eval_h(Index n, const Number* x, bool new_x,\n                      Number obj_factor, Index m, const Number* lambda,\n                      bool new_lambda, Index nele_hess, Index* iRow,\n                      Index* jCol, Number* values);\n\n  //@}\n\n  /** @name Solution Methods */\n  //@{\n  /** This method is called when the algorithm is complete so the TNLP can store/write the solution */\n  virtual void finalize_solution(SolverReturn status,\n                                 Index n, const Number* x, const Number* z_L, const Number* z_U,\n                                 Index m, const Number* g, const Number* lambda,\n                                 Number obj_value,\n                                 const IpoptData* ip_data,\n                                 IpoptCalculatedQuantities* ip_cq);\n  //@}\n\nprivate:\n  /**@name Methods to block default compiler methods.\n   * The compiler automatically generates the following three methods.\n   *  Since the default compiler implementation is generally not what\n   *  you want (for all but the most simple classes), we usually\n   *  put the declarations of these methods in the private section\n   *  and never implement them. This prevents the compiler from\n   *  implementing an incorrect \"default\" behavior without us\n   *  knowing. (See Scott Meyers book, \"Effective C++\")\n   *\n   */\n  //@{\n  //  MyNLP();\n  NProblemIPOPT(const NProblemIPOPT&);\n  NProblemIPOPT& operator=(const NProblemIPOPT&);\n  //@}\n\n  // split user-provided constraints into general-constraints and bound-constraints\n  void split_constraints(const std::vector<NConstraintInterface*>& _constraints);\n\nprotected:\n  double* P(std::vector<double>& _v)\n  {\n    if( !_v.empty())\n      return ((double*)&_v[0]);\n    else\n      return 0;\n  }\n\nprivate:\n\n  // pointer to problem instance\n  NProblemInterface* problem_;\n  // reference to constraints vector\n  std::vector<NConstraintInterface*> constraints_;\n  std::vector<BoundConstraint*>      bound_constraints_;\n};\n\n\n//== CLASS DEFINITION PROBLEM INSTANCE=========================================================\n\n\nclass NProblemGmmIPOPT : public Ipopt::TNLP\n{\npublic:\n\n  // Ipopt Types\n  typedef Ipopt::Number                    Number;\n  typedef Ipopt::Index                     Index;\n  typedef Ipopt::SolverReturn              SolverReturn;\n  typedef Ipopt::IpoptData                 IpoptData;\n  typedef Ipopt::IpoptCalculatedQuantities IpoptCalculatedQuantities;\n\n  // sparse matrix and vector types\n  typedef NConstraintInterface::SVectorNC SVectorNC;\n  typedef NConstraintInterface::SMatrixNC SMatrixNC;\n  typedef gmm::wsvector<double>           SVectorNP;\n  typedef NProblemGmmInterface::SMatrixNP SMatrixNP;\n\n  typedef gmm::array1D_reference<       double* > VectorPT;\n  typedef gmm::array1D_reference< const double* > VectorPTC;\n\n  typedef gmm::array1D_reference<       Index* > VectorPTi;\n  typedef gmm::array1D_reference< const Index* > VectorPTCi;\n\n  typedef gmm::linalg_traits<SVectorNP>::const_iterator SVectorNP_citer;\n  typedef gmm::linalg_traits<SVectorNP>::iterator       SVectorNP_iter;\n\n  /** default constructor */\n  NProblemGmmIPOPT(NProblemGmmInterface* _problem, std::vector<NConstraintInterface*>& _constraints)\n   : problem_(_problem), constraints_(_constraints), nnz_jac_g_(0), nnz_h_lag_(0) \n   {}\n\n  /** default destructor */\n  virtual ~NProblemGmmIPOPT() {};\n\n  /**@name Overloaded from TNLP */\n  //@{\n  /** Method to return some info about the nlp */\n  virtual bool get_nlp_info(Index& n, Index& m, Index& nnz_jac_g,\n                            Index& nnz_h_lag, IndexStyleEnum& index_style);\n\n  /** Method to return the bounds for my problem */\n  virtual bool get_bounds_info(Index n, Number* x_l, Number* x_u,\n                               Index m, Number* g_l, Number* g_u);\n\n  /** Method to return the starting point for the algorithm */\n  virtual bool get_starting_point(Index n, bool init_x, Number* x,\n                                  bool init_z, Number* z_L, Number* z_U,\n                                  Index m, bool init_lambda,\n                                  Number* lambda);\n\n  /** Method to return the objective value */\n  virtual bool eval_f(Index n, const Number* x, bool new_x, Number& obj_value);\n\n  /** Method to return the gradient of the objective */\n  virtual bool eval_grad_f(Index n, const Number* x, bool new_x, Number* grad_f);\n\n  /** Method to return the constraint residuals */\n  virtual bool eval_g(Index n, const Number* x, bool new_x, Index m, Number* g);\n\n  /** Method to return:\n   *   1) The structure of the jacobian (if \"values\" is NULL)\n   *   2) The values of the jacobian (if \"values\" is not NULL)\n   */\n  virtual bool eval_jac_g(Index n, const Number* x, bool new_x,\n                          Index m, Index nele_jac, Index* iRow, Index *jCol,\n                          Number* values);\n\n  /** Method to return:\n   *   1) The structure of the hessian of the lagrangian (if \"values\" is NULL)\n   *   2) The values of the hessian of the lagrangian (if \"values\" is not NULL)\n   */\n  virtual bool eval_h(Index n, const Number* x, bool new_x,\n                      Number obj_factor, Index m, const Number* lambda,\n                      bool new_lambda, Index nele_hess, Index* iRow,\n                      Index* jCol, Number* values);\n\n  //@}\n\n  /** @name Solution Methods */\n  //@{\n  /** This method is called when the algorithm is complete so the TNLP can store/write the solution */\n  virtual void finalize_solution(SolverReturn status,\n                                 Index n, const Number* x, const Number* z_L, const Number* z_U,\n                                 Index m, const Number* g, const Number* lambda,\n                                 Number obj_value,\n                                 const IpoptData* ip_data,\n                                 IpoptCalculatedQuantities* ip_cq);\n  //@}\n\nprivate:\n  /**@name Methods to block default compiler methods.\n   * The compiler automatically generates the following three methods.\n   *  Since the default compiler implementation is generally not what\n   *  you want (for all but the most simple classes), we usually\n   *  put the declarations of these methods in the private section\n   *  and never implement them. This prevents the compiler from\n   *  implementing an incorrect \"default\" behavior without us\n   *  knowing. (See Scott Meyers book, \"Effective C++\")\n   *\n   */\n  //@{\n  //  MyNLP();\n  NProblemGmmIPOPT(const NProblemGmmIPOPT&);\n  NProblemGmmIPOPT& operator=(const NProblemGmmIPOPT&);\n  //@}\n\n\nprivate:\n\n  // pointer to problem instance\n  NProblemGmmInterface* problem_;\n  // reference to constraints vector\n  std::vector<NConstraintInterface*>& constraints_;\n\n  int nnz_jac_g_;\n  int nnz_h_lag_;\n\n  // constant structure of jacobian_of_constraints and hessian_of_lagrangian\n  std::vector<Index> jac_g_iRow_;\n  std::vector<Index> jac_g_jCol_;\n  std::vector<Index> h_lag_iRow_;\n  std::vector<Index> h_lag_jCol_;\n\n  // Sparse Matrix of problem (don't initialize every time!!!)\n  SMatrixNP HP_;\n};\n\n\n//=============================================================================\n} // namespace COMISO\n\n//=============================================================================\n#endif // COMISO_IPOPT_AVAILABLE\n//=============================================================================\n#endif // ACG_IPOPTSOLVER_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/CoMISo/NSolver/LeastSquaresProblem.cc",
    "content": "//=============================================================================\n//\n//  CLASS LeastSquaresProblem - IMPLEMENTATION\n//\n//=============================================================================\n\n//== INCLUDES =================================================================\n\n#include \"LeastSquaresProblem.hh\"\n\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== IMPLEMENTATION ========================================================== \n\n\n//-----------------------------------------------------------------------------\n\n\nvoid\nLeastSquaresProblem::\nadd_term(NConstraintInterface* _term)\n{\n  terms_.push_back(_term);\n}\n\n\n//-----------------------------------------------------------------------------\n\n\ndouble\nLeastSquaresProblem::\neval_term(const unsigned int _i, const double* _x)\n{\n  if(_i >= terms_.size())\n  {\n    std::cerr << \"ERROR: bad index in LeastSquaresProblem::eval_term\" << std::endl;\n    return 0.0;\n  }\n\n  double vterm = terms_[_i]->eval_constraint(_x);\n\n  return vterm*vterm;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\ndouble\nLeastSquaresProblem::\neval_term(const unsigned int _i)\n{\n  if(!x_.empty())\n    return eval_term(_i, &(x_[0]));\n  else\n  {\n    std::cerr << \"warning: called eval_term with zero unknowns...\" << std::endl;\n    return 0.0;\n  }\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nint\nLeastSquaresProblem::\nn_unknowns   (                                )\n{\n  return n_;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid\nLeastSquaresProblem::\ninitial_x    (       double* _x               )\n{\n  for( int i=0; i<this->n_unknowns(); ++i)\n    _x[i] = x_[i];\n}\n\n\n//-----------------------------------------------------------------------------\n\n\ndouble\nLeastSquaresProblem::\neval_f       ( const double* _x )\n{\n  double vtot(0.0);\n\n  for(unsigned int i=0; i<terms_.size(); ++i)\n  {\n    double vterm = terms_[i]->eval_constraint(_x);\n    vtot += vterm*vterm;\n  }\n\n  return vtot;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid\nLeastSquaresProblem::\neval_gradient( const double* _x, double*    _g)\n{\n  // clear gradient\n  for( int i=0; i<this->n_unknowns(); ++i)\n    _g[i] = 0.0;\n\n  for(unsigned int i=0; i<terms_.size(); ++i)\n  {\n    // get local function value\n    double vterm = terms_[i]->eval_constraint(_x);\n\n    // get local gradient\n    NConstraintInterface::SVectorNC gterm;\n    terms_[i]->eval_gradient(_x, gterm);\n\n    // add terms to global gradient\n    NConstraintInterface::SVectorNC::InnerIterator v_it(gterm);\n    for( ; v_it; ++v_it)\n    {\n      _g[v_it.index()] += 2.0*vterm*v_it.value();\n    }\n  }\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid\nLeastSquaresProblem::\neval_hessian ( const double* _x, SMatrixNP& _H)\n{\n  // clear old data\n  _H.resize(n_unknowns(), n_unknowns());\n  _H.setZero();\n\n  for(unsigned int i=0; i<terms_.size(); ++i)\n  {\n    // get local function value\n    double vterm = terms_[i]->eval_constraint(_x);\n\n    // get local gradient\n    NConstraintInterface::SVectorNC gterm;\n    terms_[i]->eval_gradient(_x, gterm);\n\n    // add terms to global gradient\n    NConstraintInterface::SVectorNC::InnerIterator v_it (gterm);\n    for( ; v_it; ++v_it)\n    {\n      NConstraintInterface::SVectorNC::InnerIterator v_it2(gterm);\n      for( ; v_it2; ++v_it2)\n        _H.coeffRef(v_it.index(), v_it2.index()) += 2.0*v_it.value()*v_it2.value();\n    }\n\n    NConstraintInterface::SMatrixNC Hterm;\n    terms_[i]->eval_hessian(_x, Hterm);\n\n    NConstraintInterface::SMatrixNC::iterator h_it  = Hterm.begin();\n    NConstraintInterface::SMatrixNC::iterator h_end = Hterm.end();\n    for(; h_it != h_end; ++h_it)\n      _H.coeffRef(h_it.row(),h_it.col()) += 2.0*vterm*(*h_it);\n  }\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid\nLeastSquaresProblem::\nstore_result ( const double* _x               )\n{\n  for( int i=0; i<this->n_unknowns(); ++i)\n    x_[i] = _x[i];\n}\n\n\n//-----------------------------------------------------------------------------\n\nbool\nLeastSquaresProblem::\nconstant_hessian()\n{\n  for(unsigned int i=0; i<terms_.size(); ++i)\n  {\n    if(!terms_[i]->is_linear())\n      return false;\n  }\n\n  return true;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n"
  },
  {
    "path": "libs/CoMISo/NSolver/LeastSquaresProblem.hh",
    "content": "//=============================================================================\n//\n//  CLASS LeastSquaresProblem\n//\n//=============================================================================\n\n\n#ifndef COMISO_LeastSquaresProblem_HH\n#define COMISO_LeastSquaresProblem_HH\n\n\n//== INCLUDES =================================================================\n#include <CoMISo/Config/config.hh>\n#include <CoMISo/Config/CoMISoDefines.hh>\n#include <CoMISo/NSolver/NProblemInterface.hh>\n#include <CoMISo/NSolver/NConstraintInterface.hh>\n\n\n//== FORWARDDECLARATIONS ======================================================\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== CLASS DEFINITION =========================================================\n\n\t      \n\n/** \\class newClass newClass.hh \n\n    Brief Description.\n  \n    A more elaborate description follows.\n*/\nclass COMISODLLEXPORT LeastSquaresProblem : public NProblemInterface\n{\npublic:\n   \n  /// Default constructor\n  LeastSquaresProblem(const int _n_unknowns) :n_(_n_unknowns), x_(_n_unknowns, 0.0) {}\n \n  /// Destructor\n  ~LeastSquaresProblem() {}\n\n\n  void add_term(NConstraintInterface* _term);\n\n  double eval_term(const unsigned int _i, const double* _x);\n  double eval_term(const unsigned int _i);\n\n  // get reference to solution vector\n  const std::vector<double>& x() const {return x_;}\n        std::vector<double>& x()       {return x_;}\n\n  // problem definition\n  virtual int    n_unknowns   (                                );\n  virtual void   initial_x    (       double* _x               );\n  virtual double eval_f       ( const double* _x               );\n  virtual void   eval_gradient( const double* _x, double*    _g);\n  virtual void   eval_hessian ( const double* _x, SMatrixNP& _H);\n  virtual void   store_result ( const double* _x               );\n\n  // advanced properties\n  virtual bool   constant_hessian();\n\nprivate:\n\n  // #unknowns\n  int n_;\n\n  // current solution vector\n  std::vector<double> x_;\n\n  // pointer to terms\n  std::vector<NConstraintInterface*> terms_;\n};\n\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n#endif // COMISO_LeastSquaresProblem_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/CoMISo/NSolver/LinearConstraint.cc",
    "content": "//=============================================================================\n//\n//  CLASS LinearConstraint\n//\n//=============================================================================\n\n\n#ifndef COMISO_LINEARCONSTRAINT_CC\n#define COMISO_LINEARCONSTRAINT_CC\n\n\n//== INCLUDES =================================================================\n\n#include <CoMISo/Config/CoMISoDefines.hh>\n#include \"NConstraintInterface.hh\"\n#include <gmm/gmm.h>\n#include <CoMISo/NSolver/LinearConstraint.hh>\n\n//== FORWARDDECLARATIONS ======================================================\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== Implementation =========================================================\n\n      \n/// Default constructor\nLinearConstraint::LinearConstraint(const ConstraintType _type) : NConstraintInterface(_type)\n{}\n\n// linear equation of the form -> coeffs_^T *x  + b_=_type= 0\nLinearConstraint::LinearConstraint(const SVectorNC& _coeffs, const double _b, const ConstraintType _type) : NConstraintInterface(_type)\n{\n  coeffs_ = _coeffs;\n  b_ = _b;\n}\n\n/// Destructor\nLinearConstraint::~LinearConstraint() {}\n\nint LinearConstraint::n_unknowns()\n{\n  return coeffs_.innerSize();\n}\n\nvoid LinearConstraint::resize(const unsigned int _n)\n{\n  coeffs_.resize(_n);\n}\n\nconst LinearConstraint::SVectorNC& LinearConstraint::coeffs() const\n{\n  return coeffs_;\n}\nLinearConstraint::SVectorNC& LinearConstraint::coeffs() \n{ \n  return coeffs_;\n}\nconst double&    LinearConstraint::b() const\n{\n  return b_;\n}\ndouble&    LinearConstraint::b()      \n{ \n  return b_;\n}\n\ndouble LinearConstraint::eval_constraint ( const double* _x )\n{\n  double v = b_;\n\n  SVectorNC::InnerIterator c_it(coeffs_);\n  for(; c_it; ++c_it)\n    v += c_it.value()*_x[c_it.index()];\n\n  return v;\n}\n\nvoid LinearConstraint::eval_gradient( const double* _x, SVectorNC& _g      )\n{\n  _g = coeffs_;\n}\n\nvoid LinearConstraint::eval_hessian    ( const double* _x, SMatrixNC& _h      )\n{\n  _h.clear();\n  _h.resize(coeffs_.innerSize(), coeffs_.innerSize());\n}\n\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n#endif // ACG_LINEARCONSTRAINT_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/CoMISo/NSolver/LinearConstraint.hh",
    "content": "//=============================================================================\n//\n//  CLASS NConstraintGmmInterface\n//\n//=============================================================================\n\n\n#ifndef COMISO_LINEARCONSTRAINT_HH\n#define COMISO_LINEARCONSTRAINT_HH\n\n\n//== INCLUDES =================================================================\n\n#include <CoMISo/Config/CoMISoDefines.hh>\n#include \"NConstraintInterface.hh\"\n#include <Eigen/StdVector>\n\n\n//== FORWARDDECLARATIONS ======================================================\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== CLASS DEFINITION =========================================================\n\n\t      \n\n/** \\class NProblemGmmInterface NProblemGmmInterface.hh <ACG/.../NPRoblemGmmInterface.hh>\n\n    Brief Description.\n  \n    A more elaborate description follows.\n*/\nclass COMISODLLEXPORT LinearConstraint : public NConstraintInterface\n{\npublic:\n\n  // sparse vector type\n  typedef NConstraintInterface::SVectorNC SVectorNC;\n\n  // different types of constraints\n//  enum ConstraintType {NC_EQUAL, NC_LESS_EQUAL, NC_GREATER_EQUAL};\n\n  /// Default constructor\n  LinearConstraint(const ConstraintType _type = NC_EQUAL);\n\n  // linear equation of the form -> coeffs_^T *x  + b_=_type= 0\n  LinearConstraint(const SVectorNC& _coeffs, const double _b, const ConstraintType _type = NC_EQUAL);\n\n  /// Destructor\n  virtual ~LinearConstraint();\n\n  virtual int n_unknowns();\n\n  void  resize(const unsigned int _n);\n\n  const SVectorNC& coeffs() const;\n        SVectorNC& coeffs();\n\n  const double&    b() const;\n        double&    b();\n\n  virtual double eval_constraint ( const double* _x );\n  \n  virtual void eval_gradient( const double* _x, SVectorNC& _g      );\n\n  virtual void eval_hessian    ( const double* _x, SMatrixNC& _h      );\n\n  virtual bool is_linear() { return true;}\n\n  // inherited from base\n//  virtual ConstraintType  constraint_type (                                      ) { return type_; }\n\nprivate:\n\n  // linear equation of the form -> coeffs_^T * x + b_\n  SVectorNC coeffs_;\n  double    b_;\n};\n\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n// support std vectors\nEIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(COMISO::LinearConstraint);\n//=============================================================================\n#endif // ACG_LINEARCONSTRAINT_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/CoMISo/NSolver/LinearConstraintHandlerElimination.cc",
    "content": "//=============================================================================\n//\n//  CLASS LinearConstraintHandlerElimination - IMPLEMENTATION TEMPLATES\n//\n//=============================================================================\n\n\n\n//== INCLUDES =================================================================\n\n#include \"LinearConstraintHandlerElimination.hh\"\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== IMPLEMENTATION ==========================================================\n\n\nvoid\nLinearConstraintHandlerElimination::\ninitialize_identity(int _n)\n{\n  n_ = _n;\n  n_red_ = _n;\n  m_ = 0;\n  b_.resize(n_);\n  gmm::resize(C_, n_, n_);\n  gmm::resize(Ct_, n_, n_);\n  gmm::clear(C_);\n  gmm::clear(Ct_);\n  for(int i=0; i<n_; ++i)\n  {\n    b_[i] = 0.0;\n    Ct_(i,i) = 1.0;\n    C_(i,i) = 1.0;\n  }\n}\n\n//-----------------------------------------------------------------------------\n\nvoid\nLinearConstraintHandlerElimination::\ninitialize( const std::vector<double>& _c)\n{\n if( _c.size() )\n   initialize( (double*) &(_c[0]));\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid\nLinearConstraintHandlerElimination::\ninitialize( double* _c)\n{\n  // TODO\n}\n\n//-----------------------------------------------------------------------------\n\nvoid\nLinearConstraintHandlerElimination::\ntransform_x( const std::vector<double>& _x, std::vector<double>& _xC)\n{\n  _xC.resize(n_red_);\n  if( _x.size() && _xC.size())\n    transform_x((double*)&(_x[0]), &(_xC[0]));\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid\nLinearConstraintHandlerElimination::\ntransform_x( double* _x, double* _xC)\n{\n  // directly exploit orthogonality of QR-factorization\n  // _xC = Ct_*(_x-b_)\n\n  Vtemp_.resize(n_);\n  gmm::add(VectorPT(_x,n_), gmm::scaled(b_,-1.0), Vtemp_);\n  gmm::mult(Ct_,Vtemp_, VectorPT(_xC,n_red_));\n\n  //  // set up least squares problem\n//  // Ct (_x - b_) = CtC _xC\n//\n//  Vtemp_.resize(n_);\n//  Vtemp2_.resize(n_red_);\n//  gmm::add(VectorPT(_x,n_), gmm::scaled(b_,-1.0), Vtemp_);\n//  gmm::mult(Ct_,Vtemp_, Vtemp2_);\n//\n//  // solve least squares problem\n//  if( n_red_)\n//    chol_CtC_.solve(_xC, (double*)(&(Vtemp2_[0])));\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid\nLinearConstraintHandlerElimination::\ninv_transform_x( const std::vector<double>& _xC, std::vector<double>& _x)\n{\n  _x.resize(n_);\n  if( _x.size())\n    inv_transform_x( (double*)&(_xC[0]), &(_x[0]));\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid\nLinearConstraintHandlerElimination::\ninv_transform_x( double* _xC, double* _x)\n{\n  gmm::copy(b_, VectorPT(_x, n_));\n  gmm::mult_add(C_, VectorPT(_xC, n_red_), VectorPT(_x, n_));\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid\nLinearConstraintHandlerElimination::\nproject_x( const std::vector<double>& _x, std::vector<double>& _xp)\n{\n  _xp.resize(n_);\n  if( _x.size())\n    project_x((double*)&(_x[0]), &(_xp[0]));\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid\nLinearConstraintHandlerElimination::\nproject_x( double* _x, double* _xp)\n{\n  if( n_ == n_red_)   // special case of no constraints\n  {\n    // just copy\n    gmm::copy(VectorPT(_x, n_), VectorPT(_xp, n_));\n  }\n  else\n  {\n    Vtemp_.resize( n_red_);\n\n    transform_x    (_x           , &(Vtemp_[0]));\n    inv_transform_x( &(Vtemp_[0]), _xp       );\n  }\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid\nLinearConstraintHandlerElimination::\nproject_dx( const std::vector<double>& _x, std::vector<double>& _xp)\n{\n  _xp.resize(n_);\n  if( _x.size())\n    project_dx((double*)&(_x[0]), &(_xp[0]));\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid\nLinearConstraintHandlerElimination::\nproject_dx( double* _x, double* _xp)\n{\n  if( n_ == n_red_)   // special case of no constraints\n  {\n    // just copy\n    gmm::copy(VectorPT(_x, n_), VectorPT(_xp, n_));\n  }\n  else\n  {\n    // idea: C_ is an orthonormal basis of the kernel\n    // -> simply project out the non-constraint part\n\n    Vtemp_.resize( n_red_);\n\n    gmm::mult(Ct_, VectorPT(_x, n_), Vtemp_);\n    gmm::mult(C_, Vtemp_, VectorPT(_xp, n_));\n\n//    // check result\n//    std::cerr << \"check result...\" << std::endl;\n//    Vtemp_.resize(b_orig_.size());\n//    gmm::mult(A_orig_, VectorPT(_xp, n_), Vtemp_);\n////    gmm::add(gmm::scaled(b_orig_, -1.0), Vtemp_);\n//    std::cerr << \"check constraint update... \" << gmm::vect_norm2(Vtemp_) << std::endl;\n//\n////    std::cerr << \"check constraint update... \" << COMISO_GMM::residuum_norm<RMatrix,std::vector<double> >(A_orig_,Vtemp_, b_orig_) << std::endl;\n  }\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid\nLinearConstraintHandlerElimination::\ntransform_gradient( const std::vector<double>& _g, std::vector<double>& _gC)\n{\n  _gC.resize(n_red_);\n  if( _g.size() && _gC.size())\n    transform_gradient( (double*)&(_g[0]), &(_gC[0]));\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid\nLinearConstraintHandlerElimination::\ntransform_gradient( double* _g, double* _gC)\n{\n  gmm::mult( Ct_, VectorPT(_g, n_), VectorPT(_gC, n_red_));\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid\nLinearConstraintHandlerElimination::\ntransform_hessian( const RMatrix& _H, RMatrix& _HC)\n{\n  // resize and clear matrix\n  gmm::resize(_HC, n_red_, n_red_);\n  gmm::clear(_HC);\n\n  gmm::resize(Mtemp_, n_, n_red_);\n  gmm::mult(_H,C_, Mtemp_);\n  gmm::mult(Ct_, Mtemp_, _HC);\n}\n\n\n//-----------------------------------------------------------------------------\n\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n"
  },
  {
    "path": "libs/CoMISo/NSolver/LinearConstraintHandlerElimination.hh",
    "content": "//=============================================================================\n//\n//  CLASS LinearConstraintHandlerElimination\n//\n//=============================================================================\n\n\n#ifndef COMISO_LINEARCONSTRAINTHANDLERELIMINATION_HH\n#define COMISO_LINEARCONSTRAINTHANDLERELIMINATION_HH\n\n\n//== INCLUDES =================================================================\n\n#include <CoMISo/Config/CoMISoDefines.hh>\n#include <iostream>\n#include <gmm/gmm.h>\n\n//== FORWARDDECLARATIONS ======================================================\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== CLASS DEFINITION =========================================================\n\n\n\n\t      \n/** \\class LinearConstraintHandler LinearConstraintHandler.hh <ACG/.../LinearConstraintHandler.hh>\n\n    Brief Description.\n  \n    A more elaborate description follows.\n*/\n\n\nclass COMISODLLEXPORT LinearConstraintHandlerElimination\n{\npublic:\n   \n  typedef gmm::col_matrix< gmm::wsvector< double> > CMatrix;\n  typedef gmm::row_matrix< gmm::wsvector< double> > RMatrix;\n\n  // use c-arrays as vectors for gmm\n  typedef gmm::array1D_reference<double*> VectorPT;\n\n  /// Constructor\n  LinearConstraintHandlerElimination() {initialize_identity(0);}\n\n  // initialize Constructor\n  template<class MatrixT, class VectorT>\n  LinearConstraintHandlerElimination( const MatrixT& _C, const VectorT& _c)\n  {initialize(_C, _c); }\n\n \n  /// Destructor\n  ~LinearConstraintHandlerElimination() {}\n\n  // number of variables\n  int n() {return n_;}\n  // number of reduced variables (after elimination)\n  int n_reduced() {return n_red_;}\n  // number of linearly independent constraints (n-n_reduced)\n  int n_constraints() { return m_;}\n\n  // initialize new constraints\n  template<class MatrixT, class VectorT>\n  void initialize( const MatrixT& _C, const VectorT& _c);\n\n  // no constraints\n  void initialize_identity(int _n);\n\n  // initialize new constraints rhs only\n  void initialize( const std::vector<double>& _c);\n  void initialize( double* _c);\n\n  // transform x vector (least squares solution, fulfilling the constraints)\n  void transform_x( const std::vector<double>& _x, std::vector<double>& _xC);\n  void transform_x( double* _x, double* _xC);\n\n  // inverse transform x ( x_reduced -> x)\n  void inv_transform_x( const std::vector<double>& _xC, std::vector<double>& _x);\n  void inv_transform_x( double* _xC, double* _x);\n\n  // project x to closest one fullfilling the constraints: inv_transform_x(transform_x(x))\n  void project_x( const std::vector<double>& _x, std::vector<double>& _xp);\n  void project_x( double* _x, double* _xp);\n\n  // project dx to closest one that A(x0+dx) = b\n  void project_dx( const std::vector<double>& _x, std::vector<double>& _xp);\n  void project_dx( double* _x, double* _xp);\n\n  // transform gradient\n  void transform_gradient( const std::vector<double>& _g, std::vector<double>& _gC);\n  void transform_gradient( double* _g, double* _gC);\n\n  // transform hessian\n  void transform_hessian( const RMatrix& _H, RMatrix& _HC);\n\nprivate:\n  \n  // Constraints in basis transformation form x_orig = b_ + C_*x_reduced\n  // notice that C_ is a basis of the nullspace of the constraints\n  RMatrix             C_;\n  RMatrix             Ct_;\n  std::vector<double> b_;\n\n  // number of variables\n  int n_;\n  // number of constraints (linear independent)\n  int m_;\n  // number of reduced variables\n  int n_red_;\n\n  // temp matrix to transform hessian and temp vectors\n  RMatrix             Mtemp_;\n  std::vector<double> Vtemp_;\n\n  // hack -> store initial linear system\n  RMatrix              A_orig_;\n  std::vector<double>  b_orig_;\n};\n\n//=============================================================================\n} // namespace ACG\n//=============================================================================\n#if defined(INCLUDE_TEMPLATES) && !defined(COMISO_LINEARCONSTRAINTHANDLERELIMINATION_C)\n#define COMISO_LINEARCONSTRAINTHANDLERELIMINATION_TEMPLATES\n#include \"LinearConstraintHandlerEliminationT.cc\"\n#endif\n//=============================================================================\n#endif // COMISO_LINEARCONSTRAINTHANDLERELIMINATION_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/CoMISo/NSolver/LinearConstraintHandlerEliminationT.cc",
    "content": "//=============================================================================\n//\n//  CLASS LinearConstraintHandlerElimination - IMPLEMENTATION\n//\n//=============================================================================\n\n#define COMISO_LINEARCONSTRAINTHANDLERELIMINATION_C\n\n//== INCLUDES =================================================================\n\n#include \"LinearConstraintHandlerElimination.hh\"\n\n#include <CoMISo/Solver/SparseQRSolver.hh>\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== IMPLEMENTATION ==========================================================\n\ntemplate<class MatrixT, class VectorT>\nvoid\nLinearConstraintHandlerElimination::\ninitialize( const MatrixT& _C, const VectorT& _c)\n{\n  // no constraints?\n  if( gmm::mat_nrows(_C) == 0)\n  {\n    initialize_identity( gmm::mat_ncols(_C));\n  }\n  else\n  {\n\n\t  // require SPQR SOLVER!!!\n#if(COMISO_SUITESPARSE_SPQR_AVAILABLE)\n    // Construct constraints basis form via QR-factorization (see Nocedal 426...)\n    // Constraints in basis transformation form x_orig = b_ + C_*x_reduced\n    // notice that C_ is a basis of the nullspace of the constraints\n    // and _C*b_ = _c (means b_ is one solution of the constraints)\n\n    std::cerr << \"Initialize Linear Constraint handler...\\n\";\n    COMISO::SparseQRSolver sqr;\n    //  sqr.calc_system_gmm(_C);\n    CMatrix Q;\n    CMatrix R;\n    std::vector<int> P;\n    int rank = sqr.factorize_system_gmm(gmm::transposed(_C), Q, R, P);\n\n    // Q[0..m-1,rank..m-1] is basis of the nullspace -> C_, Ct_\n    int m = gmm::mat_nrows(Q);\n    gmm::resize(C_, m, m-rank);\n    gmm::clear (C_);\n    gmm::copy( gmm::sub_matrix(Q, gmm::sub_interval(0,m), gmm::sub_interval(rank,m-rank)), C_);\n    gmm::resize(Ct_, gmm::mat_ncols(C_), gmm::mat_nrows(C_));\n    gmm::copy( gmm::transposed(C_), Ct_);\n\n    // compute b_\n    b_.resize(gmm::mat_ncols(_C));\n    // hack (too expensive, directly exploit Q,R,P from above)\n    sqr.calc_system_gmm(_C);\n    sqr.solve(b_, _c);\n\n    n_     = gmm::mat_nrows(C_);\n    n_red_ = gmm::mat_ncols(C_);\n    m_     = n_ - n_red_;\n\n    // hack -> store initial system\n    if(0)\n    {\n      gmm::resize(A_orig_, gmm::mat_nrows(_C), gmm::mat_ncols(_C));\n      gmm::resize(b_orig_, _c.size());\n      gmm::copy(_C, A_orig_);\n      gmm::copy(_c, b_orig_);\n    }\n\n//    RMatrix CtC(n_red_, n_red_);\n//    gmm::mult(Ct_,C_, CtC);\n//    std::cerr << \"CtC\\n\";\n//    std::cerr << CtC << std::endl;\n\n\n    /*\n  // set up least squares problem\n  gmm::resize(Mtemp_, gmm::mat_ncols(C_), gmm::mat_ncols(C_));\n  gmm::mult(Ct_, C_, Mtemp_);\n  chol_CtC_.calc_system_gmm(Mtemp_);\n     */\n\n    //  std::cerr << \"Q: \" << Q  << std::endl;\n    //  std::cerr << \"R: \" << R  << std::endl;\n    //  std::cerr << \"P: \" << P  << std::endl;\n    //  std::cerr << \"C_:\" << C_ << std::endl;\n    //  std::cerr << \"b_:\" << b_ << std::endl;\n    //\n    //  std::cerr << \"#rows: \" << gmm::mat_nrows(_C) << std::endl;\n    //  std::cerr << \"#nullspace: \" << m << std::endl;\n    //  std::cerr << \"rank: \" << rank << std::endl;\n    //  std::cerr << \"dim Q = \" << gmm::mat_nrows(Q) << \" x \" << gmm::mat_ncols(Q) << std::endl;\n    //  std::cerr << \"dim R = \" << gmm::mat_nrows(R) << \" x \" << gmm::mat_ncols(R) << std::endl;\n#else\n    std::cerr << \"ERROR: SQPR-Solver required by LinearConstraintHandlerElimination not available !!!\" << std::endl;\n#endif\n  }\n}\n\n//-----------------------------------------------------------------------------\n\n\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n"
  },
  {
    "path": "libs/CoMISo/NSolver/LinearConstraintHandlerPenalty.cc",
    "content": "//=============================================================================\n//\n//  CLASS LinearConstraintHandlerPenalty - IMPLEMENTATION TEMPLATES\n//\n//=============================================================================\n\n\n\n//== INCLUDES =================================================================\n\n#include \"LinearConstraintHandlerPenalty.hh\"\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== IMPLEMENTATION ==========================================================\n\n\n/// Constructor\nLinearConstraintHandlerPenalty::LinearConstraintHandlerPenalty() : penalty_(10000) {}\n\n\n//-----------------------------------------------------------------------------\n\n/// Destructor\nLinearConstraintHandlerPenalty::~LinearConstraintHandlerPenalty()\n{}\n\n//-----------------------------------------------------------------------------\n\n// penalty weight\ndouble& LinearConstraintHandlerPenalty::penalty()\n{ return penalty_; }\n\n//-----------------------------------------------------------------------------\n\n// number of variables\nint LinearConstraintHandlerPenalty::n()\n{return n_;}\n\n//-----------------------------------------------------------------------------\n\n// number of linearly independent constraints (n-n_reduced)\nint LinearConstraintHandlerPenalty::n_constraints()\n{ return m_;}\n\n//-----------------------------------------------------------------------------\n\nvoid\nLinearConstraintHandlerPenalty::\ninitialize( const std::vector<double>& _c)\n{\n if( _c.size() )\n   initialize( (double*) &(_c[0]));\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid\nLinearConstraintHandlerPenalty::\ninitialize( double* _c)\n{\n  for(unsigned int i=0; i<b_.size(); ++i)\n    b_[i] = _c[i];\n\n  penalty_grad_b_.resize(n_);\n  gmm::mult(gmm::transposed(C_), b_, penalty_grad_b_);\n  gmm::scale(penalty_grad_b_, -2.0*penalty_);\n}\n\n//-----------------------------------------------------------------------------\n\ndouble\nLinearConstraintHandlerPenalty::\nadd_penalty_f( double* _x, const double _f)\n{\n\n  temp_.resize(b_.size());\n  gmm::mult(C_, VectorPT(_x, n_), temp_);\n  gmm::add(gmm::scaled(b_, -1.0), temp_);\n\n  double fp = ( penalty_* (gmm::vect_sp(temp_, temp_)) );\n\n  return _f + fp;\n}\n\n//-----------------------------------------------------------------------------\n\n\nvoid\nLinearConstraintHandlerPenalty::\nadd_penalty_gradient( const std::vector<double>& _x, std::vector<double>& _g)\n{\n  _g.resize(n_);\n  if( _x.size() && _g.size())\n    add_penalty_gradient( (double*)&(_x[0]), &(_g[0]));\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid\nLinearConstraintHandlerPenalty::\nadd_penalty_gradient( double* _x, double* _g)\n{\n  gmm::add( penalty_grad_b_, VectorPT(_g, n_));\n  gmm::mult_add(penalty_H_, VectorPT(_x, n_), VectorPT(_g, n_));\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid\nLinearConstraintHandlerPenalty::\nadd_penalty_hessian( RMatrix& _H)\n{\n  gmm::add(penalty_H_, _H);\n}\n\n\n//-----------------------------------------------------------------------------\n\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n"
  },
  {
    "path": "libs/CoMISo/NSolver/LinearConstraintHandlerPenalty.hh",
    "content": "//=============================================================================\n//\n//  CLASS LinearConstraintHandlerElimination\n//\n//=============================================================================\n\n\n#ifndef COMISO_LINEARCONSTRAINTHANDLERPENALTY_HH\n#define COMISO_LINEARCONSTRAINTHANDLERPENALTY_HH\n\n\n//== INCLUDES =================================================================\n\n#include <CoMISo/Config/CoMISoDefines.hh>\n#include <iostream>\n#include <gmm/gmm.h>\n\n//== FORWARDDECLARATIONS ======================================================\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== CLASS DEFINITION =========================================================\n\n\n\n\t      \n/** \\class LinearConstraintHandler LinearConstraintHandler.hh <ACG/.../LinearConstraintHandler.hh>\n\n    Brief Description.\n  \n    A more elaborate description follows.\n*/\n\n\nclass COMISODLLEXPORT LinearConstraintHandlerPenalty\n{\npublic:\n   \n  typedef gmm::col_matrix< gmm::wsvector< double> > CMatrix;\n  typedef gmm::row_matrix< gmm::wsvector< double> > RMatrix;\n\n  // use c-arrays as vectors for gmm\n  typedef gmm::array1D_reference<double*> VectorPT;\n\n  /// Constructor\n  LinearConstraintHandlerPenalty();\n\n  // initialize Constructor\n  template<class MatrixT, class VectorT>\n  LinearConstraintHandlerPenalty( const MatrixT& _C, const VectorT& _c);\n \n  /// Destructor\n  ~LinearConstraintHandlerPenalty();\n\n  // penalty weight\n  double& penalty();\n\n  // number of variables\n  int n();\n\n  // number of linearly independent constraints (n-n_reduced)\n  int n_constraints();\n\n  // initialize new constraints\n  template<class MatrixT, class VectorT>\n  void initialize( const MatrixT& _C, const VectorT& _c);\n\n  // initialize new constraints rhs only\n  void initialize( const std::vector<double>& _c);\n  void initialize( double* _c);\n\n  // transform energy\n  double add_penalty_f( double* _x, const double _f);\n\n  // transform gradient\n  void add_penalty_gradient( const std::vector<double>& _x, std::vector<double>& _g);\n  void add_penalty_gradient( double* _x, double* _g);\n\n  // transform hessian\n  void add_penalty_hessian( RMatrix& _H);\n\nprivate:\n  // penalty weight\n  double penalty_;\n  \n  // Linear Constraints C_*x_ = b_\n  RMatrix             C_;\n  std::vector<double> b_;\n\n  // precomputed penalty terms\n  RMatrix penalty_H_;\n  std::vector<double> penalty_grad_b_;\n\n  // temp vector\n  std::vector<double> temp_;\n\n  // number of variables\n  int n_;\n  // number of constraints (linear independent)\n  int m_;\n};\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n#if defined(INCLUDE_TEMPLATES) && !defined(ACG_LINEARCONSTRAINTHANDLERPENALTY_C)\n#define ACG_LINEARCONSTRAINTHANDLERPENALTY_TEMPLATES\n#include \"LinearConstraintHandlerPenaltyT.cc\"\n#endif\n//=============================================================================\n#endif // ACG_LINEARCONSTRAINTHANDLERPENALTY_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/CoMISo/NSolver/LinearConstraintHandlerPenaltyT.cc",
    "content": "//=============================================================================\n//\n//  CLASS LinearConstraintHandlerPenalty - IMPLEMENTATION\n//\n//=============================================================================\n\n#define COMISO_LINEARCONSTRAINTHANDLERPENALTY_C\n\n//== INCLUDES =================================================================\n\n#include \"LinearConstraintHandlerPenalty.hh\"\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== IMPLEMENTATION ==========================================================\n\n// initialize Constructor\ntemplate<class MatrixT, class VectorT>\nLinearConstraintHandlerPenalty::LinearConstraintHandlerPenalty( const MatrixT& _C, const VectorT& _c) :\n  penalty_(10000)\n{initialize(_C, _c); }\n\ntemplate<class MatrixT, class VectorT>\nvoid\nLinearConstraintHandlerPenalty::\ninitialize( const MatrixT& _C, const VectorT& _c)\n{\n  gmm::resize(C_, gmm::mat_nrows(_C), gmm::mat_ncols(_C));\n  gmm::copy(_C,C_);\n  b_ = _c;\n\n  n_     = gmm::mat_ncols(_C);\n  m_     = b_.size();\n\n  // initialize penalty stuff\n  // penalty_H_      = 2*penalty*A^t A\n  // penalty_grad_b_ = -2*penalty*A^t b\n  gmm::resize(penalty_H_, n_, n_);\n  gmm::clear(penalty_H_);\n  RMatrix temp(n_,m_);\n  gmm::copy( gmm::transposed(C_), temp);\n  gmm::mult( temp,C_, penalty_H_);\n  gmm::scale(penalty_H_, 2.0*penalty_);\n\n  penalty_grad_b_.clear();\n  penalty_grad_b_.resize(n_);\n  gmm::mult(gmm::transposed(C_), b_, penalty_grad_b_);\n  gmm::scale(penalty_grad_b_, -2.0*penalty_);\n}\n\n//-----------------------------------------------------------------------------\n\n\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n"
  },
  {
    "path": "libs/CoMISo/NSolver/NConstraintInterface.hh",
    "content": "//=============================================================================\n//\n//  CLASS NConstraintInterface\n//\n//=============================================================================\n\n\n#ifndef COMISO_NCONSTRAINTINTERFACE_HH\n#define COMISO_NCONSTRAINTINTERFACE_HH\n\n//== COMPILE-TIME PACKAGE REQUIREMENTS ========================================\n#include <CoMISo/Config/config.hh>\n#if COMISO_Eigen3_AVAILABLE\n\n//== INCLUDES =================================================================\n\n#include <CoMISo/Config/CoMISoDefines.hh>\n#include \"SuperSparseMatrixT.hh\"\n\n\n#define EIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET\n#include <Eigen/Sparse>\n\n\n//== FORWARDDECLARATIONS ======================================================\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO { \n\n//== CLASS DEFINITION =========================================================\n\n\t      \n\n/** \\class NProblemGmmInterface NProblemGmmInterface.hh <ACG/.../NPRoblemGmmInterface.hh>\n\n    Brief Description.\n  \n    A more elaborate description follows.\n*/\nclass COMISODLLEXPORT NConstraintInterface\n{\npublic:\n  \n  // define Sparse Datatypes\n  typedef Eigen::SparseVector<double> SVectorNC;\n  typedef SuperSparseMatrixT<double>  SMatrixNC;\n\n  // different types of constraints\n  enum ConstraintType {NC_EQUAL, NC_LESS_EQUAL, NC_GREATER_EQUAL};\n\n  /// Default constructor\n  NConstraintInterface(const ConstraintType _type = NC_EQUAL) : type_(_type) {}\n \n  /// Destructor\n  virtual ~NConstraintInterface() {}\n\n  virtual int             n_unknowns      (                                      ) = 0;\n  virtual double          eval_constraint ( const double* _x                     ) = 0;\n  virtual void            eval_gradient   ( const double* _x, SVectorNC& _g      ) = 0;\n  virtual void            eval_hessian    ( const double* _x, SMatrixNC& _h      ) = 0;\n\n  virtual ConstraintType  constraint_type (                                      ) { return type_; }\n\n  virtual bool            is_satisfied    ( const double* _x, double _eps = 1e-6 )\n  {\n    switch( type_)\n    {\n      case NC_EQUAL        : return (fabs(eval_constraint(_x)) <=  _eps); break;\n      case NC_LESS_EQUAL   : return (     eval_constraint(_x)  <=  _eps); break;\n      case NC_GREATER_EQUAL: return (     eval_constraint(_x)  >= -_eps); break;\n    }\n    return false;\n  }\n\n  virtual bool   is_linear() { return false;}\n\n  virtual double gradient_update_factor( const double* _x, double _eps = 1e-6 )\n  {\n    double val = eval_constraint(_x);\n    bool   upper_bound_ok = ( val <=  _eps);\n    bool   lower_bound_ok = ( val >= -_eps);\n\n    if(upper_bound_ok)\n    {\n      if(lower_bound_ok || type_ == NC_LESS_EQUAL) return 0.0;\n      else                                         return 1.0;\n    }\n    else\n    {\n      if(lower_bound_ok && type_ == NC_GREATER_EQUAL) return  0.0;\n      else                                            return -1.0;\n    }\n  }\n\n\nprivate:\n  // constraint type\n  ConstraintType type_;\n};\n\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n#endif // COMISO_Eigen3_AVAILABLE\n//=============================================================================\n#endif // ACG_NCONSTRAINTINTERFACE_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/CoMISo/NSolver/NPDerivativeChecker.hh",
    "content": "//=============================================================================\n//\n//  CLASS NPDERIVATIVECHECKER\n//\n//=============================================================================\n\n\n#ifndef COMISO_NPDERIVATIVECHECKER_HH\n#define COMISO_NPDERIVATIVECHECKER_HH\n\n\n//== INCLUDES =================================================================\n\n#include \"NProblemGmmInterface.hh\"\n#include \"NProblemInterface.hh\"\n\n#include <iostream>\n#include <iomanip>\n#include <limits>\n#include <cmath>\n\n#include <CoMISo/Utils/StopWatch.hh>\n#include <gmm/gmm.h>\n\n#include <CoMISo/Config/CoMISoDefines.hh>\n\n//== FORWARDDECLARATIONS ======================================================\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== CLASS DEFINITION =========================================================\n\n\t      \n\n/** \\class NPDerivativeChecker\n\n    Brief Description.\n  \n    A more elaborate description follows.\n*/\nclass COMISODLLEXPORT NPDerivativeChecker\n{\npublic:\n\n  struct Config\n  {\n    Config() : x_min(-1.0), x_max(1.0), n_iters(1), dx(1e-5), eps(1e-3), relativeEps(std::numeric_limits<double>::quiet_NaN())\n    {}\n\n    double x_min;\n    double x_max;\n    int    n_iters;\n    double dx;\n    double eps;\n    double relativeEps;\n  };\n  \n  /// Default constructor\n  NPDerivativeChecker() {}\n\n  /// Destructor\n  ~NPDerivativeChecker() {}\n\n  template<class ProblemInterface>\n  bool check_all(ProblemInterface* _np, double _dx, double _eps)\n  {\n    conf_.dx = _dx;\n    conf_.eps = _eps;\n    return check_all(_np);\n  }\n\n  template<class ProblemInterface>\n  bool check_all(ProblemInterface* _np)\n  {\n    bool d1_ok = check_d1(_np);\n    bool d2_ok = check_d2(_np);\n\n    return ( d1_ok && d2_ok);\n  }\n\n  template<class ProblemInterface>\n  bool check_d1(ProblemInterface* _np)\n  {\n    int n_ok     = 0;\n    int n_errors = 0;\n\n\n    int n = _np->n_unknowns();\n    std::vector<double> x(n), g(n);\n\n    for(int i=0; i<conf_.n_iters; ++i)\n    {\n      // get random x\n      get_random_x(x, conf_.x_min, conf_.x_max);\n      // gradient\n      _np->eval_gradient(P(x), P(g));\n\n      for(int j=0; j<n; ++j)\n      {\n//        double fd = finite_difference(_np, x, j);\n        x[j] += conf_.dx;\n        double f1 = _np->eval_f(P(x));\n        x[j] -= 2.0*conf_.dx;\n        double f0 = _np->eval_f(P(x));\n        x[j] += conf_.dx;\n        double fd = (f1-f0)/(2.0*conf_.dx);\n\n        if ((!std::isnan(conf_.relativeEps) && fabs(fd-g[j]) > fmax(fabs(g[j]), 1.0) * conf_.relativeEps) || fabs(fd-g[j]) > conf_.eps)\n        {\n          ++ n_errors;\n          std::cerr << \"Gradient error in component \" << j << \": \" << g[j]\n                    << \" should be \" << fd << \" (\" << fabs(fd-g[j]) << \")\" << std::endl;\n        }\n        else ++ n_ok;\n      }\n    }\n\n    std::cerr << \"############## Gradient Checker Summary #############\\n\";\n    std::cerr << \"#ok   : \" << n_ok << std::endl;\n    std::cerr << \"#error: \" << n_errors << std::endl;\n\n    return (n_errors == 0);\n  }\n\n  template<class MatrixType>\n  inline double getCoeff(const MatrixType &m, int r, int c);\n\n  template<class ProblemInterface>\n  bool check_d2(ProblemInterface* _np)\n  {\n    int n_ok     = 0;\n    int n_errors = 0;\n\n    int n = _np->n_unknowns();\n    std::vector<double> x(n);\n    typename ProblemInterface::SMatrixNP H(n,n);\n\n    for(int i=0; i<conf_.n_iters; ++i)\n    {\n      // get random x\n      get_random_x(x, conf_.x_min, conf_.x_max);\n      // gradient\n      _np->eval_hessian(P(x), H);\n\n      for(int j=0; j<n; ++j)\n        for(int k=0; k<n; ++k)\n        {\n          x[j] += conf_.dx;\n          x[k] += conf_.dx;\n          double f0 = _np->eval_f(P(x));\n          x[j] -= 2.0*conf_.dx;\n          double f1 = _np->eval_f(P(x));\n          x[j] += 2.0*conf_.dx;\n          x[k] -= 2.0*conf_.dx;\n          double f2 = _np->eval_f(P(x));\n          x[j] -= 2.0*conf_.dx;\n          double f3 = _np->eval_f(P(x));\n\n          double fd = (f0-f1-f2+f3)/(4.0*conf_.dx*conf_.dx);\n\n\n          if ((!std::isnan(conf_.relativeEps) && fabs(fd-H.coeff(j,k)) > fmax(fabs(getCoeff(H, j,k)), 1.0) * conf_.relativeEps) || fabs(fd-getCoeff(H, j,k)) > conf_.eps)\n          {\n            ++ n_errors;\n            std::cerr << \"Hessian error in component \" << j << \",\" << k << \": \" << getCoeff(H, j,k)\n                      << \" should be (following FiniteDifferences) \" << fd\n                      << \" (absolute delta: \" << fabs(fd-getCoeff(H, j,k))\n                      << \", relative delta:\" << (fabs(fd-getCoeff(H, j,k))/fmax(fabs(getCoeff(H, j,k)), 1.0)) << \")\" << std::endl;\n          }\n          else ++ n_ok;\n        }\n    }\n\n    std::cerr << \"############## Hessian Checker Summary #############\\n\";\n    std::cerr << \"#ok   : \" << n_ok << std::endl;\n    std::cerr << \"#error: \" << n_errors << std::endl;\n\n    return (n_errors == 0);\n  }\n\n  Config& config() { return conf_; }\n\nprotected:\n  void get_random_x(std::vector<double>& _x, double _xmin, double _xmax)\n  {\n    // get random values in [-1,1]\n    gmm::fill_random(_x);\n    double range = _xmax - _xmin;\n    for(unsigned int i=0; i<_x.size(); ++i)\n      _x[i] = (((_x[i]+1.0)/2.0)*range + _xmin);\n  }\n\n  double* P(std::vector<double>& _v)\n  {\n    if( !_v.empty())\n      return ((double*)&_v[0]);\n    else\n      return 0;\n  }\n\nprivate:\n  Config conf_;\n};\n\ntemplate<>\ninline double NPDerivativeChecker::getCoeff(const NProblemInterface::SMatrixNP &m, int r, int c) {\n    return m.coeff(r, c);\n}\n\ntemplate<>\ninline double NPDerivativeChecker::getCoeff(const NProblemGmmInterface::SMatrixNP &m, int r, int c) {\n    return m(r, c);\n}\n\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n#endif // ACG_NPDERIVATIVECHECKER defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/CoMISo/NSolver/NPLinearConstraints.cc",
    "content": "//=============================================================================\n//\n//  CLASS NPLinearConstraints\n//\n//=============================================================================\n\n\n//== INCLUDES =================================================================\n\n#include \"NPLinearConstraints.hh\"\n#include \"NProblemGmmInterface.hh\"\n#include \"LinearConstraintHandlerElimination.hh\"\n#include \"LinearConstraintHandlerPenalty.hh\"\n//#include \"LinearConstraintHandlerLagrange.hh\"\n\n\n//== FORWARDDECLARATIONS ======================================================\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== CLASS DEFINITION =========================================================\n\n/// Default constructor having a pointer to the main problem\nNPLinearConstraintsElimination::NPLinearConstraintsElimination( NProblemGmmInterface* _np) : base_(_np), cache_initialized_(false)\n{\n  if( !base_) std::cerr << \"Warning: initialized NPLinearConstraints with zero pointer...\\n\";\n  this->initialize_identity(base_->n_unknowns());\n}\n\n/// Destructor\nNPLinearConstraintsElimination::~NPLinearConstraintsElimination() {}\n\n// NSolverInterface\nint NPLinearConstraintsElimination::n_unknowns   ()\n{ return this->n_reduced(); }\n\nvoid NPLinearConstraintsElimination::initial_x    ( double* _x )\n{\n  // transform initial x from parent NP\n  x_.resize(this->n());\n  base_->initial_x(P(x_));\n  this->transform_x(P(x_), _x);\n  cache_initialized_ = false;\n  update_x(_x);\n}\n\ndouble NPLinearConstraintsElimination::eval_f( const double* _x )\n{\n  update_x(_x);\n\n  return base_->eval_f(P(x_));\n}\n\nvoid   NPLinearConstraintsElimination::eval_gradient( const double* _x, double*    _g)\n{\n  update_x(_x);\n  vtemp_.resize(this->n());\n  base_->eval_gradient( P(x_), P(vtemp_));\n  this->transform_gradient( P(vtemp_), _g);\n}\n\nvoid   NPLinearConstraintsElimination::eval_hessian ( const double* _x, SMatrixNP& _H)\n{\n  update_x(_x);\n  SMatrixNP H;\n  base_->eval_hessian(P(x_), H);\n  this->transform_hessian(H,_H);\n}\n\nvoid   NPLinearConstraintsElimination::store_result ( const double* _x )\n{\n  update_x(_x);\n\n  base_->store_result( P(x_));\n}\n\nvoid NPLinearConstraintsElimination::update_x(const double* _xr)\n{\n  if(!cache_initialized_)\n  {\n    x_.resize(this->n());\n    xr_.resize(this->n_reduced());\n\n    if(!xr_.empty())\n      xr_[0] = _xr[0] + 1.0;\n    else\n    {\n      x_.resize(this->n());\n      this->inv_transform_x(xr_, x_);\n      cache_initialized_ = true;\n    }\n  }\n\n  for( int i=0; i<this->n_reduced(); ++i)\n    if( _xr[i] != xr_[i])\n    {\n      gmm::copy( VectorPT((double*)_xr, this->n_reduced()), this->xr_);\n      x_.resize(this->n());\n      this->inv_transform_x(xr_, x_);\n\n      cache_initialized_ = true;\n\n      //quit\n      return;\n    }\n}\n\n// convert vector into pointer\ndouble* NPLinearConstraintsElimination::P(const std::vector<double>& _v)\n{\n  if(_v.size())\n    return (double*) (&(_v[0]));\n  else\n    return 0;\n}\n\n\n//=============================================================================\n\n\n  /// Default constructor having a pointer to the main problem\nNPLinearConstraintsPenalty::NPLinearConstraintsPenalty( NProblemGmmInterface* _np) : base_(_np)\n{ if( !base_) std::cerr << \"Warning: initialized NPLinearConstraints with zero pointer...\\n\"; }\n\n  /// Destructor\nNPLinearConstraintsPenalty::~NPLinearConstraintsPenalty()\n{}\n\n// NSolverInterface\nint    NPLinearConstraintsPenalty::n_unknowns   ()\n{ return base_->n_unknowns(); }\n\nvoid   NPLinearConstraintsPenalty::initial_x    ( double* _x )\n{\n  base_->initial_x(_x);\n}\n\ndouble NPLinearConstraintsPenalty::eval_f( const double* _x )\n{\n  return this->add_penalty_f((double*)_x, base_->eval_f(_x));\n}\n\nvoid   NPLinearConstraintsPenalty::eval_gradient( const double* _x, double*    _g)\n{\n  base_->eval_gradient( _x, _g);\n  this->add_penalty_gradient((double*)_x, _g);\n}\n\nvoid   NPLinearConstraintsPenalty::eval_hessian ( const double* _x, SMatrixNP& _H)\n{\n  base_->eval_hessian(_x, _H);\n  this->add_penalty_hessian(_H);\n}\n\nvoid   NPLinearConstraintsPenalty::store_result ( const double* _x )\n{\n  base_->store_result( _x);\n}\n\n\n//=============================================================================\n} // namespace ACG\n//=============================================================================\n\n\n"
  },
  {
    "path": "libs/CoMISo/NSolver/NPLinearConstraints.hh",
    "content": "//=============================================================================\n//\n//  CLASS NPLinearConstraints\n//\n//=============================================================================\n\n\n#ifndef COMISO_NPLINEARCONSTRAINTS_HH\n#define COMISO_NPLINEARCONSTRAINTS_HH\n\n\n//== INCLUDES =================================================================\n\n#include <CoMISo/Config/CoMISoDefines.hh>\n#include <gmm/gmm.h>\n#include \"NProblemGmmInterface.hh\"\n#include \"LinearConstraintHandlerElimination.hh\"\n#include \"LinearConstraintHandlerPenalty.hh\"\n//#include \"LinearConstraintHandlerLagrange.hh\"\n\n\n//== FORWARDDECLARATIONS ======================================================\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== CLASS DEFINITION =========================================================\n\n\t      \n\n/** \\class NPLinearConstraints{ Elimination, Penalty, Lagrange}\nproviding different techniques to handle linear constraints within\nnon-linear optimization. All three techniques transfer the constraint\nproblem into an unconstrained one.\n*/\n\n\n// ConstraintHandler working with Elimination approach\nclass COMISODLLEXPORT NPLinearConstraintsElimination : public NProblemGmmInterface, public LinearConstraintHandlerElimination\n{\npublic:\n\n  // use c-arrays as vectors for gmm\n  typedef gmm::array1D_reference<double*> VectorPT;\n\n  /// Default constructor having a pointer to the main problem\n  NPLinearConstraintsElimination( NProblemGmmInterface* _np);\n \n  /// Destructor\n  ~NPLinearConstraintsElimination();\n\n  // initialize constraints\n  template<class MatrixT, class VectorT>\n  void initialize_constraints( const MatrixT& _C, const VectorT& _c);\n\n\n  // NSolverInterface\n  virtual int    n_unknowns   ();\n\n  virtual void   initial_x    ( double* _x );\n\n  virtual double eval_f( const double* _x );\n\n  virtual void   eval_gradient( const double* _x, double*    _g);\n\n  virtual void   eval_hessian ( const double* _x, SMatrixNP& _H);\n\n  virtual void   store_result ( const double* _x );\n\nprotected:\n\n  void update_x(const double* _xr);\n\n  // convert vector into pointer\n  double* P(const std::vector<double>& _v);\n\nprivate:\n  NProblemGmmInterface* base_;\n\n  bool cache_initialized_;\n\n  std::vector<double> x_;\n  std::vector<double> xr_;\n  std::vector<double> vtemp_;\n};\n\n\n//=============================================================================\n\n\n// ConstraintHandler working with Penalty\nclass COMISODLLEXPORT NPLinearConstraintsPenalty : public NProblemGmmInterface, public LinearConstraintHandlerPenalty\n{\npublic:\n\n  // use c-arrays as vectors for gmm\n  typedef gmm::array1D_reference<double*> VectorPT;\n\n  /// Default constructor having a pointer to the main problem\n  NPLinearConstraintsPenalty( NProblemGmmInterface* _np);\n\n  /// Destructor\n  ~NPLinearConstraintsPenalty();\n\n  // initialize constraints\n  template<class MatrixT, class VectorT>\n  void initialize_constraints( const MatrixT& _C, const VectorT& _c);\n\n  // NSolverInterface\n  virtual int    n_unknowns   ();\n\n  virtual void   initial_x    ( double* _x );\n\n  virtual double eval_f( const double* _x );\n\n  virtual void   eval_gradient( const double* _x, double*    _g);\n\n  virtual void   eval_hessian ( const double* _x, SMatrixNP& _H);\n\n  virtual void   store_result ( const double* _x );\n\nprivate:\n  NProblemGmmInterface* base_;\n};\n\n\n//=============================================================================\n} // namespace ACG\n//=============================================================================\n#if defined(INCLUDE_TEMPLATES) && !defined(COMISO_NSOLVERGMMINTERFACE_C)\n#define ACG_NSOLVERGMMINTERFACE_TEMPLATES\n#include \"NPLinearConstraintsT.cc\"\n#endif\n//=============================================================================\n#endif // COMISO_NSOLVERGMMINTERFACE_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/CoMISo/NSolver/NPLinearConstraintsT.cc",
    "content": "//=============================================================================\n//\n//  CLASS NPLinearConstraints\n//\n//=============================================================================\n\n#define COMISO_NSOLVERGMMINTERFACE_C\n\n//== INCLUDES =================================================================\n\n#include <CoMISo/Config/CoMISoDefines.hh>\n#include <gmm/gmm.h>\n#include \"NProblemGmmInterface.hh\"\n#include \"LinearConstraintHandlerElimination.hh\"\n#include \"LinearConstraintHandlerPenalty.hh\"\n//#include \"LinearConstraintHandlerLagrange.hh\"\n\n\n//== FORWARDDECLARATIONS ======================================================\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== CLASS DEFINITION =========================================================\n\n// initialize constraints\ntemplate<class MatrixT, class VectorT>\nvoid NPLinearConstraintsElimination::initialize_constraints( const MatrixT& _C, const VectorT& _c)\n{\n    initialize(_C, _c);\n    cache_initialized_ = false;\n}\n\n//=============================================================================\n\n// initialize constraints\ntemplate<class MatrixT, class VectorT>\nvoid NPLinearConstraintsPenalty::initialize_constraints( const MatrixT& _C, const VectorT& _c)\n{\n    initialize(_C, _c);\n}\n\n\n//=============================================================================\n} // namespace ACG\n//=============================================================================\n\n\n"
  },
  {
    "path": "libs/CoMISo/NSolver/NPTiming.cc",
    "content": "//=============================================================================\n//\n//  CLASS NPTiming\n//\n//=============================================================================\n\n\n//== INCLUDES =================================================================\n\n#include <iostream>\n#include <iomanip>\n\n#include \"NPTiming.hh\"\n\n//== FORWARDDECLARATIONS ======================================================\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== CLASS DEFINITION =========================================================\n\n/// Default constructor\nNPTiming::NPTiming(NProblemGmmInterface* _base) : base_(_base) {start_timing();}\n\n/// Destructor\nNPTiming::~NPTiming() {}\n\nint NPTiming::n_unknowns   ()\n{\n  return base_->n_unknowns();\n}\n\nvoid NPTiming::initial_x( double* _x )\n{\n  base_->initial_x(_x);\n}\n\ndouble NPTiming::eval_f( const double* _x )\n{\n  ++n_eval_f_;\n  sw_.start();\n  double f = base_->eval_f(_x);\n  timing_eval_f_ += sw_.stop();\n  return f;\n}\n\nvoid NPTiming::eval_gradient( const double* _x, double*    _g)\n{\n  ++n_eval_gradient_;\n  sw_.start();\n  base_->eval_gradient(_x, _g);\n  timing_eval_gradient_ += sw_.stop();\n}\n\nvoid NPTiming::eval_hessian ( const double* _x, SMatrixNP& _H)\n{\n  ++n_eval_hessian_;\n  sw_.start();\n  base_->eval_hessian(_x, _H);\n  timing_eval_hessian_ += sw_.stop();\n}\n\nvoid NPTiming::store_result ( const double* _x )\n{\n  base_->store_result(_x);\n  print_statistics();\n}\n\nvoid NPTiming::start_timing()\n{\n  swg_.start();\n\n  timing_eval_f_ = 0.0;\n  timing_eval_gradient_ = 0.0;\n  timing_eval_hessian_ = 0.0;\n\n  n_eval_f_ = 0;\n  n_eval_gradient_ = 0;\n  n_eval_hessian_ = 0;\n}\n\n\nvoid NPTiming::print_statistics()\n{\n  double time_total = swg_.stop();\n\n  double time_np = timing_eval_f_ + timing_eval_gradient_ + timing_eval_hessian_;\n\n\n\n  std::cerr << \"######## NP-Timings ########\" << std::endl;\n  std::cerr << \"total time    : \" << time_total/1000.0 << \"s\\n\";\n  std::cerr << \"total time NP : \" << time_np/1000.0 << \"s  (\" << time_np/time_total*100.0 << \" %)\\n\";\n\n  std::cerr << std::fixed << std::setprecision(5)\n  << \"eval_f time   : \" << timing_eval_f_/1000.0\n  << \"s  ( #evals: \" << n_eval_f_ << \" -> avg \"\n  << timing_eval_f_/(1000.0*double(n_eval_f_)) << \"s )\\n\"\n  << \"eval_grad time: \" << timing_eval_gradient_/1000.0\n  << \"s  ( #evals: \" << n_eval_gradient_ << \" -> avg \"\n  << timing_eval_gradient_/(1000.0*double(n_eval_gradient_)) << \"s )\\n\"\n  << \"eval_hess time: \" << timing_eval_hessian_/1000.0\n  << \"s  ( #evals: \" << n_eval_hessian_ << \" -> avg \"\n  << timing_eval_hessian_/(1000.0*double(n_eval_hessian_)) << \"s )\\n\";\n}\n\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n\n"
  },
  {
    "path": "libs/CoMISo/NSolver/NPTiming.hh",
    "content": "//=============================================================================\n//\n//  CLASS NPTiming\n//\n//=============================================================================\n\n\n#ifndef COMISO_NPTIMING_HH\n#define COMISO_NPTIMING_HH\n\n\n//== INCLUDES =================================================================\n\n#include <CoMISo/Utils/StopWatch.hh>\n#include <gmm/gmm.h>\n#include \"NProblemGmmInterface.hh\"\n#include <CoMISo/Config/CoMISoDefines.hh>\n\n//== FORWARDDECLARATIONS ======================================================\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== CLASS DEFINITION =========================================================\n\n\t      \n\n/** \\class NProblemGmmInterface NProblemGmmInterface.hh <ACG/.../NProblemGmmInterface.hh>\n\n    Brief Description.\n  \n    A more elaborate description follows.\n*/\nclass COMISODLLEXPORT NPTiming : public NProblemGmmInterface\n{\npublic:\n  \n  /// Default constructor\n  NPTiming(NProblemGmmInterface* _base);\n \n  /// Destructor\n  ~NPTiming();\n\n  virtual int    n_unknowns   ();\n\n  virtual void   initial_x( double* _x );\n\n  virtual double eval_f( const double* _x );\n\n  virtual void   eval_gradient( const double* _x, double*    _g);\n\n  virtual void   eval_hessian ( const double* _x, SMatrixNP& _H);\n\n  virtual void   store_result ( const double* _x );\n\n  void start_timing();\n\nprotected:\n\n  void print_statistics();\n\nprivate:\n  NProblemGmmInterface* base_;\n  StopWatch swg_;\n  StopWatch sw_;\n\n  // timings\n  double timing_eval_f_;\n  double timing_eval_gradient_;\n  double timing_eval_hessian_;\n\n  // number of function executions\n  int n_eval_f_;\n  int n_eval_gradient_;\n  int n_eval_hessian_;\n};\n\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n#endif // COMISO_NPTIMING_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/CoMISo/NSolver/NProblemGmmInterface.hh",
    "content": "//=============================================================================\n//\n//  CLASS NProblemGmmInterface\n//  **************** DEPRECATED -> Please use NProblemInterface ***************//\n//=============================================================================\n\n\n#ifndef COMISO_NPROBLEMGMMINTERFACE_HH\n#define COMISO_NPROBLEMGMMINTERFACE_HH\n\n\n//== INCLUDES =================================================================\n\n#include <gmm/gmm.h>\n\n#include <CoMISo/Config/CoMISoDefines.hh>\n\n//== FORWARDDECLARATIONS ======================================================\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== CLASS DEFINITION =========================================================\n\n\t      \n\n/** \\class NProblemGmmInterface NProblemGmmInterface.hh <ACG/.../NPRoblemGmmInterface.hh>\n\n    Brief Description.\n  \n    A more elaborate description follows.\n*/\n\n//  *** This class is DEPRECATED -> Please use NProblemInterface ***//\nclass COMISODLLEXPORT NProblemGmmInterface\n{\npublic:\n  \n  // ToDo: appropriate MatrixType ???\n  typedef gmm::row_matrix< gmm::wsvector<double> > SMatrixNP;\n\n  /// Default constructor\n  NProblemGmmInterface()\n  {std::cerr << \"Warning: NProblemGmmInterface is deprecated -> use NProblemInterface instead!!!\" << std::endl;}\n \n  /// Destructor\n  ~NProblemGmmInterface() {}\n\n  virtual int    n_unknowns   (                                ) = 0;\n  virtual void   initial_x    (       double* _x               ) = 0;\n  virtual double eval_f       ( const double* _x               ) = 0;\n  virtual void   eval_gradient( const double* _x, double*    _g) = 0;\n  virtual void   eval_hessian ( const double* _x, SMatrixNP& _H) = 0;\n  virtual void   store_result ( const double* _x               ) = 0;\n};\n\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n#endif // COMISO_NPROBLEMGMMINTERFACE_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/CoMISo/NSolver/NProblemInterface.cc",
    "content": "#include \"NProblemInterface.hh\"\n\nnamespace COMISO {\n\nNProblemInterface::NProblemInterface() {\n}\n\nNProblemInterface::~NProblemInterface() {\n}\n\n}\n"
  },
  {
    "path": "libs/CoMISo/NSolver/NProblemInterface.hh",
    "content": "//=============================================================================\n//\n//  CLASS NProblemGmmInterface\n//\n//=============================================================================\n\n\n#ifndef COMISO_NPROBLEMINTERFACE_HH\n#define COMISO_NPROBLEMINTERFACE_HH\n\n\n//== COMPILE-TIME PACKAGE REQUIREMENTS ========================================\n#include <CoMISo/Config/config.hh>\n#if COMISO_Eigen3_AVAILABLE\n\n//== INCLUDES =================================================================\n\n\n#include <Eigen/Eigen>\n#if !(EIGEN_VERSION_AT_LEAST(3,1,0))\n  #define EIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET\n#endif\n#include <Eigen/Sparse>\n\n#include <CoMISo/Config/CoMISoDefines.hh>\n\n//== FORWARDDECLARATIONS ======================================================\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== CLASS DEFINITION =========================================================\n\n\t      \n\n/** \\class NProblemGmmInterface NProblemGmmInterface.hh <ACG/.../NPRoblemGmmInterface.hh>\n\n    Brief Description.\n  \n    A more elaborate description follows.\n*/\nclass COMISODLLEXPORT NProblemInterface\n{\npublic:\n\n  // Sparse Matrix Type\n #if EIGEN_VERSION_AT_LEAST(3,1,0)  \n  typedef Eigen::SparseMatrix<double,Eigen::ColMajor> SMatrixNP;\n #else\n  typedef Eigen::DynamicSparseMatrix<double,Eigen::ColMajor> SMatrixNP;\n #endif\n  \n  /// Default constructor\n  NProblemInterface();\n \n  /// Destructor\n  virtual ~NProblemInterface();\n\n  // problem definition\n  virtual int    n_unknowns   (                                ) = 0;\n  virtual void   initial_x    (       double* _x               ) = 0;\n  virtual double eval_f       ( const double* _x               ) = 0;\n  virtual void   eval_gradient( const double* _x, double*    _g) = 0;\n  virtual void   eval_hessian ( const double* _x, SMatrixNP& _H) = 0;\n  virtual void   store_result ( const double* _x               ) = 0;\n\n  // advanced properties\n  virtual bool   constant_hessian() { return false; }\n\n};\n\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n#endif // COMISO_Eigen3_AVAILABLE\n//=============================================================================\n#endif // COMISO_NPROBLEMGMMINTERFACE_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/CoMISo/NSolver/NewtonSolver.cc",
    "content": "//=============================================================================\n//\n//  CLASS NewtonSolver - IMPLEMENTATION\n//\n//=============================================================================\n\n//== INCLUDES =================================================================\n\n#include \"NewtonSolver.hh\"\n#include <CoMISo/Solver/CholmodSolver.hh>\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== IMPLEMENTATION ========================================================== \n\n\n// solve\nint\nNewtonSolver::\nsolve(NProblemGmmInterface* _problem)\n{\n#if COMISO_SUITESPARSE_AVAILABLE  \n  \n  // get problem size\n  int n = _problem->n_unknowns();\n\n  // hesse matrix\n  NProblemGmmInterface::SMatrixNP H;\n  // gradient\n  std::vector<double> x(n), x_new(n), dx(n), g(n);\n\n  // get initial x, initial grad and initial f\n  _problem->initial_x(P(x));\n  double f = _problem->eval_f(P(x));\n\n  double reg = 1e-3;\n  COMISO::CholmodSolver chol;\n\n  for(int i=0; i<max_iter_; ++i)\n  {\n    _problem->eval_gradient(P(x), P(g));\n    // check for convergence\n    if( gmm::vect_norm2(g) < convergence_eps_)\n    {\n      std::cerr << \"Newton Solver converged after \"\n                << i << \" iterations\" << std::endl;\n      _problem->store_result(P(x));\n      return true;\n    }\n\n    // get current hessian\n    _problem->eval_hessian(P(x), H);\n\n    // regularize\n    double reg_comp = reg*gmm::mat_trace(H)/double(n);\n    for(int j=0; j<n; ++j)\n      H(j,j) += reg_comp;\n\n    // solve linear system\n    bool factorization_ok = false;\n    if(constant_hessian_structure_ && i != 0)\n      factorization_ok = chol.update_system_gmm(H);\n    else\n      factorization_ok = chol.calc_system_gmm(H);\n\n    bool improvement = false;\n    if(factorization_ok)\n      if(chol.solve( dx, g))\n      {\n        gmm::add(x, gmm::scaled(dx,-1.0),x_new);\n        double f_new = _problem->eval_f(P(x_new));\n\n        if( f_new < f)\n        {\n          // swap x and x_new (and f and f_new)\n          x_new.swap(x);\n          f = f_new;\n          improvement = true;\n\n          std::cerr << \"energy improved to \" << f << std::endl;\n        }\n      }\n\n    // adapt regularization\n    if(improvement)\n    {\n      if(reg > 1e-9)\n        reg *= 0.1;\n    }\n    else\n    {\n      if(reg < 1e4)\n        reg *= 10.0;\n      else\n      {\n        _problem->store_result(P(x));\n        std::cerr << \"Newton solver reached max regularization but did not converge ... \" << std::endl;\n        return false;\n      }\n    }\n  }\n  _problem->store_result(P(x));\n  std::cerr << \"Newton Solver did not converge!!! after \"\n            << max_iter_ << \" iterations.\" << std::endl;\n  return false;\n\n#else\n  std::cerr << \"Warning: NewtonSolver requires not-available CholmodSolver...\\n\";\n  return false;\n#endif\t    \n}\n\n\n//-----------------------------------------------------------------------------\n\n\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n"
  },
  {
    "path": "libs/CoMISo/NSolver/NewtonSolver.hh",
    "content": "//=============================================================================\n//\n//  CLASS NewtonSolver\n//\n//=============================================================================\n\n\n#ifndef COMISO_NEWTONSOLVER_HH\n#define COMISO_NEWTONSOLVER_HH\n\n//== COMPILE-TIME PACKAGE REQUIREMENTS ========================================\n#include <CoMISo/Config/config.hh>\n\n//== INCLUDES =================================================================\n\n#include <CoMISo/Config/CoMISoDefines.hh>\n#include <gmm/gmm.h>\n#include \"NProblemGmmInterface.hh\"\n\n//== FORWARDDECLARATIONS ======================================================\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== CLASS DEFINITION =========================================================\n\n\t      \n\n/** \\class NewtonSolver NewtonSolver.hh <ACG/.../NewtonSolver.hh>\n\n    Brief Description.\n  \n    A more elaborate description follows.\n*/\nclass COMISODLLEXPORT NewtonSolver\n{\npublic:\n   \n  /// Default constructor\n  NewtonSolver() : max_iter_(20), convergence_eps_(1e-6), constant_hessian_structure_(false) {}\n \n  /// Destructor\n  ~NewtonSolver() {}\n\n  // solve\n  int solve(NProblemGmmInterface* _problem);\n\n  // solve specifying parameters\n  int solve(NProblemGmmInterface* _problem, int _max_iter, double _eps)\n  {\n    max_iter_ = _max_iter;\n    convergence_eps_ = _eps;\n    return solve(_problem);\n  }\n\n  bool& constant_hessian_structure() { return constant_hessian_structure_; }\n\nprotected:\n  double* P(std::vector<double>& _v)\n  {\n    if( !_v.empty())\n      return ((double*)&_v[0]);\n    else\n      return 0;\n  }\n\nprivate:\n  int    max_iter_;\n  double convergence_eps_;\n  bool   constant_hessian_structure_;\n};\n\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n#endif // ACG_NEWTONSOLVER_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/CoMISo/NSolver/SuperSparseMatrixT.cc",
    "content": "//=============================================================================\n//\n//  CLASS SuperSparseMatrixT - IMPLEMENTATION\n//\n//=============================================================================\n\n#define COMISO_SUPERSPARSEMATRIXT_C\n\n//== INCLUDES =================================================================\n\n#include \"SuperSparseMatrixT.hh\"\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== IMPLEMENTATION ==========================================================\n\n\n\n//-----------------------------------------------------------------------------\n\n\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n"
  },
  {
    "path": "libs/CoMISo/NSolver/SuperSparseMatrixT.hh",
    "content": "//=============================================================================\n//\n//  CLASS SuperSparseMatrixT\n//\n//=============================================================================\n\n\n#ifndef COMISO_SUPERSPARSEMATRIXT_HH\n#define COMISO_SUPERSPARSEMATRIXT_HH\n\n\n//== INCLUDES =================================================================\n\n#include <iostream>\n#include <map>\n#include <math.h>\n\n//== FORWARDDECLARATIONS ======================================================\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== CLASS DEFINITION =========================================================\n\n\n\n\t      \n/** \\class SuperSparseMatrixT SuperSparseMatrixT.hh <COMISO/.../SuperSparseMatrixT.hh>\n\n    Brief Description.\n  \n    A more elaborate description follows.\n*/\n\ntemplate <class VType>\nclass SuperSparseMatrixT\n{\npublic:\n\n  // value type\n  typedef VType                                  VT;\n  typedef std::pair<unsigned int, unsigned int> PII;\n\n  // iterate over elements\n  class iterator\n  {\n  public:\n\n    // default constructor\n    iterator() {}\n    // copy constructor\n    iterator(const iterator& _it) { m_it_ = _it.m_it_; }\n    // map iterator constructor\n    iterator(const typename std::map<PII,VType>::iterator& _m_it) { m_it_ = _m_it; }\n\n    // get reference to data\n    VT& operator*() { return m_it_->second; }\n\n    // get row and col of value\n    unsigned int row() {return m_it_->first.first; }\n    unsigned int col() {return m_it_->first.second; }\n\n    // post-increment\n    iterator& operator++()    { ++m_it_; return(*this);}\n    iterator  operator++(int) { return iterator(++m_it_); }\n\n    bool operator== (const iterator& _it) { return (m_it_ == _it.m_it_);}\n    bool operator!= (const iterator& _it) { return (m_it_ != _it.m_it_);}\n\n    // get raw iterator of map\n    typename std::map<PII,VType>::iterator& map_iterator() {return m_it_;}\n\n  private:\n    typename std::map<PII,VType>::iterator m_it_;\n  };\n\n  /// Constructor\n  SuperSparseMatrixT(const int _n_rows = 0, const int _n_cols = 0)\n  : n_rows_(_n_rows), n_cols_(_n_cols)\n  {}\n \n  /// Destructor\n  ~SuperSparseMatrixT() {}\n\n  // iterate over non-zeros\n  iterator begin() { return iterator(data_.begin()); }\n  iterator end()   { return iterator(data_.end());   }\n  // erase element\n  void     erase( iterator _it) { data_.erase(_it.map_iterator()); }\n\n  // element access\n  VT& operator()(const unsigned int _i, const unsigned int _j)\n  {  return data_[PII(_i,_j)]; }\n\n  // const element access\n  const VT& operator()(const unsigned int _i, const unsigned int _j) const\n  {  return data_[PII(_i,_j)]; }\n\n  // get number of stored elements\n  unsigned int nonZeros() { return data_.size(); }\n\n  // get dimensions\n  unsigned int rows() const { return n_rows_;}\n  unsigned int cols() const { return n_cols_;}\n\n\n  // resize matrix -> delete invalid elements\n  void resize(const unsigned int _n_rows, const unsigned int _n_cols)\n  {\n    n_rows_ = _n_rows;\n    n_cols_ = _n_cols;\n\n    // delete out of range elements\n    typename std::map<PII, VT>::iterator m_it = data_.begin();\n    for(; m_it != data_.end();)\n    {\n      if(m_it->first.first >=n_rows_ || m_it->first.second >= n_cols_)\n        data_.erase(m_it++);\n      else\n        ++m_it;\n    }\n  }\n\n  // clear data\n  void clear()\n  { data_.clear(); }\n\n\n  // removes all values whose absolut value is smaller than _eps\n  void prune(const VT _eps)\n  {\n    typename std::map<PII, VT>::iterator m_it = data_.begin();\n    for(; m_it != data_.end();)\n    {\n      if(fabs(m_it->second) < _eps)\n        data_.erase(m_it++);\n      else\n        ++m_it;\n    }\n  }\n\n  void print()\n  {\n    iterator it  = begin();\n    iterator ite = end();\n\n    std::cerr << \"######## SuperSparseMatrix ########\" << std::endl;\n    std::cerr << \"dimension : \" << rows()   << \" x \" << cols() << std::endl;\n    std::cerr << \"#non-zeros: \" << nonZeros() << std::endl;\n    for(; it!=ite; ++it)\n      std::cerr << \"(\" << it.row() << \",\" << it.col() << \") -> \" << *it << std::endl;\n  }\n\n  \nprivate:\n\n  // dimension of matrix\n  unsigned int n_rows_;\n  unsigned int n_cols_;\n  \n  typename std::map<PII, VT> data_;\n};\n\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n#if defined(INCLUDE_TEMPLATES) && !defined(COMISO_SUPERSPARSEMATRIXT_C)\n#define COMISO_SUPERSPARSEMATRIXT_TEMPLATES\n#include \"SuperSparseMatrixT.cc\"\n#endif\n//=============================================================================\n#endif // COMISO_SUPERSPARSEMATRIXT_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/CoMISo/NSolver/TAOSolver.cc",
    "content": "//=============================================================================\n//\n//  CLASS TAOSolver - IMPLEMENTATION\n//\n//=============================================================================\n\n//== COMPILE-TIME PACKAGE REQUIREMENTS ========================================\n#include <CoMISo/Config/config.hh>\n#if COMISO_TAO_AVAILABLE\n\n\n//== INCLUDES =================================================================\n\n#include \"TAOSolver.hh\"\n\n//#include <dlfcn.h>\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== IMPLEMENTATION ========================================================== \n\n// static member initialization\nbool TAOSolver::initialized_ = false;\n\n\n//-----------------------------------------------------------------------------\n//-----------------------------------------------------------------------------\n// interface of TAO was changed from version 1 to 2 !!!\n#if (TAO_VERSION_MAJOR < 2)\n\nint\nTAOSolver::\nsolve( NProblemGmmInterface* _base)\n{\n  // // initialize (only once)\n  // initialize();\n\n  // std::cerr << \"tao 1\\n\";\n  // //  MPI_Init(0,0);\n  // char *libm=\"libmpi.so\";\n  // dlopen(libm,RTLD_GLOBAL);\n\n  if(!initialized_)\n  {\n    /* Initialize TAO,PETSc */\n    // non command line arguments necessary ...\n    std::cerr << \"Initialize MPI/Petsc/TAO \";\n    static char  help[] =\"help\\n\";\n    int argc = 0;\n    char **argv;\n    //    MPI_Init(&argc, &argv);\n    PetscInitialize( &argc, &argv,(char *)0,help );\n    TaoInitialize  ( &argc, &argv,(char *)0,help );\n\n    initialized_ = true;\n    std::cerr << \" done!!!\\n\";\n  }\n\n  /* used to check for functions returning nonzeros */\n  int             info;\n\n  // check for single processor\n  int size;\n  MPI_Comm_size(MPI_COMM_WORLD,&size);\n  if (size >1) {\n    PetscPrintf(PETSC_COMM_SELF,\"TAOSolver is intended for single processor use!\\n\");\n    SETERRQ(1,\"Incorrect number of processors\");\n  }\n\n  /* Create TAO solver and set desired solution method  */\n  //  TaoMethod       method=\"tao_cg\";  /* minimization method */\n  TaoMethod       method=\"tao_ntr\";  /* minimization method */\n  //  TaoMethod       method=\"tao_nm\";  /* minimization method */\n  TAO_SOLVER      tao;               /* TAO_SOLVER solver context */\n  TAO_APPLICATION testapp;        /* The PETSc application */\n\n  info = TaoCreate(PETSC_COMM_SELF,method,&tao); CHKERRQ(info);\n  info = TaoApplicationCreate(PETSC_COMM_SELF,&testapp); CHKERRQ(info);\n\n  // initalize vector\n  int n = _base->n_unknowns();\n  Vec x;\n  info = VecCreateSeq(PETSC_COMM_SELF, n, &x); CHKERRQ(info);\n  PetscScalar* X;\n  info = VecGetArray(x,&X); CHKERRQ(info);\n  _base->initial_x(X);\n  info = VecRestoreArray(x,&X); CHKERRQ(info);\n\n  // initialize matrix\n /* Create a matrix data structure to store the Hessian.  This structure will be used by TAO */\n  Mat H;\n  // ToDo: get nonzero_pattern\n  //  int nnz[1]; nnz[0] = 1;\n  //  info = MatCreateSeqAIJ(PETSC_COMM_SELF,n,n,0,nnz,&H);        /* PETSc routine */\n  info = MatCreateSeqAIJ(PETSC_COMM_SELF,n,n,0,0,&H);        /* PETSc routine */\n  info = MatSetOption(H,MAT_SYMMETRIC,PETSC_TRUE); CHKERRQ(info); /* PETSc flag    */\n  info = TaoAppSetHessianMat(testapp,H,H); CHKERRQ(info); /* A TAO routine */\n\n  // initialize solution vector\n  info = TaoAppSetInitialSolutionVec(testapp,x); CHKERRQ(info);\n\n  /* Provide TAO routines for function evaluation */\n  info = TaoAppSetObjectiveRoutine(testapp, objective, (void*) _base); CHKERRQ(info);\n  info = TaoAppSetGradientRoutine (testapp, gradient , (void*) _base); CHKERRQ(info);\n  info = TaoAppSetHessianRoutine  (testapp, hessian  , (void*) _base); CHKERRQ(info);\n\n  /* SOLVE THE APPLICATION */\n  info = TaoSolveApplication(testapp,tao); CHKERRQ(info);\n\n  /* Get information on termination */\n  TaoTerminateReason reason;\n  info = TaoGetTerminationReason(tao,&reason); CHKERRQ(info);\n  if (reason <= 0)\n    std::cerr << \"Warning: TAO-Solver did not converge!!!\\n\";\n  else\n    std::cerr << \"TAO-Solver converged!!!\\n\";\n\n  // To View TAO solver information use\n  info = TaoView(tao); CHKERRQ(info);\n\n  // if successfull get and store result\n  //  if( reason)\n  {\n    info = TaoAppGetSolutionVec(testapp, &x);\n    info = VecGetArray(x,&X); CHKERRQ(info);\n    _base->store_result( X);\n    info = VecRestoreArray(x,&X); CHKERRQ(info);\n  }\n  //  VecView(x, PETSC_VIEWER_STDOUT_WORLD);\n\n  // /* Free TAO data structures */\n  info = TaoDestroy(tao); CHKERRQ(info);\n  info = TaoAppDestroy(testapp); CHKERRQ(info);\n\n  return reason;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nint\nTAOSolver::\nsolve( NProblemInterface* _base)\n{\n  // // initialize (only once)\n  // initialize();\n\n  // std::cerr << \"tao 1\\n\";\n  // //  MPI_Init(0,0);\n  // char *libm=\"libmpi.so\";\n  // dlopen(libm,RTLD_GLOBAL);\n\n  if(!initialized_)\n  {\n    /* Initialize TAO,PETSc */\n    // non command line arguments necessary ...\n    std::cerr << \"Initialize MPI/Petsc/TAO \";\n    static char  help[] =\"help\\n\";\n    int argc = 0;\n    char **argv;\n    //    MPI_Init(&argc, &argv);\n    PetscInitialize( &argc, &argv,(char *)0,help );\n    TaoInitialize  ( &argc, &argv,(char *)0,help );\n\n    initialized_ = true;\n    std::cerr << \" done!!!\\n\";\n  }\n\n  /* used to check for functions returning nonzeros */\n  int             info;\n\n  // check for single processor\n  int size;\n  MPI_Comm_size(MPI_COMM_WORLD,&size);\n  if (size >1) {\n    PetscPrintf(PETSC_COMM_SELF,\"TAOSolver is intended for single processor use!\\n\");\n    SETERRQ(1,\"Incorrect number of processors\");\n  }\n\n  /* Create TAO solver and set desired solution method  */\n  //  TaoMethod       method=\"tao_cg\";  /* minimization method */\n  TaoMethod       method=\"tao_ntr\";  /* minimization method */\n  //  TaoMethod       method=\"tao_nm\";  /* minimization method */\n  TAO_SOLVER      tao;               /* TAO_SOLVER solver context */\n  TAO_APPLICATION testapp;        /* The PETSc application */\n\n  info = TaoCreate(PETSC_COMM_SELF,method,&tao); CHKERRQ(info);\n  info = TaoApplicationCreate(PETSC_COMM_SELF,&testapp); CHKERRQ(info);\n\n  // initalize vector\n  int n = _base->n_unknowns();\n  Vec x;\n  info = VecCreateSeq(PETSC_COMM_SELF, n, &x); CHKERRQ(info);\n  PetscScalar* X;\n  info = VecGetArray(x,&X); CHKERRQ(info);\n  _base->initial_x(X);\n  info = VecRestoreArray(x,&X); CHKERRQ(info);\n\n  // initialize matrix\n /* Create a matrix data structure to store the Hessian.  This structure will be used by TAO */\n  Mat H;\n  // ToDo: get nonzero_pattern\n  //  int nnz[1]; nnz[0] = 1;\n  //  info = MatCreateSeqAIJ(PETSC_COMM_SELF,n,n,0,nnz,&H);        /* PETSc routine */\n  info = MatCreateSeqAIJ(PETSC_COMM_SELF,n,n,0,0,&H);        /* PETSc routine */\n  info = MatSetOption(H,MAT_SYMMETRIC,PETSC_TRUE); CHKERRQ(info); /* PETSc flag    */\n  info = TaoAppSetHessianMat(testapp,H,H); CHKERRQ(info); /* A TAO routine */\n\n  // initialize solution vector\n  info = TaoAppSetInitialSolutionVec(testapp,x); CHKERRQ(info);\n\n  /* Provide TAO routines for function evaluation */\n  info = TaoAppSetObjectiveRoutine(testapp, objective2, (void*) _base); CHKERRQ(info);\n  info = TaoAppSetGradientRoutine (testapp, gradient2 , (void*) _base); CHKERRQ(info);\n  info = TaoAppSetHessianRoutine  (testapp, hessian2  , (void*) _base); CHKERRQ(info);\n\n  /* SOLVE THE APPLICATION */\n  info = TaoSolveApplication(testapp,tao); CHKERRQ(info);\n\n  /* Get information on termination */\n  TaoTerminateReason reason;\n  info = TaoGetTerminationReason(tao,&reason); CHKERRQ(info);\n  if (reason <= 0)\n    std::cerr << \"Warning: TAO-Solver did not converge!!!\\n\";\n  else\n    std::cerr << \"TAO-Solver converged!!!\\n\";\n\n  // To View TAO solver information use\n  info = TaoView(tao); CHKERRQ(info);\n\n  // if successfull get and store result\n  //  if( reason)\n  {\n    info = TaoAppGetSolutionVec(testapp, &x);\n    info = VecGetArray(x,&X); CHKERRQ(info);\n    _base->store_result( X);\n    info = VecRestoreArray(x,&X); CHKERRQ(info);\n  }\n  //  VecView(x, PETSC_VIEWER_STDOUT_WORLD);\n\n  // /* Free TAO data structures */\n  info = TaoDestroy(tao); CHKERRQ(info);\n  info = TaoAppDestroy(testapp); CHKERRQ(info);\n\n  return reason;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nint\nTAOSolver::\nobjective( TAO_APPLICATION _app, Vec _x, double* _result, void* _base)\n{\n  NProblemGmmInterface* base = (NProblemGmmInterface*) _base;\n\n  PetscScalar *x;\n\n  /* Get pointers to vector data */\n  int info = VecGetArray(_x,&x); CHKERRQ(info);\n\n  // evaluate function\n  (*_result) = base->eval_f(x);\n\n  /* Restore vectors */\n  info = VecRestoreArray(_x,&x); CHKERRQ(info);\n\n  return 0;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nint\nTAOSolver::\ngradient(TAO_APPLICATION _app, Vec _x, Vec _g, void* _base)\n{\n  NProblemGmmInterface* base = (NProblemGmmInterface*) _base;\n\n  PetscScalar *x, *g;\n  int info;\n\n  /* Get pointers to vector data */\n  info = VecGetArray(_x,&x); CHKERRQ(info);\n  info = VecGetArray(_g,&g); CHKERRQ(info);\n\n  // compute gradient\n  base->eval_gradient( x, g);\n\n  /* Restore vectors */\n  info = VecRestoreArray(_x,&x); CHKERRQ(info);\n  info = VecRestoreArray(_g,&g); CHKERRQ(info);\n\n  return 0;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nint\nTAOSolver::\nhessian(TAO_APPLICATION _app, Vec _x, Mat* _H, Mat* _H_pre, MatStructure* _H_struct, void* _base)\n{\n  NProblemGmmInterface* base = (NProblemGmmInterface*) _base;\n\n  PetscScalar *x;\n\n  /* Get pointers to vector data */\n  int info = VecGetArray(_x,&x); CHKERRQ(info);\n\n  /* Initialize matrix entries to zero */\n  info = MatZeroEntries(*_H);  CHKERRQ(info);\n\n  // iterate over non-zero elements\n  NProblemGmmInterface::SMatrixNP H;\n  base->eval_hessian( x, H);\n\n  for (unsigned int i = 0; i < gmm::mat_nrows(H); ++i)\n  {\n    typedef gmm::linalg_traits<NProblemGmmInterface::SMatrixNP>::const_sub_row_type\n      CRow;\n    CRow row = gmm::mat_const_row(H, i);\n\n    gmm::linalg_traits<CRow>::const_iterator it  = gmm::vect_const_begin(row);\n    gmm::linalg_traits<CRow>::const_iterator ite = gmm::vect_const_end(row);\n\n    int m = 1;\n    int n = 1;\n    int idxm[1]; idxm[0] = i;\n    int idxn[1];\n    PetscScalar values[1];\n    for(; it != ite; ++it)\n    {\n      idxn[0] = it.index();\n      values[0] = *it;\n      info = MatSetValues(*_H, m, idxm, n, idxn, values, INSERT_VALUES);\n    }\n  }\n\n  /* Assemble the matrix */\n  info = MatAssemblyBegin(*_H,MAT_FINAL_ASSEMBLY); CHKERRQ(info);\n  info = MatAssemblyEnd(*_H,MAT_FINAL_ASSEMBLY); CHKERRQ(info);\n\n  *_H_struct = SAME_NONZERO_PATTERN;\n\n  /* Restore vectors */\n  info = VecRestoreArray(_x,&x); CHKERRQ(info);\n\n  return 0;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nint\nTAOSolver::\nobjective2( TAO_APPLICATION _app, Vec _x, double* _result, void* _base)\n{\n  NProblemInterface* base = (NProblemInterface*) _base;\n\n  PetscScalar *x;\n\n  /* Get pointers to vector data */\n  int info = VecGetArray(_x,&x); CHKERRQ(info);\n\n  // evaluate function\n  (*_result) = base->eval_f(x);\n\n  /* Restore vectors */\n  info = VecRestoreArray(_x,&x); CHKERRQ(info);\n\n  return 0;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nint\nTAOSolver::\ngradient2(TAO_APPLICATION _app, Vec _x, Vec _g, void* _base)\n{\n  NProblemInterface* base = (NProblemInterface*) _base;\n\n  PetscScalar *x, *g;\n  int info;\n\n  /* Get pointers to vector data */\n  info = VecGetArray(_x,&x); CHKERRQ(info);\n  info = VecGetArray(_g,&g); CHKERRQ(info);\n\n  // compute gradient\n  base->eval_gradient( x, g);\n\n  /* Restore vectors */\n  info = VecRestoreArray(_x,&x); CHKERRQ(info);\n  info = VecRestoreArray(_g,&g); CHKERRQ(info);\n\n  return 0;\n}\n\n//-----------------------------------------------------------------------------\n\n\nint\nTAOSolver::\nhessian2(TAO_APPLICATION _app, Vec _x, Mat* _H, Mat* _H_pre, MatStructure* _H_struct, void* _base)\n{\n  NProblemInterface* base = (NProblemInterface*) _base;\n\n  PetscScalar *x;\n\n  /* Get pointers to vector data */\n  int info = VecGetArray(_x,&x); CHKERRQ(info);\n\n  /* Initialize matrix entries to zero */\n  info = MatZeroEntries(*_H);  CHKERRQ(info);\n\n  // iterate over non-zero elements\n  NProblemInterface::SMatrixNP H;\n  base->eval_hessian( x, H);\n\n  for(int i=0; i<H.outerSize(); ++i)\n    {\n      int m = 1;\n      int n = 1;\n      int idxm[1]; idxm[0] = i;\n      int idxn[1];\n      PetscScalar values[1];\n\n      for (NProblemInterface::SMatrixNP::InnerIterator it(H,i); it; ++it)\n        {\n          idxm[0] = it.row();\n          idxn[0] = it.col();\n          values[0] = it.value();\n          info = MatSetValues(*_H, m, idxm, n, idxn, values, INSERT_VALUES);\n        }\n    }\n\n  /* Assemble the matrix */\n  info = MatAssemblyBegin(*_H,MAT_FINAL_ASSEMBLY); CHKERRQ(info);\n  info = MatAssemblyEnd(*_H,MAT_FINAL_ASSEMBLY); CHKERRQ(info);\n\n  *_H_struct = SAME_NONZERO_PATTERN;\n\n  /* Restore vectors */\n  info = VecRestoreArray(_x,&x); CHKERRQ(info);\n\n  return 0;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid\nTAOSolver::\ninitialize()\n{\n  if(!initialized_)\n  {\n    /* Initialize TAO,PETSc */\n    // non command line arguments necessary ...\n    std::cerr << \"Initialize MPI/Petsc/TAO \";\n    static char  help[] =\"help\\n\";\n    static int argc = 0;\n    static char **argv;\n    //    MPI_Init(&argc, &argv);\n    PetscInitialize( &argc, &argv,(char *)0,help );\n    TaoInitialize  ( &argc, &argv,(char *)0,help );\n\n    initialized_ = true;\n    std::cerr << \" done!!!\\n\";\n  }\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid\nTAOSolver::\ncleanup()\n{\n  /* Finalize TAO */\n  TaoFinalize();\n  PetscFinalize();\n}\n\n//-----------------------------------------------------------------------------\n//-----------------------------------------------------------------------------\n#else // (TAO_VERSION_MAJOR < 2)\n//-----------------------------------------------------------------------------\n//-----------------------------------------------------------------------------\n\n\nint\nTAOSolver::\nsolve( NProblemGmmInterface* _base)\n{\n  // // initialize (only once)\n  // initialize();\n\n  // std::cerr << \"tao 1\\n\";\n  // //  MPI_Init(0,0); \n  // char *libm=\"libmpi.so\"; \n  // dlopen(libm,RTLD_GLOBAL);\n\n  if(!initialized_)\n  {\n    /* Initialize TAO,PETSc */\n    // non command line arguments necessary ...\n    std::cerr << \"Initialize MPI/Petsc/TAO \";\n    static char  help[] =\"help\\n\";\n    int argc = 0;\n    char **argv;\n    //    MPI_Init(&argc, &argv);\n    PetscInitialize( &argc, &argv,(char *)0,help );\n    TaoInitialize  ( &argc, &argv,(char *)0,help );\n    \n    initialized_ = true;\n    std::cerr << \" done!!!\\n\";\n  }\n\n  /* used to check for functions returning nonzeros */\n  int             info;\n\n  // check for single processor\n  int size;\n  MPI_Comm_size(MPI_COMM_WORLD,&size);\n  if (size >1) {\n    PetscPrintf(PETSC_COMM_SELF,\"TAOSolver is intended for single processor use!\\n\");\n    SETERRQ(PETSC_COMM_SELF,1,\"Incorrect number of processors\");\n  }\n\n  /* Create TAO solver with desired solution method */\n  TaoSolver  tao;                   /* TaoSolver solver context */\n  TaoCreate(PETSC_COMM_SELF,&tao);\n  TaoSetType(tao,\"tao_ntr\");\n\n  /* Create TAO solver and set desired solution method  */\n  //  TaoMethod       method=\"tao_cg\";  /* minimization method */\n  //  TaoMethod       method=\"tao_ntr\";  /* minimization method */\n  //  TaoMethod       method=\"tao_nm\";  /* minimization method */\n  //  TAO_SOLVER      tao;               /* TAO_SOLVER solver context */\n  //  TAO_APPLICATION testapp;        /* The PETSc application */\n\n  //  info = TaoCreate(PETSC_COMM_SELF,method,&tao); CHKERRQ(info);\n  //  info = TaoApplicationCreate(PETSC_COMM_SELF,&testapp); CHKERRQ(info);\n\n  // initalize vector\n  int n = _base->n_unknowns();\n  Vec x;\n  info = VecCreateSeq(PETSC_COMM_SELF, n, &x); CHKERRQ(info);\n  PetscScalar* X;\n  info = VecGetArray(x,&X); CHKERRQ(info);\n  _base->initial_x(X);\n  info = VecRestoreArray(x,&X); CHKERRQ(info);\n\n  // initialize matrix\n /* Create a matrix data structure to store the Hessian.  This structure will be used by TAO */\n  Mat H;\n  // ToDo: get nonzero_pattern\n  //  int nnz[1]; nnz[0] = 1;\n  //  info = MatCreateSeqAIJ(PETSC_COMM_SELF,n,n,0,nnz,&H);        /* PETSc routine */\n  info = MatCreateSeqAIJ(PETSC_COMM_SELF,n,n,0,0,&H);        /* PETSc routine */\n  info = MatSetOption(H,MAT_SYMMETRIC,PETSC_TRUE); CHKERRQ(info); /* PETSc flag    */\n  //info = TaoAppSetHessianMat(testapp,H,H); CHKERRQ(info); /* A TAO routine */\n\n  // initialize solution vector\n  //  info = TaoAppSetInitialSolutionVec(testapp,x); CHKERRQ(info);\n  TaoSetInitialVector(tao,x);\n\n  /* Provide TAO routines for function evaluation */\n  TaoSetObjectiveRoutine(tao, objective, (void*) _base);\n  TaoSetGradientRoutine (tao, gradient , (void*) _base);\n  TaoSetHessianRoutine  (tao, H, H, hessian , (void*) _base);\n\n  /* SOLVE */\n  TaoSolve(tao);\n\n  /* Get information on termination */\n  TaoSolverTerminationReason reason;\n  TaoGetTerminationReason(tao,&reason);\n  if (reason <= 0)\n    std::cerr << \"Warning: TAO-Solver did not converge!!!\\n\";\n  else\n    std::cerr << \"TAO-Solver converged!!!\\n\";\n\n  // To View TAO solver information use\n  info = TaoView(tao,\tPETSC_VIEWER_STDOUT_SELF); CHKERRQ(info);\n\n  // if successfull get and store result\n  //  if( reason)\n  {\n    TaoGetSolutionVector(tao, &x);\n    info = VecGetArray(x,&X); CHKERRQ(info);\n    _base->store_result( X);\n    info = VecRestoreArray(x,&X); CHKERRQ(info);\n  }\n  //  VecView(x, PETSC_VIEWER_STDOUT_WORLD);\n\n  // /* Free TAO data structures */\n  TaoDestroy(&tao);\n\n  /* Free PETSc data structures */\n  VecDestroy(&x);\n  MatDestroy(&H);\n\n  TaoFinalize();\n\n  return reason;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nint\nTAOSolver::\nsolve( NProblemInterface* _base)\n{\n  // // initialize (only once)\n  // initialize();\n\n  // std::cerr << \"tao 1\\n\";\n  // //  MPI_Init(0,0);\n  // char *libm=\"libmpi.so\";\n  // dlopen(libm,RTLD_GLOBAL);\n\n  if(!initialized_)\n  {\n    /* Initialize TAO,PETSc */\n    // non command line arguments necessary ...\n    std::cerr << \"Initialize MPI/Petsc/TAO \";\n    static char  help[] =\"help\\n\";\n    int argc = 0;\n    char **argv;\n    //    MPI_Init(&argc, &argv);\n    PetscInitialize( &argc, &argv,(char *)0,help );\n    TaoInitialize  ( &argc, &argv,(char *)0,help );\n\n    initialized_ = true;\n    std::cerr << \" done!!!\\n\";\n  }\n\n  /* used to check for functions returning nonzeros */\n  int             info;\n\n  // check for single processor\n  int size;\n  MPI_Comm_size(MPI_COMM_WORLD,&size);\n  if (size >1) {\n    PetscPrintf(PETSC_COMM_SELF,\"TAOSolver is intended for single processor use!\\n\");\n    SETERRQ(PETSC_COMM_SELF,1,\"Incorrect number of processors\");\n  }\n\n  /* Create TAO solver with desired solution method */\n  TaoSolver  tao;                   /* TaoSolver solver context */\n  TaoCreate(PETSC_COMM_SELF,&tao);\n  TaoSetType(tao,\"tao_ntr\");\n\n  /* Create TAO solver and set desired solution method  */\n  //  TaoMethod       method=\"tao_cg\";  /* minimization method */\n  //  TaoMethod       method=\"tao_ntr\";  /* minimization method */\n  //  TaoMethod       method=\"tao_nm\";  /* minimization method */\n  //  TAO_SOLVER      tao;               /* TAO_SOLVER solver context */\n  //  TAO_APPLICATION testapp;        /* The PETSc application */\n\n  //  info = TaoCreate(PETSC_COMM_SELF,method,&tao); CHKERRQ(info);\n  //  info = TaoApplicationCreate(PETSC_COMM_SELF,&testapp); CHKERRQ(info);\n\n  // initalize vector\n  int n = _base->n_unknowns();\n  Vec x;\n  info = VecCreateSeq(PETSC_COMM_SELF, n, &x); CHKERRQ(info);\n  PetscScalar* X;\n  info = VecGetArray(x,&X); CHKERRQ(info);\n  _base->initial_x(X);\n  info = VecRestoreArray(x,&X); CHKERRQ(info);\n\n  // initialize matrix\n /* Create a matrix data structure to store the Hessian.  This structure will be used by TAO */\n  Mat H;\n  // ToDo: get nonzero_pattern\n  //  int nnz[1]; nnz[0] = 1;\n  //  info = MatCreateSeqAIJ(PETSC_COMM_SELF,n,n,0,nnz,&H);        /* PETSc routine */\n  info = MatCreateSeqAIJ(PETSC_COMM_SELF,n,n,0,0,&H);        /* PETSc routine */\n  info = MatSetOption(H,MAT_SYMMETRIC,PETSC_TRUE); CHKERRQ(info); /* PETSc flag    */\n  //info = TaoAppSetHessianMat(testapp,H,H); CHKERRQ(info); /* A TAO routine */\n\n  // initialize solution vector\n  //  info = TaoAppSetInitialSolutionVec(testapp,x); CHKERRQ(info);\n  TaoSetInitialVector(tao,x);\n\n  /* Provide TAO routines for function evaluation */\n  TaoSetObjectiveRoutine(tao, objective2, (void*) _base);\n  TaoSetGradientRoutine (tao, gradient2 , (void*) _base);\n  TaoSetHessianRoutine  (tao, H, H, hessian2 , (void*) _base);\n\n  /* SOLVE */\n  TaoSolve(tao);\n\n  /* Get information on termination */\n  TaoSolverTerminationReason reason;\n  TaoGetTerminationReason(tao,&reason);\n  if (reason <= 0)\n    std::cerr << \"Warning: TAO-Solver did not converge!!!\\n\";\n  else\n    std::cerr << \"TAO-Solver converged!!!\\n\";\n\n  // To View TAO solver information use\n  info = TaoView(tao,   PETSC_VIEWER_STDOUT_SELF); CHKERRQ(info);\n\n  // if successfull get and store result\n  //  if( reason)\n  {\n    TaoGetSolutionVector(tao, &x);\n    info = VecGetArray(x,&X); CHKERRQ(info);\n    _base->store_result( X);\n    info = VecRestoreArray(x,&X); CHKERRQ(info);\n  }\n  //  VecView(x, PETSC_VIEWER_STDOUT_WORLD);\n\n  // /* Free TAO data structures */\n  TaoDestroy(&tao);\n\n  /* Free PETSc data structures */\n  VecDestroy(&x);\n  MatDestroy(&H);\n\n  TaoFinalize();\n\n  return reason;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nint\nTAOSolver::\nobjective( TaoSolver _tao, Vec _x, double* _result, void* _base)\n{\n  NProblemGmmInterface* base = (NProblemGmmInterface*) _base;\n  \n  PetscScalar *x;\n\n  /* Get pointers to vector data */\n  int info = VecGetArray(_x,&x); CHKERRQ(info);\n\n  // evaluate function\n  (*_result) = base->eval_f(x);\n\n  /* Restore vectors */\n  info = VecRestoreArray(_x,&x); CHKERRQ(info);\n\n  return 0;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nint\nTAOSolver::\ngradient(TaoSolver _tao, Vec _x, Vec _g, void* _base)\n{\n  NProblemGmmInterface* base = (NProblemGmmInterface*) _base;\n\n  PetscScalar *x, *g;\n  int info;\n\n  /* Get pointers to vector data */\n  info = VecGetArray(_x,&x); CHKERRQ(info);\n  info = VecGetArray(_g,&g); CHKERRQ(info);\n\n  // compute gradient\n  base->eval_gradient( x, g);\n\n  /* Restore vectors */\n  info = VecRestoreArray(_x,&x); CHKERRQ(info);\n  info = VecRestoreArray(_g,&g); CHKERRQ(info);\n\n  return 0;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nint\nTAOSolver::\nhessian(TaoSolver _tao, Vec _x, Mat* _H, Mat* _H_pre, MatStructure* _H_struct, void* _base)\n{\n  NProblemGmmInterface* base = (NProblemGmmInterface*) _base;\n\n  PetscScalar *x;\n\n  /* Get pointers to vector data */\n  int info = VecGetArray(_x,&x); CHKERRQ(info);\n\n  /* Initialize matrix entries to zero */\n  info = MatZeroEntries(*_H);  CHKERRQ(info);\n\n  // iterate over non-zero elements\n  NProblemGmmInterface::SMatrixNP H;\n  base->eval_hessian( x, H);\n\n  for (unsigned int i = 0; i < gmm::mat_nrows(H); ++i) \n  {\n    typedef gmm::linalg_traits<NProblemGmmInterface::SMatrixNP>::const_sub_row_type\n      CRow;\n    CRow row = gmm::mat_const_row(H, i);\n\n    gmm::linalg_traits<CRow>::const_iterator it  = gmm::vect_const_begin(row);\n    gmm::linalg_traits<CRow>::const_iterator ite = gmm::vect_const_end(row);\n    \n    int m = 1;\n    int n = 1;\n    int idxm[1]; idxm[0] = i;\n    int idxn[1]; \n    PetscScalar values[1]; \n    for(; it != ite; ++it)\n    {\n      idxn[0] = it.index();\n      values[0] = *it;\n      info = MatSetValues(*_H, m, idxm, n, idxn, values, INSERT_VALUES);\n    }\n  }\n\n  /* Assemble the matrix */\n  info = MatAssemblyBegin(*_H,MAT_FINAL_ASSEMBLY); CHKERRQ(info);\n  info = MatAssemblyEnd(*_H,MAT_FINAL_ASSEMBLY); CHKERRQ(info);\n\n  *_H_struct = SAME_NONZERO_PATTERN;\n\n  /* Restore vectors */\n  info = VecRestoreArray(_x,&x); CHKERRQ(info);\n\n  return 0;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nint\nTAOSolver::\nobjective2( TaoSolver _tao, Vec _x, double* _result, void* _base)\n{\n  NProblemInterface* base = (NProblemInterface*) _base;\n\n  PetscScalar *x;\n\n  /* Get pointers to vector data */\n  int info = VecGetArray(_x,&x); CHKERRQ(info);\n\n  // evaluate function\n  (*_result) = base->eval_f(x);\n\n  /* Restore vectors */\n  info = VecRestoreArray(_x,&x); CHKERRQ(info);\n\n  return 0;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nint\nTAOSolver::\ngradient2(TaoSolver _tao, Vec _x, Vec _g, void* _base)\n{\n  NProblemInterface* base = (NProblemInterface*) _base;\n\n  PetscScalar *x, *g;\n  int info;\n\n  /* Get pointers to vector data */\n  info = VecGetArray(_x,&x); CHKERRQ(info);\n  info = VecGetArray(_g,&g); CHKERRQ(info);\n\n  // compute gradient\n  base->eval_gradient( x, g);\n\n  /* Restore vectors */\n  info = VecRestoreArray(_x,&x); CHKERRQ(info);\n  info = VecRestoreArray(_g,&g); CHKERRQ(info);\n\n  return 0;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nint\nTAOSolver::\nhessian2(TaoSolver _tao, Vec _x, Mat* _H, Mat* _H_pre, MatStructure* _H_struct, void* _base)\n{\n  NProblemInterface* base = (NProblemInterface*) _base;\n\n  PetscScalar *x;\n\n  /* Get pointers to vector data */\n  int info = VecGetArray(_x,&x); CHKERRQ(info);\n\n  /* Initialize matrix entries to zero */\n  info = MatZeroEntries(*_H);  CHKERRQ(info);\n\n  // iterate over non-zero elements\n  NProblemInterface::SMatrixNP H;\n  base->eval_hessian( x, H);\n\n  for(int i=0; i<H.outerSize(); ++i)\n    {\n      int m = 1;\n      int n = 1;\n      int idxm[1]; idxm[0] = i;\n      int idxn[1];\n      PetscScalar values[1];\n\n      for (NProblemInterface::SMatrixNP::InnerIterator it(H,i); it; ++it)\n        {\n          idxm[0] = it.row();\n          idxn[0] = it.col();\n          values[0] = it.value();\n          info = MatSetValues(*_H, m, idxm, n, idxn, values, INSERT_VALUES);\n        }\n    }\n\n  /* Assemble the matrix */\n  info = MatAssemblyBegin(*_H,MAT_FINAL_ASSEMBLY); CHKERRQ(info);\n  info = MatAssemblyEnd(*_H,MAT_FINAL_ASSEMBLY); CHKERRQ(info);\n\n  *_H_struct = SAME_NONZERO_PATTERN;\n\n  /* Restore vectors */\n  info = VecRestoreArray(_x,&x); CHKERRQ(info);\n\n  return 0;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid\nTAOSolver::\ninitialize()\n{\n  if(!initialized_)\n  {\n    /* Initialize TAO,PETSc */\n    // non command line arguments necessary ...\n    std::cerr << \"Initialize MPI/Petsc/TAO \";\n    static char  help[] =\"help\\n\";\n    static int argc = 0;\n    static char **argv;\n    //    MPI_Init(&argc, &argv);\n    PetscInitialize( &argc, &argv,(char *)0,help );\n    TaoInitialize  ( &argc, &argv,(char *)0,help );\n    \n    initialized_ = true;\n    std::cerr << \" done!!!\\n\";\n  }\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid\nTAOSolver::\ncleanup()\n{\n  /* Finalize TAO */\n  TaoFinalize();\n  PetscFinalize();\n}\n\n\n\n#endif\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n#endif // COMISO_TAO_AVAILABLE\n\n"
  },
  {
    "path": "libs/CoMISo/NSolver/TAOSolver.hh",
    "content": "//=============================================================================\n//\n//  CLASS TAOSolver\n//\n//=============================================================================\n\n\n#ifndef COMISO_TAOSOLVER_HH\n#define COMISO_TAOSOLVER_HH\n\n//== COMPILE-TIME PACKAGE REQUIREMENTS ========================================\n#include <CoMISo/Config/config.hh>\n#if COMISO_TAO_AVAILABLE\n\n//== INCLUDES =================================================================\n\n#include <CoMISo/Config/CoMISoDefines.hh>\n#include \"NProblemGmmInterface.hh\"\n#include \"NProblemInterface.hh\"\n\n#include <mpi.h>\n#include <tao.h>\n#include <gmm/gmm.h>\n\n\n//== FORWARDDECLARATIONS ======================================================\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== CLASS DEFINITION =========================================================\n\n\t      \n\n/** \\class TAOSolver TAOSolver.hh <ACG/.../TAOSolver.hh>\n\n    Brief Description.\n  \n    A more elaborate description follows.\n*/\nclass COMISODLLEXPORT TAOSolver\n{\npublic:\n   \n  /// Default constructor\n  TAOSolver() {}\n\n\n  /// Destructor\n  ~TAOSolver() {}\n\n  // solve problem\n  static int solve( NProblemInterface*    _base);\n  static int solve( NProblemGmmInterface* _base);\n\n\nprivate:\n\n  static void initialize();\n\n  // ToDo: cleanup has to be started automatically\n  static void cleanup();\n\n#if (TAO_VERSION_MAJOR < 2)\n  // declar TAO function prototypes\n  static int objective(TAO_APPLICATION,Vec,double*,void*);\n  static int gradient (TAO_APPLICATION,Vec,Vec    ,void*);\n  static int hessian  (TAO_APPLICATION,Vec,Mat*,Mat*,MatStructure*,void*);\n\n  static int objective2(TAO_APPLICATION,Vec,double*,void*);\n  static int gradient2 (TAO_APPLICATION,Vec,Vec    ,void*);\n  static int hessian2  (TAO_APPLICATION,Vec,Mat*,Mat*,MatStructure*,void*);\n#else\n  static PetscErrorCode objective(TaoSolver,Vec,double*,void*);\n  static PetscErrorCode gradient (TaoSolver,Vec,Vec    ,void*);\n  static PetscErrorCode hessian  (TaoSolver,Vec,Mat*,Mat*,MatStructure*,void*);\n\n  static PetscErrorCode objective2(TaoSolver,Vec,double*,void*);\n  static PetscErrorCode gradient2 (TaoSolver,Vec,Vec    ,void*);\n  static PetscErrorCode hessian2  (TaoSolver,Vec,Mat*,Mat*,MatStructure*,void*);\n#endif\n\nprivate:\n  // initialized?\n  static bool initialized_;\n};\n\n\n//=============================================================================\n} // namespace COMISO\n\n//=============================================================================\n#endif // COMISO_TAO_AVAILABLE\n//=============================================================================\n#endif // ACG_TAOSOLVER_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/CoMISo/NSolver/TestInterface.hh",
    "content": "//=============================================================================\n//\n//  CLASS BaseTaoGmmInterface\n//\n//=============================================================================\n\n\n#ifndef COMISO_TESTINTERFACE_HH\n#define COMISO_TESTINTERFACE_HH\n\n\n//== INCLUDES =================================================================\n\n#include \"NProblemGmmInterface.hh\"\n#include <gmm/gmm.h>\n\n#include <CoMISo/Config/CoMISoDefines.hh>\n\n//== FORWARDDECLARATIONS ======================================================\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== CLASS DEFINITION =========================================================\n\n\t      \n\n/** \\class BaseTaoGmmInterface BaseTaoGmmInterface.hh <ACG/.../BaseTaoGmmInterface.hh>\n\n    Brief Description.\n  \n    A more elaborate description follows.\n*/\n\nclass COMISODLLEXPORT TestInterface : public NProblemGmmInterface\n{\npublic:\n  \n  /// Default constructor\n  TestInterface() {}\n \n  /// Destructor\n  ~TestInterface() {}\n\n  // minimize (x-2.4)^2\n\n  virtual int    n_unknowns  (                              )\n  { \n    return 1; \n  }\n\n  virtual void   initial_x        (       double* _x             )\n  {\n    _x[0] = 100;\n  }\n\n  virtual double eval_f       ( const double* _x             )\n  {\n    return (_x[0]-2.4)*(_x[0]-2.4);\n  }\n\n  virtual void   eval_gradient( const double* _x, double*  _g)\n  {\n    _g[0] = 2.0*(_x[0]-2.4);\n  }\n\n  virtual void   eval_hessian( const double* _x, SMatrixNP& _H)\n  {\n    gmm::resize(_H,1,1);\n    _H(0,0) = 2.0;\n  }\n\n  virtual void   store_result     ( const double* _x             )\n  {\n    std::cerr << \"result: \" << _x[0] << std::endl;\n  }\n};\n\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n#endif // COMISO_TESTINTERFACE_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/CoMISo/NSolver/VariableType.hh",
    "content": "//=============================================================================\n//\n//  ENUM VariableType\n//\n//=============================================================================\n\n\n#ifndef COMISO_VARIABLETYPE_HH\n#define COMISO_VARIABLETYPE_HH\n\n\n//== INCLUDES =================================================================\n\n#include <CoMISo/Config/CoMISoDefines.hh>\n\n\n//== FORWARDDECLARATIONS ======================================================\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO { \n\n//== CLASS DEFINITION =========================================================\n\nenum VariableType { Real, Integer, Binary};\n\ntypedef std::pair<unsigned int, VariableType> PairIndexVtype;\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n#endif // COMISO_VARIABLETYPE_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/CoMISo/QtWidgets/MISolverDialogUI.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               CoMISo                                      *\n *      Copyright (C) 2008-2009 by Computer Graphics Group, RWTH Aachen      *\n *                           www.rwth-graphics.de                            *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of CoMISo.                                             *\n *                                                                           *\n *  CoMISo 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 *  CoMISo 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 CoMISo.  If not, see <http://www.gnu.org/licenses/>.          *\n *                                                                           *\n\\*===========================================================================*/ \n\n\n\n//=============================================================================\n//\n//  CLASS MISolverDialog - IMPLEMENTATION\n//\n//=============================================================================\n\n//== INCLUDES =================================================================\n\n#include <CoMISo/Config/config.hh>\n\n//== BUILD-TIME DEPENDENCIES =================================================================\n#if(COMISO_QT4_AVAILABLE)\n//============================================================================================\n\n\n#include \"MISolverDialogUI.hh\"\n\n#include <QtGui>\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== IMPLEMENTATION ========================================================== \n\n\n//-----------------------------------------------------------------------------\n\n\nvoid \nMISolverDialog::\nget_parameters()\n{\n//     QDoubleSpinBox *localErrorDSB;\n//     QSpinBox *localItersSB;\n//     QDoubleSpinBox *cgErrorDSB;\n//     QSpinBox *cgItersSB;\n//     QDoubleSpinBox *taucsErrorDSB;\n//     QCheckBox *finalTaucsCB;\n//     QCheckBox *initialTaucsCB;\n//     QSpinBox *infoSB;\n//     QCheckBox *directRoundingCB;\n\n  initialFullCB     ->setChecked( misolver_.get_inital_full());\n  iterFullCB        ->setChecked( misolver_.get_iter_full());\n  finalFullCB       ->setChecked( misolver_.get_final_full());\n  directRoundingCB  ->setChecked( misolver_.get_direct_rounding());\n  noRoundingCB      ->setChecked( misolver_.get_no_rounding());\n  multipleRoundingCB->setChecked( misolver_.get_multiple_rounding());\n  gurobiRoundingCB  ->setChecked( misolver_.get_gurobi_rounding());\n  cplexRoundingCB   ->setChecked( misolver_.get_cplex_rounding());\n\n  localItersSB ->setValue( misolver_.get_local_iters());\n  localErrorDSB->setValue( log(misolver_.get_local_error())/log(10.0f));\n\n  cgItersSB ->setValue( misolver_.get_cg_iters());\n  cgErrorDSB->setValue( log(misolver_.get_cg_error())/log(10.0f));\n  gurobiMaxTimeDSB->setValue(misolver_.get_gurobi_max_time());\n  \n  multipleRoundingDSB->setValue( misolver_.get_multiple_rounding_threshold());\n\n  infoSB->setValue( misolver_.get_noise());\n  solverStatsCheckBox->setChecked( misolver_.get_stats( ));\n\n  use_reordering_cb->setChecked( misolver_.use_constraint_reordering() );\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid \nMISolverDialog::\nset_parameters()\n{\n  misolver_.set_inital_full   ( initialFullCB  ->isChecked() );\n  misolver_.set_iter_full     ( iterFullCB     ->isChecked() );\n  misolver_.set_final_full    ( finalFullCB    ->isChecked() );\n  misolver_.set_direct_rounding( directRoundingCB->isChecked());\n  misolver_.set_no_rounding( noRoundingCB->isChecked());\n  misolver_.set_multiple_rounding( multipleRoundingCB->isChecked());\n  misolver_.set_gurobi_rounding( gurobiRoundingCB->isChecked());\n  misolver_.set_cplex_rounding ( cplexRoundingCB->isChecked());\n\n  misolver_.set_local_iters( localItersSB ->value());\n  misolver_.set_local_error( pow(10, localErrorDSB->value()));\n\n  misolver_.set_cg_iters( cgItersSB ->value());\n  misolver_.set_cg_error( pow(10, cgErrorDSB->value()));\n\n  misolver_.set_gurobi_max_time(gurobiMaxTimeDSB->value());\n\n  misolver_.set_multiple_rounding_threshold( multipleRoundingDSB->value());\n\n  misolver_.set_noise( infoSB->value());\n  misolver_.set_stats( solverStatsCheckBox->isChecked());\n\n  misolver_.use_constraint_reordering() = use_reordering_cb->isChecked();\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid \nMISolverDialog::\nslotOkButton()\n{\n  set_parameters();\n  close();\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid\nMISolverDialog::\nslotCancelButton()\n{\n  close();\n}\n\n\n\n//=============================================================================\n} // namespace COMISO\n//== BUILD-TIME DEPENDENCIES ==================================================\n#endif\n//=============================================================================\n"
  },
  {
    "path": "libs/CoMISo/QtWidgets/MISolverDialogUI.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               CoMISo                                      *\n *      Copyright (C) 2008-2009 by Computer Graphics Group, RWTH Aachen      *\n *                           www.rwth-graphics.de                            *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of CoMISo.                                             *\n *                                                                           *\n *  CoMISo 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 *  CoMISo 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 CoMISo.  If not, see <http://www.gnu.org/licenses/>.          *\n *                                                                           *\n\\*===========================================================================*/ \n\n\n//=============================================================================\n//\n//  CLASS MiSolverDialog\n//\n//=============================================================================\n\n\n#ifndef COMISO_MISOLVERDIALOG_HH\n#define COMISO_MISOLVERDIALOG_HH\n\n\n#include <CoMISo/Config/config.hh>\n\n//== BUILD-TIME DEPENDENCIES =================================================================\n#if(COMISO_QT4_AVAILABLE)\n//============================================================================================\n\n//== INCLUDES =================================================================\n\n#include \"ui_QtMISolverDialogBaseUI.hh\"\n\n// ACGMake users have to include\n// #include \"QtMISolverDialogBase.hh\"\n\n\n#include <Solver/MISolver.hh>\n\n//== FORWARDDECLARATIONS ======================================================\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO\n{\n\n//== CLASS DEFINITION =========================================================\n\n\n\n/** \\class MISolverDialog MISolverDialog.hh <COMISO/.../MISolverDialog.hh>\n\n    Brief Description.\n\n    A more elaborate description follows.\n*/\nclass MISolverDialog\n         : public QDialog, public Ui::QtMISolverDialogBaseUI\n{\n   Q_OBJECT\npublic:\n\n   /// Default constructor\n   MISolverDialog( MISolver&   _misolver,\n                   QWidget*    _parent = 0 ):\n         QDialog( _parent ),\n         Ui::QtMISolverDialogBaseUI(),\n         misolver_( _misolver )\n   {\n      setupUi( this );\n      get_parameters();\n\n      connect( okPB, SIGNAL( clicked() ),     this, SLOT( slotOkButton() ) );\n      connect( cancelPB, SIGNAL( clicked() ), this, SLOT( slotCancelButton() ) );\n   }\n\n   /// Destructor\n   ~MISolverDialog() {}\n\n   void get_parameters();\n   void set_parameters();\n\n\npublic slots:\n   virtual void slotOkButton();\n   virtual void slotCancelButton();\n\nprivate:\n\n   MISolver& misolver_;\n};\n\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n#endif // COMISO_MISOLVERDIALOG_HH defined\n//=============================================================================\n\n#endif\n"
  },
  {
    "path": "libs/CoMISo/QtWidgets/QtMISolverDialogBaseUI.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>QtMISolverDialogBaseUI</class>\n <widget class=\"QDialog\" name=\"QtMISolverDialogBaseUI\">\n  <property name=\"windowModality\">\n   <enum>Qt::ApplicationModal</enum>\n  </property>\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>385</width>\n    <height>273</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Dialog</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <layout class=\"QGridLayout\" name=\"gridLayout\">\n     <item row=\"8\" column=\"1\">\n      <widget class=\"QCheckBox\" name=\"cplexRoundingCB\">\n       <property name=\"text\">\n        <string>use cplex</string>\n       </property>\n      </widget>\n     </item>\n     <item row=\"0\" column=\"1\">\n      <widget class=\"QLabel\" name=\"label_4\">\n       <property name=\"text\">\n        <string>Max Error (1e-x)</string>\n       </property>\n      </widget>\n     </item>\n     <item row=\"0\" column=\"2\">\n      <widget class=\"QLabel\" name=\"label_6\">\n       <property name=\"text\">\n        <string>Iterations</string>\n       </property>\n      </widget>\n     </item>\n     <item row=\"1\" column=\"0\">\n      <widget class=\"QLabel\" name=\"label_5\">\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Fixed\" vsizetype=\"Fixed\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"text\">\n        <string>Local</string>\n       </property>\n      </widget>\n     </item>\n     <item row=\"1\" column=\"1\">\n      <widget class=\"QDoubleSpinBox\" name=\"localErrorDSB\">\n       <property name=\"decimals\">\n        <number>2</number>\n       </property>\n       <property name=\"minimum\">\n        <double>-1000000000.000000000000000</double>\n       </property>\n       <property name=\"maximum\">\n        <double>1000000000.000000000000000</double>\n       </property>\n       <property name=\"value\">\n        <double>6.000000000000000</double>\n       </property>\n      </widget>\n     </item>\n     <item row=\"1\" column=\"2\">\n      <widget class=\"QSpinBox\" name=\"localItersSB\">\n       <property name=\"maximum\">\n        <number>1000000000</number>\n       </property>\n       <property name=\"value\">\n        <number>10000</number>\n       </property>\n      </widget>\n     </item>\n     <item row=\"2\" column=\"0\">\n      <widget class=\"QLabel\" name=\"label_3\">\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Fixed\" vsizetype=\"Fixed\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"text\">\n        <string>CG</string>\n       </property>\n      </widget>\n     </item>\n     <item row=\"2\" column=\"1\">\n      <widget class=\"QDoubleSpinBox\" name=\"cgErrorDSB\">\n       <property name=\"decimals\">\n        <number>2</number>\n       </property>\n       <property name=\"minimum\">\n        <double>-1000000000.000000000000000</double>\n       </property>\n       <property name=\"maximum\">\n        <double>1000000000.000000000000000</double>\n       </property>\n       <property name=\"value\">\n        <double>6.000000000000000</double>\n       </property>\n      </widget>\n     </item>\n     <item row=\"2\" column=\"2\">\n      <widget class=\"QSpinBox\" name=\"cgItersSB\">\n       <property name=\"maximum\">\n        <number>1000000000</number>\n       </property>\n       <property name=\"value\">\n        <number>20</number>\n       </property>\n      </widget>\n     </item>\n     <item row=\"3\" column=\"0\">\n      <widget class=\"QLabel\" name=\"label_7\">\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Fixed\" vsizetype=\"Fixed\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"text\">\n        <string>Full</string>\n       </property>\n      </widget>\n     </item>\n     <item row=\"3\" column=\"1\" colspan=\"2\">\n      <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n       <item>\n        <widget class=\"QCheckBox\" name=\"initialFullCB\">\n         <property name=\"text\">\n          <string>initial</string>\n         </property>\n         <property name=\"checked\">\n          <bool>true</bool>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QCheckBox\" name=\"iterFullCB\">\n         <property name=\"text\">\n          <string>iter not converged</string>\n         </property>\n         <property name=\"checked\">\n          <bool>true</bool>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QCheckBox\" name=\"finalFullCB\">\n         <property name=\"text\">\n          <string>final</string>\n         </property>\n         <property name=\"checked\">\n          <bool>true</bool>\n         </property>\n         <property name=\"tristate\">\n          <bool>false</bool>\n         </property>\n        </widget>\n       </item>\n      </layout>\n     </item>\n     <item row=\"4\" column=\"0\">\n      <widget class=\"QLabel\" name=\"label_2\">\n       <property name=\"text\">\n        <string>Rounding</string>\n       </property>\n      </widget>\n     </item>\n     <item row=\"4\" column=\"1\" colspan=\"2\">\n      <layout class=\"QHBoxLayout\" name=\"horizontalLayout_3\">\n       <item>\n        <widget class=\"QCheckBox\" name=\"directRoundingCB\">\n         <property name=\"text\">\n          <string>direct</string>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QCheckBox\" name=\"noRoundingCB\">\n         <property name=\"text\">\n          <string>no</string>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QCheckBox\" name=\"multipleRoundingCB\">\n         <property name=\"text\">\n          <string>multiple</string>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QDoubleSpinBox\" name=\"multipleRoundingDSB\">\n         <property name=\"decimals\">\n          <number>2</number>\n         </property>\n         <property name=\"minimum\">\n          <double>0.000000000000000</double>\n         </property>\n         <property name=\"maximum\">\n          <double>0.500000000000000</double>\n         </property>\n         <property name=\"value\">\n          <double>0.500000000000000</double>\n         </property>\n        </widget>\n       </item>\n      </layout>\n     </item>\n     <item row=\"5\" column=\"0\">\n      <widget class=\"QLabel\" name=\"label\">\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Fixed\" vsizetype=\"Fixed\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"text\">\n        <string>Info Level</string>\n       </property>\n      </widget>\n     </item>\n     <item row=\"5\" column=\"1\" colspan=\"2\">\n      <layout class=\"QHBoxLayout\" name=\"horizontalLayout_4\">\n       <item>\n        <widget class=\"QSpinBox\" name=\"infoSB\"/>\n       </item>\n       <item>\n        <widget class=\"QCheckBox\" name=\"solverStatsCheckBox\">\n         <property name=\"text\">\n          <string>Output solver statistics</string>\n         </property>\n        </widget>\n       </item>\n      </layout>\n     </item>\n     <item row=\"6\" column=\"0\">\n      <widget class=\"QLabel\" name=\"label_8\">\n       <property name=\"text\">\n        <string>Constraints</string>\n       </property>\n      </widget>\n     </item>\n     <item row=\"6\" column=\"1\">\n      <widget class=\"QCheckBox\" name=\"use_reordering_cb\">\n       <property name=\"text\">\n        <string>reordering</string>\n       </property>\n       <property name=\"checked\">\n        <bool>true</bool>\n       </property>\n      </widget>\n     </item>\n     <item row=\"7\" column=\"0\">\n      <widget class=\"QLabel\" name=\"label_9\">\n       <property name=\"text\">\n        <string>GUROBI</string>\n       </property>\n      </widget>\n     </item>\n     <item row=\"7\" column=\"1\">\n      <widget class=\"QCheckBox\" name=\"gurobiRoundingCB\">\n       <property name=\"text\">\n        <string>use gurobi</string>\n       </property>\n      </widget>\n     </item>\n     <item row=\"7\" column=\"2\">\n      <widget class=\"QDoubleSpinBox\" name=\"gurobiMaxTimeDSB\">\n       <property name=\"maximum\">\n        <double>999999999.000000000000000</double>\n       </property>\n       <property name=\"value\">\n        <double>60.000000000000000</double>\n       </property>\n      </widget>\n     </item>\n     <item row=\"7\" column=\"3\">\n      <widget class=\"QLabel\" name=\"label_10\">\n       <property name=\"text\">\n        <string>s</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n     <item>\n      <widget class=\"QPushButton\" name=\"okPB\">\n       <property name=\"text\">\n        <string>Ok</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"cancelPB\">\n       <property name=\"text\">\n        <string>Cancel</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <spacer name=\"verticalSpacer\">\n     <property name=\"orientation\">\n      <enum>Qt::Vertical</enum>\n     </property>\n     <property name=\"sizeHint\" stdset=\"0\">\n      <size>\n       <width>20</width>\n       <height>14</height>\n      </size>\n     </property>\n    </spacer>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "libs/CoMISo/README.txt",
    "content": "CoMISo Version 1.0 rc1\nwww.rwth-graphics.de\nzimmer@informatik.rwth-aachen.de\nbommes@informatik.rwth-aachen.de\n\nUpdate! Version 1.1\n-------------------\nFor the CoMISo to work only Eigen3 and GMM++ are needed.\n\nWhat is\n-------\nThis is a short readme file to get you started with the Constrained Mixed-Integer Solver (CoMISo). It shortly overviews the system prerequisites and explains how to build the package. See the examples and the HarmonicExample OpenFlipper plugin for usage examples and ideas.\n\nRequirements\n------------\nHere is an example of what packages were needed to compile CoMISo on a freshly installed Ubuntu 9.04 system\n# sudo apt-get install g++\n# sudo apt-get install cmake\n# sudo apt-get install libgmm-dev\n# sudo apt-get install libboost-dev\n# sudo apt-get install libblas-dev\n# sudo apt-get install libsuitesparse-dev \n(some other needed libraries such as lapack, are installed as dependencies of the above)\n\nFor Windows and Macintosh systems the corresponding packages need to be downloaded and installed.\n\nThe cmake build system should enable building the CoMISo library under Windows and Macintosh systems, please let me know if this is (not) the case!\n\nOpenFlipper requirements:\n-------------------------\nTo build OpenFlipper you additionally need to install all the Qt4 packages libqt4-{dev-dbg, dev, network, gui, opengl, opengl-dev, script, scripttools, ...} and also \n# sudo apt-get install libglew1.5-dev\n# sudo apt-get install glutg3-dev\n\nBuilding (Stand alone)\n----------------------\nAssuming CoMISo was unpacked to the directory SOME_DIRECTORY/CoMISo (where SOME_DIRECTORY should be /PATH_TO_OPENFLIPPER/libs/CoMISo for integration with the OpenFlipper framework) the package is built by creating a build directory, using cmake to create the Makefiles and using make to actually build:\n\n# cd /SOME_DIRECTORY/CoMISo/\n# mkdir build\n# cd build\n# cmake ..\n(assuming all needed packages are installed and cmake threw no errors...)\n# make\n\nThe binaries (examples) and the shared library are found under\n/SOME_DIRECTORY/CoMISO/build/Build/bin/\nand \n/SOME_DIRECTORY/CoMISO/build/Build/lib/CoMISo/\n\n\nBuilding (For use with OpenFlipper)\n-----------------------------------\nSimply extract/checkout the CoMISo directory to the /PATH_TO_OPENFLIPPER/libs/ directory. The library will be automatically built and you will find the shared library libCoMISo.so under the OpenFlipper build directory.\nTo use the solver in your Plugin add CoMISo to the CMakeLists.txt of the plugin and you are set, see Plugin-HarmonicExample for an example.\n\nUsing\n-----\nTo use the solver library in your applications have a look at the /SOME_DIRECTORY/CoMISo/Examples/ and the sample OpenFlipper plugin (Plugin-HarmonicExample) downloadable from the CoMISo project homepage.\n\nFeedback\n--------\nWe appreciate your feedback! Bugs, comments, questions or patches send them to zimmer@informatik.rwth-aachen.de or bommes@informatik.rwth-aachen.de !\n"
  },
  {
    "path": "libs/CoMISo/Solver/CholmodSolver.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               CoMISo                                      *\n *      Copyright (C) 2008-2009 by Computer Graphics Group, RWTH Aachen      *\n *                           www.rwth-graphics.de                            *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of CoMISo.                                             *\n *                                                                           *\n *  CoMISo 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 *  CoMISo 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 CoMISo.  If not, see <http://www.gnu.org/licenses/>.          *\n *                                                                           *\n\\*===========================================================================*/ \n\n//== COMPILE-TIME PACKAGE REQUIREMENTS ========================================\n#include <CoMISo/Config/config.hh>\n#if COMISO_SUITESPARSE_AVAILABLE\n//=============================================================================\n\n#include \"CholmodSolver.hh\"\n\n\nnamespace COMISO {\n\nCholmodSolver::CholmodSolver()\n{\n    mp_cholmodCommon = new cholmod_common;\n    cholmod_start( mp_cholmodCommon );\n\n    mp_L = 0;\n\n    show_timings_ = false;\n\n    mp_cholmodCommon->nmethods = 1;\n    // use AMD ordering\n    mp_cholmodCommon->method[0].ordering = CHOLMOD_AMD ;\n\n    // use METIS ordering\n    //    mp_cholmodCommon->method[0].ordering = CHOLMOD_METIS ;\n\n    // try all methods\n    // mp_cholmodCommon->nmethods = 9;\n}\n\n\n  //-----------------------------------------------------------------------------\n  \n\nCholmodSolver::~CholmodSolver()\n{\n    if( mp_L )\n    {\n\tcholmod_free_factor( &mp_L, mp_cholmodCommon );\n    }\n\n    cholmod_finish( mp_cholmodCommon );\n    delete mp_cholmodCommon;\n    mp_cholmodCommon = NULL;\n}\n  \n\n//-----------------------------------------------------------------------------\n\n\nbool CholmodSolver::calc_system( const std::vector<int>&    _colptr, \n\t\t\t\t const std::vector<int>&    _rowind, \n\t\t\t\t const std::vector<double>& _values)\n{\n    if(show_timings_) sw_.start();\n\n    colptr_ = _colptr;\n    rowind_ = _rowind;\n    values_ = _values;\n\n    int n   = colptr_.size()-1;\n\n    cholmod_sparse matA;\n\n    matA.nrow = n;\n    matA.ncol = n;\n    matA.nzmax = _values.size();\n\n    matA.p = &colptr_[0];\n    matA.i = &rowind_[0];\n    matA.x = &values_[0];\n    matA.nz = 0;\n    matA.z = 0;\n    \n    //    matA.stype = -1;\n    matA.stype = 1;\n    matA.itype = CHOLMOD_INT;\n    matA.xtype = CHOLMOD_REAL;\n    matA.dtype = CHOLMOD_DOUBLE;\n    matA.sorted = 1;\n    matA.packed = 1;\n\n\n    // clean up\n    if( mp_L )\n    {\n\tcholmod_free_factor( &mp_L, mp_cholmodCommon );\n\tmp_L = 0;\n    }\n\n    if(show_timings_)\n    {\n      std::cerr << \" Cholmod Timing cleanup: \" << sw_.stop()/1000.0 << \"s\\n\";\n      sw_.start();\n    }\n\n    if( !(mp_L = cholmod_analyze( &matA, mp_cholmodCommon )) )\n    {\n\tstd::cout << \"cholmod_analyze failed\" << std::endl;\n\treturn false;\n    }\n\n    // // show selected ordering method\n    // std::cerr << \"best    ordering was: \" << mp_cholmodCommon->selected << std::endl;\n    // std::cerr << \"current ordering was: \" << mp_cholmodCommon->current  << std::endl;\n\n\n    if(show_timings_)\n    {\n      std::cerr << \" Cholmod Timing analyze: \" << sw_.stop()/1000.0 << \"s\\n\";\n      sw_.start();\n    }\n\n    if( !cholmod_factorize( &matA, mp_L, mp_cholmodCommon ) )\n    {\n\tstd::cout << \"cholmod_factorize failed\" << std::endl;\n\treturn false;\n    }\n\n    if(show_timings_)\n    {\n      std::cerr << \" Cholmod Timing factorize: \" << sw_.stop()/1000.0 << \"s\\n\";\n      sw_.start();\n    }\n\n    return true;\n}\n\n\n  //-----------------------------------------------------------------------------\n\n    \nbool CholmodSolver::update_system( const std::vector<int>& _colptr, \n\t\t\t\t   const std::vector<int>& _rowind, \n\t\t\t\t   const std::vector<double>& _values )\n{\n    if( !mp_L )\n\treturn false;\n\n    colptr_ = _colptr;\n    rowind_ = _rowind;\n    values_ = _values;\n    int n   = colptr_.size()-1;\n\n    cholmod_sparse matA;\n\n    matA.nrow = n;\n    matA.ncol = n;\n    matA.nzmax = _values.size();\n\n    matA.p = &colptr_[0];\n    matA.i = &rowind_[0];\n    matA.x = &values_[0];\n    matA.nz = 0;\n    matA.z = 0;\n    \n    //    matA.stype = -1;\n    matA.stype = 1;\n    matA.itype = CHOLMOD_INT;\n    matA.xtype = CHOLMOD_REAL;\n    matA.dtype = CHOLMOD_DOUBLE;\n    matA.sorted = 1;\n    matA.packed = 1;\n\n\n    if( !cholmod_factorize( &matA, mp_L, mp_cholmodCommon ) )\n    {\n\tstd::cout << \"cholmod_factorize failed\" << std::endl;\n\treturn false;\n    }\n\n    return true;\n}\n\n\n//-----------------------------------------------------------------------------\n  \n\nbool CholmodSolver::solve( double * _x, double * _b)\n{\n    const unsigned int n = colptr_.size() - 1;\n\n    cholmod_dense *x, b;\n\n\n    b.nrow = n;\n    b.ncol = 1;\n    b.nzmax = n;\n    b.d = b.nrow;\n    b.x = _b;\n    b.z = 0;\n    b.xtype = CHOLMOD_REAL;\n    b.dtype = CHOLMOD_DOUBLE;\n\n    if( !(x = cholmod_solve( CHOLMOD_A, mp_L, &b, mp_cholmodCommon )) )\n    {\n\tstd::cout << \"cholmod_solve failed\" << std::endl;\n\treturn false;\n    }\n    \n    for( unsigned int i = 0; i < n; ++i )\n\t_x[i] = ((double*)x->x)[i];\n\n    cholmod_free_dense( &x, mp_cholmodCommon );\n\n    return true;\n}\n\n\n//-----------------------------------------------------------------------------\n\nint CholmodSolver::dimension()\n{\n  return std::max(int(0), (int)(colptr_.size()-1));\n}\n\n//-----------------------------------------------------------------------------\n\nbool CholmodSolver::\nsolve ( std::vector<double>& _x0, std::vector<double>& _b)\n{\n  return solve( &(_x0[0]), &(_b[0]));\n}\n\n//-----------------------------------------------------------------------------\n\nbool& CholmodSolver::\nshow_timings()\n{\n  return show_timings_;\n}\n\n\n}\n\n//=============================================================================\n#endif // COMISO_SUITESPARSE_AVAILABLE\n//=============================================================================\n"
  },
  {
    "path": "libs/CoMISo/Solver/CholmodSolver.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               CoMISo                                      *\n *      Copyright (C) 2008-2009 by Computer Graphics Group, RWTH Aachen      *\n *                           www.rwth-graphics.de                            *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of CoMISo.                                             *\n *                                                                           *\n *  CoMISo 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 *  CoMISo 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 CoMISo.  If not, see <http://www.gnu.org/licenses/>.          *\n *                                                                           *\n\\*===========================================================================*/ \n\n\n//=============================================================================\n//\n//  CLASS CholmodSolver\n//\n//=============================================================================\n\n#ifndef COMISO_CHOLMOD_SOLVER_HH\n#define COMISO_CHOLMOD_SOLVER_HH\n\n//== COMPILE-TIME PACKAGE REQUIREMENTS ========================================\n#include <CoMISo/Config/config.hh>\n#if COMISO_SUITESPARSE_AVAILABLE\n\n//== INCLUDES =================================================================\n\n\n#include <CoMISo/Config/CoMISoDefines.hh>\n#include <CoMISo/Utils/StopWatch.hh>\n\n#include <iostream>\n#include <vector>\n\n#include \"cholmod.h\"\n\n// typedef struct cholmod_common_struct cholmod_common;\n// typedef struct cholmod_factor_struct cholmod_factor;\n\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== CLASS DEFINITION =========================================================\nclass COMISODLLEXPORT CholmodSolver\n{\npublic:\n\n    // _size is maximal size this instance can handle (smaller problems are possible!!!)\n    CholmodSolver();\n    ~CholmodSolver();\n    \n    bool calc_system( const std::vector<int>&    _colptr, \n\t\t      const std::vector<int>&    _rowind, \n\t\t      const std::vector<double>& _values );\n\n\n    template< class GMM_MatrixT>\n    bool calc_system_gmm( const GMM_MatrixT& _mat);\n\n    template< class Eigen_MatrixT>\n    bool calc_system_eigen( const Eigen_MatrixT& _mat);\n\n\n    bool update_system( const std::vector<int>&    _colptr, \n \t\t\tconst std::vector<int>&    _rowind, \n \t\t\tconst std::vector<double>& _values );\n\n\n    template< class GMM_MatrixT>\n    bool update_system_gmm( const GMM_MatrixT& _mat);\n\n    template< class Eigen_MatrixT>\n    bool update_system_eigen( const Eigen_MatrixT& _mat);\n\n\n    bool solve ( double *             _x0, double *             _b);\n\n    bool solve ( std::vector<double>& _x0, std::vector<double>& _b);\n\n    bool& show_timings();\n    \n    int dimension();\n    \nprivate:\n\n    cholmod_common * mp_cholmodCommon;\n\n    cholmod_factor * mp_L;\n\n    std::vector<double> values_;\n    std::vector<int>    colptr_;\n    std::vector<int>    rowind_;\n\n    bool show_timings_;\n    StopWatch sw_;\n};\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n#if defined(INCLUDE_TEMPLATES) && !defined(COMISO_CHOLMOD_SOLVER_TEMPLATES_C)\n#define COMISO_CHOLMOD_SOLVER_TEMPLATES\n#include \"CholmodSolverT.cc\"\n#endif\n//=============================================================================\n#endif // COMISO_SUITESPARSE_AVAILABLE\n//=============================================================================\n#endif // COMISO_CHOLMOD_SOLVER_HH defined\n//=============================================================================\n"
  },
  {
    "path": "libs/CoMISo/Solver/CholmodSolverT.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               CoMISo                                      *\n *      Copyright (C) 2008-2009 by Computer Graphics Group, RWTH Aachen      *\n *                           www.rwth-graphics.de                            *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of CoMISo.                                             *\n *                                                                           *\n *  CoMISo 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 *  CoMISo 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 CoMISo.  If not, see <http://www.gnu.org/licenses/>.          *\n *                                                                           *\n\\*===========================================================================*/ \n\n\n//== COMPILE-TIME PACKAGE REQUIREMENTS ========================================\n#include <CoMISo/Config/config.hh>\n#if COMISO_SUITESPARSE_AVAILABLE\n//=============================================================================\n\n\n#define COMISO_CHOLMOD_SOLVER_TEMPLATES_C\n\n#include <CoMISo/Solver/GMM_Tools.hh>\n#include <CoMISo/Solver/Eigen_Tools.hh>\n#include <CoMISo/Solver/CholmodSolver.hh>\n\n\nnamespace COMISO {\n\n\ntemplate< class GMM_MatrixT>\nbool CholmodSolver::calc_system_gmm( const GMM_MatrixT& _mat)\n{\n//   std::vector<int>    colptr;\n//   std::vector<int>    rowind;\n//   std::vector<double> values;\n    \n\n    if(show_timings_) sw_.start();\n\n    COMISO_GMM::get_ccs_symmetric_data( _mat,\n\t\t\t\t\t 'u',\n\t\t\t\t\t values_, \n\t\t\t\t\t rowind_, \n\t\t\t\t\t colptr_ );\n    \n    if(show_timings_)\n    {\n      std::cerr << \"Cholmod Timing GMM convert: \" << sw_.stop()/1000.0 << \"s\\n\";\n      std::cerr << \"#nnz: \" << values_.size() << std::endl;\n    }\n\n    return calc_system( colptr_, rowind_, values_);\n}\n  \n\n//-----------------------------------------------------------------------------\n\n\ntemplate< class GMM_MatrixT>\nbool CholmodSolver::update_system_gmm( const GMM_MatrixT& _mat)\n{\n//   std::vector<int>    colptr;\n//   std::vector<int>    rowind;\n//   std::vector<double> values;\n    \n  COMISO_GMM::get_ccs_symmetric_data( _mat,\n\t\t\t\t      'u',\n\t\t\t\t       values_, \n\t\t\t\t       rowind_, \n\t\t\t\t       colptr_ );\n\n  return update_system( colptr_, rowind_, values_);\n}\n\n//-----------------------------------------------------------------------------\n  \ntemplate< class Eigen_MatrixT>\nbool CholmodSolver::calc_system_eigen( const Eigen_MatrixT& _mat)\n{\n    if(show_timings_) sw_.start();\n\n#if COMISO_Eigen3_AVAILABLE\n    COMISO_EIGEN::get_ccs_symmetric_data( _mat,\n\t\t\t\t\t 'u',\n\t\t\t\t\t values_, \n\t\t\t\t\t rowind_, \n\t\t\t\t\t colptr_ );\n#endif\n    \n    if(show_timings_)\n    {\n      std::cerr << \"Cholmod Timing EIGEN convert: \" << sw_.stop()/1000.0 << \"s\\n\";\n      std::cerr << \"#nnz: \" << values_.size() << std::endl;\n    }\n\n    return calc_system( colptr_, rowind_, values_);\n}\n  \n//-----------------------------------------------------------------------------\n\ntemplate< class Eigen_MatrixT>\nbool CholmodSolver::update_system_eigen( const Eigen_MatrixT& _mat)\n{\n#if COMISO_Eigen3_AVAILABLE    \n  COMISO_EIGEN::get_ccs_symmetric_data( _mat,\n\t\t\t\t      'u',\n\t\t\t\t       values_, \n\t\t\t\t       rowind_, \n\t\t\t\t       colptr_ );\n#endif\n  return update_system( colptr_, rowind_, values_);\n}\n\n\n}\n\n//=============================================================================\n#endif // COMISO_SUITESPARSE_AVAILABLE\n//=============================================================================\n"
  },
  {
    "path": "libs/CoMISo/Solver/ConstrainedSolver.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               CoMISo                                      *\n *      Copyright (C) 2008-2009 by Computer Graphics Group, RWTH Aachen      *\n *                           www.rwth-graphics.de                            *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of CoMISo.                                             *\n *                                                                           *\n *  CoMISo 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 *  CoMISo 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 CoMISo.  If not, see <http://www.gnu.org/licenses/>.          *\n *                                                                           *\n\\*===========================================================================*/ \n\n\n#include \"ConstrainedSolver.hh\"\n\n#include <gmm/gmm.h>\n\nnamespace COMISO {\n\n//-----------------------------------------------------------------------------\n\nint \nConstrainedSolver::\nfind_gcd(std::vector<int>& _v_gcd, int& _n_ints)\n{\n  bool found_gcd = false;\n  bool done      = false;\n  bool all_same  = true;\n  int i_gcd = -1;\n  int prev_val   = -1;\n  // check integer coefficient pairwise\n  while( !done)\n  {\n    // assume gcd of all pairs is the same\n    all_same = true;\n    for( int k=0; k<_n_ints-1 && !done; ++k)\n    {\n      // use abs(.) to get same sign needed for all_same\n      _v_gcd[k] = abs(gcd(_v_gcd[k],_v_gcd[k+1]));\n\n      if( k>0 && prev_val != _v_gcd[k])\n        all_same = false;\n\n      prev_val = _v_gcd[k];\n\n      // if a 2 was found, all other entries have to be divisible by 2\n      if(_v_gcd[k] == 2)\n      {\n        bool all_ok=true;\n        for( int l=0; l<_n_ints; ++l)\n          if( abs(_v_gcd[l]%2) != 0)\n          {\n            all_ok = false;\n            break;\n          }\n        done      = true;\n        if( all_ok )\n        {\n          found_gcd = true;\n          i_gcd     = 2;\n        } \n        else\n        {\n          found_gcd = false;\n        }\n      }\n    }\n    // already done (by successfull \"2\"-test)?\n    if(!done)\n    {\n      // all gcds the same? \n      // we just need to check one final gcd between first 2 elements\n      if( all_same && _n_ints >1)\n      {\n        _v_gcd[0]  = abs(gcd(_v_gcd[0],_v_gcd[1]));\n        // we are done\n        _n_ints = 1;\n      }\n\n      // only one value left, either +-1 or gcd\n      if( _n_ints == 1)\n      {\n        done = true;\n        if( (_v_gcd[0])*(_v_gcd[0]) == 1)\n        {\n          found_gcd = false;\n          //std::cerr << __FUNCTION__ << \" Info: No gcd found!\" << std::endl;\n        }\n        else\n        {\n          i_gcd = _v_gcd[0];\n          found_gcd = true;\n          //std::cerr << __FUNCTION__ << \" Info: Found gcd = \" << i_gcd << std::endl;\n        }\n      }\n    }\n    // we now have n_ints-1 gcds to check next iteration\n    --_n_ints;\n  }\n  return i_gcd;\n}\n\n//-----------------------------------------------------------------------------\n\n}\n\n"
  },
  {
    "path": "libs/CoMISo/Solver/ConstrainedSolver.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               CoMISo                                      *\n *      Copyright (C) 2008-2009 by Computer Graphics Group, RWTH Aachen      *\n *                           www.rwth-graphics.de                            *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of CoMISo.                                             *\n *                                                                           *\n *  CoMISo 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 *  CoMISo 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 CoMISo.  If not, see <http://www.gnu.org/licenses/>.          *\n *                                                                           *\n\\*===========================================================================*/ \n\n\n//=============================================================================\n//\n//  CLASS ConstrainedSolver\n//\n//=============================================================================\n\n\n#ifndef COMISO_CONSTRAINEDSOLVER_HH\n#define COMISO_CONSTRAINEDSOLVER_HH\n\n\n//== INCLUDES =================================================================\n#include <CoMISo/Config/CoMISoDefines.hh>\n\n#include \"GMM_Tools.hh\"\n#include \"MISolver.hh\"\n#include <vector>\n\n//== FORWARDDECLARATIONS ======================================================\n\n//== DEFINES ==================================================================\n#define ROUND(x) ((x)<0?int((x)-0.5):int((x)+0.5))\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n//== CLASS DEFINITION =========================================================\n\n/** \\class ConstrainedSolver ConstrainedSolver.hh <ACG/.../ConstrainedSolver.hh>\n\n  Takes a linear (symmetric) system of equations and a set of linear constraints and solves it.\n */\n\nclass COMISODLLEXPORT ConstrainedSolver\n{\npublic:\n  typedef gmm::csc_matrix<double>                    CSCMatrix;\n  typedef gmm::row_matrix< gmm::wsvector< double > > RowMatrix;\n\n\n  /// default Constructor\n  /** _do_gcd specifies if a greatest common devisor correction should be used when no (+-)1-coefficient is found*/\n  ConstrainedSolver( bool _do_gcd = true): do_gcd_(_do_gcd)\n  { epsilon_ = 1e-8; noisy_ = 1; }\n\n  /// Destructor\n  ~ConstrainedSolver() { }\n\n/** @name Contrained solvers\n * Functions to solve constrained linear systems of the form Ax=b (stemming from quadratic energies). \n * The constraints can be linear constraints of the form \\f$ x_1*c_1+ \\cdots +x_n*c_n=c \\f$ as well as integer constraints \\f$x_i\\in \\mathbf{Z}\\f$. \n * The system is then solved with these constraints in mind. For solving the system the Mixed-Integer Solver \\a MISolver is used. \n */\n/*@{*/\n\n/// Quadratic matrix constrained solver\n/**  \n  *  Takes a system of the form Ax=b, a constraint matrix C and a set of variables _to_round to be rounded to integers. \\f$ A\\in \\mathbf{R}^{n\\times n}\\f$\n  *  @param _constraints row matrix with rows of the form \\f$ [ c_1, c_2, \\cdots, c_n, c_{n+1} ] \\f$ corresponding to the linear equation \\f$ c_1*x_1+\\cdots+c_n*x_n + c_{n+1}=0 \\f$.\n  *  @param _A nxn-dimensional column matrix of the system \n  *  @param _x n-dimensional variable vector\n  *  @param _rhs n-dimensional right hand side.\n  *  @param _idx_to_round indices i of variables x_i that shall be rounded\n  *  @param _reg_factor regularization factor. Helps unstable, low rank system to become solvable. Adds \\f$ \\_reg\\_factor*mean(trace(_A))*Id \\f$ to A.\n  *  @param _show_miso_settings should the (QT) dialog of the Mixed-Integer solver pop up?\n  *  @param _show_timings shall some timings be printed?\n  */\n  template<class RMatrixT, class CMatrixT, class VectorT, class VectorIT >\n  void solve(\n      RMatrixT& _constraints,\n      CMatrixT& _A, \n      VectorT&  _x,\n      VectorT&  _rhs,\n      VectorIT& _idx_to_round,\n      double    _reg_factor = 0.0,\n      bool      _show_miso_settings = true,\n      bool      _show_timings = true );\n\n  // const version of above function\n  template<class RMatrixT, class CMatrixT, class VectorT, class VectorIT >\n  void solve_const(\n      const RMatrixT& _constraints,\n      const CMatrixT& _A, \n            VectorT&  _x,\n      const VectorT&  _rhs,\n      const VectorIT& _idx_to_round,\n            double    _reg_factor = 0.0,\n            bool      _show_miso_settings = true,\n            bool      _show_timings = true );\n\n  // efficent re-solve with modified _constraint_rhs and/or _rhs (if not modified use 0 pointer)\n  // by keeping previous _constraints and _A fixed\n  // _constraint_rhs and _rhs are constant, i.e. not changed\n  template<class VectorT >\n  void resolve(\n       VectorT&  _x,\n       VectorT*  _constraint_rhs = 0,\n       VectorT*  _rhs            = 0,\n       bool      _show_timings = true );\n\n\n/// Non-Quadratic matrix constrained solver\n/**  \n  *  Same as above, but performs the elimination of the constraints directly on the B matrix of \\f$ x^\\top B^\\top Bx \\f$, where B has m rows (equations) and (n+1) columns \\f$ [ x_1, x_2, \\cdots, x_n, -rhs ] \\f$.\n  *  \\note This function might be more efficient in some cases, but generally the solver for the quadratic matrix above is a safer bet. Needs further testing.\n  *  \\note Internally the \\f$ A=B^\\top B \\f$ matrix is formed.\n  *  @param _constraints row matrix with rows of the form \\f$ [ c_1, c_2, \\cdots, c_n, c_{n+1} ] \\f$ corresponding to the linear equation \\f$ c_1*x_1+\\cdots+c_n*x_n + c_{n+1}=0 \\f$.\n  *  @param _B mx(n+1)-dimensional column matrix of the system \n  *  @param _x n-dimensional variable vector\n  *  @param _idx_to_round indices i of variables x_i that shall be rounded\n  *  @param _reg_factor regularization factor. Helps unstable, low rank system to become solvable.\n  *  @param _show_miso_settings should the (QT) dialog of the Mixed-Integer solver pop up?\n  *  @param _show_timings shall some timings be printed?\n  */\n  template<class RMatrixT, class VectorT, class VectorIT >\n  void solve(\n      RMatrixT& _constraints,\n      RMatrixT& _B, \n      VectorT&  _x,\n      VectorIT& _idx_to_round,\n      double    _reg_factor = 0.0,\n      bool      _show_miso_settings = true,\n      bool      _show_timings = true );\n\n  // const version of above function\n  template<class RMatrixT, class VectorT, class VectorIT >\n  void solve_const(\n      const RMatrixT& _constraints,\n      const RMatrixT& _B,\n      VectorT&  _x,\n      const VectorIT& _idx_to_round,\n      double    _reg_factor = 0.0,\n      bool      _show_miso_settings = true,\n      bool      _show_timings = true );\n\n  // efficent re-solve with modified _rhs by keeping previous _constraints and _A fixed\n  // ATTENTION: only the rhs resulting from B^TB can be changed!!! otherwise use solve\n  template<class RMatrixT, class VectorT >\n    void resolve(\n      const RMatrixT& _B,\n      VectorT&  _x,\n      VectorT*  _constraint_rhs = 0,\n      bool      _show_timings = true );\n\n/*@}*/\n\n\n/** @name Eliminate constraints\n * Functions to eliminate (or integrate) linear constraints from an equation system. These functions are used internally by the \\a solve functions.\n */\n/*@{*/\n\n/// Make constraints independent\n/**  \n  *  This function performs a Gauss elimination on the constraint matrix making the constraints easier to eliminate. \n  *  \\note A certain amount of independence of the constraints is assumed.\n  *  \\note contradicting constraints will be ignored.\n  *  \\warning care must be taken when non-trivial constraints occur where some of the variables contain integer-variables (to be rounded) as the optimal result might not always occur.\n  *  @param _constraints  row matrix with constraints\n  *  @param _idx_to_round indices of variables to be rounded (these must be considered.)\n  *  @param _c_elim the \"returned\" vector of variable indices and the order in which the can be eliminated.\n  */\n  template<class RMatrixT, class VectorIT >\n  void make_constraints_independent(\n      RMatrixT&         _constraints,\n\t\t\tVectorIT&         _idx_to_round,\n\t\t\tstd::vector<int>& _c_elim );\n\n  template<class RMatrixT, class VectorIT >\n  void make_constraints_independent_reordering(\n      RMatrixT&         _constraints,\n\t\t\tVectorIT&         _idx_to_round,\n\t\t\tstd::vector<int>& _c_elim );\n\n/// Eliminate constraints on a factored matrix B\n/**  \n  *  \\note Constraints are assumed to have been made independent by \\a make_constraints_independent.\n  *  @param _constraints row matrix with constraints (n+1 columns) \n  *  @param _B system row matrix mx(n+1)\n  *  @param _idx_to_round indices to be rounded\n  *  @param _c_elim the indices of the variables to be eliminated.\n  *  @param _new_idx the created re-indexing map. new_idx[i] = -1 means x_i eliminated, new_idx[i] = j means x_i is now at index j.\n  *  @param _Bcol resulting (smaller) column matrix to be used for future computations. (e.g. convert to CSC and solve)\n  */\n  template<class SVector1T, class SVector2T, class VectorIT, class SVector3T>\n  void eliminate_constraints(\n      gmm::row_matrix<SVector1T>& _constraints,\n\t\t\tgmm::row_matrix<SVector2T>& _B, \n\t\t\tVectorIT&                   _idx_to_round,\n\t\t\tstd::vector<int>&           _c_elim,\n\t\t\tstd::vector<int>&           _new_idx,\n\t\t\tgmm::col_matrix<SVector3T>& _Bcol);\n\n/// Eliminate constraints on a quadratic matrix A\n/**  \n  *  \\note Constraints are assumed to have been made independent by \\a make_constraints_independent.\n  *  \\note _x must have correct size (same as _rhs)\n  *  @param _constraints row matrix with constraints (n+1 columns) \n  *  @param _A system row matrix nxn)\n  *  @param _x variable vector\n  *  @param _rhs right hand side\n  *  @param _idx_to_round indices to be rounded\n  *  @param _c_elim the indices of the variables to be eliminated.\n  *  @param _new_idx the created re-indexing map. new_idx[i] = -1 means x_i eliminated, new_idx[i] = j means x_i is now at index j.\n  *  @param _Acsc resulting (smaller) column (csc) matrix to be used for future computations.\n  */\n \n  template<class SVector1T, class SVector2T, class VectorIT, class CSCMatrixT>\n  void eliminate_constraints(\n      gmm::row_matrix<SVector1T>& _constraints,\n      gmm::col_matrix<SVector2T>& _A, \n      std::vector<double>&        _x, \n      std::vector<double>&        _rhs, \n      VectorIT&                   _idx_to_round,\n      std::vector<int>&           _c_elim,\n      std::vector<int>&           _new_idx,\n      CSCMatrixT&                 _Acsc);\n\n/// Restore a solution vector to the un-eliminated size\n/**  \n  *  @param _constraints row matrix with constraints (n+1 columns) \n  *  @param _x solution vector to reduced/eliminated system (result will also be written here)\n  *  @param _c_elim vector of eliminated indices \n  *  @param _new_idx re-indexing vector\n  */\n \n  template<class RMatrixT, class VectorT >\n  void restore_eliminated_vars( RMatrixT&         _constraints,\n\t\t\t\tVectorT&          _x,\n\t\t\t\tstd::vector<int>& _c_elim,\n\t\t\t\tstd::vector<int>& _new_idx);\n\n\n/*@}*/\n\n  /// Set numerical epsilon for valid constraint coefficient\n  void set_epsilon( double _epsilon) { epsilon_ = _epsilon; }\n\n  /// Set noise-level (how much std output is given) 0 basically none, 1 important stuff (warning/timing, is default), 2+ not so important\n  void set_noisy( int _noisy) { noisy_ = _noisy;}\n\n  // Get/Set whether the constraint reordering is used (default true)\n  bool& use_constraint_reordering() { return miso_.use_constraint_reordering(); }\n\n/** @name Verify the result.\n * Functions to verify the result of the constrained solver. Are the constraints met, are the correct variables correctly rounded ...\n */\n/*@{*/\n\n\n  template<class RMatrixT, class CMatrixT, class VectorT>\n  double verify_constrained_system( \n\t\t\t\t   const RMatrixT& _conditions,\n\t\t\t\t   const CMatrixT& _A,\n\t\t\t\t   const VectorT&  _x,\n\t\t\t\t   const VectorT&  _rhs,\n\t\t\t\t   double          _eps = 1e-9);\n\n  template<class RMatrixT, class CMatrixT, class VectorT, class VectorIT>\n  double verify_constrained_system_round( \n\t\t\t\t\t const RMatrixT& _conditions,\n\t\t\t\t\t const CMatrixT& _A,\n\t\t\t\t\t const VectorT&  _x,\n\t\t\t\t\t const VectorT&  _rhs,\n\t\t\t\t\t const VectorIT& _idx_to_round,\n\t\t\t\t\t double          _eps = 1e-9);\n\n  template<class RMatrixT, class VectorT, class VectorIT>\n  void verify_mi_factored( const RMatrixT& _conditions,\n\t\t\t   const RMatrixT& _B, \n\t\t\t   const VectorT&  _x,\n\t\t\t   const VectorIT& _idx_to_round );\n/*@}*/\n\n\n  /// Access the MISolver (e.g. to change settings)\n  COMISO::MISolver& misolver() { return miso_;}\n\nprivate:\n\n  template<class RowT, class MatrixT>\n  void add_row( int       _row_i,\n\t\tdouble    _coeff,\n\t\tRowT      _row, \n\t\tMatrixT&  _mat );\n\n  template<class RowT, class RMatrixT, class CMatrixT>\n  void add_row_simultaneously( int       _row_i,\n\t\t\t       double    _coeff,\n\t\t\t       RowT      _row, \n\t\t\t       RMatrixT& _rmat,\n\t\t\t       CMatrixT& _cmat );\n\n\n  template<class CMatrixT, class VectorT, class VectorIT>\n  double setup_and_solve_system( CMatrixT& _B,\n\t\t\t       VectorT&  _x,\n\t\t\t       VectorIT& _idx_to_round,\n\t\t\t       double    _reg_factor,\n\t\t\t       bool      _show_miso_settings);\n\n\n  // warning: order of replacement not the same as in _columns (internal sort)\n  template<class CMatrixT>\n  void eliminate_columns( CMatrixT& _M,\n\t\t\t  const std::vector< int >& _columns);\n\n  inline int gcd( int _a, int _b)\n  {\n    while( _b != 0)\n    {\n      int t(_b);\n      _b = _a%_b;\n      _a = t;\n    }\n    return _a;\n  }\n\n  int find_gcd(std::vector<int>& _v_gcd, int& _n_ints);\n  // TODO if no gcd correction was possible, at least use a variable divisible by 2 as new elim_j (to avoid in-exactness e.g. 1/3)\n  template<class RMatrixT>\n  bool update_constraint_gcd( RMatrixT& _constraints, \n                              int _row_i,\n                              int& _elim_j,\n                              std::vector<int>& _v_gcd,\n                              int& _n_ints);\n\nprivate:\n\n  /// Copy constructor (not used)\n  ConstrainedSolver(const ConstrainedSolver& _rhs);\n\n  /// Assignment operator (not used)\n  ConstrainedSolver& operator=(const ConstrainedSolver& _rhs);\n\n  // MISO solver\n  COMISO::MISolver miso_;\n\n  double epsilon_;\n  int    noisy_;\n  bool   do_gcd_;\n\n  // --------------- Update by Marcel to enable efficient re-solve with changed rhs ----------------------\n  // Store for symbolic elimination information for rhs\n  class rhsUpdateTable {\n  public:\n\n    void append(int _i, double _f, int _j, bool _flag)\n    {\n//      std::cerr << \"append \" << _i << \", \" << _j << \", \" << _f << \", \" << int(_flag) << std::endl;\n      table_.push_back(rhsUpdateTableEntry(_i, _j, _f, _flag));\n    }\n    void add_elim_id(int _i) { elim_var_ids_.push_back(_i); }\n    void clear() { table_.clear(); elim_var_ids_.clear(); }\n    // apply stored transformations to _rhs\n    void apply(std::vector<double>& _constraint_rhs, std::vector<double>& _rhs)\n    {\n      std::vector<rhsUpdateTableEntry>::const_iterator t_it, t_end;\n      t_end = table_.end();\n      int cur_j = -1;\n      double cur_rhs = 0.0;\n      for(t_it = table_.begin(); t_it != t_end; ++t_it)\n      {\n        if(t_it->rhs_flag)\n            _rhs[t_it->i] += t_it->f*_constraint_rhs[t_it->j];\n        else\n        {\n          if(t_it->j != cur_j) { cur_j = t_it->j; cur_rhs = _rhs[cur_j]; }\n          _rhs[t_it->i] += t_it->f * cur_rhs;\n        }\n      }\n    }\n    // remove eliminated elements from _rhs\n    void eliminate(std::vector<double>& _rhs)\n    {\n      std::vector<int> evar( elim_var_ids_ );\n      std::sort( evar.begin(), evar.end() );\n      evar.push_back( std::numeric_limits<int>::max() );\n\n      int cur_evar_idx=0;\n      unsigned int nc = _rhs.size();\n      for( unsigned int i=0; i<nc; ++i )\n      {\n        unsigned int next_i = evar[cur_evar_idx];\n\n        if ( i != next_i ) _rhs[i-cur_evar_idx] = _rhs[i];\n        else ++cur_evar_idx;\n      }\n      _rhs.resize( nc - cur_evar_idx );\n    }\n    // store transformed constraint matrix and index map to allow for later re-substitution\n    template<class RMatrixT>\n    void store(const RMatrixT& _constraints, const std::vector<int>& _c_elim, const std::vector<int>& _new_idx)\n    {\n      constraints_p_.resize( gmm::mat_nrows(_constraints), gmm::mat_ncols(_constraints));\n      gmm::copy(_constraints, constraints_p_);\n      c_elim_ = _c_elim;\n      new_idx_ = _new_idx;\n    }\n\n  private:\n    class rhsUpdateTableEntry {\n    public:\n      rhsUpdateTableEntry(int _i, int _j, double _f, bool _rhs_flag) : i(_i), j(_j), f(_f), rhs_flag(_rhs_flag) {}\n      int i;\n      int j;\n      double f;\n      bool rhs_flag;\n    };\n\n    std::vector<rhsUpdateTableEntry> table_;\n    std::vector<int> elim_var_ids_;\n\n  public:\n    std::vector<int> c_elim_;\n    std::vector<int> new_idx_;\n    RowMatrix constraints_p_;\n\n    // cache current rhs_ and constraint_rhs_ and linear transformation of constraint_rhs_ D_\n    RowMatrix D_;\n    std::vector<double> cur_rhs_;\n    // constraint_rhs after Gaussian elimination update D*constraint_rhs_orig_\n    std::vector<double> cur_constraint_rhs_;\n  } rhs_update_table_;\n\n};\n\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n#if defined(INCLUDE_TEMPLATES) && !defined(COMISO_CONSTRAINEDSOLVER_C)\n#define COMISO_CONSTRAINEDSOLVER_TEMPLATES\n#include \"ConstrainedSolverT.cc\"\n#endif\n//=============================================================================\n#endif // COMISO_CONSTRAINEDSOLVER_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/CoMISo/Solver/ConstrainedSolverT.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               CoMISo                                      *\n *      Copyright (C) 2008-2009 by Computer Graphics Group, RWTH Aachen      *\n *                           www.rwth-graphics.de                            *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of CoMISo.                                             *\n *                                                                           *\n *  CoMISo 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 *  CoMISo 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 CoMISo.  If not, see <http://www.gnu.org/licenses/>.          *\n *                                                                           *\n\\*===========================================================================*/ \n\n\n//=============================================================================\n//\n//  CLASS MISolver - IMPLEMENTATION\n//\n//=============================================================================\n\n#define COMISO_CONSTRAINEDSOLVER_C\n//== INCLUDES =================================================================\n\n#include \"ConstrainedSolver.hh\"\n#include <gmm/gmm.h>\n#include \"GMM_Tools.hh\"\n#include <float.h>\n#include <CoMISo/Utils/StopWatch.hh>\n#include <CoMISo/Utils/MutablePriorityQueueT.hh>\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== IMPLEMENTATION ==========================================================\n\n\ntemplate<class RMatrixT, class CMatrixT, class VectorT, class VectorIT >\nvoid \nConstrainedSolver::\nsolve_const(\t const RMatrixT& _constraints,\n\t\t const CMatrixT& _A, \n\t\t VectorT&  _x,\n\t\t const VectorT&  _rhs,\n\t\t const VectorIT& _idx_to_round,\n\t\t double    _reg_factor,\n\t\t bool      _show_miso_settings,\n\t\t bool      _show_timings )\n{\n  // copy matrices\n  RMatrixT constraints( gmm::mat_nrows(_constraints), gmm::mat_ncols(_constraints));\n  gmm::copy(_constraints, constraints);\n\n  CMatrixT A( gmm::mat_nrows(_A), gmm::mat_ncols(_A));\n  gmm::copy(_A, A);\n\n  // ... and vectors\n  VectorT  rhs(_rhs);\n  VectorIT idx_to_round(_idx_to_round);\n\n  // call non-const function\n  solve(constraints,\n\tA,\n\t_x,\n\trhs,\n\tidx_to_round,\n\t_reg_factor,\n\t_show_miso_settings,\n\t_show_timings);\n}\n\n\n//-----------------------------------------------------------------------------\n\n\ntemplate<class RMatrixT, class VectorT, class VectorIT >\nvoid \nConstrainedSolver::\nsolve_const( const RMatrixT& _constraints,\n\t     const RMatrixT& _B,\n\t     VectorT&  _x,\n\t     const VectorIT& _idx_to_round,\n\t     double    _reg_factor,\n\t     bool      _show_miso_settings,\n\t     bool      _show_timings )\n{\n  // copy matrices\n  RMatrixT constraints( gmm::mat_nrows(_constraints), gmm::mat_ncols(_constraints));\n  gmm::copy(_constraints, constraints);\n\n  RMatrixT B( gmm::mat_nrows(_B), gmm::mat_ncols(_B));\n  gmm::copy(_B, B);\n\n  // ... and vectors\n  VectorIT idx_to_round(_idx_to_round);\n\n  // call non-const function\n  solve(constraints,\n\tB,\n\t_x,\n\tidx_to_round,\n\t_reg_factor,\n\t_show_miso_settings,\n\t_show_timings);\n}\n\n\n//-----------------------------------------------------------------------------\n\n\ntemplate<class RMatrixT, class VectorT, class VectorIT >\nvoid \nConstrainedSolver::\nsolve(\n    RMatrixT& _constraints,\n    RMatrixT& _B, \n    VectorT&  _x,\n    VectorIT& _idx_to_round,\n    double    _reg_factor,\n    bool      _show_miso_settings,\n    bool      _show_timings )\n{\n  // convert into quadratic system\n  VectorT rhs;\n  gmm::col_matrix< gmm::rsvector< double > > A;\n  COMISO_GMM::factored_to_quadratic(_B, A, rhs);\n\n  // solve\n  solve( _constraints, A, _x, rhs, \n\t _idx_to_round, _reg_factor, \n\t _show_miso_settings,\n\t _show_timings);\n\n//   int nrows = gmm::mat_nrows(_B);\n//   int ncols = gmm::mat_ncols(_B);\n//   int ncons = gmm::mat_nrows(_constraints);\n\n//   if( _show_timings) std::cerr << __FUNCTION__ << \"\\n Initial dimension: \" << nrows << \" x \" << ncols << \", number of constraints: \" << ncons << std::endl;\n \n//   // StopWatch for Timings\n//   COMISO::StopWatch sw, sw2; sw.start(); sw2.start();\n\n//   // c_elim[i] = index of variable which is eliminated in condition i\n//   // or -1 if condition is invalid\n//   std::vector<int> c_elim( ncons);\n\n//   // apply sparse gauss elimination to make subsequent _constraints independent\n//   make_constraints_independent( _constraints, _idx_to_round, c_elim);\n//   double time_gauss = sw.stop()/1000.0; sw.start();\n\n//   // eliminate conditions and return column matrix Bcol\n//   gmm::col_matrix< gmm::rsvector< double > > Bcol( nrows, ncols);\n\n//   // reindexing vector\n//   std::vector<int>                          new_idx;\n\n//   eliminate_constraints( _constraints, _B, _idx_to_round, c_elim, new_idx, Bcol);\n//   double time_eliminate = sw.stop()/1000.0; \n\n//   if( _show_timings) std::cerr << \"Eliminated dimension: \" << gmm::mat_nrows(Bcol) << \" x \" << gmm::mat_ncols(Bcol) << std::endl;\n\n//   // setup and solve system\n//   double time_setup = setup_and_solve_system( Bcol, _x, _idx_to_round, _reg_factor, _show_miso_settings);\n//   sw.start();\n\n//   //  double time_setup_solve = sw.stop()/1000.0; sw.start();\n  \n//   // restore eliminated vars to fulfill the given conditions\n//   restore_eliminated_vars( _constraints, _x, c_elim, new_idx);\n\n//   double time_resubstitute = sw.stop()/1000.0; sw.start();\n\n//   //  double time_total = sw2.stop()/1000.0;\n\n//   if( _show_timings) std::cerr << \"Timings: \\n\\t\" <<\n//     \"Gauss Elimination  \" << time_gauss          << \" s\\n\\t\" <<\n//     \"System Elimination \" << time_eliminate      << \" s\\n\\t\" <<\n//     \"Setup              \" << time_setup          << \" s\\n\\t\" <<\n//    // \"Setup + Mi-Solver  \" << time_setup_solve    << \" s\\n\\t\" <<\n//     \"Resubstitution     \" << time_resubstitute   << \" s\\n\\t\" << std::endl << std::endl;\n//     //\"Total              \" << time_total          << std::endl;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\ntemplate<class RMatrixT, class CMatrixT, class VectorT, class VectorIT>\nvoid \nConstrainedSolver::\nsolve(\n    RMatrixT& _constraints,\n    CMatrixT& _A, \n    VectorT&  _x,\n    VectorT&  _rhs,\n    VectorIT& _idx_to_round,\n    double    _reg_factor,\n    bool      _show_miso_settings, \n    bool      _show_timings )\n{\n  // show options dialog\n  if( _show_miso_settings)\n    miso_.show_options_dialog();\n\n\n  int nrows = gmm::mat_nrows(_A);\n  int ncols = gmm::mat_ncols(_A);\n  int ncons = gmm::mat_nrows(_constraints);\n\n  if( _show_timings) std::cerr << __FUNCTION__ << \"\\n Initital dimension: \" << nrows << \" x \" << ncols \n\t\t\t       << \", number of constraints: \" << ncons << \" use reordering: \" << use_constraint_reordering() << std::endl;\n\n  // StopWatch for Timings\n  COMISO::StopWatch sw, sw2; sw.start(); sw2.start();\n\n  // c_elim[i] = index of variable which is eliminated in condition i\n  // or -1 if condition is invalid\n  std::vector<int> c_elim( ncons);\n\n  // apply sparse gauss elimination to make subsequent _conditions independent\n  if(use_constraint_reordering())\n    make_constraints_independent_reordering( _constraints, _idx_to_round, c_elim);\n  else\n    make_constraints_independent( _constraints, _idx_to_round, c_elim);\n\n  double time_gauss = sw.stop()/1000.0; sw.start();\n\n  // re-indexing vector\n  std::vector<int>                          new_idx;\n\n  gmm::csc_matrix< double > Acsc;\n  eliminate_constraints( _constraints, _A, _x, _rhs, _idx_to_round, c_elim, new_idx, Acsc);\n  double time_eliminate = sw.stop()/1000.0;\n\n  if( _show_timings)\n  {\n    std::cerr << \"Eliminated dimension: \" << Acsc.nr << \" x \" << Acsc.nc << std::endl;\n    std::cerr << \"#nonzeros: \" << gmm::nnz(Acsc) << std::endl;\n  }\n\n  sw.start();\n  miso_.solve( Acsc, _x, _rhs, _idx_to_round);\n  double time_miso = sw.stop()/1000.0; sw.start();\n\n  rhs_update_table_.store(_constraints, c_elim, new_idx);\n  // restore eliminated vars to fulfill the given conditions\n  restore_eliminated_vars( _constraints, _x, c_elim, new_idx);\n\n  double time_resubstitute = sw.stop()/1000.0; sw.start();\n  double time_total = time_gauss + time_eliminate + time_miso + time_resubstitute;\n  if( _show_timings) std::cerr << \"Timings: \\n\\t\" <<\n    \"\\tGauss Elimination  \" << time_gauss          << \" s\\n\\t\" <<\n    \"\\tSystem Elimination \" << time_eliminate      << \" s\\n\\t\" <<\n    \"\\tMi-Solver          \" << time_miso           << \" s\\n\\t\" <<\n    \"\\tResubstitution     \" << time_resubstitute   << \" s\\n\\t\" << \n    \"\\tTotal              \" << time_total          << std::endl << std::endl;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\ntemplate<class RMatrixT, class VectorT >\nvoid\nConstrainedSolver::\nresolve(\n    const RMatrixT& _B,\n    VectorT&  _x,\n    VectorT*  _constraint_rhs,\n    bool      _show_timings )\n{\n  // extract rhs from quadratic system\n  VectorT rhs;\n // gmm::col_matrix< gmm::rsvector< double > > A;\n // COMISO_GMM::factored_to_quadratic(_B, A, rhs);\n  //TODO only compute rhs, not complete A for efficiency\n\n  unsigned int m = gmm::mat_nrows(_B);\n  unsigned int n = gmm::mat_ncols(_B);\n\n  typedef typename gmm::linalg_traits<RMatrixT>::const_sub_row_type CRowT;\n  typedef typename gmm::linalg_traits<RMatrixT>::sub_row_type       RowT;\n  typedef typename gmm::linalg_traits<CRowT>::const_iterator        RIter;\n  typedef typename gmm::linalg_traits<CRowT>::value_type            VecValT;\n\n  gmm::resize(rhs, n-1);\n  gmm::clear(rhs);\n  for(unsigned int i = 0; i < m; ++i)\n  {\n    // get current condition row\n    CRowT row       = gmm::mat_const_row( _B, i);\n    RIter row_it    = gmm::vect_const_begin( row);\n    RIter row_end   = gmm::vect_const_end( row);\n\n    if(row_end == row_it) continue;\n    --row_end;\n    if(row_end.index() != n-1) continue;\n    VecValT n_i = *row_end;\n    while(row_end != row_it)\n    {\n      --row_end;\n      rhs[row_end.index()] -= (*row_end) * n_i;\n    }\n  }\n\n  // solve\n  resolve(_x, _constraint_rhs, &rhs,\n   _show_timings);\n}\n\n\n//-----------------------------------------------------------------------------\n\n\ntemplate<class VectorT >\nvoid\nConstrainedSolver::\nresolve(\n     VectorT&  _x,\n     VectorT*  _constraint_rhs,\n     VectorT*  _rhs           ,\n     bool      _show_timings   )\n{\n  // StopWatch for Timings\n  COMISO::StopWatch sw;\n\n  sw.start();\n  // apply stored updates and eliminations to exchanged rhs\n  if(_constraint_rhs)\n  {\n    // apply linear transformation of Gaussian elimination\n    rhs_update_table_.cur_constraint_rhs_.resize(gmm::mat_nrows(rhs_update_table_.D_));\n    gmm::mult(rhs_update_table_.D_, *_constraint_rhs, rhs_update_table_.cur_constraint_rhs_);\n\n    // update rhs of stored constraints\n    unsigned int nc = gmm::mat_ncols(rhs_update_table_.constraints_p_);\n    for(unsigned int i=0; i<rhs_update_table_.cur_constraint_rhs_.size(); ++i)\n      rhs_update_table_.constraints_p_(i,nc-1) = -rhs_update_table_.cur_constraint_rhs_[i];\n  }\n  if(_rhs)\n    rhs_update_table_.cur_rhs_ = *_rhs;\n\n  std::vector<double> rhs_red = rhs_update_table_.cur_rhs_;\n\n  rhs_update_table_.apply(rhs_update_table_.cur_constraint_rhs_, rhs_red);\n  rhs_update_table_.eliminate(rhs_red);\n\n  //  std::cerr << \"############### Resolve info ##############\" << std::endl;\n  //  std::cerr << rhs_update_table_.D_ << std::endl;\n  //  std::cerr << rhs_update_table_.cur_rhs_ << std::endl;\n  //  std::cerr << rhs_update_table_.cur_constraint_rhs_ << std::endl;\n  //  std::cerr << rhs_update_table_.table_.size() << std::endl;\n  //  std::cerr << \"rhs_red: \" << rhs_red << std::endl;\n\n  miso_.resolve(_x, rhs_red);\n\n  double time_miso = sw.stop()/1000.0; sw.start();\n\n  // restore eliminated vars to fulfill the given conditions\n  restore_eliminated_vars( rhs_update_table_.constraints_p_, _x, rhs_update_table_.c_elim_, rhs_update_table_.new_idx_);\n\n  double time_resubstitute = sw.stop()/1000.0; sw.start();\n  double time_total = time_miso + time_resubstitute;\n  if( _show_timings) std::cerr << \"Timings: \\n\\t\" <<\n    \"\\tMi-Solver          \" << time_miso           << \" s\\n\\t\" <<\n    \"\\tResubstitution     \" << time_resubstitute   << \" s\\n\\t\" <<\n    \"\\tTotal              \" << time_total          << std::endl << std::endl;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\ntemplate<class RMatrixT, class VectorIT >\nvoid \nConstrainedSolver::\nmake_constraints_independent(\n    RMatrixT&         _constraints,\n\t\tVectorIT&         _idx_to_round,\n\t\tstd::vector<int>& _c_elim)\n{\n  // setup linear transformation for rhs, start with identity\n  unsigned int nr = gmm::mat_nrows(_constraints);\n  gmm::resize(rhs_update_table_.D_, nr, nr);\n  gmm::clear(rhs_update_table_.D_);\n  for(unsigned int i=0; i<nr; ++i) rhs_update_table_.D_(i,i) = 1.0;\n\n  //  COMISO::StopWatch sw;\n  // number of variables\n  int n_vars = gmm::mat_ncols(_constraints);\n\n  // TODO Check: HZ added 14.08.09 \n  _c_elim.clear();\n  _c_elim.resize( gmm::mat_nrows(_constraints), -1);\n\n  // build round map\n  std::vector<bool> roundmap( n_vars, false);\n  for(unsigned int i=0; i<_idx_to_round.size(); ++i)\n    roundmap[_idx_to_round[i]] = true;\n\n  // copy constraints into column matrix (for faster update via iterators)\n  typedef gmm::wsvector<double>      CVector;\n  typedef gmm::col_matrix< CVector > CMatrix;\n  CMatrix constraints_c;\n  gmm::resize(constraints_c, gmm::mat_nrows(_constraints), gmm::mat_ncols(_constraints));\n  gmm::copy(_constraints, constraints_c);\n\n  // for all conditions\n  for(unsigned int i=0; i<gmm::mat_nrows(_constraints); ++i)\n  {\n    // get elimination variable\n    int elim_j = -1;\n    int elim_int_j = -1;\n\n    // iterate over current row, until variable found\n    // first search for real valued variable\n    // if not found for integers with value +-1\n    // and finally take the smallest integer variable\n\n    typedef typename gmm::linalg_traits<RMatrixT>::const_sub_row_type CRowT;\n    typedef typename gmm::linalg_traits<RMatrixT>::sub_row_type       RowT;\n    typedef typename gmm::linalg_traits<CRowT>::const_iterator        RIter;\n\n    // get current condition row\n    CRowT row       = gmm::mat_const_row( _constraints, i);\n    RIter row_it    = gmm::vect_const_begin( row);\n    RIter row_end   = gmm::vect_const_end( row);\n    double elim_val = FLT_MAX;\n    double max_elim_val = -FLT_MAX;\n\n    // new: gcd\n    std::vector<int> v_gcd;\n    v_gcd.resize(gmm::nnz(row),-1);\n    int n_ints(0);\n    bool gcd_update_valid(true);\n\n    for(; row_it != row_end; ++row_it)\n    {\n      int cur_j = row_it.index();\n      // do not use the constant part\n      if(  cur_j != n_vars - 1 )\n      {\n        // found real valued var? -> finished (UPDATE: no not any more, find biggest real value to avoid x/1e-13)\n        if( !roundmap[ cur_j ])\n        {\n          if( fabs(*row_it) > max_elim_val)\n          {\n            elim_j = cur_j;\n            max_elim_val = fabs(*row_it);\n          }\n          //break;\n        }\n        else\n        {\n          double cur_row_val(fabs(*row_it));\n          // gcd\n          // if the coefficient of an integer variable is not an integer, then\n          // the variable most problably will not be (expect if all coeffs are the same, e.g. 0.5)\n          if( (double(int(cur_row_val))- cur_row_val) != 0.0)\n\t  {\n// \t    std::cerr << __FUNCTION__ << \" Warning: coefficient of integer variable is NOT integer: \" \n// \t\t      << cur_row_val << std::endl;\n\t    gcd_update_valid = false;\n\t  }\n\n          v_gcd[n_ints] = cur_row_val;\n          ++n_ints;\n\n          // store integer closest to 1, must be greater than epsilon_\n          if( fabs(cur_row_val-1.0) < elim_val && cur_row_val > epsilon_)\n          {\n            elim_int_j   = cur_j;\n            elim_val     = fabs(cur_row_val-1.0);\n          }\n        }\n      }\n    }\n\n    // first try to eliminate a valid (>epsilon_) real valued variable (safer)\n    if( max_elim_val > epsilon_)\n    {}\n    else // use the best found integer\n      elim_j = elim_int_j;\n\n    // if no integer or real valued variable greater than epsilon_ existed, then\n    // elim_j is now -1 and this row is not considered as a valid constraint\n\n\n\n\n    // store result\n    _c_elim[i] = elim_j;\n    // error check result\n    if( elim_j == -1)\n    {\n      // redundant or incompatible?\n      if( noisy_ > 0)\n        if( fabs(gmm::mat_const_row(_constraints, i)[n_vars-1]) > epsilon_ )\n          std::cerr << \"Warning: incompatible condition: \"\n\t\t    << fabs(gmm::mat_const_row(_constraints, i)[n_vars-1]) << std::endl;\n      //         else\n      //           std::cerr << \"Warning: redundant condition:\\n\";\n    }\n    else\n      if(roundmap[elim_j] && elim_val > 1e-6) \n      {\n        if( do_gcd_ && gcd_update_valid)\n        {\n          // perform gcd update\n          bool gcd_ok = update_constraint_gcd( _constraints, i, elim_j, v_gcd, n_ints);\n          if( !gcd_ok)\n            if( noisy_ > 0)\n              std::cerr << __FUNCTION__ << \" Warning: GCD update failed! \" << gmm::mat_const_row(_constraints, i) << std::endl;\n        }\n        else\n        {\n          if( noisy_ > 0)\n\t  {\n\t    if( !do_gcd_)\n\t      std::cerr << __FUNCTION__ << \" Warning: NO +-1 coefficient found, integer rounding cannot be guaranteed. Try using the GCD option! \" << gmm::mat_const_row(_constraints, i) << std::endl;\n\t    else\n\t      std::cerr << __FUNCTION__ << \" Warning: GCD of non-integer cannot be computed! \" << gmm::mat_const_row(_constraints, i) << std::endl;\n\n\t  }\n        }\n      }\n\n\n    // is this condition dependent?\n    if( elim_j != -1 )\n    {\n      // get elim variable value\n      double elim_val_cur = _constraints(i, elim_j);\n\n      // copy col\n      CVector col = constraints_c.col(elim_j);\n\n      // iterate over column\n      typename gmm::linalg_traits<CVector>::const_iterator c_it   = gmm::vect_const_begin(col);\n      typename gmm::linalg_traits<CVector>::const_iterator c_end  = gmm::vect_const_end(col);\n\n      for(; c_it != c_end; ++c_it)\n        if( c_it.index() > i)\n        {\n\t  //          sw.start();\n          double val = -(*c_it)/elim_val_cur;\n\n          add_row_simultaneously( c_it.index(), val, gmm::mat_row(_constraints, i), _constraints, constraints_c);\n          // make sure the eliminated entry is 0 on all other rows and not 1e-17\n          _constraints( c_it.index(), elim_j) = 0;\n          constraints_c(c_it.index(), elim_j) = 0;\n\n          // update linear transition of rhs\n          gmm::add(gmm::scaled(gmm::mat_row(rhs_update_table_.D_, i), val),\n                   gmm::mat_row(rhs_update_table_.D_, c_it.index()));\n        }\n    }\n  }\n}\n\n\n\n//-----------------------------------------------------------------------------\n\n\ntemplate<class RMatrixT, class VectorIT >\nvoid \nConstrainedSolver::\nmake_constraints_independent_reordering(\n    RMatrixT&         _constraints,\n\t\tVectorIT&         _idx_to_round,\n\t\tstd::vector<int>& _c_elim)\n{\n  // setup linear transformation for rhs, start with identity\n  unsigned int nr = gmm::mat_nrows(_constraints);\n  gmm::resize(rhs_update_table_.D_, nr, nr);\n  gmm::clear(rhs_update_table_.D_);\n  for(unsigned int i=0; i<nr; ++i) rhs_update_table_.D_(i,i) = 1.0;\n\n  //  COMISO::StopWatch sw;\n  // number of variables\n  int n_vars = gmm::mat_ncols(_constraints);\n\n  // TODO Check: HZ added 14.08.09 \n  _c_elim.clear();\n  _c_elim.resize( gmm::mat_nrows(_constraints), -1);\n\n  // build round map\n  std::vector<bool> roundmap( n_vars, false);\n  for(unsigned int i=0; i<_idx_to_round.size(); ++i)\n    roundmap[_idx_to_round[i]] = true;\n\n  // copy constraints into column matrix (for faster update via iterators)\n  typedef gmm::wsvector<double>      CVector;\n  typedef gmm::col_matrix< CVector > CMatrix;\n  CMatrix constraints_c;\n  gmm::resize(constraints_c, gmm::mat_nrows(_constraints), gmm::mat_ncols(_constraints));\n  gmm::copy(_constraints, constraints_c);\n\n  // init priority queue\n  MutablePriorityQueueT<unsigned int, unsigned int> queue;\n  queue.clear( nr );\n  for(unsigned int i=0; i<nr; ++i)\n  {\n    int cur_nnz = gmm::nnz( gmm::mat_row(_constraints,i));\n    if( _constraints(i,n_vars-1) != 0.0) --cur_nnz;\n\n    queue.update(i, cur_nnz);\n  }\n  \n  std::vector<bool> row_visited(nr, false);\n  std::vector<unsigned int> row_ordering; row_ordering.reserve(nr);\n\n\n  // for all conditions\n  //  for(unsigned int i=0; i<gmm::mat_nrows(_constraints); ++i)\n  while(!queue.empty())\n  {\n    // get next row\n    unsigned int i = queue.get_next();\n    row_ordering.push_back(i);\n    row_visited[i] = true;\n\n    // get elimination variable\n    int elim_j = -1;\n    int elim_int_j = -1;\n\n    // iterate over current row, until variable found\n    // first search for real valued variable\n    // if not found for integers with value +-1\n    // and finally take the smallest integer variable\n\n    typedef typename gmm::linalg_traits<RMatrixT>::const_sub_row_type CRowT;\n    typedef typename gmm::linalg_traits<RMatrixT>::sub_row_type       RowT;\n    typedef typename gmm::linalg_traits<CRowT>::const_iterator        RIter;\n\n    // get current condition row\n    CRowT row       = gmm::mat_const_row( _constraints, i);\n    RIter row_it    = gmm::vect_const_begin( row);\n    RIter row_end   = gmm::vect_const_end( row);\n    double elim_val = FLT_MAX;\n    double max_elim_val = -FLT_MAX;\n\n    // new: gcd\n    std::vector<int> v_gcd;\n    v_gcd.resize(gmm::nnz(row),-1);\n    int n_ints(0);\n    bool gcd_update_valid(true);\n\n    for(; row_it != row_end; ++row_it)\n    {\n      int cur_j = row_it.index();\n      // do not use the constant part\n      if(  cur_j != n_vars - 1 )\n      {\n        // found real valued var? -> finished (UPDATE: no not any more, find biggest real value to avoid x/1e-13)\n        if( !roundmap[ cur_j ])\n        {\n          if( fabs(*row_it) > max_elim_val)\n          {\n            elim_j = cur_j;\n            max_elim_val = fabs(*row_it);\n          }\n          //break;\n        }\n        else\n        {\n          double cur_row_val(fabs(*row_it));\n          // gcd\n          // if the coefficient of an integer variable is not an integer, then\n          // the variable most problably will not be (expect if all coeffs are the same, e.g. 0.5)\n          if( (double(int(cur_row_val))- cur_row_val) != 0.0)\n\t  {\n// \t    std::cerr << __FUNCTION__ << \" Warning: coefficient of integer variable is NOT integer: \" \n// \t\t      << cur_row_val << std::endl;\n\t    gcd_update_valid = false;\n\t  }\n\n          v_gcd[n_ints] = cur_row_val;\n          ++n_ints;\n\n          // store integer closest to 1, must be greater than epsilon_\n          if( fabs(cur_row_val-1.0) < elim_val && cur_row_val > epsilon_)\n          {\n            elim_int_j   = cur_j;\n            elim_val     = fabs(cur_row_val-1.0);\n          }\n        }\n      }\n    }\n\n    // first try to eliminate a valid (>epsilon_) real valued variable (safer)\n    if( max_elim_val > epsilon_)\n    {}\n    else // use the best found integer\n      elim_j = elim_int_j;\n\n    // if no integer or real valued variable greater than epsilon_ existed, then\n    // elim_j is now -1 and this row is not considered as a valid constraint\n\n\n\n\n    // store result\n    _c_elim[i] = elim_j;\n    // error check result\n    if( elim_j == -1)\n    {\n      // redundant or incompatible?\n      if( noisy_ > 0)\n        if( fabs(gmm::mat_const_row(_constraints, i)[n_vars-1]) > epsilon_ )\n          std::cerr << \"Warning: incompatible condition: \"\n\t\t    << fabs(gmm::mat_const_row(_constraints, i)[n_vars-1]) << std::endl;\n      //         else\n      //           std::cerr << \"Warning: redundant condition:\\n\";\n    }\n    else\n      if(roundmap[elim_j] && elim_val > 1e-6) \n      {\n        if( do_gcd_ && gcd_update_valid)\n        {\n          // perform gcd update\n          bool gcd_ok = update_constraint_gcd( _constraints, i, elim_j, v_gcd, n_ints);\n          if( !gcd_ok)\n            if( noisy_ > 0)\n              std::cerr << __FUNCTION__ << \" Warning: GCD update failed! \" << gmm::mat_const_row(_constraints, i) << std::endl;\n        }\n        else\n        {\n          if( noisy_ > 0)\n\t  {\n\t    if( !do_gcd_)\n\t      std::cerr << __FUNCTION__ << \" Warning: NO +-1 coefficient found, integer rounding cannot be guaranteed. Try using the GCD option! \" << gmm::mat_const_row(_constraints, i) << std::endl;\n\t    else\n\t      std::cerr << __FUNCTION__ << \" Warning: GCD of non-integer cannot be computed! \" << gmm::mat_const_row(_constraints, i) << std::endl;\n\n\t  }\n        }\n      }\n\n\n    // is this condition dependent?\n    if( elim_j != -1 )\n    {\n      // get elim variable value\n      double elim_val_cur = _constraints(i, elim_j);\n\n      // copy col\n      CVector col = constraints_c.col(elim_j);\n\n      // iterate over column\n      typename gmm::linalg_traits<CVector>::const_iterator c_it   = gmm::vect_const_begin(col);\n      typename gmm::linalg_traits<CVector>::const_iterator c_end  = gmm::vect_const_end(col);\n\n      for(; c_it != c_end; ++c_it)\n\t//        if( c_it.index() > i)\n\tif( !row_visited[c_it.index()])\n        {\n\t  //          sw.start();\n          double val = -(*c_it)/elim_val_cur;\n          add_row_simultaneously( c_it.index(), val, gmm::mat_row(_constraints, i), _constraints, constraints_c);\n          // make sure the eliminated entry is 0 on all other rows and not 1e-17\n          _constraints( c_it.index(), elim_j) = 0;\n          constraints_c(c_it.index(), elim_j) = 0;\n\n\t  int cur_idx = c_it.index();\n\t  int cur_nnz = gmm::nnz( gmm::mat_row(_constraints,cur_idx));\n\t  if( _constraints(cur_idx,n_vars-1) != 0.0) --cur_nnz;\n\n\t  queue.update(cur_idx, cur_nnz);\n\n          // update linear transition of rhs\n          gmm::add(gmm::scaled(gmm::mat_row(rhs_update_table_.D_, i), val),\n                   gmm::mat_row(rhs_update_table_.D_, c_it.index()));\n        }\n    }\n  }\n  // // check result\n  // for(unsigned int i=0; i<row_visited.size(); ++i)\n  //   if( !row_visited[i])\n  //     std::cerr <<\"FAT ERROR: row \" << i << \" not visited...\\n\";\n  \n\n\n  // correct ordering\n  RMatrixT c_tmp(gmm::mat_nrows(_constraints), gmm::mat_ncols(_constraints));\n  gmm::copy(_constraints,c_tmp);\n  RowMatrix d_tmp(gmm::mat_nrows(rhs_update_table_.D_),gmm::mat_ncols(rhs_update_table_.D_));\n  gmm::copy(rhs_update_table_.D_,d_tmp);\n\n  // std::vector<int> elim_temp2(_c_elim);\n  // std::sort(elim_temp2.begin(), elim_temp2.end());\n  // std::cerr << elim_temp2 << std::endl;\n\n\n  std::vector<int> elim_temp(_c_elim);\n  _c_elim.resize(0); _c_elim.resize( elim_temp.size(),-1);\n\n  for(unsigned int i=0; i<nr; ++i)\n  {\n    gmm::copy(gmm::mat_row(c_tmp,row_ordering[i]), gmm::mat_row(_constraints,i));\n    gmm::copy(gmm::mat_row(d_tmp,row_ordering[i]), gmm::mat_row(rhs_update_table_.D_,i));\n\n    _c_elim[i] = elim_temp[row_ordering[i]];\n  }\n\n  // // hack\n  // elim_temp = _c_elim;\n  // std::sort(elim_temp.begin(), elim_temp.end());\n  // std::cerr << elim_temp << std::endl;\n\n  // std::sort(row_ordering.begin(), row_ordering.end());\n  // std::cerr << \"row ordering: \" << row_ordering << std::endl;\n}\n\n\n//-----------------------------------------------------------------------------\n\ntemplate<class RMatrixT>\nbool\nConstrainedSolver::\nupdate_constraint_gcd( RMatrixT& _constraints, \n                       int _row_i, \n                       int& _elim_j,\n                       std::vector<int>& _v_gcd,\n                       int& _n_ints)\n{\n  // find gcd\n  double i_gcd = find_gcd(_v_gcd, _n_ints);\n\n  if( fabs(i_gcd) == 1.0)\n    return false;\n  \n  // divide by gcd\n  typedef typename gmm::linalg_traits<RMatrixT>::const_sub_row_type CRowT;\n  typedef typename gmm::linalg_traits<CRowT>::const_iterator        RIter;\n\n  // get current constraint row\n  RIter row_it    = gmm::vect_const_begin( gmm::mat_const_row( _constraints, _row_i));\n  RIter row_end   = gmm::vect_const_end( gmm::mat_const_row( _constraints, _row_i));\n\n  for( ; row_it!=row_end; ++row_it)\n  {\n    int cur_j = row_it.index();\n    _constraints(_row_i, cur_j) = (*row_it)/i_gcd;\n  }\n  int elim_coeff = abs(_constraints(_row_i, _elim_j));\n  if( elim_coeff != 1)\n    std::cerr << __FUNCTION__ << \" Error: elimination coefficient \" << elim_coeff << \" will (most probably) NOT lead to an integer solution!\" << std::endl;\n  return true;\n}\n\n//-----------------------------------------------------------------------------\n\ntemplate<class SVector1T, class SVector2T, class VectorIT, class SVector3T>\nvoid \nConstrainedSolver::\neliminate_constraints( \n    gmm::row_matrix<SVector1T>& _constraints,\n    gmm::row_matrix<SVector2T>& _B, \n    VectorIT&                   _idx_to_round,\n    std::vector<int>&           _c_elim,\n    std::vector<int>&           _new_idx,\n    gmm::col_matrix<SVector3T>& _Bcol)\n{\n  // copy into column matrix\n  gmm::resize(_Bcol, gmm::mat_nrows(_B), gmm::mat_ncols(_B));\n  gmm::copy( _B, _Bcol);\n\n  // store columns which should be eliminated\n  std::vector<int> elim_cols;\n  elim_cols.reserve( _c_elim.size());\n\n  for(unsigned int i=0; i<_c_elim.size(); ++i)\n  {\n    int cur_j = _c_elim[i];\n\n    if( cur_j != -1)\n    {\n      double cur_val = _constraints(i,cur_j);\n\n      // store index\n      elim_cols.push_back(_c_elim[i]);\n\n      // copy col\n      SVector3T col = _Bcol.col(cur_j);\n\n      // iterate over column\n      typename gmm::linalg_traits<SVector3T>::const_iterator c_it   = gmm::vect_const_begin(col);\n      typename gmm::linalg_traits<SVector3T>::const_iterator c_end  = gmm::vect_const_end(col);\n\n      for(; c_it != c_end; ++c_it)\n        add_row( c_it.index(), -(*c_it)/cur_val, gmm::mat_row(_constraints, i), _Bcol);\n    }\n  }\n\n  // eliminate columns\n  eliminate_columns( _Bcol, elim_cols);\n\n  // TODO FIXME Size -1 ?!?!\n  // init _new_idx vector\n  _new_idx.resize(gmm::mat_ncols(_constraints));\n  for(unsigned int i=0; i<_new_idx.size(); ++i)\n    _new_idx[i] = i;\n\n  // update _new_idx w.r.t. eliminated cols\n  COMISO_GMM::eliminate_vars_idx( elim_cols, _new_idx, -1);\n\n  // update _idx_to_round (in place)\n  std::vector<int> round_old(_idx_to_round);\n  unsigned int wi = 0;\n  for(unsigned int i=0; i<_idx_to_round.size(); ++i)\n  {\n    if(_new_idx[ _idx_to_round[i]] != -1)\n    {\n      _idx_to_round[wi] = _new_idx[_idx_to_round[i]];\n      ++wi;\n    }\n  }\n  \n  // resize, sort and make unique\n  _idx_to_round.resize(wi);\n\n  std::sort(_idx_to_round.begin(), _idx_to_round.end());\n  _idx_to_round.resize( std::unique(_idx_to_round.begin(), _idx_to_round.end()) -_idx_to_round.begin());\n\n\n  if( noisy_ > 2 )\n  {\n    std::cerr << __FUNCTION__ << \"remaining         variables: \" << gmm::mat_ncols(_Bcol) << std::endl;\n    std::cerr << __FUNCTION__ << \"remaining integer variables: \" << _idx_to_round.size() << std::endl;\n    std::cerr << __FUNCTION__ << std::endl;\n  }\n}\n\n\n//-----------------------------------------------------------------------------\n\n\ntemplate<class SVector1T, class SVector2T, class VectorIT, class CSCMatrixT>\nvoid \nConstrainedSolver::\neliminate_constraints(\n    gmm::row_matrix<SVector1T>& _constraints,\n    gmm::col_matrix<SVector2T>& _A, \n    std::vector<double>&        _x, \n    std::vector<double>&        _rhs, \n    VectorIT&                   _idx_to_round,\n    std::vector<int>&           _v_elim,\n    std::vector<int>&           _new_idx,\n    CSCMatrixT&                 _Acsc)\n{\n  COMISO::StopWatch sw;\n  sw.start();\n  // define iterator on matrix A and on constraints C\n  typedef typename gmm::linalg_traits<SVector2T>::const_iterator  AIter;\n  typedef typename gmm::linalg_traits<SVector1T>::const_iterator  CIter;\n\n  // store variable indices to be eliminated\n  std::vector<int> elim_varids;\n  elim_varids.reserve( _v_elim.size());\n\n  rhs_update_table_.clear();\n  std::vector<double> constraint_rhs_vec(_constraints.nrows());\n\n  for( unsigned int i=0; i < _v_elim.size(); ++i)\n  {\n    int cur_j = _v_elim[i];\n\n    if( cur_j != -1)\n    {\n      double cur_val = _constraints(i, cur_j);\n\n      // store index\n      elim_varids.push_back(cur_j);\n      rhs_update_table_.add_elim_id(cur_j);\n\n      // copy col\n      SVector2T col ( _A.col( cur_j));\n\n      // get a reference to current constraint vector \n      SVector1T& constraint( _constraints.row(i));\n\n      // add cur_j-th row multiplied with constraint[k] to each row k\n      // iterator of matrix column\n      AIter col_it, col_end;\n      \n      // constraint rhs\n      double constraint_rhs = constraint[ constraint.size()-1];\n      constraint_rhs_vec[i] = -constraint_rhs;\n\n      //std::cerr << \"constraint_rhs \" << constraint_rhs << std::endl;\n      // temporarliy set last element to zero (to avoid iterator finding it)\n      constraint[ constraint.size()-1] = 0;\n\n      double cur_rhs = _rhs[cur_j];\n\n      // iterator of constraint\n      CIter con_it  = gmm::vect_const_begin( constraint);\n      CIter con_end = gmm::vect_const_end( constraint);\n\n      // loop over all constraint entries over all column entries\n      // should not hit last element (rhs) since set to zero\n      for ( ; con_it != con_end; ++con_it )\n      {\n        col_it  = gmm::vect_const_begin( col );\n        col_end = gmm::vect_const_end( col );\n        for ( ; col_it != col_end; ++col_it )\n          _A( con_it.index(), col_it.index() ) -= ( *col_it )*(( *con_it )/cur_val);\n\n        //_rhs[con_it.index()] -= cur_rhs * (( *con_it )/cur_val);\n//        rhs_update_table_.append(con_it.index(), -1.0 * (( *con_it )/cur_val), cur_j);\n        rhs_update_table_.append(con_it.index(), -1.0 * (( *con_it )/cur_val), cur_j, false);\n        //std::cerr << con_it.index() << \" += \" << -1.0*(( *con_it )/cur_val) << \" * \" << cur_rhs << \" ([\"<<cur_j<<\"] = \"<<_rhs[cur_j]<<\") \" << std::endl;\n      }\n\n      // TODO FIXME must use copy col (referens sometimes yields infinite loop below no col_it++?!?)\n      SVector2T col_ref = _A.col(cur_j);\n      \n      // add cur_j-th col multiplied with condition[k] to each col k\n      col_it  = gmm::vect_const_begin( col_ref );\n      col_end = gmm::vect_const_end( col_ref );\n\n      // loop over all column entries and over all constraint entries\n      for ( ; col_it != col_end; ++col_it )\n      {\n        con_it  = gmm::vect_const_begin( constraint );\n        con_end = gmm::vect_const_end( constraint );\n\n        for ( ; con_it != con_end; ++con_it )\n          _A( col_it.index(), con_it.index() ) -= ( *col_it )*(( *con_it )/cur_val);\n        //_rhs[col_it.index()] += constraint_rhs*( *col_it )/cur_val;\n//        rhs_update_table_.append(col_it.index(), constraint_rhs*( *col_it )/cur_val);\n        rhs_update_table_.append(col_it.index(), -( *col_it )/cur_val, i, true);\n        //std::cerr << col_it.index() << \" += \" << constraint_rhs*( *col_it )/cur_val << std::endl;\n      }\n\n      // reset last constraint entry to real value\n      constraint[ constraint.size()-1] = constraint_rhs;\n    }\n  }\n\n  // cache current rhs's\n  rhs_update_table_.cur_constraint_rhs_ = constraint_rhs_vec;\n  rhs_update_table_.cur_rhs_            = _rhs;\n  // apply transformation due to elimination\n  rhs_update_table_.apply(constraint_rhs_vec, _rhs);\n\n  if( noisy_ > 2)\n    std::cerr << __FUNCTION__ << \" Constraints integrated \" << sw.stop()/1000.0 << std::endl;\n\n  // eliminate vars\n  _Acsc.init_with_good_format(_A);\n  sw.start();\n  std::vector< double > elim_varvals( elim_varids.size(), 0);\n  COMISO_GMM::eliminate_csc_vars2( elim_varids, elim_varvals, _Acsc, _x, _rhs);\n\n  if( noisy_ > 2)\n    std::cerr << __FUNCTION__ << \" Constraints eliminated \" << sw.stop()/1000.0 << std::endl;\n  sw.start();\n  // init _new_idx vector\n//  _new_idx.resize( gmm::mat_ncols(_constraints));\n  _new_idx.resize( gmm::mat_ncols(_A)+1);\n  for( unsigned int i=0; i<_new_idx.size(); ++i)\n    _new_idx[i] = i;\n\n  // update _new_idx w.r.t. eliminated cols\n  COMISO_GMM::eliminate_vars_idx( elim_varids, _new_idx, -1);\n\n  // update _idx_to_round (in place)\n  unsigned int wi = 0;\n  for( unsigned int i=0; i<_idx_to_round.size(); ++i)\n  {\n    if(_new_idx[ _idx_to_round[i]] != -1)\n    {\n      _idx_to_round[wi] = _new_idx[_idx_to_round[i]];\n      ++wi;\n    }\n  }\n\n  // resize, sort and make unique\n  _idx_to_round.resize(wi);\n\n  std::sort(_idx_to_round.begin(), _idx_to_round.end());\n  _idx_to_round.resize( std::unique(_idx_to_round.begin(), _idx_to_round.end()) -_idx_to_round.begin());\n\n  if( noisy_ > 2)\n    std::cerr << __FUNCTION__ << \"Indices reindexed \" << sw.stop()/1000.0 << std::endl << std::endl;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\ntemplate<class RowT, class MatrixT>\nvoid \nConstrainedSolver::\nadd_row( int       _row_i,\n\t double    _coeff,\n\t RowT      _row, \n\t MatrixT&  _mat )\n{\n  typedef typename gmm::linalg_traits<RowT>::const_iterator RIter;\n  RIter r_it  = gmm::vect_const_begin(_row);\n  RIter r_end = gmm::vect_const_end(_row);\n\n  for(; r_it!=r_end; ++r_it)\n    _mat(_row_i, r_it.index()) += _coeff*(*r_it);\n}\n\n\n//-----------------------------------------------------------------------------\n\n\ntemplate<class RowT, class RMatrixT, class CMatrixT>\nvoid \nConstrainedSolver::\nadd_row_simultaneously(\tint       _row_i,\n\t\t\tdouble    _coeff,\n\t\t\tRowT      _row, \n\t\t\tRMatrixT& _rmat,\n\t\t\tCMatrixT& _cmat )\n{\n  typedef typename gmm::linalg_traits<RowT>::const_iterator RIter;\n  RIter r_it  = gmm::vect_const_begin(_row);\n  RIter r_end = gmm::vect_const_end(_row);\n\n  for(; r_it!=r_end; ++r_it)\n  {\n    _rmat(_row_i, r_it.index()) += _coeff*(*r_it);\n    _cmat(_row_i, r_it.index()) += _coeff*(*r_it);\n    //    if( _rmat(_row_i, r_it.index())*_rmat(_row_i, r_it.index()) < epsilon_squared_ )\n    if( fabs(_rmat(_row_i, r_it.index())) < epsilon_ )\n    {\n      _rmat(_row_i, r_it.index()) = 0.0;\n      _cmat(_row_i, r_it.index()) = 0.0;\n    }\n  }\n}\n\n\n//-----------------------------------------------------------------------------\n\n\ntemplate<class CMatrixT, class VectorT, class VectorIT>\ndouble \nConstrainedSolver::\nsetup_and_solve_system( CMatrixT& _B,\n\t\t\tVectorT&  _x,\n\t\t\tVectorIT& _idx_to_round,\n\t\t\tdouble    _reg_factor,\n\t\t\tbool      _show_miso_settings)\n{\n  // show options dialog\n  if( _show_miso_settings)\n    miso_.show_options_dialog();\n\n  COMISO::StopWatch s1;\n  COMISO::StopWatch sw; sw.start();\n  unsigned int m = gmm::mat_nrows(_B);\n  unsigned int n = gmm::mat_ncols(_B);\n\n  s1.start();\n  // set up B transposed\n  CMatrixT Bt;\n  gmm::resize( Bt, n, m);\n  gmm::copy( gmm::transposed( _B), Bt);\n  if( noisy_ > 1 )\n    std::cerr << __FUNCTION__ << \" Bt took \" << s1.stop()/1000.0 << std::endl;\n  s1.start();\n\n  // setup BtB\n  CMatrixT BtB;\n  gmm::resize( BtB, n, n);\n  gmm::mult( Bt, _B, BtB);\n  if( noisy_ > 1 )\n    std::cerr << __FUNCTION__ << \" BtB took \" << s1.stop()/1000.0 << std::endl;\n  s1.start();\n\n  // extract rhs\n  std::vector< double > rhs( n);\n  gmm::copy( gmm::scaled(gmm::mat_const_col( BtB, n - 1),-1.0), rhs);\n  rhs.resize( n - 1);\n\n  if( noisy_ > 1)\n    std::cerr << __FUNCTION__ << \" rhs extract resize \" << s1.stop()/1000.0 << std::endl;\n  s1.start();\n\n  // resize BtB to only contain the actual system matrix (and not the rhs)\n  gmm::resize( BtB, n - 1, n - 1);\n\n  if( noisy_ > 1)\n    std::cerr << __FUNCTION__ << \" BtB resize took \" << s1.stop()/1000.0 << std::endl;\n  s1.start();\n  _x.resize( n - 1);\n  if( noisy_ > 1)\n    std::cerr << __FUNCTION__ << \" x resize took \" << s1.stop()/1000.0 << std::endl;\n\n  // regularize if necessary\n  if(_reg_factor != 0.0)\n    COMISO_GMM::regularize_hack(BtB, _reg_factor);\n  s1.start();\n\n  // BtB -> CSC\n  CSCMatrix BtBCSC;\n  BtBCSC.init_with_good_format( BtB);\n\n  if( noisy_ > 1)\n    std::cerr << __FUNCTION__ << \" CSC init \" << s1.stop()/1000.0 << std::endl;\n  double setup_time = sw.stop()/1000.0;\n  \n\n  COMISO::StopWatch misw;\n  misw.start();\n  // miso solve\n  miso_.solve( BtBCSC, _x, rhs, _idx_to_round);\n  if( noisy_ > 1)\n  std::cerr << __FUNCTION__ << \" Miso Time \" << misw.stop()/1000.0 << \"s.\" << std::endl << std::endl;\n  return setup_time;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\ntemplate<class RMatrixT, class VectorT >\nvoid \nConstrainedSolver::\nrestore_eliminated_vars( RMatrixT&         _constraints,\n\t\t\t VectorT&          _x,\n\t\t\t std::vector<int>& _c_elim,\n\t\t\t std::vector<int>& _new_idx)\n{\n  // restore original ordering of _x\n  _x.resize(_new_idx.size());\n  // last variable is the constant term 1.0\n  _x.back() = 1.0;\n\n  // reverse iterate from prelast element\n  for(int i=_new_idx.size()-2; i>= 0; --i)\n  {\n    if( _new_idx[i] != -1)\n    {\n      // error handling\n      if( i < _new_idx[i] && noisy_ > 0) std::cerr << \"Warning: UNSAFE Ordering!!!\\n\";\n\n      _x[i] = _x[_new_idx[i]];\n    }\n  }\n\n  // reverse iterate\n  for(int i=_c_elim.size()-1; i>=0; --i)\n  {\n    int cur_var = _c_elim[i];\n\n    if( cur_var != -1)\n    {\n      // get variable value and set to zero\n      double cur_val = _constraints(i, cur_var);\n\n      //_constraints(i, cur_var) = 0.0;\n      //_x[cur_var] = -gmm::vect_sp(_x, _constraints.row(i))/cur_val;\n      //reformulated to keep _constraints intact for further use:\n      _x[cur_var] -= gmm::vect_sp(_x, _constraints.row(i))/cur_val;\n\n    }\n  }\n\n  // resize\n  _x.resize(_x.size()-1);\n}\n\n\n//-----------------------------------------------------------------------------\n\n\ntemplate<class RMatrixT, class VectorT, class VectorIT >\nvoid \nConstrainedSolver::\nverify_mi_factored( const RMatrixT& _conditions,\n\t\t    const RMatrixT& _B, \n\t\t    const VectorT&  _x,\n\t\t    const VectorIT& _idx_to_round )\n{\n  std::cerr << \"######### Verify Constrained Solver Result ############\\n\";\n\n  // create extended x vector\n  std::vector<double> x(_x);\n  x.resize(x.size()+1);\n  x.back() = 1.0;\n\n  // verify conditions\n  std::vector<double> a(gmm::mat_nrows(_conditions));\n\n  gmm::mult(_conditions, x, a);\n\n  int conditions_not_ok = 0;\n  for(unsigned int i=0; i<a.size(); ++i)\n    if( a[i] > 1e-6)\n    {\n      ++conditions_not_ok;\n    }\n\n  if( conditions_not_ok == 0)\n    std::cerr << \"all conditions are ok!\\n\";\n  else\n    std::cerr << conditions_not_ok \n\t      << \" conditions are not fullfilled: \" \n\t      << std::endl;\n\n  // verify rounding\n  int roundings_not_ok = 0;\n  for(unsigned int i=0; i<_idx_to_round.size(); ++i)\n  {\n    double d = _x[_idx_to_round[i]];\n    if( fabs(d-round(d)) > 1e-6)\n      ++roundings_not_ok;\n  }\n  \n  if( roundings_not_ok)\n    std::cerr << roundings_not_ok << \" Integer variables are not rounded\\n\";\n  else\n    std::cerr << \"all Integer roundings are ok\\n\";\n\n  // evaluate energy\n  VectorT Bx(x);\n  gmm::mult(_B, x, Bx);\n  std::cerr << \"Total energy: \" << gmm::vect_sp(Bx, Bx) << std::endl;\n\n  std::cerr << \"######### FINISHED ############\\n\";\n}\n\n\n\n//-----------------------------------------------------------------------------\n\n\ntemplate<class RMatrixT, class CMatrixT, class VectorT>\ndouble \nConstrainedSolver::verify_constrained_system( \n    const RMatrixT& _conditions,\n    const CMatrixT& _A,\n    const VectorT&  _x,\n    const VectorT&  _rhs,\n    double          _eps)\n{\n  typedef typename gmm::linalg_traits<RMatrixT>::const_sub_row_type RowT;\n  typedef typename gmm::linalg_traits<RowT>::const_iterator RIter;\n\n  VectorT Ax( _x.size());\n  gmm::mult(_A, _x, Ax);\n\n  gmm::add(_rhs, gmm::scaled(Ax, -1.0), Ax);\n  double norm = gmm::vect_norm2(Ax);\n  //std::cerr << __FUNCTION__ << \": Error residual: \" << norm << \" vector : \" << Ax << std::endl;\n\n  std::cerr << __FUNCTION__ << \": Checking constraints...\" << std::endl;\n\n  unsigned int row_cond = gmm::mat_nrows( _conditions);\n  unsigned int col_cond = gmm::mat_ncols( _conditions);\n  bool all_conditions_ok = true;\n  for( unsigned int r = 0; r < row_cond; ++r)\n  {\n    double cond_value = 0.0;\n    RowT row      = gmm::mat_const_row( _conditions, r);\n    RIter row_it  = gmm::vect_const_begin( row);\n    RIter row_end = gmm::vect_const_end( row);\n    //std::cerr << \"\\t checking row : \" << row << std::endl;\n\n    for( ; row_it != row_end; ++row_it)\n    {\n      if( row_it.index() == col_cond -1)\n        cond_value += (*row_it);\n      else\n        cond_value += _x[row_it.index()]*(*row_it);\n    }\n    //std::cerr << \"\\t Value is : \" << cond_value << std::endl;\n    //std::cerr << \"--- --- --- --- ---\\n\";\n    if( fabs(cond_value) > _eps)\n    {\n      std::cerr << \"\\t Error on row \" << r << \" with vector \" << row << \" and condition value \" << cond_value << std::endl;\n      all_conditions_ok = false;\n    }\n  }\n  std::cerr << __FUNCTION__ << (all_conditions_ok? \": All conditions ok!\" : \": Some conditions not ok!\") << std::endl;\n  return norm;\n}\n\n//-----------------------------------------------------------------------------\n\n\ntemplate<class RMatrixT, class CMatrixT, class VectorT, class VectorIT>\ndouble\nConstrainedSolver::\nverify_constrained_system_round( \n              const RMatrixT& _conditions,\n              const CMatrixT& _A,\n              const VectorT&  _x,\n              const VectorT&  _rhs,\n              const VectorIT& _idx_to_round,\n\t      double          _eps)\n{\n  // test integer roundings\n  std::cerr << __FUNCTION__ << \": Testing integer roundings...\" << std::endl;\n  bool all_roundings_ok = true;\n\n  for( unsigned int i = 0; i < _idx_to_round.size(); ++i)\n    if(fabs(ROUND(_x[_idx_to_round[i]])-_x[_idx_to_round[i]]) != 0.0)\n    {\n      std::cerr << \"\\t Warning: variable \" << _idx_to_round[i] << \" was not rounded!\" << \" Value is = \" << _x[_idx_to_round[i]] << std::endl;\n      all_roundings_ok = false;\n    }\n  std::cerr << __FUNCTION__ << (all_roundings_ok? \": All roundings ok!\" : \": Some roundings not ok!\") << std::endl;\n\n  // also test other stuff\n  return verify_constrained_system(_conditions, _A, _x, _rhs, _eps);\n}\n\n//-----------------------------------------------------------------------------\n\n\ntemplate<class CMatrixT>\nvoid \nConstrainedSolver::eliminate_columns( CMatrixT& _M,\n\t\t\t\t      const std::vector< int >& _columns)\n{\n  // nothing to do?\n  if( _columns.size() == 0) return;\n\n  // eliminate columns in place by first copying to the right place\n  // and a subsequent resize\n  std::vector< int > columns( _columns);\n  std::sort( columns.begin(), columns.end());\n\n  std::vector< int >::iterator col_it  = columns.begin();\n  std::vector< int >::iterator col_end = columns.end();\n\n  int next_i = *col_it;\n  for( int i = *col_it; i < (int)_M.ncols(); ++i)\n  {\n    if( col_it != col_end && i == *col_it)\n    {\n      ++col_it;\n    }\n    else\n    {\n      _M.col(next_i) = _M.col(i);\n      ++next_i;\n    }\n  }\n  gmm::resize( _M, _M.nrows(), _M.ncols() - columns.size());\n}\n\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n"
  },
  {
    "path": "libs/CoMISo/Solver/EigenLDLTSolver.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               CoMISo                                      *\n *      Copyright (C) 2008-2009 by Computer Graphics Group, RWTH Aachen      *\n *                           www.rwth-graphics.de                            *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of CoMISo.                                             *\n *                                                                           *\n *  CoMISo 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 *  CoMISo 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 CoMISo.  If not, see <http://www.gnu.org/licenses/>.          *\n *                                                                           *\n\\*===========================================================================*/ \n\n\n\n#include \"EigenLDLTSolver.hh\"\n\n//== COMPILE-TIME PACKAGE REQUIREMENTS ========================================\n#if (COMISO_Eigen3_AVAILABLE)\n//== INCLUDES =================================================================\n\nnamespace COMISO {\n\n  EigenLDLTSolver::EigenLDLTSolver() : n_(0)\n{\n\n}\n\n\n  //-----------------------------------------------------------------------------\n  \n\n  EigenLDLTSolver::~EigenLDLTSolver()\n{\n}\n  \n\n//-----------------------------------------------------------------------------\n\n\nbool EigenLDLTSolver::calc_system( const std::vector<int>&    _colptr,\n\t\t\t\t const std::vector<int>&    _rowind, \n\t\t\t\t const std::vector<double>& _values)\n{\n  std::cerr << \"Info: EigenLDLTSolver::calc_system( const std::vector<int> ...) not implemented yet...\" << std::endl;\n  return false;\n}\n\n\n  //-----------------------------------------------------------------------------\n\n    \nbool EigenLDLTSolver::update_system( const std::vector<int>& _colptr,\n\t\t\t\t     const std::vector<int>& _rowind,\n\t\t\t\t     const std::vector<double>& _values )\n{\n  std::cerr << \"Info: EigenLDLTSolver::update_system( const std::vector<int> ...) not implemented yet...\" << std::endl;\n  return false;\n}\n\n\n//-----------------------------------------------------------------------------\n  \n\nbool EigenLDLTSolver::solve( double * _x, double * _b)\n{\n  // map arrays to Eigen-Vectors\n  Eigen::Map<Eigen::VectorXd> x(_x,n_);\n  Eigen::Map<Eigen::VectorXd> b(_b,n_);\n\n  // solve for another right hand side:\n  x = ldlt_.solve(b);\n\n  return (ldlt_.info()==Eigen::Success);\n}\n\n\n//-----------------------------------------------------------------------------\n\nint EigenLDLTSolver::dimension()\n{\n  return n_;\n}\n\n//-----------------------------------------------------------------------------\n\nbool EigenLDLTSolver::\nsolve ( std::vector<double>& _x0, std::vector<double>& _b)\n{\n  return solve( &(_x0[0]), &(_b[0]));\n}\n\n//-----------------------------------------------------------------------------\n\nbool& EigenLDLTSolver::\nshow_timings()\n{\n  return show_timings_;\n}\n\n\n}\n\n//=============================================================================\n#endif // COMISO_Eigen3_AVAILABLE\n//============================================================================="
  },
  {
    "path": "libs/CoMISo/Solver/EigenLDLTSolver.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               CoMISo                                      *\n *      Copyright (C) 2008-2009 by Computer Graphics Group, RWTH Aachen      *\n *                           www.rwth-graphics.de                            *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of CoMISo.                                             *\n *                                                                           *\n *  CoMISo 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 *  CoMISo 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 CoMISo.  If not, see <http://www.gnu.org/licenses/>.          *\n *                                                                           *\n\\*===========================================================================*/ \n\n\n//=============================================================================\n//\n//  CLASS CholmodSolver\n//\n//=============================================================================\n\n#ifndef COMISO_EIGEN_LDLT_SOLVER_HH\n#define COMISO_EIGEN_LDLT_SOLVER_HH\n\n\n//== COMPILE-TIME PACKAGE REQUIREMENTS ========================================\n#include <CoMISo/Config/config.hh>\n#if (COMISO_Eigen3_AVAILABLE)\n//== INCLUDES =================================================================\n\n\n#include <CoMISo/Config/CoMISoDefines.hh>\n#include <CoMISo/Utils/StopWatch.hh>\n\n#include <iostream>\n#include <vector>\n\n\n#include <Eigen/Eigen>\n#include <Eigen/Sparse>\n#include <Eigen/SparseCholesky>\n\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== CLASS DEFINITION =========================================================\nclass COMISODLLEXPORT EigenLDLTSolver\n{\npublic:\n\n    // _size is maximal size this instance can handle (smaller problems are possible!!!)\n  EigenLDLTSolver();\n  ~EigenLDLTSolver();\n    \n    bool calc_system( const std::vector<int>&    _colptr,\n\t\t      const std::vector<int>&    _rowind,\n\t\t      const std::vector<double>& _values );\n\n\n    template< class GMM_MatrixT>\n    bool calc_system_gmm( const GMM_MatrixT& _mat);\n\n    template< class Eigen_MatrixT>\n    bool calc_system_eigen( const Eigen_MatrixT& _mat);\n\n\n    bool update_system( const std::vector<int>&    _colptr,\n \t\t\tconst std::vector<int>&    _rowind,\n \t\t\tconst std::vector<double>& _values );\n\n\n    template< class GMM_MatrixT>\n    bool update_system_gmm( const GMM_MatrixT& _mat);\n\n    template< class Eigen_MatrixT>\n    bool update_system_eigen( const Eigen_MatrixT& _mat);\n\n\n    bool solve ( double *             _x0, double *             _b);\n\n    bool solve ( std::vector<double>& _x0, std::vector<double>& _b);\n\n    bool& show_timings();\n    \n    int dimension();\n    \nprivate:\n\n    // dimension n_\n    unsigned int n_;\n\n    Eigen::SimplicialLDLT<Eigen::SparseMatrix<double> > ldlt_;\n\n    bool show_timings_;\n    StopWatch sw_;\n};\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n#if defined(INCLUDE_TEMPLATES) && !defined(COMISO_EIGEN_LDLT_SOLVER_TEMPLATES_C)\n#define COMISO_EIGEN_LDLT_SOLVER_TEMPLATES\n#include \"EigenLDLTSolverT.cc\"\n#endif\n//=============================================================================\n#endif // COMISO_Eigen3_AVAILABLE\n//=============================================================================\n#endif // COMISO_EIGEN_LDLT_SOLVER_HH defined\n//=============================================================================\n"
  },
  {
    "path": "libs/CoMISo/Solver/EigenLDLTSolverT.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               CoMISo                                      *\n *      Copyright (C) 2008-2009 by Computer Graphics Group, RWTH Aachen      *\n *                           www.rwth-graphics.de                            *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of CoMISo.                                             *\n *                                                                           *\n *  CoMISo 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 *  CoMISo 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 CoMISo.  If not, see <http://www.gnu.org/licenses/>.          *\n *                                                                           *\n\\*===========================================================================*/ \n\n//== COMPILE-TIME PACKAGE REQUIREMENTS ========================================\n#include <CoMISo/Config/config.hh>\n#if (COMISO_Eigen3_AVAILABLE)\n//== INCLUDES =================================================================\n\n#define COMISO_EIGEN_LDLT_SOLVER_TEMPLATES_C\n\n#include <CoMISo/Solver/GMM_Tools.hh>\n#include <CoMISo/Solver/Eigen_Tools.hh>\n#include <CoMISo/Solver/EigenLDLTSolver.hh>\n\n\nnamespace COMISO {\n\n\ntemplate< class GMM_MatrixT>\nbool EigenLDLTSolver::calc_system_gmm( const GMM_MatrixT& _mat)\n{\n  if(show_timings_) sw_.start();\n\n  Eigen::SparseMatrix<double> E;\n  COMISO_EIGEN::gmm_to_eigen(_mat, E);\n\n  if(show_timings_)\n  {\n      std::cerr << \"EigenLDLT Timing GMM convert: \" << sw_.stop()/1000.0 << \"s\\n\";\n      std::cerr << \"#nnz: \" << E.nonZeros() << std::endl;\n  }\n\n  return calc_system_eigen( E);\n}\n  \n\n//-----------------------------------------------------------------------------\n\n\ntemplate< class GMM_MatrixT>\nbool EigenLDLTSolver::update_system_gmm( const GMM_MatrixT& _mat)\n{\n  if(show_timings_) sw_.start();\n\n  Eigen::SparseMatrix<double> E;\n  COMISO_EIGEN::gmm_to_eigen(_mat, E);\n\n  if(show_timings_)\n  {\n      std::cerr << \"EigenLDLT Timing GMM convert: \" << sw_.stop()/1000.0 << \"s\\n\";\n      std::cerr << \"#nnz: \" << E.nonZeros() << std::endl;\n  }\n\n  return update_system_eigen( E);\n}\n\n//-----------------------------------------------------------------------------\n  \ntemplate< class Eigen_MatrixT>\nbool EigenLDLTSolver::calc_system_eigen( const Eigen_MatrixT& _mat)\n{\n    n_ = _mat.rows();\n\n    if(show_timings_) sw_.start();\n\n    ldlt_.compute(_mat);\n\n    if(show_timings_)\n    {\n      std::cerr << \"EigenLDLT Timing EIGEN compute: \" << sw_.stop()/1000.0 << \"s\\n\";\n    }\n\n    return (ldlt_.info()==Eigen::Success);\n}\n  \n//-----------------------------------------------------------------------------\n\ntemplate< class Eigen_MatrixT>\nbool EigenLDLTSolver::update_system_eigen( const Eigen_MatrixT& _mat)\n{\n  if(show_timings_) sw_.start();\n\n  ldlt_.factorize(_mat);\n\n  if(show_timings_)\n  {\n    std::cerr << \"EigenLDLT Timing EIGEN factorize: \" << sw_.stop()/1000.0 << \"s\\n\";\n  }\n\n  return (ldlt_.info()==Eigen::Success );\n}\n\n\n}\n\n//=============================================================================\n#endif // COMISO_Eigen3_AVAILABLE\n//=============================================================================\n"
  },
  {
    "path": "libs/CoMISo/Solver/Eigen_Tools.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               CoMISo                                      *\n *      Copyright (C) 2008-2009 by Computer Graphics Group, RWTH Aachen      *\n *                           www.rwth-graphics.de                            *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of CoMISo.                                             *\n *                                                                           *\n *  CoMISo 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 *  CoMISo 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 CoMISo.  If not, see <http://www.gnu.org/licenses/>.          *\n *                                                                           *\n\\*===========================================================================*/ \n\n\n\n//=============================================================================\n//\n//  CLASS Eigen_Tools - IMPLEMENTATION\n//\n//=============================================================================\n\n//== COMPILE-TIME PACKAGE REQUIREMENTS ========================================\n#include <CoMISo/Config/config.hh>\n#if COMISO_Eigen3_AVAILABLE\n\n\n#define COMISO_Eigen_TOOLS_C\n\n//== INCLUDES =================================================================\n\n#include \"Eigen_Tools.hh\"\n#include <queue>\n#include <CoMISo/Utils/StopWatch.hh>\n#include <CoMISo/Utils/VSToolsT.hh>\n#include <gmm/gmm.h>\n\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO_EIGEN\n{\n\n//== IMPLEMENTATION ==========================================================\n\n\n//-----------------------------------------------------------------------------\n\ntemplate<class MatrixT, class REALT, class INTT>\nvoid get_ccs_symmetric_data( const MatrixT&      _mat,\n                             const char          _uplo,\n                             std::vector<REALT>& _values,\n                             std::vector<INTT>&  _rowind,\n                             std::vector<INTT>&  _colptr )\n{\n  // Assumes col major\n  \n   int m = _mat.innerSize();\n   int n = _mat.outerSize();\n\n   _values.resize( 0 );\n   _rowind.resize( 0 );\n   _colptr.resize( 0 );\n\n   INTT iv( 0 );\n\n   typedef typename MatrixT::InnerIterator It;\n\n   switch ( _uplo )\n   {\n      case 'l':\n      case 'L':\n         // for all columns\n         for ( int i=0; i<n; ++i )\n         {\n            _colptr.push_back( iv );\n\n            // row it\n            It it(_mat, i);\n\n            for( ; it; ++it)\n            {\n              if( it.index() >= i )\n              {\n                _values.push_back( it.value());\n                _rowind.push_back( it.index());\n                ++iv;\n              }\n            }\n         }\n         _colptr.push_back( iv );\n         break;\n\n      case 'u':\n      case 'U':\n         // for all columns\n         for ( int i=0; i<n; ++i )\n         {\n            _colptr.push_back( iv );\n\n            // row it\n            It it(_mat, i);\n\n            for( ; it; ++it)\n            {\n              if( it.index() <= i )\n              {\n                _values.push_back( it.value());\n                _rowind.push_back( it.index());\n                ++iv;\n              }\n            }\n         }\n         _colptr.push_back( iv );\n         break;\n\n      case 'c':\n      case 'C':\n         // for all columns\n         for ( int i=0; i<n; ++i )\n         {\n            _colptr.push_back( iv );\n\n            // row it\n            It it(_mat, i);\n\n            for( ; it; ++it)\n            {\n              _values.push_back( it.value());\n              _rowind.push_back( it.index());\n              ++iv;\n            }\n         }\n         _colptr.push_back( iv );\n         break;\n\n      default:\n         std::cerr << \"ERROR: parameter uplo must bei either 'U' or 'L' or 'C'!!!\\n\";\n         break;\n   }\n}\n\n\n//-----------------------------------------------------------------------------\n\n\n// inspect the matrix: dimension, symmetry, zero_rows, zero_cols, nnz, max, min, max_abs, min_abs, NAN, INF\ntemplate<class MatrixT>\nvoid inspect_matrix( const MatrixT& _A)\n{\n\n\n  std::cerr << \"################### INSPECT MATRIX ##################\\n\";\n  std::cerr << \"#outer size  : \" << _A.outerSize() << std::endl;\n  std::cerr << \"#inner size  : \" << _A.innerSize() << std::endl;\n  std::cerr << \"#rows        : \" << _A.rows() << std::endl;\n  std::cerr << \"#cols        : \" << _A.cols() << std::endl;\n  std::cerr << \"#nonzeros    : \" << _A.nonZeros() << std::endl;\n  std::cerr << \"#nonzeros/row: \" << (double(_A.nonZeros())/double(_A.rows())) << std::endl;\n  std::cerr << \"symmetric    : \" << is_symmetric( _A) << std::endl;\n\n  MatrixT trans( _A.transpose());\n\n  int zero_rows = 0;\n  int zero_cols = 0;\n\n  for(int i=0; i<_A.outerSize(); ++i)\n  {\n    typename MatrixT::InnerIterator it(_A, i); \n    if( !it) ++zero_rows;\n  }\n\n  for(int i=0; i<trans.outerSize(); ++i)\n  {\n    typename MatrixT::InnerIterator it(trans, i); \n    if( !it) ++zero_cols;\n  }\n\n  std::cerr << \"zero rows    : \" << zero_rows << std::endl;\n  std::cerr << \"zero cols    : \" << zero_cols << std::endl;\n\n  typedef typename MatrixT::Scalar Scalar;\n  Scalar vmin     = std::numeric_limits<Scalar>::max();\n  Scalar vmax     = std::numeric_limits<Scalar>::min();\n  Scalar vmin_abs = std::numeric_limits<Scalar>::max();\n  Scalar vmax_abs = 0;\n\n  int n_nan = 0;\n  int n_inf = 0;\n  \n  // inspect elements\n  for(int i=0; i<_A.outerSize(); ++i)\n  {\n    typename MatrixT::InnerIterator it( _A, i);\n    \n    for(; it ; ++it)\n    {\n      if( it.value() < vmin ) vmin = it.value();\n      if( it.value() > vmax ) vmax = it.value();\n\n      if( fabs(it.value()) < vmin_abs) vmin_abs = fabs(it.value());\n      if( fabs(it.value()) > vmax_abs) vmax_abs = fabs(it.value());\n\n      if( std::isnan(it.value())) ++n_nan;\n      if( std::isinf(it.value())) ++n_inf;\n    }\n  }\n  \n  std::cerr << \"min  val     : \" << vmin << std::endl;\n  std::cerr << \"max  val     : \" << vmax << std::endl;\n  std::cerr << \"min |val|    : \" << vmin_abs << std::endl;\n  std::cerr << \"max |val|    : \" << vmax_abs << std::endl;\n  std::cerr << \"#nan         : \" << n_nan << std::endl;\n  std::cerr << \"#inf         : \" << n_inf << std::endl;\n  \n  std::cerr << \"min eval     : \" << \"...\" << std::endl;\n  std::cerr << \"max eval     : \" << \"...\" << std::endl;\n  std::cerr << \"min|eval|    : \" << \"...\" << std::endl;\n  std::cerr << \"max|eval|    : \" << \"...\" << std::endl;\n}\n\n//-----------------------------------------------------------------------------\n\n\n// symmetric ?\ntemplate<class MatrixT>\nbool is_symmetric( const MatrixT& _A)\n{\n  typedef typename MatrixT::InnerIterator It;\n  typedef typename MatrixT::Scalar Scalar;\n\n  int nouter( _A.outerSize());\n  int ninner( _A.innerSize());\n  \n  if( nouter != ninner )\n    return false;\n\n  bool symmetric(true);\n\n  for( int c = 0; c < nouter; ++c)\n  {\n    for( It it(_A,c); it; ++it)\n    {\n      int r(it.index());\n\n      Scalar val(it.value());\n\n      // find diagonal partner element\n      bool found(false);\n      for( It dit(_A,r); dit; ++dit)\n      {\n        if( dit.index() < c )\n        {}\n        else if( dit.index() == c)\n        {\n          if( dit.value() == val) \n            found = true;\n          break;\n        }\n        else \n        {\n          break;\n        }\n      }\n      if( !found) \n      {\n        symmetric = false;\n        break;\n      }\n    }\n  }\n  return symmetric;\n}\n\n//-----------------------------------------------------------------------------\n\n\ntemplate< class Eigen_MatrixT, class IntT >\nvoid permute( const Eigen_MatrixT& _QR, const std::vector< IntT>& _Pvec, Eigen_MatrixT& _A)\n{\n#ifdef COMISO_Eigen3_AVAILABLE\n  typedef typename Eigen_MatrixT::Scalar Scalar;\n\n  int m = _QR.innerSize();\n  int n = _QR.outerSize();\n  \n  if( _Pvec.size() == 0)\n  {\n    _A = _QR;\n    return;\n  }\n    \n  if( _Pvec.size() != (size_t)_QR.cols() && _Pvec.size() != 0)\n  {\n    std::cerr << __FUNCTION__ << \" wrong size of permutation vector, should have #cols length (or zero)\" << std::endl;\n  }\n\n  // build sparse permutation matrix\n  typedef Eigen::Triplet< Scalar > Triplet;\n  std::vector< Triplet > triplets;\n  triplets.reserve(_QR.nonZeros());\n  _A = Eigen_MatrixT( m, n);\n\n  typedef typename Eigen_MatrixT::InnerIterator It;\n\n  \n  for( int c = 0; c < n; ++c) // cols\n  {\n    for( It it(_QR,c); it; ++it) // rows\n    {\n      int r(it.index());\n\n      Scalar val(it.value());\n\n      int newcol( _Pvec[c]);\n\n      triplets.push_back( Triplet( r, newcol, val));\n    }\n  }\n  _A.setFromTriplets( triplets.begin(), triplets.end());\n#endif\n}\n\n//-----------------------------------------------------------------------------\n\n#if COMISO_SUITESPARSE_AVAILABLE\n\n/// Eigen to Cholmod_sparse interface\ntemplate<class MatrixT>\nvoid cholmod_to_eigen( const cholmod_sparse& _AC, MatrixT& _A)\n{\n#ifdef COMISO_Eigen3_AVAILABLE\n  // initialize dimensions\n  typedef typename MatrixT::Scalar Scalar;\n  typedef Eigen::Triplet< Scalar > Triplet;\n  size_t nzmax( _AC.nzmax);\n  std::cerr << __FUNCTION__ << \" row \" << _AC.nrow << \" col \" << _AC.ncol << \" stype \" << _AC.stype << std::endl;\n  _A = MatrixT(_AC.nrow, _AC.ncol);\n  std::vector< Triplet > triplets;\n  triplets.reserve(nzmax);\n\n  if(!_AC.packed)\n  {\n    std::cerr << \"Warning: \" << __FUNCTION__ << \" does not support unpacked matrices yet!!!\" << std::endl;\n    return;\n  }\n\n  // Pointer to data\n  double* X((double*)_AC.x);\n\n  // complete matrix stored\n  if(_AC.stype == 0)\n  {\n    // which integer type?\n    if(_AC.itype == CHOLMOD_LONG)\n    {\n      UF_long* P((UF_long*)_AC.p);\n      UF_long* I((UF_long*)_AC.i);\n\n      for(UF_long i=0; i<(UF_long)_AC.ncol; ++i)\n        for(UF_long j= P[i]; j< P[i+1]; ++j)\n          //_A( I[j], i) += X[j]; // += really needed?\n          triplets.push_back( Triplet( I[j], i, X[j]));\n    }\n    else\n    {\n      int* P((int*)_AC.p);\n      int* I((int*)_AC.i);\n\n      for(int i=0; i<(int)_AC.ncol; ++i)\n        for(int j= P[i]; j< P[i+1]; ++j)\n          triplets.push_back( Triplet( I[j], i, X[j]));\n      //_A( I[j], i) += X[j];\n    }\n\n  }\n  else // only upper or lower diagonal stored\n  {\n    // which integer type?\n    if(_AC.itype == CHOLMOD_LONG)\n    {\n      UF_long* P((UF_long*)_AC.p);\n      UF_long* I((UF_long*)_AC.i);\n\n      for(UF_long i=0; i<(UF_long)_AC.ncol; ++i)\n        for(UF_long j=P[i]; j<P[i+1]; ++j)\n        {\n          //_A(I[j], i) += X[j];\n          triplets.push_back( Triplet( I[j], i, X[j]));\n\n          // add up symmetric part\n          if( I[j] != i)\n            triplets.push_back( Triplet( i, I[j], X[j]));\n          //_A(i,I[j]) += X[j];\n        }\n    }\n    else\n    {\n      int* P((int*)_AC.p);\n      int* I((int*)_AC.i);\n\n      for(int i=0; i<(int)_AC.ncol; ++i)\n        for(int j=P[i]; j<P[i+1]; ++j)\n        {\n          //_A(I[j], i) += X[j];\n          triplets.push_back( Triplet( I[j], i, X[j]));\n\n          // add up symmetric part\n          if( I[j] != i)\n            //  _A(i,I[j]) += X[j];\n            triplets.push_back( Triplet( i, I[j], X[j]));\n        }\n    }\n  }\n  _A.setFromTriplets( triplets.begin(), triplets.end());\n#endif\n}\n\n\n/// GMM to Cholmod_sparse interface\ntemplate<class MatrixT>\nvoid eigen_to_cholmod( const MatrixT& _A, cholmod_sparse* &_AC, cholmod_common* _common, int _sparsity_type, bool _long_int)\n{\n  /* _sparsity_type\n          * 0:  matrix is \"unsymmetric\": use both upper and lower triangular parts\n          *     (the matrix may actually be symmetric in pattern and value, but\n          *     both parts are explicitly stored and used).  May be square or\n          *     rectangular.\n          * >0: matrix is square and symmetric, use upper triangular part.\n          *     Entries in the lower triangular part are ignored.\n          * <0: matrix is square and symmetric, use lower triangular part.\n          *     Entries in the upper triangular part are ignored. */\n\n  int m = _A.innerSize();\n  int n = _A.outerSize();\n\n  // get upper or lower\n  char uplo = 'c';\n  if(_sparsity_type < 0) uplo = 'l';\n  if(_sparsity_type > 0) uplo = 'u';\n\n\n  if( _long_int) // long int version\n  {\n    std::vector<double> values;\n    std::vector<UF_long> rowind;\n    std::vector<UF_long> colptr;\n\n    // get data of gmm matrix\n    COMISO_EIGEN::get_ccs_symmetric_data( _A, uplo, values, rowind, colptr);\n\n    // allocate cholmod matrix\n    _AC = cholmod_l_allocate_sparse(m,n,values.size(),true,true,_sparsity_type,CHOLMOD_REAL, _common);\n\n    // copy data to cholmod matrix\n    for(UF_long i=0; i<(UF_long)values.size(); ++i)\n    {\n      ((double*) (_AC->x))[i] = values[i];\n      ((UF_long*)(_AC->i))[i] = rowind[i];\n    }\n\n    for(UF_long i=0; i<(UF_long)colptr.size(); ++i)\n      ((UF_long*)(_AC->p))[i] = colptr[i];\n  }\n  else // int version\n  {\n     std::vector<double> values;\n     std::vector<int> rowind;\n     std::vector<int> colptr;\n\n     // get data of gmm matrix\n     COMISO_EIGEN::get_ccs_symmetric_data( _A, uplo, values, rowind, colptr);\n\n     // allocate cholmod matrix\n     _AC = cholmod_allocate_sparse(m,n,values.size(),true,true,_sparsity_type,CHOLMOD_REAL, _common);\n\n     // copy data to cholmod matrix\n     for(unsigned int i=0; i<values.size(); ++i)\n     {\n       ((double*)(_AC->x))[i] = values[i];\n       ((int*)   (_AC->i))[i] = rowind[i];\n     }\n     for(unsigned int i=0; i<colptr.size(); ++i)\n       ((int*)(_AC->p))[i] = colptr[i];\n  }\n\n}\n#endif\n\n/*\n/// Eigen to Cholmod_dense interface\ntemplate<class MatrixT>\nvoid cholmod_to_eigen_dense( const cholmod_dense& _AC, MatrixT& _A)\n{\n  // initialize dimensions\n  typedef typename MatrixT::Scalar Scalar;\n  typedef Eigen::Triplet< Scalar > Triplet;\n  size_t nzmax( _AC.nzmax);\n  _A = MatrixT(_AC.nrow, _AC.ncol);\n  std::vector< Triplet > triplets;\n  triplets.reserve(nzmax);\n\n  if(!_AC.packed)\n  {\n    std::cerr << \"Warning: \" << __FUNCTION__ << \" does not support unpacked matrices yet!!!\" << std::endl;\n    return;\n  }\n\n  // Pointer to data\n  double* X((double*)_AC.x);\n\n  // complete matrix stored\n  if(_AC.stype == 0)\n  {\n    // which integer type?\n    if(_AC.itype == CHOLMOD_LONG)\n    {\n      UF_long* P((UF_long*)_AC.p);\n      UF_long* I((UF_long*)_AC.i);\n\n      for(UF_long i=0; i<(UF_long)_AC.ncol; ++i)\n        for(UF_long j= P[i]; j< P[i+1]; ++j)\n          //_A( I[j], i) += X[j]; // += really needed?\n          triplets.push_back( Triplet( I[j], i, X[j]));\n    }\n    else\n    {\n      int* P((int*)_AC.p);\n      int* I((int*)_AC.i);\n\n      for(int i=0; i<(int)_AC.ncol; ++i)\n        for(int j= P[i]; j< P[i+1]; ++j)\n          triplets.push_back( Triplet( I[j], i, X[j]));\n      //_A( I[j], i) += X[j];\n    }\n\n  }\n  else // only upper or lower diagonal stored\n  {\n    // which integer type?\n    if(_AC.itype == CHOLMOD_LONG)\n    {\n      UF_long* P((UF_long*)_AC.p);\n      UF_long* I((UF_long*)_AC.i);\n\n      for(UF_long i=0; i<(UF_long)_AC.ncol; ++i)\n        for(UF_long j=P[i]; j<P[i+1]; ++j)\n        {\n          //_A(I[j], i) += X[j];\n          triplets.push_back( Triplet( I[j], i, X[j]));\n\n          // add up symmetric part\n          if( I[j] != i)\n            triplets.push_back( Triplet( i, I[j], X[j]));\n          //_A(i,I[j]) += X[j];\n        }\n    }\n    else\n    {\n      int* P((int*)_AC.p);\n      int* I((int*)_AC.i);\n\n      for(int i=0; i<(int)_AC.ncol; ++i)\n        for(int j=P[i]; j<P[i+1]; ++j)\n        {\n          //_A(I[j], i) += X[j];\n          triplets.push_back( Triplet( I[j], i, X[j]));\n\n          // add up symmetric part\n          if( I[j] != i)\n            //  _A(i,I[j]) += X[j];\n            triplets.push_back( Triplet( i, I[j], X[j]));\n        }\n    }\n  }\n  _A.setFromTriplets( triplets.begin(), triplets.end());\n}\n\n\n/// GMM to Cholmod_sparse interface\ntemplate<class MatrixT>\nvoid eigen_to_cholmod_dense( const MatrixT& _A, cholmod_dense* &_AC, cholmod_common* _common, bool _long_int)\n{\n  int m = _A.innerSize();\n  int n = _A.outerSize();\n\n  // allocate cholmod matrix\n  _AC = cholmod_l_allocate_sparse(m,n,values.size(),true,true,_sparsity_type,CHOLMOD_REAL, _common);\n  _AC = cholmod_l_allocate_dense (m,n,n, xtype, cc) \n\n  if( _long_int) // long int version\n  {\n    std::vector<double> values;\n    std::vector<UF_long> rowind;\n    std::vector<UF_long> colptr;\n\n    // get data of gmm matrix\n    COMISO_EIGEN::get_ccs_symmetric_data( _A, uplo, values, rowind, colptr);\n\n    // allocate cholmod matrix\n    _AC = cholmod_l_allocate_sparse(m,n,values.size(),true,true,_sparsity_type,CHOLMOD_REAL, _common);\n\n    // copy data to cholmod matrix\n    for(UF_long i=0; i<(UF_long)values.size(); ++i)\n    {\n      ((double*) (_AC->x))[i] = values[i];\n      ((UF_long*)(_AC->i))[i] = rowind[i];\n    }\n\n    for(UF_long i=0; i<(UF_long)colptr.size(); ++i)\n      ((UF_long*)(_AC->p))[i] = colptr[i];\n  }\n  else // int version\n  {\n     std::vector<double> values;\n     std::vector<int> rowind;\n     std::vector<int> colptr;\n\n     // get data of gmm matrix\n     COMISO_EIGEN::get_ccs_symmetric_data( _A, uplo, values, rowind, colptr);\n\n     // allocate cholmod matrix\n     _AC = cholmod_allocate_sparse(m,n,values.size(),true,true,_sparsity_type,CHOLMOD_REAL, _common);\n\n     // copy data to cholmod matrix\n     for(unsigned int i=0; i<values.size(); ++i)\n     {\n       ((double*)(_AC->x))[i] = values[i];\n       ((int*)   (_AC->i))[i] = rowind[i];\n     }\n     for(unsigned int i=0; i<colptr.size(); ++i)\n       ((int*)(_AC->p))[i] = colptr[i];\n  }\n\n}*/\n\n// convert a gmm col-sparse matrix into an eigen sparse matrix\ntemplate<class GMM_MatrixT, class EIGEN_MatrixT>\nvoid gmm_to_eigen( const GMM_MatrixT& _G, EIGEN_MatrixT& _E)\n{\n#ifdef COMISO_Eigen3_AVAILABLE\n  typedef typename EIGEN_MatrixT::Scalar Scalar;\n\n  typedef typename gmm::linalg_traits<GMM_MatrixT>::const_sub_col_type ColT;\n  typedef typename gmm::linalg_traits<ColT>::const_iterator CIter;\n\n  // build matrix triplets\n  typedef Eigen::Triplet< Scalar > Triplet;\n  std::vector< Triplet > triplets;\n  triplets.reserve(gmm::nnz(_G));\n\n  for(unsigned int i=0; i<gmm::mat_ncols(_G); ++i)\n  {\n     ColT col = mat_const_col( _G, i );\n\n     CIter it  = gmm::vect_const_begin( col );\n     CIter ite = gmm::vect_const_end( col );\n     for ( ; it!=ite; ++it )\n       triplets.push_back( Triplet( it.index(), i, *it));\n  }\n\n  // generate eigen matrix\n  _E = EIGEN_MatrixT( gmm::mat_nrows(_G), gmm::mat_ncols(_G));\n  _E.setFromTriplets( triplets.begin(), triplets.end());\n#endif\n}\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n\n//=============================================================================\n#endif // COMISO_Eigen3_AVAILABLE\n//============================================================================="
  },
  {
    "path": "libs/CoMISo/Solver/Eigen_Tools.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               CoMISo                                      *\n *      Copyright (C) 2008-2009 by Computer Graphics Group, RWTH Aachen      *\n *                           www.rwth-graphics.de                            *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of CoMISo.                                             *\n *                                                                           *\n *  CoMISo 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 *  CoMISo 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 CoMISo.  If not, see <http://www.gnu.org/licenses/>.          *\n *                                                                           *\n\\*===========================================================================*/ \n\n\n#ifndef COMISO_Eigen_TOOLS_HH\n#define COMISO_Eigen_TOOLS_HH\n\n\n//== COMPILE-TIME PACKAGE REQUIREMENTS ========================================\n#include <CoMISo/Config/config.hh>\n#if COMISO_Eigen3_AVAILABLE\n\n//== INCLUDES =================================================================\n\n#include <iostream>\n#include <vector>\n#include <algorithm>\n#include <limits>\n#include <cmath>\n\n\n#include <Eigen/Dense>\n#define EIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET\n#include <Eigen/Sparse>\n\n#if COMISO_SUITESPARSE_AVAILABLE\n#include <cholmod.h>\n#endif\n\n\n//== FORWARDDECLARATIONS ======================================================\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO_EIGEN\n{\n\n/** \\class EigenTools Eigen_Tools.hh\n\n    A collection of helper functions for manipulating (Eigen) matrices.\n*/\n\n\n//== FUNCTION DEFINITION ======================================================\n\n/// Get matrix data (CSC matrix format) from matrix\n/** Used by Cholmod wrapper  \n *  @param _mat matrix\n *  @param _c uplo parameter (l, L, u, U, c, C)\n *  @param _values values vector\n *  @param _rowind row indices \n *  @param _colptr column pointer  */\ntemplate<class MatrixT, class REALT, class INTT>\nvoid get_ccs_symmetric_data( const MatrixT&      _mat,\n                             const char          _c,\n                             std::vector<REALT>& _values,\n                             std::vector<INTT>&  _rowind,\n                             std::vector<INTT>&  _colptr );\n\n/// Inspect the matrix (print)\n/** Prints useful matrix informations such as, dimension, symmetry, zero_rows, zero_cols, nnz, max, min, max_abs, min_abs, NAN, INF\n  * @param _A matrix */\ntemplate<class MatrixT>\nvoid inspect_matrix( const MatrixT& _A);\n\n/** checks for symmetry\n  * @param _A matrix \n  * @return symmetric? (bool)*/\ntemplate<class MatrixT>\nbool is_symmetric( const MatrixT& _A);\n\ntemplate< class Eigen_MatrixT, class IntT >\nvoid permute( const Eigen_MatrixT& _QR, const std::vector< IntT>& _Pvec, Eigen_MatrixT& _A);\n\n\n#if COMISO_SUITESPARSE_AVAILABLE\n\n/// Eigen to Cholmod_sparse interface\ntemplate<class MatrixT>\nvoid cholmod_to_eigen( const cholmod_sparse& _AC, MatrixT& _A);\n\ntemplate<class MatrixT>\nvoid eigen_to_cholmod( const MatrixT&  _A,\n                     cholmod_sparse* &_AC,\n                     cholmod_common* _common,\n                     int             _sparsity_type = 0,\n                     bool            _long_int      = false);\n#endif\n\n// convert a gmm column-sparse matrix into an eigen sparse matrix\ntemplate<class GMM_MatrixT, class EIGEN_MatrixT>\nvoid gmm_to_eigen( const GMM_MatrixT& _G, EIGEN_MatrixT& _E);\n\n\n//=============================================================================\n} // namespace COMISO_Eigen\n//=============================================================================\n#if defined(INCLUDE_TEMPLATES) && !defined(COMISO_Eigen_TOOLS_C)\n#define COMISO_Eigen_TOOLS_TEMPLATES\n#include \"Eigen_Tools.cc\"\n#endif\n\n//=============================================================================\n#endif // COMISO_Eigen3_AVAILABLE\n//=============================================================================//=============================================================================\n#endif // Eigen_TOOLS_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/CoMISo/Solver/GMM_Tools.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               CoMISo                                      *\n *      Copyright (C) 2008-2009 by Computer Graphics Group, RWTH Aachen      *\n *                           www.rwth-graphics.de                            *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of CoMISo.                                             *\n *                                                                           *\n *  CoMISo 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 *  CoMISo 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 CoMISo.  If not, see <http://www.gnu.org/licenses/>.          *\n *                                                                           *\n\\*===========================================================================*/ \n\n\n\n//=============================================================================\n//\n//  CLASS GMM_Tools - IMPLEMENTATION\n//\n//=============================================================================\n\n#define COMISO_GMM_TOOLS_C\n\n//== INCLUDES =================================================================\n\n#include \"GMM_Tools.hh\"\n#define GMM_USES_LAPACK\n#include <gmm/gmm_lapack_interface.h>\n#include <queue>\n#include <CoMISo/Utils/StopWatch.hh>\n#include <CoMISo/Utils/VSToolsT.hh>\n\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO_GMM\n{\n\n//== IMPLEMENTATION ==========================================================\n\n\n//-----------------------------------------------------------------------------\n\n\n// too many if-statements, seems slower in most cases\n// use eliminate_csc_vars2\ntemplate<class ScalarT, class VectorT, class RealT, class IntegerT>\nvoid eliminate_csc_vars(\n    const std::vector<IntegerT>&     _evar,\n    const std::vector<ScalarT>&      _eval,\n    typename gmm::csc_matrix<RealT>&  _A,\n    VectorT&                          _x,\n    VectorT&                          _rhs )\n{\n  typedef unsigned int uint;\n  typedef typename gmm::csc_matrix<RealT> MatrixT;\n\n  unsigned int nc = _A.nc;\n  unsigned int nr = _A.nr;\n\n  unsigned int n_new = nc - _evar.size();\n\n  // modify rhs\n  for ( unsigned int k=0; k<_evar.size(); ++k )\n  {\n    IntegerT i = _evar[k];\n\n    // number of elements in this column\n    uint n_elem = _A.jc[i+1]-_A.jc[i];\n    uint r_idx  = 0;\n    RealT entry = 0.0;\n    for( uint i_elem = _A.jc[i]; i_elem < _A.jc[i+1]; ++i_elem)\n    {\n      r_idx = _A.ir[i_elem];\n      entry = _A.pr[i_elem];\n      _rhs[r_idx] -= _eval[k]*( entry );\n    }\n  }\n\n  // sort vector\n  std::vector<IntegerT> evar( _evar );\n  std::sort( evar.begin(), evar.end() );\n  evar.push_back( std::numeric_limits<IntegerT>::max() );\n\n  // build subindex set and update rhs\n  std::vector<size_t> si( n_new );\n  int cur_evar_idx=0;\n  for ( unsigned int i=0; i<nc; ++i )\n  {\n    unsigned int next_i = evar[cur_evar_idx];\n    if ( i != next_i )\n    {\n      _rhs[i-cur_evar_idx] = _rhs[i];\n      _x  [i-cur_evar_idx] = _x  [i];\n      si  [i-cur_evar_idx] = i;\n    }\n    else\n      ++cur_evar_idx;\n  }\n\n  // delete last elements\n  _rhs.resize( n_new );\n  _x.resize( n_new );\n\n  // csc erasing rows and columns\n  uint offset(0);\n  uint next_evar_row(0);\n  uint next_evar_col(0);\n  uint last_jc = _A.jc[0];\n  uint col_offset(0);\n  uint offset_update(0);\n  uint last_evar_idx=evar.size()-2;\n\n  for( uint c = 0; c < nc; ++c)\n  {\n    uint el_span( _A.jc[c+1]-last_jc);\n\n    offset_update=0;\n    if( c != (uint) evar[next_evar_col] )\n    {\n      next_evar_row=0;\n      for( uint e = last_jc; e < _A.jc[c+1]; ++e)\n      {\n        while( _A.ir[e] > (uint) evar[next_evar_row])\n        {\n          ++next_evar_row;\n          ++offset_update;\n        }\n        _A.pr[e-offset] = _A.pr[e];\n        _A.ir[e-offset] = _A.ir[e]-offset_update;\n        if( _A.ir[e] == (uint)evar[next_evar_row])\n        {\n          ++offset;\n        }\n      }\n      last_jc = _A.jc[c+1];\n      _A.jc[c+1-col_offset] = _A.jc[c+1]-offset;\n    }\n    else\n    {\n      ++col_offset;\n      offset+=el_span;\n      ++next_evar_col;\n      last_jc = _A.jc[c+1];\n    }\n  }\n  _A.nc = nc - evar.size()+1;\n  _A.nr = nr - evar.size()+1;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\ntemplate<class ScalarT, class VectorT, class RealT, class IntegerT>\nvoid eliminate_csc_vars2(\n    const std::vector<IntegerT>&     _evar,\n    const std::vector<ScalarT>&      _eval,\n    typename gmm::csc_matrix<RealT>&  _A,\n    VectorT&                          _x,\n    VectorT&                          _rhs )\n{\n  typedef unsigned int uint;\n  typedef typename gmm::csc_matrix<RealT> MatrixT;\n\n  unsigned int nc = _A.nc;\n  unsigned int nr = _A.nr;\n\n  unsigned int n_new = nc - _evar.size();\n\n  // modify rhs\n  for ( unsigned int k=0; k<_evar.size(); ++k )\n  {\n    IntegerT i = _evar[k];\n\n    // number of elements in this column\n    //    uint n_elem = _A.jc[i+1]-_A.jc[i];\n    uint r_idx  = 0;\n    RealT entry = 0.0;\n    for( uint i_elem = _A.jc[i]; i_elem < _A.jc[i+1]; ++i_elem)\n    {\n      r_idx = _A.ir[i_elem];\n      entry = _A.pr[i_elem];\n      _rhs[r_idx] -= _eval[k]*( entry );\n    }\n  }\n\n  // sort vector\n  std::vector<IntegerT> evar( _evar );\n  std::sort( evar.begin(), evar.end() );\n  evar.push_back( std::numeric_limits<IntegerT>::max() );\n\n  // build subindex set and update rhs\n  std::vector<size_t> si( n_new );\n  int cur_evar_idx=0;\n  for ( unsigned int i=0; i<nc; ++i )\n  {\n\n    unsigned int next_i = evar[cur_evar_idx];\n\n    if ( i != next_i )\n    {\n\n      _rhs[i-cur_evar_idx] = _rhs[i];\n      _x  [i-cur_evar_idx] = _x  [i];\n      si  [i-cur_evar_idx] = i;\n\n    }\n    else\n    {\n      ++cur_evar_idx;\n    }\n  }\n\n  // delete last elements\n  _rhs.resize( n_new );\n  _x.resize( n_new );\n\n  std::vector< int > new_row_idx_map( nr, -1);\n  // build re-indexing map\n  // -1 means deleted\n  {\n    int next_evar_idx(0);\n    int offset(0);\n    for( int i = 0; i < (int)nr; ++i)\n    {\n      if( i == (int)evar[next_evar_idx])\n      {\n        ++next_evar_idx;\n        ++offset;\n      }\n      else\n      {\n        new_row_idx_map[i] = i-offset;\n      }\n    }\n  }\n\n  // csc erasing rows and columns\n  int read(0), write(0), evar_col(0), last_jc(0);\n  for( unsigned int c = 0; c < nc; ++c)\n  {\n    if( c == (unsigned int)evar[evar_col] )\n    {\n      ++evar_col;\n      read += _A.jc[c+1]-last_jc;\n    }\n    else\n    {\n      while( read < (int)_A.jc[c+1] )\n      {\n        int new_idx = new_row_idx_map[_A.ir[read]];\n        if( new_idx != -1)\n        {\n          _A.pr[write] = _A.pr[read];\n          _A.ir[write] = new_idx;\n          ++write;\n        }\n        ++read;\n      }\n   }\n    last_jc = _A.jc[c+1];\n\n    _A.jc[c+1-evar_col] = write;\n  }\n\n  _A.nc = nc - evar.size()+1;\n  _A.nr = nr - evar.size()+1;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\ntemplate<class MatrixT, class REALT, class INTT>\nvoid get_ccs_symmetric_data( const MatrixT&      _mat,\n                             const char          _uplo,\n                             std::vector<REALT>& _values,\n                             std::vector<INTT>&  _rowind,\n                             std::vector<INTT>&  _colptr )\n{\n   unsigned int m = gmm::mat_nrows( _mat );\n   unsigned int n = gmm::mat_ncols( _mat );\n\n   gmm::csc_matrix<REALT> csc_mat( m,n );\n   gmm::copy( _mat, csc_mat );\n\n   _values.resize( 0 );\n   _rowind.resize( 0 );\n   _colptr.resize( 0 );\n\n   INTT iv( 0 );\n\n   switch ( _uplo )\n   {\n      case 'l':\n      case 'L':\n         // for all columns\n         for ( unsigned int i=0; i<n; ++i )\n         {\n            _colptr.push_back( iv );\n            for ( unsigned int j=( csc_mat.jc )[i]; j<( csc_mat.jc )[i+1]; ++j )\n               if (( csc_mat.ir )[j] >= i )\n               {\n                  ++iv;\n                  _values.push_back(( csc_mat.pr )[j] );\n                  _rowind.push_back(( csc_mat.ir )[j] );\n               }\n         }\n         _colptr.push_back( iv );\n         break;\n\n      case 'u':\n      case 'U':\n         // for all columns\n         for ( unsigned int i=0; i<n; ++i )\n         {\n            _colptr.push_back( iv );\n            for ( unsigned int j=( csc_mat.jc )[i]; j<( csc_mat.jc )[i+1]; ++j )\n               if (( csc_mat.ir )[j] <= i )\n               {\n                  ++iv;\n                  _values.push_back(( csc_mat.pr )[j] );\n                  _rowind.push_back(( csc_mat.ir )[j] );\n               }\n         }\n         _colptr.push_back( iv );\n         break;\n\n      case 'c':\n      case 'C':\n         // for all columns\n         for ( unsigned int i=0; i<n; ++i )\n         {\n            _colptr.push_back( iv );\n            for ( unsigned int j=( csc_mat.jc )[i]; j<( csc_mat.jc )[i+1]; ++j )\n\t      //               if (( csc_mat.ir )[j] <= i )\n               {\n                  ++iv;\n                  _values.push_back(( csc_mat.pr )[j] );\n                  _rowind.push_back(( csc_mat.ir )[j] );\n               }\n         }\n         _colptr.push_back( iv );\n         break;\n\n      default:\n         std::cerr << \"ERROR: parameter uplo must bei either 'U' or 'L' or 'C'!!!\\n\";\n         break;\n   }\n}\n\n\n//-----------------------------------------------------------------------------\n\n\ntemplate<class ScalarT, class VectorT, class SVT>\nvoid eliminate_var( const unsigned int _j,\n                    const ScalarT      _value_j,\n                    gmm::col_matrix<SVT>& _A,\n                    VectorT&      _x,\n                    VectorT&      _rhs )\n{\n   //ACG::StopWatch sw1;\n\n   //sw1.start();\n\n   typedef typename gmm::linalg_traits< gmm::col_matrix< SVT > >::const_sub_col_type ColT;\n   typedef typename gmm::linalg_traits<ColT>::const_iterator CIter;\n\n   unsigned int m = gmm::mat_nrows( _A );\n   unsigned int n = gmm::mat_ncols( _A );\n\n\n   // update rhs\n   ColT col = mat_const_col( _A, _j );\n   CIter it  = gmm::vect_const_begin( col );\n   CIter ite = gmm::vect_const_end( col );\n\n   for ( ; it!=ite; ++it )\n   {\n      _rhs[it.index()] -= _value_j*( *it );\n   }\n\n   _rhs.erase( _rhs.begin() + _j );\n   _x.erase( _x.begin() + _j );\n\n   //std::cerr << \" FIRST BLOCK \" << sw1.stop()/1000.0 << std::endl;\n   /*\n   for(unsigned int i=_j; i<m-1; ++i)\n   {\n     _rhs[i] = _rhs[i+1];\n     _x  [i] = _x  [i+1];\n   }\n\n   // delete last element\n   _rhs.resize( _rhs.size()-1);\n   _x.resize( _x.size()-1);\n   */\n\n   /*\n   MatrixT A_temp( m, n);\n   gmm::copy(_A, A_temp);\n   gmm::clear(_A);\n\n   for(unsigned int i=0; i<m; ++i)\n   {\n     // skip _j'th column\n     if( i==_j) continue;\n\n     ColT col = mat_const_col(A_temp, i);\n\n     CIter it  = gmm::vect_const_begin(col);\n     CIter ite = gmm::vect_const_end(col);\n     \n     // compute new index\n     unsigned int i_new = i;\n     if( i>_j) --i_new;\n\n     for(; it!=ite; ++it)\n     {\n       unsigned int j_new = it.index();\n       if( j_new == _j) continue;\n       if( j_new > _j) --j_new;\n       _A(j_new,i_new) = *it;\n       //       if( it.index() != j_new || i_new != i)\n       // \t_A(it.index(), i) = 0.0;\n\n     }\n   }\n\n   gmm::resize( _A, m-1, n-1);\n   */\n   //sw1.start();\n\n   typedef typename gmm::linalg_traits<SVT>::const_iterator SIter;\n\n   for ( unsigned int i=0; i<m; ++i )\n   {\n      // skip _j'th column\n      if ( i==_j ) continue;\n\n      // compute new index\n      unsigned int i_new = i;\n      if ( i>_j ) --i_new;\n\n      SVT* cur_col = &( _A.col( i ) );\n      if ( i == i_new )\n      {\n         cur_col = new SVT( _A.col( i ) );\n         //gmm::copy( _A.col(i), *cur_col);\n      }\n\n      SIter it  = gmm::vect_const_begin( *cur_col );\n      SIter ite = gmm::vect_const_end( *cur_col );\n\n      //mat_col(_A, i_new).clear();\n      SVT& new_col = _A.col( i_new );\n      new_col.clear();\n\n      for ( ; it!=ite; ++it )\n      {\n         unsigned int j_new = it.index();\n         if ( j_new == _j ) continue;\n         if ( j_new > _j ) --j_new;\n         //_A(j_new,i_new) = *it;\n         new_col[j_new] = *it;\n         //       if( it.index() != j_new || i_new != i)\n         // \t_A(it.index(), i) = 0.0;\n\n      }\n      if ( i == i_new )\n      {\n         delete cur_col;\n      }\n   }\n   //std::cerr << \" BLOCK TWO \" << sw1.stop()/1000.0 << std::endl;\n   //sw1.start();\n\n   gmm::resize( _A, m-1, n-1 );\n   //std::cerr << \"RESIZE \" << sw1.stop()/1000.0 << std::endl;\n}\n\n//-----------------------------------------------------------------------------\n\n\ntemplate<class ScalarT, class VectorT, class RealT>\nvoid eliminate_var( const unsigned int                _i,\n                    const ScalarT                     _xi,\n                    typename gmm::csc_matrix<RealT>&  _A,\n                    VectorT&                          _x,\n                    VectorT&                          _rhs )\n{\n   unsigned int n = _A.nc;\n\n   unsigned int iv_old( 0 );\n   unsigned int iv_new( 0 );\n\n   // for all columns\n   for ( unsigned int j=0; j<n; ++j )\n   {\n      // update x and rhs\n      if ( j > _i )\n      {\n         _rhs[j-1] = _rhs[j];\n         _x  [j-1] = _x  [j];\n      }\n\n\n      if ( j == _i )\n      {\n         // update rhs\n         for ( unsigned int i=_A.jc[j]; i<_A.jc[j+1]; ++i )\n         {\n            _rhs[_A.ir[iv_old]] -= _xi*_A.pr[iv_old];\n            ++iv_old;\n         }\n      }\n      else\n      {\n         // store index to update colptr\n         unsigned int iv_new_save = iv_new;\n\n         for ( unsigned int i=_A.jc[j]; i<_A.jc[j+1]; ++i )\n         {\n            if ( _A.ir[iv_old] < _i )\n            {\n               _A.ir[iv_new] = _A.ir[iv_old];\n               _A.pr[iv_new] = _A.pr[iv_old];\n               ++iv_new;\n            }\n            else if ( _A.ir[iv_old] > _i )\n            {\n               _A.ir[iv_new] = _A.ir[iv_old]-1;\n               _A.pr[iv_new] = _A.pr[iv_old];\n               ++iv_new;\n            }\n            ++iv_old;\n         }\n\n         if ( j<_i )\n            _A.jc[j] = iv_new_save;\n         else\n            if ( j>_i )\n               _A.jc[j-1] = iv_new_save;\n      }\n   }\n\n   // store index to end\n   _A.jc[n-1] = iv_new;\n\n   // resize matrix and vectors\n   _A.nc = n-1;\n   _A.nr = n-1;\n   _x.resize( _x.size()-1 );\n   _rhs.resize( _rhs.size()-1 );\n}\n\n\n//-----------------------------------------------------------------------------\n\n\ntemplate<class IntegerT, class ScalarT, class VectorT, class MatrixT>\nvoid eliminate_vars( const std::vector<IntegerT>&     _evar,\n                     const std::vector<ScalarT>&      _eval,\n                     MatrixT&     _A,\n                     VectorT&     _x,\n                     VectorT&     _rhs )\n{\n  std::cerr << __FUNCTION__ << std::endl;\n  typedef typename gmm::linalg_traits<MatrixT>::const_sub_col_type ColT;\n  typedef typename gmm::linalg_traits<ColT>::const_iterator CIter;\n\n  //  unsigned int m = gmm::mat_nrows( _A);\n  unsigned int n = gmm::mat_ncols( _A );\n\n  unsigned int n_new = n - _evar.size();\n\n  // modify rhs\n  for ( unsigned int k=0; k<_evar.size(); ++k )\n  {\n    IntegerT i = _evar[k];\n\n    ColT col = mat_const_col( _A, i );\n\n    CIter it  = gmm::vect_const_begin( col );\n    CIter ite = gmm::vect_const_end( col );\n\n    for ( ; it!=ite; ++it )\n    {\n      _rhs[it.index()] -= _eval[k]*( *it );\n    }\n  }\n\n  // sort vector\n  std::vector<IntegerT> evar( _evar );\n  std::sort( evar.begin(), evar.end() );\n  evar.push_back( std::numeric_limits<int>::max() );\n\n  // build subindex set and update rhs\n  std::vector<size_t> si( n_new );\n  int cur_evar_idx=0;\n  for ( unsigned int i=0; i<n; ++i )\n  {\n    unsigned int next_i = evar[cur_evar_idx];\n\n    if ( i != next_i )\n    {\n      _rhs[i-cur_evar_idx] = _rhs[i];\n      _x  [i-cur_evar_idx] = _x  [i];\n      si  [i-cur_evar_idx] = i;\n    }\n    else\n    {\n      ++cur_evar_idx;\n    }\n  }\n\n  // delete last element\n  _rhs.resize( n_new );\n  _x.resize( n_new );\n\n  // copy and resize\n  // ToDo: doesn't work without temp matrix ... (more efficient possibility?)\n  //MatrixT A_temp( n_new, n_new );\n  //gmm::copy( gmm::sub_matrix( _A, gmm::sub_index( si ), gmm::sub_index( si ) ), A_temp );\n  //gmm::resize( _A, n_new, n_new );\n  //gmm::copy( A_temp, _A );\n\n\n\n\n\n\n\n\n\n  // to remove last \"virtual\" element\n  evar.resize(evar.size()-1);\n\n\n  //std::cerr << \"THIS IS THE VECTOR OF COLUMNS THAT SHALL DISAPPEAR!s\" << evar << std::endl;\n\n  typename std::vector< IntegerT >::iterator col_it  = evar.begin();\n  typename std::vector< IntegerT >::iterator col_end = evar.end();\n\n  int next_i = *col_it;\n  for( int i = *col_it; i < (int)_A.ncols(); ++i)\n  {\n    if( col_it != col_end && i == *col_it)\n    {\n      ++col_it;\n    }\n    else\n    {\n      _A.col(next_i) = _A.col(i);\n      ++next_i;\n    }\n  }\n\n  gmm::resize(_A, gmm::mat_nrows(_A), gmm::mat_ncols(_A)-evar.size());\n  gmm::row_matrix< gmm::wsvector<double> > Arow( gmm::mat_nrows(_A), gmm::mat_ncols(_A));\n  gmm::copy(_A, Arow);\n  col_it  = evar.begin();\n  col_end = evar.end();\n\n\n  int next_ii = *col_it;\n  for( int i = *col_it; i < (int)_A.nrows(); ++i)\n  {\n    if( col_it != col_end && i == *col_it)\n    {\n      ++col_it;\n    }\n    else\n    {\n      Arow.row(next_ii) = Arow.row(i);\n      ++next_ii;\n    }\n  }\n\n  gmm::resize( _A, gmm::mat_ncols(Arow), gmm::mat_ncols(Arow));\n  gmm::resize( Arow, gmm::mat_ncols(Arow), gmm::mat_ncols(Arow));\n  gmm::copy(   Arow, _A);\n\n\n\n\n  //alternative (probably not working anymore)\n  /*\n     MatrixT Atmp( gmm::mat_nrows(_A) - evar.size(), gmm::mat_ncols(_A) - evar.size());\n\n     evar.push_back(INT_MAX);\n     unsigned int next_evar_row=0, next_evar_col=0;\n     unsigned int col_offset = 0;\n     for( unsigned int c = 0; c < mat_ncols(_A); ++c)\n     {\n     if( c != evar[next_evar_col] )\n     {\n     CIter it  = gmm::vect_const_begin( mat_const_col( _A, c ) );\n     CIter ite = gmm::vect_const_end( mat_const_col( _A, c) );\n\n     unsigned int row_offset = 0;\n     next_evar_row=0;\n     for( ; it != ite; ++it)\n     {\n     while( it.index() > evar[next_evar_row] )\n     {\n     ++row_offset;\n     ++next_evar_row;\n     }\n     if( it.index() != evar[next_evar_row])\n     {\n     Atmp( it.index() - row_offset, c - col_offset) = *it;\n     }\n     }\n     }\n     else\n     {\n     ++col_offset;\n     ++next_evar_col;\n     }\n     }\n     gmm::resize( _A, gmm::mat_nrows(Atmp), gmm::mat_ncols(Atmp));\n     gmm::copy( Atmp, _A);\n   */\n\n}\n\n\n//-----------------------------------------------------------------------------\n\n\ntemplate<class IntegerT, class IntegerT2>\nvoid eliminate_vars_idx( const std::vector<IntegerT >&     _evar,\n                         std::vector<IntegerT2>&     _idx,\n                         IntegerT2                   _dummy, \n\t\t\t IntegerT2                   _range )\n{\n   // sort input\n   std::vector<IntegerT> evar( _evar );\n   std::sort( evar.begin(), evar.end() );\n\n   // precompute update\n   IntegerT2 range = _range;\n   if( range == -1 )\n     range = _idx.size();\n   std::vector<int> update_map( range );\n\n   typename std::vector<IntegerT>::iterator cur_var = evar.begin();\n   unsigned int deleted_between = 0;\n\n   for ( unsigned int i=0; i<update_map.size(); ++i )\n   {\n     if ( cur_var != evar.end() && (IntegerT)i == *cur_var )\n      {\n         // mark as deleted\n         update_map[i] = _dummy;\n\n         ++deleted_between;\n         ++cur_var;\n      }\n      else\n      {\n         update_map[i] = i-deleted_between;\n      }\n   }\n\n   for ( unsigned int i=0; i<_idx.size(); ++i )\n   {\n     if ( (IntegerT2)_idx[i] != _dummy )\n      {\n         _idx[i] = update_map[_idx[i]];\n      }\n   }\n}\n\n\n//-----------------------------------------------------------------------------\n\n\ntemplate<class IntegerT, class IntegerT2>\nvoid eliminate_var_idx( const IntegerT           _evar,\n                        std::vector<IntegerT2>&  _idx,\n                        IntegerT2                _dummy )\n{\n   for ( unsigned int i=0; i<_idx.size(); ++i )\n   {\n      if ( _idx[i] != _dummy )\n      {\n         if ( _idx[i] == ( IntegerT2 )_evar )\n            _idx[i] = _dummy;\n         else\n         {\n            if ( _idx[i] > ( IntegerT2 )_evar )\n               --_idx[i];\n         }\n      }\n   }\n}\n\n\n\n//-----------------------------------------------------------------------------\n\n\ntemplate<class ScalarT, class VectorT, class RealT>\nvoid fix_var_csc_symmetric( const unsigned int                _i,\n\t\t\t    const ScalarT                     _xi,\n\t\t\t    typename gmm::csc_matrix<RealT>&  _A,\n\t\t\t    VectorT&                          _x,\n\t\t\t    VectorT&                          _rhs )\n{\n// GMM CSC FORMAT\n//     T *pr;        // values.\n//     IND_TYPE *ir; // row indices.\n//     IND_TYPE *jc; // column repartition on pr and ir.\n\n  unsigned int n = _A.nc;\n\n  // update x\n  _x[_i]   = _xi;\n\n  std::vector<unsigned int> idx; idx.reserve(16);\n\n  // clear i-th column and collect nonzeros\n  for( unsigned int iv=_A.jc[_i]; iv<_A.jc[_i+1]; ++iv)\n  {\n    if(_A.ir[iv] == _i)\n    {\n      _A.pr[iv] = 1.0;\n      _rhs[_i]  = _xi;\n    }\n    else\n    {\n      // update rhs\n      _rhs[_A.ir[iv]] -= _A.pr[iv]*_xi;\n      // clear entry\n      _A.pr[iv] = 0;\n      // store index\n      idx.push_back( _A.ir[iv]);\n    }\n\n  }\n\n  for(unsigned int i=0; i<idx.size(); ++i)\n  {\n    unsigned int col = idx[i];\n\n    for( unsigned int j=_A.jc[col]; j<_A.jc[col+1]; ++j)\n      if(_A.ir[j] == _i)\n      {\n\t_A.pr[j] = 0.0;\n\t// move to next\n\tbreak;\n      }\n  }\n}\n\n\n//-----------------------------------------------------------------------------\n\n\ntemplate<class MatrixT>\nvoid regularize_hack( MatrixT& _mat, double _v )\n{\n   unsigned int m = gmm::mat_nrows( _mat );\n   unsigned int n = gmm::mat_ncols( _mat );\n\n   if ( m!=n )\n      std::cerr << \"ERROR: regularizing works only for square matrices...\\n\";\n   else\n   {\n      double sum = 0.0;\n      for ( unsigned int i=0; i<n; ++i )\n         sum += _mat( i,i );\n\n      double v_hack = _v*sum/double( n );\n\n      for ( unsigned int i=0; i<n; ++i )\n         _mat( i,i ) += v_hack;\n\n   }\n}\n\n\n//-----------------------------------------------------------------------------\n\n\ntemplate<class MatrixT, class VectorT>\nint gauss_seidel_local( MatrixT& _A, VectorT& _x, VectorT& _rhs, std::vector<unsigned int> _idxs, int _max_iter, double _tolerance )\n{\n   typedef typename gmm::linalg_traits<MatrixT>::const_sub_col_type ColT;\n   typedef typename gmm::linalg_traits<ColT>::const_iterator CIter;\n\n   double t2 = _tolerance*_tolerance;\n\n   // static variables to prevent memory allocation in each step\n   std::vector<unsigned int> i_temp;\n   std::queue<unsigned int>  q;\n\n//    // clear old data\n//    i_temp.clear();\n//    q.clear();\n\n   for ( unsigned int i=0; i<_idxs.size(); ++i )\n      q.push( _idxs[i] );\n\n   int it_count = 0;\n\n   while ( !q.empty() && it_count < _max_iter )\n   {\n      ++it_count;\n      unsigned int cur_i = q.front();\n      q.pop();\n      i_temp.clear();\n\n      ColT col = mat_const_col( _A, cur_i );\n\n      CIter it  = gmm::vect_const_begin( col );\n      CIter ite = gmm::vect_const_end( col );\n\n      double res_i   = -_rhs[cur_i];\n      double x_i_new = _rhs[cur_i];\n      double diag    = 1.0;\n      for ( ; it!=ite; ++it )\n      {\n         res_i   += ( *it ) * _x[it.index()];\n         x_i_new -= ( *it ) * _x[it.index()];\n\t if( it.index() != cur_i)\n\t   i_temp.push_back( it.index() );\n\t else\n\t   diag = *it;\n      }\n\n      // compare relative residuum normalized by diagonal entry\n      if ( res_i*res_i/diag > t2 )\n      {\n         _x[cur_i] += x_i_new/_A( cur_i, cur_i );\n\n         for ( unsigned int j=0; j<i_temp.size(); ++j )\n            q.push( i_temp[j] );\n      }\n   }\n\n   return it_count;\n}\n\n//-----------------------------------------------------------------------------\n\ntemplate<class MatrixT, class VectorT>\ndouble residuum_norm( MatrixT& _A, VectorT& _x, VectorT& _rhs )\n{\n   if ( gmm::mat_ncols( _A ) != _x.size() )\n      std::cerr << \"DIM ERROR (residuum_norm): \" << gmm::mat_ncols( _A ) << \" vs \" << _x.size() << std::endl;\n   if ( gmm::mat_nrows( _A) !=_rhs.size() )\n      std::cerr << \"DIM ERROR 2 (residuum_norm): \" << gmm::mat_nrows( _A) << \" vs \" << _rhs.size() << std::endl;\n\n   // temp vectors\n   VectorT Ax( _rhs.size());\n   VectorT res( _rhs.size() );\n\n   gmm::mult( _A,_x, Ax );\n   gmm::add( Ax, gmm::scaled( _rhs, -1.0 ), res );\n\n   return gmm::vect_norm2( res );\n}\n\n\n//-----------------------------------------------------------------------------\n\n\ntemplate<class MatrixT, class MatrixT2, class VectorT>\nvoid factored_to_quadratic( MatrixT& _F, MatrixT2& _Q, VectorT& _rhs)\n{\n  unsigned int m = gmm::mat_nrows(_F);\n  unsigned int n = gmm::mat_ncols(_F);\n\n  // resize result matrix and vector\n  gmm::resize(_Q, n-1, n-1);\n  gmm::resize(_rhs, n);\n\n  // set up transposed\n  MatrixT Ft(n,m);\n  gmm::copy(gmm::transposed(_F), Ft);\n\n  // compute quadratic matrix\n  MatrixT Q(n,n);\n  gmm::mult(Ft,_F,Q);\n\n  // extract rhs\n  gmm::copy( gmm::scaled(gmm::mat_const_row( Q, n - 1),-1.0), _rhs);\n\n  // resize and copy output\n  gmm::resize( Q, n-1, n-1);\n  _rhs.resize( n - 1);\n  gmm::copy  ( Q, _Q);\n}\n\n\n//-----------------------------------------------------------------------------\n\n\n// inspect the matrix: dimension, symmetry, zero_rows, zero_cols, nnz, max, min, max_abs, min_abs, NAN, INF\ntemplate<class MatrixT>\nvoid inspect_matrix( const MatrixT& _A)\n{\n  typedef typename MatrixT::value_type VType;\n  \n  int m = gmm::mat_nrows(_A);\n  int n = gmm::mat_ncols(_A);\n\n  std::cerr << \"################### INSPECT MATRIX ##################\\n\";\n  std::cerr << \"#rows        : \" << m << std::endl;\n  std::cerr << \"#cols        : \" << n << std::endl;\n  std::cerr << \"#nonzeros    : \" << gmm::nnz(_A) << std::endl;\n  std::cerr << \"#nonzeros/row: \" << (double(gmm::nnz(_A))/double(m)) << std::endl;\n  std::cerr << \"symmetric    : \" << gmm::is_symmetric(_A) << std::endl;\n\n  gmm::col_matrix<gmm::wsvector<VType> > Acol( m, n);\n  gmm::row_matrix<gmm::wsvector<VType> > Arow( m, n);\n\n  gmm::copy(_A, Acol);\n  gmm::copy(_A, Arow);\n\n  int zero_rows = 0;\n  int zero_cols = 0;\n\n  for(int i=0; i<m; ++i)\n    if( Arow.row(i).size() == 0) ++zero_rows;\n\n  for(int i=0; i<n; ++i)\n    if( Acol.col(i).size() == 0) ++zero_cols;\n\n  std::cerr << \"zero rows    : \" << zero_rows << std::endl;\n  std::cerr << \"zero cols    : \" << zero_cols << std::endl;\n\n  VType vmin     = std::numeric_limits<VType>::max();\n  VType vmax     = std::numeric_limits<VType>::min();\n  VType vmin_abs = std::numeric_limits<VType>::max();\n  VType vmax_abs = 0;\n\n  int n_nan = 0;\n  int n_inf = 0;\n  \n  // inspect elements\n  for(int i=0; i<n; ++i)\n  {\n    typedef typename gmm::linalg_traits< gmm::col_matrix< gmm::wsvector<VType> > >::const_sub_col_type ColT;\n    typedef typename gmm::linalg_traits<ColT>::const_iterator CIter;\n\n    ColT col = mat_const_col( Acol, i );\n    CIter it  = gmm::vect_const_begin( col );\n    CIter ite = gmm::vect_const_end( col );\n    \n    for(; it != ite; ++it)\n    {\n      if( *it < vmin ) vmin = *it;\n      if( *it > vmax ) vmax = *it;\n\n      if( fabs(*it) < vmin_abs) vmin_abs = fabs(*it);\n      if( fabs(*it) > vmax_abs) vmax_abs = fabs(*it);\n\n      if( std::isnan(*it)) ++n_nan;\n      if( std::isinf(*it)) ++n_inf;\n    }\n  }\n  \n  std::cerr << \"min  val     : \" << vmin << std::endl;\n  std::cerr << \"max  val     : \" << vmax << std::endl;\n  std::cerr << \"min |val|    : \" << vmin_abs << std::endl;\n  std::cerr << \"max |val|    : \" << vmax_abs << std::endl;\n  std::cerr << \"#nan         : \" << n_nan << std::endl;\n  std::cerr << \"#inf         : \" << n_inf << std::endl;\n  \n  std::cerr << \"min eval     : \" << \"...\" << std::endl;\n  std::cerr << \"max eval     : \" << \"...\" << std::endl;\n  std::cerr << \"min|eval|    : \" << \"...\" << std::endl;\n  std::cerr << \"max|eval|    : \" << \"...\" << std::endl;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\ntemplate<class MatrixT>\nvoid print_dense( const MatrixT& _A)\n{\n  gmm::dense_matrix<double> A(gmm::mat_nrows(_A), gmm::mat_ncols(_A));\n  gmm::copy(_A, A);\n  std::cerr << A << std::endl;\n}\n\n\n//-----------------------------------------------------------------------------\n#if COMISO_SUITESPARSE_AVAILABLE\n\n/// GMM to Cholmod_sparse interface\ntemplate<class MatrixT>\nvoid cholmod_to_gmm( const cholmod_sparse& _AC, MatrixT& _A)\n{\n  // initialize dimensions\n  gmm::resize(_A,_AC.nrow, _AC.ncol);\n  gmm::clear(_A);\n\n  if(!_AC.packed)\n  {\n    std::cerr << \"Warning: \" << __FUNCTION__ << \" does not support unpacked matrices yet!!!\" << std::endl;\n    return;\n  }\n\n  // Pointer to data\n  double* X((double*)_AC.x);\n\n  // complete matrix stored\n  if(_AC.stype == 0)\n  {\n    // which integer type?\n    if(_AC.itype == CHOLMOD_LONG)\n    {\n      UF_long* P((UF_long*)_AC.p);\n      UF_long* I((UF_long*)_AC.i);\n\n      for(UF_long i=0; i<(UF_long)_AC.ncol; ++i)\n        for(UF_long j= P[i]; j< P[i+1]; ++j)\n          _A( I[j], i) += X[j];\n    }\n    else\n    {\n      int* P((int*)_AC.p);\n      int* I((int*)_AC.i);\n\n      for(int i=0; i<(int)_AC.ncol; ++i)\n        for(int j= P[i]; j< P[i+1]; ++j)\n          _A( I[j], i) += X[j];\n    }\n\n  }\n  else // only upper or lower diagonal stored\n  {\n    // which integer type?\n    if(_AC.itype == CHOLMOD_LONG)\n    {\n      UF_long* P((UF_long*)_AC.p);\n      UF_long* I((UF_long*)_AC.i);\n\n      for(UF_long i=0; i<(UF_long)_AC.ncol; ++i)\n        for(UF_long j=P[i]; j<P[i+1]; ++j)\n        {\n          _A(I[j], i) += X[j];\n\n          // add up symmetric part\n          if( I[j] != i)\n            _A(i,I[j]) += X[j];\n        }\n    }\n    else\n    {\n      int* P((int*)_AC.p);\n      int* I((int*)_AC.i);\n\n      for(int i=0; i<(int)_AC.ncol; ++i)\n        for(int j=P[i]; j<P[i+1]; ++j)\n        {\n          _A(I[j], i) += X[j];\n\n          // add up symmetric part\n          if( I[j] != i)\n            _A(i,I[j]) += X[j];\n        }\n      }\n  }\n}\n\n\n//-----------------------------------------------------------------------------\n\n\n/// GMM to Cholmod_sparse interface\ntemplate<class MatrixT>\nvoid gmm_to_cholmod( const MatrixT& _A, cholmod_sparse* &_AC, cholmod_common* _common, int _sparsity_type, bool _long_int)\n{\n  /* _sparsity_type\n          * 0:  matrix is \"unsymmetric\": use both upper and lower triangular parts\n          *     (the matrix may actually be symmetric in pattern and value, but\n          *     both parts are explicitly stored and used).  May be square or\n          *     rectangular.\n          * >0: matrix is square and symmetric, use upper triangular part.\n          *     Entries in the lower triangular part are ignored.\n          * <0: matrix is square and symmetric, use lower triangular part.\n          *     Entries in the upper triangular part are ignored. */\n\n  int m = gmm::mat_nrows(_A);\n  int n = gmm::mat_ncols(_A);\n\n  // get upper or lower\n  char uplo = 'c';\n  if(_sparsity_type < 0) uplo = 'l';\n  if(_sparsity_type > 0) uplo = 'u';\n\n\n  if( _long_int) // long int version\n  {\n    std::vector<double> values;\n    std::vector<UF_long> rowind;\n    std::vector<UF_long> colptr;\n\n    // get data of gmm matrix\n    COMISO_GMM::get_ccs_symmetric_data( _A, uplo, values, rowind, colptr);\n\n    // allocate cholmod matrix\n    _AC = cholmod_l_allocate_sparse(m,n,values.size(),true,true,_sparsity_type,CHOLMOD_REAL, _common);\n\n    // copy data to cholmod matrix\n    for(UF_long i=0; i<(UF_long)values.size(); ++i)\n    {\n      ((double*) (_AC->x))[i] = values[i];\n      ((UF_long*)(_AC->i))[i] = rowind[i];\n    }\n\n    for(UF_long i=0; i<(UF_long)colptr.size(); ++i)\n      ((UF_long*)(_AC->p))[i] = colptr[i];\n  }\n  else // int version\n  {\n     std::vector<double> values;\n     std::vector<int> rowind;\n     std::vector<int> colptr;\n\n     // get data of gmm matrix\n     COMISO_GMM::get_ccs_symmetric_data( _A, uplo, values, rowind, colptr);\n\n     // allocate cholmod matrix\n     _AC = cholmod_allocate_sparse(m,n,values.size(),true,true,_sparsity_type,CHOLMOD_REAL, _common);\n\n     // copy data to cholmod matrix\n     for(unsigned int i=0; i<values.size(); ++i)\n     {\n       ((double*)(_AC->x))[i] = values[i];\n       ((int*)   (_AC->i))[i] = rowind[i];\n     }\n     for(unsigned int i=0; i<colptr.size(); ++i)\n       ((int*)(_AC->p))[i] = colptr[i];\n  }\n}\n#endif\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n"
  },
  {
    "path": "libs/CoMISo/Solver/GMM_Tools.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               CoMISo                                      *\n *      Copyright (C) 2008-2009 by Computer Graphics Group, RWTH Aachen      *\n *                           www.rwth-graphics.de                            *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of CoMISo.                                             *\n *                                                                           *\n *  CoMISo 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 *  CoMISo 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 CoMISo.  If not, see <http://www.gnu.org/licenses/>.          *\n *                                                                           *\n\\*===========================================================================*/ \n\n\n#ifndef COMISO_GMM_TOOLS_HH\n#define COMISO_GMM_TOOLS_HH\n\n\n//== COMPILE-TIME PACKAGE REQUIREMENTS ========================================\n#include <CoMISo/Config/config.hh>\n\n//== INCLUDES =================================================================\n\n#include <iostream>\n#include <vector>\n#include <algorithm>\n#include <gmm/gmm.h>\n\n#if COMISO_SUITESPARSE_AVAILABLE\n#include <cholmod.h>\n#endif\n\n\n//== FORWARDDECLARATIONS ======================================================\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO_GMM\n{\n\n/** \\class GMMTools GMM_Tools.hh\n\n    A collection of helper functions for manipulating (gmm) matrices.\n*/\n\n\n//== FUNCTION DEFINITION ======================================================\n\n/** @name Variable elimination\n * These functions are used to eliminate (one or more) variables x_i from an equation system Ax=b. Elimination meaning that x_i has been assigned a value x_i = c and is considered a constant, this changes entries of the matrix which depend on i and finally \"eliminates\" the ith row and column and updates the rhs. */\n/*@{*/\n\n/// Eliminate multiple variables from a CSC matrix.\n/**  \n *  \\note eliminate_csc_vars2 is probably more efficient\n *  @param _evar indices of variables to be eliminated\n *  @param _eval values c_i of x_i to be eliminated, x_i = c_i\n *  @param _A CSC Matrix of the equation system\n *  @param _x variable vector of equation system\n *  @param _rhs right-hand side vector of equation system  */\ntemplate<class ScalarT, class VectorT, class RealT, class IntegerT>\nvoid eliminate_csc_vars(\n    const std::vector<IntegerT>&     _evar,\n    const std::vector<ScalarT>&      _eval,\n    typename gmm::csc_matrix<RealT>&  _A,\n    VectorT&                          _x,\n    VectorT&                          _rhs );\n\n/// Eliminate variables from a CSC matric.\ntemplate<class ScalarT, class VectorT, class RealT, class IntegerT>\nvoid eliminate_csc_vars2(\n    const std::vector<IntegerT>&     _evar,\n    const std::vector<ScalarT>&      _eval,\n    typename gmm::csc_matrix<RealT>&  _A,\n    VectorT&                          _x,\n    VectorT&                          _rhs );\n\n/// Eliminate only one variable x_i = c (CSC matrices)\n/** Specialization to eliminating one varaible\n *  @param _j index of variable to be eliminated\n *  @param _value_j value c of x_i to be eliminated, x_i = c\n *  @param _A CSC Matrix of the equation system\n *  @param _x variable vector of equation system\n *  @param _rhs right-hand side vector of equation system */\ntemplate<class ScalarT, class VectorT, class RealT>\nvoid eliminate_var( \n    const unsigned int                _j,\n    const ScalarT                     _value_j,\n    typename gmm::csc_matrix<RealT>&  _A,\n    VectorT&                          _x,\n    VectorT&                          _rhs );\n\n\n\n/// eliminate multiple variables from a (NON CSC) linear system by fixin x[j] = _value_j\n/**  \n *  @param _evar indices of variables to be eliminated\n *  @param _eval values c_i of x_i to be eliminated, x_i = c_i\n *  @param _A (non-CSC) Matrix of the equation system\n *  @param _x variable vector of equation system\n *  @param _rhs right-hand side vector of equation system */\ntemplate<class IntegerT, class ScalarT, class VectorT, class MatrixT>\nvoid eliminate_vars(\n    const std::vector<IntegerT>& _evar,\n    const std::vector<ScalarT>&  _eval,\n    MatrixT&                     _A,\n    VectorT&                     _x,\n    VectorT&                     _rhs );\n\n/// Eliminate only one variable x_i = c (non-CSC matrices)\n/** Specialization to eliminating one varaible\n *  @param _j index of variable to be eliminated\n *  @param _value_j value c of x_i to be eliminated, x_i = c\n *  @param _A (non-CSC) Matrix of the equation system\n *  @param _x variable vector of equation system\n *  @param _rhs right-hand side vector of equation system */\ntemplate<class ScalarT, class VectorT, class SVT>\nvoid eliminate_var(\n    const unsigned int     _j,\n    const ScalarT          _value_j,\n    gmm::col_matrix<SVT>&  _A,\n    VectorT&               _x,\n    VectorT&               _rhs );\n\n/// update indices of eliminated variables \n/** \n *  @param _evar indices of variables that were eliminated\n *  @param _idx index map to be changed.\n *  @param _dummy value to which eliminated entries of _idx are set.  */\ntemplate<class IntegerT, class IntegerT2>\nvoid eliminate_vars_idx( \n    const std::vector<IntegerT >&  _evar,\n    std::vector<IntegerT2>&        _idx,\n    IntegerT2                      _dummy = -1,\n    IntegerT2                      _range = -1);\n\n/// update index of eliminated variable\n/**  Specialization to update only one eliminated variable\n *  @param _evar index of variable that was eliminated\n *  @param _idx index map to be changed.\n *  @param _dummy value to which eliminated entry of _idx is set.  */\ntemplate<class IntegerT, class IntegerT2>\nvoid eliminate_var_idx( \n    const IntegerT          _evar,\n    std::vector<IntegerT2>& _idx,\n    IntegerT2               _dummy = -1 );\n\n\n/// do in-place elimination in CSC format by setting row and column to zero and\n/// diagonal entry to zero\n/** \n *  @param _j index of variable to be eliminated\n *  @param _value_j value c of x_i to be eliminated, x_i = c\n *  @param _A (non-CSC) Matrix of the equation system\n *  @param _x variable vector of equation system\n *  @param _rhs right-hand side vector of equation system */\ntemplate<class ScalarT, class VectorT, class RealT>\nvoid fix_var_csc_symmetric( const unsigned int                _j,\n\t\t\t    const ScalarT                     _value_j,\n\t\t\t    typename gmm::csc_matrix<RealT>&  _A,\n\t\t\t    VectorT&                          _x,\n\t\t\t    VectorT&                          _rhs );\n\n\n/*@}*/\n\n\n/// Get matrix data (CSC matrix format) from matrix\n/** Used by Cholmod wrapper  \n *  @param _mat matrix\n *  @param _c uplo parameter (l, L, u, U, c, C)\n *  @param _values values vector\n *  @param _rowind row indices \n *  @param _colptr column pointer  */\ntemplate<class MatrixT, class REALT, class INTT>\nvoid get_ccs_symmetric_data( const MatrixT&      _mat,\n                             const char          _c,\n                             std::vector<REALT>& _values,\n                             std::vector<INTT>&  _rowind,\n                             std::vector<INTT>&  _colptr );\n\n/// Regularize matrix\n/**  Makes matrices with rank(_mat)<n solvable. \n  *  Add factor*avg(trace(_mat))*Identity to _mat.\n *  @param _mat Matrix to regularize\n *  @param _v factor in factor*avg(trace(_mat))*Identity  */\ntemplate<class MatrixT>\nvoid regularize_hack( MatrixT& _mat, double _v = 1e-6 );\n\n\n/// Local Gauss Seidel update of lin. equation system.\n/**  \n *  Add factor*avg(trace(_mat))*Identity to _mat.\n *  @param _A Matrix of linear system\n *  @param _x variable vector of linear system\n *  @param _rhs right hand side of linear system\n *  @param _max_iter maximum number of iterations\n *  @param _tolerance error tolerance threshold\n *  @return number of iterations performed */\ntemplate<class MatrixT, class VectorT>\nint gauss_seidel_local(\n    MatrixT&                  _A,\n    VectorT&                  _x,\n    VectorT&                  _rhs, \n    std::vector<unsigned int> _idxs,\n    int                       _max_iter = 10000,\n    double                    _tolerance = 1e-6 );\n\n\n/// Residuum norm of linear system\n/** residuum = Ax-b\n  * @param _A Matrix\n  * @param _x Variables\n  * @param _rhs right hand side\n  * @return norm Ax-rhs */\ntemplate<class MatrixT, class VectorT>\ndouble residuum_norm( MatrixT& _A, VectorT& _x, VectorT& _rhs );\n\n\n/// Convert factored LSE to quadratic representation\n/** Conversion is done by computing _F^t _F where the last column is the _rhs\n  * @param _F Factored Matrix (input)\n  * @param _Q Quadratic Matrix (output)\n  * @param _rhs right hand side (output) */\ntemplate<class MatrixT, class MatrixT2, class VectorT>\nvoid factored_to_quadratic( MatrixT& _F, MatrixT2& _Q, VectorT& _rhs);\n\n\n/// Inspect the matrix (print)\n/** Prints useful matrix informations such as, dimension, symmetry, zero_rows, zero_cols, nnz, max, min, max_abs, min_abs, NAN, INF\n  * @param _A matrix */\ntemplate<class MatrixT>\nvoid inspect_matrix( const MatrixT& _A);\n\n/// Print the matrix as dense matrix\ntemplate<class MatrixT>\nvoid print_dense( const MatrixT& _A);\n\n\n#if COMISO_SUITESPARSE_AVAILABLE\n\n/// GMM to Cholmod_sparse interface\ntemplate<class MatrixT>\nvoid cholmod_to_gmm( const cholmod_sparse& _AC, MatrixT& _A);\n\ntemplate<class MatrixT>\nvoid gmm_to_cholmod( const MatrixT&  _A,\n                     cholmod_sparse* &_AC,\n                     cholmod_common* _common,\n                     int             _sparsity_type = 0,\n                     bool            _long_int      = false);\n#endif\n\n//=============================================================================\n} // namespace COMISO_GMM\n//=============================================================================\n#if defined(INCLUDE_TEMPLATES) && !defined(COMISO_GMM_TOOLS_C)\n#define COMISO_GMM_TOOLS_TEMPLATES\n#include \"GMM_Tools.cc\"\n#endif\n//=============================================================================\n#endif // GMM_GMM_TOOLS_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/CoMISo/Solver/IterativeSolverT.cc",
    "content": "//=============================================================================\n//\n//  CLASS IterativeSolverT - IMPLEMENTATION\n//\n//=============================================================================\n\n#define COMISO_ITERATIVESOLVERT_C\n\n//== INCLUDES =================================================================\n\n#include \"IterativeSolverT.hh\"\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO{\n\n//== IMPLEMENTATION ==========================================================\n\ntemplate <class RealT>\nbool\nIterativeSolverT<RealT>::\ngauss_seidel_local( typename gmm::csc_matrix<Real>&  _A,\n\t\t    std::vector<Real>&               _x, \n\t\t    std::vector<Real>&               _rhs, \n\t\t    std::vector<unsigned int>&       _idxs, \n\t\t    int&                             _max_iter, \n\t\t    Real&                            _tolerance )\n{\n  if( _max_iter == 0) return false;\n\n  typedef typename gmm::linalg_traits< gmm::csc_matrix<Real> >::const_sub_col_type ColT;\n  typedef typename gmm::linalg_traits<ColT>::const_iterator CIter;\n\n  // clear old data\n  i_temp.clear();\n  q.clear();\n\n  for ( unsigned int i=0; i<_idxs.size(); ++i )\n    q.push_back( _idxs[i] );\n\n  int it_count = 0;\n\n  while ( !q.empty() && it_count < _max_iter )\n  {\n    ++it_count;\n    unsigned int cur_i = q.front();\n    q.pop_front();\n    i_temp.clear();\n\n    ColT col = mat_const_col( _A, cur_i );\n\n    CIter it  = gmm::vect_const_begin( col );\n    CIter ite = gmm::vect_const_end( col );\n\n    double res_i   = -_rhs[cur_i];\n    double x_i_new = _rhs[cur_i];\n    double diag    = 1.0;\n    for ( ; it!=ite; ++it )\n    {\n      res_i   += ( *it ) * _x[it.index()];\n      x_i_new -= ( *it ) * _x[it.index()];\n      if( it.index() != cur_i)\n  \ti_temp.push_back( it.index() );\n      else\n  \tdiag = *it;\n    }\n\n    // take inverse of diag\n    diag = 1.0/diag;\n\n    // compare relative residuum normalized by diagonal entry\n    if ( fabs(res_i*diag) > _tolerance )\n    {\n      _x[cur_i] += x_i_new*diag;\n\n      for ( unsigned int j=0; j<i_temp.size(); ++j )\n\tq.push_back( i_temp[j] );\n    }\n  }\n\n  // converged?\n  return q.empty();\n}\n\n\n//-----------------------------------------------------------------------------\n\n\ntemplate <class RealT>\nbool\nIterativeSolverT<RealT>::\ngauss_seidel_local2( typename gmm::csc_matrix<Real>&  _A,\n\t\t     std::vector<Real>&               _x, \n\t\t     std::vector<Real>&               _rhs, \n\t\t     std::vector<unsigned int>&       _idxs, \n\t\t     int&                             _max_iter, \n\t\t     Real&                            _tolerance )\n{\n  typedef typename gmm::linalg_traits< gmm::csc_matrix<Real> >::const_sub_col_type ColT;\n  typedef typename gmm::linalg_traits<ColT>::const_iterator CIter;\n\n  double t2 = _tolerance*_tolerance;\n\n  // clear old data\n  i_temp.clear();\n  s.clear();\n\n  for ( unsigned int i=0; i<_idxs.size(); ++i )\n    s.insert( _idxs[i] );\n\n  int it_count = 0;\n\n  bool finished = false;\n\n  while ( !finished && it_count < _max_iter )\n  {\n    finished = true;\n    std::set<int>::iterator s_it = s.begin();\n    for(; s_it != s.end(); ++s_it)\n    {\n      ++it_count;\n      unsigned int cur_i = *s_it;\n      i_temp.clear();\n\n      ColT col = mat_const_col( _A, cur_i );\n\n      CIter it  = gmm::vect_const_begin( col );\n      CIter ite = gmm::vect_const_end( col );\n      \n      double res_i   = -_rhs[cur_i];\n      double x_i_new = _rhs[cur_i];\n      double diag    = 1.0;\n      for ( ; it!=ite; ++it )\n      {\n\tres_i   += ( *it ) * _x[it.index()];\n\tx_i_new -= ( *it ) * _x[it.index()];\n\tif( it.index() != cur_i)\n\t  i_temp.push_back( it.index() );\n\telse\n\t  diag = *it;\n      }\n\n      // compare relative residuum normalized by diagonal entry\n      if ( res_i*res_i/diag > t2 )\n      {\n\t_x[cur_i] += x_i_new/_A( cur_i, cur_i );\n\t\n\tfor ( unsigned int j=0; j<i_temp.size(); ++j )\n\t{\n\t  finished = false;\n\t  s.insert( i_temp[j] );\n\t}\n      }\n    }\n  }\n\n  // converged?\n  return finished;\n}\n    \n//-----------------------------------------------------------------------------\n\ntemplate <class RealT>\nbool\nIterativeSolverT<RealT>::\nconjugate_gradient( typename gmm::csc_matrix<Real>&  _A,\n\t\t    std::vector<Real>&               _x, \n\t\t    std::vector<Real>&               _rhs, \n\t\t    int&                             _max_iter, \n\t\t    Real&                            _tolerance )\n{\n  Real rho, rho_1(0), a;\n\n  // initialize vectors\n  p_.resize(_x.size());\n  q_.resize(_x.size());\n  r_.resize(_x.size());\n  d_.resize(_x.size());\n  gmm::copy( _x, p_);\n\n  // initialize diagonal (for relative norm)\n  for(unsigned int i=0; i<_x.size(); ++i)\n    d_[i] = 1.0/_A(i,i);\n\n  // start with iteration 0\n  int cur_iter(0);\n\n  gmm::mult(_A, gmm::scaled(_x, Real(-1)), _rhs, r_);\n  rho = gmm::vect_sp( r_, r_);\n  gmm::copy(r_, p_);\n    \n  bool not_converged = true;\n  Real res_norm(0);\n\n  // while not converged\n  while( (not_converged = ( (res_norm=vect_norm_rel(r_, d_)) > _tolerance)) && \n\t cur_iter < _max_iter)\n  {\n    //    std::cerr << \"iter \" << cur_iter << \"  res \" << res_norm << std::endl;\n\n    if (cur_iter != 0) \n    { \n      rho = gmm::vect_sp( r_, r_);\n      gmm::add(r_, gmm::scaled(p_, rho / rho_1), p_);\n    }\n\n    gmm::mult(_A, p_, q_);\n\n    a = rho / gmm::vect_sp( q_, p_);\t\n    gmm::add(gmm::scaled(p_, a), _x);\n    gmm::add(gmm::scaled(q_, -a), r_);\n    rho_1 = rho;\n\n    ++cur_iter;\n  }\n  \n  _max_iter  = cur_iter;\n  _tolerance = res_norm;\n\n  return (!not_converged);\n}\n\n\n\n//-----------------------------------------------------------------------------\n\n\ntemplate <class RealT>\ntypename IterativeSolverT<RealT>::Real\nIterativeSolverT<RealT>::\nvect_norm_rel(const std::vector<Real>& _v, const std::vector<Real>& _diag) const\n{\n  Real res = 0.0;\n\n  for(unsigned int i=0; i<_v.size(); ++i)\n  {\n    res = std::max(fabs(_v[i]*_diag[i]), res);\n\n//     Real cur = fabs(_v[i]*_diag[i]);\n//     if(cur > res)\n//       res = cur;\n  }\n  return res;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n"
  },
  {
    "path": "libs/CoMISo/Solver/IterativeSolverT.hh",
    "content": "//=============================================================================\n//\n//  CLASS IterativeSolverT\n//\n//=============================================================================\n\n\n#ifndef COMISO_ITERATIVESOLVERT_HH\n#define COMISO_ITERATIVESOLVERT_HH\n\n\n//== INCLUDES =================================================================\n\n#include <gmm/gmm.h>\n#include <deque>\n#include <queue>\n#include <set>\n\n//== FORWARDDECLARATIONS ======================================================\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== CLASS DEFINITION =========================================================\n\n\n\n\t      \n/** \\class IterativeSolverT IterativeSolverT.hh <COMISO/.../IterativeSolverT.hh>\n\n    Brief Description.\n  \n    A more elaborate description follows.\n*/\n\ntemplate <class RealT>\nclass IterativeSolverT\n{\npublic:\n  \n  typedef RealT Real;\n \n  /// Constructor\n  IterativeSolverT() {}\n \n  /// Destructor\n  ~IterativeSolverT() {}\n\n\n  // local gauss_seidel\n  bool gauss_seidel_local( typename gmm::csc_matrix<Real>&  _A,\n   \t\t\t   std::vector<Real>&               _x, \n\t\t\t   std::vector<Real>&               _rhs, \n  \t\t\t   std::vector<unsigned int>&       _idxs, \n  \t\t\t   int&                             _max_iter, \n  \t\t\t   Real&                            _tolerance );\n\n  // local gauss_seidel\n  bool gauss_seidel_local2( typename gmm::csc_matrix<Real>&  _A,\n\t\t\t    std::vector<Real>&               _x, \n\t\t\t    std::vector<Real>&               _rhs, \n\t\t\t    std::vector<unsigned int>&       _idxs, \n\t\t\t    int&                             _max_iter, \n\t\t\t    Real&                            _tolerance );\n\n  // conjugate gradient\n  bool conjugate_gradient( typename gmm::csc_matrix<Real>&  _A,\n\t\t\t   std::vector<Real>&               _x, \n\t\t\t   std::vector<Real>&               _rhs, \n\t\t\t   int&                             _max_iter, \n\t\t\t   Real&                            _tolerance );\n  \nprivate:\n  // compute relative norm\n  Real vect_norm_rel(const std::vector<Real>& _v, const std::vector<Real>& _diag) const;\n\n\nprivate:\n\n  // helper for conjugate gradient\n  std::vector<Real> p_;\n  std::vector<Real> q_;\n  std::vector<Real> r_;\n  std::vector<Real> d_;\n\n  //  helper for local gauss seidel\n  std::vector<unsigned int>  i_temp;\n  std::deque<unsigned int> q;\n  std::set<int> s;\n};\n\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n#if defined(INCLUDE_TEMPLATES) && !defined(COMISO_ITERATIVESOLVERT_C)\n#define COMISO_ITERATIVESOLVERT_TEMPLATES\n#include \"IterativeSolverT.cc\"\n#endif\n//=============================================================================\n#endif // COMISO_ITERATIVESOLVERT_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/CoMISo/Solver/MISolver.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               CoMISo                                      *\n *      Copyright (C) 2008-2009 by Computer Graphics Group, RWTH Aachen      *\n *                           www.rwth-graphics.de                            *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of CoMISo.                                             *\n *                                                                           *\n *  CoMISo 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 *  CoMISo 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 CoMISo.  If not, see <http://www.gnu.org/licenses/>.          *\n *                                                                           *\n\\*===========================================================================*/ \n\n\n#include <CoMISo/Config/config.hh>\n#include \"MISolver.hh\"\n\n#if(COMISO_QT4_AVAILABLE)\n#include <CoMISo/QtWidgets/MISolverDialogUI.hh>\n#endif\n\n#if COMISO_GUROBI_AVAILABLE\n  #include <gurobi_c++.h>\n#endif\n\n#include <CoMISo/Utils/StopWatch.hh>\n\n#include <gmm/gmm.h>\n#include <float.h>\n\n// hack for testing only\n#include \"SparseQRSolver.hh\"\n#include \"UMFPACKSolver.hh\"\n#include \"EigenLDLTSolver.hh\"\n\n#define ROUND(x) ((x)<0?int((x)-0.5):int((x)+0.5))\n\nnamespace COMISO {\n\n\n\n// Constructor\nMISolver::MISolver() \n{\n  // default parameters\n  initial_full_solution_ = true;\n  iter_full_solution_    = true;\n  final_full_solution_   = true;\n\n  direct_rounding_   = false;\n  no_rounding_       = false;\n  multiple_rounding_ = true;\n  gurobi_rounding_   = false;\n  cplex_rounding_    = false;\n\n  max_local_iters_ = 100000;\n  max_local_error_ = 1e-3;\n  max_cg_iters_    = 50;\n  max_cg_error_    = 1e-3;\n\n  multiple_rounding_threshold_ = 0.5;\n\n  gurobi_max_time_ = 60;\n\n  noisy_ = 0;\n  stats_ = true;\n\n  use_constraint_reordering_ = true;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid \nMISolver::solve_no_rounding( \n    CSCMatrix& _A, \n    Vecd&      _x, \n    Vecd&      _rhs )\n{\n  direct_solver_.calc_system_gmm(_A);\n  direct_solver_.solve(_x, _rhs);\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid \nMISolver::resolve(\n    Vecd&      _x,\n    Vecd&      _rhs )\n{\n  direct_solver_.solve(_x, _rhs);\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid\nMISolver::solve_direct_rounding( \n    CSCMatrix& _A, \n    Vecd&      _x, \n    Vecd&      _rhs, \n    Veci&      _to_round)\n{\n  Veci to_round(_to_round);\n  // copy to round vector and make it unique\n  std::sort(to_round.begin(), to_round.end());\n  Veci::iterator last_unique;\n  last_unique = std::unique(to_round.begin(), to_round.end());\n  int r = last_unique - to_round.begin();\n  to_round.resize( r);\n\n  // initalize old indices\n  Veci old_idx(_rhs.size());\n  for(unsigned int i=0; i<old_idx.size(); ++i)\n    old_idx[i] = i;\n  direct_solver_.calc_system_gmm(_A);\n  direct_solver_.solve(_x, _rhs);\n\n  // check solver performance (only for testing!!!)\n  {\n    StopWatch sw;\n\n    // hack\n    const bool enable_performance_test = false;\n\n    // performance comparison code\n#if(COMISO_SUITESPARSE_SPQR_AVAILABLE)\n    if(enable_performance_test)\n    {\n      sw.start();\n      COMISO::SparseQRSolver spqr;\n      spqr.calc_system_gmm(_A);\n      std::cerr << \"SparseQR factor took: \" << sw.stop()/1000.0 << \"s\\n\";\n      Vecd x2(_x);\n      sw.start();\n      spqr.solve(x2,_rhs);\n      std::cerr << \"SparseQR solve took: \" << sw.stop()/1000.0 << \"s\\n\";\n      Vecd res(_x);\n      gmm::add(_x,gmm::scaled(x2,-1.0),res);\n      std::cerr << \"DIFFERENCE IN RESULT: \" << gmm::vect_norm2(res) << std::endl;\n    }\n#endif\n\n    // performance comparison code\n#if(COMISO_SUITESPARSE_AVAILABLE)\n    if(enable_performance_test)\n    {\n      sw.start();\n      COMISO::UMFPACKSolver umf;\n      umf.calc_system_gmm(_A);\n      std::cerr << \"UMFPack factor took: \" << sw.stop()/1000.0 << \"s\\n\";\n      Vecd x3(_x);\n      sw.start();\n      umf.solve(x3,_rhs);\n      std::cerr << \"UMFPack solve took: \" << sw.stop()/1000.0 << \"s\\n\";\n      Vecd res2(_x);\n      gmm::add(_x,gmm::scaled(x3,-1.0),res2);\n      std::cerr << \"UMFPACK DIFFERENCE IN RESULT: \" << gmm::vect_norm2(res2) << std::endl;\n    }\n\n    // performance comparison code\n    if(enable_performance_test)\n    {\n      sw.start();\n      COMISO::CholmodSolver chol;\n      chol.calc_system_gmm(_A);\n      std::cerr << \"Choldmod factor took: \" << sw.stop()/1000.0 << \"s\\n\";\n      Vecd x4(_x);\n      sw.start();\n      chol.solve(x4,_rhs);\n      std::cerr << \"Choldmod solve took: \" << sw.stop()/1000.0 << \"s\\n\";\n      Vecd res(_x);\n      gmm::add(_x,gmm::scaled(x4,-1.0),res);\n      std::cerr << \"DIFFERENCE IN RESULT: \" << gmm::vect_norm2(res) << std::endl;\n    }\n#endif\n\n#if(COMISO_Eigen3_AVAILABLE)\n    // performance comparison code\n    if(enable_performance_test)\n    {\n      sw.start();\n      COMISO::EigenLDLTSolver ldlt;\n      ldlt.calc_system_gmm(_A);\n      std::cerr << \"Eigen LDLT factor took: \" << sw.stop()/1000.0 << \"s\\n\";\n      Vecd x5(_x);\n      sw.start();\n      ldlt.solve(x5,_rhs);\n      std::cerr << \"Eigen LDLT solve took: \" << sw.stop()/1000.0 << \"s\\n\";\n      Vecd res(_x);\n      gmm::add(_x,gmm::scaled(x5,-1.0),res);\n      std::cerr << \"DIFFERENCE IN RESULT: \" << gmm::vect_norm2(res) << std::endl;\n    }\n#endif\n  }\n\n  // round and eliminate variables\n  Vecui elim_i;\n  Vecd  elim_v;\n  for( unsigned int i=0; i < to_round.size(); ++i)\n  {\n    _x[to_round[i]] = ROUND(_x[to_round[i]]);\n    elim_i.push_back(to_round[i]);\n    elim_v.push_back(_x[to_round[i]]);\n    // update old idx\n    old_idx[to_round[i]] = -1;\n  }\n\n  Veci::iterator new_end = std::remove( old_idx.begin(), old_idx.end(), -1);\n  old_idx.resize( new_end-old_idx.begin());\n  // eliminate vars from linear system\n  Vecd xr(_x);\n  COMISO_GMM::eliminate_csc_vars2( elim_i, elim_v, _A, xr, _rhs);\n\n  // std::cerr << \"size A: \" << gmm::mat_nrows(_A) << \" \" << gmm::mat_ncols(_A) \n  // \t    << std::endl;\n  // std::cerr << \"size x  : \" << xr.size() << std::endl;\n  // std::cerr << \"size rhs: \" << _rhs.size() << std::endl;\n\n  // final full solution\n  if( gmm::mat_ncols( _A) > 0)\n  {\n    //    direct_solver_.update_system_gmm(_A);\n    direct_solver_.calc_system_gmm(_A);\n    direct_solver_.solve( xr, _rhs);\n  }\n\n  // store solution values to result vector\n  for(unsigned int i=0; i<old_idx.size(); ++i)\n  {\n    _x[ old_idx[i] ] = xr[i];\n  }\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid \nMISolver::solve_iterative( \n    CSCMatrix& _A, \n    Vecd&      _x, \n    Vecd&      _rhs, \n    Veci&      _to_round,\n    bool       _fixed_order )\n{\n  // StopWatch\n  COMISO::StopWatch sw;\n  double time_search_next_integer = 0;\n\n  // some statistics\n  n_local_ = 0;\n  n_cg_    = 0;\n  n_full_  = 0;\n\n  // reset cholmod step flag\n  cholmod_step_done_ = false;\n\n  Veci to_round(_to_round);\n  // if the order is not fixed, uniquify the indices\n  if( !_fixed_order)\n  {\n    // copy to round vector and make it unique\n    std::sort(to_round.begin(), to_round.end());\n    Veci::iterator last_unique;\n    last_unique = std::unique(to_round.begin(), to_round.end());\n    int r = last_unique - to_round.begin();\n    to_round.resize( r);\n  }\n\n  // initalize old indices\n  Veci old_idx(_rhs.size());\n  for(unsigned int i=0; i<old_idx.size(); ++i)\n    old_idx[i] = i;\n\n  if( initial_full_solution_)\n  {\n    if( noisy_ > 2) std::cerr << \"initial full solution\" << std::endl;\n    direct_solver_.calc_system_gmm(_A);\n    direct_solver_.solve(_x, _rhs);\n\n    cholmod_step_done_ = true;\n\n    ++n_full_;\n  }\n\n  // neighbors for local optimization\n  Vecui neigh_i;\n\n  // Vector for reduced solution\n  Vecd xr(_x);\n\n  // loop until solution computed\n  for(unsigned int i=0; i<to_round.size(); ++i)\n  {\n    if( noisy_ > 0)\n    {\n      std::cerr << \"Integer DOF's left: \" << to_round.size()-(i+1) << \" \";\n      if( noisy_ > 1)\n        std::cerr << \"residuum_norm: \" << COMISO_GMM::residuum_norm( _A, xr, _rhs) << std::endl;\n    }\n\n    // index to eliminate\n    unsigned int i_best = 0;\n\n    // position in round vector\n    unsigned int tr_best = 0;\n\n    if( _fixed_order ) // if order is fixed, simply get next index from to_round\n    {\n      i_best = to_round[i];\n    }\n    else               // else search for best rounding candidate\n    {\n      sw.start();\n      // find index yielding smallest rounding error\n      double       r_best = FLT_MAX;\n      for(unsigned int j=0; j<to_round.size(); ++j)\n      {\n        if( to_round[j] != -1)\n        {\n          int cur_idx = to_round[j];\n          double rnd_error = fabs( ROUND(xr[cur_idx]) - xr[cur_idx]);\n          if( rnd_error < r_best)\n          {\n            i_best  = cur_idx;\n            r_best  = rnd_error;\n\t    tr_best = j;\n          }\n        }\n      }\n      time_search_next_integer += sw.stop();\n    }\n\n    // store rounded value\n    double rnd_x = ROUND(xr[i_best]);\n    _x[ old_idx[i_best] ] = rnd_x;\n\n    // compute neighbors\n    neigh_i.clear();\n    Col col = gmm::mat_const_col(_A, i_best);\n    ColIter it  = gmm::vect_const_begin( col);\n    ColIter ite = gmm::vect_const_end  ( col);\n    for(; it!=ite; ++it)\n      if(it.index() != i_best)\n        neigh_i.push_back(it.index());\n\n    // eliminate var\n    COMISO_GMM::fix_var_csc_symmetric(i_best, rnd_x, _A, xr, _rhs);\n    to_round[tr_best] = -1;\n\n    // 3-stage update of solution w.r.t. roundings\n    // local GS / CG / SparseCholesky\n    update_solution( _A, xr, _rhs, neigh_i);\n  }\n\n  // final full solution?\n  if( final_full_solution_)\n  {\n    if( noisy_ > 2) std::cerr << \"final full solution\" << std::endl;\n\n    if( gmm::mat_ncols( _A) > 0)\n    {\n      if(cholmod_step_done_)\n\tdirect_solver_.update_system_gmm(_A);\n      else\n\tdirect_solver_.calc_system_gmm(_A);\n\n      direct_solver_.solve( xr, _rhs);\n      ++n_full_;\n    }\n  }\n\n  // store solution values to result vector\n  for(unsigned int i=0; i<old_idx.size(); ++i)\n  {\n    _x[ old_idx[i] ] = xr[i];\n  }\n\n  // output statistics\n  if( stats_)\n  {\n    std::cerr << \"\\t\" << __FUNCTION__ << \" *** Statistics of MiSo Solver ***\\n\";\n    std::cerr << \"\\t\\t Number of CG    iterations  = \" << n_cg_ << std::endl;\n    std::cerr << \"\\t\\t Number of LOCAL iterations  = \" << n_local_ << std::endl;\n    std::cerr << \"\\t\\t Number of FULL  iterations  = \" << n_full_ << std::endl;\n    std::cerr << \"\\t\\t Number of ROUNDING          = \" << _to_round.size() << std::endl;\n    std::cerr << \"\\t\\t time searching next integer = \" << time_search_next_integer / 1000.0 <<\"s\\n\";\n    std::cerr << std::endl;\n  }\n}\n\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid \nMISolver::update_solution( \n    CSCMatrix& _A, \n    Vecd&      _x, \n    Vecd&      _rhs, \n    Vecui&     _neigh_i )\n{\n  // set to not converged\n  bool converged = false;\n\n  // compute new solution\n  if(max_local_iters_ > 0)\n  {\n    if( noisy_ > 2)std::cerr << \"use local iteration \";\n\n    int    n_its     = max_local_iters_;\n    double tolerance = max_local_error_;\n    converged = siter_.gauss_seidel_local(_A, _x, _rhs, _neigh_i, n_its, tolerance);\n\n    ++n_local_;\n  }\n\n\n  // conjugate gradient\n  if( !converged && max_cg_iters_ > 0)\n  {\n    if( noisy_ > 2) std::cerr << \", cg \";\n\n    int max_cg_iters = max_cg_iters_;\n    double tolerance = max_cg_error_;\n    converged = siter_.conjugate_gradient(_A, _x,_rhs, max_cg_iters, tolerance);\n\n    if( noisy_ > 3) \n      std::cerr << \"( converged \" << converged << \" \"\n\t\t<< \" iters \" << max_cg_iters   << \" \"\n\t\t<< \" res_norm \" << tolerance << std::endl;\n    ++n_cg_;\n  }\n\n  if(!converged && iter_full_solution_)\n  {\n    if( noisy_ > 2)std::cerr << \", full \";\n\n    if( gmm::mat_ncols( _A) > 0)\n    {\n      if(cholmod_step_done_)\n\tdirect_solver_.update_system_gmm(_A);\n      else\n      {\n\tdirect_solver_.calc_system_gmm(_A);\n\tcholmod_step_done_ = true;\n      }\n      direct_solver_.solve(_x,_rhs);\n\n      ++n_full_;\n    }\n  }\n\n  if( noisy_ > 2)std::cerr << std::endl;\n}\n\n//-----------------------------------------------------------------------------\n\n\nvoid \nMISolver::solve_multiple_rounding( \n    CSCMatrix& _A, \n    Vecd&      _x, \n    Vecd&      _rhs, \n    Veci&      _to_round )\n{\n  // StopWatch\n  COMISO::StopWatch sw;\n  double time_search_next_integer = 0;\n\n  // some statistics\n  n_local_ = 0;\n  n_cg_    = 0;\n  n_full_  = 0;\n\n  // reset cholmod step flag\n  cholmod_step_done_ = false;\n\n  Veci to_round(_to_round);\n  // copy to round vector and make it unique\n  std::sort(to_round.begin(), to_round.end());\n  Veci::iterator last_unique;\n  last_unique = std::unique(to_round.begin(), to_round.end());\n  int r = last_unique - to_round.begin();\n  to_round.resize( r);\n\n  // initalize old indices\n  Veci old_idx(_rhs.size());\n  for(unsigned int i=0; i<old_idx.size(); ++i)\n    old_idx[i] = i;\n\n  if( initial_full_solution_)\n  {\n    if( noisy_ > 2) std::cerr << \"initial full solution\" << std::endl;\n    direct_solver_.calc_system_gmm(_A);\n    direct_solver_.solve(_x, _rhs);\n\n    cholmod_step_done_ = true;\n\n    ++n_full_;\n  }\n\n  // neighbors for local optimization\n  Vecui neigh_i;\n\n  // Vector for reduced solution\n  Vecd xr(_x);\n\n  // loop until solution computed\n  for(unsigned int i=0; i<to_round.size(); ++i)\n  {\n    if( noisy_ > 0)\n    {\n      std::cerr << \"Integer DOF's left: \" << to_round.size()-(i+1) << \" \";\n      if( noisy_ > 1)\n        std::cerr << \"residuum_norm: \" << COMISO_GMM::residuum_norm( _A, xr, _rhs) << std::endl;\n    }\n\n    // position in round vector\n    std::vector<int> tr_best;\n\n    sw.start();\n\n    RoundingSet rset;\n    rset.set_threshold(multiple_rounding_threshold_);\n\n    // find index yielding smallest rounding error\n    for(unsigned int j=0; j<to_round.size(); ++j)\n    {\n      if( to_round[j] != -1)\n      {\n\tint cur_idx = to_round[j];\n\tdouble rnd_error = fabs( ROUND(xr[cur_idx]) - xr[cur_idx]);\n\n\trset.add(j, rnd_error);\n      }\n    }\n\n    rset.get_ids( tr_best);\n\n    time_search_next_integer += sw.stop();\n  \n    // nothing more to do?\n    if( tr_best.empty() )\n      break;\n\n    if( noisy_ > 5)\n      std::cerr << \"round \" << tr_best.size() << \" variables simultaneously\\n\";\n\n    // clear neigh for local update\n    neigh_i.clear();\n\n    for(unsigned int j = 0; j<tr_best.size(); ++j)\n    {\n      int i_cur = to_round[tr_best[j]];\n\n      // store rounded value\n      double rnd_x = ROUND(xr[i_cur]);\n      _x[ old_idx[i_cur] ] = rnd_x;\n\n      // compute neighbors\n      Col col = gmm::mat_const_col(_A, i_cur);\n      ColIter it  = gmm::vect_const_begin( col);\n      ColIter ite = gmm::vect_const_end  ( col);\n      for(; it!=ite; ++it)\n\tif(it.index() != (unsigned int)i_cur)\n\t  neigh_i.push_back(it.index());\n\n      // eliminate var\n      COMISO_GMM::fix_var_csc_symmetric( i_cur, rnd_x, _A, xr, _rhs);\n      to_round[tr_best[j]] = -1;\n    }\n\n    // 3-stage update of solution w.r.t. roundings\n    // local GS / CG / SparseCholesky\n    update_solution( _A, xr, _rhs, neigh_i);\n  }\n\n  // final full solution?\n  if( final_full_solution_)\n  {\n    if( noisy_ > 2) std::cerr << \"final full solution\" << std::endl;\n\n    if( gmm::mat_ncols( _A) > 0)\n    {\n      if(cholmod_step_done_)\n\tdirect_solver_.update_system_gmm(_A);\n      else\n\tdirect_solver_.calc_system_gmm(_A);\n\n      direct_solver_.solve( xr, _rhs);\n      ++n_full_;\n    }\n  }\n\n  // store solution values to result vector\n  for(unsigned int i=0; i<old_idx.size(); ++i)\n  {\n    _x[ old_idx[i] ] = xr[i];\n  }\n\n  // output statistics\n  if( stats_)\n  {\n    std::cerr << \"\\t\" << __FUNCTION__ << \" *** Statistics of MiSo Solver ***\\n\";\n    std::cerr << \"\\t\\t Number of CG    iterations  = \" << n_cg_ << std::endl;\n    std::cerr << \"\\t\\t Number of LOCAL iterations  = \" << n_local_ << std::endl;\n    std::cerr << \"\\t\\t Number of FULL  iterations  = \" << n_full_ << std::endl;\n    std::cerr << \"\\t\\t Number of ROUNDING          = \" << _to_round.size() << std::endl;\n    std::cerr << \"\\t\\t time searching next integer = \" << time_search_next_integer / 1000.0 <<\"s\\n\";\n    std::cerr << std::endl;\n  }\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid\nMISolver::solve_gurobi(\n    CSCMatrix& _A,\n    Vecd&      _x,\n    Vecd&      _rhs,\n    Veci&      _to_round)\n{\n#if COMISO_GUROBI_AVAILABLE\n\n  // get round-indices in set\n  std::set<int> to_round;\n  for(unsigned int i=0; i<_to_round.size();++i)\n    to_round.insert(_to_round[i]);\n\n  try {\n    GRBEnv env = GRBEnv();\n\n    GRBModel model = GRBModel(env);\n\n    // set time limite\n    model.getEnv().set(GRB_DoubleParam_TimeLimit, gurobi_max_time_);\n\n    unsigned int n = _rhs.size();\n\n    // 1. allocate variables\n    std::vector<GRBVar> vars;\n    for( unsigned int i=0; i<n; ++i)\n      if( to_round.count(i))\n        vars.push_back( model.addVar(-GRB_INFINITY, GRB_INFINITY, 0.0, GRB_INTEGER));\n      else\n        vars.push_back( model.addVar(-GRB_INFINITY, GRB_INFINITY, 0.0, GRB_CONTINUOUS));\n\n    // Integrate new variables\n    model.update();\n\n    // 2. setup_energy\n\n    // build objective function from linear system E = x^tAx - 2x^t*rhs\n    GRBQuadExpr objective;\n\n    for(unsigned int i=0; i<_A.nc; ++i)\n      for(unsigned int j=_A.jc[i]; j<_A.jc[i+1]; ++j)\n      {\n        objective += _A.pr[j]*vars[_A.ir[j]]*vars[i];\n      }\n    for(unsigned int i=0; i<n; ++i)\n      objective -= 2*_rhs[i]*vars[i];\n\n//    _A.jc[c+1]\n//    _A.pr[write]\n//    _A.ir[write]\n//    _A.nc\n//    _A.nr\n\n    // minimize\n    model.set(GRB_IntAttr_ModelSense, 1);\n    model.setObjective(objective);\n\n    // 4. solve\n    model.optimize();\n\n    // 5. store result\n    _x.resize(n);\n    for(unsigned int i=0; i<n; ++i)\n      _x[i] = vars[i].get(GRB_DoubleAttr_X);\n\n    std::cout << \"GUROBI objective: \" << model.get(GRB_DoubleAttr_ObjVal) << std::endl;\n\n  }\n  catch(GRBException& e)\n  {\n    std::cout << \"Error code = \" << e.getErrorCode() << std::endl;\n    std::cout << e.getMessage() << std::endl;\n  }\n  catch(...)\n  {\n    std::cout << \"Exception during optimization\" << std::endl;\n  }\n\n#else\n  std::cerr << \"GUROBI solver is not available, please install it...\" << std::endl;\n#endif\n}\n\n\n//----------------------------------------------------------------------------\n\n\nvoid \nMISolver::\nshow_options_dialog()\n{\n#if(COMISO_QT4_AVAILABLE)\n  MISolverDialog* pd = new MISolverDialog(*this);\n  pd->exec();\n#else\n  std::cerr << \"Warning: Qt not available to show solver dialog!!!\" << std::endl;\n#endif\n}\n\n\n// end namespace COMISO\n}// ----------------------\n"
  },
  {
    "path": "libs/CoMISo/Solver/MISolver.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               CoMISo                                      *\n *      Copyright (C) 2008-2009 by Computer Graphics Group, RWTH Aachen      *\n *                           www.rwth-graphics.de                            *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of CoMISo.                                             *\n *                                                                           *\n *  CoMISo 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 *  CoMISo 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 CoMISo.  If not, see <http://www.gnu.org/licenses/>.          *\n *                                                                           *\n\\*===========================================================================*/ \n\n\n//=============================================================================\n//\n//  CLASS MISolver\n//\n//=============================================================================\n\n\n#ifndef COMISO_MISOLVER_HH\n#define COMISO_MISOLVER_HH\n\n\n//== INCLUDES =================================================================\n#include <CoMISo/Config/CoMISoDefines.hh>\n#include <CoMISo/Config/config.hh>\n\n#if COMISO_SUITESPARSE_AVAILABLE\n  #include \"CholmodSolver.hh\"\n#elif COMISO_Eigen3_AVAILABLE\n  #include \"EigenLDLTSolver.hh\"\n#else\n  #print \"Warning: MISolver requires Suitesparse or Eigen3 support\"\n#endif\n\n#include \"GMM_Tools.hh\"\n#include \"IterativeSolverT.hh\"\n\n#include <vector>\n\n#define ROUND_MI(x) ((x)<0?int((x)-0.5):int((x)+0.5))\n\n\n//== FORWARDDECLARATIONS ======================================================\n\n\nnamespace COMISO {\nclass MISolverDialog;\n}\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== CLASS DEFINITION =========================================================\n\n\n\n/** \\class MISolver MISolver.hh \n\n    Mixed-Integer Solver.\n    Approximates the solution of a (mixed-)integer problem\n    by iteratively computing a continuous(real) minimizer x followed by a\n    rounding of the one variable x_i which is subsequently eliminated from the\n    system, and the system is solved again ...\n*/\n\nclass COMISODLLEXPORT MISolver\n{\npublic:\n   \n  // typedefs\n  typedef gmm::csc_matrix< double >       CSCMatrix;\n  typedef std::vector< double >           Vecd;\n  typedef std::vector< int >              Veci;\n  typedef std::vector< unsigned int >     Vecui;\n\n  // gmm Column and ColumnIterator of CSC matrix\n  typedef gmm::linalg_traits< CSCMatrix >::const_sub_col_type Col;\n  typedef gmm::linalg_traits< Col >::const_iterator           ColIter;\n\n\n  /// default Constructor\n  MISolver();\n\n  /// Destructor\n  ~MISolver() {}\n\n\n  /// Compute greedy approximation to a mixed integer problem.\n\t/** @param _A symmetric positive semi-definite CSC matrix (Will be \\b destroyed!)\n\t *  @param _x vector holding solution at the end\n   *  @param _rhs right hand side of system Ax=rhs (Will be \\b destroyed!)\n   *  @param _to_round vector with variable indices to round to integers\n   *  @param _fixed_order specifies if _to_round indices shall be rounded in the\n   *  given order (\\b true) or be greedily selected (\\b false)\n\t *  */\n  inline void solve(\n    CSCMatrix& _A, \n    Vecd&      _x, \n    Vecd&      _rhs, \n    Veci&      _to_round,\n    bool       _fixed_order = false );\n\n  void resolve(\n    Vecd&      _x,\n    Vecd&      _rhs );\n\n  /// Compute greedy approximation to a mixed integer problem.\n\t/** @param _B mx(n+1) matrix with (still non-squared) equations of the energy,\n   * including the right hand side (Will be \\b destroyed!)\n\t *  @param _x vector holding solution at the end\n   *  @param _to_round vector with variable indices to round to integers\n   *  @param _fixed_order specifies if _to_round indices shall be rounded in the\n   *  given order (\\b true) or be greedily selected (\\b false)\n\t *  */\n  template<class CMatrixT>\n  void solve( \n    CMatrixT& _B,\n    Vecd&     _x,\n    Veci&     _to_round,\n    bool      _fixed_order = false );\n\n\n  /// show Qt-Options-Dialog for setting algorithm parameters\n  /** Requires a Qt Application running and COMISO_GUI to be defined */\n  void show_options_dialog();\n\n  /** @name Get/Set functions for algorithm parameters \n\t * Besides being used by the Qt-Dialog these can also be called explicitly\n   * to set parameters of the algorithm. */\n\t/*@{*/\n\t/// Shall an initial full solution be computed?\n  void set_inital_full( bool _b) {        initial_full_solution_=_b;}\n\t/// Will an initial full solution be computed?\n  bool get_inital_full()         { return initial_full_solution_;}\n\n\t/// Shall an full solution be computed if iterative methods did not converged?\n  void set_iter_full( bool _b) {        iter_full_solution_=_b;}\n\t/// Will an full solution be computed if iterative methods did not converged?\n  bool get_iter_full()         { return iter_full_solution_;}\n\n\t/// Shall a final full solution be computed?\n  void set_final_full( bool _b) {        final_full_solution_=_b;}\n\t/// Will a final full solution be computed?\n  bool get_final_full()         { return final_full_solution_;}\n\n  /// Shall direct (or greedy) rounding be used?\n  void set_direct_rounding( bool _b) {        direct_rounding_=_b;}\n  /// Will direct rounding be used?\n  bool get_direct_rounding()         { return direct_rounding_;}\n\n  /// Shall no rounding be performed?\n  void set_no_rounding( bool _b) {        no_rounding_=_b;}\n  /// Will no rounding be performed?\n  bool get_no_rounding()         { return no_rounding_;}\n\n  /// Shall multiple rounding be performed?\n  void set_multiple_rounding( bool _b) {       multiple_rounding_=_b;}\n  /// Will multiple rounding be performed?\n  bool get_multiple_rounding()         { return multiple_rounding_;}\n\n  /// Shall gurobi solver be used?\n  void set_gurobi_rounding( bool _b) {        gurobi_rounding_=_b;}\n  /// Will gurobi rounding be performed?\n  bool get_gurobi_rounding()         { return gurobi_rounding_;}\n\n  /// Shall cplex solver be used?\n  void set_cplex_rounding( bool _b) {        cplex_rounding_=_b;}\n  /// Will cplex rounding be performed?\n  bool get_cplex_rounding()         { return cplex_rounding_;}\n\n  /// Set number of maximum Gauss-Seidel iterations\n  void         set_local_iters( unsigned int _i) { max_local_iters_ = _i;}\n  /// Get number of maximum Gauss-Seidel iterations\n  unsigned int get_local_iters()                 { return max_local_iters_;}\n\n  /// Set error threshold for Gauss-Seidel solver\n  void   set_local_error( double _d) { max_local_error_ = _d;}\n  /// Get error threshold for Gauss-Seidel solver\n  double get_local_error()           { return max_local_error_;}\n\n  /// Set number of maximum Conjugate Gradient iterations \n  void         set_cg_iters( unsigned int _i) { max_cg_iters_ = _i;}\n  /// Get number of maximum Conjugate Gradient iterations \n  unsigned int get_cg_iters()                 { return max_cg_iters_;}\n\n  /// Set error threshold for Conjugate Gradient\n  void   set_cg_error( double _d) { max_cg_error_ = _d;}\n  /// Get error threshold for Conjugate Gradient\n  double get_cg_error()           { return max_cg_error_;}\n\n  /// Set multiple rounding threshold (upper bound of rounding performed in each iteration)\n  void   set_multiple_rounding_threshold( double _d) { multiple_rounding_threshold_ = _d;}\n  /// Get multiple rounding  threshold (upper bound of rounding performed in each iteration)\n  double get_multiple_rounding_threshold()           { return multiple_rounding_threshold_;}\n\n  /// Set noise level of algorithm. 0 - quiet, 1 - more noise, 2 - even more, 100 - all noise\n  void         set_noise( unsigned int _i) { noisy_ = _i;}\n  /// Get noise level of algorithm\n  unsigned int get_noise()                 { return noisy_;}\n\n  /// Set time limit for gurobi solver (in seconds)\n  void   set_gurobi_max_time( double _d) { gurobi_max_time_ = _d;}\n  /// Get time limit for gurobi solver (in seconds)\n  double get_gurobi_max_time()          { return gurobi_max_time_;}\n\n  /// Set output statistics of solver\n  void set_stats( bool _stats) { stats_ = _stats; }\n  /// Get output statistics of solver\n  bool get_stats( )            { return stats_; }\n\t/*@}*/\n\n  /// Set/Get use_constraint_reordering for constraint solver (default = true)\n  bool& use_constraint_reordering() { return use_constraint_reordering_;}\n\n private:\n\n  // find set of variables for simultaneous rounding\n  class RoundingSet\n  {\n  public:\n    typedef std::pair<double,int> PairDI;\n    \n    RoundingSet() : threshold_(0.5), cur_sum_(0.0) {}\n\n    void clear() { rset_.clear(); cur_sum_ = 0.0;}\n\n    bool add( int _id, double _rd_val)\n    {\n      // empty set? -> always add one element\n      if( rset_.empty() || cur_sum_+_rd_val <= threshold_)\n      {\n\trset_.insert( PairDI(_rd_val,_id) );\n\tcur_sum_ += _rd_val;\n\treturn true;\n      }\n      else\n      {\n\t// move to last element\n\tstd::set<PairDI>::iterator s_it = rset_.end();\n\t--s_it;\n\n\tif( s_it->first > _rd_val)\n\t{\n\t  cur_sum_ -= s_it->first;\n\t  rset_.erase(s_it);\n\t  rset_.insert( PairDI(_rd_val,_id) );\n\t  cur_sum_ += _rd_val;\n\t  return true;\n\t}\n      }\n      return false;\n    }\n    \n    void set_threshold( double _thres) { threshold_ = _thres; }\n\n    void get_ids( std::vector<int>& _ids )\n    {\n      _ids.clear();\n      _ids.reserve( rset_.size());\n      std::set<PairDI>::iterator s_it = rset_.begin();\n      for(; s_it != rset_.end(); ++s_it)\n\t_ids.push_back( s_it->second);\n    }\n\n  private:\n\n    double threshold_;\n    double cur_sum_;\n\n    std::set<PairDI> rset_;\n\n    std::set<PairDI> test_;\n  };\n\nprivate:\n\n  void solve_no_rounding( \n    CSCMatrix& _A, \n    Vecd&      _x, \n    Vecd&      _rhs );\n\n  void solve_direct_rounding( \n    CSCMatrix& _A, \n    Vecd&      _x, \n    Vecd&      _rhs, \n    Veci&      _to_round);\n\n  void solve_multiple_rounding( \n    CSCMatrix& _A, \n    Vecd&      _x, \n    Vecd&      _rhs, \n    Veci&      _to_round );\n\n  void solve_iterative(\n    CSCMatrix& _A, \n    Vecd&      _x, \n    Vecd&      _rhs, \n    Veci&      _to_round,\n    bool       _fixed_order );\n\n  void solve_gurobi(\n    CSCMatrix& _A,\n    Vecd&      _x,\n    Vecd&      _rhs,\n    Veci&      _to_round );\n\n  inline void solve_cplex(\n    CSCMatrix& _A,\n    Vecd&      _x,\n    Vecd&      _rhs,\n    Veci&      _to_round );\n\n\nvoid update_solution( \n    CSCMatrix& _A, \n    Vecd&      _x, \n    Vecd&      _rhs, \n    Vecui&     _neigh_i );\n\nprivate:\n\n  /// Copy constructor (not used)\n  MISolver(const MISolver& _rhs);\n\n  /// Assignment operator (not used)\n  MISolver& operator=(const MISolver& _rhs);\n\n  // parameters used by the MiSo\n  bool initial_full_solution_;\n  bool iter_full_solution_;\n  bool final_full_solution_;\n\n  bool direct_rounding_;\n  bool no_rounding_;\n  bool multiple_rounding_;\n  bool gurobi_rounding_;\n  bool cplex_rounding_;\n\n  double multiple_rounding_threshold_;\n\n  unsigned int max_local_iters_;\n  double       max_local_error_;\n  unsigned int max_cg_iters_;\n  double       max_cg_error_;\n  double       max_full_error_;\n  unsigned int noisy_;\n  bool         stats_;\n\n  // time limit for gurobi solver (in seconds)\n  double       gurobi_max_time_;\n\n  // flag\n  bool         cholmod_step_done_;\n\n  // declar direct solver depending on availability\n#if COMISO_SUITESPARSE_AVAILABLE\n  COMISO::CholmodSolver   direct_solver_;\n#elif COMISO_Eigen3_AVAILABLE\n  COMISO::EigenLDLTSolver direct_solver_;\n#else\n  #print \"Warning: MISolver requires Suitesparse or Eigen3 support\"\n#endif\n\n  IterativeSolverT<double> siter_;\n\n  // statistics\n  unsigned int n_local_;\n  unsigned int n_cg_;\n  unsigned int n_full_;\n\n  bool use_constraint_reordering_;\n\n#if(COMISO_QT4_AVAILABLE)\n  friend class COMISO::MISolverDialog;\n#endif\n};\n\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n#if defined(INCLUDE_TEMPLATES) && !defined(COMISO_MISOLVER_C)\n#define COMISO_MISOLVER_TEMPLATES\n#include \"MISolverT.cc\"\n#endif\n//=============================================================================\n#endif // COMISO_MISOLVER_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/CoMISo/Solver/MISolverT.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               CoMISo                                      *\n *      Copyright (C) 2008-2009 by Computer Graphics Group, RWTH Aachen      *\n *                           www.rwth-graphics.de                            *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of CoMISo.                                             *\n *                                                                           *\n *  CoMISo 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 *  CoMISo 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 CoMISo.  If not, see <http://www.gnu.org/licenses/>.          *\n *                                                                           *\n\\*===========================================================================*/ \n\n\n\n//=============================================================================\n//\n//  CLASS MISolver - IMPLEMENTATION\n//\n//=============================================================================\n\n#define COMISO_MISOLVER_C\n//== INCLUDES =================================================================\n\n#include \"MISolver.hh\"\n\n#if COMISO_CPLEX_AVAILABLE\n  #include <ilcplex/ilocplex.h>\n  ILOSTLBEGIN\n#endif\n\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== IMPLEMENTATION ==========================================================\n\n\n\n// inline function...\nvoid\nMISolver::solve(\n    CSCMatrix& _A,\n    Vecd&      _x,\n    Vecd&      _rhs,\n    Veci&      _to_round,\n    bool       _fixed_order )\n{\n  std::cerr << \"# integer    variables: \" << _to_round.size() << std::endl;\n  std::cerr << \"# continuous variables: \" << _x.size()-_to_round.size() << std::endl;\n  \n  // nothing to solve?\n  if( gmm::mat_ncols(_A) == 0 || gmm::mat_nrows(_A) == 0)\n    return;\n\n  if( gurobi_rounding_)\n    solve_gurobi(_A, _x, _rhs, _to_round);\n  else\n    if( cplex_rounding_)\n      solve_cplex(_A, _x, _rhs, _to_round);\n    else\n      if( no_rounding_ || _to_round.size() == 0)\n        solve_no_rounding( _A, _x, _rhs);\n      else\n        if( direct_rounding_)\n          solve_direct_rounding( _A, _x, _rhs, _to_round);\n        else\n          if( multiple_rounding_)\n            solve_multiple_rounding( _A, _x, _rhs, _to_round);\n          else\n            solve_iterative( _A, _x, _rhs, _to_round, _fixed_order);\n}\n\n\n//-----------------------------------------------------------------------------\n\n// inline function...\nvoid\nMISolver::solve_cplex(\n    CSCMatrix& _A,\n    Vecd&      _x,\n    Vecd&      _rhs,\n    Veci&      _to_round)\n{\n#if COMISO_CPLEX_AVAILABLE\n\n  // get round-indices in set\n  std::set<int> to_round;\n  for(unsigned int i=0; i<_to_round.size();++i)\n    to_round.insert(_to_round[i]);\n\n  try {\n\n    IloEnv env_;\n    IloModel model(env_);\n\n    // set time limite\n    //    model.getEnv().set(GRB_DoubleParam_TimeLimit, gurobi_max_time_);\n\n    unsigned int n = _rhs.size();\n\n    // 1. allocate variables\n    std::vector<IloNumVar> vars;\n    for( unsigned int i=0; i<n; ++i)\n      if( to_round.count(i))\n        vars.push_back( IloNumVar(env_,  -IloIntMax,   IloIntMax, IloNumVar::Int)   );\n      else\n        vars.push_back( IloNumVar(env_,-IloInfinity, IloInfinity, IloNumVar::Float) );\n\n\n    // 2. setup_energy\n\n    // build objective function from linear system E = x^tAx - 2x^t*rhs\n    IloExpr objective(env_);\n\n    for(unsigned int i=0; i<_A.nc; ++i)\n      for(unsigned int j=_A.jc[i]; j<_A.jc[i+1]; ++j)\n      {\n        objective += _A.pr[j]*vars[_A.ir[j]]*vars[i];\n      }\n    for(unsigned int i=0; i<n; ++i)\n      objective -= 2*_rhs[i]*vars[i];\n\n    // ToDo: objective correction!!!\n\n    //    _A.jc[c+1]\n    //    _A.pr[write]\n    //    _A.ir[write]\n    //    _A.nc\n    //    _A.nr\n\n    // minimize\n    model.add(IloMinimize(env_,objective));\n\n    // 4. solve\n    IloCplex cplex(model);\n    cplex.setParam(IloCplex::TiLim, gurobi_max_time_);\n\n//    // set parameters comparable to CoMISo\n//    {\n//      cplex.setParam(IloCplex::MIPSearch  , 1);  // Traditional Branch-and-Cut\n//      cplex.setParam(IloCplex::NodeSel    , 0);  // Depth-First\n//      cplex.setParam(IloCplex::VarSel     , -1);  // closest to integer\n//      cplex.setParam(IloCplex::MIPEmphasis, 1);  // concentrate on feasibility\n//    }\n\n    cplex.solve();\n\n    // 5. store result\n    _x.resize(n);\n    for(unsigned int i=0; i<n; ++i)\n      _x[i] = cplex.getValue(vars[i]);\n\n    std::cout << \"CPLEX objective: \" << cplex.getObjValue() << std::endl;\n\n  }\n  catch (IloException& e)\n  {\n    cerr << \"CPLEX Concert exception caught: \" << e << endl;\n  }\n  catch (...)\n  {\n    cerr << \"CPLEX Unknown exception caught\" << endl;\n  }\n\n\n#else\n  std::cerr << \"CPLEX solver is not available, please install it...\" << std::endl;\n#endif\n}\n\n//-----------------------------------------------------------------------------\n\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n"
  },
  {
    "path": "libs/CoMISo/Solver/SparseQRSolver.cc",
    "content": "\t/*===========================================================================*\\\n *                                                                           *\n *                               CoMISo                                      *\n *      Copyright (C) 2008-2009 by Computer Graphics Group, RWTH Aachen      *\n *                           www.rwth-graphics.de                            *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of CoMISo.                                             *\n *                                                                           *\n *  CoMISo 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 *  CoMISo 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 CoMISo.  If not, see <http://www.gnu.org/licenses/>.          *\n *                                                                           *\n\\*===========================================================================*/ \n\n\n\n#include \"SparseQRSolver.hh\"\n\n//== BUILD-TIME DEPENDENCIES =================================================================\n#if(COMISO_SUITESPARSE_SPQR_AVAILABLE)\n//============================================================================================\n\n\nnamespace COMISO {\n\nSparseQRSolver::SparseQRSolver()\n{\n    mp_cholmodCommon = new cholmod_common;\n    cholmod_l_start( mp_cholmodCommon );\n\n    tolerance_ = 1e-8;\n\n    mp_F = 0;\n\n    ordering_ = CHOLMOD_AMD;\n    \n    show_timings_ = false;\n}\n\n\n  //-----------------------------------------------------------------------------\n  \n\nSparseQRSolver::~SparseQRSolver()\n{\n    if( mp_F )\n    {\n      SuiteSparseQR_free<double>( &mp_F, mp_cholmodCommon);\n    }\n\n    cholmod_l_finish( mp_cholmodCommon );\n    delete mp_cholmodCommon;\n    mp_cholmodCommon = NULL;\n}\n  \n\n//-----------------------------------------------------------------------------\n\n\nbool SparseQRSolver::calc_system( const std::vector<Int>&    _colptr,\n\t\t\t\t  const std::vector<Int>&    _rowind,\n\t\t\t\t  const std::vector<double>& _values)\n{\n    if(show_timings_) sw_.start();\n\n    colptr_ = _colptr;\n    rowind_ = _rowind;\n    values_ = _values;\n\n    int n   = colptr_.size()-1;\n\n    cholmod_sparse matA;\n\n    matA.nrow = n;\n    matA.ncol = n;\n    matA.nzmax = _values.size();\n\n    matA.p = &colptr_[0];\n    matA.i = &rowind_[0];\n    matA.x = &values_[0];\n    matA.nz = 0;\n    matA.z = 0;\n    \n    matA.stype = 0;\n    matA.itype = CHOLMOD_LONG;\n    matA.xtype = CHOLMOD_REAL;\n    matA.dtype = CHOLMOD_DOUBLE;\n//    matA.sorted = 1;\n    matA.sorted = 1;\n    matA.packed = 1;\n\n//    cholmod_l_print_common(\"CholmodCommon A\", mp_cholmodCommon);\n    cholmod_l_print_sparse(&matA, \"Matrix A\", mp_cholmodCommon);\n\n    // clean up\n    if( mp_F )\n    {\n      SuiteSparseQR_free<double>( &mp_F, mp_cholmodCommon);\n    }\n\n    if(show_timings_)\n    {\n      std::cerr << \" SuiteSparseQR Timing cleanup: \" << sw_.stop()/1000.0 << \"s\\n\";\n      sw_.start();\n    }\n\n//    if( !(mp_F = SuiteSparseQR_symbolic<double>(ordering_, int(tolerance_!=0.0), &matA, mp_cholmodCommon)))\n//    {\n//\tstd::cerr << \"SuiteSparseQR_symbolic failed\" << std::endl;\n//\tcholmod_l_print_common(\"CholmodCommon A\", mp_cholmodCommon);\n//\treturn false;\n//    }\n//    if(show_timings_)\n//    {\n//      std::cerr << \" SuiteSparseQR_symbolic Timing: \" << sw_.stop()/1000.0 << \"s\\n\";\n//      sw_.start();\n//    }\n//\n//    if( !SuiteSparseQR_numeric<double>( tolerance_, &matA, mp_F, mp_cholmodCommon))\n//    {\n//\tstd::cout << \"SuiteSparseQR_numeric failed\" << std::endl;\n//\treturn false;\n//    }\n\n    if( !(mp_F = SuiteSparseQR_factorize<double>(ordering_, tolerance_, &matA, mp_cholmodCommon)))\n    {\n      std::cerr << \"SuiteSparseQR_factorize failed\" << std::endl;\n      cholmod_l_print_common(\"CholmodCommon A\", mp_cholmodCommon);\n      return false;\n    }\n\n    if(show_timings_)\n    {\n      std::cerr << \" SuiteSparseQR_numeric Timing: \" << sw_.stop()/1000.0 << \"s\\n\";\n      sw_.start();\n    }\n\n    return true;\n}\n\n\n  //-----------------------------------------------------------------------------\n\n    \nbool SparseQRSolver::update_system( const std::vector<Int>& _colptr,\n\t\t\t\t   const std::vector<Int>& _rowind,\n\t\t\t\t   const std::vector<double>& _values )\n{\n    if( !mp_F )\n\treturn false;\n\n    colptr_ = _colptr;\n    rowind_ = _rowind;\n    values_ = _values;\n    int n   = colptr_.size()-1;\n\n    cholmod_sparse matA;\n\n    matA.nrow = n;\n    matA.ncol = n;\n    matA.nzmax = _values.size();\n\n    matA.p = &colptr_[0];\n    matA.i = &rowind_[0];\n    matA.x = &values_[0];\n    matA.nz = 0;\n    matA.z = 0;\n    \n    matA.stype = 0;\n    matA.itype = CHOLMOD_LONG;\n    matA.xtype = CHOLMOD_REAL;\n    matA.dtype = CHOLMOD_DOUBLE;\n    matA.sorted = 1;\n    matA.packed = 1;\n\n\n    if( !(mp_F = SuiteSparseQR_symbolic<double>(ordering_, int(tolerance_==0.0), &matA, mp_cholmodCommon)))\n    {\n\tstd::cout << \"SuiteSparseQR_symbolic failed\" << std::endl;\n\treturn false;\n    }\n\n    return true;\n}\n\n\n//-----------------------------------------------------------------------------\n  \n\nbool SparseQRSolver::solve( double * _x, double * _b)\n{\n    const unsigned int n = colptr_.size() - 1;\n\n    cholmod_dense *x, *Qtb, b;\n\n\n    b.nrow = n;\n    b.ncol = 1;\n    b.nzmax = n;\n    b.d = b.nrow;\n    b.x = _b;\n    b.z = 0;\n    b.xtype = CHOLMOD_REAL;\n    b.dtype = CHOLMOD_DOUBLE;\n\n    // mult by Q^t\n    if( !(Qtb = SuiteSparseQR_qmult<double>(0,mp_F, &b, mp_cholmodCommon)))\n    {\n      std::cout << \"sparseqr_solve failed\" << std::endl;\n          return false;\n    }\n\n    // solve triangular system and permute\n    if( !(x = SuiteSparseQR_solve<double>( 1, mp_F, Qtb, mp_cholmodCommon )) )\n    {\n\tstd::cout << \"sparseqr_solve failed\" << std::endl;\n\treturn false;\n    }\n    \n    for( unsigned int i = 0; i < n; ++i )\n\t_x[i] = ((double*)x->x)[i];\n\n    cholmod_l_free_dense( &Qtb, mp_cholmodCommon );\n    cholmod_l_free_dense( &x, mp_cholmodCommon );\n\n    return true;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\n  \n}\n\n//== BUILD-TIME DEPENDENCIES ==================================================\n#endif\n//=============================================================================\n"
  },
  {
    "path": "libs/CoMISo/Solver/SparseQRSolver.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               CoMISo                                      *\n *      Copyright (C) 2008-2009 by Computer Graphics Group, RWTH Aachen      *\n *                           www.rwth-graphics.de                            *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of CoMISo.                                             *\n *                                                                           *\n *  CoMISo 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 *  CoMISo 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 CoMISo.  If not, see <http://www.gnu.org/licenses/>.          *\n *                                                                           *\n\\*===========================================================================*/ \n\n\n//=============================================================================\n//\n//  CLASS CholmodSolver\n//\n//=============================================================================\n\n#ifndef COMISO_SPARSE_QR_SOLVER_HH\n#define COMISO_SPARSE_QR_SOLVER_HH\n\n\n//== INCLUDES =================================================================\n\n\n#include <CoMISo/Config/CoMISoDefines.hh>\n#include <CoMISo/Config/config.hh>\n#include \"GMM_Tools.hh\"\n\n#include <CoMISo/Utils/StopWatch.hh>\n\n#include <iostream>\n#include <vector>\n\n\n//== BUILD-TIME DEPENDENCIES =================================================================\n#if(COMISO_SUITESPARSE_SPQR_AVAILABLE)\n//============================================================================================\n\n#include \"SuiteSparseQR.hpp\"\n#include \"cholmod.h\"\n\n\n//typedef struct cholmod_common_struct               cholmod_common;\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\ntypedef struct SuiteSparseQR_factorization<double> sparseqr_factor;\n\n\n//== CLASS DEFINITION =========================================================\nclass COMISODLLEXPORT SparseQRSolver\n{\npublic:\n\n  typedef UF_long Int;\n\n\n    SparseQRSolver();\n    ~SparseQRSolver();\n    \n    bool calc_system( const std::vector<Int>&    _colptr,\n\t\t      const std::vector<Int>&    _rowind,\n\t\t      const std::vector<double>& _values );\n\n\n    template< class GMM_MatrixT>\n    bool calc_system_gmm( const GMM_MatrixT& _mat);\n\n\n    template< class GMM_MatrixT>\n    bool update_system_gmm( const GMM_MatrixT& _mat);\n\n    template< class Eigen_MatrixT>\n    bool calc_system_eigen( const Eigen_MatrixT& _mat);\n\n\n    template< class Eigen_MatrixT>\n    bool update_system_eigen( const Eigen_MatrixT& _mat);\n\n    bool update_system( const std::vector<Int>&    _colptr,\n \t\t\tconst std::vector<Int>&    _rowind,\n \t\t\tconst std::vector<double>& _values );\n\n\n\n    bool solve ( double *             _x0, double *             _b);\n\n    bool solve ( std::vector<double>& _x0, const std::vector<double>& _b)\n    {return solve( &(_x0[0]), (double*)&(_b[0]));}\n\n    double tolerance() { return tolerance_; }\n\n    int ordering() { return ordering_; }\n\n    bool& show_timings() { return show_timings_;}\n    \n    // factorize _A*P = _Q*_R and return rank\n    template< class GMM_MatrixT, class GMM_MatrixT2, class GMM_MatrixT3, class IntT>\n    int factorize_system_gmm( const GMM_MatrixT& _A, GMM_MatrixT2& _Q, GMM_MatrixT3& _R, std::vector<IntT>& _P);\n\n    // factorize _A*P = _Q*_R and return rank\n    template< class Eigen_MatrixT, class IntT >\n    int factorize_system_eigen( const Eigen_MatrixT& _A, Eigen_MatrixT& _Q, Eigen_MatrixT& _R, std::vector<IntT>& _P);\n\n    // Solve Ax=b, not the most efficient as it uses SparseMatrices also for _b and _x\n    template< class Eigen_MatrixT>\n    void solve_system_eigen( const Eigen_MatrixT& _A, const Eigen_MatrixT& _b, Eigen_MatrixT& _x);\n\n    // Solve Ax=b, min( ||x||_2) not the most efficient as it uses SparseMatrices also for _b and _x\n    template< class Eigen_MatrixT>\n    void solve_system_eigen_min2norm( const Eigen_MatrixT& _A, const Eigen_MatrixT& _b, Eigen_MatrixT& _x);\n\n\nprivate:\n\n    cholmod_common * mp_cholmodCommon;\n\n    sparseqr_factor * mp_F;\n\n    double tolerance_;\n\n    // specify Permutation ordering\n    // 1. user-provided permutation (only for cholmod analyze p).\n    // 2. AMD with default parameters.\n    // 3. METIS with default parameters.\n    // 4. NESDIS with default parameters\n    // 5. natural ordering (with weighted postorder).\n    // 6. NESDIS, nd small = 20000, prune dense = 10.\n    // 7. NESDIS, nd small = 4, prune dense = 10, no constrained minimum degree.\n    // 8. NESDIS, nd small = 200, prune dense = 0.\n    // 9. COLAMD for A*A^T or AMD for A\n    int ordering_;\n    \n    // dimension of the mxn matrix\n    int m_;\n    int n_;\n\n    std::vector<double> values_;\n    std::vector<Int>    colptr_;\n    std::vector<Int>    rowind_;\n\n    bool show_timings_;\n    StopWatch sw_;\n};\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n#if defined(INCLUDE_TEMPLATES) && !defined(COMISO_SPARSE_QR_SOLVER_TEMPLATES_C)\n#define COMISO_SPARSE_QR_SOLVER_TEMPLATES\n#include \"SparseQRSolverT.cc\"\n#endif\n//== BUILD-TIME DEPENDENCIES ==================================================\n#endif\n//=============================================================================\n#endif // COMISO_SPARSE_QR_SOLVER_HH defined\n//=============================================================================\n"
  },
  {
    "path": "libs/CoMISo/Solver/SparseQRSolverT.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               CoMISo                                      *\n *      Copyright (C) 2008-2009 by Computer Graphics Group, RWTH Aachen      *\n *                           www.rwth-graphics.de                            *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of CoMISo.                                             *\n *                                                                           *\n *  CoMISo 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 *  CoMISo 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 CoMISo.  If not, see <http://www.gnu.org/licenses/>.          *\n *                                                                           *\n\\*===========================================================================*/ \n\n\n\n#define COMISO_SPARSE_QR_SOLVER_TEMPLATES_C\n\n#include \"SparseQRSolver.hh\"\n#include <CoMISo/Solver/Eigen_Tools.hh>\n\n\nnamespace COMISO {\n\n\ntemplate< class GMM_MatrixT>\nbool SparseQRSolver::calc_system_gmm( const GMM_MatrixT& _mat)\n{\n//   std::vector<int>    colptr;\n//   std::vector<int>    rowind;\n//   std::vector<double> values;\n    \n\n    if(show_timings_) sw_.start();\n\n    COMISO_GMM::get_ccs_symmetric_data( _mat,\n\t\t\t\t\t'c',\n\t\t\t\t\tvalues_, \n\t\t\t\t\trowind_, \n\t\t\t\t\tcolptr_ );\n    \n    if(show_timings_)\n    {\n      std::cerr << \"SparseQRSolver Timing GMM convert: \" << sw_.stop()/1000.0 << \"s\\n\";\n    }\n\n    return calc_system( colptr_, rowind_, values_);\n}\n  \n\n//-----------------------------------------------------------------------------\n\n\ntemplate< class GMM_MatrixT>\nbool SparseQRSolver::update_system_gmm( const GMM_MatrixT& _mat)\n{\n//   std::vector<int>    colptr;\n//   std::vector<int>    rowind;\n//   std::vector<double> values;\n    \n  COMISO_GMM::get_ccs_symmetric_data( _mat,\n\t\t\t\t      'c',\n\t\t\t\t      values_, \n\t\t\t\t      rowind_, \n\t\t\t\t      colptr_ );\n\n    return update_system( colptr_, rowind_, values_);\n}\n\n\n//-----------------------------------------------------------------------------\n  \ntemplate< class Eigen_MatrixT>\nbool SparseQRSolver::calc_system_eigen( const Eigen_MatrixT& _mat)\n{\n    if(show_timings_) sw_.start();\n\n    COMISO_EIGEN::get_ccs_symmetric_data( _mat,\n\t\t\t\t\t 'c',\n\t\t\t\t\t values_, \n\t\t\t\t\t rowind_, \n\t\t\t\t\t colptr_ );\n    \n    if(show_timings_)\n    {\n      std::cerr << \"SparseQRSolver Timing EIGEN convert: \" << sw_.stop()/1000.0 << \"s\\n\";\n    }\n\n    return calc_system( colptr_, rowind_, values_);\n}\n  \n//-----------------------------------------------------------------------------\n\ntemplate< class Eigen_MatrixT>\nbool SparseQRSolver::update_system_eigen( const Eigen_MatrixT& _mat)\n{\n    \n  COMISO_EIGEN::get_ccs_symmetric_data( _mat,\n\t\t\t\t      'c',\n\t\t\t\t       values_, \n\t\t\t\t       rowind_, \n\t\t\t\t       colptr_ );\n\n  return update_system( colptr_, rowind_, values_);\n}\n\n\n//----------------------------------------------------------------------------- \n\n\ntemplate< class GMM_MatrixT, class GMM_MatrixT2, class GMM_MatrixT3, class IntT>\nint\nSparseQRSolver::\nfactorize_system_gmm( const GMM_MatrixT& _A, GMM_MatrixT2& _Q, GMM_MatrixT3& _R, std::vector<IntT>& _P)\n{\n  std::cerr << \"factorize_system_gmm\" << std::endl;\n  // get dimensions\n  int m = gmm::mat_nrows(_A);\n  int n = gmm::mat_ncols(_A);\n\n  // 1. _A -> cholmod_sparse A\n  cholmod_sparse* AC(0);\n  COMISO_GMM::gmm_to_cholmod(_A, AC, mp_cholmodCommon, 0, true);\n  std::cerr << \"gmm_to_cholmod finished\" << std::endl;\n  cholmod_print_sparse(AC, \"AC\", mp_cholmodCommon);\n\n  // 2. factorize A -> Q,R,P\n  UF_long econ = m;\n  cholmod_sparse *Q, *R;\n//  UF_long *P = new UF_long[n];\n  UF_long *P;\n  double rank = SuiteSparseQR<double>(ordering_, tolerance_, econ, AC, &Q, &R, &P, mp_cholmodCommon);\n  std::cerr << \"factorization finished\" << std::endl;\n  std::cerr << \"rank: \" << rank << std::endl;\n  cholmod_print_sparse(Q, \"Q\", mp_cholmodCommon);\n\n  // 3. convert Q,R,P -> _Q, _R, _P\n  COMISO_GMM::cholmod_to_gmm(*Q, _Q);\n  COMISO_GMM::cholmod_to_gmm(*R, _R);\n  std::cerr << \"cholmod_to_gmm finished\" << std::endl;\n\n  _P.clear(); _P.resize(n);\n  for( int i=0; i<n; ++i)\n    _P[i] = P[i];\n  std::cerr << \"coy vector finished\" << std::endl;\n\n  cholmod_l_free_sparse(&Q, mp_cholmodCommon);\n  cholmod_l_free_sparse(&R, mp_cholmodCommon);\n  std::cerr << \"free1 finished\" << std::endl;\n\n  // TODO: alloc or free P ???\n  cholmod_free(n, sizeof(UF_long), P, mp_cholmodCommon);\n  std::cerr << \"free2 finished\" << std::endl;\n\n\n  //// [Q,R,E] = qr(A), returning Q as a sparse matrix\n//template <typename Entry> UF_long SuiteSparseQR     // returns rank(A) estimate\n//(\n//    int ordering,           // all, except 3:given treated as 0:fixed\n//    double tol,\n//    UF_long econ,\n//    cholmod_sparse *A,      // m-by-n sparse matrix\n//    // outputs\n//    cholmod_sparse **Q,     // m-by-e sparse matrix where e=max(econ,rank(A))\n//    cholmod_sparse **R,     // e-by-n sparse matrix\n//    UF_long **E,            // permutation of 0:n-1, NULL if identity\n//    cholmod_common *cc      // workspace and parameters\n//) ;\n\n  std::cerr << \" ############## QR Factorization Info #############\\n\";\n  std::cerr << \" m: \" << m << \", n: \" << n << \", rank: \" << rank << std::endl;\n\n  return rank;\n}\n\n\n//----------------------------------------------------------------------------- \n\n\ntemplate< class Eigen_MatrixT, class IntT >\nint\nSparseQRSolver::\nfactorize_system_eigen( const Eigen_MatrixT& _A, Eigen_MatrixT& _Q, Eigen_MatrixT& _R, std::vector<IntT>& _P)\n{\n  std::cerr << \"factorize_system_eigen\" << std::endl;\n  // get dimensions\n  int m = _A.innerSize();\n  int n = _A.outerSize();\n  std::cerr << \" m \" << m << \" n \" << n << std::endl;\n\n  // 1. _A -> cholmod_sparse A\n  cholmod_sparse* AC(0);\n  COMISO_EIGEN::eigen_to_cholmod(_A, AC, mp_cholmodCommon, 0, true);\n  //COMISO_GMM::gmm_to_cholmod(_A, AC, mp_cholmodCommon, 0, true);\n  std::cerr << \"eigen_to_cholmod finished\" << std::endl;\n  cholmod_print_sparse(AC, \"AC\", mp_cholmodCommon);\n\n  // 2. factorize A -> Q,R,P\n  UF_long econ = m;\n  cholmod_sparse *Q, *R;\n//  UF_long *P = new UF_long[n];\n  UF_long *P;\n  double rank = SuiteSparseQR<double>(ordering_, tolerance_, econ, AC, &Q, &R, &P, mp_cholmodCommon);\n  std::cerr << \"factorization finished\" << std::endl;\n  std::cerr << \"rank: \" << rank << std::endl;\n  cholmod_print_sparse(Q, \"Q\", mp_cholmodCommon);\n\n  // 3. convert Q,R,P -> _Q, _R, _P\n  COMISO_EIGEN::cholmod_to_eigen(*Q, _Q);\n  COMISO_EIGEN::cholmod_to_eigen(*R, _R);\n  std::cerr << \"cholmod_to_eigen finished\" << std::endl;\n\n  _P.clear(); _P.resize(n);\n  for( int i=0; i<n; ++i)\n    _P[i] = P[i];\n  std::cerr << \"copy vector finished\" << std::endl;\n\n  cholmod_l_free_sparse(&Q, mp_cholmodCommon);\n  cholmod_l_free_sparse(&R, mp_cholmodCommon);\n  cholmod_l_free_sparse(&AC, mp_cholmodCommon);\n  std::cerr << \"free1 finished\" << std::endl;\n\n  // TODO: alloc or free P ???\n  cholmod_free(n, sizeof(UF_long), P, mp_cholmodCommon);\n  std::cerr << \"free2 finished\" << std::endl;\n\n\n  //// [Q,R,E] = qr(A), returning Q as a sparse matrix\n//template <typename Entry> UF_long SuiteSparseQR     // returns rank(A) estimate\n//(\n//    int ordering,           // all, except 3:given treated as 0:fixed\n//    double tol,\n//    UF_long econ,\n//    cholmod_sparse *A,      // m-by-n sparse matrix\n//    // outputs\n//    cholmod_sparse **Q,     // m-by-e sparse matrix where e=max(econ,rank(A))\n//    cholmod_sparse **R,     // e-by-n sparse matrix\n//    UF_long **E,            // permutation of 0:n-1, NULL if identity\n//    cholmod_common *cc      // workspace and parameters\n//) ;\n\n  std::cerr << \" ############## QR Factorization Info #############\\n\";\n  std::cerr << \" m: \" << m << \", n: \" << n << \", rank: \" << rank << std::endl;\n\n  return rank;\n}\n\n\n//----------------------------------------------------------------------------- \n\n\ntemplate< class Eigen_MatrixT >\nvoid\nSparseQRSolver::\nsolve_system_eigen( const Eigen_MatrixT& _A, const Eigen_MatrixT& _b, Eigen_MatrixT& _x)\n{\n  std::cerr << __FUNCTION__ << std::endl;\n\n  // 1. _A -> cholmod_sparse A, x, b\n  cholmod_sparse* AC(0);\n  COMISO_EIGEN::eigen_to_cholmod(_A, AC, mp_cholmodCommon, 0, true);\n  cholmod_print_sparse(AC, \"AC\", mp_cholmodCommon);\n\n  cholmod_sparse* bC(0);\n  COMISO_EIGEN::eigen_to_cholmod(_b, bC, mp_cholmodCommon, 0, true);\n  cholmod_print_sparse(AC, \"bC\", mp_cholmodCommon);\n\n  cholmod_sparse* xC(0);\n  // allocation of X done internally\n  //COMISO_EIGEN::eigen_to_cholmod_sparse(_x, xC, mp_cholmodCommon, 0, true);\n  //cholmod_print_sparse(AC, \"xC\", mp_cholmodCommon);\n\n\n  // 2. solve Ax=b\n  xC = SuiteSparseQR<double>(ordering_, tolerance_, AC, bC, mp_cholmodCommon);\n\n  std::cerr << \"solve finished\" << std::endl;\n  cholmod_print_sparse(xC, \"xC\", mp_cholmodCommon);\n\n  // 3. convert solution xC to eigen\n  COMISO_EIGEN::cholmod_to_eigen(*xC, _x);\n  std::cerr << \"cholmod_to_eigen finished\" << std::endl;\n\n  cholmod_l_free_sparse(&AC, mp_cholmodCommon);\n  cholmod_l_free_sparse(&bC, mp_cholmodCommon);\n  cholmod_l_free_sparse(&xC, mp_cholmodCommon);\n  std::cerr << \"free1 finished\" << std::endl;\n\n\n\n//// X = A\\sparse(B)\n//template <typename Entry> cholmod_sparse *SuiteSparseQR\n//(\n//    int ordering,           // all, except 3:given treated as 0:fixed\n//    double tol,\n//    cholmod_sparse *A,      // m-by-n sparse matrix\n//    cholmod_sparse *B,      // m-by-nrhs\n//    cholmod_common *cc      // workspace and parameters\n//) ;\n}\n\n\n//----------------------------------------------------------------------------- \n\n\ntemplate< class Eigen_MatrixT >\nvoid\nSparseQRSolver::\nsolve_system_eigen_min2norm( const Eigen_MatrixT& _A, const Eigen_MatrixT& _b, Eigen_MatrixT& _x)\n{\n  std::cerr << __FUNCTION__ << std::endl;\n\n  // 1. _A -> cholmod_sparse A, x, b\n  cholmod_sparse* AC(0);\n  COMISO_EIGEN::eigen_to_cholmod(_A, AC, mp_cholmodCommon, 0, true);\n  //cholmod_print_sparse(AC, \"AC\", mp_cholmodCommon);\n\n  cholmod_sparse* bC(0);\n  COMISO_EIGEN::eigen_to_cholmod(_b, bC, mp_cholmodCommon, 0, true);\n  //cholmod_print_sparse(AC, \"bC\", mp_cholmodCommon);\n\n  cholmod_sparse* xC(0);\n  // allocation of X done internally\n  //COMISO_EIGEN::eigen_to_cholmod_sparse(_x, xC, mp_cholmodCommon, 0, true);\n  //cholmod_print_sparse(AC, \"xC\", mp_cholmodCommon);\n\n\n  // 2. solve Ax=b\n  xC = SuiteSparseQR_min2norm<double>(ordering_, tolerance_, AC, bC, mp_cholmodCommon);\n\n  //std::cerr << \"solve finished\" << std::endl;\n  //cholmod_print_sparse(xC, \"xC\", mp_cholmodCommon);\n\n  // 3. convert solution xC to eigen\n  COMISO_EIGEN::cholmod_to_eigen(*xC, _x);\n  //std::cerr << \"cholmod_to_eigen finished\" << std::endl;\n\n  cholmod_l_free_sparse(&AC, mp_cholmodCommon);\n  cholmod_l_free_sparse(&bC, mp_cholmodCommon);\n  cholmod_l_free_sparse(&xC, mp_cholmodCommon);\n  //std::cerr << \"free1 finished\" << std::endl;\n\n\n\n//template <typename Entry> cholmod_sparse *SuiteSparseQR_min2norm\n//(\n//    int ordering,           // all, except 3:given treated as 0:fixed\n//    double tol,\n//    cholmod_sparse *A,\n//    cholmod_sparse *B,\n//    cholmod_common *cc\n//) ;\n\n}\n\n\n\n}\n"
  },
  {
    "path": "libs/CoMISo/Solver/TaucsSolver.cc",
    "content": "#include \"TaucsSolver.hh\"\n\n//== COMPILE-TIME PACKAGE REQUIREMENTS ========================================\n#include <CoMISo/Config/config.hh>\n#if COMISO_TAUCS_AVAILABLE\n\nnamespace COMISO {\n\nTaucsSolver::TaucsSolver(int _size, bool _write_log)\n    : PAP_(0),\n      LSN_(0),\n      perm_(0),\n      invperm_(0),\n      px_(0),\n      pb_(0)\n  {\n    if (_write_log)\n       taucs_logfile((char*) \"taucs.log\");\n    resize( _size);\n  }\n\n\n  //-----------------------------------------------------------------------------\n  \n\nTaucsSolver::~TaucsSolver()\n  {\n    // free matrices\n    if(LSN_)\n    {\n      taucs_supernodal_factor_free_numeric(LSN_);\n      taucs_supernodal_factor_free( LSN_);\n    }\n\n    if(perm_)     delete [] perm_;\n    if(invperm_)  delete [] invperm_;\n    if(px_)       delete [] px_;\n    if(pb_)       delete [] pb_;\n\n  }\n  \n\n//-----------------------------------------------------------------------------\n\n\nvoid TaucsSolver::calc_system( const std::vector<int>&    _colptr, \n\t\t               const std::vector<int>&    _rowind, \n\t\t\t       const std::vector<double>& _values)\n  {\n    colptr_ = _colptr;\n    rowind_ = _rowind;\n    values_ = _values;\n\n    calc_system();\n  }\n\n//-----------------------------------------------------------------------------\n\n\nvoid TaucsSolver::calc_system()\n  {\n    int n   = colptr_.size()-1;\n\n    // free matrices\n    //    if(PAP_) taucs_ccs_free(PAP_);\n    if(LSN_)\n    {\n      taucs_supernodal_factor_free_numeric(LSN_);\n      taucs_supernodal_factor_free( LSN_);\n    }\n\n    mat_.n = n;\n    mat_.m = mat_.n;\n    mat_.flags = TAUCS_DOUBLE | TAUCS_SYMMETRIC | TAUCS_LOWER;\n\n    mat_.colptr   = &colptr_[0];\n    mat_.rowind   = &rowind_[0];\n    mat_.values.d = &values_[0];\n\n    // calc permutation\n    taucs_ccs_order(&mat_, &perm_, &invperm_, (char*)\"metis\");\n    \n    // permute Matrix\n    PAP_ = taucs_ccs_permute_symmetrically(&mat_, perm_, invperm_);\n\n    // factor symbolic\n    LSN_ = taucs_ccs_factor_llt_symbolic( PAP_);\n\n    // factor numeric\n    taucs_ccs_factor_llt_numeric(PAP_,LSN_);\n\n    // free permuted matrix\n    taucs_ccs_free(PAP_);\n  }\n\n\n  //-----------------------------------------------------------------------------\n\n\nvoid TaucsSolver::update_system( const std::vector<int>&    _colptr, \n\t\t\t\t const std::vector<int>&    _rowind, \n\t\t\t\t const std::vector<double>& _values)\n  {\n    colptr_ = _colptr;\n    rowind_ = _rowind;\n    values_ = _values;\n    \n    update_system();\n  }\n\n\n  //-----------------------------------------------------------------------------\n\n\nvoid TaucsSolver::update_system()\n  {\n    int n   = colptr_.size()-1;\n\n    mat_.n = n;\n    mat_.m = mat_.n;\n    mat_.flags = TAUCS_DOUBLE | TAUCS_SYMMETRIC | TAUCS_LOWER;\n\n    mat_.colptr   = &colptr_[0];\n    mat_.rowind   = &rowind_[0];\n    mat_.values.d = &values_[0];\n\n    // free numeric part of matrix\n    if(LSN_){taucs_supernodal_factor_free_numeric(LSN_);}\n\n    // permute Matrix\n    PAP_ = taucs_ccs_permute_symmetrically(&mat_, perm_, invperm_);\n\n    // factor numeric\n    taucs_ccs_factor_llt_numeric(PAP_,LSN_);\n\n    // free permuted matrix\n    taucs_ccs_free(PAP_);\n  }\n\n\n  //-----------------------------------------------------------------------------\n  \n\n  void TaucsSolver::solve( double * _x, double * _b)\n  {\n    // solve x coords\n    taucs_vec_permute(mat_.n, mat_.flags, _b, pb_, perm_);\n    taucs_supernodal_solve_llt(LSN_, px_, pb_);\n    taucs_vec_ipermute(mat_.n, mat_.flags, px_, _x, perm_);\n  }\n\n\n  //-----------------------------------------------------------------------------\n  \n\n  void TaucsSolver::solve_cg( double* _x0, double* _b, int _maxiter, double _max_error, bool /*_precond*/)\n  {\n//     // preconditioner\n//     taucs_ccs_matrix *M;\n//     M = taucs_ccs_factor_llt(&mat_, 1E-1, 1);\n\n//     // solve system\n//     taucs_conjugate_gradients( &mat_, taucs_ccs_solve_llt, M, _x0, _b, _maxiter, _max_error );\n\n    // solve system\n    taucs_conjugate_gradients( &mat_, 0, 0, _x0, _b, _maxiter, _max_error );\n  }\n\n\n  //-----------------------------------------------------------------------------\n\n\n  void TaucsSolver::eliminate_var( int _i, double _xi, double* _x, double* _rhs)\n  {\n    int n = colptr_.size()-1;\n\n    int iv_old(0);\n    int iv_new(0);\n\n    // for all columns\n    for(int j=0; j<(int)colptr_.size()-1; ++j)\n    {\n      // update x and rhs\n      if( j > _i)\n      {\n\t_rhs[j-1] = _rhs[j];\n\t_x  [j-1] = _x  [j];\n      }\n\n      if( j == _i)\n      {\n\t// update rhs\n\tfor(int i=colptr_[j]; i<colptr_[j+1]; ++i)\n\t{\n\t  _rhs[rowind_[iv_old]] -= _xi*values_[iv_old];\n\t  ++iv_old;\n\t}\n      }\n      else\n      {\n\t// store index to update colptr\n\tint iv_new_save = iv_new;\n\n\tfor(int i=colptr_[j]; i<colptr_[j+1]; ++i)\n\t{\n\t  if( rowind_[iv_old] < _i)\n\t  {\n\t    rowind_[iv_new] = rowind_[iv_old];\n\t    values_[iv_new] = values_[iv_old];\n\t    ++iv_new;\n\t  }\n\t  else if( rowind_[iv_old] > _i)\n\t  {\n\t    rowind_[iv_new] = rowind_[iv_old]-1;\n\t    values_[iv_new] = values_[iv_old];\n\t    ++iv_new;\n\t  }\n\t  else\n\t  {\n\t    if( j< _i)\n\t      _rhs[j] -= _xi*values_[iv_old];\n\t    else\n\t      _rhs[j-1] -= _xi*values_[iv_old];\n\n\t  }\n\t  ++iv_old;\n\t}\n\t\n\tif( j<_i)\n\t  colptr_[j] = iv_new_save;\n\telse\n\t  if( j>_i)\n\t    colptr_[j-1] = iv_new_save;\n      }\n    }\n\n    // store index to end\n    colptr_[colptr_.size()-2] = iv_new;\n    // resize vectors\n    colptr_.resize( colptr_.size()-1);\n    values_.resize( iv_new);\n    rowind_.resize( iv_new);\n\n    mat_.n = n-1;\n    mat_.m = n-1;\n  }\n\n\n  //-----------------------------------------------------------------------------\n\n\n  void TaucsSolver::resize( int _size)\n  {\n    if(perm_)     delete [] perm_;\n    if(invperm_)  delete [] invperm_;\n    if(px_)       delete [] px_;\n    if(pb_)       delete [] pb_;\n\n    perm_    = new int[_size];\n    invperm_ = new int[_size];\n    px_      = new double[_size];\n    pb_      = new double[_size];\n  }\n\n  \n}\n\n//=============================================================================\n#endif // COMISO_TAUCS_AVAILABLE"
  },
  {
    "path": "libs/CoMISo/Solver/TaucsSolver.hh",
    "content": "//=============================================================================\n//\n//  CLASS TaucsSolver\n//\n//  Author:  David Bommes <bommes@cs.rwth-aachen.de>\n//\n//  Version: $Revision: 1$\n//  Date:    $Date: 02-04-200X$\n//\n//=============================================================================\n\n#ifndef COMISO_TAUCS_SOLVER_HH\n#define COMISO_TAUCS_SOLVER_HH\n\n\n//== COMPILE-TIME PACKAGE REQUIREMENTS ========================================\n#include <CoMISo/Config/config.hh>\n#if COMISO_TAUCS_AVAILABLE\n\n//== INCLUDES =================================================================\n#include <CoMISo/Config/CoMISoDefines.hh>\n\n\n#ifdef WIN32\n        extern \"C\"\n        {\n                #include <taucs.h>\n        }\n        #undef min\n        #undef max\n#else\n        #include <taucs.h>\n#endif\n\n\n#include \"GMM_Tools.hh\"\n#include <iostream>\n#include <vector>\n\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== CLASS DEFINITION =========================================================\nclass COMISODLLEXPORT TaucsSolver\n  {\n  public:\n\n    // _size is maximal size this instance can handle (smaller problems are possible!!!)\n    TaucsSolver(int _size, bool _write_log = false);\n    ~TaucsSolver();\n    \n    void calc_system( const std::vector<int>&    _colptr, \n\t\t      const std::vector<int>&    _rowind, \n\t\t      const std::vector<double>& _values );\n\n\n    template< class GMM_MatrixT>\n    void calc_system_gmm( const GMM_MatrixT& _mat);\n\n\n    void update_system( const std::vector<int>&    _colptr, \n\t\t\tconst std::vector<int>&    _rowind, \n\t\t\tconst std::vector<double>& _values );\n\n\n    template< class GMM_MatrixT>\n    void update_system_gmm( const GMM_MatrixT& _mat);\n\n\n    void solve( std::vector<double>& _x0, std::vector<double>& _b) { solve( &(_x0[0]), &(_b[0])); }\n    void solve( double* _x0, double* _b);\n\n    void resize       ( int _size);\n\n    // CG support\n\n    template< class GMM_MatrixT>\n    void init_system_gmm( const GMM_MatrixT& _mat);\n\n    void solve_cg( std::vector<double>& _x0, std::vector<double>& _b, int _maxiter = 50, double _max_error=1e-6, bool _precond=true) { solve_cg( &(_x0[0]), &(_b[0]), _maxiter, _max_error, _precond); }\n    void solve_cg( double* _x0, double* _b, int _maxiter = 50, double _max_error=1e-6, bool _precond=true);\n    \n    void eliminate_var( int _i, double _xi, std::vector<double>& _x, std::vector<double>& _rhs) {eliminate_var(_i, _xi, &(_x[0]), &(_rhs[0])); _rhs.resize(_rhs.size()-1); _x.resize(_x.size()-1);}\n    void eliminate_var( int _i, double _xi, double* _x, double* _rhs);\n\n    template< class GMM_MatrixT>\n    void get_matrix_gmm( GMM_MatrixT& _mat);\n\n\n    void calc_system();\n    void update_system();\n\n  private:\n\n    taucs_ccs_matrix   mat_;\n    taucs_ccs_matrix  *PAP_;\n    \n    void              *LSN_;\n\n    int               *perm_;\n    int               *invperm_;\n\n    double            *px_;\n    double            *pb_;\n\n\n    std::vector<double> values_;\n    std::vector<int>    rowind_;\n    std::vector<int>    colptr_;\n  };\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n#if defined(INCLUDE_TEMPLATES) && !defined(COMISO_TAUCS_SOLVER_TEMPLATES_C)\n#define COMISO_TAUCS_SOLVER_TEMPLATES\n#include \"TaucsSolverT.cc\"\n#endif\n//=============================================================================\n#endif // COMISO_TAUCS_AVAILABLE\n//=============================================================================\n#endif // COMISO_TAUCS_SOLVER_HH defined\n//=============================================================================\n"
  },
  {
    "path": "libs/CoMISo/Solver/TaucsSolverT.cc",
    "content": "#define COMISO_TAUCS_SOLVER_TEMPLATES_C\n\n#include \"TaucsSolver.hh\"\n\n\n//== COMPILE-TIME PACKAGE REQUIREMENTS ========================================\n#include <CoMISo/Config/config.hh>\n#if COMISO_TAUCS_AVAILABLE\n\nnamespace COMISO {\n\n\ntemplate< class GMM_MatrixT>\nvoid TaucsSolver::calc_system_gmm( const GMM_MatrixT& _mat)\n  {\n    COMISO_GMM::get_ccs_symmetric_data( _mat,\n\t\t\t\t 'l',\n\t\t\t\t   values_, \n\t\t\t\t rowind_, \n\t\t\t\t colptr_ );\n\n    calc_system();\n  }\n  \n\n  //-----------------------------------------------------------------------------\n\n\ntemplate< class GMM_MatrixT>\nvoid TaucsSolver::update_system_gmm( const GMM_MatrixT& _mat)\n  {\n    COMISO_GMM::get_ccs_symmetric_data( _mat,\n\t\t\t\t 'l',\n\t\t\t\t   values_, \n\t\t\t\t rowind_, \n\t\t\t\t colptr_ );\n\n    update_system();\n  }\n\n\n\n  //-----------------------------------------------------------------------------\n\n\ntemplate< class GMM_MatrixT>\nvoid TaucsSolver::init_system_gmm( const GMM_MatrixT& _mat)\n  {\n    COMISO_GMM::get_ccs_symmetric_data( _mat,\n\t\t\t\t 'l',\n\t\t\t\t   values_, \n\t\t\t\t rowind_, \n\t\t\t\t colptr_ );\n    int n   = colptr_.size()-1;\n\n    mat_.n = n;\n    mat_.m = n;\n    mat_.flags = TAUCS_DOUBLE | TAUCS_SYMMETRIC | TAUCS_LOWER;\n\n    mat_.colptr   = &(colptr_[0]);\n    mat_.rowind   = &(rowind_[0]);\n    mat_.values.d = &(values_[0]);\n\n  }\n\n\n//-----------------------------------------------------------------------------\n\ntemplate< class GMM_MatrixT>\nvoid TaucsSolver::get_matrix_gmm( GMM_MatrixT& _mat)\n  {\n    gmm::resize( _mat, mat_.n, mat_.n);\n    gmm::clear( _mat);\n \n    // for all columns\n    for(int j=0; j<(int)colptr_.size()-1; ++j)\n    {\n      // for all lower triangular values\n      for(int i=colptr_[j]; i<colptr_[j+1]; ++i)\n      {\n\t// set value\n\t_mat(rowind_[i],j) = values_[i];\n\t// symmetric part\n\t_mat(j,rowind_[i]) = values_[i];\n      }\n    }\n  }\n\n}\n\n//=============================================================================\n#endif // COMISO_TAUCS_AVAILABLE\n//============================================================================="
  },
  {
    "path": "libs/CoMISo/Solver/UMFPACKSolver.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               CoMISo                                      *\n *      Copyright (C) 2008-2009 by Computer Graphics Group, RWTH Aachen      *\n *                           www.rwth-graphics.de                            *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of CoMISo.                                             *\n *                                                                           *\n *  CoMISo 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 *  CoMISo 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 CoMISo.  If not, see <http://www.gnu.org/licenses/>.          *\n *                                                                           *\n\\*===========================================================================*/ \n\n\n//== COMPILE-TIME PACKAGE REQUIREMENTS ========================================\n#include <CoMISo/Config/config.hh>\n#if COMISO_SUITESPARSE_AVAILABLE\n\n#include \"UMFPACKSolver.hh\"\n\n\nnamespace COMISO {\n\nUMFPACKSolver::UMFPACKSolver()\n{\n  // initialize zero pointers\n  symbolic_ = 0;\n  numeric_  = 0;\n\n  tolerance_ = 1e-8;\n  \n  //  ordering_ = CHOLMOD_AMD;\n    \n  show_timings_ = false;\n}\n\n\n  //-----------------------------------------------------------------------------\n  \n\nUMFPACKSolver::~UMFPACKSolver()\n{\n    if( symbolic_ )\n    {\n      umfpack_di_free_symbolic( &symbolic_);\n      symbolic_ = 0;\n    }\n\n    if( numeric_ )\n    {\n      umfpack_di_free_numeric( &numeric_);\n      numeric_ = 0;\n    }\n}\n  \n\n//-----------------------------------------------------------------------------\n\n\nbool UMFPACKSolver::calc_system( const std::vector<int>&    _colptr, \n\t\t\t\t const std::vector<int>&    _rowind, \n\t\t\t\t const std::vector<double>& _values)\n{\n  if(show_timings_) sw_.start();\n\n  colptr_ = _colptr;\n  rowind_ = _rowind;\n  values_ = _values;\n\n  int n   = colptr_.size()-1;\n\n  // clean up\n  if( symbolic_ )\n  {\n    umfpack_di_free_symbolic( &symbolic_);\n    symbolic_ = 0;\n  }\n  if( numeric_ )\n  {\n    umfpack_di_free_numeric( &numeric_);\n    numeric_ = 0;\n  }\n\n  if(show_timings_)\n  {\n    std::cerr << \" UMFPACK Timing cleanup: \" << sw_.stop()/1000.0 << \"s\\n\";\n    sw_.start();\n  }\n\n  int status;\n\n  // symbolic factorization\n  status = umfpack_di_symbolic(n,n,&(colptr_[0]), &(rowind_[0]), &(values_[0]), &symbolic_, 0, 0);\n\n  if( status != UMFPACK_OK )\n  {\n    std::cout << \"UMFPACK_symbolic failed\" << std::endl;\n    print_error( status);\n    return false;\n  }\n\n  if(show_timings_)\n  {\n    std::cerr << \" SuiteSparseQR_symbolic Timing: \" << sw_.stop()/1000.0 << \"s\\n\";\n    sw_.start();\n  }\n\n  // numeric factorization\n  status = umfpack_di_numeric ( &(colptr_[0]), &(rowind_[0]), &(values_[0]), symbolic_, &numeric_, 0, 0);\n\n  if( status != UMFPACK_OK )\n  {\n    std::cout << \"UMFPACK_numeric failed\" << std::endl;\n    print_error( status);\n    return false;\n  }\n\n  if(show_timings_)\n  {\n    std::cerr << \" SuiteSparseQR_numeric Timing: \" << sw_.stop()/1000.0 << \"s\\n\";\n    sw_.start();\n  }\n\n  return true;\n}\n\n\n\n  //-----------------------------------------------------------------------------\n\n    \nvoid UMFPACKSolver::print_error( int _status )\n{\n  switch(_status)\n  {\n    case UMFPACK_OK                    : std::cerr << \"UMFPACK Error: UMFPACK_OK\\n\";\n    case UMFPACK_ERROR_n_nonpositive   : std::cerr << \"UMFPACK Error: UMFPACK_ERROR_n_nonpositive\\n\";\n    case UMFPACK_ERROR_invalid_matrix  : std::cerr << \"UMFPACK Error: UMFPACK_ERROR_invalid_matrix\\n\";\n    case UMFPACK_ERROR_out_of_memory   : std::cerr << \"UMFPACK Error: UMFPACK_ERROR_out_of_memory\\n\";\n    case UMFPACK_ERROR_argument_missing: std::cerr << \"UMFPACK Error: UMFPACK_ERROR_argument_missing\\n\";\n    case UMFPACK_ERROR_internal_error  : std::cerr << \"UMFPACK Error: UMFPACK_ERROR_internal_error\\n\";\n    default: std::cerr << \"UMFPACK Error: UNSPECIFIED ERROR\\n\";\n  }\n}\n\n  //-----------------------------------------------------------------------------\n\n    \nbool UMFPACKSolver::update_system( const std::vector<int>& _colptr, \n\t\t\t\t   const std::vector<int>& _rowind, \n\t\t\t\t   const std::vector<double>& _values )\n{\n  if( !symbolic_ )\n    return false;\n\n\n  if(show_timings_) sw_.start();\n\n  colptr_ = _colptr;\n  rowind_ = _rowind;\n  values_ = _values;\n\n  if( numeric_ )\n  {\n    umfpack_di_free_numeric( &numeric_);\n    numeric_ = 0;\n  }\n\n  if(show_timings_)\n  {\n    std::cerr << \" UMFPACK Timing cleanup: \" << sw_.stop()/1000.0 << \"s\\n\";\n    sw_.start();\n  }\n\n  int status;\n\n  // numeric factorization\n  status = umfpack_di_numeric ( &(colptr_[0]), &(rowind_[0]), &(values_[0]), symbolic_, &numeric_, 0, 0);\n\n  if( status != UMFPACK_OK )\n  {\n    std::cout << \"UMFPACK_numeric failed\" << std::endl;\n    print_error( status);\n    return false;\n  }\n\n  if(show_timings_)\n  {\n    std::cerr << \" SuiteSparseQR_numeric Timing: \" << sw_.stop()/1000.0 << \"s\\n\";\n    sw_.start();\n  }\n\n  return true;\n}\n\n\n//-----------------------------------------------------------------------------\n  \n\nbool UMFPACKSolver::solve( double * _x, double * _b)\n{\n  if(show_timings_) sw_.start();\n\n  //  const unsigned int n = colptr_.size() - 1;\n\n  int status = umfpack_di_solve( UMFPACK_A, &(colptr_[0]), &(rowind_[0]), &(values_[0]), \n\t\t\t\t _x, _b, numeric_, 0, 0);\n\n\n  if( status != UMFPACK_OK )\n  {\n    std::cout << \"UMFPACK_solve failed\" << std::endl;\n    print_error( status);\n    return false;\n  }\n\n  if(show_timings_)\n  {\n    std::cerr << \" UMFPACK_sove Timing: \" << sw_.stop()/1000.0 << \"s\\n\";\n    sw_.start();\n  }\n\n\n    return true;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\n  \n}\n\n//=============================================================================\n#endif // COMISO_SUITESPARSE_AVAILABLE\n//=============================================================================\n"
  },
  {
    "path": "libs/CoMISo/Solver/UMFPACKSolver.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               CoMISo                                      *\n *      Copyright (C) 2008-2009 by Computer Graphics Group, RWTH Aachen      *\n *                           www.rwth-graphics.de                            *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of CoMISo.                                             *\n *                                                                           *\n *  CoMISo 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 *  CoMISo 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 CoMISo.  If not, see <http://www.gnu.org/licenses/>.          *\n *                                                                           *\n\\*===========================================================================*/ \n\n\n//=============================================================================\n//\n//  CLASS UMPFACKSolver\n//\n//=============================================================================\n\n#ifndef COMISO_UMFPACK_SOLVER_HH\n#define COMISO_UMFPACK_SOLVER_HH\n\n\n//== COMPILE-TIME PACKAGE REQUIREMENTS ========================================\n#include <CoMISo/Config/config.hh>\n#if COMISO_SUITESPARSE_AVAILABLE\n\n//== INCLUDES =================================================================\n\n\n#include <CoMISo/Config/CoMISoDefines.hh>\n#include \"GMM_Tools.hh\"\n\n#include <CoMISo/Utils/StopWatch.hh>\n\n#include <iostream>\n#include <vector>\n\n#include \"umfpack.h\"\n\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== CLASS DEFINITION =========================================================\nclass COMISODLLEXPORT UMFPACKSolver\n{\npublic:\n\n\n    // _size is maximal size this instance can handle (smaller problems are possible!!!)\n    UMFPACKSolver();\n    ~UMFPACKSolver();\n    \n    bool calc_system( const std::vector<int>&    _colptr, \n\t\t      const std::vector<int>&    _rowind, \n\t\t      const std::vector<double>& _values );\n\n\n    template< class GMM_MatrixT>\n    bool calc_system_gmm( const GMM_MatrixT& _mat);\n\n\n    bool update_system( const std::vector<int>&    _colptr, \n \t\t\tconst std::vector<int>&    _rowind, \n \t\t\tconst std::vector<double>& _values );\n\n\n    template< class GMM_MatrixT>\n    bool update_system_gmm( const GMM_MatrixT& _mat);\n\n\n    bool solve ( double *             _x0, double *             _b);\n\n    bool solve ( std::vector<double>& _x0, std::vector<double>& _b)\n    {return solve( &(_x0[0]), &(_b[0]));}\n\n    double tolerance() { return tolerance_; }\n\n    int ordering() { return ordering_; }\n\n    bool& show_timings() { return show_timings_;}\n    \n\n private:    \n    void print_error( int _status );\n\n private:\n    \n    void *symbolic_;\n    void *numeric_;\n\n    double tolerance_;\n\n    // specify Permutation ordering\n    // 1. user-provided permutation (only for cholmod analyze p).\n    // 2. AMD with default parameters.\n    // 3. METIS with default parameters.\n    // 4. NESDIS with default parameters\n    // 5. natural ordering (with weighted postorder).\n    // 6. NESDIS, nd small = 20000, prune dense = 10.\n    // 7. NESDIS, nd small = 4, prune dense = 10, no constrained minimum degree.\n    // 8. NESDIS, nd small = 200, prune dense = 0.\n    // 9. COLAMD for A*A’ or AMD for A\n    int ordering_;\n    \n    std::vector<double> values_;\n    std::vector<int>    colptr_;\n    std::vector<int>    rowind_;\n\n    bool show_timings_;\n    StopWatch sw_;\n};\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n#if defined(INCLUDE_TEMPLATES) && !defined(COMISO_UMFPACK_SOLVER_TEMPLATES_C)\n#define COMISO_UMFPACK_SOLVER_TEMPLATES\n#include \"UMFPACKSolverT.cc\"\n#endif\n//=============================================================================\n#endif // COMISO_SUITESPARSE_AVAILABLE\n//=============================================================================\n#endif // COMISO_UMFPACK_SOLVER_HH defined\n//=============================================================================\n"
  },
  {
    "path": "libs/CoMISo/Solver/UMFPACKSolverT.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               CoMISo                                      *\n *      Copyright (C) 2008-2009 by Computer Graphics Group, RWTH Aachen      *\n *                           www.rwth-graphics.de                            *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of CoMISo.                                             *\n *                                                                           *\n *  CoMISo 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 *  CoMISo 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 CoMISo.  If not, see <http://www.gnu.org/licenses/>.          *\n *                                                                           *\n\\*===========================================================================*/ \n\n\n\n#define COMISO_UMFPACK_SOLVER_TEMPLATES_C\n\n#include \"UMFPACKSolver.hh\"\n\n\nnamespace COMISO {\n\n\ntemplate< class GMM_MatrixT>\nbool UMFPACKSolver::calc_system_gmm( const GMM_MatrixT& _mat)\n{\n//   std::vector<int>    colptr;\n//   std::vector<int>    rowind;\n//   std::vector<double> values;\n    \n\n    if(show_timings_) sw_.start();\n\n    COMISO_GMM::get_ccs_symmetric_data( _mat,\n\t\t\t\t\t'c',\n\t\t\t\t\tvalues_, \n\t\t\t\t\trowind_, \n\t\t\t\t\tcolptr_ );\n    \n    if(show_timings_)\n    {\n      std::cerr << \"UMFPACK Timing GMM convert: \" << sw_.stop()/1000.0 << \"s\\n\";\n    }\n\n    return calc_system( colptr_, rowind_, values_);\n}\n  \n\n  //-----------------------------------------------------------------------------\n\n\ntemplate< class GMM_MatrixT>\nbool UMFPACKSolver::update_system_gmm( const GMM_MatrixT& _mat)\n{\n//   std::vector<int>    colptr;\n//   std::vector<int>    rowind;\n//   std::vector<double> values;\n    \n  COMISO_GMM::get_ccs_symmetric_data( _mat,\n\t\t\t\t      'c',\n\t\t\t\t      values_, \n\t\t\t\t      rowind_, \n\t\t\t\t      colptr_ );\n\n    return update_system( colptr_, rowind_, values_);\n}\n\n\n}\n"
  },
  {
    "path": "libs/CoMISo/Utils/MutablePriorityQueueT.hh",
    "content": "//=============================================================================\n//\n//  CLASS MutablePriorityQueue\n//\n//=============================================================================\n\n\n#ifndef COMISO_MUTABLEPRIORITYQUEUET_HH\n#define COMISO_MUTABLEPRIORITYQUEUET_HH\n\n\n//== INCLUDES =================================================================\n\n//== FORWARDDECLARATIONS ======================================================\n\n//== NAMESPACES ===============================================================\n\nnamespace COMISO {\n\n//== CLASS DEFINITION =========================================================\n\n\t      \n\n/** \\class MutablePriorityQueue MutablePriorityQueue.hh \n\n    Brief Description.\n  \n    A more elaborate description follows.\n*/\n\n\n// Helper Class for sorting triples\ntemplate<class A, class B, class C>\nclass Triple\n{\npublic: \n\n  // default constructor\n  Triple() {}\n  Triple(const A& _a, const B& _b, const C& _c) : first(_a), second(_b), third(_c) {}\n\n  bool operator<(const Triple& _t) const\n  { return (  this->first <  _t.first || \n\t      (this->first == _t.first && ( this->second <  _t.second || \n\t\t\t\t\t    ( this->second == _t.second && this->third < _t.third))));}\n\t\n  void print_info()\n  { std::cerr << first << \" \" << second << \" \" << third << std::endl; }\n\n  A first;\n  B second;\n  C third;\n};\n\ntemplate<class VType, class IType>\nclass MutablePriorityQueueT\n{\npublic:\n\n\n  typedef Triple<VType,IType,unsigned int> TripleVII;\n   \n  /// Default constructor\n  MutablePriorityQueueT() {}\n \n  /// Destructor\n  ~MutablePriorityQueueT() {}\n\n  // reset timestamps\n  void clear(int _n)\n  {\n    timestamp_.clear();\n    timestamp_.resize(_n,0);\n  }\n\n  // update value of index _id\n  void update(const IType& _id, const VType& _value)\n  {\n    queue_.insert( TripleVII(_value,_id, ++timestamp_[_id]));\n  }\n\n  // get index of next element4\n  IType get_next()\n  {\n    while(!queue_.empty())\n    {\n      // get and delete first element\n      TripleVII tri = *queue_.begin();\n      queue_.erase(queue_.begin());\n\n      // if valid -> return\n      if( timestamp_[tri.second] == tri.third)\n\treturn tri.second;\n    }\n\n    // if empty return dummy\n    return IType(0);\n  }\n\n\n  // priority queue empty?\n  bool empty()\n  {\n    while(!queue_.empty())\n    {\n      // get and delete first element\n      TripleVII tri = *queue_.begin();\n      \n      // if valid -> return true\n      if( timestamp_[tri.second] == tri.third)\n\treturn false;\n\n      queue_.erase(queue_.begin());\n    }\n    return true;\n  }\n  \nprivate:\n\n  // timestamps\n  std::vector<unsigned int> timestamp_;\n\n  // priority queue\n  std::set<TripleVII> queue_;\n};\n\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n#endif // COMISO_MUTABLEPRIORITYQUEUET_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/CoMISo/Utils/StopWatch.hh",
    "content": "//=============================================================================\n//\n//                               OpenFlipper\n//        Copyright (C) 2008 by Computer Graphics Group, RWTH Aachen\n//                           www.openflipper.org\n//\n//-----------------------------------------------------------------------------\n//\n//                                License\n//\n//  OpenFlipper is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU Lesser 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//  OpenFlipper 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 Lesser General Public License for more details.\n//\n//  You should have received a copy of the GNU Lesser General Public License\n//  along with OpenFlipper.  If not, see <http://www.gnu.org/licenses/>.\n//\n//-----------------------------------------------------------------------------\n//\n//   $Revision: 3468 $\n//   $Author: moebius $\n//   $Date: 2008-10-17 14:58:52 +0200 (Fri, 17 Oct 2008) $\n//\n//=============================================================================\n\n\n\n\n//=============================================================================\n//\n//  CLASS StopWatch\n//\n//=============================================================================\n\n\n#ifndef COMISO_STOPWATCH_HH\n#define COMISO_STOPWATCH_HH\n\n\n//== INCLUDES =================================================================\n\n\n#ifdef _WIN32\n\n#include <windows.h>\n\n#else // Linux\n\n#include <sys/time.h>\n\n#endif\n\n#include <CoMISo/Config/CoMISoDefines.hh>\n\n\n//== NAMESPACES ===============================================================\n\n\nnamespace COMISO {\n\n\n//== CLASS DEFINITION =========================================================\n\n\n\n/** \\class StopWatch StopWatch.hh <COMISO/Utils/StopWatch.hh>\n\n    This class can be used for measuring time, providing milli-second\n    precision by using the gettimeofday() funtion.  It is e.g. used in\n    the class COMISO::TimedTracing.\n**/\n\nclass COMISODLLEXPORT StopWatch\n{\npublic:\n\n  /// Constructor\n  StopWatch() {\n    #ifdef _WIN32\n      QueryPerformanceFrequency(&freq_);\n    #endif\n  }\n\n  /// Destructor\n  ~StopWatch() {}\n\n  /// Start time measurement\n  void start() {\n    #ifdef _WIN32\n      QueryPerformanceCounter(&starttime_);\n    #else\n      starttime_ = current_time();\n    #endif\n  }\n\n  /// Restart, return time elapsed until now.\n  double restart() {\n    #ifdef _WIN32\n      QueryPerformanceCounter(&endtime_);\n    #else\n      endtime_ = current_time();\n    #endif\n\n    double t = elapsed();\n    start();\n    return t;\n  }\n\n  /// Stop time measurement, return time.\n  double stop() {\n    #ifdef _WIN32\n      QueryPerformanceCounter(&endtime_);\n    #else\n      endtime_ = current_time();\n    #endif\n\n    return elapsed();\n  }\n\n  /// Get the total time in milli-seconds (watch has to be stopped).\n  double elapsed() const {\n    #ifdef _WIN32\n      return (double)(endtime_.QuadPart - starttime_.QuadPart)\n\t   / (double)freq_.QuadPart * 1000.0f;\n    #else\n      return ((endtime_.tv_sec  - starttime_.tv_sec )*1000.0 +\n\t      (endtime_.tv_usec - starttime_.tv_usec)*0.001);\n    #endif\n  }\n\n\nprivate:\n\n  #ifdef _WIN32\n    LARGE_INTEGER starttime_, endtime_;\n    LARGE_INTEGER freq_;\n  #else // Linux\n    timeval current_time() const {\n      struct timeval tv;\n      gettimeofday(&tv, 0);\n      return tv;\n    }\n\n    timeval starttime_, endtime_;\n  #endif\n\n};\n\n\n//=============================================================================\n} // namespace COMISO\n//=============================================================================\n#endif // COMISO_STOPWATCH_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/CoMISo/Utils/VSToolsT.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               CoMISo                                      *\n *      Copyright (C) 2008-2009 by Computer Graphics Group, RWTH Aachen      *\n *                           www.rwth-graphics.de                            *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of CoMISo.                                             *\n *                                                                           *\n *  CoMISo 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 *  CoMISo 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 CoMISo.  If not, see <http://www.gnu.org/licenses/>.          *\n *                                                                           *\n\\*===========================================================================*/ \n\n\n\n\n#ifndef VSTOOLS_HH\n#define VSTOOLS_HH\n\n\n//== FORWARDDECLARATIONS ======================================================\n\n//== NAMESPACES ===============================================================\n\n//== DEFINITION =========================================================\n\n/** These functions are required for Visual Studio to work around missing \n    functions. Basic equivalent functions for double exist in the float \n    header but are named different. So this wrapper makes them standard compatible.\n    */\n#ifdef WIN32\n #include <float.h>\n\n namespace std {\n\n   inline int isnan(double x)\n   {\n     return _isnan(x);\n   } \n\n   // Which idiot defines isinf as a macro somewhere?\n   #ifdef isinf \n     #undef isinf\n   #endif\n\n   inline int isinf(double x)\n   {\n     return !_finite(x);\n   } \n\n  }\n\n inline double nearbyint(double x) {\n   if( x >= 0.0 )\n     return int( x + 0.5 );\n   else\n     return int( x - 0.5 );\n }\n\n inline double round ( double _value ) {\n   return nearbyint(_value);\n }\n\n\n#endif\n\n\n//=============================================================================\n#endif // VSTOOLS_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/CoMISo/VERSION",
    "content": "VERSION=1.1 \nMAJOR=1\nMINOR=1\nPATCH=0\nID=COMISO\n"
  },
  {
    "path": "libs/CoMISo/cmake/ACGCommon.cmake",
    "content": "if (EXISTS ${CMAKE_SOURCE_DIR}/${CMAKE_PROJECT_NAME}.cmake)\n  include (${CMAKE_SOURCE_DIR}/${CMAKE_PROJECT_NAME}.cmake)\nendif ()\n\n# prevent build in source directory\nif (\"${CMAKE_BINARY_DIR}\" STREQUAL \"${CMAKE_SOURCE_DIR}\")\n    message (SEND_ERROR \"Building in the source directory is not supported.\")\n    message (FATAL_ERROR \"Please remove the created \\\"CMakeCache.txt\\\" file, the \\\"CMakeFiles\\\" directory and create a build directory and call \\\"${CMAKE_COMMAND} <path to the sources>\\\".\")\nendif (\"${CMAKE_BINARY_DIR}\" STREQUAL \"${CMAKE_SOURCE_DIR}\")\n\n# allow only Debug and Release builds\nset (CMAKE_CONFIGURATION_TYPES \"Debug;Release\" CACHE STRING \"\" FORCE)\nmark_as_advanced (CMAKE_CONFIGURATION_TYPES)\n\n# set Debus as default build target\nif (NOT CMAKE_BUILD_TYPE)\n  set (CMAKE_BUILD_TYPE Debug CACHE STRING\n      \"Choose the type of build, options are: Debug, Release.\"\n      FORCE)\nendif ()\n\n# create our output directroy\nif (NOT EXISTS ${CMAKE_BINARY_DIR}/Build)\n  file (MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/Build)\nendif ()\n\n# read version from file\nmacro (acg_get_version)\n    if (EXISTS \"${CMAKE_CURRENT_SOURCE_DIR}/${ARGN}/VERSION\")\n      file (READ \"${CMAKE_CURRENT_SOURCE_DIR}/${ARGN}/VERSION\" _file)\n    else ()\n      file (READ \"${CMAKE_CURRENT_SOURCE_DIR}/VERSION\" _file)\n    endif ()\n\n    string (\n        REGEX REPLACE\n        \"^.*ID=([^\\n]*).*$\" \"\\\\1\"\n        _id ${_file}\n    )\n    string (\n        REGEX REPLACE\n        \"^.*VERSION=([^\\n]*).*$\" \"\\\\1\"\n        _version ${_file}\n    )\n    string (\n        REGEX REPLACE\n        \"^.*MAJOR=([^\\n]*).*$\" \"\\\\1\"\n        _major ${_file}\n    )\n    string (\n        REGEX REPLACE\n        \"^.*MINOR=([^\\n]*).*$\" \"\\\\1\"\n        _minor ${_file}\n    )\n    string (\n        REGEX REPLACE\n        \"^.*PATCH=([^\\n]*).*$\" \"\\\\1\"\n        _patch ${_file}\n    )\n\n    set (${_id}_VERSION ${_version})\n    set (${_id}_VERSION_MAJOR ${_major})\n    set (${_id}_VERSION_MINOR ${_minor})\n    set (${_id}_VERSION_PATCH ${_patch})\nendmacro ()\n\n\n# set directory structures for the different platforms\nif (WIN32)\n  set (ACG_PROJECT_DATADIR \".\")\n  set (ACG_PROJECT_LIBDIR \"lib\")\n  set (ACG_PROJECT_BINDIR \".\")\n  set (ACG_PROJECT_PLUGINDIR \"Plugins\")\n  if (NOT EXISTS ${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_LIBDIR})\n    file (MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_LIBDIR})\n  endif ()\nelse ()\n  set (ACG_PROJECT_DATADIR \"share/${CMAKE_PROJECT_NAME}\")\n  set (ACG_PROJECT_LIBDIR \"lib/${CMAKE_PROJECT_NAME}\")\n  set (ACG_PROJECT_PLUGINDIR \"lib/${CMAKE_PROJECT_NAME}/plugins\")\n  set (ACG_PROJECT_BINDIR \"bin\")\nendif ()\n\n# allow a project to modify the directories\nif (COMMAND acg_modify_project_dirs)\n  acg_modify_project_dirs ()\nendif ()\n\nif (NOT EXISTS ${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_DATADIR})\n file (MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_DATADIR})\nendif ()\n\n\n# sets default build properties\nmacro (acg_set_target_props target)\n  if (WIN32)\n    set_target_properties (\n      ${target} PROPERTIES\n      BUILD_WITH_INSTALL_RPATH 1\n      SKIP_BUILD_RPATH 0\n    )\n  elseif (APPLE AND NOT ACG_PROJECT_MACOS_BUNDLE)\n    set_target_properties (\n      ${target} PROPERTIES\n      INSTALL_NAME_DIR \"@executable_path/../lib/${CMAKE_PROJECT_NAME}\"\n      BUILD_WITH_INSTALL_RPATH 1\n      SKIP_BUILD_RPATH 0\n    )\n  elseif (NOT APPLE)\n    set_target_properties (\n      ${target} PROPERTIES\n      INSTALL_RPATH \"$ORIGIN/../lib/${CMAKE_PROJECT_NAME}\"\n      BUILD_WITH_INSTALL_RPATH 1\n      SKIP_BUILD_RPATH 0\n      RUNTIME_OUTPUT_DIRECTORY \"${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_BINDIR}\"\n      LIBRARY_OUTPUT_DIRECTORY \"${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_LIBDIR}\"\n    )\n  endif ()\nendmacro ()\n\ninclude (AddFileDependencies)\ninclude (ACGCompiler)\n\n# define INCLUDE_TEMPLATES for everything we build\nadd_definitions (-DINCLUDE_TEMPLATES)\n\n# look for selected qt dependencies\nmacro (acg_qt4)\n  if (NOT QT4_FOUND)\n    find_package (Qt4 COMPONENTS QtCore QtGui ${ARGN})\n\n    set (QT_USE_QTOPENGL 1)\n    set (QT_USE_QTNETWORK 1)\n    set (QT_USE_QTSCRIPT 1)\n    set (QT_USE_QTSQL 1)\n    set (QT_USE_QTXML 1)\n    set (QT_USE_QTHELP 1)\n    set (QT_USE_QTWEBKIT 1)\n    set (QT_USE_QTUITOOLS 1)\n\n    include (${QT_USE_FILE})\n  endif ()\nendmacro ()\n\n# unsets the given variable\nmacro (acg_unset var)\n    set (${var} \"\" CACHE INTERNAL \"\")\nendmacro ()\n\n# sets the given variable\nmacro (acg_set var value)\n    set (${var} ${value} CACHE INTERNAL \"\")\nendmacro ()\n\n# test for OpenMP\nmacro (acg_openmp)\n  if (NOT OPENMP_NOTFOUND)\n    find_package(OpenMP)\n    if (OPENMP_FOUND)\n      set (CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}\")\n      set (CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}\")\n      add_definitions(-DUSE_OPENMP)\n    else ()\n      set (OPENMP_NOTFOUND 1)\n    endif ()\n  endif ()\nendmacro ()\n\n# test for FTGL\nmacro (acg_ftgl)\n  find_package (Freetype)\n\n  if (FREETYPE_FOUND)\n    find_package (FTGL)\n\n    if (FTGL_FOUND)\n      add_definitions (-DUSE_FTGL)\n      include_directories (${FTGL_INCLUDE_DIR} ${FREETYPE_INCLUDE_DIR_freetype2})\n      set (FTGL_LIBS ${FREETYPE_LIBRARIES} ${FTGL_LIBRARIES})\n    endif ()\n  endif ()\nendmacro ()\n\n# append all files with extension \"ext\" in the \"dirs\" directories to \"ret\"\nmacro (acg_append_files ret ext)\n  foreach (_dir ${ARGN})\n    file (GLOB _files \"${_dir}/${ext}\")\n    list (APPEND ${ret} ${_files})\n  endforeach ()\nendmacro ()\n\n# append all files with extension \"ext\" in the \"dirs\" directories and its subdirectories to \"ret\"\nmacro (acg_append_files_recursive ret ext)\n  foreach (_dir ${ARGN})\n    file (GLOB_RECURSE _files \"${_dir}/${ext}\")\n    list (APPEND ${ret} ${_files})\n  endforeach ()\nendmacro ()\n\n# drop all \"*T.cc\" files from list\nmacro (acg_drop_templates list)\n  foreach (_file ${${list}})\n    if (_file MATCHES \"T.cc$\")\n      list (REMOVE_ITEM ${list} ${_file})\n    endif ()\n  endforeach ()\nendmacro ()\n\n# generate moc targets for sources in list\nmacro (acg_qt4_automoc moc_SRCS)\n  qt4_get_moc_flags (_moc_INCS)\n\n  set (_matching_FILES )\n  foreach (_current_FILE ${ARGN})\n\n     get_filename_component (_abs_FILE ${_current_FILE} ABSOLUTE)\n     # if \"SKIP_AUTOMOC\" is set to true, we will not handle this file here.\n     # here. this is required to make bouic work correctly:\n     # we need to add generated .cpp files to the sources (to compile them),\n     # but we cannot let automoc handle them, as the .cpp files don't exist yet when\n     # cmake is run for the very first time on them -> however the .cpp files might\n     # exist at a later run. at that time we need to skip them, so that we don't add two\n     # different rules for the same moc file\n     get_source_file_property (_skip ${_abs_FILE} SKIP_AUTOMOC)\n\n     if ( NOT _skip AND EXISTS ${_abs_FILE} )\n\n        file (READ ${_abs_FILE} _contents)\n\n        get_filename_component (_abs_PATH ${_abs_FILE} PATH)\n\n        string (REGEX MATCHALL \"Q_OBJECT\" _match \"${_contents}\")\n        if (_match)\n            get_filename_component (_basename ${_current_FILE} NAME_WE)\n            set (_header ${_abs_FILE})\n            set (_moc    ${CMAKE_CURRENT_BINARY_DIR}/moc_${_basename}.cpp)\n\n            add_custom_command (OUTPUT ${_moc}\n                COMMAND ${QT_MOC_EXECUTABLE}\n                ARGS ${_moc_INCS} ${_header} -o ${_moc}\n                DEPENDS ${_header}\n            )\n\n            add_file_dependencies (${_abs_FILE} ${_moc})\n            set (${moc_SRCS} ${${moc_SRCS}} ${_moc})\n            \n        endif ()\n     endif ()\n  endforeach ()\nendmacro ()\n\n# generate uic targets for sources in list\nmacro (acg_qt4_autouic uic_SRCS)\n\n  set (_matching_FILES )\n  foreach (_current_FILE ${ARGN})\n\n     get_filename_component (_abs_FILE ${_current_FILE} ABSOLUTE)\n\n     if ( EXISTS ${_abs_FILE} )\n\n        file (READ ${_abs_FILE} _contents)\n\n        get_filename_component (_abs_PATH ${_abs_FILE} PATH)\n\n        get_filename_component (_basename ${_current_FILE} NAME_WE)\n        string (REGEX REPLACE \"Ui$\" \"\" _cbasename ${_basename})\n        set (_outfile ${CMAKE_CURRENT_BINARY_DIR}/ui_${_basename}.hh)\n        set (_header ${_basename}.hh)\n        set (_source ${_abs_PATH}/${_cbasename}.cc)\n        \n        add_custom_command (OUTPUT ${_outfile}\n            COMMAND ${QT_UIC_EXECUTABLE}\n            ARGS -o ${_outfile} ${_abs_FILE}\n            DEPENDS ${_abs_FILE})\n\n        add_file_dependencies (${_source} ${_outfile})\n        set (${uic_SRCS} ${${uic_SRCS}} ${_outfile})\n            \n     endif ()\n  endforeach ()\nendmacro ()\n\n# get all files in directory, but ignore svn\nmacro (acg_get_files_in_dir ret dir)\n  file (GLOB_RECURSE __files RELATIVE \"${dir}\" \"${dir}/*\")\n  foreach (_file ${__files})\n    if (NOT _file MATCHES \".*svn.*\")\n      list (APPEND ${ret} \"${_file}\")\n    endif ()\n  endforeach ()\nendmacro ()\n\n# copy the whole directory without svn files\nfunction (acg_copy_after_build target src dst)\n  acg_unset (_files)\n  acg_get_files_in_dir (_files ${src})\n  foreach (_file ${_files})\n    add_custom_command(TARGET ${target} POST_BUILD\n      COMMAND ${CMAKE_COMMAND} -E copy_if_different \"${src}/${_file}\" \"${dst}/${_file}\"\n    )\n  endforeach ()\nendfunction ()\n\n# install the whole directory without svn files\nfunction (acg_install_dir src dst)\n  acg_unset (_files)\n  acg_get_files_in_dir (_files ${src})\n  foreach (_file ${_files})\n    get_filename_component (_file_PATH ${_file} PATH)\n    install(FILES \"${src}/${_file}\"\n      DESTINATION \"${dst}/${_file_PATH}\"\n    )\n  endforeach ()\nendfunction ()\n\n# extended version of add_executable that also copies output to out Build directory\nfunction (acg_add_executable _target)\n  add_executable (${_target} ${ARGN})\n\n  # set common target properties defined in common.cmake\n  acg_set_target_props (${_target})\n\n  if (WIN32)\n    # copy exe file to \"Build\" directory\n    # Visual studio will create this file in a subdirectory so we can't use\n    # RUNTIME_OUTPUT_DIRECTORY directly here\n    add_custom_command (TARGET ${_target} POST_BUILD\n                        COMMAND ${CMAKE_COMMAND} -E\n                        copy_if_different\n                          ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${_target}.exe\n                          ${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_BINDIR}/${_target}.exe)\n  elseif (APPLE AND NOT ACG_PROJECT_MACOS_BUNDLE)\n    add_custom_command (TARGET ${_target} POST_BUILD\n                        COMMAND ${CMAKE_COMMAND} -E\n                        copy_if_different\n                          ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${_target}\n                          ${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_BINDIR}/${_target})\n  endif ()\n  if (NOT ACG_PROJECT_MACOS_BUNDLE OR NOT APPLE)\n    install (TARGETS ${_target} DESTINATION ${ACG_PROJECT_BINDIR})\n  endif ()\nendfunction ()\n\n# extended version of add_library that also copies output to out Build directory\nfunction (acg_add_library _target _libtype)\n\n  if (${_libtype} STREQUAL SHAREDANDSTATIC)\n    set (_type SHARED)\n    if (NOT WIN32)\n      set (_and_static 1)\n    else ()\n      set (_and_static 0)\n    endif ()    \n  else ()\n    set (_type ${_libtype})\n    set (_and_static 0)\n  endif ()\n\n  add_library (${_target} ${_type} ${ARGN} )\n\n  # set common target properties defined in common.cmake\n  acg_set_target_props (${_target})\n\n  if (_and_static)\n    add_library (${_target}Static STATIC ${ARGN})\n\n    # set common target properties defined in common.cmake\n    acg_set_target_props (${_target}Static)\n    \n    if (NOT APPLE)\n      set_target_properties (${_target}Static PROPERTIES \n                             LIBRARY_OUTPUT_DIRECTORY \"${CMAKE_LIBRARY_OUTPUT_DIRECTORY}\"\n                            )\n    endif ()\n  endif ()\n\n  if (WIN32)\n    # copy exe file to \"Build\" directory\n    # Visual studio will create this file in a subdirectory so we can't use\n    # RUNTIME_OUTPUT_DIRECTORY directly here\n    if (${_type} STREQUAL SHARED)\n      add_custom_command (TARGET ${_target} POST_BUILD\n                          COMMAND ${CMAKE_COMMAND} -E\n                          copy_if_different\n                            ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${_target}.dll\n                            ${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_BINDIR}/${_target}.dll)\n    elseif (${_type} STREQUAL MODULE)\n      if (NOT EXISTS ${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_PLUGINDIR})\n        file (MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_PLUGINDIR})\n      endif ()\n      add_custom_command (TARGET ${_target} POST_BUILD\n                          COMMAND ${CMAKE_COMMAND} -E\n                          copy_if_different\n                            ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${_target}.dll\n                            ${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_PLUGINDIR}/${_target}.dll)\n    endif ()\n    if (${_type} STREQUAL SHARED OR ${_type} STREQUAL STATIC)\n      add_custom_command (TARGET ${_target} POST_BUILD\n                          COMMAND ${CMAKE_COMMAND} -E\n                          copy_if_different\n                            ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${_target}.lib\n                            ${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_LIBDIR}/${_target}.lib)\n    endif ()\n  elseif (APPLE AND NOT ACG_PROJECT_MACOS_BUNDLE)\n    if (${_type} STREQUAL SHARED)\n      add_custom_command (TARGET ${_target} POST_BUILD\n                          COMMAND ${CMAKE_COMMAND} -E\n                          copy_if_different\n                            ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${_target}.dylib\n                            ${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_LIBDIR}/lib${_target}.dylib)\n    elseif (${_type} STREQUAL MODULE)\n      if (NOT EXISTS ${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_PLUGINDIR})\n        file (MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_PLUGINDIR})\n      endif ()\n      add_custom_command (TARGET ${_target} POST_BUILD\n                          COMMAND ${CMAKE_COMMAND} -E\n                          copy_if_different\n                            ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${_target}.so\n                            ${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_PLUGINDIR}/lib${_target}.so)\n    elseif (${_type} STREQUAL STATIC)\n      add_custom_command (TARGET ${_target} POST_BUILD\n                          COMMAND ${CMAKE_COMMAND} -E\n                          copy_if_different\n                            ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${_target}.a\n                            ${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_LIBDIR}/lib${_target}.a)\n    endif ()\n    if (_and_static)\n      add_custom_command (TARGET ${_target}Static POST_BUILD\n                          COMMAND ${CMAKE_COMMAND} -E\n                          copy_if_different\n                            ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${_target}Static.a\n                            ${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_LIBDIR}/lib${_target}.a)\n    endif ()\n\n  elseif (NOT APPLE AND _and_static)\n      add_custom_command (TARGET ${_target}Static POST_BUILD\n                          COMMAND ${CMAKE_COMMAND} -E\n                          copy_if_different\n                            ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${_target}Static.a\n                            ${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_LIBDIR}/lib${_target}.a)\n\n  endif ()\n  \n  if (NOT ACG_PROJECT_MACOS_BUNDLE OR NOT APPLE)\n    if (${_type} STREQUAL SHARED OR ${_type} STREQUAL STATIC )\n      install (TARGETS ${_target}\n               RUNTIME DESTINATION ${ACG_PROJECT_BINDIR}\n               LIBRARY DESTINATION ${ACG_PROJECT_LIBDIR}\n               ARCHIVE DESTINATION ${ACG_PROJECT_LIBDIR})\n      if (_and_static)\n        install (FILES ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${_target}Static.a\n                 DESTINATION ${ACG_PROJECT_LIBDIR}\n                 RENAME lib${_target}.a\n                 PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)\n      endif ()\n    elseif (${_type} STREQUAL MODULE)\n      install (TARGETS ${_target} DESTINATION ${ACG_PROJECT_PLUGINDIR})\n    endif ()\n  endif ()\nendfunction ()\n"
  },
  {
    "path": "libs/CoMISo/cmake/ACGCompiler.cmake",
    "content": "################################################################################\n# Custom settings for compiler flags and similar\n################################################################################\n\nif (UNIX)\n        \n  set (CMAKE_CFLAGS_RELEASE \"-O3 -DINCLUDE_TEMPLATES -W -Wall -Wno-unused -DNDEBUG\")\n  set (CMAKE_CXX_FLAGS_RELEASE \"-O3 -DINCLUDE_TEMPLATES -ftemplate-depth-100 -W -Wall -Wno-unused -DNDEBUG\")\n  set (CMAKE_C_FLAGS_DEBUG \"-g -DINCLUDE_TEMPLATES -W -Wall -Wno-unused -DDEBUG\")\n  set (CMAKE_CXX_FLAGS_DEBUG \"-g -DINCLUDE_TEMPLATES -ftemplate-depth-100 -W -Wall -Wno-unused -DDEBUG\")\n\n  if (APPLE)\n    add_definitions( -DARCH_DARWIN )\n    set (CMAKE_CXX_FLAGS_RELEASE \"${CMAKE_CXX_FLAGS_RELEASE} -Wno-non-virtual-dtor\")\n    set (CMAKE_CXX_FLAGS_DEBUG \"${CMAKE_CXX_FLAGS_DEBUG} -Wno-non-virtual-dtor\")\n  endif ()\nendif ()\n"
  },
  {
    "path": "libs/CoMISo/cmake/ACGOutput.cmake",
    "content": "# fill string with spaces\nmacro (acg_format_string str length return)\n    string (LENGTH \"${str}\" _str_len)\n    math (EXPR _add_chr \"${length} - ${_str_len}\")\n    set (${return} \"${str}\")\n    while (_add_chr GREATER 0)\n        set (${return} \"${${return}} \")\n        math (EXPR _add_chr \"${_add_chr} - 1\")\n    endwhile ()\nendmacro ()\n\n# print message with color escape sequences if CMAKE_COLOR_MAKEFILE is set\nstring (ASCII 27 _escape)\nfunction (acg_color_message _str)\n    if (CMAKE_COLOR_MAKEFILE AND NOT WIN32)\n        message (${_str})\n    else ()\n        string (REGEX REPLACE \"${_escape}.[0123456789;]*m\" \"\" __str ${_str})\n        message (${__str})\n    endif ()\nendfunction ()\n\n# info header\nfunction (acg_print_configure_header _id _name)\n    acg_format_string (\"${_name}\" 40 _project)\n    acg_format_string (\"${${_id}_VERSION}\" 40 _version)\n    acg_color_message (\"\\n${_escape}[40;37m************************************************************${_escape}[0m\")\n    acg_color_message (\"${_escape}[40;37m* ${_escape}[1;31mACG ${_escape}[0;40;34mBuildsystem${_escape}[0m${_escape}[40;37m                                          *${_escape}[0m\")\n    acg_color_message (\"${_escape}[40;37m*                                                          *${_escape}[0m\")\n    acg_color_message (\"${_escape}[40;37m* Package : ${_escape}[32m${_project} ${_escape}[37m      *${_escape}[0m\")\n    acg_color_message (\"${_escape}[40;37m* Version : ${_escape}[32m${_version} ${_escape}[37m      *${_escape}[0m\")\n    acg_color_message (\"${_escape}[40;37m************************************************************${_escape}[0m\")\nendfunction ()\n\n# info line\nfunction (acg_print_configure_footer)\n    acg_color_message (\"${_escape}[40;37m************************************************************${_escape}[0m\\n\")\nendfunction ()\n\n"
  },
  {
    "path": "libs/CoMISo/cmake/CGAL_FindPackageHandleStandardArgs.cmake",
    "content": "# FIND_PACKAGE_HANDLE_STANDARD_ARGS(NAME (DEFAULT_MSG|\"Custom failure message\") VAR1 ... )\n#    This macro is intended to be used in FindXXX.cmake modules files.\n#    It handles the REQUIRED and QUIET argument to FIND_PACKAGE() and\n#    it also sets the <UPPERCASED_NAME>_FOUND variable.\n#    The package is found if all variables listed are TRUE.\n#    Example:\n#\n#    FIND_PACKAGE_HANDLE_STANDARD_ARGS(LibXml2 DEFAULT_MSG LIBXML2_LIBRARIES LIBXML2_INCLUDE_DIR)\n#\n#    LibXml2 is considered to be found, if both LIBXML2_LIBRARIES and \n#    LIBXML2_INCLUDE_DIR are valid. Then also LIBXML2_FOUND is set to TRUE.\n#    If it is not found and REQUIRED was used, it fails with FATAL_ERROR, \n#    independent whether QUIET was used or not.\n#    If it is found, the location is reported using the VAR1 argument, so \n#    here a message \"Found LibXml2: /usr/lib/libxml2.so\" will be printed out.\n#    If the second argument is DEFAULT_MSG, the message in the failure case will \n#    be \"Could NOT find LibXml2\", if you don't like this message you can specify\n#    your own custom failure message there.\n\nmacro(FIND_PACKAGE_HANDLE_STANDARD_ARGS _NAME _FAIL_MSG _VAR1 )\n\n  if(\"${_FAIL_MSG}\" STREQUAL \"DEFAULT_MSG\")\n    set(_FAIL_MESSAGE \"Could NOT find ${_NAME}\")\n  else()\n    set(_FAIL_MESSAGE \"${_FAIL_MSG}\")\n  endif()\n\n  string(TOUPPER ${_NAME} _NAME_UPPER)\n\n  set(${_NAME_UPPER}_FOUND TRUE)\n  if(NOT ${_VAR1})\n    set(${_NAME_UPPER}_FOUND FALSE)\n  endif()\n\n  foreach(_CURRENT_VAR ${ARGN})\n    if(NOT ${_CURRENT_VAR})\n      set(${_NAME_UPPER}_FOUND FALSE)\n    endif()\n  endforeach()\n  \n  if (${_NAME_UPPER}_FOUND)\n    if (NOT ${_NAME}_FIND_QUIETLY)\n      message(STATUS \"Found ${_NAME}: ${${_VAR1}}\")\n    endif()\n  else()\n    if (${_NAME}_FIND_REQUIRED)\n      message(FATAL_ERROR \"${_FAIL_MESSAGE}\")\n    else()\n      if (NOT ${_NAME}_FIND_QUIETLY)\n        message(STATUS \"${_FAIL_MESSAGE}\")\n      endif()\n    endif()\n  endif()\n  \nendmacro()\n"
  },
  {
    "path": "libs/CoMISo/cmake/CGAL_GeneratorSpecificSettings.cmake",
    "content": "if ( NOT CGAL_GENERATOR_SPECIFIC_SETTINGS_FILE_INCLUDED )\n  set( CGAL_GENERATOR_SPECIFIC_SETTINGS_FILE_INCLUDED 1 )\n \n  message( STATUS \"Targetting ${CMAKE_GENERATOR}\")\n  \n  if ( MSVC )\n    message( STATUS \"Target build enviroment supports auto-linking\" )\n    set(CGAL_AUTO_LINK_ENABLED TRUE)\n  endif()\n\n  if ( MSVC90 )  \n    set(CGAL_TOOLSET \"vc90\")\n    message( STATUS \"Using VC90 compiler.\" )\n  elseif ( MSVC80 )  \n    set(CGAL_TOOLSET \"vc80\")\n    message( STATUS \"Using VC80 compiler.\" )\n  elseif ( MSVC71 )\n    set(CGAL_TOOLSET \"vc71\")\n    message( STATUS \"Using VC71 compiler.\" )\n  else()\n    message( STATUS \"Using ${CMAKE_CXX_COMPILER} compiler.\" )\n  endif()\n\n  \n  # From james Bigler, in the cmake users list.\n  IF (APPLE)\n    exec_program(uname ARGS -v  OUTPUT_VARIABLE DARWIN_VERSION)\n    string(REGEX MATCH \"[0-9]+\" DARWIN_VERSION ${DARWIN_VERSION})\n    message(STATUS \"DARWIN_VERSION=${DARWIN_VERSION}\")\n    if (DARWIN_VERSION GREATER 8)\n       message(STATUS \"Mac Leopard detected\")\n      set(CGAL_APPLE_LEOPARD 1)\n    endif()\n  endif()\n  \n  if ( NOT \"${CMAKE_CFG_INTDIR}\" STREQUAL \".\" )\n    set(HAS_CFG_INTDIR TRUE CACHE INTERNAL \"Generator uses intermediate configuration directory\" )\n    message( STATUS \"Generator uses intermediate configuration directory: ${CMAKE_CFG_INTDIR}\" )\n  endif()\n\nendif()\n"
  },
  {
    "path": "libs/CoMISo/cmake/CGAL_Locate_CGAL_TAUCS.cmake",
    "content": "# Find TAUCS library shipped with CGAL\n#\n# This module searches for TAUCS in CGAL \"auxiliary\" folder\n# and in in $CGAL_TAUCS_DIR environment variable.\n#\n# This module sets the following variables:\n#  CGAL_TAUCS_FOUND - set to true if TAUCS library shipped with CGAL\n#    is found\n#  CGAL_TAUCS_PLATFORM - name of TAUCS subfolder corresponding to the current compiler\n#  CGAL_TAUCS_INCLUDE_DIR - list of folders (using full path name) containing\n#    TAUCS (and optionaly BLAS and LAPACK) headers\n#  CGAL_TAUCS_LIBRARIES_DIR -list of folders (using full path name) containing\n#    TAUCS (and optionaly BLAS and LAPACK) libraries\n\ninclude(CGAL_Macros)\n\nif ( NOT CGAL_TAUCS_FOUND )\n\n  #\n  # Find out TAUCS name for the current platform.\n  # This code is a translation of TAUCS \"configure\" script.\n  #\n\n  # The first task is to figure out CMAKE_SYSTEM_NAME\n  # (on unix this is uname -s, for windows it is Windows).\n  #message(\"DEBUG: CMAKE_SYSTEM_NAME = ${CMAKE_SYSTEM_NAME}\")\n  #message(\"DEBUG: CMAKE_SYSTEM_PROCESSOR = ${CMAKE_SYSTEM_PROCESSOR}\")\n  set( CGAL_TAUCS_PLATFORM \"${CMAKE_SYSTEM_NAME}\" )\n\n  # Convert to lower case\n  STRING(TOLOWER \"${CGAL_TAUCS_PLATFORM}\" CGAL_TAUCS_PLATFORM)\n\n  # Sometimes uname returns a value that is\n  # inconsistent with the way CGAL_TAUCS_PLATFORM is set. For example, on\n  # Solaris, CGAL_TAUCS_PLATFORM=solaris but uname returns SunOS.\n  if ( ${CGAL_TAUCS_PLATFORM} STREQUAL \"sunos\" )\n    set( CGAL_TAUCS_PLATFORM \"solaris\" )\n  endif()\n  if ( ${CGAL_TAUCS_PLATFORM} STREQUAL \"windows\" )\n    set( CGAL_TAUCS_PLATFORM \"win32\" )\n  endif()\n\n  # LS 2007: added \"darwin_intel\" for Intel Macs.\n  # \"darwin\" = original Darwin platform = PowerPC architecture.\n  if ( ${CGAL_TAUCS_PLATFORM} STREQUAL \"darwin\" )\n    # CMAKE_SYSTEM_PROCESSOR=uname -p\n    if ( ${CMAKE_SYSTEM_PROCESSOR} STREQUAL \"i386\" )\n      set( CGAL_TAUCS_PLATFORM \"darwin_intel\" )\n    endif()\n  endif()\n\n  # LS 2007: append \"64\" if 64 bits processor (tested on Linux only)\n\n  if ( ${CGAL_TAUCS_PLATFORM} STREQUAL \"linux\" )\n    # CMAKE_SYSTEM_PROCESSOR=uname -p\n    if ( ${CMAKE_SYSTEM_PROCESSOR} MATCHES \".*64.*\" )\n      set( CGAL_TAUCS_PLATFORM \"${CGAL_TAUCS_PLATFORM}64\" )\n    endif()\n  endif()\n\n  #message(\"DEBUG: CGAL_TAUCS_PLATFORM = ${CGAL_TAUCS_PLATFORM}\")\n\n\n  #\n  # Search for TAUCS folder.\n  #\n\n  #message(\"DEBUG: CGAL_SOURCE_DIRECTORY = ${CGAL_SOURCE_DIRECTORY}\")\n\n  # VC++ uses auto-link, thus we search for a folder containing the output of\n  # build_taucs_win32_for_CGAL.bat/build_taucs_win64_for_CGAL.bat,\n  # ie TAUCS libraries compiled for all Windows runtimes.\n  if ( MSVC )\n\n    # Check $CGAL_TAUCS_DIR environment variable\n    fetch_env_var(CGAL_TAUCS_DIR)\n    #message(\"DEBUG: CGAL_TAUCS_DIR = ${CGAL_TAUCS_DIR}\")\n    if (NOT \"${CGAL_TAUCS_DIR}\" STREQUAL \"\" AND EXISTS ${CGAL_TAUCS_DIR})\n\n      set( CGAL_TAUCS_INCLUDE_DIR   \"${CGAL_TAUCS_DIR}/include\")\n      set( CGAL_TAUCS_LIBRARIES_DIR \"${CGAL_TAUCS_DIR}/lib\"    )\n      set( CGAL_TAUCS_FOUND TRUE )\n\n    # Else, search for TAUCS in CGAL \"auxiliary\" folder\n    elseif ( EXISTS \"${CGAL_SOURCE_DIRECTORY}/auxiliary/taucs\" )\n\n      set( CGAL_TAUCS_INCLUDE_DIR   \"${CGAL_SOURCE_DIRECTORY}/auxiliary/taucs/include\")\n      set( CGAL_TAUCS_LIBRARIES_DIR \"${CGAL_SOURCE_DIRECTORY}/auxiliary/taucs/lib\"    )\n      set( CGAL_TAUCS_FOUND TRUE )\n\n    endif()\n\n  # On Unix, search for TAUCS \"taucs_full\" folder\n  else ( MSVC )\n\n    # Check $CGAL_TAUCS_DIR environment variable\n    fetch_env_var(CGAL_TAUCS_DIR)\n    #message(\"DEBUG: CGAL_TAUCS_DIR = ${CGAL_TAUCS_DIR}\")\n    if (NOT \"${CGAL_TAUCS_DIR}\" STREQUAL \"\" AND EXISTS ${CGAL_TAUCS_DIR})\n\n        set( CGAL_TAUCS_INCLUDE_DIR   \"${CGAL_TAUCS_DIR}/build/${CGAL_TAUCS_PLATFORM}\"\n                                      \"${CGAL_TAUCS_DIR}/src\" )\n        set( CGAL_TAUCS_LIBRARIES_DIR \"${CGAL_TAUCS_DIR}/external/lib/${CGAL_TAUCS_PLATFORM}\"\n                                      \"${CGAL_TAUCS_DIR}/lib/${CGAL_TAUCS_PLATFORM}\" )\n        set( CGAL_TAUCS_FOUND TRUE )\n\n    endif()\n\n  endif ( MSVC )\n\n  # Add variables to cache\n  set( CGAL_TAUCS_DIR   \"${CGAL_TAUCS_DIR}\"\n                        CACHE PATH \"Directory containing BLAS, LAPACK and TAUCS\" )\n\n  #message(\"DEBUG: CGAL_TAUCS_INCLUDE_DIR = ${CGAL_TAUCS_INCLUDE_DIR}\")\n  #message(\"DEBUG: CGAL_TAUCS_LIBRARIES_DIR = ${CGAL_TAUCS_LIBRARIES_DIR}\")\n  #message(\"DEBUG: CGAL_TAUCS_FOUND = ${CGAL_TAUCS_FOUND}\")\n\nendif ( NOT CGAL_TAUCS_FOUND )\n\n"
  },
  {
    "path": "libs/CoMISo/cmake/CGAL_Macros.cmake",
    "content": "if( NOT CGAL_MACROS_FILE_INCLUDED )\n  set(CGAL_MACROS_FILE_INCLUDED 1 )\n  \n  macro(assert _arg )\n    if ( NOT ${_arg} )\n      message( FATAL_ERROR \"Variable ${_arg} must be defined\" ) \n    endif()\n  endmacro()\n\n  macro( hide_variable var )\n    set ( ${var} ${${var}} CACHE INTERNAL \"Variable hidden from user\" FORCE )  \n  endmacro()\n\n  macro( cache_set var )\n    set ( ${var} ${ARGN} CACHE INTERNAL \"\" )  \n    set ( ${var} ${ARGN} CACHE INTERNAL \"\" )  \n  endmacro()\n  \n  macro( typed_cache_set type doc var )\n    set ( ${var} ${ARGN} CACHE ${type} ${doc} FORCE )  \n    set ( ${var} ${ARGN} CACHE ${type} ${doc} FORCE )  \n  endmacro()\n  \n  macro( cache_get var )\n    set ( ${var} )  \n  endmacro()\n\n  # Splits inlist in the first element (head) and the rest (tail)\n  macro( list_split head tail )\n    set( ${head} ) \n    set( ${tail} )\n    set( _LS_is_head TRUE )\n    foreach( _LS_item ${ARGN} )\n      if ( _LS_is_head )\n        set( ${head} ${_LS_item} ) \n        set( _LS_is_head FALSE )\n      else()\n        list( APPEND ${tail} ${_LS_item} )\n      endif()\n    endforeach()\n  endmacro()\n\n  # adds elements to an internal cached list  \n  macro( add_to_cached_list listname )\n    cache_get ( ${listname} )\n    set( _ATC_${listname}_tmp  ${${listname}} )\n    if ( NOT \"${ARGN}\" STREQUAL \"\" )\n      list( APPEND _ATC_${listname}_tmp ${ARGN} )\n    endif()\n    cache_set ( ${listname} ${_ATC_${listname}_tmp} )\n  endmacro()\n  \n  # adds elements to an in-memory variable named 'listname'\n  macro( add_to_memory_list listname )\n    if ( NOT \"${ARGN}\" STREQUAL \"\" )\n      list( APPEND ${listname} ${ARGN} )\n    endif()\n  endmacro()\n\n  # adds elements to a list.\n  # If the first argument after 'listname' is PERSISTENT then 'listname' \n  # is a persistent internal cached variable, otherwise is a memory variable.\n  macro( add_to_list listname )\n    list_split( _ATL_ARGN_HEAD _ATL_ARGN_TAIL ${ARGN} )\n    if ( \"${_ATL_ARGN_HEAD}\" STREQUAL \"PERSISTENT\" )\n      add_to_cached_list( ${listname} ${_ATL_ARGN_TAIL} )\n    else()\n      add_to_memory_list( ${listname} ${ARGN} )\n    endif()\n  endmacro()\n\n  macro( at list idx var )\n    list( LENGTH ${list} ${list}_length )\n    if ( ${idx} LESS ${${list}_length} )\n      list( GET ${list} ${idx} ${var} )\n    else()\n      set( ${var} \"NOTFOUND\" )    \n    endif()\n  endmacro()\n  \n  macro( found_in_list item_list item result )\n    set( ${result} \"FALSE\" )\n    foreach( element ${${item_list}} )\n      if ( \"${element}\" STREQUAL \"${item}\" )\n        set( ${result} \"TRUE\" )\n      endif()\n    endforeach()  \n  endmacro()\n  \n  macro( uniquely_add_flags target_var )\n    if ( \"${ARGC}\" GREATER \"1\"  )\n      set( target_list \"${${target_var}}\" )\n      set( source_list \"${ARGN}\" )\n      separate_arguments( target_list )\n      separate_arguments( source_list )\n      foreach( flag ${source_list} )\n        found_in_list( target_list ${flag} ${flag}_FOUND )\n        if ( NOT ${flag}_FOUND )\n          typed_cache_set( STRING \"User-defined flags\" ${target_var} \"${${target_var}} ${flag}\" )\n        endif()  \n      endforeach()\n    endif()\n  endmacro()\n  \n  macro( get_dependency_version LIB )\n  \n    if ( \"${ARGC}\" GREATER \"1\" )\n      set( PKG ${ARGV1} )\n    else()\n      set( PKG ${LIB} )\n    endif()\n    \n    if ( ${PKG}_FOUND )\n    \n      set ( ${LIB}_VERSION \"unknown\" )\n      \n      try_run( ${LIB}_RUN_RES\n               ${LIB}_COMPILE_RES \n               \"${CMAKE_BINARY_DIR}\"\n               \"${CMAKE_SOURCE_DIR}/config/support/print_${LIB}_version.cpp\"\n               CMAKE_FLAGS \"-DINCLUDE_DIRECTORIES:STRING=${${PKG}_DEPENDENCY_INCLUDE_DIR};${${PKG}_INCLUDE_DIR}\"\n                           \"-DLINK_LIBRARIES:STRING=${${PKG}_DEPENDENCY_LIBRARIES};${${PKG}_LIBRARIES}\"\n                           \"-DLINK_DIRECTORIES:STRING=${${PKG}_DEPENDENCY_LIBRARY_DIR};${${PKG}_LIBRARY_DIR}\"\n               OUTPUT_VARIABLE ${LIB}_OUTPUT \n            )\n            \n      if ( ${LIB}_COMPILE_RES )\n      \n        if ( ${LIB}_RUN_RES EQUAL \"0\" )\n        \n          string( REGEX MATCH \"version=.*\\$\" ${LIB}_VERSION_LINE ${${LIB}_OUTPUT}  )\n          string( REPLACE \"\\n\" \"\" ${LIB}_VERSION_LINE2 ${${LIB}_VERSION_LINE} )\n          string( REPLACE \"\\r\" \"\" ${LIB}_VERSION_LINE3 ${${LIB}_VERSION_LINE2} )\n          string( REPLACE \"version=\" \"\" ${LIB}_VERSION ${${LIB}_VERSION_LINE3} )\n          \n        else()\n        \n          message( STATUS \"WARNING: ${LIB} found but print_${LIB}_version.cpp exited with error condition: ${${LIB}_RUN_RES}\" )\n          message( STATUS \"${PKG}_INCLUDE_DIR=${${PKG}_INCLUDE_DIR}\" )\n          message( STATUS \"${PKG}_LIBRARIES=${${PKG}_LIBRARIES}\" )\n          message( STATUS \"${PKG}_LIBRARY_DIR=${${PKG}_LIBRARY_DIR}\" )\n          message( STATUS \"${${LIB}_OUTPUT}\" )\n          \n        endif()\n        \n      else()\n      \n        message( STATUS \"WARNING: ${LIB} found but could not compile print_${LIB}_version.cpp:\")\n        message( STATUS \"${PKG}_INCLUDE_DIR=${${PKG}_INCLUDE_DIR}\" )\n        message( STATUS \"${PKG}_LIBRARIES=${${PKG}_LIBRARIES}\" )\n        message( STATUS \"${PKG}_LIBRARY_DIR=${${PKG}_LIBRARY_DIR}\" )\n        message( STATUS \"${${LIB}_OUTPUT}\" )\n        \n      endif() \n      \n      message( STATUS \"USING ${LIB}_VERSION = '${${LIB}_VERSION}'\" )\n  \n    endif()\n    \n  endmacro()\n\n  macro( create_CGALconfig_files )\n    # FindCGAL and UseCGAL are platform specific so they are generated and stored in the binary folder.\n    configure_file(${CGAL_MODULES_DIR}/CGALConfig_binary.cmake.in  ${CMAKE_BINARY_DIR}/CGALConfig.cmake       @ONLY IMMEDIATE)\n    \n    if ( SOURCE_INSTALL )\n      configure_file(${CGAL_MODULES_DIR}/CGALConfig_install.cmake.source.in ${CMAKE_BINARY_DIR}/config/CGALConfig.cmake @ONLY IMMEDIATE)\n    else()\n      configure_file(${CGAL_MODULES_DIR}/CGALConfig_install.cmake.fhs.in    ${CMAKE_BINARY_DIR}/config/CGALConfig.cmake @ONLY IMMEDIATE)\n    endif()\n  endmacro()\n  \n  macro ( fetch_env_var VAR )\n    if ( \"${${VAR}}\" STREQUAL \"\" )\n      set( ${VAR}_env_value \"$ENV{${VAR}}\" )\n      if ( NOT \"${${VAR}_env_value}\" STREQUAL \"\" )\n        set( ${VAR} ${${VAR}_env_value} )\n      endif()\n    endif()\n  endmacro()\n  \n  # Composes a tagged list of libraries: a list with interpersed keywords or tags\n  # indicating that all following libraries, up to the next tag, are to be linked only for the\n  # corresponding build type. The 'general' tag indicates libraries that corresponds to all build types.\n  # 'optimized' corresponds to release builds and 'debug' to debug builds. Tags are case sensitve and \n  # the inital range of libraries listed before any tag is implicitely 'general' \n  #\n  # This macro takes 3 lists of general, optimized and debug libraries, resp, and populates the list\n  # given in the fourth argument.\n  #\n  # The first three parameters must be strings containing a semi-colon separated list of elements.\n  # All three lists must be passed, but any of them can be an empty string \"\".\n  # The fourth parameter, corresponding to the result, must be a variable name and it will be APPENDED \n  # (retaining any previous contents)\n  #\n  # If there is a last parameter whose value is \"PERSISTENT\" then the result is an internal cached variable,\n  # otherwise it is an in-memory variable\n  #\n  macro( compose_tagged_libraries libs_general libs_optimized libs_debug libs )\n\n    if ( \"${ARGN}\" STREQUAL \"PERSISTENT\" )\n      set( _CTL_IN_CACHE \"PERSISTENT\" )\n    else()\n      set( _CTL_IN_CACHE )\n    endif()\n\n    if ( NOT \"${libs_general}\" STREQUAL \"\" )\n      add_to_list( ${libs} ${_CTL_IN_CACHE} ${libs_general} )\n    endif()\n\n    if ( NOT \"${libs_optimized}\" STREQUAL \"\" )\n      add_to_list( ${libs} ${_CTL_IN_CACHE} optimized ${libs_optimized} )\n    endif()\n  \n    if ( NOT \"${libs_debug}\" STREQUAL \"\" )\n      add_to_list( ${libs} ${_CTL_IN_CACHE} debug ${libs_debug} )\n    endif()\n\n  endmacro()\n\n  # Decomposes a tagged list of libraries (see macro compose_tagged_libraries).\n  # The first argument is the tagged list and the next 3 arguments are the lists\n  # where the general, optimized and debug libraries are collected.\n  #\n  # The first parameter must be a string containing a semi-colon separated list of elements.\n  # It cannot be ommitted, but it can be an empty string \"\"\n  #\n  # TThe next three arguments must be the names of the variables containing the result, and they\n  # will be APPENDED (retaining any previous contents)\n  #\n  # If there is a last parameter whose value is \"PERSISTENT\" then the result variables are internal in the cache,\n  # otherwise they are in-memory.\n  #\n  macro( decompose_tagged_libraries libs libs_general libs_optimized libs_debug )\n\n    if ( \"${ARGN}\" STREQUAL \"PERSISTENT\" )\n      set( _DTL_IN_CACHE \"PERSISTENT\" )\n    else()\n      set( _DTL_IN_CACHE )\n    endif()\n\n    set( _DTL_tag general )\n\n    foreach( _DTL_lib ${libs} )\n\n      if ( \"${_DTL_lib}\" STREQUAL \"general\" OR \"${_DTL_lib}\" STREQUAL \"optimized\" OR \"${_DTL_lib}\" STREQUAL \"debug\" )\n\n        set( _DTL_tag \"${_DTL_lib}\" )\n\n      else()\n\n        if (     \"${_DTL_tag}\" STREQUAL \"general\"   ) \n                                                       set( _DTL_target ${libs_general}   )        \n        elseif ( \"${_DTL_tag}\" STREQUAL \"optimized\" ) \n                                                       set( _DTL_target ${libs_optimized} )        \n        else()                                         \n                                                       set( _DTL_target ${libs_debug}     )        \n        endif() \n\n        add_to_list( ${_DTL_target} ${_DTL_IN_CACHE} ${_DTL_lib} )\n\n      endif()\n\n    endforeach()\n\n  endmacro()\n\n  # Given lists of optimized and debug libraries, creates a tagged list which will\n  # contain the libraries listed in the 'general' section if any of the two lists is empty,\n  #\n  # All arguments are variable names (not values), thus the input list can be undefined or empty.\n  # The return variable ('libs') will be APPENDED the result (retaining any previous contents)\n  #\n  # If there is a last parameter whose value is \"PERSISTENT\" then the result is an internal cached variable,\n  # otherwise it is an in-memory variable\n  #\n  # Example:\n  #\n  #   set( LIBS_1 libA.so libB.so )\n  #   set( LIBS_2 libC.so )\n  #\n  #   tag_libraries( LIBS_1 LIBS_2 LIBS_R )\n  #\n  # LIBS_R -> optimized;libA.so;libB.so;debug;libC.so\n  #\n  #   tag_libraries( LIBS_1 SOME_UNDEFINED_VARIABLE_OR_EMPTY_LIST LIBS_R )\n  #\n  # LIBS_R -> libA.so;libB.so  (implicitely 'general' since there is no tag)\n  #\n  #   tag_libraries( SOME_UNDEFINED_VARIABLE_OR_EMPTY_LIST LIBS_2 LIBS_R )\n  #\n  # LIBS_R -> libC.so  (implicitely 'general' since there is no tag)\n  #\n  macro( tag_libraries libs_general_or_optimized libs_general_or_debug libs )\n\n    list( LENGTH ${libs_general_or_optimized} _TL_libs_general_or_optimized_len )\n    list( LENGTH ${libs_general_or_debug}     _TL_libs_general_or_debug_len     )\n\n    if ( _TL_libs_general_or_optimized_len EQUAL 0 ) \n                                                     compose_tagged_libraries( \"${${libs_general_or_debug}}\"     \"\"                                 \"\"                           ${libs} ${ARGN} )\n    elseif ( _TL_libs_general_or_debug_len EQUAL 0 )   \n                                                     compose_tagged_libraries( \"${${libs_general_or_optimized}}\" \"\"                                 \"\"                           ${libs} ${ARGN} )\n    else()                                                   \n                                                     compose_tagged_libraries( \"\"                                \"${${libs_general_or_optimized}}\" \"${${libs_general_or_debug}}\" ${libs} ${ARGN} )\n    endif()\n\n  endmacro()\n\n  # add_to_tagged_libraries( libsR ${libsA} <PERSISTENT> )\n  # \n  # Appends the list of tagged libraries contained in the variable 'libA' to the list\n  # of tagged libraries contained in the variable 'libR', properly redistributing each tagged subsequence.\n  #\n  # The first argument is the name of the variable recieving the list. It will be APPENDED\n  # (retaining any previous contents). \n  # The second parameter is a single string value containing the tagged\n  # lists of libraries to append (as a semi-colon separated list). It can be empty, in which case noting is added.\n  #\n  # If there is a third parameter whose value is PERSISTENT, then 'libR' is an internal cached variable, otherwise\n  # it is an in-memory variable. \n  #\n  # It is not possible to append more than one list in the same call.\n  #\n  # Example:\n  #\n  #   set( LIBS_1 libG0.so libG1.so optimized libO0.so)\n  #   set( LIBS_2 libG2.so debug libD0.so)\n  #   set( LIBS_3 debug libD1.so optimized libO1.so libO2.so )\n  #\n  #   concat_tagged_libraries( LIBS_R ${LIBS_1} PERSISTENT )\n  #   concat_tagged_libraries( LIBS_R ${LIBS_2} PERSISTENT )\n  #   concat_tagged_libraries( LIBS_R ${LIBS_3} PERSISTENT )\n  #\n  # LIBS_R -> libG0.so;libG1.so;libG2.so;optimized;libO0.so;libO1.so;libO2.so;debug;libD0.so;libD1.so, in the cache\n  #\n  macro( add_to_tagged_libraries libsR in_cache libsA  )\n\n    if ( \"${in_cache}\" STREQUAL \"PERSISTENT\" )\n      set( _CTL_IN_CACHE \"PERSISTENT\" ) \n    else()\n      set( _CTL_IN_CACHE )\n    endif()\n\n    set( _CTL_general_0   )\n    set( _CTL_optimized_0 )\n    set( _CTL_debug_0     )\n    set( _CTL_general_1   )\n    set( _CTL_optimized_1 )\n    set( _CTL_debug_0     )\n\n    decompose_tagged_libraries( \"${${libsR}}\" _CTL_general_0 _CTL_optimized_0 _CTL_debug_0 )\n    decompose_tagged_libraries( \"${libsA}\"    _CTL_general_1 _CTL_optimized_1 _CTL_debug_1 )\n\n    add_to_list( _CTL_general_0   ${_CTL_general_1}   )\n    add_to_list( _CTL_optimized_0 ${_CTL_optimized_1} )\n    add_to_list( _CTL_debug_0     ${_CTL_debug_1}     )\n\n    if ( \"${_CTL_IN_CACHE}\" STREQUAL \"PERSISTENT\" )\n      cache_set( ${libsR} )\n    else()\n      set( ${libsR} )\n    endif() \n\n    compose_tagged_libraries( \"${_CTL_general_0}\" \"${_CTL_optimized_0}\" \"${_CTL_debug_0}\" ${libsR} ${_CTL_IN_CACHE} )\n\n  endmacro()\n\n\n  macro( add_to_persistent_tagged_libraries libsR )\n    add_to_tagged_libraries( ${libsR} PERSISTENT \"${ARGN}\" )\n  endmacro()\n\n  macro( add_to_in_memory_tagged_libraries libsR )\n    add_to_tagged_libraries( ${libsR} NOT_PERSISTENT \"${ARGN}\" )\n  endmacro()\n\n\nendif()"
  },
  {
    "path": "libs/CoMISo/cmake/CheckCSourceRuns.cmake",
    "content": "# - Check if the given C source code compiles and runs.\n# CHECK_C_SOURCE_RUNS(<code> <var>)\n#  <code>   - source code to try to compile\n#  <var>    - variable to store the result\n#             (1 for success, empty for failure)\n# The following variables may be set before calling this macro to\n# modify the way the check is run:\n#\n#  CMAKE_REQUIRED_FLAGS = string of compile command line flags\n#  CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar)\n#  CMAKE_REQUIRED_INCLUDES = list of include directories\n#  CMAKE_REQUIRED_LIBRARIES = list of libraries to link\n\n#=============================================================================\n# Copyright 2006-2009 Kitware, Inc.\n#\n# Distributed under the OSI-approved BSD License (the \"License\");\n# see accompanying file Copyright.txt for details.\n#\n# This software is distributed WITHOUT ANY WARRANTY; without even the\n# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See the License for more information.\n#=============================================================================\n# (To distribute this file outside of CMake, substitute the full\n#  License text for the above reference.)\n\nMACRO(CHECK_C_SOURCE_RUNS SOURCE VAR)\n  IF(\"${VAR}\" MATCHES \"^${VAR}$\")\n    SET(MACRO_CHECK_FUNCTION_DEFINITIONS \n      \"-D${VAR} ${CMAKE_REQUIRED_FLAGS}\")\n    IF(CMAKE_REQUIRED_LIBRARIES)\n      SET(CHECK_C_SOURCE_COMPILES_ADD_LIBRARIES\n        \"-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}\")\n    ELSE(CMAKE_REQUIRED_LIBRARIES)\n      SET(CHECK_C_SOURCE_COMPILES_ADD_LIBRARIES)\n    ENDIF(CMAKE_REQUIRED_LIBRARIES)\n    IF(CMAKE_REQUIRED_INCLUDES)\n      SET(CHECK_C_SOURCE_COMPILES_ADD_INCLUDES\n        \"-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}\")\n    ELSE(CMAKE_REQUIRED_INCLUDES)\n      SET(CHECK_C_SOURCE_COMPILES_ADD_INCLUDES)\n    ENDIF(CMAKE_REQUIRED_INCLUDES)\n    FILE(WRITE \"${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.c\"\n      \"${SOURCE}\\n\")\n\n    MESSAGE(STATUS \"Performing Test ${VAR}\")\n    TRY_RUN(${VAR}_EXITCODE ${VAR}_COMPILED\n      ${CMAKE_BINARY_DIR}\n      ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.c\n      COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}\n      CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_FUNCTION_DEFINITIONS}\n      -DCMAKE_SKIP_RPATH:BOOL=${CMAKE_SKIP_RPATH}\n      \"${CHECK_C_SOURCE_COMPILES_ADD_LIBRARIES}\"\n      \"${CHECK_C_SOURCE_COMPILES_ADD_INCLUDES}\"\n      COMPILE_OUTPUT_VARIABLE OUTPUT)\n    # if it did not compile make the return value fail code of 1\n    IF(NOT ${VAR}_COMPILED)\n      SET(${VAR}_EXITCODE 1)\n    ENDIF(NOT ${VAR}_COMPILED)\n    # if the return value was 0 then it worked\n    IF(\"${${VAR}_EXITCODE}\" EQUAL 0)\n      SET(${VAR} 1 CACHE INTERNAL \"Test ${VAR}\")\n      MESSAGE(STATUS \"Performing Test ${VAR} - Success\")\n      FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log \n        \"Performing C SOURCE FILE Test ${VAR} succeded with the following output:\\n\"\n        \"${OUTPUT}\\n\"\n        \"Return value: ${${VAR}}\\n\"\n        \"Source file was:\\n${SOURCE}\\n\")\n    ELSE(\"${${VAR}_EXITCODE}\" EQUAL 0)\n      IF(CMAKE_CROSSCOMPILING AND \"${${VAR}_EXITCODE}\" MATCHES  \"FAILED_TO_RUN\")\n        SET(${VAR} \"${${VAR}_EXITCODE}\")\n      ELSE(CMAKE_CROSSCOMPILING AND \"${${VAR}_EXITCODE}\" MATCHES  \"FAILED_TO_RUN\")\n        SET(${VAR} \"\" CACHE INTERNAL \"Test ${VAR}\")\n      ENDIF(CMAKE_CROSSCOMPILING AND \"${${VAR}_EXITCODE}\" MATCHES  \"FAILED_TO_RUN\")\n\n      MESSAGE(STATUS \"Performing Test ${VAR} - Failed\")\n      FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log \n        \"Performing C SOURCE FILE Test ${VAR} failed with the following output:\\n\"\n        \"${OUTPUT}\\n\"\n        \"Return value: ${${VAR}_EXITCODE}\\n\"\n        \"Source file was:\\n${SOURCE}\\n\")\n\n    ENDIF(\"${${VAR}_EXITCODE}\" EQUAL 0)\n  ENDIF(\"${VAR}\" MATCHES \"^${VAR}$\")\nENDMACRO(CHECK_C_SOURCE_RUNS)\n\n"
  },
  {
    "path": "libs/CoMISo/cmake/CoMISoExample.cmake",
    "content": "if (MUMPS_FOUND )\n  list( APPEND COMISO_INCLUDE_DIRECTORIES ${MUMPS_INCLUDE_DIR} )\n  list( APPEND COMISO_LINK_LIBRARIES ${MUMPS_LIBRARY} )\nendif ()\n\nfind_package (IPOPT)\nif (IPOPT_FOUND AND MUMPS_FOUND)\n  list( APPEND COMISO_INCLUDE_DIRECTORIES ${IPOPT_INCLUDE_DIR} )\n  list( APPEND COMISO_LINK_DIRECTORIES ${IPOPT_LIBRARY_DIR} )\n  list( APPEND COMISO_LINK_LIBRARIES ${IPOPT_LIBRARY} )\nendif ()\n\nfind_package(LAPACK)\nfind_package(Taucs)\nif(LAPACK_FOUND AND TAUCS_FOUND)\n  list( APPEND COMISO_INCLUDE_DIRECTORIES ${TAUCS_INCLUDE_DIR} )\n  list( APPEND COMISO_INCLUDE_DIRECTORIES ${LAPACK_INCLUDE_DIR} )\n  list( APPEND COMISO_LINK_DIRECTORIES    ${LAPACK_LIBRARY_DIR} )\n  list( APPEND COMISO_LINK_LIBRARIES  ${TAUCS_LIBRARY} )\n  list( APPEND COMISO_LINK_LIBRARIES  ${LAPACK_LIBRARIES} )\nendif()\n\nfind_package(GUROBI)\nif( GUROBI_FOUND)\n  list( APPEND COMISO_INCLUDE_DIRECTORIES ${GUROBI_INCLUDE_DIR} )\n  list( APPEND COMISO_LINK_DIRECTORIES    ${GUROBI_LIBRARY_DIR} )\n  list( APPEND COMISO_LINK_LIBRARIES  ${GUROBI_LIBRARY} )\nendif()\n\nfind_package(ARPACK)\nif( ARPACK_FOUND)\n  list( APPEND COMISO_INCLUDE_DIRECTORIES ${ARPACK_INCLUDE_DIR} )\n  list( APPEND COMISO_LINK_LIBRARIES  ${ARPACK_LIBRARIES} )\nendif()\n\nFIND_PACKAGE( Boost 1.42.0 COMPONENTS system filesystem regex)\nif( Boost_FOUND)\n  list( APPEND COMISO_INCLUDE_DIRECTORIES ${Boost_INCLUDE_DIR} )\n  list( APPEND COMISO_LINK_DIRECTORIES  ${Boost_LIBRARY_DIRS} )\n  list( APPEND COMISO_LINK_LIBRARIES  ${Boost_LIBRARIES} )\nendif()\n\nFIND_PACKAGE( MPI)\nif( MPI_FOUND)\n  list( APPEND COMISO_LINK_LIBRARIES  ${MPI_CXX_LIBRARIES} )\nendif()\n\nFIND_PACKAGE( PETSC)\nif( PETSC_FOUND)\n  list( APPEND COMISO_LINK_LIBRARIES  ${PETSC_LIBRARY} )\n  list( APPEND COMISO_LINK_LIBRARIES  ${TAO_LIBRARY} )\n  list( APPEND COMISO_LINK_DIRECTORIES ${PETSC_LIBRARY_DIR} )\nendif()\n\nFIND_PACKAGE( TAO)\nif( TAO_FOUND)\n  list( APPEND COMISO_LINK_DIRECTORIES ${TAO_LIBRARY_DIR})\nendif()\n\nFIND_PACKAGE( SUITESPARSE)\nif(SUITESPARSE_FOUND)\n  list( APPEND COMISO_INCLUDE_DIRECTORIES ${SUITESPARSE_INCLUDE_DIRS})\n  list( APPEND COMISO_LINK_LIBRARIES  ${SUITESPARSE_LIBRARIES} )\n  list( APPEND COMISO_LINK_DIRECTORIES ${SUITESPARSE_LIBRARY_DIRS} )\nendif()\n\nFIND_PACKAGE( Eigen3)\nif(Eigen3_FOUND)\n  list( APPEND COMISO_INCLUDE_DIRECTORIES ${Eigen3_INCLUDE_DIR})\nendif()\n\n#MESSAGE( ${COMISO_LINK_LIBRARIES})\n\ninclude_directories (\n  ..\n  ${CMAKE_SOURCE_DIR}\n  ${CMAKE_CURRENT_SOURCE_DIR}\n  ${CMAKE_CURRENT_BINARY_DIR}\n  ${COMISO_INCLUDE_DIR}\n  ${COMISO_INCLUDE_DIRECTORIES}\n)\n\nlink_directories (\n  ${COMISO_LINK_DIRECTORIES}\n)\n"
  },
  {
    "path": "libs/CoMISo/cmake/FindARPACK.cmake",
    "content": "# - Try to find ARPACK\n# Once done this will define\n#\n#  ARPACK_FOUND        - system has ARPACK\n#  ARPACK_INCLUDE_DIR  - the ARPACK include directories\n#  ARPACK_LIBRARY      - Link this to use ARPACK\n#  ARPACKpp_LIBRARY    - Link this to use ARPACK++\n#  ARPACK_LIBRARIES    - Link this to use ARPACK together with ARPACK++\n\n\nfind_path (ARPACK_INCLUDE_DIR NAMES arpack++/argeig.h\n  HINTS ENV ARPACK_INCLUDE_DIR\n  PATHS /usr/include/arpack++ $ENV{HOME}/opt/arpack++/include \"C:\\\\libs\\\\arpack++\\\\include\"\n  DOC \"ARPACK Include Directory\")\n\nIF ( WIN32 )\nfind_library( ARPACK_LIBRARY arpack.lib\n              PATHS \"C:\\\\libs\\\\arpack++\\\\lib\"\n            )\nELSE( WIN32 )\n  find_library( ARPACK_LIBRARY arpack\n                PATHS /usr/lib /usr/lib64\n              )\n  find_library( ARPACKpp_LIBRARY arpack++\n                PATHS /usr/lib /usr/lib64 ${ARPACK_INCLUDE_DIR}/../src/.libs\n              )\n\n  list( APPEND ARPACK_LIBRARIES  ${ARPACK_LIBRARY} )\n  IF(ARPACKpp_LIBRARY)\n    list( APPEND ARPACK_LIBRARIES  ${ARPACKpp_LIBRARY} )\n  ENDIF(ARPACKpp_LIBRARY)\n  \nENDIF( WIN32 )\n\nIF (ARPACK_INCLUDE_DIR AND ARPACK_LIBRARY)\n  SET(ARPACK_FOUND TRUE)\nELSE ()\n  SET(ARPACK_FOUND FALSE)\nENDIF ()\n\n\n\n\n"
  },
  {
    "path": "libs/CoMISo/cmake/FindBLAS.cmake",
    "content": "# Find BLAS library\n#\n# This module finds an installed library that implements the BLAS\n# linear-algebra interface (see http://www.netlib.org/blas/).\n# The list of libraries searched for is mainly taken\n# from the autoconf macro file, acx_blas.m4 (distributed at\n# http://ac-archive.sourceforge.net/ac-archive/acx_blas.html).\n#\n# This module sets the following variables:\n#  BLAS_FOUND - set to true if a library implementing the BLAS interface\n#    is found\n#  BLAS_INCLUDE_DIR - Directories containing the BLAS header files\n#  BLAS_DEFINITIONS - Compilation options to use BLAS\n#  BLAS_LINKER_FLAGS - Linker flags to use BLAS (excluding -l\n#    and -L).\n#  BLAS_LIBRARY_DIR - Directories containing the BLAS libraries.\n#     May be null if BLAS_LIBRARIES contains libraries name using full path.\n#  BLAS_LIBRARIES - List of libraries to link against BLAS interface.\n#     May be null if the compiler supports auto-link (e.g. VC++).\n#  BLAS_USE_FILE - The name of the cmake module to include to compile\n#     applications or libraries using BLAS.\n#\n# This module was modified by CGAL team:\n# - find BLAS library shipped with TAUCS\n# - find libraries for a C++ compiler, instead of Fortran\n# - added BLAS_INCLUDE_DIR, BLAS_DEFINITIONS and BLAS_LIBRARY_DIR\n# - removed BLAS95_LIBRARIES\n#\n# TODO (CGAL):\n# - find CBLAS (http://www.netlib.org/cblas) on Unix?\n\n\ninclude(CheckFunctionExists)\n\ninclude(CGAL_GeneratorSpecificSettings)\n\n\n# This macro checks for the existence of the combination of fortran libraries\n# given by _list.  If the combination is found, this macro checks (using the\n# check_function_exists macro) whether can link against that library\n# combination using the name of a routine given by _name using the linker\n# flags given by _flags.  If the combination of libraries is found and passes\n# the link test, LIBRARIES is set to the list of complete library paths that\n# have been found and DEFINITIONS to the required definitions.\n# Otherwise, LIBRARIES is set to FALSE.\n# N.B. _prefix is the prefix applied to the names of all cached variables that\n# are generated internally and marked advanced by this macro.\nmacro(check_fortran_libraries DEFINITIONS LIBRARIES _prefix _name _flags _list _path)\n  #message(\"DEBUG: check_fortran_libraries(${_list} in ${_path})\")\n\n  # Check for the existence of the libraries given by _list\n  set(_libraries_found TRUE)\n  set(_libraries_work FALSE)\n  set(${DEFINITIONS} \"\")\n  set(${LIBRARIES} \"\")\n  set(_combined_name)\n  foreach(_library ${_list})\n    set(_combined_name ${_combined_name}_${_library})\n\n    if(_libraries_found)\n      # search first in ${_path}\n      find_library(${_prefix}_${_library}_LIBRARY\n                  NAMES ${_library}\n                  PATHS ${_path} NO_DEFAULT_PATH\n                  )\n      # if not found, search in environment variables and system\n      if ( WIN32 )\n        find_library(${_prefix}_${_library}_LIBRARY\n                    NAMES ${_library}\n                    PATHS ENV LIB\n                    )\n      elseif ( APPLE )\n        find_library(${_prefix}_${_library}_LIBRARY\n                    NAMES ${_library}\n                    PATHS /usr/local/lib /usr/lib /usr/local/lib64 /usr/lib64 ENV DYLD_LIBRARY_PATH\n                    )\n      else ()\n        find_library(${_prefix}_${_library}_LIBRARY\n                    NAMES ${_library}\n                    PATHS /usr/local/lib /usr/lib /usr/local/lib64 /usr/lib64 ENV LD_LIBRARY_PATH\n                    )\n      endif()\n      mark_as_advanced(${_prefix}_${_library}_LIBRARY)\n      set(${LIBRARIES} ${${LIBRARIES}} ${${_prefix}_${_library}_LIBRARY})\n      set(_libraries_found ${${_prefix}_${_library}_LIBRARY})\n    endif(_libraries_found)\n  endforeach(_library ${_list})\n  if(_libraries_found)\n    set(_libraries_found ${${LIBRARIES}})\n  endif()\n\n  # Test this combination of libraries with the Fortran/f2c interface.\n  # We test the Fortran interface first as it is well standardized.\n  if(_libraries_found AND NOT _libraries_work)\n    set(${DEFINITIONS}  \"-D${_prefix}_USE_F2C\")\n    set(${LIBRARIES}    ${_libraries_found})\n    # Some C++ linkers require the f2c library to link with Fortran libraries.\n    # I do not know which ones, thus I just add the f2c library if it is available.\n    find_package( F2C QUIET )\n    if ( F2C_FOUND )\n      set(${DEFINITIONS}  ${${DEFINITIONS}} ${F2C_DEFINITIONS})\n      set(${LIBRARIES}    ${${LIBRARIES}} ${F2C_LIBRARIES})\n    endif()\n    set(CMAKE_REQUIRED_DEFINITIONS  ${${DEFINITIONS}})\n    set(CMAKE_REQUIRED_LIBRARIES    ${_flags} ${${LIBRARIES}})\n    #message(\"DEBUG: CMAKE_REQUIRED_DEFINITIONS = ${CMAKE_REQUIRED_DEFINITIONS}\")\n    #message(\"DEBUG: CMAKE_REQUIRED_LIBRARIES = ${CMAKE_REQUIRED_LIBRARIES}\")\n    # Check if function exists with f2c calling convention (ie a trailing underscore)\n    check_function_exists(${_name}_ ${_prefix}_${_name}_${_combined_name}_f2c_WORKS)\n    set(CMAKE_REQUIRED_DEFINITIONS} \"\")\n    set(CMAKE_REQUIRED_LIBRARIES    \"\")\n    mark_as_advanced(${_prefix}_${_name}_${_combined_name}_f2c_WORKS)\n    set(_libraries_work ${${_prefix}_${_name}_${_combined_name}_f2c_WORKS})\n  endif(_libraries_found AND NOT _libraries_work)\n\n  # If not found, test this combination of libraries with a C interface.\n  # A few implementations (ie ACML) provide a C interface. Unfortunately, there is no standard.\n  if(_libraries_found AND NOT _libraries_work)\n    set(${DEFINITIONS} \"\")\n    set(${LIBRARIES}   ${_libraries_found})\n    set(CMAKE_REQUIRED_DEFINITIONS \"\")\n    set(CMAKE_REQUIRED_LIBRARIES   ${_flags} ${${LIBRARIES}})\n    #message(\"DEBUG: CMAKE_REQUIRED_LIBRARIES = ${CMAKE_REQUIRED_LIBRARIES}\")\n    check_function_exists(${_name} ${_prefix}_${_name}${_combined_name}_WORKS)\n    set(CMAKE_REQUIRED_LIBRARIES \"\")\n    mark_as_advanced(${_prefix}_${_name}${_combined_name}_WORKS)\n    set(_libraries_work ${${_prefix}_${_name}${_combined_name}_WORKS})\n  endif(_libraries_found AND NOT _libraries_work)\n\n  # on failure\n  if(NOT _libraries_work)\n    set(${DEFINITIONS} \"\")\n    set(${LIBRARIES}   FALSE)\n  endif()\n  #message(\"DEBUG: ${DEFINITIONS} = ${${DEFINITIONS}}\")\n  #message(\"DEBUG: ${LIBRARIES} = ${${LIBRARIES}}\")\nendmacro(check_fortran_libraries)\n\n\n#\n# main\n#\n\n# Is it already configured?\nif (BLAS_LIBRARY_DIR OR BLAS_LIBRARIES)\n\n  set(BLAS_FOUND TRUE)\n\nelse()\n\n  # reset variables\n  set( BLAS_INCLUDE_DIR \"\" )\n  set( BLAS_DEFINITIONS \"\" )\n  set( BLAS_LINKER_FLAGS \"\" )\n  set( BLAS_LIBRARIES \"\" )\n  set( BLAS_LIBRARY_DIR \"\" )\n\n  # Look first for the TAUCS library distributed with CGAL in auxiliary/taucs.\n  # Set CGAL_TAUCS_FOUND, CGAL_TAUCS_INCLUDE_DIR and CGAL_TAUCS_LIBRARIES_DIR.\n  include(CGAL_Locate_CGAL_TAUCS)\n\n  # Search for BLAS in CGAL_TAUCS_INCLUDE_DIR/CGAL_TAUCS_LIBRARIES_DIR (TAUCS shipped with CGAL),\n  # else in $BLAS_INC_DIR/$BLAS_LIB_DIR environment variables.\n  if(CGAL_TAUCS_FOUND AND CGAL_AUTO_LINK_ENABLED)\n\n    # if VC++: done\n    set( BLAS_INCLUDE_DIR    \"${CGAL_TAUCS_INCLUDE_DIR}\" )\n    set( BLAS_LIBRARY_DIR  \"${CGAL_TAUCS_LIBRARIES_DIR}\" )\n\n  else(CGAL_TAUCS_FOUND AND CGAL_AUTO_LINK_ENABLED)\n\n    #\n    # If Unix, search for BLAS function in possible libraries\n    #\n\n    # BLAS in ATLAS library? (http://math-atlas.sourceforge.net/)\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"cblas;f77blas;atlas\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR\"\n      )\n    endif()\n\n    # BLAS in PhiPACK libraries? (requires generic BLAS lib, too)\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"sgemm;dgemm;blas\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR\"\n      )\n    endif()\n\n    # BLAS in Alpha CXML library?\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"cxml\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR\"\n      )\n    endif()\n\n    # BLAS in Alpha DXML library? (now called CXML, see above)\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"dxml\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR\"\n      )\n    endif()\n\n    # BLAS in Sun Performance library?\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"-xlic_lib=sunperf\"\n      \"sunperf;sunmath\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR\"\n      )\n      if(BLAS_LIBRARIES)\n        # Extra linker flag\n        set(BLAS_LINKER_FLAGS \"-xlic_lib=sunperf\")\n      endif()\n    endif()\n\n    # BLAS in SCSL library?  (SGI/Cray Scientific Library)\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"scsl\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR\"\n      )\n    endif()\n\n    # BLAS in SGIMATH library?\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"complib.sgimath\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR\"\n      )\n    endif()\n\n    # BLAS in IBM ESSL library? (requires generic BLAS lib, too)\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"essl;blas\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR\"\n      )\n    endif()\n\n    #BLAS in intel mkl 10 library? (em64t 64bit)\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"mkl_intel_lp64;mkl_intel_thread;mkl_core;guide;pthread\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR\"\n      )\n    endif()\n\n    ### windows version of intel mkl 10?\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      SGEMM\n      \"\"\n      \"mkl_c_dll;mkl_intel_thread_dll;mkl_core_dll;libguide40\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR\"\n      )\n    endif()\n\n    #older versions of intel mkl libs\n\n    # BLAS in intel mkl library? (shared)\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"mkl;guide;pthread\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR\"\n      )\n    endif()\n\n    #BLAS in intel mkl library? (static, 32bit)\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"mkl_ia32;guide;pthread\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR\"\n      )\n    endif()\n\n    #BLAS in intel mkl library? (static, em64t 64bit)\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"mkl_em64t;guide;pthread\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR\"\n      )\n    endif()\n\n    #BLAS in acml library?\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"acml\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR\"\n      )\n    endif()\n\n    # Apple BLAS library?\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"Accelerate\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR\"\n      )\n    endif()\n\n    if ( NOT BLAS_LIBRARIES )\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"vecLib\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR\"\n      )\n    endif ( NOT BLAS_LIBRARIES )\n\n    # Generic BLAS library?\n    # This configuration *must* be the last try as this library is notably slow.\n    if ( NOT BLAS_LIBRARIES )\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"blas\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR\"\n      )\n    endif()\n\n  endif(CGAL_TAUCS_FOUND AND CGAL_AUTO_LINK_ENABLED)\n\n  if(BLAS_LIBRARY_DIR OR BLAS_LIBRARIES)\n    set(BLAS_FOUND TRUE)\n  else()\n    set(BLAS_FOUND FALSE)\n  endif()\n\n  if(NOT BLAS_FIND_QUIETLY)\n    if(BLAS_FOUND)\n      message(STATUS \"A library with BLAS API found.\")\n    else(BLAS_FOUND)\n      if(BLAS_FIND_REQUIRED)\n        message(FATAL_ERROR \"A required library with BLAS API not found. Please specify library location.\")\n      else()\n        message(STATUS \"A library with BLAS API not found. Please specify library location.\")\n      endif()\n    endif(BLAS_FOUND)\n  endif(NOT BLAS_FIND_QUIETLY)\n\n  # Add variables to cache\n  set( BLAS_INCLUDE_DIR   \"${BLAS_INCLUDE_DIR}\" \n                          CACHE PATH \"Directories containing the BLAS header files\" FORCE )\n  set( BLAS_DEFINITIONS   \"${BLAS_DEFINITIONS}\" \n                          CACHE STRING \"Compilation options to use BLAS\" FORCE )\n  set( BLAS_LINKER_FLAGS  \"${BLAS_LINKER_FLAGS}\" \n                          CACHE STRING \"Linker flags to use BLAS\" FORCE )\n  set( BLAS_LIBRARIES     \"${BLAS_LIBRARIES}\" \n                          CACHE FILEPATH \"BLAS libraries name\" FORCE )\n  set( BLAS_LIBRARY_DIR \"${BLAS_LIBRARY_DIR}\"\n                          CACHE PATH \"Directories containing the BLAS libraries\" FORCE )\n\n  #message(\"DEBUG: BLAS_INCLUDE_DIR = ${BLAS_INCLUDE_DIR}\")\n  #message(\"DEBUG: BLAS_DEFINITIONS = ${BLAS_DEFINITIONS}\")\n  #message(\"DEBUG: BLAS_LINKER_FLAGS = ${BLAS_LINKER_FLAGS}\")\n  #message(\"DEBUG: BLAS_LIBRARIES = ${BLAS_LIBRARIES}\")\n  #message(\"DEBUG: BLAS_LIBRARY_DIR = ${BLAS_LIBRARY_DIR}\")\n  #message(\"DEBUG: BLAS_FOUND = ${BLAS_FOUND}\")\n\nendif(BLAS_LIBRARY_DIR OR BLAS_LIBRARIES)\n\nif(BLAS_FOUND)\n  set(BLAS_USE_FILE \"CGAL_UseBLAS\")\nendif(BLAS_FOUND)\n"
  },
  {
    "path": "libs/CoMISo/cmake/FindCGAL.cmake",
    "content": "# - Find CGAL\n# Find the CGAL autolinking headers.\n#\n#  CGAL_INCLUDE_DIR -  where to find CGAL.h, etc.\n#  CGAL_FOUND        - True if CGAL found.\n\nIF (CGAL_INCLUDE_DIR)\n  # Already in cache, be silent\n  SET(CGAL_FIND_QUIETLY TRUE)\nENDIF (CGAL_INCLUDE_DIR)\n\nGET_FILENAME_COMPONENT(module_file_path ${CMAKE_CURRENT_LIST_FILE} PATH )\n\nIF (NOT APPLE )\n\t# Look for the header file.\n\tFIND_PATH(CGAL_INCLUDE_DIR NAMES CGAL/auto_link/auto_link.h\n        \t                   PATHS ../../External/include\n                                 \"C:/libs/CGAL-3.6/include\"\n\t\t\t\t\t\t\t\t \"C:/Program Files/CGAL-3.5/include\"\n                                 \"C:/Programme/CGAL-3.5/include\"\n                                 \"C:/libs/CGAL-3.5/include\"\n                \t             \"C:/Program Files/CGAL-3.4/include\"\n                                 \"C:/Programme/CGAL-3.4/include\"\n                                 \"C:/libs/CGAL-3.4/include\"\n\t\t\t\t\t\t\t\t \"C:/Programme/CGAL-3.9/include\"\n\t\t\t\t\t\t\t\t \"C:/Program Files/CGAL-3.9/include\"\n\t\t\t\t\t\t\t\t \"C:/Program Files (x86)/CGAL-3.9/include\"\n\t                             ${module_file_path}/../../../External/include)\nELSE( NOT APPLE)\n\t# Look for the header file.\n\tFIND_PATH(CGAL_INCLUDE_DIR NAMES CGAL/auto_link/auto_link.h\n        \t                   PATHS \"/opt/local/include\"\n                 )\n\nENDIF( NOT APPLE )\n\n\n\nMARK_AS_ADVANCED(CGAL_INCLUDE_DIR)\n\n\n# Copy the results to the output variables.\nIF(CGAL_INCLUDE_DIR )\n  SET(CGAL_FOUND 1)\n  SET(CGAL_INCLUDE_DIR ${CGAL_INCLUDE_DIR})\n  # Look for the taucs dir.\n  FIND_PATH(CGAL_TAUCS_DIR NAMES include/taucs.h\n                           PATHS ${CGAL_INCLUDE_DIR}/../auxiliary/taucs)\n\n  IF(WIN32)\n    include(CGAL_GeneratorSpecificSettings)\n    find_path(CGAL_LIBRARY_DIR \n                NAMES \"CGAL-${CGAL_TOOLSET}-mt.lib\" \"CGAL-${CGAL_TOOLSET}-mt-gd.lib\"\n                PATHS \"${CGAL_INCLUDE_DIR}/../lib\"\n                DOC \"Directory containing the CGAL library\"\n               ) \n    #add_definitions (-DCGAL_AUTOLINK)\n  ELSEIF( APPLE)\n    find_path(CGAL_LIBRARY_DIR \n                NAMES \"libCGAL.dylib\"\n                PATHS \"/opt/local/lib/\"\n                DOC \"Directory containing the CGAL library\"\n               ) \n    list ( APPEND CGAL_LIBRARIES CGAL CGAL_Core CGAL_ImageIO )\n    set (CMAKE_CXX_FLAGS_RELEASE \"${CMAKE_CXX_FLAGS_RELEASE} -frounding-math\")\n    set (CMAKE_CXX_FLAGS_DEBUG \"${CMAKE_CXX_FLAGS_DEBUG} -frounding-math\")\n\n  ELSE( WIN32 )\n    find_path(CGAL_LIBRARY_DIR\n              NAMES \"libCGAL.so\"\n              PATHS \"/usr/lib/\"\n              DOC \"Directory containing the CGAL library\"\n             )\n    list ( APPEND CGAL_LIBRARIES CGAL CGAL_Core CGAL_ImageIO CGAL_Qt4) \n    set (CMAKE_CXX_FLAGS_RELEASE \"${CMAKE_CXX_FLAGS_RELEASE} -frounding-math\")\n    set (CMAKE_CXX_FLAGS_DEBUG \"${CMAKE_CXX_FLAGS_DEBUG} -frounding-math\")\n\n\n    # This is needed to link correctly against lapack\n    add_definitions (-DCGAL_USE_F2C)\n  ENDIF(WIN32)\n\n\n \n\nELSE(CGAL_INCLUDE_DIR )\n  SET(CGAL_FOUND 0)\n  SET(CGAL_INCLUDE_DIR)\nENDIF(CGAL_INCLUDE_DIR )\n\n# Report the results.\nIF(NOT CGAL_FOUND)\n  SET(CGAL_DIR_MESSAGE\n    \"CGAL was not found. Make sure CGAL_INCLUDE_DIR is set to the directories containing the include files for CGAL. .\")\n  IF(CGAL_FIND_REQUIRED)\n      MESSAGE(FATAL_ERROR \"${CGAL_DIR_MESSAGE}\")\n  ELSEIF(NOT CGAL_FIND_QUIETLY)\n    MESSAGE(STATUS \"${CGAL_DIR_MESSAGE}\")\n  ELSE(NOT CGAL_FIND_QUIETLY)\n  ENDIF(CGAL_FIND_REQUIRED)\nELSE (NOT CGAL_FOUND)\n  IF(NOT CGAL_FIND_QUIETLY)\n    MESSAGE(STATUS \"Looking for CGAL - found\")\n  ENDIF(NOT CGAL_FIND_QUIETLY)\nENDIF(NOT CGAL_FOUND)\n\n"
  },
  {
    "path": "libs/CoMISo/cmake/FindCPLEX.cmake",
    "content": "# - Try to find CPLEX\n# Once done this will define\n#  CPLEX_FOUND - System has Cplex\n#  CPLEX_INCLUDE_DIRS - The Cplex include directories\n#  CPLEX_LIBRARIES - The libraries needed to use Cplex\n\nif (CPLEX_INCLUDE_DIR)\n  # in cache already\n  set(CPLEX_FOUND TRUE)\n  set(CPLEX_INCLUDE_DIRS \"${CPLEX_INCLUDE_DIR};${CPLEX_CONCERT_INCLUDE_DIR}\" )\n  set(CPLEX_LIBRARIES \"${CPLEX_LIBRARY};${CPLEX_ILO_LIBRARY};${CPLEX_CONCERT_LIBRARY}\" )\nelse (CPLEX_INCLUDE_DIR)\n\nfind_path(CPLEX_INCLUDE_DIR \n          NAMES ilcplex/cplex.h\n          PATHS \"$ENV{CPLEX_DIR}/cplex/include\"\n          )\n          \nfind_path(CPLEX_CONCERT_INCLUDE_DIR \n          NAMES ilconcert/ilomodel.h\n          PATHS \"$ENV{CPLEX_DIR}/concert/include\"\n          )\n\nfind_library( CPLEX_LIBRARY \n              cplex\n              PATHS \"$ENV{CPLEX_DIR}/cplex/lib/x86-64_sles10_4.1/static_pic\" \n              )\n\nfind_library( CPLEX_ILO_LIBRARY \n              ilocplex\n              PATHS \"$ENV{CPLEX_DIR}/cplex/lib/x86-64_sles10_4.1/static_pic\" \n              )\n\nfind_library( CPLEX_CONCERT_LIBRARY \n              concert\n              PATHS \"$ENV{CPLEX_DIR}/concert/lib/x86-64_sles10_4.1/static_pic\" \n              )     \n                 \n\nset(CPLEX_INCLUDE_DIRS \"${CPLEX_INCLUDE_DIR};${CPLEX_CONCERT_INCLUDE_DIR}\" )\nset(CPLEX_LIBRARIES \"${CPLEX_LIBRARY};${CPLEX_ILO_LIBRARY};${CPLEX_CONCERT_LIBRARY}\" )\n\n# use c++ headers as default\nset(CPLEX_COMPILER_FLAGS \"-DIL_STD\" CACHE STRING \"Cplex Compiler Flags\")\n\ninclude(FindPackageHandleStandardArgs)\n# handle the QUIETLY and REQUIRED arguments and set LIBCPLEX_FOUND to TRUE\n# if all listed variables are TRUE\nfind_package_handle_standard_args(CPLEX  DEFAULT_MSG\n                                  CPLEX_LIBRARY CPLEX_INCLUDE_DIR)\n\nmark_as_advanced(CPLEX_INCLUDE_DIR CPLEX_LIBRARY )\n\nendif(CPLEX_INCLUDE_DIR)"
  },
  {
    "path": "libs/CoMISo/cmake/FindCoMISo.cmake",
    "content": "# - Try to find COMISO\n# Once done this will define\n#  \n#  COMISO_FOUND        - system has COMISO\n#  COMISO_INCLUDE_DIR  - the COMISO include directory\n#  COMISO_LIBRARY_DIR  - where the libraries are\n#  COMISO_LIBRARY      - Link these to use COMISO\n#   \n\nIF (COMISO_INCLUDE_DIR)\n  # Already in cache, be silent\n  SET(COMISO_FIND_QUIETLY TRUE)\nENDIF (COMISO_INCLUDE_DIR)\n\n# Find CoMISo config file\nFIND_PATH( COMISO_INCLUDE_DIR CoMISo/Config/config.hh\n           PATHS \"${CMAKE_SOURCE_DIR}/../\" \"${CMAKE_SOURCE_DIR}/libs/\" )\n\nif ( COMISO_INCLUDE_DIR )\n\n  FILE(READ ${COMISO_INCLUDE_DIR}/CoMISo/Config/config.hh CURRENT_COMISO_CONFIG)\n\n  set(COMISO_OPT_DEPS \"\")\n\n\n  STRING(REGEX MATCH \"\\#define COMISO_MPI_AVAILABLE 1\" COMISO_MPI_BUILD_TIME_AVAILABLE ${CURRENT_COMISO_CONFIG} )\n\n  if ( COMISO_MPI_BUILD_TIME_AVAILABLE )\n\n   find_package(MPI)\n\n   if ( NOT MPI_FOUND )\n     message(ERROR \"COMISO configured with mpi but mpi not available\")\n   endif()\n\n   list (APPEND  COMISO_OPT_DEPS \"MPI\")\n\n  endif()\n\n  STRING(REGEX MATCH \"\\#define COMISO_SUITESPARSE_AVAILABLE 1\" COMISO_SUITESPARSE_BUILD_TIME_AVAILABLE ${CURRENT_COMISO_CONFIG} )\n\n  if ( COMISO_SUITESPARSE_BUILD_TIME_AVAILABLE )\n\n   find_package(SUITESPARSE)\n\n   if ( NOT SUITESPARSE_FOUND )\n     message(ERROR \"COMISO configured with Suitesparse but Suitesparse not available\")\n   endif()\n\n   list (APPEND  COMISO_OPT_DEPS \"SUITESPARSE\")\n\n  endif()\n  \n  STRING(REGEX MATCH \"\\#define COMISO_PETSC_AVAILABLE 1\" COMISO_PETSC_BUILD_TIME_AVAILABLE ${CURRENT_COMISO_CONFIG} )\n\n  if ( COMISO_PETSC_BUILD_TIME_AVAILABLE )\n\n   find_package(PETSC)\n\n   if ( NOT PETSC_FOUND )\n     message(ERROR \"COMISO configured with petsc but petsc not available\")\n   endif()\n\n   list (APPEND  COMISO_OPT_DEPS \"PETSC\")\n\n  endif()\n\n  STRING(REGEX MATCH \"\\#define COMISO_IPOPT_AVAILABLE 1\" COMISO_IPOPT_BUILD_TIME_AVAILABLE ${CURRENT_COMISO_CONFIG} )\n\n  if ( COMISO_IPOPT_BUILD_TIME_AVAILABLE )\n\n   find_package(IPOPT)\n\n   if ( NOT IPOPT_FOUND )\n     message(ERROR \"COMISO configured with ipopt but ipopt not available\")\n   endif()\n\n   list (APPEND  COMISO_OPT_DEPS \"IPOPT\")\n\n  endif()\n\n  STRING(REGEX MATCH \"\\#define COMISO_METIS_AVAILABLE 1\" COMISO_METIS_BUILD_TIME_AVAILABLE ${CURRENT_COMISO_CONFIG} )\n\n  if ( COMISO_METIS_BUILD_TIME_AVAILABLE )\n\n   find_package(METIS)\n\n   if ( NOT METIS_FOUND )\n     message(ERROR \"COMISO configured with Metis but Metis not available\")\n   endif()\n\n   list (APPEND  COMISO_OPT_DEPS \"METIS\")\n\n  endif()\n  \n  STRING(REGEX MATCH \"\\#define COMISO_MUMPS_AVAILABLE 1\" COMISO_MUMPS_BUILD_TIME_AVAILABLE ${CURRENT_COMISO_CONFIG} )\n\n  if ( COMISO_MUMPS_BUILD_TIME_AVAILABLE )\n\n   find_package(MUMPS)\n\n   if ( NOT MUMPS_FOUND )\n     message(ERROR \"COMISO configured with mumps but mumps not available\")\n   endif()\n\n   list (APPEND  COMISO_OPT_DEPS \"MUMPS\")\n\n  endif()\n\n  STRING(REGEX MATCH \"\\#define COMISO_TAO_AVAILABLE 1\" COMISO_TAO_BUILD_TIME_AVAILABLE ${CURRENT_COMISO_CONFIG} )\n\n  if ( COMISO_TAO_BUILD_TIME_AVAILABLE )\n\n   find_package(TAO)\n\n   if ( NOT TAO_FOUND )\n     message(ERROR \"COMISO configured with tao but tao not available\")\n   endif()\n\n   list (APPEND  COMISO_OPT_DEPS \"TAO\")\n  endif()\n  \n  STRING(REGEX MATCH \"\\#define COMISO_TAUCS_AVAILABLE 1\" COMISO_TAUCS_BUILD_TIME_AVAILABLE ${CURRENT_COMISO_CONFIG} )\n\n  if ( COMISO_TAUCS_BUILD_TIME_AVAILABLE )\n\n   find_package(Taucs)\n\n   if ( NOT TAUCS_FOUND )\n     message(ERROR \"COMISO configured with Taucs but Taucs not available\")\n   endif()\n\n   list (APPEND  COMISO_OPT_DEPS \"Taucs\")\n\n  endif()\n\n  STRING(REGEX MATCH \"\\#define COMISO_GUROBI_AVAILABLE 1\" COMISO_GUROBI_BUILD_TIME_AVAILABLE ${CURRENT_COMISO_CONFIG} )\n\n  if ( COMISO_GUROBI_BUILD_TIME_AVAILABLE )\n\n   find_package(GUROBI)\n\n   if ( NOT GUROBI_FOUND )\n     message(ERROR \"COMISO configured with GUROBI but GUROBI not available\")\n   endif()\n\n   list (APPEND  COMISO_OPT_DEPS \"GUROBI\")\n\n  endif()\n\n\n  STRING(REGEX MATCH \"\\#define COMISO_ARPACK_AVAILABLE 1\" COMISO_ARPACK_BUILD_TIME_AVAILABLE ${CURRENT_COMISO_CONFIG} )\n\n  if ( COMISO_ARPACK_BUILD_TIME_AVAILABLE )\n\n   find_package(ARPACK)\n\n   if ( NOT ARPACK_FOUND )\n     message(ERROR \"COMISO configured with ARPACK but ARPACK not available\")\n   endif()\n\n   list (APPEND  COMISO_OPT_DEPS \"ARPACK\")\n\n  endif()\n  \n  STRING(REGEX MATCH \"\\#define COMISO_CPLEX_AVAILABLE 1\" COMISO_CPLEX_BUILD_TIME_AVAILABLE ${CURRENT_COMISO_CONFIG} )\n\n  if ( COMISO_CPLEX_BUILD_TIME_AVAILABLE )\n\n   find_package(CPLEX)\n\n   if ( NOT CPLEX_FOUND )\n     message(ERROR \"COMISO configured with CPLEX but CPLEX not available\")\n   endif()\n\n   list (APPEND  COMISO_OPT_DEPS \"CPLEX\")\n\n  endif()\n\n  add_definitions (-DCOMISODLL -DUSECOMISO )\n\nendif(COMISO_INCLUDE_DIR)\n\nIF (COMISO_INCLUDE_DIR)\n  SET(COMISO_FOUND TRUE)\n  SET( COMISO_LIBRARY_DIR \"${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_LIBDIR}\" )\n  SET( COMISO_LIBRARY \"CoMISo\")\n  SET( COMISO_DEPS \"GMM;BLAS;SUITESPARSE\" )\nELSE (COMISO_INCLUDE_DIR)\n  SET( COMISO_FOUND FALSE )\n  SET( COMISO_LIBRARY_DIR )\nENDIF (COMISO_INCLUDE_DIR)\n\n"
  },
  {
    "path": "libs/CoMISo/cmake/FindEigen3.cmake",
    "content": "# - Find Eigen3\n# Find the native GMM headers and libraries.\n#\n#  Eigen3_INCLUDE_DIR -  where to find <Eigen/Dense>, etc.\n#  Eigen3_FOUND        - True if Eigen3 found.\n\nIF (Eigen3_INCLUDE_DIR)\n  # Already in cache, be silent\n  SET(Eigen3_FIND_QUIETLY TRUE)\nENDIF (Eigen3_INCLUDE_DIR)\n\nGET_FILENAME_COMPONENT(module_file_path ${CMAKE_CURRENT_LIST_FILE} PATH )\n\n# Look for the header file.\nFIND_PATH(Eigen3_INCLUDE_DIR NAMES Eigen/Dense \n                             PATHS /usr/include/eigen3\n                                   /usr/local/include\n                                   /usr/local/include/eigen3/\n                                   /opt/local/include/eigen3/\n                                   \"c:\\\\libs\\\\eigen3\\\\include\"\n\t\t                   \"c:\\\\libs\\\\eigen\\\\include\"\n\t\t\t\t    ${PROJECT_SOURCE_DIR}/MacOS/Libs/eigen3/include\n                                   ../../External/include\n                                   ${module_file_path}/../../../External/include)\n\n\n# Copy the results to the output variables.\nIF(Eigen3_INCLUDE_DIR )\n  SET(Eigen3_FOUND 1)\n  SET(Eigen3_INCLUDE_DIR ${Eigen3_INCLUDE_DIR})\nELSE(Eigen3_INCLUDE_DIR )\n  SET(Eigen3_FOUND 0)\n  SET(Eigen3_INCLUDE_DIR)\nENDIF(Eigen3_INCLUDE_DIR )\n\n# Report the results.\nIF(NOT Eigen3_FOUND)\n  SET(Eigen3_DIR_MESSAGE\n    \"Eigen3 was not found. Make sure Eigen3_INCLUDE_DIR is set to the directories containing the include and lib files for Eigen3. .\")\nELSE (NOT Eigen3_FOUND)\n  IF(NOT Eigen3_FIND_QUIETLY)\n    MESSAGE(STATUS \"Looking for Eigen3 - found\")\n  ENDIF(NOT Eigen3_FIND_QUIETLY)\nENDIF(NOT Eigen3_FOUND)\n\n"
  },
  {
    "path": "libs/CoMISo/cmake/FindGMM.cmake",
    "content": "# - Find GMM\n# Find the native GMM headers and libraries.\n#\n#  GMM_INCLUDE_DIR -  where to find GMM.h, etc.\n#  GMM_LIBRARIES    - List of libraries when using GMM.\n#  GMM_FOUND        - True if GMM found.\n\nIF (GMM_INCLUDE_DIR)\n  # Already in cache, be silent\n  SET(GMM_FIND_QUIETLY TRUE)\nENDIF (GMM_INCLUDE_DIR)\n\nGET_FILENAME_COMPONENT(module_file_path ${CMAKE_CURRENT_LIST_FILE} PATH )\n\n# Look for the header file.\nFIND_PATH(GMM_INCLUDE_DIR NAMES gmm/gmm.h \n                           PATHS /usr/include\n                                 /usr/include\n                                 /usr/local/include\n                                 ~/sw/gmm-4.1/include\n\t\t\t\t \"c:\\\\libs\\\\gmm-4.1\\\\include\"\n                                 \"c:\\\\libs\\\\gmm-3.0\\\\include\"\n\t\t\t         ${PROJECT_SOURCE_DIR}/MacOS/Libs/gmm-3.1/include\n                                 ../../External/include\n                                 /ACG/acgdev/gcc-4.3-i686/gmm-4.1/include/\n                                 /ACG/acgdev/gcc-4.3-i686/gmm-3/include/\n                                 ${module_file_path}/../../../External/include)\n\n\n# Copy the results to the output variables.\nIF(GMM_INCLUDE_DIR )\n  SET(GMM_FOUND 1)\n  SET(GMM_INCLUDE_DIR ${GMM_INCLUDE_DIR})\n  IF (WIN32)\n  add_definitions(-D_SCL_SECURE_NO_DEPRECATE)\n  ENDIF(WIN32)\nELSE(GMM_INCLUDE_DIR )\n  SET(GMM_FOUND 0)\n  SET(GMM_INCLUDE_DIR)\nENDIF(GMM_INCLUDE_DIR )\n\n# Report the results.\nIF(NOT GMM_FOUND)\n  SET(GMM_DIR_MESSAGE\n    \"GMM was not found. Make sure GMM_INCLUDE_DIR is set to the directories containing the include and lib files for GMM. .\")\n  IF(GMM_FIND_REQUIRED)\n      MESSAGE(FATAL_ERROR \"${GMM_DIR_MESSAGE}\")\n  ELSEIF(NOT GMM_FIND_QUIETLY)\n    MESSAGE(STATUS \"${GMM_DIR_MESSAGE}\")\n  ELSE(NOT GMM_FIND_QUIETLY)\n  ENDIF(GMM_FIND_REQUIRED)\nELSE (NOT GMM_FOUND)\n  IF(NOT GMM_FIND_QUIETLY)\n    MESSAGE(STATUS \"Looking for GMM - found\")\n  ENDIF(NOT GMM_FIND_QUIETLY)\nENDIF(NOT GMM_FOUND)\n\n"
  },
  {
    "path": "libs/CoMISo/cmake/FindGMP.cmake",
    "content": "# Try to find the GMP libraries\n# GMP_FOUND - system has GMP lib\n# GMP_INCLUDE_DIR - the GMP include directory\n# GMP_LIBRARY_DIR - Directory where the GMP libraries are located\n# GMP_LIBRARIES - the GMP libraries\n# GMP_IN_CGAL_AUXILIARY - TRUE if the GMP found is the one distributed with CGAL in the auxiliary folder\n\n# TODO: support MacOSX\n\ninclude(CGAL_FindPackageHandleStandardArgs)\ninclude(CGAL_GeneratorSpecificSettings)\n\n# Is it already configured?\nif (GMP_INCLUDE_DIR AND GMP_LIBRARY_DIR ) \n   \n  set(GMP_FOUND TRUE)\n  \nelse()  \n  find_package(CGAL)\n  if (NOT CGAL_FOUND)\n    message(STATUS \"CGAL not found .. required to use taucs!\")\n    set(GMP_FOUND FALSE)\n  else ()\n    find_path(GMP_INCLUDE_DIR \n              NAMES gmp.h\n              PATHS \"${CGAL_INCLUDE_DIR}/../auxiliary/gmp/include\"\n                  DOC \"The directory containing the GMP header files\"\n             )\n\n    if ( GMP_INCLUDE_DIR STREQUAL \"${CMAKE_SOURCE_DIR}/auxiliary/gmp/include\" )\n      cache_set( GMP_IN_CGAL_AUXILIARY TRUE )\n    endif()\n    \n    if ( CGAL_AUTO_LINK_ENABLED )\n\t\tmessage(\"AAAA\")\n      find_path(GMP_LIBRARY_DIR \n                NAMES \"gmp-${CGAL_TOOLSET}-mt.lib\" \"gmp-${CGAL_TOOLSET}-mt-gd.lib\" libgmp-10.lib\n                PATHS \"${CGAL_INCLUDE_DIR}/../auxiliary/gmp/lib\"\n                DOC \"Directory containing the GMP library\"\n               )\n      \n\t    list ( APPEND GMP_LIBRARIES libgmp-10.lib;libmpfr-4.lib )\t    \n    else()\n    \n      find_library(GMP_LIBRARIES NAMES gmp \n                   PATHS ENV GMP_LIB_DIR\n                   DOC \"Path to the GMP library\"\n                  )\n                  \n      if ( GMP_LIBRARIES ) \n        get_filename_component(GMP_LIBRARY_DIR ${GMP_LIBRARIES} PATH CACHE )\n      endif()\n      \n    endif()  \n      \n    # Attempt to load a user-defined configuration for GMP if couldn't be found\n    if ( NOT GMP_INCLUDE_DIR OR NOT GMP_LIBRARY_DIR )\n      include( GMPConfig OPTIONAL )\n    endif()\n    \n    find_package_handle_standard_args(GMP \"DEFAULT_MSG\" GMP_INCLUDE_DIR GMP_LIBRARY_DIR)\n\n  endif()\nendif()\n"
  },
  {
    "path": "libs/CoMISo/cmake/FindGUROBI.cmake",
    "content": "if (GUROBI_INCLUDE_DIR)\n  # in cache already\n  set(GUROBI_FOUND TRUE)\nelse (GUROBI_INCLUDE_DIR)\n\nif (WIN32)\n   find_path(GUROBI_INCLUDE_DIR NAMES SRC/gurobi_c++.h\n     PATHS\n     \"C:\\\\libs\\\\gurobi45\"\n     ${GUROBI_INCLUDE_PATH}\n   )\n\n   find_library( GUROBI_LIBRARY_RELEASE \n                 SuperLU\n                 PATHS \"C:\\\\libs\\\\gurobi45\\\\lib\" )\n   find_library( GUROBI_LIBRARY_DEBUG\n                   SuperLUd\n                   PATHS \"C:\\\\libs\\\\gurobi45\\\\lib\" )\n\n\n   set ( GUROBI_LIBRARY \"optimized;${GUROBI_LIBRARY_RELEASE};debug;${GUROBI_LIBRARY_DEBUG}\" CACHE  STRING \"GUROBI Libraries\" )\n\nELSEIF(APPLE)\n\n   find_path(GUROBI_INCLUDE_DIR NAMES gurobi_c++.h\n\t     PATHS \"${CMAKE_SOURCE_DIR}/MacOS/Libs/gurobi40\"\n\t     \t   ${GUROBI_INCLUDE_PATH}\n            )\n\n   find_library( GUROBI_LIBRARY \n                 SuperLU\n                 PATHS \"${CMAKE_SOURCE_DIR}/MacOS/Libs/gurobi40\")\n\nELSE( WIN32 )\n   find_path(GUROBI_INCLUDE_DIR NAMES gurobi_c++.h\n     PATHS \"$ENV{GUROBI_HOME}/include\"\n     ${GUROBI_INCLUDE_PATH}\n   )\n\n#   MESSAGE(STATUS \"$ENV{GUROBI_HOME}/include\")\n   IF(GUROBI_INCLUDE_DIR)\n     SET(GUROBI_FOUND TRUE)\n     SET(GUROBI_INCLUDE_DIR ${GUROBI_INCLUDE_DIR})\n   ELSE(GUROBI_INCLUDE_DIR)\n     SET(GUROBI_FOUND FALSE)\n     SET(GUROBI_INCLUDE_DIR ${GUROBI_INCLUDE_DIR})\n   ENDIF(GUROBI_INCLUDE_DIR)\n\n   #find_library( GUROBI_LIBRARY \n    #             gurobi\n     #            PATHS \"${GUROBI_HOME}/lib\" )\nENDIF()\n\nendif(GUROBI_INCLUDE_DIR)\n\n\nIF(UNIX)\nIF(GUROBI_INCLUDE_DIR AND NOT GUROBI_LIBRARY)\n  IF (NOT DEFINED ENV{GUROBI_HOME})\n    message(FATAL_ERROR \"Environment variable GUROBI_HOME not set. Set it so I can find the gurobi libs in \\${GUROBI_HOME}/lib/.\")\n  ENDIF()\n  SET(GUROBI_LIBRARY_DIR \"$ENV{GUROBI_HOME}/lib/\" CACHE PATH \"Path to GUROBI Library\")\n  IF (EXISTS \"${GUROBI_LIBRARY_DIR}/libgurobi45.so\")\n    SET(GUROBI_LIBRARY \"gurobi45;gurobi_c++;pthread\" CACHE STRING \"GUROBI Libraries\")  \n  ELSEIF(EXISTS \"${GUROBI_LIBRARY_DIR}/libgurobi46.so\")\n    SET(GUROBI_LIBRARY \"gurobi46;gurobi_c++;pthread\" CACHE STRING \"GUROBI Libraries\")  \n  ELSEIF(EXISTS \"${GUROBI_LIBRARY_DIR}/libgurobi50.so\")\n    SET(GUROBI_LIBRARY \"gurobi50;gurobi_c++;pthread\" CACHE STRING \"GUROBI Libraries\")  \n  ELSE()\n    message(FATAL_ERROR \"Couldn't find a gurobi lib in ${GUROBI_LIBRARY_DIR}. Maybe it's a version I don't know about, yet.\")\n  ENDIF()\nENDIF()\nENDIF(UNIX)\n"
  },
  {
    "path": "libs/CoMISo/cmake/FindIPOPT.cmake",
    "content": "# - Try to find IPOPT\n# Once done this will define\n#  IPOPT_FOUND - System has IpOpt\n#  IPOPT_INCLUDE_DIRS - The IpOpt include directories\n#  IPOPT_LIBRARY_DIRS - The library directories needed to use IpOpt\n#  IPOPT_LIBRARIES    - The libraries needed to use IpOpt\n\n\nif (IPOPT_INCLUDE_DIR)\n  # in cache already\n  SET(IPOPT_FIND_QUIETLY TRUE)\nendif (IPOPT_INCLUDE_DIR)\n\nif (WIN32)\n   find_path(IPOPT_INCLUDE_DIR NAMES IpNLP.hpp\n     PATHS\n     \"C:\\\\libs\\\\Ipopt-3.8.2\\\\include\\\\coin\"\n     ${IPOPT_DIR}/include\n   )\n\n   IF(IPOPT_INCLUDE_DIR)\n      find_library( IPOPT_LIBRARY_RELEASE \n                    Ipopt\n                    PATHS \"C:\\\\libs\\\\Ipopt-3.8.2\\\\lib\\\\win32\\\\release\" )\n      find_library( IPOPT_LIBRARY_DEBUG\n                    Ipopt\n                    PATHS \"C:\\\\libs\\\\Ipopt-3.8.2\\\\lib\\\\win32\\\\debug\" )\n\n      set ( IPOPT_LIBRARY \"optimized;${IPOPT_LIBRARY_RELEASE};debug;${IPOPT_LIBRARY_DEBUG}\" CACHE  STRING \"IPOPT Libraries\" )\n\n      SET(IPOPT_FOUND TRUE)\n      SET(IPOPT_INCLUDE_DIR ${IPOPT_INCLUDE_DIR})\n\t  # Todo, set right version depending on build type (debug/release)\n\t  #GET_FILENAME_COMPONENT( IPOPT_LIBRARY_DIR ${GLEW_LIBRARY} PATH )\n    ELSE(IPOPT_INCLUDE_DIR)\n      SET(IPOPT_FOUND FALSE)\n      SET(IPOPT_INCLUDE_DIR ${IPOPT_INCLUDE_DIR})\n    ENDIF(IPOPT_INCLUDE_DIR)\n\nELSEIF(APPLE)\n\n   find_path(IPOPT_INCLUDE_DIR NAMES gurobi_c++.h\n\t     PATHS \"${CMAKE_SOURCE_DIR}/MacOS/Libs/gurobi40\"\n\t     \t   ${IPOPT_INCLUDE_PATH}\n            )\n\n   find_library( IPOPT_LIBRARY \n                 SuperLU\n                 PATHS \"${CMAKE_SOURCE_DIR}/MacOS/Libs/gurobi40\")\n\nELSE( WIN32 )\n   find_path(IPOPT_INCLUDE_DIR NAMES IpNLP.hpp\n     PATHS  \"$ENV{IPOPT_HOME}/include/coin\"\n            \"/usr/include/coin\"\n    \n   )\n\n   find_library( IPOPT_LIBRARY \n                 ipopt\n                 PATHS \"$ENV{IPOPT_HOME}/lib\"\n                       \"/usr/lib\" )   \n    \n    #wrong config under Debian workaround\n    add_definitions( -DHAVE_CSTDDEF )\n\n   \n   # set optional path to HSL Solver\n   find_path(IPOPT_HSL_LIBRARY_DIR NAMES libhsl.so\n     PATHS \"$ENV{IPOPT_HSL_LIBRARY_PATH}\"\n           \"$ENV{HOME}/opt/HSL/lib\"\n   )\n   \n   IF( IPOPT_HSL_LIBRARY_DIR)\n     IF( NOT IPOPT_FIND_QUIETLY )\n        message ( \"IPOPT_HSL_LIBRARY_DIR found at ${IPOPT_HSL_LIBRARY_DIR} \")\n     ENDIF()\n     set(IPOPT_LIBRARY_DIR ${IPOPT_HSL_LIBRARY_DIR})\n     LIST( APPEND IPOPT_LIBRARY_DIRS \"${IPOPT_HSL_LIBRARY_DIR}\")\n   ENDIF(IPOPT_HSL_LIBRARY_DIR)\n   \n   \n   set(IPOPT_INCLUDE_DIRS \"${IPOPT_INCLUDE_DIR}\" )\n   set(IPOPT_LIBRARIES \"${IPOPT_LIBRARY}\" )\n\n   include(FindPackageHandleStandardArgs)\n   # handle the QUIETLY and REQUIRED arguments and set LIBCPLEX_FOUND to TRUE\n   # if all listed variables are TRUE\n   find_package_handle_standard_args(IPOPT  DEFAULT_MSG\n                                     IPOPT_LIBRARY IPOPT_INCLUDE_DIR)\n\n   mark_as_advanced(IPOPT_INCLUDE_DIR IPOPT_LIBRARY )\n   \nENDIF()\n"
  },
  {
    "path": "libs/CoMISo/cmake/FindLAPACK.cmake",
    "content": "# Find LAPACK library\n#\n# This module finds an installed library that implements the LAPACK\n# linear-algebra interface (see http://www.netlib.org/lapack/).\n# The approach follows mostly that taken for the autoconf macro file, acx_lapack.m4\n# (distributed at http://ac-archive.sourceforge.net/ac-archive/acx_lapack.html).\n#\n# This module sets the following variables:\n#  LAPACK_FOUND - set to true if a library implementing the LAPACK interface\n#    is found\n#  LAPACK_INCLUDE_DIR - Directories containing the LAPACK header files\n#  LAPACK_DEFINITIONS - Compilation options to use LAPACK\n#  LAPACK_LINKER_FLAGS - Linker flags to use LAPACK (excluding -l\n#    and -L).\n#  LAPACK_LIBRARY_DIR - Directories containing the LAPACK libraries.\n#     May be null if LAPACK_LIBRARIES contains libraries name using full path.\n#  LAPACK_LIBRARIES - List of libraries to link against LAPACK interface.\n#     May be null if the compiler supports auto-link (e.g. VC++).\n#  LAPACK_USE_FILE - The name of the cmake module to include to compile\n#     applications or libraries using LAPACK.\n#\n# This module was modified by CGAL team:\n# - find LAPACK library shipped with TAUCS\n# - find libraries for a C++ compiler, instead of Fortran\n# - added LAPACK_INCLUDE_DIR, LAPACK_DEFINITIONS and LAPACK_LIBRARY_DIR\n# - removed LAPACK95_LIBRARIES\n#\n# TODO (CGAL):\n# - find CLAPACK (http://www.netlib.org/clapack) on Unix?\n\ninclude(CGAL_Macros)\n\ninclude(CheckFunctionExists)\n\ninclude(CGAL_GeneratorSpecificSettings)\n\n\n\n# This macro checks for the existence of the combination of fortran libraries\n# given by _list.  If the combination is found, this macro checks (using the\n# check_function_exists macro) whether can link against that library\n# combination using the name of a routine given by _name using the linker\n# flags given by _flags.  If the combination of libraries is found and passes\n# the link test, LIBRARIES is set to the list of complete library paths that\n# have been found and DEFINITIONS to the required definitions.\n# Otherwise, LIBRARIES is set to FALSE.\n# N.B. _prefix is the prefix applied to the names of all cached variables that\n# are generated internally and marked advanced by this macro.\nmacro(check_lapack_libraries DEFINITIONS LIBRARIES _prefix _name _flags _list _blas _path)\n  #message(\"DEBUG: check_lapack_libraries(${_list} in ${_path} with ${_blas})\")\n\n  # Check for the existence of the libraries given by _list\n  set(_libraries_found TRUE)\n  set(_libraries_work FALSE)\n  set(${DEFINITIONS} \"\")\n  set(${LIBRARIES} \"\")\n  set(_combined_name)\n  foreach(_library ${_list})\n    set(_combined_name ${_combined_name}_${_library})\n\n    if(_libraries_found)\n      # search first in ${_path}\n      find_library(${_prefix}_${_library}_LIBRARY\n                  NAMES ${_library}\n                  PATHS ${_path} NO_DEFAULT_PATH\n                  )\n      # if not found, search in environment variables and system\n      if ( WIN32 )\n        find_library(${_prefix}_${_library}_LIBRARY\n                    NAMES ${_library}\n                    PATHS ENV LIB\n                    )\n      elseif ( APPLE )\n        find_library(${_prefix}_${_library}_LIBRARY\n                    NAMES ${_library}\n                    PATHS /usr/local/lib /usr/lib /usr/local/lib64 /usr/lib64 ENV DYLD_LIBRARY_PATH\n                    )\n      else ()\n        find_library(${_prefix}_${_library}_LIBRARY\n                    NAMES ${_library}\n                    PATHS /usr/local/lib /usr/lib /usr/local/lib64 /usr/lib64 ENV LD_LIBRARY_PATH\n                    )\n      endif()\n      mark_as_advanced(${_prefix}_${_library}_LIBRARY)\n      set(${LIBRARIES} ${${LIBRARIES}} ${${_prefix}_${_library}_LIBRARY})\n      set(_libraries_found ${${_prefix}_${_library}_LIBRARY})\n    endif(_libraries_found)\n  endforeach(_library ${_list})\n  if(_libraries_found)\n    set(_libraries_found ${${LIBRARIES}})\n  endif()\n\n  # Test this combination of libraries with the Fortran/f2c interface.\n  # We test the Fortran interface first as it is well standardized.\n  if(_libraries_found AND NOT _libraries_work)\n    set(${DEFINITIONS}  \"-D${_prefix}_USE_F2C\")\n    set(${LIBRARIES}    ${_libraries_found})\n    # Some C++ linkers require the f2c library to link with Fortran libraries.\n    # I do not know which ones, thus I just add the f2c library if it is available.\n    find_package( F2C QUIET )\n    if ( F2C_FOUND )\n      set(${DEFINITIONS}  ${${DEFINITIONS}} ${F2C_DEFINITIONS})\n      set(${LIBRARIES}    ${${LIBRARIES}} ${F2C_LIBRARIES})\n    endif()\n    set(CMAKE_REQUIRED_DEFINITIONS  ${${DEFINITIONS}})\n    set(CMAKE_REQUIRED_LIBRARIES    ${_flags} ${${LIBRARIES}} ${_blas})\n    #message(\"DEBUG: CMAKE_REQUIRED_DEFINITIONS = ${CMAKE_REQUIRED_DEFINITIONS}\")\n    #message(\"DEBUG: CMAKE_REQUIRED_LIBRARIES = ${CMAKE_REQUIRED_LIBRARIES}\")\n    # Check if function exists with f2c calling convention (ie a trailing underscore)\n    check_function_exists(${_name}_ ${_prefix}_${_name}_${_combined_name}_f2c_WORKS)\n    set(CMAKE_REQUIRED_DEFINITIONS} \"\")\n    set(CMAKE_REQUIRED_LIBRARIES    \"\")\n    mark_as_advanced(${_prefix}_${_name}_${_combined_name}_f2c_WORKS)\n    set(_libraries_work ${${_prefix}_${_name}_${_combined_name}_f2c_WORKS})\n  endif(_libraries_found AND NOT _libraries_work)\n\n  # If not found, test this combination of libraries with a C interface.\n  # A few implementations (ie ACML) provide a C interface. Unfortunately, there is no standard.\n  if(_libraries_found AND NOT _libraries_work)\n    set(${DEFINITIONS} \"\")\n    set(${LIBRARIES}   ${_libraries_found})\n    set(CMAKE_REQUIRED_DEFINITIONS \"\")\n    set(CMAKE_REQUIRED_LIBRARIES   ${_flags} ${${LIBRARIES}} ${_blas})\n    #message(\"DEBUG: CMAKE_REQUIRED_LIBRARIES = ${CMAKE_REQUIRED_LIBRARIES}\")\n    check_function_exists(${_name} ${_prefix}_${_name}${_combined_name}_WORKS)\n    set(CMAKE_REQUIRED_LIBRARIES \"\")\n    mark_as_advanced(${_prefix}_${_name}${_combined_name}_WORKS)\n    set(_libraries_work ${${_prefix}_${_name}${_combined_name}_WORKS})\n  endif(_libraries_found AND NOT _libraries_work)\n\n  # on failure\n  if(NOT _libraries_work)\n    set(${DEFINITIONS} \"\")\n    set(${LIBRARIES}   FALSE)\n  endif()\n  #message(\"DEBUG: ${DEFINITIONS} = ${${DEFINITIONS}}\")\n  #message(\"DEBUG: ${LIBRARIES} = ${${LIBRARIES}}\")\nendmacro(check_lapack_libraries)\n\n\n#\n# main\n#\n\n# LAPACK requires BLAS\nif(LAPACK_FIND_QUIETLY OR NOT LAPACK_FIND_REQUIRED)\n  find_package(BLAS)\nelse()\n  find_package(BLAS REQUIRED)\nendif()\n\nif (NOT BLAS_FOUND)\n\n  message(STATUS \"LAPACK requires BLAS.\")\n  set(LAPACK_FOUND FALSE)\n\n# Is it already configured?\nelseif (LAPACK_LIBRARY_DIR OR LAPACK_LIBRARIES)\n\n  set(LAPACK_FOUND TRUE)\n\nelse()\n\n  # reset variables\n  set( LAPACK_INCLUDE_DIR \"\" )\n  set( LAPACK_DEFINITIONS \"\" )\n  set( LAPACK_LINKER_FLAGS \"\" ) # unused (yet)\n  set( LAPACK_LIBRARIES \"\" )\n  set( LAPACK_LIBRARY_DIR \"\" )\n\n  # Look first for the TAUCS library distributed with CGAL in auxiliary/taucs.\n  # Set CGAL_TAUCS_FOUND, CGAL_TAUCS_INCLUDE_DIR and CGAL_TAUCS_LIBRARIES_DIR.\n  include(CGAL_Locate_CGAL_TAUCS)\n\n  # Search for LAPACK in CGAL_TAUCS_INCLUDE_DIR/CGAL_TAUCS_LIBRARIES_DIR (TAUCS shipped with CGAL),\n  # else in $LAPACK_INC_DIR/$LAPACK_LIB_DIR environment variables.\n  if(CGAL_TAUCS_FOUND AND CGAL_AUTO_LINK_ENABLED)\n\n    # if VC++: done\n    set( LAPACK_INCLUDE_DIR    \"${CGAL_TAUCS_INCLUDE_DIR}\" )\n    set( LAPACK_LIBRARY_DIR  \"${CGAL_TAUCS_LIBRARIES_DIR}\" )\n\n  else(CGAL_TAUCS_FOUND AND CGAL_AUTO_LINK_ENABLED)\n\n    #\n    # If Unix, search for LAPACK function in possible libraries\n    #\n\n    #intel mkl lapack?\n    if(NOT LAPACK_LIBRARIES)\n      check_lapack_libraries(\n      LAPACK_DEFINITIONS\n      LAPACK_LIBRARIES\n      LAPACK\n      cheev\n      \"\"\n      \"mkl_lapack\"\n      \"${BLAS_LIBRARIES}\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV LAPACK_LIB_DIR\"\n      )\n    endif()\n\n    #acml lapack?\n    if(NOT LAPACK_LIBRARIES)\n      check_lapack_libraries(\n      LAPACK_DEFINITIONS\n      LAPACK_LIBRARIES\n      LAPACK\n      cheev\n      \"\"\n      \"acml\"\n      \"${BLAS_LIBRARIES}\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV LAPACK_LIB_DIR\"\n      )\n    endif()\n\n    # Apple LAPACK library?\n    if(NOT LAPACK_LIBRARIES)\n      check_lapack_libraries(\n      LAPACK_DEFINITIONS\n      LAPACK_LIBRARIES\n      LAPACK\n      cheev\n      \"\"\n      \"Accelerate\"\n      \"${BLAS_LIBRARIES}\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV LAPACK_LIB_DIR\"\n      )\n    endif()\n\n    if ( NOT LAPACK_LIBRARIES )\n      check_lapack_libraries(\n      LAPACK_DEFINITIONS\n      LAPACK_LIBRARIES\n      LAPACK\n      cheev\n      \"\"\n      \"vecLib\"\n      \"${BLAS_LIBRARIES}\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV LAPACK_LIB_DIR\"\n      )\n    endif ( NOT LAPACK_LIBRARIES )\n\n    # Generic LAPACK library?\n    # This configuration *must* be the last try as this library is notably slow.\n    if ( NOT LAPACK_LIBRARIES )\n      check_lapack_libraries(\n      LAPACK_DEFINITIONS\n      LAPACK_LIBRARIES\n      LAPACK\n      cheev\n      \"\"\n      \"lapack\"\n      \"${BLAS_LIBRARIES}\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV LAPACK_LIB_DIR\"\n      )\n    endif()\n\n  endif(CGAL_TAUCS_FOUND AND CGAL_AUTO_LINK_ENABLED)\n\n  if(LAPACK_LIBRARY_DIR OR LAPACK_LIBRARIES)\n    set(LAPACK_FOUND TRUE)\n  else()\n    set(LAPACK_FOUND FALSE)\n  endif()\n\n  if(NOT LAPACK_FIND_QUIETLY)\n    if(LAPACK_FOUND)\n      message(STATUS \"A library with LAPACK API found.\")\n    else(LAPACK_FOUND)\n      if(LAPACK_FIND_REQUIRED)\n        message(FATAL_ERROR \"A required library with LAPACK API not found. Please specify library location.\")\n      else()\n        message(STATUS \"A library with LAPACK API not found. Please specify library location.\")\n      endif()\n    endif(LAPACK_FOUND)\n  endif(NOT LAPACK_FIND_QUIETLY)\n\n  # Add variables to cache\n  set( LAPACK_INCLUDE_DIR   \"${LAPACK_INCLUDE_DIR}\"\n                            CACHE PATH \"Directories containing the LAPACK header files\" FORCE )\n  set( LAPACK_DEFINITIONS   \"${LAPACK_DEFINITIONS}\"\n                            CACHE STRING \"Compilation options to use LAPACK\" FORCE )\n  set( LAPACK_LINKER_FLAGS  \"${LAPACK_LINKER_FLAGS}\"\n                            CACHE STRING \"Linker flags to use LAPACK\" FORCE )\n  set( LAPACK_LIBRARIES     \"${LAPACK_LIBRARIES}\"\n                            CACHE FILEPATH \"LAPACK libraries name\" FORCE )\n  set( LAPACK_LIBRARY_DIR   \"${LAPACK_LIBRARY_DIR}\"\n                            CACHE PATH \"Directories containing the LAPACK libraries\" FORCE )\n\n  #message(\"DEBUG: LAPACK_INCLUDE_DIR = ${LAPACK_INCLUDE_DIR}\")\n  #message(\"DEBUG: LAPACK_DEFINITIONS = ${LAPACK_DEFINITIONS}\")\n  #message(\"DEBUG: LAPACK_LINKER_FLAGS = ${LAPACK_LINKER_FLAGS}\")\n  #message(\"DEBUG: LAPACK_LIBRARIES = ${LAPACK_LIBRARIES}\")\n  #message(\"DEBUG: LAPACK_LIBRARY_DIR = ${LAPACK_LIBRARY_DIR}\")\n  #message(\"DEBUG: LAPACK_FOUND = ${LAPACK_FOUND}\")\n\nendif(NOT BLAS_FOUND)\n\nif(LAPACK_FOUND)\n  set(LAPACK_USE_FILE \"CGAL_UseLAPACK\")\nendif(LAPACK_FOUND)\n"
  },
  {
    "path": "libs/CoMISo/cmake/FindMETIS.cmake",
    "content": "# - Try to find METIS\n# Once done this will define\n#  METIS_FOUND - System has Metis\n#  METIS_INCLUDE_DIRS - The Metis include directories\n#  METIS_LIBRARY_DIRS - The library directories needed to use Metis\n#  METIS_LIBRARIES    - The libraries needed to use Metis\n\nif (METIS_INCLUDE_DIR)\n  # in cache already\n  SET(METIS_FIND_QUIETLY TRUE)\nendif (METIS_INCLUDE_DIR)\n\nfind_path(METIS_INCLUDE_DIR NAMES metis.h\n     PATHS \"$ENV{IPOPT_HOME}/ThirdParty/Metis/metis-4.0/Lib/\"\n           \"/usr/include/\"\n           \"/usr/include/metis\"\n           \"/opt/local/include\"\n           \"/opt/local/include/metis\"\n           \n           \n   )\n   \nfind_library( METIS_LIBRARY \n              metis coinmetis\n              PATHS \"$ENV{IPOPT_HOME}/lib/\"\n                    \"/usr/lib\"\n                    \"/opt/local/lib\" )\n\nset(METIS_INCLUDE_DIRS \"${METIS_INCLUDE_DIR}\" )\nset(METIS_LIBRARIES \"${METIS_LIBRARY}\" )\n\ninclude(FindPackageHandleStandardArgs)\n# handle the QUIETLY and REQUIRED arguments and set LIBCPLEX_FOUND to TRUE\n# if all listed variables are TRUE\nfind_package_handle_standard_args(METIS  DEFAULT_MSG\n                                  METIS_LIBRARY METIS_INCLUDE_DIR)\n\nmark_as_advanced(METIS_INCLUDE_DIR METIS_LIBRARY )\n"
  },
  {
    "path": "libs/CoMISo/cmake/FindMPI.cmake",
    "content": "# - Find a Message Passing Interface (MPI) implementation\n# The Message Passing Interface (MPI) is a library used to write\n# high-performance distributed-memory parallel applications, and\n# is typically deployed on a cluster. MPI is a standard interface\n# (defined by the MPI forum) for which many implementations are\n# available. All of them have somewhat different include paths,\n# libraries to link against, etc., and this module tries to smooth\n# out those differences.\n#\n# === Variables ===\n#\n# This module will set the following variables per language in your project,\n# where <lang> is one of C, CXX, or Fortran:\n#   MPI_<lang>_FOUND           TRUE if FindMPI found MPI flags for <lang>\n#   MPI_<lang>_COMPILER        MPI Compiler wrapper for <lang>\n#   MPI_<lang>_COMPILE_FLAGS   Compilation flags for MPI programs\n#   MPI_<lang>_INCLUDE_PATH    Include path(s) for MPI header\n#   MPI_<lang>_LINK_FLAGS      Linking flags for MPI programs\n#   MPI_<lang>_LIBRARIES       All libraries to link MPI programs against\n# Additionally, FindMPI sets the following variables for running MPI\n# programs from the command line:\n#   MPIEXEC                    Executable for running MPI programs\n#   MPIEXEC_NUMPROC_FLAG       Flag to pass to MPIEXEC before giving\n#                              it the number of processors to run on\n#   MPIEXEC_PREFLAGS           Flags to pass to MPIEXEC directly\n#                              before the executable to run.\n#   MPIEXEC_POSTFLAGS          Flags to pass to MPIEXEC after other flags\n# === Usage ===\n#\n# To use this module, simply call FindMPI from a CMakeLists.txt file, or\n# run find_package(MPI), then run CMake.  If you are happy with the auto-\n# detected configuration for your language, then you're done.  If not, you\n# have two options:\n#   1. Set MPI_<lang>_COMPILER to the MPI wrapper (mpicc, etc.) of your\n#      choice and reconfigure.  FindMPI will attempt to determine all the\n#      necessary variables using THAT compiler's compile and link flags.\n#   2. If this fails, or if your MPI implementation does not come with\n#      a compiler wrapper, then set both MPI_<lang>_LIBRARIES and\n#      MPI_<lang>_INCLUDE_PATH.  You may also set any other variables\n#      listed above, but these two are required.  This will circumvent\n#      autodetection entirely.\n# When configuration is successful, MPI_<lang>_COMPILER will be set to the\n# compiler wrapper for <lang>, if it was found.  MPI_<lang>_FOUND and other\n# variables above will be set if any MPI implementation was found for <lang>,\n# regardless of whether a compiler was found.\n#\n# When using MPIEXEC to execute MPI applications, you should typically use\n# all of the MPIEXEC flags as follows:\n#   ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} PROCS\n#     ${MPIEXEC_PREFLAGS} EXECUTABLE ${MPIEXEC_POSTFLAGS} ARGS\n# where PROCS is the number of processors on which to execute the program,\n# EXECUTABLE is the MPI program, and ARGS are the arguments to pass to the\n# MPI program.\n#\n# === Backward Compatibility ===\n#\n# For backward compatibility with older versions of FindMPI, these\n# variables are set, but deprecated:\n#   MPI_FOUND           MPI_COMPILER        MPI_LIBRARY\n#   MPI_COMPILE_FLAGS   MPI_INCLUDE_PATH    MPI_EXTRA_LIBRARY\n#   MPI_LINK_FLAGS      MPI_LIBRARIES\n# In new projects, please use the MPI_<lang>_XXX equivalents.\n\n#=============================================================================\n# Copyright 2001-2011 Kitware, Inc.\n# Copyright 2010-2011 Todd Gamblin tgamblin@llnl.gov\n# Copyright 2001-2009 Dave Partyka\n#\n# Distributed under the OSI-approved BSD License (the \"License\");\n# see accompanying file Copyright.txt for details.\n#\n# This software is distributed WITHOUT ANY WARRANTY; without even the\n# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See the License for more information.\n#=============================================================================\n# (To distribute this file outside of CMake, substitute the full\n#  License text for the above reference.)\n\n# include this to handle the QUIETLY and REQUIRED arguments\ninclude(${CMAKE_ROOT}/Modules/FindPackageHandleStandardArgs.cmake)\ninclude(GetPrerequisites)\n\n#\n# This part detects MPI compilers, attempting to wade through the mess of compiler names in\n# a sensible way.\n#\n# The compilers are detected in this order:\n#\n# 1. Try to find the most generic availble MPI compiler, as this is usually set up by\n#    cluster admins.  e.g., if plain old mpicc is available, we'll use it and assume it's\n#    the right compiler.\n#\n# 2. If a generic mpicc is NOT found, then we attempt to find one that matches\n#    CMAKE_<lang>_COMPILER_ID. e.g. if you are using XL compilers, we'll try to find mpixlc\n#    and company, but not mpiicc.  This hopefully prevents toolchain mismatches.\n#\n# If you want to force a particular MPI compiler other than what we autodetect (e.g. if you\n# want to compile regular stuff with GNU and parallel stuff with Intel), you can always set\n# your favorite MPI_<lang>_COMPILER explicitly and this stuff will be ignored.\n#\n\n# Start out with the generic MPI compiler names, as these are most commonly used.\nset(_MPI_C_COMPILER_NAMES                  mpicc    mpcc      mpicc_r mpcc_r)\nset(_MPI_CXX_COMPILER_NAMES                mpicxx   mpiCC     mpcxx   mpCC    mpic++   mpc++\n                                           mpicxx_r mpiCC_r   mpcxx_r mpCC_r  mpic++_r mpc++_r)\nset(_MPI_Fortran_COMPILER_NAMES            mpif95   mpif95_r  mpf95   mpf95_r\n                                           mpif90   mpif90_r  mpf90   mpf90_r\n                                           mpif77   mpif77_r  mpf77   mpf77_r)\n\n# GNU compiler names\nset(_MPI_GNU_C_COMPILER_NAMES              mpigcc mpgcc mpigcc_r mpgcc_r)\nset(_MPI_GNU_CXX_COMPILER_NAMES            mpig++ mpg++ mpig++_r mpg++_r)\nset(_MPI_GNU_Fortran_COMPILER_NAMES        mpigfortran mpgfortran mpigfortran_r mpgfortran_r\n                                           mpig77 mpig77_r mpg77 mpg77_r)\n\n# Intel MPI compiler names\nset(_MPI_Intel_C_COMPILER_NAMES            mpiicc)\nset(_MPI_Intel_CXX_COMPILER_NAMES          mpiicpc  mpiicxx mpiic++ mpiiCC)\nset(_MPI_Intel_Fortran_COMPILER_NAMES      mpiifort mpiif95 mpiif90 mpiif77)\n\n# PGI compiler names\nset(_MPI_PGI_C_COMPILER_NAMES              mpipgcc mppgcc)\nset(_MPI_PGI_CXX_COMPILER_NAMES            mpipgCC mppgCC)\nset(_MPI_PGI_Fortran_COMPILER_NAMES        mpipgf95 mpipgf90 mppgf95 mppgf90 mpipgf77 mppgf77)\n\n# XLC MPI Compiler names\nset(_MPI_XL_C_COMPILER_NAMES               mpxlc      mpxlc_r    mpixlc     mpixlc_r)\nset(_MPI_XL_CXX_COMPILER_NAMES             mpixlcxx   mpixlC     mpixlc++   mpxlcxx   mpxlc++   mpixlc++   mpxlCC\n                                           mpixlcxx_r mpixlC_r   mpixlc++_r mpxlcxx_r mpxlc++_r mpixlc++_r mpxlCC_r)\nset(_MPI_XL_Fortran_COMPILER_NAMES         mpixlf95   mpixlf95_r mpxlf95 mpxlf95_r\n                                           mpixlf90   mpixlf90_r mpxlf90 mpxlf90_r\n                                           mpixlf77   mpixlf77_r mpxlf77 mpxlf77_r\n                                           mpixlf     mpixlf_r   mpxlf   mpxlf_r)\n\n# append vendor-specific compilers to the list if we either don't know the compiler id,\n# or if we know it matches the regular compiler.\nforeach (lang C CXX Fortran)\n  foreach (id GNU Intel PGI XL)\n    if (NOT CMAKE_${lang}_COMPILER_ID OR \"${CMAKE_${lang}_COMPILER_ID}\" STREQUAL \"${id}\")\n      list(APPEND _MPI_${lang}_COMPILER_NAMES ${_MPI_${id}_${lang}_COMPILER_NAMES})\n    endif()\n    unset(_MPI_${id}_${lang}_COMPILER_NAMES)    # clean up the namespace here\n  endforeach()\nendforeach()\n\n\n# Names to try for MPI exec\nset(_MPI_EXEC_NAMES                        mpiexec mpirun lamexec srun)\n\n# Grab the path to MPI from the registry if we're on windows.\nset(_MPI_PREFIX_PATH)\nif(WIN32)\n  list(APPEND _MPI_PREFIX_PATH \"[HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\MPICH\\\\SMPD;binary]/..\")\n  list(APPEND _MPI_PREFIX_PATH \"[HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\MPICH2;Path]\")\n  list(APPEND _MPI_PREFIX_PATH \"$ENV{ProgramW6432}/MPICH2/\")\nendif()\n\n# Build a list of prefixes to search for MPI.\nforeach(SystemPrefixDir ${CMAKE_SYSTEM_PREFIX_PATH})\n  foreach(MpiPackageDir ${_MPI_PREFIX_PATH})\n    if(EXISTS ${SystemPrefixDir}/${MpiPackageDir})\n      list(APPEND _MPI_PREFIX_PATH \"${SystemPrefixDir}/${MpiPackageDir}\")\n    endif()\n  endforeach()\nendforeach()\n\n\n#\n# interrogate_mpi_compiler(lang try_libs)\n#\n# Attempts to extract compiler and linker args from an MPI compiler. The arguments set\n# by this function are:\n#\n#   MPI_<lang>_INCLUDE_PATH    MPI_<lang>_LINK_FLAGS     MPI_<lang>_FOUND\n#   MPI_<lang>_COMPILE_FLAGS   MPI_<lang>_LIBRARIES\n#\n# MPI_<lang>_COMPILER must be set beforehand to the absolute path to an MPI compiler for\n# <lang>.  Additionally, MPI_<lang>_INCLUDE_PATH and MPI_<lang>_LIBRARIES may be set\n# to skip autodetection.\n#\n# If try_libs is TRUE, this will also attempt to find plain MPI libraries in the usual\n# way.  In general, this is not as effective as interrogating the compilers, as it\n# ignores language-specific flags and libraries.  However, some MPI implementations\n# (Windows implementations) do not have compiler wrappers, so this approach must be used.\n#\nfunction (interrogate_mpi_compiler lang try_libs)\n  # MPI_${lang}_NO_INTERROGATE will be set to a compiler name when the *regular* compiler was\n  # discovered to be the MPI compiler.  This happens on machines like the Cray XE6 that use\n  # modules to set cc, CC, and ftn to the MPI compilers.  If the user force-sets another MPI\n  # compiler, MPI_${lang}_COMPILER won't be equal to MPI_${lang}_NO_INTERROGATE, and we'll\n  # inspect that compiler anew.  This allows users to set new compilers w/o rm'ing cache.\n  string(COMPARE NOTEQUAL \"${MPI_${lang}_NO_INTERROGATE}\" \"${MPI_${lang}_COMPILER}\" interrogate)\n\n  # If MPI is set already in the cache, don't bother with interrogating the compiler.\n  if (interrogate AND ((NOT MPI_${lang}_INCLUDE_PATH) OR (NOT MPI_${lang}_LIBRARIES)))\n    if (MPI_${lang}_COMPILER)\n      # Check whether the -showme:compile option works. This indicates that we have either OpenMPI\n      # or a newer version of LAM-MPI, and implies that -showme:link will also work.\n      execute_process(\n        COMMAND ${MPI_${lang}_COMPILER} -showme:compile\n        OUTPUT_VARIABLE  MPI_COMPILE_CMDLINE OUTPUT_STRIP_TRAILING_WHITESPACE\n        ERROR_VARIABLE   MPI_COMPILE_CMDLINE ERROR_STRIP_TRAILING_WHITESPACE\n        RESULT_VARIABLE  MPI_COMPILER_RETURN)\n\n      if (MPI_COMPILER_RETURN EQUAL 0)\n        # If we appear to have -showme:compile, then we should\n        # also have -showme:link. Try it.\n        execute_process(\n          COMMAND ${MPI_${lang}_COMPILER} -showme:link\n          OUTPUT_VARIABLE  MPI_LINK_CMDLINE OUTPUT_STRIP_TRAILING_WHITESPACE\n          ERROR_VARIABLE   MPI_LINK_CMDLINE ERROR_STRIP_TRAILING_WHITESPACE\n          RESULT_VARIABLE  MPI_COMPILER_RETURN)\n\n        if (MPI_COMPILER_RETURN EQUAL 0)\n          # We probably have -showme:incdirs and -showme:libdirs as well,\n          # so grab that while we're at it.\n          execute_process(\n            COMMAND ${MPI_${lang}_COMPILER} -showme:incdirs\n            OUTPUT_VARIABLE  MPI_INCDIRS OUTPUT_STRIP_TRAILING_WHITESPACE\n            ERROR_VARIABLE   MPI_INCDIRS ERROR_STRIP_TRAILING_WHITESPACE)\n\n          execute_process(\n            COMMAND ${MPI_${lang}_COMPILER} -showme:libdirs\n            OUTPUT_VARIABLE  MPI_LIBDIRS OUTPUT_STRIP_TRAILING_WHITESPACE\n            ERROR_VARIABLE   MPI_LIBDIRS ERROR_STRIP_TRAILING_WHITESPACE)\n\n        else()\n          # reset things here if something went wrong.\n          set(MPI_COMPILE_CMDLINE)\n          set(MPI_LINK_CMDLINE)\n        endif()\n      endif ()\n\n      # Older versions of LAM-MPI have \"-showme\". Try to find that.\n      if (NOT MPI_COMPILER_RETURN EQUAL 0)\n        execute_process(\n          COMMAND ${MPI_${lang}_COMPILER} -showme\n          OUTPUT_VARIABLE  MPI_COMPILE_CMDLINE OUTPUT_STRIP_TRAILING_WHITESPACE\n          ERROR_VARIABLE   MPI_COMPILE_CMDLINE ERROR_STRIP_TRAILING_WHITESPACE\n          RESULT_VARIABLE  MPI_COMPILER_RETURN)\n      endif()\n\n      # MVAPICH uses -compile-info and -link-info.  Try them.\n      if (NOT MPI_COMPILER_RETURN EQUAL 0)\n        execute_process(\n          COMMAND ${MPI_${lang}_COMPILER} -compile-info\n          OUTPUT_VARIABLE  MPI_COMPILE_CMDLINE OUTPUT_STRIP_TRAILING_WHITESPACE\n          ERROR_VARIABLE   MPI_COMPILE_CMDLINE ERROR_STRIP_TRAILING_WHITESPACE\n          RESULT_VARIABLE  MPI_COMPILER_RETURN)\n\n        # If we have compile-info, also have link-info.\n        if (MPI_COMPILER_RETURN EQUAL 0)\n          execute_process(\n            COMMAND ${MPI_${lang}_COMPILER} -link-info\n            OUTPUT_VARIABLE  MPI_LINK_CMDLINE OUTPUT_STRIP_TRAILING_WHITESPACE\n            ERROR_VARIABLE   MPI_LINK_CMDLINE ERROR_STRIP_TRAILING_WHITESPACE\n            RESULT_VARIABLE  MPI_COMPILER_RETURN)\n        endif()\n\n        # make sure we got compile and link.  Reset vars if something's wrong.\n        if (NOT MPI_COMPILER_RETURN EQUAL 0)\n          set(MPI_COMPILE_CMDLINE)\n          set(MPI_LINK_CMDLINE)\n        endif()\n      endif()\n\n      # MPICH just uses \"-show\". Try it.\n      if (NOT MPI_COMPILER_RETURN EQUAL 0)\n        execute_process(\n          COMMAND ${MPI_${lang}_COMPILER} -show\n          OUTPUT_VARIABLE  MPI_COMPILE_CMDLINE OUTPUT_STRIP_TRAILING_WHITESPACE\n          ERROR_VARIABLE   MPI_COMPILE_CMDLINE ERROR_STRIP_TRAILING_WHITESPACE\n          RESULT_VARIABLE  MPI_COMPILER_RETURN)\n      endif()\n\n      if (MPI_COMPILER_RETURN EQUAL 0)\n        # We have our command lines, but we might need to copy MPI_COMPILE_CMDLINE\n        # into MPI_LINK_CMDLINE, if we didn't find the link line.\n        if (NOT MPI_LINK_CMDLINE)\n          set(MPI_LINK_CMDLINE ${MPI_COMPILE_CMDLINE})\n        endif()\n      else()\n        message(STATUS \"Unable to determine MPI from MPI driver ${MPI_${lang}_COMPILER}\")\n        set(MPI_COMPILE_CMDLINE)\n        set(MPI_LINK_CMDLINE)\n      endif()\n\n      # Here, we're done with the interrogation part, and we'll try to extract args we care\n      # about from what we learned from the compiler wrapper scripts.\n\n      # If interrogation came back with something, extract our variable from the MPI command line\n      if (MPI_COMPILE_CMDLINE OR MPI_LINK_CMDLINE)\n        # Extract compile flags from the compile command line.\n        string(REGEX MATCHALL \"(^| )-[Df]([^\\\" ]+|\\\"[^\\\"]+\\\")\" MPI_ALL_COMPILE_FLAGS \"${MPI_COMPILE_CMDLINE}\")\n        set(MPI_COMPILE_FLAGS_WORK)\n\n        foreach(FLAG ${MPI_ALL_COMPILE_FLAGS})\n          if (MPI_COMPILE_FLAGS_WORK)\n            set(MPI_COMPILE_FLAGS_WORK \"${MPI_COMPILE_FLAGS_WORK} ${FLAG}\")\n          else()\n            set(MPI_COMPILE_FLAGS_WORK ${FLAG})\n          endif()\n        endforeach()\n\n        # Extract include paths from compile command line\n        string(REGEX MATCHALL \"(^| )-I([^\\\" ]+|\\\"[^\\\"]+\\\")\" MPI_ALL_INCLUDE_PATHS \"${MPI_COMPILE_CMDLINE}\")\n        foreach(IPATH ${MPI_ALL_INCLUDE_PATHS})\n          string(REGEX REPLACE \"^ ?-I\" \"\" IPATH ${IPATH})\n          string(REGEX REPLACE \"//\" \"/\" IPATH ${IPATH})\n          list(APPEND MPI_INCLUDE_PATH_WORK ${IPATH})\n        endforeach()\n\n        # try using showme:incdirs if extracting didn't work.\n        if (NOT MPI_INCLUDE_PATH_WORK)\n          set(MPI_INCLUDE_PATH_WORK ${MPI_INCDIRS})\n          separate_arguments(MPI_INCLUDE_PATH_WORK)\n        endif()\n\n        # If all else fails, just search for mpi.h in the normal include paths.\n        if (NOT MPI_INCLUDE_PATH_WORK)\n          set(MPI_HEADER_PATH \"MPI_HEADER_PATH-NOTFOUND\" CACHE FILEPATH \"Cleared\" FORCE)\n          find_path(MPI_HEADER_PATH mpi.h\n            HINTS ${_MPI_BASE_DIR} ${_MPI_PREFIX_PATH}\n            PATH_SUFFIXES include)\n          set(MPI_INCLUDE_PATH_WORK ${MPI_HEADER_PATH})\n        endif()\n\n        # Extract linker paths from the link command line\n        string(REGEX MATCHALL \"(^| |-Wl,)-L([^\\\" ]+|\\\"[^\\\"]+\\\")\" MPI_ALL_LINK_PATHS \"${MPI_LINK_CMDLINE}\")\n        set(MPI_LINK_PATH)\n        foreach(LPATH ${MPI_ALL_LINK_PATHS})\n          string(REGEX REPLACE \"^(| |-Wl,)-L\" \"\" LPATH ${LPATH})\n          string(REGEX REPLACE \"//\" \"/\" LPATH ${LPATH})\n          list(APPEND MPI_LINK_PATH ${LPATH})\n        endforeach()\n\n        # try using showme:libdirs if extracting didn't work.\n        if (NOT MPI_LINK_PATH)\n          set(MPI_LINK_PATH ${MPI_LIBDIRS})\n          separate_arguments(MPI_LINK_PATH)\n        endif()\n\n        # Extract linker flags from the link command line\n        string(REGEX MATCHALL \"(^| )-Wl,([^\\\" ]+|\\\"[^\\\"]+\\\")\" MPI_ALL_LINK_FLAGS \"${MPI_LINK_CMDLINE}\")\n        set(MPI_LINK_FLAGS_WORK)\n        foreach(FLAG ${MPI_ALL_LINK_FLAGS})\n          if (MPI_LINK_FLAGS_WORK)\n            set(MPI_LINK_FLAGS_WORK \"${MPI_LINK_FLAGS_WORK} ${FLAG}\")\n          else()\n            set(MPI_LINK_FLAGS_WORK ${FLAG})\n          endif()\n        endforeach()\n\n        # Extract the set of libraries to link against from the link command\n        # line\n        string(REGEX MATCHALL \"(^| )-l([^\\\" ]+|\\\"[^\\\"]+\\\")\" MPI_LIBNAMES \"${MPI_LINK_CMDLINE}\")\n\n        # Determine full path names for all of the libraries that one needs\n        # to link against in an MPI program\n        foreach(LIB ${MPI_LIBNAMES})\n          string(REGEX REPLACE \"^ ?-l\" \"\" LIB ${LIB})\n          # MPI_LIB is cached by find_library, but we don't want that.  Clear it first.\n          set(MPI_LIB \"MPI_LIB-NOTFOUND\" CACHE FILEPATH \"Cleared\" FORCE)\n          find_library(MPI_LIB NAMES ${LIB} HINTS ${MPI_LINK_PATH})\n\n          if (MPI_LIB)\n            list(APPEND MPI_LIBRARIES_WORK ${MPI_LIB})\n          elseif (NOT MPI_FIND_QUIETLY)\n            message(WARNING \"Unable to find MPI library ${LIB}\")\n          endif()\n        endforeach()\n\n        # Sanity check MPI_LIBRARIES to make sure there are enough libraries\n        list(LENGTH MPI_LIBRARIES_WORK MPI_NUMLIBS)\n        list(LENGTH MPI_LIBNAMES MPI_NUMLIBS_EXPECTED)\n        if (NOT MPI_NUMLIBS EQUAL MPI_NUMLIBS_EXPECTED)\n          set(MPI_LIBRARIES_WORK \"MPI_${lang}_LIBRARIES-NOTFOUND\")\n        endif()\n      endif()\n\n    elseif(try_libs)\n      # If we didn't have an MPI compiler script to interrogate, attempt to find everything\n      # with plain old find functions.  This is nasty because MPI implementations have LOTS of\n      # different library names, so this section isn't going to be very generic.  We need to\n      # make sure it works for MS MPI, though, since there are no compiler wrappers for that.\n      find_path(MPI_HEADER_PATH mpi.h\n        HINTS ${_MPI_BASE_DIR} ${_MPI_PREFIX_PATH}\n        PATH_SUFFIXES include Inc)\n      set(MPI_INCLUDE_PATH_WORK ${MPI_HEADER_PATH})\n\n      # Decide between 32-bit and 64-bit libraries for Microsoft's MPI\n      if(\"${CMAKE_SIZEOF_VOID_P}\" EQUAL 8)\n        set(MS_MPI_ARCH_DIR amd64)\n      else()\n        set(MS_MPI_ARCH_DIR i386)\n      endif()\n\n      set(MPI_LIB \"MPI_LIB-NOTFOUND\" CACHE FILEPATH \"Cleared\" FORCE)\n      find_library(MPI_LIB\n        NAMES         mpi mpich mpich2 msmpi\n        HINTS         ${_MPI_BASE_DIR} ${_MPI_PREFIX_PATH}\n        PATH_SUFFIXES lib lib/${MS_MPI_ARCH_DIR} Lib Lib/${MS_MPI_ARCH_DIR})\n      set(MPI_LIBRARIES_WORK ${MPI_LIB})\n\n      # Right now, we only know about the extra libs for C++.\n      # We could add Fortran here (as there is usually libfmpich, etc.), but\n      # this really only has to work with MS MPI on Windows.\n      # Assume that other MPI's are covered by the compiler wrappers.\n      if (${lang} STREQUAL CXX)\n        set(MPI_LIB \"MPI_LIB-NOTFOUND\" CACHE FILEPATH \"Cleared\" FORCE)\n        find_library(MPI_LIB\n          NAMES         mpi++ mpicxx cxx mpi_cxx\n          HINTS         ${_MPI_BASE_DIR} ${_MPI_PREFIX_PATH}\n          PATH_SUFFIXES lib)\n        if (MPI_LIBRARIES_WORK AND MPI_LIB)\n          set(MPI_LIBRARIES_WORK \"${MPI_LIBRARIES_WORK};${MPI_LIB}\")\n        endif()\n      endif()\n\n      if (NOT MPI_LIBRARIES_WORK)\n        set(MPI_LIBRARIES_WORK \"MPI_${lang}_LIBRARIES-NOTFOUND\")\n      endif()\n    endif()\n\n    # If we found MPI, set up all of the appropriate cache entries\n    set(MPI_${lang}_COMPILE_FLAGS ${MPI_COMPILE_FLAGS_WORK} CACHE STRING \"MPI ${lang} compilation flags\"         FORCE)\n    set(MPI_${lang}_INCLUDE_PATH  ${MPI_INCLUDE_PATH_WORK}  CACHE STRING \"MPI ${lang} include path\"              FORCE)\n    set(MPI_${lang}_LINK_FLAGS    ${MPI_LINK_FLAGS_WORK}    CACHE STRING \"MPI ${lang} linking flags\"             FORCE)\n    set(MPI_${lang}_LIBRARIES     ${MPI_LIBRARIES_WORK}     CACHE STRING \"MPI ${lang} libraries to link against\" FORCE)\n    mark_as_advanced(MPI_${lang}_COMPILE_FLAGS MPI_${lang}_INCLUDE_PATH MPI_${lang}_LINK_FLAGS MPI_${lang}_LIBRARIES)\n\n    # clear out our temporary lib/header detectionv variable here.\n    set(MPI_LIB         \"MPI_LIB-NOTFOUND\"         CACHE INTERNAL \"Scratch variable for MPI lib detection\"    FORCE)\n    set(MPI_HEADER_PATH \"MPI_HEADER_PATH-NOTFOUND\" CACHE INTERNAL \"Scratch variable for MPI header detection\" FORCE)\n  endif()\n\n  # finally set a found variable for each MPI language\n  if (MPI_${lang}_INCLUDE_PATH AND MPI_${lang}_LIBRARIES)\n    set(MPI_${lang}_FOUND TRUE PARENT_SCOPE)\n  else()\n    set(MPI_${lang}_FOUND FALSE PARENT_SCOPE)\n  endif()\nendfunction()\n\n\n# This function attempts to compile with the regular compiler, to see if MPI programs\n# work with it.  This is a last ditch attempt after we've tried interrogating mpicc and\n# friends, and after we've tried to find generic libraries.  Works on machines like\n# Cray XE6, where the modules environment changes what MPI version cc, CC, and ftn use.\nfunction(try_regular_compiler lang success)\n  set(scratch_directory ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY})\n  if (${lang} STREQUAL Fortran)\n    set(test_file ${scratch_directory}/cmake_mpi_test.f90)\n    file(WRITE ${test_file}\n      \"program hello\\n\"\n      \"include 'mpif.h'\\n\"\n      \"integer ierror\\n\"\n      \"call MPI_INIT(ierror)\\n\"\n      \"call MPI_FINALIZE(ierror)\\n\"\n      \"end\\n\")\n  else()\n    if (${lang} STREQUAL CXX)\n      set(test_file ${scratch_directory}/cmake_mpi_test.cpp)\n    else()\n      set(test_file ${scratch_directory}/cmake_mpi_test.c)\n    endif()\n    file(WRITE ${test_file}\n      \"#include <mpi.h>\\n\"\n      \"int main(int argc, char **argv) {\\n\"\n      \"  MPI_Init(&argc, &argv);\\n\"\n      \"  MPI_Finalize();\\n\"\n      \"}\\n\")\n  endif()\n  try_compile(compiler_has_mpi ${scratch_directory} ${test_file})\n  if (compiler_has_mpi)\n    set(MPI_${lang}_NO_INTERROGATE ${CMAKE_${lang}_COMPILER} CACHE STRING \"Whether to interrogate MPI ${lang} compiler\" FORCE)\n    set(MPI_${lang}_COMPILER       ${CMAKE_${lang}_COMPILER} CACHE STRING \"MPI ${lang} compiler\"                        FORCE)\n    set(MPI_${lang}_COMPILE_FLAGS  \"\"                        CACHE STRING \"MPI ${lang} compilation flags\"               FORCE)\n    set(MPI_${lang}_INCLUDE_PATH   \"\"                        CACHE STRING \"MPI ${lang} include path\"                    FORCE)\n    set(MPI_${lang}_LINK_FLAGS     \"\"                        CACHE STRING \"MPI ${lang} linking flags\"                   FORCE)\n    set(MPI_${lang}_LIBRARIES      \"\"                        CACHE STRING \"MPI ${lang} libraries to link against\"       FORCE)\n  endif()\n  set(${success} ${compiler_has_mpi} PARENT_SCOPE)\n  unset(compiler_has_mpi CACHE)\nendfunction()\n\n# End definitions, commence real work here.\n\n# Most mpi distros have some form of mpiexec which gives us something we can reliably look for.\nfind_program(MPIEXEC\n  NAMES ${_MPI_EXEC_NAMES}\n  PATHS ${_MPI_PREFIX_PATH}\n  PATH_SUFFIXES bin\n  DOC \"Executable for running MPI programs.\")\n\n# call get_filename_component twice to remove mpiexec and the directory it exists in (typically bin).\n# This gives us a fairly reliable base directory to search for /bin /lib and /include from.\nget_filename_component(_MPI_BASE_DIR \"${MPIEXEC}\" PATH)\nget_filename_component(_MPI_BASE_DIR \"${_MPI_BASE_DIR}\" PATH)\n\nset(MPIEXEC_NUMPROC_FLAG \"-np\" CACHE STRING \"Flag used by MPI to specify the number of processes for MPIEXEC; the next option will be the number of processes.\")\nset(MPIEXEC_PREFLAGS     \"\"    CACHE STRING \"These flags will be directly before the executable that is being run by MPIEXEC.\")\nset(MPIEXEC_POSTFLAGS    \"\"    CACHE STRING \"These flags will come after all flags given to MPIEXEC.\")\nset(MPIEXEC_MAX_NUMPROCS \"2\"   CACHE STRING \"Maximum number of processors available to run MPI applications.\")\nmark_as_advanced(MPIEXEC MPIEXEC_NUMPROC_FLAG MPIEXEC_PREFLAGS MPIEXEC_POSTFLAGS MPIEXEC_MAX_NUMPROCS)\n\n\n#=============================================================================\n# Backward compatibility input hacks.  Propagate the FindMPI hints to C and\n# CXX if the respective new versions are not defined.  Translate the old\n# MPI_LIBRARY and MPI_EXTRA_LIBRARY to respective MPI_${lang}_LIBRARIES.\n#\n# Once we find the new variables, we translate them back into their old\n# equivalents below.\nforeach (lang C CXX)\n  # Old input variables.\n  set(_MPI_OLD_INPUT_VARS COMPILER COMPILE_FLAGS INCLUDE_PATH LINK_FLAGS)\n\n  # Set new vars based on their old equivalents, if the new versions are not already set.\n  foreach (var ${_MPI_OLD_INPUT_VARS})\n    if (NOT MPI_${lang}_${var} AND MPI_${var})\n      set(MPI_${lang}_${var} \"${MPI_${var}}\")\n    endif()\n  endforeach()\n\n  # Special handling for MPI_LIBRARY and MPI_EXTRA_LIBRARY, which we nixed in the\n  # new FindMPI.  These need to be merged into MPI_<lang>_LIBRARIES\n  if (NOT MPI_${lang}_LIBRARIES AND (MPI_LIBRARY OR MPI_EXTRA_LIBRARY))\n    set(MPI_${lang}_LIBRARIES ${MPI_LIBRARY} ${MPI_EXTRA_LIBRARY})\n  endif()\nendforeach()\n#=============================================================================\n\n\n# This loop finds the compilers and sends them off for interrogation.\nforeach (lang C CXX Fortran)\n  if (CMAKE_${lang}_COMPILER_WORKS)\n    # If the user supplies a compiler *name* instead of an absolute path, assume that we need to find THAT compiler.\n    if (MPI_${lang}_COMPILER)\n      is_file_executable(MPI_${lang}_COMPILER MPI_COMPILER_IS_EXECUTABLE)\n      if (NOT MPI_COMPILER_IS_EXECUTABLE)\n        # Get rid of our default list of names and just search for the name the user wants.\n        set(_MPI_${lang}_COMPILER_NAMES ${MPI_${lang}_COMPILER})\n        set(MPI_${lang}_COMPILER \"MPI_${lang}_COMPILER-NOTFOUND\" CACHE FILEPATH \"Cleared\" FORCE)\n        # If the user specifies a compiler, we don't want to try to search libraries either.\n        set(try_libs FALSE)\n      endif()\n    else()\n      set(try_libs TRUE)\n    endif()\n\n    find_program(MPI_${lang}_COMPILER\n      NAMES  ${_MPI_${lang}_COMPILER_NAMES}\n      PATHS  \"${MPI_HOME}/bin\" \"$ENV{MPI_HOME}/bin\" ${_MPI_PREFIX_PATH})\n    interrogate_mpi_compiler(${lang} ${try_libs})\n    mark_as_advanced(MPI_${lang}_COMPILER)\n\n    # last ditch try -- if nothing works so far, just try running the regular compiler and\n    # see if we can create an MPI executable.\n    set(regular_compiler_worked 0)\n    if (NOT MPI_${lang}_LIBRARIES OR NOT MPI_${lang}_INCLUDE_PATH)\n      try_regular_compiler(${lang} regular_compiler_worked)\n    endif()\n\n    if (regular_compiler_worked)\n      find_package_handle_standard_args(MPI_${lang} DEFAULT_MSG MPI_${lang}_COMPILER)\n    else()\n      find_package_handle_standard_args(MPI_${lang} DEFAULT_MSG MPI_${lang}_LIBRARIES MPI_${lang}_INCLUDE_PATH)\n    endif()\n  endif()\nendforeach()\n\n\n#=============================================================================\n# More backward compatibility stuff\n#\n# Bare MPI sans ${lang} vars are set to CXX then C, depending on what was found.\n# This mimics the behavior of the old language-oblivious FindMPI.\nset(_MPI_OLD_VARS FOUND COMPILER INCLUDE_PATH COMPILE_FLAGS LINK_FLAGS LIBRARIES)\nif (MPI_CXX_FOUND)\n  foreach (var ${_MPI_OLD_VARS})\n    set(MPI_${var} ${MPI_CXX_${var}})\n  endforeach()\nelseif (MPI_C_FOUND)\n  foreach (var ${_MPI_OLD_VARS})\n    set(MPI_${var} ${MPI_C_${var}})\n  endforeach()\nelse()\n  # Note that we might still have found Fortran, but you'll need to use MPI_Fortran_FOUND\n  set(MPI_FOUND FALSE)\nendif()\n\n# Chop MPI_LIBRARIES into the old-style MPI_LIBRARY and MPI_EXTRA_LIBRARY, and set them in cache.\nif (MPI_LIBRARIES)\n  list(GET MPI_LIBRARIES 0 MPI_LIBRARY_WORK)\n  set(MPI_LIBRARY ${MPI_LIBRARY_WORK} CACHE FILEPATH \"MPI library to link against\" FORCE)\nelse()\n  set(MPI_LIBRARY \"MPI_LIBRARY-NOTFOUND\" CACHE FILEPATH \"MPI library to link against\" FORCE)\nendif()\n\nlist(LENGTH MPI_LIBRARIES MPI_NUMLIBS)\nif (MPI_NUMLIBS GREATER 1)\n  set(MPI_EXTRA_LIBRARY_WORK ${MPI_LIBRARIES})\n  list(REMOVE_AT MPI_EXTRA_LIBRARY_WORK 0)\n  set(MPI_EXTRA_LIBRARY ${MPI_EXTRA_LIBRARY_WORK} CACHE STRING \"Extra MPI libraries to link against\" FORCE)\nelse()\n  set(MPI_EXTRA_LIBRARY \"MPI_EXTRA_LIBRARY-NOTFOUND\" CACHE STRING \"Extra MPI libraries to link against\" FORCE)\nendif()\n#=============================================================================\n\n# unset these vars to cleanup namespace\nunset(_MPI_OLD_VARS)\nunset(_MPI_PREFIX_PATH)\nunset(_MPI_BASE_DIR)\nforeach (lang C CXX Fortran)\n  unset(_MPI_${lang}_COMPILER_NAMES)\nendforeach()\n"
  },
  {
    "path": "libs/CoMISo/cmake/FindMUMPS.cmake",
    "content": "# - Try to find MUMPS\n# Once done this will define\n#  MUMPS_FOUND - System has Mumps\n#  MUMPS_INCLUDE_DIRS - The Mumps include directories\n#  MUMPS_LIBRARY_DIRS - The library directories needed to use Mumps\n#  MUMPS_LIBRARIES    - The libraries needed to use Mumps\n\nif (MUMPS_INCLUDE_DIR)\n  # in cache already\n  SET(MUMPS_FIND_QUIETLY TRUE)\nendif (MUMPS_INCLUDE_DIR)\n\nfind_path(MUMPS_INCLUDE_DIR NAMES dmumps_c.h\n     PATHS \"$ENV{IPOPT_HOME}/ThirdParty/Mumps/MUMPS/include/\"\n           \"/usr/include/\"\n           \n   )\n   \nfind_library( MUMPS_LIBRARY \n              dmumps coinmumps\n              PATHS \"$ENV{IPOPT_HOME}/lib/\"\n                    \"/usr/lib\" )\n\nset(MUMPS_INCLUDE_DIRS \"${MUMPS_INCLUDE_DIR}\" )\nset(MUMPS_LIBRARIES \"${MUMPS_LIBRARY}\" )\n\ninclude(FindPackageHandleStandardArgs)\n# handle the QUIETLY and REQUIRED arguments and set LIBCPLEX_FOUND to TRUE\n# if all listed variables are TRUE\nfind_package_handle_standard_args(MUMPS  DEFAULT_MSG\n                                  MUMPS_LIBRARY MUMPS_INCLUDE_DIR)\n\nmark_as_advanced(MUMPS_INCLUDE_DIR MUMPS_LIBRARY )"
  },
  {
    "path": "libs/CoMISo/cmake/FindPETSC.cmake",
    "content": "if (PETSC_INCLUDE_DIRS)\n  # Already in cache, be silent\n  SET(PETSC_FIND_QUIETLY TRUE)\nendif(PETSC_INCLUDE_DIRS)\n\nif (WIN32)\n   find_path(PETSC_INCLUDE_DIR NAMES petsc.h\n     PREFIXES SRC\n     PATHS\n     \"C:\\\\libs\\\\gurobi45\"\n     ${PETSC_DIR}/include\n   )\n\n   find_library( PETSC_LIBRARY_RELEASE \n                 SuperLU\n                 PATHS \"C:\\\\libs\\\\gurobi45\\\\lib\" )\n   find_library( PETSC_LIBRARY_DEBUG\n                   SuperLUd\n                   PATHS \"C:\\\\libs\\\\gurobi45\\\\lib\" )\n\n\n   set ( PETSC_LIBRARY \"optimized;${PETSC_LIBRARY_RELEASE};debug;${PETSC_LIBRARY_DEBUG}\" CACHE  STRING \"PETSC Libraries\" )\n\nELSEIF(APPLE)\n\n   find_path(PETSC_INCLUDE_DIR NAMES gurobi_c++.h\n\t     PATHS \"${CMAKE_SOURCE_DIR}/MacOS/Libs/gurobi40\"\n\t     \t   ${PETSC_INCLUDE_PATH}\n            )\n\n   find_library( PETSC_LIBRARY \n                 SuperLU\n                 PATHS \"${CMAKE_SOURCE_DIR}/MacOS/Libs/gurobi40\")\n\nELSE( WIN32 )\n   find_path(PETSC_INCLUDE_DIR1 NAMES petsc.h\n     PATHS \"$ENV{PETSC_DIR}/include\"\n     ${PETSC_INCLUDE_DIR1}\n   )\n\n   find_path(PETSC_INCLUDE_DIR2 NAMES petscconf.h\n     PATHS \"$ENV{PETSC_DIR}/$ENV{PETSC_ARCH}/include\"\n     ${PETSC_INCLUDE_DIR2}\n   )\n\n#   MESSAGE(STATUS \"$ENV{PETSC_HOME}/include\")\n   IF(PETSC_INCLUDE_DIR1 AND PETSC_INCLUDE_DIR2)\n      SET(PETSC_FOUND TRUE)\n      SET(PETSC_INCLUDE_DIRS \"${PETSC_INCLUDE_DIR1};${PETSC_INCLUDE_DIR2}\")\n      SET(PETSC_LIBRARY_DIR \"$ENV{PETSC_DIR}/$ENV{PETSC_ARCH}/lib\" CACHE PATH \"Path to PETSC Library\")\n      SET(PETSC_LIBRARY \"petsc\" CACHE STRING \"PETSC Libraries\")  \n    ELSE(PETSC_INCLUDE_DIR1 AND PETSC_INCLUDE_DIR2)\n      SET(PETSC_FOUND FALSE)\n      SET(PETSC_INCLUDE_DIR ${PETSC_INCLUDE_DIR})\n    ENDIF(PETSC_INCLUDE_DIR1 AND PETSC_INCLUDE_DIR2)\n\n   #find_library( PETSC_LIBRARY \n    #             gurobi\n     #            PATHS \"${PETSC_HOME}/lib\" )\nENDIF()"
  },
  {
    "path": "libs/CoMISo/cmake/FindPackageHandleStandardArgs.cmake",
    "content": "# FIND_PACKAGE_HANDLE_STANDARD_ARGS(<name> ... )\n#\n# This function is intended to be used in FindXXX.cmake modules files.\n# It handles the REQUIRED, QUIET and version-related arguments to FIND_PACKAGE().\n# It also sets the <UPPERCASED_NAME>_FOUND variable.\n# The package is considered found if all variables <var1>... listed contain\n# valid results, e.g. valid filepaths.\n#\n# There are two modes of this function. The first argument in both modes is\n# the name of the Find-module where it is called (in original casing).\n#\n# The first simple mode looks like this:\n#    FIND_PACKAGE_HANDLE_STANDARD_ARGS(<name> (DEFAULT_MSG|\"Custom failure message\") <var1>...<varN> )\n# If the variables <var1> to <varN> are all valid, then <UPPERCASED_NAME>_FOUND\n# will be set to TRUE.\n# If DEFAULT_MSG is given as second argument, then the function will generate\n# itself useful success and error messages. You can also supply a custom error message\n# for the failure case. This is not recommended.\n#\n# The second mode is more powerful and also supports version checking:\n#    FIND_PACKAGE_HANDLE_STANDARD_ARGS(NAME [REQUIRED_VARS <var1>...<varN>]\n#                                           [VERSION_VAR   <versionvar>\n#                                           [CONFIG_MODE]\n#                                           [FAIL_MESSAGE \"Custom failure message\"] )\n#\n# As above, if <var1> through <varN> are all valid, <UPPERCASED_NAME>_FOUND\n# will be set to TRUE.\n# After REQUIRED_VARS the variables which are required for this package are listed.\n# Following VERSION_VAR the name of the variable can be specified which holds\n# the version of the package which has been found. If this is done, this version\n# will be checked against the (potentially) specified required version used\n# in the find_package() call. The EXACT keyword is also handled. The default\n# messages include information about the required version and the version\n# which has been actually found, both if the version is ok or not.\n# Use the option CONFIG_MODE if your FindXXX.cmake module is a wrapper for\n# a find_package(... NO_MODULE) call, in this case all the information\n# provided by the config-mode of find_package() will be evaluated\n# automatically.\n# Via FAIL_MESSAGE a custom failure message can be specified, if this is not\n# used, the default message will be displayed.\n#\n# Example for mode 1:\n#\n#    FIND_PACKAGE_HANDLE_STANDARD_ARGS(LibXml2  DEFAULT_MSG  LIBXML2_LIBRARY LIBXML2_INCLUDE_DIR)\n#\n# LibXml2 is considered to be found, if both LIBXML2_LIBRARY and\n# LIBXML2_INCLUDE_DIR are valid. Then also LIBXML2_FOUND is set to TRUE.\n# If it is not found and REQUIRED was used, it fails with FATAL_ERROR,\n# independent whether QUIET was used or not.\n# If it is found, success will be reported, including the content of <var1>.\n# On repeated Cmake runs, the same message won't be printed again.\n#\n# Example for mode 2:\n#\n#    FIND_PACKAGE_HANDLE_STANDARD_ARGS(BISON  REQUIRED_VARS BISON_EXECUTABLE\n#                                             VERSION_VAR BISON_VERSION)\n# In this case, BISON is considered to be found if the variable(s) listed\n# after REQUIRED_VAR are all valid, i.e. BISON_EXECUTABLE in this case.\n# Also the version of BISON will be checked by using the version contained\n# in BISON_VERSION.\n# Since no FAIL_MESSAGE is given, the default messages will be printed.\n#\n# Another example for mode 2:\n#\n#    FIND_PACKAGE(Automoc4 QUIET NO_MODULE HINTS /opt/automoc4)\n#    FIND_PACKAGE_HANDLE_STANDARD_ARGS(Automoc4  CONFIG_MODE)\n# In this case, FindAutmoc4.cmake wraps a call to FIND_PACKAGE(Automoc4 NO_MODULE)\n# and adds an additional search directory for automoc4.\n# The following FIND_PACKAGE_HANDLE_STANDARD_ARGS() call produces a proper\n# success/error message.\n\n#=============================================================================\n# Copyright 2007-2009 Kitware, Inc.\n#\n# Distributed under the OSI-approved BSD License (the \"License\");\n# see accompanying file Copyright.txt for details.\n#\n# This software is distributed WITHOUT ANY WARRANTY; without even the\n# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See the License for more information.\n#=============================================================================\n# (To distribute this file outside of CMake, substitute the full\n#  License text for the above reference.)\n\nINCLUDE(FindPackageMessage)\nINCLUDE(CMakeParseArguments)\n\n# internal helper macro\nMACRO(_FPHSA_FAILURE_MESSAGE _msg)\n  IF (${_NAME}_FIND_REQUIRED)\n    MESSAGE(FATAL_ERROR \"${_msg}\")\n  ELSE (${_NAME}_FIND_REQUIRED)\n    IF (NOT ${_NAME}_FIND_QUIETLY)\n      MESSAGE(STATUS \"${_msg}\")\n    ENDIF (NOT ${_NAME}_FIND_QUIETLY)\n  ENDIF (${_NAME}_FIND_REQUIRED)\nENDMACRO(_FPHSA_FAILURE_MESSAGE _msg)\n\n\n# internal helper macro to generate the failure message when used in CONFIG_MODE:\nMACRO(_FPHSA_HANDLE_FAILURE_CONFIG_MODE)\n  # <name>_CONFIG is set, but FOUND is false, this means that some other of the REQUIRED_VARS was not found:\n  IF(${_NAME}_CONFIG)\n    _FPHSA_FAILURE_MESSAGE(\"${FPHSA_FAIL_MESSAGE}: missing: ${MISSING_VARS} (found ${${_NAME}_CONFIG} ${VERSION_MSG})\")\n  ELSE(${_NAME}_CONFIG)\n    # If _CONSIDERED_CONFIGS is set, the config-file has been found, but no suitable version.\n    # List them all in the error message:\n    IF(${_NAME}_CONSIDERED_CONFIGS)\n      SET(configsText \"\")\n      LIST(LENGTH ${_NAME}_CONSIDERED_CONFIGS configsCount)\n      MATH(EXPR configsCount \"${configsCount} - 1\")\n      FOREACH(currentConfigIndex RANGE ${configsCount})\n        LIST(GET ${_NAME}_CONSIDERED_CONFIGS ${currentConfigIndex} filename)\n        LIST(GET ${_NAME}_CONSIDERED_VERSIONS ${currentConfigIndex} version)\n        SET(configsText \"${configsText}    ${filename} (version ${version})\\n\")\n      ENDFOREACH(currentConfigIndex)\n      _FPHSA_FAILURE_MESSAGE(\"${FPHSA_FAIL_MESSAGE} ${VERSION_MSG}, checked the following files:\\n${configsText}\")\n\n    ELSE(${_NAME}_CONSIDERED_CONFIGS)\n      # Simple case: No Config-file was found at all:\n      _FPHSA_FAILURE_MESSAGE(\"${FPHSA_FAIL_MESSAGE}: found neither ${_NAME}Config.cmake nor ${_NAME_LOWER}-config.cmake ${VERSION_MSG}\")\n    ENDIF(${_NAME}_CONSIDERED_CONFIGS)\n  ENDIF(${_NAME}_CONFIG)\nENDMACRO(_FPHSA_HANDLE_FAILURE_CONFIG_MODE)\n\n\nFUNCTION(FIND_PACKAGE_HANDLE_STANDARD_ARGS _NAME _FIRST_ARG)\n\n# set up the arguments for CMAKE_PARSE_ARGUMENTS and check whether we are in\n# new extended or in the \"old\" mode:\n  SET(options CONFIG_MODE)\n  SET(oneValueArgs FAIL_MESSAGE VERSION_VAR)\n  SET(multiValueArgs REQUIRED_VARS)\n  SET(_KEYWORDS_FOR_EXTENDED_MODE  ${options} ${oneValueArgs} ${multiValueArgs} )\n  LIST(FIND _KEYWORDS_FOR_EXTENDED_MODE \"${_FIRST_ARG}\" INDEX)\n\n  IF(${INDEX} EQUAL -1)\n    SET(FPHSA_FAIL_MESSAGE ${_FIRST_ARG})\n    SET(FPHSA_REQUIRED_VARS ${ARGN})\n    SET(FPHSA_VERSION_VAR)\n  ELSE(${INDEX} EQUAL -1)\n\n    CMAKE_PARSE_ARGUMENTS(FPHSA \"${options}\" \"${oneValueArgs}\" \"${multiValueArgs}\"  ${_FIRST_ARG} ${ARGN})\n\n    IF(FPHSA_UNPARSED_ARGUMENTS)\n      MESSAGE(FATAL_ERROR \"Unknown keywords given to FIND_PACKAGE_HANDLE_STANDARD_ARGS(): \\\"${FPHSA_UNPARSED_ARGUMENTS}\\\"\")\n    ENDIF(FPHSA_UNPARSED_ARGUMENTS)\n\n    IF(NOT FPHSA_FAIL_MESSAGE)\n      SET(FPHSA_FAIL_MESSAGE  \"DEFAULT_MSG\")\n    ENDIF(NOT FPHSA_FAIL_MESSAGE)\n  ENDIF(${INDEX} EQUAL -1)\n\n# now that we collected all arguments, process them\n\n  IF(\"${FPHSA_FAIL_MESSAGE}\" STREQUAL \"DEFAULT_MSG\")\n    SET(FPHSA_FAIL_MESSAGE \"Could NOT find ${_NAME}\")\n  ENDIF(\"${FPHSA_FAIL_MESSAGE}\" STREQUAL \"DEFAULT_MSG\")\n\n  # In config-mode, we rely on the variable <package>_CONFIG, which is set by find_package()\n  # when it successfully found the config-file, including version checking:\n  IF(FPHSA_CONFIG_MODE)\n    LIST(INSERT FPHSA_REQUIRED_VARS 0 ${_NAME}_CONFIG)\n    LIST(REMOVE_DUPLICATES FPHSA_REQUIRED_VARS)\n    SET(FPHSA_VERSION_VAR ${_NAME}_VERSION)\n  ENDIF(FPHSA_CONFIG_MODE)\n\n  IF(NOT FPHSA_REQUIRED_VARS)\n    MESSAGE(FATAL_ERROR \"No REQUIRED_VARS specified for FIND_PACKAGE_HANDLE_STANDARD_ARGS()\")\n  ENDIF(NOT FPHSA_REQUIRED_VARS)\n\n  LIST(GET FPHSA_REQUIRED_VARS 0 _FIRST_REQUIRED_VAR)\n\n  STRING(TOUPPER ${_NAME} _NAME_UPPER)\n  STRING(TOLOWER ${_NAME} _NAME_LOWER)\n\n  # collect all variables which were not found, so they can be printed, so the\n  # user knows better what went wrong (#6375)\n  SET(MISSING_VARS \"\")\n  SET(DETAILS \"\")\n  SET(${_NAME_UPPER}_FOUND TRUE)\n  # check if all passed variables are valid\n  FOREACH(_CURRENT_VAR ${FPHSA_REQUIRED_VARS})\n    IF(NOT ${_CURRENT_VAR})\n      SET(${_NAME_UPPER}_FOUND FALSE)\n      SET(MISSING_VARS \"${MISSING_VARS} ${_CURRENT_VAR}\")\n    ELSE(NOT ${_CURRENT_VAR})\n      SET(DETAILS \"${DETAILS}[${${_CURRENT_VAR}}]\")\n    ENDIF(NOT ${_CURRENT_VAR})\n  ENDFOREACH(_CURRENT_VAR)\n\n\n  # version handling:\n  SET(VERSION_MSG \"\")\n  SET(VERSION_OK TRUE)\n  SET(VERSION ${${FPHSA_VERSION_VAR}} )\n  IF (${_NAME}_FIND_VERSION)\n\n    IF(VERSION)\n\n      IF(${_NAME}_FIND_VERSION_EXACT)       # exact version required\n        IF (NOT \"${${_NAME}_FIND_VERSION}\" VERSION_EQUAL \"${VERSION}\")\n          SET(VERSION_MSG \"Found unsuitable version \\\"${VERSION}\\\", but required is exact version \\\"${${_NAME}_FIND_VERSION}\\\"\")\n          SET(VERSION_OK FALSE)\n        ELSE (NOT \"${${_NAME}_FIND_VERSION}\" VERSION_EQUAL \"${VERSION}\")\n          SET(VERSION_MSG \"(found suitable exact version \\\"${VERSION}\\\")\")\n        ENDIF (NOT \"${${_NAME}_FIND_VERSION}\" VERSION_EQUAL \"${VERSION}\")\n\n      ELSE(${_NAME}_FIND_VERSION_EXACT)     # minimum version specified:\n        IF (\"${${_NAME}_FIND_VERSION}\" VERSION_GREATER \"${VERSION}\")\n          SET(VERSION_MSG \"Found unsuitable version \\\"${VERSION}\\\", but required is at least \\\"${${_NAME}_FIND_VERSION}\\\"\")\n          SET(VERSION_OK FALSE)\n        ELSE (\"${${_NAME}_FIND_VERSION}\" VERSION_GREATER \"${VERSION}\")\n          SET(VERSION_MSG \"(found suitable version \\\"${VERSION}\\\", required is \\\"${${_NAME}_FIND_VERSION}\\\")\")\n        ENDIF (\"${${_NAME}_FIND_VERSION}\" VERSION_GREATER \"${VERSION}\")\n      ENDIF(${_NAME}_FIND_VERSION_EXACT)\n\n    ELSE(VERSION)\n\n      # if the package was not found, but a version was given, add that to the output:\n      IF(${_NAME}_FIND_VERSION_EXACT)\n         SET(VERSION_MSG \"(Required is exact version \\\"${${_NAME}_FIND_VERSION}\\\")\")\n      ELSE(${_NAME}_FIND_VERSION_EXACT)\n         SET(VERSION_MSG \"(Required is at least version \\\"${${_NAME}_FIND_VERSION}\\\")\")\n      ENDIF(${_NAME}_FIND_VERSION_EXACT)\n\n    ENDIF(VERSION)\n  ELSE (${_NAME}_FIND_VERSION)\n    IF(VERSION)\n      SET(VERSION_MSG \"(found version \\\"${VERSION}\\\")\")\n    ENDIF(VERSION)\n  ENDIF (${_NAME}_FIND_VERSION)\n\n  IF(VERSION_OK)\n    SET(DETAILS \"${DETAILS}[v${VERSION}(${${_NAME}_FIND_VERSION})]\")\n  ELSE(VERSION_OK)\n    SET(${_NAME_UPPER}_FOUND FALSE)\n  ENDIF(VERSION_OK)\n\n\n  # print the result:\n  IF (${_NAME_UPPER}_FOUND)\n    FIND_PACKAGE_MESSAGE(${_NAME} \"Found ${_NAME}: ${${_FIRST_REQUIRED_VAR}} ${VERSION_MSG}\" \"${DETAILS}\")\n  ELSE (${_NAME_UPPER}_FOUND)\n\n    IF(FPHSA_CONFIG_MODE)\n      _FPHSA_HANDLE_FAILURE_CONFIG_MODE()\n    ELSE(FPHSA_CONFIG_MODE)\n      IF(NOT VERSION_OK)\n        _FPHSA_FAILURE_MESSAGE(\"${FPHSA_FAIL_MESSAGE}: ${VERSION_MSG} (found ${${_FIRST_REQUIRED_VAR}})\")\n      ELSE(NOT VERSION_OK)\n        _FPHSA_FAILURE_MESSAGE(\"${FPHSA_FAIL_MESSAGE} (missing: ${MISSING_VARS}) ${VERSION_MSG}\")\n      ENDIF(NOT VERSION_OK)\n    ENDIF(FPHSA_CONFIG_MODE)\n\n  ENDIF (${_NAME_UPPER}_FOUND)\n\n  SET(${_NAME_UPPER}_FOUND ${${_NAME_UPPER}_FOUND} PARENT_SCOPE)\n\nENDFUNCTION(FIND_PACKAGE_HANDLE_STANDARD_ARGS _FIRST_ARG)\n"
  },
  {
    "path": "libs/CoMISo/cmake/FindPackageMultipass.cmake",
    "content": "# PackageMultipass - this module defines two macros\n#\n# FIND_PACKAGE_MULTIPASS (Name CURRENT\n#  STATES VAR0 VAR1 ...\n#  DEPENDENTS DEP0 DEP1 ...)\n#\n#  This function creates a cache entry <UPPERCASED-Name>_CURRENT which\n#  the user can set to \"NO\" to trigger a reconfiguration of the package.\n#  The first time this function is called, the values of\n#  <UPPERCASED-Name>_VAR0, ... are saved.  If <UPPERCASED-Name>_CURRENT\n#  is false or if any STATE has changed since the last time\n#  FIND_PACKAGE_MULTIPASS() was called, then CURRENT will be set to \"NO\",\n#  otherwise CURRENT will be \"YES\".  IF not CURRENT, then\n#  <UPPERCASED-Name>_DEP0, ... will be FORCED to NOTFOUND.\n#  Example:\n#    find_path (FOO_DIR include/foo.h)\n#    FIND_PACKAGE_MULTIPASS (Foo foo_current\n#      STATES DIR\n#      DEPENDENTS INCLUDES LIBRARIES)\n#    if (NOT foo_current)\n#      # Make temporary files, run programs, etc, to determine FOO_INCLUDES and FOO_LIBRARIES\n#    endif (NOT foo_current)\n#\n# MULTIPASS_C_SOURCE_RUNS (Name INCLUDES LIBRARIES SOURCE RUNS)\n#  Always runs the given test, use this when you need to re-run tests\n#  because parent variables have made old cache entries stale.\n\nmacro (FIND_PACKAGE_MULTIPASS _name _current)\n  string (TOUPPER ${_name} _NAME)\n  set (_args ${ARGV})\n  list (REMOVE_AT _args 0 1)\n\n  set (_states_current \"YES\")\n  list (GET _args 0 _cmd)\n  if (_cmd STREQUAL \"STATES\")\n    list (REMOVE_AT _args 0)\n    list (GET _args 0 _state)\n    while (_state AND NOT _state STREQUAL \"DEPENDENTS\")\n      # The name of the stored value for the given state\n      set (_stored_var PACKAGE_MULTIPASS_${_NAME}_${_state})\n      if (NOT \"${${_stored_var}}\" STREQUAL \"${${_NAME}_${_state}}\")\n\tset (_states_current \"NO\")\n      endif (NOT \"${${_stored_var}}\" STREQUAL \"${${_NAME}_${_state}}\")\n      set (${_stored_var} \"${${_NAME}_${_state}}\" CACHE INTERNAL \"Stored state for ${_name}.\" FORCE)\n      list (REMOVE_AT _args 0)\n      list (GET _args 0 _state)\n    endwhile (_state AND NOT _state STREQUAL \"DEPENDENTS\")\n  endif (_cmd STREQUAL \"STATES\")\n\n  set (_stored ${_NAME}_CURRENT)\n  if (NOT ${_stored})\n    set (${_stored} \"YES\" CACHE BOOL \"Is the configuration for ${_name} current?  Set to \\\"NO\\\" to reconfigure.\" FORCE)\n    set (_states_current \"NO\")\n  endif (NOT ${_stored})\n\n  set (${_current} ${_states_current})\n  if (NOT ${_current})\n    message (STATUS \"Clearing ${_name} dependent variables\")\n    # Clear all the dependent variables so that the module can reset them\n    list (GET _args 0 _cmd)\n    if (_cmd STREQUAL \"DEPENDENTS\")\n      list (REMOVE_AT _args 0)\n      foreach (dep ${_args})\n\tset (${_NAME}_${dep} \"NOTFOUND\" CACHE INTERNAL \"Cleared\" FORCE)\n      endforeach (dep)\n    endif (_cmd STREQUAL \"DEPENDENTS\")\n    set (${_NAME}_FOUND \"NOTFOUND\" CACHE INTERNAL \"Cleared\" FORCE)\n  endif (NOT ${_current})\nendmacro (FIND_PACKAGE_MULTIPASS)\n\n\nmacro (MULTIPASS_C_SOURCE_RUNS name includes libraries source runs)\n  include (CheckCSourceRuns)\n  string (TOUPPER ${name} _NAME)\n  # This is a ridiculous hack.  CHECK_C_SOURCE_* thinks that if the\n  # *name* of the return variable doesn't change, then the test does\n  # not need to be re-run.  We keep an internal count which we\n  # increment to guarantee that every test name is unique.  If we've\n  # gotten here, then the configuration has changed enough that the\n  # test *needs* to be rerun.\n  if (NOT MULTIPASS_TEST_COUNT)\n    set (MULTIPASS_TEST_COUNT 00)\n  endif (NOT MULTIPASS_TEST_COUNT)\n  math (EXPR _tmp \"${MULTIPASS_TEST_COUNT} + 1\") # Why can't I add to a cache variable?\n  set (MULTIPASS_TEST_COUNT ${_tmp} CACHE INTERNAL \"Unique test ID\")\n  set (testname MULTIPASS_TEST_${MULTIPASS_TEST_COUNT}_${runs})\n  set (CMAKE_REQUIRED_INCLUDES ${includes})\n  set (CMAKE_REQUIRED_LIBRARIES ${libraries})\n  check_c_source_runs (\"${source}\" ${testname})\n  set (${runs} \"${${testname}}\")\nendmacro (MULTIPASS_C_SOURCE_RUNS)\n"
  },
  {
    "path": "libs/CoMISo/cmake/FindQt4.cmake",
    "content": "# - Find QT 4\n# This module can be used to find Qt4.\n# The most important issue is that the Qt4 qmake is available via the system path.\n# This qmake is then used to detect basically everything else.\n# This module defines a number of key variables and macros. \n# First is QT_USE_FILE which is the path to a CMake file that can be included \n# to compile Qt 4 applications and libraries.  By default, the QtCore and QtGui \n# libraries are loaded. This behavior can be changed by setting one or more \n# of the following variables to true before doing INCLUDE(${QT_USE_FILE}):\n#                    QT_DONT_USE_QTCORE\n#                    QT_DONT_USE_QTGUI\n#                    QT_USE_QT3SUPPORT\n#                    QT_USE_QTASSISTANT\n#                    QT_USE_QTDESIGNER\n#                    QT_USE_QTMOTIF\n#                    QT_USE_QTMAIN\n#                    QT_USE_QTNETWORK\n#                    QT_USE_QTNSPLUGIN\n#                    QT_USE_QTOPENGL\n#                    QT_USE_QTSQL\n#                    QT_USE_QTXML\n#                    QT_USE_QTSVG\n#                    QT_USE_QTTEST\n#                    QT_USE_QTUITOOLS\n#                    QT_USE_QTDBUS\n#                    QT_USE_QTSCRIPT\n#                    QT_USE_QTASSISTANTCLIENT\n#                    QT_USE_QTHELP\n#                    QT_USE_QTWEBKIT\n#                    QT_USE_QTXMLPATTERNS\n#                    QT_USE_PHONON\n#\n# The file pointed to by QT_USE_FILE will set up your compile environment\n# by adding include directories, preprocessor defines, and populate a\n# QT_LIBRARIES variable containing all the Qt libraries and their dependencies.\n# Add the QT_LIBRARIES variable to your TARGET_LINK_LIBRARIES.\n#\n# Typical usage could be something like:\n#   FIND_PACKAGE(Qt4)\n#   SET(QT_USE_QTXML 1)\n#   INCLUDE(${QT_USE_FILE})\n#   ADD_EXECUTABLE(myexe main.cpp)\n#   TARGET_LINK_LIBRARIES(myexe ${QT_LIBRARIES})\n#\n#\n# There are also some files that need processing by some Qt tools such as moc\n# and uic.  Listed below are macros that may be used to process those files.\n#  \n#  macro QT4_WRAP_CPP(outfiles inputfile ... OPTIONS ...)\n#        create moc code from a list of files containing Qt class with\n#        the Q_OBJECT declaration.  Per-direcotry preprocessor definitions \n#        are also added.  Options may be given to moc, such as those found\n#        when executing \"moc -help\".  \n#\n#  macro QT4_WRAP_UI(outfiles inputfile ... OPTIONS ...)\n#        create code from a list of Qt designer ui files.\n#        Options may be given to uic, such as those found\n#        when executing \"uic -help\"\n#\n#  macro QT4_ADD_RESOURCES(outfiles inputfile ... OPTIONS ...)\n#        create code from a list of Qt resource files.\n#        Options may be given to rcc, such as those found\n#        when executing \"rcc -help\"\n#\n#  macro QT4_GENERATE_MOC(inputfile outputfile )\n#        creates a rule to run moc on infile and create outfile.\n#        Use this if for some reason QT4_WRAP_CPP() isn't appropriate, e.g.\n#        because you need a custom filename for the moc file or something similar.\n#\n#  macro QT4_AUTOMOC(sourcefile1 sourcefile2 ... )\n#        This macro is still experimental.\n#        It can be used to have moc automatically handled.\n#        So if you have the files foo.h and foo.cpp, and in foo.h a \n#        a class uses the Q_OBJECT macro, moc has to run on it. If you don't\n#        want to use QT4_WRAP_CPP() (which is reliable and mature), you can insert\n#        #include \"foo.moc\"\n#        in foo.cpp and then give foo.cpp as argument to QT4_AUTOMOC(). This will the\n#        scan all listed files at cmake-time for such included moc files and if it finds\n#        them cause a rule to be generated to run moc at build time on the \n#        accompanying header file foo.h.\n#        If a source file has the SKIP_AUTOMOC property set it will be ignored by this macro.\n#\n#  macro QT4_ADD_DBUS_INTERFACE(outfiles interface basename)\n#        create a the interface header and implementation files with the \n#        given basename from the given interface xml file and add it to \n#        the list of sources\n#\n#  macro QT4_ADD_DBUS_INTERFACES(outfiles inputfile ... )\n#        create the interface header and implementation files \n#        for all listed interface xml files\n#        the name will be automatically determined from the name of the xml file\n#\n#  macro QT4_ADD_DBUS_ADAPTOR(outfiles xmlfile parentheader parentclassname [basename] )\n#        create a dbus adaptor (header and implementation file) from the xml file\n#        describing the interface, and add it to the list of sources. The adaptor\n#        forwards the calls to a parent class, defined in parentheader and named\n#        parentclassname. The name of the generated files will be\n#        <basename>adaptor.{cpp,h} where basename is the basename of the xml file.\n#\n#  macro QT4_GENERATE_DBUS_INTERFACE( header [interfacename] )\n#        generate the xml interface file from the given header.\n#        If the optional argument interfacename is omitted, the name of the \n#        interface file is constructed from the basename of the header with\n#        the suffix .xml appended.\n#\n#  macro QT4_CREATE_TRANSLATION( qm_files directories ... sources ... \n#                                ts_files ... OPTIONS ...)\n#        out: qm_files\n#        in:  directories sources ts_files\n#        options: flags to pass to lupdate, such as -extensions to specify\n#        extensions for a directory scan.\n#        generates commands to create .ts (vie lupdate) and .qm\n#        (via lrelease) - files from directories and/or sources. The ts files are \n#        created and/or updated in the source tree (unless given with full paths).\n#        The qm files are generated in the build tree.\n#        Updating the translations can be done by adding the qm_files\n#        to the source list of your library/executable, so they are\n#        always updated, or by adding a custom target to control when\n#        they get updated/generated.\n#\n#  macro QT4_ADD_TRANSLATION( qm_files ts_files ... )\n#        out: qm_files\n#        in:  ts_files\n#        generates commands to create .qm from .ts - files. The generated\n#        filenames can be found in qm_files. The ts_files\n#        must exists and are not updated in any way.\n#\n#\n#  QT_FOUND         If false, don't try to use Qt.\n#  QT4_FOUND        If false, don't try to use Qt 4.\n#\n#  QT_VERSION_MAJOR The major version of Qt found.\n#  QT_VERSION_MINOR The minor version of Qt found.\n#  QT_VERSION_PATCH The patch version of Qt found.\n#\n#  QT_EDITION               Set to the edition of Qt (i.e. DesktopLight)\n#  QT_EDITION_DESKTOPLIGHT  True if QT_EDITION == DesktopLight\n#  QT_QTCORE_FOUND          True if QtCore was found.\n#  QT_QTGUI_FOUND           True if QtGui was found.\n#  QT_QT3SUPPORT_FOUND      True if Qt3Support was found.\n#  QT_QTASSISTANT_FOUND     True if QtAssistant was found.\n#  QT_QTDBUS_FOUND          True if QtDBus was found.\n#  QT_QTDESIGNER_FOUND      True if QtDesigner was found.\n#  QT_QTDESIGNERCOMPONENTS  True if QtDesignerComponents was found.\n#  QT_QTMOTIF_FOUND         True if QtMotif was found.\n#  QT_QTNETWORK_FOUND       True if QtNetwork was found.\n#  QT_QTNSPLUGIN_FOUND      True if QtNsPlugin was found.\n#  QT_QTOPENGL_FOUND        True if QtOpenGL was found.\n#  QT_QTSQL_FOUND           True if QtSql was found.\n#  QT_QTXML_FOUND           True if QtXml was found.\n#  QT_QTSVG_FOUND           True if QtSvg was found.\n#  QT_QTSCRIPT_FOUND        True if QtScript was found.\n#  QT_QTTEST_FOUND          True if QtTest was found.\n#  QT_QTUITOOLS_FOUND       True if QtUiTools was found.\n#  QT_QTASSISTANTCLIENT_FOUND  True if QtAssistantClient was found.\n#  QT_QTHELP_FOUND          True if QtHelp was found.\n#  QT_QTWEBKIT_FOUND        True if QtWebKit was found.\n#  QT_QTXMLPATTERNS_FOUND   True if QtXmlPatterns was found.\n#  QT_PHONON_FOUND          True if phonon was found.\n#\n#\n#  QT_DEFINITIONS   Definitions to use when compiling code that uses Qt.\n#                   You do not need to use this if you include QT_USE_FILE.\n#                   The QT_USE_FILE will also define QT_DEBUG and QT_NO_DEBUG\n#                   to fit your current build type.  Those are not contained\n#                   in QT_DEFINITIONS.\n#                  \n#  QT_INCLUDES      List of paths to all include directories of \n#                   Qt4 QT_INCLUDE_DIR and QT_QTCORE_INCLUDE_DIR are\n#                   always in this variable even if NOTFOUND,\n#                   all other INCLUDE_DIRS are\n#                   only added if they are found.\n#                   You do not need to use this if you include QT_USE_FILE.\n#   \n#\n#  Include directories for the Qt modules are listed here.\n#  You do not need to use these variables if you include QT_USE_FILE.\n#\n#  QT_INCLUDE_DIR              Path to \"include\" of Qt4\n#  QT_QT_INCLUDE_DIR           Path to \"include/Qt\" \n#  QT_QT3SUPPORT_INCLUDE_DIR   Path to \"include/Qt3Support\" \n#  QT_QTASSISTANT_INCLUDE_DIR  Path to \"include/QtAssistant\" \n#  QT_QTCORE_INCLUDE_DIR       Path to \"include/QtCore\"         \n#  QT_QTDESIGNER_INCLUDE_DIR   Path to \"include/QtDesigner\" \n#  QT_QTDESIGNERCOMPONENTS_INCLUDE_DIR   Path to \"include/QtDesigner\"\n#  QT_QTDBUS_INCLUDE_DIR       Path to \"include/QtDBus\" \n#  QT_QTGUI_INCLUDE_DIR        Path to \"include/QtGui\" \n#  QT_QTMOTIF_INCLUDE_DIR      Path to \"include/QtMotif\" \n#  QT_QTNETWORK_INCLUDE_DIR    Path to \"include/QtNetwork\" \n#  QT_QTNSPLUGIN_INCLUDE_DIR   Path to \"include/QtNsPlugin\" \n#  QT_QTOPENGL_INCLUDE_DIR     Path to \"include/QtOpenGL\" \n#  QT_QTSQL_INCLUDE_DIR        Path to \"include/QtSql\" \n#  QT_QTXML_INCLUDE_DIR        Path to \"include/QtXml\" \n#  QT_QTSVG_INCLUDE_DIR        Path to \"include/QtSvg\"\n#  QT_QTSCRIPT_INCLUDE_DIR     Path to \"include/QtScript\"\n#  QT_QTTEST_INCLUDE_DIR       Path to \"include/QtTest\"\n#  QT_QTASSISTANTCLIENT_INCLUDE_DIR       Path to \"include/QtAssistant\"\n#  QT_QTHELP_INCLUDE_DIR       Path to \"include/QtHelp\"\n#  QT_QTWEBKIT_INCLUDE_DIR     Path to \"include/QtWebKit\"\n#  QT_QTXMLPATTERNS_INCLUDE_DIR  Path to \"include/QtXmlPatterns\"\n#  QT_PHONON_INCLUDE_DIR       Path to \"include/phonon\"\n#                            \n#  QT_LIBRARY_DIR              Path to \"lib\" of Qt4\n# \n#  QT_PLUGINS_DIR              Path to \"plugins\" for Qt4\n#                            \n#\n# The Qt toolkit may contain both debug and release libraries.\n# In that case, the following library variables will contain both.\n# You do not need to use these variables if you include QT_USE_FILE,\n# and use QT_LIBRARIES.\n#\n#  QT_QT3SUPPORT_LIBRARY            The Qt3Support library\n#  QT_QTASSISTANT_LIBRARY           The QtAssistant library\n#  QT_QTCORE_LIBRARY                The QtCore library\n#  QT_QTDBUS_LIBRARY                The QtDBus library\n#  QT_QTDESIGNER_LIBRARY            The QtDesigner library\n#  QT_QTDESIGNERCOMPONENTS_LIBRARY  The QtDesignerComponents library\n#  QT_QTGUI_LIBRARY                 The QtGui library\n#  QT_QTMOTIF_LIBRARY               The QtMotif library\n#  QT_QTNETWORK_LIBRARY             The QtNetwork library\n#  QT_QTNSPLUGIN_LIBRARY            The QtNsPLugin library\n#  QT_QTOPENGL_LIBRARY              The QtOpenGL library\n#  QT_QTSQL_LIBRARY                 The QtSql library\n#  QT_QTXML_LIBRARY                 The QtXml library\n#  QT_QTSVG_LIBRARY                 The QtSvg library\n#  QT_QTSCRIPT_LIBRARY              The QtScript library\n#  QT_QTTEST_LIBRARY                The QtTest library\n#  QT_QTMAIN_LIBRARY                The qtmain library for Windows\n#  QT_QTUITOOLS_LIBRARY             The QtUiTools library\n#  QT_QTASSISTANTCLIENT_LIBRARY     The QtAssistantClient library\n#  QT_QTHELP_LIBRARY                The QtHelp library\n#  QT_QTWEBKIT_LIBRARY              The QtWebKit library\n#  QT_QTXMLPATTERNS_LIBRARY         The QtXmlPatterns library\n#  QT_PHONON_LIBRARY                The phonon library\n#  \n# also defined, but NOT for general use are\n#  QT_MOC_EXECUTABLE          Where to find the moc tool.\n#  QT_UIC_EXECUTABLE          Where to find the uic tool.\n#  QT_UIC3_EXECUTABLE         Where to find the uic3 tool.\n#  QT_RCC_EXECUTABLE          Where to find the rcc tool\n#  QT_DBUSCPP2XML_EXECUTABLE  Where to find the qdbuscpp2xml tool.\n#  QT_DBUSXML2CPP_EXECUTABLE  Where to find the qdbusxml2cpp tool.\n#  QT_LUPDATE_EXECUTABLE      Where to find the lupdate tool.\n#  QT_LRELEASE_EXECUTABLE     Where to find the lrelease tool.\n#  \n#  QT_DOC_DIR                 Path to \"doc\" of Qt4\n#  QT_MKSPECS_DIR             Path to \"mkspecs\" of Qt4\n#\n#\n# These are around for backwards compatibility \n# they will be set\n#  QT_WRAP_CPP  Set true if QT_MOC_EXECUTABLE is found\n#  QT_WRAP_UI   Set true if QT_UIC_EXECUTABLE is found\n#  \n# These variables do _NOT_ have any effect anymore (compared to FindQt.cmake)\n#  QT_MT_REQUIRED         Qt4 is now always multithreaded\n#  \n# These variables are set to \"\" Because Qt structure changed \n# (They make no sense in Qt4)\n#  QT_QT_LIBRARY        Qt-Library is now split\n\n# If Qt3 has already been found, fail.\nIF(QT_QT_LIBRARY)\n  IF(Qt4_FIND_REQUIRED)\n    MESSAGE( FATAL_ERROR \"Qt3 and Qt4 cannot be used together in one project.\")\n  ELSE(Qt4_FIND_REQUIRED)\n    IF(NOT Qt4_FIND_QUIETLY)\n      MESSAGE( STATUS    \"Qt3 and Qt4 cannot be used together in one project.\")\n    ENDIF(NOT Qt4_FIND_QUIETLY)\n    RETURN()\n  ENDIF(Qt4_FIND_REQUIRED)\nENDIF(QT_QT_LIBRARY)\n\n\nINCLUDE(CheckSymbolExists)\nINCLUDE(MacroAddFileDependencies)\n\nSET(QT_USE_FILE ${CMAKE_ROOT}/Modules/UseQt4.cmake)\n\nSET( QT_DEFINITIONS \"\")\n\nSET(QT4_INSTALLED_VERSION_TOO_OLD FALSE)\n\n#  macro for asking qmake to process pro files\nMACRO(QT_QUERY_QMAKE outvar invar)\n  IF(QT_QMAKE_EXECUTABLE)\n  FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmpQmake/tmp.pro\n    \"message(CMAKE_MESSAGE<$$${invar}>)\")\n\n  # Invoke qmake with the tmp.pro program to get the desired\n  # information.  Use the same variable for both stdout and stderr\n  # to make sure we get the output on all platforms.\n  EXECUTE_PROCESS(COMMAND ${QT_QMAKE_EXECUTABLE}\n    WORKING_DIRECTORY  \n    ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmpQmake\n    OUTPUT_VARIABLE _qmake_query_output\n    RESULT_VARIABLE _qmake_result\n    ERROR_VARIABLE _qmake_query_output )\n  \n  FILE(REMOVE_RECURSE \n    \"${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmpQmake\")\n\n  IF(_qmake_result)\n    MESSAGE(WARNING \" querying qmake for ${invar}.  qmake reported:\\n${_qmake_query_output}\")\n  ELSE(_qmake_result)\n    STRING(REGEX REPLACE \".*CMAKE_MESSAGE<([^>]*).*\" \"\\\\1\" ${outvar} \"${_qmake_query_output}\")\n  ENDIF(_qmake_result)\n\n  ENDIF(QT_QMAKE_EXECUTABLE)\nENDMACRO(QT_QUERY_QMAKE)\n\nGET_FILENAME_COMPONENT(qt_install_version \"[HKEY_CURRENT_USER\\\\Software\\\\trolltech\\\\Versions;DefaultQtVersion]\" NAME)\n# check for qmake\nFIND_PROGRAM(QT_QMAKE_EXECUTABLE NAMES qmake qmake4 qmake-qt4 PATHS\n  \"[HKEY_CURRENT_USER\\\\Software\\\\Trolltech\\\\Qt3Versions\\\\4.0.0;InstallDir]/bin\"\n  \"[HKEY_CURRENT_USER\\\\Software\\\\Trolltech\\\\Versions\\\\4.0.0;InstallDir]/bin\"\n  \"[HKEY_CURRENT_USER\\\\Software\\\\Trolltech\\\\Versions\\\\${qt_install_version};InstallDir]/bin\"\n  $ENV{QTDIR}/bin\n)\n\nIF (QT_QMAKE_EXECUTABLE)\n\n  SET(QT4_QMAKE_FOUND FALSE)\n  \n  EXEC_PROGRAM(${QT_QMAKE_EXECUTABLE} ARGS \"-query QT_VERSION\" OUTPUT_VARIABLE QTVERSION)\n\n  # check for qt3 qmake and then try and find qmake4 or qmake-qt4 in the path\n  IF(\"${QTVERSION}\" MATCHES \"Unknown\")\n    SET(QT_QMAKE_EXECUTABLE NOTFOUND CACHE FILEPATH \"\" FORCE)\n    FIND_PROGRAM(QT_QMAKE_EXECUTABLE NAMES qmake4 qmake-qt4 PATHS\n      \"[HKEY_CURRENT_USER\\\\Software\\\\Trolltech\\\\Qt3Versions\\\\4.0.0;InstallDir]/bin\"\n      \"[HKEY_CURRENT_USER\\\\Software\\\\Trolltech\\\\Versions\\\\4.0.0;InstallDir]/bin\"\n      $ENV{QTDIR}/bin\n      )\n    IF(QT_QMAKE_EXECUTABLE)\n      EXEC_PROGRAM(${QT_QMAKE_EXECUTABLE} \n        ARGS \"-query QT_VERSION\" OUTPUT_VARIABLE QTVERSION)\n    ENDIF(QT_QMAKE_EXECUTABLE)\n  ENDIF(\"${QTVERSION}\" MATCHES \"Unknown\")\n\n  # check that we found the Qt4 qmake, Qt3 qmake output won't match here\n  STRING(REGEX MATCH \"^[0-9]+\\\\.[0-9]+\\\\.[0-9]+\" qt_version_tmp \"${QTVERSION}\")\n  IF (qt_version_tmp)\n\n    # we need at least version 4.0.0\n    IF (NOT QT_MIN_VERSION)\n      SET(QT_MIN_VERSION \"4.0.0\")\n    ENDIF (NOT QT_MIN_VERSION)\n\n    #now parse the parts of the user given version string into variables\n    STRING(REGEX MATCH \"^[0-9]+\\\\.[0-9]+\\\\.[0-9]+\" req_qt_major_vers \"${QT_MIN_VERSION}\")\n    IF (NOT req_qt_major_vers)\n      MESSAGE( FATAL_ERROR \"Invalid Qt version string given: \\\"${QT_MIN_VERSION}\\\", expected e.g. \\\"4.0.1\\\"\")\n    ENDIF (NOT req_qt_major_vers)\n\n    # now parse the parts of the user given version string into variables\n    STRING(REGEX REPLACE \"^([0-9]+)\\\\.[0-9]+\\\\.[0-9]+\" \"\\\\1\" req_qt_major_vers \"${QT_MIN_VERSION}\")\n    STRING(REGEX REPLACE \"^[0-9]+\\\\.([0-9])+\\\\.[0-9]+\" \"\\\\1\" req_qt_minor_vers \"${QT_MIN_VERSION}\")\n    STRING(REGEX REPLACE \"^[0-9]+\\\\.[0-9]+\\\\.([0-9]+)\" \"\\\\1\" req_qt_patch_vers \"${QT_MIN_VERSION}\")\n\n    IF (NOT req_qt_major_vers EQUAL 4)\n      MESSAGE( FATAL_ERROR \"Invalid Qt version string given: \\\"${QT_MIN_VERSION}\\\", major version 4 is required, e.g. \\\"4.0.1\\\"\")\n    ENDIF (NOT req_qt_major_vers EQUAL 4)\n\n    # and now the version string given by qmake\n    STRING(REGEX REPLACE \"^([0-9]+)\\\\.[0-9]+\\\\.[0-9]+.*\" \"\\\\1\" QT_VERSION_MAJOR \"${QTVERSION}\")\n    STRING(REGEX REPLACE \"^[0-9]+\\\\.([0-9])+\\\\.[0-9]+.*\" \"\\\\1\" QT_VERSION_MINOR \"${QTVERSION}\")\n    STRING(REGEX REPLACE \"^[0-9]+\\\\.[0-9]+\\\\.([0-9]+).*\" \"\\\\1\" QT_VERSION_PATCH \"${QTVERSION}\")\n\n    # compute an overall version number which can be compared at once\n    MATH(EXPR req_vers \"${req_qt_major_vers}*10000 + ${req_qt_minor_vers}*100 + ${req_qt_patch_vers}\")\n    MATH(EXPR found_vers \"${QT_VERSION_MAJOR}*10000 + ${QT_VERSION_MINOR}*100 + ${QT_VERSION_PATCH}\")\n\n    IF (found_vers LESS req_vers)\n      SET(QT4_QMAKE_FOUND FALSE)\n      SET(QT4_INSTALLED_VERSION_TOO_OLD TRUE)\n    ELSE (found_vers LESS req_vers)\n      SET(QT4_QMAKE_FOUND TRUE)\n    ENDIF (found_vers LESS req_vers)\n  ENDIF (qt_version_tmp)\n\nENDIF (QT_QMAKE_EXECUTABLE)\n\nIF (QT4_QMAKE_FOUND)\n\n  # ask qmake for the library dir\n  # Set QT_LIBRARY_DIR\n  IF (NOT QT_LIBRARY_DIR)\n    EXEC_PROGRAM( ${QT_QMAKE_EXECUTABLE}\n      ARGS \"-query QT_INSTALL_LIBS\"\n      OUTPUT_VARIABLE QT_LIBRARY_DIR_TMP )\n    # make sure we have / and not \\ as qmake gives on windows\n    FILE(TO_CMAKE_PATH \"${QT_LIBRARY_DIR_TMP}\" QT_LIBRARY_DIR_TMP)\n    IF(EXISTS \"${QT_LIBRARY_DIR_TMP}\")\n      SET(QT_LIBRARY_DIR ${QT_LIBRARY_DIR_TMP} CACHE PATH \"Qt library dir\")\n    ELSE(EXISTS \"${QT_LIBRARY_DIR_TMP}\")\n      MESSAGE(\"Warning: QT_QMAKE_EXECUTABLE reported QT_INSTALL_LIBS as ${QT_LIBRARY_DIR_TMP}\")\n      MESSAGE(\"Warning: ${QT_LIBRARY_DIR_TMP} does NOT exist, Qt must NOT be installed correctly.\")\n    ENDIF(EXISTS \"${QT_LIBRARY_DIR_TMP}\")\n  ENDIF(NOT QT_LIBRARY_DIR)\n  \n  IF (APPLE)\n    IF (EXISTS ${QT_LIBRARY_DIR}/QtCore.framework)\n      SET(QT_USE_FRAMEWORKS ON\n        CACHE BOOL \"Set to ON if Qt build uses frameworks.\")\n    ELSE (EXISTS ${QT_LIBRARY_DIR}/QtCore.framework)\n      SET(QT_USE_FRAMEWORKS OFF\n        CACHE BOOL \"Set to ON if Qt build uses frameworks.\")\n    ENDIF (EXISTS ${QT_LIBRARY_DIR}/QtCore.framework)\n    \n    MARK_AS_ADVANCED(QT_USE_FRAMEWORKS)\n  ENDIF (APPLE)\n  \n  # ask qmake for the binary dir\n  IF (QT_LIBRARY_DIR AND NOT QT_BINARY_DIR)\n     EXEC_PROGRAM(${QT_QMAKE_EXECUTABLE}\n       ARGS \"-query QT_INSTALL_BINS\"\n       OUTPUT_VARIABLE qt_bins )\n     # make sure we have / and not \\ as qmake gives on windows\n     FILE(TO_CMAKE_PATH \"${qt_bins}\" qt_bins)\n     SET(QT_BINARY_DIR ${qt_bins} CACHE INTERNAL \"\")\n  ENDIF (QT_LIBRARY_DIR AND NOT QT_BINARY_DIR)\n\n  # ask qmake for the include dir\n  IF (QT_LIBRARY_DIR AND NOT QT_HEADERS_DIR)\n      EXEC_PROGRAM( ${QT_QMAKE_EXECUTABLE}\n        ARGS \"-query QT_INSTALL_HEADERS\" \n        OUTPUT_VARIABLE qt_headers ) \n      # make sure we have / and not \\ as qmake gives on windows\n      FILE(TO_CMAKE_PATH \"${qt_headers}\" qt_headers)\n      SET(QT_HEADERS_DIR ${qt_headers} CACHE INTERNAL \"\")\n  ENDIF(QT_LIBRARY_DIR AND NOT QT_HEADERS_DIR)\n\n\n  # ask qmake for the documentation directory\n  IF (QT_LIBRARY_DIR AND NOT QT_DOC_DIR)\n    EXEC_PROGRAM( ${QT_QMAKE_EXECUTABLE}\n      ARGS \"-query QT_INSTALL_DOCS\"\n      OUTPUT_VARIABLE qt_doc_dir )\n    # make sure we have / and not \\ as qmake gives on windows\n    FILE(TO_CMAKE_PATH \"${qt_doc_dir}\" qt_doc_dir)\n    SET(QT_DOC_DIR ${qt_doc_dir} CACHE PATH \"The location of the Qt docs\")\n  ENDIF (QT_LIBRARY_DIR AND NOT QT_DOC_DIR)\n\n  # ask qmake for the mkspecs directory\n  IF (QT_LIBRARY_DIR AND NOT QT_MKSPECS_DIR)\n    EXEC_PROGRAM( ${QT_QMAKE_EXECUTABLE}\n      ARGS \"-query QMAKE_MKSPECS\"\n      OUTPUT_VARIABLE qt_mkspecs_dirs )\n    # do not replace : on windows as it might be a drive letter\n    # and windows should already use ; as a separator\n    IF(UNIX)\n      STRING(REPLACE \":\" \";\" qt_mkspecs_dirs \"${qt_mkspecs_dirs}\")\n    ENDIF(UNIX)\n    FIND_PATH(QT_MKSPECS_DIR qconfig.pri PATHS ${qt_mkspecs_dirs}\n      DOC \"The location of the Qt mkspecs containing qconfig.pri\"\n      NO_DEFAULT_PATH )\n  ENDIF (QT_LIBRARY_DIR AND NOT QT_MKSPECS_DIR)\n\n  # ask qmake for the plugins directory\n  IF (QT_LIBRARY_DIR AND NOT QT_PLUGINS_DIR)\n    EXEC_PROGRAM( ${QT_QMAKE_EXECUTABLE}\n      ARGS \"-query QT_INSTALL_PLUGINS\"\n      OUTPUT_VARIABLE qt_plugins_dir )\n    # make sure we have / and not \\ as qmake gives on windows\n    FILE(TO_CMAKE_PATH \"${qt_plugins_dir}\" qt_plugins_dir)\n    SET(QT_PLUGINS_DIR ${qt_plugins_dir} CACHE PATH \"The location of the Qt plugins\")\n  ENDIF (QT_LIBRARY_DIR AND NOT QT_PLUGINS_DIR)\n  ########################################\n  #\n  #       Setting the INCLUDE-Variables\n  #\n  ########################################\n\n  FIND_PATH(QT_QTCORE_INCLUDE_DIR QtGlobal\n    PATHS\n    ${QT_HEADERS_DIR}/QtCore\n    ${QT_LIBRARY_DIR}/QtCore.framework/Headers\n    NO_DEFAULT_PATH\n    )\n\n  # Set QT_INCLUDE_DIR by removine \"/QtCore\" in the string ${QT_QTCORE_INCLUDE_DIR}\n  IF( QT_QTCORE_INCLUDE_DIR AND NOT QT_INCLUDE_DIR)\n    IF (QT_USE_FRAMEWORKS)\n      SET(QT_INCLUDE_DIR ${QT_HEADERS_DIR})\n    ELSE (QT_USE_FRAMEWORKS)\n      STRING( REGEX REPLACE \"/QtCore$\" \"\" qt4_include_dir ${QT_QTCORE_INCLUDE_DIR})\n      SET( QT_INCLUDE_DIR ${qt4_include_dir} CACHE PATH \"\")\n    ENDIF (QT_USE_FRAMEWORKS)\n  ENDIF( QT_QTCORE_INCLUDE_DIR AND NOT QT_INCLUDE_DIR)\n\n  IF( NOT QT_INCLUDE_DIR)\n    IF(Qt4_FIND_REQUIRED)\n      MESSAGE( FATAL_ERROR \"Could NOT find QtGlobal header\")\n    ENDIF(Qt4_FIND_REQUIRED)\n  ENDIF( NOT QT_INCLUDE_DIR)\n\n  #############################################\n  #\n  # Find out what window system we're using\n  #\n  #############################################\n  # Save required variable\n  SET(CMAKE_REQUIRED_INCLUDES_SAVE ${CMAKE_REQUIRED_INCLUDES})\n  SET(CMAKE_REQUIRED_FLAGS_SAVE    ${CMAKE_REQUIRED_FLAGS})\n  # Add QT_INCLUDE_DIR to CMAKE_REQUIRED_INCLUDES\n  SET(CMAKE_REQUIRED_INCLUDES \"${CMAKE_REQUIRED_INCLUDES};${QT_INCLUDE_DIR}\")\n  # On Mac OS X when Qt has framework support, also add the framework path\n  IF( QT_USE_FRAMEWORKS )\n    SET(CMAKE_REQUIRED_FLAGS \"-F${QT_LIBRARY_DIR} \")\n  ENDIF( QT_USE_FRAMEWORKS )\n  # Check for Window system symbols (note: only one should end up being set)\n  CHECK_SYMBOL_EXISTS(Q_WS_X11 \"QtCore/qglobal.h\" Q_WS_X11)\n  CHECK_SYMBOL_EXISTS(Q_WS_WIN \"QtCore/qglobal.h\" Q_WS_WIN)\n  CHECK_SYMBOL_EXISTS(Q_WS_QWS \"QtCore/qglobal.h\" Q_WS_QWS)\n  CHECK_SYMBOL_EXISTS(Q_WS_MAC \"QtCore/qglobal.h\" Q_WS_MAC)\n\n  IF (QT_QTCOPY_REQUIRED)\n     CHECK_SYMBOL_EXISTS(QT_IS_QTCOPY \"QtCore/qglobal.h\" QT_KDE_QT_COPY)\n     IF (NOT QT_IS_QTCOPY)\n        MESSAGE(FATAL_ERROR \"qt-copy is required, but hasn't been found\")\n     ENDIF (NOT QT_IS_QTCOPY)\n  ENDIF (QT_QTCOPY_REQUIRED)\n\n  # Restore CMAKE_REQUIRED_INCLUDES and CMAKE_REQUIRED_FLAGS variables\n  SET(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES_SAVE})\n  SET(CMAKE_REQUIRED_FLAGS    ${CMAKE_REQUIRED_FLAGS_SAVE})\n  #\n  #############################################\n\n  # Set QT_QT3SUPPORT_INCLUDE_DIR\n  FIND_PATH(QT_QT3SUPPORT_INCLUDE_DIR Qt3Support\n    PATHS\n    ${QT_INCLUDE_DIR}/Qt3Support\n    ${QT_LIBRARY_DIR}/Qt3Support.framework/Headers\n    NO_DEFAULT_PATH\n    )\n\n  # Set QT_QT_INCLUDE_DIR\n  FIND_PATH(QT_QT_INCLUDE_DIR qglobal.h\n    PATHS\n    ${QT_INCLUDE_DIR}/Qt\n    ${QT_LIBRARY_DIR}/QtCore.framework/Headers\n    NO_DEFAULT_PATH\n    )\n\n  # Set QT_QTGUI_INCLUDE_DIR\n  FIND_PATH(QT_QTGUI_INCLUDE_DIR QtGui\n    PATHS\n    ${QT_INCLUDE_DIR}/QtGui\n    ${QT_LIBRARY_DIR}/QtGui.framework/Headers\n    NO_DEFAULT_PATH\n    )\n\n  # Set QT_QTSVG_INCLUDE_DIR\n  FIND_PATH(QT_QTSVG_INCLUDE_DIR QtSvg\n    PATHS\n    ${QT_INCLUDE_DIR}/QtSvg\n    ${QT_LIBRARY_DIR}/QtSvg.framework/Headers\n    NO_DEFAULT_PATH\n    )\n\n  # Set QT_QTSCRIPT_INCLUDE_DIR\n  FIND_PATH(QT_QTSCRIPT_INCLUDE_DIR QtScript\n    PATHS\n    ${QT_INCLUDE_DIR}/QtScript\n    ${QT_LIBRARY_DIR}/QtScript.framework/Headers\n    NO_DEFAULT_PATH\n    )\n\n  # Set QT_QTTEST_INCLUDE_DIR\n  FIND_PATH(QT_QTTEST_INCLUDE_DIR QtTest\n    PATHS\n    ${QT_INCLUDE_DIR}/QtTest\n    ${QT_LIBRARY_DIR}/QtTest.framework/Headers\n    NO_DEFAULT_PATH\n    )\n\n  # Set QT_QTUITOOLS_INCLUDE_DIR\n  FIND_PATH(QT_QTUITOOLS_INCLUDE_DIR QtUiTools\n    PATHS\n    ${QT_INCLUDE_DIR}/QtUiTools\n    ${QT_LIBRARY_DIR}/QtUiTools.framework/Headers\n    NO_DEFAULT_PATH\n    )\n\n  # Set QT_QTMOTIF_INCLUDE_DIR\n  IF(Q_WS_X11)\n    FIND_PATH(QT_QTMOTIF_INCLUDE_DIR QtMotif \n      PATHS \n      ${QT_INCLUDE_DIR}/QtMotif \n      NO_DEFAULT_PATH )\n  ENDIF(Q_WS_X11)\n\n  # Set QT_QTNETWORK_INCLUDE_DIR\n  FIND_PATH(QT_QTNETWORK_INCLUDE_DIR QtNetwork\n    PATHS\n    ${QT_INCLUDE_DIR}/QtNetwork\n    ${QT_LIBRARY_DIR}/QtNetwork.framework/Headers\n    NO_DEFAULT_PATH\n    )\n\n  # Set QT_QTNSPLUGIN_INCLUDE_DIR\n  FIND_PATH(QT_QTNSPLUGIN_INCLUDE_DIR QtNsPlugin\n    PATHS\n    ${QT_INCLUDE_DIR}/QtNsPlugin\n    ${QT_LIBRARY_DIR}/QtNsPlugin.framework/Headers\n    NO_DEFAULT_PATH\n    )\n\n  # Set QT_QTOPENGL_INCLUDE_DIR\n  FIND_PATH(QT_QTOPENGL_INCLUDE_DIR QtOpenGL\n    PATHS\n    ${QT_INCLUDE_DIR}/QtOpenGL\n    ${QT_LIBRARY_DIR}/QtOpenGL.framework/Headers\n    NO_DEFAULT_PATH\n    )\n\n  # Set QT_QTSQL_INCLUDE_DIR\n  FIND_PATH(QT_QTSQL_INCLUDE_DIR QtSql\n    PATHS\n    ${QT_INCLUDE_DIR}/QtSql\n    ${QT_LIBRARY_DIR}/QtSql.framework/Headers\n    NO_DEFAULT_PATH\n    )\n\n  # Set QT_QTXML_INCLUDE_DIR\n  FIND_PATH(QT_QTXML_INCLUDE_DIR QtXml\n    PATHS\n    ${QT_INCLUDE_DIR}/QtXml\n    ${QT_LIBRARY_DIR}/QtXml.framework/Headers\n    NO_DEFAULT_PATH\n    )\n\n  # Set QT_QTASSISTANT_INCLUDE_DIR\n  FIND_PATH(QT_QTASSISTANT_INCLUDE_DIR QtAssistant\n    PATHS\n    ${QT_INCLUDE_DIR}/QtAssistant\n    ${QT_LIBRARY_DIR}/QtAssistant.framework/Headers\n    NO_DEFAULT_PATH\n    )\n\n  # Set QT_QTDESIGNER_INCLUDE_DIR\n  FIND_PATH(QT_QTDESIGNER_INCLUDE_DIR QDesignerComponents\n    PATHS\n    ${QT_INCLUDE_DIR}/QtDesigner\n    ${QT_LIBRARY_DIR}/QtDesigner.framework/Headers\n    NO_DEFAULT_PATH\n    )\n\n  # Set QT_QTDESIGNERCOMPONENTS_INCLUDE_DIR\n  FIND_PATH(QT_QTDESIGNERCOMPONENTS_INCLUDE_DIR QDesignerComponents\n    PATHS\n    ${QT_INCLUDE_DIR}/QtDesigner\n    ${QT_LIBRARY_DIR}/QtDesigner.framework/Headers\n    NO_DEFAULT_PATH\n    )\n\n  # Set QT_QTDBUS_INCLUDE_DIR\n  FIND_PATH(QT_QTDBUS_INCLUDE_DIR QtDBus\n    PATHS\n    ${QT_INCLUDE_DIR}/QtDBus\n    ${QT_LIBRARY_DIR}/QtDBus.framework/Headers\n    NO_DEFAULT_PATH\n    )\n  \n  # Set QT_QTASSISTANTCLIENT_INCLUDE_DIR\n  FIND_PATH(QT_QTASSISTANTCLIENT_INCLUDE_DIR QAssistantClient\n    PATHS\n    ${QT_INCLUDE_DIR}/QtAssistant\n    ${QT_LIBRARY_DIR}/QtAssistant.framework/Headers\n    NO_DEFAULT_PATH\n    )\n  \n  # Set QT_QTHELP_INCLUDE_DIR\n  FIND_PATH(QT_QTHELP_INCLUDE_DIR QtHelp\n    PATHS\n    ${QT_INCLUDE_DIR}/QtHelp\n    ${QT_LIBRARY_DIR}/QtHelp.framework/Headers\n    NO_DEFAULT_PATH\n    )\n  \n  # Set QT_QTWEBKIT_INCLUDE_DIR\n  FIND_PATH(QT_QTWEBKIT_INCLUDE_DIR QtWebKit\n    PATHS\n    ${QT_INCLUDE_DIR}/QtWebKit\n    ${QT_LIBRARY_DIR}/QtWebKit.framework/Headers\n    NO_DEFAULT_PATH\n    )\n  \n  # Set QT_QTXMLPATTERNS_INCLUDE_DIR\n  FIND_PATH(QT_QTXMLPATTERNS_INCLUDE_DIR QtXmlPatterns\n    PATHS\n    ${QT_INCLUDE_DIR}/QtXmlPatterns\n    ${QT_LIBRARY_DIR}/QtXmlPatterns.framework/Headers\n    NO_DEFAULT_PATH\n    )\n  \n  # Set QT_PHONON_INCLUDE_DIR\n  FIND_PATH(QT_PHONON_INCLUDE_DIR phonon\n    PATHS\n    ${QT_INCLUDE_DIR}/phonon\n    ${QT_LIBRARY_DIR}/phonon.framework/Headers\n    NO_DEFAULT_PATH\n    )\n\n  # Make variables changeble to the advanced user\n  MARK_AS_ADVANCED( QT_LIBRARY_DIR QT_INCLUDE_DIR QT_QT_INCLUDE_DIR QT_DOC_DIR QT_MKSPECS_DIR QT_PLUGINS_DIR)\n\n  # Set QT_INCLUDES\n  SET( QT_INCLUDES ${QT_QT_INCLUDE_DIR} ${QT_MKSPECS_DIR}/default ${QT_INCLUDE_DIR} )\n\n  # Set QT_QTCORE_LIBRARY by searching for a lib with \"QtCore.\"  as part of the filename\n  FIND_LIBRARY(QT_QTCORE_LIBRARY_RELEASE NAMES QtCore QtCore4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH )\n  FIND_LIBRARY(QT_QTCORE_LIBRARY_DEBUG NAMES QtCore_debug QtCored QtCored4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH)\n\n  # Set QT_QT3SUPPORT_LIBRARY\n  FIND_LIBRARY(QT_QT3SUPPORT_LIBRARY_RELEASE NAMES Qt3Support Qt3Support4 PATHS ${QT_LIBRARY_DIR}        NO_DEFAULT_PATH)\n  FIND_LIBRARY(QT_QT3SUPPORT_LIBRARY_DEBUG   NAMES Qt3Support_debug Qt3Supportd Qt3Supportd4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH)\n\n  # Set QT_QTGUI_LIBRARY\n  FIND_LIBRARY(QT_QTGUI_LIBRARY_RELEASE NAMES QtGui QtGui4 PATHS ${QT_LIBRARY_DIR}        NO_DEFAULT_PATH)\n  FIND_LIBRARY(QT_QTGUI_LIBRARY_DEBUG   NAMES QtGui_debug QtGuid QtGuid4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH)\n\n  # Set QT_QTMOTIF_LIBRARY\n  IF(Q_WS_X11)\n    FIND_LIBRARY(QT_QTMOTIF_LIBRARY_RELEASE NAMES QtMotif PATHS ${QT_LIBRARY_DIR}       NO_DEFAULT_PATH)\n    FIND_LIBRARY(QT_QTMOTIF_LIBRARY_DEBUG   NAMES QtMotif_debug PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH)\n  ENDIF(Q_WS_X11)\n\n  # Set QT_QTNETWORK_LIBRARY\n  FIND_LIBRARY(QT_QTNETWORK_LIBRARY_RELEASE NAMES QtNetwork QtNetwork4 PATHS ${QT_LIBRARY_DIR}        NO_DEFAULT_PATH)\n  FIND_LIBRARY(QT_QTNETWORK_LIBRARY_DEBUG   NAMES QtNetwork_debug QtNetworkd QtNetworkd4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH)\n\n  # Set QT_QTNSPLUGIN_LIBRARY\n  FIND_LIBRARY(QT_QTNSPLUGIN_LIBRARY_RELEASE NAMES QtNsPlugin PATHS ${QT_LIBRARY_DIR}       NO_DEFAULT_PATH)\n  FIND_LIBRARY(QT_QTNSPLUGIN_LIBRARY_DEBUG   NAMES QtNsPlugin_debug PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH)\n\n  # Set QT_QTOPENGL_LIBRARY\n  FIND_LIBRARY(QT_QTOPENGL_LIBRARY_RELEASE NAMES QtOpenGL QtOpenGL4 PATHS ${QT_LIBRARY_DIR}        NO_DEFAULT_PATH)\n  FIND_LIBRARY(QT_QTOPENGL_LIBRARY_DEBUG   NAMES QtOpenGL_debug QtOpenGLd QtOpenGLd4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH)\n\n  # Set QT_QTSQL_LIBRARY\n  FIND_LIBRARY(QT_QTSQL_LIBRARY_RELEASE NAMES QtSql QtSql4 PATHS ${QT_LIBRARY_DIR}        NO_DEFAULT_PATH)\n  FIND_LIBRARY(QT_QTSQL_LIBRARY_DEBUG   NAMES QtSql_debug QtSqld QtSqld4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH)\n\n  # Set QT_QTXML_LIBRARY\n  FIND_LIBRARY(QT_QTXML_LIBRARY_RELEASE NAMES QtXml QtXml4 PATHS ${QT_LIBRARY_DIR}        NO_DEFAULT_PATH)\n  FIND_LIBRARY(QT_QTXML_LIBRARY_DEBUG   NAMES QtXml_debug QtXmld QtXmld4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH)\n\n  # Set QT_QTSVG_LIBRARY\n  FIND_LIBRARY(QT_QTSVG_LIBRARY_RELEASE NAMES QtSvg QtSvg4 PATHS ${QT_LIBRARY_DIR}        NO_DEFAULT_PATH)\n  FIND_LIBRARY(QT_QTSVG_LIBRARY_DEBUG   NAMES QtSvg_debug QtSvgd QtSvgd4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH)\n\n  # Set QT_QTUITOOLS_LIBRARY\n  FIND_LIBRARY(QT_QTUITOOLS_LIBRARY_RELEASE NAMES QtUiTools QtUiTools4 PATHS ${QT_LIBRARY_DIR}        NO_DEFAULT_PATH)\n  FIND_LIBRARY(QT_QTUITOOLS_LIBRARY_DEBUG   NAMES QtUiTools_debug QtUiToolsd QtUiToolsd4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH)\n  # QtUiTools not with other frameworks with binary installation (in /usr/lib)\n  IF(Q_WS_MAC AND QT_QTCORE_LIBRARY_RELEASE AND NOT QT_QTUITOOLS_LIBRARY_RELEASE)\n    FIND_LIBRARY(QT_QTUITOOLS_LIBRARY_RELEASE NAMES QtUiTools PATHS ${QT_LIBRARY_DIR})\n  ENDIF(Q_WS_MAC AND QT_QTCORE_LIBRARY_RELEASE AND NOT QT_QTUITOOLS_LIBRARY_RELEASE)\n\n  # Set QT_QTTEST_LIBRARY\n  FIND_LIBRARY(QT_QTTEST_LIBRARY_RELEASE NAMES QtTest QtTest4 PATHS ${QT_LIBRARY_DIR}                      NO_DEFAULT_PATH)\n  FIND_LIBRARY(QT_QTTEST_LIBRARY_DEBUG   NAMES QtTest_debug QtTestd QtTestd4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH)\n\n  # Set QT_QTDBUS_LIBRARY\n  # This was introduced with Qt 4.2, where also the naming scheme for debug libs was changed\n  # So does any of the debug lib names listed here actually exist ?\n  FIND_LIBRARY(QT_QTDBUS_LIBRARY_RELEASE NAMES QtDBus QtDBus4 PATHS ${QT_LIBRARY_DIR}                       NO_DEFAULT_PATH)\n  FIND_LIBRARY(QT_QTDBUS_LIBRARY_DEBUG   NAMES QtDBus_debug QtDBusd QtDBusd4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH)\n\n  # Set QT_QTSCRIPT_LIBRARY\n  FIND_LIBRARY(QT_QTSCRIPT_LIBRARY_RELEASE NAMES QtScript QtScript4 PATHS ${QT_LIBRARY_DIR}        NO_DEFAULT_PATH)\n  FIND_LIBRARY(QT_QTSCRIPT_LIBRARY_DEBUG   NAMES QtScript_debug QtScriptd QtScriptd4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH)\n\n  IF( NOT QT_QTCORE_LIBRARY_DEBUG AND NOT QT_QTCORE_LIBRARY_RELEASE )\n    \n    # try dropping a hint if trying to use Visual Studio with Qt built by mingw\n    IF(QT_LIBRARY_DIR AND MSVC)\n      IF(EXISTS ${QT_LIBRARY_DIR}/libqtmain.a)\n        MESSAGE( FATAL_ERROR \"It appears you're trying to use Visual Studio with Qt built by mingw\")\n      ENDIF(EXISTS ${QT_LIBRARY_DIR}/libqtmain.a)\n    ENDIF(QT_LIBRARY_DIR AND MSVC)\n\n    IF(Qt4_FIND_REQUIRED)\n      MESSAGE( FATAL_ERROR \"Could NOT find QtCore. Check ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log for more details.\")\n    ENDIF(Qt4_FIND_REQUIRED)\n  ENDIF( NOT QT_QTCORE_LIBRARY_DEBUG AND NOT QT_QTCORE_LIBRARY_RELEASE )\n\n  # Set QT_QTASSISTANT_LIBRARY\n  FIND_LIBRARY(QT_QTASSISTANT_LIBRARY_RELEASE NAMES QtAssistantClient QtAssistantClient4 QtAssistant QtAssistant4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH)\n  FIND_LIBRARY(QT_QTASSISTANT_LIBRARY_DEBUG   NAMES QtAssistantClientd QtAssistantClientd4 QtAssistantClient_debug QtAssistant_debug QtAssistantd4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH)\n\n  # Set QT_QTDESIGNER_LIBRARY\n  FIND_LIBRARY(QT_QTDESIGNER_LIBRARY_RELEASE NAMES QtDesigner QtDesigner4 PATHS ${QT_LIBRARY_DIR}        NO_DEFAULT_PATH)\n  FIND_LIBRARY(QT_QTDESIGNER_LIBRARY_DEBUG   NAMES QtDesigner_debug QtDesignerd QtDesignerd4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH)\n\n  # Set QT_QTDESIGNERCOMPONENTS_LIBRARY\n  FIND_LIBRARY(QT_QTDESIGNERCOMPONENTS_LIBRARY_RELEASE NAMES QtDesignerComponents QtDesignerComponents4 PATHS ${QT_LIBRARY_DIR}        NO_DEFAULT_PATH)\n  FIND_LIBRARY(QT_QTDESIGNERCOMPONENTS_LIBRARY_DEBUG   NAMES QtDesignerComponents_debug QtDesignerComponentsd QtDesignerComponentsd4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH)\n\n  # Set QT_QTMAIN_LIBRARY\n  IF(WIN32)\n    FIND_LIBRARY(QT_QTMAIN_LIBRARY_RELEASE NAMES qtmain PATHS ${QT_LIBRARY_DIR}\n      NO_DEFAULT_PATH)\n    FIND_LIBRARY(QT_QTMAIN_LIBRARY_DEBUG NAMES qtmaind PATHS ${QT_LIBRARY_DIR}\n      NO_DEFAULT_PATH)\n  ENDIF(WIN32)\n  \n  # Set QT_QTASSISTANTCLIENT_LIBRARY\n  FIND_LIBRARY(QT_QTASSISTANTCLIENT_LIBRARY_RELEASE NAMES QtAssistantClient QtAssistantClient4 PATHS ${QT_LIBRARY_DIR}        NO_DEFAULT_PATH)\n  FIND_LIBRARY(QT_QTASSISTANTCLIENT_LIBRARY_DEBUG   NAMES QtAssistantClient_debug QtAssistantClientd QtAssistantClientd4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH)\n\n  # Set QT_QTHELP_LIBRARY\n  FIND_LIBRARY(QT_QTHELP_LIBRARY_RELEASE NAMES QtHelp QtHelp4 PATHS ${QT_LIBRARY_DIR}        NO_DEFAULT_PATH)\n  FIND_LIBRARY(QT_QTHELP_LIBRARY_DEBUG   NAMES QtHelp_debug QtHelpd QtHelpd4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH)\n  FIND_LIBRARY(QT_QTCLUCENE_LIBRARY_RELEASE NAMES QtCLucene QtCLucene4 PATHS ${QT_LIBRARY_DIR}        NO_DEFAULT_PATH)\n  FIND_LIBRARY(QT_QTCLUCENE_LIBRARY_DEBUG   NAMES QtCLucene_debug QtCLucened QtCLucened4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH)\n  # QtCLucene not with other frameworks with binary installation (in /usr/lib)\n  IF(Q_WS_MAC AND QT_QTCORE_LIBRARY_RELEASE AND NOT QT_QTCLUCENE_LIBRARY_RELEASE)\n    FIND_LIBRARY(QT_QTCLUCENE_LIBRARY_RELEASE NAMES QtCLucene PATHS ${QT_LIBRARY_DIR})\n  ENDIF(Q_WS_MAC AND QT_QTCORE_LIBRARY_RELEASE AND NOT QT_QTCLUCENE_LIBRARY_RELEASE)\n\n  # Set QT_QTWEBKIT_LIBRARY\n  FIND_LIBRARY(QT_QTWEBKIT_LIBRARY_RELEASE NAMES QtWebKit QtWebKit4 PATHS ${QT_LIBRARY_DIR}        NO_DEFAULT_PATH)\n  FIND_LIBRARY(QT_QTWEBKIT_LIBRARY_DEBUG   NAMES QtWebKit_debug QtWebKitd QtWebKitd4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH)\n\n  # Set QT_QTXMLPATTERNS_LIBRARY\n  FIND_LIBRARY(QT_QTXMLPATTERNS_LIBRARY_RELEASE NAMES QtXmlPatterns QtXmlPatterns4 PATHS ${QT_LIBRARY_DIR}        NO_DEFAULT_PATH)\n  FIND_LIBRARY(QT_QTXMLPATTERNS_LIBRARY_DEBUG   NAMES QtXmlPatterns_debug QtXmlPatternsd QtXmlPatternsd4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH)\n  \n  # Set QT_PHONON_LIBRARY\n  FIND_LIBRARY(QT_PHONON_LIBRARY_RELEASE NAMES phonon phonon4 PATHS ${QT_LIBRARY_DIR}        NO_DEFAULT_PATH)\n  FIND_LIBRARY(QT_PHONON_LIBRARY_DEBUG   NAMES phonon_debug phonond phonond4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH)\n\n  ############################################\n  #\n  # Check the existence of the libraries.\n  #\n  ############################################\n\n  MACRO (_QT4_ADJUST_LIB_VARS basename)\n    IF (QT_${basename}_LIBRARY_RELEASE OR QT_${basename}_LIBRARY_DEBUG)\n\n      # if only the release version was found, set the debug variable also to the release version\n      IF (QT_${basename}_LIBRARY_RELEASE AND NOT QT_${basename}_LIBRARY_DEBUG)\n        SET(QT_${basename}_LIBRARY_DEBUG ${QT_${basename}_LIBRARY_RELEASE})\n        SET(QT_${basename}_LIBRARY       ${QT_${basename}_LIBRARY_RELEASE})\n        SET(QT_${basename}_LIBRARIES     ${QT_${basename}_LIBRARY_RELEASE})\n      ENDIF (QT_${basename}_LIBRARY_RELEASE AND NOT QT_${basename}_LIBRARY_DEBUG)\n\n      # if only the debug version was found, set the release variable also to the debug version\n      IF (QT_${basename}_LIBRARY_DEBUG AND NOT QT_${basename}_LIBRARY_RELEASE)\n        SET(QT_${basename}_LIBRARY_RELEASE ${QT_${basename}_LIBRARY_DEBUG})\n        SET(QT_${basename}_LIBRARY         ${QT_${basename}_LIBRARY_DEBUG})\n        SET(QT_${basename}_LIBRARIES       ${QT_${basename}_LIBRARY_DEBUG})\n      ENDIF (QT_${basename}_LIBRARY_DEBUG AND NOT QT_${basename}_LIBRARY_RELEASE)\n\n      IF (QT_${basename}_LIBRARY_DEBUG AND QT_${basename}_LIBRARY_RELEASE)\n        # if the generator supports configuration types then set\n        # optimized and debug libraries, or if the CMAKE_BUILD_TYPE has a value\n        IF (CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE)\n          SET(QT_${basename}_LIBRARY       optimized ${QT_${basename}_LIBRARY_RELEASE} debug ${QT_${basename}_LIBRARY_DEBUG})\n        ELSE(CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE)\n          # if there are no configuration types and CMAKE_BUILD_TYPE has no value\n          # then just use the release libraries\n          SET(QT_${basename}_LIBRARY       ${QT_${basename}_LIBRARY_RELEASE} )\n        ENDIF(CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE)\n        SET(QT_${basename}_LIBRARIES       optimized ${QT_${basename}_LIBRARY_RELEASE} debug ${QT_${basename}_LIBRARY_DEBUG})\n      ENDIF (QT_${basename}_LIBRARY_DEBUG AND QT_${basename}_LIBRARY_RELEASE)\n\n      SET(QT_${basename}_LIBRARY ${QT_${basename}_LIBRARY} CACHE FILEPATH \"The Qt ${basename} library\")\n\n      IF (QT_${basename}_LIBRARY)\n        SET(QT_${basename}_FOUND 1)\n      ENDIF (QT_${basename}_LIBRARY)\n\n    ENDIF (QT_${basename}_LIBRARY_RELEASE OR QT_${basename}_LIBRARY_DEBUG)\n\n    IF (QT_${basename}_INCLUDE_DIR)\n      #add the include directory to QT_INCLUDES\n      SET(QT_INCLUDES \"${QT_${basename}_INCLUDE_DIR}\" ${QT_INCLUDES})\n    ENDIF (QT_${basename}_INCLUDE_DIR)\n\n    # Make variables changeble to the advanced user\n    MARK_AS_ADVANCED(QT_${basename}_LIBRARY QT_${basename}_LIBRARY_RELEASE QT_${basename}_LIBRARY_DEBUG QT_${basename}_INCLUDE_DIR)\n  ENDMACRO (_QT4_ADJUST_LIB_VARS)\n\n\n  # Set QT_xyz_LIBRARY variable and add \n  # library include path to QT_INCLUDES\n  _QT4_ADJUST_LIB_VARS(QTCORE)\n  _QT4_ADJUST_LIB_VARS(QTGUI)\n  _QT4_ADJUST_LIB_VARS(QT3SUPPORT)\n  _QT4_ADJUST_LIB_VARS(QTASSISTANT)\n  _QT4_ADJUST_LIB_VARS(QTDESIGNER)\n  _QT4_ADJUST_LIB_VARS(QTDESIGNERCOMPONENTS)\n  _QT4_ADJUST_LIB_VARS(QTNETWORK)\n  _QT4_ADJUST_LIB_VARS(QTNSPLUGIN)\n  _QT4_ADJUST_LIB_VARS(QTOPENGL)\n  _QT4_ADJUST_LIB_VARS(QTSQL)\n  _QT4_ADJUST_LIB_VARS(QTXML)\n  _QT4_ADJUST_LIB_VARS(QTSVG)\n  _QT4_ADJUST_LIB_VARS(QTSCRIPT)\n  _QT4_ADJUST_LIB_VARS(QTUITOOLS)\n  _QT4_ADJUST_LIB_VARS(QTTEST)\n  _QT4_ADJUST_LIB_VARS(QTDBUS)\n  _QT4_ADJUST_LIB_VARS(QTASSISTANTCLIENT)\n  _QT4_ADJUST_LIB_VARS(QTHELP)\n  _QT4_ADJUST_LIB_VARS(QTWEBKIT)\n  _QT4_ADJUST_LIB_VARS(QTXMLPATTERNS)\n  _QT4_ADJUST_LIB_VARS(PHONON)\n  _QT4_ADJUST_LIB_VARS(QTCLUCENE)\n\n  # platform dependent libraries\n  IF(Q_WS_X11)\n    _QT4_ADJUST_LIB_VARS(QTMOTIF)\n  ENDIF(Q_WS_X11)\n  IF(WIN32)\n    _QT4_ADJUST_LIB_VARS(QTMAIN)\n  ENDIF(WIN32)\n  \n\n  #######################################\n  #\n  #       Check the executables of Qt \n  #          ( moc, uic, rcc )\n  #\n  #######################################\n\n\n  # find moc and uic using qmake\n  QT_QUERY_QMAKE(QT_MOC_EXECUTABLE_INTERNAL \"QMAKE_MOC\")\n  QT_QUERY_QMAKE(QT_UIC_EXECUTABLE_INTERNAL \"QMAKE_UIC\")\n\n  # make sure we have / and not \\ as qmake gives on windows\n  FILE(TO_CMAKE_PATH \n    \"${QT_MOC_EXECUTABLE_INTERNAL}\" QT_MOC_EXECUTABLE_INTERNAL)\n  # make sure we have / and not \\ as qmake gives on windows\n  FILE(TO_CMAKE_PATH \n    \"${QT_UIC_EXECUTABLE_INTERNAL}\" QT_UIC_EXECUTABLE_INTERNAL)\n\n  SET(QT_MOC_EXECUTABLE \n    ${QT_MOC_EXECUTABLE_INTERNAL} CACHE FILEPATH \"The moc executable\")\n  SET(QT_UIC_EXECUTABLE \n    ${QT_UIC_EXECUTABLE_INTERNAL} CACHE FILEPATH \"The uic executable\")\n\n  FIND_PROGRAM(QT_UIC3_EXECUTABLE\n    NAMES uic3\n    PATHS ${QT_BINARY_DIR}\n    NO_DEFAULT_PATH\n    )\n\n  FIND_PROGRAM(QT_RCC_EXECUTABLE \n    NAMES rcc\n    PATHS ${QT_BINARY_DIR}\n    NO_DEFAULT_PATH\n    )\n\n  FIND_PROGRAM(QT_DBUSCPP2XML_EXECUTABLE \n    NAMES qdbuscpp2xml\n    PATHS ${QT_BINARY_DIR}\n    NO_DEFAULT_PATH\n    )\n\n  FIND_PROGRAM(QT_DBUSXML2CPP_EXECUTABLE \n    NAMES qdbusxml2cpp\n    PATHS ${QT_BINARY_DIR}\n    NO_DEFAULT_PATH\n    )\n\n  FIND_PROGRAM(QT_LUPDATE_EXECUTABLE\n    NAMES lupdate\n    PATHS ${QT_BINARY_DIR}\n    NO_DEFAULT_PATH\n    )\n\n  FIND_PROGRAM(QT_LRELEASE_EXECUTABLE\n    NAMES lrelease\n    PATHS ${QT_BINARY_DIR}\n    NO_DEFAULT_PATH\n    )\n\n  IF (QT_MOC_EXECUTABLE)\n     SET(QT_WRAP_CPP \"YES\")\n  ENDIF (QT_MOC_EXECUTABLE)\n\n  IF (QT_UIC_EXECUTABLE)\n     SET(QT_WRAP_UI \"YES\")\n  ENDIF (QT_UIC_EXECUTABLE)\n\n\n\n  MARK_AS_ADVANCED( QT_UIC_EXECUTABLE QT_UIC3_EXECUTABLE QT_MOC_EXECUTABLE\n    QT_RCC_EXECUTABLE QT_DBUSXML2CPP_EXECUTABLE QT_DBUSCPP2XML_EXECUTABLE\n    QT_LUPDATE_EXECUTABLE QT_LRELEASE_EXECUTABLE)\n\n  ######################################\n  #\n  #       Macros for building Qt files\n  #\n  ######################################\n\n  MACRO (QT4_EXTRACT_OPTIONS _qt4_files _qt4_options)\n    SET(${_qt4_files})\n    SET(${_qt4_options})\n    SET(_QT4_DOING_OPTIONS FALSE)\n    FOREACH(_currentArg ${ARGN})\n      IF (\"${_currentArg}\" STREQUAL \"OPTIONS\")\n        SET(_QT4_DOING_OPTIONS TRUE)\n      ELSE (\"${_currentArg}\" STREQUAL \"OPTIONS\")\n        IF(_QT4_DOING_OPTIONS) \n          LIST(APPEND ${_qt4_options} \"${_currentArg}\")\n        ELSE(_QT4_DOING_OPTIONS)\n          LIST(APPEND ${_qt4_files} \"${_currentArg}\")\n        ENDIF(_QT4_DOING_OPTIONS)\n      ENDIF (\"${_currentArg}\" STREQUAL \"OPTIONS\")\n    ENDFOREACH(_currentArg) \n  ENDMACRO (QT4_EXTRACT_OPTIONS)\n  \n  # macro used to create the names of output files preserving relative dirs\n  MACRO (QT4_MAKE_OUTPUT_FILE infile prefix ext outfile )\n    STRING(LENGTH ${CMAKE_CURRENT_BINARY_DIR} _binlength)\n    STRING(LENGTH ${infile} _infileLength)\n    SET(_checkinfile ${CMAKE_CURRENT_SOURCE_DIR})\n    IF(_infileLength GREATER _binlength)\n      STRING(SUBSTRING \"${infile}\" 0 ${_binlength} _checkinfile)\n    ENDIF(_infileLength GREATER _binlength)\n    IF(CMAKE_CURRENT_BINARY_DIR MATCHES \"${_checkinfile}\")\n      FILE(RELATIVE_PATH rel ${CMAKE_CURRENT_BINARY_DIR} ${infile})\n    ELSE(CMAKE_CURRENT_BINARY_DIR MATCHES \"${_checkinfile}\")\n      FILE(RELATIVE_PATH rel ${CMAKE_CURRENT_SOURCE_DIR} ${infile})\n    ENDIF(CMAKE_CURRENT_BINARY_DIR MATCHES \"${_checkinfile}\")\n    SET(_outfile \"${CMAKE_CURRENT_BINARY_DIR}/${rel}\")\n    STRING(REPLACE \"..\" \"__\" _outfile ${_outfile})\n    GET_FILENAME_COMPONENT(outpath ${_outfile} PATH)\n    GET_FILENAME_COMPONENT(_outfile ${_outfile} NAME_WE)\n    FILE(MAKE_DIRECTORY ${outpath})\n    SET(${outfile} ${outpath}/${prefix}${_outfile}.${ext})\n  ENDMACRO (QT4_MAKE_OUTPUT_FILE )\n\n  MACRO (QT4_GET_MOC_FLAGS _moc_flags)\n     SET(${_moc_flags})\n     GET_DIRECTORY_PROPERTY(_inc_DIRS INCLUDE_DIRECTORIES)\n\n     FOREACH(_current ${_inc_DIRS})\n        SET(${_moc_flags} ${${_moc_flags}} \"-I${_current}\")\n     ENDFOREACH(_current ${_inc_DIRS})\n     \n     GET_DIRECTORY_PROPERTY(_defines COMPILE_DEFINITIONS)\n     FOREACH(_current ${_defines})\n        SET(${_moc_flags} ${${_moc_flags}} \"-D${_current}\")\n     ENDFOREACH(_current ${_defines})\n\n     IF(Q_WS_WIN)\n       SET(${_moc_flags} ${${_moc_flags}} -DWIN32)\n     ENDIF(Q_WS_WIN)\n\n  ENDMACRO(QT4_GET_MOC_FLAGS)\n\n  # helper macro to set up a moc rule\n  MACRO (QT4_CREATE_MOC_COMMAND infile outfile moc_flags moc_options)\n    # For Windows, create a parameters file to work around command line length limit\n    IF (WIN32)\n      # Pass the parameters in a file.  Set the working directory to\n      # be that containing the parameters file and reference it by\n      # just the file name.  This is necessary because the moc tool on\n      # MinGW builds does not seem to handle spaces in the path to the\n      # file given with the @ syntax.\n      GET_FILENAME_COMPONENT(_moc_outfile_name \"${outfile}\" NAME)\n      GET_FILENAME_COMPONENT(_moc_outfile_dir \"${outfile}\" PATH)\n      IF(_moc_outfile_dir)\n        SET(_moc_working_dir WORKING_DIRECTORY ${_moc_outfile_dir})\n      ENDIF(_moc_outfile_dir)\n      SET (_moc_parameters_file ${outfile}_parameters)\n      SET (_moc_parameters ${moc_flags} ${moc_options} -o \"${outfile}\" \"${infile}\")\n      FILE (REMOVE ${_moc_parameters_file})\n      FOREACH(arg ${_moc_parameters})\n        FILE (APPEND ${_moc_parameters_file} \"${arg}\\n\")\n      ENDFOREACH(arg)\n      ADD_CUSTOM_COMMAND(OUTPUT ${outfile}\n                         COMMAND ${QT_MOC_EXECUTABLE} @${_moc_outfile_name}_parameters\n                         DEPENDS ${infile}\n                         ${_moc_working_dir}\n                         VERBATIM)\n    ELSE (WIN32)     \n      ADD_CUSTOM_COMMAND(OUTPUT ${outfile}\n                         COMMAND ${QT_MOC_EXECUTABLE}\n                         ARGS ${moc_flags} ${moc_options} -o ${outfile} ${infile}\n                         DEPENDS ${infile})     \n    ENDIF (WIN32)\n  ENDMACRO (QT4_CREATE_MOC_COMMAND)\n\n  \n  MACRO (QT4_GENERATE_MOC infile outfile )\n     QT4_GET_MOC_FLAGS(moc_flags)\n     GET_FILENAME_COMPONENT(abs_infile ${infile} ABSOLUTE)\n     QT4_CREATE_MOC_COMMAND(${abs_infile} ${outfile} \"${moc_flags}\" \"\")\n     SET_SOURCE_FILES_PROPERTIES(${outfile} PROPERTIES SKIP_AUTOMOC TRUE)  # dont run automoc on this file\n  ENDMACRO (QT4_GENERATE_MOC)\n\n\n  # QT4_WRAP_CPP(outfiles inputfile ... )\n\n  MACRO (QT4_WRAP_CPP outfiles )\n    # get include dirs\n    QT4_GET_MOC_FLAGS(moc_flags)\n    QT4_EXTRACT_OPTIONS(moc_files moc_options ${ARGN})\n\n    FOREACH (it ${moc_files})\n      GET_FILENAME_COMPONENT(it ${it} ABSOLUTE)\n      QT4_MAKE_OUTPUT_FILE(${it} moc_ cxx outfile)\n      QT4_CREATE_MOC_COMMAND(${it} ${outfile} \"${moc_flags}\" \"${moc_options}\")\n      SET(${outfiles} ${${outfiles}} ${outfile})\n    ENDFOREACH(it)\n\n  ENDMACRO (QT4_WRAP_CPP)\n\n\n  # QT4_WRAP_UI(outfiles inputfile ... )\n\n  MACRO (QT4_WRAP_UI outfiles )\n    QT4_EXTRACT_OPTIONS(ui_files ui_options ${ARGN})\n\n    FOREACH (it ${ui_files})\n      GET_FILENAME_COMPONENT(outfile ${it} NAME_WE)\n      GET_FILENAME_COMPONENT(infile ${it} ABSOLUTE)\n      SET(outfile ${CMAKE_CURRENT_BINARY_DIR}/ui_${outfile}.h)\n      ADD_CUSTOM_COMMAND(OUTPUT ${outfile}\n        COMMAND ${QT_UIC_EXECUTABLE}\n        ARGS ${ui_options} -o ${outfile} ${infile}\n        MAIN_DEPENDENCY ${infile})\n      SET(${outfiles} ${${outfiles}} ${outfile})\n    ENDFOREACH (it)\n\n  ENDMACRO (QT4_WRAP_UI)\n\n\n  # QT4_ADD_RESOURCES(outfiles inputfile ... )\n\n  MACRO (QT4_ADD_RESOURCES outfiles )\n    QT4_EXTRACT_OPTIONS(rcc_files rcc_options ${ARGN})\n\n    FOREACH (it ${rcc_files})\n      GET_FILENAME_COMPONENT(outfilename ${it} NAME_WE)\n      GET_FILENAME_COMPONENT(infile ${it} ABSOLUTE)\n      GET_FILENAME_COMPONENT(rc_path ${infile} PATH)\n      SET(outfile ${CMAKE_CURRENT_BINARY_DIR}/qrc_${outfilename}.cxx)\n      #  parse file for dependencies \n      #  all files are absolute paths or relative to the location of the qrc file\n      FILE(READ \"${infile}\" _RC_FILE_CONTENTS)\n      STRING(REGEX MATCHALL \"<file[^<]+\" _RC_FILES \"${_RC_FILE_CONTENTS}\")\n      SET(_RC_DEPENDS)\n      FOREACH(_RC_FILE ${_RC_FILES})\n        STRING(REGEX REPLACE \"^<file[^>]*>\" \"\" _RC_FILE \"${_RC_FILE}\")\n        STRING(REGEX MATCH \"^/|([A-Za-z]:/)\" _ABS_PATH_INDICATOR \"${_RC_FILE}\")\n        IF(NOT _ABS_PATH_INDICATOR)\n          SET(_RC_FILE \"${rc_path}/${_RC_FILE}\")\n        ENDIF(NOT _ABS_PATH_INDICATOR)\n        SET(_RC_DEPENDS ${_RC_DEPENDS} \"${_RC_FILE}\")\n      ENDFOREACH(_RC_FILE)\n      ADD_CUSTOM_COMMAND(OUTPUT ${outfile}\n        COMMAND ${QT_RCC_EXECUTABLE}\n        ARGS ${rcc_options} -name ${outfilename} -o ${outfile} ${infile}\n        MAIN_DEPENDENCY ${infile}\n        DEPENDS ${_RC_DEPENDS})\n      SET(${outfiles} ${${outfiles}} ${outfile})\n    ENDFOREACH (it)\n\n  ENDMACRO (QT4_ADD_RESOURCES)\n\n  MACRO(QT4_ADD_DBUS_INTERFACE _sources _interface _basename)\n    GET_FILENAME_COMPONENT(_infile ${_interface} ABSOLUTE)\n    SET(_header ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.h)\n    SET(_impl   ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.cpp)\n    SET(_moc    ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.moc)\n  \n    ADD_CUSTOM_COMMAND(OUTPUT ${_impl} ${_header}\n        COMMAND ${QT_DBUSXML2CPP_EXECUTABLE} -m -p ${_basename} ${_infile}\n        DEPENDS ${_infile})\n  \n    SET_SOURCE_FILES_PROPERTIES(${_impl} PROPERTIES SKIP_AUTOMOC TRUE)\n    \n    QT4_GENERATE_MOC(${_header} ${_moc})\n  \n    SET(${_sources} ${${_sources}} ${_impl} ${_header} ${_moc})\n    MACRO_ADD_FILE_DEPENDENCIES(${_impl} ${_moc})\n  \n  ENDMACRO(QT4_ADD_DBUS_INTERFACE)\n  \n  \n  MACRO(QT4_ADD_DBUS_INTERFACES _sources)\n     FOREACH (_current_FILE ${ARGN})\n        GET_FILENAME_COMPONENT(_infile ${_current_FILE} ABSOLUTE)\n        # get the part before the \".xml\" suffix\n        STRING(REGEX REPLACE \"(.*[/\\\\.])?([^\\\\.]+)\\\\.xml\" \"\\\\2\" _basename ${_current_FILE})\n        STRING(TOLOWER ${_basename} _basename)\n        QT4_ADD_DBUS_INTERFACE(${_sources} ${_infile} ${_basename}interface)\n     ENDFOREACH (_current_FILE)\n  ENDMACRO(QT4_ADD_DBUS_INTERFACES)\n  \n  \n  MACRO(QT4_GENERATE_DBUS_INTERFACE _header) # _customName )\n    SET(_customName \"${ARGV1}\")\n    GET_FILENAME_COMPONENT(_in_file ${_header} ABSOLUTE)\n    GET_FILENAME_COMPONENT(_basename ${_header} NAME_WE)\n    \n    IF (_customName)\n      SET(_target ${CMAKE_CURRENT_BINARY_DIR}/${_customName})\n    ELSE (_customName)\n      SET(_target ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.xml)\n    ENDIF (_customName)\n  \n    ADD_CUSTOM_COMMAND(OUTPUT ${_target}\n        COMMAND ${QT_DBUSCPP2XML_EXECUTABLE} ${_in_file} > ${_target}\n        DEPENDS ${_in_file}\n    )\n  ENDMACRO(QT4_GENERATE_DBUS_INTERFACE)\n  \n  \n  MACRO(QT4_ADD_DBUS_ADAPTOR _sources _xml_file _include _parentClass) # _optionalBasename )\n    GET_FILENAME_COMPONENT(_infile ${_xml_file} ABSOLUTE)\n    \n    SET(_optionalBasename \"${ARGV4}\")\n    IF (_optionalBasename)\n       SET(_basename ${_optionalBasename} )\n    ELSE (_optionalBasename)\n       STRING(REGEX REPLACE \"(.*[/\\\\.])?([^\\\\.]+)\\\\.xml\" \"\\\\2adaptor\" _basename ${_infile})\n       STRING(TOLOWER ${_basename} _basename)\n    ENDIF (_optionalBasename)\n\n    SET(_optionalClassName \"${ARGV5}\")\n    SET(_header ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.h)\n    SET(_impl   ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.cpp)\n    SET(_moc    ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.moc)\n\n    IF(_optionalClassName)\n       ADD_CUSTOM_COMMAND(OUTPUT ${_impl} ${_header}\n          COMMAND ${QT_DBUSXML2CPP_EXECUTABLE} -m -a ${_basename} -c ${_optionalClassName} -i ${_include} -l ${_parentClass} ${_infile}\n          DEPENDS ${_infile}\n        )\n    ELSE(_optionalClassName)\n       ADD_CUSTOM_COMMAND(OUTPUT ${_impl} ${_header}\n          COMMAND ${QT_DBUSXML2CPP_EXECUTABLE} -m -a ${_basename} -i ${_include} -l ${_parentClass} ${_infile}\n          DEPENDS ${_infile}\n        )\n    ENDIF(_optionalClassName)\n\n    QT4_GENERATE_MOC(${_header} ${_moc})\n    SET_SOURCE_FILES_PROPERTIES(${_impl} PROPERTIES SKIP_AUTOMOC TRUE)\n    MACRO_ADD_FILE_DEPENDENCIES(${_impl} ${_moc})\n\n    SET(${_sources} ${${_sources}} ${_impl} ${_header} ${_moc})\n  ENDMACRO(QT4_ADD_DBUS_ADAPTOR)\n\n   MACRO(QT4_AUTOMOC)\n      QT4_GET_MOC_FLAGS(_moc_INCS)\n\n      SET(_matching_FILES )\n      FOREACH (_current_FILE ${ARGN})\n\n         GET_FILENAME_COMPONENT(_abs_FILE ${_current_FILE} ABSOLUTE)\n         # if \"SKIP_AUTOMOC\" is set to true, we will not handle this file here.\n         # This is required to make uic work correctly:\n         # we need to add generated .cpp files to the sources (to compile them),\n         # but we cannot let automoc handle them, as the .cpp files don't exist yet when\n         # cmake is run for the very first time on them -> however the .cpp files might\n         # exist at a later run. at that time we need to skip them, so that we don't add two\n         # different rules for the same moc file\n         GET_SOURCE_FILE_PROPERTY(_skip ${_abs_FILE} SKIP_AUTOMOC)\n\n         IF ( NOT _skip AND EXISTS ${_abs_FILE} )\n\n            FILE(READ ${_abs_FILE} _contents)\n\n            GET_FILENAME_COMPONENT(_abs_PATH ${_abs_FILE} PATH)\n\n            STRING(REGEX MATCHALL \"#include +[^ ]+\\\\.moc[\\\">]\" _match \"${_contents}\")\n            IF(_match)\n               FOREACH (_current_MOC_INC ${_match})\n                  STRING(REGEX MATCH \"[^ <\\\"]+\\\\.moc\" _current_MOC \"${_current_MOC_INC}\")\n                  GET_FILENAME_COMPONENT(_basename ${_current_MOC} NAME_WE)\n                  SET(_header ${_abs_PATH}/${_basename}.h)\n                  SET(_moc    ${CMAKE_CURRENT_BINARY_DIR}/${_current_MOC})\n                  QT4_CREATE_MOC_COMMAND(${_header} ${_moc} \"${_moc_INCS}\" \"\")\n                  MACRO_ADD_FILE_DEPENDENCIES(${_abs_FILE} ${_moc})\n               ENDFOREACH (_current_MOC_INC)\n            ENDIF(_match)\n         ENDIF ( NOT _skip AND EXISTS ${_abs_FILE} )\n      ENDFOREACH (_current_FILE)\n   ENDMACRO(QT4_AUTOMOC)\n\n   MACRO(QT4_CREATE_TRANSLATION _qm_files)\n      QT4_EXTRACT_OPTIONS(_lupdate_files _lupdate_options ${ARGN})\n      MESSAGE(\"lupdate_files ${_lupdate_files}\")\n      MESSAGE(\"lupdate_options ${_lupdate_options}\")\n      SET(_my_sources)\n      SET(_my_tsfiles)\n      FOREACH (_file ${_lupdate_files})\n         GET_FILENAME_COMPONENT(_ext ${_file} EXT)\n         GET_FILENAME_COMPONENT(_abs_FILE ${_file} ABSOLUTE)\n         IF(_ext MATCHES \"ts\")\n           LIST(APPEND _my_tsfiles ${_abs_FILE})\n         ELSE(_ext MATCHES \"ts\")\n           LIST(APPEND _my_sources ${_abs_FILE})\n         ENDIF(_ext MATCHES \"ts\")\n      ENDFOREACH(_file)\n      FOREACH(_ts_file ${_my_tsfiles})\n        ADD_CUSTOM_COMMAND(OUTPUT ${_ts_file}\n           COMMAND ${QT_LUPDATE_EXECUTABLE}\n           ARGS ${_lupdate_options} ${_my_sources} -ts ${_ts_file}\n           DEPENDS ${_my_sources})\n      ENDFOREACH(_ts_file)\n      QT4_ADD_TRANSLATION(${_qm_files} ${_my_tsfiles})\n   ENDMACRO(QT4_CREATE_TRANSLATION)\n\n   MACRO(QT4_ADD_TRANSLATION _qm_files)\n      FOREACH (_current_FILE ${ARGN})\n         GET_FILENAME_COMPONENT(_abs_FILE ${_current_FILE} ABSOLUTE)\n         GET_FILENAME_COMPONENT(qm ${_abs_FILE} NAME_WE)\n         SET(qm \"${CMAKE_CURRENT_BINARY_DIR}/${qm}.qm\")\n\n         ADD_CUSTOM_COMMAND(OUTPUT ${qm}\n            COMMAND ${QT_LRELEASE_EXECUTABLE}\n            ARGS ${_abs_FILE} -qm ${qm}\n            DEPENDS ${_abs_FILE}\n         )\n         SET(${_qm_files} ${${_qm_files}} ${qm})\n      ENDFOREACH (_current_FILE)\n   ENDMACRO(QT4_ADD_TRANSLATION)\n\n\n\n\n\n  ######################################\n  #\n  #       decide if Qt got found\n  #\n  ######################################\n\n  # if the includes,libraries,moc,uic and rcc are found then we have it\n  IF( QT_LIBRARY_DIR AND QT_INCLUDE_DIR AND QT_MOC_EXECUTABLE AND \n      QT_UIC_EXECUTABLE AND QT_RCC_EXECUTABLE AND QT_QTCORE_LIBRARY)\n    SET( QT4_FOUND \"YES\" )\n    INCLUDE(FindPackageMessage)\n    FIND_PACKAGE_MESSAGE(Qt4 \"Found Qt-Version ${QTVERSION}\"\n      \"[${QT_LIBRARY_DIR}][${QT_INCLUDE_DIR}][${QT_MOC_EXECUTABLE}][${QT_UIC_EXECUTABLE}][${QT_RCC_EXECUTABLE}]\")\n  ELSE( QT_LIBRARY_DIR AND QT_INCLUDE_DIR AND QT_MOC_EXECUTABLE AND\n        QT_UIC_EXECUTABLE AND QT_RCC_EXECUTABLE AND QT_QTCORE_LIBRARY)\n    SET( QT4_FOUND \"NO\")\n    SET(QT_QMAKE_EXECUTABLE \"${QT_QMAKE_EXECUTABLE}-NOTFOUND\" CACHE FILEPATH \"Invalid qmake found\" FORCE)\n    IF( Qt4_FIND_REQUIRED)\n      MESSAGE( FATAL_ERROR \"Qt libraries, includes, moc, uic or/and rcc NOT found!\")\n    ENDIF( Qt4_FIND_REQUIRED)\n  ENDIF( QT_LIBRARY_DIR AND QT_INCLUDE_DIR AND QT_MOC_EXECUTABLE AND \n         QT_UIC_EXECUTABLE AND  QT_RCC_EXECUTABLE AND QT_QTCORE_LIBRARY)\n  \n  SET(QT_FOUND ${QT4_FOUND})\n\n\n  #######################################\n  #\n  #       Qt configuration\n  #\n  #######################################\n  IF(EXISTS \"${QT_MKSPECS_DIR}/qconfig.pri\")\n    FILE(READ ${QT_MKSPECS_DIR}/qconfig.pri _qconfig_FILE_contents)\n    STRING(REGEX MATCH \"QT_CONFIG[^\\n]+\" QT_QCONFIG \"${_qconfig_FILE_contents}\")\n    STRING(REGEX MATCH \"CONFIG[^\\n]+\" QT_CONFIG \"${_qconfig_FILE_contents}\")\n    STRING(REGEX MATCH \"EDITION[^\\n]+\" QT_EDITION \"${_qconfig_FILE_contents}\")\n  ENDIF(EXISTS \"${QT_MKSPECS_DIR}/qconfig.pri\")\n  IF(\"${QT_EDITION}\" MATCHES \"DesktopLight\")\n    SET(QT_EDITION_DESKTOPLIGHT 1)\n  ENDIF(\"${QT_EDITION}\" MATCHES \"DesktopLight\")\n\n  \n  ###############################################\n  #\n  #       configuration/system dependent settings  \n  #\n  ###############################################\n  \n  # find dependencies for some Qt modules\n  # when doing builds against a static Qt, they are required\n  # when doing builds against a shared Qt, they are sometimes not required\n  # even some Linux distros do not require these dependencies\n  # if a user needs the dependencies, and they couldn't be found, they can set\n  # the variables themselves.\n\n  SET(QT_QTGUI_LIB_DEPENDENCIES \"\")\n  SET(QT_QTCORE_LIB_DEPENDENCIES \"\")\n  SET(QT_QTNETWORK_LIB_DEPENDENCIES \"\")\n  SET(QT_QTOPENGL_LIB_DEPENDENCIES \"\")\n  SET(QT_QTDBUS_LIB_DEPENDENCIES \"\")\n  SET(QT_QTHELP_LIB_DEPENDENCIES ${QT_QTCLUCENE_LIBRARY})\n  \n  # build using shared Qt needs -DQT_DLL\n  IF(NOT QT_CONFIG MATCHES \"static\")\n    # warning currently only qconfig.pri on Windows potentially contains \"static\"\n    # so QT_DLL might not get defined properly on other platforms.\n    SET(QT_DEFINITIONS ${QT_DEFINITIONS} -DQT_DLL)\n  ENDIF(NOT QT_CONFIG MATCHES \"static\")\n  \n  # QtOpenGL dependencies\n  QT_QUERY_QMAKE(QMAKE_LIBS_OPENGL \"QMAKE_LIBS_OPENGL\")\n  SET (QT_QTOPENGL_LIB_DEPENDENCIES ${QT_QTOPENGL_LIB_DEPENDENCIES} ${QMAKE_LIBS_OPENGL})\n  \n  IF(Q_WS_X11)\n    # X11 libraries Qt absolutely depends on\n    QT_QUERY_QMAKE(QT_LIBS_X11 \"QMAKE_LIBS_X11\")\n    SEPARATE_ARGUMENTS(QT_LIBS_X11)\n    FOREACH(QT_X11_LIB ${QT_LIBS_X11})\n      STRING(REGEX REPLACE \"-l\" \"\" QT_X11_LIB \"${QT_X11_LIB}\")\n      SET(QT_TMP_STR \"QT_X11_${QT_X11_LIB}_LIBRARY\")\n      FIND_LIBRARY(${QT_TMP_STR} NAMES \"${QT_X11_LIB}\" PATHS ${QMAKE_LIBDIR_X11})\n      IF(${QT_TMP_STR})\n        SET(QT_QTGUI_LIB_DEPENDENCIES ${QT_QTGUI_LIB_DEPENDENCIES} ${${QT_TMP_STR}})\n        MARK_AS_ADVANCED(${QT_TMP_STR})\n      ENDIF(${QT_TMP_STR})\n    ENDFOREACH(QT_X11_LIB)\n\n    QT_QUERY_QMAKE(QT_LIBS_THREAD \"QMAKE_LIBS_THREAD\")\n    SET(QT_QTCORE_LIB_DEPENDENCIES ${QT_QTCORE_LIB_DEPENDENCIES} ${QT_LIBS_THREAD})\n    \n    QT_QUERY_QMAKE(QMAKE_LIBS_DYNLOAD \"QMAKE_LIBS_DYNLOAD\")\n    SET (QT_QTCORE_LIB_DEPENDENCIES ${QT_QTCORE_LIB_DEPENDENCIES} ${QMAKE_LIBS_DYNLOAD})\n\n  ENDIF(Q_WS_X11)\n  \n  IF(Q_WS_WIN)\n    SET(QT_QTGUI_LIB_DEPENDENCIES ${QT_QTGUI_LIB_DEPENDENCIES} imm32 winmm)\n    SET(QT_QTCORE_LIB_DEPENDENCIES ${QT_QTCORE_LIB_DEPENDENCIES} ws2_32)\n  ENDIF(Q_WS_WIN)\n  \n  IF(Q_WS_MAC)\n    SET(QT_QTGUI_LIB_DEPENDENCIES ${QT_QTGUI_LIB_DEPENDENCIES} \"-framework Carbon\")\n    \n    # Qt 4.0, 4.1, 4.2 use QuickTime\n    IF(QT_VERSION_MINOR LESS 3)\n      SET(QT_QTGUI_LIB_DEPENDENCIES ${QT_QTGUI_LIB_DEPENDENCIES} \"-framework QuickTime\")\n    ENDIF(QT_VERSION_MINOR LESS 3)\n    \n    # Qt 4.2+ use AppKit\n    IF(QT_VERSION_MINOR GREATER 1)\n      SET(QT_QTGUI_LIB_DEPENDENCIES ${QT_QTGUI_LIB_DEPENDENCIES} \"-framework AppKit\")\n    ENDIF(QT_VERSION_MINOR GREATER 1)\n\n    SET(QT_QTCORE_LIB_DEPENDENCIES ${QT_QTCORE_LIB_DEPENDENCIES} \"-framework ApplicationServices\")\n  ENDIF(Q_WS_MAC)\n\n  #######################################\n  #\n  #       compatibility settings \n  #\n  #######################################\n  # Backwards compatibility for CMake1.4 and 1.2\n  SET (QT_MOC_EXE ${QT_MOC_EXECUTABLE} )\n  SET (QT_UIC_EXE ${QT_UIC_EXECUTABLE} )\n\n  SET( QT_QT_LIBRARY \"\")\n\nELSE(QT4_QMAKE_FOUND)\n   \n   SET(QT_QMAKE_EXECUTABLE \"${QT_QMAKE_EXECUTABLE}-NOTFOUND\" CACHE FILEPATH \"Invalid qmake found\" FORCE)\n   IF(Qt4_FIND_REQUIRED)\n      IF(QT4_INSTALLED_VERSION_TOO_OLD)\n         MESSAGE(FATAL_ERROR \"The installed Qt version ${QTVERSION} is too old, at least version ${QT_MIN_VERSION} is required\")\n      ELSE(QT4_INSTALLED_VERSION_TOO_OLD)\n         MESSAGE( FATAL_ERROR \"Qt qmake not found!\")\n      ENDIF(QT4_INSTALLED_VERSION_TOO_OLD)\n   ELSE(Qt4_FIND_REQUIRED)\n      IF(QT4_INSTALLED_VERSION_TOO_OLD AND NOT Qt4_FIND_QUIETLY)\n         MESSAGE(STATUS \"The installed Qt version ${QTVERSION} is too old, at least version ${QT_MIN_VERSION} is required\")\n      ENDIF(QT4_INSTALLED_VERSION_TOO_OLD AND NOT Qt4_FIND_QUIETLY)\n   ENDIF(Qt4_FIND_REQUIRED)\n \nENDIF (QT4_QMAKE_FOUND)\n\n"
  },
  {
    "path": "libs/CoMISo/cmake/FindSUITESPARSE.cmake",
    "content": "# - Try to find SUITESPARSE\n# Once done this will define\n#  \n#  SUITESPARSE_FOUND            - system has SUITESPARSE\n#  SUITESPARSE_INCLUDE_DIRS     - the SUITESPARSE include directory\n#  SUITESPARSE_LIBRARIES        - Link these to use SUITESPARSE\n#  SUITESPARSE_SPQR_LIBRARY     - name of spqr library (necessary due to error in debian package)\n#  SUITESPARSE_SPQR_LIBRARY_DIR - name of spqr library (necessary due to error in debian package)\n#  SUITESPARSE_LIBRARY_DIR      - Library main directory containing suitesparse libs\n#  SUITESPARSE_LIBRARY_DIRS     - all Library directories containing suitesparse libs\n#  SUITESPARSE_SPQR_VALID       - automatic identification whether or not spqr package is installed correctly\n\nIF (SUITESPARSE_INCLUDE_DIRS)\n  # Already in cache, be silent\n  SET(SUITESPARSE_FIND_QUIETLY TRUE)\nENDIF (SUITESPARSE_INCLUDE_DIRS)\n\nif( WIN32 )\n   # Find cholmod part of the suitesparse library collection\n\n   FIND_PATH( CHOLMOD_INCLUDE_DIR cholmod.h\n              PATHS \"C:\\\\libs\\\\win32\\\\SuiteSparse\\\\Include\"  )\n\n   # Add cholmod include directory to collection include directories\n   IF ( CHOLMOD_INCLUDE_DIR )\n\tlist ( APPEND SUITESPARSE_INCLUDE_DIRS ${CHOLMOD_INCLUDE_DIR} )\n   ENDIF( CHOLMOD_INCLUDE_DIR )\n\n\n   # find path suitesparse library\n   FIND_PATH( SUITESPARSE_LIBRARY_DIRS \n\t         amd.lib\n               PATHS \"C:\\\\libs\\\\win32\\\\SuiteSparse\\\\libs\" )\n\n   # if we found the library, add it to the defined libraries\n   IF ( SUITESPARSE_LIBRARY_DIRS )\n\tlist ( APPEND SUITESPARSE_LIBRARIES optimized;amd;optimized;camd;optimized;ccolamd;optimized;cholmod;optimized;colamd;optimized;metis;optimized;spqr;optimized;umfpack;debug;amdd;debug;camdd;debug;ccolamdd;debug;cholmodd;debug;spqrd;debug;umfpackd;debug;colamdd;debug;metisd;optimized;blas;optimized;libf2c;optimized;lapack;debug;blasd;debug;libf2cd;debug;lapackd )\n   ENDIF( SUITESPARSE_LIBRARY_DIRS )  \n\nelse( WIN32 )\n   IF( APPLE)\n\t   FIND_PATH( CHOLMOD_INCLUDE_DIR cholmod.h\n        \t      PATHS  /opt/local/include/ufsparse\n        \t             /usr/local/include)\n\n           FIND_PATH( SUITESPARSE_LIBRARY_DIR\n                      NAMES libcholmod.a \n                      PATHS /opt/local/lib\n                            /usr/local/lib)\n\n\t  \n\n   ELSE(APPLE)\n\t   FIND_PATH( CHOLMOD_INCLUDE_DIR cholmod.h\n        \t      PATHS /usr/local/include \n        \t            /usr/include \n        \t            /usr/include/suitesparse/ \n        \t            ${CMAKE_SOURCE_DIR}/MacOS/Libs/cholmod\n              \t      PATH_SUFFIXES cholmod/ CHOLMOD/ )\n\n   \t\n           FIND_PATH( SUITESPARSE_LIBRARY_DIR\n                      NAMES libcholmod.so \n                      PATHS /usr/lib \n                            /usr/lib64 \n                            /usr/local/lib )\n\n\n   ENDIF(APPLE)\n\n   # Add cholmod include directory to collection include directories\n   IF ( CHOLMOD_INCLUDE_DIR )\n\tlist ( APPEND SUITESPARSE_INCLUDE_DIRS ${CHOLMOD_INCLUDE_DIR} )\n   ENDIF( CHOLMOD_INCLUDE_DIR )\n\n\n   # if we found the library, add it to the defined libraries\n   IF ( SUITESPARSE_LIBRARY_DIR )\n       list ( APPEND SUITESPARSE_LIBRARIES amd)\n       list ( APPEND SUITESPARSE_LIBRARIES btf)\n       list ( APPEND SUITESPARSE_LIBRARIES camd)\n       list ( APPEND SUITESPARSE_LIBRARIES ccolamd)\n       list ( APPEND SUITESPARSE_LIBRARIES cholmod)\n       list ( APPEND SUITESPARSE_LIBRARIES colamd)\n#       list ( APPEND SUITESPARSE_LIBRARIES csparse)\n       list ( APPEND SUITESPARSE_LIBRARIES cxsparse)\n       list ( APPEND SUITESPARSE_LIBRARIES klu)\n#       list ( APPEND SUITESPARSE_LIBRARIES spqr)\n       list ( APPEND SUITESPARSE_LIBRARIES umfpack)\n   \n       IF( APPLE )\n         list ( APPEND SUITESPARSE_LIBRARIES tbb)\n         list ( APPEND SUITESPARSE_LIBRARIES suitesparseconfig)\n       ENDIF( APPLE )\n   \n       # Metis and spqr are optional\n       FIND_LIBRARY( SUITESPARSE_METIS_LIBRARY\n                     NAMES metis\n                     PATHS ${SUITESPARSE_LIBRARY_DIR} )\n       IF (SUITESPARSE_METIS_LIBRARY)\t\t\t\n\t  list ( APPEND SUITESPARSE_LIBRARIES metis)\n       ENDIF(SUITESPARSE_METIS_LIBRARY)\n\n       if(EXISTS  \"${CHOLMOD_INCLUDE_DIR}/SuiteSparseQR.hpp\")\n\t  SET(SUITESPARSE_SPQR_VALID TRUE CACHE BOOL \"SuiteSparseSPQR valid\")\n       else()\n\t  SET(SUITESPARSE_SPQR_VALID false CACHE BOOL \"SuiteSparseSPQR valid\")\n       endif()\n\n       if(SUITESPARSE_SPQR_VALID)\n\t  FIND_LIBRARY( SUITESPARSE_SPQR_LIBRARY\n\t\t      NAMES spqr\n\t\t      PATHS ${SUITESPARSE_LIBRARY_DIR} )\n\t  IF (SUITESPARSE_SPQR_LIBRARY)\t\t\t\n\t    list ( APPEND SUITESPARSE_LIBRARIES spqr)\n\t  ENDIF (SUITESPARSE_SPQR_LIBRARY)\n       endif()\n       \n    ENDIF( SUITESPARSE_LIBRARY_DIR )  \n   \nendif( WIN32 )\n\n\nIF (SUITESPARSE_INCLUDE_DIRS AND SUITESPARSE_LIBRARIES)\n   IF(WIN32)\n    list (APPEND SUITESPARSE_INCLUDE_DIRS ${CHOLMOD_INCLUDE_DIR}/../../UFconfig )\n   ENDIF(WIN32)\n   SET(SUITESPARSE_FOUND TRUE)\nELSE (SUITESPARSE_INCLUDE_DIRS AND SUITESPARSE_LIBRARIES)\n   SET( SUITESPARSE_FOUND FALSE )\nENDIF (SUITESPARSE_INCLUDE_DIRS AND SUITESPARSE_LIBRARIES)\n\n"
  },
  {
    "path": "libs/CoMISo/cmake/FindTAO.cmake",
    "content": "if (TAO_INCLUDE_DIRS)\n  # Already in cache, be silent\n  SET(TAO_FIND_QUIETLY TRUE)\nendif (TAO_INCLUDE_DIRS)\n\nif (WIN32)\n   find_path(TAO_INCLUDE_DIR NAMES tao.h\n     PREFIXES SRC\n     PATHS\n     \"C:\\\\libs\\\\gurobi45\"\n     ${TAO_DIR}/include\n   )\n\n   find_library( TAO_LIBRARY_RELEASE \n                 SuperLU\n                 PATHS \"C:\\\\libs\\\\gurobi45\\\\lib\" )\n   find_library( TAO_LIBRARY_DEBUG\n                   SuperLUd\n                   PATHS \"C:\\\\libs\\\\gurobi45\\\\lib\" )\n\n\n   set ( TAO_LIBRARY \"optimized;${TAO_LIBRARY_RELEASE};debug;${TAO_LIBRARY_DEBUG}\" CACHE  STRING \"TAO Libraries\" )\n\nELSEIF(APPLE)\n\n   find_path(TAO_INCLUDE_DIR NAMES gurobi_c++.h\n\t     PATHS \"${CMAKE_SOURCE_DIR}/MacOS/Libs/gurobi40\"\n\t     \t   ${TAO_INCLUDE_PATH}\n            )\n\n   find_library( TAO_LIBRARY \n                 SuperLU\n                 PATHS \"${CMAKE_SOURCE_DIR}/MacOS/Libs/gurobi40\")\n\nELSE( WIN32 )\nfind_path(TAO_INCLUDE_DIR NAMES \"include/tao.h\"\n     PATHS \"$ENV{TAO_DIR}\"\n     /usr/include/tao\n   )\n   \n\n#   MESSAGE(STATUS \"$ENV{TAO_HOME}/include\")\n   IF(TAO_INCLUDE_DIR)\n      SET(TAO_FOUND TRUE)\n      SET(TAO_INCLUDE_DIRS \"${TAO_INCLUDE_DIR}/include;${TAO_INCLUDE_DIR}\")\n      SET(TAO_INCLUDE_DIR ${TAO_INCLUDE_DIR}/include;${TAO_INCLUDE_DIR} CACHE PATH \"Path to TAO Includes\")\n      \n      #check VERSION 1.x or 2\n      IF(IS_DIRECTORY \"$ENV{TAO_DIR}/lib/$ENV{PETSC_ARCH}/\")\n#        MESSAGE(STATUS \"TAO Version 1.x\")\n\tSET(TAO_LIBRARY_DIR \"$ENV{TAO_DIR}/lib/$ENV{PETSC_ARCH}/\" CACHE PATH \"Path to TAO Library\")\n\tSET(TAO_LIBRARY \"tao;taopetsc;taofortran\" CACHE STRING \"TAO Libraries\")  \n      ELSE(IS_DIRECTORY \"$ENV{TAO_DIR}/lib/$ENV{PETSC_ARCH}/\") #VERSION 2\n#        MESSAGE(STATUS \"TAO Version 2.x\")\n\tSET(TAO_LIBRARY_DIR \"$ENV{TAO_DIR}/$ENV{PETSC_ARCH}/lib\" CACHE PATH \"Path to TAO Library\")\n\tSET(TAO_LIBRARY \"tao\" CACHE STRING \"TAO Libraries\")  \n      ENDIF(IS_DIRECTORY \"$ENV{TAO_DIR}/lib/$ENV{PETSC_ARCH}/\")\n      \n      #      MESSAGE(STATUS \"${TAO_LIBRARY_DIR}\")\n#      MESSAGE(STATUS \"${TAO_LIBRARY}\")\n    ELSE(TAO_INCLUDE_DIR)\n      SET(TAO_FOUND FALSE)\n      SET(TAO_INCLUDE_DIR ${TAO_INCLUDE_DIR})\n    ENDIF(TAO_INCLUDE_DIR)\n\n   #find_library( TAO_LIBRARY \n    #             gurobi\n     #            PATHS \"${TAO_HOME}/lib\" )\nENDIF()"
  },
  {
    "path": "libs/CoMISo/cmake/FindTaucs.cmake",
    "content": "# - Find TAUCS\n# Find the native TAUCS headers and libraries.\n#\n#  TAUCS_INCLUDE_DIR -  where to find TAUCS.h, etc.\n#  TAUCS_LIBRARY     - List of libraries when using TAUCS.\n#  TAUCS_FOUND       - True if TAUCS found.\n\nIF (TAUCS_INCLUDE_DIR)\n  # Already in cache, be silent\n  SET(TAUCS_FIND_QUIETLY TRUE)\nENDIF (TAUCS_INCLUDE_DIR)\n\n\n# Look for the header file.\nIF(WIN32)\n      find_package(CGAL)\n\tif (NOT CGAL_FOUND)\n\t  message(FATAL_ERROR \"CGAL not found .. required to use taucs!\")\n\tendif()\n\t \n\tFIND_PATH(TAUCS_INCLUDE_DIR NAMES taucs.h\n                PATHS  \"${CGAL_TAUCS_DIR}/include\" )\n\t\t\t\t\nELSE(WIN32)\n\n    IF(APPLE)\n\tFIND_PATH(TAUCS_INCLUDE_DIR NAMES taucs.h\n                  PATHS \"${CMAKE_SOURCE_DIR}/MacOS/Libs/taucs/src\" \n                        ~/sw/taucs/include\n                 )\n\n    ELSE (APPLE)\n\n\tFIND_PATH(TAUCS_INCLUDE_DIR NAMES taucs.h\n                  PATHS  /ACG/acgdev/gcc-4.3-x86_64/taucs-2.2-gfortran/include\n                 )\n\n    ENDIF(APPLE)\n\n\nENDIF(WIN32)\n\n# Copy the results to the output variables.\nIF(TAUCS_INCLUDE_DIR )\n  SET(TAUCS_FOUND 1)\n  SET(TAUCS_INCLUDE_DIR ${TAUCS_INCLUDE_DIR})\n\n  IF(WIN32)\n\tfind_package(CGAL)\n\tSET(TAUCS_LIBRARY \"${CGAL_TAUCS_DIR}/lib/libtaucs.lib\" )\n  ELSE(WIN32)\n    IF(APPLE)\n\t    FIND_LIBRARY( TAUCS_LIBRARY\n        \t          NAMES taucs\n                \t  PATHS \"${CMAKE_SOURCE_DIR}/MacOS/Libs/taucs/lib/darwin9.0\" \n                                ~/sw/taucs/lib/darwin11\n\t               )\t\n    ELSE (APPLE)\n \t   FIND_LIBRARY( TAUCS_LIBRARY\n        \t          NAMES taucs \n                \t  PATHS /ACG/acgdev/gcc-4.3-x86_64/taucs-2.2.new/lib\n\t               )\n    ENDIF( APPLE)\n  ENDIF(WIN32)\n  \nELSE(TAUCS_INCLUDE_DIR )\n  SET(TAUCS_FOUND 0)\n  SET(TAUCS_INCLUDE_DIR)\nENDIF(TAUCS_INCLUDE_DIR )\n\n# Report the results.\nIF(NOT TAUCS_FOUND)\n  SET(TAUCS_DIR_MESSAGE\n    \"TAUCS was not found. Make sure TAUCS_INCLUDE_DIR is set to the directories containing the include and lib files for TAUCS. .\")\n  IF(TAUCS_FIND_REQUIRED)\n      MESSAGE(FATAL_ERROR \"${TAUCS_DIR_MESSAGE}\")\n  ELSEIF(NOT TAUCS_FIND_QUIETLY)\n    MESSAGE(STATUS \"${TAUCS_DIR_MESSAGE}\")\n  ELSE(NOT TAUCS_FIND_QUIETLY)\n  ENDIF(TAUCS_FIND_REQUIRED)\nELSE (NOT TAUCS_FOUND)\n  IF(NOT TAUCS_FIND_QUIETLY)\n    MESSAGE(STATUS \"Looking for TAUCS - found\")\n  ENDIF(NOT TAUCS_FIND_QUIETLY)\n  IF ( NOT WIN32 )\n    SET(TAUCS_LIBRARY \"${TAUCS_LIBRARY};metis\")\n  ELSE  ( NOT WIN32 )\n    SET(TAUCS_LIBRARY \"${TAUCS_LIBRARY}\")\n  ENDIF( NOT WIN32 )\nENDIF(NOT TAUCS_FOUND)\n\n"
  },
  {
    "path": "libs/CoMISo/cmake/ResolveCompilerPaths.cmake",
    "content": "# ResolveCompilerPaths - this module defines two macros\n#\n# RESOLVE_LIBRARIES (XXX_LIBRARIES LINK_LINE)\n#  This macro is intended to be used by FindXXX.cmake modules.\n#  It parses a compiler link line and resolves all libraries\n#  (-lfoo) using the library path contexts (-L/path) in scope.\n#  The result in XXX_LIBRARIES is the list of fully resolved libs.\n#  Example:\n#\n#    RESOLVE_LIBRARIES (FOO_LIBRARIES \"-L/A -la -L/B -lb -lc -ld\")\n#\n#  will be resolved to\n#\n#    FOO_LIBRARIES:STRING=\"/A/liba.so;/B/libb.so;/A/libc.so;/usr/lib/libd.so\"\n#\n#  if the filesystem looks like\n#\n#    /A:       liba.so libb.so libc.so\n#    /B:       liba.so libb.so\n#    /usr/lib: liba.so libb.so libc.so libd.so\n#\n#  and /usr/lib is a system directory.\n#\n#  Note: If RESOLVE_LIBRARIES() resolves a link line differently from\n#  the native linker, there is a bug in this macro (please report it).\n#\n# RESOLVE_INCLUDES (XXX_INCLUDES INCLUDE_LINE)\n#  This macro is intended to be used by FindXXX.cmake modules.\n#  It parses a compile line and resolves all includes\n#  (-I/path/to/include) to a list of directories.  Other flags are ignored.\n#  Example:\n#\n#    RESOLVE_INCLUDES (FOO_INCLUDES \"-I/A -DBAR='\\\"irrelevant -I/string here\\\"' -I/B\")\n#\n#  will be resolved to\n#\n#    FOO_INCLUDES:STRING=\"/A;/B\"\n#\n#  assuming both directories exist.\n#  Note: as currently implemented, the -I/string will be picked up mistakenly (cry, cry)\n\nmacro (RESOLVE_LIBRARIES LIBS LINK_LINE)\n  string (REGEX MATCHALL \"((-L|-l|-Wl)([^\\\" ]+|\\\"[^\\\"]+\\\")|/[^\\\" ]+(a|so|dll))\" _all_tokens \"${LINK_LINE}\")\n  set (_libs_found)\n  set (_directory_stack)\n  foreach (token ${_all_tokens})\n    if (token MATCHES \"-L([^\\\" ]+|\\\"[^\\\"]+\\\")\")\n      # If it's a library path, push it on the stack\n      string (REGEX REPLACE \"^-L\" \"\" token ${token})\n      string (REGEX REPLACE \"//\" \"/\" token ${token})\n      list (INSERT _directory_stack 0 ${token})\n    elseif (token MATCHES \"^(-l([^\\\" ]+|\\\"[^\\\"]+\\\")|/[^\\\" ]+(a|so|dll))\")\n      # It's a library, resolve the path by looking in the stack and then (by default) in system directories\n      string (REGEX REPLACE \"^-l\" \"\" token ${token})\n      set (_root)\n      if (token MATCHES \"^/\")\t# We have an absolute path, add root to the search path\n\tset (_root \"/\")\n      endif (token MATCHES \"^/\")\n      set (_lib \"NOTFOUND\" CACHE FILEPATH \"Cleared\" FORCE)\n      find_library (_lib ${token} HINTS ${_directory_stack} ${_root})\n      if (_lib)\n\tstring (REPLACE \"//\" \"/\" _lib ${_lib})\n        list (APPEND _libs_found ${_lib})\n      else (_lib)\n        message (STATUS \"Unable to find library ${token}\")\n      endif (_lib)\n    endif (token MATCHES \"-L([^\\\" ]+|\\\"[^\\\"]+\\\")\")\n  endforeach (token)\n  set (_lib \"NOTFOUND\" CACHE INTERNAL \"Scratch variable\" FORCE)\n  # only the LAST occurence of each library is required since there should be no circular dependencies\n  if (_libs_found)\n    list (REVERSE _libs_found)\n    list (REMOVE_DUPLICATES _libs_found)\n    list (REVERSE _libs_found)\n  endif (_libs_found)\n  set (${LIBS} \"${_libs_found}\")\nendmacro (RESOLVE_LIBRARIES)\n\nmacro (RESOLVE_INCLUDES INCS COMPILE_LINE)\n  string (REGEX MATCHALL \"-I([^\\\" ]+|\\\"[^\\\"]+\\\")\" _all_tokens \"${COMPILE_LINE}\")\n  set (_incs_found)\n  foreach (token ${_all_tokens})\n    string (REGEX REPLACE \"^-I\" \"\" token ${token})\n    string (REGEX REPLACE \"//\" \"/\" token ${token})\n    if (EXISTS ${token})\n      list (APPEND _incs_found ${token})\n    else (EXISTS ${token})\n      message (STATUS \"Include directory ${token} does not exist\")\n    endif (EXISTS ${token})\n  endforeach (token)\n  list (REMOVE_DUPLICATES _incs_found)\n  set (${INCS} \"${_incs_found}\")\nendmacro (RESOLVE_INCLUDES)\n"
  },
  {
    "path": "libs/CoMISo/gmm/AUTHORS",
    "content": "Authors of GETFEM++\n\nYves RENARD. Initial project. All the project.\n\nJulien POMMIER. All the project.\n\n"
  },
  {
    "path": "libs/CoMISo/gmm/COPYING",
    "content": "Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\nunder  the  terms  of the  GNU  Lesser General Public License as published\nby  the  Free Software Foundation;  either version 2.1 of the License,  or\n(at your option) any later version along with the GCC Runtime Library\nException either version 3.1 or (at your option) any later version.\nThis program  is  distributed  in  the  hope  that it will be useful,  but\nWITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\nor  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\nLicense and the GCC Runtime Library Exception for more details.\nYou  should  have received a copy of the GNU Lesser General Public License\nalong  with  this program;  if not, write to the Free Software Foundation,\nInc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA."
  },
  {
    "path": "libs/CoMISo/gmm/ChangeLog",
    "content": ""
  },
  {
    "path": "libs/CoMISo/gmm/INSTALL",
    "content": "Installation Instructions\n*************************\n\nCopyright (C) 1994-1996, 1999-2002, 2004-2011 Free Software Foundation,\nInc.\n\n   Copying and distribution of this file, with or without modification,\nare permitted in any medium without royalty provided the copyright\nnotice and this notice are preserved.  This file is offered as-is,\nwithout warranty of any kind.\n\nBasic Installation\n==================\n\n   Briefly, the shell commands `./configure; make; make install' should\nconfigure, build, and install this package.  The following\nmore-detailed instructions are generic; see the `README' file for\ninstructions specific to this package.  Some packages provide this\n`INSTALL' file but do not implement all of the features documented\nbelow.  The lack of an optional feature in a given package is not\nnecessarily a bug.  More recommendations for GNU packages can be found\nin *note Makefile Conventions: (standards)Makefile Conventions.\n\n   The `configure' shell script attempts to guess correct values for\nvarious system-dependent variables used during compilation.  It uses\nthose values to create a `Makefile' in each directory of the package.\nIt may also create one or more `.h' files containing system-dependent\ndefinitions.  Finally, it creates a shell script `config.status' that\nyou can run in the future to recreate the current configuration, and a\nfile `config.log' containing compiler output (useful mainly for\ndebugging `configure').\n\n   It can also use an optional file (typically called `config.cache'\nand enabled with `--cache-file=config.cache' or simply `-C') that saves\nthe results of its tests to speed up reconfiguring.  Caching is\ndisabled by default to prevent problems with accidental use of stale\ncache files.\n\n   If you need to do unusual things to compile the package, please try\nto figure out how `configure' could check whether to do them, and mail\ndiffs or instructions to the address given in the `README' so they can\nbe considered for the next release.  If you are using the cache, and at\nsome point `config.cache' contains results you don't want to keep, you\nmay remove or edit it.\n\n   The file `configure.ac' (or `configure.in') is used to create\n`configure' by a program called `autoconf'.  You need `configure.ac' if\nyou want to change it or regenerate `configure' using a newer version\nof `autoconf'.\n\n   The simplest way to compile this package is:\n\n  1. `cd' to the directory containing the package's source code and type\n     `./configure' to configure the package for your system.\n\n     Running `configure' might take a while.  While running, it prints\n     some messages telling which features it is checking for.\n\n  2. Type `make' to compile the package.\n\n  3. Optionally, type `make check' to run any self-tests that come with\n     the package, generally using the just-built uninstalled binaries.\n\n  4. Type `make install' to install the programs and any data files and\n     documentation.  When installing into a prefix owned by root, it is\n     recommended that the package be configured and built as a regular\n     user, and only the `make install' phase executed with root\n     privileges.\n\n  5. Optionally, type `make installcheck' to repeat any self-tests, but\n     this time using the binaries in their final installed location.\n     This target does not install anything.  Running this target as a\n     regular user, particularly if the prior `make install' required\n     root privileges, verifies that the installation completed\n     correctly.\n\n  6. You can remove the program binaries and object files from the\n     source code directory by typing `make clean'.  To also remove the\n     files that `configure' created (so you can compile the package for\n     a different kind of computer), type `make distclean'.  There is\n     also a `make maintainer-clean' target, but that is intended mainly\n     for the package's developers.  If you use it, you may have to get\n     all sorts of other programs in order to regenerate files that came\n     with the distribution.\n\n  7. Often, you can also type `make uninstall' to remove the installed\n     files again.  In practice, not all packages have tested that\n     uninstallation works correctly, even though it is required by the\n     GNU Coding Standards.\n\n  8. Some packages, particularly those that use Automake, provide `make\n     distcheck', which can by used by developers to test that all other\n     targets like `make install' and `make uninstall' work correctly.\n     This target is generally not run by end users.\n\nCompilers and Options\n=====================\n\n   Some systems require unusual options for compilation or linking that\nthe `configure' script does not know about.  Run `./configure --help'\nfor details on some of the pertinent environment variables.\n\n   You can give `configure' initial values for configuration parameters\nby setting variables in the command line or in the environment.  Here\nis an example:\n\n     ./configure CC=c99 CFLAGS=-g LIBS=-lposix\n\n   *Note Defining Variables::, for more details.\n\nCompiling For Multiple Architectures\n====================================\n\n   You can compile the package for more than one kind of computer at the\nsame time, by placing the object files for each architecture in their\nown directory.  To do this, you can use GNU `make'.  `cd' to the\ndirectory where you want the object files and executables to go and run\nthe `configure' script.  `configure' automatically checks for the\nsource code in the directory that `configure' is in and in `..'.  This\nis known as a \"VPATH\" build.\n\n   With a non-GNU `make', it is safer to compile the package for one\narchitecture at a time in the source code directory.  After you have\ninstalled the package for one architecture, use `make distclean' before\nreconfiguring for another architecture.\n\n   On MacOS X 10.5 and later systems, you can create libraries and\nexecutables that work on multiple system types--known as \"fat\" or\n\"universal\" binaries--by specifying multiple `-arch' options to the\ncompiler but only a single `-arch' option to the preprocessor.  Like\nthis:\n\n     ./configure CC=\"gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64\" \\\n                 CXX=\"g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64\" \\\n                 CPP=\"gcc -E\" CXXCPP=\"g++ -E\"\n\n   This is not guaranteed to produce working output in all cases, you\nmay have to build one architecture at a time and combine the results\nusing the `lipo' tool if you have problems.\n\nInstallation Names\n==================\n\n   By default, `make install' installs the package's commands under\n`/usr/local/bin', include files under `/usr/local/include', etc.  You\ncan specify an installation prefix other than `/usr/local' by giving\n`configure' the option `--prefix=PREFIX', where PREFIX must be an\nabsolute file name.\n\n   You can specify separate installation prefixes for\narchitecture-specific files and architecture-independent files.  If you\npass the option `--exec-prefix=PREFIX' to `configure', the package uses\nPREFIX as the prefix for installing programs and libraries.\nDocumentation and other data files still use the regular prefix.\n\n   In addition, if you use an unusual directory layout you can give\noptions like `--bindir=DIR' to specify different values for particular\nkinds of files.  Run `configure --help' for a list of the directories\nyou can set and what kinds of files go in them.  In general, the\ndefault for these options is expressed in terms of `${prefix}', so that\nspecifying just `--prefix' will affect all of the other directory\nspecifications that were not explicitly provided.\n\n   The most portable way to affect installation locations is to pass the\ncorrect locations to `configure'; however, many packages provide one or\nboth of the following shortcuts of passing variable assignments to the\n`make install' command line to change installation locations without\nhaving to reconfigure or recompile.\n\n   The first method involves providing an override variable for each\naffected directory.  For example, `make install\nprefix=/alternate/directory' will choose an alternate location for all\ndirectory configuration variables that were expressed in terms of\n`${prefix}'.  Any directories that were specified during `configure',\nbut not in terms of `${prefix}', must each be overridden at install\ntime for the entire installation to be relocated.  The approach of\nmakefile variable overrides for each directory variable is required by\nthe GNU Coding Standards, and ideally causes no recompilation.\nHowever, some platforms have known limitations with the semantics of\nshared libraries that end up requiring recompilation when using this\nmethod, particularly noticeable in packages that use GNU Libtool.\n\n   The second method involves providing the `DESTDIR' variable.  For\nexample, `make install DESTDIR=/alternate/directory' will prepend\n`/alternate/directory' before all installation names.  The approach of\n`DESTDIR' overrides is not required by the GNU Coding Standards, and\ndoes not work on platforms that have drive letters.  On the other hand,\nit does better at avoiding recompilation issues, and works well even\nwhen some directory options were not specified in terms of `${prefix}'\nat `configure' time.\n\nOptional Features\n=================\n\n   If the package supports it, you can cause programs to be installed\nwith an extra prefix or suffix on their names by giving `configure' the\noption `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.\n\n   Some packages pay attention to `--enable-FEATURE' options to\n`configure', where FEATURE indicates an optional part of the package.\nThey may also pay attention to `--with-PACKAGE' options, where PACKAGE\nis something like `gnu-as' or `x' (for the X Window System).  The\n`README' should mention any `--enable-' and `--with-' options that the\npackage recognizes.\n\n   For packages that use the X Window System, `configure' can usually\nfind the X include and library files automatically, but if it doesn't,\nyou can use the `configure' options `--x-includes=DIR' and\n`--x-libraries=DIR' to specify their locations.\n\n   Some packages offer the ability to configure how verbose the\nexecution of `make' will be.  For these packages, running `./configure\n--enable-silent-rules' sets the default to minimal output, which can be\noverridden with `make V=1'; while running `./configure\n--disable-silent-rules' sets the default to verbose, which can be\noverridden with `make V=0'.\n\nParticular systems\n==================\n\n   On HP-UX, the default C compiler is not ANSI C compatible.  If GNU\nCC is not installed, it is recommended to use the following options in\norder to use an ANSI C compiler:\n\n     ./configure CC=\"cc -Ae -D_XOPEN_SOURCE=500\"\n\nand if that doesn't work, install pre-built binaries of GCC for HP-UX.\n\n   HP-UX `make' updates targets which have the same time stamps as\ntheir prerequisites, which makes it generally unusable when shipped\ngenerated files such as `configure' are involved.  Use GNU `make'\ninstead.\n\n   On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot\nparse its `<wchar.h>' header file.  The option `-nodtk' can be used as\na workaround.  If GNU CC is not installed, it is therefore recommended\nto try\n\n     ./configure CC=\"cc\"\n\nand if that doesn't work, try\n\n     ./configure CC=\"cc -nodtk\"\n\n   On Solaris, don't put `/usr/ucb' early in your `PATH'.  This\ndirectory contains several dysfunctional programs; working variants of\nthese programs are available in `/usr/bin'.  So, if you need `/usr/ucb'\nin your `PATH', put it _after_ `/usr/bin'.\n\n   On Haiku, software installed for all users goes in `/boot/common',\nnot `/usr/local'.  It is recommended to use the following options:\n\n     ./configure --prefix=/boot/common\n\nSpecifying the System Type\n==========================\n\n   There may be some features `configure' cannot figure out\nautomatically, but needs to determine by the type of machine the package\nwill run on.  Usually, assuming the package is built to be run on the\n_same_ architectures, `configure' can figure that out, but if it prints\na message saying it cannot guess the machine type, give it the\n`--build=TYPE' option.  TYPE can either be a short name for the system\ntype, such as `sun4', or a canonical name which has the form:\n\n     CPU-COMPANY-SYSTEM\n\nwhere SYSTEM can have one of these forms:\n\n     OS\n     KERNEL-OS\n\n   See the file `config.sub' for the possible values of each field.  If\n`config.sub' isn't included in this package, then this package doesn't\nneed to know the machine type.\n\n   If you are _building_ compiler tools for cross-compiling, you should\nuse the option `--target=TYPE' to select the type of system they will\nproduce code for.\n\n   If you want to _use_ a cross compiler, that generates code for a\nplatform different from the build platform, you should specify the\n\"host\" platform (i.e., that on which the generated programs will\neventually be run) with `--host=TYPE'.\n\nSharing Defaults\n================\n\n   If you want to set default values for `configure' scripts to share,\nyou can create a site shell script called `config.site' that gives\ndefault values for variables like `CC', `cache_file', and `prefix'.\n`configure' looks for `PREFIX/share/config.site' if it exists, then\n`PREFIX/etc/config.site' if it exists.  Or, you can set the\n`CONFIG_SITE' environment variable to the location of the site script.\nA warning: not all `configure' scripts look for a site script.\n\nDefining Variables\n==================\n\n   Variables not defined in a site shell script can be set in the\nenvironment passed to `configure'.  However, some packages may run\nconfigure again during the build, and the customized values of these\nvariables may be lost.  In order to avoid this problem, you should set\nthem in the `configure' command line, using `VAR=value'.  For example:\n\n     ./configure CC=/usr/local2/bin/gcc\n\ncauses the specified `gcc' to be used as the C compiler (unless it is\noverridden in the site shell script).\n\nUnfortunately, this technique does not work for `CONFIG_SHELL' due to\nan Autoconf bug.  Until the bug is fixed you can use this workaround:\n\n     CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash\n\n`configure' Invocation\n======================\n\n   `configure' recognizes the following options to control how it\noperates.\n\n`--help'\n`-h'\n     Print a summary of all of the options to `configure', and exit.\n\n`--help=short'\n`--help=recursive'\n     Print a summary of the options unique to this package's\n     `configure', and exit.  The `short' variant lists options used\n     only in the top level, while the `recursive' variant lists options\n     also present in any nested packages.\n\n`--version'\n`-V'\n     Print the version of Autoconf used to generate the `configure'\n     script, and exit.\n\n`--cache-file=FILE'\n     Enable the cache: use and save the results of the tests in FILE,\n     traditionally `config.cache'.  FILE defaults to `/dev/null' to\n     disable caching.\n\n`--config-cache'\n`-C'\n     Alias for `--cache-file=config.cache'.\n\n`--quiet'\n`--silent'\n`-q'\n     Do not print messages saying which checks are being made.  To\n     suppress all normal output, redirect it to `/dev/null' (any error\n     messages will still be shown).\n\n`--srcdir=DIR'\n     Look for the package's source code in directory DIR.  Usually\n     `configure' can determine that directory automatically.\n\n`--prefix=DIR'\n     Use DIR as the installation prefix.  *note Installation Names::\n     for more details, including other options available for fine-tuning\n     the installation locations.\n\n`--no-create'\n`-n'\n     Run the configure checks, but stop before creating any output\n     files.\n\n`configure' also accepts some other, not widely useful, options.  Run\n`configure --help' for more details.\n\n"
  },
  {
    "path": "libs/CoMISo/gmm/Makefile.am",
    "content": "\nACLOCAL_AMFLAGS = -I m4\n\nSUBDIRS = include tests\n\nEXTRA_DIST = \\\n        m4/ax_check_cxx_flag.m4  m4/ax_prefix_config_h.m4\n\nCLEANFILES = so_locations\n\n"
  },
  {
    "path": "libs/CoMISo/gmm/Makefile.in",
    "content": "# Makefile.in generated by automake 1.11.3 from Makefile.am.\n# @configure_input@\n\n# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,\n# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software\n# Foundation, Inc.\n# This Makefile.in is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY, to the extent permitted by law; without\n# even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n# PARTICULAR PURPOSE.\n\n@SET_MAKE@\nVPATH = @srcdir@\npkgdatadir = $(datadir)/@PACKAGE@\npkgincludedir = $(includedir)/@PACKAGE@\npkglibdir = $(libdir)/@PACKAGE@\npkglibexecdir = $(libexecdir)/@PACKAGE@\nam__cd = CDPATH=\"$${ZSH_VERSION+.}$(PATH_SEPARATOR)\" && cd\ninstall_sh_DATA = $(install_sh) -c -m 644\ninstall_sh_PROGRAM = $(install_sh) -c\ninstall_sh_SCRIPT = $(install_sh) -c\nINSTALL_HEADER = $(INSTALL_DATA)\ntransform = $(program_transform_name)\nNORMAL_INSTALL = :\nPRE_INSTALL = :\nPOST_INSTALL = :\nNORMAL_UNINSTALL = :\nPRE_UNINSTALL = :\nPOST_UNINSTALL = :\nbuild_triplet = @build@\nhost_triplet = @host@\nsubdir = .\nDIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \\\n\t$(srcdir)/Makefile.in $(srcdir)/config.h.in \\\n\t$(srcdir)/gmm-config.in $(top_srcdir)/configure AUTHORS \\\n\tCOPYING ChangeLog INSTALL NEWS config.guess config.sub depcomp \\\n\tinstall-sh ltmain.sh missing\nACLOCAL_M4 = $(top_srcdir)/aclocal.m4\nam__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \\\n\t$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \\\n\t$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \\\n\t$(top_srcdir)/configure.in\nam__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \\\n\t$(ACLOCAL_M4)\nam__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \\\n configure.lineno config.status.lineno\nmkinstalldirs = $(install_sh) -d\nCONFIG_HEADER = config.h\nCONFIG_CLEAN_FILES = gmm-config\nCONFIG_CLEAN_VPATH_FILES =\nSOURCES =\nDIST_SOURCES =\nRECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \\\n\thtml-recursive info-recursive install-data-recursive \\\n\tinstall-dvi-recursive install-exec-recursive \\\n\tinstall-html-recursive install-info-recursive \\\n\tinstall-pdf-recursive install-ps-recursive install-recursive \\\n\tinstallcheck-recursive installdirs-recursive pdf-recursive \\\n\tps-recursive uninstall-recursive\nRECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive\t\\\n  distclean-recursive maintainer-clean-recursive\nAM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \\\n\t$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \\\n\tdistdir dist dist-all distcheck\nETAGS = etags\nCTAGS = ctags\nDIST_SUBDIRS = $(SUBDIRS)\nDISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)\ndistdir = $(PACKAGE)-$(VERSION)\ntop_distdir = $(distdir)\nam__remove_distdir = \\\n  if test -d \"$(distdir)\"; then \\\n    find \"$(distdir)\" -type d ! -perm -200 -exec chmod u+w {} ';' \\\n      && rm -rf \"$(distdir)\" \\\n      || { sleep 5 && rm -rf \"$(distdir)\"; }; \\\n  else :; fi\nam__relativize = \\\n  dir0=`pwd`; \\\n  sed_first='s,^\\([^/]*\\)/.*$$,\\1,'; \\\n  sed_rest='s,^[^/]*/*,,'; \\\n  sed_last='s,^.*/\\([^/]*\\)$$,\\1,'; \\\n  sed_butlast='s,/*[^/]*$$,,'; \\\n  while test -n \"$$dir1\"; do \\\n    first=`echo \"$$dir1\" | sed -e \"$$sed_first\"`; \\\n    if test \"$$first\" != \".\"; then \\\n      if test \"$$first\" = \"..\"; then \\\n        dir2=`echo \"$$dir0\" | sed -e \"$$sed_last\"`/\"$$dir2\"; \\\n        dir0=`echo \"$$dir0\" | sed -e \"$$sed_butlast\"`; \\\n      else \\\n        first2=`echo \"$$dir2\" | sed -e \"$$sed_first\"`; \\\n        if test \"$$first2\" = \"$$first\"; then \\\n          dir2=`echo \"$$dir2\" | sed -e \"$$sed_rest\"`; \\\n        else \\\n          dir2=\"../$$dir2\"; \\\n        fi; \\\n        dir0=\"$$dir0\"/\"$$first\"; \\\n      fi; \\\n    fi; \\\n    dir1=`echo \"$$dir1\" | sed -e \"$$sed_rest\"`; \\\n  done; \\\n  reldir=\"$$dir2\"\nDIST_ARCHIVES = $(distdir).tar.gz\nGZIP_ENV = --best\ndistuninstallcheck_listfiles = find . -type f -print\nam__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \\\n  | sed 's|^\\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'\ndistcleancheck_listfiles = find . -type f -print\nACLOCAL = @ACLOCAL@\nAMTAR = @AMTAR@\nAR = @AR@\nAUTOCONF = @AUTOCONF@\nAUTOHEADER = @AUTOHEADER@\nAUTOMAKE = @AUTOMAKE@\nAWK = @AWK@\nBUILDDATE = @BUILDDATE@\nBUILDER = @BUILDER@\nCC = @CC@\nCCDEPMODE = @CCDEPMODE@\nCFLAGS = @CFLAGS@\nCONFIGURE_ARGS = @CONFIGURE_ARGS@\nCPP = @CPP@\nCPPFLAGS = @CPPFLAGS@\nCXX = @CXX@\nCXXCPP = @CXXCPP@\nCXXDEPMODE = @CXXDEPMODE@\nCXXFLAGS = @CXXFLAGS@\nCYGPATH_W = @CYGPATH_W@\nDEFS = @DEFS@\nDEPDIR = @DEPDIR@\nDLLTOOL = @DLLTOOL@\nDSYMUTIL = @DSYMUTIL@\nDUMPBIN = @DUMPBIN@\nECHO_C = @ECHO_C@\nECHO_N = @ECHO_N@\nECHO_T = @ECHO_T@\nEGREP = @EGREP@\nEXEEXT = @EXEEXT@\nFGREP = @FGREP@\nGREP = @GREP@\nINSTALL = @INSTALL@\nINSTALL_DATA = @INSTALL_DATA@\nINSTALL_PROGRAM = @INSTALL_PROGRAM@\nINSTALL_SCRIPT = @INSTALL_SCRIPT@\nINSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@\nLD = @LD@\nLDFLAGS = @LDFLAGS@\nLIBOBJS = @LIBOBJS@\nLIBS = @LIBS@\nLIBTOOL = @LIBTOOL@\nLIBTOOL_DEPS = @LIBTOOL_DEPS@\nLIBTOOL_VERSION_INFO = @LIBTOOL_VERSION_INFO@\nLIPO = @LIPO@\nLN_S = @LN_S@\nLTLIBOBJS = @LTLIBOBJS@\nMAKEINFO = @MAKEINFO@\nMANIFEST_TOOL = @MANIFEST_TOOL@\nMKDIR_P = @MKDIR_P@\nNM = @NM@\nNMEDIT = @NMEDIT@\nOBJDUMP = @OBJDUMP@\nOBJEXT = @OBJEXT@\nOTOOL = @OTOOL@\nOTOOL64 = @OTOOL64@\nPACKAGE = @PACKAGE@\nPACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@\nPACKAGE_NAME = @PACKAGE_NAME@\nPACKAGE_STRING = @PACKAGE_STRING@\nPACKAGE_TARNAME = @PACKAGE_TARNAME@\nPACKAGE_URL = @PACKAGE_URL@\nPACKAGE_VERSION = @PACKAGE_VERSION@\nPATH_SEPARATOR = @PATH_SEPARATOR@\nRANLIB = @RANLIB@\nSED = @SED@\nSET_MAKE = @SET_MAKE@\nSHELL = @SHELL@\nSTRIP = @STRIP@\nSUPLDFLAGS = @SUPLDFLAGS@\nVERSION = @VERSION@\nabs_builddir = @abs_builddir@\nabs_srcdir = @abs_srcdir@\nabs_top_builddir = @abs_top_builddir@\nabs_top_srcdir = @abs_top_srcdir@\nac_ct_AR = @ac_ct_AR@\nac_ct_CC = @ac_ct_CC@\nac_ct_CXX = @ac_ct_CXX@\nac_ct_DUMPBIN = @ac_ct_DUMPBIN@\nam__include = @am__include@\nam__leading_dot = @am__leading_dot@\nam__quote = @am__quote@\nam__tar = @am__tar@\nam__untar = @am__untar@\nbindir = @bindir@\nbuild = @build@\nbuild_alias = @build_alias@\nbuild_cpu = @build_cpu@\nbuild_os = @build_os@\nbuild_vendor = @build_vendor@\nbuilddir = @builddir@\ndatadir = @datadir@\ndatarootdir = @datarootdir@\ndocdir = @docdir@\ndvidir = @dvidir@\nexec_prefix = @exec_prefix@\nhost = @host@\nhost_alias = @host_alias@\nhost_cpu = @host_cpu@\nhost_os = @host_os@\nhost_vendor = @host_vendor@\nhtmldir = @htmldir@\nincludedir = @includedir@\ninfodir = @infodir@\ninstall_sh = @install_sh@\nlibdir = @libdir@\nlibexecdir = @libexecdir@\nlocaledir = @localedir@\nlocalstatedir = @localstatedir@\nmandir = @mandir@\nmkdir_p = @mkdir_p@\noldincludedir = @oldincludedir@\npdfdir = @pdfdir@\nprefix = @prefix@\nprogram_transform_name = @program_transform_name@\npsdir = @psdir@\nsbindir = @sbindir@\nsharedstatedir = @sharedstatedir@\nsrcdir = @srcdir@\nsysconfdir = @sysconfdir@\ntarget_alias = @target_alias@\ntop_build_prefix = @top_build_prefix@\ntop_builddir = @top_builddir@\ntop_srcdir = @top_srcdir@\nACLOCAL_AMFLAGS = -I m4\nSUBDIRS = include tests\nEXTRA_DIST = \\\n        m4/ax_check_cxx_flag.m4  m4/ax_prefix_config_h.m4\n\nCLEANFILES = so_locations\nall: config.h\n\t$(MAKE) $(AM_MAKEFLAGS) all-recursive\n\n.SUFFIXES:\nam--refresh: Makefile\n\t@:\n$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)\n\t@for dep in $?; do \\\n\t  case '$(am__configure_deps)' in \\\n\t    *$$dep*) \\\n\t      echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \\\n\t      $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \\\n\t\t&& exit 0; \\\n\t      exit 1;; \\\n\t  esac; \\\n\tdone; \\\n\techo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \\\n\t$(am__cd) $(top_srcdir) && \\\n\t  $(AUTOMAKE) --gnu Makefile\n.PRECIOUS: Makefile\nMakefile: $(srcdir)/Makefile.in $(top_builddir)/config.status\n\t@case '$?' in \\\n\t  *config.status*) \\\n\t    echo ' $(SHELL) ./config.status'; \\\n\t    $(SHELL) ./config.status;; \\\n\t  *) \\\n\t    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \\\n\t    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \\\n\tesac;\n\n$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)\n\t$(SHELL) ./config.status --recheck\n\n$(top_srcdir)/configure:  $(am__configure_deps)\n\t$(am__cd) $(srcdir) && $(AUTOCONF)\n$(ACLOCAL_M4):  $(am__aclocal_m4_deps)\n\t$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)\n$(am__aclocal_m4_deps):\n\nconfig.h: stamp-h1\n\t@if test ! -f $@; then rm -f stamp-h1; else :; fi\n\t@if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi\n\nstamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status\n\t@rm -f stamp-h1\n\tcd $(top_builddir) && $(SHELL) ./config.status config.h\n$(srcdir)/config.h.in:  $(am__configure_deps) \n\t($(am__cd) $(top_srcdir) && $(AUTOHEADER))\n\trm -f stamp-h1\n\ttouch $@\n\ndistclean-hdr:\n\t-rm -f config.h stamp-h1\ngmm-config: $(top_builddir)/config.status $(srcdir)/gmm-config.in\n\tcd $(top_builddir) && $(SHELL) ./config.status $@\n\nmostlyclean-libtool:\n\t-rm -f *.lo\n\nclean-libtool:\n\t-rm -rf .libs _libs\n\ndistclean-libtool:\n\t-rm -f libtool config.lt\n\n# This directory's subdirectories are mostly independent; you can cd\n# into them and run `make' without going through this Makefile.\n# To change the values of `make' variables: instead of editing Makefiles,\n# (1) if the variable is set in `config.status', edit `config.status'\n#     (which will cause the Makefiles to be regenerated when you run `make');\n# (2) otherwise, pass the desired values on the `make' command line.\n$(RECURSIVE_TARGETS):\n\t@fail= failcom='exit 1'; \\\n\tfor f in x $$MAKEFLAGS; do \\\n\t  case $$f in \\\n\t    *=* | --[!k]*);; \\\n\t    *k*) failcom='fail=yes';; \\\n\t  esac; \\\n\tdone; \\\n\tdot_seen=no; \\\n\ttarget=`echo $@ | sed s/-recursive//`; \\\n\tlist='$(SUBDIRS)'; for subdir in $$list; do \\\n\t  echo \"Making $$target in $$subdir\"; \\\n\t  if test \"$$subdir\" = \".\"; then \\\n\t    dot_seen=yes; \\\n\t    local_target=\"$$target-am\"; \\\n\t  else \\\n\t    local_target=\"$$target\"; \\\n\t  fi; \\\n\t  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \\\n\t  || eval $$failcom; \\\n\tdone; \\\n\tif test \"$$dot_seen\" = \"no\"; then \\\n\t  $(MAKE) $(AM_MAKEFLAGS) \"$$target-am\" || exit 1; \\\n\tfi; test -z \"$$fail\"\n\n$(RECURSIVE_CLEAN_TARGETS):\n\t@fail= failcom='exit 1'; \\\n\tfor f in x $$MAKEFLAGS; do \\\n\t  case $$f in \\\n\t    *=* | --[!k]*);; \\\n\t    *k*) failcom='fail=yes';; \\\n\t  esac; \\\n\tdone; \\\n\tdot_seen=no; \\\n\tcase \"$@\" in \\\n\t  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \\\n\t  *) list='$(SUBDIRS)' ;; \\\n\tesac; \\\n\trev=''; for subdir in $$list; do \\\n\t  if test \"$$subdir\" = \".\"; then :; else \\\n\t    rev=\"$$subdir $$rev\"; \\\n\t  fi; \\\n\tdone; \\\n\trev=\"$$rev .\"; \\\n\ttarget=`echo $@ | sed s/-recursive//`; \\\n\tfor subdir in $$rev; do \\\n\t  echo \"Making $$target in $$subdir\"; \\\n\t  if test \"$$subdir\" = \".\"; then \\\n\t    local_target=\"$$target-am\"; \\\n\t  else \\\n\t    local_target=\"$$target\"; \\\n\t  fi; \\\n\t  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \\\n\t  || eval $$failcom; \\\n\tdone && test -z \"$$fail\"\ntags-recursive:\n\tlist='$(SUBDIRS)'; for subdir in $$list; do \\\n\t  test \"$$subdir\" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \\\n\tdone\nctags-recursive:\n\tlist='$(SUBDIRS)'; for subdir in $$list; do \\\n\t  test \"$$subdir\" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \\\n\tdone\n\nID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)\n\tlist='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \\\n\tunique=`for i in $$list; do \\\n\t    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n\t  done | \\\n\t  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \\\n\t      END { if (nonempty) { for (i in files) print i; }; }'`; \\\n\tmkid -fID $$unique\ntags: TAGS\n\nTAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \\\n\t\t$(TAGS_FILES) $(LISP)\n\tset x; \\\n\there=`pwd`; \\\n\tif ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \\\n\t  include_option=--etags-include; \\\n\t  empty_fix=.; \\\n\telse \\\n\t  include_option=--include; \\\n\t  empty_fix=; \\\n\tfi; \\\n\tlist='$(SUBDIRS)'; for subdir in $$list; do \\\n\t  if test \"$$subdir\" = .; then :; else \\\n\t    test ! -f $$subdir/TAGS || \\\n\t      set \"$$@\" \"$$include_option=$$here/$$subdir/TAGS\"; \\\n\t  fi; \\\n\tdone; \\\n\tlist='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \\\n\tunique=`for i in $$list; do \\\n\t    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n\t  done | \\\n\t  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \\\n\t      END { if (nonempty) { for (i in files) print i; }; }'`; \\\n\tshift; \\\n\tif test -z \"$(ETAGS_ARGS)$$*$$unique\"; then :; else \\\n\t  test -n \"$$unique\" || unique=$$empty_fix; \\\n\t  if test $$# -gt 0; then \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      \"$$@\" $$unique; \\\n\t  else \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      $$unique; \\\n\t  fi; \\\n\tfi\nctags: CTAGS\nCTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \\\n\t\t$(TAGS_FILES) $(LISP)\n\tlist='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \\\n\tunique=`for i in $$list; do \\\n\t    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n\t  done | \\\n\t  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \\\n\t      END { if (nonempty) { for (i in files) print i; }; }'`; \\\n\ttest -z \"$(CTAGS_ARGS)$$unique\" \\\n\t  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \\\n\t     $$unique\n\nGTAGS:\n\there=`$(am__cd) $(top_builddir) && pwd` \\\n\t  && $(am__cd) $(top_srcdir) \\\n\t  && gtags -i $(GTAGS_ARGS) \"$$here\"\n\ndistclean-tags:\n\t-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags\n\ndistdir: $(DISTFILES)\n\t$(am__remove_distdir)\n\ttest -d \"$(distdir)\" || mkdir \"$(distdir)\"\n\t@srcdirstrip=`echo \"$(srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\ttopsrcdirstrip=`echo \"$(top_srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\tlist='$(DISTFILES)'; \\\n\t  dist_files=`for file in $$list; do echo $$file; done | \\\n\t  sed -e \"s|^$$srcdirstrip/||;t\" \\\n\t      -e \"s|^$$topsrcdirstrip/|$(top_builddir)/|;t\"`; \\\n\tcase $$dist_files in \\\n\t  */*) $(MKDIR_P) `echo \"$$dist_files\" | \\\n\t\t\t   sed '/\\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \\\n\t\t\t   sort -u` ;; \\\n\tesac; \\\n\tfor file in $$dist_files; do \\\n\t  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \\\n\t  if test -d $$d/$$file; then \\\n\t    dir=`echo \"/$$file\" | sed -e 's,/[^/]*$$,,'`; \\\n\t    if test -d \"$(distdir)/$$file\"; then \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \\\n\t      cp -fpR $(srcdir)/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    cp -fpR $$d/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t  else \\\n\t    test -f \"$(distdir)/$$file\" \\\n\t    || cp -p $$d/$$file \"$(distdir)/$$file\" \\\n\t    || exit 1; \\\n\t  fi; \\\n\tdone\n\t@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \\\n\t  if test \"$$subdir\" = .; then :; else \\\n\t    test -d \"$(distdir)/$$subdir\" \\\n\t    || $(MKDIR_P) \"$(distdir)/$$subdir\" \\\n\t    || exit 1; \\\n\t  fi; \\\n\tdone\n\t@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \\\n\t  if test \"$$subdir\" = .; then :; else \\\n\t    dir1=$$subdir; dir2=\"$(distdir)/$$subdir\"; \\\n\t    $(am__relativize); \\\n\t    new_distdir=$$reldir; \\\n\t    dir1=$$subdir; dir2=\"$(top_distdir)\"; \\\n\t    $(am__relativize); \\\n\t    new_top_distdir=$$reldir; \\\n\t    echo \" (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=\"$$new_top_distdir\" distdir=\"$$new_distdir\" \\\\\"; \\\n\t    echo \"     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)\"; \\\n\t    ($(am__cd) $$subdir && \\\n\t      $(MAKE) $(AM_MAKEFLAGS) \\\n\t        top_distdir=\"$$new_top_distdir\" \\\n\t        distdir=\"$$new_distdir\" \\\n\t\tam__remove_distdir=: \\\n\t\tam__skip_length_check=: \\\n\t\tam__skip_mode_fix=: \\\n\t        distdir) \\\n\t      || exit 1; \\\n\t  fi; \\\n\tdone\n\t-test -n \"$(am__skip_mode_fix)\" \\\n\t|| find \"$(distdir)\" -type d ! -perm -755 \\\n\t\t-exec chmod u+rwx,go+rx {} \\; -o \\\n\t  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \\; -o \\\n\t  ! -type d ! -perm -400 -exec chmod a+r {} \\; -o \\\n\t  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \\; \\\n\t|| chmod -R a+r \"$(distdir)\"\ndist-gzip: distdir\n\ttardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz\n\t$(am__remove_distdir)\n\ndist-bzip2: distdir\n\ttardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2\n\t$(am__remove_distdir)\n\ndist-lzip: distdir\n\ttardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz\n\t$(am__remove_distdir)\n\ndist-lzma: distdir\n\ttardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma\n\t$(am__remove_distdir)\n\ndist-xz: distdir\n\ttardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz\n\t$(am__remove_distdir)\n\ndist-tarZ: distdir\n\ttardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z\n\t$(am__remove_distdir)\n\ndist-shar: distdir\n\tshar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz\n\t$(am__remove_distdir)\n\ndist-zip: distdir\n\t-rm -f $(distdir).zip\n\tzip -rq $(distdir).zip $(distdir)\n\t$(am__remove_distdir)\n\ndist dist-all: distdir\n\ttardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz\n\t$(am__remove_distdir)\n\n# This target untars the dist file and tries a VPATH configuration.  Then\n# it guarantees that the distribution is self-contained by making another\n# tarfile.\ndistcheck: dist\n\tcase '$(DIST_ARCHIVES)' in \\\n\t*.tar.gz*) \\\n\t  GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\\\n\t*.tar.bz2*) \\\n\t  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\\\n\t*.tar.lzma*) \\\n\t  lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\\\n\t*.tar.lz*) \\\n\t  lzip -dc $(distdir).tar.lz | $(am__untar) ;;\\\n\t*.tar.xz*) \\\n\t  xz -dc $(distdir).tar.xz | $(am__untar) ;;\\\n\t*.tar.Z*) \\\n\t  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\\\n\t*.shar.gz*) \\\n\t  GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\\\n\t*.zip*) \\\n\t  unzip $(distdir).zip ;;\\\n\tesac\n\tchmod -R a-w $(distdir); chmod a+w $(distdir)\n\tmkdir $(distdir)/_build\n\tmkdir $(distdir)/_inst\n\tchmod a-w $(distdir)\n\ttest -d $(distdir)/_build || exit 0; \\\n\tdc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\\\/]:[\\\\/],/,'` \\\n\t  && dc_destdir=\"$${TMPDIR-/tmp}/am-dc-$$$$/\" \\\n\t  && am__cwd=`pwd` \\\n\t  && $(am__cd) $(distdir)/_build \\\n\t  && ../configure --srcdir=.. --prefix=\"$$dc_install_base\" \\\n\t    $(AM_DISTCHECK_CONFIGURE_FLAGS) \\\n\t    $(DISTCHECK_CONFIGURE_FLAGS) \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) dvi \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) check \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) install \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) installcheck \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) uninstall \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir=\"$$dc_install_base\" \\\n\t        distuninstallcheck \\\n\t  && chmod -R a-w \"$$dc_install_base\" \\\n\t  && ({ \\\n\t       (cd ../.. && umask 077 && mkdir \"$$dc_destdir\") \\\n\t       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR=\"$$dc_destdir\" install \\\n\t       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR=\"$$dc_destdir\" uninstall \\\n\t       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR=\"$$dc_destdir\" \\\n\t            distuninstallcheck_dir=\"$$dc_destdir\" distuninstallcheck; \\\n\t      } || { rm -rf \"$$dc_destdir\"; exit 1; }) \\\n\t  && rm -rf \"$$dc_destdir\" \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) dist \\\n\t  && rm -rf $(DIST_ARCHIVES) \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \\\n\t  && cd \"$$am__cwd\" \\\n\t  || exit 1\n\t$(am__remove_distdir)\n\t@(echo \"$(distdir) archives ready for distribution: \"; \\\n\t  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \\\n\t  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'\ndistuninstallcheck:\n\t@test -n '$(distuninstallcheck_dir)' || { \\\n\t  echo 'ERROR: trying to run $@ with an empty' \\\n\t       '$$(distuninstallcheck_dir)' >&2; \\\n\t  exit 1; \\\n\t}; \\\n\t$(am__cd) '$(distuninstallcheck_dir)' || { \\\n\t  echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \\\n\t  exit 1; \\\n\t}; \\\n\ttest `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \\\n\t   || { echo \"ERROR: files left after uninstall:\" ; \\\n\t        if test -n \"$(DESTDIR)\"; then \\\n\t          echo \"  (check DESTDIR support)\"; \\\n\t        fi ; \\\n\t        $(distuninstallcheck_listfiles) ; \\\n\t        exit 1; } >&2\ndistcleancheck: distclean\n\t@if test '$(srcdir)' = . ; then \\\n\t  echo \"ERROR: distcleancheck can only run from a VPATH build\" ; \\\n\t  exit 1 ; \\\n\tfi\n\t@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \\\n\t  || { echo \"ERROR: files left in build directory after distclean:\" ; \\\n\t       $(distcleancheck_listfiles) ; \\\n\t       exit 1; } >&2\ncheck-am: all-am\ncheck: check-recursive\nall-am: Makefile config.h\ninstalldirs: installdirs-recursive\ninstalldirs-am:\ninstall: install-recursive\ninstall-exec: install-exec-recursive\ninstall-data: install-data-recursive\nuninstall: uninstall-recursive\n\ninstall-am: all-am\n\t@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am\n\ninstallcheck: installcheck-recursive\ninstall-strip:\n\tif test -z '$(STRIP)'; then \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t      install; \\\n\telse \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t    \"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'\" install; \\\n\tfi\nmostlyclean-generic:\n\nclean-generic:\n\t-test -z \"$(CLEANFILES)\" || rm -f $(CLEANFILES)\n\ndistclean-generic:\n\t-test -z \"$(CONFIG_CLEAN_FILES)\" || rm -f $(CONFIG_CLEAN_FILES)\n\t-test . = \"$(srcdir)\" || test -z \"$(CONFIG_CLEAN_VPATH_FILES)\" || rm -f $(CONFIG_CLEAN_VPATH_FILES)\n\nmaintainer-clean-generic:\n\t@echo \"This command is intended for maintainers to use\"\n\t@echo \"it deletes files that may require special tools to rebuild.\"\nclean: clean-recursive\n\nclean-am: clean-generic clean-libtool mostlyclean-am\n\ndistclean: distclean-recursive\n\t-rm -f $(am__CONFIG_DISTCLEAN_FILES)\n\t-rm -f Makefile\ndistclean-am: clean-am distclean-generic distclean-hdr \\\n\tdistclean-libtool distclean-tags\n\ndvi: dvi-recursive\n\ndvi-am:\n\nhtml: html-recursive\n\nhtml-am:\n\ninfo: info-recursive\n\ninfo-am:\n\ninstall-data-am:\n\ninstall-dvi: install-dvi-recursive\n\ninstall-dvi-am:\n\ninstall-exec-am:\n\ninstall-html: install-html-recursive\n\ninstall-html-am:\n\ninstall-info: install-info-recursive\n\ninstall-info-am:\n\ninstall-man:\n\ninstall-pdf: install-pdf-recursive\n\ninstall-pdf-am:\n\ninstall-ps: install-ps-recursive\n\ninstall-ps-am:\n\ninstallcheck-am:\n\nmaintainer-clean: maintainer-clean-recursive\n\t-rm -f $(am__CONFIG_DISTCLEAN_FILES)\n\t-rm -rf $(top_srcdir)/autom4te.cache\n\t-rm -f Makefile\nmaintainer-clean-am: distclean-am maintainer-clean-generic\n\nmostlyclean: mostlyclean-recursive\n\nmostlyclean-am: mostlyclean-generic mostlyclean-libtool\n\npdf: pdf-recursive\n\npdf-am:\n\nps: ps-recursive\n\nps-am:\n\nuninstall-am:\n\n.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \\\n\tctags-recursive install-am install-strip tags-recursive\n\n.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \\\n\tall all-am am--refresh check check-am clean clean-generic \\\n\tclean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \\\n\tdist-gzip dist-lzip dist-lzma dist-shar dist-tarZ dist-xz \\\n\tdist-zip distcheck distclean distclean-generic distclean-hdr \\\n\tdistclean-libtool distclean-tags distcleancheck distdir \\\n\tdistuninstallcheck dvi dvi-am html html-am info info-am \\\n\tinstall install-am install-data install-data-am install-dvi \\\n\tinstall-dvi-am install-exec install-exec-am install-html \\\n\tinstall-html-am install-info install-info-am install-man \\\n\tinstall-pdf install-pdf-am install-ps install-ps-am \\\n\tinstall-strip installcheck installcheck-am installdirs \\\n\tinstalldirs-am maintainer-clean maintainer-clean-generic \\\n\tmostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \\\n\tps ps-am tags tags-recursive uninstall uninstall-am\n\n\n# Tell versions [3.59,3.63) of GNU make to not export all variables.\n# Otherwise a system limit (for SysV at least) may be exceeded.\n.NOEXPORT:\n"
  },
  {
    "path": "libs/CoMISo/gmm/NEWS",
    "content": ""
  },
  {
    "path": "libs/CoMISo/gmm/README",
    "content": "Please read BUGS, INSTALL\n"
  },
  {
    "path": "libs/CoMISo/gmm/aclocal.m4",
    "content": "# generated automatically by aclocal 1.11.3 -*- Autoconf -*-\n\n# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,\n# 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation,\n# Inc.\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY, to the extent permitted by law; without\n# even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n# PARTICULAR PURPOSE.\n\nm4_ifndef([AC_AUTOCONF_VERSION],\n  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl\nm4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],,\n[m4_warning([this file was generated for autoconf 2.68.\nYou have another version of autoconf.  It may work, but is not guaranteed to.\nIf you have problems, you may need to regenerate the build system entirely.\nTo do so, use the procedure documented by the package, typically `autoreconf'.])])\n\n# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software\n# Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 1\n\n# AM_AUTOMAKE_VERSION(VERSION)\n# ----------------------------\n# Automake X.Y traces this macro to ensure aclocal.m4 has been\n# generated from the m4 files accompanying Automake X.Y.\n# (This private macro should not be called outside this file.)\nAC_DEFUN([AM_AUTOMAKE_VERSION],\n[am__api_version='1.11'\ndnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to\ndnl require some minimum version.  Point them to the right macro.\nm4_if([$1], [1.11.3], [],\n      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl\n])\n\n# _AM_AUTOCONF_VERSION(VERSION)\n# -----------------------------\n# aclocal traces this macro to find the Autoconf version.\n# This is a private macro too.  Using m4_define simplifies\n# the logic in aclocal, which can simply ignore this definition.\nm4_define([_AM_AUTOCONF_VERSION], [])\n\n# AM_SET_CURRENT_AUTOMAKE_VERSION\n# -------------------------------\n# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.\n# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.\nAC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],\n[AM_AUTOMAKE_VERSION([1.11.3])dnl\nm4_ifndef([AC_AUTOCONF_VERSION],\n  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl\n_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])\n\n# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-\n\n# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 1\n\n# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets\n# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to\n# `$srcdir', `$srcdir/..', or `$srcdir/../..'.\n#\n# Of course, Automake must honor this variable whenever it calls a\n# tool from the auxiliary directory.  The problem is that $srcdir (and\n# therefore $ac_aux_dir as well) can be either absolute or relative,\n# depending on how configure is run.  This is pretty annoying, since\n# it makes $ac_aux_dir quite unusable in subdirectories: in the top\n# source directory, any form will work fine, but in subdirectories a\n# relative path needs to be adjusted first.\n#\n# $ac_aux_dir/missing\n#    fails when called from a subdirectory if $ac_aux_dir is relative\n# $top_srcdir/$ac_aux_dir/missing\n#    fails if $ac_aux_dir is absolute,\n#    fails when called from a subdirectory in a VPATH build with\n#          a relative $ac_aux_dir\n#\n# The reason of the latter failure is that $top_srcdir and $ac_aux_dir\n# are both prefixed by $srcdir.  In an in-source build this is usually\n# harmless because $srcdir is `.', but things will broke when you\n# start a VPATH build or use an absolute $srcdir.\n#\n# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,\n# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:\n#   am_aux_dir='\\$(top_srcdir)/'`expr \"$ac_aux_dir\" : \"$srcdir//*\\(.*\\)\"`\n# and then we would define $MISSING as\n#   MISSING=\"\\${SHELL} $am_aux_dir/missing\"\n# This will work as long as MISSING is not called from configure, because\n# unfortunately $(top_srcdir) has no meaning in configure.\n# However there are other variables, like CC, which are often used in\n# configure, and could therefore not use this \"fixed\" $ac_aux_dir.\n#\n# Another solution, used here, is to always expand $ac_aux_dir to an\n# absolute PATH.  The drawback is that using absolute paths prevent a\n# configured tree to be moved without reconfiguration.\n\nAC_DEFUN([AM_AUX_DIR_EXPAND],\n[dnl Rely on autoconf to set up CDPATH properly.\nAC_PREREQ([2.50])dnl\n# expand $ac_aux_dir to an absolute path\nam_aux_dir=`cd $ac_aux_dir && pwd`\n])\n\n# AM_CONDITIONAL                                            -*- Autoconf -*-\n\n# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008\n# Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 9\n\n# AM_CONDITIONAL(NAME, SHELL-CONDITION)\n# -------------------------------------\n# Define a conditional.\nAC_DEFUN([AM_CONDITIONAL],\n[AC_PREREQ(2.52)dnl\n ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],\n\t[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl\nAC_SUBST([$1_TRUE])dnl\nAC_SUBST([$1_FALSE])dnl\n_AM_SUBST_NOTMAKE([$1_TRUE])dnl\n_AM_SUBST_NOTMAKE([$1_FALSE])dnl\nm4_define([_AM_COND_VALUE_$1], [$2])dnl\nif $2; then\n  $1_TRUE=\n  $1_FALSE='#'\nelse\n  $1_TRUE='#'\n  $1_FALSE=\nfi\nAC_CONFIG_COMMANDS_PRE(\n[if test -z \"${$1_TRUE}\" && test -z \"${$1_FALSE}\"; then\n  AC_MSG_ERROR([[conditional \"$1\" was never defined.\nUsually this means the macro was only invoked conditionally.]])\nfi])])\n\n# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009,\n# 2010, 2011 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 12\n\n# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be\n# written in clear, in which case automake, when reading aclocal.m4,\n# will think it sees a *use*, and therefore will trigger all it's\n# C support machinery.  Also note that it means that autoscan, seeing\n# CC etc. in the Makefile, will ask for an AC_PROG_CC use...\n\n\n# _AM_DEPENDENCIES(NAME)\n# ----------------------\n# See how the compiler implements dependency checking.\n# NAME is \"CC\", \"CXX\", \"GCJ\", or \"OBJC\".\n# We try a few techniques and use that to set a single cache variable.\n#\n# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was\n# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular\n# dependency, and given that the user is not expected to run this macro,\n# just rely on AC_PROG_CC.\nAC_DEFUN([_AM_DEPENDENCIES],\n[AC_REQUIRE([AM_SET_DEPDIR])dnl\nAC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl\nAC_REQUIRE([AM_MAKE_INCLUDE])dnl\nAC_REQUIRE([AM_DEP_TRACK])dnl\n\nifelse([$1], CC,   [depcc=\"$CC\"   am_compiler_list=],\n       [$1], CXX,  [depcc=\"$CXX\"  am_compiler_list=],\n       [$1], OBJC, [depcc=\"$OBJC\" am_compiler_list='gcc3 gcc'],\n       [$1], UPC,  [depcc=\"$UPC\"  am_compiler_list=],\n       [$1], GCJ,  [depcc=\"$GCJ\"  am_compiler_list='gcc3 gcc'],\n                   [depcc=\"$$1\"   am_compiler_list=])\n\nAC_CACHE_CHECK([dependency style of $depcc],\n               [am_cv_$1_dependencies_compiler_type],\n[if test -z \"$AMDEP_TRUE\" && test -f \"$am_depcomp\"; then\n  # We make a subdir and do the tests there.  Otherwise we can end up\n  # making bogus files that we don't know about and never remove.  For\n  # instance it was reported that on HP-UX the gcc test will end up\n  # making a dummy file named `D' -- because `-MD' means `put the output\n  # in D'.\n  rm -rf conftest.dir\n  mkdir conftest.dir\n  # Copy depcomp to subdir because otherwise we won't find it if we're\n  # using a relative directory.\n  cp \"$am_depcomp\" conftest.dir\n  cd conftest.dir\n  # We will build objects and dependencies in a subdirectory because\n  # it helps to detect inapplicable dependency modes.  For instance\n  # both Tru64's cc and ICC support -MD to output dependencies as a\n  # side effect of compilation, but ICC will put the dependencies in\n  # the current directory while Tru64 will put them in the object\n  # directory.\n  mkdir sub\n\n  am_cv_$1_dependencies_compiler_type=none\n  if test \"$am_compiler_list\" = \"\"; then\n     am_compiler_list=`sed -n ['s/^#*\\([a-zA-Z0-9]*\\))$/\\1/p'] < ./depcomp`\n  fi\n  am__universal=false\n  m4_case([$1], [CC],\n    [case \" $depcc \" in #(\n     *\\ -arch\\ *\\ -arch\\ *) am__universal=true ;;\n     esac],\n    [CXX],\n    [case \" $depcc \" in #(\n     *\\ -arch\\ *\\ -arch\\ *) am__universal=true ;;\n     esac])\n\n  for depmode in $am_compiler_list; do\n    # Setup a source with many dependencies, because some compilers\n    # like to wrap large dependency lists on column 80 (with \\), and\n    # we should not choose a depcomp mode which is confused by this.\n    #\n    # We need to recreate these files for each test, as the compiler may\n    # overwrite some of them when testing with obscure command lines.\n    # This happens at least with the AIX C compiler.\n    : > sub/conftest.c\n    for i in 1 2 3 4 5 6; do\n      echo '#include \"conftst'$i'.h\"' >> sub/conftest.c\n      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with\n      # Solaris 8's {/usr,}/bin/sh.\n      touch sub/conftst$i.h\n    done\n    echo \"${am__include} ${am__quote}sub/conftest.Po${am__quote}\" > confmf\n\n    # We check with `-c' and `-o' for the sake of the \"dashmstdout\"\n    # mode.  It turns out that the SunPro C++ compiler does not properly\n    # handle `-M -o', and we need to detect this.  Also, some Intel\n    # versions had trouble with output in subdirs\n    am__obj=sub/conftest.${OBJEXT-o}\n    am__minus_obj=\"-o $am__obj\"\n    case $depmode in\n    gcc)\n      # This depmode causes a compiler race in universal mode.\n      test \"$am__universal\" = false || continue\n      ;;\n    nosideeffect)\n      # after this tag, mechanisms are not by side-effect, so they'll\n      # only be used when explicitly requested\n      if test \"x$enable_dependency_tracking\" = xyes; then\n\tcontinue\n      else\n\tbreak\n      fi\n      ;;\n    msvc7 | msvc7msys | msvisualcpp | msvcmsys)\n      # This compiler won't grok `-c -o', but also, the minuso test has\n      # not run yet.  These depmodes are late enough in the game, and\n      # so weak that their functioning should not be impacted.\n      am__obj=conftest.${OBJEXT-o}\n      am__minus_obj=\n      ;;\n    none) break ;;\n    esac\n    if depmode=$depmode \\\n       source=sub/conftest.c object=$am__obj \\\n       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \\\n       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \\\n         >/dev/null 2>conftest.err &&\n       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&\n       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then\n      # icc doesn't choke on unknown options, it will just issue warnings\n      # or remarks (even with -Werror).  So we grep stderr for any message\n      # that says an option was ignored or not supported.\n      # When given -MP, icc 7.0 and 7.1 complain thusly:\n      #   icc: Command line warning: ignoring option '-M'; no argument required\n      # The diagnosis changed in icc 8.0:\n      #   icc: Command line remark: option '-MP' not supported\n      if (grep 'ignoring option' conftest.err ||\n          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else\n        am_cv_$1_dependencies_compiler_type=$depmode\n        break\n      fi\n    fi\n  done\n\n  cd ..\n  rm -rf conftest.dir\nelse\n  am_cv_$1_dependencies_compiler_type=none\nfi\n])\nAC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])\nAM_CONDITIONAL([am__fastdep$1], [\n  test \"x$enable_dependency_tracking\" != xno \\\n  && test \"$am_cv_$1_dependencies_compiler_type\" = gcc3])\n])\n\n\n# AM_SET_DEPDIR\n# -------------\n# Choose a directory name for dependency files.\n# This macro is AC_REQUIREd in _AM_DEPENDENCIES\nAC_DEFUN([AM_SET_DEPDIR],\n[AC_REQUIRE([AM_SET_LEADING_DOT])dnl\nAC_SUBST([DEPDIR], [\"${am__leading_dot}deps\"])dnl\n])\n\n\n# AM_DEP_TRACK\n# ------------\nAC_DEFUN([AM_DEP_TRACK],\n[AC_ARG_ENABLE(dependency-tracking,\n[  --disable-dependency-tracking  speeds up one-time build\n  --enable-dependency-tracking   do not reject slow dependency extractors])\nif test \"x$enable_dependency_tracking\" != xno; then\n  am_depcomp=\"$ac_aux_dir/depcomp\"\n  AMDEPBACKSLASH='\\'\n  am__nodep='_no'\nfi\nAM_CONDITIONAL([AMDEP], [test \"x$enable_dependency_tracking\" != xno])\nAC_SUBST([AMDEPBACKSLASH])dnl\n_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl\nAC_SUBST([am__nodep])dnl\n_AM_SUBST_NOTMAKE([am__nodep])dnl\n])\n\n# Generate code to set up dependency tracking.              -*- Autoconf -*-\n\n# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008\n# Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n#serial 5\n\n# _AM_OUTPUT_DEPENDENCY_COMMANDS\n# ------------------------------\nAC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],\n[{\n  # Autoconf 2.62 quotes --file arguments for eval, but not when files\n  # are listed without --file.  Let's play safe and only enable the eval\n  # if we detect the quoting.\n  case $CONFIG_FILES in\n  *\\'*) eval set x \"$CONFIG_FILES\" ;;\n  *)   set x $CONFIG_FILES ;;\n  esac\n  shift\n  for mf\n  do\n    # Strip MF so we end up with the name of the file.\n    mf=`echo \"$mf\" | sed -e 's/:.*$//'`\n    # Check whether this is an Automake generated Makefile or not.\n    # We used to match only the files named `Makefile.in', but\n    # some people rename them; so instead we look at the file content.\n    # Grep'ing the first line is not enough: some people post-process\n    # each Makefile.in and add a new line on top of each file to say so.\n    # Grep'ing the whole file is not good either: AIX grep has a line\n    # limit of 2048, but all sed's we know have understand at least 4000.\n    if sed -n 's,^#.*generated by automake.*,X,p' \"$mf\" | grep X >/dev/null 2>&1; then\n      dirpart=`AS_DIRNAME(\"$mf\")`\n    else\n      continue\n    fi\n    # Extract the definition of DEPDIR, am__include, and am__quote\n    # from the Makefile without running `make'.\n    DEPDIR=`sed -n 's/^DEPDIR = //p' < \"$mf\"`\n    test -z \"$DEPDIR\" && continue\n    am__include=`sed -n 's/^am__include = //p' < \"$mf\"`\n    test -z \"am__include\" && continue\n    am__quote=`sed -n 's/^am__quote = //p' < \"$mf\"`\n    # When using ansi2knr, U may be empty or an underscore; expand it\n    U=`sed -n 's/^U = //p' < \"$mf\"`\n    # Find all dependency output files, they are included files with\n    # $(DEPDIR) in their names.  We invoke sed twice because it is the\n    # simplest approach to changing $(DEPDIR) to its actual value in the\n    # expansion.\n    for file in `sed -n \"\n      s/^$am__include $am__quote\\(.*(DEPDIR).*\\)$am__quote\"'$/\\1/p' <\"$mf\" | \\\n\t sed -e 's/\\$(DEPDIR)/'\"$DEPDIR\"'/g' -e 's/\\$U/'\"$U\"'/g'`; do\n      # Make sure the directory exists.\n      test -f \"$dirpart/$file\" && continue\n      fdir=`AS_DIRNAME([\"$file\"])`\n      AS_MKDIR_P([$dirpart/$fdir])\n      # echo \"creating $dirpart/$file\"\n      echo '# dummy' > \"$dirpart/$file\"\n    done\n  done\n}\n])# _AM_OUTPUT_DEPENDENCY_COMMANDS\n\n\n# AM_OUTPUT_DEPENDENCY_COMMANDS\n# -----------------------------\n# This macro should only be invoked once -- use via AC_REQUIRE.\n#\n# This code is only required when automatic dependency tracking\n# is enabled.  FIXME.  This creates each `.P' file that we will\n# need in order to bootstrap the dependency handling code.\nAC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],\n[AC_CONFIG_COMMANDS([depfiles],\n     [test x\"$AMDEP_TRUE\" != x\"\" || _AM_OUTPUT_DEPENDENCY_COMMANDS],\n     [AMDEP_TRUE=\"$AMDEP_TRUE\" ac_aux_dir=\"$ac_aux_dir\"])\n])\n\n# Do all the work for Automake.                             -*- Autoconf -*-\n\n# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,\n# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 16\n\n# This macro actually does too much.  Some checks are only needed if\n# your package does certain things.  But this isn't really a big deal.\n\n# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])\n# AM_INIT_AUTOMAKE([OPTIONS])\n# -----------------------------------------------\n# The call with PACKAGE and VERSION arguments is the old style\n# call (pre autoconf-2.50), which is being phased out.  PACKAGE\n# and VERSION should now be passed to AC_INIT and removed from\n# the call to AM_INIT_AUTOMAKE.\n# We support both call styles for the transition.  After\n# the next Automake release, Autoconf can make the AC_INIT\n# arguments mandatory, and then we can depend on a new Autoconf\n# release and drop the old call support.\nAC_DEFUN([AM_INIT_AUTOMAKE],\n[AC_PREREQ([2.62])dnl\ndnl Autoconf wants to disallow AM_ names.  We explicitly allow\ndnl the ones we care about.\nm4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl\nAC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl\nAC_REQUIRE([AC_PROG_INSTALL])dnl\nif test \"`cd $srcdir && pwd`\" != \"`pwd`\"; then\n  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output\n  # is not polluted with repeated \"-I.\"\n  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl\n  # test to see if srcdir already configured\n  if test -f $srcdir/config.status; then\n    AC_MSG_ERROR([source directory already configured; run \"make distclean\" there first])\n  fi\nfi\n\n# test whether we have cygpath\nif test -z \"$CYGPATH_W\"; then\n  if (cygpath --version) >/dev/null 2>/dev/null; then\n    CYGPATH_W='cygpath -w'\n  else\n    CYGPATH_W=echo\n  fi\nfi\nAC_SUBST([CYGPATH_W])\n\n# Define the identity of the package.\ndnl Distinguish between old-style and new-style calls.\nm4_ifval([$2],\n[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl\n AC_SUBST([PACKAGE], [$1])dnl\n AC_SUBST([VERSION], [$2])],\n[_AM_SET_OPTIONS([$1])dnl\ndnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.\nm4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,\n  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl\n AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl\n AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl\n\n_AM_IF_OPTION([no-define],,\n[AC_DEFINE_UNQUOTED(PACKAGE, \"$PACKAGE\", [Name of package])\n AC_DEFINE_UNQUOTED(VERSION, \"$VERSION\", [Version number of package])])dnl\n\n# Some tools Automake needs.\nAC_REQUIRE([AM_SANITY_CHECK])dnl\nAC_REQUIRE([AC_ARG_PROGRAM])dnl\nAM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})\nAM_MISSING_PROG(AUTOCONF, autoconf)\nAM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})\nAM_MISSING_PROG(AUTOHEADER, autoheader)\nAM_MISSING_PROG(MAKEINFO, makeinfo)\nAC_REQUIRE([AM_PROG_INSTALL_SH])dnl\nAC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl\nAC_REQUIRE([AM_PROG_MKDIR_P])dnl\n# We need awk for the \"check\" target.  The system \"awk\" is bad on\n# some platforms.\nAC_REQUIRE([AC_PROG_AWK])dnl\nAC_REQUIRE([AC_PROG_MAKE_SET])dnl\nAC_REQUIRE([AM_SET_LEADING_DOT])dnl\n_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],\n\t      [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],\n\t\t\t     [_AM_PROG_TAR([v7])])])\n_AM_IF_OPTION([no-dependencies],,\n[AC_PROVIDE_IFELSE([AC_PROG_CC],\n\t\t  [_AM_DEPENDENCIES(CC)],\n\t\t  [define([AC_PROG_CC],\n\t\t\t  defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl\nAC_PROVIDE_IFELSE([AC_PROG_CXX],\n\t\t  [_AM_DEPENDENCIES(CXX)],\n\t\t  [define([AC_PROG_CXX],\n\t\t\t  defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl\nAC_PROVIDE_IFELSE([AC_PROG_OBJC],\n\t\t  [_AM_DEPENDENCIES(OBJC)],\n\t\t  [define([AC_PROG_OBJC],\n\t\t\t  defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl\n])\n_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl\ndnl The `parallel-tests' driver may need to know about EXEEXT, so add the\ndnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This macro\ndnl is hooked onto _AC_COMPILER_EXEEXT early, see below.\nAC_CONFIG_COMMANDS_PRE(dnl\n[m4_provide_if([_AM_COMPILER_EXEEXT],\n  [AM_CONDITIONAL([am__EXEEXT], [test -n \"$EXEEXT\"])])])dnl\n])\n\ndnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not\ndnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further\ndnl mangled by Autoconf and run in a shell conditional statement.\nm4_define([_AC_COMPILER_EXEEXT],\nm4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])\n\n\n# When config.status generates a header, we must update the stamp-h file.\n# This file resides in the same directory as the config header\n# that is generated.  The stamp files are numbered to have different names.\n\n# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the\n# loop where config.status creates the headers, so we can generate\n# our stamp files there.\nAC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],\n[# Compute $1's index in $config_headers.\n_am_arg=$1\n_am_stamp_count=1\nfor _am_header in $config_headers :; do\n  case $_am_header in\n    $_am_arg | $_am_arg:* )\n      break ;;\n    * )\n      _am_stamp_count=`expr $_am_stamp_count + 1` ;;\n  esac\ndone\necho \"timestamp for $_am_arg\" >`AS_DIRNAME([\"$_am_arg\"])`/stamp-h[]$_am_stamp_count])\n\n# Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation,\n# Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 1\n\n# AM_PROG_INSTALL_SH\n# ------------------\n# Define $install_sh.\nAC_DEFUN([AM_PROG_INSTALL_SH],\n[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl\nif test x\"${install_sh}\" != xset; then\n  case $am_aux_dir in\n  *\\ * | *\\\t*)\n    install_sh=\"\\${SHELL} '$am_aux_dir/install-sh'\" ;;\n  *)\n    install_sh=\"\\${SHELL} $am_aux_dir/install-sh\"\n  esac\nfi\nAC_SUBST(install_sh)])\n\n# Copyright (C) 2003, 2005  Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 2\n\n# Check whether the underlying file-system supports filenames\n# with a leading dot.  For instance MS-DOS doesn't.\nAC_DEFUN([AM_SET_LEADING_DOT],\n[rm -rf .tst 2>/dev/null\nmkdir .tst 2>/dev/null\nif test -d .tst; then\n  am__leading_dot=.\nelse\n  am__leading_dot=_\nfi\nrmdir .tst 2>/dev/null\nAC_SUBST([am__leading_dot])])\n\n# Check to see how 'make' treats includes.\t            -*- Autoconf -*-\n\n# Copyright (C) 2001, 2002, 2003, 2005, 2009  Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 4\n\n# AM_MAKE_INCLUDE()\n# -----------------\n# Check to see how make treats includes.\nAC_DEFUN([AM_MAKE_INCLUDE],\n[am_make=${MAKE-make}\ncat > confinc << 'END'\nam__doit:\n\t@echo this is the am__doit target\n.PHONY: am__doit\nEND\n# If we don't find an include directive, just comment out the code.\nAC_MSG_CHECKING([for style of include used by $am_make])\nam__include=\"#\"\nam__quote=\n_am_result=none\n# First try GNU make style include.\necho \"include confinc\" > confmf\n# Ignore all kinds of additional output from `make'.\ncase `$am_make -s -f confmf 2> /dev/null` in #(\n*the\\ am__doit\\ target*)\n  am__include=include\n  am__quote=\n  _am_result=GNU\n  ;;\nesac\n# Now try BSD make style include.\nif test \"$am__include\" = \"#\"; then\n   echo '.include \"confinc\"' > confmf\n   case `$am_make -s -f confmf 2> /dev/null` in #(\n   *the\\ am__doit\\ target*)\n     am__include=.include\n     am__quote=\"\\\"\"\n     _am_result=BSD\n     ;;\n   esac\nfi\nAC_SUBST([am__include])\nAC_SUBST([am__quote])\nAC_MSG_RESULT([$_am_result])\nrm -f confinc confmf\n])\n\n# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-\n\n# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008\n# Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 6\n\n# AM_MISSING_PROG(NAME, PROGRAM)\n# ------------------------------\nAC_DEFUN([AM_MISSING_PROG],\n[AC_REQUIRE([AM_MISSING_HAS_RUN])\n$1=${$1-\"${am_missing_run}$2\"}\nAC_SUBST($1)])\n\n\n# AM_MISSING_HAS_RUN\n# ------------------\n# Define MISSING if not defined so far and test if it supports --run.\n# If it does, set am_missing_run to use it, otherwise, to nothing.\nAC_DEFUN([AM_MISSING_HAS_RUN],\n[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl\nAC_REQUIRE_AUX_FILE([missing])dnl\nif test x\"${MISSING+set}\" != xset; then\n  case $am_aux_dir in\n  *\\ * | *\\\t*)\n    MISSING=\"\\${SHELL} \\\"$am_aux_dir/missing\\\"\" ;;\n  *)\n    MISSING=\"\\${SHELL} $am_aux_dir/missing\" ;;\n  esac\nfi\n# Use eval to expand $SHELL\nif eval \"$MISSING --run true\"; then\n  am_missing_run=\"$MISSING --run \"\nelse\n  am_missing_run=\n  AC_MSG_WARN([`missing' script is too old or missing])\nfi\n])\n\n# Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation,\n# Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 1\n\n# AM_PROG_MKDIR_P\n# ---------------\n# Check for `mkdir -p'.\nAC_DEFUN([AM_PROG_MKDIR_P],\n[AC_PREREQ([2.60])dnl\nAC_REQUIRE([AC_PROG_MKDIR_P])dnl\ndnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,\ndnl while keeping a definition of mkdir_p for backward compatibility.\ndnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.\ndnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of\ndnl Makefile.ins that do not define MKDIR_P, so we do our own\ndnl adjustment using top_builddir (which is defined more often than\ndnl MKDIR_P).\nAC_SUBST([mkdir_p], [\"$MKDIR_P\"])dnl\ncase $mkdir_p in\n  [[\\\\/$]]* | ?:[[\\\\/]]*) ;;\n  */*) mkdir_p=\"\\$(top_builddir)/$mkdir_p\" ;;\nesac\n])\n\n# Helper functions for option handling.                     -*- Autoconf -*-\n\n# Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software\n# Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 5\n\n# _AM_MANGLE_OPTION(NAME)\n# -----------------------\nAC_DEFUN([_AM_MANGLE_OPTION],\n[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])\n\n# _AM_SET_OPTION(NAME)\n# --------------------\n# Set option NAME.  Presently that only means defining a flag for this option.\nAC_DEFUN([_AM_SET_OPTION],\n[m4_define(_AM_MANGLE_OPTION([$1]), 1)])\n\n# _AM_SET_OPTIONS(OPTIONS)\n# ------------------------\n# OPTIONS is a space-separated list of Automake options.\nAC_DEFUN([_AM_SET_OPTIONS],\n[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])\n\n# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])\n# -------------------------------------------\n# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.\nAC_DEFUN([_AM_IF_OPTION],\n[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])\n\n# Check to make sure that the build environment is sane.    -*- Autoconf -*-\n\n# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008\n# Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 5\n\n# AM_SANITY_CHECK\n# ---------------\nAC_DEFUN([AM_SANITY_CHECK],\n[AC_MSG_CHECKING([whether build environment is sane])\n# Just in case\nsleep 1\necho timestamp > conftest.file\n# Reject unsafe characters in $srcdir or the absolute working directory\n# name.  Accept space and tab only in the latter.\nam_lf='\n'\ncase `pwd` in\n  *[[\\\\\\\"\\#\\$\\&\\'\\`$am_lf]]*)\n    AC_MSG_ERROR([unsafe absolute working directory name]);;\nesac\ncase $srcdir in\n  *[[\\\\\\\"\\#\\$\\&\\'\\`$am_lf\\ \\\t]]*)\n    AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;\nesac\n\n# Do `set' in a subshell so we don't clobber the current shell's\n# arguments.  Must try -L first in case configure is actually a\n# symlink; some systems play weird games with the mod time of symlinks\n# (eg FreeBSD returns the mod time of the symlink's containing\n# directory).\nif (\n   set X `ls -Lt \"$srcdir/configure\" conftest.file 2> /dev/null`\n   if test \"$[*]\" = \"X\"; then\n      # -L didn't work.\n      set X `ls -t \"$srcdir/configure\" conftest.file`\n   fi\n   rm -f conftest.file\n   if test \"$[*]\" != \"X $srcdir/configure conftest.file\" \\\n      && test \"$[*]\" != \"X conftest.file $srcdir/configure\"; then\n\n      # If neither matched, then we have a broken ls.  This can happen\n      # if, for instance, CONFIG_SHELL is bash and it inherits a\n      # broken ls alias from the environment.  This has actually\n      # happened.  Such a system could not be considered \"sane\".\n      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken\nalias in your environment])\n   fi\n\n   test \"$[2]\" = conftest.file\n   )\nthen\n   # Ok.\n   :\nelse\n   AC_MSG_ERROR([newly created file is older than distributed files!\nCheck your system clock])\nfi\nAC_MSG_RESULT(yes)])\n\n# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 1\n\n# AM_PROG_INSTALL_STRIP\n# ---------------------\n# One issue with vendor `install' (even GNU) is that you can't\n# specify the program used to strip binaries.  This is especially\n# annoying in cross-compiling environments, where the build's strip\n# is unlikely to handle the host's binaries.\n# Fortunately install-sh will honor a STRIPPROG variable, so we\n# always use install-sh in `make install-strip', and initialize\n# STRIPPROG with the value of the STRIP variable (set by the user).\nAC_DEFUN([AM_PROG_INSTALL_STRIP],\n[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl\n# Installed binaries are usually stripped using `strip' when the user\n# run `make install-strip'.  However `strip' might not be the right\n# tool to use in cross-compilation environments, therefore Automake\n# will honor the `STRIP' environment variable to overrule this program.\ndnl Don't test for $cross_compiling = yes, because it might be `maybe'.\nif test \"$cross_compiling\" != no; then\n  AC_CHECK_TOOL([STRIP], [strip], :)\nfi\nINSTALL_STRIP_PROGRAM=\"\\$(install_sh) -c -s\"\nAC_SUBST([INSTALL_STRIP_PROGRAM])])\n\n# Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 3\n\n# _AM_SUBST_NOTMAKE(VARIABLE)\n# ---------------------------\n# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.\n# This macro is traced by Automake.\nAC_DEFUN([_AM_SUBST_NOTMAKE])\n\n# AM_SUBST_NOTMAKE(VARIABLE)\n# --------------------------\n# Public sister of _AM_SUBST_NOTMAKE.\nAC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])\n\n# Check how to create a tarball.                            -*- Autoconf -*-\n\n# Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 2\n\n# _AM_PROG_TAR(FORMAT)\n# --------------------\n# Check how to create a tarball in format FORMAT.\n# FORMAT should be one of `v7', `ustar', or `pax'.\n#\n# Substitute a variable $(am__tar) that is a command\n# writing to stdout a FORMAT-tarball containing the directory\n# $tardir.\n#     tardir=directory && $(am__tar) > result.tar\n#\n# Substitute a variable $(am__untar) that extract such\n# a tarball read from stdin.\n#     $(am__untar) < result.tar\nAC_DEFUN([_AM_PROG_TAR],\n[# Always define AMTAR for backward compatibility.  Yes, it's still used\n# in the wild :-(  We should find a proper way to deprecate it ...\nAC_SUBST([AMTAR], ['$${TAR-tar}'])\nm4_if([$1], [v7],\n     [am__tar='$${TAR-tar} chof - \"$$tardir\"' am__untar='$${TAR-tar} xf -'],\n     [m4_case([$1], [ustar],, [pax],,\n              [m4_fatal([Unknown tar format])])\nAC_MSG_CHECKING([how to create a $1 tar archive])\n# Loop over all known methods to create a tar archive until one works.\n_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'\n_am_tools=${am_cv_prog_tar_$1-$_am_tools}\n# Do not fold the above two line into one, because Tru64 sh and\n# Solaris sh will not grok spaces in the rhs of `-'.\nfor _am_tool in $_am_tools\ndo\n  case $_am_tool in\n  gnutar)\n    for _am_tar in tar gnutar gtar;\n    do\n      AM_RUN_LOG([$_am_tar --version]) && break\n    done\n    am__tar=\"$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - \"'\"$$tardir\"'\n    am__tar_=\"$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - \"'\"$tardir\"'\n    am__untar=\"$_am_tar -xf -\"\n    ;;\n  plaintar)\n    # Must skip GNU tar: if it does not support --format= it doesn't create\n    # ustar tarball either.\n    (tar --version) >/dev/null 2>&1 && continue\n    am__tar='tar chf - \"$$tardir\"'\n    am__tar_='tar chf - \"$tardir\"'\n    am__untar='tar xf -'\n    ;;\n  pax)\n    am__tar='pax -L -x $1 -w \"$$tardir\"'\n    am__tar_='pax -L -x $1 -w \"$tardir\"'\n    am__untar='pax -r'\n    ;;\n  cpio)\n    am__tar='find \"$$tardir\" -print | cpio -o -H $1 -L'\n    am__tar_='find \"$tardir\" -print | cpio -o -H $1 -L'\n    am__untar='cpio -i -H $1 -d'\n    ;;\n  none)\n    am__tar=false\n    am__tar_=false\n    am__untar=false\n    ;;\n  esac\n\n  # If the value was cached, stop now.  We just wanted to have am__tar\n  # and am__untar set.\n  test -n \"${am_cv_prog_tar_$1}\" && break\n\n  # tar/untar a dummy directory, and stop if the command works\n  rm -rf conftest.dir\n  mkdir conftest.dir\n  echo GrepMe > conftest.dir/file\n  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])\n  rm -rf conftest.dir\n  if test -s conftest.tar; then\n    AM_RUN_LOG([$am__untar <conftest.tar])\n    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break\n  fi\ndone\nrm -rf conftest.dir\n\nAC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])\nAC_MSG_RESULT([$am_cv_prog_tar_$1])])\nAC_SUBST([am__tar])\nAC_SUBST([am__untar])\n]) # _AM_PROG_TAR\n\nm4_include([m4/libtool.m4])\nm4_include([m4/ltoptions.m4])\nm4_include([m4/ltsugar.m4])\nm4_include([m4/ltversion.m4])\nm4_include([m4/lt~obsolete.m4])\n"
  },
  {
    "path": "libs/CoMISo/gmm/config.guess",
    "content": "#! /bin/sh\n# Attempt to guess a canonical system name.\n#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,\n#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,\n#   2011, 2012 Free Software Foundation, Inc.\n\ntimestamp='2012-02-10'\n\n# This file is free software; you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 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, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# 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 <http://www.gnu.org/licenses/>.\n#\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\n\n# Originally written by Per Bothner.  Please send patches (context\n# diff format) to <config-patches@gnu.org> and include a ChangeLog\n# entry.\n#\n# This script attempts to guess a canonical system name similar to\n# config.sub.  If it succeeds, it prints the system name on stdout, and\n# exits with 0.  Otherwise, it exits with 1.\n#\n# You can get the latest version of this script from:\n# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD\n\nme=`echo \"$0\" | sed -e 's,.*/,,'`\n\nusage=\"\\\nUsage: $0 [OPTION]\n\nOutput the configuration name of the system \\`$me' is run on.\n\nOperation modes:\n  -h, --help         print this help, then exit\n  -t, --time-stamp   print date of last modification, then exit\n  -v, --version      print version number, then exit\n\nReport bugs and patches to <config-patches@gnu.org>.\"\n\nversion=\"\\\nGNU config.guess ($timestamp)\n\nOriginally written by Per Bothner.\nCopyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,\n2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012\nFree Software Foundation, Inc.\n\nThis is free software; see the source for copying conditions.  There is NO\nwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\"\n\nhelp=\"\nTry \\`$me --help' for more information.\"\n\n# Parse command line\nwhile test $# -gt 0 ; do\n  case $1 in\n    --time-stamp | --time* | -t )\n       echo \"$timestamp\" ; exit ;;\n    --version | -v )\n       echo \"$version\" ; exit ;;\n    --help | --h* | -h )\n       echo \"$usage\"; exit ;;\n    -- )     # Stop option processing\n       shift; break ;;\n    - )\t# Use stdin as input.\n       break ;;\n    -* )\n       echo \"$me: invalid option $1$help\" >&2\n       exit 1 ;;\n    * )\n       break ;;\n  esac\ndone\n\nif test $# != 0; then\n  echo \"$me: too many arguments$help\" >&2\n  exit 1\nfi\n\ntrap 'exit 1' 1 2 15\n\n# CC_FOR_BUILD -- compiler used by this script. Note that the use of a\n# compiler to aid in system detection is discouraged as it requires\n# temporary files to be created and, as you can see below, it is a\n# headache to deal with in a portable fashion.\n\n# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still\n# use `HOST_CC' if defined, but it is deprecated.\n\n# Portable tmp directory creation inspired by the Autoconf team.\n\nset_cc_for_build='\ntrap \"exitcode=\\$?; (rm -f \\$tmpfiles 2>/dev/null; rmdir \\$tmp 2>/dev/null) && exit \\$exitcode\" 0 ;\ntrap \"rm -f \\$tmpfiles 2>/dev/null; rmdir \\$tmp 2>/dev/null; exit 1\" 1 2 13 15 ;\n: ${TMPDIR=/tmp} ;\n { tmp=`(umask 077 && mktemp -d \"$TMPDIR/cgXXXXXX\") 2>/dev/null` && test -n \"$tmp\" && test -d \"$tmp\" ; } ||\n { test -n \"$RANDOM\" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||\n { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo \"Warning: creating insecure temp directory\" >&2 ; } ||\n { echo \"$me: cannot create a temporary directory in $TMPDIR\" >&2 ; exit 1 ; } ;\ndummy=$tmp/dummy ;\ntmpfiles=\"$dummy.c $dummy.o $dummy.rel $dummy\" ;\ncase $CC_FOR_BUILD,$HOST_CC,$CC in\n ,,)    echo \"int x;\" > $dummy.c ;\n\tfor c in cc gcc c89 c99 ; do\n\t  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then\n\t     CC_FOR_BUILD=\"$c\"; break ;\n\t  fi ;\n\tdone ;\n\tif test x\"$CC_FOR_BUILD\" = x ; then\n\t  CC_FOR_BUILD=no_compiler_found ;\n\tfi\n\t;;\n ,,*)   CC_FOR_BUILD=$CC ;;\n ,*,*)  CC_FOR_BUILD=$HOST_CC ;;\nesac ; set_cc_for_build= ;'\n\n# This is needed to find uname on a Pyramid OSx when run in the BSD universe.\n# (ghazi@noc.rutgers.edu 1994-08-24)\nif (test -f /.attbin/uname) >/dev/null 2>&1 ; then\n\tPATH=$PATH:/.attbin ; export PATH\nfi\n\nUNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown\nUNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown\nUNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown\nUNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown\n\n# Note: order is significant - the case branches are not exclusive.\n\ncase \"${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}\" in\n    *:NetBSD:*:*)\n\t# NetBSD (nbsd) targets should (where applicable) match one or\n\t# more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,\n\t# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently\n\t# switched to ELF, *-*-netbsd* would select the old\n\t# object file format.  This provides both forward\n\t# compatibility and a consistent mechanism for selecting the\n\t# object file format.\n\t#\n\t# Note: NetBSD doesn't particularly care about the vendor\n\t# portion of the name.  We always set it to \"unknown\".\n\tsysctl=\"sysctl -n hw.machine_arch\"\n\tUNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \\\n\t    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`\n\tcase \"${UNAME_MACHINE_ARCH}\" in\n\t    armeb) machine=armeb-unknown ;;\n\t    arm*) machine=arm-unknown ;;\n\t    sh3el) machine=shl-unknown ;;\n\t    sh3eb) machine=sh-unknown ;;\n\t    sh5el) machine=sh5le-unknown ;;\n\t    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;\n\tesac\n\t# The Operating System including object format, if it has switched\n\t# to ELF recently, or will in the future.\n\tcase \"${UNAME_MACHINE_ARCH}\" in\n\t    arm*|i386|m68k|ns32k|sh3*|sparc|vax)\n\t\teval $set_cc_for_build\n\t\tif echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \\\n\t\t\t| grep -q __ELF__\n\t\tthen\n\t\t    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).\n\t\t    # Return netbsd for either.  FIX?\n\t\t    os=netbsd\n\t\telse\n\t\t    os=netbsdelf\n\t\tfi\n\t\t;;\n\t    *)\n\t\tos=netbsd\n\t\t;;\n\tesac\n\t# The OS release\n\t# Debian GNU/NetBSD machines have a different userland, and\n\t# thus, need a distinct triplet. However, they do not need\n\t# kernel version information, so it can be replaced with a\n\t# suitable tag, in the style of linux-gnu.\n\tcase \"${UNAME_VERSION}\" in\n\t    Debian*)\n\t\trelease='-gnu'\n\t\t;;\n\t    *)\n\t\trelease=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\\./'`\n\t\t;;\n\tesac\n\t# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:\n\t# contains redundant information, the shorter form:\n\t# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.\n\techo \"${machine}-${os}${release}\"\n\texit ;;\n    *:OpenBSD:*:*)\n\tUNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`\n\techo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}\n\texit ;;\n    *:ekkoBSD:*:*)\n\techo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}\n\texit ;;\n    *:SolidBSD:*:*)\n\techo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}\n\texit ;;\n    macppc:MirBSD:*:*)\n\techo powerpc-unknown-mirbsd${UNAME_RELEASE}\n\texit ;;\n    *:MirBSD:*:*)\n\techo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}\n\texit ;;\n    alpha:OSF1:*:*)\n\tcase $UNAME_RELEASE in\n\t*4.0)\n\t\tUNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`\n\t\t;;\n\t*5.*)\n\t\tUNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`\n\t\t;;\n\tesac\n\t# According to Compaq, /usr/sbin/psrinfo has been available on\n\t# OSF/1 and Tru64 systems produced since 1995.  I hope that\n\t# covers most systems running today.  This code pipes the CPU\n\t# types through head -n 1, so we only detect the type of CPU 0.\n\tALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \\(.*\\) processor.*$/\\1/p' | head -n 1`\n\tcase \"$ALPHA_CPU_TYPE\" in\n\t    \"EV4 (21064)\")\n\t\tUNAME_MACHINE=\"alpha\" ;;\n\t    \"EV4.5 (21064)\")\n\t\tUNAME_MACHINE=\"alpha\" ;;\n\t    \"LCA4 (21066/21068)\")\n\t\tUNAME_MACHINE=\"alpha\" ;;\n\t    \"EV5 (21164)\")\n\t\tUNAME_MACHINE=\"alphaev5\" ;;\n\t    \"EV5.6 (21164A)\")\n\t\tUNAME_MACHINE=\"alphaev56\" ;;\n\t    \"EV5.6 (21164PC)\")\n\t\tUNAME_MACHINE=\"alphapca56\" ;;\n\t    \"EV5.7 (21164PC)\")\n\t\tUNAME_MACHINE=\"alphapca57\" ;;\n\t    \"EV6 (21264)\")\n\t\tUNAME_MACHINE=\"alphaev6\" ;;\n\t    \"EV6.7 (21264A)\")\n\t\tUNAME_MACHINE=\"alphaev67\" ;;\n\t    \"EV6.8CB (21264C)\")\n\t\tUNAME_MACHINE=\"alphaev68\" ;;\n\t    \"EV6.8AL (21264B)\")\n\t\tUNAME_MACHINE=\"alphaev68\" ;;\n\t    \"EV6.8CX (21264D)\")\n\t\tUNAME_MACHINE=\"alphaev68\" ;;\n\t    \"EV6.9A (21264/EV69A)\")\n\t\tUNAME_MACHINE=\"alphaev69\" ;;\n\t    \"EV7 (21364)\")\n\t\tUNAME_MACHINE=\"alphaev7\" ;;\n\t    \"EV7.9 (21364A)\")\n\t\tUNAME_MACHINE=\"alphaev79\" ;;\n\tesac\n\t# A Pn.n version is a patched version.\n\t# A Vn.n version is a released version.\n\t# A Tn.n version is a released field test version.\n\t# A Xn.n version is an unreleased experimental baselevel.\n\t# 1.2 uses \"1.2\" for uname -r.\n\techo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`\n\t# Reset EXIT trap before exiting to avoid spurious non-zero exit code.\n\texitcode=$?\n\ttrap '' 0\n\texit $exitcode ;;\n    Alpha\\ *:Windows_NT*:*)\n\t# How do we know it's Interix rather than the generic POSIX subsystem?\n\t# Should we change UNAME_MACHINE based on the output of uname instead\n\t# of the specific Alpha model?\n\techo alpha-pc-interix\n\texit ;;\n    21064:Windows_NT:50:3)\n\techo alpha-dec-winnt3.5\n\texit ;;\n    Amiga*:UNIX_System_V:4.0:*)\n\techo m68k-unknown-sysv4\n\texit ;;\n    *:[Aa]miga[Oo][Ss]:*:*)\n\techo ${UNAME_MACHINE}-unknown-amigaos\n\texit ;;\n    *:[Mm]orph[Oo][Ss]:*:*)\n\techo ${UNAME_MACHINE}-unknown-morphos\n\texit ;;\n    *:OS/390:*:*)\n\techo i370-ibm-openedition\n\texit ;;\n    *:z/VM:*:*)\n\techo s390-ibm-zvmoe\n\texit ;;\n    *:OS400:*:*)\n\techo powerpc-ibm-os400\n\texit ;;\n    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)\n\techo arm-acorn-riscix${UNAME_RELEASE}\n\texit ;;\n    arm:riscos:*:*|arm:RISCOS:*:*)\n\techo arm-unknown-riscos\n\texit ;;\n    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)\n\techo hppa1.1-hitachi-hiuxmpp\n\texit ;;\n    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)\n\t# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.\n\tif test \"`(/bin/universe) 2>/dev/null`\" = att ; then\n\t\techo pyramid-pyramid-sysv3\n\telse\n\t\techo pyramid-pyramid-bsd\n\tfi\n\texit ;;\n    NILE*:*:*:dcosx)\n\techo pyramid-pyramid-svr4\n\texit ;;\n    DRS?6000:unix:4.0:6*)\n\techo sparc-icl-nx6\n\texit ;;\n    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)\n\tcase `/usr/bin/uname -p` in\n\t    sparc) echo sparc-icl-nx7; exit ;;\n\tesac ;;\n    s390x:SunOS:*:*)\n\techo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit ;;\n    sun4H:SunOS:5.*:*)\n\techo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit ;;\n    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)\n\techo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit ;;\n    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)\n\techo i386-pc-auroraux${UNAME_RELEASE}\n\texit ;;\n    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)\n\teval $set_cc_for_build\n\tSUN_ARCH=\"i386\"\n\t# If there is a compiler, see if it is configured for 64-bit objects.\n\t# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.\n\t# This test works for both compilers.\n\tif [ \"$CC_FOR_BUILD\" != 'no_compiler_found' ]; then\n\t    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \\\n\t\t(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \\\n\t\tgrep IS_64BIT_ARCH >/dev/null\n\t    then\n\t\tSUN_ARCH=\"x86_64\"\n\t    fi\n\tfi\n\techo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit ;;\n    sun4*:SunOS:6*:*)\n\t# According to config.sub, this is the proper way to canonicalize\n\t# SunOS6.  Hard to guess exactly what SunOS6 will be like, but\n\t# it's likely to be more like Solaris than SunOS4.\n\techo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit ;;\n    sun4*:SunOS:*:*)\n\tcase \"`/usr/bin/arch -k`\" in\n\t    Series*|S4*)\n\t\tUNAME_RELEASE=`uname -v`\n\t\t;;\n\tesac\n\t# Japanese Language versions have a version number like `4.1.3-JL'.\n\techo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`\n\texit ;;\n    sun3*:SunOS:*:*)\n\techo m68k-sun-sunos${UNAME_RELEASE}\n\texit ;;\n    sun*:*:4.2BSD:*)\n\tUNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`\n\ttest \"x${UNAME_RELEASE}\" = \"x\" && UNAME_RELEASE=3\n\tcase \"`/bin/arch`\" in\n\t    sun3)\n\t\techo m68k-sun-sunos${UNAME_RELEASE}\n\t\t;;\n\t    sun4)\n\t\techo sparc-sun-sunos${UNAME_RELEASE}\n\t\t;;\n\tesac\n\texit ;;\n    aushp:SunOS:*:*)\n\techo sparc-auspex-sunos${UNAME_RELEASE}\n\texit ;;\n    # The situation for MiNT is a little confusing.  The machine name\n    # can be virtually everything (everything which is not\n    # \"atarist\" or \"atariste\" at least should have a processor\n    # > m68000).  The system name ranges from \"MiNT\" over \"FreeMiNT\"\n    # to the lowercase version \"mint\" (or \"freemint\").  Finally\n    # the system name \"TOS\" denotes a system which is actually not\n    # MiNT.  But MiNT is downward compatible to TOS, so this should\n    # be no problem.\n    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)\n\techo m68k-atari-mint${UNAME_RELEASE}\n\texit ;;\n    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)\n\techo m68k-atari-mint${UNAME_RELEASE}\n\texit ;;\n    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)\n\techo m68k-atari-mint${UNAME_RELEASE}\n\texit ;;\n    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)\n\techo m68k-milan-mint${UNAME_RELEASE}\n\texit ;;\n    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)\n\techo m68k-hades-mint${UNAME_RELEASE}\n\texit ;;\n    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)\n\techo m68k-unknown-mint${UNAME_RELEASE}\n\texit ;;\n    m68k:machten:*:*)\n\techo m68k-apple-machten${UNAME_RELEASE}\n\texit ;;\n    powerpc:machten:*:*)\n\techo powerpc-apple-machten${UNAME_RELEASE}\n\texit ;;\n    RISC*:Mach:*:*)\n\techo mips-dec-mach_bsd4.3\n\texit ;;\n    RISC*:ULTRIX:*:*)\n\techo mips-dec-ultrix${UNAME_RELEASE}\n\texit ;;\n    VAX*:ULTRIX*:*:*)\n\techo vax-dec-ultrix${UNAME_RELEASE}\n\texit ;;\n    2020:CLIX:*:* | 2430:CLIX:*:*)\n\techo clipper-intergraph-clix${UNAME_RELEASE}\n\texit ;;\n    mips:*:*:UMIPS | mips:*:*:RISCos)\n\teval $set_cc_for_build\n\tsed 's/^\t//' << EOF >$dummy.c\n#ifdef __cplusplus\n#include <stdio.h>  /* for printf() prototype */\n\tint main (int argc, char *argv[]) {\n#else\n\tint main (argc, argv) int argc; char *argv[]; {\n#endif\n\t#if defined (host_mips) && defined (MIPSEB)\n\t#if defined (SYSTYPE_SYSV)\n\t  printf (\"mips-mips-riscos%ssysv\\n\", argv[1]); exit (0);\n\t#endif\n\t#if defined (SYSTYPE_SVR4)\n\t  printf (\"mips-mips-riscos%ssvr4\\n\", argv[1]); exit (0);\n\t#endif\n\t#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)\n\t  printf (\"mips-mips-riscos%sbsd\\n\", argv[1]); exit (0);\n\t#endif\n\t#endif\n\t  exit (-1);\n\t}\nEOF\n\t$CC_FOR_BUILD -o $dummy $dummy.c &&\n\t  dummyarg=`echo \"${UNAME_RELEASE}\" | sed -n 's/\\([0-9]*\\).*/\\1/p'` &&\n\t  SYSTEM_NAME=`$dummy $dummyarg` &&\n\t    { echo \"$SYSTEM_NAME\"; exit; }\n\techo mips-mips-riscos${UNAME_RELEASE}\n\texit ;;\n    Motorola:PowerMAX_OS:*:*)\n\techo powerpc-motorola-powermax\n\texit ;;\n    Motorola:*:4.3:PL8-*)\n\techo powerpc-harris-powermax\n\texit ;;\n    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)\n\techo powerpc-harris-powermax\n\texit ;;\n    Night_Hawk:Power_UNIX:*:*)\n\techo powerpc-harris-powerunix\n\texit ;;\n    m88k:CX/UX:7*:*)\n\techo m88k-harris-cxux7\n\texit ;;\n    m88k:*:4*:R4*)\n\techo m88k-motorola-sysv4\n\texit ;;\n    m88k:*:3*:R3*)\n\techo m88k-motorola-sysv3\n\texit ;;\n    AViiON:dgux:*:*)\n\t# DG/UX returns AViiON for all architectures\n\tUNAME_PROCESSOR=`/usr/bin/uname -p`\n\tif [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]\n\tthen\n\t    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \\\n\t       [ ${TARGET_BINARY_INTERFACE}x = x ]\n\t    then\n\t\techo m88k-dg-dgux${UNAME_RELEASE}\n\t    else\n\t\techo m88k-dg-dguxbcs${UNAME_RELEASE}\n\t    fi\n\telse\n\t    echo i586-dg-dgux${UNAME_RELEASE}\n\tfi\n\texit ;;\n    M88*:DolphinOS:*:*)\t# DolphinOS (SVR3)\n\techo m88k-dolphin-sysv3\n\texit ;;\n    M88*:*:R3*:*)\n\t# Delta 88k system running SVR3\n\techo m88k-motorola-sysv3\n\texit ;;\n    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)\n\techo m88k-tektronix-sysv3\n\texit ;;\n    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)\n\techo m68k-tektronix-bsd\n\texit ;;\n    *:IRIX*:*:*)\n\techo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`\n\texit ;;\n    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.\n\techo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id\n\texit ;;               # Note that: echo \"'`uname -s`'\" gives 'AIX '\n    i*86:AIX:*:*)\n\techo i386-ibm-aix\n\texit ;;\n    ia64:AIX:*:*)\n\tif [ -x /usr/bin/oslevel ] ; then\n\t\tIBM_REV=`/usr/bin/oslevel`\n\telse\n\t\tIBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}\n\tfi\n\techo ${UNAME_MACHINE}-ibm-aix${IBM_REV}\n\texit ;;\n    *:AIX:2:3)\n\tif grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then\n\t\teval $set_cc_for_build\n\t\tsed 's/^\t\t//' << EOF >$dummy.c\n\t\t#include <sys/systemcfg.h>\n\n\t\tmain()\n\t\t\t{\n\t\t\tif (!__power_pc())\n\t\t\t\texit(1);\n\t\t\tputs(\"powerpc-ibm-aix3.2.5\");\n\t\t\texit(0);\n\t\t\t}\nEOF\n\t\tif $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`\n\t\tthen\n\t\t\techo \"$SYSTEM_NAME\"\n\t\telse\n\t\t\techo rs6000-ibm-aix3.2.5\n\t\tfi\n\telif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then\n\t\techo rs6000-ibm-aix3.2.4\n\telse\n\t\techo rs6000-ibm-aix3.2\n\tfi\n\texit ;;\n    *:AIX:*:[4567])\n\tIBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`\n\tif /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then\n\t\tIBM_ARCH=rs6000\n\telse\n\t\tIBM_ARCH=powerpc\n\tfi\n\tif [ -x /usr/bin/oslevel ] ; then\n\t\tIBM_REV=`/usr/bin/oslevel`\n\telse\n\t\tIBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}\n\tfi\n\techo ${IBM_ARCH}-ibm-aix${IBM_REV}\n\texit ;;\n    *:AIX:*:*)\n\techo rs6000-ibm-aix\n\texit ;;\n    ibmrt:4.4BSD:*|romp-ibm:BSD:*)\n\techo romp-ibm-bsd4.4\n\texit ;;\n    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and\n\techo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to\n\texit ;;                             # report: romp-ibm BSD 4.3\n    *:BOSX:*:*)\n\techo rs6000-bull-bosx\n\texit ;;\n    DPX/2?00:B.O.S.:*:*)\n\techo m68k-bull-sysv3\n\texit ;;\n    9000/[34]??:4.3bsd:1.*:*)\n\techo m68k-hp-bsd\n\texit ;;\n    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)\n\techo m68k-hp-bsd4.4\n\texit ;;\n    9000/[34678]??:HP-UX:*:*)\n\tHPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`\n\tcase \"${UNAME_MACHINE}\" in\n\t    9000/31? )            HP_ARCH=m68000 ;;\n\t    9000/[34]?? )         HP_ARCH=m68k ;;\n\t    9000/[678][0-9][0-9])\n\t\tif [ -x /usr/bin/getconf ]; then\n\t\t    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`\n\t\t    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`\n\t\t    case \"${sc_cpu_version}\" in\n\t\t      523) HP_ARCH=\"hppa1.0\" ;; # CPU_PA_RISC1_0\n\t\t      528) HP_ARCH=\"hppa1.1\" ;; # CPU_PA_RISC1_1\n\t\t      532)                      # CPU_PA_RISC2_0\n\t\t\tcase \"${sc_kernel_bits}\" in\n\t\t\t  32) HP_ARCH=\"hppa2.0n\" ;;\n\t\t\t  64) HP_ARCH=\"hppa2.0w\" ;;\n\t\t\t  '') HP_ARCH=\"hppa2.0\" ;;   # HP-UX 10.20\n\t\t\tesac ;;\n\t\t    esac\n\t\tfi\n\t\tif [ \"${HP_ARCH}\" = \"\" ]; then\n\t\t    eval $set_cc_for_build\n\t\t    sed 's/^\t\t//' << EOF >$dummy.c\n\n\t\t#define _HPUX_SOURCE\n\t\t#include <stdlib.h>\n\t\t#include <unistd.h>\n\n\t\tint main ()\n\t\t{\n\t\t#if defined(_SC_KERNEL_BITS)\n\t\t    long bits = sysconf(_SC_KERNEL_BITS);\n\t\t#endif\n\t\t    long cpu  = sysconf (_SC_CPU_VERSION);\n\n\t\t    switch (cpu)\n\t\t\t{\n\t\t\tcase CPU_PA_RISC1_0: puts (\"hppa1.0\"); break;\n\t\t\tcase CPU_PA_RISC1_1: puts (\"hppa1.1\"); break;\n\t\t\tcase CPU_PA_RISC2_0:\n\t\t#if defined(_SC_KERNEL_BITS)\n\t\t\t    switch (bits)\n\t\t\t\t{\n\t\t\t\tcase 64: puts (\"hppa2.0w\"); break;\n\t\t\t\tcase 32: puts (\"hppa2.0n\"); break;\n\t\t\t\tdefault: puts (\"hppa2.0\"); break;\n\t\t\t\t} break;\n\t\t#else  /* !defined(_SC_KERNEL_BITS) */\n\t\t\t    puts (\"hppa2.0\"); break;\n\t\t#endif\n\t\t\tdefault: puts (\"hppa1.0\"); break;\n\t\t\t}\n\t\t    exit (0);\n\t\t}\nEOF\n\t\t    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`\n\t\t    test -z \"$HP_ARCH\" && HP_ARCH=hppa\n\t\tfi ;;\n\tesac\n\tif [ ${HP_ARCH} = \"hppa2.0w\" ]\n\tthen\n\t    eval $set_cc_for_build\n\n\t    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating\n\t    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler\n\t    # generating 64-bit code.  GNU and HP use different nomenclature:\n\t    #\n\t    # $ CC_FOR_BUILD=cc ./config.guess\n\t    # => hppa2.0w-hp-hpux11.23\n\t    # $ CC_FOR_BUILD=\"cc +DA2.0w\" ./config.guess\n\t    # => hppa64-hp-hpux11.23\n\n\t    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |\n\t\tgrep -q __LP64__\n\t    then\n\t\tHP_ARCH=\"hppa2.0w\"\n\t    else\n\t\tHP_ARCH=\"hppa64\"\n\t    fi\n\tfi\n\techo ${HP_ARCH}-hp-hpux${HPUX_REV}\n\texit ;;\n    ia64:HP-UX:*:*)\n\tHPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`\n\techo ia64-hp-hpux${HPUX_REV}\n\texit ;;\n    3050*:HI-UX:*:*)\n\teval $set_cc_for_build\n\tsed 's/^\t//' << EOF >$dummy.c\n\t#include <unistd.h>\n\tint\n\tmain ()\n\t{\n\t  long cpu = sysconf (_SC_CPU_VERSION);\n\t  /* The order matters, because CPU_IS_HP_MC68K erroneously returns\n\t     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct\n\t     results, however.  */\n\t  if (CPU_IS_PA_RISC (cpu))\n\t    {\n\t      switch (cpu)\n\t\t{\n\t\t  case CPU_PA_RISC1_0: puts (\"hppa1.0-hitachi-hiuxwe2\"); break;\n\t\t  case CPU_PA_RISC1_1: puts (\"hppa1.1-hitachi-hiuxwe2\"); break;\n\t\t  case CPU_PA_RISC2_0: puts (\"hppa2.0-hitachi-hiuxwe2\"); break;\n\t\t  default: puts (\"hppa-hitachi-hiuxwe2\"); break;\n\t\t}\n\t    }\n\t  else if (CPU_IS_HP_MC68K (cpu))\n\t    puts (\"m68k-hitachi-hiuxwe2\");\n\t  else puts (\"unknown-hitachi-hiuxwe2\");\n\t  exit (0);\n\t}\nEOF\n\t$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&\n\t\t{ echo \"$SYSTEM_NAME\"; exit; }\n\techo unknown-hitachi-hiuxwe2\n\texit ;;\n    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )\n\techo hppa1.1-hp-bsd\n\texit ;;\n    9000/8??:4.3bsd:*:*)\n\techo hppa1.0-hp-bsd\n\texit ;;\n    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)\n\techo hppa1.0-hp-mpeix\n\texit ;;\n    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )\n\techo hppa1.1-hp-osf\n\texit ;;\n    hp8??:OSF1:*:*)\n\techo hppa1.0-hp-osf\n\texit ;;\n    i*86:OSF1:*:*)\n\tif [ -x /usr/sbin/sysversion ] ; then\n\t    echo ${UNAME_MACHINE}-unknown-osf1mk\n\telse\n\t    echo ${UNAME_MACHINE}-unknown-osf1\n\tfi\n\texit ;;\n    parisc*:Lites*:*:*)\n\techo hppa1.1-hp-lites\n\texit ;;\n    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)\n\techo c1-convex-bsd\n\texit ;;\n    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)\n\tif getsysinfo -f scalar_acc\n\tthen echo c32-convex-bsd\n\telse echo c2-convex-bsd\n\tfi\n\texit ;;\n    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)\n\techo c34-convex-bsd\n\texit ;;\n    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)\n\techo c38-convex-bsd\n\texit ;;\n    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)\n\techo c4-convex-bsd\n\texit ;;\n    CRAY*Y-MP:*:*:*)\n\techo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    CRAY*[A-Z]90:*:*:*)\n\techo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \\\n\t| sed -e 's/CRAY.*\\([A-Z]90\\)/\\1/' \\\n\t      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \\\n\t      -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    CRAY*TS:*:*:*)\n\techo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    CRAY*T3E:*:*:*)\n\techo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    CRAY*SV1:*:*:*)\n\techo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    *:UNICOS/mp:*:*)\n\techo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)\n\tFUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`\n\tFUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\\///'`\n\tFUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`\n\techo \"${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}\"\n\texit ;;\n    5000:UNIX_System_V:4.*:*)\n\tFUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\\///'`\n\tFUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`\n\techo \"sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}\"\n\texit ;;\n    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\\ Embedded/OS:*:*)\n\techo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}\n\texit ;;\n    sparc*:BSD/OS:*:*)\n\techo sparc-unknown-bsdi${UNAME_RELEASE}\n\texit ;;\n    *:BSD/OS:*:*)\n\techo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}\n\texit ;;\n    *:FreeBSD:*:*)\n\tUNAME_PROCESSOR=`/usr/bin/uname -p`\n\tcase ${UNAME_PROCESSOR} in\n\t    amd64)\n\t\techo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;\n\t    *)\n\t\techo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;\n\tesac\n\texit ;;\n    i*:CYGWIN*:*)\n\techo ${UNAME_MACHINE}-pc-cygwin\n\texit ;;\n    *:MINGW*:*)\n\techo ${UNAME_MACHINE}-pc-mingw32\n\texit ;;\n    i*:MSYS*:*)\n\techo ${UNAME_MACHINE}-pc-msys\n\texit ;;\n    i*:windows32*:*)\n\t# uname -m includes \"-pc\" on this system.\n\techo ${UNAME_MACHINE}-mingw32\n\texit ;;\n    i*:PW*:*)\n\techo ${UNAME_MACHINE}-pc-pw32\n\texit ;;\n    *:Interix*:*)\n\tcase ${UNAME_MACHINE} in\n\t    x86)\n\t\techo i586-pc-interix${UNAME_RELEASE}\n\t\texit ;;\n\t    authenticamd | genuineintel | EM64T)\n\t\techo x86_64-unknown-interix${UNAME_RELEASE}\n\t\texit ;;\n\t    IA64)\n\t\techo ia64-unknown-interix${UNAME_RELEASE}\n\t\texit ;;\n\tesac ;;\n    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)\n\techo i${UNAME_MACHINE}-pc-mks\n\texit ;;\n    8664:Windows_NT:*)\n\techo x86_64-pc-mks\n\texit ;;\n    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)\n\t# How do we know it's Interix rather than the generic POSIX subsystem?\n\t# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we\n\t# UNAME_MACHINE based on the output of uname instead of i386?\n\techo i586-pc-interix\n\texit ;;\n    i*:UWIN*:*)\n\techo ${UNAME_MACHINE}-pc-uwin\n\texit ;;\n    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)\n\techo x86_64-unknown-cygwin\n\texit ;;\n    p*:CYGWIN*:*)\n\techo powerpcle-unknown-cygwin\n\texit ;;\n    prep*:SunOS:5.*:*)\n\techo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit ;;\n    *:GNU:*:*)\n\t# the GNU system\n\techo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`\n\texit ;;\n    *:GNU/*:*:*)\n\t# other systems with GNU libc and userland\n\techo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu\n\texit ;;\n    i*86:Minix:*:*)\n\techo ${UNAME_MACHINE}-pc-minix\n\texit ;;\n    aarch64:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    aarch64_be:Linux:*:*)\n\tUNAME_MACHINE=aarch64_be\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    alpha:Linux:*:*)\n\tcase `sed -n '/^cpu model/s/^.*: \\(.*\\)/\\1/p' < /proc/cpuinfo` in\n\t  EV5)   UNAME_MACHINE=alphaev5 ;;\n\t  EV56)  UNAME_MACHINE=alphaev56 ;;\n\t  PCA56) UNAME_MACHINE=alphapca56 ;;\n\t  PCA57) UNAME_MACHINE=alphapca56 ;;\n\t  EV6)   UNAME_MACHINE=alphaev6 ;;\n\t  EV67)  UNAME_MACHINE=alphaev67 ;;\n\t  EV68*) UNAME_MACHINE=alphaev68 ;;\n\tesac\n\tobjdump --private-headers /bin/sh | grep -q ld.so.1\n\tif test \"$?\" = 0 ; then LIBC=\"libc1\" ; else LIBC=\"\" ; fi\n\techo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}\n\texit ;;\n    arm*:Linux:*:*)\n\teval $set_cc_for_build\n\tif echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \\\n\t    | grep -q __ARM_EABI__\n\tthen\n\t    echo ${UNAME_MACHINE}-unknown-linux-gnu\n\telse\n\t    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \\\n\t\t| grep -q __ARM_PCS_VFP\n\t    then\n\t\techo ${UNAME_MACHINE}-unknown-linux-gnueabi\n\t    else\n\t\techo ${UNAME_MACHINE}-unknown-linux-gnueabihf\n\t    fi\n\tfi\n\texit ;;\n    avr32*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    cris:Linux:*:*)\n\techo ${UNAME_MACHINE}-axis-linux-gnu\n\texit ;;\n    crisv32:Linux:*:*)\n\techo ${UNAME_MACHINE}-axis-linux-gnu\n\texit ;;\n    frv:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    hexagon:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    i*86:Linux:*:*)\n\tLIBC=gnu\n\teval $set_cc_for_build\n\tsed 's/^\t//' << EOF >$dummy.c\n\t#ifdef __dietlibc__\n\tLIBC=dietlibc\n\t#endif\nEOF\n\teval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`\n\techo \"${UNAME_MACHINE}-pc-linux-${LIBC}\"\n\texit ;;\n    ia64:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    m32r*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    m68*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    mips:Linux:*:* | mips64:Linux:*:*)\n\teval $set_cc_for_build\n\tsed 's/^\t//' << EOF >$dummy.c\n\t#undef CPU\n\t#undef ${UNAME_MACHINE}\n\t#undef ${UNAME_MACHINE}el\n\t#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)\n\tCPU=${UNAME_MACHINE}el\n\t#else\n\t#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)\n\tCPU=${UNAME_MACHINE}\n\t#else\n\tCPU=\n\t#endif\n\t#endif\nEOF\n\teval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`\n\ttest x\"${CPU}\" != x && { echo \"${CPU}-unknown-linux-gnu\"; exit; }\n\t;;\n    or32:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    padre:Linux:*:*)\n\techo sparc-unknown-linux-gnu\n\texit ;;\n    parisc64:Linux:*:* | hppa64:Linux:*:*)\n\techo hppa64-unknown-linux-gnu\n\texit ;;\n    parisc:Linux:*:* | hppa:Linux:*:*)\n\t# Look for CPU level\n\tcase `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in\n\t  PA7*) echo hppa1.1-unknown-linux-gnu ;;\n\t  PA8*) echo hppa2.0-unknown-linux-gnu ;;\n\t  *)    echo hppa-unknown-linux-gnu ;;\n\tesac\n\texit ;;\n    ppc64:Linux:*:*)\n\techo powerpc64-unknown-linux-gnu\n\texit ;;\n    ppc:Linux:*:*)\n\techo powerpc-unknown-linux-gnu\n\texit ;;\n    s390:Linux:*:* | s390x:Linux:*:*)\n\techo ${UNAME_MACHINE}-ibm-linux\n\texit ;;\n    sh64*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    sh*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    sparc:Linux:*:* | sparc64:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    tile*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    vax:Linux:*:*)\n\techo ${UNAME_MACHINE}-dec-linux-gnu\n\texit ;;\n    x86_64:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    xtensa*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    i*86:DYNIX/ptx:4*:*)\n\t# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.\n\t# earlier versions are messed up and put the nodename in both\n\t# sysname and nodename.\n\techo i386-sequent-sysv4\n\texit ;;\n    i*86:UNIX_SV:4.2MP:2.*)\n\t# Unixware is an offshoot of SVR4, but it has its own version\n\t# number series starting with 2...\n\t# I am not positive that other SVR4 systems won't match this,\n\t# I just have to hope.  -- rms.\n\t# Use sysv4.2uw... so that sysv4* matches it.\n\techo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}\n\texit ;;\n    i*86:OS/2:*:*)\n\t# If we were able to find `uname', then EMX Unix compatibility\n\t# is probably installed.\n\techo ${UNAME_MACHINE}-pc-os2-emx\n\texit ;;\n    i*86:XTS-300:*:STOP)\n\techo ${UNAME_MACHINE}-unknown-stop\n\texit ;;\n    i*86:atheos:*:*)\n\techo ${UNAME_MACHINE}-unknown-atheos\n\texit ;;\n    i*86:syllable:*:*)\n\techo ${UNAME_MACHINE}-pc-syllable\n\texit ;;\n    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)\n\techo i386-unknown-lynxos${UNAME_RELEASE}\n\texit ;;\n    i*86:*DOS:*:*)\n\techo ${UNAME_MACHINE}-pc-msdosdjgpp\n\texit ;;\n    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)\n\tUNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\\/MP$//'`\n\tif grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then\n\t\techo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}\n\telse\n\t\techo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}\n\tfi\n\texit ;;\n    i*86:*:5:[678]*)\n\t# UnixWare 7.x, OpenUNIX and OpenServer 6.\n\tcase `/bin/uname -X | grep \"^Machine\"` in\n\t    *486*)\t     UNAME_MACHINE=i486 ;;\n\t    *Pentium)\t     UNAME_MACHINE=i586 ;;\n\t    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;\n\tesac\n\techo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}\n\texit ;;\n    i*86:*:3.2:*)\n\tif test -f /usr/options/cb.name; then\n\t\tUNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`\n\t\techo ${UNAME_MACHINE}-pc-isc$UNAME_REL\n\telif /bin/uname -X 2>/dev/null >/dev/null ; then\n\t\tUNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`\n\t\t(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486\n\t\t(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \\\n\t\t\t&& UNAME_MACHINE=i586\n\t\t(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \\\n\t\t\t&& UNAME_MACHINE=i686\n\t\t(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \\\n\t\t\t&& UNAME_MACHINE=i686\n\t\techo ${UNAME_MACHINE}-pc-sco$UNAME_REL\n\telse\n\t\techo ${UNAME_MACHINE}-pc-sysv32\n\tfi\n\texit ;;\n    pc:*:*:*)\n\t# Left here for compatibility:\n\t# uname -m prints for DJGPP always 'pc', but it prints nothing about\n\t# the processor, so we play safe by assuming i586.\n\t# Note: whatever this is, it MUST be the same as what config.sub\n\t# prints for the \"djgpp\" host, or else GDB configury will decide that\n\t# this is a cross-build.\n\techo i586-pc-msdosdjgpp\n\texit ;;\n    Intel:Mach:3*:*)\n\techo i386-pc-mach3\n\texit ;;\n    paragon:*:*:*)\n\techo i860-intel-osf1\n\texit ;;\n    i860:*:4.*:*) # i860-SVR4\n\tif grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then\n\t  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4\n\telse # Add other i860-SVR4 vendors below as they are discovered.\n\t  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4\n\tfi\n\texit ;;\n    mini*:CTIX:SYS*5:*)\n\t# \"miniframe\"\n\techo m68010-convergent-sysv\n\texit ;;\n    mc68k:UNIX:SYSTEM5:3.51m)\n\techo m68k-convergent-sysv\n\texit ;;\n    M680?0:D-NIX:5.3:*)\n\techo m68k-diab-dnix\n\texit ;;\n    M68*:*:R3V[5678]*:*)\n\ttest -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;\n    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)\n\tOS_REL=''\n\ttest -r /etc/.relid \\\n\t&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \\([0-9][0-9]\\).*/\\1/p' < /etc/.relid`\n\t/bin/uname -p 2>/dev/null | grep 86 >/dev/null \\\n\t  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }\n\t/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \\\n\t  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;\n    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)\n\t/bin/uname -p 2>/dev/null | grep 86 >/dev/null \\\n\t  && { echo i486-ncr-sysv4; exit; } ;;\n    NCR*:*:4.2:* | MPRAS*:*:4.2:*)\n\tOS_REL='.3'\n\ttest -r /etc/.relid \\\n\t    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \\([0-9][0-9]\\).*/\\1/p' < /etc/.relid`\n\t/bin/uname -p 2>/dev/null | grep 86 >/dev/null \\\n\t    && { echo i486-ncr-sysv4.3${OS_REL}; exit; }\n\t/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \\\n\t    && { echo i586-ncr-sysv4.3${OS_REL}; exit; }\n\t/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \\\n\t    && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;\n    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)\n\techo m68k-unknown-lynxos${UNAME_RELEASE}\n\texit ;;\n    mc68030:UNIX_System_V:4.*:*)\n\techo m68k-atari-sysv4\n\texit ;;\n    TSUNAMI:LynxOS:2.*:*)\n\techo sparc-unknown-lynxos${UNAME_RELEASE}\n\texit ;;\n    rs6000:LynxOS:2.*:*)\n\techo rs6000-unknown-lynxos${UNAME_RELEASE}\n\texit ;;\n    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)\n\techo powerpc-unknown-lynxos${UNAME_RELEASE}\n\texit ;;\n    SM[BE]S:UNIX_SV:*:*)\n\techo mips-dde-sysv${UNAME_RELEASE}\n\texit ;;\n    RM*:ReliantUNIX-*:*:*)\n\techo mips-sni-sysv4\n\texit ;;\n    RM*:SINIX-*:*:*)\n\techo mips-sni-sysv4\n\texit ;;\n    *:SINIX-*:*:*)\n\tif uname -p 2>/dev/null >/dev/null ; then\n\t\tUNAME_MACHINE=`(uname -p) 2>/dev/null`\n\t\techo ${UNAME_MACHINE}-sni-sysv4\n\telse\n\t\techo ns32k-sni-sysv\n\tfi\n\texit ;;\n    PENTIUM:*:4.0*:*)\t# Unisys `ClearPath HMP IX 4000' SVR4/MP effort\n\t\t\t# says <Richard.M.Bartel@ccMail.Census.GOV>\n\techo i586-unisys-sysv4\n\texit ;;\n    *:UNIX_System_V:4*:FTX*)\n\t# From Gerald Hewes <hewes@openmarket.com>.\n\t# How about differentiating between stratus architectures? -djm\n\techo hppa1.1-stratus-sysv4\n\texit ;;\n    *:*:*:FTX*)\n\t# From seanf@swdc.stratus.com.\n\techo i860-stratus-sysv4\n\texit ;;\n    i*86:VOS:*:*)\n\t# From Paul.Green@stratus.com.\n\techo ${UNAME_MACHINE}-stratus-vos\n\texit ;;\n    *:VOS:*:*)\n\t# From Paul.Green@stratus.com.\n\techo hppa1.1-stratus-vos\n\texit ;;\n    mc68*:A/UX:*:*)\n\techo m68k-apple-aux${UNAME_RELEASE}\n\texit ;;\n    news*:NEWS-OS:6*:*)\n\techo mips-sony-newsos6\n\texit ;;\n    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)\n\tif [ -d /usr/nec ]; then\n\t\techo mips-nec-sysv${UNAME_RELEASE}\n\telse\n\t\techo mips-unknown-sysv${UNAME_RELEASE}\n\tfi\n\texit ;;\n    BeBox:BeOS:*:*)\t# BeOS running on hardware made by Be, PPC only.\n\techo powerpc-be-beos\n\texit ;;\n    BeMac:BeOS:*:*)\t# BeOS running on Mac or Mac clone, PPC only.\n\techo powerpc-apple-beos\n\texit ;;\n    BePC:BeOS:*:*)\t# BeOS running on Intel PC compatible.\n\techo i586-pc-beos\n\texit ;;\n    BePC:Haiku:*:*)\t# Haiku running on Intel PC compatible.\n\techo i586-pc-haiku\n\texit ;;\n    SX-4:SUPER-UX:*:*)\n\techo sx4-nec-superux${UNAME_RELEASE}\n\texit ;;\n    SX-5:SUPER-UX:*:*)\n\techo sx5-nec-superux${UNAME_RELEASE}\n\texit ;;\n    SX-6:SUPER-UX:*:*)\n\techo sx6-nec-superux${UNAME_RELEASE}\n\texit ;;\n    SX-7:SUPER-UX:*:*)\n\techo sx7-nec-superux${UNAME_RELEASE}\n\texit ;;\n    SX-8:SUPER-UX:*:*)\n\techo sx8-nec-superux${UNAME_RELEASE}\n\texit ;;\n    SX-8R:SUPER-UX:*:*)\n\techo sx8r-nec-superux${UNAME_RELEASE}\n\texit ;;\n    Power*:Rhapsody:*:*)\n\techo powerpc-apple-rhapsody${UNAME_RELEASE}\n\texit ;;\n    *:Rhapsody:*:*)\n\techo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}\n\texit ;;\n    *:Darwin:*:*)\n\tUNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown\n\tcase $UNAME_PROCESSOR in\n\t    i386)\n\t\teval $set_cc_for_build\n\t\tif [ \"$CC_FOR_BUILD\" != 'no_compiler_found' ]; then\n\t\t  if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \\\n\t\t      (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \\\n\t\t      grep IS_64BIT_ARCH >/dev/null\n\t\t  then\n\t\t      UNAME_PROCESSOR=\"x86_64\"\n\t\t  fi\n\t\tfi ;;\n\t    unknown) UNAME_PROCESSOR=powerpc ;;\n\tesac\n\techo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}\n\texit ;;\n    *:procnto*:*:* | *:QNX:[0123456789]*:*)\n\tUNAME_PROCESSOR=`uname -p`\n\tif test \"$UNAME_PROCESSOR\" = \"x86\"; then\n\t\tUNAME_PROCESSOR=i386\n\t\tUNAME_MACHINE=pc\n\tfi\n\techo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}\n\texit ;;\n    *:QNX:*:4*)\n\techo i386-pc-qnx\n\texit ;;\n    NEO-?:NONSTOP_KERNEL:*:*)\n\techo neo-tandem-nsk${UNAME_RELEASE}\n\texit ;;\n    NSE-?:NONSTOP_KERNEL:*:*)\n\techo nse-tandem-nsk${UNAME_RELEASE}\n\texit ;;\n    NSR-?:NONSTOP_KERNEL:*:*)\n\techo nsr-tandem-nsk${UNAME_RELEASE}\n\texit ;;\n    *:NonStop-UX:*:*)\n\techo mips-compaq-nonstopux\n\texit ;;\n    BS2000:POSIX*:*:*)\n\techo bs2000-siemens-sysv\n\texit ;;\n    DS/*:UNIX_System_V:*:*)\n\techo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}\n\texit ;;\n    *:Plan9:*:*)\n\t# \"uname -m\" is not consistent, so use $cputype instead. 386\n\t# is converted to i386 for consistency with other x86\n\t# operating systems.\n\tif test \"$cputype\" = \"386\"; then\n\t    UNAME_MACHINE=i386\n\telse\n\t    UNAME_MACHINE=\"$cputype\"\n\tfi\n\techo ${UNAME_MACHINE}-unknown-plan9\n\texit ;;\n    *:TOPS-10:*:*)\n\techo pdp10-unknown-tops10\n\texit ;;\n    *:TENEX:*:*)\n\techo pdp10-unknown-tenex\n\texit ;;\n    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)\n\techo pdp10-dec-tops20\n\texit ;;\n    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)\n\techo pdp10-xkl-tops20\n\texit ;;\n    *:TOPS-20:*:*)\n\techo pdp10-unknown-tops20\n\texit ;;\n    *:ITS:*:*)\n\techo pdp10-unknown-its\n\texit ;;\n    SEI:*:*:SEIUX)\n\techo mips-sei-seiux${UNAME_RELEASE}\n\texit ;;\n    *:DragonFly:*:*)\n\techo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`\n\texit ;;\n    *:*VMS:*:*)\n\tUNAME_MACHINE=`(uname -p) 2>/dev/null`\n\tcase \"${UNAME_MACHINE}\" in\n\t    A*) echo alpha-dec-vms ; exit ;;\n\t    I*) echo ia64-dec-vms ; exit ;;\n\t    V*) echo vax-dec-vms ; exit ;;\n\tesac ;;\n    *:XENIX:*:SysV)\n\techo i386-pc-xenix\n\texit ;;\n    i*86:skyos:*:*)\n\techo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'\n\texit ;;\n    i*86:rdos:*:*)\n\techo ${UNAME_MACHINE}-pc-rdos\n\texit ;;\n    i*86:AROS:*:*)\n\techo ${UNAME_MACHINE}-pc-aros\n\texit ;;\n    x86_64:VMkernel:*:*)\n\techo ${UNAME_MACHINE}-unknown-esx\n\texit ;;\nesac\n\n#echo '(No uname command or uname output not recognized.)' 1>&2\n#echo \"${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}\" 1>&2\n\neval $set_cc_for_build\ncat >$dummy.c <<EOF\n#ifdef _SEQUENT_\n# include <sys/types.h>\n# include <sys/utsname.h>\n#endif\nmain ()\n{\n#if defined (sony)\n#if defined (MIPSEB)\n  /* BFD wants \"bsd\" instead of \"newsos\".  Perhaps BFD should be changed,\n     I don't know....  */\n  printf (\"mips-sony-bsd\\n\"); exit (0);\n#else\n#include <sys/param.h>\n  printf (\"m68k-sony-newsos%s\\n\",\n#ifdef NEWSOS4\n\t\"4\"\n#else\n\t\"\"\n#endif\n\t); exit (0);\n#endif\n#endif\n\n#if defined (__arm) && defined (__acorn) && defined (__unix)\n  printf (\"arm-acorn-riscix\\n\"); exit (0);\n#endif\n\n#if defined (hp300) && !defined (hpux)\n  printf (\"m68k-hp-bsd\\n\"); exit (0);\n#endif\n\n#if defined (NeXT)\n#if !defined (__ARCHITECTURE__)\n#define __ARCHITECTURE__ \"m68k\"\n#endif\n  int version;\n  version=`(hostinfo | sed -n 's/.*NeXT Mach \\([0-9]*\\).*/\\1/p') 2>/dev/null`;\n  if (version < 4)\n    printf (\"%s-next-nextstep%d\\n\", __ARCHITECTURE__, version);\n  else\n    printf (\"%s-next-openstep%d\\n\", __ARCHITECTURE__, version);\n  exit (0);\n#endif\n\n#if defined (MULTIMAX) || defined (n16)\n#if defined (UMAXV)\n  printf (\"ns32k-encore-sysv\\n\"); exit (0);\n#else\n#if defined (CMU)\n  printf (\"ns32k-encore-mach\\n\"); exit (0);\n#else\n  printf (\"ns32k-encore-bsd\\n\"); exit (0);\n#endif\n#endif\n#endif\n\n#if defined (__386BSD__)\n  printf (\"i386-pc-bsd\\n\"); exit (0);\n#endif\n\n#if defined (sequent)\n#if defined (i386)\n  printf (\"i386-sequent-dynix\\n\"); exit (0);\n#endif\n#if defined (ns32000)\n  printf (\"ns32k-sequent-dynix\\n\"); exit (0);\n#endif\n#endif\n\n#if defined (_SEQUENT_)\n    struct utsname un;\n\n    uname(&un);\n\n    if (strncmp(un.version, \"V2\", 2) == 0) {\n\tprintf (\"i386-sequent-ptx2\\n\"); exit (0);\n    }\n    if (strncmp(un.version, \"V1\", 2) == 0) { /* XXX is V1 correct? */\n\tprintf (\"i386-sequent-ptx1\\n\"); exit (0);\n    }\n    printf (\"i386-sequent-ptx\\n\"); exit (0);\n\n#endif\n\n#if defined (vax)\n# if !defined (ultrix)\n#  include <sys/param.h>\n#  if defined (BSD)\n#   if BSD == 43\n      printf (\"vax-dec-bsd4.3\\n\"); exit (0);\n#   else\n#    if BSD == 199006\n      printf (\"vax-dec-bsd4.3reno\\n\"); exit (0);\n#    else\n      printf (\"vax-dec-bsd\\n\"); exit (0);\n#    endif\n#   endif\n#  else\n    printf (\"vax-dec-bsd\\n\"); exit (0);\n#  endif\n# else\n    printf (\"vax-dec-ultrix\\n\"); exit (0);\n# endif\n#endif\n\n#if defined (alliant) && defined (i860)\n  printf (\"i860-alliant-bsd\\n\"); exit (0);\n#endif\n\n  exit (1);\n}\nEOF\n\n$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&\n\t{ echo \"$SYSTEM_NAME\"; exit; }\n\n# Apollos put the system type in the environment.\n\ntest -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }\n\n# Convex versions that predate uname can use getsysinfo(1)\n\nif [ -x /usr/convex/getsysinfo ]\nthen\n    case `getsysinfo -f cpu_type` in\n    c1*)\n\techo c1-convex-bsd\n\texit ;;\n    c2*)\n\tif getsysinfo -f scalar_acc\n\tthen echo c32-convex-bsd\n\telse echo c2-convex-bsd\n\tfi\n\texit ;;\n    c34*)\n\techo c34-convex-bsd\n\texit ;;\n    c38*)\n\techo c38-convex-bsd\n\texit ;;\n    c4*)\n\techo c4-convex-bsd\n\texit ;;\n    esac\nfi\n\ncat >&2 <<EOF\n$0: unable to guess system type\n\nThis script, last modified $timestamp, has failed to recognize\nthe operating system you are using. It is advised that you\ndownload the most up to date version of the config scripts from\n\n  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD\nand\n  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD\n\nIf the version you run ($0) is already up to date, please\nsend the following data and any information you think might be\npertinent to <config-patches@gnu.org> in order to provide the needed\ninformation to handle your system.\n\nconfig.guess timestamp = $timestamp\n\nuname -m = `(uname -m) 2>/dev/null || echo unknown`\nuname -r = `(uname -r) 2>/dev/null || echo unknown`\nuname -s = `(uname -s) 2>/dev/null || echo unknown`\nuname -v = `(uname -v) 2>/dev/null || echo unknown`\n\n/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`\n/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`\n\nhostinfo               = `(hostinfo) 2>/dev/null`\n/bin/universe          = `(/bin/universe) 2>/dev/null`\n/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`\n/bin/arch              = `(/bin/arch) 2>/dev/null`\n/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`\n/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`\n\nUNAME_MACHINE = ${UNAME_MACHINE}\nUNAME_RELEASE = ${UNAME_RELEASE}\nUNAME_SYSTEM  = ${UNAME_SYSTEM}\nUNAME_VERSION = ${UNAME_VERSION}\nEOF\n\nexit 1\n\n# Local variables:\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"timestamp='\"\n# time-stamp-format: \"%:y-%02m-%02d\"\n# time-stamp-end: \"'\"\n# End:\n"
  },
  {
    "path": "libs/CoMISo/gmm/config.h.in",
    "content": "/* config.h.in.  Generated from configure.in by autoheader.  */\n\n/* Define to 1 if you have the <dlfcn.h> header file. */\n#undef HAVE_DLFCN_H\n\n/* Define to 1 if you have the <inttypes.h> header file. */\n#undef HAVE_INTTYPES_H\n\n/* Define to 1 if you have the <memory.h> header file. */\n#undef HAVE_MEMORY_H\n\n/* Define to 1 if you have the <stdint.h> header file. */\n#undef HAVE_STDINT_H\n\n/* Define to 1 if you have the <stdlib.h> header file. */\n#undef HAVE_STDLIB_H\n\n/* Define to 1 if you have the <strings.h> header file. */\n#undef HAVE_STRINGS_H\n\n/* Define to 1 if you have the <string.h> header file. */\n#undef HAVE_STRING_H\n\n/* Define to 1 if you have the <sys/stat.h> header file. */\n#undef HAVE_SYS_STAT_H\n\n/* Define to 1 if you have the <sys/times.h> header file. */\n#undef HAVE_SYS_TIMES_H\n\n/* Define to 1 if you have the <sys/types.h> header file. */\n#undef HAVE_SYS_TYPES_H\n\n/* Define to 1 if you have the <unistd.h> header file. */\n#undef HAVE_UNISTD_H\n\n/* Define to the sub-directory in which libtool stores uninstalled libraries.\n   */\n#undef LT_OBJDIR\n\n/* Name of package */\n#undef PACKAGE\n\n/* Define to the address where bug reports for this package should be sent. */\n#undef PACKAGE_BUGREPORT\n\n/* Define to the full name of this package. */\n#undef PACKAGE_NAME\n\n/* Define to the full name and version of this package. */\n#undef PACKAGE_STRING\n\n/* Define to the one symbol short name of this package. */\n#undef PACKAGE_TARNAME\n\n/* Define to the home page for this package. */\n#undef PACKAGE_URL\n\n/* Define to the version of this package. */\n#undef PACKAGE_VERSION\n\n/* Define to 1 if you have the ANSI C header files. */\n#undef STDC_HEADERS\n\n/* Version number of package */\n#undef VERSION\n"
  },
  {
    "path": "libs/CoMISo/gmm/config.sub",
    "content": "#! /bin/sh\n# Configuration validation subroutine script.\n#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,\n#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,\n#   2011, 2012 Free Software Foundation, Inc.\n\ntimestamp='2012-02-10'\n\n# This file is (in principle) common to ALL GNU software.\n# The presence of a machine in this file suggests that SOME GNU software\n# can handle that machine.  It does not imply ALL GNU software can.\n#\n# This file 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 2 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 <http://www.gnu.org/licenses/>.\n#\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\n\n# Please send patches to <config-patches@gnu.org>.  Submit a context\n# diff and a properly formatted GNU ChangeLog entry.\n#\n# Configuration subroutine to validate and canonicalize a configuration type.\n# Supply the specified configuration type as an argument.\n# If it is invalid, we print an error message on stderr and exit with code 1.\n# Otherwise, we print the canonical config type on stdout and succeed.\n\n# You can get the latest version of this script from:\n# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD\n\n# This file is supposed to be the same for all GNU packages\n# and recognize all the CPU types, system types and aliases\n# that are meaningful with *any* GNU software.\n# Each package is responsible for reporting which valid configurations\n# it does not support.  The user should be able to distinguish\n# a failure to support a valid configuration from a meaningless\n# configuration.\n\n# The goal of this file is to map all the various variations of a given\n# machine specification into a single specification in the form:\n#\tCPU_TYPE-MANUFACTURER-OPERATING_SYSTEM\n# or in some cases, the newer four-part form:\n#\tCPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM\n# It is wrong to echo any other type of specification.\n\nme=`echo \"$0\" | sed -e 's,.*/,,'`\n\nusage=\"\\\nUsage: $0 [OPTION] CPU-MFR-OPSYS\n       $0 [OPTION] ALIAS\n\nCanonicalize a configuration name.\n\nOperation modes:\n  -h, --help         print this help, then exit\n  -t, --time-stamp   print date of last modification, then exit\n  -v, --version      print version number, then exit\n\nReport bugs and patches to <config-patches@gnu.org>.\"\n\nversion=\"\\\nGNU config.sub ($timestamp)\n\nCopyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,\n2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012\nFree Software Foundation, Inc.\n\nThis is free software; see the source for copying conditions.  There is NO\nwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\"\n\nhelp=\"\nTry \\`$me --help' for more information.\"\n\n# Parse command line\nwhile test $# -gt 0 ; do\n  case $1 in\n    --time-stamp | --time* | -t )\n       echo \"$timestamp\" ; exit ;;\n    --version | -v )\n       echo \"$version\" ; exit ;;\n    --help | --h* | -h )\n       echo \"$usage\"; exit ;;\n    -- )     # Stop option processing\n       shift; break ;;\n    - )\t# Use stdin as input.\n       break ;;\n    -* )\n       echo \"$me: invalid option $1$help\"\n       exit 1 ;;\n\n    *local*)\n       # First pass through any local machine types.\n       echo $1\n       exit ;;\n\n    * )\n       break ;;\n  esac\ndone\n\ncase $# in\n 0) echo \"$me: missing argument$help\" >&2\n    exit 1;;\n 1) ;;\n *) echo \"$me: too many arguments$help\" >&2\n    exit 1;;\nesac\n\n# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).\n# Here we must recognize all the valid KERNEL-OS combinations.\nmaybe_os=`echo $1 | sed 's/^\\(.*\\)-\\([^-]*-[^-]*\\)$/\\2/'`\ncase $maybe_os in\n  nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \\\n  linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \\\n  knetbsd*-gnu* | netbsd*-gnu* | \\\n  kopensolaris*-gnu* | \\\n  storm-chaos* | os2-emx* | rtmk-nova*)\n    os=-$maybe_os\n    basic_machine=`echo $1 | sed 's/^\\(.*\\)-\\([^-]*-[^-]*\\)$/\\1/'`\n    ;;\n  android-linux)\n    os=-linux-android\n    basic_machine=`echo $1 | sed 's/^\\(.*\\)-\\([^-]*-[^-]*\\)$/\\1/'`-unknown\n    ;;\n  *)\n    basic_machine=`echo $1 | sed 's/-[^-]*$//'`\n    if [ $basic_machine != $1 ]\n    then os=`echo $1 | sed 's/.*-/-/'`\n    else os=; fi\n    ;;\nesac\n\n### Let's recognize common machines as not being operating systems so\n### that things like config.sub decstation-3100 work.  We also\n### recognize some manufacturers as not being operating systems, so we\n### can provide default operating systems below.\ncase $os in\n\t-sun*os*)\n\t\t# Prevent following clause from handling this invalid input.\n\t\t;;\n\t-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \\\n\t-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \\\n\t-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \\\n\t-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\\\n\t-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \\\n\t-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \\\n\t-apple | -axis | -knuth | -cray | -microblaze)\n\t\tos=\n\t\tbasic_machine=$1\n\t\t;;\n\t-bluegene*)\n\t\tos=-cnk\n\t\t;;\n\t-sim | -cisco | -oki | -wec | -winbond)\n\t\tos=\n\t\tbasic_machine=$1\n\t\t;;\n\t-scout)\n\t\t;;\n\t-wrs)\n\t\tos=-vxworks\n\t\tbasic_machine=$1\n\t\t;;\n\t-chorusos*)\n\t\tos=-chorusos\n\t\tbasic_machine=$1\n\t\t;;\n\t-chorusrdb)\n\t\tos=-chorusrdb\n\t\tbasic_machine=$1\n\t\t;;\n\t-hiux*)\n\t\tos=-hiuxwe2\n\t\t;;\n\t-sco6)\n\t\tos=-sco5v6\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco5)\n\t\tos=-sco3.2v5\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco4)\n\t\tos=-sco3.2v4\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco3.2.[4-9]*)\n\t\tos=`echo $os | sed -e 's/sco3.2./sco3.2v/'`\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco3.2v[4-9]*)\n\t\t# Don't forget version if it is 3.2v4 or newer.\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco5v6*)\n\t\t# Don't forget version if it is 3.2v4 or newer.\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco*)\n\t\tos=-sco3.2v2\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-udk*)\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-isc)\n\t\tos=-isc2.2\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-clix*)\n\t\tbasic_machine=clipper-intergraph\n\t\t;;\n\t-isc*)\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-lynx*)\n\t\tos=-lynxos\n\t\t;;\n\t-ptx*)\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`\n\t\t;;\n\t-windowsnt*)\n\t\tos=`echo $os | sed -e 's/windowsnt/winnt/'`\n\t\t;;\n\t-psos*)\n\t\tos=-psos\n\t\t;;\n\t-mint | -mint[0-9]*)\n\t\tbasic_machine=m68k-atari\n\t\tos=-mint\n\t\t;;\nesac\n\n# Decode aliases for certain CPU-COMPANY combinations.\ncase $basic_machine in\n\t# Recognize the basic CPU types without company name.\n\t# Some are omitted here because they have special meanings below.\n\t1750a | 580 \\\n\t| a29k \\\n\t| aarch64 | aarch64_be \\\n\t| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \\\n\t| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \\\n\t| am33_2.0 \\\n\t| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \\\n        | be32 | be64 \\\n\t| bfin \\\n\t| c4x | clipper \\\n\t| d10v | d30v | dlx | dsp16xx \\\n\t| epiphany \\\n\t| fido | fr30 | frv \\\n\t| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \\\n\t| hexagon \\\n\t| i370 | i860 | i960 | ia64 \\\n\t| ip2k | iq2000 \\\n\t| le32 | le64 \\\n\t| lm32 \\\n\t| m32c | m32r | m32rle | m68000 | m68k | m88k \\\n\t| maxq | mb | microblaze | mcore | mep | metag \\\n\t| mips | mipsbe | mipseb | mipsel | mipsle \\\n\t| mips16 \\\n\t| mips64 | mips64el \\\n\t| mips64octeon | mips64octeonel \\\n\t| mips64orion | mips64orionel \\\n\t| mips64r5900 | mips64r5900el \\\n\t| mips64vr | mips64vrel \\\n\t| mips64vr4100 | mips64vr4100el \\\n\t| mips64vr4300 | mips64vr4300el \\\n\t| mips64vr5000 | mips64vr5000el \\\n\t| mips64vr5900 | mips64vr5900el \\\n\t| mipsisa32 | mipsisa32el \\\n\t| mipsisa32r2 | mipsisa32r2el \\\n\t| mipsisa64 | mipsisa64el \\\n\t| mipsisa64r2 | mipsisa64r2el \\\n\t| mipsisa64sb1 | mipsisa64sb1el \\\n\t| mipsisa64sr71k | mipsisa64sr71kel \\\n\t| mipstx39 | mipstx39el \\\n\t| mn10200 | mn10300 \\\n\t| moxie \\\n\t| mt \\\n\t| msp430 \\\n\t| nds32 | nds32le | nds32be \\\n\t| nios | nios2 \\\n\t| ns16k | ns32k \\\n\t| open8 \\\n\t| or32 \\\n\t| pdp10 | pdp11 | pj | pjl \\\n\t| powerpc | powerpc64 | powerpc64le | powerpcle \\\n\t| pyramid \\\n\t| rl78 | rx \\\n\t| score \\\n\t| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \\\n\t| sh64 | sh64le \\\n\t| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \\\n\t| sparcv8 | sparcv9 | sparcv9b | sparcv9v \\\n\t| spu \\\n\t| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \\\n\t| ubicom32 \\\n\t| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \\\n\t| we32k \\\n\t| x86 | xc16x | xstormy16 | xtensa \\\n\t| z8k | z80)\n\t\tbasic_machine=$basic_machine-unknown\n\t\t;;\n\tc54x)\n\t\tbasic_machine=tic54x-unknown\n\t\t;;\n\tc55x)\n\t\tbasic_machine=tic55x-unknown\n\t\t;;\n\tc6x)\n\t\tbasic_machine=tic6x-unknown\n\t\t;;\n\tm6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip)\n\t\tbasic_machine=$basic_machine-unknown\n\t\tos=-none\n\t\t;;\n\tm88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)\n\t\t;;\n\tms1)\n\t\tbasic_machine=mt-unknown\n\t\t;;\n\n\tstrongarm | thumb | xscale)\n\t\tbasic_machine=arm-unknown\n\t\t;;\n\txgate)\n\t\tbasic_machine=$basic_machine-unknown\n\t\tos=-none\n\t\t;;\n\txscaleeb)\n\t\tbasic_machine=armeb-unknown\n\t\t;;\n\n\txscaleel)\n\t\tbasic_machine=armel-unknown\n\t\t;;\n\n\t# We use `pc' rather than `unknown'\n\t# because (1) that's what they normally are, and\n\t# (2) the word \"unknown\" tends to confuse beginning users.\n\ti*86 | x86_64)\n\t  basic_machine=$basic_machine-pc\n\t  ;;\n\t# Object if more than one company name word.\n\t*-*-*)\n\t\techo Invalid configuration \\`$1\\': machine \\`$basic_machine\\' not recognized 1>&2\n\t\texit 1\n\t\t;;\n\t# Recognize the basic CPU types with company name.\n\t580-* \\\n\t| a29k-* \\\n\t| aarch64-* | aarch64_be-* \\\n\t| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \\\n\t| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \\\n\t| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \\\n\t| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \\\n\t| avr-* | avr32-* \\\n\t| be32-* | be64-* \\\n\t| bfin-* | bs2000-* \\\n\t| c[123]* | c30-* | [cjt]90-* | c4x-* \\\n\t| clipper-* | craynv-* | cydra-* \\\n\t| d10v-* | d30v-* | dlx-* \\\n\t| elxsi-* \\\n\t| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \\\n\t| h8300-* | h8500-* \\\n\t| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \\\n\t| hexagon-* \\\n\t| i*86-* | i860-* | i960-* | ia64-* \\\n\t| ip2k-* | iq2000-* \\\n\t| le32-* | le64-* \\\n\t| lm32-* \\\n\t| m32c-* | m32r-* | m32rle-* \\\n\t| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \\\n\t| m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \\\n\t| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \\\n\t| mips16-* \\\n\t| mips64-* | mips64el-* \\\n\t| mips64octeon-* | mips64octeonel-* \\\n\t| mips64orion-* | mips64orionel-* \\\n\t| mips64r5900-* | mips64r5900el-* \\\n\t| mips64vr-* | mips64vrel-* \\\n\t| mips64vr4100-* | mips64vr4100el-* \\\n\t| mips64vr4300-* | mips64vr4300el-* \\\n\t| mips64vr5000-* | mips64vr5000el-* \\\n\t| mips64vr5900-* | mips64vr5900el-* \\\n\t| mipsisa32-* | mipsisa32el-* \\\n\t| mipsisa32r2-* | mipsisa32r2el-* \\\n\t| mipsisa64-* | mipsisa64el-* \\\n\t| mipsisa64r2-* | mipsisa64r2el-* \\\n\t| mipsisa64sb1-* | mipsisa64sb1el-* \\\n\t| mipsisa64sr71k-* | mipsisa64sr71kel-* \\\n\t| mipstx39-* | mipstx39el-* \\\n\t| mmix-* \\\n\t| mt-* \\\n\t| msp430-* \\\n\t| nds32-* | nds32le-* | nds32be-* \\\n\t| nios-* | nios2-* \\\n\t| none-* | np1-* | ns16k-* | ns32k-* \\\n\t| open8-* \\\n\t| orion-* \\\n\t| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \\\n\t| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \\\n\t| pyramid-* \\\n\t| rl78-* | romp-* | rs6000-* | rx-* \\\n\t| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \\\n\t| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \\\n\t| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \\\n\t| sparclite-* \\\n\t| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \\\n\t| tahoe-* \\\n\t| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \\\n\t| tile*-* \\\n\t| tron-* \\\n\t| ubicom32-* \\\n\t| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \\\n\t| vax-* \\\n\t| we32k-* \\\n\t| x86-* | x86_64-* | xc16x-* | xps100-* \\\n\t| xstormy16-* | xtensa*-* \\\n\t| ymp-* \\\n\t| z8k-* | z80-*)\n\t\t;;\n\t# Recognize the basic CPU types without company name, with glob match.\n\txtensa*)\n\t\tbasic_machine=$basic_machine-unknown\n\t\t;;\n\t# Recognize the various machine names and aliases which stand\n\t# for a CPU type and a company and sometimes even an OS.\n\t386bsd)\n\t\tbasic_machine=i386-unknown\n\t\tos=-bsd\n\t\t;;\n\t3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)\n\t\tbasic_machine=m68000-att\n\t\t;;\n\t3b*)\n\t\tbasic_machine=we32k-att\n\t\t;;\n\ta29khif)\n\t\tbasic_machine=a29k-amd\n\t\tos=-udi\n\t\t;;\n\tabacus)\n\t\tbasic_machine=abacus-unknown\n\t\t;;\n\tadobe68k)\n\t\tbasic_machine=m68010-adobe\n\t\tos=-scout\n\t\t;;\n\talliant | fx80)\n\t\tbasic_machine=fx80-alliant\n\t\t;;\n\taltos | altos3068)\n\t\tbasic_machine=m68k-altos\n\t\t;;\n\tam29k)\n\t\tbasic_machine=a29k-none\n\t\tos=-bsd\n\t\t;;\n\tamd64)\n\t\tbasic_machine=x86_64-pc\n\t\t;;\n\tamd64-*)\n\t\tbasic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tamdahl)\n\t\tbasic_machine=580-amdahl\n\t\tos=-sysv\n\t\t;;\n\tamiga | amiga-*)\n\t\tbasic_machine=m68k-unknown\n\t\t;;\n\tamigaos | amigados)\n\t\tbasic_machine=m68k-unknown\n\t\tos=-amigaos\n\t\t;;\n\tamigaunix | amix)\n\t\tbasic_machine=m68k-unknown\n\t\tos=-sysv4\n\t\t;;\n\tapollo68)\n\t\tbasic_machine=m68k-apollo\n\t\tos=-sysv\n\t\t;;\n\tapollo68bsd)\n\t\tbasic_machine=m68k-apollo\n\t\tos=-bsd\n\t\t;;\n\taros)\n\t\tbasic_machine=i386-pc\n\t\tos=-aros\n\t\t;;\n\taux)\n\t\tbasic_machine=m68k-apple\n\t\tos=-aux\n\t\t;;\n\tbalance)\n\t\tbasic_machine=ns32k-sequent\n\t\tos=-dynix\n\t\t;;\n\tblackfin)\n\t\tbasic_machine=bfin-unknown\n\t\tos=-linux\n\t\t;;\n\tblackfin-*)\n\t\tbasic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\tos=-linux\n\t\t;;\n\tbluegene*)\n\t\tbasic_machine=powerpc-ibm\n\t\tos=-cnk\n\t\t;;\n\tc54x-*)\n\t\tbasic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tc55x-*)\n\t\tbasic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tc6x-*)\n\t\tbasic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tc90)\n\t\tbasic_machine=c90-cray\n\t\tos=-unicos\n\t\t;;\n\tcegcc)\n\t\tbasic_machine=arm-unknown\n\t\tos=-cegcc\n\t\t;;\n\tconvex-c1)\n\t\tbasic_machine=c1-convex\n\t\tos=-bsd\n\t\t;;\n\tconvex-c2)\n\t\tbasic_machine=c2-convex\n\t\tos=-bsd\n\t\t;;\n\tconvex-c32)\n\t\tbasic_machine=c32-convex\n\t\tos=-bsd\n\t\t;;\n\tconvex-c34)\n\t\tbasic_machine=c34-convex\n\t\tos=-bsd\n\t\t;;\n\tconvex-c38)\n\t\tbasic_machine=c38-convex\n\t\tos=-bsd\n\t\t;;\n\tcray | j90)\n\t\tbasic_machine=j90-cray\n\t\tos=-unicos\n\t\t;;\n\tcraynv)\n\t\tbasic_machine=craynv-cray\n\t\tos=-unicosmp\n\t\t;;\n\tcr16 | cr16-*)\n\t\tbasic_machine=cr16-unknown\n\t\tos=-elf\n\t\t;;\n\tcrds | unos)\n\t\tbasic_machine=m68k-crds\n\t\t;;\n\tcrisv32 | crisv32-* | etraxfs*)\n\t\tbasic_machine=crisv32-axis\n\t\t;;\n\tcris | cris-* | etrax*)\n\t\tbasic_machine=cris-axis\n\t\t;;\n\tcrx)\n\t\tbasic_machine=crx-unknown\n\t\tos=-elf\n\t\t;;\n\tda30 | da30-*)\n\t\tbasic_machine=m68k-da30\n\t\t;;\n\tdecstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)\n\t\tbasic_machine=mips-dec\n\t\t;;\n\tdecsystem10* | dec10*)\n\t\tbasic_machine=pdp10-dec\n\t\tos=-tops10\n\t\t;;\n\tdecsystem20* | dec20*)\n\t\tbasic_machine=pdp10-dec\n\t\tos=-tops20\n\t\t;;\n\tdelta | 3300 | motorola-3300 | motorola-delta \\\n\t      | 3300-motorola | delta-motorola)\n\t\tbasic_machine=m68k-motorola\n\t\t;;\n\tdelta88)\n\t\tbasic_machine=m88k-motorola\n\t\tos=-sysv3\n\t\t;;\n\tdicos)\n\t\tbasic_machine=i686-pc\n\t\tos=-dicos\n\t\t;;\n\tdjgpp)\n\t\tbasic_machine=i586-pc\n\t\tos=-msdosdjgpp\n\t\t;;\n\tdpx20 | dpx20-*)\n\t\tbasic_machine=rs6000-bull\n\t\tos=-bosx\n\t\t;;\n\tdpx2* | dpx2*-bull)\n\t\tbasic_machine=m68k-bull\n\t\tos=-sysv3\n\t\t;;\n\tebmon29k)\n\t\tbasic_machine=a29k-amd\n\t\tos=-ebmon\n\t\t;;\n\telxsi)\n\t\tbasic_machine=elxsi-elxsi\n\t\tos=-bsd\n\t\t;;\n\tencore | umax | mmax)\n\t\tbasic_machine=ns32k-encore\n\t\t;;\n\tes1800 | OSE68k | ose68k | ose | OSE)\n\t\tbasic_machine=m68k-ericsson\n\t\tos=-ose\n\t\t;;\n\tfx2800)\n\t\tbasic_machine=i860-alliant\n\t\t;;\n\tgenix)\n\t\tbasic_machine=ns32k-ns\n\t\t;;\n\tgmicro)\n\t\tbasic_machine=tron-gmicro\n\t\tos=-sysv\n\t\t;;\n\tgo32)\n\t\tbasic_machine=i386-pc\n\t\tos=-go32\n\t\t;;\n\th3050r* | hiux*)\n\t\tbasic_machine=hppa1.1-hitachi\n\t\tos=-hiuxwe2\n\t\t;;\n\th8300hms)\n\t\tbasic_machine=h8300-hitachi\n\t\tos=-hms\n\t\t;;\n\th8300xray)\n\t\tbasic_machine=h8300-hitachi\n\t\tos=-xray\n\t\t;;\n\th8500hms)\n\t\tbasic_machine=h8500-hitachi\n\t\tos=-hms\n\t\t;;\n\tharris)\n\t\tbasic_machine=m88k-harris\n\t\tos=-sysv3\n\t\t;;\n\thp300-*)\n\t\tbasic_machine=m68k-hp\n\t\t;;\n\thp300bsd)\n\t\tbasic_machine=m68k-hp\n\t\tos=-bsd\n\t\t;;\n\thp300hpux)\n\t\tbasic_machine=m68k-hp\n\t\tos=-hpux\n\t\t;;\n\thp3k9[0-9][0-9] | hp9[0-9][0-9])\n\t\tbasic_machine=hppa1.0-hp\n\t\t;;\n\thp9k2[0-9][0-9] | hp9k31[0-9])\n\t\tbasic_machine=m68000-hp\n\t\t;;\n\thp9k3[2-9][0-9])\n\t\tbasic_machine=m68k-hp\n\t\t;;\n\thp9k6[0-9][0-9] | hp6[0-9][0-9])\n\t\tbasic_machine=hppa1.0-hp\n\t\t;;\n\thp9k7[0-79][0-9] | hp7[0-79][0-9])\n\t\tbasic_machine=hppa1.1-hp\n\t\t;;\n\thp9k78[0-9] | hp78[0-9])\n\t\t# FIXME: really hppa2.0-hp\n\t\tbasic_machine=hppa1.1-hp\n\t\t;;\n\thp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)\n\t\t# FIXME: really hppa2.0-hp\n\t\tbasic_machine=hppa1.1-hp\n\t\t;;\n\thp9k8[0-9][13679] | hp8[0-9][13679])\n\t\tbasic_machine=hppa1.1-hp\n\t\t;;\n\thp9k8[0-9][0-9] | hp8[0-9][0-9])\n\t\tbasic_machine=hppa1.0-hp\n\t\t;;\n\thppa-next)\n\t\tos=-nextstep3\n\t\t;;\n\thppaosf)\n\t\tbasic_machine=hppa1.1-hp\n\t\tos=-osf\n\t\t;;\n\thppro)\n\t\tbasic_machine=hppa1.1-hp\n\t\tos=-proelf\n\t\t;;\n\ti370-ibm* | ibm*)\n\t\tbasic_machine=i370-ibm\n\t\t;;\n\ti*86v32)\n\t\tbasic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`\n\t\tos=-sysv32\n\t\t;;\n\ti*86v4*)\n\t\tbasic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`\n\t\tos=-sysv4\n\t\t;;\n\ti*86v)\n\t\tbasic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`\n\t\tos=-sysv\n\t\t;;\n\ti*86sol2)\n\t\tbasic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`\n\t\tos=-solaris2\n\t\t;;\n\ti386mach)\n\t\tbasic_machine=i386-mach\n\t\tos=-mach\n\t\t;;\n\ti386-vsta | vsta)\n\t\tbasic_machine=i386-unknown\n\t\tos=-vsta\n\t\t;;\n\tiris | iris4d)\n\t\tbasic_machine=mips-sgi\n\t\tcase $os in\n\t\t    -irix*)\n\t\t\t;;\n\t\t    *)\n\t\t\tos=-irix4\n\t\t\t;;\n\t\tesac\n\t\t;;\n\tisi68 | isi)\n\t\tbasic_machine=m68k-isi\n\t\tos=-sysv\n\t\t;;\n\tm68knommu)\n\t\tbasic_machine=m68k-unknown\n\t\tos=-linux\n\t\t;;\n\tm68knommu-*)\n\t\tbasic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\tos=-linux\n\t\t;;\n\tm88k-omron*)\n\t\tbasic_machine=m88k-omron\n\t\t;;\n\tmagnum | m3230)\n\t\tbasic_machine=mips-mips\n\t\tos=-sysv\n\t\t;;\n\tmerlin)\n\t\tbasic_machine=ns32k-utek\n\t\tos=-sysv\n\t\t;;\n\tmicroblaze)\n\t\tbasic_machine=microblaze-xilinx\n\t\t;;\n\tmingw32)\n\t\tbasic_machine=i386-pc\n\t\tos=-mingw32\n\t\t;;\n\tmingw32ce)\n\t\tbasic_machine=arm-unknown\n\t\tos=-mingw32ce\n\t\t;;\n\tminiframe)\n\t\tbasic_machine=m68000-convergent\n\t\t;;\n\t*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)\n\t\tbasic_machine=m68k-atari\n\t\tos=-mint\n\t\t;;\n\tmips3*-*)\n\t\tbasic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`\n\t\t;;\n\tmips3*)\n\t\tbasic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown\n\t\t;;\n\tmonitor)\n\t\tbasic_machine=m68k-rom68k\n\t\tos=-coff\n\t\t;;\n\tmorphos)\n\t\tbasic_machine=powerpc-unknown\n\t\tos=-morphos\n\t\t;;\n\tmsdos)\n\t\tbasic_machine=i386-pc\n\t\tos=-msdos\n\t\t;;\n\tms1-*)\n\t\tbasic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`\n\t\t;;\n\tmsys)\n\t\tbasic_machine=i386-pc\n\t\tos=-msys\n\t\t;;\n\tmvs)\n\t\tbasic_machine=i370-ibm\n\t\tos=-mvs\n\t\t;;\n\tnacl)\n\t\tbasic_machine=le32-unknown\n\t\tos=-nacl\n\t\t;;\n\tncr3000)\n\t\tbasic_machine=i486-ncr\n\t\tos=-sysv4\n\t\t;;\n\tnetbsd386)\n\t\tbasic_machine=i386-unknown\n\t\tos=-netbsd\n\t\t;;\n\tnetwinder)\n\t\tbasic_machine=armv4l-rebel\n\t\tos=-linux\n\t\t;;\n\tnews | news700 | news800 | news900)\n\t\tbasic_machine=m68k-sony\n\t\tos=-newsos\n\t\t;;\n\tnews1000)\n\t\tbasic_machine=m68030-sony\n\t\tos=-newsos\n\t\t;;\n\tnews-3600 | risc-news)\n\t\tbasic_machine=mips-sony\n\t\tos=-newsos\n\t\t;;\n\tnecv70)\n\t\tbasic_machine=v70-nec\n\t\tos=-sysv\n\t\t;;\n\tnext | m*-next )\n\t\tbasic_machine=m68k-next\n\t\tcase $os in\n\t\t    -nextstep* )\n\t\t\t;;\n\t\t    -ns2*)\n\t\t      os=-nextstep2\n\t\t\t;;\n\t\t    *)\n\t\t      os=-nextstep3\n\t\t\t;;\n\t\tesac\n\t\t;;\n\tnh3000)\n\t\tbasic_machine=m68k-harris\n\t\tos=-cxux\n\t\t;;\n\tnh[45]000)\n\t\tbasic_machine=m88k-harris\n\t\tos=-cxux\n\t\t;;\n\tnindy960)\n\t\tbasic_machine=i960-intel\n\t\tos=-nindy\n\t\t;;\n\tmon960)\n\t\tbasic_machine=i960-intel\n\t\tos=-mon960\n\t\t;;\n\tnonstopux)\n\t\tbasic_machine=mips-compaq\n\t\tos=-nonstopux\n\t\t;;\n\tnp1)\n\t\tbasic_machine=np1-gould\n\t\t;;\n\tneo-tandem)\n\t\tbasic_machine=neo-tandem\n\t\t;;\n\tnse-tandem)\n\t\tbasic_machine=nse-tandem\n\t\t;;\n\tnsr-tandem)\n\t\tbasic_machine=nsr-tandem\n\t\t;;\n\top50n-* | op60c-*)\n\t\tbasic_machine=hppa1.1-oki\n\t\tos=-proelf\n\t\t;;\n\topenrisc | openrisc-*)\n\t\tbasic_machine=or32-unknown\n\t\t;;\n\tos400)\n\t\tbasic_machine=powerpc-ibm\n\t\tos=-os400\n\t\t;;\n\tOSE68000 | ose68000)\n\t\tbasic_machine=m68000-ericsson\n\t\tos=-ose\n\t\t;;\n\tos68k)\n\t\tbasic_machine=m68k-none\n\t\tos=-os68k\n\t\t;;\n\tpa-hitachi)\n\t\tbasic_machine=hppa1.1-hitachi\n\t\tos=-hiuxwe2\n\t\t;;\n\tparagon)\n\t\tbasic_machine=i860-intel\n\t\tos=-osf\n\t\t;;\n\tparisc)\n\t\tbasic_machine=hppa-unknown\n\t\tos=-linux\n\t\t;;\n\tparisc-*)\n\t\tbasic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\tos=-linux\n\t\t;;\n\tpbd)\n\t\tbasic_machine=sparc-tti\n\t\t;;\n\tpbb)\n\t\tbasic_machine=m68k-tti\n\t\t;;\n\tpc532 | pc532-*)\n\t\tbasic_machine=ns32k-pc532\n\t\t;;\n\tpc98)\n\t\tbasic_machine=i386-pc\n\t\t;;\n\tpc98-*)\n\t\tbasic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tpentium | p5 | k5 | k6 | nexgen | viac3)\n\t\tbasic_machine=i586-pc\n\t\t;;\n\tpentiumpro | p6 | 6x86 | athlon | athlon_*)\n\t\tbasic_machine=i686-pc\n\t\t;;\n\tpentiumii | pentium2 | pentiumiii | pentium3)\n\t\tbasic_machine=i686-pc\n\t\t;;\n\tpentium4)\n\t\tbasic_machine=i786-pc\n\t\t;;\n\tpentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)\n\t\tbasic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tpentiumpro-* | p6-* | 6x86-* | athlon-*)\n\t\tbasic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tpentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)\n\t\tbasic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tpentium4-*)\n\t\tbasic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tpn)\n\t\tbasic_machine=pn-gould\n\t\t;;\n\tpower)\tbasic_machine=power-ibm\n\t\t;;\n\tppc | ppcbe)\tbasic_machine=powerpc-unknown\n\t\t;;\n\tppc-* | ppcbe-*)\n\t\tbasic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tppcle | powerpclittle | ppc-le | powerpc-little)\n\t\tbasic_machine=powerpcle-unknown\n\t\t;;\n\tppcle-* | powerpclittle-*)\n\t\tbasic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tppc64)\tbasic_machine=powerpc64-unknown\n\t\t;;\n\tppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tppc64le | powerpc64little | ppc64-le | powerpc64-little)\n\t\tbasic_machine=powerpc64le-unknown\n\t\t;;\n\tppc64le-* | powerpc64little-*)\n\t\tbasic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tps2)\n\t\tbasic_machine=i386-ibm\n\t\t;;\n\tpw32)\n\t\tbasic_machine=i586-unknown\n\t\tos=-pw32\n\t\t;;\n\trdos)\n\t\tbasic_machine=i386-pc\n\t\tos=-rdos\n\t\t;;\n\trom68k)\n\t\tbasic_machine=m68k-rom68k\n\t\tos=-coff\n\t\t;;\n\trm[46]00)\n\t\tbasic_machine=mips-siemens\n\t\t;;\n\trtpc | rtpc-*)\n\t\tbasic_machine=romp-ibm\n\t\t;;\n\ts390 | s390-*)\n\t\tbasic_machine=s390-ibm\n\t\t;;\n\ts390x | s390x-*)\n\t\tbasic_machine=s390x-ibm\n\t\t;;\n\tsa29200)\n\t\tbasic_machine=a29k-amd\n\t\tos=-udi\n\t\t;;\n\tsb1)\n\t\tbasic_machine=mipsisa64sb1-unknown\n\t\t;;\n\tsb1el)\n\t\tbasic_machine=mipsisa64sb1el-unknown\n\t\t;;\n\tsde)\n\t\tbasic_machine=mipsisa32-sde\n\t\tos=-elf\n\t\t;;\n\tsei)\n\t\tbasic_machine=mips-sei\n\t\tos=-seiux\n\t\t;;\n\tsequent)\n\t\tbasic_machine=i386-sequent\n\t\t;;\n\tsh)\n\t\tbasic_machine=sh-hitachi\n\t\tos=-hms\n\t\t;;\n\tsh5el)\n\t\tbasic_machine=sh5le-unknown\n\t\t;;\n\tsh64)\n\t\tbasic_machine=sh64-unknown\n\t\t;;\n\tsparclite-wrs | simso-wrs)\n\t\tbasic_machine=sparclite-wrs\n\t\tos=-vxworks\n\t\t;;\n\tsps7)\n\t\tbasic_machine=m68k-bull\n\t\tos=-sysv2\n\t\t;;\n\tspur)\n\t\tbasic_machine=spur-unknown\n\t\t;;\n\tst2000)\n\t\tbasic_machine=m68k-tandem\n\t\t;;\n\tstratus)\n\t\tbasic_machine=i860-stratus\n\t\tos=-sysv4\n\t\t;;\n\tstrongarm-* | thumb-*)\n\t\tbasic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tsun2)\n\t\tbasic_machine=m68000-sun\n\t\t;;\n\tsun2os3)\n\t\tbasic_machine=m68000-sun\n\t\tos=-sunos3\n\t\t;;\n\tsun2os4)\n\t\tbasic_machine=m68000-sun\n\t\tos=-sunos4\n\t\t;;\n\tsun3os3)\n\t\tbasic_machine=m68k-sun\n\t\tos=-sunos3\n\t\t;;\n\tsun3os4)\n\t\tbasic_machine=m68k-sun\n\t\tos=-sunos4\n\t\t;;\n\tsun4os3)\n\t\tbasic_machine=sparc-sun\n\t\tos=-sunos3\n\t\t;;\n\tsun4os4)\n\t\tbasic_machine=sparc-sun\n\t\tos=-sunos4\n\t\t;;\n\tsun4sol2)\n\t\tbasic_machine=sparc-sun\n\t\tos=-solaris2\n\t\t;;\n\tsun3 | sun3-*)\n\t\tbasic_machine=m68k-sun\n\t\t;;\n\tsun4)\n\t\tbasic_machine=sparc-sun\n\t\t;;\n\tsun386 | sun386i | roadrunner)\n\t\tbasic_machine=i386-sun\n\t\t;;\n\tsv1)\n\t\tbasic_machine=sv1-cray\n\t\tos=-unicos\n\t\t;;\n\tsymmetry)\n\t\tbasic_machine=i386-sequent\n\t\tos=-dynix\n\t\t;;\n\tt3e)\n\t\tbasic_machine=alphaev5-cray\n\t\tos=-unicos\n\t\t;;\n\tt90)\n\t\tbasic_machine=t90-cray\n\t\tos=-unicos\n\t\t;;\n\ttile*)\n\t\tbasic_machine=$basic_machine-unknown\n\t\tos=-linux-gnu\n\t\t;;\n\ttx39)\n\t\tbasic_machine=mipstx39-unknown\n\t\t;;\n\ttx39el)\n\t\tbasic_machine=mipstx39el-unknown\n\t\t;;\n\ttoad1)\n\t\tbasic_machine=pdp10-xkl\n\t\tos=-tops20\n\t\t;;\n\ttower | tower-32)\n\t\tbasic_machine=m68k-ncr\n\t\t;;\n\ttpf)\n\t\tbasic_machine=s390x-ibm\n\t\tos=-tpf\n\t\t;;\n\tudi29k)\n\t\tbasic_machine=a29k-amd\n\t\tos=-udi\n\t\t;;\n\tultra3)\n\t\tbasic_machine=a29k-nyu\n\t\tos=-sym1\n\t\t;;\n\tv810 | necv810)\n\t\tbasic_machine=v810-nec\n\t\tos=-none\n\t\t;;\n\tvaxv)\n\t\tbasic_machine=vax-dec\n\t\tos=-sysv\n\t\t;;\n\tvms)\n\t\tbasic_machine=vax-dec\n\t\tos=-vms\n\t\t;;\n\tvpp*|vx|vx-*)\n\t\tbasic_machine=f301-fujitsu\n\t\t;;\n\tvxworks960)\n\t\tbasic_machine=i960-wrs\n\t\tos=-vxworks\n\t\t;;\n\tvxworks68)\n\t\tbasic_machine=m68k-wrs\n\t\tos=-vxworks\n\t\t;;\n\tvxworks29k)\n\t\tbasic_machine=a29k-wrs\n\t\tos=-vxworks\n\t\t;;\n\tw65*)\n\t\tbasic_machine=w65-wdc\n\t\tos=-none\n\t\t;;\n\tw89k-*)\n\t\tbasic_machine=hppa1.1-winbond\n\t\tos=-proelf\n\t\t;;\n\txbox)\n\t\tbasic_machine=i686-pc\n\t\tos=-mingw32\n\t\t;;\n\txps | xps100)\n\t\tbasic_machine=xps100-honeywell\n\t\t;;\n\txscale-* | xscalee[bl]-*)\n\t\tbasic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`\n\t\t;;\n\tymp)\n\t\tbasic_machine=ymp-cray\n\t\tos=-unicos\n\t\t;;\n\tz8k-*-coff)\n\t\tbasic_machine=z8k-unknown\n\t\tos=-sim\n\t\t;;\n\tz80-*-coff)\n\t\tbasic_machine=z80-unknown\n\t\tos=-sim\n\t\t;;\n\tnone)\n\t\tbasic_machine=none-none\n\t\tos=-none\n\t\t;;\n\n# Here we handle the default manufacturer of certain CPU types.  It is in\n# some cases the only manufacturer, in others, it is the most popular.\n\tw89k)\n\t\tbasic_machine=hppa1.1-winbond\n\t\t;;\n\top50n)\n\t\tbasic_machine=hppa1.1-oki\n\t\t;;\n\top60c)\n\t\tbasic_machine=hppa1.1-oki\n\t\t;;\n\tromp)\n\t\tbasic_machine=romp-ibm\n\t\t;;\n\tmmix)\n\t\tbasic_machine=mmix-knuth\n\t\t;;\n\trs6000)\n\t\tbasic_machine=rs6000-ibm\n\t\t;;\n\tvax)\n\t\tbasic_machine=vax-dec\n\t\t;;\n\tpdp10)\n\t\t# there are many clones, so DEC is not a safe bet\n\t\tbasic_machine=pdp10-unknown\n\t\t;;\n\tpdp11)\n\t\tbasic_machine=pdp11-dec\n\t\t;;\n\twe32k)\n\t\tbasic_machine=we32k-att\n\t\t;;\n\tsh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)\n\t\tbasic_machine=sh-unknown\n\t\t;;\n\tsparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)\n\t\tbasic_machine=sparc-sun\n\t\t;;\n\tcydra)\n\t\tbasic_machine=cydra-cydrome\n\t\t;;\n\torion)\n\t\tbasic_machine=orion-highlevel\n\t\t;;\n\torion105)\n\t\tbasic_machine=clipper-highlevel\n\t\t;;\n\tmac | mpw | mac-mpw)\n\t\tbasic_machine=m68k-apple\n\t\t;;\n\tpmac | pmac-mpw)\n\t\tbasic_machine=powerpc-apple\n\t\t;;\n\t*-unknown)\n\t\t# Make sure to match an already-canonicalized machine name.\n\t\t;;\n\t*)\n\t\techo Invalid configuration \\`$1\\': machine \\`$basic_machine\\' not recognized 1>&2\n\t\texit 1\n\t\t;;\nesac\n\n# Here we canonicalize certain aliases for manufacturers.\ncase $basic_machine in\n\t*-digital*)\n\t\tbasic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`\n\t\t;;\n\t*-commodore*)\n\t\tbasic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`\n\t\t;;\n\t*)\n\t\t;;\nesac\n\n# Decode manufacturer-specific aliases for certain operating systems.\n\nif [ x\"$os\" != x\"\" ]\nthen\ncase $os in\n\t# First match some system type aliases\n\t# that might get confused with valid system types.\n\t# -solaris* is a basic system type, with this one exception.\n\t-auroraux)\n\t\tos=-auroraux\n\t\t;;\n\t-solaris1 | -solaris1.*)\n\t\tos=`echo $os | sed -e 's|solaris1|sunos4|'`\n\t\t;;\n\t-solaris)\n\t\tos=-solaris2\n\t\t;;\n\t-svr4*)\n\t\tos=-sysv4\n\t\t;;\n\t-unixware*)\n\t\tos=-sysv4.2uw\n\t\t;;\n\t-gnu/linux*)\n\t\tos=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`\n\t\t;;\n\t# First accept the basic system types.\n\t# The portable systems comes first.\n\t# Each alternative MUST END IN A *, to match a version number.\n\t# -sysv* is not here because it comes later, after sysvr4.\n\t-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \\\n\t      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\\\n\t      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \\\n\t      | -sym* | -kopensolaris* \\\n\t      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \\\n\t      | -aos* | -aros* \\\n\t      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \\\n\t      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \\\n\t      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \\\n\t      | -openbsd* | -solidbsd* \\\n\t      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \\\n\t      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \\\n\t      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \\\n\t      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \\\n\t      | -chorusos* | -chorusrdb* | -cegcc* \\\n\t      | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \\\n\t      | -mingw32* | -linux-gnu* | -linux-android* \\\n\t      | -linux-newlib* | -linux-uclibc* \\\n\t      | -uxpv* | -beos* | -mpeix* | -udk* \\\n\t      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \\\n\t      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \\\n\t      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \\\n\t      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \\\n\t      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \\\n\t      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \\\n\t      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)\n\t# Remember, each alternative MUST END IN *, to match a version number.\n\t\t;;\n\t-qnx*)\n\t\tcase $basic_machine in\n\t\t    x86-* | i*86-*)\n\t\t\t;;\n\t\t    *)\n\t\t\tos=-nto$os\n\t\t\t;;\n\t\tesac\n\t\t;;\n\t-nto-qnx*)\n\t\t;;\n\t-nto*)\n\t\tos=`echo $os | sed -e 's|nto|nto-qnx|'`\n\t\t;;\n\t-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \\\n\t      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \\\n\t      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)\n\t\t;;\n\t-mac*)\n\t\tos=`echo $os | sed -e 's|mac|macos|'`\n\t\t;;\n\t-linux-dietlibc)\n\t\tos=-linux-dietlibc\n\t\t;;\n\t-linux*)\n\t\tos=`echo $os | sed -e 's|linux|linux-gnu|'`\n\t\t;;\n\t-sunos5*)\n\t\tos=`echo $os | sed -e 's|sunos5|solaris2|'`\n\t\t;;\n\t-sunos6*)\n\t\tos=`echo $os | sed -e 's|sunos6|solaris3|'`\n\t\t;;\n\t-opened*)\n\t\tos=-openedition\n\t\t;;\n\t-os400*)\n\t\tos=-os400\n\t\t;;\n\t-wince*)\n\t\tos=-wince\n\t\t;;\n\t-osfrose*)\n\t\tos=-osfrose\n\t\t;;\n\t-osf*)\n\t\tos=-osf\n\t\t;;\n\t-utek*)\n\t\tos=-bsd\n\t\t;;\n\t-dynix*)\n\t\tos=-bsd\n\t\t;;\n\t-acis*)\n\t\tos=-aos\n\t\t;;\n\t-atheos*)\n\t\tos=-atheos\n\t\t;;\n\t-syllable*)\n\t\tos=-syllable\n\t\t;;\n\t-386bsd)\n\t\tos=-bsd\n\t\t;;\n\t-ctix* | -uts*)\n\t\tos=-sysv\n\t\t;;\n\t-nova*)\n\t\tos=-rtmk-nova\n\t\t;;\n\t-ns2 )\n\t\tos=-nextstep2\n\t\t;;\n\t-nsk*)\n\t\tos=-nsk\n\t\t;;\n\t# Preserve the version number of sinix5.\n\t-sinix5.*)\n\t\tos=`echo $os | sed -e 's|sinix|sysv|'`\n\t\t;;\n\t-sinix*)\n\t\tos=-sysv4\n\t\t;;\n\t-tpf*)\n\t\tos=-tpf\n\t\t;;\n\t-triton*)\n\t\tos=-sysv3\n\t\t;;\n\t-oss*)\n\t\tos=-sysv3\n\t\t;;\n\t-svr4)\n\t\tos=-sysv4\n\t\t;;\n\t-svr3)\n\t\tos=-sysv3\n\t\t;;\n\t-sysvr4)\n\t\tos=-sysv4\n\t\t;;\n\t# This must come after -sysvr4.\n\t-sysv*)\n\t\t;;\n\t-ose*)\n\t\tos=-ose\n\t\t;;\n\t-es1800*)\n\t\tos=-ose\n\t\t;;\n\t-xenix)\n\t\tos=-xenix\n\t\t;;\n\t-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)\n\t\tos=-mint\n\t\t;;\n\t-aros*)\n\t\tos=-aros\n\t\t;;\n\t-kaos*)\n\t\tos=-kaos\n\t\t;;\n\t-zvmoe)\n\t\tos=-zvmoe\n\t\t;;\n\t-dicos*)\n\t\tos=-dicos\n\t\t;;\n\t-nacl*)\n\t\t;;\n\t-none)\n\t\t;;\n\t*)\n\t\t# Get rid of the `-' at the beginning of $os.\n\t\tos=`echo $os | sed 's/[^-]*-//'`\n\t\techo Invalid configuration \\`$1\\': system \\`$os\\' not recognized 1>&2\n\t\texit 1\n\t\t;;\nesac\nelse\n\n# Here we handle the default operating systems that come with various machines.\n# The value should be what the vendor currently ships out the door with their\n# machine or put another way, the most popular os provided with the machine.\n\n# Note that if you're going to try to match \"-MANUFACTURER\" here (say,\n# \"-sun\"), then you have to tell the case statement up towards the top\n# that MANUFACTURER isn't an operating system.  Otherwise, code above\n# will signal an error saying that MANUFACTURER isn't an operating\n# system, and we'll never get to this point.\n\ncase $basic_machine in\n\tscore-*)\n\t\tos=-elf\n\t\t;;\n\tspu-*)\n\t\tos=-elf\n\t\t;;\n\t*-acorn)\n\t\tos=-riscix1.2\n\t\t;;\n\tarm*-rebel)\n\t\tos=-linux\n\t\t;;\n\tarm*-semi)\n\t\tos=-aout\n\t\t;;\n\tc4x-* | tic4x-*)\n\t\tos=-coff\n\t\t;;\n\ttic54x-*)\n\t\tos=-coff\n\t\t;;\n\ttic55x-*)\n\t\tos=-coff\n\t\t;;\n\ttic6x-*)\n\t\tos=-coff\n\t\t;;\n\t# This must come before the *-dec entry.\n\tpdp10-*)\n\t\tos=-tops20\n\t\t;;\n\tpdp11-*)\n\t\tos=-none\n\t\t;;\n\t*-dec | vax-*)\n\t\tos=-ultrix4.2\n\t\t;;\n\tm68*-apollo)\n\t\tos=-domain\n\t\t;;\n\ti386-sun)\n\t\tos=-sunos4.0.2\n\t\t;;\n\tm68000-sun)\n\t\tos=-sunos3\n\t\t;;\n\tm68*-cisco)\n\t\tos=-aout\n\t\t;;\n\tmep-*)\n\t\tos=-elf\n\t\t;;\n\tmips*-cisco)\n\t\tos=-elf\n\t\t;;\n\tmips*-*)\n\t\tos=-elf\n\t\t;;\n\tor32-*)\n\t\tos=-coff\n\t\t;;\n\t*-tti)\t# must be before sparc entry or we get the wrong os.\n\t\tos=-sysv3\n\t\t;;\n\tsparc-* | *-sun)\n\t\tos=-sunos4.1.1\n\t\t;;\n\t*-be)\n\t\tos=-beos\n\t\t;;\n\t*-haiku)\n\t\tos=-haiku\n\t\t;;\n\t*-ibm)\n\t\tos=-aix\n\t\t;;\n\t*-knuth)\n\t\tos=-mmixware\n\t\t;;\n\t*-wec)\n\t\tos=-proelf\n\t\t;;\n\t*-winbond)\n\t\tos=-proelf\n\t\t;;\n\t*-oki)\n\t\tos=-proelf\n\t\t;;\n\t*-hp)\n\t\tos=-hpux\n\t\t;;\n\t*-hitachi)\n\t\tos=-hiux\n\t\t;;\n\ti860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)\n\t\tos=-sysv\n\t\t;;\n\t*-cbm)\n\t\tos=-amigaos\n\t\t;;\n\t*-dg)\n\t\tos=-dgux\n\t\t;;\n\t*-dolphin)\n\t\tos=-sysv3\n\t\t;;\n\tm68k-ccur)\n\t\tos=-rtu\n\t\t;;\n\tm88k-omron*)\n\t\tos=-luna\n\t\t;;\n\t*-next )\n\t\tos=-nextstep\n\t\t;;\n\t*-sequent)\n\t\tos=-ptx\n\t\t;;\n\t*-crds)\n\t\tos=-unos\n\t\t;;\n\t*-ns)\n\t\tos=-genix\n\t\t;;\n\ti370-*)\n\t\tos=-mvs\n\t\t;;\n\t*-next)\n\t\tos=-nextstep3\n\t\t;;\n\t*-gould)\n\t\tos=-sysv\n\t\t;;\n\t*-highlevel)\n\t\tos=-bsd\n\t\t;;\n\t*-encore)\n\t\tos=-bsd\n\t\t;;\n\t*-sgi)\n\t\tos=-irix\n\t\t;;\n\t*-siemens)\n\t\tos=-sysv4\n\t\t;;\n\t*-masscomp)\n\t\tos=-rtu\n\t\t;;\n\tf30[01]-fujitsu | f700-fujitsu)\n\t\tos=-uxpv\n\t\t;;\n\t*-rom68k)\n\t\tos=-coff\n\t\t;;\n\t*-*bug)\n\t\tos=-coff\n\t\t;;\n\t*-apple)\n\t\tos=-macos\n\t\t;;\n\t*-atari*)\n\t\tos=-mint\n\t\t;;\n\t*)\n\t\tos=-none\n\t\t;;\nesac\nfi\n\n# Here we handle the case where we know the os, and the CPU type, but not the\n# manufacturer.  We pick the logical manufacturer.\nvendor=unknown\ncase $basic_machine in\n\t*-unknown)\n\t\tcase $os in\n\t\t\t-riscix*)\n\t\t\t\tvendor=acorn\n\t\t\t\t;;\n\t\t\t-sunos*)\n\t\t\t\tvendor=sun\n\t\t\t\t;;\n\t\t\t-cnk*|-aix*)\n\t\t\t\tvendor=ibm\n\t\t\t\t;;\n\t\t\t-beos*)\n\t\t\t\tvendor=be\n\t\t\t\t;;\n\t\t\t-hpux*)\n\t\t\t\tvendor=hp\n\t\t\t\t;;\n\t\t\t-mpeix*)\n\t\t\t\tvendor=hp\n\t\t\t\t;;\n\t\t\t-hiux*)\n\t\t\t\tvendor=hitachi\n\t\t\t\t;;\n\t\t\t-unos*)\n\t\t\t\tvendor=crds\n\t\t\t\t;;\n\t\t\t-dgux*)\n\t\t\t\tvendor=dg\n\t\t\t\t;;\n\t\t\t-luna*)\n\t\t\t\tvendor=omron\n\t\t\t\t;;\n\t\t\t-genix*)\n\t\t\t\tvendor=ns\n\t\t\t\t;;\n\t\t\t-mvs* | -opened*)\n\t\t\t\tvendor=ibm\n\t\t\t\t;;\n\t\t\t-os400*)\n\t\t\t\tvendor=ibm\n\t\t\t\t;;\n\t\t\t-ptx*)\n\t\t\t\tvendor=sequent\n\t\t\t\t;;\n\t\t\t-tpf*)\n\t\t\t\tvendor=ibm\n\t\t\t\t;;\n\t\t\t-vxsim* | -vxworks* | -windiss*)\n\t\t\t\tvendor=wrs\n\t\t\t\t;;\n\t\t\t-aux*)\n\t\t\t\tvendor=apple\n\t\t\t\t;;\n\t\t\t-hms*)\n\t\t\t\tvendor=hitachi\n\t\t\t\t;;\n\t\t\t-mpw* | -macos*)\n\t\t\t\tvendor=apple\n\t\t\t\t;;\n\t\t\t-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)\n\t\t\t\tvendor=atari\n\t\t\t\t;;\n\t\t\t-vos*)\n\t\t\t\tvendor=stratus\n\t\t\t\t;;\n\t\tesac\n\t\tbasic_machine=`echo $basic_machine | sed \"s/unknown/$vendor/\"`\n\t\t;;\nesac\n\necho $basic_machine$os\nexit\n\n# Local variables:\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"timestamp='\"\n# time-stamp-format: \"%:y-%02m-%02d\"\n# time-stamp-end: \"'\"\n# End:\n"
  },
  {
    "path": "libs/CoMISo/gmm/configure",
    "content": "#! /bin/sh\n# Guess values for system-dependent variables and create Makefiles.\n# Generated by GNU Autoconf 2.68.\n#\n#\n# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,\n# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software\n# Foundation, Inc.\n#\n#\n# This configure script is free software; the Free Software Foundation\n# gives unlimited permission to copy, distribute and modify it.\n## -------------------- ##\n## M4sh Initialization. ##\n## -------------------- ##\n\n# Be more Bourne compatible\nDUALCASE=1; export DUALCASE # for MKS sh\nif test -n \"${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :\n  emulate sh\n  NULLCMD=:\n  # Pre-4.2 versions of Zsh do word splitting on ${1+\"$@\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '${1+\"$@\"}'='\"$@\"'\n  setopt NO_GLOB_SUBST\nelse\n  case `(set -o) 2>/dev/null` in #(\n  *posix*) :\n    set -o posix ;; #(\n  *) :\n     ;;\nesac\nfi\n\n\nas_nl='\n'\nexport as_nl\n# Printing a long string crashes Solaris 7 /usr/bin/printf.\nas_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo\n# Prefer a ksh shell builtin over an external printf program on Solaris,\n# but without wasting forks for bash or zsh.\nif test -z \"$BASH_VERSION$ZSH_VERSION\" \\\n    && (test \"X`print -r -- $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='print -r --'\n  as_echo_n='print -rn --'\nelif (test \"X`printf %s $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='printf %s\\n'\n  as_echo_n='printf %s'\nelse\n  if test \"X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`\" = \"X-n $as_echo\"; then\n    as_echo_body='eval /usr/ucb/echo -n \"$1$as_nl\"'\n    as_echo_n='/usr/ucb/echo -n'\n  else\n    as_echo_body='eval expr \"X$1\" : \"X\\\\(.*\\\\)\"'\n    as_echo_n_body='eval\n      arg=$1;\n      case $arg in #(\n      *\"$as_nl\"*)\n\texpr \"X$arg\" : \"X\\\\(.*\\\\)$as_nl\";\n\targ=`expr \"X$arg\" : \".*$as_nl\\\\(.*\\\\)\"`;;\n      esac;\n      expr \"X$arg\" : \"X\\\\(.*\\\\)\" | tr -d \"$as_nl\"\n    '\n    export as_echo_n_body\n    as_echo_n='sh -c $as_echo_n_body as_echo'\n  fi\n  export as_echo_body\n  as_echo='sh -c $as_echo_body as_echo'\nfi\n\n# The user is always right.\nif test \"${PATH_SEPARATOR+set}\" != set; then\n  PATH_SEPARATOR=:\n  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {\n    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||\n      PATH_SEPARATOR=';'\n  }\nfi\n\n\n# IFS\n# We need space, tab and new line, in precisely that order.  Quoting is\n# there to prevent editors from complaining about space-tab.\n# (If _AS_PATH_WALK were called with IFS unset, it would disable word\n# splitting by setting IFS to empty value.)\nIFS=\" \"\"\t$as_nl\"\n\n# Find who we are.  Look in the path if we contain no directory separator.\nas_myself=\ncase $0 in #((\n  *[\\\\/]* ) as_myself=$0 ;;\n  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    test -r \"$as_dir/$0\" && as_myself=$as_dir/$0 && break\n  done\nIFS=$as_save_IFS\n\n     ;;\nesac\n# We did not find ourselves, most probably we were run as `sh COMMAND'\n# in which case we are not to be found in the path.\nif test \"x$as_myself\" = x; then\n  as_myself=$0\nfi\nif test ! -f \"$as_myself\"; then\n  $as_echo \"$as_myself: error: cannot find myself; rerun with an absolute file name\" >&2\n  exit 1\nfi\n\n# Unset variables that we do not need and which cause bugs (e.g. in\n# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the \"|| exit 1\"\n# suppresses any \"Segmentation fault\" message there.  '((' could\n# trigger a bug in pdksh 5.2.14.\nfor as_var in BASH_ENV ENV MAIL MAILPATH\ndo eval test x\\${$as_var+set} = xset \\\n  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :\ndone\nPS1='$ '\nPS2='> '\nPS4='+ '\n\n# NLS nuisances.\nLC_ALL=C\nexport LC_ALL\nLANGUAGE=C\nexport LANGUAGE\n\n# CDPATH.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\nif test \"x$CONFIG_SHELL\" = x; then\n  as_bourne_compatible=\"if test -n \\\"\\${ZSH_VERSION+set}\\\" && (emulate sh) >/dev/null 2>&1; then :\n  emulate sh\n  NULLCMD=:\n  # Pre-4.2 versions of Zsh do word splitting on \\${1+\\\"\\$@\\\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '\\${1+\\\"\\$@\\\"}'='\\\"\\$@\\\"'\n  setopt NO_GLOB_SUBST\nelse\n  case \\`(set -o) 2>/dev/null\\` in #(\n  *posix*) :\n    set -o posix ;; #(\n  *) :\n     ;;\nesac\nfi\n\"\n  as_required=\"as_fn_return () { (exit \\$1); }\nas_fn_success () { as_fn_return 0; }\nas_fn_failure () { as_fn_return 1; }\nas_fn_ret_success () { return 0; }\nas_fn_ret_failure () { return 1; }\n\nexitcode=0\nas_fn_success || { exitcode=1; echo as_fn_success failed.; }\nas_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }\nas_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }\nas_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }\nif ( set x; as_fn_ret_success y && test x = \\\"\\$1\\\" ); then :\n\nelse\n  exitcode=1; echo positional parameters were not saved.\nfi\ntest x\\$exitcode = x0 || exit 1\"\n  as_suggested=\"  as_lineno_1=\";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested\" as_lineno_1a=\\$LINENO\n  as_lineno_2=\";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested\" as_lineno_2a=\\$LINENO\n  eval 'test \\\"x\\$as_lineno_1'\\$as_run'\\\" != \\\"x\\$as_lineno_2'\\$as_run'\\\" &&\n  test \\\"x\\`expr \\$as_lineno_1'\\$as_run' + 1\\`\\\" = \\\"x\\$as_lineno_2'\\$as_run'\\\"' || exit 1\n\n  test -n \\\"\\${ZSH_VERSION+set}\\${BASH_VERSION+set}\\\" || (\n    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\n    ECHO=\\$ECHO\\$ECHO\\$ECHO\\$ECHO\\$ECHO\n    ECHO=\\$ECHO\\$ECHO\\$ECHO\\$ECHO\\$ECHO\\$ECHO\n    PATH=/empty FPATH=/empty; export PATH FPATH\n    test \\\"X\\`printf %s \\$ECHO\\`\\\" = \\\"X\\$ECHO\\\" \\\\\n      || test \\\"X\\`print -r -- \\$ECHO\\`\\\" = \\\"X\\$ECHO\\\" ) || exit 1\ntest \\$(( 1 + 1 )) = 2 || exit 1\"\n  if (eval \"$as_required\") 2>/dev/null; then :\n  as_have_required=yes\nelse\n  as_have_required=no\nfi\n  if test x$as_have_required = xyes && (eval \"$as_suggested\") 2>/dev/null; then :\n\nelse\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nas_found=false\nfor as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  as_found=:\n  case $as_dir in #(\n\t /*)\n\t   for as_base in sh bash ksh sh5; do\n\t     # Try only shells that exist, to save several forks.\n\t     as_shell=$as_dir/$as_base\n\t     if { test -f \"$as_shell\" || test -f \"$as_shell.exe\"; } &&\n\t\t    { $as_echo \"$as_bourne_compatible\"\"$as_required\" | as_run=a \"$as_shell\"; } 2>/dev/null; then :\n  CONFIG_SHELL=$as_shell as_have_required=yes\n\t\t   if { $as_echo \"$as_bourne_compatible\"\"$as_suggested\" | as_run=a \"$as_shell\"; } 2>/dev/null; then :\n  break 2\nfi\nfi\n\t   done;;\n       esac\n  as_found=false\ndone\n$as_found || { if { test -f \"$SHELL\" || test -f \"$SHELL.exe\"; } &&\n\t      { $as_echo \"$as_bourne_compatible\"\"$as_required\" | as_run=a \"$SHELL\"; } 2>/dev/null; then :\n  CONFIG_SHELL=$SHELL as_have_required=yes\nfi; }\nIFS=$as_save_IFS\n\n\n      if test \"x$CONFIG_SHELL\" != x; then :\n  # We cannot yet assume a decent shell, so we have to provide a\n\t# neutralization value for shells without unset; and this also\n\t# works around shells that cannot unset nonexistent variables.\n\t# Preserve -v and -x to the replacement shell.\n\tBASH_ENV=/dev/null\n\tENV=/dev/null\n\t(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV\n\texport CONFIG_SHELL\n\tcase $- in # ((((\n\t  *v*x* | *x*v* ) as_opts=-vx ;;\n\t  *v* ) as_opts=-v ;;\n\t  *x* ) as_opts=-x ;;\n\t  * ) as_opts= ;;\n\tesac\n\texec \"$CONFIG_SHELL\" $as_opts \"$as_myself\" ${1+\"$@\"}\nfi\n\n    if test x$as_have_required = xno; then :\n  $as_echo \"$0: This script requires a shell more modern than all\"\n  $as_echo \"$0: the shells that I found on your system.\"\n  if test x${ZSH_VERSION+set} = xset ; then\n    $as_echo \"$0: In particular, zsh $ZSH_VERSION has bugs and should\"\n    $as_echo \"$0: be upgraded to zsh 4.3.4 or later.\"\n  else\n    $as_echo \"$0: Please tell bug-autoconf@gnu.org about your system,\n$0: including any error possibly output before this\n$0: message. Then install a modern shell, or manually run\n$0: the script under such a shell if you do have one.\"\n  fi\n  exit 1\nfi\nfi\nfi\nSHELL=${CONFIG_SHELL-/bin/sh}\nexport SHELL\n# Unset more variables known to interfere with behavior of common tools.\nCLICOLOR_FORCE= GREP_OPTIONS=\nunset CLICOLOR_FORCE GREP_OPTIONS\n\n## --------------------- ##\n## M4sh Shell Functions. ##\n## --------------------- ##\n# as_fn_unset VAR\n# ---------------\n# Portably unset VAR.\nas_fn_unset ()\n{\n  { eval $1=; unset $1;}\n}\nas_unset=as_fn_unset\n\n# as_fn_set_status STATUS\n# -----------------------\n# Set $? to STATUS, without forking.\nas_fn_set_status ()\n{\n  return $1\n} # as_fn_set_status\n\n# as_fn_exit STATUS\n# -----------------\n# Exit the shell with STATUS, even in a \"trap 0\" or \"set -e\" context.\nas_fn_exit ()\n{\n  set +e\n  as_fn_set_status $1\n  exit $1\n} # as_fn_exit\n\n# as_fn_mkdir_p\n# -------------\n# Create \"$as_dir\" as a directory, including parents if necessary.\nas_fn_mkdir_p ()\n{\n\n  case $as_dir in #(\n  -*) as_dir=./$as_dir;;\n  esac\n  test -d \"$as_dir\" || eval $as_mkdir_p || {\n    as_dirs=\n    while :; do\n      case $as_dir in #(\n      *\\'*) as_qdir=`$as_echo \"$as_dir\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;; #'(\n      *) as_qdir=$as_dir;;\n      esac\n      as_dirs=\"'$as_qdir' $as_dirs\"\n      as_dir=`$as_dirname -- \"$as_dir\" ||\n$as_expr X\"$as_dir\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)$' \\| \\\n\t X\"$as_dir\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$as_dir\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n      test -d \"$as_dir\" && break\n    done\n    test -z \"$as_dirs\" || eval \"mkdir $as_dirs\"\n  } || test -d \"$as_dir\" || as_fn_error $? \"cannot create directory $as_dir\"\n\n\n} # as_fn_mkdir_p\n# as_fn_append VAR VALUE\n# ----------------------\n# Append the text in VALUE to the end of the definition contained in VAR. Take\n# advantage of any shell optimizations that allow amortized linear growth over\n# repeated appends, instead of the typical quadratic growth present in naive\n# implementations.\nif (eval \"as_var=1; as_var+=2; test x\\$as_var = x12\") 2>/dev/null; then :\n  eval 'as_fn_append ()\n  {\n    eval $1+=\\$2\n  }'\nelse\n  as_fn_append ()\n  {\n    eval $1=\\$$1\\$2\n  }\nfi # as_fn_append\n\n# as_fn_arith ARG...\n# ------------------\n# Perform arithmetic evaluation on the ARGs, and store the result in the\n# global $as_val. Take advantage of shells that can avoid forks. The arguments\n# must be portable across $(()) and expr.\nif (eval \"test \\$(( 1 + 1 )) = 2\") 2>/dev/null; then :\n  eval 'as_fn_arith ()\n  {\n    as_val=$(( $* ))\n  }'\nelse\n  as_fn_arith ()\n  {\n    as_val=`expr \"$@\" || test $? -eq 1`\n  }\nfi # as_fn_arith\n\n\n# as_fn_error STATUS ERROR [LINENO LOG_FD]\n# ----------------------------------------\n# Output \"`basename $0`: error: ERROR\" to stderr. If LINENO and LOG_FD are\n# provided, also output the error to LOG_FD, referencing LINENO. Then exit the\n# script with STATUS, using 1 if that was 0.\nas_fn_error ()\n{\n  as_status=$1; test $as_status -eq 0 && as_status=1\n  if test \"$4\"; then\n    as_lineno=${as_lineno-\"$3\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n    $as_echo \"$as_me:${as_lineno-$LINENO}: error: $2\" >&$4\n  fi\n  $as_echo \"$as_me: error: $2\" >&2\n  as_fn_exit $as_status\n} # as_fn_error\n\nif expr a : '\\(a\\)' >/dev/null 2>&1 &&\n   test \"X`expr 00001 : '.*\\(...\\)'`\" = X001; then\n  as_expr=expr\nelse\n  as_expr=false\nfi\n\nif (basename -- /) >/dev/null 2>&1 && test \"X`basename -- / 2>&1`\" = \"X/\"; then\n  as_basename=basename\nelse\n  as_basename=false\nfi\n\nif (as_dir=`dirname -- /` && test \"X$as_dir\" = X/) >/dev/null 2>&1; then\n  as_dirname=dirname\nelse\n  as_dirname=false\nfi\n\nas_me=`$as_basename -- \"$0\" ||\n$as_expr X/\"$0\" : '.*/\\([^/][^/]*\\)/*$' \\| \\\n\t X\"$0\" : 'X\\(//\\)$' \\| \\\n\t X\"$0\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X/\"$0\" |\n    sed '/^.*\\/\\([^/][^/]*\\)\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n\n# Avoid depending upon Character Ranges.\nas_cr_letters='abcdefghijklmnopqrstuvwxyz'\nas_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'\nas_cr_Letters=$as_cr_letters$as_cr_LETTERS\nas_cr_digits='0123456789'\nas_cr_alnum=$as_cr_Letters$as_cr_digits\n\n\n  as_lineno_1=$LINENO as_lineno_1a=$LINENO\n  as_lineno_2=$LINENO as_lineno_2a=$LINENO\n  eval 'test \"x$as_lineno_1'$as_run'\" != \"x$as_lineno_2'$as_run'\" &&\n  test \"x`expr $as_lineno_1'$as_run' + 1`\" = \"x$as_lineno_2'$as_run'\"' || {\n  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)\n  sed -n '\n    p\n    /[$]LINENO/=\n  ' <$as_myself |\n    sed '\n      s/[$]LINENO.*/&-/\n      t lineno\n      b\n      :lineno\n      N\n      :loop\n      s/[$]LINENO\\([^'$as_cr_alnum'_].*\\n\\)\\(.*\\)/\\2\\1\\2/\n      t loop\n      s/-\\n.*//\n    ' >$as_me.lineno &&\n  chmod +x \"$as_me.lineno\" ||\n    { $as_echo \"$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell\" >&2; as_fn_exit 1; }\n\n  # Don't try to exec as it changes $[0], causing all sort of problems\n  # (the dirname of $[0] is not the place where we might find the\n  # original and so on.  Autoconf is especially sensitive to this).\n  . \"./$as_me.lineno\"\n  # Exit status is that of the last command.\n  exit\n}\n\nECHO_C= ECHO_N= ECHO_T=\ncase `echo -n x` in #(((((\n-n*)\n  case `echo 'xy\\c'` in\n  *c*) ECHO_T='\t';;\t# ECHO_T is single tab character.\n  xy)  ECHO_C='\\c';;\n  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null\n       ECHO_T='\t';;\n  esac;;\n*)\n  ECHO_N='-n';;\nesac\n\nrm -f conf$$ conf$$.exe conf$$.file\nif test -d conf$$.dir; then\n  rm -f conf$$.dir/conf$$.file\nelse\n  rm -f conf$$.dir\n  mkdir conf$$.dir 2>/dev/null\nfi\nif (echo >conf$$.file) 2>/dev/null; then\n  if ln -s conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s='ln -s'\n    # ... but there are two gotchas:\n    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.\n    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.\n    # In both cases, we have to default to `cp -p'.\n    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||\n      as_ln_s='cp -p'\n  elif ln conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s=ln\n  else\n    as_ln_s='cp -p'\n  fi\nelse\n  as_ln_s='cp -p'\nfi\nrm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file\nrmdir conf$$.dir 2>/dev/null\n\nif mkdir -p . 2>/dev/null; then\n  as_mkdir_p='mkdir -p \"$as_dir\"'\nelse\n  test -d ./-p && rmdir ./-p\n  as_mkdir_p=false\nfi\n\nif test -x / >/dev/null 2>&1; then\n  as_test_x='test -x'\nelse\n  if ls -dL / >/dev/null 2>&1; then\n    as_ls_L_option=L\n  else\n    as_ls_L_option=\n  fi\n  as_test_x='\n    eval sh -c '\\''\n      if test -d \"$1\"; then\n\ttest -d \"$1/.\";\n      else\n\tcase $1 in #(\n\t-*)set \"./$1\";;\n\tesac;\n\tcase `ls -ld'$as_ls_L_option' \"$1\" 2>/dev/null` in #((\n\t???[sx]*):;;*)false;;esac;fi\n    '\\'' sh\n  '\nfi\nas_executable_p=$as_test_x\n\n# Sed expression to map a string onto a valid CPP name.\nas_tr_cpp=\"eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'\"\n\n# Sed expression to map a string onto a valid variable name.\nas_tr_sh=\"eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'\"\n\nSHELL=${CONFIG_SHELL-/bin/sh}\n\n\ntest -n \"$DJDIR\" || exec 7<&0 </dev/null\nexec 6>&1\n\n# Name of the host.\n# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,\n# so uname gets run too.\nac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`\n\n#\n# Initializations.\n#\nac_default_prefix=/usr/local\nac_clean_files=\nac_config_libobj_dir=.\nLIBOBJS=\ncross_compiling=no\nsubdirs=\nMFLAGS=\nMAKEFLAGS=\n\n# Identity of this package.\nPACKAGE_NAME=\nPACKAGE_TARNAME=\nPACKAGE_VERSION=\nPACKAGE_STRING=\nPACKAGE_BUGREPORT=\nPACKAGE_URL=\n\n# Factoring default headers for most tests.\nac_includes_default=\"\\\n#include <stdio.h>\n#ifdef HAVE_SYS_TYPES_H\n# include <sys/types.h>\n#endif\n#ifdef HAVE_SYS_STAT_H\n# include <sys/stat.h>\n#endif\n#ifdef STDC_HEADERS\n# include <stdlib.h>\n# include <stddef.h>\n#else\n# ifdef HAVE_STDLIB_H\n#  include <stdlib.h>\n# endif\n#endif\n#ifdef HAVE_STRING_H\n# if !defined STDC_HEADERS && defined HAVE_MEMORY_H\n#  include <memory.h>\n# endif\n# include <string.h>\n#endif\n#ifdef HAVE_STRINGS_H\n# include <strings.h>\n#endif\n#ifdef HAVE_INTTYPES_H\n# include <inttypes.h>\n#endif\n#ifdef HAVE_STDINT_H\n# include <stdint.h>\n#endif\n#ifdef HAVE_UNISTD_H\n# include <unistd.h>\n#endif\"\n\nac_subst_vars='am__EXEEXT_FALSE\nam__EXEEXT_TRUE\nLTLIBOBJS\nLIBOBJS\nLIBTOOL_VERSION_INFO\nCONFIGURE_ARGS\nBUILDDATE\nBUILDER\nLIBTOOL_DEPS\nCPP\nOTOOL64\nOTOOL\nLIPO\nNMEDIT\nDSYMUTIL\nMANIFEST_TOOL\nRANLIB\nac_ct_AR\nAR\nDLLTOOL\nOBJDUMP\nLN_S\nNM\nac_ct_DUMPBIN\nDUMPBIN\nLD\nFGREP\nEGREP\nGREP\nSED\nam__fastdepCC_FALSE\nam__fastdepCC_TRUE\nCCDEPMODE\nac_ct_CC\nCFLAGS\nCC\nLIBTOOL\nSUPLDFLAGS\nhost_os\nhost_vendor\nhost_cpu\nhost\nbuild_os\nbuild_vendor\nbuild_cpu\nbuild\nCXXCPP\nam__fastdepCXX_FALSE\nam__fastdepCXX_TRUE\nCXXDEPMODE\nam__nodep\nAMDEPBACKSLASH\nAMDEP_FALSE\nAMDEP_TRUE\nam__quote\nam__include\nDEPDIR\nOBJEXT\nEXEEXT\nac_ct_CXX\nCPPFLAGS\nLDFLAGS\nCXXFLAGS\nCXX\nam__untar\nam__tar\nAMTAR\nam__leading_dot\nSET_MAKE\nAWK\nmkdir_p\nMKDIR_P\nINSTALL_STRIP_PROGRAM\nSTRIP\ninstall_sh\nMAKEINFO\nAUTOHEADER\nAUTOMAKE\nAUTOCONF\nACLOCAL\nVERSION\nPACKAGE\nCYGPATH_W\nam__isrc\nINSTALL_DATA\nINSTALL_SCRIPT\nINSTALL_PROGRAM\ntarget_alias\nhost_alias\nbuild_alias\nLIBS\nECHO_T\nECHO_N\nECHO_C\nDEFS\nmandir\nlocaledir\nlibdir\npsdir\npdfdir\ndvidir\nhtmldir\ninfodir\ndocdir\noldincludedir\nincludedir\nlocalstatedir\nsharedstatedir\nsysconfdir\ndatadir\ndatarootdir\nlibexecdir\nsbindir\nbindir\nprogram_transform_name\nprefix\nexec_prefix\nPACKAGE_URL\nPACKAGE_BUGREPORT\nPACKAGE_STRING\nPACKAGE_VERSION\nPACKAGE_TARNAME\nPACKAGE_NAME\nPATH_SEPARATOR\nSHELL'\nac_subst_files=''\nac_user_opts='\nenable_option_checking\nenable_dependency_tracking\nenable_static\nenable_shared\nwith_pic\nenable_fast_install\nwith_gnu_ld\nwith_sysroot\nenable_libtool_lock\n'\n      ac_precious_vars='build_alias\nhost_alias\ntarget_alias\nCXX\nCXXFLAGS\nLDFLAGS\nLIBS\nCPPFLAGS\nCCC\nCXXCPP\nCC\nCFLAGS\nCPP'\n\n\n# Initialize some variables set by options.\nac_init_help=\nac_init_version=false\nac_unrecognized_opts=\nac_unrecognized_sep=\n# The variables have the same names as the options, with\n# dashes changed to underlines.\ncache_file=/dev/null\nexec_prefix=NONE\nno_create=\nno_recursion=\nprefix=NONE\nprogram_prefix=NONE\nprogram_suffix=NONE\nprogram_transform_name=s,x,x,\nsilent=\nsite=\nsrcdir=\nverbose=\nx_includes=NONE\nx_libraries=NONE\n\n# Installation directory options.\n# These are left unexpanded so users can \"make install exec_prefix=/foo\"\n# and all the variables that are supposed to be based on exec_prefix\n# by default will actually change.\n# Use braces instead of parens because sh, perl, etc. also accept them.\n# (The list follows the same order as the GNU Coding Standards.)\nbindir='${exec_prefix}/bin'\nsbindir='${exec_prefix}/sbin'\nlibexecdir='${exec_prefix}/libexec'\ndatarootdir='${prefix}/share'\ndatadir='${datarootdir}'\nsysconfdir='${prefix}/etc'\nsharedstatedir='${prefix}/com'\nlocalstatedir='${prefix}/var'\nincludedir='${prefix}/include'\noldincludedir='/usr/include'\ndocdir='${datarootdir}/doc/${PACKAGE}'\ninfodir='${datarootdir}/info'\nhtmldir='${docdir}'\ndvidir='${docdir}'\npdfdir='${docdir}'\npsdir='${docdir}'\nlibdir='${exec_prefix}/lib'\nlocaledir='${datarootdir}/locale'\nmandir='${datarootdir}/man'\n\nac_prev=\nac_dashdash=\nfor ac_option\ndo\n  # If the previous option needs an argument, assign it.\n  if test -n \"$ac_prev\"; then\n    eval $ac_prev=\\$ac_option\n    ac_prev=\n    continue\n  fi\n\n  case $ac_option in\n  *=?*) ac_optarg=`expr \"X$ac_option\" : '[^=]*=\\(.*\\)'` ;;\n  *=)   ac_optarg= ;;\n  *)    ac_optarg=yes ;;\n  esac\n\n  # Accept the important Cygnus configure options, so we can diagnose typos.\n\n  case $ac_dashdash$ac_option in\n  --)\n    ac_dashdash=yes ;;\n\n  -bindir | --bindir | --bindi | --bind | --bin | --bi)\n    ac_prev=bindir ;;\n  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)\n    bindir=$ac_optarg ;;\n\n  -build | --build | --buil | --bui | --bu)\n    ac_prev=build_alias ;;\n  -build=* | --build=* | --buil=* | --bui=* | --bu=*)\n    build_alias=$ac_optarg ;;\n\n  -cache-file | --cache-file | --cache-fil | --cache-fi \\\n  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)\n    ac_prev=cache_file ;;\n  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \\\n  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)\n    cache_file=$ac_optarg ;;\n\n  --config-cache | -C)\n    cache_file=config.cache ;;\n\n  -datadir | --datadir | --datadi | --datad)\n    ac_prev=datadir ;;\n  -datadir=* | --datadir=* | --datadi=* | --datad=*)\n    datadir=$ac_optarg ;;\n\n  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \\\n  | --dataroo | --dataro | --datar)\n    ac_prev=datarootdir ;;\n  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \\\n  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)\n    datarootdir=$ac_optarg ;;\n\n  -disable-* | --disable-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*disable-\\(.*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error $? \"invalid feature name: $ac_useropt\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"enable_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval enable_$ac_useropt=no ;;\n\n  -docdir | --docdir | --docdi | --doc | --do)\n    ac_prev=docdir ;;\n  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)\n    docdir=$ac_optarg ;;\n\n  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)\n    ac_prev=dvidir ;;\n  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)\n    dvidir=$ac_optarg ;;\n\n  -enable-* | --enable-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*enable-\\([^=]*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error $? \"invalid feature name: $ac_useropt\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"enable_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval enable_$ac_useropt=\\$ac_optarg ;;\n\n  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \\\n  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \\\n  | --exec | --exe | --ex)\n    ac_prev=exec_prefix ;;\n  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \\\n  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \\\n  | --exec=* | --exe=* | --ex=*)\n    exec_prefix=$ac_optarg ;;\n\n  -gas | --gas | --ga | --g)\n    # Obsolete; use --with-gas.\n    with_gas=yes ;;\n\n  -help | --help | --hel | --he | -h)\n    ac_init_help=long ;;\n  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)\n    ac_init_help=recursive ;;\n  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)\n    ac_init_help=short ;;\n\n  -host | --host | --hos | --ho)\n    ac_prev=host_alias ;;\n  -host=* | --host=* | --hos=* | --ho=*)\n    host_alias=$ac_optarg ;;\n\n  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)\n    ac_prev=htmldir ;;\n  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \\\n  | --ht=*)\n    htmldir=$ac_optarg ;;\n\n  -includedir | --includedir | --includedi | --included | --include \\\n  | --includ | --inclu | --incl | --inc)\n    ac_prev=includedir ;;\n  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \\\n  | --includ=* | --inclu=* | --incl=* | --inc=*)\n    includedir=$ac_optarg ;;\n\n  -infodir | --infodir | --infodi | --infod | --info | --inf)\n    ac_prev=infodir ;;\n  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)\n    infodir=$ac_optarg ;;\n\n  -libdir | --libdir | --libdi | --libd)\n    ac_prev=libdir ;;\n  -libdir=* | --libdir=* | --libdi=* | --libd=*)\n    libdir=$ac_optarg ;;\n\n  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \\\n  | --libexe | --libex | --libe)\n    ac_prev=libexecdir ;;\n  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \\\n  | --libexe=* | --libex=* | --libe=*)\n    libexecdir=$ac_optarg ;;\n\n  -localedir | --localedir | --localedi | --localed | --locale)\n    ac_prev=localedir ;;\n  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)\n    localedir=$ac_optarg ;;\n\n  -localstatedir | --localstatedir | --localstatedi | --localstated \\\n  | --localstate | --localstat | --localsta | --localst | --locals)\n    ac_prev=localstatedir ;;\n  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \\\n  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)\n    localstatedir=$ac_optarg ;;\n\n  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)\n    ac_prev=mandir ;;\n  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)\n    mandir=$ac_optarg ;;\n\n  -nfp | --nfp | --nf)\n    # Obsolete; use --without-fp.\n    with_fp=no ;;\n\n  -no-create | --no-create | --no-creat | --no-crea | --no-cre \\\n  | --no-cr | --no-c | -n)\n    no_create=yes ;;\n\n  -no-recursion | --no-recursion | --no-recursio | --no-recursi \\\n  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)\n    no_recursion=yes ;;\n\n  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \\\n  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \\\n  | --oldin | --oldi | --old | --ol | --o)\n    ac_prev=oldincludedir ;;\n  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \\\n  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \\\n  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)\n    oldincludedir=$ac_optarg ;;\n\n  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)\n    ac_prev=prefix ;;\n  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)\n    prefix=$ac_optarg ;;\n\n  -program-prefix | --program-prefix | --program-prefi | --program-pref \\\n  | --program-pre | --program-pr | --program-p)\n    ac_prev=program_prefix ;;\n  -program-prefix=* | --program-prefix=* | --program-prefi=* \\\n  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)\n    program_prefix=$ac_optarg ;;\n\n  -program-suffix | --program-suffix | --program-suffi | --program-suff \\\n  | --program-suf | --program-su | --program-s)\n    ac_prev=program_suffix ;;\n  -program-suffix=* | --program-suffix=* | --program-suffi=* \\\n  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)\n    program_suffix=$ac_optarg ;;\n\n  -program-transform-name | --program-transform-name \\\n  | --program-transform-nam | --program-transform-na \\\n  | --program-transform-n | --program-transform- \\\n  | --program-transform | --program-transfor \\\n  | --program-transfo | --program-transf \\\n  | --program-trans | --program-tran \\\n  | --progr-tra | --program-tr | --program-t)\n    ac_prev=program_transform_name ;;\n  -program-transform-name=* | --program-transform-name=* \\\n  | --program-transform-nam=* | --program-transform-na=* \\\n  | --program-transform-n=* | --program-transform-=* \\\n  | --program-transform=* | --program-transfor=* \\\n  | --program-transfo=* | --program-transf=* \\\n  | --program-trans=* | --program-tran=* \\\n  | --progr-tra=* | --program-tr=* | --program-t=*)\n    program_transform_name=$ac_optarg ;;\n\n  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)\n    ac_prev=pdfdir ;;\n  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)\n    pdfdir=$ac_optarg ;;\n\n  -psdir | --psdir | --psdi | --psd | --ps)\n    ac_prev=psdir ;;\n  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)\n    psdir=$ac_optarg ;;\n\n  -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n  | -silent | --silent | --silen | --sile | --sil)\n    silent=yes ;;\n\n  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)\n    ac_prev=sbindir ;;\n  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \\\n  | --sbi=* | --sb=*)\n    sbindir=$ac_optarg ;;\n\n  -sharedstatedir | --sharedstatedir | --sharedstatedi \\\n  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \\\n  | --sharedst | --shareds | --shared | --share | --shar \\\n  | --sha | --sh)\n    ac_prev=sharedstatedir ;;\n  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \\\n  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \\\n  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \\\n  | --sha=* | --sh=*)\n    sharedstatedir=$ac_optarg ;;\n\n  -site | --site | --sit)\n    ac_prev=site ;;\n  -site=* | --site=* | --sit=*)\n    site=$ac_optarg ;;\n\n  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)\n    ac_prev=srcdir ;;\n  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)\n    srcdir=$ac_optarg ;;\n\n  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \\\n  | --syscon | --sysco | --sysc | --sys | --sy)\n    ac_prev=sysconfdir ;;\n  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \\\n  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)\n    sysconfdir=$ac_optarg ;;\n\n  -target | --target | --targe | --targ | --tar | --ta | --t)\n    ac_prev=target_alias ;;\n  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)\n    target_alias=$ac_optarg ;;\n\n  -v | -verbose | --verbose | --verbos | --verbo | --verb)\n    verbose=yes ;;\n\n  -version | --version | --versio | --versi | --vers | -V)\n    ac_init_version=: ;;\n\n  -with-* | --with-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*with-\\([^=]*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error $? \"invalid package name: $ac_useropt\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"with_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval with_$ac_useropt=\\$ac_optarg ;;\n\n  -without-* | --without-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*without-\\(.*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error $? \"invalid package name: $ac_useropt\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"with_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval with_$ac_useropt=no ;;\n\n  --x)\n    # Obsolete; use --with-x.\n    with_x=yes ;;\n\n  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \\\n  | --x-incl | --x-inc | --x-in | --x-i)\n    ac_prev=x_includes ;;\n  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \\\n  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)\n    x_includes=$ac_optarg ;;\n\n  -x-libraries | --x-libraries | --x-librarie | --x-librari \\\n  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)\n    ac_prev=x_libraries ;;\n  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \\\n  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)\n    x_libraries=$ac_optarg ;;\n\n  -*) as_fn_error $? \"unrecognized option: \\`$ac_option'\nTry \\`$0 --help' for more information\"\n    ;;\n\n  *=*)\n    ac_envvar=`expr \"x$ac_option\" : 'x\\([^=]*\\)='`\n    # Reject names that are not valid shell variable names.\n    case $ac_envvar in #(\n      '' | [0-9]* | *[!_$as_cr_alnum]* )\n      as_fn_error $? \"invalid variable name: \\`$ac_envvar'\" ;;\n    esac\n    eval $ac_envvar=\\$ac_optarg\n    export $ac_envvar ;;\n\n  *)\n    # FIXME: should be removed in autoconf 3.0.\n    $as_echo \"$as_me: WARNING: you should use --build, --host, --target\" >&2\n    expr \"x$ac_option\" : \".*[^-._$as_cr_alnum]\" >/dev/null &&\n      $as_echo \"$as_me: WARNING: invalid host type: $ac_option\" >&2\n    : \"${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}\"\n    ;;\n\n  esac\ndone\n\nif test -n \"$ac_prev\"; then\n  ac_option=--`echo $ac_prev | sed 's/_/-/g'`\n  as_fn_error $? \"missing argument to $ac_option\"\nfi\n\nif test -n \"$ac_unrecognized_opts\"; then\n  case $enable_option_checking in\n    no) ;;\n    fatal) as_fn_error $? \"unrecognized options: $ac_unrecognized_opts\" ;;\n    *)     $as_echo \"$as_me: WARNING: unrecognized options: $ac_unrecognized_opts\" >&2 ;;\n  esac\nfi\n\n# Check all directory arguments for consistency.\nfor ac_var in\texec_prefix prefix bindir sbindir libexecdir datarootdir \\\n\t\tdatadir sysconfdir sharedstatedir localstatedir includedir \\\n\t\toldincludedir docdir infodir htmldir dvidir pdfdir psdir \\\n\t\tlibdir localedir mandir\ndo\n  eval ac_val=\\$$ac_var\n  # Remove trailing slashes.\n  case $ac_val in\n    */ )\n      ac_val=`expr \"X$ac_val\" : 'X\\(.*[^/]\\)' \\| \"X$ac_val\" : 'X\\(.*\\)'`\n      eval $ac_var=\\$ac_val;;\n  esac\n  # Be sure to have absolute directory names.\n  case $ac_val in\n    [\\\\/$]* | ?:[\\\\/]* )  continue;;\n    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;\n  esac\n  as_fn_error $? \"expected an absolute directory name for --$ac_var: $ac_val\"\ndone\n\n# There might be people who depend on the old broken behavior: `$host'\n# used to hold the argument of --host etc.\n# FIXME: To remove some day.\nbuild=$build_alias\nhost=$host_alias\ntarget=$target_alias\n\n# FIXME: To remove some day.\nif test \"x$host_alias\" != x; then\n  if test \"x$build_alias\" = x; then\n    cross_compiling=maybe\n    $as_echo \"$as_me: WARNING: if you wanted to set the --build type, don't use --host.\n    If a cross compiler is detected then cross compile mode will be used\" >&2\n  elif test \"x$build_alias\" != \"x$host_alias\"; then\n    cross_compiling=yes\n  fi\nfi\n\nac_tool_prefix=\ntest -n \"$host_alias\" && ac_tool_prefix=$host_alias-\n\ntest \"$silent\" = yes && exec 6>/dev/null\n\n\nac_pwd=`pwd` && test -n \"$ac_pwd\" &&\nac_ls_di=`ls -di .` &&\nac_pwd_ls_di=`cd \"$ac_pwd\" && ls -di .` ||\n  as_fn_error $? \"working directory cannot be determined\"\ntest \"X$ac_ls_di\" = \"X$ac_pwd_ls_di\" ||\n  as_fn_error $? \"pwd does not report name of working directory\"\n\n\n# Find the source files, if location was not specified.\nif test -z \"$srcdir\"; then\n  ac_srcdir_defaulted=yes\n  # Try the directory containing this script, then the parent directory.\n  ac_confdir=`$as_dirname -- \"$as_myself\" ||\n$as_expr X\"$as_myself\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$as_myself\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$as_myself\" : 'X\\(//\\)$' \\| \\\n\t X\"$as_myself\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$as_myself\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n  srcdir=$ac_confdir\n  if test ! -r \"$srcdir/$ac_unique_file\"; then\n    srcdir=..\n  fi\nelse\n  ac_srcdir_defaulted=no\nfi\nif test ! -r \"$srcdir/$ac_unique_file\"; then\n  test \"$ac_srcdir_defaulted\" = yes && srcdir=\"$ac_confdir or ..\"\n  as_fn_error $? \"cannot find sources ($ac_unique_file) in $srcdir\"\nfi\nac_msg=\"sources are in $srcdir, but \\`cd $srcdir' does not work\"\nac_abs_confdir=`(\n\tcd \"$srcdir\" && test -r \"./$ac_unique_file\" || as_fn_error $? \"$ac_msg\"\n\tpwd)`\n# When building in place, set srcdir=.\nif test \"$ac_abs_confdir\" = \"$ac_pwd\"; then\n  srcdir=.\nfi\n# Remove unnecessary trailing slashes from srcdir.\n# Double slashes in file names in object file debugging info\n# mess up M-x gdb in Emacs.\ncase $srcdir in\n*/) srcdir=`expr \"X$srcdir\" : 'X\\(.*[^/]\\)' \\| \"X$srcdir\" : 'X\\(.*\\)'`;;\nesac\nfor ac_var in $ac_precious_vars; do\n  eval ac_env_${ac_var}_set=\\${${ac_var}+set}\n  eval ac_env_${ac_var}_value=\\$${ac_var}\n  eval ac_cv_env_${ac_var}_set=\\${${ac_var}+set}\n  eval ac_cv_env_${ac_var}_value=\\$${ac_var}\ndone\n\n#\n# Report the --help message.\n#\nif test \"$ac_init_help\" = \"long\"; then\n  # Omit some internal or obsolete options to make the list less imposing.\n  # This message is too long to be a string in the A/UX 3.1 sh.\n  cat <<_ACEOF\n\\`configure' configures this package to adapt to many kinds of systems.\n\nUsage: $0 [OPTION]... [VAR=VALUE]...\n\nTo assign environment variables (e.g., CC, CFLAGS...), specify them as\nVAR=VALUE.  See below for descriptions of some of the useful variables.\n\nDefaults for the options are specified in brackets.\n\nConfiguration:\n  -h, --help              display this help and exit\n      --help=short        display options specific to this package\n      --help=recursive    display the short help of all the included packages\n  -V, --version           display version information and exit\n  -q, --quiet, --silent   do not print \\`checking ...' messages\n      --cache-file=FILE   cache test results in FILE [disabled]\n  -C, --config-cache      alias for \\`--cache-file=config.cache'\n  -n, --no-create         do not create output files\n      --srcdir=DIR        find the sources in DIR [configure dir or \\`..']\n\nInstallation directories:\n  --prefix=PREFIX         install architecture-independent files in PREFIX\n                          [$ac_default_prefix]\n  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX\n                          [PREFIX]\n\nBy default, \\`make install' will install all the files in\n\\`$ac_default_prefix/bin', \\`$ac_default_prefix/lib' etc.  You can specify\nan installation prefix other than \\`$ac_default_prefix' using \\`--prefix',\nfor instance \\`--prefix=\\$HOME'.\n\nFor better control, use the options below.\n\nFine tuning of the installation directories:\n  --bindir=DIR            user executables [EPREFIX/bin]\n  --sbindir=DIR           system admin executables [EPREFIX/sbin]\n  --libexecdir=DIR        program executables [EPREFIX/libexec]\n  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]\n  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]\n  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]\n  --libdir=DIR            object code libraries [EPREFIX/lib]\n  --includedir=DIR        C header files [PREFIX/include]\n  --oldincludedir=DIR     C header files for non-gcc [/usr/include]\n  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]\n  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]\n  --infodir=DIR           info documentation [DATAROOTDIR/info]\n  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]\n  --mandir=DIR            man documentation [DATAROOTDIR/man]\n  --docdir=DIR            documentation root [DATAROOTDIR/doc/PACKAGE]\n  --htmldir=DIR           html documentation [DOCDIR]\n  --dvidir=DIR            dvi documentation [DOCDIR]\n  --pdfdir=DIR            pdf documentation [DOCDIR]\n  --psdir=DIR             ps documentation [DOCDIR]\n_ACEOF\n\n  cat <<\\_ACEOF\n\nProgram names:\n  --program-prefix=PREFIX            prepend PREFIX to installed program names\n  --program-suffix=SUFFIX            append SUFFIX to installed program names\n  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names\n\nSystem types:\n  --build=BUILD     configure for building on BUILD [guessed]\n  --host=HOST       cross-compile to build programs to run on HOST [BUILD]\n_ACEOF\nfi\n\nif test -n \"$ac_init_help\"; then\n\n  cat <<\\_ACEOF\n\nOptional Features:\n  --disable-option-checking  ignore unrecognized --enable/--with options\n  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)\n  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]\n  --disable-dependency-tracking  speeds up one-time build\n  --enable-dependency-tracking   do not reject slow dependency extractors\n  --enable-static[=PKGS]  build static libraries [default=yes]\n  --enable-shared[=PKGS]  build shared libraries [default=yes]\n  --enable-fast-install[=PKGS]\n                          optimize for fast installation [default=yes]\n  --disable-libtool-lock  avoid locking (might break parallel builds)\n\nOptional Packages:\n  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]\n  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)\n  --with-pic[=PKGS]       try to use only PIC/non-PIC objects [default=use\n                          both]\n  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]\n  --with-sysroot=DIR Search for dependent libraries within DIR\n                        (or the compiler's sysroot if not specified).\n\nSome influential environment variables:\n  CXX         C++ compiler command\n  CXXFLAGS    C++ compiler flags\n  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a\n              nonstandard directory <lib dir>\n  LIBS        libraries to pass to the linker, e.g. -l<library>\n  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if\n              you have headers in a nonstandard directory <include dir>\n  CXXCPP      C++ preprocessor\n  CC          C compiler command\n  CFLAGS      C compiler flags\n  CPP         C preprocessor\n\nUse these variables to override the choices made by `configure' or to help\nit to find libraries and programs with nonstandard names/locations.\n\nReport bugs to the package provider.\n_ACEOF\nac_status=$?\nfi\n\nif test \"$ac_init_help\" = \"recursive\"; then\n  # If there are subdirs, report their specific --help.\n  for ac_dir in : $ac_subdirs_all; do test \"x$ac_dir\" = x: && continue\n    test -d \"$ac_dir\" ||\n      { cd \"$srcdir\" && ac_pwd=`pwd` && srcdir=. && test -d \"$ac_dir\"; } ||\n      continue\n    ac_builddir=.\n\ncase \"$ac_dir\" in\n.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;\n*)\n  ac_dir_suffix=/`$as_echo \"$ac_dir\" | sed 's|^\\.[\\\\/]||'`\n  # A \"..\" for each directory in $ac_dir_suffix.\n  ac_top_builddir_sub=`$as_echo \"$ac_dir_suffix\" | sed 's|/[^\\\\/]*|/..|g;s|/||'`\n  case $ac_top_builddir_sub in\n  \"\") ac_top_builddir_sub=. ac_top_build_prefix= ;;\n  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;\n  esac ;;\nesac\nac_abs_top_builddir=$ac_pwd\nac_abs_builddir=$ac_pwd$ac_dir_suffix\n# for backward compatibility:\nac_top_builddir=$ac_top_build_prefix\n\ncase $srcdir in\n  .)  # We are building in place.\n    ac_srcdir=.\n    ac_top_srcdir=$ac_top_builddir_sub\n    ac_abs_top_srcdir=$ac_pwd ;;\n  [\\\\/]* | ?:[\\\\/]* )  # Absolute name.\n    ac_srcdir=$srcdir$ac_dir_suffix;\n    ac_top_srcdir=$srcdir\n    ac_abs_top_srcdir=$srcdir ;;\n  *) # Relative name.\n    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix\n    ac_top_srcdir=$ac_top_build_prefix$srcdir\n    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;\nesac\nac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix\n\n    cd \"$ac_dir\" || { ac_status=$?; continue; }\n    # Check for guested configure.\n    if test -f \"$ac_srcdir/configure.gnu\"; then\n      echo &&\n      $SHELL \"$ac_srcdir/configure.gnu\" --help=recursive\n    elif test -f \"$ac_srcdir/configure\"; then\n      echo &&\n      $SHELL \"$ac_srcdir/configure\" --help=recursive\n    else\n      $as_echo \"$as_me: WARNING: no configuration information is in $ac_dir\" >&2\n    fi || ac_status=$?\n    cd \"$ac_pwd\" || { ac_status=$?; break; }\n  done\nfi\n\ntest -n \"$ac_init_help\" && exit $ac_status\nif $ac_init_version; then\n  cat <<\\_ACEOF\nconfigure\ngenerated by GNU Autoconf 2.68\n\nCopyright (C) 2010 Free Software Foundation, Inc.\nThis configure script is free software; the Free Software Foundation\ngives unlimited permission to copy, distribute and modify it.\n_ACEOF\n  exit\nfi\n\n## ------------------------ ##\n## Autoconf initialization. ##\n## ------------------------ ##\n\n# ac_fn_cxx_try_compile LINENO\n# ----------------------------\n# Try to compile conftest.$ac_ext, and return whether this succeeded.\nac_fn_cxx_try_compile ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  rm -f conftest.$ac_objext\n  if { { ac_try=\"$ac_compile\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compile\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && {\n\t test -z \"$ac_cxx_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest.$ac_objext; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\tac_retval=1\nfi\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n  as_fn_set_status $ac_retval\n\n} # ac_fn_cxx_try_compile\n\n# ac_fn_cxx_try_cpp LINENO\n# ------------------------\n# Try to preprocess conftest.$ac_ext, and return whether this succeeded.\nac_fn_cxx_try_cpp ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  if { { ac_try=\"$ac_cpp conftest.$ac_ext\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_cpp conftest.$ac_ext\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } > conftest.i && {\n\t test -z \"$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag\" ||\n\t test ! -s conftest.err\n       }; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n    ac_retval=1\nfi\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n  as_fn_set_status $ac_retval\n\n} # ac_fn_cxx_try_cpp\n\n# ac_fn_c_try_compile LINENO\n# --------------------------\n# Try to compile conftest.$ac_ext, and return whether this succeeded.\nac_fn_c_try_compile ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  rm -f conftest.$ac_objext\n  if { { ac_try=\"$ac_compile\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compile\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && {\n\t test -z \"$ac_c_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest.$ac_objext; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\tac_retval=1\nfi\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n  as_fn_set_status $ac_retval\n\n} # ac_fn_c_try_compile\n\n# ac_fn_c_try_link LINENO\n# -----------------------\n# Try to link conftest.$ac_ext, and return whether this succeeded.\nac_fn_c_try_link ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  rm -f conftest.$ac_objext conftest$ac_exeext\n  if { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && {\n\t test -z \"$ac_c_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest$ac_exeext && {\n\t test \"$cross_compiling\" = yes ||\n\t $as_test_x conftest$ac_exeext\n       }; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\tac_retval=1\nfi\n  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information\n  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would\n  # interfere with the next link command; also delete a directory that is\n  # left behind by Apple's compiler.  We do this before executing the actions.\n  rm -rf conftest.dSYM conftest_ipa8_conftest.oo\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n  as_fn_set_status $ac_retval\n\n} # ac_fn_c_try_link\n\n# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES\n# -------------------------------------------------------\n# Tests whether HEADER exists and can be compiled using the include files in\n# INCLUDES, setting the cache variable VAR accordingly.\nac_fn_c_check_header_compile ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif eval \\${$3+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\n#include <$2>\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  eval \"$3=yes\"\nelse\n  eval \"$3=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n\n} # ac_fn_c_check_header_compile\n\n# ac_fn_c_try_cpp LINENO\n# ----------------------\n# Try to preprocess conftest.$ac_ext, and return whether this succeeded.\nac_fn_c_try_cpp ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  if { { ac_try=\"$ac_cpp conftest.$ac_ext\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_cpp conftest.$ac_ext\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } > conftest.i && {\n\t test -z \"$ac_c_preproc_warn_flag$ac_c_werror_flag\" ||\n\t test ! -s conftest.err\n       }; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n    ac_retval=1\nfi\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n  as_fn_set_status $ac_retval\n\n} # ac_fn_c_try_cpp\n\n# ac_fn_c_try_run LINENO\n# ----------------------\n# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes\n# that executables *can* be run.\nac_fn_c_try_run ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  if { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'\n  { { case \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_try\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; }; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: program exited with status $ac_status\" >&5\n       $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n       ac_retval=$ac_status\nfi\n  rm -rf conftest.dSYM conftest_ipa8_conftest.oo\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n  as_fn_set_status $ac_retval\n\n} # ac_fn_c_try_run\n\n# ac_fn_c_check_func LINENO FUNC VAR\n# ----------------------------------\n# Tests whether FUNC exists, setting the cache variable VAR accordingly\nac_fn_c_check_func ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif eval \\${$3+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n/* Define $2 to an innocuous variant, in case <limits.h> declares $2.\n   For example, HP-UX 11i <limits.h> declares gettimeofday.  */\n#define $2 innocuous_$2\n\n/* System header to define __stub macros and hopefully few prototypes,\n    which can conflict with char $2 (); below.\n    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n    <limits.h> exists even on freestanding compilers.  */\n\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n\n#undef $2\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar $2 ();\n/* The GNU C library defines this for functions which it implements\n    to always fail with ENOSYS.  Some functions are actually named\n    something starting with __ and the normal name is an alias.  */\n#if defined __stub_$2 || defined __stub___$2\nchoke me\n#endif\n\nint\nmain ()\n{\nreturn $2 ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  eval \"$3=yes\"\nelse\n  eval \"$3=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n\n} # ac_fn_c_check_func\n\n# ac_fn_cxx_try_link LINENO\n# -------------------------\n# Try to link conftest.$ac_ext, and return whether this succeeded.\nac_fn_cxx_try_link ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  rm -f conftest.$ac_objext conftest$ac_exeext\n  if { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && {\n\t test -z \"$ac_cxx_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest$ac_exeext && {\n\t test \"$cross_compiling\" = yes ||\n\t $as_test_x conftest$ac_exeext\n       }; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\tac_retval=1\nfi\n  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information\n  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would\n  # interfere with the next link command; also delete a directory that is\n  # left behind by Apple's compiler.  We do this before executing the actions.\n  rm -rf conftest.dSYM conftest_ipa8_conftest.oo\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n  as_fn_set_status $ac_retval\n\n} # ac_fn_cxx_try_link\n\n# ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES\n# ---------------------------------------------------------\n# Tests whether HEADER exists, giving a warning if it cannot be compiled using\n# the include files in INCLUDES and setting the cache variable VAR\n# accordingly.\nac_fn_cxx_check_header_mongrel ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  if eval \\${$3+:} false; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif eval \\${$3+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nelse\n  # Is the header compilable?\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking $2 usability\" >&5\n$as_echo_n \"checking $2 usability... \" >&6; }\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\n#include <$2>\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  ac_header_compiler=yes\nelse\n  ac_header_compiler=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler\" >&5\n$as_echo \"$ac_header_compiler\" >&6; }\n\n# Is the header present?\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking $2 presence\" >&5\n$as_echo_n \"checking $2 presence... \" >&6; }\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <$2>\n_ACEOF\nif ac_fn_cxx_try_cpp \"$LINENO\"; then :\n  ac_header_preproc=yes\nelse\n  ac_header_preproc=no\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc\" >&5\n$as_echo \"$ac_header_preproc\" >&6; }\n\n# So?  What about this header?\ncase $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #((\n  yes:no: )\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!\" >&5\n$as_echo \"$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result\" >&5\n$as_echo \"$as_me: WARNING: $2: proceeding with the compiler's result\" >&2;}\n    ;;\n  no:yes:* )\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled\" >&5\n$as_echo \"$as_me: WARNING: $2: present but cannot be compiled\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?\" >&5\n$as_echo \"$as_me: WARNING: $2:     check for missing prerequisite headers?\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation\" >&5\n$as_echo \"$as_me: WARNING: $2: see the Autoconf documentation\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \\\"Present But Cannot Be Compiled\\\"\" >&5\n$as_echo \"$as_me: WARNING: $2:     section \\\"Present But Cannot Be Compiled\\\"\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result\" >&5\n$as_echo \"$as_me: WARNING: $2: proceeding with the compiler's result\" >&2;}\n    ;;\nesac\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif eval \\${$3+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  eval \"$3=\\$ac_header_compiler\"\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nfi\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n\n} # ac_fn_cxx_check_header_mongrel\ncat >config.log <<_ACEOF\nThis file contains any messages produced by compilers while\nrunning configure, to aid debugging if configure makes a mistake.\n\nIt was created by $as_me, which was\ngenerated by GNU Autoconf 2.68.  Invocation command line was\n\n  $ $0 $@\n\n_ACEOF\nexec 5>>config.log\n{\ncat <<_ASUNAME\n## --------- ##\n## Platform. ##\n## --------- ##\n\nhostname = `(hostname || uname -n) 2>/dev/null | sed 1q`\nuname -m = `(uname -m) 2>/dev/null || echo unknown`\nuname -r = `(uname -r) 2>/dev/null || echo unknown`\nuname -s = `(uname -s) 2>/dev/null || echo unknown`\nuname -v = `(uname -v) 2>/dev/null || echo unknown`\n\n/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`\n/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`\n\n/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`\n/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`\n/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`\n/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`\n/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`\n/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`\n/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`\n\n_ASUNAME\n\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    $as_echo \"PATH: $as_dir\"\n  done\nIFS=$as_save_IFS\n\n} >&5\n\ncat >&5 <<_ACEOF\n\n\n## ----------- ##\n## Core tests. ##\n## ----------- ##\n\n_ACEOF\n\n\n# Keep a trace of the command line.\n# Strip out --no-create and --no-recursion so they do not pile up.\n# Strip out --silent because we don't want to record it for future runs.\n# Also quote any args containing shell meta-characters.\n# Make two passes to allow for proper duplicate-argument suppression.\nac_configure_args=\nac_configure_args0=\nac_configure_args1=\nac_must_keep_next=false\nfor ac_pass in 1 2\ndo\n  for ac_arg\n  do\n    case $ac_arg in\n    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;\n    -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n    | -silent | --silent | --silen | --sile | --sil)\n      continue ;;\n    *\\'*)\n      ac_arg=`$as_echo \"$ac_arg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    esac\n    case $ac_pass in\n    1) as_fn_append ac_configure_args0 \" '$ac_arg'\" ;;\n    2)\n      as_fn_append ac_configure_args1 \" '$ac_arg'\"\n      if test $ac_must_keep_next = true; then\n\tac_must_keep_next=false # Got value, back to normal.\n      else\n\tcase $ac_arg in\n\t  *=* | --config-cache | -C | -disable-* | --disable-* \\\n\t  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \\\n\t  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \\\n\t  | -with-* | --with-* | -without-* | --without-* | --x)\n\t    case \"$ac_configure_args0 \" in\n\t      \"$ac_configure_args1\"*\" '$ac_arg' \"* ) continue ;;\n\t    esac\n\t    ;;\n\t  -* ) ac_must_keep_next=true ;;\n\tesac\n      fi\n      as_fn_append ac_configure_args \" '$ac_arg'\"\n      ;;\n    esac\n  done\ndone\n{ ac_configure_args0=; unset ac_configure_args0;}\n{ ac_configure_args1=; unset ac_configure_args1;}\n\n# When interrupted or exit'd, cleanup temporary files, and complete\n# config.log.  We remove comments because anyway the quotes in there\n# would cause problems or look ugly.\n# WARNING: Use '\\'' to represent an apostrophe within the trap.\n# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.\ntrap 'exit_status=$?\n  # Save into config.log some information that might help in debugging.\n  {\n    echo\n\n    $as_echo \"## ---------------- ##\n## Cache variables. ##\n## ---------------- ##\"\n    echo\n    # The following way of writing the cache mishandles newlines in values,\n(\n  for ac_var in `(set) 2>&1 | sed -n '\\''s/^\\([a-zA-Z_][a-zA-Z0-9_]*\\)=.*/\\1/p'\\''`; do\n    eval ac_val=\\$$ac_var\n    case $ac_val in #(\n    *${as_nl}*)\n      case $ac_var in #(\n      *_cv_*) { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline\" >&5\n$as_echo \"$as_me: WARNING: cache variable $ac_var contains a newline\" >&2;} ;;\n      esac\n      case $ac_var in #(\n      _ | IFS | as_nl) ;; #(\n      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(\n      *) { eval $ac_var=; unset $ac_var;} ;;\n      esac ;;\n    esac\n  done\n  (set) 2>&1 |\n    case $as_nl`(ac_space='\\'' '\\''; set) 2>&1` in #(\n    *${as_nl}ac_space=\\ *)\n      sed -n \\\n\t\"s/'\\''/'\\''\\\\\\\\'\\'''\\''/g;\n\t  s/^\\\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\\\)=\\\\(.*\\\\)/\\\\1='\\''\\\\2'\\''/p\"\n      ;; #(\n    *)\n      sed -n \"/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p\"\n      ;;\n    esac |\n    sort\n)\n    echo\n\n    $as_echo \"## ----------------- ##\n## Output variables. ##\n## ----------------- ##\"\n    echo\n    for ac_var in $ac_subst_vars\n    do\n      eval ac_val=\\$$ac_var\n      case $ac_val in\n      *\\'\\''*) ac_val=`$as_echo \"$ac_val\" | sed \"s/'\\''/'\\''\\\\\\\\\\\\\\\\'\\'''\\''/g\"`;;\n      esac\n      $as_echo \"$ac_var='\\''$ac_val'\\''\"\n    done | sort\n    echo\n\n    if test -n \"$ac_subst_files\"; then\n      $as_echo \"## ------------------- ##\n## File substitutions. ##\n## ------------------- ##\"\n      echo\n      for ac_var in $ac_subst_files\n      do\n\teval ac_val=\\$$ac_var\n\tcase $ac_val in\n\t*\\'\\''*) ac_val=`$as_echo \"$ac_val\" | sed \"s/'\\''/'\\''\\\\\\\\\\\\\\\\'\\'''\\''/g\"`;;\n\tesac\n\t$as_echo \"$ac_var='\\''$ac_val'\\''\"\n      done | sort\n      echo\n    fi\n\n    if test -s confdefs.h; then\n      $as_echo \"## ----------- ##\n## confdefs.h. ##\n## ----------- ##\"\n      echo\n      cat confdefs.h\n      echo\n    fi\n    test \"$ac_signal\" != 0 &&\n      $as_echo \"$as_me: caught signal $ac_signal\"\n    $as_echo \"$as_me: exit $exit_status\"\n  } >&5\n  rm -f core *.core core.conftest.* &&\n    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&\n    exit $exit_status\n' 0\nfor ac_signal in 1 2 13 15; do\n  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal\ndone\nac_signal=0\n\n# confdefs.h avoids OS command line length limits that DEFS can exceed.\nrm -f -r conftest* confdefs.h\n\n$as_echo \"/* confdefs.h */\" > confdefs.h\n\n# Predefined preprocessor variables.\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_NAME \"$PACKAGE_NAME\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_VERSION \"$PACKAGE_VERSION\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_STRING \"$PACKAGE_STRING\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_URL \"$PACKAGE_URL\"\n_ACEOF\n\n\n# Let the site file select an alternate cache file if it wants to.\n# Prefer an explicitly selected file to automatically selected ones.\nac_site_file1=NONE\nac_site_file2=NONE\nif test -n \"$CONFIG_SITE\"; then\n  # We do not want a PATH search for config.site.\n  case $CONFIG_SITE in #((\n    -*)  ac_site_file1=./$CONFIG_SITE;;\n    */*) ac_site_file1=$CONFIG_SITE;;\n    *)   ac_site_file1=./$CONFIG_SITE;;\n  esac\nelif test \"x$prefix\" != xNONE; then\n  ac_site_file1=$prefix/share/config.site\n  ac_site_file2=$prefix/etc/config.site\nelse\n  ac_site_file1=$ac_default_prefix/share/config.site\n  ac_site_file2=$ac_default_prefix/etc/config.site\nfi\nfor ac_site_file in \"$ac_site_file1\" \"$ac_site_file2\"\ndo\n  test \"x$ac_site_file\" = xNONE && continue\n  if test /dev/null != \"$ac_site_file\" && test -r \"$ac_site_file\"; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file\" >&5\n$as_echo \"$as_me: loading site script $ac_site_file\" >&6;}\n    sed 's/^/| /' \"$ac_site_file\" >&5\n    . \"$ac_site_file\" \\\n      || { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"failed to load site script $ac_site_file\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\n  fi\ndone\n\n\n# Check that the precious variables saved in the cache have kept the same\n# value.\nac_cache_corrupted=false\nfor ac_var in $ac_precious_vars; do\n  eval ac_old_set=\\$ac_cv_env_${ac_var}_set\n  eval ac_new_set=\\$ac_env_${ac_var}_set\n  eval ac_old_val=\\$ac_cv_env_${ac_var}_value\n  eval ac_new_val=\\$ac_env_${ac_var}_value\n  case $ac_old_set,$ac_new_set in\n    set,)\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: error: \\`$ac_var' was set to \\`$ac_old_val' in the previous run\" >&5\n$as_echo \"$as_me: error: \\`$ac_var' was set to \\`$ac_old_val' in the previous run\" >&2;}\n      ac_cache_corrupted=: ;;\n    ,set)\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: error: \\`$ac_var' was not set in the previous run\" >&5\n$as_echo \"$as_me: error: \\`$ac_var' was not set in the previous run\" >&2;}\n      ac_cache_corrupted=: ;;\n    ,);;\n    *)\n      if test \"x$ac_old_val\" != \"x$ac_new_val\"; then\n\t# differences in whitespace do not lead to failure.\n\tac_old_val_w=`echo x $ac_old_val`\n\tac_new_val_w=`echo x $ac_new_val`\n\tif test \"$ac_old_val_w\" != \"$ac_new_val_w\"; then\n\t  { $as_echo \"$as_me:${as_lineno-$LINENO}: error: \\`$ac_var' has changed since the previous run:\" >&5\n$as_echo \"$as_me: error: \\`$ac_var' has changed since the previous run:\" >&2;}\n\t  ac_cache_corrupted=:\n\telse\n\t  { $as_echo \"$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \\`$ac_var' since the previous run:\" >&5\n$as_echo \"$as_me: warning: ignoring whitespace changes in \\`$ac_var' since the previous run:\" >&2;}\n\t  eval $ac_var=\\$ac_old_val\n\tfi\n\t{ $as_echo \"$as_me:${as_lineno-$LINENO}:   former value:  \\`$ac_old_val'\" >&5\n$as_echo \"$as_me:   former value:  \\`$ac_old_val'\" >&2;}\n\t{ $as_echo \"$as_me:${as_lineno-$LINENO}:   current value: \\`$ac_new_val'\" >&5\n$as_echo \"$as_me:   current value: \\`$ac_new_val'\" >&2;}\n      fi;;\n  esac\n  # Pass precious variables to config.status.\n  if test \"$ac_new_set\" = set; then\n    case $ac_new_val in\n    *\\'*) ac_arg=$ac_var=`$as_echo \"$ac_new_val\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    *) ac_arg=$ac_var=$ac_new_val ;;\n    esac\n    case \" $ac_configure_args \" in\n      *\" '$ac_arg' \"*) ;; # Avoid dups.  Use of quotes ensures accuracy.\n      *) as_fn_append ac_configure_args \" '$ac_arg'\" ;;\n    esac\n  fi\ndone\nif $ac_cache_corrupted; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build\" >&5\n$as_echo \"$as_me: error: changes in the environment can compromise the build\" >&2;}\n  as_fn_error $? \"run \\`make distclean' and/or \\`rm $cache_file' and start over\" \"$LINENO\" 5\nfi\n## -------------------- ##\n## Main body of script. ##\n## -------------------- ##\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n\nac_config_headers=\"$ac_config_headers config.h\"\n\n\ntest \"$program_prefix\" != NONE &&\n  program_transform_name=\"s&^&$program_prefix&;$program_transform_name\"\n# Use a double $ so make ignores it.\ntest \"$program_suffix\" != NONE &&\n  program_transform_name=\"s&\\$&$program_suffix&;$program_transform_name\"\n# Double any \\ or $.\n# By default was `s,x,x', remove it if useless.\nac_script='s/[\\\\$]/&&/g;s/;s,x,x,$//'\nprogram_transform_name=`$as_echo \"$program_transform_name\" | sed \"$ac_script\"`\n\n\nPACKAGE=\"gmm\"\nMAJOR_VERSION=\"4\"\nMINOR_VERSION=\"2\"\nVERSION=$MAJOR_VERSION.$MINOR_VERSION\necho \"configuring $PACKAGE $VERSION...\"\n\n\nam__api_version='1.11'\n\nac_aux_dir=\nfor ac_dir in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"; do\n  if test -f \"$ac_dir/install-sh\"; then\n    ac_aux_dir=$ac_dir\n    ac_install_sh=\"$ac_aux_dir/install-sh -c\"\n    break\n  elif test -f \"$ac_dir/install.sh\"; then\n    ac_aux_dir=$ac_dir\n    ac_install_sh=\"$ac_aux_dir/install.sh -c\"\n    break\n  elif test -f \"$ac_dir/shtool\"; then\n    ac_aux_dir=$ac_dir\n    ac_install_sh=\"$ac_aux_dir/shtool install -c\"\n    break\n  fi\ndone\nif test -z \"$ac_aux_dir\"; then\n  as_fn_error $? \"cannot find install-sh, install.sh, or shtool in \\\"$srcdir\\\" \\\"$srcdir/..\\\" \\\"$srcdir/../..\\\"\" \"$LINENO\" 5\nfi\n\n# These three variables are undocumented and unsupported,\n# and are intended to be withdrawn in a future Autoconf release.\n# They can cause serious problems if a builder's source tree is in a directory\n# whose full name contains unusual characters.\nac_config_guess=\"$SHELL $ac_aux_dir/config.guess\"  # Please don't use this var.\nac_config_sub=\"$SHELL $ac_aux_dir/config.sub\"  # Please don't use this var.\nac_configure=\"$SHELL $ac_aux_dir/configure\"  # Please don't use this var.\n\n\n# Find a good install program.  We prefer a C program (faster),\n# so one script is as good as another.  But avoid the broken or\n# incompatible versions:\n# SysV /etc/install, /usr/sbin/install\n# SunOS /usr/etc/install\n# IRIX /sbin/install\n# AIX /bin/install\n# AmigaOS /C/install, which installs bootblocks on floppy discs\n# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag\n# AFS /usr/afsws/bin/install, which mishandles nonexistent args\n# SVR4 /usr/ucb/install, which tries to use the nonexistent group \"staff\"\n# OS/2's system install, which has a completely different semantic\n# ./install, which can be erroneously created by make from ./install.sh.\n# Reject install programs that cannot install multiple files.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install\" >&5\n$as_echo_n \"checking for a BSD-compatible install... \" >&6; }\nif test -z \"$INSTALL\"; then\nif ${ac_cv_path_install+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    # Account for people who put trailing slashes in PATH elements.\ncase $as_dir/ in #((\n  ./ | .// | /[cC]/* | \\\n  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \\\n  ?:[\\\\/]os2[\\\\/]install[\\\\/]* | ?:[\\\\/]OS2[\\\\/]INSTALL[\\\\/]* | \\\n  /usr/ucb/* ) ;;\n  *)\n    # OSF1 and SCO ODT 3.0 have their own names for install.\n    # Don't use installbsd from OSF since it installs stuff as root\n    # by default.\n    for ac_prog in ginstall scoinst install; do\n      for ac_exec_ext in '' $ac_executable_extensions; do\n\tif { test -f \"$as_dir/$ac_prog$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_prog$ac_exec_ext\"; }; then\n\t  if test $ac_prog = install &&\n\t    grep dspmsg \"$as_dir/$ac_prog$ac_exec_ext\" >/dev/null 2>&1; then\n\t    # AIX install.  It has an incompatible calling convention.\n\t    :\n\t  elif test $ac_prog = install &&\n\t    grep pwplus \"$as_dir/$ac_prog$ac_exec_ext\" >/dev/null 2>&1; then\n\t    # program-specific install script used by HP pwplus--don't use.\n\t    :\n\t  else\n\t    rm -rf conftest.one conftest.two conftest.dir\n\t    echo one > conftest.one\n\t    echo two > conftest.two\n\t    mkdir conftest.dir\n\t    if \"$as_dir/$ac_prog$ac_exec_ext\" -c conftest.one conftest.two \"`pwd`/conftest.dir\" &&\n\t      test -s conftest.one && test -s conftest.two &&\n\t      test -s conftest.dir/conftest.one &&\n\t      test -s conftest.dir/conftest.two\n\t    then\n\t      ac_cv_path_install=\"$as_dir/$ac_prog$ac_exec_ext -c\"\n\t      break 3\n\t    fi\n\t  fi\n\tfi\n      done\n    done\n    ;;\nesac\n\n  done\nIFS=$as_save_IFS\n\nrm -rf conftest.one conftest.two conftest.dir\n\nfi\n  if test \"${ac_cv_path_install+set}\" = set; then\n    INSTALL=$ac_cv_path_install\n  else\n    # As a last resort, use the slow shell script.  Don't cache a\n    # value for INSTALL within a source directory, because that will\n    # break other packages using the cache if that directory is\n    # removed, or if the value is a relative name.\n    INSTALL=$ac_install_sh\n  fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $INSTALL\" >&5\n$as_echo \"$INSTALL\" >&6; }\n\n# Use test -z because SunOS4 sh mishandles braces in ${var-val}.\n# It thinks the first close brace ends the variable substitution.\ntest -z \"$INSTALL_PROGRAM\" && INSTALL_PROGRAM='${INSTALL}'\n\ntest -z \"$INSTALL_SCRIPT\" && INSTALL_SCRIPT='${INSTALL}'\n\ntest -z \"$INSTALL_DATA\" && INSTALL_DATA='${INSTALL} -m 644'\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether build environment is sane\" >&5\n$as_echo_n \"checking whether build environment is sane... \" >&6; }\n# Just in case\nsleep 1\necho timestamp > conftest.file\n# Reject unsafe characters in $srcdir or the absolute working directory\n# name.  Accept space and tab only in the latter.\nam_lf='\n'\ncase `pwd` in\n  *[\\\\\\\"\\#\\$\\&\\'\\`$am_lf]*)\n    as_fn_error $? \"unsafe absolute working directory name\" \"$LINENO\" 5;;\nesac\ncase $srcdir in\n  *[\\\\\\\"\\#\\$\\&\\'\\`$am_lf\\ \\\t]*)\n    as_fn_error $? \"unsafe srcdir value: \\`$srcdir'\" \"$LINENO\" 5;;\nesac\n\n# Do `set' in a subshell so we don't clobber the current shell's\n# arguments.  Must try -L first in case configure is actually a\n# symlink; some systems play weird games with the mod time of symlinks\n# (eg FreeBSD returns the mod time of the symlink's containing\n# directory).\nif (\n   set X `ls -Lt \"$srcdir/configure\" conftest.file 2> /dev/null`\n   if test \"$*\" = \"X\"; then\n      # -L didn't work.\n      set X `ls -t \"$srcdir/configure\" conftest.file`\n   fi\n   rm -f conftest.file\n   if test \"$*\" != \"X $srcdir/configure conftest.file\" \\\n      && test \"$*\" != \"X conftest.file $srcdir/configure\"; then\n\n      # If neither matched, then we have a broken ls.  This can happen\n      # if, for instance, CONFIG_SHELL is bash and it inherits a\n      # broken ls alias from the environment.  This has actually\n      # happened.  Such a system could not be considered \"sane\".\n      as_fn_error $? \"ls -t appears to fail.  Make sure there is not a broken\nalias in your environment\" \"$LINENO\" 5\n   fi\n\n   test \"$2\" = conftest.file\n   )\nthen\n   # Ok.\n   :\nelse\n   as_fn_error $? \"newly created file is older than distributed files!\nCheck your system clock\" \"$LINENO\" 5\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n# expand $ac_aux_dir to an absolute path\nam_aux_dir=`cd $ac_aux_dir && pwd`\n\nif test x\"${MISSING+set}\" != xset; then\n  case $am_aux_dir in\n  *\\ * | *\\\t*)\n    MISSING=\"\\${SHELL} \\\"$am_aux_dir/missing\\\"\" ;;\n  *)\n    MISSING=\"\\${SHELL} $am_aux_dir/missing\" ;;\n  esac\nfi\n# Use eval to expand $SHELL\nif eval \"$MISSING --run true\"; then\n  am_missing_run=\"$MISSING --run \"\nelse\n  am_missing_run=\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: \\`missing' script is too old or missing\" >&5\n$as_echo \"$as_me: WARNING: \\`missing' script is too old or missing\" >&2;}\nfi\n\nif test x\"${install_sh}\" != xset; then\n  case $am_aux_dir in\n  *\\ * | *\\\t*)\n    install_sh=\"\\${SHELL} '$am_aux_dir/install-sh'\" ;;\n  *)\n    install_sh=\"\\${SHELL} $am_aux_dir/install-sh\"\n  esac\nfi\n\n# Installed binaries are usually stripped using `strip' when the user\n# run `make install-strip'.  However `strip' might not be the right\n# tool to use in cross-compilation environments, therefore Automake\n# will honor the `STRIP' environment variable to overrule this program.\nif test \"$cross_compiling\" != no; then\n  if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}strip\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}strip; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_STRIP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$STRIP\"; then\n  ac_cv_prog_STRIP=\"$STRIP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_STRIP=\"${ac_tool_prefix}strip\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nSTRIP=$ac_cv_prog_STRIP\nif test -n \"$STRIP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $STRIP\" >&5\n$as_echo \"$STRIP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_STRIP\"; then\n  ac_ct_STRIP=$STRIP\n  # Extract the first word of \"strip\", so it can be a program name with args.\nset dummy strip; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_STRIP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_STRIP\"; then\n  ac_cv_prog_ac_ct_STRIP=\"$ac_ct_STRIP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_STRIP=\"strip\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP\nif test -n \"$ac_ct_STRIP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP\" >&5\n$as_echo \"$ac_ct_STRIP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_STRIP\" = x; then\n    STRIP=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    STRIP=$ac_ct_STRIP\n  fi\nelse\n  STRIP=\"$ac_cv_prog_STRIP\"\nfi\n\nfi\nINSTALL_STRIP_PROGRAM=\"\\$(install_sh) -c -s\"\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p\" >&5\n$as_echo_n \"checking for a thread-safe mkdir -p... \" >&6; }\nif test -z \"$MKDIR_P\"; then\n  if ${ac_cv_path_mkdir+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_prog in mkdir gmkdir; do\n\t for ac_exec_ext in '' $ac_executable_extensions; do\n\t   { test -f \"$as_dir/$ac_prog$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_prog$ac_exec_ext\"; } || continue\n\t   case `\"$as_dir/$ac_prog$ac_exec_ext\" --version 2>&1` in #(\n\t     'mkdir (GNU coreutils) '* | \\\n\t     'mkdir (coreutils) '* | \\\n\t     'mkdir (fileutils) '4.1*)\n\t       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext\n\t       break 3;;\n\t   esac\n\t done\n       done\n  done\nIFS=$as_save_IFS\n\nfi\n\n  test -d ./--version && rmdir ./--version\n  if test \"${ac_cv_path_mkdir+set}\" = set; then\n    MKDIR_P=\"$ac_cv_path_mkdir -p\"\n  else\n    # As a last resort, use the slow shell script.  Don't cache a\n    # value for MKDIR_P within a source directory, because that will\n    # break other packages using the cache if that directory is\n    # removed, or if the value is a relative name.\n    MKDIR_P=\"$ac_install_sh -d\"\n  fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $MKDIR_P\" >&5\n$as_echo \"$MKDIR_P\" >&6; }\n\nmkdir_p=\"$MKDIR_P\"\ncase $mkdir_p in\n  [\\\\/$]* | ?:[\\\\/]*) ;;\n  */*) mkdir_p=\"\\$(top_builddir)/$mkdir_p\" ;;\nesac\n\nfor ac_prog in gawk mawk nawk awk\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_AWK+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$AWK\"; then\n  ac_cv_prog_AWK=\"$AWK\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_AWK=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nAWK=$ac_cv_prog_AWK\nif test -n \"$AWK\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $AWK\" >&5\n$as_echo \"$AWK\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$AWK\" && break\ndone\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \\$(MAKE)\" >&5\n$as_echo_n \"checking whether ${MAKE-make} sets \\$(MAKE)... \" >&6; }\nset x ${MAKE-make}\nac_make=`$as_echo \"$2\" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`\nif eval \\${ac_cv_prog_make_${ac_make}_set+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat >conftest.make <<\\_ACEOF\nSHELL = /bin/sh\nall:\n\t@echo '@@@%%%=$(MAKE)=@@@%%%'\n_ACEOF\n# GNU make sometimes prints \"make[1]: Entering ...\", which would confuse us.\ncase `${MAKE-make} -f conftest.make 2>/dev/null` in\n  *@@@%%%=?*=@@@%%%*)\n    eval ac_cv_prog_make_${ac_make}_set=yes;;\n  *)\n    eval ac_cv_prog_make_${ac_make}_set=no;;\nesac\nrm -f conftest.make\nfi\nif eval test \\$ac_cv_prog_make_${ac_make}_set = yes; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n  SET_MAKE=\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n  SET_MAKE=\"MAKE=${MAKE-make}\"\nfi\n\nrm -rf .tst 2>/dev/null\nmkdir .tst 2>/dev/null\nif test -d .tst; then\n  am__leading_dot=.\nelse\n  am__leading_dot=_\nfi\nrmdir .tst 2>/dev/null\n\nif test \"`cd $srcdir && pwd`\" != \"`pwd`\"; then\n  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output\n  # is not polluted with repeated \"-I.\"\n  am__isrc=' -I$(srcdir)'\n  # test to see if srcdir already configured\n  if test -f $srcdir/config.status; then\n    as_fn_error $? \"source directory already configured; run \\\"make distclean\\\" there first\" \"$LINENO\" 5\n  fi\nfi\n\n# test whether we have cygpath\nif test -z \"$CYGPATH_W\"; then\n  if (cygpath --version) >/dev/null 2>/dev/null; then\n    CYGPATH_W='cygpath -w'\n  else\n    CYGPATH_W=echo\n  fi\nfi\n\n\n# Define the identity of the package.\n PACKAGE=$PACKAGE\n VERSION=$VERSION\n\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE \"$PACKAGE\"\n_ACEOF\n\n\ncat >>confdefs.h <<_ACEOF\n#define VERSION \"$VERSION\"\n_ACEOF\n\n# Some tools Automake needs.\n\nACLOCAL=${ACLOCAL-\"${am_missing_run}aclocal-${am__api_version}\"}\n\n\nAUTOCONF=${AUTOCONF-\"${am_missing_run}autoconf\"}\n\n\nAUTOMAKE=${AUTOMAKE-\"${am_missing_run}automake-${am__api_version}\"}\n\n\nAUTOHEADER=${AUTOHEADER-\"${am_missing_run}autoheader\"}\n\n\nMAKEINFO=${MAKEINFO-\"${am_missing_run}makeinfo\"}\n\n# We need awk for the \"check\" target.  The system \"awk\" is bad on\n# some platforms.\n# Always define AMTAR for backward compatibility.  Yes, it's still used\n# in the wild :-(  We should find a proper way to deprecate it ...\nAMTAR='$${TAR-tar}'\n\nam__tar='$${TAR-tar} chof - \"$$tardir\"' am__untar='$${TAR-tar} xf -'\n\n\n\n\n\n\n\nUSER_CXXFLAGS=\"$CXXFLAGS\"\nac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\nif test -z \"$CXX\"; then\n  if test -n \"$CCC\"; then\n    CXX=$CCC\n  else\n    if test -n \"$ac_tool_prefix\"; then\n  for ac_prog in cxx KCC CC cc++ xlC aCC g++ c++ icc\n  do\n    # Extract the first word of \"$ac_tool_prefix$ac_prog\", so it can be a program name with args.\nset dummy $ac_tool_prefix$ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CXX+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CXX\"; then\n  ac_cv_prog_CXX=\"$CXX\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_CXX=\"$ac_tool_prefix$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCXX=$ac_cv_prog_CXX\nif test -n \"$CXX\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CXX\" >&5\n$as_echo \"$CXX\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n    test -n \"$CXX\" && break\n  done\nfi\nif test -z \"$CXX\"; then\n  ac_ct_CXX=$CXX\n  for ac_prog in cxx KCC CC cc++ xlC aCC g++ c++ icc\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_CXX+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_CXX\"; then\n  ac_cv_prog_ac_ct_CXX=\"$ac_ct_CXX\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_CXX=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_CXX=$ac_cv_prog_ac_ct_CXX\nif test -n \"$ac_ct_CXX\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX\" >&5\n$as_echo \"$ac_ct_CXX\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$ac_ct_CXX\" && break\ndone\n\n  if test \"x$ac_ct_CXX\" = x; then\n    CXX=\"g++\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    CXX=$ac_ct_CXX\n  fi\nfi\n\n  fi\nfi\n# Provide some information about the compiler.\n$as_echo \"$as_me:${as_lineno-$LINENO}: checking for C++ compiler version\" >&5\nset X $ac_compile\nac_compiler=$2\nfor ac_option in --version -v -V -qversion; do\n  { { ac_try=\"$ac_compiler $ac_option >&5\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compiler $ac_option >&5\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    sed '10a\\\n... rest of stderr output deleted ...\n         10q' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n  fi\n  rm -f conftest.er1 conftest.err\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\ndone\n\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nac_clean_files_save=$ac_clean_files\nac_clean_files=\"$ac_clean_files a.out a.out.dSYM a.exe b.out\"\n# Try to create an executable without -o first, disregard a.out.\n# It will help us diagnose broken compilers, and finding out an intuition\n# of exeext.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works\" >&5\n$as_echo_n \"checking whether the C++ compiler works... \" >&6; }\nac_link_default=`$as_echo \"$ac_link\" | sed 's/ -o *conftest[^ ]*//'`\n\n# The possible output files:\nac_files=\"a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*\"\n\nac_rmfiles=\nfor ac_file in $ac_files\ndo\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;\n    * ) ac_rmfiles=\"$ac_rmfiles $ac_file\";;\n  esac\ndone\nrm -f $ac_rmfiles\n\nif { { ac_try=\"$ac_link_default\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link_default\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then :\n  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.\n# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'\n# in a Makefile.  We should not override ac_cv_exeext if it was cached,\n# so that the user can short-circuit this test for compilers unknown to\n# Autoconf.\nfor ac_file in $ac_files ''\ndo\n  test -f \"$ac_file\" || continue\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )\n\t;;\n    [ab].out )\n\t# We found the default executable, but exeext='' is most\n\t# certainly right.\n\tbreak;;\n    *.* )\n\tif test \"${ac_cv_exeext+set}\" = set && test \"$ac_cv_exeext\" != no;\n\tthen :; else\n\t   ac_cv_exeext=`expr \"$ac_file\" : '[^.]*\\(\\..*\\)'`\n\tfi\n\t# We set ac_cv_exeext here because the later test for it is not\n\t# safe: cross compilers may not add the suffix if given an `-o'\n\t# argument, so we may need to know it at that point already.\n\t# Even if this section looks crufty: it has the advantage of\n\t# actually working.\n\tbreak;;\n    * )\n\tbreak;;\n  esac\ndone\ntest \"$ac_cv_exeext\" = no && ac_cv_exeext=\n\nelse\n  ac_file=''\nfi\nif test -z \"$ac_file\"; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n$as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n{ { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error 77 \"C++ compiler cannot create executables\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name\" >&5\n$as_echo_n \"checking for C++ compiler default output file name... \" >&6; }\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_file\" >&5\n$as_echo \"$ac_file\" >&6; }\nac_exeext=$ac_cv_exeext\n\nrm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out\nac_clean_files=$ac_clean_files_save\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for suffix of executables\" >&5\n$as_echo_n \"checking for suffix of executables... \" >&6; }\nif { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then :\n  # If both `conftest.exe' and `conftest' are `present' (well, observable)\n# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will\n# work properly (i.e., refer to `conftest.exe'), while it won't with\n# `rm'.\nfor ac_file in conftest.exe conftest conftest.*; do\n  test -f \"$ac_file\" || continue\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;\n    *.* ) ac_cv_exeext=`expr \"$ac_file\" : '[^.]*\\(\\..*\\)'`\n\t  break;;\n    * ) break;;\n  esac\ndone\nelse\n  { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"cannot compute suffix of executables: cannot compile and link\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\nfi\nrm -f conftest conftest$ac_cv_exeext\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext\" >&5\n$as_echo \"$ac_cv_exeext\" >&6; }\n\nrm -f conftest.$ac_ext\nEXEEXT=$ac_cv_exeext\nac_exeext=$EXEEXT\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nFILE *f = fopen (\"conftest.out\", \"w\");\n return ferror (f) || fclose (f) != 0;\n\n  ;\n  return 0;\n}\n_ACEOF\nac_clean_files=\"$ac_clean_files conftest.out\"\n# Check that the compiler produces executables we can run.  If not, either\n# the compiler is broken, or we cross compile.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling\" >&5\n$as_echo_n \"checking whether we are cross compiling... \" >&6; }\nif test \"$cross_compiling\" != yes; then\n  { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\n  if { ac_try='./conftest$ac_cv_exeext'\n  { { case \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_try\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; }; then\n    cross_compiling=no\n  else\n    if test \"$cross_compiling\" = maybe; then\n\tcross_compiling=yes\n    else\n\t{ { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"cannot run C++ compiled programs.\nIf you meant to cross compile, use \\`--host'.\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\n    fi\n  fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $cross_compiling\" >&5\n$as_echo \"$cross_compiling\" >&6; }\n\nrm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out\nac_clean_files=$ac_clean_files_save\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for suffix of object files\" >&5\n$as_echo_n \"checking for suffix of object files... \" >&6; }\nif ${ac_cv_objext+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.o conftest.obj\nif { { ac_try=\"$ac_compile\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compile\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then :\n  for ac_file in conftest.o conftest.obj conftest.*; do\n  test -f \"$ac_file\" || continue;\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;\n    *) ac_cv_objext=`expr \"$ac_file\" : '.*\\.\\(.*\\)'`\n       break;;\n  esac\ndone\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n{ { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"cannot compute suffix of object files: cannot compile\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\nfi\nrm -f conftest.$ac_cv_objext conftest.$ac_ext\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext\" >&5\n$as_echo \"$ac_cv_objext\" >&6; }\nOBJEXT=$ac_cv_objext\nac_objext=$OBJEXT\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler\" >&5\n$as_echo_n \"checking whether we are using the GNU C++ compiler... \" >&6; }\nif ${ac_cv_cxx_compiler_gnu+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n#ifndef __GNUC__\n       choke me\n#endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  ac_compiler_gnu=yes\nelse\n  ac_compiler_gnu=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nac_cv_cxx_compiler_gnu=$ac_compiler_gnu\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu\" >&5\n$as_echo \"$ac_cv_cxx_compiler_gnu\" >&6; }\nif test $ac_compiler_gnu = yes; then\n  GXX=yes\nelse\n  GXX=\nfi\nac_test_CXXFLAGS=${CXXFLAGS+set}\nac_save_CXXFLAGS=$CXXFLAGS\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g\" >&5\n$as_echo_n \"checking whether $CXX accepts -g... \" >&6; }\nif ${ac_cv_prog_cxx_g+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_save_cxx_werror_flag=$ac_cxx_werror_flag\n   ac_cxx_werror_flag=yes\n   ac_cv_prog_cxx_g=no\n   CXXFLAGS=\"-g\"\n   cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cxx_g=yes\nelse\n  CXXFLAGS=\"\"\n      cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n\nelse\n  ac_cxx_werror_flag=$ac_save_cxx_werror_flag\n\t CXXFLAGS=\"-g\"\n\t cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cxx_g=yes\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n   ac_cxx_werror_flag=$ac_save_cxx_werror_flag\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g\" >&5\n$as_echo \"$ac_cv_prog_cxx_g\" >&6; }\nif test \"$ac_test_CXXFLAGS\" = set; then\n  CXXFLAGS=$ac_save_CXXFLAGS\nelif test $ac_cv_prog_cxx_g = yes; then\n  if test \"$GXX\" = yes; then\n    CXXFLAGS=\"-g -O2\"\n  else\n    CXXFLAGS=\"-g\"\n  fi\nelse\n  if test \"$GXX\" = yes; then\n    CXXFLAGS=\"-O2\"\n  else\n    CXXFLAGS=\n  fi\nfi\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\nDEPDIR=\"${am__leading_dot}deps\"\n\nac_config_commands=\"$ac_config_commands depfiles\"\n\n\nam_make=${MAKE-make}\ncat > confinc << 'END'\nam__doit:\n\t@echo this is the am__doit target\n.PHONY: am__doit\nEND\n# If we don't find an include directive, just comment out the code.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make\" >&5\n$as_echo_n \"checking for style of include used by $am_make... \" >&6; }\nam__include=\"#\"\nam__quote=\n_am_result=none\n# First try GNU make style include.\necho \"include confinc\" > confmf\n# Ignore all kinds of additional output from `make'.\ncase `$am_make -s -f confmf 2> /dev/null` in #(\n*the\\ am__doit\\ target*)\n  am__include=include\n  am__quote=\n  _am_result=GNU\n  ;;\nesac\n# Now try BSD make style include.\nif test \"$am__include\" = \"#\"; then\n   echo '.include \"confinc\"' > confmf\n   case `$am_make -s -f confmf 2> /dev/null` in #(\n   *the\\ am__doit\\ target*)\n     am__include=.include\n     am__quote=\"\\\"\"\n     _am_result=BSD\n     ;;\n   esac\nfi\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $_am_result\" >&5\n$as_echo \"$_am_result\" >&6; }\nrm -f confinc confmf\n\n# Check whether --enable-dependency-tracking was given.\nif test \"${enable_dependency_tracking+set}\" = set; then :\n  enableval=$enable_dependency_tracking;\nfi\n\nif test \"x$enable_dependency_tracking\" != xno; then\n  am_depcomp=\"$ac_aux_dir/depcomp\"\n  AMDEPBACKSLASH='\\'\n  am__nodep='_no'\nfi\n if test \"x$enable_dependency_tracking\" != xno; then\n  AMDEP_TRUE=\n  AMDEP_FALSE='#'\nelse\n  AMDEP_TRUE='#'\n  AMDEP_FALSE=\nfi\n\n\n\ndepcc=\"$CXX\"  am_compiler_list=\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc\" >&5\n$as_echo_n \"checking dependency style of $depcc... \" >&6; }\nif ${am_cv_CXX_dependencies_compiler_type+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -z \"$AMDEP_TRUE\" && test -f \"$am_depcomp\"; then\n  # We make a subdir and do the tests there.  Otherwise we can end up\n  # making bogus files that we don't know about and never remove.  For\n  # instance it was reported that on HP-UX the gcc test will end up\n  # making a dummy file named `D' -- because `-MD' means `put the output\n  # in D'.\n  rm -rf conftest.dir\n  mkdir conftest.dir\n  # Copy depcomp to subdir because otherwise we won't find it if we're\n  # using a relative directory.\n  cp \"$am_depcomp\" conftest.dir\n  cd conftest.dir\n  # We will build objects and dependencies in a subdirectory because\n  # it helps to detect inapplicable dependency modes.  For instance\n  # both Tru64's cc and ICC support -MD to output dependencies as a\n  # side effect of compilation, but ICC will put the dependencies in\n  # the current directory while Tru64 will put them in the object\n  # directory.\n  mkdir sub\n\n  am_cv_CXX_dependencies_compiler_type=none\n  if test \"$am_compiler_list\" = \"\"; then\n     am_compiler_list=`sed -n 's/^#*\\([a-zA-Z0-9]*\\))$/\\1/p' < ./depcomp`\n  fi\n  am__universal=false\n  case \" $depcc \" in #(\n     *\\ -arch\\ *\\ -arch\\ *) am__universal=true ;;\n     esac\n\n  for depmode in $am_compiler_list; do\n    # Setup a source with many dependencies, because some compilers\n    # like to wrap large dependency lists on column 80 (with \\), and\n    # we should not choose a depcomp mode which is confused by this.\n    #\n    # We need to recreate these files for each test, as the compiler may\n    # overwrite some of them when testing with obscure command lines.\n    # This happens at least with the AIX C compiler.\n    : > sub/conftest.c\n    for i in 1 2 3 4 5 6; do\n      echo '#include \"conftst'$i'.h\"' >> sub/conftest.c\n      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with\n      # Solaris 8's {/usr,}/bin/sh.\n      touch sub/conftst$i.h\n    done\n    echo \"${am__include} ${am__quote}sub/conftest.Po${am__quote}\" > confmf\n\n    # We check with `-c' and `-o' for the sake of the \"dashmstdout\"\n    # mode.  It turns out that the SunPro C++ compiler does not properly\n    # handle `-M -o', and we need to detect this.  Also, some Intel\n    # versions had trouble with output in subdirs\n    am__obj=sub/conftest.${OBJEXT-o}\n    am__minus_obj=\"-o $am__obj\"\n    case $depmode in\n    gcc)\n      # This depmode causes a compiler race in universal mode.\n      test \"$am__universal\" = false || continue\n      ;;\n    nosideeffect)\n      # after this tag, mechanisms are not by side-effect, so they'll\n      # only be used when explicitly requested\n      if test \"x$enable_dependency_tracking\" = xyes; then\n\tcontinue\n      else\n\tbreak\n      fi\n      ;;\n    msvc7 | msvc7msys | msvisualcpp | msvcmsys)\n      # This compiler won't grok `-c -o', but also, the minuso test has\n      # not run yet.  These depmodes are late enough in the game, and\n      # so weak that their functioning should not be impacted.\n      am__obj=conftest.${OBJEXT-o}\n      am__minus_obj=\n      ;;\n    none) break ;;\n    esac\n    if depmode=$depmode \\\n       source=sub/conftest.c object=$am__obj \\\n       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \\\n       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \\\n         >/dev/null 2>conftest.err &&\n       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&\n       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then\n      # icc doesn't choke on unknown options, it will just issue warnings\n      # or remarks (even with -Werror).  So we grep stderr for any message\n      # that says an option was ignored or not supported.\n      # When given -MP, icc 7.0 and 7.1 complain thusly:\n      #   icc: Command line warning: ignoring option '-M'; no argument required\n      # The diagnosis changed in icc 8.0:\n      #   icc: Command line remark: option '-MP' not supported\n      if (grep 'ignoring option' conftest.err ||\n          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else\n        am_cv_CXX_dependencies_compiler_type=$depmode\n        break\n      fi\n    fi\n  done\n\n  cd ..\n  rm -rf conftest.dir\nelse\n  am_cv_CXX_dependencies_compiler_type=none\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type\" >&5\n$as_echo \"$am_cv_CXX_dependencies_compiler_type\" >&6; }\nCXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type\n\n if\n  test \"x$enable_dependency_tracking\" != xno \\\n  && test \"$am_cv_CXX_dependencies_compiler_type\" = gcc3; then\n  am__fastdepCXX_TRUE=\n  am__fastdepCXX_FALSE='#'\nelse\n  am__fastdepCXX_TRUE='#'\n  am__fastdepCXX_FALSE=\nfi\n\n\nac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor\" >&5\n$as_echo_n \"checking how to run the C++ preprocessor... \" >&6; }\nif test -z \"$CXXCPP\"; then\n  if ${ac_cv_prog_CXXCPP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n      # Double quotes because CXXCPP needs to be expanded\n    for CXXCPP in \"$CXX -E\" \"/lib/cpp\"\n    do\n      ac_preproc_ok=false\nfor ac_cxx_preproc_warn_flag in '' yes\ndo\n  # Use a header file that comes with gcc, so configuring glibc\n  # with a fresh cross-compiler works.\n  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n  # <limits.h> exists even on freestanding compilers.\n  # On the NeXT, cc -E runs the code through the compiler's parser,\n  # not just through cpp. \"Syntax error\" is here to catch this case.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n\t\t     Syntax error\n_ACEOF\nif ac_fn_cxx_try_cpp \"$LINENO\"; then :\n\nelse\n  # Broken: fails on valid input.\ncontinue\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\n  # OK, works on sane cases.  Now check whether nonexistent headers\n  # can be detected and how.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <ac_nonexistent.h>\n_ACEOF\nif ac_fn_cxx_try_cpp \"$LINENO\"; then :\n  # Broken: success on invalid input.\ncontinue\nelse\n  # Passes both tests.\nac_preproc_ok=:\nbreak\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\ndone\n# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.\nrm -f conftest.i conftest.err conftest.$ac_ext\nif $ac_preproc_ok; then :\n  break\nfi\n\n    done\n    ac_cv_prog_CXXCPP=$CXXCPP\n\nfi\n  CXXCPP=$ac_cv_prog_CXXCPP\nelse\n  ac_cv_prog_CXXCPP=$CXXCPP\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CXXCPP\" >&5\n$as_echo \"$CXXCPP\" >&6; }\nac_preproc_ok=false\nfor ac_cxx_preproc_warn_flag in '' yes\ndo\n  # Use a header file that comes with gcc, so configuring glibc\n  # with a fresh cross-compiler works.\n  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n  # <limits.h> exists even on freestanding compilers.\n  # On the NeXT, cc -E runs the code through the compiler's parser,\n  # not just through cpp. \"Syntax error\" is here to catch this case.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n\t\t     Syntax error\n_ACEOF\nif ac_fn_cxx_try_cpp \"$LINENO\"; then :\n\nelse\n  # Broken: fails on valid input.\ncontinue\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\n  # OK, works on sane cases.  Now check whether nonexistent headers\n  # can be detected and how.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <ac_nonexistent.h>\n_ACEOF\nif ac_fn_cxx_try_cpp \"$LINENO\"; then :\n  # Broken: success on invalid input.\ncontinue\nelse\n  # Passes both tests.\nac_preproc_ok=:\nbreak\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\ndone\n# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.\nrm -f conftest.i conftest.err conftest.$ac_ext\nif $ac_preproc_ok; then :\n\nelse\n  { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"C++ preprocessor \\\"$CXXCPP\\\" fails sanity check\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\nfi\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\nCXXFLAGS=\"${USER_CXXFLAGS}\"\nSUPLDFLAGS=\"\"\n\nac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\n\n\nif test \"x$prefix\" = \"xNONE\"; then\n  GFPREFIX=/usr/local;\nelse\n  GFPREFIX=\"$prefix\";\nfi;\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the compiler recognizes the partial specialization syntax\" >&5\n$as_echo_n \"checking whether the compiler recognizes the partial specialization syntax... \" >&6; }\nif ${ac_cv_cxx_partial_specialization_syntax+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n ac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\n\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\ntemplate<class T> class A        { public : int f () const { return 1; } };\ntemplate<class T> class A<T*>    { public:  int f () const { return 0; } };\nint\nmain ()\n{\n\nA<float*> a; return a.f();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  ac_cv_cxx_partial_specialization_syntax=yes\nelse\n  ac_cv_cxx_partial_specialization_s\nyntax=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n ac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\n\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_partial_specialization_syntax\" >&5\n$as_echo \"$ac_cv_cxx_partial_specialization_syntax\" >&6; }\nif test \"$ac_cv_cxx_partial_specialization_syntax\" != yes; then\n  echo \"Your compiler ($CXX) does not support partial template specialization, trash it\"\n  exit 1;\nfi\n\n# Make sure we can run config.sub.\n$SHELL \"$ac_aux_dir/config.sub\" sun4 >/dev/null 2>&1 ||\n  as_fn_error $? \"cannot run $SHELL $ac_aux_dir/config.sub\" \"$LINENO\" 5\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking build system type\" >&5\n$as_echo_n \"checking build system type... \" >&6; }\nif ${ac_cv_build+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_build_alias=$build_alias\ntest \"x$ac_build_alias\" = x &&\n  ac_build_alias=`$SHELL \"$ac_aux_dir/config.guess\"`\ntest \"x$ac_build_alias\" = x &&\n  as_fn_error $? \"cannot guess build type; you must specify one\" \"$LINENO\" 5\nac_cv_build=`$SHELL \"$ac_aux_dir/config.sub\" $ac_build_alias` ||\n  as_fn_error $? \"$SHELL $ac_aux_dir/config.sub $ac_build_alias failed\" \"$LINENO\" 5\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_build\" >&5\n$as_echo \"$ac_cv_build\" >&6; }\ncase $ac_cv_build in\n*-*-*) ;;\n*) as_fn_error $? \"invalid value of canonical build\" \"$LINENO\" 5;;\nesac\nbuild=$ac_cv_build\nac_save_IFS=$IFS; IFS='-'\nset x $ac_cv_build\nshift\nbuild_cpu=$1\nbuild_vendor=$2\nshift; shift\n# Remember, the first character of IFS is used to create $*,\n# except with old shells:\nbuild_os=$*\nIFS=$ac_save_IFS\ncase $build_os in *\\ *) build_os=`echo \"$build_os\" | sed 's/ /-/g'`;; esac\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking host system type\" >&5\n$as_echo_n \"checking host system type... \" >&6; }\nif ${ac_cv_host+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test \"x$host_alias\" = x; then\n  ac_cv_host=$ac_cv_build\nelse\n  ac_cv_host=`$SHELL \"$ac_aux_dir/config.sub\" $host_alias` ||\n    as_fn_error $? \"$SHELL $ac_aux_dir/config.sub $host_alias failed\" \"$LINENO\" 5\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_host\" >&5\n$as_echo \"$ac_cv_host\" >&6; }\ncase $ac_cv_host in\n*-*-*) ;;\n*) as_fn_error $? \"invalid value of canonical host\" \"$LINENO\" 5;;\nesac\nhost=$ac_cv_host\nac_save_IFS=$IFS; IFS='-'\nset x $ac_cv_host\nshift\nhost_cpu=$1\nhost_vendor=$2\nshift; shift\n# Remember, the first character of IFS is used to create $*,\n# except with old shells:\nhost_os=$*\nIFS=$ac_save_IFS\ncase $host_os in *\\ *) host_os=`echo \"$host_os\" | sed 's/ /-/g'`;; esac\n\n\n\necho \"you are compiling gmm on a $host\"\n\ncase $CXX in\n cxx)\n        echo \"Using Compaq cxx compiler\"\n        echo \"WARNING : Control that you have at least Compaq C++ V6.3\"\n        here=`pwd`\n        cd $srcdir\n        CXXFLAGS=\"$CXXFLAGS -tweak -std strict_ansi -fast -Wl,-S -nopure_cname\"\n        cd $here\n        ;;\n CC)\n        case $host in\n        *irix*)\n                echo \"Using MIPSPRO CC on IRIX  (LD is set to CC)\"\n                LD=CC\n                CXXFLAGS=\"$CXXFLAGS -LANG:std  -O3 \"\n                SUPLDFLAGS=\"-lCio\"\n                ;;\n        *sun*)\n                echo \"Using SUN C++ WorkShop Compiler\"\n                CXXFLAGS=\"$CXXFLAGS +w2 -O3\"\n                ;;\n        esac\n        ;;\n aCC)\n        echo \"Using HP ANSI C++ Compiler aCC\"\n        CXXFLAGS=\"$CXXFLAGS -AA -fast\"\n        ;;\n g++* | c++)\n        GCCVER=`$CXX --version | head -1 | cut -d ' ' -f3`\n        echo \"Using the GNU g++ compiler $GCCVER\"\n        case $GCCVER in\n          2.95*)\n                WSHADOW=\"\"\n                ;;\n          *)\n                WSHADOW=\"-Wshadow\"\n                ;;\n        esac\n        CXXFLAGS=\"$CXXFLAGS -ftemplate-depth-40 -pedantic -O3 -Wall -W $WSHADOW -Wpointer-arith -Wcast-qual -Wwrite-strings -Wconversion -Wredundant-decls -Wno-long-long\"\n        ;;\n icc | icpc)\n        echo \"Using INTEL icc\"\n        CXXFLAGS=\"$CXXFLAGS -O3 -tpp6\"\n        ;;\n *)\n        echo \"Using a unknown compiler\"\n        CXXFLAGS=\"$CXXFLAGS -O3\"\n        ;;\nesac\n\n\n\n\n\n# Check whether --enable-static was given.\nif test \"${enable_static+set}\" = set; then :\n  enableval=$enable_static; p=${PACKAGE-default}\n    case $enableval in\n    yes) enable_static=yes ;;\n    no) enable_static=no ;;\n    *)\n     enable_static=no\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=\"$IFS\"; IFS=\"${IFS}$PATH_SEPARATOR,\"\n      for pkg in $enableval; do\n\tIFS=\"$lt_save_ifs\"\n\tif test \"X$pkg\" = \"X$p\"; then\n\t  enable_static=yes\n\tfi\n      done\n      IFS=\"$lt_save_ifs\"\n      ;;\n    esac\nelse\n  enable_static=yes\nfi\n\n\n\n\n\n\n\n\n\n\ncase `pwd` in\n  *\\ * | *\\\t*)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \\`pwd\\`\" >&5\n$as_echo \"$as_me: WARNING: Libtool does not cope well with whitespace in \\`pwd\\`\" >&2;} ;;\nesac\n\n\n\nmacro_version='2.4.2'\nmacro_revision='1.3337'\n\n\n\n\n\n\n\n\n\n\n\n\n\nltmain=\"$ac_aux_dir/ltmain.sh\"\n\n# Backslashify metacharacters that are still active within\n# double-quoted strings.\nsed_quote_subst='s/\\([\"`$\\\\]\\)/\\\\\\1/g'\n\n# Same as above, but do not quote variable references.\ndouble_quote_subst='s/\\([\"`\\\\]\\)/\\\\\\1/g'\n\n# Sed substitution to delay expansion of an escaped shell variable in a\n# double_quote_subst'ed string.\ndelay_variable_subst='s/\\\\\\\\\\\\\\\\\\\\\\$/\\\\\\\\\\\\$/g'\n\n# Sed substitution to delay expansion of an escaped single quote.\ndelay_single_quote_subst='s/'\\''/'\\'\\\\\\\\\\\\\\'\\''/g'\n\n# Sed substitution to avoid accidental globbing in evaled expressions\nno_glob_subst='s/\\*/\\\\\\*/g'\n\nECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\nECHO=$ECHO$ECHO$ECHO$ECHO$ECHO\nECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to print strings\" >&5\n$as_echo_n \"checking how to print strings... \" >&6; }\n# Test print first, because it will be a builtin if present.\nif test \"X`( print -r -- -n ) 2>/dev/null`\" = X-n && \\\n   test \"X`print -r -- $ECHO 2>/dev/null`\" = \"X$ECHO\"; then\n  ECHO='print -r --'\nelif test \"X`printf %s $ECHO 2>/dev/null`\" = \"X$ECHO\"; then\n  ECHO='printf %s\\n'\nelse\n  # Use this function as a fallback that always works.\n  func_fallback_echo ()\n  {\n    eval 'cat <<_LTECHO_EOF\n$1\n_LTECHO_EOF'\n  }\n  ECHO='func_fallback_echo'\nfi\n\n# func_echo_all arg...\n# Invoke $ECHO with all args, space-separated.\nfunc_echo_all ()\n{\n    $ECHO \"\"\n}\n\ncase \"$ECHO\" in\n  printf*) { $as_echo \"$as_me:${as_lineno-$LINENO}: result: printf\" >&5\n$as_echo \"printf\" >&6; } ;;\n  print*) { $as_echo \"$as_me:${as_lineno-$LINENO}: result: print -r\" >&5\n$as_echo \"print -r\" >&6; } ;;\n  *) { $as_echo \"$as_me:${as_lineno-$LINENO}: result: cat\" >&5\n$as_echo \"cat\" >&6; } ;;\nesac\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}gcc\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}gcc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_CC=\"${ac_tool_prefix}gcc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_CC\"; then\n  ac_ct_CC=$CC\n  # Extract the first word of \"gcc\", so it can be a program name with args.\nset dummy gcc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_CC\"; then\n  ac_cv_prog_ac_ct_CC=\"$ac_ct_CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_CC=\"gcc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_CC=$ac_cv_prog_ac_ct_CC\nif test -n \"$ac_ct_CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC\" >&5\n$as_echo \"$ac_ct_CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_CC\" = x; then\n    CC=\"\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    CC=$ac_ct_CC\n  fi\nelse\n  CC=\"$ac_cv_prog_CC\"\nfi\n\nif test -z \"$CC\"; then\n          if test -n \"$ac_tool_prefix\"; then\n    # Extract the first word of \"${ac_tool_prefix}cc\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}cc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_CC=\"${ac_tool_prefix}cc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  fi\nfi\nif test -z \"$CC\"; then\n  # Extract the first word of \"cc\", so it can be a program name with args.\nset dummy cc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\n  ac_prog_rejected=no\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    if test \"$as_dir/$ac_word$ac_exec_ext\" = \"/usr/ucb/cc\"; then\n       ac_prog_rejected=yes\n       continue\n     fi\n    ac_cv_prog_CC=\"cc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nif test $ac_prog_rejected = yes; then\n  # We found a bogon in the path, so make sure we never use it.\n  set dummy $ac_cv_prog_CC\n  shift\n  if test $# != 0; then\n    # We chose a different compiler from the bogus one.\n    # However, it has the same basename, so the bogon will be chosen\n    # first if we set CC to just the basename; use the full file name.\n    shift\n    ac_cv_prog_CC=\"$as_dir/$ac_word${1+' '}$@\"\n  fi\nfi\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$CC\"; then\n  if test -n \"$ac_tool_prefix\"; then\n  for ac_prog in cl.exe\n  do\n    # Extract the first word of \"$ac_tool_prefix$ac_prog\", so it can be a program name with args.\nset dummy $ac_tool_prefix$ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_CC=\"$ac_tool_prefix$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n    test -n \"$CC\" && break\n  done\nfi\nif test -z \"$CC\"; then\n  ac_ct_CC=$CC\n  for ac_prog in cl.exe\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_CC\"; then\n  ac_cv_prog_ac_ct_CC=\"$ac_ct_CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_CC=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_CC=$ac_cv_prog_ac_ct_CC\nif test -n \"$ac_ct_CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC\" >&5\n$as_echo \"$ac_ct_CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$ac_ct_CC\" && break\ndone\n\n  if test \"x$ac_ct_CC\" = x; then\n    CC=\"\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    CC=$ac_ct_CC\n  fi\nfi\n\nfi\n\n\ntest -z \"$CC\" && { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"no acceptable C compiler found in \\$PATH\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\n\n# Provide some information about the compiler.\n$as_echo \"$as_me:${as_lineno-$LINENO}: checking for C compiler version\" >&5\nset X $ac_compile\nac_compiler=$2\nfor ac_option in --version -v -V -qversion; do\n  { { ac_try=\"$ac_compiler $ac_option >&5\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compiler $ac_option >&5\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    sed '10a\\\n... rest of stderr output deleted ...\n         10q' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n  fi\n  rm -f conftest.er1 conftest.err\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\ndone\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler\" >&5\n$as_echo_n \"checking whether we are using the GNU C compiler... \" >&6; }\nif ${ac_cv_c_compiler_gnu+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n#ifndef __GNUC__\n       choke me\n#endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_compiler_gnu=yes\nelse\n  ac_compiler_gnu=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nac_cv_c_compiler_gnu=$ac_compiler_gnu\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu\" >&5\n$as_echo \"$ac_cv_c_compiler_gnu\" >&6; }\nif test $ac_compiler_gnu = yes; then\n  GCC=yes\nelse\n  GCC=\nfi\nac_test_CFLAGS=${CFLAGS+set}\nac_save_CFLAGS=$CFLAGS\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g\" >&5\n$as_echo_n \"checking whether $CC accepts -g... \" >&6; }\nif ${ac_cv_prog_cc_g+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_save_c_werror_flag=$ac_c_werror_flag\n   ac_c_werror_flag=yes\n   ac_cv_prog_cc_g=no\n   CFLAGS=\"-g\"\n   cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cc_g=yes\nelse\n  CFLAGS=\"\"\n      cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n\nelse\n  ac_c_werror_flag=$ac_save_c_werror_flag\n\t CFLAGS=\"-g\"\n\t cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cc_g=yes\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n   ac_c_werror_flag=$ac_save_c_werror_flag\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g\" >&5\n$as_echo \"$ac_cv_prog_cc_g\" >&6; }\nif test \"$ac_test_CFLAGS\" = set; then\n  CFLAGS=$ac_save_CFLAGS\nelif test $ac_cv_prog_cc_g = yes; then\n  if test \"$GCC\" = yes; then\n    CFLAGS=\"-g -O2\"\n  else\n    CFLAGS=\"-g\"\n  fi\nelse\n  if test \"$GCC\" = yes; then\n    CFLAGS=\"-O2\"\n  else\n    CFLAGS=\n  fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89\" >&5\n$as_echo_n \"checking for $CC option to accept ISO C89... \" >&6; }\nif ${ac_cv_prog_cc_c89+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_cv_prog_cc_c89=no\nac_save_CC=$CC\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdarg.h>\n#include <stdio.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */\nstruct buf { int x; };\nFILE * (*rcsopen) (struct buf *, struct stat *, int);\nstatic char *e (p, i)\n     char **p;\n     int i;\n{\n  return p[i];\n}\nstatic char *f (char * (*g) (char **, int), char **p, ...)\n{\n  char *s;\n  va_list v;\n  va_start (v,p);\n  s = g (p, va_arg (v,int));\n  va_end (v);\n  return s;\n}\n\n/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has\n   function prototypes and stuff, but not '\\xHH' hex character constants.\n   These don't provoke an error unfortunately, instead are silently treated\n   as 'x'.  The following induces an error, until -std is added to get\n   proper ANSI mode.  Curiously '\\x00'!='x' always comes out true, for an\n   array size at least.  It's necessary to write '\\x00'==0 to get something\n   that's true only with -std.  */\nint osf4_cc_array ['\\x00' == 0 ? 1 : -1];\n\n/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters\n   inside strings and character constants.  */\n#define FOO(x) 'x'\nint xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];\n\nint test (int i, double x);\nstruct s1 {int (*f) (int a);};\nstruct s2 {int (*f) (double a);};\nint pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);\nint argc;\nchar **argv;\nint\nmain ()\n{\nreturn f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];\n  ;\n  return 0;\n}\n_ACEOF\nfor ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \\\n\t-Ae \"-Aa -D_HPUX_SOURCE\" \"-Xc -D__EXTENSIONS__\"\ndo\n  CC=\"$ac_save_CC $ac_arg\"\n  if ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cc_c89=$ac_arg\nfi\nrm -f core conftest.err conftest.$ac_objext\n  test \"x$ac_cv_prog_cc_c89\" != \"xno\" && break\ndone\nrm -f conftest.$ac_ext\nCC=$ac_save_CC\n\nfi\n# AC_CACHE_VAL\ncase \"x$ac_cv_prog_cc_c89\" in\n  x)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: none needed\" >&5\n$as_echo \"none needed\" >&6; } ;;\n  xno)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: unsupported\" >&5\n$as_echo \"unsupported\" >&6; } ;;\n  *)\n    CC=\"$CC $ac_cv_prog_cc_c89\"\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89\" >&5\n$as_echo \"$ac_cv_prog_cc_c89\" >&6; } ;;\nesac\nif test \"x$ac_cv_prog_cc_c89\" != xno; then :\n\nfi\n\nac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\n\ndepcc=\"$CC\"   am_compiler_list=\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc\" >&5\n$as_echo_n \"checking dependency style of $depcc... \" >&6; }\nif ${am_cv_CC_dependencies_compiler_type+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -z \"$AMDEP_TRUE\" && test -f \"$am_depcomp\"; then\n  # We make a subdir and do the tests there.  Otherwise we can end up\n  # making bogus files that we don't know about and never remove.  For\n  # instance it was reported that on HP-UX the gcc test will end up\n  # making a dummy file named `D' -- because `-MD' means `put the output\n  # in D'.\n  rm -rf conftest.dir\n  mkdir conftest.dir\n  # Copy depcomp to subdir because otherwise we won't find it if we're\n  # using a relative directory.\n  cp \"$am_depcomp\" conftest.dir\n  cd conftest.dir\n  # We will build objects and dependencies in a subdirectory because\n  # it helps to detect inapplicable dependency modes.  For instance\n  # both Tru64's cc and ICC support -MD to output dependencies as a\n  # side effect of compilation, but ICC will put the dependencies in\n  # the current directory while Tru64 will put them in the object\n  # directory.\n  mkdir sub\n\n  am_cv_CC_dependencies_compiler_type=none\n  if test \"$am_compiler_list\" = \"\"; then\n     am_compiler_list=`sed -n 's/^#*\\([a-zA-Z0-9]*\\))$/\\1/p' < ./depcomp`\n  fi\n  am__universal=false\n  case \" $depcc \" in #(\n     *\\ -arch\\ *\\ -arch\\ *) am__universal=true ;;\n     esac\n\n  for depmode in $am_compiler_list; do\n    # Setup a source with many dependencies, because some compilers\n    # like to wrap large dependency lists on column 80 (with \\), and\n    # we should not choose a depcomp mode which is confused by this.\n    #\n    # We need to recreate these files for each test, as the compiler may\n    # overwrite some of them when testing with obscure command lines.\n    # This happens at least with the AIX C compiler.\n    : > sub/conftest.c\n    for i in 1 2 3 4 5 6; do\n      echo '#include \"conftst'$i'.h\"' >> sub/conftest.c\n      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with\n      # Solaris 8's {/usr,}/bin/sh.\n      touch sub/conftst$i.h\n    done\n    echo \"${am__include} ${am__quote}sub/conftest.Po${am__quote}\" > confmf\n\n    # We check with `-c' and `-o' for the sake of the \"dashmstdout\"\n    # mode.  It turns out that the SunPro C++ compiler does not properly\n    # handle `-M -o', and we need to detect this.  Also, some Intel\n    # versions had trouble with output in subdirs\n    am__obj=sub/conftest.${OBJEXT-o}\n    am__minus_obj=\"-o $am__obj\"\n    case $depmode in\n    gcc)\n      # This depmode causes a compiler race in universal mode.\n      test \"$am__universal\" = false || continue\n      ;;\n    nosideeffect)\n      # after this tag, mechanisms are not by side-effect, so they'll\n      # only be used when explicitly requested\n      if test \"x$enable_dependency_tracking\" = xyes; then\n\tcontinue\n      else\n\tbreak\n      fi\n      ;;\n    msvc7 | msvc7msys | msvisualcpp | msvcmsys)\n      # This compiler won't grok `-c -o', but also, the minuso test has\n      # not run yet.  These depmodes are late enough in the game, and\n      # so weak that their functioning should not be impacted.\n      am__obj=conftest.${OBJEXT-o}\n      am__minus_obj=\n      ;;\n    none) break ;;\n    esac\n    if depmode=$depmode \\\n       source=sub/conftest.c object=$am__obj \\\n       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \\\n       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \\\n         >/dev/null 2>conftest.err &&\n       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&\n       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then\n      # icc doesn't choke on unknown options, it will just issue warnings\n      # or remarks (even with -Werror).  So we grep stderr for any message\n      # that says an option was ignored or not supported.\n      # When given -MP, icc 7.0 and 7.1 complain thusly:\n      #   icc: Command line warning: ignoring option '-M'; no argument required\n      # The diagnosis changed in icc 8.0:\n      #   icc: Command line remark: option '-MP' not supported\n      if (grep 'ignoring option' conftest.err ||\n          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else\n        am_cv_CC_dependencies_compiler_type=$depmode\n        break\n      fi\n    fi\n  done\n\n  cd ..\n  rm -rf conftest.dir\nelse\n  am_cv_CC_dependencies_compiler_type=none\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type\" >&5\n$as_echo \"$am_cv_CC_dependencies_compiler_type\" >&6; }\nCCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type\n\n if\n  test \"x$enable_dependency_tracking\" != xno \\\n  && test \"$am_cv_CC_dependencies_compiler_type\" = gcc3; then\n  am__fastdepCC_TRUE=\n  am__fastdepCC_FALSE='#'\nelse\n  am__fastdepCC_TRUE='#'\n  am__fastdepCC_FALSE=\nfi\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output\" >&5\n$as_echo_n \"checking for a sed that does not truncate output... \" >&6; }\nif ${ac_cv_path_SED+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/\n     for ac_i in 1 2 3 4 5 6 7; do\n       ac_script=\"$ac_script$as_nl$ac_script\"\n     done\n     echo \"$ac_script\" 2>/dev/null | sed 99q >conftest.sed\n     { ac_script=; unset ac_script;}\n     if test -z \"$SED\"; then\n  ac_path_SED_found=false\n  # Loop through the user's path and test for each of PROGNAME-LIST\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_prog in sed gsed; do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      ac_path_SED=\"$as_dir/$ac_prog$ac_exec_ext\"\n      { test -f \"$ac_path_SED\" && $as_test_x \"$ac_path_SED\"; } || continue\n# Check for GNU ac_path_SED and select it if it is found.\n  # Check for GNU $ac_path_SED\ncase `\"$ac_path_SED\" --version 2>&1` in\n*GNU*)\n  ac_cv_path_SED=\"$ac_path_SED\" ac_path_SED_found=:;;\n*)\n  ac_count=0\n  $as_echo_n 0123456789 >\"conftest.in\"\n  while :\n  do\n    cat \"conftest.in\" \"conftest.in\" >\"conftest.tmp\"\n    mv \"conftest.tmp\" \"conftest.in\"\n    cp \"conftest.in\" \"conftest.nl\"\n    $as_echo '' >> \"conftest.nl\"\n    \"$ac_path_SED\" -f conftest.sed < \"conftest.nl\" >\"conftest.out\" 2>/dev/null || break\n    diff \"conftest.out\" \"conftest.nl\" >/dev/null 2>&1 || break\n    as_fn_arith $ac_count + 1 && ac_count=$as_val\n    if test $ac_count -gt ${ac_path_SED_max-0}; then\n      # Best one so far, save it but keep looking for a better one\n      ac_cv_path_SED=\"$ac_path_SED\"\n      ac_path_SED_max=$ac_count\n    fi\n    # 10*(2^10) chars as input seems more than enough\n    test $ac_count -gt 10 && break\n  done\n  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;\nesac\n\n      $ac_path_SED_found && break 3\n    done\n  done\n  done\nIFS=$as_save_IFS\n  if test -z \"$ac_cv_path_SED\"; then\n    as_fn_error $? \"no acceptable sed could be found in \\$PATH\" \"$LINENO\" 5\n  fi\nelse\n  ac_cv_path_SED=$SED\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED\" >&5\n$as_echo \"$ac_cv_path_SED\" >&6; }\n SED=\"$ac_cv_path_SED\"\n  rm -f conftest.sed\n\ntest -z \"$SED\" && SED=sed\nXsed=\"$SED -e 1s/^X//\"\n\n\n\n\n\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e\" >&5\n$as_echo_n \"checking for grep that handles long lines and -e... \" >&6; }\nif ${ac_cv_path_GREP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -z \"$GREP\"; then\n  ac_path_GREP_found=false\n  # Loop through the user's path and test for each of PROGNAME-LIST\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_prog in grep ggrep; do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      ac_path_GREP=\"$as_dir/$ac_prog$ac_exec_ext\"\n      { test -f \"$ac_path_GREP\" && $as_test_x \"$ac_path_GREP\"; } || continue\n# Check for GNU ac_path_GREP and select it if it is found.\n  # Check for GNU $ac_path_GREP\ncase `\"$ac_path_GREP\" --version 2>&1` in\n*GNU*)\n  ac_cv_path_GREP=\"$ac_path_GREP\" ac_path_GREP_found=:;;\n*)\n  ac_count=0\n  $as_echo_n 0123456789 >\"conftest.in\"\n  while :\n  do\n    cat \"conftest.in\" \"conftest.in\" >\"conftest.tmp\"\n    mv \"conftest.tmp\" \"conftest.in\"\n    cp \"conftest.in\" \"conftest.nl\"\n    $as_echo 'GREP' >> \"conftest.nl\"\n    \"$ac_path_GREP\" -e 'GREP$' -e '-(cannot match)-' < \"conftest.nl\" >\"conftest.out\" 2>/dev/null || break\n    diff \"conftest.out\" \"conftest.nl\" >/dev/null 2>&1 || break\n    as_fn_arith $ac_count + 1 && ac_count=$as_val\n    if test $ac_count -gt ${ac_path_GREP_max-0}; then\n      # Best one so far, save it but keep looking for a better one\n      ac_cv_path_GREP=\"$ac_path_GREP\"\n      ac_path_GREP_max=$ac_count\n    fi\n    # 10*(2^10) chars as input seems more than enough\n    test $ac_count -gt 10 && break\n  done\n  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;\nesac\n\n      $ac_path_GREP_found && break 3\n    done\n  done\n  done\nIFS=$as_save_IFS\n  if test -z \"$ac_cv_path_GREP\"; then\n    as_fn_error $? \"no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin\" \"$LINENO\" 5\n  fi\nelse\n  ac_cv_path_GREP=$GREP\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP\" >&5\n$as_echo \"$ac_cv_path_GREP\" >&6; }\n GREP=\"$ac_cv_path_GREP\"\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for egrep\" >&5\n$as_echo_n \"checking for egrep... \" >&6; }\nif ${ac_cv_path_EGREP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1\n   then ac_cv_path_EGREP=\"$GREP -E\"\n   else\n     if test -z \"$EGREP\"; then\n  ac_path_EGREP_found=false\n  # Loop through the user's path and test for each of PROGNAME-LIST\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_prog in egrep; do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      ac_path_EGREP=\"$as_dir/$ac_prog$ac_exec_ext\"\n      { test -f \"$ac_path_EGREP\" && $as_test_x \"$ac_path_EGREP\"; } || continue\n# Check for GNU ac_path_EGREP and select it if it is found.\n  # Check for GNU $ac_path_EGREP\ncase `\"$ac_path_EGREP\" --version 2>&1` in\n*GNU*)\n  ac_cv_path_EGREP=\"$ac_path_EGREP\" ac_path_EGREP_found=:;;\n*)\n  ac_count=0\n  $as_echo_n 0123456789 >\"conftest.in\"\n  while :\n  do\n    cat \"conftest.in\" \"conftest.in\" >\"conftest.tmp\"\n    mv \"conftest.tmp\" \"conftest.in\"\n    cp \"conftest.in\" \"conftest.nl\"\n    $as_echo 'EGREP' >> \"conftest.nl\"\n    \"$ac_path_EGREP\" 'EGREP$' < \"conftest.nl\" >\"conftest.out\" 2>/dev/null || break\n    diff \"conftest.out\" \"conftest.nl\" >/dev/null 2>&1 || break\n    as_fn_arith $ac_count + 1 && ac_count=$as_val\n    if test $ac_count -gt ${ac_path_EGREP_max-0}; then\n      # Best one so far, save it but keep looking for a better one\n      ac_cv_path_EGREP=\"$ac_path_EGREP\"\n      ac_path_EGREP_max=$ac_count\n    fi\n    # 10*(2^10) chars as input seems more than enough\n    test $ac_count -gt 10 && break\n  done\n  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;\nesac\n\n      $ac_path_EGREP_found && break 3\n    done\n  done\n  done\nIFS=$as_save_IFS\n  if test -z \"$ac_cv_path_EGREP\"; then\n    as_fn_error $? \"no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin\" \"$LINENO\" 5\n  fi\nelse\n  ac_cv_path_EGREP=$EGREP\nfi\n\n   fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP\" >&5\n$as_echo \"$ac_cv_path_EGREP\" >&6; }\n EGREP=\"$ac_cv_path_EGREP\"\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for fgrep\" >&5\n$as_echo_n \"checking for fgrep... \" >&6; }\nif ${ac_cv_path_FGREP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1\n   then ac_cv_path_FGREP=\"$GREP -F\"\n   else\n     if test -z \"$FGREP\"; then\n  ac_path_FGREP_found=false\n  # Loop through the user's path and test for each of PROGNAME-LIST\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_prog in fgrep; do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      ac_path_FGREP=\"$as_dir/$ac_prog$ac_exec_ext\"\n      { test -f \"$ac_path_FGREP\" && $as_test_x \"$ac_path_FGREP\"; } || continue\n# Check for GNU ac_path_FGREP and select it if it is found.\n  # Check for GNU $ac_path_FGREP\ncase `\"$ac_path_FGREP\" --version 2>&1` in\n*GNU*)\n  ac_cv_path_FGREP=\"$ac_path_FGREP\" ac_path_FGREP_found=:;;\n*)\n  ac_count=0\n  $as_echo_n 0123456789 >\"conftest.in\"\n  while :\n  do\n    cat \"conftest.in\" \"conftest.in\" >\"conftest.tmp\"\n    mv \"conftest.tmp\" \"conftest.in\"\n    cp \"conftest.in\" \"conftest.nl\"\n    $as_echo 'FGREP' >> \"conftest.nl\"\n    \"$ac_path_FGREP\" FGREP < \"conftest.nl\" >\"conftest.out\" 2>/dev/null || break\n    diff \"conftest.out\" \"conftest.nl\" >/dev/null 2>&1 || break\n    as_fn_arith $ac_count + 1 && ac_count=$as_val\n    if test $ac_count -gt ${ac_path_FGREP_max-0}; then\n      # Best one so far, save it but keep looking for a better one\n      ac_cv_path_FGREP=\"$ac_path_FGREP\"\n      ac_path_FGREP_max=$ac_count\n    fi\n    # 10*(2^10) chars as input seems more than enough\n    test $ac_count -gt 10 && break\n  done\n  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;\nesac\n\n      $ac_path_FGREP_found && break 3\n    done\n  done\n  done\nIFS=$as_save_IFS\n  if test -z \"$ac_cv_path_FGREP\"; then\n    as_fn_error $? \"no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin\" \"$LINENO\" 5\n  fi\nelse\n  ac_cv_path_FGREP=$FGREP\nfi\n\n   fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP\" >&5\n$as_echo \"$ac_cv_path_FGREP\" >&6; }\n FGREP=\"$ac_cv_path_FGREP\"\n\n\ntest -z \"$GREP\" && GREP=grep\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n# Check whether --with-gnu-ld was given.\nif test \"${with_gnu_ld+set}\" = set; then :\n  withval=$with_gnu_ld; test \"$withval\" = no || with_gnu_ld=yes\nelse\n  with_gnu_ld=no\nfi\n\nac_prog=ld\nif test \"$GCC\" = yes; then\n  # Check if gcc -print-prog-name=ld gives a path.\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for ld used by $CC\" >&5\n$as_echo_n \"checking for ld used by $CC... \" >&6; }\n  case $host in\n  *-*-mingw*)\n    # gcc leaves a trailing carriage return which upsets mingw\n    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\\015'` ;;\n  *)\n    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;\n  esac\n  case $ac_prog in\n    # Accept absolute paths.\n    [\\\\/]* | ?:[\\\\/]*)\n      re_direlt='/[^/][^/]*/\\.\\./'\n      # Canonicalize the pathname of ld\n      ac_prog=`$ECHO \"$ac_prog\"| $SED 's%\\\\\\\\%/%g'`\n      while $ECHO \"$ac_prog\" | $GREP \"$re_direlt\" > /dev/null 2>&1; do\n\tac_prog=`$ECHO $ac_prog| $SED \"s%$re_direlt%/%\"`\n      done\n      test -z \"$LD\" && LD=\"$ac_prog\"\n      ;;\n  \"\")\n    # If it fails, then pretend we aren't using GCC.\n    ac_prog=ld\n    ;;\n  *)\n    # If it is relative, then search for the first ld in PATH.\n    with_gnu_ld=unknown\n    ;;\n  esac\nelif test \"$with_gnu_ld\" = yes; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for GNU ld\" >&5\n$as_echo_n \"checking for GNU ld... \" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for non-GNU ld\" >&5\n$as_echo_n \"checking for non-GNU ld... \" >&6; }\nfi\nif ${lt_cv_path_LD+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -z \"$LD\"; then\n  lt_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n  for ac_dir in $PATH; do\n    IFS=\"$lt_save_ifs\"\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f \"$ac_dir/$ac_prog\" || test -f \"$ac_dir/$ac_prog$ac_exeext\"; then\n      lt_cv_path_LD=\"$ac_dir/$ac_prog\"\n      # Check to see if the program is GNU ld.  I'd rather use --version,\n      # but apparently some variants of GNU ld only accept -v.\n      # Break only if it was the GNU/non-GNU ld that we prefer.\n      case `\"$lt_cv_path_LD\" -v 2>&1 </dev/null` in\n      *GNU* | *'with BFD'*)\n\ttest \"$with_gnu_ld\" != no && break\n\t;;\n      *)\n\ttest \"$with_gnu_ld\" != yes && break\n\t;;\n      esac\n    fi\n  done\n  IFS=\"$lt_save_ifs\"\nelse\n  lt_cv_path_LD=\"$LD\" # Let the user override the test with a path.\nfi\nfi\n\nLD=\"$lt_cv_path_LD\"\nif test -n \"$LD\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $LD\" >&5\n$as_echo \"$LD\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\ntest -z \"$LD\" && as_fn_error $? \"no acceptable ld found in \\$PATH\" \"$LINENO\" 5\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld\" >&5\n$as_echo_n \"checking if the linker ($LD) is GNU ld... \" >&6; }\nif ${lt_cv_prog_gnu_ld+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  # I'd rather use --version here, but apparently some GNU lds only accept -v.\ncase `$LD -v 2>&1 </dev/null` in\n*GNU* | *'with BFD'*)\n  lt_cv_prog_gnu_ld=yes\n  ;;\n*)\n  lt_cv_prog_gnu_ld=no\n  ;;\nesac\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld\" >&5\n$as_echo \"$lt_cv_prog_gnu_ld\" >&6; }\nwith_gnu_ld=$lt_cv_prog_gnu_ld\n\n\n\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)\" >&5\n$as_echo_n \"checking for BSD- or MS-compatible name lister (nm)... \" >&6; }\nif ${lt_cv_path_NM+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$NM\"; then\n  # Let the user override the test.\n  lt_cv_path_NM=\"$NM\"\nelse\n  lt_nm_to_check=\"${ac_tool_prefix}nm\"\n  if test -n \"$ac_tool_prefix\" && test \"$build\" = \"$host\"; then\n    lt_nm_to_check=\"$lt_nm_to_check nm\"\n  fi\n  for lt_tmp_nm in $lt_nm_to_check; do\n    lt_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do\n      IFS=\"$lt_save_ifs\"\n      test -z \"$ac_dir\" && ac_dir=.\n      tmp_nm=\"$ac_dir/$lt_tmp_nm\"\n      if test -f \"$tmp_nm\" || test -f \"$tmp_nm$ac_exeext\" ; then\n\t# Check to see if the nm accepts a BSD-compat flag.\n\t# Adding the `sed 1q' prevents false positives on HP-UX, which says:\n\t#   nm: unknown option \"B\" ignored\n\t# Tru64's nm complains that /dev/null is an invalid object file\n\tcase `\"$tmp_nm\" -B /dev/null 2>&1 | sed '1q'` in\n\t*/dev/null* | *'Invalid file or object type'*)\n\t  lt_cv_path_NM=\"$tmp_nm -B\"\n\t  break\n\t  ;;\n\t*)\n\t  case `\"$tmp_nm\" -p /dev/null 2>&1 | sed '1q'` in\n\t  */dev/null*)\n\t    lt_cv_path_NM=\"$tmp_nm -p\"\n\t    break\n\t    ;;\n\t  *)\n\t    lt_cv_path_NM=${lt_cv_path_NM=\"$tmp_nm\"} # keep the first match, but\n\t    continue # so that we can try to find one that supports BSD flags\n\t    ;;\n\t  esac\n\t  ;;\n\tesac\n      fi\n    done\n    IFS=\"$lt_save_ifs\"\n  done\n  : ${lt_cv_path_NM=no}\nfi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM\" >&5\n$as_echo \"$lt_cv_path_NM\" >&6; }\nif test \"$lt_cv_path_NM\" != \"no\"; then\n  NM=\"$lt_cv_path_NM\"\nelse\n  # Didn't find any BSD compatible name lister, look for dumpbin.\n  if test -n \"$DUMPBIN\"; then :\n    # Let the user override the test.\n  else\n    if test -n \"$ac_tool_prefix\"; then\n  for ac_prog in dumpbin \"link -dump\"\n  do\n    # Extract the first word of \"$ac_tool_prefix$ac_prog\", so it can be a program name with args.\nset dummy $ac_tool_prefix$ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_DUMPBIN+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$DUMPBIN\"; then\n  ac_cv_prog_DUMPBIN=\"$DUMPBIN\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_DUMPBIN=\"$ac_tool_prefix$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nDUMPBIN=$ac_cv_prog_DUMPBIN\nif test -n \"$DUMPBIN\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $DUMPBIN\" >&5\n$as_echo \"$DUMPBIN\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n    test -n \"$DUMPBIN\" && break\n  done\nfi\nif test -z \"$DUMPBIN\"; then\n  ac_ct_DUMPBIN=$DUMPBIN\n  for ac_prog in dumpbin \"link -dump\"\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_DUMPBIN\"; then\n  ac_cv_prog_ac_ct_DUMPBIN=\"$ac_ct_DUMPBIN\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_DUMPBIN=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN\nif test -n \"$ac_ct_DUMPBIN\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN\" >&5\n$as_echo \"$ac_ct_DUMPBIN\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$ac_ct_DUMPBIN\" && break\ndone\n\n  if test \"x$ac_ct_DUMPBIN\" = x; then\n    DUMPBIN=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    DUMPBIN=$ac_ct_DUMPBIN\n  fi\nfi\n\n    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in\n    *COFF*)\n      DUMPBIN=\"$DUMPBIN -symbols\"\n      ;;\n    *)\n      DUMPBIN=:\n      ;;\n    esac\n  fi\n\n  if test \"$DUMPBIN\" != \":\"; then\n    NM=\"$DUMPBIN\"\n  fi\nfi\ntest -z \"$NM\" && NM=nm\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface\" >&5\n$as_echo_n \"checking the name lister ($NM) interface... \" >&6; }\nif ${lt_cv_nm_interface+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_nm_interface=\"BSD nm\"\n  echo \"int some_variable = 0;\" > conftest.$ac_ext\n  (eval echo \"\\\"\\$as_me:$LINENO: $ac_compile\\\"\" >&5)\n  (eval \"$ac_compile\" 2>conftest.err)\n  cat conftest.err >&5\n  (eval echo \"\\\"\\$as_me:$LINENO: $NM \\\\\\\"conftest.$ac_objext\\\\\\\"\\\"\" >&5)\n  (eval \"$NM \\\"conftest.$ac_objext\\\"\" 2>conftest.err > conftest.out)\n  cat conftest.err >&5\n  (eval echo \"\\\"\\$as_me:$LINENO: output\\\"\" >&5)\n  cat conftest.out >&5\n  if $GREP 'External.*some_variable' conftest.out > /dev/null; then\n    lt_cv_nm_interface=\"MS dumpbin\"\n  fi\n  rm -f conftest*\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface\" >&5\n$as_echo \"$lt_cv_nm_interface\" >&6; }\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether ln -s works\" >&5\n$as_echo_n \"checking whether ln -s works... \" >&6; }\nLN_S=$as_ln_s\nif test \"$LN_S\" = \"ln -s\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no, using $LN_S\" >&5\n$as_echo \"no, using $LN_S\" >&6; }\nfi\n\n# find the maximum length of command line arguments\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments\" >&5\n$as_echo_n \"checking the maximum length of command line arguments... \" >&6; }\nif ${lt_cv_sys_max_cmd_len+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n    i=0\n  teststring=\"ABCD\"\n\n  case $build_os in\n  msdosdjgpp*)\n    # On DJGPP, this test can blow up pretty badly due to problems in libc\n    # (any single argument exceeding 2000 bytes causes a buffer overrun\n    # during glob expansion).  Even if it were fixed, the result of this\n    # check would be larger than it should be.\n    lt_cv_sys_max_cmd_len=12288;    # 12K is about right\n    ;;\n\n  gnu*)\n    # Under GNU Hurd, this test is not required because there is\n    # no limit to the length of command line arguments.\n    # Libtool will interpret -1 as no limit whatsoever\n    lt_cv_sys_max_cmd_len=-1;\n    ;;\n\n  cygwin* | mingw* | cegcc*)\n    # On Win9x/ME, this test blows up -- it succeeds, but takes\n    # about 5 minutes as the teststring grows exponentially.\n    # Worse, since 9x/ME are not pre-emptively multitasking,\n    # you end up with a \"frozen\" computer, even though with patience\n    # the test eventually succeeds (with a max line length of 256k).\n    # Instead, let's just punt: use the minimum linelength reported by\n    # all of the supported platforms: 8192 (on NT/2K/XP).\n    lt_cv_sys_max_cmd_len=8192;\n    ;;\n\n  mint*)\n    # On MiNT this can take a long time and run out of memory.\n    lt_cv_sys_max_cmd_len=8192;\n    ;;\n\n  amigaos*)\n    # On AmigaOS with pdksh, this test takes hours, literally.\n    # So we just punt and use a minimum line length of 8192.\n    lt_cv_sys_max_cmd_len=8192;\n    ;;\n\n  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)\n    # This has been around since 386BSD, at least.  Likely further.\n    if test -x /sbin/sysctl; then\n      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`\n    elif test -x /usr/sbin/sysctl; then\n      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`\n    else\n      lt_cv_sys_max_cmd_len=65536\t# usable default for all BSDs\n    fi\n    # And add a safety zone\n    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\/ 4`\n    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\* 3`\n    ;;\n\n  interix*)\n    # We know the value 262144 and hardcode it with a safety zone (like BSD)\n    lt_cv_sys_max_cmd_len=196608\n    ;;\n\n  os2*)\n    # The test takes a long time on OS/2.\n    lt_cv_sys_max_cmd_len=8192\n    ;;\n\n  osf*)\n    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure\n    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not\n    # nice to cause kernel panics so lets avoid the loop below.\n    # First set a reasonable default.\n    lt_cv_sys_max_cmd_len=16384\n    #\n    if test -x /sbin/sysconfig; then\n      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in\n        *1*) lt_cv_sys_max_cmd_len=-1 ;;\n      esac\n    fi\n    ;;\n  sco3.2v5*)\n    lt_cv_sys_max_cmd_len=102400\n    ;;\n  sysv5* | sco5v6* | sysv4.2uw2*)\n    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`\n    if test -n \"$kargmax\"; then\n      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[\t ]//'`\n    else\n      lt_cv_sys_max_cmd_len=32768\n    fi\n    ;;\n  *)\n    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`\n    if test -n \"$lt_cv_sys_max_cmd_len\"; then\n      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\/ 4`\n      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\* 3`\n    else\n      # Make teststring a little bigger before we do anything with it.\n      # a 1K string should be a reasonable start.\n      for i in 1 2 3 4 5 6 7 8 ; do\n        teststring=$teststring$teststring\n      done\n      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}\n      # If test is not a shell built-in, we'll probably end up computing a\n      # maximum length that is only half of the actual maximum length, but\n      # we can't tell.\n      while { test \"X\"`env echo \"$teststring$teststring\" 2>/dev/null` \\\n\t         = \"X$teststring$teststring\"; } >/dev/null 2>&1 &&\n\t      test $i != 17 # 1/2 MB should be enough\n      do\n        i=`expr $i + 1`\n        teststring=$teststring$teststring\n      done\n      # Only check the string length outside the loop.\n      lt_cv_sys_max_cmd_len=`expr \"X$teststring\" : \".*\" 2>&1`\n      teststring=\n      # Add a significant safety factor because C++ compilers can tack on\n      # massive amounts of additional arguments before passing them to the\n      # linker.  It appears as though 1/2 is a usable value.\n      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\/ 2`\n    fi\n    ;;\n  esac\n\nfi\n\nif test -n $lt_cv_sys_max_cmd_len ; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len\" >&5\n$as_echo \"$lt_cv_sys_max_cmd_len\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: none\" >&5\n$as_echo \"none\" >&6; }\nfi\nmax_cmd_len=$lt_cv_sys_max_cmd_len\n\n\n\n\n\n\n: ${CP=\"cp -f\"}\n: ${MV=\"mv -f\"}\n: ${RM=\"rm -f\"}\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs\" >&5\n$as_echo_n \"checking whether the shell understands some XSI constructs... \" >&6; }\n# Try some XSI features\nxsi_shell=no\n( _lt_dummy=\"a/b/c\"\n  test \"${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}\"${_lt_dummy%\"$_lt_dummy\"}, \\\n      = c,a/b,b/c, \\\n    && eval 'test $(( 1 + 1 )) -eq 2 \\\n    && test \"${#_lt_dummy}\" -eq 5' ) >/dev/null 2>&1 \\\n  && xsi_shell=yes\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $xsi_shell\" >&5\n$as_echo \"$xsi_shell\" >&6; }\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the shell understands \\\"+=\\\"\" >&5\n$as_echo_n \"checking whether the shell understands \\\"+=\\\"... \" >&6; }\nlt_shell_append=no\n( foo=bar; set foo baz; eval \"$1+=\\$2\" && test \"$foo\" = barbaz ) \\\n    >/dev/null 2>&1 \\\n  && lt_shell_append=yes\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_shell_append\" >&5\n$as_echo \"$lt_shell_append\" >&6; }\n\n\nif ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then\n  lt_unset=unset\nelse\n  lt_unset=false\nfi\n\n\n\n\n\n# test EBCDIC or ASCII\ncase `echo X|tr X '\\101'` in\n A) # ASCII based system\n    # \\n is not interpreted correctly by Solaris 8 /usr/ucb/tr\n  lt_SP2NL='tr \\040 \\012'\n  lt_NL2SP='tr \\015\\012 \\040\\040'\n  ;;\n *) # EBCDIC based system\n  lt_SP2NL='tr \\100 \\n'\n  lt_NL2SP='tr \\r\\n \\100\\100'\n  ;;\nesac\n\n\n\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format\" >&5\n$as_echo_n \"checking how to convert $build file names to $host format... \" >&6; }\nif ${lt_cv_to_host_file_cmd+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case $host in\n  *-*-mingw* )\n    case $build in\n      *-*-mingw* ) # actually msys\n        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32\n        ;;\n      *-*-cygwin* )\n        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32\n        ;;\n      * ) # otherwise, assume *nix\n        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32\n        ;;\n    esac\n    ;;\n  *-*-cygwin* )\n    case $build in\n      *-*-mingw* ) # actually msys\n        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin\n        ;;\n      *-*-cygwin* )\n        lt_cv_to_host_file_cmd=func_convert_file_noop\n        ;;\n      * ) # otherwise, assume *nix\n        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin\n        ;;\n    esac\n    ;;\n  * ) # unhandled hosts (and \"normal\" native builds)\n    lt_cv_to_host_file_cmd=func_convert_file_noop\n    ;;\nesac\n\nfi\n\nto_host_file_cmd=$lt_cv_to_host_file_cmd\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd\" >&5\n$as_echo \"$lt_cv_to_host_file_cmd\" >&6; }\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format\" >&5\n$as_echo_n \"checking how to convert $build file names to toolchain format... \" >&6; }\nif ${lt_cv_to_tool_file_cmd+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  #assume ordinary cross tools, or native build.\nlt_cv_to_tool_file_cmd=func_convert_file_noop\ncase $host in\n  *-*-mingw* )\n    case $build in\n      *-*-mingw* ) # actually msys\n        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32\n        ;;\n    esac\n    ;;\nesac\n\nfi\n\nto_tool_file_cmd=$lt_cv_to_tool_file_cmd\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd\" >&5\n$as_echo \"$lt_cv_to_tool_file_cmd\" >&6; }\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files\" >&5\n$as_echo_n \"checking for $LD option to reload object files... \" >&6; }\nif ${lt_cv_ld_reload_flag+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_ld_reload_flag='-r'\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag\" >&5\n$as_echo \"$lt_cv_ld_reload_flag\" >&6; }\nreload_flag=$lt_cv_ld_reload_flag\ncase $reload_flag in\n\"\" | \" \"*) ;;\n*) reload_flag=\" $reload_flag\" ;;\nesac\nreload_cmds='$LD$reload_flag -o $output$reload_objs'\ncase $host_os in\n  cygwin* | mingw* | pw32* | cegcc*)\n    if test \"$GCC\" != yes; then\n      reload_cmds=false\n    fi\n    ;;\n  darwin*)\n    if test \"$GCC\" = yes; then\n      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'\n    else\n      reload_cmds='$LD$reload_flag -o $output$reload_objs'\n    fi\n    ;;\nesac\n\n\n\n\n\n\n\n\n\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}objdump\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}objdump; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_OBJDUMP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$OBJDUMP\"; then\n  ac_cv_prog_OBJDUMP=\"$OBJDUMP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_OBJDUMP=\"${ac_tool_prefix}objdump\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nOBJDUMP=$ac_cv_prog_OBJDUMP\nif test -n \"$OBJDUMP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $OBJDUMP\" >&5\n$as_echo \"$OBJDUMP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_OBJDUMP\"; then\n  ac_ct_OBJDUMP=$OBJDUMP\n  # Extract the first word of \"objdump\", so it can be a program name with args.\nset dummy objdump; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_OBJDUMP\"; then\n  ac_cv_prog_ac_ct_OBJDUMP=\"$ac_ct_OBJDUMP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_OBJDUMP=\"objdump\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP\nif test -n \"$ac_ct_OBJDUMP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP\" >&5\n$as_echo \"$ac_ct_OBJDUMP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_OBJDUMP\" = x; then\n    OBJDUMP=\"false\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    OBJDUMP=$ac_ct_OBJDUMP\n  fi\nelse\n  OBJDUMP=\"$ac_cv_prog_OBJDUMP\"\nfi\n\ntest -z \"$OBJDUMP\" && OBJDUMP=objdump\n\n\n\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries\" >&5\n$as_echo_n \"checking how to recognize dependent libraries... \" >&6; }\nif ${lt_cv_deplibs_check_method+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_file_magic_cmd='$MAGIC_CMD'\nlt_cv_file_magic_test_file=\nlt_cv_deplibs_check_method='unknown'\n# Need to set the preceding variable on all platforms that support\n# interlibrary dependencies.\n# 'none' -- dependencies not supported.\n# `unknown' -- same as none, but documents that we really don't know.\n# 'pass_all' -- all dependencies passed with no checks.\n# 'test_compile' -- check by making test program.\n# 'file_magic [[regex]]' -- check by looking for files in library path\n# which responds to the $file_magic_cmd with a given extended regex.\n# If you have `file' or equivalent on your system and you're not sure\n# whether `pass_all' will *always* work, you probably want this one.\n\ncase $host_os in\naix[4-9]*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nbeos*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nbsdi[45]*)\n  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'\n  lt_cv_file_magic_cmd='/usr/bin/file -L'\n  lt_cv_file_magic_test_file=/shlib/libc.so\n  ;;\n\ncygwin*)\n  # func_win32_libid is a shell function defined in ltmain.sh\n  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'\n  lt_cv_file_magic_cmd='func_win32_libid'\n  ;;\n\nmingw* | pw32*)\n  # Base MSYS/MinGW do not provide the 'file' command needed by\n  # func_win32_libid shell function, so use a weaker test based on 'objdump',\n  # unless we find 'file', for example because we are cross-compiling.\n  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.\n  if ( test \"$lt_cv_nm_interface\" = \"BSD nm\" && file / ) >/dev/null 2>&1; then\n    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'\n    lt_cv_file_magic_cmd='func_win32_libid'\n  else\n    # Keep this pattern in sync with the one in func_win32_libid.\n    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'\n    lt_cv_file_magic_cmd='$OBJDUMP -f'\n  fi\n  ;;\n\ncegcc*)\n  # use the weaker test based on 'objdump'. See mingw*.\n  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'\n  lt_cv_file_magic_cmd='$OBJDUMP -f'\n  ;;\n\ndarwin* | rhapsody*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nfreebsd* | dragonfly*)\n  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then\n    case $host_cpu in\n    i*86 )\n      # Not sure whether the presence of OpenBSD here was a mistake.\n      # Let's accept both of them until this is cleared up.\n      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'\n      lt_cv_file_magic_cmd=/usr/bin/file\n      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`\n      ;;\n    esac\n  else\n    lt_cv_deplibs_check_method=pass_all\n  fi\n  ;;\n\ngnu*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nhaiku*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nhpux10.20* | hpux11*)\n  lt_cv_file_magic_cmd=/usr/bin/file\n  case $host_cpu in\n  ia64*)\n    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'\n    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so\n    ;;\n  hppa*64*)\n    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\\.[0-9]'\n    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl\n    ;;\n  *)\n    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\\.[0-9]) shared library'\n    lt_cv_file_magic_test_file=/usr/lib/libc.sl\n    ;;\n  esac\n  ;;\n\ninterix[3-9]*)\n  # PIC code is broken on Interix 3.x, that's why |\\.a not |_pic\\.a here\n  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\\.so|\\.a)$'\n  ;;\n\nirix5* | irix6* | nonstopux*)\n  case $LD in\n  *-32|*\"-32 \") libmagic=32-bit;;\n  *-n32|*\"-n32 \") libmagic=N32;;\n  *-64|*\"-64 \") libmagic=64-bit;;\n  *) libmagic=never-match;;\n  esac\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\n# This must be glibc/ELF.\nlinux* | k*bsd*-gnu | kopensolaris*-gnu)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nnetbsd* | netbsdelf*-gnu)\n  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then\n    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\\.so\\.[0-9]+\\.[0-9]+|_pic\\.a)$'\n  else\n    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\\.so|_pic\\.a)$'\n  fi\n  ;;\n\nnewos6*)\n  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'\n  lt_cv_file_magic_cmd=/usr/bin/file\n  lt_cv_file_magic_test_file=/usr/lib/libnls.so\n  ;;\n\n*nto* | *qnx*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nopenbsd*)\n  if test -z \"`echo __ELF__ | $CC -E - | $GREP __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\\.so\\.[0-9]+\\.[0-9]+|\\.so|_pic\\.a)$'\n  else\n    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\\.so\\.[0-9]+\\.[0-9]+|_pic\\.a)$'\n  fi\n  ;;\n\nosf3* | osf4* | osf5*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nrdos*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsolaris*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsysv4 | sysv4.3*)\n  case $host_vendor in\n  motorola)\n    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'\n    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`\n    ;;\n  ncr)\n    lt_cv_deplibs_check_method=pass_all\n    ;;\n  sequent)\n    lt_cv_file_magic_cmd='/bin/file'\n    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'\n    ;;\n  sni)\n    lt_cv_file_magic_cmd='/bin/file'\n    lt_cv_deplibs_check_method=\"file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib\"\n    lt_cv_file_magic_test_file=/lib/libc.so\n    ;;\n  siemens)\n    lt_cv_deplibs_check_method=pass_all\n    ;;\n  pc)\n    lt_cv_deplibs_check_method=pass_all\n    ;;\n  esac\n  ;;\n\ntpf*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\nesac\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method\" >&5\n$as_echo \"$lt_cv_deplibs_check_method\" >&6; }\n\nfile_magic_glob=\nwant_nocaseglob=no\nif test \"$build\" = \"$host\"; then\n  case $host_os in\n  mingw* | pw32*)\n    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then\n      want_nocaseglob=yes\n    else\n      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e \"s/\\(..\\)/s\\/[\\1]\\/[\\1]\\/g;/g\"`\n    fi\n    ;;\n  esac\nfi\n\nfile_magic_cmd=$lt_cv_file_magic_cmd\ndeplibs_check_method=$lt_cv_deplibs_check_method\ntest -z \"$deplibs_check_method\" && deplibs_check_method=unknown\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}dlltool\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}dlltool; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_DLLTOOL+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$DLLTOOL\"; then\n  ac_cv_prog_DLLTOOL=\"$DLLTOOL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_DLLTOOL=\"${ac_tool_prefix}dlltool\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nDLLTOOL=$ac_cv_prog_DLLTOOL\nif test -n \"$DLLTOOL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $DLLTOOL\" >&5\n$as_echo \"$DLLTOOL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_DLLTOOL\"; then\n  ac_ct_DLLTOOL=$DLLTOOL\n  # Extract the first word of \"dlltool\", so it can be a program name with args.\nset dummy dlltool; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_DLLTOOL\"; then\n  ac_cv_prog_ac_ct_DLLTOOL=\"$ac_ct_DLLTOOL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_DLLTOOL=\"dlltool\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL\nif test -n \"$ac_ct_DLLTOOL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL\" >&5\n$as_echo \"$ac_ct_DLLTOOL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_DLLTOOL\" = x; then\n    DLLTOOL=\"false\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    DLLTOOL=$ac_ct_DLLTOOL\n  fi\nelse\n  DLLTOOL=\"$ac_cv_prog_DLLTOOL\"\nfi\n\ntest -z \"$DLLTOOL\" && DLLTOOL=dlltool\n\n\n\n\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries\" >&5\n$as_echo_n \"checking how to associate runtime and link libraries... \" >&6; }\nif ${lt_cv_sharedlib_from_linklib_cmd+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_sharedlib_from_linklib_cmd='unknown'\n\ncase $host_os in\ncygwin* | mingw* | pw32* | cegcc*)\n  # two different shell functions defined in ltmain.sh\n  # decide which to use based on capabilities of $DLLTOOL\n  case `$DLLTOOL --help 2>&1` in\n  *--identify-strict*)\n    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib\n    ;;\n  *)\n    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback\n    ;;\n  esac\n  ;;\n*)\n  # fallback: assume linklib IS sharedlib\n  lt_cv_sharedlib_from_linklib_cmd=\"$ECHO\"\n  ;;\nesac\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd\" >&5\n$as_echo \"$lt_cv_sharedlib_from_linklib_cmd\" >&6; }\nsharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd\ntest -z \"$sharedlib_from_linklib_cmd\" && sharedlib_from_linklib_cmd=$ECHO\n\n\n\n\n\n\n\nif test -n \"$ac_tool_prefix\"; then\n  for ac_prog in ar\n  do\n    # Extract the first word of \"$ac_tool_prefix$ac_prog\", so it can be a program name with args.\nset dummy $ac_tool_prefix$ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_AR+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$AR\"; then\n  ac_cv_prog_AR=\"$AR\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_AR=\"$ac_tool_prefix$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nAR=$ac_cv_prog_AR\nif test -n \"$AR\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $AR\" >&5\n$as_echo \"$AR\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n    test -n \"$AR\" && break\n  done\nfi\nif test -z \"$AR\"; then\n  ac_ct_AR=$AR\n  for ac_prog in ar\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_AR+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_AR\"; then\n  ac_cv_prog_ac_ct_AR=\"$ac_ct_AR\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_AR=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_AR=$ac_cv_prog_ac_ct_AR\nif test -n \"$ac_ct_AR\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR\" >&5\n$as_echo \"$ac_ct_AR\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$ac_ct_AR\" && break\ndone\n\n  if test \"x$ac_ct_AR\" = x; then\n    AR=\"false\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    AR=$ac_ct_AR\n  fi\nfi\n\n: ${AR=ar}\n: ${AR_FLAGS=cru}\n\n\n\n\n\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support\" >&5\n$as_echo_n \"checking for archiver @FILE support... \" >&6; }\nif ${lt_cv_ar_at_file+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_ar_at_file=no\n   cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  echo conftest.$ac_objext > conftest.lst\n      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5'\n      { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$lt_ar_try\\\"\"; } >&5\n  (eval $lt_ar_try) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\n      if test \"$ac_status\" -eq 0; then\n\t# Ensure the archiver fails upon bogus file names.\n\trm -f conftest.$ac_objext libconftest.a\n\t{ { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$lt_ar_try\\\"\"; } >&5\n  (eval $lt_ar_try) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\n\tif test \"$ac_status\" -ne 0; then\n          lt_cv_ar_at_file=@\n        fi\n      fi\n      rm -f conftest.* libconftest.a\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file\" >&5\n$as_echo \"$lt_cv_ar_at_file\" >&6; }\n\nif test \"x$lt_cv_ar_at_file\" = xno; then\n  archiver_list_spec=\nelse\n  archiver_list_spec=$lt_cv_ar_at_file\nfi\n\n\n\n\n\n\n\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}strip\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}strip; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_STRIP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$STRIP\"; then\n  ac_cv_prog_STRIP=\"$STRIP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_STRIP=\"${ac_tool_prefix}strip\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nSTRIP=$ac_cv_prog_STRIP\nif test -n \"$STRIP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $STRIP\" >&5\n$as_echo \"$STRIP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_STRIP\"; then\n  ac_ct_STRIP=$STRIP\n  # Extract the first word of \"strip\", so it can be a program name with args.\nset dummy strip; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_STRIP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_STRIP\"; then\n  ac_cv_prog_ac_ct_STRIP=\"$ac_ct_STRIP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_STRIP=\"strip\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP\nif test -n \"$ac_ct_STRIP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP\" >&5\n$as_echo \"$ac_ct_STRIP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_STRIP\" = x; then\n    STRIP=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    STRIP=$ac_ct_STRIP\n  fi\nelse\n  STRIP=\"$ac_cv_prog_STRIP\"\nfi\n\ntest -z \"$STRIP\" && STRIP=:\n\n\n\n\n\n\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}ranlib\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}ranlib; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_RANLIB+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$RANLIB\"; then\n  ac_cv_prog_RANLIB=\"$RANLIB\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_RANLIB=\"${ac_tool_prefix}ranlib\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nRANLIB=$ac_cv_prog_RANLIB\nif test -n \"$RANLIB\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $RANLIB\" >&5\n$as_echo \"$RANLIB\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_RANLIB\"; then\n  ac_ct_RANLIB=$RANLIB\n  # Extract the first word of \"ranlib\", so it can be a program name with args.\nset dummy ranlib; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_RANLIB+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_RANLIB\"; then\n  ac_cv_prog_ac_ct_RANLIB=\"$ac_ct_RANLIB\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_RANLIB=\"ranlib\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB\nif test -n \"$ac_ct_RANLIB\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB\" >&5\n$as_echo \"$ac_ct_RANLIB\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_RANLIB\" = x; then\n    RANLIB=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    RANLIB=$ac_ct_RANLIB\n  fi\nelse\n  RANLIB=\"$ac_cv_prog_RANLIB\"\nfi\n\ntest -z \"$RANLIB\" && RANLIB=:\n\n\n\n\n\n\n# Determine commands to create old-style static archives.\nold_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'\nold_postinstall_cmds='chmod 644 $oldlib'\nold_postuninstall_cmds=\n\nif test -n \"$RANLIB\"; then\n  case $host_os in\n  openbsd*)\n    old_postinstall_cmds=\"$old_postinstall_cmds~\\$RANLIB -t \\$tool_oldlib\"\n    ;;\n  *)\n    old_postinstall_cmds=\"$old_postinstall_cmds~\\$RANLIB \\$tool_oldlib\"\n    ;;\n  esac\n  old_archive_cmds=\"$old_archive_cmds~\\$RANLIB \\$tool_oldlib\"\nfi\n\ncase $host_os in\n  darwin*)\n    lock_old_archive_extraction=yes ;;\n  *)\n    lock_old_archive_extraction=no ;;\nesac\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\n\n\n\n\n\n\n\n\n\n\n# If no C compiler was specified, use CC.\nLTCC=${LTCC-\"$CC\"}\n\n# If no C compiler flags were specified, use CFLAGS.\nLTCFLAGS=${LTCFLAGS-\"$CFLAGS\"}\n\n# Allow CC to be a program name with arguments.\ncompiler=$CC\n\n\n# Check for command to grab the raw symbol name followed by C symbol from nm.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object\" >&5\n$as_echo_n \"checking command to parse $NM output from $compiler object... \" >&6; }\nif ${lt_cv_sys_global_symbol_pipe+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n# These are sane defaults that work on at least a few old systems.\n# [They come from Ultrix.  What could be older than Ultrix?!! ;)]\n\n# Character class describing NM global symbol codes.\nsymcode='[BCDEGRST]'\n\n# Regexp to match symbols that can be accessed directly from C.\nsympat='\\([_A-Za-z][_A-Za-z0-9]*\\)'\n\n# Define system-specific variables.\ncase $host_os in\naix*)\n  symcode='[BCDT]'\n  ;;\ncygwin* | mingw* | pw32* | cegcc*)\n  symcode='[ABCDGISTW]'\n  ;;\nhpux*)\n  if test \"$host_cpu\" = ia64; then\n    symcode='[ABCDEGRST]'\n  fi\n  ;;\nirix* | nonstopux*)\n  symcode='[BCDEGRST]'\n  ;;\nosf*)\n  symcode='[BCDEGQRST]'\n  ;;\nsolaris*)\n  symcode='[BDRT]'\n  ;;\nsco3.2v5*)\n  symcode='[DT]'\n  ;;\nsysv4.2uw2*)\n  symcode='[DT]'\n  ;;\nsysv5* | sco5v6* | unixware* | OpenUNIX*)\n  symcode='[ABDT]'\n  ;;\nsysv4)\n  symcode='[DFNSTU]'\n  ;;\nesac\n\n# If we're using GNU nm, then use its standard symbol codes.\ncase `$NM -V 2>&1` in\n*GNU* | *'with BFD'*)\n  symcode='[ABCDGIRSTW]' ;;\nesac\n\n# Transform an extracted symbol line into a proper C declaration.\n# Some systems (esp. on ia64) link data and code symbols differently,\n# so use this general approach.\nlt_cv_sys_global_symbol_to_cdecl=\"sed -n -e 's/^T .* \\(.*\\)$/extern int \\1();/p' -e 's/^$symcode* .* \\(.*\\)$/extern char \\1;/p'\"\n\n# Transform an extracted symbol line into symbol name and symbol address\nlt_cv_sys_global_symbol_to_c_name_address=\"sed -n -e 's/^: \\([^ ]*\\)[ ]*$/  {\\\\\\\"\\1\\\\\\\", (void *) 0},/p' -e 's/^$symcode* \\([^ ]*\\) \\([^ ]*\\)$/  {\\\"\\2\\\", (void *) \\&\\2},/p'\"\nlt_cv_sys_global_symbol_to_c_name_address_lib_prefix=\"sed -n -e 's/^: \\([^ ]*\\)[ ]*$/  {\\\\\\\"\\1\\\\\\\", (void *) 0},/p' -e 's/^$symcode* \\([^ ]*\\) \\(lib[^ ]*\\)$/  {\\\"\\2\\\", (void *) \\&\\2},/p' -e 's/^$symcode* \\([^ ]*\\) \\([^ ]*\\)$/  {\\\"lib\\2\\\", (void *) \\&\\2},/p'\"\n\n# Handle CRLF in mingw tool chain\nopt_cr=\ncase $build_os in\nmingw*)\n  opt_cr=`$ECHO 'x\\{0,1\\}' | tr x '\\015'` # option cr in regexp\n  ;;\nesac\n\n# Try without a prefix underscore, then with it.\nfor ac_symprfx in \"\" \"_\"; do\n\n  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.\n  symxfrm=\"\\\\1 $ac_symprfx\\\\2 \\\\2\"\n\n  # Write the raw and C identifiers.\n  if test \"$lt_cv_nm_interface\" = \"MS dumpbin\"; then\n    # Fake it for dumpbin and say T for any non-static function\n    # and D for any global variable.\n    # Also find C++ and __fastcall symbols from MSVC++,\n    # which start with @ or ?.\n    lt_cv_sys_global_symbol_pipe=\"$AWK '\"\\\n\"     {last_section=section; section=\\$ 3};\"\\\n\"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};\"\\\n\"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};\"\\\n\"     \\$ 0!~/External *\\|/{next};\"\\\n\"     / 0+ UNDEF /{next}; / UNDEF \\([^|]\\)*()/{next};\"\\\n\"     {if(hide[section]) next};\"\\\n\"     {f=0}; \\$ 0~/\\(\\).*\\|/{f=1}; {printf f ? \\\"T \\\" : \\\"D \\\"};\"\\\n\"     {split(\\$ 0, a, /\\||\\r/); split(a[2], s)};\"\\\n\"     s[1]~/^[@?]/{print s[1], s[1]; next};\"\\\n\"     s[1]~prfx {split(s[1],t,\\\"@\\\"); print t[1], substr(t[1],length(prfx))}\"\\\n\"     ' prfx=^$ac_symprfx\"\n  else\n    lt_cv_sys_global_symbol_pipe=\"sed -n -e 's/^.*[\t ]\\($symcode$symcode*\\)[\t ][\t ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'\"\n  fi\n  lt_cv_sys_global_symbol_pipe=\"$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'\"\n\n  # Check to see that the pipe works correctly.\n  pipe_works=no\n\n  rm -f conftest*\n  cat > conftest.$ac_ext <<_LT_EOF\n#ifdef __cplusplus\nextern \"C\" {\n#endif\nchar nm_test_var;\nvoid nm_test_func(void);\nvoid nm_test_func(void){}\n#ifdef __cplusplus\n}\n#endif\nint main(){nm_test_var='a';nm_test_func();return(0);}\n_LT_EOF\n\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n    # Now try to grab the symbols.\n    nlist=conftest.nm\n    if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$NM conftest.$ac_objext \\| \"$lt_cv_sys_global_symbol_pipe\" \\> $nlist\\\"\"; } >&5\n  (eval $NM conftest.$ac_objext \\| \"$lt_cv_sys_global_symbol_pipe\" \\> $nlist) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && test -s \"$nlist\"; then\n      # Try sorting and uniquifying the output.\n      if sort \"$nlist\" | uniq > \"$nlist\"T; then\n\tmv -f \"$nlist\"T \"$nlist\"\n      else\n\trm -f \"$nlist\"T\n      fi\n\n      # Make sure that we snagged all the symbols we need.\n      if $GREP ' nm_test_var$' \"$nlist\" >/dev/null; then\n\tif $GREP ' nm_test_func$' \"$nlist\" >/dev/null; then\n\t  cat <<_LT_EOF > conftest.$ac_ext\n/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */\n#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)\n/* DATA imports from DLLs on WIN32 con't be const, because runtime\n   relocations are performed -- see ld's documentation on pseudo-relocs.  */\n# define LT_DLSYM_CONST\n#elif defined(__osf__)\n/* This system does not cope well with relocations in const data.  */\n# define LT_DLSYM_CONST\n#else\n# define LT_DLSYM_CONST const\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n_LT_EOF\n\t  # Now generate the symbol file.\n\t  eval \"$lt_cv_sys_global_symbol_to_cdecl\"' < \"$nlist\" | $GREP -v main >> conftest.$ac_ext'\n\n\t  cat <<_LT_EOF >> conftest.$ac_ext\n\n/* The mapping between symbol names and symbols.  */\nLT_DLSYM_CONST struct {\n  const char *name;\n  void       *address;\n}\nlt__PROGRAM__LTX_preloaded_symbols[] =\n{\n  { \"@PROGRAM@\", (void *) 0 },\n_LT_EOF\n\t  $SED \"s/^$symcode$symcode* \\(.*\\) \\(.*\\)$/  {\\\"\\2\\\", (void *) \\&\\2},/\" < \"$nlist\" | $GREP -v main >> conftest.$ac_ext\n\t  cat <<\\_LT_EOF >> conftest.$ac_ext\n  {0, (void *) 0}\n};\n\n/* This works around a problem in FreeBSD linker */\n#ifdef FREEBSD_WORKAROUND\nstatic const void *lt_preloaded_setup() {\n  return lt__PROGRAM__LTX_preloaded_symbols;\n}\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n_LT_EOF\n\t  # Now try linking the two files.\n\t  mv conftest.$ac_objext conftstm.$ac_objext\n\t  lt_globsym_save_LIBS=$LIBS\n\t  lt_globsym_save_CFLAGS=$CFLAGS\n\t  LIBS=\"conftstm.$ac_objext\"\n\t  CFLAGS=\"$CFLAGS$lt_prog_compiler_no_builtin_flag\"\n\t  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_link\\\"\"; } >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && test -s conftest${ac_exeext}; then\n\t    pipe_works=yes\n\t  fi\n\t  LIBS=$lt_globsym_save_LIBS\n\t  CFLAGS=$lt_globsym_save_CFLAGS\n\telse\n\t  echo \"cannot find nm_test_func in $nlist\" >&5\n\tfi\n      else\n\techo \"cannot find nm_test_var in $nlist\" >&5\n      fi\n    else\n      echo \"cannot run $lt_cv_sys_global_symbol_pipe\" >&5\n    fi\n  else\n    echo \"$progname: failed program was:\" >&5\n    cat conftest.$ac_ext >&5\n  fi\n  rm -rf conftest* conftst*\n\n  # Do not use the global_symbol_pipe unless it works.\n  if test \"$pipe_works\" = yes; then\n    break\n  else\n    lt_cv_sys_global_symbol_pipe=\n  fi\ndone\n\nfi\n\nif test -z \"$lt_cv_sys_global_symbol_pipe\"; then\n  lt_cv_sys_global_symbol_to_cdecl=\nfi\nif test -z \"$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: failed\" >&5\n$as_echo \"failed\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: ok\" >&5\n$as_echo \"ok\" >&6; }\nfi\n\n# Response file support.\nif test \"$lt_cv_nm_interface\" = \"MS dumpbin\"; then\n  nm_file_list_spec='@'\nelif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then\n  nm_file_list_spec='@'\nfi\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{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for sysroot\" >&5\n$as_echo_n \"checking for sysroot... \" >&6; }\n\n# Check whether --with-sysroot was given.\nif test \"${with_sysroot+set}\" = set; then :\n  withval=$with_sysroot;\nelse\n  with_sysroot=no\nfi\n\n\nlt_sysroot=\ncase ${with_sysroot} in #(\n yes)\n   if test \"$GCC\" = yes; then\n     lt_sysroot=`$CC --print-sysroot 2>/dev/null`\n   fi\n   ;; #(\n /*)\n   lt_sysroot=`echo \"$with_sysroot\" | sed -e \"$sed_quote_subst\"`\n   ;; #(\n no|'')\n   ;; #(\n *)\n   { $as_echo \"$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}\" >&5\n$as_echo \"${with_sysroot}\" >&6; }\n   as_fn_error $? \"The sysroot must be an absolute path.\" \"$LINENO\" 5\n   ;;\nesac\n\n { $as_echo \"$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}\" >&5\n$as_echo \"${lt_sysroot:-no}\" >&6; }\n\n\n\n\n\n\n# Check whether --enable-libtool-lock was given.\nif test \"${enable_libtool_lock+set}\" = set; then :\n  enableval=$enable_libtool_lock;\nfi\n\ntest \"x$enable_libtool_lock\" != xno && enable_libtool_lock=yes\n\n# Some flags need to be propagated to the compiler or linker for good\n# libtool support.\ncase $host in\nia64-*-hpux*)\n  # Find out which ABI we are using.\n  echo 'int i;' > conftest.$ac_ext\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n    case `/usr/bin/file conftest.$ac_objext` in\n      *ELF-32*)\n\tHPUX_IA64_MODE=\"32\"\n\t;;\n      *ELF-64*)\n\tHPUX_IA64_MODE=\"64\"\n\t;;\n    esac\n  fi\n  rm -rf conftest*\n  ;;\n*-*-irix6*)\n  # Find out which ABI we are using.\n  echo '#line '$LINENO' \"configure\"' > conftest.$ac_ext\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n    if test \"$lt_cv_prog_gnu_ld\" = yes; then\n      case `/usr/bin/file conftest.$ac_objext` in\n\t*32-bit*)\n\t  LD=\"${LD-ld} -melf32bsmip\"\n\t  ;;\n\t*N32*)\n\t  LD=\"${LD-ld} -melf32bmipn32\"\n\t  ;;\n\t*64-bit*)\n\t  LD=\"${LD-ld} -melf64bmip\"\n\t;;\n      esac\n    else\n      case `/usr/bin/file conftest.$ac_objext` in\n\t*32-bit*)\n\t  LD=\"${LD-ld} -32\"\n\t  ;;\n\t*N32*)\n\t  LD=\"${LD-ld} -n32\"\n\t  ;;\n\t*64-bit*)\n\t  LD=\"${LD-ld} -64\"\n\t  ;;\n      esac\n    fi\n  fi\n  rm -rf conftest*\n  ;;\n\nx86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \\\ns390*-*linux*|s390*-*tpf*|sparc*-*linux*)\n  # Find out which ABI we are using.\n  echo 'int i;' > conftest.$ac_ext\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n    case `/usr/bin/file conftest.o` in\n      *32-bit*)\n\tcase $host in\n\t  x86_64-*kfreebsd*-gnu)\n\t    LD=\"${LD-ld} -m elf_i386_fbsd\"\n\t    ;;\n\t  x86_64-*linux*)\n\t    LD=\"${LD-ld} -m elf_i386\"\n\t    ;;\n\t  ppc64-*linux*|powerpc64-*linux*)\n\t    LD=\"${LD-ld} -m elf32ppclinux\"\n\t    ;;\n\t  s390x-*linux*)\n\t    LD=\"${LD-ld} -m elf_s390\"\n\t    ;;\n\t  sparc64-*linux*)\n\t    LD=\"${LD-ld} -m elf32_sparc\"\n\t    ;;\n\tesac\n\t;;\n      *64-bit*)\n\tcase $host in\n\t  x86_64-*kfreebsd*-gnu)\n\t    LD=\"${LD-ld} -m elf_x86_64_fbsd\"\n\t    ;;\n\t  x86_64-*linux*)\n\t    LD=\"${LD-ld} -m elf_x86_64\"\n\t    ;;\n\t  ppc*-*linux*|powerpc*-*linux*)\n\t    LD=\"${LD-ld} -m elf64ppc\"\n\t    ;;\n\t  s390*-*linux*|s390*-*tpf*)\n\t    LD=\"${LD-ld} -m elf64_s390\"\n\t    ;;\n\t  sparc*-*linux*)\n\t    LD=\"${LD-ld} -m elf64_sparc\"\n\t    ;;\n\tesac\n\t;;\n    esac\n  fi\n  rm -rf conftest*\n  ;;\n\n*-*-sco3.2v5*)\n  # On SCO OpenServer 5, we need -belf to get full-featured binaries.\n  SAVE_CFLAGS=\"$CFLAGS\"\n  CFLAGS=\"$CFLAGS -belf\"\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf\" >&5\n$as_echo_n \"checking whether the C compiler needs -belf... \" >&6; }\nif ${lt_cv_cc_needs_belf+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n     cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  lt_cv_cc_needs_belf=yes\nelse\n  lt_cv_cc_needs_belf=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n     ac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf\" >&5\n$as_echo \"$lt_cv_cc_needs_belf\" >&6; }\n  if test x\"$lt_cv_cc_needs_belf\" != x\"yes\"; then\n    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf\n    CFLAGS=\"$SAVE_CFLAGS\"\n  fi\n  ;;\n*-*solaris*)\n  # Find out which ABI we are using.\n  echo 'int i;' > conftest.$ac_ext\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n    case `/usr/bin/file conftest.o` in\n    *64-bit*)\n      case $lt_cv_prog_gnu_ld in\n      yes*)\n        case $host in\n        i?86-*-solaris*)\n          LD=\"${LD-ld} -m elf_x86_64\"\n          ;;\n        sparc*-*-solaris*)\n          LD=\"${LD-ld} -m elf64_sparc\"\n          ;;\n        esac\n        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.\n        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then\n          LD=\"${LD-ld}_sol2\"\n        fi\n        ;;\n      *)\n\tif ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then\n\t  LD=\"${LD-ld} -64\"\n\tfi\n\t;;\n      esac\n      ;;\n    esac\n  fi\n  rm -rf conftest*\n  ;;\nesac\n\nneed_locks=\"$enable_libtool_lock\"\n\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}mt\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}mt; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_MANIFEST_TOOL+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$MANIFEST_TOOL\"; then\n  ac_cv_prog_MANIFEST_TOOL=\"$MANIFEST_TOOL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_MANIFEST_TOOL=\"${ac_tool_prefix}mt\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nMANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL\nif test -n \"$MANIFEST_TOOL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL\" >&5\n$as_echo \"$MANIFEST_TOOL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_MANIFEST_TOOL\"; then\n  ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL\n  # Extract the first word of \"mt\", so it can be a program name with args.\nset dummy mt; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_MANIFEST_TOOL\"; then\n  ac_cv_prog_ac_ct_MANIFEST_TOOL=\"$ac_ct_MANIFEST_TOOL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_MANIFEST_TOOL=\"mt\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL\nif test -n \"$ac_ct_MANIFEST_TOOL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL\" >&5\n$as_echo \"$ac_ct_MANIFEST_TOOL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_MANIFEST_TOOL\" = x; then\n    MANIFEST_TOOL=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL\n  fi\nelse\n  MANIFEST_TOOL=\"$ac_cv_prog_MANIFEST_TOOL\"\nfi\n\ntest -z \"$MANIFEST_TOOL\" && MANIFEST_TOOL=mt\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool\" >&5\n$as_echo_n \"checking if $MANIFEST_TOOL is a manifest tool... \" >&6; }\nif ${lt_cv_path_mainfest_tool+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_path_mainfest_tool=no\n  echo \"$as_me:$LINENO: $MANIFEST_TOOL '-?'\" >&5\n  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out\n  cat conftest.err >&5\n  if $GREP 'Manifest Tool' conftest.out > /dev/null; then\n    lt_cv_path_mainfest_tool=yes\n  fi\n  rm -f conftest*\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool\" >&5\n$as_echo \"$lt_cv_path_mainfest_tool\" >&6; }\nif test \"x$lt_cv_path_mainfest_tool\" != xyes; then\n  MANIFEST_TOOL=:\nfi\n\n\n\n\n\n\n  case $host_os in\n    rhapsody* | darwin*)\n    if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}dsymutil\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}dsymutil; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_DSYMUTIL+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$DSYMUTIL\"; then\n  ac_cv_prog_DSYMUTIL=\"$DSYMUTIL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_DSYMUTIL=\"${ac_tool_prefix}dsymutil\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nDSYMUTIL=$ac_cv_prog_DSYMUTIL\nif test -n \"$DSYMUTIL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL\" >&5\n$as_echo \"$DSYMUTIL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_DSYMUTIL\"; then\n  ac_ct_DSYMUTIL=$DSYMUTIL\n  # Extract the first word of \"dsymutil\", so it can be a program name with args.\nset dummy dsymutil; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_DSYMUTIL\"; then\n  ac_cv_prog_ac_ct_DSYMUTIL=\"$ac_ct_DSYMUTIL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_DSYMUTIL=\"dsymutil\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL\nif test -n \"$ac_ct_DSYMUTIL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL\" >&5\n$as_echo \"$ac_ct_DSYMUTIL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_DSYMUTIL\" = x; then\n    DSYMUTIL=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    DSYMUTIL=$ac_ct_DSYMUTIL\n  fi\nelse\n  DSYMUTIL=\"$ac_cv_prog_DSYMUTIL\"\nfi\n\n    if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}nmedit\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}nmedit; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_NMEDIT+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$NMEDIT\"; then\n  ac_cv_prog_NMEDIT=\"$NMEDIT\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_NMEDIT=\"${ac_tool_prefix}nmedit\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nNMEDIT=$ac_cv_prog_NMEDIT\nif test -n \"$NMEDIT\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $NMEDIT\" >&5\n$as_echo \"$NMEDIT\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_NMEDIT\"; then\n  ac_ct_NMEDIT=$NMEDIT\n  # Extract the first word of \"nmedit\", so it can be a program name with args.\nset dummy nmedit; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_NMEDIT+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_NMEDIT\"; then\n  ac_cv_prog_ac_ct_NMEDIT=\"$ac_ct_NMEDIT\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_NMEDIT=\"nmedit\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT\nif test -n \"$ac_ct_NMEDIT\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT\" >&5\n$as_echo \"$ac_ct_NMEDIT\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_NMEDIT\" = x; then\n    NMEDIT=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    NMEDIT=$ac_ct_NMEDIT\n  fi\nelse\n  NMEDIT=\"$ac_cv_prog_NMEDIT\"\nfi\n\n    if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}lipo\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}lipo; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_LIPO+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$LIPO\"; then\n  ac_cv_prog_LIPO=\"$LIPO\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_LIPO=\"${ac_tool_prefix}lipo\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nLIPO=$ac_cv_prog_LIPO\nif test -n \"$LIPO\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $LIPO\" >&5\n$as_echo \"$LIPO\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_LIPO\"; then\n  ac_ct_LIPO=$LIPO\n  # Extract the first word of \"lipo\", so it can be a program name with args.\nset dummy lipo; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_LIPO+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_LIPO\"; then\n  ac_cv_prog_ac_ct_LIPO=\"$ac_ct_LIPO\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_LIPO=\"lipo\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO\nif test -n \"$ac_ct_LIPO\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO\" >&5\n$as_echo \"$ac_ct_LIPO\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_LIPO\" = x; then\n    LIPO=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    LIPO=$ac_ct_LIPO\n  fi\nelse\n  LIPO=\"$ac_cv_prog_LIPO\"\nfi\n\n    if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}otool\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}otool; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_OTOOL+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$OTOOL\"; then\n  ac_cv_prog_OTOOL=\"$OTOOL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_OTOOL=\"${ac_tool_prefix}otool\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nOTOOL=$ac_cv_prog_OTOOL\nif test -n \"$OTOOL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $OTOOL\" >&5\n$as_echo \"$OTOOL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_OTOOL\"; then\n  ac_ct_OTOOL=$OTOOL\n  # Extract the first word of \"otool\", so it can be a program name with args.\nset dummy otool; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_OTOOL+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_OTOOL\"; then\n  ac_cv_prog_ac_ct_OTOOL=\"$ac_ct_OTOOL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_OTOOL=\"otool\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL\nif test -n \"$ac_ct_OTOOL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL\" >&5\n$as_echo \"$ac_ct_OTOOL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_OTOOL\" = x; then\n    OTOOL=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    OTOOL=$ac_ct_OTOOL\n  fi\nelse\n  OTOOL=\"$ac_cv_prog_OTOOL\"\nfi\n\n    if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}otool64\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}otool64; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_OTOOL64+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$OTOOL64\"; then\n  ac_cv_prog_OTOOL64=\"$OTOOL64\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_OTOOL64=\"${ac_tool_prefix}otool64\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nOTOOL64=$ac_cv_prog_OTOOL64\nif test -n \"$OTOOL64\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $OTOOL64\" >&5\n$as_echo \"$OTOOL64\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_OTOOL64\"; then\n  ac_ct_OTOOL64=$OTOOL64\n  # Extract the first word of \"otool64\", so it can be a program name with args.\nset dummy otool64; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_OTOOL64+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_OTOOL64\"; then\n  ac_cv_prog_ac_ct_OTOOL64=\"$ac_ct_OTOOL64\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_OTOOL64=\"otool64\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64\nif test -n \"$ac_ct_OTOOL64\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64\" >&5\n$as_echo \"$ac_ct_OTOOL64\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_OTOOL64\" = x; then\n    OTOOL64=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    OTOOL64=$ac_ct_OTOOL64\n  fi\nelse\n  OTOOL64=\"$ac_cv_prog_OTOOL64\"\nfi\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    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag\" >&5\n$as_echo_n \"checking for -single_module linker flag... \" >&6; }\nif ${lt_cv_apple_cc_single_mod+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_apple_cc_single_mod=no\n      if test -z \"${LT_MULTI_MODULE}\"; then\n\t# By default we will add the -single_module flag. You can override\n\t# by either setting the environment variable LT_MULTI_MODULE\n\t# non-empty at configure time, or by adding -multi_module to the\n\t# link flags.\n\trm -rf libconftest.dylib*\n\techo \"int foo(void){return 1;}\" > conftest.c\n\techo \"$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \\\n-dynamiclib -Wl,-single_module conftest.c\" >&5\n\t$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \\\n\t  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err\n        _lt_result=$?\n\t# If there is a non-empty error log, and \"single_module\"\n\t# appears in it, assume the flag caused a linker warning\n        if test -s conftest.err && $GREP single_module conftest.err; then\n\t  cat conftest.err >&5\n\t# Otherwise, if the output was created with a 0 exit code from\n\t# the compiler, it worked.\n\telif test -f libconftest.dylib && test $_lt_result -eq 0; then\n\t  lt_cv_apple_cc_single_mod=yes\n\telse\n\t  cat conftest.err >&5\n\tfi\n\trm -rf libconftest.dylib*\n\trm -f conftest.*\n      fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod\" >&5\n$as_echo \"$lt_cv_apple_cc_single_mod\" >&6; }\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag\" >&5\n$as_echo_n \"checking for -exported_symbols_list linker flag... \" >&6; }\nif ${lt_cv_ld_exported_symbols_list+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_ld_exported_symbols_list=no\n      save_LDFLAGS=$LDFLAGS\n      echo \"_main\" > conftest.sym\n      LDFLAGS=\"$LDFLAGS -Wl,-exported_symbols_list,conftest.sym\"\n      cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  lt_cv_ld_exported_symbols_list=yes\nelse\n  lt_cv_ld_exported_symbols_list=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n\tLDFLAGS=\"$save_LDFLAGS\"\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list\" >&5\n$as_echo \"$lt_cv_ld_exported_symbols_list\" >&6; }\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag\" >&5\n$as_echo_n \"checking for -force_load linker flag... \" >&6; }\nif ${lt_cv_ld_force_load+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_ld_force_load=no\n      cat > conftest.c << _LT_EOF\nint forced_loaded() { return 2;}\n_LT_EOF\n      echo \"$LTCC $LTCFLAGS -c -o conftest.o conftest.c\" >&5\n      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5\n      echo \"$AR cru libconftest.a conftest.o\" >&5\n      $AR cru libconftest.a conftest.o 2>&5\n      echo \"$RANLIB libconftest.a\" >&5\n      $RANLIB libconftest.a 2>&5\n      cat > conftest.c << _LT_EOF\nint main() { return 0;}\n_LT_EOF\n      echo \"$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a\" >&5\n      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err\n      _lt_result=$?\n      if test -s conftest.err && $GREP force_load conftest.err; then\n\tcat conftest.err >&5\n      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then\n\tlt_cv_ld_force_load=yes\n      else\n\tcat conftest.err >&5\n      fi\n        rm -f conftest.err libconftest.a conftest conftest.c\n        rm -rf conftest.dSYM\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load\" >&5\n$as_echo \"$lt_cv_ld_force_load\" >&6; }\n    case $host_os in\n    rhapsody* | darwin1.[012])\n      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;\n    darwin1.*)\n      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;\n    darwin*) # darwin 5.x on\n      # if running on 10.5 or later, the deployment target defaults\n      # to the OS version, if on x86, and 10.4, the deployment\n      # target defaults to 10.4. Don't you love it?\n      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in\n\t10.0,*86*-darwin8*|10.0,*-darwin[91]*)\n\t  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;\n\t10.[012]*)\n\t  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;\n\t10.*)\n\t  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;\n      esac\n    ;;\n  esac\n    if test \"$lt_cv_apple_cc_single_mod\" = \"yes\"; then\n      _lt_dar_single_mod='$single_module'\n    fi\n    if test \"$lt_cv_ld_exported_symbols_list\" = \"yes\"; then\n      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'\n    else\n      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'\n    fi\n    if test \"$DSYMUTIL\" != \":\" && test \"$lt_cv_ld_force_load\" = \"no\"; then\n      _lt_dsymutil='~$DSYMUTIL $lib || :'\n    else\n      _lt_dsymutil=\n    fi\n    ;;\n  esac\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor\" >&5\n$as_echo_n \"checking how to run the C preprocessor... \" >&6; }\n# On Suns, sometimes $CPP names a directory.\nif test -n \"$CPP\" && test -d \"$CPP\"; then\n  CPP=\nfi\nif test -z \"$CPP\"; then\n  if ${ac_cv_prog_CPP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n      # Double quotes because CPP needs to be expanded\n    for CPP in \"$CC -E\" \"$CC -E -traditional-cpp\" \"/lib/cpp\"\n    do\n      ac_preproc_ok=false\nfor ac_c_preproc_warn_flag in '' yes\ndo\n  # Use a header file that comes with gcc, so configuring glibc\n  # with a fresh cross-compiler works.\n  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n  # <limits.h> exists even on freestanding compilers.\n  # On the NeXT, cc -E runs the code through the compiler's parser,\n  # not just through cpp. \"Syntax error\" is here to catch this case.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n\t\t     Syntax error\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n\nelse\n  # Broken: fails on valid input.\ncontinue\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\n  # OK, works on sane cases.  Now check whether nonexistent headers\n  # can be detected and how.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <ac_nonexistent.h>\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n  # Broken: success on invalid input.\ncontinue\nelse\n  # Passes both tests.\nac_preproc_ok=:\nbreak\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\ndone\n# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.\nrm -f conftest.i conftest.err conftest.$ac_ext\nif $ac_preproc_ok; then :\n  break\nfi\n\n    done\n    ac_cv_prog_CPP=$CPP\n\nfi\n  CPP=$ac_cv_prog_CPP\nelse\n  ac_cv_prog_CPP=$CPP\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CPP\" >&5\n$as_echo \"$CPP\" >&6; }\nac_preproc_ok=false\nfor ac_c_preproc_warn_flag in '' yes\ndo\n  # Use a header file that comes with gcc, so configuring glibc\n  # with a fresh cross-compiler works.\n  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n  # <limits.h> exists even on freestanding compilers.\n  # On the NeXT, cc -E runs the code through the compiler's parser,\n  # not just through cpp. \"Syntax error\" is here to catch this case.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n\t\t     Syntax error\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n\nelse\n  # Broken: fails on valid input.\ncontinue\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\n  # OK, works on sane cases.  Now check whether nonexistent headers\n  # can be detected and how.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <ac_nonexistent.h>\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n  # Broken: success on invalid input.\ncontinue\nelse\n  # Passes both tests.\nac_preproc_ok=:\nbreak\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\ndone\n# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.\nrm -f conftest.i conftest.err conftest.$ac_ext\nif $ac_preproc_ok; then :\n\nelse\n  { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"C preprocessor \\\"$CPP\\\" fails sanity check\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\nfi\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for ANSI C header files\" >&5\n$as_echo_n \"checking for ANSI C header files... \" >&6; }\nif ${ac_cv_header_stdc+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdlib.h>\n#include <stdarg.h>\n#include <string.h>\n#include <float.h>\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_header_stdc=yes\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n\nif test $ac_cv_header_stdc = yes; then\n  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <string.h>\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"memchr\" >/dev/null 2>&1; then :\n\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f conftest*\n\nfi\n\nif test $ac_cv_header_stdc = yes; then\n  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdlib.h>\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"free\" >/dev/null 2>&1; then :\n\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f conftest*\n\nfi\n\nif test $ac_cv_header_stdc = yes; then\n  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.\n  if test \"$cross_compiling\" = yes; then :\n  :\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <ctype.h>\n#include <stdlib.h>\n#if ((' ' & 0x0FF) == 0x020)\n# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')\n# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))\n#else\n# define ISLOWER(c) \\\n\t\t   (('a' <= (c) && (c) <= 'i') \\\n\t\t     || ('j' <= (c) && (c) <= 'r') \\\n\t\t     || ('s' <= (c) && (c) <= 'z'))\n# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))\n#endif\n\n#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))\nint\nmain ()\n{\n  int i;\n  for (i = 0; i < 256; i++)\n    if (XOR (islower (i), ISLOWER (i))\n\t|| toupper (i) != TOUPPER (i))\n      return 2;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_run \"$LINENO\"; then :\n\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \\\n  conftest.$ac_objext conftest.beam conftest.$ac_ext\nfi\n\nfi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc\" >&5\n$as_echo \"$ac_cv_header_stdc\" >&6; }\nif test $ac_cv_header_stdc = yes; then\n\n$as_echo \"#define STDC_HEADERS 1\" >>confdefs.h\n\nfi\n\n# On IRIX 5.3, sys/types and inttypes.h are conflicting.\nfor ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \\\n\t\t  inttypes.h stdint.h unistd.h\ndo :\n  as_ac_Header=`$as_echo \"ac_cv_header_$ac_header\" | $as_tr_sh`\nac_fn_c_check_header_compile \"$LINENO\" \"$ac_header\" \"$as_ac_Header\" \"$ac_includes_default\n\"\nif eval test \\\"x\\$\"$as_ac_Header\"\\\" = x\"yes\"; then :\n  cat >>confdefs.h <<_ACEOF\n#define `$as_echo \"HAVE_$ac_header\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\n\ndone\n\n\nfor ac_header in dlfcn.h\ndo :\n  ac_fn_c_check_header_compile \"$LINENO\" \"dlfcn.h\" \"ac_cv_header_dlfcn_h\" \"$ac_includes_default\n\"\nif test \"x$ac_cv_header_dlfcn_h\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_DLFCN_H 1\n_ACEOF\n\nfi\n\ndone\n\n\n\nfunc_stripname_cnf ()\n{\n  case ${2} in\n  .*) func_stripname_result=`$ECHO \"${3}\" | $SED \"s%^${1}%%; s%\\\\\\\\${2}\\$%%\"`;;\n  *)  func_stripname_result=`$ECHO \"${3}\" | $SED \"s%^${1}%%; s%${2}\\$%%\"`;;\n  esac\n} # func_stripname_cnf\n\n\n\n\n\n# Set options\n\n\n\n        enable_dlopen=no\n\n\n  enable_win32_dll=no\n\n\n            # Check whether --enable-shared was given.\nif test \"${enable_shared+set}\" = set; then :\n  enableval=$enable_shared; p=${PACKAGE-default}\n    case $enableval in\n    yes) enable_shared=yes ;;\n    no) enable_shared=no ;;\n    *)\n      enable_shared=no\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=\"$IFS\"; IFS=\"${IFS}$PATH_SEPARATOR,\"\n      for pkg in $enableval; do\n\tIFS=\"$lt_save_ifs\"\n\tif test \"X$pkg\" = \"X$p\"; then\n\t  enable_shared=yes\n\tfi\n      done\n      IFS=\"$lt_save_ifs\"\n      ;;\n    esac\nelse\n  enable_shared=yes\nfi\n\n\n\n\n\n\n\n\n\n\n\n# Check whether --with-pic was given.\nif test \"${with_pic+set}\" = set; then :\n  withval=$with_pic; lt_p=${PACKAGE-default}\n    case $withval in\n    yes|no) pic_mode=$withval ;;\n    *)\n      pic_mode=default\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=\"$IFS\"; IFS=\"${IFS}$PATH_SEPARATOR,\"\n      for lt_pkg in $withval; do\n\tIFS=\"$lt_save_ifs\"\n\tif test \"X$lt_pkg\" = \"X$lt_p\"; then\n\t  pic_mode=yes\n\tfi\n      done\n      IFS=\"$lt_save_ifs\"\n      ;;\n    esac\nelse\n  pic_mode=default\nfi\n\n\ntest -z \"$pic_mode\" && pic_mode=default\n\n\n\n\n\n\n\n  # Check whether --enable-fast-install was given.\nif test \"${enable_fast_install+set}\" = set; then :\n  enableval=$enable_fast_install; p=${PACKAGE-default}\n    case $enableval in\n    yes) enable_fast_install=yes ;;\n    no) enable_fast_install=no ;;\n    *)\n      enable_fast_install=no\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=\"$IFS\"; IFS=\"${IFS}$PATH_SEPARATOR,\"\n      for pkg in $enableval; do\n\tIFS=\"$lt_save_ifs\"\n\tif test \"X$pkg\" = \"X$p\"; then\n\t  enable_fast_install=yes\n\tfi\n      done\n      IFS=\"$lt_save_ifs\"\n      ;;\n    esac\nelse\n  enable_fast_install=yes\nfi\n\n\n\n\n\n\n\n\n\n\n\n# This can be used to rebuild libtool when needed\nLIBTOOL_DEPS=\"$ltmain\"\n\n# Always use our own libtool.\nLIBTOOL='$(SHELL) $(top_builddir)/libtool'\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\n\ntest -z \"$LN_S\" && LN_S=\"ln -s\"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nif test -n \"${ZSH_VERSION+set}\" ; then\n   setopt NO_GLOB_SUBST\nfi\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for objdir\" >&5\n$as_echo_n \"checking for objdir... \" >&6; }\nif ${lt_cv_objdir+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  rm -f .libs 2>/dev/null\nmkdir .libs 2>/dev/null\nif test -d .libs; then\n  lt_cv_objdir=.libs\nelse\n  # MS-DOS does not allow filenames that begin with a dot.\n  lt_cv_objdir=_libs\nfi\nrmdir .libs 2>/dev/null\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir\" >&5\n$as_echo \"$lt_cv_objdir\" >&6; }\nobjdir=$lt_cv_objdir\n\n\n\n\n\ncat >>confdefs.h <<_ACEOF\n#define LT_OBJDIR \"$lt_cv_objdir/\"\n_ACEOF\n\n\n\n\ncase $host_os in\naix3*)\n  # AIX sometimes has problems with the GCC collect2 program.  For some\n  # reason, if we set the COLLECT_NAMES environment variable, the problems\n  # vanish in a puff of smoke.\n  if test \"X${COLLECT_NAMES+set}\" != Xset; then\n    COLLECT_NAMES=\n    export COLLECT_NAMES\n  fi\n  ;;\nesac\n\n# Global variables:\nofile=libtool\ncan_build_shared=yes\n\n# All known linkers require a `.a' archive for static linking (except MSVC,\n# which needs '.lib').\nlibext=a\n\nwith_gnu_ld=\"$lt_cv_prog_gnu_ld\"\n\nold_CC=\"$CC\"\nold_CFLAGS=\"$CFLAGS\"\n\n# Set sane defaults for various variables\ntest -z \"$CC\" && CC=cc\ntest -z \"$LTCC\" && LTCC=$CC\ntest -z \"$LTCFLAGS\" && LTCFLAGS=$CFLAGS\ntest -z \"$LD\" && LD=ld\ntest -z \"$ac_objext\" && ac_objext=o\n\nfor cc_temp in $compiler\"\"; do\n  case $cc_temp in\n    compile | *[\\\\/]compile | ccache | *[\\\\/]ccache ) ;;\n    distcc | *[\\\\/]distcc | purify | *[\\\\/]purify ) ;;\n    \\-*) ;;\n    *) break;;\n  esac\ndone\ncc_basename=`$ECHO \"$cc_temp\" | $SED \"s%.*/%%; s%^$host_alias-%%\"`\n\n\n# Only perform the check for file, if the check method requires it\ntest -z \"$MAGIC_CMD\" && MAGIC_CMD=file\ncase $deplibs_check_method in\nfile_magic*)\n  if test \"$file_magic_cmd\" = '$MAGIC_CMD'; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file\" >&5\n$as_echo_n \"checking for ${ac_tool_prefix}file... \" >&6; }\nif ${lt_cv_path_MAGIC_CMD+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case $MAGIC_CMD in\n[\\\\/*] |  ?:[\\\\/]*)\n  lt_cv_path_MAGIC_CMD=\"$MAGIC_CMD\" # Let the user override the test with a path.\n  ;;\n*)\n  lt_save_MAGIC_CMD=\"$MAGIC_CMD\"\n  lt_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n  ac_dummy=\"/usr/bin$PATH_SEPARATOR$PATH\"\n  for ac_dir in $ac_dummy; do\n    IFS=\"$lt_save_ifs\"\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f $ac_dir/${ac_tool_prefix}file; then\n      lt_cv_path_MAGIC_CMD=\"$ac_dir/${ac_tool_prefix}file\"\n      if test -n \"$file_magic_test_file\"; then\n\tcase $deplibs_check_method in\n\t\"file_magic \"*)\n\t  file_magic_regex=`expr \"$deplibs_check_method\" : \"file_magic \\(.*\\)\"`\n\t  MAGIC_CMD=\"$lt_cv_path_MAGIC_CMD\"\n\t  if eval $file_magic_cmd \\$file_magic_test_file 2> /dev/null |\n\t    $EGREP \"$file_magic_regex\" > /dev/null; then\n\t    :\n\t  else\n\t    cat <<_LT_EOF 1>&2\n\n*** Warning: the command libtool uses to detect shared libraries,\n*** $file_magic_cmd, produces output that libtool cannot recognize.\n*** The result is that libtool may fail to recognize shared libraries\n*** as such.  This will affect the creation of libtool libraries that\n*** depend on shared libraries, but programs linked with such libtool\n*** libraries will work regardless of this problem.  Nevertheless, you\n*** may want to report the problem to your system manager and/or to\n*** bug-libtool@gnu.org\n\n_LT_EOF\n\t  fi ;;\n\tesac\n      fi\n      break\n    fi\n  done\n  IFS=\"$lt_save_ifs\"\n  MAGIC_CMD=\"$lt_save_MAGIC_CMD\"\n  ;;\nesac\nfi\n\nMAGIC_CMD=\"$lt_cv_path_MAGIC_CMD\"\nif test -n \"$MAGIC_CMD\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD\" >&5\n$as_echo \"$MAGIC_CMD\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n\n\n\nif test -z \"$lt_cv_path_MAGIC_CMD\"; then\n  if test -n \"$ac_tool_prefix\"; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for file\" >&5\n$as_echo_n \"checking for file... \" >&6; }\nif ${lt_cv_path_MAGIC_CMD+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case $MAGIC_CMD in\n[\\\\/*] |  ?:[\\\\/]*)\n  lt_cv_path_MAGIC_CMD=\"$MAGIC_CMD\" # Let the user override the test with a path.\n  ;;\n*)\n  lt_save_MAGIC_CMD=\"$MAGIC_CMD\"\n  lt_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n  ac_dummy=\"/usr/bin$PATH_SEPARATOR$PATH\"\n  for ac_dir in $ac_dummy; do\n    IFS=\"$lt_save_ifs\"\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f $ac_dir/file; then\n      lt_cv_path_MAGIC_CMD=\"$ac_dir/file\"\n      if test -n \"$file_magic_test_file\"; then\n\tcase $deplibs_check_method in\n\t\"file_magic \"*)\n\t  file_magic_regex=`expr \"$deplibs_check_method\" : \"file_magic \\(.*\\)\"`\n\t  MAGIC_CMD=\"$lt_cv_path_MAGIC_CMD\"\n\t  if eval $file_magic_cmd \\$file_magic_test_file 2> /dev/null |\n\t    $EGREP \"$file_magic_regex\" > /dev/null; then\n\t    :\n\t  else\n\t    cat <<_LT_EOF 1>&2\n\n*** Warning: the command libtool uses to detect shared libraries,\n*** $file_magic_cmd, produces output that libtool cannot recognize.\n*** The result is that libtool may fail to recognize shared libraries\n*** as such.  This will affect the creation of libtool libraries that\n*** depend on shared libraries, but programs linked with such libtool\n*** libraries will work regardless of this problem.  Nevertheless, you\n*** may want to report the problem to your system manager and/or to\n*** bug-libtool@gnu.org\n\n_LT_EOF\n\t  fi ;;\n\tesac\n      fi\n      break\n    fi\n  done\n  IFS=\"$lt_save_ifs\"\n  MAGIC_CMD=\"$lt_save_MAGIC_CMD\"\n  ;;\nesac\nfi\n\nMAGIC_CMD=\"$lt_cv_path_MAGIC_CMD\"\nif test -n \"$MAGIC_CMD\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD\" >&5\n$as_echo \"$MAGIC_CMD\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  else\n    MAGIC_CMD=:\n  fi\nfi\n\n  fi\n  ;;\nesac\n\n# Use C for the default configuration in the libtool script\n\nlt_save_CC=\"$CC\"\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n\n# Source file extension for C test sources.\nac_ext=c\n\n# Object file extension for compiled C test sources.\nobjext=o\nobjext=$objext\n\n# Code to be used in simple compile tests\nlt_simple_compile_test_code=\"int some_variable = 0;\"\n\n# Code to be used in simple link tests\nlt_simple_link_test_code='int main(){return(0);}'\n\n\n\n\n\n\n\n# If no C compiler was specified, use CC.\nLTCC=${LTCC-\"$CC\"}\n\n# If no C compiler flags were specified, use CFLAGS.\nLTCFLAGS=${LTCFLAGS-\"$CFLAGS\"}\n\n# Allow CC to be a program name with arguments.\ncompiler=$CC\n\n# Save the default compiler, since it gets overwritten when the other\n# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.\ncompiler_DEFAULT=$CC\n\n# save warnings/boilerplate of simple test code\nac_outfile=conftest.$ac_objext\necho \"$lt_simple_compile_test_code\" >conftest.$ac_ext\neval \"$ac_compile\" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err\n_lt_compiler_boilerplate=`cat conftest.err`\n$RM conftest*\n\nac_outfile=conftest.$ac_objext\necho \"$lt_simple_link_test_code\" >conftest.$ac_ext\neval \"$ac_link\" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err\n_lt_linker_boilerplate=`cat conftest.err`\n$RM -r conftest*\n\n\n## CAVEAT EMPTOR:\n## There is no encapsulation within the following macros, do not change\n## the running order or otherwise move them around unless you know exactly\n## what you are doing...\nif test -n \"$compiler\"; then\n\nlt_prog_compiler_no_builtin_flag=\n\nif test \"$GCC\" = yes; then\n  case $cc_basename in\n  nvcc*)\n    lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;\n  *)\n    lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;\n  esac\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions\" >&5\n$as_echo_n \"checking if $compiler supports -fno-rtti -fno-exceptions... \" >&6; }\nif ${lt_cv_prog_compiler_rtti_exceptions+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_rtti_exceptions=no\n   ac_outfile=conftest.$ac_objext\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n   lt_compiler_flag=\"-fno-rtti -fno-exceptions\"\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   # The option is referenced via a variable to avoid confusing sed.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [^ ]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:$LINENO: $lt_compile\\\"\" >&5)\n   (eval \"$lt_compile\" 2>conftest.err)\n   ac_status=$?\n   cat conftest.err >&5\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n   if (exit $ac_status) && test -s \"$ac_outfile\"; then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings other than the usual output.\n     $ECHO \"$_lt_compiler_boilerplate\" | $SED '/^$/d' >conftest.exp\n     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2\n     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then\n       lt_cv_prog_compiler_rtti_exceptions=yes\n     fi\n   fi\n   $RM conftest*\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions\" >&5\n$as_echo \"$lt_cv_prog_compiler_rtti_exceptions\" >&6; }\n\nif test x\"$lt_cv_prog_compiler_rtti_exceptions\" = xyes; then\n    lt_prog_compiler_no_builtin_flag=\"$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions\"\nelse\n    :\nfi\n\nfi\n\n\n\n\n\n\n  lt_prog_compiler_wl=\nlt_prog_compiler_pic=\nlt_prog_compiler_static=\n\n\n  if test \"$GCC\" = yes; then\n    lt_prog_compiler_wl='-Wl,'\n    lt_prog_compiler_static='-static'\n\n    case $host_os in\n      aix*)\n      # All AIX code is PIC.\n      if test \"$host_cpu\" = ia64; then\n\t# AIX 5 now supports IA64 processor\n\tlt_prog_compiler_static='-Bstatic'\n      fi\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            lt_prog_compiler_pic='-fPIC'\n        ;;\n      m68k)\n            # FIXME: we need at least 68020 code to build shared libraries, but\n            # adding the `-m68020' flag to GCC prevents building anything better,\n            # like `-m68040'.\n            lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'\n        ;;\n      esac\n      ;;\n\n    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)\n      # PIC is the default for these OSes.\n      ;;\n\n    mingw* | cygwin* | pw32* | os2* | cegcc*)\n      # This hack is so that the source file can tell whether it is being\n      # built for inclusion in a dll (and should export symbols for example).\n      # Although the cygwin gcc ignores -fPIC, still need this for old-style\n      # (--disable-auto-import) libraries\n      lt_prog_compiler_pic='-DDLL_EXPORT'\n      ;;\n\n    darwin* | rhapsody*)\n      # PIC is the default on this platform\n      # Common symbols not allowed in MH_DYLIB files\n      lt_prog_compiler_pic='-fno-common'\n      ;;\n\n    haiku*)\n      # PIC is the default for Haiku.\n      # The \"-static\" flag exists, but is broken.\n      lt_prog_compiler_static=\n      ;;\n\n    hpux*)\n      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit\n      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag\n      # sets the default TLS model and affects inlining.\n      case $host_cpu in\n      hppa*64*)\n\t# +Z the default\n\t;;\n      *)\n\tlt_prog_compiler_pic='-fPIC'\n\t;;\n      esac\n      ;;\n\n    interix[3-9]*)\n      # Interix 3.x gcc -fpic/-fPIC options generate broken code.\n      # Instead, we relocate shared libraries at runtime.\n      ;;\n\n    msdosdjgpp*)\n      # Just because we use GCC doesn't mean we suddenly get shared libraries\n      # on systems that don't support them.\n      lt_prog_compiler_can_build_shared=no\n      enable_shared=no\n      ;;\n\n    *nto* | *qnx*)\n      # QNX uses GNU C++, but need to define -shared option too, otherwise\n      # it will coredump.\n      lt_prog_compiler_pic='-fPIC -shared'\n      ;;\n\n    sysv4*MP*)\n      if test -d /usr/nec; then\n\tlt_prog_compiler_pic=-Kconform_pic\n      fi\n      ;;\n\n    *)\n      lt_prog_compiler_pic='-fPIC'\n      ;;\n    esac\n\n    case $cc_basename in\n    nvcc*) # Cuda Compiler Driver 2.2\n      lt_prog_compiler_wl='-Xlinker '\n      if test -n \"$lt_prog_compiler_pic\"; then\n        lt_prog_compiler_pic=\"-Xcompiler $lt_prog_compiler_pic\"\n      fi\n      ;;\n    esac\n  else\n    # PORTME Check for flag to pass linker flags through the system compiler.\n    case $host_os in\n    aix*)\n      lt_prog_compiler_wl='-Wl,'\n      if test \"$host_cpu\" = ia64; then\n\t# AIX 5 now supports IA64 processor\n\tlt_prog_compiler_static='-Bstatic'\n      else\n\tlt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'\n      fi\n      ;;\n\n    mingw* | cygwin* | pw32* | os2* | cegcc*)\n      # This hack is so that the source file can tell whether it is being\n      # built for inclusion in a dll (and should export symbols for example).\n      lt_prog_compiler_pic='-DDLL_EXPORT'\n      ;;\n\n    hpux9* | hpux10* | hpux11*)\n      lt_prog_compiler_wl='-Wl,'\n      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but\n      # not for PA HP-UX.\n      case $host_cpu in\n      hppa*64*|ia64*)\n\t# +Z the default\n\t;;\n      *)\n\tlt_prog_compiler_pic='+Z'\n\t;;\n      esac\n      # Is there a better lt_prog_compiler_static that works with the bundled CC?\n      lt_prog_compiler_static='${wl}-a ${wl}archive'\n      ;;\n\n    irix5* | irix6* | nonstopux*)\n      lt_prog_compiler_wl='-Wl,'\n      # PIC (with -KPIC) is the default.\n      lt_prog_compiler_static='-non_shared'\n      ;;\n\n    linux* | k*bsd*-gnu | kopensolaris*-gnu)\n      case $cc_basename in\n      # old Intel for x86_64 which still supported -KPIC.\n      ecc*)\n\tlt_prog_compiler_wl='-Wl,'\n\tlt_prog_compiler_pic='-KPIC'\n\tlt_prog_compiler_static='-static'\n        ;;\n      # icc used to be incompatible with GCC.\n      # ICC 10 doesn't accept -KPIC any more.\n      icc* | ifort*)\n\tlt_prog_compiler_wl='-Wl,'\n\tlt_prog_compiler_pic='-fPIC'\n\tlt_prog_compiler_static='-static'\n        ;;\n      # Lahey Fortran 8.1.\n      lf95*)\n\tlt_prog_compiler_wl='-Wl,'\n\tlt_prog_compiler_pic='--shared'\n\tlt_prog_compiler_static='--static'\n\t;;\n      nagfor*)\n\t# NAG Fortran compiler\n\tlt_prog_compiler_wl='-Wl,-Wl,,'\n\tlt_prog_compiler_pic='-PIC'\n\tlt_prog_compiler_static='-Bstatic'\n\t;;\n      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)\n        # Portland Group compilers (*not* the Pentium gcc compiler,\n\t# which looks to be a dead project)\n\tlt_prog_compiler_wl='-Wl,'\n\tlt_prog_compiler_pic='-fpic'\n\tlt_prog_compiler_static='-Bstatic'\n        ;;\n      ccc*)\n        lt_prog_compiler_wl='-Wl,'\n        # All Alpha code is PIC.\n        lt_prog_compiler_static='-non_shared'\n        ;;\n      xl* | bgxl* | bgf* | mpixl*)\n\t# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene\n\tlt_prog_compiler_wl='-Wl,'\n\tlt_prog_compiler_pic='-qpic'\n\tlt_prog_compiler_static='-qstaticlink'\n\t;;\n      *)\n\tcase `$CC -V 2>&1 | sed 5q` in\n\t*Sun\\ Ceres\\ Fortran* | *Sun*Fortran*\\ [1-7].* | *Sun*Fortran*\\ 8.[0-3]*)\n\t  # Sun Fortran 8.3 passes all unrecognized flags to the linker\n\t  lt_prog_compiler_pic='-KPIC'\n\t  lt_prog_compiler_static='-Bstatic'\n\t  lt_prog_compiler_wl=''\n\t  ;;\n\t*Sun\\ F* | *Sun*Fortran*)\n\t  lt_prog_compiler_pic='-KPIC'\n\t  lt_prog_compiler_static='-Bstatic'\n\t  lt_prog_compiler_wl='-Qoption ld '\n\t  ;;\n\t*Sun\\ C*)\n\t  # Sun C 5.9\n\t  lt_prog_compiler_pic='-KPIC'\n\t  lt_prog_compiler_static='-Bstatic'\n\t  lt_prog_compiler_wl='-Wl,'\n\t  ;;\n        *Intel*\\ [CF]*Compiler*)\n\t  lt_prog_compiler_wl='-Wl,'\n\t  lt_prog_compiler_pic='-fPIC'\n\t  lt_prog_compiler_static='-static'\n\t  ;;\n\t*Portland\\ Group*)\n\t  lt_prog_compiler_wl='-Wl,'\n\t  lt_prog_compiler_pic='-fpic'\n\t  lt_prog_compiler_static='-Bstatic'\n\t  ;;\n\tesac\n\t;;\n      esac\n      ;;\n\n    newsos6)\n      lt_prog_compiler_pic='-KPIC'\n      lt_prog_compiler_static='-Bstatic'\n      ;;\n\n    *nto* | *qnx*)\n      # QNX uses GNU C++, but need to define -shared option too, otherwise\n      # it will coredump.\n      lt_prog_compiler_pic='-fPIC -shared'\n      ;;\n\n    osf3* | osf4* | osf5*)\n      lt_prog_compiler_wl='-Wl,'\n      # All OSF/1 code is PIC.\n      lt_prog_compiler_static='-non_shared'\n      ;;\n\n    rdos*)\n      lt_prog_compiler_static='-non_shared'\n      ;;\n\n    solaris*)\n      lt_prog_compiler_pic='-KPIC'\n      lt_prog_compiler_static='-Bstatic'\n      case $cc_basename in\n      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)\n\tlt_prog_compiler_wl='-Qoption ld ';;\n      *)\n\tlt_prog_compiler_wl='-Wl,';;\n      esac\n      ;;\n\n    sunos4*)\n      lt_prog_compiler_wl='-Qoption ld '\n      lt_prog_compiler_pic='-PIC'\n      lt_prog_compiler_static='-Bstatic'\n      ;;\n\n    sysv4 | sysv4.2uw2* | sysv4.3*)\n      lt_prog_compiler_wl='-Wl,'\n      lt_prog_compiler_pic='-KPIC'\n      lt_prog_compiler_static='-Bstatic'\n      ;;\n\n    sysv4*MP*)\n      if test -d /usr/nec ;then\n\tlt_prog_compiler_pic='-Kconform_pic'\n\tlt_prog_compiler_static='-Bstatic'\n      fi\n      ;;\n\n    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)\n      lt_prog_compiler_wl='-Wl,'\n      lt_prog_compiler_pic='-KPIC'\n      lt_prog_compiler_static='-Bstatic'\n      ;;\n\n    unicos*)\n      lt_prog_compiler_wl='-Wl,'\n      lt_prog_compiler_can_build_shared=no\n      ;;\n\n    uts4*)\n      lt_prog_compiler_pic='-pic'\n      lt_prog_compiler_static='-Bstatic'\n      ;;\n\n    *)\n      lt_prog_compiler_can_build_shared=no\n      ;;\n    esac\n  fi\n\ncase $host_os in\n  # For platforms which do not support PIC, -DPIC is meaningless:\n  *djgpp*)\n    lt_prog_compiler_pic=\n    ;;\n  *)\n    lt_prog_compiler_pic=\"$lt_prog_compiler_pic -DPIC\"\n    ;;\nesac\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC\" >&5\n$as_echo_n \"checking for $compiler option to produce PIC... \" >&6; }\nif ${lt_cv_prog_compiler_pic+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_pic=$lt_prog_compiler_pic\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic\" >&5\n$as_echo \"$lt_cv_prog_compiler_pic\" >&6; }\nlt_prog_compiler_pic=$lt_cv_prog_compiler_pic\n\n#\n# Check to make sure the PIC flag actually works.\n#\nif test -n \"$lt_prog_compiler_pic\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works\" >&5\n$as_echo_n \"checking if $compiler PIC flag $lt_prog_compiler_pic works... \" >&6; }\nif ${lt_cv_prog_compiler_pic_works+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_pic_works=no\n   ac_outfile=conftest.$ac_objext\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n   lt_compiler_flag=\"$lt_prog_compiler_pic -DPIC\"\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   # The option is referenced via a variable to avoid confusing sed.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [^ ]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:$LINENO: $lt_compile\\\"\" >&5)\n   (eval \"$lt_compile\" 2>conftest.err)\n   ac_status=$?\n   cat conftest.err >&5\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n   if (exit $ac_status) && test -s \"$ac_outfile\"; then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings other than the usual output.\n     $ECHO \"$_lt_compiler_boilerplate\" | $SED '/^$/d' >conftest.exp\n     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2\n     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then\n       lt_cv_prog_compiler_pic_works=yes\n     fi\n   fi\n   $RM conftest*\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works\" >&5\n$as_echo \"$lt_cv_prog_compiler_pic_works\" >&6; }\n\nif test x\"$lt_cv_prog_compiler_pic_works\" = xyes; then\n    case $lt_prog_compiler_pic in\n     \"\" | \" \"*) ;;\n     *) lt_prog_compiler_pic=\" $lt_prog_compiler_pic\" ;;\n     esac\nelse\n    lt_prog_compiler_pic=\n     lt_prog_compiler_can_build_shared=no\nfi\n\nfi\n\n\n\n\n\n\n\n\n\n\n\n#\n# Check to make sure the static flag actually works.\n#\nwl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\\\"$lt_prog_compiler_static\\\"\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works\" >&5\n$as_echo_n \"checking if $compiler static flag $lt_tmp_static_flag works... \" >&6; }\nif ${lt_cv_prog_compiler_static_works+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_static_works=no\n   save_LDFLAGS=\"$LDFLAGS\"\n   LDFLAGS=\"$LDFLAGS $lt_tmp_static_flag\"\n   echo \"$lt_simple_link_test_code\" > conftest.$ac_ext\n   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then\n     # The linker can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     if test -s conftest.err; then\n       # Append any errors to the config.log.\n       cat conftest.err 1>&5\n       $ECHO \"$_lt_linker_boilerplate\" | $SED '/^$/d' > conftest.exp\n       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2\n       if diff conftest.exp conftest.er2 >/dev/null; then\n         lt_cv_prog_compiler_static_works=yes\n       fi\n     else\n       lt_cv_prog_compiler_static_works=yes\n     fi\n   fi\n   $RM -r conftest*\n   LDFLAGS=\"$save_LDFLAGS\"\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works\" >&5\n$as_echo \"$lt_cv_prog_compiler_static_works\" >&6; }\n\nif test x\"$lt_cv_prog_compiler_static_works\" = xyes; then\n    :\nelse\n    lt_prog_compiler_static=\nfi\n\n\n\n\n\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext\" >&5\n$as_echo_n \"checking if $compiler supports -c -o file.$ac_objext... \" >&6; }\nif ${lt_cv_prog_compiler_c_o+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_c_o=no\n   $RM -r conftest 2>/dev/null\n   mkdir conftest\n   cd conftest\n   mkdir out\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n\n   lt_compiler_flag=\"-o out/conftest2.$ac_objext\"\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [^ ]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:$LINENO: $lt_compile\\\"\" >&5)\n   (eval \"$lt_compile\" 2>out/conftest.err)\n   ac_status=$?\n   cat out/conftest.err >&5\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n   if (exit $ac_status) && test -s out/conftest2.$ac_objext\n   then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     $ECHO \"$_lt_compiler_boilerplate\" | $SED '/^$/d' > out/conftest.exp\n     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2\n     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then\n       lt_cv_prog_compiler_c_o=yes\n     fi\n   fi\n   chmod u+w . 2>&5\n   $RM conftest*\n   # SGI C++ compiler will create directory out/ii_files/ for\n   # template instantiation\n   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files\n   $RM out/* && rmdir out\n   cd ..\n   $RM -r conftest\n   $RM conftest*\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o\" >&5\n$as_echo \"$lt_cv_prog_compiler_c_o\" >&6; }\n\n\n\n\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext\" >&5\n$as_echo_n \"checking if $compiler supports -c -o file.$ac_objext... \" >&6; }\nif ${lt_cv_prog_compiler_c_o+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_c_o=no\n   $RM -r conftest 2>/dev/null\n   mkdir conftest\n   cd conftest\n   mkdir out\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n\n   lt_compiler_flag=\"-o out/conftest2.$ac_objext\"\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [^ ]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:$LINENO: $lt_compile\\\"\" >&5)\n   (eval \"$lt_compile\" 2>out/conftest.err)\n   ac_status=$?\n   cat out/conftest.err >&5\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n   if (exit $ac_status) && test -s out/conftest2.$ac_objext\n   then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     $ECHO \"$_lt_compiler_boilerplate\" | $SED '/^$/d' > out/conftest.exp\n     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2\n     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then\n       lt_cv_prog_compiler_c_o=yes\n     fi\n   fi\n   chmod u+w . 2>&5\n   $RM conftest*\n   # SGI C++ compiler will create directory out/ii_files/ for\n   # template instantiation\n   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files\n   $RM out/* && rmdir out\n   cd ..\n   $RM -r conftest\n   $RM conftest*\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o\" >&5\n$as_echo \"$lt_cv_prog_compiler_c_o\" >&6; }\n\n\n\n\nhard_links=\"nottested\"\nif test \"$lt_cv_prog_compiler_c_o\" = no && test \"$need_locks\" != no; then\n  # do not overwrite the value of need_locks provided by the user\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links\" >&5\n$as_echo_n \"checking if we can lock with hard links... \" >&6; }\n  hard_links=yes\n  $RM conftest*\n  ln conftest.a conftest.b 2>/dev/null && hard_links=no\n  touch conftest.a\n  ln conftest.a conftest.b 2>&5 || hard_links=no\n  ln conftest.a conftest.b 2>/dev/null && hard_links=no\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $hard_links\" >&5\n$as_echo \"$hard_links\" >&6; }\n  if test \"$hard_links\" = no; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: \\`$CC' does not support \\`-c -o', so \\`make -j' may be unsafe\" >&5\n$as_echo \"$as_me: WARNING: \\`$CC' does not support \\`-c -o', so \\`make -j' may be unsafe\" >&2;}\n    need_locks=warn\n  fi\nelse\n  need_locks=no\nfi\n\n\n\n\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries\" >&5\n$as_echo_n \"checking whether the $compiler linker ($LD) supports shared libraries... \" >&6; }\n\n  runpath_var=\n  allow_undefined_flag=\n  always_export_symbols=no\n  archive_cmds=\n  archive_expsym_cmds=\n  compiler_needs_object=no\n  enable_shared_with_static_runtimes=no\n  export_dynamic_flag_spec=\n  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\\''s/.* //'\\'' | sort | uniq > $export_symbols'\n  hardcode_automatic=no\n  hardcode_direct=no\n  hardcode_direct_absolute=no\n  hardcode_libdir_flag_spec=\n  hardcode_libdir_separator=\n  hardcode_minus_L=no\n  hardcode_shlibpath_var=unsupported\n  inherit_rpath=no\n  link_all_deplibs=unknown\n  module_cmds=\n  module_expsym_cmds=\n  old_archive_from_new_cmds=\n  old_archive_from_expsyms_cmds=\n  thread_safe_flag_spec=\n  whole_archive_flag_spec=\n  # include_expsyms should be a list of space-separated symbols to be *always*\n  # included in the symbol list\n  include_expsyms=\n  # exclude_expsyms can be an extended regexp of symbols to exclude\n  # it will be wrapped by ` (' and `)$', so one must not match beginning or\n  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',\n  # as well as any symbol that contains `d'.\n  exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'\n  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out\n  # platforms (ab)use it in PIC code, but their linkers get confused if\n  # the symbol is explicitly referenced.  Since portable code cannot\n  # rely on this symbol name, it's probably fine to never include it in\n  # preloaded symbol tables.\n  # Exclude shared library initialization/finalization symbols.\n  extract_expsyms_cmds=\n\n  case $host_os in\n  cygwin* | mingw* | pw32* | cegcc*)\n    # FIXME: the MSVC++ port hasn't been tested in a loooong time\n    # When not using gcc, we currently assume that we are using\n    # Microsoft Visual C++.\n    if test \"$GCC\" != yes; then\n      with_gnu_ld=no\n    fi\n    ;;\n  interix*)\n    # we just hope/assume this is gcc and not c89 (= MSVC++)\n    with_gnu_ld=yes\n    ;;\n  openbsd*)\n    with_gnu_ld=no\n    ;;\n  linux* | k*bsd*-gnu | gnu*)\n    link_all_deplibs=no\n    ;;\n  esac\n\n  ld_shlibs=yes\n\n  # On some targets, GNU ld is compatible enough with the native linker\n  # that we're better off using the native interface for both.\n  lt_use_gnu_ld_interface=no\n  if test \"$with_gnu_ld\" = yes; then\n    case $host_os in\n      aix*)\n\t# The AIX port of GNU ld has always aspired to compatibility\n\t# with the native linker.  However, as the warning in the GNU ld\n\t# block says, versions before 2.19.5* couldn't really create working\n\t# shared libraries, regardless of the interface used.\n\tcase `$LD -v 2>&1` in\n\t  *\\ \\(GNU\\ Binutils\\)\\ 2.19.5*) ;;\n\t  *\\ \\(GNU\\ Binutils\\)\\ 2.[2-9]*) ;;\n\t  *\\ \\(GNU\\ Binutils\\)\\ [3-9]*) ;;\n\t  *)\n\t    lt_use_gnu_ld_interface=yes\n\t    ;;\n\tesac\n\t;;\n      *)\n\tlt_use_gnu_ld_interface=yes\n\t;;\n    esac\n  fi\n\n  if test \"$lt_use_gnu_ld_interface\" = yes; then\n    # If archive_cmds runs LD, not CC, wlarc should be empty\n    wlarc='${wl}'\n\n    # Set some defaults for GNU ld with shared library support. These\n    # are reset later if shared libraries are not supported. Putting them\n    # here allows them to be overridden if necessary.\n    runpath_var=LD_RUN_PATH\n    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n    export_dynamic_flag_spec='${wl}--export-dynamic'\n    # ancient GNU ld didn't support --whole-archive et. al.\n    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then\n      whole_archive_flag_spec=\"$wlarc\"'--whole-archive$convenience '\"$wlarc\"'--no-whole-archive'\n    else\n      whole_archive_flag_spec=\n    fi\n    supports_anon_versioning=no\n    case `$LD -v 2>&1` in\n      *GNU\\ gold*) supports_anon_versioning=yes ;;\n      *\\ [01].* | *\\ 2.[0-9].* | *\\ 2.10.*) ;; # catch versions < 2.11\n      *\\ 2.11.93.0.2\\ *) supports_anon_versioning=yes ;; # RH7.3 ...\n      *\\ 2.11.92.0.12\\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...\n      *\\ 2.11.*) ;; # other 2.11 versions\n      *) supports_anon_versioning=yes ;;\n    esac\n\n    # See if GNU ld supports shared libraries.\n    case $host_os in\n    aix[3-9]*)\n      # On AIX/PPC, the GNU linker is very broken\n      if test \"$host_cpu\" != ia64; then\n\tld_shlibs=no\n\tcat <<_LT_EOF 1>&2\n\n*** Warning: the GNU linker, at least up to release 2.19, is reported\n*** to be unable to reliably create shared libraries on AIX.\n*** Therefore, libtool is disabling shared libraries support.  If you\n*** really care for shared libraries, you may want to install binutils\n*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.\n*** You will then need to restart the configuration process.\n\n_LT_EOF\n      fi\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n            archive_expsym_cmds=''\n        ;;\n      m68k)\n            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO \"#define NAME $libname\" > $output_objdir/a2ixlibrary.data~$ECHO \"#define LIBRARY_ID 1\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define VERSION $major\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define REVISION $revision\" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'\n            hardcode_libdir_flag_spec='-L$libdir'\n            hardcode_minus_L=yes\n        ;;\n      esac\n      ;;\n\n    beos*)\n      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\tallow_undefined_flag=unsupported\n\t# Joseph Beckenbach <jrb3@best.com> says some releases of gcc\n\t# support --undefined.  This deserves some investigation.  FIXME\n\tarchive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n      else\n\tld_shlibs=no\n      fi\n      ;;\n\n    cygwin* | mingw* | pw32* | cegcc*)\n      # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,\n      # as there is no search path for DLLs.\n      hardcode_libdir_flag_spec='-L$libdir'\n      export_dynamic_flag_spec='${wl}--export-all-symbols'\n      allow_undefined_flag=unsupported\n      always_export_symbols=no\n      enable_shared_with_static_runtimes=yes\n      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\\''/^[BCDGRS][ ]/s/.*[ ]\\([^ ]*\\)/\\1 DATA/;s/^.*[ ]__nm__\\([^ ]*\\)[ ][^ ]*/\\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\\'' | sort | uniq > $export_symbols'\n      exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'\n\n      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then\n        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n\t# If the export-symbols file already is a .def file (1st line\n\t# is EXPORTS), use it as is; otherwise, prepend...\n\tarchive_expsym_cmds='if test \"x`$SED 1q $export_symbols`\" = xEXPORTS; then\n\t  cp $export_symbols $output_objdir/$soname.def;\n\telse\n\t  echo EXPORTS > $output_objdir/$soname.def;\n\t  cat $export_symbols >> $output_objdir/$soname.def;\n\tfi~\n\t$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n      else\n\tld_shlibs=no\n      fi\n      ;;\n\n    haiku*)\n      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n      link_all_deplibs=yes\n      ;;\n\n    interix[3-9]*)\n      hardcode_direct=no\n      hardcode_shlibpath_var=no\n      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'\n      export_dynamic_flag_spec='${wl}-E'\n      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.\n      # Instead, shared libraries are loaded at an image base (0x10000000 by\n      # default) and relocated if they conflict, which is a slow very memory\n      # consuming and fragmenting process.  To avoid this, we pick a random,\n      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link\n      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.\n      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n      archive_expsym_cmds='sed \"s,^,_,\" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n      ;;\n\n    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)\n      tmp_diet=no\n      if test \"$host_os\" = linux-dietlibc; then\n\tcase $cc_basename in\n\t  diet\\ *) tmp_diet=yes;;\t# linux-dietlibc with static linking (!diet-dyn)\n\tesac\n      fi\n      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \\\n\t && test \"$tmp_diet\" = no\n      then\n\ttmp_addflag=' $pic_flag'\n\ttmp_sharedflag='-shared'\n\tcase $cc_basename,$host_cpu in\n        pgcc*)\t\t\t\t# Portland Group C compiler\n\t  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t  tmp_addflag=' $pic_flag'\n\t  ;;\n\tpgf77* | pgf90* | pgf95* | pgfortran*)\n\t\t\t\t\t# Portland Group f77 and f90 compilers\n\t  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t  tmp_addflag=' $pic_flag -Mnomain' ;;\n\tecc*,ia64* | icc*,ia64*)\t# Intel C compiler on ia64\n\t  tmp_addflag=' -i_dynamic' ;;\n\tefc*,ia64* | ifort*,ia64*)\t# Intel Fortran compiler on ia64\n\t  tmp_addflag=' -i_dynamic -nofor_main' ;;\n\tifc* | ifort*)\t\t\t# Intel Fortran compiler\n\t  tmp_addflag=' -nofor_main' ;;\n\tlf95*)\t\t\t\t# Lahey Fortran 8.1\n\t  whole_archive_flag_spec=\n\t  tmp_sharedflag='--shared' ;;\n\txl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)\n\t  tmp_sharedflag='-qmkshrobj'\n\t  tmp_addflag= ;;\n\tnvcc*)\t# Cuda Compiler Driver 2.2\n\t  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t  compiler_needs_object=yes\n\t  ;;\n\tesac\n\tcase `$CC -V 2>&1 | sed 5q` in\n\t*Sun\\ C*)\t\t\t# Sun C 5.9\n\t  whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\\\"\\\"; do test -z \\\"$conv\\\" || new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t  compiler_needs_object=yes\n\t  tmp_sharedflag='-G' ;;\n\t*Sun\\ F*)\t\t\t# Sun Fortran 8.3\n\t  tmp_sharedflag='-G' ;;\n\tesac\n\tarchive_cmds='$CC '\"$tmp_sharedflag\"\"$tmp_addflag\"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\n        if test \"x$supports_anon_versioning\" = xyes; then\n          archive_expsym_cmds='echo \"{ global:\" > $output_objdir/$libname.ver~\n\t    cat $export_symbols | sed -e \"s/\\(.*\\)/\\1;/\" >> $output_objdir/$libname.ver~\n\t    echo \"local: *; };\" >> $output_objdir/$libname.ver~\n\t    $CC '\"$tmp_sharedflag\"\"$tmp_addflag\"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'\n        fi\n\n\tcase $cc_basename in\n\txlf* | bgf* | bgxlf* | mpixlf*)\n\t  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself\n\t  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'\n\t  hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n\t  archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'\n\t  if test \"x$supports_anon_versioning\" = xyes; then\n\t    archive_expsym_cmds='echo \"{ global:\" > $output_objdir/$libname.ver~\n\t      cat $export_symbols | sed -e \"s/\\(.*\\)/\\1;/\" >> $output_objdir/$libname.ver~\n\t      echo \"local: *; };\" >> $output_objdir/$libname.ver~\n\t      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'\n\t  fi\n\t  ;;\n\tesac\n      else\n        ld_shlibs=no\n      fi\n      ;;\n\n    netbsd* | netbsdelf*-gnu)\n      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n\tarchive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'\n\twlarc=\n      else\n\tarchive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\tarchive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n      fi\n      ;;\n\n    solaris*)\n      if $LD -v 2>&1 | $GREP 'BFD 2\\.8' > /dev/null; then\n\tld_shlibs=no\n\tcat <<_LT_EOF 1>&2\n\n*** Warning: The releases 2.8.* of the GNU linker cannot reliably\n*** create shared libraries on Solaris systems.  Therefore, libtool\n*** is disabling shared libraries support.  We urge you to upgrade GNU\n*** binutils to release 2.9.1 or newer.  Another option is to modify\n*** your PATH or compiler configuration so that the native linker is\n*** used, and then restart.\n\n_LT_EOF\n      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\tarchive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\tarchive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n      else\n\tld_shlibs=no\n      fi\n      ;;\n\n    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)\n      case `$LD -v 2>&1` in\n        *\\ [01].* | *\\ 2.[0-9].* | *\\ 2.1[0-5].*)\n\tld_shlibs=no\n\tcat <<_LT_EOF 1>&2\n\n*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not\n*** reliably create shared libraries on SCO systems.  Therefore, libtool\n*** is disabling shared libraries support.  We urge you to upgrade GNU\n*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify\n*** your PATH or compiler configuration so that the native linker is\n*** used, and then restart.\n\n_LT_EOF\n\t;;\n\t*)\n\t  # For security reasons, it is highly recommended that you always\n\t  # use absolute paths for naming shared libraries, and exclude the\n\t  # DT_RUNPATH tag from executables and libraries.  But doing so\n\t  # requires that you compile everything twice, which is a pain.\n\t  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\t    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n\t    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n\t  else\n\t    ld_shlibs=no\n\t  fi\n\t;;\n      esac\n      ;;\n\n    sunos4*)\n      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'\n      wlarc=\n      hardcode_direct=yes\n      hardcode_shlibpath_var=no\n      ;;\n\n    *)\n      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\tarchive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\tarchive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n      else\n\tld_shlibs=no\n      fi\n      ;;\n    esac\n\n    if test \"$ld_shlibs\" = no; then\n      runpath_var=\n      hardcode_libdir_flag_spec=\n      export_dynamic_flag_spec=\n      whole_archive_flag_spec=\n    fi\n  else\n    # PORTME fill in a description of your system's linker (not GNU ld)\n    case $host_os in\n    aix3*)\n      allow_undefined_flag=unsupported\n      always_export_symbols=yes\n      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'\n      # Note: this linker hardcodes the directories in LIBPATH if there\n      # are no directories specified by -L.\n      hardcode_minus_L=yes\n      if test \"$GCC\" = yes && test -z \"$lt_prog_compiler_static\"; then\n\t# Neither direct hardcoding nor static linking is supported with a\n\t# broken collect2.\n\thardcode_direct=unsupported\n      fi\n      ;;\n\n    aix[4-9]*)\n      if test \"$host_cpu\" = ia64; then\n\t# On IA64, the linker does run time linking by default, so we don't\n\t# have to do anything special.\n\taix_use_runtimelinking=no\n\texp_sym_flag='-Bexport'\n\tno_entry_flag=\"\"\n      else\n\t# If we're using GNU nm, then we don't want the \"-C\" option.\n\t# -C means demangle to AIX nm, but means don't demangle with GNU nm\n\t# Also, AIX nm treats weak defined symbols like other global\n\t# defined symbols, whereas GNU nm marks them as \"W\".\n\tif $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then\n\t  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\") || (\\$ 2 == \"W\")) && (substr(\\$ 3,1,1) != \".\")) { print \\$ 3 } }'\\'' | sort -u > $export_symbols'\n\telse\n\t  export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\")) && (substr(\\$ 3,1,1) != \".\")) { print \\$ 3 } }'\\'' | sort -u > $export_symbols'\n\tfi\n\taix_use_runtimelinking=no\n\n\t# Test if we are trying to use run time linking or normal\n\t# AIX style linking. If -brtl is somewhere in LDFLAGS, we\n\t# need to do runtime linking.\n\tcase $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)\n\t  for ld_flag in $LDFLAGS; do\n\t  if (test $ld_flag = \"-brtl\" || test $ld_flag = \"-Wl,-brtl\"); then\n\t    aix_use_runtimelinking=yes\n\t    break\n\t  fi\n\t  done\n\t  ;;\n\tesac\n\n\texp_sym_flag='-bexport'\n\tno_entry_flag='-bnoentry'\n      fi\n\n      # When large executables or shared objects are built, AIX ld can\n      # have problems creating the table of contents.  If linking a library\n      # or program results in \"error TOC overflow\" add -mminimal-toc to\n      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not\n      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.\n\n      archive_cmds=''\n      hardcode_direct=yes\n      hardcode_direct_absolute=yes\n      hardcode_libdir_separator=':'\n      link_all_deplibs=yes\n      file_list_spec='${wl}-f,'\n\n      if test \"$GCC\" = yes; then\n\tcase $host_os in aix4.[012]|aix4.[012].*)\n\t# We only want to do this on AIX 4.2 and lower, the check\n\t# below for broken collect2 doesn't work under 4.3+\n\t  collect2name=`${CC} -print-prog-name=collect2`\n\t  if test -f \"$collect2name\" &&\n\t   strings \"$collect2name\" | $GREP resolve_lib_name >/dev/null\n\t  then\n\t  # We have reworked collect2\n\t  :\n\t  else\n\t  # We have old collect2\n\t  hardcode_direct=unsupported\n\t  # It fails to find uninstalled libraries when the uninstalled\n\t  # path is not listed in the libpath.  Setting hardcode_minus_L\n\t  # to unsupported forces relinking\n\t  hardcode_minus_L=yes\n\t  hardcode_libdir_flag_spec='-L$libdir'\n\t  hardcode_libdir_separator=\n\t  fi\n\t  ;;\n\tesac\n\tshared_flag='-shared'\n\tif test \"$aix_use_runtimelinking\" = yes; then\n\t  shared_flag=\"$shared_flag \"'${wl}-G'\n\tfi\n\tlink_all_deplibs=no\n      else\n\t# not using gcc\n\tif test \"$host_cpu\" = ia64; then\n\t# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release\n\t# chokes on -Wl,-G. The following line is correct:\n\t  shared_flag='-G'\n\telse\n\t  if test \"$aix_use_runtimelinking\" = yes; then\n\t    shared_flag='${wl}-G'\n\t  else\n\t    shared_flag='${wl}-bM:SRE'\n\t  fi\n\tfi\n      fi\n\n      export_dynamic_flag_spec='${wl}-bexpall'\n      # It seems that -bexpall does not export symbols beginning with\n      # underscore (_), so it is better to generate a list of symbols to export.\n      always_export_symbols=yes\n      if test \"$aix_use_runtimelinking\" = yes; then\n\t# Warning - without using the other runtime loading flags (-brtl),\n\t# -berok will link without error, but may produce a broken library.\n\tallow_undefined_flag='-berok'\n        # Determine the default libpath from the value encoded in an\n        # empty executable.\n        if test \"${lt_cv_aix_libpath+set}\" = set; then\n  aix_libpath=$lt_cv_aix_libpath\nelse\n  if ${lt_cv_aix_libpath_+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n\n  lt_aix_libpath_sed='\n      /Import File Strings/,/^$/ {\n\t  /^0/ {\n\t      s/^0  *\\([^ ]*\\) *$/\\1/\n\t      p\n\t  }\n      }'\n  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\n  # Check for a 64-bit object if we didn't find anything.\n  if test -z \"$lt_cv_aix_libpath_\"; then\n    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\n  fi\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n  if test -z \"$lt_cv_aix_libpath_\"; then\n    lt_cv_aix_libpath_=\"/usr/lib:/lib\"\n  fi\n\nfi\n\n  aix_libpath=$lt_cv_aix_libpath_\nfi\n\n        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'\"$aix_libpath\"\n        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '\"\\${wl}$no_entry_flag\"' $compiler_flags `if test \"x${allow_undefined_flag}\" != \"x\"; then func_echo_all \"${wl}${allow_undefined_flag}\"; else :; fi` '\"\\${wl}$exp_sym_flag:\\$export_symbols $shared_flag\"\n      else\n\tif test \"$host_cpu\" = ia64; then\n\t  hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'\n\t  allow_undefined_flag=\"-z nodefs\"\n\t  archive_expsym_cmds=\"\\$CC $shared_flag\"' -o $output_objdir/$soname $libobjs $deplibs '\"\\${wl}$no_entry_flag\"' $compiler_flags ${wl}${allow_undefined_flag} '\"\\${wl}$exp_sym_flag:\\$export_symbols\"\n\telse\n\t # Determine the default libpath from the value encoded in an\n\t # empty executable.\n\t if test \"${lt_cv_aix_libpath+set}\" = set; then\n  aix_libpath=$lt_cv_aix_libpath\nelse\n  if ${lt_cv_aix_libpath_+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n\n  lt_aix_libpath_sed='\n      /Import File Strings/,/^$/ {\n\t  /^0/ {\n\t      s/^0  *\\([^ ]*\\) *$/\\1/\n\t      p\n\t  }\n      }'\n  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\n  # Check for a 64-bit object if we didn't find anything.\n  if test -z \"$lt_cv_aix_libpath_\"; then\n    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\n  fi\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n  if test -z \"$lt_cv_aix_libpath_\"; then\n    lt_cv_aix_libpath_=\"/usr/lib:/lib\"\n  fi\n\nfi\n\n  aix_libpath=$lt_cv_aix_libpath_\nfi\n\n\t hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'\"$aix_libpath\"\n\t  # Warning - without using the other run time loading flags,\n\t  # -berok will link without error, but may produce a broken library.\n\t  no_undefined_flag=' ${wl}-bernotok'\n\t  allow_undefined_flag=' ${wl}-berok'\n\t  if test \"$with_gnu_ld\" = yes; then\n\t    # We only use this code for GNU lds that support --whole-archive.\n\t    whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive'\n\t  else\n\t    # Exported symbols can be pulled into shared objects from archives\n\t    whole_archive_flag_spec='$convenience'\n\t  fi\n\t  archive_cmds_need_lc=yes\n\t  # This is similar to how AIX traditionally builds its shared libraries.\n\t  archive_expsym_cmds=\"\\$CC $shared_flag\"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'\n\tfi\n      fi\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n            archive_expsym_cmds=''\n        ;;\n      m68k)\n            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO \"#define NAME $libname\" > $output_objdir/a2ixlibrary.data~$ECHO \"#define LIBRARY_ID 1\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define VERSION $major\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define REVISION $revision\" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'\n            hardcode_libdir_flag_spec='-L$libdir'\n            hardcode_minus_L=yes\n        ;;\n      esac\n      ;;\n\n    bsdi[45]*)\n      export_dynamic_flag_spec=-rdynamic\n      ;;\n\n    cygwin* | mingw* | pw32* | cegcc*)\n      # When not using gcc, we currently assume that we are using\n      # Microsoft Visual C++.\n      # hardcode_libdir_flag_spec is actually meaningless, as there is\n      # no search path for DLLs.\n      case $cc_basename in\n      cl*)\n\t# Native MSVC\n\thardcode_libdir_flag_spec=' '\n\tallow_undefined_flag=unsupported\n\talways_export_symbols=yes\n\tfile_list_spec='@'\n\t# Tell ltmain to make .lib files, not .a files.\n\tlibext=lib\n\t# Tell ltmain to make .dll files, not .so files.\n\tshrext_cmds=\".dll\"\n\t# FIXME: Setting linknames here is a bad hack.\n\tarchive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='\n\tarchive_expsym_cmds='if test \"x`$SED 1q $export_symbols`\" = xEXPORTS; then\n\t    sed -n -e 's/\\\\\\\\\\\\\\(.*\\\\\\\\\\\\\\)/-link\\\\\\ -EXPORT:\\\\\\\\\\\\\\1/' -e '1\\\\\\!p' < $export_symbols > $output_objdir/$soname.exp;\n\t  else\n\t    sed -e 's/\\\\\\\\\\\\\\(.*\\\\\\\\\\\\\\)/-link\\\\\\ -EXPORT:\\\\\\\\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;\n\t  fi~\n\t  $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs \"@$tool_output_objdir$soname.exp\" -Wl,-DLL,-IMPLIB:\"$tool_output_objdir$libname.dll.lib\"~\n\t  linknames='\n\t# The linker will not automatically build a static lib if we build a DLL.\n\t# _LT_TAGVAR(old_archive_from_new_cmds, )='true'\n\tenable_shared_with_static_runtimes=yes\n\texclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'\n\texport_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\\''/^[BCDGRS][ ]/s/.*[ ]\\([^ ]*\\)/\\1,DATA/'\\'' | $SED -e '\\''/^[AITW][ ]/s/.*[ ]//'\\'' | sort | uniq > $export_symbols'\n\t# Don't use ranlib\n\told_postinstall_cmds='chmod 644 $oldlib'\n\tpostlink_cmds='lt_outputfile=\"@OUTPUT@\"~\n\t  lt_tool_outputfile=\"@TOOL_OUTPUT@\"~\n\t  case $lt_outputfile in\n\t    *.exe|*.EXE) ;;\n\t    *)\n\t      lt_outputfile=\"$lt_outputfile.exe\"\n\t      lt_tool_outputfile=\"$lt_tool_outputfile.exe\"\n\t      ;;\n\t  esac~\n\t  if test \"$MANIFEST_TOOL\" != \":\" && test -f \"$lt_outputfile.manifest\"; then\n\t    $MANIFEST_TOOL -manifest \"$lt_tool_outputfile.manifest\" -outputresource:\"$lt_tool_outputfile\" || exit 1;\n\t    $RM \"$lt_outputfile.manifest\";\n\t  fi'\n\t;;\n      *)\n\t# Assume MSVC wrapper\n\thardcode_libdir_flag_spec=' '\n\tallow_undefined_flag=unsupported\n\t# Tell ltmain to make .lib files, not .a files.\n\tlibext=lib\n\t# Tell ltmain to make .dll files, not .so files.\n\tshrext_cmds=\".dll\"\n\t# FIXME: Setting linknames here is a bad hack.\n\tarchive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all \"$deplibs\" | $SED '\\''s/ -lc$//'\\''` -link -dll~linknames='\n\t# The linker will automatically build a .lib file if we build a DLL.\n\told_archive_from_new_cmds='true'\n\t# FIXME: Should let the user specify the lib program.\n\told_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'\n\tenable_shared_with_static_runtimes=yes\n\t;;\n      esac\n      ;;\n\n    darwin* | rhapsody*)\n\n\n  archive_cmds_need_lc=no\n  hardcode_direct=no\n  hardcode_automatic=yes\n  hardcode_shlibpath_var=unsupported\n  if test \"$lt_cv_ld_force_load\" = \"yes\"; then\n    whole_archive_flag_spec='`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience ${wl}-force_load,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"`'\n\n  else\n    whole_archive_flag_spec=''\n  fi\n  link_all_deplibs=yes\n  allow_undefined_flag=\"$_lt_dar_allow_undefined\"\n  case $cc_basename in\n     ifort*) _lt_dar_can_shared=yes ;;\n     *) _lt_dar_can_shared=$GCC ;;\n  esac\n  if test \"$_lt_dar_can_shared\" = \"yes\"; then\n    output_verbose_link_cmd=func_echo_all\n    archive_cmds=\"\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\$libobjs \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring $_lt_dar_single_mod${_lt_dsymutil}\"\n    module_cmds=\"\\$CC \\$allow_undefined_flag -o \\$lib -bundle \\$libobjs \\$deplibs \\$compiler_flags${_lt_dsymutil}\"\n    archive_expsym_cmds=\"sed 's,^,_,' < \\$export_symbols > \\$output_objdir/\\${libname}-symbols.expsym~\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\$libobjs \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}\"\n    module_expsym_cmds=\"sed -e 's,^,_,' < \\$export_symbols > \\$output_objdir/\\${libname}-symbols.expsym~\\$CC \\$allow_undefined_flag -o \\$lib -bundle \\$libobjs \\$deplibs \\$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}\"\n\n  else\n  ld_shlibs=no\n  fi\n\n      ;;\n\n    dgux*)\n      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      hardcode_libdir_flag_spec='-L$libdir'\n      hardcode_shlibpath_var=no\n      ;;\n\n    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor\n    # support.  Future versions do this automatically, but an explicit c++rt0.o\n    # does not break anything, and helps significantly (at the cost of a little\n    # extra space).\n    freebsd2.2*)\n      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'\n      hardcode_libdir_flag_spec='-R$libdir'\n      hardcode_direct=yes\n      hardcode_shlibpath_var=no\n      ;;\n\n    # Unfortunately, older versions of FreeBSD 2 do not have this feature.\n    freebsd2.*)\n      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'\n      hardcode_direct=yes\n      hardcode_minus_L=yes\n      hardcode_shlibpath_var=no\n      ;;\n\n    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.\n    freebsd* | dragonfly*)\n      archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'\n      hardcode_libdir_flag_spec='-R$libdir'\n      hardcode_direct=yes\n      hardcode_shlibpath_var=no\n      ;;\n\n    hpux9*)\n      if test \"$GCC\" = yes; then\n\tarchive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'\n      else\n\tarchive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'\n      fi\n      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'\n      hardcode_libdir_separator=:\n      hardcode_direct=yes\n\n      # hardcode_minus_L: Not really in the search PATH,\n      # but as the default location of the library.\n      hardcode_minus_L=yes\n      export_dynamic_flag_spec='${wl}-E'\n      ;;\n\n    hpux10*)\n      if test \"$GCC\" = yes && test \"$with_gnu_ld\" = no; then\n\tarchive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\tarchive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'\n      fi\n      if test \"$with_gnu_ld\" = no; then\n\thardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'\n\thardcode_libdir_separator=:\n\thardcode_direct=yes\n\thardcode_direct_absolute=yes\n\texport_dynamic_flag_spec='${wl}-E'\n\t# hardcode_minus_L: Not really in the search PATH,\n\t# but as the default location of the library.\n\thardcode_minus_L=yes\n      fi\n      ;;\n\n    hpux11*)\n      if test \"$GCC\" = yes && test \"$with_gnu_ld\" = no; then\n\tcase $host_cpu in\n\thppa*64*)\n\t  archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\tia64*)\n\t  archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\t*)\n\t  archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\tesac\n      else\n\tcase $host_cpu in\n\thppa*64*)\n\t  archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\tia64*)\n\t  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\t*)\n\n\t  # Older versions of the 11.00 compiler do not understand -b yet\n\t  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)\n\t  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $CC understands -b\" >&5\n$as_echo_n \"checking if $CC understands -b... \" >&6; }\nif ${lt_cv_prog_compiler__b+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler__b=no\n   save_LDFLAGS=\"$LDFLAGS\"\n   LDFLAGS=\"$LDFLAGS -b\"\n   echo \"$lt_simple_link_test_code\" > conftest.$ac_ext\n   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then\n     # The linker can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     if test -s conftest.err; then\n       # Append any errors to the config.log.\n       cat conftest.err 1>&5\n       $ECHO \"$_lt_linker_boilerplate\" | $SED '/^$/d' > conftest.exp\n       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2\n       if diff conftest.exp conftest.er2 >/dev/null; then\n         lt_cv_prog_compiler__b=yes\n       fi\n     else\n       lt_cv_prog_compiler__b=yes\n     fi\n   fi\n   $RM -r conftest*\n   LDFLAGS=\"$save_LDFLAGS\"\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b\" >&5\n$as_echo \"$lt_cv_prog_compiler__b\" >&6; }\n\nif test x\"$lt_cv_prog_compiler__b\" = xyes; then\n    archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'\nelse\n    archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'\nfi\n\n\t  ;;\n\tesac\n      fi\n      if test \"$with_gnu_ld\" = no; then\n\thardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'\n\thardcode_libdir_separator=:\n\n\tcase $host_cpu in\n\thppa*64*|ia64*)\n\t  hardcode_direct=no\n\t  hardcode_shlibpath_var=no\n\t  ;;\n\t*)\n\t  hardcode_direct=yes\n\t  hardcode_direct_absolute=yes\n\t  export_dynamic_flag_spec='${wl}-E'\n\n\t  # hardcode_minus_L: Not really in the search PATH,\n\t  # but as the default location of the library.\n\t  hardcode_minus_L=yes\n\t  ;;\n\tesac\n      fi\n      ;;\n\n    irix5* | irix6* | nonstopux*)\n      if test \"$GCC\" = yes; then\n\tarchive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version ${wl}$verstring\"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n\t# Try to use the -exported_symbol ld option, if it does not\n\t# work, assume that -exports_file does not work either and\n\t# implicitly export all symbols.\n\t# This should be the same for all languages, so no per-tag cache variable.\n\t{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol\" >&5\n$as_echo_n \"checking whether the $host_os linker accepts -exported_symbol... \" >&6; }\nif ${lt_cv_irix_exported_symbol+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  save_LDFLAGS=\"$LDFLAGS\"\n\t   LDFLAGS=\"$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null\"\n\t   cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\nint foo (void) { return 0; }\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  lt_cv_irix_exported_symbol=yes\nelse\n  lt_cv_irix_exported_symbol=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n           LDFLAGS=\"$save_LDFLAGS\"\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol\" >&5\n$as_echo \"$lt_cv_irix_exported_symbol\" >&6; }\n\tif test \"$lt_cv_irix_exported_symbol\" = yes; then\n          archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version ${wl}$verstring\"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'\n\tfi\n      else\n\tarchive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -o $lib'\n\tarchive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'\n      fi\n      archive_cmds_need_lc='no'\n      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n      hardcode_libdir_separator=:\n      inherit_rpath=yes\n      link_all_deplibs=yes\n      ;;\n\n    netbsd* | netbsdelf*-gnu)\n      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n\tarchive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out\n      else\n\tarchive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF\n      fi\n      hardcode_libdir_flag_spec='-R$libdir'\n      hardcode_direct=yes\n      hardcode_shlibpath_var=no\n      ;;\n\n    newsos6)\n      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      hardcode_direct=yes\n      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n      hardcode_libdir_separator=:\n      hardcode_shlibpath_var=no\n      ;;\n\n    *nto* | *qnx*)\n      ;;\n\n    openbsd*)\n      if test -f /usr/libexec/ld.so; then\n\thardcode_direct=yes\n\thardcode_shlibpath_var=no\n\thardcode_direct_absolute=yes\n\tif test -z \"`echo __ELF__ | $CC -E - | $GREP __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n\t  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'\n\t  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'\n\t  hardcode_libdir_flag_spec='${wl}-rpath,$libdir'\n\t  export_dynamic_flag_spec='${wl}-E'\n\telse\n\t  case $host_os in\n\t   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)\n\t     archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'\n\t     hardcode_libdir_flag_spec='-R$libdir'\n\t     ;;\n\t   *)\n\t     archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'\n\t     hardcode_libdir_flag_spec='${wl}-rpath,$libdir'\n\t     ;;\n\t  esac\n\tfi\n      else\n\tld_shlibs=no\n      fi\n      ;;\n\n    os2*)\n      hardcode_libdir_flag_spec='-L$libdir'\n      hardcode_minus_L=yes\n      allow_undefined_flag=unsupported\n      archive_cmds='$ECHO \"LIBRARY $libname INITINSTANCE\" > $output_objdir/$libname.def~$ECHO \"DESCRIPTION \\\"$libname\\\"\" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo \" SINGLE NONSHARED\" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'\n      old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'\n      ;;\n\n    osf3*)\n      if test \"$GCC\" = yes; then\n\tallow_undefined_flag=' ${wl}-expect_unresolved ${wl}\\*'\n\tarchive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version ${wl}$verstring\"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n      else\n\tallow_undefined_flag=' -expect_unresolved \\*'\n\tarchive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -o $lib'\n      fi\n      archive_cmds_need_lc='no'\n      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n      hardcode_libdir_separator=:\n      ;;\n\n    osf4* | osf5*)\t# as osf3* with the addition of -msym flag\n      if test \"$GCC\" = yes; then\n\tallow_undefined_flag=' ${wl}-expect_unresolved ${wl}\\*'\n\tarchive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version ${wl}$verstring\"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n\thardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n      else\n\tallow_undefined_flag=' -expect_unresolved \\*'\n\tarchive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -o $lib'\n\tarchive_expsym_cmds='for i in `cat $export_symbols`; do printf \"%s %s\\\\n\" -exported_symbol \"\\$i\" >> $lib.exp; done; printf \"%s\\\\n\" \"-hidden\">> $lib.exp~\n\t$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n \"$verstring\" && $ECHO \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'\n\n\t# Both c and cxx compiler support -rpath directly\n\thardcode_libdir_flag_spec='-rpath $libdir'\n      fi\n      archive_cmds_need_lc='no'\n      hardcode_libdir_separator=:\n      ;;\n\n    solaris*)\n      no_undefined_flag=' -z defs'\n      if test \"$GCC\" = yes; then\n\twlarc='${wl}'\n\tarchive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'\n\tarchive_expsym_cmds='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t  $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'\n      else\n\tcase `$CC -V 2>&1` in\n\t*\"Compilers 5.0\"*)\n\t  wlarc=''\n\t  archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t  archive_expsym_cmds='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'\n\t  ;;\n\t*)\n\t  wlarc='${wl}'\n\t  archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  archive_expsym_cmds='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'\n\t  ;;\n\tesac\n      fi\n      hardcode_libdir_flag_spec='-R$libdir'\n      hardcode_shlibpath_var=no\n      case $host_os in\n      solaris2.[0-5] | solaris2.[0-5].*) ;;\n      *)\n\t# The compiler driver will combine and reorder linker options,\n\t# but understands `-z linker_flag'.  GCC discards it without `$wl',\n\t# but is careful enough not to reorder.\n\t# Supported since Solaris 2.6 (maybe 2.5.1?)\n\tif test \"$GCC\" = yes; then\n\t  whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'\n\telse\n\t  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'\n\tfi\n\t;;\n      esac\n      link_all_deplibs=yes\n      ;;\n\n    sunos4*)\n      if test \"x$host_vendor\" = xsequent; then\n\t# Use $CC to link under sequent, because it throws in some extra .o\n\t# files that make .init and .fini sections work.\n\tarchive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\tarchive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'\n      fi\n      hardcode_libdir_flag_spec='-L$libdir'\n      hardcode_direct=yes\n      hardcode_minus_L=yes\n      hardcode_shlibpath_var=no\n      ;;\n\n    sysv4)\n      case $host_vendor in\n\tsni)\n\t  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t  hardcode_direct=yes # is this really true???\n\t;;\n\tsiemens)\n\t  ## LD is ld it makes a PLAMLIB\n\t  ## CC just makes a GrossModule.\n\t  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'\n\t  reload_cmds='$CC -r -o $output$reload_objs'\n\t  hardcode_direct=no\n        ;;\n\tmotorola)\n\t  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t  hardcode_direct=no #Motorola manual says yes, but my tests say they lie\n\t;;\n      esac\n      runpath_var='LD_RUN_PATH'\n      hardcode_shlibpath_var=no\n      ;;\n\n    sysv4.3*)\n      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      hardcode_shlibpath_var=no\n      export_dynamic_flag_spec='-Bexport'\n      ;;\n\n    sysv4*MP*)\n      if test -d /usr/nec; then\n\tarchive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\thardcode_shlibpath_var=no\n\trunpath_var=LD_RUN_PATH\n\thardcode_runpath_var=yes\n\tld_shlibs=yes\n      fi\n      ;;\n\n    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)\n      no_undefined_flag='${wl}-z,text'\n      archive_cmds_need_lc=no\n      hardcode_shlibpath_var=no\n      runpath_var='LD_RUN_PATH'\n\n      if test \"$GCC\" = yes; then\n\tarchive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\tarchive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\tarchive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\tarchive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      fi\n      ;;\n\n    sysv5* | sco3.2v5* | sco5v6*)\n      # Note: We can NOT use -z defs as we might desire, because we do not\n      # link with -lc, and that would cause any symbols used from libc to\n      # always be unresolved, which means just about no library would\n      # ever link correctly.  If we're not using GNU ld we use -z text\n      # though, which does catch some bad symbols but isn't as heavy-handed\n      # as -z defs.\n      no_undefined_flag='${wl}-z,text'\n      allow_undefined_flag='${wl}-z,nodefs'\n      archive_cmds_need_lc=no\n      hardcode_shlibpath_var=no\n      hardcode_libdir_flag_spec='${wl}-R,$libdir'\n      hardcode_libdir_separator=':'\n      link_all_deplibs=yes\n      export_dynamic_flag_spec='${wl}-Bexport'\n      runpath_var='LD_RUN_PATH'\n\n      if test \"$GCC\" = yes; then\n\tarchive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\tarchive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\tarchive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\tarchive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      fi\n      ;;\n\n    uts4*)\n      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      hardcode_libdir_flag_spec='-L$libdir'\n      hardcode_shlibpath_var=no\n      ;;\n\n    *)\n      ld_shlibs=no\n      ;;\n    esac\n\n    if test x$host_vendor = xsni; then\n      case $host in\n      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)\n\texport_dynamic_flag_spec='${wl}-Blargedynsym'\n\t;;\n      esac\n    fi\n  fi\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ld_shlibs\" >&5\n$as_echo \"$ld_shlibs\" >&6; }\ntest \"$ld_shlibs\" = no && can_build_shared=no\n\nwith_gnu_ld=$with_gnu_ld\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n#\n# Do we need to explicitly link libc?\n#\ncase \"x$archive_cmds_need_lc\" in\nx|xyes)\n  # Assume -lc should be added\n  archive_cmds_need_lc=yes\n\n  if test \"$enable_shared\" = yes && test \"$GCC\" = yes; then\n    case $archive_cmds in\n    *'~'*)\n      # FIXME: we may have to deal with multi-command sequences.\n      ;;\n    '$CC '*)\n      # Test whether the compiler implicitly links with -lc since on some\n      # systems, -lgcc has to come before -lc. If gcc already passes -lc\n      # to ld, don't add -lc before -lgcc.\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in\" >&5\n$as_echo_n \"checking whether -lc should be explicitly linked in... \" >&6; }\nif ${lt_cv_archive_cmds_need_lc+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  $RM conftest*\n\techo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n\n\tif { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } 2>conftest.err; then\n\t  soname=conftest\n\t  lib=conftest\n\t  libobjs=conftest.$ac_objext\n\t  deplibs=\n\t  wl=$lt_prog_compiler_wl\n\t  pic_flag=$lt_prog_compiler_pic\n\t  compiler_flags=-v\n\t  linker_flags=-v\n\t  verstring=\n\t  output_objdir=.\n\t  libname=conftest\n\t  lt_save_allow_undefined_flag=$allow_undefined_flag\n\t  allow_undefined_flag=\n\t  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$archive_cmds 2\\>\\&1 \\| $GREP \\\" -lc \\\" \\>/dev/null 2\\>\\&1\\\"\"; } >&5\n  (eval $archive_cmds 2\\>\\&1 \\| $GREP \\\" -lc \\\" \\>/dev/null 2\\>\\&1) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\n\t  then\n\t    lt_cv_archive_cmds_need_lc=no\n\t  else\n\t    lt_cv_archive_cmds_need_lc=yes\n\t  fi\n\t  allow_undefined_flag=$lt_save_allow_undefined_flag\n\telse\n\t  cat conftest.err 1>&5\n\tfi\n\t$RM conftest*\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc\" >&5\n$as_echo \"$lt_cv_archive_cmds_need_lc\" >&6; }\n      archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc\n      ;;\n    esac\n  fi\n  ;;\nesac\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\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\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\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\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\n\n\n\n\n\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics\" >&5\n$as_echo_n \"checking dynamic linker characteristics... \" >&6; }\n\nif test \"$GCC\" = yes; then\n  case $host_os in\n    darwin*) lt_awk_arg=\"/^libraries:/,/LR/\" ;;\n    *) lt_awk_arg=\"/^libraries:/\" ;;\n  esac\n  case $host_os in\n    mingw* | cegcc*) lt_sed_strip_eq=\"s,=\\([A-Za-z]:\\),\\1,g\" ;;\n    *) lt_sed_strip_eq=\"s,=/,/,g\" ;;\n  esac\n  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e \"s/^libraries://\" -e $lt_sed_strip_eq`\n  case $lt_search_path_spec in\n  *\\;*)\n    # if the path contains \";\" then we assume it to be the separator\n    # otherwise default to the standard path separator (i.e. \":\") - it is\n    # assumed that no part of a normal pathname contains \";\" but that should\n    # okay in the real world where \";\" in dirpaths is itself problematic.\n    lt_search_path_spec=`$ECHO \"$lt_search_path_spec\" | $SED 's/;/ /g'`\n    ;;\n  *)\n    lt_search_path_spec=`$ECHO \"$lt_search_path_spec\" | $SED \"s/$PATH_SEPARATOR/ /g\"`\n    ;;\n  esac\n  # Ok, now we have the path, separated by spaces, we can step through it\n  # and add multilib dir if necessary.\n  lt_tmp_lt_search_path_spec=\n  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`\n  for lt_sys_path in $lt_search_path_spec; do\n    if test -d \"$lt_sys_path/$lt_multi_os_dir\"; then\n      lt_tmp_lt_search_path_spec=\"$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir\"\n    else\n      test -d \"$lt_sys_path\" && \\\n\tlt_tmp_lt_search_path_spec=\"$lt_tmp_lt_search_path_spec $lt_sys_path\"\n    fi\n  done\n  lt_search_path_spec=`$ECHO \"$lt_tmp_lt_search_path_spec\" | awk '\nBEGIN {RS=\" \"; FS=\"/|\\n\";} {\n  lt_foo=\"\";\n  lt_count=0;\n  for (lt_i = NF; lt_i > 0; lt_i--) {\n    if ($lt_i != \"\" && $lt_i != \".\") {\n      if ($lt_i == \"..\") {\n        lt_count++;\n      } else {\n        if (lt_count == 0) {\n          lt_foo=\"/\" $lt_i lt_foo;\n        } else {\n          lt_count--;\n        }\n      }\n    }\n  }\n  if (lt_foo != \"\") { lt_freq[lt_foo]++; }\n  if (lt_freq[lt_foo] == 1) { print lt_foo; }\n}'`\n  # AWK program above erroneously prepends '/' to C:/dos/paths\n  # for these hosts.\n  case $host_os in\n    mingw* | cegcc*) lt_search_path_spec=`$ECHO \"$lt_search_path_spec\" |\\\n      $SED 's,/\\([A-Za-z]:\\),\\1,g'` ;;\n  esac\n  sys_lib_search_path_spec=`$ECHO \"$lt_search_path_spec\" | $lt_NL2SP`\nelse\n  sys_lib_search_path_spec=\"/lib /usr/lib /usr/local/lib\"\nfi\nlibrary_names_spec=\nlibname_spec='lib$name'\nsoname_spec=\nshrext_cmds=\".so\"\npostinstall_cmds=\npostuninstall_cmds=\nfinish_cmds=\nfinish_eval=\nshlibpath_var=\nshlibpath_overrides_runpath=unknown\nversion_type=none\ndynamic_linker=\"$host_os ld.so\"\nsys_lib_dlsearch_path_spec=\"/lib /usr/lib\"\nneed_lib_prefix=unknown\nhardcode_into_libs=no\n\n# when you set need_version to no, make sure it does not cause -set_version\n# flags to be left without arguments\nneed_version=unknown\n\ncase $host_os in\naix3*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'\n  shlibpath_var=LIBPATH\n\n  # AIX 3 has no versioning support, so we append a major version to the name.\n  soname_spec='${libname}${release}${shared_ext}$major'\n  ;;\n\naix[4-9]*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  hardcode_into_libs=yes\n  if test \"$host_cpu\" = ia64; then\n    # AIX 5 supports IA64\n    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'\n    shlibpath_var=LD_LIBRARY_PATH\n  else\n    # With GCC up to 2.95.x, collect2 would create an import file\n    # for dependence libraries.  The import file would start with\n    # the line `#! .'.  This would cause the generated library to\n    # depend on `.', always an invalid library.  This was fixed in\n    # development snapshots of GCC prior to 3.0.\n    case $host_os in\n      aix4 | aix4.[01] | aix4.[01].*)\n      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'\n\t   echo ' yes '\n\t   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then\n\t:\n      else\n\tcan_build_shared=no\n      fi\n      ;;\n    esac\n    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct\n    # soname into executable. Probably we can add versioning support to\n    # collect2, so additional links can be useful in future.\n    if test \"$aix_use_runtimelinking\" = yes; then\n      # If using run time linking (on AIX 4.2 or later) use lib<name>.so\n      # instead of lib<name>.a to let people know that these are not\n      # typical AIX shared libraries.\n      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    else\n      # We preserve .a as extension for shared libraries through AIX4.2\n      # and later when we are not doing run time linking.\n      library_names_spec='${libname}${release}.a $libname.a'\n      soname_spec='${libname}${release}${shared_ext}$major'\n    fi\n    shlibpath_var=LIBPATH\n  fi\n  ;;\n\namigaos*)\n  case $host_cpu in\n  powerpc)\n    # Since July 2007 AmigaOS4 officially supports .so libraries.\n    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    ;;\n  m68k)\n    library_names_spec='$libname.ixlibrary $libname.a'\n    # Create ${libname}_ixlibrary.a entries in /sys/libs.\n    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all \"$lib\" | $SED '\\''s%^.*/\\([^/]*\\)\\.ixlibrary$%\\1%'\\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show \"cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a\"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'\n    ;;\n  esac\n  ;;\n\nbeos*)\n  library_names_spec='${libname}${shared_ext}'\n  dynamic_linker=\"$host_os ld.so\"\n  shlibpath_var=LIBRARY_PATH\n  ;;\n\nbsdi[45]*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  sys_lib_search_path_spec=\"/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib\"\n  sys_lib_dlsearch_path_spec=\"/shlib /usr/lib /usr/local/lib\"\n  # the default ld.so.conf also contains /usr/contrib/lib and\n  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow\n  # libtool to hard-code these into programs\n  ;;\n\ncygwin* | mingw* | pw32* | cegcc*)\n  version_type=windows\n  shrext_cmds=\".dll\"\n  need_version=no\n  need_lib_prefix=no\n\n  case $GCC,$cc_basename in\n  yes,*)\n    # gcc\n    library_names_spec='$libname.dll.a'\n    # DLL is installed to $(libdir)/../bin by postinstall_cmds\n    postinstall_cmds='base_file=`basename \\${file}`~\n      dlpath=`$SHELL 2>&1 -c '\\''. $dir/'\\''\\${base_file}'\\''i; echo \\$dlname'\\''`~\n      dldir=$destdir/`dirname \\$dlpath`~\n      test -d \\$dldir || mkdir -p \\$dldir~\n      $install_prog $dir/$dlname \\$dldir/$dlname~\n      chmod a+x \\$dldir/$dlname~\n      if test -n '\\''$stripme'\\'' && test -n '\\''$striplib'\\''; then\n        eval '\\''$striplib \\$dldir/$dlname'\\'' || exit \\$?;\n      fi'\n    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\\''. $file; echo \\$dlname'\\''`~\n      dlpath=$dir/\\$dldll~\n       $RM \\$dlpath'\n    shlibpath_overrides_runpath=yes\n\n    case $host_os in\n    cygwin*)\n      # Cygwin DLLs use 'cyg' prefix rather than 'lib'\n      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'\n\n      sys_lib_search_path_spec=\"$sys_lib_search_path_spec /usr/lib/w32api\"\n      ;;\n    mingw* | cegcc*)\n      # MinGW DLLs use traditional 'lib' prefix\n      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'\n      ;;\n    pw32*)\n      # pw32 DLLs use 'pw' prefix rather than 'lib'\n      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'\n      ;;\n    esac\n    dynamic_linker='Win32 ld.exe'\n    ;;\n\n  *,cl*)\n    # Native MSVC\n    libname_spec='$name'\n    soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'\n    library_names_spec='${libname}.dll.lib'\n\n    case $build_os in\n    mingw*)\n      sys_lib_search_path_spec=\n      lt_save_ifs=$IFS\n      IFS=';'\n      for lt_path in $LIB\n      do\n        IFS=$lt_save_ifs\n        # Let DOS variable expansion print the short 8.3 style file name.\n        lt_path=`cd \"$lt_path\" 2>/dev/null && cmd //C \"for %i in (\".\") do @echo %~si\"`\n        sys_lib_search_path_spec=\"$sys_lib_search_path_spec $lt_path\"\n      done\n      IFS=$lt_save_ifs\n      # Convert to MSYS style.\n      sys_lib_search_path_spec=`$ECHO \"$sys_lib_search_path_spec\" | sed -e 's|\\\\\\\\|/|g' -e 's| \\\\([a-zA-Z]\\\\):| /\\\\1|g' -e 's|^ ||'`\n      ;;\n    cygwin*)\n      # Convert to unix form, then to dos form, then back to unix form\n      # but this time dos style (no spaces!) so that the unix form looks\n      # like /cygdrive/c/PROGRA~1:/cygdr...\n      sys_lib_search_path_spec=`cygpath --path --unix \"$LIB\"`\n      sys_lib_search_path_spec=`cygpath --path --dos \"$sys_lib_search_path_spec\" 2>/dev/null`\n      sys_lib_search_path_spec=`cygpath --path --unix \"$sys_lib_search_path_spec\" | $SED -e \"s/$PATH_SEPARATOR/ /g\"`\n      ;;\n    *)\n      sys_lib_search_path_spec=\"$LIB\"\n      if $ECHO \"$sys_lib_search_path_spec\" | $GREP ';[c-zC-Z]:/' >/dev/null; then\n        # It is most probably a Windows format PATH.\n        sys_lib_search_path_spec=`$ECHO \"$sys_lib_search_path_spec\" | $SED -e 's/;/ /g'`\n      else\n        sys_lib_search_path_spec=`$ECHO \"$sys_lib_search_path_spec\" | $SED -e \"s/$PATH_SEPARATOR/ /g\"`\n      fi\n      # FIXME: find the short name or the path components, as spaces are\n      # common. (e.g. \"Program Files\" -> \"PROGRA~1\")\n      ;;\n    esac\n\n    # DLL is installed to $(libdir)/../bin by postinstall_cmds\n    postinstall_cmds='base_file=`basename \\${file}`~\n      dlpath=`$SHELL 2>&1 -c '\\''. $dir/'\\''\\${base_file}'\\''i; echo \\$dlname'\\''`~\n      dldir=$destdir/`dirname \\$dlpath`~\n      test -d \\$dldir || mkdir -p \\$dldir~\n      $install_prog $dir/$dlname \\$dldir/$dlname'\n    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\\''. $file; echo \\$dlname'\\''`~\n      dlpath=$dir/\\$dldll~\n       $RM \\$dlpath'\n    shlibpath_overrides_runpath=yes\n    dynamic_linker='Win32 link.exe'\n    ;;\n\n  *)\n    # Assume MSVC wrapper\n    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'\n    dynamic_linker='Win32 ld.exe'\n    ;;\n  esac\n  # FIXME: first we should search . and the directory the executable is in\n  shlibpath_var=PATH\n  ;;\n\ndarwin* | rhapsody*)\n  dynamic_linker=\"$host_os dyld\"\n  version_type=darwin\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'\n  soname_spec='${libname}${release}${major}$shared_ext'\n  shlibpath_overrides_runpath=yes\n  shlibpath_var=DYLD_LIBRARY_PATH\n  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'\n\n  sys_lib_search_path_spec=\"$sys_lib_search_path_spec /usr/local/lib\"\n  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'\n  ;;\n\ndgux*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\nfreebsd* | dragonfly*)\n  # DragonFly does not have aout.  When/if they implement a new\n  # versioning mechanism, adjust this.\n  if test -x /usr/bin/objformat; then\n    objformat=`/usr/bin/objformat`\n  else\n    case $host_os in\n    freebsd[23].*) objformat=aout ;;\n    *) objformat=elf ;;\n    esac\n  fi\n  version_type=freebsd-$objformat\n  case $version_type in\n    freebsd-elf*)\n      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'\n      need_version=no\n      need_lib_prefix=no\n      ;;\n    freebsd-*)\n      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'\n      need_version=yes\n      ;;\n  esac\n  shlibpath_var=LD_LIBRARY_PATH\n  case $host_os in\n  freebsd2.*)\n    shlibpath_overrides_runpath=yes\n    ;;\n  freebsd3.[01]* | freebsdelf3.[01]*)\n    shlibpath_overrides_runpath=yes\n    hardcode_into_libs=yes\n    ;;\n  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \\\n  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)\n    shlibpath_overrides_runpath=no\n    hardcode_into_libs=yes\n    ;;\n  *) # from 4.6 on, and DragonFly\n    shlibpath_overrides_runpath=yes\n    hardcode_into_libs=yes\n    ;;\n  esac\n  ;;\n\ngnu*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  ;;\n\nhaiku*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  dynamic_linker=\"$host_os runtime_loader\"\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'\n  hardcode_into_libs=yes\n  ;;\n\nhpux9* | hpux10* | hpux11*)\n  # Give a soname corresponding to the major version so that dld.sl refuses to\n  # link against other versions.\n  version_type=sunos\n  need_lib_prefix=no\n  need_version=no\n  case $host_cpu in\n  ia64*)\n    shrext_cmds='.so'\n    hardcode_into_libs=yes\n    dynamic_linker=\"$host_os dld.so\"\n    shlibpath_var=LD_LIBRARY_PATH\n    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    if test \"X$HPUX_IA64_MODE\" = X32; then\n      sys_lib_search_path_spec=\"/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib\"\n    else\n      sys_lib_search_path_spec=\"/usr/lib/hpux64 /usr/local/lib/hpux64\"\n    fi\n    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec\n    ;;\n  hppa*64*)\n    shrext_cmds='.sl'\n    hardcode_into_libs=yes\n    dynamic_linker=\"$host_os dld.sl\"\n    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH\n    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    sys_lib_search_path_spec=\"/usr/lib/pa20_64 /usr/ccs/lib/pa20_64\"\n    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec\n    ;;\n  *)\n    shrext_cmds='.sl'\n    dynamic_linker=\"$host_os dld.sl\"\n    shlibpath_var=SHLIB_PATH\n    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    ;;\n  esac\n  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...\n  postinstall_cmds='chmod 555 $lib'\n  # or fails outright, so override atomically:\n  install_override_mode=555\n  ;;\n\ninterix[3-9]*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  ;;\n\nirix5* | irix6* | nonstopux*)\n  case $host_os in\n    nonstopux*) version_type=nonstopux ;;\n    *)\n\tif test \"$lt_cv_prog_gnu_ld\" = yes; then\n\t\tversion_type=linux # correct to gnu/linux during the next big refactor\n\telse\n\t\tversion_type=irix\n\tfi ;;\n  esac\n  need_lib_prefix=no\n  need_version=no\n  soname_spec='${libname}${release}${shared_ext}$major'\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'\n  case $host_os in\n  irix5* | nonstopux*)\n    libsuff= shlibsuff=\n    ;;\n  *)\n    case $LD in # libtool.m4 will add one of these switches to LD\n    *-32|*\"-32 \"|*-melf32bsmip|*\"-melf32bsmip \")\n      libsuff= shlibsuff= libmagic=32-bit;;\n    *-n32|*\"-n32 \"|*-melf32bmipn32|*\"-melf32bmipn32 \")\n      libsuff=32 shlibsuff=N32 libmagic=N32;;\n    *-64|*\"-64 \"|*-melf64bmip|*\"-melf64bmip \")\n      libsuff=64 shlibsuff=64 libmagic=64-bit;;\n    *) libsuff= shlibsuff= libmagic=never-match;;\n    esac\n    ;;\n  esac\n  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH\n  shlibpath_overrides_runpath=no\n  sys_lib_search_path_spec=\"/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}\"\n  sys_lib_dlsearch_path_spec=\"/usr/lib${libsuff} /lib${libsuff}\"\n  hardcode_into_libs=yes\n  ;;\n\n# No shared lib support for Linux oldld, aout, or coff.\nlinux*oldld* | linux*aout* | linux*coff*)\n  dynamic_linker=no\n  ;;\n\n# This must be glibc/ELF.\nlinux* | k*bsd*-gnu | kopensolaris*-gnu)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -n $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n\n  # Some binutils ld are patched to set DT_RUNPATH\n  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_shlibpath_overrides_runpath=no\n    save_LDFLAGS=$LDFLAGS\n    save_libdir=$libdir\n    eval \"libdir=/foo; wl=\\\"$lt_prog_compiler_wl\\\"; \\\n\t LDFLAGS=\\\"\\$LDFLAGS $hardcode_libdir_flag_spec\\\"\"\n    cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep \"RUNPATH.*$libdir\" >/dev/null; then :\n  lt_cv_shlibpath_overrides_runpath=yes\nfi\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n    LDFLAGS=$save_LDFLAGS\n    libdir=$save_libdir\n\nfi\n\n  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath\n\n  # This implies no fast_install, which is unacceptable.\n  # Some rework will be needed to allow for fast_install\n  # before this can be enabled.\n  hardcode_into_libs=yes\n\n  # Append ld.so.conf contents to the search path\n  if test -f /etc/ld.so.conf; then\n    lt_ld_extra=`awk '/^include / { system(sprintf(\"cd /etc; cat %s 2>/dev/null\", \\$2)); skip = 1; } { if (!skip) print \\$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[\t ]*hwcap[\t ]/d;s/[:,\t]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/\"//g;/^$/d' | tr '\\n' ' '`\n    sys_lib_dlsearch_path_spec=\"/lib /usr/lib $lt_ld_extra\"\n  fi\n\n  # We used to test for /lib/ld.so.1 and disable shared libraries on\n  # powerpc, because MkLinux only supported shared libraries with the\n  # GNU dynamic linker.  Since this was broken with cross compilers,\n  # most powerpc-linux boxes support dynamic linking these days and\n  # people can always --disable-shared, the test was removed, and we\n  # assume the GNU/Linux dynamic linker is in use.\n  dynamic_linker='GNU/Linux ld.so'\n  ;;\n\nnetbsdelf*-gnu)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  dynamic_linker='NetBSD ld.elf_so'\n  ;;\n\nnetbsd*)\n  version_type=sunos\n  need_lib_prefix=no\n  need_version=no\n  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'\n    finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -m $libdir'\n    dynamic_linker='NetBSD (a.out) ld.so'\n  else\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    dynamic_linker='NetBSD ld.elf_so'\n  fi\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  ;;\n\nnewsos6)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  ;;\n\n*nto* | *qnx*)\n  version_type=qnx\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  dynamic_linker='ldqnx.so'\n  ;;\n\nopenbsd*)\n  version_type=sunos\n  sys_lib_dlsearch_path_spec=\"/usr/lib\"\n  need_lib_prefix=no\n  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.\n  case $host_os in\n    openbsd3.3 | openbsd3.3.*)\tneed_version=yes ;;\n    *)\t\t\t\tneed_version=no  ;;\n  esac\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -m $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  if test -z \"`echo __ELF__ | $CC -E - | $GREP __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n    case $host_os in\n      openbsd2.[89] | openbsd2.[89].*)\n\tshlibpath_overrides_runpath=no\n\t;;\n      *)\n\tshlibpath_overrides_runpath=yes\n\t;;\n      esac\n  else\n    shlibpath_overrides_runpath=yes\n  fi\n  ;;\n\nos2*)\n  libname_spec='$name'\n  shrext_cmds=\".dll\"\n  need_lib_prefix=no\n  library_names_spec='$libname${shared_ext} $libname.a'\n  dynamic_linker='OS/2 ld.exe'\n  shlibpath_var=LIBPATH\n  ;;\n\nosf3* | osf4* | osf5*)\n  version_type=osf\n  need_lib_prefix=no\n  need_version=no\n  soname_spec='${libname}${release}${shared_ext}$major'\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  shlibpath_var=LD_LIBRARY_PATH\n  sys_lib_search_path_spec=\"/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib\"\n  sys_lib_dlsearch_path_spec=\"$sys_lib_search_path_spec\"\n  ;;\n\nrdos*)\n  dynamic_linker=no\n  ;;\n\nsolaris*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  # ldd complains unless libraries are executable\n  postinstall_cmds='chmod +x $lib'\n  ;;\n\nsunos4*)\n  version_type=sunos\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'\n  finish_cmds='PATH=\"\\$PATH:/usr/etc\" ldconfig $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  if test \"$with_gnu_ld\" = yes; then\n    need_lib_prefix=no\n  fi\n  need_version=yes\n  ;;\n\nsysv4 | sysv4.3*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  case $host_vendor in\n    sni)\n      shlibpath_overrides_runpath=no\n      need_lib_prefix=no\n      runpath_var=LD_RUN_PATH\n      ;;\n    siemens)\n      need_lib_prefix=no\n      ;;\n    motorola)\n      need_lib_prefix=no\n      need_version=no\n      shlibpath_overrides_runpath=no\n      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'\n      ;;\n  esac\n  ;;\n\nsysv4*MP*)\n  if test -d /usr/nec ;then\n    version_type=linux # correct to gnu/linux during the next big refactor\n    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'\n    soname_spec='$libname${shared_ext}.$major'\n    shlibpath_var=LD_LIBRARY_PATH\n  fi\n  ;;\n\nsysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)\n  version_type=freebsd-elf\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  if test \"$with_gnu_ld\" = yes; then\n    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'\n  else\n    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'\n    case $host_os in\n      sco3.2v5*)\n        sys_lib_search_path_spec=\"$sys_lib_search_path_spec /lib\"\n\t;;\n    esac\n  fi\n  sys_lib_dlsearch_path_spec='/usr/lib'\n  ;;\n\ntpf*)\n  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  ;;\n\nuts4*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\n*)\n  dynamic_linker=no\n  ;;\nesac\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $dynamic_linker\" >&5\n$as_echo \"$dynamic_linker\" >&6; }\ntest \"$dynamic_linker\" = no && can_build_shared=no\n\nvariables_saved_for_relink=\"PATH $shlibpath_var $runpath_var\"\nif test \"$GCC\" = yes; then\n  variables_saved_for_relink=\"$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH\"\nfi\n\nif test \"${lt_cv_sys_lib_search_path_spec+set}\" = set; then\n  sys_lib_search_path_spec=\"$lt_cv_sys_lib_search_path_spec\"\nfi\nif test \"${lt_cv_sys_lib_dlsearch_path_spec+set}\" = set; then\n  sys_lib_dlsearch_path_spec=\"$lt_cv_sys_lib_dlsearch_path_spec\"\nfi\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\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\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\n\n\n\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs\" >&5\n$as_echo_n \"checking how to hardcode library paths into programs... \" >&6; }\nhardcode_action=\nif test -n \"$hardcode_libdir_flag_spec\" ||\n   test -n \"$runpath_var\" ||\n   test \"X$hardcode_automatic\" = \"Xyes\" ; then\n\n  # We can hardcode non-existent directories.\n  if test \"$hardcode_direct\" != no &&\n     # If the only mechanism to avoid hardcoding is shlibpath_var, we\n     # have to relink, otherwise we might link with an installed library\n     # when we should be linking with a yet-to-be-installed one\n     ## test \"$_LT_TAGVAR(hardcode_shlibpath_var, )\" != no &&\n     test \"$hardcode_minus_L\" != no; then\n    # Linking always hardcodes the temporary library directory.\n    hardcode_action=relink\n  else\n    # We can link without hardcoding, and we can hardcode nonexisting dirs.\n    hardcode_action=immediate\n  fi\nelse\n  # We cannot hardcode anything, or else we can only hardcode existing\n  # directories.\n  hardcode_action=unsupported\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $hardcode_action\" >&5\n$as_echo \"$hardcode_action\" >&6; }\n\nif test \"$hardcode_action\" = relink ||\n   test \"$inherit_rpath\" = yes; then\n  # Fast installation is not supported\n  enable_fast_install=no\nelif test \"$shlibpath_overrides_runpath\" = yes ||\n     test \"$enable_shared\" = no; then\n  # Fast installation is not necessary\n  enable_fast_install=needless\nfi\n\n\n\n\n\n\n  if test \"x$enable_dlopen\" != xyes; then\n  enable_dlopen=unknown\n  enable_dlopen_self=unknown\n  enable_dlopen_self_static=unknown\nelse\n  lt_cv_dlopen=no\n  lt_cv_dlopen_libs=\n\n  case $host_os in\n  beos*)\n    lt_cv_dlopen=\"load_add_on\"\n    lt_cv_dlopen_libs=\n    lt_cv_dlopen_self=yes\n    ;;\n\n  mingw* | pw32* | cegcc*)\n    lt_cv_dlopen=\"LoadLibrary\"\n    lt_cv_dlopen_libs=\n    ;;\n\n  cygwin*)\n    lt_cv_dlopen=\"dlopen\"\n    lt_cv_dlopen_libs=\n    ;;\n\n  darwin*)\n  # if libdl is installed we need to link against it\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl\" >&5\n$as_echo_n \"checking for dlopen in -ldl... \" >&6; }\nif ${ac_cv_lib_dl_dlopen+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-ldl  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar dlopen ();\nint\nmain ()\n{\nreturn dlopen ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_dl_dlopen=yes\nelse\n  ac_cv_lib_dl_dlopen=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen\" >&5\n$as_echo \"$ac_cv_lib_dl_dlopen\" >&6; }\nif test \"x$ac_cv_lib_dl_dlopen\" = xyes; then :\n  lt_cv_dlopen=\"dlopen\" lt_cv_dlopen_libs=\"-ldl\"\nelse\n\n    lt_cv_dlopen=\"dyld\"\n    lt_cv_dlopen_libs=\n    lt_cv_dlopen_self=yes\n\nfi\n\n    ;;\n\n  *)\n    ac_fn_c_check_func \"$LINENO\" \"shl_load\" \"ac_cv_func_shl_load\"\nif test \"x$ac_cv_func_shl_load\" = xyes; then :\n  lt_cv_dlopen=\"shl_load\"\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld\" >&5\n$as_echo_n \"checking for shl_load in -ldld... \" >&6; }\nif ${ac_cv_lib_dld_shl_load+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-ldld  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar shl_load ();\nint\nmain ()\n{\nreturn shl_load ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_dld_shl_load=yes\nelse\n  ac_cv_lib_dld_shl_load=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load\" >&5\n$as_echo \"$ac_cv_lib_dld_shl_load\" >&6; }\nif test \"x$ac_cv_lib_dld_shl_load\" = xyes; then :\n  lt_cv_dlopen=\"shl_load\" lt_cv_dlopen_libs=\"-ldld\"\nelse\n  ac_fn_c_check_func \"$LINENO\" \"dlopen\" \"ac_cv_func_dlopen\"\nif test \"x$ac_cv_func_dlopen\" = xyes; then :\n  lt_cv_dlopen=\"dlopen\"\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl\" >&5\n$as_echo_n \"checking for dlopen in -ldl... \" >&6; }\nif ${ac_cv_lib_dl_dlopen+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-ldl  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar dlopen ();\nint\nmain ()\n{\nreturn dlopen ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_dl_dlopen=yes\nelse\n  ac_cv_lib_dl_dlopen=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen\" >&5\n$as_echo \"$ac_cv_lib_dl_dlopen\" >&6; }\nif test \"x$ac_cv_lib_dl_dlopen\" = xyes; then :\n  lt_cv_dlopen=\"dlopen\" lt_cv_dlopen_libs=\"-ldl\"\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld\" >&5\n$as_echo_n \"checking for dlopen in -lsvld... \" >&6; }\nif ${ac_cv_lib_svld_dlopen+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lsvld  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar dlopen ();\nint\nmain ()\n{\nreturn dlopen ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_svld_dlopen=yes\nelse\n  ac_cv_lib_svld_dlopen=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen\" >&5\n$as_echo \"$ac_cv_lib_svld_dlopen\" >&6; }\nif test \"x$ac_cv_lib_svld_dlopen\" = xyes; then :\n  lt_cv_dlopen=\"dlopen\" lt_cv_dlopen_libs=\"-lsvld\"\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld\" >&5\n$as_echo_n \"checking for dld_link in -ldld... \" >&6; }\nif ${ac_cv_lib_dld_dld_link+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-ldld  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar dld_link ();\nint\nmain ()\n{\nreturn dld_link ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_dld_dld_link=yes\nelse\n  ac_cv_lib_dld_dld_link=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link\" >&5\n$as_echo \"$ac_cv_lib_dld_dld_link\" >&6; }\nif test \"x$ac_cv_lib_dld_dld_link\" = xyes; then :\n  lt_cv_dlopen=\"dld_link\" lt_cv_dlopen_libs=\"-ldld\"\nfi\n\n\nfi\n\n\nfi\n\n\nfi\n\n\nfi\n\n\nfi\n\n    ;;\n  esac\n\n  if test \"x$lt_cv_dlopen\" != xno; then\n    enable_dlopen=yes\n  else\n    enable_dlopen=no\n  fi\n\n  case $lt_cv_dlopen in\n  dlopen)\n    save_CPPFLAGS=\"$CPPFLAGS\"\n    test \"x$ac_cv_header_dlfcn_h\" = xyes && CPPFLAGS=\"$CPPFLAGS -DHAVE_DLFCN_H\"\n\n    save_LDFLAGS=\"$LDFLAGS\"\n    wl=$lt_prog_compiler_wl eval LDFLAGS=\\\"\\$LDFLAGS $export_dynamic_flag_spec\\\"\n\n    save_LIBS=\"$LIBS\"\n    LIBS=\"$lt_cv_dlopen_libs $LIBS\"\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself\" >&5\n$as_echo_n \"checking whether a program can dlopen itself... \" >&6; }\nif ${lt_cv_dlopen_self+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  \t  if test \"$cross_compiling\" = yes; then :\n  lt_cv_dlopen_self=cross\nelse\n  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2\n  lt_status=$lt_dlunknown\n  cat > conftest.$ac_ext <<_LT_EOF\n#line $LINENO \"configure\"\n#include \"confdefs.h\"\n\n#if HAVE_DLFCN_H\n#include <dlfcn.h>\n#endif\n\n#include <stdio.h>\n\n#ifdef RTLD_GLOBAL\n#  define LT_DLGLOBAL\t\tRTLD_GLOBAL\n#else\n#  ifdef DL_GLOBAL\n#    define LT_DLGLOBAL\t\tDL_GLOBAL\n#  else\n#    define LT_DLGLOBAL\t\t0\n#  endif\n#endif\n\n/* We may have to define LT_DLLAZY_OR_NOW in the command line if we\n   find out it does not work in some platform. */\n#ifndef LT_DLLAZY_OR_NOW\n#  ifdef RTLD_LAZY\n#    define LT_DLLAZY_OR_NOW\t\tRTLD_LAZY\n#  else\n#    ifdef DL_LAZY\n#      define LT_DLLAZY_OR_NOW\t\tDL_LAZY\n#    else\n#      ifdef RTLD_NOW\n#        define LT_DLLAZY_OR_NOW\tRTLD_NOW\n#      else\n#        ifdef DL_NOW\n#          define LT_DLLAZY_OR_NOW\tDL_NOW\n#        else\n#          define LT_DLLAZY_OR_NOW\t0\n#        endif\n#      endif\n#    endif\n#  endif\n#endif\n\n/* When -fvisbility=hidden is used, assume the code has been annotated\n   correspondingly for the symbols needed.  */\n#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))\nint fnord () __attribute__((visibility(\"default\")));\n#endif\n\nint fnord () { return 42; }\nint main ()\n{\n  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);\n  int status = $lt_dlunknown;\n\n  if (self)\n    {\n      if (dlsym (self,\"fnord\"))       status = $lt_dlno_uscore;\n      else\n        {\n\t  if (dlsym( self,\"_fnord\"))  status = $lt_dlneed_uscore;\n          else puts (dlerror ());\n\t}\n      /* dlclose (self); */\n    }\n  else\n    puts (dlerror ());\n\n  return status;\n}\n_LT_EOF\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_link\\\"\"; } >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then\n    (./conftest; exit; ) >&5 2>/dev/null\n    lt_status=$?\n    case x$lt_status in\n      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;\n      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;\n      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;\n    esac\n  else :\n    # compilation failed\n    lt_cv_dlopen_self=no\n  fi\nfi\nrm -fr conftest*\n\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self\" >&5\n$as_echo \"$lt_cv_dlopen_self\" >&6; }\n\n    if test \"x$lt_cv_dlopen_self\" = xyes; then\n      wl=$lt_prog_compiler_wl eval LDFLAGS=\\\"\\$LDFLAGS $lt_prog_compiler_static\\\"\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself\" >&5\n$as_echo_n \"checking whether a statically linked program can dlopen itself... \" >&6; }\nif ${lt_cv_dlopen_self_static+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  \t  if test \"$cross_compiling\" = yes; then :\n  lt_cv_dlopen_self_static=cross\nelse\n  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2\n  lt_status=$lt_dlunknown\n  cat > conftest.$ac_ext <<_LT_EOF\n#line $LINENO \"configure\"\n#include \"confdefs.h\"\n\n#if HAVE_DLFCN_H\n#include <dlfcn.h>\n#endif\n\n#include <stdio.h>\n\n#ifdef RTLD_GLOBAL\n#  define LT_DLGLOBAL\t\tRTLD_GLOBAL\n#else\n#  ifdef DL_GLOBAL\n#    define LT_DLGLOBAL\t\tDL_GLOBAL\n#  else\n#    define LT_DLGLOBAL\t\t0\n#  endif\n#endif\n\n/* We may have to define LT_DLLAZY_OR_NOW in the command line if we\n   find out it does not work in some platform. */\n#ifndef LT_DLLAZY_OR_NOW\n#  ifdef RTLD_LAZY\n#    define LT_DLLAZY_OR_NOW\t\tRTLD_LAZY\n#  else\n#    ifdef DL_LAZY\n#      define LT_DLLAZY_OR_NOW\t\tDL_LAZY\n#    else\n#      ifdef RTLD_NOW\n#        define LT_DLLAZY_OR_NOW\tRTLD_NOW\n#      else\n#        ifdef DL_NOW\n#          define LT_DLLAZY_OR_NOW\tDL_NOW\n#        else\n#          define LT_DLLAZY_OR_NOW\t0\n#        endif\n#      endif\n#    endif\n#  endif\n#endif\n\n/* When -fvisbility=hidden is used, assume the code has been annotated\n   correspondingly for the symbols needed.  */\n#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))\nint fnord () __attribute__((visibility(\"default\")));\n#endif\n\nint fnord () { return 42; }\nint main ()\n{\n  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);\n  int status = $lt_dlunknown;\n\n  if (self)\n    {\n      if (dlsym (self,\"fnord\"))       status = $lt_dlno_uscore;\n      else\n        {\n\t  if (dlsym( self,\"_fnord\"))  status = $lt_dlneed_uscore;\n          else puts (dlerror ());\n\t}\n      /* dlclose (self); */\n    }\n  else\n    puts (dlerror ());\n\n  return status;\n}\n_LT_EOF\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_link\\\"\"; } >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then\n    (./conftest; exit; ) >&5 2>/dev/null\n    lt_status=$?\n    case x$lt_status in\n      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;\n      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;\n      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;\n    esac\n  else :\n    # compilation failed\n    lt_cv_dlopen_self_static=no\n  fi\nfi\nrm -fr conftest*\n\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static\" >&5\n$as_echo \"$lt_cv_dlopen_self_static\" >&6; }\n    fi\n\n    CPPFLAGS=\"$save_CPPFLAGS\"\n    LDFLAGS=\"$save_LDFLAGS\"\n    LIBS=\"$save_LIBS\"\n    ;;\n  esac\n\n  case $lt_cv_dlopen_self in\n  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;\n  *) enable_dlopen_self=unknown ;;\n  esac\n\n  case $lt_cv_dlopen_self_static in\n  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;\n  *) enable_dlopen_self_static=unknown ;;\n  esac\nfi\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nstriplib=\nold_striplib=\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible\" >&5\n$as_echo_n \"checking whether stripping libraries is possible... \" >&6; }\nif test -n \"$STRIP\" && $STRIP -V 2>&1 | $GREP \"GNU strip\" >/dev/null; then\n  test -z \"$old_striplib\" && old_striplib=\"$STRIP --strip-debug\"\n  test -z \"$striplib\" && striplib=\"$STRIP --strip-unneeded\"\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\nelse\n# FIXME - insert some real tests, host_os isn't really good enough\n  case $host_os in\n  darwin*)\n    if test -n \"$STRIP\" ; then\n      striplib=\"$STRIP -x\"\n      old_striplib=\"$STRIP -S\"\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n    else\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n    fi\n    ;;\n  *)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n    ;;\n  esac\nfi\n\n\n\n\n\n\n\n\n\n\n\n\n  # Report which library types will actually be built\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries\" >&5\n$as_echo_n \"checking if libtool supports shared libraries... \" >&6; }\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $can_build_shared\" >&5\n$as_echo \"$can_build_shared\" >&6; }\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries\" >&5\n$as_echo_n \"checking whether to build shared libraries... \" >&6; }\n  test \"$can_build_shared\" = \"no\" && enable_shared=no\n\n  # On AIX, shared libraries and static libraries use the same namespace, and\n  # are all built from PIC.\n  case $host_os in\n  aix3*)\n    test \"$enable_shared\" = yes && enable_static=no\n    if test -n \"$RANLIB\"; then\n      archive_cmds=\"$archive_cmds~\\$RANLIB \\$lib\"\n      postinstall_cmds='$RANLIB $lib'\n    fi\n    ;;\n\n  aix[4-9]*)\n    if test \"$host_cpu\" != ia64 && test \"$aix_use_runtimelinking\" = no ; then\n      test \"$enable_shared\" = yes && enable_static=no\n    fi\n    ;;\n  esac\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $enable_shared\" >&5\n$as_echo \"$enable_shared\" >&6; }\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether to build static libraries\" >&5\n$as_echo_n \"checking whether to build static libraries... \" >&6; }\n  # Make sure either enable_shared or enable_static is yes.\n  test \"$enable_shared\" = yes || enable_static=yes\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $enable_static\" >&5\n$as_echo \"$enable_static\" >&6; }\n\n\n\n\nfi\nac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\n\nCC=\"$lt_save_CC\"\n\n      if test -n \"$CXX\" && ( test \"X$CXX\" != \"Xno\" &&\n    ( (test \"X$CXX\" = \"Xg++\" && `g++ -v >/dev/null 2>&1` ) ||\n    (test \"X$CXX\" != \"Xg++\"))) ; then\n  ac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor\" >&5\n$as_echo_n \"checking how to run the C++ preprocessor... \" >&6; }\nif test -z \"$CXXCPP\"; then\n  if ${ac_cv_prog_CXXCPP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n      # Double quotes because CXXCPP needs to be expanded\n    for CXXCPP in \"$CXX -E\" \"/lib/cpp\"\n    do\n      ac_preproc_ok=false\nfor ac_cxx_preproc_warn_flag in '' yes\ndo\n  # Use a header file that comes with gcc, so configuring glibc\n  # with a fresh cross-compiler works.\n  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n  # <limits.h> exists even on freestanding compilers.\n  # On the NeXT, cc -E runs the code through the compiler's parser,\n  # not just through cpp. \"Syntax error\" is here to catch this case.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n\t\t     Syntax error\n_ACEOF\nif ac_fn_cxx_try_cpp \"$LINENO\"; then :\n\nelse\n  # Broken: fails on valid input.\ncontinue\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\n  # OK, works on sane cases.  Now check whether nonexistent headers\n  # can be detected and how.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <ac_nonexistent.h>\n_ACEOF\nif ac_fn_cxx_try_cpp \"$LINENO\"; then :\n  # Broken: success on invalid input.\ncontinue\nelse\n  # Passes both tests.\nac_preproc_ok=:\nbreak\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\ndone\n# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.\nrm -f conftest.i conftest.err conftest.$ac_ext\nif $ac_preproc_ok; then :\n  break\nfi\n\n    done\n    ac_cv_prog_CXXCPP=$CXXCPP\n\nfi\n  CXXCPP=$ac_cv_prog_CXXCPP\nelse\n  ac_cv_prog_CXXCPP=$CXXCPP\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CXXCPP\" >&5\n$as_echo \"$CXXCPP\" >&6; }\nac_preproc_ok=false\nfor ac_cxx_preproc_warn_flag in '' yes\ndo\n  # Use a header file that comes with gcc, so configuring glibc\n  # with a fresh cross-compiler works.\n  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n  # <limits.h> exists even on freestanding compilers.\n  # On the NeXT, cc -E runs the code through the compiler's parser,\n  # not just through cpp. \"Syntax error\" is here to catch this case.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n\t\t     Syntax error\n_ACEOF\nif ac_fn_cxx_try_cpp \"$LINENO\"; then :\n\nelse\n  # Broken: fails on valid input.\ncontinue\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\n  # OK, works on sane cases.  Now check whether nonexistent headers\n  # can be detected and how.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <ac_nonexistent.h>\n_ACEOF\nif ac_fn_cxx_try_cpp \"$LINENO\"; then :\n  # Broken: success on invalid input.\ncontinue\nelse\n  # Passes both tests.\nac_preproc_ok=:\nbreak\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\ndone\n# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.\nrm -f conftest.i conftest.err conftest.$ac_ext\nif $ac_preproc_ok; then :\n\nelse\n  { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"C++ preprocessor \\\"$CXXCPP\\\" fails sanity check\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\nfi\n\nac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\n\nelse\n  _lt_caught_CXX_error=yes\nfi\n\nac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\n\narchive_cmds_need_lc_CXX=no\nallow_undefined_flag_CXX=\nalways_export_symbols_CXX=no\narchive_expsym_cmds_CXX=\ncompiler_needs_object_CXX=no\nexport_dynamic_flag_spec_CXX=\nhardcode_direct_CXX=no\nhardcode_direct_absolute_CXX=no\nhardcode_libdir_flag_spec_CXX=\nhardcode_libdir_separator_CXX=\nhardcode_minus_L_CXX=no\nhardcode_shlibpath_var_CXX=unsupported\nhardcode_automatic_CXX=no\ninherit_rpath_CXX=no\nmodule_cmds_CXX=\nmodule_expsym_cmds_CXX=\nlink_all_deplibs_CXX=unknown\nold_archive_cmds_CXX=$old_archive_cmds\nreload_flag_CXX=$reload_flag\nreload_cmds_CXX=$reload_cmds\nno_undefined_flag_CXX=\nwhole_archive_flag_spec_CXX=\nenable_shared_with_static_runtimes_CXX=no\n\n# Source file extension for C++ test sources.\nac_ext=cpp\n\n# Object file extension for compiled C++ test sources.\nobjext=o\nobjext_CXX=$objext\n\n# No sense in running all these tests if we already determined that\n# the CXX compiler isn't working.  Some variables (like enable_shared)\n# are currently assumed to apply to all compilers on this platform,\n# and will be corrupted by setting them based on a non-working compiler.\nif test \"$_lt_caught_CXX_error\" != yes; then\n  # Code to be used in simple compile tests\n  lt_simple_compile_test_code=\"int some_variable = 0;\"\n\n  # Code to be used in simple link tests\n  lt_simple_link_test_code='int main(int, char *[]) { return(0); }'\n\n  # ltmain only uses $CC for tagged configurations so make sure $CC is set.\n\n\n\n\n\n\n# If no C compiler was specified, use CC.\nLTCC=${LTCC-\"$CC\"}\n\n# If no C compiler flags were specified, use CFLAGS.\nLTCFLAGS=${LTCFLAGS-\"$CFLAGS\"}\n\n# Allow CC to be a program name with arguments.\ncompiler=$CC\n\n\n  # save warnings/boilerplate of simple test code\n  ac_outfile=conftest.$ac_objext\necho \"$lt_simple_compile_test_code\" >conftest.$ac_ext\neval \"$ac_compile\" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err\n_lt_compiler_boilerplate=`cat conftest.err`\n$RM conftest*\n\n  ac_outfile=conftest.$ac_objext\necho \"$lt_simple_link_test_code\" >conftest.$ac_ext\neval \"$ac_link\" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err\n_lt_linker_boilerplate=`cat conftest.err`\n$RM -r conftest*\n\n\n  # Allow CC to be a program name with arguments.\n  lt_save_CC=$CC\n  lt_save_CFLAGS=$CFLAGS\n  lt_save_LD=$LD\n  lt_save_GCC=$GCC\n  GCC=$GXX\n  lt_save_with_gnu_ld=$with_gnu_ld\n  lt_save_path_LD=$lt_cv_path_LD\n  if test -n \"${lt_cv_prog_gnu_ldcxx+set}\"; then\n    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx\n  else\n    $as_unset lt_cv_prog_gnu_ld\n  fi\n  if test -n \"${lt_cv_path_LDCXX+set}\"; then\n    lt_cv_path_LD=$lt_cv_path_LDCXX\n  else\n    $as_unset lt_cv_path_LD\n  fi\n  test -z \"${LDCXX+set}\" || LD=$LDCXX\n  CC=${CXX-\"c++\"}\n  CFLAGS=$CXXFLAGS\n  compiler=$CC\n  compiler_CXX=$CC\n  for cc_temp in $compiler\"\"; do\n  case $cc_temp in\n    compile | *[\\\\/]compile | ccache | *[\\\\/]ccache ) ;;\n    distcc | *[\\\\/]distcc | purify | *[\\\\/]purify ) ;;\n    \\-*) ;;\n    *) break;;\n  esac\ndone\ncc_basename=`$ECHO \"$cc_temp\" | $SED \"s%.*/%%; s%^$host_alias-%%\"`\n\n\n  if test -n \"$compiler\"; then\n    # We don't want -fno-exception when compiling C++ code, so set the\n    # no_builtin_flag separately\n    if test \"$GXX\" = yes; then\n      lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'\n    else\n      lt_prog_compiler_no_builtin_flag_CXX=\n    fi\n\n    if test \"$GXX\" = yes; then\n      # Set up default GNU C++ configuration\n\n\n\n# Check whether --with-gnu-ld was given.\nif test \"${with_gnu_ld+set}\" = set; then :\n  withval=$with_gnu_ld; test \"$withval\" = no || with_gnu_ld=yes\nelse\n  with_gnu_ld=no\nfi\n\nac_prog=ld\nif test \"$GCC\" = yes; then\n  # Check if gcc -print-prog-name=ld gives a path.\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for ld used by $CC\" >&5\n$as_echo_n \"checking for ld used by $CC... \" >&6; }\n  case $host in\n  *-*-mingw*)\n    # gcc leaves a trailing carriage return which upsets mingw\n    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\\015'` ;;\n  *)\n    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;\n  esac\n  case $ac_prog in\n    # Accept absolute paths.\n    [\\\\/]* | ?:[\\\\/]*)\n      re_direlt='/[^/][^/]*/\\.\\./'\n      # Canonicalize the pathname of ld\n      ac_prog=`$ECHO \"$ac_prog\"| $SED 's%\\\\\\\\%/%g'`\n      while $ECHO \"$ac_prog\" | $GREP \"$re_direlt\" > /dev/null 2>&1; do\n\tac_prog=`$ECHO $ac_prog| $SED \"s%$re_direlt%/%\"`\n      done\n      test -z \"$LD\" && LD=\"$ac_prog\"\n      ;;\n  \"\")\n    # If it fails, then pretend we aren't using GCC.\n    ac_prog=ld\n    ;;\n  *)\n    # If it is relative, then search for the first ld in PATH.\n    with_gnu_ld=unknown\n    ;;\n  esac\nelif test \"$with_gnu_ld\" = yes; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for GNU ld\" >&5\n$as_echo_n \"checking for GNU ld... \" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for non-GNU ld\" >&5\n$as_echo_n \"checking for non-GNU ld... \" >&6; }\nfi\nif ${lt_cv_path_LD+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -z \"$LD\"; then\n  lt_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n  for ac_dir in $PATH; do\n    IFS=\"$lt_save_ifs\"\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f \"$ac_dir/$ac_prog\" || test -f \"$ac_dir/$ac_prog$ac_exeext\"; then\n      lt_cv_path_LD=\"$ac_dir/$ac_prog\"\n      # Check to see if the program is GNU ld.  I'd rather use --version,\n      # but apparently some variants of GNU ld only accept -v.\n      # Break only if it was the GNU/non-GNU ld that we prefer.\n      case `\"$lt_cv_path_LD\" -v 2>&1 </dev/null` in\n      *GNU* | *'with BFD'*)\n\ttest \"$with_gnu_ld\" != no && break\n\t;;\n      *)\n\ttest \"$with_gnu_ld\" != yes && break\n\t;;\n      esac\n    fi\n  done\n  IFS=\"$lt_save_ifs\"\nelse\n  lt_cv_path_LD=\"$LD\" # Let the user override the test with a path.\nfi\nfi\n\nLD=\"$lt_cv_path_LD\"\nif test -n \"$LD\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $LD\" >&5\n$as_echo \"$LD\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\ntest -z \"$LD\" && as_fn_error $? \"no acceptable ld found in \\$PATH\" \"$LINENO\" 5\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld\" >&5\n$as_echo_n \"checking if the linker ($LD) is GNU ld... \" >&6; }\nif ${lt_cv_prog_gnu_ld+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  # I'd rather use --version here, but apparently some GNU lds only accept -v.\ncase `$LD -v 2>&1 </dev/null` in\n*GNU* | *'with BFD'*)\n  lt_cv_prog_gnu_ld=yes\n  ;;\n*)\n  lt_cv_prog_gnu_ld=no\n  ;;\nesac\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld\" >&5\n$as_echo \"$lt_cv_prog_gnu_ld\" >&6; }\nwith_gnu_ld=$lt_cv_prog_gnu_ld\n\n\n\n\n\n\n\n      # Check if GNU C++ uses GNU ld as the underlying linker, since the\n      # archiving commands below assume that GNU ld is being used.\n      if test \"$with_gnu_ld\" = yes; then\n        archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'\n        archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n\n        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'\n        export_dynamic_flag_spec_CXX='${wl}--export-dynamic'\n\n        # If archive_cmds runs LD, not CC, wlarc should be empty\n        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to\n        #     investigate it a little bit more. (MM)\n        wlarc='${wl}'\n\n        # ancient GNU ld didn't support --whole-archive et. al.\n        if eval \"`$CC -print-prog-name=ld` --help 2>&1\" |\n\t  $GREP 'no-whole-archive' > /dev/null; then\n          whole_archive_flag_spec_CXX=\"$wlarc\"'--whole-archive$convenience '\"$wlarc\"'--no-whole-archive'\n        else\n          whole_archive_flag_spec_CXX=\n        fi\n      else\n        with_gnu_ld=no\n        wlarc=\n\n        # A generic and very simple default shared library creation\n        # command for GNU C++ for the case where it uses the native\n        # linker, instead of GNU ld.  If possible, this setting should\n        # overridden to take advantage of the native linker features on\n        # the platform it is being used on.\n        archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'\n      fi\n\n      # Commands to make compiler produce verbose output that lists\n      # what \"hidden\" libraries, object files and flags are used when\n      # linking a shared library.\n      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v \"^Configured with:\" | $GREP \"\\-L\"'\n\n    else\n      GXX=no\n      with_gnu_ld=no\n      wlarc=\n    fi\n\n    # PORTME: fill in a description of your system's C++ link characteristics\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries\" >&5\n$as_echo_n \"checking whether the $compiler linker ($LD) supports shared libraries... \" >&6; }\n    ld_shlibs_CXX=yes\n    case $host_os in\n      aix3*)\n        # FIXME: insert proper C++ library support\n        ld_shlibs_CXX=no\n        ;;\n      aix[4-9]*)\n        if test \"$host_cpu\" = ia64; then\n          # On IA64, the linker does run time linking by default, so we don't\n          # have to do anything special.\n          aix_use_runtimelinking=no\n          exp_sym_flag='-Bexport'\n          no_entry_flag=\"\"\n        else\n          aix_use_runtimelinking=no\n\n          # Test if we are trying to use run time linking or normal\n          # AIX style linking. If -brtl is somewhere in LDFLAGS, we\n          # need to do runtime linking.\n          case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)\n\t    for ld_flag in $LDFLAGS; do\n\t      case $ld_flag in\n\t      *-brtl*)\n\t        aix_use_runtimelinking=yes\n\t        break\n\t        ;;\n\t      esac\n\t    done\n\t    ;;\n          esac\n\n          exp_sym_flag='-bexport'\n          no_entry_flag='-bnoentry'\n        fi\n\n        # When large executables or shared objects are built, AIX ld can\n        # have problems creating the table of contents.  If linking a library\n        # or program results in \"error TOC overflow\" add -mminimal-toc to\n        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not\n        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.\n\n        archive_cmds_CXX=''\n        hardcode_direct_CXX=yes\n        hardcode_direct_absolute_CXX=yes\n        hardcode_libdir_separator_CXX=':'\n        link_all_deplibs_CXX=yes\n        file_list_spec_CXX='${wl}-f,'\n\n        if test \"$GXX\" = yes; then\n          case $host_os in aix4.[012]|aix4.[012].*)\n          # We only want to do this on AIX 4.2 and lower, the check\n          # below for broken collect2 doesn't work under 4.3+\n\t  collect2name=`${CC} -print-prog-name=collect2`\n\t  if test -f \"$collect2name\" &&\n\t     strings \"$collect2name\" | $GREP resolve_lib_name >/dev/null\n\t  then\n\t    # We have reworked collect2\n\t    :\n\t  else\n\t    # We have old collect2\n\t    hardcode_direct_CXX=unsupported\n\t    # It fails to find uninstalled libraries when the uninstalled\n\t    # path is not listed in the libpath.  Setting hardcode_minus_L\n\t    # to unsupported forces relinking\n\t    hardcode_minus_L_CXX=yes\n\t    hardcode_libdir_flag_spec_CXX='-L$libdir'\n\t    hardcode_libdir_separator_CXX=\n\t  fi\n          esac\n          shared_flag='-shared'\n\t  if test \"$aix_use_runtimelinking\" = yes; then\n\t    shared_flag=\"$shared_flag \"'${wl}-G'\n\t  fi\n        else\n          # not using gcc\n          if test \"$host_cpu\" = ia64; then\n\t  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release\n\t  # chokes on -Wl,-G. The following line is correct:\n\t  shared_flag='-G'\n          else\n\t    if test \"$aix_use_runtimelinking\" = yes; then\n\t      shared_flag='${wl}-G'\n\t    else\n\t      shared_flag='${wl}-bM:SRE'\n\t    fi\n          fi\n        fi\n\n        export_dynamic_flag_spec_CXX='${wl}-bexpall'\n        # It seems that -bexpall does not export symbols beginning with\n        # underscore (_), so it is better to generate a list of symbols to\n\t# export.\n        always_export_symbols_CXX=yes\n        if test \"$aix_use_runtimelinking\" = yes; then\n          # Warning - without using the other runtime loading flags (-brtl),\n          # -berok will link without error, but may produce a broken library.\n          allow_undefined_flag_CXX='-berok'\n          # Determine the default libpath from the value encoded in an empty\n          # executable.\n          if test \"${lt_cv_aix_libpath+set}\" = set; then\n  aix_libpath=$lt_cv_aix_libpath\nelse\n  if ${lt_cv_aix_libpath__CXX+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_link \"$LINENO\"; then :\n\n  lt_aix_libpath_sed='\n      /Import File Strings/,/^$/ {\n\t  /^0/ {\n\t      s/^0  *\\([^ ]*\\) *$/\\1/\n\t      p\n\t  }\n      }'\n  lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\n  # Check for a 64-bit object if we didn't find anything.\n  if test -z \"$lt_cv_aix_libpath__CXX\"; then\n    lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\n  fi\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n  if test -z \"$lt_cv_aix_libpath__CXX\"; then\n    lt_cv_aix_libpath__CXX=\"/usr/lib:/lib\"\n  fi\n\nfi\n\n  aix_libpath=$lt_cv_aix_libpath__CXX\nfi\n\n          hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'\"$aix_libpath\"\n\n          archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '\"\\${wl}$no_entry_flag\"' $compiler_flags `if test \"x${allow_undefined_flag}\" != \"x\"; then func_echo_all \"${wl}${allow_undefined_flag}\"; else :; fi` '\"\\${wl}$exp_sym_flag:\\$export_symbols $shared_flag\"\n        else\n          if test \"$host_cpu\" = ia64; then\n\t    hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib'\n\t    allow_undefined_flag_CXX=\"-z nodefs\"\n\t    archive_expsym_cmds_CXX=\"\\$CC $shared_flag\"' -o $output_objdir/$soname $libobjs $deplibs '\"\\${wl}$no_entry_flag\"' $compiler_flags ${wl}${allow_undefined_flag} '\"\\${wl}$exp_sym_flag:\\$export_symbols\"\n          else\n\t    # Determine the default libpath from the value encoded in an\n\t    # empty executable.\n\t    if test \"${lt_cv_aix_libpath+set}\" = set; then\n  aix_libpath=$lt_cv_aix_libpath\nelse\n  if ${lt_cv_aix_libpath__CXX+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_link \"$LINENO\"; then :\n\n  lt_aix_libpath_sed='\n      /Import File Strings/,/^$/ {\n\t  /^0/ {\n\t      s/^0  *\\([^ ]*\\) *$/\\1/\n\t      p\n\t  }\n      }'\n  lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\n  # Check for a 64-bit object if we didn't find anything.\n  if test -z \"$lt_cv_aix_libpath__CXX\"; then\n    lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\n  fi\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n  if test -z \"$lt_cv_aix_libpath__CXX\"; then\n    lt_cv_aix_libpath__CXX=\"/usr/lib:/lib\"\n  fi\n\nfi\n\n  aix_libpath=$lt_cv_aix_libpath__CXX\nfi\n\n\t    hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'\"$aix_libpath\"\n\t    # Warning - without using the other run time loading flags,\n\t    # -berok will link without error, but may produce a broken library.\n\t    no_undefined_flag_CXX=' ${wl}-bernotok'\n\t    allow_undefined_flag_CXX=' ${wl}-berok'\n\t    if test \"$with_gnu_ld\" = yes; then\n\t      # We only use this code for GNU lds that support --whole-archive.\n\t      whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'\n\t    else\n\t      # Exported symbols can be pulled into shared objects from archives\n\t      whole_archive_flag_spec_CXX='$convenience'\n\t    fi\n\t    archive_cmds_need_lc_CXX=yes\n\t    # This is similar to how AIX traditionally builds its shared\n\t    # libraries.\n\t    archive_expsym_cmds_CXX=\"\\$CC $shared_flag\"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'\n          fi\n        fi\n        ;;\n\n      beos*)\n\tif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\t  allow_undefined_flag_CXX=unsupported\n\t  # Joseph Beckenbach <jrb3@best.com> says some releases of gcc\n\t  # support --undefined.  This deserves some investigation.  FIXME\n\t  archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\telse\n\t  ld_shlibs_CXX=no\n\tfi\n\t;;\n\n      chorus*)\n        case $cc_basename in\n          *)\n\t  # FIXME: insert proper C++ library support\n\t  ld_shlibs_CXX=no\n\t  ;;\n        esac\n        ;;\n\n      cygwin* | mingw* | pw32* | cegcc*)\n\tcase $GXX,$cc_basename in\n\t,cl* | no,cl*)\n\t  # Native MSVC\n\t  # hardcode_libdir_flag_spec is actually meaningless, as there is\n\t  # no search path for DLLs.\n\t  hardcode_libdir_flag_spec_CXX=' '\n\t  allow_undefined_flag_CXX=unsupported\n\t  always_export_symbols_CXX=yes\n\t  file_list_spec_CXX='@'\n\t  # Tell ltmain to make .lib files, not .a files.\n\t  libext=lib\n\t  # Tell ltmain to make .dll files, not .so files.\n\t  shrext_cmds=\".dll\"\n\t  # FIXME: Setting linknames here is a bad hack.\n\t  archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='\n\t  archive_expsym_cmds_CXX='if test \"x`$SED 1q $export_symbols`\" = xEXPORTS; then\n\t      $SED -n -e 's/\\\\\\\\\\\\\\(.*\\\\\\\\\\\\\\)/-link\\\\\\ -EXPORT:\\\\\\\\\\\\\\1/' -e '1\\\\\\!p' < $export_symbols > $output_objdir/$soname.exp;\n\t    else\n\t      $SED -e 's/\\\\\\\\\\\\\\(.*\\\\\\\\\\\\\\)/-link\\\\\\ -EXPORT:\\\\\\\\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;\n\t    fi~\n\t    $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs \"@$tool_output_objdir$soname.exp\" -Wl,-DLL,-IMPLIB:\"$tool_output_objdir$libname.dll.lib\"~\n\t    linknames='\n\t  # The linker will not automatically build a static lib if we build a DLL.\n\t  # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true'\n\t  enable_shared_with_static_runtimes_CXX=yes\n\t  # Don't use ranlib\n\t  old_postinstall_cmds_CXX='chmod 644 $oldlib'\n\t  postlink_cmds_CXX='lt_outputfile=\"@OUTPUT@\"~\n\t    lt_tool_outputfile=\"@TOOL_OUTPUT@\"~\n\t    case $lt_outputfile in\n\t      *.exe|*.EXE) ;;\n\t      *)\n\t\tlt_outputfile=\"$lt_outputfile.exe\"\n\t\tlt_tool_outputfile=\"$lt_tool_outputfile.exe\"\n\t\t;;\n\t    esac~\n\t    func_to_tool_file \"$lt_outputfile\"~\n\t    if test \"$MANIFEST_TOOL\" != \":\" && test -f \"$lt_outputfile.manifest\"; then\n\t      $MANIFEST_TOOL -manifest \"$lt_tool_outputfile.manifest\" -outputresource:\"$lt_tool_outputfile\" || exit 1;\n\t      $RM \"$lt_outputfile.manifest\";\n\t    fi'\n\t  ;;\n\t*)\n\t  # g++\n\t  # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,\n\t  # as there is no search path for DLLs.\n\t  hardcode_libdir_flag_spec_CXX='-L$libdir'\n\t  export_dynamic_flag_spec_CXX='${wl}--export-all-symbols'\n\t  allow_undefined_flag_CXX=unsupported\n\t  always_export_symbols_CXX=no\n\t  enable_shared_with_static_runtimes_CXX=yes\n\n\t  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then\n\t    archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n\t    # If the export-symbols file already is a .def file (1st line\n\t    # is EXPORTS), use it as is; otherwise, prepend...\n\t    archive_expsym_cmds_CXX='if test \"x`$SED 1q $export_symbols`\" = xEXPORTS; then\n\t      cp $export_symbols $output_objdir/$soname.def;\n\t    else\n\t      echo EXPORTS > $output_objdir/$soname.def;\n\t      cat $export_symbols >> $output_objdir/$soname.def;\n\t    fi~\n\t    $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n\t  else\n\t    ld_shlibs_CXX=no\n\t  fi\n\t  ;;\n\tesac\n\t;;\n      darwin* | rhapsody*)\n\n\n  archive_cmds_need_lc_CXX=no\n  hardcode_direct_CXX=no\n  hardcode_automatic_CXX=yes\n  hardcode_shlibpath_var_CXX=unsupported\n  if test \"$lt_cv_ld_force_load\" = \"yes\"; then\n    whole_archive_flag_spec_CXX='`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience ${wl}-force_load,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"`'\n\n  else\n    whole_archive_flag_spec_CXX=''\n  fi\n  link_all_deplibs_CXX=yes\n  allow_undefined_flag_CXX=\"$_lt_dar_allow_undefined\"\n  case $cc_basename in\n     ifort*) _lt_dar_can_shared=yes ;;\n     *) _lt_dar_can_shared=$GCC ;;\n  esac\n  if test \"$_lt_dar_can_shared\" = \"yes\"; then\n    output_verbose_link_cmd=func_echo_all\n    archive_cmds_CXX=\"\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\$libobjs \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring $_lt_dar_single_mod${_lt_dsymutil}\"\n    module_cmds_CXX=\"\\$CC \\$allow_undefined_flag -o \\$lib -bundle \\$libobjs \\$deplibs \\$compiler_flags${_lt_dsymutil}\"\n    archive_expsym_cmds_CXX=\"sed 's,^,_,' < \\$export_symbols > \\$output_objdir/\\${libname}-symbols.expsym~\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\$libobjs \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}\"\n    module_expsym_cmds_CXX=\"sed -e 's,^,_,' < \\$export_symbols > \\$output_objdir/\\${libname}-symbols.expsym~\\$CC \\$allow_undefined_flag -o \\$lib -bundle \\$libobjs \\$deplibs \\$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}\"\n       if test \"$lt_cv_apple_cc_single_mod\" != \"yes\"; then\n      archive_cmds_CXX=\"\\$CC -r -keep_private_externs -nostdlib -o \\${lib}-master.o \\$libobjs~\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\${lib}-master.o \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring${_lt_dsymutil}\"\n      archive_expsym_cmds_CXX=\"sed 's,^,_,' < \\$export_symbols > \\$output_objdir/\\${libname}-symbols.expsym~\\$CC -r -keep_private_externs -nostdlib -o \\${lib}-master.o \\$libobjs~\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\${lib}-master.o \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring${_lt_dar_export_syms}${_lt_dsymutil}\"\n    fi\n\n  else\n  ld_shlibs_CXX=no\n  fi\n\n\t;;\n\n      dgux*)\n        case $cc_basename in\n          ec++*)\n\t    # FIXME: insert proper C++ library support\n\t    ld_shlibs_CXX=no\n\t    ;;\n          ghcx*)\n\t    # Green Hills C++ Compiler\n\t    # FIXME: insert proper C++ library support\n\t    ld_shlibs_CXX=no\n\t    ;;\n          *)\n\t    # FIXME: insert proper C++ library support\n\t    ld_shlibs_CXX=no\n\t    ;;\n        esac\n        ;;\n\n      freebsd2.*)\n        # C++ shared libraries reported to be fairly broken before\n\t# switch to ELF\n        ld_shlibs_CXX=no\n        ;;\n\n      freebsd-elf*)\n        archive_cmds_need_lc_CXX=no\n        ;;\n\n      freebsd* | dragonfly*)\n        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF\n        # conventions\n        ld_shlibs_CXX=yes\n        ;;\n\n      gnu*)\n        ;;\n\n      haiku*)\n        archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n        link_all_deplibs_CXX=yes\n        ;;\n\n      hpux9*)\n        hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'\n        hardcode_libdir_separator_CXX=:\n        export_dynamic_flag_spec_CXX='${wl}-E'\n        hardcode_direct_CXX=yes\n        hardcode_minus_L_CXX=yes # Not in the search PATH,\n\t\t\t\t             # but as the default\n\t\t\t\t             # location of the library.\n\n        case $cc_basename in\n          CC*)\n            # FIXME: insert proper C++ library support\n            ld_shlibs_CXX=no\n            ;;\n          aCC*)\n            archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'\n            # Commands to make compiler produce verbose output that lists\n            # what \"hidden\" libraries, object files and flags are used when\n            # linking a shared library.\n            #\n            # There doesn't appear to be a way to prevent this compiler from\n            # explicitly linking system object files so we need to strip them\n            # from the output so that they don't get included in the library\n            # dependencies.\n            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP \"\\-L\"`; list=\"\"; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; func_echo_all \"$list\"'\n            ;;\n          *)\n            if test \"$GXX\" = yes; then\n              archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'\n            else\n              # FIXME: insert proper C++ library support\n              ld_shlibs_CXX=no\n            fi\n            ;;\n        esac\n        ;;\n\n      hpux10*|hpux11*)\n        if test $with_gnu_ld = no; then\n\t  hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'\n\t  hardcode_libdir_separator_CXX=:\n\n          case $host_cpu in\n            hppa*64*|ia64*)\n              ;;\n            *)\n\t      export_dynamic_flag_spec_CXX='${wl}-E'\n              ;;\n          esac\n        fi\n        case $host_cpu in\n          hppa*64*|ia64*)\n            hardcode_direct_CXX=no\n            hardcode_shlibpath_var_CXX=no\n            ;;\n          *)\n            hardcode_direct_CXX=yes\n            hardcode_direct_absolute_CXX=yes\n            hardcode_minus_L_CXX=yes # Not in the search PATH,\n\t\t\t\t\t         # but as the default\n\t\t\t\t\t         # location of the library.\n            ;;\n        esac\n\n        case $cc_basename in\n          CC*)\n\t    # FIXME: insert proper C++ library support\n\t    ld_shlibs_CXX=no\n\t    ;;\n          aCC*)\n\t    case $host_cpu in\n\t      hppa*64*)\n\t        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t        ;;\n\t      ia64*)\n\t        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t        ;;\n\t      *)\n\t        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t        ;;\n\t    esac\n\t    # Commands to make compiler produce verbose output that lists\n\t    # what \"hidden\" libraries, object files and flags are used when\n\t    # linking a shared library.\n\t    #\n\t    # There doesn't appear to be a way to prevent this compiler from\n\t    # explicitly linking system object files so we need to strip them\n\t    # from the output so that they don't get included in the library\n\t    # dependencies.\n\t    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP \"\\-L\"`; list=\"\"; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; func_echo_all \"$list\"'\n\t    ;;\n          *)\n\t    if test \"$GXX\" = yes; then\n\t      if test $with_gnu_ld = no; then\n\t        case $host_cpu in\n\t          hppa*64*)\n\t            archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t            ;;\n\t          ia64*)\n\t            archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t            ;;\n\t          *)\n\t            archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t            ;;\n\t        esac\n\t      fi\n\t    else\n\t      # FIXME: insert proper C++ library support\n\t      ld_shlibs_CXX=no\n\t    fi\n\t    ;;\n        esac\n        ;;\n\n      interix[3-9]*)\n\thardcode_direct_CXX=no\n\thardcode_shlibpath_var_CXX=no\n\thardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'\n\texport_dynamic_flag_spec_CXX='${wl}-E'\n\t# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.\n\t# Instead, shared libraries are loaded at an image base (0x10000000 by\n\t# default) and relocated if they conflict, which is a slow very memory\n\t# consuming and fragmenting process.  To avoid this, we pick a random,\n\t# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link\n\t# time.  Moving up from 0x10000000 also allows more sbrk(2) space.\n\tarchive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n\tarchive_expsym_cmds_CXX='sed \"s,^,_,\" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n\t;;\n      irix5* | irix6*)\n        case $cc_basename in\n          CC*)\n\t    # SGI C++\n\t    archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -o $lib'\n\n\t    # Archives containing C++ object files must be created using\n\t    # \"CC -ar\", where \"CC\" is the IRIX C++ compiler.  This is\n\t    # necessary to make sure instantiated templates are included\n\t    # in the archive.\n\t    old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'\n\t    ;;\n          *)\n\t    if test \"$GXX\" = yes; then\n\t      if test \"$with_gnu_ld\" = no; then\n\t        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version ${wl}$verstring\"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n\t      else\n\t        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version ${wl}$verstring\"` -o $lib'\n\t      fi\n\t    fi\n\t    link_all_deplibs_CXX=yes\n\t    ;;\n        esac\n        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'\n        hardcode_libdir_separator_CXX=:\n        inherit_rpath_CXX=yes\n        ;;\n\n      linux* | k*bsd*-gnu | kopensolaris*-gnu)\n        case $cc_basename in\n          KCC*)\n\t    # Kuck and Associates, Inc. (KAI) C++ Compiler\n\n\t    # KCC will only create a shared library if the output file\n\t    # ends with \".so\" (or \".sl\" for HP-UX), so rename the library\n\t    # to its proper name (with version) after linking.\n\t    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\\''s/\\([^()0-9A-Za-z{}]\\)/\\\\\\\\\\1/g'\\''`; templib=`echo $lib | $SED -e \"s/\\${tempext}\\..*/.so/\"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \\$templib; mv \\$templib $lib'\n\t    archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\\''s/\\([^()0-9A-Za-z{}]\\)/\\\\\\\\\\1/g'\\''`; templib=`echo $lib | $SED -e \"s/\\${tempext}\\..*/.so/\"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \\$templib ${wl}-retain-symbols-file,$export_symbols; mv \\$templib $lib'\n\t    # Commands to make compiler produce verbose output that lists\n\t    # what \"hidden\" libraries, object files and flags are used when\n\t    # linking a shared library.\n\t    #\n\t    # There doesn't appear to be a way to prevent this compiler from\n\t    # explicitly linking system object files so we need to strip them\n\t    # from the output so that they don't get included in the library\n\t    # dependencies.\n\t    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP \"ld\"`; rm -f libconftest$shared_ext; list=\"\"; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; func_echo_all \"$list\"'\n\n\t    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'\n\t    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'\n\n\t    # Archives containing C++ object files must be created using\n\t    # \"CC -Bstatic\", where \"CC\" is the KAI C++ compiler.\n\t    old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'\n\t    ;;\n\t  icpc* | ecpc* )\n\t    # Intel C++\n\t    with_gnu_ld=yes\n\t    # version 8.0 and above of icpc choke on multiply defined symbols\n\t    # if we add $predep_objects and $postdep_objects, however 7.1 and\n\t    # earlier do not add the objects themselves.\n\t    case `$CC -V 2>&1` in\n\t      *\"Version 7.\"*)\n\t        archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t\tarchive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n\t\t;;\n\t      *)  # Version 8.0 or newer\n\t        tmp_idyn=\n\t        case $host_cpu in\n\t\t  ia64*) tmp_idyn=' -i_dynamic';;\n\t\tesac\n\t        archive_cmds_CXX='$CC -shared'\"$tmp_idyn\"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t\tarchive_expsym_cmds_CXX='$CC -shared'\"$tmp_idyn\"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n\t\t;;\n\t    esac\n\t    archive_cmds_need_lc_CXX=no\n\t    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'\n\t    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'\n\t    whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'\n\t    ;;\n          pgCC* | pgcpp*)\n            # Portland Group C++ compiler\n\t    case `$CC -V` in\n\t    *pgCC\\ [1-5].* | *pgcpp\\ [1-5].*)\n\t      prelink_cmds_CXX='tpldir=Template.dir~\n\t\trm -rf $tpldir~\n\t\t$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~\n\t\tcompile_command=\"$compile_command `find $tpldir -name \\*.o | sort | $NL2SP`\"'\n\t      old_archive_cmds_CXX='tpldir=Template.dir~\n\t\trm -rf $tpldir~\n\t\t$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~\n\t\t$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \\*.o | sort | $NL2SP`~\n\t\t$RANLIB $oldlib'\n\t      archive_cmds_CXX='tpldir=Template.dir~\n\t\trm -rf $tpldir~\n\t\t$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~\n\t\t$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \\*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'\n\t      archive_expsym_cmds_CXX='tpldir=Template.dir~\n\t\trm -rf $tpldir~\n\t\t$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~\n\t\t$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \\*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'\n\t      ;;\n\t    *) # Version 6 and above use weak symbols\n\t      archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'\n\t      archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'\n\t      ;;\n\t    esac\n\n\t    hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir'\n\t    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'\n\t    whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n            ;;\n\t  cxx*)\n\t    # Compaq C++\n\t    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t    archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'\n\n\t    runpath_var=LD_RUN_PATH\n\t    hardcode_libdir_flag_spec_CXX='-rpath $libdir'\n\t    hardcode_libdir_separator_CXX=:\n\n\t    # Commands to make compiler produce verbose output that lists\n\t    # what \"hidden\" libraries, object files and flags are used when\n\t    # linking a shared library.\n\t    #\n\t    # There doesn't appear to be a way to prevent this compiler from\n\t    # explicitly linking system object files so we need to strip them\n\t    # from the output so that they don't get included in the library\n\t    # dependencies.\n\t    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP \"ld\"`; templist=`func_echo_all \"$templist\" | $SED \"s/\\(^.*ld.*\\)\\( .*ld .*$\\)/\\1/\"`; list=\"\"; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; func_echo_all \"X$list\" | $Xsed'\n\t    ;;\n\t  xl* | mpixl* | bgxl*)\n\t    # IBM XL 8.0 on PPC, with GNU ld\n\t    hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'\n\t    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'\n\t    archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t    if test \"x$supports_anon_versioning\" = xyes; then\n\t      archive_expsym_cmds_CXX='echo \"{ global:\" > $output_objdir/$libname.ver~\n\t\tcat $export_symbols | sed -e \"s/\\(.*\\)/\\1;/\" >> $output_objdir/$libname.ver~\n\t\techo \"local: *; };\" >> $output_objdir/$libname.ver~\n\t\t$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'\n\t    fi\n\t    ;;\n\t  *)\n\t    case `$CC -V 2>&1 | sed 5q` in\n\t    *Sun\\ C*)\n\t      # Sun C++ 5.9\n\t      no_undefined_flag_CXX=' -zdefs'\n\t      archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t      archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'\n\t      hardcode_libdir_flag_spec_CXX='-R$libdir'\n\t      whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\\\"\\\"; do test -z \\\"$conv\\\" || new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t      compiler_needs_object_CXX=yes\n\n\t      # Not sure whether something based on\n\t      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1\n\t      # would be better.\n\t      output_verbose_link_cmd='func_echo_all'\n\n\t      # Archives containing C++ object files must be created using\n\t      # \"CC -xar\", where \"CC\" is the Sun C++ compiler.  This is\n\t      # necessary to make sure instantiated templates are included\n\t      # in the archive.\n\t      old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'\n\t      ;;\n\t    esac\n\t    ;;\n\tesac\n\t;;\n\n      lynxos*)\n        # FIXME: insert proper C++ library support\n\tld_shlibs_CXX=no\n\t;;\n\n      m88k*)\n        # FIXME: insert proper C++ library support\n        ld_shlibs_CXX=no\n\t;;\n\n      mvs*)\n        case $cc_basename in\n          cxx*)\n\t    # FIXME: insert proper C++ library support\n\t    ld_shlibs_CXX=no\n\t    ;;\n\t  *)\n\t    # FIXME: insert proper C++ library support\n\t    ld_shlibs_CXX=no\n\t    ;;\n\tesac\n\t;;\n\n      netbsd*)\n        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n\t  archive_cmds_CXX='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'\n\t  wlarc=\n\t  hardcode_libdir_flag_spec_CXX='-R$libdir'\n\t  hardcode_direct_CXX=yes\n\t  hardcode_shlibpath_var_CXX=no\n\tfi\n\t# Workaround some broken pre-1.5 toolchains\n\toutput_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e \"s:-lgcc -lc -lgcc::\"'\n\t;;\n\n      *nto* | *qnx*)\n        ld_shlibs_CXX=yes\n\t;;\n\n      openbsd2*)\n        # C++ shared libraries are fairly broken\n\tld_shlibs_CXX=no\n\t;;\n\n      openbsd*)\n\tif test -f /usr/libexec/ld.so; then\n\t  hardcode_direct_CXX=yes\n\t  hardcode_shlibpath_var_CXX=no\n\t  hardcode_direct_absolute_CXX=yes\n\t  archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'\n\t  hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'\n\t  if test -z \"`echo __ELF__ | $CC -E - | grep __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n\t    archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'\n\t    export_dynamic_flag_spec_CXX='${wl}-E'\n\t    whole_archive_flag_spec_CXX=\"$wlarc\"'--whole-archive$convenience '\"$wlarc\"'--no-whole-archive'\n\t  fi\n\t  output_verbose_link_cmd=func_echo_all\n\telse\n\t  ld_shlibs_CXX=no\n\tfi\n\t;;\n\n      osf3* | osf4* | osf5*)\n        case $cc_basename in\n          KCC*)\n\t    # Kuck and Associates, Inc. (KAI) C++ Compiler\n\n\t    # KCC will only create a shared library if the output file\n\t    # ends with \".so\" (or \".sl\" for HP-UX), so rename the library\n\t    # to its proper name (with version) after linking.\n\t    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\\''s/\\([^()0-9A-Za-z{}]\\)/\\\\\\\\\\1/g'\\''`; templib=`echo \"$lib\" | $SED -e \"s/\\${tempext}\\..*/.so/\"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \\$templib; mv \\$templib $lib'\n\n\t    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'\n\t    hardcode_libdir_separator_CXX=:\n\n\t    # Archives containing C++ object files must be created using\n\t    # the KAI C++ compiler.\n\t    case $host in\n\t      osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;;\n\t      *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;;\n\t    esac\n\t    ;;\n          RCC*)\n\t    # Rational C++ 2.4.1\n\t    # FIXME: insert proper C++ library support\n\t    ld_shlibs_CXX=no\n\t    ;;\n          cxx*)\n\t    case $host in\n\t      osf3*)\n\t        allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\\*'\n\t        archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -o $lib'\n\t        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'\n\t\t;;\n\t      *)\n\t        allow_undefined_flag_CXX=' -expect_unresolved \\*'\n\t        archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -o $lib'\n\t        archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf \"%s %s\\\\n\" -exported_symbol \"\\$i\" >> $lib.exp; done~\n\t          echo \"-hidden\">> $lib.exp~\n\t          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n \"$verstring\" && $ECHO \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -o $lib~\n\t          $RM $lib.exp'\n\t        hardcode_libdir_flag_spec_CXX='-rpath $libdir'\n\t\t;;\n\t    esac\n\n\t    hardcode_libdir_separator_CXX=:\n\n\t    # Commands to make compiler produce verbose output that lists\n\t    # what \"hidden\" libraries, object files and flags are used when\n\t    # linking a shared library.\n\t    #\n\t    # There doesn't appear to be a way to prevent this compiler from\n\t    # explicitly linking system object files so we need to strip them\n\t    # from the output so that they don't get included in the library\n\t    # dependencies.\n\t    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP \"ld\" | $GREP -v \"ld:\"`; templist=`func_echo_all \"$templist\" | $SED \"s/\\(^.*ld.*\\)\\( .*ld.*$\\)/\\1/\"`; list=\"\"; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; func_echo_all \"$list\"'\n\t    ;;\n\t  *)\n\t    if test \"$GXX\" = yes && test \"$with_gnu_ld\" = no; then\n\t      allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\\*'\n\t      case $host in\n\t        osf3*)\n\t          archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version ${wl}$verstring\"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n\t\t  ;;\n\t        *)\n\t          archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version ${wl}$verstring\"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n\t\t  ;;\n\t      esac\n\n\t      hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'\n\t      hardcode_libdir_separator_CXX=:\n\n\t      # Commands to make compiler produce verbose output that lists\n\t      # what \"hidden\" libraries, object files and flags are used when\n\t      # linking a shared library.\n\t      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v \"^Configured with:\" | $GREP \"\\-L\"'\n\n\t    else\n\t      # FIXME: insert proper C++ library support\n\t      ld_shlibs_CXX=no\n\t    fi\n\t    ;;\n        esac\n        ;;\n\n      psos*)\n        # FIXME: insert proper C++ library support\n        ld_shlibs_CXX=no\n        ;;\n\n      sunos4*)\n        case $cc_basename in\n          CC*)\n\t    # Sun C++ 4.x\n\t    # FIXME: insert proper C++ library support\n\t    ld_shlibs_CXX=no\n\t    ;;\n          lcc*)\n\t    # Lucid\n\t    # FIXME: insert proper C++ library support\n\t    ld_shlibs_CXX=no\n\t    ;;\n          *)\n\t    # FIXME: insert proper C++ library support\n\t    ld_shlibs_CXX=no\n\t    ;;\n        esac\n        ;;\n\n      solaris*)\n        case $cc_basename in\n          CC* | sunCC*)\n\t    # Sun C++ 4.2, 5.x and Centerline C++\n            archive_cmds_need_lc_CXX=yes\n\t    no_undefined_flag_CXX=' -zdefs'\n\t    archive_cmds_CXX='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t    archive_expsym_cmds_CXX='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'\n\n\t    hardcode_libdir_flag_spec_CXX='-R$libdir'\n\t    hardcode_shlibpath_var_CXX=no\n\t    case $host_os in\n\t      solaris2.[0-5] | solaris2.[0-5].*) ;;\n\t      *)\n\t\t# The compiler driver will combine and reorder linker options,\n\t\t# but understands `-z linker_flag'.\n\t        # Supported since Solaris 2.6 (maybe 2.5.1?)\n\t\twhole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract'\n\t        ;;\n\t    esac\n\t    link_all_deplibs_CXX=yes\n\n\t    output_verbose_link_cmd='func_echo_all'\n\n\t    # Archives containing C++ object files must be created using\n\t    # \"CC -xar\", where \"CC\" is the Sun C++ compiler.  This is\n\t    # necessary to make sure instantiated templates are included\n\t    # in the archive.\n\t    old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'\n\t    ;;\n          gcx*)\n\t    # Green Hills C++ Compiler\n\t    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'\n\n\t    # The C++ compiler must be used to create the archive.\n\t    old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'\n\t    ;;\n          *)\n\t    # GNU C++ compiler with Solaris linker\n\t    if test \"$GXX\" = yes && test \"$with_gnu_ld\" = no; then\n\t      no_undefined_flag_CXX=' ${wl}-z ${wl}defs'\n\t      if $CC --version | $GREP -v '^2\\.7' > /dev/null; then\n\t        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'\n\t        archive_expsym_cmds_CXX='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t\t  $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'\n\n\t        # Commands to make compiler produce verbose output that lists\n\t        # what \"hidden\" libraries, object files and flags are used when\n\t        # linking a shared library.\n\t        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v \"^Configured with:\" | $GREP \"\\-L\"'\n\t      else\n\t        # g++ 2.7 appears to require `-G' NOT `-shared' on this\n\t        # platform.\n\t        archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'\n\t        archive_expsym_cmds_CXX='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t\t  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'\n\n\t        # Commands to make compiler produce verbose output that lists\n\t        # what \"hidden\" libraries, object files and flags are used when\n\t        # linking a shared library.\n\t        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v \"^Configured with:\" | $GREP \"\\-L\"'\n\t      fi\n\n\t      hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir'\n\t      case $host_os in\n\t\tsolaris2.[0-5] | solaris2.[0-5].*) ;;\n\t\t*)\n\t\t  whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'\n\t\t  ;;\n\t      esac\n\t    fi\n\t    ;;\n        esac\n        ;;\n\n    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)\n      no_undefined_flag_CXX='${wl}-z,text'\n      archive_cmds_need_lc_CXX=no\n      hardcode_shlibpath_var_CXX=no\n      runpath_var='LD_RUN_PATH'\n\n      case $cc_basename in\n        CC*)\n\t  archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\t*)\n\t  archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n      esac\n      ;;\n\n      sysv5* | sco3.2v5* | sco5v6*)\n\t# Note: We can NOT use -z defs as we might desire, because we do not\n\t# link with -lc, and that would cause any symbols used from libc to\n\t# always be unresolved, which means just about no library would\n\t# ever link correctly.  If we're not using GNU ld we use -z text\n\t# though, which does catch some bad symbols but isn't as heavy-handed\n\t# as -z defs.\n\tno_undefined_flag_CXX='${wl}-z,text'\n\tallow_undefined_flag_CXX='${wl}-z,nodefs'\n\tarchive_cmds_need_lc_CXX=no\n\thardcode_shlibpath_var_CXX=no\n\thardcode_libdir_flag_spec_CXX='${wl}-R,$libdir'\n\thardcode_libdir_separator_CXX=':'\n\tlink_all_deplibs_CXX=yes\n\texport_dynamic_flag_spec_CXX='${wl}-Bexport'\n\trunpath_var='LD_RUN_PATH'\n\n\tcase $cc_basename in\n          CC*)\n\t    archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t    archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t    old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~\n\t      '\"$old_archive_cmds_CXX\"\n\t    reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~\n\t      '\"$reload_cmds_CXX\"\n\t    ;;\n\t  *)\n\t    archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t    archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t    ;;\n\tesac\n      ;;\n\n      tandem*)\n        case $cc_basename in\n          NCC*)\n\t    # NonStop-UX NCC 3.20\n\t    # FIXME: insert proper C++ library support\n\t    ld_shlibs_CXX=no\n\t    ;;\n          *)\n\t    # FIXME: insert proper C++ library support\n\t    ld_shlibs_CXX=no\n\t    ;;\n        esac\n        ;;\n\n      vxworks*)\n        # FIXME: insert proper C++ library support\n        ld_shlibs_CXX=no\n        ;;\n\n      *)\n        # FIXME: insert proper C++ library support\n        ld_shlibs_CXX=no\n        ;;\n    esac\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX\" >&5\n$as_echo \"$ld_shlibs_CXX\" >&6; }\n    test \"$ld_shlibs_CXX\" = no && can_build_shared=no\n\n    GCC_CXX=\"$GXX\"\n    LD_CXX=\"$LD\"\n\n    ## CAVEAT EMPTOR:\n    ## There is no encapsulation within the following macros, do not change\n    ## the running order or otherwise move them around unless you know exactly\n    ## what you are doing...\n    # Dependencies to place before and after the object being linked:\npredep_objects_CXX=\npostdep_objects_CXX=\npredeps_CXX=\npostdeps_CXX=\ncompiler_lib_search_path_CXX=\n\ncat > conftest.$ac_ext <<_LT_EOF\nclass Foo\n{\npublic:\n  Foo (void) { a = 0; }\nprivate:\n  int a;\n};\n_LT_EOF\n\n\n_lt_libdeps_save_CFLAGS=$CFLAGS\ncase \"$CC $CFLAGS \" in #(\n*\\ -flto*\\ *) CFLAGS=\"$CFLAGS -fno-lto\" ;;\n*\\ -fwhopr*\\ *) CFLAGS=\"$CFLAGS -fno-whopr\" ;;\n*\\ -fuse-linker-plugin*\\ *) CFLAGS=\"$CFLAGS -fno-use-linker-plugin\" ;;\nesac\n\nif { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n  # Parse the compiler output and extract the necessary\n  # objects, libraries and library flags.\n\n  # Sentinel used to keep track of whether or not we are before\n  # the conftest object file.\n  pre_test_object_deps_done=no\n\n  for p in `eval \"$output_verbose_link_cmd\"`; do\n    case ${prev}${p} in\n\n    -L* | -R* | -l*)\n       # Some compilers place space between \"-{L,R}\" and the path.\n       # Remove the space.\n       if test $p = \"-L\" ||\n          test $p = \"-R\"; then\n\t prev=$p\n\t continue\n       fi\n\n       # Expand the sysroot to ease extracting the directories later.\n       if test -z \"$prev\"; then\n         case $p in\n         -L*) func_stripname_cnf '-L' '' \"$p\"; prev=-L; p=$func_stripname_result ;;\n         -R*) func_stripname_cnf '-R' '' \"$p\"; prev=-R; p=$func_stripname_result ;;\n         -l*) func_stripname_cnf '-l' '' \"$p\"; prev=-l; p=$func_stripname_result ;;\n         esac\n       fi\n       case $p in\n       =*) func_stripname_cnf '=' '' \"$p\"; p=$lt_sysroot$func_stripname_result ;;\n       esac\n       if test \"$pre_test_object_deps_done\" = no; then\n\t case ${prev} in\n\t -L | -R)\n\t   # Internal compiler library paths should come after those\n\t   # provided the user.  The postdeps already come after the\n\t   # user supplied libs so there is no need to process them.\n\t   if test -z \"$compiler_lib_search_path_CXX\"; then\n\t     compiler_lib_search_path_CXX=\"${prev}${p}\"\n\t   else\n\t     compiler_lib_search_path_CXX=\"${compiler_lib_search_path_CXX} ${prev}${p}\"\n\t   fi\n\t   ;;\n\t # The \"-l\" case would never come before the object being\n\t # linked, so don't bother handling this case.\n\t esac\n       else\n\t if test -z \"$postdeps_CXX\"; then\n\t   postdeps_CXX=\"${prev}${p}\"\n\t else\n\t   postdeps_CXX=\"${postdeps_CXX} ${prev}${p}\"\n\t fi\n       fi\n       prev=\n       ;;\n\n    *.lto.$objext) ;; # Ignore GCC LTO objects\n    *.$objext)\n       # This assumes that the test object file only shows up\n       # once in the compiler output.\n       if test \"$p\" = \"conftest.$objext\"; then\n\t pre_test_object_deps_done=yes\n\t continue\n       fi\n\n       if test \"$pre_test_object_deps_done\" = no; then\n\t if test -z \"$predep_objects_CXX\"; then\n\t   predep_objects_CXX=\"$p\"\n\t else\n\t   predep_objects_CXX=\"$predep_objects_CXX $p\"\n\t fi\n       else\n\t if test -z \"$postdep_objects_CXX\"; then\n\t   postdep_objects_CXX=\"$p\"\n\t else\n\t   postdep_objects_CXX=\"$postdep_objects_CXX $p\"\n\t fi\n       fi\n       ;;\n\n    *) ;; # Ignore the rest.\n\n    esac\n  done\n\n  # Clean up.\n  rm -f a.out a.exe\nelse\n  echo \"libtool.m4: error: problem compiling CXX test program\"\nfi\n\n$RM -f confest.$objext\nCFLAGS=$_lt_libdeps_save_CFLAGS\n\n# PORTME: override above test on systems where it is broken\ncase $host_os in\ninterix[3-9]*)\n  # Interix 3.5 installs completely hosed .la files for C++, so rather than\n  # hack all around it, let's just trust \"g++\" to DTRT.\n  predep_objects_CXX=\n  postdep_objects_CXX=\n  postdeps_CXX=\n  ;;\n\nlinux*)\n  case `$CC -V 2>&1 | sed 5q` in\n  *Sun\\ C*)\n    # Sun C++ 5.9\n\n    # The more standards-conforming stlport4 library is\n    # incompatible with the Cstd library. Avoid specifying\n    # it if it's in CXXFLAGS. Ignore libCrun as\n    # -library=stlport4 depends on it.\n    case \" $CXX $CXXFLAGS \" in\n    *\" -library=stlport4 \"*)\n      solaris_use_stlport4=yes\n      ;;\n    esac\n\n    if test \"$solaris_use_stlport4\" != yes; then\n      postdeps_CXX='-library=Cstd -library=Crun'\n    fi\n    ;;\n  esac\n  ;;\n\nsolaris*)\n  case $cc_basename in\n  CC* | sunCC*)\n    # The more standards-conforming stlport4 library is\n    # incompatible with the Cstd library. Avoid specifying\n    # it if it's in CXXFLAGS. Ignore libCrun as\n    # -library=stlport4 depends on it.\n    case \" $CXX $CXXFLAGS \" in\n    *\" -library=stlport4 \"*)\n      solaris_use_stlport4=yes\n      ;;\n    esac\n\n    # Adding this requires a known-good setup of shared libraries for\n    # Sun compiler versions before 5.6, else PIC objects from an old\n    # archive will be linked into the output, leading to subtle bugs.\n    if test \"$solaris_use_stlport4\" != yes; then\n      postdeps_CXX='-library=Cstd -library=Crun'\n    fi\n    ;;\n  esac\n  ;;\nesac\n\n\ncase \" $postdeps_CXX \" in\n*\" -lc \"*) archive_cmds_need_lc_CXX=no ;;\nesac\n compiler_lib_search_dirs_CXX=\nif test -n \"${compiler_lib_search_path_CXX}\"; then\n compiler_lib_search_dirs_CXX=`echo \" ${compiler_lib_search_path_CXX}\" | ${SED} -e 's! -L! !g' -e 's!^ !!'`\nfi\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\n\n\n    lt_prog_compiler_wl_CXX=\nlt_prog_compiler_pic_CXX=\nlt_prog_compiler_static_CXX=\n\n\n  # C++ specific cases for pic, static, wl, etc.\n  if test \"$GXX\" = yes; then\n    lt_prog_compiler_wl_CXX='-Wl,'\n    lt_prog_compiler_static_CXX='-static'\n\n    case $host_os in\n    aix*)\n      # All AIX code is PIC.\n      if test \"$host_cpu\" = ia64; then\n\t# AIX 5 now supports IA64 processor\n\tlt_prog_compiler_static_CXX='-Bstatic'\n      fi\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            lt_prog_compiler_pic_CXX='-fPIC'\n        ;;\n      m68k)\n            # FIXME: we need at least 68020 code to build shared libraries, but\n            # adding the `-m68020' flag to GCC prevents building anything better,\n            # like `-m68040'.\n            lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'\n        ;;\n      esac\n      ;;\n\n    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)\n      # PIC is the default for these OSes.\n      ;;\n    mingw* | cygwin* | os2* | pw32* | cegcc*)\n      # This hack is so that the source file can tell whether it is being\n      # built for inclusion in a dll (and should export symbols for example).\n      # Although the cygwin gcc ignores -fPIC, still need this for old-style\n      # (--disable-auto-import) libraries\n      lt_prog_compiler_pic_CXX='-DDLL_EXPORT'\n      ;;\n    darwin* | rhapsody*)\n      # PIC is the default on this platform\n      # Common symbols not allowed in MH_DYLIB files\n      lt_prog_compiler_pic_CXX='-fno-common'\n      ;;\n    *djgpp*)\n      # DJGPP does not support shared libraries at all\n      lt_prog_compiler_pic_CXX=\n      ;;\n    haiku*)\n      # PIC is the default for Haiku.\n      # The \"-static\" flag exists, but is broken.\n      lt_prog_compiler_static_CXX=\n      ;;\n    interix[3-9]*)\n      # Interix 3.x gcc -fpic/-fPIC options generate broken code.\n      # Instead, we relocate shared libraries at runtime.\n      ;;\n    sysv4*MP*)\n      if test -d /usr/nec; then\n\tlt_prog_compiler_pic_CXX=-Kconform_pic\n      fi\n      ;;\n    hpux*)\n      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit\n      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag\n      # sets the default TLS model and affects inlining.\n      case $host_cpu in\n      hppa*64*)\n\t;;\n      *)\n\tlt_prog_compiler_pic_CXX='-fPIC'\n\t;;\n      esac\n      ;;\n    *qnx* | *nto*)\n      # QNX uses GNU C++, but need to define -shared option too, otherwise\n      # it will coredump.\n      lt_prog_compiler_pic_CXX='-fPIC -shared'\n      ;;\n    *)\n      lt_prog_compiler_pic_CXX='-fPIC'\n      ;;\n    esac\n  else\n    case $host_os in\n      aix[4-9]*)\n\t# All AIX code is PIC.\n\tif test \"$host_cpu\" = ia64; then\n\t  # AIX 5 now supports IA64 processor\n\t  lt_prog_compiler_static_CXX='-Bstatic'\n\telse\n\t  lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp'\n\tfi\n\t;;\n      chorus*)\n\tcase $cc_basename in\n\tcxch68*)\n\t  # Green Hills C++ Compiler\n\t  # _LT_TAGVAR(lt_prog_compiler_static, CXX)=\"--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a\"\n\t  ;;\n\tesac\n\t;;\n      mingw* | cygwin* | os2* | pw32* | cegcc*)\n\t# This hack is so that the source file can tell whether it is being\n\t# built for inclusion in a dll (and should export symbols for example).\n\tlt_prog_compiler_pic_CXX='-DDLL_EXPORT'\n\t;;\n      dgux*)\n\tcase $cc_basename in\n\t  ec++*)\n\t    lt_prog_compiler_pic_CXX='-KPIC'\n\t    ;;\n\t  ghcx*)\n\t    # Green Hills C++ Compiler\n\t    lt_prog_compiler_pic_CXX='-pic'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      freebsd* | dragonfly*)\n\t# FreeBSD uses GNU C++\n\t;;\n      hpux9* | hpux10* | hpux11*)\n\tcase $cc_basename in\n\t  CC*)\n\t    lt_prog_compiler_wl_CXX='-Wl,'\n\t    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'\n\t    if test \"$host_cpu\" != ia64; then\n\t      lt_prog_compiler_pic_CXX='+Z'\n\t    fi\n\t    ;;\n\t  aCC*)\n\t    lt_prog_compiler_wl_CXX='-Wl,'\n\t    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'\n\t    case $host_cpu in\n\t    hppa*64*|ia64*)\n\t      # +Z the default\n\t      ;;\n\t    *)\n\t      lt_prog_compiler_pic_CXX='+Z'\n\t      ;;\n\t    esac\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      interix*)\n\t# This is c89, which is MS Visual C++ (no shared libs)\n\t# Anyone wants to do a port?\n\t;;\n      irix5* | irix6* | nonstopux*)\n\tcase $cc_basename in\n\t  CC*)\n\t    lt_prog_compiler_wl_CXX='-Wl,'\n\t    lt_prog_compiler_static_CXX='-non_shared'\n\t    # CC pic flag -KPIC is the default.\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      linux* | k*bsd*-gnu | kopensolaris*-gnu)\n\tcase $cc_basename in\n\t  KCC*)\n\t    # KAI C++ Compiler\n\t    lt_prog_compiler_wl_CXX='--backend -Wl,'\n\t    lt_prog_compiler_pic_CXX='-fPIC'\n\t    ;;\n\t  ecpc* )\n\t    # old Intel C++ for x86_64 which still supported -KPIC.\n\t    lt_prog_compiler_wl_CXX='-Wl,'\n\t    lt_prog_compiler_pic_CXX='-KPIC'\n\t    lt_prog_compiler_static_CXX='-static'\n\t    ;;\n\t  icpc* )\n\t    # Intel C++, used to be incompatible with GCC.\n\t    # ICC 10 doesn't accept -KPIC any more.\n\t    lt_prog_compiler_wl_CXX='-Wl,'\n\t    lt_prog_compiler_pic_CXX='-fPIC'\n\t    lt_prog_compiler_static_CXX='-static'\n\t    ;;\n\t  pgCC* | pgcpp*)\n\t    # Portland Group C++ compiler\n\t    lt_prog_compiler_wl_CXX='-Wl,'\n\t    lt_prog_compiler_pic_CXX='-fpic'\n\t    lt_prog_compiler_static_CXX='-Bstatic'\n\t    ;;\n\t  cxx*)\n\t    # Compaq C++\n\t    # Make sure the PIC flag is empty.  It appears that all Alpha\n\t    # Linux and Compaq Tru64 Unix objects are PIC.\n\t    lt_prog_compiler_pic_CXX=\n\t    lt_prog_compiler_static_CXX='-non_shared'\n\t    ;;\n\t  xlc* | xlC* | bgxl[cC]* | mpixl[cC]*)\n\t    # IBM XL 8.0, 9.0 on PPC and BlueGene\n\t    lt_prog_compiler_wl_CXX='-Wl,'\n\t    lt_prog_compiler_pic_CXX='-qpic'\n\t    lt_prog_compiler_static_CXX='-qstaticlink'\n\t    ;;\n\t  *)\n\t    case `$CC -V 2>&1 | sed 5q` in\n\t    *Sun\\ C*)\n\t      # Sun C++ 5.9\n\t      lt_prog_compiler_pic_CXX='-KPIC'\n\t      lt_prog_compiler_static_CXX='-Bstatic'\n\t      lt_prog_compiler_wl_CXX='-Qoption ld '\n\t      ;;\n\t    esac\n\t    ;;\n\tesac\n\t;;\n      lynxos*)\n\t;;\n      m88k*)\n\t;;\n      mvs*)\n\tcase $cc_basename in\n\t  cxx*)\n\t    lt_prog_compiler_pic_CXX='-W c,exportall'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      netbsd* | netbsdelf*-gnu)\n\t;;\n      *qnx* | *nto*)\n        # QNX uses GNU C++, but need to define -shared option too, otherwise\n        # it will coredump.\n        lt_prog_compiler_pic_CXX='-fPIC -shared'\n        ;;\n      osf3* | osf4* | osf5*)\n\tcase $cc_basename in\n\t  KCC*)\n\t    lt_prog_compiler_wl_CXX='--backend -Wl,'\n\t    ;;\n\t  RCC*)\n\t    # Rational C++ 2.4.1\n\t    lt_prog_compiler_pic_CXX='-pic'\n\t    ;;\n\t  cxx*)\n\t    # Digital/Compaq C++\n\t    lt_prog_compiler_wl_CXX='-Wl,'\n\t    # Make sure the PIC flag is empty.  It appears that all Alpha\n\t    # Linux and Compaq Tru64 Unix objects are PIC.\n\t    lt_prog_compiler_pic_CXX=\n\t    lt_prog_compiler_static_CXX='-non_shared'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      psos*)\n\t;;\n      solaris*)\n\tcase $cc_basename in\n\t  CC* | sunCC*)\n\t    # Sun C++ 4.2, 5.x and Centerline C++\n\t    lt_prog_compiler_pic_CXX='-KPIC'\n\t    lt_prog_compiler_static_CXX='-Bstatic'\n\t    lt_prog_compiler_wl_CXX='-Qoption ld '\n\t    ;;\n\t  gcx*)\n\t    # Green Hills C++ Compiler\n\t    lt_prog_compiler_pic_CXX='-PIC'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      sunos4*)\n\tcase $cc_basename in\n\t  CC*)\n\t    # Sun C++ 4.x\n\t    lt_prog_compiler_pic_CXX='-pic'\n\t    lt_prog_compiler_static_CXX='-Bstatic'\n\t    ;;\n\t  lcc*)\n\t    # Lucid\n\t    lt_prog_compiler_pic_CXX='-pic'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)\n\tcase $cc_basename in\n\t  CC*)\n\t    lt_prog_compiler_wl_CXX='-Wl,'\n\t    lt_prog_compiler_pic_CXX='-KPIC'\n\t    lt_prog_compiler_static_CXX='-Bstatic'\n\t    ;;\n\tesac\n\t;;\n      tandem*)\n\tcase $cc_basename in\n\t  NCC*)\n\t    # NonStop-UX NCC 3.20\n\t    lt_prog_compiler_pic_CXX='-KPIC'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      vxworks*)\n\t;;\n      *)\n\tlt_prog_compiler_can_build_shared_CXX=no\n\t;;\n    esac\n  fi\n\ncase $host_os in\n  # For platforms which do not support PIC, -DPIC is meaningless:\n  *djgpp*)\n    lt_prog_compiler_pic_CXX=\n    ;;\n  *)\n    lt_prog_compiler_pic_CXX=\"$lt_prog_compiler_pic_CXX -DPIC\"\n    ;;\nesac\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC\" >&5\n$as_echo_n \"checking for $compiler option to produce PIC... \" >&6; }\nif ${lt_cv_prog_compiler_pic_CXX+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX\" >&5\n$as_echo \"$lt_cv_prog_compiler_pic_CXX\" >&6; }\nlt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX\n\n#\n# Check to make sure the PIC flag actually works.\n#\nif test -n \"$lt_prog_compiler_pic_CXX\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works\" >&5\n$as_echo_n \"checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... \" >&6; }\nif ${lt_cv_prog_compiler_pic_works_CXX+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_pic_works_CXX=no\n   ac_outfile=conftest.$ac_objext\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n   lt_compiler_flag=\"$lt_prog_compiler_pic_CXX -DPIC\"\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   # The option is referenced via a variable to avoid confusing sed.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [^ ]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:$LINENO: $lt_compile\\\"\" >&5)\n   (eval \"$lt_compile\" 2>conftest.err)\n   ac_status=$?\n   cat conftest.err >&5\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n   if (exit $ac_status) && test -s \"$ac_outfile\"; then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings other than the usual output.\n     $ECHO \"$_lt_compiler_boilerplate\" | $SED '/^$/d' >conftest.exp\n     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2\n     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then\n       lt_cv_prog_compiler_pic_works_CXX=yes\n     fi\n   fi\n   $RM conftest*\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX\" >&5\n$as_echo \"$lt_cv_prog_compiler_pic_works_CXX\" >&6; }\n\nif test x\"$lt_cv_prog_compiler_pic_works_CXX\" = xyes; then\n    case $lt_prog_compiler_pic_CXX in\n     \"\" | \" \"*) ;;\n     *) lt_prog_compiler_pic_CXX=\" $lt_prog_compiler_pic_CXX\" ;;\n     esac\nelse\n    lt_prog_compiler_pic_CXX=\n     lt_prog_compiler_can_build_shared_CXX=no\nfi\n\nfi\n\n\n\n\n\n#\n# Check to make sure the static flag actually works.\n#\nwl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\\\"$lt_prog_compiler_static_CXX\\\"\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works\" >&5\n$as_echo_n \"checking if $compiler static flag $lt_tmp_static_flag works... \" >&6; }\nif ${lt_cv_prog_compiler_static_works_CXX+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_static_works_CXX=no\n   save_LDFLAGS=\"$LDFLAGS\"\n   LDFLAGS=\"$LDFLAGS $lt_tmp_static_flag\"\n   echo \"$lt_simple_link_test_code\" > conftest.$ac_ext\n   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then\n     # The linker can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     if test -s conftest.err; then\n       # Append any errors to the config.log.\n       cat conftest.err 1>&5\n       $ECHO \"$_lt_linker_boilerplate\" | $SED '/^$/d' > conftest.exp\n       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2\n       if diff conftest.exp conftest.er2 >/dev/null; then\n         lt_cv_prog_compiler_static_works_CXX=yes\n       fi\n     else\n       lt_cv_prog_compiler_static_works_CXX=yes\n     fi\n   fi\n   $RM -r conftest*\n   LDFLAGS=\"$save_LDFLAGS\"\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX\" >&5\n$as_echo \"$lt_cv_prog_compiler_static_works_CXX\" >&6; }\n\nif test x\"$lt_cv_prog_compiler_static_works_CXX\" = xyes; then\n    :\nelse\n    lt_prog_compiler_static_CXX=\nfi\n\n\n\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext\" >&5\n$as_echo_n \"checking if $compiler supports -c -o file.$ac_objext... \" >&6; }\nif ${lt_cv_prog_compiler_c_o_CXX+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_c_o_CXX=no\n   $RM -r conftest 2>/dev/null\n   mkdir conftest\n   cd conftest\n   mkdir out\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n\n   lt_compiler_flag=\"-o out/conftest2.$ac_objext\"\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [^ ]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:$LINENO: $lt_compile\\\"\" >&5)\n   (eval \"$lt_compile\" 2>out/conftest.err)\n   ac_status=$?\n   cat out/conftest.err >&5\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n   if (exit $ac_status) && test -s out/conftest2.$ac_objext\n   then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     $ECHO \"$_lt_compiler_boilerplate\" | $SED '/^$/d' > out/conftest.exp\n     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2\n     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then\n       lt_cv_prog_compiler_c_o_CXX=yes\n     fi\n   fi\n   chmod u+w . 2>&5\n   $RM conftest*\n   # SGI C++ compiler will create directory out/ii_files/ for\n   # template instantiation\n   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files\n   $RM out/* && rmdir out\n   cd ..\n   $RM -r conftest\n   $RM conftest*\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX\" >&5\n$as_echo \"$lt_cv_prog_compiler_c_o_CXX\" >&6; }\n\n\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext\" >&5\n$as_echo_n \"checking if $compiler supports -c -o file.$ac_objext... \" >&6; }\nif ${lt_cv_prog_compiler_c_o_CXX+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_c_o_CXX=no\n   $RM -r conftest 2>/dev/null\n   mkdir conftest\n   cd conftest\n   mkdir out\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n\n   lt_compiler_flag=\"-o out/conftest2.$ac_objext\"\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [^ ]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:$LINENO: $lt_compile\\\"\" >&5)\n   (eval \"$lt_compile\" 2>out/conftest.err)\n   ac_status=$?\n   cat out/conftest.err >&5\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n   if (exit $ac_status) && test -s out/conftest2.$ac_objext\n   then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     $ECHO \"$_lt_compiler_boilerplate\" | $SED '/^$/d' > out/conftest.exp\n     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2\n     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then\n       lt_cv_prog_compiler_c_o_CXX=yes\n     fi\n   fi\n   chmod u+w . 2>&5\n   $RM conftest*\n   # SGI C++ compiler will create directory out/ii_files/ for\n   # template instantiation\n   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files\n   $RM out/* && rmdir out\n   cd ..\n   $RM -r conftest\n   $RM conftest*\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX\" >&5\n$as_echo \"$lt_cv_prog_compiler_c_o_CXX\" >&6; }\n\n\n\n\nhard_links=\"nottested\"\nif test \"$lt_cv_prog_compiler_c_o_CXX\" = no && test \"$need_locks\" != no; then\n  # do not overwrite the value of need_locks provided by the user\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links\" >&5\n$as_echo_n \"checking if we can lock with hard links... \" >&6; }\n  hard_links=yes\n  $RM conftest*\n  ln conftest.a conftest.b 2>/dev/null && hard_links=no\n  touch conftest.a\n  ln conftest.a conftest.b 2>&5 || hard_links=no\n  ln conftest.a conftest.b 2>/dev/null && hard_links=no\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $hard_links\" >&5\n$as_echo \"$hard_links\" >&6; }\n  if test \"$hard_links\" = no; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: \\`$CC' does not support \\`-c -o', so \\`make -j' may be unsafe\" >&5\n$as_echo \"$as_me: WARNING: \\`$CC' does not support \\`-c -o', so \\`make -j' may be unsafe\" >&2;}\n    need_locks=warn\n  fi\nelse\n  need_locks=no\nfi\n\n\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries\" >&5\n$as_echo_n \"checking whether the $compiler linker ($LD) supports shared libraries... \" >&6; }\n\n  export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\\''s/.* //'\\'' | sort | uniq > $export_symbols'\n  exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'\n  case $host_os in\n  aix[4-9]*)\n    # If we're using GNU nm, then we don't want the \"-C\" option.\n    # -C means demangle to AIX nm, but means don't demangle with GNU nm\n    # Also, AIX nm treats weak defined symbols like other global defined\n    # symbols, whereas GNU nm marks them as \"W\".\n    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then\n      export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\") || (\\$ 2 == \"W\")) && (substr(\\$ 3,1,1) != \".\")) { print \\$ 3 } }'\\'' | sort -u > $export_symbols'\n    else\n      export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\")) && (substr(\\$ 3,1,1) != \".\")) { print \\$ 3 } }'\\'' | sort -u > $export_symbols'\n    fi\n    ;;\n  pw32*)\n    export_symbols_cmds_CXX=\"$ltdll_cmds\"\n    ;;\n  cygwin* | mingw* | cegcc*)\n    case $cc_basename in\n    cl*)\n      exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'\n      ;;\n    *)\n      export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\\''/^[BCDGRS][ ]/s/.*[ ]\\([^ ]*\\)/\\1 DATA/;s/^.*[ ]__nm__\\([^ ]*\\)[ ][^ ]*/\\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\\'' | sort | uniq > $export_symbols'\n      exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'\n      ;;\n    esac\n    ;;\n  linux* | k*bsd*-gnu | gnu*)\n    link_all_deplibs_CXX=no\n    ;;\n  *)\n    export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\\''s/.* //'\\'' | sort | uniq > $export_symbols'\n    ;;\n  esac\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX\" >&5\n$as_echo \"$ld_shlibs_CXX\" >&6; }\ntest \"$ld_shlibs_CXX\" = no && can_build_shared=no\n\nwith_gnu_ld_CXX=$with_gnu_ld\n\n\n\n\n\n\n#\n# Do we need to explicitly link libc?\n#\ncase \"x$archive_cmds_need_lc_CXX\" in\nx|xyes)\n  # Assume -lc should be added\n  archive_cmds_need_lc_CXX=yes\n\n  if test \"$enable_shared\" = yes && test \"$GCC\" = yes; then\n    case $archive_cmds_CXX in\n    *'~'*)\n      # FIXME: we may have to deal with multi-command sequences.\n      ;;\n    '$CC '*)\n      # Test whether the compiler implicitly links with -lc since on some\n      # systems, -lgcc has to come before -lc. If gcc already passes -lc\n      # to ld, don't add -lc before -lgcc.\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in\" >&5\n$as_echo_n \"checking whether -lc should be explicitly linked in... \" >&6; }\nif ${lt_cv_archive_cmds_need_lc_CXX+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  $RM conftest*\n\techo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n\n\tif { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } 2>conftest.err; then\n\t  soname=conftest\n\t  lib=conftest\n\t  libobjs=conftest.$ac_objext\n\t  deplibs=\n\t  wl=$lt_prog_compiler_wl_CXX\n\t  pic_flag=$lt_prog_compiler_pic_CXX\n\t  compiler_flags=-v\n\t  linker_flags=-v\n\t  verstring=\n\t  output_objdir=.\n\t  libname=conftest\n\t  lt_save_allow_undefined_flag=$allow_undefined_flag_CXX\n\t  allow_undefined_flag_CXX=\n\t  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$archive_cmds_CXX 2\\>\\&1 \\| $GREP \\\" -lc \\\" \\>/dev/null 2\\>\\&1\\\"\"; } >&5\n  (eval $archive_cmds_CXX 2\\>\\&1 \\| $GREP \\\" -lc \\\" \\>/dev/null 2\\>\\&1) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\n\t  then\n\t    lt_cv_archive_cmds_need_lc_CXX=no\n\t  else\n\t    lt_cv_archive_cmds_need_lc_CXX=yes\n\t  fi\n\t  allow_undefined_flag_CXX=$lt_save_allow_undefined_flag\n\telse\n\t  cat conftest.err 1>&5\n\tfi\n\t$RM conftest*\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX\" >&5\n$as_echo \"$lt_cv_archive_cmds_need_lc_CXX\" >&6; }\n      archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX\n      ;;\n    esac\n  fi\n  ;;\nesac\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\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\n\n\n\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics\" >&5\n$as_echo_n \"checking dynamic linker characteristics... \" >&6; }\n\nlibrary_names_spec=\nlibname_spec='lib$name'\nsoname_spec=\nshrext_cmds=\".so\"\npostinstall_cmds=\npostuninstall_cmds=\nfinish_cmds=\nfinish_eval=\nshlibpath_var=\nshlibpath_overrides_runpath=unknown\nversion_type=none\ndynamic_linker=\"$host_os ld.so\"\nsys_lib_dlsearch_path_spec=\"/lib /usr/lib\"\nneed_lib_prefix=unknown\nhardcode_into_libs=no\n\n# when you set need_version to no, make sure it does not cause -set_version\n# flags to be left without arguments\nneed_version=unknown\n\ncase $host_os in\naix3*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'\n  shlibpath_var=LIBPATH\n\n  # AIX 3 has no versioning support, so we append a major version to the name.\n  soname_spec='${libname}${release}${shared_ext}$major'\n  ;;\n\naix[4-9]*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  hardcode_into_libs=yes\n  if test \"$host_cpu\" = ia64; then\n    # AIX 5 supports IA64\n    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'\n    shlibpath_var=LD_LIBRARY_PATH\n  else\n    # With GCC up to 2.95.x, collect2 would create an import file\n    # for dependence libraries.  The import file would start with\n    # the line `#! .'.  This would cause the generated library to\n    # depend on `.', always an invalid library.  This was fixed in\n    # development snapshots of GCC prior to 3.0.\n    case $host_os in\n      aix4 | aix4.[01] | aix4.[01].*)\n      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'\n\t   echo ' yes '\n\t   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then\n\t:\n      else\n\tcan_build_shared=no\n      fi\n      ;;\n    esac\n    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct\n    # soname into executable. Probably we can add versioning support to\n    # collect2, so additional links can be useful in future.\n    if test \"$aix_use_runtimelinking\" = yes; then\n      # If using run time linking (on AIX 4.2 or later) use lib<name>.so\n      # instead of lib<name>.a to let people know that these are not\n      # typical AIX shared libraries.\n      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    else\n      # We preserve .a as extension for shared libraries through AIX4.2\n      # and later when we are not doing run time linking.\n      library_names_spec='${libname}${release}.a $libname.a'\n      soname_spec='${libname}${release}${shared_ext}$major'\n    fi\n    shlibpath_var=LIBPATH\n  fi\n  ;;\n\namigaos*)\n  case $host_cpu in\n  powerpc)\n    # Since July 2007 AmigaOS4 officially supports .so libraries.\n    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    ;;\n  m68k)\n    library_names_spec='$libname.ixlibrary $libname.a'\n    # Create ${libname}_ixlibrary.a entries in /sys/libs.\n    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all \"$lib\" | $SED '\\''s%^.*/\\([^/]*\\)\\.ixlibrary$%\\1%'\\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show \"cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a\"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'\n    ;;\n  esac\n  ;;\n\nbeos*)\n  library_names_spec='${libname}${shared_ext}'\n  dynamic_linker=\"$host_os ld.so\"\n  shlibpath_var=LIBRARY_PATH\n  ;;\n\nbsdi[45]*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  sys_lib_search_path_spec=\"/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib\"\n  sys_lib_dlsearch_path_spec=\"/shlib /usr/lib /usr/local/lib\"\n  # the default ld.so.conf also contains /usr/contrib/lib and\n  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow\n  # libtool to hard-code these into programs\n  ;;\n\ncygwin* | mingw* | pw32* | cegcc*)\n  version_type=windows\n  shrext_cmds=\".dll\"\n  need_version=no\n  need_lib_prefix=no\n\n  case $GCC,$cc_basename in\n  yes,*)\n    # gcc\n    library_names_spec='$libname.dll.a'\n    # DLL is installed to $(libdir)/../bin by postinstall_cmds\n    postinstall_cmds='base_file=`basename \\${file}`~\n      dlpath=`$SHELL 2>&1 -c '\\''. $dir/'\\''\\${base_file}'\\''i; echo \\$dlname'\\''`~\n      dldir=$destdir/`dirname \\$dlpath`~\n      test -d \\$dldir || mkdir -p \\$dldir~\n      $install_prog $dir/$dlname \\$dldir/$dlname~\n      chmod a+x \\$dldir/$dlname~\n      if test -n '\\''$stripme'\\'' && test -n '\\''$striplib'\\''; then\n        eval '\\''$striplib \\$dldir/$dlname'\\'' || exit \\$?;\n      fi'\n    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\\''. $file; echo \\$dlname'\\''`~\n      dlpath=$dir/\\$dldll~\n       $RM \\$dlpath'\n    shlibpath_overrides_runpath=yes\n\n    case $host_os in\n    cygwin*)\n      # Cygwin DLLs use 'cyg' prefix rather than 'lib'\n      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'\n\n      ;;\n    mingw* | cegcc*)\n      # MinGW DLLs use traditional 'lib' prefix\n      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'\n      ;;\n    pw32*)\n      # pw32 DLLs use 'pw' prefix rather than 'lib'\n      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'\n      ;;\n    esac\n    dynamic_linker='Win32 ld.exe'\n    ;;\n\n  *,cl*)\n    # Native MSVC\n    libname_spec='$name'\n    soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'\n    library_names_spec='${libname}.dll.lib'\n\n    case $build_os in\n    mingw*)\n      sys_lib_search_path_spec=\n      lt_save_ifs=$IFS\n      IFS=';'\n      for lt_path in $LIB\n      do\n        IFS=$lt_save_ifs\n        # Let DOS variable expansion print the short 8.3 style file name.\n        lt_path=`cd \"$lt_path\" 2>/dev/null && cmd //C \"for %i in (\".\") do @echo %~si\"`\n        sys_lib_search_path_spec=\"$sys_lib_search_path_spec $lt_path\"\n      done\n      IFS=$lt_save_ifs\n      # Convert to MSYS style.\n      sys_lib_search_path_spec=`$ECHO \"$sys_lib_search_path_spec\" | sed -e 's|\\\\\\\\|/|g' -e 's| \\\\([a-zA-Z]\\\\):| /\\\\1|g' -e 's|^ ||'`\n      ;;\n    cygwin*)\n      # Convert to unix form, then to dos form, then back to unix form\n      # but this time dos style (no spaces!) so that the unix form looks\n      # like /cygdrive/c/PROGRA~1:/cygdr...\n      sys_lib_search_path_spec=`cygpath --path --unix \"$LIB\"`\n      sys_lib_search_path_spec=`cygpath --path --dos \"$sys_lib_search_path_spec\" 2>/dev/null`\n      sys_lib_search_path_spec=`cygpath --path --unix \"$sys_lib_search_path_spec\" | $SED -e \"s/$PATH_SEPARATOR/ /g\"`\n      ;;\n    *)\n      sys_lib_search_path_spec=\"$LIB\"\n      if $ECHO \"$sys_lib_search_path_spec\" | $GREP ';[c-zC-Z]:/' >/dev/null; then\n        # It is most probably a Windows format PATH.\n        sys_lib_search_path_spec=`$ECHO \"$sys_lib_search_path_spec\" | $SED -e 's/;/ /g'`\n      else\n        sys_lib_search_path_spec=`$ECHO \"$sys_lib_search_path_spec\" | $SED -e \"s/$PATH_SEPARATOR/ /g\"`\n      fi\n      # FIXME: find the short name or the path components, as spaces are\n      # common. (e.g. \"Program Files\" -> \"PROGRA~1\")\n      ;;\n    esac\n\n    # DLL is installed to $(libdir)/../bin by postinstall_cmds\n    postinstall_cmds='base_file=`basename \\${file}`~\n      dlpath=`$SHELL 2>&1 -c '\\''. $dir/'\\''\\${base_file}'\\''i; echo \\$dlname'\\''`~\n      dldir=$destdir/`dirname \\$dlpath`~\n      test -d \\$dldir || mkdir -p \\$dldir~\n      $install_prog $dir/$dlname \\$dldir/$dlname'\n    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\\''. $file; echo \\$dlname'\\''`~\n      dlpath=$dir/\\$dldll~\n       $RM \\$dlpath'\n    shlibpath_overrides_runpath=yes\n    dynamic_linker='Win32 link.exe'\n    ;;\n\n  *)\n    # Assume MSVC wrapper\n    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'\n    dynamic_linker='Win32 ld.exe'\n    ;;\n  esac\n  # FIXME: first we should search . and the directory the executable is in\n  shlibpath_var=PATH\n  ;;\n\ndarwin* | rhapsody*)\n  dynamic_linker=\"$host_os dyld\"\n  version_type=darwin\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'\n  soname_spec='${libname}${release}${major}$shared_ext'\n  shlibpath_overrides_runpath=yes\n  shlibpath_var=DYLD_LIBRARY_PATH\n  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'\n\n  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'\n  ;;\n\ndgux*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\nfreebsd* | dragonfly*)\n  # DragonFly does not have aout.  When/if they implement a new\n  # versioning mechanism, adjust this.\n  if test -x /usr/bin/objformat; then\n    objformat=`/usr/bin/objformat`\n  else\n    case $host_os in\n    freebsd[23].*) objformat=aout ;;\n    *) objformat=elf ;;\n    esac\n  fi\n  version_type=freebsd-$objformat\n  case $version_type in\n    freebsd-elf*)\n      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'\n      need_version=no\n      need_lib_prefix=no\n      ;;\n    freebsd-*)\n      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'\n      need_version=yes\n      ;;\n  esac\n  shlibpath_var=LD_LIBRARY_PATH\n  case $host_os in\n  freebsd2.*)\n    shlibpath_overrides_runpath=yes\n    ;;\n  freebsd3.[01]* | freebsdelf3.[01]*)\n    shlibpath_overrides_runpath=yes\n    hardcode_into_libs=yes\n    ;;\n  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \\\n  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)\n    shlibpath_overrides_runpath=no\n    hardcode_into_libs=yes\n    ;;\n  *) # from 4.6 on, and DragonFly\n    shlibpath_overrides_runpath=yes\n    hardcode_into_libs=yes\n    ;;\n  esac\n  ;;\n\ngnu*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  ;;\n\nhaiku*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  dynamic_linker=\"$host_os runtime_loader\"\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'\n  hardcode_into_libs=yes\n  ;;\n\nhpux9* | hpux10* | hpux11*)\n  # Give a soname corresponding to the major version so that dld.sl refuses to\n  # link against other versions.\n  version_type=sunos\n  need_lib_prefix=no\n  need_version=no\n  case $host_cpu in\n  ia64*)\n    shrext_cmds='.so'\n    hardcode_into_libs=yes\n    dynamic_linker=\"$host_os dld.so\"\n    shlibpath_var=LD_LIBRARY_PATH\n    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    if test \"X$HPUX_IA64_MODE\" = X32; then\n      sys_lib_search_path_spec=\"/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib\"\n    else\n      sys_lib_search_path_spec=\"/usr/lib/hpux64 /usr/local/lib/hpux64\"\n    fi\n    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec\n    ;;\n  hppa*64*)\n    shrext_cmds='.sl'\n    hardcode_into_libs=yes\n    dynamic_linker=\"$host_os dld.sl\"\n    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH\n    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    sys_lib_search_path_spec=\"/usr/lib/pa20_64 /usr/ccs/lib/pa20_64\"\n    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec\n    ;;\n  *)\n    shrext_cmds='.sl'\n    dynamic_linker=\"$host_os dld.sl\"\n    shlibpath_var=SHLIB_PATH\n    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    ;;\n  esac\n  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...\n  postinstall_cmds='chmod 555 $lib'\n  # or fails outright, so override atomically:\n  install_override_mode=555\n  ;;\n\ninterix[3-9]*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  ;;\n\nirix5* | irix6* | nonstopux*)\n  case $host_os in\n    nonstopux*) version_type=nonstopux ;;\n    *)\n\tif test \"$lt_cv_prog_gnu_ld\" = yes; then\n\t\tversion_type=linux # correct to gnu/linux during the next big refactor\n\telse\n\t\tversion_type=irix\n\tfi ;;\n  esac\n  need_lib_prefix=no\n  need_version=no\n  soname_spec='${libname}${release}${shared_ext}$major'\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'\n  case $host_os in\n  irix5* | nonstopux*)\n    libsuff= shlibsuff=\n    ;;\n  *)\n    case $LD in # libtool.m4 will add one of these switches to LD\n    *-32|*\"-32 \"|*-melf32bsmip|*\"-melf32bsmip \")\n      libsuff= shlibsuff= libmagic=32-bit;;\n    *-n32|*\"-n32 \"|*-melf32bmipn32|*\"-melf32bmipn32 \")\n      libsuff=32 shlibsuff=N32 libmagic=N32;;\n    *-64|*\"-64 \"|*-melf64bmip|*\"-melf64bmip \")\n      libsuff=64 shlibsuff=64 libmagic=64-bit;;\n    *) libsuff= shlibsuff= libmagic=never-match;;\n    esac\n    ;;\n  esac\n  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH\n  shlibpath_overrides_runpath=no\n  sys_lib_search_path_spec=\"/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}\"\n  sys_lib_dlsearch_path_spec=\"/usr/lib${libsuff} /lib${libsuff}\"\n  hardcode_into_libs=yes\n  ;;\n\n# No shared lib support for Linux oldld, aout, or coff.\nlinux*oldld* | linux*aout* | linux*coff*)\n  dynamic_linker=no\n  ;;\n\n# This must be glibc/ELF.\nlinux* | k*bsd*-gnu | kopensolaris*-gnu)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -n $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n\n  # Some binutils ld are patched to set DT_RUNPATH\n  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_shlibpath_overrides_runpath=no\n    save_LDFLAGS=$LDFLAGS\n    save_libdir=$libdir\n    eval \"libdir=/foo; wl=\\\"$lt_prog_compiler_wl_CXX\\\"; \\\n\t LDFLAGS=\\\"\\$LDFLAGS $hardcode_libdir_flag_spec_CXX\\\"\"\n    cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_link \"$LINENO\"; then :\n  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep \"RUNPATH.*$libdir\" >/dev/null; then :\n  lt_cv_shlibpath_overrides_runpath=yes\nfi\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n    LDFLAGS=$save_LDFLAGS\n    libdir=$save_libdir\n\nfi\n\n  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath\n\n  # This implies no fast_install, which is unacceptable.\n  # Some rework will be needed to allow for fast_install\n  # before this can be enabled.\n  hardcode_into_libs=yes\n\n  # Append ld.so.conf contents to the search path\n  if test -f /etc/ld.so.conf; then\n    lt_ld_extra=`awk '/^include / { system(sprintf(\"cd /etc; cat %s 2>/dev/null\", \\$2)); skip = 1; } { if (!skip) print \\$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[\t ]*hwcap[\t ]/d;s/[:,\t]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/\"//g;/^$/d' | tr '\\n' ' '`\n    sys_lib_dlsearch_path_spec=\"/lib /usr/lib $lt_ld_extra\"\n  fi\n\n  # We used to test for /lib/ld.so.1 and disable shared libraries on\n  # powerpc, because MkLinux only supported shared libraries with the\n  # GNU dynamic linker.  Since this was broken with cross compilers,\n  # most powerpc-linux boxes support dynamic linking these days and\n  # people can always --disable-shared, the test was removed, and we\n  # assume the GNU/Linux dynamic linker is in use.\n  dynamic_linker='GNU/Linux ld.so'\n  ;;\n\nnetbsdelf*-gnu)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  dynamic_linker='NetBSD ld.elf_so'\n  ;;\n\nnetbsd*)\n  version_type=sunos\n  need_lib_prefix=no\n  need_version=no\n  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'\n    finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -m $libdir'\n    dynamic_linker='NetBSD (a.out) ld.so'\n  else\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    dynamic_linker='NetBSD ld.elf_so'\n  fi\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  ;;\n\nnewsos6)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  ;;\n\n*nto* | *qnx*)\n  version_type=qnx\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  dynamic_linker='ldqnx.so'\n  ;;\n\nopenbsd*)\n  version_type=sunos\n  sys_lib_dlsearch_path_spec=\"/usr/lib\"\n  need_lib_prefix=no\n  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.\n  case $host_os in\n    openbsd3.3 | openbsd3.3.*)\tneed_version=yes ;;\n    *)\t\t\t\tneed_version=no  ;;\n  esac\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -m $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  if test -z \"`echo __ELF__ | $CC -E - | $GREP __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n    case $host_os in\n      openbsd2.[89] | openbsd2.[89].*)\n\tshlibpath_overrides_runpath=no\n\t;;\n      *)\n\tshlibpath_overrides_runpath=yes\n\t;;\n      esac\n  else\n    shlibpath_overrides_runpath=yes\n  fi\n  ;;\n\nos2*)\n  libname_spec='$name'\n  shrext_cmds=\".dll\"\n  need_lib_prefix=no\n  library_names_spec='$libname${shared_ext} $libname.a'\n  dynamic_linker='OS/2 ld.exe'\n  shlibpath_var=LIBPATH\n  ;;\n\nosf3* | osf4* | osf5*)\n  version_type=osf\n  need_lib_prefix=no\n  need_version=no\n  soname_spec='${libname}${release}${shared_ext}$major'\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  shlibpath_var=LD_LIBRARY_PATH\n  sys_lib_search_path_spec=\"/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib\"\n  sys_lib_dlsearch_path_spec=\"$sys_lib_search_path_spec\"\n  ;;\n\nrdos*)\n  dynamic_linker=no\n  ;;\n\nsolaris*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  # ldd complains unless libraries are executable\n  postinstall_cmds='chmod +x $lib'\n  ;;\n\nsunos4*)\n  version_type=sunos\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'\n  finish_cmds='PATH=\"\\$PATH:/usr/etc\" ldconfig $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  if test \"$with_gnu_ld\" = yes; then\n    need_lib_prefix=no\n  fi\n  need_version=yes\n  ;;\n\nsysv4 | sysv4.3*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  case $host_vendor in\n    sni)\n      shlibpath_overrides_runpath=no\n      need_lib_prefix=no\n      runpath_var=LD_RUN_PATH\n      ;;\n    siemens)\n      need_lib_prefix=no\n      ;;\n    motorola)\n      need_lib_prefix=no\n      need_version=no\n      shlibpath_overrides_runpath=no\n      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'\n      ;;\n  esac\n  ;;\n\nsysv4*MP*)\n  if test -d /usr/nec ;then\n    version_type=linux # correct to gnu/linux during the next big refactor\n    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'\n    soname_spec='$libname${shared_ext}.$major'\n    shlibpath_var=LD_LIBRARY_PATH\n  fi\n  ;;\n\nsysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)\n  version_type=freebsd-elf\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  if test \"$with_gnu_ld\" = yes; then\n    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'\n  else\n    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'\n    case $host_os in\n      sco3.2v5*)\n        sys_lib_search_path_spec=\"$sys_lib_search_path_spec /lib\"\n\t;;\n    esac\n  fi\n  sys_lib_dlsearch_path_spec='/usr/lib'\n  ;;\n\ntpf*)\n  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  ;;\n\nuts4*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\n*)\n  dynamic_linker=no\n  ;;\nesac\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $dynamic_linker\" >&5\n$as_echo \"$dynamic_linker\" >&6; }\ntest \"$dynamic_linker\" = no && can_build_shared=no\n\nvariables_saved_for_relink=\"PATH $shlibpath_var $runpath_var\"\nif test \"$GCC\" = yes; then\n  variables_saved_for_relink=\"$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH\"\nfi\n\nif test \"${lt_cv_sys_lib_search_path_spec+set}\" = set; then\n  sys_lib_search_path_spec=\"$lt_cv_sys_lib_search_path_spec\"\nfi\nif test \"${lt_cv_sys_lib_dlsearch_path_spec+set}\" = set; then\n  sys_lib_dlsearch_path_spec=\"$lt_cv_sys_lib_dlsearch_path_spec\"\nfi\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\n\n\n\n\n\n\n\n\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs\" >&5\n$as_echo_n \"checking how to hardcode library paths into programs... \" >&6; }\nhardcode_action_CXX=\nif test -n \"$hardcode_libdir_flag_spec_CXX\" ||\n   test -n \"$runpath_var_CXX\" ||\n   test \"X$hardcode_automatic_CXX\" = \"Xyes\" ; then\n\n  # We can hardcode non-existent directories.\n  if test \"$hardcode_direct_CXX\" != no &&\n     # If the only mechanism to avoid hardcoding is shlibpath_var, we\n     # have to relink, otherwise we might link with an installed library\n     # when we should be linking with a yet-to-be-installed one\n     ## test \"$_LT_TAGVAR(hardcode_shlibpath_var, CXX)\" != no &&\n     test \"$hardcode_minus_L_CXX\" != no; then\n    # Linking always hardcodes the temporary library directory.\n    hardcode_action_CXX=relink\n  else\n    # We can link without hardcoding, and we can hardcode nonexisting dirs.\n    hardcode_action_CXX=immediate\n  fi\nelse\n  # We cannot hardcode anything, or else we can only hardcode existing\n  # directories.\n  hardcode_action_CXX=unsupported\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX\" >&5\n$as_echo \"$hardcode_action_CXX\" >&6; }\n\nif test \"$hardcode_action_CXX\" = relink ||\n   test \"$inherit_rpath_CXX\" = yes; then\n  # Fast installation is not supported\n  enable_fast_install=no\nelif test \"$shlibpath_overrides_runpath\" = yes ||\n     test \"$enable_shared\" = no; then\n  # Fast installation is not necessary\n  enable_fast_install=needless\nfi\n\n\n\n\n\n\n\n  fi # test -n \"$compiler\"\n\n  CC=$lt_save_CC\n  CFLAGS=$lt_save_CFLAGS\n  LDCXX=$LD\n  LD=$lt_save_LD\n  GCC=$lt_save_GCC\n  with_gnu_ld=$lt_save_with_gnu_ld\n  lt_cv_path_LDCXX=$lt_cv_path_LD\n  lt_cv_path_LD=$lt_save_path_LD\n  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld\n  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld\nfi # test \"$_lt_caught_CXX_error\" != yes\n\nac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        ac_config_commands=\"$ac_config_commands libtool\"\n\n\n\n\n# Only expand once:\n\n\n\n\n\nfor ac_header in sys/times.h\ndo :\n  ac_fn_cxx_check_header_mongrel \"$LINENO\" \"sys/times.h\" \"ac_cv_header_sys_times_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_sys_times_h\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_SYS_TIMES_H 1\n_ACEOF\n\nfi\n\ndone\n\n\nBUILDER=`whoami`\n\nBUILDDATE=`date +%D,%H:%M:%S`\n\nCONFIGURE_ARGS=$ac_configure_args\n\nLIBTOOL_VERSION_INFO=\"-version-info ${MAJOR_VERSION}:${MINOR_VERSION}:0\"\n\n\n\nac_config_files=\"$ac_config_files Makefile tests/Makefile include/Makefile gmm-config\"\n\n\n\ntest \"x$prefix\" = xNONE && prefix=$ac_default_prefix\n# Let make expand exec_prefix.\ntest \"x$exec_prefix\" = xNONE && exec_prefix='${prefix}'\n\nDEFS=-DHAVE_CONFIG_H\n\nac_libobjs=\nac_ltlibobjs=\nU=\nfor ac_i in : $LIBOBJS; do test \"x$ac_i\" = x: && continue\n  # 1. Remove the extension, and $U if already installed.\n  ac_script='s/\\$U\\././;s/\\.o$//;s/\\.obj$//'\n  ac_i=`$as_echo \"$ac_i\" | sed \"$ac_script\"`\n  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR\n  #    will be set to the directory where LIBOBJS objects are built.\n  as_fn_append ac_libobjs \" \\${LIBOBJDIR}$ac_i\\$U.$ac_objext\"\n  as_fn_append ac_ltlibobjs \" \\${LIBOBJDIR}$ac_i\"'$U.lo'\ndone\nLIBOBJS=$ac_libobjs\n\nLTLIBOBJS=$ac_ltlibobjs\n\n\n if test -n \"$EXEEXT\"; then\n  am__EXEEXT_TRUE=\n  am__EXEEXT_FALSE='#'\nelse\n  am__EXEEXT_TRUE='#'\n  am__EXEEXT_FALSE=\nfi\n\nif test -z \"${AMDEP_TRUE}\" && test -z \"${AMDEP_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"AMDEP\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${am__fastdepCXX_TRUE}\" && test -z \"${am__fastdepCXX_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"am__fastdepCXX\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${am__fastdepCC_TRUE}\" && test -z \"${am__fastdepCC_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"am__fastdepCC\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\n\n: \"${CONFIG_STATUS=./config.status}\"\nac_write_fail=0\nac_clean_files_save=$ac_clean_files\nac_clean_files=\"$ac_clean_files $CONFIG_STATUS\"\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS\" >&5\n$as_echo \"$as_me: creating $CONFIG_STATUS\" >&6;}\nas_write_fail=0\ncat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1\n#! $SHELL\n# Generated by $as_me.\n# Run this file to recreate the current configuration.\n# Compiler output produced by configure, useful for debugging\n# configure, is in config.log if it exists.\n\ndebug=false\nac_cs_recheck=false\nac_cs_silent=false\n\nSHELL=\\${CONFIG_SHELL-$SHELL}\nexport SHELL\n_ASEOF\ncat >>$CONFIG_STATUS <<\\_ASEOF || as_write_fail=1\n## -------------------- ##\n## M4sh Initialization. ##\n## -------------------- ##\n\n# Be more Bourne compatible\nDUALCASE=1; export DUALCASE # for MKS sh\nif test -n \"${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :\n  emulate sh\n  NULLCMD=:\n  # Pre-4.2 versions of Zsh do word splitting on ${1+\"$@\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '${1+\"$@\"}'='\"$@\"'\n  setopt NO_GLOB_SUBST\nelse\n  case `(set -o) 2>/dev/null` in #(\n  *posix*) :\n    set -o posix ;; #(\n  *) :\n     ;;\nesac\nfi\n\n\nas_nl='\n'\nexport as_nl\n# Printing a long string crashes Solaris 7 /usr/bin/printf.\nas_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo\n# Prefer a ksh shell builtin over an external printf program on Solaris,\n# but without wasting forks for bash or zsh.\nif test -z \"$BASH_VERSION$ZSH_VERSION\" \\\n    && (test \"X`print -r -- $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='print -r --'\n  as_echo_n='print -rn --'\nelif (test \"X`printf %s $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='printf %s\\n'\n  as_echo_n='printf %s'\nelse\n  if test \"X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`\" = \"X-n $as_echo\"; then\n    as_echo_body='eval /usr/ucb/echo -n \"$1$as_nl\"'\n    as_echo_n='/usr/ucb/echo -n'\n  else\n    as_echo_body='eval expr \"X$1\" : \"X\\\\(.*\\\\)\"'\n    as_echo_n_body='eval\n      arg=$1;\n      case $arg in #(\n      *\"$as_nl\"*)\n\texpr \"X$arg\" : \"X\\\\(.*\\\\)$as_nl\";\n\targ=`expr \"X$arg\" : \".*$as_nl\\\\(.*\\\\)\"`;;\n      esac;\n      expr \"X$arg\" : \"X\\\\(.*\\\\)\" | tr -d \"$as_nl\"\n    '\n    export as_echo_n_body\n    as_echo_n='sh -c $as_echo_n_body as_echo'\n  fi\n  export as_echo_body\n  as_echo='sh -c $as_echo_body as_echo'\nfi\n\n# The user is always right.\nif test \"${PATH_SEPARATOR+set}\" != set; then\n  PATH_SEPARATOR=:\n  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {\n    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||\n      PATH_SEPARATOR=';'\n  }\nfi\n\n\n# IFS\n# We need space, tab and new line, in precisely that order.  Quoting is\n# there to prevent editors from complaining about space-tab.\n# (If _AS_PATH_WALK were called with IFS unset, it would disable word\n# splitting by setting IFS to empty value.)\nIFS=\" \"\"\t$as_nl\"\n\n# Find who we are.  Look in the path if we contain no directory separator.\nas_myself=\ncase $0 in #((\n  *[\\\\/]* ) as_myself=$0 ;;\n  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    test -r \"$as_dir/$0\" && as_myself=$as_dir/$0 && break\n  done\nIFS=$as_save_IFS\n\n     ;;\nesac\n# We did not find ourselves, most probably we were run as `sh COMMAND'\n# in which case we are not to be found in the path.\nif test \"x$as_myself\" = x; then\n  as_myself=$0\nfi\nif test ! -f \"$as_myself\"; then\n  $as_echo \"$as_myself: error: cannot find myself; rerun with an absolute file name\" >&2\n  exit 1\nfi\n\n# Unset variables that we do not need and which cause bugs (e.g. in\n# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the \"|| exit 1\"\n# suppresses any \"Segmentation fault\" message there.  '((' could\n# trigger a bug in pdksh 5.2.14.\nfor as_var in BASH_ENV ENV MAIL MAILPATH\ndo eval test x\\${$as_var+set} = xset \\\n  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :\ndone\nPS1='$ '\nPS2='> '\nPS4='+ '\n\n# NLS nuisances.\nLC_ALL=C\nexport LC_ALL\nLANGUAGE=C\nexport LANGUAGE\n\n# CDPATH.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\n\n# as_fn_error STATUS ERROR [LINENO LOG_FD]\n# ----------------------------------------\n# Output \"`basename $0`: error: ERROR\" to stderr. If LINENO and LOG_FD are\n# provided, also output the error to LOG_FD, referencing LINENO. Then exit the\n# script with STATUS, using 1 if that was 0.\nas_fn_error ()\n{\n  as_status=$1; test $as_status -eq 0 && as_status=1\n  if test \"$4\"; then\n    as_lineno=${as_lineno-\"$3\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n    $as_echo \"$as_me:${as_lineno-$LINENO}: error: $2\" >&$4\n  fi\n  $as_echo \"$as_me: error: $2\" >&2\n  as_fn_exit $as_status\n} # as_fn_error\n\n\n# as_fn_set_status STATUS\n# -----------------------\n# Set $? to STATUS, without forking.\nas_fn_set_status ()\n{\n  return $1\n} # as_fn_set_status\n\n# as_fn_exit STATUS\n# -----------------\n# Exit the shell with STATUS, even in a \"trap 0\" or \"set -e\" context.\nas_fn_exit ()\n{\n  set +e\n  as_fn_set_status $1\n  exit $1\n} # as_fn_exit\n\n# as_fn_unset VAR\n# ---------------\n# Portably unset VAR.\nas_fn_unset ()\n{\n  { eval $1=; unset $1;}\n}\nas_unset=as_fn_unset\n# as_fn_append VAR VALUE\n# ----------------------\n# Append the text in VALUE to the end of the definition contained in VAR. Take\n# advantage of any shell optimizations that allow amortized linear growth over\n# repeated appends, instead of the typical quadratic growth present in naive\n# implementations.\nif (eval \"as_var=1; as_var+=2; test x\\$as_var = x12\") 2>/dev/null; then :\n  eval 'as_fn_append ()\n  {\n    eval $1+=\\$2\n  }'\nelse\n  as_fn_append ()\n  {\n    eval $1=\\$$1\\$2\n  }\nfi # as_fn_append\n\n# as_fn_arith ARG...\n# ------------------\n# Perform arithmetic evaluation on the ARGs, and store the result in the\n# global $as_val. Take advantage of shells that can avoid forks. The arguments\n# must be portable across $(()) and expr.\nif (eval \"test \\$(( 1 + 1 )) = 2\") 2>/dev/null; then :\n  eval 'as_fn_arith ()\n  {\n    as_val=$(( $* ))\n  }'\nelse\n  as_fn_arith ()\n  {\n    as_val=`expr \"$@\" || test $? -eq 1`\n  }\nfi # as_fn_arith\n\n\nif expr a : '\\(a\\)' >/dev/null 2>&1 &&\n   test \"X`expr 00001 : '.*\\(...\\)'`\" = X001; then\n  as_expr=expr\nelse\n  as_expr=false\nfi\n\nif (basename -- /) >/dev/null 2>&1 && test \"X`basename -- / 2>&1`\" = \"X/\"; then\n  as_basename=basename\nelse\n  as_basename=false\nfi\n\nif (as_dir=`dirname -- /` && test \"X$as_dir\" = X/) >/dev/null 2>&1; then\n  as_dirname=dirname\nelse\n  as_dirname=false\nfi\n\nas_me=`$as_basename -- \"$0\" ||\n$as_expr X/\"$0\" : '.*/\\([^/][^/]*\\)/*$' \\| \\\n\t X\"$0\" : 'X\\(//\\)$' \\| \\\n\t X\"$0\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X/\"$0\" |\n    sed '/^.*\\/\\([^/][^/]*\\)\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n\n# Avoid depending upon Character Ranges.\nas_cr_letters='abcdefghijklmnopqrstuvwxyz'\nas_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'\nas_cr_Letters=$as_cr_letters$as_cr_LETTERS\nas_cr_digits='0123456789'\nas_cr_alnum=$as_cr_Letters$as_cr_digits\n\nECHO_C= ECHO_N= ECHO_T=\ncase `echo -n x` in #(((((\n-n*)\n  case `echo 'xy\\c'` in\n  *c*) ECHO_T='\t';;\t# ECHO_T is single tab character.\n  xy)  ECHO_C='\\c';;\n  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null\n       ECHO_T='\t';;\n  esac;;\n*)\n  ECHO_N='-n';;\nesac\n\nrm -f conf$$ conf$$.exe conf$$.file\nif test -d conf$$.dir; then\n  rm -f conf$$.dir/conf$$.file\nelse\n  rm -f conf$$.dir\n  mkdir conf$$.dir 2>/dev/null\nfi\nif (echo >conf$$.file) 2>/dev/null; then\n  if ln -s conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s='ln -s'\n    # ... but there are two gotchas:\n    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.\n    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.\n    # In both cases, we have to default to `cp -p'.\n    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||\n      as_ln_s='cp -p'\n  elif ln conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s=ln\n  else\n    as_ln_s='cp -p'\n  fi\nelse\n  as_ln_s='cp -p'\nfi\nrm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file\nrmdir conf$$.dir 2>/dev/null\n\n\n# as_fn_mkdir_p\n# -------------\n# Create \"$as_dir\" as a directory, including parents if necessary.\nas_fn_mkdir_p ()\n{\n\n  case $as_dir in #(\n  -*) as_dir=./$as_dir;;\n  esac\n  test -d \"$as_dir\" || eval $as_mkdir_p || {\n    as_dirs=\n    while :; do\n      case $as_dir in #(\n      *\\'*) as_qdir=`$as_echo \"$as_dir\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;; #'(\n      *) as_qdir=$as_dir;;\n      esac\n      as_dirs=\"'$as_qdir' $as_dirs\"\n      as_dir=`$as_dirname -- \"$as_dir\" ||\n$as_expr X\"$as_dir\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)$' \\| \\\n\t X\"$as_dir\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$as_dir\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n      test -d \"$as_dir\" && break\n    done\n    test -z \"$as_dirs\" || eval \"mkdir $as_dirs\"\n  } || test -d \"$as_dir\" || as_fn_error $? \"cannot create directory $as_dir\"\n\n\n} # as_fn_mkdir_p\nif mkdir -p . 2>/dev/null; then\n  as_mkdir_p='mkdir -p \"$as_dir\"'\nelse\n  test -d ./-p && rmdir ./-p\n  as_mkdir_p=false\nfi\n\nif test -x / >/dev/null 2>&1; then\n  as_test_x='test -x'\nelse\n  if ls -dL / >/dev/null 2>&1; then\n    as_ls_L_option=L\n  else\n    as_ls_L_option=\n  fi\n  as_test_x='\n    eval sh -c '\\''\n      if test -d \"$1\"; then\n\ttest -d \"$1/.\";\n      else\n\tcase $1 in #(\n\t-*)set \"./$1\";;\n\tesac;\n\tcase `ls -ld'$as_ls_L_option' \"$1\" 2>/dev/null` in #((\n\t???[sx]*):;;*)false;;esac;fi\n    '\\'' sh\n  '\nfi\nas_executable_p=$as_test_x\n\n# Sed expression to map a string onto a valid CPP name.\nas_tr_cpp=\"eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'\"\n\n# Sed expression to map a string onto a valid variable name.\nas_tr_sh=\"eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'\"\n\n\nexec 6>&1\n## ----------------------------------- ##\n## Main body of $CONFIG_STATUS script. ##\n## ----------------------------------- ##\n_ASEOF\ntest $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n# Save the log message, to keep $0 and so on meaningful, and to\n# report actual input values of CONFIG_FILES etc. instead of their\n# values after options handling.\nac_log=\"\nThis file was extended by $as_me, which was\ngenerated by GNU Autoconf 2.68.  Invocation command line was\n\n  CONFIG_FILES    = $CONFIG_FILES\n  CONFIG_HEADERS  = $CONFIG_HEADERS\n  CONFIG_LINKS    = $CONFIG_LINKS\n  CONFIG_COMMANDS = $CONFIG_COMMANDS\n  $ $0 $@\n\non `(hostname || uname -n) 2>/dev/null | sed 1q`\n\"\n\n_ACEOF\n\ncase $ac_config_files in *\"\n\"*) set x $ac_config_files; shift; ac_config_files=$*;;\nesac\n\ncase $ac_config_headers in *\"\n\"*) set x $ac_config_headers; shift; ac_config_headers=$*;;\nesac\n\n\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n# Files that config.status was made for.\nconfig_files=\"$ac_config_files\"\nconfig_headers=\"$ac_config_headers\"\nconfig_commands=\"$ac_config_commands\"\n\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nac_cs_usage=\"\\\n\\`$as_me' instantiates files and other configuration actions\nfrom templates according to the current configuration.  Unless the files\nand actions are specified as TAGs, all are instantiated by default.\n\nUsage: $0 [OPTION]... [TAG]...\n\n  -h, --help       print this help, then exit\n  -V, --version    print version number and configuration settings, then exit\n      --config     print configuration, then exit\n  -q, --quiet, --silent\n                   do not print progress messages\n  -d, --debug      don't remove temporary files\n      --recheck    update $as_me by reconfiguring in the same conditions\n      --file=FILE[:TEMPLATE]\n                   instantiate the configuration file FILE\n      --header=FILE[:TEMPLATE]\n                   instantiate the configuration header FILE\n\nConfiguration files:\n$config_files\n\nConfiguration headers:\n$config_headers\n\nConfiguration commands:\n$config_commands\n\nReport bugs to the package provider.\"\n\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\nac_cs_config=\"`$as_echo \"$ac_configure_args\" | sed 's/^ //; s/[\\\\\"\"\\`\\$]/\\\\\\\\&/g'`\"\nac_cs_version=\"\\\\\nconfig.status\nconfigured by $0, generated by GNU Autoconf 2.68,\n  with options \\\\\"\\$ac_cs_config\\\\\"\n\nCopyright (C) 2010 Free Software Foundation, Inc.\nThis config.status script is free software; the Free Software Foundation\ngives unlimited permission to copy, distribute and modify it.\"\n\nac_pwd='$ac_pwd'\nsrcdir='$srcdir'\nINSTALL='$INSTALL'\nMKDIR_P='$MKDIR_P'\nAWK='$AWK'\ntest -n \"\\$AWK\" || AWK=awk\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n# The default lists apply if the user does not specify any file.\nac_need_defaults=:\nwhile test $# != 0\ndo\n  case $1 in\n  --*=?*)\n    ac_option=`expr \"X$1\" : 'X\\([^=]*\\)='`\n    ac_optarg=`expr \"X$1\" : 'X[^=]*=\\(.*\\)'`\n    ac_shift=:\n    ;;\n  --*=)\n    ac_option=`expr \"X$1\" : 'X\\([^=]*\\)='`\n    ac_optarg=\n    ac_shift=:\n    ;;\n  *)\n    ac_option=$1\n    ac_optarg=$2\n    ac_shift=shift\n    ;;\n  esac\n\n  case $ac_option in\n  # Handling of the options.\n  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)\n    ac_cs_recheck=: ;;\n  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )\n    $as_echo \"$ac_cs_version\"; exit ;;\n  --config | --confi | --conf | --con | --co | --c )\n    $as_echo \"$ac_cs_config\"; exit ;;\n  --debug | --debu | --deb | --de | --d | -d )\n    debug=: ;;\n  --file | --fil | --fi | --f )\n    $ac_shift\n    case $ac_optarg in\n    *\\'*) ac_optarg=`$as_echo \"$ac_optarg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    '') as_fn_error $? \"missing file argument\" ;;\n    esac\n    as_fn_append CONFIG_FILES \" '$ac_optarg'\"\n    ac_need_defaults=false;;\n  --header | --heade | --head | --hea )\n    $ac_shift\n    case $ac_optarg in\n    *\\'*) ac_optarg=`$as_echo \"$ac_optarg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    esac\n    as_fn_append CONFIG_HEADERS \" '$ac_optarg'\"\n    ac_need_defaults=false;;\n  --he | --h)\n    # Conflict between --help and --header\n    as_fn_error $? \"ambiguous option: \\`$1'\nTry \\`$0 --help' for more information.\";;\n  --help | --hel | -h )\n    $as_echo \"$ac_cs_usage\"; exit ;;\n  -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n  | -silent | --silent | --silen | --sile | --sil | --si | --s)\n    ac_cs_silent=: ;;\n\n  # This is an error.\n  -*) as_fn_error $? \"unrecognized option: \\`$1'\nTry \\`$0 --help' for more information.\" ;;\n\n  *) as_fn_append ac_config_targets \" $1\"\n     ac_need_defaults=false ;;\n\n  esac\n  shift\ndone\n\nac_configure_extra_args=\n\nif $ac_cs_silent; then\n  exec 6>/dev/null\n  ac_configure_extra_args=\"$ac_configure_extra_args --silent\"\nfi\n\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\nif \\$ac_cs_recheck; then\n  set X '$SHELL' '$0' $ac_configure_args \\$ac_configure_extra_args --no-create --no-recursion\n  shift\n  \\$as_echo \"running CONFIG_SHELL=$SHELL \\$*\" >&6\n  CONFIG_SHELL='$SHELL'\n  export CONFIG_SHELL\n  exec \"\\$@\"\nfi\n\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nexec 5>>config.log\n{\n  echo\n  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX\n## Running $as_me. ##\n_ASBOX\n  $as_echo \"$ac_log\"\n} >&5\n\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n#\n# INIT-COMMANDS\n#\nAMDEP_TRUE=\"$AMDEP_TRUE\" ac_aux_dir=\"$ac_aux_dir\"\n\n\n# The HP-UX ksh and POSIX shell print the target directory to stdout\n# if CDPATH is set.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\nsed_quote_subst='$sed_quote_subst'\ndouble_quote_subst='$double_quote_subst'\ndelay_variable_subst='$delay_variable_subst'\nenable_static='`$ECHO \"$enable_static\" | $SED \"$delay_single_quote_subst\"`'\nmacro_version='`$ECHO \"$macro_version\" | $SED \"$delay_single_quote_subst\"`'\nmacro_revision='`$ECHO \"$macro_revision\" | $SED \"$delay_single_quote_subst\"`'\nenable_shared='`$ECHO \"$enable_shared\" | $SED \"$delay_single_quote_subst\"`'\npic_mode='`$ECHO \"$pic_mode\" | $SED \"$delay_single_quote_subst\"`'\nenable_fast_install='`$ECHO \"$enable_fast_install\" | $SED \"$delay_single_quote_subst\"`'\nSHELL='`$ECHO \"$SHELL\" | $SED \"$delay_single_quote_subst\"`'\nECHO='`$ECHO \"$ECHO\" | $SED \"$delay_single_quote_subst\"`'\nPATH_SEPARATOR='`$ECHO \"$PATH_SEPARATOR\" | $SED \"$delay_single_quote_subst\"`'\nhost_alias='`$ECHO \"$host_alias\" | $SED \"$delay_single_quote_subst\"`'\nhost='`$ECHO \"$host\" | $SED \"$delay_single_quote_subst\"`'\nhost_os='`$ECHO \"$host_os\" | $SED \"$delay_single_quote_subst\"`'\nbuild_alias='`$ECHO \"$build_alias\" | $SED \"$delay_single_quote_subst\"`'\nbuild='`$ECHO \"$build\" | $SED \"$delay_single_quote_subst\"`'\nbuild_os='`$ECHO \"$build_os\" | $SED \"$delay_single_quote_subst\"`'\nSED='`$ECHO \"$SED\" | $SED \"$delay_single_quote_subst\"`'\nXsed='`$ECHO \"$Xsed\" | $SED \"$delay_single_quote_subst\"`'\nGREP='`$ECHO \"$GREP\" | $SED \"$delay_single_quote_subst\"`'\nEGREP='`$ECHO \"$EGREP\" | $SED \"$delay_single_quote_subst\"`'\nFGREP='`$ECHO \"$FGREP\" | $SED \"$delay_single_quote_subst\"`'\nLD='`$ECHO \"$LD\" | $SED \"$delay_single_quote_subst\"`'\nNM='`$ECHO \"$NM\" | $SED \"$delay_single_quote_subst\"`'\nLN_S='`$ECHO \"$LN_S\" | $SED \"$delay_single_quote_subst\"`'\nmax_cmd_len='`$ECHO \"$max_cmd_len\" | $SED \"$delay_single_quote_subst\"`'\nac_objext='`$ECHO \"$ac_objext\" | $SED \"$delay_single_quote_subst\"`'\nexeext='`$ECHO \"$exeext\" | $SED \"$delay_single_quote_subst\"`'\nlt_unset='`$ECHO \"$lt_unset\" | $SED \"$delay_single_quote_subst\"`'\nlt_SP2NL='`$ECHO \"$lt_SP2NL\" | $SED \"$delay_single_quote_subst\"`'\nlt_NL2SP='`$ECHO \"$lt_NL2SP\" | $SED \"$delay_single_quote_subst\"`'\nlt_cv_to_host_file_cmd='`$ECHO \"$lt_cv_to_host_file_cmd\" | $SED \"$delay_single_quote_subst\"`'\nlt_cv_to_tool_file_cmd='`$ECHO \"$lt_cv_to_tool_file_cmd\" | $SED \"$delay_single_quote_subst\"`'\nreload_flag='`$ECHO \"$reload_flag\" | $SED \"$delay_single_quote_subst\"`'\nreload_cmds='`$ECHO \"$reload_cmds\" | $SED \"$delay_single_quote_subst\"`'\nOBJDUMP='`$ECHO \"$OBJDUMP\" | $SED \"$delay_single_quote_subst\"`'\ndeplibs_check_method='`$ECHO \"$deplibs_check_method\" | $SED \"$delay_single_quote_subst\"`'\nfile_magic_cmd='`$ECHO \"$file_magic_cmd\" | $SED \"$delay_single_quote_subst\"`'\nfile_magic_glob='`$ECHO \"$file_magic_glob\" | $SED \"$delay_single_quote_subst\"`'\nwant_nocaseglob='`$ECHO \"$want_nocaseglob\" | $SED \"$delay_single_quote_subst\"`'\nDLLTOOL='`$ECHO \"$DLLTOOL\" | $SED \"$delay_single_quote_subst\"`'\nsharedlib_from_linklib_cmd='`$ECHO \"$sharedlib_from_linklib_cmd\" | $SED \"$delay_single_quote_subst\"`'\nAR='`$ECHO \"$AR\" | $SED \"$delay_single_quote_subst\"`'\nAR_FLAGS='`$ECHO \"$AR_FLAGS\" | $SED \"$delay_single_quote_subst\"`'\narchiver_list_spec='`$ECHO \"$archiver_list_spec\" | $SED \"$delay_single_quote_subst\"`'\nSTRIP='`$ECHO \"$STRIP\" | $SED \"$delay_single_quote_subst\"`'\nRANLIB='`$ECHO \"$RANLIB\" | $SED \"$delay_single_quote_subst\"`'\nold_postinstall_cmds='`$ECHO \"$old_postinstall_cmds\" | $SED \"$delay_single_quote_subst\"`'\nold_postuninstall_cmds='`$ECHO \"$old_postuninstall_cmds\" | $SED \"$delay_single_quote_subst\"`'\nold_archive_cmds='`$ECHO \"$old_archive_cmds\" | $SED \"$delay_single_quote_subst\"`'\nlock_old_archive_extraction='`$ECHO \"$lock_old_archive_extraction\" | $SED \"$delay_single_quote_subst\"`'\nCC='`$ECHO \"$CC\" | $SED \"$delay_single_quote_subst\"`'\nCFLAGS='`$ECHO \"$CFLAGS\" | $SED \"$delay_single_quote_subst\"`'\ncompiler='`$ECHO \"$compiler\" | $SED \"$delay_single_quote_subst\"`'\nGCC='`$ECHO \"$GCC\" | $SED \"$delay_single_quote_subst\"`'\nlt_cv_sys_global_symbol_pipe='`$ECHO \"$lt_cv_sys_global_symbol_pipe\" | $SED \"$delay_single_quote_subst\"`'\nlt_cv_sys_global_symbol_to_cdecl='`$ECHO \"$lt_cv_sys_global_symbol_to_cdecl\" | $SED \"$delay_single_quote_subst\"`'\nlt_cv_sys_global_symbol_to_c_name_address='`$ECHO \"$lt_cv_sys_global_symbol_to_c_name_address\" | $SED \"$delay_single_quote_subst\"`'\nlt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO \"$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix\" | $SED \"$delay_single_quote_subst\"`'\nnm_file_list_spec='`$ECHO \"$nm_file_list_spec\" | $SED \"$delay_single_quote_subst\"`'\nlt_sysroot='`$ECHO \"$lt_sysroot\" | $SED \"$delay_single_quote_subst\"`'\nobjdir='`$ECHO \"$objdir\" | $SED \"$delay_single_quote_subst\"`'\nMAGIC_CMD='`$ECHO \"$MAGIC_CMD\" | $SED \"$delay_single_quote_subst\"`'\nlt_prog_compiler_no_builtin_flag='`$ECHO \"$lt_prog_compiler_no_builtin_flag\" | $SED \"$delay_single_quote_subst\"`'\nlt_prog_compiler_pic='`$ECHO \"$lt_prog_compiler_pic\" | $SED \"$delay_single_quote_subst\"`'\nlt_prog_compiler_wl='`$ECHO \"$lt_prog_compiler_wl\" | $SED \"$delay_single_quote_subst\"`'\nlt_prog_compiler_static='`$ECHO \"$lt_prog_compiler_static\" | $SED \"$delay_single_quote_subst\"`'\nlt_cv_prog_compiler_c_o='`$ECHO \"$lt_cv_prog_compiler_c_o\" | $SED \"$delay_single_quote_subst\"`'\nneed_locks='`$ECHO \"$need_locks\" | $SED \"$delay_single_quote_subst\"`'\nMANIFEST_TOOL='`$ECHO \"$MANIFEST_TOOL\" | $SED \"$delay_single_quote_subst\"`'\nDSYMUTIL='`$ECHO \"$DSYMUTIL\" | $SED \"$delay_single_quote_subst\"`'\nNMEDIT='`$ECHO \"$NMEDIT\" | $SED \"$delay_single_quote_subst\"`'\nLIPO='`$ECHO \"$LIPO\" | $SED \"$delay_single_quote_subst\"`'\nOTOOL='`$ECHO \"$OTOOL\" | $SED \"$delay_single_quote_subst\"`'\nOTOOL64='`$ECHO \"$OTOOL64\" | $SED \"$delay_single_quote_subst\"`'\nlibext='`$ECHO \"$libext\" | $SED \"$delay_single_quote_subst\"`'\nshrext_cmds='`$ECHO \"$shrext_cmds\" | $SED \"$delay_single_quote_subst\"`'\nextract_expsyms_cmds='`$ECHO \"$extract_expsyms_cmds\" | $SED \"$delay_single_quote_subst\"`'\narchive_cmds_need_lc='`$ECHO \"$archive_cmds_need_lc\" | $SED \"$delay_single_quote_subst\"`'\nenable_shared_with_static_runtimes='`$ECHO \"$enable_shared_with_static_runtimes\" | $SED \"$delay_single_quote_subst\"`'\nexport_dynamic_flag_spec='`$ECHO \"$export_dynamic_flag_spec\" | $SED \"$delay_single_quote_subst\"`'\nwhole_archive_flag_spec='`$ECHO \"$whole_archive_flag_spec\" | $SED \"$delay_single_quote_subst\"`'\ncompiler_needs_object='`$ECHO \"$compiler_needs_object\" | $SED \"$delay_single_quote_subst\"`'\nold_archive_from_new_cmds='`$ECHO \"$old_archive_from_new_cmds\" | $SED \"$delay_single_quote_subst\"`'\nold_archive_from_expsyms_cmds='`$ECHO \"$old_archive_from_expsyms_cmds\" | $SED \"$delay_single_quote_subst\"`'\narchive_cmds='`$ECHO \"$archive_cmds\" | $SED \"$delay_single_quote_subst\"`'\narchive_expsym_cmds='`$ECHO \"$archive_expsym_cmds\" | $SED \"$delay_single_quote_subst\"`'\nmodule_cmds='`$ECHO \"$module_cmds\" | $SED \"$delay_single_quote_subst\"`'\nmodule_expsym_cmds='`$ECHO \"$module_expsym_cmds\" | $SED \"$delay_single_quote_subst\"`'\nwith_gnu_ld='`$ECHO \"$with_gnu_ld\" | $SED \"$delay_single_quote_subst\"`'\nallow_undefined_flag='`$ECHO \"$allow_undefined_flag\" | $SED \"$delay_single_quote_subst\"`'\nno_undefined_flag='`$ECHO \"$no_undefined_flag\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_libdir_flag_spec='`$ECHO \"$hardcode_libdir_flag_spec\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_libdir_separator='`$ECHO \"$hardcode_libdir_separator\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_direct='`$ECHO \"$hardcode_direct\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_direct_absolute='`$ECHO \"$hardcode_direct_absolute\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_minus_L='`$ECHO \"$hardcode_minus_L\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_shlibpath_var='`$ECHO \"$hardcode_shlibpath_var\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_automatic='`$ECHO \"$hardcode_automatic\" | $SED \"$delay_single_quote_subst\"`'\ninherit_rpath='`$ECHO \"$inherit_rpath\" | $SED \"$delay_single_quote_subst\"`'\nlink_all_deplibs='`$ECHO \"$link_all_deplibs\" | $SED \"$delay_single_quote_subst\"`'\nalways_export_symbols='`$ECHO \"$always_export_symbols\" | $SED \"$delay_single_quote_subst\"`'\nexport_symbols_cmds='`$ECHO \"$export_symbols_cmds\" | $SED \"$delay_single_quote_subst\"`'\nexclude_expsyms='`$ECHO \"$exclude_expsyms\" | $SED \"$delay_single_quote_subst\"`'\ninclude_expsyms='`$ECHO \"$include_expsyms\" | $SED \"$delay_single_quote_subst\"`'\nprelink_cmds='`$ECHO \"$prelink_cmds\" | $SED \"$delay_single_quote_subst\"`'\npostlink_cmds='`$ECHO \"$postlink_cmds\" | $SED \"$delay_single_quote_subst\"`'\nfile_list_spec='`$ECHO \"$file_list_spec\" | $SED \"$delay_single_quote_subst\"`'\nvariables_saved_for_relink='`$ECHO \"$variables_saved_for_relink\" | $SED \"$delay_single_quote_subst\"`'\nneed_lib_prefix='`$ECHO \"$need_lib_prefix\" | $SED \"$delay_single_quote_subst\"`'\nneed_version='`$ECHO \"$need_version\" | $SED \"$delay_single_quote_subst\"`'\nversion_type='`$ECHO \"$version_type\" | $SED \"$delay_single_quote_subst\"`'\nrunpath_var='`$ECHO \"$runpath_var\" | $SED \"$delay_single_quote_subst\"`'\nshlibpath_var='`$ECHO \"$shlibpath_var\" | $SED \"$delay_single_quote_subst\"`'\nshlibpath_overrides_runpath='`$ECHO \"$shlibpath_overrides_runpath\" | $SED \"$delay_single_quote_subst\"`'\nlibname_spec='`$ECHO \"$libname_spec\" | $SED \"$delay_single_quote_subst\"`'\nlibrary_names_spec='`$ECHO \"$library_names_spec\" | $SED \"$delay_single_quote_subst\"`'\nsoname_spec='`$ECHO \"$soname_spec\" | $SED \"$delay_single_quote_subst\"`'\ninstall_override_mode='`$ECHO \"$install_override_mode\" | $SED \"$delay_single_quote_subst\"`'\npostinstall_cmds='`$ECHO \"$postinstall_cmds\" | $SED \"$delay_single_quote_subst\"`'\npostuninstall_cmds='`$ECHO \"$postuninstall_cmds\" | $SED \"$delay_single_quote_subst\"`'\nfinish_cmds='`$ECHO \"$finish_cmds\" | $SED \"$delay_single_quote_subst\"`'\nfinish_eval='`$ECHO \"$finish_eval\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_into_libs='`$ECHO \"$hardcode_into_libs\" | $SED \"$delay_single_quote_subst\"`'\nsys_lib_search_path_spec='`$ECHO \"$sys_lib_search_path_spec\" | $SED \"$delay_single_quote_subst\"`'\nsys_lib_dlsearch_path_spec='`$ECHO \"$sys_lib_dlsearch_path_spec\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_action='`$ECHO \"$hardcode_action\" | $SED \"$delay_single_quote_subst\"`'\nenable_dlopen='`$ECHO \"$enable_dlopen\" | $SED \"$delay_single_quote_subst\"`'\nenable_dlopen_self='`$ECHO \"$enable_dlopen_self\" | $SED \"$delay_single_quote_subst\"`'\nenable_dlopen_self_static='`$ECHO \"$enable_dlopen_self_static\" | $SED \"$delay_single_quote_subst\"`'\nold_striplib='`$ECHO \"$old_striplib\" | $SED \"$delay_single_quote_subst\"`'\nstriplib='`$ECHO \"$striplib\" | $SED \"$delay_single_quote_subst\"`'\ncompiler_lib_search_dirs='`$ECHO \"$compiler_lib_search_dirs\" | $SED \"$delay_single_quote_subst\"`'\npredep_objects='`$ECHO \"$predep_objects\" | $SED \"$delay_single_quote_subst\"`'\npostdep_objects='`$ECHO \"$postdep_objects\" | $SED \"$delay_single_quote_subst\"`'\npredeps='`$ECHO \"$predeps\" | $SED \"$delay_single_quote_subst\"`'\npostdeps='`$ECHO \"$postdeps\" | $SED \"$delay_single_quote_subst\"`'\ncompiler_lib_search_path='`$ECHO \"$compiler_lib_search_path\" | $SED \"$delay_single_quote_subst\"`'\nLD_CXX='`$ECHO \"$LD_CXX\" | $SED \"$delay_single_quote_subst\"`'\nreload_flag_CXX='`$ECHO \"$reload_flag_CXX\" | $SED \"$delay_single_quote_subst\"`'\nreload_cmds_CXX='`$ECHO \"$reload_cmds_CXX\" | $SED \"$delay_single_quote_subst\"`'\nold_archive_cmds_CXX='`$ECHO \"$old_archive_cmds_CXX\" | $SED \"$delay_single_quote_subst\"`'\ncompiler_CXX='`$ECHO \"$compiler_CXX\" | $SED \"$delay_single_quote_subst\"`'\nGCC_CXX='`$ECHO \"$GCC_CXX\" | $SED \"$delay_single_quote_subst\"`'\nlt_prog_compiler_no_builtin_flag_CXX='`$ECHO \"$lt_prog_compiler_no_builtin_flag_CXX\" | $SED \"$delay_single_quote_subst\"`'\nlt_prog_compiler_pic_CXX='`$ECHO \"$lt_prog_compiler_pic_CXX\" | $SED \"$delay_single_quote_subst\"`'\nlt_prog_compiler_wl_CXX='`$ECHO \"$lt_prog_compiler_wl_CXX\" | $SED \"$delay_single_quote_subst\"`'\nlt_prog_compiler_static_CXX='`$ECHO \"$lt_prog_compiler_static_CXX\" | $SED \"$delay_single_quote_subst\"`'\nlt_cv_prog_compiler_c_o_CXX='`$ECHO \"$lt_cv_prog_compiler_c_o_CXX\" | $SED \"$delay_single_quote_subst\"`'\narchive_cmds_need_lc_CXX='`$ECHO \"$archive_cmds_need_lc_CXX\" | $SED \"$delay_single_quote_subst\"`'\nenable_shared_with_static_runtimes_CXX='`$ECHO \"$enable_shared_with_static_runtimes_CXX\" | $SED \"$delay_single_quote_subst\"`'\nexport_dynamic_flag_spec_CXX='`$ECHO \"$export_dynamic_flag_spec_CXX\" | $SED \"$delay_single_quote_subst\"`'\nwhole_archive_flag_spec_CXX='`$ECHO \"$whole_archive_flag_spec_CXX\" | $SED \"$delay_single_quote_subst\"`'\ncompiler_needs_object_CXX='`$ECHO \"$compiler_needs_object_CXX\" | $SED \"$delay_single_quote_subst\"`'\nold_archive_from_new_cmds_CXX='`$ECHO \"$old_archive_from_new_cmds_CXX\" | $SED \"$delay_single_quote_subst\"`'\nold_archive_from_expsyms_cmds_CXX='`$ECHO \"$old_archive_from_expsyms_cmds_CXX\" | $SED \"$delay_single_quote_subst\"`'\narchive_cmds_CXX='`$ECHO \"$archive_cmds_CXX\" | $SED \"$delay_single_quote_subst\"`'\narchive_expsym_cmds_CXX='`$ECHO \"$archive_expsym_cmds_CXX\" | $SED \"$delay_single_quote_subst\"`'\nmodule_cmds_CXX='`$ECHO \"$module_cmds_CXX\" | $SED \"$delay_single_quote_subst\"`'\nmodule_expsym_cmds_CXX='`$ECHO \"$module_expsym_cmds_CXX\" | $SED \"$delay_single_quote_subst\"`'\nwith_gnu_ld_CXX='`$ECHO \"$with_gnu_ld_CXX\" | $SED \"$delay_single_quote_subst\"`'\nallow_undefined_flag_CXX='`$ECHO \"$allow_undefined_flag_CXX\" | $SED \"$delay_single_quote_subst\"`'\nno_undefined_flag_CXX='`$ECHO \"$no_undefined_flag_CXX\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_libdir_flag_spec_CXX='`$ECHO \"$hardcode_libdir_flag_spec_CXX\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_libdir_separator_CXX='`$ECHO \"$hardcode_libdir_separator_CXX\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_direct_CXX='`$ECHO \"$hardcode_direct_CXX\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_direct_absolute_CXX='`$ECHO \"$hardcode_direct_absolute_CXX\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_minus_L_CXX='`$ECHO \"$hardcode_minus_L_CXX\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_shlibpath_var_CXX='`$ECHO \"$hardcode_shlibpath_var_CXX\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_automatic_CXX='`$ECHO \"$hardcode_automatic_CXX\" | $SED \"$delay_single_quote_subst\"`'\ninherit_rpath_CXX='`$ECHO \"$inherit_rpath_CXX\" | $SED \"$delay_single_quote_subst\"`'\nlink_all_deplibs_CXX='`$ECHO \"$link_all_deplibs_CXX\" | $SED \"$delay_single_quote_subst\"`'\nalways_export_symbols_CXX='`$ECHO \"$always_export_symbols_CXX\" | $SED \"$delay_single_quote_subst\"`'\nexport_symbols_cmds_CXX='`$ECHO \"$export_symbols_cmds_CXX\" | $SED \"$delay_single_quote_subst\"`'\nexclude_expsyms_CXX='`$ECHO \"$exclude_expsyms_CXX\" | $SED \"$delay_single_quote_subst\"`'\ninclude_expsyms_CXX='`$ECHO \"$include_expsyms_CXX\" | $SED \"$delay_single_quote_subst\"`'\nprelink_cmds_CXX='`$ECHO \"$prelink_cmds_CXX\" | $SED \"$delay_single_quote_subst\"`'\npostlink_cmds_CXX='`$ECHO \"$postlink_cmds_CXX\" | $SED \"$delay_single_quote_subst\"`'\nfile_list_spec_CXX='`$ECHO \"$file_list_spec_CXX\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_action_CXX='`$ECHO \"$hardcode_action_CXX\" | $SED \"$delay_single_quote_subst\"`'\ncompiler_lib_search_dirs_CXX='`$ECHO \"$compiler_lib_search_dirs_CXX\" | $SED \"$delay_single_quote_subst\"`'\npredep_objects_CXX='`$ECHO \"$predep_objects_CXX\" | $SED \"$delay_single_quote_subst\"`'\npostdep_objects_CXX='`$ECHO \"$postdep_objects_CXX\" | $SED \"$delay_single_quote_subst\"`'\npredeps_CXX='`$ECHO \"$predeps_CXX\" | $SED \"$delay_single_quote_subst\"`'\npostdeps_CXX='`$ECHO \"$postdeps_CXX\" | $SED \"$delay_single_quote_subst\"`'\ncompiler_lib_search_path_CXX='`$ECHO \"$compiler_lib_search_path_CXX\" | $SED \"$delay_single_quote_subst\"`'\n\nLTCC='$LTCC'\nLTCFLAGS='$LTCFLAGS'\ncompiler='$compiler_DEFAULT'\n\n# A function that is used when there is no print builtin or printf.\nfunc_fallback_echo ()\n{\n  eval 'cat <<_LTECHO_EOF\n\\$1\n_LTECHO_EOF'\n}\n\n# Quote evaled strings.\nfor var in SHELL \\\nECHO \\\nPATH_SEPARATOR \\\nSED \\\nGREP \\\nEGREP \\\nFGREP \\\nLD \\\nNM \\\nLN_S \\\nlt_SP2NL \\\nlt_NL2SP \\\nreload_flag \\\nOBJDUMP \\\ndeplibs_check_method \\\nfile_magic_cmd \\\nfile_magic_glob \\\nwant_nocaseglob \\\nDLLTOOL \\\nsharedlib_from_linklib_cmd \\\nAR \\\nAR_FLAGS \\\narchiver_list_spec \\\nSTRIP \\\nRANLIB \\\nCC \\\nCFLAGS \\\ncompiler \\\nlt_cv_sys_global_symbol_pipe \\\nlt_cv_sys_global_symbol_to_cdecl \\\nlt_cv_sys_global_symbol_to_c_name_address \\\nlt_cv_sys_global_symbol_to_c_name_address_lib_prefix \\\nnm_file_list_spec \\\nlt_prog_compiler_no_builtin_flag \\\nlt_prog_compiler_pic \\\nlt_prog_compiler_wl \\\nlt_prog_compiler_static \\\nlt_cv_prog_compiler_c_o \\\nneed_locks \\\nMANIFEST_TOOL \\\nDSYMUTIL \\\nNMEDIT \\\nLIPO \\\nOTOOL \\\nOTOOL64 \\\nshrext_cmds \\\nexport_dynamic_flag_spec \\\nwhole_archive_flag_spec \\\ncompiler_needs_object \\\nwith_gnu_ld \\\nallow_undefined_flag \\\nno_undefined_flag \\\nhardcode_libdir_flag_spec \\\nhardcode_libdir_separator \\\nexclude_expsyms \\\ninclude_expsyms \\\nfile_list_spec \\\nvariables_saved_for_relink \\\nlibname_spec \\\nlibrary_names_spec \\\nsoname_spec \\\ninstall_override_mode \\\nfinish_eval \\\nold_striplib \\\nstriplib \\\ncompiler_lib_search_dirs \\\npredep_objects \\\npostdep_objects \\\npredeps \\\npostdeps \\\ncompiler_lib_search_path \\\nLD_CXX \\\nreload_flag_CXX \\\ncompiler_CXX \\\nlt_prog_compiler_no_builtin_flag_CXX \\\nlt_prog_compiler_pic_CXX \\\nlt_prog_compiler_wl_CXX \\\nlt_prog_compiler_static_CXX \\\nlt_cv_prog_compiler_c_o_CXX \\\nexport_dynamic_flag_spec_CXX \\\nwhole_archive_flag_spec_CXX \\\ncompiler_needs_object_CXX \\\nwith_gnu_ld_CXX \\\nallow_undefined_flag_CXX \\\nno_undefined_flag_CXX \\\nhardcode_libdir_flag_spec_CXX \\\nhardcode_libdir_separator_CXX \\\nexclude_expsyms_CXX \\\ninclude_expsyms_CXX \\\nfile_list_spec_CXX \\\ncompiler_lib_search_dirs_CXX \\\npredep_objects_CXX \\\npostdep_objects_CXX \\\npredeps_CXX \\\npostdeps_CXX \\\ncompiler_lib_search_path_CXX; do\n    case \\`eval \\\\\\\\\\$ECHO \\\\\\\\\"\"\\\\\\\\\\$\\$var\"\\\\\\\\\"\\` in\n    *[\\\\\\\\\\\\\\`\\\\\"\\\\\\$]*)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\`\\\\\\$ECHO \\\\\"\\\\\\$\\$var\\\\\" | \\\\\\$SED \\\\\"\\\\\\$sed_quote_subst\\\\\"\\\\\\`\\\\\\\\\\\\\"\"\n      ;;\n    *)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\$\\$var\\\\\\\\\\\\\"\"\n      ;;\n    esac\ndone\n\n# Double-quote double-evaled strings.\nfor var in reload_cmds \\\nold_postinstall_cmds \\\nold_postuninstall_cmds \\\nold_archive_cmds \\\nextract_expsyms_cmds \\\nold_archive_from_new_cmds \\\nold_archive_from_expsyms_cmds \\\narchive_cmds \\\narchive_expsym_cmds \\\nmodule_cmds \\\nmodule_expsym_cmds \\\nexport_symbols_cmds \\\nprelink_cmds \\\npostlink_cmds \\\npostinstall_cmds \\\npostuninstall_cmds \\\nfinish_cmds \\\nsys_lib_search_path_spec \\\nsys_lib_dlsearch_path_spec \\\nreload_cmds_CXX \\\nold_archive_cmds_CXX \\\nold_archive_from_new_cmds_CXX \\\nold_archive_from_expsyms_cmds_CXX \\\narchive_cmds_CXX \\\narchive_expsym_cmds_CXX \\\nmodule_cmds_CXX \\\nmodule_expsym_cmds_CXX \\\nexport_symbols_cmds_CXX \\\nprelink_cmds_CXX \\\npostlink_cmds_CXX; do\n    case \\`eval \\\\\\\\\\$ECHO \\\\\\\\\"\"\\\\\\\\\\$\\$var\"\\\\\\\\\"\\` in\n    *[\\\\\\\\\\\\\\`\\\\\"\\\\\\$]*)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\`\\\\\\$ECHO \\\\\"\\\\\\$\\$var\\\\\" | \\\\\\$SED -e \\\\\"\\\\\\$double_quote_subst\\\\\" -e \\\\\"\\\\\\$sed_quote_subst\\\\\" -e \\\\\"\\\\\\$delay_variable_subst\\\\\"\\\\\\`\\\\\\\\\\\\\"\"\n      ;;\n    *)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\$\\$var\\\\\\\\\\\\\"\"\n      ;;\n    esac\ndone\n\nac_aux_dir='$ac_aux_dir'\nxsi_shell='$xsi_shell'\nlt_shell_append='$lt_shell_append'\n\n# See if we are running on zsh, and set the options which allow our\n# commands through without removal of \\ escapes INIT.\nif test -n \"\\${ZSH_VERSION+set}\" ; then\n   setopt NO_GLOB_SUBST\nfi\n\n\n    PACKAGE='$PACKAGE'\n    VERSION='$VERSION'\n    TIMESTAMP='$TIMESTAMP'\n    RM='$RM'\n    ofile='$ofile'\n\n\n\n\n\n\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n\n# Handling of arguments.\nfor ac_config_target in $ac_config_targets\ndo\n  case $ac_config_target in\n    \"config.h\") CONFIG_HEADERS=\"$CONFIG_HEADERS config.h\" ;;\n    \"depfiles\") CONFIG_COMMANDS=\"$CONFIG_COMMANDS depfiles\" ;;\n    \"libtool\") CONFIG_COMMANDS=\"$CONFIG_COMMANDS libtool\" ;;\n    \"Makefile\") CONFIG_FILES=\"$CONFIG_FILES Makefile\" ;;\n    \"tests/Makefile\") CONFIG_FILES=\"$CONFIG_FILES tests/Makefile\" ;;\n    \"include/Makefile\") CONFIG_FILES=\"$CONFIG_FILES include/Makefile\" ;;\n    \"gmm-config\") CONFIG_FILES=\"$CONFIG_FILES gmm-config\" ;;\n\n  *) as_fn_error $? \"invalid argument: \\`$ac_config_target'\" \"$LINENO\" 5;;\n  esac\ndone\n\n\n# If the user did not use the arguments to specify the items to instantiate,\n# then the envvar interface is used.  Set only those that are not.\n# We use the long form for the default assignment because of an extremely\n# bizarre bug on SunOS 4.1.3.\nif $ac_need_defaults; then\n  test \"${CONFIG_FILES+set}\" = set || CONFIG_FILES=$config_files\n  test \"${CONFIG_HEADERS+set}\" = set || CONFIG_HEADERS=$config_headers\n  test \"${CONFIG_COMMANDS+set}\" = set || CONFIG_COMMANDS=$config_commands\nfi\n\n# Have a temporary directory for convenience.  Make it in the build tree\n# simply because there is no reason against having it here, and in addition,\n# creating and moving files from /tmp can sometimes cause problems.\n# Hook for its removal unless debugging.\n# Note that there is a small window in which the directory will not be cleaned:\n# after its creation but before its name has been assigned to `$tmp'.\n$debug ||\n{\n  tmp= ac_tmp=\n  trap 'exit_status=$?\n  : \"${ac_tmp:=$tmp}\"\n  { test ! -d \"$ac_tmp\" || rm -fr \"$ac_tmp\"; } && exit $exit_status\n' 0\n  trap 'as_fn_exit 1' 1 2 13 15\n}\n# Create a (secure) tmp directory for tmp files.\n\n{\n  tmp=`(umask 077 && mktemp -d \"./confXXXXXX\") 2>/dev/null` &&\n  test -d \"$tmp\"\n}  ||\n{\n  tmp=./conf$$-$RANDOM\n  (umask 077 && mkdir \"$tmp\")\n} || as_fn_error $? \"cannot create a temporary directory in .\" \"$LINENO\" 5\nac_tmp=$tmp\n\n# Set up the scripts for CONFIG_FILES section.\n# No need to generate them if there are no CONFIG_FILES.\n# This happens for instance with `./config.status config.h'.\nif test -n \"$CONFIG_FILES\"; then\n\n\nac_cr=`echo X | tr X '\\015'`\n# On cygwin, bash can eat \\r inside `` if the user requested igncr.\n# But we know of no other shell where ac_cr would be empty at this\n# point, so we can use a bashism as a fallback.\nif test \"x$ac_cr\" = x; then\n  eval ac_cr=\\$\\'\\\\r\\'\nfi\nac_cs_awk_cr=`$AWK 'BEGIN { print \"a\\rb\" }' </dev/null 2>/dev/null`\nif test \"$ac_cs_awk_cr\" = \"a${ac_cr}b\"; then\n  ac_cs_awk_cr='\\\\r'\nelse\n  ac_cs_awk_cr=$ac_cr\nfi\n\necho 'BEGIN {' >\"$ac_tmp/subs1.awk\" &&\n_ACEOF\n\n\n{\n  echo \"cat >conf$$subs.awk <<_ACEOF\" &&\n  echo \"$ac_subst_vars\" | sed 's/.*/&!$&$ac_delim/' &&\n  echo \"_ACEOF\"\n} >conf$$subs.sh ||\n  as_fn_error $? \"could not make $CONFIG_STATUS\" \"$LINENO\" 5\nac_delim_num=`echo \"$ac_subst_vars\" | grep -c '^'`\nac_delim='%!_!# '\nfor ac_last_try in false false false false false :; do\n  . ./conf$$subs.sh ||\n    as_fn_error $? \"could not make $CONFIG_STATUS\" \"$LINENO\" 5\n\n  ac_delim_n=`sed -n \"s/.*$ac_delim\\$/X/p\" conf$$subs.awk | grep -c X`\n  if test $ac_delim_n = $ac_delim_num; then\n    break\n  elif $ac_last_try; then\n    as_fn_error $? \"could not make $CONFIG_STATUS\" \"$LINENO\" 5\n  else\n    ac_delim=\"$ac_delim!$ac_delim _$ac_delim!! \"\n  fi\ndone\nrm -f conf$$subs.sh\n\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\ncat >>\"\\$ac_tmp/subs1.awk\" <<\\\\_ACAWK &&\n_ACEOF\nsed -n '\nh\ns/^/S[\"/; s/!.*/\"]=/\np\ng\ns/^[^!]*!//\n:repl\nt repl\ns/'\"$ac_delim\"'$//\nt delim\n:nl\nh\ns/\\(.\\{148\\}\\)..*/\\1/\nt more1\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\\\\n\"\\\\/\np\nn\nb repl\n:more1\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"\\\\/\np\ng\ns/.\\{148\\}//\nt nl\n:delim\nh\ns/\\(.\\{148\\}\\)..*/\\1/\nt more2\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"/\np\nb\n:more2\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"\\\\/\np\ng\ns/.\\{148\\}//\nt delim\n' <conf$$subs.awk | sed '\n/^[^\"\"]/{\n  N\n  s/\\n//\n}\n' >>$CONFIG_STATUS || ac_write_fail=1\nrm -f conf$$subs.awk\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n_ACAWK\ncat >>\"\\$ac_tmp/subs1.awk\" <<_ACAWK &&\n  for (key in S) S_is_set[key] = 1\n  FS = \"\u0007\"\n\n}\n{\n  line = $ 0\n  nfields = split(line, field, \"@\")\n  substed = 0\n  len = length(field[1])\n  for (i = 2; i < nfields; i++) {\n    key = field[i]\n    keylen = length(key)\n    if (S_is_set[key]) {\n      value = S[key]\n      line = substr(line, 1, len) \"\" value \"\" substr(line, len + keylen + 3)\n      len += length(value) + length(field[++i])\n      substed = 1\n    } else\n      len += 1 + keylen\n  }\n\n  print line\n}\n\n_ACAWK\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nif sed \"s/$ac_cr//\" < /dev/null > /dev/null 2>&1; then\n  sed \"s/$ac_cr\\$//; s/$ac_cr/$ac_cs_awk_cr/g\"\nelse\n  cat\nfi < \"$ac_tmp/subs1.awk\" > \"$ac_tmp/subs.awk\" \\\n  || as_fn_error $? \"could not setup config files machinery\" \"$LINENO\" 5\n_ACEOF\n\n# VPATH may cause trouble with some makes, so we remove sole $(srcdir),\n# ${srcdir} and @srcdir@ entries from VPATH if srcdir is \".\", strip leading and\n# trailing colons and then remove the whole line if VPATH becomes empty\n# (actually we leave an empty line to preserve line numbers).\nif test \"x$srcdir\" = x.; then\n  ac_vpsub='/^[\t ]*VPATH[\t ]*=[\t ]*/{\nh\ns///\ns/^/:/\ns/[\t ]*$/:/\ns/:\\$(srcdir):/:/g\ns/:\\${srcdir}:/:/g\ns/:@srcdir@:/:/g\ns/^:*//\ns/:*$//\nx\ns/\\(=[\t ]*\\).*/\\1/\nG\ns/\\n//\ns/^[^=]*=[\t ]*$//\n}'\nfi\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nfi # test -n \"$CONFIG_FILES\"\n\n# Set up the scripts for CONFIG_HEADERS section.\n# No need to generate them if there are no CONFIG_HEADERS.\n# This happens for instance with `./config.status Makefile'.\nif test -n \"$CONFIG_HEADERS\"; then\ncat >\"$ac_tmp/defines.awk\" <<\\_ACAWK ||\nBEGIN {\n_ACEOF\n\n# Transform confdefs.h into an awk script `defines.awk', embedded as\n# here-document in config.status, that substitutes the proper values into\n# config.h.in to produce config.h.\n\n# Create a delimiter string that does not exist in confdefs.h, to ease\n# handling of long lines.\nac_delim='%!_!# '\nfor ac_last_try in false false :; do\n  ac_tt=`sed -n \"/$ac_delim/p\" confdefs.h`\n  if test -z \"$ac_tt\"; then\n    break\n  elif $ac_last_try; then\n    as_fn_error $? \"could not make $CONFIG_HEADERS\" \"$LINENO\" 5\n  else\n    ac_delim=\"$ac_delim!$ac_delim _$ac_delim!! \"\n  fi\ndone\n\n# For the awk script, D is an array of macro values keyed by name,\n# likewise P contains macro parameters if any.  Preserve backslash\n# newline sequences.\n\nac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*\nsed -n '\ns/.\\{148\\}/&'\"$ac_delim\"'/g\nt rset\n:rset\ns/^[\t ]*#[\t ]*define[\t ][\t ]*/ /\nt def\nd\n:def\ns/\\\\$//\nt bsnl\ns/[\"\\\\]/\\\\&/g\ns/^ \\('\"$ac_word_re\"'\\)\\(([^()]*)\\)[\t ]*\\(.*\\)/P[\"\\1\"]=\"\\2\"\\\nD[\"\\1\"]=\" \\3\"/p\ns/^ \\('\"$ac_word_re\"'\\)[\t ]*\\(.*\\)/D[\"\\1\"]=\" \\2\"/p\nd\n:bsnl\ns/[\"\\\\]/\\\\&/g\ns/^ \\('\"$ac_word_re\"'\\)\\(([^()]*)\\)[\t ]*\\(.*\\)/P[\"\\1\"]=\"\\2\"\\\nD[\"\\1\"]=\" \\3\\\\\\\\\\\\n\"\\\\/p\nt cont\ns/^ \\('\"$ac_word_re\"'\\)[\t ]*\\(.*\\)/D[\"\\1\"]=\" \\2\\\\\\\\\\\\n\"\\\\/p\nt cont\nd\n:cont\nn\ns/.\\{148\\}/&'\"$ac_delim\"'/g\nt clear\n:clear\ns/\\\\$//\nt bsnlc\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"/p\nd\n:bsnlc\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\\\\\\\\\\\\n\"\\\\/p\nb cont\n' <confdefs.h | sed '\ns/'\"$ac_delim\"'/\"\\\\\\\n\"/g' >>$CONFIG_STATUS || ac_write_fail=1\n\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n  for (key in D) D_is_set[key] = 1\n  FS = \"\u0007\"\n}\n/^[\\t ]*#[\\t ]*(define|undef)[\\t ]+$ac_word_re([\\t (]|\\$)/ {\n  line = \\$ 0\n  split(line, arg, \" \")\n  if (arg[1] == \"#\") {\n    defundef = arg[2]\n    mac1 = arg[3]\n  } else {\n    defundef = substr(arg[1], 2)\n    mac1 = arg[2]\n  }\n  split(mac1, mac2, \"(\") #)\n  macro = mac2[1]\n  prefix = substr(line, 1, index(line, defundef) - 1)\n  if (D_is_set[macro]) {\n    # Preserve the white space surrounding the \"#\".\n    print prefix \"define\", macro P[macro] D[macro]\n    next\n  } else {\n    # Replace #undef with comments.  This is necessary, for example,\n    # in the case of _POSIX_SOURCE, which is predefined and required\n    # on some systems where configure will not decide to define it.\n    if (defundef == \"undef\") {\n      print \"/*\", prefix defundef, macro, \"*/\"\n      next\n    }\n  }\n}\n{ print }\n_ACAWK\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n  as_fn_error $? \"could not setup config headers machinery\" \"$LINENO\" 5\nfi # test -n \"$CONFIG_HEADERS\"\n\n\neval set X \"  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS\"\nshift\nfor ac_tag\ndo\n  case $ac_tag in\n  :[FHLC]) ac_mode=$ac_tag; continue;;\n  esac\n  case $ac_mode$ac_tag in\n  :[FHL]*:*);;\n  :L* | :C*:*) as_fn_error $? \"invalid tag \\`$ac_tag'\" \"$LINENO\" 5;;\n  :[FH]-) ac_tag=-:-;;\n  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;\n  esac\n  ac_save_IFS=$IFS\n  IFS=:\n  set x $ac_tag\n  IFS=$ac_save_IFS\n  shift\n  ac_file=$1\n  shift\n\n  case $ac_mode in\n  :L) ac_source=$1;;\n  :[FH])\n    ac_file_inputs=\n    for ac_f\n    do\n      case $ac_f in\n      -) ac_f=\"$ac_tmp/stdin\";;\n      *) # Look for the file first in the build tree, then in the source tree\n\t # (if the path is not absolute).  The absolute path cannot be DOS-style,\n\t # because $ac_f cannot contain `:'.\n\t test -f \"$ac_f\" ||\n\t   case $ac_f in\n\t   [\\\\/$]*) false;;\n\t   *) test -f \"$srcdir/$ac_f\" && ac_f=\"$srcdir/$ac_f\";;\n\t   esac ||\n\t   as_fn_error 1 \"cannot find input file: \\`$ac_f'\" \"$LINENO\" 5;;\n      esac\n      case $ac_f in *\\'*) ac_f=`$as_echo \"$ac_f\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;; esac\n      as_fn_append ac_file_inputs \" '$ac_f'\"\n    done\n\n    # Let's still pretend it is `configure' which instantiates (i.e., don't\n    # use $as_me), people would be surprised to read:\n    #    /* config.h.  Generated by config.status.  */\n    configure_input='Generated from '`\n\t  $as_echo \"$*\" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'\n\t`' by configure.'\n    if test x\"$ac_file\" != x-; then\n      configure_input=\"$ac_file.  $configure_input\"\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: creating $ac_file\" >&5\n$as_echo \"$as_me: creating $ac_file\" >&6;}\n    fi\n    # Neutralize special characters interpreted by sed in replacement strings.\n    case $configure_input in #(\n    *\\&* | *\\|* | *\\\\* )\n       ac_sed_conf_input=`$as_echo \"$configure_input\" |\n       sed 's/[\\\\\\\\&|]/\\\\\\\\&/g'`;; #(\n    *) ac_sed_conf_input=$configure_input;;\n    esac\n\n    case $ac_tag in\n    *:-:* | *:-) cat >\"$ac_tmp/stdin\" \\\n      || as_fn_error $? \"could not create $ac_file\" \"$LINENO\" 5 ;;\n    esac\n    ;;\n  esac\n\n  ac_dir=`$as_dirname -- \"$ac_file\" ||\n$as_expr X\"$ac_file\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$ac_file\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$ac_file\" : 'X\\(//\\)$' \\| \\\n\t X\"$ac_file\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$ac_file\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n  as_dir=\"$ac_dir\"; as_fn_mkdir_p\n  ac_builddir=.\n\ncase \"$ac_dir\" in\n.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;\n*)\n  ac_dir_suffix=/`$as_echo \"$ac_dir\" | sed 's|^\\.[\\\\/]||'`\n  # A \"..\" for each directory in $ac_dir_suffix.\n  ac_top_builddir_sub=`$as_echo \"$ac_dir_suffix\" | sed 's|/[^\\\\/]*|/..|g;s|/||'`\n  case $ac_top_builddir_sub in\n  \"\") ac_top_builddir_sub=. ac_top_build_prefix= ;;\n  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;\n  esac ;;\nesac\nac_abs_top_builddir=$ac_pwd\nac_abs_builddir=$ac_pwd$ac_dir_suffix\n# for backward compatibility:\nac_top_builddir=$ac_top_build_prefix\n\ncase $srcdir in\n  .)  # We are building in place.\n    ac_srcdir=.\n    ac_top_srcdir=$ac_top_builddir_sub\n    ac_abs_top_srcdir=$ac_pwd ;;\n  [\\\\/]* | ?:[\\\\/]* )  # Absolute name.\n    ac_srcdir=$srcdir$ac_dir_suffix;\n    ac_top_srcdir=$srcdir\n    ac_abs_top_srcdir=$srcdir ;;\n  *) # Relative name.\n    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix\n    ac_top_srcdir=$ac_top_build_prefix$srcdir\n    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;\nesac\nac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix\n\n\n  case $ac_mode in\n  :F)\n  #\n  # CONFIG_FILE\n  #\n\n  case $INSTALL in\n  [\\\\/$]* | ?:[\\\\/]* ) ac_INSTALL=$INSTALL ;;\n  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;\n  esac\n  ac_MKDIR_P=$MKDIR_P\n  case $MKDIR_P in\n  [\\\\/$]* | ?:[\\\\/]* ) ;;\n  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;\n  esac\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n# If the template does not know about datarootdir, expand it.\n# FIXME: This hack should be removed a few years after 2.60.\nac_datarootdir_hack=; ac_datarootdir_seen=\nac_sed_dataroot='\n/datarootdir/ {\n  p\n  q\n}\n/@datadir@/p\n/@docdir@/p\n/@infodir@/p\n/@localedir@/p\n/@mandir@/p'\ncase `eval \"sed -n \\\"\\$ac_sed_dataroot\\\" $ac_file_inputs\"` in\n*datarootdir*) ac_datarootdir_seen=yes;;\n*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting\" >&5\n$as_echo \"$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting\" >&2;}\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n  ac_datarootdir_hack='\n  s&@datadir@&$datadir&g\n  s&@docdir@&$docdir&g\n  s&@infodir@&$infodir&g\n  s&@localedir@&$localedir&g\n  s&@mandir@&$mandir&g\n  s&\\\\\\${datarootdir}&$datarootdir&g' ;;\nesac\n_ACEOF\n\n# Neutralize VPATH when `$srcdir' = `.'.\n# Shell code in configure.ac might set extrasub.\n# FIXME: do we really want to maintain this feature?\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\nac_sed_extra=\"$ac_vpsub\n$extrasub\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n:t\n/@[a-zA-Z_][a-zA-Z_0-9]*@/!b\ns|@configure_input@|$ac_sed_conf_input|;t t\ns&@top_builddir@&$ac_top_builddir_sub&;t t\ns&@top_build_prefix@&$ac_top_build_prefix&;t t\ns&@srcdir@&$ac_srcdir&;t t\ns&@abs_srcdir@&$ac_abs_srcdir&;t t\ns&@top_srcdir@&$ac_top_srcdir&;t t\ns&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t\ns&@builddir@&$ac_builddir&;t t\ns&@abs_builddir@&$ac_abs_builddir&;t t\ns&@abs_top_builddir@&$ac_abs_top_builddir&;t t\ns&@INSTALL@&$ac_INSTALL&;t t\ns&@MKDIR_P@&$ac_MKDIR_P&;t t\n$ac_datarootdir_hack\n\"\neval sed \\\"\\$ac_sed_extra\\\" \"$ac_file_inputs\" | $AWK -f \"$ac_tmp/subs.awk\" \\\n  >$ac_tmp/out || as_fn_error $? \"could not create $ac_file\" \"$LINENO\" 5\n\ntest -z \"$ac_datarootdir_hack$ac_datarootdir_seen\" &&\n  { ac_out=`sed -n '/\\${datarootdir}/p' \"$ac_tmp/out\"`; test -n \"$ac_out\"; } &&\n  { ac_out=`sed -n '/^[\t ]*datarootdir[\t ]*:*=/p' \\\n      \"$ac_tmp/out\"`; test -z \"$ac_out\"; } &&\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \\`datarootdir'\nwhich seems to be undefined.  Please make sure it is defined\" >&5\n$as_echo \"$as_me: WARNING: $ac_file contains a reference to the variable \\`datarootdir'\nwhich seems to be undefined.  Please make sure it is defined\" >&2;}\n\n  rm -f \"$ac_tmp/stdin\"\n  case $ac_file in\n  -) cat \"$ac_tmp/out\" && rm -f \"$ac_tmp/out\";;\n  *) rm -f \"$ac_file\" && mv \"$ac_tmp/out\" \"$ac_file\";;\n  esac \\\n  || as_fn_error $? \"could not create $ac_file\" \"$LINENO\" 5\n ;;\n  :H)\n  #\n  # CONFIG_HEADER\n  #\n  if test x\"$ac_file\" != x-; then\n    {\n      $as_echo \"/* $configure_input  */\" \\\n      && eval '$AWK -f \"$ac_tmp/defines.awk\"' \"$ac_file_inputs\"\n    } >\"$ac_tmp/config.h\" \\\n      || as_fn_error $? \"could not create $ac_file\" \"$LINENO\" 5\n    if diff \"$ac_file\" \"$ac_tmp/config.h\" >/dev/null 2>&1; then\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: $ac_file is unchanged\" >&5\n$as_echo \"$as_me: $ac_file is unchanged\" >&6;}\n    else\n      rm -f \"$ac_file\"\n      mv \"$ac_tmp/config.h\" \"$ac_file\" \\\n\t|| as_fn_error $? \"could not create $ac_file\" \"$LINENO\" 5\n    fi\n  else\n    $as_echo \"/* $configure_input  */\" \\\n      && eval '$AWK -f \"$ac_tmp/defines.awk\"' \"$ac_file_inputs\" \\\n      || as_fn_error $? \"could not create -\" \"$LINENO\" 5\n  fi\n# Compute \"$ac_file\"'s index in $config_headers.\n_am_arg=\"$ac_file\"\n_am_stamp_count=1\nfor _am_header in $config_headers :; do\n  case $_am_header in\n    $_am_arg | $_am_arg:* )\n      break ;;\n    * )\n      _am_stamp_count=`expr $_am_stamp_count + 1` ;;\n  esac\ndone\necho \"timestamp for $_am_arg\" >`$as_dirname -- \"$_am_arg\" ||\n$as_expr X\"$_am_arg\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$_am_arg\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$_am_arg\" : 'X\\(//\\)$' \\| \\\n\t X\"$_am_arg\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$_am_arg\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`/stamp-h$_am_stamp_count\n ;;\n\n  :C)  { $as_echo \"$as_me:${as_lineno-$LINENO}: executing $ac_file commands\" >&5\n$as_echo \"$as_me: executing $ac_file commands\" >&6;}\n ;;\n  esac\n\n\n  case $ac_file$ac_mode in\n    \"depfiles\":C) test x\"$AMDEP_TRUE\" != x\"\" || {\n  # Autoconf 2.62 quotes --file arguments for eval, but not when files\n  # are listed without --file.  Let's play safe and only enable the eval\n  # if we detect the quoting.\n  case $CONFIG_FILES in\n  *\\'*) eval set x \"$CONFIG_FILES\" ;;\n  *)   set x $CONFIG_FILES ;;\n  esac\n  shift\n  for mf\n  do\n    # Strip MF so we end up with the name of the file.\n    mf=`echo \"$mf\" | sed -e 's/:.*$//'`\n    # Check whether this is an Automake generated Makefile or not.\n    # We used to match only the files named `Makefile.in', but\n    # some people rename them; so instead we look at the file content.\n    # Grep'ing the first line is not enough: some people post-process\n    # each Makefile.in and add a new line on top of each file to say so.\n    # Grep'ing the whole file is not good either: AIX grep has a line\n    # limit of 2048, but all sed's we know have understand at least 4000.\n    if sed -n 's,^#.*generated by automake.*,X,p' \"$mf\" | grep X >/dev/null 2>&1; then\n      dirpart=`$as_dirname -- \"$mf\" ||\n$as_expr X\"$mf\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$mf\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$mf\" : 'X\\(//\\)$' \\| \\\n\t X\"$mf\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$mf\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n    else\n      continue\n    fi\n    # Extract the definition of DEPDIR, am__include, and am__quote\n    # from the Makefile without running `make'.\n    DEPDIR=`sed -n 's/^DEPDIR = //p' < \"$mf\"`\n    test -z \"$DEPDIR\" && continue\n    am__include=`sed -n 's/^am__include = //p' < \"$mf\"`\n    test -z \"am__include\" && continue\n    am__quote=`sed -n 's/^am__quote = //p' < \"$mf\"`\n    # When using ansi2knr, U may be empty or an underscore; expand it\n    U=`sed -n 's/^U = //p' < \"$mf\"`\n    # Find all dependency output files, they are included files with\n    # $(DEPDIR) in their names.  We invoke sed twice because it is the\n    # simplest approach to changing $(DEPDIR) to its actual value in the\n    # expansion.\n    for file in `sed -n \"\n      s/^$am__include $am__quote\\(.*(DEPDIR).*\\)$am__quote\"'$/\\1/p' <\"$mf\" | \\\n\t sed -e 's/\\$(DEPDIR)/'\"$DEPDIR\"'/g' -e 's/\\$U/'\"$U\"'/g'`; do\n      # Make sure the directory exists.\n      test -f \"$dirpart/$file\" && continue\n      fdir=`$as_dirname -- \"$file\" ||\n$as_expr X\"$file\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$file\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$file\" : 'X\\(//\\)$' \\| \\\n\t X\"$file\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$file\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n      as_dir=$dirpart/$fdir; as_fn_mkdir_p\n      # echo \"creating $dirpart/$file\"\n      echo '# dummy' > \"$dirpart/$file\"\n    done\n  done\n}\n ;;\n    \"libtool\":C)\n\n    # See if we are running on zsh, and set the options which allow our\n    # commands through without removal of \\ escapes.\n    if test -n \"${ZSH_VERSION+set}\" ; then\n      setopt NO_GLOB_SUBST\n    fi\n\n    cfgfile=\"${ofile}T\"\n    trap \"$RM \\\"$cfgfile\\\"; exit 1\" 1 2 15\n    $RM \"$cfgfile\"\n\n    cat <<_LT_EOF >> \"$cfgfile\"\n#! $SHELL\n\n# `$ECHO \"$ofile\" | sed 's%^.*/%%'` - Provide generalized library-building support services.\n# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION\n# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:\n# NOTE: Changes made to this file will be lost: look at ltmain.sh.\n#\n#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,\n#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software\n#                 Foundation, Inc.\n#   Written by Gordon Matzigkeit, 1996\n#\n#   This file is part of GNU Libtool.\n#\n# GNU Libtool is free software; you can redistribute it and/or\n# modify it under the terms of the GNU General Public License as\n# published by the Free Software Foundation; either version 2 of\n# the License, or (at your option) any later version.\n#\n# As a special exception to the GNU General Public License,\n# if you distribute this file as part of a program or library that\n# is built using GNU Libtool, you may include this file under the\n# same distribution terms that you use for the rest of that program.\n#\n# GNU Libtool 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 GNU Libtool; see the file COPYING.  If not, a copy\n# can be downloaded from http://www.gnu.org/licenses/gpl.html, or\n# obtained by writing to the Free Software Foundation, Inc.,\n# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n\n\n# The names of the tagged configurations supported by this script.\navailable_tags=\"CXX \"\n\n# ### BEGIN LIBTOOL CONFIG\n\n# Whether or not to build static libraries.\nbuild_old_libs=$enable_static\n\n# Which release of libtool.m4 was used?\nmacro_version=$macro_version\nmacro_revision=$macro_revision\n\n# Whether or not to build shared libraries.\nbuild_libtool_libs=$enable_shared\n\n# What type of objects to build.\npic_mode=$pic_mode\n\n# Whether or not to optimize for fast installation.\nfast_install=$enable_fast_install\n\n# Shell to use when invoking shell scripts.\nSHELL=$lt_SHELL\n\n# An echo program that protects backslashes.\nECHO=$lt_ECHO\n\n# The PATH separator for the build system.\nPATH_SEPARATOR=$lt_PATH_SEPARATOR\n\n# The host system.\nhost_alias=$host_alias\nhost=$host\nhost_os=$host_os\n\n# The build system.\nbuild_alias=$build_alias\nbuild=$build\nbuild_os=$build_os\n\n# A sed program that does not truncate output.\nSED=$lt_SED\n\n# Sed that helps us avoid accidentally triggering echo(1) options like -n.\nXsed=\"\\$SED -e 1s/^X//\"\n\n# A grep program that handles long lines.\nGREP=$lt_GREP\n\n# An ERE matcher.\nEGREP=$lt_EGREP\n\n# A literal string matcher.\nFGREP=$lt_FGREP\n\n# A BSD- or MS-compatible name lister.\nNM=$lt_NM\n\n# Whether we need soft or hard links.\nLN_S=$lt_LN_S\n\n# What is the maximum length of a command?\nmax_cmd_len=$max_cmd_len\n\n# Object file suffix (normally \"o\").\nobjext=$ac_objext\n\n# Executable file suffix (normally \"\").\nexeext=$exeext\n\n# whether the shell understands \"unset\".\nlt_unset=$lt_unset\n\n# turn spaces into newlines.\nSP2NL=$lt_lt_SP2NL\n\n# turn newlines into spaces.\nNL2SP=$lt_lt_NL2SP\n\n# convert \\$build file names to \\$host format.\nto_host_file_cmd=$lt_cv_to_host_file_cmd\n\n# convert \\$build files to toolchain format.\nto_tool_file_cmd=$lt_cv_to_tool_file_cmd\n\n# An object symbol dumper.\nOBJDUMP=$lt_OBJDUMP\n\n# Method to check whether dependent libraries are shared objects.\ndeplibs_check_method=$lt_deplibs_check_method\n\n# Command to use when deplibs_check_method = \"file_magic\".\nfile_magic_cmd=$lt_file_magic_cmd\n\n# How to find potential files when deplibs_check_method = \"file_magic\".\nfile_magic_glob=$lt_file_magic_glob\n\n# Find potential files using nocaseglob when deplibs_check_method = \"file_magic\".\nwant_nocaseglob=$lt_want_nocaseglob\n\n# DLL creation program.\nDLLTOOL=$lt_DLLTOOL\n\n# Command to associate shared and link libraries.\nsharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd\n\n# The archiver.\nAR=$lt_AR\n\n# Flags to create an archive.\nAR_FLAGS=$lt_AR_FLAGS\n\n# How to feed a file listing to the archiver.\narchiver_list_spec=$lt_archiver_list_spec\n\n# A symbol stripping program.\nSTRIP=$lt_STRIP\n\n# Commands used to install an old-style archive.\nRANLIB=$lt_RANLIB\nold_postinstall_cmds=$lt_old_postinstall_cmds\nold_postuninstall_cmds=$lt_old_postuninstall_cmds\n\n# Whether to use a lock for old archive extraction.\nlock_old_archive_extraction=$lock_old_archive_extraction\n\n# A C compiler.\nLTCC=$lt_CC\n\n# LTCC compiler flags.\nLTCFLAGS=$lt_CFLAGS\n\n# Take the output of nm and produce a listing of raw symbols and C names.\nglobal_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe\n\n# Transform the output of nm in a proper C declaration.\nglobal_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl\n\n# Transform the output of nm in a C name address pair.\nglobal_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address\n\n# Transform the output of nm in a C name address pair when lib prefix is needed.\nglobal_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix\n\n# Specify filename containing input files for \\$NM.\nnm_file_list_spec=$lt_nm_file_list_spec\n\n# The root where to search for dependent libraries,and in which our libraries should be installed.\nlt_sysroot=$lt_sysroot\n\n# The name of the directory that contains temporary libtool files.\nobjdir=$objdir\n\n# Used to examine libraries when file_magic_cmd begins with \"file\".\nMAGIC_CMD=$MAGIC_CMD\n\n# Must we lock files when doing compilation?\nneed_locks=$lt_need_locks\n\n# Manifest tool.\nMANIFEST_TOOL=$lt_MANIFEST_TOOL\n\n# Tool to manipulate archived DWARF debug symbol files on Mac OS X.\nDSYMUTIL=$lt_DSYMUTIL\n\n# Tool to change global to local symbols on Mac OS X.\nNMEDIT=$lt_NMEDIT\n\n# Tool to manipulate fat objects and archives on Mac OS X.\nLIPO=$lt_LIPO\n\n# ldd/readelf like tool for Mach-O binaries on Mac OS X.\nOTOOL=$lt_OTOOL\n\n# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.\nOTOOL64=$lt_OTOOL64\n\n# Old archive suffix (normally \"a\").\nlibext=$libext\n\n# Shared library suffix (normally \".so\").\nshrext_cmds=$lt_shrext_cmds\n\n# The commands to extract the exported symbol list from a shared archive.\nextract_expsyms_cmds=$lt_extract_expsyms_cmds\n\n# Variables whose values should be saved in libtool wrapper scripts and\n# restored at link time.\nvariables_saved_for_relink=$lt_variables_saved_for_relink\n\n# Do we need the \"lib\" prefix for modules?\nneed_lib_prefix=$need_lib_prefix\n\n# Do we need a version for libraries?\nneed_version=$need_version\n\n# Library versioning type.\nversion_type=$version_type\n\n# Shared library runtime path variable.\nrunpath_var=$runpath_var\n\n# Shared library path variable.\nshlibpath_var=$shlibpath_var\n\n# Is shlibpath searched before the hard-coded library search path?\nshlibpath_overrides_runpath=$shlibpath_overrides_runpath\n\n# Format of library name prefix.\nlibname_spec=$lt_libname_spec\n\n# List of archive names.  First name is the real one, the rest are links.\n# The last name is the one that the linker finds with -lNAME\nlibrary_names_spec=$lt_library_names_spec\n\n# The coded name of the library, if different from the real name.\nsoname_spec=$lt_soname_spec\n\n# Permission mode override for installation of shared libraries.\ninstall_override_mode=$lt_install_override_mode\n\n# Command to use after installation of a shared archive.\npostinstall_cmds=$lt_postinstall_cmds\n\n# Command to use after uninstallation of a shared archive.\npostuninstall_cmds=$lt_postuninstall_cmds\n\n# Commands used to finish a libtool library installation in a directory.\nfinish_cmds=$lt_finish_cmds\n\n# As \"finish_cmds\", except a single script fragment to be evaled but\n# not shown.\nfinish_eval=$lt_finish_eval\n\n# Whether we should hardcode library paths into libraries.\nhardcode_into_libs=$hardcode_into_libs\n\n# Compile-time system search path for libraries.\nsys_lib_search_path_spec=$lt_sys_lib_search_path_spec\n\n# Run-time system search path for libraries.\nsys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec\n\n# Whether dlopen is supported.\ndlopen_support=$enable_dlopen\n\n# Whether dlopen of programs is supported.\ndlopen_self=$enable_dlopen_self\n\n# Whether dlopen of statically linked programs is supported.\ndlopen_self_static=$enable_dlopen_self_static\n\n# Commands to strip libraries.\nold_striplib=$lt_old_striplib\nstriplib=$lt_striplib\n\n\n# The linker used to build libraries.\nLD=$lt_LD\n\n# How to create reloadable object files.\nreload_flag=$lt_reload_flag\nreload_cmds=$lt_reload_cmds\n\n# Commands used to build an old-style archive.\nold_archive_cmds=$lt_old_archive_cmds\n\n# A language specific compiler.\nCC=$lt_compiler\n\n# Is the compiler the GNU compiler?\nwith_gcc=$GCC\n\n# Compiler flag to turn off builtin functions.\nno_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag\n\n# Additional compiler flags for building library objects.\npic_flag=$lt_lt_prog_compiler_pic\n\n# How to pass a linker flag through the compiler.\nwl=$lt_lt_prog_compiler_wl\n\n# Compiler flag to prevent dynamic linking.\nlink_static_flag=$lt_lt_prog_compiler_static\n\n# Does compiler simultaneously support -c and -o options?\ncompiler_c_o=$lt_lt_cv_prog_compiler_c_o\n\n# Whether or not to add -lc for building shared libraries.\nbuild_libtool_need_lc=$archive_cmds_need_lc\n\n# Whether or not to disallow shared libs when runtime libs are static.\nallow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes\n\n# Compiler flag to allow reflexive dlopens.\nexport_dynamic_flag_spec=$lt_export_dynamic_flag_spec\n\n# Compiler flag to generate shared objects directly from archives.\nwhole_archive_flag_spec=$lt_whole_archive_flag_spec\n\n# Whether the compiler copes with passing no objects directly.\ncompiler_needs_object=$lt_compiler_needs_object\n\n# Create an old-style archive from a shared archive.\nold_archive_from_new_cmds=$lt_old_archive_from_new_cmds\n\n# Create a temporary old-style archive to link instead of a shared archive.\nold_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds\n\n# Commands used to build a shared archive.\narchive_cmds=$lt_archive_cmds\narchive_expsym_cmds=$lt_archive_expsym_cmds\n\n# Commands used to build a loadable module if different from building\n# a shared archive.\nmodule_cmds=$lt_module_cmds\nmodule_expsym_cmds=$lt_module_expsym_cmds\n\n# Whether we are building with GNU ld or not.\nwith_gnu_ld=$lt_with_gnu_ld\n\n# Flag that allows shared libraries with undefined symbols to be built.\nallow_undefined_flag=$lt_allow_undefined_flag\n\n# Flag that enforces no undefined symbols.\nno_undefined_flag=$lt_no_undefined_flag\n\n# Flag to hardcode \\$libdir into a binary during linking.\n# This must work even if \\$libdir does not exist\nhardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec\n\n# Whether we need a single \"-rpath\" flag with a separated argument.\nhardcode_libdir_separator=$lt_hardcode_libdir_separator\n\n# Set to \"yes\" if using DIR/libNAME\\${shared_ext} during linking hardcodes\n# DIR into the resulting binary.\nhardcode_direct=$hardcode_direct\n\n# Set to \"yes\" if using DIR/libNAME\\${shared_ext} during linking hardcodes\n# DIR into the resulting binary and the resulting library dependency is\n# \"absolute\",i.e impossible to change by setting \\${shlibpath_var} if the\n# library is relocated.\nhardcode_direct_absolute=$hardcode_direct_absolute\n\n# Set to \"yes\" if using the -LDIR flag during linking hardcodes DIR\n# into the resulting binary.\nhardcode_minus_L=$hardcode_minus_L\n\n# Set to \"yes\" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR\n# into the resulting binary.\nhardcode_shlibpath_var=$hardcode_shlibpath_var\n\n# Set to \"yes\" if building a shared library automatically hardcodes DIR\n# into the library and all subsequent libraries and executables linked\n# against it.\nhardcode_automatic=$hardcode_automatic\n\n# Set to yes if linker adds runtime paths of dependent libraries\n# to runtime path list.\ninherit_rpath=$inherit_rpath\n\n# Whether libtool must link a program against all its dependency libraries.\nlink_all_deplibs=$link_all_deplibs\n\n# Set to \"yes\" if exported symbols are required.\nalways_export_symbols=$always_export_symbols\n\n# The commands to list exported symbols.\nexport_symbols_cmds=$lt_export_symbols_cmds\n\n# Symbols that should not be listed in the preloaded symbols.\nexclude_expsyms=$lt_exclude_expsyms\n\n# Symbols that must always be exported.\ninclude_expsyms=$lt_include_expsyms\n\n# Commands necessary for linking programs (against libraries) with templates.\nprelink_cmds=$lt_prelink_cmds\n\n# Commands necessary for finishing linking programs.\npostlink_cmds=$lt_postlink_cmds\n\n# Specify filename containing input files.\nfile_list_spec=$lt_file_list_spec\n\n# How to hardcode a shared library path into an executable.\nhardcode_action=$hardcode_action\n\n# The directories searched by this compiler when creating a shared library.\ncompiler_lib_search_dirs=$lt_compiler_lib_search_dirs\n\n# Dependencies to place before and after the objects being linked to\n# create a shared library.\npredep_objects=$lt_predep_objects\npostdep_objects=$lt_postdep_objects\npredeps=$lt_predeps\npostdeps=$lt_postdeps\n\n# The library search path used internally by the compiler when linking\n# a shared library.\ncompiler_lib_search_path=$lt_compiler_lib_search_path\n\n# ### END LIBTOOL CONFIG\n\n_LT_EOF\n\n  case $host_os in\n  aix3*)\n    cat <<\\_LT_EOF >> \"$cfgfile\"\n# AIX sometimes has problems with the GCC collect2 program.  For some\n# reason, if we set the COLLECT_NAMES environment variable, the problems\n# vanish in a puff of smoke.\nif test \"X${COLLECT_NAMES+set}\" != Xset; then\n  COLLECT_NAMES=\n  export COLLECT_NAMES\nfi\n_LT_EOF\n    ;;\n  esac\n\n\nltmain=\"$ac_aux_dir/ltmain.sh\"\n\n\n  # We use sed instead of cat because bash on DJGPP gets confused if\n  # if finds mixed CR/LF and LF-only lines.  Since sed operates in\n  # text mode, it properly converts lines to CR/LF.  This bash problem\n  # is reportedly fixed, but why not run on old versions too?\n  sed '$q' \"$ltmain\" >> \"$cfgfile\" \\\n     || (rm -f \"$cfgfile\"; exit 1)\n\n  if test x\"$xsi_shell\" = xyes; then\n  sed -e '/^func_dirname ()$/,/^} # func_dirname /c\\\nfunc_dirname ()\\\n{\\\n\\    case ${1} in\\\n\\      */*) func_dirname_result=\"${1%/*}${2}\" ;;\\\n\\      *  ) func_dirname_result=\"${3}\" ;;\\\n\\    esac\\\n} # Extended-shell func_dirname implementation' \"$cfgfile\" > $cfgfile.tmp \\\n  && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\ntest 0 -eq $? || _lt_function_replace_fail=:\n\n\n  sed -e '/^func_basename ()$/,/^} # func_basename /c\\\nfunc_basename ()\\\n{\\\n\\    func_basename_result=\"${1##*/}\"\\\n} # Extended-shell func_basename implementation' \"$cfgfile\" > $cfgfile.tmp \\\n  && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\ntest 0 -eq $? || _lt_function_replace_fail=:\n\n\n  sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\\\nfunc_dirname_and_basename ()\\\n{\\\n\\    case ${1} in\\\n\\      */*) func_dirname_result=\"${1%/*}${2}\" ;;\\\n\\      *  ) func_dirname_result=\"${3}\" ;;\\\n\\    esac\\\n\\    func_basename_result=\"${1##*/}\"\\\n} # Extended-shell func_dirname_and_basename implementation' \"$cfgfile\" > $cfgfile.tmp \\\n  && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\ntest 0 -eq $? || _lt_function_replace_fail=:\n\n\n  sed -e '/^func_stripname ()$/,/^} # func_stripname /c\\\nfunc_stripname ()\\\n{\\\n\\    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\\\n\\    # positional parameters, so assign one to ordinary parameter first.\\\n\\    func_stripname_result=${3}\\\n\\    func_stripname_result=${func_stripname_result#\"${1}\"}\\\n\\    func_stripname_result=${func_stripname_result%\"${2}\"}\\\n} # Extended-shell func_stripname implementation' \"$cfgfile\" > $cfgfile.tmp \\\n  && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\ntest 0 -eq $? || _lt_function_replace_fail=:\n\n\n  sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\\\nfunc_split_long_opt ()\\\n{\\\n\\    func_split_long_opt_name=${1%%=*}\\\n\\    func_split_long_opt_arg=${1#*=}\\\n} # Extended-shell func_split_long_opt implementation' \"$cfgfile\" > $cfgfile.tmp \\\n  && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\ntest 0 -eq $? || _lt_function_replace_fail=:\n\n\n  sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\\\nfunc_split_short_opt ()\\\n{\\\n\\    func_split_short_opt_arg=${1#??}\\\n\\    func_split_short_opt_name=${1%\"$func_split_short_opt_arg\"}\\\n} # Extended-shell func_split_short_opt implementation' \"$cfgfile\" > $cfgfile.tmp \\\n  && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\ntest 0 -eq $? || _lt_function_replace_fail=:\n\n\n  sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\\\nfunc_lo2o ()\\\n{\\\n\\    case ${1} in\\\n\\      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\\\n\\      *)    func_lo2o_result=${1} ;;\\\n\\    esac\\\n} # Extended-shell func_lo2o implementation' \"$cfgfile\" > $cfgfile.tmp \\\n  && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\ntest 0 -eq $? || _lt_function_replace_fail=:\n\n\n  sed -e '/^func_xform ()$/,/^} # func_xform /c\\\nfunc_xform ()\\\n{\\\n    func_xform_result=${1%.*}.lo\\\n} # Extended-shell func_xform implementation' \"$cfgfile\" > $cfgfile.tmp \\\n  && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\ntest 0 -eq $? || _lt_function_replace_fail=:\n\n\n  sed -e '/^func_arith ()$/,/^} # func_arith /c\\\nfunc_arith ()\\\n{\\\n    func_arith_result=$(( $* ))\\\n} # Extended-shell func_arith implementation' \"$cfgfile\" > $cfgfile.tmp \\\n  && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\ntest 0 -eq $? || _lt_function_replace_fail=:\n\n\n  sed -e '/^func_len ()$/,/^} # func_len /c\\\nfunc_len ()\\\n{\\\n    func_len_result=${#1}\\\n} # Extended-shell func_len implementation' \"$cfgfile\" > $cfgfile.tmp \\\n  && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\ntest 0 -eq $? || _lt_function_replace_fail=:\n\nfi\n\nif test x\"$lt_shell_append\" = xyes; then\n  sed -e '/^func_append ()$/,/^} # func_append /c\\\nfunc_append ()\\\n{\\\n    eval \"${1}+=\\\\${2}\"\\\n} # Extended-shell func_append implementation' \"$cfgfile\" > $cfgfile.tmp \\\n  && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\ntest 0 -eq $? || _lt_function_replace_fail=:\n\n\n  sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\\\nfunc_append_quoted ()\\\n{\\\n\\    func_quote_for_eval \"${2}\"\\\n\\    eval \"${1}+=\\\\\\\\ \\\\$func_quote_for_eval_result\"\\\n} # Extended-shell func_append_quoted implementation' \"$cfgfile\" > $cfgfile.tmp \\\n  && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\ntest 0 -eq $? || _lt_function_replace_fail=:\n\n\n  # Save a `func_append' function call where possible by direct use of '+='\n  sed -e 's%func_append \\([a-zA-Z_]\\{1,\\}\\) \"%\\1+=\"%g' $cfgfile > $cfgfile.tmp \\\n    && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n      || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\n  test 0 -eq $? || _lt_function_replace_fail=:\nelse\n  # Save a `func_append' function call even when '+=' is not available\n  sed -e 's%func_append \\([a-zA-Z_]\\{1,\\}\\) \"%\\1=\"$\\1%g' $cfgfile > $cfgfile.tmp \\\n    && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n      || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\n  test 0 -eq $? || _lt_function_replace_fail=:\nfi\n\nif test x\"$_lt_function_replace_fail\" = x\":\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile\" >&5\n$as_echo \"$as_me: WARNING: Unable to substitute extended shell functions in $ofile\" >&2;}\nfi\n\n\n   mv -f \"$cfgfile\" \"$ofile\" ||\n    (rm -f \"$ofile\" && cp \"$cfgfile\" \"$ofile\" && rm -f \"$cfgfile\")\n  chmod +x \"$ofile\"\n\n\n    cat <<_LT_EOF >> \"$ofile\"\n\n# ### BEGIN LIBTOOL TAG CONFIG: CXX\n\n# The linker used to build libraries.\nLD=$lt_LD_CXX\n\n# How to create reloadable object files.\nreload_flag=$lt_reload_flag_CXX\nreload_cmds=$lt_reload_cmds_CXX\n\n# Commands used to build an old-style archive.\nold_archive_cmds=$lt_old_archive_cmds_CXX\n\n# A language specific compiler.\nCC=$lt_compiler_CXX\n\n# Is the compiler the GNU compiler?\nwith_gcc=$GCC_CXX\n\n# Compiler flag to turn off builtin functions.\nno_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX\n\n# Additional compiler flags for building library objects.\npic_flag=$lt_lt_prog_compiler_pic_CXX\n\n# How to pass a linker flag through the compiler.\nwl=$lt_lt_prog_compiler_wl_CXX\n\n# Compiler flag to prevent dynamic linking.\nlink_static_flag=$lt_lt_prog_compiler_static_CXX\n\n# Does compiler simultaneously support -c and -o options?\ncompiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX\n\n# Whether or not to add -lc for building shared libraries.\nbuild_libtool_need_lc=$archive_cmds_need_lc_CXX\n\n# Whether or not to disallow shared libs when runtime libs are static.\nallow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX\n\n# Compiler flag to allow reflexive dlopens.\nexport_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX\n\n# Compiler flag to generate shared objects directly from archives.\nwhole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX\n\n# Whether the compiler copes with passing no objects directly.\ncompiler_needs_object=$lt_compiler_needs_object_CXX\n\n# Create an old-style archive from a shared archive.\nold_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX\n\n# Create a temporary old-style archive to link instead of a shared archive.\nold_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX\n\n# Commands used to build a shared archive.\narchive_cmds=$lt_archive_cmds_CXX\narchive_expsym_cmds=$lt_archive_expsym_cmds_CXX\n\n# Commands used to build a loadable module if different from building\n# a shared archive.\nmodule_cmds=$lt_module_cmds_CXX\nmodule_expsym_cmds=$lt_module_expsym_cmds_CXX\n\n# Whether we are building with GNU ld or not.\nwith_gnu_ld=$lt_with_gnu_ld_CXX\n\n# Flag that allows shared libraries with undefined symbols to be built.\nallow_undefined_flag=$lt_allow_undefined_flag_CXX\n\n# Flag that enforces no undefined symbols.\nno_undefined_flag=$lt_no_undefined_flag_CXX\n\n# Flag to hardcode \\$libdir into a binary during linking.\n# This must work even if \\$libdir does not exist\nhardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX\n\n# Whether we need a single \"-rpath\" flag with a separated argument.\nhardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX\n\n# Set to \"yes\" if using DIR/libNAME\\${shared_ext} during linking hardcodes\n# DIR into the resulting binary.\nhardcode_direct=$hardcode_direct_CXX\n\n# Set to \"yes\" if using DIR/libNAME\\${shared_ext} during linking hardcodes\n# DIR into the resulting binary and the resulting library dependency is\n# \"absolute\",i.e impossible to change by setting \\${shlibpath_var} if the\n# library is relocated.\nhardcode_direct_absolute=$hardcode_direct_absolute_CXX\n\n# Set to \"yes\" if using the -LDIR flag during linking hardcodes DIR\n# into the resulting binary.\nhardcode_minus_L=$hardcode_minus_L_CXX\n\n# Set to \"yes\" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR\n# into the resulting binary.\nhardcode_shlibpath_var=$hardcode_shlibpath_var_CXX\n\n# Set to \"yes\" if building a shared library automatically hardcodes DIR\n# into the library and all subsequent libraries and executables linked\n# against it.\nhardcode_automatic=$hardcode_automatic_CXX\n\n# Set to yes if linker adds runtime paths of dependent libraries\n# to runtime path list.\ninherit_rpath=$inherit_rpath_CXX\n\n# Whether libtool must link a program against all its dependency libraries.\nlink_all_deplibs=$link_all_deplibs_CXX\n\n# Set to \"yes\" if exported symbols are required.\nalways_export_symbols=$always_export_symbols_CXX\n\n# The commands to list exported symbols.\nexport_symbols_cmds=$lt_export_symbols_cmds_CXX\n\n# Symbols that should not be listed in the preloaded symbols.\nexclude_expsyms=$lt_exclude_expsyms_CXX\n\n# Symbols that must always be exported.\ninclude_expsyms=$lt_include_expsyms_CXX\n\n# Commands necessary for linking programs (against libraries) with templates.\nprelink_cmds=$lt_prelink_cmds_CXX\n\n# Commands necessary for finishing linking programs.\npostlink_cmds=$lt_postlink_cmds_CXX\n\n# Specify filename containing input files.\nfile_list_spec=$lt_file_list_spec_CXX\n\n# How to hardcode a shared library path into an executable.\nhardcode_action=$hardcode_action_CXX\n\n# The directories searched by this compiler when creating a shared library.\ncompiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX\n\n# Dependencies to place before and after the objects being linked to\n# create a shared library.\npredep_objects=$lt_predep_objects_CXX\npostdep_objects=$lt_postdep_objects_CXX\npredeps=$lt_predeps_CXX\npostdeps=$lt_postdeps_CXX\n\n# The library search path used internally by the compiler when linking\n# a shared library.\ncompiler_lib_search_path=$lt_compiler_lib_search_path_CXX\n\n# ### END LIBTOOL TAG CONFIG: CXX\n_LT_EOF\n\n ;;\n\n  esac\ndone # for ac_tag\n\n\nas_fn_exit 0\n_ACEOF\nac_clean_files=$ac_clean_files_save\n\ntest $ac_write_fail = 0 ||\n  as_fn_error $? \"write failure creating $CONFIG_STATUS\" \"$LINENO\" 5\n\n\n# configure is writing to config.log, and then calls config.status.\n# config.status does its own redirection, appending to config.log.\n# Unfortunately, on DOS this fails, as config.log is still kept open\n# by configure, so config.status won't be able to write to it; its\n# output is simply discarded.  So we exec the FD to /dev/null,\n# effectively closing config.log, so it can be properly (re)opened and\n# appended to by config.status.  When coming back to configure, we\n# need to make the FD available again.\nif test \"$no_create\" != yes; then\n  ac_cs_success=:\n  ac_config_status_args=\n  test \"$silent\" = yes &&\n    ac_config_status_args=\"$ac_config_status_args --quiet\"\n  exec 5>/dev/null\n  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false\n  exec 5>>config.log\n  # Use ||, not &&, to avoid exiting from the if with $? = 1, which\n  # would make configure fail if this is the last instruction.\n  $ac_cs_success || as_fn_exit 1\nfi\nif test -n \"$ac_unrecognized_opts\" && test \"$enable_option_checking\" != no; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts\" >&5\n$as_echo \"$as_me: WARNING: unrecognized options: $ac_unrecognized_opts\" >&2;}\nfi\n\nchmod a+x gmm-config\nchmod a+x gmm-config\n"
  },
  {
    "path": "libs/CoMISo/gmm/configure.in",
    "content": "dnl Process this file with autoconf to produce a configure script.\ndnl ------------------------------------------------------------------------\ndnl initialisation\ndnl ------------------------------------------------------------------------\n\ndnl ./configure: sh internal 2K buffer overflow on HP-UX 9.xx\ndnl thus, updating cache ./config.cache avoided.\ndefine([AC_CACHE_LOAD], )dnl\ndefine([AC_CACHE_SAVE], )dnl\n\nAC_INIT\nAC_CONFIG_HEADERS(config.h)\nAC_PREREQ(2.56)\nAC_ARG_PROGRAM\n\nPACKAGE=\"gmm\"\nMAJOR_VERSION=\"4\"\nMINOR_VERSION=\"2\"\ndnl VERSION=$MAJOR_VERSION.$MINOR_VERSION\nVERSION=$MAJOR_VERSION.$MINOR_VERSION\necho \"configuring $PACKAGE $VERSION...\"\n\ndnl ------------------------------------------------------------------------\ndnl   init automake\ndnl ------------------------------------------------------------------------\n\nAM_INIT_AUTOMAKE($PACKAGE,$VERSION)\n\ndnl -----------------------------------------------\ndnl test du c++\ndnl -----------------------------------------------\n\nUSER_CXXFLAGS=\"$CXXFLAGS\"\nAC_PROG_CXX(cxx KCC CC cc++ xlC aCC g++ c++ icc)\nAC_PROG_CXXCPP\nCXXFLAGS=\"${USER_CXXFLAGS}\"\nSUPLDFLAGS=\"\"\n\nAC_LANG_CPLUSPLUS\n\nif test \"x$prefix\" = \"xNONE\"; then\n  GFPREFIX=/usr/local;\nelse\n  GFPREFIX=\"$prefix\";\nfi;\n\ndnl AC_CXX_FULL_SPECIALIZATION_SYNTAX (c)Luc Maisonobe v 1.1.1.1 (2001/07/26)\ndnl with some modification to test partial specialization\nAC_CACHE_CHECK(whether the compiler recognizes the partial specialization syntax,\nac_cv_cxx_partial_specialization_syntax,\n[AC_LANG_SAVE\n AC_LANG_CPLUSPLUS\n AC_TRY_COMPILE([\ntemplate<class T> class A        { public : int f () const { return 1; } };\ntemplate<class T> class A<T*>    { public:  int f () const { return 0; } };],[\nA<float*> a; return a.f();],\n ac_cv_cxx_partial_specialization_syntax=yes, ac_cv_cxx_partial_specialization_s\nyntax=no)\n AC_LANG_RESTORE\n])\nif test \"$ac_cv_cxx_partial_specialization_syntax\" != yes; then\n  echo \"Your compiler ($CXX) does not support partial template specialization, trash it\"\n  exit 1;\nfi\n\nAC_CANONICAL_HOST\n\necho \"you are compiling gmm on a $host\"\n\ncase $CXX in\n cxx)\n        echo \"Using Compaq cxx compiler\"\n        echo \"WARNING : Control that you have at least Compaq C++ V6.3\"\n        here=`pwd`\n        cd $srcdir\ndnl     il faut utiliser -tweak au lieu des repositories ...\n        CXXFLAGS=\"$CXXFLAGS -tweak -std strict_ansi -fast -Wl,-S -nopure_cname\"\ndnl     CXXFLAGS=\"$CXXFLAGS -ptr `pwd`/cxx_repository -std strict_ansi -O3\"\n        cd $here\n        ;;\n CC)\n        case $host in\n        *irix*)\n                echo \"Using MIPSPRO CC on IRIX  (LD is set to CC)\"\n                LD=CC\ndnl             CXXFLAGS=\"$CXXFLAGS -LANG:std -O3 -OPT:Olimit=0:roundoff=3:div_split=ON:alias=typed -TARG:platform=ip25\"\n                CXXFLAGS=\"$CXXFLAGS -LANG:std  -O3 \"\ndnl             CXXFLAGS=\"$CXXFLAGS -LANG:std  -O3 -ansiW \"\n                SUPLDFLAGS=\"-lCio\"\n                ;;\n        *sun*)\n                echo \"Using SUN C++ WorkShop Compiler\"\n                CXXFLAGS=\"$CXXFLAGS +w2 -O3\"\n                ;;\n        esac\n        ;;\n aCC)\n        echo \"Using HP ANSI C++ Compiler aCC\"\n        CXXFLAGS=\"$CXXFLAGS -AA -fast\"\n        ;;\n g++* | c++)\n        GCCVER=`$CXX --version | head -1 | cut -d ' ' -f3`\n        echo \"Using the GNU g++ compiler $GCCVER\"\n        case $GCCVER in\n          2.95*)\n                WSHADOW=\"\"\n                ;;\n          *)\n                WSHADOW=\"-Wshadow\"\n                ;;\n        esac\n        CXXFLAGS=\"$CXXFLAGS -ftemplate-depth-40 -pedantic -O3 -Wall -W $WSHADOW -Wpointer-arith -Wcast-qual -Wwrite-strings -Wconversion -Wredundant-decls -Wno-long-long\"\n        ;;\n icc | icpc)\n        echo \"Using INTEL icc\"\ndnl -tpp6 is for pentiumII and more\ndnl -Xc is for ansi conformance\n        CXXFLAGS=\"$CXXFLAGS -O3 -tpp6\"\n        ;;\n *)\n        echo \"Using a unknown compiler\"\n        CXXFLAGS=\"$CXXFLAGS -O3\"\n        ;;\nesac\n\nAC_SUBST(SUPLDFLAGS)\n\ndnl ------------------------------------------------------------------------\ndnl   init libtools for shared libraries\ndnl ------------------------------------------------------------------------\n\ndnl AC_DISABLE_FAST_INSTALL\n\nAM_ENABLE_STATIC\n\ndnl AM_PROG_LIBTOOL\nAM_PROG_LIBTOOL\nAC_SUBST([LIBTOOL_DEPS])\n\nAC_CHECK_HEADERS(sys/times.h)\n\nBUILDER=`whoami`\nAC_SUBST(BUILDER)\nBUILDDATE=`date +%D,%H:%M:%S`\nAC_SUBST(BUILDDATE)\nCONFIGURE_ARGS=$ac_configure_args\nAC_SUBST(CONFIGURE_ARGS)\nLIBTOOL_VERSION_INFO=\"-version-info ${MAJOR_VERSION}:${MINOR_VERSION}:0\"\nAC_SUBST(LIBTOOL_VERSION_INFO)\n\ndnl AC_CHECK_PROGS(RANLIB, ranlib)\n\ndnl -----------------------------------------------\ndnl sorties\ndnl -----------------------------------------------\nAC_CONFIG_FILES(\\\n        Makefile \\\n        tests/Makefile \\\n        include/Makefile gmm-config)\nAC_OUTPUT\nchmod a+x gmm-config\nchmod a+x gmm-config\n"
  },
  {
    "path": "libs/CoMISo/gmm/depcomp",
    "content": "#! /bin/sh\n# depcomp - compile a program generating dependencies as side-effects\n\nscriptversion=2011-12-04.11; # UTC\n\n# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010,\n# 2011 Free Software Foundation, Inc.\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 2, or (at your option)\n# 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 <http://www.gnu.org/licenses/>.\n\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\n# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.\n\ncase $1 in\n  '')\n     echo \"$0: No command.  Try \\`$0 --help' for more information.\" 1>&2\n     exit 1;\n     ;;\n  -h | --h*)\n    cat <<\\EOF\nUsage: depcomp [--help] [--version] PROGRAM [ARGS]\n\nRun PROGRAMS ARGS to compile a file, generating dependencies\nas side-effects.\n\nEnvironment variables:\n  depmode     Dependency tracking mode.\n  source      Source file read by `PROGRAMS ARGS'.\n  object      Object file output by `PROGRAMS ARGS'.\n  DEPDIR      directory where to store dependencies.\n  depfile     Dependency file to output.\n  tmpdepfile  Temporary file to use when outputting dependencies.\n  libtool     Whether libtool is used (yes/no).\n\nReport bugs to <bug-automake@gnu.org>.\nEOF\n    exit $?\n    ;;\n  -v | --v*)\n    echo \"depcomp $scriptversion\"\n    exit $?\n    ;;\nesac\n\nif test -z \"$depmode\" || test -z \"$source\" || test -z \"$object\"; then\n  echo \"depcomp: Variables source, object and depmode must be set\" 1>&2\n  exit 1\nfi\n\n# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.\ndepfile=${depfile-`echo \"$object\" |\n  sed 's|[^\\\\/]*$|'${DEPDIR-.deps}'/&|;s|\\.\\([^.]*\\)$|.P\\1|;s|Pobj$|Po|'`}\ntmpdepfile=${tmpdepfile-`echo \"$depfile\" | sed 's/\\.\\([^.]*\\)$/.T\\1/'`}\n\nrm -f \"$tmpdepfile\"\n\n# Some modes work just like other modes, but use different flags.  We\n# parameterize here, but still list the modes in the big case below,\n# to make depend.m4 easier to write.  Note that we *cannot* use a case\n# here, because this file can only contain one case statement.\nif test \"$depmode\" = hp; then\n  # HP compiler uses -M and no extra arg.\n  gccflag=-M\n  depmode=gcc\nfi\n\nif test \"$depmode\" = dashXmstdout; then\n   # This is just like dashmstdout with a different argument.\n   dashmflag=-xM\n   depmode=dashmstdout\nfi\n\ncygpath_u=\"cygpath -u -f -\"\nif test \"$depmode\" = msvcmsys; then\n   # This is just like msvisualcpp but w/o cygpath translation.\n   # Just convert the backslash-escaped backslashes to single forward\n   # slashes to satisfy depend.m4\n   cygpath_u='sed s,\\\\\\\\,/,g'\n   depmode=msvisualcpp\nfi\n\nif test \"$depmode\" = msvc7msys; then\n   # This is just like msvc7 but w/o cygpath translation.\n   # Just convert the backslash-escaped backslashes to single forward\n   # slashes to satisfy depend.m4\n   cygpath_u='sed s,\\\\\\\\,/,g'\n   depmode=msvc7\nfi\n\ncase \"$depmode\" in\ngcc3)\n## gcc 3 implements dependency tracking that does exactly what\n## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like\n## it if -MD -MP comes after the -MF stuff.  Hmm.\n## Unfortunately, FreeBSD c89 acceptance of flags depends upon\n## the command line argument order; so add the flags where they\n## appear in depend2.am.  Note that the slowdown incurred here\n## affects only configure: in makefiles, %FASTDEP% shortcuts this.\n  for arg\n  do\n    case $arg in\n    -c) set fnord \"$@\" -MT \"$object\" -MD -MP -MF \"$tmpdepfile\" \"$arg\" ;;\n    *)  set fnord \"$@\" \"$arg\" ;;\n    esac\n    shift # fnord\n    shift # $arg\n  done\n  \"$@\"\n  stat=$?\n  if test $stat -eq 0; then :\n  else\n    rm -f \"$tmpdepfile\"\n    exit $stat\n  fi\n  mv \"$tmpdepfile\" \"$depfile\"\n  ;;\n\ngcc)\n## There are various ways to get dependency output from gcc.  Here's\n## why we pick this rather obscure method:\n## - Don't want to use -MD because we'd like the dependencies to end\n##   up in a subdir.  Having to rename by hand is ugly.\n##   (We might end up doing this anyway to support other compilers.)\n## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like\n##   -MM, not -M (despite what the docs say).\n## - Using -M directly means running the compiler twice (even worse\n##   than renaming).\n  if test -z \"$gccflag\"; then\n    gccflag=-MD,\n  fi\n  \"$@\" -Wp,\"$gccflag$tmpdepfile\"\n  stat=$?\n  if test $stat -eq 0; then :\n  else\n    rm -f \"$tmpdepfile\"\n    exit $stat\n  fi\n  rm -f \"$depfile\"\n  echo \"$object : \\\\\" > \"$depfile\"\n  alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\n## The second -e expression handles DOS-style file names with drive letters.\n  sed -e 's/^[^:]*: / /' \\\n      -e 's/^['$alpha']:\\/[^:]*: / /' < \"$tmpdepfile\" >> \"$depfile\"\n## This next piece of magic avoids the `deleted header file' problem.\n## The problem is that when a header file which appears in a .P file\n## is deleted, the dependency causes make to die (because there is\n## typically no way to rebuild the header).  We avoid this by adding\n## dummy dependencies for each header file.  Too bad gcc doesn't do\n## this for us directly.\n  tr ' ' '\n' < \"$tmpdepfile\" |\n## Some versions of gcc put a space before the `:'.  On the theory\n## that the space means something, we add a space to the output as\n## well.  hp depmode also adds that space, but also prefixes the VPATH\n## to the object.  Take care to not repeat it in the output.\n## Some versions of the HPUX 10.20 sed can't process this invocation\n## correctly.  Breaking it into two sed invocations is a workaround.\n    sed -e 's/^\\\\$//' -e '/^$/d' -e \"s|.*$object$||\" -e '/:$/d' \\\n      | sed -e 's/$/ :/' >> \"$depfile\"\n  rm -f \"$tmpdepfile\"\n  ;;\n\nhp)\n  # This case exists only to let depend.m4 do its work.  It works by\n  # looking at the text of this script.  This case will never be run,\n  # since it is checked for above.\n  exit 1\n  ;;\n\nsgi)\n  if test \"$libtool\" = yes; then\n    \"$@\" \"-Wp,-MDupdate,$tmpdepfile\"\n  else\n    \"$@\" -MDupdate \"$tmpdepfile\"\n  fi\n  stat=$?\n  if test $stat -eq 0; then :\n  else\n    rm -f \"$tmpdepfile\"\n    exit $stat\n  fi\n  rm -f \"$depfile\"\n\n  if test -f \"$tmpdepfile\"; then  # yes, the sourcefile depend on other files\n    echo \"$object : \\\\\" > \"$depfile\"\n\n    # Clip off the initial element (the dependent).  Don't try to be\n    # clever and replace this with sed code, as IRIX sed won't handle\n    # lines with more than a fixed number of characters (4096 in\n    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;\n    # the IRIX cc adds comments like `#:fec' to the end of the\n    # dependency line.\n    tr ' ' '\n' < \"$tmpdepfile\" \\\n    | sed -e 's/^.*\\.o://' -e 's/#.*$//' -e '/^$/ d' | \\\n    tr '\n' ' ' >> \"$depfile\"\n    echo >> \"$depfile\"\n\n    # The second pass generates a dummy entry for each header file.\n    tr ' ' '\n' < \"$tmpdepfile\" \\\n   | sed -e 's/^.*\\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \\\n   >> \"$depfile\"\n  else\n    # The sourcefile does not contain any dependencies, so just\n    # store a dummy comment line, to avoid errors with the Makefile\n    # \"include basename.Plo\" scheme.\n    echo \"#dummy\" > \"$depfile\"\n  fi\n  rm -f \"$tmpdepfile\"\n  ;;\n\naix)\n  # The C for AIX Compiler uses -M and outputs the dependencies\n  # in a .u file.  In older versions, this file always lives in the\n  # current directory.  Also, the AIX compiler puts `$object:' at the\n  # start of each line; $object doesn't have directory information.\n  # Version 6 uses the directory in both cases.\n  dir=`echo \"$object\" | sed -e 's|/[^/]*$|/|'`\n  test \"x$dir\" = \"x$object\" && dir=\n  base=`echo \"$object\" | sed -e 's|^.*/||' -e 's/\\.o$//' -e 's/\\.lo$//'`\n  if test \"$libtool\" = yes; then\n    tmpdepfile1=$dir$base.u\n    tmpdepfile2=$base.u\n    tmpdepfile3=$dir.libs/$base.u\n    \"$@\" -Wc,-M\n  else\n    tmpdepfile1=$dir$base.u\n    tmpdepfile2=$dir$base.u\n    tmpdepfile3=$dir$base.u\n    \"$@\" -M\n  fi\n  stat=$?\n\n  if test $stat -eq 0; then :\n  else\n    rm -f \"$tmpdepfile1\" \"$tmpdepfile2\" \"$tmpdepfile3\"\n    exit $stat\n  fi\n\n  for tmpdepfile in \"$tmpdepfile1\" \"$tmpdepfile2\" \"$tmpdepfile3\"\n  do\n    test -f \"$tmpdepfile\" && break\n  done\n  if test -f \"$tmpdepfile\"; then\n    # Each line is of the form `foo.o: dependent.h'.\n    # Do two passes, one to just change these to\n    # `$object: dependent.h' and one to simply `dependent.h:'.\n    sed -e \"s,^.*\\.[a-z]*:,$object:,\" < \"$tmpdepfile\" > \"$depfile\"\n    # That's a tab and a space in the [].\n    sed -e 's,^.*\\.[a-z]*:[\t ]*,,' -e 's,$,:,' < \"$tmpdepfile\" >> \"$depfile\"\n  else\n    # The sourcefile does not contain any dependencies, so just\n    # store a dummy comment line, to avoid errors with the Makefile\n    # \"include basename.Plo\" scheme.\n    echo \"#dummy\" > \"$depfile\"\n  fi\n  rm -f \"$tmpdepfile\"\n  ;;\n\nicc)\n  # Intel's C compiler understands `-MD -MF file'.  However on\n  #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c\n  # ICC 7.0 will fill foo.d with something like\n  #    foo.o: sub/foo.c\n  #    foo.o: sub/foo.h\n  # which is wrong.  We want:\n  #    sub/foo.o: sub/foo.c\n  #    sub/foo.o: sub/foo.h\n  #    sub/foo.c:\n  #    sub/foo.h:\n  # ICC 7.1 will output\n  #    foo.o: sub/foo.c sub/foo.h\n  # and will wrap long lines using \\ :\n  #    foo.o: sub/foo.c ... \\\n  #     sub/foo.h ... \\\n  #     ...\n\n  \"$@\" -MD -MF \"$tmpdepfile\"\n  stat=$?\n  if test $stat -eq 0; then :\n  else\n    rm -f \"$tmpdepfile\"\n    exit $stat\n  fi\n  rm -f \"$depfile\"\n  # Each line is of the form `foo.o: dependent.h',\n  # or `foo.o: dep1.h dep2.h \\', or ` dep3.h dep4.h \\'.\n  # Do two passes, one to just change these to\n  # `$object: dependent.h' and one to simply `dependent.h:'.\n  sed \"s,^[^:]*:,$object :,\" < \"$tmpdepfile\" > \"$depfile\"\n  # Some versions of the HPUX 10.20 sed can't process this invocation\n  # correctly.  Breaking it into two sed invocations is a workaround.\n  sed 's,^[^:]*: \\(.*\\)$,\\1,;s/^\\\\$//;/^$/d;/:$/d' < \"$tmpdepfile\" |\n    sed -e 's/$/ :/' >> \"$depfile\"\n  rm -f \"$tmpdepfile\"\n  ;;\n\nhp2)\n  # The \"hp\" stanza above does not work with aCC (C++) and HP's ia64\n  # compilers, which have integrated preprocessors.  The correct option\n  # to use with these is +Maked; it writes dependencies to a file named\n  # 'foo.d', which lands next to the object file, wherever that\n  # happens to be.\n  # Much of this is similar to the tru64 case; see comments there.\n  dir=`echo \"$object\" | sed -e 's|/[^/]*$|/|'`\n  test \"x$dir\" = \"x$object\" && dir=\n  base=`echo \"$object\" | sed -e 's|^.*/||' -e 's/\\.o$//' -e 's/\\.lo$//'`\n  if test \"$libtool\" = yes; then\n    tmpdepfile1=$dir$base.d\n    tmpdepfile2=$dir.libs/$base.d\n    \"$@\" -Wc,+Maked\n  else\n    tmpdepfile1=$dir$base.d\n    tmpdepfile2=$dir$base.d\n    \"$@\" +Maked\n  fi\n  stat=$?\n  if test $stat -eq 0; then :\n  else\n     rm -f \"$tmpdepfile1\" \"$tmpdepfile2\"\n     exit $stat\n  fi\n\n  for tmpdepfile in \"$tmpdepfile1\" \"$tmpdepfile2\"\n  do\n    test -f \"$tmpdepfile\" && break\n  done\n  if test -f \"$tmpdepfile\"; then\n    sed -e \"s,^.*\\.[a-z]*:,$object:,\" \"$tmpdepfile\" > \"$depfile\"\n    # Add `dependent.h:' lines.\n    sed -ne '2,${\n\t       s/^ *//\n\t       s/ \\\\*$//\n\t       s/$/:/\n\t       p\n\t     }' \"$tmpdepfile\" >> \"$depfile\"\n  else\n    echo \"#dummy\" > \"$depfile\"\n  fi\n  rm -f \"$tmpdepfile\" \"$tmpdepfile2\"\n  ;;\n\ntru64)\n   # The Tru64 compiler uses -MD to generate dependencies as a side\n   # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.\n   # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put\n   # dependencies in `foo.d' instead, so we check for that too.\n   # Subdirectories are respected.\n   dir=`echo \"$object\" | sed -e 's|/[^/]*$|/|'`\n   test \"x$dir\" = \"x$object\" && dir=\n   base=`echo \"$object\" | sed -e 's|^.*/||' -e 's/\\.o$//' -e 's/\\.lo$//'`\n\n   if test \"$libtool\" = yes; then\n      # With Tru64 cc, shared objects can also be used to make a\n      # static library.  This mechanism is used in libtool 1.4 series to\n      # handle both shared and static libraries in a single compilation.\n      # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.\n      #\n      # With libtool 1.5 this exception was removed, and libtool now\n      # generates 2 separate objects for the 2 libraries.  These two\n      # compilations output dependencies in $dir.libs/$base.o.d and\n      # in $dir$base.o.d.  We have to check for both files, because\n      # one of the two compilations can be disabled.  We should prefer\n      # $dir$base.o.d over $dir.libs/$base.o.d because the latter is\n      # automatically cleaned when .libs/ is deleted, while ignoring\n      # the former would cause a distcleancheck panic.\n      tmpdepfile1=$dir.libs/$base.lo.d   # libtool 1.4\n      tmpdepfile2=$dir$base.o.d          # libtool 1.5\n      tmpdepfile3=$dir.libs/$base.o.d    # libtool 1.5\n      tmpdepfile4=$dir.libs/$base.d      # Compaq CCC V6.2-504\n      \"$@\" -Wc,-MD\n   else\n      tmpdepfile1=$dir$base.o.d\n      tmpdepfile2=$dir$base.d\n      tmpdepfile3=$dir$base.d\n      tmpdepfile4=$dir$base.d\n      \"$@\" -MD\n   fi\n\n   stat=$?\n   if test $stat -eq 0; then :\n   else\n      rm -f \"$tmpdepfile1\" \"$tmpdepfile2\" \"$tmpdepfile3\" \"$tmpdepfile4\"\n      exit $stat\n   fi\n\n   for tmpdepfile in \"$tmpdepfile1\" \"$tmpdepfile2\" \"$tmpdepfile3\" \"$tmpdepfile4\"\n   do\n     test -f \"$tmpdepfile\" && break\n   done\n   if test -f \"$tmpdepfile\"; then\n      sed -e \"s,^.*\\.[a-z]*:,$object:,\" < \"$tmpdepfile\" > \"$depfile\"\n      # That's a tab and a space in the [].\n      sed -e 's,^.*\\.[a-z]*:[\t ]*,,' -e 's,$,:,' < \"$tmpdepfile\" >> \"$depfile\"\n   else\n      echo \"#dummy\" > \"$depfile\"\n   fi\n   rm -f \"$tmpdepfile\"\n   ;;\n\nmsvc7)\n  if test \"$libtool\" = yes; then\n    showIncludes=-Wc,-showIncludes\n  else\n    showIncludes=-showIncludes\n  fi\n  \"$@\" $showIncludes > \"$tmpdepfile\"\n  stat=$?\n  grep -v '^Note: including file: ' \"$tmpdepfile\"\n  if test \"$stat\" = 0; then :\n  else\n    rm -f \"$tmpdepfile\"\n    exit $stat\n  fi\n  rm -f \"$depfile\"\n  echo \"$object : \\\\\" > \"$depfile\"\n  # The first sed program below extracts the file names and escapes\n  # backslashes for cygpath.  The second sed program outputs the file\n  # name when reading, but also accumulates all include files in the\n  # hold buffer in order to output them again at the end.  This only\n  # works with sed implementations that can handle large buffers.\n  sed < \"$tmpdepfile\" -n '\n/^Note: including file:  *\\(.*\\)/ {\n  s//\\1/\n  s/\\\\/\\\\\\\\/g\n  p\n}' | $cygpath_u | sort -u | sed -n '\ns/ /\\\\ /g\ns/\\(.*\\)/\t\\1 \\\\/p\ns/.\\(.*\\) \\\\/\\1:/\nH\n$ {\n  s/.*/\t/\n  G\n  p\n}' >> \"$depfile\"\n  rm -f \"$tmpdepfile\"\n  ;;\n\nmsvc7msys)\n  # This case exists only to let depend.m4 do its work.  It works by\n  # looking at the text of this script.  This case will never be run,\n  # since it is checked for above.\n  exit 1\n  ;;\n\n#nosideeffect)\n  # This comment above is used by automake to tell side-effect\n  # dependency tracking mechanisms from slower ones.\n\ndashmstdout)\n  # Important note: in order to support this mode, a compiler *must*\n  # always write the preprocessed file to stdout, regardless of -o.\n  \"$@\" || exit $?\n\n  # Remove the call to Libtool.\n  if test \"$libtool\" = yes; then\n    while test \"X$1\" != 'X--mode=compile'; do\n      shift\n    done\n    shift\n  fi\n\n  # Remove `-o $object'.\n  IFS=\" \"\n  for arg\n  do\n    case $arg in\n    -o)\n      shift\n      ;;\n    $object)\n      shift\n      ;;\n    *)\n      set fnord \"$@\" \"$arg\"\n      shift # fnord\n      shift # $arg\n      ;;\n    esac\n  done\n\n  test -z \"$dashmflag\" && dashmflag=-M\n  # Require at least two characters before searching for `:'\n  # in the target name.  This is to cope with DOS-style filenames:\n  # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.\n  \"$@\" $dashmflag |\n    sed 's:^[  ]*[^: ][^:][^:]*\\:[    ]*:'\"$object\"'\\: :' > \"$tmpdepfile\"\n  rm -f \"$depfile\"\n  cat < \"$tmpdepfile\" > \"$depfile\"\n  tr ' ' '\n' < \"$tmpdepfile\" | \\\n## Some versions of the HPUX 10.20 sed can't process this invocation\n## correctly.  Breaking it into two sed invocations is a workaround.\n    sed -e 's/^\\\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> \"$depfile\"\n  rm -f \"$tmpdepfile\"\n  ;;\n\ndashXmstdout)\n  # This case only exists to satisfy depend.m4.  It is never actually\n  # run, as this mode is specially recognized in the preamble.\n  exit 1\n  ;;\n\nmakedepend)\n  \"$@\" || exit $?\n  # Remove any Libtool call\n  if test \"$libtool\" = yes; then\n    while test \"X$1\" != 'X--mode=compile'; do\n      shift\n    done\n    shift\n  fi\n  # X makedepend\n  shift\n  cleared=no eat=no\n  for arg\n  do\n    case $cleared in\n    no)\n      set \"\"; shift\n      cleared=yes ;;\n    esac\n    if test $eat = yes; then\n      eat=no\n      continue\n    fi\n    case \"$arg\" in\n    -D*|-I*)\n      set fnord \"$@\" \"$arg\"; shift ;;\n    # Strip any option that makedepend may not understand.  Remove\n    # the object too, otherwise makedepend will parse it as a source file.\n    -arch)\n      eat=yes ;;\n    -*|$object)\n      ;;\n    *)\n      set fnord \"$@\" \"$arg\"; shift ;;\n    esac\n  done\n  obj_suffix=`echo \"$object\" | sed 's/^.*\\././'`\n  touch \"$tmpdepfile\"\n  ${MAKEDEPEND-makedepend} -o\"$obj_suffix\" -f\"$tmpdepfile\" \"$@\"\n  rm -f \"$depfile\"\n  # makedepend may prepend the VPATH from the source file name to the object.\n  # No need to regex-escape $object, excess matching of '.' is harmless.\n  sed \"s|^.*\\($object *:\\)|\\1|\" \"$tmpdepfile\" > \"$depfile\"\n  sed '1,2d' \"$tmpdepfile\" | tr ' ' '\n' | \\\n## Some versions of the HPUX 10.20 sed can't process this invocation\n## correctly.  Breaking it into two sed invocations is a workaround.\n    sed -e 's/^\\\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> \"$depfile\"\n  rm -f \"$tmpdepfile\" \"$tmpdepfile\".bak\n  ;;\n\ncpp)\n  # Important note: in order to support this mode, a compiler *must*\n  # always write the preprocessed file to stdout.\n  \"$@\" || exit $?\n\n  # Remove the call to Libtool.\n  if test \"$libtool\" = yes; then\n    while test \"X$1\" != 'X--mode=compile'; do\n      shift\n    done\n    shift\n  fi\n\n  # Remove `-o $object'.\n  IFS=\" \"\n  for arg\n  do\n    case $arg in\n    -o)\n      shift\n      ;;\n    $object)\n      shift\n      ;;\n    *)\n      set fnord \"$@\" \"$arg\"\n      shift # fnord\n      shift # $arg\n      ;;\n    esac\n  done\n\n  \"$@\" -E |\n    sed -n -e '/^# [0-9][0-9]* \"\\([^\"]*\\)\".*/ s:: \\1 \\\\:p' \\\n       -e '/^#line [0-9][0-9]* \"\\([^\"]*\\)\".*/ s:: \\1 \\\\:p' |\n    sed '$ s: \\\\$::' > \"$tmpdepfile\"\n  rm -f \"$depfile\"\n  echo \"$object : \\\\\" > \"$depfile\"\n  cat < \"$tmpdepfile\" >> \"$depfile\"\n  sed < \"$tmpdepfile\" '/^$/d;s/^ //;s/ \\\\$//;s/$/ :/' >> \"$depfile\"\n  rm -f \"$tmpdepfile\"\n  ;;\n\nmsvisualcpp)\n  # Important note: in order to support this mode, a compiler *must*\n  # always write the preprocessed file to stdout.\n  \"$@\" || exit $?\n\n  # Remove the call to Libtool.\n  if test \"$libtool\" = yes; then\n    while test \"X$1\" != 'X--mode=compile'; do\n      shift\n    done\n    shift\n  fi\n\n  IFS=\" \"\n  for arg\n  do\n    case \"$arg\" in\n    -o)\n      shift\n      ;;\n    $object)\n      shift\n      ;;\n    \"-Gm\"|\"/Gm\"|\"-Gi\"|\"/Gi\"|\"-ZI\"|\"/ZI\")\n\tset fnord \"$@\"\n\tshift\n\tshift\n\t;;\n    *)\n\tset fnord \"$@\" \"$arg\"\n\tshift\n\tshift\n\t;;\n    esac\n  done\n  \"$@\" -E 2>/dev/null |\n  sed -n '/^#line [0-9][0-9]* \"\\([^\"]*\\)\"/ s::\\1:p' | $cygpath_u | sort -u > \"$tmpdepfile\"\n  rm -f \"$depfile\"\n  echo \"$object : \\\\\" > \"$depfile\"\n  sed < \"$tmpdepfile\" -n -e 's% %\\\\ %g' -e '/^\\(.*\\)$/ s::\t\\1 \\\\:p' >> \"$depfile\"\n  echo \"\t\" >> \"$depfile\"\n  sed < \"$tmpdepfile\" -n -e 's% %\\\\ %g' -e '/^\\(.*\\)$/ s::\\1\\::p' >> \"$depfile\"\n  rm -f \"$tmpdepfile\"\n  ;;\n\nmsvcmsys)\n  # This case exists only to let depend.m4 do its work.  It works by\n  # looking at the text of this script.  This case will never be run,\n  # since it is checked for above.\n  exit 1\n  ;;\n\nnone)\n  exec \"$@\"\n  ;;\n\n*)\n  echo \"Unknown depmode $depmode\" 1>&2\n  exit 1\n  ;;\nesac\n\nexit 0\n\n# Local Variables:\n# mode: shell-script\n# sh-indentation: 2\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"scriptversion=\"\n# time-stamp-format: \"%:y-%02m-%02d.%02H\"\n# time-stamp-time-zone: \"UTC\"\n# time-stamp-end: \"; # UTC\"\n# End:\n"
  },
  {
    "path": "libs/CoMISo/gmm/gmm-config.in",
    "content": "#!/bin/sh\n# @configure_input@\nprefix=\"@prefix@\"\nexec_prefix=\"@exec_prefix@\"\nincludedir=\"@includedir@\"\nlibdir=\"@libdir@\"\nbindir=\"@bindir@\"\ndatadir=\"@datadir@\"\nmandir=\"@mandir@\"\nsysconfdir=\"@sysconfdir@\"\nsharedstatedir=\"@sharedstatedir@\"\nsrcdir=\"@abs_top_srcdir@\"\nbuilddir=\"@abs_top_builddir@\"\nbuild_CXXFLAGS=\"@CXXFLAGS@\"\nbuild_LDFLAGS=\"@LDFLAGS@\"\nCXX=\"@CXX@\"\n\nLDFLAGS=\"@LIBS@\"\nSTATICLDFLAGS=\"@LIBS@\"\nLALDFLAGS=\"@LIBS@\"\nSRC_LDFLAGS=\"@LIBS@\"\nSRC_LALDFLAGS=\"@LIBS@\"\nSRC_STATICLDFLAGS=\"@LIBS@\"\n\nCFLAGS=\"@CPPFLAGS@ -I$includedir\"\nSRC_CFLAGS=\"-I$srcdir/src -I$builddir/src @CPPFLAGS@\"\n\nbuild=\"@BUILDER@-@BUILDDATE@\"\nconfigure_args=\"@CONFIGURE_ARGS@\"\nfrom_source=0\nusage()\n{\n\tcat <<EOF\nUsage: gmm-config [OPTIONS]\nOptions:\n        [--src]\n\t[--prefix]\n\t[--exec-prefix]\n\t[--version]\n\t[--libs-la]\n\t[--libs]\n\t[--cflags]\n\t[--cxx]\n\t[--build-flags]\n\t[--build-libs]\n\t[--configure-args]\nEOF\n\texit $1\n}\n\nwhile test $# -gt 0; do\n  case \"$1\" in\n  -*=*) optarg=`echo \"$1\" | sed 's/[-_a-zA-Z0-9]*=//'` ;;\n  *) optarg= ;;\n  esac\n\n  case $1 in\n    --src)\n      from_source=1\n      ;;\n    --prefix)\n      echo $prefix\n      ;;\n    --exec-prefix)\n      echo $exec_prefix\n      ;;\n    --version)\n      echo @VERSION@\n      ;;\n    --cflags)\n      if test $from_source -eq 0; then\n        echo $CFLAGS\n      else\n        echo $SRC_CFLAGS\n      fi;\n      ;;\n    --libs-la)\n      if test $from_source -eq 0; then\n        echo $LALDFLAGS\n      else\n        echo $SRC_LALDFLAGS\n      fi;\n      ;;\n    --libs)\n      if test $from_source -eq 0; then\n        echo $LDFLAGS\n      else\n        echo $SRC_LDFLAGS\n      fi;\n      ;;\n    --static-libs)\n      if test $from_source -eq 0; then\n        echo $STATICLDFLAGS\n      else\n        echo $SRC_STATICLDFLAGS\n      fi;\n      ;;\n    --build)\n      echo $build\n      ;;\n    --build-flags)\n      echo $build_CXXFLAGS\n      ;;\n    --build-libs)\n      echo $build_LDFLAGS\n      ;;\n    --cxx)\n      echo $CXX\n      ;;\n    --configure-args)\n      echo $configure_args\n      ;;\n    *)\n      usage 1 1>&2\n      ;;\n  esac\n  shift\ndone\n\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/Makefile.am",
    "content": "nobase_include_HEADERS=\\\n          gmm/gmm_algobase.h\\\n          gmm/gmm_blas.h\\\n          gmm/gmm_blas_interface.h\\\n          gmm/gmm_condition_number.h\\\n          gmm/gmm_conjugated.h\\\n          gmm/gmm_def.h\\\n          gmm/gmm_dense_Householder.h\\\n          gmm/gmm_dense_lu.h\\\n          gmm/gmm_dense_qr.h\\\n          gmm/gmm_dense_sylvester.h\\\n          gmm/gmm_domain_decomp.h\\\n          gmm/gmm_except.h\\\n          gmm/gmm.h\\\n          gmm/gmm_inoutput.h\\\n          gmm/gmm_interface_bgeot.h\\\n          gmm/gmm_interface.h\\\n          gmm/gmm_iter.h\\\n          gmm/gmm_iter_solvers.h\\\n          gmm/gmm_kernel.h\\\n          gmm/gmm_lapack_interface.h\\\n          gmm/gmm_least_squares_cg.h\\\n          gmm/gmm_matrix.h\\\n          gmm/gmm_modified_gram_schmidt.h\\\n          gmm/gmm_MUMPS_interface.h\\\n          gmm/gmm_opt.h\\\n          gmm/gmm_precond_diagonal.h\\\n          gmm/gmm_precond.h\\\n          gmm/gmm_precond_ildlt.h\\\n          gmm/gmm_precond_ildltt.h\\\n          gmm/gmm_precond_ilu.h\\\n          gmm/gmm_precond_ilut.h\\\n          gmm/gmm_precond_ilutp.h\\\n          gmm/gmm_precond_mr_approx_inverse.h\\\n          gmm/gmm_range_basis.h\\\n          gmm/gmm_real_part.h\\\n          gmm/gmm_ref.h\\\n          gmm/gmm_scaled.h\\\n          gmm/gmm_solver_bfgs.h\\\n          gmm/gmm_solver_bicgstab.h\\\n          gmm/gmm_solver_cg.h\\\n          gmm/gmm_solver_constrained_cg.h\\\n          gmm/gmm_solver_gmres.h\\\n          gmm/gmm_solver_idgmres.h\\\n          gmm/gmm_solver_qmr.h\\\n          gmm/gmm_solver_Schwarz_additive.h\\\n          gmm/gmm_std.h\\\n          gmm/gmm_sub_index.h\\\n          gmm/gmm_sub_matrix.h\\\n          gmm/gmm_sub_vector.h\\\n          gmm/gmm_superlu_interface.h\\\n          gmm/gmm_transposed.h\\\n          gmm/gmm_tri_solve.h\\\n          gmm/gmm_vector.h\\\n          gmm/gmm_vector_to_matrix.h\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/Makefile.in",
    "content": "# Makefile.in generated by automake 1.11.3 from Makefile.am.\n# @configure_input@\n\n# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,\n# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software\n# Foundation, Inc.\n# This Makefile.in is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY, to the extent permitted by law; without\n# even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n# PARTICULAR PURPOSE.\n\n@SET_MAKE@\n\nVPATH = @srcdir@\npkgdatadir = $(datadir)/@PACKAGE@\npkgincludedir = $(includedir)/@PACKAGE@\npkglibdir = $(libdir)/@PACKAGE@\npkglibexecdir = $(libexecdir)/@PACKAGE@\nam__cd = CDPATH=\"$${ZSH_VERSION+.}$(PATH_SEPARATOR)\" && cd\ninstall_sh_DATA = $(install_sh) -c -m 644\ninstall_sh_PROGRAM = $(install_sh) -c\ninstall_sh_SCRIPT = $(install_sh) -c\nINSTALL_HEADER = $(INSTALL_DATA)\ntransform = $(program_transform_name)\nNORMAL_INSTALL = :\nPRE_INSTALL = :\nPOST_INSTALL = :\nNORMAL_UNINSTALL = :\nPRE_UNINSTALL = :\nPOST_UNINSTALL = :\nbuild_triplet = @build@\nhost_triplet = @host@\nsubdir = include\nDIST_COMMON = $(nobase_include_HEADERS) $(srcdir)/Makefile.am \\\n\t$(srcdir)/Makefile.in\nACLOCAL_M4 = $(top_srcdir)/aclocal.m4\nam__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \\\n\t$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \\\n\t$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \\\n\t$(top_srcdir)/configure.in\nam__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \\\n\t$(ACLOCAL_M4)\nmkinstalldirs = $(install_sh) -d\nCONFIG_HEADER = $(top_builddir)/config.h\nCONFIG_CLEAN_FILES =\nCONFIG_CLEAN_VPATH_FILES =\nSOURCES =\nDIST_SOURCES =\nam__vpath_adj_setup = srcdirstrip=`echo \"$(srcdir)\" | sed 's|.|.|g'`;\nam__vpath_adj = case $$p in \\\n    $(srcdir)/*) f=`echo \"$$p\" | sed \"s|^$$srcdirstrip/||\"`;; \\\n    *) f=$$p;; \\\n  esac;\nam__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;\nam__install_max = 40\nam__nobase_strip_setup = \\\n  srcdirstrip=`echo \"$(srcdir)\" | sed 's/[].[^$$\\\\*|]/\\\\\\\\&/g'`\nam__nobase_strip = \\\n  for p in $$list; do echo \"$$p\"; done | sed -e \"s|$$srcdirstrip/||\"\nam__nobase_list = $(am__nobase_strip_setup); \\\n  for p in $$list; do echo \"$$p $$p\"; done | \\\n  sed \"s| $$srcdirstrip/| |;\"' / .*\\//!s/ .*/ ./; s,\\( .*\\)/[^/]*$$,\\1,' | \\\n  $(AWK) 'BEGIN { files[\".\"] = \"\" } { files[$$2] = files[$$2] \" \" $$1; \\\n    if (++n[$$2] == $(am__install_max)) \\\n      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = \"\" } } \\\n    END { for (dir in files) print dir, files[dir] }'\nam__base_list = \\\n  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\\n/ /g' | \\\n  sed '$$!N;$$!N;$$!N;$$!N;s/\\n/ /g'\nam__uninstall_files_from_dir = { \\\n  test -z \"$$files\" \\\n    || { test ! -d \"$$dir\" && test ! -f \"$$dir\" && test ! -r \"$$dir\"; } \\\n    || { echo \" ( cd '$$dir' && rm -f\" $$files \")\"; \\\n         $(am__cd) \"$$dir\" && rm -f $$files; }; \\\n  }\nam__installdirs = \"$(DESTDIR)$(includedir)\"\nHEADERS = $(nobase_include_HEADERS)\nETAGS = etags\nCTAGS = ctags\nDISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)\nACLOCAL = @ACLOCAL@\nAMTAR = @AMTAR@\nAR = @AR@\nAUTOCONF = @AUTOCONF@\nAUTOHEADER = @AUTOHEADER@\nAUTOMAKE = @AUTOMAKE@\nAWK = @AWK@\nBUILDDATE = @BUILDDATE@\nBUILDER = @BUILDER@\nCC = @CC@\nCCDEPMODE = @CCDEPMODE@\nCFLAGS = @CFLAGS@\nCONFIGURE_ARGS = @CONFIGURE_ARGS@\nCPP = @CPP@\nCPPFLAGS = @CPPFLAGS@\nCXX = @CXX@\nCXXCPP = @CXXCPP@\nCXXDEPMODE = @CXXDEPMODE@\nCXXFLAGS = @CXXFLAGS@\nCYGPATH_W = @CYGPATH_W@\nDEFS = @DEFS@\nDEPDIR = @DEPDIR@\nDLLTOOL = @DLLTOOL@\nDSYMUTIL = @DSYMUTIL@\nDUMPBIN = @DUMPBIN@\nECHO_C = @ECHO_C@\nECHO_N = @ECHO_N@\nECHO_T = @ECHO_T@\nEGREP = @EGREP@\nEXEEXT = @EXEEXT@\nFGREP = @FGREP@\nGREP = @GREP@\nINSTALL = @INSTALL@\nINSTALL_DATA = @INSTALL_DATA@\nINSTALL_PROGRAM = @INSTALL_PROGRAM@\nINSTALL_SCRIPT = @INSTALL_SCRIPT@\nINSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@\nLD = @LD@\nLDFLAGS = @LDFLAGS@\nLIBOBJS = @LIBOBJS@\nLIBS = @LIBS@\nLIBTOOL = @LIBTOOL@\nLIBTOOL_DEPS = @LIBTOOL_DEPS@\nLIBTOOL_VERSION_INFO = @LIBTOOL_VERSION_INFO@\nLIPO = @LIPO@\nLN_S = @LN_S@\nLTLIBOBJS = @LTLIBOBJS@\nMAKEINFO = @MAKEINFO@\nMANIFEST_TOOL = @MANIFEST_TOOL@\nMKDIR_P = @MKDIR_P@\nNM = @NM@\nNMEDIT = @NMEDIT@\nOBJDUMP = @OBJDUMP@\nOBJEXT = @OBJEXT@\nOTOOL = @OTOOL@\nOTOOL64 = @OTOOL64@\nPACKAGE = @PACKAGE@\nPACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@\nPACKAGE_NAME = @PACKAGE_NAME@\nPACKAGE_STRING = @PACKAGE_STRING@\nPACKAGE_TARNAME = @PACKAGE_TARNAME@\nPACKAGE_URL = @PACKAGE_URL@\nPACKAGE_VERSION = @PACKAGE_VERSION@\nPATH_SEPARATOR = @PATH_SEPARATOR@\nRANLIB = @RANLIB@\nSED = @SED@\nSET_MAKE = @SET_MAKE@\nSHELL = @SHELL@\nSTRIP = @STRIP@\nSUPLDFLAGS = @SUPLDFLAGS@\nVERSION = @VERSION@\nabs_builddir = @abs_builddir@\nabs_srcdir = @abs_srcdir@\nabs_top_builddir = @abs_top_builddir@\nabs_top_srcdir = @abs_top_srcdir@\nac_ct_AR = @ac_ct_AR@\nac_ct_CC = @ac_ct_CC@\nac_ct_CXX = @ac_ct_CXX@\nac_ct_DUMPBIN = @ac_ct_DUMPBIN@\nam__include = @am__include@\nam__leading_dot = @am__leading_dot@\nam__quote = @am__quote@\nam__tar = @am__tar@\nam__untar = @am__untar@\nbindir = @bindir@\nbuild = @build@\nbuild_alias = @build_alias@\nbuild_cpu = @build_cpu@\nbuild_os = @build_os@\nbuild_vendor = @build_vendor@\nbuilddir = @builddir@\ndatadir = @datadir@\ndatarootdir = @datarootdir@\ndocdir = @docdir@\ndvidir = @dvidir@\nexec_prefix = @exec_prefix@\nhost = @host@\nhost_alias = @host_alias@\nhost_cpu = @host_cpu@\nhost_os = @host_os@\nhost_vendor = @host_vendor@\nhtmldir = @htmldir@\nincludedir = @includedir@\ninfodir = @infodir@\ninstall_sh = @install_sh@\nlibdir = @libdir@\nlibexecdir = @libexecdir@\nlocaledir = @localedir@\nlocalstatedir = @localstatedir@\nmandir = @mandir@\nmkdir_p = @mkdir_p@\noldincludedir = @oldincludedir@\npdfdir = @pdfdir@\nprefix = @prefix@\nprogram_transform_name = @program_transform_name@\npsdir = @psdir@\nsbindir = @sbindir@\nsharedstatedir = @sharedstatedir@\nsrcdir = @srcdir@\nsysconfdir = @sysconfdir@\ntarget_alias = @target_alias@\ntop_build_prefix = @top_build_prefix@\ntop_builddir = @top_builddir@\ntop_srcdir = @top_srcdir@\nnobase_include_HEADERS = \\\n          gmm/gmm_algobase.h\\\n          gmm/gmm_blas.h\\\n          gmm/gmm_blas_interface.h\\\n          gmm/gmm_condition_number.h\\\n          gmm/gmm_conjugated.h\\\n          gmm/gmm_def.h\\\n          gmm/gmm_dense_Householder.h\\\n          gmm/gmm_dense_lu.h\\\n          gmm/gmm_dense_qr.h\\\n          gmm/gmm_dense_sylvester.h\\\n          gmm/gmm_domain_decomp.h\\\n          gmm/gmm_except.h\\\n          gmm/gmm.h\\\n          gmm/gmm_inoutput.h\\\n          gmm/gmm_interface_bgeot.h\\\n          gmm/gmm_interface.h\\\n          gmm/gmm_iter.h\\\n          gmm/gmm_iter_solvers.h\\\n          gmm/gmm_kernel.h\\\n          gmm/gmm_lapack_interface.h\\\n          gmm/gmm_least_squares_cg.h\\\n          gmm/gmm_matrix.h\\\n          gmm/gmm_modified_gram_schmidt.h\\\n          gmm/gmm_MUMPS_interface.h\\\n          gmm/gmm_opt.h\\\n          gmm/gmm_precond_diagonal.h\\\n          gmm/gmm_precond.h\\\n          gmm/gmm_precond_ildlt.h\\\n          gmm/gmm_precond_ildltt.h\\\n          gmm/gmm_precond_ilu.h\\\n          gmm/gmm_precond_ilut.h\\\n          gmm/gmm_precond_ilutp.h\\\n          gmm/gmm_precond_mr_approx_inverse.h\\\n          gmm/gmm_range_basis.h\\\n          gmm/gmm_real_part.h\\\n          gmm/gmm_ref.h\\\n          gmm/gmm_scaled.h\\\n          gmm/gmm_solver_bfgs.h\\\n          gmm/gmm_solver_bicgstab.h\\\n          gmm/gmm_solver_cg.h\\\n          gmm/gmm_solver_constrained_cg.h\\\n          gmm/gmm_solver_gmres.h\\\n          gmm/gmm_solver_idgmres.h\\\n          gmm/gmm_solver_qmr.h\\\n          gmm/gmm_solver_Schwarz_additive.h\\\n          gmm/gmm_std.h\\\n          gmm/gmm_sub_index.h\\\n          gmm/gmm_sub_matrix.h\\\n          gmm/gmm_sub_vector.h\\\n          gmm/gmm_superlu_interface.h\\\n          gmm/gmm_transposed.h\\\n          gmm/gmm_tri_solve.h\\\n          gmm/gmm_vector.h\\\n          gmm/gmm_vector_to_matrix.h\n\nall: all-am\n\n.SUFFIXES:\n$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)\n\t@for dep in $?; do \\\n\t  case '$(am__configure_deps)' in \\\n\t    *$$dep*) \\\n\t      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \\\n\t        && { if test -f $@; then exit 0; else break; fi; }; \\\n\t      exit 1;; \\\n\t  esac; \\\n\tdone; \\\n\techo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu include/Makefile'; \\\n\t$(am__cd) $(top_srcdir) && \\\n\t  $(AUTOMAKE) --gnu include/Makefile\n.PRECIOUS: Makefile\nMakefile: $(srcdir)/Makefile.in $(top_builddir)/config.status\n\t@case '$?' in \\\n\t  *config.status*) \\\n\t    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \\\n\t  *) \\\n\t    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \\\n\t    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \\\n\tesac;\n\n$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n\n$(top_srcdir)/configure:  $(am__configure_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(ACLOCAL_M4):  $(am__aclocal_m4_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(am__aclocal_m4_deps):\n\nmostlyclean-libtool:\n\t-rm -f *.lo\n\nclean-libtool:\n\t-rm -rf .libs _libs\ninstall-nobase_includeHEADERS: $(nobase_include_HEADERS)\n\t@$(NORMAL_INSTALL)\n\ttest -z \"$(includedir)\" || $(MKDIR_P) \"$(DESTDIR)$(includedir)\"\n\t@list='$(nobase_include_HEADERS)'; test -n \"$(includedir)\" || list=; \\\n\t$(am__nobase_list) | while read dir files; do \\\n\t  xfiles=; for file in $$files; do \\\n\t    if test -f \"$$file\"; then xfiles=\"$$xfiles $$file\"; \\\n\t    else xfiles=\"$$xfiles $(srcdir)/$$file\"; fi; done; \\\n\t  test -z \"$$xfiles\" || { \\\n\t    test \"x$$dir\" = x. || { \\\n\t      echo \"$(MKDIR_P) '$(DESTDIR)$(includedir)/$$dir'\"; \\\n\t      $(MKDIR_P) \"$(DESTDIR)$(includedir)/$$dir\"; }; \\\n\t    echo \" $(INSTALL_HEADER) $$xfiles '$(DESTDIR)$(includedir)/$$dir'\"; \\\n\t    $(INSTALL_HEADER) $$xfiles \"$(DESTDIR)$(includedir)/$$dir\" || exit $$?; }; \\\n\tdone\n\nuninstall-nobase_includeHEADERS:\n\t@$(NORMAL_UNINSTALL)\n\t@list='$(nobase_include_HEADERS)'; test -n \"$(includedir)\" || list=; \\\n\t$(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \\\n\tdir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir)\n\nID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)\n\tlist='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \\\n\tunique=`for i in $$list; do \\\n\t    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n\t  done | \\\n\t  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \\\n\t      END { if (nonempty) { for (i in files) print i; }; }'`; \\\n\tmkid -fID $$unique\ntags: TAGS\n\nTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \\\n\t\t$(TAGS_FILES) $(LISP)\n\tset x; \\\n\there=`pwd`; \\\n\tlist='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \\\n\tunique=`for i in $$list; do \\\n\t    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n\t  done | \\\n\t  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \\\n\t      END { if (nonempty) { for (i in files) print i; }; }'`; \\\n\tshift; \\\n\tif test -z \"$(ETAGS_ARGS)$$*$$unique\"; then :; else \\\n\t  test -n \"$$unique\" || unique=$$empty_fix; \\\n\t  if test $$# -gt 0; then \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      \"$$@\" $$unique; \\\n\t  else \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      $$unique; \\\n\t  fi; \\\n\tfi\nctags: CTAGS\nCTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \\\n\t\t$(TAGS_FILES) $(LISP)\n\tlist='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \\\n\tunique=`for i in $$list; do \\\n\t    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n\t  done | \\\n\t  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \\\n\t      END { if (nonempty) { for (i in files) print i; }; }'`; \\\n\ttest -z \"$(CTAGS_ARGS)$$unique\" \\\n\t  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \\\n\t     $$unique\n\nGTAGS:\n\there=`$(am__cd) $(top_builddir) && pwd` \\\n\t  && $(am__cd) $(top_srcdir) \\\n\t  && gtags -i $(GTAGS_ARGS) \"$$here\"\n\ndistclean-tags:\n\t-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags\n\ndistdir: $(DISTFILES)\n\t@srcdirstrip=`echo \"$(srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\ttopsrcdirstrip=`echo \"$(top_srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\tlist='$(DISTFILES)'; \\\n\t  dist_files=`for file in $$list; do echo $$file; done | \\\n\t  sed -e \"s|^$$srcdirstrip/||;t\" \\\n\t      -e \"s|^$$topsrcdirstrip/|$(top_builddir)/|;t\"`; \\\n\tcase $$dist_files in \\\n\t  */*) $(MKDIR_P) `echo \"$$dist_files\" | \\\n\t\t\t   sed '/\\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \\\n\t\t\t   sort -u` ;; \\\n\tesac; \\\n\tfor file in $$dist_files; do \\\n\t  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \\\n\t  if test -d $$d/$$file; then \\\n\t    dir=`echo \"/$$file\" | sed -e 's,/[^/]*$$,,'`; \\\n\t    if test -d \"$(distdir)/$$file\"; then \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \\\n\t      cp -fpR $(srcdir)/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    cp -fpR $$d/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t  else \\\n\t    test -f \"$(distdir)/$$file\" \\\n\t    || cp -p $$d/$$file \"$(distdir)/$$file\" \\\n\t    || exit 1; \\\n\t  fi; \\\n\tdone\ncheck-am: all-am\ncheck: check-am\nall-am: Makefile $(HEADERS)\ninstalldirs:\n\tfor dir in \"$(DESTDIR)$(includedir)\"; do \\\n\t  test -z \"$$dir\" || $(MKDIR_P) \"$$dir\"; \\\n\tdone\ninstall: install-am\ninstall-exec: install-exec-am\ninstall-data: install-data-am\nuninstall: uninstall-am\n\ninstall-am: all-am\n\t@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am\n\ninstallcheck: installcheck-am\ninstall-strip:\n\tif test -z '$(STRIP)'; then \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t      install; \\\n\telse \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t    \"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'\" install; \\\n\tfi\nmostlyclean-generic:\n\nclean-generic:\n\ndistclean-generic:\n\t-test -z \"$(CONFIG_CLEAN_FILES)\" || rm -f $(CONFIG_CLEAN_FILES)\n\t-test . = \"$(srcdir)\" || test -z \"$(CONFIG_CLEAN_VPATH_FILES)\" || rm -f $(CONFIG_CLEAN_VPATH_FILES)\n\nmaintainer-clean-generic:\n\t@echo \"This command is intended for maintainers to use\"\n\t@echo \"it deletes files that may require special tools to rebuild.\"\nclean: clean-am\n\nclean-am: clean-generic clean-libtool mostlyclean-am\n\ndistclean: distclean-am\n\t-rm -f Makefile\ndistclean-am: clean-am distclean-generic distclean-tags\n\ndvi: dvi-am\n\ndvi-am:\n\nhtml: html-am\n\nhtml-am:\n\ninfo: info-am\n\ninfo-am:\n\ninstall-data-am: install-nobase_includeHEADERS\n\ninstall-dvi: install-dvi-am\n\ninstall-dvi-am:\n\ninstall-exec-am:\n\ninstall-html: install-html-am\n\ninstall-html-am:\n\ninstall-info: install-info-am\n\ninstall-info-am:\n\ninstall-man:\n\ninstall-pdf: install-pdf-am\n\ninstall-pdf-am:\n\ninstall-ps: install-ps-am\n\ninstall-ps-am:\n\ninstallcheck-am:\n\nmaintainer-clean: maintainer-clean-am\n\t-rm -f Makefile\nmaintainer-clean-am: distclean-am maintainer-clean-generic\n\nmostlyclean: mostlyclean-am\n\nmostlyclean-am: mostlyclean-generic mostlyclean-libtool\n\npdf: pdf-am\n\npdf-am:\n\nps: ps-am\n\nps-am:\n\nuninstall-am: uninstall-nobase_includeHEADERS\n\n.MAKE: install-am install-strip\n\n.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \\\n\tclean-libtool ctags distclean distclean-generic \\\n\tdistclean-libtool distclean-tags distdir dvi dvi-am html \\\n\thtml-am info info-am install install-am install-data \\\n\tinstall-data-am install-dvi install-dvi-am install-exec \\\n\tinstall-exec-am install-html install-html-am install-info \\\n\tinstall-info-am install-man install-nobase_includeHEADERS \\\n\tinstall-pdf install-pdf-am install-ps install-ps-am \\\n\tinstall-strip installcheck installcheck-am installdirs \\\n\tmaintainer-clean maintainer-clean-generic mostlyclean \\\n\tmostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \\\n\ttags uninstall uninstall-am uninstall-nobase_includeHEADERS\n\n\n# Tell versions [3.59,3.63) of GNU make to not export all variables.\n# Otherwise a system limit (for SysV at least) may be exceeded.\n.NOEXPORT:\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2002-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n/**@file gmm.h\n   @author  Yves Renard <Yves.Renard@insa-lyon.fr>\n   @date October 13, 2002.\n   @brief Include common gmm files.\n*/\n#ifndef GMM_H__\n#define GMM_H__\n\n#include \"gmm_kernel.h\"\n#include \"gmm_dense_lu.h\"\n#include \"gmm_dense_qr.h\"\n\n#include \"gmm_iter_solvers.h\"\n#include \"gmm_condition_number.h\"\n#include \"gmm_inoutput.h\"\n\n#include \"gmm_lapack_interface.h\"\n#include \"gmm_superlu_interface.h\"\n#include \"gmm_range_basis.h\"\n\n#include \"gmm_domain_decomp.h\"\n\n#endif //  GMM_H__\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_MUMPS_interface.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2003-2012 Yves Renard, Julien Pommier\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n/**@file gmm_MUMPS_interface.h\n   @author Yves Renard <Yves.Renard@insa-lyon.fr>,\n   @author Julien Pommier <Julien.Pommier@insa-toulouse.fr>\n   @date December 8, 2005.\n   @brief Interface with MUMPS (LU direct solver for sparse matrices).\n*/\n#if defined(GMM_USES_MUMPS) || defined(HAVE_DMUMPS_C_H)\n\n#ifndef GMM_MUMPS_INTERFACE_H\n#define GMM_MUMPS_INTERFACE_H\n\n#include \"gmm_kernel.h\"\n\n\nextern \"C\" {\n\n#include <smumps_c.h>\n#undef F_INT\n#undef F_DOUBLE\n#undef F_DOUBLE2\n#include <dmumps_c.h>\n#undef F_INT\n#undef F_DOUBLE\n#undef F_DOUBLE2\n#include <cmumps_c.h>\n#undef F_INT\n#undef F_DOUBLE\n#undef F_DOUBLE2\n#include <zmumps_c.h>\n#undef F_INT\n#undef F_DOUBLE\n#undef F_DOUBLE2\n\n}\n\nnamespace gmm {\n\n  template <typename T> struct ij_sparse_matrix {\n    std::vector<int> irn;\n    std::vector<int> jcn;\n    std::vector<T>        a;\n    \n    template <typename L> void store(const L& l, size_type i) {\n       typename linalg_traits<L>::const_iterator it = vect_const_begin(l),\n         ite = vect_const_end(l);\n       for (; it != ite; ++it)\n         { irn.push_back((int)i + 1); jcn.push_back((int)it.index() + 1); a.push_back(*it); }\n    }\n\n    template <typename L> void build_from(const L& l, row_major) {\n      for (size_type i = 0; i < mat_nrows(l); ++i)\n        store(mat_const_row(l, i), i);\n    }\n\n    template <typename L> void build_from(const L& l, col_major) {\n      for (size_type i = 0; i < mat_ncols(l); ++i)\n        store(mat_const_col(l, i), i);\n      irn.swap(jcn);\n    }\n\n    template <typename L> ij_sparse_matrix(const L& A) {\n      size_type nz = nnz(A);\n      irn.reserve(nz); jcn.reserve(nz); a.reserve(nz);\n      build_from(A,  typename principal_orientation_type<typename\n               linalg_traits<L>::sub_orientation>::potype());\n    }\n  };\n\n  /* ********************************************************************* */\n  /*   MUMPS solve interface                                               */\n  /* ********************************************************************* */\n\n\n  template <typename T> struct mumps_interf {};\n\n  template <> struct mumps_interf<float> {\n    typedef SMUMPS_STRUC_C  MUMPS_STRUC_C;\n    typedef float value_type;\n\n    static void mumps_c(MUMPS_STRUC_C &id) { smumps_c(&id); }\n  };\n\n  template <> struct mumps_interf<double> {\n    typedef DMUMPS_STRUC_C  MUMPS_STRUC_C;\n    typedef double value_type;\n    static void mumps_c(MUMPS_STRUC_C &id) { dmumps_c(&id); }\n  };\n\n  template <> struct mumps_interf<std::complex<float> > {\n    typedef CMUMPS_STRUC_C  MUMPS_STRUC_C;\n    typedef mumps_complex value_type;\n    static void mumps_c(MUMPS_STRUC_C &id) { cmumps_c(&id); }\n  };\n\n  template <> struct mumps_interf<std::complex<double> > {\n    typedef ZMUMPS_STRUC_C  MUMPS_STRUC_C;\n    typedef mumps_double_complex value_type;\n    static void mumps_c(MUMPS_STRUC_C &id) { zmumps_c(&id); }\n  };\n\n\n  /** MUMPS solve interface  \n   *  Works only with sparse or skyline matrices\n   */\n  template <typename MAT, typename VECTX, typename VECTB>\n  bool MUMPS_solve(const MAT &A, const VECTX &X_, const VECTB &B) {\n    VECTX &X = const_cast<VECTX &>(X_);\n\n    typedef typename linalg_traits<MAT>::value_type T;\n    typedef typename mumps_interf<T>::value_type MUMPS_T;\n    GMM_ASSERT2(gmm::mat_nrows(A) == gmm::mat_ncols(A), \"Non square matrix\");\n  \n    std::vector<T> rhs(gmm::vect_size(B)); gmm::copy(B, rhs);\n  \n    ij_sparse_matrix<T> AA(A);\n  \n    const int JOB_INIT = -1;\n    const int JOB_END = -2;\n    const int USE_COMM_WORLD = -987654;\n\n    typename mumps_interf<T>::MUMPS_STRUC_C id;\n\n#ifdef GMM_USES_MPI\n    int rank;\n    MPI_Comm_rank(MPI_COMM_WORLD, &rank);\n#endif\n    \n    id.job = JOB_INIT;\n    id.par = 1;\n    id.sym = 0;\n    id.comm_fortran = USE_COMM_WORLD;\n    mumps_interf<T>::mumps_c(id);\n    \n#ifdef GMM_USES_MPI\n    if (rank == 0) {\n#endif\n      id.n = (int)gmm::mat_nrows(A);\n      id.nz = (int)AA.irn.size();\n      id.irn = &(AA.irn[0]);\n      id.jcn = &(AA.jcn[0]);\n      id.a = (MUMPS_T*)(&(AA.a[0]));\n      id.rhs = (MUMPS_T*)(&(rhs[0]));\n#ifdef GMM_USES_MPI\n    }\n#endif\n\n#define ICNTL(I) icntl[(I)-1]\n    id.ICNTL(1) = -1; // output stream for error messages\n    id.ICNTL(2) = -1; // output stream for other messages\n    id.ICNTL(3) = -1; // output stream for global information\n    id.ICNTL(4) = 0;  // verbosity level\n    \n    id.ICNTL(14) += 80; /* small boost to the workspace size as we have encountered some problem\n                           who did not fit in the default settings of mumps.. \n                           by default, ICNTL(14) = 15 or 20\n                       */\n    //cout << \"ICNTL(14): \" << id.ICNTL(14) << \"\\n\";\n\n    // id.ICNTL(22) = 1;   /* enables out-of-core support */\n\n    id.job = 6;\n    mumps_interf<T>::mumps_c(id);\n    bool ok = mumps_error_check(id);\n\n    id.job = JOB_END;\n    mumps_interf<T>::mumps_c(id);\n\n    gmm::copy(rhs, X);\n\n    return ok;\n\n#undef ICNTL\n\n  }\n\n\n\n  /** MUMPS solve interface for distributed matrices \n   *  Works only with sparse or skyline matrices\n   */\n  template <typename MAT, typename VECTX, typename VECTB>\n  bool MUMPS_distributed_matrix_solve(const MAT &A, const VECTX &X_,\n                                      const VECTB &B) {\n    VECTX &X = const_cast<VECTX &>(X_);\n\n    typedef typename linalg_traits<MAT>::value_type T;\n    typedef typename mumps_interf<T>::value_type MUMPS_T;\n    GMM_ASSERT2(gmm::mat_nrows(A) == gmm::mat_ncols(A), \"Non-square matrix\");\n  \n    std::vector<T> rhs(gmm::vect_size(B)); gmm::copy(B, rhs);\n\n    ij_sparse_matrix<T> AA(A);\n  \n    const int JOB_INIT = -1;\n    const int JOB_END = -2;\n    const int USE_COMM_WORLD = -987654;\n\n    typename mumps_interf<T>::MUMPS_STRUC_C id;\n\n#ifdef GMM_USES_MPI\n    int rank;\n    MPI_Comm_rank(MPI_COMM_WORLD, &rank);\n#endif\n    \n    id.job = JOB_INIT;\n    id.par = 1;\n    id.sym = 0;\n    id.comm_fortran = USE_COMM_WORLD;\n    mumps_interf<T>::mumps_c(id);\n    \n    id.n = gmm::mat_nrows(A);\n    id.nz_loc = AA.irn.size();\n    id.irn_loc = &(AA.irn[0]);\n    id.jcn_loc = &(AA.jcn[0]);\n    id.a_loc = (MUMPS_T*)(&(AA.a[0]));\n\n#ifdef GMM_USES_MPI\n    if (rank == 0) {\n#endif\n      id.rhs = (MUMPS_T*)(&(rhs[0]));\n#ifdef GMM_USES_MPI\n    }\n#endif\n\n#define ICNTL(I) icntl[(I)-1]\n    id.ICNTL(1) = -1; // output stream for error messages\n    id.ICNTL(2) = 6;  // id.ICNTL(2) = -1; // output stream for other messages\n    id.ICNTL(3) = 6;  // id.ICNTL(3) = -1; // output stream for global information\n    id.ICNTL(4) = 2;  // verbosity level\n\n    id.ICNTL(5) = 0;  // assembled input matrix (default)\n    id.ICNTL(18) = 3; // strategy for distributed input matrix\n\n    id.job = 6;\n    mumps_interf<T>::mumps_c(id);\n    bool ok = mumps_error_check(id);\n\n    id.job = JOB_END;\n    mumps_interf<T>::mumps_c(id);\n#ifdef GMM_USES_MPI\n    MPI_Bcast(&(rhs[0]),id.n,gmm::mpi_type(T()),0,MPI_COMM_WORLD);\n#endif\n    gmm::copy(rhs, X);\n\n    return ok;\n\n#undef ICNTL\n\n  }\n\n\n  template <typename MUMPS_STRUCT>\n  static inline bool mumps_error_check(MUMPS_STRUCT &id) {\n#define INFO(I) info[(I)-1]\n    if (id.INFO(1) < 0) {\n      switch (id.INFO(1)) {\n        case -2:\n          GMM_ASSERT1(false, \"Solve with MUMPS failed: NZ = \" << id.INFO(2)\n                      << \" is out of range\");\n        case -6 : case -10 :\n          GMM_WARNING1(\"Solve with MUMPS failed: matrix is singular\");\n          return false;\n        case -9:\n          GMM_ASSERT1(false, \"Solve with MUMPS failed: error \"\n                      << id.INFO(1) << \", increase ICNTL(14)\");\n        case -13 :\n          GMM_ASSERT1(false, \"Solve with MUMPS failed: not enough memory\");\n        default :\n          GMM_ASSERT1(false, \"Solve with MUMPS failed with error \"\n                      << id.INFO(1));\n      }\n    }\n    return true;\n#undef INFO\n  }\n\n\n}\n\n  \n#endif // GMM_MUMPS_INTERFACE_H\n\n#endif // GMM_USES_MUMPS\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_algobase.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2000-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n/** @file gmm_algobase.h \n   @author  Yves Renard <Yves.Renard@insa-lyon.fr>\n   @date September 28, 2000.\n    @brief Miscelleanous algorithms on containers.\n*/\n\n#ifndef GMM_ALGOBASE_H__\n#define GMM_ALGOBASE_H__\n#include \"gmm_std.h\"\n#include \"gmm_except.h\"\n#include <functional>\n\nnamespace gmm {\n\n  /* ********************************************************************* */\n  /* Definitition de classes de comparaison.                               */\n  /* retournant un int.                                                    */\n  /* ********************************************************************* */\n  \n  template <class T>\n    struct less : public std::binary_function<T, T, int> {\n    inline int operator()(const T& x, const T& y) const\n    { return (x < y) ? -1 : ((y < x) ? 1 : 0); }\n  };\n\n  template<> struct less<int> : public std::binary_function<int, int, int>\n  { int operator()(int x, int y) const { return x-y; } };\n  template<> struct less<char> : public std::binary_function<char, char, int>\n  { int operator()(char x, char y) const { return int(x-y); } };\n  template<> struct less<short> : public std::binary_function<short,short,int>\n  { int operator()(short x, short y) const { return int(x-y); } };\n  template<> struct less<unsigned char>\n     : public std::binary_function<unsigned char, unsigned char, int> {\n    int operator()(unsigned char x, unsigned char y) const\n    { return int(x)-int(y); }\n  };\n  \n\n  template <class T>\n    struct greater : public std::binary_function<T, T, int> {\n    inline int operator()(const T& x, const T& y) const\n    { return (y < x) ? -1 : ((x < y) ? 1 : 0); }\n  };\n\n  template<> struct greater<int> : public std::binary_function<int, int, int>\n  { int operator()(int x, int y) const { return y-x; } };\n  template<> struct greater<char> : public std::binary_function<char,char,int>\n  { int operator()(char x, char y) const { return int(y-x); } };\n  template<> struct greater<short>\n      : public std::binary_function<short, short, int>\n  { int operator()(short x, short y) const { return int(y-x); } };\n  template<> struct greater<unsigned char>\n    : public std::binary_function<unsigned char, unsigned char, int> {\n    int operator()(unsigned char x, unsigned char y) const\n      { return int(y)-int(x); }\n  };\n\n  template <typename T> inline T my_abs(T a) { return (a < T(0)) ? T(-a) : a; }\n  \n  template <class T>\n    struct approx_less : public std::binary_function<T, T, int> { \n    double eps;\n    inline int operator()(const T &x, const T &y) const\n    { if (my_abs(x - y) <= eps) return 0; if (x < y) return -1; return 1; }\n    approx_less(double e = 1E-13) { eps = e; }\n  };\n\n  template <class T>\n    struct approx_greater : public std::binary_function<T, T, int> { \n    double eps;\n    inline int operator()(const T &x, const T &y) const\n    { if (my_abs(x - y) <= eps) return 0; if (x > y) return -1; return 1; }\n    approx_greater(double e = 1E-13) { eps = e; }\n  };\n\n  template<class ITER1, class ITER2, class COMP>\n    int lexicographical_compare(ITER1 b1, const ITER1 &e1,\n\t\t\t\tITER2 b2, const ITER2 &e2, const COMP &c)  {\n    int i;\n    for ( ; b1 != e1 && b2 != e2; ++b1, ++b2)\n      if ((i = c(*b1, *b2)) != 0) return i;\n    if (b1 != e1) return 1; if (b2 != e2) return -1; return 0; \n  }\n\n  template<class CONT, class COMP = gmm::less<typename CONT::value_type> >\n    struct lexicographical_less : public std::binary_function<CONT, CONT, int>\n  { \n    COMP c;\n    int operator()(const CONT &x, const CONT &y) const {\n      return gmm::lexicographical_compare(x.begin(), x.end(),\n\t\t\t\t\t  y.begin(), y.end(), c);\n    }\n    lexicographical_less(const COMP &d = COMP()) { c = d; }\n  };\n\n  template<class CONT, class COMP = gmm::less<typename CONT::value_type> >\n  struct lexicographical_greater\n    : public std::binary_function<CONT, CONT, int> { \n    COMP c;\n    int operator()(const CONT &x, const CONT &y) const {\n      return -gmm::lexicographical_compare(x.begin(), x.end(),\n\t\t\t\t\t   y.begin(), y.end(), c);\n    }\n    lexicographical_greater(const COMP &d = COMP()) { c = d; }\n  };\n  \n\n  /* ********************************************************************* */\n  /* \"Virtual\" iterators on sequences.                                     */\n  /* The class T represent a class of sequence.                            */\n  /* ********************************************************************* */\n\n  template<class T> struct sequence_iterator {\n    \n    typedef T             value_type;\n    typedef value_type*   pointer;\n    typedef value_type&   reference;\n    typedef const value_type& const_reference;\n    typedef std::forward_iterator_tag iterator_category;\n\n    T Un;\n\n    sequence_iterator(T U0 = T(0)) { Un = U0; }\n    \n    sequence_iterator &operator ++()\n    { ++Un; return *this; }\n    sequence_iterator operator ++(int)\n    { sequence_iterator tmp = *this; (*this)++; return tmp; }\n\t\n    const_reference operator *() const { return Un; }\n    reference operator *() { return Un; }\n    \n    bool operator ==(const sequence_iterator &i) const { return (i.Un==Un);}\n    bool operator !=(const sequence_iterator &i) const { return (i.Un!=Un);}\n  };\n\n  /* ********************************************************************* */\n  /* generic algorithms.                                                   */\n  /* ********************************************************************* */\n\n  template <class ITER1, class SIZE, class ITER2>\n  ITER2 copy_n(ITER1 first, SIZE count, ITER2 result) {\n    for ( ; count > 0; --count, ++first, ++result) *result = *first;\n    return result;\n  }\n\n  template<class ITER>\n    typename std::iterator_traits<ITER>::value_type\n      mean_value(ITER first, const ITER &last) {\n    GMM_ASSERT2(first != last, \"mean value of empty container\");\n    size_t n = 1;\n    typename std::iterator_traits<ITER>::value_type res = *first++;\n    while (first != last) { res += *first; ++first; ++n; }\n    res /= float(n);\n    return res;\n  }\n\n  template<class CONT>\n    typename CONT::value_type\n  mean_value(const CONT &c) { return mean_value(c.begin(), c.end()); }\n\n  template<class ITER> /* hum ... */\n    void minmax_box(typename std::iterator_traits<ITER>::value_type &pmin,\n\t\t    typename std::iterator_traits<ITER>::value_type &pmax,\n\t\t    ITER first, const ITER &last) {\n    typedef typename std::iterator_traits<ITER>::value_type PT;\n    if (first != last) { pmin = pmax = *first; ++first; }\n    while (first != last) {\n      typename PT::const_iterator b = (*first).begin(), e = (*first).end();\n      typename PT::iterator b1 = pmin.begin(), b2 = pmax.begin();\n      while (b != e)\n\t{ *b1 = std::min(*b1, *b); *b2 = std::max(*b2, *b); ++b; ++b1; ++b2; }\n    }\n  }\n\n  template<typename VEC> struct sorted_indexes_aux {\n    const VEC &v;\n  public:\n    sorted_indexes_aux(const VEC& v_) : v(v_) {}\n    template <typename IDX>\n    bool operator()(const IDX &ia, const IDX &ib) const\n    { return v[ia] < v[ib]; }\n  };\n\n  template<typename VEC, typename IVEC> \n  void sorted_indexes(const VEC &v, IVEC &iv) {\n    iv.clear(); iv.resize(v.size());\n    for (size_t i=0; i < v.size(); ++i) iv[i] = i;\n    std::sort(iv.begin(), iv.end(), sorted_indexes_aux<VEC>(v));\n  }\n\n}\n\n\n#endif /* GMM_ALGOBASE_H__ */\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_blas.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2002-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n/**@file gmm_blas.h\n   @author  Yves Renard <Yves.Renard@insa-lyon.fr>\n   @date October 13, 2002.\n   @brief Basic linear algebra functions.\n*/\n\n#ifndef GMM_BLAS_H__\n#define GMM_BLAS_H__\n\n#include \"gmm_scaled.h\"\n#include \"gmm_transposed.h\"\n#include \"gmm_conjugated.h\"\n\nnamespace gmm {\n\n  /* ******************************************************************** */\n  /*\t\t                                         \t\t  */\n  /*\t\tGeneric algorithms                           \t\t  */\n  /*\t\t                                         \t\t  */\n  /* ******************************************************************** */\n\n\n  /* ******************************************************************** */\n  /*\t\tMiscellaneous                           \t\t  */\n  /* ******************************************************************** */\n\n  /** clear (fill with zeros) a vector or matrix. */\n  template <typename L> inline void clear(L &l)\n  { linalg_traits<L>::do_clear(l); }\n  /** @cond DOXY_SHOW_ALL_FUNCTIONS \n      skip all these redundant definitions in doxygen documentation..\n   */\n  template <typename L> inline void clear(const L &l)\n  { linalg_traits<L>::do_clear(linalg_const_cast(l)); }\n\n  ///@endcond\n  /** count the number of non-zero entries of a vector or matrix. */  template <typename L> inline size_type nnz(const L& l)\n  { return nnz(l, typename linalg_traits<L>::linalg_type()); }\n\n  ///@cond DOXY_SHOW_ALL_FUNCTIONS\n  template <typename L> inline size_type nnz(const L& l, abstract_vector) { \n    typename linalg_traits<L>::const_iterator it = vect_const_begin(l),\n      ite = vect_const_end(l);\n    size_type res(0);\n    for (; it != ite; ++it) ++res;\n    return res;\n  }\n\n  template <typename L> inline size_type nnz(const L& l, abstract_matrix) {\n    return nnz(l,  typename principal_orientation_type<typename\n\t       linalg_traits<L>::sub_orientation>::potype());\n  }\n\n  template <typename L> inline size_type nnz(const L& l, row_major) {\n    size_type res(0);\n    for (size_type i = 0; i < mat_nrows(l); ++i)\n      res += nnz(mat_const_row(l, i));\n    return res;\n  } \n\n  template <typename L> inline size_type nnz(const L& l, col_major) {\n    size_type res(0);\n    for (size_type i = 0; i < mat_ncols(l); ++i)\n      res += nnz(mat_const_col(l, i));\n    return res;\n  }\n\n  ///@endcond\n\n\n  /** fill a vector or matrix with x. */\n  template <typename L> inline\n  void fill(L& l, typename gmm::linalg_traits<L>::value_type x) {\n    typedef typename gmm::linalg_traits<L>::value_type T;\n    if (x == T(0)) gmm::clear(l);\n    fill(l, x, typename linalg_traits<L>::linalg_type());\n  }\n\n  template <typename L> inline\n  void fill(const L& l, typename gmm::linalg_traits<L>::value_type x) {\n    fill(linalg_const_cast(l), x);\n  }\n\n  template <typename L> inline // to be optimized for dense vectors ...\n  void fill(L& l,  typename gmm::linalg_traits<L>::value_type x,\n\t\t   abstract_vector) {\n    for (size_type i = 0; i < vect_size(l); ++i) l[i] = x;\n  }\n\n  template <typename L> inline // to be optimized for dense matrices ...\n  void fill(L& l, typename gmm::linalg_traits<L>::value_type x,\n\t\t   abstract_matrix) {\n    for (size_type i = 0; i < mat_nrows(l); ++i)\n      for (size_type j = 0; j < mat_ncols(l); ++j)\n\tl(i,j) = x;\n  }\n\n  /** fill a vector or matrix with random value (uniform [-1,1]). */\n  template <typename L> inline void fill_random(L& l)\n  { fill_random(l, typename linalg_traits<L>::linalg_type()); }\n\n  ///@cond DOXY_SHOW_ALL_FUNCTIONS\n  template <typename L> inline void fill_random(const L& l) {\n    fill_random(linalg_const_cast(l),\n\t\ttypename linalg_traits<L>::linalg_type());\n  }\n\n  template <typename L> inline void fill_random(L& l, abstract_vector) {\n    for (size_type i = 0; i < vect_size(l); ++i)\n      l[i] = gmm::random(typename linalg_traits<L>::value_type());\n  }\n\n  template <typename L> inline void fill_random(L& l, abstract_matrix) {\n    for (size_type i = 0; i < mat_nrows(l); ++i)\n      for (size_type j = 0; j < mat_ncols(l); ++j)\n\tl(i,j) = gmm::random(typename linalg_traits<L>::value_type());\n  }\n\n  ///@endcond\n  /** fill a vector or matrix with random value.\n      @param l a vector or matrix.\n      @param cfill probability of a non-zero value.\n  */\n  template <typename L> inline void fill_random(L& l, double cfill)\n  { fill_random(l, cfill, typename linalg_traits<L>::linalg_type()); }\n  ///@cond DOXY_SHOW_ALL_FUNCTIONS\n\n  template <typename L> inline void fill_random(const L& l, double cfill) {\n    fill_random(linalg_const_cast(l), cfill,\n\t\ttypename linalg_traits<L>::linalg_type());\n  }\n\n  template <typename L> inline\n  void fill_random(L& l, double cfill, abstract_vector) {\n    typedef typename linalg_traits<L>::value_type T;\n    size_type ntot = std::min(vect_size(l),\n\t\t\t      size_type(double(vect_size(l))*cfill) + 1);\n    for (size_type nb = 0; nb < ntot;) {\n      size_type i = gmm::irandom(vect_size(l));\n      if (l[i] == T(0)) { \n\tl[i] = gmm::random(typename linalg_traits<L>::value_type());\n\t++nb;\n      }\n    }\n  }\n\n  template <typename L> inline\n  void fill_random(L& l, double cfill, abstract_matrix) {\n    fill_random(l, cfill, typename principal_orientation_type<typename\n\t\tlinalg_traits<L>::sub_orientation>::potype());\n  }\n\n  template <typename L> inline\n  void fill_random(L& l, double cfill, row_major) {\n    for (size_type i=0; i < mat_nrows(l); ++i) fill_random(mat_row(l,i),cfill);\n  }\n\n  template <typename L> inline\n  void fill_random(L& l, double cfill, col_major) {\n    for (size_type j=0; j < mat_ncols(l); ++j) fill_random(mat_col(l,j),cfill);\n  }\n\n  /* resize a vector */\n  template <typename V> inline\n  void resize(V &v, size_type n, linalg_false)\n  { linalg_traits<V>::resize(v, n); }\n\n  template <typename V> inline\n  void resize(V &, size_type , linalg_modifiable)\n  { GMM_ASSERT1(false, \"You cannot resize a reference\"); }\n\n  template <typename V> inline\n  void resize(V &, size_type , linalg_const)\n  { GMM_ASSERT1(false, \"You cannot resize a reference\"); }\n\n  ///@endcond\n  /** resize a vector. */\n   template <typename V> inline\n  void resize(V &v, size_type n) {\n    resize(v, n, typename linalg_traits<V>::is_reference());\n  }\n  ///@cond DOXY_SHOW_ALL_FUNCTIONS\n\n  /** resize a matrix **/\n  template <typename M> inline\n  void resize(M &v, size_type m, size_type n, linalg_false) {\n    linalg_traits<M>::resize(v, m, n);\n  }\n\n  template <typename M> inline\n  void resize(M &, size_type, size_type, linalg_modifiable)\n  { GMM_ASSERT1(false, \"You cannot resize a reference\"); }\n\n  template <typename M> inline\n  void resize(M &, size_type, size_type, linalg_const)\n  { GMM_ASSERT1(false, \"You cannot resize a reference\"); }\n\n  ///@endcond \n  /** resize a matrix */\n  template <typename M> inline\n  void resize(M &v, size_type m, size_type n)\n  { resize(v, m, n, typename linalg_traits<M>::is_reference()); }\n  ///@cond\n\n  template <typename M> inline\n  void reshape(M &v, size_type m, size_type n, linalg_false)\n  { linalg_traits<M>::reshape(v, m, n); }\n\n  template <typename M> inline\n  void reshape(M &, size_type, size_type, linalg_modifiable)\n  { GMM_ASSERT1(false, \"You cannot reshape a reference\"); }\n\n  template <typename M> inline\n  void reshape(M &, size_type, size_type, linalg_const)\n  { GMM_ASSERT1(false, \"You cannot reshape a reference\"); }\n\n  ///@endcond \n  /** reshape a matrix */\n  template <typename M> inline\n  void reshape(M &v, size_type m, size_type n)\n  { reshape(v, m, n, typename linalg_traits<M>::is_reference()); }\n  ///@cond DOXY_SHOW_ALL_FUNCTIONS\n  \n\n  /* ******************************************************************** */\n  /*\t\tScalar product                             \t\t  */\n  /* ******************************************************************** */\n\n  ///@endcond\n  /** scalar product between two vectors */\n  template <typename V1, typename V2> inline\n  typename strongest_value_type<V1,V2>::value_type\n    vect_sp(const V1 &v1, const V2 &v2) {\n    GMM_ASSERT2(vect_size(v1) == vect_size(v2), \"dimensions mismatch\");\n    return vect_sp(v1, v2,\n\t\t   typename linalg_traits<V1>::storage_type(), \n\t\t   typename linalg_traits<V2>::storage_type());\n  }\n\n  /** scalar product between two vectors, using a matrix.\n      @param ps the matrix of the scalar product.\n      @param v1 the first vector\n      @param v2 the second vector\n  */\n  template <typename MATSP, typename V1, typename V2> inline\n  typename strongest_value_type3<V1,V2,MATSP>::value_type\n    vect_sp(const MATSP &ps, const V1 &v1, const V2 &v2) {\n    return vect_sp_with_mat(ps, v1, v2,\n\t\t\t    typename linalg_traits<MATSP>::sub_orientation());\n  }\n  ///@cond DOXY_SHOW_ALL_FUNCTIONS\n\n  template <typename MATSP, typename V1, typename V2> inline\n    typename strongest_value_type3<V1,V2,MATSP>::value_type\n    vect_sp_with_mat(const MATSP &ps, const V1 &v1, const V2 &v2, row_major) {\n    return vect_sp_with_matr(ps, v1, v2, \n\t\t\t     typename linalg_traits<V2>::storage_type());\n  }\n\n  template <typename MATSP, typename V1, typename V2> inline \n    typename strongest_value_type3<V1,V2,MATSP>::value_type\n    vect_sp_with_matr(const MATSP &ps, const V1 &v1, const V2 &v2,\n\t\t      abstract_sparse) {\n    GMM_ASSERT2(vect_size(v1) == mat_ncols(ps) &&\n\t\tvect_size(v2) == mat_nrows(ps), \"dimensions mismatch\");\n    size_type nr = mat_nrows(ps);\n    typename linalg_traits<V2>::const_iterator\n      it = vect_const_begin(v2), ite = vect_const_end(v2);\n    typename strongest_value_type3<V1,V2,MATSP>::value_type res(0);\n    for (; it != ite; ++it)\n      res += vect_sp(mat_const_row(ps, it.index()), v1)* (*it);\n    return res;\n  }\n\n  template <typename MATSP, typename V1, typename V2> inline\n    typename strongest_value_type3<V1,V2,MATSP>::value_type\n    vect_sp_with_matr(const MATSP &ps, const V1 &v1, const V2 &v2,\n\t\t      abstract_skyline)\n  { return vect_sp_with_matr(ps, v1, v2, abstract_sparse()); }\n\n  template <typename MATSP, typename V1, typename V2> inline\n    typename strongest_value_type3<V1,V2,MATSP>::value_type\n    vect_sp_with_matr(const MATSP &ps, const V1 &v1, const V2 &v2,\n\t\t      abstract_dense) {\n    GMM_ASSERT2(vect_size(v1) == mat_ncols(ps) &&\n\t\tvect_size(v2) == mat_nrows(ps), \"dimensions mismatch\");\n    typename linalg_traits<V2>::const_iterator\n      it = vect_const_begin(v2), ite = vect_const_end(v2);\n    typename strongest_value_type3<V1,V2,MATSP>::value_type res(0);\n    for (size_type i = 0; it != ite; ++i, ++it)\n      res += vect_sp(mat_const_row(ps, i), v1) * (*it);\n    return res;\n  }\n\n  template <typename MATSP, typename V1, typename V2> inline\n  typename strongest_value_type3<V1,V2,MATSP>::value_type\n  vect_sp_with_mat(const MATSP &ps, const V1 &v1,const V2 &v2,row_and_col)\n  { return vect_sp_with_mat(ps, v1, v2, row_major()); }\n\n  template <typename MATSP, typename V1, typename V2> inline\n  typename strongest_value_type3<V1,V2,MATSP>::value_type\n  vect_sp_with_mat(const MATSP &ps, const V1 &v1, const V2 &v2,col_major){\n    return vect_sp_with_matc(ps, v1, v2,\n\t\t\t     typename linalg_traits<V1>::storage_type());\n  }\n\n  template <typename MATSP, typename V1, typename V2> inline\n    typename strongest_value_type3<V1,V2,MATSP>::value_type\n    vect_sp_with_matc(const MATSP &ps, const V1 &v1, const V2 &v2,\n\t\t      abstract_sparse) {\n    GMM_ASSERT2(vect_size(v1) == mat_ncols(ps) &&\n\t\tvect_size(v2) == mat_nrows(ps),\"dimensions mismatch\");\n    typename linalg_traits<V1>::const_iterator\n      it = vect_const_begin(v1), ite = vect_const_end(v1);\n    typename strongest_value_type3<V1,V2,MATSP>::value_type res(0);\n    for (; it != ite; ++it)\n      res += vect_sp(mat_const_col(ps, it.index()), v2) * (*it);\n    return res;\n  }\n\n  template <typename MATSP, typename V1, typename V2> inline\n    typename strongest_value_type3<V1,V2,MATSP>::value_type\n    vect_sp_with_matc(const MATSP &ps, const V1 &v1, const V2 &v2,\n\t\t      abstract_skyline)\n  { return vect_sp_with_matc(ps, v1, v2, abstract_sparse()); }\n\n  template <typename MATSP, typename V1, typename V2> inline\n    typename strongest_value_type3<V1,V2,MATSP>::value_type\n    vect_sp_with_matc(const MATSP &ps, const V1 &v1, const V2 &v2,\n\t\t      abstract_dense) {\n    GMM_ASSERT2(vect_size(v1) == mat_ncols(ps) &&\n\t\tvect_size(v2) == mat_nrows(ps), \"dimensions mismatch\");\n    typename linalg_traits<V1>::const_iterator\n      it = vect_const_begin(v1), ite = vect_const_end(v1);\n    typename strongest_value_type3<V1,V2,MATSP>::value_type res(0);\n    for (size_type i = 0; it != ite; ++i, ++it)\n      res += vect_sp(mat_const_col(ps, i), v2) * (*it);\n    return res;\n  }\n\n  template <typename MATSP, typename V1, typename V2> inline\n  typename strongest_value_type3<V1,V2,MATSP>::value_type\n  vect_sp_with_mat(const MATSP &ps, const V1 &v1,const V2 &v2,col_and_row)\n  { return vect_sp_with_mat(ps, v1, v2, col_major()); }\n\n  template <typename MATSP, typename V1, typename V2> inline\n  typename strongest_value_type3<V1,V2,MATSP>::value_type\n  vect_sp_with_mat(const MATSP &ps, const V1 &v1, const V2 &v2,\n\t\t   abstract_null_type) {\n    typename temporary_vector<V1>::vector_type w(mat_nrows(ps));\n    GMM_WARNING2(\"Warning, a temporary is used in scalar product\\n\");\n    mult(ps, v1, w); \n    return vect_sp(w, v2);\n  }\n\n  template <typename IT1, typename IT2> inline\n  typename strongest_numeric_type<typename std::iterator_traits<IT1>::value_type,\n\t\t\t\t  typename std::iterator_traits<IT2>::value_type>::T\n  vect_sp_dense_(IT1 it, IT1 ite, IT2 it2) {\n    typename strongest_numeric_type<typename std::iterator_traits<IT1>::value_type,\n      typename std::iterator_traits<IT2>::value_type>::T res(0);\n    for (; it != ite; ++it, ++it2) res += (*it) * (*it2);\n    return res;\n  }\n  \n  template <typename IT1, typename V> inline\n    typename strongest_numeric_type<typename std::iterator_traits<IT1>::value_type,\n\t\t\t\t    typename linalg_traits<V>::value_type>::T\n    vect_sp_sparse_(IT1 it, IT1 ite, const V &v) {\n      typename strongest_numeric_type<typename std::iterator_traits<IT1>::value_type,\n\ttypename linalg_traits<V>::value_type>::T res(0);\n    for (; it != ite; ++it) res += (*it) * v[it.index()];\n    return res;\n  }\n\n  template <typename V1, typename V2> inline\n  typename strongest_value_type<V1,V2>::value_type\n    vect_sp(const V1 &v1, const V2 &v2, abstract_dense, abstract_dense) {\n    return vect_sp_dense_(vect_const_begin(v1), vect_const_end(v1),\n\t\t\t  vect_const_begin(v2));\n  }\n\n  template <typename V1, typename V2> inline\n    typename strongest_value_type<V1,V2>::value_type\n    vect_sp(const V1 &v1, const V2 &v2, abstract_skyline, abstract_dense) {\n    typename linalg_traits<V1>::const_iterator it1 = vect_const_begin(v1),\n      ite =  vect_const_end(v1);\n    typename linalg_traits<V2>::const_iterator it2 = vect_const_begin(v2);\n    return vect_sp_dense_(it1, ite, it2 + it1.index());\n  }\n\n  template <typename V1, typename V2> inline\n    typename strongest_value_type<V1,V2>::value_type\n    vect_sp(const V1 &v1, const V2 &v2, abstract_dense, abstract_skyline) {\n    typename linalg_traits<V2>::const_iterator it1 = vect_const_begin(v2),\n      ite =  vect_const_end(v2);\n    typename linalg_traits<V1>::const_iterator it2 = vect_const_begin(v1);\n    return vect_sp_dense_(it1, ite, it2 + it1.index());\n  }\n\n  template <typename V1, typename V2> inline\n    typename strongest_value_type<V1,V2>::value_type\n    vect_sp(const V1 &v1, const V2 &v2, abstract_skyline, abstract_skyline) {\n    typedef typename strongest_value_type<V1,V2>::value_type T;\n    typename linalg_traits<V1>::const_iterator it1 = vect_const_begin(v1),\n      ite1 =  vect_const_end(v1);\n    typename linalg_traits<V2>::const_iterator it2 = vect_const_begin(v2),\n      ite2 =  vect_const_end(v2);\n    size_type n = std::min(ite1.index(), ite2.index());\n    size_type l = std::max(it1.index(), it2.index());\n\n    if (l < n) {\n      size_type m = l - it1.index(), p = l - it2.index(), q = m + n - l;\n      return vect_sp_dense_(it1+m, it1+q, it2 + p);\n    }\n    return T(0);\n  }\n\n  template <typename V1, typename V2> inline\n    typename strongest_value_type<V1,V2>::value_type\n  vect_sp(const V1 &v1, const V2 &v2,abstract_sparse,abstract_dense) {\n    return vect_sp_sparse_(vect_const_begin(v1), vect_const_end(v1), v2);\n  }\n\n  template <typename V1, typename V2> inline\n    typename strongest_value_type<V1,V2>::value_type\n    vect_sp(const V1 &v1, const V2 &v2, abstract_sparse, abstract_skyline) {\n    return vect_sp_sparse_(vect_const_begin(v1), vect_const_end(v1), v2);\n  }\n\n  template <typename V1, typename V2> inline\n    typename strongest_value_type<V1,V2>::value_type\n    vect_sp(const V1 &v1, const V2 &v2, abstract_skyline, abstract_sparse) {\n    return vect_sp_sparse_(vect_const_begin(v2), vect_const_end(v2), v1);\n  }\n\n  template <typename V1, typename V2> inline\n    typename strongest_value_type<V1,V2>::value_type\n    vect_sp(const V1 &v1, const V2 &v2, abstract_dense,abstract_sparse) {\n    return vect_sp_sparse_(vect_const_begin(v2), vect_const_end(v2), v1);\n  }\n\n\n  template <typename V1, typename V2> inline\n  typename strongest_value_type<V1,V2>::value_type\n  vect_sp_sparse_sparse(const V1 &v1, const V2 &v2, linalg_true) {\n    typename linalg_traits<V1>::const_iterator it1 = vect_const_begin(v1),\n      ite1 = vect_const_end(v1);\n    typename linalg_traits<V2>::const_iterator it2 = vect_const_begin(v2),\n      ite2 = vect_const_end(v2);\n    typename strongest_value_type<V1,V2>::value_type res(0);\n    \n    while (it1 != ite1 && it2 != ite2) {\n      if (it1.index() == it2.index())\n\t{ res += (*it1) * *it2; ++it1; ++it2; }\n      else if (it1.index() < it2.index()) ++it1; else ++it2;\n    }\n    return res;\n  }\n\n  template <typename V1, typename V2> inline\n  typename strongest_value_type<V1,V2>::value_type\n  vect_sp_sparse_sparse(const V1 &v1, const V2 &v2, linalg_false) {\n    return vect_sp_sparse_(vect_const_begin(v1), vect_const_end(v1), v2);\n  }\n\n  template <typename V1, typename V2> inline\n    typename strongest_value_type<V1,V2>::value_type\n    vect_sp(const V1 &v1, const V2 &v2,abstract_sparse,abstract_sparse) {\n    return vect_sp_sparse_sparse(v1, v2,\n\t    typename linalg_and<typename linalg_traits<V1>::index_sorted,\n\t    typename linalg_traits<V2>::index_sorted>::bool_type());\n  }\n  \n  /* ******************************************************************** */\n  /*\t\tHermitian product                             \t\t  */\n  /* ******************************************************************** */\n  ///@endcond\n  /** Hermitian product. */\n  template <typename V1, typename V2>\n  inline typename strongest_value_type<V1,V2>::value_type\n  vect_hp(const V1 &v1, const V2 &v2)\n  { return vect_sp(v1, conjugated(v2)); }\n\n  /** Hermitian product with a matrix. */\n  template <typename MATSP, typename V1, typename V2> inline\n  typename strongest_value_type3<V1,V2,MATSP>::value_type\n    vect_hp(const MATSP &ps, const V1 &v1, const V2 &v2) {\n    return vect_sp(ps, v1, gmm::conjugated(v2));\n  }\n\n  /* ******************************************************************** */\n  /*\t\tTrace of a matrix                             \t\t  */\n  /* ******************************************************************** */\n  \n  /** Trace of a matrix */\n   template <typename M>\n   typename linalg_traits<M>::value_type\n   mat_trace(const M &m) {\n     typedef typename linalg_traits<M>::value_type T;\n     T res(0);\n     for (size_type i = 0; i < std::min(mat_nrows(m), mat_ncols(m)); ++i)\n       res += m(i,i);\n     return res;\n  }\n\n  /* ******************************************************************** */\n  /*\t\tEuclidean norm                             \t\t  */\n  /* ******************************************************************** */\n\n  /** Euclidean norm of a vector. */\n  template <typename V>\n  typename number_traits<typename linalg_traits<V>::value_type>\n  ::magnitude_type\n  vect_norm2_sqr(const V &v) {\n    typedef typename linalg_traits<V>::value_type T;\n    typedef typename number_traits<T>::magnitude_type R;\n    typename linalg_traits<V>::const_iterator\n      it = vect_const_begin(v), ite = vect_const_end(v);\n    R res(0);\n    for (; it != ite; ++it) res += gmm::abs_sqr(*it);\n    return res;\n  }\n\n  /** squared Euclidean norm of a vector. */\n  template <typename V> inline\n   typename number_traits<typename linalg_traits<V>::value_type>\n   ::magnitude_type \n  vect_norm2(const V &v)\n  { return sqrt(vect_norm2_sqr(v)); }\n  \n\n  /** squared Euclidean distance between two vectors */\n  template <typename V1, typename V2> inline\n   typename number_traits<typename linalg_traits<V1>::value_type>\n   ::magnitude_type\n  vect_dist2_sqr(const V1 &v1, const V2 &v2) { // not fully optimized \n    typedef typename linalg_traits<V1>::value_type T;\n    typedef typename number_traits<T>::magnitude_type R;\n    typename linalg_traits<V1>::const_iterator\n      it1 = vect_const_begin(v1), ite1 = vect_const_end(v1);\n    typename linalg_traits<V2>::const_iterator\n      it2 = vect_const_begin(v2), ite2 = vect_const_end(v2);\n    size_type k1(0), k2(0);\n    R res(0);\n    while (it1 != ite1 && it2 != ite2) {\n      size_type i1 = index_of_it(it1, k1,\n\t\t\t\t typename linalg_traits<V1>::storage_type());\n      size_type i2 = index_of_it(it2, k2,\n\t\t\t\t typename linalg_traits<V2>::storage_type());\n\n      if (i1 == i2) {\n\tres += gmm::abs_sqr(*it2 - *it1); ++it1; ++k1; ++it2; ++k2;\n      }\n      else if (i1 < i2) {\n\tres += gmm::abs_sqr(*it1); ++it1; ++k1; \n      }\n      else  {\n\tres += gmm::abs_sqr(*it2); ++it2; ++k2; \n      }\n    }\n    while (it1 != ite1) { res += gmm::abs_sqr(*it1); ++it1; }\n    while (it2 != ite2) { res += gmm::abs_sqr(*it2); ++it2; }\n    return res;\n  }\n \n  /** Euclidean distance between two vectors */\n  template <typename V1, typename V2> inline\n   typename number_traits<typename linalg_traits<V1>::value_type>\n   ::magnitude_type\n  vect_dist2(const V1 &v1, const V2 &v2)\n  { return sqrt(vect_dist2_sqr(v1, v2)); }\n  ///@cond DOXY_SHOW_ALL_FUNCTIONS\n  template <typename M>\n   typename number_traits<typename linalg_traits<M>::value_type>\n   ::magnitude_type\n   mat_euclidean_norm_sqr(const M &m, row_major) {\n    typename number_traits<typename linalg_traits<M>::value_type>\n      ::magnitude_type res(0);\n    for (size_type i = 0; i < mat_nrows(m); ++i)\n      res += vect_norm2_sqr(mat_const_row(m, i));\n    return res;\n  }\n\n  template <typename M>\n   typename number_traits<typename linalg_traits<M>::value_type>\n   ::magnitude_type\n   mat_euclidean_norm_sqr(const M &m, col_major) {\n    typename number_traits<typename linalg_traits<M>::value_type>\n      ::magnitude_type res(0);\n    for (size_type i = 0; i < mat_ncols(m); ++i)\n      res += vect_norm2_sqr(mat_const_col(m, i));\n    return res;\n  }\n  ///@endcond\n  /** squared Euclidean norm of a matrix. */\n  template <typename M> inline\n   typename number_traits<typename linalg_traits<M>::value_type>\n   ::magnitude_type\n   mat_euclidean_norm_sqr(const M &m) {\n    return mat_euclidean_norm_sqr(m,\n\t\t     typename principal_orientation_type<typename\n\t\t     linalg_traits<M>::sub_orientation>::potype());\n  }\n\n  /** Euclidean norm of a matrix. */\n  template <typename M> inline\n   typename number_traits<typename linalg_traits<M>::value_type>\n   ::magnitude_type\n   mat_euclidean_norm(const M &m)\n  { return gmm::sqrt(mat_euclidean_norm_sqr(m)); }\n\n  /* ******************************************************************** */\n  /*\t\tvector norm1                                    \t  */\n  /* ******************************************************************** */\n  /** 1-norm of a vector */\n  template <typename V>\n  typename number_traits<typename linalg_traits<V>::value_type>\n  ::magnitude_type\n  vect_norm1(const V &v) {\n    typename linalg_traits<V>::const_iterator\n      it = vect_const_begin(v), ite = vect_const_end(v);\n    typename number_traits<typename linalg_traits<V>::value_type>\n\t::magnitude_type res(0);\n    for (; it != ite; ++it) res += gmm::abs(*it);\n    return res;\n  }\n\n  /* ******************************************************************** */\n  /*\t\tvector Infinity norm                              \t  */\n  /* ******************************************************************** */\n  /** Infinity norm of a vector. */\n  template <typename V>\n  typename number_traits<typename linalg_traits<V>::value_type>\n  ::magnitude_type \n  vect_norminf(const V &v) {\n    typename linalg_traits<V>::const_iterator\n      it = vect_const_begin(v), ite = vect_const_end(v);\n      typename number_traits<typename linalg_traits<V>::value_type>\n\t::magnitude_type res(0);\n    for (; it != ite; ++it) res = std::max(res, gmm::abs(*it));\n    return res;\n  }\n\n  /* ******************************************************************** */\n  /*\t\tmatrix norm1                                    \t  */\n  /* ******************************************************************** */\n  ///@cond DOXY_SHOW_ALL_FUNCTIONS\n  template <typename M>\n   typename number_traits<typename linalg_traits<M>::value_type>\n   ::magnitude_type\n   mat_norm1(const M &m, col_major) {\n    typename number_traits<typename linalg_traits<M>::value_type>\n      ::magnitude_type res(0);\n    for (size_type i = 0; i < mat_ncols(m); ++i)\n      res = std::max(res, vect_norm1(mat_const_col(m,i)));\n    return res;\n  }\n\n  template <typename M>\n   typename number_traits<typename linalg_traits<M>::value_type>\n   ::magnitude_type\n   mat_norm1(const M &m, row_major) {\n    typedef typename linalg_traits<M>::value_type T;\n    typedef typename number_traits<T>::magnitude_type R;\n    typedef typename linalg_traits<M>::storage_type store_type;\n    \n    std::vector<R> aux(mat_ncols(m));\n    for (size_type i = 0; i < mat_nrows(m); ++i) {\n      typedef typename linalg_traits<M>::const_sub_row_type row_type;\n      row_type row = mat_const_row(m, i);\n      typename linalg_traits<row_type>::const_iterator\n\tit = vect_const_begin(row), ite = vect_const_end(row);\n      for (size_type k = 0; it != ite; ++it, ++k)\n\taux[index_of_it(it, k, store_type())] += gmm::abs(*it);\n    }\n    return vect_norminf(aux);\n  }\n\n  template <typename M>\n   typename number_traits<typename linalg_traits<M>::value_type>\n   ::magnitude_type\n   mat_norm1(const M &m, col_and_row)\n  { return mat_norm1(m, col_major()); }\n\n  template <typename M>\n   typename number_traits<typename linalg_traits<M>::value_type>\n   ::magnitude_type\n   mat_norm1(const M &m, row_and_col)\n  { return mat_norm1(m, col_major()); }\n  ///@endcond\n  /** 1-norm of a matrix */\n  template <typename M>\n   typename number_traits<typename linalg_traits<M>::value_type>\n   ::magnitude_type\n   mat_norm1(const M &m) {\n    return mat_norm1(m, typename linalg_traits<M>::sub_orientation());\n  }\n\n\n  /* ******************************************************************** */\n  /*\t\tmatrix Infinity norm                              \t  */\n  /* ******************************************************************** */\n  ///@cond DOXY_SHOW_ALL_FUNCTIONS\n  template <typename M>\n   typename number_traits<typename linalg_traits<M>::value_type>\n   ::magnitude_type\n   mat_norminf(const M &m, row_major) {\n    typename number_traits<typename linalg_traits<M>::value_type>\n      ::magnitude_type res(0);\n    for (size_type i = 0; i < mat_nrows(m); ++i)\n      res = std::max(res, vect_norm1(mat_const_row(m,i)));\n    return res;\n  }\n\n  template <typename M>\n   typename number_traits<typename linalg_traits<M>::value_type>\n   ::magnitude_type\n   mat_norminf(const M &m, col_major) {\n    typedef typename linalg_traits<M>::value_type T;\n    typedef typename number_traits<T>::magnitude_type R;\n    typedef typename linalg_traits<M>::storage_type store_type;\n    \n    std::vector<R> aux(mat_nrows(m));\n    for (size_type i = 0; i < mat_ncols(m); ++i) {\n      typedef typename linalg_traits<M>::const_sub_col_type col_type;\n      col_type col = mat_const_col(m, i);\n      typename linalg_traits<col_type>::const_iterator\n\tit = vect_const_begin(col), ite = vect_const_end(col);\n      for (size_type k = 0; it != ite; ++it, ++k)\n\taux[index_of_it(it, k, store_type())] += gmm::abs(*it);\n    }\n    return vect_norminf(aux);\n  }\n\n  template <typename M>\n   typename number_traits<typename linalg_traits<M>::value_type>\n   ::magnitude_type\n   mat_norminf(const M &m, col_and_row)\n  { return mat_norminf(m, row_major()); }\n\n  template <typename M>\n   typename number_traits<typename linalg_traits<M>::value_type>\n   ::magnitude_type\n   mat_norminf(const M &m, row_and_col)\n  { return mat_norminf(m, row_major()); }\n  ///@endcond\n  /** infinity-norm of a matrix.*/\n  template <typename M>\n   typename number_traits<typename linalg_traits<M>::value_type>\n   ::magnitude_type\n   mat_norminf(const M &m) {\n    return mat_norminf(m, typename linalg_traits<M>::sub_orientation());\n  }\n\n  /* ******************************************************************** */\n  /*\t\tMax norm for matrices                              \t  */\n  /* ******************************************************************** */\n  ///@cond DOXY_SHOW_ALL_FUNCTIONS\n  template <typename M>\n   typename number_traits<typename linalg_traits<M>::value_type>\n   ::magnitude_type\n   mat_maxnorm(const M &m, row_major) {\n    typename number_traits<typename linalg_traits<M>::value_type>\n      ::magnitude_type res(0);\n    for (size_type i = 0; i < mat_nrows(m); ++i)\n      res = std::max(res, vect_norminf(mat_const_row(m,i)));\n    return res;\n  }\n\n  template <typename M>\n   typename number_traits<typename linalg_traits<M>::value_type>\n   ::magnitude_type\n   mat_maxnorm(const M &m, col_major) {\n    typename number_traits<typename linalg_traits<M>::value_type>\n      ::magnitude_type res(0);\n    for (size_type i = 0; i < mat_ncols(m); ++i)\n      res = std::max(res, vect_norminf(mat_const_col(m,i)));\n    return res;\n  }\n  ///@endcond\n  /** max-norm of a matrix. */\n  template <typename M>\n   typename number_traits<typename linalg_traits<M>::value_type>\n   ::magnitude_type\n   mat_maxnorm(const M &m) {\n    return mat_maxnorm(m,\n\t\t     typename principal_orientation_type<typename\n\t\t     linalg_traits<M>::sub_orientation>::potype());\n  }\n\n  /* ******************************************************************** */\n  /*\t\tClean                                    \t\t  */\n  /* ******************************************************************** */\n  /** Clean a vector or matrix (replace near-zero entries with zeroes).   */\n  \n  template <typename L> inline void clean(L &l, double threshold);\n\n  ///@cond DOXY_SHOW_ALL_FUNCTIONS\n\n  template <typename L, typename T>\n  void clean(L &l, double threshold, abstract_dense, T) {\n    typedef typename number_traits<T>::magnitude_type R;\n    typename linalg_traits<L>::iterator it = vect_begin(l), ite = vect_end(l);\n    for (; it != ite; ++it)\n      if (gmm::abs(*it) < R(threshold)) *it = T(0);\n  }\n\n  template <typename L, typename T>\n  void clean(L &l, double threshold, abstract_skyline, T)\n  { gmm::clean(l, threshold, abstract_dense(), T()); }\n\n  template <typename L, typename T>\n  void clean(L &l, double threshold, abstract_sparse, T) {\n    typedef typename number_traits<T>::magnitude_type R;\n    typename linalg_traits<L>::iterator it = vect_begin(l), ite = vect_end(l);\n    std::vector<size_type> ind;\n    for (; it != ite; ++it)\n      if (gmm::abs(*it) < R(threshold)) ind.push_back(it.index());\n    for (size_type i = 0; i < ind.size(); ++i) l[ind[i]] = T(0);\n  }\n  \n  template <typename L, typename T>\n  void clean(L &l, double threshold, abstract_dense, std::complex<T>) {\n    typename linalg_traits<L>::iterator it = vect_begin(l), ite = vect_end(l);\n    for (; it != ite; ++it){\n      if (gmm::abs((*it).real()) < T(threshold))\n\t*it = std::complex<T>(T(0), (*it).imag());\n      if (gmm::abs((*it).imag()) < T(threshold))\n\t*it = std::complex<T>((*it).real(), T(0));\n    }\n  }\n\n  template <typename L, typename T>\n  void clean(L &l, double threshold, abstract_skyline, std::complex<T>)\n  { gmm::clean(l, threshold, abstract_dense(), std::complex<T>()); }\n\n  template <typename L, typename T>\n  void clean(L &l, double threshold, abstract_sparse, std::complex<T>) {\n    typename linalg_traits<L>::iterator it = vect_begin(l), ite = vect_end(l);\n    std::vector<size_type> ind;\n    for (; it != ite; ++it) {\n      bool r = (gmm::abs((*it).real()) < T(threshold));\n      bool i = (gmm::abs((*it).imag()) < T(threshold));\n      if (r && i) ind.push_back(it.index());\n      else if (r) (*it).real() = T(0);\n      else if (i) (*it).imag() = T(0);\n    }\n    for (size_type i = 0; i < ind.size(); ++i)\n      l[ind[i]] = std::complex<T>(T(0),T(0));\n  }\n\n  template <typename L> inline void clean(L &l, double threshold,\n\t\t\t\t\t  abstract_vector) {\n    gmm::clean(l, threshold, typename linalg_traits<L>::storage_type(),\n\t       typename linalg_traits<L>::value_type());\n  }\n\n  template <typename L> inline void clean(const L &l, double threshold);\n\n  template <typename L> void clean(L &l, double threshold, row_major) {\n    for (size_type i = 0; i < mat_nrows(l); ++i)\n      gmm::clean(mat_row(l, i), threshold);\n  }\n\n  template <typename L> void clean(L &l, double threshold, col_major) {\n    for (size_type i = 0; i < mat_ncols(l); ++i)\n      gmm::clean(mat_col(l, i), threshold);\n  }\n\n  template <typename L> inline void clean(L &l, double threshold,\n\t\t\t\t\t  abstract_matrix) {\n    gmm::clean(l, threshold,\n\t       typename principal_orientation_type<typename\n\t       linalg_traits<L>::sub_orientation>::potype());\n  }\n\n  template <typename L> inline void clean(L &l, double threshold)\n  { clean(l, threshold, typename linalg_traits<L>::linalg_type()); }\n \n  template <typename L> inline void clean(const L &l, double threshold)\n  { gmm::clean(linalg_const_cast(l), threshold); }\n\n  /* ******************************************************************** */\n  /*\t\tCopy                                    \t\t  */\n  /* ******************************************************************** */\n  ///@endcond\n  /** Copy vectors or matrices. \n      @param l1 source vector or matrix.\n      @param l2 destination.\n  */\n  template <typename L1, typename L2> inline\n  void copy(const L1& l1, L2& l2) { \n    if ((const void *)(&l1) != (const void *)(&l2)) {\n      if (same_origin(l1,l2))\n\tGMM_WARNING2(\"Warning : a conflict is possible in copy\\n\");\n     \n      copy(l1, l2, typename linalg_traits<L1>::linalg_type(),\n\t   typename linalg_traits<L2>::linalg_type());\n    }\n  }\n  ///@cond DOXY_SHOW_ALL_FUNCTIONS\n\n  template <typename L1, typename L2> inline\n  void copy(const L1& l1, const L2& l2) { copy(l1, linalg_const_cast(l2)); }\n\n  template <typename L1, typename L2> inline\n  void copy(const L1& l1, L2& l2, abstract_vector, abstract_vector) {\n    GMM_ASSERT2(vect_size(l1) == vect_size(l2), \"dimensions mismatch\");\n    copy_vect(l1, l2, typename linalg_traits<L1>::storage_type(),\n\t      typename linalg_traits<L2>::storage_type());\n  }\n\n  template <typename L1, typename L2> inline\n  void copy(const L1& l1, L2& l2, abstract_matrix, abstract_matrix) {\n    size_type m = mat_nrows(l1), n = mat_ncols(l1);\n    if (!m || !n) return;\n    GMM_ASSERT2(n==mat_ncols(l2) && m==mat_nrows(l2), \"dimensions mismatch\");\n    copy_mat(l1, l2, typename linalg_traits<L1>::sub_orientation(),\n\t     typename linalg_traits<L2>::sub_orientation());\n  }\n\n  template <typename V1, typename V2, typename C1, typename C2> inline \n  void copy_vect(const V1 &v1, const V2 &v2, C1, C2)\n  { copy_vect(v1, const_cast<V2 &>(v2), C1(), C2()); }\n  \n\n  template <typename L1, typename L2>\n  void copy_mat_by_row(const L1& l1, L2& l2) {\n    size_type nbr = mat_nrows(l1);\n    for (size_type i = 0; i < nbr; ++i)\n      copy_vect(mat_const_row(l1, i), mat_row(l2, i),\n      \t\ttypename linalg_traits<L1>::storage_type(),\n\t\ttypename linalg_traits<L2>::storage_type());\n  }\n\n  template <typename L1, typename L2>\n  void copy_mat_by_col(const L1 &l1, L2 &l2) {\n    size_type nbc = mat_ncols(l1);\n    for (size_type i = 0; i < nbc; ++i) {\n      copy_vect(mat_const_col(l1, i), mat_col(l2, i),\n      \t\ttypename linalg_traits<L1>::storage_type(),\n\t\ttypename linalg_traits<L2>::storage_type());\n    }\n  }\n\n  template <typename L1, typename L2> inline\n  void copy_mat(const L1& l1, L2& l2, row_major, row_major)\n  { copy_mat_by_row(l1, l2); }\n\n  template <typename L1, typename L2> inline\n  void copy_mat(const L1& l1, L2& l2, row_major, row_and_col)\n  { copy_mat_by_row(l1, l2); }\n\n  template <typename L1, typename L2> inline\n  void copy_mat(const L1& l1, L2& l2, row_and_col, row_and_col)\n  { copy_mat_by_row(l1, l2); }\n\n  template <typename L1, typename L2> inline\n  void copy_mat(const L1& l1, L2& l2, row_and_col, row_major)\n  { copy_mat_by_row(l1, l2); }\n\n  template <typename L1, typename L2> inline\n  void copy_mat(const L1& l1, L2& l2, col_and_row, row_major)\n  { copy_mat_by_row(l1, l2); }\n\n  template <typename L1, typename L2> inline\n  void copy_mat(const L1& l1, L2& l2, row_major, col_and_row)\n  { copy_mat_by_row(l1, l2); }\n\n  template <typename L1, typename L2> inline\n  void copy_mat(const L1& l1, L2& l2, col_and_row, row_and_col)\n  { copy_mat_by_row(l1, l2); }\n\n  template <typename L1, typename L2> inline\n  void copy_mat(const L1& l1, L2& l2, row_and_col, col_and_row)\n  { copy_mat_by_row(l1, l2); }\n\n  template <typename L1, typename L2> inline\n  void copy_mat(const L1& l1, L2& l2, col_major, col_major)\n  { copy_mat_by_col(l1, l2); }\n\n  template <typename L1, typename L2> inline\n  void copy_mat(const L1& l1, L2& l2, col_major, col_and_row)\n  { copy_mat_by_col(l1, l2); }\n\n  template <typename L1, typename L2> inline\n  void copy_mat(const L1& l1, L2& l2, col_major, row_and_col)\n  { copy_mat_by_col(l1, l2); }\n\n  template <typename L1, typename L2> inline\n  void copy_mat(const L1& l1, L2& l2, row_and_col, col_major)\n  { copy_mat_by_col(l1, l2); }\n\n  template <typename L1, typename L2> inline\n  void copy_mat(const L1& l1, L2& l2, col_and_row, col_major)\n  { copy_mat_by_col(l1, l2); }\n\n  template <typename L1, typename L2> inline\n  void copy_mat(const L1& l1, L2& l2, col_and_row, col_and_row)\n  { copy_mat_by_col(l1, l2); }\n  \n  template <typename L1, typename L2> inline\n  void copy_mat_mixed_rc(const L1& l1, L2& l2, size_type i) {\n    copy_mat_mixed_rc(l1, l2, i, typename linalg_traits<L1>::storage_type());\n  }\n\n  template <typename L1, typename L2>\n  void copy_mat_mixed_rc(const L1& l1, L2& l2, size_type i, abstract_sparse) {\n    typename linalg_traits<L1>::const_iterator\n      it  = vect_const_begin(l1), ite = vect_const_end(l1);\n    for (; it != ite; ++it)\n      l2(i, it.index()) = *it;\n  }\n\n  template <typename L1, typename L2>\n  void copy_mat_mixed_rc(const L1& l1, L2& l2, size_type i, abstract_skyline) {\n    typename linalg_traits<L1>::const_iterator\n      it  = vect_const_begin(l1), ite = vect_const_end(l1);\n    for (; it != ite; ++it)\n      l2(i, it.index()) = *it;\n  }\n\n  template <typename L1, typename L2>\n  void copy_mat_mixed_rc(const L1& l1, L2& l2, size_type i, abstract_dense) {\n    typename linalg_traits<L1>::const_iterator\n      it  = vect_const_begin(l1), ite = vect_const_end(l1);\n    for (size_type j = 0; it != ite; ++it, ++j) l2(i, j) = *it;\n  }\n\n  template <typename L1, typename L2> inline\n  void copy_mat_mixed_cr(const L1& l1, L2& l2, size_type i) {\n    copy_mat_mixed_cr(l1, l2, i, typename linalg_traits<L1>::storage_type());\n  }\n\n  template <typename L1, typename L2>\n  void copy_mat_mixed_cr(const L1& l1, L2& l2, size_type i, abstract_sparse) {\n    typename linalg_traits<L1>::const_iterator\n      it  = vect_const_begin(l1), ite = vect_const_end(l1);\n    for (; it != ite; ++it) l2(it.index(), i) = *it;\n  }\n\n  template <typename L1, typename L2>\n  void copy_mat_mixed_cr(const L1& l1, L2& l2, size_type i, abstract_skyline) {\n    typename linalg_traits<L1>::const_iterator\n      it  = vect_const_begin(l1), ite = vect_const_end(l1);\n    for (; it != ite; ++it) l2(it.index(), i) = *it;\n  }\n\n  template <typename L1, typename L2>\n  void copy_mat_mixed_cr(const L1& l1, L2& l2, size_type i, abstract_dense) {\n    typename linalg_traits<L1>::const_iterator\n      it  = vect_const_begin(l1), ite = vect_const_end(l1);\n    for (size_type j = 0; it != ite; ++it, ++j) l2(j, i) = *it;\n  }\n\n  template <typename L1, typename L2>\n  void copy_mat(const L1& l1, L2& l2, row_major, col_major) {\n    clear(l2);\n    size_type nbr = mat_nrows(l1);\n    for (size_type i = 0; i < nbr; ++i)\n      copy_mat_mixed_rc(mat_const_row(l1, i), l2, i);\n  }\n  \n  template <typename L1, typename L2>\n  void copy_mat(const L1& l1, L2& l2, col_major, row_major) {\n    clear(l2);\n    size_type nbc = mat_ncols(l1);\n    for (size_type i = 0; i < nbc; ++i)\n      copy_mat_mixed_cr(mat_const_col(l1, i), l2, i);\n  }\n  \n  template <typename L1, typename L2> inline\n  void copy_vect(const L1 &l1, L2 &l2, abstract_dense, abstract_dense) {\n    std::copy(vect_const_begin(l1), vect_const_end(l1), vect_begin(l2));\n  }\n\n  template <typename L1, typename L2> inline // to be optimised ?\n  void copy_vect(const L1 &l1, L2 &l2, abstract_skyline, abstract_skyline) {\n    typename linalg_traits<L1>::const_iterator it1 = vect_const_begin(l1),\n      ite1 = vect_const_end(l1);\n    while (it1 != ite1 && *it1 == typename linalg_traits<L1>::value_type(0))\n      ++it1;\n\n    if (ite1 - it1 > 0) {\n      clear(l2);\n      typename linalg_traits<L2>::iterator it2 = vect_begin(l2), \n\tite2 = vect_end(l2);\n      while (*(ite1-1) == typename linalg_traits<L1>::value_type(0)) ite1--;\n\n      if (it2 == ite2) {\n\tl2[it1.index()] = *it1; ++it1;\n\tl2[ite1.index()-1] = *(ite1-1); --ite1;\n\tif (it1 < ite1)\n\t  { it2 = vect_begin(l2); ++it2; std::copy(it1, ite1, it2); }\n      }\n      else {\n\tptrdiff_t m = it1.index() - it2.index();\n\tif (m >= 0 && ite1.index() <= ite2.index())\n\t  std::copy(it1, ite1, it2 + m);\n\telse {\n\t  if (m < 0) l2[it1.index()] = *it1;\n\t  if (ite1.index() > ite2.index()) l2[ite1.index()-1] = *(ite1-1);\n\t  it2 = vect_begin(l2); ite2 = vect_end(l2);\n\t  m = it1.index() - it2.index();\n\t  std::copy(it1, ite1, it2 + m);\n\t}\n      }\n    }\n  }\n  \n  template <typename L1, typename L2>\n  void copy_vect(const L1& l1, L2& l2, abstract_sparse, abstract_dense) {\n    clear(l2);\n    typename linalg_traits<L1>::const_iterator\n      it  = vect_const_begin(l1), ite = vect_const_end(l1);\n    for (; it != ite; ++it) { l2[it.index()] = *it; }\n  }\n\n  template <typename L1, typename L2>\n  void copy_vect(const L1& l1, L2& l2, abstract_sparse, abstract_skyline) {\n    clear(l2);\n    typename linalg_traits<L1>::const_iterator\n      it  = vect_const_begin(l1), ite = vect_const_end(l1);\n    for (; it != ite; ++it) l2[it.index()] = *it;\n  }\n\n  template <typename L1, typename L2>\n  void copy_vect(const L1& l1, L2& l2, abstract_skyline, abstract_dense) {\n    typedef typename linalg_traits<L1>::value_type T;\n    typedef typename linalg_traits<L1>::const_iterator l1_const_iterator;\n    typedef typename linalg_traits<L2>::iterator l2_iterator;\n    l1_const_iterator it = vect_const_begin(l1), ite = vect_const_end(l1);\n    if (it == ite)\n      gmm::clear(l2);\n    else {\n      l2_iterator it2 = vect_begin(l2), ite2 = vect_end(l2);\n      \n      size_type i = it.index(), j;\n      for (j = 0; j < i; ++j, ++it2) *it2 = T(0);\n      for (; it != ite; ++it, ++it2) *it2 = *it;\n      for (; it2 != ite2; ++it2) *it2 = T(0);\n    }\n  }\n    \n  template <typename L1, typename L2>\n  void copy_vect(const L1& l1, L2& l2, abstract_sparse, abstract_sparse) {\n    typename linalg_traits<L1>::const_iterator\n      it  = vect_const_begin(l1), ite = vect_const_end(l1);\n    clear(l2);\n    for (; it != ite; ++it)\n      if (*it != (typename linalg_traits<L1>::value_type)(0))\n\tl2[it.index()] = *it;\n  }\n  \n  template <typename L1, typename L2>\n  void copy_vect(const L1& l1, L2& l2, abstract_dense, abstract_sparse) {\n    clear(l2);\n    typename linalg_traits<L1>::const_iterator\n      it  = vect_const_begin(l1), ite = vect_const_end(l1);\n    for (size_type i = 0; it != ite; ++it, ++i)\n      if (*it != (typename linalg_traits<L1>::value_type)(0))\n\tl2[i] = *it;\n  }\n\n  template <typename L1, typename L2> // to be optimised ...\n  void copy_vect(const L1& l1, L2& l2, abstract_dense, abstract_skyline) {\n    clear(l2);\n    typename linalg_traits<L1>::const_iterator\n      it  = vect_const_begin(l1), ite = vect_const_end(l1);\n    for (size_type i = 0; it != ite; ++it, ++i)\n      if (*it != (typename linalg_traits<L1>::value_type)(0))\n\tl2[i] = *it;\n  }\n\n  \n  template <typename L1, typename L2>\n  void copy_vect(const L1& l1, L2& l2, abstract_skyline, abstract_sparse) {\n    clear(l2);\n    typename linalg_traits<L1>::const_iterator\n      it  = vect_const_begin(l1), ite = vect_const_end(l1);\n    for (; it != ite; ++it)\n      if (*it != (typename linalg_traits<L1>::value_type)(0))\n\tl2[it.index()] = *it;\n  }\n\n  /* ******************************************************************** */\n  /*\t\tMatrix and vector addition                             \t  */\n  /*   algorithms are built in order to avoid some conflicts whith        */\n  /*   repeated arguments or with overlapping part of a same object.      */\n  /*   In the latter case, conflicts are still possible.                  */\n  /* ******************************************************************** */\n  ///@endcond\n  /** Add two vectors or matrices\n      @param l1\n      @param l2 contains on output, l2+l1.\n  */\n  template <typename L1, typename L2> inline\n    void add(const L1& l1, L2& l2) {\n      add_spec(l1, l2, typename linalg_traits<L2>::linalg_type());\n  }\n  ///@cond\n\n  template <typename L1, typename L2> inline\n  void add(const L1& l1, const L2& l2) { add(l1, linalg_const_cast(l2)); }\n\n  template <typename L1, typename L2> inline\n    void add_spec(const L1& l1, L2& l2, abstract_vector) {\n    GMM_ASSERT2(vect_size(l1) == vect_size(l2), \"dimensions mismatch\");\n    add(l1, l2, typename linalg_traits<L1>::storage_type(),\n\ttypename linalg_traits<L2>::storage_type());\n  }\n\n  template <typename L1, typename L2> inline\n    void add_spec(const L1& l1, L2& l2, abstract_matrix) {\n    size_type m = mat_nrows(l1), n = mat_ncols(l1);\n    GMM_ASSERT2(m==mat_nrows(l2) && n==mat_ncols(l2), \"dimensions mismatch\");\n    add(l1, l2, typename linalg_traits<L1>::sub_orientation(),\n\ttypename linalg_traits<L2>::sub_orientation());\n  }\n\n  template <typename L1, typename L2>\n  void add(const L1& l1, L2& l2, row_major, row_major) {\n    typename linalg_traits<L1>::const_row_iterator it1 = mat_row_begin(l1),\n      ite = mat_row_end(l1);\n    typename linalg_traits<L2>::row_iterator it2 = mat_row_begin(l2);\n    for ( ; it1 != ite; ++it1, ++it2)\n      add(linalg_traits<L1>::row(it1), linalg_traits<L2>::row(it2));\n  }\n\n  template <typename L1, typename L2>\n  void add(const L1& l1, L2& l2, col_major, col_major) {\n    typename linalg_traits<L1>::const_col_iterator\n      it1 = mat_col_const_begin(l1),\n      ite = mat_col_const_end(l1);\n    typename linalg_traits<L2>::col_iterator it2 = mat_col_begin(l2);\n    for ( ; it1 != ite; ++it1, ++it2)\n      add(linalg_traits<L1>::col(it1),  linalg_traits<L2>::col(it2));\n  }\n  \n    template <typename L1, typename L2> inline\n  void add_mat_mixed_rc(const L1& l1, L2& l2, size_type i) {\n    add_mat_mixed_rc(l1, l2, i, typename linalg_traits<L1>::storage_type());\n  }\n\n  template <typename L1, typename L2>\n  void add_mat_mixed_rc(const L1& l1, L2& l2, size_type i, abstract_sparse) {\n    typename linalg_traits<L1>::const_iterator\n      it  = vect_const_begin(l1), ite = vect_const_end(l1);\n    for (; it != ite; ++it) l2(i, it.index()) += *it;\n  }\n\n  template <typename L1, typename L2>\n  void add_mat_mixed_rc(const L1& l1, L2& l2, size_type i, abstract_skyline) {\n    typename linalg_traits<L1>::const_iterator\n      it  = vect_const_begin(l1), ite = vect_const_end(l1);\n    for (; it != ite; ++it) l2(i, it.index()) += *it;\n  }\n\n  template <typename L1, typename L2>\n  void add_mat_mixed_rc(const L1& l1, L2& l2, size_type i, abstract_dense) {\n    typename linalg_traits<L1>::const_iterator\n      it  = vect_const_begin(l1), ite = vect_const_end(l1);\n    for (size_type j = 0; it != ite; ++it, ++j) l2(i, j) += *it;\n  }\n\n  template <typename L1, typename L2> inline\n  void add_mat_mixed_cr(const L1& l1, L2& l2, size_type i) {\n    add_mat_mixed_cr(l1, l2, i, typename linalg_traits<L1>::storage_type());\n  }\n\n  template <typename L1, typename L2>\n  void add_mat_mixed_cr(const L1& l1, L2& l2, size_type i, abstract_sparse) {\n    typename linalg_traits<L1>::const_iterator\n      it  = vect_const_begin(l1), ite = vect_const_end(l1);\n    for (; it != ite; ++it) l2(it.index(), i) += *it;\n  }\n\n  template <typename L1, typename L2>\n  void add_mat_mixed_cr(const L1& l1, L2& l2, size_type i, abstract_skyline) {\n    typename linalg_traits<L1>::const_iterator\n      it  = vect_const_begin(l1), ite = vect_const_end(l1);\n    for (; it != ite; ++it) l2(it.index(), i) += *it;\n  }\n\n  template <typename L1, typename L2>\n  void add_mat_mixed_cr(const L1& l1, L2& l2, size_type i, abstract_dense) {\n    typename linalg_traits<L1>::const_iterator\n      it  = vect_const_begin(l1), ite = vect_const_end(l1);\n    for (size_type j = 0; it != ite; ++it, ++j) l2(j, i) += *it;\n  }\n\n  template <typename L1, typename L2>\n  void add(const L1& l1, L2& l2, row_major, col_major) {\n    size_type nbr = mat_nrows(l1);\n    for (size_type i = 0; i < nbr; ++i)\n      add_mat_mixed_rc(mat_const_row(l1, i), l2, i);\n  }\n  \n  template <typename L1, typename L2>\n  void add(const L1& l1, L2& l2, col_major, row_major) {\n    size_type nbc = mat_ncols(l1);\n    for (size_type i = 0; i < nbc; ++i)\n      add_mat_mixed_cr(mat_const_col(l1, i), l2, i);\n  }\n\n  template <typename L1, typename L2> inline\n  void add(const L1& l1, L2& l2, row_and_col, row_major)\n  { add(l1, l2, row_major(), row_major()); }\n\n  template <typename L1, typename L2> inline\n  void add(const L1& l1, L2& l2, row_and_col, row_and_col)\n  { add(l1, l2, row_major(), row_major()); }\n\n  template <typename L1, typename L2> inline\n  void add(const L1& l1, L2& l2, row_and_col, col_and_row)\n  { add(l1, l2, row_major(), row_major()); }\n\n  template <typename L1, typename L2> inline\n  void add(const L1& l1, L2& l2, col_and_row, row_and_col)\n  { add(l1, l2, row_major(), row_major()); }\n\n  template <typename L1, typename L2> inline\n  void add(const L1& l1, L2& l2, row_major, row_and_col)\n  { add(l1, l2, row_major(), row_major()); }\n\n  template <typename L1, typename L2> inline\n  void add(const L1& l1, L2& l2, col_and_row, row_major)\n  { add(l1, l2, row_major(), row_major()); }\n\n  template <typename L1, typename L2> inline\n  void add(const L1& l1, L2& l2, row_major, col_and_row)\n  { add(l1, l2, row_major(), row_major()); }\n\n  template <typename L1, typename L2> inline\n  void add(const L1& l1, L2& l2, row_and_col, col_major)\n  { add(l1, l2, col_major(), col_major()); }\n\n  template <typename L1, typename L2> inline\n  void add(const L1& l1, L2& l2, col_major, row_and_col)\n  { add(l1, l2, col_major(), col_major()); }\n\n  template <typename L1, typename L2> inline\n  void add(const L1& l1, L2& l2, col_and_row, col_major)\n  { add(l1, l2, col_major(), col_major()); }\n\n  template <typename L1, typename L2> inline\n  void add(const L1& l1, L2& l2, col_and_row, col_and_row)\n  { add(l1, l2, col_major(), col_major()); }\n\n  template <typename L1, typename L2> inline\n  void add(const L1& l1, L2& l2, col_major, col_and_row)\n  { add(l1, l2, col_major(), col_major()); }\n\n  ///@endcond\n  /** Addition of two vectors/matrices\n      @param l1\n      @param l2\n      @param l3 contains l1+l2 on output\n  */\n  template <typename L1, typename L2, typename L3> inline\n  void add(const L1& l1, const L2& l2, L3& l3) {\n    add_spec(l1, l2, l3, typename linalg_traits<L2>::linalg_type());\n  }\n  ///@cond DOXY_SHOW_ALL_FUNCTIONS\n\n  template <typename L1, typename L2, typename L3> inline\n  void add(const L1& l1, const L2& l2, const L3& l3)\n  { add(l1, l2, linalg_const_cast(l3)); }\n\n  template <typename L1, typename L2, typename L3> inline\n    void add_spec(const L1& l1, const L2& l2, L3& l3, abstract_matrix)\n  { copy(l2, l3); add(l1, l3); }\n\n  template <typename L1, typename L2, typename L3> inline\n    void add_spec(const L1& l1, const L2& l2, L3& l3, abstract_vector) {\n    GMM_ASSERT2(vect_size(l1) == vect_size(l2) &&\n\t\tvect_size(l1) == vect_size(l3), \"dimensions mismatch\");\n    if ((const void *)(&l1) == (const void *)(&l3))\n      add(l2, l3);\n    else if ((const void *)(&l2) == (const void *)(&l3))\n      add(l1, l3);\n    else\n      add(l1, l2, l3, typename linalg_traits<L1>::storage_type(),\n\t  typename linalg_traits<L2>::storage_type(),\n\t  typename linalg_traits<L3>::storage_type());\n  }\n\n  template <typename IT1, typename IT2, typename IT3>\n    void add_full_(IT1 it1, IT2 it2, IT3 it3, IT3 ite) {\n    for (; it3 != ite; ++it3, ++it2, ++it1) *it3 = *it1 + *it2;\n  }\n\n  template <typename IT1, typename IT2, typename IT3>\n    void add_almost_full_(IT1 it1, IT1 ite1, IT2 it2, IT3 it3, IT3 ite3) {\n    IT3 it = it3;\n    for (; it != ite3; ++it, ++it2) *it = *it2;\n    for (; it1 != ite1; ++it1)\n      *(it3 + it1.index()) += *it1;\n  }\n\n  template <typename IT1, typename IT2, typename IT3>\n  void add_to_full_(IT1 it1, IT1 ite1, IT2 it2, IT2 ite2,\n\t\t    IT3 it3, IT3 ite3) {\n    typedef typename std::iterator_traits<IT3>::value_type T;\n    IT3 it = it3;\n    for (; it != ite3; ++it) *it = T(0);\n    for (; it1 != ite1; ++it1) *(it3 + it1.index()) = *it1;\n    for (; it2 != ite2; ++it2) *(it3 + it2.index()) += *it2;    \n  }\n  \n  template <typename L1, typename L2, typename L3> inline\n  void add(const L1& l1, const L2& l2, L3& l3,\n\t   abstract_dense, abstract_dense, abstract_dense) {\n    add_full_(vect_const_begin(l1), vect_const_begin(l2),\n\t      vect_begin(l3), vect_end(l3));\n  }\n  \n  // generic function for add(v1, v2, v3).\n  // Need to be specialized to optimize particular additions.\n  template <typename L1, typename L2, typename L3,\n\t    typename ST1, typename ST2, typename ST3>\n  inline void add(const L1& l1, const L2& l2, L3& l3, ST1, ST2, ST3)\n  { copy(l2, l3); add(l1, l3, ST1(), ST3()); }\n\n  template <typename L1, typename L2, typename L3> inline\n  void add(const L1& l1, const L2& l2, L3& l3,\n\t   abstract_sparse, abstract_dense, abstract_dense) {\n    add_almost_full_(vect_const_begin(l1), vect_const_end(l1),\n\t\t     vect_const_begin(l2), vect_begin(l3), vect_end(l3));\n  }\n  \n  template <typename L1, typename L2, typename L3> inline\n  void add(const L1& l1, const L2& l2, L3& l3,\n\t   abstract_dense, abstract_sparse, abstract_dense)\n  { add(l2, l1, l3, abstract_sparse(), abstract_dense(), abstract_dense()); }\n  \n  template <typename L1, typename L2, typename L3> inline\n  void add(const L1& l1, const L2& l2, L3& l3,\n\t   abstract_sparse, abstract_sparse, abstract_dense) {\n    add_to_full_(vect_const_begin(l1), vect_const_end(l1),\n\t\t vect_const_begin(l2), vect_const_end(l2),\n\t\t vect_begin(l3), vect_end(l3));\n  }\n\n\n  template <typename L1, typename L2, typename L3>\n  void add_spspsp(const L1& l1, const L2& l2, L3& l3, linalg_true) {\n    typename linalg_traits<L1>::const_iterator\n      it1 = vect_const_begin(l1), ite1 = vect_const_end(l1);\n    typename linalg_traits<L2>::const_iterator\n      it2 = vect_const_begin(l2), ite2 = vect_const_end(l2);\n    clear(l3);\n    while (it1 != ite1 && it2 != ite2) {\n      ptrdiff_t d = it1.index() - it2.index();\n      if (d < 0)\n\t{ l3[it1.index()] += *it1; ++it1; }\n      else if (d > 0)\n\t{ l3[it2.index()] += *it2; ++it2; }\n      else\n\t{ l3[it1.index()] = *it1 + *it2; ++it1; ++it2; }\n    }\n    for (; it1 != ite1; ++it1) l3[it1.index()] += *it1;\n    for (; it2 != ite2; ++it2) l3[it2.index()] += *it2;   \n  }\n\n  template <typename L1, typename L2, typename L3>\n  void add_spspsp(const L1& l1, const L2& l2, L3& l3, linalg_false)\n  { copy(l2, l3); add(l2, l3); }\n  \n  template <typename L1, typename L2, typename L3>\n  void add(const L1& l1, const L2& l2, L3& l3,\n\t   abstract_sparse, abstract_sparse, abstract_sparse) {\n    add_spspsp(l1, l2, l3, typename linalg_and<typename\n\t       linalg_traits<L1>::index_sorted,\n\t       typename linalg_traits<L2>::index_sorted>::bool_type());\n  }\n\n  template <typename L1, typename L2>\n  void add(const L1& l1, L2& l2, abstract_dense, abstract_dense) {\n    typename linalg_traits<L1>::const_iterator it1 = vect_const_begin(l1); \n    typename linalg_traits<L2>::iterator\n             it2 = vect_begin(l2), ite = vect_end(l2);\n    for (; it2 != ite; ++it2, ++it1) *it2 += *it1;\n  }\n\n  template <typename L1, typename L2>\n  void add(const L1& l1, L2& l2, abstract_dense, abstract_skyline) {\n    typedef typename linalg_traits<L1>::const_iterator const_l1_iterator;\n    typedef typename linalg_traits<L2>::iterator l2_iterator;\n    typedef typename linalg_traits<L1>::value_type T;\n\n    const_l1_iterator it1 = vect_const_begin(l1), ite1 = vect_const_end(l1); \n    size_type i1 = 0, ie1 = vect_size(l1);\n    while (it1 != ite1 && *it1 == T(0)) { ++it1; ++i1; }\n    if (it1 != ite1) {\n      l2_iterator it2 = vect_begin(l2), ite2 = vect_end(l2);\n      while (ie1 && *(ite1-1) == T(0)) { ite1--; --ie1; }\n\n      if (it2 == ite2 || i1 < it2.index()) {\n\tl2[i1] = *it1; ++i1; ++it1;\n\tif (it1 == ite1) return;\n\tit2 = vect_begin(l2); ite2 = vect_end(l2);\n      }\n      if (ie1 > ite2.index()) {\n\t--ite1; l2[ie1 - 1] = *ite1;\n\tit2 = vect_begin(l2);\n      }\n      it2 += i1 - it2.index();\n      for (; it1 != ite1; ++it1, ++it2) { *it2 += *it1; }\n    }\n  }\n\n\n  template <typename L1, typename L2>\n  void add(const L1& l1, L2& l2, abstract_skyline, abstract_dense) {\n    typename linalg_traits<L1>::const_iterator it1 = vect_const_begin(l1),\n      ite1 = vect_const_end(l1);\n    if (it1 != ite1) {\n      typename linalg_traits<L2>::iterator it2 = vect_begin(l2);\n      it2 += it1.index();\n      for (; it1 != ite1; ++it2, ++it1) *it2 += *it1;\n    }\n  }\n\n  \n  template <typename L1, typename L2>\n  void add(const L1& l1, L2& l2, abstract_sparse, abstract_dense) {\n    typename linalg_traits<L1>::const_iterator\n      it1 = vect_const_begin(l1), ite1 = vect_const_end(l1);\n    for (; it1 != ite1; ++it1) l2[it1.index()] += *it1;\n  }\n  \n  template <typename L1, typename L2>\n  void add(const L1& l1, L2& l2, abstract_sparse, abstract_sparse) {\n    typename linalg_traits<L1>::const_iterator\n      it1 = vect_const_begin(l1), ite1 = vect_const_end(l1);\n    for (; it1 != ite1; ++it1) l2[it1.index()] += *it1;\n  }\n\n  template <typename L1, typename L2>\n  void add(const L1& l1, L2& l2, abstract_sparse, abstract_skyline) {\n    typename linalg_traits<L1>::const_iterator\n      it1 = vect_const_begin(l1), ite1 = vect_const_end(l1);\n    for (; it1 != ite1; ++it1) l2[it1.index()] += *it1;\n  }\n\n\n  template <typename L1, typename L2>\n  void add(const L1& l1, L2& l2, abstract_skyline, abstract_sparse) {\n    typename linalg_traits<L1>::const_iterator\n      it1 = vect_const_begin(l1), ite1 = vect_const_end(l1);\n    for (; it1 != ite1; ++it1)\n      if (*it1 != typename linalg_traits<L1>::value_type(0))\n\tl2[it1.index()] += *it1;\n  }\n\n  template <typename L1, typename L2>\n  void add(const L1& l1, L2& l2, abstract_skyline, abstract_skyline) {\n    typedef typename linalg_traits<L1>::const_iterator const_l1_iterator;\n    typedef typename linalg_traits<L2>::iterator l2_iterator;\n    typedef typename linalg_traits<L1>::value_type T1;\n    typedef typename linalg_traits<L2>::value_type T2;\n\n    const_l1_iterator it1 = vect_const_begin(l1), ite1 = vect_const_end(l1);\n    \n    while (it1 != ite1 && *it1 == T1(0)) ++it1;\n    if (ite1 != it1) {\n      l2_iterator it2 = vect_begin(l2), ite2 = vect_end(l2);\n      while (*(ite1-1) == T1(0)) ite1--;\n      if (it2 == ite2 || it1.index() < it2.index()) {\n\tl2[it1.index()] = T2(0);\n\tit2 = vect_begin(l2); ite2 = vect_end(l2);\n      }\n      if (ite1.index() > ite2.index()) {\n\tl2[ite1.index() - 1] = T2(0);\n\tit2 = vect_begin(l2); \n      }\n      it2 += it1.index() - it2.index();\n      for (; it1 != ite1; ++it1, ++it2) *it2 += *it1;\n    }\n  }\n  \n  template <typename L1, typename L2>\n  void add(const L1& l1, L2& l2, abstract_dense, abstract_sparse) {\n    typename linalg_traits<L1>::const_iterator\n      it1 = vect_const_begin(l1), ite1 = vect_const_end(l1);\n    for (size_type i = 0; it1 != ite1; ++it1, ++i)\n      if (*it1 != typename linalg_traits<L1>::value_type(0)) l2[i] += *it1;\n  } \n\n  /* ******************************************************************** */\n  /*\t\tMatrix-vector mult                                    \t  */\n  /* ******************************************************************** */\n  ///@endcond\n  /** matrix-vector or matrix-matrix product.\n      @param l1 a matrix.\n      @param l2 a vector or matrix.\n      @param l3 the product l1*l2.\n  */\n  template <typename L1, typename L2, typename L3> inline\n  void mult(const L1& l1, const L2& l2, L3& l3) {\n    mult_dispatch(l1, l2, l3, typename linalg_traits<L2>::linalg_type());\n  }\n  ///@cond DOXY_SHOW_ALL_FUNCTIONS\n\n  template <typename L1, typename L2, typename L3> inline\n  void mult(const L1& l1, const L2& l2, const L3& l3)\n  { mult(l1, l2, linalg_const_cast(l3)); }\n\n  template <typename L1, typename L2, typename L3> inline\n  void mult_dispatch(const L1& l1, const L2& l2, L3& l3, abstract_vector) {\n    size_type m = mat_nrows(l1), n = mat_ncols(l1);\n    if (!m || !n) { gmm::clear(l3); return; }\n    GMM_ASSERT2(n==vect_size(l2) && m==vect_size(l3), \"dimensions mismatch\");\n    if (!same_origin(l2, l3))\n      mult_spec(l1, l2, l3, typename principal_orientation_type<typename\n\t\tlinalg_traits<L1>::sub_orientation>::potype());\n    else {\n      GMM_WARNING2(\"Warning, A temporary is used for mult\\n\");\n      typename temporary_vector<L3>::vector_type temp(vect_size(l3));\n      mult_spec(l1, l2, temp, typename principal_orientation_type<typename\n\t\tlinalg_traits<L1>::sub_orientation>::potype());\n      copy(temp, l3);\n    }\n  }\n\n  template <typename L1, typename L2, typename L3>\n  void mult_by_row(const L1& l1, const L2& l2, L3& l3, abstract_sparse) {\n    typedef typename  linalg_traits<L3>::value_type T;\n    clear(l3);\n    size_type nr = mat_nrows(l1);\n    for (size_type i = 0; i < nr; ++i) {\n      T aux = vect_sp(mat_const_row(l1, i), l2);\n      if (aux != T(0)) l3[i] = aux;\n    }\n  }\n\n  template <typename L1, typename L2, typename L3>\n  void mult_by_row(const L1& l1, const L2& l2, L3& l3, abstract_skyline) {\n    typedef typename  linalg_traits<L3>::value_type T;\n    clear(l3); \n    size_type nr = mat_nrows(l1);\n    for (size_type i = 0; i < nr; ++i) {\n      T aux = vect_sp(mat_const_row(l1, i), l2);\n      if (aux != T(0)) l3[i] = aux;\n    }\n  }\n\n  template <typename L1, typename L2, typename L3>\n  void mult_by_row(const L1& l1, const L2& l2, L3& l3, abstract_dense) {\n    typename linalg_traits<L3>::iterator it=vect_begin(l3), ite=vect_end(l3);\n    typename linalg_traits<L1>::const_row_iterator\n      itr = mat_row_const_begin(l1); \n    for (; it != ite; ++it, ++itr)\n      *it = vect_sp(linalg_traits<L1>::row(itr), l2,\n\t\t    typename linalg_traits<L1>::storage_type(),\n\t\t    typename linalg_traits<L2>::storage_type());\n  }\n\n  template <typename L1, typename L2, typename L3>\n  void mult_by_col(const L1& l1, const L2& l2, L3& l3, abstract_dense) {\n    clear(l3);\n    size_type nc = mat_ncols(l1);\n    for (size_type i = 0; i < nc; ++i)\n      add(scaled(mat_const_col(l1, i), l2[i]), l3);\n  }\n\n  template <typename L1, typename L2, typename L3>\n  void mult_by_col(const L1& l1, const L2& l2, L3& l3, abstract_sparse) {\n    typedef typename linalg_traits<L2>::value_type T;\n    clear(l3);\n    typename linalg_traits<L2>::const_iterator it = vect_const_begin(l2),\n      ite = vect_const_end(l2);\n    for (; it != ite; ++it)\n      if (*it != T(0)) add(scaled(mat_const_col(l1, it.index()), *it), l3);\n  }\n\n  template <typename L1, typename L2, typename L3>\n  void mult_by_col(const L1& l1, const L2& l2, L3& l3, abstract_skyline) {\n    typedef typename linalg_traits<L2>::value_type T;\n    clear(l3); \n    typename linalg_traits<L2>::const_iterator it = vect_const_begin(l2),\n      ite = vect_const_end(l2);\n    for (; it != ite; ++it)\n      if (*it != T(0)) add(scaled(mat_const_col(l1, it.index()), *it), l3);\n  }\n\n  template <typename L1, typename L2, typename L3> inline\n  void mult_spec(const L1& l1, const L2& l2, L3& l3, row_major)\n  { mult_by_row(l1, l2, l3, typename linalg_traits<L3>::storage_type()); }\n\n  template <typename L1, typename L2, typename L3> inline\n  void mult_spec(const L1& l1, const L2& l2, L3& l3, col_major)\n  { mult_by_col(l1, l2, l3, typename linalg_traits<L2>::storage_type()); }\n\n  template <typename L1, typename L2, typename L3> inline\n  void mult_spec(const L1& l1, const L2& l2, L3& l3, abstract_null_type)\n  { mult_ind(l1, l2, l3, typename linalg_traits<L1>::storage_type()); }\n\n  template <typename L1, typename L2, typename L3>\n  void mult_ind(const L1& l1, const L2& l2, L3& l3, abstract_indirect) {\n    GMM_ASSERT1(false, \"gmm::mult(m, ., .) undefined for this kind of matrix\");\n  }\n\n  template <typename L1, typename L2, typename L3, typename L4> inline\n  void mult(const L1& l1, const L2& l2, const L3& l3, L4& l4) {\n    size_type m = mat_nrows(l1), n = mat_ncols(l1);\n    copy(l3, l4);\n    if (!m || !n) { gmm::copy(l3, l4); return; }\n    GMM_ASSERT2(n==vect_size(l2) && m==vect_size(l4), \"dimensions mismatch\");\n    if (!same_origin(l2, l4)) {\n      mult_add_spec(l1, l2, l4, typename principal_orientation_type<typename\n\t\t    linalg_traits<L1>::sub_orientation>::potype());\n    }\n    else {\n      GMM_WARNING2(\"Warning, A temporary is used for mult\\n\");\n      typename temporary_vector<L2>::vector_type temp(vect_size(l2));\n      copy(l2, temp);\n      mult_add_spec(l1,temp, l4, typename principal_orientation_type<typename\n\t\tlinalg_traits<L1>::sub_orientation>::potype());\n    }\n  }\n\n  template <typename L1, typename L2, typename L3, typename L4> inline\n  void mult(const L1& l1, const L2& l2, const L3& l3, const L4& l4)\n  { mult(l1, l2, l3, linalg_const_cast(l4)); } \n\n  ///@endcond\n  /** Multiply-accumulate. l3 += l1*l2; */\n  template <typename L1, typename L2, typename L3> inline\n  void mult_add(const L1& l1, const L2& l2, L3& l3) {\n    size_type m = mat_nrows(l1), n = mat_ncols(l1);\n    if (!m || !n) return;\n    GMM_ASSERT2(n==vect_size(l2) && m==vect_size(l3), \"dimensions mismatch\");\n    if (!same_origin(l2, l3)) {\n      mult_add_spec(l1, l2, l3, typename principal_orientation_type<typename\n\t\t    linalg_traits<L1>::sub_orientation>::potype());\n    }\n    else {\n      GMM_WARNING2(\"Warning, A temporary is used for mult\\n\");\n      typename temporary_vector<L3>::vector_type temp(vect_size(l2));\n      copy(l2, temp);\n      mult_add_spec(l1,temp, l3, typename principal_orientation_type<typename\n\t\tlinalg_traits<L1>::sub_orientation>::potype());\n    }\n  }\n  ///@cond DOXY_SHOW_ALL_FUNCTIONS\n\n  template <typename L1, typename L2, typename L3> inline\n  void mult_add(const L1& l1, const L2& l2, const L3& l3)\n  { mult_add(l1, l2, linalg_const_cast(l3)); } \n\n  template <typename L1, typename L2, typename L3>\n  void mult_add_by_row(const L1& l1, const L2& l2, L3& l3, abstract_sparse) {\n    typedef typename linalg_traits<L3>::value_type T;\n    size_type nr = mat_nrows(l1);\n    for (size_type i = 0; i < nr; ++i) {\n      T aux = vect_sp(mat_const_row(l1, i), l2);\n      if (aux != T(0)) l3[i] += aux;\n    }\n  }\n\n  template <typename L1, typename L2, typename L3>\n  void mult_add_by_row(const L1& l1, const L2& l2, L3& l3, abstract_skyline) {\n    typedef typename linalg_traits<L3>::value_type T;\n    size_type nr = mat_nrows(l1);\n    for (size_type i = 0; i < nr; ++i) {\n      T aux = vect_sp(mat_const_row(l1, i), l2);\n      if (aux != T(0)) l3[i] += aux;\n    }\n  }\n\n  template <typename L1, typename L2, typename L3>\n  void mult_add_by_row(const L1& l1, const L2& l2, L3& l3, abstract_dense) {\n    typename linalg_traits<L3>::iterator it=vect_begin(l3), ite=vect_end(l3);\n    typename linalg_traits<L1>::const_row_iterator\n      itr = mat_row_const_begin(l1);\n    for (; it != ite; ++it, ++itr)\n      *it += vect_sp(linalg_traits<L1>::row(itr), l2);\n  }\n\n  template <typename L1, typename L2, typename L3>\n  void mult_add_by_col(const L1& l1, const L2& l2, L3& l3, abstract_dense) {\n    size_type nc = mat_ncols(l1);\n    for (size_type i = 0; i < nc; ++i)\n      add(scaled(mat_const_col(l1, i), l2[i]), l3);\n  }\n\n  template <typename L1, typename L2, typename L3>\n  void mult_add_by_col(const L1& l1, const L2& l2, L3& l3, abstract_sparse) {\n    typename linalg_traits<L2>::const_iterator it = vect_const_begin(l2),\n      ite = vect_const_end(l2);\n    for (; it != ite; ++it)\n      if (*it != typename linalg_traits<L2>::value_type(0))\n\tadd(scaled(mat_const_col(l1, it.index()), *it), l3);\n  }\n\n  template <typename L1, typename L2, typename L3>\n  void mult_add_by_col(const L1& l1, const L2& l2, L3& l3, abstract_skyline) {\n    typename linalg_traits<L2>::const_iterator it = vect_const_begin(l2),\n      ite = vect_const_end(l2);\n    for (; it != ite; ++it)\n      if (*it != typename linalg_traits<L2>::value_type(0))\n\tadd(scaled(mat_const_col(l1, it.index()), *it), l3);\n  }\n\n  template <typename L1, typename L2, typename L3> inline\n  void mult_add_spec(const L1& l1, const L2& l2, L3& l3, row_major)\n  { mult_add_by_row(l1, l2, l3, typename linalg_traits<L3>::storage_type()); }\n\n  template <typename L1, typename L2, typename L3> inline\n  void mult_add_spec(const L1& l1, const L2& l2, L3& l3, col_major)\n  { mult_add_by_col(l1, l2, l3, typename linalg_traits<L2>::storage_type()); }\n\n  template <typename L1, typename L2, typename L3> inline\n  void mult_add_spec(const L1& l1, const L2& l2, L3& l3, abstract_null_type)\n  { mult_ind(l1, l2, l3, typename linalg_traits<L1>::storage_type()); }\n\n  template <typename L1, typename L2, typename L3>\n  void transposed_mult(const L1& l1, const L2& l2, const L3& l3)\n  { mult(gmm::transposed(l1), l2, l3); }\n\n\n  /* ******************************************************************** */\n  /*\t\tMatrix-matrix mult                                    \t  */\n  /* ******************************************************************** */\n  \n\n  struct g_mult {};  // generic mult, less optimized\n  struct c_mult {};  // col x col -> col mult\n  struct r_mult {};  // row x row -> row mult\n  struct rcmult {};  // row x col -> col mult\n  struct crmult {};  // col x row -> row mult\n\n\n  template<typename SO1, typename SO2, typename SO3> struct mult_t;\n  #define DEFMU__ template<> struct mult_t\n  DEFMU__<row_major  , row_major  , row_major  > { typedef r_mult t; };\n  DEFMU__<row_major  , row_major  , col_major  > { typedef g_mult t; };\n  DEFMU__<row_major  , row_major  , col_and_row> { typedef r_mult t; };\n  DEFMU__<row_major  , row_major  , row_and_col> { typedef r_mult t; };\n  DEFMU__<row_major  , col_major  , row_major  > { typedef rcmult t; };\n  DEFMU__<row_major  , col_major  , col_major  > { typedef rcmult t; };\n  DEFMU__<row_major  , col_major  , col_and_row> { typedef rcmult t; };\n  DEFMU__<row_major  , col_major  , row_and_col> { typedef rcmult t; };\n  DEFMU__<row_major  , col_and_row, row_major  > { typedef r_mult t; };\n  DEFMU__<row_major  , col_and_row, col_major  > { typedef rcmult t; };\n  DEFMU__<row_major  , col_and_row, col_and_row> { typedef rcmult t; };\n  DEFMU__<row_major  , col_and_row, row_and_col> { typedef rcmult t; };\n  DEFMU__<row_major  , row_and_col, row_major  > { typedef r_mult t; };\n  DEFMU__<row_major  , row_and_col, col_major  > { typedef rcmult t; };\n  DEFMU__<row_major  , row_and_col, col_and_row> { typedef r_mult t; };\n  DEFMU__<row_major  , row_and_col, row_and_col> { typedef r_mult t; };\n  DEFMU__<col_major  , row_major  , row_major  > { typedef crmult t; };\n  DEFMU__<col_major  , row_major  , col_major  > { typedef g_mult t; };\n  DEFMU__<col_major  , row_major  , col_and_row> { typedef crmult t; };\n  DEFMU__<col_major  , row_major  , row_and_col> { typedef crmult t; };\n  DEFMU__<col_major  , col_major  , row_major  > { typedef g_mult t; };\n  DEFMU__<col_major  , col_major  , col_major  > { typedef c_mult t; };\n  DEFMU__<col_major  , col_major  , col_and_row> { typedef c_mult t; };\n  DEFMU__<col_major  , col_major  , row_and_col> { typedef c_mult t; };\n  DEFMU__<col_major  , col_and_row, row_major  > { typedef crmult t; };\n  DEFMU__<col_major  , col_and_row, col_major  > { typedef c_mult t; };\n  DEFMU__<col_major  , col_and_row, col_and_row> { typedef c_mult t; };\n  DEFMU__<col_major  , col_and_row, row_and_col> { typedef c_mult t; };\n  DEFMU__<col_major  , row_and_col, row_major  > { typedef crmult t; };\n  DEFMU__<col_major  , row_and_col, col_major  > { typedef c_mult t; };\n  DEFMU__<col_major  , row_and_col, col_and_row> { typedef c_mult t; };\n  DEFMU__<col_major  , row_and_col, row_and_col> { typedef c_mult t; };\n  DEFMU__<col_and_row, row_major  , row_major  > { typedef r_mult t; };\n  DEFMU__<col_and_row, row_major  , col_major  > { typedef c_mult t; };\n  DEFMU__<col_and_row, row_major  , col_and_row> { typedef r_mult t; };\n  DEFMU__<col_and_row, row_major  , row_and_col> { typedef r_mult t; };\n  DEFMU__<col_and_row, col_major  , row_major  > { typedef rcmult t; };\n  DEFMU__<col_and_row, col_major  , col_major  > { typedef c_mult t; };\n  DEFMU__<col_and_row, col_major  , col_and_row> { typedef c_mult t; };\n  DEFMU__<col_and_row, col_major  , row_and_col> { typedef c_mult t; };\n  DEFMU__<col_and_row, col_and_row, row_major  > { typedef r_mult t; };\n  DEFMU__<col_and_row, col_and_row, col_major  > { typedef c_mult t; };\n  DEFMU__<col_and_row, col_and_row, col_and_row> { typedef c_mult t; };\n  DEFMU__<col_and_row, col_and_row, row_and_col> { typedef c_mult t; };\n  DEFMU__<col_and_row, row_and_col, row_major  > { typedef r_mult t; };\n  DEFMU__<col_and_row, row_and_col, col_major  > { typedef c_mult t; };\n  DEFMU__<col_and_row, row_and_col, col_and_row> { typedef c_mult t; };\n  DEFMU__<col_and_row, row_and_col, row_and_col> { typedef r_mult t; };\n  DEFMU__<row_and_col, row_major  , row_major  > { typedef r_mult t; };\n  DEFMU__<row_and_col, row_major  , col_major  > { typedef c_mult t; };\n  DEFMU__<row_and_col, row_major  , col_and_row> { typedef r_mult t; };\n  DEFMU__<row_and_col, row_major  , row_and_col> { typedef r_mult t; };\n  DEFMU__<row_and_col, col_major  , row_major  > { typedef rcmult t; };\n  DEFMU__<row_and_col, col_major  , col_major  > { typedef c_mult t; };\n  DEFMU__<row_and_col, col_major  , col_and_row> { typedef c_mult t; };\n  DEFMU__<row_and_col, col_major  , row_and_col> { typedef c_mult t; };\n  DEFMU__<row_and_col, col_and_row, row_major  > { typedef rcmult t; };\n  DEFMU__<row_and_col, col_and_row, col_major  > { typedef rcmult t; };\n  DEFMU__<row_and_col, col_and_row, col_and_row> { typedef rcmult t; };\n  DEFMU__<row_and_col, col_and_row, row_and_col> { typedef rcmult t; };\n  DEFMU__<row_and_col, row_and_col, row_major  > { typedef r_mult t; };\n  DEFMU__<row_and_col, row_and_col, col_major  > { typedef c_mult t; };\n  DEFMU__<row_and_col, row_and_col, col_and_row> { typedef r_mult t; };\n  DEFMU__<row_and_col, row_and_col, row_and_col> { typedef r_mult t; };\n\n  template <typename L1, typename L2, typename L3>\n  void mult_dispatch(const L1& l1, const L2& l2, L3& l3, abstract_matrix) {\n    typedef typename temporary_matrix<L3>::matrix_type temp_mat_type;\n    size_type m = mat_nrows(l1), n = mat_ncols(l1), k = mat_ncols(l2);\n    if (n == 0) { gmm::clear(l3); return; }\n    GMM_ASSERT2(n == mat_nrows(l2) && m == mat_nrows(l3) && k == mat_ncols(l3),\n\t\t\"dimensions mismatch\");\n\n    if (same_origin(l2, l3) || same_origin(l1, l3)) {\n      GMM_WARNING2(\"A temporary is used for mult\");\n      temp_mat_type temp(mat_nrows(l3), mat_ncols(l3));\n      mult_spec(l1, l2, temp, typename mult_t<\n\t\ttypename linalg_traits<L1>::sub_orientation,\n\t\ttypename linalg_traits<L2>::sub_orientation,\n\t\ttypename linalg_traits<temp_mat_type>::sub_orientation>::t());\n      copy(temp, l3);\n    }\n    else\n      mult_spec(l1, l2, l3, typename mult_t<\n\t\ttypename linalg_traits<L1>::sub_orientation,\n\t\ttypename linalg_traits<L2>::sub_orientation,\n\t\ttypename linalg_traits<L3>::sub_orientation>::t());\n  }\n\n  // Completely generic but inefficient\n\n  template <typename L1, typename L2, typename L3>\n  void mult_spec(const L1& l1, const L2& l2, L3& l3, g_mult) {\n    typedef typename linalg_traits<L3>::value_type T;\n    GMM_WARNING2(\"Inefficient generic matrix-matrix mult is used\");\n    for (size_type i = 0; i < mat_nrows(l3) ; ++i)\n      for (size_type j = 0; j < mat_ncols(l3) ; ++j) {\n\tT a(0);\n\tfor (size_type k = 0; k < mat_nrows(l2) ; ++k) a += l1(i, k)*l2(k, j);\n\tl3(i, j) = a;\n      }\n  }\n\n  // row x col matrix-matrix mult\n\n  template <typename L1, typename L2, typename L3>\n  void mult_row_col_with_temp(const L1& l1, const L2& l2, L3& l3, col_major) {\n    typedef typename temporary_col_matrix<L1>::matrix_type temp_col_mat;\n    temp_col_mat temp(mat_nrows(l1), mat_ncols(l1));\n    copy(l1, temp);\n    mult(temp, l2, l3);\n  }\n\n  template <typename L1, typename L2, typename L3>\n  void mult_row_col_with_temp(const L1& l1, const L2& l2, L3& l3, row_major) {\n    typedef typename temporary_row_matrix<L2>::matrix_type temp_row_mat;\n    temp_row_mat temp(mat_nrows(l2), mat_ncols(l2));\n    copy(l2, temp);\n    mult(l1, temp, l3);\n  }\n\n  template <typename L1, typename L2, typename L3>\n  void mult_spec(const L1& l1, const L2& l2, L3& l3, rcmult) {\n    if (is_sparse(l1) && is_sparse(l2)) {\n      GMM_WARNING3(\"Inefficient row matrix - col matrix mult for \"\n\t\t  \"sparse matrices, using temporary\");\n      mult_row_col_with_temp(l1, l2, l3, \n\t\t\t     typename principal_orientation_type<typename\n\t\t\t     linalg_traits<L3>::sub_orientation>::potype());\n    }\n    else {\n      typename linalg_traits<L2>::const_col_iterator\n\tit2b = linalg_traits<L2>::col_begin(l2), it2,\n\tite = linalg_traits<L2>::col_end(l2);\n      size_type i,j, k = mat_nrows(l1);\n      \n      for (i = 0; i < k; ++i) {\n\ttypename linalg_traits<L1>::const_sub_row_type r1=mat_const_row(l1, i);\n\tfor (it2 = it2b, j = 0; it2 != ite; ++it2, ++j)\n\t  l3(i,j) = vect_sp(r1, linalg_traits<L2>::col(it2));\n      }\n    }\n  }\n\n  // row - row matrix-matrix mult\n\n  template <typename L1, typename L2, typename L3> inline\n  void mult_spec(const L1& l1, const L2& l2, L3& l3, r_mult) {\n    mult_spec(l1, l2, l3,r_mult(),typename linalg_traits<L1>::storage_type());\n  }\n\n  template <typename L1, typename L2, typename L3>\n  void mult_spec(const L1& l1, const L2& l2, L3& l3, r_mult, abstract_dense) {\n    // optimizable\n    clear(l3);\n    size_type nn = mat_nrows(l3), mm = mat_nrows(l2);\n    for (size_type i = 0; i < nn; ++i) {\n      for (size_type j = 0; j < mm; ++j) {\n\tadd(scaled(mat_const_row(l2, j), l1(i, j)), mat_row(l3, i));\n      }\n    }\n  }\n\n  template <typename L1, typename L2, typename L3>\n  void mult_spec(const L1& l1, const L2& l2, L3& l3, r_mult, abstract_sparse) {\n    // optimizable\n    clear(l3);\n    size_type nn = mat_nrows(l3);\n    for (size_type i = 0; i < nn; ++i) {\n      typename linalg_traits<L1>::const_sub_row_type rl1=mat_const_row(l1, i);\n      typename linalg_traits<typename linalg_traits<L1>::const_sub_row_type>::\n\tconst_iterator it = vect_const_begin(rl1), ite = vect_const_end(rl1);\n      for (; it != ite; ++it)\n\tadd(scaled(mat_const_row(l2, it.index()), *it), mat_row(l3, i));\n    }\n  }\n\n  template <typename L1, typename L2, typename L3>\n  void mult_spec(const L1& l1, const L2& l2, L3& l3, r_mult, abstract_skyline)\n  { mult_spec(l1, l2, l3, r_mult(), abstract_sparse()); }\n\n  // col - col matrix-matrix mult\n\n  template <typename L1, typename L2, typename L3> inline\n  void mult_spec(const L1& l1, const L2& l2, L3& l3, c_mult) {\n    mult_spec(l1, l2,l3,c_mult(),typename linalg_traits<L2>::storage_type(),\n\t      typename linalg_traits<L2>::sub_orientation());\n  }\n\n\n  template <typename L1, typename L2, typename L3, typename ORIEN>\n  void mult_spec(const L1& l1, const L2& l2, L3& l3, c_mult,\n\t\t abstract_dense, ORIEN) {\n    typedef typename linalg_traits<L2>::value_type T;\n    size_type nn = mat_ncols(l3), mm = mat_ncols(l1);\n\n    for (size_type i = 0; i < nn; ++i) {\n      clear(mat_col(l3, i));\n      for (size_type j = 0; j < mm; ++j) {\n\tT b = l2(j, i);\n\tif (b != T(0)) add(scaled(mat_const_col(l1, j), b), mat_col(l3, i));\n      }\n    }\n  }\n\n  template <typename L1, typename L2, typename L3, typename ORIEN>\n  void mult_spec(const L1& l1, const L2& l2, L3& l3, c_mult,\n\t\t abstract_sparse, ORIEN) {\n    // optimizable\n    clear(l3);\n    size_type nn = mat_ncols(l3);\n    for (size_type i = 0; i < nn; ++i) {\n      typename linalg_traits<L2>::const_sub_col_type rc2=mat_const_col(l2, i);\n      typename linalg_traits<typename linalg_traits<L2>::const_sub_col_type>::\n\tconst_iterator it = vect_const_begin(rc2), ite = vect_const_end(rc2);\n      for (; it != ite; ++it)\n\tadd(scaled(mat_const_col(l1, it.index()), *it), mat_col(l3, i));\n    }\n  }\n\n  template <typename L1, typename L2, typename L3>\n  void mult_spec(const L1& l1, const L2& l2, L3& l3, c_mult,\n\t\t abstract_sparse, row_major) {\n     typedef typename linalg_traits<L2>::value_type T;\n     GMM_WARNING3(\"Inefficient matrix-matrix mult for sparse matrices\");\n     clear(l3);\n     size_type mm = mat_nrows(l2), nn = mat_ncols(l3);\n     for (size_type i = 0; i < nn; ++i)\n       for (size_type j = 0; j < mm; ++j) {\n\t T a = l2(i,j);\n\t if (a != T(0)) add(scaled(mat_const_col(l1, j), a), mat_col(l3, i));\n       }\n   }\n\n  template <typename L1, typename L2, typename L3, typename ORIEN> inline\n  void mult_spec(const L1& l1, const L2& l2, L3& l3, c_mult,\n\t\t abstract_skyline, ORIEN)\n  { mult_spec(l1, l2, l3, c_mult(), abstract_sparse(), ORIEN()); }\n\n  \n  // col - row matrix-matrix mult\n\n  template <typename L1, typename L2, typename L3> inline\n  void mult_spec(const L1& l1, const L2& l2, L3& l3, crmult)\n  { mult_spec(l1,l2,l3,crmult(), typename linalg_traits<L1>::storage_type()); }\n\n\n  template <typename L1, typename L2, typename L3>\n  void mult_spec(const L1& l1, const L2& l2, L3& l3, crmult, abstract_dense) {\n    // optimizable\n    clear(l3);\n    size_type nn = mat_ncols(l1), mm = mat_nrows(l1);\n    for (size_type i = 0; i < nn; ++i) {\n      for (size_type j = 0; j < mm; ++j)\n      add(scaled(mat_const_row(l2, i), l1(j, i)), mat_row(l3, j));\n    }\n  }\n\n  template <typename L1, typename L2, typename L3>\n  void mult_spec(const L1& l1, const L2& l2, L3& l3, crmult, abstract_sparse) {\n    // optimizable\n    clear(l3);\n    size_type nn = mat_ncols(l1);\n    for (size_type i = 0; i < nn; ++i) {\n      typename linalg_traits<L1>::const_sub_col_type rc1=mat_const_col(l1, i);\n      typename linalg_traits<typename linalg_traits<L1>::const_sub_col_type>::\n\tconst_iterator it = vect_const_begin(rc1), ite = vect_const_end(rc1);\n      for (; it != ite; ++it)\n\tadd(scaled(mat_const_row(l2, i), *it), mat_row(l3, it.index()));\n    }\n  }\n\n  template <typename L1, typename L2, typename L3> inline\n  void mult_spec(const L1& l1, const L2& l2, L3& l3, crmult, abstract_skyline)\n  { mult_spec(l1, l2, l3, crmult(), abstract_sparse()); }\n  \n\n  /* ******************************************************************** */\n  /*\t\tSymmetry test.                                     \t  */\n  /* ******************************************************************** */\n\n  ///@endcond\n  /** test if A is symmetric.\n      @param A a matrix.\n      @param tol a threshold.\n  */\n  template <typename MAT> inline\n  bool is_symmetric(const MAT &A, magnitude_of_linalg(MAT) tol\n\t\t    = magnitude_of_linalg(MAT)(-1)) {\n    typedef magnitude_of_linalg(MAT) R;\n    if (tol < R(0)) tol = default_tol(R()) * mat_maxnorm(A);\n    if (mat_nrows(A) != mat_ncols(A)) return false;\n    return is_symmetric(A, tol, typename linalg_traits<MAT>::storage_type());\n  }\n  ///@cond DOXY_SHOW_ALL_FUNCTIONS\n\n  template <typename MAT> \n  bool is_symmetric(const MAT &A, magnitude_of_linalg(MAT) tol, \n\t\t    abstract_dense) {\n    size_type m = mat_nrows(A);\n    for (size_type i = 1; i < m; ++i)\n      for (size_type j = 0; j < i; ++j)\n\tif (gmm::abs(A(i, j)-A(j, i)) > tol) return false;\n    return true;\n  }\n\n  template <typename MAT> \n  bool is_symmetric(const MAT &A, magnitude_of_linalg(MAT) tol, \n\t\t    abstract_sparse) {\n    return is_symmetric(A, tol, typename principal_orientation_type<typename\n\t\t\tlinalg_traits<MAT>::sub_orientation>::potype());\n  }\n\n  template <typename MAT> \n  bool is_symmetric(const MAT &A, magnitude_of_linalg(MAT) tol, \n\t\t    row_major) {\n    for (size_type i = 0; i < mat_nrows(A); ++i) {\n      typedef typename linalg_traits<MAT>::const_sub_row_type row_type;\n      row_type row = mat_const_row(A, i);\n      typename linalg_traits<row_type>::const_iterator\n\tit = vect_const_begin(row), ite = vect_const_end(row);\n      for (; it != ite; ++it)\n\tif (gmm::abs(*it - A(it.index(), i)) > tol) return false;\n    }\n    return true;\n  }\n\n  template <typename MAT> \n  bool is_symmetric(const MAT &A, magnitude_of_linalg(MAT) tol, \n\t\t    col_major) {\n    for (size_type i = 0; i < mat_ncols(A); ++i) {\n      typedef typename linalg_traits<MAT>::const_sub_col_type col_type;\n      col_type col = mat_const_col(A, i);\n      typename linalg_traits<col_type>::const_iterator\n\tit = vect_const_begin(col), ite = vect_const_end(col);\n      for (; it != ite; ++it)\n\tif (gmm::abs(*it - A(i, it.index())) > tol) return false;\n    }\n    return true;\n  }\n\n  template <typename MAT> \n  bool is_symmetric(const MAT &A, magnitude_of_linalg(MAT) tol, \n\t\t    abstract_skyline)\n  { return is_symmetric(A, tol, abstract_sparse()); }\n\n  ///@endcond\n  /** test if A is Hermitian.\n      @param A a matrix.\n      @param tol a threshold.\n  */\n  template <typename MAT> inline\n  bool is_hermitian(const MAT &A, magnitude_of_linalg(MAT) tol\n\t\t    = magnitude_of_linalg(MAT)(-1)) {\n    typedef magnitude_of_linalg(MAT) R;\n    if (tol < R(0)) tol = default_tol(R()) * mat_maxnorm(A);\n    if (mat_nrows(A) != mat_ncols(A)) return false;\n    return is_hermitian(A, tol, typename linalg_traits<MAT>::storage_type());\n  }\n  ///@cond DOXY_SHOW_ALL_FUNCTIONS\n\n  template <typename MAT> \n  bool is_hermitian(const MAT &A, magnitude_of_linalg(MAT) tol,\n\t\t    abstract_dense) {\n    size_type m = mat_nrows(A);\n    for (size_type i = 1; i < m; ++i)\n      for (size_type j = 0; j < i; ++j)\n\tif (gmm::abs(A(i, j)-gmm::conj(A(j, i))) > tol) return false;\n    return true;\n  }\n\n  template <typename MAT> \n  bool is_hermitian(const MAT &A, magnitude_of_linalg(MAT) tol, \n\t\t    abstract_sparse) {\n    return is_hermitian(A, tol, typename principal_orientation_type<typename\n\t\t\tlinalg_traits<MAT>::sub_orientation>::potype());\n  }\n\n  template <typename MAT> \n  bool is_hermitian(const MAT &A, magnitude_of_linalg(MAT) tol, \n\t\t    row_major) {\n    for (size_type i = 0; i < mat_nrows(A); ++i) {\n      typedef typename linalg_traits<MAT>::const_sub_row_type row_type;\n      row_type row = mat_const_row(A, i);\n      typename linalg_traits<row_type>::const_iterator\n\tit = vect_const_begin(row), ite = vect_const_end(row);\n      for (; it != ite; ++it)\n\tif (gmm::abs(gmm::conj(*it) - A(it.index(), i)) > tol) return false;\n    }\n    return true;\n  }\n\n  template <typename MAT> \n  bool is_hermitian(const MAT &A, magnitude_of_linalg(MAT) tol, \n\t\t    col_major) {\n    for (size_type i = 0; i < mat_ncols(A); ++i) {\n      typedef typename linalg_traits<MAT>::const_sub_col_type col_type;\n      col_type col = mat_const_col(A, i);\n      typename linalg_traits<col_type>::const_iterator\n\tit = vect_const_begin(col), ite = vect_const_end(col);\n      for (; it != ite; ++it)\n\tif (gmm::abs(gmm::conj(*it) - A(i, it.index())) > tol) return false;\n    }\n    return true;\n  }\n\n  template <typename MAT> \n  bool is_hermitian(const MAT &A, magnitude_of_linalg(MAT) tol, \n\t\t    abstract_skyline)\n  { return is_hermitian(A, tol, abstract_sparse()); }\n  ///@endcond\n}\n\n\n#endif //  GMM_BLAS_H__\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_blas_interface.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2003-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n/**@file gmm_blas_interface.h\n   @author  Yves Renard <Yves.Renard@insa-lyon.fr>\n   @date October 7, 2003.\n   @brief gmm interface for fortran BLAS.\n*/\n\n#if defined(GETFEM_USES_BLAS) || defined(GMM_USES_BLAS) \\\n  || defined(GMM_USES_LAPACK) || defined(GMM_USES_ATLAS)\n\n#ifndef GMM_BLAS_INTERFACE_H\n#define GMM_BLAS_INTERFACE_H\n\n#include \"gmm_blas.h\"\n#include \"gmm_interface.h\"\n#include \"gmm_matrix.h\"\n\nnamespace gmm {\n\n#define GMMLAPACK_TRACE(f) \n  // #define GMMLAPACK_TRACE(f) cout << \"function \" << f << \" called\" << endl;\n\n  /* ********************************************************************* */\n  /* Operations interfaced for T = float, double, std::complex<float>      */\n  /*    or std::complex<double> :                                          */\n  /*                                                                       */\n  /* vect_norm2(std::vector<T>)                                            */\n  /*                                                                       */\n  /* vect_sp(std::vector<T>, std::vector<T>)                               */\n  /* vect_sp(scaled(std::vector<T>), std::vector<T>)                       */\n  /* vect_sp(std::vector<T>, scaled(std::vector<T>))                       */\n  /* vect_sp(scaled(std::vector<T>), scaled(std::vector<T>))               */\n  /*                                                                       */\n  /* vect_hp(std::vector<T>, std::vector<T>)                               */\n  /* vect_hp(scaled(std::vector<T>), std::vector<T>)                       */\n  /* vect_hp(std::vector<T>, scaled(std::vector<T>))                       */\n  /* vect_hp(scaled(std::vector<T>), scaled(std::vector<T>))               */\n  /*                                                                       */\n  /* add(std::vector<T>, std::vector<T>)                                   */\n  /* add(scaled(std::vector<T>, a), std::vector<T>)                        */ \n  /*                                                                       */\n  /* mult(dense_matrix<T>, dense_matrix<T>, dense_matrix<T>)               */\n  /* mult(transposed(dense_matrix<T>), dense_matrix<T>, dense_matrix<T>)   */\n  /* mult(dense_matrix<T>, transposed(dense_matrix<T>), dense_matrix<T>)   */\n  /* mult(transposed(dense_matrix<T>), transposed(dense_matrix<T>),        */\n  /*      dense_matrix<T>)                                                 */\n  /* mult(conjugated(dense_matrix<T>), dense_matrix<T>, dense_matrix<T>)   */\n  /* mult(dense_matrix<T>, conjugated(dense_matrix<T>), dense_matrix<T>)   */\n  /* mult(conjugated(dense_matrix<T>), conjugated(dense_matrix<T>),        */\n  /*      dense_matrix<T>)                                                 */\n  /*                                                                       */\n  /* mult(dense_matrix<T>, std::vector<T>, std::vector<T>)                 */\n  /* mult(transposed(dense_matrix<T>), std::vector<T>, std::vector<T>)     */\n  /* mult(conjugated(dense_matrix<T>), std::vector<T>, std::vector<T>)     */\n  /* mult(dense_matrix<T>, scaled(std::vector<T>), std::vector<T>)         */\n  /* mult(transposed(dense_matrix<T>), scaled(std::vector<T>),             */\n  /*      std::vector<T>)                                                  */\n  /* mult(conjugated(dense_matrix<T>), scaled(std::vector<T>),             */\n  /*      std::vector<T>)                                                  */\n  /*                                                                       */\n  /* mult_add(dense_matrix<T>, std::vector<T>, std::vector<T>)             */\n  /* mult_add(transposed(dense_matrix<T>), std::vector<T>, std::vector<T>) */\n  /* mult_add(conjugated(dense_matrix<T>), std::vector<T>, std::vector<T>) */\n  /* mult_add(dense_matrix<T>, scaled(std::vector<T>), std::vector<T>)     */\n  /* mult_add(transposed(dense_matrix<T>), scaled(std::vector<T>),         */\n  /*          std::vector<T>)                                              */\n  /* mult_add(conjugated(dense_matrix<T>), scaled(std::vector<T>),         */\n  /*          std::vector<T>)                                              */\n  /*                                                                       */\n  /* mult(dense_matrix<T>, std::vector<T>, std::vector<T>, std::vector<T>) */\n  /* mult(transposed(dense_matrix<T>), std::vector<T>, std::vector<T>,     */\n  /*      std::vector<T>)                                                  */\n  /* mult(conjugated(dense_matrix<T>), std::vector<T>, std::vector<T>,     */\n  /*      std::vector<T>)                                                  */\n  /* mult(dense_matrix<T>, scaled(std::vector<T>), std::vector<T>,         */\n  /*      std::vector<T>)                                                  */\n  /* mult(transposed(dense_matrix<T>), scaled(std::vector<T>),             */\n  /*      std::vector<T>, std::vector<T>)                                  */\n  /* mult(conjugated(dense_matrix<T>), scaled(std::vector<T>),             */\n  /*      std::vector<T>, std::vector<T>)                                  */\n  /* mult(dense_matrix<T>, std::vector<T>, scaled(std::vector<T>),         */\n  /*      std::vector<T>)                                                  */\n  /* mult(transposed(dense_matrix<T>), std::vector<T>,                     */\n  /*      scaled(std::vector<T>), std::vector<T>)                          */\n  /* mult(conjugated(dense_matrix<T>), std::vector<T>,                     */\n  /*      scaled(std::vector<T>), std::vector<T>)                          */\n  /* mult(dense_matrix<T>, scaled(std::vector<T>), scaled(std::vector<T>), */\n  /*   std::vector<T>)                                                     */\n  /* mult(transposed(dense_matrix<T>), scaled(std::vector<T>),             */\n  /*      scaled(std::vector<T>), std::vector<T>)                          */\n  /* mult(conjugated(dense_matrix<T>), scaled(std::vector<T>),             */\n  /*      scaled(std::vector<T>), std::vector<T>)                          */\n  /*                                                                       */\n  /* lower_tri_solve(dense_matrix<T>, std::vector<T>, k, b)                */\n  /* upper_tri_solve(dense_matrix<T>, std::vector<T>, k, b)                */\n  /* lower_tri_solve(transposed(dense_matrix<T>), std::vector<T>, k, b)    */\n  /* upper_tri_solve(transposed(dense_matrix<T>), std::vector<T>, k, b)    */\n  /* lower_tri_solve(conjugated(dense_matrix<T>), std::vector<T>, k, b)    */\n  /* upper_tri_solve(conjugated(dense_matrix<T>), std::vector<T>, k, b)    */\n  /*                                                                       */\n  /* rank_one_update(dense_matrix<T>, std::vector<T>, std::vector<T>)      */\n  /* rank_one_update(dense_matrix<T>, scaled(std::vector<T>),              */\n  /*                                  std::vector<T>)                      */\n  /* rank_one_update(dense_matrix<T>, std::vector<T>,                      */\n  /*                                  scaled(std::vector<T>))              */\n  /*                                                                       */\n  /* ********************************************************************* */\n\n  /* ********************************************************************* */\n  /* Basic defines.                                                        */\n  /* ********************************************************************* */\n\n# define BLAS_S float\n# define BLAS_D double\n# define BLAS_C std::complex<float>\n# define BLAS_Z std::complex<double>\n\n  /* ********************************************************************* */\n  /* BLAS functions used.                                                  */\n  /* ********************************************************************* */\n  extern \"C\" void daxpy_(const int *n, const double *alpha, const double *x, const int *incx, double *y, const int *incy);\n  extern \"C\" {\n    void sgemm_(...); void dgemm_(...); void cgemm_(...); void zgemm_(...);\n    void sgemv_(...); void dgemv_(...); void cgemv_(...); void zgemv_(...);\n    void strsv_(...); void dtrsv_(...); void ctrsv_(...); void ztrsv_(...);\n    void saxpy_(...); /*void daxpy_(...); */void caxpy_(...); void zaxpy_(...);\n    BLAS_S sdot_ (...); BLAS_D ddot_ (...);\n    BLAS_C cdotu_(...); BLAS_Z zdotu_(...);\n    BLAS_C cdotc_(...); BLAS_Z zdotc_(...);\n    BLAS_S snrm2_(...); BLAS_D dnrm2_(...);\n    BLAS_S scnrm2_(...); BLAS_D dznrm2_(...);\n    void  sger_(...); void  dger_(...); void  cgerc_(...); void  zgerc_(...); \n  }\n\n  /* ********************************************************************* */\n  /* vect_norm2(x).                                                        */\n  /* ********************************************************************* */\n\n  # define nrm2_interface(param1, trans1, blas_name, base_type)            \\\n  inline number_traits<base_type >::magnitude_type                         \\\n    vect_norm2(param1(base_type)) {                                        \\\n    GMMLAPACK_TRACE(\"nrm2_interface\");                                     \\\n    int inc(1), n(int(vect_size(x))); trans1(base_type);\t       \t   \\\n    return blas_name(&n, &x[0], &inc);                                     \\\n  }\n\n# define nrm2_p1(base_type) const std::vector<base_type > &x\n# define nrm2_trans1(base_type)\n\n  nrm2_interface(nrm2_p1, nrm2_trans1, snrm2_ , BLAS_S)\n  nrm2_interface(nrm2_p1, nrm2_trans1, dnrm2_ , BLAS_D)\n  nrm2_interface(nrm2_p1, nrm2_trans1, scnrm2_, BLAS_C)\n  nrm2_interface(nrm2_p1, nrm2_trans1, dznrm2_, BLAS_Z)\n\n  /* ********************************************************************* */\n  /* vect_sp(x, y).                                                        */\n  /* ********************************************************************* */\n\n  # define dot_interface(param1, trans1, mult1, param2, trans2, mult2,     \\\n                         blas_name, base_type)                             \\\n  inline base_type vect_sp(param1(base_type), param2(base_type)) {         \\\n    GMMLAPACK_TRACE(\"dot_interface\");                                      \\\n    trans1(base_type); trans2(base_type); int inc(1), n(int(vect_size(y)));\\\n    return mult1 mult2 blas_name(&n, &x[0], &inc, &y[0], &inc);            \\\n  }\n\n# define dot_p1(base_type) const std::vector<base_type > &x\n# define dot_trans1(base_type)\n# define dot_p1_s(base_type)                                               \\\n    const scaled_vector_const_ref<std::vector<base_type >, base_type > &x_\n# define dot_trans1_s(base_type)                                           \\\n         std::vector<base_type > &x =                                      \\\n         const_cast<std::vector<base_type > &>(*(linalg_origin(x_)));      \\\n         base_type a(x_.r)\n\n# define dot_p2(base_type) const std::vector<base_type > &y\n# define dot_trans2(base_type)\n# define dot_p2_s(base_type)                                               \\\n    const scaled_vector_const_ref<std::vector<base_type >, base_type > &y_\n# define dot_trans2_s(base_type)                                           \\\n         std::vector<base_type > &y =                                      \\\n         const_cast<std::vector<base_type > &>(*(linalg_origin(y_)));      \\\n         base_type b(y_.r)\n\n  dot_interface(dot_p1, dot_trans1, (BLAS_S), dot_p2, dot_trans2, (BLAS_S),\n\t\tsdot_ , BLAS_S)\n  dot_interface(dot_p1, dot_trans1, (BLAS_D), dot_p2, dot_trans2, (BLAS_D),\n\t\tddot_ , BLAS_D)\n  dot_interface(dot_p1, dot_trans1, (BLAS_C), dot_p2, dot_trans2, (BLAS_C),\n\t\tcdotu_, BLAS_C)\n  dot_interface(dot_p1, dot_trans1, (BLAS_Z), dot_p2, dot_trans2, (BLAS_Z),\n\t\tzdotu_, BLAS_Z)\n  \n  dot_interface(dot_p1_s, dot_trans1_s, a*, dot_p2, dot_trans2, (BLAS_S),\n\t\tsdot_ ,BLAS_S)\n  dot_interface(dot_p1_s, dot_trans1_s, a*, dot_p2, dot_trans2, (BLAS_D),\n\t\tddot_ ,BLAS_D)\n  dot_interface(dot_p1_s, dot_trans1_s, a*, dot_p2, dot_trans2, (BLAS_C),\n\t\tcdotu_,BLAS_C)\n  dot_interface(dot_p1_s, dot_trans1_s, a*, dot_p2, dot_trans2, (BLAS_Z),\n\t\tzdotu_,BLAS_Z)\n  \n  dot_interface(dot_p1, dot_trans1, (BLAS_S), dot_p2_s, dot_trans2_s, b*,\n\t\tsdot_ ,BLAS_S)\n  dot_interface(dot_p1, dot_trans1, (BLAS_D), dot_p2_s, dot_trans2_s, b*,\n\t\tddot_ ,BLAS_D)\n  dot_interface(dot_p1, dot_trans1, (BLAS_C), dot_p2_s, dot_trans2_s, b*,\n\t\tcdotu_,BLAS_C)\n  dot_interface(dot_p1, dot_trans1, (BLAS_Z), dot_p2_s, dot_trans2_s, b*,\n\t\t  zdotu_,BLAS_Z)\n\n  dot_interface(dot_p1_s,dot_trans1_s,a*,dot_p2_s,dot_trans2_s,b*,sdot_ ,\n\t\tBLAS_S)\n  dot_interface(dot_p1_s,dot_trans1_s,a*,dot_p2_s,dot_trans2_s,b*,ddot_ ,\n\t\tBLAS_D)\n  dot_interface(dot_p1_s,dot_trans1_s,a*,dot_p2_s,dot_trans2_s,b*,cdotu_,\n\t\tBLAS_C)\n  dot_interface(dot_p1_s,dot_trans1_s,a*,dot_p2_s,dot_trans2_s,b*,zdotu_,\n\t\tBLAS_Z)\n\n\n  /* ********************************************************************* */\n  /* vect_hp(x, y).                                                        */\n  /* ********************************************************************* */\n\n  # define dotc_interface(param1, trans1, mult1, param2, trans2, mult2,    \\\n                         blas_name, base_type)                             \\\n  inline base_type vect_hp(param1(base_type), param2(base_type)) {         \\\n    GMMLAPACK_TRACE(\"dotc_interface\");                                     \\\n    trans1(base_type); trans2(base_type); int inc(1), n(int(vect_size(y)));\\\n    return mult1 mult2 blas_name(&n, &x[0], &inc, &y[0], &inc);            \\\n  }\n\n# define dotc_p1(base_type) const std::vector<base_type > &x\n# define dotc_trans1(base_type)\n# define dotc_p1_s(base_type)                                              \\\n    const scaled_vector_const_ref<std::vector<base_type >, base_type > &x_\n# define dotc_trans1_s(base_type)                                          \\\n         std::vector<base_type > &x =                                      \\\n         const_cast<std::vector<base_type > &>(*(linalg_origin(x_)));      \\\n         base_type a(x_.r)\n\n# define dotc_p2(base_type) const std::vector<base_type > &y\n# define dotc_trans2(base_type)\n# define dotc_p2_s(base_type)                                              \\\n    const scaled_vector_const_ref<std::vector<base_type >, base_type > &y_\n# define dotc_trans2_s(base_type)                                          \\\n         std::vector<base_type > &y =                                      \\\n         const_cast<std::vector<base_type > &>(*(linalg_origin(y_)));      \\\n         base_type b(gmm::conj(y_.r))\n\n  dotc_interface(dotc_p1, dotc_trans1, (BLAS_S), dotc_p2, dotc_trans2,\n\t\t (BLAS_S),sdot_ ,BLAS_S)\n  dotc_interface(dotc_p1, dotc_trans1, (BLAS_D), dotc_p2, dotc_trans2,\n\t\t (BLAS_D),ddot_ ,BLAS_D)\n  dotc_interface(dotc_p1, dotc_trans1, (BLAS_C), dotc_p2, dotc_trans2,\n\t\t (BLAS_C),cdotc_,BLAS_C)\n  dotc_interface(dotc_p1, dotc_trans1, (BLAS_Z), dotc_p2, dotc_trans2,\n\t\t (BLAS_Z),zdotc_,BLAS_Z)\n  \n  dotc_interface(dotc_p1_s, dotc_trans1_s, a*, dotc_p2, dotc_trans2,\n\t\t (BLAS_S),sdot_, BLAS_S)\n  dotc_interface(dotc_p1_s, dotc_trans1_s, a*, dotc_p2, dotc_trans2,\n\t\t (BLAS_D),ddot_ , BLAS_D)\n  dotc_interface(dotc_p1_s, dotc_trans1_s, a*, dotc_p2, dotc_trans2,\n\t\t (BLAS_C),cdotc_, BLAS_C)\n  dotc_interface(dotc_p1_s, dotc_trans1_s, a*, dotc_p2, dotc_trans2,\n\t\t (BLAS_Z),zdotc_, BLAS_Z)\n  \n  dotc_interface(dotc_p1, dotc_trans1, (BLAS_S), dotc_p2_s, dotc_trans2_s,\n\t\t b*,sdot_ , BLAS_S)\n  dotc_interface(dotc_p1, dotc_trans1, (BLAS_D), dotc_p2_s, dotc_trans2_s,\n\t\t b*,ddot_ , BLAS_D)\n  dotc_interface(dotc_p1, dotc_trans1, (BLAS_C), dotc_p2_s, dotc_trans2_s,\n\t\t b*,cdotc_, BLAS_C)\n  dotc_interface(dotc_p1, dotc_trans1, (BLAS_Z), dotc_p2_s, dotc_trans2_s,\n\t\t   b*,zdotc_, BLAS_Z)\n\n  dotc_interface(dotc_p1_s,dotc_trans1_s,a*,dotc_p2_s,dotc_trans2_s,b*,sdot_ ,\n\t\t BLAS_S)\n  dotc_interface(dotc_p1_s,dotc_trans1_s,a*,dotc_p2_s,dotc_trans2_s,b*,ddot_ ,\n\t\t BLAS_D)\n  dotc_interface(dotc_p1_s,dotc_trans1_s,a*,dotc_p2_s,dotc_trans2_s,b*,cdotc_,\n\t\t BLAS_C)\n  dotc_interface(dotc_p1_s,dotc_trans1_s,a*,dotc_p2_s,dotc_trans2_s,b*,zdotc_,\n\t\t BLAS_Z)\n\n  /* ********************************************************************* */\n  /* add(x, y).                                                            */\n  /* ********************************************************************* */\n\n# define axpy_interface(param1, trans1, blas_name, base_type)              \\\n  inline void add(param1(base_type), std::vector<base_type > &y) {         \\\n    GMMLAPACK_TRACE(\"axpy_interface\");                                     \\\n    int inc(1), n(int(vect_size(y))); trans1(base_type);\t \t   \\\n    blas_name(&n, &a, &x[0], &inc, &y[0], &inc);                           \\\n  }\n\n# define axpy_p1(base_type) const std::vector<base_type > &x\n# define axpy_trans1(base_type) base_type a(1)\n# define axpy_p1_s(base_type)                                              \\\n    const scaled_vector_const_ref<std::vector<base_type >, base_type > &x_\n# define axpy_trans1_s(base_type)                                          \\\n         std::vector<base_type > &x =                                      \\\n         const_cast<std::vector<base_type > &>(*(linalg_origin(x_)));      \\\n         base_type a(x_.r)\n\n  axpy_interface(axpy_p1, axpy_trans1, saxpy_, BLAS_S)\n  axpy_interface(axpy_p1, axpy_trans1, daxpy_, BLAS_D)\n  axpy_interface(axpy_p1, axpy_trans1, caxpy_, BLAS_C)\n  axpy_interface(axpy_p1, axpy_trans1, zaxpy_, BLAS_Z)\n  \n  axpy_interface(axpy_p1_s, axpy_trans1_s, saxpy_, BLAS_S)\n  axpy_interface(axpy_p1_s, axpy_trans1_s, daxpy_, BLAS_D)\n  axpy_interface(axpy_p1_s, axpy_trans1_s, caxpy_, BLAS_C)\n  axpy_interface(axpy_p1_s, axpy_trans1_s, zaxpy_, BLAS_Z)\n  \n\n  /* ********************************************************************* */\n  /* mult_add(A, x, z).                                                    */\n  /* ********************************************************************* */\n  \n# define gemv_interface(param1, trans1, param2, trans2, blas_name,         \\\n\t\t\tbase_type, orien)                                  \\\n  inline void mult_add_spec(param1(base_type), param2(base_type),          \\\n              std::vector<base_type > &z, orien) {                         \\\n    GMMLAPACK_TRACE(\"gemv_interface\");                                     \\\n    trans1(base_type); trans2(base_type); base_type beta(1);               \\\n    int m(int(mat_nrows(A))), lda(m), n(int(mat_ncols(A))), inc(1);\t   \\\n    if (m && n) blas_name(&t, &m, &n, &alpha, &A(0,0), &lda, &x[0], &inc,  \\\n                          &beta, &z[0], &inc);                             \\\n    else gmm::clear(z);                                                    \\\n  }\n\n  // First parameter\n# define gem_p1_n(base_type)  const dense_matrix<base_type > &A\n# define gem_trans1_n(base_type) const char t = 'N'\n# define gem_p1_t(base_type)                                               \\\n         const transposed_col_ref<dense_matrix<base_type > *> &A_\n# define gem_trans1_t(base_type) dense_matrix<base_type > &A =             \\\n         const_cast<dense_matrix<base_type > &>(*(linalg_origin(A_)));     \\\n         const char t = 'T'\n# define gem_p1_tc(base_type)                                              \\\n         const transposed_col_ref<const dense_matrix<base_type > *> &A_\n# define gem_p1_c(base_type)                                               \\\n         const conjugated_col_matrix_const_ref<dense_matrix<base_type > > &A_\n# define gem_trans1_c(base_type) dense_matrix<base_type > &A =             \\\n         const_cast<dense_matrix<base_type > &>(*(linalg_origin(A_)));     \\\n         const char t = 'C'\n\n  // second parameter \n# define gemv_p2_n(base_type)  const std::vector<base_type > &x\n# define gemv_trans2_n(base_type) base_type alpha(1)\n# define gemv_p2_s(base_type)                                              \\\n    const scaled_vector_const_ref<std::vector<base_type >, base_type > &x_\n# define gemv_trans2_s(base_type) std::vector<base_type > &x =             \\\n         const_cast<std::vector<base_type > &>(*(linalg_origin(x_)));      \\\n         base_type alpha(x_.r)\n\n  // Z <- AX + Z.\n  gemv_interface(gem_p1_n, gem_trans1_n, gemv_p2_n, gemv_trans2_n, sgemv_,\n\t\t BLAS_S, col_major)\n  gemv_interface(gem_p1_n, gem_trans1_n, gemv_p2_n, gemv_trans2_n, dgemv_,\n\t\t BLAS_D, col_major)\n  gemv_interface(gem_p1_n, gem_trans1_n, gemv_p2_n, gemv_trans2_n, cgemv_,\n\t\t BLAS_C, col_major)\n  gemv_interface(gem_p1_n, gem_trans1_n, gemv_p2_n, gemv_trans2_n, zgemv_,\n\t\t BLAS_Z, col_major)\n\n  // Z <- transposed(A)X + Z.\n  gemv_interface(gem_p1_t, gem_trans1_t, gemv_p2_n, gemv_trans2_n, sgemv_,\n\t\t BLAS_S, row_major)\n  gemv_interface(gem_p1_t, gem_trans1_t, gemv_p2_n, gemv_trans2_n, dgemv_,\n\t\t BLAS_D, row_major)\n  gemv_interface(gem_p1_t, gem_trans1_t, gemv_p2_n, gemv_trans2_n, cgemv_,\n\t\t BLAS_C, row_major)\n  gemv_interface(gem_p1_t, gem_trans1_t, gemv_p2_n, gemv_trans2_n, zgemv_,\n\t\t BLAS_Z, row_major)\n  \n  // Z <- transposed(const A)X + Z.\n  gemv_interface(gem_p1_tc, gem_trans1_t, gemv_p2_n, gemv_trans2_n, sgemv_,\n\t\t BLAS_S, row_major)\n  gemv_interface(gem_p1_tc, gem_trans1_t, gemv_p2_n, gemv_trans2_n, dgemv_,\n\t\t BLAS_D, row_major)\n  gemv_interface(gem_p1_tc, gem_trans1_t, gemv_p2_n, gemv_trans2_n, cgemv_,\n\t\t BLAS_C, row_major)\n  gemv_interface(gem_p1_tc, gem_trans1_t, gemv_p2_n, gemv_trans2_n, zgemv_,\n\t\t BLAS_Z, row_major)\n  \n  // Z <- conjugated(A)X + Z.\n  gemv_interface(gem_p1_c, gem_trans1_c, gemv_p2_n, gemv_trans2_n, sgemv_,\n\t\t BLAS_S, row_major)\n  gemv_interface(gem_p1_c, gem_trans1_c, gemv_p2_n, gemv_trans2_n, dgemv_,\n\t\t BLAS_D, row_major)\n  gemv_interface(gem_p1_c, gem_trans1_c, gemv_p2_n, gemv_trans2_n, cgemv_,\n\t\t BLAS_C, row_major)\n  gemv_interface(gem_p1_c, gem_trans1_c, gemv_p2_n, gemv_trans2_n, zgemv_,\n\t\t BLAS_Z, row_major)\n\n  // Z <- A scaled(X) + Z.\n  gemv_interface(gem_p1_n, gem_trans1_n, gemv_p2_s, gemv_trans2_s, sgemv_,\n\t\t BLAS_S, col_major)\n  gemv_interface(gem_p1_n, gem_trans1_n, gemv_p2_s, gemv_trans2_s, dgemv_,\n\t\t BLAS_D, col_major)\n  gemv_interface(gem_p1_n, gem_trans1_n, gemv_p2_s, gemv_trans2_s, cgemv_,\n\t\t BLAS_C, col_major)\n  gemv_interface(gem_p1_n, gem_trans1_n, gemv_p2_s, gemv_trans2_s, zgemv_,\n\t\t BLAS_Z, col_major)\n\n  // Z <- transposed(A) scaled(X) + Z.\n  gemv_interface(gem_p1_t, gem_trans1_t, gemv_p2_s, gemv_trans2_s, sgemv_,\n\t\t BLAS_S, row_major)\n  gemv_interface(gem_p1_t, gem_trans1_t, gemv_p2_s, gemv_trans2_s, dgemv_,\n\t\t BLAS_D, row_major)\n  gemv_interface(gem_p1_t, gem_trans1_t, gemv_p2_s, gemv_trans2_s, cgemv_,\n\t\t BLAS_C, row_major)\n  gemv_interface(gem_p1_t, gem_trans1_t, gemv_p2_s, gemv_trans2_s, zgemv_,\n\t\t BLAS_Z, row_major)\n  \n  // Z <- transposed(const A) scaled(X) + Z.\n  gemv_interface(gem_p1_tc, gem_trans1_t, gemv_p2_s, gemv_trans2_s, sgemv_,\n\t\t BLAS_S, row_major)\n  gemv_interface(gem_p1_tc, gem_trans1_t, gemv_p2_s, gemv_trans2_s, dgemv_,\n\t\t BLAS_D, row_major)\n  gemv_interface(gem_p1_tc, gem_trans1_t, gemv_p2_s, gemv_trans2_s, cgemv_,\n\t\t BLAS_C, row_major)\n  gemv_interface(gem_p1_tc, gem_trans1_t, gemv_p2_s, gemv_trans2_s, zgemv_,\n\t\t BLAS_Z, row_major)\n  \n  // Z <- conjugated(A) scaled(X) + Z.\n  gemv_interface(gem_p1_c, gem_trans1_c, gemv_p2_s, gemv_trans2_s, sgemv_,\n\t\t BLAS_S, row_major)\n  gemv_interface(gem_p1_c, gem_trans1_c, gemv_p2_s, gemv_trans2_s, dgemv_,\n\t\t BLAS_D, row_major)\n  gemv_interface(gem_p1_c, gem_trans1_c, gemv_p2_s, gemv_trans2_s, cgemv_,\n\t\t BLAS_C, row_major)\n  gemv_interface(gem_p1_c, gem_trans1_c, gemv_p2_s, gemv_trans2_s, zgemv_,\n\t\t BLAS_Z, row_major)\n\n\n  /* ********************************************************************* */\n  /* mult(A, x, y).                                                        */\n  /* ********************************************************************* */\n  \n# define gemv_interface2(param1, trans1, param2, trans2, blas_name,        \\\n                         base_type, orien)                                 \\\n  inline void mult_spec(param1(base_type), param2(base_type),              \\\n              std::vector<base_type > &z, orien) {                         \\\n    GMMLAPACK_TRACE(\"gemv_interface2\");                                    \\\n    trans1(base_type); trans2(base_type); base_type beta(0);               \\\n    int m(int(mat_nrows(A))), lda(m), n(int(mat_ncols(A))), inc(1);\t   \\\n    if (m && n)                                                            \\\n      blas_name(&t, &m, &n, &alpha, &A(0,0), &lda, &x[0], &inc, &beta,     \\\n                &z[0], &inc);                                              \\\n    else gmm::clear(z);                                                    \\\n  }\n\n  // Y <- AX.\n  gemv_interface2(gem_p1_n, gem_trans1_n, gemv_p2_n, gemv_trans2_n, sgemv_,\n\t\t  BLAS_S, col_major)\n  gemv_interface2(gem_p1_n, gem_trans1_n, gemv_p2_n, gemv_trans2_n, dgemv_,\n\t\t  BLAS_D, col_major)\n  gemv_interface2(gem_p1_n, gem_trans1_n, gemv_p2_n, gemv_trans2_n, cgemv_,\n\t\t  BLAS_C, col_major)\n  gemv_interface2(gem_p1_n, gem_trans1_n, gemv_p2_n, gemv_trans2_n, zgemv_,\n\t\t  BLAS_Z, col_major)\n\n  // Y <- transposed(A)X.\n  gemv_interface2(gem_p1_t, gem_trans1_t, gemv_p2_n, gemv_trans2_n, sgemv_,\n\t\t  BLAS_S, row_major)\n  gemv_interface2(gem_p1_t, gem_trans1_t, gemv_p2_n, gemv_trans2_n, dgemv_,\n\t\t  BLAS_D, row_major)\n  gemv_interface2(gem_p1_t, gem_trans1_t, gemv_p2_n, gemv_trans2_n, cgemv_,\n\t\t  BLAS_C, row_major)\n  gemv_interface2(gem_p1_t, gem_trans1_t, gemv_p2_n, gemv_trans2_n, zgemv_,\n\t\t  BLAS_Z, row_major)\n  \n  // Y <- transposed(const A)X.\n  gemv_interface2(gem_p1_tc, gem_trans1_t, gemv_p2_n, gemv_trans2_n, sgemv_,\n\t\t  BLAS_S, row_major)\n  gemv_interface2(gem_p1_tc, gem_trans1_t, gemv_p2_n, gemv_trans2_n, dgemv_,\n\t\t  BLAS_D, row_major)\n  gemv_interface2(gem_p1_tc, gem_trans1_t, gemv_p2_n, gemv_trans2_n, cgemv_,\n\t\t  BLAS_C, row_major)\n  gemv_interface2(gem_p1_tc, gem_trans1_t, gemv_p2_n, gemv_trans2_n, zgemv_,\n\t\t  BLAS_Z, row_major)\n  \n  // Y <- conjugated(A)X.\n  gemv_interface2(gem_p1_c, gem_trans1_c, gemv_p2_n, gemv_trans2_n, sgemv_,\n\t\t  BLAS_S, row_major)\n  gemv_interface2(gem_p1_c, gem_trans1_c, gemv_p2_n, gemv_trans2_n, dgemv_,\n\t\t  BLAS_D, row_major)\n  gemv_interface2(gem_p1_c, gem_trans1_c, gemv_p2_n, gemv_trans2_n, cgemv_,\n\t\t  BLAS_C, row_major)\n  gemv_interface2(gem_p1_c, gem_trans1_c, gemv_p2_n, gemv_trans2_n, zgemv_,\n\t\t  BLAS_Z, row_major)\n\n  // Y <- A scaled(X).\n  gemv_interface2(gem_p1_n, gem_trans1_n, gemv_p2_s, gemv_trans2_s, sgemv_,\n\t\t  BLAS_S, col_major)\n  gemv_interface2(gem_p1_n, gem_trans1_n, gemv_p2_s, gemv_trans2_s, dgemv_,\n\t\t  BLAS_D, col_major)\n  gemv_interface2(gem_p1_n, gem_trans1_n, gemv_p2_s, gemv_trans2_s, cgemv_,\n\t\t  BLAS_C, col_major)\n  gemv_interface2(gem_p1_n, gem_trans1_n, gemv_p2_s, gemv_trans2_s, zgemv_,\n\t\t  BLAS_Z, col_major)\n\n  // Y <- transposed(A) scaled(X).\n  gemv_interface2(gem_p1_t, gem_trans1_t, gemv_p2_s, gemv_trans2_s, sgemv_,\n\t\t  BLAS_S, row_major)\n  gemv_interface2(gem_p1_t, gem_trans1_t, gemv_p2_s, gemv_trans2_s, dgemv_,\n\t\t  BLAS_D, row_major)\n  gemv_interface2(gem_p1_t, gem_trans1_t, gemv_p2_s, gemv_trans2_s, cgemv_,\n\t\t  BLAS_C, row_major)\n  gemv_interface2(gem_p1_t, gem_trans1_t, gemv_p2_s, gemv_trans2_s, zgemv_,\n\t\t  BLAS_Z, row_major)\n  \n  // Y <- transposed(const A) scaled(X).\n  gemv_interface2(gem_p1_tc, gem_trans1_t, gemv_p2_s, gemv_trans2_s, sgemv_,\n\t\t  BLAS_S, row_major)\n  gemv_interface2(gem_p1_tc, gem_trans1_t, gemv_p2_s, gemv_trans2_s, dgemv_,\n\t\t  BLAS_D, row_major)\n  gemv_interface2(gem_p1_tc, gem_trans1_t, gemv_p2_s, gemv_trans2_s, cgemv_,\n\t\t  BLAS_C, row_major)\n  gemv_interface2(gem_p1_tc, gem_trans1_t, gemv_p2_s, gemv_trans2_s, zgemv_,\n\t\t  BLAS_Z, row_major)\n  \n  // Y <- conjugated(A) scaled(X).\n  gemv_interface2(gem_p1_c, gem_trans1_c, gemv_p2_s, gemv_trans2_s, sgemv_,\n\t\t  BLAS_S, row_major)\n  gemv_interface2(gem_p1_c, gem_trans1_c, gemv_p2_s, gemv_trans2_s, dgemv_,\n\t\t  BLAS_D, row_major)\n  gemv_interface2(gem_p1_c, gem_trans1_c, gemv_p2_s, gemv_trans2_s, cgemv_,\n\t\t  BLAS_C, row_major)\n  gemv_interface2(gem_p1_c, gem_trans1_c, gemv_p2_s, gemv_trans2_s, zgemv_,\n\t\t  BLAS_Z, row_major)\n\n\n  /* ********************************************************************* */\n  /* Rank one update.                                                      */\n  /* ********************************************************************* */\n\n# define ger_interface(blas_name, base_type)                               \\\n  inline void rank_one_update(const dense_matrix<base_type > &A,           \\\n\t\t\t      const std::vector<base_type > &V,\t   \t   \\\n\t\t\t      const std::vector<base_type > &W) {\t   \\\n    GMMLAPACK_TRACE(\"ger_interface\");                                      \\\n    int m(int(mat_nrows(A))), lda = m, n(int(mat_ncols(A)));\t\t   \\\n    int incx = 1, incy = 1;\t\t\t\t\t\t   \\\n    base_type alpha(1);                                                    \\\n    if (m && n)\t\t\t\t\t\t\t\t   \\\n      blas_name(&m, &n, &alpha, &V[0], &incx, &W[0], &incy, &A(0,0), &lda);\\\n  }\n\n  ger_interface(sger_, BLAS_S)\n  ger_interface(dger_, BLAS_D)\n  ger_interface(cgerc_, BLAS_C)\n  ger_interface(zgerc_, BLAS_Z)\n\n# define ger_interface_sn(blas_name, base_type)                            \\\n  inline void rank_one_update(const dense_matrix<base_type > &A,\t   \\\n\t\t\t      gemv_p2_s(base_type),\t\t\t   \\\n\t\t\t      const std::vector<base_type > &W) {\t   \\\n    GMMLAPACK_TRACE(\"ger_interface\");                                      \\\n    gemv_trans2_s(base_type); \t\t\t\t\t\t   \\\n    int m(int(mat_nrows(A))), lda = m, n(int(mat_ncols(A)));\t\t   \\\n    int incx = 1, incy = 1;\t\t\t\t\t\t   \\\n    if (m && n)\t\t\t\t\t\t\t\t   \\\n      blas_name(&m, &n, &alpha, &x[0], &incx, &W[0], &incy, &A(0,0), &lda);\\\n  }\n\n  ger_interface_sn(sger_, BLAS_S)\n  ger_interface_sn(dger_, BLAS_D)\n  ger_interface_sn(cgerc_, BLAS_C)\n  ger_interface_sn(zgerc_, BLAS_Z)\n\n# define ger_interface_ns(blas_name, base_type)                            \\\n  inline void rank_one_update(const dense_matrix<base_type > &A,\t   \\\n\t\t\t      const std::vector<base_type > &V,\t\t   \\\n\t\t\t      gemv_p2_s(base_type)) {\t\t\t   \\\n    GMMLAPACK_TRACE(\"ger_interface\");                                      \\\n    gemv_trans2_s(base_type); \t\t\t\t\t\t   \\\n    int m(int(mat_nrows(A))), lda = m, n(int(mat_ncols(A)));\t\t   \\\n    int incx = 1, incy = 1;\t\t\t\t\t\t   \\\n    base_type al2 = gmm::conj(alpha);\t\t\t\t\t   \\\n    if (m && n)\t\t\t\t\t\t\t\t   \\\n      blas_name(&m, &n, &al2, &V[0], &incx, &x[0], &incy, &A(0,0), &lda);  \\\n  }\n\n  ger_interface_ns(sger_, BLAS_S)\n  ger_interface_ns(dger_, BLAS_D)\n  ger_interface_ns(cgerc_, BLAS_C)\n  ger_interface_ns(zgerc_, BLAS_Z)\n\n  /* ********************************************************************* */\n  /* dense matrix x dense matrix multiplication.                           */\n  /* ********************************************************************* */\n\n# define gemm_interface_nn(blas_name, base_type)                           \\\n  inline void mult_spec(const dense_matrix<base_type > &A,                 \\\n            const dense_matrix<base_type > &B,                             \\\n            dense_matrix<base_type > &C, c_mult) {                         \\\n    GMMLAPACK_TRACE(\"gemm_interface_nn\");                                  \\\n    const char t = 'N';                                                    \\\n    int m(int(mat_nrows(A))), lda = m, k(int(mat_ncols(A)));  \t\t   \\\n    int n(int(mat_ncols(B)));\t\t\t\t\t\t   \\\n    int ldb = k, ldc = m;                                                  \\\n    base_type alpha(1), beta(0);                                           \\\n    if (m && k && n)                                                       \\\n      blas_name(&t, &t, &m, &n, &k, &alpha,                                \\\n\t          &A(0,0), &lda, &B(0,0), &ldb, &beta, &C(0,0), &ldc);     \\\n    else gmm::clear(C);                                                    \\\n  }\n\n  gemm_interface_nn(sgemm_, BLAS_S)\n  gemm_interface_nn(dgemm_, BLAS_D)\n  gemm_interface_nn(cgemm_, BLAS_C)\n  gemm_interface_nn(zgemm_, BLAS_Z)\n  \n  /* ********************************************************************* */\n  /* transposed(dense matrix) x dense matrix multiplication.               */\n  /* ********************************************************************* */\n\n# define gemm_interface_tn(blas_name, base_type, is_const)                 \\\n  inline void mult_spec(                                                   \\\n         const transposed_col_ref<is_const<base_type > *> &A_,\\\n         const dense_matrix<base_type > &B,                                \\\n         dense_matrix<base_type > &C, rcmult) {                            \\\n    GMMLAPACK_TRACE(\"gemm_interface_tn\");                                  \\\n    dense_matrix<base_type > &A                                            \\\n         = const_cast<dense_matrix<base_type > &>(*(linalg_origin(A_)));   \\\n    const char t = 'T', u = 'N';                                           \\\n    int m(int(mat_ncols(A))), k(int(mat_nrows(A))), n(int(mat_ncols(B)));  \\\n    int lda = k, ldb = k, ldc = m;\t\t\t\t\t   \\\n    base_type alpha(1), beta(0);                                           \\\n    if (m && k && n)                                                       \\\n      blas_name(&t, &u, &m, &n, &k, &alpha,                                \\\n\t          &A(0,0), &lda, &B(0,0), &ldb, &beta, &C(0,0), &ldc);     \\\n    else gmm::clear(C);                                                    \\\n  }\n\n  gemm_interface_tn(sgemm_, BLAS_S, dense_matrix)\n  gemm_interface_tn(dgemm_, BLAS_D, dense_matrix)\n  gemm_interface_tn(cgemm_, BLAS_C, dense_matrix)\n  gemm_interface_tn(zgemm_, BLAS_Z, dense_matrix)\n  gemm_interface_tn(sgemm_, BLAS_S, const dense_matrix)\n  gemm_interface_tn(dgemm_, BLAS_D, const dense_matrix)\n  gemm_interface_tn(cgemm_, BLAS_C, const dense_matrix)\n  gemm_interface_tn(zgemm_, BLAS_Z, const dense_matrix)\n\n  /* ********************************************************************* */\n  /* dense matrix x transposed(dense matrix) multiplication.               */\n  /* ********************************************************************* */\n\n# define gemm_interface_nt(blas_name, base_type, is_const)                 \\\n  inline void mult_spec(const dense_matrix<base_type > &A,                 \\\n         const transposed_col_ref<is_const<base_type > *> &B_,\\\n         dense_matrix<base_type > &C, r_mult) {                            \\\n    GMMLAPACK_TRACE(\"gemm_interface_nt\");                                  \\\n    dense_matrix<base_type > &B                                            \\\n        = const_cast<dense_matrix<base_type > &>(*(linalg_origin(B_)));    \\\n    const char t = 'N', u = 'T';                                           \\\n    int m(int(mat_nrows(A))), lda = m, k(int(mat_ncols(A)));               \\\n    int n(int(mat_nrows(B)));\t\t\t\t\t\t   \\\n    int ldb = n, ldc = m;                                                  \\\n    base_type alpha(1), beta(0);                                           \\\n    if (m && k && n)                                                       \\\n      blas_name(&t, &u, &m, &n, &k, &alpha,                                \\\n\t        &A(0,0), &lda, &B(0,0), &ldb, &beta, &C(0,0), &ldc);       \\\n    else gmm::clear(C);                                                    \\\n  }\n\n  gemm_interface_nt(sgemm_, BLAS_S, dense_matrix)\n  gemm_interface_nt(dgemm_, BLAS_D, dense_matrix)\n  gemm_interface_nt(cgemm_, BLAS_C, dense_matrix)\n  gemm_interface_nt(zgemm_, BLAS_Z, dense_matrix)\n  gemm_interface_nt(sgemm_, BLAS_S, const dense_matrix)\n  gemm_interface_nt(dgemm_, BLAS_D, const dense_matrix)\n  gemm_interface_nt(cgemm_, BLAS_C, const dense_matrix)\n  gemm_interface_nt(zgemm_, BLAS_Z, const dense_matrix)\n\n  /* ********************************************************************* */\n  /* transposed(dense matrix) x transposed(dense matrix) multiplication.   */\n  /* ********************************************************************* */\n\n# define gemm_interface_tt(blas_name, base_type, isA_const, isB_const)     \\\n  inline void mult_spec(                                                   \\\n        const transposed_col_ref<isA_const <base_type > *> &A_,\\\n        const transposed_col_ref<isB_const <base_type > *> &B_,\\\n        dense_matrix<base_type > &C, r_mult) {                             \\\n    GMMLAPACK_TRACE(\"gemm_interface_tt\");                                  \\\n    dense_matrix<base_type > &A                                            \\\n        = const_cast<dense_matrix<base_type > &>(*(linalg_origin(A_)));    \\\n    dense_matrix<base_type > &B                                            \\\n        = const_cast<dense_matrix<base_type > &>(*(linalg_origin(B_)));    \\\n    const char t = 'T', u = 'T';                                           \\\n    int m(int(mat_ncols(A))), k(int(mat_nrows(A))), n(int(mat_nrows(B)));  \\\n    int lda = k, ldb = n, ldc = m;\t\t\t\t\t   \\\n    base_type alpha(1), beta(0);                                           \\\n    if (m && k && n)                                                       \\\n      blas_name(&t, &u, &m, &n, &k, &alpha,                                \\\n\t        &A(0,0), &lda, &B(0,0), &ldb, &beta, &C(0,0), &ldc);       \\\n    else gmm::clear(C);                                                    \\\n  }\n\n  gemm_interface_tt(sgemm_, BLAS_S, dense_matrix, dense_matrix)\n  gemm_interface_tt(dgemm_, BLAS_D, dense_matrix, dense_matrix)\n  gemm_interface_tt(cgemm_, BLAS_C, dense_matrix, dense_matrix)\n  gemm_interface_tt(zgemm_, BLAS_Z, dense_matrix, dense_matrix)\n  gemm_interface_tt(sgemm_, BLAS_S, const dense_matrix, dense_matrix)\n  gemm_interface_tt(dgemm_, BLAS_D, const dense_matrix, dense_matrix)\n  gemm_interface_tt(cgemm_, BLAS_C, const dense_matrix, dense_matrix)\n  gemm_interface_tt(zgemm_, BLAS_Z, const dense_matrix, dense_matrix)\n  gemm_interface_tt(sgemm_, BLAS_S, dense_matrix, const dense_matrix)\n  gemm_interface_tt(dgemm_, BLAS_D, dense_matrix, const dense_matrix)\n  gemm_interface_tt(cgemm_, BLAS_C, dense_matrix, const dense_matrix)\n  gemm_interface_tt(zgemm_, BLAS_Z, dense_matrix, const dense_matrix)\n  gemm_interface_tt(sgemm_, BLAS_S, const dense_matrix, const dense_matrix)\n  gemm_interface_tt(dgemm_, BLAS_D, const dense_matrix, const dense_matrix)\n  gemm_interface_tt(cgemm_, BLAS_C, const dense_matrix, const dense_matrix)\n  gemm_interface_tt(zgemm_, BLAS_Z, const dense_matrix, const dense_matrix)\n\n\n  /* ********************************************************************* */\n  /* conjugated(dense matrix) x dense matrix multiplication.               */\n  /* ********************************************************************* */\n\n# define gemm_interface_cn(blas_name, base_type)                           \\\n  inline void mult_spec(                                                   \\\n      const conjugated_col_matrix_const_ref<dense_matrix<base_type > > &A_,\\\n      const dense_matrix<base_type > &B,                                   \\\n      dense_matrix<base_type > &C, rcmult) {                               \\\n    GMMLAPACK_TRACE(\"gemm_interface_cn\");                                  \\\n    dense_matrix<base_type > &A                                            \\\n          = const_cast<dense_matrix<base_type > &>(*(linalg_origin(A_)));  \\\n    const char t = 'C', u = 'N';                                           \\\n    int m(int(mat_ncols(A))), k(int(mat_nrows(A))), n(int(mat_ncols(B)));  \\\n    int lda = k, ldb = k, ldc = m;\t\t\t\t\t   \\\n    base_type alpha(1), beta(0);                                           \\\n    if (m && k && n)                                                       \\\n      blas_name(&t, &u, &m, &n, &k, &alpha,                                \\\n\t        &A(0,0), &lda, &B(0,0), &ldb, &beta, &C(0,0), &ldc);       \\\n    else gmm::clear(C);                                                    \\\n  }\n\n  gemm_interface_cn(sgemm_, BLAS_S)\n  gemm_interface_cn(dgemm_, BLAS_D)\n  gemm_interface_cn(cgemm_, BLAS_C)\n  gemm_interface_cn(zgemm_, BLAS_Z)\n\n  /* ********************************************************************* */\n  /* dense matrix x conjugated(dense matrix) multiplication.               */\n  /* ********************************************************************* */\n\n# define gemm_interface_nc(blas_name, base_type)                           \\\n  inline void mult_spec(const dense_matrix<base_type > &A,                 \\\n      const conjugated_col_matrix_const_ref<dense_matrix<base_type > > &B_,\\\n      dense_matrix<base_type > &C, c_mult, row_major) {                    \\\n    GMMLAPACK_TRACE(\"gemm_interface_nc\");                                  \\\n    dense_matrix<base_type > &B                                            \\\n         = const_cast<dense_matrix<base_type > &>(*(linalg_origin(B_)));   \\\n    const char t = 'N', u = 'C';                                           \\\n    int m(int(mat_nrows(A))), lda = m, k(int(mat_ncols(A)));               \\\n    int n(int(mat_nrows(B))), ldb = n, ldc = m;\t\t\t\t   \\\n    base_type alpha(1), beta(0);                                           \\\n    if (m && k && n)                                                       \\\n      blas_name(&t, &u, &m, &n, &k, &alpha,                                \\\n\t        &A(0,0), &lda, &B(0,0), &ldb, &beta, &C(0,0), &ldc);       \\\n    else gmm::clear(C);                                                    \\\n  }\n\n  gemm_interface_nc(sgemm_, BLAS_S)\n  gemm_interface_nc(dgemm_, BLAS_D)\n  gemm_interface_nc(cgemm_, BLAS_C)\n  gemm_interface_nc(zgemm_, BLAS_Z)\n\n  /* ********************************************************************* */\n  /* conjugated(dense matrix) x conjugated(dense matrix) multiplication.   */\n  /* ********************************************************************* */\n\n# define gemm_interface_cc(blas_name, base_type)                           \\\n  inline void mult_spec(                                                   \\\n      const conjugated_col_matrix_const_ref<dense_matrix<base_type > > &A_,\\\n      const conjugated_col_matrix_const_ref<dense_matrix<base_type > > &B_,\\\n      dense_matrix<base_type > &C, r_mult) {                               \\\n    GMMLAPACK_TRACE(\"gemm_interface_cc\");                                  \\\n    dense_matrix<base_type > &A                                            \\\n        = const_cast<dense_matrix<base_type > &>(*(linalg_origin(A_)));    \\\n    dense_matrix<base_type > &B                                            \\\n        = const_cast<dense_matrix<base_type > &>(*(linalg_origin(B_)));    \\\n    const char t = 'C', u = 'C';                                           \\\n    int m(int(mat_ncols(A))), k(int(mat_nrows(A))), lda = k;               \\\n    int n(int(mat_nrows(B))), ldb = n, ldc = m;\t\t\t\t   \\\n    base_type alpha(1), beta(0);                                           \\\n    if (m && k && n)                                                       \\\n      blas_name(&t, &u, &m, &n, &k, &alpha,                                \\\n\t        &A(0,0), &lda, &B(0,0), &ldb, &beta, &C(0,0), &ldc);       \\\n    else gmm::clear(C);                                                    \\\n  }\n\n  gemm_interface_cc(sgemm_, BLAS_S)\n  gemm_interface_cc(dgemm_, BLAS_D)\n  gemm_interface_cc(cgemm_, BLAS_C)\n  gemm_interface_cc(zgemm_, BLAS_Z)\n   \n  /* ********************************************************************* */\n  /* Tri solve.                                                            */\n  /* ********************************************************************* */\n\n# define trsv_interface(f_name, loru, param1, trans1, blas_name, base_type)\\\n  inline void f_name(param1(base_type), std::vector<base_type > &x,        \\\n                              size_type k, bool is_unit) {                 \\\n    GMMLAPACK_TRACE(\"trsv_interface\");                                     \\\n    loru; trans1(base_type); char d = is_unit ? 'U' : 'N';                 \\\n    int lda(int(mat_nrows(A))), inc(1), n = int(k);\t\t\t   \\\n    if (lda) blas_name(&l, &t, &d, &n, &A(0,0), &lda, &x[0], &inc);        \\\n  }\n\n# define trsv_upper const char l = 'U'\n# define trsv_lower const char l = 'L'\n\n  // X <- LOWER(A)^{-1}X.\n  trsv_interface(lower_tri_solve, trsv_lower, gem_p1_n, gem_trans1_n,\n\t\t strsv_, BLAS_S)\n  trsv_interface(lower_tri_solve, trsv_lower, gem_p1_n, gem_trans1_n,\n\t\t dtrsv_, BLAS_D) \n  trsv_interface(lower_tri_solve, trsv_lower, gem_p1_n, gem_trans1_n,\n\t\t ctrsv_, BLAS_C) \n  trsv_interface(lower_tri_solve, trsv_lower, gem_p1_n, gem_trans1_n,\n\t\t ztrsv_, BLAS_Z)\n  \n  // X <- UPPER(A)^{-1}X.\n  trsv_interface(upper_tri_solve, trsv_upper, gem_p1_n, gem_trans1_n,\n\t\t strsv_, BLAS_S)\n  trsv_interface(upper_tri_solve, trsv_upper, gem_p1_n, gem_trans1_n,\n\t\t dtrsv_, BLAS_D) \n  trsv_interface(upper_tri_solve, trsv_upper, gem_p1_n, gem_trans1_n,\n\t\t ctrsv_, BLAS_C) \n  trsv_interface(upper_tri_solve, trsv_upper, gem_p1_n, gem_trans1_n,\n\t\t ztrsv_, BLAS_Z)\n  \n  // X <- LOWER(transposed(A))^{-1}X.\n  trsv_interface(lower_tri_solve, trsv_upper, gem_p1_t, gem_trans1_t,\n\t\t strsv_, BLAS_S)\n  trsv_interface(lower_tri_solve, trsv_upper, gem_p1_t, gem_trans1_t,\n\t\t dtrsv_, BLAS_D) \n  trsv_interface(lower_tri_solve, trsv_upper, gem_p1_t, gem_trans1_t,\n\t\t ctrsv_, BLAS_C) \n  trsv_interface(lower_tri_solve, trsv_upper, gem_p1_t, gem_trans1_t,\n\t\t ztrsv_, BLAS_Z)\n  \n  // X <- UPPER(transposed(A))^{-1}X.\n  trsv_interface(upper_tri_solve, trsv_lower, gem_p1_t, gem_trans1_t,\n\t\t strsv_, BLAS_S)\n  trsv_interface(upper_tri_solve, trsv_lower, gem_p1_t, gem_trans1_t,\n\t\t dtrsv_, BLAS_D) \n  trsv_interface(upper_tri_solve, trsv_lower, gem_p1_t, gem_trans1_t,\n\t\t ctrsv_, BLAS_C) \n  trsv_interface(upper_tri_solve, trsv_lower, gem_p1_t, gem_trans1_t,\n\t\t ztrsv_, BLAS_Z)\n\n  // X <- LOWER(transposed(const A))^{-1}X.\n  trsv_interface(lower_tri_solve, trsv_upper, gem_p1_tc, gem_trans1_t,\n\t\t strsv_, BLAS_S)\n  trsv_interface(lower_tri_solve, trsv_upper, gem_p1_tc, gem_trans1_t,\n\t\t dtrsv_, BLAS_D) \n  trsv_interface(lower_tri_solve, trsv_upper, gem_p1_tc, gem_trans1_t,\n\t\t ctrsv_, BLAS_C) \n  trsv_interface(lower_tri_solve, trsv_upper, gem_p1_tc, gem_trans1_t,\n\t\t ztrsv_, BLAS_Z)\n  \n  // X <- UPPER(transposed(const A))^{-1}X.\n  trsv_interface(upper_tri_solve, trsv_lower, gem_p1_tc, gem_trans1_t,\n\t\t strsv_, BLAS_S)\n  trsv_interface(upper_tri_solve, trsv_lower, gem_p1_tc, gem_trans1_t,\n\t\t dtrsv_, BLAS_D) \n  trsv_interface(upper_tri_solve, trsv_lower, gem_p1_tc, gem_trans1_t,\n\t\t ctrsv_, BLAS_C) \n  trsv_interface(upper_tri_solve, trsv_lower, gem_p1_tc, gem_trans1_t,\n\t\t ztrsv_, BLAS_Z)\n\n  // X <- LOWER(conjugated(A))^{-1}X.\n  trsv_interface(lower_tri_solve, trsv_upper, gem_p1_c, gem_trans1_c,\n\t\t strsv_, BLAS_S)\n  trsv_interface(lower_tri_solve, trsv_upper, gem_p1_c, gem_trans1_c,\n\t\t dtrsv_, BLAS_D) \n  trsv_interface(lower_tri_solve, trsv_upper, gem_p1_c, gem_trans1_c,\n\t\t ctrsv_, BLAS_C) \n  trsv_interface(lower_tri_solve, trsv_upper, gem_p1_c, gem_trans1_c,\n\t\t ztrsv_, BLAS_Z)\n  \n  // X <- UPPER(conjugated(A))^{-1}X.\n  trsv_interface(upper_tri_solve, trsv_lower, gem_p1_c, gem_trans1_c,\n\t\t strsv_, BLAS_S)\n  trsv_interface(upper_tri_solve, trsv_lower, gem_p1_c, gem_trans1_c,\n\t\t dtrsv_, BLAS_D) \n  trsv_interface(upper_tri_solve, trsv_lower, gem_p1_c, gem_trans1_c,\n\t\t ctrsv_, BLAS_C) \n  trsv_interface(upper_tri_solve, trsv_lower, gem_p1_c, gem_trans1_c,\n\t\t ztrsv_, BLAS_Z)\n  \n}\n\n#endif // GMM_BLAS_INTERFACE_H\n\n#endif // GMM_USES_BLAS\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_condition_number.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2003-2012 Yves Renard, Julien Pommier\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n/**@file gmm_condition_number.h\n   @author  Yves Renard <Yves.Renard@insa-lyon.fr>, Julien Pommier <Julien.Pommier@insa-toulouse.fr>\n   @date August 27, 2003.\n   @brief computation of the condition number of dense matrices.\n*/\n#ifndef GMM_CONDITION_NUMBER_H__\n#define GMM_CONDITION_NUMBER_H__\n\n#include \"gmm_dense_qr.h\"\n\nnamespace gmm {\n\n  /** computation of the condition number of dense matrices using SVD.\n\n      Uses symmetric_qr_algorithm => dense matrices only.\n\n      @param M a matrix.\n      @param emin smallest (in magnitude) eigenvalue\n      @param emax largest eigenvalue.\n   */\n  template <typename MAT> \n  typename number_traits<typename \n  linalg_traits<MAT>::value_type>::magnitude_type\n  condition_number(const MAT& M, \n\t  typename number_traits<typename\n\t  linalg_traits<MAT>::value_type>::magnitude_type& emin,\n\t  typename number_traits<typename\n\t  linalg_traits<MAT>::value_type>::magnitude_type& emax) {\n    typedef typename linalg_traits<MAT>::value_type T;\n    typedef typename number_traits<T>::magnitude_type R;\n\n    size_type m = mat_nrows(M), n = mat_ncols(M);\n    emax = emin = R(0);\n    std::vector<R> eig(m+n);\n\n    if (m+n == 0) return R(0);\n    if (is_hermitian(M)) {\n      eig.resize(m);\n      gmm::symmetric_qr_algorithm(M, eig);\n    }\n    else {\n      dense_matrix<T> B(m+n, m+n); // not very efficient ??\n      gmm::copy(conjugated(M), sub_matrix(B, sub_interval(m, n), sub_interval(0, m)));\n      gmm::copy(M, sub_matrix(B, sub_interval(0, m),\n\t\t\t\t\t  sub_interval(m, n)));\n      gmm::symmetric_qr_algorithm(B, eig);\n    }\n    emin = emax = gmm::abs(eig[0]);\n    for (size_type i = 1; i < eig.size(); ++i) {\n      R e = gmm::abs(eig[i]); \n      emin = std::min(emin, e);\n      emax = std::max(emax, e);\n    }\n    // cout << \"emin = \" << emin << \" emax = \" << emax << endl;\n    if (emin == R(0)) return gmm::default_max(R());\n    return emax / emin;\n  }\n\n  template <typename MAT> \n  typename number_traits<typename \n  linalg_traits<MAT>::value_type>::magnitude_type\n  condition_number(const MAT& M) { \n    typename number_traits<typename\n      linalg_traits<MAT>::value_type>::magnitude_type emax, emin;\n    return condition_number(M, emin, emax);\n  }\n\n  template <typename MAT> \n  typename number_traits<typename \n  linalg_traits<MAT>::value_type>::magnitude_type\n  Frobenius_condition_number_sqr(const MAT& M) { \n    typedef typename linalg_traits<MAT>::value_type T;\n    typedef typename number_traits<T>::magnitude_type R;\n    size_type m = mat_nrows(M), n = mat_ncols(M);\n    dense_matrix<T> B(std::min(m,n), std::min(m,n));\n    if (m < n) mult(M,gmm::conjugated(M),B);\n    else       mult(gmm::conjugated(M),M,B);\n    R trB = abs(mat_trace(B));\n    lu_inverse(B);\n    return trB*abs(mat_trace(B));\n  }\n\n  template <typename MAT> \n  typename number_traits<typename \n  linalg_traits<MAT>::value_type>::magnitude_type\n  Frobenius_condition_number(const MAT& M)\n  { return sqrt(Frobenius_condition_number_sqr(M)); }\n\n  /** estimation of the condition number (TO BE DONE...)\n   */\n  template <typename MAT> \n  typename number_traits<typename \n  linalg_traits<MAT>::value_type>::magnitude_type\n  condest(const MAT& M, \n\t  typename number_traits<typename\n\t  linalg_traits<MAT>::value_type>::magnitude_type& emin,\n\t  typename number_traits<typename\n\t  linalg_traits<MAT>::value_type>::magnitude_type& emax) {\n    return condition_number(M, emin, emax);\n  }\n  \n  template <typename MAT> \n  typename number_traits<typename \n  linalg_traits<MAT>::value_type>::magnitude_type\n  condest(const MAT& M) { \n    typename number_traits<typename\n      linalg_traits<MAT>::value_type>::magnitude_type emax, emin;\n    return condest(M, emin, emax);\n  }\n}\n\n#endif\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_conjugated.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2003-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n/**@file gmm_conjugated.h\n   @author  Yves Renard <Yves.Renard@insa-lyon.fr>\n   @date September 18, 2003.\n   @brief handle conjugation of complex matrices/vectors.\n*/\n#ifndef GMM_CONJUGATED_H__\n#define GMM_CONJUGATED_H__\n\n#include \"gmm_def.h\"\n\nnamespace gmm {\n  ///@cond DOXY_SHOW_ALL_FUNCTIONS\n\n  /* ********************************************************************* */\n  /*\t\tConjugated references on vectors            \t\t   */\n  /* ********************************************************************* */\n\n  template <typename IT> struct conjugated_const_iterator {\n    typedef typename std::iterator_traits<IT>::value_type      value_type;\n    typedef typename std::iterator_traits<IT>::pointer         pointer;\n    typedef typename std::iterator_traits<IT>::reference       reference;\n    typedef typename std::iterator_traits<IT>::difference_type difference_type;\n    typedef typename std::iterator_traits<IT>::iterator_category\n    iterator_category;\n\n    IT it;\n    \n    conjugated_const_iterator(void) {}\n    conjugated_const_iterator(const IT &i) : it(i) {}\n    \n    inline size_type index(void) const { return it.index(); }\n    conjugated_const_iterator operator ++(int)\n    { conjugated_const_iterator tmp = *this; ++it; return tmp; }\n    conjugated_const_iterator operator --(int) \n    { conjugated_const_iterator tmp = *this; --it; return tmp; }\n    conjugated_const_iterator &operator ++() { ++it; return *this; }\n    conjugated_const_iterator &operator --() { --it; return *this; }\n    conjugated_const_iterator &operator +=(difference_type i)\n      { it += i; return *this; }\n    conjugated_const_iterator &operator -=(difference_type i)\n      { it -= i; return *this; }\n    conjugated_const_iterator operator +(difference_type i) const\n      { conjugated_const_iterator itb = *this; return (itb += i); }\n    conjugated_const_iterator operator -(difference_type i) const\n      { conjugated_const_iterator itb = *this; return (itb -= i); }\n    difference_type operator -(const conjugated_const_iterator &i) const\n      { return difference_type(it - i.it); }\n    \n    value_type operator  *() const { return gmm::conj(*it); }\n    value_type operator [](size_type ii) const { return gmm::conj(it[ii]); }\n    \n    bool operator ==(const conjugated_const_iterator &i) const\n      { return (i.it == it); }\n    bool operator !=(const conjugated_const_iterator &i) const\n      { return (i.it != it); }\n    bool operator < (const conjugated_const_iterator &i) const\n      { return (it < i.it); }\n  };\n\n  template <typename V> struct conjugated_vector_const_ref {\n    typedef conjugated_vector_const_ref<V> this_type;\n    typedef typename linalg_traits<V>::value_type value_type;\n    typedef typename linalg_traits<V>::const_iterator iterator;\n    typedef typename linalg_traits<this_type>::reference reference;\n    typedef typename linalg_traits<this_type>::origin_type origin_type;\n\n    iterator begin_, end_;\n    const origin_type *origin;\n    size_type size_;\n\n    conjugated_vector_const_ref(const V &v)\n      : begin_(vect_const_begin(v)), end_(vect_const_end(v)),\n\torigin(linalg_origin(v)),\n\tsize_(vect_size(v)) {}\n\n    reference operator[](size_type i) const\n    { return gmm::conj(linalg_traits<V>::access(origin, begin_, end_, i)); }\n  };\n\n  template <typename V> struct linalg_traits<conjugated_vector_const_ref<V> > {\n    typedef conjugated_vector_const_ref<V> this_type;\n    typedef typename linalg_traits<V>::origin_type origin_type;\n    typedef linalg_const is_reference;\n    typedef abstract_vector linalg_type;\n    typedef typename linalg_traits<V>::value_type value_type;\n    typedef value_type reference;\n    typedef abstract_null_type iterator;\n    typedef conjugated_const_iterator<typename\n                   linalg_traits<V>::const_iterator> const_iterator;\n    typedef typename linalg_traits<V>::storage_type storage_type;\n    typedef typename linalg_traits<V>::index_sorted index_sorted;\n    static size_type size(const this_type &v) { return v.size_; }\n    static iterator begin(this_type &v) { return iterator(v.begin_); }\n    static const_iterator begin(const this_type &v)\n    { return const_iterator(v.begin_); }\n    static iterator end(this_type &v)\n    { return iterator(v.end_); }\n    static const_iterator end(const this_type &v)\n    { return const_iterator(v.end_); }\n    static value_type access(const origin_type *o, const const_iterator &it,\n\t\t\t     const const_iterator &ite, size_type i)\n    { return gmm::conj(linalg_traits<V>::access(o, it.it, ite.it, i)); }\n    static const origin_type* origin(const this_type &v) { return v.origin; }\n  };\n\n  template<typename V> std::ostream &operator <<\n    (std::ostream &o, const conjugated_vector_const_ref<V>& m)\n  { gmm::write(o,m); return o; }\n\n  /* ********************************************************************* */\n  /*\t\tConjugated references on matrices            \t\t   */\n  /* ********************************************************************* */\n\n  template <typename M> struct conjugated_row_const_iterator {\n    typedef conjugated_row_const_iterator<M> iterator;\n    typedef typename linalg_traits<M>::const_row_iterator ITER;\n    typedef typename linalg_traits<M>::value_type value_type;\n    typedef ptrdiff_t difference_type;\n    typedef size_t size_type;\n\n    ITER it;\n\n    iterator operator ++(int) { iterator tmp = *this; it++; return tmp; }\n    iterator operator --(int) { iterator tmp = *this; it--; return tmp; }\n    iterator &operator ++()   { it++; return *this; }\n    iterator &operator --()   { it--; return *this; }\n    iterator &operator +=(difference_type i) { it += i; return *this; }\n    iterator &operator -=(difference_type i) { it -= i; return *this; }\n    iterator operator +(difference_type i) const \n    { iterator itt = *this; return (itt += i); }\n    iterator operator -(difference_type i) const\n    { iterator itt = *this; return (itt -= i); }\n    difference_type operator -(const iterator &i) const\n    { return it - i.it; }\n\n    ITER operator *() const { return it; }\n    ITER operator [](int i) { return it + i; }\n\n    bool operator ==(const iterator &i) const { return (it == i.it); }\n    bool operator !=(const iterator &i) const { return !(i == *this); }\n    bool operator < (const iterator &i) const { return (it < i.it); }\n\n    conjugated_row_const_iterator(void) {}\n    conjugated_row_const_iterator(const ITER &i) : it(i) { }\n\n  };\n\n  template <typename M> struct  conjugated_row_matrix_const_ref {\n    \n    typedef conjugated_row_matrix_const_ref<M> this_type;\n    typedef typename linalg_traits<M>::const_row_iterator iterator;\n    typedef typename linalg_traits<M>::value_type value_type;\n    typedef typename linalg_traits<this_type>::origin_type origin_type;\n\n    iterator begin_, end_;\n    const origin_type *origin;\n    size_type nr, nc;\n\n    conjugated_row_matrix_const_ref(const M &m)\n      : begin_(mat_row_begin(m)), end_(mat_row_end(m)),\n\torigin(linalg_origin(m)), nr(mat_ncols(m)), nc(mat_nrows(m)) {}\n\n    value_type operator()(size_type i, size_type j) const\n    { return gmm::conj(linalg_traits<M>::access(begin_+j, i)); }\n  };\n\n  template <typename M>\n  struct linalg_traits<conjugated_row_matrix_const_ref<M> > {\n    typedef conjugated_row_matrix_const_ref<M> this_type;\n    typedef typename linalg_traits<M>::origin_type origin_type;\n    typedef linalg_const is_reference;\n    typedef abstract_matrix linalg_type;\n    typedef typename linalg_traits<M>::value_type value_type;\n    typedef value_type reference;\n    typedef typename linalg_traits<M>::storage_type storage_type;\n    typedef typename linalg_traits<M>::const_sub_row_type vector_type;\n    typedef conjugated_vector_const_ref<vector_type> sub_col_type;\n    typedef conjugated_vector_const_ref<vector_type> const_sub_col_type;\n    typedef conjugated_row_const_iterator<M> col_iterator;\n    typedef conjugated_row_const_iterator<M> const_col_iterator;\n    typedef abstract_null_type const_sub_row_type;\n    typedef abstract_null_type sub_row_type;\n    typedef abstract_null_type const_row_iterator;\n    typedef abstract_null_type row_iterator;\n    typedef col_major sub_orientation;\n    typedef typename linalg_traits<M>::index_sorted index_sorted;\n    static inline size_type ncols(const this_type &m) { return m.nc; }\n    static inline size_type nrows(const this_type &m) { return m.nr; }\n    static inline const_sub_col_type col(const const_col_iterator &it)\n    { return conjugated(linalg_traits<M>::row(it.it)); }\n    static inline const_col_iterator col_begin(const this_type &m)\n    { return const_col_iterator(m.begin_); }\n    static inline const_col_iterator col_end(const this_type &m)\n    { return const_col_iterator(m.end_); }\n    static inline const origin_type* origin(const this_type &m)\n    { return m.origin; }\n    static value_type access(const const_col_iterator &it, size_type i)\n    { return gmm::conj(linalg_traits<M>::access(it.it, i)); }\n  };\n\n  template<typename M> std::ostream &operator <<\n  (std::ostream &o, const conjugated_row_matrix_const_ref<M>& m)\n  { gmm::write(o,m); return o; }\n\n\n  template <typename M> struct conjugated_col_const_iterator {\n    typedef conjugated_col_const_iterator<M> iterator;\n    typedef typename linalg_traits<M>::const_col_iterator ITER;\n    typedef typename linalg_traits<M>::value_type value_type;\n    typedef ptrdiff_t difference_type;\n    typedef size_t size_type;\n\n    ITER it;\n\n    iterator operator ++(int) { iterator tmp = *this; it++; return tmp; }\n    iterator operator --(int) { iterator tmp = *this; it--; return tmp; }\n    iterator &operator ++()   { it++; return *this; }\n    iterator &operator --()   { it--; return *this; }\n    iterator &operator +=(difference_type i) { it += i; return *this; }\n    iterator &operator -=(difference_type i) { it -= i; return *this; }\n    iterator operator +(difference_type i) const \n    { iterator itt = *this; return (itt += i); }\n    iterator operator -(difference_type i) const\n    { iterator itt = *this; return (itt -= i); }\n    difference_type operator -(const iterator &i) const\n    { return it - i.it; }\n\n    ITER operator *() const { return it; }\n    ITER operator [](int i) { return it + i; }\n\n    bool operator ==(const iterator &i) const { return (it == i.it); }\n    bool operator !=(const iterator &i) const { return !(i == *this); }\n    bool operator < (const iterator &i) const { return (it < i.it); }\n\n    conjugated_col_const_iterator(void) {}\n    conjugated_col_const_iterator(const ITER &i) : it(i) { }\n\n  };\n\n  template <typename M> struct  conjugated_col_matrix_const_ref {\n    \n    typedef conjugated_col_matrix_const_ref<M> this_type;\n    typedef typename linalg_traits<M>::const_col_iterator iterator;\n    typedef typename linalg_traits<M>::value_type value_type;\n    typedef typename linalg_traits<this_type>::origin_type origin_type;\n\n    iterator begin_, end_;\n    const origin_type *origin;\n    size_type nr, nc;\n\n    conjugated_col_matrix_const_ref(const M &m)\n      : begin_(mat_col_begin(m)), end_(mat_col_end(m)),\n\torigin(linalg_origin(m)), nr(mat_ncols(m)), nc(mat_nrows(m)) {}\n\n    value_type operator()(size_type i, size_type j) const\n    { return gmm::conj(linalg_traits<M>::access(begin_+i, j)); }\n  };\n\n  template <typename M>\n  struct linalg_traits<conjugated_col_matrix_const_ref<M> > {\n    typedef conjugated_col_matrix_const_ref<M> this_type;\n    typedef typename linalg_traits<M>::origin_type origin_type;\n    typedef linalg_const is_reference;\n    typedef abstract_matrix linalg_type;\n    typedef typename linalg_traits<M>::value_type value_type;\n    typedef value_type reference;\n    typedef typename linalg_traits<M>::storage_type storage_type;\n    typedef typename linalg_traits<M>::const_sub_col_type vector_type;\n    typedef conjugated_vector_const_ref<vector_type> sub_row_type;\n    typedef conjugated_vector_const_ref<vector_type> const_sub_row_type;\n    typedef conjugated_col_const_iterator<M> row_iterator;\n    typedef conjugated_col_const_iterator<M> const_row_iterator;\n    typedef abstract_null_type const_sub_col_type;\n    typedef abstract_null_type sub_col_type;\n    typedef abstract_null_type const_col_iterator;\n    typedef abstract_null_type col_iterator;\n    typedef row_major sub_orientation;\n    typedef typename linalg_traits<M>::index_sorted index_sorted;\n    static inline size_type nrows(const this_type &m) { return m.nr; }\n    static inline size_type ncols(const this_type &m) { return m.nc; }\n    static inline const_sub_row_type row(const const_row_iterator &it)\n    { return conjugated(linalg_traits<M>::col(it.it)); }\n    static inline const_row_iterator row_begin(const this_type &m)\n    { return const_row_iterator(m.begin_); }\n    static inline const_row_iterator row_end(const this_type &m)\n    { return const_row_iterator(m.end_); }\n    static inline const origin_type* origin(const this_type &m)\n    { return m.origin; }\n    static value_type access(const const_row_iterator &it, size_type i)\n    { return gmm::conj(linalg_traits<M>::access(it.it, i)); }\n  };\n\n  template<typename M> std::ostream &operator <<\n  (std::ostream &o, const conjugated_col_matrix_const_ref<M>& m)\n  { gmm::write(o,m); return o; }\n\n\n  template <typename L, typename SO> struct conjugated_return__ {\n    typedef conjugated_row_matrix_const_ref<L> return_type;\n  };\n  template <typename L> struct conjugated_return__<L, col_major> {\n    typedef conjugated_col_matrix_const_ref<L> return_type;\n  };\n  template <typename L, typename T, typename LT> struct conjugated_return_ {\n    typedef const L & return_type;\n  };\n  template <typename L, typename T>\n  struct conjugated_return_<L, std::complex<T>, abstract_vector> {\n    typedef conjugated_vector_const_ref<L> return_type;\n  };\n  template <typename L, typename T>\n  struct conjugated_return_<L, T, abstract_matrix> {\n    typedef typename conjugated_return__<L,\n    typename principal_orientation_type<typename\n    linalg_traits<L>::sub_orientation>::potype\n    >::return_type return_type;\n  };\n  template <typename L> struct conjugated_return {\n    typedef typename\n    conjugated_return_<L, typename linalg_traits<L>::value_type,\n\t\t       typename linalg_traits<L>::linalg_type\t\t       \n\t\t       >::return_type return_type;\n  };\n\n  ///@endcond\n  /** return a conjugated view of the input matrix or vector. */\n  template <typename L> inline\n  typename conjugated_return<L>::return_type\n  conjugated(const L &v) {\n    return conjugated(v, typename linalg_traits<L>::value_type(),\n\t\t      typename linalg_traits<L>::linalg_type());\n  }\n  ///@cond DOXY_SHOW_ALL_FUNCTIONS\n\n  template <typename L, typename T, typename LT> inline\n  const L & conjugated(const L &v, T, LT) { return v; }\n\n  template <typename L, typename T> inline\n  conjugated_vector_const_ref<L> conjugated(const L &v, std::complex<T>,\n\t\t\t\t\t    abstract_vector)\n  { return conjugated_vector_const_ref<L>(v); }\n\n  template <typename L, typename T> inline\n  typename conjugated_return__<L,\n    typename principal_orientation_type<typename\n    linalg_traits<L>::sub_orientation>::potype>::return_type\n  conjugated(const L &v, T, abstract_matrix) {\n    return conjugated(v, typename principal_orientation_type<typename\n\t\t      linalg_traits<L>::sub_orientation>::potype());\n  }\n\n  template <typename L> inline\n  conjugated_row_matrix_const_ref<L> conjugated(const L &v, row_major)\n  { return conjugated_row_matrix_const_ref<L>(v); }\n\n  template <typename L> inline\n  conjugated_col_matrix_const_ref<L> conjugated(const L &v, col_major)\n  { return conjugated_col_matrix_const_ref<L>(v); }\n  \n  ///@endcond\n  \n\n}\n\n#endif //  GMM_CONJUGATED_H__\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_def.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2002-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n/**@file gmm_def.h\n   @author  Yves Renard <Yves.Renard@insa-lyon.fr>\n   @date October 13, 2002.\n   @brief Basic definitions and tools of GMM.\n*/\n#ifndef GMM_DEF_H__\n#define GMM_DEF_H__\n\n#include \"gmm_ref.h\"\n#include <complex>\n\n#ifndef M_PI\n# define\tM_E\t\t2.7182818284590452354       /* e          */\n# define\tM_LOG2E\t\t1.4426950408889634074       /* 1/ln(2)    */\n# define\tM_LOG10E\t0.43429448190325182765      /* 1/ln(10)   */\n# define\tM_LN2\t\t0.69314718055994530942      /* ln(2)      */\n# define\tM_LN10\t\t2.30258509299404568402      /* ln(10)     */\n# define\tM_PI\t\t3.14159265358979323846      /* pi         */\n# define\tM_PI_2\t\t1.57079632679489661923      /* pi/2       */\n# define\tM_PI_4\t\t0.78539816339744830962      /* pi/4       */\n# define\tM_1_PI\t\t0.31830988618379067154      /* 1/pi       */\n# define\tM_2_PI\t\t0.63661977236758134308      /* 2/pi       */\n# define\tM_2_SQRTPI\t1.12837916709551257390      /* 2/sqrt(pi) */\n# define\tM_SQRT2\t\t1.41421356237309504880      /* sqrt(2)    */\n# define\tM_SQRT1_2\t0.70710678118654752440      /* sqrt(2)/2  */\n#endif \n\n#ifndef M_PIl\n# define M_PIl       3.1415926535897932384626433832795029L  /* pi         */\n# define M_PI_2l     1.5707963267948966192313216916397514L  /* pi/2       */\n# define M_PI_4l     0.7853981633974483096156608458198757L  /* pi/4       */\n# define M_1_PIl     0.3183098861837906715377675267450287L  /* 1/pi       */\n# define M_2_PIl     0.6366197723675813430755350534900574L  /* 2/pi       */\n# define M_2_SQRTPIl 1.1283791670955125738961589031215452L  /* 2/sqrt(pi) */\n#endif\n\nnamespace gmm {\n\n  typedef size_t size_type;\n\n  /* ******************************************************************** */\n  /*\t\tSpecifier types                             \t\t  */\n  /* ******************************************************************** */\n  /* not perfectly null, required by aCC 3.33                             */\n  struct abstract_null_type { \n    abstract_null_type(int=0) {}\n    template <typename A,typename B,typename C> void operator()(A,B,C) {}\n  }; // specify an information lake.\n\n  struct linalg_true {};\n  struct linalg_false {};\n\n  template <typename V, typename W> struct linalg_and\n  { typedef linalg_false bool_type; };\n  template <> struct linalg_and<linalg_true, linalg_true>\n  { typedef linalg_true bool_type; };\n  template <typename V, typename W> struct linalg_or\n  { typedef linalg_true bool_type; };\n  template <> struct linalg_and<linalg_false, linalg_false>\n  { typedef linalg_false bool_type; };\n\n  struct linalg_const {};       // A reference is either linalg_const,\n  struct linalg_modifiable {};  //  linalg_modifiable or linalg_false.\n\n  struct abstract_vector {};    // The object is a vector\n  struct abstract_matrix {};    // The object is a matrix\n  \n  struct abstract_sparse {};    // sparse matrix or vector\n  struct abstract_skyline {};   // 'sky-line' matrix or vector\n  struct abstract_dense {};     // dense matrix or vector\n  struct abstract_indirect {};  // matrix given by the product with a vector\n\n  struct row_major {};          // matrix with a row access.\n  struct col_major {};          // matrix with a column access\n  struct row_and_col {};        // both accesses but row preference\n  struct col_and_row {};        // both accesses but column preference\n\n  template <typename T> struct transposed_type;\n  template<> struct transposed_type<row_major>   {typedef col_major   t_type;};\n  template<> struct transposed_type<col_major>   {typedef row_major   t_type;};\n  template<> struct transposed_type<row_and_col> {typedef col_and_row t_type;};\n  template<> struct transposed_type<col_and_row> {typedef row_and_col t_type;};\n\n  template <typename T> struct principal_orientation_type\n  { typedef abstract_null_type potype; };\n  template<> struct principal_orientation_type<row_major>\n  { typedef row_major potype; };\n  template<> struct principal_orientation_type<col_major>\n  { typedef col_major potype; };\n  template<> struct principal_orientation_type<row_and_col>\n  { typedef row_major potype; };\n  template<> struct principal_orientation_type<col_and_row>\n  { typedef col_major potype; };\n\n  //  template <typename V> struct linalg_traits;\n  template <typename V> struct linalg_traits {    \n    typedef abstract_null_type this_type;\n    typedef abstract_null_type linalg_type;\n    typedef abstract_null_type value_type;\n    typedef abstract_null_type is_reference;\n    typedef abstract_null_type& reference;\n    typedef abstract_null_type* iterator;\n    typedef const abstract_null_type* const_iterator;\n    typedef abstract_null_type index_sorted;\n    typedef abstract_null_type storage_type;\n    typedef abstract_null_type origin_type;\n    typedef abstract_null_type const_sub_row_type;\n    typedef abstract_null_type sub_row_type;\n    typedef abstract_null_type const_row_iterator;\n    typedef abstract_null_type row_iterator;\n    typedef abstract_null_type const_sub_col_type;\n    typedef abstract_null_type sub_col_type;\n    typedef abstract_null_type const_col_iterator;\n    typedef abstract_null_type col_iterator;\n    typedef abstract_null_type sub_orientation;    \n  };\n\n  template <typename PT, typename V> struct vect_ref_type;\n  template <typename P, typename V> struct vect_ref_type<P *, V> {\n    typedef typename linalg_traits<V>::reference access_type;\n    typedef typename linalg_traits<V>::iterator iterator;\n  };\n  template <typename P, typename V> struct vect_ref_type<const P *, V> {\n    typedef typename linalg_traits<V>::value_type access_type;\n    typedef typename linalg_traits<V>::const_iterator iterator;\n  };\n  \n  template <typename PT> struct const_pointer;\n  template <typename P> struct const_pointer<P *>\n  { typedef const P* pointer; };\n  template <typename P> struct const_pointer<const P *>\n  { typedef const P* pointer; };\n\n  template <typename PT> struct modifiable_pointer;\n  template <typename P> struct modifiable_pointer<P *>\n  { typedef P* pointer; };\n  template <typename P> struct modifiable_pointer<const P *>\n  { typedef P* pointer; };\n\n  template <typename R> struct const_reference;\n  template <typename R> struct const_reference<R &>\n  { typedef const R &reference; };\n  template <typename R> struct const_reference<const R &>\n  { typedef const R  &reference; };\n\n\n  inline bool is_sparse(abstract_sparse)   { return true;  }\n  inline bool is_sparse(abstract_dense)    { return false; }\n  inline bool is_sparse(abstract_skyline)  { return true;  }\n  inline bool is_sparse(abstract_indirect) { return false; }\n\n  template <typename L> inline bool is_sparse(const L &) \n  { return is_sparse(typename linalg_traits<L>::storage_type()); }\n\n  inline bool is_row_matrix_(row_major)     { return true;  }\n  inline bool is_row_matrix_(col_major)     { return false; }\n  inline bool is_row_matrix_(row_and_col)   { return true;  }\n  inline bool is_row_matrix_(col_and_row)   { return true;  }\n\n  template <typename L> inline bool is_row_matrix(const L &) \n  { return is_row_matrix_(typename linalg_traits<L>::sub_orientation()); }\n\n  inline bool is_col_matrix_(row_major)     { return false; }\n  inline bool is_col_matrix_(col_major)     { return true;  }\n  inline bool is_col_matrix_(row_and_col)   { return true;  }\n  inline bool is_col_matrix_(col_and_row)   { return true;  }\n\n  template <typename L> inline bool is_col_matrix(const L &) \n  { return is_col_matrix_(typename linalg_traits<L>::sub_orientation()); }\n\n  inline bool is_col_matrix(row_major) { return false; }\n  inline bool is_col_matrix(col_major) { return true; }\n  inline bool is_row_matrix(row_major) { return true; }\n  inline bool is_row_matrix(col_major) { return false; }\n\n  template <typename L> inline bool is_const_reference(L) { return false; }\n  inline bool is_const_reference(linalg_const) { return true; }  \n\n\n  template <typename T> struct is_gmm_interfaced_ {\n    typedef linalg_true result;\n  };\n  \n  template<> struct is_gmm_interfaced_<abstract_null_type> {\n    typedef linalg_false result;\n  };\n  \n  template <typename T> struct is_gmm_interfaced {\n    typedef typename is_gmm_interfaced_<typename gmm::linalg_traits<T>::this_type >::result result;\n  };\n\n  /* ******************************************************************** */\n  /*  types to deal with const object representing a modifiable reference */\n  /* ******************************************************************** */\n  \n  template <typename PT, typename R> struct mref_type_ \n  { typedef abstract_null_type return_type; };\n  template <typename L, typename R> struct mref_type_<L *, R>\n  { typedef L & return_type; };\n  template <typename L, typename R> struct mref_type_<const L *, R>\n  { typedef const L & return_type; };\n  template <typename L> struct mref_type_<L *, linalg_const>\n  { typedef const L & return_type; };\n  template <typename L> struct mref_type_<const L *, linalg_const>\n  { typedef const L & return_type; };\n  template <typename L> struct mref_type_<const L *, linalg_modifiable>\n  { typedef L & return_type; };\n  template <typename L> struct mref_type_<L *, linalg_modifiable>\n  { typedef L & return_type; };\n\n  template <typename PT> struct mref_type {\n    typedef typename std::iterator_traits<PT>::value_type L;\n    typedef typename mref_type_<PT, \n      typename linalg_traits<L>::is_reference>::return_type return_type;\n  };\n\n  template <typename L> typename mref_type<const L *>::return_type \n  linalg_cast(const L &l)\n  { return const_cast<typename mref_type<const L *>::return_type>(l); }\n\n  template <typename L> typename mref_type<L *>::return_type linalg_cast(L &l)\n  { return const_cast<typename mref_type<L *>::return_type>(l); }\n\n  template <typename L, typename R> struct cref_type_\n  { typedef abstract_null_type return_type; };\n  template <typename L> struct cref_type_<L, linalg_modifiable>\n  { typedef L & return_type; };\n  template <typename L> struct cref_type {\n    typedef typename cref_type_<L, \n      typename linalg_traits<L>::is_reference>::return_type return_type;\n  };\n\n  template <typename L> typename cref_type<L>::return_type \n  linalg_const_cast(const L &l)\n  { return const_cast<typename cref_type<L>::return_type>(l); }\n\n\n  // To be used to select between a reference or a const refercence for\n  // the return type of a function\n  // select_return<C1, C2, L *> return C1 if L is a const reference,\n  //                                   C2 otherwise.\n  // select_return<C1, C2, const L *> return C2 if L is a modifiable reference\n  //                                         C1 otherwise. \n  template <typename C1, typename C2, typename REF> struct select_return_ {\n    typedef abstract_null_type return_type;\n  };\n  template <typename C1, typename C2, typename L>\n  struct select_return_<C1, C2, const L &> { typedef C1 return_type; };\n  template <typename C1, typename C2, typename L>\n  struct select_return_<C1, C2, L &> { typedef C2 return_type; };\n  template <typename C1, typename C2, typename PT> struct select_return {\n    typedef typename std::iterator_traits<PT>::value_type L;\n    typedef typename select_return_<C1, C2, \n      typename mref_type<PT>::return_type>::return_type return_type;\n  };\n\n  \n  // To be used to select between a reference or a const refercence inside\n  // a structure or a linagl_traits\n  // select_ref<C1, C2, L *> return C1 if L is a const reference,\n  //                                C2 otherwise.\n  // select_ref<C1, C2, const L *> return C2 in any case. \n  template <typename C1, typename C2, typename REF> struct select_ref_\n  { typedef abstract_null_type ref_type; };\n  template <typename C1, typename C2, typename L>\n  struct select_ref_<C1, C2, const L &> { typedef C1 ref_type; };\n  template <typename C1, typename C2, typename L>\n  struct select_ref_<C1, C2, L &> { typedef C2 ref_type; };\n  template <typename C1, typename C2, typename PT> struct select_ref {\n    typedef typename std::iterator_traits<PT>::value_type L;\n    typedef typename select_ref_<C1, C2, \n      typename mref_type<PT>::return_type>::ref_type ref_type;\n  };\n  template <typename C1, typename C2, typename L>\n  struct select_ref<C1, C2, const L *>\n  { typedef C1 ref_type; };\n\n\n  template<typename R> struct is_a_reference_\n  { typedef linalg_true reference; };\n  template<> struct is_a_reference_<linalg_false>\n  { typedef linalg_false reference; };\n\n  template<typename L> struct is_a_reference {\n    typedef typename is_a_reference_<typename linalg_traits<L>::is_reference>\n      ::reference reference;\n  };\n\n\n  template <typename L> inline bool is_original_linalg(const L &) \n  { return is_original_linalg(typename is_a_reference<L>::reference()); }\n  inline bool is_original_linalg(linalg_false) { return true; }\n  inline bool is_original_linalg(linalg_true) { return false; }\n\n\n  template <typename PT> struct which_reference \n  { typedef abstract_null_type is_reference; };\n  template <typename PT> struct which_reference<PT *>\n  { typedef linalg_modifiable is_reference; };\n  template <typename PT> struct which_reference<const PT *>\n  { typedef linalg_const is_reference; };\n\n\n  template <typename C1, typename C2, typename R> struct select_orientation_\n  { typedef abstract_null_type return_type; };\n  template <typename C1, typename C2>\n  struct select_orientation_<C1, C2, row_major>\n  { typedef C1 return_type; };\n  template <typename C1, typename C2>\n  struct select_orientation_<C1, C2, col_major>\n  { typedef C2 return_type; };\n  template <typename C1, typename C2, typename L> struct select_orientation {\n    typedef typename select_orientation_<C1, C2,\n      typename principal_orientation_type<typename\n      linalg_traits<L>::sub_orientation>::potype>::return_type return_type;\n  };\n  \n  /* ******************************************************************** */\n  /*\t\tOperations on scalars                         \t\t  */\n  /* ******************************************************************** */\n\n  template <typename T> inline T sqr(T a) { return T(a * a); }\n  template <typename T> inline T abs(T a) { return (a < T(0)) ? T(-a) : a; }\n  template <typename T> inline T abs(std::complex<T> a)\n  { T x = a.real(), y = a.imag(); return T(::sqrt(x*x+y*y)); }\n  template <typename T> inline T abs_sqr(T a) { return T(a*a); }\n  template <typename T> inline T abs_sqr(std::complex<T> a)\n  { return gmm::sqr(a.real()) + gmm::sqr(a.imag()); }\n  template <typename T> inline T pos(T a) { return (a < T(0)) ? T(0) : a; }\n  template <typename T> inline T neg(T a) { return (a < T(0)) ? T(-a) : T(0); }\n  template <typename T> inline T sgn(T a) { return (a < T(0)) ? T(-1) : T(1); }\n  template <typename T> inline T Heaviside(T a) { return (a < T(0)) ? T(0) : T(1); }\n  inline double random() { return double(rand())/(RAND_MAX+0.5); }\n  template <typename T> inline T random(T)\n  { return T(rand()*2.0)/(T(RAND_MAX)+T(1)/T(2)) - T(1); }\n  template <typename T> inline std::complex<T> random(std::complex<T>)\n  { return std::complex<T>(gmm::random(T()), gmm::random(T())); }\n  template <typename T> inline T irandom(T max)\n  { return T(gmm::random() * double(max)); }\n  template <typename T> inline T conj(T a) { return a; }\n  template <typename T> inline std::complex<T> conj(std::complex<T> a)\n  { return std::conj(a); }\n  template <typename T> inline T real(T a) { return a; }\n  template <typename T> inline T real(std::complex<T> a) { return a.real(); }\n  template <typename T> inline T imag(T ) { return T(0); }\n  template <typename T> inline T imag(std::complex<T> a) { return a.imag(); }  \n  template <typename T> inline T sqrt(T a) { return T(::sqrt(a)); }\n  template <typename T> inline std::complex<T> sqrt(std::complex<T> a) {\n    T x = a.real(), y = a.imag();\n    if (x == T(0)) {\n      T t = T(::sqrt(gmm::abs(y) / T(2)));\n      return std::complex<T>(t, y < T(0) ? -t : t);\n    }\n    T t = T(::sqrt(T(2) * (gmm::abs(a) + gmm::abs(x)))), u = t / T(2);\n    return x > T(0) ? std::complex<T>(u, y / t)\n      : std::complex<T>(gmm::abs(y) / t, y < T(0) ? -u : u);\n  }\n  using std::swap;\n\n\n  template <typename T> struct number_traits {\n    typedef T magnitude_type;\n  };\n \n  template <typename T> struct number_traits<std::complex<T> > {\n    typedef T magnitude_type;\n  };\n\n  template <typename T> inline T conj_product(T a, T b) { return a * b; }\n  template <typename T> inline\n  std::complex<T> conj_product(std::complex<T> a, std::complex<T> b)\n  { return std::conj(a) * b; } // to be optimized ?\n\n  template <typename T> inline bool is_complex(T) { return false; }\n  template <typename T> inline bool is_complex(std::complex<T> )\n  { return true; }\n\n# define magnitude_of_linalg(M) typename number_traits<typename \\\n                    linalg_traits<M>::value_type>::magnitude_type\n  \n  template<typename T> inline std::complex<T> operator*(const std::complex<T>& a, int b) {\n    return a*T(b);\n  }\n  template<typename T> inline std::complex<T> operator*(int b, const std::complex<T>& a) {\n    return a*T(b);\n  }\n\n  /* ******************************************************************** */\n  /*  types promotion                                                     */\n  /* ******************************************************************** */\n\n  /* should be completed for more specific cases <unsigned int, float> etc */\n  template <typename T1, typename T2, bool c>\n  struct strongest_numeric_type_aux {\n    typedef T1 T;\n  };\n  template <typename T1, typename T2>\n  struct strongest_numeric_type_aux<T1,T2,false> {\n    typedef T2 T;\n  };\n\n  template <typename T1, typename T2>\n  struct strongest_numeric_type {\n    typedef typename\n    strongest_numeric_type_aux<T1,T2,(sizeof(T1)>sizeof(T2))>::T T;\n  };\n  template <typename T1, typename T2>\n  struct strongest_numeric_type<T1,std::complex<T2> > {\n    typedef typename number_traits<T1>::magnitude_type R1;\n    typedef std::complex<typename strongest_numeric_type<R1,T2>::T > T;\n  };\n  template <typename T1, typename T2>\n  struct strongest_numeric_type<std::complex<T1>,T2 > {\n    typedef typename number_traits<T2>::magnitude_type R2;\n    typedef std::complex<typename strongest_numeric_type<T1,R2>::T > T;\n  };\n  template <typename T1, typename T2> \n  struct strongest_numeric_type<std::complex<T1>,std::complex<T2> > {\n    typedef std::complex<typename strongest_numeric_type<T1,T2>::T > T;\n  };\n\n  template<> struct strongest_numeric_type<int,float>   { typedef float T;  };\n  template<> struct strongest_numeric_type<float,int>   { typedef float T;  };\n  template<> struct strongest_numeric_type<long,float>  { typedef float T;  };\n  template<> struct strongest_numeric_type<float,long>  { typedef float T;  };\n  template<> struct strongest_numeric_type<long,double> { typedef double T; };\n  template<> struct strongest_numeric_type<double,long> { typedef double T; };\n\n  template <typename V1, typename V2>\n  struct strongest_value_type {\n    typedef typename\n    strongest_numeric_type<typename linalg_traits<V1>::value_type,\n\t\t\t   typename linalg_traits<V2>::value_type>::T\n    value_type;\n  };\n  template <typename V1, typename V2, typename V3>\n  struct strongest_value_type3 {\n    typedef typename\n    strongest_value_type<V1, typename\n\t\t\t strongest_value_type<V2,V3>::value_type>::value_type\n    value_type;\n  };\n\n  \n\n  /* ******************************************************************** */\n  /*\t\tBasic vectors used                         \t\t  */\n  /* ******************************************************************** */\n  \n  template<typename T> struct dense_vector_type \n  { typedef std::vector<T> vector_type; };\n\n  template <typename T> class wsvector;\n  template <typename T> class rsvector;\n  template<typename T> struct sparse_vector_type \n  { typedef wsvector<T> vector_type; };\n\n  template <typename T> class slvector;\n  template <typename T> class dense_matrix;\n  template <typename VECT> class row_matrix;\n  template <typename VECT> class col_matrix;\n  \n\n  /* ******************************************************************** */\n  /*   Selects a temporary vector type                                    */\n  /*   V if V is a valid vector type,                                     */\n  /*   wsvector if V is a reference on a sparse vector,                   */\n  /*   std::vector if V is a reference on a dense vector.                 */\n  /* ******************************************************************** */\n\n  \n  template <typename R, typename S, typename L, typename V>\n  struct temporary_vector_ {\n    typedef abstract_null_type vector_type;\n  };\n  template <typename V, typename L>\n  struct temporary_vector_<linalg_true, abstract_sparse, L, V>\n  { typedef wsvector<typename linalg_traits<V>::value_type> vector_type; };\n  template <typename V, typename L>\n  struct temporary_vector_<linalg_true, abstract_skyline, L, V>\n  { typedef slvector<typename linalg_traits<V>::value_type> vector_type; };\n  template <typename V, typename L>\n  struct temporary_vector_<linalg_true, abstract_dense, L, V>\n  { typedef std::vector<typename linalg_traits<V>::value_type> vector_type; };\n  template <typename S, typename V>\n  struct temporary_vector_<linalg_false, S, abstract_vector, V>\n  { typedef V vector_type; };\n  template <typename V>\n  struct temporary_vector_<linalg_false, abstract_dense, abstract_matrix, V>\n  { typedef std::vector<typename linalg_traits<V>::value_type> vector_type; };\n  template <typename V>\n  struct temporary_vector_<linalg_false, abstract_sparse, abstract_matrix, V>\n  { typedef wsvector<typename linalg_traits<V>::value_type> vector_type; };\n\n  template <typename V> struct temporary_vector {\n    typedef typename temporary_vector_<typename is_a_reference<V>::reference,\n\t\t\t\t       typename linalg_traits<V>::storage_type,\n\t\t\t\t       typename linalg_traits<V>::linalg_type,\n\t\t\t\t       V>::vector_type vector_type;\n  };\n\n  /* ******************************************************************** */\n  /*   Selects a temporary matrix type                                    */\n  /*   M if M is a valid matrix type,                                     */\n  /*   row_matrix<wsvector> if M is a reference on a sparse matrix,       */\n  /*   dense_matrix if M is a reference on a dense matrix.                */\n  /* ******************************************************************** */\n\n  \n  template <typename R, typename S, typename L, typename V>\n  struct temporary_matrix_ { typedef abstract_null_type matrix_type; };\n  template <typename V, typename L>\n  struct temporary_matrix_<linalg_true, abstract_sparse, L, V> {\n    typedef typename linalg_traits<V>::value_type T;\n    typedef row_matrix<wsvector<T> > matrix_type;\n  };\n  template <typename V, typename L>\n  struct temporary_matrix_<linalg_true, abstract_skyline, L, V> {\n    typedef typename linalg_traits<V>::value_type T;\n    typedef row_matrix<slvector<T> > matrix_type;\n  };\n  template <typename V, typename L>\n  struct temporary_matrix_<linalg_true, abstract_dense, L, V>\n  { typedef dense_matrix<typename linalg_traits<V>::value_type> matrix_type; };\n  template <typename S, typename V>\n  struct temporary_matrix_<linalg_false, S, abstract_matrix, V>\n  { typedef V matrix_type; };\n\n  template <typename V> struct temporary_matrix {\n    typedef typename temporary_matrix_<typename is_a_reference<V>::reference,\n\t\t\t\t       typename linalg_traits<V>::storage_type,\n\t\t\t\t       typename linalg_traits<V>::linalg_type,\n\t\t\t\t       V>::matrix_type matrix_type;\n  };\n\n  \n  template <typename S, typename L, typename V>\n  struct temporary_col_matrix_ { typedef abstract_null_type matrix_type; };\n  template <typename V, typename L>\n  struct temporary_col_matrix_<abstract_sparse, L, V> {\n    typedef typename linalg_traits<V>::value_type T;\n    typedef col_matrix<wsvector<T> > matrix_type;\n  };\n  template <typename V, typename L>\n  struct temporary_col_matrix_<abstract_skyline, L, V> {\n    typedef typename linalg_traits<V>::value_type T;\n    typedef col_matrix<slvector<T> > matrix_type;\n  };\n  template <typename V, typename L>\n  struct temporary_col_matrix_<abstract_dense, L, V>\n  { typedef dense_matrix<typename linalg_traits<V>::value_type> matrix_type; };\n\n  template <typename V> struct temporary_col_matrix {\n    typedef typename temporary_col_matrix_<\n      typename linalg_traits<V>::storage_type,\n      typename linalg_traits<V>::linalg_type,\n      V>::matrix_type matrix_type;\n  };\n\n\n\n\n  template <typename S, typename L, typename V>\n  struct temporary_row_matrix_ { typedef abstract_null_type matrix_type; };\n  template <typename V, typename L>\n  struct temporary_row_matrix_<abstract_sparse, L, V> {\n    typedef typename linalg_traits<V>::value_type T;\n    typedef row_matrix<wsvector<T> > matrix_type;\n  };\n  template <typename V, typename L>\n  struct temporary_row_matrix_<abstract_skyline, L, V> {\n    typedef typename linalg_traits<V>::value_type T;\n    typedef row_matrix<slvector<T> > matrix_type;\n  };\n  template <typename V, typename L>\n  struct temporary_row_matrix_<abstract_dense, L, V>\n  { typedef dense_matrix<typename linalg_traits<V>::value_type> matrix_type; };\n\n  template <typename V> struct temporary_row_matrix {\n    typedef typename temporary_row_matrix_<\n      typename linalg_traits<V>::storage_type,\n      typename linalg_traits<V>::linalg_type,\n      V>::matrix_type matrix_type;\n  };\n\n\n\n  /* ******************************************************************** */\n  /*   Selects a temporary dense vector type                              */\n  /*   V if V is a valid dense vector type,                               */\n  /*   std::vector if V is a reference or another type of vector          */\n  /* ******************************************************************** */\n\n  template <typename R, typename S, typename V>\n  struct temporary_dense_vector_ { typedef abstract_null_type vector_type; };\n  template <typename S, typename V>\n  struct temporary_dense_vector_<linalg_true, S, V>\n  { typedef std::vector<typename linalg_traits<V>::value_type> vector_type; };\n  template <typename V>\n  struct temporary_dense_vector_<linalg_false, abstract_sparse, V>\n  { typedef std::vector<typename linalg_traits<V>::value_type> vector_type; };\n  template <typename V>\n  struct temporary_dense_vector_<linalg_false, abstract_skyline, V>\n  { typedef std::vector<typename linalg_traits<V>::value_type> vector_type; };\n  template <typename V>\n  struct temporary_dense_vector_<linalg_false, abstract_dense, V>\n  { typedef V vector_type; };\n\n  template <typename V> struct temporary_dense_vector {\n    typedef typename temporary_dense_vector_<typename\n    is_a_reference<V>::reference,\n    typename linalg_traits<V>::storage_type, V>::vector_type vector_type;\n  };\n\n  /* ******************************************************************** */\n  /*   Selects a temporary sparse vector type                             */\n  /*   V if V is a valid sparse vector type,                              */\n  /*   wsvector if V is a reference or another type of vector             */\n  /* ******************************************************************** */\n\n  template <typename R, typename S, typename V>\n  struct temporary_sparse_vector_ { typedef abstract_null_type vector_type; };\n  template <typename S, typename V>\n  struct temporary_sparse_vector_<linalg_true, S, V>\n  { typedef wsvector<typename linalg_traits<V>::value_type> vector_type; };\n  template <typename V>\n  struct temporary_sparse_vector_<linalg_false, abstract_sparse, V>\n  { typedef V vector_type; };\n  template <typename V>\n  struct temporary_sparse_vector_<linalg_false, abstract_dense, V>\n  { typedef wsvector<typename linalg_traits<V>::value_type> vector_type; };\n  template <typename V>\n  struct temporary_sparse_vector_<linalg_false, abstract_skyline, V>\n  { typedef wsvector<typename linalg_traits<V>::value_type> vector_type; };\n\n  template <typename V> struct temporary_sparse_vector {\n    typedef typename temporary_sparse_vector_<typename\n    is_a_reference<V>::reference,\n    typename linalg_traits<V>::storage_type, V>::vector_type vector_type;\n  };\n\n  /* ******************************************************************** */\n  /*   Selects a temporary sky-line vector type                           */\n  /*   V if V is a valid sky-line vector type,                            */\n  /*   slvector if V is a reference or another type of vector             */\n  /* ******************************************************************** */\n\n  template <typename R, typename S, typename V>\n  struct temporary_skyline_vector_\n  { typedef abstract_null_type vector_type; };\n  template <typename S, typename V>\n  struct temporary_skyline_vector_<linalg_true, S, V>\n  { typedef slvector<typename linalg_traits<V>::value_type> vector_type; };\n  template <typename V>\n  struct temporary_skyline_vector_<linalg_false, abstract_skyline, V>\n  { typedef V vector_type; };\n  template <typename V>\n  struct temporary_skyline_vector_<linalg_false, abstract_dense, V>\n  { typedef slvector<typename linalg_traits<V>::value_type> vector_type; };\n  template <typename V>\n  struct temporary_skyline_vector_<linalg_false, abstract_sparse, V>\n  { typedef slvector<typename linalg_traits<V>::value_type> vector_type; };\n\n  template <typename V> struct temporary_skylines_vector {\n    typedef typename temporary_skyline_vector_<typename\n    is_a_reference<V>::reference,\n    typename linalg_traits<V>::storage_type, V>::vector_type vector_type;\n  };\n\n  /* ********************************************************************* */\n  /*  Definition & Comparison of origins.                                  */\n  /* ********************************************************************* */\n\n  template <typename L> \n  typename select_return<const typename linalg_traits<L>::origin_type *,\n\t\t\t typename linalg_traits<L>::origin_type *,\n\t\t\t L *>::return_type\n  linalg_origin(L &l)\n  { return linalg_traits<L>::origin(linalg_cast(l)); }\n\n  template <typename L> \n  typename select_return<const typename linalg_traits<L>::origin_type *,\n\t\t\t typename linalg_traits<L>::origin_type *,\n\t\t\t const L *>::return_type\n  linalg_origin(const L &l)\n  { return linalg_traits<L>::origin(linalg_cast(l)); }\n\n  template <typename PT1, typename PT2>\n  bool same_porigin(PT1, PT2) { return false; }\n\n  template <typename PT>\n  bool same_porigin(PT pt1, PT pt2) { return (pt1 == pt2); }\n\n  template <typename L1, typename L2>\n  bool same_origin(const L1 &l1, const L2 &l2)\n  { return same_porigin(linalg_origin(l1), linalg_origin(l2)); }\n\n\n  /* ******************************************************************** */\n  /*\t\tMiscellaneous                           \t\t  */\n  /* ******************************************************************** */\n\n  template <typename V> inline size_type vect_size(const V &v)\n  { return linalg_traits<V>::size(v); }\n\n  template <typename MAT> inline size_type mat_nrows(const MAT &m)\n  { return linalg_traits<MAT>::nrows(m); }\n\n  template <typename MAT> inline size_type mat_ncols(const MAT &m)\n  { return linalg_traits<MAT>::ncols(m); }\n\n\n  template <typename V> inline\n  typename select_return<typename linalg_traits<V>::const_iterator,\n           typename linalg_traits<V>::iterator, V *>::return_type\n  vect_begin(V &v)\n  { return linalg_traits<V>::begin(linalg_cast(v)); }\n\n  template <typename V> inline\n  typename select_return<typename linalg_traits<V>::const_iterator,\n\t   typename linalg_traits<V>::iterator, const V *>::return_type\n  vect_begin(const V &v)\n  { return linalg_traits<V>::begin(linalg_cast(v)); }\n\n  template <typename V> inline\n  typename linalg_traits<V>::const_iterator\n  vect_const_begin(const V &v)\n  { return linalg_traits<V>::begin(v); }\n\n  template <typename V> inline\n  typename select_return<typename linalg_traits<V>::const_iterator,\n    typename linalg_traits<V>::iterator, V *>::return_type\n  vect_end(V &v)\n  { return linalg_traits<V>::end(linalg_cast(v)); }\n\n  template <typename V> inline\n  typename select_return<typename linalg_traits<V>::const_iterator,\n    typename linalg_traits<V>::iterator, const V *>::return_type\n  vect_end(const V &v)\n  { return linalg_traits<V>::end(linalg_cast(v)); }\n\n  template <typename V> inline\n  typename linalg_traits<V>::const_iterator\n  vect_const_end(const V &v)\n  { return linalg_traits<V>::end(v); }\n\n  template <typename M> inline\n  typename select_return<typename linalg_traits<M>::const_row_iterator,\n    typename linalg_traits<M>::row_iterator, M *>::return_type\n  mat_row_begin(M &m) { return linalg_traits<M>::row_begin(linalg_cast(m)); }\n  \n  template <typename M> inline\n  typename select_return<typename linalg_traits<M>::const_row_iterator,\n    typename linalg_traits<M>::row_iterator, const M *>::return_type\n  mat_row_begin(const M &m)\n  { return linalg_traits<M>::row_begin(linalg_cast(m)); }\n  \n  template <typename M> inline typename linalg_traits<M>::const_row_iterator\n  mat_row_const_begin(const M &m)\n  { return linalg_traits<M>::row_begin(m); }\n\n  template <typename M> inline\n  typename select_return<typename linalg_traits<M>::const_row_iterator,\n    typename linalg_traits<M>::row_iterator, M *>::return_type\n  mat_row_end(M &v) {\n    return linalg_traits<M>::row_end(linalg_cast(v));\n  }\n\n  template <typename M> inline\n  typename select_return<typename linalg_traits<M>::const_row_iterator,\n    typename linalg_traits<M>::row_iterator, const M *>::return_type\n  mat_row_end(const M &v) {\n    return linalg_traits<M>::row_end(linalg_cast(v));\n  }\n\n  template <typename M> inline\n  typename linalg_traits<M>::const_row_iterator\n  mat_row_const_end(const M &v)\n  { return linalg_traits<M>::row_end(v); }\n\n  template <typename M> inline\n  typename select_return<typename linalg_traits<M>::const_col_iterator,\n    typename linalg_traits<M>::col_iterator, M *>::return_type\n  mat_col_begin(M &v) {\n    return linalg_traits<M>::col_begin(linalg_cast(v));\n  }\n\n  template <typename M> inline\n  typename select_return<typename linalg_traits<M>::const_col_iterator,\n    typename linalg_traits<M>::col_iterator, const M *>::return_type\n  mat_col_begin(const M &v) {\n    return linalg_traits<M>::col_begin(linalg_cast(v));\n  }\n\n  template <typename M> inline\n  typename linalg_traits<M>::const_col_iterator\n  mat_col_const_begin(const M &v)\n  { return linalg_traits<M>::col_begin(v); }\n\n  template <typename M> inline\n  typename linalg_traits<M>::const_col_iterator\n  mat_col_const_end(const M &v)\n  { return linalg_traits<M>::col_end(v); }\n\n  template <typename M> inline\n  typename select_return<typename linalg_traits<M>::const_col_iterator,\n                         typename linalg_traits<M>::col_iterator,\n                         M *>::return_type\n  mat_col_end(M &m)\n  { return linalg_traits<M>::col_end(linalg_cast(m)); }\n\n  template <typename M> inline\n  typename select_return<typename linalg_traits<M>::const_col_iterator,\n                         typename linalg_traits<M>::col_iterator,\n                         const M *>::return_type\n  mat_col_end(const M &m)\n  { return linalg_traits<M>::col_end(linalg_cast(m)); }\n\n  template <typename MAT> inline\n  typename select_return<typename linalg_traits<MAT>::const_sub_row_type,\n                         typename linalg_traits<MAT>::sub_row_type,\n                         const MAT *>::return_type\n  mat_row(const MAT &m, size_type i)\n  { return linalg_traits<MAT>::row(mat_row_begin(m) + i); }\n\n  template <typename MAT> inline\n  typename select_return<typename linalg_traits<MAT>::const_sub_row_type,\n                         typename linalg_traits<MAT>::sub_row_type,\n                         MAT *>::return_type\n  mat_row(MAT &m, size_type i)\n  { return linalg_traits<MAT>::row(mat_row_begin(m) + i); }\n\n  template <typename MAT> inline\n  typename linalg_traits<MAT>::const_sub_row_type\n  mat_const_row(const MAT &m, size_type i)\n  { return linalg_traits<MAT>::row(mat_row_const_begin(m) + i); }\n\n  template <typename MAT> inline\n  typename select_return<typename linalg_traits<MAT>::const_sub_col_type,\n                         typename linalg_traits<MAT>::sub_col_type,\n                         const MAT *>::return_type\n  mat_col(const MAT &m, size_type i)\n  { return linalg_traits<MAT>::col(mat_col_begin(m) + i); }\n\n\n  template <typename MAT> inline\n  typename select_return<typename linalg_traits<MAT>::const_sub_col_type,\n                         typename linalg_traits<MAT>::sub_col_type,\n                         MAT *>::return_type\n  mat_col(MAT &m, size_type i)\n  { return linalg_traits<MAT>::col(mat_col_begin(m) + i); }\n  \n  template <typename MAT> inline\n  typename linalg_traits<MAT>::const_sub_col_type\n  mat_const_col(const MAT &m, size_type i)\n  { return linalg_traits<MAT>::col(mat_col_const_begin(m) + i); }\n  \n  /* ********************************************************************* */\n  /* Set to begin end set to end for iterators on non-const sparse vectors.*/\n  /* ********************************************************************* */\n\n  template <typename IT, typename ORG, typename VECT> inline\n  void set_to_begin(IT &it, ORG o, VECT *, linalg_false)\n  { it = vect_begin(*o); }\n\n  template <typename IT, typename ORG, typename VECT> inline\n  void set_to_begin(IT &it, ORG o, const VECT *, linalg_false) \n  { it = vect_const_begin(*o); }\n\n  template <typename IT, typename ORG, typename VECT> inline\n  void set_to_end(IT &it, ORG o, VECT *, linalg_false)\n  { it = vect_end(*o); }\n  \n  template <typename IT, typename ORG, typename VECT> inline\n  void set_to_end(IT &it, ORG o, const VECT *, linalg_false)\n  { it = vect_const_end(*o); }\n\n\n  template <typename IT, typename ORG, typename VECT> inline\n  void set_to_begin(IT &, ORG, VECT *, linalg_const) { }\n\n  template <typename IT, typename ORG, typename VECT> inline\n  void set_to_begin(IT &, ORG, const VECT *, linalg_const) { }\n\n  template <typename IT, typename ORG, typename VECT> inline\n  void set_to_end(IT &, ORG, VECT *, linalg_const) { }\n  \n  template <typename IT, typename ORG, typename VECT> inline\n  void set_to_end(IT &, ORG, const VECT *, linalg_const) { }\n\n\n  template <typename IT, typename ORG, typename VECT> inline\n  void set_to_begin(IT &, ORG, VECT *v, linalg_modifiable)\n  { GMM_ASSERT3(!is_sparse(*v), \"internal_error\"); v = 0; }\n\n  template <typename IT, typename ORG, typename VECT> inline\n  void set_to_begin(IT &, ORG, const VECT *v, linalg_modifiable)\n  { GMM_ASSERT3(!is_sparse(*v), \"internal_error\"); v = 0; }\n \n  template <typename IT, typename ORG, typename VECT> inline\n  void set_to_end(IT &, ORG, VECT *v, linalg_modifiable)\n  { GMM_ASSERT3(!is_sparse(*v), \"internal_error\"); v = 0; }\n  \n  template <typename IT, typename ORG, typename VECT> inline\n  void set_to_end(IT &, ORG, const VECT *v, linalg_modifiable)\n  { GMM_ASSERT3(!is_sparse(*v), \"internal_error\"); v = 0; }\n\n  /* ******************************************************************** */\n  /*\t\tGeneral index for certain algorithms.         \t\t  */\n  /* ******************************************************************** */\n\n  template<class IT> \n  size_type index_of_it(const IT &it, size_type, abstract_sparse)\n  { return it.index(); }\n  template<class IT> \n  size_type index_of_it(const IT &it, size_type, abstract_skyline)\n  { return it.index(); }\n  template<class IT> \n  size_type index_of_it(const IT &, size_type k, abstract_dense)\n  { return k; }\n\n  /* ********************************************************************* */\n  /* Numeric limits.                                                       */\n  /* ********************************************************************* */\n  \n  template<typename T> inline T default_tol(T) {\n    using namespace std;\n    static T tol(10);\n    if (tol == T(10)) {\n      if (numeric_limits<T>::is_specialized)\n\ttol = numeric_limits<T>::epsilon();\n      else {\n\tint i=sizeof(T)/4; while(i-- > 0) tol*=T(1E-8); \n\tGMM_WARNING1(\"The numeric type \" << typeid(T).name()\n\t\t    << \" has no numeric_limits defined !!\\n\"\n\t\t    << \"Taking \" << tol << \" as default tolerance\");\n      }\n    }\n    return tol;\n  }\n  template<typename T> inline T default_tol(std::complex<T>)\n  { return default_tol(T()); }\n\n  template<typename T> inline T default_min(T) {\n    using namespace std;\n    static T mi(10);\n    if (mi == T(10)) {\n      if (numeric_limits<T>::is_specialized)\n\tmi = std::numeric_limits<T>::min();\n      else {\n\tmi = T(0);\n\tGMM_WARNING1(\"The numeric type \" << typeid(T).name()\n\t\t    << \" has no numeric_limits defined !!\\n\"\n\t\t    << \"Taking 0 as default minimum\");\n      }\n    }\n    return mi;\n  }\n  template<typename T> inline T default_min(std::complex<T>)\n  { return default_min(T()); }\n\n  template<typename T> inline T default_max(T) {\n    using namespace std;\n    static T mi(10);\n    if (mi == T(10)) {\n      if (numeric_limits<T>::is_specialized)\n\tmi = std::numeric_limits<T>::max();\n      else {\n\tmi = T(1);\n\tGMM_WARNING1(\"The numeric type \" << typeid(T).name()\n\t\t    << \" has no numeric_limits defined !!\\n\"\n\t\t    << \"Taking 1 as default maximum !\");\n      }\n    }\n    return mi;\n  }\n  template<typename T> inline T default_max(std::complex<T>)\n  { return default_max(T()); }\n\n  \n  /*\n    use safe_divide to avoid NaNs when dividing very small complex\n    numbers, for example\n    std::complex<float>(1e-23,1e-30)/std::complex<float>(1e-23,1e-30)\n  */\n  template<typename T> inline T safe_divide(T a, T b) { return a/b; }\n  template<typename T> inline std::complex<T>\n  safe_divide(std::complex<T> a, std::complex<T> b) {\n    T m = std::max(gmm::abs(b.real()), gmm::abs(b.imag()));\n    a = std::complex<T>(a.real()/m, a.imag()/m);\n    b = std::complex<T>(b.real()/m, b.imag()/m);\n    return a / b;\n  }\n\n\n  /* ******************************************************************** */\n  /*\t\tWrite                                   \t\t  */\n  /* ******************************************************************** */\n\n  template <typename T> struct cast_char_type { typedef T return_type; };\n  template <> struct cast_char_type<signed char> { typedef int return_type; };\n  template <> struct cast_char_type<unsigned char>\n  { typedef unsigned int return_type; };\n  template <typename T> inline typename cast_char_type<T>::return_type\n  cast_char(const T &c) { return typename cast_char_type<T>::return_type(c); }\n\n\n  template <typename L> inline void write(std::ostream &o, const L &l)\n  { write(o, l, typename linalg_traits<L>::linalg_type()); }\n\n  template <typename L> void write(std::ostream &o, const L &l,\n\t\t\t\t       abstract_vector) {\n    o << \"vector(\" << vect_size(l) << \") [\";\n    write(o, l, typename linalg_traits<L>::storage_type());\n    o << \" ]\";\n  }\n\n  template <typename L> void write(std::ostream &o, const L &l,\n\t\t\t\t       abstract_sparse) {\n    typename linalg_traits<L>::const_iterator it = vect_const_begin(l),\n      ite = vect_const_end(l);\n    for (; it != ite; ++it) \n      o << \" (r\" << it.index() << \",\" << cast_char(*it) << \")\";\n  }\n\n  template <typename L> void write(std::ostream &o, const L &l,\n\t\t\t\t       abstract_dense) {\n    typename linalg_traits<L>::const_iterator it = vect_const_begin(l),\n      ite = vect_const_end(l);\n    if (it != ite) o << \" \" << cast_char(*it++);\n    for (; it != ite; ++it) o << \", \" << cast_char(*it);\n  }\n\n  template <typename L> void write(std::ostream &o, const L &l,\n\t\t\t\t       abstract_skyline) {\n    typedef typename linalg_traits<L>::const_iterator const_iterator;\n    const_iterator it = vect_const_begin(l), ite = vect_const_end(l);\n    if (it != ite) {\n      o << \"<r+\" << it.index() << \">\";\n      if (it != ite) o << \" \" << cast_char(*it++);\n      for (; it != ite; ++it) { o << \", \" << cast_char(*it); }\n    }\n  }\n\n  template <typename L> inline void write(std::ostream &o, const L &l,\n\t\t\t\t       abstract_matrix) {\n    write(o, l, typename linalg_traits<L>::sub_orientation());\n  }\n\n\n  template <typename L> void write(std::ostream &o, const L &l,\n\t\t\t\t       row_major) {\n    o << \"matrix(\" << mat_nrows(l) << \", \" << mat_ncols(l) << \")\" << endl;\n    for (size_type i = 0; i < mat_nrows(l); ++i) {\n      o << \"(\";\n      write(o, mat_const_row(l, i), typename linalg_traits<L>::storage_type());\n      o << \" )\\n\";\n    }\n  }\n\n  template <typename L> inline\n  void write(std::ostream &o, const L &l, row_and_col) \n  { write(o, l, row_major()); }\n\n  template <typename L> inline\n  void write(std::ostream &o, const L &l, col_and_row)\n  { write(o, l, row_major()); }\n\n  template <typename L> void write(std::ostream &o, const L &l, col_major) {\n    o << \"matrix(\" << mat_nrows(l) << \", \" << mat_ncols(l) << \")\" << endl;\n    for (size_type i = 0; i < mat_nrows(l); ++i) {\n      o << \"(\";\n      if (is_sparse(l)) { // not optimized ...\n\tfor (size_type j = 0; j < mat_ncols(l); ++j)\n\t  if (l(i,j) != typename linalg_traits<L>::value_type(0)) \n\t    o << \" (r\" << j << \", \" << l(i,j) << \")\";\n      }\n      else {\n\tif (mat_ncols(l) != 0) o << ' ' << l(i, 0);\n\tfor (size_type j = 1; j < mat_ncols(l); ++j) o << \", \" << l(i, j); \n      }\n      o << \" )\\n\";\n    }\n  }\n\n}\n\n#endif //  GMM_DEF_H__\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_dense_Householder.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2003-2012 Yves Renard, Caroline Lecalvez\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n/**@file gmm_dense_Householder.h\n   @author Caroline Lecalvez <Caroline.Lecalvez@gmm.insa-toulouse.fr>\n   @author Yves Renard <Yves.Renard@insa-lyon.fr>\n   @date June 5, 2003.\n   @brief Householder for dense matrices.\n*/\n\n#ifndef GMM_DENSE_HOUSEHOLDER_H\n#define GMM_DENSE_HOUSEHOLDER_H\n\n#include \"gmm_kernel.h\"\n\nnamespace gmm {\n  ///@cond DOXY_SHOW_ALL_FUNCTIONS\n\n  /* ********************************************************************* */\n  /*    Rank one update  (complex and real version)                        */\n  /* ********************************************************************* */\n\n  template <typename Matrix, typename VecX, typename VecY>\n  inline void rank_one_update(Matrix &A, const VecX& x,\n\t\t\t      const VecY& y, row_major) {\n    typedef typename linalg_traits<Matrix>::value_type T;\n    size_type N = mat_nrows(A);\n    GMM_ASSERT2(N <= vect_size(x) && mat_ncols(A) <= vect_size(y),\n\t       \"dimensions mismatch\");\n    typename linalg_traits<VecX>::const_iterator itx = vect_const_begin(x);\n    for (size_type i = 0; i < N; ++i, ++itx) {\n      typedef typename linalg_traits<Matrix>::sub_row_type row_type;\n      row_type row = mat_row(A, i);\n      typename linalg_traits<row_type>::iterator\n\tit = vect_begin(row), ite = vect_end(row);\n      typename linalg_traits<VecY>::const_iterator ity = vect_const_begin(y);\n      T tx = *itx;\n      for (; it != ite; ++it, ++ity) *it += conj_product(*ity, tx);\n    }\n  }\n\n  template <typename Matrix, typename VecX, typename VecY>\n  inline void rank_one_update(Matrix &A, const VecX& x,\n\t\t\t      const VecY& y, col_major) {\n    typedef typename linalg_traits<Matrix>::value_type T;\n    size_type M = mat_ncols(A);\n    GMM_ASSERT2(mat_nrows(A) <= vect_size(x) && M <= vect_size(y),\n\t\t\"dimensions mismatch\");\n    typename linalg_traits<VecY>::const_iterator ity = vect_const_begin(y);\n    for (size_type i = 0; i < M; ++i, ++ity) {\n      typedef typename linalg_traits<Matrix>::sub_col_type col_type;\n      col_type col = mat_col(A, i);\n      typename linalg_traits<col_type>::iterator\n\tit = vect_begin(col), ite = vect_end(col);\n      typename linalg_traits<VecX>::const_iterator itx = vect_const_begin(x);\n      T ty = *ity;\n      for (; it != ite; ++it, ++itx) *it += conj_product(ty, *itx);\n    }\n  }\n  \n  ///@endcond\n  template <typename Matrix, typename VecX, typename VecY>\n  inline void rank_one_update(const Matrix &AA, const VecX& x,\n\t\t\t      const VecY& y) {\n    Matrix& A = const_cast<Matrix&>(AA);\n    rank_one_update(A, x, y, typename principal_orientation_type<typename\n\t\t    linalg_traits<Matrix>::sub_orientation>::potype());\n  }\n  ///@cond DOXY_SHOW_ALL_FUNCTIONS\n\n  /* ********************************************************************* */\n  /*    Rank two update  (complex and real version)                        */\n  /* ********************************************************************* */\n\n  template <typename Matrix, typename VecX, typename VecY>\n  inline void rank_two_update(Matrix &A, const VecX& x,\n\t\t\t      const VecY& y, row_major) {\n    typedef typename linalg_traits<Matrix>::value_type value_type;\n    size_type N = mat_nrows(A);\n    GMM_ASSERT2(N <= vect_size(x) && mat_ncols(A) <= vect_size(y),\n\t\t\"dimensions mismatch\");\n    typename linalg_traits<VecX>::const_iterator itx1 = vect_const_begin(x);\n    typename linalg_traits<VecY>::const_iterator ity2 = vect_const_begin(y);\n    for (size_type i = 0; i < N; ++i, ++itx1, ++ity2) {\n      typedef typename linalg_traits<Matrix>::sub_row_type row_type;\n      row_type row = mat_row(A, i);\n      typename linalg_traits<row_type>::iterator\n\tit = vect_begin(row), ite = vect_end(row);\n      typename linalg_traits<VecX>::const_iterator itx2 = vect_const_begin(x);\n      typename linalg_traits<VecY>::const_iterator ity1 = vect_const_begin(y);\n      value_type tx = *itx1, ty = *ity2;\n      for (; it != ite; ++it, ++ity1, ++itx2)\n\t*it += conj_product(*ity1, tx) + conj_product(*itx2, ty);\n    }\n  }\n\n  template <typename Matrix, typename VecX, typename VecY>\n  inline void rank_two_update(Matrix &A, const VecX& x,\n\t\t\t      const VecY& y, col_major) {\n    typedef typename linalg_traits<Matrix>::value_type value_type;\n    size_type M = mat_ncols(A);\n    GMM_ASSERT2(mat_nrows(A) <= vect_size(x) && M <= vect_size(y),\n\t\t\"dimensions mismatch\");\n    typename linalg_traits<VecX>::const_iterator itx2 = vect_const_begin(x);\n    typename linalg_traits<VecY>::const_iterator ity1 = vect_const_begin(y);\n    for (size_type i = 0; i < M; ++i, ++ity1, ++itx2) {\n      typedef typename linalg_traits<Matrix>::sub_col_type col_type;\n      col_type col = mat_col(A, i);\n      typename linalg_traits<col_type>::iterator\n\tit = vect_begin(col), ite = vect_end(col);\n      typename linalg_traits<VecX>::const_iterator itx1 = vect_const_begin(x);\n      typename linalg_traits<VecY>::const_iterator ity2 = vect_const_begin(y);\n      value_type ty = *ity1, tx = *itx2;\n      for (; it != ite; ++it, ++itx1, ++ity2)\n\t*it += conj_product(ty, *itx1) + conj_product(tx, *ity2); \n    }\n  }\n  \n  ///@endcond\n  template <typename Matrix, typename VecX, typename VecY>\n  inline void rank_two_update(const Matrix &AA, const VecX& x,\n\t\t\t      const VecY& y) {\n    Matrix& A = const_cast<Matrix&>(AA);\n    rank_two_update(A, x, y, typename principal_orientation_type<typename\n\t\t    linalg_traits<Matrix>::sub_orientation>::potype());\n  }\n  ///@cond DOXY_SHOW_ALL_FUNCTIONS\n\n  /* ********************************************************************* */\n  /*    Householder vector computation (complex and real version)          */\n  /* ********************************************************************* */\n\n  template <typename VECT> void house_vector(const VECT &VV) {\n    VECT &V = const_cast<VECT &>(VV);\n    typedef typename linalg_traits<VECT>::value_type T;\n    typedef typename number_traits<T>::magnitude_type R;\n    \n    R mu = vect_norm2(V), abs_v0 = gmm::abs(V[0]);\n    if (mu != R(0))\n      gmm::scale(V, (abs_v0 == R(0)) ? T(R(1) / mu)\n\t\t : (safe_divide(T(abs_v0), V[0]) / (abs_v0 + mu)));\n    if (gmm::real(V[vect_size(V)-1]) * R(0) != R(0)) gmm::clear(V);\n    V[0] = T(1);\n  }\n\n  template <typename VECT> void house_vector_last(const VECT &VV) {\n    VECT &V = const_cast<VECT &>(VV);\n    typedef typename linalg_traits<VECT>::value_type T;\n    typedef typename number_traits<T>::magnitude_type R;\n\n    size_type m = vect_size(V);\n    R mu = vect_norm2(V), abs_v0 = gmm::abs(V[m-1]);\n    if (mu != R(0))\n      gmm::scale(V, (abs_v0 == R(0)) ? T(R(1) / mu)\n\t\t : ((abs_v0 / V[m-1]) / (abs_v0 + mu)));\n    if (gmm::real(V[0]) * R(0) != R(0)) gmm::clear(V);\n    V[m-1] = T(1);\n  }\n  \n  /* ********************************************************************* */\n  /*    Householder updates  (complex and real version)                    */\n  /* ********************************************************************* */\n\n  // multiply A to the left by the reflector stored in V. W is a temporary.\n  template <typename MAT, typename VECT1, typename VECT2> inline\n    void row_house_update(const MAT &AA, const VECT1 &V, const VECT2 &WW) {\n    VECT2 &W = const_cast<VECT2 &>(WW); MAT &A = const_cast<MAT &>(AA);\n    typedef typename linalg_traits<MAT>::value_type value_type;\n    typedef typename number_traits<value_type>::magnitude_type magnitude_type;\n\n    gmm::mult(conjugated(A),\n\t      scaled(V, value_type(magnitude_type(-2)/vect_norm2_sqr(V))), W);\n    rank_one_update(A, V, W);\n  }\n\n  // multiply A to the right by the reflector stored in V. W is a temporary.\n  template <typename MAT, typename VECT1, typename VECT2> inline\n    void col_house_update(const MAT &AA, const VECT1 &V, const VECT2 &WW) {\n    VECT2 &W = const_cast<VECT2 &>(WW); MAT &A = const_cast<MAT &>(AA);\n    typedef typename linalg_traits<MAT>::value_type value_type;\n    typedef typename number_traits<value_type>::magnitude_type magnitude_type;\n    \n    gmm::mult(A,\n\t      scaled(V, value_type(magnitude_type(-2)/vect_norm2_sqr(V))), W);\n    rank_one_update(A, W, V);\n  }\n\n  ///@endcond\n\n  /* ********************************************************************* */\n  /*    Hessemberg reduction with Householder.                             */\n  /* ********************************************************************* */\n\n  template <typename MAT1, typename MAT2>\n    void Hessenberg_reduction(const MAT1& AA, const MAT2 &QQ, bool compute_Q){\n    MAT1& A = const_cast<MAT1&>(AA); MAT2& Q = const_cast<MAT2&>(QQ);\n    typedef typename linalg_traits<MAT1>::value_type value_type;\n    if (compute_Q) gmm::copy(identity_matrix(), Q);\n    size_type n = mat_nrows(A); if (n < 2) return;\n    std::vector<value_type> v(n), w(n);\n    sub_interval SUBK(0,n);\n    for (size_type k = 1; k+1 < n; ++k) {\n      sub_interval SUBI(k, n-k), SUBJ(k-1,n-k+1);\n      v.resize(n-k);\n      for (size_type j = k; j < n; ++j) v[j-k] = A(j, k-1);\n      house_vector(v);\n      row_house_update(sub_matrix(A, SUBI, SUBJ), v, sub_vector(w, SUBJ));\n      col_house_update(sub_matrix(A, SUBK, SUBI), v, w);\n      // is it possible to \"unify\" the two on the common part of the matrix?\n      if (compute_Q) col_house_update(sub_matrix(Q, SUBK, SUBI), v, w);\n    }\n  }\n\n  /* ********************************************************************* */\n  /*    Householder tridiagonalization for symmetric matrices              */\n  /* ********************************************************************* */\n\n  template <typename MAT1, typename MAT2> \n  void Householder_tridiagonalization(const MAT1 &AA, const MAT2 &QQ,\n\t\t\t\t     bool compute_q) {\n    MAT1 &A = const_cast<MAT1 &>(AA); MAT2 &Q = const_cast<MAT2 &>(QQ);\n    typedef typename linalg_traits<MAT1>::value_type T;\n    typedef typename number_traits<T>::magnitude_type R;\n\n    size_type n = mat_nrows(A); if (n < 2) return;\n    std::vector<T> v(n), p(n), w(n), ww(n);\n    sub_interval SUBK(0,n);\n\n    for (size_type k = 1; k+1 < n; ++k) { // not optimized ...\n      sub_interval SUBI(k, n-k);\n      v.resize(n-k); p.resize(n-k); w.resize(n-k); \n      for (size_type l = k; l < n; ++l) \n\t{ v[l-k] = w[l-k] = A(l, k-1); A(l, k-1) = A(k-1, l) = T(0); }\n      house_vector(v);\n      R norm = vect_norm2_sqr(v);\n      A(k-1, k) = gmm::conj(A(k, k-1) = w[0] - T(2)*v[0]*vect_hp(w, v)/norm);\n\n      gmm::mult(sub_matrix(A, SUBI), gmm::scaled(v, T(-2) / norm), p);\n      gmm::add(p, gmm::scaled(v, -vect_hp(v, p) / norm), w);\n      rank_two_update(sub_matrix(A, SUBI), v, w);\n      // it should be possible to compute only the upper or lower part\n\n      if (compute_q) col_house_update(sub_matrix(Q, SUBK, SUBI), v, ww);\n    }\n  }\n\n  /* ********************************************************************* */\n  /*    Real and complex Givens rotations                                  */\n  /* ********************************************************************* */\n\n  template <typename T> void Givens_rotation(T a, T b, T &c, T &s) {\n    typedef typename number_traits<T>::magnitude_type R;\n    R aa = gmm::abs(a), bb = gmm::abs(b);\n    if (bb == R(0)) { c = T(1); s = T(0);   return; }\n    if (aa == R(0)) { c = T(0); s = b / bb; return; }\n    if (bb > aa)\n      { T t = -safe_divide(a,b); s = T(R(1) / (sqrt(R(1)+gmm::abs_sqr(t)))); c = s * t; }\n    else\n      { T t = -safe_divide(b,a); c = T(R(1) / (sqrt(R(1)+gmm::abs_sqr(t)))); s = c * t; }\n  }\n\n  // Apply Q* v\n  template <typename T> inline\n  void Apply_Givens_rotation_left(T &x, T &y, T c, T s)\n  { T t1=x, t2=y; x = gmm::conj(c)*t1 - gmm::conj(s)*t2; y = c*t2 + s*t1; }\n\n  // Apply v^T Q\n  template <typename T> inline\n  void Apply_Givens_rotation_right(T &x, T &y, T c, T s)\n  { T t1=x, t2=y; x = c*t1 - s*t2; y = gmm::conj(c)*t2 + gmm::conj(s)*t1; }\n\n  template <typename MAT, typename T>\n  void row_rot(const MAT &AA, T c, T s, size_type i, size_type k) {\n    MAT &A = const_cast<MAT &>(AA); // can be specialized for row matrices\n    for (size_type j = 0; j < mat_ncols(A); ++j)\n      Apply_Givens_rotation_left(A(i,j), A(k,j), c, s);\n  }\n\n  template <typename MAT, typename T>\n  void col_rot(const MAT &AA, T c, T s, size_type i, size_type k) {\n    MAT &A = const_cast<MAT &>(AA); // can be specialized for column matrices\n    for (size_type j = 0; j < mat_nrows(A); ++j)\n      Apply_Givens_rotation_right(A(j,i), A(j,k), c, s);\n  }\n  \n}\n\n#endif\n\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_dense_lu.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2003-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n// This file is a modified version of lu.h from MTL.\n// See http://osl.iu.edu/research/mtl/\n// Following the corresponding Copyright notice.\n//===========================================================================\n//\n// Copyright (c) 1998-2001, University of Notre Dame. All rights reserved.\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are met:\n//\n//    * Redistributions of source code must retain the above copyright\n//      notice, this list of conditions and the following disclaimer.\n//    * Redistributions in binary form must reproduce the above copyright\n//      notice, this list of conditions and the following disclaimer in the\n//      documentation and/or other materials provided with the distribution.\n//    * Neither the name of the University of Notre Dame nor the\n//      names of its contributors may be used to endorse or promote products\n//      derived from this software without specific prior written permission.\n//\n// THIS SOFTWARE  IS  PROVIDED  BY  THE TRUSTEES  OF  INDIANA UNIVERSITY  AND\n// CONTRIBUTORS  ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,  INCLUDING,\n// BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND  FITNESS\n// FOR  A PARTICULAR PURPOSE ARE DISCLAIMED. IN  NO  EVENT SHALL THE TRUSTEES\n// OF INDIANA UNIVERSITY AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY,  OR CONSEQUENTIAL DAMAGES (INCLUDING,  BUT\n// NOT  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA,  OR PROFITS;  OR BUSINESS  INTERRUPTION)  HOWEVER  CAUSED AND ON ANY\n// THEORY  OF  LIABILITY,  WHETHER  IN  CONTRACT,  STRICT  LIABILITY, OR TORT\n// (INCLUDING  NEGLIGENCE  OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n// THIS  SOFTWARE,  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n//===========================================================================\n\n/**@file gmm_dense_lu.h\n   @author  Andrew Lumsdaine, Jeremy G. Siek, Lie-Quan Lee, Y. Renard\n   @date June 5, 2003.\n   @brief LU factorizations and determinant computation for dense matrices.\n*/\n#ifndef GMM_DENSE_LU_H\n#define GMM_DENSE_LU_H\n\n#include \"gmm_dense_Householder.h\"\n#include \"gmm_opt.h\"\n\nnamespace gmm {\n\n\n  /** LU Factorization of a general (dense) matrix (real or complex).\n  \n  This is the outer product (a level-2 operation) form of the LU\n  Factorization with pivoting algorithm . This is equivalent to\n  LAPACK's dgetf2. Also see \"Matrix Computations\" 3rd Ed.  by Golub\n  and Van Loan section 3.2.5 and especially page 115.\n  \n  The pivot indices in ipvt are indexed starting from 1\n  so that this is compatible with LAPACK (Fortran).\n  */\n  template <typename DenseMatrix, typename Pvector>\n  size_type lu_factor(DenseMatrix& A, Pvector& ipvt) {\n    typedef typename linalg_traits<DenseMatrix>::value_type T;\n    typedef typename linalg_traits<Pvector>::value_type int_T;\n    typedef typename number_traits<T>::magnitude_type R;\n    size_type info(0), i, j, jp, M(mat_nrows(A)), N(mat_ncols(A));\n    size_type NN = std::min(M, N);\n    std::vector<T> c(M), r(N);\n    \n    GMM_ASSERT2(ipvt.size()+1 >= NN, \"IPVT too small\");\n    for (i = 0; i+1 < NN; ++i) ipvt[i] = int_T(i);\n      \n    if (M || N) {\n      for (j = 0; j+1 < NN; ++j) {\n\tR max = gmm::abs(A(j,j)); jp = j;\n\tfor (i = j+1; i < M; ++i)\t\t   /* find pivot.          */\n\t  if (gmm::abs(A(i,j)) > max) { jp = i; max = gmm::abs(A(i,j)); }\n\tipvt[j] = int_T(jp + 1);\n\t\n\tif (max == R(0)) { info = j + 1; break; }\n        if (jp != j) for (i = 0; i < N; ++i) std::swap(A(jp, i), A(j, i));\n\t\n        for (i = j+1; i < M; ++i) { A(i, j) /= A(j,j); c[i-j-1] = -A(i, j); }\n        for (i = j+1; i < N; ++i) r[i-j-1] = A(j, i);  // avoid the copy ?\n\trank_one_update(sub_matrix(A, sub_interval(j+1, M-j-1),\n\t\t\t\t sub_interval(j+1, N-j-1)), c, conjugated(r));\n      }\n      ipvt[j] = int_T(j + 1);\n    }\n    return info;\n  }\n  \n  /** LU Solve : Solve equation Ax=b, given an LU factored matrix.*/\n  //  Thanks to Valient Gough for this routine!\n  template <typename DenseMatrix, typename VectorB, typename VectorX,\n\t    typename Pvector>\n  void lu_solve(const DenseMatrix &LU, const Pvector& pvector, \n\t\tVectorX &x, const VectorB &b) {\n    typedef typename linalg_traits<DenseMatrix>::value_type T;\n    copy(b, x);\n    for(size_type i = 0; i < pvector.size(); ++i) {\n      size_type perm = pvector[i]-1;     // permutations stored in 1's offset\n      if(i != perm) { T aux = x[i]; x[i] = x[perm]; x[perm] = aux; }\n    }\n    /* solve  Ax = b  ->  LUx = b  ->  Ux = L^-1 b.                        */\n    lower_tri_solve(LU, x, true);\n    upper_tri_solve(LU, x, false);\n  }\n\n  template <typename DenseMatrix, typename VectorB, typename VectorX>\n  void lu_solve(const DenseMatrix &A, VectorX &x, const VectorB &b) {\n    typedef typename linalg_traits<DenseMatrix>::value_type T;\n    dense_matrix<T> B(mat_nrows(A), mat_ncols(A));\n    std::vector<int> ipvt(mat_nrows(A));\n    gmm::copy(A, B);\n    size_type info = lu_factor(B, ipvt);\n    GMM_ASSERT1(!info, \"Singular system, pivot = \" << info);\n    lu_solve(B, ipvt, x, b);\n  }\n  \n  template <typename DenseMatrix, typename VectorB, typename VectorX,\n\t    typename Pvector>\n  void lu_solve_transposed(const DenseMatrix &LU, const Pvector& pvector, \n\t\t\t   VectorX &x, const VectorB &b) {\n    typedef typename linalg_traits<DenseMatrix>::value_type T;\n    copy(b, x);\n    lower_tri_solve(transposed(LU), x, false);\n    upper_tri_solve(transposed(LU), x, true);\n    for(size_type i = pvector.size(); i > 0; --i) {\n      size_type perm = pvector[i-1]-1;    // permutations stored in 1's offset\n      if(i-1 != perm) { T aux = x[i-1]; x[i-1] = x[perm]; x[perm] = aux; }\n    }\n\n  }\n\n\n  ///@cond DOXY_SHOW_ALL_FUNCTIONS\n  template <typename DenseMatrixLU, typename DenseMatrix, typename Pvector>\n  void lu_inverse(const DenseMatrixLU& LU, const Pvector& pvector,\n\t\t  DenseMatrix& AInv, col_major) {\n    typedef typename linalg_traits<DenseMatrixLU>::value_type T;\n    std::vector<T> tmp(pvector.size(), T(0));\n    std::vector<T> result(pvector.size());\n    for(size_type i = 0; i < pvector.size(); ++i) {\n      tmp[i] = T(1);\n      lu_solve(LU, pvector, result, tmp);\n      copy(result, mat_col(AInv, i));\n      tmp[i] = T(0);\n    }\n  }\n\n  template <typename DenseMatrixLU, typename DenseMatrix, typename Pvector>\n  void lu_inverse(const DenseMatrixLU& LU, const Pvector& pvector,\n\t\t  DenseMatrix& AInv, row_major) {\n    typedef typename linalg_traits<DenseMatrixLU>::value_type T;\n    std::vector<T> tmp(pvector.size(), T(0));\n    std::vector<T> result(pvector.size());\n    for(size_type i = 0; i < pvector.size(); ++i) {\n      tmp[i] = T(1); // to be optimized !!\n      // on peut sur le premier tri solve reduire le systeme\n      // et peut etre faire un solve sur une serie de vecteurs au lieu\n      // de vecteur a vecteur (accumulation directe de l'inverse dans la\n      // matrice au fur et a mesure du calcul ... -> evite la copie finale\n      lu_solve_transposed(LU, pvector, result, tmp);\n      copy(result, mat_row(AInv, i));\n      tmp[i] = T(0);\n    }\n  }\n  ///@endcond  \n\n  /** Given an LU factored matrix, build the inverse of the matrix. */\n  template <typename DenseMatrixLU, typename DenseMatrix, typename Pvector>\n  void lu_inverse(const DenseMatrixLU& LU, const Pvector& pvector,\n\t\t  const DenseMatrix& AInv_) {\n    DenseMatrix& AInv = const_cast<DenseMatrix&>(AInv_);\n    lu_inverse(LU, pvector, AInv, typename principal_orientation_type<typename\n\t       linalg_traits<DenseMatrix>::sub_orientation>::potype());\n  }\n\n  /** Given a dense matrix, build the inverse of the matrix, and\n      return the determinant */\n  template <typename DenseMatrix>\n  typename linalg_traits<DenseMatrix>::value_type\n  lu_inverse(const DenseMatrix& A_) {\n    typedef typename linalg_traits<DenseMatrix>::value_type T;\n    DenseMatrix& A = const_cast<DenseMatrix&>(A_);\n    dense_matrix<T> B(mat_nrows(A), mat_ncols(A));\n    std::vector<int> ipvt(mat_nrows(A));\n    gmm::copy(A, B);\n    size_type info = lu_factor(B, ipvt);\n    GMM_ASSERT1(!info, \"Non invertible matrix, pivot = \" << info);\n    lu_inverse(B, ipvt, A);\n    return lu_det(B, ipvt);\n  }\n\n  /** Compute the matrix determinant (via a LU factorization) */\n  template <typename DenseMatrixLU, typename Pvector>\n  typename linalg_traits<DenseMatrixLU>::value_type\n  lu_det(const DenseMatrixLU& LU, const Pvector &pvector) {\n    typedef typename linalg_traits<DenseMatrixLU>::value_type T;\n    T det(1);\n    for (size_type j = 0; j < std::min(mat_nrows(LU), mat_ncols(LU)); ++j)\n      det *= LU(j,j);\n    for(size_type i = 0; i < pvector.size(); ++i)\n      if (i != size_type(pvector[i]-1)) { det = -det; }\n    return det;\n  }\n\n  template <typename DenseMatrix>\n  typename linalg_traits<DenseMatrix>::value_type\n  lu_det(const DenseMatrix& A) {\n    typedef typename linalg_traits<DenseMatrix>::value_type T;\n    dense_matrix<T> B(mat_nrows(A), mat_ncols(A));\n    std::vector<int> ipvt(mat_nrows(A));\n    gmm::copy(A, B);\n    lu_factor(B, ipvt);\n    return lu_det(B, ipvt);\n  }\n\n}\n\n#endif\n\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_dense_qr.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2003-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n/**@file gmm_dense_qr.h\n   @author  Caroline Lecalvez, Caroline.Lecalvez@gmm.insa-tlse.fr, Yves Renard <Yves.Renard@insa-lyon.fr>\n   @date September 12, 2003.\n   @brief Dense QR factorization.\n*/\n#ifndef GMM_DENSE_QR_H\n#define GMM_DENSE_QR_H\n\n#include \"gmm_dense_Householder.h\"\n\nnamespace gmm {\n\n\n  /**\n     QR factorization using Householder method (complex and real version).\n  */\n  template <typename MAT1>\n  void qr_factor(const MAT1 &A_) { \n    MAT1 &A = const_cast<MAT1 &>(A_);\n    typedef typename linalg_traits<MAT1>::value_type value_type;\n\n    size_type m = mat_nrows(A), n = mat_ncols(A);\n    GMM_ASSERT2(m >= n, \"dimensions mismatch\");\n\n    std::vector<value_type> W(m), V(m);\n\n    for (size_type j = 0; j < n; ++j) {\n      sub_interval SUBI(j, m-j), SUBJ(j, n-j);\n      V.resize(m-j); W.resize(n-j);\n\n      for (size_type i = j; i < m; ++i) V[i-j] = A(i, j);\n      house_vector(V);\n\n      row_house_update(sub_matrix(A, SUBI, SUBJ), V, W);\n      for (size_type i = j+1; i < m; ++i) A(i, j) = V[i-j];\n    }\n  }\n\n  \n  // QR comes from QR_factor(QR) where the upper triangular part stands for R\n  // and the lower part contains the Householder reflectors.\n  // A <- AQ\n  template <typename MAT1, typename MAT2>\n  void apply_house_right(const MAT1 &QR, const MAT2 &A_) { \n    MAT2 &A = const_cast<MAT2 &>(A_);\n    typedef typename linalg_traits<MAT1>::value_type T;\n    size_type m = mat_nrows(QR), n = mat_ncols(QR);\n    GMM_ASSERT2(m == mat_ncols(A), \"dimensions mismatch\");\n    if (m == 0) return;\n    std::vector<T> V(m), W(mat_nrows(A));\n    V[0] = T(1);\n    for (size_type j = 0; j < n; ++j) {\n      V.resize(m-j);\n      for (size_type i = j+1; i < m; ++i) V[i-j] = QR(i, j);\n      col_house_update(sub_matrix(A, sub_interval(0, mat_nrows(A)),\n\t\t\t\t  sub_interval(j, m-j)), V, W);\n    }\n  }\n\n  // QR comes from QR_factor(QR) where the upper triangular part stands for R\n  // and the lower part contains the Householder reflectors.\n  // A <- Q*A\n  template <typename MAT1, typename MAT2>\n  void apply_house_left(const MAT1 &QR, const MAT2 &A_) { \n    MAT2 &A = const_cast<MAT2 &>(A_);\n    typedef typename linalg_traits<MAT1>::value_type T;\n    size_type m = mat_nrows(QR), n = mat_ncols(QR);\n    GMM_ASSERT2(m == mat_nrows(A), \"dimensions mismatch\");\n    if (m == 0) return;\n    std::vector<T> V(m), W(mat_ncols(A));\n    V[0] = T(1);\n    for (size_type j = 0; j < n; ++j) {\n      V.resize(m-j);\n      for (size_type i = j+1; i < m; ++i) V[i-j] = QR(i, j);\n      row_house_update(sub_matrix(A, sub_interval(j, m-j),\n\t\t\t\t  sub_interval(0, mat_ncols(A))), V, W);\n    }\n  }  \n\n  /** Compute the QR factorization, where Q is assembled. */\n  template <typename MAT1, typename MAT2, typename MAT3>\n    void qr_factor(const MAT1 &A, const MAT2 &QQ, const MAT3 &RR) { \n    MAT2 &Q = const_cast<MAT2 &>(QQ); MAT3 &R = const_cast<MAT3 &>(RR); \n    typedef typename linalg_traits<MAT1>::value_type value_type;\n\n    size_type m = mat_nrows(A), n = mat_ncols(A);\n    GMM_ASSERT2(m >= n, \"dimensions mismatch\");\n    gmm::copy(A, Q);\n    \n    std::vector<value_type> W(m);\n    dense_matrix<value_type> VV(m, n);\n\n    for (size_type j = 0; j < n; ++j) {\n      sub_interval SUBI(j, m-j), SUBJ(j, n-j);\n\n      for (size_type i = j; i < m; ++i) VV(i,j) = Q(i, j);\n      house_vector(sub_vector(mat_col(VV,j), SUBI));\n\n      row_house_update(sub_matrix(Q, SUBI, SUBJ),\n\t\t       sub_vector(mat_col(VV,j), SUBI), sub_vector(W, SUBJ));\n    }\n\n    gmm::copy(sub_matrix(Q, sub_interval(0, n), sub_interval(0, n)), R);\n    gmm::copy(identity_matrix(), Q);\n    \n    for (size_type j = n-1; j != size_type(-1); --j) {\n      sub_interval SUBI(j, m-j), SUBJ(j, n-j);\n      row_house_update(sub_matrix(Q, SUBI, SUBJ), \n\t\t       sub_vector(mat_col(VV,j), SUBI), sub_vector(W, SUBJ));\n    }\n  }\n\n  ///@cond DOXY_SHOW_ALL_FUNCTIONS\n  template <typename TA, typename TV, typename Ttol, \n\t    typename MAT, typename VECT>\n  void extract_eig(const MAT &A, VECT &V, Ttol tol, TA, TV) {\n    size_type n = mat_nrows(A);\n    if (n == 0) return;\n    tol *= Ttol(2);\n    Ttol tol_i = tol * gmm::abs(A(0,0)), tol_cplx = tol_i;\n    for (size_type i = 0; i < n; ++i) {\n      if (i < n-1) {\n\ttol_i = (gmm::abs(A(i,i))+gmm::abs(A(i+1,i+1)))*tol;\n\ttol_cplx = std::max(tol_cplx, tol_i);\n      }\n      if ((i < n-1) && gmm::abs(A(i+1,i)) >= tol_i) {\n\tTA tr = A(i,i) + A(i+1, i+1);\n\tTA det = A(i,i)*A(i+1, i+1) - A(i,i+1)*A(i+1, i);\n\tTA delta = tr*tr - TA(4) * det;\n\tif (delta < -tol_cplx) {\n\t  GMM_WARNING1(\"A complex eigenvalue has been detected : \"\n\t\t      << std::complex<TA>(tr/TA(2), gmm::sqrt(-delta)/TA(2)));\n\t  V[i] = V[i+1] = tr / TA(2);\n\t}\n\telse {\n\t  delta = std::max(TA(0), delta);\n\t  V[i  ] = TA(tr + gmm::sqrt(delta))/ TA(2);\n\t  V[i+1] = TA(tr -  gmm::sqrt(delta))/ TA(2);\n\t}\n\t++i;\n      }\n      else\n\tV[i] = TV(A(i,i));\n    }\n  }\n\n  template <typename TA, typename TV, typename Ttol, \n\t    typename MAT, typename VECT>\n  void extract_eig(const MAT &A, VECT &V, Ttol tol, TA, std::complex<TV>) {\n    size_type n = mat_nrows(A);\n    tol *= Ttol(2);\n    for (size_type i = 0; i < n; ++i)\n      if ((i == n-1) ||\n\t  gmm::abs(A(i+1,i)) < (gmm::abs(A(i,i))+gmm::abs(A(i+1,i+1)))*tol)\n\tV[i] = std::complex<TV>(A(i,i));\n      else {\n\tTA tr = A(i,i) + A(i+1, i+1);\n\tTA det = A(i,i)*A(i+1, i+1) - A(i,i+1)*A(i+1, i);\n\tTA delta = tr*tr - TA(4) * det;\n\tif (delta < TA(0)) {\n\t  V[i] = std::complex<TV>(tr / TA(2), gmm::sqrt(-delta) / TA(2));\n\t  V[i+1] = std::complex<TV>(tr / TA(2), -gmm::sqrt(-delta)/ TA(2));\n\t}\n\telse {\n\t  V[i  ] = TA(tr + gmm::sqrt(delta)) / TA(2);\n\t  V[i+1] = TA(tr -  gmm::sqrt(delta)) / TA(2);\n\t}\n\t++i;\n      }\n  }\n\n  template <typename TA, typename TV, typename Ttol,\n\t    typename MAT, typename VECT>\n  void extract_eig(const MAT &A, VECT &V, Ttol tol, std::complex<TA>, TV) {\n    typedef std::complex<TA> T;\n    size_type n = mat_nrows(A);\n    if (n == 0) return;\n    tol *= Ttol(2);\n    Ttol tol_i = tol * gmm::abs(A(0,0)), tol_cplx = tol_i;\n    for (size_type i = 0; i < n; ++i) {\n      if (i < n-1) {\n\ttol_i = (gmm::abs(A(i,i))+gmm::abs(A(i+1,i+1)))*tol;\n\ttol_cplx = std::max(tol_cplx, tol_i);\n      }\n      if ((i == n-1) || gmm::abs(A(i+1,i)) < tol_i) {\n\tif (gmm::abs(std::imag(A(i,i))) > tol_cplx)\n\t  GMM_WARNING1(\"A complex eigenvalue has been detected : \"\n\t\t      << T(A(i,i)) << \" : \"  << gmm::abs(std::imag(A(i,i)))\n\t\t      / gmm::abs(std::real(A(i,i))) << \" : \" << tol_cplx);\n\tV[i] = std::real(A(i,i));\n      }\n      else {\n\tT tr = A(i,i) + A(i+1, i+1);\n\tT det = A(i,i)*A(i+1, i+1) - A(i,i+1)*A(i+1, i);\n\tT delta = tr*tr - TA(4) * det;\n\tT a1 = (tr + gmm::sqrt(delta)) / TA(2);\n\tT a2 = (tr - gmm::sqrt(delta)) / TA(2);\n\tif (gmm::abs(std::imag(a1)) > tol_cplx)\n\t  GMM_WARNING1(\"A complex eigenvalue has been detected : \" << a1);\n\tif (gmm::abs(std::imag(a2)) > tol_cplx)\n\t  GMM_WARNING1(\"A complex eigenvalue has been detected : \" << a2);\n\n\tV[i] = std::real(a1); V[i+1] = std::real(a2);\n\t++i;\n      }\n    }\n  }\n\n  template <typename TA, typename TV, typename Ttol,\n\t    typename MAT, typename VECT>\n  void extract_eig(const MAT &A, VECT &V, Ttol tol,\n\t\t   std::complex<TA>, std::complex<TV>) {\n    size_type n = mat_nrows(A);\n    tol *= Ttol(2);\n    for (size_type i = 0; i < n; ++i)\n      if ((i == n-1) ||\n\t  gmm::abs(A(i+1,i)) < (gmm::abs(A(i,i))+gmm::abs(A(i+1,i+1)))*tol)\n\tV[i] = std::complex<TV>(A(i,i));\n      else {\n\tstd::complex<TA> tr = A(i,i) + A(i+1, i+1);\n\tstd::complex<TA> det = A(i,i)*A(i+1, i+1) - A(i,i+1)*A(i+1, i);\n\tstd::complex<TA> delta = tr*tr - TA(4) * det;\n\tV[i] = (tr + gmm::sqrt(delta)) / TA(2);\n\tV[i+1] = (tr - gmm::sqrt(delta)) / TA(2);\n\t++i;\n      }\n  }\n\n  ///@endcond\n  /**\n     Compute eigenvalue vector.\n  */\n  template <typename MAT, typename Ttol, typename VECT> inline\n  void extract_eig(const MAT &A, const VECT &V, Ttol tol) {\n    extract_eig(A, const_cast<VECT&>(V), tol,\n\t\ttypename linalg_traits<MAT>::value_type(),\n\t\ttypename linalg_traits<VECT>::value_type());\n  }\n\n  /* ********************************************************************* */\n  /*    Stop criterion for QR algorithms                                   */\n  /* ********************************************************************* */\n\n  template <typename MAT, typename Ttol>\n  void qr_stop_criterion(MAT &A, size_type &p, size_type &q, Ttol tol) {\n    typedef typename linalg_traits<MAT>::value_type T;\n    typedef typename number_traits<T>::magnitude_type R;\n    R rmin = default_min(R()) * R(2);\n    size_type n = mat_nrows(A);\n    if (n <= 2) { q = n; p = 0; }\n    else {\n      for (size_type i = 1; i < n-q; ++i)\n\tif (gmm::abs(A(i,i-1)) < (gmm::abs(A(i,i))+ gmm::abs(A(i-1,i-1)))*tol\n\t    || gmm::abs(A(i,i-1)) < rmin)\n\t  A(i,i-1) = T(0);\n      \n      while ((q < n-1 && A(n-1-q, n-2-q) == T(0)) ||\n\t     (q < n-2 && A(n-2-q, n-3-q) == T(0))) ++q;\n      if (q >= n-2) q = n;\n      p = n-q; if (p) --p; if (p) --p;\n      while (p > 0 && A(p,p-1) != T(0)) --p;\n    }\n  }\n  \n  template <typename MAT, typename Ttol> inline\n  void symmetric_qr_stop_criterion(const MAT &AA, size_type &p, size_type &q,\n\t\t\t\tTtol tol) {\n    typedef typename linalg_traits<MAT>::value_type T;\n    typedef typename number_traits<T>::magnitude_type R;\n    R rmin = default_min(R()) * R(2);\n    MAT& A = const_cast<MAT&>(AA);\n    size_type n = mat_nrows(A);\n    if (n <= 1) { q = n; p = 0; }\n    else {\n      for (size_type i = 1; i < n-q; ++i)\n\tif (gmm::abs(A(i,i-1)) < (gmm::abs(A(i,i))+ gmm::abs(A(i-1,i-1)))*tol\n\t    || gmm::abs(A(i,i-1)) < rmin)\n\t  A(i,i-1) = T(0);\n      \n      while (q < n-1 && A(n-1-q, n-2-q) == T(0)) ++q;\n      if (q >= n-1) q = n;\n      p = n-q; if (p) --p; if (p) --p;\n      while (p > 0 && A(p,p-1) != T(0)) --p;\n    }\n  }\n\n  template <typename VECT1, typename VECT2, typename Ttol> inline\n  void symmetric_qr_stop_criterion(const VECT1 &diag, const VECT2 &sdiag_,\n\t\t\t\t   size_type &p, size_type &q, Ttol tol) {\n    typedef typename linalg_traits<VECT2>::value_type T;\n    typedef typename number_traits<T>::magnitude_type R;\n    R rmin = default_min(R()) * R(2);\n    VECT2 &sdiag = const_cast<VECT2 &>(sdiag_);\n    size_type n = vect_size(diag);\n    if (n <= 1) { q = n; p = 0; return; }\n    for (size_type i = 1; i < n-q; ++i)\n      if (gmm::abs(sdiag[i-1]) < (gmm::abs(diag[i])+ gmm::abs(diag[i-1]))*tol\n\t  || gmm::abs(sdiag[i-1]) < rmin)\n\tsdiag[i-1] = T(0);\n    while (q < n-1 && sdiag[n-2-q] == T(0)) ++q;\n    if (q >= n-1) q = n;\n    p = n-q; if (p) --p; if (p) --p;\n    while (p > 0 && sdiag[p-1] != T(0)) --p;\n  }\n\n  /* ********************************************************************* */\n  /*    2x2 blocks reduction for Schur vectors                             */\n  /* ********************************************************************* */\n\n  template <typename MATH, typename MATQ, typename Ttol>\n  void block2x2_reduction(MATH &H, MATQ &Q, Ttol tol) {\n    typedef typename linalg_traits<MATH>::value_type T;\n    typedef typename number_traits<T>::magnitude_type R;\n\n    size_type n = mat_nrows(H), nq = mat_nrows(Q);\n    sub_interval SUBQ(0, nq), SUBL(0, 2);\n    std::vector<T> v(2), w(std::max(n, nq)); v[0] = T(1);\n    if (n < 2) return;\n    tol *= Ttol(2);\n    Ttol tol_i = tol * gmm::abs(H(0,0)), tol_cplx = tol_i;\n    for (size_type i = 0; i < n-1; ++i) {\n      tol_i = (gmm::abs(H(i,i))+gmm::abs(H(i+1,i+1)))*tol;\n      tol_cplx = std::max(tol_cplx, tol_i);\n      \n      if (gmm::abs(H(i+1,i)) > tol_i) { // 2x2 block detected\n\tT tr = (H(i+1, i+1) - H(i,i)) / T(2);\n\tT delta = tr*tr + H(i,i+1)*H(i+1, i);\n\t\n\tif (is_complex(T()) || gmm::real(delta) >= R(0)) {\n\t  sub_interval SUBI(i, 2);\n\t  T theta = (tr - gmm::sqrt(delta)) / H(i+1,i);\n\t  R a = gmm::abs(theta);\n\t  v[1] = (a == R(0)) ? T(-1)\n\t    : gmm::conj(theta) * (R(1) - gmm::sqrt(a*a + R(1)) / a);\n\t  row_house_update(sub_matrix(H, SUBI), v, sub_vector(w, SUBL));\n\t  col_house_update(sub_matrix(H, SUBI), v, sub_vector(w, SUBL));\n\t  col_house_update(sub_matrix(Q, SUBQ, SUBI), v, sub_vector(w, SUBQ));\n\t}\n\t++i;\n      }\n    }\n  }\n\n  /* ********************************************************************* */\n  /*    Basic qr algorithm.                                                */\n  /* ********************************************************************* */\n\n  #define tol_type_for_qr typename number_traits<typename \\\n                          linalg_traits<MAT1>::value_type>::magnitude_type\n  #define default_tol_for_qr \\\n    (gmm::default_tol(tol_type_for_qr()) *  tol_type_for_qr(3))\n\n  // QR method for real or complex square matrices based on QR factorisation.\n  // eigval has to be a complex vector if A has complex eigeinvalues.\n  // Very slow method. Use implicit_qr_method instead.\n  template <typename MAT1, typename VECT, typename MAT2>\n    void rudimentary_qr_algorithm(const MAT1 &A, const VECT &eigval_,\n\t\t\t\t  const MAT2 &eigvect_,\n\t\t\t\t  tol_type_for_qr tol = default_tol_for_qr,\n\t\t\t\t  bool compvect = true) {\n    VECT &eigval = const_cast<VECT &>(eigval_);\n    MAT2 &eigvect = const_cast<MAT2 &>(eigvect_);\n\n    typedef typename linalg_traits<MAT1>::value_type value_type;\n\n    size_type n = mat_nrows(A), p, q = 0, ite = 0;\n    dense_matrix<value_type> Q(n, n), R(n,n), A1(n,n); \n    gmm::copy(A, A1);\n\n    Hessenberg_reduction(A1, eigvect, compvect);\n    qr_stop_criterion(A1, p, q, tol);\n\n    while (q < n) {\n      qr_factor(A1, Q, R);\n      gmm::mult(R, Q, A1);\n      if (compvect) { gmm::mult(eigvect, Q, R); gmm::copy(R, eigvect); }\n      \n      qr_stop_criterion(A1, p, q, tol);\n      ++ite;\n      GMM_ASSERT1(ite < n*1000, \"QR algorithm failed\");\n    }\n    if (compvect) block2x2_reduction(A1, Q, tol);\n    extract_eig(A1, eigval, tol); \n  }\n\n  template <typename MAT1, typename VECT>\n    void rudimentary_qr_algorithm(const MAT1 &a, VECT &eigval,\n\t\t\t\t  tol_type_for_qr tol = default_tol_for_qr) {\n    dense_matrix<typename linalg_traits<MAT1>::value_type> m(0,0);\n    rudimentary_qr_algorithm(a, eigval, m, tol, false); \n  }\n\n  /* ********************************************************************* */\n  /*    Francis QR step.                                                   */\n  /* ********************************************************************* */\n\n  template <typename MAT1, typename MAT2>\n    void Francis_qr_step(const MAT1& HH, const MAT2 &QQ, bool compute_Q) {\n    MAT1& H = const_cast<MAT1&>(HH); MAT2& Q = const_cast<MAT2&>(QQ);\n    typedef typename linalg_traits<MAT1>::value_type value_type;\n    size_type n = mat_nrows(H), nq = mat_nrows(Q); \n    \n    std::vector<value_type> v(3), w(std::max(n, nq));\n\n    value_type s = H(n-2, n-2) + H(n-1, n-1);\n    value_type t = H(n-2, n-2) * H(n-1, n-1) - H(n-2, n-1) * H(n-1, n-2);\n    value_type x = H(0, 0) * H(0, 0) + H(0,1) * H(1, 0) - s * H(0,0) + t;\n    value_type y = H(1, 0) * (H(0,0) + H(1,1) - s);\n    value_type z = H(1, 0) * H(2, 1);\n\n    sub_interval SUBQ(0, nq);\n\n    for (size_type k = 0; k < n - 2; ++k) {\n      v[0] = x; v[1] = y; v[2] = z;\n      house_vector(v);\n      size_type r = std::min(k+4, n), q = (k==0) ? 0 : k-1;\n      sub_interval SUBI(k, 3), SUBJ(0, r), SUBK(q, n-q);\n      \n      row_house_update(sub_matrix(H, SUBI, SUBK),  v, sub_vector(w, SUBK));\n      col_house_update(sub_matrix(H, SUBJ, SUBI),  v, sub_vector(w, SUBJ));\n      \n      if (compute_Q)\n       \tcol_house_update(sub_matrix(Q, SUBQ, SUBI),  v, sub_vector(w, SUBQ));\n\n      x = H(k+1, k); y = H(k+2, k);\n      if (k < n-3) z = H(k+3, k);\n    }\n    sub_interval SUBI(n-2,2), SUBJ(0, n), SUBK(n-3,3), SUBL(0, 3);\n    v.resize(2);\n    v[0] = x; v[1] = y;\n    house_vector(v);\n    row_house_update(sub_matrix(H, SUBI, SUBK), v, sub_vector(w, SUBL));\n    col_house_update(sub_matrix(H, SUBJ, SUBI), v, sub_vector(w, SUBJ));\n    if (compute_Q)\n      col_house_update(sub_matrix(Q, SUBQ, SUBI), v, sub_vector(w, SUBQ));\n  }\n\n  /* ********************************************************************* */\n  /*    Wilkinson Double shift QR step (from Lapack).                      */\n  /* ********************************************************************* */\n\n  template <typename MAT1, typename MAT2, typename Ttol>\n  void Wilkinson_double_shift_qr_step(const MAT1& HH, const MAT2 &QQ,\n\t\t\t\t      Ttol tol, bool exc, bool compute_Q) {\n    MAT1& H = const_cast<MAT1&>(HH); MAT2& Q = const_cast<MAT2&>(QQ);\n    typedef typename linalg_traits<MAT1>::value_type T;\n    typedef typename number_traits<T>::magnitude_type R;\n\n    size_type n = mat_nrows(H), nq = mat_nrows(Q), m;\n    std::vector<T> v(3), w(std::max(n, nq));\n    const R dat1(0.75), dat2(-0.4375);\n    T h33, h44, h43h34, v1(0), v2(0), v3(0);\n    \n    if (exc) {                    /* Exceptional shift.                    */\n      R s = gmm::abs(H(n-1, n-2)) + gmm::abs(H(n-2, n-3));\n      h33 = h44 = dat1 * s;\n      h43h34 = dat2*s*s;\n    }\n    else {                        /* Wilkinson double shift.               */\n      h44 = H(n-1,n-1); h33 = H(n-2, n-2);\n      h43h34 = H(n-1, n-2) * H(n-2, n-1);\n    }\n\n    /* Look for two consecutive small subdiagonal elements.                */\n    /* Determine the effect of starting the double-shift QR iteration at   */\n    /* row m, and see if this would make H(m-1, m-2) negligible.           */\n    for (m = n-2; m != 0; --m) {\n      T h11  = H(m-1, m-1), h22  = H(m, m);\n      T h21  = H(m, m-1),   h12  = H(m-1, m);\n      T h44s = h44 - h11,   h33s = h33 - h11;\n      v1 = (h33s*h44s-h43h34) / h21 + h12;\n      v2 = h22 - h11 - h33s - h44s;\n      v3 = H(m+1, m);\n      R s = gmm::abs(v1) + gmm::abs(v2) + gmm::abs(v3);\n      v1 /= s; v2 /= s; v3 /= s;\n      if (m == 1) break;\n      T h00 = H(m-2, m-2);\n      T h10 = H(m-1, m-2);\n      R tst1 = gmm::abs(v1)*(gmm::abs(h00)+gmm::abs(h11)+gmm::abs(h22));\n      if (gmm::abs(h10)*(gmm::abs(v2)+gmm::abs(v3)) <= tol * tst1) break;\n    }\n\n    /* Double shift QR step.                                               */\n    sub_interval SUBQ(0, nq);\n    for (size_type k = (m == 0) ? 0 : m-1; k < n-2; ++k) {\n      v[0] = v1; v[1] = v2; v[2] = v3;\n      house_vector(v);\n      size_type r = std::min(k+4, n), q = (k==0) ? 0 : k-1;\n      sub_interval SUBI(k, 3), SUBJ(0, r), SUBK(q, n-q);\n      \n      row_house_update(sub_matrix(H, SUBI, SUBK),  v, sub_vector(w, SUBK));\n      col_house_update(sub_matrix(H, SUBJ, SUBI),  v, sub_vector(w, SUBJ));\n      if (k > m-1) { H(k+1, k-1) = T(0); if (k < n-3) H(k+2, k-1) = T(0); }\n      \n      if (compute_Q)\n       \tcol_house_update(sub_matrix(Q, SUBQ, SUBI),  v, sub_vector(w, SUBQ));\n\n      v1 = H(k+1, k); v2 = H(k+2, k);\n      if (k < n-3) v3 = H(k+3, k);\n    }\n    sub_interval SUBI(n-2,2), SUBJ(0, n), SUBK(n-3,3), SUBL(0, 3);\n    v.resize(2); v[0] = v1; v[1] = v2;\n    house_vector(v);\n    row_house_update(sub_matrix(H, SUBI, SUBK), v, sub_vector(w, SUBL));\n    col_house_update(sub_matrix(H, SUBJ, SUBI), v, sub_vector(w, SUBJ));\n    if (compute_Q)\n      col_house_update(sub_matrix(Q, SUBQ, SUBI), v, sub_vector(w, SUBQ));\n  }\n\n  /* ********************************************************************* */\n  /*    Implicit QR algorithm.                                             */\n  /* ********************************************************************* */\n\n  // QR method for real or complex square matrices based on an\n  // implicit QR factorisation. eigval has to be a complex vector\n  // if A has complex eigeinvalues. complexity about 10n^3, 25n^3 if\n  // eigenvectors are computed\n  template <typename MAT1, typename VECT, typename MAT2>\n    void implicit_qr_algorithm(const MAT1 &A, const VECT &eigval_,\n\t\t\t       const MAT2 &Q_, \n\t\t\t       tol_type_for_qr tol = default_tol_for_qr,\n\t\t\t       bool compvect = true) {\n    VECT &eigval = const_cast<VECT &>(eigval_);\n    MAT2 &Q = const_cast<MAT2 &>(Q_);\n    typedef typename linalg_traits<MAT1>::value_type value_type;\n\n    size_type n(mat_nrows(A)), q(0), q_old, p(0), ite(0), its(0);\n    dense_matrix<value_type> H(n,n);\n    sub_interval SUBK(0,0);\n\n    gmm::copy(A, H);\n    Hessenberg_reduction(H, Q, compvect);\n    qr_stop_criterion(H, p, q, tol);\n    \n    while (q < n) {\n      sub_interval SUBI(p, n-p-q), SUBJ(0, mat_ncols(Q));\n      if (compvect) SUBK = SUBI;\n//       Francis_qr_step(sub_matrix(H, SUBI),\n// \t\t      sub_matrix(Q, SUBJ, SUBK), compvect);\n      Wilkinson_double_shift_qr_step(sub_matrix(H, SUBI), \n\t\t\t\t     sub_matrix(Q, SUBJ, SUBK),\n\t\t\t\t     tol, (its == 10 || its == 20), compvect);\n      q_old = q;\n      qr_stop_criterion(H, p, q, tol*2);\n      if (q != q_old) its = 0;\n      ++its; ++ite;\n      GMM_ASSERT1(ite < n*100, \"QR algorithm failed\");\n    }\n    if (compvect) block2x2_reduction(H, Q, tol);\n    extract_eig(H, eigval, tol);\n  }\n\n\n  template <typename MAT1, typename VECT>\n    void implicit_qr_algorithm(const MAT1 &a, VECT &eigval,\n\t\t\t       tol_type_for_qr tol = default_tol_for_qr) {\n    dense_matrix<typename linalg_traits<MAT1>::value_type> m(1,1);\n    implicit_qr_algorithm(a, eigval, m, tol, false); \n  }\n\n  /* ********************************************************************* */\n  /*    Implicit symmetric QR step with Wilkinson Shift.                   */\n  /* ********************************************************************* */\n\n  template <typename MAT1, typename MAT2> \n    void symmetric_Wilkinson_qr_step(const MAT1& MM, const MAT2 &ZZ,\n\t\t\t\t     bool compute_z) {\n    MAT1& M = const_cast<MAT1&>(MM); MAT2& Z = const_cast<MAT2&>(ZZ);\n    typedef typename linalg_traits<MAT1>::value_type T;\n    typedef typename number_traits<T>::magnitude_type R;\n    size_type n = mat_nrows(M);\n\n    for (size_type i = 0; i < n; ++i) {\n      M(i, i) = T(gmm::real(M(i, i)));\n      if (i > 0) {\n\tT a = (M(i, i-1) + gmm::conj(M(i-1, i)))/R(2);\n\tM(i, i-1) = a; M(i-1, i) = gmm::conj(a);\n      }\n    }\n\n    R d = gmm::real(M(n-2, n-2) - M(n-1, n-1)) / R(2);\n    R e = gmm::abs_sqr(M(n-1, n-2));\n    R nu = d + gmm::sgn(d)*gmm::sqrt(d*d+e);\n    if (nu == R(0)) { M(n-1, n-2) = T(0); return; }\n    R mu = gmm::real(M(n-1, n-1)) - e / nu;\n    T x = M(0,0) - T(mu), z = M(1, 0), c, s;\n\n    for (size_type k = 1; k < n; ++k) {\n      Givens_rotation(x, z, c, s);\n\n      if (k > 1) Apply_Givens_rotation_left(M(k-1,k-2), M(k,k-2), c, s);\n      Apply_Givens_rotation_left(M(k-1,k-1), M(k,k-1), c, s);\n      Apply_Givens_rotation_left(M(k-1,k  ), M(k,k  ), c, s);\n      if (k < n-1) Apply_Givens_rotation_left(M(k-1,k+1), M(k,k+1), c, s);\n      if (k > 1) Apply_Givens_rotation_right(M(k-2,k-1), M(k-2,k), c, s);\n      Apply_Givens_rotation_right(M(k-1,k-1), M(k-1,k), c, s);\n      Apply_Givens_rotation_right(M(k  ,k-1), M(k,k)  , c, s);\n      if (k < n-1) Apply_Givens_rotation_right(M(k+1,k-1), M(k+1,k), c, s);\n\n      if (compute_z) col_rot(Z, c, s, k-1, k);\n      if (k < n-1) { x = M(k, k-1); z = M(k+1, k-1); }\n    }\n\n  }\n\n  template <typename VECT1, typename VECT2, typename MAT> \n  void symmetric_Wilkinson_qr_step(const VECT1& diag_, const VECT2& sdiag_,\n\t\t\t\t   const MAT &ZZ, bool compute_z) {\n    VECT1& diag = const_cast<VECT1&>(diag_);\n    VECT2& sdiag = const_cast<VECT2&>(sdiag_);\n    MAT& Z = const_cast<MAT&>(ZZ);\n    typedef typename linalg_traits<VECT2>::value_type T;\n    typedef typename number_traits<T>::magnitude_type R;\n\n    size_type n = vect_size(diag);\n    R d = (diag[n-2] - diag[n-1]) / R(2);\n    R e = gmm::abs_sqr(sdiag[n-2]);\n    R nu = d + gmm::sgn(d)*gmm::sqrt(d*d+e);\n    if (nu == R(0)) { sdiag[n-2] = T(0); return; }\n    R mu = diag[n-1] - e / nu;\n    T x = diag[0] - T(mu), z = sdiag[0], c, s;\n\n    T a01(0), a02(0);\n    T a10(0), a11(diag[0]), a12(gmm::conj(sdiag[0])), a13(0);\n    T a20(0), a21(sdiag[0]), a22(diag[1]), a23(gmm::conj(sdiag[1]));\n    T a31(0), a32(sdiag[1]);\n\n    for (size_type k = 1; k < n; ++k) {\n      Givens_rotation(x, z, c, s);\n\n      if (k > 1) Apply_Givens_rotation_left(a10, a20, c, s);\n      Apply_Givens_rotation_left(a11, a21, c, s);\n      Apply_Givens_rotation_left(a12, a22, c, s);\n      if (k < n-1) Apply_Givens_rotation_left(a13, a23, c, s);\n\n      if (k > 1) Apply_Givens_rotation_right(a01, a02, c, s);\n      Apply_Givens_rotation_right(a11, a12, c, s);\n      Apply_Givens_rotation_right(a21, a22, c, s);\n      if (k < n-1) Apply_Givens_rotation_right(a31, a32, c, s);\n\n      if (compute_z) col_rot(Z, c, s, k-1, k);\n\n      diag[k-1] = gmm::real(a11);\n      diag[k] = gmm::real(a22);\n      if (k > 1) sdiag[k-2] = (gmm::conj(a01) + a10) / R(2);\n      sdiag[k-1] = (gmm::conj(a12) + a21) / R(2);\n\n      x = sdiag[k-1]; z = (gmm::conj(a13) + a31) / R(2);\n\n      a01 = a12; a02 = a13;\n      a10 = a21; a11 = a22; a12 = a23; a13 = T(0);\n      a20 = a31; a21 = a32; a31 = T(0);\n\n      if (k < n-1) {\n\tsdiag[k] = (gmm::conj(a23) + a32) / R(2);\n\ta22 = T(diag[k+1]); a32 = sdiag[k+1]; a23 = gmm::conj(a32);\n      }\n    }\n  }\n\n  /* ********************************************************************* */\n  /*    Implicit QR algorithm for symmetric or hermitian matrices.         */\n  /* ********************************************************************* */\n\n  // implicit QR method for real square symmetric matrices or complex\n  // hermitian matrices.\n  // eigval has to be a complex vector if A has complex eigeinvalues.\n  // complexity about 4n^3/3, 9n^3 if eigenvectors are computed\n  template <typename MAT1, typename VECT, typename MAT2>\n  void symmetric_qr_algorithm_old(const MAT1 &A, const VECT &eigval_,\n\t\t\t      const MAT2 &eigvect_,\n\t\t\t      tol_type_for_qr tol = default_tol_for_qr,\n\t\t\t      bool compvect = true) {\n    VECT &eigval = const_cast<VECT &>(eigval_);\n    MAT2 &eigvect = const_cast<MAT2 &>(eigvect_);\n    typedef typename linalg_traits<MAT1>::value_type T;\n    typedef typename number_traits<T>::magnitude_type R;\n\n    if (compvect) gmm::copy(identity_matrix(), eigvect);\n    size_type n = mat_nrows(A), q = 0, p, ite = 0;\n    dense_matrix<T> Tri(n, n);\n    gmm::copy(A, Tri);\n\n    Householder_tridiagonalization(Tri, eigvect, compvect);\n    \n    symmetric_qr_stop_criterion(Tri, p, q, tol);\n    \n    while (q < n) {\n\n      sub_interval SUBI(p, n-p-q), SUBJ(0, mat_ncols(eigvect)), SUBK(p, n-p-q);\n      if (!compvect) SUBK = sub_interval(0,0);\n      symmetric_Wilkinson_qr_step(sub_matrix(Tri, SUBI), \n\t\t\t\t  sub_matrix(eigvect, SUBJ, SUBK), compvect);\n      \n      symmetric_qr_stop_criterion(Tri, p, q, tol*R(2));\n      ++ite;\n      GMM_ASSERT1(ite < n*100, \"QR algorithm failed. Probably, your matrix\"\n\t\t  \" is not real symmetric or complex hermitian\");\n    }\n    \n    extract_eig(Tri, eigval, tol);\n  }\n\n  template <typename MAT1, typename VECT, typename MAT2>\n  void symmetric_qr_algorithm(const MAT1 &A, const VECT &eigval_,\n\t\t\t      const MAT2 &eigvect_,\n\t\t\t      tol_type_for_qr tol = default_tol_for_qr,\n\t\t\t      bool compvect = true) {\n    VECT &eigval = const_cast<VECT &>(eigval_);\n    MAT2 &eigvect = const_cast<MAT2 &>(eigvect_);\n    typedef typename linalg_traits<MAT1>::value_type T;\n    typedef typename number_traits<T>::magnitude_type R;\n\n    size_type n = mat_nrows(A), q = 0, p, ite = 0;\n    if (compvect) gmm::copy(identity_matrix(), eigvect);\n    if (n == 0) return;\n    if (n == 1) { eigval[0]=gmm::real(A(0,0)); return; }\n    dense_matrix<T> Tri(n, n);\n    gmm::copy(A, Tri);\n\n    Householder_tridiagonalization(Tri, eigvect, compvect);\n\n    std::vector<R> diag(n);\n    std::vector<T> sdiag(n);\n    for (size_type i = 0; i < n; ++i)\n      { diag[i] = gmm::real(Tri(i, i)); if (i+1 < n) sdiag[i] = Tri(i+1, i); }\n    \n    symmetric_qr_stop_criterion(diag, sdiag, p, q, tol);\n    \n    while (q < n) {\n      sub_interval SUBI(p, n-p-q), SUBJ(0, mat_ncols(eigvect)), SUBK(p, n-p-q);\n      if (!compvect) SUBK = sub_interval(0,0);\n      \n      symmetric_Wilkinson_qr_step(sub_vector(diag, SUBI),\n\t\t\t\t  sub_vector(sdiag, SUBI),\n\t\t\t\t  sub_matrix(eigvect, SUBJ, SUBK), compvect);\n\n      symmetric_qr_stop_criterion(diag, sdiag, p, q, tol*R(3));\n      ++ite;\n      GMM_ASSERT1(ite < n*100, \"QR algorithm failed.\");\n    }\n    \n    gmm::copy(diag, eigval);\n  }\n\n\n  template <typename MAT1, typename VECT>\n    void symmetric_qr_algorithm(const MAT1 &a, VECT &eigval,\n\t\t\t\ttol_type_for_qr tol = default_tol_for_qr) {\n    dense_matrix<typename linalg_traits<MAT1>::value_type> m(0,0);\n    symmetric_qr_algorithm(a, eigval, m, tol, false);\n  }\n\n\n}\n\n#endif\n\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_dense_sylvester.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2003-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n/** @file gmm_dense_sylvester.h\n    @author  Yves Renard <Yves.Renard@insa-lyon.fr>\n    @date June 5, 2003.\n    @brief Sylvester equation solver.\n*/\n#ifndef GMM_DENSE_SYLVESTER_H\n#define GMM_DENSE_SYLVESTER_H\n\n#include \"gmm_kernel.h\"\n\nnamespace gmm {\n\n  /* ********************************************************************* */\n  /*   Kronecker system matrix.                                            */\n  /* ********************************************************************* */\n  template <typename MAT1, typename MAT2, typename MAT3>\n  void kron(const MAT1 &m1, const MAT2 &m2, const MAT3 &m3_,\n\t    bool init = true) {\n    MAT3 &m3 = const_cast<MAT3 &>(m3_);\n    size_type m = mat_nrows(m1), n = mat_ncols(m1);\n    size_type l = mat_nrows(m2), k = mat_ncols(m2);\n\n    GMM_ASSERT2(mat_nrows(m3) == m*l && mat_ncols(m3) == n*k,\n\t\t\"dimensions mismatch\");\n\n    for (size_type i = 0; i < m; ++i)\n      for (size_type j = 0; j < m; ++j)\n\tif (init)\n\t  gmm::copy(gmm::scaled(m2, m1(i,j)),\n\t\t    gmm::sub_matrix(m3, sub_interval(l*i, l),\n\t\t\t\t    sub_interval(k*j, k)));\n\telse\n\t  gmm::add(gmm::scaled(m2, m1(i,j)),\n\t\t    gmm::sub_matrix(m3, sub_interval(l*i, l),\n\t\t\t\t    sub_interval(k*j, k)));\n  }\n\t\n\n  /* ********************************************************************* */\n  /*   Copy a matrix into a vector.                                        */\n  /* ********************************************************************* */\n\n  template <typename MAT, typename VECT>\n  colmatrix_to_vector(const MAT &A, VECT &v, col_major) {\n    size_type m = mat_nrows(A), n = mat_ncols(A);\n    GMM_ASSERT2(m*n == vect_size(v), \"dimensions mismatch\");\n    for (size_type i = 0; i < n; ++i)\n      gmm::copy(mat_col(A, i), sub_vector(v, sub_interval(i*m, m)));\n  }\n\n  template <typename MAT, typename VECT>\n  colmatrix_to_vector(const MAT &A, VECT &v, row_and_col)\n  { colmatrix_to_vector(A, v, col_major()); }\n\n  template <typename MAT, typename VECT>\n  colmatrix_to_vector(const MAT &A, VECT &v, col_and_row)\n  { colmatrix_to_vector(A, v, col_major()); }\n\n  template <typename MAT, typename VECT>\n  colmatrix_to_vector(const MAT &A, VECT &v, row_major) {\n    size_type m = mat_nrows(mat), n = mat_ncols(A);\n    GMM_ASSERT2(m*n == vect_size(v), \"dimensions mismatch\");\n    for (size_type i = 0; i < m; ++i)\n      gmm::copy(mat_row(A, i), sub_vector(v, sub_slice(i, n, m)));\n  }\n\n  template <typename MAT, typename VECT> inline\n  colmatrix_to_vector(const MAT &A, const VECT &v_) {\n    VECT &v = const_cast<VECT &>(v_);\n    colmatrix_to_vector(A, v, typename linalg_traits<MAT>::sub_orientation());\n  }\n\n\n  /* ********************************************************************* */\n  /*   Copy a vector into a matrix.                                        */\n  /* ********************************************************************* */\n\n  template <typename MAT, typename VECT>\n  vector_to_colmatrix(const VECT &v, MAT &A, col_major) {\n    size_type m = mat_nrows(A), n = mat_ncols(A);\n    GMM_ASSERT2(m*n == vect_size(v), \"dimensions mismatch\");\n    for (size_type i = 0; i < n; ++i)\n      gmm::copy(sub_vector(v, sub_interval(i*m, m)), mat_col(A, i));\n  }\n\n  template <typename MAT, typename VECT>\n  vector_to_colmatrix(const VECT &v, MAT &A, row_and_col)\n  { vector_to_colmatrix(v, A, col_major()); }\n\n  template <typename MAT, typename VECT>\n  vector_to_colmatrix(const VECT &v, MAT &A, col_and_row)\n  { vector_to_colmatrix(v, A, col_major()); }\n\n  template <typename MAT, typename VECT>\n  vector_to_colmatrix(const VECT &v, MAT &A, row_major) {\n    size_type m = mat_nrows(mat), n = mat_ncols(A);\n    GMM_ASSERT2(m*n == vect_size(v), \"dimensions mismatch\");\n    for (size_type i = 0; i < m; ++i)\n      gmm::copy(sub_vector(v, sub_slice(i, n, m)), mat_row(A, i));\n  }\n\n  template <typename MAT, typename VECT> inline\n  vector_to_colmatrix(const VECT &v, const MAT &A_) {\n    MAT &A = const_cast<MAT &>(A_);\n    vector_to_colmatrix(v, A, typename linalg_traits<MAT>::sub_orientation());\n  }\n\n  /* ********************************************************************* */\n  /*   Solve sylvester equation.                                           */\n  /* ********************************************************************* */\n\n  // very prohibitive solver, to be replaced ... \n  template <typename MAT1, typename MAT2, typename MAT3, typename MAT4 >\n  void sylvester(const MAT1 &m1, const MAT2 &m2, const MAT3 &m3,\n\t\t const MAT4 &m4_) {\n    typedef typename linalg_traits<Mat>::value_type T;\n    \n    MAT3 &m4 = const_cast<MAT4 &>(m4_);\n    size_type m = mat_nrows(m1), n = mat_ncols(m1);\n    size_type l = mat_nrows(m2), k = mat_ncols(m2);\n    \n    GMM_ASSERT2(m == n && l == k && m == mat_nrows(m3) &&\n\t\tl == mat_ncols(m3) && m == mat_nrows(m4) && l == mat_ncols(m4),\n\t\t\"dimensions mismatch\");\n\n    gmm::dense_matrix<T> akronb(m*l, m*l);\n    gmm::dense_matrix<T> idm(m, m), idl(l,l);\n    gmm::copy(identity_matrix(), idm);\n    gmm::copy(identity_matrix(), idl);\n    std::vector<T> x(m*l), c(m*l);\n    \n    kron(idl, m1, akronb);\n    kron(gmm::transposed(m2), idm, akronb, false);\n\n    colmatrix_to_vector(m3, c);\n    lu_solve(akronb, c, x);\n    vector_to_colmatrix(x, m4);\n\n  }\n}\n\n#endif\n\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_domain_decomp.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2004-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n/** @file gmm_domain_decomp.h\n   @author  Yves Renard <Yves.Renard@insa-lyon.fr>\n   @date May 21, 2004.\n    @brief Domain decomposition.\n*/\n#ifndef GMM_DOMAIN_DECOMP_H__\n#define GMM_DOMAIN_DECOMP_H__\n\n#include \"gmm_kernel.h\"\n#include <map>\n\n\nnamespace gmm {\n\n  /** This function separates into small boxes of size msize with a ratio\n   * of overlap (in [0,1[) a set of points. The result is given into a\n   * vector of sparse matrices vB.\n   */\n  template <typename Matrix, typename Point>\n  void rudimentary_regular_decomposition(std::vector<Point> pts,\n\t\t\t\t\t double msize,\n\t\t\t\t\t double overlap,\n\t\t\t\t\t std::vector<Matrix> &vB) {\n    typedef typename linalg_traits<Matrix>::value_type value_type;\n    typedef abstract_null_type void_type;\n    typedef std::map<size_type, void_type> map_type;\n\n    size_type nbpts = pts.size();\n    if (!nbpts || pts[0].size() == 0) { vB.resize(0); return; }\n    int dim = int(pts[0].size());\n\n    // computation of the global box and the number of sub-domains\n    Point pmin = pts[0], pmax = pts[0];\n    for (size_type i = 1; i < nbpts; ++i)\n      for (int k = 0; k < dim; ++k) {\n\tpmin[k] = std::min(pmin[k], pts[i][k]);\n\tpmax[k] = std::max(pmax[k], pts[i][k]);\n      }\n    \n    std::vector<size_type> nbsub(dim), mult(dim);\n    std::vector<int> pts1(dim), pts2(dim);\n    size_type nbtotsub = 1;\n    for (int k = 0; k < dim; ++k) {\n      nbsub[k] = size_type((pmax[k] - pmin[k]) / msize)+1;\n      mult[k] = nbtotsub; nbtotsub *= nbsub[k];\n    }\n    \n    std::vector<map_type> subs(nbtotsub);\n    // points ventilation\n    std::vector<size_type> ns(dim), na(dim), nu(dim);\n    for (size_type i = 0; i < nbpts; ++i) {\n      for (int k = 0; k < dim; ++k) {\n\tregister double a = (pts[i][k] - pmin[k]) / msize;\n\tns[k] = size_type(a) - 1; na[k] = 0;\n\tpts1[k] = int(a + overlap); pts2[k] = int(ceil(a-1.0-overlap));\n      }\n      size_type sum = 0;\n      do {\n\tbool ok = 1;\n\tfor (int k = 0; k < dim; ++k)\n\t  if ((ns[k] >= nbsub[k]) || (pts1[k] < int(ns[k]))\n\t      || (pts2[k] > int(ns[k]))) { ok = false; break; }\n\tif (ok) {\n\t  size_type ind = ns[0];\n\t  for (int k=1; k < dim; ++k) ind += ns[k]*mult[k];\n\t  subs[ind][i] = void_type();\n\t}\n\tfor (int k = 0; k < dim; ++k) {\n\t  if (na[k] < 2) { na[k]++; ns[k]++; ++sum; break; }\n\t  na[k] = 0; ns[k] -= 2; sum -= 2;\n\t}\n      } while (sum);\n    }\n    // delete too small domains.\n    size_type nbmaxinsub = 0;\n    for (size_type i = 0; i < nbtotsub; ++i)\n      nbmaxinsub = std::max(nbmaxinsub, subs[i].size());\n    \n    std::fill(ns.begin(), ns.end(), size_type(0));\n    for (size_type i = 0; i < nbtotsub; ++i) {\n      if (subs[i].size() > 0 && subs[i].size() < nbmaxinsub / 10) {\n\t\n\tfor (int k = 0; k < dim; ++k) nu[k] = ns[k];\n\tsize_type nbmax = 0, imax = 0;\n\t\n\tfor (int l = 0; l < dim; ++l) {\n\t  nu[l]--;\n\t  for (int m = 0; m < 2; ++m, nu[l]+=2) {\n\t    bool ok = true;\n\t    for (int k = 0; k < dim && ok; ++k) \n\t      if (nu[k] >= nbsub[k]) ok = false;\n\t    if (ok) {\n\t      size_type ind = ns[0];\n\t      for (int k=1; k < dim; ++k) ind += ns[k]*mult[k];\n\t      if (subs[ind].size() > nbmax)\n\t\t{ nbmax = subs[ind].size(); imax = ind; }\n\t    }\n\t  }\n\t  nu[l]--;\n\t}\n\t\n\tif (nbmax > subs[i].size()) {\n\t  for (map_type::iterator it=subs[i].begin(); it!=subs[i].end(); ++it)\n\t    subs[imax][it->first] = void_type();\n\t  subs[i].clear();\n\t}\n      }\n      for (int k = 0; k < dim; ++k)\n\t{ ns[k]++; if (ns[k] < nbsub[k]) break; ns[k] = 0; }\n    }\n    \n    // delete empty domains.\n    size_type effnb = 0;\n    for (size_type i = 0; i < nbtotsub; ++i) {\n      if (subs[i].size() > 0)\n\t{ if (i != effnb) std::swap(subs[i], subs[effnb]); ++effnb; }\n    }\n\n    // build matrices\n    subs.resize(effnb);\n    vB.resize(effnb);\n    for (size_type i = 0; i < effnb; ++i) {\n      clear(vB[i]); resize(vB[i], nbpts, subs[i].size());\n      size_type j = 0;\n      for (map_type::iterator it=subs[i].begin(); it!=subs[i].end(); ++it, ++j)\n\tvB[i](it->first, j) = value_type(1);\n    }\n  }\n  \n\n}\n\n\n#endif\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_except.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2002-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n/** @file gmm_except.h \n    @author Yves Renard <Yves.Renard@insa-lyon.fr>\n    @author Julien Pommier <Julien.Pommier@insa-toulouse.fr>\n    @date September 01, 2002.\n    @brief Definition of basic exceptions.\n*/\n\n#ifndef GMM_EXCEPT_H__\n#define GMM_EXCEPT_H__\n\n#include \"gmm_std.h\"\n\nnamespace gmm {\n\n/* *********************************************************************** */\n/*\tGetfem++ generic errors.                     \t\t\t   */\n/* *********************************************************************** */\n\n  class gmm_error: public std::logic_error {\n  public:\n    gmm_error(const std::string& what_arg): std::logic_error (what_arg) {}\n  };\n\n#ifdef GETFEM_HAVE_PRETTY_FUNCTION\n#  define GMM_PRETTY_FUNCTION __PRETTY_FUNCTION__\n#else \n#  define GMM_PRETTY_FUNCTION \"\"\n#endif\n\n  // Errors : GMM_THROW should not be used on its own.\n  //          GMM_ASSERT1 : Non-maskable errors. Typically for in/ouput and\n  //               when the test do not significantly reduces the performance.\n  //          GMM_ASSERT2 : All tests which are potentially performance\n  //               consuming. Not hidden by default. Hidden when NDEBUG is\n  //               defined.\n  //          GMM_ASSERT3 : For internal checks. Hidden by default. Active\n  //               only when DEBUG_MODE is defined.\n// __EXCEPTIONS is defined by gcc, _CPPUNWIND is defined by visual c++\n#if defined(__EXCEPTIONS) || defined(_CPPUNWIND)\n  inline void short_error_throw(const char *file, int line, const char *func,\n\t\t\t\tconst char *errormsg) {\n    std::stringstream msg;\n    msg << \"Error in \" << file << \", line \" << line << \" \" << func\n\t<< \": \\n\" << errormsg << std::ends;\n    throw gmm::gmm_error(msg.str());\t\n  }\n# define GMM_THROW_(type, errormsg) {\t\t\t\t\t\\\n    std::stringstream msg;\t\t\t\t\t\t\\\n    msg << \"Error in \" << __FILE__ << \", line \"\t\t\t\t\\\n\t<< __LINE__ << \" \" << GMM_PRETTY_FUNCTION << \": \\n\"\t\t\\\n\t<< errormsg << std::ends;\t\t\t\t\t\t\\\n    throw (type)(msg.str());\t\t\t\t\t\t\\\n  }\n#else\n#ifndef _MSC_VER\n# define abort_no_return() ::abort()\n#else\n// apparently ::abort() on windows is not declared with __declspec(noreturn) so the compiler spits a lot of warnings when abort is used.\n# define abort_no_return() { assert(\"GMM ABORT\"==0); throw \"GMM ABORT\"; }\n#endif\n\n  inline void short_error_throw(const char *file, int line, const char *func,\n\t\t\t\tconst char *errormsg) {\n    std::stringstream msg;\n    msg << \"Error in \" << file << \", line \" << line << \" \" << func\n\t<< \": \\n\" << errormsg << std::ends;\n    std::cerr << msg.str() << std::endl;\n    abort_no_return();\t\n  }\n\n# define GMM_THROW_(type, errormsg) {\t\t\t\t\t\\\n    std::stringstream msg;\t\t\t\t\t\t\\\n    msg << \"Error in \" << __FILE__ << \", line \"\t\t\t\t\\\n\t<< __LINE__ << \" \" << GMM_PRETTY_FUNCTION << \": \\n\"\t\t\\\n\t<< errormsg;\t\t\t\t\t\t\\\n    std::cerr << msg.str() << std::endl;                                \\\n    abort_no_return();\t\t\t\t\t\t\t\\\n  }\n#endif\n\n# define GMM_ASSERT1(test, errormsg)\t\t        \t\t\\\n  { if (!(test)) GMM_THROW_(gmm::gmm_error, errormsg); }\n\n  // inline void GMM_THROW() IS_DEPRECATED;\n  inline void GMM_THROW() {}\n#define GMM_THROW(a, b) { GMM_THROW_(a,b); gmm::GMM_THROW(); }\n\n#if defined(NDEBUG)\n# define GMM_ASSERT2(test, errormsg) {}\n# define GMM_ASSERT3(test, errormsg) {}\n#elif !defined(GMM_FULL_NDEBUG)\n# define GMM_ASSERT2(test, errormsg)\t\t\t\t        \\\n  { if (!(test)) gmm::short_error_throw(__FILE__, __LINE__,\t\t\\\n\t\t\t\t   GMM_PRETTY_FUNCTION, errormsg); }\n# define GMM_ASSERT3(test, errormsg)\t\t\t\t        \\\n  { if (!(test)) gmm::short_error_throw(__FILE__, __LINE__,\t\t\\\n\t\t\t\t   GMM_PRETTY_FUNCTION, errormsg); }\n#else\n# define GMM_ASSERT2(test, errormsg)          \t\t\t\t\\\n  { if (!(test)) gmm::short_error_throw(__FILE__, __LINE__,\t\t\\\n\t\t\t\t   GMM_PRETTY_FUNCTION, errormsg); }\n# define GMM_ASSERT3(test, errormsg)\n#endif\n\n/* *********************************************************************** */\n/*\tGetfem++ warnings.                         \t\t\t   */\n/* *********************************************************************** */\n\n  // This allows to dynamically hide warnings\n  struct warning_level {\n    static int level(int l = -2)\n    { static int level_ = 3; return (l != -2) ? (level_ = l) : level_; }\n  };\n\n  inline void set_warning_level(int l) { warning_level::level(std::max(0,l)); }\n  inline int  get_warning_level(void)  { return warning_level::level(-2); }\n\n  // This allow not too compile some Warnings\n#ifndef GMM_WARNING_LEVEL\n# define GMM_WARNING_LEVEL 4\n#endif\n\n  // Warning levels : 0 always printed\n  //                  1 very important : specify a possible error in the code.\n  //                  2 important : specify a default of optimization for inst.\n  //                  3 remark\n  //                  4 ignored by default.\n\n#define GMM_WARNING_MSG(level_, thestr)  {\t\t\t       \\\n      std::stringstream msg;                                           \\\n      msg << \"Level \" << level_ << \" Warning in \" << __FILE__ << \", line \" \\\n          << __LINE__ << \": \" << thestr;\t\t       \\\n       std::cerr << msg.str() << std::endl;                            \\\n    }\n\n#define GMM_WARNING0(thestr) GMM_WARNING_MSG(0, thestr)\n\n#if GMM_WARNING_LEVEL > 0\n# define GMM_WARNING1(thestr)                                           \\\n  { if (1 <= gmm::warning_level::level()) GMM_WARNING_MSG(1, thestr) }\n#else\n# define GMM_WARNING1(thestr) {}\n#endif\n\n#if GMM_WARNING_LEVEL > 1\n# define GMM_WARNING2(thestr)                                           \\\n  { if (2 <= gmm::warning_level::level()) GMM_WARNING_MSG(2, thestr) } \n#else\n# define GMM_WARNING1(thestr) {}\n#endif\n\n#if GMM_WARNING_LEVEL > 2\n# define GMM_WARNING3(thestr)                                           \\\n  { if (3 <= gmm::warning_level::level()) GMM_WARNING_MSG(3, thestr) } \n#else\n# define GMM_WARNING1(thestr) {}\n#endif\n\n#if GMM_WARNING_LEVEL > 3\n# define GMM_WARNING4(thestr)                                           \\\n  { if (4 <= gmm::warning_level::level()) GMM_WARNING_MSG(4, thestr) } \n#else\n# define GMM_WARNING1(thestr) {}\n#endif\n\n/* *********************************************************************** */\n/*\tGetfem++ traces.                         \t\t\t   */\n/* *********************************************************************** */\n\n  // This allows to dynamically hide traces\n  struct traces_level {\n    static int level(int l = -2)\n    { static int level_ = 3; return (l != -2) ? (level_ = l) : level_; }\n  };\n\n  inline void set_traces_level(int l) { traces_level::level(std::max(0,l)); }\n\n  // This allow not too compile some Warnings\n#ifndef GMM_TRACES_LEVEL\n# define GMM_TRACES_LEVEL 3\n#endif\n\n  // Traces levels : 0 always printed\n  //                 1 Susceptible to occur once in a program.\n  //                 2 Susceptible to occur occasionnaly in a program (10).\n  //                 3 Susceptible to occur often (100).\n  //                 4 Susceptible to occur very often (>1000).\n\n#define GMM_TRACE_MSG_MPI     // for Parallelized version\n#define GMM_TRACE_MSG(level_, thestr)  {\t\t\t       \\\n    GMM_TRACE_MSG_MPI {\t\t\t\t\t\t       \\\n      std::stringstream msg;                                           \\\n      msg << \"Trace \" << level_ << \" in \" << __FILE__ << \", line \"     \\\n          << __LINE__ << \": \" << thestr;        \t\t       \\\n      std::cout << msg.str() << std::endl;\t\t\t       \\\n    }                                                                  \\\n  }        \n\n#define GMM_TRACE0(thestr) GMM_TRACE_MSG(0, thestr)\n\n#if GMM_TRACES_LEVEL > 0\n# define GMM_TRACE1(thestr)\t\t\t\t\t\t\\\n  { if (1 <= gmm::traces_level::level()) GMM_TRACE_MSG(1, thestr) }\n#else\n# define GMM_TRACE1(thestr) {}\n#endif\n  \n#if GMM_TRACES_LEVEL > 1\n# define GMM_TRACE2(thestr)\t\t\t\t\t\t\\\n  { if (2 <= gmm::traces_level::level()) GMM_TRACE_MSG(2, thestr) } \n#else\n# define GMM_TRACE2(thestr) {}\n#endif\n  \n#if GMM_TRACES_LEVEL > 2\n# define GMM_TRACE3(thestr)\t\t\t\t\t\t\\\n  { if (3 <= gmm::traces_level::level()) GMM_TRACE_MSG(3, thestr) } \n#else\n# define GMM_TRACE3(thestr) {}\n#endif\n  \n#if GMM_TRACES_LEVEL > 3\n# define GMM_TRACE4(thestr)\t\t\t\t\t\t\\\n  { if (4 <= gmm::traces_level::level()) GMM_TRACE_MSG(4, thestr) } \n#else\n# define GMM_TRACE4(thestr) {}\n#endif\n  \n  \n  /* ********************************************************************* */\n  /*    Definitions for compatibility with old versions.        \t   */\n  /* ********************************************************************* */ \n  \n  using std::invalid_argument;\n  \n  struct dimension_error : public std::logic_error\n  { dimension_error(const std::string& w): std::logic_error(w) {} };\n  struct file_not_found_error : public std::logic_error\n  { file_not_found_error(const std::string& w): std::logic_error (w) {} };\n  struct internal_error : public std::logic_error\n  { internal_error(const std::string& w): std::logic_error(w) {} };\n  struct failure_error : public std::logic_error\n  { failure_error(const std::string& w): std::logic_error (w) {} };\n  struct not_linear_error : public std::logic_error\n  { not_linear_error(const std::string& w): std::logic_error (w) {} };\n  struct to_be_done_error : public std::logic_error\n  { to_be_done_error(const std::string& w): std::logic_error (w) {} };\n\n#define GMM_STANDARD_CATCH_ERROR   catch(std::logic_error e)\t\\\n    {\t\t\t\t\t\t\t\t\\\n      std::cerr << \"============================================\\n\";\t\\\n      std::cerr << \"|      An error has been detected !!!      |\\n\";\t\\\n      std::cerr << \"============================================\\n\";\t\\\n      std::cerr << e.what() << std::endl << std::endl;\t\t\t\t\\\n      exit(1);\t\t\t\t\t\t\t\\\n    }\t\t\t\t\t\t\t\t\\\n  catch(std::runtime_error e)\t\t\t\t\t\\\n    {\t\t\t\t\t\t\t\t\\\n      std::cerr << \"============================================\\n\";\t\\\n      std::cerr << \"|      An error has been detected !!!      |\\n\";\t\\\n      std::cerr << \"============================================\\n\";\t\\\n      std::cerr << e.what() << std::endl << std::endl;\t\t\t\t\\\n      exit(1);\t\t\t\t\t\t\t\\\n    }\t\t\t\t\t\t\t\t\\\n  catch(std::bad_alloc) {\t\t\t\t\t\\\n    std::cerr << \"============================================\\n\";\t\\\n    std::cerr << \"|  A bad allocation has been detected !!!  |\\n\";\t\\\n    std::cerr << \"============================================\\n\";\t\\\n    exit(1);\t\t\t\t\t\t\t\\\n  }\t\t\t\t\t\t\t\t\\\n  catch(std::bad_typeid) {\t\t\t\t\t\\\n    std::cerr << \"============================================\\n\";\t\\\n    std::cerr << \"|  A bad typeid     has been detected !!!  |\\n\";\t\\\n    std::cerr << \"============================================\\n\";\t\\\n    exit(1);\t\t\t\t\t\t\t\\\n  }\t\t\t\t\t\t\t\t\\\n  catch(std::bad_exception) {\t\t\t\t\t\\\n    std::cerr << \"============================================\\n\";\t\\\n    std::cerr << \"|  A bad exception  has been detected !!!  |\\n\";\t\\\n    std::cerr << \"============================================\\n\";\t\\\n    exit(1);\t\t\t\t\t\t\t\\\n  }\t\t\t\t\t\t\t\t\\\n  catch(std::bad_cast) {\t\t\t\t\t\\\n    std::cerr << \"============================================\\n\";\t\\\n    std::cerr << \"|    A bad cast  has been detected !!!     |\\n\";\t\\\n    std::cerr << \"============================================\\n\";\t\\\n    exit(1);\t\t\t\t\t\t\t\\\n  }\t\t\t\t\t\t\t\t\\\n  catch(...) {\t\t\t\t\t\t\t\\\n    std::cerr << \"============================================\\n\";\t\\\n    std::cerr << \"|  An unknown error has been detected !!!  |\\n\";\t\\\n    std::cerr << \"============================================\\n\";\t\\\n    exit(1);\t\t\t\t\t\t\t\\\n  }\n  //   catch(ios_base::failure) { \n  //     std::cerr << \"============================================\\n\";\n  //     std::cerr << \"| A ios_base::failure has been detected !!!|\\n\";\n  //     std::cerr << \"============================================\\n\";\n  //     exit(1);\n  //   } \n\n#if defined(__GNUC__) && (__GNUC__ > 3)\n# define GMM_SET_EXCEPTION_DEBUG\t\t\t\t\\\n  std::set_terminate(__gnu_cxx::__verbose_terminate_handler);\n#else\n# define GMM_SET_EXCEPTION_DEBUG\n#endif\n\n}\n\n\n#endif /* GMM_EXCEPT_H__ */\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_inoutput.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2003-2012 Yves Renard, Julien Pommier\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n/**@file gmm_inoutput.h\n   @author Yves Renard <Yves.Renard@insa-lyon.fr>\n   @author Julien Pommier <Julien.Pommier@insa-toulouse.fr>\n   @date July 8, 2003.\n   @brief Input/output on sparse matrices\n\n   Support Harwell-Boeing and Matrix-Market formats.\n*/\n#ifndef GMM_INOUTPUT_H\n#define GMM_INOUTPUT_H\n\n#include <stdio.h>\n#include \"gmm_kernel.h\"\nnamespace gmm {\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  Functions to read and write Harwell Boeing format.                   */\n  /*                                                                       */\n  /*************************************************************************/\n\n  // Fri Aug 15 16:29:47 EDT 1997\n  // \n  //                      Harwell-Boeing File I/O in C\n  //                               V. 1.0\n  // \n  //          National Institute of Standards and Technology, MD.\n  //                            K.A. Remington\n  // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n  //                                NOTICE\n  //\n  // Permission to use, copy, modify, and distribute this software and\n  // its documentation for any purpose and without fee is hereby granted\n  // provided that the above copyright notice appear in all copies and\n  // that both the copyright notice and this permission notice appear in\n  // supporting documentation.\n  //\n  // Neither the Author nor the Institution (National Institute of Standards\n  // and Technology) make any representations about the suitability of this \n  // software for any purpose. This software is provided \"as is\" without \n  // expressed or implied warranty.\n  // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n\n  inline void IOHBTerminate(const char *a) { GMM_ASSERT1(false, a);}\n\n  inline bool is_complex_double__(std::complex<double>) { return true; }\n  inline bool is_complex_double__(double) { return false; }\n\n  inline int ParseIfmt(const char *fmt, int* perline, int* width) {\n    if (SECURE_NONCHAR_SSCANF(fmt, \" (%dI%d)\", perline, width) != 2) {\n      *perline = 1;\n      int s = SECURE_NONCHAR_SSCANF(fmt, \" (I%d)\", width);\n      GMM_ASSERT1(s == 1, \"invalid HB I-format: \" << fmt);\n    }\n    return *width;\n  }\n  \n  inline int ParseRfmt(const char *fmt, int* perline, int* width,\n\t\t       int* prec, int* flag) {\n    char p;\n    *perline = *width = *flag = *prec = 0;\n#ifdef GMM_SECURE_CRT\n    if (sscanf_s(fmt, \" (%d%c%d.%d)\", perline, &p, sizeof(char), width, prec)\n\t< 3 || !strchr(\"PEDF\", p))\n#else\n    if (sscanf(fmt, \" (%d%c%d.%d)\", perline, &p, width, prec) < 3\n\t|| !strchr(\"PEDF\", p))\n#endif\n\t{\n      *perline = 1;\n#ifdef GMM_SECURE_CRT\n      int s = sscanf_s(fmt, \" (%c%d.%d)\", &p, sizeof(char), width, prec);\n#else\n      int s = sscanf(fmt, \" (%c%d.%d)\", &p, width, prec);\n#endif\n      GMM_ASSERT1(s>=2 && strchr(\"PEDF\",p), \"invalid HB REAL format: \" << fmt);\n    }\n    *flag = p;\n    return *width;\n  }\n      \n  /** matrix input/output for Harwell-Boeing format */\n  struct HarwellBoeing_IO {\n    int nrows() const { return Nrow; }\n    int ncols() const { return Ncol; }\n    int nnz() const { return Nnzero; }\n    int is_complex() const { return Type[0] == 'C'; }\n    int is_symmetric() const { return Type[1] == 'S'; }\n    int is_hermitian() const { return Type[1] == 'H'; }\n    HarwellBoeing_IO() { clear(); }\n    HarwellBoeing_IO(const char *filename) { clear(); open(filename); }\n    ~HarwellBoeing_IO() { close(); }\n    /** open filename and reads header */\n    void open(const char *filename);\n    /** read the opened file */\n    template <typename T, int shift> void read(csc_matrix<T, shift>& A);\n    template <typename MAT> void read(MAT &M) IS_DEPRECATED;\n    template <typename T, int shift>\n    static void write(const char *filename, const csc_matrix<T, shift>& A);\n    template <typename T, int shift>\n    static void write(const char *filename, const csc_matrix<T, shift>& A,\n\t\t      const std::vector<T> &rhs);\n    template <typename T, typename INDI, typename INDJ, int shift> \n    static void write(const char *filename,\n\t\t      const csc_matrix_ref<T*, INDI*, INDJ*, shift>& A);\n    template <typename T, typename INDI, typename INDJ, int shift> \n    static void write(const char *filename,\n\t\t      const csc_matrix_ref<T*, INDI*, INDJ*, shift>& A,\n\t\t      const std::vector<T> &rhs);\n\n    /** static method for saving the matrix */\n    template <typename MAT> static void write(const char *filename,\n\t\t\t\t\t      const MAT& A) IS_DEPRECATED;\n  private:\n    FILE *f;\n    char Title[73], Key[9], Rhstype[4], Type[4];\n    int Nrow, Ncol, Nnzero, Nrhs;\n    char Ptrfmt[17], Indfmt[17], Valfmt[21], Rhsfmt[21];\n    int Ptrcrd, Indcrd, Valcrd, Rhscrd; \n    int lcount;\n\n\n    void close() { if (f) fclose(f); clear(); }\n    void clear() { \n      Nrow = Ncol = Nnzero = Nrhs = 0; f = 0; lcount = 0;\n      memset(Type, 0, sizeof Type); \n      memset(Key, 0, sizeof Key); \n      memset(Title, 0, sizeof Title); \n    }\n    char *getline(char *buf) { \n      char *p = fgets(buf, BUFSIZ, f); ++lcount;\n      int s = SECURE_NONCHAR_SSCANF(buf,\"%*s\");\n      GMM_ASSERT1(s >= 0 && p != 0,\n\t\t  \"blank line in HB file at line \" << lcount);\n      return buf;\n    }\n\n    int substrtoi(const char *p, size_type len) {\n      char s[100]; len = std::min(len, sizeof s - 1);\n      SECURE_STRNCPY(s, 100, p, len); s[len] = 0; return atoi(s);\n    }\n    double substrtod(const char *p, size_type len, int Valflag) {\n      char s[100]; len = std::min(len, sizeof s - 1);\n      SECURE_STRNCPY(s, 100, p, len); s[len] = 0;\n      if ( Valflag != 'F' && !strchr(s,'E')) {\n\t/* insert a char prefix for exp */\n\tint last = int(strlen(s));\n\tfor (int j=last+1;j>=0;j--) {\n\t  s[j] = s[j-1];\n\t  if ( s[j] == '+' || s[j] == '-' ) {\n\t    s[j-1] = char(Valflag);                    \n\t    break;\n\t  }\n\t}\n      }\n      return atof(s);\n    }\n    template <typename IND_TYPE>   \n    int readHB_data(IND_TYPE colptr[], IND_TYPE rowind[], \n\t\t    double val[]) {\n      /***********************************************************************/\n      /*  This function opens and reads the specified file, interpreting its */\n      /*  contents as a sparse matrix stored in the Harwell/Boeing standard  */\n      /*  format and creating compressed column storage scheme vectors to    */\n      /*  hold the index and nonzero value information.                      */\n      /*                                                                     */\n      /*    ----------                                                       */\n      /*    **CAVEAT**                                                       */\n      /*    ----------                                                       */\n      /*  Parsing real formats from Fortran is tricky, and this file reader  */\n      /*  does not claim to be foolproof.   It has been tested for cases     */\n      /*  when the real values are printed consistently and evenly spaced on */\n      /*  each line, with Fixed (F), and Exponential (E or D) formats.       */\n      /*                                                                     */\n      /*  **  If the input file does not adhere to the H/B format, the  **   */\n      /*  **             results will be unpredictable.                 **   */\n      /*                                                                     */\n      /***********************************************************************/\n      int i,ind,col,offset,count;\n      int Ptrperline, Ptrwidth, Indperline, Indwidth;\n      int Valperline, Valwidth, Valprec, Nentries;\n      int Valflag = 'D';           /* Indicates 'E','D', or 'F' float format */\n      char line[BUFSIZ];\n      gmm::standard_locale sl;\n\n\n      /*  Parse the array input formats from Line 3 of HB file  */\n      ParseIfmt(Ptrfmt,&Ptrperline,&Ptrwidth);\n      ParseIfmt(Indfmt,&Indperline,&Indwidth);\n      if ( Type[0] != 'P' ) {          /* Skip if pattern only  */\n\tParseRfmt(Valfmt,&Valperline,&Valwidth,&Valprec,&Valflag);\n      }\n    \n      /*  Read column pointer array:   */\n      offset = 0;         /* if base 0 storage is declared (via macro def),  */\n      /* then storage entries are offset by 1            */\n    \n      for (count = 0, i=0;i<Ptrcrd;i++) {\n\tgetline(line);\n\tfor (col = 0, ind = 0;ind<Ptrperline;ind++) {\n\t  if (count > Ncol) break;\n\t  colptr[count] = substrtoi(line+col,Ptrwidth)-offset;\n\t  count++; col += Ptrwidth;\n\t}\n      }\n    \n      /*  Read row index array:  */    \n      for (count = 0, i=0;i<Indcrd;i++) {\n\tgetline(line);\n\tfor (col = 0, ind = 0;ind<Indperline;ind++) {\n\t  if (count == Nnzero) break;\n\t  rowind[count] = substrtoi(line+col,Indwidth)-offset;\n\t  count++; col += Indwidth;\n\t}\n      }\n    \n      /*  Read array of values:  */\n      if ( Type[0] != 'P' ) {          /* Skip if pattern only  */\n\tif ( Type[0] == 'C' ) Nentries = 2*Nnzero;\n\telse Nentries = Nnzero;\n      \n\tcount = 0;\n\tfor (i=0;i<Valcrd;i++) {\n\t  getline(line);\n\t  if (Valflag == 'D')  {\n            // const_cast Due to aCC excentricity\n\t    char *p;\n\t    while( (p = const_cast<char *>(strchr(line,'D')) )) *p = 'E';\n\t  }\n\t  for (col = 0, ind = 0;ind<Valperline;ind++) {\n\t    if (count == Nentries) break;\n\t    val[count] = substrtod(line+col, Valwidth, Valflag);\n\t    count++; col += Valwidth;\n\t  }\n\t}\n      }\n      return 1;\n    }\n  };\n  \n  inline void HarwellBoeing_IO::open(const char *filename) {\n    int Totcrd,Neltvl,Nrhsix;\n    char line[BUFSIZ];\n    close();\n    SECURE_FOPEN(&f, filename, \"r\");\n    GMM_ASSERT1(f, \"could not open \" << filename);\n    /* First line: */\n#ifdef GMM_SECURE_CRT\n    sscanf_s(getline(line), \"%c%s\", Title, 72, Key, 8);\n#else\n    sscanf(getline(line), \"%72c%8s\", Title, Key);\n#endif\n    Key[8] = Title[72] = 0;\n    /* Second line: */\n    Totcrd = Ptrcrd = Indcrd = Valcrd = Rhscrd = 0;\n    SECURE_NONCHAR_SSCANF(getline(line), \"%d%d%d%d%d\", &Totcrd, &Ptrcrd,\n\t\t\t  &Indcrd, &Valcrd, &Rhscrd);\n    \n    /* Third line: */\n    Nrow = Ncol = Nnzero = Neltvl = 0;\n#ifdef GMM_SECURE_CRT\n    if (sscanf_s(getline(line), \"%c%d%d%d%d\", Type, 3, &Nrow, &Ncol, &Nnzero,\n\t\t &Neltvl) < 1)\n#else\n    if (sscanf(getline(line), \"%3c%d%d%d%d\", Type, &Nrow, &Ncol, &Nnzero,\n\t       &Neltvl) < 1)\n#endif\n      IOHBTerminate(\"Invalid Type info, line 3 of Harwell-Boeing file.\\n\");\n    for (size_type i = 0; i < 3; ++i) Type[i] = char(toupper(Type[i]));\n    \n      /*  Fourth line:  */\n#ifdef GMM_SECURE_CRT\n    if ( sscanf_s(getline(line), \"%c%c%c%c\",Ptrfmt, 16,Indfmt, 16,Valfmt,\n\t\t  20,Rhsfmt, 20) < 3)\n#else\n    if ( sscanf(getline(line), \"%16c%16c%20c%20c\",Ptrfmt,Indfmt,Valfmt,\n\t\tRhsfmt) < 3)\n#endif\n      IOHBTerminate(\"Invalid format info, line 4 of Harwell-Boeing file.\\n\"); \n    Ptrfmt[16] = Indfmt[16] = Valfmt[20] = Rhsfmt[20] = 0;\n    \n    /*  (Optional) Fifth line: */\n    if (Rhscrd != 0 ) { \n      Nrhs = Nrhsix = 0;\n#ifdef GMM_SECURE_CRT\n      if ( sscanf_s(getline(line), \"%c%d%d\", Rhstype, 3, &Nrhs, &Nrhsix) != 1)\n#else\n      if ( sscanf(getline(line), \"%3c%d%d\", Rhstype, &Nrhs, &Nrhsix) != 1)\n#endif\n\tIOHBTerminate(\"Invalid RHS type information, line 5 of\"\n\t\t      \" Harwell-Boeing file.\\n\");\n    }\n  }\n\n  /* only valid for double and complex<double> csc matrices */\n  template <typename T, int shift> void\n  HarwellBoeing_IO::read(csc_matrix<T, shift>& A) {\n\n    typedef typename csc_matrix<T, shift>::IND_TYPE IND_TYPE;\n\n    GMM_ASSERT1(f, \"no file opened!\");\n    GMM_ASSERT1(Type[0] != 'P',\n\t\t\"Bad HB matrix format (pattern matrices not supported)\");\n    GMM_ASSERT1(!is_complex_double__(T()) || Type[0] != 'R',\n\t\t\"Bad HB matrix format (file contains a REAL matrix)\");\n    GMM_ASSERT1(is_complex_double__(T()) || Type[0] != 'C',\n\t\t\"Bad HB matrix format (file contains a COMPLEX matrix)\");\n    A.nc = ncols(); A.nr = nrows();\n    A.jc.resize(ncols()+1);\n    A.ir.resize(nnz());\n    A.pr.resize(nnz());\n    readHB_data(&A.jc[0], &A.ir[0], (double*)&A.pr[0]);\n    for (int i = 0; i <= ncols(); ++i) { A.jc[i] += shift; A.jc[i] -= 1; }\n    for (int i = 0; i < nnz(); ++i)    { A.ir[i] += shift; A.ir[i] -= 1; }\n  }\n\n  template <typename MAT> void \n  HarwellBoeing_IO::read(MAT &M) {\n    csc_matrix<typename gmm::linalg_traits<MAT>::value_type> csc;\n    read(csc); \n    resize(M, mat_nrows(csc), mat_ncols(csc));\n    copy(csc, M);\n  }\n  \n  template <typename IND_TYPE> \n  inline int writeHB_mat_double(const char* filename, int M, int N, int nz,\n\t\t\t\tconst IND_TYPE colptr[],\n\t\t\t\tconst IND_TYPE rowind[], \n\t\t\t\tconst double val[], int Nrhs,\n\t\t\t\tconst double rhs[], const double guess[],\n\t\t\t\tconst double exact[], const char* Title,\n\t\t\t\tconst char* Key, const char* Type, \n\t\t\t\tconst char* Ptrfmt, const char* Indfmt,\n\t\t\t\tconst char* Valfmt, const char* Rhsfmt,\n\t\t\t\tconst char* Rhstype, int shift) {\n    /************************************************************************/\n    /*  The writeHB function opens the named file and writes the specified  */\n    /*  matrix and optional right-hand-side(s) to that file in              */\n    /*  Harwell-Boeing format.                                              */\n    /*                                                                      */\n    /*  For a description of the Harwell Boeing standard, see:              */\n    /*            Duff, et al.,  ACM TOMS Vol.15, No.1, March 1989          */\n    /*                                                                      */\n    /************************************************************************/\n    FILE *out_file;\n    int i, entry, offset, j, acount, linemod;\n    int totcrd, ptrcrd, indcrd, valcrd, rhscrd;\n    int nvalentries, nrhsentries;\n    int Ptrperline, Ptrwidth, Indperline, Indwidth;\n    int Rhsperline, Rhswidth, Rhsprec, Rhsflag;\n    int Valperline, Valwidth, Valprec;\n    int Valflag;           /* Indicates 'E','D', or 'F' float format */\n    char pformat[16],iformat[16],vformat[19],rformat[19];\n    //    char *pValflag, *pRhsflag;\n    gmm::standard_locale sl;\n    \n    if ( Type[0] == 'C' )\n      { nvalentries = 2*nz; nrhsentries = 2*M; }\n    else\n      { nvalentries = nz; nrhsentries = M; }\n    \n    if ( filename != NULL ) {\n      SECURE_FOPEN(&out_file, filename, \"w\");\n      GMM_ASSERT1(out_file != NULL, \"Error: Cannot open file: \" << filename);\n    } else out_file = stdout;\n    \n    if ( Ptrfmt == NULL ) Ptrfmt = \"(8I10)\";\n    ParseIfmt(Ptrfmt, &Ptrperline, &Ptrwidth);\n    SECURE_SPRINTF1(pformat,sizeof(pformat),\"%%%dd\",Ptrwidth);\n    ptrcrd = (N+1)/Ptrperline;\n    if ( (N+1)%Ptrperline != 0) ptrcrd++;\n    \n    if ( Indfmt == NULL ) Indfmt =  Ptrfmt;\n    ParseIfmt(Indfmt, &Indperline, &Indwidth);\n    SECURE_SPRINTF1(iformat,sizeof(iformat), \"%%%dd\",Indwidth);\n    indcrd = nz/Indperline;\n    if ( nz%Indperline != 0) indcrd++;\n    \n    if ( Type[0] != 'P' ) {          /* Skip if pattern only  */\n      if ( Valfmt == NULL ) Valfmt = \"(4E21.13)\";\n      ParseRfmt(Valfmt, &Valperline, &Valwidth, &Valprec, &Valflag);\n//       if (Valflag == 'D') {\n//         pValflag = (char *) strchr(Valfmt,'D');\n//         *pValflag = 'E';\n//       }\n      if (Valflag == 'F')\n\tSECURE_SPRINTF2(vformat, sizeof(vformat), \"%% %d.%df\", Valwidth,\n\t\t\tValprec);\n      else\n\tSECURE_SPRINTF2(vformat, sizeof(vformat), \"%% %d.%dE\", Valwidth,\n\t\t\tValprec);\n      valcrd = nvalentries/Valperline;\n      if ( nvalentries%Valperline != 0) valcrd++;\n    } else valcrd = 0;\n    \n    if ( Nrhs > 0 ) {\n      if ( Rhsfmt == NULL ) Rhsfmt = Valfmt;\n      ParseRfmt(Rhsfmt,&Rhsperline,&Rhswidth,&Rhsprec, &Rhsflag);\n      if (Rhsflag == 'F')\n\tSECURE_SPRINTF2(rformat,sizeof(rformat), \"%% %d.%df\",Rhswidth,Rhsprec);\n      else\n\tSECURE_SPRINTF2(rformat,sizeof(rformat), \"%% %d.%dE\",Rhswidth,Rhsprec);\n//       if (Valflag == 'D') {\n//         pRhsflag = (char *) strchr(Rhsfmt,'D');\n//         *pRhsflag = 'E';\n//       }\n      rhscrd = nrhsentries/Rhsperline; \n      if ( nrhsentries%Rhsperline != 0) rhscrd++;\n      if ( Rhstype[1] == 'G' ) rhscrd+=rhscrd;\n      if ( Rhstype[2] == 'X' ) rhscrd+=rhscrd;\n      rhscrd*=Nrhs;\n    } else rhscrd = 0;\n    \n    totcrd = 4+ptrcrd+indcrd+valcrd+rhscrd;\n    \n    \n    /*  Print header information:  */\n    \n    fprintf(out_file,\"%-72s%-8s\\n%14d%14d%14d%14d%14d\\n\",Title, Key, totcrd,\n\t    ptrcrd, indcrd, valcrd, rhscrd);\n    fprintf(out_file,\"%3s%11s%14d%14d%14d%14d\\n\",Type,\"          \", M, N, nz, 0);\n    fprintf(out_file,\"%-16s%-16s%-20s\", Ptrfmt, Indfmt, Valfmt);\n    if ( Nrhs != 0 ) {\n      /* Print Rhsfmt on fourth line and                              */\n      /*  optional fifth header line for auxillary vector information:*/\n      fprintf(out_file,\"%-20s\\n%-14s%d\\n\",Rhsfmt,Rhstype,Nrhs);\n    }\n    else\n      fprintf(out_file,\"\\n\");\n    \n    offset = 1 - shift;  /* if base 0 storage is declared (via macro def), */\n    /* then storage entries are offset by 1           */\n    \n    /*  Print column pointers:   */\n    for (i = 0; i < N+1; i++) {\n      entry = colptr[i]+offset;\n      fprintf(out_file,pformat,entry);\n      if ( (i+1)%Ptrperline == 0 ) fprintf(out_file,\"\\n\");\n    }\n    \n    if ( (N+1) % Ptrperline != 0 ) fprintf(out_file,\"\\n\");\n    \n    /*  Print row indices:       */\n    for (i=0;i<nz;i++) {\n      entry = rowind[i]+offset;\n      fprintf(out_file,iformat,entry);\n      if ( (i+1)%Indperline == 0 ) fprintf(out_file,\"\\n\");\n    }\n    \n    if ( nz % Indperline != 0 ) fprintf(out_file,\"\\n\");\n    \n    /*  Print values:            */\n    \n    if ( Type[0] != 'P' ) {          /* Skip if pattern only  */\n      for (i=0;i<nvalentries;i++) {\n\tfprintf(out_file,vformat,val[i]);\n\tif ( (i+1)%Valperline == 0 ) fprintf(out_file,\"\\n\");\n      }\n      \n      if ( nvalentries % Valperline != 0 ) fprintf(out_file,\"\\n\");\n      \n      /*  Print right hand sides:  */\n      acount = 1;\n      linemod=0;\n      if ( Nrhs > 0 ) {\n\tfor (j=0;j<Nrhs;j++) {\n\t  for (i=0;i<nrhsentries;i++) {\n\t    fprintf(out_file,rformat,rhs[i] /* *Rhswidth */);\n\t    if ( acount++%Rhsperline == linemod ) fprintf(out_file,\"\\n\");\n\t  }\n\t  if ( acount%Rhsperline != linemod ) {\n\t    fprintf(out_file,\"\\n\");\n\t    linemod = (acount-1)%Rhsperline;\n\t  }\n\t  if ( Rhstype[1] == 'G' ) {\n\t    for (i=0;i<nrhsentries;i++) {\n\t      fprintf(out_file,rformat,guess[i] /* *Rhswidth */);\n\t      if ( acount++%Rhsperline == linemod ) fprintf(out_file,\"\\n\");\n\t    }\n\t    if ( acount%Rhsperline != linemod ) {\n\t      fprintf(out_file,\"\\n\");\n\t      linemod = (acount-1)%Rhsperline;\n\t    }\n\t  }\n\t  if ( Rhstype[2] == 'X' ) {\n\t    for (i=0;i<nrhsentries;i++) {\n\t      fprintf(out_file,rformat,exact[i] /* *Rhswidth */);\n\t      if ( acount++%Rhsperline == linemod ) fprintf(out_file,\"\\n\");\n\t    }\n\t    if ( acount%Rhsperline != linemod ) {\n\t      fprintf(out_file,\"\\n\");\n\t      linemod = (acount-1)%Rhsperline;\n\t    }\n\t  }\n\t}\n      }\n    }\n    int s = fclose(out_file);\n    GMM_ASSERT1(s == 0, \"Error closing file in writeHB_mat_double().\");\n    return 1;\n  }\n  \n  template <typename T, int shift> void\n  HarwellBoeing_IO::write(const char *filename,\n\t\t\t  const csc_matrix<T, shift>& A) {\n    write(filename, csc_matrix_ref<const T*, const unsigned*,\n\t  const unsigned *, shift>\n\t  (&A.pr[0], &A.ir[0], &A.jc[0], A.nr, A.nc));\n  }\n\n  template <typename T, int shift> void\n  HarwellBoeing_IO::write(const char *filename,\n\t\t\t  const csc_matrix<T, shift>& A,\n\t\t\t  const std::vector<T> &rhs) {\n    write(filename, csc_matrix_ref<const T*, const unsigned*,\n\t  const unsigned *, shift>\n\t  (&A.pr[0], &A.ir[0], &A.jc[0], A.nr, A.nc), rhs);\n  }\n\n  template <typename T, typename INDI, typename INDJ, int shift> void\n  HarwellBoeing_IO::write(const char *filename,\n\t\t\t  const csc_matrix_ref<T*, INDI*, INDJ*, shift>& A) {\n    const char *t = 0;    \n    if (is_complex_double__(T()))\n      if (mat_nrows(A) == mat_ncols(A)) t = \"CUA\"; else t = \"CRA\";\n    else\n      if (mat_nrows(A) == mat_ncols(A)) t = \"RUA\"; else t = \"RRA\";\n    writeHB_mat_double(filename, int(mat_nrows(A)), int(mat_ncols(A)),\n\t\t       A.jc[mat_ncols(A)], A.jc, A.ir,\n\t\t       (const double *)A.pr,\n\t\t       0, 0, 0, 0, \"GETFEM++ CSC MATRIX\", \"CSCMAT\",\n\t\t       t, 0, 0, 0, 0, \"F\", shift);\n  }\n\n  template <typename T, typename INDI, typename INDJ, int shift> void\n  HarwellBoeing_IO::write(const char *filename,\n\t\t\t  const csc_matrix_ref<T*, INDI*, INDJ*, shift>& A,\n\t\t\t  const std::vector<T> &rhs) {\n    const char *t = 0;\n    if (is_complex_double__(T()))\n      if (mat_nrows(A) == mat_ncols(A)) t = \"CUA\"; else t = \"CRA\";\n    else\n      if (mat_nrows(A) == mat_ncols(A)) t = \"RUA\"; else t = \"RRA\";\n    int Nrhs = gmm::vect_size(rhs) / mat_nrows(A);\n    writeHB_mat_double(filename, int(mat_nrows(A)), int(mat_ncols(A)),\n\t\t       A.jc[mat_ncols(A)], A.jc, A.ir,\n\t\t       (const double *)A.pr,\n\t\t       Nrhs, (const double *)(&rhs[0]), 0, 0,\n\t\t       \"GETFEM++ CSC MATRIX\", \"CSCMAT\",\n\t\t       t, 0, 0, 0, 0, \"F  \", shift);\n  }\n\n  \n  template <typename MAT> void\n  HarwellBoeing_IO::write(const char *filename, const MAT& A) {\n    gmm::csc_matrix<typename gmm::linalg_traits<MAT>::value_type> \n      tmp(gmm::mat_nrows(A), gmm::mat_ncols(A));\n    gmm::copy(A,tmp); \n    HarwellBoeing_IO::write(filename, tmp);\n  }\n\n  /** save a \"double\" or \"std::complex<double>\" csc matrix into a\n      HarwellBoeing file\n  */\n  template <typename T, int shift> inline void\n  Harwell_Boeing_save(const std::string &filename,\n\t\t      const csc_matrix<T, shift>& A)\n  { HarwellBoeing_IO::write(filename.c_str(), A); }\n\n  /** save a reference on \"double\" or \"std::complex<double>\" csc matrix\n      into a HarwellBoeing file\n  */\n  template <typename T, typename INDI, typename INDJ, int shift> inline void\n  Harwell_Boeing_save(const std::string &filename,\n\t\t      const csc_matrix_ref<T, INDI, INDJ, shift>& A)\n  { HarwellBoeing_IO::write(filename.c_str(), A); }\n\n  /** save a \"double\" or \"std::complex<double>\" generic matrix\n      into a HarwellBoeing file making a copy in a csc matrix\n  */\n  template <typename MAT> inline void\n  Harwell_Boeing_save(const std::string &filename, const MAT& A) {\n    gmm::csc_matrix<typename gmm::linalg_traits<MAT>::value_type> \n      tmp(gmm::mat_nrows(A), gmm::mat_ncols(A));\n    gmm::copy(A, tmp); \n    HarwellBoeing_IO::write(filename.c_str(), tmp);\n  }\n\n  template <typename MAT, typename VECT> inline void\n  Harwell_Boeing_save(const std::string &filename, const MAT& A,\n\t\t      const VECT &RHS) {\n    typedef typename gmm::linalg_traits<MAT>::value_type T;\n    gmm::csc_matrix<T> tmp(gmm::mat_nrows(A), gmm::mat_ncols(A));\n    gmm::copy(A, tmp);\n    std::vector<T> tmprhs(gmm::vect_size(RHS));\n    gmm::copy(RHS, tmprhs);\n    HarwellBoeing_IO::write(filename.c_str(), tmp, tmprhs);\n  }\n\n  /** load a \"double\" or \"std::complex<double>\" csc matrix from a\n      HarwellBoeing file\n  */\n  template <typename T, int shift> void\n  Harwell_Boeing_load(const std::string &filename, csc_matrix<T, shift>& A) {\n    HarwellBoeing_IO h(filename.c_str()); h.read(A);\n  }\n\n  /** load a \"double\" or \"std::complex<double>\" generic matrix from a\n      HarwellBoeing file\n  */\n  template <typename MAT> void\n  Harwell_Boeing_load(const std::string &filename, MAT& A) {\n    csc_matrix<typename gmm::linalg_traits<MAT>::value_type> csc;\n    Harwell_Boeing_load(filename, csc);\n    resize(A, mat_nrows(csc), mat_ncols(csc));\n    copy(csc, A);\n  }\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*  Functions to read and write MatrixMarket format.                     */\n  /*                                                                       */\n  /*************************************************************************/\n\n  /* \n   *   Matrix Market I/O library for ANSI C\n   *\n   *   See http://math.nist.gov/MatrixMarket for details.\n   *\n   *\n   */\n\n#define MM_MAX_LINE_LENGTH 1025\n#define MatrixMarketBanner \"%%MatrixMarket\"\n#define MM_MAX_TOKEN_LENGTH 64\n\n  typedef char MM_typecode[4];\n\n  /******************* MM_typecode query functions *************************/\n\n#define mm_is_matrix(typecode)\t        ((typecode)[0]=='M')\n  \n#define mm_is_sparse(typecode)\t        ((typecode)[1]=='C')\n#define mm_is_coordinate(typecode)      ((typecode)[1]=='C')\n#define mm_is_dense(typecode)\t        ((typecode)[1]=='A')\n#define mm_is_array(typecode)\t        ((typecode)[1]=='A')\n  \n#define mm_is_complex(typecode)\t        ((typecode)[2]=='C')\n#define mm_is_real(typecode)\t        ((typecode)[2]=='R')\n#define mm_is_pattern(typecode)\t        ((typecode)[2]=='P')\n#define mm_is_integer(typecode)         ((typecode)[2]=='I')\n  \n#define mm_is_symmetric(typecode)       ((typecode)[3]=='S')\n#define mm_is_general(typecode)\t        ((typecode)[3]=='G')\n#define mm_is_skew(typecode)\t        ((typecode)[3]=='K')\n#define mm_is_hermitian(typecode)       ((typecode)[3]=='H')\n  \n  /******************* MM_typecode modify fucntions ************************/\n\n#define mm_set_matrix(typecode)\t        ((*typecode)[0]='M')\n#define mm_set_coordinate(typecode)\t((*typecode)[1]='C')\n#define mm_set_array(typecode)\t        ((*typecode)[1]='A')\n#define mm_set_dense(typecode)\t        mm_set_array(typecode)\n#define mm_set_sparse(typecode)\t        mm_set_coordinate(typecode)\n\n#define mm_set_complex(typecode)        ((*typecode)[2]='C')\n#define mm_set_real(typecode)\t        ((*typecode)[2]='R')\n#define mm_set_pattern(typecode)        ((*typecode)[2]='P')\n#define mm_set_integer(typecode)        ((*typecode)[2]='I')\n\n\n#define mm_set_symmetric(typecode)      ((*typecode)[3]='S')\n#define mm_set_general(typecode)        ((*typecode)[3]='G')\n#define mm_set_skew(typecode)\t        ((*typecode)[3]='K')\n#define mm_set_hermitian(typecode)      ((*typecode)[3]='H')\n\n#define mm_clear_typecode(typecode)     ((*typecode)[0]=(*typecode)[1]= \\\n\t\t\t       \t        (*typecode)[2]=' ',(*typecode)[3]='G')\n\n#define mm_initialize_typecode(typecode) mm_clear_typecode(typecode)\n\n\n  /******************* Matrix Market error codes ***************************/\n\n\n#define MM_COULD_NOT_READ_FILE\t11\n#define MM_PREMATURE_EOF\t\t12\n#define MM_NOT_MTX\t\t\t\t13\n#define MM_NO_HEADER\t\t\t14\n#define MM_UNSUPPORTED_TYPE\t\t15\n#define MM_LINE_TOO_LONG\t\t16\n#define MM_COULD_NOT_WRITE_FILE\t17\n\n\n  /******************** Matrix Market internal definitions *****************\n\n   MM_matrix_typecode: 4-character sequence\n\n\t                object \t    sparse/   \tdata        storage \n\t                            dense     \ttype        scheme\n\n   string position:\t [0]        [1]\t\t[2]         [3]\n\n   Matrix typecode:     M(atrix)    C(oord)\tR(eal)      G(eneral)\n\t\t                    A(array)    C(omplex)   H(ermitian)\n\t                                        P(attern)   S(ymmetric)\n                                                I(nteger)   K(kew)\n\n  ***********************************************************************/\n\n#define MM_MTX_STR\t   \"matrix\"\n#define MM_ARRAY_STR\t   \"array\"\n#define MM_DENSE_STR\t   \"array\"\n#define MM_COORDINATE_STR  \"coordinate\" \n#define MM_SPARSE_STR\t   \"coordinate\"\n#define MM_COMPLEX_STR\t   \"complex\"\n#define MM_REAL_STR\t   \"real\"\n#define MM_INT_STR\t   \"integer\"\n#define MM_GENERAL_STR     \"general\"\n#define MM_SYMM_STR\t   \"symmetric\"\n#define MM_HERM_STR\t   \"hermitian\"\n#define MM_SKEW_STR\t   \"skew-symmetric\"\n#define MM_PATTERN_STR     \"pattern\"\n\n  inline char  *mm_typecode_to_str(MM_typecode matcode) {\n    char buffer[MM_MAX_LINE_LENGTH];\n    const char *types[4] = {0,0,0,0};\n    /*    int error =0; */\n    /*   int i; */\n    \n    /* check for MTX type */\n    if (mm_is_matrix(matcode)) \n      types[0] = MM_MTX_STR;\n    /*\n      else\n      error=1;\n    */\n    /* check for CRD or ARR matrix */\n    if (mm_is_sparse(matcode))\n      types[1] = MM_SPARSE_STR;\n    else\n      if (mm_is_dense(matcode))\n        types[1] = MM_DENSE_STR;\n      else\n        return NULL;\n    \n    /* check for element data type */\n    if (mm_is_real(matcode))\n      types[2] = MM_REAL_STR;\n    else\n      if (mm_is_complex(matcode))\n        types[2] = MM_COMPLEX_STR;\n      else\n\tif (mm_is_pattern(matcode))\n\t  types[2] = MM_PATTERN_STR;\n\telse\n\t  if (mm_is_integer(matcode))\n\t    types[2] = MM_INT_STR;\n\t  else\n\t    return NULL;\n    \n    \n    /* check for symmetry type */\n    if (mm_is_general(matcode))\n      types[3] = MM_GENERAL_STR;\n    else if (mm_is_symmetric(matcode))\n      types[3] = MM_SYMM_STR;\n    else if (mm_is_hermitian(matcode))\n      types[3] = MM_HERM_STR;\n    else  if (mm_is_skew(matcode))\n      types[3] = MM_SKEW_STR;\n    else\n      return NULL;\n    \n    SECURE_SPRINTF4(buffer, sizeof(buffer), \"%s %s %s %s\", types[0], types[1],\n\t\t    types[2], types[3]);\n    return SECURE_STRDUP(buffer);\n    \n  }\n  \n  inline int mm_read_banner(FILE *f, MM_typecode *matcode) {\n    char line[MM_MAX_LINE_LENGTH];\n    char banner[MM_MAX_TOKEN_LENGTH];\n    char mtx[MM_MAX_TOKEN_LENGTH]; \n    char crd[MM_MAX_TOKEN_LENGTH];\n    char data_type[MM_MAX_TOKEN_LENGTH];\n    char storage_scheme[MM_MAX_TOKEN_LENGTH];\n    char *p;\n    gmm::standard_locale sl;\n    /*    int ret_code; */\n    \n    mm_clear_typecode(matcode);  \n    \n    if (fgets(line, MM_MAX_LINE_LENGTH, f) == NULL) \n      return MM_PREMATURE_EOF;\n\n#ifdef GMM_SECURE_CRT\n    if (sscanf_s(line, \"%s %s %s %s %s\", banner, sizeof(banner),\n\t\t mtx, sizeof(mtx), crd, sizeof(crd), data_type,\n\t\t sizeof(data_type), storage_scheme,\n\t\t sizeof(storage_scheme)) != 5)\n#else\n\tif (sscanf(line, \"%s %s %s %s %s\", banner, mtx, crd,\n\t\t   data_type, storage_scheme) != 5)\n#endif\n      return MM_PREMATURE_EOF;\n\n    for (p=mtx; *p!='\\0'; *p=char(tolower(*p)),p++) {};  /* convert to lower case */\n    for (p=crd; *p!='\\0'; *p=char(tolower(*p)),p++) {};  \n    for (p=data_type; *p!='\\0'; *p=char(tolower(*p)),p++) {};\n    for (p=storage_scheme; *p!='\\0'; *p=char(tolower(*p)),p++) {};\n\n    /* check for banner */\n    if (strncmp(banner, MatrixMarketBanner, strlen(MatrixMarketBanner)) != 0)\n      return MM_NO_HEADER;\n\n    /* first field should be \"mtx\" */\n    if (strcmp(mtx, MM_MTX_STR) != 0)\n      return  MM_UNSUPPORTED_TYPE;\n    mm_set_matrix(matcode);\n\n\n    /* second field describes whether this is a sparse matrix (in coordinate\n       storgae) or a dense array */\n\n\n    if (strcmp(crd, MM_SPARSE_STR) == 0)\n      mm_set_sparse(matcode);\n    else\n      if (strcmp(crd, MM_DENSE_STR) == 0)\n\tmm_set_dense(matcode);\n      else\n        return MM_UNSUPPORTED_TYPE;\n    \n\n    /* third field */\n\n    if (strcmp(data_type, MM_REAL_STR) == 0)\n      mm_set_real(matcode);\n    else\n      if (strcmp(data_type, MM_COMPLEX_STR) == 0)\n        mm_set_complex(matcode);\n      else\n\tif (strcmp(data_type, MM_PATTERN_STR) == 0)\n\t  mm_set_pattern(matcode);\n\telse\n\t  if (strcmp(data_type, MM_INT_STR) == 0)\n\t    mm_set_integer(matcode);\n\t  else\n\t    return MM_UNSUPPORTED_TYPE;\n    \n\n    /* fourth field */\n\n    if (strcmp(storage_scheme, MM_GENERAL_STR) == 0)\n      mm_set_general(matcode);\n    else\n      if (strcmp(storage_scheme, MM_SYMM_STR) == 0)\n        mm_set_symmetric(matcode);\n      else\n\tif (strcmp(storage_scheme, MM_HERM_STR) == 0)\n\t  mm_set_hermitian(matcode);\n\telse\n\t  if (strcmp(storage_scheme, MM_SKEW_STR) == 0)\n\t    mm_set_skew(matcode);\n\t  else\n\t    return MM_UNSUPPORTED_TYPE;\n        \n    return 0;\n  }\n\n  inline int mm_read_mtx_crd_size(FILE *f, int *M, int *N, int *nz ) {\n    char line[MM_MAX_LINE_LENGTH];\n    /* int ret_code;*/\n    int num_items_read;\n    \n    /* set return null parameter values, in case we exit with errors */\n    *M = *N = *nz = 0;\n    \n    /* now continue scanning until you reach the end-of-comments */\n    do {\n      if (fgets(line,MM_MAX_LINE_LENGTH,f) == NULL) \n\treturn MM_PREMATURE_EOF;\n    } while (line[0] == '%');\n    \n    /* line[] is either blank or has M,N, nz */\n    if (SECURE_NONCHAR_SSCANF(line, \"%d %d %d\", M, N, nz) == 3) return 0;\n    else\n      do { \n\tnum_items_read = SECURE_NONCHAR_FSCANF(f, \"%d %d %d\", M, N, nz); \n\tif (num_items_read == EOF) return MM_PREMATURE_EOF;\n      }\n      while (num_items_read != 3);\n    \n    return 0;\n  }\n\n\n  inline int mm_read_mtx_crd_data(FILE *f, int, int, int nz, int I[],\n\t\t\t\t  int J[], double val[], MM_typecode matcode) {\n    int i;\n    if (mm_is_complex(matcode)) {\n      for (i=0; i<nz; i++)\n\tif (SECURE_NONCHAR_FSCANF(f, \"%d %d %lg %lg\", &I[i], &J[i],\n\t\t\t\t  &val[2*i], &val[2*i+1])\n\t    != 4) return MM_PREMATURE_EOF;\n    }\n    else if (mm_is_real(matcode)) {\n      for (i=0; i<nz; i++) {\n\tif (SECURE_NONCHAR_FSCANF(f, \"%d %d %lg\\n\", &I[i], &J[i], &val[i])\n\t    != 3) return MM_PREMATURE_EOF;\n\t\n      }\n    }\n    else if (mm_is_pattern(matcode)) {\n      for (i=0; i<nz; i++)\n\tif (SECURE_NONCHAR_FSCANF(f, \"%d %d\", &I[i], &J[i])\n\t    != 2) return MM_PREMATURE_EOF;\n    }\n    else return MM_UNSUPPORTED_TYPE;\n\n    return 0;\n  }\n\n  inline int mm_write_mtx_crd(const char *fname, int M, int N, int nz,\n\t\t\t      int I[], int J[], const double val[],\n\t\t\t      MM_typecode matcode) {\n    FILE *f;\n    int i;\n    \n    if (strcmp(fname, \"stdout\") == 0) \n      f = stdout;\n    else {\n      SECURE_FOPEN(&f, fname, \"w\");\n      if (f == NULL)\n        return MM_COULD_NOT_WRITE_FILE;\n    }\n    \n    /* print banner followed by typecode */\n    fprintf(f, \"%s \", MatrixMarketBanner);\n    char *str = mm_typecode_to_str(matcode);\n    fprintf(f, \"%s\\n\", str);\n    free(str);\n    \n    /* print matrix sizes and nonzeros */\n    fprintf(f, \"%d %d %d\\n\", M, N, nz);\n    \n    /* print values */\n    if (mm_is_pattern(matcode))\n      for (i=0; i<nz; i++)\n\tfprintf(f, \"%d %d\\n\", I[i], J[i]);\n    else\n      if (mm_is_real(matcode))\n        for (i=0; i<nz; i++)\n\t  fprintf(f, \"%d %d %20.16g\\n\", I[i], J[i], val[i]);\n      else\n\tif (mm_is_complex(matcode))\n\t  for (i=0; i<nz; i++)\n            fprintf(f, \"%d %d %20.16g %20.16g\\n\", I[i], J[i], val[2*i], \n\t\t    val[2*i+1]);\n\telse {\n\t  if (f != stdout) fclose(f);\n\t  return MM_UNSUPPORTED_TYPE;\n\t}\n    \n    if (f !=stdout) fclose(f); \n    return 0;\n  }\n  \n\n  /** matrix input/output for MatrixMarket storage */\n  class MatrixMarket_IO {\n    FILE *f;\n    bool isComplex, isSymmetric, isHermitian;\n    int row, col, nz;\n    MM_typecode matcode;\n  public:\n    MatrixMarket_IO() : f(0) {}\n    MatrixMarket_IO(const char *filename) : f(0) { open(filename); }\n    ~MatrixMarket_IO() { if (f) fclose(f); f = 0; }\n\n    int nrows() const { return row; }\n    int ncols() const { return col; }\n    int nnz() const { return nz; }\n    int is_complex() const { return isComplex; }\n    int is_symmetric() const { return isSymmetric; }\n    int is_hermitian() const { return isHermitian; }\n\n    /* open filename and reads header */\n    void open(const char *filename);\n    /* read opened file */\n    template <typename Matrix> void read(Matrix &A);\n    /* write a matrix */\n    template <typename T, int shift> static void \n    write(const char *filename, const csc_matrix<T, shift>& A);  \n    template <typename T, typename INDI, typename INDJ, int shift> static void \n    write(const char *filename,\n\t  const csc_matrix_ref<T*, INDI*, INDJ*, shift>& A);  \n    template <typename MAT> static void \n    write(const char *filename, const MAT& A);  \n  };\n\n  /** load a matrix-market file */\n  template <typename Matrix> inline void\n  MatrixMarket_load(const char *filename, Matrix& A) {\n    MatrixMarket_IO mm; mm.open(filename);\n    mm.read(A);\n  }\n  /** write a matrix-market file */\n  template <typename T, int shift> void\n  MatrixMarket_save(const char *filename, const csc_matrix<T, shift>& A) {\n    MatrixMarket_IO mm; mm.write(filename, A);\n  }\n\n  template <typename T, typename INDI, typename INDJ, int shift> inline void\n  MatrixMarket_save(const char *filename,\n\t\t    const csc_matrix_ref<T, INDI, INDJ, shift>& A) {\n    MatrixMarket_IO mm; mm.write(filename, A);\n  }\n\n\n  inline void MatrixMarket_IO::open(const char *filename) {\n    gmm::standard_locale sl;\n    if (f) { fclose(f); }\n    SECURE_FOPEN(&f, filename, \"r\");\n    GMM_ASSERT1(f, \"Sorry, cannot open file \" << filename);\n    int s1 = mm_read_banner(f, &matcode);\n    GMM_ASSERT1(s1 == 0, \"Sorry, cannnot find the matrix market banner in \"\n\t\t<< filename);\n    int s2 = mm_is_coordinate(matcode), s3 = mm_is_matrix(matcode);\n    GMM_ASSERT1(s2 > 0 && s3 > 0,\n\t\t\"file is not coordinate storage or is not a matrix\");\n    int s4 = mm_is_pattern(matcode);\n    GMM_ASSERT1(s4 == 0,\n\t       \"the file does only contain the pattern of a sparse matrix\");\n    int s5 = mm_is_skew(matcode);\n    GMM_ASSERT1(s5 == 0, \"not currently supporting skew symmetric\");\n    isSymmetric = mm_is_symmetric(matcode) || mm_is_hermitian(matcode); \n    isHermitian = mm_is_hermitian(matcode); \n    isComplex =   mm_is_complex(matcode);\n    mm_read_mtx_crd_size(f, &row, &col, &nz);\n  }\n\n  template <typename Matrix> void MatrixMarket_IO::read(Matrix &A) {\n    gmm::standard_locale sl;\n    typedef typename linalg_traits<Matrix>::value_type T;\n    GMM_ASSERT1(f, \"no file opened!\");\n    GMM_ASSERT1(!is_complex_double__(T()) || isComplex,\n\t\t\"Bad MM matrix format (complex matrix expected)\");\n    GMM_ASSERT1(is_complex_double__(T()) || !isComplex,\n\t\t\"Bad MM matrix format (real matrix expected)\");\n    A = Matrix(row, col);\n    gmm::clear(A);\n    \n    std::vector<int> I(nz), J(nz);\n    std::vector<typename Matrix::value_type> PR(nz);\n    mm_read_mtx_crd_data(f, row, col, nz, &I[0], &J[0],\n\t\t\t (double*)&PR[0], matcode);\n    \n    for (size_type i = 0; i < size_type(nz); ++i) {\n        A(I[i]-1, J[i]-1) = PR[i];\n\n        // FIXED MM Format\n        if (mm_is_hermitian(matcode) && (I[i] != J[i]) ) {\n            A(J[i]-1, I[i]-1) = gmm::conj(PR[i]);\n        }\n\n        if (mm_is_symmetric(matcode) && (I[i] != J[i]) ) {\n            A(J[i]-1, I[i]-1) = PR[i];\n        }\n\n        if (mm_is_skew(matcode) && (I[i] != J[i]) ) {\n            A(J[i]-1, I[i]-1) = -PR[i];\n        }\n    }\n  }\n\n  template <typename T, int shift> void \n  MatrixMarket_IO::write(const char *filename, const csc_matrix<T, shift>& A) {\n    write(filename, csc_matrix_ref<const T*, const unsigned*,\n\t  const unsigned*,shift>\n\t  (&A.pr[0], &A.ir[0], &A.jc[0], A.nr, A.nc));\n  }\n\n  template <typename T, typename INDI, typename INDJ, int shift> void \n  MatrixMarket_IO::write(const char *filename, \n\t\t\t const csc_matrix_ref<T*, INDI*, INDJ*, shift>& A) {\n    gmm::standard_locale sl;\n    static MM_typecode t1 = {'M', 'C', 'R', 'G'};\n    static MM_typecode t2 = {'M', 'C', 'C', 'G'};\n    MM_typecode t;\n    \n    if (is_complex_double__(T())) std::copy(&(t2[0]), &(t2[0])+4, &(t[0]));\n    else std::copy(&(t1[0]), &(t1[0])+4, &(t[0]));\n    size_type nz = A.jc[mat_ncols(A)];\n    std::vector<int> I(nz), J(nz);\n    for (size_type j=0; j < mat_ncols(A); ++j) {      \n      for (size_type i = A.jc[j]; i < A.jc[j+1]; ++i) {\n\tI[i] = A.ir[i] + 1 - shift;\n\tJ[i] = int(j + 1);\n      }\n    }\n    mm_write_mtx_crd(filename, int(mat_nrows(A)), int(mat_ncols(A)),\n\t\t     int(nz), &I[0], &J[0], (const double *)A.pr, t);\n  }\n\n\n  template <typename MAT> void\n  MatrixMarket_IO::write(const char *filename, const MAT& A) {\n    gmm::csc_matrix<typename gmm::linalg_traits<MAT>::value_type> \n      tmp(gmm::mat_nrows(A), gmm::mat_ncols(A));\n    gmm::copy(A,tmp); \n    MatrixMarket_IO::write(filename, tmp);\n  }\n\n  template<typename VEC> static void vecsave(std::string fname, const VEC& V) {\n    std::ofstream f(fname.c_str()); f.precision(16); f.imbue(std::locale(\"C\"));\n    for (size_type i=0; i < gmm::vect_size(V); ++i) f << V[i] << \"\\n\"; \n  } \n\n  template<typename VEC> static void vecload(std::string fname,\n\t\t\t\t\t     const VEC& V_) {\n    VEC &V(const_cast<VEC&>(V_));\n    std::ifstream f(fname.c_str()); f.imbue(std::locale(\"C\"));\n    for (size_type i=0; i < gmm::vect_size(V); ++i) f >> V[i]; \n  }\n}\n\n\n#endif //  GMM_INOUTPUT_H\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_interface.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2002-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n\n/**@file gmm_interface.h\n   @author  Yves Renard <Yves.Renard@insa-lyon.fr>\n   @date October 13, 2002.\n   @brief gmm interface for STL vectors.\n*/\n\n#ifndef GMM_INTERFACE_H__\n#define GMM_INTERFACE_H__\n\n#include \"gmm_blas.h\"\n#include \"gmm_sub_index.h\"\n\nnamespace gmm {\n\n  /* ********************************************************************* */\n  /*                                                                       */\n  /* What is needed for a Vector type :                                    */\n  /*   Vector v(n) defines a vector with n components.                     */\n  /*   v[i] allows to access to the ith component of v.                    */\n  /*   linalg_traits<Vector> should be filled with appropriate definitions */\n  /*                                                                       */\n  /*   for a dense vector : the minimum is two random iterators (begin and */\n  /*                        end) and a pointer to a valid origin.          */\n  /*   for a sparse vector : the minimum is two forward iterators, with    */\n  /*                         a method it.index() which gives the index of  */\n  /*                         a non zero element, an interface object       */\n  /*                         should describe the method to add new non     */\n  /*                         zero element, and  a pointer to a valid       */\n  /*                         origin.                                       */\n  /*                                                                       */\n  /* What is needed for a Matrix type :                                    */\n  /*   Matrix m(n, m) defines a matrix with n rows and m columns.          */\n  /*   m(i, j) allows to access to the element at row i and column j.      */\n  /*   linalg_traits<Matrix> should be filled with appropriate definitions */\n  /*                                                                       */\n  /* What is needed for an iterator on dense vector                        */\n  /*    to be standard random access iterator                              */\n  /*                                                                       */\n  /* What is needed for an iterator on a sparse vector                     */\n  /*    to be a standard bidirectional iterator                            */\n  /*    elt should be sorted with increasing indices.                      */\n  /*    it.index() gives the index of the non-zero element.                */\n  /*                                                                       */\n  /* Remark : If original iterators are not convenient, they could be      */\n  /*   redefined and interfaced in linalg_traits<Vector> without changing  */\n  /*   the original Vector type.                                           */\n  /*                                                                       */\n  /* ********************************************************************* */\n\n  /* ********************************************************************* */\n  /*\t\tSimple references on vectors            \t\t   */\n  /* ********************************************************************* */\n\n  template <typename PT> struct simple_vector_ref {\n    typedef simple_vector_ref<PT> this_type;\n    typedef typename std::iterator_traits<PT>::value_type V;\n    typedef V * CPT;\n    typedef typename std::iterator_traits<PT>::reference ref_V;\n    typedef typename linalg_traits<this_type>::iterator iterator;\n    typedef typename linalg_traits<this_type>::reference reference;\n    typedef typename linalg_traits<this_type>::porigin_type porigin_type;\n\n    iterator begin_, end_;\n    porigin_type origin;\n    size_type size_;\n\n    simple_vector_ref(ref_V v) : begin_(vect_begin(const_cast<V&>(v))), \n\t\t\t\t end_(vect_end(const_cast<V&>(v))), \n\t\t\t\t origin(linalg_origin(const_cast<V&>(v))),\n\t\t\t\t size_(vect_size(v)) {}\n\n    simple_vector_ref(const simple_vector_ref<CPT> &cr)\n      : begin_(cr.begin_),end_(cr.end_),origin(cr.origin),size_(cr.size_) {}\n\n    simple_vector_ref(void) {}\n\n    reference operator[](size_type i) const\n    { return linalg_traits<V>::access(origin, begin_, end_, i); }\n  };\n\n  template <typename IT, typename ORG, typename PT> inline\n  void set_to_begin(IT &it, ORG o, simple_vector_ref<PT> *,linalg_modifiable) {\n    typedef typename linalg_traits<simple_vector_ref<PT> >::V_reference ref_t;\n    set_to_begin(it, o, PT(), ref_t());\n  }\n\n  template <typename IT, typename ORG, typename PT> inline\n  void set_to_begin(IT &it, ORG o, const simple_vector_ref<PT> *,\n\t\t    linalg_modifiable) {\n    typedef typename linalg_traits<simple_vector_ref<PT> >::V_reference ref_t;\n    set_to_begin(it, o, PT(), ref_t());\n  }\n\n  template <typename IT, typename ORG, typename PT> inline\n  void set_to_end(IT &it, ORG o, simple_vector_ref<PT> *, linalg_modifiable) {\n    typedef typename linalg_traits<simple_vector_ref<PT> >::V_reference ref_t;\n    set_to_end(it, o, PT(), ref_t());\n  }\n\n  template <typename IT, typename ORG, typename PT> inline\n  void set_to_end(IT &it, ORG o, const simple_vector_ref<PT> *,\n\t\t  linalg_modifiable) {\n    typedef typename linalg_traits<simple_vector_ref<PT> >::V_reference ref_t;\n    set_to_end(it, o, PT(), ref_t());\n  }\n\n\n  template <typename PT> struct linalg_traits<simple_vector_ref<PT> > {\n    typedef simple_vector_ref<PT> this_type;\n    typedef this_type *pthis_type;\n    typedef typename std::iterator_traits<PT>::value_type V;\n    typedef typename linalg_traits<V>::origin_type origin_type;\n    typedef V *pV;\n    typedef typename linalg_traits<V>::is_reference V_reference;\n    typedef typename which_reference<PT>::is_reference is_reference;\n    typedef abstract_vector linalg_type;\n    typedef typename linalg_traits<V>::value_type value_type;\n    typedef typename select_ref<value_type, typename\n            linalg_traits<V>::reference, PT>::ref_type reference;\n    typedef typename select_ref<const origin_type *, origin_type *,\n\t\t\t        PT>::ref_type porigin_type;\n    typedef typename select_ref<typename linalg_traits<V>::const_iterator,\n\t    typename linalg_traits<V>::iterator, PT>::ref_type iterator;\n    typedef typename linalg_traits<V>::const_iterator const_iterator;\n    typedef typename linalg_traits<V>::storage_type storage_type;\n    typedef linalg_true index_sorted;\n    static size_type size(const this_type &v) { return v.size_; }\n    static inline iterator begin(this_type &v) {\n      iterator it = v.begin_;\n      set_to_begin(it, v.origin, pthis_type(), is_reference()); \n      return it;\n    }\n    static inline const_iterator begin(const this_type &v) {\n      const_iterator it = v.begin_;\n      set_to_begin(it, v.origin, pthis_type(), is_reference());\n      return it;\n    }\n    static inline iterator end(this_type &v) {\n      iterator it = v.end_;\n      set_to_end(it, v.origin, pthis_type(), is_reference());\n      return it;\n    }\n    static inline const_iterator end(const this_type &v) {\n      const_iterator it = v.end_;\n      set_to_end(it, v.origin, pthis_type(), is_reference());\n      return it;\n    }\n    static origin_type* origin(this_type &v) { return v.origin; }\n    static const origin_type* origin(const this_type &v) { return v.origin; }\n    static void clear(origin_type* o, const iterator &it, const iterator &ite)\n    { linalg_traits<V>::clear(o, it, ite); }\n    static void do_clear(this_type &v) { clear(v.origin, v.begin_, v.end_); }\n    static value_type access(const origin_type *o, const const_iterator &it,\n\t\t\t     const const_iterator &ite, size_type i)\n    { return linalg_traits<V>::access(o, it, ite, i); }\n    static reference access(origin_type *o, const iterator &it,\n\t\t\t    const iterator &ite, size_type i)\n    { return linalg_traits<V>::access(o, it, ite, i); }\n  };\n\n  template <typename PT>\n  std::ostream &operator << (std::ostream &o, const simple_vector_ref<PT>& v)\n  { gmm::write(o,v); return o; }\n\n  /* ********************************************************************* */\n  /*\t\t                                         \t\t   */\n  /*\t\tTraits for S.T.L. object                     \t\t   */\n  /*\t\t                                         \t\t   */\n  /* ********************************************************************* */\n\n  template <typename T, typename alloc>\n  struct linalg_traits<std::vector<T, alloc> > {\n    typedef std::vector<T, alloc> this_type;\n    typedef this_type origin_type;\n    typedef linalg_false is_reference;\n    typedef abstract_vector linalg_type;\n    typedef T value_type;\n    typedef T& reference;\n    typedef typename this_type::iterator iterator;\n    typedef typename this_type::const_iterator const_iterator;\n    typedef abstract_dense storage_type;\n    typedef linalg_true index_sorted;\n    static size_type size(const this_type &v) { return v.size(); }\n    static iterator begin(this_type &v) { return v.begin(); }\n    static const_iterator begin(const this_type &v) { return v.begin(); }\n    static iterator end(this_type &v) { return v.end(); }\n    static const_iterator end(const this_type &v) { return v.end(); }\n    static origin_type* origin(this_type &v) { return &v; }\n    static const origin_type* origin(const this_type &v) { return &v; }\n    static void clear(origin_type*, const iterator &it, const iterator &ite)\n    { std::fill(it, ite, value_type(0)); }\n    static void do_clear(this_type &v) { std::fill(v.begin(), v.end(), T(0)); }\n    static value_type access(const origin_type *, const const_iterator &it,\n\t\t\t     const const_iterator &, size_type i)\n    { return it[i]; }\n    static reference access(origin_type *, const iterator &it,\n\t\t\t    const iterator &, size_type i)\n    { return it[i]; }\n    static void resize(this_type &v, size_type n) { v.resize(n); }\n  };\n}\nnamespace std {\n  template <typename T> ostream &operator <<\n  (std::ostream &o, const vector<T>& m) { gmm::write(o,m); return o; }\n}\nnamespace gmm {\n\n  template <typename T>\n  inline size_type nnz(const std::vector<T>& l) { return l.size(); }\n\n  /* ********************************************************************* */\n  /*\t\t                                         \t\t   */\n  /*\t\tTraits for ref objects                     \t\t   */\n  /*\t\t                                         \t\t   */\n  /* ********************************************************************* */\n\n  template <typename IT, typename V>\n  struct tab_ref_with_origin : public gmm::tab_ref<IT> {\n    typedef tab_ref_with_origin<IT, V> this_type;\n    // next line replaced by the 4 following lines in order to please aCC\n    //typedef typename linalg_traits<this_type>::porigin_type porigin_type;\n    typedef typename linalg_traits<V>::origin_type origin_type;\n    typedef typename std::iterator_traits<IT>::pointer PT;\n    typedef typename select_ref<const origin_type *, origin_type *,\n\t\t\t\tPT>::ref_type porigin_type;\n   \n\n    porigin_type origin;\n   \n    tab_ref_with_origin(void) {}\n    template <class PT> tab_ref_with_origin(const IT &b, const IT &e, PT p)\n      : gmm::tab_ref<IT>(b,e), origin(porigin_type(p)) {}\n    tab_ref_with_origin(const IT &b, const IT &e, porigin_type p)\n      : gmm::tab_ref<IT>(b,e), origin(p) {}\n   \n    tab_ref_with_origin(const V &v, const sub_interval &si)\n      : gmm::tab_ref<IT>(vect_begin(const_cast<V&>(v))+si.min,\n\t\t\t vect_begin(const_cast<V&>(v))+si.max),\n        origin(linalg_origin(const_cast<V&>(v))) {}\n    tab_ref_with_origin(V &v, const sub_interval &si)\n      : gmm::tab_ref<IT>(vect_begin(const_cast<V&>(v))+si.min,\n\t\t\t vect_begin(const_cast<V&>(v))+si.max),\n        origin(linalg_origin(const_cast<V&>(v))) {}\n  };\n\n  template <typename IT, typename V>\n  struct linalg_traits<tab_ref_with_origin<IT, V> > {\n    typedef typename std::iterator_traits<IT>::pointer PT;\n    typedef typename linalg_traits<V>::origin_type origin_type;\n    typedef tab_ref_with_origin<IT, V> this_type;\n    typedef typename which_reference<PT>::is_reference is_reference;\n    typedef abstract_vector linalg_type;\n    typedef typename select_ref<const origin_type *, origin_type *,\n\t\t\t\tPT>::ref_type porigin_type;\n    typedef typename std::iterator_traits<IT>::value_type value_type;\n    typedef typename std::iterator_traits<IT>::reference reference;\n    typedef typename this_type::iterator iterator;\n    typedef typename this_type::iterator const_iterator;\n    typedef abstract_dense storage_type;\n    typedef linalg_true index_sorted;\n    static size_type size(const this_type &v) { return v.size(); }\n    static iterator begin(this_type &v) { return v.begin(); }\n    static const_iterator begin(const this_type &v) { return v.begin(); }\n    static iterator end(this_type &v) { return v.end(); }\n    static const_iterator end(const this_type &v) { return v.end(); }\n    static origin_type* origin(this_type &v) { return v.origin; }\n    static const origin_type* origin(const this_type &v) { return v.origin; }\n    static void clear(origin_type*, const iterator &it, const iterator &ite)\n    { std::fill(it, ite, value_type(0)); }\n    static inline void do_clear(this_type &v)\n    { std::fill(v.begin(), v.end(), value_type(0)); }\n    static value_type access(const origin_type *, const const_iterator &it,\n\t\t\t     const const_iterator &, size_type i)\n    { return it[i]; }\n    static reference access(origin_type *, const iterator &it, \n\t\t\t    const iterator &, size_type i)\n    { return it[i]; }\n  };\n\n  template <typename IT, typename V> std::ostream &operator <<\n  (std::ostream &o, const tab_ref_with_origin<IT, V>& m)\n  { gmm::write(o,m); return o; }\n\n\n  template <typename IT, typename V>\n  struct tab_ref_reg_spaced_with_origin : public gmm::tab_ref_reg_spaced<IT> {\n    typedef  tab_ref_reg_spaced_with_origin<IT, V> this_type;\n    typedef typename linalg_traits<this_type>::porigin_type porigin_type;\n\n    porigin_type origin;\n    \n    tab_ref_reg_spaced_with_origin(void) {}\n    tab_ref_reg_spaced_with_origin(const IT &b, size_type n, size_type s,\n\t\t\t\t   const porigin_type p)\n      : gmm::tab_ref_reg_spaced<IT>(b,n,s), origin(p) {}\n    tab_ref_reg_spaced_with_origin(const V &v, const sub_slice &si)\n      : gmm::tab_ref_reg_spaced<IT>(vect_begin(const_cast<V&>(v)) + si.min, \n\t\t\t\t    si.N, (si.max - si.min)/si.N),\n      origin(linalg_origin(const_cast<V&>(v))) {}\n    tab_ref_reg_spaced_with_origin(V &v, const sub_slice &si)\n      : gmm::tab_ref_reg_spaced<IT>(vect_begin(const_cast<V&>(v)) + si.min,\n\t\t\t\t    si.N, (si.max - si.min)/si.N),\n\torigin(linalg_origin(const_cast<V&>(v))) {}\n  };\n\n  template <typename IT, typename V> \n  struct linalg_traits<tab_ref_reg_spaced_with_origin<IT, V> > {\n    typedef typename std::iterator_traits<IT>::pointer PT;\n    typedef tab_ref_reg_spaced_with_origin<IT, V> this_type;\n    typedef typename linalg_traits<V>::origin_type origin_type;\n    typedef typename select_ref<const origin_type *, origin_type *,\n\t\t\t\tPT>::ref_type porigin_type;\n    typedef typename which_reference<PT>::is_reference is_reference;\n    typedef abstract_vector linalg_type;\n    typedef typename std::iterator_traits<IT>::value_type value_type;\n    typedef typename std::iterator_traits<IT>::reference reference;\n    typedef typename this_type::iterator iterator;\n    typedef typename this_type::iterator const_iterator;\n    typedef abstract_dense storage_type;\n    typedef linalg_true index_sorted;\n    static size_type size(const this_type &v) { return v.size(); }\n    static iterator begin(this_type &v) { return v.begin(); }\n    static const_iterator begin(const this_type &v) { return v.begin(); }\n    static iterator end(this_type &v) { return v.end(); }\n    static const_iterator end(const this_type &v) { return v.end(); }\n    static origin_type* origin(this_type &v) { return v.origin; }\n    static const origin_type* origin(const this_type &v) { return v.origin; }\n    static void clear(origin_type*, const iterator &it, const iterator &ite)\n    { std::fill(it, ite, value_type(0)); }\n    static void do_clear(this_type &v)\n    { std::fill(v.begin(), v.end(), value_type(0)); }\n    static value_type access(const origin_type *, const const_iterator &it,\n\t\t\t     const const_iterator &, size_type i)\n    { return it[i]; }\n    static reference access(origin_type *, const iterator &it, \n\t\t\t    const iterator &, size_type i)\n    { return it[i]; }\n  };\n  \n  template <typename IT, typename V> std::ostream &operator <<\n  (std::ostream &o, const tab_ref_reg_spaced_with_origin<IT, V>& m)\n  { gmm::write(o,m); return o; }\n\n\n  template <typename IT, typename ITINDEX, typename V>\n  struct tab_ref_index_ref_with_origin \n    : public gmm::tab_ref_index_ref<IT, ITINDEX> {\n    typedef tab_ref_index_ref_with_origin<IT, ITINDEX, V> this_type;\n    typedef typename linalg_traits<this_type>::porigin_type porigin_type;\n\n    porigin_type origin;\n\n    tab_ref_index_ref_with_origin(void) {}\n    tab_ref_index_ref_with_origin(const IT &b, const ITINDEX &bi,\n\t\t\t\t  const ITINDEX &ei, porigin_type p)\n      : gmm::tab_ref_index_ref<IT, ITINDEX>(b, bi, ei), origin(p) {}\n\n    tab_ref_index_ref_with_origin(const V &v, const sub_index &si)\n      : gmm::tab_ref_index_ref<IT, ITINDEX>(vect_begin(const_cast<V&>(v)),\n\t\t\t\t\t    si.begin(), si.end()),\n      origin(linalg_origin(const_cast<V&>(v))) {}\n    tab_ref_index_ref_with_origin(V &v, const sub_index &si)\n      : gmm::tab_ref_index_ref<IT, ITINDEX>(vect_begin(const_cast<V&>(v)),\n\t\t\t\t\t    si.begin(), si.end()),\n\torigin(linalg_origin(const_cast<V&>(v))) {}\n  };\n\n  template <typename IT, typename ITINDEX, typename V>\n  struct linalg_traits<tab_ref_index_ref_with_origin<IT, ITINDEX, V> > {\n    typedef typename std::iterator_traits<IT>::pointer PT;\n    typedef tab_ref_index_ref_with_origin<IT, ITINDEX, V> this_type;\n    typedef typename linalg_traits<V>::origin_type origin_type;\n    typedef typename select_ref<const origin_type *, origin_type *,\n\t\t\t\tPT>::ref_type porigin_type;\n    typedef typename which_reference<PT>::is_reference is_reference;\n    typedef abstract_vector linalg_type;\n    typedef typename std::iterator_traits<IT>::value_type value_type;\n    typedef typename std::iterator_traits<IT>::reference reference;\n    typedef typename this_type::iterator iterator;\n    typedef typename this_type::iterator const_iterator;\n    typedef abstract_dense storage_type;\n    typedef linalg_true index_sorted;\n    static size_type size(const this_type &v) { return v.size(); }\n    static iterator begin(this_type &v) { return v.begin(); }\n    static const_iterator begin(const this_type &v) { return v.begin(); }\n    static iterator end(this_type &v) { return v.end(); }\n    static const_iterator end(const this_type &v) { return v.end(); }\n    static origin_type* origin(this_type &v) { return v.origin; }\n    static const origin_type* origin(const this_type &v) { return v.origin; }\n    static void clear(origin_type*, const iterator &it, const iterator &ite)\n    { std::fill(it, ite, value_type(0)); }\n    static void do_clear(this_type &v)\n    { std::fill(v.begin(), v.end(), value_type(0)); }\n    static value_type access(const origin_type *, const const_iterator &it,\n\t\t\t     const const_iterator &, size_type i)\n    { return it[i]; }\n    static reference access(origin_type *, const iterator &it,\n\t\t\t    const iterator &, size_type i)\n    { return it[i]; }\n  };\n\n  template <typename IT, typename ITINDEX, typename V>\n  std::ostream &operator <<\n  (std::ostream &o, const tab_ref_index_ref_with_origin<IT, ITINDEX, V>& m)\n  { gmm::write(o,m); return o; }\n\n\n  template<typename ITER, typename MIT, typename PT> \n  struct dense_compressed_iterator {\n    typedef ITER value_type;\n    typedef ITER *pointer;\n    typedef ITER &reference;\n    typedef ptrdiff_t difference_type;\n    typedef std::random_access_iterator_tag iterator_category;\n    typedef size_t size_type;\n    typedef dense_compressed_iterator<ITER, MIT, PT> iterator;\n    typedef typename std::iterator_traits<PT>::value_type *MPT;\n\n    ITER it;\n    size_type N, nrows, ncols, i;\n    PT origin;\n    \n    iterator operator ++(int) { iterator tmp = *this; i++; return tmp; }\n    iterator operator --(int) { iterator tmp = *this; i--; return tmp; }\n    iterator &operator ++()   { ++i; return *this; }\n    iterator &operator --()   { --i; return *this; }\n    iterator &operator +=(difference_type ii) { i += ii; return *this; }\n    iterator &operator -=(difference_type ii) { i -= ii; return *this; }\n    iterator operator +(difference_type ii) const \n    { iterator itt = *this; return (itt += ii); }\n    iterator operator -(difference_type ii) const\n    { iterator itt = *this; return (itt -= ii); }\n    difference_type operator -(const iterator &ii) const\n    { return (N ? (it - ii.it) / N : 0) + i - ii.i; }\n\n    ITER operator *() const { return it+i*N; }\n    ITER operator [](int ii) const { return it + (i+ii) * N; }\n\n    bool operator ==(const iterator &ii) const\n    { return (*this - ii) == difference_type(0); }\n    bool operator !=(const iterator &ii) const { return !(ii == *this); }\n    bool operator < (const iterator &ii) const\n    { return (*this - ii) < difference_type(0); }\n\n    dense_compressed_iterator(void) {}\n    dense_compressed_iterator(const dense_compressed_iterator<MIT,MIT,MPT> &ii)\n      : it(ii.it), N(ii.N), nrows(ii.nrows), ncols(ii.ncols), i(ii.i),\n\torigin(ii.origin)  {}\n    dense_compressed_iterator(const ITER &iter, size_type n, size_type r,\n\t\t\t      size_type c, size_type ii, PT o)\n      : it(iter), N(n), nrows(r), ncols(c), i(ii), origin(o) { }\n    \n  };\n\n  /* ******************************************************************** */\n  /*\t    Read only reference on a compressed sparse vector             */\n  /* ******************************************************************** */\n\n  template <typename PT1, typename PT2, int shift = 0>\n  struct cs_vector_ref_iterator {\n    PT1 pr;\n    PT2 ir;\n\n    typedef typename std::iterator_traits<PT1>::value_type value_type;\n    typedef PT1 pointer;\n    typedef typename std::iterator_traits<PT1>::reference  reference;\n    typedef size_t        size_type;\n    typedef ptrdiff_t     difference_type;\n    typedef std::bidirectional_iterator_tag iterator_category;\n    typedef cs_vector_ref_iterator<PT1, PT2, shift> iterator;\n    \n    cs_vector_ref_iterator(void) {}\n    cs_vector_ref_iterator(PT1 p1, PT2 p2) : pr(p1), ir(p2) {}\n\n    inline size_type index(void) const { return (*ir) - shift; }\n    iterator &operator ++() { ++pr; ++ir; return *this; }\n    iterator operator ++(int) { iterator tmp = *this; ++(*this); return tmp; }\n    iterator &operator --() { --pr; --ir; return *this; }\n    iterator operator --(int) { iterator tmp = *this; --(*this); return tmp; }\n    \n    reference operator  *() const { return *pr; }\n    pointer   operator ->() const { return pr; }\n    \n    bool operator ==(const iterator &i) const { return (i.pr==pr);}\n    bool operator !=(const iterator &i) const { return (i.pr!=pr);}\n  };\n    \n  template <typename PT1, typename PT2, int shift = 0> struct cs_vector_ref {\n    PT1 pr;\n    PT2 ir;\n    size_type n, size_;\n\n    typedef cs_vector_ref<PT1, PT2, shift> this_type;\n    typedef typename std::iterator_traits<PT1>::value_type value_type;\n    typedef typename linalg_traits<this_type>::const_iterator const_iterator;\n\n    cs_vector_ref(PT1 pt1, PT2 pt2, size_type nnz, size_type ns)\n      : pr(pt1), ir(pt2), n(nnz), size_(ns) {}\n    cs_vector_ref(void) {}\n\n    size_type size(void) const { return size_; }\n    \n    const_iterator begin(void) const { return const_iterator(pr, ir); }\n    const_iterator end(void) const { return const_iterator(pr+n, ir+n); }\n    \n    value_type operator[](size_type i) const\n    { return linalg_traits<this_type>::access(pr, begin(), end(),i); }\n  };\n\n  template <typename PT1, typename PT2, int shift>\n  struct linalg_traits<cs_vector_ref<PT1, PT2, shift> > {\n    typedef cs_vector_ref<PT1, PT2, shift> this_type;\n    typedef linalg_const is_reference;\n    typedef abstract_vector linalg_type;\n    typedef typename std::iterator_traits<PT1>::value_type value_type;\n    typedef value_type origin_type;\n    typedef typename std::iterator_traits<PT1>::value_type reference;\n    typedef cs_vector_ref_iterator<typename const_pointer<PT1>::pointer,\n\t    typename const_pointer<PT2>::pointer, shift>  const_iterator;\n    typedef abstract_null_type iterator;\n    typedef abstract_sparse storage_type;\n    typedef linalg_true index_sorted;\n    static size_type size(const this_type &v) { return v.size(); }\n    static iterator begin(this_type &v) { return v.begin(); }\n    static const_iterator begin(const this_type &v) { return v.begin(); }\n    static iterator end(this_type &v) { return v.end(); }\n    static const_iterator end(const this_type &v) { return v.end(); }\n    static const origin_type* origin(const this_type &v) { return v.pr; }\n    static value_type access(const origin_type *, const const_iterator &b,\n\t\t\t     const const_iterator &e, size_type i) {\n      if (b.ir == e.ir) return value_type(0);\n      PT2 p = std::lower_bound(b.ir, e.ir, i+shift);\n      return (*p == i+shift && p != e.ir) ? b.pr[p-b.ir] : value_type(0);\n    }\n  };\n\n  template <typename PT1, typename PT2, int shift>\n  std::ostream &operator <<\n  (std::ostream &o, const cs_vector_ref<PT1, PT2, shift>& m)\n  { gmm::write(o,m); return o; }\n\n  template <typename PT1, typename PT2, int shift>\n  inline size_type nnz(const cs_vector_ref<PT1, PT2, shift>& l) { return l.n; }\n\n  /* ******************************************************************** */\n  /*\t    Read only reference on a compressed sparse column matrix      */\n  /* ******************************************************************** */\n\n  template <typename PT1, typename PT2, typename PT3, int shift = 0>\n  struct sparse_compressed_iterator {\n    typedef typename std::iterator_traits<PT1>::value_type value_type;\n    typedef const value_type *pointer;\n    typedef const value_type &reference;\n    typedef ptrdiff_t difference_type;\n    typedef size_t size_type;\n    typedef std::random_access_iterator_tag iterator_category;\n    typedef sparse_compressed_iterator<PT1, PT2, PT3, shift> iterator;\n\n    PT1 pr;\n    PT2 ir;\n    PT3 jc;\n    size_type n;\n    const value_type *origin;\n    \n    iterator operator ++(int) { iterator tmp = *this; jc++; return tmp; }\n    iterator operator --(int) { iterator tmp = *this; jc--; return tmp; }\n    iterator &operator ++()   { jc++; return *this; }\n    iterator &operator --()   { jc--; return *this; }\n    iterator &operator +=(difference_type i) { jc += i; return *this; }\n    iterator &operator -=(difference_type i) { jc -= i; return *this; }\n    iterator operator +(difference_type i) const \n    { iterator itt = *this; return (itt += i); }\n    iterator operator -(difference_type i) const\n    { iterator itt = *this; return (itt -= i); }\n    difference_type operator -(const iterator &i) const { return jc - i.jc; }\n\n    reference operator *() const { return pr + *jc - shift; }\n    reference operator [](int ii) { return pr + *(jc+ii) - shift; }\n\n    bool operator ==(const iterator &i) const { return (jc == i.jc); }\n    bool operator !=(const iterator &i) const { return !(i == *this); }\n    bool operator < (const iterator &i) const { return (jc < i.jc); }\n\n    sparse_compressed_iterator(void) {}\n    sparse_compressed_iterator(PT1 p1, PT2 p2, PT3 p3, size_type nn,\n\t\t\t       const value_type *o)\n      : pr(p1), ir(p2), jc(p3), n(nn), origin(o) { }\n    \n  };\n\n  template <typename PT1, typename PT2, typename PT3, int shift = 0>\n  struct csc_matrix_ref {\n    PT1 pr; // values.\n    PT2 ir; // row indexes.\n    PT3 jc; // column repartition on pr and ir.\n    size_type nc, nr;\n    \n    typedef typename std::iterator_traits<PT1>::value_type value_type;\n    csc_matrix_ref(PT1 pt1, PT2 pt2, PT3 pt3, size_type nrr, size_type ncc)\n      : pr(pt1), ir(pt2), jc(pt3), nc(ncc), nr(nrr) {}\n    csc_matrix_ref(void) {}\n    \n    size_type nrows(void) const { return nr; }\n    size_type ncols(void) const { return nc; }\n   \n    value_type operator()(size_type i, size_type j) const\n      { return mat_col(*this, j)[i]; }\n  };\n\n  template <typename PT1, typename PT2, typename PT3, int shift>\n  struct linalg_traits<csc_matrix_ref<PT1, PT2, PT3, shift> > {\n    typedef csc_matrix_ref<PT1, PT2, PT3, shift> this_type;\n    typedef linalg_const is_reference;\n    typedef abstract_matrix linalg_type;\n    typedef typename std::iterator_traits<PT1>::value_type value_type;\n    typedef typename std::iterator_traits<PT1>::value_type reference;\n    typedef value_type origin_type;\n    typedef abstract_sparse storage_type;\n    typedef abstract_null_type sub_row_type;\n    typedef abstract_null_type const_sub_row_type;\n    typedef abstract_null_type row_iterator;\n    typedef abstract_null_type const_row_iterator;\n    typedef abstract_null_type sub_col_type;\n    typedef cs_vector_ref<typename const_pointer<PT1>::pointer,\n            typename const_pointer<PT2>::pointer, shift> const_sub_col_type;\n    typedef sparse_compressed_iterator<typename const_pointer<PT1>::pointer,\n\t\t\t\t       typename const_pointer<PT2>::pointer,\n\t\t\t\t       typename const_pointer<PT3>::pointer,\n\t\t\t\t       shift>  const_col_iterator;\n    typedef abstract_null_type col_iterator;\n    typedef col_major sub_orientation;\n    typedef linalg_true index_sorted;\n    static size_type nrows(const this_type &m) { return m.nrows(); }\n    static size_type ncols(const this_type &m) { return m.ncols(); }\n    static const_col_iterator col_begin(const this_type &m)\n    { return const_col_iterator(m.pr, m.ir, m.jc, m.nr, m.pr); }\n    static const_col_iterator col_end(const this_type &m)\n    { return const_col_iterator(m.pr, m.ir, m.jc + m.nc, m.nr, m.pr); }\n    static const_sub_col_type col(const const_col_iterator &it) {\n      return const_sub_col_type(it.pr + *(it.jc) - shift,\n\t     it.ir + *(it.jc) - shift, *(it.jc + 1) - *(it.jc), it.n);\n    }\n    static const origin_type* origin(const this_type &m) { return m.pr; }\n    static value_type access(const const_col_iterator &itcol, size_type j)\n    { return col(itcol)[j]; }\n  };\n\n\n  template <typename PT1, typename PT2, typename PT3, int shift>\n  std::ostream &operator <<\n  (std::ostream &o, const csc_matrix_ref<PT1, PT2, PT3, shift>& m)\n  { gmm::write(o,m); return o; }\n\n  /* ******************************************************************** */\n  /*\t   Read only reference on a compressed sparse row matrix          */\n  /* ******************************************************************** */\n\n  template <typename PT1, typename PT2, typename PT3, int shift = 0>\n  struct csr_matrix_ref {\n    PT1 pr; // values.\n    PT2 ir; // column indexes.\n    PT3 jc; // row repartition on pr and ir.\n    size_type nc, nr;\n    \n    typedef typename std::iterator_traits<PT1>::value_type value_type;\n    csr_matrix_ref(PT1 pt1, PT2 pt2, PT3 pt3, size_type nrr, size_type ncc)\n      : pr(pt1), ir(pt2), jc(pt3), nc(ncc), nr(nrr) {}\n    csr_matrix_ref(void) {}\n    \n    size_type nrows(void) const { return nr; }\n    size_type ncols(void) const { return nc; }\n   \n    value_type operator()(size_type i, size_type j) const\n      { return mat_row(*this, i)[j]; }\n  };\n  \n  template <typename PT1, typename PT2, typename PT3, int shift>\n  struct linalg_traits<csr_matrix_ref<PT1, PT2, PT3, shift> > {\n    typedef csr_matrix_ref<PT1, PT2, PT3, shift> this_type;\n    typedef linalg_const is_reference;\n    typedef abstract_matrix linalg_type;\n    typedef typename std::iterator_traits<PT1>::value_type value_type;\n    typedef typename std::iterator_traits<PT1>::value_type reference;\n    typedef value_type origin_type;\n    typedef abstract_sparse storage_type;\n    typedef abstract_null_type sub_col_type;\n    typedef abstract_null_type const_sub_col_type;\n    typedef abstract_null_type col_iterator;\n    typedef abstract_null_type const_col_iterator;\n    typedef abstract_null_type sub_row_type;\n    typedef cs_vector_ref<typename const_pointer<PT1>::pointer,\n\t\t\t  typename const_pointer<PT2>::pointer, shift>\n            const_sub_row_type;\n    typedef sparse_compressed_iterator<typename const_pointer<PT1>::pointer,\n\t\t\t\t       typename const_pointer<PT2>::pointer,\n\t\t\t\t       typename const_pointer<PT3>::pointer,\n\t\t\t\t       shift>  const_row_iterator;\n    typedef abstract_null_type row_iterator;\n    typedef row_major sub_orientation;\n    typedef linalg_true index_sorted;\n    static size_type nrows(const this_type &m) { return m.nrows(); }\n    static size_type ncols(const this_type &m) { return m.ncols(); }\n    static const_row_iterator row_begin(const this_type &m)\n    { return const_row_iterator(m.pr, m.ir, m.jc, m.nc, m.pr); }\n    static const_row_iterator row_end(const this_type &m)\n    { return const_row_iterator(m.pr, m.ir, m.jc + m.nr, m.nc, m.pr); }\n    static const_sub_row_type row(const const_row_iterator &it) {\n      return const_sub_row_type(it.pr + *(it.jc) - shift,\n\t     it.ir + *(it.jc) - shift, *(it.jc + 1) - *(it.jc), it.n);\n    }\n    static const origin_type* origin(const this_type &m) { return m.pr; }\n    static value_type access(const const_row_iterator &itrow, size_type j)\n    { return row(itrow)[j]; }\n  };\n\n  template <typename PT1, typename PT2, typename PT3, int shift>\n  std::ostream &operator <<\n  (std::ostream &o, const csr_matrix_ref<PT1, PT2, PT3, shift>& m)\n  { gmm::write(o,m); return o; }\n\n  /* ********************************************************************* */\n  /*\t\t                                         \t\t   */\n  /*\t\tSimple interface for C arrays                     \t   */\n  /*\t\t                                         \t\t   */\n  /* ********************************************************************* */\n\n  template <class PT> struct array1D_reference {\n\n    typedef typename std::iterator_traits<PT>::value_type value_type;\n\n    PT begin, end;\n    \n    const value_type &operator[](size_type i) const { return *(begin+i); }\n    value_type &operator[](size_type i) { return *(begin+i); }\n\n    array1D_reference(PT begin_, size_type s) : begin(begin_), end(begin_+s) {}\n  };\n\n  template <typename PT>\n  struct linalg_traits<array1D_reference<PT> > {\n    typedef array1D_reference<PT> this_type;\n    typedef this_type origin_type;\n    typedef typename which_reference<PT>::is_reference is_reference;\n    typedef abstract_vector linalg_type;\n    typedef typename std::iterator_traits<PT>::value_type value_type;\n    typedef typename std::iterator_traits<PT>::reference reference;\n    typedef PT iterator;\n    typedef PT const_iterator;\n    typedef abstract_dense storage_type;\n    typedef linalg_true index_sorted;\n    static size_type size(const this_type &v) { return v.end - v.begin; }\n    static iterator begin(this_type &v) { return v.begin; }\n    static const_iterator begin(const this_type &v) { return v.begin; }\n    static iterator end(this_type &v) { return v.end; }\n    static const_iterator end(const this_type &v) { return v.end; }\n    static origin_type* origin(this_type &v) { return &v; }\n    static const origin_type* origin(const this_type &v) { return &v; }\n    static void clear(origin_type*, const iterator &it, const iterator &ite)\n    { std::fill(it, ite, value_type(0)); }\n    static void do_clear(this_type &v)\n    { std::fill(v.begin, v.end, value_type(0)); }\n    static value_type access(const origin_type *, const const_iterator &it,\n\t\t\t     const const_iterator &, size_type i)\n    { return it[i]; }\n    static reference access(origin_type *, const iterator &it,\n\t\t\t    const iterator &, size_type i)\n    { return it[i]; }\n    static void resize(this_type &, size_type )\n    { GMM_ASSERT1(false, \"Not resizable vector\"); }\n  };\n\n  template<typename PT> std::ostream &operator <<\n  (std::ostream &o, const array1D_reference<PT>& v)\n  { gmm::write(o,v); return o; }\n  \n  template <class PT> struct array2D_col_reference {\n\n    typedef typename std::iterator_traits<PT>::value_type T;\n    typedef typename std::iterator_traits<PT>::reference reference;\n    typedef typename const_reference<reference>::reference const_reference;\n    typedef PT iterator;\n    typedef typename const_pointer<PT>::pointer const_iterator;\n    \n    PT begin_;\n    size_type nbl, nbc;\n\n    inline const_reference operator ()(size_type l, size_type c) const {\n      GMM_ASSERT2(l < nbl && c < nbc, \"out of range\");\n      return *(begin_ + c*nbl+l);\n    }\n    inline reference operator ()(size_type l, size_type c) {\n      GMM_ASSERT2(l < nbl && c < nbc, \"out of range\");\n      return *(begin_ + c*nbl+l);\n    }\n    \n    void resize(size_type, size_type);\n    void reshape(size_type m, size_type n) {\n      GMM_ASSERT2(n*m == nbl*nbc, \"dimensions mismatch\");\n      nbl = m; nbc = n;\n    }\n    \n    void fill(T a, T b = T(0)) { \n      std::fill(begin_, begin_+nbc*nbl, b);\n      iterator p = begin_, e = begin_+nbc*nbl;\n      while (p < e) { *p = a; p += nbl+1; }\n    }\n    inline size_type nrows(void) const { return nbl; }\n    inline size_type ncols(void) const { return nbc; }\n\n    iterator begin(void) { return begin_; }\n    const_iterator begin(void) const { return begin_; }\n    iterator end(void) { return begin_+nbl*nbc; }\n    const_iterator end(void) const { return begin_+nbl*nbc; }\n\n    array2D_col_reference(PT begin__, size_type nrows_, size_type ncols_)\n      : begin_(begin__), nbl(nrows_), nbc(ncols_) {}\n  };\n\n  template <typename PT> struct linalg_traits<array2D_col_reference<PT> > {\n    typedef array2D_col_reference<PT> this_type;\n    typedef this_type origin_type;\n    typedef typename which_reference<PT>::is_reference is_reference;\n    typedef abstract_matrix linalg_type;\n    typedef typename std::iterator_traits<PT>::value_type value_type;\n    typedef typename std::iterator_traits<PT>::reference reference;\n    typedef abstract_dense storage_type;\n    typedef tab_ref_reg_spaced_with_origin<typename this_type::iterator,\n\t\t\t\t\t   this_type> sub_row_type;\n    typedef tab_ref_reg_spaced_with_origin<typename this_type::const_iterator,\n\t\t\t\t\t   this_type> const_sub_row_type;\n    typedef dense_compressed_iterator<typename this_type::iterator,\n\t\t\t\t      typename this_type::iterator,\n\t\t\t\t      this_type *> row_iterator;\n    typedef dense_compressed_iterator<typename this_type::const_iterator,\n\t\t\t\t      typename this_type::iterator,\n\t\t\t\t      const this_type *> const_row_iterator;\n    typedef tab_ref_with_origin<typename this_type::iterator, \n\t\t\t\tthis_type> sub_col_type;\n    typedef tab_ref_with_origin<typename this_type::const_iterator,\n\t\t\t\tthis_type> const_sub_col_type;\n    typedef dense_compressed_iterator<typename this_type::iterator,\n\t\t\t\t      typename this_type::iterator,\n\t\t\t\t      this_type *> col_iterator;\n    typedef dense_compressed_iterator<typename this_type::const_iterator,\n\t\t\t\t      typename this_type::iterator,\n\t\t\t\t      const this_type *> const_col_iterator;\n    typedef col_and_row sub_orientation;\n    typedef linalg_true index_sorted;\n    static size_type nrows(const this_type &m) { return m.nrows(); }\n    static size_type ncols(const this_type &m) { return m.ncols(); }\n    static const_sub_row_type row(const const_row_iterator &it)\n    { return const_sub_row_type(*it, it.nrows, it.ncols, it.origin); }\n    static const_sub_col_type col(const const_col_iterator &it)\n    { return const_sub_col_type(*it, *it + it.nrows, it.origin); }\n    static sub_row_type row(const row_iterator &it)\n    { return sub_row_type(*it, it.nrows, it.ncols, it.origin); }\n    static sub_col_type col(const col_iterator &it)\n    { return sub_col_type(*it, *it + it.nrows, it.origin); }\n    static row_iterator row_begin(this_type &m)\n    { return row_iterator(m.begin(), 1, m.nrows(), m.ncols(), 0, &m); }\n    static row_iterator row_end(this_type &m)\n    { return row_iterator(m.begin(), 1, m.nrows(), m.ncols(), m.nrows(), &m); }\n    static const_row_iterator row_begin(const this_type &m)\n    { return const_row_iterator(m.begin(), 1, m.nrows(), m.ncols(), 0, &m); }\n    static const_row_iterator row_end(const this_type &m) {\n      return const_row_iterator(m.begin(), 1, m.nrows(),\n\t\t\t\tm.ncols(), m.nrows(), &m);\n    }\n    static col_iterator col_begin(this_type &m)\n    { return col_iterator(m.begin(), m.nrows(), m.nrows(), m.ncols(), 0, &m); }\n    static col_iterator col_end(this_type &m) {\n      return col_iterator(m.begin(), m.nrows(), m.nrows(), m.ncols(),\n\t\t\t  m.ncols(), &m);\n    }\n    static const_col_iterator col_begin(const this_type &m) {\n      return const_col_iterator(m.begin(), m.nrows(), m.nrows(),\n\t\t\t\tm.ncols(), 0, &m);\n    }\n    static const_col_iterator col_end(const this_type &m) {\n      return const_col_iterator(m.begin(), m.nrows(),m.nrows(),m.ncols(),\n\t\t\t\tm.ncols(), &m);\n    }\n    static origin_type* origin(this_type &m) { return &m; }\n    static const origin_type* origin(const this_type &m) { return &m; }\n    static void do_clear(this_type &m) { m.fill(value_type(0)); }\n    static value_type access(const const_col_iterator &itcol, size_type j)\n    { return (*itcol)[j]; }\n    static reference access(const col_iterator &itcol, size_type j)\n    { return (*itcol)[j]; }\n    static void resize(this_type &v, size_type m, size_type n)\n    { v.resize(m,n); }\n    static void reshape(this_type &v, size_type m, size_type n)\n    { v.reshape(m, n); }\n  };\n\n  template<typename PT> std::ostream &operator <<\n    (std::ostream &o, const array2D_col_reference<PT>& m)\n  { gmm::write(o,m); return o; }\n\n\n\n  template <class PT> struct array2D_row_reference {\n    \n    typedef typename std::iterator_traits<PT>::value_type T;\n    typedef typename std::iterator_traits<PT>::reference reference;\n    typedef typename const_reference<reference>::reference const_reference;\n    typedef PT iterator;\n    typedef typename const_pointer<PT>::pointer const_iterator;\n    \n    PT begin_;\n    size_type nbl, nbc;\n\n    inline const_reference operator ()(size_type l, size_type c) const {\n      GMM_ASSERT2(l < nbl && c < nbc, \"out of range\");\n      return *(begin_ + l*nbc+c);\n    }\n    inline reference operator ()(size_type l, size_type c) {\n      GMM_ASSERT2(l < nbl && c < nbc, \"out of range\");\n      return *(begin_ + l*nbc+c);\n    }\n    \n    void resize(size_type, size_type);\n    void reshape(size_type m, size_type n) {\n      GMM_ASSERT2(n*m == nbl*nbc, \"dimensions mismatch\");\n      nbl = m; nbc = n;\n    }\n    \n    void fill(T a, T b = T(0)) { \n      std::fill(begin_, begin_+nbc*nbl, b);\n      iterator p = begin_, e = begin_+nbc*nbl;\n      while (p < e) { *p = a; p += nbc+1; }\n    }\n    inline size_type nrows(void) const { return nbl; }\n    inline size_type ncols(void) const { return nbc; }\n\n    iterator begin(void) { return begin_; }\n    const_iterator begin(void) const { return begin_; }\n    iterator end(void) { return begin_+nbl*nbc; }\n    const_iterator end(void) const { return begin_+nbl*nbc; }\n\n    array2D_row_reference(PT begin__, size_type nrows_, size_type ncols_)\n      : begin_(begin__), nbl(nrows_), nbc(ncols_) {}\n  };\n\n  template <typename PT> struct linalg_traits<array2D_row_reference<PT> > {\n    typedef array2D_row_reference<PT> this_type;\n    typedef this_type origin_type;\n    typedef typename which_reference<PT>::is_reference is_reference;\n    typedef abstract_matrix linalg_type;\n    typedef typename std::iterator_traits<PT>::value_type value_type;\n    typedef typename std::iterator_traits<PT>::reference reference;\n    typedef abstract_dense storage_type;\n    typedef tab_ref_reg_spaced_with_origin<typename this_type::iterator,\n\t\t\t\t\t   this_type> sub_col_type;\n    typedef tab_ref_reg_spaced_with_origin<typename this_type::const_iterator,\n\t\t\t\t\t   this_type> const_sub_col_type;\n    typedef dense_compressed_iterator<typename this_type::iterator,\n\t\t\t\t      typename this_type::iterator,\n\t\t\t\t      this_type *> col_iterator;\n    typedef dense_compressed_iterator<typename this_type::const_iterator,\n\t\t\t\t      typename this_type::iterator,\n\t\t\t\t      const this_type *> const_col_iterator;\n    typedef tab_ref_with_origin<typename this_type::iterator, \n\t\t\t\tthis_type> sub_row_type;\n    typedef tab_ref_with_origin<typename this_type::const_iterator,\n\t\t\t\tthis_type> const_sub_row_type;\n    typedef dense_compressed_iterator<typename this_type::iterator,\n\t\t\t\t      typename this_type::iterator,\n\t\t\t\t      this_type *> row_iterator;\n    typedef dense_compressed_iterator<typename this_type::const_iterator,\n\t\t\t\t      typename this_type::iterator,\n\t\t\t\t      const this_type *> const_row_iterator;\n    typedef col_and_row sub_orientation;\n    typedef linalg_true index_sorted;\n    static size_type ncols(const this_type &m) { return m.ncols(); }\n    static size_type nrows(const this_type &m) { return m.nrows(); }\n    static const_sub_col_type col(const const_col_iterator &it)\n    { return const_sub_col_type(*it, it.ncols, it.nrows, it.origin); }\n    static const_sub_row_type row(const const_row_iterator &it)\n    { return const_sub_row_type(*it, *it + it.ncols, it.origin); }\n    static sub_col_type col(const col_iterator &it)\n    { return sub_col_type(*it, *it, it.ncols, it.nrows, it.origin); }\n    static sub_row_type row(const row_iterator &it)\n    { return sub_row_type(*it, *it + it.ncols, it.origin); }\n    static col_iterator col_begin(this_type &m)\n    { return col_iterator(m.begin(), 1, m.ncols(), m.nrows(), 0, &m); }\n    static col_iterator col_end(this_type &m)\n    { return col_iterator(m.begin(), 1, m.ncols(), m.nrows(), m.ncols(), &m); }\n    static const_col_iterator col_begin(const this_type &m)\n    { return const_col_iterator(m.begin(), 1, m.ncols(), m.nrows(), 0, &m); }\n    static const_col_iterator col_end(const this_type &m) {\n      return const_col_iterator(m.begin(), 1, m.ncols(),\n\t\t\t\tm.nrows(), m.ncols(), &m);\n    }\n    static row_iterator row_begin(this_type &m)\n    { return row_iterator(m.begin(), m.ncols(), m.ncols(), m.nrows(), 0, &m); }\n    static row_iterator row_end(this_type &m) {\n      return row_iterator(m.begin(), m.ncols(), m.ncols(), m.nrows(),\n\t\t\t  m.nrows(), &m);\n    }\n    static const_row_iterator row_begin(const this_type &m) {\n      return const_row_iterator(m.begin(), m.ncols(), m.ncols(), m.nrows(),\n\t\t\t\t0, &m);\n    }\n    static const_row_iterator row_end(const this_type &m) {\n      return const_row_iterator(m.begin(), m.ncols(), m.ncols(), m.nrows(),\n\t\t\t\tm.nrows(), &m);\n    }\n    static origin_type* origin(this_type &m) { return &m; }\n    static const origin_type* origin(const this_type &m) { return &m; }\n    static void do_clear(this_type &m) { m.fill(value_type(0)); }\n    static value_type access(const const_row_iterator &itrow, size_type j)\n    { return (*itrow)[j]; }\n    static reference access(const row_iterator &itrow, size_type j)\n    { return (*itrow)[j]; }\n    static void resize(this_type &v, size_type m, size_type n)\n    { v.resize(m,n); }\n    static void reshape(this_type &v, size_type m, size_type n)\n    { v.reshape(m, n); }\n  };\n\n  template<typename PT> std::ostream &operator <<\n    (std::ostream &o, const array2D_row_reference<PT>& m)\n  { gmm::write(o,m); return o; }\n\n\n\n\n\n\n}\n\n\n#endif //  GMM_INTERFACE_H__\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_interface_bgeot.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2002-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n/**@file gmm_interface_bgeot.h\n   @author  Yves Renard <Yves.Renard@insa-lyon.fr>\n   @date October 13, 2002.\n   @brief interface for bgeot::small_vector\n*/\n#ifndef GMM_INTERFACE_BGEOT_H__\n#define GMM_INTERFACE_BGEOT_H__\n\n\nnamespace gmm {\n\n  /* ********************************************************************* */\n  /*\t\t                                         \t \t   */\n  /*\t\tTraits for bgeot objects                     \t\t   */\n  /*\t\t                                         \t\t   */\n  /* ********************************************************************* */\n\n  template <typename T> struct linalg_traits<bgeot::small_vector<T> > {\n    typedef bgeot::small_vector<T> this_type;\n    typedef this_type origin_type;\n    typedef linalg_false is_reference;\n    typedef abstract_vector linalg_type;\n    typedef T value_type;\n    typedef T& reference;\n    typedef typename this_type::iterator iterator;\n    typedef typename this_type::const_iterator const_iterator;\n    typedef abstract_dense storage_type;\n    typedef linalg_true index_sorted;\n    static size_type size(const this_type &v) { return v.size(); }\n    static iterator begin(this_type &v) { return v.begin(); }\n    static const_iterator begin(const this_type &v) { return v.begin(); }\n    static iterator end(this_type &v) { return v.end(); }\n    static const_iterator end(const this_type &v) { return v.end(); }\n    static origin_type* origin(this_type &v) { return &v; }\n    static const origin_type* origin(const this_type &v) { return &v; }\n    static void clear(origin_type* o, const iterator &it, const iterator &ite)\n    { std::fill(it, ite, value_type(0)); }\n    static void do_clear(this_type &v)\n    { std::fill(v.begin(), v.end(), value_type(0)); }\n    static value_type access(const origin_type *, const const_iterator &it,\n\t\t\t     const const_iterator &, size_type i)\n    { return it[i]; }\n    static reference access(origin_type *, const iterator &it,\n\t\t\t    const iterator &, size_type i)\n    { return it[i]; }\n    static void resize(this_type &v, size_type n) { v.resize(n); }\n  };\n\n}\n\n\n#endif //  GMM_INTERFACE_BGEOT_H__\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_iter.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2002-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n/**@file gmm_iter.h\n   @author  Yves Renard <Yves.Renard@insa-lyon.fr>\n   @date February 10, 2003.\n   @brief Iteration object.\n*/\n\n#ifndef GMM_ITER_H__\n#define GMM_ITER_H__\n\n#include \"gmm_kernel.h\"\n\nnamespace gmm {\n\n  /**  The Iteration object calculates whether the solution has reached the\n       desired accuracy, or whether the maximum number of iterations has\n       been reached. \n\n       The method finished() checks the convergence.  The first()\n       method is used to determine the first iteration of the loop.\n  */\n  class iteration {\n  protected :\n    double rhsn;       /* Right hand side norm.                            */\n    size_type maxiter; /* Max. number of iterations.                       */\n    int noise;         /* if noise > 0 iterations are printed.             */\n    double resmax;     /* maximum residu.                                  */\n    double resminreach, resadd;\n    double diverged_res; /* Threshold beyond which the iterative           */\n                       /* is considered to diverge.                        */\n    size_type nit;     /* iteration number.                                */\n    double res;        /* last computed residu.                            */\n    std::string name;  /* eventually, name of the method.                  */\n    bool written;\n    void (*callback)(const gmm::iteration&);\n  public :\n\n    void init(void) { \n      nit = 0; res = 0.0; written = false; \n      resminreach = 1E200; resadd = 0.0; \n      callback = 0;\n    }\n\n    iteration(double r = 1.0E-8, int noi = 0, size_type mit = size_type(-1),\n\t      double div_res = 1E200)\n      : rhsn(1.0), maxiter(mit), noise(noi), resmax(r), diverged_res(div_res)\n    { init(); }\n\n    void  operator ++(int) {  nit++; written = false; resadd += res; }\n    void  operator ++() { (*this)++; }\n\n    bool first(void) { return nit == 0; }\n\n    /* get/set the \"noisyness\" (verbosity) of the solvers */\n    int get_noisy(void) const { return noise; }\n    void set_noisy(int n) { noise = n; }\n    void reduce_noisy(void) { if (noise > 0) noise--; }\n\n    double get_resmax(void) const { return resmax; }\n    void set_resmax(double r) { resmax = r; }\n\n    double get_res() const { return res; }\n    void enforce_converged(bool c = true)\n    { if (c) res = double(0); else res = rhsn * resmax + double(1); }\n\n    /* change the user-definable callback, called after each iteration */\n    void set_callback(void (*t)(const gmm::iteration&)) {\n      callback = t;\n    }\n\n    double get_diverged_residual(void) const { return diverged_res; }\n    void set_diverged_residual(double r) { diverged_res = r; }\n\n    size_type get_iteration(void) const { return nit; }\n    void set_iteration(size_type i) { nit = i; }\n    \n    size_type get_maxiter(void) const { return maxiter; }\n    void set_maxiter(size_type i) { maxiter = i; }\n\n    double get_rhsnorm(void) const { return rhsn; }\n    void set_rhsnorm(double r) { rhsn = r; }\n    \n    bool converged(void) { return res <= rhsn * resmax; }\n    bool converged(double nr) { \n      res = gmm::abs(nr); resminreach = std::min(resminreach, res);\n      return converged();\n    }\n    template <typename VECT> bool converged(const VECT &v)\n    { return converged(gmm::vect_norm2(v)); }\n    bool diverged(void)\n    { return (nit>=maxiter) || (res>=rhsn*diverged_res && nit > 4); }\n    bool diverged(double nr) { \n      res = gmm::abs(nr); resminreach = std::min(resminreach, res);\n      return diverged();\n    }\n\n    bool finished(double nr) {\n      if (callback) callback(*this);\n      if (noise > 0 && !written) {\n\tdouble a = (rhsn == 0) ? 1.0 : rhsn;\n\tconverged(nr);\n\tcout << name << \" iter \" << nit << \" residual \"\n\t     << gmm::abs(nr) / a;\n// \tif (nit % 100 == 0 && nit > 0) {\n// \t  cout << \" (residual min \" << resminreach / a << \" mean val \"\n// \t       << resadd / (100.0 * a) << \" )\";\n// \t  resadd = 0.0;\n// \t}\n\tcout <<  endl;\n\twritten = true;\n      }\n      return (converged(nr) || diverged(nr));\n    }\n    template <typename VECT> bool finished_vect(const VECT &v)\n    { return finished(double(gmm::vect_norm2(v))); }\n\n\n    void set_name(const std::string &n) { name = n; }\n    const std::string &get_name(void) const { return name; }\n\n  };\n\n}\n\n#endif /* GMM_ITER_H__ */\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_iter_solvers.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2002-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n/**@file gmm_iter_solvers.h\n   @author  Yves Renard <Yves.Renard@insa-lyon.fr>\n   @date October 13, 2002.\n   @brief Include standard gmm iterative solvers (cg, gmres, ...)\n*/\n#ifndef GMM_ITER_SOLVERS_H__\n#define GMM_ITER_SOLVERS_H__\n\n#include \"gmm_iter.h\"\n\n\nnamespace gmm {\n\n  /** mixed method to find a zero of a real function G, a priori \n   * between a and b. If the zero is not between a and b, iterations\n   * of secant are applied. When a convenient interval is found,\n   * iterations of dichotomie and regula falsi are applied.\n   */\n  template <typename FUNC, typename T>\n  T find_root(const FUNC &G, T a = T(0), T b = T(1),\n\t      T tol = gmm::default_tol(T())) {\n    T c, Ga = G(a), Gb = G(b), Gc, d;\n    d = gmm::abs(b - a);\n#if 0\n    for (int i = 0; i < 4; i++) { /* secant iterations.                   */\n      if (d < tol) return (b + a) / 2.0;\n      c = b - Gb * (b - a) / (Gb - Ga); Gc = G(c);\n      a = b; b = c; Ga = Gb; Gb = Gc;\n      d = gmm::abs(b - a);\n    }\n#endif\n    while (Ga * Gb > 0.0) { /* secant iterations.                         */\n      if (d < tol) return (b + a) / 2.0;\n      c = b - Gb * (b - a) / (Gb - Ga); Gc = G(c);\n      a = b; b = c; Ga = Gb; Gb = Gc;\n      d = gmm::abs(b - a);\n    }\n    \n    c = std::max(a, b); a = std::min(a, b); b = c;\n    while (d > tol) {\n      c = b - (b - a) * (Gb / (Gb - Ga)); /* regula falsi.     */\n      if (c > b) c = b; if (c < a) c = a; \n      Gc = G(c);\n      if (Gc*Gb > 0) { b = c; Gb = Gc; } else { a = c; Ga = Gc; }\n      c = (b + a) / 2.0 ; Gc = G(c); /* Dichotomie.                       */\n      if (Gc*Gb > 0) { b = c; Gb = Gc; } else { a = c; Ga = Gc; }\n      d = gmm::abs(b - a); c = (b + a) / 2.0; if ((c == a) || (c == b)) d = 0.0;\n    }\n    return (b + a) / 2.0;\n  }\n  \n}\n\n#include \"gmm_precond_diagonal.h\"\n#include \"gmm_precond_ildlt.h\"\n#include \"gmm_precond_ildltt.h\"\n#include \"gmm_precond_mr_approx_inverse.h\"\n#include \"gmm_precond_ilu.h\"\n#include \"gmm_precond_ilut.h\"\n#include \"gmm_precond_ilutp.h\"\n\n\n\n#include \"gmm_solver_cg.h\"\n#include \"gmm_solver_bicgstab.h\"\n#include \"gmm_solver_qmr.h\"\n#include \"gmm_solver_constrained_cg.h\"\n#include \"gmm_solver_Schwarz_additive.h\"\n#include \"gmm_modified_gram_schmidt.h\"\n#include \"gmm_tri_solve.h\"\n#include \"gmm_solver_gmres.h\"\n#include \"gmm_solver_bfgs.h\"\n#include \"gmm_least_squares_cg.h\"\n\n// #include \"gmm_solver_idgmres.h\"\n\n\n\n#endif //  GMM_ITER_SOLVERS_H__\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_kernel.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2002-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n/**@file gmm_kernel.h \n   @author  Yves Renard <Yves.Renard@insa-lyon.fr>\n   @date November 15, 2003.\n   @brief Include the base gmm files.\n */\n\n#ifndef GMM_KERNEL_H__\n#define GMM_KERNEL_H__\n\n#include \"gmm_def.h\"\n#include \"gmm_blas.h\"\n#include \"gmm_real_part.h\"\n#include \"gmm_interface.h\"\n#include \"gmm_sub_vector.h\"\n#include \"gmm_sub_matrix.h\"\n#include \"gmm_vector_to_matrix.h\"\n#include \"gmm_vector.h\"\n#include \"gmm_matrix.h\"\n#include \"gmm_tri_solve.h\"\n#include \"gmm_blas_interface.h\"\n#include \"gmm_lapack_interface.h\"\n\n\n#endif //  GMM_KERNEL_H__\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_lapack_interface.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2003-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n/**@file gmm_lapack_interface.h\n   @author  Yves Renard <Yves.Renard@insa-lyon.fr>\n   @date October 7, 2003.\n   @brief gmm interface for LAPACK\n*/\n\n#if defined(GMM_USES_LAPACK)\n\n#ifndef GMM_LAPACK_INTERFACE_H\n#define GMM_LAPACK_INTERFACE_H\n\n#include \"gmm_blas_interface.h\"\n#include \"gmm_dense_lu.h\"\n#include \"gmm_dense_qr.h\"\n\n\nnamespace gmm {\n\n  /* ********************************************************************* */\n  /* Operations interfaced for T = float, double, std::complex<float>      */\n  /*    or std::complex<double> :                                          */\n  /*                                                                       */\n  /* lu_factor(dense_matrix<T>, std::vector<int>)                          */\n  /* lu_solve(dense_matrix<T>, std::vector<T>, std::vector<T>)             */\n  /* lu_solve(dense_matrix<T>, std::vector<int>, std::vector<T>,           */\n  /*          std::vector<T>)                                              */\n  /* lu_solve_transposed(dense_matrix<T>, std::vector<int>, std::vector<T>,*/\n  /*          std::vector<T>)                                              */\n  /* lu_inverse(dense_matrix<T>)                                           */\n  /* lu_inverse(dense_matrix<T>, std::vector<int>, dense_matrix<T>)        */\n  /*                                                                       */\n  /* qr_factor(dense_matrix<T>, dense_matrix<T>, dense_matrix<T>)          */\n  /*                                                                       */\n  /* implicit_qr_algorithm(dense_matrix<T>, std::vector<T>)                */\n  /* implicit_qr_algorithm(dense_matrix<T>, std::vector<T>,                */\n  /*                       dense_matrix<T>)                                */\n  /* implicit_qr_algorithm(dense_matrix<T>, std::vector<std::complex<T> >) */\n  /* implicit_qr_algorithm(dense_matrix<T>, std::vector<std::complex<T> >, */\n  /*                       dense_matrix<T>)                                */\n  /*                                                                       */\n  /* ********************************************************************* */\n\n  /* ********************************************************************* */\n  /* LAPACK functions used.                                                */\n  /* ********************************************************************* */\n\n  extern \"C\" {\n    void sgetrf_(...); void dgetrf_(...); void cgetrf_(...); void zgetrf_(...);\n    void sgetrs_(...); void dgetrs_(...); void cgetrs_(...); void zgetrs_(...);\n    void sgetri_(...); void dgetri_(...); void cgetri_(...); void zgetri_(...);\n    void sgeqrf_(...); void dgeqrf_(...); void cgeqrf_(...); void zgeqrf_(...);\n    void sorgqr_(...); void dorgqr_(...); void cungqr_(...); void zungqr_(...);\n    void sormqr_(...); void dormqr_(...); void cunmqr_(...); void zunmqr_(...);\n    void sgees_ (...); void dgees_ (...); void cgees_ (...); void zgees_ (...);\n    void sgeev_ (...); void dgeev_ (...); void cgeev_ (...); void zgeev_ (...);\n    void sgesvd_(...); void dgesvd_(...); void cgesvd_(...); void zgesvd_(...);\n  }\n\n  /* ********************************************************************* */\n  /* LU decomposition.                                                     */\n  /* ********************************************************************* */\n\n# define getrf_interface(lapack_name, base_type) inline                    \\\n  size_type lu_factor(dense_matrix<base_type > &A, std::vector<int> &ipvt){\\\n    GMMLAPACK_TRACE(\"getrf_interface\");                                    \\\n    int m = int(mat_nrows(A)), n = int(mat_ncols(A)), lda(m), info(0);     \\\n    if (m && n) lapack_name(&m, &n, &A(0,0), &lda, &ipvt[0], &info);       \\\n    return size_type(info);                                                \\\n  }\n\n  getrf_interface(sgetrf_, BLAS_S)\n  getrf_interface(dgetrf_, BLAS_D)\n  getrf_interface(cgetrf_, BLAS_C)\n  getrf_interface(zgetrf_, BLAS_Z)\n\n  /* ********************************************************************* */\n  /* LU solve.                                                             */\n  /* ********************************************************************* */\n\n# define getrs_interface(f_name, trans1, lapack_name, base_type) inline    \\\n  void f_name(const dense_matrix<base_type > &A,                           \\\n\t      const std::vector<int> &ipvt, std::vector<base_type > &x,    \\\n\t      const std::vector<base_type > &b) {                          \\\n    GMMLAPACK_TRACE(\"getrs_interface\");                                    \\\n    int n = int(mat_nrows(A)), info, nrhs(1);                              \\\n    gmm::copy(b, x); trans1;                                               \\\n    if (n)                                                                 \\\n      lapack_name(&t, &n, &nrhs, &(A(0,0)),&n,&ipvt[0], &x[0], &n, &info); \\\n  }\n  \n# define getrs_trans_n const char t = 'N'\n# define getrs_trans_t const char t = 'T'\n\n  getrs_interface(lu_solve, getrs_trans_n, sgetrs_, BLAS_S)\n  getrs_interface(lu_solve, getrs_trans_n, dgetrs_, BLAS_D)\n  getrs_interface(lu_solve, getrs_trans_n, cgetrs_, BLAS_C)\n  getrs_interface(lu_solve, getrs_trans_n, zgetrs_, BLAS_Z)\n  getrs_interface(lu_solve_transposed, getrs_trans_t, sgetrs_, BLAS_S)\n  getrs_interface(lu_solve_transposed, getrs_trans_t, dgetrs_, BLAS_D)\n  getrs_interface(lu_solve_transposed, getrs_trans_t, cgetrs_, BLAS_C)\n  getrs_interface(lu_solve_transposed, getrs_trans_t, zgetrs_, BLAS_Z)\n\n  /* ********************************************************************* */\n  /* LU inverse.                                                           */\n  /* ********************************************************************* */\n\n# define getri_interface(lapack_name, base_type) inline                    \\\n  void lu_inverse(const dense_matrix<base_type > &LU,                      \\\n       std::vector<int> &ipvt, const dense_matrix<base_type > &A_) {       \\\n    GMMLAPACK_TRACE(\"getri_interface\");                                    \\\n    dense_matrix<base_type >&                                              \\\n    A = const_cast<dense_matrix<base_type > &>(A_);                        \\\n    int n = int(mat_nrows(A)), info, lwork(-1); base_type work1;           \\\n    if (n) {                                                               \\\n      gmm::copy(LU, A);                                                    \\\n      lapack_name(&n, &A(0,0), &n, &ipvt[0], &work1, &lwork, &info);       \\\n      lwork = int(gmm::real(work1));                                       \\\n      std::vector<base_type > work(lwork);                                 \\\n      lapack_name(&n, &A(0,0), &n, &ipvt[0], &work[0], &lwork, &info);     \\\n    }                                                                      \\\n  }\n\n  getri_interface(sgetri_, BLAS_S)\n  getri_interface(dgetri_, BLAS_D)\n  getri_interface(cgetri_, BLAS_C)\n  getri_interface(zgetri_, BLAS_Z)\n\n\n  /* ********************************************************************* */\n  /* QR factorization.                                                     */\n  /* ********************************************************************* */\n\n# define geqrf_interface(lapack_name1, base_type) inline\t\t   \\\n  void qr_factor(dense_matrix<base_type > &A){\t\t\t           \\\n    GMMLAPACK_TRACE(\"geqrf_interface\");\t\t\t\t           \\\n    int m = int(mat_nrows(A)), n = int(mat_ncols(A)), info, lwork(-1);     \\\n    base_type work1;                                                       \\\n    if (m && n) {\t\t\t\t\t\t\t   \\\n      std::vector<base_type > tau(n);\t\t\t\t\t   \\\n      lapack_name1(&m, &n, &A(0,0), &m, &tau[0], &work1  , &lwork, &info); \\\n      lwork = int(gmm::real(work1));\t\t\t\t\t   \\\n      std::vector<base_type > work(lwork);\t\t\t\t   \\\n      lapack_name1(&m, &n, &A(0,0), &m, &tau[0], &work[0], &lwork, &info); \\\n      GMM_ASSERT1(!info, \"QR factorization failed\");\t\t\t   \\\n    }\t\t\t\t\t\t\t\t\t   \\\n  }\n    \n  geqrf_interface(sgeqrf_, BLAS_S)\n  geqrf_interface(dgeqrf_, BLAS_D)\n    // For complex values, housholder vectors are not the same as in\n    // gmm::lu_factor. Impossible to interface for the moment.\n    //  geqrf_interface(cgeqrf_, BLAS_C)\n    //  geqrf_interface(zgeqrf_, BLAS_Z)\n\n# define geqrf_interface2(lapack_name1, lapack_name2, base_type) inline    \\\n  void qr_factor(const dense_matrix<base_type > &A,                        \\\n       dense_matrix<base_type > &Q, dense_matrix<base_type > &R) {         \\\n    GMMLAPACK_TRACE(\"geqrf_interface2\");                                   \\\n    int m = int(mat_nrows(A)), n = int(mat_ncols(A)), info, lwork(-1);     \\\n    base_type work1;\t\t \t\t\t\t\t   \\\n    if (m && n) {                                                          \\\n      gmm::copy(A, Q);                                                     \\\n      std::vector<base_type > tau(n);                                      \\\n      lapack_name1(&m, &n, &Q(0,0), &m, &tau[0], &work1  , &lwork, &info); \\\n      lwork = int(gmm::real(work1));                                       \\\n      std::vector<base_type > work(lwork);                                 \\\n      lapack_name1(&m, &n, &Q(0,0), &m, &tau[0], &work[0], &lwork, &info); \\\n      GMM_ASSERT1(!info, \"QR factorization failed\");                       \\\n      base_type *p = &R(0,0), *q = &Q(0,0);                                \\\n      for (int j = 0; j < n; ++j, q += m-n)                                \\\n        for (int i = 0; i < n; ++i, ++p, ++q)                              \\\n          *p = (j < i) ? base_type(0) : *q;                                \\\n      lapack_name2(&m, &n, &n, &Q(0,0), &m,&tau[0],&work[0],&lwork,&info); \\\n    }                                                                      \\\n    else gmm::clear(Q);                                                    \\\n  }\n\n  geqrf_interface2(sgeqrf_, sorgqr_, BLAS_S)\n  geqrf_interface2(dgeqrf_, dorgqr_, BLAS_D)\n  geqrf_interface2(cgeqrf_, cungqr_, BLAS_C)\n  geqrf_interface2(zgeqrf_, zungqr_, BLAS_Z)\n  \n  /* ********************************************************************* */\n  /* QR algorithm for eigenvalues search.                                  */\n  /* ********************************************************************* */\n\n# define gees_interface(lapack_name, base_type)                            \\\n  template <typename VECT> inline void implicit_qr_algorithm(              \\\n         const dense_matrix<base_type > &A,  const VECT &eigval_,          \\\n         dense_matrix<base_type > &Q,                                      \\\n         double tol=gmm::default_tol(base_type()), bool compvect = true) { \\\n    GMMLAPACK_TRACE(\"gees_interface\");                                     \\\n    typedef bool (*L_fp)(...);  L_fp p = 0;                                \\\n    int n = int(mat_nrows(A)), info, lwork(-1), sdim; base_type work1;     \\\n    if (!n) return;                                                        \\\n    dense_matrix<base_type > H(n,n); gmm::copy(A, H);                      \\\n    char jobvs = (compvect ? 'V' : 'N'), sort = 'N';                       \\\n    std::vector<double> rwork(n), eigv1(n), eigv2(n);                      \\\n    lapack_name(&jobvs, &sort, p, &n, &H(0,0), &n, &sdim, &eigv1[0],       \\\n                &eigv2[0], &Q(0,0), &n, &work1, &lwork, &rwork[0], &info); \\\n    lwork = int(gmm::real(work1));                                         \\\n    std::vector<base_type > work(lwork);                                   \\\n    lapack_name(&jobvs, &sort, p, &n, &H(0,0), &n, &sdim, &eigv1[0],       \\\n\t\t&eigv2[0], &Q(0,0), &n, &work[0], &lwork, &rwork[0],&info);\\\n    GMM_ASSERT1(!info, \"QR algorithm failed\");                             \\\n    extract_eig(H, const_cast<VECT &>(eigval_), tol);                      \\\n  }\n\n# define gees_interface2(lapack_name, base_type)                           \\\n  template <typename VECT> inline void implicit_qr_algorithm(              \\\n         const dense_matrix<base_type > &A,  const VECT &eigval_,          \\\n         dense_matrix<base_type > &Q,                                      \\\n         double tol=gmm::default_tol(base_type()), bool compvect = true) { \\\n    GMMLAPACK_TRACE(\"gees_interface2\");                                    \\\n    typedef bool (*L_fp)(...);  L_fp p = 0;                                \\\n    int n = int(mat_nrows(A)), info, lwork(-1), sdim; base_type work1;     \\\n    if (!n) return;                                                        \\\n    dense_matrix<base_type > H(n,n); gmm::copy(A, H);                      \\\n    char jobvs = (compvect ? 'V' : 'N'), sort = 'N';                       \\\n    std::vector<double> rwork(n), eigvv(n*2);                              \\\n    lapack_name(&jobvs, &sort, p, &n, &H(0,0), &n, &sdim, &eigvv[0],       \\\n                &Q(0,0), &n, &work1, &lwork, &rwork[0], &rwork[0], &info); \\\n    lwork = int(gmm::real(work1));                                         \\\n    std::vector<base_type > work(lwork);                                   \\\n    lapack_name(&jobvs, &sort, p, &n, &H(0,0), &n, &sdim, &eigvv[0],       \\\n                &Q(0,0), &n, &work[0], &lwork, &rwork[0], &rwork[0],&info);\\\n    GMM_ASSERT1(!info, \"QR algorithm failed\");                             \\\n    extract_eig(H, const_cast<VECT &>(eigval_), tol);                      \\\n  }\n\n  gees_interface(sgees_, BLAS_S)\n  gees_interface(dgees_, BLAS_D)\n  gees_interface2(cgees_, BLAS_C)\n  gees_interface2(zgees_, BLAS_Z)\n\n# define geev_int_right(lapack_name, base_type)\t\t\t           \\\n  template <typename VECT> inline void geev_interface_right(               \\\n         const dense_matrix<base_type > &A,  const VECT &eigval_,          \\\n         dense_matrix<base_type > &Q) {\t\t                           \\\n    GMMLAPACK_TRACE(\"geev_interface\");                                     \\\n    int n = int(mat_nrows(A)), info, lwork(-1); base_type work1;           \\\n    if (!n) return;                                                        \\\n    dense_matrix<base_type > H(n,n); gmm::copy(A, H);                      \\\n    char jobvl = 'N', jobvr = 'V';                                         \\\n    std::vector<base_type > eigvr(n), eigvi(n);                            \\\n    lapack_name(&jobvl, &jobvr, &n, &H(0,0), &n, &eigvr[0], &eigvi[0],     \\\n\t\t&Q(0,0), &n, &Q(0,0), &n, &work1, &lwork, &info);   \t   \\\n    lwork = int(gmm::real(work1));                                         \\\n    std::vector<base_type > work(lwork);                                   \\\n    lapack_name(&jobvl, &jobvr, &n, &H(0,0), &n, &eigvr[0], &eigvi[0],     \\\n\t\t&Q(0,0), &n, &Q(0,0), &n, &work[0], &lwork, &info);    \t   \\\n    GMM_ASSERT1(!info, \"QR algorithm failed\");                             \\\n    gmm::copy(eigvr, gmm::real_part(const_cast<VECT &>(eigval_)));\t   \\\n    gmm::copy(eigvi, gmm::imag_part(const_cast<VECT &>(eigval_)));\t   \\\n  }\n\n# define geev_int_rightc(lapack_name, base_type)\t\t\t   \\\n  template <typename VECT> inline void geev_interface_right(               \\\n         const dense_matrix<base_type > &A,  const VECT &eigval_,          \\\n         dense_matrix<base_type > &Q) {\t\t                           \\\n    GMMLAPACK_TRACE(\"geev_interface\");                                     \\\n    int n = int(mat_nrows(A)), info, lwork(-1); base_type work1;           \\\n    if (!n) return;                                                        \\\n    dense_matrix<base_type > H(n,n); gmm::copy(A, H);                      \\\n    char jobvl = 'N', jobvr = 'V';                                         \\\n    std::vector<double> rwork(2*n);                                        \\\n    std::vector<base_type> eigv(n);                                        \\\n    lapack_name(&jobvl, &jobvr, &n, &H(0,0), &n, &eigv[0], &Q(0,0), &n,    \\\n\t\t&Q(0,0), &n, &work1, &lwork, &rwork[0], &info);\t   \t   \\\n    lwork = int(gmm::real(work1));                                         \\\n    std::vector<base_type > work(lwork);                                   \\\n    lapack_name(&jobvl, &jobvr, &n, &H(0,0), &n, &eigv[0], &Q(0,0), &n,    \\\n\t\t&Q(0,0), &n, &work[0], &lwork,  &rwork[0],  &info);\t   \\\n    GMM_ASSERT1(!info, \"QR algorithm failed\");                             \\\n    gmm::copy(eigv, const_cast<VECT &>(eigval_));\t\t\t   \\\n  }\n\n  geev_int_right(sgeev_, BLAS_S)\n  geev_int_right(dgeev_, BLAS_D)\n  geev_int_rightc(cgeev_, BLAS_C)\n  geev_int_rightc(zgeev_, BLAS_Z)\n\n# define geev_int_left(lapack_name, base_type)                             \\\n  template <typename VECT> inline void geev_interface_left(                \\\n         const dense_matrix<base_type > &A,  const VECT &eigval_,          \\\n         dense_matrix<base_type > &Q) {\t \t                           \\\n    GMMLAPACK_TRACE(\"geev_interface\");                                     \\\n    int n = int(mat_nrows(A)), info, lwork(-1); base_type work1;           \\\n    if (!n) return;                                                        \\\n    dense_matrix<base_type > H(n,n); gmm::copy(A, H);                      \\\n    char jobvl = 'V', jobvr = 'N';                                         \\\n    std::vector<base_type > eigvr(n), eigvi(n);                            \\\n    lapack_name(&jobvl, &jobvr, &n, &H(0,0), &n, &eigvr[0], &eigvi[0],     \\\n\t\t&Q(0,0), &n, &Q(0,0), &n, &work1, &lwork, &info);   \t   \\\n    lwork = int(gmm::real(work1));                                         \\\n    std::vector<base_type > work(lwork);                                   \\\n    lapack_name(&jobvl, &jobvr, &n, &H(0,0), &n, &eigvr[0], &eigvi[0],     \\\n\t\t&Q(0,0), &n, &Q(0,0), &n, &work[0], &lwork, &info);    \t   \\\n    GMM_ASSERT1(!info, \"QR algorithm failed\");                             \\\n    gmm::copy(eigvr, gmm::real_part(const_cast<VECT &>(eigval_)));\t   \\\n    gmm::copy(eigvi, gmm::imag_part(const_cast<VECT &>(eigval_)));\t   \\\n  }\n\n# define geev_int_leftc(lapack_name, base_type)\t  \t\t           \\\n  template <typename VECT> inline void geev_interface_left(                \\\n         const dense_matrix<base_type > &A,  const VECT &eigval_,          \\\n         dense_matrix<base_type > &Q) {\t\t                           \\\n    GMMLAPACK_TRACE(\"geev_interface\");                                     \\\n    int n = int(mat_nrows(A)), info, lwork(-1); base_type work1;           \\\n    if (!n) return;                                                        \\\n    dense_matrix<base_type > H(n,n); gmm::copy(A, H);                      \\\n    char jobvl = 'V', jobvr = 'N';                                         \\\n    std::vector<double> rwork(2*n);                                        \\\n    std::vector<base_type> eigv(n);                                        \\\n    lapack_name(&jobvl, &jobvr, &n, &H(0,0), &n, &eigv[0], &Q(0,0), &n,    \\\n\t\t&Q(0,0), &n, &work1, &lwork, &rwork[0], &info);\t   \t   \\\n    lwork = int(gmm::real(work1));                                         \\\n    std::vector<base_type > work(lwork);                                   \\\n    lapack_name(&jobvl, &jobvr, &n, &H(0,0), &n, &eigv[0], &Q(0,0), &n,    \\\n\t\t&Q(0,0), &n, &work[0], &lwork,  &rwork[0],  &info);\t   \\\n    GMM_ASSERT1(!info, \"QR algorithm failed\");                             \\\n    gmm::copy(eigv, const_cast<VECT &>(eigval_));\t\t\t   \\\n  }\n\n  geev_int_left(sgeev_, BLAS_S)\n  geev_int_left(dgeev_, BLAS_D)\n  geev_int_leftc(cgeev_, BLAS_C)\n  geev_int_leftc(zgeev_, BLAS_Z) \n    \n\n\n  /* ********************************************************************* */\n  /* Interface to SVD. Does not correspond to a Gmm++ functionnality.      */\n  /* Author : Sebastian Nowozin <sebastian.nowozin@tuebingen.mpg.de>       */\n  /* ********************************************************************* */\n    \n# define gesvd_interface(lapack_name, base_type) inline                 \\\n  void svd(dense_matrix<base_type> &X,\t\t\t\t\t\\\n\t   dense_matrix<base_type> &U,                                  \\\n           dense_matrix<base_type> &Vtransposed,\t\t\t\\\n\t   std::vector<base_type> &sigma) {\t\t\t\t\\\n    GMMLAPACK_TRACE(\"gesvd_interface\");\t\t\t\t\t\\\n    int m = int(mat_nrows(X)), n = int(mat_ncols(X));\t       \t\t\\\n    int mn_min = m < n ? m : n;\t\t\t\t\t\t\\\n    sigma.resize(mn_min);\t\t\t\t\t\t\\\n    std::vector<base_type> work(15 * mn_min);\t\t\t\t\\\n    int lwork = int(work.size());\t       \t\t\t\t\\\n    resize(U, m, n);\t\t\t\t\t\t\t\\\n    resize(Vtransposed, n, n);\t\t\t\t\t\t\\\n    char job = 'A';\t\t\t\t\t\t\t\\\n    int info = -1;\t\t\t\t\t\t\t\\\n    lapack_name(&job, &job, &m, &n, &X(0,0), &m, &sigma[0], &U(0,0),\t\\\n\t\t&m, &Vtransposed(0,0), &n, &work[0], &lwork, &info);\t\\\n  }\n\n# define cgesvd_interface(lapack_name, base_type, base_type2) inline    \\\n  void svd(dense_matrix<base_type> &X,\t\t\t\t\t\\\n\t   dense_matrix<base_type> &U,                                  \\\n           dense_matrix<base_type> &Vtransposed,\t\t\t\\\n\t   std::vector<base_type2> &sigma) {\t\t\t\t\\\n    GMMLAPACK_TRACE(\"gesvd_interface\");\t\t\t\t\t\\\n    int m = int(mat_nrows(X)), n = int(mat_ncols(X));\t\t\t\\\n    int mn_min = m < n ? m : n;\t\t\t\t\t\t\\\n    sigma.resize(mn_min);\t\t\t\t\t\t\\\n    std::vector<base_type> work(15 * mn_min);\t\t\t\t\\\n    std::vector<base_type2> rwork(5 * mn_min);\t\t\t\t\\\n    int lwork = int(work.size());\t\t\t       \t\t\\\n    resize(U, m, n);\t\t\t\t\t\t\t\\\n    resize(Vtransposed, n, n);\t\t\t\t\t\t\\\n    char job = 'A';\t\t\t\t\t\t\t\\\n    int info = -1;\t\t\t\t\t\t\t\\\n    lapack_name(&job, &job, &m, &n, &X(0,0), &m, &sigma[0], &U(0,0),\t\\\n\t\t&m, &Vtransposed(0,0), &n, &work[0], &lwork,            \\\n\t\t&rwork[0], &info);\t\t\t\t\t\\\n  }\n  \n  gesvd_interface(sgesvd_, BLAS_S)\n  gesvd_interface(dgesvd_, BLAS_D)\n  cgesvd_interface(cgesvd_, BLAS_C, BLAS_S)\n  cgesvd_interface(zgesvd_, BLAS_Z, BLAS_D)\n    \n    \n\n\n\n}\n\n#endif // GMM_LAPACK_INTERFACE_H\n\n#endif // GMM_USES_LAPACK\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_least_squares_cg.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2002-2012 Yves Renard, Benjamin Schleimer\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n/**@file gmm_leastsquares_cg.h\n   @author Benjamin Schleimer <bensch128  (at) yahoo (dot) com>\n   @date January 23, 2007.\n   @brief Conjugate gradient least squares algorithm. \n   Algorithm taken from http://www.stat.washington.edu/wxs/Stat538-w05/Notes/conjugate-gradients.pdf page 6\n*/\n#ifndef GMM_LEAST_SQUARES_CG_H__\n#define GMM_LEAST_SQUARES_CG_H__\n\n#include \"gmm_kernel.h\"\n#include \"gmm_iter.h\"\n#include \"gmm_conjugated.h\"\n\nnamespace gmm {\n\n  template <typename Matrix, typename Vector1, typename Vector2>\n  void least_squares_cg(const Matrix& C, Vector1& x, const Vector2& y,\n\t\t\titeration &iter) {\n\n    typedef typename temporary_dense_vector<Vector1>::vector_type temp_vector;\n    typedef typename linalg_traits<Vector1>::value_type T;\n\n    T rho, rho_1(0), a;\n    temp_vector p(vect_size(x)), q(vect_size(y)), g(vect_size(x));\n    temp_vector r(vect_size(y));\n    iter.set_rhsnorm(gmm::sqrt(gmm::abs(vect_hp(y, y))));\n\n    if (iter.get_rhsnorm() == 0.0)\n      clear(x);\n    else {\n      mult(C, scaled(x, T(-1)), y, r);\n      mult(conjugated(C), r, g);\n      rho = vect_hp(g, g);\n      copy(g, p);\n\n      while (!iter.finished_vect(g)) {\n\n\tif (!iter.first()) { \n\t  rho = vect_hp(g, g);\n\t  add(g, scaled(p, rho / rho_1), p);\n\t}\n\n\tmult(C, p, q);\n\n\ta = rho / vect_hp(q, q);\t\n\tadd(scaled(p, a), x);\n\tadd(scaled(q, -a), r);\n\t// NOTE: how do we minimize the impact to the transpose?\n\tmult(conjugated(C), r, g);\n\trho_1 = rho;\n\n\t++iter;\n      }\n    }\n  }\n\n  template <typename Matrix, typename Precond, \n            typename Vector1, typename Vector2> inline \n  void least_squares_cg(const Matrix& C, const Vector1& x, const Vector2& y,\n\t\t\titeration &iter)\n  { least_squares_cg(C, linalg_const_cast(x), y, iter); }\n}\n\n\n#endif //  GMM_SOLVER_CG_H__\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_matrix.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2002-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n/** @file gmm_matrix.h\n   @author  Yves Renard <Yves.Renard@insa-lyon.fr>\n   @date October 13, 2002.\n    @brief Declaration of some matrix types (gmm::dense_matrix,\n    gmm::row_matrix, gmm::col_matrix, gmm::csc_matrix, etc.)\n*/\n\n#ifndef GMM_MATRIX_H__\n#define GMM_MATRIX_H__\n\n#include \"gmm_vector.h\"\n#include \"gmm_sub_vector.h\"\n#include \"gmm_sub_matrix.h\"\n#include \"gmm_transposed.h\"\n\nnamespace gmm\n{\n\n  /* ******************************************************************** */\n  /*\t\t                                            \t\t  */\n  /*\t\tIdentity matrix                         \t\t  */\n  /*\t\t                                            \t\t  */\n  /* ******************************************************************** */\n\n  struct identity_matrix {\n    template <class MAT> void build_with(const MAT &) {}\n  };\n\n  template <typename M> inline\n  void add(const identity_matrix&, M &v1) {\n    size_type n = std::min(gmm::mat_nrows(v1), gmm::mat_ncols(v1));\n    for (size_type i = 0; i < n; ++i)\n      v1(i,i) += typename linalg_traits<M>::value_type(1);\n  }\n  template <typename M> inline\n  void add(const identity_matrix &I, const M &v1)\n  { add(I, linalg_const_cast(v1)); }\n\n  template <typename V1, typename V2> inline\n  void mult(const identity_matrix&, const V1 &v1, V2 &v2)\n  { copy(v1, v2); }\n  template <typename V1, typename V2> inline\n  void mult(const identity_matrix&, const V1 &v1, const V2 &v2) \n  { copy(v1, v2); }\n  template <typename V1, typename V2, typename V3> inline\n  void mult(const identity_matrix&, const V1 &v1, const V2 &v2, V3 &v3)\n  { add(v1, v2, v3); }\n  template <typename V1, typename V2, typename V3> inline\n  void mult(const identity_matrix&, const V1 &v1, const V2 &v2, const V3 &v3)\n  { add(v1, v2, v3); }\n  template <typename V1, typename V2> inline\n  void left_mult(const identity_matrix&, const V1 &v1, V2 &v2)\n  { copy(v1, v2); }\n  template <typename V1, typename V2> inline\n  void left_mult(const identity_matrix&, const V1 &v1, const V2 &v2) \n  { copy(v1, v2); }\n  template <typename V1, typename V2> inline\n  void right_mult(const identity_matrix&, const V1 &v1, V2 &v2)\n  { copy(v1, v2); }\n  template <typename V1, typename V2> inline\n  void right_mult(const identity_matrix&, const V1 &v1, const V2 &v2) \n  { copy(v1, v2); }\n  template <typename V1, typename V2> inline\n  void transposed_left_mult(const identity_matrix&, const V1 &v1, V2 &v2)\n  { copy(v1, v2); }\n  template <typename V1, typename V2> inline\n  void transposed_left_mult(const identity_matrix&, const V1 &v1,const V2 &v2) \n  { copy(v1, v2); }\n  template <typename V1, typename V2> inline\n  void transposed_right_mult(const identity_matrix&, const V1 &v1, V2 &v2)\n  { copy(v1, v2); }\n  template <typename V1, typename V2> inline\n  void transposed_right_mult(const identity_matrix&,const V1 &v1,const V2 &v2) \n  { copy(v1, v2); }\n  template <typename M> void copy_ident(const identity_matrix&, M &m) {\n    size_type i = 0, n = std::min(mat_nrows(m), mat_ncols(m));\n    clear(m);\n    for (; i < n; ++i) m(i,i) = typename linalg_traits<M>::value_type(1);\n  }\n  template <typename M> inline void copy(const identity_matrix&, M &m)\n  { copy_ident(identity_matrix(), m); } \n  template <typename M> inline void copy(const identity_matrix &, const M &m)\n  { copy_ident(identity_matrix(), linalg_const_cast(m)); }\n  template <typename V1, typename V2> inline\n  typename linalg_traits<V1>::value_type\n  vect_sp(const identity_matrix &, const V1 &v1, const V2 &v2)\n  { return vect_sp(v1, v2); }\n  template <typename V1, typename V2> inline\n  typename linalg_traits<V1>::value_type\n  vect_hp(const identity_matrix &, const V1 &v1, const V2 &v2)\n  { return vect_hp(v1, v2); }\n  template<typename M> inline bool is_identity(const M&) { return false; }\n  inline bool is_identity(const identity_matrix&) { return true; }\n\n  /* ******************************************************************** */\n  /*\t\t                                            \t\t  */\n  /*\t\tRow matrix                                   \t\t  */\n  /*\t\t                                            \t\t  */\n  /* ******************************************************************** */\n\n  template<typename V> class row_matrix {\n  protected :\n    std::vector<V> li; /* array of rows.                                  */\n    size_type nc;\n    \n  public :\n    \n    typedef typename linalg_traits<V>::reference reference;\n    typedef typename linalg_traits<V>::value_type value_type;\n    \n    row_matrix(size_type r, size_type c) : li(r, V(c)), nc(c) {}\n    row_matrix(void) : nc(0) {}\n    reference operator ()(size_type l, size_type c) \n    { return li[l][c]; }\n    value_type operator ()(size_type l, size_type c) const\n    { return li[l][c]; }\n\n    void clear_mat();\n    void resize(size_type m, size_type n);\n\n    typename std::vector<V>::iterator begin(void)\n    { return li.begin(); }\n    typename std::vector<V>::iterator end(void)  \n    { return li.end(); }\n    typename std::vector<V>::const_iterator begin(void) const\n    { return li.begin(); }\n    typename std::vector<V>::const_iterator end(void) const\n    { return li.end(); }\n    \n    \n    V& row(size_type i) { return li[i]; }\n    const V& row(size_type i) const { return li[i]; }\n    V& operator[](size_type i) { return li[i]; }\n    const V& operator[](size_type i) const { return li[i]; }\n    \n    inline size_type nrows(void) const { return li.size(); }\n    inline size_type ncols(void) const { return nc;        }\n\n    void swap(row_matrix<V> &m) { std::swap(li, m.li); std::swap(nc, m.nc); }\n    void swap_row(size_type i, size_type j) { std::swap(li[i], li[j]); }\n  };\n\n  template<typename V> void row_matrix<V>::resize(size_type m, size_type n) {\n    size_type nr = std::min(nrows(), m);\n    li.resize(m);\n    for (size_type i=nr; i < m; ++i) gmm::resize(li[i], n);\n    if (n != nc) {\n      for (size_type i=0; i < nr; ++i) gmm::resize(li[i], n);    \n      nc = n;\n    }\n  }\n\n\n  template<typename V> void row_matrix<V>::clear_mat()\n  { for (size_type i=0; i < nrows(); ++i) clear(li[i]); }\n\n  template <typename V> struct linalg_traits<row_matrix<V> > {\n    typedef row_matrix<V> this_type;\n    typedef this_type origin_type;\n    typedef linalg_false is_reference;\n    typedef abstract_matrix linalg_type;\n    typedef typename linalg_traits<V>::value_type value_type;\n    typedef typename linalg_traits<V>::reference reference;\n    typedef typename linalg_traits<V>::storage_type storage_type;\n    typedef simple_vector_ref<V *> sub_row_type;\n    typedef simple_vector_ref<const V *> const_sub_row_type;\n    typedef typename std::vector<V>::iterator row_iterator;\n    typedef typename std::vector<V>::const_iterator const_row_iterator;\n    typedef abstract_null_type sub_col_type;\n    typedef abstract_null_type const_sub_col_type;\n    typedef abstract_null_type col_iterator;\n    typedef abstract_null_type const_col_iterator;\n    typedef row_major sub_orientation;\n    typedef linalg_true index_sorted;\n    static size_type nrows(const this_type &m) { return m.nrows(); }\n    static size_type ncols(const this_type &m) { return m.ncols(); }\n    static row_iterator row_begin(this_type &m) { return m.begin(); }\n    static row_iterator row_end(this_type &m) { return m.end(); }\n    static const_row_iterator row_begin(const this_type &m)\n    { return m.begin(); }\n    static const_row_iterator row_end(const this_type &m)\n    { return m.end(); }\n    static const_sub_row_type row(const const_row_iterator &it)\n    { return const_sub_row_type(*it); }\n    static sub_row_type row(const row_iterator &it) \n    { return sub_row_type(*it); }\n    static origin_type* origin(this_type &m) { return &m; }\n    static const origin_type* origin(const this_type &m) { return &m; }\n    static void do_clear(this_type &m) { m.clear_mat(); }\n    static value_type access(const const_row_iterator &itrow, size_type j)\n    { return (*itrow)[j]; }\n    static reference access(const row_iterator &itrow, size_type j)\n    { return (*itrow)[j]; }\n    static void resize(this_type &v, size_type m, size_type n)\n    { v.resize(m, n); }\n    static void reshape(this_type &, size_type, size_type)\n    { GMM_ASSERT1(false, \"Sorry, to be done\"); }\n  };\n\n  template<typename V> std::ostream &operator <<\n    (std::ostream &o, const row_matrix<V>& m) { gmm::write(o,m); return o; }\n\n  /* ******************************************************************** */\n  /*\t\t                                            \t\t  */\n  /*\t\tColumn matrix                                \t\t  */\n  /*\t\t                                            \t\t  */\n  /* ******************************************************************** */\n\n  template<typename V> class col_matrix {\n  protected :\n    std::vector<V> li; /* array of columns.                               */\n    size_type nr;\n    \n  public :\n    \n    typedef typename linalg_traits<V>::reference reference;\n    typedef typename linalg_traits<V>::value_type value_type;\n    \n    col_matrix(size_type r, size_type c) : li(c, V(r)), nr(r) { }\n    col_matrix(void) : nr(0) {}\n    reference operator ()(size_type l, size_type c)\n    { return li[c][l]; }\n    value_type operator ()(size_type l, size_type c) const\n    { return li[c][l]; }\n\n    void clear_mat();\n    void resize(size_type, size_type);\n\n    V& col(size_type i) { return li[i]; }\n    const V& col(size_type i) const { return li[i]; }\n    V& operator[](size_type i) { return li[i]; }\n    const V& operator[](size_type i) const { return li[i]; }\n\n    typename std::vector<V>::iterator begin(void)\n    { return li.begin(); }\n    typename std::vector<V>::iterator end(void)  \n    { return li.end(); }\n    typename std::vector<V>::const_iterator begin(void) const\n    { return li.begin(); }\n    typename std::vector<V>::const_iterator end(void) const\n    { return li.end(); }\n    \n    inline size_type ncols(void) const { return li.size(); }\n    inline size_type nrows(void) const { return nr; }\n\n    void swap(col_matrix<V> &m) { std::swap(li, m.li); std::swap(nr, m.nr); }\n    void swap_col(size_type i, size_type j) { std::swap(li[i], li[j]); }\n  };\n\n  template<typename V> void col_matrix<V>::resize(size_type m, size_type n) {\n    size_type nc = std::min(ncols(), n);\n    li.resize(n);\n    for (size_type i=nc; i < n; ++i) gmm::resize(li[i], m);\n    if (m != nr) {\n      for (size_type i=0; i < nc; ++i) gmm::resize(li[i], m);    \n      nr = m;\n    }\n  }\n\n  template<typename V> void col_matrix<V>::clear_mat()\n  { for (size_type i=0; i < ncols(); ++i)  clear(li[i]); }\n\n  template <typename V> struct linalg_traits<col_matrix<V> > {\n    typedef col_matrix<V> this_type;\n    typedef this_type origin_type;\n    typedef linalg_false is_reference;\n    typedef abstract_matrix linalg_type;\n    typedef typename linalg_traits<V>::value_type value_type;\n    typedef typename linalg_traits<V>::reference reference;\n    typedef typename linalg_traits<V>::storage_type storage_type;\n    typedef simple_vector_ref<V *> sub_col_type;\n    typedef simple_vector_ref<const V *> const_sub_col_type;\n    typedef typename std::vector<V>::iterator col_iterator;\n    typedef typename std::vector<V>::const_iterator const_col_iterator;\n    typedef abstract_null_type sub_row_type;\n    typedef abstract_null_type const_sub_row_type;\n    typedef abstract_null_type row_iterator;\n    typedef abstract_null_type const_row_iterator;\n    typedef col_major sub_orientation;\n    typedef linalg_true index_sorted;\n    static size_type nrows(const this_type &m) { return m.nrows(); }\n    static size_type ncols(const this_type &m) { return m.ncols(); }\n    static col_iterator col_begin(this_type &m) { return m.begin(); }\n    static col_iterator col_end(this_type &m) { return m.end(); }\n    static const_col_iterator col_begin(const this_type &m)\n    { return m.begin(); }\n    static const_col_iterator col_end(const this_type &m)\n    { return m.end(); }\n    static const_sub_col_type col(const const_col_iterator &it)\n    { return const_sub_col_type(*it); }\n    static sub_col_type col(const col_iterator &it) \n    { return sub_col_type(*it); }\n    static origin_type* origin(this_type &m) { return &m; }\n    static const origin_type* origin(const this_type &m) { return &m; }\n    static void do_clear(this_type &m) { m.clear_mat(); }\n    static value_type access(const const_col_iterator &itcol, size_type j)\n    { return (*itcol)[j]; }\n    static reference access(const col_iterator &itcol, size_type j)\n    { return (*itcol)[j]; }\n    static void resize(this_type &v, size_type m, size_type n)\n    { v.resize(m,n); }\n    static void reshape(this_type &, size_type, size_type)\n    { GMM_ASSERT1(false, \"Sorry, to be done\"); }\n  };\n\n  template<typename V> std::ostream &operator <<\n    (std::ostream &o, const col_matrix<V>& m) { gmm::write(o,m); return o; }\n\n  /* ******************************************************************** */\n  /*\t\t                                            \t\t  */\n  /*\t\tDense matrix                                \t\t  */\n  /*\t\t                                            \t\t  */\n  /* ******************************************************************** */\n\n  template<typename T> class dense_matrix : public std::vector<T> {\n  public:\n    typedef typename std::vector<T>::size_type size_type;\n    typedef typename std::vector<T>::iterator iterator;\n    typedef typename std::vector<T>::const_iterator const_iterator;\n    typedef typename std::vector<T>::reference reference;\n    typedef typename std::vector<T>::const_reference const_reference;\n    \n  protected:\n    size_type nbc, nbl;\n    \n  public:\n    \n    inline const_reference operator ()(size_type l, size_type c) const {\n      GMM_ASSERT2(l < nbl && c < nbc, \"out of range\");\n      return *(this->begin() + c*nbl+l);\n    }\n    inline reference operator ()(size_type l, size_type c) {\n      GMM_ASSERT2(l < nbl && c < nbc, \"out of range\");\n      return *(this->begin() + c*nbl+l);\n    }\n\n    void resize(size_type, size_type);\n    void reshape(size_type, size_type);\n    \n    void fill(T a, T b = T(0));\n    inline size_type nrows(void) const { return nbl; }\n    inline size_type ncols(void) const { return nbc; }\n    void swap(dense_matrix<T> &m)\n    { std::vector<T>::swap(m); std::swap(nbc, m.nbc); std::swap(nbl, m.nbl); }\n    \n    dense_matrix(size_type l, size_type c)\n      : std::vector<T>(c*l), nbc(c), nbl(l)  {}\n    dense_matrix(void) { nbl = nbc = 0; }\n  };\n\n  template<typename T> void dense_matrix<T>::reshape(size_type m,size_type n) {\n    GMM_ASSERT2(n*m == nbl*nbc, \"dimensions mismatch\");\n    nbl = m; nbc = n;\n  }\n\n  template<typename T> void dense_matrix<T>::resize(size_type m, size_type n) {\n    if (n*m > nbc*nbl) std::vector<T>::resize(n*m);\n    if (m < nbl) {\n      for (size_type i = 1; i < std::min(nbc, n); ++i)\n\tstd::copy(this->begin()+i*nbl, this->begin()+(i*nbl+m),\n\t\t  this->begin()+i*m);\n      for (size_type i = std::min(nbc, n); i < n; ++i)\n\tstd::fill(this->begin()+(i*m), this->begin()+(i+1)*m, T(0));\n      }\n    else if (m > nbl) { /* do nothing when the nb of rows does not change */\n      for (size_type i = std::min(nbc, n); i > 1; --i)\n\tstd::copy(this->begin()+(i-1)*nbl, this->begin()+i*nbl,\n\t\t  this->begin()+(i-1)*m);\n      for (size_type i = 0; i < std::min(nbc, n); ++i)\n\tstd::fill(this->begin()+(i*m+nbl), this->begin()+(i+1)*m, T(0));\n    }\n    if (n*m < nbc*nbl) std::vector<T>::resize(n*m);\n    nbl = m; nbc = n;\n  }\n  \n  template<typename T> void dense_matrix<T>::fill(T a, T b) {\n    std::fill(this->begin(), this->end(), b);\n    size_type n = std::min(nbl, nbc);\n    if (a != b) for (size_type i = 0; i < n; ++i) (*this)(i,i) = a; \n  }\n\n  template <typename T> struct linalg_traits<dense_matrix<T> > {\n    typedef dense_matrix<T> this_type;\n    typedef this_type origin_type;\n    typedef linalg_false is_reference;\n    typedef abstract_matrix linalg_type;\n    typedef T value_type;\n    typedef T& reference;\n    typedef abstract_dense storage_type;\n    typedef tab_ref_reg_spaced_with_origin<typename this_type::iterator,\n\t\t\t\t\t   this_type> sub_row_type;\n    typedef tab_ref_reg_spaced_with_origin<typename this_type::const_iterator,\n\t\t\t\t\t   this_type> const_sub_row_type;\n    typedef dense_compressed_iterator<typename this_type::iterator,\n\t\t\t\t      typename this_type::iterator,\n\t\t\t\t      this_type *> row_iterator;\n    typedef dense_compressed_iterator<typename this_type::const_iterator,\n\t\t\t\t      typename this_type::iterator,\n\t\t\t\t      const this_type *> const_row_iterator;\n    typedef tab_ref_with_origin<typename this_type::iterator, \n\t\t\t\tthis_type> sub_col_type;\n    typedef tab_ref_with_origin<typename this_type::const_iterator,\n\t\t\t\tthis_type> const_sub_col_type;\n    typedef dense_compressed_iterator<typename this_type::iterator,\n\t\t\t\t      typename this_type::iterator,\n\t\t\t\t      this_type *> col_iterator;\n    typedef dense_compressed_iterator<typename this_type::const_iterator,\n\t\t\t\t      typename this_type::iterator,\n\t\t\t\t      const this_type *> const_col_iterator;\n    typedef col_and_row sub_orientation;\n    typedef linalg_true index_sorted;\n    static size_type nrows(const this_type &m) { return m.nrows(); }\n    static size_type ncols(const this_type &m) { return m.ncols(); }\n    static const_sub_row_type row(const const_row_iterator &it)\n    { return const_sub_row_type(*it, it.nrows, it.ncols, it.origin); }\n    static const_sub_col_type col(const const_col_iterator &it)\n    { return const_sub_col_type(*it, *it + it.nrows, it.origin); }\n    static sub_row_type row(const row_iterator &it)\n    { return sub_row_type(*it, it.nrows, it.ncols, it.origin); }\n    static sub_col_type col(const col_iterator &it)\n    { return sub_col_type(*it, *it + it.nrows, it.origin); }\n    static row_iterator row_begin(this_type &m)\n    { return row_iterator(m.begin(), m.size() ? 1 : 0, m.nrows(), m.ncols(), 0, &m); }\n    static row_iterator row_end(this_type &m)\n    { return row_iterator(m.begin(), m.size() ? 1 : 0, m.nrows(), m.ncols(), m.nrows(), &m); }\n    static const_row_iterator row_begin(const this_type &m)\n    { return const_row_iterator(m.begin(), m.size() ? 1 : 0, m.nrows(), m.ncols(), 0, &m); }\n    static const_row_iterator row_end(const this_type &m)\n    { return const_row_iterator(m.begin(),  m.size() ? 1 : 0, m.nrows(), m.ncols(), m.nrows(), &m); }\n    static col_iterator col_begin(this_type &m)\n    { return col_iterator(m.begin(), m.nrows(), m.nrows(), m.ncols(), 0, &m); }\n    static col_iterator col_end(this_type &m)\n    { return col_iterator(m.begin(), m.nrows(), m.nrows(), m.ncols(), m.ncols(), &m); }\n    static const_col_iterator col_begin(const this_type &m)\n    { return const_col_iterator(m.begin(), m.nrows(), m.nrows(), m.ncols(), 0, &m); }\n    static const_col_iterator col_end(const this_type &m)\n    { return const_col_iterator(m.begin(),m.nrows(),m.nrows(),m.ncols(),m.ncols(), &m); }\n    static origin_type* origin(this_type &m) { return &m; }\n    static const origin_type* origin(const this_type &m) { return &m; }\n    static void do_clear(this_type &m) { m.fill(value_type(0)); }\n    static value_type access(const const_col_iterator &itcol, size_type j)\n    { return (*itcol)[j]; }\n    static reference access(const col_iterator &itcol, size_type j)\n    { return (*itcol)[j]; }\n    static void resize(this_type &v, size_type m, size_type n)\n    { v.resize(m,n); }\n    static void reshape(this_type &v, size_type m, size_type n)\n    { v.reshape(m, n); }\n  };\n\n  template<typename T> std::ostream &operator <<\n    (std::ostream &o, const dense_matrix<T>& m) { gmm::write(o,m); return o; }\n\n\n  /* ******************************************************************** */\n  /*                                                                      */\n  /*\t        Read only compressed sparse column matrix                 */\n  /*                                                                      */\n  /* ******************************************************************** */\n\n  template <typename T, int shift = 0>\n  struct csc_matrix {\n    typedef unsigned int IND_TYPE;\n\n    std::vector<T> pr;\n    std::vector<IND_TYPE> ir;\n    std::vector<IND_TYPE> jc;\n    size_type nc, nr;\n\n    typedef T value_type;\n    typedef T& access_type;\n\n    template <typename Matrix> void init_with_good_format(const Matrix &B);\n    template <typename Matrix> void init_with(const Matrix &A);\n    void init_with(const col_matrix<gmm::rsvector<T> > &B)\n    { init_with_good_format(B); }\n    void init_with(const col_matrix<wsvector<T> > &B)\n    { init_with_good_format(B); }\n    template <typename PT1, typename PT2, typename PT3, int cshift>\n    void init_with(const csc_matrix_ref<PT1,PT2,PT3,cshift>& B)\n    { init_with_good_format(B); }\n    template <typename U, int cshift>    \n    void init_with(const csc_matrix<U, cshift>& B)\n    { init_with_good_format(B); }\n\n    void init_with_identity(size_type n);\n\n    csc_matrix(void) :  nc(0), nr(0) {}\n    csc_matrix(size_type nnr, size_type nnc);\n\n    size_type nrows(void) const { return nr; }\n    size_type ncols(void) const { return nc; }\n    void swap(csc_matrix<T, shift> &m) { \n      std::swap(pr, m.pr); \n      std::swap(ir, m.ir); std::swap(jc, m.jc); \n      std::swap(nc, m.nc); std::swap(nr, m.nr);\n    }\n    value_type operator()(size_type i, size_type j) const\n    { return mat_col(*this, j)[i]; }\n  };\n\n  template <typename T, int shift> template<typename Matrix>\n  void csc_matrix<T, shift>::init_with_good_format(const Matrix &B) {\n    typedef typename linalg_traits<Matrix>::const_sub_col_type col_type;\n    nc = mat_ncols(B); nr = mat_nrows(B);\n    jc.resize(nc+1);\n    jc[0] = shift;\n    for (size_type j = 0; j < nc; ++j) {\n      jc[j+1] = IND_TYPE(jc[j] + nnz(mat_const_col(B, j)));\n    }\n    pr.resize(jc[nc]);\n    ir.resize(jc[nc]);\n    for (size_type j = 0; j < nc; ++j) {\n      col_type col = mat_const_col(B, j);\n      typename linalg_traits<col_type>::const_iterator\n\tit = vect_const_begin(col), ite = vect_const_end(col);\n      for (size_type k = 0; it != ite; ++it, ++k) {\n\tpr[jc[j]-shift+k] = *it;\n\tir[jc[j]-shift+k] = IND_TYPE(it.index() + shift);\n      }\n    }\n  }\n  \n  template <typename T, int shift> template <typename Matrix>\n  void csc_matrix<T, shift>::init_with(const Matrix &A) {\n    col_matrix<wsvector<T> > B(mat_nrows(A), mat_ncols(A));\n    copy(A, B);\n    init_with_good_format(B);\n  }\n  \n  template <typename T, int shift>\n  void csc_matrix<T, shift>::init_with_identity(size_type n) {\n    nc = nr = n; \n    pr.resize(nc); ir.resize(nc); jc.resize(nc+1);\n    for (size_type j = 0; j < nc; ++j)\n      { ir[j] = jc[j] = shift + j; pr[j] = T(1); }\n    jc[nc] = shift + nc;\n  }\n  \n  template <typename T, int shift>\n  csc_matrix<T, shift>::csc_matrix(size_type nnr, size_type nnc)\n    : nc(nnc), nr(nnr) {\n    pr.resize(1);  ir.resize(1); jc.resize(nc+1);\n    for (size_type j = 0; j <= nc; ++j) jc[j] = shift;\n  }\n\n  template <typename T, int shift>\n  struct linalg_traits<csc_matrix<T, shift> > {\n    typedef csc_matrix<T, shift> this_type;\n    typedef typename this_type::IND_TYPE IND_TYPE;\n    typedef linalg_const is_reference;\n    typedef abstract_matrix linalg_type;\n    typedef T value_type;\n    typedef T origin_type;\n    typedef T reference;\n    typedef abstract_sparse storage_type;\n    typedef abstract_null_type sub_row_type;\n    typedef abstract_null_type const_sub_row_type;\n    typedef abstract_null_type row_iterator;\n    typedef abstract_null_type const_row_iterator;\n    typedef abstract_null_type sub_col_type;\n    typedef cs_vector_ref<const T *, const IND_TYPE *, shift>\n    const_sub_col_type;\n    typedef sparse_compressed_iterator<const T *, const IND_TYPE *,\n\t\t\t\t       const IND_TYPE *, shift>\n    const_col_iterator;\n    typedef abstract_null_type col_iterator;\n    typedef col_major sub_orientation;\n    typedef linalg_true index_sorted;\n    static size_type nrows(const this_type &m) { return m.nrows(); }\n    static size_type ncols(const this_type &m) { return m.ncols(); }\n    static const_col_iterator col_begin(const this_type &m)\n    { return const_col_iterator(&m.pr[0],&m.ir[0],&m.jc[0], m.nr, &m.pr[0]); }\n    static const_col_iterator col_end(const this_type &m) {\n      return const_col_iterator(&m.pr[0],&m.ir[0],&m.jc[0]+m.nc,\n\t\t\t\tm.nr,&m.pr[0]);\n    }\n    static const_sub_col_type col(const const_col_iterator &it) {\n      return const_sub_col_type(it.pr + *(it.jc) - shift,\n\t\t\t\tit.ir + *(it.jc) - shift,\n\t\t\t\t*(it.jc + 1) - *(it.jc), it.n);\n    }\n    static const origin_type* origin(const this_type &m) { return &m.pr[0]; }\n    static void do_clear(this_type &m) { m.do_clear(); }\n    static value_type access(const const_col_iterator &itcol, size_type j)\n    { return col(itcol)[j]; }\n  };\n\n  template <typename T, int shift>\n  std::ostream &operator <<\n    (std::ostream &o, const csc_matrix<T, shift>& m)\n  { gmm::write(o,m); return o; }\n  \n  template <typename T, int shift>\n  inline void copy(const identity_matrix &, csc_matrix<T, shift>& M)\n  { M.init_with_identity(mat_nrows(M)); }\n\n  template <typename Matrix, typename T, int shift>\n  inline void copy(const Matrix &A, csc_matrix<T, shift>& M)\n  { M.init_with(A); }\n\n  /* ******************************************************************** */\n  /*                                                                      */\n  /*\t        Read only compressed sparse row matrix                    */\n  /*                                                                      */\n  /* ******************************************************************** */\n\n  template <typename T, int shift = 0>\n  struct csr_matrix {\n\n    typedef unsigned int IND_TYPE;\n\n    std::vector<T> pr;        // values.\n    std::vector<IND_TYPE> ir; // col indices.\n    std::vector<IND_TYPE> jc; // row repartition on pr and ir.\n    size_type nc, nr;\n\n    typedef T value_type;\n    typedef T& access_type;\n\n\n    template <typename Matrix> void init_with_good_format(const Matrix &B);\n    void init_with(const row_matrix<wsvector<T> > &B)\n    { init_with_good_format(B); }\n    void init_with(const row_matrix<rsvector<T> > &B)\n    { init_with_good_format(B); }\n    template <typename PT1, typename PT2, typename PT3, int cshift>\n    void init_with(const csr_matrix_ref<PT1,PT2,PT3,cshift>& B)\n    { init_with_good_format(B); }\n    template <typename U, int cshift>\n    void init_with(const csr_matrix<U, cshift>& B)\n    { init_with_good_format(B); }\n\n    template <typename Matrix> void init_with(const Matrix &A);\n    void init_with_identity(size_type n);\n\n    csr_matrix(void) : nc(0), nr(0) {}\n    csr_matrix(size_type nnr, size_type nnc);\n\n    size_type nrows(void) const { return nr; }\n    size_type ncols(void) const { return nc; }\n    void swap(csr_matrix<T, shift> &m) { \n      std::swap(pr, m.pr); \n      std::swap(ir,m.ir); std::swap(jc, m.jc); \n      std::swap(nc, m.nc); std::swap(nr,m.nr);\n    }\n   \n    value_type operator()(size_type i, size_type j) const\n    { return mat_row(*this, i)[j]; }\n  };\n  \n  template <typename T, int shift> template <typename Matrix>\n  void csr_matrix<T, shift>::init_with_good_format(const Matrix &B) {\n    typedef typename linalg_traits<Matrix>::const_sub_row_type row_type;\n    nc = mat_ncols(B); nr = mat_nrows(B);\n    jc.resize(nr+1);\n    jc[0] = shift;\n    for (size_type j = 0; j < nr; ++j) {\n      jc[j+1] = IND_TYPE(jc[j] + nnz(mat_const_row(B, j)));\n    }\n    pr.resize(jc[nr]);\n    ir.resize(jc[nr]);\n    for (size_type j = 0; j < nr; ++j) {\n      row_type row = mat_const_row(B, j);\n      typename linalg_traits<row_type>::const_iterator\n\tit = vect_const_begin(row), ite = vect_const_end(row);\n      for (size_type k = 0; it != ite; ++it, ++k) {\n\tpr[jc[j]-shift+k] = *it;\n\tir[jc[j]-shift+k] = IND_TYPE(it.index()+shift);\n      }\n    }\n  }\n\n  template <typename T, int shift> template <typename Matrix> \n  void csr_matrix<T, shift>::init_with(const Matrix &A) { \n    row_matrix<wsvector<T> > B(mat_nrows(A), mat_ncols(A)); \n    copy(A, B); \n    init_with_good_format(B);\n  }\n\n  template <typename T, int shift> \n  void csr_matrix<T, shift>::init_with_identity(size_type n) {\n    nc = nr = n; \n    pr.resize(nr); ir.resize(nr); jc.resize(nr+1);\n    for (size_type j = 0; j < nr; ++j)\n      { ir[j] = jc[j] = shift + j; pr[j] = T(1); }\n    jc[nr] = shift + nr;\n  }\n\n  template <typename T, int shift>\n  csr_matrix<T, shift>::csr_matrix(size_type nnr, size_type nnc)\n    : nc(nnc), nr(nnr) {\n    pr.resize(1);  ir.resize(1); jc.resize(nr+1);\n    for (size_type j = 0; j < nr; ++j) jc[j] = shift;\n    jc[nr] = shift;\n  }\n\n\n  template <typename T, int shift>\n  struct linalg_traits<csr_matrix<T, shift> > {\n    typedef csr_matrix<T, shift> this_type;\n    typedef typename this_type::IND_TYPE IND_TYPE;\n    typedef linalg_const is_reference;\n    typedef abstract_matrix linalg_type;\n    typedef T value_type;\n    typedef T origin_type;\n    typedef T reference;\n    typedef abstract_sparse storage_type;\n    typedef abstract_null_type sub_col_type;\n    typedef abstract_null_type const_sub_col_type;\n    typedef abstract_null_type col_iterator;\n    typedef abstract_null_type const_col_iterator;\n    typedef abstract_null_type sub_row_type;\n    typedef cs_vector_ref<const T *, const IND_TYPE *, shift>\n    const_sub_row_type;\n    typedef sparse_compressed_iterator<const T *, const IND_TYPE *,\n\t\t\t\t       const IND_TYPE *, shift>\n    const_row_iterator;\n    typedef abstract_null_type row_iterator;\n    typedef row_major sub_orientation;\n    typedef linalg_true index_sorted;\n    static size_type nrows(const this_type &m) { return m.nrows(); }\n    static size_type ncols(const this_type &m) { return m.ncols(); }\n    static const_row_iterator row_begin(const this_type &m)\n    { return const_row_iterator(&m.pr[0], &m.ir[0], &m.jc[0], m.nc, &m.pr[0]); }\n    static const_row_iterator row_end(const this_type &m)\n    { return const_row_iterator(&m.pr[0], &m.ir[0], &m.jc[0] + m.nr, m.nc, &m.pr[0]); }\n    static const_sub_row_type row(const const_row_iterator &it) {\n      return const_sub_row_type(it.pr + *(it.jc) - shift,\n\t\t\t\tit.ir + *(it.jc) - shift,\n\t\t\t\t*(it.jc + 1) - *(it.jc), it.n);\n    }\n    static const origin_type* origin(const this_type &m) { return &m.pr[0]; }\n    static void do_clear(this_type &m) { m.do_clear(); }\n    static value_type access(const const_row_iterator &itrow, size_type j)\n    { return row(itrow)[j]; }\n  };\n\n  template <typename T, int shift>\n  std::ostream &operator <<\n    (std::ostream &o, const csr_matrix<T, shift>& m)\n  { gmm::write(o,m); return o; }\n  \n  template <typename T, int shift>\n  inline void copy(const identity_matrix &, csr_matrix<T, shift>& M)\n  { M.init_with_identity(mat_nrows(M)); }\n\n  template <typename Matrix, typename T, int shift>\n  inline void copy(const Matrix &A, csr_matrix<T, shift>& M)\n  { M.init_with(A); }\n\n  /* ******************************************************************** */\n  /*\t\t                                            \t\t  */\n  /*\t\tBlock matrix                                \t\t  */\n  /*\t\t                                            \t\t  */\n  /* ******************************************************************** */\n\n  template <typename MAT> class block_matrix {\n  protected :\n    std::vector<MAT> blocks;\n    size_type nrowblocks_;\n    size_type ncolblocks_;\n    std::vector<sub_interval> introw, intcol;\n\n  public :\n    typedef typename linalg_traits<MAT>::value_type value_type;\n    typedef typename linalg_traits<MAT>::reference reference;\n\n    size_type nrows(void) const { return introw[nrowblocks_-1].max; }\n    size_type ncols(void) const { return intcol[ncolblocks_-1].max; }\n    size_type nrowblocks(void) const { return nrowblocks_; }\n    size_type ncolblocks(void) const { return ncolblocks_; }\n    const sub_interval &subrowinterval(size_type i) const { return introw[i]; }\n    const sub_interval &subcolinterval(size_type i) const { return intcol[i]; }\n    const MAT &block(size_type i, size_type j) const \n    { return blocks[j*ncolblocks_+i]; }\n    MAT &block(size_type i, size_type j)\n    { return blocks[j*ncolblocks_+i]; }\n    void do_clear(void);\n    // to be done : read and write access to a component\n    value_type operator() (size_type i, size_type j) const {\n      size_type k, l;\n      for (k = 0; k < nrowblocks_; ++k)\n\tif (i >= introw[k].min && i <  introw[k].max) break;\n      for (l = 0; l < nrowblocks_; ++l)\n\tif (j >= introw[l].min && j <  introw[l].max) break;\n      return (block(k, l))(i - introw[k].min, j - introw[l].min);\n    }\n    reference operator() (size_type i, size_type j) {\n      size_type k, l;\n      for (k = 0; k < nrowblocks_; ++k)\n\tif (i >= introw[k].min && i <  introw[k].max) break;\n      for (l = 0; l < nrowblocks_; ++l)\n\tif (j >= introw[l].min && j <  introw[l].max) break;\n      return (block(k, l))(i - introw[k].min, j - introw[l].min);\n    }\n    \n    template <typename CONT> void resize(const CONT &c1, const CONT &c2);\n    template <typename CONT> block_matrix(const CONT &c1, const CONT &c2)\n    { resize(c1, c2); }\n    block_matrix(void) {}\n\n  };\n\n  template <typename MAT> struct linalg_traits<block_matrix<MAT> > {\n    typedef block_matrix<MAT> this_type;\n    typedef linalg_false is_reference;\n    typedef abstract_matrix linalg_type;\n    typedef this_type origin_type;\n    typedef typename linalg_traits<MAT>::value_type value_type;\n    typedef typename linalg_traits<MAT>::reference reference;\n    typedef typename linalg_traits<MAT>::storage_type storage_type;\n    typedef abstract_null_type sub_row_type;       // to be done ...\n    typedef abstract_null_type const_sub_row_type; // to be done ...\n    typedef abstract_null_type row_iterator;       // to be done ...\n    typedef abstract_null_type const_row_iterator; // to be done ...\n    typedef abstract_null_type sub_col_type;       // to be done ...\n    typedef abstract_null_type const_sub_col_type; // to be done ...\n    typedef abstract_null_type col_iterator;       // to be done ...\n    typedef abstract_null_type const_col_iterator; // to be done ...\n    typedef abstract_null_type sub_orientation;    // to be done ...\n    typedef linalg_true index_sorted;\n    static size_type nrows(const this_type &m) { return m.nrows(); }\n    static size_type ncols(const this_type &m) { return m.ncols(); }\n    static origin_type* origin(this_type &m) { return &m; }\n    static const origin_type* origin(const this_type &m) { return &m; }\n    static void do_clear(this_type &m) { m.do_clear(); }\n    // access to be done ...    \n    static void resize(this_type &, size_type , size_type)\n    { GMM_ASSERT1(false, \"Sorry, to be done\"); }\n    static void reshape(this_type &, size_type , size_type)\n    { GMM_ASSERT1(false, \"Sorry, to be done\"); }\n  };\n\n  template <typename MAT> void block_matrix<MAT>::do_clear(void) { \n    for (size_type j = 0, l = 0; j < ncolblocks_; ++j)\n      for (size_type i = 0, k = 0; i < nrowblocks_; ++i)\n\tclear(block(i,j));\n  }\n\n  template <typename MAT> template <typename CONT>\n  void block_matrix<MAT>::resize(const CONT &c1, const CONT &c2) {\n    nrowblocks_ = c1.size(); ncolblocks_ = c2.size();\n    blocks.resize(nrowblocks_ * ncolblocks_);\n    intcol.resize(ncolblocks_);\n    introw.resize(nrowblocks_);\n    for (size_type j = 0, l = 0; j < ncolblocks_; ++j) {\n      intcol[j] = sub_interval(l, c2[j]); l += c2[j];\n      for (size_type i = 0, k = 0; i < nrowblocks_; ++i) {\n\tif (j == 0) { introw[i] = sub_interval(k, c1[i]); k += c1[i]; }\n\tblock(i, j) = MAT(c1[i], c2[j]);\n      }\n    }\n  }\n\n  template <typename M1, typename M2>\n  void copy(const block_matrix<M1> &m1, M2 &m2) {\n    for (size_type j = 0; j < m1.ncolblocks(); ++j)\n      for (size_type i = 0; i < m1.nrowblocks(); ++i)\n\tcopy(m1.block(i,j), sub_matrix(m2, m1.subrowinterval(i), \n\t\t\t\t       m1.subcolinterval(j)));\n  }\n\n  template <typename M1, typename M2>\n  void copy(const block_matrix<M1> &m1, const M2 &m2)\n  { copy(m1, linalg_const_cast(m2)); }\n  \n\n  template <typename MAT, typename V1, typename V2>\n  void mult(const block_matrix<MAT> &m, const V1 &v1, V2 &v2) {\n    clear(v2);\n    typename sub_vector_type<V2 *, sub_interval>::vector_type sv;\n    for (size_type i = 0; i < m.nrowblocks() ; ++i)\n      for (size_type j = 0; j < m.ncolblocks() ; ++j) {\n\tsv = sub_vector(v2, m.subrowinterval(i));\n\tmult(m.block(i,j),\n\t     sub_vector(v1, m.subcolinterval(j)), sv, sv);\n      }\n  }\n\n  template <typename MAT, typename V1, typename V2, typename V3>\n  void mult(const block_matrix<MAT> &m, const V1 &v1, const V2 &v2, V3 &v3) {\n    typename sub_vector_type<V3 *, sub_interval>::vector_type sv;\n    for (size_type i = 0; i < m.nrowblocks() ; ++i)\n      for (size_type j = 0; j < m.ncolblocks() ; ++j) {\n\tsv = sub_vector(v3, m.subrowinterval(i));\n\tif (j == 0)\n\t  mult(m.block(i,j),\n\t       sub_vector(v1, m.subcolinterval(j)),\n\t       sub_vector(v2, m.subrowinterval(i)), sv);\n\telse\n\t  mult(m.block(i,j),\n\t       sub_vector(v1, m.subcolinterval(j)), sv, sv);\n      }\n    \n  }\n\n  template <typename MAT, typename V1, typename V2>\n  void mult(const block_matrix<MAT> &m, const V1 &v1, const V2 &v2)\n  { mult(m, v1, linalg_const_cast(v2)); }\n\n  template <typename MAT, typename V1, typename V2, typename V3>\n  void mult(const block_matrix<MAT> &m, const V1 &v1, const V2 &v2, \n\t    const V3 &v3)\n  { mult_const(m, v1, v2, linalg_const_cast(v3)); }\n\n}\n  /* ******************************************************************** */\n  /*\t\t                                            \t\t  */\n  /*\t\tDistributed matrices                                \t  */\n  /*\t\t                                            \t\t  */\n  /* ******************************************************************** */\n\n#ifdef GMM_USES_MPI\n\n// Problem : GETFEM_HAVE_MPI_H not defined in gmm : NOT SATIFACTORY !!\n#include<getfem/getfem_arch_config.h>\n\n# if defined(GETFEM_HAVE_MPI_H)\n#   include <mpi.h>\n# elif defined(GETFEM_HAVE_MPI_MPI_H)\n#   include <mpi/mpi.h>\n# elif defined(GETFEM_HAVE_MPICH2_MPI_H)\n#   include <mpich2/mpi.h>\n# endif\n\nnamespace gmm {\n\n  \n  \n  template <typename T> inline MPI_Datatype mpi_type(T)\n  { GMM_ASSERT1(false, \"Sorry unsupported type\"); return MPI_FLOAT; }\n  inline MPI_Datatype mpi_type(double) { return MPI_DOUBLE; }\n  inline MPI_Datatype mpi_type(float) { return MPI_FLOAT; }\n  inline MPI_Datatype mpi_type(long double) { return MPI_LONG_DOUBLE; }\n#ifndef LAM_MPI\n  inline MPI_Datatype mpi_type(std::complex<float>) { return MPI_COMPLEX; }\n  inline MPI_Datatype mpi_type(std::complex<double>) { return MPI_DOUBLE_COMPLEX; }\n#endif\n  inline MPI_Datatype mpi_type(int) { return MPI_INT; }\n  inline MPI_Datatype mpi_type(unsigned int) { return MPI_UNSIGNED; }\n  inline MPI_Datatype mpi_type(long) { return MPI_LONG; }\n  inline MPI_Datatype mpi_type(unsigned long) { return MPI_UNSIGNED_LONG; }\n\n  template <typename MAT> struct mpi_distributed_matrix {\n    MAT M;\n\n    mpi_distributed_matrix(size_type n, size_type m) : M(n, m) {}\n    mpi_distributed_matrix() {}\n\n    const MAT &local_matrix(void) const { return M; }\n    MAT &local_matrix(void) { return M; }\n  };\n  \n  template <typename MAT> inline MAT &eff_matrix(MAT &m) { return m; }\n  template <typename MAT> inline\n  const MAT &eff_matrix(const MAT &m) { return m; }\n  template <typename MAT> inline\n  MAT &eff_matrix(mpi_distributed_matrix<MAT> &m) { return m.M; }\n  template <typename MAT> inline\n  const MAT &eff_matrix(const mpi_distributed_matrix<MAT> &m) { return m.M; }\n  \n\n  template <typename MAT1, typename MAT2>\n  inline void copy(const mpi_distributed_matrix<MAT1> &m1,\n\t\t   mpi_distributed_matrix<MAT2> &m2)\n  { copy(eff_matrix(m1), eff_matrix(m2)); }\n  template <typename MAT1, typename MAT2>\n  inline void copy(const mpi_distributed_matrix<MAT1> &m1,\n\t\t   const mpi_distributed_matrix<MAT2> &m2)\n  { copy(m1.M, m2.M); }\n  \n  template <typename MAT1, typename MAT2>\n  inline void copy(const mpi_distributed_matrix<MAT1> &m1, MAT2 &m2)\n  { copy(m1.M, m2); }\n  template <typename MAT1, typename MAT2>\n  inline void copy(const mpi_distributed_matrix<MAT1> &m1, const MAT2 &m2)\n  { copy(m1.M, m2); }\n  \n\n  template <typename MATSP, typename V1, typename V2> inline\n  typename strongest_value_type3<V1,V2,MATSP>::value_type\n  vect_sp(const mpi_distributed_matrix<MATSP> &ps, const V1 &v1,\n\t  const V2 &v2) {\n    typedef typename strongest_value_type3<V1,V2,MATSP>::value_type T;\n    T res = vect_sp(ps.M, v1, v2), rest;\n    MPI_Allreduce(&res, &rest, 1, mpi_type(T()), MPI_SUM,MPI_COMM_WORLD);\n    return rest;\n  }\n\n  template <typename MAT, typename V1, typename V2>\n  inline void mult_add(const mpi_distributed_matrix<MAT> &m, const V1 &v1,\n\t\t       V2 &v2) {\n    typedef typename linalg_traits<V2>::value_type T;\n    std::vector<T> v3(vect_size(v2)), v4(vect_size(v2));\n    static double tmult_tot = 0.0;\n    static double tmult_tot2 = 0.0;\n    double t_ref = MPI_Wtime();\n    gmm::mult(m.M, v1, v3);\n    if (is_sparse(v2)) GMM_WARNING2(\"Using a plain temporary, here.\");\n    double t_ref2 = MPI_Wtime();\n    MPI_Allreduce(&(v3[0]), &(v4[0]),gmm::vect_size(v2), mpi_type(T()),\n\t\t  MPI_SUM,MPI_COMM_WORLD);\n    tmult_tot2 = MPI_Wtime()-t_ref2;\n    cout << \"reduce mult mpi = \" << tmult_tot2 << endl;\n    gmm::add(v4, v2);\n    tmult_tot = MPI_Wtime()-t_ref;\n    cout << \"tmult mpi = \" << tmult_tot << endl;\n  }\n\n  template <typename MAT, typename V1, typename V2>\n  void mult_add(const mpi_distributed_matrix<MAT> &m, const V1 &v1,\n\t\tconst V2 &v2_)\n  { mult_add(m, v1, const_cast<V2 &>(v2_)); }\n\n  template <typename MAT, typename V1, typename V2>\n  inline void mult(const mpi_distributed_matrix<MAT> &m, const V1 &v1,\n\t\t   const V2 &v2_)\n  { V2 &v2 = const_cast<V2 &>(v2_); clear(v2); mult_add(m, v1, v2); }\n\n  template <typename MAT, typename V1, typename V2>\n  inline void mult(const mpi_distributed_matrix<MAT> &m, const V1 &v1,\n\t\t   V2 &v2)\n  { clear(v2); mult_add(m, v1, v2); }\n\n  template <typename MAT, typename V1, typename V2, typename V3>\n  inline void mult(const mpi_distributed_matrix<MAT> &m, const V1 &v1,\n\t\t   const V2 &v2, const V3 &v3_)\n  { V3 &v3 = const_cast<V3 &>(v3_); gmm::copy(v2, v3); mult_add(m, v1, v3); }\n\n  template <typename MAT, typename V1, typename V2, typename V3>\n  inline void mult(const mpi_distributed_matrix<MAT> &m, const V1 &v1,\n\t\t   const V2 &v2, V3 &v3)\n  { gmm::copy(v2, v3); mult_add(m, v1, v3); }\n  \n\n  template <typename MAT> inline\n  size_type mat_nrows(const mpi_distributed_matrix<MAT> &M) \n  { return mat_nrows(M.M); }\n  template <typename MAT> inline\n  size_type mat_ncols(const mpi_distributed_matrix<MAT> &M) \n  { return mat_nrows(M.M); }\n  template <typename MAT> inline\n  void resize(mpi_distributed_matrix<MAT> &M, size_type m, size_type n)\n  { resize(M.M, m, n); }\n  template <typename MAT> inline void clear(mpi_distributed_matrix<MAT> &M)\n  { clear(M.M); }\n  \n\n  // For compute reduced system\n  template <typename MAT1, typename MAT2> inline\n  void mult(const MAT1 &M1, const mpi_distributed_matrix<MAT2> &M2,\n\t    mpi_distributed_matrix<MAT2> &M3)\n  { mult(M1, M2.M, M3.M); }\n  template <typename MAT1, typename MAT2> inline\n  void mult(const mpi_distributed_matrix<MAT2> &M2,\n\t    const MAT1 &M1, mpi_distributed_matrix<MAT2> &M3)\n  { mult(M2.M, M1, M3.M); }\n  template <typename MAT1, typename MAT2, typename MAT3> inline\n  void mult(const MAT1 &M1, const mpi_distributed_matrix<MAT2> &M2,\n\t\t   MAT3 &M3)\n  { mult(M1, M2.M, M3); }\n  template <typename MAT1, typename MAT2, typename MAT3> inline\n  void mult(const MAT1 &M1, const mpi_distributed_matrix<MAT2> &M2,\n\t\t   const MAT3 &M3)\n  { mult(M1, M2.M, M3); }\n\n  template <typename M, typename SUBI1, typename SUBI2>\n  struct sub_matrix_type<const mpi_distributed_matrix<M> *, SUBI1, SUBI2>\n  { typedef abstract_null_type matrix_type; };\n\n  template <typename M, typename SUBI1, typename SUBI2>\n  struct sub_matrix_type<mpi_distributed_matrix<M> *, SUBI1, SUBI2>\n  { typedef abstract_null_type matrix_type; };\n\n  template <typename M, typename SUBI1, typename SUBI2>  inline\n  typename select_return<typename sub_matrix_type<const M *, SUBI1, SUBI2>\n  ::matrix_type, typename sub_matrix_type<M *, SUBI1, SUBI2>::matrix_type,\n   M *>::return_type\n   sub_matrix(mpi_distributed_matrix<M> &m, const SUBI1 &si1, const SUBI2 &si2)\n  { return sub_matrix(m.M, si1, si2); }\n\n  template <typename MAT, typename SUBI1, typename SUBI2>  inline\n  typename select_return<typename sub_matrix_type<const MAT *, SUBI1, SUBI2>\n  ::matrix_type, typename sub_matrix_type<MAT *, SUBI1, SUBI2>::matrix_type,\n\t\t\t const MAT *>::return_type\n  sub_matrix(const mpi_distributed_matrix<MAT> &m, const SUBI1 &si1,\n\t     const SUBI2 &si2)\n  { return sub_matrix(m.M, si1, si2);  }\n\n  template <typename M, typename SUBI1>  inline\n    typename select_return<typename sub_matrix_type<const M *, SUBI1, SUBI1>\n    ::matrix_type, typename sub_matrix_type<M *, SUBI1, SUBI1>::matrix_type,\n    M *>::return_type\n  sub_matrix(mpi_distributed_matrix<M> &m, const SUBI1 &si1) \n  { return sub_matrix(m.M, si1, si1); }\n\n  template <typename M, typename SUBI1>  inline\n    typename select_return<typename sub_matrix_type<const M *, SUBI1, SUBI1>\n    ::matrix_type, typename sub_matrix_type<M *, SUBI1, SUBI1>::matrix_type,\n    const M *>::return_type\n  sub_matrix(const mpi_distributed_matrix<M> &m, const SUBI1 &si1)\n  { return sub_matrix(m.M, si1, si1); }\n\n\n  template <typename L> struct transposed_return<const mpi_distributed_matrix<L> *> \n  { typedef abstract_null_type return_type; };\n  template <typename L> struct transposed_return<mpi_distributed_matrix<L> *> \n  { typedef abstract_null_type return_type; };\n  \n  template <typename L> inline typename transposed_return<const L *>::return_type\n  transposed(const mpi_distributed_matrix<L> &l)\n  { return transposed(l.M); }\n\n  template <typename L> inline typename transposed_return<L *>::return_type\n  transposed(mpi_distributed_matrix<L> &l)\n  { return transposed(l.M); }\n\n\n  template <typename MAT>\n  struct linalg_traits<mpi_distributed_matrix<MAT> > {\n    typedef mpi_distributed_matrix<MAT> this_type;\n    typedef MAT origin_type;\n    typedef linalg_false is_reference;\n    typedef abstract_matrix linalg_type;\n    typedef typename linalg_traits<MAT>::value_type value_type;\n    typedef typename linalg_traits<MAT>::reference reference;\n    typedef typename linalg_traits<MAT>::storage_type storage_type;\n    typedef abstract_null_type sub_row_type;\n    typedef abstract_null_type const_sub_row_type;\n    typedef abstract_null_type row_iterator;\n    typedef abstract_null_type const_row_iterator;\n    typedef abstract_null_type sub_col_type;\n    typedef abstract_null_type const_sub_col_type;\n    typedef abstract_null_type col_iterator;\n    typedef abstract_null_type const_col_iterator;\n    typedef abstract_null_type sub_orientation;\n    typedef abstract_null_type index_sorted;\n    static size_type nrows(const this_type &m) { return nrows(m.M); }\n    static size_type ncols(const this_type &m) { return ncols(m.M); }\n    static void do_clear(this_type &m) { clear(m.M); }\n  };\n\n}\n\n\n#endif // GMM_USES_MPI\n\nnamespace std {\n  template <typename V>\n  void swap(gmm::row_matrix<V> &m1, gmm::row_matrix<V> &m2)\n  { m1.swap(m2); }\n  template <typename V>\n  void swap(gmm::col_matrix<V> &m1, gmm::col_matrix<V> &m2)\n  { m1.swap(m2); }\n  template <typename T>\n  void swap(gmm::dense_matrix<T> &m1, gmm::dense_matrix<T> &m2)\n  { m1.swap(m2); }\n  template <typename T, int shift> void \n  swap(gmm::csc_matrix<T,shift> &m1, gmm::csc_matrix<T,shift> &m2)\n  { m1.swap(m2); }\n  template <typename T, int shift> void \n  swap(gmm::csr_matrix<T,shift> &m1, gmm::csr_matrix<T,shift> &m2)\n  { m1.swap(m2); }\n}\n\n\n\n\n#endif /* GMM_MATRIX_H__ */\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_modified_gram_schmidt.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2002-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n//===========================================================================\n//\n// Copyright (c) 1998-2001, University of Notre Dame. All rights reserved.\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are met:\n//\n//    * Redistributions of source code must retain the above copyright\n//      notice, this list of conditions and the following disclaimer.\n//    * Redistributions in binary form must reproduce the above copyright\n//      notice, this list of conditions and the following disclaimer in the\n//      documentation and/or other materials provided with the distribution.\n//    * Neither the name of the University of Notre Dame nor the\n//      names of its contributors may be used to endorse or promote products\n//      derived from this software without specific prior written permission.\n//\n// THIS SOFTWARE  IS  PROVIDED  BY  THE TRUSTEES  OF  INDIANA UNIVERSITY  AND\n// CONTRIBUTORS  ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,  INCLUDING,\n// BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND  FITNESS\n// FOR  A PARTICULAR PURPOSE ARE DISCLAIMED. IN  NO  EVENT SHALL THE TRUSTEES\n// OF INDIANA UNIVERSITY AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY,  OR CONSEQUENTIAL DAMAGES (INCLUDING,  BUT\n// NOT  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA,  OR PROFITS;  OR BUSINESS  INTERRUPTION)  HOWEVER  CAUSED AND ON ANY\n// THEORY  OF  LIABILITY,  WHETHER  IN  CONTRACT,  STRICT  LIABILITY, OR TORT\n// (INCLUDING  NEGLIGENCE  OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n// THIS  SOFTWARE,  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n//===========================================================================\n\n/**@file gmm_modified_gram_schmidt.h\n   @author  Andrew Lumsdaine <lums@osl.iu.edu>, Lie-Quan Lee     <llee@osl.iu.edu>\n   @date October 13, 2002.\n   @brief Modified Gram-Schmidt orthogonalization\n*/\n\n#ifndef GMM_MODIFIED_GRAM_SCHMIDT_H\n#define GMM_MODIFIED_GRAM_SCHMIDT_H\n\n#include \"gmm_kernel.h\"\n\nnamespace gmm {\n\n  template <typename T>\n  class modified_gram_schmidt {\n  protected:\n    typedef dense_matrix<T> MAT;\n    MAT M;\n\n  public:\n\n    modified_gram_schmidt(int restart, size_t s) : M(s, restart+1) {}\n\n    typename linalg_traits<MAT>::const_sub_col_type\n      operator[](size_t i) const { return mat_const_col(M, i); }\n\n    typename linalg_traits<MAT>::sub_col_type\n      operator[](size_t i) { return mat_col(M, i); }\n\n    inline size_type nrows(void) const { return M.nrows(); }\n    inline size_type ncols(void) const { return M.ncols(); }\n    MAT &mat(void) { return M; }\n    const MAT &mat(void) const { return M; }\n    \n  };\n\n  template <typename T, typename VecHi> inline\n  void orthogonalize(modified_gram_schmidt<T>& V, const VecHi& Hi_, size_t i) {\n    VecHi& Hi = const_cast<VecHi&>(Hi_);\n    \n    for (size_t k = 0; k <= i; k++) {\n      Hi[k] = gmm::vect_hp(V[i+1], V[k]);\n      gmm::add(gmm::scaled(V[k], -Hi[k]), V[i+1]);\n    }\n  }\n\n  template <typename T, typename VecHi>\n  void orthogonalize_with_refinment(modified_gram_schmidt<T>& V,\n\t\t\t\t    const VecHi& Hi_, size_t i) {\n    VecHi& Hi = const_cast<VecHi&>(Hi_);\n    orthogonalize(V, Hi_, i);\n    \n    sub_interval SUBI(0, V.nrows()), SUBJ(0, i+1);\n    std::vector<T> corr(i+1);\n    gmm::mult(conjugated(sub_matrix(V.mat(), SUBI, SUBJ)),\n\t      V[i+1], corr);\n    gmm::mult(sub_matrix(V.mat(), SUBI, SUBJ),\n\t      scaled(corr, T(-1)), V[i+1],V[i+1]);\n    gmm::add(corr, sub_vector(Hi, SUBJ));\n  }\n  \n  template <typename T, typename VecS, typename VecX>\n  void combine(modified_gram_schmidt<T>& V, const VecS& s, VecX& x, size_t i)\n  { for (size_t j = 0; j < i; ++j) gmm::add(gmm::scaled(V[j], s[j]), x); }\n}\n\n#endif\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_opt.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2003-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n/**@file gmm_opt.h\n   @author  Yves Renard <Yves.Renard@insa-lyon.fr>\n   @date July 9, 2003.\n   @brief Optimization for some small cases (inversion of 2x2 matrices etc.)\n*/\n#ifndef GMM_OPT_H__\n#define GMM_OPT_H__\n\nnamespace gmm {\n\n  /* ********************************************************************* */\n  /*    Optimized determinant and inverse for small matrices (2x2 and 3x3) */\n  /*    with dense_matrix<T>.                                              */\n  /* ********************************************************************* */\n\n  template <typename T>  T lu_det(const dense_matrix<T> &A) {\n    size_type n(mat_nrows(A));\n    if (n) {\n      const T *p = &(A(0,0));\n      switch (n) {\n      case 1 : return (*p);\n      case 2 : return (*p) * (*(p+3)) - (*(p+1)) * (*(p+2));\n// Not stable for nearly singular matrices\n//       case 3 : return (*p) * ((*(p+4)) * (*(p+8)) - (*(p+5)) * (*(p+7)))\n// \t\t - (*(p+1)) * ((*(p+3)) * (*(p+8)) - (*(p+5)) * (*(p+6)))\n// \t\t + (*(p+2)) * ((*(p+3)) * (*(p+7)) - (*(p+4)) * (*(p+6)));\n      default :\n\t{\n\t  dense_matrix<T> B(mat_nrows(A), mat_ncols(A));\n\t  std::vector<size_type> ipvt(mat_nrows(A));\n\t  gmm::copy(A, B);\n\t  lu_factor(B, ipvt);\n\t  return lu_det(B, ipvt);\t\n\t}\n      }\n    }\n    return T(1);\n  }\n\n\n  template <typename T> T lu_inverse(const dense_matrix<T> &A_) {\n    dense_matrix<T>& A = const_cast<dense_matrix<T> &>(A_);\n    size_type N = mat_nrows(A);\n    T det(1);\n    if (N) {\n      T *p = &(A(0,0));\n      if (N <= 2) {\n\tswitch (N) {\n\t  case 1 : {\n\t    det = *p;\n\t    GMM_ASSERT1(det!=T(0), \"non invertible matrix\");\n\t    *p = T(1) / det; \n\t  } break;\n\t  case 2 : {\n\t    det = (*p) * (*(p+3)) - (*(p+1)) * (*(p+2));\n\t    GMM_ASSERT1(det!=T(0), \"non invertible matrix\");\n\t    std::swap(*p, *(p+3));\n\t    *p++ /= det; *p++ /= -det; *p++ /= -det; *p++ /= det; \n\t  } break;\n// \t  case 3 : { // not stable for nearly singular matrices\n// \t    T a, b, c, d, e, f, g, h, i;\n// \t    a =   (*(p+4)) * (*(p+8)) - (*(p+5)) * (*(p+7));\n// \t    b = - (*(p+1)) * (*(p+8)) + (*(p+2)) * (*(p+7));\n// \t    c =   (*(p+1)) * (*(p+5)) - (*(p+2)) * (*(p+4));\n// \t    d = - (*(p+3)) * (*(p+8)) + (*(p+5)) * (*(p+6));\n// \t    e =   (*(p+0)) * (*(p+8)) - (*(p+2)) * (*(p+6));\n// \t    f = - (*(p+0)) * (*(p+5)) + (*(p+2)) * (*(p+3));\n// \t    g =   (*(p+3)) * (*(p+7)) - (*(p+4)) * (*(p+6));\n// \t    h = - (*(p+0)) * (*(p+7)) + (*(p+1)) * (*(p+6));\n// \t    i =   (*(p+0)) * (*(p+4)) - (*(p+1)) * (*(p+3));\n// \t    det = (*p) * a + (*(p+1)) * d + (*(p+2)) * g;\n// \t    GMM_ASSERT1(det!=T(0), \"non invertible matrix\");\n// \t    *p++ = a / det; *p++ = b / det; *p++ = c / det; \n// \t    *p++ = d / det; *p++ = e / det; *p++ = f / det; \n// \t    *p++ = g / det; *p++ = h / det; *p++ = i / det; \n// \t  } break;\n\t}\n      }\n      else {\n\tdense_matrix<T> B(mat_nrows(A), mat_ncols(A));\n\tstd::vector<int> ipvt(mat_nrows(A));\n\tgmm::copy(A, B);\n\tsize_type info = lu_factor(B, ipvt);\n\tGMM_ASSERT1(!info, \"non invertible matrix\");\n\tlu_inverse(B, ipvt, A);\n\treturn lu_det(B, ipvt);\n      }\n    }\n    return det;\n  }\n\n  \n}\n\n#endif //  GMM_OPT_H__\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_precond.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2004-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n#ifndef GMM_PRECOND_H\n#define GMM_PRECOND_H\n\n#include \"gmm_kernel.h\"\n\n/** @file gmm_precond.h\n    @author  Yves Renard <Yves.Renard@insa-lyon.fr>\n    @date March 29, 2004.\n    @brief gmm preconditioners.\n */\n\n/* Preconditioner concept :                                                */\n/*                                                                         */\n/* A the matrix, P the preconditioner PA well conditioned.                 */\n/* PRECOND precontioner type.                                              */\n/* mult(P, v, w) :  w <- P v                                               */\n/* transposed_mult(P, v, w)       : w <- transposed(P) v                   */\n/* left_mult(P, v, w)             : see qmr solver                         */\n/* right_mult(P, v, w)            : see qmr solver                         */\n/* transposed_left_mult(P, v, w)  : see qmr solver                         */\n/* transposed_right_mult(P, v, w) : see qmr solver                         */\n/*                                                                         */\n/* PRECOND P() : empty preconditioner.                                     */\n/* PRECOND P(A, ...) : preconditioner for the matrix A, with optional      */\n/*                     parameters                                          */\n/* PRECOND(...)  : empty precondtioner with parameters set.                */\n/* P.build_with(A) : build a precondtioner for A.                          */\n/*                                                                         */\n/* *********************************************************************** */\n\n\n\n\n#endif \n\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_precond_diagonal.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2003-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n/**@file gmm_precond_diagonal.h\n   @author  Yves Renard <Yves.Renard@insa-lyon.fr>\n   @date June 5, 2003.\n   @brief Diagonal matrix preconditoner.\n*/\n\n#ifndef GMM_PRECOND_DIAGONAL_H\n#define GMM_PRECOND_DIAGONAL_H\n\n#include \"gmm_precond.h\"\n\nnamespace gmm {\n\n  /** Diagonal preconditioner. */\n  template<typename Matrix> struct diagonal_precond {\n    typedef typename linalg_traits<Matrix>::value_type value_type;\n    typedef typename number_traits<value_type>::magnitude_type magnitude_type;\n\n    std::vector<magnitude_type> diag;\n\n    void build_with(const Matrix &M) {\n      diag.resize(mat_nrows(M));\n      for (size_type i = 0; i < mat_nrows(M); ++i) {\n\tmagnitude_type x = gmm::abs(M(i, i));\n\tif (x == magnitude_type(0)) {\n\t  x = magnitude_type(1);\n\t  GMM_WARNING2(\"The matrix has a zero on its diagonal\");\n\t}\n\tdiag[i] = magnitude_type(1) / x;\n      }\n    }\n    size_type memsize() const { return sizeof(*this) + diag.size() * sizeof(value_type); }\n    diagonal_precond(const Matrix &M) { build_with(M); }\n    diagonal_precond(void) {}\n  };\n\n  template <typename Matrix, typename V2> inline\n  void mult_diag_p(const diagonal_precond<Matrix>& P, V2 &v2, abstract_sparse){\n    typename linalg_traits<V2>::iterator it = vect_begin(v2),\n      ite = vect_end(v2);\n    for (; it != ite; ++it) *it *= P.diag[it.index()];\n  }\n\n  template <typename Matrix, typename V2> inline\n  void mult_diag_p(const diagonal_precond<Matrix>& P,V2 &v2, abstract_skyline)\n    { mult_diag_p(P, v2, abstract_sparse()); }\n\n  template <typename Matrix, typename V2> inline\n  void mult_diag_p(const diagonal_precond<Matrix>& P, V2 &v2, abstract_dense){\n    for (size_type i = 0; i < P.diag.size(); ++i) v2[i] *= P.diag[i];\n  }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void mult(const diagonal_precond<Matrix>& P, const V1 &v1, V2 &v2) {\n    GMM_ASSERT2(P.diag.size() == vect_size(v2),\"dimensions mismatch\");\n    copy(v1, v2);\n    mult_diag_p(P, v2, typename linalg_traits<V2>::storage_type());\n  }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void transposed_mult(const diagonal_precond<Matrix>& P,const V1 &v1,V2 &v2) {\n    mult(P, v1, v2);\n  }\n  \n  // # define DIAG_LEFT_MULT_SQRT\n  \n  template <typename Matrix, typename V1, typename V2> inline\n  void left_mult(const diagonal_precond<Matrix>& P, const V1 &v1, V2 &v2) {\n    GMM_ASSERT2(P.diag.size() == vect_size(v2), \"dimensions mismatch\");\n    copy(v1, v2);\n#   ifdef DIAG_LEFT_MULT_SQRT\n    for (size_type i= 0; i < P.diag.size(); ++i) v2[i] *= gmm::sqrt(P.diag[i]);\n#   else\n    for (size_type i= 0; i < P.diag.size(); ++i) v2[i] *= P.diag[i];\n#   endif\n  }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void transposed_left_mult(const diagonal_precond<Matrix>& P,\n\t\t\t    const V1 &v1, V2 &v2)\n    { left_mult(P, v1, v2); }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void right_mult(const diagonal_precond<Matrix>& P, const V1 &v1, V2 &v2) {\n    typedef typename linalg_traits<Matrix>::value_type T;\n    GMM_ASSERT2(P.diag.size() == vect_size(v2), \"dimensions mismatch\");\n    copy(v1, v2);\n#   ifdef DIAG_LEFT_MULT_SQRT    \n    for (size_type i= 0; i < P.diag.size(); ++i) v2[i] *= gmm::sqrt(P.diag[i]);\n#   endif\n  }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void transposed_right_mult(const diagonal_precond<Matrix>& P,\n\t\t\t    const V1 &v1, V2 &v2)\n    { right_mult(P, v1, v2); }\n\n}\n\n#endif \n\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_precond_ildlt.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2003-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n// This file is a modified version of cholesky.h from ITL.\n// See http://osl.iu.edu/research/itl/\n// Following the corresponding Copyright notice.\n//===========================================================================\n//\n// Copyright (c) 1998-2001, University of Notre Dame. All rights reserved.\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are met:\n//\n//    * Redistributions of source code must retain the above copyright\n//      notice, this list of conditions and the following disclaimer.\n//    * Redistributions in binary form must reproduce the above copyright\n//      notice, this list of conditions and the following disclaimer in the\n//      documentation and/or other materials provided with the distribution.\n//    * Neither the name of the University of Notre Dame nor the\n//      names of its contributors may be used to endorse or promote products\n//      derived from this software without specific prior written permission.\n//\n// THIS SOFTWARE  IS  PROVIDED  BY  THE TRUSTEES  OF  INDIANA UNIVERSITY  AND\n// CONTRIBUTORS  ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,  INCLUDING,\n// BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND  FITNESS\n// FOR  A PARTICULAR PURPOSE ARE DISCLAIMED. IN  NO  EVENT SHALL THE TRUSTEES\n// OF INDIANA UNIVERSITY AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY,  OR CONSEQUENTIAL DAMAGES (INCLUDING,  BUT\n// NOT  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA,  OR PROFITS;  OR BUSINESS  INTERRUPTION)  HOWEVER  CAUSED AND ON ANY\n// THEORY  OF  LIABILITY,  WHETHER  IN  CONTRACT,  STRICT  LIABILITY, OR TORT\n// (INCLUDING  NEGLIGENCE  OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n// THIS  SOFTWARE,  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n//===========================================================================\n\n#ifndef GMM_PRECOND_ILDLT_H\n#define GMM_PRECOND_ILDLT_H\n\n/**@file gmm_precond_ildlt.h\n   @author Andrew Lumsdaine <lums@osl.iu.edu>\n   @author Lie-Quan Lee <llee@osl.iu.edu>\n   @author Yves Renard <yves.renard@insa-lyon.fr>\n   @date June 5, 2003.\n   @brief Incomplete Level 0 ILDLT Preconditioner.\n*/\n\n#include \"gmm_precond.h\"\n\nnamespace gmm {\n\n  /** Incomplete Level 0 LDLT Preconditioner.\n      \n  For use with symmetric real or hermitian complex sparse matrices.\n\n  Notes: The idea under a concrete Preconditioner such as Incomplete\n  Cholesky is to create a Preconditioner object to use in iterative\n  methods.\n\n\n  Y. Renard : Transformed in LDLT for stability reason.\n  \n  U=LT is stored in csr format. D is stored on the diagonal of U.\n  */\n  template <typename Matrix>\n  class ildlt_precond {\n\n  public :\n    typedef typename linalg_traits<Matrix>::value_type value_type;\n    typedef typename number_traits<value_type>::magnitude_type magnitude_type;\n    typedef csr_matrix_ref<value_type *, size_type *, size_type *, 0> tm_type;\n\n    tm_type U;\n\n  protected :\n    std::vector<value_type> Tri_val;\n    std::vector<size_type> Tri_ind, Tri_ptr;\n \n    template<typename M> void do_ildlt(const M& A, row_major);\n    void do_ildlt(const Matrix& A, col_major);\n\n  public:\n\n    size_type nrows(void) const { return mat_nrows(U); }\n    size_type ncols(void) const { return mat_ncols(U); }\n    value_type &D(size_type i) { return Tri_val[Tri_ptr[i]]; }\n    const value_type &D(size_type i) const { return Tri_val[Tri_ptr[i]]; }\n    ildlt_precond(void) {}\n    void build_with(const Matrix& A) {\n      Tri_ptr.resize(mat_nrows(A)+1);\n      do_ildlt(A, typename principal_orientation_type<typename\n\t\t  linalg_traits<Matrix>::sub_orientation>::potype());\n    }\n    ildlt_precond(const Matrix& A)  { build_with(A); }\n    size_type memsize() const { \n      return sizeof(*this) + \n\tTri_val.size() * sizeof(value_type) + \n\t(Tri_ind.size()+Tri_ptr.size()) * sizeof(size_type); \n    }\n  };\n\n  template <typename Matrix> template<typename M>\n  void ildlt_precond<Matrix>::do_ildlt(const M& A, row_major) {\n    typedef typename linalg_traits<Matrix>::storage_type store_type;\n    typedef value_type T;\n    typedef typename number_traits<T>::magnitude_type R;\n    \n    size_type Tri_loc = 0, n = mat_nrows(A), d, g, h, i, j, k;\n    if (n == 0) return;\n    T z, zz;\n    Tri_ptr[0] = 0;\n    R prec = default_tol(R());\n    R max_pivot = gmm::abs(A(0,0)) * prec;\n    \n    for (int count = 0; count < 2; ++count) {\n      if (count) { Tri_val.resize(Tri_loc); Tri_ind.resize(Tri_loc); }\n      for (Tri_loc = 0, i = 0; i < n; ++i) {\n\ttypedef typename linalg_traits<M>::const_sub_row_type row_type;\n\trow_type row = mat_const_row(A, i);\n        typename linalg_traits<row_type>::const_iterator\n\t  it = vect_const_begin(row), ite = vect_const_end(row);\n\n\tif (count) { Tri_val[Tri_loc] = T(0); Tri_ind[Tri_loc] = i; }\n\t++Tri_loc; // diagonal element\n\n\tfor (k = 0; it != ite; ++it, ++k) {\n\t  j = index_of_it(it, k, store_type());\n\t  if (i == j) {\n\t    if (count) Tri_val[Tri_loc-1] = *it; \n\t  }\n\t  else if (j > i) {\n\t    if (count) { Tri_val[Tri_loc] = *it; Tri_ind[Tri_loc]=j; }\n\t    ++Tri_loc;\n\t  }\n\t}\n\tTri_ptr[i+1] = Tri_loc;\n      }\n    }\n    \n    if (A(0,0) == T(0)) {\n      Tri_val[Tri_ptr[0]] = T(1);\n      GMM_WARNING2(\"pivot 0 is too small\");\n    }\n    \n    for (k = 0; k < n; k++) {\n      d = Tri_ptr[k];\n      z = T(gmm::real(Tri_val[d])); Tri_val[d] = z;\n      if (gmm::abs(z) <= max_pivot) {\n\tTri_val[d] = z = T(1);\n\tGMM_WARNING2(\"pivot \" << k << \" is too small [\" << gmm::abs(z) << \"]\");\n      }\n      max_pivot = std::max(max_pivot, std::min(gmm::abs(z) * prec, R(1)));\n      \n      for (i = d + 1; i < Tri_ptr[k+1]; ++i) Tri_val[i] /= z;\n      for (i = d + 1; i < Tri_ptr[k+1]; ++i) {\n\tzz = gmm::conj(Tri_val[i] * z);\n\th = Tri_ind[i];\n\tg = i;\n\t\n\tfor (j = Tri_ptr[h] ; j < Tri_ptr[h+1]; ++j)\n\t  for ( ; g < Tri_ptr[k+1] && Tri_ind[g] <= Tri_ind[j]; ++g)\n\t    if (Tri_ind[g] == Tri_ind[j])\n\t      Tri_val[j] -= zz * Tri_val[g];\n      }\n    }\n    U = tm_type(&(Tri_val[0]), &(Tri_ind[0]), &(Tri_ptr[0]),\n\t\t\tn, mat_ncols(A));\n  }\n  \n  template <typename Matrix>\n  void ildlt_precond<Matrix>::do_ildlt(const Matrix& A, col_major)\n  { do_ildlt(gmm::conjugated(A), row_major()); }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void mult(const ildlt_precond<Matrix>& P, const V1 &v1, V2 &v2) {\n    gmm::copy(v1, v2);\n    gmm::lower_tri_solve(gmm::conjugated(P.U), v2, true);\n    for (size_type i = 0; i < mat_nrows(P.U); ++i) v2[i] /= P.D(i);\n    gmm::upper_tri_solve(P.U, v2, true);\n  }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void transposed_mult(const ildlt_precond<Matrix>& P,const V1 &v1,V2 &v2)\n  { mult(P, v1, v2); }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void left_mult(const ildlt_precond<Matrix>& P, const V1 &v1, V2 &v2) {\n    copy(v1, v2);\n    gmm::lower_tri_solve(gmm::conjugated(P.U), v2, true);\n    for (size_type i = 0; i < mat_nrows(P.U); ++i) v2[i] /= P.D(i);\n  }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void right_mult(const ildlt_precond<Matrix>& P, const V1 &v1, V2 &v2)\n  { copy(v1, v2); gmm::upper_tri_solve(P.U, v2, true);  }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void transposed_left_mult(const ildlt_precond<Matrix>& P, const V1 &v1,\n\t\t\t    V2 &v2) {\n    copy(v1, v2);\n    gmm::upper_tri_solve(P.U, v2, true);\n    for (size_type i = 0; i < mat_nrows(P.U); ++i) v2[i] /= P.D(i);\n  }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void transposed_right_mult(const ildlt_precond<Matrix>& P, const V1 &v1,\n\t\t\t     V2 &v2)\n  { copy(v1, v2); gmm::lower_tri_solve(gmm::conjugated(P.U), v2, true); }\n\n\n\n  // for compatibility with old versions\n\n  template <typename Matrix>\n  struct cholesky_precond : public ildlt_precond<Matrix> {\n    cholesky_precond(const Matrix& A) : ildlt_precond<Matrix>(A) {}\n    cholesky_precond(void) {}\n  } IS_DEPRECATED;\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void mult(const cholesky_precond<Matrix>& P, const V1 &v1, V2 &v2) {\n    gmm::copy(v1, v2);\n    gmm::lower_tri_solve(gmm::conjugated(P.U), v2, true);\n    for (size_type i = 0; i < mat_nrows(P.U); ++i) v2[i] /= P.D(i);\n    gmm::upper_tri_solve(P.U, v2, true);\n  }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void transposed_mult(const cholesky_precond<Matrix>& P,const V1 &v1,V2 &v2)\n  { mult(P, v1, v2); }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void left_mult(const cholesky_precond<Matrix>& P, const V1 &v1, V2 &v2) {\n    copy(v1, v2);\n    gmm::lower_tri_solve(gmm::conjugated(P.U), v2, true);\n    for (size_type i = 0; i < mat_nrows(P.U); ++i) v2[i] /= P.D(i);\n  }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void right_mult(const cholesky_precond<Matrix>& P, const V1 &v1, V2 &v2)\n  { copy(v1, v2); gmm::upper_tri_solve(P.U, v2, true);  }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void transposed_left_mult(const cholesky_precond<Matrix>& P, const V1 &v1,\n\t\t\t    V2 &v2) {\n    copy(v1, v2);\n    gmm::upper_tri_solve(P.U, v2, true);\n    for (size_type i = 0; i < mat_nrows(P.U); ++i) v2[i] /= P.D(i);\n  }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void transposed_right_mult(const cholesky_precond<Matrix>& P, const V1 &v1,\n\t\t\t     V2 &v2)\n  { copy(v1, v2); gmm::lower_tri_solve(gmm::conjugated(P.U), v2, true); }\n  \n}\n\n#endif \n\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_precond_ildltt.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2003-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n/**@file gmm_precond_ildltt.h\n   @author  Yves Renard <Yves.Renard@insa-lyon.fr>\n   @date June 30, 2003.\n   @brief incomplete LDL^t (cholesky) preconditioner with fill-in and threshold.\n*/\n\n#ifndef GMM_PRECOND_ILDLTT_H\n#define GMM_PRECOND_ILDLTT_H\n\n// Store U = LT and D in indiag. On each line, the fill-in is the number\n// of non-zero elements on the line of the original matrix plus K, except if\n// the matrix is dense. In this case the fill-in is K on each line.\n\n#include \"gmm_precond_ilut.h\"\n\nnamespace gmm {\n  /** incomplete LDL^t (cholesky) preconditioner with fill-in and\n      threshold. */\n  template <typename Matrix>\n  class ildltt_precond  {\n  public :\n    typedef typename linalg_traits<Matrix>::value_type value_type;\n    typedef typename number_traits<value_type>::magnitude_type magnitude_type;\n    \n    typedef rsvector<value_type> svector;\n\n    row_matrix<svector> U;\n    std::vector<magnitude_type> indiag;\n\n  protected:\n    size_type K;\n    double eps;    \n\n    template<typename M> void do_ildltt(const M&, row_major);\n    void do_ildltt(const Matrix&, col_major);\n\n  public:\n    void build_with(const Matrix& A, int k_ = -1, double eps_ = double(-1)) {\n      if (k_ >= 0) K = k_;\n      if (eps_ >= double(0)) eps = eps_;\n      gmm::resize(U, mat_nrows(A), mat_ncols(A));\n      indiag.resize(std::min(mat_nrows(A), mat_ncols(A)));\n      do_ildltt(A, typename principal_orientation_type<typename\n\t\tlinalg_traits<Matrix>::sub_orientation>::potype());\n    }\n    ildltt_precond(const Matrix& A, int k_, double eps_) \n      : U(mat_nrows(A),mat_ncols(A)), K(k_), eps(eps_) { build_with(A); }\n    ildltt_precond(void) { K=10; eps = 1E-7; }\n    ildltt_precond(size_type k_, double eps_) :  K(k_), eps(eps_) {}\n    size_type memsize() const { \n      return sizeof(*this) + nnz(U)*sizeof(value_type) + indiag.size() * sizeof(magnitude_type);\n    }    \n  };\n\n  template<typename Matrix> template<typename M> \n  void ildltt_precond<Matrix>::do_ildltt(const M& A,row_major) {\n    typedef value_type T;\n    typedef typename number_traits<T>::magnitude_type R;\n\n    size_type n = mat_nrows(A);\n    if (n == 0) return;\n    svector w(n);\n    T tmp;\n    R prec = default_tol(R()), max_pivot = gmm::abs(A(0,0)) * prec;\n\n    gmm::clear(U);\n    for (size_type i = 0; i < n; ++i) {\n      gmm::copy(mat_const_row(A, i), w);\n      double norm_row = gmm::vect_norm2(w);\n\n      for (size_type krow = 0, k; krow < w.nb_stored(); ++krow) {\n\ttypename svector::iterator wk = w.begin() + krow;\n\tif ((k = wk->c) >= i) break;\n \tif (gmm::is_complex(wk->e)) {\n \t  tmp = gmm::conj(U(k, i))/indiag[k]; // not completely satisfactory ..\n \t  gmm::add(scaled(mat_row(U, k), -tmp), w);\n \t}\n \telse {\n\t  tmp = wk->e;\n\t  if (gmm::abs(tmp) < eps * norm_row) { w.sup(k); --krow; } \n\t  else { wk->e += tmp; gmm::add(scaled(mat_row(U, k), -tmp), w); }\n\t}\n      }\n      tmp = w[i];\n\n      if (gmm::abs(gmm::real(tmp)) <= max_pivot)\n\t{ GMM_WARNING2(\"pivot \" << i << \" is too small\"); tmp = T(1); }\n\n      max_pivot = std::max(max_pivot, std::min(gmm::abs(tmp) * prec, R(1)));\n      indiag[i] = R(1) / gmm::real(tmp);\n      gmm::clean(w, eps * norm_row);\n      gmm::scale(w, T(indiag[i]));\n      std::sort(w.begin(), w.end(), elt_rsvector_value_less_<T>());\n      typename svector::const_iterator wit = w.begin(), wite = w.end();\n      for (size_type nnu = 0; wit != wite; ++wit)  // copy to be optimized ...\n\tif (wit->c > i) { if (nnu < K) { U(i, wit->c) = wit->e; ++nnu; } }\n    }\n  }\n\n  template<typename Matrix> \n  void ildltt_precond<Matrix>::do_ildltt(const Matrix& A, col_major)\n  { do_ildltt(gmm::conjugated(A), row_major()); }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void mult(const ildltt_precond<Matrix>& P, const V1 &v1, V2 &v2) {\n    gmm::copy(v1, v2);\n    gmm::lower_tri_solve(gmm::conjugated(P.U), v2, true);\n    for (size_type i = 0; i < P.indiag.size(); ++i) v2[i] *= P.indiag[i];\n    gmm::upper_tri_solve(P.U, v2, true);\n  }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void transposed_mult(const ildltt_precond<Matrix>& P,const V1 &v1, V2 &v2)\n  { mult(P, v1, v2); }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void left_mult(const ildltt_precond<Matrix>& P, const V1 &v1, V2 &v2) {\n    copy(v1, v2);\n    gmm::lower_tri_solve(gmm::conjugated(P.U), v2, true);\n    for (size_type i = 0; i < P.indiag.size(); ++i) v2[i] *= P.indiag[i];\n  }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void right_mult(const ildltt_precond<Matrix>& P, const V1 &v1, V2 &v2)\n  { copy(v1, v2); gmm::upper_tri_solve(P.U, v2, true); }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void transposed_left_mult(const ildltt_precond<Matrix>& P, const V1 &v1,\n\t\t\t    V2 &v2) {\n    copy(v1, v2);\n    gmm::upper_tri_solve(P.U, v2, true);\n    for (size_type i = 0; i < P.indiag.size(); ++i) v2[i] *= P.indiag[i];\n  }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void transposed_right_mult(const ildltt_precond<Matrix>& P, const V1 &v1,\n\t\t\t     V2 &v2)\n  { copy(v1, v2); gmm::lower_tri_solve(gmm::conjugated(P.U), v2, true); }\n\n\n  // for compatibility with old versions\n\n  template <typename Matrix>\n  struct choleskyt_precond : public ildltt_precond<Matrix>{\n    choleskyt_precond(const Matrix& A, int k_, double eps_)\n      : ildltt_precond<Matrix>(A, k_, eps_) {}\n    choleskyt_precond(void) {}\n  } IS_DEPRECATED;\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void mult(const choleskyt_precond<Matrix>& P, const V1 &v1, V2 &v2) {\n    gmm::copy(v1, v2);\n    gmm::lower_tri_solve(gmm::conjugated(P.U), v2, true);\n    for (size_type i = 0; i < P.indiag.size(); ++i) v2[i] *= P.indiag[i];\n    gmm::upper_tri_solve(P.U, v2, true);\n  }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void transposed_mult(const choleskyt_precond<Matrix>& P,const V1 &v1, V2 &v2)\n  { mult(P, v1, v2); }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void left_mult(const choleskyt_precond<Matrix>& P, const V1 &v1, V2 &v2) {\n    copy(v1, v2);\n    gmm::lower_tri_solve(gmm::conjugated(P.U), v2, true);\n    for (size_type i = 0; i < P.indiag.size(); ++i) v2[i] *= P.indiag[i];\n  }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void right_mult(const choleskyt_precond<Matrix>& P, const V1 &v1, V2 &v2)\n  { copy(v1, v2); gmm::upper_tri_solve(P.U, v2, true); }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void transposed_left_mult(const choleskyt_precond<Matrix>& P, const V1 &v1,\n\t\t\t    V2 &v2) {\n    copy(v1, v2);\n    gmm::upper_tri_solve(P.U, v2, true);\n    for (size_type i = 0; i < P.indiag.size(); ++i) v2[i] *= P.indiag[i];\n  }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void transposed_right_mult(const choleskyt_precond<Matrix>& P, const V1 &v1,\n\t\t\t     V2 &v2)\n  { copy(v1, v2); gmm::lower_tri_solve(gmm::conjugated(P.U), v2, true); }\n\n}\n\n#endif \n\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_precond_ilu.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2002-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n// This file is a modified version of ilu.h from ITL.\n// See http://osl.iu.edu/research/itl/\n// Following the corresponding Copyright notice.\n//===========================================================================\n//\n// Copyright (c) 1998-2001, University of Notre Dame. All rights reserved.\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are met:\n//\n//    * Redistributions of source code must retain the above copyright\n//      notice, this list of conditions and the following disclaimer.\n//    * Redistributions in binary form must reproduce the above copyright\n//      notice, this list of conditions and the following disclaimer in the\n//      documentation and/or other materials provided with the distribution.\n//    * Neither the name of the University of Notre Dame nor the\n//      names of its contributors may be used to endorse or promote products\n//      derived from this software without specific prior written permission.\n//\n// THIS SOFTWARE  IS  PROVIDED  BY  THE TRUSTEES  OF  INDIANA UNIVERSITY  AND\n// CONTRIBUTORS  ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,  INCLUDING,\n// BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND  FITNESS\n// FOR  A PARTICULAR PURPOSE ARE DISCLAIMED. IN  NO  EVENT SHALL THE TRUSTEES\n// OF INDIANA UNIVERSITY AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY,  OR CONSEQUENTIAL DAMAGES (INCLUDING,  BUT\n// NOT  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA,  OR PROFITS;  OR BUSINESS  INTERRUPTION)  HOWEVER  CAUSED AND ON ANY\n// THEORY  OF  LIABILITY,  WHETHER  IN  CONTRACT,  STRICT  LIABILITY, OR TORT\n// (INCLUDING  NEGLIGENCE  OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n// THIS  SOFTWARE,  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n//===========================================================================\n\n/**@file gmm_precond_ilu.h\n   @author Andrew Lumsdaine <lums@osl.iu.edu>\n   @author Lie-Quan Lee <llee@osl.iu.edu>\n   @author Yves Renard <yves.renard@insa-lyon.fr>\n   @date June 5, 2003.\n   @brief Incomplete LU without fill-in Preconditioner.\n*/\n\n#ifndef GMM_PRECOND_ILU_H\n#define GMM_PRECOND_ILU_H\n\n//\n// Notes: The idea under a concrete Preconditioner such \n//        as Incomplete LU is to create a Preconditioner\n//        object to use in iterative methods. \n//\n\n#include \"gmm_precond.h\"\n\nnamespace gmm {\n  /** Incomplete LU without fill-in Preconditioner. */\n  template <typename Matrix>\n  class ilu_precond {\n\n  public :\n    typedef typename linalg_traits<Matrix>::value_type value_type;\n    typedef csr_matrix_ref<value_type *, size_type *, size_type *, 0> tm_type;\n\n    tm_type U, L;\n    bool invert;\n  protected :\n    std::vector<value_type> L_val, U_val;\n    std::vector<size_type> L_ind, U_ind, L_ptr, U_ptr;\n \n    template<typename M> void do_ilu(const M& A, row_major);\n    void do_ilu(const Matrix& A, col_major);\n\n  public:\n    \n    size_type nrows(void) const { return mat_nrows(L); }\n    size_type ncols(void) const { return mat_ncols(U); }\n    \n    void build_with(const Matrix& A) {\n      invert = false;\n       L_ptr.resize(mat_nrows(A)+1);\n       U_ptr.resize(mat_nrows(A)+1);\n       do_ilu(A, typename principal_orientation_type<typename\n\t      linalg_traits<Matrix>::sub_orientation>::potype());\n    }\n    ilu_precond(const Matrix& A) { build_with(A); }\n    ilu_precond(void) {}\n    size_type memsize() const { \n      return sizeof(*this) + \n\t(L_val.size()+U_val.size()) * sizeof(value_type) + \n\t(L_ind.size()+L_ptr.size()) * sizeof(size_type) +\n\t(U_ind.size()+U_ptr.size()) * sizeof(size_type); \n    }\n  };\n\n  template <typename Matrix> template <typename M>\n  void ilu_precond<Matrix>::do_ilu(const M& A, row_major) {\n    typedef typename linalg_traits<Matrix>::storage_type store_type;\n    typedef value_type T;\n    typedef typename number_traits<T>::magnitude_type R;\n\n    size_type L_loc = 0, U_loc = 0, n = mat_nrows(A), i, j, k;\n    if (n == 0) return;\n    L_ptr[0] = 0; U_ptr[0] = 0;\n    R prec = default_tol(R());\n    R max_pivot = gmm::abs(A(0,0)) * prec;\n\n\n    for (int count = 0; count < 2; ++count) {\n      if (count) { \n\tL_val.resize(L_loc); L_ind.resize(L_loc);\n\tU_val.resize(U_loc); U_ind.resize(U_loc);\n      }\n      L_loc = U_loc = 0;\n      for (i = 0; i < n; ++i) {\n\ttypedef typename linalg_traits<M>::const_sub_row_type row_type;\n\trow_type row = mat_const_row(A, i);\n\ttypename linalg_traits<row_type>::const_iterator\n\t  it = vect_const_begin(row), ite = vect_const_end(row);\n\t\n\tif (count) { U_val[U_loc] = T(0); U_ind[U_loc] = i; }\n\t++U_loc; // diagonal element\n\t\n\tfor (k = 0; it != ite && k < 1000; ++it, ++k) {\n\t  // if a plain row is present, retains only the 1000 firsts\n\t  // nonzero elements. ---> a sort should be done.\n\t  j = index_of_it(it, k, store_type());\n\t  if (j < i) {\n\t    if (count) { L_val[L_loc] = *it; L_ind[L_loc] = j; }\n\t    L_loc++;\n\t  }\n\t  else if (i == j) {\n\t    if (count) U_val[U_loc-1] = *it;\n\t  }\n\t  else {\n\t    if (count) { U_val[U_loc] = *it; U_ind[U_loc] = j; }\n\t    U_loc++;\n\t  }\n\t}\n        L_ptr[i+1] = L_loc; U_ptr[i+1] = U_loc;\n      }\n    }\n    \n    if (A(0,0) == T(0)) {\n      U_val[U_ptr[0]] = T(1);\n      GMM_WARNING2(\"pivot 0 is too small\");\n    }\n\n    size_type qn, pn, rn;\n    for (i = 1; i < n; i++) {\n\n      pn = U_ptr[i];\n      if (gmm::abs(U_val[pn]) <= max_pivot) {\n\tU_val[pn] = T(1);\n\tGMM_WARNING2(\"pivot \" << i << \" is too small\");\n      }\n      max_pivot = std::max(max_pivot,\n\t\t\t   std::min(gmm::abs(U_val[pn]) * prec, R(1)));\n\n      for (j = L_ptr[i]; j < L_ptr[i+1]; j++) {\n\tpn = U_ptr[L_ind[j]];\n\t\n\tT multiplier = (L_val[j] /= U_val[pn]);\n\t\n\tqn = j + 1;\n\trn = U_ptr[i];\n\t\n\tfor (pn++; pn < U_ptr[L_ind[j]+1] && U_ind[pn] < i; pn++) {\n\t  while (qn < L_ptr[i+1] && L_ind[qn] < U_ind[pn])\n\t    qn++;\n\t  if (qn < L_ptr[i+1] && U_ind[pn] == L_ind[qn])\n\t    L_val[qn] -= multiplier * U_val[pn];\n\t}\n\tfor (; pn < U_ptr[L_ind[j]+1]; pn++) {\n\t  while (rn < U_ptr[i+1] && U_ind[rn] < U_ind[pn])\n\t    rn++;\n\t  if (rn < U_ptr[i+1] && U_ind[pn] == U_ind[rn])\n\t    U_val[rn] -= multiplier * U_val[pn];\n\t}\n      }\n    }\n\n    L = tm_type(&(L_val[0]), &(L_ind[0]), &(L_ptr[0]), n, mat_ncols(A));\n    U = tm_type(&(U_val[0]), &(U_ind[0]), &(U_ptr[0]), n, mat_ncols(A));\n  }\n  \n  template <typename Matrix>\n  void ilu_precond<Matrix>::do_ilu(const Matrix& A, col_major) {\n    do_ilu(gmm::transposed(A), row_major());\n    invert = true;\n  }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void mult(const ilu_precond<Matrix>& P, const V1 &v1, V2 &v2) {\n    gmm::copy(v1, v2);\n    if (P.invert) {\n      gmm::lower_tri_solve(gmm::transposed(P.U), v2, false);\n      gmm::upper_tri_solve(gmm::transposed(P.L), v2, true);\n    }\n    else {\n      gmm::lower_tri_solve(P.L, v2, true);\n      gmm::upper_tri_solve(P.U, v2, false);\n    }\n  }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void transposed_mult(const ilu_precond<Matrix>& P,const V1 &v1,V2 &v2) {\n    gmm::copy(v1, v2);\n    if (P.invert) {\n      gmm::lower_tri_solve(P.L, v2, true);\n      gmm::upper_tri_solve(P.U, v2, false);\n    }\n    else {\n      gmm::lower_tri_solve(gmm::transposed(P.U), v2, false);\n      gmm::upper_tri_solve(gmm::transposed(P.L), v2, true);\n    }\n  }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void left_mult(const ilu_precond<Matrix>& P, const V1 &v1, V2 &v2) {\n    copy(v1, v2);\n    if (P.invert) gmm::lower_tri_solve(gmm::transposed(P.U), v2, false);\n    else gmm::lower_tri_solve(P.L, v2, true);\n  }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void right_mult(const ilu_precond<Matrix>& P, const V1 &v1, V2 &v2) {\n    copy(v1, v2);\n    if (P.invert) gmm::upper_tri_solve(gmm::transposed(P.L), v2, true);\n    else gmm::upper_tri_solve(P.U, v2, false);\n  }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void transposed_left_mult(const ilu_precond<Matrix>& P, const V1 &v1,\n\t\t\t    V2 &v2) {\n    copy(v1, v2);\n    if (P.invert) gmm::upper_tri_solve(P.U, v2, false);\n    else gmm::upper_tri_solve(gmm::transposed(P.L), v2, true);\n  }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void transposed_right_mult(const ilu_precond<Matrix>& P, const V1 &v1,\n\t\t\t     V2 &v2) {\n    copy(v1, v2);\n    if (P.invert) gmm::lower_tri_solve(P.L, v2, true);\n    else gmm::lower_tri_solve(gmm::transposed(P.U), v2, false);\n  }\n\n\n}\n\n#endif \n\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_precond_ilut.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2002-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n// This file is a modified version of ilut.h from ITL.\n// See http://osl.iu.edu/research/itl/\n// Following the corresponding Copyright notice.\n//===========================================================================\n//\n// Copyright (c) 1998-2001, University of Notre Dame. All rights reserved.\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are met:\n//\n//    * Redistributions of source code must retain the above copyright\n//      notice, this list of conditions and the following disclaimer.\n//    * Redistributions in binary form must reproduce the above copyright\n//      notice, this list of conditions and the following disclaimer in the\n//      documentation and/or other materials provided with the distribution.\n//    * Neither the name of the University of Notre Dame nor the\n//      names of its contributors may be used to endorse or promote products\n//      derived from this software without specific prior written permission.\n//\n// THIS SOFTWARE  IS  PROVIDED  BY  THE TRUSTEES  OF  INDIANA UNIVERSITY  AND\n// CONTRIBUTORS  ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,  INCLUDING,\n// BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND  FITNESS\n// FOR  A PARTICULAR PURPOSE ARE DISCLAIMED. IN  NO  EVENT SHALL THE TRUSTEES\n// OF INDIANA UNIVERSITY AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY,  OR CONSEQUENTIAL DAMAGES (INCLUDING,  BUT\n// NOT  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA,  OR PROFITS;  OR BUSINESS  INTERRUPTION)  HOWEVER  CAUSED AND ON ANY\n// THEORY  OF  LIABILITY,  WHETHER  IN  CONTRACT,  STRICT  LIABILITY, OR TORT\n// (INCLUDING  NEGLIGENCE  OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n// THIS  SOFTWARE,  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n//===========================================================================\n\n#ifndef GMM_PRECOND_ILUT_H\n#define GMM_PRECOND_ILUT_H\n\n/**@file gmm_precond_ilut.h\n   @author  Andrew Lumsdaine <lums@osl.iu.edu>, Lie-Quan Lee <llee@osl.iu.edu>\n   @date June 5, 2003.\n   @brief ILUT:  Incomplete LU with threshold and K fill-in Preconditioner.\n*/\n\n/*\n  Performane comparing for SSOR, ILU and ILUT based on sherman 5 matrix \n  in Harwell-Boeing collection on Sun Ultra 30 UPA/PCI (UltraSPARC-II 296MHz)\n  Preconditioner & Factorization time  &  Number of Iteration \\\\ \\hline\n  SSOR        &   0.010577  & 41 \\\\\n  ILU         &   0.019336  & 32 \\\\\n  ILUT with 0 fill-in and threshold of 1.0e-6 & 0.343612 &  23 \\\\\n  ILUT with 5 fill-in and threshold of 1.0e-6 & 0.343612 &  18 \\\\ \\hline\n*/\n\n#include \"gmm_precond.h\"\n\nnamespace gmm {\n\n  template<typename T> struct elt_rsvector_value_less_ {\n    inline bool operator()(const elt_rsvector_<T>& a, \n\t\t\t   const elt_rsvector_<T>& b) const\n    { return (gmm::abs(a.e) > gmm::abs(b.e)); }\n  };\n\n  /** Incomplete LU with threshold and K fill-in Preconditioner.\n\n  The algorithm of ILUT(A, 0, 1.0e-6) is slower than ILU(A). If No\n  fill-in is arrowed, you can use ILU instead of ILUT.\n\n  Notes: The idea under a concrete Preconditioner such as ilut is to\n  create a Preconditioner object to use in iterative methods.\n  */\n  template <typename Matrix>\n  class ilut_precond  {\n  public :\n    typedef typename linalg_traits<Matrix>::value_type value_type;\n    typedef wsvector<value_type> _wsvector;\n    typedef rsvector<value_type> _rsvector;\n    typedef row_matrix<_rsvector> LU_Matrix;\n\n    bool invert;\n    LU_Matrix L, U;\n\n  protected:\n    size_type K;\n    double eps;    \n\n    template<typename M> void do_ilut(const M&, row_major);\n    void do_ilut(const Matrix&, col_major);\n\n  public:\n    void build_with(const Matrix& A, int k_ = -1, double eps_ = double(-1)) {\n      if (k_ >= 0) K = k_;\n      if (eps_ >= double(0)) eps = eps_;\n      invert = false;\n      gmm::resize(L, mat_nrows(A), mat_ncols(A));\n      gmm::resize(U, mat_nrows(A), mat_ncols(A));\n      do_ilut(A, typename principal_orientation_type<typename\n\t      linalg_traits<Matrix>::sub_orientation>::potype());\n    }\n    ilut_precond(const Matrix& A, int k_, double eps_) \n      : L(mat_nrows(A), mat_ncols(A)), U(mat_nrows(A), mat_ncols(A)),\n\tK(k_), eps(eps_) { build_with(A); }\n    ilut_precond(size_type k_, double eps_) :  K(k_), eps(eps_) {}\n    ilut_precond(void) { K = 10; eps = 1E-7; }\n    size_type memsize() const { \n      return sizeof(*this) + (nnz(U)+nnz(L))*sizeof(value_type);\n    }\n  };\n\n  template<typename Matrix> template<typename M> \n  void ilut_precond<Matrix>::do_ilut(const M& A, row_major) {\n    typedef value_type T;\n    typedef typename number_traits<T>::magnitude_type R;\n    \n    size_type n = mat_nrows(A);\n    if (n == 0) return;\n    std::vector<T> indiag(n);\n    _wsvector w(mat_ncols(A));\n    _rsvector ww(mat_ncols(A)), wL(mat_ncols(A)), wU(mat_ncols(A));\n    T tmp;\n    gmm::clear(U); gmm::clear(L);\n    R prec = default_tol(R()); \n    R max_pivot = gmm::abs(A(0,0)) * prec;\n\n    for (size_type i = 0; i < n; ++i) {\n      gmm::copy(mat_const_row(A, i), w);\n      double norm_row = gmm::vect_norm2(w);\n\n      typename _wsvector::iterator wkold = w.end();\n      for (typename _wsvector::iterator wk = w.begin();\n\t   wk != w.end() && wk->first < i; ) {\n\tsize_type k = wk->first;\n\ttmp = (wk->second) * indiag[k];\n\tif (gmm::abs(tmp) < eps * norm_row) w.erase(k);\n\telse { wk->second += tmp; gmm::add(scaled(mat_row(U, k), -tmp), w); }\n\tif (wkold == w.end()) wk = w.begin(); else { wk = wkold; ++wk; }\n\tif (wk != w.end() && wk->first == k)\n\t  { if (wkold == w.end()) wkold = w.begin(); else ++wkold; ++wk; }\n      }\n      tmp = w[i];\n\n      if (gmm::abs(tmp) <= max_pivot) {\n\tGMM_WARNING2(\"pivot \" << i << \" too small. try with ilutp ?\");\n\tw[i] = tmp = T(1);\n      }\n\n      max_pivot = std::max(max_pivot, std::min(gmm::abs(tmp) * prec, R(1)));\n      indiag[i] = T(1) / tmp;\n      gmm::clean(w, eps * norm_row);\n      gmm::copy(w, ww);\n      std::sort(ww.begin(), ww.end(), elt_rsvector_value_less_<T>());\n      typename _rsvector::const_iterator wit = ww.begin(), wite = ww.end();\n\n      size_type nnl = 0, nnu = 0;    \n      wL.base_resize(K); wU.base_resize(K+1);\n      typename _rsvector::iterator witL = wL.begin(), witU = wU.begin();\n      for (; wit != wite; ++wit) \n\tif (wit->c < i) { if (nnl < K) { *witL++ = *wit; ++nnl; } }\n\telse { if (nnu < K  || wit->c == i) { *witU++ = *wit; ++nnu; } }\n      wL.base_resize(nnl); wU.base_resize(nnu);\n      std::sort(wL.begin(), wL.end());\n      std::sort(wU.begin(), wU.end());\n      gmm::copy(wL, L.row(i));\n      gmm::copy(wU, U.row(i));\n    }\n\n  }\n\n  template<typename Matrix> \n  void ilut_precond<Matrix>::do_ilut(const Matrix& A, col_major) {\n    do_ilut(gmm::transposed(A), row_major());\n    invert = true;\n  }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void mult(const ilut_precond<Matrix>& P, const V1 &v1, V2 &v2) {\n    gmm::copy(v1, v2);\n    if (P.invert) {\n      gmm::lower_tri_solve(gmm::transposed(P.U), v2, false);\n      gmm::upper_tri_solve(gmm::transposed(P.L), v2, true);\n    }\n    else {\n      gmm::lower_tri_solve(P.L, v2, true);\n      gmm::upper_tri_solve(P.U, v2, false);\n    }\n  }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void transposed_mult(const ilut_precond<Matrix>& P,const V1 &v1,V2 &v2) {\n    gmm::copy(v1, v2);\n    if (P.invert) {\n      gmm::lower_tri_solve(P.L, v2, true);\n      gmm::upper_tri_solve(P.U, v2, false);\n    }\n    else {\n      gmm::lower_tri_solve(gmm::transposed(P.U), v2, false);\n      gmm::upper_tri_solve(gmm::transposed(P.L), v2, true);\n    }\n  }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void left_mult(const ilut_precond<Matrix>& P, const V1 &v1, V2 &v2) {\n    copy(v1, v2);\n    if (P.invert) gmm::lower_tri_solve(gmm::transposed(P.U), v2, false);\n    else gmm::lower_tri_solve(P.L, v2, true);\n  }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void right_mult(const ilut_precond<Matrix>& P, const V1 &v1, V2 &v2) {\n    copy(v1, v2);\n    if (P.invert) gmm::upper_tri_solve(gmm::transposed(P.L), v2, true);\n    else gmm::upper_tri_solve(P.U, v2, false);\n  }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void transposed_left_mult(const ilut_precond<Matrix>& P, const V1 &v1,\n\t\t\t    V2 &v2) {\n    copy(v1, v2);\n    if (P.invert) gmm::upper_tri_solve(P.U, v2, false);\n    else gmm::upper_tri_solve(gmm::transposed(P.L), v2, true);\n  }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void transposed_right_mult(const ilut_precond<Matrix>& P, const V1 &v1,\n\t\t\t     V2 &v2) {\n    copy(v1, v2);\n    if (P.invert) gmm::lower_tri_solve(P.L, v2, true);\n    else gmm::lower_tri_solve(gmm::transposed(P.U), v2, false);\n  }\n\n}\n\n#endif \n\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_precond_ilutp.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2004-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n/**@file gmm_precond_ilutp.h\n   @author  Yves Renard <Yves.Renard@insa-lyon.fr>\n   @date October 14, 2004.\n   @brief ILUTP: Incomplete LU with threshold and K fill-in Preconditioner and\n   column pivoting.\n\n   \n*/\n#ifndef GMM_PRECOND_ILUTP_H\n#define GMM_PRECOND_ILUTP_H\n\n#include \"gmm_precond_ilut.h\"\n\nnamespace gmm {\n\n  /**\n     ILUTP: Incomplete LU with threshold and K fill-in Preconditioner and\n     column pivoting.\n   \n     See Yousef Saad, Iterative Methods for\n     sparse linear systems, PWS Publishing Company, section 10.4.4\n\n      TODO : store the permutation by cycles to avoid the temporary vector\n  */\n  template <typename Matrix>\n  class ilutp_precond  {\n  public :\n    typedef typename linalg_traits<Matrix>::value_type value_type;\n    typedef wsvector<value_type> _wsvector;\n    typedef rsvector<value_type> _rsvector;\n    typedef row_matrix<_rsvector> LU_Matrix;\n    typedef col_matrix<_wsvector> CLU_Matrix;\n\n    bool invert;\n    LU_Matrix L, U;\n    gmm::unsorted_sub_index indperm;\n    gmm::unsorted_sub_index indperminv;\n    mutable std::vector<value_type> temporary;\n\n  protected:\n    size_type K;\n    double eps;\n\n    template<typename M> void do_ilutp(const M&, row_major);\n    void do_ilutp(const Matrix&, col_major);\n\n  public:\n    void build_with(const Matrix& A, int k_ = -1, double eps_ = double(-1)) {\n      if (k_ >= 0) K = k_;\n      if (eps_ >= double(0)) eps = eps_;\n      invert = false;\n      gmm::resize(L, mat_nrows(A), mat_ncols(A));\n      gmm::resize(U, mat_nrows(A), mat_ncols(A));\n      do_ilutp(A, typename principal_orientation_type<typename\n\t      linalg_traits<Matrix>::sub_orientation>::potype());\n    }\n    ilutp_precond(const Matrix& A, size_type k_, double eps_) \n      : L(mat_nrows(A), mat_ncols(A)), U(mat_nrows(A), mat_ncols(A)),\n\tK(k_), eps(eps_) { build_with(A); }\n    ilutp_precond(int k_, double eps_) :  K(k_), eps(eps_) {}\n    ilutp_precond(void) { K = 10; eps = 1E-7; }\n    size_type memsize() const { \n      return sizeof(*this) + (nnz(U)+nnz(L))*sizeof(value_type);\n    }\n  };\n\n\n  template<typename Matrix> template<typename M> \n  void ilutp_precond<Matrix>::do_ilutp(const M& A, row_major) {\n    typedef value_type T;\n    typedef typename number_traits<T>::magnitude_type R;\n\n    size_type n = mat_nrows(A);\n    CLU_Matrix CU(n,n);\n    if (n == 0) return;\n    std::vector<T> indiag(n);\n    temporary.resize(n);\n    std::vector<size_type> ipvt(n), ipvtinv(n);\n    for (size_type i = 0; i < n; ++i) ipvt[i] = ipvtinv[i] = i;\n    indperm = unsorted_sub_index(ipvt);\n    indperminv = unsorted_sub_index(ipvtinv);\n    _wsvector w(mat_ncols(A));\n    _rsvector ww(mat_ncols(A));\n    \n    T tmp = T(0);\n    gmm::clear(L); gmm::clear(U);\n    R prec = default_tol(R()); \n    R max_pivot = gmm::abs(A(0,0)) * prec;\n\n    for (size_type i = 0; i < n; ++i) {\n\n      copy(sub_vector(mat_const_row(A, i), indperm), w);\n      double norm_row = gmm::vect_norm2(mat_const_row(A, i)); \n\n      typename _wsvector::iterator wkold = w.end();\n      for (typename _wsvector::iterator wk = w.begin();\n\t   wk != w.end() && wk->first < i; )  {\n\tsize_type k = wk->first;\n\ttmp = (wk->second) * indiag[k];\n\tif (gmm::abs(tmp) < eps * norm_row) w.erase(k); \n\telse { wk->second += tmp; gmm::add(scaled(mat_row(U, k), -tmp), w); }\n\tif (wkold == w.end()) wk = w.begin(); else { wk = wkold; ++wk; }\n\tif (wk != w.end() && wk->first == k)\n\t  { if (wkold == w.end()) wkold = w.begin(); else ++wkold; ++wk; }\n      }\n\n      gmm::clean(w, eps * norm_row);\n      gmm::copy(w, ww);\n\n      std::sort(ww.begin(), ww.end(), elt_rsvector_value_less_<T>());\n      typename _rsvector::const_iterator wit = ww.begin(), wite = ww.end();\n      size_type ip = size_type(-1);\n\n      for (; wit != wite; ++wit)\n\tif (wit->c >= i) { ip = wit->c; tmp = wit->e; break; }\n      if (ip == size_type(-1) || gmm::abs(tmp) <= max_pivot)\n\t{ GMM_WARNING2(\"pivot \" << i << \" too small\"); ip=i; ww[i]=tmp=T(1); }\n      max_pivot = std::max(max_pivot, std::min(gmm::abs(tmp) * prec, R(1)));\n      indiag[i] = T(1) / tmp;\n      wit = ww.begin();\n\n      size_type nnl = 0, nnu = 0;\n      L[i].base_resize(K); U[i].base_resize(K+1);\n      typename _rsvector::iterator witL = L[i].begin(), witU = U[i].begin();\n      for (; wit != wite; ++wit) {\n\tif (wit->c < i) { if (nnl < K) { *witL++ = *wit; ++nnl; } }\n\telse if (nnu < K || wit->c == i)\n\t  { CU(i, wit->c) = wit->e; *witU++ = *wit; ++nnu; }\n      }\n      L[i].base_resize(nnl); U[i].base_resize(nnu);\n      std::sort(L[i].begin(), L[i].end());\n      std::sort(U[i].begin(), U[i].end());\n\n      if (ip != i) {\n\ttypename _wsvector::const_iterator iti = CU.col(i).begin();\n\ttypename _wsvector::const_iterator itie = CU.col(i).end();\n\ttypename _wsvector::const_iterator itp = CU.col(ip).begin();\n\ttypename _wsvector::const_iterator itpe = CU.col(ip).end();\n\t\n\twhile (iti != itie && itp != itpe) {\n\t  if (iti->first < itp->first)\n\t    { U.row(iti->first).swap_indices(i, ip); ++iti; }\n\t  else if (iti->first > itp->first)\n\t    { U.row(itp->first).swap_indices(i,ip);++itp; }\n\t  else\n\t    { U.row(iti->first).swap_indices(i, ip); ++iti; ++itp; }\n\t}\n\t\n\tfor( ; iti != itie; ++iti) U.row(iti->first).swap_indices(i, ip);\n\tfor( ; itp != itpe; ++itp) U.row(itp->first).swap_indices(i, ip);\n\n\tCU.swap_col(i, ip);\n\t\n\tindperm.swap(i, ip);\n\tindperminv.swap(ipvt[i], ipvt[ip]);\n\tstd::swap(ipvtinv[ipvt[i]], ipvtinv[ipvt[ip]]);\n\tstd::swap(ipvt[i], ipvt[ip]);\n      }\n    }\n  }\n\n  template<typename Matrix> \n  void ilutp_precond<Matrix>::do_ilutp(const Matrix& A, col_major) {\n    do_ilutp(gmm::transposed(A), row_major());\n    invert = true;\n  }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void mult(const ilutp_precond<Matrix>& P, const V1 &v1, V2 &v2) {\n    if (P.invert) {\n      gmm::copy(gmm::sub_vector(v1, P.indperm), v2);\n      gmm::lower_tri_solve(gmm::transposed(P.U), v2, false);\n      gmm::upper_tri_solve(gmm::transposed(P.L), v2, true);\n    }\n    else {\n      gmm::copy(v1, P.temporary);\n      gmm::lower_tri_solve(P.L, P.temporary, true);\n      gmm::upper_tri_solve(P.U, P.temporary, false);\n      gmm::copy(gmm::sub_vector(P.temporary, P.indperminv), v2);\n    }\n  }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void transposed_mult(const ilutp_precond<Matrix>& P,const V1 &v1,V2 &v2) {\n    if (P.invert) {\n      gmm::copy(v1, P.temporary);\n      gmm::lower_tri_solve(P.L, P.temporary, true);\n      gmm::upper_tri_solve(P.U, P.temporary, false);\n      gmm::copy(gmm::sub_vector(P.temporary, P.indperminv), v2);\n    }\n    else {\n      gmm::copy(gmm::sub_vector(v1, P.indperm), v2);\n      gmm::lower_tri_solve(gmm::transposed(P.U), v2, false);\n      gmm::upper_tri_solve(gmm::transposed(P.L), v2, true);\n    }\n  }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void left_mult(const ilutp_precond<Matrix>& P, const V1 &v1, V2 &v2) {\n    if (P.invert) {\n      gmm::copy(gmm::sub_vector(v1, P.indperm), v2);\n      gmm::lower_tri_solve(gmm::transposed(P.U), v2, false);\n    }\n    else {\n      copy(v1, v2);\n      gmm::lower_tri_solve(P.L, v2, true);\n    }\n  }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void right_mult(const ilutp_precond<Matrix>& P, const V1 &v1, V2 &v2) {\n    if (P.invert) {\n      copy(v1, v2);\n      gmm::upper_tri_solve(gmm::transposed(P.L), v2, true);\n    }\n    else {\n      copy(v1, P.temporary);\n      gmm::upper_tri_solve(P.U, P.temporary, false);\n      gmm::copy(gmm::sub_vector(P.temporary, P.indperminv), v2);\n    }\n  }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void transposed_left_mult(const ilutp_precond<Matrix>& P, const V1 &v1,\n\t\t\t    V2 &v2) {\n    if (P.invert) {\n      copy(v1, P.temporary);\n      gmm::upper_tri_solve(P.U, P.temporary, false);\n      gmm::copy(gmm::sub_vector(P.temporary, P.indperminv), v2);\n    }\n    else {\n      copy(v1, v2);\n      gmm::upper_tri_solve(gmm::transposed(P.L), v2, true);\n    }\n  }\n  \n  template <typename Matrix, typename V1, typename V2> inline\n  void transposed_right_mult(const ilutp_precond<Matrix>& P, const V1 &v1,\n\t\t\t     V2 &v2) {\n    if (P.invert) {\n      copy(v1, v2);\n      gmm::lower_tri_solve(P.L, v2, true);\n    }\n    else {\n      gmm::copy(gmm::sub_vector(v1, P.indperm), v2);\n      gmm::lower_tri_solve(gmm::transposed(P.U), v2, false);\n    }\n  }\n\n}\n\n#endif \n\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_precond_mr_approx_inverse.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2002-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n\n// This file is a modified version of approximate_inverse.h from ITL.\n// See http://osl.iu.edu/research/itl/\n// Following the corresponding Copyright notice.\n//===========================================================================\n//\n// Copyright (c) 1998-2001, University of Notre Dame. All rights reserved.\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are met:\n//\n//    * Redistributions of source code must retain the above copyright\n//      notice, this list of conditions and the following disclaimer.\n//    * Redistributions in binary form must reproduce the above copyright\n//      notice, this list of conditions and the following disclaimer in the\n//      documentation and/or other materials provided with the distribution.\n//    * Neither the name of the University of Notre Dame nor the\n//      names of its contributors may be used to endorse or promote products\n//      derived from this software without specific prior written permission.\n//\n// THIS SOFTWARE  IS  PROVIDED  BY  THE TRUSTEES  OF  INDIANA UNIVERSITY  AND\n// CONTRIBUTORS  ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,  INCLUDING,\n// BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND  FITNESS\n// FOR  A PARTICULAR PURPOSE ARE DISCLAIMED. IN  NO  EVENT SHALL THE TRUSTEES\n// OF INDIANA UNIVERSITY AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY,  OR CONSEQUENTIAL DAMAGES (INCLUDING,  BUT\n// NOT  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA,  OR PROFITS;  OR BUSINESS  INTERRUPTION)  HOWEVER  CAUSED AND ON ANY\n// THEORY  OF  LIABILITY,  WHETHER  IN  CONTRACT,  STRICT  LIABILITY, OR TORT\n// (INCLUDING  NEGLIGENCE  OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n// THIS  SOFTWARE,  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n//===========================================================================\n\n/**@file gmm_precond_mr_approx_inverse.h\n   @author Andrew Lumsdaine <lums@osl.iu.edu>\n   @author Lie-Quan Lee     <llee@osl.iu.edu>\n   @author  Yves Renard <Yves.Renard@insa-lyon.fr>\n   @date June 5, 2003.\n   @brief Approximate inverse via MR iteration.\n*/\n\n#ifndef GMM_PRECOND_MR_APPROX_INVERSE_H\n#define GMM_PRECOND_MR_APPROX_INVERSE_H\n\n\n#include \"gmm_precond.h\"\n\nnamespace gmm {\n\n  /** Approximate inverse via MR iteration (see P301 of Saad book).\n   */\n  template <typename Matrix>\n  struct mr_approx_inverse_precond {\n\n    typedef typename linalg_traits<Matrix>::value_type value_type;\n    typedef typename number_traits<value_type>::magnitude_type magnitude_type;\n    typedef typename principal_orientation_type<typename\n      linalg_traits<Matrix>::sub_orientation>::potype sub_orientation;\n    typedef wsvector<value_type> VVector;\n    typedef col_matrix<VVector> MMatrix;\n\n    MMatrix M;\n    size_type nb_it;\n    magnitude_type threshold;\n\n    void build_with(const Matrix& A);\n    mr_approx_inverse_precond(const Matrix& A, size_type nb_it_,\n\t\t\t      magnitude_type threshold_)\n      : M(mat_nrows(A), mat_ncols(A))\n    { threshold = threshold_; nb_it = nb_it_; build_with(A); }\n    mr_approx_inverse_precond(void)\n    { threshold = magnitude_type(1E-7); nb_it = 5; }\n    mr_approx_inverse_precond(size_type nb_it_, magnitude_type threshold_)\n    { threshold = threshold_; nb_it = nb_it_; } \n    const MMatrix &approx_inverse(void) const { return M; }\n  };\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void mult(const mr_approx_inverse_precond<Matrix>& P, const V1 &v1, V2 &v2)\n  { mult(P.M, v1, v2); }\n\n  template <typename Matrix, typename V1, typename V2> inline\n  void transposed_mult(const mr_approx_inverse_precond<Matrix>& P,\n\t\t       const V1 &v1,V2 &v2)\n  { mult(gmm::conjugated(P.M), v1, v2); }\n\n  template <typename Matrix>\n  void mr_approx_inverse_precond<Matrix>::build_with(const Matrix& A) {\n    gmm::resize(M, mat_nrows(A), mat_ncols(A));\n    typedef value_type T;\n    typedef magnitude_type R;\n    VVector m(mat_ncols(A)),r(mat_ncols(A)),ei(mat_ncols(A)),Ar(mat_ncols(A)); \n    T alpha = mat_trace(A)/ mat_euclidean_norm_sqr(A);\n    if (alpha == T(0)) alpha = T(1);\n    \n    for (size_type i = 0; i < mat_nrows(A); ++i) {\n      gmm::clear(m); gmm::clear(ei); \n      m[i] = alpha;\n      ei[i] = T(1);\n      \n      for (size_type j = 0; j < nb_it; ++j) {\n\tgmm::mult(A, gmm::scaled(m, T(-1)), r);\n\tgmm::add(ei, r);\n\tgmm::mult(A, r, Ar);\n\tT nAr = vect_sp(Ar,Ar);\n\tif (gmm::abs(nAr) > R(0)) {\n\t  gmm::add(gmm::scaled(r, gmm::safe_divide(vect_sp(r, Ar), vect_sp(Ar, Ar))), m);\n\t  gmm::clean(m, threshold * gmm::vect_norm2(m));\n\t} else gmm::clear(m);\n      }\n      if (gmm::vect_norm2(m) == R(0)) m[i] = alpha;\n      gmm::copy(m, M.col(i));\n    }\n  }\n}\n\n#endif \n\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_range_basis.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2009-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n/**@file gmm_range_basis.h\n   @author  Yves Renard <Yves.Renard@insa-lyon.fr>\n   @date March 10, 2009.\n   @brief Extract a basis of the range of a (large sparse) matrix from the\n          columns of this matrix.\n*/\n#ifndef GMM_RANGE_BASIS_H\n#define GMM_RANGE_BASIS_H\n#include \"gmm_dense_qr.h\"\n#include \"gmm_dense_lu.h\"\n\n#include \"gmm_kernel.h\"\n#include \"gmm_iter.h\"\n#include <set>\n#include <list>\n\n\nnamespace gmm {\n\n\n  template <typename T, typename VECT, typename MAT1>\n  void tridiag_qr_algorithm\n  (std::vector<typename number_traits<T>::magnitude_type> diag,\n   std::vector<T> sdiag, const VECT &eigval_, const MAT1 &eigvect_,\n   bool compvect, tol_type_for_qr tol = default_tol_for_qr) {\n    VECT &eigval = const_cast<VECT &>(eigval_);\n    MAT1 &eigvect = const_cast<MAT1 &>(eigvect_);\n    typedef typename number_traits<T>::magnitude_type R;\n\n    if (compvect) gmm::copy(identity_matrix(), eigvect);\n\n    size_type n = diag.size(), q = 0, p, ite = 0;\n    if (n == 0) return;\n    if (n == 1) { eigval[0] = gmm::real(diag[0]); return; }\n\n    symmetric_qr_stop_criterion(diag, sdiag, p, q, tol);\n\n    while (q < n) {\n      sub_interval SUBI(p, n-p-q), SUBJ(0, mat_ncols(eigvect)), SUBK(p, n-p-q);\n      if (!compvect) SUBK = sub_interval(0,0);\n\n      symmetric_Wilkinson_qr_step(sub_vector(diag, SUBI),\n                                  sub_vector(sdiag, SUBI),\n                                  sub_matrix(eigvect, SUBJ, SUBK), compvect);\n\n      symmetric_qr_stop_criterion(diag, sdiag, p, q, tol*R(3));\n      ++ite;\n      GMM_ASSERT1(ite < n*100, \"QR algorithm failed.\");\n    }\n\n    gmm::copy(diag, eigval);\n  }\n\n  // Range basis with a restarted Lanczos method\n  template <typename Mat>\n  void range_basis_eff_Lanczos(const Mat &BB, std::set<size_type> &columns,\n                       double EPS=1E-12) {\n    typedef std::set<size_type> TAB;\n    typedef typename linalg_traits<Mat>::value_type T;\n    typedef typename number_traits<T>::magnitude_type R;\n\n    size_type nc_r = columns.size(), k;\n    col_matrix< rsvector<T> > B(mat_nrows(BB), mat_ncols(BB));\n\n    k = 0;\n    for (TAB::iterator it = columns.begin(); it!=columns.end(); ++it, ++k){\n      gmm::copy(scaled(mat_col(BB, *it), T(1)/vect_norm2(mat_col(BB, *it))),\n                mat_col(B, *it));\n    }\n    std::vector<T> w(mat_nrows(B));\n    size_type restart = 120;\n    std::vector<T> sdiag(restart);\n    std::vector<R> eigval(restart), diag(restart);\n    dense_matrix<T> eigvect(restart, restart);\n\n    R rho = R(-1), rho2;\n    while (nc_r) {\n\n      std::vector<T> v(nc_r), v0(nc_r), wl(nc_r);\n      dense_matrix<T> lv(nc_r, restart);\n\n      if (rho < R(0)) { // Estimate of the spectral radius of B^* B\n        gmm::fill_random(v);\n        for (size_type i = 0; i < 100; ++i) {\n          gmm::scale(v, T(1)/vect_norm2(v));\n          gmm::copy(v, v0);\n          k = 0; gmm::clear(w);\n          for (TAB::iterator it=columns.begin(); it!=columns.end(); ++it, ++k)\n            add(scaled(mat_col(B, *it), v[k]), w);\n          k = 0;\n          for (TAB::iterator it=columns.begin(); it!=columns.end(); ++it, ++k)\n            v[k] = vect_hp(w, mat_col(B, *it));\n          rho = gmm::abs(vect_hp(v, v0) / vect_hp(v0, v0));\n        }\n        rho *= R(2);\n      }\n\n      // Computing vectors of the null space of de B^* B with restarted Lanczos\n      rho2 = 0;\n      gmm::fill_random(v);\n      size_type iter = 0;\n      for(;;++iter) {\n        R rho_old = rho2;\n        R beta = R(0), alpha;\n        gmm::scale(v, T(1)/vect_norm2(v));\n        size_type eff_restart = restart;\n    if (sdiag.size() != restart) {\n      sdiag.resize(restart); eigval.resize(restart); diag.resize(restart); gmm::resize(eigvect, restart, restart);\n      gmm::resize(lv, nc_r, restart);\n    }\n\n        for (size_type i = 0; i < restart; ++i) { // Lanczos iterations\n          gmm::copy(v, mat_col(lv, i));\n          gmm::clear(w);\n          k = 0;\n          for (TAB::iterator it=columns.begin(); it!=columns.end(); ++it, ++k)\n            add(scaled(mat_col(B, *it), v[k]), w);\n\n          k = 0;\n          for (TAB::iterator it=columns.begin(); it!=columns.end(); ++it, ++k)\n            wl[k] = v[k]*rho - vect_hp(w, mat_col(B, *it)) - beta*v0[k];\n          alpha = gmm::real(vect_hp(wl, v));\n          diag[i] = alpha;\n          gmm::add(gmm::scaled(v, -alpha), wl);\n          sdiag[i] = beta = vect_norm2(wl);\n          gmm::copy(v, v0);\n      if (beta < EPS) { eff_restart = i+1; break; }\n      gmm::copy(gmm::scaled(wl, T(1) / beta), v);\n    }\n    if (eff_restart != restart) {\n      sdiag.resize(eff_restart); eigval.resize(eff_restart); diag.resize(eff_restart);\n      gmm::resize(eigvect, eff_restart, eff_restart); gmm::resize(lv, nc_r, eff_restart);\n    }\n        tridiag_qr_algorithm(diag, sdiag, eigval, eigvect, true);\n\n        size_type num = size_type(-1);\n        rho2 = R(0);\n        for (size_type j = 0; j < eff_restart; ++j)\n          { R nvp=gmm::abs(eigval[j]); if (nvp > rho2) { rho2=nvp; num=j; }}\n\n        GMM_ASSERT1(num != size_type(-1), \"Internal error\");\n\n        gmm::mult(lv, mat_col(eigvect, num), v);\n\n        if (gmm::abs(rho2-rho_old) < rho_old*R(EPS)) break;\n        // if (gmm::abs(rho-rho2) < rho*R(gmm::sqrt(EPS))) break;\n        if (gmm::abs(rho-rho2) < rho*R(EPS)*R(100)) break;\n      }\n\n      if (gmm::abs(rho-rho2) < rho*R(EPS*10.)) {\n        size_type j_max = size_type(-1), j = 0;\n        R val_max = R(0);\n        for (TAB::iterator it=columns.begin(); it!=columns.end(); ++it, ++j)\n          if (gmm::abs(v[j]) > val_max)\n            { val_max = gmm::abs(v[j]); j_max = *it; }\n        columns.erase(j_max); nc_r = columns.size();\n      }\n      else break;\n    }\n  }\n\n  // Range basis with LU decomposition. Not stable from a numerical viewpoint.\n  // Complex version not verified\n  template <typename Mat>\n  void range_basis_eff_lu(const Mat &B, std::set<size_type> &columns,\n                          std::vector<bool> &c_ortho, double EPS) {\n\n    typedef std::set<size_type> TAB;\n    typedef typename linalg_traits<Mat>::value_type T;\n    typedef typename number_traits<T>::magnitude_type R;\n\n    size_type nc_r = 0, nc_o = 0, nc = mat_ncols(B), nr = mat_nrows(B), i, j;\n\n    for (TAB::iterator it=columns.begin(); it!=columns.end(); ++it)\n      if (!(c_ortho[*it])) ++nc_r; else nc_o++;\n\n    if (nc_r > 0) {\n\n      gmm::row_matrix< gmm::rsvector<T> > Hr(nc, nc_r), Ho(nc, nc_o);\n      gmm::row_matrix< gmm::rsvector<T> > BBr(nr, nc_r), BBo(nr, nc_o);\n\n      i = j = 0;\n      for (TAB::iterator it=columns.begin(); it!=columns.end(); ++it)\n        if (!(c_ortho[*it]))\n          { Hr(*it, i) = T(1)/ vect_norminf(mat_col(B, *it)); ++i; }\n        else\n          { Ho(*it, j) = T(1)/ vect_norm2(mat_col(B, *it)); ++j; }\n\n      gmm::mult(B, Hr, BBr);\n      gmm::mult(B, Ho, BBo);\n      gmm::dense_matrix<T> M(nc_r, nc_r), BBB(nc_r, nc_o), MM(nc_r, nc_r);\n      gmm::mult(gmm::conjugated(BBr), BBr, M);\n      gmm::mult(gmm::conjugated(BBr), BBo, BBB);\n      gmm::mult(BBB, gmm::conjugated(BBB), MM);\n      gmm::add(gmm::scaled(MM, T(-1)), M);\n\n      std::vector<int> ipvt(nc_r);\n      gmm::lu_factor(M, ipvt);\n\n      R emax = R(0);\n      for (i = 0; i < nc_r; ++i) emax = std::max(emax, gmm::abs(M(i,i)));\n\n      i = 0;\n      std::set<size_type> c = columns;\n      for (TAB::iterator it = c.begin(); it != c.end(); ++it)\n        if (!(c_ortho[*it])) {\n          if (gmm::abs(M(i,i)) <= R(EPS)*emax) columns.erase(*it);\n          ++i;\n        }\n    }\n  }\n\n\n  // Range basis with Gram-Schmidt orthogonalization (sparse version)\n  // The sparse version is better when the sparsity is high and less efficient\n  // than the dense version for high degree elements (P3, P4 ...)\n  // Complex version not verified\n  template <typename Mat>\n  void range_basis_eff_Gram_Schmidt_sparse(const Mat &BB,\n                                           std::set<size_type> &columns,\n                                           std::vector<bool> &c_ortho,\n                                           double EPS) {\n\n    typedef std::set<size_type> TAB;\n    typedef typename linalg_traits<Mat>::value_type T;\n    typedef typename number_traits<T>::magnitude_type R;\n\n    size_type nc = mat_ncols(BB), nr = mat_nrows(BB);\n    std::set<size_type> c = columns, rc = columns;\n\n    gmm::col_matrix< rsvector<T> > B(nr, nc);\n    for (std::set<size_type>::iterator it = columns.begin();\n         it != columns.end(); ++it) {\n      gmm::copy(mat_col(BB, *it), mat_col(B, *it));\n      gmm::scale(mat_col(B, *it), T(1)/vect_norm2(mat_col(B, *it)));\n    }\n\n    for (std::set<size_type>::iterator it = c.begin(); it != c.end(); ++it)\n      if (c_ortho[*it]) {\n        for (std::set<size_type>::iterator it2 = rc.begin();\n             it2 != rc.end(); ++it2)\n          if (!(c_ortho[*it2])) {\n            T r = -vect_hp(mat_col(B, *it2), mat_col(B, *it));\n            if (r != T(0)) add(scaled(mat_col(B, *it), r), mat_col(B, *it2));\n          }\n        rc.erase(*it);\n      }\n\n    while (rc.size()) {\n      R nmax = R(0); size_type cmax = size_type(-1);\n      for (std::set<size_type>::iterator it=rc.begin(); it != rc.end();) {\n        TAB::iterator itnext = it; ++itnext;\n        R n = vect_norm2(mat_col(B, *it));\n        if (nmax < n) { nmax = n; cmax = *it; }\n        if (n < R(EPS)) { columns.erase(*it); rc.erase(*it); }\n        it = itnext;\n      }\n\n      if (nmax < R(EPS)) break;\n\n      gmm::scale(mat_col(B, cmax), T(1)/vect_norm2(mat_col(B, cmax)));\n      rc.erase(cmax);\n      for (std::set<size_type>::iterator it=rc.begin(); it!=rc.end(); ++it) {\n        T r = -vect_hp(mat_col(B, *it), mat_col(B, cmax));\n        if (r != T(0)) add(scaled(mat_col(B, cmax), r), mat_col(B, *it));\n      }\n    }\n    for (std::set<size_type>::iterator it=rc.begin(); it!=rc.end(); ++it)\n      columns.erase(*it);\n  }\n\n\n  // Range basis with Gram-Schmidt orthogonalization (dense version)\n  template <typename Mat>\n  void range_basis_eff_Gram_Schmidt_dense(const Mat &B,\n                                          std::set<size_type> &columns,\n                                          std::vector<bool> &c_ortho,\n                                          double EPS) {\n\n    typedef std::set<size_type> TAB;\n    typedef typename linalg_traits<Mat>::value_type T;\n    typedef typename number_traits<T>::magnitude_type R;\n\n    size_type nc_r = columns.size(), nc = mat_ncols(B), nr = mat_nrows(B), i;\n    std::set<size_type> rc;\n\n    row_matrix< gmm::rsvector<T> > H(nc, nc_r), BB(nr, nc_r);\n    std::vector<T> v(nc_r);\n    std::vector<size_type> ind(nc_r);\n\n    i = 0;\n    for (TAB::iterator it = columns.begin(); it != columns.end(); ++it, ++i)\n      H(*it, i) = T(1) / vect_norm2(mat_col(B, *it));\n\n    mult(B, H, BB);\n    dense_matrix<T> M(nc_r, nc_r);\n    mult(gmm::conjugated(BB), BB, M);\n\n    i = 0;\n    for (TAB::iterator it = columns.begin(); it != columns.end(); ++it, ++i)\n      if (c_ortho[*it]) {\n        gmm::copy(mat_row(M, i), v);\n        rank_one_update(M, scaled(v, T(-1)), v);\n        M(i, i) = T(1);\n      }\n      else { rc.insert(i); ind[i] = *it; }\n\n    while (rc.size() > 0) {\n\n      // Next pivot\n      R nmax = R(0); size_type imax = size_type(-1);\n      for (TAB::iterator it = rc.begin(); it != rc.end();) {\n        TAB::iterator itnext = it; ++itnext;\n        R a = gmm::abs(M(*it, *it));\n        if (a > nmax) { nmax = a; imax = *it; }\n        if (a < R(EPS)) { columns.erase(ind[*it]); rc.erase(*it); }\n        it = itnext;\n      }\n\n      if (nmax < R(EPS)) break;\n\n      // Normalization\n      gmm::scale(mat_row(M, imax), T(1) / sqrt(nmax));\n      gmm::scale(mat_col(M, imax), T(1) / sqrt(nmax));\n\n      // orthogonalization\n      copy(mat_row(M, imax), v);\n      rank_one_update(M, scaled(v, T(-1)), v);\n      M(imax, imax) = T(1);\n\n      rc.erase(imax);\n    }\n    for (std::set<size_type>::iterator it=rc.begin(); it!=rc.end(); ++it)\n      columns.erase(ind[*it]);\n  }\n\n  template <typename L> size_type nnz_eps(const L& l, double eps) {\n    typename linalg_traits<L>::const_iterator it = vect_const_begin(l),\n      ite = vect_const_end(l);\n    size_type res(0);\n    for (; it != ite; ++it) if (gmm::abs(*it) >= eps) ++res;\n    return res;\n  }\n\n  template <typename L>\n  bool reserve__rb(const L& l, std::vector<bool> &b, double eps) {\n    typename linalg_traits<L>::const_iterator it = vect_const_begin(l),\n      ite = vect_const_end(l);\n    bool ok = true;\n    for (; it != ite; ++it)\n      if (gmm::abs(*it) >= eps && b[it.index()]) ok = false;\n    if (ok) {\n      for (it = vect_const_begin(l); it != ite; ++it)\n        if (gmm::abs(*it) >= eps) b[it.index()] = true;\n    }\n    return ok;\n  }\n\n  template <typename Mat>\n  void range_basis(const Mat &B, std::set<size_type> &columns,\n                       double EPS, col_major, bool skip_init=false) {\n\n    typedef typename linalg_traits<Mat>::value_type T;\n    typedef typename number_traits<T>::magnitude_type R;\n\n    size_type nc = mat_ncols(B), nr = mat_nrows(B);\n\n    std::vector<R> norms(nc);\n    std::vector<bool> c_ortho(nc), booked(nr);\n    std::vector< std::set<size_type> > nnzs(mat_nrows(B));\n\n    if (!skip_init) {\n\n      R norm_max = R(0);\n      for (size_type i = 0; i < nc; ++i) {\n        norms[i] = vect_norminf(mat_col(B, i));\n        norm_max = std::max(norm_max, norms[i]);\n      }\n\n      columns.clear();\n      for (size_type i = 0; i < nc; ++i)\n        if (norms[i] > norm_max*R(EPS)) {\n          columns.insert(i);\n          nnzs[nnz_eps(mat_col(B, i), R(EPS) * norms[i])].insert(i);\n        }\n\n      for (size_type i = 1; i < nr; ++i)\n        for (std::set<size_type>::iterator it = nnzs[i].begin();\n             it != nnzs[i].end(); ++it)\n          if (reserve__rb(mat_col(B, *it), booked, R(EPS) * norms[*it]))\n            c_ortho[*it] = true;\n    }\n\n    size_type sizesm[7] = {125, 200, 350, 550, 800, 1100, 1500}, actsize;\n    for (int k = 0; k < 7; ++k) {\n      size_type nc_r = columns.size();\n      std::set<size_type> c1, cres;\n      actsize = sizesm[k];\n      for (std::set<size_type>::iterator it = columns.begin();\n           it != columns.end(); ++it) {\n        c1.insert(*it);\n        if (c1.size() >= actsize) {\n          range_basis_eff_Gram_Schmidt_dense(B, c1, c_ortho, EPS);\n          for (std::set<size_type>::iterator it2=c1.begin(); it2 != c1.end();\n               ++it2) cres.insert(*it2);\n          c1.clear();\n        }\n      }\n      if (c1.size() > 10)\n        range_basis_eff_Gram_Schmidt_dense(B, c1, c_ortho, EPS);\n      for (std::set<size_type>::iterator it = c1.begin(); it != c1.end(); ++it)\n        cres.insert(*it);\n      columns = cres;\n      if (nc_r <= actsize) return;\n      if (columns.size() == nc_r) break;\n      if (sizesm[k] >= 350 && columns.size() > (nc_r*19)/20) break;\n    }\n    // cout << \"size of columns \" << columns.size() << endl;\n    if (columns.size() > std::max(size_type(10), actsize))\n      range_basis_eff_Lanczos(B, columns, EPS);\n    else\n      range_basis_eff_Gram_Schmidt_dense(B, columns, c_ortho, EPS);\n  }\n\n\n  template <typename Mat>\n  void range_basis(const Mat &B, std::set<size_type> &columns,\n                   double EPS, row_major) {\n    typedef typename  linalg_traits<Mat>::value_type T;\n    gmm::col_matrix< rsvector<T> > BB(mat_nrows(B), mat_ncols(B));\n    GMM_WARNING3(\"A copy of a row matrix is done into a column matrix \"\n                 \"for range basis algorithm.\");\n    gmm::copy(B, BB);\n    range_basis(BB, columns, EPS);\n  }\n\n  /** Range Basis :\n    Extract a basis of the range of a (large sparse) matrix selecting some\n    column vectors of this matrix. This is in particular useful to select\n    an independent set of linear constraints.\n\n    The algorithm is optimized for two cases :\n       - when the (non trivial) kernel is small. An iterativ algorithm\n         based on Lanczos method is applied\n       - when the (non trivial) kernel is large and most of the dependencies\n         can be detected locally. A block Gram-Schmidt is applied first then\n         a restarted Lanczos method when the remaining kernel is greatly\n         smaller.\n    The restarted Lanczos method could be improved or replaced by a block\n    Lanczos method, a block Wiedelann method (in order to be parallelized for\n    instance) or simply could compute more than one vector of the null\n    space at each iteration.\n    The LU decomposition has been tested for local elimination but gives bad\n    results : the algorithm is unstable and do not permit to give the right\n    number of vector at the end of the process. Moreover, the number of final\n    vector depend greatly on the number of vectors in a block of the local\n    analysis.\n  */\n  template <typename Mat>\n  void range_basis(const Mat &B, std::set<size_type> &columns,\n                   double EPS=1E-12) {\n    range_basis(B, columns, EPS,\n                typename principal_orientation_type\n                <typename linalg_traits<Mat>::sub_orientation>::potype());\n}\n\n}\n\n#endif\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_real_part.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2003-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n/**@file gmm_real_part.h\n   @author  Yves Renard <Yves.Renard@insa-lyon.fr>\n   @date September 18, 2003.\n   @brief extract the real/imaginary part of vectors/matrices \n*/\n#ifndef GMM_REAL_PART_H\n#define GMM_REAL_PART_H\n\n#include \"gmm_def.h\"\n#include \"gmm_vector.h\"\n\nnamespace gmm {\n\n  struct linalg_real_part {};\n  struct linalg_imag_part {};\n  template <typename R, typename PART> struct which_part {};\n  \n  template <typename C> typename number_traits<C>::magnitude_type \n  real_or_imag_part(C x, linalg_real_part) { return gmm::real(x); }\n  template <typename C> typename number_traits<C>::magnitude_type \n  real_or_imag_part(C x, linalg_imag_part) { return gmm::imag(x); }\n  template <typename T, typename C, typename OP> C\n  complex_from(T x, C y, OP op, linalg_real_part) { return std::complex<T>(op(std::real(y), x), std::imag(y)); }\n  template <typename T, typename C, typename OP> C\n  complex_from(T x, C y, OP op,linalg_imag_part) { return std::complex<T>(std::real(y), op(std::imag(y), x)); }\n  \n  template<typename T> struct project2nd {\n    T operator()(T , T b) const { return b; }\n  };\n  \n  template<typename T, typename R, typename PART> class ref_elt_vector<T, which_part<R, PART> > {\n\n    R r;\n    \n    public :\n\n    operator T() const { return real_or_imag_part(std::complex<T>(r), PART()); }\n    ref_elt_vector(R r_) : r(r_) {}\n    inline ref_elt_vector &operator =(T v)\n    { r = complex_from(v, std::complex<T>(r), gmm::project2nd<T>(), PART()); return *this; }\n    inline bool operator ==(T v) const { return (r == v); }\n    inline bool operator !=(T v) const { return (r != v); }\n    inline ref_elt_vector &operator +=(T v)\n    { r = complex_from(v, std::complex<T>(r), std::plus<T>(), PART()); return *this; }\n    inline ref_elt_vector &operator -=(T v)\n      { r = complex_from(v, std::complex<T>(r), std::minus<T>(), PART()); return *this; }\n    inline ref_elt_vector &operator /=(T v)\n      { r = complex_from(v, std::complex<T>(r), std::divides<T>(), PART()); return *this; }\n    inline ref_elt_vector &operator *=(T v)\n      { r = complex_from(v, std::complex<T>(r), std::multiplies<T>(), PART()); return *this; }\n    inline ref_elt_vector &operator =(const ref_elt_vector &re)\n      { *this = T(re); return *this; }\n    T operator +()    { return  T(*this);   } // necessary for unknow reason\n    T operator -()    { return -T(*this);   } // necessary for unknow reason\n    T operator +(T v) { return T(*this)+ v; } // necessary for unknow reason\n    T operator -(T v) { return T(*this)- v; } // necessary for unknow reason\n    T operator *(T v) { return T(*this)* v; } // necessary for unknow reason\n    T operator /(T v) { return T(*this)/ v; } // necessary for unknow reason\n  };\n\n  template<typename reference> struct ref_or_value_type {\n    template <typename T, typename W>\n    static W r(const T &x, linalg_real_part, W) {\n      return gmm::real(x);\n    }\n    template <typename T, typename W>\n    static W r(const T &x, linalg_imag_part, W) {\n      return gmm::imag(x);\n    }\n  };\n  \n  template<typename U, typename R, typename PART> \n  struct ref_or_value_type<ref_elt_vector<U, which_part<R, PART> > > {\n    template<typename T , typename W> \n    static const T &r(const T &x, linalg_real_part, W)\n    { return x; }\n    template<typename T, typename W> \n    static const T &r(const T &x, linalg_imag_part, W) {\n      return x; \n    }\n    template<typename T , typename W> \n    static T &r(T &x, linalg_real_part, W)\n    { return x; }\n    template<typename T, typename W> \n    static T &r(T &x, linalg_imag_part, W) {\n      return x; \n    }\n  };\n\n  \n  /* ********************************************************************* */\n  /*\tReference to the real part of (complex) vectors            \t   */\n  /* ********************************************************************* */\n\n  template <typename IT, typename MIT, typename PART>\n  struct part_vector_iterator {\n    typedef typename std::iterator_traits<IT>::value_type      vtype;\n    typedef typename gmm::number_traits<vtype>::magnitude_type value_type;\n    typedef value_type                                        *pointer;\n    typedef ref_elt_vector<value_type, which_part<typename std::iterator_traits<IT>::reference, PART> > reference;\n    typedef typename std::iterator_traits<IT>::difference_type difference_type;\n    typedef typename std::iterator_traits<IT>::iterator_category\n    iterator_category;\n\n    IT it;\n    \n    part_vector_iterator(void) {}\n    explicit part_vector_iterator(const IT &i) : it(i) {}\n    part_vector_iterator(const part_vector_iterator<MIT, MIT, PART> &i) : it(i.it) {}\n    \n\n    size_type index(void) const { return it.index(); }\n    part_vector_iterator operator ++(int)\n    { part_vector_iterator tmp = *this; ++it; return tmp; }\n    part_vector_iterator operator --(int) \n    { part_vector_iterator tmp = *this; --it; return tmp; }\n    part_vector_iterator &operator ++() { ++it; return *this; }\n    part_vector_iterator &operator --() { --it; return *this; }\n    part_vector_iterator &operator +=(difference_type i)\n      { it += i; return *this; }\n    part_vector_iterator &operator -=(difference_type i)\n      { it -= i; return *this; }\n    part_vector_iterator operator +(difference_type i) const\n      { part_vector_iterator itb = *this; return (itb += i); }\n    part_vector_iterator operator -(difference_type i) const\n      { part_vector_iterator itb = *this; return (itb -= i); }\n    difference_type operator -(const part_vector_iterator &i) const\n      { return difference_type(it - i.it); }\n    \n    reference operator  *() const { return reference(*it); }\n    reference operator [](size_type ii) const { return reference(it[ii]); }\n    \n    bool operator ==(const part_vector_iterator &i) const\n      { return (i.it == it); }\n    bool operator !=(const part_vector_iterator &i) const\n      { return (i.it != it); }\n    bool operator < (const part_vector_iterator &i) const\n      { return (it < i.it); }\n  };\n\n\n  template <typename PT, typename PART> struct part_vector {\n    typedef part_vector<PT, PART> this_type;\n    typedef typename std::iterator_traits<PT>::value_type V;\n    typedef V * CPT;\n    typedef typename select_ref<typename linalg_traits<V>::const_iterator,\n            typename linalg_traits<V>::iterator, PT>::ref_type iterator;\n    typedef typename linalg_traits<this_type>::reference reference;\n    typedef typename linalg_traits<this_type>::value_type value_type;\n    typedef typename linalg_traits<this_type>::porigin_type porigin_type;\n\n    iterator begin_, end_;\n    porigin_type origin;\n    size_type size_;\n\n    size_type size(void) const { return size_; }\n   \n    reference operator[](size_type i) const { \n      return reference(ref_or_value_type<reference>::r(\n\t     linalg_traits<V>::access(origin, begin_, end_, i),\n\t     PART(), value_type()));\n    }\n\n    part_vector(V &v)\n      : begin_(vect_begin(v)),  end_(vect_end(v)),\n\torigin(linalg_origin(v)), size_(gmm::vect_size(v)) {}\n    part_vector(const V &v) \n      : begin_(vect_begin(const_cast<V &>(v))),\n       end_(vect_end(const_cast<V &>(v))),\n\torigin(linalg_origin(const_cast<V &>(v))), size_(gmm::vect_size(v)) {}\n    part_vector() {}\n    part_vector(const part_vector<CPT, PART> &cr)\n      : begin_(cr.begin_),end_(cr.end_),origin(cr.origin), size_(cr.size_) {} \n  };\n\n  template <typename IT, typename MIT, typename ORG, typename PT,\n\t    typename PART> inline\n  void set_to_begin(part_vector_iterator<IT, MIT, PART> &it,\n\t\t    ORG o, part_vector<PT, PART> *, linalg_modifiable) {\n    typedef part_vector<PT, PART> VECT;\n    typedef typename linalg_traits<VECT>::V_reference ref_t;\n    set_to_begin(it.it, o, typename linalg_traits<VECT>::pV(), ref_t());\n  }\n  template <typename IT, typename MIT, typename ORG, typename PT,\n\t    typename PART> inline\n  void set_to_begin(part_vector_iterator<IT, MIT, PART> &it,\n\t\t    ORG o, const part_vector<PT, PART> *, linalg_modifiable) {\n    typedef part_vector<PT, PART> VECT;\n    typedef typename linalg_traits<VECT>::V_reference ref_t;\n    set_to_begin(it.it, o, typename linalg_traits<VECT>::pV(), ref_t());\n  }\n  template <typename IT, typename MIT, typename ORG, typename PT,\n\t    typename PART> inline\n  void set_to_end(part_vector_iterator<IT, MIT, PART> &it,\n\t\t    ORG o, part_vector<PT, PART> *, linalg_modifiable) {\n    typedef part_vector<PT, PART> VECT;\n    typedef typename linalg_traits<VECT>::V_reference ref_t;\n    set_to_end(it.it, o, typename linalg_traits<VECT>::pV(), ref_t());\n  }\n  template <typename IT, typename MIT, typename ORG,\n\t    typename PT, typename PART> inline\n  void set_to_end(part_vector_iterator<IT, MIT, PART> &it,\n\t\t  ORG o, const part_vector<PT, PART> *,\n\t\t  linalg_modifiable) {\n    typedef part_vector<PT, PART> VECT;\n    typedef typename linalg_traits<VECT>::V_reference ref_t;\n    set_to_end(it.it, o, typename linalg_traits<VECT>::pV(), ref_t());\n  }\n  \n  template <typename PT, typename PART>\n  struct linalg_traits<part_vector<PT, PART> > {\n    typedef part_vector<PT, PART> this_type;\n    typedef this_type * pthis_type;\n    typedef PT pV;\n    typedef typename std::iterator_traits<PT>::value_type V;\n    typedef typename linalg_traits<V>::index_sorted index_sorted;\n    typedef typename linalg_traits<V>::is_reference V_reference;\n    typedef typename linalg_traits<V>::origin_type origin_type;\n    typedef typename select_ref<const origin_type *, origin_type *,\n\t\t\t        PT>::ref_type porigin_type;\n    typedef typename which_reference<PT>::is_reference is_reference;\n    typedef abstract_vector linalg_type;\n    typedef typename linalg_traits<V>::value_type vtype;\n    typedef typename number_traits<vtype>::magnitude_type value_type;\n    typedef typename select_ref<value_type, ref_elt_vector<value_type,\n\t\t     which_part<typename linalg_traits<V>::reference,\n\t\t\t\tPART> >, PT>::ref_type reference;\n    typedef typename select_ref<typename linalg_traits<V>::const_iterator,\n\t    typename linalg_traits<V>::iterator, PT>::ref_type pre_iterator;\n    typedef typename select_ref<abstract_null_type, \n\t    part_vector_iterator<pre_iterator, pre_iterator, PART>,\n\t    PT>::ref_type iterator;\n    typedef part_vector_iterator<typename linalg_traits<V>::const_iterator,\n\t\t\t\t pre_iterator, PART> const_iterator;\n    typedef typename linalg_traits<V>::storage_type storage_type;\n    static size_type size(const this_type &v) { return v.size(); }\n    static iterator begin(this_type &v) {\n      iterator it; it.it = v.begin_;\n      if (!is_const_reference(is_reference()) && is_sparse(storage_type()))\n\tset_to_begin(it, v.origin, pthis_type(), is_reference());\n      return it;\n    }\n    static const_iterator begin(const this_type &v) {\n      const_iterator it(v.begin_);\n      if (!is_const_reference(is_reference()) && is_sparse(storage_type()))\n\t{ set_to_begin(it, v.origin, pthis_type(), is_reference()); }\n      return it;\n    }\n    static iterator end(this_type &v) {\n      iterator it(v.end_);\n      if (!is_const_reference(is_reference()) && is_sparse(storage_type()))\n\tset_to_end(it, v.origin, pthis_type(), is_reference());\n      return it;\n    }\n    static const_iterator end(const this_type &v) {\n      const_iterator it(v.end_);\n      if (!is_const_reference(is_reference()) && is_sparse(storage_type()))\n\tset_to_end(it, v.origin, pthis_type(), is_reference());\n      return it;\n    }\n    static origin_type* origin(this_type &v) { return v.origin; }\n    static const origin_type* origin(const this_type &v) { return v.origin; }\n\n    static void clear(origin_type* o, const iterator &begin_,\n\t\t      const iterator &end_, abstract_sparse) {\n      std::deque<size_type> ind;\n      iterator it = begin_;\n      for (; it != end_; ++it) ind.push_front(it.index());\n      for (; !(ind.empty()); ind.pop_back())\n\taccess(o, begin_, end_, ind.back()) = value_type(0);\n    }\n    static void clear(origin_type* o, const iterator &begin_,\n\t\t      const iterator &end_, abstract_skyline) {\n      clear(o, begin_, end_, abstract_sparse());\n    }\n    static void clear(origin_type* o, const iterator &begin_,\n\t\t      const iterator &end_, abstract_dense) {\n      for (iterator it = begin_; it != end_; ++it) *it = value_type(0);\n    }\n\n   static void clear(origin_type* o, const iterator &begin_,\n\t\t      const iterator &end_) \n    { clear(o, begin_, end_, storage_type()); }\n    static void do_clear(this_type &v) { clear(v.origin, begin(v), end(v)); }\n    static value_type access(const origin_type *o, const const_iterator &it,\n\t\t\t     const const_iterator &ite, size_type i) { \n      return  real_or_imag_part(linalg_traits<V>::access(o, it.it, ite.it,i),\n\t\t\t\tPART());\n    }\n    static reference access(origin_type *o, const iterator &it,\n\t\t\t    const iterator &ite, size_type i)\n    { return reference(linalg_traits<V>::access(o, it.it, ite.it,i)); }\n  };\n\n  template <typename PT, typename PART> std::ostream &operator <<\n    (std::ostream &o, const part_vector<PT, PART>& m)\n  { gmm::write(o,m); return o; }\n\n\n  /* ********************************************************************* */\n  /*\tReference to the real or imaginary part of (complex) matrices      */\n  /* ********************************************************************* */\n\n\n  template <typename PT, typename PART> struct  part_row_ref {\n    \n    typedef part_row_ref<PT, PART> this_type;\n    typedef typename std::iterator_traits<PT>::value_type M;\n    typedef M * CPT;\n    typedef typename std::iterator_traits<PT>::reference ref_M;\n    typedef typename select_ref<typename linalg_traits<this_type>\n            ::const_row_iterator, typename linalg_traits<this_type>\n            ::row_iterator, PT>::ref_type iterator;\n    typedef typename linalg_traits<this_type>::value_type value_type;\n    typedef typename linalg_traits<this_type>::reference reference;\n    typedef typename linalg_traits<this_type>::porigin_type porigin_type;\n\n    iterator begin_, end_;\n    porigin_type origin;\n    size_type nr, nc;\n\n    part_row_ref(ref_M m)\n      : begin_(mat_row_begin(m)), end_(mat_row_end(m)),\n\torigin(linalg_origin(m)), nr(mat_nrows(m)), nc(mat_ncols(m)) {}\n\n    part_row_ref(const part_row_ref<CPT, PART> &cr) :\n      begin_(cr.begin_),end_(cr.end_), origin(cr.origin),nr(cr.nr),nc(cr.nc) {}\n\n    reference operator()(size_type i, size_type j) const {\n      return reference(ref_or_value_type<reference>::r(\n\t\t\t\t\t linalg_traits<M>::access(begin_+i, j),\n\t\t\t\t\t PART(), value_type()));\n    }\n  };\n\n  template <typename PT, typename PART>\n  struct linalg_traits<part_row_ref<PT, PART> > {\n    typedef part_row_ref<PT, PART> this_type;\n    typedef typename std::iterator_traits<PT>::value_type M;\n    typedef typename linalg_traits<M>::origin_type origin_type;\n    typedef typename select_ref<const origin_type *, origin_type *,\n\t\t\t        PT>::ref_type porigin_type;\n    typedef typename which_reference<PT>::is_reference is_reference;\n    typedef abstract_matrix linalg_type;\n    typedef typename linalg_traits<M>::value_type vtype;\n    typedef typename number_traits<vtype>::magnitude_type value_type;\n    typedef typename linalg_traits<M>::storage_type storage_type;\n    typedef abstract_null_type sub_col_type;\n    typedef abstract_null_type const_sub_col_type;\n    typedef abstract_null_type col_iterator;\n    typedef abstract_null_type const_col_iterator;\n    typedef typename linalg_traits<M>::const_sub_row_type\n            pre_const_sub_row_type;\n    typedef typename linalg_traits<M>::sub_row_type pre_sub_row_type;\n    typedef part_vector<const pre_const_sub_row_type *, PART>\n            const_sub_row_type;\n    typedef typename select_ref<abstract_null_type,\n\t    part_vector<pre_sub_row_type *, PART>, PT>::ref_type sub_row_type;\n    typedef typename linalg_traits<M>::const_row_iterator const_row_iterator;\n    typedef typename select_ref<abstract_null_type, typename\n            linalg_traits<M>::row_iterator, PT>::ref_type row_iterator;\n    typedef typename select_ref<\n            typename linalg_traits<const_sub_row_type>::reference,\n\t    typename linalg_traits<sub_row_type>::reference,\n\t\t\t\tPT>::ref_type reference;\n    typedef row_major sub_orientation;\n    typedef typename linalg_traits<M>::index_sorted index_sorted;\n    static size_type ncols(const this_type &v) { return v.nc; }\n    static size_type nrows(const this_type &v) { return v.nr; }\n    static const_sub_row_type row(const const_row_iterator &it)\n    { return const_sub_row_type(linalg_traits<M>::row(it)); }\n    static sub_row_type row(const row_iterator &it)\n    { return sub_row_type(linalg_traits<M>::row(it)); }\n    static row_iterator row_begin(this_type &m) { return m.begin_; }\n    static row_iterator row_end(this_type &m) { return m.end_; }\n    static const_row_iterator row_begin(const this_type &m)\n    { return m.begin_; }\n    static const_row_iterator row_end(const this_type &m) { return m.end_; }\n    static origin_type* origin(this_type &v) { return v.origin; }\n    static const origin_type* origin(const this_type &v) { return v.origin; }\n    static void do_clear(this_type &v);\n    static value_type access(const const_row_iterator &itrow, size_type i)\n    { return real_or_imag_part(linalg_traits<M>::access(itrow, i), PART()); }\n    static reference access(const row_iterator &itrow, size_type i) {\n      return reference(ref_or_value_type<reference>::r(\n\t\t\t\t\t linalg_traits<M>::access(itrow, i),\n\t\t\t\t\t PART(), value_type()));\n    }\n  };\n   \n  template <typename PT, typename PART> \n  void linalg_traits<part_row_ref<PT, PART> >::do_clear(this_type &v) { \n    row_iterator it = mat_row_begin(v), ite = mat_row_end(v);\n    for (; it != ite; ++it) clear(row(it));\n  }\n  \n  template<typename PT, typename PART> std::ostream &operator <<\n    (std::ostream &o, const part_row_ref<PT, PART>& m)\n  { gmm::write(o,m); return o; }\n\n  template <typename PT, typename PART> struct  part_col_ref {\n    \n    typedef part_col_ref<PT, PART> this_type;\n    typedef typename std::iterator_traits<PT>::value_type M;\n    typedef M * CPT;\n    typedef typename std::iterator_traits<PT>::reference ref_M;\n    typedef typename select_ref<typename linalg_traits<this_type>\n            ::const_col_iterator, typename linalg_traits<this_type>\n            ::col_iterator, PT>::ref_type iterator;\n    typedef typename linalg_traits<this_type>::value_type value_type;\n    typedef typename linalg_traits<this_type>::reference reference;\n    typedef typename linalg_traits<this_type>::porigin_type porigin_type;\n\n    iterator begin_, end_;\n    porigin_type origin;\n    size_type nr, nc;\n\n    part_col_ref(ref_M m)\n      : begin_(mat_col_begin(m)), end_(mat_col_end(m)),\n\torigin(linalg_origin(m)), nr(mat_nrows(m)), nc(mat_ncols(m)) {}\n\n    part_col_ref(const part_col_ref<CPT, PART> &cr) :\n      begin_(cr.begin_),end_(cr.end_), origin(cr.origin),nr(cr.nr),nc(cr.nc) {}\n\n    reference operator()(size_type i, size_type j) const {\n      return reference(ref_or_value_type<reference>::r(\n\t\t\t\t\t linalg_traits<M>::access(begin_+j, i),\n\t\t\t\t\t PART(), value_type()));\n    }\n  };\n\n  template <typename PT, typename PART>\n  struct linalg_traits<part_col_ref<PT, PART> > {\n    typedef part_col_ref<PT, PART> this_type;\n    typedef typename std::iterator_traits<PT>::value_type M;\n    typedef typename linalg_traits<M>::origin_type origin_type;\n    typedef typename select_ref<const origin_type *, origin_type *,\n\t\t\t        PT>::ref_type porigin_type;\n    typedef typename which_reference<PT>::is_reference is_reference;\n    typedef abstract_matrix linalg_type;\n    typedef typename linalg_traits<M>::value_type vtype;\n    typedef typename number_traits<vtype>::magnitude_type value_type;\n    typedef typename linalg_traits<M>::storage_type storage_type;\n    typedef abstract_null_type sub_row_type;\n    typedef abstract_null_type const_sub_row_type;\n    typedef abstract_null_type row_iterator;\n    typedef abstract_null_type const_row_iterator;\n    typedef typename linalg_traits<M>::const_sub_col_type\n            pre_const_sub_col_type;\n    typedef typename linalg_traits<M>::sub_col_type pre_sub_col_type;\n    typedef part_vector<const pre_const_sub_col_type *, PART>\n            const_sub_col_type;\n    typedef typename select_ref<abstract_null_type,\n\t    part_vector<pre_sub_col_type *, PART>, PT>::ref_type sub_col_type;\n    typedef typename linalg_traits<M>::const_col_iterator const_col_iterator;\n    typedef typename select_ref<abstract_null_type, typename\n            linalg_traits<M>::col_iterator, PT>::ref_type col_iterator;\n    typedef typename select_ref<\n            typename linalg_traits<const_sub_col_type>::reference,\n\t    typename linalg_traits<sub_col_type>::reference,\n\t\t\t\tPT>::ref_type reference;\n    typedef col_major sub_orientation;\n    typedef typename linalg_traits<M>::index_sorted index_sorted;\n    static size_type nrows(const this_type &v) { return v.nr; }\n    static size_type ncols(const this_type &v) { return v.nc; }\n    static const_sub_col_type col(const const_col_iterator &it)\n    { return const_sub_col_type(linalg_traits<M>::col(it)); }\n    static sub_col_type col(const col_iterator &it)\n    { return sub_col_type(linalg_traits<M>::col(it)); }\n    static col_iterator col_begin(this_type &m) { return m.begin_; }\n    static col_iterator col_end(this_type &m) { return m.end_; }\n    static const_col_iterator col_begin(const this_type &m)\n    { return m.begin_; }\n    static const_col_iterator col_end(const this_type &m) { return m.end_; }\n    static origin_type* origin(this_type &v) { return v.origin; }\n    static const origin_type* origin(const this_type &v) { return v.origin; }\n    static void do_clear(this_type &v);\n    static value_type access(const const_col_iterator &itcol, size_type i)\n    { return real_or_imag_part(linalg_traits<M>::access(itcol, i), PART()); }\n    static reference access(const col_iterator &itcol, size_type i) {\n      return reference(ref_or_value_type<reference>::r(\n\t\t\t\t\t linalg_traits<M>::access(itcol, i),\n\t\t\t\t\t PART(), value_type()));\n    }\n  };\n   \n  template <typename PT, typename PART> \n  void linalg_traits<part_col_ref<PT, PART> >::do_clear(this_type &v) { \n    col_iterator it = mat_col_begin(v), ite = mat_col_end(v);\n    for (; it != ite; ++it) clear(col(it));\n  }\n  \n  template<typename PT, typename PART> std::ostream &operator <<\n    (std::ostream &o, const part_col_ref<PT, PART>& m)\n  { gmm::write(o,m); return o; }\n\n  \n\n\n\n\ntemplate <typename TYPE, typename PART, typename PT>\n  struct part_return_ {\n    typedef abstract_null_type return_type;\n  };\n  template <typename PT, typename PART>\n  struct part_return_<row_major, PART, PT> {\n    typedef typename std::iterator_traits<PT>::value_type L;\n    typedef typename select_return<part_row_ref<const L *, PART>,\n\t\t     part_row_ref< L *, PART>, PT>::return_type return_type;\n  };\n  template <typename PT, typename PART>\n  struct part_return_<col_major, PART, PT> {\n    typedef typename std::iterator_traits<PT>::value_type L;\n    typedef typename select_return<part_col_ref<const L *, PART>,\n\t\t     part_col_ref<L *, PART>, PT>::return_type return_type;\n  };\n\n  template <typename PT, typename PART, typename LT> struct part_return__{\n    typedef abstract_null_type return_type;\n  };\n\n  template <typename PT, typename PART>\n  struct part_return__<PT, PART, abstract_matrix> {\n    typedef typename std::iterator_traits<PT>::value_type L;\n    typedef typename part_return_<typename principal_orientation_type<\n      typename linalg_traits<L>::sub_orientation>::potype, PART,\n      PT>::return_type return_type;\n  };\n\n  template <typename PT, typename PART>\n  struct part_return__<PT, PART, abstract_vector> {\n    typedef typename std::iterator_traits<PT>::value_type L;\n    typedef typename select_return<part_vector<const L *, PART>,\n      part_vector<L *, PART>, PT>::return_type return_type;\n  };\n\n  template <typename PT, typename PART> struct part_return {\n    typedef typename std::iterator_traits<PT>::value_type L;\n    typedef typename part_return__<PT, PART,\n      typename linalg_traits<L>::linalg_type>::return_type return_type;\n  };\n\n  template <typename L> inline \n  typename part_return<const L *, linalg_real_part>::return_type\n  real_part(const L &l) {\n    return typename part_return<const L *, linalg_real_part>::return_type\n      (linalg_cast(const_cast<L &>(l)));\n  }\n\n  template <typename L> inline \n  typename part_return<L *, linalg_real_part>::return_type\n  real_part(L &l) {\n    return typename part_return<L *, linalg_real_part>::return_type(linalg_cast(l));\n  }\n\n  template <typename L> inline \n  typename part_return<const L *, linalg_imag_part>::return_type\n  imag_part(const L &l) {\n    return typename part_return<const L *, linalg_imag_part>::return_type\n      (linalg_cast(const_cast<L &>(l)));\n  }\n\n  template <typename L> inline \n  typename part_return<L *, linalg_imag_part>::return_type\n  imag_part(L &l) {\n    return typename part_return<L *, linalg_imag_part>::return_type(linalg_cast(l));\n  }\n\n\n\n}\n\n#endif //  GMM_REAL_PART_H\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_ref.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2000-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n\n#ifndef GMM_REF_H__\n#define GMM_REF_H__\n\n/** @file gmm_ref.h\n   @author  Yves Renard <Yves.Renard@insa-lyon.fr>\n   @date August 26, 2000.\n *  @brief Provide some simple pseudo-containers.\n *  \n *  WARNING : modifiying the container infirm the validity of references.\n */\n\n\n#include <iterator>\n#include \"gmm_except.h\"\n\nnamespace gmm {\n\n  /* ********************************************************************* */\n  /* Simple reference.                                                     */\n  /* ********************************************************************* */\n\n  template<typename ITER> class tab_ref {\n\n    protected :\n\n      ITER begin_, end_;\n\n    public :\n\n      typedef typename std::iterator_traits<ITER>::value_type  value_type;\n      typedef typename std::iterator_traits<ITER>::pointer     pointer;\n      typedef typename std::iterator_traits<ITER>::pointer     const_pointer;\n      typedef typename std::iterator_traits<ITER>::reference   reference;\n      typedef typename std::iterator_traits<ITER>::reference   const_reference;\n      typedef typename std::iterator_traits<ITER>::difference_type\n\t                                                       difference_type;\n      typedef ITER                            iterator;\n      typedef ITER                            const_iterator;\n      typedef std::reverse_iterator<const_iterator> const_reverse_iterator;\n      typedef std::reverse_iterator<iterator> reverse_iterator;\n      typedef size_t size_type;\n    \n      bool empty(void) const { return begin_ == end_; }\n      size_type size(void) const { return end_ - begin_; }\n\n      const iterator &begin(void) { return begin_; }\n      const const_iterator &begin(void) const { return begin_; }\n      const iterator &end(void) { return end_; }\n      const const_iterator &end(void) const { return end_; }\n      reverse_iterator rbegin(void) { return reverse_iterator(end()); }\n      const_reverse_iterator rbegin(void) const\n      { return const_reverse_iterator(end()); }\n      reverse_iterator rend(void) { return reverse_iterator(begin()); }\n      const_reverse_iterator rend(void) const\n      { return const_reverse_iterator(begin()); }\n\n      reference front(void) { return *begin(); }\n      const_reference front(void) const { return *begin(); }\n      reference back(void) { return *(--(end())); }\n      const_reference back(void) const { return *(--(end())); }\n      void pop_front(void) { ++begin_; }\n\n      const_reference operator [](size_type ii) const { return *(begin_ + ii);}\n      reference operator [](size_type ii) { return *(begin_ + ii); }\n\n      tab_ref(void) {}\n      tab_ref(const ITER &b, const ITER &e) : begin_(b), end_(e) {}\n  };\n\n\n  /* ********************************************************************* */\n  /* Reference with index.                                                 */\n  /* ********************************************************************* */\n\n//   template<typename ITER> struct tab_ref_index_iterator_\n//     : public dynamic_array<size_t>::const_iterator\n//   {\n//     typedef typename std::iterator_traits<ITER>::value_type  value_type;\n//     typedef typename std::iterator_traits<ITER>::pointer     pointer;\n//     typedef typename std::iterator_traits<ITER>::reference   reference;\n//     typedef typename std::iterator_traits<ITER>::difference_type  \n//     difference_type;\n//     typedef std::random_access_iterator_tag iterator_category;\n//     typedef size_t size_type;\n//     typedef dynamic_array<size_type>::const_iterator dnas_iterator_;\n//     typedef tab_ref_index_iterator_<ITER> iterator;\n    \n\n//     ITER piter;\n    \n//     iterator operator ++(int)\n//     { iterator tmp = *this; ++(*((dnas_iterator_ *)(this))); return tmp; }\n//     iterator operator --(int)\n//     { iterator tmp = *this; --(*((dnas_iterator_ *)(this))); return tmp; }\n//     iterator &operator ++()\n//     { ++(*((dnas_iterator_ *)(this))); return *this; }\n//     iterator &operator --()\n//     { --(*((dnas_iterator_ *)(this))); return *this; }\n//     iterator &operator +=(difference_type i)\n//     { (*((dnas_iterator_ *)(this))) += i; return *this; }\n//     iterator &operator -=(difference_type i)\n//     { (*((dnas_iterator_ *)(this))) -= i; return *this; }\n//     iterator operator +(difference_type i) const\n//     { iterator it = *this; return (it += i); }\n//     iterator operator -(difference_type i) const\n//     { iterator it = *this; return (it -= i); }\n//     difference_type operator -(const iterator &i) const\n//     { return *((dnas_iterator_ *)(this)) - *((dnas_iterator_ *)(&i)); }\n\t\n//     reference operator *() const\n//     { return *(piter + *((*((dnas_iterator_ *)(this))))); }\n//     reference operator [](int ii)\n//     { return *(piter + *((*((dnas_iterator_ *)(this+ii))))); }\n    \n//     bool operator ==(const iterator &i) const\n//     { \n//       return ((piter) == ((i.piter))\n//        && *((dnas_iterator_ *)(this)) == *((*((dnas_iterator_ *)(this)))));\n//     }\n//     bool operator !=(const iterator &i) const\n//     { return !(i == *this); }\n//     bool operator < (const iterator &i) const\n//     { \n//       return ((piter) == ((i.piter))\n// \t && *((dnas_iterator_ *)(this)) < *((*((dnas_iterator_ *)(this)))));\n//     }\n\n//     tab_ref_index_iterator_(void) {}\n//     tab_ref_index_iterator_(const ITER &iter, const dnas_iterator_ &dnas_iter)\n//       : dnas_iterator_(dnas_iter), piter(iter) {}\n//   };\n\n\n//   template<typename ITER> class tab_ref_index\n//   {\n//     public :\n\n//       typedef typename std::iterator_traits<ITER>::value_type value_type;\n//       typedef typename std::iterator_traits<ITER>::pointer    pointer;\n//       typedef typename std::iterator_traits<ITER>::pointer    const_pointer;\n//       typedef typename std::iterator_traits<ITER>::reference  reference;\n//       typedef typename std::iterator_traits<ITER>::reference  const_reference;\n//       typedef typename std::iterator_traits<ITER>::difference_type\n// \t                                                       difference_type;\n//       typedef size_t size_type; \n//       typedef tab_ref_index_iterator_<ITER> iterator;\n//       typedef iterator                          const_iterator;\n//       typedef std::reverse_iterator<const_iterator> const_reverse_iterator;\n//       typedef std::reverse_iterator<iterator> reverse_iterator;\n    \n//     protected :\n\n//       ITER begin_;\n//       dynamic_array<size_type> index_;\n\n//     public :\n\n//       bool empty(void) const { return index_.empty(); }\n//       size_type size(void) const { return index_.size(); }\n\n\n//       iterator begin(void) { return iterator(begin_, index_.begin()); }\n//       const_iterator begin(void) const\n//       { return iterator(begin_, index_.begin()); }\n//       iterator end(void) { return iterator(begin_, index_.end()); }\n//       const_iterator end(void) const { return iterator(begin_, index_.end()); }\n//       reverse_iterator rbegin(void) { return reverse_iterator(end()); }\n//       const_reverse_iterator rbegin(void) const\n//       { return const_reverse_iterator(end()); }\n//       reverse_iterator rend(void) { return reverse_iterator(begin()); }\n//       const_reverse_iterator rend(void) const\n//       { return const_reverse_iterator(begin()); }\n\n\n//       reference front(void) { return *(begin_ +index_[0]); }\n//       const_reference front(void) const { return *(begin_ +index_[0]); }\n//       reference back(void) { return *(--(end())); }\n//       const_reference back(void) const { return *(--(end())); }\n   \n//       tab_ref_index(void) {}\n//       tab_ref_index(const ITER &b, const dynamic_array<size_type> &ind)\n//       { begin_ = b; index_ = ind; }\n\n//     // to be changed in a const_reference ?\n//       value_type operator [](size_type ii) const\n//       { return *(begin_ + index_[ii]);}\n//       reference operator [](size_type ii) { return *(begin_ + index_[ii]); }\n\n//   };\n\n\n  /// iterator over a gmm::tab_ref_index_ref<ITER,ITER_INDEX>\n  template<typename ITER, typename ITER_INDEX>\n    struct tab_ref_index_ref_iterator_\n    {\n      typedef typename std::iterator_traits<ITER>::value_type value_type;\n      typedef typename std::iterator_traits<ITER>::pointer    pointer;\n      typedef typename std::iterator_traits<ITER>::reference  reference;\n      typedef typename std::iterator_traits<ITER>::difference_type\n                                                              difference_type;\n      typedef std::random_access_iterator_tag iterator_category;\n      typedef tab_ref_index_ref_iterator_<ITER, ITER_INDEX> iterator;\n      typedef size_t size_type;\n\n      ITER piter;\n      ITER_INDEX iter_index;\n      \n      iterator operator ++(int)\n      { iterator tmp = *this; ++iter_index; return tmp; }\n      iterator operator --(int)\n      { iterator tmp = *this; --iter_index; return tmp; }\n      iterator &operator ++() { ++iter_index; return *this; }\n      iterator &operator --() { --iter_index; return *this; }\n      iterator &operator +=(difference_type i)\n      { iter_index += i; return *this; }\n      iterator &operator -=(difference_type i)\n      { iter_index -= i; return *this; }\n      iterator operator +(difference_type i) const\n      { iterator it = *this; return (it += i); }\n      iterator operator -(difference_type i) const\n      { iterator it = *this; return (it -= i); }\n      difference_type operator -(const iterator &i) const\n      { return iter_index - i.iter_index; }\n\t\n      reference operator *() const\n      { return *(piter + *iter_index); }\n      reference operator [](size_type ii) const\n      { return *(piter + *(iter_index+ii)); }\n      \n      bool operator ==(const iterator &i) const\n      { return ((piter) == ((i.piter)) && iter_index == i.iter_index); }\n      bool operator !=(const iterator &i) const { return !(i == *this); }\n      bool operator < (const iterator &i) const\n      { return ((piter) == ((i.piter)) && iter_index < i.iter_index); }\n\n      tab_ref_index_ref_iterator_(void) {}\n      tab_ref_index_ref_iterator_(const ITER &iter, \n\t\t\t\t  const ITER_INDEX &dnas_iter)\n\t: piter(iter), iter_index(dnas_iter) {}\n      \n    };\n\n  /** \n      convenience template function for quick obtention of a indexed iterator\n      without having to specify its (long) typename\n  */\n  template<typename ITER, typename ITER_INDEX>\n  tab_ref_index_ref_iterator_<ITER,ITER_INDEX>\n  index_ref_iterator(ITER it, ITER_INDEX it_i) {\n    return tab_ref_index_ref_iterator_<ITER,ITER_INDEX>(it, it_i);\n  }\n\n  /** indexed array reference (given a container X, and a set of indexes I, \n      this class provides a pseudo-container Y such that\n      @code Y[i] = X[I[i]] @endcode\n  */\n  template<typename ITER, typename ITER_INDEX> class tab_ref_index_ref {\n  public :\n    \n    typedef std::iterator_traits<ITER>            traits_type;\n    typedef typename traits_type::value_type      value_type;\n    typedef typename traits_type::pointer         pointer;\n    typedef typename traits_type::pointer         const_pointer;\n    typedef typename traits_type::reference       reference;\n    typedef typename traits_type::reference       const_reference;\n    typedef typename traits_type::difference_type difference_type;\n    typedef size_t                                size_type;\n    typedef tab_ref_index_ref_iterator_<ITER, ITER_INDEX>   iterator;\n    typedef iterator                              const_iterator;\n    typedef std::reverse_iterator<const_iterator>     const_reverse_iterator;\n    typedef std::reverse_iterator<iterator>           reverse_iterator;\n    \n  protected :\n\n    ITER begin_;\n    ITER_INDEX index_begin_, index_end_;\n\n  public :\n    \n    bool empty(void) const { return index_begin_ == index_end_; }\n    size_type size(void) const { return index_end_ - index_begin_; }\n    \n    iterator begin(void) { return iterator(begin_, index_begin_); }\n    const_iterator begin(void) const\n    { return iterator(begin_, index_begin_); }\n    iterator end(void) { return iterator(begin_, index_end_); }\n    const_iterator end(void) const { return iterator(begin_, index_end_); }\n    reverse_iterator rbegin(void) { return reverse_iterator(end()); }\n    const_reverse_iterator rbegin(void) const\n    { return const_reverse_iterator(end()); }\n    reverse_iterator rend(void) { return reverse_iterator(begin()); }\n    const_reverse_iterator rend(void) const\n    { return const_reverse_iterator(begin()); }\n    \n    reference front(void) { return *(begin_ + *index_begin_); }\n    const_reference front(void) const { return *(begin_ + *index_begin_); }\n    reference back(void) { return *(--(end())); }\n    const_reference back(void) const { return *(--(end())); }\n    void pop_front(void) { ++index_begin_; }\n    \n    tab_ref_index_ref(void) {}\n    tab_ref_index_ref(const ITER &b, const ITER_INDEX &bi,\n\t\t      const ITER_INDEX &ei)\n      : begin_(b), index_begin_(bi), index_end_(ei) {}\n    \n    // to be changed in a const_reference ?\n    const_reference operator [](size_type ii) const\n    { return *(begin_ + index_begin_[ii]);}\n    reference operator [](size_type ii)\n    { return *(begin_ + index_begin_[ii]); }\n\n  };\n\n\n  /* ********************************************************************* */\n  /* Reference on regularly spaced elements.                               */\n  /* ********************************************************************* */\n\n  template<typename ITER> struct tab_ref_reg_spaced_iterator_ {\n    \n    typedef typename std::iterator_traits<ITER>::value_type value_type;\n    typedef typename std::iterator_traits<ITER>::pointer    pointer;\n    typedef typename std::iterator_traits<ITER>::reference  reference;\n    typedef typename std::iterator_traits<ITER>::difference_type\n                                                            difference_type;\n    typedef typename std::iterator_traits<ITER>::iterator_category\n                                                            iterator_category;\n    typedef size_t size_type;\n    typedef tab_ref_reg_spaced_iterator_<ITER> iterator;\n    \n    ITER it;\n    size_type N, i;\n    \n    iterator operator ++(int) { iterator tmp = *this; i++; return tmp; }\n    iterator operator --(int) { iterator tmp = *this; i--; return tmp; }\n    iterator &operator ++()   { i++; return *this; }\n    iterator &operator --()   { i--; return *this; }\n    iterator &operator +=(difference_type ii) { i+=ii; return *this; }\n    iterator &operator -=(difference_type ii) { i-=ii; return *this; }\n    iterator operator +(difference_type ii) const \n    { iterator itt = *this; return (itt += ii); }\n    iterator operator -(difference_type ii) const\n    { iterator itt = *this; return (itt -= ii); }\n    difference_type operator -(const iterator &ii) const\n    { return (N ? (it - ii.it) / N : 0) + i - ii.i; }\n\n    reference operator *() const { return *(it + i*N); }\n    reference operator [](size_type ii) const { return *(it + (i+ii)*N); }\n\n    bool operator ==(const iterator &ii) const\n    { return (*this - ii) == difference_type(0); }\n    bool operator !=(const iterator &ii) const\n    { return  (*this - ii) != difference_type(0); }\n    bool operator < (const iterator &ii) const\n    { return (*this - ii) < difference_type(0); }\n\n    tab_ref_reg_spaced_iterator_(void) {}\n    tab_ref_reg_spaced_iterator_(const ITER &iter, size_type n, size_type ii)\n      : it(iter), N(n), i(ii) { }\n    \n  };\n\n  /** \n      convenience template function for quick obtention of a strided iterator\n      without having to specify its (long) typename\n  */\n  template<typename ITER> tab_ref_reg_spaced_iterator_<ITER> \n  reg_spaced_iterator(ITER it, size_t stride) {\n    return tab_ref_reg_spaced_iterator_<ITER>(it, stride);\n  }\n\n  /**\n     provide a \"strided\" view a of container\n  */\n  template<typename ITER> class tab_ref_reg_spaced {\n  public :\n\n    typedef typename std::iterator_traits<ITER>::value_type value_type;\n    typedef typename std::iterator_traits<ITER>::pointer    pointer;\n    typedef typename std::iterator_traits<ITER>::pointer    const_pointer;\n    typedef typename std::iterator_traits<ITER>::reference  reference;\n    typedef typename std::iterator_traits<ITER>::reference  const_reference;\n    typedef typename std::iterator_traits<ITER>::difference_type\n            difference_type;\n    typedef size_t size_type;\n    typedef tab_ref_reg_spaced_iterator_<ITER> iterator;\n    typedef iterator                          const_iterator;\n    typedef std::reverse_iterator<const_iterator> const_reverse_iterator;\n    typedef std::reverse_iterator<iterator> reverse_iterator;\n    \n  protected :\n\n    ITER begin_;\n    size_type N, size_;\n    \n  public :\n    \n    bool empty(void) const { return size_ == 0; }\n    size_type size(void) const { return size_; }\n    \n    iterator begin(void) { return iterator(begin_, N, 0); }\n    const_iterator begin(void) const { return iterator(begin_, N, 0); }\n    iterator end(void) { return iterator(begin_, N, size_); }\n    const_iterator end(void) const { return iterator(begin_, N, size_); }\n    reverse_iterator rbegin(void) { return reverse_iterator(end()); }\n    const_reverse_iterator rbegin(void) const\n    { return const_reverse_iterator(end()); }\n    reverse_iterator rend(void) { return reverse_iterator(begin()); }\n    const_reverse_iterator rend(void) const\n    { return const_reverse_iterator(begin()); }\n    \n    reference front(void) { return *begin_; }\n    const_reference front(void) const { return *begin_; }\n    reference back(void) { return *(begin_ + N * (size_-1)); }\n    const_reference back(void) const { return *(begin_ + N * (size_-1)); }\n    void pop_front(void) { begin_ += N; }\n    \n    tab_ref_reg_spaced(void) {}\n    tab_ref_reg_spaced(const ITER &b, size_type n, size_type s)\n      : begin_(b), N(n), size_(s) {}\n    \n    \n    const_reference operator [](size_type ii) const\n    { return *(begin_ + ii * N);}\n    reference operator [](size_type ii) { return *(begin_ + ii * N); }\n    \n  };\n\n  /// iterator over a tab_ref_with_selection\n  template<typename ITER, typename COND> \n  struct tab_ref_with_selection_iterator_ : public ITER {\n    typedef typename std::iterator_traits<ITER>::value_type value_type;\n    typedef typename std::iterator_traits<ITER>::pointer    pointer;\n    typedef typename std::iterator_traits<ITER>::reference  reference;\n    typedef typename std::iterator_traits<ITER>::difference_type\n                                                              difference_type;\n    typedef std::forward_iterator_tag iterator_category;\n    typedef tab_ref_with_selection_iterator_<ITER, COND> iterator;\n    const COND cond;\n    \n    void forward(void) { while (!(cond)(*this)) ITER::operator ++(); }\n    iterator &operator ++()\n    { ITER::operator ++(); forward(); return *this; }\n    iterator operator ++(int)\n    { iterator tmp = *this; ++(*this); return tmp; }\n    \n    tab_ref_with_selection_iterator_(void) {}\n    tab_ref_with_selection_iterator_(const ITER &iter, const COND c)\n      : ITER(iter), cond(c) {}\n    \n  };\n\n  /**\n     given a container X and a predicate P, provide pseudo-container Y\n     of all elements of X such that P(X[i]).\n  */\n  template<typename ITER, typename COND> class tab_ref_with_selection {\n    \n  protected :\n    \n    ITER begin_, end_;\n    COND cond;\n    \n  public :\n    \n    typedef typename std::iterator_traits<ITER>::value_type value_type;\n    typedef typename std::iterator_traits<ITER>::pointer    pointer;\n    typedef typename std::iterator_traits<ITER>::pointer    const_pointer;\n    typedef typename std::iterator_traits<ITER>::reference  reference;\n    typedef typename std::iterator_traits<ITER>::reference  const_reference;\n    typedef size_t  size_type;\n    typedef tab_ref_with_selection_iterator_<ITER, COND> iterator;\n    typedef iterator   const_iterator;\n    \n    iterator begin(void) const\n    { iterator it(begin_, cond); it.forward(); return it; }\n    iterator end(void) const { return iterator(end_, cond); }\n    bool empty(void) const { return begin_ == end_; }\n    \n    value_type front(void) const { return *begin(); }\n    void pop_front(void) { ++begin_; begin_ = begin(); }\n    \n    COND &condition(void) { return cond; }\n    const COND &condition(void) const { return cond; }\n    \n    tab_ref_with_selection(void) {}\n    tab_ref_with_selection(const ITER &b, const ITER &e, const COND &c)\n      : begin_(b), end_(e), cond(c) { begin_ = begin(); }\n    \n  };\n\n}\n\n#endif /* GMM_REF_H__  */\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_scaled.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2002-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n/**@file gmm_scaled.h\n   @author  Yves Renard <Yves.Renard@insa-lyon.fr>\n   @date November 10, 2002.\n   @brief get a scaled view of a vector/matrix.\n*/\n#ifndef GMM_SCALED_H__\n#define GMM_SCALED_H__\n\n#include \"gmm_def.h\"\n\nnamespace gmm {\n\n  /* ********************************************************************* */\n  /*\t\tScaled references on vectors            \t\t   */\n  /* ********************************************************************* */\n\n  template <typename IT, typename S> struct scaled_const_iterator {\n    typedef typename strongest_numeric_type<typename std::iterator_traits<IT>::value_type,\n\t\t\t\t\t    S>::T value_type;\n\n    typedef typename std::iterator_traits<IT>::pointer         pointer;\n    typedef typename std::iterator_traits<IT>::reference       reference;\n    typedef typename std::iterator_traits<IT>::difference_type difference_type;\n    typedef typename std::iterator_traits<IT>::iterator_category\n    iterator_category;\n\n    IT it;\n    S r;\n    \n    scaled_const_iterator(void) {}\n    scaled_const_iterator(const IT &i, S x) : it(i), r(x) {}\n    \n    inline size_type index(void) const { return it.index(); }\n    inline scaled_const_iterator operator ++(int)\n    { scaled_const_iterator tmp = *this; ++it; return tmp; }\n    inline scaled_const_iterator operator --(int) \n    { scaled_const_iterator tmp = *this; --it; return tmp; }\n    inline scaled_const_iterator &operator ++() { ++it; return *this; }\n    inline scaled_const_iterator &operator --() { --it; return *this; }\n    inline scaled_const_iterator &operator +=(difference_type i)\n      { it += i; return *this; }\n    inline scaled_const_iterator &operator -=(difference_type i)\n      { it -= i; return *this; }\n    inline scaled_const_iterator operator +(difference_type i) const\n      { scaled_const_iterator itb = *this; return (itb += i); }\n    inline scaled_const_iterator operator -(difference_type i) const\n      { scaled_const_iterator itb = *this; return (itb -= i); }\n    inline difference_type operator -(const scaled_const_iterator &i) const\n      { return difference_type(it - i.it); }\n    \n    inline value_type operator  *() const { return (*it) * value_type(r); }\n    inline value_type operator [](size_type ii) const { return it[ii] * r; }\n    \n    inline bool operator ==(const scaled_const_iterator &i) const\n      { return (i.it == it); }\n    inline bool operator !=(const scaled_const_iterator &i) const\n      { return (i.it != it); }\n    inline bool operator < (const scaled_const_iterator &i) const\n      { return (it < i.it); }\n  };\n\n  template <typename V, typename S> struct scaled_vector_const_ref {\n    typedef scaled_vector_const_ref<V,S> this_type;\n    typedef typename linalg_traits<this_type>::value_type value_type;\n    typedef typename linalg_traits<V>::const_iterator iterator;\n    typedef typename linalg_traits<this_type>::reference reference;\n    typedef typename linalg_traits<this_type>::origin_type origin_type;\n\n    iterator begin_, end_;\n    const origin_type *origin;\n    size_type size_;\n    S r;\n\n    scaled_vector_const_ref(const V &v, S rr)\n      : begin_(vect_const_begin(v)), end_(vect_const_end(v)),\n\torigin(linalg_origin(v)), size_(vect_size(v)), r(rr) {}\n\n    reference operator[](size_type i) const\n    { return value_type(r) * linalg_traits<V>::access(origin, begin_, end_, i); }\n  };\n\n  template <typename V, typename S> struct linalg_traits<scaled_vector_const_ref<V,S> > {\n    typedef scaled_vector_const_ref<V,S> this_type;\n    typedef linalg_const is_reference;\n    typedef abstract_vector linalg_type;\n    typedef typename strongest_numeric_type<S, typename linalg_traits<V>::value_type>::T value_type;\n    typedef typename linalg_traits<V>::origin_type origin_type;\n    typedef value_type reference;\n    typedef abstract_null_type iterator;\n    typedef scaled_const_iterator<typename linalg_traits<V>::const_iterator, S>\n      const_iterator;\n    typedef typename linalg_traits<V>::storage_type storage_type;\n    typedef typename linalg_traits<V>::index_sorted index_sorted;\n    static size_type size(const this_type &v) { return v.size_; }\n    static const_iterator begin(const this_type &v)\n    { return const_iterator(v.begin_, v.r); }\n    static const_iterator end(const this_type &v)\n    { return const_iterator(v.end_, v.r); }\n    static const origin_type* origin(const this_type &v) { return v.origin; }\n    static value_type access(const origin_type *o, const const_iterator &it,\n\t\t\t     const const_iterator &ite, size_type i)\n    { return it.r * (linalg_traits<V>::access(o, it.it, ite.it, i)); }\n\n  };\n\n   template<typename V, typename S> std::ostream &operator <<\n     (std::ostream &o, const scaled_vector_const_ref<V,S>& m)\n  { gmm::write(o,m); return o; }\n\n  /* ********************************************************************* */\n  /*\t\tScaled references on matrices            \t\t   */\n  /* ********************************************************************* */\n\n  template <typename M, typename S> struct scaled_row_const_iterator {\n    typedef scaled_row_const_iterator<M,S> iterator;\n    typedef typename linalg_traits<M>::const_row_iterator ITER;\n    typedef ptrdiff_t difference_type;\n    typedef size_t size_type;\n\n    ITER it;\n    S r;\n\n    inline iterator operator ++(int) { iterator tmp=*this; it++; return tmp; }\n    inline iterator operator --(int) { iterator tmp=*this; it--; return tmp; }\n    inline iterator &operator ++()   { it++; return *this; }\n    inline iterator &operator --()   { it--; return *this; }\n    iterator &operator +=(difference_type i) { it += i; return *this; }\n    iterator &operator -=(difference_type i) { it -= i; return *this; }\n    iterator operator +(difference_type i) const \n    { iterator itt = *this; return (itt += i); }\n    iterator operator -(difference_type i) const\n    { iterator itt = *this; return (itt -= i); }\n    difference_type operator -(const iterator &i) const\n    { return it - i.it; }\n\n    inline ITER operator *() const { return it; }\n    inline ITER operator [](int i) { return it + i; }\n\n    inline bool operator ==(const iterator &i) const { return (it == i.it); }\n    inline bool operator !=(const iterator &i) const { return !(i == *this); }\n    inline bool operator < (const iterator &i) const { return (it < i.it); }\n\n    scaled_row_const_iterator(void) {}\n    scaled_row_const_iterator(const ITER &i, S rr)\n      : it(i), r(rr) { }\n\n  };\n\n  template <typename M, typename S> struct  scaled_row_matrix_const_ref {\n    \n    typedef scaled_row_matrix_const_ref<M,S> this_type;\n    typedef typename linalg_traits<M>::const_row_iterator iterator;\n    typedef typename linalg_traits<this_type>::value_type value_type;\n    typedef typename linalg_traits<this_type>::origin_type origin_type;\n\n    iterator begin_, end_;\n    const origin_type *origin;\n    S r;\n    size_type nr, nc;\n\n    scaled_row_matrix_const_ref(const M &m, S rr)\n      : begin_(mat_row_begin(m)), end_(mat_row_end(m)),\n\torigin(linalg_origin(m)), r(rr), nr(mat_nrows(m)), nc(mat_ncols(m)) {}\n\n    value_type operator()(size_type i, size_type j) const\n    { return r * linalg_traits<M>::access(begin_+i, j); }\n  };\n\n  template <typename M, typename S> struct linalg_traits<scaled_row_matrix_const_ref<M,S> > {\n    typedef scaled_row_matrix_const_ref<M,S> this_type;\n    typedef linalg_const is_reference;\n    typedef abstract_matrix linalg_type;\n    typedef typename linalg_traits<M>::origin_type origin_type;\n    typedef typename strongest_numeric_type<S, typename linalg_traits<M>::value_type>::T value_type;\n    typedef value_type reference;\n    typedef typename linalg_traits<M>::storage_type storage_type;\n    typedef typename linalg_traits<M>::const_sub_row_type vector_type;\n    typedef scaled_vector_const_ref<vector_type,S> sub_row_type;\n    typedef scaled_vector_const_ref<vector_type,S> const_sub_row_type;\n    typedef scaled_row_const_iterator<M,S> row_iterator;\n    typedef scaled_row_const_iterator<M,S> const_row_iterator;\n    typedef abstract_null_type const_sub_col_type;\n    typedef abstract_null_type sub_col_type;\n    typedef abstract_null_type const_col_iterator;\n    typedef abstract_null_type col_iterator;\n    typedef row_major sub_orientation;\n    typedef typename linalg_traits<M>::index_sorted index_sorted;\n    static size_type nrows(const this_type &m)\n    { return m.nr; }\n    static size_type ncols(const this_type &m)\n    { return m.nc; }\n    static const_sub_row_type row(const const_row_iterator &it)\n    { return scaled(linalg_traits<M>::row(it.it), it.r); }\n    static const_row_iterator row_begin(const this_type &m)\n    { return const_row_iterator(m.begin_, m.r); }\n    static const_row_iterator row_end(const this_type &m)\n    { return const_row_iterator(m.end_, m.r); }\n    static const origin_type* origin(const this_type &m) { return m.origin; }\n    static value_type access(const const_row_iterator &it, size_type i)\n    { return it.r * (linalg_traits<M>::access(it.it, i)); }\n  };\n\n  template<typename M, typename S> std::ostream &operator <<\n    (std::ostream &o, const scaled_row_matrix_const_ref<M,S>& m)\n  { gmm::write(o,m); return o; }\n\n\n  template <typename M, typename S> struct scaled_col_const_iterator {\n    typedef scaled_col_const_iterator<M,S> iterator;\n    typedef typename linalg_traits<M>::const_col_iterator ITER;\n    typedef ptrdiff_t difference_type;\n    typedef size_t size_type;\n\n    ITER it;\n    S r;\n\n    iterator operator ++(int) { iterator tmp = *this; it++; return tmp; }\n    iterator operator --(int) { iterator tmp = *this; it--; return tmp; }\n    iterator &operator ++()   { it++; return *this; }\n    iterator &operator --()   { it--; return *this; }\n    iterator &operator +=(difference_type i) { it += i; return *this; }\n    iterator &operator -=(difference_type i) { it -= i; return *this; }\n    iterator operator +(difference_type i) const \n    { iterator itt = *this; return (itt += i); }\n    iterator operator -(difference_type i) const\n    { iterator itt = *this; return (itt -= i); }\n    difference_type operator -(const iterator &i) const\n    { return it - i.it; }\n\n    ITER operator *() const { return it; }\n    ITER operator [](int i) { return it + i; }\n\n    bool operator ==(const iterator &i) const { return (it == i.it); }\n    bool operator !=(const iterator &i) const { return !(i == *this); }\n    bool operator < (const iterator &i) const { return (it < i.it); }\n\n    scaled_col_const_iterator(void) {}\n    scaled_col_const_iterator(const ITER &i, S rr)\n      : it(i), r(rr) { }\n\n  };\n\n  template <typename M, typename S> struct  scaled_col_matrix_const_ref {\n    \n    typedef scaled_col_matrix_const_ref<M,S> this_type;\n    typedef typename linalg_traits<M>::const_col_iterator iterator;\n    typedef typename linalg_traits<this_type>::value_type value_type;\n    typedef typename linalg_traits<this_type>::origin_type origin_type;\n\n    iterator begin_, end_;\n    const origin_type *origin;\n    S r;\n    size_type nr, nc;\n\n    scaled_col_matrix_const_ref(const M &m, S rr)\n      : begin_(mat_col_begin(m)), end_(mat_col_end(m)),\n\torigin(linalg_origin(m)), r(rr), nr(mat_nrows(m)), nc(mat_ncols(m)) {}\n\n    value_type operator()(size_type i, size_type j) const\n    { return r * linalg_traits<M>::access(begin_+j, i); }\n  };\n\n  template <typename M, typename S> struct linalg_traits<scaled_col_matrix_const_ref<M,S> > {\n    typedef scaled_col_matrix_const_ref<M,S> this_type;\n    typedef linalg_const is_reference;\n    typedef abstract_matrix linalg_type;\n    typedef typename strongest_numeric_type<S, typename linalg_traits<M>::value_type>::T value_type;\n    typedef typename linalg_traits<M>::origin_type origin_type;\n    typedef value_type reference;\n    typedef typename linalg_traits<M>::storage_type storage_type;\n    typedef typename linalg_traits<M>::const_sub_col_type vector_type;\n    typedef abstract_null_type sub_col_type;\n    typedef scaled_vector_const_ref<vector_type,S> const_sub_col_type;\n    typedef abstract_null_type  col_iterator;\n    typedef scaled_col_const_iterator<M,S> const_col_iterator;\n    typedef abstract_null_type const_sub_row_type;\n    typedef abstract_null_type sub_row_type;\n    typedef abstract_null_type const_row_iterator;\n    typedef abstract_null_type row_iterator;\n    typedef col_major sub_orientation;\n    typedef typename linalg_traits<M>::index_sorted index_sorted;\n    static size_type ncols(const this_type &m)\n    { return m.nc; }\n    static size_type nrows(const this_type &m)\n    { return m.nr; }\n    static const_sub_col_type col(const const_col_iterator &it)\n    { return scaled(linalg_traits<M>::col(it.it), it.r); }\n    static const_col_iterator col_begin(const this_type &m)\n    { return const_col_iterator(m.begin_, m.r); }\n    static const_col_iterator col_end(const this_type &m)\n    { return const_col_iterator(m.end_, m.r); }\n    static const origin_type* origin(const this_type &m) { return m.origin; }\n    static value_type access(const const_col_iterator &it, size_type i)\n    { return it.r * (linalg_traits<M>::access(it.it, i)); }\n  };\n\n  template<typename M, typename S> std::ostream &operator <<\n    (std::ostream &o, const scaled_col_matrix_const_ref<M,S>& m)\n  { gmm::write(o,m); return o; }\n\n\n  template <typename L, typename S, typename R> struct scaled_return__ {\n    typedef abstract_null_type return_type;\n  };\n  template <typename L, typename S> struct scaled_return__<L, S, row_major> \n  { typedef scaled_row_matrix_const_ref<L,S> return_type; };\n  template <typename L, typename S> struct scaled_return__<L, S, col_major> \n  { typedef scaled_col_matrix_const_ref<L,S> return_type; };\n  \n\n  template <typename L, typename S, typename LT> struct scaled_return_ {\n    typedef abstract_null_type return_type;\n  };\n  template <typename L, typename S> struct scaled_return_<L, S, abstract_vector> \n  { typedef scaled_vector_const_ref<L,S> return_type; };\n  template <typename L, typename S> struct scaled_return_<L, S, abstract_matrix> {\n    typedef typename scaled_return__<L, S, \n      typename principal_orientation_type<typename\n      linalg_traits<L>::sub_orientation>::potype>::return_type return_type;\n  };\n\n  template <typename L, typename S> struct scaled_return {\n    typedef typename scaled_return_<L, S, typename\n      linalg_traits<L>::linalg_type>::return_type return_type;\n  };\n\n  template <typename L, typename S> inline\n  typename scaled_return<L,S>::return_type\n  scaled(const L &v, S x)\n  { return scaled(v, x, typename linalg_traits<L>::linalg_type()); }\n\n  template <typename V, typename S> inline\n  typename scaled_return<V,S>::return_type\n  scaled(const V &v, S x, abstract_vector)\n  { return scaled_vector_const_ref<V,S>(v, x); }\n\n  template <typename M, typename S> inline\n  typename scaled_return<M,S>::return_type\n  scaled(const M &m, S x,abstract_matrix) {\n    return scaled(m, x,  typename principal_orientation_type<typename\n\t\t  linalg_traits<M>::sub_orientation>::potype());\n  }\n\n  template <typename M, typename S> inline\n  typename scaled_return<M,S>::return_type\n  scaled(const M &m, S x, row_major) {\n    return scaled_row_matrix_const_ref<M,S>(m, x);\n  }\n\n  template <typename M, typename S> inline\n  typename scaled_return<M,S>::return_type\n  scaled(const M &m, S x, col_major) {\n    return scaled_col_matrix_const_ref<M,S>(m, x);\n  }\n\n  \n  /* ******************************************************************** */\n  /*\tmatrix or vector scale                                \t          */\n  /* ******************************************************************** */\n\n  template <typename L> inline\n  void scale(L& l, typename linalg_traits<L>::value_type a)\n  { scale(l, a, typename linalg_traits<L>::linalg_type()); }\n\n  template <typename L> inline\n  void scale(const L& l, typename linalg_traits<L>::value_type a)\n  { scale(linalg_const_cast(l), a); }\n\n  template <typename L> inline\n  void scale(L& l, typename linalg_traits<L>::value_type a, abstract_vector) {\n    typename linalg_traits<L>::iterator it = vect_begin(l), ite = vect_end(l);\n    for ( ; it != ite; ++it) *it *= a;\n  }\n\n  template <typename L> \n  void scale(L& l, typename linalg_traits<L>::value_type a, abstract_matrix) {\n    scale(l, a, typename principal_orientation_type<typename\n\t  linalg_traits<L>::sub_orientation>::potype());\n  }\n\n  template <typename L> \n  void scale(L& l, typename linalg_traits<L>::value_type a, row_major) {\n    typename linalg_traits<L>::row_iterator it = mat_row_begin(l),\n      ite = mat_row_end(l);\n    for ( ; it != ite; ++it) scale(linalg_traits<L>::row(it), a);\n  }\n\n  template <typename L> \n  void scale(L& l, typename linalg_traits<L>::value_type a, col_major) {\n    typename linalg_traits<L>::col_iterator it = mat_col_begin(l),\n      ite = mat_col_end(l);\n    for ( ; it != ite; ++it) scale(linalg_traits<L>::col(it), a);\n  }\n\n}\n\n#endif //  GMM_SCALED_H__\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_solver_Schwarz_additive.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2002-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n/**@file gmm_solver_Schwarz_additive.h\n   @author  Yves Renard <Yves.Renard@insa-lyon.fr>\n   @author  Michel Fournie <fournie@mip.ups-tlse.fr>\n   @date October 13, 2002.\n*/\n\n#ifndef GMM_SOLVERS_SCHWARZ_ADDITIVE_H__\n#define GMM_SOLVERS_SCHWARZ_ADDITIVE_H__ \n\n#include \"gmm_kernel.h\"\n#include \"gmm_superlu_interface.h\"\n#include \"gmm_solver_cg.h\"\n#include \"gmm_solver_gmres.h\"\n#include \"gmm_solver_bicgstab.h\"\n#include \"gmm_solver_qmr.h\"\n\nnamespace gmm {\n      \n  /* ******************************************************************** */\n  /*\t\tAdditive Schwarz interfaced local solvers                 */\n  /* ******************************************************************** */\n\n  struct using_cg {};\n  struct using_gmres {};\n  struct using_bicgstab {};\n  struct using_qmr {};\n\n  template <typename P, typename local_solver, typename Matrix>\n  struct actual_precond {\n    typedef P APrecond;\n    static const APrecond &transform(const P &PP) { return PP; }\n  };\n\n  template <typename Matrix1, typename Precond, typename Vector> \n  void AS_local_solve(using_cg, const Matrix1 &A, Vector &x, const Vector &b,\n\t\t const Precond &P, iteration &iter)\n  { cg(A, x, b, P, iter); }\n\n  template <typename Matrix1, typename Precond, typename Vector> \n  void AS_local_solve(using_gmres, const Matrix1 &A, Vector &x,\n\t\t      const Vector &b, const Precond &P, iteration &iter)\n  { gmres(A, x, b, P, 100, iter); }\n  \n  template <typename Matrix1, typename Precond, typename Vector> \n  void AS_local_solve(using_bicgstab, const Matrix1 &A, Vector &x,\n\t\t      const Vector &b, const Precond &P, iteration &iter)\n  { bicgstab(A, x, b, P, iter); }\n\n  template <typename Matrix1, typename Precond, typename Vector> \n  void AS_local_solve(using_qmr, const Matrix1 &A, Vector &x,\n\t\t      const Vector &b, const Precond &P, iteration &iter)\n  { qmr(A, x, b, P, iter); }\n\n#if defined(GMM_USES_SUPERLU)\n  struct using_superlu {};\n\n  template <typename P, typename Matrix>\n  struct actual_precond<P, using_superlu, Matrix> {\n    typedef typename linalg_traits<Matrix>::value_type value_type;\n    typedef SuperLU_factor<value_type> APrecond;\n    template <typename PR>\n    static APrecond transform(const PR &) { return APrecond(); }\n    static const APrecond &transform(const APrecond &PP) { return PP; }\n  };\n\n  template <typename Matrix1, typename Precond, typename Vector> \n  void AS_local_solve(using_superlu, const Matrix1 &, Vector &x,\n\t\t      const Vector &b, const Precond &P, iteration &iter)\n  { P.solve(x, b); iter.set_iteration(1); }\n#endif\n\n  /* ******************************************************************** */\n  /*\t\tAdditive Schwarz Linear system                            */\n  /* ******************************************************************** */\n\n  template <typename Matrix1, typename Matrix2, typename Precond,\n\t    typename local_solver>\n  struct add_schwarz_mat{\n    typedef typename linalg_traits<Matrix1>::value_type value_type;\n\n    const Matrix1 *A;\n    const std::vector<Matrix2> *vB;\n    std::vector<Matrix2> vAloc;\n    mutable iteration iter;\n    double residual;\n    mutable size_type itebilan;\n    mutable std::vector<std::vector<value_type> > gi, fi;\n    std::vector<typename actual_precond<Precond, local_solver,\n\t\t\t\t\tMatrix1>::APrecond> precond1;\n\n    void init(const Matrix1 &A_, const std::vector<Matrix2> &vB_,\n\t      iteration iter_, const Precond &P, double residual_);\n\n    add_schwarz_mat(void) {}\n    add_schwarz_mat(const Matrix1 &A_, const std::vector<Matrix2> &vB_,\n\t\titeration iter_, const Precond &P, double residual_)\n    { init(A_, vB_, iter_, P, residual_); }\n  };\n\n  template <typename Matrix1, typename Matrix2, typename Precond,\n\t    typename local_solver>\n  void add_schwarz_mat<Matrix1, Matrix2, Precond, local_solver>::init(\n       const Matrix1 &A_, const std::vector<Matrix2> &vB_,\n       iteration iter_, const Precond &P, double residual_) {\n\n    vB = &vB_; A = &A_; iter = iter_;\n    residual = residual_;\n    \n    size_type nb_sub = vB->size();\n    vAloc.resize(nb_sub);\n    gi.resize(nb_sub); fi.resize(nb_sub);\n    precond1.resize(nb_sub);\n    std::fill(precond1.begin(), precond1.end(),\n\t      actual_precond<Precond, local_solver, Matrix1>::transform(P));\n    itebilan = 0;\n    \n    if (iter.get_noisy()) cout << \"Init pour sub dom \";\n#ifdef GMM_USES_MPI\n    int size,tranche,borne_sup,borne_inf,rank,tag1=11,tag2=12,tag3=13,sizepr = 0;\n    //    int tab[4];\n    double t_ref,t_final;\n    MPI_Status status;\n    t_ref=MPI_Wtime();\n    MPI_Comm_rank(MPI_COMM_WORLD, &rank);\n    MPI_Comm_size(MPI_COMM_WORLD, &size);\n    tranche=nb_sub/size;\n    borne_inf=rank*tranche;\n    borne_sup=(rank+1)*tranche;\n    // if (rank==size-1) borne_sup = nb_sub;\n\n    cout << \"Nombre de sous domaines \" << borne_sup - borne_inf << endl;\n\n    int sizeA = mat_nrows(*A);\n    gmm::csr_matrix<value_type> Acsr(sizeA, sizeA), Acsrtemp(sizeA, sizeA);\n    gmm::copy(gmm::eff_matrix(*A), Acsr);\n    int next = (rank + 1) % size;\n    int previous = (rank + size - 1) % size;\n    //communication of local information on ring pattern\n    //Each process receive  Nproc-1 contributions \n\n    for (int nproc = 0; nproc < size; ++nproc) {\n       for (size_type i = size_type(borne_inf); i < size_type(borne_sup); ++i) {\n// \tfor (size_type i = 0; i < nb_sub/size; ++i) {\n// \tfor (size_type i = 0; i < nb_sub; ++i) {\n\t// size_type i=(rank+size*(j-1)+nb_sub)%nb_sub;\n\n\tcout << \"Sous domaines \" << i << \" : \" << mat_ncols((*vB)[i]) << endl;\n#else\n\tfor (size_type i = 0; i < nb_sub; ++i) {\n#endif\n\t  \n\t  if (iter.get_noisy()) cout << i << \" \" << std::flush;\n\t  Matrix2 Maux(mat_ncols((*vB)[i]), mat_nrows((*vB)[i]));\n\t  \n#ifdef GMM_USES_MPI\n\t  Matrix2 Maux2(mat_ncols((*vB)[i]), mat_ncols((*vB)[i]));\n\t  if (nproc == 0) {\n\t    gmm::resize(vAloc[i], mat_ncols((*vB)[i]), mat_ncols((*vB)[i]));\n\t    gmm::clear(vAloc[i]);\n\t  }\n\t  gmm::mult(gmm::transposed((*vB)[i]), Acsr, Maux);\n\t  gmm::mult(Maux, (*vB)[i], Maux2);\n\t  gmm::add(Maux2, vAloc[i]);\n#else\n\t  gmm::resize(vAloc[i], mat_ncols((*vB)[i]), mat_ncols((*vB)[i]));\n\t  gmm::mult(gmm::transposed((*vB)[i]), *A, Maux);\n\t  gmm::mult(Maux, (*vB)[i], vAloc[i]);\n#endif\n\n#ifdef GMM_USES_MPI\n\t  if (nproc == size - 1 ) {\n#endif\n\t    precond1[i].build_with(vAloc[i]);\n\t    gmm::resize(fi[i], mat_ncols((*vB)[i]));\n\t    gmm::resize(gi[i], mat_ncols((*vB)[i]));\n#ifdef GMM_USES_MPI\n\t  }\n#else\n\t}\n#endif\n#ifdef GMM_USES_MPI\n     }\n      if (nproc != size - 1) {\n\tMPI_Sendrecv(Acsr.jc, sizeA+1, MPI_INT, next, tag2,\n\t\t     Acsrtemp.jc, sizeA+1,MPI_INT,previous,tag2,\n\t\t     MPI_COMM_WORLD,&status);\n\tif (Acsrtemp.jc[sizeA] > size_type(sizepr)) {\n\t  sizepr = Acsrtemp.jc[sizeA];\n\t  delete[] Acsrtemp.pr; delete[] Acsrtemp.ir;\n\t  Acsrtemp.pr = new value_type[sizepr];\n\t  Acsrtemp.ir = new unsigned int[sizepr];\n\t}\n\tMPI_Sendrecv(Acsr.ir, Acsr.jc[sizeA], MPI_INT, next, tag1,\n\t\t     Acsrtemp.ir, Acsrtemp.jc[sizeA],MPI_INT,previous,tag1,\n\t\t     MPI_COMM_WORLD,&status);\n\t\n\tMPI_Sendrecv(Acsr.pr, Acsr.jc[sizeA], mpi_type(value_type()), next, tag3, \n\t\t     Acsrtemp.pr, Acsrtemp.jc[sizeA],mpi_type(value_type()),previous,tag3,\n\t\t     MPI_COMM_WORLD,&status);\n\tgmm::copy(Acsrtemp, Acsr);\n      }\n    }\n      t_final=MPI_Wtime();\n    cout<<\"temps boucle precond \"<< t_final-t_ref<<endl;\n#endif\n    if (iter.get_noisy()) cout << \"\\n\";\n  }\n  \n  template <typename Matrix1, typename Matrix2, typename Precond,\n\t    typename Vector2, typename Vector3, typename local_solver>\n  void mult(const add_schwarz_mat<Matrix1, Matrix2, Precond, local_solver> &M,\n\t    const Vector2 &p, Vector3 &q) {\n    size_type itebilan = 0;\n#ifdef GMM_USES_MPI\n    static double tmult_tot = 0.0;\n    double t_ref = MPI_Wtime();\n#endif\n    // cout << \"tmult AS begin \" << endl;\n    mult(*(M.A), p, q);\n#ifdef GMM_USES_MPI\n    tmult_tot += MPI_Wtime()-t_ref;\n    cout << \"tmult_tot = \" << tmult_tot << endl;\n#endif\n    std::vector<double> qbis(gmm::vect_size(q));\n    std::vector<double> qter(gmm::vect_size(q));\n#ifdef GMM_USES_MPI\n    //    MPI_Status status;\n    //    MPI_Request request,request1;\n    //    int tag=111;\n    int size,tranche,borne_sup,borne_inf,rank;\n    size_type nb_sub=M.fi.size();\n    MPI_Comm_rank(MPI_COMM_WORLD, &rank);\n    MPI_Comm_size(MPI_COMM_WORLD, &size);\n    tranche=nb_sub/size;\n    borne_inf=rank*tranche;\n    borne_sup=(rank+1)*tranche;\n    // if (rank==size-1) borne_sup=nb_sub;\n    //    int next = (rank + 1) % size;\n    //    int previous = (rank + size - 1) % size;\n    t_ref = MPI_Wtime();\n     for (size_type i = size_type(borne_inf); i < size_type(borne_sup); ++i)\n//        for (size_type i = 0; i < nb_sub/size; ++i)\n      // for (size_type j = 0; j < nb_sub; ++j)\n#else\n    for (size_type i = 0; i < M.fi.size(); ++i)\n#endif\n      {\n#ifdef GMM_USES_MPI\n\t// size_type i=j; // (rank+size*(j-1)+nb_sub)%nb_sub;\n#endif\n\tgmm::mult(gmm::transposed((*(M.vB))[i]), q, M.fi[i]);\n       M.iter.init();\n       AS_local_solve(local_solver(), (M.vAloc)[i], (M.gi)[i],\n\t\t      (M.fi)[i],(M.precond1)[i],M.iter);\n       itebilan = std::max(itebilan, M.iter.get_iteration());\n       }\n\n#ifdef GMM_USES_MPI\n    cout << \"First  AS loop time \" <<  MPI_Wtime() - t_ref << endl;\n#endif\n\n    gmm::clear(q);\n#ifdef GMM_USES_MPI\n    t_ref = MPI_Wtime();\n    // for (size_type j = 0; j < nb_sub; ++j)\n    for (size_type i = size_type(borne_inf); i < size_type(borne_sup); ++i)\n\n#else\n      for (size_type i = 0; i < M.gi.size(); ++i)\n#endif\n\t{\n\n#ifdef GMM_USES_MPI\n\t  // size_type i=j; // (rank+size*(j-1)+nb_sub)%nb_sub;\n// \t  gmm::mult((*(M.vB))[i], M.gi[i], qbis,qbis);\n\t  gmm::mult((*(M.vB))[i], M.gi[i], qter);\n\t  add(qter,qbis,qbis);\n#else\n\t  gmm::mult((*(M.vB))[i], M.gi[i], q, q);\n#endif\n\t}\n#ifdef GMM_USES_MPI\n     //WARNING this add only if you use the ring pattern below\n  // need to do this below if using a n explicit ring pattern communication\n\n//      add(qbis,q,q);\n    cout << \"Second AS loop time \" <<  MPI_Wtime() - t_ref << endl;\n#endif\n\n\n#ifdef GMM_USES_MPI\n    //    int tag1=11;\n    static double t_tot = 0.0;\n    double t_final;\n    t_ref=MPI_Wtime();\n//     int next = (rank + 1) % size;\n//     int previous = (rank + size - 1) % size;\n    //communication of local information on ring pattern\n    //Each process receive  Nproc-1 contributions \n\n//     if (size > 1) {\n//     for (int nproc = 0; nproc < size-1; ++nproc) \n//       {\n\n// \tMPI_Sendrecv(&(qbis[0]), gmm::vect_size(q), MPI_DOUBLE, next, tag1,\n// \t\t   &(qter[0]), gmm::vect_size(q),MPI_DOUBLE,previous,tag1,\n// \t\t   MPI_COMM_WORLD,&status);\n// \tgmm::copy(qter, qbis);\n// \tadd(qbis,q,q);\n//       }\n//     }\n    MPI_Allreduce(&(qbis[0]), &(q[0]),gmm::vect_size(q), MPI_DOUBLE,\n\t\t  MPI_SUM,MPI_COMM_WORLD);\n    t_final=MPI_Wtime();\n    t_tot += t_final-t_ref;\n     cout<<\"[\"<< rank<<\"] temps reduce Resol \"<< t_final-t_ref << \" t_tot = \" << t_tot << endl;\n#endif \n\n    if (M.iter.get_noisy() > 0) cout << \"itebloc = \" << itebilan << endl;\n    M.itebilan += itebilan;\n    M.iter.set_resmax((M.iter.get_resmax() + M.residual) * 0.5);\n  }\n\n  template <typename Matrix1, typename Matrix2, typename Precond,\n\t    typename Vector2, typename Vector3, typename local_solver>\n  void mult(const add_schwarz_mat<Matrix1, Matrix2, Precond, local_solver> &M,\n\t    const Vector2 &p, const Vector3 &q) {\n    mult(M, p, const_cast<Vector3 &>(q));\n  }\n\n  template <typename Matrix1, typename Matrix2, typename Precond,\n\t    typename Vector2, typename Vector3, typename Vector4,\n\t    typename local_solver>\n  void mult(const add_schwarz_mat<Matrix1, Matrix2, Precond, local_solver> &M,\n\t    const Vector2 &p, const Vector3 &p2, Vector4 &q)\n  { mult(M, p, q); add(p2, q); }\n\n  template <typename Matrix1, typename Matrix2, typename Precond,\n\t    typename Vector2, typename Vector3, typename Vector4,\n\t    typename local_solver>\n  void mult(const add_schwarz_mat<Matrix1, Matrix2, Precond, local_solver> &M,\n\t    const Vector2 &p, const Vector3 &p2, const Vector4 &q)\n  { mult(M, p, const_cast<Vector4 &>(q)); add(p2, q); }\n\n  /* ******************************************************************** */\n  /*\t\tAdditive Schwarz interfaced global solvers                */\n  /* ******************************************************************** */\n\n  template <typename ASM_type, typename Vect>\n  void AS_global_solve(using_cg, const ASM_type &ASM, Vect &x,\n\t\t       const Vect &b, iteration &iter)\n  { cg(ASM, x, b, *(ASM.A), identity_matrix(), iter); }\n\n  template <typename ASM_type, typename Vect>\n  void AS_global_solve(using_gmres, const ASM_type &ASM, Vect &x,\n\t\t       const Vect &b, iteration &iter)\n  { gmres(ASM, x, b, identity_matrix(), 100, iter); }\n\n  template <typename ASM_type, typename Vect>\n  void AS_global_solve(using_bicgstab, const ASM_type &ASM, Vect &x,\n\t\t       const Vect &b, iteration &iter)\n  { bicgstab(ASM, x, b, identity_matrix(), iter); }\n\n  template <typename ASM_type, typename Vect>\n  void AS_global_solve(using_qmr,const ASM_type &ASM, Vect &x,\n\t\t       const Vect &b, iteration &iter)\n  { qmr(ASM, x, b, identity_matrix(), iter); }\n\n#if defined(GMM_USES_SUPERLU)\n  template <typename ASM_type, typename Vect>\n  void AS_global_solve(using_superlu, const ASM_type &, Vect &,\n\t\t       const Vect &, iteration &) {\n    GMM_ASSERT1(false, \"You cannot use SuperLU as \"\n\t\t\"global solver in additive Schwarz meethod\");\n  }\n#endif\n  \n  /* ******************************************************************** */\n  /*\t            Linear Additive Schwarz method                        */\n  /* ******************************************************************** */\n  /* ref : Domain decomposition algorithms for the p-version finite       */\n  /*       element method for elliptic problems, Luca F. Pavarino,        */\n  /*       PhD thesis, Courant Institute of Mathematical Sciences, 1992.  */\n  /* ******************************************************************** */\n\n  /** Function to call if the ASM matrix is precomputed for successive solve\n   * with the same system.\n   */\n  template <typename Matrix1, typename Matrix2,\n\t    typename Vector2, typename Vector3, typename Precond,\n\t    typename local_solver, typename global_solver>\n  void additive_schwarz(\n    add_schwarz_mat<Matrix1, Matrix2, Precond, local_solver> &ASM, Vector3 &u,\n    const Vector2 &f, iteration &iter, const global_solver&) {\n\n    typedef typename linalg_traits<Matrix1>::value_type value_type;\n\n    size_type nb_sub = ASM.vB->size(), nb_dof = gmm::vect_size(f);\n    ASM.itebilan = 0;\n    std::vector<value_type> g(nb_dof);\n    std::vector<value_type> gbis(nb_dof);\n#ifdef GMM_USES_MPI\n    double t_init=MPI_Wtime();\n    int size,tranche,borne_sup,borne_inf,rank;\n    MPI_Comm_rank(MPI_COMM_WORLD, &rank);\n    MPI_Comm_size(MPI_COMM_WORLD, &size);\n    tranche=nb_sub/size;\n    borne_inf=rank*tranche;\n    borne_sup=(rank+1)*tranche;\n    // if (rank==size-1) borne_sup=nb_sub*size;\n    for (size_type i = size_type(borne_inf); i < size_type(borne_sup); ++i)\n//     for (size_type i = 0; i < nb_sub/size; ++i)\n      // for (size_type j = 0; j < nb_sub; ++j)\n      // for (size_type i = rank; i < nb_sub; i+=size)\n#else\n    for (size_type i = 0; i < nb_sub; ++i)\n#endif\n    {\n\n#ifdef GMM_USES_MPI\n      // size_type i=j; // (rank+size*(j-1)+nb_sub)%nb_sub;\n#endif\n      gmm::mult(gmm::transposed((*(ASM.vB))[i]), f, ASM.fi[i]);\n      ASM.iter.init();\n      AS_local_solve(local_solver(), ASM.vAloc[i], ASM.gi[i], ASM.fi[i],\n\t\t     ASM.precond1[i], ASM.iter);\n      ASM.itebilan = std::max(ASM.itebilan, ASM.iter.get_iteration());\n#ifdef GMM_USES_MPI\n    gmm::mult((*(ASM.vB))[i], ASM.gi[i], gbis,gbis);\n#else   \n    gmm::mult((*(ASM.vB))[i], ASM.gi[i], g, g);\n#endif\n    }\n#ifdef GMM_USES_MPI\n    cout<<\"temps boucle init \"<< MPI_Wtime()-t_init<<endl;\n    double t_ref,t_final;\n    t_ref=MPI_Wtime();\n    MPI_Allreduce(&(gbis[0]), &(g[0]),gmm::vect_size(g), MPI_DOUBLE,\n\t\t  MPI_SUM,MPI_COMM_WORLD);\n    t_final=MPI_Wtime();\n    cout<<\"temps reduce init \"<< t_final-t_ref<<endl;\n#endif\n#ifdef GMM_USES_MPI\n    t_ref=MPI_Wtime();\n    cout<<\"begin global AS\"<<endl;\n#endif\n    AS_global_solve(global_solver(), ASM, u, g, iter);\n#ifdef GMM_USES_MPI\n    t_final=MPI_Wtime();\n    cout<<\"temps AS Global Solve \"<< t_final-t_ref<<endl;\n#endif\n    if (iter.get_noisy())\n      cout << \"Total number of internal iterations : \" << ASM.itebilan << endl;\n  }\n\n  /** Global function. Compute the ASM matrix and call the previous function.\n   *  The ASM matrix represent the preconditionned linear system.\n   */\n  template <typename Matrix1, typename Matrix2,\n\t    typename Vector2, typename Vector3, typename Precond,\n\t    typename local_solver, typename global_solver>\n  void additive_schwarz(const Matrix1 &A, Vector3 &u,\n\t\t\t\t  const Vector2 &f, const Precond &P,\n\t\t\t\t  const std::vector<Matrix2> &vB,\n\t\t\t\t  iteration &iter, local_solver,\n\t\t\t\t  global_solver) {\n    iter.set_rhsnorm(vect_norm2(f));\n    if (iter.get_rhsnorm() == 0.0) { gmm::clear(u); return; }\n    iteration iter2 = iter; iter2.reduce_noisy();\n    iter2.set_maxiter(size_type(-1));\n    add_schwarz_mat<Matrix1, Matrix2, Precond, local_solver>\n      ASM(A, vB, iter2, P, iter.get_resmax());\n    additive_schwarz(ASM, u, f, iter, global_solver());\n  }\n\n  /* ******************************************************************** */\n  /*\t\tSequential Non-Linear Additive Schwarz method             */\n  /* ******************************************************************** */\n  /* ref : Nonlinearly Preconditionned Inexact Newton Algorithms,         */\n  /*       Xiao-Chuan Cai, David E. Keyes,                                */\n  /*       SIAM J. Sci. Comp. 24: p183-200.  l                             */\n  /* ******************************************************************** */\n\n  template <typename Matrixt, typename MatrixBi> \n  class NewtonAS_struct {\n    \n  public :\n    typedef Matrixt tangent_matrix_type;\n    typedef MatrixBi B_matrix_type;\n    typedef typename linalg_traits<Matrixt>::value_type value_type;\n    typedef std::vector<value_type> Vector;\n    \n    virtual size_type size(void) = 0;\n    virtual const std::vector<MatrixBi> &get_vB() = 0;\n    \n    virtual void compute_F(Vector &f, Vector &x) = 0;\n    virtual void compute_tangent_matrix(Matrixt &M, Vector &x) = 0;\n    // compute Bi^T grad(F(X)) Bi\n    virtual void compute_sub_tangent_matrix(Matrixt &Mloc, Vector &x,\n\t\t\t\t\t    size_type i) = 0;\n    // compute Bi^T F(X)\n    virtual void compute_sub_F(Vector &fi, Vector &x, size_type i) = 0;\n\n    virtual ~NewtonAS_struct() {}\n  };\n\n  template <typename Matrixt, typename MatrixBi> \n  struct AS_exact_gradient {\n    const std::vector<MatrixBi> &vB;\n    std::vector<Matrixt> vM;\n    std::vector<Matrixt> vMloc;\n\n    void init(void) {\n      for (size_type i = 0; i < vB.size(); ++i) {\n\tMatrixt aux(gmm::mat_ncols(vB[i]), gmm::mat_ncols(vM[i]));\n\tgmm::resize(vMloc[i], gmm::mat_ncols(vB[i]), gmm::mat_ncols(vB[i]));\n\tgmm::mult(gmm::transposed(vB[i]), vM[i], aux);\n\tgmm::mult(aux, vB[i], vMloc[i]);\n      }\n    }\n    AS_exact_gradient(const std::vector<MatrixBi> &vB_) : vB(vB_) {\n      vM.resize(vB.size()); vMloc.resize(vB.size());\n      for (size_type i = 0; i < vB.size(); ++i) {\n\tgmm::resize(vM[i], gmm::mat_nrows(vB[i]), gmm::mat_nrows(vB[i]));\n      }\n    }\n  };\n\n  template <typename Matrixt, typename MatrixBi,\n\t    typename Vector2, typename Vector3>\n  void mult(const AS_exact_gradient<Matrixt, MatrixBi> &M,\n\t    const Vector2 &p, Vector3 &q) {\n    gmm::clear(q);\n    typedef typename gmm::linalg_traits<Vector3>::value_type T;\n    std::vector<T> v(gmm::vect_size(p)), w, x;\n    for (size_type i = 0; i < M.vB.size(); ++i) {\n      w.resize(gmm::mat_ncols(M.vB[i]));\n      x.resize(gmm::mat_ncols(M.vB[i]));\n      gmm::mult(M.vM[i], p, v);\n      gmm::mult(gmm::transposed(M.vB[i]), v, w);\n      double rcond;\n      SuperLU_solve(M.vMloc[i], x, w, rcond);\n      // gmm::iteration iter(1E-10, 0, 100000);\n      //gmm::gmres(M.vMloc[i], x, w, gmm::identity_matrix(), 50, iter);\n      gmm::mult_add(M.vB[i], x, q);\n    }\n  }\n\n  template <typename Matrixt, typename MatrixBi,\n\t    typename Vector2, typename Vector3>\n  void mult(const AS_exact_gradient<Matrixt, MatrixBi> &M,\n\t    const Vector2 &p, const Vector3 &q) {\n    mult(M, p, const_cast<Vector3 &>(q));\n  }\n\n  template <typename Matrixt, typename MatrixBi,\n\t    typename Vector2, typename Vector3, typename Vector4>\n  void mult(const AS_exact_gradient<Matrixt, MatrixBi> &M,\n\t    const Vector2 &p, const Vector3 &p2, Vector4 &q)\n  { mult(M, p, q); add(p2, q); }\n\n  template <typename Matrixt, typename MatrixBi,\n\t    typename Vector2, typename Vector3, typename Vector4>\n  void mult(const AS_exact_gradient<Matrixt, MatrixBi> &M,\n\t    const Vector2 &p, const Vector3 &p2, const Vector4 &q)\n  { mult(M, p, const_cast<Vector4 &>(q)); add(p2, q); }\n\n  struct S_default_newton_line_search {\n    \n    double conv_alpha, conv_r;\n    size_t it, itmax, glob_it;\n\n    double alpha, alpha_old, alpha_mult, first_res, alpha_max_ratio;\n    double alpha_min_ratio, alpha_min;\n    size_type count, count_pat;\n    bool max_ratio_reached;\n    double alpha_max_ratio_reached, r_max_ratio_reached;\n    size_type it_max_ratio_reached;\n\n    \n    double converged_value(void) { return conv_alpha; };\n    double converged_residual(void) { return conv_r; };\n\n    virtual void init_search(double r, size_t git, double = 0.0) {\n      alpha_min_ratio = 0.9;\n      alpha_min = 1e-10;\n      alpha_max_ratio = 10.0;\n      alpha_mult = 0.25;\n      itmax = size_type(-1);\n      glob_it = git; if (git <= 1) count_pat = 0;\n      conv_alpha = alpha = alpha_old = 1.;\n      conv_r = first_res = r; it = 0;\n      count = 0;\n      max_ratio_reached = false;\n    }\n    virtual double next_try(void) {\n      alpha_old = alpha;\n      if (alpha >= 0.4) alpha *= 0.5; else alpha *= alpha_mult; ++it;\n      return alpha_old;\n    }\n    virtual bool is_converged(double r, double = 0.0) {\n      // cout << \"r = \" << r << \" alpha = \" << alpha / alpha_mult << \" count_pat = \" << count_pat << endl;\n      if (!max_ratio_reached && r < first_res * alpha_max_ratio) {\n\talpha_max_ratio_reached = alpha_old; r_max_ratio_reached = r;\n\tit_max_ratio_reached = it; max_ratio_reached = true; \n      }\n      if (max_ratio_reached && r < r_max_ratio_reached * 0.5\n\t  && r > first_res * 1.1 && it <= it_max_ratio_reached+1) {\n\talpha_max_ratio_reached = alpha_old; r_max_ratio_reached = r;\n\tit_max_ratio_reached = it;\n      }\n      if (count == 0 || r < conv_r)\n\t{ conv_r = r; conv_alpha = alpha_old; count = 1; }\n      if (conv_r < first_res) ++count;\n\n      if (r < first_res *  alpha_min_ratio)\n\t{ count_pat = 0.; return true; }      \n      if (count >= 5 || (alpha < alpha_min && max_ratio_reached)) {\n\tif (conv_r < first_res * 0.99) count_pat = 0;\n\tif (/*gmm::random() * 50. < -log(conv_alpha)-4.0 ||*/ count_pat >= 3)\n\t  { conv_r=r_max_ratio_reached; conv_alpha=alpha_max_ratio_reached; }\n\tif (conv_r >= first_res * 0.9999) count_pat++;\n\treturn true;\n      }\n      return false;\n    }\n    S_default_newton_line_search(void) { count_pat = 0; }\n  };\n\n\n  \n  template <typename Matrixt, typename MatrixBi, typename Vector,\n\t    typename Precond, typename local_solver, typename global_solver>\n  void Newton_additive_Schwarz(NewtonAS_struct<Matrixt, MatrixBi> &NS,\n\t\t\t       const Vector &u_,\n\t\t\t       iteration &iter, const Precond &P,\n\t\t\t       local_solver, global_solver) {\n    Vector &u = const_cast<Vector &>(u_);\n    typedef typename linalg_traits<Vector>::value_type value_type;\n    typedef typename number_traits<value_type>::magnitude_type mtype;\n    typedef actual_precond<Precond, local_solver, Matrixt> chgt_precond;\n    \n    double residual = iter.get_resmax();\n\n    S_default_newton_line_search internal_ls;\n    S_default_newton_line_search external_ls;\n\n    typename chgt_precond::APrecond PP = chgt_precond::transform(P);\n    iter.set_rhsnorm(mtype(1));\n    iteration iternc(iter);\n    iternc.reduce_noisy(); iternc.set_maxiter(size_type(-1));\n    iteration iter2(iternc);\n    iteration iter3(iter2); iter3.reduce_noisy();\n    iteration iter4(iter3);\n    iternc.set_name(\"Local Newton\");\n    iter2.set_name(\"Linear System for Global Newton\");\n    iternc.set_resmax(residual/100.0);\n    iter3.set_resmax(residual/10000.0);\n    iter2.set_resmax(residual/1000.0);\n    iter4.set_resmax(residual/1000.0);\n    std::vector<value_type> rhs(NS.size()), x(NS.size()), d(NS.size());\n    std::vector<value_type> xi, xii, fi, di;\n\n    std::vector< std::vector<value_type> > vx(NS.get_vB().size());\n    for (size_type i = 0; i < NS.get_vB().size(); ++i) // for exact gradient\n      vx[i].resize(NS.size()); // for exact gradient\n\n    Matrixt Mloc, M(NS.size(), NS.size());\n    NS.compute_F(rhs, u);\n    mtype act_res=gmm::vect_norm2(rhs), act_res_new(0), precond_res = act_res;\n    mtype alpha;\n    \n    while(!iter.finished(std::min(act_res, precond_res))) {\n      for (int SOR_step = 0;  SOR_step >= 0; --SOR_step) {\n\tgmm::clear(rhs);\n\tfor (size_type isd = 0; isd < NS.get_vB().size(); ++isd) {\n\t  const MatrixBi &Bi = (NS.get_vB())[isd];\n\t  size_type si = mat_ncols(Bi);\n\t  gmm::resize(Mloc, si, si);\n\t  xi.resize(si); xii.resize(si); fi.resize(si); di.resize(si);\n\t  \n\t  iternc.init();\n\t  iternc.set_maxiter(30); // ?\n\t  if (iternc.get_noisy())\n\t    cout << \"Non-linear local problem \" << isd << endl;\n\t  gmm::clear(xi);\n\t  gmm::copy(u, x);\n\t  NS.compute_sub_F(fi, x, isd); gmm::scale(fi, value_type(-1));\n\t  mtype r = gmm::vect_norm2(fi), r_t(r);\n\t  if (r > value_type(0)) {\n\t    iternc.set_rhsnorm(std::max(r, mtype(1)));\n\t    while(!iternc.finished(r)) {\n\t      NS.compute_sub_tangent_matrix(Mloc, x, isd);\n\n\t      PP.build_with(Mloc);\n\t      iter3.init();\n\t      AS_local_solve(local_solver(), Mloc, di, fi, PP, iter3);\n\t      \n\t      internal_ls.init_search(r, iternc.get_iteration());\n\t      do {\n\t\talpha = internal_ls.next_try();\n\t\tgmm::add(xi, gmm::scaled(di, -alpha), xii);\n\t\tgmm::mult(Bi, gmm::scaled(xii, -1.0), u, x);\n\t\tNS.compute_sub_F(fi, x, isd); gmm::scale(fi, value_type(-1));\n\t\tr_t = gmm::vect_norm2(fi);\n\t      } while (!internal_ls.is_converged(r_t));\n\t      \n\t      if (alpha != internal_ls.converged_value()) {\n\t\talpha = internal_ls.converged_value();\n\t\tgmm::add(xi, gmm::scaled(di, -alpha), xii);\n\t\tgmm::mult(Bi, gmm::scaled(xii, -1.0), u, x);\n\t\tNS.compute_sub_F(fi, x, isd); gmm::scale(fi, value_type(-1));\n\t\tr_t = gmm::vect_norm2(fi);\n\t      }\n\t      gmm::copy(x, vx[isd]); // for exact gradient\n\n\t      if (iternc.get_noisy()) cout << \"(step=\" << alpha << \")\\t\";\n\t      ++iternc; r = r_t; gmm::copy(xii, xi); \n\t    }\n\t    if (SOR_step) gmm::mult(Bi, gmm::scaled(xii, -1.0), u, u);\n\t    gmm::mult(Bi, gmm::scaled(xii, -1.0), rhs, rhs);\n\t  }\n\t}\n\tprecond_res = gmm::vect_norm2(rhs);\n\tif (SOR_step) cout << \"SOR step residual = \" << precond_res << endl;\n\tif (precond_res < residual) break;\n\tcout << \"Precond residual = \" << precond_res << endl;\n      }\n\n      iter2.init();\n      // solving linear system for the global Newton method\n      if (0) {\n\tNS.compute_tangent_matrix(M, u);\n\tadd_schwarz_mat<Matrixt, MatrixBi, Precond, local_solver>\n\t  ASM(M, NS.get_vB(), iter4, P, iter.get_resmax());\n\tAS_global_solve(global_solver(), ASM, d, rhs, iter2);\n      }\n      else {  // for exact gradient\n\tAS_exact_gradient<Matrixt, MatrixBi> eg(NS.get_vB());\n\tfor (size_type i = 0; i < NS.get_vB().size(); ++i) {\n\t  NS.compute_tangent_matrix(eg.vM[i], vx[i]);\n\t}\n\teg.init();\n\tgmres(eg, d, rhs, gmm::identity_matrix(), 50, iter2);\n      }\n\n      //      gmm::add(gmm::scaled(rhs, 0.1), u); ++iter;\n      external_ls.init_search(act_res, iter.get_iteration());\n      do {\n\talpha = external_ls.next_try();\n\tgmm::add(gmm::scaled(d, alpha), u, x);\n\tNS.compute_F(rhs, x);\n\tact_res_new = gmm::vect_norm2(rhs);\n      } while (!external_ls.is_converged(act_res_new));\n      \n      if (alpha != external_ls.converged_value()) {\n\talpha = external_ls.converged_value();\n\tgmm::add(gmm::scaled(d, alpha), u, x);\n\tNS.compute_F(rhs, x);\n\tact_res_new = gmm::vect_norm2(rhs);\n      }\n\n      if (iter.get_noisy() > 1) cout << endl;\n      act_res = act_res_new; \n      if (iter.get_noisy()) cout << \"(step=\" << alpha << \")\\t unprecond res = \" << act_res << \" \";\n      \n      \n      ++iter; gmm::copy(x, u);\n    }\n  }\n\n}\n\n\n#endif //  GMM_SOLVERS_SCHWARZ_ADDITIVE_H__\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_solver_bfgs.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2004-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n/**@file gmm_solver_bfgs.h \n   @author  Yves Renard <Yves.Renard@insa-lyon.fr>\n   @date October 14 2004.\n   @brief Implements BFGS (Broyden, Fletcher, Goldfarb, Shanno) algorithm.\n */\n#ifndef GMM_BFGS_H\n#define GMM_BFGS_H\n\n#include \"gmm_kernel.h\"\n#include \"gmm_iter.h\"\n\nnamespace gmm {\n\n  // BFGS algorithm (Broyden, Fletcher, Goldfarb, Shanno)\n  // Quasi Newton method for optimization problems.\n  // with Wolfe Line search.\n\n\n  // delta[k] = x[k+1] - x[k]\n  // gamma[k] = grad f(x[k+1]) - grad f(x[k])\n  // H[0] = I\n  // BFGS : zeta[k] = delta[k] - H[k] gamma[k]\n  // DFP  : zeta[k] = H[k] gamma[k]\n  // tau[k] = gamma[k]^T zeta[k]\n  // rho[k] = 1 / gamma[k]^T delta[k]\n  // BFGS : H[k+1] = H[k] + rho[k](zeta[k] delta[k]^T + delta[k] zeta[k]^T)\n  //                 - rho[k]^2 tau[k] delta[k] delta[k]^T\n  // DFP  : H[k+1] = H[k] + rho[k] delta[k] delta[k]^T \n  //                 - (1/tau[k])zeta[k] zeta[k]^T \n\n  // Object representing the inverse of the Hessian\n  template <typename VECTOR> struct bfgs_invhessian {\n    \n    typedef typename linalg_traits<VECTOR>::value_type T;\n    typedef typename number_traits<T>::magnitude_type R;\n\n    std::vector<VECTOR> delta, gamma, zeta;\n    std::vector<T> tau, rho;\n    int version;\n\n    template<typename VEC1, typename VEC2> void hmult(const VEC1 &X, VEC2 &Y) {\n      copy(X, Y);\n      for (size_type k = 0 ; k < delta.size(); ++k) {\n\tT xdelta = vect_sp(X, delta[k]), xzeta = vect_sp(X, zeta[k]);\n\tswitch (version) {\n\tcase 0 : // BFGS\n\t  add(scaled(zeta[k], rho[k]*xdelta), Y);\n\t  add(scaled(delta[k], rho[k]*(xzeta-rho[k]*tau[k]*xdelta)), Y);\n\t  break;\n\tcase 1 : // DFP\n\t  add(scaled(delta[k], rho[k]*xdelta), Y);\n\t  add(scaled(zeta[k], -xzeta/tau[k]), Y);\n\t  break;\n\t}\n      }\n    }\n    \n    void restart(void) {\n      delta.resize(0); gamma.resize(0); zeta.resize(0); \n      tau.resize(0); rho.resize(0);\n    }\n    \n    template<typename VECT1, typename VECT2>\n    void update(const VECT1 &deltak, const VECT2 &gammak) {\n      size_type N = vect_size(deltak), k = delta.size();\n      VECTOR Y(N);\n      hmult(gammak, Y);\n      delta.resize(k+1); gamma.resize(k+1); zeta.resize(k+1);\n      tau.resize(k+1); rho.resize(k+1);\n      resize(delta[k], N); resize(gamma[k], N); resize(zeta[k], N); \n      gmm::copy(deltak, delta[k]);\n      gmm::copy(gammak, gamma[k]);\n      rho[k] = R(1) / vect_sp(deltak, gammak);\n      if (version == 0)\n\tadd(delta[k], scaled(Y, -1), zeta[k]);\n      else\n\tgmm::copy(Y, zeta[k]);\n      tau[k] = vect_sp(gammak,  zeta[k]);\n    }\n    \n    bfgs_invhessian(int v = 0) { version = v; }\n  };\n\n\n  template <typename FUNCTION, typename DERIVATIVE, typename VECTOR> \n  void bfgs(FUNCTION f, DERIVATIVE grad, VECTOR &x,\n\t    int restart, iteration& iter, int version = 0,\n\t    double lambda_init=0.001, double print_norm=1.0) {\n\n    typedef typename linalg_traits<VECTOR>::value_type T;\n    typedef typename number_traits<T>::magnitude_type R;\n    \n    bfgs_invhessian<VECTOR> invhessian(version);\n    VECTOR r(vect_size(x)), d(vect_size(x)), y(vect_size(x)), r2(vect_size(x));\n    grad(x, r);\n    R lambda = lambda_init, valx = f(x), valy;\n    int nb_restart(0);\n    \n    if (iter.get_noisy() >= 1) cout << \"value \" << valx / print_norm << \" \";\n    while (! iter.finished_vect(r)) {\n\n      invhessian.hmult(r, d); gmm::scale(d, T(-1));\n      \n      // Wolfe Line search\n      R derivative = gmm::vect_sp(r, d);    \n      R lambda_min(0), lambda_max(0), m1 = 0.27, m2 = 0.57;\n      bool unbounded = true, blocked = false, grad_computed = false;\n      \n      for(;;) {\n\tadd(x, scaled(d, lambda), y);\n\tvaly = f(y);\n\tif (iter.get_noisy() >= 2) {\n\t  cout.precision(15);\n\t  cout << \"Wolfe line search, lambda = \" << lambda \n \t       << \" value = \" << valy /print_norm << endl;\n// \t       << \" derivative = \" << derivative\n// \t       << \" lambda min = \" << lambda_min << \" lambda max = \"\n// \t       << lambda_max << endl; getchar();\n\t}\n\tif (valy <= valx + m1 * lambda * derivative) {\n\t  grad(y, r2); grad_computed = true;\n\t  T derivative2 = gmm::vect_sp(r2, d);\n\t  if (derivative2 >= m2*derivative) break;\n\t  lambda_min = lambda;\n\t}\n\telse {\n\t  lambda_max = lambda;\n\t  unbounded = false;\n\t}\n\tif (unbounded) lambda *= R(10);\n\telse  lambda = (lambda_max + lambda_min) / R(2);\n\tif (lambda == lambda_max || lambda == lambda_min) break;\n\t// valy <= R(2)*valx replaced by\n\t// valy <= valx + gmm::abs(derivative)*lambda_init\n\t// for compatibility with negative values (08.24.07).\n\tif (valy <= valx + R(2)*gmm::abs(derivative)*lambda &&\n\t    (lambda < R(lambda_init*1E-8) ||\n\t     (!unbounded && lambda_max-lambda_min < R(lambda_init*1E-8))))\n\t{ blocked = true; lambda = lambda_init; break; }\n      }\n\n      // Rank two update\n      ++iter;\n      if (!grad_computed) grad(y, r2);\n      gmm::add(scaled(r2, -1), r);\n      if (iter.get_iteration() % restart == 0 || blocked) { \n\tif (iter.get_noisy() >= 1) cout << \"Restart\\n\";\n\tinvhessian.restart();\n\tif (++nb_restart > 10) {\n\t  if (iter.get_noisy() >= 1) cout << \"BFGS is blocked, exiting\\n\";\n\t  return;\n\t}\n      }\n      else {\n\tinvhessian.update(gmm::scaled(d,lambda), gmm::scaled(r,-1));\n\tnb_restart = 0;\n      }\n      copy(r2, r); copy(y, x); valx = valy;\n      if (iter.get_noisy() >= 1)\n\tcout << \"BFGS value \" << valx/print_norm << \"\\t\";\n    }\n\n  }\n\n\n  template <typename FUNCTION, typename DERIVATIVE, typename VECTOR> \n  inline void dfp(FUNCTION f, DERIVATIVE grad, VECTOR &x,\n\t    int restart, iteration& iter, int version = 1) {\n    bfgs(f, grad, x, restart, iter, version);\n\n  }\n\n\n}\n\n#endif \n\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_solver_bicgstab.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2002-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n// This file is a modified version of bicgstab.h from ITL.\n// See http://osl.iu.edu/research/itl/\n// Following the corresponding Copyright notice.\n//===========================================================================\n//\n// Copyright (c) 1998-2001, University of Notre Dame. All rights reserved.\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are met:\n//\n//    * Redistributions of source code must retain the above copyright\n//      notice, this list of conditions and the following disclaimer.\n//    * Redistributions in binary form must reproduce the above copyright\n//      notice, this list of conditions and the following disclaimer in the\n//      documentation and/or other materials provided with the distribution.\n//    * Neither the name of the University of Notre Dame nor the\n//      names of its contributors may be used to endorse or promote products\n//      derived from this software without specific prior written permission.\n//\n// THIS SOFTWARE  IS  PROVIDED  BY  THE TRUSTEES  OF  INDIANA UNIVERSITY  AND\n// CONTRIBUTORS  ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,  INCLUDING,\n// BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND  FITNESS\n// FOR  A PARTICULAR PURPOSE ARE DISCLAIMED. IN  NO  EVENT SHALL THE TRUSTEES\n// OF INDIANA UNIVERSITY AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY,  OR CONSEQUENTIAL DAMAGES (INCLUDING,  BUT\n// NOT  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA,  OR PROFITS;  OR BUSINESS  INTERRUPTION)  HOWEVER  CAUSED AND ON ANY\n// THEORY  OF  LIABILITY,  WHETHER  IN  CONTRACT,  STRICT  LIABILITY, OR TORT\n// (INCLUDING  NEGLIGENCE  OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n// THIS  SOFTWARE,  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n//===========================================================================\n\n/**@file gmm_solver_bicgstab.h\n   @author Andrew Lumsdaine <lums@osl.iu.edu>\n   @author Lie-Quan Lee <llee@osl.iu.edu>\n   @author  Yves Renard <Yves.Renard@insa-lyon.fr>\n   @date October 13, 2002.\n   @brief BiCGStab iterative solver.\n*/\n\n#ifndef GMM_SOLVER_BICGSTAB_H__\n#define GMM_SOLVER_BICGSTAB_H__\n\n#include \"gmm_kernel.h\"\n#include \"gmm_iter.h\"\n\nnamespace gmm {\n\n  /* ******************************************************************** */\n  /*\t\tBiConjugate Gradient Stabilized               \t\t  */\n  /* (preconditionned, with parametrable scalar product)        \t  */\n  /* ******************************************************************** */\n\n  template <typename Matrix, typename Vector, typename VectorB,\n\t    typename Preconditioner>\n  void bicgstab(const Matrix& A, Vector& x, const VectorB& b,\n\t       const Preconditioner& M, iteration &iter) {\n\n    typedef typename linalg_traits<Vector>::value_type T;\n    typedef typename number_traits<T>::magnitude_type R;\n    typedef typename temporary_dense_vector<Vector>::vector_type temp_vector;\n    \n    T rho_1, rho_2(0), alpha(0), beta, omega(0);\n    temp_vector p(vect_size(x)), phat(vect_size(x)), s(vect_size(x)),\n      shat(vect_size(x)), \n      t(vect_size(x)), v(vect_size(x)), r(vect_size(x)), rtilde(vect_size(x));\n    \n    gmm::mult(A, gmm::scaled(x, -T(1)), b, r);\t  \n    gmm::copy(r, rtilde);\n    R norm_r = gmm::vect_norm2(r);\n    iter.set_rhsnorm(gmm::vect_norm2(b));\n\n    if (iter.get_rhsnorm() == 0.0) { clear(x); return; }\n    \n    while (!iter.finished(norm_r)) {\n      \n      rho_1 = gmm::vect_sp(rtilde, r);\n      if (rho_1 == T(0)) {\n\tif (iter.get_maxiter() == size_type(-1)) \n\t  { GMM_ASSERT1(false, \"Bicgstab failed to converge\"); }\n\telse { GMM_WARNING1(\"Bicgstab failed to converge\"); return; }\n      }\n      \n      if (iter.first())\n\tgmm::copy(r, p);\n      else {\n\tif (omega == T(0)) {\n\t  if (iter.get_maxiter() == size_type(-1))\n\t    { GMM_ASSERT1(false, \"Bicgstab failed to converge\"); }\n\t  else { GMM_WARNING1(\"Bicgstab failed to converge\"); return; }\n\t}\n\t\n\tbeta = (rho_1 / rho_2) * (alpha / omega);\n\t\n\tgmm::add(gmm::scaled(v, -omega), p);\n\tgmm::add(r, gmm::scaled(p, beta), p);      \n      }\n      gmm::mult(M, p, phat);\n      gmm::mult(A, phat, v);\t\n      alpha = rho_1 / gmm::vect_sp(v, rtilde);\n      gmm::add(r, gmm::scaled(v, -alpha), s);\n      \n      if (iter.finished_vect(s)) \n\t{ gmm::add(gmm::scaled(phat, alpha), x); break; }\n      \n      gmm::mult(M, s, shat);\t\n      gmm::mult(A, shat, t);\n      omega = gmm::vect_sp(t, s) / gmm::vect_norm2_sqr(t);\n      \n      gmm::add(gmm::scaled(phat, alpha), x); \n      gmm::add(gmm::scaled(shat, omega), x);\n      gmm::add(s, gmm::scaled(t, -omega), r); \n      norm_r = gmm::vect_norm2(r);\n      rho_2 = rho_1;\n      \n      ++iter;\n    }\n  }\n  \n  template <typename Matrix, typename Vector, typename VectorB,\n\t    typename Preconditioner>\n  void bicgstab(const Matrix& A, const Vector& x, const VectorB& b,\n\t       const Preconditioner& M, iteration &iter)\n  { bicgstab(A, linalg_const_cast(x), b, M, iter); }\n  \n}\n\n\n#endif //  GMM_SOLVER_BICGSTAB_H__\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_solver_cg.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2002-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n// This file is a modified version of cg.h from ITL.\n// See http://osl.iu.edu/research/itl/\n// Following the corresponding Copyright notice.\n//===========================================================================\n//\n// Copyright (c) 1998-2001, University of Notre Dame. All rights reserved.\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are met:\n//\n//    * Redistributions of source code must retain the above copyright\n//      notice, this list of conditions and the following disclaimer.\n//    * Redistributions in binary form must reproduce the above copyright\n//      notice, this list of conditions and the following disclaimer in the\n//      documentation and/or other materials provided with the distribution.\n//    * Neither the name of the University of Notre Dame nor the\n//      names of its contributors may be used to endorse or promote products\n//      derived from this software without specific prior written permission.\n//\n// THIS SOFTWARE  IS  PROVIDED  BY  THE TRUSTEES  OF  INDIANA UNIVERSITY  AND\n// CONTRIBUTORS  ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,  INCLUDING,\n// BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND  FITNESS\n// FOR  A PARTICULAR PURPOSE ARE DISCLAIMED. IN  NO  EVENT SHALL THE TRUSTEES\n// OF INDIANA UNIVERSITY AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY,  OR CONSEQUENTIAL DAMAGES (INCLUDING,  BUT\n// NOT  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA,  OR PROFITS;  OR BUSINESS  INTERRUPTION)  HOWEVER  CAUSED AND ON ANY\n// THEORY  OF  LIABILITY,  WHETHER  IN  CONTRACT,  STRICT  LIABILITY, OR TORT\n// (INCLUDING  NEGLIGENCE  OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n// THIS  SOFTWARE,  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n//===========================================================================\n\n/**@file gmm_solver_cg.h\n   @author  Andrew Lumsdaine <lums@osl.iu.edu>\n   @author  Lie-Quan Lee <llee@osl.iu.edu>\n   @author  Yves Renard <Yves.Renard@insa-lyon.fr>\n   @date October 13, 2002.\n   @brief Conjugate gradient iterative solver. \n*/\n#ifndef GMM_SOLVER_CG_H__\n#define GMM_SOLVER_CG_H__\n\n#include \"gmm_kernel.h\"\n#include \"gmm_iter.h\"\n\nnamespace gmm {\n\n  /* ******************************************************************** */\n  /*\t\tconjugate gradient                           \t\t  */\n  /* (preconditionned, with parametrable additional scalar product)       */\n  /* ******************************************************************** */\n\n  template <typename Matrix, typename Matps, typename Precond, \n            typename Vector1, typename Vector2>\n  void cg(const Matrix& A, Vector1& x, const Vector2& b, const Matps& PS,\n\t  const Precond &P, iteration &iter) {\n\n    typedef typename temporary_dense_vector<Vector1>::vector_type temp_vector;\n    typedef typename linalg_traits<Vector1>::value_type T;\n\n    T rho, rho_1(0), a;\n    temp_vector p(vect_size(x)), q(vect_size(x)), r(vect_size(x)),\n      z(vect_size(x));\n    iter.set_rhsnorm(gmm::sqrt(gmm::abs(vect_hp(PS, b, b))));\n\n    if (iter.get_rhsnorm() == 0.0)\n      clear(x);\n    else {\n      mult(A, scaled(x, T(-1)), b, r);\n      mult(P, r, z);\n      rho = vect_hp(PS, z, r);\n      copy(z, p);\n\n      while (!iter.finished_vect(r)) {\n\n\tif (!iter.first()) { \n\t  mult(P, r, z);\n\t  rho = vect_hp(PS, z, r);\n\t  add(z, scaled(p, rho / rho_1), p);\n\t}\n\tmult(A, p, q);\n\n\ta = rho / vect_hp(PS, q, p);\t\n\tadd(scaled(p, a), x);\n\tadd(scaled(q, -a), r);\n\trho_1 = rho;\n\n\t++iter;\n      }\n    }\n  }\n\n  template <typename Matrix, typename Matps, typename Precond, \n            typename Vector1, typename Vector2>\n  void cg(const Matrix& A, Vector1& x, const Vector2& b, const Matps& PS,\n\t  const gmm::identity_matrix &, iteration &iter) {\n\n    typedef typename temporary_dense_vector<Vector1>::vector_type temp_vector;\n    typedef typename linalg_traits<Vector1>::value_type T;\n\n    T rho, rho_1(0), a;\n    temp_vector p(vect_size(x)), q(vect_size(x)), r(vect_size(x));\n    iter.set_rhsnorm(gmm::sqrt(gmm::abs(vect_hp(PS, b, b))));\n\n    if (iter.get_rhsnorm() == 0.0)\n      clear(x);\n    else {\n      mult(A, scaled(x, T(-1)), b, r);\n      rho = vect_hp(PS, r, r);\n      copy(r, p);\n\n      while (!iter.finished_vect(r)) {\n\n\tif (!iter.first()) { \n\t  rho = vect_hp(PS, r, r);\n\t  add(r, scaled(p, rho / rho_1), p);\n\t}\t\n\tmult(A, p, q);\n\ta = rho / vect_hp(PS, q, p);\t\n\tadd(scaled(p, a), x);\n\tadd(scaled(q, -a), r);\n\trho_1 = rho;\n\t++iter;\n      }\n    }\n  }\n\n  template <typename Matrix, typename Matps, typename Precond, \n            typename Vector1, typename Vector2> inline \n  void cg(const Matrix& A, const Vector1& x, const Vector2& b, const Matps& PS,\n\t const Precond &P, iteration &iter)\n  { cg(A, linalg_const_cast(x), b, PS, P, iter); }\n\n  template <typename Matrix, typename Precond, \n            typename Vector1, typename Vector2> inline\n  void cg(const Matrix& A, Vector1& x, const Vector2& b,\n\t const Precond &P, iteration &iter)\n  { cg(A, x , b, identity_matrix(), P, iter); }\n\n  template <typename Matrix, typename Precond, \n            typename Vector1, typename Vector2> inline\n  void cg(const Matrix& A, const Vector1& x, const Vector2& b,\n\t const Precond &P, iteration &iter)\n  { cg(A, x , b , identity_matrix(), P , iter); }\n\n}\n\n\n#endif //  GMM_SOLVER_CG_H__\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_solver_constrained_cg.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2002-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n/**@file gmm_solver_constrained_cg.h\n   @author  Yves Renard <Yves.Renard@insa-lyon.fr>\n   @date October 13, 2002.\n   @brief Constrained conjugate gradient. */\n//  preconditionning does not work\n\n#ifndef GMM_SOLVER_CCG_H__\n#define GMM_SOLVER_CCG_H__\n\n#include \"gmm_kernel.h\"\n#include \"gmm_iter.h\"\n\nnamespace gmm {\n\n  template <typename CMatrix, typename CINVMatrix, typename Matps,\n\t    typename VectorX>\n  void pseudo_inverse(const CMatrix &C, CINVMatrix &CINV,\n\t\t      const Matps& /* PS */, VectorX&) {\n    // compute the pseudo inverse of the non-square matrix C such\n    // CINV = inv(C * trans(C)) * C.\n    // based on a conjugate gradient method.\n    \n    // optimisable : copie de la ligne, precalcul de C * trans(C).\n    \n    typedef VectorX TmpVec;\n    typedef typename linalg_traits<VectorX>::value_type value_type;\n    \n    size_type nr = mat_nrows(C), nc = mat_ncols(C);\n    \n    TmpVec d(nr), e(nr), l(nc), p(nr), q(nr), r(nr);\n    value_type rho, rho_1, alpha;\n    clear(d);\n    clear(CINV);\n    \n    for (size_type i = 0; i < nr; ++i) {\n      d[i] = 1.0; rho = 1.0;\n      clear(e);\n      copy(d, r);\n      copy(d, p);\n      \n      while (rho >= 1E-38) { /* conjugate gradient to compute e             */\n\t                     /* which is the i nd row of inv(C * trans(C))  */\n\tmult(gmm::transposed(C), p, l);\n\tmult(C, l, q);\t  \n\talpha = rho / vect_sp(p, q);\n\tadd(scaled(p, alpha), e);  \n\tadd(scaled(q, -alpha), r); \n\trho_1 = rho;\n\trho = vect_sp(r, r);\n\tadd(r, scaled(p, rho / rho_1), p);\n      }\n      \n      mult(transposed(C), e, l); /* l is the i nd row of CINV     */\n      // cout << \"l = \" << l << endl;\n      clean(l, 1E-15);\n      copy(l, mat_row(CINV, i));\n      \n      d[i] = 0.0;\n    }\n  }\n  \n  /** Compute the minimum of @f$ 1/2((Ax).x) - bx @f$ under the contraint @f$ Cx <= f @f$ */\n  template < typename Matrix,  typename CMatrix, typename Matps,\n\t     typename VectorX, typename VectorB, typename VectorF,\n\t     typename Preconditioner >\n  void constrained_cg(const Matrix& A, const CMatrix& C, VectorX& x,\n\t\t      const VectorB& b, const VectorF& f,const Matps& PS,\n\t\t      const Preconditioner& M, iteration &iter) {\n    typedef typename temporary_dense_vector<VectorX>::vector_type TmpVec;\n    typedef typename temporary_vector<CMatrix>::vector_type TmpCVec;\n    typedef row_matrix<TmpCVec> TmpCmat;\n    \n    typedef typename linalg_traits<VectorX>::value_type value_type;\n    value_type rho = 1.0, rho_1, lambda, gamma;\n    TmpVec p(vect_size(x)), q(vect_size(x)), q2(vect_size(x)),\n      r(vect_size(x)), old_z(vect_size(x)), z(vect_size(x)),\n      memox(vect_size(x));\n    std::vector<bool> satured(mat_nrows(C));\n    clear(p);\n    iter.set_rhsnorm(sqrt(vect_sp(PS, b, b)));\n    if (iter.get_rhsnorm() == 0.0) iter.set_rhsnorm(1.0);\n   \n    TmpCmat CINV(mat_nrows(C), mat_ncols(C));\n    pseudo_inverse(C, CINV, PS, x);\n    \n    while(true) {\n      // computation of residu\n      copy(z, old_z);\n      copy(x, memox);\n      mult(A, scaled(x, -1.0), b, r);\n      mult(M, r, z); // preconditionner not coherent\n      bool transition = false;\n      for (size_type i = 0; i < mat_nrows(C); ++i) {\n\tvalue_type al = vect_sp(mat_row(C, i), x) - f[i];\n\tif (al >= -1.0E-15) {\n\t  if (!satured[i]) { satured[i] = true; transition = true; }\n\t  value_type bb = vect_sp(mat_row(CINV, i), z);\n\t  if (bb > 0.0) add(scaled(mat_row(C, i), -bb), z);\n\t}\n\telse\n\t  satured[i] = false;\n      }\n    \n      // descent direction\n      rho_1 = rho; rho = vect_sp(PS, r, z); // ...\n      \n      if (iter.finished(rho)) break;\n      \n      if (iter.get_noisy() > 0 && transition) std::cout << \"transition\\n\";\n      if (transition || iter.first()) gamma = 0.0;\n      else gamma = std::max(0.0, (rho - vect_sp(PS, old_z, z) ) / rho_1);\n      // std::cout << \"gamma = \" << gamma << endl;\n      // itl::add(r, itl::scaled(p, gamma), p);\n      add(z, scaled(p, gamma), p); // ...\n      \n      ++iter;\n      // one dimensionnal optimization\n      mult(A, p, q);\n      lambda = rho / vect_sp(PS, q, p);\n      for (size_type i = 0; i < mat_nrows(C); ++i)\n\tif (!satured[i]) {\n\t  value_type bb = vect_sp(mat_row(C, i), p) - f[i];\n\t  if (bb > 0.0)\n\t    lambda = std::min(lambda, (f[i]-vect_sp(mat_row(C, i), x)) / bb);\n\t}\n      add(x, scaled(p, lambda), x);\n      add(memox, scaled(x, -1.0), memox);\n      \n    }\n  }\n  \n}\n\n#endif //  GMM_SOLVER_CCG_H__\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_solver_gmres.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2002-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n// This file is a modified version of gmres.h from ITL.\n// See http://osl.iu.edu/research/itl/\n// Following the corresponding Copyright notice.\n//===========================================================================\n//\n// Copyright (c) 1998-2001, University of Notre Dame. All rights reserved.\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are met:\n//\n//    * Redistributions of source code must retain the above copyright\n//      notice, this list of conditions and the following disclaimer.\n//    * Redistributions in binary form must reproduce the above copyright\n//      notice, this list of conditions and the following disclaimer in the\n//      documentation and/or other materials provided with the distribution.\n//    * Neither the name of the University of Notre Dame nor the\n//      names of its contributors may be used to endorse or promote products\n//      derived from this software without specific prior written permission.\n//\n// THIS SOFTWARE  IS  PROVIDED  BY  THE TRUSTEES  OF  INDIANA UNIVERSITY  AND\n// CONTRIBUTORS  ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,  INCLUDING,\n// BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND  FITNESS\n// FOR  A PARTICULAR PURPOSE ARE DISCLAIMED. IN  NO  EVENT SHALL THE TRUSTEES\n// OF INDIANA UNIVERSITY AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY,  OR CONSEQUENTIAL DAMAGES (INCLUDING,  BUT\n// NOT  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA,  OR PROFITS;  OR BUSINESS  INTERRUPTION)  HOWEVER  CAUSED AND ON ANY\n// THEORY  OF  LIABILITY,  WHETHER  IN  CONTRACT,  STRICT  LIABILITY, OR TORT\n// (INCLUDING  NEGLIGENCE  OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n// THIS  SOFTWARE,  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n//===========================================================================\n\n/**@file gmm_solver_gmres.h\n   @author  Andrew Lumsdaine <lums@osl.iu.edu>\n   @author  Lie-Quan Lee     <llee@osl.iu.edu>\n   @author  Yves Renard <Yves.Renard@insa-lyon.fr>\n   @date October 13, 2002.\n   @brief GMRES (Generalized Minimum Residual) iterative solver.\n*/\n#ifndef GMM_KRYLOV_GMRES_H\n#define GMM_KRYLOV_GMRES_H\n\n#include \"gmm_kernel.h\"\n#include \"gmm_iter.h\"\n#include \"gmm_modified_gram_schmidt.h\"\n\nnamespace gmm {\n\n  /** Generalized Minimum Residual\n   \n      This solve the unsymmetric linear system Ax = b using restarted GMRES.\n      \n      See: Y. Saad and M. Schulter. GMRES: A generalized minimum residual\n      algorithm for solving nonsysmmetric linear systems, SIAM\n      J. Sci. Statist. Comp.  7(1986), pp, 856-869\n  */\n  template <typename Mat, typename Vec, typename VecB, typename Precond,\n\t    typename Basis >\n  void gmres(const Mat &A, Vec &x, const VecB &b, const Precond &M,\n\t     int restart, iteration &outer, Basis& KS) {\n\n    typedef typename linalg_traits<Vec>::value_type T;\n    typedef typename number_traits<T>::magnitude_type R;\n\n    std::vector<T> w(vect_size(x)), r(vect_size(x)), u(vect_size(x));\n    std::vector<T> c_rot(restart+1), s_rot(restart+1), s(restart+1);\n    gmm::dense_matrix<T> H(restart+1, restart);\n#ifdef GMM_USES_MPI\n      double t_ref, t_prec = MPI_Wtime(), t_tot = 0;\n      static double tmult_tot = 0.0;\nt_ref = MPI_Wtime();\n    cout << \"GMRES \" << endl;\n#endif\n    mult(M,b,r);\n    outer.set_rhsnorm(gmm::vect_norm2(r));\n    if (outer.get_rhsnorm() == 0.0) { clear(x); return; }\n    \n    mult(A, scaled(x, T(-1)), b, w);\n    mult(M, w, r);\n    R beta = gmm::vect_norm2(r), beta_old = beta;\n    int blocked = 0;\n\n    iteration inner = outer;\n    inner.reduce_noisy();\n    inner.set_maxiter(restart);\n    inner.set_name(\"GMRes inner\");\n\n    while (! outer.finished(beta)) {\n      \n      gmm::copy(gmm::scaled(r, R(1)/beta), KS[0]);\n      gmm::clear(s);\n      s[0] = beta;\n      \n      size_type i = 0; inner.init();\n      \n      do {\n\tmult(A, KS[i], u);\n\tmult(M, u, KS[i+1]);\n\torthogonalize(KS, mat_col(H, i), i);\n\tR a = gmm::vect_norm2(KS[i+1]);\n\tH(i+1, i) = T(a);\n\tgmm::scale(KS[i+1], T(1) / a);\n\tfor (size_type k = 0; k < i; ++k)\n\t  Apply_Givens_rotation_left(H(k,i), H(k+1,i), c_rot[k], s_rot[k]);\n\t\n\tGivens_rotation(H(i,i), H(i+1,i), c_rot[i], s_rot[i]);\n\tApply_Givens_rotation_left(H(i,i), H(i+1,i), c_rot[i], s_rot[i]);\n\tApply_Givens_rotation_left(s[i], s[i+1], c_rot[i], s_rot[i]);\n\t\n\t++inner, ++outer, ++i;\n      } while (! inner.finished(gmm::abs(s[i])));\n\n      upper_tri_solve(H, s, i, false);\n      combine(KS, s, x, i);\n      mult(A, gmm::scaled(x, T(-1)), b, w);\n      mult(M, w, r);\n      beta_old = std::min(beta, beta_old); beta = gmm::vect_norm2(r);\n      if (int(inner.get_iteration()) < restart -1 || beta_old <= beta)\n\t++blocked; else blocked = 0;\n      if (blocked > 10) {\n\tif (outer.get_noisy()) cout << \"Gmres is blocked, exiting\\n\";\n\tbreak;\n      }\n#ifdef GMM_USES_MPI\n\tt_tot = MPI_Wtime() - t_ref;\n\tcout << \"temps GMRES : \" << t_tot << endl; \n#endif\n    }\n  }\n\n\n  template <typename Mat, typename Vec, typename VecB, typename Precond >\n  void gmres(const Mat &A, Vec &x, const VecB &b,\n\t     const Precond &M, int restart, iteration& outer) {\n    typedef typename linalg_traits<Vec>::value_type T;\n    modified_gram_schmidt<T> orth(restart, vect_size(x));\n    gmres(A, x, b, M, restart, outer, orth); \n  }\n\n}\n\n#endif\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_solver_idgmres.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2003-2012 Yves Renard, Caroline Lecalvez\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n/**@file gmm_solver_idgmres.h\n   @author  Caroline Lecalvez <Caroline.Lecalvez@gmm.insa-tlse.fr>\n   @author  Yves Renard <Yves.Renard@insa-lyon.fr>\n   @date October 6, 2003.\n   @brief Implicitly restarted and deflated Generalized Minimum Residual.\n*/\n#ifndef GMM_IDGMRES_H\n#define GMM_IDGMRES_H\n\n#include \"gmm_kernel.h\"\n#include \"gmm_iter.h\"\n#include \"gmm_dense_sylvester.h\"\n\nnamespace gmm {\n\n  template <typename T> compare_vp {\n    bool operator()(const std::pair<T, size_type> &a,\n\t\t    const std::pair<T, size_type> &b) const\n    { return (gmm::abs(a.first) > gmm::abs(b.first)); }\n  }\n\n  struct idgmres_state {\n    size_type m, tb_deb, tb_def, p, k, nb_want, nb_unwant;\n    size_type nb_nolong, tb_deftot, tb_defwant, conv, nb_un, fin;\n    bool ok;\n\n    idgmres_state(size_type mm, size_type pp, size_type kk)\n      : m(mm), tb_deb(1), tb_def(0), p(pp), k(kk), nb_want(0),\n\tnb_unwant(0), nb_nolong(0), tb_deftot(0), tb_defwant(0),\n\tconv(0), nb_un(0), fin(0), ok(false); {}\n  }\n\n    idgmres_state(size_type mm, size_type pp, size_type kk)\n      : m(mm), tb_deb(1), tb_def(0), p(pp), k(kk), nb_want(0),\n\tnb_unwant(0), nb_nolong(0), tb_deftot(0), tb_defwant(0),\n\tconv(0), nb_un(0), fin(0), ok(false); {}\n  \n\n  template <typename CONT, typename IND>\n  apply_permutation(CONT &cont, const IND &ind) {\n    size_type m = ind.end() - ind.begin();\n    std::vector<bool> sorted(m, false);\n    \n    for (size_type l = 0; l < m; ++l)\n      if (!sorted[l] && ind[l] != l) {\n\n\ttypeid(cont[0]) aux = cont[l];\n\tk = ind[l];\n\tcont[l] = cont[k];\n\tsorted[l] = true;\n\t\n\tfor(k2 = ind[k]; k2 != l; k2 = ind[k]) {\n\t  cont[k] = cont[k2];\n\t  sorted[k] = true;\n\t  k = k2;\n\t}\n\tcont[k] = aux;\n      }\n  }\n\n\n  /** Implicitly restarted and deflated Generalized Minimum Residual\n\n      See: C. Le Calvez, B. Molina, Implicitly restarted and deflated\n      FOM and GMRES, numerical applied mathematics,\n      (30) 2-3 (1999) pp191-212.\n      \n      @param A Real or complex unsymmetric matrix.\n      @param x initial guess vector and final result.\n      @param b right hand side\n      @param M preconditionner\n      @param m size of the subspace between two restarts\n      @param p number of converged ritz values seeked\n      @param k size of the remaining Krylov subspace when the p ritz values\n      have not yet converged 0 <= p <= k < m.\n      @param tol_vp : tolerance on the ritz values.\n      @param outer\n      @param KS\n  */\n  template < typename Mat, typename Vec, typename VecB, typename Precond,\n\t     typename Basis >\n  void idgmres(const Mat &A, Vec &x, const VecB &b, const Precond &M,\n\t     size_type m, size_type p, size_type k, double tol_vp,\n\t     iteration &outer, Basis& KS) {\n\n    typedef typename linalg_traits<Mat>::value_type T;\n    typedef typename number_traits<T>::magnitude_type R;\n    \n    R a, beta;\n    idgmres_state st(m, p, k);\n\n    std::vector<T> w(vect_size(x)), r(vect_size(x)), u(vect_size(x));\n    std::vector<T> c_rot(m+1), s_rot(m+1), s(m+1);\n    std::vector<T> y(m+1), ztest(m+1), gam(m+1);\n    std::vector<T> gamma(m+1);\n    gmm::dense_matrix<T> H(m+1, m), Hess(m+1, m),\n      Hobl(m+1, m), W(vect_size(x), m+1);\n\n    gmm::clear(H);\n\n    outer.set_rhsnorm(gmm::vect_norm2(b));\n    if (outer.get_rhsnorm() == 0.0) { clear(x); return; }\n    \n    mult(A, scaled(x, -1.0), b, w);\n    mult(M, w, r);\n    beta = gmm::vect_norm2(r);\n\n    iteration inner = outer;\n    inner.reduce_noisy();\n    inner.set_maxiter(m);\n    inner.set_name(\"GMRes inner iter\");\n    \n    while (! outer.finished(beta)) {\n      \n      gmm::copy(gmm::scaled(r, 1.0/beta), KS[0]);\n      gmm::clear(s);\n      s[0] = beta;\n      gmm::copy(s, gamma);\n\n      inner.set_maxiter(m - st.tb_deb + 1);\n      size_type i = st.tb_deb - 1; inner.init();\n      \n      do {\n\tmult(A, KS[i], u);\n\tmult(M, u, KS[i+1]);\n\torthogonalize_with_refinment(KS, mat_col(H, i), i);\n\tH(i+1, i) = a = gmm::vect_norm2(KS[i+1]);\n\tgmm::scale(KS[i+1], R(1) / a);\n\n\tgmm::copy(mat_col(H, i), mat_col(Hess, i));\n\tgmm::copy(mat_col(H, i), mat_col(Hobl, i));\n\t\n\n\tfor (size_type l = 0; l < i; ++l)\n\t  Apply_Givens_rotation_left(H(l,i), H(l+1,i), c_rot[l], s_rot[l]);\n\t\n\tGivens_rotation(H(i,i), H(i+1,i), c_rot[i], s_rot[i]);\n\tApply_Givens_rotation_left(H(i,i), H(i+1,i), c_rot[i], s_rot[i]);\n\tH(i+1, i) = T(0); \n\tApply_Givens_rotation_left(s[i], s[i+1], c_rot[i], s_rot[i]);\n\t\n\t++inner, ++outer, ++i;\n      } while (! inner.finished(gmm::abs(s[i])));\n\n      if (inner.converged()) {\n\tgmm::copy(s, y);\n\tupper_tri_solve(H, y, i, false);\n\tcombine(KS, y, x, i);\n\tmult(A, gmm::scaled(x, T(-1)), b, w);\n\tmult(M, w, r);\n\tbeta = gmm::vect_norm2(r); // + verif sur beta ...  faire\n\tbreak;\n      }\n\n      gmm::clear(gam); gam[m] = s[i];\n      for (size_type l = m; l > 0; --l)\n\tApply_Givens_rotation_left(gam[l-1], gam[l], gmm::conj(c_rot[l-1]),\n\t\t\t\t   -s_rot[l-1]);\n\n      mult(KS.mat(), gam, r);\n      beta = gmm::vect_norm2(r);\n      \n      mult(Hess, scaled(y, T(-1)), gamma, ztest);\n      // En fait, d'aprs Caroline qui s'y connait ztest et gam devrait\n      // tre confondus\n      // Quand on aura vrifi que a marche, il faudra utiliser gam  la \n      // place de ztest.\n      if (st.tb_def < p) {\n        T nss = H(m,m-1) / ztest[m];\n\tnss /= gmm::abs(nss); // ns  calculer plus tard aussi\n\tgmm::copy(KS.mat(), W); gmm::copy(scaled(r, nss /beta), mat_col(W, m));\n\t\n\t// Computation of the oblique matrix\n\tsub_interval SUBI(0, m);\n\tadd(scaled(sub_vector(ztest, SUBI), -Hobl(m, m-1) / ztest[m]),\n\t    sub_vector(mat_col(Hobl, m-1), SUBI));\n\tHobl(m, m-1) *= nss * beta / ztest[m]; \n\n\t/* **************************************************************** */\n\t/*  Locking                                                         */\n\t/* **************************************************************** */\n\n\t// Computation of the Ritz eigenpairs.\n\tstd::vector<std::complex<R> > eval(m);\n\tdense_matrix<T> YB(m-st.tb_def, m-st.tb_def);\n\tstd::vector<char> pure(m-st.tb_def, 0);\n\tgmm::clear(YB);\n\n\tselect_eval(Hobl, eval, YB, pure, st);\n\n\tif (st.conv != 0) {\n\t  // DEFLATION using the QR Factorization of YB\n\t  \n\t  T alpha = Lock(W, Hobl,\n\t\t\t sub_matrix(YB,  sub_interval(0, m-st.tb_def)),\n\t\t\t sub_interval(st.tb_def, m-st.tb_def), \n\t\t\t (st.tb_defwant < p)); \n\t  // ns *= alpha; //  calculer plus tard ??\n\t  //  V(:,m+1) = alpha*V(:, m+1); a devait servir  qlq chose ...\n\n\n\t  //       Clean the portions below the diagonal corresponding\n\t  //       to the lock Schur vectors\n\n\t  for (size_type j = st.tb_def; j < st.tb_deftot; ++j) {\n\t    if ( pure[j-st.tb_def] == 0)\n\t      gmm::clear(sub_vector(mat_col(Hobl,j), sub_interval(j+1,m-j)));\n\t    else if (pure[j-st.tb_def] == 1) {\n\t      gmm::clear(sub_matrix(Hobl, sub_interval(j+2,m-j-1),\n\t\t\t\t    sub_interval(j, 2))); \n\t      ++j;\n\t    }\n\t    else GMM_ASSERT3(false, \"internal error\");\n\t  }\n\t  \n\t  if (!st.ok) {\n\n\t    // attention si m = 0;\n\t    size_type mm = std::min(k+st.nb_unwant+st.nb_nolong, m-1);\n\n\t    if (eval_sort[m-mm-1].second != R(0)\n\t\t&& eval_sort[m-mm-1].second == -eval_sort[m-mm].second) ++mm;\n\n\t    std::vector<complex<R> > shifts(m-mm);\n\t    for (size_type i = 0; i < m-mm; ++i)\n\t      shifts[i] = eval_sort[i].second;\n\n\t    apply_shift_to_Arnoldi_factorization(W, Hobl, shifts, mm,\n\t\t\t\t\t\t m-mm, true);\n\n\t    st.fin = mm;\n\t  }\n\t  else\n\t    st.fin = st.tb_deftot;\n\n\n\t  /* ************************************************************** */\n\t  /*  Purge                                                         */\n\t  /* ************************************************************** */\n\n\t  if (st.nb_nolong + st.nb_unwant > 0) {\n\n\t    std::vector<std::complex<R> > eval(m);\n\t    dense_matrix<T> YB(st.fin, st.tb_deftot);\n\t    std::vector<char> pure(st.tb_deftot, 0);\n\t    gmm::clear(YB);\n\t    st.nb_un = st.nb_nolong + st.nb_unwant;\n\t    \n\t    select_eval_for_purging(Hobl, eval, YB, pure, st);\n\t    \n\t    T alpha = Lock(W, Hobl, YB, sub_interval(0, st.fin), ok);\n\n\t    //       Clean the portions below the diagonal corresponding\n\t    //       to the unwanted lock Schur vectors\n\t    \n\t    for (size_type j = 0; j < st.tb_deftot; ++j) {\n\t      if ( pure[j] == 0)\n\t\tgmm::clear(sub_vector(mat_col(Hobl,j), sub_interval(j+1,m-j)));\n\t      else if (pure[j] == 1) {\n\t\tgmm::clear(sub_matrix(Hobl, sub_interval(j+2,m-j-1),\n\t\t\t\t      sub_interval(j, 2))); \n\t\t++j;\n\t      }\n\t      else GMM_ASSERT3(false, \"internal error\");\n\t    }\n\n\t    gmm::dense_matrix<T> z(st.nb_un, st.fin - st.nb_un);\n\t    sub_interval SUBI(0, st.nb_un), SUBJ(st.nb_un, st.fin - st.nb_un);\n\t    sylvester(sub_matrix(Hobl, SUBI),\n\t\t      sub_matrix(Hobl, SUBJ),\n\t\t      sub_matrix(gmm::scaled(Hobl, -T(1)), SUBI, SUBJ), z);\n\t    \n\t  }\n\n\t}\n\t\n      }\n    }\n  }\n  \n\n  template < typename Mat, typename Vec, typename VecB, typename Precond >\n    void idgmres(const Mat &A, Vec &x, const VecB &b,\n\t\t const Precond &M, size_type m, iteration& outer) {\n    typedef typename linalg_traits<Mat>::value_type T;\n    modified_gram_schmidt<T> orth(m, vect_size(x));\n    gmres(A, x, b, M, m, outer, orth); \n  }\n\n\n  // Lock stage of an implicit restarted Arnoldi process.\n  // 1- QR factorization of YB through Householder matrices\n  //    Q(Rl) = YB\n  //     (0 )\n  // 2- Update of the Arnoldi factorization.\n  //    H <- Q*HQ,  W <- WQ\n  // 3- Restore the Hessemberg form of H.\n\n  template <typename T, typename MATYB>\n    void Lock(gmm::dense_matrix<T> &W, gmm::dense_matrix<T> &H,\n\t      const MATYB &YB, const sub_interval SUB,\n\t      bool restore, T &ns) {\n\n    size_type n = mat_nrows(W), m = mat_ncols(W) - 1;\n    size_type ncols = mat_ncols(YB), nrows = mat_nrows(YB);\n    size_type begin = min(SUB); end = max(SUB) - 1;\n    sub_interval SUBR(0, nrows), SUBC(0, ncols);\n    T alpha(1);\n\n    GMM_ASSERT2(((end-begin) == ncols) && (m == mat_nrows(H)) \n\t\t&& (m+1 == mat_ncols(H)), \"dimensions mismatch\");\n    \n    // DEFLATION using the QR Factorization of YB\n\t  \n    dense_matrix<T> QR(n_rows, n_rows);\n    gmmm::copy(YB, sub_matrix(QR, SUBR, SUBC));\n    gmm::clear(submatrix(QR, SUBR, sub_interval(ncols, nrows-ncols)));\n    qr_factor(QR); \n\n\n    apply_house_left(QR, sub_matrix(H, SUB));\n    apply_house_right(QR, sub_matrix(H, SUBR, SUB));\n    apply_house_right(QR, sub_matrix(W, sub_interval(0, n), SUB));\n    \n    //       Restore to the initial block hessenberg form\n    \n    if (restore) {\n      \n      // verifier quand m = 0 ...\n      gmm::dense_matrix tab_p(end - st.tb_deftot, end - st.tb_deftot);\n      gmm::copy(identity_matrix(), tab_p);\n      \n      for (size_type j = end-1; j >= st.tb_deftot+2; --j) {\n\t\n\tsize_type jm = j-1;\n\tstd::vector<T> v(jm - st.tb_deftot);\n\tsub_interval SUBtot(st.tb_deftot, jm - st.tb_deftot);\n\tsub_interval SUBtot2(st.tb_deftot, end - st.tb_deftot);\n\tgmm::copy(sub_vector(mat_row(H, j), SUBtot), v);\n\thouse_vector_last(v);\n\tw.resize(end);\n\tcol_house_update(sub_matrix(H, SUBI, SUBtot), v, w);\n\tw.resize(end - st.tb_deftot);\n\trow_house_update(sub_matrix(H, SUBtot, SUBtot2), v, w);\n\tgmm::clear(sub_vector(mat_row(H, j),\n\t\t\t      sub_interval(st.tb_deftot, j-1-st.tb_deftot)));\n\tw.resize(end - st.tb_deftot);\n\tcol_house_update(sub_matrix(tab_p, sub_interval(0, end-st.tb_deftot),\n\t\t\t\t    sub_interval(0, jm-st.tb_deftot)), v, w);\n\tw.resize(n);\n\tcol_house_update(sub_matrix(W, sub_interval(0, n), SUBtot), v, w);\n      }\n      \n      //       restore positive subdiagonal elements\n      \n      std::vector<T> d(fin-st.tb_deftot); d[0] = T(1);\n      \n      // We compute d[i+1] in order \n      // (d[i+1] * H(st.tb_deftot+i+1,st.tb_deftoti)) / d[i] \n      // be equal to |H(st.tb_deftot+i+1,st.tb_deftot+i))|.\n      for (size_type j = 0; j+1 < end-st.tb_deftot; ++j) {\n\tT e = H(st.tb_deftot+j, st.tb_deftot+j-1);\n\td[j+1] = (e == T(0)) ? T(1) :  d[j] * gmm::abs(e) / e;\n\tscale(sub_vector(mat_row(H, st.tb_deftot+j+1),\n\t\t\t sub_interval(st.tb_deftot, m-st.tb_deftot)), d[j+1]);\n\tscale(mat_col(H, st.tb_deftot+j+1), T(1) / d[j+1]);\n\tscale(mat_col(W, st.tb_deftot+j+1), T(1) / d[j+1]);\n      }\n\n      alpha = tab_p(end-st.tb_deftot-1, end-st.tb_deftot-1) / d[end-st.tb_deftot-1];\n      alpha /= gmm::abs(alpha);\n      scale(mat_col(W, m), alpha);\n\t    \n    }\n\t \n    return alpha;\n  }\n\n\n\n\n\n\n\n\n  // Apply p implicit shifts to the Arnoldi factorization\n  // AV = VH+H(k+p+1,k+p) V(:,k+p+1) e_{k+p}*\n  // and produces the following new Arnoldi factorization\n  // A(VQ) = (VQ)(Q*HQ)+H(k+p+1,k+p) V(:,k+p+1) e_{k+p}* Q\n  // where only the first k columns are relevant.\n  //\n  // Dan Sorensen and Richard J. Radke, 11/95\n  template<typename T, typename C>\n    apply_shift_to_Arnoldi_factorization(dense_matrix<T> V, dense_matrix<T> H,\n\t\t\t\t\t std::vector<C> Lambda, size_type &k,\n\t\t\t\t\t size_type p, bool true_shift = false) {\n\n\n    size_type k1 = 0, num = 0, kend = k+p, kp1 = k + 1;\n    bool mark = false;\n    T c, s, x, y, z;\n\n    dense_matrix<T> q(1, kend);\n    gmm::clear(q); q(0,kend-1) = T(1);\n    std::vector<T> hv(3), w(std::max(kend, mat_nrows(V)));\n\n    for(size_type jj = 0; jj < p; ++jj) {\n      //     compute and apply a bulge chase sweep initiated by the\n      //     implicit shift held in w(jj)\n   \n      if (abs(Lambda[jj].real()) == 0.0) {\n\t//       apply a real shift using 2 by 2 Givens rotations\n\n\tfor (size_type k1 = 0, k2 = 0; k2 != kend-1; k1 = k2+1) {\n\t  k2 = k1;\n\t  while (h(k2+1, k2) != T(0) && k2 < kend-1) ++k2;\n\n\t  Givens_rotation(H(k1, k1) - Lambda[jj], H(k1+1, k1), c, s);\n\t  \n\t  for (i = k1; i <= k2; ++i) {\n            if (i > k1) Givens_rotation(H(i, i-1), H(i+1, i-1), c, s);\n            \n\t    // Ne pas oublier de nettoyer H(i+1,i-1) (le mettre  zro).\n\t    // Vrifier qu'au final H(i+1,i) est bien un rel positif.\n\n            // apply rotation from left to rows of H\n\t    row_rot(sub_matrix(H, sub_interval(i,2), sub_interval(i, kend-i)),\n\t\t    c, s, 0, 0);\n\t    \n\t    // apply rotation from right to columns of H\n            size_type ip2 = std::min(i+2, kend);\n            col_rot(sub_matrix(H, sub_interval(0, ip2), sub_interval(i, 2))\n\t\t    c, s, 0, 0);\n            \n            // apply rotation from right to columns of V\n\t    col_rot(V, c, s, i, i+1);\n            \n            // accumulate e'  Q so residual can be updated k+p\n\t    Apply_Givens_rotation_left(q(0,i), q(0,i+1), c, s);\n\t    // peut tre que nous utilisons G au lieu de G* et que\n\t    // nous allons trop loin en k2.\n\t  }\n\t}\n\t\n\tnum = num + 1;\n      }\n      else {\n      \n\t// Apply a double complex shift using 3 by 3 Householder \n\t// transformations\n      \n\tif (jj == p || mark)\n\t  mark = false;     // skip application of conjugate shift\n\telse {\n\t  num = num + 2;    // mark that a complex conjugate\n\t  mark = true;      // pair has been applied\n\n\t  // Indices de fin de boucle  surveiller... de prs !\n\t  for (size_type k1 = 0, k3 = 0; k3 != kend-2; k1 = k3+1) {\n\t    k3 = k1;\n\t    while (h(k3+1, k3) != T(0) && k3 < kend-2) ++k3;\n\t    size_type k2 = k1+1;\n\n\n            x = H(k1,k1) * H(k1,k1) + H(k1,k2) * H(k2,k1)\n\t      - 2.0*Lambda[jj].real() * H(k1,k1) + gmm::abs_sqr(Lambda[jj]);\n\t    y = H(k2,k1) * (H(k1,k1) + H(k2,k2) - 2.0*Lambda[jj].real());\n\t    z = H(k2+1,k2) * H(k2,k1);\n\n\t    for (size_type i = k1; i <= k3; ++i) {\n\t      if (i > k1) {\n\t\tx = H(i, i-1);\n\t\ty = H(i+1, i-1);\n\t\tz = H(i+2, i-1);\n\t\t// Ne pas oublier de nettoyer H(i+1,i-1) et H(i+2,i-1) \n\t\t// (les mettre  zro).\n\t      }\n\n\t      hv[0] = x; hv[1] = y; hv[2] = z;\n\t      house_vector(v);\n\n\t      // Vrifier qu'au final H(i+1,i) est bien un rel positif\n\n\t      // apply transformation from left to rows of H\n\t      w.resize(kend-i);\n\t      row_house_update(sub_matrix(H, sub_interval(i, 2),\n\t\t\t\t\t  sub_interval(i, kend-i)), v, w);\n               \n\t      // apply transformation from right to columns of H\n               \n\t      size_type ip3 = std::min(kend, i + 3);\n\t      w.resize(ip3);\n              col_house_update(sub_matrix(H, sub_interval(0, ip3),\n\t\t\t\t\t  sub_interval(i, 2)), v, w);\n               \n\t      // apply transformation from right to columns of V\n\t      \n\t      w.resize(mat_nrows(V));\n\t      col_house_update(sub_matrix(V, sub_interval(0, mat_nrows(V)),\n\t\t\t\t\t  sub_interval(i, 2)), v, w);\n               \n\t      // accumulate e' Q so residual can be updated  k+p\n\n\t      w.resize(1);\n\t      col_house_update(sub_matrix(q, sub_interval(0,1),\n\t\t\t\t\t  sub_interval(i,2)), v, w);\n               \n\t    }\n\t  }\n         \n\t  //           clean up step with Givens rotation\n\n\t  i = kend-2;\n\t  c = x; s = y;\n\t  if (i > k1) Givens_rotation(H(i, i-1), H(i+1, i-1), c, s);\n            \n\t  // Ne pas oublier de nettoyer H(i+1,i-1) (le mettre  zro).\n\t  // Vrifier qu'au final H(i+1,i) est bien un rel positif.\n\n\t  // apply rotation from left to rows of H\n\t  row_rot(sub_matrix(H, sub_interval(i,2), sub_interval(i, kend-i)),\n\t\t    c, s, 0, 0);\n\t    \n\t  // apply rotation from right to columns of H\n\t  size_type ip2 = std::min(i+2, kend);\n\t  col_rot(sub_matrix(H, sub_interval(0, ip2), sub_interval(i, 2))\n\t\t  c, s, 0, 0);\n            \n\t  // apply rotation from right to columns of V\n\t  col_rot(V, c, s, i, i+1);\n            \n\t  // accumulate e'  Q so residual can be updated k+p\n\t  Apply_Givens_rotation_left(q(0,i), q(0,i+1), c, s);\n\n\t}\n      }\n    }\n\n    //  update residual and store in the k+1 -st column of v\n\n    k = kend - num;\n    scale(mat_col(V, kend), q(0, k));\n    \n    if (k < mat_nrows(H)) {\n      if (true_shift)\n\tgmm::copy(mat_col(V, kend), mat_col(V, k));\n      else\n\t   //   v(:,k+1) = v(:,kend+1) + v(:,k+1)*h(k+1,k);\n\t   //   v(:,k+1) = v(:,kend+1) ;\n\tgmm::add(scaled(mat_col(V, kend), H(kend, kend-1)), \n\t\t scaled(mat_col(V, k), H(k, k-1)), mat_col(V, k));\n    }\n\n    H(k, k-1) = vect_norm2(mat_col(V, k));\n    scale(mat_col(V, kend), T(1) / H(k, k-1));\n  }\n\n\n\n  template<typename MAT, typename EVAL, typename PURE>\n  void select_eval(const MAT &Hobl, EVAL &eval, MAT &YB, PURE &pure,\n\t\t   idgmres_state &st) {\n\n    typedef typename linalg_traits<MAT>::value_type T;\n    typedef typename number_traits<T>::magnitude_type R;\n    size_type m = st.m;\n\n    // Computation of the Ritz eigenpairs.\n    \n    col_matrix< std::vector<T> > evect(m-st.tb_def, m-st.tb_def);\n    // std::vector<std::complex<R> > eval(m);\n    std::vector<R> ritznew(m, T(-1));\n\t\n    // dense_matrix<T> evect_lock(st.tb_def, st.tb_def);\n    \n    sub_interval SUB1(st.tb_def, m-st.tb_def);\n    implicit_qr_algorithm(sub_matrix(Hobl, SUB1),\n\t\t\t  sub_vector(eval, SUB1), evect);\n    sub_interval SUB2(0, st.tb_def);\n    implicit_qr_algorithm(sub_matrix(Hobl, SUB2),\n\t\t\t  sub_vector(eval, SUB2), /* evect_lock */);\n    \n    for (size_type l = st.tb_def; l < m; ++l)\n      ritznew[l] = gmm::abs(evect(m-st.tb_def-1, l-st.tb_def) * Hobl(m, m-1));\n    \n    std::vector< std::pair<T, size_type> > eval_sort(m);\n    for (size_type l = 0; l < m; ++l)\n      eval_sort[l] = std::pair<T, size_type>(eval[l], l);\n    std::sort(eval_sort.begin(), eval_sort.end(), compare_vp());\n    \n    std::vector<size_type> index(m);\n    for (size_type l = 0; l < m; ++l) index[l] = eval_sort[l].second;\n    \n    std::vector<bool> kept(m, false);\n    std::fill(kept.begin(), kept.begin()+st.tb_def, true);\n\n    apply_permutation(eval, index);\n    apply_permutation(evect, index);\n    apply_permutation(ritznew, index);\n    apply_permutation(kept, index);\n\n    //\tWhich are the eigenvalues that converged ?\n    //\n    //\tnb_want is the number of eigenvalues of \n    //\tHess(tb_def+1:n,tb_def+1:n) that converged and are WANTED\n    //\n    //\tnb_unwant is the number of eigenvalues of \n    //\tHess(tb_def+1:n,tb_def+1:n) that converged and are UNWANTED\n    //\n    //\tnb_nolong is the number of eigenvalues of \n    //\tHess(1:tb_def,1:tb_def) that are NO LONGER WANTED. \n    //\n    //\ttb_deftot is the number of the deflated eigenvalues\n    //\tthat is tb_def + nb_want + nb_unwant\n    //\n    //\ttb_defwant is the number of the wanted deflated eigenvalues\n    //\tthat is tb_def + nb_want - nb_nolong\n    \n    st.nb_want = 0, st.nb_unwant = 0, st.nb_nolong = 0;\n    size_type j, ind;\n    \n    for (j = 0, ind = 0; j < m-p; ++j) {\n      if (ritznew[j] == R(-1)) {\n\tif (std::imag(eval[j]) != R(0)) {\n\t  st.nb_nolong += 2; ++j; //   adapter dans le cas complexe ...\n\t} \n\telse st.nb_nolong++;\n      }\n      else {\n\tif (ritznew[j]\n\t    < tol_vp * gmm::abs(eval[j])) {\n\t  \n\t  for (size_type l = 0, l < m-st.tb_def; ++l)\n\t    YB(l, ind) = std::real(evect(l, j));\n\t  kept[j] = true;\n\t  ++j; ++st.nb_unwant; ind++;\n\t  \n\t  if (std::imag(eval[j]) != R(0)) {\n\t    for (size_type l = 0, l < m-st.tb_def; ++l)\n\t      YB(l, ind) = std::imag(evect(l, j));\n\t    pure[ind-1] = 1;\n\t    pure[ind] = 2;\n\t    \n\t    kept[j] = true;\n\t    \n\t    st.nb_unwant++;\n\t    ++ind;\n\t  }\n\t}\n      }\n    }\n    \n    \n    for (; j < m; ++j) {\n      if (ritznew[j] != R(-1)) {\n\n\tfor (size_type l = 0, l < m-st.tb_def; ++l)\n\t  YB(l, ind) = std::real(evect(l, j));\n\tpure[ind] = 1;\n\t++ind;\n\tkept[j] = true;\n\t++st.nb_want;\n\t\n\tif (ritznew[j]\n\t    < tol_vp * gmm::abs(eval[j])) {\n\t  for (size_type l = 0, l < m-st.tb_def; ++l)\n\t    YB(l, ind) = std::imag(evect(l, j));\n\t  pure[ind] = 2;\n\t  \n\t  j++;\n\t  kept[j] = true;\n\t  \n\t  st.nb_want++;\n\t  ++ind;\t      \n\t}\n      }\n    }\n    \n    std::vector<T> shift(m - st.tb_def - st.nb_want - st.nb_unwant);\n    for (size_type j = 0, i = 0; j < m; ++j)\n      if (!kept[j]) shift[i++] = eval[j];\n    \n    // st.conv (st.nb_want+st.nb_unwant) is the number of eigenpairs that\n    //   have just converged.\n    // st.tb_deftot is the total number of eigenpairs that have converged.\n    \n    size_type st.conv = ind;\n    size_type st.tb_deftot = st.tb_def + st.conv;\n    size_type st.tb_defwant = st.tb_def + st.nb_want - st.nb_nolong;\n    \n    sub_interval SUBYB(0, st.conv);\n    \n    if ( st.tb_defwant >= p ) { // An invariant subspace has been found.\n      \n      st.nb_unwant = 0;\n      st.nb_want = p + st.nb_nolong - st.tb_def;\n      st.tb_defwant = p;\n      \n      if ( pure[st.conv - st.nb_want + 1] == 2 ) {\n\t++st.nb_want; st.tb_defwant = ++p;// il faudrait que ce soit un p local\n      }\n      \n      SUBYB = sub_interval(st.conv - st.nb_want, st.nb_want);\n      // YB = YB(:, st.conv-st.nb_want+1 : st.conv); // On laisse en suspend ..\n      // pure = pure(st.conv-st.nb_want+1 : st.conv,1); // On laisse suspend ..\n      st.conv = st.nb_want;\n      st.tb_deftot = st.tb_def + st.conv;\n      st.ok = true;\n    }\n    \n  }\n\n\n\n  template<typename MAT, typename EVAL, typename PURE>\n  void select_eval_for_purging(const MAT &Hobl, EVAL &eval, MAT &YB,\n\t\t\t       PURE &pure, idgmres_state &st) {\n\n    typedef typename linalg_traits<MAT>::value_type T;\n    typedef typename number_traits<T>::magnitude_type R;\n    size_type m = st.m;\n\n    // Computation of the Ritz eigenpairs.\n    \n    col_matrix< std::vector<T> > evect(st.tb_deftot, st.tb_deftot);\n    \n    sub_interval SUB1(0, st.tb_deftot);\n    implicit_qr_algorithm(sub_matrix(Hobl, SUB1),\n\t\t\t  sub_vector(eval, SUB1), evect);\n    std::fill(eval.begin() + st.tb_deftot, eval.end(), std::complex<R>(0));\n    \n    std::vector< std::pair<T, size_type> > eval_sort(m);\n    for (size_type l = 0; l < m; ++l)\n      eval_sort[l] = std::pair<T, size_type>(eval[l], l);\n    std::sort(eval_sort.begin(), eval_sort.end(), compare_vp());\n\n    std::vector<bool> sorted(m);\n    std::fill(sorted.begin(), sorted.end(), false);\n    \n    std::vector<size_type> ind(m);\n    for (size_type l = 0; l < m; ++l) ind[l] = eval_sort[l].second;\n    \n    std::vector<bool> kept(m, false);\n    std::fill(kept.begin(), kept.begin()+st.tb_def, true);\n\n    apply_permutation(eval, ind);\n    apply_permutation(evect, ind);\n    \n    size_type j;\n    for (j = 0; j < st.tb_deftot; ++j) {\n\t  \n      for (size_type l = 0, l < st.tb_deftot; ++l)\n\tYB(l, j) = std::real(evect(l, j));\n      \n      if (std::imag(eval[j]) != R(0)) {\n\tfor (size_type l = 0, l < m-st.tb_def; ++l)\n\t  YB(l, j+1) = std::imag(evect(l, j));\n\tpure[j] = 1;\n\tpure[j+1] = 2;\n\t\n\tj += 2;\n      }\n      else ++j;\n    }\n  }\n  \n\n\n\n\n\n}\n\n#endif\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_solver_qmr.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2002-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n// This file is a modified version of qmr.h from ITL.\n// See http://osl.iu.edu/research/itl/\n// Following the corresponding Copyright notice.\n//===========================================================================\n//\n// Copyright (c) 1997-2001, The Trustees of Indiana University.\n// All rights reserved.\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are met:\n//\n//    * Redistributions of source code must retain the above copyright\n//      notice, this list of conditions and the following disclaimer.\n//    * Redistributions in binary form must reproduce the above copyright\n//      notice, this list of conditions and the following disclaimer in the\n//      documentation and/or other materials provided with the distribution.\n//    * Neither the name of the University of Notre Dame nor the\n//      names of its contributors may be used to endorse or promote products\n//      derived from this software without specific prior written permission.\n//\n// THIS SOFTWARE  IS  PROVIDED  BY  THE TRUSTEES  OF  INDIANA UNIVERSITY  AND\n// CONTRIBUTORS  ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,  INCLUDING,\n// BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND  FITNESS\n// FOR  A PARTICULAR PURPOSE ARE DISCLAIMED. IN  NO  EVENT SHALL THE TRUSTEES\n// OF INDIANA UNIVERSITY AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n// INCIDENTAL, SPECIAL, EXEMPLARY,  OR CONSEQUENTIAL DAMAGES (INCLUDING,  BUT\n// NOT  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA,  OR PROFITS;  OR BUSINESS  INTERRUPTION)  HOWEVER  CAUSED AND ON ANY\n// THEORY  OF  LIABILITY,  WHETHER  IN  CONTRACT,  STRICT  LIABILITY, OR TORT\n// (INCLUDING  NEGLIGENCE  OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n// THIS  SOFTWARE,  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n//===========================================================================\n\n/**@file gmm_solver_qmr.h\n   @author Andrew Lumsdaine <lums@osl.iu.edu>\n   @author Lie-Quan Lee     <llee@osl.iu.edu>\n   @author  Yves Renard <Yves.Renard@insa-lyon.fr>\n   @date October 13, 2002.\n   @brief Quasi-Minimal Residual iterative solver.\n*/\n#ifndef GMM_QMR_H\n#define GMM_QMR_H\n\n#include \"gmm_kernel.h\"\n#include \"gmm_iter.h\"\n\nnamespace gmm {\n\n  /** Quasi-Minimal Residual.\n     \n     This routine solves the unsymmetric linear system Ax = b using\n     the Quasi-Minimal Residual method.\n   \n     See: R. W. Freund and N. M. Nachtigal, A quasi-minimal residual\n     method for non-Hermitian linear systems, Numerical Math.,\n     60(1991), pp. 315-339\n  \n     Preconditioner -  Incomplete LU, Incomplete LU with threshold,\n                       SSOR or identity_preconditioner.\n  */\n  template <typename Matrix, typename Vector, typename VectorB,\n\t    typename Precond1>\n  void qmr(const Matrix &A, Vector &x, const VectorB &b, const Precond1 &M1,\n\t   iteration& iter) {\n\n    typedef typename linalg_traits<Vector>::value_type T;\n    typedef typename number_traits<T>::magnitude_type R;\n\n    T delta(0), ep(0), beta(0), theta_1(0), gamma_1(0);\n    T theta(0), gamma(1), eta(-1);\n    R rho_1(0), rho, xi;\n\n    typedef typename temporary_vector<Vector>::vector_type TmpVec;\n    size_type nn = vect_size(x);\n    TmpVec r(nn), v_tld(nn), y(nn), w_tld(nn), z(nn), v(nn), w(nn);\n    TmpVec y_tld(nn), z_tld(nn), p(nn), q(nn), p_tld(nn), d(nn), s(nn);\n\n    iter.set_rhsnorm(double(gmm::vect_norm2(b)));\n    if (iter.get_rhsnorm() == 0.0) { clear(x); return; }\n\n    gmm::mult(A, gmm::scaled(x, T(-1)), b, r);\n    gmm::copy(r, v_tld);\n\n    gmm::left_mult(M1, v_tld, y);\n    rho = gmm::vect_norm2(y);\n\n    gmm::copy(r, w_tld);\n    gmm::transposed_right_mult(M1, w_tld, z);\n    xi = gmm::vect_norm2(z);\n  \n    while (! iter.finished_vect(r)) {\n    \n      if (rho == R(0) || xi == R(0)) {\n\tif (iter.get_maxiter() == size_type(-1)) \n\t  { GMM_ASSERT1(false, \"QMR failed to converge\"); }\n\telse { GMM_WARNING1(\"QMR failed to converge\"); return; }\n      }\n      gmm::copy(gmm::scaled(v_tld, T(R(1)/rho)), v);\n      gmm::scale(y, T(R(1)/rho));\n\n      gmm::copy(gmm::scaled(w_tld, T(R(1)/xi)), w);\n      gmm::scale(z, T(R(1)/xi));\n\n      delta = gmm::vect_sp(z, y);\n      if (delta == T(0)) {\n\tif (iter.get_maxiter() == size_type(-1)) \n\t  { GMM_ASSERT1(false, \"QMR failed to converge\"); }\n\telse { GMM_WARNING1(\"QMR failed to converge\"); return; }\n      }\n      gmm::right_mult(M1, y, y_tld);\t\t\n      gmm::transposed_left_mult(M1, z, z_tld);\n\n      if (iter.first()) {\n\tgmm::copy(y_tld, p);\n\tgmm::copy(z_tld, q);\n      } else {\n\tgmm::add(y_tld, gmm::scaled(p, -(T(xi  * delta) / ep)), p);\n\tgmm::add(z_tld, gmm::scaled(q, -(T(rho * delta) / ep)), q);\n      }\n    \n      gmm::mult(A, p, p_tld);\n\n      ep = gmm::vect_sp(q, p_tld);\n      if (ep == T(0)) {\n\tif (iter.get_maxiter() == size_type(-1)) \n\t  { GMM_ASSERT1(false, \"QMR failed to converge\"); }\n\telse { GMM_WARNING1(\"QMR failed to converge\"); return; }\n      }\n      beta = ep / delta;\n      if (beta == T(0)) {\n\tif (iter.get_maxiter() == size_type(-1)) \n\t  { GMM_ASSERT1(false, \"QMR failed to converge\"); }\n\telse { GMM_WARNING1(\"QMR failed to converge\"); return; }\n      }\n      gmm::add(p_tld, gmm::scaled(v, -beta), v_tld);\n      gmm::left_mult(M1, v_tld, y);\n\n      rho_1 = rho;\n      rho = gmm::vect_norm2(y);\n\n      gmm::mult(gmm::transposed(A), q, w_tld);\n      gmm::add(w_tld, gmm::scaled(w, -beta), w_tld);\n      gmm::transposed_right_mult(M1, w_tld, z);\n\n      xi = gmm::vect_norm2(z);\n\n      gamma_1 = gamma;\n      theta_1 = theta;\n\n      theta = rho / (gamma_1 * beta);\n      gamma = T(1) / gmm::sqrt(T(1) + gmm::sqr(theta));\n\n      if (gamma == T(0)) {\n\tif (iter.get_maxiter() == size_type(-1)) \n\t  { GMM_ASSERT1(false, \"QMR failed to converge\"); }\n\telse { GMM_WARNING1(\"QMR failed to converge\"); return; }\n      }\n      eta = -eta * T(rho_1) * gmm::sqr(gamma) / (beta * gmm::sqr(gamma_1));\n\n      if (iter.first()) {\n\tgmm::copy(gmm::scaled(p, eta), d);\n\tgmm::copy(gmm::scaled(p_tld, eta), s);\n      } else {\n\tT tmp = gmm::sqr(theta_1 * gamma);\n\tgmm::add(gmm::scaled(p, eta), gmm::scaled(d, tmp), d);\n\tgmm::add(gmm::scaled(p_tld, eta), gmm::scaled(s, tmp), s);\n      }\n      gmm::add(d, x);\n      gmm::add(gmm::scaled(s, T(-1)), r);\n\n      ++iter;\n    }\n  }\n\n\n}\n\n#endif \n\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_std.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2002-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n/**@file gmm_std.h\n   @author  Yves Renard <Yves.Renard@insa-lyon.fr>,\n   @author  Julien Pommier <Julien.Pommier@insa-toulouse.fr>\n   @date June 01, 1995.\n   @brief basic setup for gmm (includes, typedefs etc.)\n*/\n#ifndef GMM_STD_H__\n#define GMM_STD_H__\n\n#ifndef __USE_STD_IOSTREAM\n# define __USE_STD_IOSTREAM\n#endif\n\n#ifndef __USE_BSD\n# define __USE_BSD\n#endif\n\n#ifndef __USE_ISOC99\n# define __USE_ISOC99\n#endif\n\n#if defined(_MSC_VER) && _MSC_VER >= 1400 // Secure versions for VC++\n# define GMM_SECURE_CRT\n# define SECURE_NONCHAR_SSCANF sscanf_s\n# define SECURE_NONCHAR_FSCANF fscanf_s\n# define SECURE_STRNCPY(a, la, b, lb) strncpy_s(a, la, b, lb)\n# define SECURE_FOPEN(F, filename, mode) (*(F) = 0,  fopen_s(F, filename, mode))\n# define SECURE_SPRINTF1(S, l, st, p1) sprintf_s(S, l, st, p1) \n# define SECURE_SPRINTF2(S, l, st, p1, p2) sprintf_s(S, l, st, p1, p2) \n# define SECURE_SPRINTF4(S, l, st, p1, p2, p3, p4) sprintf_s(S, l, st, p1, p2, p3, p4)\n# define SECURE_STRDUP(s) _strdup(s)\n# ifndef _SCL_SECURE_NO_DEPRECATE\n#   error Add the option /D_SCL_SECURE_NO_DEPRECATE to the compilation command\n# endif\n#else\n# define SECURE_NONCHAR_SSCANF sscanf\n# define SECURE_NONCHAR_FSCANF fscanf\n# define SECURE_STRNCPY(a, la, b, lb) strncpy(a, b, lb)\n# define SECURE_FOPEN(F, filename, mode) ((*(F)) = fopen(filename, mode))\n# define SECURE_SPRINTF1(S, l, st, p1) sprintf(S, st, p1)\n# define SECURE_SPRINTF2(S, l, st, p1, p2) sprintf(S, st, p1, p2)\n# define SECURE_SPRINTF4(S, l, st, p1, p2, p3, p4) sprintf(S, st, p1, p2, p3, p4) \n# define SECURE_STRDUP(s) strdup(s)\n#endif\n\n\n#if !defined(GMM_USES_MPI) && GETFEM_PARA_LEVEL > 0\n# define GMM_USES_MPI\n#endif\n\n/* ********************************************************************** */\n/*\tCompilers detection.\t\t\t\t\t\t  */\n/* ********************************************************************** */\n\n/* for sun CC 5.0 ...\n#if defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x500\n# include <stdcomp.h>\n# undef _RWSTD_NO_CLASS_PARTIAL_SPEC\n# undef _RWSTD_NO_NAMESPACE\n#endif \n*/\n/* for VISUAL C++ ...\n   #if defined(_MSC_VER) //  && !defined(__MWERKS__)\n   #define _GETFEM_MSVCPP_ _MSC_VER\n   #endif\n*/\n\n#if defined(__GNUC__)\n#  if (__GNUC__ < 3)\n#    error : PLEASE UPDATE g++ TO AT LEAST 3.0 VERSION\n#  endif\n#endif\n\n/* ********************************************************************** */\n/*\tC++ Standard Headers.\t\t\t\t\t\t  */\n/* ********************************************************************** */\n#include <clocale>\n#include <cstdlib>\n#include <cstddef>\n#include <cmath>\n#include <cstring>\n#include <cctype>\n#include <cassert>\n#include <climits>\n#include <iostream>\n//#include <ios> \n#include <fstream>\n#include <ctime>\n#include <exception>\n#include <typeinfo>\n#include <stdexcept>\n#include <iterator>\n#include <algorithm>\n#include <vector>\n#include <deque>\n#include <string>\n#include <complex>\n#include <limits>\n#include <sstream>\n#include <numeric>\n\n\nnamespace gmm {\n\n  using std::endl; using std::cout; using std::cerr;\n  using std::ends; using std::cin;\n\n\n  /* ********************************************************************* */\n  /*       Change locale temporarily.                                      */\n  /* ********************************************************************* */\n\n  class standard_locale {\n    std::string cloc;\n    std::locale cinloc;\n    \n  public :\n    inline standard_locale(void)\n      : cloc(setlocale(LC_NUMERIC, 0)), cinloc(cin.getloc())\n    { setlocale(LC_NUMERIC,\"C\"); cin.imbue(std::locale(\"C\")); }\n    inline ~standard_locale()\n    { setlocale(LC_NUMERIC, cloc.c_str()); cin.imbue(cinloc); }\n  };\n\n  class stream_standard_locale {\n    std::locale cloc;\n    std::ios &io;\n    \n  public :\n    inline stream_standard_locale(std::ios &i)\n      : cloc(i.getloc()), io(i) { io.imbue(std::locale(\"C\")); }\n    inline ~stream_standard_locale() { io.imbue(cloc); }\n  };\n\n\n\n\n  /* ******************************************************************* */\n  /*       Clock functions.                                              */\n  /* ******************************************************************* */\n  \n# if  defined(HAVE_SYS_TIMES)\n  inline double uclock_sec(void) {\n    static double ttclk = 0.;\n    if (ttclk == 0.) ttclk = sysconf(_SC_CLK_TCK);\n    tms t; times(&t); return double(t.tms_utime) / ttclk;\n  }\n# else\n  inline double uclock_sec(void)\n  { return double(clock())/double(CLOCKS_PER_SEC); }\n# endif\n  \n  /* ******************************************************************** */\n  /*\tFixed size integer types.                     \t\t\t  */\n  /* ******************************************************************** */\n  // Remark : the test program dynamic_array tests the lenght of\n  //          resulting integers\n\n  template <size_t s> struct fixed_size_integer_generator {\n    typedef void int_base_type;\n    typedef void uint_base_type;  \n  };\n\n  template <> struct fixed_size_integer_generator<sizeof(char)> {\n    typedef signed char int_base_type;\n    typedef unsigned char uint_base_type;\n  };\n\n  template <> struct fixed_size_integer_generator<sizeof(short int)\n    - ((sizeof(short int) == sizeof(char)) ? 78 : 0)> {\n    typedef signed short int int_base_type;\n    typedef unsigned short int uint_base_type;\n  };\n\n  template <> struct fixed_size_integer_generator<sizeof(int)\n    - ((sizeof(int) == sizeof(short int)) ? 59 : 0)> {\n    typedef signed int int_base_type;\n    typedef unsigned int uint_base_type;\n  };\n \n  template <> struct fixed_size_integer_generator<sizeof(long)\n    - ((sizeof(int) == sizeof(long)) ? 93 : 0)> {\n    typedef signed long int_base_type;\n    typedef unsigned long uint_base_type;\n  };\n\n  template <> struct fixed_size_integer_generator<sizeof(long long)\n    - ((sizeof(long long) == sizeof(long)) ? 99 : 0)> {\n    typedef signed long long int_base_type;\n    typedef unsigned long long uint_base_type;\n  };\n \n  typedef fixed_size_integer_generator<1>::int_base_type int8_type;\n  typedef fixed_size_integer_generator<1>::uint_base_type uint8_type;\n  typedef fixed_size_integer_generator<2>::int_base_type int16_type;\n  typedef fixed_size_integer_generator<2>::uint_base_type uint16_type;\n  typedef fixed_size_integer_generator<4>::int_base_type int32_type;\n  typedef fixed_size_integer_generator<4>::uint_base_type uint32_type;\n  typedef fixed_size_integer_generator<8>::int_base_type int64_type;\n  typedef fixed_size_integer_generator<8>::uint_base_type uint64_type;\n\n// #if INT_MAX == 32767\n//   typedef signed int    int16_type;\n//   typedef unsigned int uint16_type;\n// #elif  SHRT_MAX == 32767\n//   typedef signed short int    int16_type;\n//   typedef unsigned short int uint16_type;\n// #else\n// # error \"impossible to build a 16 bits integer\"\n// #endif\n\n// #if INT_MAX == 2147483647\n//   typedef signed int    int32_type;\n//   typedef unsigned int uint32_type;\n// #elif  SHRT_MAX == 2147483647\n//   typedef signed short int    int32_type;\n//   typedef unsigned short int uint32_type;\n// #elif LONG_MAX == 2147483647\n//   typedef signed long int    int32_type;\n//   typedef unsigned long int uint32_type;\n// #else\n// # error \"impossible to build a 32 bits integer\"\n// #endif\n\n// #if INT_MAX == 9223372036854775807L || INT_MAX == 9223372036854775807\n//   typedef signed int    int64_type;\n//   typedef unsigned int uint64_type;\n// #elif LONG_MAX == 9223372036854775807L || LONG_MAX == 9223372036854775807\n//   typedef signed long int    int64_type;\n//   typedef unsigned long int uint64_type;\n// #elif LLONG_MAX == 9223372036854775807LL || LLONG_MAX == 9223372036854775807L || LLONG_MAX == 9223372036854775807\n//   typedef signed long long int int64_type;\n//   typedef unsigned long long int uint64_type;\n// #else\n// # error \"impossible to build a 64 bits integer\"\n// #endif\n\n#if defined(__GNUC__) && !defined(__ICC)\n/* \n   g++ can issue a warning at each usage of a function declared with this special attribute \n   (also works with typedefs and variable declarations)\n*/\n# define IS_DEPRECATED __attribute__ ((__deprecated__))\n/*\n   the specified function is inlined at any optimization level \n*/\n# define ALWAYS_INLINE __attribute__((always_inline))\n#else\n# define IS_DEPRECATED\n# define ALWAYS_INLINE\n#endif\n  \n}\n\n#endif /* GMM_STD_H__ */\n\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_sub_index.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2002-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n/**@file gmm_sub_index.h\n   @author  Yves Renard <Yves.Renard@insa-lyon.fr>\n   @date October 13, 2002.\n   @brief sub-indices.\n*/\n\n#ifndef GMM_SUB_INDEX_H__\n#define GMM_SUB_INDEX_H__\n\n#include \"gmm_def.h\"\n\nnamespace gmm {\n\n  /* ******************************************************************** */\n  /*\t\tsub indices                               \t\t  */\n  /* ******************************************************************** */\n\n  struct basic_index : public std::vector<size_t> {\n    \n    mutable size_type nb_ref;\n    // size_type key1; faire la somme des composantes\n    // const basic_index *rind; rindex s'il existe\n    \n\n    size_t operator[](size_type i) const {\n      return (i < size()) ? std::vector<size_t>::operator[](i) : size_type(-1);\n    }\n    \n    basic_index() : nb_ref(1) {}\n    basic_index(size_type j) : std::vector<size_t>(j), nb_ref(1) {}\n    template <typename IT> basic_index(IT b, IT e)\n      : std::vector<size_t>(e-b), nb_ref(1) { std::copy(b, e, begin()); }\n    basic_index(const basic_index *pbi) : nb_ref(1) {\n      const_iterator it = pbi->begin(), ite = pbi->end();\n      size_type i = 0;\n      for ( ; it != ite; ++it) i = std::max(i, *it);\n      resize(i+1); std::fill(begin(), end(), size_type(-1));\n      for (it = pbi->begin(), i = 0; it != ite; ++it, ++i)\n\tstd::vector<size_t>::operator[](*it) = i;\n    }\n    void swap(size_type i, size_type j) {\n      std::swap(std::vector<size_t>::operator[](i),\n\t\tstd::vector<size_t>::operator[](j));\n    }\n    \n  };\n\n  typedef basic_index *pbasic_index;\n\n  struct index_generator {\n\n    template <typename IT> static pbasic_index create_index(IT begin, IT end)\n    { return new basic_index(begin, end); }\n    static pbasic_index create_rindex(pbasic_index pbi)\n    { return new basic_index(pbi); }\n    static void attach(pbasic_index pbi) { if (pbi) pbi->nb_ref++; }\n    static void unattach(pbasic_index pbi)\n      { if (pbi && --(pbi->nb_ref) == 0) delete pbi; }\n\n  };\n\n  struct sub_index {\n\n    size_type first_, last_;\n    typedef basic_index base_type;\n    typedef base_type::const_iterator const_iterator;\n\n    mutable pbasic_index ind;\n    mutable pbasic_index rind;\n\n    void comp_extr(void) {\n      std::vector<size_t>::const_iterator it = ind->begin(), ite = ind->end();\n      if (it != ite) { first_=last_= *it; ++it; } else { first_=last_= 0; }\n      for (; it != ite; ++it) \n\t{ first_ = std::min(first_, *it); last_ = std::max(last_, *it); }\n    }\n\n    // inline void test_rind(void) const\n    //  { if (!rind) rind = index_generator::create_rindex(ind); }\n    size_type size(void) const { return ind->size(); }\n    size_type first(void) const { return first_; }\n    size_type last(void) const { return last_; }\n    size_type index(size_type i) const { return (*ind)[i]; }\n    size_type rindex(size_type i) const {\n      // test_rind();\n      if (i < rind->size()) return (*rind)[i]; else return size_type(-1);\n    }\n   \n    const_iterator  begin(void) const { return  ind->begin(); }\n    const_iterator    end(void) const { return  ind->end();   }\n    const_iterator rbegin(void) const {/*test_rind();*/ return rind->begin(); }\n    const_iterator   rend(void) const {/*test_rind();*/ return rind->end();   }\n\n    sub_index() : ind(0), rind(0) {}\n    template <typename IT> sub_index(IT it, IT ite)\n      : ind(index_generator::create_index(it, ite)),\n\trind(index_generator::create_rindex(ind)) { comp_extr(); }\n    template <typename CONT> sub_index(const CONT &c)\n      : ind(index_generator::create_index(c.begin(), c.end())),\n\trind(index_generator::create_rindex(ind))\n    { comp_extr(); }\n    ~sub_index()\n      { index_generator::unattach(rind); index_generator::unattach(ind); }\n    sub_index(const sub_index &si) : first_(si.first_), last_(si.last_),\n\t\t\t\t     ind(si.ind), rind(si.rind)\n      { index_generator::attach(rind); index_generator::attach(ind); }\n    sub_index &operator =(const sub_index &si) {\n      index_generator::unattach(rind); index_generator::unattach(ind);\n      ind = si.ind; rind = si.rind; index_generator::attach(rind);\n      index_generator::attach(ind);\n      first_ = si.first_; last_ = si.last_;\n      return *this;\n    }\n  };\n\n  struct unsorted_sub_index : public sub_index {\n    typedef basic_index base_type;\n    typedef base_type::const_iterator const_iterator;\n    \n    template <typename IT> unsorted_sub_index(IT it, IT ite)\n      : sub_index(it, ite) {}\n    template <typename CONT> unsorted_sub_index(const CONT &c)\n      : sub_index(c) {}\n    unsorted_sub_index() {}\n    unsorted_sub_index(const unsorted_sub_index &si) : sub_index((sub_index &)(si)) { }\n    unsorted_sub_index &operator =(const unsorted_sub_index &si)\n    { sub_index::operator =(si); return *this; }\n    void swap(size_type i, size_type j) {\n      GMM_ASSERT2(ind->nb_ref <= 1, \"Operation not allowed on this index\");\n      if (rind) rind->swap((*ind)[i], (*ind)[j]);\n      ind->swap(i, j);\n    }\n  };\n\n  inline std::ostream &operator << (std::ostream &o, const sub_index &si) { \n    o << \"sub_index(\";\n    if (si.size() != 0) o << si.index(0);\n    for (size_type i = 1; i < si.size(); ++i) o << \", \" << si.index(i);\n    o << \")\";\n    return o;\n  }\n\n  struct sub_interval {\n    size_type min, max; \n\n    size_type size(void) const { return max - min; }\n    size_type first(void) const { return min; }\n    size_type last(void) const { return max; }\n    size_type index(size_type i) const { return min + i; }\n    size_type step(void) const { return 1; }\n    size_type rindex(size_type i) const\n    { if (i >= min && i < max) return i - min; return size_type(-1); }\n    sub_interval(size_type mi, size_type l) : min(mi), max(mi+l) {}\n    sub_interval() {}\n  };\n\n  inline std::ostream &operator << (std::ostream &o, const sub_interval &si)\n  { o << \"sub_interval(\" << si.min << \", \" << si.size() << \")\"; return o; }\n\n  struct sub_slice {\n    size_type min, max, N;\n\n    size_type size(void) const { return (max - min) / N; }\n    size_type first(void) const { return min; }\n    size_type last(void) const { return (min == max) ? max : max+1-N; }\n    size_type step(void) const { return N; }\n    size_type index(size_type i) const { return min + N * i; }\n    size_type rindex(size_type i) const { \n      if (i >= min && i < max)\n\t{ size_type j = (i - min); if (j % N == 0) return j / N; }\n      return size_type(-1);\n    }\n    sub_slice(size_type mi, size_type l, size_type n)\n      : min(mi), max(mi+l*n), N(n) {}\n    sub_slice(void) {}\n  };\n\n  inline std::ostream &operator << (std::ostream &o, const sub_slice &si) {\n    o << \"sub_slice(\" << si.min << \", \" << si.size() << \", \" << si.step() \n      << \")\"; return o;\n  }\n\n  template<class SUBI> struct index_is_sorted\n  {  typedef linalg_true bool_type; };\n  template<> struct index_is_sorted<unsorted_sub_index>\n  {  typedef linalg_false bool_type; };\n\n}\n\n#endif //  GMM_SUB_INDEX_H__\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_sub_matrix.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2002-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n/**@file gmm_sub_matrix.h\n   @author Yves Renard <Yves.Renard@insa-lyon.fr>\n   @date October 13, 2002.\n   @brief Generic sub-matrices.\n*/\n\n#ifndef GMM_SUB_MATRIX_H__\n#define GMM_SUB_MATRIX_H__\n\n#include \"gmm_sub_vector.h\"\n\nnamespace gmm {\n\n  /* ********************************************************************* */\n  /*\t\tsub row matrices type                                      */\n  /* ********************************************************************* */\n\n  template <typename PT, typename SUBI1, typename SUBI2>\n  struct gen_sub_row_matrix {\n    typedef gen_sub_row_matrix<PT, SUBI1, SUBI2> this_type;\n    typedef typename std::iterator_traits<PT>::value_type M;\n    typedef M * CPT;\n    typedef typename std::iterator_traits<PT>::reference ref_M;\n    typedef typename select_ref<typename linalg_traits<M>\n            ::const_row_iterator, typename linalg_traits<M>::row_iterator,\n\t    PT>::ref_type iterator;\n    typedef typename linalg_traits<this_type>::reference reference;\n    typedef typename linalg_traits<this_type>::porigin_type porigin_type;\n\n    SUBI1 si1;\n    SUBI2 si2;\n    iterator begin_;\n    porigin_type origin;\n    \n    reference operator()(size_type i, size_type j) const \n    { return linalg_traits<M>::access(begin_ + si1.index(i), si2.index(j)); }\n   \n    size_type nrows(void) const { return si1.size(); }\n    size_type ncols(void) const { return si2.size(); }\n    \n    gen_sub_row_matrix(ref_M m, const SUBI1 &s1, const SUBI2 &s2)\n      : si1(s1), si2(s2), begin_(mat_row_begin(m)),\n\torigin(linalg_origin(m)) {}\n    gen_sub_row_matrix() {}\n    gen_sub_row_matrix(const gen_sub_row_matrix<CPT, SUBI1, SUBI2> &cr) :\n      si1(cr.si1), si2(cr.si2), begin_(cr.begin_),origin(cr.origin) {}\n  };\n\n  template <typename PT, typename SUBI1, typename SUBI2>\n  struct gen_sub_row_matrix_iterator {\n    typedef gen_sub_row_matrix<PT, SUBI1, SUBI2> this_type;\n    typedef typename modifiable_pointer<PT>::pointer MPT;\n    typedef typename std::iterator_traits<PT>::value_type M;\n    typedef typename select_ref<typename linalg_traits<M>\n            ::const_row_iterator, typename linalg_traits<M>::row_iterator,\n\t    PT>::ref_type ITER;\n    typedef ITER value_type;\n    typedef ITER *pointer;\n    typedef ITER &reference;\n    typedef ptrdiff_t difference_type;\n    typedef size_t size_type;\n    typedef std::random_access_iterator_tag  iterator_category;\n    typedef gen_sub_row_matrix_iterator<PT, SUBI1, SUBI2> iterator;\n\n    ITER it;\n    SUBI1 si1;\n    SUBI2 si2;\n    size_type ii;\n    \n    iterator operator ++(int) { iterator tmp = *this; ii++; return tmp; }\n    iterator operator --(int) { iterator tmp = *this; ii--; return tmp; }\n    iterator &operator ++()   { ii++; return *this; }\n    iterator &operator --()   { ii--; return *this; }\n    iterator &operator +=(difference_type i) { ii += i; return *this; }\n    iterator &operator -=(difference_type i) { ii -= i; return *this; }\n    iterator operator +(difference_type i) const \n    { iterator itt = *this; return (itt += i); }\n    iterator operator -(difference_type i) const\n    { iterator itt = *this; return (itt -= i); }\n    difference_type operator -(const iterator &i) const { return ii - i.ii; }\n\n    ITER operator *() const { return it + si1.index(ii); }\n    ITER operator [](int i) { return it + si1.index(ii+i); }\n\n    bool operator ==(const iterator &i) const { return (ii == i.ii); }\n    bool operator !=(const iterator &i) const { return !(i == *this); }\n    bool operator < (const iterator &i) const { return (ii < i.ii); }\n\n    gen_sub_row_matrix_iterator(void) {}\n    gen_sub_row_matrix_iterator(const \n\t     gen_sub_row_matrix_iterator<MPT, SUBI1, SUBI2> &itm)\n      : it(itm.it), si1(itm.si1), si2(itm.si2), ii(itm.ii) {}\n    gen_sub_row_matrix_iterator(const ITER &iter, const SUBI1 &s1,\n\t\t\t\tconst SUBI2 &s2, size_type i)\n      : it(iter), si1(s1), si2(s2), ii(i) { }\n    \n  };\n\n  template <typename PT, typename SUBI1, typename SUBI2>\n  struct linalg_traits<gen_sub_row_matrix<PT, SUBI1, SUBI2> > {\n    typedef gen_sub_row_matrix<PT, SUBI1, SUBI2> this_type;\n    typedef typename std::iterator_traits<PT>::value_type M;\n    typedef typename which_reference<PT>::is_reference is_reference;\n    typedef abstract_matrix linalg_type;\n    typedef typename linalg_traits<M>::origin_type origin_type;\n    typedef typename select_ref<const origin_type *, origin_type *,\n\t\t\t\tPT>::ref_type porigin_type;\n    typedef typename linalg_traits<M>::value_type value_type;\n    typedef typename select_ref<value_type,\n            typename linalg_traits<M>::reference, PT>::ref_type reference;\n    typedef abstract_null_type sub_col_type;\n    typedef abstract_null_type col_iterator;\n    typedef abstract_null_type const_sub_col_type;\n    typedef abstract_null_type const_col_iterator;\n    typedef typename sub_vector_type<const typename\n            linalg_traits<M>::const_sub_row_type *, SUBI2>::vector_type\n            const_sub_row_type;\n    typedef typename select_ref<abstract_null_type, \n            typename sub_vector_type<typename linalg_traits<M>::sub_row_type *,\n\t    SUBI2>::vector_type, PT>::ref_type sub_row_type;\n    typedef gen_sub_row_matrix_iterator<typename const_pointer<PT>::pointer,\n\t    SUBI1, SUBI2> const_row_iterator;\n    typedef typename select_ref<abstract_null_type, \n\t    gen_sub_row_matrix_iterator<PT, SUBI1, SUBI2>, PT>::ref_type\n            row_iterator;\n    typedef typename linalg_traits<const_sub_row_type>::storage_type\n            storage_type;\n    typedef row_major sub_orientation;\n    typedef linalg_true index_sorted;\n    static size_type nrows(const this_type &m) { return m.nrows(); }\n    static size_type ncols(const this_type &m) { return m.ncols(); }\n    static const_sub_row_type row(const const_row_iterator &it)\n    { return const_sub_row_type(linalg_traits<M>::row(*it), it.si2); }\n    static sub_row_type row(const row_iterator &it)\n    { return sub_row_type(linalg_traits<M>::row(*it), it.si2); }\n    static const_row_iterator row_begin(const this_type &m)\n    { return const_row_iterator(m.begin_, m.si1, m.si2, 0); }\n    static row_iterator row_begin(this_type &m)\n    { return row_iterator(m.begin_, m.si1, m.si2, 0); }\n    static const_row_iterator row_end(const this_type &m)\n    { return const_row_iterator(m.begin_, m.si1, m.si2,  m.nrows()); }\n    static row_iterator row_end(this_type &m)\n    { return row_iterator(m.begin_, m.si1, m.si2, m.nrows()); }\n    static origin_type* origin(this_type &v) { return v.origin; }\n    static const origin_type* origin(const this_type &v) { return v.origin; }\n    static void do_clear(this_type &m) {\n      row_iterator it = mat_row_begin(m), ite = mat_row_end(m);\n      for (; it != ite; ++it) clear(row(it));\n    }\n    static value_type access(const const_row_iterator &itrow, size_type i)\n    { return linalg_traits<M>::access(*itrow, itrow.si2.index(i)); }\n    static reference access(const row_iterator &itrow, size_type i)\n    { return linalg_traits<M>::access(*itrow, itrow.si2.index(i)); }\n  };\n  \n  template <typename PT, typename SUBI1, typename SUBI2>\n  std::ostream &operator <<(std::ostream &o,\n\t\t\t    const gen_sub_row_matrix<PT, SUBI1, SUBI2>& m)\n  { gmm::write(o,m); return o; }\n\n\n  /* ********************************************************************* */\n  /*\t\tsub column matrices type                                   */\n  /* ********************************************************************* */\n\n  template <typename PT, typename SUBI1, typename SUBI2>\n  struct gen_sub_col_matrix {\n    typedef gen_sub_col_matrix<PT, SUBI1, SUBI2> this_type;\n    typedef typename std::iterator_traits<PT>::value_type M;\n    typedef M * CPT;\n    typedef typename std::iterator_traits<PT>::reference ref_M;\n    typedef typename select_ref<typename linalg_traits<M>\n            ::const_col_iterator, typename linalg_traits<M>::col_iterator,\n\t    PT>::ref_type iterator;\n    typedef typename linalg_traits<this_type>::reference reference;\n    typedef typename linalg_traits<this_type>::porigin_type porigin_type;\n\n    SUBI1 si1;\n    SUBI2 si2;\n    iterator begin_;\n    porigin_type origin;\n    \n    reference operator()(size_type i, size_type j) const\n    { return linalg_traits<M>::access(begin_ + si2.index(j), si1.index(i)); }\n\n    size_type nrows(void) const { return si1.size(); }\n    size_type ncols(void) const { return si2.size(); }\n    \n    gen_sub_col_matrix(ref_M m, const SUBI1 &s1, const SUBI2 &s2)\n      : si1(s1), si2(s2), begin_(mat_col_begin(m)),\n        origin(linalg_origin(m)) {}\n    gen_sub_col_matrix() {}\n    gen_sub_col_matrix(const gen_sub_col_matrix<CPT, SUBI1, SUBI2> &cr) :\n      si1(cr.si1), si2(cr.si2), begin_(cr.begin_),origin(cr.origin) {}\n  };\n\n  template <typename PT, typename SUBI1, typename SUBI2>\n  struct gen_sub_col_matrix_iterator {\n    typedef gen_sub_col_matrix<PT, SUBI1, SUBI2> this_type;\n    typedef typename modifiable_pointer<PT>::pointer MPT;\n    typedef typename std::iterator_traits<PT>::value_type M;\n    typedef typename select_ref<typename linalg_traits<M>::const_col_iterator,\n\t\t\t\ttypename linalg_traits<M>::col_iterator,\n\t\t\t\tPT>::ref_type ITER;\n    typedef ITER value_type;\n    typedef ITER *pointer;\n    typedef ITER &reference;\n    typedef ptrdiff_t difference_type;\n    typedef size_t size_type;\n    typedef std::random_access_iterator_tag  iterator_category;\n    typedef gen_sub_col_matrix_iterator<PT, SUBI1, SUBI2> iterator;\n\n    ITER it;\n    SUBI1 si1;\n    SUBI2 si2;\n    size_type ii;\n    \n    iterator operator ++(int) { iterator tmp = *this; ii++; return tmp; }\n    iterator operator --(int) { iterator tmp = *this; ii--; return tmp; }\n    iterator &operator ++()   { ii++; return *this; }\n    iterator &operator --()   { ii--; return *this; }\n    iterator &operator +=(difference_type i) { ii += i; return *this; }\n    iterator &operator -=(difference_type i) { ii -= i; return *this; }\n    iterator operator +(difference_type i) const \n    { iterator itt = *this; return (itt += i); }\n    iterator operator -(difference_type i) const\n    { iterator itt = *this; return (itt -= i); }\n    difference_type operator -(const iterator &i) const { return ii - i.ii; }\n\n    ITER operator *() const { return it + si2.index(ii); }\n    ITER operator [](int i) { return it + si2.index(ii+i); }\n\n    bool operator ==(const iterator &i) const { return (ii == i.ii); }\n    bool operator !=(const iterator &i) const { return !(i == *this); }\n    bool operator < (const iterator &i) const { return (ii < i.ii); }\n\n    gen_sub_col_matrix_iterator(void) {}\n    gen_sub_col_matrix_iterator(const \n\tgen_sub_col_matrix_iterator<MPT, SUBI1, SUBI2> &itm)\n      : it(itm.it), si1(itm.si1), si2(itm.si2), ii(itm.ii) {}\n    gen_sub_col_matrix_iterator(const ITER &iter, const SUBI1 &s1,\n\t\t\t\tconst SUBI2 &s2, size_type i)\n      : it(iter), si1(s1), si2(s2), ii(i) { }\n  };\n\n  template <typename PT, typename SUBI1, typename SUBI2>\n  struct linalg_traits<gen_sub_col_matrix<PT, SUBI1, SUBI2> > {\n    typedef gen_sub_col_matrix<PT, SUBI1, SUBI2> this_type;\n    typedef typename std::iterator_traits<PT>::value_type M;\n    typedef typename linalg_traits<M>::origin_type origin_type;\n    typedef typename select_ref<const origin_type *, origin_type *,\n\t\t\t        PT>::ref_type porigin_type;\n    typedef typename which_reference<PT>::is_reference is_reference;\n    typedef abstract_matrix linalg_type;\n    typedef typename linalg_traits<M>::value_type value_type;\n    typedef typename select_ref<value_type,\n            typename linalg_traits<M>::reference, PT>::ref_type reference;\n    typedef abstract_null_type sub_row_type;\n    typedef abstract_null_type row_iterator;\n    typedef abstract_null_type const_sub_row_type;\n    typedef abstract_null_type const_row_iterator;\n    typedef typename sub_vector_type<const typename\n            linalg_traits<M>::const_sub_col_type *, SUBI1>::vector_type\n            const_sub_col_type;\n    typedef typename select_ref<abstract_null_type, \n            typename sub_vector_type<typename linalg_traits<M>::sub_col_type *,\n\t    SUBI1>::vector_type, PT>::ref_type sub_col_type;\n    typedef gen_sub_col_matrix_iterator<typename const_pointer<PT>::pointer,\n\t    SUBI1, SUBI2> const_col_iterator;\n    typedef typename select_ref<abstract_null_type, \n\t    gen_sub_col_matrix_iterator<PT, SUBI1, SUBI2>, PT>::ref_type\n            col_iterator;\n    typedef col_major sub_orientation;\n    typedef linalg_true index_sorted;\n    typedef typename linalg_traits<const_sub_col_type>::storage_type\n    storage_type;\n    static size_type nrows(const this_type &m) { return m.nrows(); }\n    static size_type ncols(const this_type &m) { return m.ncols(); }\n    static const_sub_col_type col(const const_col_iterator &it)\n    { return const_sub_col_type(linalg_traits<M>::col(*it), it.si1); }\n    static sub_col_type col(const col_iterator &it)\n    { return sub_col_type(linalg_traits<M>::col(*it), it.si1); }\n    static const_col_iterator col_begin(const this_type &m)\n    { return const_col_iterator(m.begin_, m.si1, m.si2, 0); }\n    static col_iterator col_begin(this_type &m)\n    { return col_iterator(m.begin_, m.si1, m.si2, 0); }\n    static const_col_iterator col_end(const this_type &m)\n    { return const_col_iterator(m.begin_, m.si1, m.si2,  m.ncols()); }\n    static col_iterator col_end(this_type &m)\n    { return col_iterator(m.begin_, m.si1, m.si2, m.ncols()); } \n    static origin_type* origin(this_type &v) { return v.origin; }\n    static const origin_type* origin(const this_type &v) { return v.origin; }\n    static void do_clear(this_type &m) {\n      col_iterator it = mat_col_begin(m), ite = mat_col_end(m);\n      for (; it != ite; ++it) clear(col(it));\n    }\n    static value_type access(const const_col_iterator &itcol, size_type i)\n    { return linalg_traits<M>::access(*itcol, itcol.si1.index(i)); }\n    static reference access(const col_iterator &itcol, size_type i)\n    { return linalg_traits<M>::access(*itcol, itcol.si1.index(i)); }\n  };\n\n  template <typename PT, typename SUBI1, typename SUBI2> std::ostream &operator <<\n  (std::ostream &o, const gen_sub_col_matrix<PT, SUBI1, SUBI2>& m)\n  { gmm::write(o,m); return o; }\n\n  /* ******************************************************************** */\n  /*\t\tsub matrices                                              */\n  /* ******************************************************************** */\n  \n  template <typename PT, typename SUBI1, typename SUBI2, typename ST>\n  struct sub_matrix_type_ {\n    typedef abstract_null_type return_type;\n  };\n  template <typename PT, typename SUBI1, typename SUBI2>\n  struct sub_matrix_type_<PT, SUBI1, SUBI2, col_major>\n  { typedef gen_sub_col_matrix<PT, SUBI1, SUBI2> matrix_type; };\n  template <typename PT, typename SUBI1, typename SUBI2>\n  struct sub_matrix_type_<PT, SUBI1, SUBI2, row_major>\n  { typedef gen_sub_row_matrix<PT, SUBI1, SUBI2> matrix_type; };\n  template <typename PT, typename SUBI1, typename SUBI2>\n  struct sub_matrix_type {\n    typedef typename std::iterator_traits<PT>::value_type M;\n    typedef typename sub_matrix_type_<PT, SUBI1, SUBI2,\n        typename principal_orientation_type<typename\n        linalg_traits<M>::sub_orientation>::potype>::matrix_type matrix_type;\n  };\n\n  template <typename M, typename SUBI1, typename SUBI2>  inline\n    typename select_return<typename sub_matrix_type<const M *, SUBI1, SUBI2>\n    ::matrix_type, typename sub_matrix_type<M *, SUBI1, SUBI2>::matrix_type,\n    M *>::return_type\n  sub_matrix(M &m, const SUBI1 &si1, const SUBI2 &si2) {\n    GMM_ASSERT2(si1.last() <= mat_nrows(m) && si2.last() <= mat_ncols(m),\n\t\t\"sub matrix too large\");\n    return typename select_return<typename sub_matrix_type<const M *, SUBI1,\n      SUBI2>::matrix_type, typename sub_matrix_type<M *, SUBI1, SUBI2>\n      ::matrix_type, M *>::return_type(linalg_cast(m), si1, si2);\n  }\n\n  template <typename M, typename SUBI1, typename SUBI2>  inline\n    typename select_return<typename sub_matrix_type<const M *, SUBI1, SUBI2>\n    ::matrix_type, typename sub_matrix_type<M *, SUBI1, SUBI2>::matrix_type,\n    const M *>::return_type\n  sub_matrix(const M &m, const SUBI1 &si1, const SUBI2 &si2) {\n    GMM_ASSERT2(si1.last() <= mat_nrows(m) && si2.last() <= mat_ncols(m),\n\t\t\"sub matrix too large\");\n    return typename select_return<typename sub_matrix_type<const M *, SUBI1,\n      SUBI2>::matrix_type, typename sub_matrix_type<M *, SUBI1, SUBI2>\n      ::matrix_type, const M *>::return_type(linalg_cast(m), si1, si2);\n  }\n\n  template <typename M, typename SUBI1>  inline\n    typename select_return<typename sub_matrix_type<const M *, SUBI1, SUBI1>\n    ::matrix_type, typename sub_matrix_type<M *, SUBI1, SUBI1>::matrix_type,\n    M *>::return_type\n  sub_matrix(M &m, const SUBI1 &si1) {\n    GMM_ASSERT2(si1.last() <= mat_nrows(m) && si1.last() <= mat_ncols(m),\n\t\t\"sub matrix too large\");\n    return typename select_return<typename sub_matrix_type<const M *, SUBI1,\n      SUBI1>::matrix_type, typename sub_matrix_type<M *, SUBI1, SUBI1>\n      ::matrix_type, M *>::return_type(linalg_cast(m), si1, si1);\n  }\n\n  template <typename M, typename SUBI1>  inline\n    typename select_return<typename sub_matrix_type<const M *, SUBI1, SUBI1>\n    ::matrix_type, typename sub_matrix_type<M *, SUBI1, SUBI1>::matrix_type,\n    const M *>::return_type\n  sub_matrix(const M &m, const SUBI1 &si1) {\n    GMM_ASSERT2(si1.last() <= mat_nrows(m) && si1.last() <= mat_ncols(m),\n\t\t\"sub matrix too large\");\n    return typename select_return<typename sub_matrix_type<const M *, SUBI1,\n      SUBI1>::matrix_type, typename sub_matrix_type<M *, SUBI1, SUBI1>\n      ::matrix_type, const M *>::return_type(linalg_cast(m), si1, si1);\n  }\n\n}\n\n#endif //  GMM_SUB_MATRIX_H__\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_sub_vector.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2002-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n/**@file gmm_sub_vector.h\n   @author  Yves Renard <Yves.Renard@insa-lyon.fr>\n   @date October 13, 2002.\n   @brief Generic sub-vectors.\n*/\n\n#ifndef GMM_SUB_VECTOR_H__\n#define GMM_SUB_VECTOR_H__\n\n#include \"gmm_interface.h\"\n#include \"gmm_sub_index.h\"\n\nnamespace gmm {\n\n  /* ********************************************************************* */\n  /*\t\tsparse sub-vectors                                         */\n  /* ********************************************************************* */\n\n  template <typename IT, typename MIT, typename SUBI>\n  struct sparse_sub_vector_iterator {\n\n    IT itb, itbe;\n    SUBI si;\n\n    typedef std::iterator_traits<IT>                traits_type;\n    typedef typename traits_type::value_type        value_type;\n    typedef typename traits_type::pointer           pointer;\n    typedef typename traits_type::reference         reference;\n    typedef typename traits_type::difference_type   difference_type;\n    typedef std::bidirectional_iterator_tag         iterator_category;\n    typedef size_t                                  size_type;\n    typedef sparse_sub_vector_iterator<IT, MIT, SUBI>    iterator;\n\n    size_type index(void) const { return si.rindex(itb.index()); }\n    void forward(void);\n    void backward(void);\n    iterator &operator ++()\n    { ++itb; forward(); return *this; }\n    iterator operator ++(int) { iterator tmp = *this; ++(*this); return tmp; }\n    iterator &operator --()\n    { --itb; backward(); return *this; }\n    iterator operator --(int) { iterator tmp = *this; --(*this); return tmp; }\n    reference operator *() const { return *itb; }\n\n    bool operator ==(const iterator &i) const { return itb == i.itb; }\n    bool operator !=(const iterator &i) const { return !(i == *this); }\n\n    sparse_sub_vector_iterator(void) {}\n    sparse_sub_vector_iterator(const IT &it, const IT &ite, const SUBI &s)\n      : itb(it), itbe(ite), si(s) { forward(); }\n    sparse_sub_vector_iterator(const sparse_sub_vector_iterator<MIT, MIT,\n\t SUBI> &it) : itb(it.itb), itbe(it.itbe), si(it.si) {}\n  };\n\n  template <typename IT, typename MIT, typename SUBI>\n  void  sparse_sub_vector_iterator<IT, MIT, SUBI>::forward(void)\n  { while(itb!=itbe && index()==size_type(-1)) { ++itb; } }\n\n  template <typename IT, typename MIT, typename SUBI>\n  void  sparse_sub_vector_iterator<IT, MIT, SUBI>::backward(void)\n  { while(itb!=itbe && index()==size_type(-1)) --itb; }\n\n  template <typename PT, typename SUBI> struct sparse_sub_vector {\n    typedef sparse_sub_vector<PT, SUBI> this_type;\n    typedef typename std::iterator_traits<PT>::value_type V;\n    typedef V * CPT;\n    typedef typename select_ref<typename linalg_traits<V>::const_iterator,\n            typename linalg_traits<V>::iterator, PT>::ref_type iterator;\n    typedef typename linalg_traits<this_type>::reference reference;\n    typedef typename linalg_traits<this_type>::porigin_type porigin_type;\n\n    iterator begin_, end_;\n    porigin_type origin;\n    SUBI si;\n\n    size_type size(void) const { return si.size(); }\n   \n    reference operator[](size_type i) const\n    { return linalg_traits<V>::access(origin, begin_, end_, si.index(i)); }\n\n    sparse_sub_vector(V &v, const SUBI &s) : begin_(vect_begin(v)),\n       end_(vect_end(v)), origin(linalg_origin(v)), si(s) {}\n    sparse_sub_vector(const V &v, const SUBI &s) \n      : begin_(vect_begin(const_cast<V &>(v))),\n       end_(vect_end(const_cast<V &>(v))),\n\torigin(linalg_origin(const_cast<V &>(v))), si(s) {}\n    sparse_sub_vector() {}\n    sparse_sub_vector(const sparse_sub_vector<CPT, SUBI> &cr)\n      : begin_(cr.begin_),end_(cr.end_),origin(cr.origin), si(cr.si) {} \n  };\n\n  template <typename IT, typename MIT, typename SUBI, typename ORG,\n\t    typename PT> inline\n  void set_to_begin(sparse_sub_vector_iterator<IT, MIT, SUBI> &it,\n\t\t    ORG o, sparse_sub_vector<PT, SUBI> *,\n\t\t    linalg_modifiable) {\n    typedef sparse_sub_vector<PT, SUBI> VECT;\n    typedef typename linalg_traits<VECT>::V_reference ref_t;\n    set_to_begin(it.itb, o, typename linalg_traits<VECT>::pV(), ref_t());\n    set_to_end(it.itbe, o, typename linalg_traits<VECT>::pV(), ref_t());\n    it.forward();\n  }\n  template <typename IT, typename MIT, typename SUBI, typename ORG,\n\t    typename PT> inline\n  void set_to_begin(sparse_sub_vector_iterator<IT, MIT, SUBI> &it,\n\t\t    ORG o, const sparse_sub_vector<PT, SUBI> *, \n\t\t    linalg_modifiable) {\n    typedef sparse_sub_vector<PT, SUBI> VECT;\n    typedef typename linalg_traits<VECT>::V_reference ref_t;\n    set_to_begin(it.itb, o, typename linalg_traits<VECT>::pV(), ref_t());\n    set_to_end(it.itbe, o, typename linalg_traits<VECT>::pV(), ref_t());\n    it.forward();\n  }\n  \n  template <typename IT, typename MIT, typename SUBI, typename ORG,\n\t    typename PT> inline\n  void set_to_end(sparse_sub_vector_iterator<IT, MIT, SUBI> &it,\n\t\t    ORG o, sparse_sub_vector<PT, SUBI> *, linalg_modifiable) {\n    typedef sparse_sub_vector<PT, SUBI> VECT;\n    typedef typename linalg_traits<VECT>::V_reference ref_t;\n    set_to_end(it.itb, o, typename linalg_traits<VECT>::pV(), ref_t());\n    set_to_end(it.itbe, o, typename linalg_traits<VECT>::pV(), ref_t());\n    it.forward();\n  }\n  template <typename IT, typename MIT, typename SUBI, typename ORG,\n\t    typename PT> inline\n  void set_to_end(sparse_sub_vector_iterator<IT, MIT, SUBI> &it,\n\t\t    ORG o, const sparse_sub_vector<PT, SUBI> *,\n\t\t  linalg_modifiable) {\n    typedef sparse_sub_vector<PT, SUBI> VECT;\n    typedef typename linalg_traits<VECT>::V_reference ref_t;\n    set_to_end(it.itb, o, typename linalg_traits<VECT>::pV(), ref_t());\n    set_to_end(it.itbe, o, typename linalg_traits<VECT>::pV(), ref_t());\n    it.forward();\n  }\n\n  template <typename PT, typename SUBI>\n  struct linalg_traits<sparse_sub_vector<PT, SUBI> > {\n    typedef sparse_sub_vector<PT, SUBI> this_type;\n    typedef this_type * pthis_type;\n    typedef PT pV;\n    typedef typename std::iterator_traits<PT>::value_type V;\n    typedef typename linalg_and<typename index_is_sorted<SUBI>::bool_type,\n\t    typename linalg_traits<V>::index_sorted>::bool_type index_sorted;\n    typedef typename linalg_traits<V>::is_reference V_reference;\n    typedef typename linalg_traits<V>::origin_type origin_type;\n    typedef typename select_ref<const origin_type *, origin_type *,\n\t\t\t        PT>::ref_type porigin_type;\n    typedef typename which_reference<PT>::is_reference is_reference;\n    typedef abstract_vector linalg_type;\n    typedef typename linalg_traits<V>::value_type value_type;\n    typedef typename select_ref<value_type, typename\n            linalg_traits<V>::reference, PT>::ref_type reference;\n    typedef typename select_ref<typename linalg_traits<V>::const_iterator,\n\t    typename linalg_traits<V>::iterator, PT>::ref_type pre_iterator;\n    typedef typename select_ref<abstract_null_type, \n\t    sparse_sub_vector_iterator<pre_iterator, pre_iterator, SUBI>,\n\t    PT>::ref_type iterator;\n    typedef sparse_sub_vector_iterator<typename linalg_traits<V>\n            ::const_iterator, pre_iterator, SUBI> const_iterator;\n    typedef abstract_sparse storage_type;\n    static size_type size(const this_type &v) { return v.size(); }\n    static iterator begin(this_type &v) {\n      iterator it;\n      it.itb = v.begin_; it.itbe = v.end_; it.si = v.si;\n      if (!is_const_reference(is_reference()))\n\tset_to_begin(it, v.origin, pthis_type(), is_reference());\n      else it.forward();\n      return it;\n    }\n    static const_iterator begin(const this_type &v) {\n      const_iterator it; it.itb = v.begin_; it.itbe = v.end_; it.si = v.si;\n      if (!is_const_reference(is_reference()))\n\t{ set_to_begin(it, v.origin, pthis_type(), is_reference()); }\n      else it.forward();\n      return it;\n    }\n    static iterator end(this_type &v) {\n      iterator it;\n      it.itb = v.end_; it.itbe = v.end_; it.si = v.si;\n      if (!is_const_reference(is_reference()))\n\tset_to_end(it, v.origin, pthis_type(), is_reference());\n      else it.forward();\n      return it;\n    }\n    static const_iterator end(const this_type &v) {\n      const_iterator it; it.itb = v.end_; it.itbe = v.end_; it.si = v.si;\n      if (!is_const_reference(is_reference()))\n\tset_to_end(it, v.origin, pthis_type(), is_reference());\n      else it.forward();\n      return it;\n    }\n    static origin_type* origin(this_type &v) { return v.origin; }\n    static const origin_type* origin(const this_type &v) { return v.origin; }\n    static void clear(origin_type* o, const iterator &begin_,\n\t\t      const iterator &end_) {\n      std::deque<size_type> ind;\n      iterator it = begin_;\n      for (; it != end_; ++it) ind.push_front(it.index());\n      for (; !(ind.empty()); ind.pop_back())\n\taccess(o, begin_, end_, ind.back()) = value_type(0);\n    }\n    static void do_clear(this_type &v) { clear(v.origin, begin(v), end(v)); }\n    static value_type access(const origin_type *o, const const_iterator &it,\n\t\t\t     const const_iterator &ite, size_type i)\n    { return linalg_traits<V>::access(o, it.itb, ite.itb, it.si.index(i)); }\n    static reference access(origin_type *o, const iterator &it,\n\t\t\t    const iterator &ite, size_type i)\n    { return linalg_traits<V>::access(o, it.itb, ite.itb, it.si.index(i)); }\n  };\n\n  template <typename PT, typename SUBI> std::ostream &operator <<\n  (std::ostream &o, const sparse_sub_vector<PT, SUBI>& m)\n  { gmm::write(o,m); return o; }\n\n  /* ********************************************************************* */\n  /*\t\tskyline sub-vectors                                        */\n  /* ********************************************************************* */\n\n    template <typename IT, typename MIT, typename SUBI>\n  struct skyline_sub_vector_iterator {\n\n    IT itb;\n    SUBI si;\n\n    typedef std::iterator_traits<IT>                traits_type;\n    typedef typename traits_type::value_type        value_type;\n    typedef typename traits_type::pointer           pointer;\n    typedef typename traits_type::reference         reference;\n    typedef typename traits_type::difference_type   difference_type;\n    typedef std::bidirectional_iterator_tag         iterator_category;\n    typedef size_t                                  size_type;\n    typedef skyline_sub_vector_iterator<IT, MIT, SUBI>    iterator;\n\n    size_type index(void) const\n    { return (itb.index() - si.min + si.step() - 1) / si.step(); }\n    void backward(void);\n    iterator &operator ++()\n    { itb += si.step(); return *this; }\n    iterator operator ++(int) { iterator tmp = *this; ++(*this); return tmp; }\n    iterator &operator --()\n    { itb -= si.step(); return *this; }\n    iterator operator --(int) { iterator tmp = *this; --(*this); return tmp; }\n\n    iterator &operator +=(difference_type i)\n    { itb += si.step() * i; return *this; }\n    iterator &operator -=(difference_type i)\n    { itb -= si.step() * i; return *this; }\n    iterator operator +(difference_type i) const\n    { iterator ii = *this; return (ii += i); }\n    iterator operator -(difference_type i) const\n    { iterator ii = *this; return (ii -= i); }\n    difference_type operator -(const iterator &i) const\n    { return (itb - i.itb) / si.step(); }\n\n    reference operator *() const  { return *itb; }\n    reference operator [](int ii) { return *(itb + ii * si.step());  }\n\n    bool operator ==(const iterator &i) const { return index() == i.index();}\n    bool operator !=(const iterator &i) const { return !(i == *this); }\n    bool operator < (const iterator &i) const { return index()  < i.index();}\n\n    skyline_sub_vector_iterator(void) {}\n    skyline_sub_vector_iterator(const IT &it, const SUBI &s)\n      : itb(it), si(s) {}\n    skyline_sub_vector_iterator(const skyline_sub_vector_iterator<MIT, MIT,\n\t SUBI> &it) : itb(it.itb), si(it.si) {}\n  };\n\n  template <typename IT, typename SUBI>\n  void update_for_sub_skyline(IT &it, IT &ite, const SUBI &si) {\n    if (it.index() >= si.max || ite.index() <= si.min) { it = ite; return; }\n    ptrdiff_t dec1 = si.min - it.index(), dec2 = ite.index() - si.max;\n    it  += (dec1 < 0) ? ((si.step()-((-dec1) % si.step())) % si.step()) : dec1;\n    ite -= (dec2 < 0) ? -((-dec2) % si.step()) : dec2;\n  }\n\n  template <typename PT, typename SUBI> struct skyline_sub_vector {\n    typedef skyline_sub_vector<PT, SUBI> this_type;\n    typedef typename std::iterator_traits<PT>::value_type V;\n    typedef V * pV;\n    typedef typename select_ref<typename linalg_traits<V>::const_iterator,\n            typename linalg_traits<V>::iterator, PT>::ref_type iterator;\n    typedef typename linalg_traits<this_type>::reference reference;\n    typedef typename linalg_traits<this_type>::porigin_type porigin_type;\n\n    iterator begin_, end_;\n    porigin_type origin;\n    SUBI si;\n\n    size_type size(void) const { return si.size(); }\n   \n    reference operator[](size_type i) const\n    { return linalg_traits<V>::access(origin, begin_, end_, si.index(i)); }\n\n    skyline_sub_vector(V &v, const SUBI &s) : begin_(vect_begin(v)),\n       end_(vect_end(v)), origin(linalg_origin(v)), si(s) {\n      update_for_sub_skyline(begin_, end_, si);\n    }\n    skyline_sub_vector(const V &v, const SUBI &s)\n      : begin_(vect_begin(const_cast<V &>(v))),\n\tend_(vect_end(const_cast<V &>(v))),\n\torigin(linalg_origin(const_cast<V &>(v))), si(s) {\n      update_for_sub_skyline(begin_, end_, si);\n    }\n    skyline_sub_vector() {}\n    skyline_sub_vector(const skyline_sub_vector<pV, SUBI> &cr)\n      : begin_(cr.begin_),end_(cr.end_),origin(cr.origin), si(cr.si) {}\n  };\n\n  template <typename IT, typename MIT, typename SUBI, typename ORG,\n\t    typename PT> inline\n  void set_to_begin(skyline_sub_vector_iterator<IT, MIT, SUBI> &it,\n\t\t    ORG o, skyline_sub_vector<PT, SUBI> *,\n\t\t    linalg_modifiable) {\n    typedef skyline_sub_vector<PT, SUBI> VECT;\n    typedef typename linalg_traits<VECT>::V_reference ref_t;\n    IT itbe = it.itb;\n    set_to_begin(it.itb, o, typename linalg_traits<VECT>::pV(), ref_t());\n    set_to_end(itbe, o, typename linalg_traits<VECT>::pV(), ref_t());\n    update_for_sub_skyline(it.itb, itbe, it.si);\n  }\n  template <typename IT, typename MIT, typename SUBI, typename ORG,\n\t    typename PT> inline\n  void set_to_begin(skyline_sub_vector_iterator<IT, MIT, SUBI> &it,\n\t\t    ORG o, const skyline_sub_vector<PT, SUBI> *,\n\t\t    linalg_modifiable) {\n    typedef skyline_sub_vector<PT, SUBI> VECT;\n    typedef typename linalg_traits<VECT>::V_reference ref_t;\n    IT itbe = it.itb;\n    set_to_begin(it.itb, o, typename linalg_traits<VECT>::pV(), ref_t());\n    set_to_end(itbe, o, typename linalg_traits<VECT>::pV(), ref_t());\n    update_for_sub_skyline(it.itb, itbe, it.si);\n  }\n  \n  template <typename IT, typename MIT, typename SUBI, typename ORG,\n\t    typename PT> inline\n  void set_to_end(skyline_sub_vector_iterator<IT, MIT, SUBI> &it,\n\t\t    ORG o, skyline_sub_vector<PT, SUBI> *,\n\t\t  linalg_modifiable) {\n    typedef skyline_sub_vector<PT, SUBI> VECT;\n    typedef typename linalg_traits<VECT>::V_reference ref_t;\n    IT itb = it.itb;\n    set_to_begin(itb, o, typename linalg_traits<VECT>::pV(), ref_t());\n    set_to_end(it.itb, o, typename linalg_traits<VECT>::pV(), ref_t());\n    update_for_sub_skyline(itb, it.itb, it.si);\n  }\n  template <typename IT, typename MIT, typename SUBI, typename ORG,\n\t    typename PT> inline\n  void set_to_end(skyline_sub_vector_iterator<IT, MIT, SUBI> &it,\n\t\t    ORG o, const skyline_sub_vector<PT, SUBI> *,\n\t\t  linalg_modifiable) {\n    typedef skyline_sub_vector<PT, SUBI> VECT;\n    typedef typename linalg_traits<VECT>::V_reference ref_t;\n    IT itb = it.itb;\n    set_to_begin(itb, o, typename linalg_traits<VECT>::pV(), ref_t());\n    set_to_end(it.itb, o, typename linalg_traits<VECT>::pV(), ref_t());\n    update_for_sub_skyline(itb, it.itb, it.si);   \n  }\n\n\n  template <typename PT, typename SUBI>\n  struct linalg_traits<skyline_sub_vector<PT, SUBI> > {\n    typedef skyline_sub_vector<PT, SUBI> this_type;\n    typedef this_type *pthis_type;\n    typedef typename std::iterator_traits<PT>::value_type V;\n    typedef typename linalg_traits<V>::is_reference V_reference;\n    typedef typename linalg_traits<V>::origin_type origin_type;\n    typedef typename select_ref<const origin_type *, origin_type *,\n\t\t\t        PT>::ref_type porigin_type;\n    typedef V * pV;\n    typedef typename which_reference<PT>::is_reference is_reference;\n    typedef abstract_vector linalg_type;\n    typedef typename linalg_traits<V>::value_type value_type;\n    typedef typename select_ref<value_type, typename\n            linalg_traits<V>::reference, PT>::ref_type reference;\n    typedef typename linalg_traits<V>::const_iterator const_V_iterator;\n    typedef typename linalg_traits<V>::iterator V_iterator;    \n    typedef typename select_ref<const_V_iterator, V_iterator, \n\t\t\t\tPT>::ref_type pre_iterator;\n    typedef typename select_ref<abstract_null_type, \n\t    skyline_sub_vector_iterator<pre_iterator, pre_iterator, SUBI>,\n\t    PT>::ref_type iterator;\n    typedef skyline_sub_vector_iterator<const_V_iterator, pre_iterator, SUBI>\n            const_iterator;\n    typedef abstract_skyline storage_type;\n    typedef linalg_true index_sorted;\n    static size_type size(const this_type &v) { return v.size(); }\n    static iterator begin(this_type &v) {\n      iterator it;\n      it.itb = v.begin_; it.si = v.si;\n      if (!is_const_reference(is_reference()))\n\tset_to_begin(it, v.origin, pthis_type(), is_reference());\n      return it;\n    }\n    static const_iterator begin(const this_type &v) {\n      const_iterator it; it.itb = v.begin_; it.si = v.si;\n      if (!is_const_reference(is_reference()))\n\t{ set_to_begin(it, v.origin, pthis_type(), is_reference()); }\n      return it;\n    }\n    static iterator end(this_type &v) {\n      iterator it;\n      it.itb = v.end_; it.si = v.si;\n      if (!is_const_reference(is_reference()))\n\tset_to_end(it, v.origin, pthis_type(), is_reference());\n      return it;\n    }\n    static const_iterator end(const this_type &v) {\n      const_iterator it; it.itb = v.end_; it.si = v.si;\n      if (!is_const_reference(is_reference()))\n\tset_to_end(it, v.origin, pthis_type(), is_reference());\n      return it;\n    }\n    static origin_type* origin(this_type &v) { return v.origin; }\n    static const origin_type* origin(const this_type &v) { return v.origin; }\n    static void clear(origin_type*, const iterator &it, const iterator &ite)\n    { std::fill(it, ite, value_type(0)); }\n    static void do_clear(this_type &v) { clear(v.origin, begin(v), end(v)); }\n    static value_type access(const origin_type *o, const const_iterator &it,\n\t\t\t     const const_iterator &ite, size_type i)\n    { return linalg_traits<V>::access(o, it.itb, ite.itb, it.si.index(i)); }\n    static reference access(origin_type *o, const iterator &it,\n\t\t\t    const iterator &ite, size_type i)\n    { return linalg_traits<V>::access(o, it.itb, ite.itb, it.si.index(i)); }\n  };\n\n  template <typename PT, typename SUBI> std::ostream &operator <<\n  (std::ostream &o, const skyline_sub_vector<PT, SUBI>& m)\n  { gmm::write(o,m); return o; }\n\n  /* ******************************************************************** */\n  /*\t\tsub vector.                                               */\n  /* ******************************************************************** */\n  /* sub_vector_type<PT, SUBI>::vector_type is the sub vector type        */\n  /* returned by sub_vector(v, sub_index)                                 */\n  /************************************************************************/\n\n  template <typename PT, typename SUBI, typename st_type> struct svrt_ir {\n    typedef abstract_null_type vector_type;\n  };\n\n  template <typename PT>\n  struct svrt_ir<PT, sub_index, abstract_dense> {\n    typedef typename std::iterator_traits<PT>::value_type V;\n    typedef typename vect_ref_type<PT,  V>::iterator iterator;\n    typedef tab_ref_index_ref_with_origin<iterator,\n      sub_index::const_iterator, V> vector_type;\n  }; \n\n  template <typename PT>\n  struct svrt_ir<PT, unsorted_sub_index, abstract_dense> {\n    typedef typename std::iterator_traits<PT>::value_type V;\n    typedef typename vect_ref_type<PT,  V>::iterator iterator;\n    typedef tab_ref_index_ref_with_origin<iterator,\n      unsorted_sub_index::const_iterator, V> vector_type;\n  }; \n\n  template <typename PT>\n  struct svrt_ir<PT, sub_interval, abstract_dense> {\n    typedef typename std::iterator_traits<PT>::value_type V;\n    typedef typename vect_ref_type<PT,  V>::iterator iterator;\n    typedef tab_ref_with_origin<iterator, V> vector_type;\n  }; \n\n  template <typename PT>\n  struct svrt_ir<PT, sub_slice, abstract_dense> {\n    typedef typename std::iterator_traits<PT>::value_type V;\n    typedef typename vect_ref_type<PT,  V>::iterator iterator;\n    typedef tab_ref_reg_spaced_with_origin<iterator, V> vector_type;\n  };\n\n  template <typename PT, typename SUBI>\n  struct svrt_ir<PT, SUBI, abstract_skyline> {\n    typedef skyline_sub_vector<PT, SUBI> vector_type;\n  };\n\n  template <typename PT>\n  struct svrt_ir<PT, sub_index, abstract_skyline> {\n    typedef sparse_sub_vector<PT, sub_index> vector_type;\n  };\n\n  template <typename PT>\n  struct svrt_ir<PT, unsorted_sub_index, abstract_skyline> {\n    typedef sparse_sub_vector<PT, unsorted_sub_index> vector_type;\n  };\n\n\n  template <typename PT, typename SUBI>\n  struct svrt_ir<PT, SUBI, abstract_sparse> {\n    typedef sparse_sub_vector<PT, SUBI> vector_type;\n  };\n\n  template <typename PT, typename SUBI>\n  struct sub_vector_type {\n    typedef typename std::iterator_traits<PT>::value_type V;\n    typedef typename svrt_ir<PT, SUBI,\n      typename linalg_traits<V>::storage_type>::vector_type vector_type;\n  };\n\n  template <typename V, typename SUBI>\n  typename select_return<\n    typename sub_vector_type<const V *, SUBI>::vector_type,\n    typename sub_vector_type<V *, SUBI>::vector_type, const V *>::return_type\n  sub_vector(const V &v, const SUBI &si) {\n    GMM_ASSERT2(si.last() <= vect_size(v), \"sub vector too large\");\n    return typename select_return<\n      typename sub_vector_type<const V *, SUBI>::vector_type,\n      typename sub_vector_type<V *, SUBI>::vector_type, const V *>::return_type\n      (linalg_cast(v), si);\n  }\n\n  template <typename V, typename SUBI>\n  typename select_return<\n    typename sub_vector_type<const V *, SUBI>::vector_type,\n    typename sub_vector_type<V *, SUBI>::vector_type, V *>::return_type\n  sub_vector(V &v, const SUBI &si) {\n    GMM_ASSERT2(si.last() <= vect_size(v), \"sub vector too large\");\n    return  typename select_return<\n      typename sub_vector_type<const V *, SUBI>::vector_type,\n      typename sub_vector_type<V *, SUBI>::vector_type, V *>::return_type\n      (linalg_cast(v), si);\n  }\n\n}\n\n#endif //  GMM_SUB_VECTOR_H__\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_superlu_interface.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2003-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n/**@file gmm_superlu_interface.h\n   @author  Yves Renard <Yves.Renard@insa-lyon.fr>\n   @date October 17, 2003.\n   @brief Interface with SuperLU (LU direct solver for sparse matrices).\n*/\n#if defined(GMM_USES_SUPERLU) && !defined(GETFEM_VERSION)\n\n#ifndef GMM_SUPERLU_INTERFACE_H\n#define GMM_SUPERLU_INTERFACE_H\n\n#include \"gmm_kernel.h\"\n\ntypedef int int_t;\n\n/* because SRC/util.h defines TRUE and FALSE ... */\n#ifdef TRUE\n# undef TRUE\n#endif\n#ifdef FALSE\n# undef FALSE\n#endif\n\n#include \"superlu/slu_Cnames.h\"\n#include \"superlu/supermatrix.h\"\n#include \"superlu/slu_util.h\"\n\nnamespace SuperLU_S {\n#include \"superlu/slu_sdefs.h\"\n}\nnamespace SuperLU_D {\n#include \"superlu/slu_ddefs.h\"\n}\nnamespace SuperLU_C {\n#include \"superlu/slu_cdefs.h\"\n}\nnamespace SuperLU_Z {\n#include \"superlu/slu_zdefs.h\" \n}\n\n\n\nnamespace gmm {\n\n  /*  interface for Create_CompCol_Matrix */\n\n  inline void Create_CompCol_Matrix(SuperMatrix *A, int m, int n, int nnz,\n\t\t\t     float *a, int *ir, int *jc) {\n    SuperLU_S::sCreate_CompCol_Matrix(A, m, n, nnz, a, ir, jc,\n\t\t\t\t      SLU_NC, SLU_S, SLU_GE);\n  }\n  \n  inline void Create_CompCol_Matrix(SuperMatrix *A, int m, int n, int nnz,\n\t\t\t     double *a, int *ir, int *jc) {\n    SuperLU_D::dCreate_CompCol_Matrix(A, m, n, nnz, a, ir, jc,\n\t\t\t\t      SLU_NC, SLU_D, SLU_GE);\n  }\n  \n  inline void Create_CompCol_Matrix(SuperMatrix *A, int m, int n, int nnz,\n\t\t\t     std::complex<float> *a, int *ir, int *jc) {\n    SuperLU_C::cCreate_CompCol_Matrix(A, m, n, nnz, (SuperLU_C::complex *)(a),\n\t\t\t\t      ir, jc, SLU_NC, SLU_C, SLU_GE);\n  }\n  \n  inline void Create_CompCol_Matrix(SuperMatrix *A, int m, int n, int nnz,\n\t\t\t     std::complex<double> *a, int *ir, int *jc) {\n    SuperLU_Z::zCreate_CompCol_Matrix(A, m, n, nnz,\n\t\t\t\t      (SuperLU_Z::doublecomplex *)(a), ir, jc,\n\t\t\t\t      SLU_NC, SLU_Z, SLU_GE);\n  }\n\n  /*  interface for Create_Dense_Matrix */\n\n  inline void Create_Dense_Matrix(SuperMatrix *A, int m, int n, float *a, int k)\n  { SuperLU_S::sCreate_Dense_Matrix(A, m, n, a, k, SLU_DN, SLU_S, SLU_GE); }\n  inline void Create_Dense_Matrix(SuperMatrix *A, int m, int n, double *a, int k)\n  { SuperLU_D::dCreate_Dense_Matrix(A, m, n, a, k, SLU_DN, SLU_D, SLU_GE); }\n  inline void Create_Dense_Matrix(SuperMatrix *A, int m, int n,\n\t\t\t   std::complex<float> *a, int k) {\n    SuperLU_C::cCreate_Dense_Matrix(A, m, n, (SuperLU_C::complex *)(a),\n\t\t\t\t    k, SLU_DN, SLU_C, SLU_GE);\n  }\n  inline void Create_Dense_Matrix(SuperMatrix *A, int m, int n, \n\t\t\t   std::complex<double> *a, int k) {\n    SuperLU_Z::zCreate_Dense_Matrix(A, m, n, (SuperLU_Z::doublecomplex *)(a),\n\t\t\t\t    k, SLU_DN, SLU_Z, SLU_GE);\n  }\n\n  /*  interface for gssv */\n\n#define DECL_GSSV(NAMESPACE,FNAME,FLOATTYPE,KEYTYPE) \\\n  inline void SuperLU_gssv(superlu_options_t *options, SuperMatrix *A, int *p, \\\n  int *q, SuperMatrix *L, SuperMatrix *U, SuperMatrix *B,               \\\n  SuperLUStat_t *stats, int *info, KEYTYPE) {                           \\\n  NAMESPACE::FNAME(options, A, p, q, L, U, B, stats, info);             \\\n  }\n\n  DECL_GSSV(SuperLU_S,sgssv,float,float)\n  DECL_GSSV(SuperLU_C,cgssv,float,std::complex<float>)\n  DECL_GSSV(SuperLU_D,dgssv,double,double)\n  DECL_GSSV(SuperLU_Z,zgssv,double,std::complex<double>)\n\n  /*  interface for gssvx */\n\n#define DECL_GSSVX(NAMESPACE,FNAME,FLOATTYPE,KEYTYPE) \\\n    inline float SuperLU_gssvx(superlu_options_t *options, SuperMatrix *A,\t\\\n\t\t     int *perm_c, int *perm_r, int *etree, char *equed,  \\\n\t\t     FLOATTYPE *R, FLOATTYPE *C, SuperMatrix *L,         \\\n\t\t     SuperMatrix *U, void *work, int lwork,              \\\n\t\t     SuperMatrix *B, SuperMatrix *X,                     \\\n\t\t     FLOATTYPE *recip_pivot_growth,                      \\\n\t\t     FLOATTYPE *rcond, FLOATTYPE *ferr, FLOATTYPE *berr, \\\n\t\t     SuperLUStat_t *stats, int *info, KEYTYPE) {         \\\n    NAMESPACE::mem_usage_t mem_usage;                                    \\\n    NAMESPACE::FNAME(options, A, perm_c, perm_r, etree, equed, R, C, L,  \\\n\t\t     U, work, lwork, B, X, recip_pivot_growth, rcond,    \\\n\t\t     ferr, berr, &mem_usage, stats, info);               \\\n    return mem_usage.for_lu; /* bytes used by the factor storage */     \\\n  }\n\n  DECL_GSSVX(SuperLU_S,sgssvx,float,float)\n  DECL_GSSVX(SuperLU_C,cgssvx,float,std::complex<float>)\n  DECL_GSSVX(SuperLU_D,dgssvx,double,double)\n  DECL_GSSVX(SuperLU_Z,zgssvx,double,std::complex<double>)\n\n  /* ********************************************************************* */\n  /*   SuperLU solve interface                                             */\n  /* ********************************************************************* */\n\n  template <typename MAT, typename VECTX, typename VECTB>\n  int SuperLU_solve(const MAT &A, const VECTX &X_, const VECTB &B,\n\t\t     double& rcond_, int permc_spec = 3) {\n    VECTX &X = const_cast<VECTX &>(X_);\n    /*\n     * Get column permutation vector perm_c[], according to permc_spec:\n     *   permc_spec = 0: use the natural ordering \n     *   permc_spec = 1: use minimum degree ordering on structure of A'*A\n     *   permc_spec = 2: use minimum degree ordering on structure of A'+A\n     *   permc_spec = 3: use approximate minimum degree column ordering\n     */\n    typedef typename linalg_traits<MAT>::value_type T;\n    typedef typename number_traits<T>::magnitude_type R;\n\n    int m = mat_nrows(A), n = mat_ncols(A), nrhs = 1, info = 0;\n\n    csc_matrix<T> csc_A(m, n); gmm::copy(A, csc_A);\n    std::vector<T> rhs(m), sol(m);\n    gmm::copy(B, rhs);\n\n    int nz = nnz(csc_A);\n    if ((2 * nz / n) >= m)\n      GMM_WARNING2(\"CAUTION : it seems that SuperLU has a problem\"\n\t\t  \" for nearly dense sparse matrices\");\n\n    superlu_options_t options;\n    set_default_options(&options);\n    options.ColPerm = NATURAL;\n    options.PrintStat = NO;\n    options.ConditionNumber = YES;\n    switch (permc_spec) {\n    case 1 : options.ColPerm = MMD_ATA; break;\n    case 2 : options.ColPerm = MMD_AT_PLUS_A; break;\n    case 3 : options.ColPerm = COLAMD; break;\n    }\n    SuperLUStat_t stat;\n    StatInit(&stat);\n\n    SuperMatrix SA, SL, SU, SB, SX; // SuperLU format.\n    Create_CompCol_Matrix(&SA, m, n, nz, (double *)(&(csc_A.pr[0])),\n\t\t\t  (int *)(&(csc_A.ir[0])), (int *)(&(csc_A.jc[0])));\n    Create_Dense_Matrix(&SB, m, nrhs, &rhs[0], m);\n    Create_Dense_Matrix(&SX, m, nrhs, &sol[0], m);\n    memset(&SL,0,sizeof SL);\n    memset(&SU,0,sizeof SU);\n\n    std::vector<int> etree(n);\n    char equed[] = \"B\";\n    std::vector<R> Rscale(m),Cscale(n); // row scale factors\n    std::vector<R> ferr(nrhs), berr(nrhs);\n    R recip_pivot_gross, rcond;\n    std::vector<int> perm_r(m), perm_c(n);\n\n    SuperLU_gssvx(&options, &SA, &perm_c[0], &perm_r[0], \n\t\t  &etree[0] /* output */, equed /* output         */, \n\t\t  &Rscale[0] /* row scale factors (output)        */, \n\t\t  &Cscale[0] /* col scale factors (output)        */,\n\t\t  &SL /* fact L (output)*/, &SU /* fact U (output)*/, \n\t\t  NULL /* work                                    */, \n\t\t  0 /* lwork: superlu auto allocates (input)      */, \n\t\t  &SB /* rhs */, &SX /* solution                  */,\n\t\t  &recip_pivot_gross /* reciprocal pivot growth   */\n\t\t  /* factor max_j( norm(A_j)/norm(U_j) ).         */,  \n\t\t  &rcond /*estimate of the reciprocal condition   */\n\t\t  /* number of the matrix A after equilibration   */,\n\t\t  &ferr[0] /* estimated forward error             */,\n\t\t  &berr[0] /* relative backward error             */,\n\t\t  &stat, &info, T());\n    rcond_ = rcond;\n    Destroy_SuperMatrix_Store(&SB);\n    Destroy_SuperMatrix_Store(&SX);\n    Destroy_SuperMatrix_Store(&SA);\n    Destroy_SuperNode_Matrix(&SL);\n    Destroy_CompCol_Matrix(&SU);\n    StatFree(&stat);\n    GMM_ASSERT1(info >= 0, \"SuperLU solve failed: info =\" << info);\n    if (info > 0) GMM_WARNING1(\"SuperLU solve failed: info =\" << info);\n    gmm::copy(sol, X);\n    return info;\n  }\n\n  template <class T> class SuperLU_factor {\n    typedef typename number_traits<T>::magnitude_type R;\n\n    csc_matrix<T> csc_A;\n    mutable SuperMatrix SA, SL, SB, SU, SX;\n    mutable SuperLUStat_t stat;\n    mutable superlu_options_t options;\n    float memory_used;\n    mutable std::vector<int> etree, perm_r, perm_c;\n    mutable std::vector<R> Rscale, Cscale;\n    mutable std::vector<R> ferr, berr;\n    mutable std::vector<T> rhs;\n    mutable std::vector<T> sol;\n    mutable bool is_init;\n    mutable char equed;\n\n  public :\n    enum { LU_NOTRANSP, LU_TRANSP, LU_CONJUGATED };\n    void free_supermatrix(void);\n    template <class MAT> void build_with(const MAT &A,  int permc_spec = 3);\n    template <typename VECTX, typename VECTB> \n    /* transp = LU_NOTRANSP   -> solves Ax = B\n       transp = LU_TRANSP     -> solves A'x = B\n       transp = LU_CONJUGATED -> solves conj(A)X = B */\n    void solve(const VECTX &X_, const VECTB &B, int transp=LU_NOTRANSP) const;\n    SuperLU_factor(void) { is_init = false; }\n    SuperLU_factor(const SuperLU_factor& other) {\n      GMM_ASSERT2(!(other.is_init),\n\t\t \"copy of initialized SuperLU_factor is forbidden\");\n      is_init = false;\n    }\n    SuperLU_factor& operator=(const SuperLU_factor& other) {\n      GMM_ASSERT2(!(other.is_init) && !is_init,\n\t\t  \"assignment of initialized SuperLU_factor is forbidden\");\n      return *this;\n    }\n    ~SuperLU_factor() { free_supermatrix(); }\n    float memsize() { return memory_used; }\n  };\n\n\n  template <class T> void SuperLU_factor<T>::free_supermatrix(void) {\n      if (is_init) {\n\tif (SB.Store) Destroy_SuperMatrix_Store(&SB);\n\tif (SX.Store) Destroy_SuperMatrix_Store(&SX);\n\tif (SA.Store) Destroy_SuperMatrix_Store(&SA);\n\tif (SL.Store) Destroy_SuperNode_Matrix(&SL);\n\tif (SU.Store) Destroy_CompCol_Matrix(&SU);\n      }\n    }\n\n    \n    template <class T> template <class MAT>\n    void SuperLU_factor<T>::build_with(const MAT &A,  int permc_spec) {\n    /*\n     * Get column permutation vector perm_c[], according to permc_spec:\n     *   permc_spec = 0: use the natural ordering \n     *   permc_spec = 1: use minimum degree ordering on structure of A'*A\n     *   permc_spec = 2: use minimum degree ordering on structure of A'+A\n     *   permc_spec = 3: use approximate minimum degree column ordering\n     */\n      free_supermatrix();\n      int n = mat_nrows(A), m = mat_ncols(A), info = 0;\n      csc_A.init_with(A);\n\n      rhs.resize(m); sol.resize(m);\n      gmm::clear(rhs);\n      int nz = nnz(csc_A);\n\n      set_default_options(&options);\n      options.ColPerm = NATURAL;\n      options.PrintStat = NO;\n      options.ConditionNumber = NO;\n      switch (permc_spec) {\n      case 1 : options.ColPerm = MMD_ATA; break;\n      case 2 : options.ColPerm = MMD_AT_PLUS_A; break;\n      case 3 : options.ColPerm = COLAMD; break;\n      }\n      StatInit(&stat);\n\n      Create_CompCol_Matrix(&SA, m, n, nz, (double *)(&(csc_A.pr[0])),\n\t\t\t    (int *)(&(csc_A.ir[0])), (int *)(&(csc_A.jc[0])));\n\n      Create_Dense_Matrix(&SB, m, 0, &rhs[0], m);\n      Create_Dense_Matrix(&SX, m, 0, &sol[0], m);\n      memset(&SL,0,sizeof SL);\n      memset(&SU,0,sizeof SU);\n      equed = 'B';\n      Rscale.resize(m); Cscale.resize(n); etree.resize(n);\n      ferr.resize(1); berr.resize(1);\n      R recip_pivot_gross, rcond;\n      perm_r.resize(m); perm_c.resize(n);\n      memory_used = SuperLU_gssvx(&options, &SA, &perm_c[0], &perm_r[0], \n\t\t    &etree[0] /* output */, &equed /* output        */, \n\t\t    &Rscale[0] /* row scale factors (output)        */, \n\t\t    &Cscale[0] /* col scale factors (output)        */,\n\t\t    &SL /* fact L (output)*/, &SU /* fact U (output)*/, \n\t\t    NULL /* work                                    */, \n\t\t    0 /* lwork: superlu auto allocates (input)      */, \n\t\t    &SB /* rhs */, &SX /* solution                  */,\n\t\t    &recip_pivot_gross /* reciprocal pivot growth   */\n\t\t    /* factor max_j( norm(A_j)/norm(U_j) ).         */,  \n\t\t    &rcond /*estimate of the reciprocal condition   */\n\t\t    /* number of the matrix A after equilibration   */,\n\t\t    &ferr[0] /* estimated forward error             */,\n\t\t    &berr[0] /* relative backward error             */,\n\t\t    &stat, &info, T());\n      \n      Destroy_SuperMatrix_Store(&SB);\n      Destroy_SuperMatrix_Store(&SX);\n      Create_Dense_Matrix(&SB, m, 1, &rhs[0], m);\n      Create_Dense_Matrix(&SX, m, 1, &sol[0], m);\n      StatFree(&stat);\n\n      GMM_ASSERT1(info == 0, \"SuperLU solve failed: info=\" << info);\n      is_init = true;\n    }\n    \n    template <class T> template <typename VECTX, typename VECTB> \n    void SuperLU_factor<T>::solve(const VECTX &X_, const VECTB &B,\n\t\t\t\t  int transp) const {\n      VECTX &X = const_cast<VECTX &>(X_);\n      gmm::copy(B, rhs);\n      options.Fact = FACTORED;\n      options.IterRefine = NOREFINE;\n      switch (transp) {\n      case LU_NOTRANSP: options.Trans = NOTRANS; break;\n      case LU_TRANSP: options.Trans = TRANS; break;\n      case LU_CONJUGATED: options.Trans = CONJ; break;\n      default: GMM_ASSERT1(false, \"invalid value for transposition option\");\n      }\n      StatInit(&stat);\n      int info = 0;\n      R recip_pivot_gross, rcond;\n      SuperLU_gssvx(&options, &SA, &perm_c[0], &perm_r[0], \n\t\t    &etree[0] /* output */, &equed /* output        */, \n\t\t    &Rscale[0] /* row scale factors (output)        */, \n\t\t    &Cscale[0] /* col scale factors (output)        */,\n\t\t    &SL /* fact L (output)*/, &SU /* fact U (output)*/, \n\t\t    NULL /* work                                    */, \n\t\t    0 /* lwork: superlu auto allocates (input)      */, \n\t\t    &SB /* rhs */, &SX /* solution                  */,\n\t\t    &recip_pivot_gross /* reciprocal pivot growth   */\n\t\t    /* factor max_j( norm(A_j)/norm(U_j) ).         */,  \n\t\t    &rcond /*estimate of the reciprocal condition   */\n\t\t    /* number of the matrix A after equilibration   */,\n\t\t    &ferr[0] /* estimated forward error             */,\n\t\t    &berr[0] /* relative backward error             */,\n\t\t    &stat, &info, T());\n     StatFree(&stat);\n     GMM_ASSERT1(info == 0, \"SuperLU solve failed: info=\" << info);\n     gmm::copy(sol, X);\n    }\n\n  template <typename T, typename V1, typename V2> inline\n  void mult(const SuperLU_factor<T>& P, const V1 &v1, const V2 &v2) {\n    P.solve(v2,v1);\n  }\n\n  template <typename T, typename V1, typename V2> inline\n  void transposed_mult(const SuperLU_factor<T>& P,const V1 &v1,const V2 &v2) {\n    P.solve(v2, v1, SuperLU_factor<T>::LU_TRANSP);\n  }\n\n}\n\n  \n#endif // GMM_SUPERLU_INTERFACE_H\n\n#endif // GMM_USES_SUPERLU\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_transposed.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2002-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n/**@file gmm_transposed.h\n   @author  Yves Renard <Yves.Renard@insa-lyon.fr>\n   @date November 10, 2002.\n   @brief Generic transposed matrices\n*/\n#ifndef GMM_TRANSPOSED_H__\n#define GMM_TRANSPOSED_H__\n\n#include \"gmm_def.h\"\n\nnamespace gmm {\n\n  /* ********************************************************************* */\n  /*\t\ttransposed reference                    \t\t   */\n  /* ********************************************************************* */\n  \n  template <typename PT> struct  transposed_row_ref {\n    \n    typedef transposed_row_ref<PT> this_type;\n    typedef typename std::iterator_traits<PT>::value_type M;\n    typedef M * CPT;\n    typedef typename std::iterator_traits<PT>::reference ref_M;\n    typedef typename select_ref<typename linalg_traits<this_type>\n            ::const_col_iterator, typename linalg_traits<this_type>\n            ::col_iterator, PT>::ref_type iterator;\n    typedef typename linalg_traits<this_type>::reference reference;\n    typedef typename linalg_traits<this_type>::porigin_type porigin_type;\n\n    iterator begin_, end_;\n    porigin_type origin;\n    size_type nr, nc;\n\n    transposed_row_ref(ref_M m)\n      : begin_(mat_row_begin(m)), end_(mat_row_end(m)),\n\torigin(linalg_origin(m)), nr(mat_ncols(m)), nc(mat_nrows(m)) {}\n\n    transposed_row_ref(const transposed_row_ref<CPT> &cr) :\n      begin_(cr.begin_),end_(cr.end_), origin(cr.origin),nr(cr.nr),nc(cr.nc) {}\n\n    reference operator()(size_type i, size_type j) const\n    { return linalg_traits<M>::access(begin_+j, i); }\n  };\n\n  template <typename PT> struct linalg_traits<transposed_row_ref<PT> > {\n    typedef transposed_row_ref<PT> this_type;\n    typedef typename std::iterator_traits<PT>::value_type M;\n    typedef typename linalg_traits<M>::origin_type origin_type;\n    typedef typename select_ref<const origin_type *, origin_type *,\n\t\t\t        PT>::ref_type porigin_type;\n    typedef typename which_reference<PT>::is_reference is_reference;\n    typedef abstract_matrix linalg_type;\n    typedef typename linalg_traits<M>::value_type value_type;\n    typedef typename select_ref<value_type,\n            typename linalg_traits<M>::reference, PT>::ref_type reference;\n    typedef typename linalg_traits<M>::storage_type storage_type;\n    typedef abstract_null_type sub_row_type;\n    typedef abstract_null_type const_sub_row_type;\n    typedef abstract_null_type row_iterator;\n    typedef abstract_null_type const_row_iterator;\n    typedef typename linalg_traits<M>::const_sub_row_type const_sub_col_type;\n    typedef typename select_ref<abstract_null_type, typename\n            linalg_traits<M>::sub_row_type, PT>::ref_type sub_col_type;\n    typedef typename linalg_traits<M>::const_row_iterator const_col_iterator;\n    typedef typename select_ref<abstract_null_type, typename\n            linalg_traits<M>::row_iterator, PT>::ref_type col_iterator;\n    typedef col_major sub_orientation;\n    typedef typename linalg_traits<M>::index_sorted index_sorted;\n    static size_type ncols(const this_type &v) { return v.nc; }\n    static size_type nrows(const this_type &v) { return v.nr; }\n    static const_sub_col_type col(const const_col_iterator &it)\n    { return linalg_traits<M>::row(it); }\n    static sub_col_type col(const col_iterator &it)\n    { return linalg_traits<M>::row(it); }\n    static col_iterator col_begin(this_type &m) { return m.begin_; }\n    static col_iterator col_end(this_type &m) { return m.end_; }\n    static const_col_iterator col_begin(const this_type &m)\n    { return m.begin_; }\n    static const_col_iterator col_end(const this_type &m) { return m.end_; }\n    static origin_type* origin(this_type &v) { return v.origin; }\n    static const origin_type* origin(const this_type &v) { return v.origin; }\n    static void do_clear(this_type &v);\n    static value_type access(const const_col_iterator &itcol, size_type i)\n    { return linalg_traits<M>::access(itcol, i); }\n    static reference access(const col_iterator &itcol, size_type i)\n    { return linalg_traits<M>::access(itcol, i); }\n  };\n  \n  template <typename PT> \n  void linalg_traits<transposed_row_ref<PT> >::do_clear(this_type &v) { \n    col_iterator it = mat_col_begin(v), ite = mat_col_end(v);\n    for (; it != ite; ++it) clear(col(it));\n  }\n  \n  template<typename PT> std::ostream &operator <<\n  (std::ostream &o, const transposed_row_ref<PT>& m)\n  { gmm::write(o,m); return o; }\n\n  template <typename PT> struct  transposed_col_ref {\n    \n    typedef transposed_col_ref<PT> this_type;\n    typedef typename std::iterator_traits<PT>::value_type M;\n    typedef M * CPT;\n    typedef typename std::iterator_traits<PT>::reference ref_M;\n    typedef typename select_ref<typename linalg_traits<this_type>\n            ::const_row_iterator, typename linalg_traits<this_type>\n            ::row_iterator, PT>::ref_type iterator;\n    typedef typename linalg_traits<this_type>::reference reference;\n    typedef typename linalg_traits<this_type>::porigin_type porigin_type;\n    \n    iterator begin_, end_;\n    porigin_type origin;\n    size_type nr, nc;\n\n    transposed_col_ref(ref_M m)\n      : begin_(mat_col_begin(m)), end_(mat_col_end(m)),\n\torigin(linalg_origin(m)), nr(mat_ncols(m)), nc(mat_nrows(m)) {}\n\n    transposed_col_ref(const transposed_col_ref<CPT> &cr) :\n      begin_(cr.begin_),end_(cr.end_), origin(cr.origin),nr(cr.nr),nc(cr.nc) {}\n\n    reference operator()(size_type i, size_type j) const\n    { return linalg_traits<M>::access(begin_+i, j); }\n  };\n\n  template <typename PT> struct linalg_traits<transposed_col_ref<PT> > {\n    typedef transposed_col_ref<PT> this_type;\n    typedef typename std::iterator_traits<PT>::value_type M;\n    typedef typename linalg_traits<M>::origin_type origin_type;\n    typedef typename select_ref<const origin_type *, origin_type *,\n\t\t\t        PT>::ref_type porigin_type;\n    typedef typename which_reference<PT>::is_reference is_reference;\n    typedef abstract_matrix linalg_type;\n    typedef typename linalg_traits<M>::value_type value_type;\n    typedef typename select_ref<value_type,\n            typename linalg_traits<M>::reference, PT>::ref_type reference;\n    typedef typename linalg_traits<M>::storage_type storage_type;\n    typedef abstract_null_type sub_col_type;\n    typedef abstract_null_type const_sub_col_type;\n    typedef abstract_null_type col_iterator;\n    typedef abstract_null_type const_col_iterator;\n    typedef typename linalg_traits<M>::const_sub_col_type const_sub_row_type;\n    typedef typename select_ref<abstract_null_type, typename\n            linalg_traits<M>::sub_col_type, PT>::ref_type sub_row_type;\n    typedef typename linalg_traits<M>::const_col_iterator const_row_iterator;\n    typedef typename select_ref<abstract_null_type, typename\n            linalg_traits<M>::col_iterator, PT>::ref_type row_iterator;\n    typedef row_major sub_orientation;\n    typedef typename linalg_traits<M>::index_sorted index_sorted;\n    static size_type nrows(const this_type &v)\n    { return v.nr; }\n    static size_type ncols(const this_type &v)\n    { return v.nc; }\n    static const_sub_row_type row(const const_row_iterator &it)\n    { return linalg_traits<M>::col(it); }\n    static sub_row_type row(const row_iterator &it)\n    { return linalg_traits<M>::col(it); }\n    static row_iterator row_begin(this_type &m) { return m.begin_; }\n    static row_iterator row_end(this_type &m) { return m.end_; }\n    static const_row_iterator row_begin(const this_type &m)\n    { return m.begin_; }\n    static const_row_iterator row_end(const this_type &m) { return m.end_; }\n    static origin_type* origin(this_type &v) { return v.origin; }\n    static const origin_type* origin(const this_type &v) { return v.origin; }\n    static void do_clear(this_type &m);\n    static value_type access(const const_row_iterator &itrow, size_type i)\n    { return linalg_traits<M>::access(itrow, i); }\n    static reference access(const row_iterator &itrow, size_type i)\n    { return linalg_traits<M>::access(itrow, i); }\n  };\n\n  template <typename PT> \n  void linalg_traits<transposed_col_ref<PT> >::do_clear(this_type &v) { \n    row_iterator it = mat_row_begin(v), ite = mat_row_end(v);\n    for (; it != ite; ++it) clear(row(it));\n  }\n\n  template<typename PT> std::ostream &operator <<\n  (std::ostream &o, const transposed_col_ref<PT>& m)\n  { gmm::write(o,m); return o; }\n\n  template <typename TYPE, typename PT> struct transposed_return_ {\n    typedef abstract_null_type return_type;\n  };\n  template <typename PT> struct transposed_return_<row_major, PT> {\n    typedef typename std::iterator_traits<PT>::value_type L;\n    typedef typename select_return<transposed_row_ref<const L *>,\n            transposed_row_ref< L *>, PT>::return_type return_type;\n  };\n  template <typename PT> struct transposed_return_<col_major, PT> {\n    typedef typename std::iterator_traits<PT>::value_type L;\n    typedef typename select_return<transposed_col_ref<const L *>,\n            transposed_col_ref< L *>, PT>::return_type return_type;\n  };\n  template <typename PT> struct transposed_return {\n    typedef typename std::iterator_traits<PT>::value_type L;\n    typedef typename transposed_return_<typename principal_orientation_type<\n            typename linalg_traits<L>::sub_orientation>::potype,\n\t    PT>::return_type return_type;\n  };\n\n  template <typename L> inline \n  typename transposed_return<const L *>::return_type transposed(const L &l) {\n    return typename transposed_return<const L *>::return_type\n      (linalg_cast(const_cast<L &>(l)));\n  }\n\n  template <typename L> inline \n  typename transposed_return<L *>::return_type transposed(L &l)\n  { return typename transposed_return<L *>::return_type(linalg_cast(l)); }\n\n}\n\n#endif //  GMM_TRANSPOSED_H__\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_tri_solve.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2002-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n/**@file gmm_tri_solve.h\n   @author Yves Renard\n   @date October 13, 2002.\n   @brief Solve triangular linear system for dense matrices.\n*/\n\n#ifndef GMM_TRI_SOLVE_H__\n#define GMM_TRI_SOLVE_H__\n\n#include \"gmm_interface.h\"\n\nnamespace gmm {\n\n  template <typename TriMatrix, typename VecX>\n  void upper_tri_solve__(const TriMatrix& T, VecX& x, size_t k,\n\t\t\t\tcol_major, abstract_sparse, bool is_unit) {\n    typename linalg_traits<TriMatrix>::value_type x_j;\n    for (int j = int(k) - 1; j >= 0; --j) {\n      typedef typename linalg_traits<TriMatrix>::const_sub_col_type COL;\n      COL c = mat_const_col(T, j);\n      typename linalg_traits<COL>::const_iterator \n\tit = vect_const_begin(c), ite = vect_const_end(c);\n      if (!is_unit) x[j] /= c[j];\n      for (x_j = x[j]; it != ite ; ++it)\n\tif (int(it.index()) < j) x[it.index()] -= x_j * (*it);\n    }    \n  }\n\n  template <typename TriMatrix, typename VecX>\n  void upper_tri_solve__(const TriMatrix& T, VecX& x, size_t k,\n\t\t\t\tcol_major, abstract_dense, bool is_unit) {\n    typename linalg_traits<TriMatrix>::value_type x_j;\n    for (int j = int(k) - 1; j >= 0; --j) {\n      typedef typename linalg_traits<TriMatrix>::const_sub_col_type COL;\n      COL c = mat_const_col(T, j);\n      typename linalg_traits<COL>::const_iterator\n\tit = vect_const_begin(c), ite = it + j;\n      typename linalg_traits<VecX>::iterator itx = vect_begin(x);\n      if (!is_unit) x[j] /= c[j];\n      for (x_j = x[j]; it != ite ; ++it, ++itx) *itx -= x_j * (*it);\n    }\n  }\n\n  template <typename TriMatrix, typename VecX>\n  void lower_tri_solve__(const TriMatrix& T, VecX& x, size_t k,\n\t\t\t\tcol_major, abstract_sparse, bool is_unit) {\n    typename linalg_traits<TriMatrix>::value_type x_j;\n    // cout << \"(lower col)The Tri Matrix = \" << T << endl;\n    // cout << \"k = \" << endl;\n    for (int j = 0; j < int(k); ++j) {\n      typedef typename linalg_traits<TriMatrix>::const_sub_col_type COL;\n      COL c = mat_const_col(T, j);\n      typename linalg_traits<COL>::const_iterator \n\tit = vect_const_begin(c), ite = vect_const_end(c);\n      if (!is_unit) x[j] /= c[j];\n      for (x_j = x[j]; it != ite ; ++it)\n\tif (int(it.index()) > j && it.index() < k) x[it.index()] -= x_j*(*it);\n    }    \n  }\n  \n  template <typename TriMatrix, typename VecX>\n  void lower_tri_solve__(const TriMatrix& T, VecX& x, size_t k,\n\t\t\t\tcol_major, abstract_dense, bool is_unit) {\n    typename linalg_traits<TriMatrix>::value_type x_j;\n    for (int j = 0; j < int(k); ++j) {\n      typedef typename linalg_traits<TriMatrix>::const_sub_col_type COL;\n      COL c = mat_const_col(T, j);\n      typename linalg_traits<COL>::const_iterator \n\tit = vect_const_begin(c) + (j+1), ite = vect_const_begin(c) + k;\n      typename linalg_traits<VecX>::iterator itx = vect_begin(x) + (j+1);\n      if (!is_unit) x[j] /= c[j];\n      for (x_j = x[j]; it != ite ; ++it, ++itx) *itx -= x_j * (*it);\n    }    \n  }\n  \n\n  template <typename TriMatrix, typename VecX>\n  void upper_tri_solve__(const TriMatrix& T, VecX& x, size_t k,\n\t\t\t\trow_major, abstract_sparse, bool is_unit) {\n    typedef typename linalg_traits<TriMatrix>::const_sub_row_type ROW;\n    typename linalg_traits<TriMatrix>::value_type t;\n    typename linalg_traits<TriMatrix>::const_row_iterator\n      itr = mat_row_const_end(T);\n    for (int i = int(k) - 1; i >= 0; --i) {\n      --itr;\n      ROW c = linalg_traits<TriMatrix>::row(itr);\n      typename linalg_traits<ROW>::const_iterator \n\tit = vect_const_begin(c), ite = vect_const_end(c);\n      for (t = x[i]; it != ite; ++it)\n\tif (int(it.index()) > i && it.index() < k) t -= (*it) * x[it.index()];\n      if (!is_unit) x[i] = t / c[i]; else x[i] = t;    \n    }    \n  }\n\n  template <typename TriMatrix, typename VecX>\n  void upper_tri_solve__(const TriMatrix& T, VecX& x, size_t k,\n\t\t\t\trow_major, abstract_dense, bool is_unit) {\n    typename linalg_traits<TriMatrix>::value_type t;\n   \n    for (int i = int(k) - 1; i >= 0; --i) {\n      typedef typename linalg_traits<TriMatrix>::const_sub_row_type ROW;\n      ROW c = mat_const_row(T, i);\n      typename linalg_traits<ROW>::const_iterator \n\tit = vect_const_begin(c) + (i + 1), ite = vect_const_begin(c) + k;\n      typename linalg_traits<VecX>::iterator itx = vect_begin(x) + (i+1);\n      \n      for (t = x[i]; it != ite; ++it, ++itx) t -= (*it) * (*itx);\n      if (!is_unit) x[i] = t / c[i]; else x[i] = t;   \n    }    \n  }\n\n  template <typename TriMatrix, typename VecX>\n  void lower_tri_solve__(const TriMatrix& T, VecX& x, size_t k,\n\t\t\t\trow_major, abstract_sparse, bool is_unit) {\n    typename linalg_traits<TriMatrix>::value_type t;\n   \n    for (int i = 0; i < int(k); ++i) {\n      typedef typename linalg_traits<TriMatrix>::const_sub_row_type ROW;\n      ROW c = mat_const_row(T, i);\n      typename linalg_traits<ROW>::const_iterator \n\tit = vect_const_begin(c), ite = vect_const_end(c);\n\n      for (t = x[i]; it != ite; ++it)\n\tif (int(it.index()) < i) t -= (*it) * x[it.index()];\n      if (!is_unit) x[i] = t / c[i]; else x[i] = t; \n    }    \n  }\n\n  template <typename TriMatrix, typename VecX>\n  void lower_tri_solve__(const TriMatrix& T, VecX& x, size_t k,\n\t\t\t\trow_major, abstract_dense, bool is_unit) {\n    typename linalg_traits<TriMatrix>::value_type t;\n   \n    for (int i = 0; i < int(k); ++i) {\n      typedef typename linalg_traits<TriMatrix>::const_sub_row_type ROW;\n      ROW c = mat_const_row(T, i);\n      typename linalg_traits<ROW>::const_iterator \n\tit = vect_const_begin(c), ite = it + i;\n      typename linalg_traits<VecX>::iterator itx = vect_begin(x);\n\n      for (t = x[i]; it != ite; ++it, ++itx) t -= (*it) * (*itx);\n      if (!is_unit) x[i] = t / c[i]; else x[i] = t;\n    }\n  }\n\n\n// Triangular Solve:  x <-- T^{-1} * x\n\n  template <typename TriMatrix, typename VecX> inline\n  void upper_tri_solve(const TriMatrix& T, VecX &x_, bool is_unit = false)\n  { upper_tri_solve(T, x_, mat_nrows(T), is_unit); }\n  \n  template <typename TriMatrix, typename VecX> inline\n  void lower_tri_solve(const TriMatrix& T, VecX &x_, bool is_unit = false)\n  { lower_tri_solve(T, x_, mat_nrows(T), is_unit); }\n\n  template <typename TriMatrix, typename VecX> inline\n  void upper_tri_solve(const TriMatrix& T, VecX &x_, size_t k,\n\t\t       bool is_unit) {\n    VecX& x = const_cast<VecX&>(x_);\n    GMM_ASSERT2(mat_nrows(T) >= k && vect_size(x) >= k\n\t\t&& mat_ncols(T) >= k && !is_sparse(x_), \"dimensions mismatch\");\n    upper_tri_solve__(T, x, k, \n\t\t      typename principal_orientation_type<typename\n\t\t      linalg_traits<TriMatrix>::sub_orientation>::potype(),\n\t\t      typename linalg_traits<TriMatrix>::storage_type(),\n\t\t      is_unit);\n  }\n  \n  template <typename TriMatrix, typename VecX> inline\n  void lower_tri_solve(const TriMatrix& T, VecX &x_, size_t k,\n\t\t       bool is_unit) {\n    VecX& x = const_cast<VecX&>(x_);\n    GMM_ASSERT2(mat_nrows(T) >= k && vect_size(x) >= k\n\t\t&& mat_ncols(T) >= k && !is_sparse(x_), \"dimensions mismatch\");\n    lower_tri_solve__(T, x, k, \n\t\t      typename principal_orientation_type<typename\n\t\t      linalg_traits<TriMatrix>::sub_orientation>::potype(),\n\t\t      typename linalg_traits<TriMatrix>::storage_type(),\n\t\t      is_unit);\n  }\n\n\n \n\n\n\n}\n\n\n#endif //  GMM_TRI_SOLVE_H__\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_vector.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2002-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n/**@file gmm_vector.h\n   @author  Yves Renard <Yves.Renard@insa-lyon.fr>\n   @date October 13, 2002.\n   @brief Declaration of the vector types (gmm::rsvector, gmm::wsvector,\n     gmm::slvector ,..)\n*/\n#ifndef GMM_VECTOR_H__\n#define GMM_VECTOR_H__\n\n#include <map>\n#include \"gmm_interface.h\"\n\nnamespace gmm {\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Class ref_elt_vector: reference on a vector component.                */\n  /*                                                                       */\n  /*************************************************************************/\n\n\n  template<typename T, typename V> class ref_elt_vector {\n\n    V *pm;\n    size_type l;\n    \n    public :\n\n    operator T() const { return pm->r(l); }\n    ref_elt_vector(V *p, size_type ll) : pm(p), l(ll) {}\n    inline ref_elt_vector &operator =(T v)\n      { (*pm).w(l,v); return *this; }\n    inline bool operator ==(T v) const { return ((*pm).r(l) == v); }\n    inline bool operator !=(T v) const { return ((*pm).r(l) != v); }\n    inline ref_elt_vector &operator +=(T v)\n      { (*pm).w(l,(*pm).r(l) + v); return *this; }\n    inline ref_elt_vector &operator -=(T v)\n      { (*pm).w(l,(*pm).r(l) - v); return *this; }\n    inline ref_elt_vector &operator /=(T v)\n      { (*pm).w(l,(*pm).r(l) / v); return *this; }\n    inline ref_elt_vector &operator *=(T v)\n      { (*pm).w(l,(*pm).r(l) * v); return *this; }\n    inline ref_elt_vector &operator =(const ref_elt_vector &re)\n      { *this = T(re); return *this; }\n    T operator +()    { return  T(*this);   } // necessary for unknow reason\n    T operator -()    { return -T(*this);   } // necessary for unknow reason\n    T operator +(T v) { return T(*this)+ v; } // necessary for unknow reason\n    T operator -(T v) { return T(*this)- v; } // necessary for unknow reason\n    T operator *(T v) { return T(*this)* v; } // necessary for unknow reason\n    T operator /(T v) { return T(*this)/ v; } // necessary for unknow reason\n  };  \n  \n  \n  template<typename T, typename V> inline\n  bool operator ==(T v, const ref_elt_vector<T, V> &re) { return (v==T(re)); }\n  template<typename T, typename V> inline\n  bool operator !=(T v, const ref_elt_vector<T, V> &re) { return (v!=T(re)); }\n  template<typename T, typename V> inline\n  T &operator +=(T &v, const ref_elt_vector<T, V> &re) \n  { v += T(re); return v; }\n  template<typename T, typename V> inline\n  T &operator -=(T &v, const ref_elt_vector<T, V> &re)\n  { v -= T(re); return v; }\n  template<typename T, typename V> inline\n  T &operator *=(T &v, const ref_elt_vector<T, V> &re) \n  { v *= T(re); return v; }\n  template<typename T, typename V> inline\n  T &operator /=(T &v, const ref_elt_vector<T, V> &re)\n  { v /= T(re); return v; }\n  template<typename T, typename V> inline\n  T operator +(const ref_elt_vector<T, V> &re) { return T(re); }\n  template<typename T, typename V> inline\n  T operator -(const ref_elt_vector<T, V> &re) { return -T(re); }\n  template<typename T, typename V> inline\n  T operator +(const ref_elt_vector<T, V> &re, T v) { return T(re)+ v; }\n  template<typename T, typename V> inline\n  T operator +(T v, const ref_elt_vector<T, V> &re) { return v+ T(re); }\n  template<typename T, typename V> inline\n  T operator -(const ref_elt_vector<T, V> &re, T v) { return T(re)- v; }\n  template<typename T, typename V> inline\n  T operator -(T v, const ref_elt_vector<T, V> &re) { return v- T(re); }\n  template<typename T, typename V>  inline\n  T operator *(const ref_elt_vector<T, V> &re, T v) { return T(re)* v; }\n  template<typename T, typename V> inline\n  T operator *(T v, const ref_elt_vector<T, V> &re) { return v* T(re); }\n  template<typename T, typename V> inline\n  T operator /(const ref_elt_vector<T, V> &re, T v) { return T(re)/ v; }\n  template<typename T, typename V> inline\n  T operator /(T v, const ref_elt_vector<T, V> &re) { return v/ T(re); }\n  template<typename T, typename V> inline\n  typename number_traits<T>::magnitude_type\n  abs(const ref_elt_vector<T, V> &re) { return gmm::abs(T(re)); }\n  template<typename T, typename V> inline\n  T sqr(const ref_elt_vector<T, V> &re) { return gmm::sqr(T(re)); }\n  template<typename T, typename V> inline\n  typename number_traits<T>::magnitude_type\n  abs_sqr(const ref_elt_vector<T, V> &re) { return gmm::abs_sqr(T(re)); }\n  template<typename T, typename V> inline\n  T conj(const ref_elt_vector<T, V> &re) { return gmm::conj(T(re)); }\n  template<typename T, typename V> std::ostream &operator <<\n  (std::ostream &o, const ref_elt_vector<T, V> &re) { o << T(re); return o; }\n  template<typename T, typename V> inline\n  typename number_traits<T>::magnitude_type\n  real(const ref_elt_vector<T, V> &re) { return gmm::real(T(re)); }\n  template<typename T, typename V> inline\n  typename number_traits<T>::magnitude_type\n  imag(const ref_elt_vector<T, V> &re) { return gmm::imag(T(re)); }\n\n  \n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Class wsvector: sparse vector optimized for random write operations.  */\n  /*                                                                       */\n  /*************************************************************************/\n  \n  template<typename T> struct wsvector_iterator\n    : public std::map<size_type, T>::iterator {\n    typedef typename std::map<size_type, T>::iterator base_it_type;\n    typedef T                   value_type;\n    typedef value_type*         pointer;\n    typedef value_type&         reference;\n    // typedef size_t              size_type;\n    typedef ptrdiff_t           difference_type;\n    typedef std::bidirectional_iterator_tag iterator_category;\n    \n    reference operator *() const { return (base_it_type::operator*()).second; }\n    pointer operator->() const { return &(operator*()); }\n    size_type index(void) const { return (base_it_type::operator*()).first; }\n\n    wsvector_iterator(void) {}\n    wsvector_iterator(const base_it_type &it) : base_it_type(it) {}\n  };\n\n  template<typename T> struct wsvector_const_iterator\n    : public std::map<size_type, T>::const_iterator {\n    typedef typename std::map<size_type, T>::const_iterator base_it_type;\n    typedef T                   value_type;\n    typedef const value_type*   pointer;\n    typedef const value_type&   reference;\n    // typedef size_t              size_type;\n    typedef ptrdiff_t           difference_type;\n    typedef std::bidirectional_iterator_tag iterator_category;\n    \n    reference operator *() const { return (base_it_type::operator*()).second; }\n    pointer operator->() const { return &(operator*()); }\n    size_type index(void) const { return (base_it_type::operator*()).first; }\n\n    wsvector_const_iterator(void) {}\n    wsvector_const_iterator(const wsvector_iterator<T> &it)\n      : base_it_type(it) {}\n    wsvector_const_iterator(const base_it_type &it) : base_it_type(it) {}\n  };\n\n\n  /**\n     sparse vector built upon std::map.\n     Read and write access are quite fast (log n)\n  */\n  template<typename T> class wsvector : public std::map<size_type, T> {\n  public:\n    \n    typedef typename std::map<int, T>::size_type size_type;\n    typedef std::map<size_type, T> base_type;\n    typedef typename base_type::iterator iterator;\n    typedef typename base_type::const_iterator const_iterator;\n\n  protected:\n    size_type nbl;\n    \n  public:\n    void clean(double eps);\n    void resize(size_type);\n    \n    inline ref_elt_vector<T, wsvector<T> > operator [](size_type c)\n    { return ref_elt_vector<T, wsvector<T> >(this, c); }\n\n    inline void w(size_type c, const T &e) {\n      GMM_ASSERT2(c < nbl, \"out of range\");\n      if (e == T(0)) { base_type::erase(c); }\n      else base_type::operator [](c) = e;\n    }\n\n    inline T r(size_type c) const {\n      GMM_ASSERT2(c < nbl, \"out of range\");\n      const_iterator it = this->lower_bound(c);\n      if (it != this->end() && c == it->first) return it->second;\n      else return T(0);\n    }\n\n    inline T operator [](size_type c) const { return r(c); }\n    \n    size_type nb_stored(void) const { return base_type::size(); }\n    size_type size(void) const { return nbl; }\n\n    void swap(wsvector<T> &v)\n    { std::swap(nbl, v.nbl); std::map<size_type, T>::swap(v); }\n\t\t\t\t       \n\n    /* Constructeurs */\n    void init(size_type l) { nbl = l; this->clear(); }\n    explicit wsvector(size_type l){ init(l); }\n    wsvector(void) { init(0); }\n  };\n\n  template<typename T>  void wsvector<T>::clean(double eps) {\n    iterator it = this->begin(), itf = it, ite = this->end();\n    while (it != ite) {\n      ++itf; if (gmm::abs(it->second) <= eps) erase(it); it = itf;\n    }\n  }\n\n  template<typename T>  void wsvector<T>::resize(size_type n) {\n    if (n < nbl) {\n      iterator it = this->begin(), itf = it, ite = this->end();\n      while (it != ite) { ++itf; if (it->first >= n) this->erase(it); it=itf; }\n    }\n    nbl = n;\n  }\n\n  template <typename T> struct linalg_traits<wsvector<T> > {\n    typedef wsvector<T> this_type;\n    typedef this_type origin_type;\n    typedef linalg_false is_reference;\n    typedef abstract_vector linalg_type;\n    typedef T value_type;\n    typedef ref_elt_vector<T, wsvector<T> > reference;\n    typedef wsvector_iterator<T>  iterator;\n    typedef wsvector_const_iterator<T> const_iterator;\n    typedef abstract_sparse storage_type;\n    typedef linalg_true index_sorted;\n    static size_type size(const this_type &v) { return v.size(); }\n    static iterator begin(this_type &v) { return v.begin(); }\n    static const_iterator begin(const this_type &v) { return v.begin(); }\n    static iterator end(this_type &v) { return v.end(); }\n    static const_iterator end(const this_type &v) { return v.end(); }\n    static origin_type* origin(this_type &v) { return &v; }\n    static const origin_type* origin(const this_type &v) { return &v; }\n    static void clear(origin_type* o, const iterator &, const iterator &)\n    { o->clear(); }\n    static void do_clear(this_type &v) { v.clear(); }\n    static value_type access(const origin_type *o, const const_iterator &,\n\t\t\t     const const_iterator &, size_type i)\n    { return (*o)[i]; }\n    static reference access(origin_type *o, const iterator &, const iterator &,\n\t\t\t    size_type i)\n    { return (*o)[i]; }\n    static void resize(this_type &v, size_type n) { v.resize(n); }\n  };\n\n  template<typename T> std::ostream &operator <<\n  (std::ostream &o, const wsvector<T>& v) { gmm::write(o,v); return o; }\n\n  /******* Optimized BLAS for wsvector<T> **********************************/\n\n  template <typename T> inline void copy(const wsvector<T> &v1,\n\t\t\t\t\t wsvector<T> &v2) {\n    GMM_ASSERT2(vect_size(v1) == vect_size(v2), \"dimensions mismatch\");\n    v2 = v1;\n  }\n  template <typename T> inline\n  void copy(const wsvector<T> &v1, const simple_vector_ref<wsvector<T> *> &v2){\n    simple_vector_ref<wsvector<T> *>\n      *svr = const_cast<simple_vector_ref<wsvector<T> *> *>(&v2);\n    wsvector<T>\n      *pv = const_cast<wsvector<T> *>(v2.origin);\n    GMM_ASSERT2(vect_size(v1) == vect_size(v2), \"dimensions mismatch\");\n    *pv = v1; svr->begin_ = vect_begin(*pv); svr->end_ = vect_end(*pv);\n  }\n  template <typename T> inline\n  void copy(const simple_vector_ref<const wsvector<T> *> &v1,\n\t    wsvector<T> &v2)\n  { copy(*(v1.origin), v2); }\n  template <typename T> inline\n  void copy(const simple_vector_ref<wsvector<T> *> &v1, wsvector<T> &v2)\n  { copy(*(v1.origin), v2); }\n\n  template <typename T> inline void clean(wsvector<T> &v, double eps) {\n    typedef typename number_traits<T>::magnitude_type R;\n    typename wsvector<T>::iterator it = v.begin(), ite = v.end(), itc;\n    while (it != ite) \n      if (gmm::abs((*it).second) <= R(eps))\n\t{ itc=it; ++it; v.erase(itc); } else ++it; \n  }\n\n  template <typename T>\n  inline void clean(const simple_vector_ref<wsvector<T> *> &l, double eps) {\n    simple_vector_ref<wsvector<T> *>\n      *svr = const_cast<simple_vector_ref<wsvector<T> *> *>(&l);\n    wsvector<T>\n      *pv = const_cast<wsvector<T> *>((l.origin));\n    clean(*pv, eps);\n    svr->begin_ = vect_begin(*pv); svr->end_ = vect_end(*pv);\n  }\n\n  template <typename T>\n  inline size_type nnz(const wsvector<T>& l) { return l.nb_stored(); }\n\n  /*************************************************************************/\n  /*                                                                       */\n  /*    rsvector: sparse vector optimized for linear algebra operations.   */\n  /*                                                                       */\n  /*************************************************************************/\n\n  template<typename T> struct elt_rsvector_ {\n    size_type c; T e;\n    /* e is initialized by default to avoid some false warnings of valgrind..\n       (from http://valgrind.org/docs/manual/mc-manual.html:\n      \n       When memory is read into the CPU's floating point registers, the\n       relevant V bits are read from memory and they are immediately\n       checked. If any are invalid, an uninitialised value error is\n       emitted. This precludes using the floating-point registers to copy\n       possibly-uninitialised memory, but simplifies Valgrind in that it\n       does not have to track the validity status of the floating-point\n       registers.\n    */\n    elt_rsvector_(void) : e(0) {}\n    elt_rsvector_(size_type cc) : c(cc), e(0) {}\n    elt_rsvector_(size_type cc, const T &ee) : c(cc), e(ee) {}\n    bool operator < (const elt_rsvector_ &a) const { return c < a.c; }\n    bool operator == (const elt_rsvector_ &a) const { return c == a.c; }\n    bool operator != (const elt_rsvector_ &a) const { return c != a.c; }\n  };\n\n  template<typename T> struct rsvector_iterator {\n    typedef typename std::vector<elt_rsvector_<T> >::iterator IT;\n    typedef T                   value_type;\n    typedef value_type*         pointer;\n    typedef value_type&         reference;\n    typedef size_t              size_type;\n    typedef ptrdiff_t           difference_type;\n    typedef std::bidirectional_iterator_tag iterator_category;\n    typedef rsvector_iterator<T> iterator;\n\n    IT it;\n\n    reference operator *() const { return it->e; }\n    pointer operator->() const { return &(operator*()); }\n\n    iterator &operator ++() { ++it; return *this; }\n    iterator operator ++(int) { iterator tmp = *this; ++(*this); return tmp; }\n    iterator &operator --() { --it; return *this; }\n    iterator operator --(int) { iterator tmp = *this; --(*this); return tmp; }\n\n    bool operator ==(const iterator &i) const { return it == i.it; }\n    bool operator !=(const iterator &i) const { return !(i == *this); }\n\n    size_type index(void) const { return it->c; }\n    rsvector_iterator(void) {}\n    rsvector_iterator(const IT &i) : it(i) {}\n  };\n\n  template<typename T> struct rsvector_const_iterator {\n    typedef typename std::vector<elt_rsvector_<T> >::const_iterator IT;\n    typedef T                   value_type;\n    typedef const value_type*   pointer;\n    typedef const value_type&   reference;\n    typedef size_t              size_type;\n    typedef ptrdiff_t           difference_type;\n    typedef std::forward_iterator_tag iterator_category;\n    typedef rsvector_const_iterator<T> iterator;\n\n    IT it;\n\n    reference operator *() const { return it->e; }\n    pointer operator->() const { return &(operator*()); }\n    size_type index(void) const { return it->c; }\n\n    iterator &operator ++() { ++it; return *this; }\n    iterator operator ++(int) { iterator tmp = *this; ++(*this); return tmp; }\n    iterator &operator --() { --it; return *this; }\n    iterator operator --(int) { iterator tmp = *this; --(*this); return tmp; }\n\n    bool operator ==(const iterator &i) const { return it == i.it; }\n    bool operator !=(const iterator &i) const { return !(i == *this); }\n\n    rsvector_const_iterator(void) {}\n    rsvector_const_iterator(const rsvector_iterator<T> &i) : it(i.it) {}\n    rsvector_const_iterator(const IT &i) : it(i) {}\n  };\n\n  /**\n     sparse vector built upon std::vector. Read access is fast,\n     but insertion is O(n) \n  */\n  template<typename T> class rsvector : public std::vector<elt_rsvector_<T> > {\n  public:\n    \n    typedef std::vector<elt_rsvector_<T> > base_type_;\n    typedef typename base_type_::iterator iterator;\n    typedef typename base_type_::const_iterator const_iterator;\n    typedef typename base_type_::size_type size_type;\n    typedef T value_type;\n\n  protected:\n    size_type nbl;    \t/* size of the vector.\t          \t  */\n    \n  public:\n\n    void sup(size_type j);\n    void base_resize(size_type n) { base_type_::resize(n); }\n    void resize(size_type);\n    \n    ref_elt_vector<T, rsvector<T> > operator [](size_type c)\n    { return ref_elt_vector<T, rsvector<T> >(this, c); }\n\n    void w(size_type c, const T &e);\n    T r(size_type c) const;\n    void swap_indices(size_type i, size_type j);\n\n    inline T operator [](size_type c) const { return r(c); }\n    \n    size_type nb_stored(void) const { return base_type_::size(); }\n    size_type size(void) const { return nbl; }\n    void clear(void) { base_type_::resize(0); }\n    void swap(rsvector<T> &v)\n    { std::swap(nbl, v.nbl); std::vector<elt_rsvector_<T> >::swap(v); }\n\n    /* Constructeurs */\n    explicit rsvector(size_type l) : nbl(l) { }\n    rsvector(void) : nbl(0) { }\n  };\n\n  template <typename T>\n  void rsvector<T>::swap_indices(size_type i, size_type j) {\n    if (i > j) std::swap(i, j);\n    if (i != j) {\n      int situation = 0;\n      elt_rsvector_<T> ei(i), ej(j), a;\n      iterator it, ite, iti, itj;\n      iti = std::lower_bound(this->begin(), this->end(), ei);\n      if (iti != this->end() && iti->c == i) situation += 1;\n      itj = std::lower_bound(this->begin(), this->end(), ej);\n      if (itj != this->end() && itj->c == j) situation += 2;\n\n      switch (situation) {\n      case 1 : a = *iti; a.c = j; it = iti; ++it; ite = this->end();\n\t       for (; it != ite && it->c <= j; ++it, ++iti) *iti = *it;\n\t       *iti = a;\n\t       break;\n      case 2 : a = *itj; a.c = i; it = itj; ite = this->begin();\n\tif (it != ite) {\n\t  --it;\n\t  while (it->c >= i) { *itj = *it;  --itj; if (it==ite) break; --it; }\n\t}\n\t*itj = a;\n\tbreak;\n      case 3 : std::swap(iti->e, itj->e);\n\t       break;\n      }\n    }\n  }\n\n  template <typename T> void rsvector<T>::sup(size_type j) {\n    if (nb_stored() != 0) {\n      elt_rsvector_<T> ev(j);\n      iterator it = std::lower_bound(this->begin(), this->end(), ev);\n      if (it != this->end() && it->c == j) {\n\tfor (iterator ite = this->end() - 1; it != ite; ++it) *it = *(it+1);\n\tbase_type_::resize(nb_stored()-1);\n      }\n    }\n  }\n\n  template<typename T>  void rsvector<T>::resize(size_type n) {\n    if (n < nbl) {\n      for (size_type i = 0; i < nb_stored(); ++i)\n\tif (base_type_::operator[](i).c >= n) { base_resize(i); break; }\n    }\n    nbl = n;\n  }\n\n  template <typename T> void rsvector<T>::w(size_type c, const T &e) {\n    GMM_ASSERT2(c < nbl, \"out of range\");\n    if (e == T(0)) sup(c);\n    else {\n      elt_rsvector_<T> ev(c, e);\n      if (nb_stored() == 0) {\n\tbase_type_::resize(1,ev);\n      }\n      else {\n\titerator it = std::lower_bound(this->begin(), this->end(), ev);\n\tif (it != this->end() && it->c == c) it->e = e;\n\telse {\n\t  size_type ind = it - this->begin();\n\t  base_type_::resize(nb_stored()+1, ev);\n\t  if (ind != nb_stored() - 1) {\n\t    it = this->begin() + ind;\n\t    for (iterator ite = this->end() - 1; ite != it; --ite)\n\t      *ite = *(ite-1);\n\t    *it = ev;\n\t  }\n\t}\n      }\n    }\n  }\n  \n  template <typename T> T rsvector<T>::r(size_type c) const {\n    GMM_ASSERT2(c < nbl, \"out of range\");\n    if (nb_stored() != 0) {\n      elt_rsvector_<T> ev(c);\n      const_iterator it = std::lower_bound(this->begin(), this->end(), ev);\n      if (it != this->end() && it->c == c) return it->e;\n    }\n    return T(0);\n  }\n\n  template <typename T> struct linalg_traits<rsvector<T> > {\n    typedef rsvector<T> this_type;\n    typedef this_type origin_type;\n    typedef linalg_false is_reference;\n    typedef abstract_vector linalg_type;\n    typedef T value_type;\n    typedef ref_elt_vector<T, rsvector<T> > reference;\n    typedef rsvector_iterator<T>  iterator;\n    typedef rsvector_const_iterator<T> const_iterator;\n    typedef abstract_sparse storage_type;\n    typedef linalg_true index_sorted;\n    static size_type size(const this_type &v) { return v.size(); }\n    static iterator begin(this_type &v) { return iterator(v.begin()); }\n    static const_iterator begin(const this_type &v)\n    { return const_iterator(v.begin()); }\n    static iterator end(this_type &v) { return iterator(v.end()); }\n    static const_iterator end(const this_type &v)\n      { return const_iterator(v.end()); }\n    static origin_type* origin(this_type &v) { return &v; }\n    static const origin_type* origin(const this_type &v) { return &v; }\n    static void clear(origin_type* o, const iterator &, const iterator &)\n    { o->clear(); }\n    static void do_clear(this_type &v) { v.clear(); }\n    static value_type access(const origin_type *o, const const_iterator &,\n\t\t\t     const const_iterator &, size_type i)\n    { return (*o)[i]; }\n    static reference access(origin_type *o, const iterator &, const iterator &,\n\t\t\t    size_type i)\n    { return (*o)[i]; }\n    static void resize(this_type &v, size_type n) { v.resize(n); }\n  };\n\n  template<typename T> std::ostream &operator <<\n  (std::ostream &o, const rsvector<T>& v) { gmm::write(o,v); return o; }\n\n  /******* Optimized operations for rsvector<T> ****************************/\n\n  template <typename T> inline void copy(const rsvector<T> &v1,\n \t\t\t\t\t rsvector<T> &v2) {\n    GMM_ASSERT2(vect_size(v1) == vect_size(v2), \"dimensions mismatch\");\n    v2 = v1;\n  }\n  template <typename T> inline\n  void copy(const rsvector<T> &v1, const simple_vector_ref<rsvector<T> *> &v2){\n    simple_vector_ref<rsvector<T> *>\n      *svr = const_cast<simple_vector_ref<rsvector<T> *> *>(&v2);\n    rsvector<T>\n      *pv = const_cast<rsvector<T> *>((v2.origin));\n    GMM_ASSERT2(vect_size(v1) == vect_size(v2), \"dimensions mismatch\");\n    *pv = v1; svr->begin_ = vect_begin(*pv); svr->end_ = vect_end(*pv);\n  }\n  template <typename T> inline\n  void copy(const simple_vector_ref<const rsvector<T> *> &v1,\n\t    rsvector<T> &v2)\n  { copy(*(v1.origin), v2); }\n  template <typename T> inline\n  void copy(const simple_vector_ref<rsvector<T> *> &v1, rsvector<T> &v2)\n  { copy(*(v1.origin), v2); }\n\n  template <typename V, typename T> inline void add(const V &v1,\n\t\t\t\t\t\t    rsvector<T> &v2) {\n    if ((const void *)(&v1) != (const void *)(&v2)) {\n      GMM_ASSERT2(vect_size(v1) == vect_size(v2), \"dimensions mismatch\");\n\tadd_rsvector(v1, v2, typename linalg_traits<V>::storage_type());\n    }\n  }\n\n  template <typename V, typename T> \n  inline void add_rsvector(const V &v1, rsvector<T> &v2, abstract_dense)\n  { add(v1, v2, abstract_dense(), abstract_sparse()); }\n\n  template <typename V, typename T> \n  inline void add_rsvector(const V &v1, rsvector<T> &v2, abstract_skyline)\n  { add(v1, v2, abstract_skyline(), abstract_sparse()); }\n\n  template <typename V, typename T> \n  void add_rsvector(const V &v1, rsvector<T> &v2, abstract_sparse) {\n    add_rsvector(v1, v2, typename linalg_traits<V>::index_sorted());\n  }\n\n  template <typename V, typename T> \n  void add_rsvector(const V &v1, rsvector<T> &v2, linalg_false) {\n    add(v1, v2, abstract_sparse(), abstract_sparse());\n  }\n\n  template <typename V, typename T> \n  void add_rsvector(const V &v1, rsvector<T> &v2, linalg_true) {\n    typename linalg_traits<V>::const_iterator it1 = vect_const_begin(v1),\n      ite1 = vect_const_end(v1);\n    typename rsvector<T>::iterator it2 = v2.begin(), ite2 = v2.end(), it3;\n    size_type nbc = 0, old_nbc = v2.nb_stored();\n    for (; it1 != ite1 && it2 != ite2 ; ++nbc)\n      if (it1.index() == it2->c) { ++it1; ++it2; }\n      else if (it1.index() < it2->c) ++it1; else ++it2;\n    for (; it1 != ite1; ++it1) ++nbc;\n    for (; it2 != ite2; ++it2) ++nbc;\n\n    v2.base_resize(nbc);\n    it3 = v2.begin() + old_nbc;\n    it2 = v2.end(); ite2 = v2.begin();\n    it1 = vect_end(v1); ite1 = vect_const_begin(v1);\n    while (it1 != ite1 && it3 != ite2) {\n      --it3; --it1; --it2;\n      if (it3->c > it1.index()) { *it2 = *it3; ++it1; }\n      else if (it3->c == it1.index()) { *it2=*it3; it2->e+=*it1; }\n      else { it2->c = it1.index(); it2->e = *it1; ++it3; }\n    }\n    while (it1 != ite1) { --it1; --it2; it2->c = it1.index(); it2->e = *it1; }\n  }\n\n  template <typename V, typename T> void copy(const V &v1, rsvector<T> &v2) {\n    if ((const void *)(&v1) != (const void *)(&v2)) {\n      GMM_ASSERT2(vect_size(v1) == vect_size(v2), \"dimensions mismatch\");\n      if (same_origin(v1, v2))\n\tGMM_WARNING2(\"a conflict is possible in vector copy\\n\");\n      copy_rsvector(v1, v2, typename linalg_traits<V>::storage_type());\n    }\n  }\n\n  template <typename V, typename T> \n  void copy_rsvector(const V &v1, rsvector<T> &v2, abstract_dense)\n  { copy_vect(v1, v2, abstract_dense(), abstract_sparse()); }\n\n  template <typename V, typename T> \n  void copy_rsvector(const V &v1, rsvector<T> &v2, abstract_skyline)\n  { copy_vect(v1, v2, abstract_skyline(), abstract_sparse()); }\n\n  template <typename V, typename T>\n  void copy_rsvector(const V &v1, rsvector<T> &v2, abstract_sparse) {\n    copy_rsvector(v1, v2, typename linalg_traits<V>::index_sorted());\n  }\n  \n  template <typename V, typename T2>\n  void copy_rsvector(const V &v1, rsvector<T2> &v2, linalg_true) {\n    typedef typename linalg_traits<V>::value_type T1;\n    typename linalg_traits<V>::const_iterator it = vect_const_begin(v1),\n      ite = vect_const_end(v1);\n    v2.base_resize(nnz(v1));\n    typename rsvector<T2>::iterator it2 = v2.begin();\n    size_type nn = 0;\n    for (; it != ite; ++it)\n      if ((*it) != T1(0)) { it2->c = it.index(); it2->e = *it; ++it2; ++nn; }\n    v2.base_resize(nn);\n  }\n\n  template <typename V, typename T2>\n  void copy_rsvector(const V &v1, rsvector<T2> &v2, linalg_false) {\n    typedef typename linalg_traits<V>::value_type T1;\n    typename linalg_traits<V>::const_iterator it = vect_const_begin(v1),\n      ite = vect_const_end(v1);\n    v2.base_resize(nnz(v1));\n    typename rsvector<T2>::iterator it2 = v2.begin();\n    size_type nn = 0;\n    for (; it != ite; ++it)\n      if ((*it) != T1(0)) { it2->c = it.index(); it2->e = *it; ++it2; ++nn; }\n    v2.base_resize(nn);\n    std::sort(v2.begin(), v2.end());\n  }\n  \n  template <typename T> inline void clean(rsvector<T> &v, double eps) {\n    typedef typename number_traits<T>::magnitude_type R;\n    typename rsvector<T>::iterator it = v.begin(), ite = v.end();\n    for (; it != ite; ++it) if (gmm::abs((*it).e) <= eps) break;\n    if (it != ite) {\n      typename rsvector<T>::iterator itc = it;\n      size_type erased = 1;\n      for (++it; it != ite; ++it)\n\t{ *itc = *it; if (gmm::abs((*it).e) <= R(eps)) ++erased; else ++itc; }\n      v.base_resize(v.nb_stored() - erased);\n    }\n  }\n\n  template <typename T>\n  inline void clean(const simple_vector_ref<rsvector<T> *> &l, double eps) {\n    simple_vector_ref<rsvector<T> *>\n      *svr = const_cast<simple_vector_ref<rsvector<T> *> *>(&l);\n    rsvector<T>\n      *pv = const_cast<rsvector<T> *>((l.origin));\n    clean(*pv, eps);\n    svr->begin_ = vect_begin(*pv); svr->end_ = vect_end(*pv);\n  }\n  \n  template <typename T>\n  inline size_type nnz(const rsvector<T>& l) { return l.nb_stored(); }\n\n  /*************************************************************************/\n  /*                                                                       */\n  /* Class slvector: 'sky-line' vector.                                    */\n  /*                                                                       */\n  /*************************************************************************/\n\n  template<typename T> struct slvector_iterator {\n    typedef T value_type;\n    typedef T *pointer;\n    typedef T &reference;\n    typedef ptrdiff_t difference_type;\n    typedef std::random_access_iterator_tag iterator_category;\n    typedef size_t size_type;\n    typedef slvector_iterator<T> iterator;\n    typedef typename std::vector<T>::iterator base_iterator;\n\n    base_iterator it;\n    size_type shift;\n    \n   \n    iterator &operator ++()\n    { ++it; ++shift; return *this; }\n    iterator &operator --()\n    { --it; --shift; return *this; }\n    iterator operator ++(int)\n    { iterator tmp = *this; ++(*(this)); return tmp; }\n    iterator operator --(int)\n    { iterator tmp = *this; --(*(this)); return tmp; }\n    iterator &operator +=(difference_type i)\n    { it += i; shift += i; return *this; }\n    iterator &operator -=(difference_type i)\n    { it -= i; shift -= i; return *this; }\n    iterator operator +(difference_type i) const\n    { iterator tmp = *this; return (tmp += i); }\n    iterator operator -(difference_type i) const\n    { iterator tmp = *this; return (tmp -= i); }\n    difference_type operator -(const iterator &i) const\n    { return it - i.it; }\n\t\n    reference operator *() const\n    { return *it; }\n    reference operator [](int ii)\n    { return *(it + ii); }\n    \n    bool operator ==(const iterator &i) const\n    { return it == i.it; }\n    bool operator !=(const iterator &i) const\n    { return !(i == *this); }\n    bool operator < (const iterator &i) const\n    { return it < i.it; }\n    size_type index(void) const { return shift; }\n\n    slvector_iterator(void) {}\n    slvector_iterator(const base_iterator &iter, size_type s)\n      : it(iter), shift(s) {}\n  };\n\n  template<typename T> struct slvector_const_iterator {\n    typedef T value_type;\n    typedef const T *pointer;\n    typedef value_type reference;\n    typedef ptrdiff_t difference_type;\n    typedef std::random_access_iterator_tag iterator_category;\n    typedef size_t size_type;\n    typedef slvector_const_iterator<T> iterator;\n    typedef typename std::vector<T>::const_iterator base_iterator;\n\n    base_iterator it;\n    size_type shift;\n    \n   \n    iterator &operator ++()\n    { ++it; ++shift; return *this; }\n    iterator &operator --()\n    { --it; --shift; return *this; }\n    iterator operator ++(int)\n    { iterator tmp = *this; ++(*(this)); return tmp; }\n    iterator operator --(int)\n    { iterator tmp = *this; --(*(this)); return tmp; }\n    iterator &operator +=(difference_type i)\n    { it += i; shift += i; return *this; }\n    iterator &operator -=(difference_type i)\n    { it -= i; shift -= i; return *this; }\n    iterator operator +(difference_type i) const\n    { iterator tmp = *this; return (tmp += i); }\n    iterator operator -(difference_type i) const\n    { iterator tmp = *this; return (tmp -= i); }\n    difference_type operator -(const iterator &i) const\n    { return it - i.it; }\n\t\n    value_type operator *() const\n    { return *it; }\n    value_type operator [](int ii)\n    { return *(it + ii); }\n    \n    bool operator ==(const iterator &i) const\n    { return it == i.it; }\n    bool operator !=(const iterator &i) const\n    { return !(i == *this); }\n    bool operator < (const iterator &i) const\n    { return it < i.it; }\n    size_type index(void) const { return shift; }\n\n    slvector_const_iterator(void) {}\n    slvector_const_iterator(const slvector_iterator<T>& iter)\n      : it(iter.it), shift(iter.shift) {}\n    slvector_const_iterator(const base_iterator &iter, size_type s)\n      : it(iter), shift(s) {}\n  };\n\n\n  /** skyline vector.\n   */\n  template <typename T> class slvector {\n    \n  public :\n    typedef slvector_iterator<T> iterators;\n    typedef slvector_const_iterator<T> const_iterators;\n    typedef typename std::vector<T>::size_type size_type;\n    typedef T value_type;\n\n  protected :\n    std::vector<T> data;\n    size_type shift;\n    size_type size_;\n\n\n  public :\n\n    size_type size(void) const { return size_; }\n    size_type first(void) const { return shift; }\n    size_type last(void) const { return shift + data.size(); }\n    ref_elt_vector<T, slvector<T> > operator [](size_type c)\n    { return ref_elt_vector<T, slvector<T> >(this, c); }\n\n    typename std::vector<T>::iterator data_begin(void) { return data.begin(); }\n    typename std::vector<T>::iterator data_end(void) { return data.end(); }\n    typename std::vector<T>::const_iterator data_begin(void) const\n      { return data.begin(); }\n    typename std::vector<T>::const_iterator data_end(void) const\n      { return data.end(); }\n\n    void w(size_type c, const T &e);\n    T r(size_type c) const {\n      GMM_ASSERT2(c < size_, \"out of range\");\n      if (c < shift || c >= shift + data.size()) return T(0);\n      return data[c - shift];\n    }\n\n    inline T operator [](size_type c) const { return r(c); }\n    void resize(size_type);\n    void clear(void) { data.resize(0); shift = 0; }\n    void swap(slvector<T> &v) {\n      std::swap(data, v.data);\n      std::swap(shift, v.shift);\n      std::swap(size_, v.size_);\n    }\n\n\n    slvector(void) : data(0), shift(0), size_(0) {}\n    explicit slvector(size_type l) : data(0), shift(0), size_(l) {}\n    slvector(size_type l, size_type d, size_type s)\n      : data(d), shift(s), size_(l) {}\n\n  };\n\n  template<typename T>  void slvector<T>::resize(size_type n) {\n    if (n < last()) {\n      if (shift >= n) clear(); else { data.resize(n-shift); }\n    }\n    size_ = n;\n  }\n\n  template<typename T>  void slvector<T>::w(size_type c, const T &e) {\n    GMM_ASSERT2(c < size_, \"out of range\");\n    size_type s = data.size();\n    if (!s) { data.resize(1); shift = c; }\n    else if (c < shift) {\n      data.resize(s + shift - c); \n      typename std::vector<T>::iterator it = data.begin(),it2=data.end()-1;\n      typename std::vector<T>::iterator it3 = it2 - shift + c;\n      for (; it3 >= it; --it3, --it2) *it2 = *it3;\n      std::fill(it, it + shift - c, T(0));\n      shift = c;\n    }\n    else if (c >= shift + s) {\n      data.resize(c - shift + 1);\n      std::fill(data.begin() + s, data.end(), T(0));\n    }\n    data[c - shift] = e;\n  }\n  \n  template <typename T> struct linalg_traits<slvector<T> > {\n    typedef slvector<T> this_type;\n    typedef this_type origin_type;\n    typedef linalg_false is_reference;\n    typedef abstract_vector linalg_type;\n    typedef T value_type;\n    typedef ref_elt_vector<T, slvector<T> > reference;\n    typedef slvector_iterator<T>  iterator;\n    typedef slvector_const_iterator<T> const_iterator;\n    typedef abstract_skyline storage_type;\n    typedef linalg_true index_sorted;\n    static size_type size(const this_type &v) { return v.size(); }\n    static iterator begin(this_type &v)\n      { return iterator(v.data_begin(), v.first()); }\n    static const_iterator begin(const this_type &v)\n      { return const_iterator(v.data_begin(), v.first()); }\n    static iterator end(this_type &v)\n      { return iterator(v.data_end(), v.last()); }\n    static const_iterator end(const this_type &v)\n      { return const_iterator(v.data_end(), v.last()); }\n    static origin_type* origin(this_type &v) { return &v; }\n    static const origin_type* origin(const this_type &v) { return &v; }\n    static void clear(origin_type* o, const iterator &, const iterator &)\n    { o->clear(); }\n    static void do_clear(this_type &v) { v.clear(); }\n    static value_type access(const origin_type *o, const const_iterator &,\n\t\t\t     const const_iterator &, size_type i)\n    { return (*o)[i]; }\n    static reference access(origin_type *o, const iterator &, const iterator &,\n\t\t\t    size_type i)\n    { return (*o)[i]; }\n    static void resize(this_type &v, size_type n) { v.resize(n); }\n  };\n\n  template<typename T> std::ostream &operator <<\n  (std::ostream &o, const slvector<T>& v) { gmm::write(o,v); return o; }\n\n  template <typename T>\n  inline size_type nnz(const slvector<T>& l) { return l.last() - l.first(); }\n\n}\n\nnamespace std {\n  template <typename T> void swap(gmm::wsvector<T> &v, gmm::wsvector<T> &w)\n  { v.swap(w);}\n  template <typename T> void swap(gmm::rsvector<T> &v, gmm::rsvector<T> &w)\n  { v.swap(w);}\n  template <typename T> void swap(gmm::slvector<T> &v, gmm::slvector<T> &w)\n  { v.swap(w);}\n}\n\n\n\n#endif /* GMM_VECTOR_H__ */\n"
  },
  {
    "path": "libs/CoMISo/gmm/include/gmm/gmm_vector_to_matrix.h",
    "content": "/* -*- c++ -*- (enables emacs c++ mode) */\n/*===========================================================================\n \n Copyright (C) 2003-2012 Yves Renard\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n As a special exception, you  may use  this file  as it is a part of a free\n software  library  without  restriction.  Specifically,  if   other  files\n instantiate  templates  or  use macros or inline functions from this file,\n or  you compile this  file  and  link  it  with other files  to produce an\n executable, this file  does  not  by itself cause the resulting executable\n to be covered  by the GNU Lesser General Public License.  This   exception\n does not  however  invalidate  any  other  reasons why the executable file\n might be covered by the GNU Lesser General Public License.\n \n===========================================================================*/\n\n/**@file gmm_vector_to_matrix.h\n   @author  Yves Renard <Yves.Renard@insa-lyon.fr>\n   @date December 6, 2003.\n   @brief View vectors as row or column matrices. */\n#ifndef GMM_VECTOR_TO_MATRIX_H__\n#define GMM_VECTOR_TO_MATRIX_H__\n\n#include \"gmm_interface.h\"\n\nnamespace gmm {\n\n  /* ********************************************************************* */\n  /*\t     row vector -> transform a vector in a (1, n) matrix.          */\n  /* ********************************************************************* */\n\n  template <typename PT> struct gen_row_vector {\n    typedef gen_row_vector<PT> this_type;\n    typedef typename std::iterator_traits<PT>::value_type V;\n    typedef V * CPT;\n    typedef typename std::iterator_traits<PT>::reference ref_V;\n    typedef typename linalg_traits<this_type>::reference reference;\n\n    simple_vector_ref<PT> vec;\n    \n    reference operator()(size_type, size_type j) const { return vec[j]; }\n   \n    size_type nrows(void) const { return 1; }\n    size_type ncols(void) const { return vect_size(vec); }\n    \n    gen_row_vector(ref_V v) : vec(v) {}\n    gen_row_vector() {}\n    gen_row_vector(const gen_row_vector<CPT> &cr) : vec(cr.vec) {}\n  };\n\n  template <typename PT>\n  struct gen_row_vector_iterator {\n    typedef gen_row_vector<PT> this_type;\n    typedef typename modifiable_pointer<PT>::pointer MPT;\n    typedef typename std::iterator_traits<PT>::value_type V;\n    typedef simple_vector_ref<PT> value_type;\n    typedef const simple_vector_ref<PT> *pointer;\n    typedef const simple_vector_ref<PT> &reference;\n    typedef ptrdiff_t difference_type;\n    typedef size_t size_type;\n    typedef std::random_access_iterator_tag  iterator_category;\n    typedef gen_row_vector_iterator<PT> iterator;\n\n    simple_vector_ref<PT> vec;\n    bool isend;\n    \n    iterator &operator ++()   { isend = true; return *this; }\n    iterator &operator --()   { isend = false; return *this; }\n    iterator operator ++(int) { iterator tmp = *this; ++(*this); return tmp; }\n    iterator operator --(int) { iterator tmp = *this; --(*this); return tmp; }\n    iterator &operator +=(difference_type i)\n    { if (i) isend = false; return *this; }\n    iterator &operator -=(difference_type i)\n    { if (i) isend = true; return *this;  }\n    iterator operator +(difference_type i) const \n    { iterator itt = *this; return (itt += i); }\n    iterator operator -(difference_type i) const\n    { iterator itt = *this; return (itt -= i); }\n    difference_type operator -(const iterator &i) const { \n      return (isend == true) ? ((i.isend == true) ? 0 : 1)\n\t                     : ((i.isend == true) ? -1 : 0);\n    }\n\n    const simple_vector_ref<PT>& operator *() const { return vec; }\n    const simple_vector_ref<PT>& operator [](int i) { return vec; }\n\n    bool operator ==(const iterator &i) const { return (isend == i.isend); }\n    bool operator !=(const iterator &i) const { return !(i == *this); }\n    bool operator < (const iterator &i) const { return (*this - i < 0); }\n\n    gen_row_vector_iterator(void) {}\n    gen_row_vector_iterator(const gen_row_vector_iterator<MPT> &itm)\n      : vec(itm.vec), isend(itm.isend) {}\n    gen_row_vector_iterator(const gen_row_vector<PT> &m, bool iis_end)\n      : vec(m.vec), isend(iis_end) { }\n    \n  };\n\n  template <typename PT>\n  struct linalg_traits<gen_row_vector<PT> > {\n    typedef gen_row_vector<PT> this_type;\n    typedef typename std::iterator_traits<PT>::value_type V;\n    typedef typename which_reference<PT>::is_reference is_reference;\n    typedef abstract_matrix linalg_type;\n    typedef typename linalg_traits<V>::origin_type origin_type;\n    typedef typename select_ref<const origin_type *, origin_type *,\n\t\t\t\tPT>::ref_type porigin_type;\n    typedef typename linalg_traits<V>::value_type value_type;\n    typedef typename select_ref<value_type,\n            typename linalg_traits<V>::reference, PT>::ref_type reference;\n    typedef abstract_null_type sub_col_type;\n    typedef abstract_null_type col_iterator;\n    typedef abstract_null_type const_sub_col_type;\n    typedef abstract_null_type const_col_iterator;\n    typedef simple_vector_ref<const V *> const_sub_row_type;\n    typedef typename select_ref<abstract_null_type, \n            simple_vector_ref<V *>, PT>::ref_type sub_row_type;\n    typedef gen_row_vector_iterator<typename const_pointer<PT>::pointer>\n            const_row_iterator;\n    typedef typename select_ref<abstract_null_type, \n\t    gen_row_vector_iterator<PT>, PT>::ref_type row_iterator;\n    typedef typename linalg_traits<V>::storage_type storage_type;\n    typedef row_major sub_orientation;\n    typedef typename linalg_traits<V>::index_sorted index_sorted;\n    static size_type nrows(const this_type &) { return 1; }\n    static size_type ncols(const this_type &m) { return m.ncols(); }\n    static const_sub_row_type row(const const_row_iterator &it) { return *it; }\n    static sub_row_type row(const row_iterator &it) { return *it; }\n    static const_row_iterator row_begin(const this_type &m)\n    { return const_row_iterator(m, false); }\n    static row_iterator row_begin(this_type &m)\n    { return row_iterator(m, false); }\n    static const_row_iterator row_end(const this_type &m)\n    { return const_row_iterator(m, true); }\n    static row_iterator row_end(this_type &m)\n    { return row_iterator(m, true); }\n    static origin_type* origin(this_type &m) { return m.vec.origin; }\n    static const origin_type* origin(const this_type &m)\n    { return m.vec.origin; }\n    static void do_clear(this_type &m)\n    { clear(row(mat_row_begin(m))); }\n    static value_type access(const const_row_iterator &itrow, size_type i)\n    { return itrow.vec[i]; }\n    static reference access(const row_iterator &itrow, size_type i)\n    { return itrow.vec[i]; }\n  };\n  \n  template <typename PT>\n  std::ostream &operator <<(std::ostream &o, const gen_row_vector<PT>& m)\n  { gmm::write(o,m); return o; }\n\n  /* ********************************************************************* */\n  /*\t     col vector -> transform a vector in a (n, 1) matrix.          */\n  /* ********************************************************************* */\n\n  template <typename PT> struct gen_col_vector {\n    typedef gen_col_vector<PT> this_type;\n    typedef typename std::iterator_traits<PT>::value_type V;\n    typedef V * CPT;\n    typedef typename std::iterator_traits<PT>::reference ref_V;\n    typedef typename linalg_traits<this_type>::reference reference;\n\n    simple_vector_ref<PT> vec;\n    \n    reference operator()(size_type i, size_type) const { return vec[i]; }\n   \n    size_type ncols(void) const { return 1; }\n    size_type nrows(void) const { return vect_size(vec); }\n    \n    gen_col_vector(ref_V v) : vec(v) {}\n    gen_col_vector() {}\n    gen_col_vector(const gen_col_vector<CPT> &cr) : vec(cr.vec) {}\n  };\n\n  template <typename PT>\n  struct gen_col_vector_iterator {\n    typedef gen_col_vector<PT> this_type;\n    typedef typename modifiable_pointer<PT>::pointer MPT;\n    typedef typename std::iterator_traits<PT>::value_type V;\n    typedef simple_vector_ref<PT> value_type;\n    typedef const simple_vector_ref<PT> *pointer;\n    typedef const simple_vector_ref<PT> &reference;\n    typedef ptrdiff_t difference_type;\n    typedef size_t size_type;\n    typedef std::random_access_iterator_tag  iterator_category;\n    typedef gen_col_vector_iterator<PT> iterator;\n\n    simple_vector_ref<PT> vec;\n    bool isend;\n    \n    iterator &operator ++()   { isend = true; return *this; }\n    iterator &operator --()   { isend = false; return *this; }\n    iterator operator ++(int) { iterator tmp = *this; ++(*this); return tmp; }\n    iterator operator --(int) { iterator tmp = *this; --(*this); return tmp; }\n    iterator &operator +=(difference_type i)\n    { if (i) isend = false; return *this; }\n    iterator &operator -=(difference_type i)\n    { if (i) isend = true; return *this;  }\n    iterator operator +(difference_type i) const \n    { iterator itt = *this; return (itt += i); }\n    iterator operator -(difference_type i) const\n    { iterator itt = *this; return (itt -= i); }\n    difference_type operator -(const iterator &i) const { \n      return (isend == true) ? ((i.isend == true) ? 0 : 1)\n\t                     : ((i.isend == true) ? -1 : 0);\n    }\n\n    const simple_vector_ref<PT>& operator *() const { return vec; }\n    const simple_vector_ref<PT>& operator [](int i) { return vec; }\n\n    bool operator ==(const iterator &i) const { return (isend == i.isend); }\n    bool operator !=(const iterator &i) const { return !(i == *this); }\n    bool operator < (const iterator &i) const { return (*this - i < 0); }\n\n    gen_col_vector_iterator(void) {}\n    gen_col_vector_iterator(const gen_col_vector_iterator<MPT> &itm)\n      : vec(itm.vec), isend(itm.isend) {}\n    gen_col_vector_iterator(const gen_col_vector<PT> &m, bool iis_end)\n      : vec(m.vec), isend(iis_end) { }\n    \n  };\n\n  template <typename PT>\n  struct linalg_traits<gen_col_vector<PT> > {\n    typedef gen_col_vector<PT> this_type;\n    typedef typename std::iterator_traits<PT>::value_type V;\n    typedef typename which_reference<PT>::is_reference is_reference;\n    typedef abstract_matrix linalg_type;\n    typedef typename linalg_traits<V>::origin_type origin_type;\n    typedef typename select_ref<const origin_type *, origin_type *,\n\t\t\t\tPT>::ref_type porigin_type;\n    typedef typename linalg_traits<V>::value_type value_type;\n    typedef typename select_ref<value_type,\n            typename linalg_traits<V>::reference, PT>::ref_type reference;\n    typedef abstract_null_type sub_row_type;\n    typedef abstract_null_type row_iterator;\n    typedef abstract_null_type const_sub_row_type;\n    typedef abstract_null_type const_row_iterator;\n    typedef simple_vector_ref<const V *> const_sub_col_type;\n    typedef typename select_ref<abstract_null_type, \n            simple_vector_ref<V *>, PT>::ref_type sub_col_type;\n    typedef gen_col_vector_iterator<typename const_pointer<PT>::pointer>\n            const_col_iterator;\n    typedef typename select_ref<abstract_null_type, \n\t    gen_col_vector_iterator<PT>, PT>::ref_type col_iterator;\n    typedef typename linalg_traits<V>::storage_type storage_type;\n    typedef col_major sub_orientation;\n    typedef typename linalg_traits<V>::index_sorted index_sorted;\n    static size_type ncols(const this_type &) { return 1; }\n    static size_type nrows(const this_type &m) { return m.nrows(); }\n    static const_sub_col_type col(const const_col_iterator &it) { return *it; }\n    static sub_col_type col(const col_iterator &it) { return *it; }\n    static const_col_iterator col_begin(const this_type &m)\n    { return const_col_iterator(m, false); }\n    static col_iterator col_begin(this_type &m)\n    { return col_iterator(m, false); }\n    static const_col_iterator col_end(const this_type &m)\n    { return const_col_iterator(m, true); }\n    static col_iterator col_end(this_type &m)\n    { return col_iterator(m, true); }\n    static origin_type* origin(this_type &m) { return m.vec.origin; }\n    static const origin_type* origin(const this_type &m)\n    { return m.vec.origin; }\n    static void do_clear(this_type &m)\n    { clear(col(mat_col_begin(m))); }\n    static value_type access(const const_col_iterator &itcol, size_type i)\n    { return itcol.vec[i]; }\n    static reference access(const col_iterator &itcol, size_type i)\n    { return itcol.vec[i]; }\n  };\n  \n  template <typename PT>\n  std::ostream &operator <<(std::ostream &o, const gen_col_vector<PT>& m)\n  { gmm::write(o,m); return o; }\n\n  /* ******************************************************************** */\n  /*\t\tcol and row vectors                                       */\n  /* ******************************************************************** */\n\n  \n  template <class V> inline\n  typename select_return< gen_row_vector<const V *>, gen_row_vector<V *>,\n\t\t\t  const V *>::return_type\n  row_vector(const V& v) {\n    return typename select_return< gen_row_vector<const V *>,\n      gen_row_vector<V *>, const V *>::return_type(linalg_cast(v));\n  }\n\n  template <class V> inline\n  typename select_return< gen_row_vector<const V *>, gen_row_vector<V *>,\n\t\t\t  V *>::return_type\n  row_vector(V& v) {\n    return typename select_return< gen_row_vector<const V *>,\n      gen_row_vector<V *>, V *>::return_type(linalg_cast(v));\n  }\n \n  template <class V> inline gen_row_vector<const V *>\n  const_row_vector(V& v)\n  { return gen_row_vector<const V *>(v); }\n \n\n  template <class V> inline\n  typename select_return< gen_col_vector<const V *>, gen_col_vector<V *>,\n\t\t\t  const V *>::return_type\n  col_vector(const V& v) {\n    return typename select_return< gen_col_vector<const V *>,\n      gen_col_vector<V *>, const V *>::return_type(linalg_cast(v));\n  }\n\n  template <class V> inline\n  typename select_return< gen_col_vector<const V *>, gen_col_vector<V *>,\n\t\t\t  V *>::return_type\n  col_vector(V& v) {\n    return typename select_return< gen_col_vector<const V *>,\n      gen_col_vector<V *>, V *>::return_type(linalg_cast(v));\n  }\n \n  template <class V> inline gen_col_vector<const V *>\n  const_col_vector(V& v)\n  { return gen_col_vector<const V *>(v); }\n \n\n}\n\n#endif //  GMM_VECTOR_TO_MATRIX_H__\n"
  },
  {
    "path": "libs/CoMISo/gmm/install-sh",
    "content": "#!/bin/sh\n# install - install a program, script, or datafile\n\nscriptversion=2011-01-19.21; # UTC\n\n# This originates from X11R5 (mit/util/scripts/install.sh), which was\n# later released in X11R6 (xc/config/util/install.sh) with the\n# following copyright and license.\n#\n# Copyright (C) 1994 X Consortium\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\n# deal in the Software without restriction, including without limitation the\n# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n# sell copies of the Software, and to permit persons to whom the Software is\n# furnished to do so, subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be included in\n# all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE\n# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN\n# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-\n# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n#\n# Except as contained in this notice, the name of the X Consortium shall not\n# be used in advertising or otherwise to promote the sale, use or other deal-\n# ings in this Software without prior written authorization from the X Consor-\n# tium.\n#\n#\n# FSF changes to this file are in the public domain.\n#\n# Calling this script install-sh is preferred over install.sh, to prevent\n# `make' implicit rules from creating a file called install from it\n# when there is no Makefile.\n#\n# This script is compatible with the BSD install script, but was written\n# from scratch.\n\nnl='\n'\nIFS=\" \"\"\t$nl\"\n\n# set DOITPROG to echo to test this script\n\n# Don't use :- since 4.3BSD and earlier shells don't like it.\ndoit=${DOITPROG-}\nif test -z \"$doit\"; then\n  doit_exec=exec\nelse\n  doit_exec=$doit\nfi\n\n# Put in absolute file names if you don't have them in your path;\n# or use environment vars.\n\nchgrpprog=${CHGRPPROG-chgrp}\nchmodprog=${CHMODPROG-chmod}\nchownprog=${CHOWNPROG-chown}\ncmpprog=${CMPPROG-cmp}\ncpprog=${CPPROG-cp}\nmkdirprog=${MKDIRPROG-mkdir}\nmvprog=${MVPROG-mv}\nrmprog=${RMPROG-rm}\nstripprog=${STRIPPROG-strip}\n\nposix_glob='?'\ninitialize_posix_glob='\n  test \"$posix_glob\" != \"?\" || {\n    if (set -f) 2>/dev/null; then\n      posix_glob=\n    else\n      posix_glob=:\n    fi\n  }\n'\n\nposix_mkdir=\n\n# Desired mode of installed file.\nmode=0755\n\nchgrpcmd=\nchmodcmd=$chmodprog\nchowncmd=\nmvcmd=$mvprog\nrmcmd=\"$rmprog -f\"\nstripcmd=\n\nsrc=\ndst=\ndir_arg=\ndst_arg=\n\ncopy_on_change=false\nno_target_directory=\n\nusage=\"\\\nUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE\n   or: $0 [OPTION]... SRCFILES... DIRECTORY\n   or: $0 [OPTION]... -t DIRECTORY SRCFILES...\n   or: $0 [OPTION]... -d DIRECTORIES...\n\nIn the 1st form, copy SRCFILE to DSTFILE.\nIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY.\nIn the 4th, create DIRECTORIES.\n\nOptions:\n     --help     display this help and exit.\n     --version  display version info and exit.\n\n  -c            (ignored)\n  -C            install only if different (preserve the last data modification time)\n  -d            create directories instead of installing files.\n  -g GROUP      $chgrpprog installed files to GROUP.\n  -m MODE       $chmodprog installed files to MODE.\n  -o USER       $chownprog installed files to USER.\n  -s            $stripprog installed files.\n  -t DIRECTORY  install into DIRECTORY.\n  -T            report an error if DSTFILE is a directory.\n\nEnvironment variables override the default commands:\n  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG\n  RMPROG STRIPPROG\n\"\n\nwhile test $# -ne 0; do\n  case $1 in\n    -c) ;;\n\n    -C) copy_on_change=true;;\n\n    -d) dir_arg=true;;\n\n    -g) chgrpcmd=\"$chgrpprog $2\"\n\tshift;;\n\n    --help) echo \"$usage\"; exit $?;;\n\n    -m) mode=$2\n\tcase $mode in\n\t  *' '* | *'\t'* | *'\n'*\t  | *'*'* | *'?'* | *'['*)\n\t    echo \"$0: invalid mode: $mode\" >&2\n\t    exit 1;;\n\tesac\n\tshift;;\n\n    -o) chowncmd=\"$chownprog $2\"\n\tshift;;\n\n    -s) stripcmd=$stripprog;;\n\n    -t) dst_arg=$2\n\t# Protect names problematic for `test' and other utilities.\n\tcase $dst_arg in\n\t  -* | [=\\(\\)!]) dst_arg=./$dst_arg;;\n\tesac\n\tshift;;\n\n    -T) no_target_directory=true;;\n\n    --version) echo \"$0 $scriptversion\"; exit $?;;\n\n    --)\tshift\n\tbreak;;\n\n    -*)\techo \"$0: invalid option: $1\" >&2\n\texit 1;;\n\n    *)  break;;\n  esac\n  shift\ndone\n\nif test $# -ne 0 && test -z \"$dir_arg$dst_arg\"; then\n  # When -d is used, all remaining arguments are directories to create.\n  # When -t is used, the destination is already specified.\n  # Otherwise, the last argument is the destination.  Remove it from $@.\n  for arg\n  do\n    if test -n \"$dst_arg\"; then\n      # $@ is not empty: it contains at least $arg.\n      set fnord \"$@\" \"$dst_arg\"\n      shift # fnord\n    fi\n    shift # arg\n    dst_arg=$arg\n    # Protect names problematic for `test' and other utilities.\n    case $dst_arg in\n      -* | [=\\(\\)!]) dst_arg=./$dst_arg;;\n    esac\n  done\nfi\n\nif test $# -eq 0; then\n  if test -z \"$dir_arg\"; then\n    echo \"$0: no input file specified.\" >&2\n    exit 1\n  fi\n  # It's OK to call `install-sh -d' without argument.\n  # This can happen when creating conditional directories.\n  exit 0\nfi\n\nif test -z \"$dir_arg\"; then\n  do_exit='(exit $ret); exit $ret'\n  trap \"ret=129; $do_exit\" 1\n  trap \"ret=130; $do_exit\" 2\n  trap \"ret=141; $do_exit\" 13\n  trap \"ret=143; $do_exit\" 15\n\n  # Set umask so as not to create temps with too-generous modes.\n  # However, 'strip' requires both read and write access to temps.\n  case $mode in\n    # Optimize common cases.\n    *644) cp_umask=133;;\n    *755) cp_umask=22;;\n\n    *[0-7])\n      if test -z \"$stripcmd\"; then\n\tu_plus_rw=\n      else\n\tu_plus_rw='% 200'\n      fi\n      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;\n    *)\n      if test -z \"$stripcmd\"; then\n\tu_plus_rw=\n      else\n\tu_plus_rw=,u+rw\n      fi\n      cp_umask=$mode$u_plus_rw;;\n  esac\nfi\n\nfor src\ndo\n  # Protect names problematic for `test' and other utilities.\n  case $src in\n    -* | [=\\(\\)!]) src=./$src;;\n  esac\n\n  if test -n \"$dir_arg\"; then\n    dst=$src\n    dstdir=$dst\n    test -d \"$dstdir\"\n    dstdir_status=$?\n  else\n\n    # Waiting for this to be detected by the \"$cpprog $src $dsttmp\" command\n    # might cause directories to be created, which would be especially bad\n    # if $src (and thus $dsttmp) contains '*'.\n    if test ! -f \"$src\" && test ! -d \"$src\"; then\n      echo \"$0: $src does not exist.\" >&2\n      exit 1\n    fi\n\n    if test -z \"$dst_arg\"; then\n      echo \"$0: no destination specified.\" >&2\n      exit 1\n    fi\n    dst=$dst_arg\n\n    # If destination is a directory, append the input filename; won't work\n    # if double slashes aren't ignored.\n    if test -d \"$dst\"; then\n      if test -n \"$no_target_directory\"; then\n\techo \"$0: $dst_arg: Is a directory\" >&2\n\texit 1\n      fi\n      dstdir=$dst\n      dst=$dstdir/`basename \"$src\"`\n      dstdir_status=0\n    else\n      # Prefer dirname, but fall back on a substitute if dirname fails.\n      dstdir=`\n\t(dirname \"$dst\") 2>/dev/null ||\n\texpr X\"$dst\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t     X\"$dst\" : 'X\\(//\\)[^/]' \\| \\\n\t     X\"$dst\" : 'X\\(//\\)$' \\| \\\n\t     X\"$dst\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n\techo X\"$dst\" |\n\t    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t\t   s//\\1/\n\t\t   q\n\t\t }\n\t\t /^X\\(\\/\\/\\)[^/].*/{\n\t\t   s//\\1/\n\t\t   q\n\t\t }\n\t\t /^X\\(\\/\\/\\)$/{\n\t\t   s//\\1/\n\t\t   q\n\t\t }\n\t\t /^X\\(\\/\\).*/{\n\t\t   s//\\1/\n\t\t   q\n\t\t }\n\t\t s/.*/./; q'\n      `\n\n      test -d \"$dstdir\"\n      dstdir_status=$?\n    fi\n  fi\n\n  obsolete_mkdir_used=false\n\n  if test $dstdir_status != 0; then\n    case $posix_mkdir in\n      '')\n\t# Create intermediate dirs using mode 755 as modified by the umask.\n\t# This is like FreeBSD 'install' as of 1997-10-28.\n\tumask=`umask`\n\tcase $stripcmd.$umask in\n\t  # Optimize common cases.\n\t  *[2367][2367]) mkdir_umask=$umask;;\n\t  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;\n\n\t  *[0-7])\n\t    mkdir_umask=`expr $umask + 22 \\\n\t      - $umask % 100 % 40 + $umask % 20 \\\n\t      - $umask % 10 % 4 + $umask % 2\n\t    `;;\n\t  *) mkdir_umask=$umask,go-w;;\n\tesac\n\n\t# With -d, create the new directory with the user-specified mode.\n\t# Otherwise, rely on $mkdir_umask.\n\tif test -n \"$dir_arg\"; then\n\t  mkdir_mode=-m$mode\n\telse\n\t  mkdir_mode=\n\tfi\n\n\tposix_mkdir=false\n\tcase $umask in\n\t  *[123567][0-7][0-7])\n\t    # POSIX mkdir -p sets u+wx bits regardless of umask, which\n\t    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.\n\t    ;;\n\t  *)\n\t    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$\n\t    trap 'ret=$?; rmdir \"$tmpdir/d\" \"$tmpdir\" 2>/dev/null; exit $ret' 0\n\n\t    if (umask $mkdir_umask &&\n\t\texec $mkdirprog $mkdir_mode -p -- \"$tmpdir/d\") >/dev/null 2>&1\n\t    then\n\t      if test -z \"$dir_arg\" || {\n\t\t   # Check for POSIX incompatibilities with -m.\n\t\t   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or\n\t\t   # other-writeable bit of parent directory when it shouldn't.\n\t\t   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.\n\t\t   ls_ld_tmpdir=`ls -ld \"$tmpdir\"`\n\t\t   case $ls_ld_tmpdir in\n\t\t     d????-?r-*) different_mode=700;;\n\t\t     d????-?--*) different_mode=755;;\n\t\t     *) false;;\n\t\t   esac &&\n\t\t   $mkdirprog -m$different_mode -p -- \"$tmpdir\" && {\n\t\t     ls_ld_tmpdir_1=`ls -ld \"$tmpdir\"`\n\t\t     test \"$ls_ld_tmpdir\" = \"$ls_ld_tmpdir_1\"\n\t\t   }\n\t\t }\n\t      then posix_mkdir=:\n\t      fi\n\t      rmdir \"$tmpdir/d\" \"$tmpdir\"\n\t    else\n\t      # Remove any dirs left behind by ancient mkdir implementations.\n\t      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null\n\t    fi\n\t    trap '' 0;;\n\tesac;;\n    esac\n\n    if\n      $posix_mkdir && (\n\tumask $mkdir_umask &&\n\t$doit_exec $mkdirprog $mkdir_mode -p -- \"$dstdir\"\n      )\n    then :\n    else\n\n      # The umask is ridiculous, or mkdir does not conform to POSIX,\n      # or it failed possibly due to a race condition.  Create the\n      # directory the slow way, step by step, checking for races as we go.\n\n      case $dstdir in\n\t/*) prefix='/';;\n\t[-=\\(\\)!]*) prefix='./';;\n\t*)  prefix='';;\n      esac\n\n      eval \"$initialize_posix_glob\"\n\n      oIFS=$IFS\n      IFS=/\n      $posix_glob set -f\n      set fnord $dstdir\n      shift\n      $posix_glob set +f\n      IFS=$oIFS\n\n      prefixes=\n\n      for d\n      do\n\ttest X\"$d\" = X && continue\n\n\tprefix=$prefix$d\n\tif test -d \"$prefix\"; then\n\t  prefixes=\n\telse\n\t  if $posix_mkdir; then\n\t    (umask=$mkdir_umask &&\n\t     $doit_exec $mkdirprog $mkdir_mode -p -- \"$dstdir\") && break\n\t    # Don't fail if two instances are running concurrently.\n\t    test -d \"$prefix\" || exit 1\n\t  else\n\t    case $prefix in\n\t      *\\'*) qprefix=`echo \"$prefix\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;;\n\t      *) qprefix=$prefix;;\n\t    esac\n\t    prefixes=\"$prefixes '$qprefix'\"\n\t  fi\n\tfi\n\tprefix=$prefix/\n      done\n\n      if test -n \"$prefixes\"; then\n\t# Don't fail if two instances are running concurrently.\n\t(umask $mkdir_umask &&\n\t eval \"\\$doit_exec \\$mkdirprog $prefixes\") ||\n\t  test -d \"$dstdir\" || exit 1\n\tobsolete_mkdir_used=true\n      fi\n    fi\n  fi\n\n  if test -n \"$dir_arg\"; then\n    { test -z \"$chowncmd\" || $doit $chowncmd \"$dst\"; } &&\n    { test -z \"$chgrpcmd\" || $doit $chgrpcmd \"$dst\"; } &&\n    { test \"$obsolete_mkdir_used$chowncmd$chgrpcmd\" = false ||\n      test -z \"$chmodcmd\" || $doit $chmodcmd $mode \"$dst\"; } || exit 1\n  else\n\n    # Make a couple of temp file names in the proper directory.\n    dsttmp=$dstdir/_inst.$$_\n    rmtmp=$dstdir/_rm.$$_\n\n    # Trap to clean up those temp files at exit.\n    trap 'ret=$?; rm -f \"$dsttmp\" \"$rmtmp\" && exit $ret' 0\n\n    # Copy the file name to the temp name.\n    (umask $cp_umask && $doit_exec $cpprog \"$src\" \"$dsttmp\") &&\n\n    # and set any options; do chmod last to preserve setuid bits.\n    #\n    # If any of these fail, we abort the whole thing.  If we want to\n    # ignore errors from any of these, just make sure not to ignore\n    # errors from the above \"$doit $cpprog $src $dsttmp\" command.\n    #\n    { test -z \"$chowncmd\" || $doit $chowncmd \"$dsttmp\"; } &&\n    { test -z \"$chgrpcmd\" || $doit $chgrpcmd \"$dsttmp\"; } &&\n    { test -z \"$stripcmd\" || $doit $stripcmd \"$dsttmp\"; } &&\n    { test -z \"$chmodcmd\" || $doit $chmodcmd $mode \"$dsttmp\"; } &&\n\n    # If -C, don't bother to copy if it wouldn't change the file.\n    if $copy_on_change &&\n       old=`LC_ALL=C ls -dlL \"$dst\"\t2>/dev/null` &&\n       new=`LC_ALL=C ls -dlL \"$dsttmp\"\t2>/dev/null` &&\n\n       eval \"$initialize_posix_glob\" &&\n       $posix_glob set -f &&\n       set X $old && old=:$2:$4:$5:$6 &&\n       set X $new && new=:$2:$4:$5:$6 &&\n       $posix_glob set +f &&\n\n       test \"$old\" = \"$new\" &&\n       $cmpprog \"$dst\" \"$dsttmp\" >/dev/null 2>&1\n    then\n      rm -f \"$dsttmp\"\n    else\n      # Rename the file to the real destination.\n      $doit $mvcmd -f \"$dsttmp\" \"$dst\" 2>/dev/null ||\n\n      # The rename failed, perhaps because mv can't rename something else\n      # to itself, or perhaps because mv is so ancient that it does not\n      # support -f.\n      {\n\t# Now remove or move aside any old file at destination location.\n\t# We try this two ways since rm can't unlink itself on some\n\t# systems and the destination file might be busy for other\n\t# reasons.  In this case, the final cleanup might fail but the new\n\t# file should still install successfully.\n\t{\n\t  test ! -f \"$dst\" ||\n\t  $doit $rmcmd -f \"$dst\" 2>/dev/null ||\n\t  { $doit $mvcmd -f \"$dst\" \"$rmtmp\" 2>/dev/null &&\n\t    { $doit $rmcmd -f \"$rmtmp\" 2>/dev/null; :; }\n\t  } ||\n\t  { echo \"$0: cannot unlink or rename $dst\" >&2\n\t    (exit 1); exit 1\n\t  }\n\t} &&\n\n\t# Now rename the file to the real destination.\n\t$doit $mvcmd \"$dsttmp\" \"$dst\"\n      }\n    fi || exit 1\n\n    trap '' 0\n  fi\ndone\n\n# Local variables:\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"scriptversion=\"\n# time-stamp-format: \"%:y-%02m-%02d.%02H\"\n# time-stamp-time-zone: \"UTC\"\n# time-stamp-end: \"; # UTC\"\n# End:\n"
  },
  {
    "path": "libs/CoMISo/gmm/ltmain.sh",
    "content": "\n# libtool (GNU libtool) 2.4.2\n# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996\n\n# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,\n# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.\n# This is free software; see the source for copying conditions.  There is NO\n# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n# GNU Libtool 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 2 of the License, or\n# (at your option) any later version.\n#\n# As a special exception to the GNU General Public License,\n# if you distribute this file as part of a program or library that\n# is built using GNU Libtool, you may include this file under the\n# same distribution terms that you use for the rest of that program.\n#\n# GNU Libtool is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with GNU Libtool; see the file COPYING.  If not, a copy\n# can be downloaded from http://www.gnu.org/licenses/gpl.html,\n# or obtained by writing to the Free Software Foundation, Inc.,\n# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n\n# Usage: $progname [OPTION]... [MODE-ARG]...\n#\n# Provide generalized library-building support services.\n#\n#       --config             show all configuration variables\n#       --debug              enable verbose shell tracing\n#   -n, --dry-run            display commands without modifying any files\n#       --features           display basic configuration information and exit\n#       --mode=MODE          use operation mode MODE\n#       --preserve-dup-deps  don't remove duplicate dependency libraries\n#       --quiet, --silent    don't print informational messages\n#       --no-quiet, --no-silent\n#                            print informational messages (default)\n#       --no-warn            don't display warning messages\n#       --tag=TAG            use configuration variables from tag TAG\n#   -v, --verbose            print more informational messages than default\n#       --no-verbose         don't print the extra informational messages\n#       --version            print version information\n#   -h, --help, --help-all   print short, long, or detailed help message\n#\n# MODE must be one of the following:\n#\n#         clean              remove files from the build directory\n#         compile            compile a source file into a libtool object\n#         execute            automatically set library path, then run a program\n#         finish             complete the installation of libtool libraries\n#         install            install libraries or executables\n#         link               create a library or an executable\n#         uninstall          remove libraries from an installed directory\n#\n# MODE-ARGS vary depending on the MODE.  When passed as first option,\n# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that.\n# Try `$progname --help --mode=MODE' for a more detailed description of MODE.\n#\n# When reporting a bug, please describe a test case to reproduce it and\n# include the following information:\n#\n#         host-triplet:\t$host\n#         shell:\t\t$SHELL\n#         compiler:\t\t$LTCC\n#         compiler flags:\t\t$LTCFLAGS\n#         linker:\t\t$LD (gnu? $with_gnu_ld)\n#         $progname:\t(GNU libtool) 2.4.2 Debian-2.4.2-1ubuntu1\n#         automake:\t$automake_version\n#         autoconf:\t$autoconf_version\n#\n# Report bugs to <bug-libtool@gnu.org>.\n# GNU libtool home page: <http://www.gnu.org/software/libtool/>.\n# General help using GNU software: <http://www.gnu.org/gethelp/>.\n\nPROGRAM=libtool\nPACKAGE=libtool\nVERSION=\"2.4.2 Debian-2.4.2-1ubuntu1\"\nTIMESTAMP=\"\"\npackage_revision=1.3337\n\n# Be Bourne compatible\nif test -n \"${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then\n  emulate sh\n  NULLCMD=:\n  # Zsh 3.x and 4.x performs word splitting on ${1+\"$@\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '${1+\"$@\"}'='\"$@\"'\n  setopt NO_GLOB_SUBST\nelse\n  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac\nfi\nBIN_SH=xpg4; export BIN_SH # for Tru64\nDUALCASE=1; export DUALCASE # for MKS sh\n\n# A function that is used when there is no print builtin or printf.\nfunc_fallback_echo ()\n{\n  eval 'cat <<_LTECHO_EOF\n$1\n_LTECHO_EOF'\n}\n\n# NLS nuisances: We save the old values to restore during execute mode.\nlt_user_locale=\nlt_safe_locale=\nfor lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES\ndo\n  eval \"if test \\\"\\${$lt_var+set}\\\" = set; then\n          save_$lt_var=\\$$lt_var\n          $lt_var=C\n\t  export $lt_var\n\t  lt_user_locale=\\\"$lt_var=\\\\\\$save_\\$lt_var; \\$lt_user_locale\\\"\n\t  lt_safe_locale=\\\"$lt_var=C; \\$lt_safe_locale\\\"\n\tfi\"\ndone\nLC_ALL=C\nLANGUAGE=C\nexport LANGUAGE LC_ALL\n\n$lt_unset CDPATH\n\n\n# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh\n# is ksh but when the shell is invoked as \"sh\" and the current value of\n# the _XPG environment variable is not equal to 1 (one), the special\n# positional parameter $0, within a function call, is the name of the\n# function.\nprogpath=\"$0\"\n\n\n\n: ${CP=\"cp -f\"}\ntest \"${ECHO+set}\" = set || ECHO=${as_echo-'printf %s\\n'}\n: ${MAKE=\"make\"}\n: ${MKDIR=\"mkdir\"}\n: ${MV=\"mv -f\"}\n: ${RM=\"rm -f\"}\n: ${SHELL=\"${CONFIG_SHELL-/bin/sh}\"}\n: ${Xsed=\"$SED -e 1s/^X//\"}\n\n# Global variables:\nEXIT_SUCCESS=0\nEXIT_FAILURE=1\nEXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.\nEXIT_SKIP=77\t  # $? = 77 is used to indicate a skipped test to automake.\n\nexit_status=$EXIT_SUCCESS\n\n# Make sure IFS has a sensible default\nlt_nl='\n'\nIFS=\" \t$lt_nl\"\n\ndirname=\"s,/[^/]*$,,\"\nbasename=\"s,^.*/,,\"\n\n# func_dirname file append nondir_replacement\n# Compute the dirname of FILE.  If nonempty, add APPEND to the result,\n# otherwise set result to NONDIR_REPLACEMENT.\nfunc_dirname ()\n{\n    func_dirname_result=`$ECHO \"${1}\" | $SED \"$dirname\"`\n    if test \"X$func_dirname_result\" = \"X${1}\"; then\n      func_dirname_result=\"${3}\"\n    else\n      func_dirname_result=\"$func_dirname_result${2}\"\n    fi\n} # func_dirname may be replaced by extended shell implementation\n\n\n# func_basename file\nfunc_basename ()\n{\n    func_basename_result=`$ECHO \"${1}\" | $SED \"$basename\"`\n} # func_basename may be replaced by extended shell implementation\n\n\n# func_dirname_and_basename file append nondir_replacement\n# perform func_basename and func_dirname in a single function\n# call:\n#   dirname:  Compute the dirname of FILE.  If nonempty,\n#             add APPEND to the result, otherwise set result\n#             to NONDIR_REPLACEMENT.\n#             value returned in \"$func_dirname_result\"\n#   basename: Compute filename of FILE.\n#             value retuned in \"$func_basename_result\"\n# Implementation must be kept synchronized with func_dirname\n# and func_basename. For efficiency, we do not delegate to\n# those functions but instead duplicate the functionality here.\nfunc_dirname_and_basename ()\n{\n    # Extract subdirectory from the argument.\n    func_dirname_result=`$ECHO \"${1}\" | $SED -e \"$dirname\"`\n    if test \"X$func_dirname_result\" = \"X${1}\"; then\n      func_dirname_result=\"${3}\"\n    else\n      func_dirname_result=\"$func_dirname_result${2}\"\n    fi\n    func_basename_result=`$ECHO \"${1}\" | $SED -e \"$basename\"`\n} # func_dirname_and_basename may be replaced by extended shell implementation\n\n\n# func_stripname prefix suffix name\n# strip PREFIX and SUFFIX off of NAME.\n# PREFIX and SUFFIX must not contain globbing or regex special\n# characters, hashes, percent signs, but SUFFIX may contain a leading\n# dot (in which case that matches only a dot).\n# func_strip_suffix prefix name\nfunc_stripname ()\n{\n    case ${2} in\n      .*) func_stripname_result=`$ECHO \"${3}\" | $SED \"s%^${1}%%; s%\\\\\\\\${2}\\$%%\"`;;\n      *)  func_stripname_result=`$ECHO \"${3}\" | $SED \"s%^${1}%%; s%${2}\\$%%\"`;;\n    esac\n} # func_stripname may be replaced by extended shell implementation\n\n\n# These SED scripts presuppose an absolute path with a trailing slash.\npathcar='s,^/\\([^/]*\\).*$,\\1,'\npathcdr='s,^/[^/]*,,'\nremovedotparts=':dotsl\n\t\ts@/\\./@/@g\n\t\tt dotsl\n\t\ts,/\\.$,/,'\ncollapseslashes='s@/\\{1,\\}@/@g'\nfinalslash='s,/*$,/,'\n\n# func_normal_abspath PATH\n# Remove doubled-up and trailing slashes, \".\" path components,\n# and cancel out any \"..\" path components in PATH after making\n# it an absolute path.\n#             value returned in \"$func_normal_abspath_result\"\nfunc_normal_abspath ()\n{\n  # Start from root dir and reassemble the path.\n  func_normal_abspath_result=\n  func_normal_abspath_tpath=$1\n  func_normal_abspath_altnamespace=\n  case $func_normal_abspath_tpath in\n    \"\")\n      # Empty path, that just means $cwd.\n      func_stripname '' '/' \"`pwd`\"\n      func_normal_abspath_result=$func_stripname_result\n      return\n    ;;\n    # The next three entries are used to spot a run of precisely\n    # two leading slashes without using negated character classes;\n    # we take advantage of case's first-match behaviour.\n    ///*)\n      # Unusual form of absolute path, do nothing.\n    ;;\n    //*)\n      # Not necessarily an ordinary path; POSIX reserves leading '//'\n      # and for example Cygwin uses it to access remote file shares\n      # over CIFS/SMB, so we conserve a leading double slash if found.\n      func_normal_abspath_altnamespace=/\n    ;;\n    /*)\n      # Absolute path, do nothing.\n    ;;\n    *)\n      # Relative path, prepend $cwd.\n      func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath\n    ;;\n  esac\n  # Cancel out all the simple stuff to save iterations.  We also want\n  # the path to end with a slash for ease of parsing, so make sure\n  # there is one (and only one) here.\n  func_normal_abspath_tpath=`$ECHO \"$func_normal_abspath_tpath\" | $SED \\\n        -e \"$removedotparts\" -e \"$collapseslashes\" -e \"$finalslash\"`\n  while :; do\n    # Processed it all yet?\n    if test \"$func_normal_abspath_tpath\" = / ; then\n      # If we ascended to the root using \"..\" the result may be empty now.\n      if test -z \"$func_normal_abspath_result\" ; then\n        func_normal_abspath_result=/\n      fi\n      break\n    fi\n    func_normal_abspath_tcomponent=`$ECHO \"$func_normal_abspath_tpath\" | $SED \\\n        -e \"$pathcar\"`\n    func_normal_abspath_tpath=`$ECHO \"$func_normal_abspath_tpath\" | $SED \\\n        -e \"$pathcdr\"`\n    # Figure out what to do with it\n    case $func_normal_abspath_tcomponent in\n      \"\")\n        # Trailing empty path component, ignore it.\n      ;;\n      ..)\n        # Parent dir; strip last assembled component from result.\n        func_dirname \"$func_normal_abspath_result\"\n        func_normal_abspath_result=$func_dirname_result\n      ;;\n      *)\n        # Actual path component, append it.\n        func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent\n      ;;\n    esac\n  done\n  # Restore leading double-slash if one was found on entry.\n  func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result\n}\n\n# func_relative_path SRCDIR DSTDIR\n# generates a relative path from SRCDIR to DSTDIR, with a trailing\n# slash if non-empty, suitable for immediately appending a filename\n# without needing to append a separator.\n#             value returned in \"$func_relative_path_result\"\nfunc_relative_path ()\n{\n  func_relative_path_result=\n  func_normal_abspath \"$1\"\n  func_relative_path_tlibdir=$func_normal_abspath_result\n  func_normal_abspath \"$2\"\n  func_relative_path_tbindir=$func_normal_abspath_result\n\n  # Ascend the tree starting from libdir\n  while :; do\n    # check if we have found a prefix of bindir\n    case $func_relative_path_tbindir in\n      $func_relative_path_tlibdir)\n        # found an exact match\n        func_relative_path_tcancelled=\n        break\n        ;;\n      $func_relative_path_tlibdir*)\n        # found a matching prefix\n        func_stripname \"$func_relative_path_tlibdir\" '' \"$func_relative_path_tbindir\"\n        func_relative_path_tcancelled=$func_stripname_result\n        if test -z \"$func_relative_path_result\"; then\n          func_relative_path_result=.\n        fi\n        break\n        ;;\n      *)\n        func_dirname $func_relative_path_tlibdir\n        func_relative_path_tlibdir=${func_dirname_result}\n        if test \"x$func_relative_path_tlibdir\" = x ; then\n          # Have to descend all the way to the root!\n          func_relative_path_result=../$func_relative_path_result\n          func_relative_path_tcancelled=$func_relative_path_tbindir\n          break\n        fi\n        func_relative_path_result=../$func_relative_path_result\n        ;;\n    esac\n  done\n\n  # Now calculate path; take care to avoid doubling-up slashes.\n  func_stripname '' '/' \"$func_relative_path_result\"\n  func_relative_path_result=$func_stripname_result\n  func_stripname '/' '/' \"$func_relative_path_tcancelled\"\n  if test \"x$func_stripname_result\" != x ; then\n    func_relative_path_result=${func_relative_path_result}/${func_stripname_result}\n  fi\n\n  # Normalisation. If bindir is libdir, return empty string,\n  # else relative path ending with a slash; either way, target\n  # file name can be directly appended.\n  if test ! -z \"$func_relative_path_result\"; then\n    func_stripname './' '' \"$func_relative_path_result/\"\n    func_relative_path_result=$func_stripname_result\n  fi\n}\n\n# The name of this program:\nfunc_dirname_and_basename \"$progpath\"\nprogname=$func_basename_result\n\n# Make sure we have an absolute path for reexecution:\ncase $progpath in\n  [\\\\/]*|[A-Za-z]:\\\\*) ;;\n  *[\\\\/]*)\n     progdir=$func_dirname_result\n     progdir=`cd \"$progdir\" && pwd`\n     progpath=\"$progdir/$progname\"\n     ;;\n  *)\n     save_IFS=\"$IFS\"\n     IFS=${PATH_SEPARATOR-:}\n     for progdir in $PATH; do\n       IFS=\"$save_IFS\"\n       test -x \"$progdir/$progname\" && break\n     done\n     IFS=\"$save_IFS\"\n     test -n \"$progdir\" || progdir=`pwd`\n     progpath=\"$progdir/$progname\"\n     ;;\nesac\n\n# Sed substitution that helps us do robust quoting.  It backslashifies\n# metacharacters that are still active within double-quoted strings.\nXsed=\"${SED}\"' -e 1s/^X//'\nsed_quote_subst='s/\\([`\"$\\\\]\\)/\\\\\\1/g'\n\n# Same as above, but do not quote variable references.\ndouble_quote_subst='s/\\([\"`\\\\]\\)/\\\\\\1/g'\n\n# Sed substitution that turns a string into a regex matching for the\n# string literally.\nsed_make_literal_regex='s,[].[^$\\\\*\\/],\\\\&,g'\n\n# Sed substitution that converts a w32 file name or path\n# which contains forward slashes, into one that contains\n# (escaped) backslashes.  A very naive implementation.\nlt_sed_naive_backslashify='s|\\\\\\\\*|\\\\|g;s|/|\\\\|g;s|\\\\|\\\\\\\\|g'\n\n# Re-`\\' parameter expansions in output of double_quote_subst that were\n# `\\'-ed in input to the same.  If an odd number of `\\' preceded a '$'\n# in input to double_quote_subst, that '$' was protected from expansion.\n# Since each input `\\' is now two `\\'s, look for any number of runs of\n# four `\\'s followed by two `\\'s and then a '$'.  `\\' that '$'.\nbs='\\\\'\nbs2='\\\\\\\\'\nbs4='\\\\\\\\\\\\\\\\'\ndollar='\\$'\nsed_double_backslash=\"\\\n  s/$bs4/&\\\\\n/g\n  s/^$bs2$dollar/$bs&/\n  s/\\\\([^$bs]\\\\)$bs2$dollar/\\\\1$bs2$bs$dollar/g\n  s/\\n//g\"\n\n# Standard options:\nopt_dry_run=false\nopt_help=false\nopt_quiet=false\nopt_verbose=false\nopt_warning=:\n\n# func_echo arg...\n# Echo program name prefixed message, along with the current mode\n# name if it has been set yet.\nfunc_echo ()\n{\n    $ECHO \"$progname: ${opt_mode+$opt_mode: }$*\"\n}\n\n# func_verbose arg...\n# Echo program name prefixed message in verbose mode only.\nfunc_verbose ()\n{\n    $opt_verbose && func_echo ${1+\"$@\"}\n\n    # A bug in bash halts the script if the last line of a function\n    # fails when set -e is in force, so we need another command to\n    # work around that:\n    :\n}\n\n# func_echo_all arg...\n# Invoke $ECHO with all args, space-separated.\nfunc_echo_all ()\n{\n    $ECHO \"$*\"\n}\n\n# func_error arg...\n# Echo program name prefixed message to standard error.\nfunc_error ()\n{\n    $ECHO \"$progname: ${opt_mode+$opt_mode: }\"${1+\"$@\"} 1>&2\n}\n\n# func_warning arg...\n# Echo program name prefixed warning message to standard error.\nfunc_warning ()\n{\n    $opt_warning && $ECHO \"$progname: ${opt_mode+$opt_mode: }warning: \"${1+\"$@\"} 1>&2\n\n    # bash bug again:\n    :\n}\n\n# func_fatal_error arg...\n# Echo program name prefixed message to standard error, and exit.\nfunc_fatal_error ()\n{\n    func_error ${1+\"$@\"}\n    exit $EXIT_FAILURE\n}\n\n# func_fatal_help arg...\n# Echo program name prefixed message to standard error, followed by\n# a help hint, and exit.\nfunc_fatal_help ()\n{\n    func_error ${1+\"$@\"}\n    func_fatal_error \"$help\"\n}\nhelp=\"Try \\`$progname --help' for more information.\"  ## default\n\n\n# func_grep expression filename\n# Check whether EXPRESSION matches any line of FILENAME, without output.\nfunc_grep ()\n{\n    $GREP \"$1\" \"$2\" >/dev/null 2>&1\n}\n\n\n# func_mkdir_p directory-path\n# Make sure the entire path to DIRECTORY-PATH is available.\nfunc_mkdir_p ()\n{\n    my_directory_path=\"$1\"\n    my_dir_list=\n\n    if test -n \"$my_directory_path\" && test \"$opt_dry_run\" != \":\"; then\n\n      # Protect directory names starting with `-'\n      case $my_directory_path in\n        -*) my_directory_path=\"./$my_directory_path\" ;;\n      esac\n\n      # While some portion of DIR does not yet exist...\n      while test ! -d \"$my_directory_path\"; do\n        # ...make a list in topmost first order.  Use a colon delimited\n\t# list incase some portion of path contains whitespace.\n        my_dir_list=\"$my_directory_path:$my_dir_list\"\n\n        # If the last portion added has no slash in it, the list is done\n        case $my_directory_path in */*) ;; *) break ;; esac\n\n        # ...otherwise throw away the child directory and loop\n        my_directory_path=`$ECHO \"$my_directory_path\" | $SED -e \"$dirname\"`\n      done\n      my_dir_list=`$ECHO \"$my_dir_list\" | $SED 's,:*$,,'`\n\n      save_mkdir_p_IFS=\"$IFS\"; IFS=':'\n      for my_dir in $my_dir_list; do\n\tIFS=\"$save_mkdir_p_IFS\"\n        # mkdir can fail with a `File exist' error if two processes\n        # try to create one of the directories concurrently.  Don't\n        # stop in that case!\n        $MKDIR \"$my_dir\" 2>/dev/null || :\n      done\n      IFS=\"$save_mkdir_p_IFS\"\n\n      # Bail out if we (or some other process) failed to create a directory.\n      test -d \"$my_directory_path\" || \\\n        func_fatal_error \"Failed to create \\`$1'\"\n    fi\n}\n\n\n# func_mktempdir [string]\n# Make a temporary directory that won't clash with other running\n# libtool processes, and avoids race conditions if possible.  If\n# given, STRING is the basename for that directory.\nfunc_mktempdir ()\n{\n    my_template=\"${TMPDIR-/tmp}/${1-$progname}\"\n\n    if test \"$opt_dry_run\" = \":\"; then\n      # Return a directory name, but don't create it in dry-run mode\n      my_tmpdir=\"${my_template}-$$\"\n    else\n\n      # If mktemp works, use that first and foremost\n      my_tmpdir=`mktemp -d \"${my_template}-XXXXXXXX\" 2>/dev/null`\n\n      if test ! -d \"$my_tmpdir\"; then\n        # Failing that, at least try and use $RANDOM to avoid a race\n        my_tmpdir=\"${my_template}-${RANDOM-0}$$\"\n\n        save_mktempdir_umask=`umask`\n        umask 0077\n        $MKDIR \"$my_tmpdir\"\n        umask $save_mktempdir_umask\n      fi\n\n      # If we're not in dry-run mode, bomb out on failure\n      test -d \"$my_tmpdir\" || \\\n        func_fatal_error \"cannot create temporary directory \\`$my_tmpdir'\"\n    fi\n\n    $ECHO \"$my_tmpdir\"\n}\n\n\n# func_quote_for_eval arg\n# Aesthetically quote ARG to be evaled later.\n# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT\n# is double-quoted, suitable for a subsequent eval, whereas\n# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters\n# which are still active within double quotes backslashified.\nfunc_quote_for_eval ()\n{\n    case $1 in\n      *[\\\\\\`\\\"\\$]*)\n\tfunc_quote_for_eval_unquoted_result=`$ECHO \"$1\" | $SED \"$sed_quote_subst\"` ;;\n      *)\n        func_quote_for_eval_unquoted_result=\"$1\" ;;\n    esac\n\n    case $func_quote_for_eval_unquoted_result in\n      # Double-quote args containing shell metacharacters to delay\n      # word splitting, command substitution and and variable\n      # expansion for a subsequent eval.\n      # Many Bourne shells cannot handle close brackets correctly\n      # in scan sets, so we specify it separately.\n      *[\\[\\~\\#\\^\\&\\*\\(\\)\\{\\}\\|\\;\\<\\>\\?\\'\\ \\\t]*|*]*|\"\")\n        func_quote_for_eval_result=\"\\\"$func_quote_for_eval_unquoted_result\\\"\"\n        ;;\n      *)\n        func_quote_for_eval_result=\"$func_quote_for_eval_unquoted_result\"\n    esac\n}\n\n\n# func_quote_for_expand arg\n# Aesthetically quote ARG to be evaled later; same as above,\n# but do not quote variable references.\nfunc_quote_for_expand ()\n{\n    case $1 in\n      *[\\\\\\`\\\"]*)\n\tmy_arg=`$ECHO \"$1\" | $SED \\\n\t    -e \"$double_quote_subst\" -e \"$sed_double_backslash\"` ;;\n      *)\n        my_arg=\"$1\" ;;\n    esac\n\n    case $my_arg in\n      # Double-quote args containing shell metacharacters to delay\n      # word splitting and command substitution for a subsequent eval.\n      # Many Bourne shells cannot handle close brackets correctly\n      # in scan sets, so we specify it separately.\n      *[\\[\\~\\#\\^\\&\\*\\(\\)\\{\\}\\|\\;\\<\\>\\?\\'\\ \\\t]*|*]*|\"\")\n        my_arg=\"\\\"$my_arg\\\"\"\n        ;;\n    esac\n\n    func_quote_for_expand_result=\"$my_arg\"\n}\n\n\n# func_show_eval cmd [fail_exp]\n# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is\n# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP\n# is given, then evaluate it.\nfunc_show_eval ()\n{\n    my_cmd=\"$1\"\n    my_fail_exp=\"${2-:}\"\n\n    ${opt_silent-false} || {\n      func_quote_for_expand \"$my_cmd\"\n      eval \"func_echo $func_quote_for_expand_result\"\n    }\n\n    if ${opt_dry_run-false}; then :; else\n      eval \"$my_cmd\"\n      my_status=$?\n      if test \"$my_status\" -eq 0; then :; else\n\teval \"(exit $my_status); $my_fail_exp\"\n      fi\n    fi\n}\n\n\n# func_show_eval_locale cmd [fail_exp]\n# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is\n# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP\n# is given, then evaluate it.  Use the saved locale for evaluation.\nfunc_show_eval_locale ()\n{\n    my_cmd=\"$1\"\n    my_fail_exp=\"${2-:}\"\n\n    ${opt_silent-false} || {\n      func_quote_for_expand \"$my_cmd\"\n      eval \"func_echo $func_quote_for_expand_result\"\n    }\n\n    if ${opt_dry_run-false}; then :; else\n      eval \"$lt_user_locale\n\t    $my_cmd\"\n      my_status=$?\n      eval \"$lt_safe_locale\"\n      if test \"$my_status\" -eq 0; then :; else\n\teval \"(exit $my_status); $my_fail_exp\"\n      fi\n    fi\n}\n\n# func_tr_sh\n# Turn $1 into a string suitable for a shell variable name.\n# Result is stored in $func_tr_sh_result.  All characters\n# not in the set a-zA-Z0-9_ are replaced with '_'. Further,\n# if $1 begins with a digit, a '_' is prepended as well.\nfunc_tr_sh ()\n{\n  case $1 in\n  [0-9]* | *[!a-zA-Z0-9_]*)\n    func_tr_sh_result=`$ECHO \"$1\" | $SED 's/^\\([0-9]\\)/_\\1/; s/[^a-zA-Z0-9_]/_/g'`\n    ;;\n  * )\n    func_tr_sh_result=$1\n    ;;\n  esac\n}\n\n\n# func_version\n# Echo version message to standard output and exit.\nfunc_version ()\n{\n    $opt_debug\n\n    $SED -n '/(C)/!b go\n\t:more\n\t/\\./!{\n\t  N\n\t  s/\\n# / /\n\t  b more\n\t}\n\t:go\n\t/^# '$PROGRAM' (GNU /,/# warranty; / {\n        s/^# //\n\ts/^# *$//\n        s/\\((C)\\)[ 0-9,-]*\\( [1-9][0-9]*\\)/\\1\\2/\n        p\n     }' < \"$progpath\"\n     exit $?\n}\n\n# func_usage\n# Echo short help message to standard output and exit.\nfunc_usage ()\n{\n    $opt_debug\n\n    $SED -n '/^# Usage:/,/^#  *.*--help/ {\n        s/^# //\n\ts/^# *$//\n\ts/\\$progname/'$progname'/\n\tp\n    }' < \"$progpath\"\n    echo\n    $ECHO \"run \\`$progname --help | more' for full usage\"\n    exit $?\n}\n\n# func_help [NOEXIT]\n# Echo long help message to standard output and exit,\n# unless 'noexit' is passed as argument.\nfunc_help ()\n{\n    $opt_debug\n\n    $SED -n '/^# Usage:/,/# Report bugs to/ {\n\t:print\n        s/^# //\n\ts/^# *$//\n\ts*\\$progname*'$progname'*\n\ts*\\$host*'\"$host\"'*\n\ts*\\$SHELL*'\"$SHELL\"'*\n\ts*\\$LTCC*'\"$LTCC\"'*\n\ts*\\$LTCFLAGS*'\"$LTCFLAGS\"'*\n\ts*\\$LD*'\"$LD\"'*\n\ts/\\$with_gnu_ld/'\"$with_gnu_ld\"'/\n\ts/\\$automake_version/'\"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`\"'/\n\ts/\\$autoconf_version/'\"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`\"'/\n\tp\n\td\n     }\n     /^# .* home page:/b print\n     /^# General help using/b print\n     ' < \"$progpath\"\n    ret=$?\n    if test -z \"$1\"; then\n      exit $ret\n    fi\n}\n\n# func_missing_arg argname\n# Echo program name prefixed message to standard error and set global\n# exit_cmd.\nfunc_missing_arg ()\n{\n    $opt_debug\n\n    func_error \"missing argument for $1.\"\n    exit_cmd=exit\n}\n\n\n# func_split_short_opt shortopt\n# Set func_split_short_opt_name and func_split_short_opt_arg shell\n# variables after splitting SHORTOPT after the 2nd character.\nfunc_split_short_opt ()\n{\n    my_sed_short_opt='1s/^\\(..\\).*$/\\1/;q'\n    my_sed_short_rest='1s/^..\\(.*\\)$/\\1/;q'\n\n    func_split_short_opt_name=`$ECHO \"$1\" | $SED \"$my_sed_short_opt\"`\n    func_split_short_opt_arg=`$ECHO \"$1\" | $SED \"$my_sed_short_rest\"`\n} # func_split_short_opt may be replaced by extended shell implementation\n\n\n# func_split_long_opt longopt\n# Set func_split_long_opt_name and func_split_long_opt_arg shell\n# variables after splitting LONGOPT at the `=' sign.\nfunc_split_long_opt ()\n{\n    my_sed_long_opt='1s/^\\(--[^=]*\\)=.*/\\1/;q'\n    my_sed_long_arg='1s/^--[^=]*=//'\n\n    func_split_long_opt_name=`$ECHO \"$1\" | $SED \"$my_sed_long_opt\"`\n    func_split_long_opt_arg=`$ECHO \"$1\" | $SED \"$my_sed_long_arg\"`\n} # func_split_long_opt may be replaced by extended shell implementation\n\nexit_cmd=:\n\n\n\n\n\nmagic=\"%%%MAGIC variable%%%\"\nmagic_exe=\"%%%MAGIC EXE variable%%%\"\n\n# Global variables.\nnonopt=\npreserve_args=\nlo2o=\"s/\\\\.lo\\$/.${objext}/\"\no2lo=\"s/\\\\.${objext}\\$/.lo/\"\nextracted_archives=\nextracted_serial=0\n\n# If this variable is set in any of the actions, the command in it\n# will be execed at the end.  This prevents here-documents from being\n# left over by shells.\nexec_cmd=\n\n# func_append var value\n# Append VALUE to the end of shell variable VAR.\nfunc_append ()\n{\n    eval \"${1}=\\$${1}\\${2}\"\n} # func_append may be replaced by extended shell implementation\n\n# func_append_quoted var value\n# Quote VALUE and append to the end of shell variable VAR, separated\n# by a space.\nfunc_append_quoted ()\n{\n    func_quote_for_eval \"${2}\"\n    eval \"${1}=\\$${1}\\\\ \\$func_quote_for_eval_result\"\n} # func_append_quoted may be replaced by extended shell implementation\n\n\n# func_arith arithmetic-term...\nfunc_arith ()\n{\n    func_arith_result=`expr \"${@}\"`\n} # func_arith may be replaced by extended shell implementation\n\n\n# func_len string\n# STRING may not start with a hyphen.\nfunc_len ()\n{\n    func_len_result=`expr \"${1}\" : \".*\" 2>/dev/null || echo $max_cmd_len`\n} # func_len may be replaced by extended shell implementation\n\n\n# func_lo2o object\nfunc_lo2o ()\n{\n    func_lo2o_result=`$ECHO \"${1}\" | $SED \"$lo2o\"`\n} # func_lo2o may be replaced by extended shell implementation\n\n\n# func_xform libobj-or-source\nfunc_xform ()\n{\n    func_xform_result=`$ECHO \"${1}\" | $SED 's/\\.[^.]*$/.lo/'`\n} # func_xform may be replaced by extended shell implementation\n\n\n# func_fatal_configuration arg...\n# Echo program name prefixed message to standard error, followed by\n# a configuration failure hint, and exit.\nfunc_fatal_configuration ()\n{\n    func_error ${1+\"$@\"}\n    func_error \"See the $PACKAGE documentation for more information.\"\n    func_fatal_error \"Fatal configuration error.\"\n}\n\n\n# func_config\n# Display the configuration for all the tags in this script.\nfunc_config ()\n{\n    re_begincf='^# ### BEGIN LIBTOOL'\n    re_endcf='^# ### END LIBTOOL'\n\n    # Default configuration.\n    $SED \"1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\\$d\" < \"$progpath\"\n\n    # Now print the configurations for the tags.\n    for tagname in $taglist; do\n      $SED -n \"/$re_begincf TAG CONFIG: $tagname\\$/,/$re_endcf TAG CONFIG: $tagname\\$/p\" < \"$progpath\"\n    done\n\n    exit $?\n}\n\n# func_features\n# Display the features supported by this script.\nfunc_features ()\n{\n    echo \"host: $host\"\n    if test \"$build_libtool_libs\" = yes; then\n      echo \"enable shared libraries\"\n    else\n      echo \"disable shared libraries\"\n    fi\n    if test \"$build_old_libs\" = yes; then\n      echo \"enable static libraries\"\n    else\n      echo \"disable static libraries\"\n    fi\n\n    exit $?\n}\n\n# func_enable_tag tagname\n# Verify that TAGNAME is valid, and either flag an error and exit, or\n# enable the TAGNAME tag.  We also add TAGNAME to the global $taglist\n# variable here.\nfunc_enable_tag ()\n{\n  # Global variable:\n  tagname=\"$1\"\n\n  re_begincf=\"^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\\$\"\n  re_endcf=\"^# ### END LIBTOOL TAG CONFIG: $tagname\\$\"\n  sed_extractcf=\"/$re_begincf/,/$re_endcf/p\"\n\n  # Validate tagname.\n  case $tagname in\n    *[!-_A-Za-z0-9,/]*)\n      func_fatal_error \"invalid tag name: $tagname\"\n      ;;\n  esac\n\n  # Don't test for the \"default\" C tag, as we know it's\n  # there but not specially marked.\n  case $tagname in\n    CC) ;;\n    *)\n      if $GREP \"$re_begincf\" \"$progpath\" >/dev/null 2>&1; then\n\ttaglist=\"$taglist $tagname\"\n\n\t# Evaluate the configuration.  Be careful to quote the path\n\t# and the sed script, to avoid splitting on whitespace, but\n\t# also don't use non-portable quotes within backquotes within\n\t# quotes we have to do it in 2 steps:\n\textractedcf=`$SED -n -e \"$sed_extractcf\" < \"$progpath\"`\n\teval \"$extractedcf\"\n      else\n\tfunc_error \"ignoring unknown tag $tagname\"\n      fi\n      ;;\n  esac\n}\n\n# func_check_version_match\n# Ensure that we are using m4 macros, and libtool script from the same\n# release of libtool.\nfunc_check_version_match ()\n{\n  if test \"$package_revision\" != \"$macro_revision\"; then\n    if test \"$VERSION\" != \"$macro_version\"; then\n      if test -z \"$macro_version\"; then\n        cat >&2 <<_LT_EOF\n$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the\n$progname: definition of this LT_INIT comes from an older release.\n$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION\n$progname: and run autoconf again.\n_LT_EOF\n      else\n        cat >&2 <<_LT_EOF\n$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the\n$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.\n$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION\n$progname: and run autoconf again.\n_LT_EOF\n      fi\n    else\n      cat >&2 <<_LT_EOF\n$progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,\n$progname: but the definition of this LT_INIT comes from revision $macro_revision.\n$progname: You should recreate aclocal.m4 with macros from revision $package_revision\n$progname: of $PACKAGE $VERSION and run autoconf again.\n_LT_EOF\n    fi\n\n    exit $EXIT_MISMATCH\n  fi\n}\n\n\n# Shorthand for --mode=foo, only valid as the first argument\ncase $1 in\nclean|clea|cle|cl)\n  shift; set dummy --mode clean ${1+\"$@\"}; shift\n  ;;\ncompile|compil|compi|comp|com|co|c)\n  shift; set dummy --mode compile ${1+\"$@\"}; shift\n  ;;\nexecute|execut|execu|exec|exe|ex|e)\n  shift; set dummy --mode execute ${1+\"$@\"}; shift\n  ;;\nfinish|finis|fini|fin|fi|f)\n  shift; set dummy --mode finish ${1+\"$@\"}; shift\n  ;;\ninstall|instal|insta|inst|ins|in|i)\n  shift; set dummy --mode install ${1+\"$@\"}; shift\n  ;;\nlink|lin|li|l)\n  shift; set dummy --mode link ${1+\"$@\"}; shift\n  ;;\nuninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)\n  shift; set dummy --mode uninstall ${1+\"$@\"}; shift\n  ;;\nesac\n\n\n\n# Option defaults:\nopt_debug=:\nopt_dry_run=false\nopt_config=false\nopt_preserve_dup_deps=false\nopt_features=false\nopt_finish=false\nopt_help=false\nopt_help_all=false\nopt_silent=:\nopt_warning=:\nopt_verbose=:\nopt_silent=false\nopt_verbose=false\n\n\n# Parse options once, thoroughly.  This comes as soon as possible in the\n# script to make things like `--version' happen as quickly as we can.\n{\n  # this just eases exit handling\n  while test $# -gt 0; do\n    opt=\"$1\"\n    shift\n    case $opt in\n      --debug|-x)\topt_debug='set -x'\n\t\t\tfunc_echo \"enabling shell trace mode\"\n\t\t\t$opt_debug\n\t\t\t;;\n      --dry-run|--dryrun|-n)\n\t\t\topt_dry_run=:\n\t\t\t;;\n      --config)\n\t\t\topt_config=:\nfunc_config\n\t\t\t;;\n      --dlopen|-dlopen)\n\t\t\toptarg=\"$1\"\n\t\t\topt_dlopen=\"${opt_dlopen+$opt_dlopen\n}$optarg\"\n\t\t\tshift\n\t\t\t;;\n      --preserve-dup-deps)\n\t\t\topt_preserve_dup_deps=:\n\t\t\t;;\n      --features)\n\t\t\topt_features=:\nfunc_features\n\t\t\t;;\n      --finish)\n\t\t\topt_finish=:\nset dummy --mode finish ${1+\"$@\"}; shift\n\t\t\t;;\n      --help)\n\t\t\topt_help=:\n\t\t\t;;\n      --help-all)\n\t\t\topt_help_all=:\nopt_help=': help-all'\n\t\t\t;;\n      --mode)\n\t\t\ttest $# = 0 && func_missing_arg $opt && break\n\t\t\toptarg=\"$1\"\n\t\t\topt_mode=\"$optarg\"\ncase $optarg in\n  # Valid mode arguments:\n  clean|compile|execute|finish|install|link|relink|uninstall) ;;\n\n  # Catch anything else as an error\n  *) func_error \"invalid argument for $opt\"\n     exit_cmd=exit\n     break\n     ;;\nesac\n\t\t\tshift\n\t\t\t;;\n      --no-silent|--no-quiet)\n\t\t\topt_silent=false\nfunc_append preserve_args \" $opt\"\n\t\t\t;;\n      --no-warning|--no-warn)\n\t\t\topt_warning=false\nfunc_append preserve_args \" $opt\"\n\t\t\t;;\n      --no-verbose)\n\t\t\topt_verbose=false\nfunc_append preserve_args \" $opt\"\n\t\t\t;;\n      --silent|--quiet)\n\t\t\topt_silent=:\nfunc_append preserve_args \" $opt\"\n        opt_verbose=false\n\t\t\t;;\n      --verbose|-v)\n\t\t\topt_verbose=:\nfunc_append preserve_args \" $opt\"\nopt_silent=false\n\t\t\t;;\n      --tag)\n\t\t\ttest $# = 0 && func_missing_arg $opt && break\n\t\t\toptarg=\"$1\"\n\t\t\topt_tag=\"$optarg\"\nfunc_append preserve_args \" $opt $optarg\"\nfunc_enable_tag \"$optarg\"\n\t\t\tshift\n\t\t\t;;\n\n      -\\?|-h)\t\tfunc_usage\t\t\t\t;;\n      --help)\t\tfunc_help\t\t\t\t;;\n      --version)\tfunc_version\t\t\t\t;;\n\n      # Separate optargs to long options:\n      --*=*)\n\t\t\tfunc_split_long_opt \"$opt\"\n\t\t\tset dummy \"$func_split_long_opt_name\" \"$func_split_long_opt_arg\" ${1+\"$@\"}\n\t\t\tshift\n\t\t\t;;\n\n      # Separate non-argument short options:\n      -\\?*|-h*|-n*|-v*)\n\t\t\tfunc_split_short_opt \"$opt\"\n\t\t\tset dummy \"$func_split_short_opt_name\" \"-$func_split_short_opt_arg\" ${1+\"$@\"}\n\t\t\tshift\n\t\t\t;;\n\n      --)\t\tbreak\t\t\t\t\t;;\n      -*)\t\tfunc_fatal_help \"unrecognized option \\`$opt'\" ;;\n      *)\t\tset dummy \"$opt\" ${1+\"$@\"};\tshift; break  ;;\n    esac\n  done\n\n  # Validate options:\n\n  # save first non-option argument\n  if test \"$#\" -gt 0; then\n    nonopt=\"$opt\"\n    shift\n  fi\n\n  # preserve --debug\n  test \"$opt_debug\" = : || func_append preserve_args \" --debug\"\n\n  case $host in\n    *cygwin* | *mingw* | *pw32* | *cegcc*)\n      # don't eliminate duplications in $postdeps and $predeps\n      opt_duplicate_compiler_generated_deps=:\n      ;;\n    *)\n      opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps\n      ;;\n  esac\n\n  $opt_help || {\n    # Sanity checks first:\n    func_check_version_match\n\n    if test \"$build_libtool_libs\" != yes && test \"$build_old_libs\" != yes; then\n      func_fatal_configuration \"not configured to build any kind of library\"\n    fi\n\n    # Darwin sucks\n    eval std_shrext=\\\"$shrext_cmds\\\"\n\n    # Only execute mode is allowed to have -dlopen flags.\n    if test -n \"$opt_dlopen\" && test \"$opt_mode\" != execute; then\n      func_error \"unrecognized option \\`-dlopen'\"\n      $ECHO \"$help\" 1>&2\n      exit $EXIT_FAILURE\n    fi\n\n    # Change the help message to a mode-specific one.\n    generic_help=\"$help\"\n    help=\"Try \\`$progname --help --mode=$opt_mode' for more information.\"\n  }\n\n\n  # Bail if the options were screwed\n  $exit_cmd $EXIT_FAILURE\n}\n\n\n\n\n## ----------- ##\n##    Main.    ##\n## ----------- ##\n\n# func_lalib_p file\n# True iff FILE is a libtool `.la' library or `.lo' object file.\n# This function is only a basic sanity check; it will hardly flush out\n# determined imposters.\nfunc_lalib_p ()\n{\n    test -f \"$1\" &&\n      $SED -e 4q \"$1\" 2>/dev/null \\\n        | $GREP \"^# Generated by .*$PACKAGE\" > /dev/null 2>&1\n}\n\n# func_lalib_unsafe_p file\n# True iff FILE is a libtool `.la' library or `.lo' object file.\n# This function implements the same check as func_lalib_p without\n# resorting to external programs.  To this end, it redirects stdin and\n# closes it afterwards, without saving the original file descriptor.\n# As a safety measure, use it only where a negative result would be\n# fatal anyway.  Works if `file' does not exist.\nfunc_lalib_unsafe_p ()\n{\n    lalib_p=no\n    if test -f \"$1\" && test -r \"$1\" && exec 5<&0 <\"$1\"; then\n\tfor lalib_p_l in 1 2 3 4\n\tdo\n\t    read lalib_p_line\n\t    case \"$lalib_p_line\" in\n\t\t\\#\\ Generated\\ by\\ *$PACKAGE* ) lalib_p=yes; break;;\n\t    esac\n\tdone\n\texec 0<&5 5<&-\n    fi\n    test \"$lalib_p\" = yes\n}\n\n# func_ltwrapper_script_p file\n# True iff FILE is a libtool wrapper script\n# This function is only a basic sanity check; it will hardly flush out\n# determined imposters.\nfunc_ltwrapper_script_p ()\n{\n    func_lalib_p \"$1\"\n}\n\n# func_ltwrapper_executable_p file\n# True iff FILE is a libtool wrapper executable\n# This function is only a basic sanity check; it will hardly flush out\n# determined imposters.\nfunc_ltwrapper_executable_p ()\n{\n    func_ltwrapper_exec_suffix=\n    case $1 in\n    *.exe) ;;\n    *) func_ltwrapper_exec_suffix=.exe ;;\n    esac\n    $GREP \"$magic_exe\" \"$1$func_ltwrapper_exec_suffix\" >/dev/null 2>&1\n}\n\n# func_ltwrapper_scriptname file\n# Assumes file is an ltwrapper_executable\n# uses $file to determine the appropriate filename for a\n# temporary ltwrapper_script.\nfunc_ltwrapper_scriptname ()\n{\n    func_dirname_and_basename \"$1\" \"\" \".\"\n    func_stripname '' '.exe' \"$func_basename_result\"\n    func_ltwrapper_scriptname_result=\"$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper\"\n}\n\n# func_ltwrapper_p file\n# True iff FILE is a libtool wrapper script or wrapper executable\n# This function is only a basic sanity check; it will hardly flush out\n# determined imposters.\nfunc_ltwrapper_p ()\n{\n    func_ltwrapper_script_p \"$1\" || func_ltwrapper_executable_p \"$1\"\n}\n\n\n# func_execute_cmds commands fail_cmd\n# Execute tilde-delimited COMMANDS.\n# If FAIL_CMD is given, eval that upon failure.\n# FAIL_CMD may read-access the current command in variable CMD!\nfunc_execute_cmds ()\n{\n    $opt_debug\n    save_ifs=$IFS; IFS='~'\n    for cmd in $1; do\n      IFS=$save_ifs\n      eval cmd=\\\"$cmd\\\"\n      func_show_eval \"$cmd\" \"${2-:}\"\n    done\n    IFS=$save_ifs\n}\n\n\n# func_source file\n# Source FILE, adding directory component if necessary.\n# Note that it is not necessary on cygwin/mingw to append a dot to\n# FILE even if both FILE and FILE.exe exist: automatic-append-.exe\n# behavior happens only for exec(3), not for open(2)!  Also, sourcing\n# `FILE.' does not work on cygwin managed mounts.\nfunc_source ()\n{\n    $opt_debug\n    case $1 in\n    */* | *\\\\*)\t. \"$1\" ;;\n    *)\t\t. \"./$1\" ;;\n    esac\n}\n\n\n# func_resolve_sysroot PATH\n# Replace a leading = in PATH with a sysroot.  Store the result into\n# func_resolve_sysroot_result\nfunc_resolve_sysroot ()\n{\n  func_resolve_sysroot_result=$1\n  case $func_resolve_sysroot_result in\n  =*)\n    func_stripname '=' '' \"$func_resolve_sysroot_result\"\n    func_resolve_sysroot_result=$lt_sysroot$func_stripname_result\n    ;;\n  esac\n}\n\n# func_replace_sysroot PATH\n# If PATH begins with the sysroot, replace it with = and\n# store the result into func_replace_sysroot_result.\nfunc_replace_sysroot ()\n{\n  case \"$lt_sysroot:$1\" in\n  ?*:\"$lt_sysroot\"*)\n    func_stripname \"$lt_sysroot\" '' \"$1\"\n    func_replace_sysroot_result=\"=$func_stripname_result\"\n    ;;\n  *)\n    # Including no sysroot.\n    func_replace_sysroot_result=$1\n    ;;\n  esac\n}\n\n# func_infer_tag arg\n# Infer tagged configuration to use if any are available and\n# if one wasn't chosen via the \"--tag\" command line option.\n# Only attempt this if the compiler in the base compile\n# command doesn't match the default compiler.\n# arg is usually of the form 'gcc ...'\nfunc_infer_tag ()\n{\n    $opt_debug\n    if test -n \"$available_tags\" && test -z \"$tagname\"; then\n      CC_quoted=\n      for arg in $CC; do\n\tfunc_append_quoted CC_quoted \"$arg\"\n      done\n      CC_expanded=`func_echo_all $CC`\n      CC_quoted_expanded=`func_echo_all $CC_quoted`\n      case $@ in\n      # Blanks in the command may have been stripped by the calling shell,\n      # but not from the CC environment variable when configure was run.\n      \" $CC \"* | \"$CC \"* | \" $CC_expanded \"* | \"$CC_expanded \"* | \\\n      \" $CC_quoted\"* | \"$CC_quoted \"* | \" $CC_quoted_expanded \"* | \"$CC_quoted_expanded \"*) ;;\n      # Blanks at the start of $base_compile will cause this to fail\n      # if we don't check for them as well.\n      *)\n\tfor z in $available_tags; do\n\t  if $GREP \"^# ### BEGIN LIBTOOL TAG CONFIG: $z$\" < \"$progpath\" > /dev/null; then\n\t    # Evaluate the configuration.\n\t    eval \"`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`\"\n\t    CC_quoted=\n\t    for arg in $CC; do\n\t      # Double-quote args containing other shell metacharacters.\n\t      func_append_quoted CC_quoted \"$arg\"\n\t    done\n\t    CC_expanded=`func_echo_all $CC`\n\t    CC_quoted_expanded=`func_echo_all $CC_quoted`\n\t    case \"$@ \" in\n\t    \" $CC \"* | \"$CC \"* | \" $CC_expanded \"* | \"$CC_expanded \"* | \\\n\t    \" $CC_quoted\"* | \"$CC_quoted \"* | \" $CC_quoted_expanded \"* | \"$CC_quoted_expanded \"*)\n\t      # The compiler in the base compile command matches\n\t      # the one in the tagged configuration.\n\t      # Assume this is the tagged configuration we want.\n\t      tagname=$z\n\t      break\n\t      ;;\n\t    esac\n\t  fi\n\tdone\n\t# If $tagname still isn't set, then no tagged configuration\n\t# was found and let the user know that the \"--tag\" command\n\t# line option must be used.\n\tif test -z \"$tagname\"; then\n\t  func_echo \"unable to infer tagged configuration\"\n\t  func_fatal_error \"specify a tag with \\`--tag'\"\n#\telse\n#\t  func_verbose \"using $tagname tagged configuration\"\n\tfi\n\t;;\n      esac\n    fi\n}\n\n\n\n# func_write_libtool_object output_name pic_name nonpic_name\n# Create a libtool object file (analogous to a \".la\" file),\n# but don't create it if we're doing a dry run.\nfunc_write_libtool_object ()\n{\n    write_libobj=${1}\n    if test \"$build_libtool_libs\" = yes; then\n      write_lobj=\\'${2}\\'\n    else\n      write_lobj=none\n    fi\n\n    if test \"$build_old_libs\" = yes; then\n      write_oldobj=\\'${3}\\'\n    else\n      write_oldobj=none\n    fi\n\n    $opt_dry_run || {\n      cat >${write_libobj}T <<EOF\n# $write_libobj - a libtool object file\n# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION\n#\n# Please DO NOT delete this file!\n# It is necessary for linking the library.\n\n# Name of the PIC object.\npic_object=$write_lobj\n\n# Name of the non-PIC object\nnon_pic_object=$write_oldobj\n\nEOF\n      $MV \"${write_libobj}T\" \"${write_libobj}\"\n    }\n}\n\n\n##################################################\n# FILE NAME AND PATH CONVERSION HELPER FUNCTIONS #\n##################################################\n\n# func_convert_core_file_wine_to_w32 ARG\n# Helper function used by file name conversion functions when $build is *nix,\n# and $host is mingw, cygwin, or some other w32 environment. Relies on a\n# correctly configured wine environment available, with the winepath program\n# in $build's $PATH.\n#\n# ARG is the $build file name to be converted to w32 format.\n# Result is available in $func_convert_core_file_wine_to_w32_result, and will\n# be empty on error (or when ARG is empty)\nfunc_convert_core_file_wine_to_w32 ()\n{\n  $opt_debug\n  func_convert_core_file_wine_to_w32_result=\"$1\"\n  if test -n \"$1\"; then\n    # Unfortunately, winepath does not exit with a non-zero error code, so we\n    # are forced to check the contents of stdout. On the other hand, if the\n    # command is not found, the shell will set an exit code of 127 and print\n    # *an error message* to stdout. So we must check for both error code of\n    # zero AND non-empty stdout, which explains the odd construction:\n    func_convert_core_file_wine_to_w32_tmp=`winepath -w \"$1\" 2>/dev/null`\n    if test \"$?\" -eq 0 && test -n \"${func_convert_core_file_wine_to_w32_tmp}\"; then\n      func_convert_core_file_wine_to_w32_result=`$ECHO \"$func_convert_core_file_wine_to_w32_tmp\" |\n        $SED -e \"$lt_sed_naive_backslashify\"`\n    else\n      func_convert_core_file_wine_to_w32_result=\n    fi\n  fi\n}\n# end: func_convert_core_file_wine_to_w32\n\n\n# func_convert_core_path_wine_to_w32 ARG\n# Helper function used by path conversion functions when $build is *nix, and\n# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly\n# configured wine environment available, with the winepath program in $build's\n# $PATH. Assumes ARG has no leading or trailing path separator characters.\n#\n# ARG is path to be converted from $build format to win32.\n# Result is available in $func_convert_core_path_wine_to_w32_result.\n# Unconvertible file (directory) names in ARG are skipped; if no directory names\n# are convertible, then the result may be empty.\nfunc_convert_core_path_wine_to_w32 ()\n{\n  $opt_debug\n  # unfortunately, winepath doesn't convert paths, only file names\n  func_convert_core_path_wine_to_w32_result=\"\"\n  if test -n \"$1\"; then\n    oldIFS=$IFS\n    IFS=:\n    for func_convert_core_path_wine_to_w32_f in $1; do\n      IFS=$oldIFS\n      func_convert_core_file_wine_to_w32 \"$func_convert_core_path_wine_to_w32_f\"\n      if test -n \"$func_convert_core_file_wine_to_w32_result\" ; then\n        if test -z \"$func_convert_core_path_wine_to_w32_result\"; then\n          func_convert_core_path_wine_to_w32_result=\"$func_convert_core_file_wine_to_w32_result\"\n        else\n          func_append func_convert_core_path_wine_to_w32_result \";$func_convert_core_file_wine_to_w32_result\"\n        fi\n      fi\n    done\n    IFS=$oldIFS\n  fi\n}\n# end: func_convert_core_path_wine_to_w32\n\n\n# func_cygpath ARGS...\n# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when\n# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2)\n# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or\n# (2), returns the Cygwin file name or path in func_cygpath_result (input\n# file name or path is assumed to be in w32 format, as previously converted\n# from $build's *nix or MSYS format). In case (3), returns the w32 file name\n# or path in func_cygpath_result (input file name or path is assumed to be in\n# Cygwin format). Returns an empty string on error.\n#\n# ARGS are passed to cygpath, with the last one being the file name or path to\n# be converted.\n#\n# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH\n# environment variable; do not put it in $PATH.\nfunc_cygpath ()\n{\n  $opt_debug\n  if test -n \"$LT_CYGPATH\" && test -f \"$LT_CYGPATH\"; then\n    func_cygpath_result=`$LT_CYGPATH \"$@\" 2>/dev/null`\n    if test \"$?\" -ne 0; then\n      # on failure, ensure result is empty\n      func_cygpath_result=\n    fi\n  else\n    func_cygpath_result=\n    func_error \"LT_CYGPATH is empty or specifies non-existent file: \\`$LT_CYGPATH'\"\n  fi\n}\n#end: func_cygpath\n\n\n# func_convert_core_msys_to_w32 ARG\n# Convert file name or path ARG from MSYS format to w32 format.  Return\n# result in func_convert_core_msys_to_w32_result.\nfunc_convert_core_msys_to_w32 ()\n{\n  $opt_debug\n  # awkward: cmd appends spaces to result\n  func_convert_core_msys_to_w32_result=`( cmd //c echo \"$1\" ) 2>/dev/null |\n    $SED -e 's/[ ]*$//' -e \"$lt_sed_naive_backslashify\"`\n}\n#end: func_convert_core_msys_to_w32\n\n\n# func_convert_file_check ARG1 ARG2\n# Verify that ARG1 (a file name in $build format) was converted to $host\n# format in ARG2. Otherwise, emit an error message, but continue (resetting\n# func_to_host_file_result to ARG1).\nfunc_convert_file_check ()\n{\n  $opt_debug\n  if test -z \"$2\" && test -n \"$1\" ; then\n    func_error \"Could not determine host file name corresponding to\"\n    func_error \"  \\`$1'\"\n    func_error \"Continuing, but uninstalled executables may not work.\"\n    # Fallback:\n    func_to_host_file_result=\"$1\"\n  fi\n}\n# end func_convert_file_check\n\n\n# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH\n# Verify that FROM_PATH (a path in $build format) was converted to $host\n# format in TO_PATH. Otherwise, emit an error message, but continue, resetting\n# func_to_host_file_result to a simplistic fallback value (see below).\nfunc_convert_path_check ()\n{\n  $opt_debug\n  if test -z \"$4\" && test -n \"$3\"; then\n    func_error \"Could not determine the host path corresponding to\"\n    func_error \"  \\`$3'\"\n    func_error \"Continuing, but uninstalled executables may not work.\"\n    # Fallback.  This is a deliberately simplistic \"conversion\" and\n    # should not be \"improved\".  See libtool.info.\n    if test \"x$1\" != \"x$2\"; then\n      lt_replace_pathsep_chars=\"s|$1|$2|g\"\n      func_to_host_path_result=`echo \"$3\" |\n        $SED -e \"$lt_replace_pathsep_chars\"`\n    else\n      func_to_host_path_result=\"$3\"\n    fi\n  fi\n}\n# end func_convert_path_check\n\n\n# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG\n# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT\n# and appending REPL if ORIG matches BACKPAT.\nfunc_convert_path_front_back_pathsep ()\n{\n  $opt_debug\n  case $4 in\n  $1 ) func_to_host_path_result=\"$3$func_to_host_path_result\"\n    ;;\n  esac\n  case $4 in\n  $2 ) func_append func_to_host_path_result \"$3\"\n    ;;\n  esac\n}\n# end func_convert_path_front_back_pathsep\n\n\n##################################################\n# $build to $host FILE NAME CONVERSION FUNCTIONS #\n##################################################\n# invoked via `$to_host_file_cmd ARG'\n#\n# In each case, ARG is the path to be converted from $build to $host format.\n# Result will be available in $func_to_host_file_result.\n\n\n# func_to_host_file ARG\n# Converts the file name ARG from $build format to $host format. Return result\n# in func_to_host_file_result.\nfunc_to_host_file ()\n{\n  $opt_debug\n  $to_host_file_cmd \"$1\"\n}\n# end func_to_host_file\n\n\n# func_to_tool_file ARG LAZY\n# converts the file name ARG from $build format to toolchain format. Return\n# result in func_to_tool_file_result.  If the conversion in use is listed\n# in (the comma separated) LAZY, no conversion takes place.\nfunc_to_tool_file ()\n{\n  $opt_debug\n  case ,$2, in\n    *,\"$to_tool_file_cmd\",*)\n      func_to_tool_file_result=$1\n      ;;\n    *)\n      $to_tool_file_cmd \"$1\"\n      func_to_tool_file_result=$func_to_host_file_result\n      ;;\n  esac\n}\n# end func_to_tool_file\n\n\n# func_convert_file_noop ARG\n# Copy ARG to func_to_host_file_result.\nfunc_convert_file_noop ()\n{\n  func_to_host_file_result=\"$1\"\n}\n# end func_convert_file_noop\n\n\n# func_convert_file_msys_to_w32 ARG\n# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic\n# conversion to w32 is not available inside the cwrapper.  Returns result in\n# func_to_host_file_result.\nfunc_convert_file_msys_to_w32 ()\n{\n  $opt_debug\n  func_to_host_file_result=\"$1\"\n  if test -n \"$1\"; then\n    func_convert_core_msys_to_w32 \"$1\"\n    func_to_host_file_result=\"$func_convert_core_msys_to_w32_result\"\n  fi\n  func_convert_file_check \"$1\" \"$func_to_host_file_result\"\n}\n# end func_convert_file_msys_to_w32\n\n\n# func_convert_file_cygwin_to_w32 ARG\n# Convert file name ARG from Cygwin to w32 format.  Returns result in\n# func_to_host_file_result.\nfunc_convert_file_cygwin_to_w32 ()\n{\n  $opt_debug\n  func_to_host_file_result=\"$1\"\n  if test -n \"$1\"; then\n    # because $build is cygwin, we call \"the\" cygpath in $PATH; no need to use\n    # LT_CYGPATH in this case.\n    func_to_host_file_result=`cygpath -m \"$1\"`\n  fi\n  func_convert_file_check \"$1\" \"$func_to_host_file_result\"\n}\n# end func_convert_file_cygwin_to_w32\n\n\n# func_convert_file_nix_to_w32 ARG\n# Convert file name ARG from *nix to w32 format.  Requires a wine environment\n# and a working winepath. Returns result in func_to_host_file_result.\nfunc_convert_file_nix_to_w32 ()\n{\n  $opt_debug\n  func_to_host_file_result=\"$1\"\n  if test -n \"$1\"; then\n    func_convert_core_file_wine_to_w32 \"$1\"\n    func_to_host_file_result=\"$func_convert_core_file_wine_to_w32_result\"\n  fi\n  func_convert_file_check \"$1\" \"$func_to_host_file_result\"\n}\n# end func_convert_file_nix_to_w32\n\n\n# func_convert_file_msys_to_cygwin ARG\n# Convert file name ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.\n# Returns result in func_to_host_file_result.\nfunc_convert_file_msys_to_cygwin ()\n{\n  $opt_debug\n  func_to_host_file_result=\"$1\"\n  if test -n \"$1\"; then\n    func_convert_core_msys_to_w32 \"$1\"\n    func_cygpath -u \"$func_convert_core_msys_to_w32_result\"\n    func_to_host_file_result=\"$func_cygpath_result\"\n  fi\n  func_convert_file_check \"$1\" \"$func_to_host_file_result\"\n}\n# end func_convert_file_msys_to_cygwin\n\n\n# func_convert_file_nix_to_cygwin ARG\n# Convert file name ARG from *nix to Cygwin format.  Requires Cygwin installed\n# in a wine environment, working winepath, and LT_CYGPATH set.  Returns result\n# in func_to_host_file_result.\nfunc_convert_file_nix_to_cygwin ()\n{\n  $opt_debug\n  func_to_host_file_result=\"$1\"\n  if test -n \"$1\"; then\n    # convert from *nix to w32, then use cygpath to convert from w32 to cygwin.\n    func_convert_core_file_wine_to_w32 \"$1\"\n    func_cygpath -u \"$func_convert_core_file_wine_to_w32_result\"\n    func_to_host_file_result=\"$func_cygpath_result\"\n  fi\n  func_convert_file_check \"$1\" \"$func_to_host_file_result\"\n}\n# end func_convert_file_nix_to_cygwin\n\n\n#############################################\n# $build to $host PATH CONVERSION FUNCTIONS #\n#############################################\n# invoked via `$to_host_path_cmd ARG'\n#\n# In each case, ARG is the path to be converted from $build to $host format.\n# The result will be available in $func_to_host_path_result.\n#\n# Path separators are also converted from $build format to $host format.  If\n# ARG begins or ends with a path separator character, it is preserved (but\n# converted to $host format) on output.\n#\n# All path conversion functions are named using the following convention:\n#   file name conversion function    : func_convert_file_X_to_Y ()\n#   path conversion function         : func_convert_path_X_to_Y ()\n# where, for any given $build/$host combination the 'X_to_Y' value is the\n# same.  If conversion functions are added for new $build/$host combinations,\n# the two new functions must follow this pattern, or func_init_to_host_path_cmd\n# will break.\n\n\n# func_init_to_host_path_cmd\n# Ensures that function \"pointer\" variable $to_host_path_cmd is set to the\n# appropriate value, based on the value of $to_host_file_cmd.\nto_host_path_cmd=\nfunc_init_to_host_path_cmd ()\n{\n  $opt_debug\n  if test -z \"$to_host_path_cmd\"; then\n    func_stripname 'func_convert_file_' '' \"$to_host_file_cmd\"\n    to_host_path_cmd=\"func_convert_path_${func_stripname_result}\"\n  fi\n}\n\n\n# func_to_host_path ARG\n# Converts the path ARG from $build format to $host format. Return result\n# in func_to_host_path_result.\nfunc_to_host_path ()\n{\n  $opt_debug\n  func_init_to_host_path_cmd\n  $to_host_path_cmd \"$1\"\n}\n# end func_to_host_path\n\n\n# func_convert_path_noop ARG\n# Copy ARG to func_to_host_path_result.\nfunc_convert_path_noop ()\n{\n  func_to_host_path_result=\"$1\"\n}\n# end func_convert_path_noop\n\n\n# func_convert_path_msys_to_w32 ARG\n# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic\n# conversion to w32 is not available inside the cwrapper.  Returns result in\n# func_to_host_path_result.\nfunc_convert_path_msys_to_w32 ()\n{\n  $opt_debug\n  func_to_host_path_result=\"$1\"\n  if test -n \"$1\"; then\n    # Remove leading and trailing path separator characters from ARG.  MSYS\n    # behavior is inconsistent here; cygpath turns them into '.;' and ';.';\n    # and winepath ignores them completely.\n    func_stripname : : \"$1\"\n    func_to_host_path_tmp1=$func_stripname_result\n    func_convert_core_msys_to_w32 \"$func_to_host_path_tmp1\"\n    func_to_host_path_result=\"$func_convert_core_msys_to_w32_result\"\n    func_convert_path_check : \";\" \\\n      \"$func_to_host_path_tmp1\" \"$func_to_host_path_result\"\n    func_convert_path_front_back_pathsep \":*\" \"*:\" \";\" \"$1\"\n  fi\n}\n# end func_convert_path_msys_to_w32\n\n\n# func_convert_path_cygwin_to_w32 ARG\n# Convert path ARG from Cygwin to w32 format.  Returns result in\n# func_to_host_file_result.\nfunc_convert_path_cygwin_to_w32 ()\n{\n  $opt_debug\n  func_to_host_path_result=\"$1\"\n  if test -n \"$1\"; then\n    # See func_convert_path_msys_to_w32:\n    func_stripname : : \"$1\"\n    func_to_host_path_tmp1=$func_stripname_result\n    func_to_host_path_result=`cygpath -m -p \"$func_to_host_path_tmp1\"`\n    func_convert_path_check : \";\" \\\n      \"$func_to_host_path_tmp1\" \"$func_to_host_path_result\"\n    func_convert_path_front_back_pathsep \":*\" \"*:\" \";\" \"$1\"\n  fi\n}\n# end func_convert_path_cygwin_to_w32\n\n\n# func_convert_path_nix_to_w32 ARG\n# Convert path ARG from *nix to w32 format.  Requires a wine environment and\n# a working winepath.  Returns result in func_to_host_file_result.\nfunc_convert_path_nix_to_w32 ()\n{\n  $opt_debug\n  func_to_host_path_result=\"$1\"\n  if test -n \"$1\"; then\n    # See func_convert_path_msys_to_w32:\n    func_stripname : : \"$1\"\n    func_to_host_path_tmp1=$func_stripname_result\n    func_convert_core_path_wine_to_w32 \"$func_to_host_path_tmp1\"\n    func_to_host_path_result=\"$func_convert_core_path_wine_to_w32_result\"\n    func_convert_path_check : \";\" \\\n      \"$func_to_host_path_tmp1\" \"$func_to_host_path_result\"\n    func_convert_path_front_back_pathsep \":*\" \"*:\" \";\" \"$1\"\n  fi\n}\n# end func_convert_path_nix_to_w32\n\n\n# func_convert_path_msys_to_cygwin ARG\n# Convert path ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.\n# Returns result in func_to_host_file_result.\nfunc_convert_path_msys_to_cygwin ()\n{\n  $opt_debug\n  func_to_host_path_result=\"$1\"\n  if test -n \"$1\"; then\n    # See func_convert_path_msys_to_w32:\n    func_stripname : : \"$1\"\n    func_to_host_path_tmp1=$func_stripname_result\n    func_convert_core_msys_to_w32 \"$func_to_host_path_tmp1\"\n    func_cygpath -u -p \"$func_convert_core_msys_to_w32_result\"\n    func_to_host_path_result=\"$func_cygpath_result\"\n    func_convert_path_check : : \\\n      \"$func_to_host_path_tmp1\" \"$func_to_host_path_result\"\n    func_convert_path_front_back_pathsep \":*\" \"*:\" : \"$1\"\n  fi\n}\n# end func_convert_path_msys_to_cygwin\n\n\n# func_convert_path_nix_to_cygwin ARG\n# Convert path ARG from *nix to Cygwin format.  Requires Cygwin installed in a\n# a wine environment, working winepath, and LT_CYGPATH set.  Returns result in\n# func_to_host_file_result.\nfunc_convert_path_nix_to_cygwin ()\n{\n  $opt_debug\n  func_to_host_path_result=\"$1\"\n  if test -n \"$1\"; then\n    # Remove leading and trailing path separator characters from\n    # ARG. msys behavior is inconsistent here, cygpath turns them\n    # into '.;' and ';.', and winepath ignores them completely.\n    func_stripname : : \"$1\"\n    func_to_host_path_tmp1=$func_stripname_result\n    func_convert_core_path_wine_to_w32 \"$func_to_host_path_tmp1\"\n    func_cygpath -u -p \"$func_convert_core_path_wine_to_w32_result\"\n    func_to_host_path_result=\"$func_cygpath_result\"\n    func_convert_path_check : : \\\n      \"$func_to_host_path_tmp1\" \"$func_to_host_path_result\"\n    func_convert_path_front_back_pathsep \":*\" \"*:\" : \"$1\"\n  fi\n}\n# end func_convert_path_nix_to_cygwin\n\n\n# func_mode_compile arg...\nfunc_mode_compile ()\n{\n    $opt_debug\n    # Get the compilation command and the source file.\n    base_compile=\n    srcfile=\"$nonopt\"  #  always keep a non-empty value in \"srcfile\"\n    suppress_opt=yes\n    suppress_output=\n    arg_mode=normal\n    libobj=\n    later=\n    pie_flag=\n\n    for arg\n    do\n      case $arg_mode in\n      arg  )\n\t# do not \"continue\".  Instead, add this to base_compile\n\tlastarg=\"$arg\"\n\targ_mode=normal\n\t;;\n\n      target )\n\tlibobj=\"$arg\"\n\targ_mode=normal\n\tcontinue\n\t;;\n\n      normal )\n\t# Accept any command-line options.\n\tcase $arg in\n\t-o)\n\t  test -n \"$libobj\" && \\\n\t    func_fatal_error \"you cannot specify \\`-o' more than once\"\n\t  arg_mode=target\n\t  continue\n\t  ;;\n\n\t-pie | -fpie | -fPIE)\n          func_append pie_flag \" $arg\"\n\t  continue\n\t  ;;\n\n\t-shared | -static | -prefer-pic | -prefer-non-pic)\n\t  func_append later \" $arg\"\n\t  continue\n\t  ;;\n\n\t-no-suppress)\n\t  suppress_opt=no\n\t  continue\n\t  ;;\n\n\t-Xcompiler)\n\t  arg_mode=arg  #  the next one goes into the \"base_compile\" arg list\n\t  continue      #  The current \"srcfile\" will either be retained or\n\t  ;;            #  replaced later.  I would guess that would be a bug.\n\n\t-Wc,*)\n\t  func_stripname '-Wc,' '' \"$arg\"\n\t  args=$func_stripname_result\n\t  lastarg=\n\t  save_ifs=\"$IFS\"; IFS=','\n\t  for arg in $args; do\n\t    IFS=\"$save_ifs\"\n\t    func_append_quoted lastarg \"$arg\"\n\t  done\n\t  IFS=\"$save_ifs\"\n\t  func_stripname ' ' '' \"$lastarg\"\n\t  lastarg=$func_stripname_result\n\n\t  # Add the arguments to base_compile.\n\t  func_append base_compile \" $lastarg\"\n\t  continue\n\t  ;;\n\n\t*)\n\t  # Accept the current argument as the source file.\n\t  # The previous \"srcfile\" becomes the current argument.\n\t  #\n\t  lastarg=\"$srcfile\"\n\t  srcfile=\"$arg\"\n\t  ;;\n\tesac  #  case $arg\n\t;;\n      esac    #  case $arg_mode\n\n      # Aesthetically quote the previous argument.\n      func_append_quoted base_compile \"$lastarg\"\n    done # for arg\n\n    case $arg_mode in\n    arg)\n      func_fatal_error \"you must specify an argument for -Xcompile\"\n      ;;\n    target)\n      func_fatal_error \"you must specify a target with \\`-o'\"\n      ;;\n    *)\n      # Get the name of the library object.\n      test -z \"$libobj\" && {\n\tfunc_basename \"$srcfile\"\n\tlibobj=\"$func_basename_result\"\n      }\n      ;;\n    esac\n\n    # Recognize several different file suffixes.\n    # If the user specifies -o file.o, it is replaced with file.lo\n    case $libobj in\n    *.[cCFSifmso] | \\\n    *.ada | *.adb | *.ads | *.asm | \\\n    *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \\\n    *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup)\n      func_xform \"$libobj\"\n      libobj=$func_xform_result\n      ;;\n    esac\n\n    case $libobj in\n    *.lo) func_lo2o \"$libobj\"; obj=$func_lo2o_result ;;\n    *)\n      func_fatal_error \"cannot determine name of library object from \\`$libobj'\"\n      ;;\n    esac\n\n    func_infer_tag $base_compile\n\n    for arg in $later; do\n      case $arg in\n      -shared)\n\ttest \"$build_libtool_libs\" != yes && \\\n\t  func_fatal_configuration \"can not build a shared library\"\n\tbuild_old_libs=no\n\tcontinue\n\t;;\n\n      -static)\n\tbuild_libtool_libs=no\n\tbuild_old_libs=yes\n\tcontinue\n\t;;\n\n      -prefer-pic)\n\tpic_mode=yes\n\tcontinue\n\t;;\n\n      -prefer-non-pic)\n\tpic_mode=no\n\tcontinue\n\t;;\n      esac\n    done\n\n    func_quote_for_eval \"$libobj\"\n    test \"X$libobj\" != \"X$func_quote_for_eval_result\" \\\n      && $ECHO \"X$libobj\" | $GREP '[]~#^*{};<>?\"'\"'\"'\t &()|`$[]' \\\n      && func_warning \"libobj name \\`$libobj' may not contain shell special characters.\"\n    func_dirname_and_basename \"$obj\" \"/\" \"\"\n    objname=\"$func_basename_result\"\n    xdir=\"$func_dirname_result\"\n    lobj=${xdir}$objdir/$objname\n\n    test -z \"$base_compile\" && \\\n      func_fatal_help \"you must specify a compilation command\"\n\n    # Delete any leftover library objects.\n    if test \"$build_old_libs\" = yes; then\n      removelist=\"$obj $lobj $libobj ${libobj}T\"\n    else\n      removelist=\"$lobj $libobj ${libobj}T\"\n    fi\n\n    # On Cygwin there's no \"real\" PIC flag so we must build both object types\n    case $host_os in\n    cygwin* | mingw* | pw32* | os2* | cegcc*)\n      pic_mode=default\n      ;;\n    esac\n    if test \"$pic_mode\" = no && test \"$deplibs_check_method\" != pass_all; then\n      # non-PIC code in shared libraries is not supported\n      pic_mode=default\n    fi\n\n    # Calculate the filename of the output object if compiler does\n    # not support -o with -c\n    if test \"$compiler_c_o\" = no; then\n      output_obj=`$ECHO \"$srcfile\" | $SED 's%^.*/%%; s%\\.[^.]*$%%'`.${objext}\n      lockfile=\"$output_obj.lock\"\n    else\n      output_obj=\n      need_locks=no\n      lockfile=\n    fi\n\n    # Lock this critical section if it is needed\n    # We use this script file to make the link, it avoids creating a new file\n    if test \"$need_locks\" = yes; then\n      until $opt_dry_run || ln \"$progpath\" \"$lockfile\" 2>/dev/null; do\n\tfunc_echo \"Waiting for $lockfile to be removed\"\n\tsleep 2\n      done\n    elif test \"$need_locks\" = warn; then\n      if test -f \"$lockfile\"; then\n\t$ECHO \"\\\n*** ERROR, $lockfile exists and contains:\n`cat $lockfile 2>/dev/null`\n\nThis indicates that another process is trying to use the same\ntemporary object file, and libtool could not work around it because\nyour compiler does not support \\`-c' and \\`-o' together.  If you\nrepeat this compilation, it may succeed, by chance, but you had better\navoid parallel builds (make -j) in this platform, or get a better\ncompiler.\"\n\n\t$opt_dry_run || $RM $removelist\n\texit $EXIT_FAILURE\n      fi\n      func_append removelist \" $output_obj\"\n      $ECHO \"$srcfile\" > \"$lockfile\"\n    fi\n\n    $opt_dry_run || $RM $removelist\n    func_append removelist \" $lockfile\"\n    trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15\n\n    func_to_tool_file \"$srcfile\" func_convert_file_msys_to_w32\n    srcfile=$func_to_tool_file_result\n    func_quote_for_eval \"$srcfile\"\n    qsrcfile=$func_quote_for_eval_result\n\n    # Only build a PIC object if we are building libtool libraries.\n    if test \"$build_libtool_libs\" = yes; then\n      # Without this assignment, base_compile gets emptied.\n      fbsd_hideous_sh_bug=$base_compile\n\n      if test \"$pic_mode\" != no; then\n\tcommand=\"$base_compile $qsrcfile $pic_flag\"\n      else\n\t# Don't build PIC code\n\tcommand=\"$base_compile $qsrcfile\"\n      fi\n\n      func_mkdir_p \"$xdir$objdir\"\n\n      if test -z \"$output_obj\"; then\n\t# Place PIC objects in $objdir\n\tfunc_append command \" -o $lobj\"\n      fi\n\n      func_show_eval_locale \"$command\"\t\\\n          'test -n \"$output_obj\" && $RM $removelist; exit $EXIT_FAILURE'\n\n      if test \"$need_locks\" = warn &&\n\t test \"X`cat $lockfile 2>/dev/null`\" != \"X$srcfile\"; then\n\t$ECHO \"\\\n*** ERROR, $lockfile contains:\n`cat $lockfile 2>/dev/null`\n\nbut it should contain:\n$srcfile\n\nThis indicates that another process is trying to use the same\ntemporary object file, and libtool could not work around it because\nyour compiler does not support \\`-c' and \\`-o' together.  If you\nrepeat this compilation, it may succeed, by chance, but you had better\navoid parallel builds (make -j) in this platform, or get a better\ncompiler.\"\n\n\t$opt_dry_run || $RM $removelist\n\texit $EXIT_FAILURE\n      fi\n\n      # Just move the object if needed, then go on to compile the next one\n      if test -n \"$output_obj\" && test \"X$output_obj\" != \"X$lobj\"; then\n\tfunc_show_eval '$MV \"$output_obj\" \"$lobj\"' \\\n\t  'error=$?; $opt_dry_run || $RM $removelist; exit $error'\n      fi\n\n      # Allow error messages only from the first compilation.\n      if test \"$suppress_opt\" = yes; then\n\tsuppress_output=' >/dev/null 2>&1'\n      fi\n    fi\n\n    # Only build a position-dependent object if we build old libraries.\n    if test \"$build_old_libs\" = yes; then\n      if test \"$pic_mode\" != yes; then\n\t# Don't build PIC code\n\tcommand=\"$base_compile $qsrcfile$pie_flag\"\n      else\n\tcommand=\"$base_compile $qsrcfile $pic_flag\"\n      fi\n      if test \"$compiler_c_o\" = yes; then\n\tfunc_append command \" -o $obj\"\n      fi\n\n      # Suppress compiler output if we already did a PIC compilation.\n      func_append command \"$suppress_output\"\n      func_show_eval_locale \"$command\" \\\n        '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'\n\n      if test \"$need_locks\" = warn &&\n\t test \"X`cat $lockfile 2>/dev/null`\" != \"X$srcfile\"; then\n\t$ECHO \"\\\n*** ERROR, $lockfile contains:\n`cat $lockfile 2>/dev/null`\n\nbut it should contain:\n$srcfile\n\nThis indicates that another process is trying to use the same\ntemporary object file, and libtool could not work around it because\nyour compiler does not support \\`-c' and \\`-o' together.  If you\nrepeat this compilation, it may succeed, by chance, but you had better\navoid parallel builds (make -j) in this platform, or get a better\ncompiler.\"\n\n\t$opt_dry_run || $RM $removelist\n\texit $EXIT_FAILURE\n      fi\n\n      # Just move the object if needed\n      if test -n \"$output_obj\" && test \"X$output_obj\" != \"X$obj\"; then\n\tfunc_show_eval '$MV \"$output_obj\" \"$obj\"' \\\n\t  'error=$?; $opt_dry_run || $RM $removelist; exit $error'\n      fi\n    fi\n\n    $opt_dry_run || {\n      func_write_libtool_object \"$libobj\" \"$objdir/$objname\" \"$objname\"\n\n      # Unlock the critical section if it was locked\n      if test \"$need_locks\" != no; then\n\tremovelist=$lockfile\n        $RM \"$lockfile\"\n      fi\n    }\n\n    exit $EXIT_SUCCESS\n}\n\n$opt_help || {\n  test \"$opt_mode\" = compile && func_mode_compile ${1+\"$@\"}\n}\n\nfunc_mode_help ()\n{\n    # We need to display help for each of the modes.\n    case $opt_mode in\n      \"\")\n        # Generic help is extracted from the usage comments\n        # at the start of this file.\n        func_help\n        ;;\n\n      clean)\n        $ECHO \\\n\"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...\n\nRemove files from the build directory.\n\nRM is the name of the program to use to delete files associated with each FILE\n(typically \\`/bin/rm').  RM-OPTIONS are options (such as \\`-f') to be passed\nto RM.\n\nIf FILE is a libtool library, object or program, all the files associated\nwith it are deleted. Otherwise, only FILE itself is deleted using RM.\"\n        ;;\n\n      compile)\n      $ECHO \\\n\"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE\n\nCompile a source file into a libtool library object.\n\nThis mode accepts the following additional options:\n\n  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE\n  -no-suppress      do not suppress compiler output for multiple passes\n  -prefer-pic       try to build PIC objects only\n  -prefer-non-pic   try to build non-PIC objects only\n  -shared           do not build a \\`.o' file suitable for static linking\n  -static           only build a \\`.o' file suitable for static linking\n  -Wc,FLAG          pass FLAG directly to the compiler\n\nCOMPILE-COMMAND is a command to be used in creating a \\`standard' object file\nfrom the given SOURCEFILE.\n\nThe output file name is determined by removing the directory component from\nSOURCEFILE, then substituting the C source code suffix \\`.c' with the\nlibrary object suffix, \\`.lo'.\"\n        ;;\n\n      execute)\n        $ECHO \\\n\"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...\n\nAutomatically set library path, then run a program.\n\nThis mode accepts the following additional options:\n\n  -dlopen FILE      add the directory containing FILE to the library path\n\nThis mode sets the library path environment variable according to \\`-dlopen'\nflags.\n\nIf any of the ARGS are libtool executable wrappers, then they are translated\ninto their corresponding uninstalled binary, and any of their required library\ndirectories are added to the library path.\n\nThen, COMMAND is executed, with ARGS as arguments.\"\n        ;;\n\n      finish)\n        $ECHO \\\n\"Usage: $progname [OPTION]... --mode=finish [LIBDIR]...\n\nComplete the installation of libtool libraries.\n\nEach LIBDIR is a directory that contains libtool libraries.\n\nThe commands that this mode executes may require superuser privileges.  Use\nthe \\`--dry-run' option if you just want to see what would be executed.\"\n        ;;\n\n      install)\n        $ECHO \\\n\"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...\n\nInstall executables or libraries.\n\nINSTALL-COMMAND is the installation command.  The first component should be\neither the \\`install' or \\`cp' program.\n\nThe following components of INSTALL-COMMAND are treated specially:\n\n  -inst-prefix-dir PREFIX-DIR  Use PREFIX-DIR as a staging area for installation\n\nThe rest of the components are interpreted as arguments to that command (only\nBSD-compatible install options are recognized).\"\n        ;;\n\n      link)\n        $ECHO \\\n\"Usage: $progname [OPTION]... --mode=link LINK-COMMAND...\n\nLink object files or libraries together to form another library, or to\ncreate an executable program.\n\nLINK-COMMAND is a command using the C compiler that you would use to create\na program from several object files.\n\nThe following components of LINK-COMMAND are treated specially:\n\n  -all-static       do not do any dynamic linking at all\n  -avoid-version    do not add a version suffix if possible\n  -bindir BINDIR    specify path to binaries directory (for systems where\n                    libraries must be found in the PATH setting at runtime)\n  -dlopen FILE      \\`-dlpreopen' FILE if it cannot be dlopened at runtime\n  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols\n  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)\n  -export-symbols SYMFILE\n                    try to export only the symbols listed in SYMFILE\n  -export-symbols-regex REGEX\n                    try to export only the symbols matching REGEX\n  -LLIBDIR          search LIBDIR for required installed libraries\n  -lNAME            OUTPUT-FILE requires the installed library libNAME\n  -module           build a library that can dlopened\n  -no-fast-install  disable the fast-install mode\n  -no-install       link a not-installable executable\n  -no-undefined     declare that a library does not refer to external symbols\n  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects\n  -objectlist FILE  Use a list of object files found in FILE to specify objects\n  -precious-files-regex REGEX\n                    don't remove output files matching REGEX\n  -release RELEASE  specify package release information\n  -rpath LIBDIR     the created library will eventually be installed in LIBDIR\n  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries\n  -shared           only do dynamic linking of libtool libraries\n  -shrext SUFFIX    override the standard shared library file extension\n  -static           do not do any dynamic linking of uninstalled libtool libraries\n  -static-libtool-libs\n                    do not do any dynamic linking of libtool libraries\n  -version-info CURRENT[:REVISION[:AGE]]\n                    specify library version info [each variable defaults to 0]\n  -weak LIBNAME     declare that the target provides the LIBNAME interface\n  -Wc,FLAG\n  -Xcompiler FLAG   pass linker-specific FLAG directly to the compiler\n  -Wl,FLAG\n  -Xlinker FLAG     pass linker-specific FLAG directly to the linker\n  -XCClinker FLAG   pass link-specific FLAG to the compiler driver (CC)\n\nAll other options (arguments beginning with \\`-') are ignored.\n\nEvery other argument is treated as a filename.  Files ending in \\`.la' are\ntreated as uninstalled libtool libraries, other files are standard or library\nobject files.\n\nIf the OUTPUT-FILE ends in \\`.la', then a libtool library is created,\nonly library objects (\\`.lo' files) may be specified, and \\`-rpath' is\nrequired, except when creating a convenience library.\n\nIf OUTPUT-FILE ends in \\`.a' or \\`.lib', then a standard library is created\nusing \\`ar' and \\`ranlib', or on Windows using \\`lib'.\n\nIf OUTPUT-FILE ends in \\`.lo' or \\`.${objext}', then a reloadable object file\nis created, otherwise an executable program is created.\"\n        ;;\n\n      uninstall)\n        $ECHO \\\n\"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...\n\nRemove libraries from an installation directory.\n\nRM is the name of the program to use to delete files associated with each FILE\n(typically \\`/bin/rm').  RM-OPTIONS are options (such as \\`-f') to be passed\nto RM.\n\nIf FILE is a libtool library, all the files associated with it are deleted.\nOtherwise, only FILE itself is deleted using RM.\"\n        ;;\n\n      *)\n        func_fatal_help \"invalid operation mode \\`$opt_mode'\"\n        ;;\n    esac\n\n    echo\n    $ECHO \"Try \\`$progname --help' for more information about other modes.\"\n}\n\n# Now that we've collected a possible --mode arg, show help if necessary\nif $opt_help; then\n  if test \"$opt_help\" = :; then\n    func_mode_help\n  else\n    {\n      func_help noexit\n      for opt_mode in compile link execute install finish uninstall clean; do\n\tfunc_mode_help\n      done\n    } | sed -n '1p; 2,$s/^Usage:/  or: /p'\n    {\n      func_help noexit\n      for opt_mode in compile link execute install finish uninstall clean; do\n\techo\n\tfunc_mode_help\n      done\n    } |\n    sed '1d\n      /^When reporting/,/^Report/{\n\tH\n\td\n      }\n      $x\n      /information about other modes/d\n      /more detailed .*MODE/d\n      s/^Usage:.*--mode=\\([^ ]*\\) .*/Description of \\1 mode:/'\n  fi\n  exit $?\nfi\n\n\n# func_mode_execute arg...\nfunc_mode_execute ()\n{\n    $opt_debug\n    # The first argument is the command name.\n    cmd=\"$nonopt\"\n    test -z \"$cmd\" && \\\n      func_fatal_help \"you must specify a COMMAND\"\n\n    # Handle -dlopen flags immediately.\n    for file in $opt_dlopen; do\n      test -f \"$file\" \\\n\t|| func_fatal_help \"\\`$file' is not a file\"\n\n      dir=\n      case $file in\n      *.la)\n\tfunc_resolve_sysroot \"$file\"\n\tfile=$func_resolve_sysroot_result\n\n\t# Check to see that this really is a libtool archive.\n\tfunc_lalib_unsafe_p \"$file\" \\\n\t  || func_fatal_help \"\\`$lib' is not a valid libtool archive\"\n\n\t# Read the libtool library.\n\tdlname=\n\tlibrary_names=\n\tfunc_source \"$file\"\n\n\t# Skip this library if it cannot be dlopened.\n\tif test -z \"$dlname\"; then\n\t  # Warn if it was a shared library.\n\t  test -n \"$library_names\" && \\\n\t    func_warning \"\\`$file' was not linked with \\`-export-dynamic'\"\n\t  continue\n\tfi\n\n\tfunc_dirname \"$file\" \"\" \".\"\n\tdir=\"$func_dirname_result\"\n\n\tif test -f \"$dir/$objdir/$dlname\"; then\n\t  func_append dir \"/$objdir\"\n\telse\n\t  if test ! -f \"$dir/$dlname\"; then\n\t    func_fatal_error \"cannot find \\`$dlname' in \\`$dir' or \\`$dir/$objdir'\"\n\t  fi\n\tfi\n\t;;\n\n      *.lo)\n\t# Just add the directory containing the .lo file.\n\tfunc_dirname \"$file\" \"\" \".\"\n\tdir=\"$func_dirname_result\"\n\t;;\n\n      *)\n\tfunc_warning \"\\`-dlopen' is ignored for non-libtool libraries and objects\"\n\tcontinue\n\t;;\n      esac\n\n      # Get the absolute pathname.\n      absdir=`cd \"$dir\" && pwd`\n      test -n \"$absdir\" && dir=\"$absdir\"\n\n      # Now add the directory to shlibpath_var.\n      if eval \"test -z \\\"\\$$shlibpath_var\\\"\"; then\n\teval \"$shlibpath_var=\\\"\\$dir\\\"\"\n      else\n\teval \"$shlibpath_var=\\\"\\$dir:\\$$shlibpath_var\\\"\"\n      fi\n    done\n\n    # This variable tells wrapper scripts just to set shlibpath_var\n    # rather than running their programs.\n    libtool_execute_magic=\"$magic\"\n\n    # Check if any of the arguments is a wrapper script.\n    args=\n    for file\n    do\n      case $file in\n      -* | *.la | *.lo ) ;;\n      *)\n\t# Do a test to see if this is really a libtool program.\n\tif func_ltwrapper_script_p \"$file\"; then\n\t  func_source \"$file\"\n\t  # Transform arg to wrapped name.\n\t  file=\"$progdir/$program\"\n\telif func_ltwrapper_executable_p \"$file\"; then\n\t  func_ltwrapper_scriptname \"$file\"\n\t  func_source \"$func_ltwrapper_scriptname_result\"\n\t  # Transform arg to wrapped name.\n\t  file=\"$progdir/$program\"\n\tfi\n\t;;\n      esac\n      # Quote arguments (to preserve shell metacharacters).\n      func_append_quoted args \"$file\"\n    done\n\n    if test \"X$opt_dry_run\" = Xfalse; then\n      if test -n \"$shlibpath_var\"; then\n\t# Export the shlibpath_var.\n\teval \"export $shlibpath_var\"\n      fi\n\n      # Restore saved environment variables\n      for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES\n      do\n\teval \"if test \\\"\\${save_$lt_var+set}\\\" = set; then\n                $lt_var=\\$save_$lt_var; export $lt_var\n\t      else\n\t\t$lt_unset $lt_var\n\t      fi\"\n      done\n\n      # Now prepare to actually exec the command.\n      exec_cmd=\"\\$cmd$args\"\n    else\n      # Display what would be done.\n      if test -n \"$shlibpath_var\"; then\n\teval \"\\$ECHO \\\"\\$shlibpath_var=\\$$shlibpath_var\\\"\"\n\techo \"export $shlibpath_var\"\n      fi\n      $ECHO \"$cmd$args\"\n      exit $EXIT_SUCCESS\n    fi\n}\n\ntest \"$opt_mode\" = execute && func_mode_execute ${1+\"$@\"}\n\n\n# func_mode_finish arg...\nfunc_mode_finish ()\n{\n    $opt_debug\n    libs=\n    libdirs=\n    admincmds=\n\n    for opt in \"$nonopt\" ${1+\"$@\"}\n    do\n      if test -d \"$opt\"; then\n\tfunc_append libdirs \" $opt\"\n\n      elif test -f \"$opt\"; then\n\tif func_lalib_unsafe_p \"$opt\"; then\n\t  func_append libs \" $opt\"\n\telse\n\t  func_warning \"\\`$opt' is not a valid libtool archive\"\n\tfi\n\n      else\n\tfunc_fatal_error \"invalid argument \\`$opt'\"\n      fi\n    done\n\n    if test -n \"$libs\"; then\n      if test -n \"$lt_sysroot\"; then\n        sysroot_regex=`$ECHO \"$lt_sysroot\" | $SED \"$sed_make_literal_regex\"`\n        sysroot_cmd=\"s/\\([ ']\\)$sysroot_regex/\\1/g;\"\n      else\n        sysroot_cmd=\n      fi\n\n      # Remove sysroot references\n      if $opt_dry_run; then\n        for lib in $libs; do\n          echo \"removing references to $lt_sysroot and \\`=' prefixes from $lib\"\n        done\n      else\n        tmpdir=`func_mktempdir`\n        for lib in $libs; do\n\t  sed -e \"${sysroot_cmd} s/\\([ ']-[LR]\\)=/\\1/g; s/\\([ ']\\)=/\\1/g\" $lib \\\n\t    > $tmpdir/tmp-la\n\t  mv -f $tmpdir/tmp-la $lib\n\tdone\n        ${RM}r \"$tmpdir\"\n      fi\n    fi\n\n    if test -n \"$finish_cmds$finish_eval\" && test -n \"$libdirs\"; then\n      for libdir in $libdirs; do\n\tif test -n \"$finish_cmds\"; then\n\t  # Do each command in the finish commands.\n\t  func_execute_cmds \"$finish_cmds\" 'admincmds=\"$admincmds\n'\"$cmd\"'\"'\n\tfi\n\tif test -n \"$finish_eval\"; then\n\t  # Do the single finish_eval.\n\t  eval cmds=\\\"$finish_eval\\\"\n\t  $opt_dry_run || eval \"$cmds\" || func_append admincmds \"\n       $cmds\"\n\tfi\n      done\n    fi\n\n    # Exit here if they wanted silent mode.\n    $opt_silent && exit $EXIT_SUCCESS\n\n    if test -n \"$finish_cmds$finish_eval\" && test -n \"$libdirs\"; then\n      echo \"----------------------------------------------------------------------\"\n      echo \"Libraries have been installed in:\"\n      for libdir in $libdirs; do\n\t$ECHO \"   $libdir\"\n      done\n      echo\n      echo \"If you ever happen to want to link against installed libraries\"\n      echo \"in a given directory, LIBDIR, you must either use libtool, and\"\n      echo \"specify the full pathname of the library, or use the \\`-LLIBDIR'\"\n      echo \"flag during linking and do at least one of the following:\"\n      if test -n \"$shlibpath_var\"; then\n\techo \"   - add LIBDIR to the \\`$shlibpath_var' environment variable\"\n\techo \"     during execution\"\n      fi\n      if test -n \"$runpath_var\"; then\n\techo \"   - add LIBDIR to the \\`$runpath_var' environment variable\"\n\techo \"     during linking\"\n      fi\n      if test -n \"$hardcode_libdir_flag_spec\"; then\n\tlibdir=LIBDIR\n\teval flag=\\\"$hardcode_libdir_flag_spec\\\"\n\n\t$ECHO \"   - use the \\`$flag' linker flag\"\n      fi\n      if test -n \"$admincmds\"; then\n\t$ECHO \"   - have your system administrator run these commands:$admincmds\"\n      fi\n      if test -f /etc/ld.so.conf; then\n\techo \"   - have your system administrator add LIBDIR to \\`/etc/ld.so.conf'\"\n      fi\n      echo\n\n      echo \"See any operating system documentation about shared libraries for\"\n      case $host in\n\tsolaris2.[6789]|solaris2.1[0-9])\n\t  echo \"more information, such as the ld(1), crle(1) and ld.so(8) manual\"\n\t  echo \"pages.\"\n\t  ;;\n\t*)\n\t  echo \"more information, such as the ld(1) and ld.so(8) manual pages.\"\n\t  ;;\n      esac\n      echo \"----------------------------------------------------------------------\"\n    fi\n    exit $EXIT_SUCCESS\n}\n\ntest \"$opt_mode\" = finish && func_mode_finish ${1+\"$@\"}\n\n\n# func_mode_install arg...\nfunc_mode_install ()\n{\n    $opt_debug\n    # There may be an optional sh(1) argument at the beginning of\n    # install_prog (especially on Windows NT).\n    if test \"$nonopt\" = \"$SHELL\" || test \"$nonopt\" = /bin/sh ||\n       # Allow the use of GNU shtool's install command.\n       case $nonopt in *shtool*) :;; *) false;; esac; then\n      # Aesthetically quote it.\n      func_quote_for_eval \"$nonopt\"\n      install_prog=\"$func_quote_for_eval_result \"\n      arg=$1\n      shift\n    else\n      install_prog=\n      arg=$nonopt\n    fi\n\n    # The real first argument should be the name of the installation program.\n    # Aesthetically quote it.\n    func_quote_for_eval \"$arg\"\n    func_append install_prog \"$func_quote_for_eval_result\"\n    install_shared_prog=$install_prog\n    case \" $install_prog \" in\n      *[\\\\\\ /]cp\\ *) install_cp=: ;;\n      *) install_cp=false ;;\n    esac\n\n    # We need to accept at least all the BSD install flags.\n    dest=\n    files=\n    opts=\n    prev=\n    install_type=\n    isdir=no\n    stripme=\n    no_mode=:\n    for arg\n    do\n      arg2=\n      if test -n \"$dest\"; then\n\tfunc_append files \" $dest\"\n\tdest=$arg\n\tcontinue\n      fi\n\n      case $arg in\n      -d) isdir=yes ;;\n      -f)\n\tif $install_cp; then :; else\n\t  prev=$arg\n\tfi\n\t;;\n      -g | -m | -o)\n\tprev=$arg\n\t;;\n      -s)\n\tstripme=\" -s\"\n\tcontinue\n\t;;\n      -*)\n\t;;\n      *)\n\t# If the previous option needed an argument, then skip it.\n\tif test -n \"$prev\"; then\n\t  if test \"x$prev\" = x-m && test -n \"$install_override_mode\"; then\n\t    arg2=$install_override_mode\n\t    no_mode=false\n\t  fi\n\t  prev=\n\telse\n\t  dest=$arg\n\t  continue\n\tfi\n\t;;\n      esac\n\n      # Aesthetically quote the argument.\n      func_quote_for_eval \"$arg\"\n      func_append install_prog \" $func_quote_for_eval_result\"\n      if test -n \"$arg2\"; then\n\tfunc_quote_for_eval \"$arg2\"\n      fi\n      func_append install_shared_prog \" $func_quote_for_eval_result\"\n    done\n\n    test -z \"$install_prog\" && \\\n      func_fatal_help \"you must specify an install program\"\n\n    test -n \"$prev\" && \\\n      func_fatal_help \"the \\`$prev' option requires an argument\"\n\n    if test -n \"$install_override_mode\" && $no_mode; then\n      if $install_cp; then :; else\n\tfunc_quote_for_eval \"$install_override_mode\"\n\tfunc_append install_shared_prog \" -m $func_quote_for_eval_result\"\n      fi\n    fi\n\n    if test -z \"$files\"; then\n      if test -z \"$dest\"; then\n\tfunc_fatal_help \"no file or destination specified\"\n      else\n\tfunc_fatal_help \"you must specify a destination\"\n      fi\n    fi\n\n    # Strip any trailing slash from the destination.\n    func_stripname '' '/' \"$dest\"\n    dest=$func_stripname_result\n\n    # Check to see that the destination is a directory.\n    test -d \"$dest\" && isdir=yes\n    if test \"$isdir\" = yes; then\n      destdir=\"$dest\"\n      destname=\n    else\n      func_dirname_and_basename \"$dest\" \"\" \".\"\n      destdir=\"$func_dirname_result\"\n      destname=\"$func_basename_result\"\n\n      # Not a directory, so check to see that there is only one file specified.\n      set dummy $files; shift\n      test \"$#\" -gt 1 && \\\n\tfunc_fatal_help \"\\`$dest' is not a directory\"\n    fi\n    case $destdir in\n    [\\\\/]* | [A-Za-z]:[\\\\/]*) ;;\n    *)\n      for file in $files; do\n\tcase $file in\n\t*.lo) ;;\n\t*)\n\t  func_fatal_help \"\\`$destdir' must be an absolute directory name\"\n\t  ;;\n\tesac\n      done\n      ;;\n    esac\n\n    # This variable tells wrapper scripts just to set variables rather\n    # than running their programs.\n    libtool_install_magic=\"$magic\"\n\n    staticlibs=\n    future_libdirs=\n    current_libdirs=\n    for file in $files; do\n\n      # Do each installation.\n      case $file in\n      *.$libext)\n\t# Do the static libraries later.\n\tfunc_append staticlibs \" $file\"\n\t;;\n\n      *.la)\n\tfunc_resolve_sysroot \"$file\"\n\tfile=$func_resolve_sysroot_result\n\n\t# Check to see that this really is a libtool archive.\n\tfunc_lalib_unsafe_p \"$file\" \\\n\t  || func_fatal_help \"\\`$file' is not a valid libtool archive\"\n\n\tlibrary_names=\n\told_library=\n\trelink_command=\n\tfunc_source \"$file\"\n\n\t# Add the libdir to current_libdirs if it is the destination.\n\tif test \"X$destdir\" = \"X$libdir\"; then\n\t  case \"$current_libdirs \" in\n\t  *\" $libdir \"*) ;;\n\t  *) func_append current_libdirs \" $libdir\" ;;\n\t  esac\n\telse\n\t  # Note the libdir as a future libdir.\n\t  case \"$future_libdirs \" in\n\t  *\" $libdir \"*) ;;\n\t  *) func_append future_libdirs \" $libdir\" ;;\n\t  esac\n\tfi\n\n\tfunc_dirname \"$file\" \"/\" \"\"\n\tdir=\"$func_dirname_result\"\n\tfunc_append dir \"$objdir\"\n\n\tif test -n \"$relink_command\"; then\n\t  # Determine the prefix the user has applied to our future dir.\n\t  inst_prefix_dir=`$ECHO \"$destdir\" | $SED -e \"s%$libdir\\$%%\"`\n\n\t  # Don't allow the user to place us outside of our expected\n\t  # location b/c this prevents finding dependent libraries that\n\t  # are installed to the same prefix.\n\t  # At present, this check doesn't affect windows .dll's that\n\t  # are installed into $libdir/../bin (currently, that works fine)\n\t  # but it's something to keep an eye on.\n\t  test \"$inst_prefix_dir\" = \"$destdir\" && \\\n\t    func_fatal_error \"error: cannot install \\`$file' to a directory not ending in $libdir\"\n\n\t  if test -n \"$inst_prefix_dir\"; then\n\t    # Stick the inst_prefix_dir data into the link command.\n\t    relink_command=`$ECHO \"$relink_command\" | $SED \"s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%\"`\n\t  else\n\t    relink_command=`$ECHO \"$relink_command\" | $SED \"s%@inst_prefix_dir@%%\"`\n\t  fi\n\n\t  func_warning \"relinking \\`$file'\"\n\t  func_show_eval \"$relink_command\" \\\n\t    'func_fatal_error \"error: relink \\`$file'\\'' with the above command before installing it\"'\n\tfi\n\n\t# See the names of the shared library.\n\tset dummy $library_names; shift\n\tif test -n \"$1\"; then\n\t  realname=\"$1\"\n\t  shift\n\n\t  srcname=\"$realname\"\n\t  test -n \"$relink_command\" && srcname=\"$realname\"T\n\n\t  # Install the shared library and build the symlinks.\n\t  func_show_eval \"$install_shared_prog $dir/$srcname $destdir/$realname\" \\\n\t      'exit $?'\n\t  tstripme=\"$stripme\"\n\t  case $host_os in\n\t  cygwin* | mingw* | pw32* | cegcc*)\n\t    case $realname in\n\t    *.dll.a)\n\t      tstripme=\"\"\n\t      ;;\n\t    esac\n\t    ;;\n\t  esac\n\t  if test -n \"$tstripme\" && test -n \"$striplib\"; then\n\t    func_show_eval \"$striplib $destdir/$realname\" 'exit $?'\n\t  fi\n\n\t  if test \"$#\" -gt 0; then\n\t    # Delete the old symlinks, and create new ones.\n\t    # Try `ln -sf' first, because the `ln' binary might depend on\n\t    # the symlink we replace!  Solaris /bin/ln does not understand -f,\n\t    # so we also need to try rm && ln -s.\n\t    for linkname\n\t    do\n\t      test \"$linkname\" != \"$realname\" \\\n\t\t&& func_show_eval \"(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })\"\n\t    done\n\t  fi\n\n\t  # Do each command in the postinstall commands.\n\t  lib=\"$destdir/$realname\"\n\t  func_execute_cmds \"$postinstall_cmds\" 'exit $?'\n\tfi\n\n\t# Install the pseudo-library for information purposes.\n\tfunc_basename \"$file\"\n\tname=\"$func_basename_result\"\n\tinstname=\"$dir/$name\"i\n\tfunc_show_eval \"$install_prog $instname $destdir/$name\" 'exit $?'\n\n\t# Maybe install the static library, too.\n\ttest -n \"$old_library\" && func_append staticlibs \" $dir/$old_library\"\n\t;;\n\n      *.lo)\n\t# Install (i.e. copy) a libtool object.\n\n\t# Figure out destination file name, if it wasn't already specified.\n\tif test -n \"$destname\"; then\n\t  destfile=\"$destdir/$destname\"\n\telse\n\t  func_basename \"$file\"\n\t  destfile=\"$func_basename_result\"\n\t  destfile=\"$destdir/$destfile\"\n\tfi\n\n\t# Deduce the name of the destination old-style object file.\n\tcase $destfile in\n\t*.lo)\n\t  func_lo2o \"$destfile\"\n\t  staticdest=$func_lo2o_result\n\t  ;;\n\t*.$objext)\n\t  staticdest=\"$destfile\"\n\t  destfile=\n\t  ;;\n\t*)\n\t  func_fatal_help \"cannot copy a libtool object to \\`$destfile'\"\n\t  ;;\n\tesac\n\n\t# Install the libtool object if requested.\n\ttest -n \"$destfile\" && \\\n\t  func_show_eval \"$install_prog $file $destfile\" 'exit $?'\n\n\t# Install the old object if enabled.\n\tif test \"$build_old_libs\" = yes; then\n\t  # Deduce the name of the old-style object file.\n\t  func_lo2o \"$file\"\n\t  staticobj=$func_lo2o_result\n\t  func_show_eval \"$install_prog \\$staticobj \\$staticdest\" 'exit $?'\n\tfi\n\texit $EXIT_SUCCESS\n\t;;\n\n      *)\n\t# Figure out destination file name, if it wasn't already specified.\n\tif test -n \"$destname\"; then\n\t  destfile=\"$destdir/$destname\"\n\telse\n\t  func_basename \"$file\"\n\t  destfile=\"$func_basename_result\"\n\t  destfile=\"$destdir/$destfile\"\n\tfi\n\n\t# If the file is missing, and there is a .exe on the end, strip it\n\t# because it is most likely a libtool script we actually want to\n\t# install\n\tstripped_ext=\"\"\n\tcase $file in\n\t  *.exe)\n\t    if test ! -f \"$file\"; then\n\t      func_stripname '' '.exe' \"$file\"\n\t      file=$func_stripname_result\n\t      stripped_ext=\".exe\"\n\t    fi\n\t    ;;\n\tesac\n\n\t# Do a test to see if this is really a libtool program.\n\tcase $host in\n\t*cygwin* | *mingw*)\n\t    if func_ltwrapper_executable_p \"$file\"; then\n\t      func_ltwrapper_scriptname \"$file\"\n\t      wrapper=$func_ltwrapper_scriptname_result\n\t    else\n\t      func_stripname '' '.exe' \"$file\"\n\t      wrapper=$func_stripname_result\n\t    fi\n\t    ;;\n\t*)\n\t    wrapper=$file\n\t    ;;\n\tesac\n\tif func_ltwrapper_script_p \"$wrapper\"; then\n\t  notinst_deplibs=\n\t  relink_command=\n\n\t  func_source \"$wrapper\"\n\n\t  # Check the variables that should have been set.\n\t  test -z \"$generated_by_libtool_version\" && \\\n\t    func_fatal_error \"invalid libtool wrapper script \\`$wrapper'\"\n\n\t  finalize=yes\n\t  for lib in $notinst_deplibs; do\n\t    # Check to see that each library is installed.\n\t    libdir=\n\t    if test -f \"$lib\"; then\n\t      func_source \"$lib\"\n\t    fi\n\t    libfile=\"$libdir/\"`$ECHO \"$lib\" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test\n\t    if test -n \"$libdir\" && test ! -f \"$libfile\"; then\n\t      func_warning \"\\`$lib' has not been installed in \\`$libdir'\"\n\t      finalize=no\n\t    fi\n\t  done\n\n\t  relink_command=\n\t  func_source \"$wrapper\"\n\n\t  outputname=\n\t  if test \"$fast_install\" = no && test -n \"$relink_command\"; then\n\t    $opt_dry_run || {\n\t      if test \"$finalize\" = yes; then\n\t        tmpdir=`func_mktempdir`\n\t\tfunc_basename \"$file$stripped_ext\"\n\t\tfile=\"$func_basename_result\"\n\t        outputname=\"$tmpdir/$file\"\n\t        # Replace the output file specification.\n\t        relink_command=`$ECHO \"$relink_command\" | $SED 's%@OUTPUT@%'\"$outputname\"'%g'`\n\n\t        $opt_silent || {\n\t          func_quote_for_expand \"$relink_command\"\n\t\t  eval \"func_echo $func_quote_for_expand_result\"\n\t        }\n\t        if eval \"$relink_command\"; then :\n\t          else\n\t\t  func_error \"error: relink \\`$file' with the above command before installing it\"\n\t\t  $opt_dry_run || ${RM}r \"$tmpdir\"\n\t\t  continue\n\t        fi\n\t        file=\"$outputname\"\n\t      else\n\t        func_warning \"cannot relink \\`$file'\"\n\t      fi\n\t    }\n\t  else\n\t    # Install the binary that we compiled earlier.\n\t    file=`$ECHO \"$file$stripped_ext\" | $SED \"s%\\([^/]*\\)$%$objdir/\\1%\"`\n\t  fi\n\tfi\n\n\t# remove .exe since cygwin /usr/bin/install will append another\n\t# one anyway\n\tcase $install_prog,$host in\n\t*/usr/bin/install*,*cygwin*)\n\t  case $file:$destfile in\n\t  *.exe:*.exe)\n\t    # this is ok\n\t    ;;\n\t  *.exe:*)\n\t    destfile=$destfile.exe\n\t    ;;\n\t  *:*.exe)\n\t    func_stripname '' '.exe' \"$destfile\"\n\t    destfile=$func_stripname_result\n\t    ;;\n\t  esac\n\t  ;;\n\tesac\n\tfunc_show_eval \"$install_prog\\$stripme \\$file \\$destfile\" 'exit $?'\n\t$opt_dry_run || if test -n \"$outputname\"; then\n\t  ${RM}r \"$tmpdir\"\n\tfi\n\t;;\n      esac\n    done\n\n    for file in $staticlibs; do\n      func_basename \"$file\"\n      name=\"$func_basename_result\"\n\n      # Set up the ranlib parameters.\n      oldlib=\"$destdir/$name\"\n      func_to_tool_file \"$oldlib\" func_convert_file_msys_to_w32\n      tool_oldlib=$func_to_tool_file_result\n\n      func_show_eval \"$install_prog \\$file \\$oldlib\" 'exit $?'\n\n      if test -n \"$stripme\" && test -n \"$old_striplib\"; then\n\tfunc_show_eval \"$old_striplib $tool_oldlib\" 'exit $?'\n      fi\n\n      # Do each command in the postinstall commands.\n      func_execute_cmds \"$old_postinstall_cmds\" 'exit $?'\n    done\n\n    test -n \"$future_libdirs\" && \\\n      func_warning \"remember to run \\`$progname --finish$future_libdirs'\"\n\n    if test -n \"$current_libdirs\"; then\n      # Maybe just do a dry run.\n      $opt_dry_run && current_libdirs=\" -n$current_libdirs\"\n      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'\n    else\n      exit $EXIT_SUCCESS\n    fi\n}\n\ntest \"$opt_mode\" = install && func_mode_install ${1+\"$@\"}\n\n\n# func_generate_dlsyms outputname originator pic_p\n# Extract symbols from dlprefiles and create ${outputname}S.o with\n# a dlpreopen symbol table.\nfunc_generate_dlsyms ()\n{\n    $opt_debug\n    my_outputname=\"$1\"\n    my_originator=\"$2\"\n    my_pic_p=\"${3-no}\"\n    my_prefix=`$ECHO \"$my_originator\" | sed 's%[^a-zA-Z0-9]%_%g'`\n    my_dlsyms=\n\n    if test -n \"$dlfiles$dlprefiles\" || test \"$dlself\" != no; then\n      if test -n \"$NM\" && test -n \"$global_symbol_pipe\"; then\n\tmy_dlsyms=\"${my_outputname}S.c\"\n      else\n\tfunc_error \"not configured to extract global symbols from dlpreopened files\"\n      fi\n    fi\n\n    if test -n \"$my_dlsyms\"; then\n      case $my_dlsyms in\n      \"\") ;;\n      *.c)\n\t# Discover the nlist of each of the dlfiles.\n\tnlist=\"$output_objdir/${my_outputname}.nm\"\n\n\tfunc_show_eval \"$RM $nlist ${nlist}S ${nlist}T\"\n\n\t# Parse the name list into a source file.\n\tfunc_verbose \"creating $output_objdir/$my_dlsyms\"\n\n\t$opt_dry_run || $ECHO > \"$output_objdir/$my_dlsyms\" \"\\\n/* $my_dlsyms - symbol resolution table for \\`$my_outputname' dlsym emulation. */\n/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */\n\n#ifdef __cplusplus\nextern \\\"C\\\" {\n#endif\n\n#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))\n#pragma GCC diagnostic ignored \\\"-Wstrict-prototypes\\\"\n#endif\n\n/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */\n#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)\n/* DATA imports from DLLs on WIN32 con't be const, because runtime\n   relocations are performed -- see ld's documentation on pseudo-relocs.  */\n# define LT_DLSYM_CONST\n#elif defined(__osf__)\n/* This system does not cope well with relocations in const data.  */\n# define LT_DLSYM_CONST\n#else\n# define LT_DLSYM_CONST const\n#endif\n\n/* External symbol declarations for the compiler. */\\\n\"\n\n\tif test \"$dlself\" = yes; then\n\t  func_verbose \"generating symbol list for \\`$output'\"\n\n\t  $opt_dry_run || echo ': @PROGRAM@ ' > \"$nlist\"\n\n\t  # Add our own program objects to the symbol list.\n\t  progfiles=`$ECHO \"$objs$old_deplibs\" | $SP2NL | $SED \"$lo2o\" | $NL2SP`\n\t  for progfile in $progfiles; do\n\t    func_to_tool_file \"$progfile\" func_convert_file_msys_to_w32\n\t    func_verbose \"extracting global C symbols from \\`$func_to_tool_file_result'\"\n\t    $opt_dry_run || eval \"$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'\"\n\t  done\n\n\t  if test -n \"$exclude_expsyms\"; then\n\t    $opt_dry_run || {\n\t      eval '$EGREP -v \" ($exclude_expsyms)$\" \"$nlist\" > \"$nlist\"T'\n\t      eval '$MV \"$nlist\"T \"$nlist\"'\n\t    }\n\t  fi\n\n\t  if test -n \"$export_symbols_regex\"; then\n\t    $opt_dry_run || {\n\t      eval '$EGREP -e \"$export_symbols_regex\" \"$nlist\" > \"$nlist\"T'\n\t      eval '$MV \"$nlist\"T \"$nlist\"'\n\t    }\n\t  fi\n\n\t  # Prepare the list of exported symbols\n\t  if test -z \"$export_symbols\"; then\n\t    export_symbols=\"$output_objdir/$outputname.exp\"\n\t    $opt_dry_run || {\n\t      $RM $export_symbols\n\t      eval \"${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \\(.*\\)$/\\1/p' \"'< \"$nlist\" > \"$export_symbols\"'\n\t      case $host in\n\t      *cygwin* | *mingw* | *cegcc* )\n                eval \"echo EXPORTS \"'> \"$output_objdir/$outputname.def\"'\n                eval 'cat \"$export_symbols\" >> \"$output_objdir/$outputname.def\"'\n\t        ;;\n\t      esac\n\t    }\n\t  else\n\t    $opt_dry_run || {\n\t      eval \"${SED} -e 's/\\([].[*^$]\\)/\\\\\\\\\\1/g' -e 's/^/ /' -e 's/$/$/'\"' < \"$export_symbols\" > \"$output_objdir/$outputname.exp\"'\n\t      eval '$GREP -f \"$output_objdir/$outputname.exp\" < \"$nlist\" > \"$nlist\"T'\n\t      eval '$MV \"$nlist\"T \"$nlist\"'\n\t      case $host in\n\t        *cygwin* | *mingw* | *cegcc* )\n\t          eval \"echo EXPORTS \"'> \"$output_objdir/$outputname.def\"'\n\t          eval 'cat \"$nlist\" >> \"$output_objdir/$outputname.def\"'\n\t          ;;\n\t      esac\n\t    }\n\t  fi\n\tfi\n\n\tfor dlprefile in $dlprefiles; do\n\t  func_verbose \"extracting global C symbols from \\`$dlprefile'\"\n\t  func_basename \"$dlprefile\"\n\t  name=\"$func_basename_result\"\n          case $host in\n\t    *cygwin* | *mingw* | *cegcc* )\n\t      # if an import library, we need to obtain dlname\n\t      if func_win32_import_lib_p \"$dlprefile\"; then\n\t        func_tr_sh \"$dlprefile\"\n\t        eval \"curr_lafile=\\$libfile_$func_tr_sh_result\"\n\t        dlprefile_dlbasename=\"\"\n\t        if test -n \"$curr_lafile\" && func_lalib_p \"$curr_lafile\"; then\n\t          # Use subshell, to avoid clobbering current variable values\n\t          dlprefile_dlname=`source \"$curr_lafile\" && echo \"$dlname\"`\n\t          if test -n \"$dlprefile_dlname\" ; then\n\t            func_basename \"$dlprefile_dlname\"\n\t            dlprefile_dlbasename=\"$func_basename_result\"\n\t          else\n\t            # no lafile. user explicitly requested -dlpreopen <import library>.\n\t            $sharedlib_from_linklib_cmd \"$dlprefile\"\n\t            dlprefile_dlbasename=$sharedlib_from_linklib_result\n\t          fi\n\t        fi\n\t        $opt_dry_run || {\n\t          if test -n \"$dlprefile_dlbasename\" ; then\n\t            eval '$ECHO \": $dlprefile_dlbasename\" >> \"$nlist\"'\n\t          else\n\t            func_warning \"Could not compute DLL name from $name\"\n\t            eval '$ECHO \": $name \" >> \"$nlist\"'\n\t          fi\n\t          func_to_tool_file \"$dlprefile\" func_convert_file_msys_to_w32\n\t          eval \"$NM \\\"$func_to_tool_file_result\\\" 2>/dev/null | $global_symbol_pipe |\n\t            $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'\"\n\t        }\n\t      else # not an import lib\n\t        $opt_dry_run || {\n\t          eval '$ECHO \": $name \" >> \"$nlist\"'\n\t          func_to_tool_file \"$dlprefile\" func_convert_file_msys_to_w32\n\t          eval \"$NM \\\"$func_to_tool_file_result\\\" 2>/dev/null | $global_symbol_pipe >> '$nlist'\"\n\t        }\n\t      fi\n\t    ;;\n\t    *)\n\t      $opt_dry_run || {\n\t        eval '$ECHO \": $name \" >> \"$nlist\"'\n\t        func_to_tool_file \"$dlprefile\" func_convert_file_msys_to_w32\n\t        eval \"$NM \\\"$func_to_tool_file_result\\\" 2>/dev/null | $global_symbol_pipe >> '$nlist'\"\n\t      }\n\t    ;;\n          esac\n\tdone\n\n\t$opt_dry_run || {\n\t  # Make sure we have at least an empty file.\n\t  test -f \"$nlist\" || : > \"$nlist\"\n\n\t  if test -n \"$exclude_expsyms\"; then\n\t    $EGREP -v \" ($exclude_expsyms)$\" \"$nlist\" > \"$nlist\"T\n\t    $MV \"$nlist\"T \"$nlist\"\n\t  fi\n\n\t  # Try sorting and uniquifying the output.\n\t  if $GREP -v \"^: \" < \"$nlist\" |\n\t      if sort -k 3 </dev/null >/dev/null 2>&1; then\n\t\tsort -k 3\n\t      else\n\t\tsort +2\n\t      fi |\n\t      uniq > \"$nlist\"S; then\n\t    :\n\t  else\n\t    $GREP -v \"^: \" < \"$nlist\" > \"$nlist\"S\n\t  fi\n\n\t  if test -f \"$nlist\"S; then\n\t    eval \"$global_symbol_to_cdecl\"' < \"$nlist\"S >> \"$output_objdir/$my_dlsyms\"'\n\t  else\n\t    echo '/* NONE */' >> \"$output_objdir/$my_dlsyms\"\n\t  fi\n\n\t  echo >> \"$output_objdir/$my_dlsyms\" \"\\\n\n/* The mapping between symbol names and symbols.  */\ntypedef struct {\n  const char *name;\n  void *address;\n} lt_dlsymlist;\nextern LT_DLSYM_CONST lt_dlsymlist\nlt_${my_prefix}_LTX_preloaded_symbols[];\nLT_DLSYM_CONST lt_dlsymlist\nlt_${my_prefix}_LTX_preloaded_symbols[] =\n{\\\n  { \\\"$my_originator\\\", (void *) 0 },\"\n\n\t  case $need_lib_prefix in\n\t  no)\n\t    eval \"$global_symbol_to_c_name_address\" < \"$nlist\" >> \"$output_objdir/$my_dlsyms\"\n\t    ;;\n\t  *)\n\t    eval \"$global_symbol_to_c_name_address_lib_prefix\" < \"$nlist\" >> \"$output_objdir/$my_dlsyms\"\n\t    ;;\n\t  esac\n\t  echo >> \"$output_objdir/$my_dlsyms\" \"\\\n  {0, (void *) 0}\n};\n\n/* This works around a problem in FreeBSD linker */\n#ifdef FREEBSD_WORKAROUND\nstatic const void *lt_preloaded_setup() {\n  return lt_${my_prefix}_LTX_preloaded_symbols;\n}\n#endif\n\n#ifdef __cplusplus\n}\n#endif\\\n\"\n\t} # !$opt_dry_run\n\n\tpic_flag_for_symtable=\n\tcase \"$compile_command \" in\n\t*\" -static \"*) ;;\n\t*)\n\t  case $host in\n\t  # compiling the symbol table file with pic_flag works around\n\t  # a FreeBSD bug that causes programs to crash when -lm is\n\t  # linked before any other PIC object.  But we must not use\n\t  # pic_flag when linking with -static.  The problem exists in\n\t  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.\n\t  *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)\n\t    pic_flag_for_symtable=\" $pic_flag -DFREEBSD_WORKAROUND\" ;;\n\t  *-*-hpux*)\n\t    pic_flag_for_symtable=\" $pic_flag\"  ;;\n\t  *)\n\t    if test \"X$my_pic_p\" != Xno; then\n\t      pic_flag_for_symtable=\" $pic_flag\"\n\t    fi\n\t    ;;\n\t  esac\n\t  ;;\n\tesac\n\tsymtab_cflags=\n\tfor arg in $LTCFLAGS; do\n\t  case $arg in\n\t  -pie | -fpie | -fPIE) ;;\n\t  *) func_append symtab_cflags \" $arg\" ;;\n\t  esac\n\tdone\n\n\t# Now compile the dynamic symbol file.\n\tfunc_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable \"$my_dlsyms\")' 'exit $?'\n\n\t# Clean up the generated files.\n\tfunc_show_eval '$RM \"$output_objdir/$my_dlsyms\" \"$nlist\" \"${nlist}S\" \"${nlist}T\"'\n\n\t# Transform the symbol file into the correct name.\n\tsymfileobj=\"$output_objdir/${my_outputname}S.$objext\"\n\tcase $host in\n\t*cygwin* | *mingw* | *cegcc* )\n\t  if test -f \"$output_objdir/$my_outputname.def\"; then\n\t    compile_command=`$ECHO \"$compile_command\" | $SED \"s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%\"`\n\t    finalize_command=`$ECHO \"$finalize_command\" | $SED \"s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%\"`\n\t  else\n\t    compile_command=`$ECHO \"$compile_command\" | $SED \"s%@SYMFILE@%$symfileobj%\"`\n\t    finalize_command=`$ECHO \"$finalize_command\" | $SED \"s%@SYMFILE@%$symfileobj%\"`\n\t  fi\n\t  ;;\n\t*)\n\t  compile_command=`$ECHO \"$compile_command\" | $SED \"s%@SYMFILE@%$symfileobj%\"`\n\t  finalize_command=`$ECHO \"$finalize_command\" | $SED \"s%@SYMFILE@%$symfileobj%\"`\n\t  ;;\n\tesac\n\t;;\n      *)\n\tfunc_fatal_error \"unknown suffix for \\`$my_dlsyms'\"\n\t;;\n      esac\n    else\n      # We keep going just in case the user didn't refer to\n      # lt_preloaded_symbols.  The linker will fail if global_symbol_pipe\n      # really was required.\n\n      # Nullify the symbol file.\n      compile_command=`$ECHO \"$compile_command\" | $SED \"s% @SYMFILE@%%\"`\n      finalize_command=`$ECHO \"$finalize_command\" | $SED \"s% @SYMFILE@%%\"`\n    fi\n}\n\n# func_win32_libid arg\n# return the library type of file 'arg'\n#\n# Need a lot of goo to handle *both* DLLs and import libs\n# Has to be a shell function in order to 'eat' the argument\n# that is supplied when $file_magic_command is called.\n# Despite the name, also deal with 64 bit binaries.\nfunc_win32_libid ()\n{\n  $opt_debug\n  win32_libid_type=\"unknown\"\n  win32_fileres=`file -L $1 2>/dev/null`\n  case $win32_fileres in\n  *ar\\ archive\\ import\\ library*) # definitely import\n    win32_libid_type=\"x86 archive import\"\n    ;;\n  *ar\\ archive*) # could be an import, or static\n    # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD.\n    if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |\n       $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then\n      func_to_tool_file \"$1\" func_convert_file_msys_to_w32\n      win32_nmres=`eval $NM -f posix -A \\\"$func_to_tool_file_result\\\" |\n\t$SED -n -e '\n\t    1,100{\n\t\t/ I /{\n\t\t    s,.*,import,\n\t\t    p\n\t\t    q\n\t\t}\n\t    }'`\n      case $win32_nmres in\n      import*)  win32_libid_type=\"x86 archive import\";;\n      *)        win32_libid_type=\"x86 archive static\";;\n      esac\n    fi\n    ;;\n  *DLL*)\n    win32_libid_type=\"x86 DLL\"\n    ;;\n  *executable*) # but shell scripts are \"executable\" too...\n    case $win32_fileres in\n    *MS\\ Windows\\ PE\\ Intel*)\n      win32_libid_type=\"x86 DLL\"\n      ;;\n    esac\n    ;;\n  esac\n  $ECHO \"$win32_libid_type\"\n}\n\n# func_cygming_dll_for_implib ARG\n#\n# Platform-specific function to extract the\n# name of the DLL associated with the specified\n# import library ARG.\n# Invoked by eval'ing the libtool variable\n#    $sharedlib_from_linklib_cmd\n# Result is available in the variable\n#    $sharedlib_from_linklib_result\nfunc_cygming_dll_for_implib ()\n{\n  $opt_debug\n  sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify \"$1\"`\n}\n\n# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs\n#\n# The is the core of a fallback implementation of a\n# platform-specific function to extract the name of the\n# DLL associated with the specified import library LIBNAME.\n#\n# SECTION_NAME is either .idata$6 or .idata$7, depending\n# on the platform and compiler that created the implib.\n#\n# Echos the name of the DLL associated with the\n# specified import library.\nfunc_cygming_dll_for_implib_fallback_core ()\n{\n  $opt_debug\n  match_literal=`$ECHO \"$1\" | $SED \"$sed_make_literal_regex\"`\n  $OBJDUMP -s --section \"$1\" \"$2\" 2>/dev/null |\n    $SED '/^Contents of section '\"$match_literal\"':/{\n      # Place marker at beginning of archive member dllname section\n      s/.*/====MARK====/\n      p\n      d\n    }\n    # These lines can sometimes be longer than 43 characters, but\n    # are always uninteresting\n    /:[\t ]*file format pe[i]\\{,1\\}-/d\n    /^In archive [^:]*:/d\n    # Ensure marker is printed\n    /^====MARK====/p\n    # Remove all lines with less than 43 characters\n    /^.\\{43\\}/!d\n    # From remaining lines, remove first 43 characters\n    s/^.\\{43\\}//' |\n    $SED -n '\n      # Join marker and all lines until next marker into a single line\n      /^====MARK====/ b para\n      H\n      $ b para\n      b\n      :para\n      x\n      s/\\n//g\n      # Remove the marker\n      s/^====MARK====//\n      # Remove trailing dots and whitespace\n      s/[\\. \\t]*$//\n      # Print\n      /./p' |\n    # we now have a list, one entry per line, of the stringified\n    # contents of the appropriate section of all members of the\n    # archive which possess that section. Heuristic: eliminate\n    # all those which have a first or second character that is\n    # a '.' (that is, objdump's representation of an unprintable\n    # character.) This should work for all archives with less than\n    # 0x302f exports -- but will fail for DLLs whose name actually\n    # begins with a literal '.' or a single character followed by\n    # a '.'.\n    #\n    # Of those that remain, print the first one.\n    $SED -e '/^\\./d;/^.\\./d;q'\n}\n\n# func_cygming_gnu_implib_p ARG\n# This predicate returns with zero status (TRUE) if\n# ARG is a GNU/binutils-style import library. Returns\n# with nonzero status (FALSE) otherwise.\nfunc_cygming_gnu_implib_p ()\n{\n  $opt_debug\n  func_to_tool_file \"$1\" func_convert_file_msys_to_w32\n  func_cygming_gnu_implib_tmp=`$NM \"$func_to_tool_file_result\" | eval \"$global_symbol_pipe\" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'`\n  test -n \"$func_cygming_gnu_implib_tmp\"\n}\n\n# func_cygming_ms_implib_p ARG\n# This predicate returns with zero status (TRUE) if\n# ARG is an MS-style import library. Returns\n# with nonzero status (FALSE) otherwise.\nfunc_cygming_ms_implib_p ()\n{\n  $opt_debug\n  func_to_tool_file \"$1\" func_convert_file_msys_to_w32\n  func_cygming_ms_implib_tmp=`$NM \"$func_to_tool_file_result\" | eval \"$global_symbol_pipe\" | $GREP '_NULL_IMPORT_DESCRIPTOR'`\n  test -n \"$func_cygming_ms_implib_tmp\"\n}\n\n# func_cygming_dll_for_implib_fallback ARG\n# Platform-specific function to extract the\n# name of the DLL associated with the specified\n# import library ARG.\n#\n# This fallback implementation is for use when $DLLTOOL\n# does not support the --identify-strict option.\n# Invoked by eval'ing the libtool variable\n#    $sharedlib_from_linklib_cmd\n# Result is available in the variable\n#    $sharedlib_from_linklib_result\nfunc_cygming_dll_for_implib_fallback ()\n{\n  $opt_debug\n  if func_cygming_gnu_implib_p \"$1\" ; then\n    # binutils import library\n    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' \"$1\"`\n  elif func_cygming_ms_implib_p \"$1\" ; then\n    # ms-generated import library\n    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' \"$1\"`\n  else\n    # unknown\n    sharedlib_from_linklib_result=\"\"\n  fi\n}\n\n\n# func_extract_an_archive dir oldlib\nfunc_extract_an_archive ()\n{\n    $opt_debug\n    f_ex_an_ar_dir=\"$1\"; shift\n    f_ex_an_ar_oldlib=\"$1\"\n    if test \"$lock_old_archive_extraction\" = yes; then\n      lockfile=$f_ex_an_ar_oldlib.lock\n      until $opt_dry_run || ln \"$progpath\" \"$lockfile\" 2>/dev/null; do\n\tfunc_echo \"Waiting for $lockfile to be removed\"\n\tsleep 2\n      done\n    fi\n    func_show_eval \"(cd \\$f_ex_an_ar_dir && $AR x \\\"\\$f_ex_an_ar_oldlib\\\")\" \\\n\t\t   'stat=$?; rm -f \"$lockfile\"; exit $stat'\n    if test \"$lock_old_archive_extraction\" = yes; then\n      $opt_dry_run || rm -f \"$lockfile\"\n    fi\n    if ($AR t \"$f_ex_an_ar_oldlib\" | sort | sort -uc >/dev/null 2>&1); then\n     :\n    else\n      func_fatal_error \"object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib\"\n    fi\n}\n\n\n# func_extract_archives gentop oldlib ...\nfunc_extract_archives ()\n{\n    $opt_debug\n    my_gentop=\"$1\"; shift\n    my_oldlibs=${1+\"$@\"}\n    my_oldobjs=\"\"\n    my_xlib=\"\"\n    my_xabs=\"\"\n    my_xdir=\"\"\n\n    for my_xlib in $my_oldlibs; do\n      # Extract the objects.\n      case $my_xlib in\n\t[\\\\/]* | [A-Za-z]:[\\\\/]*) my_xabs=\"$my_xlib\" ;;\n\t*) my_xabs=`pwd`\"/$my_xlib\" ;;\n      esac\n      func_basename \"$my_xlib\"\n      my_xlib=\"$func_basename_result\"\n      my_xlib_u=$my_xlib\n      while :; do\n        case \" $extracted_archives \" in\n\t*\" $my_xlib_u \"*)\n\t  func_arith $extracted_serial + 1\n\t  extracted_serial=$func_arith_result\n\t  my_xlib_u=lt$extracted_serial-$my_xlib ;;\n\t*) break ;;\n\tesac\n      done\n      extracted_archives=\"$extracted_archives $my_xlib_u\"\n      my_xdir=\"$my_gentop/$my_xlib_u\"\n\n      func_mkdir_p \"$my_xdir\"\n\n      case $host in\n      *-darwin*)\n\tfunc_verbose \"Extracting $my_xabs\"\n\t# Do not bother doing anything if just a dry run\n\t$opt_dry_run || {\n\t  darwin_orig_dir=`pwd`\n\t  cd $my_xdir || exit $?\n\t  darwin_archive=$my_xabs\n\t  darwin_curdir=`pwd`\n\t  darwin_base_archive=`basename \"$darwin_archive\"`\n\t  darwin_arches=`$LIPO -info \"$darwin_archive\" 2>/dev/null | $GREP Architectures 2>/dev/null || true`\n\t  if test -n \"$darwin_arches\"; then\n\t    darwin_arches=`$ECHO \"$darwin_arches\" | $SED -e 's/.*are://'`\n\t    darwin_arch=\n\t    func_verbose \"$darwin_base_archive has multiple architectures $darwin_arches\"\n\t    for darwin_arch in  $darwin_arches ; do\n\t      func_mkdir_p \"unfat-$$/${darwin_base_archive}-${darwin_arch}\"\n\t      $LIPO -thin $darwin_arch -output \"unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}\" \"${darwin_archive}\"\n\t      cd \"unfat-$$/${darwin_base_archive}-${darwin_arch}\"\n\t      func_extract_an_archive \"`pwd`\" \"${darwin_base_archive}\"\n\t      cd \"$darwin_curdir\"\n\t      $RM \"unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}\"\n\t    done # $darwin_arches\n            ## Okay now we've a bunch of thin objects, gotta fatten them up :)\n\t    darwin_filelist=`find unfat-$$ -type f -name \\*.o -print -o -name \\*.lo -print | $SED -e \"$basename\" | sort -u`\n\t    darwin_file=\n\t    darwin_files=\n\t    for darwin_file in $darwin_filelist; do\n\t      darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP`\n\t      $LIPO -create -output \"$darwin_file\" $darwin_files\n\t    done # $darwin_filelist\n\t    $RM -rf unfat-$$\n\t    cd \"$darwin_orig_dir\"\n\t  else\n\t    cd $darwin_orig_dir\n\t    func_extract_an_archive \"$my_xdir\" \"$my_xabs\"\n\t  fi # $darwin_arches\n\t} # !$opt_dry_run\n\t;;\n      *)\n        func_extract_an_archive \"$my_xdir\" \"$my_xabs\"\n\t;;\n      esac\n      my_oldobjs=\"$my_oldobjs \"`find $my_xdir -name \\*.$objext -print -o -name \\*.lo -print | sort | $NL2SP`\n    done\n\n    func_extract_archives_result=\"$my_oldobjs\"\n}\n\n\n# func_emit_wrapper [arg=no]\n#\n# Emit a libtool wrapper script on stdout.\n# Don't directly open a file because we may want to\n# incorporate the script contents within a cygwin/mingw\n# wrapper executable.  Must ONLY be called from within\n# func_mode_link because it depends on a number of variables\n# set therein.\n#\n# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\n# variable will take.  If 'yes', then the emitted script\n# will assume that the directory in which it is stored is\n# the $objdir directory.  This is a cygwin/mingw-specific\n# behavior.\nfunc_emit_wrapper ()\n{\n\tfunc_emit_wrapper_arg1=${1-no}\n\n\t$ECHO \"\\\n#! $SHELL\n\n# $output - temporary wrapper script for $objdir/$outputname\n# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION\n#\n# The $output program cannot be directly executed until all the libtool\n# libraries that it depends on are installed.\n#\n# This wrapper script should never be moved out of the build directory.\n# If it is, it will not operate correctly.\n\n# Sed substitution that helps us do robust quoting.  It backslashifies\n# metacharacters that are still active within double-quoted strings.\nsed_quote_subst='$sed_quote_subst'\n\n# Be Bourne compatible\nif test -n \\\"\\${ZSH_VERSION+set}\\\" && (emulate sh) >/dev/null 2>&1; then\n  emulate sh\n  NULLCMD=:\n  # Zsh 3.x and 4.x performs word splitting on \\${1+\\\"\\$@\\\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '\\${1+\\\"\\$@\\\"}'='\\\"\\$@\\\"'\n  setopt NO_GLOB_SUBST\nelse\n  case \\`(set -o) 2>/dev/null\\` in *posix*) set -o posix;; esac\nfi\nBIN_SH=xpg4; export BIN_SH # for Tru64\nDUALCASE=1; export DUALCASE # for MKS sh\n\n# The HP-UX ksh and POSIX shell print the target directory to stdout\n# if CDPATH is set.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\nrelink_command=\\\"$relink_command\\\"\n\n# This environment variable determines our operation mode.\nif test \\\"\\$libtool_install_magic\\\" = \\\"$magic\\\"; then\n  # install mode needs the following variables:\n  generated_by_libtool_version='$macro_version'\n  notinst_deplibs='$notinst_deplibs'\nelse\n  # When we are sourced in execute mode, \\$file and \\$ECHO are already set.\n  if test \\\"\\$libtool_execute_magic\\\" != \\\"$magic\\\"; then\n    file=\\\"\\$0\\\"\"\n\n    qECHO=`$ECHO \"$ECHO\" | $SED \"$sed_quote_subst\"`\n    $ECHO \"\\\n\n# A function that is used when there is no print builtin or printf.\nfunc_fallback_echo ()\n{\n  eval 'cat <<_LTECHO_EOF\n\\$1\n_LTECHO_EOF'\n}\n    ECHO=\\\"$qECHO\\\"\n  fi\n\n# Very basic option parsing. These options are (a) specific to\n# the libtool wrapper, (b) are identical between the wrapper\n# /script/ and the wrapper /executable/ which is used only on\n# windows platforms, and (c) all begin with the string \"--lt-\"\n# (application programs are unlikely to have options which match\n# this pattern).\n#\n# There are only two supported options: --lt-debug and\n# --lt-dump-script. There is, deliberately, no --lt-help.\n#\n# The first argument to this parsing function should be the\n# script's $0 value, followed by \"$@\".\nlt_option_debug=\nfunc_parse_lt_options ()\n{\n  lt_script_arg0=\\$0\n  shift\n  for lt_opt\n  do\n    case \\\"\\$lt_opt\\\" in\n    --lt-debug) lt_option_debug=1 ;;\n    --lt-dump-script)\n        lt_dump_D=\\`\\$ECHO \\\"X\\$lt_script_arg0\\\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\\`\n        test \\\"X\\$lt_dump_D\\\" = \\\"X\\$lt_script_arg0\\\" && lt_dump_D=.\n        lt_dump_F=\\`\\$ECHO \\\"X\\$lt_script_arg0\\\" | $SED -e 's/^X//' -e 's%^.*/%%'\\`\n        cat \\\"\\$lt_dump_D/\\$lt_dump_F\\\"\n        exit 0\n      ;;\n    --lt-*)\n        \\$ECHO \\\"Unrecognized --lt- option: '\\$lt_opt'\\\" 1>&2\n        exit 1\n      ;;\n    esac\n  done\n\n  # Print the debug banner immediately:\n  if test -n \\\"\\$lt_option_debug\\\"; then\n    echo \\\"${outputname}:${output}:\\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\\\" 1>&2\n  fi\n}\n\n# Used when --lt-debug. Prints its arguments to stdout\n# (redirection is the responsibility of the caller)\nfunc_lt_dump_args ()\n{\n  lt_dump_args_N=1;\n  for lt_arg\n  do\n    \\$ECHO \\\"${outputname}:${output}:\\${LINENO}: newargv[\\$lt_dump_args_N]: \\$lt_arg\\\"\n    lt_dump_args_N=\\`expr \\$lt_dump_args_N + 1\\`\n  done\n}\n\n# Core function for launching the target application\nfunc_exec_program_core ()\n{\n\"\n  case $host in\n  # Backslashes separate directories on plain windows\n  *-*-mingw | *-*-os2* | *-cegcc*)\n    $ECHO \"\\\n      if test -n \\\"\\$lt_option_debug\\\"; then\n        \\$ECHO \\\"${outputname}:${output}:\\${LINENO}: newargv[0]: \\$progdir\\\\\\\\\\$program\\\" 1>&2\n        func_lt_dump_args \\${1+\\\"\\$@\\\"} 1>&2\n      fi\n      exec \\\"\\$progdir\\\\\\\\\\$program\\\" \\${1+\\\"\\$@\\\"}\n\"\n    ;;\n\n  *)\n    $ECHO \"\\\n      if test -n \\\"\\$lt_option_debug\\\"; then\n        \\$ECHO \\\"${outputname}:${output}:\\${LINENO}: newargv[0]: \\$progdir/\\$program\\\" 1>&2\n        func_lt_dump_args \\${1+\\\"\\$@\\\"} 1>&2\n      fi\n      exec \\\"\\$progdir/\\$program\\\" \\${1+\\\"\\$@\\\"}\n\"\n    ;;\n  esac\n  $ECHO \"\\\n      \\$ECHO \\\"\\$0: cannot exec \\$program \\$*\\\" 1>&2\n      exit 1\n}\n\n# A function to encapsulate launching the target application\n# Strips options in the --lt-* namespace from \\$@ and\n# launches target application with the remaining arguments.\nfunc_exec_program ()\n{\n  case \\\" \\$* \\\" in\n  *\\\\ --lt-*)\n    for lt_wr_arg\n    do\n      case \\$lt_wr_arg in\n      --lt-*) ;;\n      *) set x \\\"\\$@\\\" \\\"\\$lt_wr_arg\\\"; shift;;\n      esac\n      shift\n    done ;;\n  esac\n  func_exec_program_core \\${1+\\\"\\$@\\\"}\n}\n\n  # Parse options\n  func_parse_lt_options \\\"\\$0\\\" \\${1+\\\"\\$@\\\"}\n\n  # Find the directory that this script lives in.\n  thisdir=\\`\\$ECHO \\\"\\$file\\\" | $SED 's%/[^/]*$%%'\\`\n  test \\\"x\\$thisdir\\\" = \\\"x\\$file\\\" && thisdir=.\n\n  # Follow symbolic links until we get to the real thisdir.\n  file=\\`ls -ld \\\"\\$file\\\" | $SED -n 's/.*-> //p'\\`\n  while test -n \\\"\\$file\\\"; do\n    destdir=\\`\\$ECHO \\\"\\$file\\\" | $SED 's%/[^/]*\\$%%'\\`\n\n    # If there was a directory component, then change thisdir.\n    if test \\\"x\\$destdir\\\" != \\\"x\\$file\\\"; then\n      case \\\"\\$destdir\\\" in\n      [\\\\\\\\/]* | [A-Za-z]:[\\\\\\\\/]*) thisdir=\\\"\\$destdir\\\" ;;\n      *) thisdir=\\\"\\$thisdir/\\$destdir\\\" ;;\n      esac\n    fi\n\n    file=\\`\\$ECHO \\\"\\$file\\\" | $SED 's%^.*/%%'\\`\n    file=\\`ls -ld \\\"\\$thisdir/\\$file\\\" | $SED -n 's/.*-> //p'\\`\n  done\n\n  # Usually 'no', except on cygwin/mingw when embedded into\n  # the cwrapper.\n  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1\n  if test \\\"\\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\\\" = \\\"yes\\\"; then\n    # special case for '.'\n    if test \\\"\\$thisdir\\\" = \\\".\\\"; then\n      thisdir=\\`pwd\\`\n    fi\n    # remove .libs from thisdir\n    case \\\"\\$thisdir\\\" in\n    *[\\\\\\\\/]$objdir ) thisdir=\\`\\$ECHO \\\"\\$thisdir\\\" | $SED 's%[\\\\\\\\/][^\\\\\\\\/]*$%%'\\` ;;\n    $objdir )   thisdir=. ;;\n    esac\n  fi\n\n  # Try to get the absolute directory name.\n  absdir=\\`cd \\\"\\$thisdir\\\" && pwd\\`\n  test -n \\\"\\$absdir\\\" && thisdir=\\\"\\$absdir\\\"\n\"\n\n\tif test \"$fast_install\" = yes; then\n\t  $ECHO \"\\\n  program=lt-'$outputname'$exeext\n  progdir=\\\"\\$thisdir/$objdir\\\"\n\n  if test ! -f \\\"\\$progdir/\\$program\\\" ||\n     { file=\\`ls -1dt \\\"\\$progdir/\\$program\\\" \\\"\\$progdir/../\\$program\\\" 2>/dev/null | ${SED} 1q\\`; \\\\\n       test \\\"X\\$file\\\" != \\\"X\\$progdir/\\$program\\\"; }; then\n\n    file=\\\"\\$\\$-\\$program\\\"\n\n    if test ! -d \\\"\\$progdir\\\"; then\n      $MKDIR \\\"\\$progdir\\\"\n    else\n      $RM \\\"\\$progdir/\\$file\\\"\n    fi\"\n\n\t  $ECHO \"\\\n\n    # relink executable if necessary\n    if test -n \\\"\\$relink_command\\\"; then\n      if relink_command_output=\\`eval \\$relink_command 2>&1\\`; then :\n      else\n\t$ECHO \\\"\\$relink_command_output\\\" >&2\n\t$RM \\\"\\$progdir/\\$file\\\"\n\texit 1\n      fi\n    fi\n\n    $MV \\\"\\$progdir/\\$file\\\" \\\"\\$progdir/\\$program\\\" 2>/dev/null ||\n    { $RM \\\"\\$progdir/\\$program\\\";\n      $MV \\\"\\$progdir/\\$file\\\" \\\"\\$progdir/\\$program\\\"; }\n    $RM \\\"\\$progdir/\\$file\\\"\n  fi\"\n\telse\n\t  $ECHO \"\\\n  program='$outputname'\n  progdir=\\\"\\$thisdir/$objdir\\\"\n\"\n\tfi\n\n\t$ECHO \"\\\n\n  if test -f \\\"\\$progdir/\\$program\\\"; then\"\n\n\t# fixup the dll searchpath if we need to.\n\t#\n\t# Fix the DLL searchpath if we need to.  Do this before prepending\n\t# to shlibpath, because on Windows, both are PATH and uninstalled\n\t# libraries must come first.\n\tif test -n \"$dllsearchpath\"; then\n\t  $ECHO \"\\\n    # Add the dll search path components to the executable PATH\n    PATH=$dllsearchpath:\\$PATH\n\"\n\tfi\n\n\t# Export our shlibpath_var if we have one.\n\tif test \"$shlibpath_overrides_runpath\" = yes && test -n \"$shlibpath_var\" && test -n \"$temp_rpath\"; then\n\t  $ECHO \"\\\n    # Add our own library path to $shlibpath_var\n    $shlibpath_var=\\\"$temp_rpath\\$$shlibpath_var\\\"\n\n    # Some systems cannot cope with colon-terminated $shlibpath_var\n    # The second colon is a workaround for a bug in BeOS R4 sed\n    $shlibpath_var=\\`\\$ECHO \\\"\\$$shlibpath_var\\\" | $SED 's/::*\\$//'\\`\n\n    export $shlibpath_var\n\"\n\tfi\n\n\t$ECHO \"\\\n    if test \\\"\\$libtool_execute_magic\\\" != \\\"$magic\\\"; then\n      # Run the actual program with our arguments.\n      func_exec_program \\${1+\\\"\\$@\\\"}\n    fi\n  else\n    # The program doesn't exist.\n    \\$ECHO \\\"\\$0: error: \\\\\\`\\$progdir/\\$program' does not exist\\\" 1>&2\n    \\$ECHO \\\"This script is just a wrapper for \\$program.\\\" 1>&2\n    \\$ECHO \\\"See the $PACKAGE documentation for more information.\\\" 1>&2\n    exit 1\n  fi\nfi\\\n\"\n}\n\n\n# func_emit_cwrapperexe_src\n# emit the source code for a wrapper executable on stdout\n# Must ONLY be called from within func_mode_link because\n# it depends on a number of variable set therein.\nfunc_emit_cwrapperexe_src ()\n{\n\tcat <<EOF\n\n/* $cwrappersource - temporary wrapper executable for $objdir/$outputname\n   Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION\n\n   The $output program cannot be directly executed until all the libtool\n   libraries that it depends on are installed.\n\n   This wrapper executable should never be moved out of the build directory.\n   If it is, it will not operate correctly.\n*/\nEOF\n\t    cat <<\"EOF\"\n#ifdef _MSC_VER\n# define _CRT_SECURE_NO_DEPRECATE 1\n#endif\n#include <stdio.h>\n#include <stdlib.h>\n#ifdef _MSC_VER\n# include <direct.h>\n# include <process.h>\n# include <io.h>\n#else\n# include <unistd.h>\n# include <stdint.h>\n# ifdef __CYGWIN__\n#  include <io.h>\n# endif\n#endif\n#include <malloc.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <string.h>\n#include <ctype.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <sys/stat.h>\n\n/* declarations of non-ANSI functions */\n#if defined(__MINGW32__)\n# ifdef __STRICT_ANSI__\nint _putenv (const char *);\n# endif\n#elif defined(__CYGWIN__)\n# ifdef __STRICT_ANSI__\nchar *realpath (const char *, char *);\nint putenv (char *);\nint setenv (const char *, const char *, int);\n# endif\n/* #elif defined (other platforms) ... */\n#endif\n\n/* portability defines, excluding path handling macros */\n#if defined(_MSC_VER)\n# define setmode _setmode\n# define stat    _stat\n# define chmod   _chmod\n# define getcwd  _getcwd\n# define putenv  _putenv\n# define S_IXUSR _S_IEXEC\n# ifndef _INTPTR_T_DEFINED\n#  define _INTPTR_T_DEFINED\n#  define intptr_t int\n# endif\n#elif defined(__MINGW32__)\n# define setmode _setmode\n# define stat    _stat\n# define chmod   _chmod\n# define getcwd  _getcwd\n# define putenv  _putenv\n#elif defined(__CYGWIN__)\n# define HAVE_SETENV\n# define FOPEN_WB \"wb\"\n/* #elif defined (other platforms) ... */\n#endif\n\n#if defined(PATH_MAX)\n# define LT_PATHMAX PATH_MAX\n#elif defined(MAXPATHLEN)\n# define LT_PATHMAX MAXPATHLEN\n#else\n# define LT_PATHMAX 1024\n#endif\n\n#ifndef S_IXOTH\n# define S_IXOTH 0\n#endif\n#ifndef S_IXGRP\n# define S_IXGRP 0\n#endif\n\n/* path handling portability macros */\n#ifndef DIR_SEPARATOR\n# define DIR_SEPARATOR '/'\n# define PATH_SEPARATOR ':'\n#endif\n\n#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \\\n  defined (__OS2__)\n# define HAVE_DOS_BASED_FILE_SYSTEM\n# define FOPEN_WB \"wb\"\n# ifndef DIR_SEPARATOR_2\n#  define DIR_SEPARATOR_2 '\\\\'\n# endif\n# ifndef PATH_SEPARATOR_2\n#  define PATH_SEPARATOR_2 ';'\n# endif\n#endif\n\n#ifndef DIR_SEPARATOR_2\n# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)\n#else /* DIR_SEPARATOR_2 */\n# define IS_DIR_SEPARATOR(ch) \\\n\t(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))\n#endif /* DIR_SEPARATOR_2 */\n\n#ifndef PATH_SEPARATOR_2\n# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)\n#else /* PATH_SEPARATOR_2 */\n# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)\n#endif /* PATH_SEPARATOR_2 */\n\n#ifndef FOPEN_WB\n# define FOPEN_WB \"w\"\n#endif\n#ifndef _O_BINARY\n# define _O_BINARY 0\n#endif\n\n#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))\n#define XFREE(stale) do { \\\n  if (stale) { free ((void *) stale); stale = 0; } \\\n} while (0)\n\n#if defined(LT_DEBUGWRAPPER)\nstatic int lt_debug = 1;\n#else\nstatic int lt_debug = 0;\n#endif\n\nconst char *program_name = \"libtool-wrapper\"; /* in case xstrdup fails */\n\nvoid *xmalloc (size_t num);\nchar *xstrdup (const char *string);\nconst char *base_name (const char *name);\nchar *find_executable (const char *wrapper);\nchar *chase_symlinks (const char *pathspec);\nint make_executable (const char *path);\nint check_executable (const char *path);\nchar *strendzap (char *str, const char *pat);\nvoid lt_debugprintf (const char *file, int line, const char *fmt, ...);\nvoid lt_fatal (const char *file, int line, const char *message, ...);\nstatic const char *nonnull (const char *s);\nstatic const char *nonempty (const char *s);\nvoid lt_setenv (const char *name, const char *value);\nchar *lt_extend_str (const char *orig_value, const char *add, int to_end);\nvoid lt_update_exe_path (const char *name, const char *value);\nvoid lt_update_lib_path (const char *name, const char *value);\nchar **prepare_spawn (char **argv);\nvoid lt_dump_script (FILE *f);\nEOF\n\n\t    cat <<EOF\nvolatile const char * MAGIC_EXE = \"$magic_exe\";\nconst char * LIB_PATH_VARNAME = \"$shlibpath_var\";\nEOF\n\n\t    if test \"$shlibpath_overrides_runpath\" = yes && test -n \"$shlibpath_var\" && test -n \"$temp_rpath\"; then\n              func_to_host_path \"$temp_rpath\"\n\t      cat <<EOF\nconst char * LIB_PATH_VALUE   = \"$func_to_host_path_result\";\nEOF\n\t    else\n\t      cat <<\"EOF\"\nconst char * LIB_PATH_VALUE   = \"\";\nEOF\n\t    fi\n\n\t    if test -n \"$dllsearchpath\"; then\n              func_to_host_path \"$dllsearchpath:\"\n\t      cat <<EOF\nconst char * EXE_PATH_VARNAME = \"PATH\";\nconst char * EXE_PATH_VALUE   = \"$func_to_host_path_result\";\nEOF\n\t    else\n\t      cat <<\"EOF\"\nconst char * EXE_PATH_VARNAME = \"\";\nconst char * EXE_PATH_VALUE   = \"\";\nEOF\n\t    fi\n\n\t    if test \"$fast_install\" = yes; then\n\t      cat <<EOF\nconst char * TARGET_PROGRAM_NAME = \"lt-$outputname\"; /* hopefully, no .exe */\nEOF\n\t    else\n\t      cat <<EOF\nconst char * TARGET_PROGRAM_NAME = \"$outputname\"; /* hopefully, no .exe */\nEOF\n\t    fi\n\n\n\t    cat <<\"EOF\"\n\n#define LTWRAPPER_OPTION_PREFIX         \"--lt-\"\n\nstatic const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;\nstatic const char *dumpscript_opt       = LTWRAPPER_OPTION_PREFIX \"dump-script\";\nstatic const char *debug_opt            = LTWRAPPER_OPTION_PREFIX \"debug\";\n\nint\nmain (int argc, char *argv[])\n{\n  char **newargz;\n  int  newargc;\n  char *tmp_pathspec;\n  char *actual_cwrapper_path;\n  char *actual_cwrapper_name;\n  char *target_name;\n  char *lt_argv_zero;\n  intptr_t rval = 127;\n\n  int i;\n\n  program_name = (char *) xstrdup (base_name (argv[0]));\n  newargz = XMALLOC (char *, argc + 1);\n\n  /* very simple arg parsing; don't want to rely on getopt\n   * also, copy all non cwrapper options to newargz, except\n   * argz[0], which is handled differently\n   */\n  newargc=0;\n  for (i = 1; i < argc; i++)\n    {\n      if (strcmp (argv[i], dumpscript_opt) == 0)\n\t{\nEOF\n\t    case \"$host\" in\n\t      *mingw* | *cygwin* )\n\t\t# make stdout use \"unix\" line endings\n\t\techo \"          setmode(1,_O_BINARY);\"\n\t\t;;\n\t      esac\n\n\t    cat <<\"EOF\"\n\t  lt_dump_script (stdout);\n\t  return 0;\n\t}\n      if (strcmp (argv[i], debug_opt) == 0)\n\t{\n          lt_debug = 1;\n          continue;\n\t}\n      if (strcmp (argv[i], ltwrapper_option_prefix) == 0)\n        {\n          /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX\n             namespace, but it is not one of the ones we know about and\n             have already dealt with, above (inluding dump-script), then\n             report an error. Otherwise, targets might begin to believe\n             they are allowed to use options in the LTWRAPPER_OPTION_PREFIX\n             namespace. The first time any user complains about this, we'll\n             need to make LTWRAPPER_OPTION_PREFIX a configure-time option\n             or a configure.ac-settable value.\n           */\n          lt_fatal (__FILE__, __LINE__,\n\t\t    \"unrecognized %s option: '%s'\",\n                    ltwrapper_option_prefix, argv[i]);\n        }\n      /* otherwise ... */\n      newargz[++newargc] = xstrdup (argv[i]);\n    }\n  newargz[++newargc] = NULL;\n\nEOF\n\t    cat <<EOF\n  /* The GNU banner must be the first non-error debug message */\n  lt_debugprintf (__FILE__, __LINE__, \"libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\\n\");\nEOF\n\t    cat <<\"EOF\"\n  lt_debugprintf (__FILE__, __LINE__, \"(main) argv[0]: %s\\n\", argv[0]);\n  lt_debugprintf (__FILE__, __LINE__, \"(main) program_name: %s\\n\", program_name);\n\n  tmp_pathspec = find_executable (argv[0]);\n  if (tmp_pathspec == NULL)\n    lt_fatal (__FILE__, __LINE__, \"couldn't find %s\", argv[0]);\n  lt_debugprintf (__FILE__, __LINE__,\n                  \"(main) found exe (before symlink chase) at: %s\\n\",\n\t\t  tmp_pathspec);\n\n  actual_cwrapper_path = chase_symlinks (tmp_pathspec);\n  lt_debugprintf (__FILE__, __LINE__,\n                  \"(main) found exe (after symlink chase) at: %s\\n\",\n\t\t  actual_cwrapper_path);\n  XFREE (tmp_pathspec);\n\n  actual_cwrapper_name = xstrdup (base_name (actual_cwrapper_path));\n  strendzap (actual_cwrapper_path, actual_cwrapper_name);\n\n  /* wrapper name transforms */\n  strendzap (actual_cwrapper_name, \".exe\");\n  tmp_pathspec = lt_extend_str (actual_cwrapper_name, \".exe\", 1);\n  XFREE (actual_cwrapper_name);\n  actual_cwrapper_name = tmp_pathspec;\n  tmp_pathspec = 0;\n\n  /* target_name transforms -- use actual target program name; might have lt- prefix */\n  target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));\n  strendzap (target_name, \".exe\");\n  tmp_pathspec = lt_extend_str (target_name, \".exe\", 1);\n  XFREE (target_name);\n  target_name = tmp_pathspec;\n  tmp_pathspec = 0;\n\n  lt_debugprintf (__FILE__, __LINE__,\n\t\t  \"(main) libtool target name: %s\\n\",\n\t\t  target_name);\nEOF\n\n\t    cat <<EOF\n  newargz[0] =\n    XMALLOC (char, (strlen (actual_cwrapper_path) +\n\t\t    strlen (\"$objdir\") + 1 + strlen (actual_cwrapper_name) + 1));\n  strcpy (newargz[0], actual_cwrapper_path);\n  strcat (newargz[0], \"$objdir\");\n  strcat (newargz[0], \"/\");\nEOF\n\n\t    cat <<\"EOF\"\n  /* stop here, and copy so we don't have to do this twice */\n  tmp_pathspec = xstrdup (newargz[0]);\n\n  /* do NOT want the lt- prefix here, so use actual_cwrapper_name */\n  strcat (newargz[0], actual_cwrapper_name);\n\n  /* DO want the lt- prefix here if it exists, so use target_name */\n  lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);\n  XFREE (tmp_pathspec);\n  tmp_pathspec = NULL;\nEOF\n\n\t    case $host_os in\n\t      mingw*)\n\t    cat <<\"EOF\"\n  {\n    char* p;\n    while ((p = strchr (newargz[0], '\\\\')) != NULL)\n      {\n\t*p = '/';\n      }\n    while ((p = strchr (lt_argv_zero, '\\\\')) != NULL)\n      {\n\t*p = '/';\n      }\n  }\nEOF\n\t    ;;\n\t    esac\n\n\t    cat <<\"EOF\"\n  XFREE (target_name);\n  XFREE (actual_cwrapper_path);\n  XFREE (actual_cwrapper_name);\n\n  lt_setenv (\"BIN_SH\", \"xpg4\"); /* for Tru64 */\n  lt_setenv (\"DUALCASE\", \"1\");  /* for MSK sh */\n  /* Update the DLL searchpath.  EXE_PATH_VALUE ($dllsearchpath) must\n     be prepended before (that is, appear after) LIB_PATH_VALUE ($temp_rpath)\n     because on Windows, both *_VARNAMEs are PATH but uninstalled\n     libraries must come first. */\n  lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);\n  lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);\n\n  lt_debugprintf (__FILE__, __LINE__, \"(main) lt_argv_zero: %s\\n\",\n\t\t  nonnull (lt_argv_zero));\n  for (i = 0; i < newargc; i++)\n    {\n      lt_debugprintf (__FILE__, __LINE__, \"(main) newargz[%d]: %s\\n\",\n\t\t      i, nonnull (newargz[i]));\n    }\n\nEOF\n\n\t    case $host_os in\n\t      mingw*)\n\t\tcat <<\"EOF\"\n  /* execv doesn't actually work on mingw as expected on unix */\n  newargz = prepare_spawn (newargz);\n  rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);\n  if (rval == -1)\n    {\n      /* failed to start process */\n      lt_debugprintf (__FILE__, __LINE__,\n\t\t      \"(main) failed to launch target \\\"%s\\\": %s\\n\",\n\t\t      lt_argv_zero, nonnull (strerror (errno)));\n      return 127;\n    }\n  return rval;\nEOF\n\t\t;;\n\t      *)\n\t\tcat <<\"EOF\"\n  execv (lt_argv_zero, newargz);\n  return rval; /* =127, but avoids unused variable warning */\nEOF\n\t\t;;\n\t    esac\n\n\t    cat <<\"EOF\"\n}\n\nvoid *\nxmalloc (size_t num)\n{\n  void *p = (void *) malloc (num);\n  if (!p)\n    lt_fatal (__FILE__, __LINE__, \"memory exhausted\");\n\n  return p;\n}\n\nchar *\nxstrdup (const char *string)\n{\n  return string ? strcpy ((char *) xmalloc (strlen (string) + 1),\n\t\t\t  string) : NULL;\n}\n\nconst char *\nbase_name (const char *name)\n{\n  const char *base;\n\n#if defined (HAVE_DOS_BASED_FILE_SYSTEM)\n  /* Skip over the disk name in MSDOS pathnames. */\n  if (isalpha ((unsigned char) name[0]) && name[1] == ':')\n    name += 2;\n#endif\n\n  for (base = name; *name; name++)\n    if (IS_DIR_SEPARATOR (*name))\n      base = name + 1;\n  return base;\n}\n\nint\ncheck_executable (const char *path)\n{\n  struct stat st;\n\n  lt_debugprintf (__FILE__, __LINE__, \"(check_executable): %s\\n\",\n                  nonempty (path));\n  if ((!path) || (!*path))\n    return 0;\n\n  if ((stat (path, &st) >= 0)\n      && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))\n    return 1;\n  else\n    return 0;\n}\n\nint\nmake_executable (const char *path)\n{\n  int rval = 0;\n  struct stat st;\n\n  lt_debugprintf (__FILE__, __LINE__, \"(make_executable): %s\\n\",\n                  nonempty (path));\n  if ((!path) || (!*path))\n    return 0;\n\n  if (stat (path, &st) >= 0)\n    {\n      rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);\n    }\n  return rval;\n}\n\n/* Searches for the full path of the wrapper.  Returns\n   newly allocated full path name if found, NULL otherwise\n   Does not chase symlinks, even on platforms that support them.\n*/\nchar *\nfind_executable (const char *wrapper)\n{\n  int has_slash = 0;\n  const char *p;\n  const char *p_next;\n  /* static buffer for getcwd */\n  char tmp[LT_PATHMAX + 1];\n  int tmp_len;\n  char *concat_name;\n\n  lt_debugprintf (__FILE__, __LINE__, \"(find_executable): %s\\n\",\n                  nonempty (wrapper));\n\n  if ((wrapper == NULL) || (*wrapper == '\\0'))\n    return NULL;\n\n  /* Absolute path? */\n#if defined (HAVE_DOS_BASED_FILE_SYSTEM)\n  if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')\n    {\n      concat_name = xstrdup (wrapper);\n      if (check_executable (concat_name))\n\treturn concat_name;\n      XFREE (concat_name);\n    }\n  else\n    {\n#endif\n      if (IS_DIR_SEPARATOR (wrapper[0]))\n\t{\n\t  concat_name = xstrdup (wrapper);\n\t  if (check_executable (concat_name))\n\t    return concat_name;\n\t  XFREE (concat_name);\n\t}\n#if defined (HAVE_DOS_BASED_FILE_SYSTEM)\n    }\n#endif\n\n  for (p = wrapper; *p; p++)\n    if (*p == '/')\n      {\n\thas_slash = 1;\n\tbreak;\n      }\n  if (!has_slash)\n    {\n      /* no slashes; search PATH */\n      const char *path = getenv (\"PATH\");\n      if (path != NULL)\n\t{\n\t  for (p = path; *p; p = p_next)\n\t    {\n\t      const char *q;\n\t      size_t p_len;\n\t      for (q = p; *q; q++)\n\t\tif (IS_PATH_SEPARATOR (*q))\n\t\t  break;\n\t      p_len = q - p;\n\t      p_next = (*q == '\\0' ? q : q + 1);\n\t      if (p_len == 0)\n\t\t{\n\t\t  /* empty path: current directory */\n\t\t  if (getcwd (tmp, LT_PATHMAX) == NULL)\n\t\t    lt_fatal (__FILE__, __LINE__, \"getcwd failed: %s\",\n                              nonnull (strerror (errno)));\n\t\t  tmp_len = strlen (tmp);\n\t\t  concat_name =\n\t\t    XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);\n\t\t  memcpy (concat_name, tmp, tmp_len);\n\t\t  concat_name[tmp_len] = '/';\n\t\t  strcpy (concat_name + tmp_len + 1, wrapper);\n\t\t}\n\t      else\n\t\t{\n\t\t  concat_name =\n\t\t    XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);\n\t\t  memcpy (concat_name, p, p_len);\n\t\t  concat_name[p_len] = '/';\n\t\t  strcpy (concat_name + p_len + 1, wrapper);\n\t\t}\n\t      if (check_executable (concat_name))\n\t\treturn concat_name;\n\t      XFREE (concat_name);\n\t    }\n\t}\n      /* not found in PATH; assume curdir */\n    }\n  /* Relative path | not found in path: prepend cwd */\n  if (getcwd (tmp, LT_PATHMAX) == NULL)\n    lt_fatal (__FILE__, __LINE__, \"getcwd failed: %s\",\n              nonnull (strerror (errno)));\n  tmp_len = strlen (tmp);\n  concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);\n  memcpy (concat_name, tmp, tmp_len);\n  concat_name[tmp_len] = '/';\n  strcpy (concat_name + tmp_len + 1, wrapper);\n\n  if (check_executable (concat_name))\n    return concat_name;\n  XFREE (concat_name);\n  return NULL;\n}\n\nchar *\nchase_symlinks (const char *pathspec)\n{\n#ifndef S_ISLNK\n  return xstrdup (pathspec);\n#else\n  char buf[LT_PATHMAX];\n  struct stat s;\n  char *tmp_pathspec = xstrdup (pathspec);\n  char *p;\n  int has_symlinks = 0;\n  while (strlen (tmp_pathspec) && !has_symlinks)\n    {\n      lt_debugprintf (__FILE__, __LINE__,\n\t\t      \"checking path component for symlinks: %s\\n\",\n\t\t      tmp_pathspec);\n      if (lstat (tmp_pathspec, &s) == 0)\n\t{\n\t  if (S_ISLNK (s.st_mode) != 0)\n\t    {\n\t      has_symlinks = 1;\n\t      break;\n\t    }\n\n\t  /* search backwards for last DIR_SEPARATOR */\n\t  p = tmp_pathspec + strlen (tmp_pathspec) - 1;\n\t  while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))\n\t    p--;\n\t  if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))\n\t    {\n\t      /* no more DIR_SEPARATORS left */\n\t      break;\n\t    }\n\t  *p = '\\0';\n\t}\n      else\n\t{\n\t  lt_fatal (__FILE__, __LINE__,\n\t\t    \"error accessing file \\\"%s\\\": %s\",\n\t\t    tmp_pathspec, nonnull (strerror (errno)));\n\t}\n    }\n  XFREE (tmp_pathspec);\n\n  if (!has_symlinks)\n    {\n      return xstrdup (pathspec);\n    }\n\n  tmp_pathspec = realpath (pathspec, buf);\n  if (tmp_pathspec == 0)\n    {\n      lt_fatal (__FILE__, __LINE__,\n\t\t\"could not follow symlinks for %s\", pathspec);\n    }\n  return xstrdup (tmp_pathspec);\n#endif\n}\n\nchar *\nstrendzap (char *str, const char *pat)\n{\n  size_t len, patlen;\n\n  assert (str != NULL);\n  assert (pat != NULL);\n\n  len = strlen (str);\n  patlen = strlen (pat);\n\n  if (patlen <= len)\n    {\n      str += len - patlen;\n      if (strcmp (str, pat) == 0)\n\t*str = '\\0';\n    }\n  return str;\n}\n\nvoid\nlt_debugprintf (const char *file, int line, const char *fmt, ...)\n{\n  va_list args;\n  if (lt_debug)\n    {\n      (void) fprintf (stderr, \"%s:%s:%d: \", program_name, file, line);\n      va_start (args, fmt);\n      (void) vfprintf (stderr, fmt, args);\n      va_end (args);\n    }\n}\n\nstatic void\nlt_error_core (int exit_status, const char *file,\n\t       int line, const char *mode,\n\t       const char *message, va_list ap)\n{\n  fprintf (stderr, \"%s:%s:%d: %s: \", program_name, file, line, mode);\n  vfprintf (stderr, message, ap);\n  fprintf (stderr, \".\\n\");\n\n  if (exit_status >= 0)\n    exit (exit_status);\n}\n\nvoid\nlt_fatal (const char *file, int line, const char *message, ...)\n{\n  va_list ap;\n  va_start (ap, message);\n  lt_error_core (EXIT_FAILURE, file, line, \"FATAL\", message, ap);\n  va_end (ap);\n}\n\nstatic const char *\nnonnull (const char *s)\n{\n  return s ? s : \"(null)\";\n}\n\nstatic const char *\nnonempty (const char *s)\n{\n  return (s && !*s) ? \"(empty)\" : nonnull (s);\n}\n\nvoid\nlt_setenv (const char *name, const char *value)\n{\n  lt_debugprintf (__FILE__, __LINE__,\n\t\t  \"(lt_setenv) setting '%s' to '%s'\\n\",\n                  nonnull (name), nonnull (value));\n  {\n#ifdef HAVE_SETENV\n    /* always make a copy, for consistency with !HAVE_SETENV */\n    char *str = xstrdup (value);\n    setenv (name, str, 1);\n#else\n    int len = strlen (name) + 1 + strlen (value) + 1;\n    char *str = XMALLOC (char, len);\n    sprintf (str, \"%s=%s\", name, value);\n    if (putenv (str) != EXIT_SUCCESS)\n      {\n        XFREE (str);\n      }\n#endif\n  }\n}\n\nchar *\nlt_extend_str (const char *orig_value, const char *add, int to_end)\n{\n  char *new_value;\n  if (orig_value && *orig_value)\n    {\n      int orig_value_len = strlen (orig_value);\n      int add_len = strlen (add);\n      new_value = XMALLOC (char, add_len + orig_value_len + 1);\n      if (to_end)\n        {\n          strcpy (new_value, orig_value);\n          strcpy (new_value + orig_value_len, add);\n        }\n      else\n        {\n          strcpy (new_value, add);\n          strcpy (new_value + add_len, orig_value);\n        }\n    }\n  else\n    {\n      new_value = xstrdup (add);\n    }\n  return new_value;\n}\n\nvoid\nlt_update_exe_path (const char *name, const char *value)\n{\n  lt_debugprintf (__FILE__, __LINE__,\n\t\t  \"(lt_update_exe_path) modifying '%s' by prepending '%s'\\n\",\n                  nonnull (name), nonnull (value));\n\n  if (name && *name && value && *value)\n    {\n      char *new_value = lt_extend_str (getenv (name), value, 0);\n      /* some systems can't cope with a ':'-terminated path #' */\n      int len = strlen (new_value);\n      while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))\n        {\n          new_value[len-1] = '\\0';\n        }\n      lt_setenv (name, new_value);\n      XFREE (new_value);\n    }\n}\n\nvoid\nlt_update_lib_path (const char *name, const char *value)\n{\n  lt_debugprintf (__FILE__, __LINE__,\n\t\t  \"(lt_update_lib_path) modifying '%s' by prepending '%s'\\n\",\n                  nonnull (name), nonnull (value));\n\n  if (name && *name && value && *value)\n    {\n      char *new_value = lt_extend_str (getenv (name), value, 0);\n      lt_setenv (name, new_value);\n      XFREE (new_value);\n    }\n}\n\nEOF\n\t    case $host_os in\n\t      mingw*)\n\t\tcat <<\"EOF\"\n\n/* Prepares an argument vector before calling spawn().\n   Note that spawn() does not by itself call the command interpreter\n     (getenv (\"COMSPEC\") != NULL ? getenv (\"COMSPEC\") :\n      ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);\n         GetVersionEx(&v);\n         v.dwPlatformId == VER_PLATFORM_WIN32_NT;\n      }) ? \"cmd.exe\" : \"command.com\").\n   Instead it simply concatenates the arguments, separated by ' ', and calls\n   CreateProcess().  We must quote the arguments since Win32 CreateProcess()\n   interprets characters like ' ', '\\t', '\\\\', '\"' (but not '<' and '>') in a\n   special way:\n   - Space and tab are interpreted as delimiters. They are not treated as\n     delimiters if they are surrounded by double quotes: \"...\".\n   - Unescaped double quotes are removed from the input. Their only effect is\n     that within double quotes, space and tab are treated like normal\n     characters.\n   - Backslashes not followed by double quotes are not special.\n   - But 2*n+1 backslashes followed by a double quote become\n     n backslashes followed by a double quote (n >= 0):\n       \\\" -> \"\n       \\\\\\\" -> \\\"\n       \\\\\\\\\\\" -> \\\\\"\n */\n#define SHELL_SPECIAL_CHARS \"\\\"\\\\ \\001\\002\\003\\004\\005\\006\\007\\010\\011\\012\\013\\014\\015\\016\\017\\020\\021\\022\\023\\024\\025\\026\\027\\030\\031\\032\\033\\034\\035\\036\\037\"\n#define SHELL_SPACE_CHARS \" \\001\\002\\003\\004\\005\\006\\007\\010\\011\\012\\013\\014\\015\\016\\017\\020\\021\\022\\023\\024\\025\\026\\027\\030\\031\\032\\033\\034\\035\\036\\037\"\nchar **\nprepare_spawn (char **argv)\n{\n  size_t argc;\n  char **new_argv;\n  size_t i;\n\n  /* Count number of arguments.  */\n  for (argc = 0; argv[argc] != NULL; argc++)\n    ;\n\n  /* Allocate new argument vector.  */\n  new_argv = XMALLOC (char *, argc + 1);\n\n  /* Put quoted arguments into the new argument vector.  */\n  for (i = 0; i < argc; i++)\n    {\n      const char *string = argv[i];\n\n      if (string[0] == '\\0')\n\tnew_argv[i] = xstrdup (\"\\\"\\\"\");\n      else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL)\n\t{\n\t  int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL);\n\t  size_t length;\n\t  unsigned int backslashes;\n\t  const char *s;\n\t  char *quoted_string;\n\t  char *p;\n\n\t  length = 0;\n\t  backslashes = 0;\n\t  if (quote_around)\n\t    length++;\n\t  for (s = string; *s != '\\0'; s++)\n\t    {\n\t      char c = *s;\n\t      if (c == '\"')\n\t\tlength += backslashes + 1;\n\t      length++;\n\t      if (c == '\\\\')\n\t\tbackslashes++;\n\t      else\n\t\tbackslashes = 0;\n\t    }\n\t  if (quote_around)\n\t    length += backslashes + 1;\n\n\t  quoted_string = XMALLOC (char, length + 1);\n\n\t  p = quoted_string;\n\t  backslashes = 0;\n\t  if (quote_around)\n\t    *p++ = '\"';\n\t  for (s = string; *s != '\\0'; s++)\n\t    {\n\t      char c = *s;\n\t      if (c == '\"')\n\t\t{\n\t\t  unsigned int j;\n\t\t  for (j = backslashes + 1; j > 0; j--)\n\t\t    *p++ = '\\\\';\n\t\t}\n\t      *p++ = c;\n\t      if (c == '\\\\')\n\t\tbackslashes++;\n\t      else\n\t\tbackslashes = 0;\n\t    }\n\t  if (quote_around)\n\t    {\n\t      unsigned int j;\n\t      for (j = backslashes; j > 0; j--)\n\t\t*p++ = '\\\\';\n\t      *p++ = '\"';\n\t    }\n\t  *p = '\\0';\n\n\t  new_argv[i] = quoted_string;\n\t}\n      else\n\tnew_argv[i] = (char *) string;\n    }\n  new_argv[argc] = NULL;\n\n  return new_argv;\n}\nEOF\n\t\t;;\n\t    esac\n\n            cat <<\"EOF\"\nvoid lt_dump_script (FILE* f)\n{\nEOF\n\t    func_emit_wrapper yes |\n\t      $SED -n -e '\ns/^\\(.\\{79\\}\\)\\(..*\\)/\\1\\\n\\2/\nh\ns/\\([\\\\\"]\\)/\\\\\\1/g\ns/$/\\\\n/\ns/\\([^\\n]*\\).*/  fputs (\"\\1\", f);/p\ng\nD'\n            cat <<\"EOF\"\n}\nEOF\n}\n# end: func_emit_cwrapperexe_src\n\n# func_win32_import_lib_p ARG\n# True if ARG is an import lib, as indicated by $file_magic_cmd\nfunc_win32_import_lib_p ()\n{\n    $opt_debug\n    case `eval $file_magic_cmd \\\"\\$1\\\" 2>/dev/null | $SED -e 10q` in\n    *import*) : ;;\n    *) false ;;\n    esac\n}\n\n# func_mode_link arg...\nfunc_mode_link ()\n{\n    $opt_debug\n    case $host in\n    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)\n      # It is impossible to link a dll without this setting, and\n      # we shouldn't force the makefile maintainer to figure out\n      # which system we are compiling for in order to pass an extra\n      # flag for every libtool invocation.\n      # allow_undefined=no\n\n      # FIXME: Unfortunately, there are problems with the above when trying\n      # to make a dll which has undefined symbols, in which case not\n      # even a static library is built.  For now, we need to specify\n      # -no-undefined on the libtool link line when we can be certain\n      # that all symbols are satisfied, otherwise we get a static library.\n      allow_undefined=yes\n      ;;\n    *)\n      allow_undefined=yes\n      ;;\n    esac\n    libtool_args=$nonopt\n    base_compile=\"$nonopt $@\"\n    compile_command=$nonopt\n    finalize_command=$nonopt\n\n    compile_rpath=\n    finalize_rpath=\n    compile_shlibpath=\n    finalize_shlibpath=\n    convenience=\n    old_convenience=\n    deplibs=\n    old_deplibs=\n    compiler_flags=\n    linker_flags=\n    dllsearchpath=\n    lib_search_path=`pwd`\n    inst_prefix_dir=\n    new_inherited_linker_flags=\n\n    avoid_version=no\n    bindir=\n    dlfiles=\n    dlprefiles=\n    dlself=no\n    export_dynamic=no\n    export_symbols=\n    export_symbols_regex=\n    generated=\n    libobjs=\n    ltlibs=\n    module=no\n    no_install=no\n    objs=\n    non_pic_objects=\n    precious_files_regex=\n    prefer_static_libs=no\n    preload=no\n    prev=\n    prevarg=\n    release=\n    rpath=\n    xrpath=\n    perm_rpath=\n    temp_rpath=\n    thread_safe=no\n    vinfo=\n    vinfo_number=no\n    weak_libs=\n    single_module=\"${wl}-single_module\"\n    func_infer_tag $base_compile\n\n    # We need to know -static, to get the right output filenames.\n    for arg\n    do\n      case $arg in\n      -shared)\n\ttest \"$build_libtool_libs\" != yes && \\\n\t  func_fatal_configuration \"can not build a shared library\"\n\tbuild_old_libs=no\n\tbreak\n\t;;\n      -all-static | -static | -static-libtool-libs)\n\tcase $arg in\n\t-all-static)\n\t  if test \"$build_libtool_libs\" = yes && test -z \"$link_static_flag\"; then\n\t    func_warning \"complete static linking is impossible in this configuration\"\n\t  fi\n\t  if test -n \"$link_static_flag\"; then\n\t    dlopen_self=$dlopen_self_static\n\t  fi\n\t  prefer_static_libs=yes\n\t  ;;\n\t-static)\n\t  if test -z \"$pic_flag\" && test -n \"$link_static_flag\"; then\n\t    dlopen_self=$dlopen_self_static\n\t  fi\n\t  prefer_static_libs=built\n\t  ;;\n\t-static-libtool-libs)\n\t  if test -z \"$pic_flag\" && test -n \"$link_static_flag\"; then\n\t    dlopen_self=$dlopen_self_static\n\t  fi\n\t  prefer_static_libs=yes\n\t  ;;\n\tesac\n\tbuild_libtool_libs=no\n\tbuild_old_libs=yes\n\tbreak\n\t;;\n      esac\n    done\n\n    # See if our shared archives depend on static archives.\n    test -n \"$old_archive_from_new_cmds\" && build_old_libs=yes\n\n    # Go through the arguments, transforming them on the way.\n    while test \"$#\" -gt 0; do\n      arg=\"$1\"\n      shift\n      func_quote_for_eval \"$arg\"\n      qarg=$func_quote_for_eval_unquoted_result\n      func_append libtool_args \" $func_quote_for_eval_result\"\n\n      # If the previous option needs an argument, assign it.\n      if test -n \"$prev\"; then\n\tcase $prev in\n\toutput)\n\t  func_append compile_command \" @OUTPUT@\"\n\t  func_append finalize_command \" @OUTPUT@\"\n\t  ;;\n\tesac\n\n\tcase $prev in\n\tbindir)\n\t  bindir=\"$arg\"\n\t  prev=\n\t  continue\n\t  ;;\n\tdlfiles|dlprefiles)\n\t  if test \"$preload\" = no; then\n\t    # Add the symbol object into the linking commands.\n\t    func_append compile_command \" @SYMFILE@\"\n\t    func_append finalize_command \" @SYMFILE@\"\n\t    preload=yes\n\t  fi\n\t  case $arg in\n\t  *.la | *.lo) ;;  # We handle these cases below.\n\t  force)\n\t    if test \"$dlself\" = no; then\n\t      dlself=needless\n\t      export_dynamic=yes\n\t    fi\n\t    prev=\n\t    continue\n\t    ;;\n\t  self)\n\t    if test \"$prev\" = dlprefiles; then\n\t      dlself=yes\n\t    elif test \"$prev\" = dlfiles && test \"$dlopen_self\" != yes; then\n\t      dlself=yes\n\t    else\n\t      dlself=needless\n\t      export_dynamic=yes\n\t    fi\n\t    prev=\n\t    continue\n\t    ;;\n\t  *)\n\t    if test \"$prev\" = dlfiles; then\n\t      func_append dlfiles \" $arg\"\n\t    else\n\t      func_append dlprefiles \" $arg\"\n\t    fi\n\t    prev=\n\t    continue\n\t    ;;\n\t  esac\n\t  ;;\n\texpsyms)\n\t  export_symbols=\"$arg\"\n\t  test -f \"$arg\" \\\n\t    || func_fatal_error \"symbol file \\`$arg' does not exist\"\n\t  prev=\n\t  continue\n\t  ;;\n\texpsyms_regex)\n\t  export_symbols_regex=\"$arg\"\n\t  prev=\n\t  continue\n\t  ;;\n\tframework)\n\t  case $host in\n\t    *-*-darwin*)\n\t      case \"$deplibs \" in\n\t\t*\" $qarg.ltframework \"*) ;;\n\t\t*) func_append deplibs \" $qarg.ltframework\" # this is fixed later\n\t\t   ;;\n\t      esac\n\t      ;;\n\t  esac\n\t  prev=\n\t  continue\n\t  ;;\n\tinst_prefix)\n\t  inst_prefix_dir=\"$arg\"\n\t  prev=\n\t  continue\n\t  ;;\n\tobjectlist)\n\t  if test -f \"$arg\"; then\n\t    save_arg=$arg\n\t    moreargs=\n\t    for fil in `cat \"$save_arg\"`\n\t    do\n#\t      func_append moreargs \" $fil\"\n\t      arg=$fil\n\t      # A libtool-controlled object.\n\n\t      # Check to see that this really is a libtool object.\n\t      if func_lalib_unsafe_p \"$arg\"; then\n\t\tpic_object=\n\t\tnon_pic_object=\n\n\t\t# Read the .lo file\n\t\tfunc_source \"$arg\"\n\n\t\tif test -z \"$pic_object\" ||\n\t\t   test -z \"$non_pic_object\" ||\n\t\t   test \"$pic_object\" = none &&\n\t\t   test \"$non_pic_object\" = none; then\n\t\t  func_fatal_error \"cannot find name of object for \\`$arg'\"\n\t\tfi\n\n\t\t# Extract subdirectory from the argument.\n\t\tfunc_dirname \"$arg\" \"/\" \"\"\n\t\txdir=\"$func_dirname_result\"\n\n\t\tif test \"$pic_object\" != none; then\n\t\t  # Prepend the subdirectory the object is found in.\n\t\t  pic_object=\"$xdir$pic_object\"\n\n\t\t  if test \"$prev\" = dlfiles; then\n\t\t    if test \"$build_libtool_libs\" = yes && test \"$dlopen_support\" = yes; then\n\t\t      func_append dlfiles \" $pic_object\"\n\t\t      prev=\n\t\t      continue\n\t\t    else\n\t\t      # If libtool objects are unsupported, then we need to preload.\n\t\t      prev=dlprefiles\n\t\t    fi\n\t\t  fi\n\n\t\t  # CHECK ME:  I think I busted this.  -Ossama\n\t\t  if test \"$prev\" = dlprefiles; then\n\t\t    # Preload the old-style object.\n\t\t    func_append dlprefiles \" $pic_object\"\n\t\t    prev=\n\t\t  fi\n\n\t\t  # A PIC object.\n\t\t  func_append libobjs \" $pic_object\"\n\t\t  arg=\"$pic_object\"\n\t\tfi\n\n\t\t# Non-PIC object.\n\t\tif test \"$non_pic_object\" != none; then\n\t\t  # Prepend the subdirectory the object is found in.\n\t\t  non_pic_object=\"$xdir$non_pic_object\"\n\n\t\t  # A standard non-PIC object\n\t\t  func_append non_pic_objects \" $non_pic_object\"\n\t\t  if test -z \"$pic_object\" || test \"$pic_object\" = none ; then\n\t\t    arg=\"$non_pic_object\"\n\t\t  fi\n\t\telse\n\t\t  # If the PIC object exists, use it instead.\n\t\t  # $xdir was prepended to $pic_object above.\n\t\t  non_pic_object=\"$pic_object\"\n\t\t  func_append non_pic_objects \" $non_pic_object\"\n\t\tfi\n\t      else\n\t\t# Only an error if not doing a dry-run.\n\t\tif $opt_dry_run; then\n\t\t  # Extract subdirectory from the argument.\n\t\t  func_dirname \"$arg\" \"/\" \"\"\n\t\t  xdir=\"$func_dirname_result\"\n\n\t\t  func_lo2o \"$arg\"\n\t\t  pic_object=$xdir$objdir/$func_lo2o_result\n\t\t  non_pic_object=$xdir$func_lo2o_result\n\t\t  func_append libobjs \" $pic_object\"\n\t\t  func_append non_pic_objects \" $non_pic_object\"\n\t        else\n\t\t  func_fatal_error \"\\`$arg' is not a valid libtool object\"\n\t\tfi\n\t      fi\n\t    done\n\t  else\n\t    func_fatal_error \"link input file \\`$arg' does not exist\"\n\t  fi\n\t  arg=$save_arg\n\t  prev=\n\t  continue\n\t  ;;\n\tprecious_regex)\n\t  precious_files_regex=\"$arg\"\n\t  prev=\n\t  continue\n\t  ;;\n\trelease)\n\t  release=\"-$arg\"\n\t  prev=\n\t  continue\n\t  ;;\n\trpath | xrpath)\n\t  # We need an absolute path.\n\t  case $arg in\n\t  [\\\\/]* | [A-Za-z]:[\\\\/]*) ;;\n\t  *)\n\t    func_fatal_error \"only absolute run-paths are allowed\"\n\t    ;;\n\t  esac\n\t  if test \"$prev\" = rpath; then\n\t    case \"$rpath \" in\n\t    *\" $arg \"*) ;;\n\t    *) func_append rpath \" $arg\" ;;\n\t    esac\n\t  else\n\t    case \"$xrpath \" in\n\t    *\" $arg \"*) ;;\n\t    *) func_append xrpath \" $arg\" ;;\n\t    esac\n\t  fi\n\t  prev=\n\t  continue\n\t  ;;\n\tshrext)\n\t  shrext_cmds=\"$arg\"\n\t  prev=\n\t  continue\n\t  ;;\n\tweak)\n\t  func_append weak_libs \" $arg\"\n\t  prev=\n\t  continue\n\t  ;;\n\txcclinker)\n\t  func_append linker_flags \" $qarg\"\n\t  func_append compiler_flags \" $qarg\"\n\t  prev=\n\t  func_append compile_command \" $qarg\"\n\t  func_append finalize_command \" $qarg\"\n\t  continue\n\t  ;;\n\txcompiler)\n\t  func_append compiler_flags \" $qarg\"\n\t  prev=\n\t  func_append compile_command \" $qarg\"\n\t  func_append finalize_command \" $qarg\"\n\t  continue\n\t  ;;\n\txlinker)\n\t  func_append linker_flags \" $qarg\"\n\t  func_append compiler_flags \" $wl$qarg\"\n\t  prev=\n\t  func_append compile_command \" $wl$qarg\"\n\t  func_append finalize_command \" $wl$qarg\"\n\t  continue\n\t  ;;\n\t*)\n\t  eval \"$prev=\\\"\\$arg\\\"\"\n\t  prev=\n\t  continue\n\t  ;;\n\tesac\n      fi # test -n \"$prev\"\n\n      prevarg=\"$arg\"\n\n      case $arg in\n      -all-static)\n\tif test -n \"$link_static_flag\"; then\n\t  # See comment for -static flag below, for more details.\n\t  func_append compile_command \" $link_static_flag\"\n\t  func_append finalize_command \" $link_static_flag\"\n\tfi\n\tcontinue\n\t;;\n\n      -allow-undefined)\n\t# FIXME: remove this flag sometime in the future.\n\tfunc_fatal_error \"\\`-allow-undefined' must not be used because it is the default\"\n\t;;\n\n      -avoid-version)\n\tavoid_version=yes\n\tcontinue\n\t;;\n\n      -bindir)\n\tprev=bindir\n\tcontinue\n\t;;\n\n      -dlopen)\n\tprev=dlfiles\n\tcontinue\n\t;;\n\n      -dlpreopen)\n\tprev=dlprefiles\n\tcontinue\n\t;;\n\n      -export-dynamic)\n\texport_dynamic=yes\n\tcontinue\n\t;;\n\n      -export-symbols | -export-symbols-regex)\n\tif test -n \"$export_symbols\" || test -n \"$export_symbols_regex\"; then\n\t  func_fatal_error \"more than one -exported-symbols argument is not allowed\"\n\tfi\n\tif test \"X$arg\" = \"X-export-symbols\"; then\n\t  prev=expsyms\n\telse\n\t  prev=expsyms_regex\n\tfi\n\tcontinue\n\t;;\n\n      -framework)\n\tprev=framework\n\tcontinue\n\t;;\n\n      -inst-prefix-dir)\n\tprev=inst_prefix\n\tcontinue\n\t;;\n\n      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*\n      # so, if we see these flags be careful not to treat them like -L\n      -L[A-Z][A-Z]*:*)\n\tcase $with_gcc/$host in\n\tno/*-*-irix* | /*-*-irix*)\n\t  func_append compile_command \" $arg\"\n\t  func_append finalize_command \" $arg\"\n\t  ;;\n\tesac\n\tcontinue\n\t;;\n\n      -L*)\n\tfunc_stripname \"-L\" '' \"$arg\"\n\tif test -z \"$func_stripname_result\"; then\n\t  if test \"$#\" -gt 0; then\n\t    func_fatal_error \"require no space between \\`-L' and \\`$1'\"\n\t  else\n\t    func_fatal_error \"need path for \\`-L' option\"\n\t  fi\n\tfi\n\tfunc_resolve_sysroot \"$func_stripname_result\"\n\tdir=$func_resolve_sysroot_result\n\t# We need an absolute path.\n\tcase $dir in\n\t[\\\\/]* | [A-Za-z]:[\\\\/]*) ;;\n\t*)\n\t  absdir=`cd \"$dir\" && pwd`\n\t  test -z \"$absdir\" && \\\n\t    func_fatal_error \"cannot determine absolute directory name of \\`$dir'\"\n\t  dir=\"$absdir\"\n\t  ;;\n\tesac\n\tcase \"$deplibs \" in\n\t*\" -L$dir \"* | *\" $arg \"*)\n\t  # Will only happen for absolute or sysroot arguments\n\t  ;;\n\t*)\n\t  # Preserve sysroot, but never include relative directories\n\t  case $dir in\n\t    [\\\\/]* | [A-Za-z]:[\\\\/]* | =*) func_append deplibs \" $arg\" ;;\n\t    *) func_append deplibs \" -L$dir\" ;;\n\t  esac\n\t  func_append lib_search_path \" $dir\"\n\t  ;;\n\tesac\n\tcase $host in\n\t*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)\n\t  testbindir=`$ECHO \"$dir\" | $SED 's*/lib$*/bin*'`\n\t  case :$dllsearchpath: in\n\t  *\":$dir:\"*) ;;\n\t  ::) dllsearchpath=$dir;;\n\t  *) func_append dllsearchpath \":$dir\";;\n\t  esac\n\t  case :$dllsearchpath: in\n\t  *\":$testbindir:\"*) ;;\n\t  ::) dllsearchpath=$testbindir;;\n\t  *) func_append dllsearchpath \":$testbindir\";;\n\t  esac\n\t  ;;\n\tesac\n\tcontinue\n\t;;\n\n      -l*)\n\tif test \"X$arg\" = \"X-lc\" || test \"X$arg\" = \"X-lm\"; then\n\t  case $host in\n\t  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)\n\t    # These systems don't actually have a C or math library (as such)\n\t    continue\n\t    ;;\n\t  *-*-os2*)\n\t    # These systems don't actually have a C library (as such)\n\t    test \"X$arg\" = \"X-lc\" && continue\n\t    ;;\n\t  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)\n\t    # Do not include libc due to us having libc/libc_r.\n\t    test \"X$arg\" = \"X-lc\" && continue\n\t    ;;\n\t  *-*-rhapsody* | *-*-darwin1.[012])\n\t    # Rhapsody C and math libraries are in the System framework\n\t    func_append deplibs \" System.ltframework\"\n\t    continue\n\t    ;;\n\t  *-*-sco3.2v5* | *-*-sco5v6*)\n\t    # Causes problems with __ctype\n\t    test \"X$arg\" = \"X-lc\" && continue\n\t    ;;\n\t  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)\n\t    # Compiler inserts libc in the correct place for threads to work\n\t    test \"X$arg\" = \"X-lc\" && continue\n\t    ;;\n\t  esac\n\telif test \"X$arg\" = \"X-lc_r\"; then\n\t case $host in\n\t *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)\n\t   # Do not include libc_r directly, use -pthread flag.\n\t   continue\n\t   ;;\n\t esac\n\tfi\n\tfunc_append deplibs \" $arg\"\n\tcontinue\n\t;;\n\n      -module)\n\tmodule=yes\n\tcontinue\n\t;;\n\n      # Tru64 UNIX uses -model [arg] to determine the layout of C++\n      # classes, name mangling, and exception handling.\n      # Darwin uses the -arch flag to determine output architecture.\n      -model|-arch|-isysroot|--sysroot)\n\tfunc_append compiler_flags \" $arg\"\n\tfunc_append compile_command \" $arg\"\n\tfunc_append finalize_command \" $arg\"\n\tprev=xcompiler\n\tcontinue\n\t;;\n\n      -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \\\n      |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)\n\tfunc_append compiler_flags \" $arg\"\n\tfunc_append compile_command \" $arg\"\n\tfunc_append finalize_command \" $arg\"\n\tcase \"$new_inherited_linker_flags \" in\n\t    *\" $arg \"*) ;;\n\t    * ) func_append new_inherited_linker_flags \" $arg\" ;;\n\tesac\n\tcontinue\n\t;;\n\n      -multi_module)\n\tsingle_module=\"${wl}-multi_module\"\n\tcontinue\n\t;;\n\n      -no-fast-install)\n\tfast_install=no\n\tcontinue\n\t;;\n\n      -no-install)\n\tcase $host in\n\t*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)\n\t  # The PATH hackery in wrapper scripts is required on Windows\n\t  # and Darwin in order for the loader to find any dlls it needs.\n\t  func_warning \"\\`-no-install' is ignored for $host\"\n\t  func_warning \"assuming \\`-no-fast-install' instead\"\n\t  fast_install=no\n\t  ;;\n\t*) no_install=yes ;;\n\tesac\n\tcontinue\n\t;;\n\n      -no-undefined)\n\tallow_undefined=no\n\tcontinue\n\t;;\n\n      -objectlist)\n\tprev=objectlist\n\tcontinue\n\t;;\n\n      -o) prev=output ;;\n\n      -precious-files-regex)\n\tprev=precious_regex\n\tcontinue\n\t;;\n\n      -release)\n\tprev=release\n\tcontinue\n\t;;\n\n      -rpath)\n\tprev=rpath\n\tcontinue\n\t;;\n\n      -R)\n\tprev=xrpath\n\tcontinue\n\t;;\n\n      -R*)\n\tfunc_stripname '-R' '' \"$arg\"\n\tdir=$func_stripname_result\n\t# We need an absolute path.\n\tcase $dir in\n\t[\\\\/]* | [A-Za-z]:[\\\\/]*) ;;\n\t=*)\n\t  func_stripname '=' '' \"$dir\"\n\t  dir=$lt_sysroot$func_stripname_result\n\t  ;;\n\t*)\n\t  func_fatal_error \"only absolute run-paths are allowed\"\n\t  ;;\n\tesac\n\tcase \"$xrpath \" in\n\t*\" $dir \"*) ;;\n\t*) func_append xrpath \" $dir\" ;;\n\tesac\n\tcontinue\n\t;;\n\n      -shared)\n\t# The effects of -shared are defined in a previous loop.\n\tcontinue\n\t;;\n\n      -shrext)\n\tprev=shrext\n\tcontinue\n\t;;\n\n      -static | -static-libtool-libs)\n\t# The effects of -static are defined in a previous loop.\n\t# We used to do the same as -all-static on platforms that\n\t# didn't have a PIC flag, but the assumption that the effects\n\t# would be equivalent was wrong.  It would break on at least\n\t# Digital Unix and AIX.\n\tcontinue\n\t;;\n\n      -thread-safe)\n\tthread_safe=yes\n\tcontinue\n\t;;\n\n      -version-info)\n\tprev=vinfo\n\tcontinue\n\t;;\n\n      -version-number)\n\tprev=vinfo\n\tvinfo_number=yes\n\tcontinue\n\t;;\n\n      -weak)\n        prev=weak\n\tcontinue\n\t;;\n\n      -Wc,*)\n\tfunc_stripname '-Wc,' '' \"$arg\"\n\targs=$func_stripname_result\n\targ=\n\tsave_ifs=\"$IFS\"; IFS=','\n\tfor flag in $args; do\n\t  IFS=\"$save_ifs\"\n          func_quote_for_eval \"$flag\"\n\t  func_append arg \" $func_quote_for_eval_result\"\n\t  func_append compiler_flags \" $func_quote_for_eval_result\"\n\tdone\n\tIFS=\"$save_ifs\"\n\tfunc_stripname ' ' '' \"$arg\"\n\targ=$func_stripname_result\n\t;;\n\n      -Wl,*)\n\tfunc_stripname '-Wl,' '' \"$arg\"\n\targs=$func_stripname_result\n\targ=\n\tsave_ifs=\"$IFS\"; IFS=','\n\tfor flag in $args; do\n\t  IFS=\"$save_ifs\"\n          func_quote_for_eval \"$flag\"\n\t  func_append arg \" $wl$func_quote_for_eval_result\"\n\t  func_append compiler_flags \" $wl$func_quote_for_eval_result\"\n\t  func_append linker_flags \" $func_quote_for_eval_result\"\n\tdone\n\tIFS=\"$save_ifs\"\n\tfunc_stripname ' ' '' \"$arg\"\n\targ=$func_stripname_result\n\t;;\n\n      -Xcompiler)\n\tprev=xcompiler\n\tcontinue\n\t;;\n\n      -Xlinker)\n\tprev=xlinker\n\tcontinue\n\t;;\n\n      -XCClinker)\n\tprev=xcclinker\n\tcontinue\n\t;;\n\n      # -msg_* for osf cc\n      -msg_*)\n\tfunc_quote_for_eval \"$arg\"\n\targ=\"$func_quote_for_eval_result\"\n\t;;\n\n      # Flags to be passed through unchanged, with rationale:\n      # -64, -mips[0-9]      enable 64-bit mode for the SGI compiler\n      # -r[0-9][0-9]*        specify processor for the SGI compiler\n      # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler\n      # +DA*, +DD*           enable 64-bit mode for the HP compiler\n      # -q*                  compiler args for the IBM compiler\n      # -m*, -t[45]*, -txscale* architecture-specific flags for GCC\n      # -F/path              path to uninstalled frameworks, gcc on darwin\n      # -p, -pg, --coverage, -fprofile-*  profiling flags for GCC\n      # @file                GCC response files\n      # -tp=*                Portland pgcc target processor selection\n      # --sysroot=*          for sysroot support\n      # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization\n      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \\\n      -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \\\n      -O*|-flto*|-fwhopr*|-fuse-linker-plugin)\n        func_quote_for_eval \"$arg\"\n\targ=\"$func_quote_for_eval_result\"\n        func_append compile_command \" $arg\"\n        func_append finalize_command \" $arg\"\n        func_append compiler_flags \" $arg\"\n        continue\n        ;;\n\n      # Some other compiler flag.\n      -* | +*)\n        func_quote_for_eval \"$arg\"\n\targ=\"$func_quote_for_eval_result\"\n\t;;\n\n      *.$objext)\n\t# A standard object.\n\tfunc_append objs \" $arg\"\n\t;;\n\n      *.lo)\n\t# A libtool-controlled object.\n\n\t# Check to see that this really is a libtool object.\n\tif func_lalib_unsafe_p \"$arg\"; then\n\t  pic_object=\n\t  non_pic_object=\n\n\t  # Read the .lo file\n\t  func_source \"$arg\"\n\n\t  if test -z \"$pic_object\" ||\n\t     test -z \"$non_pic_object\" ||\n\t     test \"$pic_object\" = none &&\n\t     test \"$non_pic_object\" = none; then\n\t    func_fatal_error \"cannot find name of object for \\`$arg'\"\n\t  fi\n\n\t  # Extract subdirectory from the argument.\n\t  func_dirname \"$arg\" \"/\" \"\"\n\t  xdir=\"$func_dirname_result\"\n\n\t  if test \"$pic_object\" != none; then\n\t    # Prepend the subdirectory the object is found in.\n\t    pic_object=\"$xdir$pic_object\"\n\n\t    if test \"$prev\" = dlfiles; then\n\t      if test \"$build_libtool_libs\" = yes && test \"$dlopen_support\" = yes; then\n\t\tfunc_append dlfiles \" $pic_object\"\n\t\tprev=\n\t\tcontinue\n\t      else\n\t\t# If libtool objects are unsupported, then we need to preload.\n\t\tprev=dlprefiles\n\t      fi\n\t    fi\n\n\t    # CHECK ME:  I think I busted this.  -Ossama\n\t    if test \"$prev\" = dlprefiles; then\n\t      # Preload the old-style object.\n\t      func_append dlprefiles \" $pic_object\"\n\t      prev=\n\t    fi\n\n\t    # A PIC object.\n\t    func_append libobjs \" $pic_object\"\n\t    arg=\"$pic_object\"\n\t  fi\n\n\t  # Non-PIC object.\n\t  if test \"$non_pic_object\" != none; then\n\t    # Prepend the subdirectory the object is found in.\n\t    non_pic_object=\"$xdir$non_pic_object\"\n\n\t    # A standard non-PIC object\n\t    func_append non_pic_objects \" $non_pic_object\"\n\t    if test -z \"$pic_object\" || test \"$pic_object\" = none ; then\n\t      arg=\"$non_pic_object\"\n\t    fi\n\t  else\n\t    # If the PIC object exists, use it instead.\n\t    # $xdir was prepended to $pic_object above.\n\t    non_pic_object=\"$pic_object\"\n\t    func_append non_pic_objects \" $non_pic_object\"\n\t  fi\n\telse\n\t  # Only an error if not doing a dry-run.\n\t  if $opt_dry_run; then\n\t    # Extract subdirectory from the argument.\n\t    func_dirname \"$arg\" \"/\" \"\"\n\t    xdir=\"$func_dirname_result\"\n\n\t    func_lo2o \"$arg\"\n\t    pic_object=$xdir$objdir/$func_lo2o_result\n\t    non_pic_object=$xdir$func_lo2o_result\n\t    func_append libobjs \" $pic_object\"\n\t    func_append non_pic_objects \" $non_pic_object\"\n\t  else\n\t    func_fatal_error \"\\`$arg' is not a valid libtool object\"\n\t  fi\n\tfi\n\t;;\n\n      *.$libext)\n\t# An archive.\n\tfunc_append deplibs \" $arg\"\n\tfunc_append old_deplibs \" $arg\"\n\tcontinue\n\t;;\n\n      *.la)\n\t# A libtool-controlled library.\n\n\tfunc_resolve_sysroot \"$arg\"\n\tif test \"$prev\" = dlfiles; then\n\t  # This library was specified with -dlopen.\n\t  func_append dlfiles \" $func_resolve_sysroot_result\"\n\t  prev=\n\telif test \"$prev\" = dlprefiles; then\n\t  # The library was specified with -dlpreopen.\n\t  func_append dlprefiles \" $func_resolve_sysroot_result\"\n\t  prev=\n\telse\n\t  func_append deplibs \" $func_resolve_sysroot_result\"\n\tfi\n\tcontinue\n\t;;\n\n      # Some other compiler argument.\n      *)\n\t# Unknown arguments in both finalize_command and compile_command need\n\t# to be aesthetically quoted because they are evaled later.\n\tfunc_quote_for_eval \"$arg\"\n\targ=\"$func_quote_for_eval_result\"\n\t;;\n      esac # arg\n\n      # Now actually substitute the argument into the commands.\n      if test -n \"$arg\"; then\n\tfunc_append compile_command \" $arg\"\n\tfunc_append finalize_command \" $arg\"\n      fi\n    done # argument parsing loop\n\n    test -n \"$prev\" && \\\n      func_fatal_help \"the \\`$prevarg' option requires an argument\"\n\n    if test \"$export_dynamic\" = yes && test -n \"$export_dynamic_flag_spec\"; then\n      eval arg=\\\"$export_dynamic_flag_spec\\\"\n      func_append compile_command \" $arg\"\n      func_append finalize_command \" $arg\"\n    fi\n\n    oldlibs=\n    # calculate the name of the file, without its directory\n    func_basename \"$output\"\n    outputname=\"$func_basename_result\"\n    libobjs_save=\"$libobjs\"\n\n    if test -n \"$shlibpath_var\"; then\n      # get the directories listed in $shlibpath_var\n      eval shlib_search_path=\\`\\$ECHO \\\"\\${$shlibpath_var}\\\" \\| \\$SED \\'s/:/ /g\\'\\`\n    else\n      shlib_search_path=\n    fi\n    eval sys_lib_search_path=\\\"$sys_lib_search_path_spec\\\"\n    eval sys_lib_dlsearch_path=\\\"$sys_lib_dlsearch_path_spec\\\"\n\n    func_dirname \"$output\" \"/\" \"\"\n    output_objdir=\"$func_dirname_result$objdir\"\n    func_to_tool_file \"$output_objdir/\"\n    tool_output_objdir=$func_to_tool_file_result\n    # Create the object directory.\n    func_mkdir_p \"$output_objdir\"\n\n    # Determine the type of output\n    case $output in\n    \"\")\n      func_fatal_help \"you must specify an output file\"\n      ;;\n    *.$libext) linkmode=oldlib ;;\n    *.lo | *.$objext) linkmode=obj ;;\n    *.la) linkmode=lib ;;\n    *) linkmode=prog ;; # Anything else should be a program.\n    esac\n\n    specialdeplibs=\n\n    libs=\n    # Find all interdependent deplibs by searching for libraries\n    # that are linked more than once (e.g. -la -lb -la)\n    for deplib in $deplibs; do\n      if $opt_preserve_dup_deps ; then\n\tcase \"$libs \" in\n\t*\" $deplib \"*) func_append specialdeplibs \" $deplib\" ;;\n\tesac\n      fi\n      func_append libs \" $deplib\"\n    done\n\n    if test \"$linkmode\" = lib; then\n      libs=\"$predeps $libs $compiler_lib_search_path $postdeps\"\n\n      # Compute libraries that are listed more than once in $predeps\n      # $postdeps and mark them as special (i.e., whose duplicates are\n      # not to be eliminated).\n      pre_post_deps=\n      if $opt_duplicate_compiler_generated_deps; then\n\tfor pre_post_dep in $predeps $postdeps; do\n\t  case \"$pre_post_deps \" in\n\t  *\" $pre_post_dep \"*) func_append specialdeplibs \" $pre_post_deps\" ;;\n\t  esac\n\t  func_append pre_post_deps \" $pre_post_dep\"\n\tdone\n      fi\n      pre_post_deps=\n    fi\n\n    deplibs=\n    newdependency_libs=\n    newlib_search_path=\n    need_relink=no # whether we're linking any uninstalled libtool libraries\n    notinst_deplibs= # not-installed libtool libraries\n    notinst_path= # paths that contain not-installed libtool libraries\n\n    case $linkmode in\n    lib)\n\tpasses=\"conv dlpreopen link\"\n\tfor file in $dlfiles $dlprefiles; do\n\t  case $file in\n\t  *.la) ;;\n\t  *)\n\t    func_fatal_help \"libraries can \\`-dlopen' only libtool libraries: $file\"\n\t    ;;\n\t  esac\n\tdone\n\t;;\n    prog)\n\tcompile_deplibs=\n\tfinalize_deplibs=\n\talldeplibs=no\n\tnewdlfiles=\n\tnewdlprefiles=\n\tpasses=\"conv scan dlopen dlpreopen link\"\n\t;;\n    *)  passes=\"conv\"\n\t;;\n    esac\n\n    for pass in $passes; do\n      # The preopen pass in lib mode reverses $deplibs; put it back here\n      # so that -L comes before libs that need it for instance...\n      if test \"$linkmode,$pass\" = \"lib,link\"; then\n\t## FIXME: Find the place where the list is rebuilt in the wrong\n\t##        order, and fix it there properly\n        tmp_deplibs=\n\tfor deplib in $deplibs; do\n\t  tmp_deplibs=\"$deplib $tmp_deplibs\"\n\tdone\n\tdeplibs=\"$tmp_deplibs\"\n      fi\n\n      if test \"$linkmode,$pass\" = \"lib,link\" ||\n\t test \"$linkmode,$pass\" = \"prog,scan\"; then\n\tlibs=\"$deplibs\"\n\tdeplibs=\n      fi\n      if test \"$linkmode\" = prog; then\n\tcase $pass in\n\tdlopen) libs=\"$dlfiles\" ;;\n\tdlpreopen) libs=\"$dlprefiles\" ;;\n\tlink)\n\t  libs=\"$deplibs %DEPLIBS%\"\n\t  test \"X$link_all_deplibs\" != Xno && libs=\"$libs $dependency_libs\"\n\t  ;;\n\tesac\n      fi\n      if test \"$linkmode,$pass\" = \"lib,dlpreopen\"; then\n\t# Collect and forward deplibs of preopened libtool libs\n\tfor lib in $dlprefiles; do\n\t  # Ignore non-libtool-libs\n\t  dependency_libs=\n\t  func_resolve_sysroot \"$lib\"\n\t  case $lib in\n\t  *.la)\tfunc_source \"$func_resolve_sysroot_result\" ;;\n\t  esac\n\n\t  # Collect preopened libtool deplibs, except any this library\n\t  # has declared as weak libs\n\t  for deplib in $dependency_libs; do\n\t    func_basename \"$deplib\"\n            deplib_base=$func_basename_result\n\t    case \" $weak_libs \" in\n\t    *\" $deplib_base \"*) ;;\n\t    *) func_append deplibs \" $deplib\" ;;\n\t    esac\n\t  done\n\tdone\n\tlibs=\"$dlprefiles\"\n      fi\n      if test \"$pass\" = dlopen; then\n\t# Collect dlpreopened libraries\n\tsave_deplibs=\"$deplibs\"\n\tdeplibs=\n      fi\n\n      for deplib in $libs; do\n\tlib=\n\tfound=no\n\tcase $deplib in\n\t-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \\\n        |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)\n\t  if test \"$linkmode,$pass\" = \"prog,link\"; then\n\t    compile_deplibs=\"$deplib $compile_deplibs\"\n\t    finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t  else\n\t    func_append compiler_flags \" $deplib\"\n\t    if test \"$linkmode\" = lib ; then\n\t\tcase \"$new_inherited_linker_flags \" in\n\t\t    *\" $deplib \"*) ;;\n\t\t    * ) func_append new_inherited_linker_flags \" $deplib\" ;;\n\t\tesac\n\t    fi\n\t  fi\n\t  continue\n\t  ;;\n\t-l*)\n\t  if test \"$linkmode\" != lib && test \"$linkmode\" != prog; then\n\t    func_warning \"\\`-l' is ignored for archives/objects\"\n\t    continue\n\t  fi\n\t  func_stripname '-l' '' \"$deplib\"\n\t  name=$func_stripname_result\n\t  if test \"$linkmode\" = lib; then\n\t    searchdirs=\"$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path\"\n\t  else\n\t    searchdirs=\"$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path\"\n\t  fi\n\t  for searchdir in $searchdirs; do\n\t    for search_ext in .la $std_shrext .so .a; do\n\t      # Search the libtool library\n\t      lib=\"$searchdir/lib${name}${search_ext}\"\n\t      if test -f \"$lib\"; then\n\t\tif test \"$search_ext\" = \".la\"; then\n\t\t  found=yes\n\t\telse\n\t\t  found=no\n\t\tfi\n\t\tbreak 2\n\t      fi\n\t    done\n\t  done\n\t  if test \"$found\" != yes; then\n\t    # deplib doesn't seem to be a libtool library\n\t    if test \"$linkmode,$pass\" = \"prog,link\"; then\n\t      compile_deplibs=\"$deplib $compile_deplibs\"\n\t      finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t    else\n\t      deplibs=\"$deplib $deplibs\"\n\t      test \"$linkmode\" = lib && newdependency_libs=\"$deplib $newdependency_libs\"\n\t    fi\n\t    continue\n\t  else # deplib is a libtool library\n\t    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,\n\t    # We need to do some special things here, and not later.\n\t    if test \"X$allow_libtool_libs_with_static_runtimes\" = \"Xyes\" ; then\n\t      case \" $predeps $postdeps \" in\n\t      *\" $deplib \"*)\n\t\tif func_lalib_p \"$lib\"; then\n\t\t  library_names=\n\t\t  old_library=\n\t\t  func_source \"$lib\"\n\t\t  for l in $old_library $library_names; do\n\t\t    ll=\"$l\"\n\t\t  done\n\t\t  if test \"X$ll\" = \"X$old_library\" ; then # only static version available\n\t\t    found=no\n\t\t    func_dirname \"$lib\" \"\" \".\"\n\t\t    ladir=\"$func_dirname_result\"\n\t\t    lib=$ladir/$old_library\n\t\t    if test \"$linkmode,$pass\" = \"prog,link\"; then\n\t\t      compile_deplibs=\"$deplib $compile_deplibs\"\n\t\t      finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t\t    else\n\t\t      deplibs=\"$deplib $deplibs\"\n\t\t      test \"$linkmode\" = lib && newdependency_libs=\"$deplib $newdependency_libs\"\n\t\t    fi\n\t\t    continue\n\t\t  fi\n\t\tfi\n\t\t;;\n\t      *) ;;\n\t      esac\n\t    fi\n\t  fi\n\t  ;; # -l\n\t*.ltframework)\n\t  if test \"$linkmode,$pass\" = \"prog,link\"; then\n\t    compile_deplibs=\"$deplib $compile_deplibs\"\n\t    finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t  else\n\t    deplibs=\"$deplib $deplibs\"\n\t    if test \"$linkmode\" = lib ; then\n\t\tcase \"$new_inherited_linker_flags \" in\n\t\t    *\" $deplib \"*) ;;\n\t\t    * ) func_append new_inherited_linker_flags \" $deplib\" ;;\n\t\tesac\n\t    fi\n\t  fi\n\t  continue\n\t  ;;\n\t-L*)\n\t  case $linkmode in\n\t  lib)\n\t    deplibs=\"$deplib $deplibs\"\n\t    test \"$pass\" = conv && continue\n\t    newdependency_libs=\"$deplib $newdependency_libs\"\n\t    func_stripname '-L' '' \"$deplib\"\n\t    func_resolve_sysroot \"$func_stripname_result\"\n\t    func_append newlib_search_path \" $func_resolve_sysroot_result\"\n\t    ;;\n\t  prog)\n\t    if test \"$pass\" = conv; then\n\t      deplibs=\"$deplib $deplibs\"\n\t      continue\n\t    fi\n\t    if test \"$pass\" = scan; then\n\t      deplibs=\"$deplib $deplibs\"\n\t    else\n\t      compile_deplibs=\"$deplib $compile_deplibs\"\n\t      finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t    fi\n\t    func_stripname '-L' '' \"$deplib\"\n\t    func_resolve_sysroot \"$func_stripname_result\"\n\t    func_append newlib_search_path \" $func_resolve_sysroot_result\"\n\t    ;;\n\t  *)\n\t    func_warning \"\\`-L' is ignored for archives/objects\"\n\t    ;;\n\t  esac # linkmode\n\t  continue\n\t  ;; # -L\n\t-R*)\n\t  if test \"$pass\" = link; then\n\t    func_stripname '-R' '' \"$deplib\"\n\t    func_resolve_sysroot \"$func_stripname_result\"\n\t    dir=$func_resolve_sysroot_result\n\t    # Make sure the xrpath contains only unique directories.\n\t    case \"$xrpath \" in\n\t    *\" $dir \"*) ;;\n\t    *) func_append xrpath \" $dir\" ;;\n\t    esac\n\t  fi\n\t  deplibs=\"$deplib $deplibs\"\n\t  continue\n\t  ;;\n\t*.la)\n\t  func_resolve_sysroot \"$deplib\"\n\t  lib=$func_resolve_sysroot_result\n\t  ;;\n\t*.$libext)\n\t  if test \"$pass\" = conv; then\n\t    deplibs=\"$deplib $deplibs\"\n\t    continue\n\t  fi\n\t  case $linkmode in\n\t  lib)\n\t    # Linking convenience modules into shared libraries is allowed,\n\t    # but linking other static libraries is non-portable.\n\t    case \" $dlpreconveniencelibs \" in\n\t    *\" $deplib \"*) ;;\n\t    *)\n\t      valid_a_lib=no\n\t      case $deplibs_check_method in\n\t\tmatch_pattern*)\n\t\t  set dummy $deplibs_check_method; shift\n\t\t  match_pattern_regex=`expr \"$deplibs_check_method\" : \"$1 \\(.*\\)\"`\n\t\t  if eval \"\\$ECHO \\\"$deplib\\\"\" 2>/dev/null | $SED 10q \\\n\t\t    | $EGREP \"$match_pattern_regex\" > /dev/null; then\n\t\t    valid_a_lib=yes\n\t\t  fi\n\t\t;;\n\t\tpass_all)\n\t\t  valid_a_lib=yes\n\t\t;;\n\t      esac\n\t      if test \"$valid_a_lib\" != yes; then\n\t\techo\n\t\t$ECHO \"*** Warning: Trying to link with static lib archive $deplib.\"\n\t\techo \"*** I have the capability to make that library automatically link in when\"\n\t\techo \"*** you link to this library.  But I can only do this if you have a\"\n\t\techo \"*** shared version of the library, which you do not appear to have\"\n\t\techo \"*** because the file extensions .$libext of this argument makes me believe\"\n\t\techo \"*** that it is just a static archive that I should not use here.\"\n\t      else\n\t\techo\n\t\t$ECHO \"*** Warning: Linking the shared library $output against the\"\n\t\t$ECHO \"*** static library $deplib is not portable!\"\n\t\tdeplibs=\"$deplib $deplibs\"\n\t      fi\n\t      ;;\n\t    esac\n\t    continue\n\t    ;;\n\t  prog)\n\t    if test \"$pass\" != link; then\n\t      deplibs=\"$deplib $deplibs\"\n\t    else\n\t      compile_deplibs=\"$deplib $compile_deplibs\"\n\t      finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t    fi\n\t    continue\n\t    ;;\n\t  esac # linkmode\n\t  ;; # *.$libext\n\t*.lo | *.$objext)\n\t  if test \"$pass\" = conv; then\n\t    deplibs=\"$deplib $deplibs\"\n\t  elif test \"$linkmode\" = prog; then\n\t    if test \"$pass\" = dlpreopen || test \"$dlopen_support\" != yes || test \"$build_libtool_libs\" = no; then\n\t      # If there is no dlopen support or we're linking statically,\n\t      # we need to preload.\n\t      func_append newdlprefiles \" $deplib\"\n\t      compile_deplibs=\"$deplib $compile_deplibs\"\n\t      finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t    else\n\t      func_append newdlfiles \" $deplib\"\n\t    fi\n\t  fi\n\t  continue\n\t  ;;\n\t%DEPLIBS%)\n\t  alldeplibs=yes\n\t  continue\n\t  ;;\n\tesac # case $deplib\n\n\tif test \"$found\" = yes || test -f \"$lib\"; then :\n\telse\n\t  func_fatal_error \"cannot find the library \\`$lib' or unhandled argument \\`$deplib'\"\n\tfi\n\n\t# Check to see that this really is a libtool archive.\n\tfunc_lalib_unsafe_p \"$lib\" \\\n\t  || func_fatal_error \"\\`$lib' is not a valid libtool archive\"\n\n\tfunc_dirname \"$lib\" \"\" \".\"\n\tladir=\"$func_dirname_result\"\n\n\tdlname=\n\tdlopen=\n\tdlpreopen=\n\tlibdir=\n\tlibrary_names=\n\told_library=\n\tinherited_linker_flags=\n\t# If the library was installed with an old release of libtool,\n\t# it will not redefine variables installed, or shouldnotlink\n\tinstalled=yes\n\tshouldnotlink=no\n\tavoidtemprpath=\n\n\n\t# Read the .la file\n\tfunc_source \"$lib\"\n\n\t# Convert \"-framework foo\" to \"foo.ltframework\"\n\tif test -n \"$inherited_linker_flags\"; then\n\t  tmp_inherited_linker_flags=`$ECHO \"$inherited_linker_flags\" | $SED 's/-framework \\([^ $]*\\)/\\1.ltframework/g'`\n\t  for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do\n\t    case \" $new_inherited_linker_flags \" in\n\t      *\" $tmp_inherited_linker_flag \"*) ;;\n\t      *) func_append new_inherited_linker_flags \" $tmp_inherited_linker_flag\";;\n\t    esac\n\t  done\n\tfi\n\tdependency_libs=`$ECHO \" $dependency_libs\" | $SED 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\tif test \"$linkmode,$pass\" = \"lib,link\" ||\n\t   test \"$linkmode,$pass\" = \"prog,scan\" ||\n\t   { test \"$linkmode\" != prog && test \"$linkmode\" != lib; }; then\n\t  test -n \"$dlopen\" && func_append dlfiles \" $dlopen\"\n\t  test -n \"$dlpreopen\" && func_append dlprefiles \" $dlpreopen\"\n\tfi\n\n\tif test \"$pass\" = conv; then\n\t  # Only check for convenience libraries\n\t  deplibs=\"$lib $deplibs\"\n\t  if test -z \"$libdir\"; then\n\t    if test -z \"$old_library\"; then\n\t      func_fatal_error \"cannot find name of link library for \\`$lib'\"\n\t    fi\n\t    # It is a libtool convenience library, so add in its objects.\n\t    func_append convenience \" $ladir/$objdir/$old_library\"\n\t    func_append old_convenience \" $ladir/$objdir/$old_library\"\n\t    tmp_libs=\n\t    for deplib in $dependency_libs; do\n\t      deplibs=\"$deplib $deplibs\"\n\t      if $opt_preserve_dup_deps ; then\n\t\tcase \"$tmp_libs \" in\n\t\t*\" $deplib \"*) func_append specialdeplibs \" $deplib\" ;;\n\t\tesac\n\t      fi\n\t      func_append tmp_libs \" $deplib\"\n\t    done\n\t  elif test \"$linkmode\" != prog && test \"$linkmode\" != lib; then\n\t    func_fatal_error \"\\`$lib' is not a convenience library\"\n\t  fi\n\t  continue\n\tfi # $pass = conv\n\n\n\t# Get the name of the library we link against.\n\tlinklib=\n\tif test -n \"$old_library\" &&\n\t   { test \"$prefer_static_libs\" = yes ||\n\t     test \"$prefer_static_libs,$installed\" = \"built,no\"; }; then\n\t  linklib=$old_library\n\telse\n\t  for l in $old_library $library_names; do\n\t    linklib=\"$l\"\n\t  done\n\tfi\n\tif test -z \"$linklib\"; then\n\t  func_fatal_error \"cannot find name of link library for \\`$lib'\"\n\tfi\n\n\t# This library was specified with -dlopen.\n\tif test \"$pass\" = dlopen; then\n\t  if test -z \"$libdir\"; then\n\t    func_fatal_error \"cannot -dlopen a convenience library: \\`$lib'\"\n\t  fi\n\t  if test -z \"$dlname\" ||\n\t     test \"$dlopen_support\" != yes ||\n\t     test \"$build_libtool_libs\" = no; then\n\t    # If there is no dlname, no dlopen support or we're linking\n\t    # statically, we need to preload.  We also need to preload any\n\t    # dependent libraries so libltdl's deplib preloader doesn't\n\t    # bomb out in the load deplibs phase.\n\t    func_append dlprefiles \" $lib $dependency_libs\"\n\t  else\n\t    func_append newdlfiles \" $lib\"\n\t  fi\n\t  continue\n\tfi # $pass = dlopen\n\n\t# We need an absolute path.\n\tcase $ladir in\n\t[\\\\/]* | [A-Za-z]:[\\\\/]*) abs_ladir=\"$ladir\" ;;\n\t*)\n\t  abs_ladir=`cd \"$ladir\" && pwd`\n\t  if test -z \"$abs_ladir\"; then\n\t    func_warning \"cannot determine absolute directory name of \\`$ladir'\"\n\t    func_warning \"passing it literally to the linker, although it might fail\"\n\t    abs_ladir=\"$ladir\"\n\t  fi\n\t  ;;\n\tesac\n\tfunc_basename \"$lib\"\n\tlaname=\"$func_basename_result\"\n\n\t# Find the relevant object directory and library name.\n\tif test \"X$installed\" = Xyes; then\n\t  if test ! -f \"$lt_sysroot$libdir/$linklib\" && test -f \"$abs_ladir/$linklib\"; then\n\t    func_warning \"library \\`$lib' was moved.\"\n\t    dir=\"$ladir\"\n\t    absdir=\"$abs_ladir\"\n\t    libdir=\"$abs_ladir\"\n\t  else\n\t    dir=\"$lt_sysroot$libdir\"\n\t    absdir=\"$lt_sysroot$libdir\"\n\t  fi\n\t  test \"X$hardcode_automatic\" = Xyes && avoidtemprpath=yes\n\telse\n\t  if test ! -f \"$ladir/$objdir/$linklib\" && test -f \"$abs_ladir/$linklib\"; then\n\t    dir=\"$ladir\"\n\t    absdir=\"$abs_ladir\"\n\t    # Remove this search path later\n\t    func_append notinst_path \" $abs_ladir\"\n\t  else\n\t    dir=\"$ladir/$objdir\"\n\t    absdir=\"$abs_ladir/$objdir\"\n\t    # Remove this search path later\n\t    func_append notinst_path \" $abs_ladir\"\n\t  fi\n\tfi # $installed = yes\n\tfunc_stripname 'lib' '.la' \"$laname\"\n\tname=$func_stripname_result\n\n\t# This library was specified with -dlpreopen.\n\tif test \"$pass\" = dlpreopen; then\n\t  if test -z \"$libdir\" && test \"$linkmode\" = prog; then\n\t    func_fatal_error \"only libraries may -dlpreopen a convenience library: \\`$lib'\"\n\t  fi\n\t  case \"$host\" in\n\t    # special handling for platforms with PE-DLLs.\n\t    *cygwin* | *mingw* | *cegcc* )\n\t      # Linker will automatically link against shared library if both\n\t      # static and shared are present.  Therefore, ensure we extract\n\t      # symbols from the import library if a shared library is present\n\t      # (otherwise, the dlopen module name will be incorrect).  We do\n\t      # this by putting the import library name into $newdlprefiles.\n\t      # We recover the dlopen module name by 'saving' the la file\n\t      # name in a special purpose variable, and (later) extracting the\n\t      # dlname from the la file.\n\t      if test -n \"$dlname\"; then\n\t        func_tr_sh \"$dir/$linklib\"\n\t        eval \"libfile_$func_tr_sh_result=\\$abs_ladir/\\$laname\"\n\t        func_append newdlprefiles \" $dir/$linklib\"\n\t      else\n\t        func_append newdlprefiles \" $dir/$old_library\"\n\t        # Keep a list of preopened convenience libraries to check\n\t        # that they are being used correctly in the link pass.\n\t        test -z \"$libdir\" && \\\n\t          func_append dlpreconveniencelibs \" $dir/$old_library\"\n\t      fi\n\t    ;;\n\t    * )\n\t      # Prefer using a static library (so that no silly _DYNAMIC symbols\n\t      # are required to link).\n\t      if test -n \"$old_library\"; then\n\t        func_append newdlprefiles \" $dir/$old_library\"\n\t        # Keep a list of preopened convenience libraries to check\n\t        # that they are being used correctly in the link pass.\n\t        test -z \"$libdir\" && \\\n\t          func_append dlpreconveniencelibs \" $dir/$old_library\"\n\t      # Otherwise, use the dlname, so that lt_dlopen finds it.\n\t      elif test -n \"$dlname\"; then\n\t        func_append newdlprefiles \" $dir/$dlname\"\n\t      else\n\t        func_append newdlprefiles \" $dir/$linklib\"\n\t      fi\n\t    ;;\n\t  esac\n\tfi # $pass = dlpreopen\n\n\tif test -z \"$libdir\"; then\n\t  # Link the convenience library\n\t  if test \"$linkmode\" = lib; then\n\t    deplibs=\"$dir/$old_library $deplibs\"\n\t  elif test \"$linkmode,$pass\" = \"prog,link\"; then\n\t    compile_deplibs=\"$dir/$old_library $compile_deplibs\"\n\t    finalize_deplibs=\"$dir/$old_library $finalize_deplibs\"\n\t  else\n\t    deplibs=\"$lib $deplibs\" # used for prog,scan pass\n\t  fi\n\t  continue\n\tfi\n\n\n\tif test \"$linkmode\" = prog && test \"$pass\" != link; then\n\t  func_append newlib_search_path \" $ladir\"\n\t  deplibs=\"$lib $deplibs\"\n\n\t  linkalldeplibs=no\n\t  if test \"$link_all_deplibs\" != no || test -z \"$library_names\" ||\n\t     test \"$build_libtool_libs\" = no; then\n\t    linkalldeplibs=yes\n\t  fi\n\n\t  tmp_libs=\n\t  for deplib in $dependency_libs; do\n\t    case $deplib in\n\t    -L*) func_stripname '-L' '' \"$deplib\"\n\t         func_resolve_sysroot \"$func_stripname_result\"\n\t         func_append newlib_search_path \" $func_resolve_sysroot_result\"\n\t\t ;;\n\t    esac\n\t    # Need to link against all dependency_libs?\n\t    if test \"$linkalldeplibs\" = yes; then\n\t      deplibs=\"$deplib $deplibs\"\n\t    else\n\t      # Need to hardcode shared library paths\n\t      # or/and link against static libraries\n\t      newdependency_libs=\"$deplib $newdependency_libs\"\n\t    fi\n\t    if $opt_preserve_dup_deps ; then\n\t      case \"$tmp_libs \" in\n\t      *\" $deplib \"*) func_append specialdeplibs \" $deplib\" ;;\n\t      esac\n\t    fi\n\t    func_append tmp_libs \" $deplib\"\n\t  done # for deplib\n\t  continue\n\tfi # $linkmode = prog...\n\n\tif test \"$linkmode,$pass\" = \"prog,link\"; then\n\t  if test -n \"$library_names\" &&\n\t     { { test \"$prefer_static_libs\" = no ||\n\t         test \"$prefer_static_libs,$installed\" = \"built,yes\"; } ||\n\t       test -z \"$old_library\"; }; then\n\t    # We need to hardcode the library path\n\t    if test -n \"$shlibpath_var\" && test -z \"$avoidtemprpath\" ; then\n\t      # Make sure the rpath contains only unique directories.\n\t      case \"$temp_rpath:\" in\n\t      *\"$absdir:\"*) ;;\n\t      *) func_append temp_rpath \"$absdir:\" ;;\n\t      esac\n\t    fi\n\n\t    # Hardcode the library path.\n\t    # Skip directories that are in the system default run-time\n\t    # search path.\n\t    case \" $sys_lib_dlsearch_path \" in\n\t    *\" $absdir \"*) ;;\n\t    *)\n\t      case \"$compile_rpath \" in\n\t      *\" $absdir \"*) ;;\n\t      *) func_append compile_rpath \" $absdir\" ;;\n\t      esac\n\t      ;;\n\t    esac\n\t    case \" $sys_lib_dlsearch_path \" in\n\t    *\" $libdir \"*) ;;\n\t    *)\n\t      case \"$finalize_rpath \" in\n\t      *\" $libdir \"*) ;;\n\t      *) func_append finalize_rpath \" $libdir\" ;;\n\t      esac\n\t      ;;\n\t    esac\n\t  fi # $linkmode,$pass = prog,link...\n\n\t  if test \"$alldeplibs\" = yes &&\n\t     { test \"$deplibs_check_method\" = pass_all ||\n\t       { test \"$build_libtool_libs\" = yes &&\n\t\t test -n \"$library_names\"; }; }; then\n\t    # We only need to search for static libraries\n\t    continue\n\t  fi\n\tfi\n\n\tlink_static=no # Whether the deplib will be linked statically\n\tuse_static_libs=$prefer_static_libs\n\tif test \"$use_static_libs\" = built && test \"$installed\" = yes; then\n\t  use_static_libs=no\n\tfi\n\tif test -n \"$library_names\" &&\n\t   { test \"$use_static_libs\" = no || test -z \"$old_library\"; }; then\n\t  case $host in\n\t  *cygwin* | *mingw* | *cegcc*)\n\t      # No point in relinking DLLs because paths are not encoded\n\t      func_append notinst_deplibs \" $lib\"\n\t      need_relink=no\n\t    ;;\n\t  *)\n\t    if test \"$installed\" = no; then\n\t      func_append notinst_deplibs \" $lib\"\n\t      need_relink=yes\n\t    fi\n\t    ;;\n\t  esac\n\t  # This is a shared library\n\n\t  # Warn about portability, can't link against -module's on some\n\t  # systems (darwin).  Don't bleat about dlopened modules though!\n\t  dlopenmodule=\"\"\n\t  for dlpremoduletest in $dlprefiles; do\n\t    if test \"X$dlpremoduletest\" = \"X$lib\"; then\n\t      dlopenmodule=\"$dlpremoduletest\"\n\t      break\n\t    fi\n\t  done\n\t  if test -z \"$dlopenmodule\" && test \"$shouldnotlink\" = yes && test \"$pass\" = link; then\n\t    echo\n\t    if test \"$linkmode\" = prog; then\n\t      $ECHO \"*** Warning: Linking the executable $output against the loadable module\"\n\t    else\n\t      $ECHO \"*** Warning: Linking the shared library $output against the loadable module\"\n\t    fi\n\t    $ECHO \"*** $linklib is not portable!\"\n\t  fi\n\t  if test \"$linkmode\" = lib &&\n\t     test \"$hardcode_into_libs\" = yes; then\n\t    # Hardcode the library path.\n\t    # Skip directories that are in the system default run-time\n\t    # search path.\n\t    case \" $sys_lib_dlsearch_path \" in\n\t    *\" $absdir \"*) ;;\n\t    *)\n\t      case \"$compile_rpath \" in\n\t      *\" $absdir \"*) ;;\n\t      *) func_append compile_rpath \" $absdir\" ;;\n\t      esac\n\t      ;;\n\t    esac\n\t    case \" $sys_lib_dlsearch_path \" in\n\t    *\" $libdir \"*) ;;\n\t    *)\n\t      case \"$finalize_rpath \" in\n\t      *\" $libdir \"*) ;;\n\t      *) func_append finalize_rpath \" $libdir\" ;;\n\t      esac\n\t      ;;\n\t    esac\n\t  fi\n\n\t  if test -n \"$old_archive_from_expsyms_cmds\"; then\n\t    # figure out the soname\n\t    set dummy $library_names\n\t    shift\n\t    realname=\"$1\"\n\t    shift\n\t    libname=`eval \"\\\\$ECHO \\\"$libname_spec\\\"\"`\n\t    # use dlname if we got it. it's perfectly good, no?\n\t    if test -n \"$dlname\"; then\n\t      soname=\"$dlname\"\n\t    elif test -n \"$soname_spec\"; then\n\t      # bleh windows\n\t      case $host in\n\t      *cygwin* | mingw* | *cegcc*)\n\t        func_arith $current - $age\n\t\tmajor=$func_arith_result\n\t\tversuffix=\"-$major\"\n\t\t;;\n\t      esac\n\t      eval soname=\\\"$soname_spec\\\"\n\t    else\n\t      soname=\"$realname\"\n\t    fi\n\n\t    # Make a new name for the extract_expsyms_cmds to use\n\t    soroot=\"$soname\"\n\t    func_basename \"$soroot\"\n\t    soname=\"$func_basename_result\"\n\t    func_stripname 'lib' '.dll' \"$soname\"\n\t    newlib=libimp-$func_stripname_result.a\n\n\t    # If the library has no export list, then create one now\n\t    if test -f \"$output_objdir/$soname-def\"; then :\n\t    else\n\t      func_verbose \"extracting exported symbol list from \\`$soname'\"\n\t      func_execute_cmds \"$extract_expsyms_cmds\" 'exit $?'\n\t    fi\n\n\t    # Create $newlib\n\t    if test -f \"$output_objdir/$newlib\"; then :; else\n\t      func_verbose \"generating import library for \\`$soname'\"\n\t      func_execute_cmds \"$old_archive_from_expsyms_cmds\" 'exit $?'\n\t    fi\n\t    # make sure the library variables are pointing to the new library\n\t    dir=$output_objdir\n\t    linklib=$newlib\n\t  fi # test -n \"$old_archive_from_expsyms_cmds\"\n\n\t  if test \"$linkmode\" = prog || test \"$opt_mode\" != relink; then\n\t    add_shlibpath=\n\t    add_dir=\n\t    add=\n\t    lib_linked=yes\n\t    case $hardcode_action in\n\t    immediate | unsupported)\n\t      if test \"$hardcode_direct\" = no; then\n\t\tadd=\"$dir/$linklib\"\n\t\tcase $host in\n\t\t  *-*-sco3.2v5.0.[024]*) add_dir=\"-L$dir\" ;;\n\t\t  *-*-sysv4*uw2*) add_dir=\"-L$dir\" ;;\n\t\t  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \\\n\t\t    *-*-unixware7*) add_dir=\"-L$dir\" ;;\n\t\t  *-*-darwin* )\n\t\t    # if the lib is a (non-dlopened) module then we can not\n\t\t    # link against it, someone is ignoring the earlier warnings\n\t\t    if /usr/bin/file -L $add 2> /dev/null |\n\t\t\t $GREP \": [^:]* bundle\" >/dev/null ; then\n\t\t      if test \"X$dlopenmodule\" != \"X$lib\"; then\n\t\t\t$ECHO \"*** Warning: lib $linklib is a module, not a shared library\"\n\t\t\tif test -z \"$old_library\" ; then\n\t\t\t  echo\n\t\t\t  echo \"*** And there doesn't seem to be a static archive available\"\n\t\t\t  echo \"*** The link will probably fail, sorry\"\n\t\t\telse\n\t\t\t  add=\"$dir/$old_library\"\n\t\t\tfi\n\t\t      elif test -n \"$old_library\"; then\n\t\t\tadd=\"$dir/$old_library\"\n\t\t      fi\n\t\t    fi\n\t\tesac\n\t      elif test \"$hardcode_minus_L\" = no; then\n\t\tcase $host in\n\t\t*-*-sunos*) add_shlibpath=\"$dir\" ;;\n\t\tesac\n\t\tadd_dir=\"-L$dir\"\n\t\tadd=\"-l$name\"\n\t      elif test \"$hardcode_shlibpath_var\" = no; then\n\t\tadd_shlibpath=\"$dir\"\n\t\tadd=\"-l$name\"\n\t      else\n\t\tlib_linked=no\n\t      fi\n\t      ;;\n\t    relink)\n\t      if test \"$hardcode_direct\" = yes &&\n\t         test \"$hardcode_direct_absolute\" = no; then\n\t\tadd=\"$dir/$linklib\"\n\t      elif test \"$hardcode_minus_L\" = yes; then\n\t\tadd_dir=\"-L$absdir\"\n\t\t# Try looking first in the location we're being installed to.\n\t\tif test -n \"$inst_prefix_dir\"; then\n\t\t  case $libdir in\n\t\t    [\\\\/]*)\n\t\t      func_append add_dir \" -L$inst_prefix_dir$libdir\"\n\t\t      ;;\n\t\t  esac\n\t\tfi\n\t\tadd=\"-l$name\"\n\t      elif test \"$hardcode_shlibpath_var\" = yes; then\n\t\tadd_shlibpath=\"$dir\"\n\t\tadd=\"-l$name\"\n\t      else\n\t\tlib_linked=no\n\t      fi\n\t      ;;\n\t    *) lib_linked=no ;;\n\t    esac\n\n\t    if test \"$lib_linked\" != yes; then\n\t      func_fatal_configuration \"unsupported hardcode properties\"\n\t    fi\n\n\t    if test -n \"$add_shlibpath\"; then\n\t      case :$compile_shlibpath: in\n\t      *\":$add_shlibpath:\"*) ;;\n\t      *) func_append compile_shlibpath \"$add_shlibpath:\" ;;\n\t      esac\n\t    fi\n\t    if test \"$linkmode\" = prog; then\n\t      test -n \"$add_dir\" && compile_deplibs=\"$add_dir $compile_deplibs\"\n\t      test -n \"$add\" && compile_deplibs=\"$add $compile_deplibs\"\n\t    else\n\t      test -n \"$add_dir\" && deplibs=\"$add_dir $deplibs\"\n\t      test -n \"$add\" && deplibs=\"$add $deplibs\"\n\t      if test \"$hardcode_direct\" != yes &&\n\t\t test \"$hardcode_minus_L\" != yes &&\n\t\t test \"$hardcode_shlibpath_var\" = yes; then\n\t\tcase :$finalize_shlibpath: in\n\t\t*\":$libdir:\"*) ;;\n\t\t*) func_append finalize_shlibpath \"$libdir:\" ;;\n\t\tesac\n\t      fi\n\t    fi\n\t  fi\n\n\t  if test \"$linkmode\" = prog || test \"$opt_mode\" = relink; then\n\t    add_shlibpath=\n\t    add_dir=\n\t    add=\n\t    # Finalize command for both is simple: just hardcode it.\n\t    if test \"$hardcode_direct\" = yes &&\n\t       test \"$hardcode_direct_absolute\" = no; then\n\t      add=\"$libdir/$linklib\"\n\t    elif test \"$hardcode_minus_L\" = yes; then\n\t      add_dir=\"-L$libdir\"\n\t      add=\"-l$name\"\n\t    elif test \"$hardcode_shlibpath_var\" = yes; then\n\t      case :$finalize_shlibpath: in\n\t      *\":$libdir:\"*) ;;\n\t      *) func_append finalize_shlibpath \"$libdir:\" ;;\n\t      esac\n\t      add=\"-l$name\"\n\t    elif test \"$hardcode_automatic\" = yes; then\n\t      if test -n \"$inst_prefix_dir\" &&\n\t\t test -f \"$inst_prefix_dir$libdir/$linklib\" ; then\n\t\tadd=\"$inst_prefix_dir$libdir/$linklib\"\n\t      else\n\t\tadd=\"$libdir/$linklib\"\n\t      fi\n\t    else\n\t      # We cannot seem to hardcode it, guess we'll fake it.\n\t      add_dir=\"-L$libdir\"\n\t      # Try looking first in the location we're being installed to.\n\t      if test -n \"$inst_prefix_dir\"; then\n\t\tcase $libdir in\n\t\t  [\\\\/]*)\n\t\t    func_append add_dir \" -L$inst_prefix_dir$libdir\"\n\t\t    ;;\n\t\tesac\n\t      fi\n\t      add=\"-l$name\"\n\t    fi\n\n\t    if test \"$linkmode\" = prog; then\n\t      test -n \"$add_dir\" && finalize_deplibs=\"$add_dir $finalize_deplibs\"\n\t      test -n \"$add\" && finalize_deplibs=\"$add $finalize_deplibs\"\n\t    else\n\t      test -n \"$add_dir\" && deplibs=\"$add_dir $deplibs\"\n\t      test -n \"$add\" && deplibs=\"$add $deplibs\"\n\t    fi\n\t  fi\n\telif test \"$linkmode\" = prog; then\n\t  # Here we assume that one of hardcode_direct or hardcode_minus_L\n\t  # is not unsupported.  This is valid on all known static and\n\t  # shared platforms.\n\t  if test \"$hardcode_direct\" != unsupported; then\n\t    test -n \"$old_library\" && linklib=\"$old_library\"\n\t    compile_deplibs=\"$dir/$linklib $compile_deplibs\"\n\t    finalize_deplibs=\"$dir/$linklib $finalize_deplibs\"\n\t  else\n\t    compile_deplibs=\"-l$name -L$dir $compile_deplibs\"\n\t    finalize_deplibs=\"-l$name -L$dir $finalize_deplibs\"\n\t  fi\n\telif test \"$build_libtool_libs\" = yes; then\n\t  # Not a shared library\n\t  if test \"$deplibs_check_method\" != pass_all; then\n\t    # We're trying link a shared library against a static one\n\t    # but the system doesn't support it.\n\n\t    # Just print a warning and add the library to dependency_libs so\n\t    # that the program can be linked against the static library.\n\t    echo\n\t    $ECHO \"*** Warning: This system can not link to static lib archive $lib.\"\n\t    echo \"*** I have the capability to make that library automatically link in when\"\n\t    echo \"*** you link to this library.  But I can only do this if you have a\"\n\t    echo \"*** shared version of the library, which you do not appear to have.\"\n\t    if test \"$module\" = yes; then\n\t      echo \"*** But as you try to build a module library, libtool will still create \"\n\t      echo \"*** a static module, that should work as long as the dlopening application\"\n\t      echo \"*** is linked with the -dlopen flag to resolve symbols at runtime.\"\n\t      if test -z \"$global_symbol_pipe\"; then\n\t\techo\n\t\techo \"*** However, this would only work if libtool was able to extract symbol\"\n\t\techo \"*** lists from a program, using \\`nm' or equivalent, but libtool could\"\n\t\techo \"*** not find such a program.  So, this module is probably useless.\"\n\t\techo \"*** \\`nm' from GNU binutils and a full rebuild may help.\"\n\t      fi\n\t      if test \"$build_old_libs\" = no; then\n\t\tbuild_libtool_libs=module\n\t\tbuild_old_libs=yes\n\t      else\n\t\tbuild_libtool_libs=no\n\t      fi\n\t    fi\n\t  else\n\t    deplibs=\"$dir/$old_library $deplibs\"\n\t    link_static=yes\n\t  fi\n\tfi # link shared/static library?\n\n\tif test \"$linkmode\" = lib; then\n\t  if test -n \"$dependency_libs\" &&\n\t     { test \"$hardcode_into_libs\" != yes ||\n\t       test \"$build_old_libs\" = yes ||\n\t       test \"$link_static\" = yes; }; then\n\t    # Extract -R from dependency_libs\n\t    temp_deplibs=\n\t    for libdir in $dependency_libs; do\n\t      case $libdir in\n\t      -R*) func_stripname '-R' '' \"$libdir\"\n\t           temp_xrpath=$func_stripname_result\n\t\t   case \" $xrpath \" in\n\t\t   *\" $temp_xrpath \"*) ;;\n\t\t   *) func_append xrpath \" $temp_xrpath\";;\n\t\t   esac;;\n\t      *) func_append temp_deplibs \" $libdir\";;\n\t      esac\n\t    done\n\t    dependency_libs=\"$temp_deplibs\"\n\t  fi\n\n\t  func_append newlib_search_path \" $absdir\"\n\t  # Link against this library\n\t  test \"$link_static\" = no && newdependency_libs=\"$abs_ladir/$laname $newdependency_libs\"\n\t  # ... and its dependency_libs\n\t  tmp_libs=\n\t  for deplib in $dependency_libs; do\n\t    newdependency_libs=\"$deplib $newdependency_libs\"\n\t    case $deplib in\n              -L*) func_stripname '-L' '' \"$deplib\"\n                   func_resolve_sysroot \"$func_stripname_result\";;\n              *) func_resolve_sysroot \"$deplib\" ;;\n            esac\n\t    if $opt_preserve_dup_deps ; then\n\t      case \"$tmp_libs \" in\n\t      *\" $func_resolve_sysroot_result \"*)\n                func_append specialdeplibs \" $func_resolve_sysroot_result\" ;;\n\t      esac\n\t    fi\n\t    func_append tmp_libs \" $func_resolve_sysroot_result\"\n\t  done\n\n\t  if test \"$link_all_deplibs\" != no; then\n\t    # Add the search paths of all dependency libraries\n\t    for deplib in $dependency_libs; do\n\t      path=\n\t      case $deplib in\n\t      -L*) path=\"$deplib\" ;;\n\t      *.la)\n\t        func_resolve_sysroot \"$deplib\"\n\t        deplib=$func_resolve_sysroot_result\n\t        func_dirname \"$deplib\" \"\" \".\"\n\t\tdir=$func_dirname_result\n\t\t# We need an absolute path.\n\t\tcase $dir in\n\t\t[\\\\/]* | [A-Za-z]:[\\\\/]*) absdir=\"$dir\" ;;\n\t\t*)\n\t\t  absdir=`cd \"$dir\" && pwd`\n\t\t  if test -z \"$absdir\"; then\n\t\t    func_warning \"cannot determine absolute directory name of \\`$dir'\"\n\t\t    absdir=\"$dir\"\n\t\t  fi\n\t\t  ;;\n\t\tesac\n\t\tif $GREP \"^installed=no\" $deplib > /dev/null; then\n\t\tcase $host in\n\t\t*-*-darwin*)\n\t\t  depdepl=\n\t\t  eval deplibrary_names=`${SED} -n -e 's/^library_names=\\(.*\\)$/\\1/p' $deplib`\n\t\t  if test -n \"$deplibrary_names\" ; then\n\t\t    for tmp in $deplibrary_names ; do\n\t\t      depdepl=$tmp\n\t\t    done\n\t\t    if test -f \"$absdir/$objdir/$depdepl\" ; then\n\t\t      depdepl=\"$absdir/$objdir/$depdepl\"\n\t\t      darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`\n                      if test -z \"$darwin_install_name\"; then\n                          darwin_install_name=`${OTOOL64} -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`\n                      fi\n\t\t      func_append compiler_flags \" ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}\"\n\t\t      func_append linker_flags \" -dylib_file ${darwin_install_name}:${depdepl}\"\n\t\t      path=\n\t\t    fi\n\t\t  fi\n\t\t  ;;\n\t\t*)\n\t\t  path=\"-L$absdir/$objdir\"\n\t\t  ;;\n\t\tesac\n\t\telse\n\t\t  eval libdir=`${SED} -n -e 's/^libdir=\\(.*\\)$/\\1/p' $deplib`\n\t\t  test -z \"$libdir\" && \\\n\t\t    func_fatal_error \"\\`$deplib' is not a valid libtool archive\"\n\t\t  test \"$absdir\" != \"$libdir\" && \\\n\t\t    func_warning \"\\`$deplib' seems to be moved\"\n\n\t\t  path=\"-L$absdir\"\n\t\tfi\n\t\t;;\n\t      esac\n\t      case \" $deplibs \" in\n\t      *\" $path \"*) ;;\n\t      *) deplibs=\"$path $deplibs\" ;;\n\t      esac\n\t    done\n\t  fi # link_all_deplibs != no\n\tfi # linkmode = lib\n      done # for deplib in $libs\n      if test \"$pass\" = link; then\n\tif test \"$linkmode\" = \"prog\"; then\n\t  compile_deplibs=\"$new_inherited_linker_flags $compile_deplibs\"\n\t  finalize_deplibs=\"$new_inherited_linker_flags $finalize_deplibs\"\n\telse\n\t  compiler_flags=\"$compiler_flags \"`$ECHO \" $new_inherited_linker_flags\" | $SED 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\tfi\n      fi\n      dependency_libs=\"$newdependency_libs\"\n      if test \"$pass\" = dlpreopen; then\n\t# Link the dlpreopened libraries before other libraries\n\tfor deplib in $save_deplibs; do\n\t  deplibs=\"$deplib $deplibs\"\n\tdone\n      fi\n      if test \"$pass\" != dlopen; then\n\tif test \"$pass\" != conv; then\n\t  # Make sure lib_search_path contains only unique directories.\n\t  lib_search_path=\n\t  for dir in $newlib_search_path; do\n\t    case \"$lib_search_path \" in\n\t    *\" $dir \"*) ;;\n\t    *) func_append lib_search_path \" $dir\" ;;\n\t    esac\n\t  done\n\t  newlib_search_path=\n\tfi\n\n\tif test \"$linkmode,$pass\" != \"prog,link\"; then\n\t  vars=\"deplibs\"\n\telse\n\t  vars=\"compile_deplibs finalize_deplibs\"\n\tfi\n\tfor var in $vars dependency_libs; do\n\t  # Add libraries to $var in reverse order\n\t  eval tmp_libs=\\\"\\$$var\\\"\n\t  new_libs=\n\t  for deplib in $tmp_libs; do\n\t    # FIXME: Pedantically, this is the right thing to do, so\n\t    #        that some nasty dependency loop isn't accidentally\n\t    #        broken:\n\t    #new_libs=\"$deplib $new_libs\"\n\t    # Pragmatically, this seems to cause very few problems in\n\t    # practice:\n\t    case $deplib in\n\t    -L*) new_libs=\"$deplib $new_libs\" ;;\n\t    -R*) ;;\n\t    *)\n\t      # And here is the reason: when a library appears more\n\t      # than once as an explicit dependence of a library, or\n\t      # is implicitly linked in more than once by the\n\t      # compiler, it is considered special, and multiple\n\t      # occurrences thereof are not removed.  Compare this\n\t      # with having the same library being listed as a\n\t      # dependency of multiple other libraries: in this case,\n\t      # we know (pedantically, we assume) the library does not\n\t      # need to be listed more than once, so we keep only the\n\t      # last copy.  This is not always right, but it is rare\n\t      # enough that we require users that really mean to play\n\t      # such unportable linking tricks to link the library\n\t      # using -Wl,-lname, so that libtool does not consider it\n\t      # for duplicate removal.\n\t      case \" $specialdeplibs \" in\n\t      *\" $deplib \"*) new_libs=\"$deplib $new_libs\" ;;\n\t      *)\n\t\tcase \" $new_libs \" in\n\t\t*\" $deplib \"*) ;;\n\t\t*) new_libs=\"$deplib $new_libs\" ;;\n\t\tesac\n\t\t;;\n\t      esac\n\t      ;;\n\t    esac\n\t  done\n\t  tmp_libs=\n\t  for deplib in $new_libs; do\n\t    case $deplib in\n\t    -L*)\n\t      case \" $tmp_libs \" in\n\t      *\" $deplib \"*) ;;\n\t      *) func_append tmp_libs \" $deplib\" ;;\n\t      esac\n\t      ;;\n\t    *) func_append tmp_libs \" $deplib\" ;;\n\t    esac\n\t  done\n\t  eval $var=\\\"$tmp_libs\\\"\n\tdone # for var\n      fi\n      # Last step: remove runtime libs from dependency_libs\n      # (they stay in deplibs)\n      tmp_libs=\n      for i in $dependency_libs ; do\n\tcase \" $predeps $postdeps $compiler_lib_search_path \" in\n\t*\" $i \"*)\n\t  i=\"\"\n\t  ;;\n\tesac\n\tif test -n \"$i\" ; then\n\t  func_append tmp_libs \" $i\"\n\tfi\n      done\n      dependency_libs=$tmp_libs\n    done # for pass\n    if test \"$linkmode\" = prog; then\n      dlfiles=\"$newdlfiles\"\n    fi\n    if test \"$linkmode\" = prog || test \"$linkmode\" = lib; then\n      dlprefiles=\"$newdlprefiles\"\n    fi\n\n    case $linkmode in\n    oldlib)\n      if test -n \"$dlfiles$dlprefiles\" || test \"$dlself\" != no; then\n\tfunc_warning \"\\`-dlopen' is ignored for archives\"\n      fi\n\n      case \" $deplibs\" in\n      *\\ -l* | *\\ -L*)\n\tfunc_warning \"\\`-l' and \\`-L' are ignored for archives\" ;;\n      esac\n\n      test -n \"$rpath\" && \\\n\tfunc_warning \"\\`-rpath' is ignored for archives\"\n\n      test -n \"$xrpath\" && \\\n\tfunc_warning \"\\`-R' is ignored for archives\"\n\n      test -n \"$vinfo\" && \\\n\tfunc_warning \"\\`-version-info/-version-number' is ignored for archives\"\n\n      test -n \"$release\" && \\\n\tfunc_warning \"\\`-release' is ignored for archives\"\n\n      test -n \"$export_symbols$export_symbols_regex\" && \\\n\tfunc_warning \"\\`-export-symbols' is ignored for archives\"\n\n      # Now set the variables for building old libraries.\n      build_libtool_libs=no\n      oldlibs=\"$output\"\n      func_append objs \"$old_deplibs\"\n      ;;\n\n    lib)\n      # Make sure we only generate libraries of the form `libNAME.la'.\n      case $outputname in\n      lib*)\n\tfunc_stripname 'lib' '.la' \"$outputname\"\n\tname=$func_stripname_result\n\teval shared_ext=\\\"$shrext_cmds\\\"\n\teval libname=\\\"$libname_spec\\\"\n\t;;\n      *)\n\ttest \"$module\" = no && \\\n\t  func_fatal_help \"libtool library \\`$output' must begin with \\`lib'\"\n\n\tif test \"$need_lib_prefix\" != no; then\n\t  # Add the \"lib\" prefix for modules if required\n\t  func_stripname '' '.la' \"$outputname\"\n\t  name=$func_stripname_result\n\t  eval shared_ext=\\\"$shrext_cmds\\\"\n\t  eval libname=\\\"$libname_spec\\\"\n\telse\n\t  func_stripname '' '.la' \"$outputname\"\n\t  libname=$func_stripname_result\n\tfi\n\t;;\n      esac\n\n      if test -n \"$objs\"; then\n\tif test \"$deplibs_check_method\" != pass_all; then\n\t  func_fatal_error \"cannot build libtool library \\`$output' from non-libtool objects on this host:$objs\"\n\telse\n\t  echo\n\t  $ECHO \"*** Warning: Linking the shared library $output against the non-libtool\"\n\t  $ECHO \"*** objects $objs is not portable!\"\n\t  func_append libobjs \" $objs\"\n\tfi\n      fi\n\n      test \"$dlself\" != no && \\\n\tfunc_warning \"\\`-dlopen self' is ignored for libtool libraries\"\n\n      set dummy $rpath\n      shift\n      test \"$#\" -gt 1 && \\\n\tfunc_warning \"ignoring multiple \\`-rpath's for a libtool library\"\n\n      install_libdir=\"$1\"\n\n      oldlibs=\n      if test -z \"$rpath\"; then\n\tif test \"$build_libtool_libs\" = yes; then\n\t  # Building a libtool convenience library.\n\t  # Some compilers have problems with a `.al' extension so\n\t  # convenience libraries should have the same extension an\n\t  # archive normally would.\n\t  oldlibs=\"$output_objdir/$libname.$libext $oldlibs\"\n\t  build_libtool_libs=convenience\n\t  build_old_libs=yes\n\tfi\n\n\ttest -n \"$vinfo\" && \\\n\t  func_warning \"\\`-version-info/-version-number' is ignored for convenience libraries\"\n\n\ttest -n \"$release\" && \\\n\t  func_warning \"\\`-release' is ignored for convenience libraries\"\n      else\n\n\t# Parse the version information argument.\n\tsave_ifs=\"$IFS\"; IFS=':'\n\tset dummy $vinfo 0 0 0\n\tshift\n\tIFS=\"$save_ifs\"\n\n\ttest -n \"$7\" && \\\n\t  func_fatal_help \"too many parameters to \\`-version-info'\"\n\n\t# convert absolute version numbers to libtool ages\n\t# this retains compatibility with .la files and attempts\n\t# to make the code below a bit more comprehensible\n\n\tcase $vinfo_number in\n\tyes)\n\t  number_major=\"$1\"\n\t  number_minor=\"$2\"\n\t  number_revision=\"$3\"\n\t  #\n\t  # There are really only two kinds -- those that\n\t  # use the current revision as the major version\n\t  # and those that subtract age and use age as\n\t  # a minor version.  But, then there is irix\n\t  # which has an extra 1 added just for fun\n\t  #\n\t  case $version_type in\n\t  # correct linux to gnu/linux during the next big refactor\n\t  darwin|linux|osf|windows|none)\n\t    func_arith $number_major + $number_minor\n\t    current=$func_arith_result\n\t    age=\"$number_minor\"\n\t    revision=\"$number_revision\"\n\t    ;;\n\t  freebsd-aout|freebsd-elf|qnx|sunos)\n\t    current=\"$number_major\"\n\t    revision=\"$number_minor\"\n\t    age=\"0\"\n\t    ;;\n\t  irix|nonstopux)\n\t    func_arith $number_major + $number_minor\n\t    current=$func_arith_result\n\t    age=\"$number_minor\"\n\t    revision=\"$number_minor\"\n\t    lt_irix_increment=no\n\t    ;;\n\t  *)\n\t    func_fatal_configuration \"$modename: unknown library version type \\`$version_type'\"\n\t    ;;\n\t  esac\n\t  ;;\n\tno)\n\t  current=\"$1\"\n\t  revision=\"$2\"\n\t  age=\"$3\"\n\t  ;;\n\tesac\n\n\t# Check that each of the things are valid numbers.\n\tcase $current in\n\t0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;\n\t*)\n\t  func_error \"CURRENT \\`$current' must be a nonnegative integer\"\n\t  func_fatal_error \"\\`$vinfo' is not valid version information\"\n\t  ;;\n\tesac\n\n\tcase $revision in\n\t0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;\n\t*)\n\t  func_error \"REVISION \\`$revision' must be a nonnegative integer\"\n\t  func_fatal_error \"\\`$vinfo' is not valid version information\"\n\t  ;;\n\tesac\n\n\tcase $age in\n\t0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;\n\t*)\n\t  func_error \"AGE \\`$age' must be a nonnegative integer\"\n\t  func_fatal_error \"\\`$vinfo' is not valid version information\"\n\t  ;;\n\tesac\n\n\tif test \"$age\" -gt \"$current\"; then\n\t  func_error \"AGE \\`$age' is greater than the current interface number \\`$current'\"\n\t  func_fatal_error \"\\`$vinfo' is not valid version information\"\n\tfi\n\n\t# Calculate the version variables.\n\tmajor=\n\tversuffix=\n\tverstring=\n\tcase $version_type in\n\tnone) ;;\n\n\tdarwin)\n\t  # Like Linux, but with the current version available in\n\t  # verstring for coding it into the library header\n\t  func_arith $current - $age\n\t  major=.$func_arith_result\n\t  versuffix=\"$major.$age.$revision\"\n\t  # Darwin ld doesn't like 0 for these options...\n\t  func_arith $current + 1\n\t  minor_current=$func_arith_result\n\t  xlcverstring=\"${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision\"\n\t  verstring=\"-compatibility_version $minor_current -current_version $minor_current.$revision\"\n\t  ;;\n\n\tfreebsd-aout)\n\t  major=\".$current\"\n\t  versuffix=\".$current.$revision\";\n\t  ;;\n\n\tfreebsd-elf)\n\t  major=\".$current\"\n\t  versuffix=\".$current\"\n\t  ;;\n\n\tirix | nonstopux)\n\t  if test \"X$lt_irix_increment\" = \"Xno\"; then\n\t    func_arith $current - $age\n\t  else\n\t    func_arith $current - $age + 1\n\t  fi\n\t  major=$func_arith_result\n\n\t  case $version_type in\n\t    nonstopux) verstring_prefix=nonstopux ;;\n\t    *)         verstring_prefix=sgi ;;\n\t  esac\n\t  verstring=\"$verstring_prefix$major.$revision\"\n\n\t  # Add in all the interfaces that we are compatible with.\n\t  loop=$revision\n\t  while test \"$loop\" -ne 0; do\n\t    func_arith $revision - $loop\n\t    iface=$func_arith_result\n\t    func_arith $loop - 1\n\t    loop=$func_arith_result\n\t    verstring=\"$verstring_prefix$major.$iface:$verstring\"\n\t  done\n\n\t  # Before this point, $major must not contain `.'.\n\t  major=.$major\n\t  versuffix=\"$major.$revision\"\n\t  ;;\n\n\tlinux) # correct to gnu/linux during the next big refactor\n\t  func_arith $current - $age\n\t  major=.$func_arith_result\n\t  versuffix=\"$major.$age.$revision\"\n\t  ;;\n\n\tosf)\n\t  func_arith $current - $age\n\t  major=.$func_arith_result\n\t  versuffix=\".$current.$age.$revision\"\n\t  verstring=\"$current.$age.$revision\"\n\n\t  # Add in all the interfaces that we are compatible with.\n\t  loop=$age\n\t  while test \"$loop\" -ne 0; do\n\t    func_arith $current - $loop\n\t    iface=$func_arith_result\n\t    func_arith $loop - 1\n\t    loop=$func_arith_result\n\t    verstring=\"$verstring:${iface}.0\"\n\t  done\n\n\t  # Make executables depend on our current version.\n\t  func_append verstring \":${current}.0\"\n\t  ;;\n\n\tqnx)\n\t  major=\".$current\"\n\t  versuffix=\".$current\"\n\t  ;;\n\n\tsunos)\n\t  major=\".$current\"\n\t  versuffix=\".$current.$revision\"\n\t  ;;\n\n\twindows)\n\t  # Use '-' rather than '.', since we only want one\n\t  # extension on DOS 8.3 filesystems.\n\t  func_arith $current - $age\n\t  major=$func_arith_result\n\t  versuffix=\"-$major\"\n\t  ;;\n\n\t*)\n\t  func_fatal_configuration \"unknown library version type \\`$version_type'\"\n\t  ;;\n\tesac\n\n\t# Clear the version info if we defaulted, and they specified a release.\n\tif test -z \"$vinfo\" && test -n \"$release\"; then\n\t  major=\n\t  case $version_type in\n\t  darwin)\n\t    # we can't check for \"0.0\" in archive_cmds due to quoting\n\t    # problems, so we reset it completely\n\t    verstring=\n\t    ;;\n\t  *)\n\t    verstring=\"0.0\"\n\t    ;;\n\t  esac\n\t  if test \"$need_version\" = no; then\n\t    versuffix=\n\t  else\n\t    versuffix=\".0.0\"\n\t  fi\n\tfi\n\n\t# Remove version info from name if versioning should be avoided\n\tif test \"$avoid_version\" = yes && test \"$need_version\" = no; then\n\t  major=\n\t  versuffix=\n\t  verstring=\"\"\n\tfi\n\n\t# Check to see if the archive will have undefined symbols.\n\tif test \"$allow_undefined\" = yes; then\n\t  if test \"$allow_undefined_flag\" = unsupported; then\n\t    func_warning \"undefined symbols not allowed in $host shared libraries\"\n\t    build_libtool_libs=no\n\t    build_old_libs=yes\n\t  fi\n\telse\n\t  # Don't allow undefined symbols.\n\t  allow_undefined_flag=\"$no_undefined_flag\"\n\tfi\n\n      fi\n\n      func_generate_dlsyms \"$libname\" \"$libname\" \"yes\"\n      func_append libobjs \" $symfileobj\"\n      test \"X$libobjs\" = \"X \" && libobjs=\n\n      if test \"$opt_mode\" != relink; then\n\t# Remove our outputs, but don't remove object files since they\n\t# may have been created when compiling PIC objects.\n\tremovelist=\n\ttempremovelist=`$ECHO \"$output_objdir/*\"`\n\tfor p in $tempremovelist; do\n\t  case $p in\n\t    *.$objext | *.gcno)\n\t       ;;\n\t    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)\n\t       if test \"X$precious_files_regex\" != \"X\"; then\n\t\t if $ECHO \"$p\" | $EGREP -e \"$precious_files_regex\" >/dev/null 2>&1\n\t\t then\n\t\t   continue\n\t\t fi\n\t       fi\n\t       func_append removelist \" $p\"\n\t       ;;\n\t    *) ;;\n\t  esac\n\tdone\n\ttest -n \"$removelist\" && \\\n\t  func_show_eval \"${RM}r \\$removelist\"\n      fi\n\n      # Now set the variables for building old libraries.\n      if test \"$build_old_libs\" = yes && test \"$build_libtool_libs\" != convenience ; then\n\tfunc_append oldlibs \" $output_objdir/$libname.$libext\"\n\n\t# Transform .lo files to .o files.\n\toldobjs=\"$objs \"`$ECHO \"$libobjs\" | $SP2NL | $SED \"/\\.${libext}$/d; $lo2o\" | $NL2SP`\n      fi\n\n      # Eliminate all temporary directories.\n      #for path in $notinst_path; do\n      #\tlib_search_path=`$ECHO \"$lib_search_path \" | $SED \"s% $path % %g\"`\n      #\tdeplibs=`$ECHO \"$deplibs \" | $SED \"s% -L$path % %g\"`\n      #\tdependency_libs=`$ECHO \"$dependency_libs \" | $SED \"s% -L$path % %g\"`\n      #done\n\n      if test -n \"$xrpath\"; then\n\t# If the user specified any rpath flags, then add them.\n\ttemp_xrpath=\n\tfor libdir in $xrpath; do\n\t  func_replace_sysroot \"$libdir\"\n\t  func_append temp_xrpath \" -R$func_replace_sysroot_result\"\n\t  case \"$finalize_rpath \" in\n\t  *\" $libdir \"*) ;;\n\t  *) func_append finalize_rpath \" $libdir\" ;;\n\t  esac\n\tdone\n\tif test \"$hardcode_into_libs\" != yes || test \"$build_old_libs\" = yes; then\n\t  dependency_libs=\"$temp_xrpath $dependency_libs\"\n\tfi\n      fi\n\n      # Make sure dlfiles contains only unique files that won't be dlpreopened\n      old_dlfiles=\"$dlfiles\"\n      dlfiles=\n      for lib in $old_dlfiles; do\n\tcase \" $dlprefiles $dlfiles \" in\n\t*\" $lib \"*) ;;\n\t*) func_append dlfiles \" $lib\" ;;\n\tesac\n      done\n\n      # Make sure dlprefiles contains only unique files\n      old_dlprefiles=\"$dlprefiles\"\n      dlprefiles=\n      for lib in $old_dlprefiles; do\n\tcase \"$dlprefiles \" in\n\t*\" $lib \"*) ;;\n\t*) func_append dlprefiles \" $lib\" ;;\n\tesac\n      done\n\n      if test \"$build_libtool_libs\" = yes; then\n\tif test -n \"$rpath\"; then\n\t  case $host in\n\t  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)\n\t    # these systems don't actually have a c library (as such)!\n\t    ;;\n\t  *-*-rhapsody* | *-*-darwin1.[012])\n\t    # Rhapsody C library is in the System framework\n\t    func_append deplibs \" System.ltframework\"\n\t    ;;\n\t  *-*-netbsd*)\n\t    # Don't link with libc until the a.out ld.so is fixed.\n\t    ;;\n\t  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)\n\t    # Do not include libc due to us having libc/libc_r.\n\t    ;;\n\t  *-*-sco3.2v5* | *-*-sco5v6*)\n\t    # Causes problems with __ctype\n\t    ;;\n\t  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)\n\t    # Compiler inserts libc in the correct place for threads to work\n\t    ;;\n\t  *)\n\t    # Add libc to deplibs on all other systems if necessary.\n\t    if test \"$build_libtool_need_lc\" = \"yes\"; then\n\t      func_append deplibs \" -lc\"\n\t    fi\n\t    ;;\n\t  esac\n\tfi\n\n\t# Transform deplibs into only deplibs that can be linked in shared.\n\tname_save=$name\n\tlibname_save=$libname\n\trelease_save=$release\n\tversuffix_save=$versuffix\n\tmajor_save=$major\n\t# I'm not sure if I'm treating the release correctly.  I think\n\t# release should show up in the -l (ie -lgmp5) so we don't want to\n\t# add it in twice.  Is that correct?\n\trelease=\"\"\n\tversuffix=\"\"\n\tmajor=\"\"\n\tnewdeplibs=\n\tdroppeddeps=no\n\tcase $deplibs_check_method in\n\tpass_all)\n\t  # Don't check for shared/static.  Everything works.\n\t  # This might be a little naive.  We might want to check\n\t  # whether the library exists or not.  But this is on\n\t  # osf3 & osf4 and I'm not really sure... Just\n\t  # implementing what was already the behavior.\n\t  newdeplibs=$deplibs\n\t  ;;\n\ttest_compile)\n\t  # This code stresses the \"libraries are programs\" paradigm to its\n\t  # limits. Maybe even breaks it.  We compile a program, linking it\n\t  # against the deplibs as a proxy for the library.  Then we can check\n\t  # whether they linked in statically or dynamically with ldd.\n\t  $opt_dry_run || $RM conftest.c\n\t  cat > conftest.c <<EOF\n\t  int main() { return 0; }\nEOF\n\t  $opt_dry_run || $RM conftest\n\t  if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then\n\t    ldd_output=`ldd conftest`\n\t    for i in $deplibs; do\n\t      case $i in\n\t      -l*)\n\t\tfunc_stripname -l '' \"$i\"\n\t\tname=$func_stripname_result\n\t\tif test \"X$allow_libtool_libs_with_static_runtimes\" = \"Xyes\" ; then\n\t\t  case \" $predeps $postdeps \" in\n\t\t  *\" $i \"*)\n\t\t    func_append newdeplibs \" $i\"\n\t\t    i=\"\"\n\t\t    ;;\n\t\t  esac\n\t\tfi\n\t\tif test -n \"$i\" ; then\n\t\t  libname=`eval \"\\\\$ECHO \\\"$libname_spec\\\"\"`\n\t\t  deplib_matches=`eval \"\\\\$ECHO \\\"$library_names_spec\\\"\"`\n\t\t  set dummy $deplib_matches; shift\n\t\t  deplib_match=$1\n\t\t  if test `expr \"$ldd_output\" : \".*$deplib_match\"` -ne 0 ; then\n\t\t    func_append newdeplibs \" $i\"\n\t\t  else\n\t\t    droppeddeps=yes\n\t\t    echo\n\t\t    $ECHO \"*** Warning: dynamic linker does not accept needed library $i.\"\n\t\t    echo \"*** I have the capability to make that library automatically link in when\"\n\t\t    echo \"*** you link to this library.  But I can only do this if you have a\"\n\t\t    echo \"*** shared version of the library, which I believe you do not have\"\n\t\t    echo \"*** because a test_compile did reveal that the linker did not use it for\"\n\t\t    echo \"*** its dynamic dependency list that programs get resolved with at runtime.\"\n\t\t  fi\n\t\tfi\n\t\t;;\n\t      *)\n\t\tfunc_append newdeplibs \" $i\"\n\t\t;;\n\t      esac\n\t    done\n\t  else\n\t    # Error occurred in the first compile.  Let's try to salvage\n\t    # the situation: Compile a separate program for each library.\n\t    for i in $deplibs; do\n\t      case $i in\n\t      -l*)\n\t\tfunc_stripname -l '' \"$i\"\n\t\tname=$func_stripname_result\n\t\t$opt_dry_run || $RM conftest\n\t\tif $LTCC $LTCFLAGS -o conftest conftest.c $i; then\n\t\t  ldd_output=`ldd conftest`\n\t\t  if test \"X$allow_libtool_libs_with_static_runtimes\" = \"Xyes\" ; then\n\t\t    case \" $predeps $postdeps \" in\n\t\t    *\" $i \"*)\n\t\t      func_append newdeplibs \" $i\"\n\t\t      i=\"\"\n\t\t      ;;\n\t\t    esac\n\t\t  fi\n\t\t  if test -n \"$i\" ; then\n\t\t    libname=`eval \"\\\\$ECHO \\\"$libname_spec\\\"\"`\n\t\t    deplib_matches=`eval \"\\\\$ECHO \\\"$library_names_spec\\\"\"`\n\t\t    set dummy $deplib_matches; shift\n\t\t    deplib_match=$1\n\t\t    if test `expr \"$ldd_output\" : \".*$deplib_match\"` -ne 0 ; then\n\t\t      func_append newdeplibs \" $i\"\n\t\t    else\n\t\t      droppeddeps=yes\n\t\t      echo\n\t\t      $ECHO \"*** Warning: dynamic linker does not accept needed library $i.\"\n\t\t      echo \"*** I have the capability to make that library automatically link in when\"\n\t\t      echo \"*** you link to this library.  But I can only do this if you have a\"\n\t\t      echo \"*** shared version of the library, which you do not appear to have\"\n\t\t      echo \"*** because a test_compile did reveal that the linker did not use this one\"\n\t\t      echo \"*** as a dynamic dependency that programs can get resolved with at runtime.\"\n\t\t    fi\n\t\t  fi\n\t\telse\n\t\t  droppeddeps=yes\n\t\t  echo\n\t\t  $ECHO \"*** Warning!  Library $i is needed by this library but I was not able to\"\n\t\t  echo \"*** make it link in!  You will probably need to install it or some\"\n\t\t  echo \"*** library that it depends on before this library will be fully\"\n\t\t  echo \"*** functional.  Installing it before continuing would be even better.\"\n\t\tfi\n\t\t;;\n\t      *)\n\t\tfunc_append newdeplibs \" $i\"\n\t\t;;\n\t      esac\n\t    done\n\t  fi\n\t  ;;\n\tfile_magic*)\n\t  set dummy $deplibs_check_method; shift\n\t  file_magic_regex=`expr \"$deplibs_check_method\" : \"$1 \\(.*\\)\"`\n\t  for a_deplib in $deplibs; do\n\t    case $a_deplib in\n\t    -l*)\n\t      func_stripname -l '' \"$a_deplib\"\n\t      name=$func_stripname_result\n\t      if test \"X$allow_libtool_libs_with_static_runtimes\" = \"Xyes\" ; then\n\t\tcase \" $predeps $postdeps \" in\n\t\t*\" $a_deplib \"*)\n\t\t  func_append newdeplibs \" $a_deplib\"\n\t\t  a_deplib=\"\"\n\t\t  ;;\n\t\tesac\n\t      fi\n\t      if test -n \"$a_deplib\" ; then\n\t\tlibname=`eval \"\\\\$ECHO \\\"$libname_spec\\\"\"`\n\t\tif test -n \"$file_magic_glob\"; then\n\t\t  libnameglob=`func_echo_all \"$libname\" | $SED -e $file_magic_glob`\n\t\telse\n\t\t  libnameglob=$libname\n\t\tfi\n\t\ttest \"$want_nocaseglob\" = yes && nocaseglob=`shopt -p nocaseglob`\n\t\tfor i in $lib_search_path $sys_lib_search_path $shlib_search_path; do\n\t\t  if test \"$want_nocaseglob\" = yes; then\n\t\t    shopt -s nocaseglob\n\t\t    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`\n\t\t    $nocaseglob\n\t\t  else\n\t\t    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`\n\t\t  fi\n\t\t  for potent_lib in $potential_libs; do\n\t\t      # Follow soft links.\n\t\t      if ls -lLd \"$potent_lib\" 2>/dev/null |\n\t\t\t $GREP \" -> \" >/dev/null; then\n\t\t\tcontinue\n\t\t      fi\n\t\t      # The statement above tries to avoid entering an\n\t\t      # endless loop below, in case of cyclic links.\n\t\t      # We might still enter an endless loop, since a link\n\t\t      # loop can be closed while we follow links,\n\t\t      # but so what?\n\t\t      potlib=\"$potent_lib\"\n\t\t      while test -h \"$potlib\" 2>/dev/null; do\n\t\t\tpotliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`\n\t\t\tcase $potliblink in\n\t\t\t[\\\\/]* | [A-Za-z]:[\\\\/]*) potlib=\"$potliblink\";;\n\t\t\t*) potlib=`$ECHO \"$potlib\" | $SED 's,[^/]*$,,'`\"$potliblink\";;\n\t\t\tesac\n\t\t      done\n\t\t      if eval $file_magic_cmd \\\"\\$potlib\\\" 2>/dev/null |\n\t\t\t $SED -e 10q |\n\t\t\t $EGREP \"$file_magic_regex\" > /dev/null; then\n\t\t\tfunc_append newdeplibs \" $a_deplib\"\n\t\t\ta_deplib=\"\"\n\t\t\tbreak 2\n\t\t      fi\n\t\t  done\n\t\tdone\n\t      fi\n\t      if test -n \"$a_deplib\" ; then\n\t\tdroppeddeps=yes\n\t\techo\n\t\t$ECHO \"*** Warning: linker path does not have real file for library $a_deplib.\"\n\t\techo \"*** I have the capability to make that library automatically link in when\"\n\t\techo \"*** you link to this library.  But I can only do this if you have a\"\n\t\techo \"*** shared version of the library, which you do not appear to have\"\n\t\techo \"*** because I did check the linker path looking for a file starting\"\n\t\tif test -z \"$potlib\" ; then\n\t\t  $ECHO \"*** with $libname but no candidates were found. (...for file magic test)\"\n\t\telse\n\t\t  $ECHO \"*** with $libname and none of the candidates passed a file format test\"\n\t\t  $ECHO \"*** using a file magic. Last file checked: $potlib\"\n\t\tfi\n\t      fi\n\t      ;;\n\t    *)\n\t      # Add a -L argument.\n\t      func_append newdeplibs \" $a_deplib\"\n\t      ;;\n\t    esac\n\t  done # Gone through all deplibs.\n\t  ;;\n\tmatch_pattern*)\n\t  set dummy $deplibs_check_method; shift\n\t  match_pattern_regex=`expr \"$deplibs_check_method\" : \"$1 \\(.*\\)\"`\n\t  for a_deplib in $deplibs; do\n\t    case $a_deplib in\n\t    -l*)\n\t      func_stripname -l '' \"$a_deplib\"\n\t      name=$func_stripname_result\n\t      if test \"X$allow_libtool_libs_with_static_runtimes\" = \"Xyes\" ; then\n\t\tcase \" $predeps $postdeps \" in\n\t\t*\" $a_deplib \"*)\n\t\t  func_append newdeplibs \" $a_deplib\"\n\t\t  a_deplib=\"\"\n\t\t  ;;\n\t\tesac\n\t      fi\n\t      if test -n \"$a_deplib\" ; then\n\t\tlibname=`eval \"\\\\$ECHO \\\"$libname_spec\\\"\"`\n\t\tfor i in $lib_search_path $sys_lib_search_path $shlib_search_path; do\n\t\t  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`\n\t\t  for potent_lib in $potential_libs; do\n\t\t    potlib=\"$potent_lib\" # see symlink-check above in file_magic test\n\t\t    if eval \"\\$ECHO \\\"$potent_lib\\\"\" 2>/dev/null | $SED 10q | \\\n\t\t       $EGREP \"$match_pattern_regex\" > /dev/null; then\n\t\t      func_append newdeplibs \" $a_deplib\"\n\t\t      a_deplib=\"\"\n\t\t      break 2\n\t\t    fi\n\t\t  done\n\t\tdone\n\t      fi\n\t      if test -n \"$a_deplib\" ; then\n\t\tdroppeddeps=yes\n\t\techo\n\t\t$ECHO \"*** Warning: linker path does not have real file for library $a_deplib.\"\n\t\techo \"*** I have the capability to make that library automatically link in when\"\n\t\techo \"*** you link to this library.  But I can only do this if you have a\"\n\t\techo \"*** shared version of the library, which you do not appear to have\"\n\t\techo \"*** because I did check the linker path looking for a file starting\"\n\t\tif test -z \"$potlib\" ; then\n\t\t  $ECHO \"*** with $libname but no candidates were found. (...for regex pattern test)\"\n\t\telse\n\t\t  $ECHO \"*** with $libname and none of the candidates passed a file format test\"\n\t\t  $ECHO \"*** using a regex pattern. Last file checked: $potlib\"\n\t\tfi\n\t      fi\n\t      ;;\n\t    *)\n\t      # Add a -L argument.\n\t      func_append newdeplibs \" $a_deplib\"\n\t      ;;\n\t    esac\n\t  done # Gone through all deplibs.\n\t  ;;\n\tnone | unknown | *)\n\t  newdeplibs=\"\"\n\t  tmp_deplibs=`$ECHO \" $deplibs\" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'`\n\t  if test \"X$allow_libtool_libs_with_static_runtimes\" = \"Xyes\" ; then\n\t    for i in $predeps $postdeps ; do\n\t      # can't use Xsed below, because $i might contain '/'\n\t      tmp_deplibs=`$ECHO \" $tmp_deplibs\" | $SED \"s,$i,,\"`\n\t    done\n\t  fi\n\t  case $tmp_deplibs in\n\t  *[!\\\t\\ ]*)\n\t    echo\n\t    if test \"X$deplibs_check_method\" = \"Xnone\"; then\n\t      echo \"*** Warning: inter-library dependencies are not supported in this platform.\"\n\t    else\n\t      echo \"*** Warning: inter-library dependencies are not known to be supported.\"\n\t    fi\n\t    echo \"*** All declared inter-library dependencies are being dropped.\"\n\t    droppeddeps=yes\n\t    ;;\n\t  esac\n\t  ;;\n\tesac\n\tversuffix=$versuffix_save\n\tmajor=$major_save\n\trelease=$release_save\n\tlibname=$libname_save\n\tname=$name_save\n\n\tcase $host in\n\t*-*-rhapsody* | *-*-darwin1.[012])\n\t  # On Rhapsody replace the C library with the System framework\n\t  newdeplibs=`$ECHO \" $newdeplibs\" | $SED 's/ -lc / System.ltframework /'`\n\t  ;;\n\tesac\n\n\tif test \"$droppeddeps\" = yes; then\n\t  if test \"$module\" = yes; then\n\t    echo\n\t    echo \"*** Warning: libtool could not satisfy all declared inter-library\"\n\t    $ECHO \"*** dependencies of module $libname.  Therefore, libtool will create\"\n\t    echo \"*** a static module, that should work as long as the dlopening\"\n\t    echo \"*** application is linked with the -dlopen flag.\"\n\t    if test -z \"$global_symbol_pipe\"; then\n\t      echo\n\t      echo \"*** However, this would only work if libtool was able to extract symbol\"\n\t      echo \"*** lists from a program, using \\`nm' or equivalent, but libtool could\"\n\t      echo \"*** not find such a program.  So, this module is probably useless.\"\n\t      echo \"*** \\`nm' from GNU binutils and a full rebuild may help.\"\n\t    fi\n\t    if test \"$build_old_libs\" = no; then\n\t      oldlibs=\"$output_objdir/$libname.$libext\"\n\t      build_libtool_libs=module\n\t      build_old_libs=yes\n\t    else\n\t      build_libtool_libs=no\n\t    fi\n\t  else\n\t    echo \"*** The inter-library dependencies that have been dropped here will be\"\n\t    echo \"*** automatically added whenever a program is linked with this library\"\n\t    echo \"*** or is declared to -dlopen it.\"\n\n\t    if test \"$allow_undefined\" = no; then\n\t      echo\n\t      echo \"*** Since this library must not contain undefined symbols,\"\n\t      echo \"*** because either the platform does not support them or\"\n\t      echo \"*** it was explicitly requested with -no-undefined,\"\n\t      echo \"*** libtool will only create a static version of it.\"\n\t      if test \"$build_old_libs\" = no; then\n\t\toldlibs=\"$output_objdir/$libname.$libext\"\n\t\tbuild_libtool_libs=module\n\t\tbuild_old_libs=yes\n\t      else\n\t\tbuild_libtool_libs=no\n\t      fi\n\t    fi\n\t  fi\n\tfi\n\t# Done checking deplibs!\n\tdeplibs=$newdeplibs\n      fi\n      # Time to change all our \"foo.ltframework\" stuff back to \"-framework foo\"\n      case $host in\n\t*-*-darwin*)\n\t  newdeplibs=`$ECHO \" $newdeplibs\" | $SED 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\t  new_inherited_linker_flags=`$ECHO \" $new_inherited_linker_flags\" | $SED 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\t  deplibs=`$ECHO \" $deplibs\" | $SED 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\t  ;;\n      esac\n\n      # move library search paths that coincide with paths to not yet\n      # installed libraries to the beginning of the library search list\n      new_libs=\n      for path in $notinst_path; do\n\tcase \" $new_libs \" in\n\t*\" -L$path/$objdir \"*) ;;\n\t*)\n\t  case \" $deplibs \" in\n\t  *\" -L$path/$objdir \"*)\n\t    func_append new_libs \" -L$path/$objdir\" ;;\n\t  esac\n\t  ;;\n\tesac\n      done\n      for deplib in $deplibs; do\n\tcase $deplib in\n\t-L*)\n\t  case \" $new_libs \" in\n\t  *\" $deplib \"*) ;;\n\t  *) func_append new_libs \" $deplib\" ;;\n\t  esac\n\t  ;;\n\t*) func_append new_libs \" $deplib\" ;;\n\tesac\n      done\n      deplibs=\"$new_libs\"\n\n      # All the library-specific variables (install_libdir is set above).\n      library_names=\n      old_library=\n      dlname=\n\n      # Test again, we may have decided not to build it any more\n      if test \"$build_libtool_libs\" = yes; then\n\t# Remove ${wl} instances when linking with ld.\n\t# FIXME: should test the right _cmds variable.\n\tcase $archive_cmds in\n\t  *\\$LD\\ *) wl= ;;\n        esac\n\tif test \"$hardcode_into_libs\" = yes; then\n\t  # Hardcode the library paths\n\t  hardcode_libdirs=\n\t  dep_rpath=\n\t  rpath=\"$finalize_rpath\"\n\t  test \"$opt_mode\" != relink && rpath=\"$compile_rpath$rpath\"\n\t  for libdir in $rpath; do\n\t    if test -n \"$hardcode_libdir_flag_spec\"; then\n\t      if test -n \"$hardcode_libdir_separator\"; then\n\t\tfunc_replace_sysroot \"$libdir\"\n\t\tlibdir=$func_replace_sysroot_result\n\t\tif test -z \"$hardcode_libdirs\"; then\n\t\t  hardcode_libdirs=\"$libdir\"\n\t\telse\n\t\t  # Just accumulate the unique libdirs.\n\t\t  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in\n\t\t  *\"$hardcode_libdir_separator$libdir$hardcode_libdir_separator\"*)\n\t\t    ;;\n\t\t  *)\n\t\t    func_append hardcode_libdirs \"$hardcode_libdir_separator$libdir\"\n\t\t    ;;\n\t\t  esac\n\t\tfi\n\t      else\n\t\teval flag=\\\"$hardcode_libdir_flag_spec\\\"\n\t\tfunc_append dep_rpath \" $flag\"\n\t      fi\n\t    elif test -n \"$runpath_var\"; then\n\t      case \"$perm_rpath \" in\n\t      *\" $libdir \"*) ;;\n\t      *) func_append perm_rpath \" $libdir\" ;;\n\t      esac\n\t    fi\n\t  done\n\t  # Substitute the hardcoded libdirs into the rpath.\n\t  if test -n \"$hardcode_libdir_separator\" &&\n\t     test -n \"$hardcode_libdirs\"; then\n\t    libdir=\"$hardcode_libdirs\"\n\t    eval \"dep_rpath=\\\"$hardcode_libdir_flag_spec\\\"\"\n\t  fi\n\t  if test -n \"$runpath_var\" && test -n \"$perm_rpath\"; then\n\t    # We should set the runpath_var.\n\t    rpath=\n\t    for dir in $perm_rpath; do\n\t      func_append rpath \"$dir:\"\n\t    done\n\t    eval \"$runpath_var='$rpath\\$$runpath_var'; export $runpath_var\"\n\t  fi\n\t  test -n \"$dep_rpath\" && deplibs=\"$dep_rpath $deplibs\"\n\tfi\n\n\tshlibpath=\"$finalize_shlibpath\"\n\ttest \"$opt_mode\" != relink && shlibpath=\"$compile_shlibpath$shlibpath\"\n\tif test -n \"$shlibpath\"; then\n\t  eval \"$shlibpath_var='$shlibpath\\$$shlibpath_var'; export $shlibpath_var\"\n\tfi\n\n\t# Get the real and link names of the library.\n\teval shared_ext=\\\"$shrext_cmds\\\"\n\teval library_names=\\\"$library_names_spec\\\"\n\tset dummy $library_names\n\tshift\n\trealname=\"$1\"\n\tshift\n\n\tif test -n \"$soname_spec\"; then\n\t  eval soname=\\\"$soname_spec\\\"\n\telse\n\t  soname=\"$realname\"\n\tfi\n\tif test -z \"$dlname\"; then\n\t  dlname=$soname\n\tfi\n\n\tlib=\"$output_objdir/$realname\"\n\tlinknames=\n\tfor link\n\tdo\n\t  func_append linknames \" $link\"\n\tdone\n\n\t# Use standard objects if they are pic\n\ttest -z \"$pic_flag\" && libobjs=`$ECHO \"$libobjs\" | $SP2NL | $SED \"$lo2o\" | $NL2SP`\n\ttest \"X$libobjs\" = \"X \" && libobjs=\n\n\tdelfiles=\n\tif test -n \"$export_symbols\" && test -n \"$include_expsyms\"; then\n\t  $opt_dry_run || cp \"$export_symbols\" \"$output_objdir/$libname.uexp\"\n\t  export_symbols=\"$output_objdir/$libname.uexp\"\n\t  func_append delfiles \" $export_symbols\"\n\tfi\n\n\torig_export_symbols=\n\tcase $host_os in\n\tcygwin* | mingw* | cegcc*)\n\t  if test -n \"$export_symbols\" && test -z \"$export_symbols_regex\"; then\n\t    # exporting using user supplied symfile\n\t    if test \"x`$SED 1q $export_symbols`\" != xEXPORTS; then\n\t      # and it's NOT already a .def file. Must figure out\n\t      # which of the given symbols are data symbols and tag\n\t      # them as such. So, trigger use of export_symbols_cmds.\n\t      # export_symbols gets reassigned inside the \"prepare\n\t      # the list of exported symbols\" if statement, so the\n\t      # include_expsyms logic still works.\n\t      orig_export_symbols=\"$export_symbols\"\n\t      export_symbols=\n\t      always_export_symbols=yes\n\t    fi\n\t  fi\n\t  ;;\n\tesac\n\n\t# Prepare the list of exported symbols\n\tif test -z \"$export_symbols\"; then\n\t  if test \"$always_export_symbols\" = yes || test -n \"$export_symbols_regex\"; then\n\t    func_verbose \"generating symbol list for \\`$libname.la'\"\n\t    export_symbols=\"$output_objdir/$libname.exp\"\n\t    $opt_dry_run || $RM $export_symbols\n\t    cmds=$export_symbols_cmds\n\t    save_ifs=\"$IFS\"; IFS='~'\n\t    for cmd1 in $cmds; do\n\t      IFS=\"$save_ifs\"\n\t      # Take the normal branch if the nm_file_list_spec branch\n\t      # doesn't work or if tool conversion is not needed.\n\t      case $nm_file_list_spec~$to_tool_file_cmd in\n\t\t*~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*)\n\t\t  try_normal_branch=yes\n\t\t  eval cmd=\\\"$cmd1\\\"\n\t\t  func_len \" $cmd\"\n\t\t  len=$func_len_result\n\t\t  ;;\n\t\t*)\n\t\t  try_normal_branch=no\n\t\t  ;;\n\t      esac\n\t      if test \"$try_normal_branch\" = yes \\\n\t\t && { test \"$len\" -lt \"$max_cmd_len\" \\\n\t\t      || test \"$max_cmd_len\" -le -1; }\n\t      then\n\t\tfunc_show_eval \"$cmd\" 'exit $?'\n\t\tskipped_export=false\n\t      elif test -n \"$nm_file_list_spec\"; then\n\t\tfunc_basename \"$output\"\n\t\toutput_la=$func_basename_result\n\t\tsave_libobjs=$libobjs\n\t\tsave_output=$output\n\t\toutput=${output_objdir}/${output_la}.nm\n\t\tfunc_to_tool_file \"$output\"\n\t\tlibobjs=$nm_file_list_spec$func_to_tool_file_result\n\t\tfunc_append delfiles \" $output\"\n\t\tfunc_verbose \"creating $NM input file list: $output\"\n\t\tfor obj in $save_libobjs; do\n\t\t  func_to_tool_file \"$obj\"\n\t\t  $ECHO \"$func_to_tool_file_result\"\n\t\tdone > \"$output\"\n\t\teval cmd=\\\"$cmd1\\\"\n\t\tfunc_show_eval \"$cmd\" 'exit $?'\n\t\toutput=$save_output\n\t\tlibobjs=$save_libobjs\n\t\tskipped_export=false\n\t      else\n\t\t# The command line is too long to execute in one step.\n\t\tfunc_verbose \"using reloadable object file for export list...\"\n\t\tskipped_export=:\n\t\t# Break out early, otherwise skipped_export may be\n\t\t# set to false by a later but shorter cmd.\n\t\tbreak\n\t      fi\n\t    done\n\t    IFS=\"$save_ifs\"\n\t    if test -n \"$export_symbols_regex\" && test \"X$skipped_export\" != \"X:\"; then\n\t      func_show_eval '$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"'\n\t      func_show_eval '$MV \"${export_symbols}T\" \"$export_symbols\"'\n\t    fi\n\t  fi\n\tfi\n\n\tif test -n \"$export_symbols\" && test -n \"$include_expsyms\"; then\n\t  tmp_export_symbols=\"$export_symbols\"\n\t  test -n \"$orig_export_symbols\" && tmp_export_symbols=\"$orig_export_symbols\"\n\t  $opt_dry_run || eval '$ECHO \"$include_expsyms\" | $SP2NL >> \"$tmp_export_symbols\"'\n\tfi\n\n\tif test \"X$skipped_export\" != \"X:\" && test -n \"$orig_export_symbols\"; then\n\t  # The given exports_symbols file has to be filtered, so filter it.\n\t  func_verbose \"filter symbol list for \\`$libname.la' to tag DATA exports\"\n\t  # FIXME: $output_objdir/$libname.filter potentially contains lots of\n\t  # 's' commands which not all seds can handle. GNU sed should be fine\n\t  # though. Also, the filter scales superlinearly with the number of\n\t  # global variables. join(1) would be nice here, but unfortunately\n\t  # isn't a blessed tool.\n\t  $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\\(.*\\)\\([ \\,].*\\),s|^\\1$|\\1\\2|,' < $export_symbols > $output_objdir/$libname.filter\n\t  func_append delfiles \" $export_symbols $output_objdir/$libname.filter\"\n\t  export_symbols=$output_objdir/$libname.def\n\t  $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols\n\tfi\n\n\ttmp_deplibs=\n\tfor test_deplib in $deplibs; do\n\t  case \" $convenience \" in\n\t  *\" $test_deplib \"*) ;;\n\t  *)\n\t    func_append tmp_deplibs \" $test_deplib\"\n\t    ;;\n\t  esac\n\tdone\n\tdeplibs=\"$tmp_deplibs\"\n\n\tif test -n \"$convenience\"; then\n\t  if test -n \"$whole_archive_flag_spec\" &&\n\t    test \"$compiler_needs_object\" = yes &&\n\t    test -z \"$libobjs\"; then\n\t    # extract the archives, so we have objects to list.\n\t    # TODO: could optimize this to just extract one archive.\n\t    whole_archive_flag_spec=\n\t  fi\n\t  if test -n \"$whole_archive_flag_spec\"; then\n\t    save_libobjs=$libobjs\n\t    eval libobjs=\\\"\\$libobjs $whole_archive_flag_spec\\\"\n\t    test \"X$libobjs\" = \"X \" && libobjs=\n\t  else\n\t    gentop=\"$output_objdir/${outputname}x\"\n\t    func_append generated \" $gentop\"\n\n\t    func_extract_archives $gentop $convenience\n\t    func_append libobjs \" $func_extract_archives_result\"\n\t    test \"X$libobjs\" = \"X \" && libobjs=\n\t  fi\n\tfi\n\n\tif test \"$thread_safe\" = yes && test -n \"$thread_safe_flag_spec\"; then\n\t  eval flag=\\\"$thread_safe_flag_spec\\\"\n\t  func_append linker_flags \" $flag\"\n\tfi\n\n\t# Make a backup of the uninstalled library when relinking\n\tif test \"$opt_mode\" = relink; then\n\t  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?\n\tfi\n\n\t# Do each of the archive commands.\n\tif test \"$module\" = yes && test -n \"$module_cmds\" ; then\n\t  if test -n \"$export_symbols\" && test -n \"$module_expsym_cmds\"; then\n\t    eval test_cmds=\\\"$module_expsym_cmds\\\"\n\t    cmds=$module_expsym_cmds\n\t  else\n\t    eval test_cmds=\\\"$module_cmds\\\"\n\t    cmds=$module_cmds\n\t  fi\n\telse\n\t  if test -n \"$export_symbols\" && test -n \"$archive_expsym_cmds\"; then\n\t    eval test_cmds=\\\"$archive_expsym_cmds\\\"\n\t    cmds=$archive_expsym_cmds\n\t  else\n\t    eval test_cmds=\\\"$archive_cmds\\\"\n\t    cmds=$archive_cmds\n\t  fi\n\tfi\n\n\tif test \"X$skipped_export\" != \"X:\" &&\n\t   func_len \" $test_cmds\" &&\n\t   len=$func_len_result &&\n\t   test \"$len\" -lt \"$max_cmd_len\" || test \"$max_cmd_len\" -le -1; then\n\t  :\n\telse\n\t  # The command line is too long to link in one step, link piecewise\n\t  # or, if using GNU ld and skipped_export is not :, use a linker\n\t  # script.\n\n\t  # Save the value of $output and $libobjs because we want to\n\t  # use them later.  If we have whole_archive_flag_spec, we\n\t  # want to use save_libobjs as it was before\n\t  # whole_archive_flag_spec was expanded, because we can't\n\t  # assume the linker understands whole_archive_flag_spec.\n\t  # This may have to be revisited, in case too many\n\t  # convenience libraries get linked in and end up exceeding\n\t  # the spec.\n\t  if test -z \"$convenience\" || test -z \"$whole_archive_flag_spec\"; then\n\t    save_libobjs=$libobjs\n\t  fi\n\t  save_output=$output\n\t  func_basename \"$output\"\n\t  output_la=$func_basename_result\n\n\t  # Clear the reloadable object creation command queue and\n\t  # initialize k to one.\n\t  test_cmds=\n\t  concat_cmds=\n\t  objlist=\n\t  last_robj=\n\t  k=1\n\n\t  if test -n \"$save_libobjs\" && test \"X$skipped_export\" != \"X:\" && test \"$with_gnu_ld\" = yes; then\n\t    output=${output_objdir}/${output_la}.lnkscript\n\t    func_verbose \"creating GNU ld script: $output\"\n\t    echo 'INPUT (' > $output\n\t    for obj in $save_libobjs\n\t    do\n\t      func_to_tool_file \"$obj\"\n\t      $ECHO \"$func_to_tool_file_result\" >> $output\n\t    done\n\t    echo ')' >> $output\n\t    func_append delfiles \" $output\"\n\t    func_to_tool_file \"$output\"\n\t    output=$func_to_tool_file_result\n\t  elif test -n \"$save_libobjs\" && test \"X$skipped_export\" != \"X:\" && test \"X$file_list_spec\" != X; then\n\t    output=${output_objdir}/${output_la}.lnk\n\t    func_verbose \"creating linker input file list: $output\"\n\t    : > $output\n\t    set x $save_libobjs\n\t    shift\n\t    firstobj=\n\t    if test \"$compiler_needs_object\" = yes; then\n\t      firstobj=\"$1 \"\n\t      shift\n\t    fi\n\t    for obj\n\t    do\n\t      func_to_tool_file \"$obj\"\n\t      $ECHO \"$func_to_tool_file_result\" >> $output\n\t    done\n\t    func_append delfiles \" $output\"\n\t    func_to_tool_file \"$output\"\n\t    output=$firstobj\\\"$file_list_spec$func_to_tool_file_result\\\"\n\t  else\n\t    if test -n \"$save_libobjs\"; then\n\t      func_verbose \"creating reloadable object files...\"\n\t      output=$output_objdir/$output_la-${k}.$objext\n\t      eval test_cmds=\\\"$reload_cmds\\\"\n\t      func_len \" $test_cmds\"\n\t      len0=$func_len_result\n\t      len=$len0\n\n\t      # Loop over the list of objects to be linked.\n\t      for obj in $save_libobjs\n\t      do\n\t\tfunc_len \" $obj\"\n\t\tfunc_arith $len + $func_len_result\n\t\tlen=$func_arith_result\n\t\tif test \"X$objlist\" = X ||\n\t\t   test \"$len\" -lt \"$max_cmd_len\"; then\n\t\t  func_append objlist \" $obj\"\n\t\telse\n\t\t  # The command $test_cmds is almost too long, add a\n\t\t  # command to the queue.\n\t\t  if test \"$k\" -eq 1 ; then\n\t\t    # The first file doesn't have a previous command to add.\n\t\t    reload_objs=$objlist\n\t\t    eval concat_cmds=\\\"$reload_cmds\\\"\n\t\t  else\n\t\t    # All subsequent reloadable object files will link in\n\t\t    # the last one created.\n\t\t    reload_objs=\"$objlist $last_robj\"\n\t\t    eval concat_cmds=\\\"\\$concat_cmds~$reload_cmds~\\$RM $last_robj\\\"\n\t\t  fi\n\t\t  last_robj=$output_objdir/$output_la-${k}.$objext\n\t\t  func_arith $k + 1\n\t\t  k=$func_arith_result\n\t\t  output=$output_objdir/$output_la-${k}.$objext\n\t\t  objlist=\" $obj\"\n\t\t  func_len \" $last_robj\"\n\t\t  func_arith $len0 + $func_len_result\n\t\t  len=$func_arith_result\n\t\tfi\n\t      done\n\t      # Handle the remaining objects by creating one last\n\t      # reloadable object file.  All subsequent reloadable object\n\t      # files will link in the last one created.\n\t      test -z \"$concat_cmds\" || concat_cmds=$concat_cmds~\n\t      reload_objs=\"$objlist $last_robj\"\n\t      eval concat_cmds=\\\"\\${concat_cmds}$reload_cmds\\\"\n\t      if test -n \"$last_robj\"; then\n\t        eval concat_cmds=\\\"\\${concat_cmds}~\\$RM $last_robj\\\"\n\t      fi\n\t      func_append delfiles \" $output\"\n\n\t    else\n\t      output=\n\t    fi\n\n\t    if ${skipped_export-false}; then\n\t      func_verbose \"generating symbol list for \\`$libname.la'\"\n\t      export_symbols=\"$output_objdir/$libname.exp\"\n\t      $opt_dry_run || $RM $export_symbols\n\t      libobjs=$output\n\t      # Append the command to create the export file.\n\t      test -z \"$concat_cmds\" || concat_cmds=$concat_cmds~\n\t      eval concat_cmds=\\\"\\$concat_cmds$export_symbols_cmds\\\"\n\t      if test -n \"$last_robj\"; then\n\t\teval concat_cmds=\\\"\\$concat_cmds~\\$RM $last_robj\\\"\n\t      fi\n\t    fi\n\n\t    test -n \"$save_libobjs\" &&\n\t      func_verbose \"creating a temporary reloadable object file: $output\"\n\n\t    # Loop through the commands generated above and execute them.\n\t    save_ifs=\"$IFS\"; IFS='~'\n\t    for cmd in $concat_cmds; do\n\t      IFS=\"$save_ifs\"\n\t      $opt_silent || {\n\t\t  func_quote_for_expand \"$cmd\"\n\t\t  eval \"func_echo $func_quote_for_expand_result\"\n\t      }\n\t      $opt_dry_run || eval \"$cmd\" || {\n\t\tlt_exit=$?\n\n\t\t# Restore the uninstalled library and exit\n\t\tif test \"$opt_mode\" = relink; then\n\t\t  ( cd \"$output_objdir\" && \\\n\t\t    $RM \"${realname}T\" && \\\n\t\t    $MV \"${realname}U\" \"$realname\" )\n\t\tfi\n\n\t\texit $lt_exit\n\t      }\n\t    done\n\t    IFS=\"$save_ifs\"\n\n\t    if test -n \"$export_symbols_regex\" && ${skipped_export-false}; then\n\t      func_show_eval '$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"'\n\t      func_show_eval '$MV \"${export_symbols}T\" \"$export_symbols\"'\n\t    fi\n\t  fi\n\n          if ${skipped_export-false}; then\n\t    if test -n \"$export_symbols\" && test -n \"$include_expsyms\"; then\n\t      tmp_export_symbols=\"$export_symbols\"\n\t      test -n \"$orig_export_symbols\" && tmp_export_symbols=\"$orig_export_symbols\"\n\t      $opt_dry_run || eval '$ECHO \"$include_expsyms\" | $SP2NL >> \"$tmp_export_symbols\"'\n\t    fi\n\n\t    if test -n \"$orig_export_symbols\"; then\n\t      # The given exports_symbols file has to be filtered, so filter it.\n\t      func_verbose \"filter symbol list for \\`$libname.la' to tag DATA exports\"\n\t      # FIXME: $output_objdir/$libname.filter potentially contains lots of\n\t      # 's' commands which not all seds can handle. GNU sed should be fine\n\t      # though. Also, the filter scales superlinearly with the number of\n\t      # global variables. join(1) would be nice here, but unfortunately\n\t      # isn't a blessed tool.\n\t      $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\\(.*\\)\\([ \\,].*\\),s|^\\1$|\\1\\2|,' < $export_symbols > $output_objdir/$libname.filter\n\t      func_append delfiles \" $export_symbols $output_objdir/$libname.filter\"\n\t      export_symbols=$output_objdir/$libname.def\n\t      $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols\n\t    fi\n\t  fi\n\n\t  libobjs=$output\n\t  # Restore the value of output.\n\t  output=$save_output\n\n\t  if test -n \"$convenience\" && test -n \"$whole_archive_flag_spec\"; then\n\t    eval libobjs=\\\"\\$libobjs $whole_archive_flag_spec\\\"\n\t    test \"X$libobjs\" = \"X \" && libobjs=\n\t  fi\n\t  # Expand the library linking commands again to reset the\n\t  # value of $libobjs for piecewise linking.\n\n\t  # Do each of the archive commands.\n\t  if test \"$module\" = yes && test -n \"$module_cmds\" ; then\n\t    if test -n \"$export_symbols\" && test -n \"$module_expsym_cmds\"; then\n\t      cmds=$module_expsym_cmds\n\t    else\n\t      cmds=$module_cmds\n\t    fi\n\t  else\n\t    if test -n \"$export_symbols\" && test -n \"$archive_expsym_cmds\"; then\n\t      cmds=$archive_expsym_cmds\n\t    else\n\t      cmds=$archive_cmds\n\t    fi\n\t  fi\n\tfi\n\n\tif test -n \"$delfiles\"; then\n\t  # Append the command to remove temporary files to $cmds.\n\t  eval cmds=\\\"\\$cmds~\\$RM $delfiles\\\"\n\tfi\n\n\t# Add any objects from preloaded convenience libraries\n\tif test -n \"$dlprefiles\"; then\n\t  gentop=\"$output_objdir/${outputname}x\"\n\t  func_append generated \" $gentop\"\n\n\t  func_extract_archives $gentop $dlprefiles\n\t  func_append libobjs \" $func_extract_archives_result\"\n\t  test \"X$libobjs\" = \"X \" && libobjs=\n\tfi\n\n\tsave_ifs=\"$IFS\"; IFS='~'\n\tfor cmd in $cmds; do\n\t  IFS=\"$save_ifs\"\n\t  eval cmd=\\\"$cmd\\\"\n\t  $opt_silent || {\n\t    func_quote_for_expand \"$cmd\"\n\t    eval \"func_echo $func_quote_for_expand_result\"\n\t  }\n\t  $opt_dry_run || eval \"$cmd\" || {\n\t    lt_exit=$?\n\n\t    # Restore the uninstalled library and exit\n\t    if test \"$opt_mode\" = relink; then\n\t      ( cd \"$output_objdir\" && \\\n\t        $RM \"${realname}T\" && \\\n\t\t$MV \"${realname}U\" \"$realname\" )\n\t    fi\n\n\t    exit $lt_exit\n\t  }\n\tdone\n\tIFS=\"$save_ifs\"\n\n\t# Restore the uninstalled library and exit\n\tif test \"$opt_mode\" = relink; then\n\t  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?\n\n\t  if test -n \"$convenience\"; then\n\t    if test -z \"$whole_archive_flag_spec\"; then\n\t      func_show_eval '${RM}r \"$gentop\"'\n\t    fi\n\t  fi\n\n\t  exit $EXIT_SUCCESS\n\tfi\n\n\t# Create links to the real library.\n\tfor linkname in $linknames; do\n\t  if test \"$realname\" != \"$linkname\"; then\n\t    func_show_eval '(cd \"$output_objdir\" && $RM \"$linkname\" && $LN_S \"$realname\" \"$linkname\")' 'exit $?'\n\t  fi\n\tdone\n\n\t# If -module or -export-dynamic was specified, set the dlname.\n\tif test \"$module\" = yes || test \"$export_dynamic\" = yes; then\n\t  # On all known operating systems, these are identical.\n\t  dlname=\"$soname\"\n\tfi\n      fi\n      ;;\n\n    obj)\n      if test -n \"$dlfiles$dlprefiles\" || test \"$dlself\" != no; then\n\tfunc_warning \"\\`-dlopen' is ignored for objects\"\n      fi\n\n      case \" $deplibs\" in\n      *\\ -l* | *\\ -L*)\n\tfunc_warning \"\\`-l' and \\`-L' are ignored for objects\" ;;\n      esac\n\n      test -n \"$rpath\" && \\\n\tfunc_warning \"\\`-rpath' is ignored for objects\"\n\n      test -n \"$xrpath\" && \\\n\tfunc_warning \"\\`-R' is ignored for objects\"\n\n      test -n \"$vinfo\" && \\\n\tfunc_warning \"\\`-version-info' is ignored for objects\"\n\n      test -n \"$release\" && \\\n\tfunc_warning \"\\`-release' is ignored for objects\"\n\n      case $output in\n      *.lo)\n\ttest -n \"$objs$old_deplibs\" && \\\n\t  func_fatal_error \"cannot build library object \\`$output' from non-libtool objects\"\n\n\tlibobj=$output\n\tfunc_lo2o \"$libobj\"\n\tobj=$func_lo2o_result\n\t;;\n      *)\n\tlibobj=\n\tobj=\"$output\"\n\t;;\n      esac\n\n      # Delete the old objects.\n      $opt_dry_run || $RM $obj $libobj\n\n      # Objects from convenience libraries.  This assumes\n      # single-version convenience libraries.  Whenever we create\n      # different ones for PIC/non-PIC, this we'll have to duplicate\n      # the extraction.\n      reload_conv_objs=\n      gentop=\n      # reload_cmds runs $LD directly, so let us get rid of\n      # -Wl from whole_archive_flag_spec and hope we can get by with\n      # turning comma into space..\n      wl=\n\n      if test -n \"$convenience\"; then\n\tif test -n \"$whole_archive_flag_spec\"; then\n\t  eval tmp_whole_archive_flags=\\\"$whole_archive_flag_spec\\\"\n\t  reload_conv_objs=$reload_objs\\ `$ECHO \"$tmp_whole_archive_flags\" | $SED 's|,| |g'`\n\telse\n\t  gentop=\"$output_objdir/${obj}x\"\n\t  func_append generated \" $gentop\"\n\n\t  func_extract_archives $gentop $convenience\n\t  reload_conv_objs=\"$reload_objs $func_extract_archives_result\"\n\tfi\n      fi\n\n      # If we're not building shared, we need to use non_pic_objs\n      test \"$build_libtool_libs\" != yes && libobjs=\"$non_pic_objects\"\n\n      # Create the old-style object.\n      reload_objs=\"$objs$old_deplibs \"`$ECHO \"$libobjs\" | $SP2NL | $SED \"/\\.${libext}$/d; /\\.lib$/d; $lo2o\" | $NL2SP`\" $reload_conv_objs\" ### testsuite: skip nested quoting test\n\n      output=\"$obj\"\n      func_execute_cmds \"$reload_cmds\" 'exit $?'\n\n      # Exit if we aren't doing a library object file.\n      if test -z \"$libobj\"; then\n\tif test -n \"$gentop\"; then\n\t  func_show_eval '${RM}r \"$gentop\"'\n\tfi\n\n\texit $EXIT_SUCCESS\n      fi\n\n      if test \"$build_libtool_libs\" != yes; then\n\tif test -n \"$gentop\"; then\n\t  func_show_eval '${RM}r \"$gentop\"'\n\tfi\n\n\t# Create an invalid libtool object if no PIC, so that we don't\n\t# accidentally link it into a program.\n\t# $show \"echo timestamp > $libobj\"\n\t# $opt_dry_run || eval \"echo timestamp > $libobj\" || exit $?\n\texit $EXIT_SUCCESS\n      fi\n\n      if test -n \"$pic_flag\" || test \"$pic_mode\" != default; then\n\t# Only do commands if we really have different PIC objects.\n\treload_objs=\"$libobjs $reload_conv_objs\"\n\toutput=\"$libobj\"\n\tfunc_execute_cmds \"$reload_cmds\" 'exit $?'\n      fi\n\n      if test -n \"$gentop\"; then\n\tfunc_show_eval '${RM}r \"$gentop\"'\n      fi\n\n      exit $EXIT_SUCCESS\n      ;;\n\n    prog)\n      case $host in\n\t*cygwin*) func_stripname '' '.exe' \"$output\"\n\t          output=$func_stripname_result.exe;;\n      esac\n      test -n \"$vinfo\" && \\\n\tfunc_warning \"\\`-version-info' is ignored for programs\"\n\n      test -n \"$release\" && \\\n\tfunc_warning \"\\`-release' is ignored for programs\"\n\n      test \"$preload\" = yes \\\n        && test \"$dlopen_support\" = unknown \\\n\t&& test \"$dlopen_self\" = unknown \\\n\t&& test \"$dlopen_self_static\" = unknown && \\\n\t  func_warning \"\\`LT_INIT([dlopen])' not used. Assuming no dlopen support.\"\n\n      case $host in\n      *-*-rhapsody* | *-*-darwin1.[012])\n\t# On Rhapsody replace the C library is the System framework\n\tcompile_deplibs=`$ECHO \" $compile_deplibs\" | $SED 's/ -lc / System.ltframework /'`\n\tfinalize_deplibs=`$ECHO \" $finalize_deplibs\" | $SED 's/ -lc / System.ltframework /'`\n\t;;\n      esac\n\n      case $host in\n      *-*-darwin*)\n\t# Don't allow lazy linking, it breaks C++ global constructors\n\t# But is supposedly fixed on 10.4 or later (yay!).\n\tif test \"$tagname\" = CXX ; then\n\t  case ${MACOSX_DEPLOYMENT_TARGET-10.0} in\n\t    10.[0123])\n\t      func_append compile_command \" ${wl}-bind_at_load\"\n\t      func_append finalize_command \" ${wl}-bind_at_load\"\n\t    ;;\n\t  esac\n\tfi\n\t# Time to change all our \"foo.ltframework\" stuff back to \"-framework foo\"\n\tcompile_deplibs=`$ECHO \" $compile_deplibs\" | $SED 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\tfinalize_deplibs=`$ECHO \" $finalize_deplibs\" | $SED 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\t;;\n      esac\n\n\n      # move library search paths that coincide with paths to not yet\n      # installed libraries to the beginning of the library search list\n      new_libs=\n      for path in $notinst_path; do\n\tcase \" $new_libs \" in\n\t*\" -L$path/$objdir \"*) ;;\n\t*)\n\t  case \" $compile_deplibs \" in\n\t  *\" -L$path/$objdir \"*)\n\t    func_append new_libs \" -L$path/$objdir\" ;;\n\t  esac\n\t  ;;\n\tesac\n      done\n      for deplib in $compile_deplibs; do\n\tcase $deplib in\n\t-L*)\n\t  case \" $new_libs \" in\n\t  *\" $deplib \"*) ;;\n\t  *) func_append new_libs \" $deplib\" ;;\n\t  esac\n\t  ;;\n\t*) func_append new_libs \" $deplib\" ;;\n\tesac\n      done\n      compile_deplibs=\"$new_libs\"\n\n\n      func_append compile_command \" $compile_deplibs\"\n      func_append finalize_command \" $finalize_deplibs\"\n\n      if test -n \"$rpath$xrpath\"; then\n\t# If the user specified any rpath flags, then add them.\n\tfor libdir in $rpath $xrpath; do\n\t  # This is the magic to use -rpath.\n\t  case \"$finalize_rpath \" in\n\t  *\" $libdir \"*) ;;\n\t  *) func_append finalize_rpath \" $libdir\" ;;\n\t  esac\n\tdone\n      fi\n\n      # Now hardcode the library paths\n      rpath=\n      hardcode_libdirs=\n      for libdir in $compile_rpath $finalize_rpath; do\n\tif test -n \"$hardcode_libdir_flag_spec\"; then\n\t  if test -n \"$hardcode_libdir_separator\"; then\n\t    if test -z \"$hardcode_libdirs\"; then\n\t      hardcode_libdirs=\"$libdir\"\n\t    else\n\t      # Just accumulate the unique libdirs.\n\t      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in\n\t      *\"$hardcode_libdir_separator$libdir$hardcode_libdir_separator\"*)\n\t\t;;\n\t      *)\n\t\tfunc_append hardcode_libdirs \"$hardcode_libdir_separator$libdir\"\n\t\t;;\n\t      esac\n\t    fi\n\t  else\n\t    eval flag=\\\"$hardcode_libdir_flag_spec\\\"\n\t    func_append rpath \" $flag\"\n\t  fi\n\telif test -n \"$runpath_var\"; then\n\t  case \"$perm_rpath \" in\n\t  *\" $libdir \"*) ;;\n\t  *) func_append perm_rpath \" $libdir\" ;;\n\t  esac\n\tfi\n\tcase $host in\n\t*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)\n\t  testbindir=`${ECHO} \"$libdir\" | ${SED} -e 's*/lib$*/bin*'`\n\t  case :$dllsearchpath: in\n\t  *\":$libdir:\"*) ;;\n\t  ::) dllsearchpath=$libdir;;\n\t  *) func_append dllsearchpath \":$libdir\";;\n\t  esac\n\t  case :$dllsearchpath: in\n\t  *\":$testbindir:\"*) ;;\n\t  ::) dllsearchpath=$testbindir;;\n\t  *) func_append dllsearchpath \":$testbindir\";;\n\t  esac\n\t  ;;\n\tesac\n      done\n      # Substitute the hardcoded libdirs into the rpath.\n      if test -n \"$hardcode_libdir_separator\" &&\n\t test -n \"$hardcode_libdirs\"; then\n\tlibdir=\"$hardcode_libdirs\"\n\teval rpath=\\\" $hardcode_libdir_flag_spec\\\"\n      fi\n      compile_rpath=\"$rpath\"\n\n      rpath=\n      hardcode_libdirs=\n      for libdir in $finalize_rpath; do\n\tif test -n \"$hardcode_libdir_flag_spec\"; then\n\t  if test -n \"$hardcode_libdir_separator\"; then\n\t    if test -z \"$hardcode_libdirs\"; then\n\t      hardcode_libdirs=\"$libdir\"\n\t    else\n\t      # Just accumulate the unique libdirs.\n\t      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in\n\t      *\"$hardcode_libdir_separator$libdir$hardcode_libdir_separator\"*)\n\t\t;;\n\t      *)\n\t\tfunc_append hardcode_libdirs \"$hardcode_libdir_separator$libdir\"\n\t\t;;\n\t      esac\n\t    fi\n\t  else\n\t    eval flag=\\\"$hardcode_libdir_flag_spec\\\"\n\t    func_append rpath \" $flag\"\n\t  fi\n\telif test -n \"$runpath_var\"; then\n\t  case \"$finalize_perm_rpath \" in\n\t  *\" $libdir \"*) ;;\n\t  *) func_append finalize_perm_rpath \" $libdir\" ;;\n\t  esac\n\tfi\n      done\n      # Substitute the hardcoded libdirs into the rpath.\n      if test -n \"$hardcode_libdir_separator\" &&\n\t test -n \"$hardcode_libdirs\"; then\n\tlibdir=\"$hardcode_libdirs\"\n\teval rpath=\\\" $hardcode_libdir_flag_spec\\\"\n      fi\n      finalize_rpath=\"$rpath\"\n\n      if test -n \"$libobjs\" && test \"$build_old_libs\" = yes; then\n\t# Transform all the library objects into standard objects.\n\tcompile_command=`$ECHO \"$compile_command\" | $SP2NL | $SED \"$lo2o\" | $NL2SP`\n\tfinalize_command=`$ECHO \"$finalize_command\" | $SP2NL | $SED \"$lo2o\" | $NL2SP`\n      fi\n\n      func_generate_dlsyms \"$outputname\" \"@PROGRAM@\" \"no\"\n\n      # template prelinking step\n      if test -n \"$prelink_cmds\"; then\n\tfunc_execute_cmds \"$prelink_cmds\" 'exit $?'\n      fi\n\n      wrappers_required=yes\n      case $host in\n      *cegcc* | *mingw32ce*)\n        # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.\n        wrappers_required=no\n        ;;\n      *cygwin* | *mingw* )\n        if test \"$build_libtool_libs\" != yes; then\n          wrappers_required=no\n        fi\n        ;;\n      *)\n        if test \"$need_relink\" = no || test \"$build_libtool_libs\" != yes; then\n          wrappers_required=no\n        fi\n        ;;\n      esac\n      if test \"$wrappers_required\" = no; then\n\t# Replace the output file specification.\n\tcompile_command=`$ECHO \"$compile_command\" | $SED 's%@OUTPUT@%'\"$output\"'%g'`\n\tlink_command=\"$compile_command$compile_rpath\"\n\n\t# We have no uninstalled library dependencies, so finalize right now.\n\texit_status=0\n\tfunc_show_eval \"$link_command\" 'exit_status=$?'\n\n\tif test -n \"$postlink_cmds\"; then\n\t  func_to_tool_file \"$output\"\n\t  postlink_cmds=`func_echo_all \"$postlink_cmds\" | $SED -e 's%@OUTPUT@%'\"$output\"'%g' -e 's%@TOOL_OUTPUT@%'\"$func_to_tool_file_result\"'%g'`\n\t  func_execute_cmds \"$postlink_cmds\" 'exit $?'\n\tfi\n\n\t# Delete the generated files.\n\tif test -f \"$output_objdir/${outputname}S.${objext}\"; then\n\t  func_show_eval '$RM \"$output_objdir/${outputname}S.${objext}\"'\n\tfi\n\n\texit $exit_status\n      fi\n\n      if test -n \"$compile_shlibpath$finalize_shlibpath\"; then\n\tcompile_command=\"$shlibpath_var=\\\"$compile_shlibpath$finalize_shlibpath\\$$shlibpath_var\\\" $compile_command\"\n      fi\n      if test -n \"$finalize_shlibpath\"; then\n\tfinalize_command=\"$shlibpath_var=\\\"$finalize_shlibpath\\$$shlibpath_var\\\" $finalize_command\"\n      fi\n\n      compile_var=\n      finalize_var=\n      if test -n \"$runpath_var\"; then\n\tif test -n \"$perm_rpath\"; then\n\t  # We should set the runpath_var.\n\t  rpath=\n\t  for dir in $perm_rpath; do\n\t    func_append rpath \"$dir:\"\n\t  done\n\t  compile_var=\"$runpath_var=\\\"$rpath\\$$runpath_var\\\" \"\n\tfi\n\tif test -n \"$finalize_perm_rpath\"; then\n\t  # We should set the runpath_var.\n\t  rpath=\n\t  for dir in $finalize_perm_rpath; do\n\t    func_append rpath \"$dir:\"\n\t  done\n\t  finalize_var=\"$runpath_var=\\\"$rpath\\$$runpath_var\\\" \"\n\tfi\n      fi\n\n      if test \"$no_install\" = yes; then\n\t# We don't need to create a wrapper script.\n\tlink_command=\"$compile_var$compile_command$compile_rpath\"\n\t# Replace the output file specification.\n\tlink_command=`$ECHO \"$link_command\" | $SED 's%@OUTPUT@%'\"$output\"'%g'`\n\t# Delete the old output file.\n\t$opt_dry_run || $RM $output\n\t# Link the executable and exit\n\tfunc_show_eval \"$link_command\" 'exit $?'\n\n\tif test -n \"$postlink_cmds\"; then\n\t  func_to_tool_file \"$output\"\n\t  postlink_cmds=`func_echo_all \"$postlink_cmds\" | $SED -e 's%@OUTPUT@%'\"$output\"'%g' -e 's%@TOOL_OUTPUT@%'\"$func_to_tool_file_result\"'%g'`\n\t  func_execute_cmds \"$postlink_cmds\" 'exit $?'\n\tfi\n\n\texit $EXIT_SUCCESS\n      fi\n\n      if test \"$hardcode_action\" = relink; then\n\t# Fast installation is not supported\n\tlink_command=\"$compile_var$compile_command$compile_rpath\"\n\trelink_command=\"$finalize_var$finalize_command$finalize_rpath\"\n\n\tfunc_warning \"this platform does not like uninstalled shared libraries\"\n\tfunc_warning \"\\`$output' will be relinked during installation\"\n      else\n\tif test \"$fast_install\" != no; then\n\t  link_command=\"$finalize_var$compile_command$finalize_rpath\"\n\t  if test \"$fast_install\" = yes; then\n\t    relink_command=`$ECHO \"$compile_var$compile_command$compile_rpath\" | $SED 's%@OUTPUT@%\\$progdir/\\$file%g'`\n\t  else\n\t    # fast_install is set to needless\n\t    relink_command=\n\t  fi\n\telse\n\t  link_command=\"$compile_var$compile_command$compile_rpath\"\n\t  relink_command=\"$finalize_var$finalize_command$finalize_rpath\"\n\tfi\n      fi\n\n      # Replace the output file specification.\n      link_command=`$ECHO \"$link_command\" | $SED 's%@OUTPUT@%'\"$output_objdir/$outputname\"'%g'`\n\n      # Delete the old output files.\n      $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname\n\n      func_show_eval \"$link_command\" 'exit $?'\n\n      if test -n \"$postlink_cmds\"; then\n\tfunc_to_tool_file \"$output_objdir/$outputname\"\n\tpostlink_cmds=`func_echo_all \"$postlink_cmds\" | $SED -e 's%@OUTPUT@%'\"$output_objdir/$outputname\"'%g' -e 's%@TOOL_OUTPUT@%'\"$func_to_tool_file_result\"'%g'`\n\tfunc_execute_cmds \"$postlink_cmds\" 'exit $?'\n      fi\n\n      # Now create the wrapper script.\n      func_verbose \"creating $output\"\n\n      # Quote the relink command for shipping.\n      if test -n \"$relink_command\"; then\n\t# Preserve any variables that may affect compiler behavior\n\tfor var in $variables_saved_for_relink; do\n\t  if eval test -z \\\"\\${$var+set}\\\"; then\n\t    relink_command=\"{ test -z \\\"\\${$var+set}\\\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command\"\n\t  elif eval var_value=\\$$var; test -z \"$var_value\"; then\n\t    relink_command=\"$var=; export $var; $relink_command\"\n\t  else\n\t    func_quote_for_eval \"$var_value\"\n\t    relink_command=\"$var=$func_quote_for_eval_result; export $var; $relink_command\"\n\t  fi\n\tdone\n\trelink_command=\"(cd `pwd`; $relink_command)\"\n\trelink_command=`$ECHO \"$relink_command\" | $SED \"$sed_quote_subst\"`\n      fi\n\n      # Only actually do things if not in dry run mode.\n      $opt_dry_run || {\n\t# win32 will think the script is a binary if it has\n\t# a .exe suffix, so we strip it off here.\n\tcase $output in\n\t  *.exe) func_stripname '' '.exe' \"$output\"\n\t         output=$func_stripname_result ;;\n\tesac\n\t# test for cygwin because mv fails w/o .exe extensions\n\tcase $host in\n\t  *cygwin*)\n\t    exeext=.exe\n\t    func_stripname '' '.exe' \"$outputname\"\n\t    outputname=$func_stripname_result ;;\n\t  *) exeext= ;;\n\tesac\n\tcase $host in\n\t  *cygwin* | *mingw* )\n\t    func_dirname_and_basename \"$output\" \"\" \".\"\n\t    output_name=$func_basename_result\n\t    output_path=$func_dirname_result\n\t    cwrappersource=\"$output_path/$objdir/lt-$output_name.c\"\n\t    cwrapper=\"$output_path/$output_name.exe\"\n\t    $RM $cwrappersource $cwrapper\n\t    trap \"$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE\" 1 2 15\n\n\t    func_emit_cwrapperexe_src > $cwrappersource\n\n\t    # The wrapper executable is built using the $host compiler,\n\t    # because it contains $host paths and files. If cross-\n\t    # compiling, it, like the target executable, must be\n\t    # executed on the $host or under an emulation environment.\n\t    $opt_dry_run || {\n\t      $LTCC $LTCFLAGS -o $cwrapper $cwrappersource\n\t      $STRIP $cwrapper\n\t    }\n\n\t    # Now, create the wrapper script for func_source use:\n\t    func_ltwrapper_scriptname $cwrapper\n\t    $RM $func_ltwrapper_scriptname_result\n\t    trap \"$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE\" 1 2 15\n\t    $opt_dry_run || {\n\t      # note: this script will not be executed, so do not chmod.\n\t      if test \"x$build\" = \"x$host\" ; then\n\t\t$cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result\n\t      else\n\t\tfunc_emit_wrapper no > $func_ltwrapper_scriptname_result\n\t      fi\n\t    }\n\t  ;;\n\t  * )\n\t    $RM $output\n\t    trap \"$RM $output; exit $EXIT_FAILURE\" 1 2 15\n\n\t    func_emit_wrapper no > $output\n\t    chmod +x $output\n\t  ;;\n\tesac\n      }\n      exit $EXIT_SUCCESS\n      ;;\n    esac\n\n    # See if we need to build an old-fashioned archive.\n    for oldlib in $oldlibs; do\n\n      if test \"$build_libtool_libs\" = convenience; then\n\toldobjs=\"$libobjs_save $symfileobj\"\n\taddlibs=\"$convenience\"\n\tbuild_libtool_libs=no\n      else\n\tif test \"$build_libtool_libs\" = module; then\n\t  oldobjs=\"$libobjs_save\"\n\t  build_libtool_libs=no\n\telse\n\t  oldobjs=\"$old_deplibs $non_pic_objects\"\n\t  if test \"$preload\" = yes && test -f \"$symfileobj\"; then\n\t    func_append oldobjs \" $symfileobj\"\n\t  fi\n\tfi\n\taddlibs=\"$old_convenience\"\n      fi\n\n      if test -n \"$addlibs\"; then\n\tgentop=\"$output_objdir/${outputname}x\"\n\tfunc_append generated \" $gentop\"\n\n\tfunc_extract_archives $gentop $addlibs\n\tfunc_append oldobjs \" $func_extract_archives_result\"\n      fi\n\n      # Do each command in the archive commands.\n      if test -n \"$old_archive_from_new_cmds\" && test \"$build_libtool_libs\" = yes; then\n\tcmds=$old_archive_from_new_cmds\n      else\n\n\t# Add any objects from preloaded convenience libraries\n\tif test -n \"$dlprefiles\"; then\n\t  gentop=\"$output_objdir/${outputname}x\"\n\t  func_append generated \" $gentop\"\n\n\t  func_extract_archives $gentop $dlprefiles\n\t  func_append oldobjs \" $func_extract_archives_result\"\n\tfi\n\n\t# POSIX demands no paths to be encoded in archives.  We have\n\t# to avoid creating archives with duplicate basenames if we\n\t# might have to extract them afterwards, e.g., when creating a\n\t# static archive out of a convenience library, or when linking\n\t# the entirety of a libtool archive into another (currently\n\t# not supported by libtool).\n\tif (for obj in $oldobjs\n\t    do\n\t      func_basename \"$obj\"\n\t      $ECHO \"$func_basename_result\"\n\t    done | sort | sort -uc >/dev/null 2>&1); then\n\t  :\n\telse\n\t  echo \"copying selected object files to avoid basename conflicts...\"\n\t  gentop=\"$output_objdir/${outputname}x\"\n\t  func_append generated \" $gentop\"\n\t  func_mkdir_p \"$gentop\"\n\t  save_oldobjs=$oldobjs\n\t  oldobjs=\n\t  counter=1\n\t  for obj in $save_oldobjs\n\t  do\n\t    func_basename \"$obj\"\n\t    objbase=\"$func_basename_result\"\n\t    case \" $oldobjs \" in\n\t    \" \") oldobjs=$obj ;;\n\t    *[\\ /]\"$objbase \"*)\n\t      while :; do\n\t\t# Make sure we don't pick an alternate name that also\n\t\t# overlaps.\n\t\tnewobj=lt$counter-$objbase\n\t\tfunc_arith $counter + 1\n\t\tcounter=$func_arith_result\n\t\tcase \" $oldobjs \" in\n\t\t*[\\ /]\"$newobj \"*) ;;\n\t\t*) if test ! -f \"$gentop/$newobj\"; then break; fi ;;\n\t\tesac\n\t      done\n\t      func_show_eval \"ln $obj $gentop/$newobj || cp $obj $gentop/$newobj\"\n\t      func_append oldobjs \" $gentop/$newobj\"\n\t      ;;\n\t    *) func_append oldobjs \" $obj\" ;;\n\t    esac\n\t  done\n\tfi\n\tfunc_to_tool_file \"$oldlib\" func_convert_file_msys_to_w32\n\ttool_oldlib=$func_to_tool_file_result\n\teval cmds=\\\"$old_archive_cmds\\\"\n\n\tfunc_len \" $cmds\"\n\tlen=$func_len_result\n\tif test \"$len\" -lt \"$max_cmd_len\" || test \"$max_cmd_len\" -le -1; then\n\t  cmds=$old_archive_cmds\n\telif test -n \"$archiver_list_spec\"; then\n\t  func_verbose \"using command file archive linking...\"\n\t  for obj in $oldobjs\n\t  do\n\t    func_to_tool_file \"$obj\"\n\t    $ECHO \"$func_to_tool_file_result\"\n\t  done > $output_objdir/$libname.libcmd\n\t  func_to_tool_file \"$output_objdir/$libname.libcmd\"\n\t  oldobjs=\" $archiver_list_spec$func_to_tool_file_result\"\n\t  cmds=$old_archive_cmds\n\telse\n\t  # the command line is too long to link in one step, link in parts\n\t  func_verbose \"using piecewise archive linking...\"\n\t  save_RANLIB=$RANLIB\n\t  RANLIB=:\n\t  objlist=\n\t  concat_cmds=\n\t  save_oldobjs=$oldobjs\n\t  oldobjs=\n\t  # Is there a better way of finding the last object in the list?\n\t  for obj in $save_oldobjs\n\t  do\n\t    last_oldobj=$obj\n\t  done\n\t  eval test_cmds=\\\"$old_archive_cmds\\\"\n\t  func_len \" $test_cmds\"\n\t  len0=$func_len_result\n\t  len=$len0\n\t  for obj in $save_oldobjs\n\t  do\n\t    func_len \" $obj\"\n\t    func_arith $len + $func_len_result\n\t    len=$func_arith_result\n\t    func_append objlist \" $obj\"\n\t    if test \"$len\" -lt \"$max_cmd_len\"; then\n\t      :\n\t    else\n\t      # the above command should be used before it gets too long\n\t      oldobjs=$objlist\n\t      if test \"$obj\" = \"$last_oldobj\" ; then\n\t\tRANLIB=$save_RANLIB\n\t      fi\n\t      test -z \"$concat_cmds\" || concat_cmds=$concat_cmds~\n\t      eval concat_cmds=\\\"\\${concat_cmds}$old_archive_cmds\\\"\n\t      objlist=\n\t      len=$len0\n\t    fi\n\t  done\n\t  RANLIB=$save_RANLIB\n\t  oldobjs=$objlist\n\t  if test \"X$oldobjs\" = \"X\" ; then\n\t    eval cmds=\\\"\\$concat_cmds\\\"\n\t  else\n\t    eval cmds=\\\"\\$concat_cmds~\\$old_archive_cmds\\\"\n\t  fi\n\tfi\n      fi\n      func_execute_cmds \"$cmds\" 'exit $?'\n    done\n\n    test -n \"$generated\" && \\\n      func_show_eval \"${RM}r$generated\"\n\n    # Now create the libtool archive.\n    case $output in\n    *.la)\n      old_library=\n      test \"$build_old_libs\" = yes && old_library=\"$libname.$libext\"\n      func_verbose \"creating $output\"\n\n      # Preserve any variables that may affect compiler behavior\n      for var in $variables_saved_for_relink; do\n\tif eval test -z \\\"\\${$var+set}\\\"; then\n\t  relink_command=\"{ test -z \\\"\\${$var+set}\\\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command\"\n\telif eval var_value=\\$$var; test -z \"$var_value\"; then\n\t  relink_command=\"$var=; export $var; $relink_command\"\n\telse\n\t  func_quote_for_eval \"$var_value\"\n\t  relink_command=\"$var=$func_quote_for_eval_result; export $var; $relink_command\"\n\tfi\n      done\n      # Quote the link command for shipping.\n      relink_command=\"(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)\"\n      relink_command=`$ECHO \"$relink_command\" | $SED \"$sed_quote_subst\"`\n      if test \"$hardcode_automatic\" = yes ; then\n\trelink_command=\n      fi\n\n      # Only create the output if not a dry run.\n      $opt_dry_run || {\n\tfor installed in no yes; do\n\t  if test \"$installed\" = yes; then\n\t    if test -z \"$install_libdir\"; then\n\t      break\n\t    fi\n\t    output=\"$output_objdir/$outputname\"i\n\t    # Replace all uninstalled libtool libraries with the installed ones\n\t    newdependency_libs=\n\t    for deplib in $dependency_libs; do\n\t      case $deplib in\n\t      *.la)\n\t\tfunc_basename \"$deplib\"\n\t\tname=\"$func_basename_result\"\n\t\tfunc_resolve_sysroot \"$deplib\"\n\t\teval libdir=`${SED} -n -e 's/^libdir=\\(.*\\)$/\\1/p' $func_resolve_sysroot_result`\n\t\ttest -z \"$libdir\" && \\\n\t\t  func_fatal_error \"\\`$deplib' is not a valid libtool archive\"\n\t\tfunc_append newdependency_libs \" ${lt_sysroot:+=}$libdir/$name\"\n\t\t;;\n\t      -L*)\n\t\tfunc_stripname -L '' \"$deplib\"\n\t\tfunc_replace_sysroot \"$func_stripname_result\"\n\t\tfunc_append newdependency_libs \" -L$func_replace_sysroot_result\"\n\t\t;;\n\t      -R*)\n\t\tfunc_stripname -R '' \"$deplib\"\n\t\tfunc_replace_sysroot \"$func_stripname_result\"\n\t\tfunc_append newdependency_libs \" -R$func_replace_sysroot_result\"\n\t\t;;\n\t      *) func_append newdependency_libs \" $deplib\" ;;\n\t      esac\n\t    done\n\t    dependency_libs=\"$newdependency_libs\"\n\t    newdlfiles=\n\n\t    for lib in $dlfiles; do\n\t      case $lib in\n\t      *.la)\n\t        func_basename \"$lib\"\n\t\tname=\"$func_basename_result\"\n\t\teval libdir=`${SED} -n -e 's/^libdir=\\(.*\\)$/\\1/p' $lib`\n\t\ttest -z \"$libdir\" && \\\n\t\t  func_fatal_error \"\\`$lib' is not a valid libtool archive\"\n\t\tfunc_append newdlfiles \" ${lt_sysroot:+=}$libdir/$name\"\n\t\t;;\n\t      *) func_append newdlfiles \" $lib\" ;;\n\t      esac\n\t    done\n\t    dlfiles=\"$newdlfiles\"\n\t    newdlprefiles=\n\t    for lib in $dlprefiles; do\n\t      case $lib in\n\t      *.la)\n\t\t# Only pass preopened files to the pseudo-archive (for\n\t\t# eventual linking with the app. that links it) if we\n\t\t# didn't already link the preopened objects directly into\n\t\t# the library:\n\t\tfunc_basename \"$lib\"\n\t\tname=\"$func_basename_result\"\n\t\teval libdir=`${SED} -n -e 's/^libdir=\\(.*\\)$/\\1/p' $lib`\n\t\ttest -z \"$libdir\" && \\\n\t\t  func_fatal_error \"\\`$lib' is not a valid libtool archive\"\n\t\tfunc_append newdlprefiles \" ${lt_sysroot:+=}$libdir/$name\"\n\t\t;;\n\t      esac\n\t    done\n\t    dlprefiles=\"$newdlprefiles\"\n\t  else\n\t    newdlfiles=\n\t    for lib in $dlfiles; do\n\t      case $lib in\n\t\t[\\\\/]* | [A-Za-z]:[\\\\/]*) abs=\"$lib\" ;;\n\t\t*) abs=`pwd`\"/$lib\" ;;\n\t      esac\n\t      func_append newdlfiles \" $abs\"\n\t    done\n\t    dlfiles=\"$newdlfiles\"\n\t    newdlprefiles=\n\t    for lib in $dlprefiles; do\n\t      case $lib in\n\t\t[\\\\/]* | [A-Za-z]:[\\\\/]*) abs=\"$lib\" ;;\n\t\t*) abs=`pwd`\"/$lib\" ;;\n\t      esac\n\t      func_append newdlprefiles \" $abs\"\n\t    done\n\t    dlprefiles=\"$newdlprefiles\"\n\t  fi\n\t  $RM $output\n\t  # place dlname in correct position for cygwin\n\t  # In fact, it would be nice if we could use this code for all target\n\t  # systems that can't hard-code library paths into their executables\n\t  # and that have no shared library path variable independent of PATH,\n\t  # but it turns out we can't easily determine that from inspecting\n\t  # libtool variables, so we have to hard-code the OSs to which it\n\t  # applies here; at the moment, that means platforms that use the PE\n\t  # object format with DLL files.  See the long comment at the top of\n\t  # tests/bindir.at for full details.\n\t  tdlname=$dlname\n\t  case $host,$output,$installed,$module,$dlname in\n\t    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)\n\t      # If a -bindir argument was supplied, place the dll there.\n\t      if test \"x$bindir\" != x ;\n\t      then\n\t\tfunc_relative_path \"$install_libdir\" \"$bindir\"\n\t\ttdlname=$func_relative_path_result$dlname\n\t      else\n\t\t# Otherwise fall back on heuristic.\n\t\ttdlname=../bin/$dlname\n\t      fi\n\t      ;;\n\t  esac\n\t  $ECHO > $output \"\\\n# $outputname - a libtool library file\n# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION\n#\n# Please DO NOT delete this file!\n# It is necessary for linking the library.\n\n# The name that we can dlopen(3).\ndlname='$tdlname'\n\n# Names of this library.\nlibrary_names='$library_names'\n\n# The name of the static archive.\nold_library='$old_library'\n\n# Linker flags that can not go in dependency_libs.\ninherited_linker_flags='$new_inherited_linker_flags'\n\n# Libraries that this one depends upon.\ndependency_libs='$dependency_libs'\n\n# Names of additional weak libraries provided by this library\nweak_library_names='$weak_libs'\n\n# Version information for $libname.\ncurrent=$current\nage=$age\nrevision=$revision\n\n# Is this an already installed library?\ninstalled=$installed\n\n# Should we warn about portability when linking against -modules?\nshouldnotlink=$module\n\n# Files to dlopen/dlpreopen\ndlopen='$dlfiles'\ndlpreopen='$dlprefiles'\n\n# Directory that this library needs to be installed in:\nlibdir='$install_libdir'\"\n\t  if test \"$installed\" = no && test \"$need_relink\" = yes; then\n\t    $ECHO >> $output \"\\\nrelink_command=\\\"$relink_command\\\"\"\n\t  fi\n\tdone\n      }\n\n      # Do a symbolic link so that the libtool archive can be found in\n      # LD_LIBRARY_PATH before the program is installed.\n      func_show_eval '( cd \"$output_objdir\" && $RM \"$outputname\" && $LN_S \"../$outputname\" \"$outputname\" )' 'exit $?'\n      ;;\n    esac\n    exit $EXIT_SUCCESS\n}\n\n{ test \"$opt_mode\" = link || test \"$opt_mode\" = relink; } &&\n    func_mode_link ${1+\"$@\"}\n\n\n# func_mode_uninstall arg...\nfunc_mode_uninstall ()\n{\n    $opt_debug\n    RM=\"$nonopt\"\n    files=\n    rmforce=\n    exit_status=0\n\n    # This variable tells wrapper scripts just to set variables rather\n    # than running their programs.\n    libtool_install_magic=\"$magic\"\n\n    for arg\n    do\n      case $arg in\n      -f) func_append RM \" $arg\"; rmforce=yes ;;\n      -*) func_append RM \" $arg\" ;;\n      *) func_append files \" $arg\" ;;\n      esac\n    done\n\n    test -z \"$RM\" && \\\n      func_fatal_help \"you must specify an RM program\"\n\n    rmdirs=\n\n    for file in $files; do\n      func_dirname \"$file\" \"\" \".\"\n      dir=\"$func_dirname_result\"\n      if test \"X$dir\" = X.; then\n\todir=\"$objdir\"\n      else\n\todir=\"$dir/$objdir\"\n      fi\n      func_basename \"$file\"\n      name=\"$func_basename_result\"\n      test \"$opt_mode\" = uninstall && odir=\"$dir\"\n\n      # Remember odir for removal later, being careful to avoid duplicates\n      if test \"$opt_mode\" = clean; then\n\tcase \" $rmdirs \" in\n\t  *\" $odir \"*) ;;\n\t  *) func_append rmdirs \" $odir\" ;;\n\tesac\n      fi\n\n      # Don't error if the file doesn't exist and rm -f was used.\n      if { test -L \"$file\"; } >/dev/null 2>&1 ||\n\t { test -h \"$file\"; } >/dev/null 2>&1 ||\n\t test -f \"$file\"; then\n\t:\n      elif test -d \"$file\"; then\n\texit_status=1\n\tcontinue\n      elif test \"$rmforce\" = yes; then\n\tcontinue\n      fi\n\n      rmfiles=\"$file\"\n\n      case $name in\n      *.la)\n\t# Possibly a libtool archive, so verify it.\n\tif func_lalib_p \"$file\"; then\n\t  func_source $dir/$name\n\n\t  # Delete the libtool libraries and symlinks.\n\t  for n in $library_names; do\n\t    func_append rmfiles \" $odir/$n\"\n\t  done\n\t  test -n \"$old_library\" && func_append rmfiles \" $odir/$old_library\"\n\n\t  case \"$opt_mode\" in\n\t  clean)\n\t    case \" $library_names \" in\n\t    *\" $dlname \"*) ;;\n\t    *) test -n \"$dlname\" && func_append rmfiles \" $odir/$dlname\" ;;\n\t    esac\n\t    test -n \"$libdir\" && func_append rmfiles \" $odir/$name $odir/${name}i\"\n\t    ;;\n\t  uninstall)\n\t    if test -n \"$library_names\"; then\n\t      # Do each command in the postuninstall commands.\n\t      func_execute_cmds \"$postuninstall_cmds\" 'test \"$rmforce\" = yes || exit_status=1'\n\t    fi\n\n\t    if test -n \"$old_library\"; then\n\t      # Do each command in the old_postuninstall commands.\n\t      func_execute_cmds \"$old_postuninstall_cmds\" 'test \"$rmforce\" = yes || exit_status=1'\n\t    fi\n\t    # FIXME: should reinstall the best remaining shared library.\n\t    ;;\n\t  esac\n\tfi\n\t;;\n\n      *.lo)\n\t# Possibly a libtool object, so verify it.\n\tif func_lalib_p \"$file\"; then\n\n\t  # Read the .lo file\n\t  func_source $dir/$name\n\n\t  # Add PIC object to the list of files to remove.\n\t  if test -n \"$pic_object\" &&\n\t     test \"$pic_object\" != none; then\n\t    func_append rmfiles \" $dir/$pic_object\"\n\t  fi\n\n\t  # Add non-PIC object to the list of files to remove.\n\t  if test -n \"$non_pic_object\" &&\n\t     test \"$non_pic_object\" != none; then\n\t    func_append rmfiles \" $dir/$non_pic_object\"\n\t  fi\n\tfi\n\t;;\n\n      *)\n\tif test \"$opt_mode\" = clean ; then\n\t  noexename=$name\n\t  case $file in\n\t  *.exe)\n\t    func_stripname '' '.exe' \"$file\"\n\t    file=$func_stripname_result\n\t    func_stripname '' '.exe' \"$name\"\n\t    noexename=$func_stripname_result\n\t    # $file with .exe has already been added to rmfiles,\n\t    # add $file without .exe\n\t    func_append rmfiles \" $file\"\n\t    ;;\n\t  esac\n\t  # Do a test to see if this is a libtool program.\n\t  if func_ltwrapper_p \"$file\"; then\n\t    if func_ltwrapper_executable_p \"$file\"; then\n\t      func_ltwrapper_scriptname \"$file\"\n\t      relink_command=\n\t      func_source $func_ltwrapper_scriptname_result\n\t      func_append rmfiles \" $func_ltwrapper_scriptname_result\"\n\t    else\n\t      relink_command=\n\t      func_source $dir/$noexename\n\t    fi\n\n\t    # note $name still contains .exe if it was in $file originally\n\t    # as does the version of $file that was added into $rmfiles\n\t    func_append rmfiles \" $odir/$name $odir/${name}S.${objext}\"\n\t    if test \"$fast_install\" = yes && test -n \"$relink_command\"; then\n\t      func_append rmfiles \" $odir/lt-$name\"\n\t    fi\n\t    if test \"X$noexename\" != \"X$name\" ; then\n\t      func_append rmfiles \" $odir/lt-${noexename}.c\"\n\t    fi\n\t  fi\n\tfi\n\t;;\n      esac\n      func_show_eval \"$RM $rmfiles\" 'exit_status=1'\n    done\n\n    # Try to remove the ${objdir}s in the directories where we deleted files\n    for dir in $rmdirs; do\n      if test -d \"$dir\"; then\n\tfunc_show_eval \"rmdir $dir >/dev/null 2>&1\"\n      fi\n    done\n\n    exit $exit_status\n}\n\n{ test \"$opt_mode\" = uninstall || test \"$opt_mode\" = clean; } &&\n    func_mode_uninstall ${1+\"$@\"}\n\ntest -z \"$opt_mode\" && {\n  help=\"$generic_help\"\n  func_fatal_help \"you must specify a MODE\"\n}\n\ntest -z \"$exec_cmd\" && \\\n  func_fatal_help \"invalid operation mode \\`$opt_mode'\"\n\nif test -n \"$exec_cmd\"; then\n  eval exec \"$exec_cmd\"\n  exit $EXIT_FAILURE\nfi\n\nexit $exit_status\n\n\n# The TAGs below are defined such that we never get into a situation\n# in which we disable both kinds of libraries.  Given conflicting\n# choices, we go for a static library, that is the most portable,\n# since we can't tell whether shared libraries were disabled because\n# the user asked for that or because the platform doesn't support\n# them.  This is particularly important on AIX, because we don't\n# support having both static and shared libraries enabled at the same\n# time on that platform, so we default to a shared-only configuration.\n# If a disable-shared tag is given, we'll fallback to a static-only\n# configuration.  But we'll never go from static-only to shared-only.\n\n# ### BEGIN LIBTOOL TAG CONFIG: disable-shared\nbuild_libtool_libs=no\nbuild_old_libs=yes\n# ### END LIBTOOL TAG CONFIG: disable-shared\n\n# ### BEGIN LIBTOOL TAG CONFIG: disable-static\nbuild_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`\n# ### END LIBTOOL TAG CONFIG: disable-static\n\n# Local Variables:\n# mode:shell-script\n# sh-indentation:2\n# End:\n# vi:sw=2\n\n"
  },
  {
    "path": "libs/CoMISo/gmm/m4/ax_check_cxx_flag.m4",
    "content": "dnl based on http://www.gnu.org/software/ac-archive/htmldoc/ac_check_cc_opt.html\ndnl from Guido Draheim <guidod@gmx.de>\nAC_DEFUN([AC_CHECK_CXX_FLAG],\n[AC_MSG_CHECKING([whether ${CXX} accepts $1])\n\necho 'int main(){}' > conftest.c\nif test -z \"`${CXX} $1 -o conftest conftest.c 2>&1`\"; then\n  $2=\"${$2} $1\"\n  echo \"yes\"\nelse\n  echo \"no\"\nfi\ndnl echo \"$2=${$2}\"\nrm -f conftest*\n])\n\n"
  },
  {
    "path": "libs/CoMISo/gmm/m4/ax_prefix_config_h.m4",
    "content": "dnl @synopsis AX_PREFIX_CONFIG_H [(OUTPUT-HEADER [,PREFIX [,ORIG-HEADER]])]\ndnl\ndnl This is a new variant from ac_prefix_config_ this one will use a\ndnl lowercase-prefix if the config-define was starting with a\ndnl lowercase-char, e.g. \"#define const\", \"#define restrict\", or\ndnl \"#define off_t\", (and this one can live in another directory, e.g.\ndnl testpkg/config.h therefore I decided to move the output-header to\ndnl be the first arg)\ndnl\ndnl takes the usual config.h generated header file; looks for each of\ndnl the generated \"#define SOMEDEF\" lines, and prefixes the defined name\ndnl (ie. makes it \"#define PREFIX_SOMEDEF\". The result is written to\ndnl the output config.header file. The PREFIX is converted to uppercase\ndnl for the conversions.\ndnl\ndnl Defaults:\ndnl\ndnl   OUTPUT-HEADER = $PACKAGE-config.h\ndnl   PREFIX = $PACKAGE\ndnl   ORIG-HEADER, from AM_CONFIG_HEADER(config.h)\ndnl\ndnl Your configure.ac script should contain both macros in this order,\ndnl and unlike the earlier variations of this prefix-macro it is okay to\ndnl place the AX_PREFIX_CONFIG_H call before the AC_OUTPUT invokation.\ndnl\ndnl Example:\ndnl\ndnl   AC_INIT(config.h.in)        # config.h.in as created by \"autoheader\"\ndnl   AM_INIT_AUTOMAKE(testpkg, 0.1.1)    # makes #undef VERSION and PACKAGE\ndnl   AM_CONFIG_HEADER(config.h)          # prep config.h from config.h.in\ndnl   AX_PREFIX_CONFIG_H(mylib/_config.h) # prep mylib/_config.h from it..\ndnl   AC_MEMORY_H                         # makes \"#undef NEED_MEMORY_H\"\ndnl   AC_C_CONST_H                        # makes \"#undef const\"\ndnl   AC_OUTPUT(Makefile)                 # creates the \"config.h\" now\ndnl                                       # and also mylib/_config.h\ndnl\ndnl if the argument to AX_PREFIX_CONFIG_H would have been omitted then the\ndnl default outputfile would have been called simply \"testpkg-config.h\", but\ndnl even under the name \"mylib/_config.h\" it contains prefix-defines like\ndnl\ndnl   #ifndef TESTPKG_VERSION\ndnl   #define TESTPKG_VERSION \"0.1.1\"\ndnl   #endif\ndnl   #ifndef TESTPKG_NEED_MEMORY_H\ndnl   #define TESTPKG_NEED_MEMORY_H 1\ndnl   #endif\ndnl   #ifndef _testpkg_const\ndnl   #define _testpkg_const _const\ndnl   #endif\ndnl\ndnl and this \"mylib/_config.h\" can be installed along with other\ndnl header-files, which is most convenient when creating a shared\ndnl library (that has some headers) where some functionality is\ndnl dependent on the OS-features detected at compile-time. No\ndnl need to invent some \"mylib-confdefs.h.in\" manually. :-)\ndnl\ndnl Note that some AC_DEFINEs that end up in the config.h file are\ndnl actually self-referential - e.g. AC_C_INLINE, AC_C_CONST, and the\ndnl AC_TYPE_OFF_T say that they \"will define inline|const|off_t if the\ndnl system does not do it by itself\". You might want to clean up about\ndnl these - consider an extra mylib/conf.h that reads something like:\ndnl\ndnl    #include <mylib/_config.h>\ndnl    #ifndef _testpkg_const\ndnl    #define _testpkg_const const\ndnl    #endif\ndnl\ndnl and then start using _testpkg_const in the header files. That is\ndnl also a good thing to differentiate whether some library-user has\ndnl starting to take up with a different compiler, so perhaps it could\ndnl read something like this:\ndnl\ndnl   #ifdef _MSC_VER\ndnl   #include <mylib/_msvc.h>\ndnl   #else\ndnl   #include <mylib/_config.h>\ndnl   #endif\ndnl   #ifndef _testpkg_const\ndnl   #define _testpkg_const const\ndnl   #endif\ndnl\ndnl @version $Id: ax_prefix_config_h.m4 1867 2005-01-27 14:04:04Z pommier $\ndnl @author  Guiodo Draheim <guidod@gmx.de>\ndnl\nAC_DEFUN([AX_PREFIX_CONFIG_H],[AC_REQUIRE([AC_CONFIG_HEADER])\nAC_CONFIG_COMMANDS([ifelse($1,,$PACKAGE-config.h,$1)],[dnl\nAS_VAR_PUSHDEF([_OUT],[ac_prefix_conf_OUT])dnl\nAS_VAR_PUSHDEF([_DEF],[ac_prefix_conf_DEF])dnl\nAS_VAR_PUSHDEF([_PKG],[ac_prefix_conf_PKG])dnl\nAS_VAR_PUSHDEF([_LOW],[ac_prefix_conf_LOW])dnl\nAS_VAR_PUSHDEF([_UPP],[ac_prefix_conf_UPP])dnl\nAS_VAR_PUSHDEF([_INP],[ac_prefix_conf_INP])dnl\nm4_pushdef([_script],[conftest.prefix])dnl\nm4_pushdef([_symbol],[m4_cr_Letters[]m4_cr_digits[]_])dnl\n_OUT=`echo ifelse($1, , $PACKAGE-config.h, $1)`\n_DEF=`echo _$_OUT | sed -e \"y:m4_cr_letters:m4_cr_LETTERS[]:\" -e \"s/@<:@^m4_cr_Letters@:>@/_/g\"`\n_PKG=`echo ifelse($2, , $PACKAGE, $2)`\n_LOW=`echo _$_PKG | sed -e \"y:m4_cr_LETTERS-:m4_cr_letters[]_:\"`\n_UPP=`echo $_PKG | sed -e \"y:m4_cr_letters-:m4_cr_LETTERS[]_:\"  -e \"/^@<:@m4_cr_digits@:>@/s/^/_/\"`\n_INP=`echo \"ifelse($3,,,$3)\" | sed -e 's/ *//'`\nif test \".$_INP\" = \".\"; then\n   for ac_file in : $CONFIG_HEADERS; do test \"_$ac_file\" = _: && continue\n     case \"$ac_file\" in\n        *.h) _INP=$ac_file ;;\n        *)\n     esac\n     test \".$_INP\" != \".\" && break\n   done\nfi\nif test \".$_INP\" = \".\"; then\n   case \"$_OUT\" in\n      */*) _INP=`basename \"$_OUT\"`\n      ;;\n      *-*) _INP=`echo \"$_OUT\" | sed -e \"s/@<:@_symbol@:>@*-//\"`\n      ;;\n      *) _INP=config.h\n      ;;\n   esac\nfi\nif test -z \"$_PKG\" ; then\n   AC_MSG_ERROR([no prefix for _PREFIX_PKG_CONFIG_H])\nelse\n  if test ! -f \"$_INP\" ; then if test -f \"$srcdir/$_INP\" ; then\n     _INP=\"$srcdir/$_INP\"\n  fi fi\n  AC_MSG_NOTICE(creating $_OUT - prefix $_UPP for $_INP defines)\n  if test -f $_INP ; then\n    echo \"s/@%:@undef  *\\\\(@<:@m4_cr_LETTERS[]_@:>@\\\\)/@%:@undef $_UPP\"\"_\\\\1/\" > _script\n    echo \"s/@%:@undef  *\\\\(@<:@m4_cr_letters@:>@\\\\)/@%:@undef $_LOW\"\"_\\\\1/\" >> _script\n    echo \"s/@%:@def[]ine  *\\\\(@<:@m4_cr_LETTERS[]_@:>@@<:@_symbol@:>@*\\\\)\\\\(.*\\\\)/@%:@ifndef $_UPP\"\"_\\\\1 \\\\\" >> _script\n    echo \"@%:@def[]ine $_UPP\"\"_\\\\1 \\\\2 \\\\\" >> _script\n    echo \"@%:@endif/\" >>_script\n    echo \"s/@%:@def[]ine  *\\\\(@<:@m4_cr_letters@:>@@<:@_symbol@:>@*\\\\)\\\\(.*\\\\)/@%:@ifndef $_LOW\"\"_\\\\1 \\\\\" >> _script\n    echo \"@%:@define $_LOW\"\"_\\\\1 \\\\2 \\\\\" >> _script\n    echo \"@%:@endif/\" >> _script\n    # now executing _script on _DEF input to create _OUT output file\n    echo \"@%:@ifndef $_DEF\"      >$tmp/pconfig.h\n    echo \"@%:@def[]ine $_DEF 1\" >>$tmp/pconfig.h\n    echo ' ' >>$tmp/pconfig.h\n    echo /'*' $_OUT. Generated automatically at end of configure. '*'/ >>$tmp/pconfig.h\n\n    sed -f _script $_INP >>$tmp/pconfig.h\n    echo ' ' >>$tmp/pconfig.h\n    echo '/* once:' $_DEF '*/' >>$tmp/pconfig.h\n    echo \"@%:@endif\" >>$tmp/pconfig.h\n    if cmp -s $_OUT $tmp/pconfig.h 2>/dev/null; then\n      AC_MSG_NOTICE([$_OUT is unchanged])\n    else\n      ac_dir=`AS_DIRNAME([\"$_OUT\"])`\n      AS_MKDIR_P([\"$ac_dir\"])\n      rm -f \"$_OUT\"\n      mv $tmp/pconfig.h \"$_OUT\"\n    fi\n    cp _script _configs.sed\n  else\n    AC_MSG_ERROR([input file $_INP does not exist - skip generating $_OUT])\n  fi\n  rm -f conftest.*\nfi\nm4_popdef([_symbol])dnl\nm4_popdef([_script])dnl\nAS_VAR_POPDEF([_INP])dnl\nAS_VAR_POPDEF([_UPP])dnl\nAS_VAR_POPDEF([_LOW])dnl\nAS_VAR_POPDEF([_PKG])dnl\nAS_VAR_POPDEF([_DEF])dnl\nAS_VAR_POPDEF([_OUT])dnl\n],[PACKAGE=\"$PACKAGE\"])])\n"
  },
  {
    "path": "libs/CoMISo/gmm/m4/libtool.m4",
    "content": "# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-\n#\n#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,\n#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software\n#                 Foundation, Inc.\n#   Written by Gordon Matzigkeit, 1996\n#\n# This file is free software; the Free Software Foundation gives\n# unlimited permission to copy and/or distribute it, with or without\n# modifications, as long as this notice is preserved.\n\nm4_define([_LT_COPYING], [dnl\n#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,\n#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software\n#                 Foundation, Inc.\n#   Written by Gordon Matzigkeit, 1996\n#\n#   This file is part of GNU Libtool.\n#\n# GNU Libtool is free software; you can redistribute it and/or\n# modify it under the terms of the GNU General Public License as\n# published by the Free Software Foundation; either version 2 of\n# the License, or (at your option) any later version.\n#\n# As a special exception to the GNU General Public License,\n# if you distribute this file as part of a program or library that\n# is built using GNU Libtool, you may include this file under the\n# same distribution terms that you use for the rest of that program.\n#\n# GNU Libtool 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 GNU Libtool; see the file COPYING.  If not, a copy\n# can be downloaded from http://www.gnu.org/licenses/gpl.html, or\n# obtained by writing to the Free Software Foundation, Inc.,\n# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n])\n\n# serial 57 LT_INIT\n\n\n# LT_PREREQ(VERSION)\n# ------------------\n# Complain and exit if this libtool version is less that VERSION.\nm4_defun([LT_PREREQ],\n[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,\n       [m4_default([$3],\n\t\t   [m4_fatal([Libtool version $1 or higher is required],\n\t\t             63)])],\n       [$2])])\n\n\n# _LT_CHECK_BUILDDIR\n# ------------------\n# Complain if the absolute build directory name contains unusual characters\nm4_defun([_LT_CHECK_BUILDDIR],\n[case `pwd` in\n  *\\ * | *\\\t*)\n    AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;\nesac\n])\n\n\n# LT_INIT([OPTIONS])\n# ------------------\nAC_DEFUN([LT_INIT],\n[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT\nAC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl\nAC_BEFORE([$0], [LT_LANG])dnl\nAC_BEFORE([$0], [LT_OUTPUT])dnl\nAC_BEFORE([$0], [LTDL_INIT])dnl\nm4_require([_LT_CHECK_BUILDDIR])dnl\n\ndnl Autoconf doesn't catch unexpanded LT_ macros by default:\nm4_pattern_forbid([^_?LT_[A-Z_]+$])dnl\nm4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl\ndnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4\ndnl unless we require an AC_DEFUNed macro:\nAC_REQUIRE([LTOPTIONS_VERSION])dnl\nAC_REQUIRE([LTSUGAR_VERSION])dnl\nAC_REQUIRE([LTVERSION_VERSION])dnl\nAC_REQUIRE([LTOBSOLETE_VERSION])dnl\nm4_require([_LT_PROG_LTMAIN])dnl\n\n_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}])\n\ndnl Parse OPTIONS\n_LT_SET_OPTIONS([$0], [$1])\n\n# This can be used to rebuild libtool when needed\nLIBTOOL_DEPS=\"$ltmain\"\n\n# Always use our own libtool.\nLIBTOOL='$(SHELL) $(top_builddir)/libtool'\nAC_SUBST(LIBTOOL)dnl\n\n_LT_SETUP\n\n# Only expand once:\nm4_define([LT_INIT])\n])# LT_INIT\n\n# Old names:\nAU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])\nAU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_PROG_LIBTOOL], [])\ndnl AC_DEFUN([AM_PROG_LIBTOOL], [])\n\n\n# _LT_CC_BASENAME(CC)\n# -------------------\n# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.\nm4_defun([_LT_CC_BASENAME],\n[for cc_temp in $1\"\"; do\n  case $cc_temp in\n    compile | *[[\\\\/]]compile | ccache | *[[\\\\/]]ccache ) ;;\n    distcc | *[[\\\\/]]distcc | purify | *[[\\\\/]]purify ) ;;\n    \\-*) ;;\n    *) break;;\n  esac\ndone\ncc_basename=`$ECHO \"$cc_temp\" | $SED \"s%.*/%%; s%^$host_alias-%%\"`\n])\n\n\n# _LT_FILEUTILS_DEFAULTS\n# ----------------------\n# It is okay to use these file commands and assume they have been set\n# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'.\nm4_defun([_LT_FILEUTILS_DEFAULTS],\n[: ${CP=\"cp -f\"}\n: ${MV=\"mv -f\"}\n: ${RM=\"rm -f\"}\n])# _LT_FILEUTILS_DEFAULTS\n\n\n# _LT_SETUP\n# ---------\nm4_defun([_LT_SETUP],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\nAC_REQUIRE([AC_CANONICAL_BUILD])dnl\nAC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl\nAC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl\n\n_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl\ndnl\n_LT_DECL([], [host_alias], [0], [The host system])dnl\n_LT_DECL([], [host], [0])dnl\n_LT_DECL([], [host_os], [0])dnl\ndnl\n_LT_DECL([], [build_alias], [0], [The build system])dnl\n_LT_DECL([], [build], [0])dnl\n_LT_DECL([], [build_os], [0])dnl\ndnl\nAC_REQUIRE([AC_PROG_CC])dnl\nAC_REQUIRE([LT_PATH_LD])dnl\nAC_REQUIRE([LT_PATH_NM])dnl\ndnl\nAC_REQUIRE([AC_PROG_LN_S])dnl\ntest -z \"$LN_S\" && LN_S=\"ln -s\"\n_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl\ndnl\nAC_REQUIRE([LT_CMD_MAX_LEN])dnl\n_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally \"o\")])dnl\n_LT_DECL([], [exeext], [0], [Executable file suffix (normally \"\")])dnl\ndnl\nm4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_CHECK_SHELL_FEATURES])dnl\nm4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl\nm4_require([_LT_CMD_RELOAD])dnl\nm4_require([_LT_CHECK_MAGIC_METHOD])dnl\nm4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl\nm4_require([_LT_CMD_OLD_ARCHIVE])dnl\nm4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl\nm4_require([_LT_WITH_SYSROOT])dnl\n\n_LT_CONFIG_LIBTOOL_INIT([\n# See if we are running on zsh, and set the options which allow our\n# commands through without removal of \\ escapes INIT.\nif test -n \"\\${ZSH_VERSION+set}\" ; then\n   setopt NO_GLOB_SUBST\nfi\n])\nif test -n \"${ZSH_VERSION+set}\" ; then\n   setopt NO_GLOB_SUBST\nfi\n\n_LT_CHECK_OBJDIR\n\nm4_require([_LT_TAG_COMPILER])dnl\n\ncase $host_os in\naix3*)\n  # AIX sometimes has problems with the GCC collect2 program.  For some\n  # reason, if we set the COLLECT_NAMES environment variable, the problems\n  # vanish in a puff of smoke.\n  if test \"X${COLLECT_NAMES+set}\" != Xset; then\n    COLLECT_NAMES=\n    export COLLECT_NAMES\n  fi\n  ;;\nesac\n\n# Global variables:\nofile=libtool\ncan_build_shared=yes\n\n# All known linkers require a `.a' archive for static linking (except MSVC,\n# which needs '.lib').\nlibext=a\n\nwith_gnu_ld=\"$lt_cv_prog_gnu_ld\"\n\nold_CC=\"$CC\"\nold_CFLAGS=\"$CFLAGS\"\n\n# Set sane defaults for various variables\ntest -z \"$CC\" && CC=cc\ntest -z \"$LTCC\" && LTCC=$CC\ntest -z \"$LTCFLAGS\" && LTCFLAGS=$CFLAGS\ntest -z \"$LD\" && LD=ld\ntest -z \"$ac_objext\" && ac_objext=o\n\n_LT_CC_BASENAME([$compiler])\n\n# Only perform the check for file, if the check method requires it\ntest -z \"$MAGIC_CMD\" && MAGIC_CMD=file\ncase $deplibs_check_method in\nfile_magic*)\n  if test \"$file_magic_cmd\" = '$MAGIC_CMD'; then\n    _LT_PATH_MAGIC\n  fi\n  ;;\nesac\n\n# Use C for the default configuration in the libtool script\nLT_SUPPORTED_TAG([CC])\n_LT_LANG_C_CONFIG\n_LT_LANG_DEFAULT_CONFIG\n_LT_CONFIG_COMMANDS\n])# _LT_SETUP\n\n\n# _LT_PREPARE_SED_QUOTE_VARS\n# --------------------------\n# Define a few sed substitution that help us do robust quoting.\nm4_defun([_LT_PREPARE_SED_QUOTE_VARS],\n[# Backslashify metacharacters that are still active within\n# double-quoted strings.\nsed_quote_subst='s/\\([[\"`$\\\\]]\\)/\\\\\\1/g'\n\n# Same as above, but do not quote variable references.\ndouble_quote_subst='s/\\([[\"`\\\\]]\\)/\\\\\\1/g'\n\n# Sed substitution to delay expansion of an escaped shell variable in a\n# double_quote_subst'ed string.\ndelay_variable_subst='s/\\\\\\\\\\\\\\\\\\\\\\$/\\\\\\\\\\\\$/g'\n\n# Sed substitution to delay expansion of an escaped single quote.\ndelay_single_quote_subst='s/'\\''/'\\'\\\\\\\\\\\\\\'\\''/g'\n\n# Sed substitution to avoid accidental globbing in evaled expressions\nno_glob_subst='s/\\*/\\\\\\*/g'\n])\n\n# _LT_PROG_LTMAIN\n# ---------------\n# Note that this code is called both from `configure', and `config.status'\n# now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,\n# `config.status' has no value for ac_aux_dir unless we are using Automake,\n# so we pass a copy along to make sure it has a sensible value anyway.\nm4_defun([_LT_PROG_LTMAIN],\n[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl\n_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])\nltmain=\"$ac_aux_dir/ltmain.sh\"\n])# _LT_PROG_LTMAIN\n\n\n## ------------------------------------- ##\n## Accumulate code for creating libtool. ##\n## ------------------------------------- ##\n\n# So that we can recreate a full libtool script including additional\n# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS\n# in macros and then make a single call at the end using the `libtool'\n# label.\n\n\n# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])\n# ----------------------------------------\n# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.\nm4_define([_LT_CONFIG_LIBTOOL_INIT],\n[m4_ifval([$1],\n          [m4_append([_LT_OUTPUT_LIBTOOL_INIT],\n                     [$1\n])])])\n\n# Initialize.\nm4_define([_LT_OUTPUT_LIBTOOL_INIT])\n\n\n# _LT_CONFIG_LIBTOOL([COMMANDS])\n# ------------------------------\n# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.\nm4_define([_LT_CONFIG_LIBTOOL],\n[m4_ifval([$1],\n          [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],\n                     [$1\n])])])\n\n# Initialize.\nm4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])\n\n\n# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])\n# -----------------------------------------------------\nm4_defun([_LT_CONFIG_SAVE_COMMANDS],\n[_LT_CONFIG_LIBTOOL([$1])\n_LT_CONFIG_LIBTOOL_INIT([$2])\n])\n\n\n# _LT_FORMAT_COMMENT([COMMENT])\n# -----------------------------\n# Add leading comment marks to the start of each line, and a trailing\n# full-stop to the whole comment if one is not present already.\nm4_define([_LT_FORMAT_COMMENT],\n[m4_ifval([$1], [\nm4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],\n              [['`$\\]], [\\\\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])\n)])\n\n\n\n## ------------------------ ##\n## FIXME: Eliminate VARNAME ##\n## ------------------------ ##\n\n\n# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])\n# -------------------------------------------------------------------\n# CONFIGNAME is the name given to the value in the libtool script.\n# VARNAME is the (base) name used in the configure script.\n# VALUE may be 0, 1 or 2 for a computed quote escaped value based on\n# VARNAME.  Any other value will be used directly.\nm4_define([_LT_DECL],\n[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],\n    [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],\n\t[m4_ifval([$1], [$1], [$2])])\n    lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])\n    m4_ifval([$4],\n\t[lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])\n    lt_dict_add_subkey([lt_decl_dict], [$2],\n\t[tagged?], [m4_ifval([$5], [yes], [no])])])\n])\n\n\n# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])\n# --------------------------------------------------------\nm4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])\n\n\n# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])\n# ------------------------------------------------\nm4_define([lt_decl_tag_varnames],\n[_lt_decl_filter([tagged?], [yes], $@)])\n\n\n# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])\n# ---------------------------------------------------------\nm4_define([_lt_decl_filter],\n[m4_case([$#],\n  [0], [m4_fatal([$0: too few arguments: $#])],\n  [1], [m4_fatal([$0: too few arguments: $#: $1])],\n  [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],\n  [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],\n  [lt_dict_filter([lt_decl_dict], $@)])[]dnl\n])\n\n\n# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])\n# --------------------------------------------------\nm4_define([lt_decl_quote_varnames],\n[_lt_decl_filter([value], [1], $@)])\n\n\n# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])\n# ---------------------------------------------------\nm4_define([lt_decl_dquote_varnames],\n[_lt_decl_filter([value], [2], $@)])\n\n\n# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])\n# ---------------------------------------------------\nm4_define([lt_decl_varnames_tagged],\n[m4_assert([$# <= 2])dnl\n_$0(m4_quote(m4_default([$1], [[, ]])),\n    m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),\n    m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])\nm4_define([_lt_decl_varnames_tagged],\n[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])\n\n\n# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])\n# ------------------------------------------------\nm4_define([lt_decl_all_varnames],\n[_$0(m4_quote(m4_default([$1], [[, ]])),\n     m4_if([$2], [],\n\t   m4_quote(lt_decl_varnames),\n\tm4_quote(m4_shift($@))))[]dnl\n])\nm4_define([_lt_decl_all_varnames],\n[lt_join($@, lt_decl_varnames_tagged([$1],\n\t\t\tlt_decl_tag_varnames([[, ]], m4_shift($@))))dnl\n])\n\n\n# _LT_CONFIG_STATUS_DECLARE([VARNAME])\n# ------------------------------------\n# Quote a variable value, and forward it to `config.status' so that its\n# declaration there will have the same value as in `configure'.  VARNAME\n# must have a single quote delimited value for this to work.\nm4_define([_LT_CONFIG_STATUS_DECLARE],\n[$1='`$ECHO \"$][$1\" | $SED \"$delay_single_quote_subst\"`'])\n\n\n# _LT_CONFIG_STATUS_DECLARATIONS\n# ------------------------------\n# We delimit libtool config variables with single quotes, so when\n# we write them to config.status, we have to be sure to quote all\n# embedded single quotes properly.  In configure, this macro expands\n# each variable declared with _LT_DECL (and _LT_TAGDECL) into:\n#\n#    <var>='`$ECHO \"$<var>\" | $SED \"$delay_single_quote_subst\"`'\nm4_defun([_LT_CONFIG_STATUS_DECLARATIONS],\n[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),\n    [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])\n\n\n# _LT_LIBTOOL_TAGS\n# ----------------\n# Output comment and list of tags supported by the script\nm4_defun([_LT_LIBTOOL_TAGS],\n[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl\navailable_tags=\"_LT_TAGS\"dnl\n])\n\n\n# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])\n# -----------------------------------\n# Extract the dictionary values for VARNAME (optionally with TAG) and\n# expand to a commented shell variable setting:\n#\n#    # Some comment about what VAR is for.\n#    visible_name=$lt_internal_name\nm4_define([_LT_LIBTOOL_DECLARE],\n[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],\n\t\t\t\t\t   [description])))[]dnl\nm4_pushdef([_libtool_name],\n    m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl\nm4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),\n    [0], [_libtool_name=[$]$1],\n    [1], [_libtool_name=$lt_[]$1],\n    [2], [_libtool_name=$lt_[]$1],\n    [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl\nm4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl\n])\n\n\n# _LT_LIBTOOL_CONFIG_VARS\n# -----------------------\n# Produce commented declarations of non-tagged libtool config variables\n# suitable for insertion in the LIBTOOL CONFIG section of the `libtool'\n# script.  Tagged libtool config variables (even for the LIBTOOL CONFIG\n# section) are produced by _LT_LIBTOOL_TAG_VARS.\nm4_defun([_LT_LIBTOOL_CONFIG_VARS],\n[m4_foreach([_lt_var],\n    m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),\n    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])\n\n\n# _LT_LIBTOOL_TAG_VARS(TAG)\n# -------------------------\nm4_define([_LT_LIBTOOL_TAG_VARS],\n[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),\n    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])\n\n\n# _LT_TAGVAR(VARNAME, [TAGNAME])\n# ------------------------------\nm4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])\n\n\n# _LT_CONFIG_COMMANDS\n# -------------------\n# Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of\n# variables for single and double quote escaping we saved from calls\n# to _LT_DECL, we can put quote escaped variables declarations\n# into `config.status', and then the shell code to quote escape them in\n# for loops in `config.status'.  Finally, any additional code accumulated\n# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.\nm4_defun([_LT_CONFIG_COMMANDS],\n[AC_PROVIDE_IFELSE([LT_OUTPUT],\n\tdnl If the libtool generation code has been placed in $CONFIG_LT,\n\tdnl instead of duplicating it all over again into config.status,\n\tdnl then we will have config.status run $CONFIG_LT later, so it\n\tdnl needs to know what name is stored there:\n        [AC_CONFIG_COMMANDS([libtool],\n            [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],\n    dnl If the libtool generation code is destined for config.status,\n    dnl expand the accumulated commands and init code now:\n    [AC_CONFIG_COMMANDS([libtool],\n        [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])\n])#_LT_CONFIG_COMMANDS\n\n\n# Initialize.\nm4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],\n[\n\n# The HP-UX ksh and POSIX shell print the target directory to stdout\n# if CDPATH is set.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\nsed_quote_subst='$sed_quote_subst'\ndouble_quote_subst='$double_quote_subst'\ndelay_variable_subst='$delay_variable_subst'\n_LT_CONFIG_STATUS_DECLARATIONS\nLTCC='$LTCC'\nLTCFLAGS='$LTCFLAGS'\ncompiler='$compiler_DEFAULT'\n\n# A function that is used when there is no print builtin or printf.\nfunc_fallback_echo ()\n{\n  eval 'cat <<_LTECHO_EOF\n\\$[]1\n_LTECHO_EOF'\n}\n\n# Quote evaled strings.\nfor var in lt_decl_all_varnames([[ \\\n]], lt_decl_quote_varnames); do\n    case \\`eval \\\\\\\\\\$ECHO \\\\\\\\\"\"\\\\\\\\\\$\\$var\"\\\\\\\\\"\\` in\n    *[[\\\\\\\\\\\\\\`\\\\\"\\\\\\$]]*)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\`\\\\\\$ECHO \\\\\"\\\\\\$\\$var\\\\\" | \\\\\\$SED \\\\\"\\\\\\$sed_quote_subst\\\\\"\\\\\\`\\\\\\\\\\\\\"\"\n      ;;\n    *)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\$\\$var\\\\\\\\\\\\\"\"\n      ;;\n    esac\ndone\n\n# Double-quote double-evaled strings.\nfor var in lt_decl_all_varnames([[ \\\n]], lt_decl_dquote_varnames); do\n    case \\`eval \\\\\\\\\\$ECHO \\\\\\\\\"\"\\\\\\\\\\$\\$var\"\\\\\\\\\"\\` in\n    *[[\\\\\\\\\\\\\\`\\\\\"\\\\\\$]]*)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\`\\\\\\$ECHO \\\\\"\\\\\\$\\$var\\\\\" | \\\\\\$SED -e \\\\\"\\\\\\$double_quote_subst\\\\\" -e \\\\\"\\\\\\$sed_quote_subst\\\\\" -e \\\\\"\\\\\\$delay_variable_subst\\\\\"\\\\\\`\\\\\\\\\\\\\"\"\n      ;;\n    *)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\$\\$var\\\\\\\\\\\\\"\"\n      ;;\n    esac\ndone\n\n_LT_OUTPUT_LIBTOOL_INIT\n])\n\n# _LT_GENERATED_FILE_INIT(FILE, [COMMENT])\n# ------------------------------------\n# Generate a child script FILE with all initialization necessary to\n# reuse the environment learned by the parent script, and make the\n# file executable.  If COMMENT is supplied, it is inserted after the\n# `#!' sequence but before initialization text begins.  After this\n# macro, additional text can be appended to FILE to form the body of\n# the child script.  The macro ends with non-zero status if the\n# file could not be fully written (such as if the disk is full).\nm4_ifdef([AS_INIT_GENERATED],\n[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])],\n[m4_defun([_LT_GENERATED_FILE_INIT],\n[m4_require([AS_PREPARE])]dnl\n[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl\n[lt_write_fail=0\ncat >$1 <<_ASEOF || lt_write_fail=1\n#! $SHELL\n# Generated by $as_me.\n$2\nSHELL=\\${CONFIG_SHELL-$SHELL}\nexport SHELL\n_ASEOF\ncat >>$1 <<\\_ASEOF || lt_write_fail=1\nAS_SHELL_SANITIZE\n_AS_PREPARE\nexec AS_MESSAGE_FD>&1\n_ASEOF\ntest $lt_write_fail = 0 && chmod +x $1[]dnl\nm4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT\n\n# LT_OUTPUT\n# ---------\n# This macro allows early generation of the libtool script (before\n# AC_OUTPUT is called), incase it is used in configure for compilation\n# tests.\nAC_DEFUN([LT_OUTPUT],\n[: ${CONFIG_LT=./config.lt}\nAC_MSG_NOTICE([creating $CONFIG_LT])\n_LT_GENERATED_FILE_INIT([\"$CONFIG_LT\"],\n[# Run this file to recreate a libtool stub with the current configuration.])\n\ncat >>\"$CONFIG_LT\" <<\\_LTEOF\nlt_cl_silent=false\nexec AS_MESSAGE_LOG_FD>>config.log\n{\n  echo\n  AS_BOX([Running $as_me.])\n} >&AS_MESSAGE_LOG_FD\n\nlt_cl_help=\"\\\n\\`$as_me' creates a local libtool stub from the current configuration,\nfor use in further configure time tests before the real libtool is\ngenerated.\n\nUsage: $[0] [[OPTIONS]]\n\n  -h, --help      print this help, then exit\n  -V, --version   print version number, then exit\n  -q, --quiet     do not print progress messages\n  -d, --debug     don't remove temporary files\n\nReport bugs to <bug-libtool@gnu.org>.\"\n\nlt_cl_version=\"\\\nm4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl\nm4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])\nconfigured by $[0], generated by m4_PACKAGE_STRING.\n\nCopyright (C) 2011 Free Software Foundation, Inc.\nThis config.lt script is free software; the Free Software Foundation\ngives unlimited permision to copy, distribute and modify it.\"\n\nwhile test $[#] != 0\ndo\n  case $[1] in\n    --version | --v* | -V )\n      echo \"$lt_cl_version\"; exit 0 ;;\n    --help | --h* | -h )\n      echo \"$lt_cl_help\"; exit 0 ;;\n    --debug | --d* | -d )\n      debug=: ;;\n    --quiet | --q* | --silent | --s* | -q )\n      lt_cl_silent=: ;;\n\n    -*) AC_MSG_ERROR([unrecognized option: $[1]\nTry \\`$[0] --help' for more information.]) ;;\n\n    *) AC_MSG_ERROR([unrecognized argument: $[1]\nTry \\`$[0] --help' for more information.]) ;;\n  esac\n  shift\ndone\n\nif $lt_cl_silent; then\n  exec AS_MESSAGE_FD>/dev/null\nfi\n_LTEOF\n\ncat >>\"$CONFIG_LT\" <<_LTEOF\n_LT_OUTPUT_LIBTOOL_COMMANDS_INIT\n_LTEOF\n\ncat >>\"$CONFIG_LT\" <<\\_LTEOF\nAC_MSG_NOTICE([creating $ofile])\n_LT_OUTPUT_LIBTOOL_COMMANDS\nAS_EXIT(0)\n_LTEOF\nchmod +x \"$CONFIG_LT\"\n\n# configure is writing to config.log, but config.lt does its own redirection,\n# appending to config.log, which fails on DOS, as config.log is still kept\n# open by configure.  Here we exec the FD to /dev/null, effectively closing\n# config.log, so it can be properly (re)opened and appended to by config.lt.\nlt_cl_success=:\ntest \"$silent\" = yes &&\n  lt_config_lt_args=\"$lt_config_lt_args --quiet\"\nexec AS_MESSAGE_LOG_FD>/dev/null\n$SHELL \"$CONFIG_LT\" $lt_config_lt_args || lt_cl_success=false\nexec AS_MESSAGE_LOG_FD>>config.log\n$lt_cl_success || AS_EXIT(1)\n])# LT_OUTPUT\n\n\n# _LT_CONFIG(TAG)\n# ---------------\n# If TAG is the built-in tag, create an initial libtool script with a\n# default configuration from the untagged config vars.  Otherwise add code\n# to config.status for appending the configuration named by TAG from the\n# matching tagged config vars.\nm4_defun([_LT_CONFIG],\n[m4_require([_LT_FILEUTILS_DEFAULTS])dnl\n_LT_CONFIG_SAVE_COMMANDS([\n  m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl\n  m4_if(_LT_TAG, [C], [\n    # See if we are running on zsh, and set the options which allow our\n    # commands through without removal of \\ escapes.\n    if test -n \"${ZSH_VERSION+set}\" ; then\n      setopt NO_GLOB_SUBST\n    fi\n\n    cfgfile=\"${ofile}T\"\n    trap \"$RM \\\"$cfgfile\\\"; exit 1\" 1 2 15\n    $RM \"$cfgfile\"\n\n    cat <<_LT_EOF >> \"$cfgfile\"\n#! $SHELL\n\n# `$ECHO \"$ofile\" | sed 's%^.*/%%'` - Provide generalized library-building support services.\n# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION\n# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:\n# NOTE: Changes made to this file will be lost: look at ltmain.sh.\n#\n_LT_COPYING\n_LT_LIBTOOL_TAGS\n\n# ### BEGIN LIBTOOL CONFIG\n_LT_LIBTOOL_CONFIG_VARS\n_LT_LIBTOOL_TAG_VARS\n# ### END LIBTOOL CONFIG\n\n_LT_EOF\n\n  case $host_os in\n  aix3*)\n    cat <<\\_LT_EOF >> \"$cfgfile\"\n# AIX sometimes has problems with the GCC collect2 program.  For some\n# reason, if we set the COLLECT_NAMES environment variable, the problems\n# vanish in a puff of smoke.\nif test \"X${COLLECT_NAMES+set}\" != Xset; then\n  COLLECT_NAMES=\n  export COLLECT_NAMES\nfi\n_LT_EOF\n    ;;\n  esac\n\n  _LT_PROG_LTMAIN\n\n  # We use sed instead of cat because bash on DJGPP gets confused if\n  # if finds mixed CR/LF and LF-only lines.  Since sed operates in\n  # text mode, it properly converts lines to CR/LF.  This bash problem\n  # is reportedly fixed, but why not run on old versions too?\n  sed '$q' \"$ltmain\" >> \"$cfgfile\" \\\n     || (rm -f \"$cfgfile\"; exit 1)\n\n  _LT_PROG_REPLACE_SHELLFNS\n\n   mv -f \"$cfgfile\" \"$ofile\" ||\n    (rm -f \"$ofile\" && cp \"$cfgfile\" \"$ofile\" && rm -f \"$cfgfile\")\n  chmod +x \"$ofile\"\n],\n[cat <<_LT_EOF >> \"$ofile\"\n\ndnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded\ndnl in a comment (ie after a #).\n# ### BEGIN LIBTOOL TAG CONFIG: $1\n_LT_LIBTOOL_TAG_VARS(_LT_TAG)\n# ### END LIBTOOL TAG CONFIG: $1\n_LT_EOF\n])dnl /m4_if\n],\n[m4_if([$1], [], [\n    PACKAGE='$PACKAGE'\n    VERSION='$VERSION'\n    TIMESTAMP='$TIMESTAMP'\n    RM='$RM'\n    ofile='$ofile'], [])\n])dnl /_LT_CONFIG_SAVE_COMMANDS\n])# _LT_CONFIG\n\n\n# LT_SUPPORTED_TAG(TAG)\n# ---------------------\n# Trace this macro to discover what tags are supported by the libtool\n# --tag option, using:\n#    autoconf --trace 'LT_SUPPORTED_TAG:$1'\nAC_DEFUN([LT_SUPPORTED_TAG], [])\n\n\n# C support is built-in for now\nm4_define([_LT_LANG_C_enabled], [])\nm4_define([_LT_TAGS], [])\n\n\n# LT_LANG(LANG)\n# -------------\n# Enable libtool support for the given language if not already enabled.\nAC_DEFUN([LT_LANG],\n[AC_BEFORE([$0], [LT_OUTPUT])dnl\nm4_case([$1],\n  [C],\t\t\t[_LT_LANG(C)],\n  [C++],\t\t[_LT_LANG(CXX)],\n  [Go],\t\t\t[_LT_LANG(GO)],\n  [Java],\t\t[_LT_LANG(GCJ)],\n  [Fortran 77],\t\t[_LT_LANG(F77)],\n  [Fortran],\t\t[_LT_LANG(FC)],\n  [Windows Resource],\t[_LT_LANG(RC)],\n  [m4_ifdef([_LT_LANG_]$1[_CONFIG],\n    [_LT_LANG($1)],\n    [m4_fatal([$0: unsupported language: \"$1\"])])])dnl\n])# LT_LANG\n\n\n# _LT_LANG(LANGNAME)\n# ------------------\nm4_defun([_LT_LANG],\n[m4_ifdef([_LT_LANG_]$1[_enabled], [],\n  [LT_SUPPORTED_TAG([$1])dnl\n  m4_append([_LT_TAGS], [$1 ])dnl\n  m4_define([_LT_LANG_]$1[_enabled], [])dnl\n  _LT_LANG_$1_CONFIG($1)])dnl\n])# _LT_LANG\n\n\nm4_ifndef([AC_PROG_GO], [\n############################################################\n# NOTE: This macro has been submitted for inclusion into   #\n#  GNU Autoconf as AC_PROG_GO.  When it is available in    #\n#  a released version of Autoconf we should remove this    #\n#  macro and use it instead.                               #\n############################################################\nm4_defun([AC_PROG_GO],\n[AC_LANG_PUSH(Go)dnl\nAC_ARG_VAR([GOC],     [Go compiler command])dnl\nAC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl\n_AC_ARG_VAR_LDFLAGS()dnl\nAC_CHECK_TOOL(GOC, gccgo)\nif test -z \"$GOC\"; then\n  if test -n \"$ac_tool_prefix\"; then\n    AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo])\n  fi\nfi\nif test -z \"$GOC\"; then\n  AC_CHECK_PROG(GOC, gccgo, gccgo, false)\nfi\n])#m4_defun\n])#m4_ifndef\n\n\n# _LT_LANG_DEFAULT_CONFIG\n# -----------------------\nm4_defun([_LT_LANG_DEFAULT_CONFIG],\n[AC_PROVIDE_IFELSE([AC_PROG_CXX],\n  [LT_LANG(CXX)],\n  [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])\n\nAC_PROVIDE_IFELSE([AC_PROG_F77],\n  [LT_LANG(F77)],\n  [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])\n\nAC_PROVIDE_IFELSE([AC_PROG_FC],\n  [LT_LANG(FC)],\n  [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])\n\ndnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal\ndnl pulling things in needlessly.\nAC_PROVIDE_IFELSE([AC_PROG_GCJ],\n  [LT_LANG(GCJ)],\n  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],\n    [LT_LANG(GCJ)],\n    [AC_PROVIDE_IFELSE([LT_PROG_GCJ],\n      [LT_LANG(GCJ)],\n      [m4_ifdef([AC_PROG_GCJ],\n\t[m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])\n       m4_ifdef([A][M_PROG_GCJ],\n\t[m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])\n       m4_ifdef([LT_PROG_GCJ],\n\t[m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])\n\nAC_PROVIDE_IFELSE([AC_PROG_GO],\n  [LT_LANG(GO)],\n  [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])])\n\nAC_PROVIDE_IFELSE([LT_PROG_RC],\n  [LT_LANG(RC)],\n  [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])\n])# _LT_LANG_DEFAULT_CONFIG\n\n# Obsolete macros:\nAU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])\nAU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])\nAU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])\nAU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])\nAU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_CXX], [])\ndnl AC_DEFUN([AC_LIBTOOL_F77], [])\ndnl AC_DEFUN([AC_LIBTOOL_FC], [])\ndnl AC_DEFUN([AC_LIBTOOL_GCJ], [])\ndnl AC_DEFUN([AC_LIBTOOL_RC], [])\n\n\n# _LT_TAG_COMPILER\n# ----------------\nm4_defun([_LT_TAG_COMPILER],\n[AC_REQUIRE([AC_PROG_CC])dnl\n\n_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl\n_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl\n_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl\n_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl\n\n# If no C compiler was specified, use CC.\nLTCC=${LTCC-\"$CC\"}\n\n# If no C compiler flags were specified, use CFLAGS.\nLTCFLAGS=${LTCFLAGS-\"$CFLAGS\"}\n\n# Allow CC to be a program name with arguments.\ncompiler=$CC\n])# _LT_TAG_COMPILER\n\n\n# _LT_COMPILER_BOILERPLATE\n# ------------------------\n# Check for compiler boilerplate output or warnings with\n# the simple compiler test code.\nm4_defun([_LT_COMPILER_BOILERPLATE],\n[m4_require([_LT_DECL_SED])dnl\nac_outfile=conftest.$ac_objext\necho \"$lt_simple_compile_test_code\" >conftest.$ac_ext\neval \"$ac_compile\" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err\n_lt_compiler_boilerplate=`cat conftest.err`\n$RM conftest*\n])# _LT_COMPILER_BOILERPLATE\n\n\n# _LT_LINKER_BOILERPLATE\n# ----------------------\n# Check for linker boilerplate output or warnings with\n# the simple link test code.\nm4_defun([_LT_LINKER_BOILERPLATE],\n[m4_require([_LT_DECL_SED])dnl\nac_outfile=conftest.$ac_objext\necho \"$lt_simple_link_test_code\" >conftest.$ac_ext\neval \"$ac_link\" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err\n_lt_linker_boilerplate=`cat conftest.err`\n$RM -r conftest*\n])# _LT_LINKER_BOILERPLATE\n\n# _LT_REQUIRED_DARWIN_CHECKS\n# -------------------------\nm4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[\n  case $host_os in\n    rhapsody* | darwin*)\n    AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])\n    AC_CHECK_TOOL([NMEDIT], [nmedit], [:])\n    AC_CHECK_TOOL([LIPO], [lipo], [:])\n    AC_CHECK_TOOL([OTOOL], [otool], [:])\n    AC_CHECK_TOOL([OTOOL64], [otool64], [:])\n    _LT_DECL([], [DSYMUTIL], [1],\n      [Tool to manipulate archived DWARF debug symbol files on Mac OS X])\n    _LT_DECL([], [NMEDIT], [1],\n      [Tool to change global to local symbols on Mac OS X])\n    _LT_DECL([], [LIPO], [1],\n      [Tool to manipulate fat objects and archives on Mac OS X])\n    _LT_DECL([], [OTOOL], [1],\n      [ldd/readelf like tool for Mach-O binaries on Mac OS X])\n    _LT_DECL([], [OTOOL64], [1],\n      [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])\n\n    AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],\n      [lt_cv_apple_cc_single_mod=no\n      if test -z \"${LT_MULTI_MODULE}\"; then\n\t# By default we will add the -single_module flag. You can override\n\t# by either setting the environment variable LT_MULTI_MODULE\n\t# non-empty at configure time, or by adding -multi_module to the\n\t# link flags.\n\trm -rf libconftest.dylib*\n\techo \"int foo(void){return 1;}\" > conftest.c\n\techo \"$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \\\n-dynamiclib -Wl,-single_module conftest.c\" >&AS_MESSAGE_LOG_FD\n\t$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \\\n\t  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err\n        _lt_result=$?\n\t# If there is a non-empty error log, and \"single_module\"\n\t# appears in it, assume the flag caused a linker warning\n        if test -s conftest.err && $GREP single_module conftest.err; then\n\t  cat conftest.err >&AS_MESSAGE_LOG_FD\n\t# Otherwise, if the output was created with a 0 exit code from\n\t# the compiler, it worked.\n\telif test -f libconftest.dylib && test $_lt_result -eq 0; then\n\t  lt_cv_apple_cc_single_mod=yes\n\telse\n\t  cat conftest.err >&AS_MESSAGE_LOG_FD\n\tfi\n\trm -rf libconftest.dylib*\n\trm -f conftest.*\n      fi])\n\n    AC_CACHE_CHECK([for -exported_symbols_list linker flag],\n      [lt_cv_ld_exported_symbols_list],\n      [lt_cv_ld_exported_symbols_list=no\n      save_LDFLAGS=$LDFLAGS\n      echo \"_main\" > conftest.sym\n      LDFLAGS=\"$LDFLAGS -Wl,-exported_symbols_list,conftest.sym\"\n      AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],\n\t[lt_cv_ld_exported_symbols_list=yes],\n\t[lt_cv_ld_exported_symbols_list=no])\n\tLDFLAGS=\"$save_LDFLAGS\"\n    ])\n\n    AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load],\n      [lt_cv_ld_force_load=no\n      cat > conftest.c << _LT_EOF\nint forced_loaded() { return 2;}\n_LT_EOF\n      echo \"$LTCC $LTCFLAGS -c -o conftest.o conftest.c\" >&AS_MESSAGE_LOG_FD\n      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD\n      echo \"$AR cru libconftest.a conftest.o\" >&AS_MESSAGE_LOG_FD\n      $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD\n      echo \"$RANLIB libconftest.a\" >&AS_MESSAGE_LOG_FD\n      $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD\n      cat > conftest.c << _LT_EOF\nint main() { return 0;}\n_LT_EOF\n      echo \"$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a\" >&AS_MESSAGE_LOG_FD\n      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err\n      _lt_result=$?\n      if test -s conftest.err && $GREP force_load conftest.err; then\n\tcat conftest.err >&AS_MESSAGE_LOG_FD\n      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then\n\tlt_cv_ld_force_load=yes\n      else\n\tcat conftest.err >&AS_MESSAGE_LOG_FD\n      fi\n        rm -f conftest.err libconftest.a conftest conftest.c\n        rm -rf conftest.dSYM\n    ])\n    case $host_os in\n    rhapsody* | darwin1.[[012]])\n      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;\n    darwin1.*)\n      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;\n    darwin*) # darwin 5.x on\n      # if running on 10.5 or later, the deployment target defaults\n      # to the OS version, if on x86, and 10.4, the deployment\n      # target defaults to 10.4. Don't you love it?\n      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in\n\t10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)\n\t  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;\n\t10.[[012]]*)\n\t  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;\n\t10.*)\n\t  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;\n      esac\n    ;;\n  esac\n    if test \"$lt_cv_apple_cc_single_mod\" = \"yes\"; then\n      _lt_dar_single_mod='$single_module'\n    fi\n    if test \"$lt_cv_ld_exported_symbols_list\" = \"yes\"; then\n      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'\n    else\n      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'\n    fi\n    if test \"$DSYMUTIL\" != \":\" && test \"$lt_cv_ld_force_load\" = \"no\"; then\n      _lt_dsymutil='~$DSYMUTIL $lib || :'\n    else\n      _lt_dsymutil=\n    fi\n    ;;\n  esac\n])\n\n\n# _LT_DARWIN_LINKER_FEATURES([TAG])\n# ---------------------------------\n# Checks for linker and compiler features on darwin\nm4_defun([_LT_DARWIN_LINKER_FEATURES],\n[\n  m4_require([_LT_REQUIRED_DARWIN_CHECKS])\n  _LT_TAGVAR(archive_cmds_need_lc, $1)=no\n  _LT_TAGVAR(hardcode_direct, $1)=no\n  _LT_TAGVAR(hardcode_automatic, $1)=yes\n  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported\n  if test \"$lt_cv_ld_force_load\" = \"yes\"; then\n    _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience ${wl}-force_load,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"`'\n    m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes],\n                  [FC],  [_LT_TAGVAR(compiler_needs_object, $1)=yes])\n  else\n    _LT_TAGVAR(whole_archive_flag_spec, $1)=''\n  fi\n  _LT_TAGVAR(link_all_deplibs, $1)=yes\n  _LT_TAGVAR(allow_undefined_flag, $1)=\"$_lt_dar_allow_undefined\"\n  case $cc_basename in\n     ifort*) _lt_dar_can_shared=yes ;;\n     *) _lt_dar_can_shared=$GCC ;;\n  esac\n  if test \"$_lt_dar_can_shared\" = \"yes\"; then\n    output_verbose_link_cmd=func_echo_all\n    _LT_TAGVAR(archive_cmds, $1)=\"\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\$libobjs \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring $_lt_dar_single_mod${_lt_dsymutil}\"\n    _LT_TAGVAR(module_cmds, $1)=\"\\$CC \\$allow_undefined_flag -o \\$lib -bundle \\$libobjs \\$deplibs \\$compiler_flags${_lt_dsymutil}\"\n    _LT_TAGVAR(archive_expsym_cmds, $1)=\"sed 's,^,_,' < \\$export_symbols > \\$output_objdir/\\${libname}-symbols.expsym~\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\$libobjs \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}\"\n    _LT_TAGVAR(module_expsym_cmds, $1)=\"sed -e 's,^,_,' < \\$export_symbols > \\$output_objdir/\\${libname}-symbols.expsym~\\$CC \\$allow_undefined_flag -o \\$lib -bundle \\$libobjs \\$deplibs \\$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}\"\n    m4_if([$1], [CXX],\n[   if test \"$lt_cv_apple_cc_single_mod\" != \"yes\"; then\n      _LT_TAGVAR(archive_cmds, $1)=\"\\$CC -r -keep_private_externs -nostdlib -o \\${lib}-master.o \\$libobjs~\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\${lib}-master.o \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring${_lt_dsymutil}\"\n      _LT_TAGVAR(archive_expsym_cmds, $1)=\"sed 's,^,_,' < \\$export_symbols > \\$output_objdir/\\${libname}-symbols.expsym~\\$CC -r -keep_private_externs -nostdlib -o \\${lib}-master.o \\$libobjs~\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\${lib}-master.o \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring${_lt_dar_export_syms}${_lt_dsymutil}\"\n    fi\n],[])\n  else\n  _LT_TAGVAR(ld_shlibs, $1)=no\n  fi\n])\n\n# _LT_SYS_MODULE_PATH_AIX([TAGNAME])\n# ----------------------------------\n# Links a minimal program and checks the executable\n# for the system default hardcoded library path. In most cases,\n# this is /usr/lib:/lib, but when the MPI compilers are used\n# the location of the communication and MPI libs are included too.\n# If we don't find anything, use the default library path according\n# to the aix ld manual.\n# Store the results from the different compilers for each TAGNAME.\n# Allow to override them for all tags through lt_cv_aix_libpath.\nm4_defun([_LT_SYS_MODULE_PATH_AIX],\n[m4_require([_LT_DECL_SED])dnl\nif test \"${lt_cv_aix_libpath+set}\" = set; then\n  aix_libpath=$lt_cv_aix_libpath\nelse\n  AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])],\n  [AC_LINK_IFELSE([AC_LANG_PROGRAM],[\n  lt_aix_libpath_sed='[\n      /Import File Strings/,/^$/ {\n\t  /^0/ {\n\t      s/^0  *\\([^ ]*\\) *$/\\1/\n\t      p\n\t  }\n      }]'\n  _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\n  # Check for a 64-bit object if we didn't find anything.\n  if test -z \"$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])\"; then\n    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\n  fi],[])\n  if test -z \"$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])\"; then\n    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=\"/usr/lib:/lib\"\n  fi\n  ])\n  aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])\nfi\n])# _LT_SYS_MODULE_PATH_AIX\n\n\n# _LT_SHELL_INIT(ARG)\n# -------------------\nm4_define([_LT_SHELL_INIT],\n[m4_divert_text([M4SH-INIT], [$1\n])])# _LT_SHELL_INIT\n\n\n\n# _LT_PROG_ECHO_BACKSLASH\n# -----------------------\n# Find how we can fake an echo command that does not interpret backslash.\n# In particular, with Autoconf 2.60 or later we add some code to the start\n# of the generated configure script which will find a shell with a builtin\n# printf (which we can use as an echo command).\nm4_defun([_LT_PROG_ECHO_BACKSLASH],\n[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\nECHO=$ECHO$ECHO$ECHO$ECHO$ECHO\nECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO\n\nAC_MSG_CHECKING([how to print strings])\n# Test print first, because it will be a builtin if present.\nif test \"X`( print -r -- -n ) 2>/dev/null`\" = X-n && \\\n   test \"X`print -r -- $ECHO 2>/dev/null`\" = \"X$ECHO\"; then\n  ECHO='print -r --'\nelif test \"X`printf %s $ECHO 2>/dev/null`\" = \"X$ECHO\"; then\n  ECHO='printf %s\\n'\nelse\n  # Use this function as a fallback that always works.\n  func_fallback_echo ()\n  {\n    eval 'cat <<_LTECHO_EOF\n$[]1\n_LTECHO_EOF'\n  }\n  ECHO='func_fallback_echo'\nfi\n\n# func_echo_all arg...\n# Invoke $ECHO with all args, space-separated.\nfunc_echo_all ()\n{\n    $ECHO \"$*\" \n}\n\ncase \"$ECHO\" in\n  printf*) AC_MSG_RESULT([printf]) ;;\n  print*) AC_MSG_RESULT([print -r]) ;;\n  *) AC_MSG_RESULT([cat]) ;;\nesac\n\nm4_ifdef([_AS_DETECT_SUGGESTED],\n[_AS_DETECT_SUGGESTED([\n  test -n \"${ZSH_VERSION+set}${BASH_VERSION+set}\" || (\n    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\n    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO\n    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO\n    PATH=/empty FPATH=/empty; export PATH FPATH\n    test \"X`printf %s $ECHO`\" = \"X$ECHO\" \\\n      || test \"X`print -r -- $ECHO`\" = \"X$ECHO\" )])])\n\n_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])\n_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes])\n])# _LT_PROG_ECHO_BACKSLASH\n\n\n# _LT_WITH_SYSROOT\n# ----------------\nAC_DEFUN([_LT_WITH_SYSROOT],\n[AC_MSG_CHECKING([for sysroot])\nAC_ARG_WITH([sysroot],\n[  --with-sysroot[=DIR] Search for dependent libraries within DIR\n                        (or the compiler's sysroot if not specified).],\n[], [with_sysroot=no])\n\ndnl lt_sysroot will always be passed unquoted.  We quote it here\ndnl in case the user passed a directory name.\nlt_sysroot=\ncase ${with_sysroot} in #(\n yes)\n   if test \"$GCC\" = yes; then\n     lt_sysroot=`$CC --print-sysroot 2>/dev/null`\n   fi\n   ;; #(\n /*)\n   lt_sysroot=`echo \"$with_sysroot\" | sed -e \"$sed_quote_subst\"`\n   ;; #(\n no|'')\n   ;; #(\n *)\n   AC_MSG_RESULT([${with_sysroot}])\n   AC_MSG_ERROR([The sysroot must be an absolute path.])\n   ;;\nesac\n\n AC_MSG_RESULT([${lt_sysroot:-no}])\n_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl\n[dependent libraries, and in which our libraries should be installed.])])\n\n# _LT_ENABLE_LOCK\n# ---------------\nm4_defun([_LT_ENABLE_LOCK],\n[AC_ARG_ENABLE([libtool-lock],\n  [AS_HELP_STRING([--disable-libtool-lock],\n    [avoid locking (might break parallel builds)])])\ntest \"x$enable_libtool_lock\" != xno && enable_libtool_lock=yes\n\n# Some flags need to be propagated to the compiler or linker for good\n# libtool support.\ncase $host in\nia64-*-hpux*)\n  # Find out which ABI we are using.\n  echo 'int i;' > conftest.$ac_ext\n  if AC_TRY_EVAL(ac_compile); then\n    case `/usr/bin/file conftest.$ac_objext` in\n      *ELF-32*)\n\tHPUX_IA64_MODE=\"32\"\n\t;;\n      *ELF-64*)\n\tHPUX_IA64_MODE=\"64\"\n\t;;\n    esac\n  fi\n  rm -rf conftest*\n  ;;\n*-*-irix6*)\n  # Find out which ABI we are using.\n  echo '[#]line '$LINENO' \"configure\"' > conftest.$ac_ext\n  if AC_TRY_EVAL(ac_compile); then\n    if test \"$lt_cv_prog_gnu_ld\" = yes; then\n      case `/usr/bin/file conftest.$ac_objext` in\n\t*32-bit*)\n\t  LD=\"${LD-ld} -melf32bsmip\"\n\t  ;;\n\t*N32*)\n\t  LD=\"${LD-ld} -melf32bmipn32\"\n\t  ;;\n\t*64-bit*)\n\t  LD=\"${LD-ld} -melf64bmip\"\n\t;;\n      esac\n    else\n      case `/usr/bin/file conftest.$ac_objext` in\n\t*32-bit*)\n\t  LD=\"${LD-ld} -32\"\n\t  ;;\n\t*N32*)\n\t  LD=\"${LD-ld} -n32\"\n\t  ;;\n\t*64-bit*)\n\t  LD=\"${LD-ld} -64\"\n\t  ;;\n      esac\n    fi\n  fi\n  rm -rf conftest*\n  ;;\n\nx86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \\\ns390*-*linux*|s390*-*tpf*|sparc*-*linux*)\n  # Find out which ABI we are using.\n  echo 'int i;' > conftest.$ac_ext\n  if AC_TRY_EVAL(ac_compile); then\n    case `/usr/bin/file conftest.o` in\n      *32-bit*)\n\tcase $host in\n\t  x86_64-*kfreebsd*-gnu)\n\t    LD=\"${LD-ld} -m elf_i386_fbsd\"\n\t    ;;\n\t  x86_64-*linux*)\n\t    LD=\"${LD-ld} -m elf_i386\"\n\t    ;;\n\t  ppc64-*linux*|powerpc64-*linux*)\n\t    LD=\"${LD-ld} -m elf32ppclinux\"\n\t    ;;\n\t  s390x-*linux*)\n\t    LD=\"${LD-ld} -m elf_s390\"\n\t    ;;\n\t  sparc64-*linux*)\n\t    LD=\"${LD-ld} -m elf32_sparc\"\n\t    ;;\n\tesac\n\t;;\n      *64-bit*)\n\tcase $host in\n\t  x86_64-*kfreebsd*-gnu)\n\t    LD=\"${LD-ld} -m elf_x86_64_fbsd\"\n\t    ;;\n\t  x86_64-*linux*)\n\t    LD=\"${LD-ld} -m elf_x86_64\"\n\t    ;;\n\t  ppc*-*linux*|powerpc*-*linux*)\n\t    LD=\"${LD-ld} -m elf64ppc\"\n\t    ;;\n\t  s390*-*linux*|s390*-*tpf*)\n\t    LD=\"${LD-ld} -m elf64_s390\"\n\t    ;;\n\t  sparc*-*linux*)\n\t    LD=\"${LD-ld} -m elf64_sparc\"\n\t    ;;\n\tesac\n\t;;\n    esac\n  fi\n  rm -rf conftest*\n  ;;\n\n*-*-sco3.2v5*)\n  # On SCO OpenServer 5, we need -belf to get full-featured binaries.\n  SAVE_CFLAGS=\"$CFLAGS\"\n  CFLAGS=\"$CFLAGS -belf\"\n  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,\n    [AC_LANG_PUSH(C)\n     AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])\n     AC_LANG_POP])\n  if test x\"$lt_cv_cc_needs_belf\" != x\"yes\"; then\n    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf\n    CFLAGS=\"$SAVE_CFLAGS\"\n  fi\n  ;;\n*-*solaris*)\n  # Find out which ABI we are using.\n  echo 'int i;' > conftest.$ac_ext\n  if AC_TRY_EVAL(ac_compile); then\n    case `/usr/bin/file conftest.o` in\n    *64-bit*)\n      case $lt_cv_prog_gnu_ld in\n      yes*)\n        case $host in\n        i?86-*-solaris*)\n          LD=\"${LD-ld} -m elf_x86_64\"\n          ;;\n        sparc*-*-solaris*)\n          LD=\"${LD-ld} -m elf64_sparc\"\n          ;;\n        esac\n        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.\n        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then\n          LD=\"${LD-ld}_sol2\"\n        fi\n        ;;\n      *)\n\tif ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then\n\t  LD=\"${LD-ld} -64\"\n\tfi\n\t;;\n      esac\n      ;;\n    esac\n  fi\n  rm -rf conftest*\n  ;;\nesac\n\nneed_locks=\"$enable_libtool_lock\"\n])# _LT_ENABLE_LOCK\n\n\n# _LT_PROG_AR\n# -----------\nm4_defun([_LT_PROG_AR],\n[AC_CHECK_TOOLS(AR, [ar], false)\n: ${AR=ar}\n: ${AR_FLAGS=cru}\n_LT_DECL([], [AR], [1], [The archiver])\n_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive])\n\nAC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],\n  [lt_cv_ar_at_file=no\n   AC_COMPILE_IFELSE([AC_LANG_PROGRAM],\n     [echo conftest.$ac_objext > conftest.lst\n      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD'\n      AC_TRY_EVAL([lt_ar_try])\n      if test \"$ac_status\" -eq 0; then\n\t# Ensure the archiver fails upon bogus file names.\n\trm -f conftest.$ac_objext libconftest.a\n\tAC_TRY_EVAL([lt_ar_try])\n\tif test \"$ac_status\" -ne 0; then\n          lt_cv_ar_at_file=@\n        fi\n      fi\n      rm -f conftest.* libconftest.a\n     ])\n  ])\n\nif test \"x$lt_cv_ar_at_file\" = xno; then\n  archiver_list_spec=\nelse\n  archiver_list_spec=$lt_cv_ar_at_file\nfi\n_LT_DECL([], [archiver_list_spec], [1],\n  [How to feed a file listing to the archiver])\n])# _LT_PROG_AR\n\n\n# _LT_CMD_OLD_ARCHIVE\n# -------------------\nm4_defun([_LT_CMD_OLD_ARCHIVE],\n[_LT_PROG_AR\n\nAC_CHECK_TOOL(STRIP, strip, :)\ntest -z \"$STRIP\" && STRIP=:\n_LT_DECL([], [STRIP], [1], [A symbol stripping program])\n\nAC_CHECK_TOOL(RANLIB, ranlib, :)\ntest -z \"$RANLIB\" && RANLIB=:\n_LT_DECL([], [RANLIB], [1],\n    [Commands used to install an old-style archive])\n\n# Determine commands to create old-style static archives.\nold_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'\nold_postinstall_cmds='chmod 644 $oldlib'\nold_postuninstall_cmds=\n\nif test -n \"$RANLIB\"; then\n  case $host_os in\n  openbsd*)\n    old_postinstall_cmds=\"$old_postinstall_cmds~\\$RANLIB -t \\$tool_oldlib\"\n    ;;\n  *)\n    old_postinstall_cmds=\"$old_postinstall_cmds~\\$RANLIB \\$tool_oldlib\"\n    ;;\n  esac\n  old_archive_cmds=\"$old_archive_cmds~\\$RANLIB \\$tool_oldlib\"\nfi\n\ncase $host_os in\n  darwin*)\n    lock_old_archive_extraction=yes ;;\n  *)\n    lock_old_archive_extraction=no ;;\nesac\n_LT_DECL([], [old_postinstall_cmds], [2])\n_LT_DECL([], [old_postuninstall_cmds], [2])\n_LT_TAGDECL([], [old_archive_cmds], [2],\n    [Commands used to build an old-style archive])\n_LT_DECL([], [lock_old_archive_extraction], [0],\n    [Whether to use a lock for old archive extraction])\n])# _LT_CMD_OLD_ARCHIVE\n\n\n# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,\n#\t\t[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])\n# ----------------------------------------------------------------\n# Check whether the given compiler option works\nAC_DEFUN([_LT_COMPILER_OPTION],\n[m4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_DECL_SED])dnl\nAC_CACHE_CHECK([$1], [$2],\n  [$2=no\n   m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n   lt_compiler_flag=\"$3\"\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   # The option is referenced via a variable to avoid confusing sed.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [[^ ]]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:$LINENO: $lt_compile\\\"\" >&AS_MESSAGE_LOG_FD)\n   (eval \"$lt_compile\" 2>conftest.err)\n   ac_status=$?\n   cat conftest.err >&AS_MESSAGE_LOG_FD\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&AS_MESSAGE_LOG_FD\n   if (exit $ac_status) && test -s \"$ac_outfile\"; then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings other than the usual output.\n     $ECHO \"$_lt_compiler_boilerplate\" | $SED '/^$/d' >conftest.exp\n     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2\n     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then\n       $2=yes\n     fi\n   fi\n   $RM conftest*\n])\n\nif test x\"[$]$2\" = xyes; then\n    m4_if([$5], , :, [$5])\nelse\n    m4_if([$6], , :, [$6])\nfi\n])# _LT_COMPILER_OPTION\n\n# Old name:\nAU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [])\n\n\n# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,\n#                  [ACTION-SUCCESS], [ACTION-FAILURE])\n# ----------------------------------------------------\n# Check whether the given linker option works\nAC_DEFUN([_LT_LINKER_OPTION],\n[m4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_DECL_SED])dnl\nAC_CACHE_CHECK([$1], [$2],\n  [$2=no\n   save_LDFLAGS=\"$LDFLAGS\"\n   LDFLAGS=\"$LDFLAGS $3\"\n   echo \"$lt_simple_link_test_code\" > conftest.$ac_ext\n   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then\n     # The linker can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     if test -s conftest.err; then\n       # Append any errors to the config.log.\n       cat conftest.err 1>&AS_MESSAGE_LOG_FD\n       $ECHO \"$_lt_linker_boilerplate\" | $SED '/^$/d' > conftest.exp\n       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2\n       if diff conftest.exp conftest.er2 >/dev/null; then\n         $2=yes\n       fi\n     else\n       $2=yes\n     fi\n   fi\n   $RM -r conftest*\n   LDFLAGS=\"$save_LDFLAGS\"\n])\n\nif test x\"[$]$2\" = xyes; then\n    m4_if([$4], , :, [$4])\nelse\n    m4_if([$5], , :, [$5])\nfi\n])# _LT_LINKER_OPTION\n\n# Old name:\nAU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [])\n\n\n# LT_CMD_MAX_LEN\n#---------------\nAC_DEFUN([LT_CMD_MAX_LEN],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\n# find the maximum length of command line arguments\nAC_MSG_CHECKING([the maximum length of command line arguments])\nAC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl\n  i=0\n  teststring=\"ABCD\"\n\n  case $build_os in\n  msdosdjgpp*)\n    # On DJGPP, this test can blow up pretty badly due to problems in libc\n    # (any single argument exceeding 2000 bytes causes a buffer overrun\n    # during glob expansion).  Even if it were fixed, the result of this\n    # check would be larger than it should be.\n    lt_cv_sys_max_cmd_len=12288;    # 12K is about right\n    ;;\n\n  gnu*)\n    # Under GNU Hurd, this test is not required because there is\n    # no limit to the length of command line arguments.\n    # Libtool will interpret -1 as no limit whatsoever\n    lt_cv_sys_max_cmd_len=-1;\n    ;;\n\n  cygwin* | mingw* | cegcc*)\n    # On Win9x/ME, this test blows up -- it succeeds, but takes\n    # about 5 minutes as the teststring grows exponentially.\n    # Worse, since 9x/ME are not pre-emptively multitasking,\n    # you end up with a \"frozen\" computer, even though with patience\n    # the test eventually succeeds (with a max line length of 256k).\n    # Instead, let's just punt: use the minimum linelength reported by\n    # all of the supported platforms: 8192 (on NT/2K/XP).\n    lt_cv_sys_max_cmd_len=8192;\n    ;;\n\n  mint*)\n    # On MiNT this can take a long time and run out of memory.\n    lt_cv_sys_max_cmd_len=8192;\n    ;;\n\n  amigaos*)\n    # On AmigaOS with pdksh, this test takes hours, literally.\n    # So we just punt and use a minimum line length of 8192.\n    lt_cv_sys_max_cmd_len=8192;\n    ;;\n\n  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)\n    # This has been around since 386BSD, at least.  Likely further.\n    if test -x /sbin/sysctl; then\n      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`\n    elif test -x /usr/sbin/sysctl; then\n      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`\n    else\n      lt_cv_sys_max_cmd_len=65536\t# usable default for all BSDs\n    fi\n    # And add a safety zone\n    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\/ 4`\n    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\* 3`\n    ;;\n\n  interix*)\n    # We know the value 262144 and hardcode it with a safety zone (like BSD)\n    lt_cv_sys_max_cmd_len=196608\n    ;;\n\n  os2*)\n    # The test takes a long time on OS/2.\n    lt_cv_sys_max_cmd_len=8192\n    ;;\n\n  osf*)\n    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure\n    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not\n    # nice to cause kernel panics so lets avoid the loop below.\n    # First set a reasonable default.\n    lt_cv_sys_max_cmd_len=16384\n    #\n    if test -x /sbin/sysconfig; then\n      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in\n        *1*) lt_cv_sys_max_cmd_len=-1 ;;\n      esac\n    fi\n    ;;\n  sco3.2v5*)\n    lt_cv_sys_max_cmd_len=102400\n    ;;\n  sysv5* | sco5v6* | sysv4.2uw2*)\n    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`\n    if test -n \"$kargmax\"; then\n      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[\t ]]//'`\n    else\n      lt_cv_sys_max_cmd_len=32768\n    fi\n    ;;\n  *)\n    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`\n    if test -n \"$lt_cv_sys_max_cmd_len\"; then\n      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\/ 4`\n      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\* 3`\n    else\n      # Make teststring a little bigger before we do anything with it.\n      # a 1K string should be a reasonable start.\n      for i in 1 2 3 4 5 6 7 8 ; do\n        teststring=$teststring$teststring\n      done\n      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}\n      # If test is not a shell built-in, we'll probably end up computing a\n      # maximum length that is only half of the actual maximum length, but\n      # we can't tell.\n      while { test \"X\"`env echo \"$teststring$teststring\" 2>/dev/null` \\\n\t         = \"X$teststring$teststring\"; } >/dev/null 2>&1 &&\n\t      test $i != 17 # 1/2 MB should be enough\n      do\n        i=`expr $i + 1`\n        teststring=$teststring$teststring\n      done\n      # Only check the string length outside the loop.\n      lt_cv_sys_max_cmd_len=`expr \"X$teststring\" : \".*\" 2>&1`\n      teststring=\n      # Add a significant safety factor because C++ compilers can tack on\n      # massive amounts of additional arguments before passing them to the\n      # linker.  It appears as though 1/2 is a usable value.\n      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\/ 2`\n    fi\n    ;;\n  esac\n])\nif test -n $lt_cv_sys_max_cmd_len ; then\n  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)\nelse\n  AC_MSG_RESULT(none)\nfi\nmax_cmd_len=$lt_cv_sys_max_cmd_len\n_LT_DECL([], [max_cmd_len], [0],\n    [What is the maximum length of a command?])\n])# LT_CMD_MAX_LEN\n\n# Old name:\nAU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [])\n\n\n# _LT_HEADER_DLFCN\n# ----------------\nm4_defun([_LT_HEADER_DLFCN],\n[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl\n])# _LT_HEADER_DLFCN\n\n\n# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,\n#                      ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)\n# ----------------------------------------------------------------\nm4_defun([_LT_TRY_DLOPEN_SELF],\n[m4_require([_LT_HEADER_DLFCN])dnl\nif test \"$cross_compiling\" = yes; then :\n  [$4]\nelse\n  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2\n  lt_status=$lt_dlunknown\n  cat > conftest.$ac_ext <<_LT_EOF\n[#line $LINENO \"configure\"\n#include \"confdefs.h\"\n\n#if HAVE_DLFCN_H\n#include <dlfcn.h>\n#endif\n\n#include <stdio.h>\n\n#ifdef RTLD_GLOBAL\n#  define LT_DLGLOBAL\t\tRTLD_GLOBAL\n#else\n#  ifdef DL_GLOBAL\n#    define LT_DLGLOBAL\t\tDL_GLOBAL\n#  else\n#    define LT_DLGLOBAL\t\t0\n#  endif\n#endif\n\n/* We may have to define LT_DLLAZY_OR_NOW in the command line if we\n   find out it does not work in some platform. */\n#ifndef LT_DLLAZY_OR_NOW\n#  ifdef RTLD_LAZY\n#    define LT_DLLAZY_OR_NOW\t\tRTLD_LAZY\n#  else\n#    ifdef DL_LAZY\n#      define LT_DLLAZY_OR_NOW\t\tDL_LAZY\n#    else\n#      ifdef RTLD_NOW\n#        define LT_DLLAZY_OR_NOW\tRTLD_NOW\n#      else\n#        ifdef DL_NOW\n#          define LT_DLLAZY_OR_NOW\tDL_NOW\n#        else\n#          define LT_DLLAZY_OR_NOW\t0\n#        endif\n#      endif\n#    endif\n#  endif\n#endif\n\n/* When -fvisbility=hidden is used, assume the code has been annotated\n   correspondingly for the symbols needed.  */\n#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))\nint fnord () __attribute__((visibility(\"default\")));\n#endif\n\nint fnord () { return 42; }\nint main ()\n{\n  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);\n  int status = $lt_dlunknown;\n\n  if (self)\n    {\n      if (dlsym (self,\"fnord\"))       status = $lt_dlno_uscore;\n      else\n        {\n\t  if (dlsym( self,\"_fnord\"))  status = $lt_dlneed_uscore;\n          else puts (dlerror ());\n\t}\n      /* dlclose (self); */\n    }\n  else\n    puts (dlerror ());\n\n  return status;\n}]\n_LT_EOF\n  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then\n    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null\n    lt_status=$?\n    case x$lt_status in\n      x$lt_dlno_uscore) $1 ;;\n      x$lt_dlneed_uscore) $2 ;;\n      x$lt_dlunknown|x*) $3 ;;\n    esac\n  else :\n    # compilation failed\n    $3\n  fi\nfi\nrm -fr conftest*\n])# _LT_TRY_DLOPEN_SELF\n\n\n# LT_SYS_DLOPEN_SELF\n# ------------------\nAC_DEFUN([LT_SYS_DLOPEN_SELF],\n[m4_require([_LT_HEADER_DLFCN])dnl\nif test \"x$enable_dlopen\" != xyes; then\n  enable_dlopen=unknown\n  enable_dlopen_self=unknown\n  enable_dlopen_self_static=unknown\nelse\n  lt_cv_dlopen=no\n  lt_cv_dlopen_libs=\n\n  case $host_os in\n  beos*)\n    lt_cv_dlopen=\"load_add_on\"\n    lt_cv_dlopen_libs=\n    lt_cv_dlopen_self=yes\n    ;;\n\n  mingw* | pw32* | cegcc*)\n    lt_cv_dlopen=\"LoadLibrary\"\n    lt_cv_dlopen_libs=\n    ;;\n\n  cygwin*)\n    lt_cv_dlopen=\"dlopen\"\n    lt_cv_dlopen_libs=\n    ;;\n\n  darwin*)\n  # if libdl is installed we need to link against it\n    AC_CHECK_LIB([dl], [dlopen],\n\t\t[lt_cv_dlopen=\"dlopen\" lt_cv_dlopen_libs=\"-ldl\"],[\n    lt_cv_dlopen=\"dyld\"\n    lt_cv_dlopen_libs=\n    lt_cv_dlopen_self=yes\n    ])\n    ;;\n\n  *)\n    AC_CHECK_FUNC([shl_load],\n\t  [lt_cv_dlopen=\"shl_load\"],\n      [AC_CHECK_LIB([dld], [shl_load],\n\t    [lt_cv_dlopen=\"shl_load\" lt_cv_dlopen_libs=\"-ldld\"],\n\t[AC_CHECK_FUNC([dlopen],\n\t      [lt_cv_dlopen=\"dlopen\"],\n\t  [AC_CHECK_LIB([dl], [dlopen],\n\t\t[lt_cv_dlopen=\"dlopen\" lt_cv_dlopen_libs=\"-ldl\"],\n\t    [AC_CHECK_LIB([svld], [dlopen],\n\t\t  [lt_cv_dlopen=\"dlopen\" lt_cv_dlopen_libs=\"-lsvld\"],\n\t      [AC_CHECK_LIB([dld], [dld_link],\n\t\t    [lt_cv_dlopen=\"dld_link\" lt_cv_dlopen_libs=\"-ldld\"])\n\t      ])\n\t    ])\n\t  ])\n\t])\n      ])\n    ;;\n  esac\n\n  if test \"x$lt_cv_dlopen\" != xno; then\n    enable_dlopen=yes\n  else\n    enable_dlopen=no\n  fi\n\n  case $lt_cv_dlopen in\n  dlopen)\n    save_CPPFLAGS=\"$CPPFLAGS\"\n    test \"x$ac_cv_header_dlfcn_h\" = xyes && CPPFLAGS=\"$CPPFLAGS -DHAVE_DLFCN_H\"\n\n    save_LDFLAGS=\"$LDFLAGS\"\n    wl=$lt_prog_compiler_wl eval LDFLAGS=\\\"\\$LDFLAGS $export_dynamic_flag_spec\\\"\n\n    save_LIBS=\"$LIBS\"\n    LIBS=\"$lt_cv_dlopen_libs $LIBS\"\n\n    AC_CACHE_CHECK([whether a program can dlopen itself],\n\t  lt_cv_dlopen_self, [dnl\n\t  _LT_TRY_DLOPEN_SELF(\n\t    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,\n\t    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)\n    ])\n\n    if test \"x$lt_cv_dlopen_self\" = xyes; then\n      wl=$lt_prog_compiler_wl eval LDFLAGS=\\\"\\$LDFLAGS $lt_prog_compiler_static\\\"\n      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],\n\t  lt_cv_dlopen_self_static, [dnl\n\t  _LT_TRY_DLOPEN_SELF(\n\t    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,\n\t    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)\n      ])\n    fi\n\n    CPPFLAGS=\"$save_CPPFLAGS\"\n    LDFLAGS=\"$save_LDFLAGS\"\n    LIBS=\"$save_LIBS\"\n    ;;\n  esac\n\n  case $lt_cv_dlopen_self in\n  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;\n  *) enable_dlopen_self=unknown ;;\n  esac\n\n  case $lt_cv_dlopen_self_static in\n  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;\n  *) enable_dlopen_self_static=unknown ;;\n  esac\nfi\n_LT_DECL([dlopen_support], [enable_dlopen], [0],\n\t [Whether dlopen is supported])\n_LT_DECL([dlopen_self], [enable_dlopen_self], [0],\n\t [Whether dlopen of programs is supported])\n_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],\n\t [Whether dlopen of statically linked programs is supported])\n])# LT_SYS_DLOPEN_SELF\n\n# Old name:\nAU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [])\n\n\n# _LT_COMPILER_C_O([TAGNAME])\n# ---------------------------\n# Check to see if options -c and -o are simultaneously supported by compiler.\n# This macro does not hard code the compiler like AC_PROG_CC_C_O.\nm4_defun([_LT_COMPILER_C_O],\n[m4_require([_LT_DECL_SED])dnl\nm4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_TAG_COMPILER])dnl\nAC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],\n  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)],\n  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no\n   $RM -r conftest 2>/dev/null\n   mkdir conftest\n   cd conftest\n   mkdir out\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n\n   lt_compiler_flag=\"-o out/conftest2.$ac_objext\"\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [[^ ]]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:$LINENO: $lt_compile\\\"\" >&AS_MESSAGE_LOG_FD)\n   (eval \"$lt_compile\" 2>out/conftest.err)\n   ac_status=$?\n   cat out/conftest.err >&AS_MESSAGE_LOG_FD\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&AS_MESSAGE_LOG_FD\n   if (exit $ac_status) && test -s out/conftest2.$ac_objext\n   then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     $ECHO \"$_lt_compiler_boilerplate\" | $SED '/^$/d' > out/conftest.exp\n     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2\n     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then\n       _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes\n     fi\n   fi\n   chmod u+w . 2>&AS_MESSAGE_LOG_FD\n   $RM conftest*\n   # SGI C++ compiler will create directory out/ii_files/ for\n   # template instantiation\n   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files\n   $RM out/* && rmdir out\n   cd ..\n   $RM -r conftest\n   $RM conftest*\n])\n_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1],\n\t[Does compiler simultaneously support -c and -o options?])\n])# _LT_COMPILER_C_O\n\n\n# _LT_COMPILER_FILE_LOCKS([TAGNAME])\n# ----------------------------------\n# Check to see if we can do hard links to lock some files if needed\nm4_defun([_LT_COMPILER_FILE_LOCKS],\n[m4_require([_LT_ENABLE_LOCK])dnl\nm4_require([_LT_FILEUTILS_DEFAULTS])dnl\n_LT_COMPILER_C_O([$1])\n\nhard_links=\"nottested\"\nif test \"$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)\" = no && test \"$need_locks\" != no; then\n  # do not overwrite the value of need_locks provided by the user\n  AC_MSG_CHECKING([if we can lock with hard links])\n  hard_links=yes\n  $RM conftest*\n  ln conftest.a conftest.b 2>/dev/null && hard_links=no\n  touch conftest.a\n  ln conftest.a conftest.b 2>&5 || hard_links=no\n  ln conftest.a conftest.b 2>/dev/null && hard_links=no\n  AC_MSG_RESULT([$hard_links])\n  if test \"$hard_links\" = no; then\n    AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])\n    need_locks=warn\n  fi\nelse\n  need_locks=no\nfi\n_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?])\n])# _LT_COMPILER_FILE_LOCKS\n\n\n# _LT_CHECK_OBJDIR\n# ----------------\nm4_defun([_LT_CHECK_OBJDIR],\n[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],\n[rm -f .libs 2>/dev/null\nmkdir .libs 2>/dev/null\nif test -d .libs; then\n  lt_cv_objdir=.libs\nelse\n  # MS-DOS does not allow filenames that begin with a dot.\n  lt_cv_objdir=_libs\nfi\nrmdir .libs 2>/dev/null])\nobjdir=$lt_cv_objdir\n_LT_DECL([], [objdir], [0],\n         [The name of the directory that contains temporary libtool files])dnl\nm4_pattern_allow([LT_OBJDIR])dnl\nAC_DEFINE_UNQUOTED(LT_OBJDIR, \"$lt_cv_objdir/\",\n  [Define to the sub-directory in which libtool stores uninstalled libraries.])\n])# _LT_CHECK_OBJDIR\n\n\n# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME])\n# --------------------------------------\n# Check hardcoding attributes.\nm4_defun([_LT_LINKER_HARDCODE_LIBPATH],\n[AC_MSG_CHECKING([how to hardcode library paths into programs])\n_LT_TAGVAR(hardcode_action, $1)=\nif test -n \"$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\" ||\n   test -n \"$_LT_TAGVAR(runpath_var, $1)\" ||\n   test \"X$_LT_TAGVAR(hardcode_automatic, $1)\" = \"Xyes\" ; then\n\n  # We can hardcode non-existent directories.\n  if test \"$_LT_TAGVAR(hardcode_direct, $1)\" != no &&\n     # If the only mechanism to avoid hardcoding is shlibpath_var, we\n     # have to relink, otherwise we might link with an installed library\n     # when we should be linking with a yet-to-be-installed one\n     ## test \"$_LT_TAGVAR(hardcode_shlibpath_var, $1)\" != no &&\n     test \"$_LT_TAGVAR(hardcode_minus_L, $1)\" != no; then\n    # Linking always hardcodes the temporary library directory.\n    _LT_TAGVAR(hardcode_action, $1)=relink\n  else\n    # We can link without hardcoding, and we can hardcode nonexisting dirs.\n    _LT_TAGVAR(hardcode_action, $1)=immediate\n  fi\nelse\n  # We cannot hardcode anything, or else we can only hardcode existing\n  # directories.\n  _LT_TAGVAR(hardcode_action, $1)=unsupported\nfi\nAC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])\n\nif test \"$_LT_TAGVAR(hardcode_action, $1)\" = relink ||\n   test \"$_LT_TAGVAR(inherit_rpath, $1)\" = yes; then\n  # Fast installation is not supported\n  enable_fast_install=no\nelif test \"$shlibpath_overrides_runpath\" = yes ||\n     test \"$enable_shared\" = no; then\n  # Fast installation is not necessary\n  enable_fast_install=needless\nfi\n_LT_TAGDECL([], [hardcode_action], [0],\n    [How to hardcode a shared library path into an executable])\n])# _LT_LINKER_HARDCODE_LIBPATH\n\n\n# _LT_CMD_STRIPLIB\n# ----------------\nm4_defun([_LT_CMD_STRIPLIB],\n[m4_require([_LT_DECL_EGREP])\nstriplib=\nold_striplib=\nAC_MSG_CHECKING([whether stripping libraries is possible])\nif test -n \"$STRIP\" && $STRIP -V 2>&1 | $GREP \"GNU strip\" >/dev/null; then\n  test -z \"$old_striplib\" && old_striplib=\"$STRIP --strip-debug\"\n  test -z \"$striplib\" && striplib=\"$STRIP --strip-unneeded\"\n  AC_MSG_RESULT([yes])\nelse\n# FIXME - insert some real tests, host_os isn't really good enough\n  case $host_os in\n  darwin*)\n    if test -n \"$STRIP\" ; then\n      striplib=\"$STRIP -x\"\n      old_striplib=\"$STRIP -S\"\n      AC_MSG_RESULT([yes])\n    else\n      AC_MSG_RESULT([no])\n    fi\n    ;;\n  *)\n    AC_MSG_RESULT([no])\n    ;;\n  esac\nfi\n_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])\n_LT_DECL([], [striplib], [1])\n])# _LT_CMD_STRIPLIB\n\n\n# _LT_SYS_DYNAMIC_LINKER([TAG])\n# -----------------------------\n# PORTME Fill in your ld.so characteristics\nm4_defun([_LT_SYS_DYNAMIC_LINKER],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\nm4_require([_LT_DECL_EGREP])dnl\nm4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_DECL_OBJDUMP])dnl\nm4_require([_LT_DECL_SED])dnl\nm4_require([_LT_CHECK_SHELL_FEATURES])dnl\nAC_MSG_CHECKING([dynamic linker characteristics])\nm4_if([$1],\n\t[], [\nif test \"$GCC\" = yes; then\n  case $host_os in\n    darwin*) lt_awk_arg=\"/^libraries:/,/LR/\" ;;\n    *) lt_awk_arg=\"/^libraries:/\" ;;\n  esac\n  case $host_os in\n    mingw* | cegcc*) lt_sed_strip_eq=\"s,=\\([[A-Za-z]]:\\),\\1,g\" ;;\n    *) lt_sed_strip_eq=\"s,=/,/,g\" ;;\n  esac\n  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e \"s/^libraries://\" -e $lt_sed_strip_eq`\n  case $lt_search_path_spec in\n  *\\;*)\n    # if the path contains \";\" then we assume it to be the separator\n    # otherwise default to the standard path separator (i.e. \":\") - it is\n    # assumed that no part of a normal pathname contains \";\" but that should\n    # okay in the real world where \";\" in dirpaths is itself problematic.\n    lt_search_path_spec=`$ECHO \"$lt_search_path_spec\" | $SED 's/;/ /g'`\n    ;;\n  *)\n    lt_search_path_spec=`$ECHO \"$lt_search_path_spec\" | $SED \"s/$PATH_SEPARATOR/ /g\"`\n    ;;\n  esac\n  # Ok, now we have the path, separated by spaces, we can step through it\n  # and add multilib dir if necessary.\n  lt_tmp_lt_search_path_spec=\n  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`\n  for lt_sys_path in $lt_search_path_spec; do\n    if test -d \"$lt_sys_path/$lt_multi_os_dir\"; then\n      lt_tmp_lt_search_path_spec=\"$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir\"\n    else\n      test -d \"$lt_sys_path\" && \\\n\tlt_tmp_lt_search_path_spec=\"$lt_tmp_lt_search_path_spec $lt_sys_path\"\n    fi\n  done\n  lt_search_path_spec=`$ECHO \"$lt_tmp_lt_search_path_spec\" | awk '\nBEGIN {RS=\" \"; FS=\"/|\\n\";} {\n  lt_foo=\"\";\n  lt_count=0;\n  for (lt_i = NF; lt_i > 0; lt_i--) {\n    if ($lt_i != \"\" && $lt_i != \".\") {\n      if ($lt_i == \"..\") {\n        lt_count++;\n      } else {\n        if (lt_count == 0) {\n          lt_foo=\"/\" $lt_i lt_foo;\n        } else {\n          lt_count--;\n        }\n      }\n    }\n  }\n  if (lt_foo != \"\") { lt_freq[[lt_foo]]++; }\n  if (lt_freq[[lt_foo]] == 1) { print lt_foo; }\n}'`\n  # AWK program above erroneously prepends '/' to C:/dos/paths\n  # for these hosts.\n  case $host_os in\n    mingw* | cegcc*) lt_search_path_spec=`$ECHO \"$lt_search_path_spec\" |\\\n      $SED 's,/\\([[A-Za-z]]:\\),\\1,g'` ;;\n  esac\n  sys_lib_search_path_spec=`$ECHO \"$lt_search_path_spec\" | $lt_NL2SP`\nelse\n  sys_lib_search_path_spec=\"/lib /usr/lib /usr/local/lib\"\nfi])\nlibrary_names_spec=\nlibname_spec='lib$name'\nsoname_spec=\nshrext_cmds=\".so\"\npostinstall_cmds=\npostuninstall_cmds=\nfinish_cmds=\nfinish_eval=\nshlibpath_var=\nshlibpath_overrides_runpath=unknown\nversion_type=none\ndynamic_linker=\"$host_os ld.so\"\nsys_lib_dlsearch_path_spec=\"/lib /usr/lib\"\nneed_lib_prefix=unknown\nhardcode_into_libs=no\n\n# when you set need_version to no, make sure it does not cause -set_version\n# flags to be left without arguments\nneed_version=unknown\n\ncase $host_os in\naix3*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'\n  shlibpath_var=LIBPATH\n\n  # AIX 3 has no versioning support, so we append a major version to the name.\n  soname_spec='${libname}${release}${shared_ext}$major'\n  ;;\n\naix[[4-9]]*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  hardcode_into_libs=yes\n  if test \"$host_cpu\" = ia64; then\n    # AIX 5 supports IA64\n    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'\n    shlibpath_var=LD_LIBRARY_PATH\n  else\n    # With GCC up to 2.95.x, collect2 would create an import file\n    # for dependence libraries.  The import file would start with\n    # the line `#! .'.  This would cause the generated library to\n    # depend on `.', always an invalid library.  This was fixed in\n    # development snapshots of GCC prior to 3.0.\n    case $host_os in\n      aix4 | aix4.[[01]] | aix4.[[01]].*)\n      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'\n\t   echo ' yes '\n\t   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then\n\t:\n      else\n\tcan_build_shared=no\n      fi\n      ;;\n    esac\n    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct\n    # soname into executable. Probably we can add versioning support to\n    # collect2, so additional links can be useful in future.\n    if test \"$aix_use_runtimelinking\" = yes; then\n      # If using run time linking (on AIX 4.2 or later) use lib<name>.so\n      # instead of lib<name>.a to let people know that these are not\n      # typical AIX shared libraries.\n      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    else\n      # We preserve .a as extension for shared libraries through AIX4.2\n      # and later when we are not doing run time linking.\n      library_names_spec='${libname}${release}.a $libname.a'\n      soname_spec='${libname}${release}${shared_ext}$major'\n    fi\n    shlibpath_var=LIBPATH\n  fi\n  ;;\n\namigaos*)\n  case $host_cpu in\n  powerpc)\n    # Since July 2007 AmigaOS4 officially supports .so libraries.\n    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    ;;\n  m68k)\n    library_names_spec='$libname.ixlibrary $libname.a'\n    # Create ${libname}_ixlibrary.a entries in /sys/libs.\n    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all \"$lib\" | $SED '\\''s%^.*/\\([[^/]]*\\)\\.ixlibrary$%\\1%'\\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show \"cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a\"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'\n    ;;\n  esac\n  ;;\n\nbeos*)\n  library_names_spec='${libname}${shared_ext}'\n  dynamic_linker=\"$host_os ld.so\"\n  shlibpath_var=LIBRARY_PATH\n  ;;\n\nbsdi[[45]]*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  sys_lib_search_path_spec=\"/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib\"\n  sys_lib_dlsearch_path_spec=\"/shlib /usr/lib /usr/local/lib\"\n  # the default ld.so.conf also contains /usr/contrib/lib and\n  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow\n  # libtool to hard-code these into programs\n  ;;\n\ncygwin* | mingw* | pw32* | cegcc*)\n  version_type=windows\n  shrext_cmds=\".dll\"\n  need_version=no\n  need_lib_prefix=no\n\n  case $GCC,$cc_basename in\n  yes,*)\n    # gcc\n    library_names_spec='$libname.dll.a'\n    # DLL is installed to $(libdir)/../bin by postinstall_cmds\n    postinstall_cmds='base_file=`basename \\${file}`~\n      dlpath=`$SHELL 2>&1 -c '\\''. $dir/'\\''\\${base_file}'\\''i; echo \\$dlname'\\''`~\n      dldir=$destdir/`dirname \\$dlpath`~\n      test -d \\$dldir || mkdir -p \\$dldir~\n      $install_prog $dir/$dlname \\$dldir/$dlname~\n      chmod a+x \\$dldir/$dlname~\n      if test -n '\\''$stripme'\\'' && test -n '\\''$striplib'\\''; then\n        eval '\\''$striplib \\$dldir/$dlname'\\'' || exit \\$?;\n      fi'\n    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\\''. $file; echo \\$dlname'\\''`~\n      dlpath=$dir/\\$dldll~\n       $RM \\$dlpath'\n    shlibpath_overrides_runpath=yes\n\n    case $host_os in\n    cygwin*)\n      # Cygwin DLLs use 'cyg' prefix rather than 'lib'\n      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'\nm4_if([$1], [],[\n      sys_lib_search_path_spec=\"$sys_lib_search_path_spec /usr/lib/w32api\"])\n      ;;\n    mingw* | cegcc*)\n      # MinGW DLLs use traditional 'lib' prefix\n      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'\n      ;;\n    pw32*)\n      # pw32 DLLs use 'pw' prefix rather than 'lib'\n      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'\n      ;;\n    esac\n    dynamic_linker='Win32 ld.exe'\n    ;;\n\n  *,cl*)\n    # Native MSVC\n    libname_spec='$name'\n    soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'\n    library_names_spec='${libname}.dll.lib'\n\n    case $build_os in\n    mingw*)\n      sys_lib_search_path_spec=\n      lt_save_ifs=$IFS\n      IFS=';'\n      for lt_path in $LIB\n      do\n        IFS=$lt_save_ifs\n        # Let DOS variable expansion print the short 8.3 style file name.\n        lt_path=`cd \"$lt_path\" 2>/dev/null && cmd //C \"for %i in (\".\") do @echo %~si\"`\n        sys_lib_search_path_spec=\"$sys_lib_search_path_spec $lt_path\"\n      done\n      IFS=$lt_save_ifs\n      # Convert to MSYS style.\n      sys_lib_search_path_spec=`$ECHO \"$sys_lib_search_path_spec\" | sed -e 's|\\\\\\\\|/|g' -e 's| \\\\([[a-zA-Z]]\\\\):| /\\\\1|g' -e 's|^ ||'`\n      ;;\n    cygwin*)\n      # Convert to unix form, then to dos form, then back to unix form\n      # but this time dos style (no spaces!) so that the unix form looks\n      # like /cygdrive/c/PROGRA~1:/cygdr...\n      sys_lib_search_path_spec=`cygpath --path --unix \"$LIB\"`\n      sys_lib_search_path_spec=`cygpath --path --dos \"$sys_lib_search_path_spec\" 2>/dev/null`\n      sys_lib_search_path_spec=`cygpath --path --unix \"$sys_lib_search_path_spec\" | $SED -e \"s/$PATH_SEPARATOR/ /g\"`\n      ;;\n    *)\n      sys_lib_search_path_spec=\"$LIB\"\n      if $ECHO \"$sys_lib_search_path_spec\" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then\n        # It is most probably a Windows format PATH.\n        sys_lib_search_path_spec=`$ECHO \"$sys_lib_search_path_spec\" | $SED -e 's/;/ /g'`\n      else\n        sys_lib_search_path_spec=`$ECHO \"$sys_lib_search_path_spec\" | $SED -e \"s/$PATH_SEPARATOR/ /g\"`\n      fi\n      # FIXME: find the short name or the path components, as spaces are\n      # common. (e.g. \"Program Files\" -> \"PROGRA~1\")\n      ;;\n    esac\n\n    # DLL is installed to $(libdir)/../bin by postinstall_cmds\n    postinstall_cmds='base_file=`basename \\${file}`~\n      dlpath=`$SHELL 2>&1 -c '\\''. $dir/'\\''\\${base_file}'\\''i; echo \\$dlname'\\''`~\n      dldir=$destdir/`dirname \\$dlpath`~\n      test -d \\$dldir || mkdir -p \\$dldir~\n      $install_prog $dir/$dlname \\$dldir/$dlname'\n    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\\''. $file; echo \\$dlname'\\''`~\n      dlpath=$dir/\\$dldll~\n       $RM \\$dlpath'\n    shlibpath_overrides_runpath=yes\n    dynamic_linker='Win32 link.exe'\n    ;;\n\n  *)\n    # Assume MSVC wrapper\n    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'\n    dynamic_linker='Win32 ld.exe'\n    ;;\n  esac\n  # FIXME: first we should search . and the directory the executable is in\n  shlibpath_var=PATH\n  ;;\n\ndarwin* | rhapsody*)\n  dynamic_linker=\"$host_os dyld\"\n  version_type=darwin\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'\n  soname_spec='${libname}${release}${major}$shared_ext'\n  shlibpath_overrides_runpath=yes\n  shlibpath_var=DYLD_LIBRARY_PATH\n  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'\nm4_if([$1], [],[\n  sys_lib_search_path_spec=\"$sys_lib_search_path_spec /usr/local/lib\"])\n  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'\n  ;;\n\ndgux*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\nfreebsd* | dragonfly*)\n  # DragonFly does not have aout.  When/if they implement a new\n  # versioning mechanism, adjust this.\n  if test -x /usr/bin/objformat; then\n    objformat=`/usr/bin/objformat`\n  else\n    case $host_os in\n    freebsd[[23]].*) objformat=aout ;;\n    *) objformat=elf ;;\n    esac\n  fi\n  version_type=freebsd-$objformat\n  case $version_type in\n    freebsd-elf*)\n      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'\n      need_version=no\n      need_lib_prefix=no\n      ;;\n    freebsd-*)\n      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'\n      need_version=yes\n      ;;\n  esac\n  shlibpath_var=LD_LIBRARY_PATH\n  case $host_os in\n  freebsd2.*)\n    shlibpath_overrides_runpath=yes\n    ;;\n  freebsd3.[[01]]* | freebsdelf3.[[01]]*)\n    shlibpath_overrides_runpath=yes\n    hardcode_into_libs=yes\n    ;;\n  freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \\\n  freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)\n    shlibpath_overrides_runpath=no\n    hardcode_into_libs=yes\n    ;;\n  *) # from 4.6 on, and DragonFly\n    shlibpath_overrides_runpath=yes\n    hardcode_into_libs=yes\n    ;;\n  esac\n  ;;\n\ngnu*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  ;;\n\nhaiku*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  dynamic_linker=\"$host_os runtime_loader\"\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'\n  hardcode_into_libs=yes\n  ;;\n\nhpux9* | hpux10* | hpux11*)\n  # Give a soname corresponding to the major version so that dld.sl refuses to\n  # link against other versions.\n  version_type=sunos\n  need_lib_prefix=no\n  need_version=no\n  case $host_cpu in\n  ia64*)\n    shrext_cmds='.so'\n    hardcode_into_libs=yes\n    dynamic_linker=\"$host_os dld.so\"\n    shlibpath_var=LD_LIBRARY_PATH\n    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    if test \"X$HPUX_IA64_MODE\" = X32; then\n      sys_lib_search_path_spec=\"/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib\"\n    else\n      sys_lib_search_path_spec=\"/usr/lib/hpux64 /usr/local/lib/hpux64\"\n    fi\n    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec\n    ;;\n  hppa*64*)\n    shrext_cmds='.sl'\n    hardcode_into_libs=yes\n    dynamic_linker=\"$host_os dld.sl\"\n    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH\n    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    sys_lib_search_path_spec=\"/usr/lib/pa20_64 /usr/ccs/lib/pa20_64\"\n    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec\n    ;;\n  *)\n    shrext_cmds='.sl'\n    dynamic_linker=\"$host_os dld.sl\"\n    shlibpath_var=SHLIB_PATH\n    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    ;;\n  esac\n  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...\n  postinstall_cmds='chmod 555 $lib'\n  # or fails outright, so override atomically:\n  install_override_mode=555\n  ;;\n\ninterix[[3-9]]*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  ;;\n\nirix5* | irix6* | nonstopux*)\n  case $host_os in\n    nonstopux*) version_type=nonstopux ;;\n    *)\n\tif test \"$lt_cv_prog_gnu_ld\" = yes; then\n\t\tversion_type=linux # correct to gnu/linux during the next big refactor\n\telse\n\t\tversion_type=irix\n\tfi ;;\n  esac\n  need_lib_prefix=no\n  need_version=no\n  soname_spec='${libname}${release}${shared_ext}$major'\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'\n  case $host_os in\n  irix5* | nonstopux*)\n    libsuff= shlibsuff=\n    ;;\n  *)\n    case $LD in # libtool.m4 will add one of these switches to LD\n    *-32|*\"-32 \"|*-melf32bsmip|*\"-melf32bsmip \")\n      libsuff= shlibsuff= libmagic=32-bit;;\n    *-n32|*\"-n32 \"|*-melf32bmipn32|*\"-melf32bmipn32 \")\n      libsuff=32 shlibsuff=N32 libmagic=N32;;\n    *-64|*\"-64 \"|*-melf64bmip|*\"-melf64bmip \")\n      libsuff=64 shlibsuff=64 libmagic=64-bit;;\n    *) libsuff= shlibsuff= libmagic=never-match;;\n    esac\n    ;;\n  esac\n  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH\n  shlibpath_overrides_runpath=no\n  sys_lib_search_path_spec=\"/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}\"\n  sys_lib_dlsearch_path_spec=\"/usr/lib${libsuff} /lib${libsuff}\"\n  hardcode_into_libs=yes\n  ;;\n\n# No shared lib support for Linux oldld, aout, or coff.\nlinux*oldld* | linux*aout* | linux*coff*)\n  dynamic_linker=no\n  ;;\n\n# This must be glibc/ELF.\nlinux* | k*bsd*-gnu | kopensolaris*-gnu)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -n $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n\n  # Some binutils ld are patched to set DT_RUNPATH\n  AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath],\n    [lt_cv_shlibpath_overrides_runpath=no\n    save_LDFLAGS=$LDFLAGS\n    save_libdir=$libdir\n    eval \"libdir=/foo; wl=\\\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\\\"; \\\n\t LDFLAGS=\\\"\\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\\\"\"\n    AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],\n      [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep \"RUNPATH.*$libdir\" >/dev/null],\n\t [lt_cv_shlibpath_overrides_runpath=yes])])\n    LDFLAGS=$save_LDFLAGS\n    libdir=$save_libdir\n    ])\n  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath\n\n  # This implies no fast_install, which is unacceptable.\n  # Some rework will be needed to allow for fast_install\n  # before this can be enabled.\n  hardcode_into_libs=yes\n\n  # Append ld.so.conf contents to the search path\n  if test -f /etc/ld.so.conf; then\n    lt_ld_extra=`awk '/^include / { system(sprintf(\"cd /etc; cat %s 2>/dev/null\", \\[$]2)); skip = 1; } { if (!skip) print \\[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[\t ]*hwcap[\t ]/d;s/[:,\t]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/\"//g;/^$/d' | tr '\\n' ' '`\n    sys_lib_dlsearch_path_spec=\"/lib /usr/lib $lt_ld_extra\"\n  fi\n\n  # We used to test for /lib/ld.so.1 and disable shared libraries on\n  # powerpc, because MkLinux only supported shared libraries with the\n  # GNU dynamic linker.  Since this was broken with cross compilers,\n  # most powerpc-linux boxes support dynamic linking these days and\n  # people can always --disable-shared, the test was removed, and we\n  # assume the GNU/Linux dynamic linker is in use.\n  dynamic_linker='GNU/Linux ld.so'\n  ;;\n\nnetbsdelf*-gnu)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  dynamic_linker='NetBSD ld.elf_so'\n  ;;\n\nnetbsd*)\n  version_type=sunos\n  need_lib_prefix=no\n  need_version=no\n  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'\n    finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -m $libdir'\n    dynamic_linker='NetBSD (a.out) ld.so'\n  else\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    dynamic_linker='NetBSD ld.elf_so'\n  fi\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  ;;\n\nnewsos6)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  ;;\n\n*nto* | *qnx*)\n  version_type=qnx\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  dynamic_linker='ldqnx.so'\n  ;;\n\nopenbsd*)\n  version_type=sunos\n  sys_lib_dlsearch_path_spec=\"/usr/lib\"\n  need_lib_prefix=no\n  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.\n  case $host_os in\n    openbsd3.3 | openbsd3.3.*)\tneed_version=yes ;;\n    *)\t\t\t\tneed_version=no  ;;\n  esac\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -m $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  if test -z \"`echo __ELF__ | $CC -E - | $GREP __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n    case $host_os in\n      openbsd2.[[89]] | openbsd2.[[89]].*)\n\tshlibpath_overrides_runpath=no\n\t;;\n      *)\n\tshlibpath_overrides_runpath=yes\n\t;;\n      esac\n  else\n    shlibpath_overrides_runpath=yes\n  fi\n  ;;\n\nos2*)\n  libname_spec='$name'\n  shrext_cmds=\".dll\"\n  need_lib_prefix=no\n  library_names_spec='$libname${shared_ext} $libname.a'\n  dynamic_linker='OS/2 ld.exe'\n  shlibpath_var=LIBPATH\n  ;;\n\nosf3* | osf4* | osf5*)\n  version_type=osf\n  need_lib_prefix=no\n  need_version=no\n  soname_spec='${libname}${release}${shared_ext}$major'\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  shlibpath_var=LD_LIBRARY_PATH\n  sys_lib_search_path_spec=\"/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib\"\n  sys_lib_dlsearch_path_spec=\"$sys_lib_search_path_spec\"\n  ;;\n\nrdos*)\n  dynamic_linker=no\n  ;;\n\nsolaris*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  # ldd complains unless libraries are executable\n  postinstall_cmds='chmod +x $lib'\n  ;;\n\nsunos4*)\n  version_type=sunos\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'\n  finish_cmds='PATH=\"\\$PATH:/usr/etc\" ldconfig $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  if test \"$with_gnu_ld\" = yes; then\n    need_lib_prefix=no\n  fi\n  need_version=yes\n  ;;\n\nsysv4 | sysv4.3*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  case $host_vendor in\n    sni)\n      shlibpath_overrides_runpath=no\n      need_lib_prefix=no\n      runpath_var=LD_RUN_PATH\n      ;;\n    siemens)\n      need_lib_prefix=no\n      ;;\n    motorola)\n      need_lib_prefix=no\n      need_version=no\n      shlibpath_overrides_runpath=no\n      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'\n      ;;\n  esac\n  ;;\n\nsysv4*MP*)\n  if test -d /usr/nec ;then\n    version_type=linux # correct to gnu/linux during the next big refactor\n    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'\n    soname_spec='$libname${shared_ext}.$major'\n    shlibpath_var=LD_LIBRARY_PATH\n  fi\n  ;;\n\nsysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)\n  version_type=freebsd-elf\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  if test \"$with_gnu_ld\" = yes; then\n    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'\n  else\n    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'\n    case $host_os in\n      sco3.2v5*)\n        sys_lib_search_path_spec=\"$sys_lib_search_path_spec /lib\"\n\t;;\n    esac\n  fi\n  sys_lib_dlsearch_path_spec='/usr/lib'\n  ;;\n\ntpf*)\n  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  ;;\n\nuts4*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\n*)\n  dynamic_linker=no\n  ;;\nesac\nAC_MSG_RESULT([$dynamic_linker])\ntest \"$dynamic_linker\" = no && can_build_shared=no\n\nvariables_saved_for_relink=\"PATH $shlibpath_var $runpath_var\"\nif test \"$GCC\" = yes; then\n  variables_saved_for_relink=\"$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH\"\nfi\n\nif test \"${lt_cv_sys_lib_search_path_spec+set}\" = set; then\n  sys_lib_search_path_spec=\"$lt_cv_sys_lib_search_path_spec\"\nfi\nif test \"${lt_cv_sys_lib_dlsearch_path_spec+set}\" = set; then\n  sys_lib_dlsearch_path_spec=\"$lt_cv_sys_lib_dlsearch_path_spec\"\nfi\n\n_LT_DECL([], [variables_saved_for_relink], [1],\n    [Variables whose values should be saved in libtool wrapper scripts and\n    restored at link time])\n_LT_DECL([], [need_lib_prefix], [0],\n    [Do we need the \"lib\" prefix for modules?])\n_LT_DECL([], [need_version], [0], [Do we need a version for libraries?])\n_LT_DECL([], [version_type], [0], [Library versioning type])\n_LT_DECL([], [runpath_var], [0],  [Shared library runtime path variable])\n_LT_DECL([], [shlibpath_var], [0],[Shared library path variable])\n_LT_DECL([], [shlibpath_overrides_runpath], [0],\n    [Is shlibpath searched before the hard-coded library search path?])\n_LT_DECL([], [libname_spec], [1], [Format of library name prefix])\n_LT_DECL([], [library_names_spec], [1],\n    [[List of archive names.  First name is the real one, the rest are links.\n    The last name is the one that the linker finds with -lNAME]])\n_LT_DECL([], [soname_spec], [1],\n    [[The coded name of the library, if different from the real name]])\n_LT_DECL([], [install_override_mode], [1],\n    [Permission mode override for installation of shared libraries])\n_LT_DECL([], [postinstall_cmds], [2],\n    [Command to use after installation of a shared archive])\n_LT_DECL([], [postuninstall_cmds], [2],\n    [Command to use after uninstallation of a shared archive])\n_LT_DECL([], [finish_cmds], [2],\n    [Commands used to finish a libtool library installation in a directory])\n_LT_DECL([], [finish_eval], [1],\n    [[As \"finish_cmds\", except a single script fragment to be evaled but\n    not shown]])\n_LT_DECL([], [hardcode_into_libs], [0],\n    [Whether we should hardcode library paths into libraries])\n_LT_DECL([], [sys_lib_search_path_spec], [2],\n    [Compile-time system search path for libraries])\n_LT_DECL([], [sys_lib_dlsearch_path_spec], [2],\n    [Run-time system search path for libraries])\n])# _LT_SYS_DYNAMIC_LINKER\n\n\n# _LT_PATH_TOOL_PREFIX(TOOL)\n# --------------------------\n# find a file program which can recognize shared library\nAC_DEFUN([_LT_PATH_TOOL_PREFIX],\n[m4_require([_LT_DECL_EGREP])dnl\nAC_MSG_CHECKING([for $1])\nAC_CACHE_VAL(lt_cv_path_MAGIC_CMD,\n[case $MAGIC_CMD in\n[[\\\\/*] |  ?:[\\\\/]*])\n  lt_cv_path_MAGIC_CMD=\"$MAGIC_CMD\" # Let the user override the test with a path.\n  ;;\n*)\n  lt_save_MAGIC_CMD=\"$MAGIC_CMD\"\n  lt_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\ndnl $ac_dummy forces splitting on constant user-supplied paths.\ndnl POSIX.2 word splitting is done only on the output of word expansions,\ndnl not every word.  This closes a longstanding sh security hole.\n  ac_dummy=\"m4_if([$2], , $PATH, [$2])\"\n  for ac_dir in $ac_dummy; do\n    IFS=\"$lt_save_ifs\"\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f $ac_dir/$1; then\n      lt_cv_path_MAGIC_CMD=\"$ac_dir/$1\"\n      if test -n \"$file_magic_test_file\"; then\n\tcase $deplibs_check_method in\n\t\"file_magic \"*)\n\t  file_magic_regex=`expr \"$deplibs_check_method\" : \"file_magic \\(.*\\)\"`\n\t  MAGIC_CMD=\"$lt_cv_path_MAGIC_CMD\"\n\t  if eval $file_magic_cmd \\$file_magic_test_file 2> /dev/null |\n\t    $EGREP \"$file_magic_regex\" > /dev/null; then\n\t    :\n\t  else\n\t    cat <<_LT_EOF 1>&2\n\n*** Warning: the command libtool uses to detect shared libraries,\n*** $file_magic_cmd, produces output that libtool cannot recognize.\n*** The result is that libtool may fail to recognize shared libraries\n*** as such.  This will affect the creation of libtool libraries that\n*** depend on shared libraries, but programs linked with such libtool\n*** libraries will work regardless of this problem.  Nevertheless, you\n*** may want to report the problem to your system manager and/or to\n*** bug-libtool@gnu.org\n\n_LT_EOF\n\t  fi ;;\n\tesac\n      fi\n      break\n    fi\n  done\n  IFS=\"$lt_save_ifs\"\n  MAGIC_CMD=\"$lt_save_MAGIC_CMD\"\n  ;;\nesac])\nMAGIC_CMD=\"$lt_cv_path_MAGIC_CMD\"\nif test -n \"$MAGIC_CMD\"; then\n  AC_MSG_RESULT($MAGIC_CMD)\nelse\n  AC_MSG_RESULT(no)\nfi\n_LT_DECL([], [MAGIC_CMD], [0],\n\t [Used to examine libraries when file_magic_cmd begins with \"file\"])dnl\n])# _LT_PATH_TOOL_PREFIX\n\n# Old name:\nAU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])\n\n\n# _LT_PATH_MAGIC\n# --------------\n# find a file program which can recognize a shared library\nm4_defun([_LT_PATH_MAGIC],\n[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)\nif test -z \"$lt_cv_path_MAGIC_CMD\"; then\n  if test -n \"$ac_tool_prefix\"; then\n    _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)\n  else\n    MAGIC_CMD=:\n  fi\nfi\n])# _LT_PATH_MAGIC\n\n\n# LT_PATH_LD\n# ----------\n# find the pathname to the GNU or non-GNU linker\nAC_DEFUN([LT_PATH_LD],\n[AC_REQUIRE([AC_PROG_CC])dnl\nAC_REQUIRE([AC_CANONICAL_HOST])dnl\nAC_REQUIRE([AC_CANONICAL_BUILD])dnl\nm4_require([_LT_DECL_SED])dnl\nm4_require([_LT_DECL_EGREP])dnl\nm4_require([_LT_PROG_ECHO_BACKSLASH])dnl\n\nAC_ARG_WITH([gnu-ld],\n    [AS_HELP_STRING([--with-gnu-ld],\n\t[assume the C compiler uses GNU ld @<:@default=no@:>@])],\n    [test \"$withval\" = no || with_gnu_ld=yes],\n    [with_gnu_ld=no])dnl\n\nac_prog=ld\nif test \"$GCC\" = yes; then\n  # Check if gcc -print-prog-name=ld gives a path.\n  AC_MSG_CHECKING([for ld used by $CC])\n  case $host in\n  *-*-mingw*)\n    # gcc leaves a trailing carriage return which upsets mingw\n    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\\015'` ;;\n  *)\n    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;\n  esac\n  case $ac_prog in\n    # Accept absolute paths.\n    [[\\\\/]]* | ?:[[\\\\/]]*)\n      re_direlt='/[[^/]][[^/]]*/\\.\\./'\n      # Canonicalize the pathname of ld\n      ac_prog=`$ECHO \"$ac_prog\"| $SED 's%\\\\\\\\%/%g'`\n      while $ECHO \"$ac_prog\" | $GREP \"$re_direlt\" > /dev/null 2>&1; do\n\tac_prog=`$ECHO $ac_prog| $SED \"s%$re_direlt%/%\"`\n      done\n      test -z \"$LD\" && LD=\"$ac_prog\"\n      ;;\n  \"\")\n    # If it fails, then pretend we aren't using GCC.\n    ac_prog=ld\n    ;;\n  *)\n    # If it is relative, then search for the first ld in PATH.\n    with_gnu_ld=unknown\n    ;;\n  esac\nelif test \"$with_gnu_ld\" = yes; then\n  AC_MSG_CHECKING([for GNU ld])\nelse\n  AC_MSG_CHECKING([for non-GNU ld])\nfi\nAC_CACHE_VAL(lt_cv_path_LD,\n[if test -z \"$LD\"; then\n  lt_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n  for ac_dir in $PATH; do\n    IFS=\"$lt_save_ifs\"\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f \"$ac_dir/$ac_prog\" || test -f \"$ac_dir/$ac_prog$ac_exeext\"; then\n      lt_cv_path_LD=\"$ac_dir/$ac_prog\"\n      # Check to see if the program is GNU ld.  I'd rather use --version,\n      # but apparently some variants of GNU ld only accept -v.\n      # Break only if it was the GNU/non-GNU ld that we prefer.\n      case `\"$lt_cv_path_LD\" -v 2>&1 </dev/null` in\n      *GNU* | *'with BFD'*)\n\ttest \"$with_gnu_ld\" != no && break\n\t;;\n      *)\n\ttest \"$with_gnu_ld\" != yes && break\n\t;;\n      esac\n    fi\n  done\n  IFS=\"$lt_save_ifs\"\nelse\n  lt_cv_path_LD=\"$LD\" # Let the user override the test with a path.\nfi])\nLD=\"$lt_cv_path_LD\"\nif test -n \"$LD\"; then\n  AC_MSG_RESULT($LD)\nelse\n  AC_MSG_RESULT(no)\nfi\ntest -z \"$LD\" && AC_MSG_ERROR([no acceptable ld found in \\$PATH])\n_LT_PATH_LD_GNU\nAC_SUBST([LD])\n\n_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])\n])# LT_PATH_LD\n\n# Old names:\nAU_ALIAS([AM_PROG_LD], [LT_PATH_LD])\nAU_ALIAS([AC_PROG_LD], [LT_PATH_LD])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AM_PROG_LD], [])\ndnl AC_DEFUN([AC_PROG_LD], [])\n\n\n# _LT_PATH_LD_GNU\n#- --------------\nm4_defun([_LT_PATH_LD_GNU],\n[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,\n[# I'd rather use --version here, but apparently some GNU lds only accept -v.\ncase `$LD -v 2>&1 </dev/null` in\n*GNU* | *'with BFD'*)\n  lt_cv_prog_gnu_ld=yes\n  ;;\n*)\n  lt_cv_prog_gnu_ld=no\n  ;;\nesac])\nwith_gnu_ld=$lt_cv_prog_gnu_ld\n])# _LT_PATH_LD_GNU\n\n\n# _LT_CMD_RELOAD\n# --------------\n# find reload flag for linker\n#   -- PORTME Some linkers may need a different reload flag.\nm4_defun([_LT_CMD_RELOAD],\n[AC_CACHE_CHECK([for $LD option to reload object files],\n  lt_cv_ld_reload_flag,\n  [lt_cv_ld_reload_flag='-r'])\nreload_flag=$lt_cv_ld_reload_flag\ncase $reload_flag in\n\"\" | \" \"*) ;;\n*) reload_flag=\" $reload_flag\" ;;\nesac\nreload_cmds='$LD$reload_flag -o $output$reload_objs'\ncase $host_os in\n  cygwin* | mingw* | pw32* | cegcc*)\n    if test \"$GCC\" != yes; then\n      reload_cmds=false\n    fi\n    ;;\n  darwin*)\n    if test \"$GCC\" = yes; then\n      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'\n    else\n      reload_cmds='$LD$reload_flag -o $output$reload_objs'\n    fi\n    ;;\nesac\n_LT_TAGDECL([], [reload_flag], [1], [How to create reloadable object files])dnl\n_LT_TAGDECL([], [reload_cmds], [2])dnl\n])# _LT_CMD_RELOAD\n\n\n# _LT_CHECK_MAGIC_METHOD\n# ----------------------\n# how to check for library dependencies\n#  -- PORTME fill in with the dynamic library characteristics\nm4_defun([_LT_CHECK_MAGIC_METHOD],\n[m4_require([_LT_DECL_EGREP])\nm4_require([_LT_DECL_OBJDUMP])\nAC_CACHE_CHECK([how to recognize dependent libraries],\nlt_cv_deplibs_check_method,\n[lt_cv_file_magic_cmd='$MAGIC_CMD'\nlt_cv_file_magic_test_file=\nlt_cv_deplibs_check_method='unknown'\n# Need to set the preceding variable on all platforms that support\n# interlibrary dependencies.\n# 'none' -- dependencies not supported.\n# `unknown' -- same as none, but documents that we really don't know.\n# 'pass_all' -- all dependencies passed with no checks.\n# 'test_compile' -- check by making test program.\n# 'file_magic [[regex]]' -- check by looking for files in library path\n# which responds to the $file_magic_cmd with a given extended regex.\n# If you have `file' or equivalent on your system and you're not sure\n# whether `pass_all' will *always* work, you probably want this one.\n\ncase $host_os in\naix[[4-9]]*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nbeos*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nbsdi[[45]]*)\n  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'\n  lt_cv_file_magic_cmd='/usr/bin/file -L'\n  lt_cv_file_magic_test_file=/shlib/libc.so\n  ;;\n\ncygwin*)\n  # func_win32_libid is a shell function defined in ltmain.sh\n  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'\n  lt_cv_file_magic_cmd='func_win32_libid'\n  ;;\n\nmingw* | pw32*)\n  # Base MSYS/MinGW do not provide the 'file' command needed by\n  # func_win32_libid shell function, so use a weaker test based on 'objdump',\n  # unless we find 'file', for example because we are cross-compiling.\n  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.\n  if ( test \"$lt_cv_nm_interface\" = \"BSD nm\" && file / ) >/dev/null 2>&1; then\n    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'\n    lt_cv_file_magic_cmd='func_win32_libid'\n  else\n    # Keep this pattern in sync with the one in func_win32_libid.\n    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'\n    lt_cv_file_magic_cmd='$OBJDUMP -f'\n  fi\n  ;;\n\ncegcc*)\n  # use the weaker test based on 'objdump'. See mingw*.\n  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'\n  lt_cv_file_magic_cmd='$OBJDUMP -f'\n  ;;\n\ndarwin* | rhapsody*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nfreebsd* | dragonfly*)\n  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then\n    case $host_cpu in\n    i*86 )\n      # Not sure whether the presence of OpenBSD here was a mistake.\n      # Let's accept both of them until this is cleared up.\n      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'\n      lt_cv_file_magic_cmd=/usr/bin/file\n      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`\n      ;;\n    esac\n  else\n    lt_cv_deplibs_check_method=pass_all\n  fi\n  ;;\n\ngnu*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nhaiku*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nhpux10.20* | hpux11*)\n  lt_cv_file_magic_cmd=/usr/bin/file\n  case $host_cpu in\n  ia64*)\n    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'\n    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so\n    ;;\n  hppa*64*)\n    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\\.[0-9]']\n    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl\n    ;;\n  *)\n    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\\.[[0-9]]) shared library'\n    lt_cv_file_magic_test_file=/usr/lib/libc.sl\n    ;;\n  esac\n  ;;\n\ninterix[[3-9]]*)\n  # PIC code is broken on Interix 3.x, that's why |\\.a not |_pic\\.a here\n  lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\\.so|\\.a)$'\n  ;;\n\nirix5* | irix6* | nonstopux*)\n  case $LD in\n  *-32|*\"-32 \") libmagic=32-bit;;\n  *-n32|*\"-n32 \") libmagic=N32;;\n  *-64|*\"-64 \") libmagic=64-bit;;\n  *) libmagic=never-match;;\n  esac\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\n# This must be glibc/ELF.\nlinux* | k*bsd*-gnu | kopensolaris*-gnu)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nnetbsd* | netbsdelf*-gnu)\n  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then\n    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\\.so\\.[[0-9]]+\\.[[0-9]]+|_pic\\.a)$'\n  else\n    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\\.so|_pic\\.a)$'\n  fi\n  ;;\n\nnewos6*)\n  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'\n  lt_cv_file_magic_cmd=/usr/bin/file\n  lt_cv_file_magic_test_file=/usr/lib/libnls.so\n  ;;\n\n*nto* | *qnx*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nopenbsd*)\n  if test -z \"`echo __ELF__ | $CC -E - | $GREP __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\\.so\\.[[0-9]]+\\.[[0-9]]+|\\.so|_pic\\.a)$'\n  else\n    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\\.so\\.[[0-9]]+\\.[[0-9]]+|_pic\\.a)$'\n  fi\n  ;;\n\nosf3* | osf4* | osf5*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nrdos*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsolaris*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsysv4 | sysv4.3*)\n  case $host_vendor in\n  motorola)\n    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'\n    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`\n    ;;\n  ncr)\n    lt_cv_deplibs_check_method=pass_all\n    ;;\n  sequent)\n    lt_cv_file_magic_cmd='/bin/file'\n    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'\n    ;;\n  sni)\n    lt_cv_file_magic_cmd='/bin/file'\n    lt_cv_deplibs_check_method=\"file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib\"\n    lt_cv_file_magic_test_file=/lib/libc.so\n    ;;\n  siemens)\n    lt_cv_deplibs_check_method=pass_all\n    ;;\n  pc)\n    lt_cv_deplibs_check_method=pass_all\n    ;;\n  esac\n  ;;\n\ntpf*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\nesac\n])\n\nfile_magic_glob=\nwant_nocaseglob=no\nif test \"$build\" = \"$host\"; then\n  case $host_os in\n  mingw* | pw32*)\n    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then\n      want_nocaseglob=yes\n    else\n      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e \"s/\\(..\\)/s\\/[[\\1]]\\/[[\\1]]\\/g;/g\"`\n    fi\n    ;;\n  esac\nfi\n\nfile_magic_cmd=$lt_cv_file_magic_cmd\ndeplibs_check_method=$lt_cv_deplibs_check_method\ntest -z \"$deplibs_check_method\" && deplibs_check_method=unknown\n\n_LT_DECL([], [deplibs_check_method], [1],\n    [Method to check whether dependent libraries are shared objects])\n_LT_DECL([], [file_magic_cmd], [1],\n    [Command to use when deplibs_check_method = \"file_magic\"])\n_LT_DECL([], [file_magic_glob], [1],\n    [How to find potential files when deplibs_check_method = \"file_magic\"])\n_LT_DECL([], [want_nocaseglob], [1],\n    [Find potential files using nocaseglob when deplibs_check_method = \"file_magic\"])\n])# _LT_CHECK_MAGIC_METHOD\n\n\n# LT_PATH_NM\n# ----------\n# find the pathname to a BSD- or MS-compatible name lister\nAC_DEFUN([LT_PATH_NM],\n[AC_REQUIRE([AC_PROG_CC])dnl\nAC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,\n[if test -n \"$NM\"; then\n  # Let the user override the test.\n  lt_cv_path_NM=\"$NM\"\nelse\n  lt_nm_to_check=\"${ac_tool_prefix}nm\"\n  if test -n \"$ac_tool_prefix\" && test \"$build\" = \"$host\"; then\n    lt_nm_to_check=\"$lt_nm_to_check nm\"\n  fi\n  for lt_tmp_nm in $lt_nm_to_check; do\n    lt_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do\n      IFS=\"$lt_save_ifs\"\n      test -z \"$ac_dir\" && ac_dir=.\n      tmp_nm=\"$ac_dir/$lt_tmp_nm\"\n      if test -f \"$tmp_nm\" || test -f \"$tmp_nm$ac_exeext\" ; then\n\t# Check to see if the nm accepts a BSD-compat flag.\n\t# Adding the `sed 1q' prevents false positives on HP-UX, which says:\n\t#   nm: unknown option \"B\" ignored\n\t# Tru64's nm complains that /dev/null is an invalid object file\n\tcase `\"$tmp_nm\" -B /dev/null 2>&1 | sed '1q'` in\n\t*/dev/null* | *'Invalid file or object type'*)\n\t  lt_cv_path_NM=\"$tmp_nm -B\"\n\t  break\n\t  ;;\n\t*)\n\t  case `\"$tmp_nm\" -p /dev/null 2>&1 | sed '1q'` in\n\t  */dev/null*)\n\t    lt_cv_path_NM=\"$tmp_nm -p\"\n\t    break\n\t    ;;\n\t  *)\n\t    lt_cv_path_NM=${lt_cv_path_NM=\"$tmp_nm\"} # keep the first match, but\n\t    continue # so that we can try to find one that supports BSD flags\n\t    ;;\n\t  esac\n\t  ;;\n\tesac\n      fi\n    done\n    IFS=\"$lt_save_ifs\"\n  done\n  : ${lt_cv_path_NM=no}\nfi])\nif test \"$lt_cv_path_NM\" != \"no\"; then\n  NM=\"$lt_cv_path_NM\"\nelse\n  # Didn't find any BSD compatible name lister, look for dumpbin.\n  if test -n \"$DUMPBIN\"; then :\n    # Let the user override the test.\n  else\n    AC_CHECK_TOOLS(DUMPBIN, [dumpbin \"link -dump\"], :)\n    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in\n    *COFF*)\n      DUMPBIN=\"$DUMPBIN -symbols\"\n      ;;\n    *)\n      DUMPBIN=:\n      ;;\n    esac\n  fi\n  AC_SUBST([DUMPBIN])\n  if test \"$DUMPBIN\" != \":\"; then\n    NM=\"$DUMPBIN\"\n  fi\nfi\ntest -z \"$NM\" && NM=nm\nAC_SUBST([NM])\n_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl\n\nAC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],\n  [lt_cv_nm_interface=\"BSD nm\"\n  echo \"int some_variable = 0;\" > conftest.$ac_ext\n  (eval echo \"\\\"\\$as_me:$LINENO: $ac_compile\\\"\" >&AS_MESSAGE_LOG_FD)\n  (eval \"$ac_compile\" 2>conftest.err)\n  cat conftest.err >&AS_MESSAGE_LOG_FD\n  (eval echo \"\\\"\\$as_me:$LINENO: $NM \\\\\\\"conftest.$ac_objext\\\\\\\"\\\"\" >&AS_MESSAGE_LOG_FD)\n  (eval \"$NM \\\"conftest.$ac_objext\\\"\" 2>conftest.err > conftest.out)\n  cat conftest.err >&AS_MESSAGE_LOG_FD\n  (eval echo \"\\\"\\$as_me:$LINENO: output\\\"\" >&AS_MESSAGE_LOG_FD)\n  cat conftest.out >&AS_MESSAGE_LOG_FD\n  if $GREP 'External.*some_variable' conftest.out > /dev/null; then\n    lt_cv_nm_interface=\"MS dumpbin\"\n  fi\n  rm -f conftest*])\n])# LT_PATH_NM\n\n# Old names:\nAU_ALIAS([AM_PROG_NM], [LT_PATH_NM])\nAU_ALIAS([AC_PROG_NM], [LT_PATH_NM])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AM_PROG_NM], [])\ndnl AC_DEFUN([AC_PROG_NM], [])\n\n# _LT_CHECK_SHAREDLIB_FROM_LINKLIB\n# --------------------------------\n# how to determine the name of the shared library\n# associated with a specific link library.\n#  -- PORTME fill in with the dynamic library characteristics\nm4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB],\n[m4_require([_LT_DECL_EGREP])\nm4_require([_LT_DECL_OBJDUMP])\nm4_require([_LT_DECL_DLLTOOL])\nAC_CACHE_CHECK([how to associate runtime and link libraries],\nlt_cv_sharedlib_from_linklib_cmd,\n[lt_cv_sharedlib_from_linklib_cmd='unknown'\n\ncase $host_os in\ncygwin* | mingw* | pw32* | cegcc*)\n  # two different shell functions defined in ltmain.sh\n  # decide which to use based on capabilities of $DLLTOOL\n  case `$DLLTOOL --help 2>&1` in\n  *--identify-strict*)\n    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib\n    ;;\n  *)\n    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback\n    ;;\n  esac\n  ;;\n*)\n  # fallback: assume linklib IS sharedlib\n  lt_cv_sharedlib_from_linklib_cmd=\"$ECHO\"\n  ;;\nesac\n])\nsharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd\ntest -z \"$sharedlib_from_linklib_cmd\" && sharedlib_from_linklib_cmd=$ECHO\n\n_LT_DECL([], [sharedlib_from_linklib_cmd], [1],\n    [Command to associate shared and link libraries])\n])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB\n\n\n# _LT_PATH_MANIFEST_TOOL\n# ----------------------\n# locate the manifest tool\nm4_defun([_LT_PATH_MANIFEST_TOOL],\n[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :)\ntest -z \"$MANIFEST_TOOL\" && MANIFEST_TOOL=mt\nAC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool],\n  [lt_cv_path_mainfest_tool=no\n  echo \"$as_me:$LINENO: $MANIFEST_TOOL '-?'\" >&AS_MESSAGE_LOG_FD\n  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out\n  cat conftest.err >&AS_MESSAGE_LOG_FD\n  if $GREP 'Manifest Tool' conftest.out > /dev/null; then\n    lt_cv_path_mainfest_tool=yes\n  fi\n  rm -f conftest*])\nif test \"x$lt_cv_path_mainfest_tool\" != xyes; then\n  MANIFEST_TOOL=:\nfi\n_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl\n])# _LT_PATH_MANIFEST_TOOL\n\n\n# LT_LIB_M\n# --------\n# check for math library\nAC_DEFUN([LT_LIB_M],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\nLIBM=\ncase $host in\n*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*)\n  # These system don't have libm, or don't need it\n  ;;\n*-ncr-sysv4.3*)\n  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=\"-lmw\")\n  AC_CHECK_LIB(m, cos, LIBM=\"$LIBM -lm\")\n  ;;\n*)\n  AC_CHECK_LIB(m, cos, LIBM=\"-lm\")\n  ;;\nesac\nAC_SUBST([LIBM])\n])# LT_LIB_M\n\n# Old name:\nAU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_CHECK_LIBM], [])\n\n\n# _LT_COMPILER_NO_RTTI([TAGNAME])\n# -------------------------------\nm4_defun([_LT_COMPILER_NO_RTTI],\n[m4_require([_LT_TAG_COMPILER])dnl\n\n_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=\n\nif test \"$GCC\" = yes; then\n  case $cc_basename in\n  nvcc*)\n    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;;\n  *)\n    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;;\n  esac\n\n  _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],\n    lt_cv_prog_compiler_rtti_exceptions,\n    [-fno-rtti -fno-exceptions], [],\n    [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=\"$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions\"])\nfi\n_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],\n\t[Compiler flag to turn off builtin functions])\n])# _LT_COMPILER_NO_RTTI\n\n\n# _LT_CMD_GLOBAL_SYMBOLS\n# ----------------------\nm4_defun([_LT_CMD_GLOBAL_SYMBOLS],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\nAC_REQUIRE([AC_PROG_CC])dnl\nAC_REQUIRE([AC_PROG_AWK])dnl\nAC_REQUIRE([LT_PATH_NM])dnl\nAC_REQUIRE([LT_PATH_LD])dnl\nm4_require([_LT_DECL_SED])dnl\nm4_require([_LT_DECL_EGREP])dnl\nm4_require([_LT_TAG_COMPILER])dnl\n\n# Check for command to grab the raw symbol name followed by C symbol from nm.\nAC_MSG_CHECKING([command to parse $NM output from $compiler object])\nAC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],\n[\n# These are sane defaults that work on at least a few old systems.\n# [They come from Ultrix.  What could be older than Ultrix?!! ;)]\n\n# Character class describing NM global symbol codes.\nsymcode='[[BCDEGRST]]'\n\n# Regexp to match symbols that can be accessed directly from C.\nsympat='\\([[_A-Za-z]][[_A-Za-z0-9]]*\\)'\n\n# Define system-specific variables.\ncase $host_os in\naix*)\n  symcode='[[BCDT]]'\n  ;;\ncygwin* | mingw* | pw32* | cegcc*)\n  symcode='[[ABCDGISTW]]'\n  ;;\nhpux*)\n  if test \"$host_cpu\" = ia64; then\n    symcode='[[ABCDEGRST]]'\n  fi\n  ;;\nirix* | nonstopux*)\n  symcode='[[BCDEGRST]]'\n  ;;\nosf*)\n  symcode='[[BCDEGQRST]]'\n  ;;\nsolaris*)\n  symcode='[[BDRT]]'\n  ;;\nsco3.2v5*)\n  symcode='[[DT]]'\n  ;;\nsysv4.2uw2*)\n  symcode='[[DT]]'\n  ;;\nsysv5* | sco5v6* | unixware* | OpenUNIX*)\n  symcode='[[ABDT]]'\n  ;;\nsysv4)\n  symcode='[[DFNSTU]]'\n  ;;\nesac\n\n# If we're using GNU nm, then use its standard symbol codes.\ncase `$NM -V 2>&1` in\n*GNU* | *'with BFD'*)\n  symcode='[[ABCDGIRSTW]]' ;;\nesac\n\n# Transform an extracted symbol line into a proper C declaration.\n# Some systems (esp. on ia64) link data and code symbols differently,\n# so use this general approach.\nlt_cv_sys_global_symbol_to_cdecl=\"sed -n -e 's/^T .* \\(.*\\)$/extern int \\1();/p' -e 's/^$symcode* .* \\(.*\\)$/extern char \\1;/p'\"\n\n# Transform an extracted symbol line into symbol name and symbol address\nlt_cv_sys_global_symbol_to_c_name_address=\"sed -n -e 's/^: \\([[^ ]]*\\)[[ ]]*$/  {\\\\\\\"\\1\\\\\\\", (void *) 0},/p' -e 's/^$symcode* \\([[^ ]]*\\) \\([[^ ]]*\\)$/  {\\\"\\2\\\", (void *) \\&\\2},/p'\"\nlt_cv_sys_global_symbol_to_c_name_address_lib_prefix=\"sed -n -e 's/^: \\([[^ ]]*\\)[[ ]]*$/  {\\\\\\\"\\1\\\\\\\", (void *) 0},/p' -e 's/^$symcode* \\([[^ ]]*\\) \\(lib[[^ ]]*\\)$/  {\\\"\\2\\\", (void *) \\&\\2},/p' -e 's/^$symcode* \\([[^ ]]*\\) \\([[^ ]]*\\)$/  {\\\"lib\\2\\\", (void *) \\&\\2},/p'\"\n\n# Handle CRLF in mingw tool chain\nopt_cr=\ncase $build_os in\nmingw*)\n  opt_cr=`$ECHO 'x\\{0,1\\}' | tr x '\\015'` # option cr in regexp\n  ;;\nesac\n\n# Try without a prefix underscore, then with it.\nfor ac_symprfx in \"\" \"_\"; do\n\n  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.\n  symxfrm=\"\\\\1 $ac_symprfx\\\\2 \\\\2\"\n\n  # Write the raw and C identifiers.\n  if test \"$lt_cv_nm_interface\" = \"MS dumpbin\"; then\n    # Fake it for dumpbin and say T for any non-static function\n    # and D for any global variable.\n    # Also find C++ and __fastcall symbols from MSVC++,\n    # which start with @ or ?.\n    lt_cv_sys_global_symbol_pipe=\"$AWK ['\"\\\n\"     {last_section=section; section=\\$ 3};\"\\\n\"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};\"\\\n\"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};\"\\\n\"     \\$ 0!~/External *\\|/{next};\"\\\n\"     / 0+ UNDEF /{next}; / UNDEF \\([^|]\\)*()/{next};\"\\\n\"     {if(hide[section]) next};\"\\\n\"     {f=0}; \\$ 0~/\\(\\).*\\|/{f=1}; {printf f ? \\\"T \\\" : \\\"D \\\"};\"\\\n\"     {split(\\$ 0, a, /\\||\\r/); split(a[2], s)};\"\\\n\"     s[1]~/^[@?]/{print s[1], s[1]; next};\"\\\n\"     s[1]~prfx {split(s[1],t,\\\"@\\\"); print t[1], substr(t[1],length(prfx))}\"\\\n\"     ' prfx=^$ac_symprfx]\"\n  else\n    lt_cv_sys_global_symbol_pipe=\"sed -n -e 's/^.*[[\t ]]\\($symcode$symcode*\\)[[\t ]][[\t ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'\"\n  fi\n  lt_cv_sys_global_symbol_pipe=\"$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'\"\n\n  # Check to see that the pipe works correctly.\n  pipe_works=no\n\n  rm -f conftest*\n  cat > conftest.$ac_ext <<_LT_EOF\n#ifdef __cplusplus\nextern \"C\" {\n#endif\nchar nm_test_var;\nvoid nm_test_func(void);\nvoid nm_test_func(void){}\n#ifdef __cplusplus\n}\n#endif\nint main(){nm_test_var='a';nm_test_func();return(0);}\n_LT_EOF\n\n  if AC_TRY_EVAL(ac_compile); then\n    # Now try to grab the symbols.\n    nlist=conftest.nm\n    if AC_TRY_EVAL(NM conftest.$ac_objext \\| \"$lt_cv_sys_global_symbol_pipe\" \\> $nlist) && test -s \"$nlist\"; then\n      # Try sorting and uniquifying the output.\n      if sort \"$nlist\" | uniq > \"$nlist\"T; then\n\tmv -f \"$nlist\"T \"$nlist\"\n      else\n\trm -f \"$nlist\"T\n      fi\n\n      # Make sure that we snagged all the symbols we need.\n      if $GREP ' nm_test_var$' \"$nlist\" >/dev/null; then\n\tif $GREP ' nm_test_func$' \"$nlist\" >/dev/null; then\n\t  cat <<_LT_EOF > conftest.$ac_ext\n/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */\n#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)\n/* DATA imports from DLLs on WIN32 con't be const, because runtime\n   relocations are performed -- see ld's documentation on pseudo-relocs.  */\n# define LT@&t@_DLSYM_CONST\n#elif defined(__osf__)\n/* This system does not cope well with relocations in const data.  */\n# define LT@&t@_DLSYM_CONST\n#else\n# define LT@&t@_DLSYM_CONST const\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n_LT_EOF\n\t  # Now generate the symbol file.\n\t  eval \"$lt_cv_sys_global_symbol_to_cdecl\"' < \"$nlist\" | $GREP -v main >> conftest.$ac_ext'\n\n\t  cat <<_LT_EOF >> conftest.$ac_ext\n\n/* The mapping between symbol names and symbols.  */\nLT@&t@_DLSYM_CONST struct {\n  const char *name;\n  void       *address;\n}\nlt__PROGRAM__LTX_preloaded_symbols[[]] =\n{\n  { \"@PROGRAM@\", (void *) 0 },\n_LT_EOF\n\t  $SED \"s/^$symcode$symcode* \\(.*\\) \\(.*\\)$/  {\\\"\\2\\\", (void *) \\&\\2},/\" < \"$nlist\" | $GREP -v main >> conftest.$ac_ext\n\t  cat <<\\_LT_EOF >> conftest.$ac_ext\n  {0, (void *) 0}\n};\n\n/* This works around a problem in FreeBSD linker */\n#ifdef FREEBSD_WORKAROUND\nstatic const void *lt_preloaded_setup() {\n  return lt__PROGRAM__LTX_preloaded_symbols;\n}\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n_LT_EOF\n\t  # Now try linking the two files.\n\t  mv conftest.$ac_objext conftstm.$ac_objext\n\t  lt_globsym_save_LIBS=$LIBS\n\t  lt_globsym_save_CFLAGS=$CFLAGS\n\t  LIBS=\"conftstm.$ac_objext\"\n\t  CFLAGS=\"$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)\"\n\t  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then\n\t    pipe_works=yes\n\t  fi\n\t  LIBS=$lt_globsym_save_LIBS\n\t  CFLAGS=$lt_globsym_save_CFLAGS\n\telse\n\t  echo \"cannot find nm_test_func in $nlist\" >&AS_MESSAGE_LOG_FD\n\tfi\n      else\n\techo \"cannot find nm_test_var in $nlist\" >&AS_MESSAGE_LOG_FD\n      fi\n    else\n      echo \"cannot run $lt_cv_sys_global_symbol_pipe\" >&AS_MESSAGE_LOG_FD\n    fi\n  else\n    echo \"$progname: failed program was:\" >&AS_MESSAGE_LOG_FD\n    cat conftest.$ac_ext >&5\n  fi\n  rm -rf conftest* conftst*\n\n  # Do not use the global_symbol_pipe unless it works.\n  if test \"$pipe_works\" = yes; then\n    break\n  else\n    lt_cv_sys_global_symbol_pipe=\n  fi\ndone\n])\nif test -z \"$lt_cv_sys_global_symbol_pipe\"; then\n  lt_cv_sys_global_symbol_to_cdecl=\nfi\nif test -z \"$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl\"; then\n  AC_MSG_RESULT(failed)\nelse\n  AC_MSG_RESULT(ok)\nfi\n\n# Response file support.\nif test \"$lt_cv_nm_interface\" = \"MS dumpbin\"; then\n  nm_file_list_spec='@'\nelif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then\n  nm_file_list_spec='@'\nfi\n\n_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],\n    [Take the output of nm and produce a listing of raw symbols and C names])\n_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],\n    [Transform the output of nm in a proper C declaration])\n_LT_DECL([global_symbol_to_c_name_address],\n    [lt_cv_sys_global_symbol_to_c_name_address], [1],\n    [Transform the output of nm in a C name address pair])\n_LT_DECL([global_symbol_to_c_name_address_lib_prefix],\n    [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],\n    [Transform the output of nm in a C name address pair when lib prefix is needed])\n_LT_DECL([], [nm_file_list_spec], [1],\n    [Specify filename containing input files for $NM])\n]) # _LT_CMD_GLOBAL_SYMBOLS\n\n\n# _LT_COMPILER_PIC([TAGNAME])\n# ---------------------------\nm4_defun([_LT_COMPILER_PIC],\n[m4_require([_LT_TAG_COMPILER])dnl\n_LT_TAGVAR(lt_prog_compiler_wl, $1)=\n_LT_TAGVAR(lt_prog_compiler_pic, $1)=\n_LT_TAGVAR(lt_prog_compiler_static, $1)=\n\nm4_if([$1], [CXX], [\n  # C++ specific cases for pic, static, wl, etc.\n  if test \"$GXX\" = yes; then\n    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'\n\n    case $host_os in\n    aix*)\n      # All AIX code is PIC.\n      if test \"$host_cpu\" = ia64; then\n\t# AIX 5 now supports IA64 processor\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      fi\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n        ;;\n      m68k)\n            # FIXME: we need at least 68020 code to build shared libraries, but\n            # adding the `-m68020' flag to GCC prevents building anything better,\n            # like `-m68040'.\n            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'\n        ;;\n      esac\n      ;;\n\n    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)\n      # PIC is the default for these OSes.\n      ;;\n    mingw* | cygwin* | os2* | pw32* | cegcc*)\n      # This hack is so that the source file can tell whether it is being\n      # built for inclusion in a dll (and should export symbols for example).\n      # Although the cygwin gcc ignores -fPIC, still need this for old-style\n      # (--disable-auto-import) libraries\n      m4_if([$1], [GCJ], [],\n\t[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])\n      ;;\n    darwin* | rhapsody*)\n      # PIC is the default on this platform\n      # Common symbols not allowed in MH_DYLIB files\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'\n      ;;\n    *djgpp*)\n      # DJGPP does not support shared libraries at all\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)=\n      ;;\n    haiku*)\n      # PIC is the default for Haiku.\n      # The \"-static\" flag exists, but is broken.\n      _LT_TAGVAR(lt_prog_compiler_static, $1)=\n      ;;\n    interix[[3-9]]*)\n      # Interix 3.x gcc -fpic/-fPIC options generate broken code.\n      # Instead, we relocate shared libraries at runtime.\n      ;;\n    sysv4*MP*)\n      if test -d /usr/nec; then\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic\n      fi\n      ;;\n    hpux*)\n      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit\n      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag\n      # sets the default TLS model and affects inlining.\n      case $host_cpu in\n      hppa*64*)\n\t;;\n      *)\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n\t;;\n      esac\n      ;;\n    *qnx* | *nto*)\n      # QNX uses GNU C++, but need to define -shared option too, otherwise\n      # it will coredump.\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'\n      ;;\n    *)\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n      ;;\n    esac\n  else\n    case $host_os in\n      aix[[4-9]]*)\n\t# All AIX code is PIC.\n\tif test \"$host_cpu\" = ia64; then\n\t  # AIX 5 now supports IA64 processor\n\t  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\telse\n\t  _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'\n\tfi\n\t;;\n      chorus*)\n\tcase $cc_basename in\n\tcxch68*)\n\t  # Green Hills C++ Compiler\n\t  # _LT_TAGVAR(lt_prog_compiler_static, $1)=\"--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a\"\n\t  ;;\n\tesac\n\t;;\n      mingw* | cygwin* | os2* | pw32* | cegcc*)\n\t# This hack is so that the source file can tell whether it is being\n\t# built for inclusion in a dll (and should export symbols for example).\n\tm4_if([$1], [GCJ], [],\n\t  [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])\n\t;;\n      dgux*)\n\tcase $cc_basename in\n\t  ec++*)\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t    ;;\n\t  ghcx*)\n\t    # Green Hills C++ Compiler\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      freebsd* | dragonfly*)\n\t# FreeBSD uses GNU C++\n\t;;\n      hpux9* | hpux10* | hpux11*)\n\tcase $cc_basename in\n\t  CC*)\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'\n\t    if test \"$host_cpu\" != ia64; then\n\t      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'\n\t    fi\n\t    ;;\n\t  aCC*)\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'\n\t    case $host_cpu in\n\t    hppa*64*|ia64*)\n\t      # +Z the default\n\t      ;;\n\t    *)\n\t      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'\n\t      ;;\n\t    esac\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      interix*)\n\t# This is c89, which is MS Visual C++ (no shared libs)\n\t# Anyone wants to do a port?\n\t;;\n      irix5* | irix6* | nonstopux*)\n\tcase $cc_basename in\n\t  CC*)\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n\t    # CC pic flag -KPIC is the default.\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      linux* | k*bsd*-gnu | kopensolaris*-gnu)\n\tcase $cc_basename in\n\t  KCC*)\n\t    # KAI C++ Compiler\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n\t    ;;\n\t  ecpc* )\n\t    # old Intel C++ for x86_64 which still supported -KPIC.\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'\n\t    ;;\n\t  icpc* )\n\t    # Intel C++, used to be incompatible with GCC.\n\t    # ICC 10 doesn't accept -KPIC any more.\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'\n\t    ;;\n\t  pgCC* | pgcpp*)\n\t    # Portland Group C++ compiler\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t    ;;\n\t  cxx*)\n\t    # Compaq C++\n\t    # Make sure the PIC flag is empty.  It appears that all Alpha\n\t    # Linux and Compaq Tru64 Unix objects are PIC.\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)=\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n\t    ;;\n\t  xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*)\n\t    # IBM XL 8.0, 9.0 on PPC and BlueGene\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'\n\t    ;;\n\t  *)\n\t    case `$CC -V 2>&1 | sed 5q` in\n\t    *Sun\\ C*)\n\t      # Sun C++ 5.9\n\t      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '\n\t      ;;\n\t    esac\n\t    ;;\n\tesac\n\t;;\n      lynxos*)\n\t;;\n      m88k*)\n\t;;\n      mvs*)\n\tcase $cc_basename in\n\t  cxx*)\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      netbsd* | netbsdelf*-gnu)\n\t;;\n      *qnx* | *nto*)\n        # QNX uses GNU C++, but need to define -shared option too, otherwise\n        # it will coredump.\n        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'\n        ;;\n      osf3* | osf4* | osf5*)\n\tcase $cc_basename in\n\t  KCC*)\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'\n\t    ;;\n\t  RCC*)\n\t    # Rational C++ 2.4.1\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'\n\t    ;;\n\t  cxx*)\n\t    # Digital/Compaq C++\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    # Make sure the PIC flag is empty.  It appears that all Alpha\n\t    # Linux and Compaq Tru64 Unix objects are PIC.\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)=\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      psos*)\n\t;;\n      solaris*)\n\tcase $cc_basename in\n\t  CC* | sunCC*)\n\t    # Sun C++ 4.2, 5.x and Centerline C++\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '\n\t    ;;\n\t  gcx*)\n\t    # Green Hills C++ Compiler\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      sunos4*)\n\tcase $cc_basename in\n\t  CC*)\n\t    # Sun C++ 4.x\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t    ;;\n\t  lcc*)\n\t    # Lucid\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)\n\tcase $cc_basename in\n\t  CC*)\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t    ;;\n\tesac\n\t;;\n      tandem*)\n\tcase $cc_basename in\n\t  NCC*)\n\t    # NonStop-UX NCC 3.20\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      vxworks*)\n\t;;\n      *)\n\t_LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no\n\t;;\n    esac\n  fi\n],\n[\n  if test \"$GCC\" = yes; then\n    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'\n\n    case $host_os in\n      aix*)\n      # All AIX code is PIC.\n      if test \"$host_cpu\" = ia64; then\n\t# AIX 5 now supports IA64 processor\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      fi\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n        ;;\n      m68k)\n            # FIXME: we need at least 68020 code to build shared libraries, but\n            # adding the `-m68020' flag to GCC prevents building anything better,\n            # like `-m68040'.\n            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'\n        ;;\n      esac\n      ;;\n\n    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)\n      # PIC is the default for these OSes.\n      ;;\n\n    mingw* | cygwin* | pw32* | os2* | cegcc*)\n      # This hack is so that the source file can tell whether it is being\n      # built for inclusion in a dll (and should export symbols for example).\n      # Although the cygwin gcc ignores -fPIC, still need this for old-style\n      # (--disable-auto-import) libraries\n      m4_if([$1], [GCJ], [],\n\t[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])\n      ;;\n\n    darwin* | rhapsody*)\n      # PIC is the default on this platform\n      # Common symbols not allowed in MH_DYLIB files\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'\n      ;;\n\n    haiku*)\n      # PIC is the default for Haiku.\n      # The \"-static\" flag exists, but is broken.\n      _LT_TAGVAR(lt_prog_compiler_static, $1)=\n      ;;\n\n    hpux*)\n      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit\n      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag\n      # sets the default TLS model and affects inlining.\n      case $host_cpu in\n      hppa*64*)\n\t# +Z the default\n\t;;\n      *)\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n\t;;\n      esac\n      ;;\n\n    interix[[3-9]]*)\n      # Interix 3.x gcc -fpic/-fPIC options generate broken code.\n      # Instead, we relocate shared libraries at runtime.\n      ;;\n\n    msdosdjgpp*)\n      # Just because we use GCC doesn't mean we suddenly get shared libraries\n      # on systems that don't support them.\n      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no\n      enable_shared=no\n      ;;\n\n    *nto* | *qnx*)\n      # QNX uses GNU C++, but need to define -shared option too, otherwise\n      # it will coredump.\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'\n      ;;\n\n    sysv4*MP*)\n      if test -d /usr/nec; then\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic\n      fi\n      ;;\n\n    *)\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n      ;;\n    esac\n\n    case $cc_basename in\n    nvcc*) # Cuda Compiler Driver 2.2\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker '\n      if test -n \"$_LT_TAGVAR(lt_prog_compiler_pic, $1)\"; then\n        _LT_TAGVAR(lt_prog_compiler_pic, $1)=\"-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)\"\n      fi\n      ;;\n    esac\n  else\n    # PORTME Check for flag to pass linker flags through the system compiler.\n    case $host_os in\n    aix*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      if test \"$host_cpu\" = ia64; then\n\t# AIX 5 now supports IA64 processor\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      else\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'\n      fi\n      ;;\n\n    mingw* | cygwin* | pw32* | os2* | cegcc*)\n      # This hack is so that the source file can tell whether it is being\n      # built for inclusion in a dll (and should export symbols for example).\n      m4_if([$1], [GCJ], [],\n\t[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])\n      ;;\n\n    hpux9* | hpux10* | hpux11*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but\n      # not for PA HP-UX.\n      case $host_cpu in\n      hppa*64*|ia64*)\n\t# +Z the default\n\t;;\n      *)\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'\n\t;;\n      esac\n      # Is there a better lt_prog_compiler_static that works with the bundled CC?\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'\n      ;;\n\n    irix5* | irix6* | nonstopux*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      # PIC (with -KPIC) is the default.\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n      ;;\n\n    linux* | k*bsd*-gnu | kopensolaris*-gnu)\n      case $cc_basename in\n      # old Intel for x86_64 which still supported -KPIC.\n      ecc*)\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'\n        ;;\n      # icc used to be incompatible with GCC.\n      # ICC 10 doesn't accept -KPIC any more.\n      icc* | ifort*)\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'\n        ;;\n      # Lahey Fortran 8.1.\n      lf95*)\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='--static'\n\t;;\n      nagfor*)\n\t# NAG Fortran compiler\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,'\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t;;\n      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)\n        # Portland Group compilers (*not* the Pentium gcc compiler,\n\t# which looks to be a dead project)\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n        ;;\n      ccc*)\n        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n        # All Alpha code is PIC.\n        _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n        ;;\n      xl* | bgxl* | bgf* | mpixl*)\n\t# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'\n\t;;\n      *)\n\tcase `$CC -V 2>&1 | sed 5q` in\n\t*Sun\\ Ceres\\ Fortran* | *Sun*Fortran*\\ [[1-7]].* | *Sun*Fortran*\\ 8.[[0-3]]*)\n\t  # Sun Fortran 8.3 passes all unrecognized flags to the linker\n\t  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t  _LT_TAGVAR(lt_prog_compiler_wl, $1)=''\n\t  ;;\n\t*Sun\\ F* | *Sun*Fortran*)\n\t  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '\n\t  ;;\n\t*Sun\\ C*)\n\t  # Sun C 5.9\n\t  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t  ;;\n        *Intel*\\ [[CF]]*Compiler*)\n\t  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n\t  _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'\n\t  ;;\n\t*Portland\\ Group*)\n\t  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'\n\t  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t  ;;\n\tesac\n\t;;\n      esac\n      ;;\n\n    newsos6)\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      ;;\n\n    *nto* | *qnx*)\n      # QNX uses GNU C++, but need to define -shared option too, otherwise\n      # it will coredump.\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'\n      ;;\n\n    osf3* | osf4* | osf5*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      # All OSF/1 code is PIC.\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n      ;;\n\n    rdos*)\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n      ;;\n\n    solaris*)\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      case $cc_basename in\n      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;\n      *)\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;\n      esac\n      ;;\n\n    sunos4*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      ;;\n\n    sysv4 | sysv4.2uw2* | sysv4.3*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      ;;\n\n    sysv4*MP*)\n      if test -d /usr/nec ;then\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      fi\n      ;;\n\n    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      ;;\n\n    unicos*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no\n      ;;\n\n    uts4*)\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      ;;\n\n    *)\n      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no\n      ;;\n    esac\n  fi\n])\ncase $host_os in\n  # For platforms which do not support PIC, -DPIC is meaningless:\n  *djgpp*)\n    _LT_TAGVAR(lt_prog_compiler_pic, $1)=\n    ;;\n  *)\n    _LT_TAGVAR(lt_prog_compiler_pic, $1)=\"$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])\"\n    ;;\nesac\n\nAC_CACHE_CHECK([for $compiler option to produce PIC],\n  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)],\n  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)])\n_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)\n\n#\n# Check to make sure the PIC flag actually works.\n#\nif test -n \"$_LT_TAGVAR(lt_prog_compiler_pic, $1)\"; then\n  _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works],\n    [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)],\n    [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [],\n    [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in\n     \"\" | \" \"*) ;;\n     *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=\" $_LT_TAGVAR(lt_prog_compiler_pic, $1)\" ;;\n     esac],\n    [_LT_TAGVAR(lt_prog_compiler_pic, $1)=\n     _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])\nfi\n_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],\n\t[Additional compiler flags for building library objects])\n\n_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],\n\t[How to pass a linker flag through the compiler])\n#\n# Check to make sure the static flag actually works.\n#\nwl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\\\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\\\"\n_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],\n  _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1),\n  $lt_tmp_static_flag,\n  [],\n  [_LT_TAGVAR(lt_prog_compiler_static, $1)=])\n_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],\n\t[Compiler flag to prevent dynamic linking])\n])# _LT_COMPILER_PIC\n\n\n# _LT_LINKER_SHLIBS([TAGNAME])\n# ----------------------------\n# See if the linker supports building shared libraries.\nm4_defun([_LT_LINKER_SHLIBS],\n[AC_REQUIRE([LT_PATH_LD])dnl\nAC_REQUIRE([LT_PATH_NM])dnl\nm4_require([_LT_PATH_MANIFEST_TOOL])dnl\nm4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_DECL_EGREP])dnl\nm4_require([_LT_DECL_SED])dnl\nm4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl\nm4_require([_LT_TAG_COMPILER])dnl\nAC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])\nm4_if([$1], [CXX], [\n  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\\''s/.* //'\\'' | sort | uniq > $export_symbols'\n  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']\n  case $host_os in\n  aix[[4-9]]*)\n    # If we're using GNU nm, then we don't want the \"-C\" option.\n    # -C means demangle to AIX nm, but means don't demangle with GNU nm\n    # Also, AIX nm treats weak defined symbols like other global defined\n    # symbols, whereas GNU nm marks them as \"W\".\n    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then\n      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\") || (\\$ 2 == \"W\")) && ([substr](\\$ 3,1,1) != \".\")) { print \\$ 3 } }'\\'' | sort -u > $export_symbols'\n    else\n      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\")) && ([substr](\\$ 3,1,1) != \".\")) { print \\$ 3 } }'\\'' | sort -u > $export_symbols'\n    fi\n    ;;\n  pw32*)\n    _LT_TAGVAR(export_symbols_cmds, $1)=\"$ltdll_cmds\"\n    ;;\n  cygwin* | mingw* | cegcc*)\n    case $cc_basename in\n    cl*)\n      _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'\n      ;;\n    *)\n      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\\([[^ ]]*\\)/\\1 DATA/;s/^.*[[ ]]__nm__\\([[^ ]]*\\)[[ ]][[^ ]]*/\\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\\'' | sort | uniq > $export_symbols'\n      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']\n      ;;\n    esac\n    ;;\n  linux* | k*bsd*-gnu | gnu*)\n    _LT_TAGVAR(link_all_deplibs, $1)=no\n    ;;\n  *)\n    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\\''s/.* //'\\'' | sort | uniq > $export_symbols'\n    ;;\n  esac\n], [\n  runpath_var=\n  _LT_TAGVAR(allow_undefined_flag, $1)=\n  _LT_TAGVAR(always_export_symbols, $1)=no\n  _LT_TAGVAR(archive_cmds, $1)=\n  _LT_TAGVAR(archive_expsym_cmds, $1)=\n  _LT_TAGVAR(compiler_needs_object, $1)=no\n  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no\n  _LT_TAGVAR(export_dynamic_flag_spec, $1)=\n  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\\''s/.* //'\\'' | sort | uniq > $export_symbols'\n  _LT_TAGVAR(hardcode_automatic, $1)=no\n  _LT_TAGVAR(hardcode_direct, $1)=no\n  _LT_TAGVAR(hardcode_direct_absolute, $1)=no\n  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=\n  _LT_TAGVAR(hardcode_libdir_separator, $1)=\n  _LT_TAGVAR(hardcode_minus_L, $1)=no\n  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported\n  _LT_TAGVAR(inherit_rpath, $1)=no\n  _LT_TAGVAR(link_all_deplibs, $1)=unknown\n  _LT_TAGVAR(module_cmds, $1)=\n  _LT_TAGVAR(module_expsym_cmds, $1)=\n  _LT_TAGVAR(old_archive_from_new_cmds, $1)=\n  _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)=\n  _LT_TAGVAR(thread_safe_flag_spec, $1)=\n  _LT_TAGVAR(whole_archive_flag_spec, $1)=\n  # include_expsyms should be a list of space-separated symbols to be *always*\n  # included in the symbol list\n  _LT_TAGVAR(include_expsyms, $1)=\n  # exclude_expsyms can be an extended regexp of symbols to exclude\n  # it will be wrapped by ` (' and `)$', so one must not match beginning or\n  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',\n  # as well as any symbol that contains `d'.\n  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']\n  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out\n  # platforms (ab)use it in PIC code, but their linkers get confused if\n  # the symbol is explicitly referenced.  Since portable code cannot\n  # rely on this symbol name, it's probably fine to never include it in\n  # preloaded symbol tables.\n  # Exclude shared library initialization/finalization symbols.\ndnl Note also adjust exclude_expsyms for C++ above.\n  extract_expsyms_cmds=\n\n  case $host_os in\n  cygwin* | mingw* | pw32* | cegcc*)\n    # FIXME: the MSVC++ port hasn't been tested in a loooong time\n    # When not using gcc, we currently assume that we are using\n    # Microsoft Visual C++.\n    if test \"$GCC\" != yes; then\n      with_gnu_ld=no\n    fi\n    ;;\n  interix*)\n    # we just hope/assume this is gcc and not c89 (= MSVC++)\n    with_gnu_ld=yes\n    ;;\n  openbsd*)\n    with_gnu_ld=no\n    ;;\n  linux* | k*bsd*-gnu | gnu*)\n    _LT_TAGVAR(link_all_deplibs, $1)=no\n    ;;\n  esac\n\n  _LT_TAGVAR(ld_shlibs, $1)=yes\n\n  # On some targets, GNU ld is compatible enough with the native linker\n  # that we're better off using the native interface for both.\n  lt_use_gnu_ld_interface=no\n  if test \"$with_gnu_ld\" = yes; then\n    case $host_os in\n      aix*)\n\t# The AIX port of GNU ld has always aspired to compatibility\n\t# with the native linker.  However, as the warning in the GNU ld\n\t# block says, versions before 2.19.5* couldn't really create working\n\t# shared libraries, regardless of the interface used.\n\tcase `$LD -v 2>&1` in\n\t  *\\ \\(GNU\\ Binutils\\)\\ 2.19.5*) ;;\n\t  *\\ \\(GNU\\ Binutils\\)\\ 2.[[2-9]]*) ;;\n\t  *\\ \\(GNU\\ Binutils\\)\\ [[3-9]]*) ;;\n\t  *)\n\t    lt_use_gnu_ld_interface=yes\n\t    ;;\n\tesac\n\t;;\n      *)\n\tlt_use_gnu_ld_interface=yes\n\t;;\n    esac\n  fi\n\n  if test \"$lt_use_gnu_ld_interface\" = yes; then\n    # If archive_cmds runs LD, not CC, wlarc should be empty\n    wlarc='${wl}'\n\n    # Set some defaults for GNU ld with shared library support. These\n    # are reset later if shared libraries are not supported. Putting them\n    # here allows them to be overridden if necessary.\n    runpath_var=LD_RUN_PATH\n    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'\n    # ancient GNU ld didn't support --whole-archive et. al.\n    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then\n      _LT_TAGVAR(whole_archive_flag_spec, $1)=\"$wlarc\"'--whole-archive$convenience '\"$wlarc\"'--no-whole-archive'\n    else\n      _LT_TAGVAR(whole_archive_flag_spec, $1)=\n    fi\n    supports_anon_versioning=no\n    case `$LD -v 2>&1` in\n      *GNU\\ gold*) supports_anon_versioning=yes ;;\n      *\\ [[01]].* | *\\ 2.[[0-9]].* | *\\ 2.10.*) ;; # catch versions < 2.11\n      *\\ 2.11.93.0.2\\ *) supports_anon_versioning=yes ;; # RH7.3 ...\n      *\\ 2.11.92.0.12\\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...\n      *\\ 2.11.*) ;; # other 2.11 versions\n      *) supports_anon_versioning=yes ;;\n    esac\n\n    # See if GNU ld supports shared libraries.\n    case $host_os in\n    aix[[3-9]]*)\n      # On AIX/PPC, the GNU linker is very broken\n      if test \"$host_cpu\" != ia64; then\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n\tcat <<_LT_EOF 1>&2\n\n*** Warning: the GNU linker, at least up to release 2.19, is reported\n*** to be unable to reliably create shared libraries on AIX.\n*** Therefore, libtool is disabling shared libraries support.  If you\n*** really care for shared libraries, you may want to install binutils\n*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.\n*** You will then need to restart the configuration process.\n\n_LT_EOF\n      fi\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n            _LT_TAGVAR(archive_expsym_cmds, $1)=''\n        ;;\n      m68k)\n            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO \"#define NAME $libname\" > $output_objdir/a2ixlibrary.data~$ECHO \"#define LIBRARY_ID 1\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define VERSION $major\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define REVISION $revision\" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'\n            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n            _LT_TAGVAR(hardcode_minus_L, $1)=yes\n        ;;\n      esac\n      ;;\n\n    beos*)\n      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\t_LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n\t# Joseph Beckenbach <jrb3@best.com> says some releases of gcc\n\t# support --undefined.  This deserves some investigation.  FIXME\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n      else\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n      fi\n      ;;\n\n    cygwin* | mingw* | pw32* | cegcc*)\n      # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,\n      # as there is no search path for DLLs.\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'\n      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n      _LT_TAGVAR(always_export_symbols, $1)=no\n      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes\n      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\\([[^ ]]*\\)/\\1 DATA/;s/^.*[[ ]]__nm__\\([[^ ]]*\\)[[ ]][[^ ]]*/\\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\\'' | sort | uniq > $export_symbols'\n      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']\n\n      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then\n        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n\t# If the export-symbols file already is a .def file (1st line\n\t# is EXPORTS), use it as is; otherwise, prepend...\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='if test \"x`$SED 1q $export_symbols`\" = xEXPORTS; then\n\t  cp $export_symbols $output_objdir/$soname.def;\n\telse\n\t  echo EXPORTS > $output_objdir/$soname.def;\n\t  cat $export_symbols >> $output_objdir/$soname.def;\n\tfi~\n\t$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n      else\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n      fi\n      ;;\n\n    haiku*)\n      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n      _LT_TAGVAR(link_all_deplibs, $1)=yes\n      ;;\n\n    interix[[3-9]]*)\n      _LT_TAGVAR(hardcode_direct, $1)=no\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.\n      # Instead, shared libraries are loaded at an image base (0x10000000 by\n      # default) and relocated if they conflict, which is a slow very memory\n      # consuming and fragmenting process.  To avoid this, we pick a random,\n      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link\n      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.\n      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n      _LT_TAGVAR(archive_expsym_cmds, $1)='sed \"s,^,_,\" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n      ;;\n\n    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)\n      tmp_diet=no\n      if test \"$host_os\" = linux-dietlibc; then\n\tcase $cc_basename in\n\t  diet\\ *) tmp_diet=yes;;\t# linux-dietlibc with static linking (!diet-dyn)\n\tesac\n      fi\n      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \\\n\t && test \"$tmp_diet\" = no\n      then\n\ttmp_addflag=' $pic_flag'\n\ttmp_sharedflag='-shared'\n\tcase $cc_basename,$host_cpu in\n        pgcc*)\t\t\t\t# Portland Group C compiler\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t  tmp_addflag=' $pic_flag'\n\t  ;;\n\tpgf77* | pgf90* | pgf95* | pgfortran*)\n\t\t\t\t\t# Portland Group f77 and f90 compilers\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t  tmp_addflag=' $pic_flag -Mnomain' ;;\n\tecc*,ia64* | icc*,ia64*)\t# Intel C compiler on ia64\n\t  tmp_addflag=' -i_dynamic' ;;\n\tefc*,ia64* | ifort*,ia64*)\t# Intel Fortran compiler on ia64\n\t  tmp_addflag=' -i_dynamic -nofor_main' ;;\n\tifc* | ifort*)\t\t\t# Intel Fortran compiler\n\t  tmp_addflag=' -nofor_main' ;;\n\tlf95*)\t\t\t\t# Lahey Fortran 8.1\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)=\n\t  tmp_sharedflag='--shared' ;;\n\txl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below)\n\t  tmp_sharedflag='-qmkshrobj'\n\t  tmp_addflag= ;;\n\tnvcc*)\t# Cuda Compiler Driver 2.2\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t  _LT_TAGVAR(compiler_needs_object, $1)=yes\n\t  ;;\n\tesac\n\tcase `$CC -V 2>&1 | sed 5q` in\n\t*Sun\\ C*)\t\t\t# Sun C 5.9\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\\\"\\\"; do test -z \\\"$conv\\\" || new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t  _LT_TAGVAR(compiler_needs_object, $1)=yes\n\t  tmp_sharedflag='-G' ;;\n\t*Sun\\ F*)\t\t\t# Sun Fortran 8.3\n\t  tmp_sharedflag='-G' ;;\n\tesac\n\t_LT_TAGVAR(archive_cmds, $1)='$CC '\"$tmp_sharedflag\"\"$tmp_addflag\"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\n        if test \"x$supports_anon_versioning\" = xyes; then\n          _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $output_objdir/$libname.ver~\n\t    cat $export_symbols | sed -e \"s/\\(.*\\)/\\1;/\" >> $output_objdir/$libname.ver~\n\t    echo \"local: *; };\" >> $output_objdir/$libname.ver~\n\t    $CC '\"$tmp_sharedflag\"\"$tmp_addflag\"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'\n        fi\n\n\tcase $cc_basename in\n\txlf* | bgf* | bgxlf* | mpixlf*)\n\t  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n\t  _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'\n\t  if test \"x$supports_anon_versioning\" = xyes; then\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $output_objdir/$libname.ver~\n\t      cat $export_symbols | sed -e \"s/\\(.*\\)/\\1;/\" >> $output_objdir/$libname.ver~\n\t      echo \"local: *; };\" >> $output_objdir/$libname.ver~\n\t      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'\n\t  fi\n\t  ;;\n\tesac\n      else\n        _LT_TAGVAR(ld_shlibs, $1)=no\n      fi\n      ;;\n\n    netbsd* | netbsdelf*-gnu)\n      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n\t_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'\n\twlarc=\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n      fi\n      ;;\n\n    solaris*)\n      if $LD -v 2>&1 | $GREP 'BFD 2\\.8' > /dev/null; then\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n\tcat <<_LT_EOF 1>&2\n\n*** Warning: The releases 2.8.* of the GNU linker cannot reliably\n*** create shared libraries on Solaris systems.  Therefore, libtool\n*** is disabling shared libraries support.  We urge you to upgrade GNU\n*** binutils to release 2.9.1 or newer.  Another option is to modify\n*** your PATH or compiler configuration so that the native linker is\n*** used, and then restart.\n\n_LT_EOF\n      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n      else\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n      fi\n      ;;\n\n    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)\n      case `$LD -v 2>&1` in\n        *\\ [[01]].* | *\\ 2.[[0-9]].* | *\\ 2.1[[0-5]].*)\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n\tcat <<_LT_EOF 1>&2\n\n*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not\n*** reliably create shared libraries on SCO systems.  Therefore, libtool\n*** is disabling shared libraries support.  We urge you to upgrade GNU\n*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify\n*** your PATH or compiler configuration so that the native linker is\n*** used, and then restart.\n\n_LT_EOF\n\t;;\n\t*)\n\t  # For security reasons, it is highly recommended that you always\n\t  # use absolute paths for naming shared libraries, and exclude the\n\t  # DT_RUNPATH tag from executables and libraries.  But doing so\n\t  # requires that you compile everything twice, which is a pain.\n\t  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n\t  else\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t  fi\n\t;;\n      esac\n      ;;\n\n    sunos4*)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'\n      wlarc=\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    *)\n      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n      else\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n      fi\n      ;;\n    esac\n\n    if test \"$_LT_TAGVAR(ld_shlibs, $1)\" = no; then\n      runpath_var=\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)=\n      _LT_TAGVAR(whole_archive_flag_spec, $1)=\n    fi\n  else\n    # PORTME fill in a description of your system's linker (not GNU ld)\n    case $host_os in\n    aix3*)\n      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n      _LT_TAGVAR(always_export_symbols, $1)=yes\n      _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'\n      # Note: this linker hardcodes the directories in LIBPATH if there\n      # are no directories specified by -L.\n      _LT_TAGVAR(hardcode_minus_L, $1)=yes\n      if test \"$GCC\" = yes && test -z \"$lt_prog_compiler_static\"; then\n\t# Neither direct hardcoding nor static linking is supported with a\n\t# broken collect2.\n\t_LT_TAGVAR(hardcode_direct, $1)=unsupported\n      fi\n      ;;\n\n    aix[[4-9]]*)\n      if test \"$host_cpu\" = ia64; then\n\t# On IA64, the linker does run time linking by default, so we don't\n\t# have to do anything special.\n\taix_use_runtimelinking=no\n\texp_sym_flag='-Bexport'\n\tno_entry_flag=\"\"\n      else\n\t# If we're using GNU nm, then we don't want the \"-C\" option.\n\t# -C means demangle to AIX nm, but means don't demangle with GNU nm\n\t# Also, AIX nm treats weak defined symbols like other global\n\t# defined symbols, whereas GNU nm marks them as \"W\".\n\tif $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then\n\t  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\") || (\\$ 2 == \"W\")) && ([substr](\\$ 3,1,1) != \".\")) { print \\$ 3 } }'\\'' | sort -u > $export_symbols'\n\telse\n\t  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\")) && ([substr](\\$ 3,1,1) != \".\")) { print \\$ 3 } }'\\'' | sort -u > $export_symbols'\n\tfi\n\taix_use_runtimelinking=no\n\n\t# Test if we are trying to use run time linking or normal\n\t# AIX style linking. If -brtl is somewhere in LDFLAGS, we\n\t# need to do runtime linking.\n\tcase $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)\n\t  for ld_flag in $LDFLAGS; do\n\t  if (test $ld_flag = \"-brtl\" || test $ld_flag = \"-Wl,-brtl\"); then\n\t    aix_use_runtimelinking=yes\n\t    break\n\t  fi\n\t  done\n\t  ;;\n\tesac\n\n\texp_sym_flag='-bexport'\n\tno_entry_flag='-bnoentry'\n      fi\n\n      # When large executables or shared objects are built, AIX ld can\n      # have problems creating the table of contents.  If linking a library\n      # or program results in \"error TOC overflow\" add -mminimal-toc to\n      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not\n      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.\n\n      _LT_TAGVAR(archive_cmds, $1)=''\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'\n      _LT_TAGVAR(link_all_deplibs, $1)=yes\n      _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'\n\n      if test \"$GCC\" = yes; then\n\tcase $host_os in aix4.[[012]]|aix4.[[012]].*)\n\t# We only want to do this on AIX 4.2 and lower, the check\n\t# below for broken collect2 doesn't work under 4.3+\n\t  collect2name=`${CC} -print-prog-name=collect2`\n\t  if test -f \"$collect2name\" &&\n\t   strings \"$collect2name\" | $GREP resolve_lib_name >/dev/null\n\t  then\n\t  # We have reworked collect2\n\t  :\n\t  else\n\t  # We have old collect2\n\t  _LT_TAGVAR(hardcode_direct, $1)=unsupported\n\t  # It fails to find uninstalled libraries when the uninstalled\n\t  # path is not listed in the libpath.  Setting hardcode_minus_L\n\t  # to unsupported forces relinking\n\t  _LT_TAGVAR(hardcode_minus_L, $1)=yes\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n\t  _LT_TAGVAR(hardcode_libdir_separator, $1)=\n\t  fi\n\t  ;;\n\tesac\n\tshared_flag='-shared'\n\tif test \"$aix_use_runtimelinking\" = yes; then\n\t  shared_flag=\"$shared_flag \"'${wl}-G'\n\tfi\n\t_LT_TAGVAR(link_all_deplibs, $1)=no\n      else\n\t# not using gcc\n\tif test \"$host_cpu\" = ia64; then\n\t# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release\n\t# chokes on -Wl,-G. The following line is correct:\n\t  shared_flag='-G'\n\telse\n\t  if test \"$aix_use_runtimelinking\" = yes; then\n\t    shared_flag='${wl}-G'\n\t  else\n\t    shared_flag='${wl}-bM:SRE'\n\t  fi\n\tfi\n      fi\n\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'\n      # It seems that -bexpall does not export symbols beginning with\n      # underscore (_), so it is better to generate a list of symbols to export.\n      _LT_TAGVAR(always_export_symbols, $1)=yes\n      if test \"$aix_use_runtimelinking\" = yes; then\n\t# Warning - without using the other runtime loading flags (-brtl),\n\t# -berok will link without error, but may produce a broken library.\n\t_LT_TAGVAR(allow_undefined_flag, $1)='-berok'\n        # Determine the default libpath from the value encoded in an\n        # empty executable.\n        _LT_SYS_MODULE_PATH_AIX([$1])\n        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'\"$aix_libpath\"\n        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '\"\\${wl}$no_entry_flag\"' $compiler_flags `if test \"x${allow_undefined_flag}\" != \"x\"; then func_echo_all \"${wl}${allow_undefined_flag}\"; else :; fi` '\"\\${wl}$exp_sym_flag:\\$export_symbols $shared_flag\"\n      else\n\tif test \"$host_cpu\" = ia64; then\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'\n\t  _LT_TAGVAR(allow_undefined_flag, $1)=\"-z nodefs\"\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)=\"\\$CC $shared_flag\"' -o $output_objdir/$soname $libobjs $deplibs '\"\\${wl}$no_entry_flag\"' $compiler_flags ${wl}${allow_undefined_flag} '\"\\${wl}$exp_sym_flag:\\$export_symbols\"\n\telse\n\t # Determine the default libpath from the value encoded in an\n\t # empty executable.\n\t _LT_SYS_MODULE_PATH_AIX([$1])\n\t _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'\"$aix_libpath\"\n\t  # Warning - without using the other run time loading flags,\n\t  # -berok will link without error, but may produce a broken library.\n\t  _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'\n\t  _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'\n\t  if test \"$with_gnu_ld\" = yes; then\n\t    # We only use this code for GNU lds that support --whole-archive.\n\t    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'\n\t  else\n\t    # Exported symbols can be pulled into shared objects from archives\n\t    _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'\n\t  fi\n\t  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes\n\t  # This is similar to how AIX traditionally builds its shared libraries.\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)=\"\\$CC $shared_flag\"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'\n\tfi\n      fi\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n            _LT_TAGVAR(archive_expsym_cmds, $1)=''\n        ;;\n      m68k)\n            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO \"#define NAME $libname\" > $output_objdir/a2ixlibrary.data~$ECHO \"#define LIBRARY_ID 1\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define VERSION $major\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define REVISION $revision\" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'\n            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n            _LT_TAGVAR(hardcode_minus_L, $1)=yes\n        ;;\n      esac\n      ;;\n\n    bsdi[[45]]*)\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic\n      ;;\n\n    cygwin* | mingw* | pw32* | cegcc*)\n      # When not using gcc, we currently assume that we are using\n      # Microsoft Visual C++.\n      # hardcode_libdir_flag_spec is actually meaningless, as there is\n      # no search path for DLLs.\n      case $cc_basename in\n      cl*)\n\t# Native MSVC\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '\n\t_LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n\t_LT_TAGVAR(always_export_symbols, $1)=yes\n\t_LT_TAGVAR(file_list_spec, $1)='@'\n\t# Tell ltmain to make .lib files, not .a files.\n\tlibext=lib\n\t# Tell ltmain to make .dll files, not .so files.\n\tshrext_cmds=\".dll\"\n\t# FIXME: Setting linknames here is a bad hack.\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='if test \"x`$SED 1q $export_symbols`\" = xEXPORTS; then\n\t    sed -n -e 's/\\\\\\\\\\\\\\(.*\\\\\\\\\\\\\\)/-link\\\\\\ -EXPORT:\\\\\\\\\\\\\\1/' -e '1\\\\\\!p' < $export_symbols > $output_objdir/$soname.exp;\n\t  else\n\t    sed -e 's/\\\\\\\\\\\\\\(.*\\\\\\\\\\\\\\)/-link\\\\\\ -EXPORT:\\\\\\\\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;\n\t  fi~\n\t  $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs \"@$tool_output_objdir$soname.exp\" -Wl,-DLL,-IMPLIB:\"$tool_output_objdir$libname.dll.lib\"~\n\t  linknames='\n\t# The linker will not automatically build a static lib if we build a DLL.\n\t# _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'\n\t_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes\n\t_LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'\n\t_LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\\([[^ ]]*\\)/\\1,DATA/'\\'' | $SED -e '\\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\\'' | sort | uniq > $export_symbols'\n\t# Don't use ranlib\n\t_LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'\n\t_LT_TAGVAR(postlink_cmds, $1)='lt_outputfile=\"@OUTPUT@\"~\n\t  lt_tool_outputfile=\"@TOOL_OUTPUT@\"~\n\t  case $lt_outputfile in\n\t    *.exe|*.EXE) ;;\n\t    *)\n\t      lt_outputfile=\"$lt_outputfile.exe\"\n\t      lt_tool_outputfile=\"$lt_tool_outputfile.exe\"\n\t      ;;\n\t  esac~\n\t  if test \"$MANIFEST_TOOL\" != \":\" && test -f \"$lt_outputfile.manifest\"; then\n\t    $MANIFEST_TOOL -manifest \"$lt_tool_outputfile.manifest\" -outputresource:\"$lt_tool_outputfile\" || exit 1;\n\t    $RM \"$lt_outputfile.manifest\";\n\t  fi'\n\t;;\n      *)\n\t# Assume MSVC wrapper\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '\n\t_LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n\t# Tell ltmain to make .lib files, not .a files.\n\tlibext=lib\n\t# Tell ltmain to make .dll files, not .so files.\n\tshrext_cmds=\".dll\"\n\t# FIXME: Setting linknames here is a bad hack.\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all \"$deplibs\" | $SED '\\''s/ -lc$//'\\''` -link -dll~linknames='\n\t# The linker will automatically build a .lib file if we build a DLL.\n\t_LT_TAGVAR(old_archive_from_new_cmds, $1)='true'\n\t# FIXME: Should let the user specify the lib program.\n\t_LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'\n\t_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes\n\t;;\n      esac\n      ;;\n\n    darwin* | rhapsody*)\n      _LT_DARWIN_LINKER_FEATURES($1)\n      ;;\n\n    dgux*)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor\n    # support.  Future versions do this automatically, but an explicit c++rt0.o\n    # does not break anything, and helps significantly (at the cost of a little\n    # extra space).\n    freebsd2.2*)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    # Unfortunately, older versions of FreeBSD 2 do not have this feature.\n    freebsd2.*)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_minus_L, $1)=yes\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.\n    freebsd* | dragonfly*)\n      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    hpux9*)\n      if test \"$GCC\" = yes; then\n\t_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'\n      fi\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n\n      # hardcode_minus_L: Not really in the search PATH,\n      # but as the default location of the library.\n      _LT_TAGVAR(hardcode_minus_L, $1)=yes\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n      ;;\n\n    hpux10*)\n      if test \"$GCC\" = yes && test \"$with_gnu_ld\" = no; then\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'\n      fi\n      if test \"$with_gnu_ld\" = no; then\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'\n\t_LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\t_LT_TAGVAR(hardcode_direct, $1)=yes\n\t_LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n\t_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n\t# hardcode_minus_L: Not really in the search PATH,\n\t# but as the default location of the library.\n\t_LT_TAGVAR(hardcode_minus_L, $1)=yes\n      fi\n      ;;\n\n    hpux11*)\n      if test \"$GCC\" = yes && test \"$with_gnu_ld\" = no; then\n\tcase $host_cpu in\n\thppa*64*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\tia64*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\t*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\tesac\n      else\n\tcase $host_cpu in\n\thppa*64*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\tia64*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\t*)\n\tm4_if($1, [], [\n\t  # Older versions of the 11.00 compiler do not understand -b yet\n\t  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)\n\t  _LT_LINKER_OPTION([if $CC understands -b],\n\t    _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b],\n\t    [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],\n\t    [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])],\n\t  [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])\n\t  ;;\n\tesac\n      fi\n      if test \"$with_gnu_ld\" = no; then\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'\n\t_LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\n\tcase $host_cpu in\n\thppa*64*|ia64*)\n\t  _LT_TAGVAR(hardcode_direct, $1)=no\n\t  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\t  ;;\n\t*)\n\t  _LT_TAGVAR(hardcode_direct, $1)=yes\n\t  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n\t  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n\n\t  # hardcode_minus_L: Not really in the search PATH,\n\t  # but as the default location of the library.\n\t  _LT_TAGVAR(hardcode_minus_L, $1)=yes\n\t  ;;\n\tesac\n      fi\n      ;;\n\n    irix5* | irix6* | nonstopux*)\n      if test \"$GCC\" = yes; then\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version ${wl}$verstring\"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n\t# Try to use the -exported_symbol ld option, if it does not\n\t# work, assume that -exports_file does not work either and\n\t# implicitly export all symbols.\n\t# This should be the same for all languages, so no per-tag cache variable.\n\tAC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol],\n\t  [lt_cv_irix_exported_symbol],\n\t  [save_LDFLAGS=\"$LDFLAGS\"\n\t   LDFLAGS=\"$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null\"\n\t   AC_LINK_IFELSE(\n\t     [AC_LANG_SOURCE(\n\t        [AC_LANG_CASE([C], [[int foo (void) { return 0; }]],\n\t\t\t      [C++], [[int foo (void) { return 0; }]],\n\t\t\t      [Fortran 77], [[\n      subroutine foo\n      end]],\n\t\t\t      [Fortran], [[\n      subroutine foo\n      end]])])],\n\t      [lt_cv_irix_exported_symbol=yes],\n\t      [lt_cv_irix_exported_symbol=no])\n           LDFLAGS=\"$save_LDFLAGS\"])\n\tif test \"$lt_cv_irix_exported_symbol\" = yes; then\n          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version ${wl}$verstring\"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'\n\tfi\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -o $lib'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'\n      fi\n      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n      _LT_TAGVAR(inherit_rpath, $1)=yes\n      _LT_TAGVAR(link_all_deplibs, $1)=yes\n      ;;\n\n    netbsd* | netbsdelf*-gnu)\n      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n\t_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF\n      fi\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    newsos6)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    *nto* | *qnx*)\n      ;;\n\n    openbsd*)\n      if test -f /usr/libexec/ld.so; then\n\t_LT_TAGVAR(hardcode_direct, $1)=yes\n\t_LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\t_LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n\tif test -z \"`echo __ELF__ | $CC -E - | $GREP __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'\n\t  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n\telse\n\t  case $host_os in\n\t   openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)\n\t     _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'\n\t     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n\t     ;;\n\t   *)\n\t     _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'\n\t     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'\n\t     ;;\n\t  esac\n\tfi\n      else\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n      fi\n      ;;\n\n    os2*)\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n      _LT_TAGVAR(hardcode_minus_L, $1)=yes\n      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n      _LT_TAGVAR(archive_cmds, $1)='$ECHO \"LIBRARY $libname INITINSTANCE\" > $output_objdir/$libname.def~$ECHO \"DESCRIPTION \\\"$libname\\\"\" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo \" SINGLE NONSHARED\" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'\n      _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'\n      ;;\n\n    osf3*)\n      if test \"$GCC\" = yes; then\n\t_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\\*'\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version ${wl}$verstring\"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n      else\n\t_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \\*'\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -o $lib'\n      fi\n      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n      ;;\n\n    osf4* | osf5*)\t# as osf3* with the addition of -msym flag\n      if test \"$GCC\" = yes; then\n\t_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\\*'\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version ${wl}$verstring\"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n      else\n\t_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \\*'\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -o $lib'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf \"%s %s\\\\n\" -exported_symbol \"\\$i\" >> $lib.exp; done; printf \"%s\\\\n\" \"-hidden\">> $lib.exp~\n\t$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n \"$verstring\" && $ECHO \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'\n\n\t# Both c and cxx compiler support -rpath directly\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'\n      fi\n      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n      ;;\n\n    solaris*)\n      _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'\n      if test \"$GCC\" = yes; then\n\twlarc='${wl}'\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t  $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'\n      else\n\tcase `$CC -V 2>&1` in\n\t*\"Compilers 5.0\"*)\n\t  wlarc=''\n\t  _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'\n\t  ;;\n\t*)\n\t  wlarc='${wl}'\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'\n\t  ;;\n\tesac\n      fi\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      case $host_os in\n      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;\n      *)\n\t# The compiler driver will combine and reorder linker options,\n\t# but understands `-z linker_flag'.  GCC discards it without `$wl',\n\t# but is careful enough not to reorder.\n\t# Supported since Solaris 2.6 (maybe 2.5.1?)\n\tif test \"$GCC\" = yes; then\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'\n\telse\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'\n\tfi\n\t;;\n      esac\n      _LT_TAGVAR(link_all_deplibs, $1)=yes\n      ;;\n\n    sunos4*)\n      if test \"x$host_vendor\" = xsequent; then\n\t# Use $CC to link under sequent, because it throws in some extra .o\n\t# files that make .init and .fini sections work.\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'\n      fi\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_minus_L, $1)=yes\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    sysv4)\n      case $host_vendor in\n\tsni)\n\t  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t  _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true???\n\t;;\n\tsiemens)\n\t  ## LD is ld it makes a PLAMLIB\n\t  ## CC just makes a GrossModule.\n\t  _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'\n\t  _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'\n\t  _LT_TAGVAR(hardcode_direct, $1)=no\n        ;;\n\tmotorola)\n\t  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t  _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie\n\t;;\n      esac\n      runpath_var='LD_RUN_PATH'\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    sysv4.3*)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'\n      ;;\n\n    sysv4*MP*)\n      if test -d /usr/nec; then\n\t_LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t_LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\trunpath_var=LD_RUN_PATH\n\thardcode_runpath_var=yes\n\t_LT_TAGVAR(ld_shlibs, $1)=yes\n      fi\n      ;;\n\n    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)\n      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'\n      _LT_TAGVAR(archive_cmds_need_lc, $1)=no\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      runpath_var='LD_RUN_PATH'\n\n      if test \"$GCC\" = yes; then\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      fi\n      ;;\n\n    sysv5* | sco3.2v5* | sco5v6*)\n      # Note: We can NOT use -z defs as we might desire, because we do not\n      # link with -lc, and that would cause any symbols used from libc to\n      # always be unresolved, which means just about no library would\n      # ever link correctly.  If we're not using GNU ld we use -z text\n      # though, which does catch some bad symbols but isn't as heavy-handed\n      # as -z defs.\n      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'\n      _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'\n      _LT_TAGVAR(archive_cmds_need_lc, $1)=no\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'\n      _LT_TAGVAR(link_all_deplibs, $1)=yes\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'\n      runpath_var='LD_RUN_PATH'\n\n      if test \"$GCC\" = yes; then\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      fi\n      ;;\n\n    uts4*)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    *)\n      _LT_TAGVAR(ld_shlibs, $1)=no\n      ;;\n    esac\n\n    if test x$host_vendor = xsni; then\n      case $host in\n      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)\n\t_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym'\n\t;;\n      esac\n    fi\n  fi\n])\nAC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])\ntest \"$_LT_TAGVAR(ld_shlibs, $1)\" = no && can_build_shared=no\n\n_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld\n\n_LT_DECL([], [libext], [0], [Old archive suffix (normally \"a\")])dnl\n_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally \".so\")])dnl\n_LT_DECL([], [extract_expsyms_cmds], [2],\n    [The commands to extract the exported symbol list from a shared archive])\n\n#\n# Do we need to explicitly link libc?\n#\ncase \"x$_LT_TAGVAR(archive_cmds_need_lc, $1)\" in\nx|xyes)\n  # Assume -lc should be added\n  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes\n\n  if test \"$enable_shared\" = yes && test \"$GCC\" = yes; then\n    case $_LT_TAGVAR(archive_cmds, $1) in\n    *'~'*)\n      # FIXME: we may have to deal with multi-command sequences.\n      ;;\n    '$CC '*)\n      # Test whether the compiler implicitly links with -lc since on some\n      # systems, -lgcc has to come before -lc. If gcc already passes -lc\n      # to ld, don't add -lc before -lgcc.\n      AC_CACHE_CHECK([whether -lc should be explicitly linked in],\n\t[lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1),\n\t[$RM conftest*\n\techo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n\n\tif AC_TRY_EVAL(ac_compile) 2>conftest.err; then\n\t  soname=conftest\n\t  lib=conftest\n\t  libobjs=conftest.$ac_objext\n\t  deplibs=\n\t  wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)\n\t  pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)\n\t  compiler_flags=-v\n\t  linker_flags=-v\n\t  verstring=\n\t  output_objdir=.\n\t  libname=conftest\n\t  lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)\n\t  _LT_TAGVAR(allow_undefined_flag, $1)=\n\t  if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\\>\\&1 \\| $GREP \\\" -lc \\\" \\>/dev/null 2\\>\\&1)\n\t  then\n\t    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no\n\t  else\n\t    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes\n\t  fi\n\t  _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag\n\telse\n\t  cat conftest.err 1>&5\n\tfi\n\t$RM conftest*\n\t])\n      _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)\n      ;;\n    esac\n  fi\n  ;;\nesac\n\n_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0],\n    [Whether or not to add -lc for building shared libraries])\n_LT_TAGDECL([allow_libtool_libs_with_static_runtimes],\n    [enable_shared_with_static_runtimes], [0],\n    [Whether or not to disallow shared libs when runtime libs are static])\n_LT_TAGDECL([], [export_dynamic_flag_spec], [1],\n    [Compiler flag to allow reflexive dlopens])\n_LT_TAGDECL([], [whole_archive_flag_spec], [1],\n    [Compiler flag to generate shared objects directly from archives])\n_LT_TAGDECL([], [compiler_needs_object], [1],\n    [Whether the compiler copes with passing no objects directly])\n_LT_TAGDECL([], [old_archive_from_new_cmds], [2],\n    [Create an old-style archive from a shared archive])\n_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2],\n    [Create a temporary old-style archive to link instead of a shared archive])\n_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive])\n_LT_TAGDECL([], [archive_expsym_cmds], [2])\n_LT_TAGDECL([], [module_cmds], [2],\n    [Commands used to build a loadable module if different from building\n    a shared archive.])\n_LT_TAGDECL([], [module_expsym_cmds], [2])\n_LT_TAGDECL([], [with_gnu_ld], [1],\n    [Whether we are building with GNU ld or not])\n_LT_TAGDECL([], [allow_undefined_flag], [1],\n    [Flag that allows shared libraries with undefined symbols to be built])\n_LT_TAGDECL([], [no_undefined_flag], [1],\n    [Flag that enforces no undefined symbols])\n_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],\n    [Flag to hardcode $libdir into a binary during linking.\n    This must work even if $libdir does not exist])\n_LT_TAGDECL([], [hardcode_libdir_separator], [1],\n    [Whether we need a single \"-rpath\" flag with a separated argument])\n_LT_TAGDECL([], [hardcode_direct], [0],\n    [Set to \"yes\" if using DIR/libNAME${shared_ext} during linking hardcodes\n    DIR into the resulting binary])\n_LT_TAGDECL([], [hardcode_direct_absolute], [0],\n    [Set to \"yes\" if using DIR/libNAME${shared_ext} during linking hardcodes\n    DIR into the resulting binary and the resulting library dependency is\n    \"absolute\", i.e impossible to change by setting ${shlibpath_var} if the\n    library is relocated])\n_LT_TAGDECL([], [hardcode_minus_L], [0],\n    [Set to \"yes\" if using the -LDIR flag during linking hardcodes DIR\n    into the resulting binary])\n_LT_TAGDECL([], [hardcode_shlibpath_var], [0],\n    [Set to \"yes\" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR\n    into the resulting binary])\n_LT_TAGDECL([], [hardcode_automatic], [0],\n    [Set to \"yes\" if building a shared library automatically hardcodes DIR\n    into the library and all subsequent libraries and executables linked\n    against it])\n_LT_TAGDECL([], [inherit_rpath], [0],\n    [Set to yes if linker adds runtime paths of dependent libraries\n    to runtime path list])\n_LT_TAGDECL([], [link_all_deplibs], [0],\n    [Whether libtool must link a program against all its dependency libraries])\n_LT_TAGDECL([], [always_export_symbols], [0],\n    [Set to \"yes\" if exported symbols are required])\n_LT_TAGDECL([], [export_symbols_cmds], [2],\n    [The commands to list exported symbols])\n_LT_TAGDECL([], [exclude_expsyms], [1],\n    [Symbols that should not be listed in the preloaded symbols])\n_LT_TAGDECL([], [include_expsyms], [1],\n    [Symbols that must always be exported])\n_LT_TAGDECL([], [prelink_cmds], [2],\n    [Commands necessary for linking programs (against libraries) with templates])\n_LT_TAGDECL([], [postlink_cmds], [2],\n    [Commands necessary for finishing linking programs])\n_LT_TAGDECL([], [file_list_spec], [1],\n    [Specify filename containing input files])\ndnl FIXME: Not yet implemented\ndnl _LT_TAGDECL([], [thread_safe_flag_spec], [1],\ndnl    [Compiler flag to generate thread safe objects])\n])# _LT_LINKER_SHLIBS\n\n\n# _LT_LANG_C_CONFIG([TAG])\n# ------------------------\n# Ensure that the configuration variables for a C compiler are suitably\n# defined.  These variables are subsequently used by _LT_CONFIG to write\n# the compiler configuration to `libtool'.\nm4_defun([_LT_LANG_C_CONFIG],\n[m4_require([_LT_DECL_EGREP])dnl\nlt_save_CC=\"$CC\"\nAC_LANG_PUSH(C)\n\n# Source file extension for C test sources.\nac_ext=c\n\n# Object file extension for compiled C test sources.\nobjext=o\n_LT_TAGVAR(objext, $1)=$objext\n\n# Code to be used in simple compile tests\nlt_simple_compile_test_code=\"int some_variable = 0;\"\n\n# Code to be used in simple link tests\nlt_simple_link_test_code='int main(){return(0);}'\n\n_LT_TAG_COMPILER\n# Save the default compiler, since it gets overwritten when the other\n# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.\ncompiler_DEFAULT=$CC\n\n# save warnings/boilerplate of simple test code\n_LT_COMPILER_BOILERPLATE\n_LT_LINKER_BOILERPLATE\n\n## CAVEAT EMPTOR:\n## There is no encapsulation within the following macros, do not change\n## the running order or otherwise move them around unless you know exactly\n## what you are doing...\nif test -n \"$compiler\"; then\n  _LT_COMPILER_NO_RTTI($1)\n  _LT_COMPILER_PIC($1)\n  _LT_COMPILER_C_O($1)\n  _LT_COMPILER_FILE_LOCKS($1)\n  _LT_LINKER_SHLIBS($1)\n  _LT_SYS_DYNAMIC_LINKER($1)\n  _LT_LINKER_HARDCODE_LIBPATH($1)\n  LT_SYS_DLOPEN_SELF\n  _LT_CMD_STRIPLIB\n\n  # Report which library types will actually be built\n  AC_MSG_CHECKING([if libtool supports shared libraries])\n  AC_MSG_RESULT([$can_build_shared])\n\n  AC_MSG_CHECKING([whether to build shared libraries])\n  test \"$can_build_shared\" = \"no\" && enable_shared=no\n\n  # On AIX, shared libraries and static libraries use the same namespace, and\n  # are all built from PIC.\n  case $host_os in\n  aix3*)\n    test \"$enable_shared\" = yes && enable_static=no\n    if test -n \"$RANLIB\"; then\n      archive_cmds=\"$archive_cmds~\\$RANLIB \\$lib\"\n      postinstall_cmds='$RANLIB $lib'\n    fi\n    ;;\n\n  aix[[4-9]]*)\n    if test \"$host_cpu\" != ia64 && test \"$aix_use_runtimelinking\" = no ; then\n      test \"$enable_shared\" = yes && enable_static=no\n    fi\n    ;;\n  esac\n  AC_MSG_RESULT([$enable_shared])\n\n  AC_MSG_CHECKING([whether to build static libraries])\n  # Make sure either enable_shared or enable_static is yes.\n  test \"$enable_shared\" = yes || enable_static=yes\n  AC_MSG_RESULT([$enable_static])\n\n  _LT_CONFIG($1)\nfi\nAC_LANG_POP\nCC=\"$lt_save_CC\"\n])# _LT_LANG_C_CONFIG\n\n\n# _LT_LANG_CXX_CONFIG([TAG])\n# --------------------------\n# Ensure that the configuration variables for a C++ compiler are suitably\n# defined.  These variables are subsequently used by _LT_CONFIG to write\n# the compiler configuration to `libtool'.\nm4_defun([_LT_LANG_CXX_CONFIG],\n[m4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_DECL_EGREP])dnl\nm4_require([_LT_PATH_MANIFEST_TOOL])dnl\nif test -n \"$CXX\" && ( test \"X$CXX\" != \"Xno\" &&\n    ( (test \"X$CXX\" = \"Xg++\" && `g++ -v >/dev/null 2>&1` ) ||\n    (test \"X$CXX\" != \"Xg++\"))) ; then\n  AC_PROG_CXXCPP\nelse\n  _lt_caught_CXX_error=yes\nfi\n\nAC_LANG_PUSH(C++)\n_LT_TAGVAR(archive_cmds_need_lc, $1)=no\n_LT_TAGVAR(allow_undefined_flag, $1)=\n_LT_TAGVAR(always_export_symbols, $1)=no\n_LT_TAGVAR(archive_expsym_cmds, $1)=\n_LT_TAGVAR(compiler_needs_object, $1)=no\n_LT_TAGVAR(export_dynamic_flag_spec, $1)=\n_LT_TAGVAR(hardcode_direct, $1)=no\n_LT_TAGVAR(hardcode_direct_absolute, $1)=no\n_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=\n_LT_TAGVAR(hardcode_libdir_separator, $1)=\n_LT_TAGVAR(hardcode_minus_L, $1)=no\n_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported\n_LT_TAGVAR(hardcode_automatic, $1)=no\n_LT_TAGVAR(inherit_rpath, $1)=no\n_LT_TAGVAR(module_cmds, $1)=\n_LT_TAGVAR(module_expsym_cmds, $1)=\n_LT_TAGVAR(link_all_deplibs, $1)=unknown\n_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds\n_LT_TAGVAR(reload_flag, $1)=$reload_flag\n_LT_TAGVAR(reload_cmds, $1)=$reload_cmds\n_LT_TAGVAR(no_undefined_flag, $1)=\n_LT_TAGVAR(whole_archive_flag_spec, $1)=\n_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no\n\n# Source file extension for C++ test sources.\nac_ext=cpp\n\n# Object file extension for compiled C++ test sources.\nobjext=o\n_LT_TAGVAR(objext, $1)=$objext\n\n# No sense in running all these tests if we already determined that\n# the CXX compiler isn't working.  Some variables (like enable_shared)\n# are currently assumed to apply to all compilers on this platform,\n# and will be corrupted by setting them based on a non-working compiler.\nif test \"$_lt_caught_CXX_error\" != yes; then\n  # Code to be used in simple compile tests\n  lt_simple_compile_test_code=\"int some_variable = 0;\"\n\n  # Code to be used in simple link tests\n  lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'\n\n  # ltmain only uses $CC for tagged configurations so make sure $CC is set.\n  _LT_TAG_COMPILER\n\n  # save warnings/boilerplate of simple test code\n  _LT_COMPILER_BOILERPLATE\n  _LT_LINKER_BOILERPLATE\n\n  # Allow CC to be a program name with arguments.\n  lt_save_CC=$CC\n  lt_save_CFLAGS=$CFLAGS\n  lt_save_LD=$LD\n  lt_save_GCC=$GCC\n  GCC=$GXX\n  lt_save_with_gnu_ld=$with_gnu_ld\n  lt_save_path_LD=$lt_cv_path_LD\n  if test -n \"${lt_cv_prog_gnu_ldcxx+set}\"; then\n    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx\n  else\n    $as_unset lt_cv_prog_gnu_ld\n  fi\n  if test -n \"${lt_cv_path_LDCXX+set}\"; then\n    lt_cv_path_LD=$lt_cv_path_LDCXX\n  else\n    $as_unset lt_cv_path_LD\n  fi\n  test -z \"${LDCXX+set}\" || LD=$LDCXX\n  CC=${CXX-\"c++\"}\n  CFLAGS=$CXXFLAGS\n  compiler=$CC\n  _LT_TAGVAR(compiler, $1)=$CC\n  _LT_CC_BASENAME([$compiler])\n\n  if test -n \"$compiler\"; then\n    # We don't want -fno-exception when compiling C++ code, so set the\n    # no_builtin_flag separately\n    if test \"$GXX\" = yes; then\n      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'\n    else\n      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=\n    fi\n\n    if test \"$GXX\" = yes; then\n      # Set up default GNU C++ configuration\n\n      LT_PATH_LD\n\n      # Check if GNU C++ uses GNU ld as the underlying linker, since the\n      # archiving commands below assume that GNU ld is being used.\n      if test \"$with_gnu_ld\" = yes; then\n        _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'\n        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n\n        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'\n\n        # If archive_cmds runs LD, not CC, wlarc should be empty\n        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to\n        #     investigate it a little bit more. (MM)\n        wlarc='${wl}'\n\n        # ancient GNU ld didn't support --whole-archive et. al.\n        if eval \"`$CC -print-prog-name=ld` --help 2>&1\" |\n\t  $GREP 'no-whole-archive' > /dev/null; then\n          _LT_TAGVAR(whole_archive_flag_spec, $1)=\"$wlarc\"'--whole-archive$convenience '\"$wlarc\"'--no-whole-archive'\n        else\n          _LT_TAGVAR(whole_archive_flag_spec, $1)=\n        fi\n      else\n        with_gnu_ld=no\n        wlarc=\n\n        # A generic and very simple default shared library creation\n        # command for GNU C++ for the case where it uses the native\n        # linker, instead of GNU ld.  If possible, this setting should\n        # overridden to take advantage of the native linker features on\n        # the platform it is being used on.\n        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'\n      fi\n\n      # Commands to make compiler produce verbose output that lists\n      # what \"hidden\" libraries, object files and flags are used when\n      # linking a shared library.\n      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v \"^Configured with:\" | $GREP \"\\-L\"'\n\n    else\n      GXX=no\n      with_gnu_ld=no\n      wlarc=\n    fi\n\n    # PORTME: fill in a description of your system's C++ link characteristics\n    AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])\n    _LT_TAGVAR(ld_shlibs, $1)=yes\n    case $host_os in\n      aix3*)\n        # FIXME: insert proper C++ library support\n        _LT_TAGVAR(ld_shlibs, $1)=no\n        ;;\n      aix[[4-9]]*)\n        if test \"$host_cpu\" = ia64; then\n          # On IA64, the linker does run time linking by default, so we don't\n          # have to do anything special.\n          aix_use_runtimelinking=no\n          exp_sym_flag='-Bexport'\n          no_entry_flag=\"\"\n        else\n          aix_use_runtimelinking=no\n\n          # Test if we are trying to use run time linking or normal\n          # AIX style linking. If -brtl is somewhere in LDFLAGS, we\n          # need to do runtime linking.\n          case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)\n\t    for ld_flag in $LDFLAGS; do\n\t      case $ld_flag in\n\t      *-brtl*)\n\t        aix_use_runtimelinking=yes\n\t        break\n\t        ;;\n\t      esac\n\t    done\n\t    ;;\n          esac\n\n          exp_sym_flag='-bexport'\n          no_entry_flag='-bnoentry'\n        fi\n\n        # When large executables or shared objects are built, AIX ld can\n        # have problems creating the table of contents.  If linking a library\n        # or program results in \"error TOC overflow\" add -mminimal-toc to\n        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not\n        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.\n\n        _LT_TAGVAR(archive_cmds, $1)=''\n        _LT_TAGVAR(hardcode_direct, $1)=yes\n        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n        _LT_TAGVAR(hardcode_libdir_separator, $1)=':'\n        _LT_TAGVAR(link_all_deplibs, $1)=yes\n        _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'\n\n        if test \"$GXX\" = yes; then\n          case $host_os in aix4.[[012]]|aix4.[[012]].*)\n          # We only want to do this on AIX 4.2 and lower, the check\n          # below for broken collect2 doesn't work under 4.3+\n\t  collect2name=`${CC} -print-prog-name=collect2`\n\t  if test -f \"$collect2name\" &&\n\t     strings \"$collect2name\" | $GREP resolve_lib_name >/dev/null\n\t  then\n\t    # We have reworked collect2\n\t    :\n\t  else\n\t    # We have old collect2\n\t    _LT_TAGVAR(hardcode_direct, $1)=unsupported\n\t    # It fails to find uninstalled libraries when the uninstalled\n\t    # path is not listed in the libpath.  Setting hardcode_minus_L\n\t    # to unsupported forces relinking\n\t    _LT_TAGVAR(hardcode_minus_L, $1)=yes\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n\t    _LT_TAGVAR(hardcode_libdir_separator, $1)=\n\t  fi\n          esac\n          shared_flag='-shared'\n\t  if test \"$aix_use_runtimelinking\" = yes; then\n\t    shared_flag=\"$shared_flag \"'${wl}-G'\n\t  fi\n        else\n          # not using gcc\n          if test \"$host_cpu\" = ia64; then\n\t  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release\n\t  # chokes on -Wl,-G. The following line is correct:\n\t  shared_flag='-G'\n          else\n\t    if test \"$aix_use_runtimelinking\" = yes; then\n\t      shared_flag='${wl}-G'\n\t    else\n\t      shared_flag='${wl}-bM:SRE'\n\t    fi\n          fi\n        fi\n\n        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'\n        # It seems that -bexpall does not export symbols beginning with\n        # underscore (_), so it is better to generate a list of symbols to\n\t# export.\n        _LT_TAGVAR(always_export_symbols, $1)=yes\n        if test \"$aix_use_runtimelinking\" = yes; then\n          # Warning - without using the other runtime loading flags (-brtl),\n          # -berok will link without error, but may produce a broken library.\n          _LT_TAGVAR(allow_undefined_flag, $1)='-berok'\n          # Determine the default libpath from the value encoded in an empty\n          # executable.\n          _LT_SYS_MODULE_PATH_AIX([$1])\n          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'\"$aix_libpath\"\n\n          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '\"\\${wl}$no_entry_flag\"' $compiler_flags `if test \"x${allow_undefined_flag}\" != \"x\"; then func_echo_all \"${wl}${allow_undefined_flag}\"; else :; fi` '\"\\${wl}$exp_sym_flag:\\$export_symbols $shared_flag\"\n        else\n          if test \"$host_cpu\" = ia64; then\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'\n\t    _LT_TAGVAR(allow_undefined_flag, $1)=\"-z nodefs\"\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)=\"\\$CC $shared_flag\"' -o $output_objdir/$soname $libobjs $deplibs '\"\\${wl}$no_entry_flag\"' $compiler_flags ${wl}${allow_undefined_flag} '\"\\${wl}$exp_sym_flag:\\$export_symbols\"\n          else\n\t    # Determine the default libpath from the value encoded in an\n\t    # empty executable.\n\t    _LT_SYS_MODULE_PATH_AIX([$1])\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'\"$aix_libpath\"\n\t    # Warning - without using the other run time loading flags,\n\t    # -berok will link without error, but may produce a broken library.\n\t    _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'\n\t    _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'\n\t    if test \"$with_gnu_ld\" = yes; then\n\t      # We only use this code for GNU lds that support --whole-archive.\n\t      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'\n\t    else\n\t      # Exported symbols can be pulled into shared objects from archives\n\t      _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'\n\t    fi\n\t    _LT_TAGVAR(archive_cmds_need_lc, $1)=yes\n\t    # This is similar to how AIX traditionally builds its shared\n\t    # libraries.\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)=\"\\$CC $shared_flag\"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'\n          fi\n        fi\n        ;;\n\n      beos*)\n\tif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\t  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n\t  # Joseph Beckenbach <jrb3@best.com> says some releases of gcc\n\t  # support --undefined.  This deserves some investigation.  FIXME\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\telse\n\t  _LT_TAGVAR(ld_shlibs, $1)=no\n\tfi\n\t;;\n\n      chorus*)\n        case $cc_basename in\n          *)\n\t  # FIXME: insert proper C++ library support\n\t  _LT_TAGVAR(ld_shlibs, $1)=no\n\t  ;;\n        esac\n        ;;\n\n      cygwin* | mingw* | pw32* | cegcc*)\n\tcase $GXX,$cc_basename in\n\t,cl* | no,cl*)\n\t  # Native MSVC\n\t  # hardcode_libdir_flag_spec is actually meaningless, as there is\n\t  # no search path for DLLs.\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '\n\t  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n\t  _LT_TAGVAR(always_export_symbols, $1)=yes\n\t  _LT_TAGVAR(file_list_spec, $1)='@'\n\t  # Tell ltmain to make .lib files, not .a files.\n\t  libext=lib\n\t  # Tell ltmain to make .dll files, not .so files.\n\t  shrext_cmds=\".dll\"\n\t  # FIXME: Setting linknames here is a bad hack.\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)='if test \"x`$SED 1q $export_symbols`\" = xEXPORTS; then\n\t      $SED -n -e 's/\\\\\\\\\\\\\\(.*\\\\\\\\\\\\\\)/-link\\\\\\ -EXPORT:\\\\\\\\\\\\\\1/' -e '1\\\\\\!p' < $export_symbols > $output_objdir/$soname.exp;\n\t    else\n\t      $SED -e 's/\\\\\\\\\\\\\\(.*\\\\\\\\\\\\\\)/-link\\\\\\ -EXPORT:\\\\\\\\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;\n\t    fi~\n\t    $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs \"@$tool_output_objdir$soname.exp\" -Wl,-DLL,-IMPLIB:\"$tool_output_objdir$libname.dll.lib\"~\n\t    linknames='\n\t  # The linker will not automatically build a static lib if we build a DLL.\n\t  # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'\n\t  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes\n\t  # Don't use ranlib\n\t  _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'\n\t  _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile=\"@OUTPUT@\"~\n\t    lt_tool_outputfile=\"@TOOL_OUTPUT@\"~\n\t    case $lt_outputfile in\n\t      *.exe|*.EXE) ;;\n\t      *)\n\t\tlt_outputfile=\"$lt_outputfile.exe\"\n\t\tlt_tool_outputfile=\"$lt_tool_outputfile.exe\"\n\t\t;;\n\t    esac~\n\t    func_to_tool_file \"$lt_outputfile\"~\n\t    if test \"$MANIFEST_TOOL\" != \":\" && test -f \"$lt_outputfile.manifest\"; then\n\t      $MANIFEST_TOOL -manifest \"$lt_tool_outputfile.manifest\" -outputresource:\"$lt_tool_outputfile\" || exit 1;\n\t      $RM \"$lt_outputfile.manifest\";\n\t    fi'\n\t  ;;\n\t*)\n\t  # g++\n\t  # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,\n\t  # as there is no search path for DLLs.\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n\t  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'\n\t  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n\t  _LT_TAGVAR(always_export_symbols, $1)=no\n\t  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes\n\n\t  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n\t    # If the export-symbols file already is a .def file (1st line\n\t    # is EXPORTS), use it as is; otherwise, prepend...\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='if test \"x`$SED 1q $export_symbols`\" = xEXPORTS; then\n\t      cp $export_symbols $output_objdir/$soname.def;\n\t    else\n\t      echo EXPORTS > $output_objdir/$soname.def;\n\t      cat $export_symbols >> $output_objdir/$soname.def;\n\t    fi~\n\t    $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n\t  else\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t  fi\n\t  ;;\n\tesac\n\t;;\n      darwin* | rhapsody*)\n        _LT_DARWIN_LINKER_FEATURES($1)\n\t;;\n\n      dgux*)\n        case $cc_basename in\n          ec++*)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          ghcx*)\n\t    # Green Hills C++ Compiler\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          *)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n        esac\n        ;;\n\n      freebsd2.*)\n        # C++ shared libraries reported to be fairly broken before\n\t# switch to ELF\n        _LT_TAGVAR(ld_shlibs, $1)=no\n        ;;\n\n      freebsd-elf*)\n        _LT_TAGVAR(archive_cmds_need_lc, $1)=no\n        ;;\n\n      freebsd* | dragonfly*)\n        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF\n        # conventions\n        _LT_TAGVAR(ld_shlibs, $1)=yes\n        ;;\n\n      gnu*)\n        ;;\n\n      haiku*)\n        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n        _LT_TAGVAR(link_all_deplibs, $1)=yes\n        ;;\n\n      hpux9*)\n        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'\n        _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n        _LT_TAGVAR(hardcode_direct, $1)=yes\n        _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,\n\t\t\t\t             # but as the default\n\t\t\t\t             # location of the library.\n\n        case $cc_basename in\n          CC*)\n            # FIXME: insert proper C++ library support\n            _LT_TAGVAR(ld_shlibs, $1)=no\n            ;;\n          aCC*)\n            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'\n            # Commands to make compiler produce verbose output that lists\n            # what \"hidden\" libraries, object files and flags are used when\n            # linking a shared library.\n            #\n            # There doesn't appear to be a way to prevent this compiler from\n            # explicitly linking system object files so we need to strip them\n            # from the output so that they don't get included in the library\n            # dependencies.\n            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP \"\\-L\"`; list=\"\"; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; func_echo_all \"$list\"'\n            ;;\n          *)\n            if test \"$GXX\" = yes; then\n              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'\n            else\n              # FIXME: insert proper C++ library support\n              _LT_TAGVAR(ld_shlibs, $1)=no\n            fi\n            ;;\n        esac\n        ;;\n\n      hpux10*|hpux11*)\n        if test $with_gnu_ld = no; then\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'\n\t  _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\n          case $host_cpu in\n            hppa*64*|ia64*)\n              ;;\n            *)\n\t      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n              ;;\n          esac\n        fi\n        case $host_cpu in\n          hppa*64*|ia64*)\n            _LT_TAGVAR(hardcode_direct, $1)=no\n            _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n            ;;\n          *)\n            _LT_TAGVAR(hardcode_direct, $1)=yes\n            _LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n            _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,\n\t\t\t\t\t         # but as the default\n\t\t\t\t\t         # location of the library.\n            ;;\n        esac\n\n        case $cc_basename in\n          CC*)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          aCC*)\n\t    case $host_cpu in\n\t      hppa*64*)\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t        ;;\n\t      ia64*)\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t        ;;\n\t      *)\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t        ;;\n\t    esac\n\t    # Commands to make compiler produce verbose output that lists\n\t    # what \"hidden\" libraries, object files and flags are used when\n\t    # linking a shared library.\n\t    #\n\t    # There doesn't appear to be a way to prevent this compiler from\n\t    # explicitly linking system object files so we need to strip them\n\t    # from the output so that they don't get included in the library\n\t    # dependencies.\n\t    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP \"\\-L\"`; list=\"\"; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; func_echo_all \"$list\"'\n\t    ;;\n          *)\n\t    if test \"$GXX\" = yes; then\n\t      if test $with_gnu_ld = no; then\n\t        case $host_cpu in\n\t          hppa*64*)\n\t            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t            ;;\n\t          ia64*)\n\t            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t            ;;\n\t          *)\n\t            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t            ;;\n\t        esac\n\t      fi\n\t    else\n\t      # FIXME: insert proper C++ library support\n\t      _LT_TAGVAR(ld_shlibs, $1)=no\n\t    fi\n\t    ;;\n        esac\n        ;;\n\n      interix[[3-9]]*)\n\t_LT_TAGVAR(hardcode_direct, $1)=no\n\t_LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'\n\t_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n\t# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.\n\t# Instead, shared libraries are loaded at an image base (0x10000000 by\n\t# default) and relocated if they conflict, which is a slow very memory\n\t# consuming and fragmenting process.  To avoid this, we pick a random,\n\t# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link\n\t# time.  Moving up from 0x10000000 also allows more sbrk(2) space.\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='sed \"s,^,_,\" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n\t;;\n      irix5* | irix6*)\n        case $cc_basename in\n          CC*)\n\t    # SGI C++\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -o $lib'\n\n\t    # Archives containing C++ object files must be created using\n\t    # \"CC -ar\", where \"CC\" is the IRIX C++ compiler.  This is\n\t    # necessary to make sure instantiated templates are included\n\t    # in the archive.\n\t    _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'\n\t    ;;\n          *)\n\t    if test \"$GXX\" = yes; then\n\t      if test \"$with_gnu_ld\" = no; then\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version ${wl}$verstring\"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n\t      else\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version ${wl}$verstring\"` -o $lib'\n\t      fi\n\t    fi\n\t    _LT_TAGVAR(link_all_deplibs, $1)=yes\n\t    ;;\n        esac\n        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n        _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n        _LT_TAGVAR(inherit_rpath, $1)=yes\n        ;;\n\n      linux* | k*bsd*-gnu | kopensolaris*-gnu)\n        case $cc_basename in\n          KCC*)\n\t    # Kuck and Associates, Inc. (KAI) C++ Compiler\n\n\t    # KCC will only create a shared library if the output file\n\t    # ends with \".so\" (or \".sl\" for HP-UX), so rename the library\n\t    # to its proper name (with version) after linking.\n\t    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\\''s/\\([[^()0-9A-Za-z{}]]\\)/\\\\\\\\\\1/g'\\''`; templib=`echo $lib | $SED -e \"s/\\${tempext}\\..*/.so/\"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \\$templib; mv \\$templib $lib'\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\\''s/\\([[^()0-9A-Za-z{}]]\\)/\\\\\\\\\\1/g'\\''`; templib=`echo $lib | $SED -e \"s/\\${tempext}\\..*/.so/\"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \\$templib ${wl}-retain-symbols-file,$export_symbols; mv \\$templib $lib'\n\t    # Commands to make compiler produce verbose output that lists\n\t    # what \"hidden\" libraries, object files and flags are used when\n\t    # linking a shared library.\n\t    #\n\t    # There doesn't appear to be a way to prevent this compiler from\n\t    # explicitly linking system object files so we need to strip them\n\t    # from the output so that they don't get included in the library\n\t    # dependencies.\n\t    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP \"ld\"`; rm -f libconftest$shared_ext; list=\"\"; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; func_echo_all \"$list\"'\n\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'\n\t    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'\n\n\t    # Archives containing C++ object files must be created using\n\t    # \"CC -Bstatic\", where \"CC\" is the KAI C++ compiler.\n\t    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'\n\t    ;;\n\t  icpc* | ecpc* )\n\t    # Intel C++\n\t    with_gnu_ld=yes\n\t    # version 8.0 and above of icpc choke on multiply defined symbols\n\t    # if we add $predep_objects and $postdep_objects, however 7.1 and\n\t    # earlier do not add the objects themselves.\n\t    case `$CC -V 2>&1` in\n\t      *\"Version 7.\"*)\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n\t\t;;\n\t      *)  # Version 8.0 or newer\n\t        tmp_idyn=\n\t        case $host_cpu in\n\t\t  ia64*) tmp_idyn=' -i_dynamic';;\n\t\tesac\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'\"$tmp_idyn\"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'\"$tmp_idyn\"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n\t\t;;\n\t    esac\n\t    _LT_TAGVAR(archive_cmds_need_lc, $1)=no\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'\n\t    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'\n\t    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'\n\t    ;;\n          pgCC* | pgcpp*)\n            # Portland Group C++ compiler\n\t    case `$CC -V` in\n\t    *pgCC\\ [[1-5]].* | *pgcpp\\ [[1-5]].*)\n\t      _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~\n\t\trm -rf $tpldir~\n\t\t$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~\n\t\tcompile_command=\"$compile_command `find $tpldir -name \\*.o | sort | $NL2SP`\"'\n\t      _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~\n\t\trm -rf $tpldir~\n\t\t$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~\n\t\t$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \\*.o | sort | $NL2SP`~\n\t\t$RANLIB $oldlib'\n\t      _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~\n\t\trm -rf $tpldir~\n\t\t$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~\n\t\t$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \\*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'\n\t      _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~\n\t\trm -rf $tpldir~\n\t\t$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~\n\t\t$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \\*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'\n\t      ;;\n\t    *) # Version 6 and above use weak symbols\n\t      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'\n\t      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'\n\t      ;;\n\t    esac\n\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'\n\t    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'\n\t    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n            ;;\n\t  cxx*)\n\t    # Compaq C++\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'\n\n\t    runpath_var=LD_RUN_PATH\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'\n\t    _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\n\t    # Commands to make compiler produce verbose output that lists\n\t    # what \"hidden\" libraries, object files and flags are used when\n\t    # linking a shared library.\n\t    #\n\t    # There doesn't appear to be a way to prevent this compiler from\n\t    # explicitly linking system object files so we need to strip them\n\t    # from the output so that they don't get included in the library\n\t    # dependencies.\n\t    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP \"ld\"`; templist=`func_echo_all \"$templist\" | $SED \"s/\\(^.*ld.*\\)\\( .*ld .*$\\)/\\1/\"`; list=\"\"; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; func_echo_all \"X$list\" | $Xsed'\n\t    ;;\n\t  xl* | mpixl* | bgxl*)\n\t    # IBM XL 8.0 on PPC, with GNU ld\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n\t    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t    if test \"x$supports_anon_versioning\" = xyes; then\n\t      _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $output_objdir/$libname.ver~\n\t\tcat $export_symbols | sed -e \"s/\\(.*\\)/\\1;/\" >> $output_objdir/$libname.ver~\n\t\techo \"local: *; };\" >> $output_objdir/$libname.ver~\n\t\t$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'\n\t    fi\n\t    ;;\n\t  *)\n\t    case `$CC -V 2>&1 | sed 5q` in\n\t    *Sun\\ C*)\n\t      # Sun C++ 5.9\n\t      _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'\n\t      _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'\n\t      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n\t      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\\\"\\\"; do test -z \\\"$conv\\\" || new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t      _LT_TAGVAR(compiler_needs_object, $1)=yes\n\n\t      # Not sure whether something based on\n\t      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1\n\t      # would be better.\n\t      output_verbose_link_cmd='func_echo_all'\n\n\t      # Archives containing C++ object files must be created using\n\t      # \"CC -xar\", where \"CC\" is the Sun C++ compiler.  This is\n\t      # necessary to make sure instantiated templates are included\n\t      # in the archive.\n\t      _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'\n\t      ;;\n\t    esac\n\t    ;;\n\tesac\n\t;;\n\n      lynxos*)\n        # FIXME: insert proper C++ library support\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n\t;;\n\n      m88k*)\n        # FIXME: insert proper C++ library support\n        _LT_TAGVAR(ld_shlibs, $1)=no\n\t;;\n\n      mvs*)\n        case $cc_basename in\n          cxx*)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n\t  *)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n\tesac\n\t;;\n\n      netbsd*)\n        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n\t  _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'\n\t  wlarc=\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n\t  _LT_TAGVAR(hardcode_direct, $1)=yes\n\t  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\tfi\n\t# Workaround some broken pre-1.5 toolchains\n\toutput_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e \"s:-lgcc -lc -lgcc::\"'\n\t;;\n\n      *nto* | *qnx*)\n        _LT_TAGVAR(ld_shlibs, $1)=yes\n\t;;\n\n      openbsd2*)\n        # C++ shared libraries are fairly broken\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n\t;;\n\n      openbsd*)\n\tif test -f /usr/libexec/ld.so; then\n\t  _LT_TAGVAR(hardcode_direct, $1)=yes\n\t  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\t  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'\n\t  if test -z \"`echo __ELF__ | $CC -E - | grep __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'\n\t    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n\t    _LT_TAGVAR(whole_archive_flag_spec, $1)=\"$wlarc\"'--whole-archive$convenience '\"$wlarc\"'--no-whole-archive'\n\t  fi\n\t  output_verbose_link_cmd=func_echo_all\n\telse\n\t  _LT_TAGVAR(ld_shlibs, $1)=no\n\tfi\n\t;;\n\n      osf3* | osf4* | osf5*)\n        case $cc_basename in\n          KCC*)\n\t    # Kuck and Associates, Inc. (KAI) C++ Compiler\n\n\t    # KCC will only create a shared library if the output file\n\t    # ends with \".so\" (or \".sl\" for HP-UX), so rename the library\n\t    # to its proper name (with version) after linking.\n\t    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\\''s/\\([[^()0-9A-Za-z{}]]\\)/\\\\\\\\\\1/g'\\''`; templib=`echo \"$lib\" | $SED -e \"s/\\${tempext}\\..*/.so/\"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \\$templib; mv \\$templib $lib'\n\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'\n\t    _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\n\t    # Archives containing C++ object files must be created using\n\t    # the KAI C++ compiler.\n\t    case $host in\n\t      osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;;\n\t      *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;;\n\t    esac\n\t    ;;\n          RCC*)\n\t    # Rational C++ 2.4.1\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          cxx*)\n\t    case $host in\n\t      osf3*)\n\t        _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\\*'\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -o $lib'\n\t        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n\t\t;;\n\t      *)\n\t        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \\*'\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -o $lib'\n\t        _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf \"%s %s\\\\n\" -exported_symbol \"\\$i\" >> $lib.exp; done~\n\t          echo \"-hidden\">> $lib.exp~\n\t          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n \"$verstring\" && $ECHO \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -o $lib~\n\t          $RM $lib.exp'\n\t        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'\n\t\t;;\n\t    esac\n\n\t    _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\n\t    # Commands to make compiler produce verbose output that lists\n\t    # what \"hidden\" libraries, object files and flags are used when\n\t    # linking a shared library.\n\t    #\n\t    # There doesn't appear to be a way to prevent this compiler from\n\t    # explicitly linking system object files so we need to strip them\n\t    # from the output so that they don't get included in the library\n\t    # dependencies.\n\t    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP \"ld\" | $GREP -v \"ld:\"`; templist=`func_echo_all \"$templist\" | $SED \"s/\\(^.*ld.*\\)\\( .*ld.*$\\)/\\1/\"`; list=\"\"; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; func_echo_all \"$list\"'\n\t    ;;\n\t  *)\n\t    if test \"$GXX\" = yes && test \"$with_gnu_ld\" = no; then\n\t      _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\\*'\n\t      case $host in\n\t        osf3*)\n\t          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version ${wl}$verstring\"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n\t\t  ;;\n\t        *)\n\t          _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version ${wl}$verstring\"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n\t\t  ;;\n\t      esac\n\n\t      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n\t      _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\n\t      # Commands to make compiler produce verbose output that lists\n\t      # what \"hidden\" libraries, object files and flags are used when\n\t      # linking a shared library.\n\t      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v \"^Configured with:\" | $GREP \"\\-L\"'\n\n\t    else\n\t      # FIXME: insert proper C++ library support\n\t      _LT_TAGVAR(ld_shlibs, $1)=no\n\t    fi\n\t    ;;\n        esac\n        ;;\n\n      psos*)\n        # FIXME: insert proper C++ library support\n        _LT_TAGVAR(ld_shlibs, $1)=no\n        ;;\n\n      sunos4*)\n        case $cc_basename in\n          CC*)\n\t    # Sun C++ 4.x\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          lcc*)\n\t    # Lucid\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          *)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n        esac\n        ;;\n\n      solaris*)\n        case $cc_basename in\n          CC* | sunCC*)\n\t    # Sun C++ 4.2, 5.x and Centerline C++\n            _LT_TAGVAR(archive_cmds_need_lc,$1)=yes\n\t    _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'\n\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n\t    _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\t    case $host_os in\n\t      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;\n\t      *)\n\t\t# The compiler driver will combine and reorder linker options,\n\t\t# but understands `-z linker_flag'.\n\t        # Supported since Solaris 2.6 (maybe 2.5.1?)\n\t\t_LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'\n\t        ;;\n\t    esac\n\t    _LT_TAGVAR(link_all_deplibs, $1)=yes\n\n\t    output_verbose_link_cmd='func_echo_all'\n\n\t    # Archives containing C++ object files must be created using\n\t    # \"CC -xar\", where \"CC\" is the Sun C++ compiler.  This is\n\t    # necessary to make sure instantiated templates are included\n\t    # in the archive.\n\t    _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'\n\t    ;;\n          gcx*)\n\t    # Green Hills C++ Compiler\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'\n\n\t    # The C++ compiler must be used to create the archive.\n\t    _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'\n\t    ;;\n          *)\n\t    # GNU C++ compiler with Solaris linker\n\t    if test \"$GXX\" = yes && test \"$with_gnu_ld\" = no; then\n\t      _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'\n\t      if $CC --version | $GREP -v '^2\\.7' > /dev/null; then\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'\n\t        _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t\t  $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'\n\n\t        # Commands to make compiler produce verbose output that lists\n\t        # what \"hidden\" libraries, object files and flags are used when\n\t        # linking a shared library.\n\t        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v \"^Configured with:\" | $GREP \"\\-L\"'\n\t      else\n\t        # g++ 2.7 appears to require `-G' NOT `-shared' on this\n\t        # platform.\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'\n\t        _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t\t  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'\n\n\t        # Commands to make compiler produce verbose output that lists\n\t        # what \"hidden\" libraries, object files and flags are used when\n\t        # linking a shared library.\n\t        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v \"^Configured with:\" | $GREP \"\\-L\"'\n\t      fi\n\n\t      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'\n\t      case $host_os in\n\t\tsolaris2.[[0-5]] | solaris2.[[0-5]].*) ;;\n\t\t*)\n\t\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'\n\t\t  ;;\n\t      esac\n\t    fi\n\t    ;;\n        esac\n        ;;\n\n    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)\n      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'\n      _LT_TAGVAR(archive_cmds_need_lc, $1)=no\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      runpath_var='LD_RUN_PATH'\n\n      case $cc_basename in\n        CC*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\t*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n      esac\n      ;;\n\n      sysv5* | sco3.2v5* | sco5v6*)\n\t# Note: We can NOT use -z defs as we might desire, because we do not\n\t# link with -lc, and that would cause any symbols used from libc to\n\t# always be unresolved, which means just about no library would\n\t# ever link correctly.  If we're not using GNU ld we use -z text\n\t# though, which does catch some bad symbols but isn't as heavy-handed\n\t# as -z defs.\n\t_LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'\n\t_LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'\n\t_LT_TAGVAR(archive_cmds_need_lc, $1)=no\n\t_LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'\n\t_LT_TAGVAR(hardcode_libdir_separator, $1)=':'\n\t_LT_TAGVAR(link_all_deplibs, $1)=yes\n\t_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'\n\trunpath_var='LD_RUN_PATH'\n\n\tcase $cc_basename in\n          CC*)\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~\n\t      '\"$_LT_TAGVAR(old_archive_cmds, $1)\"\n\t    _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~\n\t      '\"$_LT_TAGVAR(reload_cmds, $1)\"\n\t    ;;\n\t  *)\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t    ;;\n\tesac\n      ;;\n\n      tandem*)\n        case $cc_basename in\n          NCC*)\n\t    # NonStop-UX NCC 3.20\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          *)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n        esac\n        ;;\n\n      vxworks*)\n        # FIXME: insert proper C++ library support\n        _LT_TAGVAR(ld_shlibs, $1)=no\n        ;;\n\n      *)\n        # FIXME: insert proper C++ library support\n        _LT_TAGVAR(ld_shlibs, $1)=no\n        ;;\n    esac\n\n    AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])\n    test \"$_LT_TAGVAR(ld_shlibs, $1)\" = no && can_build_shared=no\n\n    _LT_TAGVAR(GCC, $1)=\"$GXX\"\n    _LT_TAGVAR(LD, $1)=\"$LD\"\n\n    ## CAVEAT EMPTOR:\n    ## There is no encapsulation within the following macros, do not change\n    ## the running order or otherwise move them around unless you know exactly\n    ## what you are doing...\n    _LT_SYS_HIDDEN_LIBDEPS($1)\n    _LT_COMPILER_PIC($1)\n    _LT_COMPILER_C_O($1)\n    _LT_COMPILER_FILE_LOCKS($1)\n    _LT_LINKER_SHLIBS($1)\n    _LT_SYS_DYNAMIC_LINKER($1)\n    _LT_LINKER_HARDCODE_LIBPATH($1)\n\n    _LT_CONFIG($1)\n  fi # test -n \"$compiler\"\n\n  CC=$lt_save_CC\n  CFLAGS=$lt_save_CFLAGS\n  LDCXX=$LD\n  LD=$lt_save_LD\n  GCC=$lt_save_GCC\n  with_gnu_ld=$lt_save_with_gnu_ld\n  lt_cv_path_LDCXX=$lt_cv_path_LD\n  lt_cv_path_LD=$lt_save_path_LD\n  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld\n  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld\nfi # test \"$_lt_caught_CXX_error\" != yes\n\nAC_LANG_POP\n])# _LT_LANG_CXX_CONFIG\n\n\n# _LT_FUNC_STRIPNAME_CNF\n# ----------------------\n# func_stripname_cnf prefix suffix name\n# strip PREFIX and SUFFIX off of NAME.\n# PREFIX and SUFFIX must not contain globbing or regex special\n# characters, hashes, percent signs, but SUFFIX may contain a leading\n# dot (in which case that matches only a dot).\n#\n# This function is identical to the (non-XSI) version of func_stripname,\n# except this one can be used by m4 code that may be executed by configure,\n# rather than the libtool script.\nm4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl\nAC_REQUIRE([_LT_DECL_SED])\nAC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])\nfunc_stripname_cnf ()\n{\n  case ${2} in\n  .*) func_stripname_result=`$ECHO \"${3}\" | $SED \"s%^${1}%%; s%\\\\\\\\${2}\\$%%\"`;;\n  *)  func_stripname_result=`$ECHO \"${3}\" | $SED \"s%^${1}%%; s%${2}\\$%%\"`;;\n  esac\n} # func_stripname_cnf\n])# _LT_FUNC_STRIPNAME_CNF\n\n# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])\n# ---------------------------------\n# Figure out \"hidden\" library dependencies from verbose\n# compiler output when linking a shared library.\n# Parse the compiler output and extract the necessary\n# objects, libraries and library flags.\nm4_defun([_LT_SYS_HIDDEN_LIBDEPS],\n[m4_require([_LT_FILEUTILS_DEFAULTS])dnl\nAC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl\n# Dependencies to place before and after the object being linked:\n_LT_TAGVAR(predep_objects, $1)=\n_LT_TAGVAR(postdep_objects, $1)=\n_LT_TAGVAR(predeps, $1)=\n_LT_TAGVAR(postdeps, $1)=\n_LT_TAGVAR(compiler_lib_search_path, $1)=\n\ndnl we can't use the lt_simple_compile_test_code here,\ndnl because it contains code intended for an executable,\ndnl not a library.  It's possible we should let each\ndnl tag define a new lt_????_link_test_code variable,\ndnl but it's only used here...\nm4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF\nint a;\nvoid foo (void) { a = 0; }\n_LT_EOF\n], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF\nclass Foo\n{\npublic:\n  Foo (void) { a = 0; }\nprivate:\n  int a;\n};\n_LT_EOF\n], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF\n      subroutine foo\n      implicit none\n      integer*4 a\n      a=0\n      return\n      end\n_LT_EOF\n], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF\n      subroutine foo\n      implicit none\n      integer a\n      a=0\n      return\n      end\n_LT_EOF\n], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF\npublic class foo {\n  private int a;\n  public void bar (void) {\n    a = 0;\n  }\n};\n_LT_EOF\n], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF\npackage foo\nfunc foo() {\n}\n_LT_EOF\n])\n\n_lt_libdeps_save_CFLAGS=$CFLAGS\ncase \"$CC $CFLAGS \" in #(\n*\\ -flto*\\ *) CFLAGS=\"$CFLAGS -fno-lto\" ;;\n*\\ -fwhopr*\\ *) CFLAGS=\"$CFLAGS -fno-whopr\" ;;\n*\\ -fuse-linker-plugin*\\ *) CFLAGS=\"$CFLAGS -fno-use-linker-plugin\" ;;\nesac\n\ndnl Parse the compiler output and extract the necessary\ndnl objects, libraries and library flags.\nif AC_TRY_EVAL(ac_compile); then\n  # Parse the compiler output and extract the necessary\n  # objects, libraries and library flags.\n\n  # Sentinel used to keep track of whether or not we are before\n  # the conftest object file.\n  pre_test_object_deps_done=no\n\n  for p in `eval \"$output_verbose_link_cmd\"`; do\n    case ${prev}${p} in\n\n    -L* | -R* | -l*)\n       # Some compilers place space between \"-{L,R}\" and the path.\n       # Remove the space.\n       if test $p = \"-L\" ||\n          test $p = \"-R\"; then\n\t prev=$p\n\t continue\n       fi\n\n       # Expand the sysroot to ease extracting the directories later.\n       if test -z \"$prev\"; then\n         case $p in\n         -L*) func_stripname_cnf '-L' '' \"$p\"; prev=-L; p=$func_stripname_result ;;\n         -R*) func_stripname_cnf '-R' '' \"$p\"; prev=-R; p=$func_stripname_result ;;\n         -l*) func_stripname_cnf '-l' '' \"$p\"; prev=-l; p=$func_stripname_result ;;\n         esac\n       fi\n       case $p in\n       =*) func_stripname_cnf '=' '' \"$p\"; p=$lt_sysroot$func_stripname_result ;;\n       esac\n       if test \"$pre_test_object_deps_done\" = no; then\n\t case ${prev} in\n\t -L | -R)\n\t   # Internal compiler library paths should come after those\n\t   # provided the user.  The postdeps already come after the\n\t   # user supplied libs so there is no need to process them.\n\t   if test -z \"$_LT_TAGVAR(compiler_lib_search_path, $1)\"; then\n\t     _LT_TAGVAR(compiler_lib_search_path, $1)=\"${prev}${p}\"\n\t   else\n\t     _LT_TAGVAR(compiler_lib_search_path, $1)=\"${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}\"\n\t   fi\n\t   ;;\n\t # The \"-l\" case would never come before the object being\n\t # linked, so don't bother handling this case.\n\t esac\n       else\n\t if test -z \"$_LT_TAGVAR(postdeps, $1)\"; then\n\t   _LT_TAGVAR(postdeps, $1)=\"${prev}${p}\"\n\t else\n\t   _LT_TAGVAR(postdeps, $1)=\"${_LT_TAGVAR(postdeps, $1)} ${prev}${p}\"\n\t fi\n       fi\n       prev=\n       ;;\n\n    *.lto.$objext) ;; # Ignore GCC LTO objects\n    *.$objext)\n       # This assumes that the test object file only shows up\n       # once in the compiler output.\n       if test \"$p\" = \"conftest.$objext\"; then\n\t pre_test_object_deps_done=yes\n\t continue\n       fi\n\n       if test \"$pre_test_object_deps_done\" = no; then\n\t if test -z \"$_LT_TAGVAR(predep_objects, $1)\"; then\n\t   _LT_TAGVAR(predep_objects, $1)=\"$p\"\n\t else\n\t   _LT_TAGVAR(predep_objects, $1)=\"$_LT_TAGVAR(predep_objects, $1) $p\"\n\t fi\n       else\n\t if test -z \"$_LT_TAGVAR(postdep_objects, $1)\"; then\n\t   _LT_TAGVAR(postdep_objects, $1)=\"$p\"\n\t else\n\t   _LT_TAGVAR(postdep_objects, $1)=\"$_LT_TAGVAR(postdep_objects, $1) $p\"\n\t fi\n       fi\n       ;;\n\n    *) ;; # Ignore the rest.\n\n    esac\n  done\n\n  # Clean up.\n  rm -f a.out a.exe\nelse\n  echo \"libtool.m4: error: problem compiling $1 test program\"\nfi\n\n$RM -f confest.$objext\nCFLAGS=$_lt_libdeps_save_CFLAGS\n\n# PORTME: override above test on systems where it is broken\nm4_if([$1], [CXX],\n[case $host_os in\ninterix[[3-9]]*)\n  # Interix 3.5 installs completely hosed .la files for C++, so rather than\n  # hack all around it, let's just trust \"g++\" to DTRT.\n  _LT_TAGVAR(predep_objects,$1)=\n  _LT_TAGVAR(postdep_objects,$1)=\n  _LT_TAGVAR(postdeps,$1)=\n  ;;\n\nlinux*)\n  case `$CC -V 2>&1 | sed 5q` in\n  *Sun\\ C*)\n    # Sun C++ 5.9\n\n    # The more standards-conforming stlport4 library is\n    # incompatible with the Cstd library. Avoid specifying\n    # it if it's in CXXFLAGS. Ignore libCrun as\n    # -library=stlport4 depends on it.\n    case \" $CXX $CXXFLAGS \" in\n    *\" -library=stlport4 \"*)\n      solaris_use_stlport4=yes\n      ;;\n    esac\n\n    if test \"$solaris_use_stlport4\" != yes; then\n      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'\n    fi\n    ;;\n  esac\n  ;;\n\nsolaris*)\n  case $cc_basename in\n  CC* | sunCC*)\n    # The more standards-conforming stlport4 library is\n    # incompatible with the Cstd library. Avoid specifying\n    # it if it's in CXXFLAGS. Ignore libCrun as\n    # -library=stlport4 depends on it.\n    case \" $CXX $CXXFLAGS \" in\n    *\" -library=stlport4 \"*)\n      solaris_use_stlport4=yes\n      ;;\n    esac\n\n    # Adding this requires a known-good setup of shared libraries for\n    # Sun compiler versions before 5.6, else PIC objects from an old\n    # archive will be linked into the output, leading to subtle bugs.\n    if test \"$solaris_use_stlport4\" != yes; then\n      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'\n    fi\n    ;;\n  esac\n  ;;\nesac\n])\n\ncase \" $_LT_TAGVAR(postdeps, $1) \" in\n*\" -lc \"*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;;\nesac\n _LT_TAGVAR(compiler_lib_search_dirs, $1)=\nif test -n \"${_LT_TAGVAR(compiler_lib_search_path, $1)}\"; then\n _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo \" ${_LT_TAGVAR(compiler_lib_search_path, $1)}\" | ${SED} -e 's! -L! !g' -e 's!^ !!'`\nfi\n_LT_TAGDECL([], [compiler_lib_search_dirs], [1],\n    [The directories searched by this compiler when creating a shared library])\n_LT_TAGDECL([], [predep_objects], [1],\n    [Dependencies to place before and after the objects being linked to\n    create a shared library])\n_LT_TAGDECL([], [postdep_objects], [1])\n_LT_TAGDECL([], [predeps], [1])\n_LT_TAGDECL([], [postdeps], [1])\n_LT_TAGDECL([], [compiler_lib_search_path], [1],\n    [The library search path used internally by the compiler when linking\n    a shared library])\n])# _LT_SYS_HIDDEN_LIBDEPS\n\n\n# _LT_LANG_F77_CONFIG([TAG])\n# --------------------------\n# Ensure that the configuration variables for a Fortran 77 compiler are\n# suitably defined.  These variables are subsequently used by _LT_CONFIG\n# to write the compiler configuration to `libtool'.\nm4_defun([_LT_LANG_F77_CONFIG],\n[AC_LANG_PUSH(Fortran 77)\nif test -z \"$F77\" || test \"X$F77\" = \"Xno\"; then\n  _lt_disable_F77=yes\nfi\n\n_LT_TAGVAR(archive_cmds_need_lc, $1)=no\n_LT_TAGVAR(allow_undefined_flag, $1)=\n_LT_TAGVAR(always_export_symbols, $1)=no\n_LT_TAGVAR(archive_expsym_cmds, $1)=\n_LT_TAGVAR(export_dynamic_flag_spec, $1)=\n_LT_TAGVAR(hardcode_direct, $1)=no\n_LT_TAGVAR(hardcode_direct_absolute, $1)=no\n_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=\n_LT_TAGVAR(hardcode_libdir_separator, $1)=\n_LT_TAGVAR(hardcode_minus_L, $1)=no\n_LT_TAGVAR(hardcode_automatic, $1)=no\n_LT_TAGVAR(inherit_rpath, $1)=no\n_LT_TAGVAR(module_cmds, $1)=\n_LT_TAGVAR(module_expsym_cmds, $1)=\n_LT_TAGVAR(link_all_deplibs, $1)=unknown\n_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds\n_LT_TAGVAR(reload_flag, $1)=$reload_flag\n_LT_TAGVAR(reload_cmds, $1)=$reload_cmds\n_LT_TAGVAR(no_undefined_flag, $1)=\n_LT_TAGVAR(whole_archive_flag_spec, $1)=\n_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no\n\n# Source file extension for f77 test sources.\nac_ext=f\n\n# Object file extension for compiled f77 test sources.\nobjext=o\n_LT_TAGVAR(objext, $1)=$objext\n\n# No sense in running all these tests if we already determined that\n# the F77 compiler isn't working.  Some variables (like enable_shared)\n# are currently assumed to apply to all compilers on this platform,\n# and will be corrupted by setting them based on a non-working compiler.\nif test \"$_lt_disable_F77\" != yes; then\n  # Code to be used in simple compile tests\n  lt_simple_compile_test_code=\"\\\n      subroutine t\n      return\n      end\n\"\n\n  # Code to be used in simple link tests\n  lt_simple_link_test_code=\"\\\n      program t\n      end\n\"\n\n  # ltmain only uses $CC for tagged configurations so make sure $CC is set.\n  _LT_TAG_COMPILER\n\n  # save warnings/boilerplate of simple test code\n  _LT_COMPILER_BOILERPLATE\n  _LT_LINKER_BOILERPLATE\n\n  # Allow CC to be a program name with arguments.\n  lt_save_CC=\"$CC\"\n  lt_save_GCC=$GCC\n  lt_save_CFLAGS=$CFLAGS\n  CC=${F77-\"f77\"}\n  CFLAGS=$FFLAGS\n  compiler=$CC\n  _LT_TAGVAR(compiler, $1)=$CC\n  _LT_CC_BASENAME([$compiler])\n  GCC=$G77\n  if test -n \"$compiler\"; then\n    AC_MSG_CHECKING([if libtool supports shared libraries])\n    AC_MSG_RESULT([$can_build_shared])\n\n    AC_MSG_CHECKING([whether to build shared libraries])\n    test \"$can_build_shared\" = \"no\" && enable_shared=no\n\n    # On AIX, shared libraries and static libraries use the same namespace, and\n    # are all built from PIC.\n    case $host_os in\n      aix3*)\n        test \"$enable_shared\" = yes && enable_static=no\n        if test -n \"$RANLIB\"; then\n          archive_cmds=\"$archive_cmds~\\$RANLIB \\$lib\"\n          postinstall_cmds='$RANLIB $lib'\n        fi\n        ;;\n      aix[[4-9]]*)\n\tif test \"$host_cpu\" != ia64 && test \"$aix_use_runtimelinking\" = no ; then\n\t  test \"$enable_shared\" = yes && enable_static=no\n\tfi\n        ;;\n    esac\n    AC_MSG_RESULT([$enable_shared])\n\n    AC_MSG_CHECKING([whether to build static libraries])\n    # Make sure either enable_shared or enable_static is yes.\n    test \"$enable_shared\" = yes || enable_static=yes\n    AC_MSG_RESULT([$enable_static])\n\n    _LT_TAGVAR(GCC, $1)=\"$G77\"\n    _LT_TAGVAR(LD, $1)=\"$LD\"\n\n    ## CAVEAT EMPTOR:\n    ## There is no encapsulation within the following macros, do not change\n    ## the running order or otherwise move them around unless you know exactly\n    ## what you are doing...\n    _LT_COMPILER_PIC($1)\n    _LT_COMPILER_C_O($1)\n    _LT_COMPILER_FILE_LOCKS($1)\n    _LT_LINKER_SHLIBS($1)\n    _LT_SYS_DYNAMIC_LINKER($1)\n    _LT_LINKER_HARDCODE_LIBPATH($1)\n\n    _LT_CONFIG($1)\n  fi # test -n \"$compiler\"\n\n  GCC=$lt_save_GCC\n  CC=\"$lt_save_CC\"\n  CFLAGS=\"$lt_save_CFLAGS\"\nfi # test \"$_lt_disable_F77\" != yes\n\nAC_LANG_POP\n])# _LT_LANG_F77_CONFIG\n\n\n# _LT_LANG_FC_CONFIG([TAG])\n# -------------------------\n# Ensure that the configuration variables for a Fortran compiler are\n# suitably defined.  These variables are subsequently used by _LT_CONFIG\n# to write the compiler configuration to `libtool'.\nm4_defun([_LT_LANG_FC_CONFIG],\n[AC_LANG_PUSH(Fortran)\n\nif test -z \"$FC\" || test \"X$FC\" = \"Xno\"; then\n  _lt_disable_FC=yes\nfi\n\n_LT_TAGVAR(archive_cmds_need_lc, $1)=no\n_LT_TAGVAR(allow_undefined_flag, $1)=\n_LT_TAGVAR(always_export_symbols, $1)=no\n_LT_TAGVAR(archive_expsym_cmds, $1)=\n_LT_TAGVAR(export_dynamic_flag_spec, $1)=\n_LT_TAGVAR(hardcode_direct, $1)=no\n_LT_TAGVAR(hardcode_direct_absolute, $1)=no\n_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=\n_LT_TAGVAR(hardcode_libdir_separator, $1)=\n_LT_TAGVAR(hardcode_minus_L, $1)=no\n_LT_TAGVAR(hardcode_automatic, $1)=no\n_LT_TAGVAR(inherit_rpath, $1)=no\n_LT_TAGVAR(module_cmds, $1)=\n_LT_TAGVAR(module_expsym_cmds, $1)=\n_LT_TAGVAR(link_all_deplibs, $1)=unknown\n_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds\n_LT_TAGVAR(reload_flag, $1)=$reload_flag\n_LT_TAGVAR(reload_cmds, $1)=$reload_cmds\n_LT_TAGVAR(no_undefined_flag, $1)=\n_LT_TAGVAR(whole_archive_flag_spec, $1)=\n_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no\n\n# Source file extension for fc test sources.\nac_ext=${ac_fc_srcext-f}\n\n# Object file extension for compiled fc test sources.\nobjext=o\n_LT_TAGVAR(objext, $1)=$objext\n\n# No sense in running all these tests if we already determined that\n# the FC compiler isn't working.  Some variables (like enable_shared)\n# are currently assumed to apply to all compilers on this platform,\n# and will be corrupted by setting them based on a non-working compiler.\nif test \"$_lt_disable_FC\" != yes; then\n  # Code to be used in simple compile tests\n  lt_simple_compile_test_code=\"\\\n      subroutine t\n      return\n      end\n\"\n\n  # Code to be used in simple link tests\n  lt_simple_link_test_code=\"\\\n      program t\n      end\n\"\n\n  # ltmain only uses $CC for tagged configurations so make sure $CC is set.\n  _LT_TAG_COMPILER\n\n  # save warnings/boilerplate of simple test code\n  _LT_COMPILER_BOILERPLATE\n  _LT_LINKER_BOILERPLATE\n\n  # Allow CC to be a program name with arguments.\n  lt_save_CC=\"$CC\"\n  lt_save_GCC=$GCC\n  lt_save_CFLAGS=$CFLAGS\n  CC=${FC-\"f95\"}\n  CFLAGS=$FCFLAGS\n  compiler=$CC\n  GCC=$ac_cv_fc_compiler_gnu\n\n  _LT_TAGVAR(compiler, $1)=$CC\n  _LT_CC_BASENAME([$compiler])\n\n  if test -n \"$compiler\"; then\n    AC_MSG_CHECKING([if libtool supports shared libraries])\n    AC_MSG_RESULT([$can_build_shared])\n\n    AC_MSG_CHECKING([whether to build shared libraries])\n    test \"$can_build_shared\" = \"no\" && enable_shared=no\n\n    # On AIX, shared libraries and static libraries use the same namespace, and\n    # are all built from PIC.\n    case $host_os in\n      aix3*)\n        test \"$enable_shared\" = yes && enable_static=no\n        if test -n \"$RANLIB\"; then\n          archive_cmds=\"$archive_cmds~\\$RANLIB \\$lib\"\n          postinstall_cmds='$RANLIB $lib'\n        fi\n        ;;\n      aix[[4-9]]*)\n\tif test \"$host_cpu\" != ia64 && test \"$aix_use_runtimelinking\" = no ; then\n\t  test \"$enable_shared\" = yes && enable_static=no\n\tfi\n        ;;\n    esac\n    AC_MSG_RESULT([$enable_shared])\n\n    AC_MSG_CHECKING([whether to build static libraries])\n    # Make sure either enable_shared or enable_static is yes.\n    test \"$enable_shared\" = yes || enable_static=yes\n    AC_MSG_RESULT([$enable_static])\n\n    _LT_TAGVAR(GCC, $1)=\"$ac_cv_fc_compiler_gnu\"\n    _LT_TAGVAR(LD, $1)=\"$LD\"\n\n    ## CAVEAT EMPTOR:\n    ## There is no encapsulation within the following macros, do not change\n    ## the running order or otherwise move them around unless you know exactly\n    ## what you are doing...\n    _LT_SYS_HIDDEN_LIBDEPS($1)\n    _LT_COMPILER_PIC($1)\n    _LT_COMPILER_C_O($1)\n    _LT_COMPILER_FILE_LOCKS($1)\n    _LT_LINKER_SHLIBS($1)\n    _LT_SYS_DYNAMIC_LINKER($1)\n    _LT_LINKER_HARDCODE_LIBPATH($1)\n\n    _LT_CONFIG($1)\n  fi # test -n \"$compiler\"\n\n  GCC=$lt_save_GCC\n  CC=$lt_save_CC\n  CFLAGS=$lt_save_CFLAGS\nfi # test \"$_lt_disable_FC\" != yes\n\nAC_LANG_POP\n])# _LT_LANG_FC_CONFIG\n\n\n# _LT_LANG_GCJ_CONFIG([TAG])\n# --------------------------\n# Ensure that the configuration variables for the GNU Java Compiler compiler\n# are suitably defined.  These variables are subsequently used by _LT_CONFIG\n# to write the compiler configuration to `libtool'.\nm4_defun([_LT_LANG_GCJ_CONFIG],\n[AC_REQUIRE([LT_PROG_GCJ])dnl\nAC_LANG_SAVE\n\n# Source file extension for Java test sources.\nac_ext=java\n\n# Object file extension for compiled Java test sources.\nobjext=o\n_LT_TAGVAR(objext, $1)=$objext\n\n# Code to be used in simple compile tests\nlt_simple_compile_test_code=\"class foo {}\"\n\n# Code to be used in simple link tests\nlt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'\n\n# ltmain only uses $CC for tagged configurations so make sure $CC is set.\n_LT_TAG_COMPILER\n\n# save warnings/boilerplate of simple test code\n_LT_COMPILER_BOILERPLATE\n_LT_LINKER_BOILERPLATE\n\n# Allow CC to be a program name with arguments.\nlt_save_CC=$CC\nlt_save_CFLAGS=$CFLAGS\nlt_save_GCC=$GCC\nGCC=yes\nCC=${GCJ-\"gcj\"}\nCFLAGS=$GCJFLAGS\ncompiler=$CC\n_LT_TAGVAR(compiler, $1)=$CC\n_LT_TAGVAR(LD, $1)=\"$LD\"\n_LT_CC_BASENAME([$compiler])\n\n# GCJ did not exist at the time GCC didn't implicitly link libc in.\n_LT_TAGVAR(archive_cmds_need_lc, $1)=no\n\n_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds\n_LT_TAGVAR(reload_flag, $1)=$reload_flag\n_LT_TAGVAR(reload_cmds, $1)=$reload_cmds\n\n## CAVEAT EMPTOR:\n## There is no encapsulation within the following macros, do not change\n## the running order or otherwise move them around unless you know exactly\n## what you are doing...\nif test -n \"$compiler\"; then\n  _LT_COMPILER_NO_RTTI($1)\n  _LT_COMPILER_PIC($1)\n  _LT_COMPILER_C_O($1)\n  _LT_COMPILER_FILE_LOCKS($1)\n  _LT_LINKER_SHLIBS($1)\n  _LT_LINKER_HARDCODE_LIBPATH($1)\n\n  _LT_CONFIG($1)\nfi\n\nAC_LANG_RESTORE\n\nGCC=$lt_save_GCC\nCC=$lt_save_CC\nCFLAGS=$lt_save_CFLAGS\n])# _LT_LANG_GCJ_CONFIG\n\n\n# _LT_LANG_GO_CONFIG([TAG])\n# --------------------------\n# Ensure that the configuration variables for the GNU Go compiler\n# are suitably defined.  These variables are subsequently used by _LT_CONFIG\n# to write the compiler configuration to `libtool'.\nm4_defun([_LT_LANG_GO_CONFIG],\n[AC_REQUIRE([LT_PROG_GO])dnl\nAC_LANG_SAVE\n\n# Source file extension for Go test sources.\nac_ext=go\n\n# Object file extension for compiled Go test sources.\nobjext=o\n_LT_TAGVAR(objext, $1)=$objext\n\n# Code to be used in simple compile tests\nlt_simple_compile_test_code=\"package main; func main() { }\"\n\n# Code to be used in simple link tests\nlt_simple_link_test_code='package main; func main() { }'\n\n# ltmain only uses $CC for tagged configurations so make sure $CC is set.\n_LT_TAG_COMPILER\n\n# save warnings/boilerplate of simple test code\n_LT_COMPILER_BOILERPLATE\n_LT_LINKER_BOILERPLATE\n\n# Allow CC to be a program name with arguments.\nlt_save_CC=$CC\nlt_save_CFLAGS=$CFLAGS\nlt_save_GCC=$GCC\nGCC=yes\nCC=${GOC-\"gccgo\"}\nCFLAGS=$GOFLAGS\ncompiler=$CC\n_LT_TAGVAR(compiler, $1)=$CC\n_LT_TAGVAR(LD, $1)=\"$LD\"\n_LT_CC_BASENAME([$compiler])\n\n# Go did not exist at the time GCC didn't implicitly link libc in.\n_LT_TAGVAR(archive_cmds_need_lc, $1)=no\n\n_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds\n_LT_TAGVAR(reload_flag, $1)=$reload_flag\n_LT_TAGVAR(reload_cmds, $1)=$reload_cmds\n\n## CAVEAT EMPTOR:\n## There is no encapsulation within the following macros, do not change\n## the running order or otherwise move them around unless you know exactly\n## what you are doing...\nif test -n \"$compiler\"; then\n  _LT_COMPILER_NO_RTTI($1)\n  _LT_COMPILER_PIC($1)\n  _LT_COMPILER_C_O($1)\n  _LT_COMPILER_FILE_LOCKS($1)\n  _LT_LINKER_SHLIBS($1)\n  _LT_LINKER_HARDCODE_LIBPATH($1)\n\n  _LT_CONFIG($1)\nfi\n\nAC_LANG_RESTORE\n\nGCC=$lt_save_GCC\nCC=$lt_save_CC\nCFLAGS=$lt_save_CFLAGS\n])# _LT_LANG_GO_CONFIG\n\n\n# _LT_LANG_RC_CONFIG([TAG])\n# -------------------------\n# Ensure that the configuration variables for the Windows resource compiler\n# are suitably defined.  These variables are subsequently used by _LT_CONFIG\n# to write the compiler configuration to `libtool'.\nm4_defun([_LT_LANG_RC_CONFIG],\n[AC_REQUIRE([LT_PROG_RC])dnl\nAC_LANG_SAVE\n\n# Source file extension for RC test sources.\nac_ext=rc\n\n# Object file extension for compiled RC test sources.\nobjext=o\n_LT_TAGVAR(objext, $1)=$objext\n\n# Code to be used in simple compile tests\nlt_simple_compile_test_code='sample MENU { MENUITEM \"&Soup\", 100, CHECKED }'\n\n# Code to be used in simple link tests\nlt_simple_link_test_code=\"$lt_simple_compile_test_code\"\n\n# ltmain only uses $CC for tagged configurations so make sure $CC is set.\n_LT_TAG_COMPILER\n\n# save warnings/boilerplate of simple test code\n_LT_COMPILER_BOILERPLATE\n_LT_LINKER_BOILERPLATE\n\n# Allow CC to be a program name with arguments.\nlt_save_CC=\"$CC\"\nlt_save_CFLAGS=$CFLAGS\nlt_save_GCC=$GCC\nGCC=\nCC=${RC-\"windres\"}\nCFLAGS=\ncompiler=$CC\n_LT_TAGVAR(compiler, $1)=$CC\n_LT_CC_BASENAME([$compiler])\n_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes\n\nif test -n \"$compiler\"; then\n  :\n  _LT_CONFIG($1)\nfi\n\nGCC=$lt_save_GCC\nAC_LANG_RESTORE\nCC=$lt_save_CC\nCFLAGS=$lt_save_CFLAGS\n])# _LT_LANG_RC_CONFIG\n\n\n# LT_PROG_GCJ\n# -----------\nAC_DEFUN([LT_PROG_GCJ],\n[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],\n  [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],\n    [AC_CHECK_TOOL(GCJ, gcj,)\n      test \"x${GCJFLAGS+set}\" = xset || GCJFLAGS=\"-g -O2\"\n      AC_SUBST(GCJFLAGS)])])[]dnl\n])\n\n# Old name:\nAU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([LT_AC_PROG_GCJ], [])\n\n\n# LT_PROG_GO\n# ----------\nAC_DEFUN([LT_PROG_GO],\n[AC_CHECK_TOOL(GOC, gccgo,)\n])\n\n\n# LT_PROG_RC\n# ----------\nAC_DEFUN([LT_PROG_RC],\n[AC_CHECK_TOOL(RC, windres,)\n])\n\n# Old name:\nAU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([LT_AC_PROG_RC], [])\n\n\n# _LT_DECL_EGREP\n# --------------\n# If we don't have a new enough Autoconf to choose the best grep\n# available, choose the one first in the user's PATH.\nm4_defun([_LT_DECL_EGREP],\n[AC_REQUIRE([AC_PROG_EGREP])dnl\nAC_REQUIRE([AC_PROG_FGREP])dnl\ntest -z \"$GREP\" && GREP=grep\n_LT_DECL([], [GREP], [1], [A grep program that handles long lines])\n_LT_DECL([], [EGREP], [1], [An ERE matcher])\n_LT_DECL([], [FGREP], [1], [A literal string matcher])\ndnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too\nAC_SUBST([GREP])\n])\n\n\n# _LT_DECL_OBJDUMP\n# --------------\n# If we don't have a new enough Autoconf to choose the best objdump\n# available, choose the one first in the user's PATH.\nm4_defun([_LT_DECL_OBJDUMP],\n[AC_CHECK_TOOL(OBJDUMP, objdump, false)\ntest -z \"$OBJDUMP\" && OBJDUMP=objdump\n_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])\nAC_SUBST([OBJDUMP])\n])\n\n# _LT_DECL_DLLTOOL\n# ----------------\n# Ensure DLLTOOL variable is set.\nm4_defun([_LT_DECL_DLLTOOL],\n[AC_CHECK_TOOL(DLLTOOL, dlltool, false)\ntest -z \"$DLLTOOL\" && DLLTOOL=dlltool\n_LT_DECL([], [DLLTOOL], [1], [DLL creation program])\nAC_SUBST([DLLTOOL])\n])\n\n# _LT_DECL_SED\n# ------------\n# Check for a fully-functional sed program, that truncates\n# as few characters as possible.  Prefer GNU sed if found.\nm4_defun([_LT_DECL_SED],\n[AC_PROG_SED\ntest -z \"$SED\" && SED=sed\nXsed=\"$SED -e 1s/^X//\"\n_LT_DECL([], [SED], [1], [A sed program that does not truncate output])\n_LT_DECL([], [Xsed], [\"\\$SED -e 1s/^X//\"],\n    [Sed that helps us avoid accidentally triggering echo(1) options like -n])\n])# _LT_DECL_SED\n\nm4_ifndef([AC_PROG_SED], [\n############################################################\n# NOTE: This macro has been submitted for inclusion into   #\n#  GNU Autoconf as AC_PROG_SED.  When it is available in   #\n#  a released version of Autoconf we should remove this    #\n#  macro and use it instead.                               #\n############################################################\n\nm4_defun([AC_PROG_SED],\n[AC_MSG_CHECKING([for a sed that does not truncate output])\nAC_CACHE_VAL(lt_cv_path_SED,\n[# Loop through the user's path and test for sed and gsed.\n# Then use that list of sed's as ones to test for truncation.\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for lt_ac_prog in sed gsed; do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      if $as_executable_p \"$as_dir/$lt_ac_prog$ac_exec_ext\"; then\n        lt_ac_sed_list=\"$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext\"\n      fi\n    done\n  done\ndone\nIFS=$as_save_IFS\nlt_ac_max=0\nlt_ac_count=0\n# Add /usr/xpg4/bin/sed as it is typically found on Solaris\n# along with /bin/sed that truncates output.\nfor lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do\n  test ! -f $lt_ac_sed && continue\n  cat /dev/null > conftest.in\n  lt_ac_count=0\n  echo $ECHO_N \"0123456789$ECHO_C\" >conftest.in\n  # Check for GNU sed and select it if it is found.\n  if \"$lt_ac_sed\" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then\n    lt_cv_path_SED=$lt_ac_sed\n    break\n  fi\n  while true; do\n    cat conftest.in conftest.in >conftest.tmp\n    mv conftest.tmp conftest.in\n    cp conftest.in conftest.nl\n    echo >>conftest.nl\n    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break\n    cmp -s conftest.out conftest.nl || break\n    # 10000 chars as input seems more than enough\n    test $lt_ac_count -gt 10 && break\n    lt_ac_count=`expr $lt_ac_count + 1`\n    if test $lt_ac_count -gt $lt_ac_max; then\n      lt_ac_max=$lt_ac_count\n      lt_cv_path_SED=$lt_ac_sed\n    fi\n  done\ndone\n])\nSED=$lt_cv_path_SED\nAC_SUBST([SED])\nAC_MSG_RESULT([$SED])\n])#AC_PROG_SED\n])#m4_ifndef\n\n# Old name:\nAU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([LT_AC_PROG_SED], [])\n\n\n# _LT_CHECK_SHELL_FEATURES\n# ------------------------\n# Find out whether the shell is Bourne or XSI compatible,\n# or has some other useful features.\nm4_defun([_LT_CHECK_SHELL_FEATURES],\n[AC_MSG_CHECKING([whether the shell understands some XSI constructs])\n# Try some XSI features\nxsi_shell=no\n( _lt_dummy=\"a/b/c\"\n  test \"${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}\"${_lt_dummy%\"$_lt_dummy\"}, \\\n      = c,a/b,b/c, \\\n    && eval 'test $(( 1 + 1 )) -eq 2 \\\n    && test \"${#_lt_dummy}\" -eq 5' ) >/dev/null 2>&1 \\\n  && xsi_shell=yes\nAC_MSG_RESULT([$xsi_shell])\n_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell'])\n\nAC_MSG_CHECKING([whether the shell understands \"+=\"])\nlt_shell_append=no\n( foo=bar; set foo baz; eval \"$[1]+=\\$[2]\" && test \"$foo\" = barbaz ) \\\n    >/dev/null 2>&1 \\\n  && lt_shell_append=yes\nAC_MSG_RESULT([$lt_shell_append])\n_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append'])\n\nif ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then\n  lt_unset=unset\nelse\n  lt_unset=false\nfi\n_LT_DECL([], [lt_unset], [0], [whether the shell understands \"unset\"])dnl\n\n# test EBCDIC or ASCII\ncase `echo X|tr X '\\101'` in\n A) # ASCII based system\n    # \\n is not interpreted correctly by Solaris 8 /usr/ucb/tr\n  lt_SP2NL='tr \\040 \\012'\n  lt_NL2SP='tr \\015\\012 \\040\\040'\n  ;;\n *) # EBCDIC based system\n  lt_SP2NL='tr \\100 \\n'\n  lt_NL2SP='tr \\r\\n \\100\\100'\n  ;;\nesac\n_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl\n_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl\n])# _LT_CHECK_SHELL_FEATURES\n\n\n# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY)\n# ------------------------------------------------------\n# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and\n# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY.\nm4_defun([_LT_PROG_FUNCTION_REPLACE],\n[dnl {\nsed -e '/^$1 ()$/,/^} # $1 /c\\\n$1 ()\\\n{\\\nm4_bpatsubsts([$2], [$], [\\\\], [^\\([\t ]\\)], [\\\\\\1])\n} # Extended-shell $1 implementation' \"$cfgfile\" > $cfgfile.tmp \\\n  && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\ntest 0 -eq $? || _lt_function_replace_fail=:\n])\n\n\n# _LT_PROG_REPLACE_SHELLFNS\n# -------------------------\n# Replace existing portable implementations of several shell functions with\n# equivalent extended shell implementations where those features are available..\nm4_defun([_LT_PROG_REPLACE_SHELLFNS],\n[if test x\"$xsi_shell\" = xyes; then\n  _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl\n    case ${1} in\n      */*) func_dirname_result=\"${1%/*}${2}\" ;;\n      *  ) func_dirname_result=\"${3}\" ;;\n    esac])\n\n  _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl\n    func_basename_result=\"${1##*/}\"])\n\n  _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl\n    case ${1} in\n      */*) func_dirname_result=\"${1%/*}${2}\" ;;\n      *  ) func_dirname_result=\"${3}\" ;;\n    esac\n    func_basename_result=\"${1##*/}\"])\n\n  _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl\n    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\n    # positional parameters, so assign one to ordinary parameter first.\n    func_stripname_result=${3}\n    func_stripname_result=${func_stripname_result#\"${1}\"}\n    func_stripname_result=${func_stripname_result%\"${2}\"}])\n\n  _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl\n    func_split_long_opt_name=${1%%=*}\n    func_split_long_opt_arg=${1#*=}])\n\n  _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl\n    func_split_short_opt_arg=${1#??}\n    func_split_short_opt_name=${1%\"$func_split_short_opt_arg\"}])\n\n  _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl\n    case ${1} in\n      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\n      *)    func_lo2o_result=${1} ;;\n    esac])\n\n  _LT_PROG_FUNCTION_REPLACE([func_xform], [    func_xform_result=${1%.*}.lo])\n\n  _LT_PROG_FUNCTION_REPLACE([func_arith], [    func_arith_result=$(( $[*] ))])\n\n  _LT_PROG_FUNCTION_REPLACE([func_len], [    func_len_result=${#1}])\nfi\n\nif test x\"$lt_shell_append\" = xyes; then\n  _LT_PROG_FUNCTION_REPLACE([func_append], [    eval \"${1}+=\\\\${2}\"])\n\n  _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl\n    func_quote_for_eval \"${2}\"\ndnl m4 expansion turns \\\\\\\\ into \\\\, and then the shell eval turns that into \\\n    eval \"${1}+=\\\\\\\\ \\\\$func_quote_for_eval_result\"])\n\n  # Save a `func_append' function call where possible by direct use of '+='\n  sed -e 's%func_append \\([[a-zA-Z_]]\\{1,\\}\\) \"%\\1+=\"%g' $cfgfile > $cfgfile.tmp \\\n    && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n      || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\n  test 0 -eq $? || _lt_function_replace_fail=:\nelse\n  # Save a `func_append' function call even when '+=' is not available\n  sed -e 's%func_append \\([[a-zA-Z_]]\\{1,\\}\\) \"%\\1=\"$\\1%g' $cfgfile > $cfgfile.tmp \\\n    && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n      || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\n  test 0 -eq $? || _lt_function_replace_fail=:\nfi\n\nif test x\"$_lt_function_replace_fail\" = x\":\"; then\n  AC_MSG_WARN([Unable to substitute extended shell functions in $ofile])\nfi\n])\n\n# _LT_PATH_CONVERSION_FUNCTIONS\n# -----------------------------\n# Determine which file name conversion functions should be used by\n# func_to_host_file (and, implicitly, by func_to_host_path).  These are needed\n# for certain cross-compile configurations and native mingw.\nm4_defun([_LT_PATH_CONVERSION_FUNCTIONS],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\nAC_REQUIRE([AC_CANONICAL_BUILD])dnl\nAC_MSG_CHECKING([how to convert $build file names to $host format])\nAC_CACHE_VAL(lt_cv_to_host_file_cmd,\n[case $host in\n  *-*-mingw* )\n    case $build in\n      *-*-mingw* ) # actually msys\n        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32\n        ;;\n      *-*-cygwin* )\n        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32\n        ;;\n      * ) # otherwise, assume *nix\n        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32\n        ;;\n    esac\n    ;;\n  *-*-cygwin* )\n    case $build in\n      *-*-mingw* ) # actually msys\n        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin\n        ;;\n      *-*-cygwin* )\n        lt_cv_to_host_file_cmd=func_convert_file_noop\n        ;;\n      * ) # otherwise, assume *nix\n        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin\n        ;;\n    esac\n    ;;\n  * ) # unhandled hosts (and \"normal\" native builds)\n    lt_cv_to_host_file_cmd=func_convert_file_noop\n    ;;\nesac\n])\nto_host_file_cmd=$lt_cv_to_host_file_cmd\nAC_MSG_RESULT([$lt_cv_to_host_file_cmd])\n_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd],\n         [0], [convert $build file names to $host format])dnl\n\nAC_MSG_CHECKING([how to convert $build file names to toolchain format])\nAC_CACHE_VAL(lt_cv_to_tool_file_cmd,\n[#assume ordinary cross tools, or native build.\nlt_cv_to_tool_file_cmd=func_convert_file_noop\ncase $host in\n  *-*-mingw* )\n    case $build in\n      *-*-mingw* ) # actually msys\n        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32\n        ;;\n    esac\n    ;;\nesac\n])\nto_tool_file_cmd=$lt_cv_to_tool_file_cmd\nAC_MSG_RESULT([$lt_cv_to_tool_file_cmd])\n_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd],\n         [0], [convert $build files to toolchain format])dnl\n])# _LT_PATH_CONVERSION_FUNCTIONS\n"
  },
  {
    "path": "libs/CoMISo/gmm/m4/ltoptions.m4",
    "content": "# Helper functions for option handling.                    -*- Autoconf -*-\n#\n#   Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation,\n#   Inc.\n#   Written by Gary V. Vaughan, 2004\n#\n# This file is free software; the Free Software Foundation gives\n# unlimited permission to copy and/or distribute it, with or without\n# modifications, as long as this notice is preserved.\n\n# serial 7 ltoptions.m4\n\n# This is to help aclocal find these macros, as it can't see m4_define.\nAC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])\n\n\n# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)\n# ------------------------------------------\nm4_define([_LT_MANGLE_OPTION],\n[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])\n\n\n# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)\n# ---------------------------------------\n# Set option OPTION-NAME for macro MACRO-NAME, and if there is a\n# matching handler defined, dispatch to it.  Other OPTION-NAMEs are\n# saved as a flag.\nm4_define([_LT_SET_OPTION],\n[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl\nm4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),\n        _LT_MANGLE_DEFUN([$1], [$2]),\n    [m4_warning([Unknown $1 option `$2'])])[]dnl\n])\n\n\n# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])\n# ------------------------------------------------------------\n# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.\nm4_define([_LT_IF_OPTION],\n[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])\n\n\n# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)\n# -------------------------------------------------------\n# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME\n# are set.\nm4_define([_LT_UNLESS_OPTIONS],\n[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),\n\t    [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),\n\t\t      [m4_define([$0_found])])])[]dnl\nm4_ifdef([$0_found], [m4_undefine([$0_found])], [$3\n])[]dnl\n])\n\n\n# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)\n# ----------------------------------------\n# OPTION-LIST is a space-separated list of Libtool options associated\n# with MACRO-NAME.  If any OPTION has a matching handler declared with\n# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about\n# the unknown option and exit.\nm4_defun([_LT_SET_OPTIONS],\n[# Set options\nm4_foreach([_LT_Option], m4_split(m4_normalize([$2])),\n    [_LT_SET_OPTION([$1], _LT_Option)])\n\nm4_if([$1],[LT_INIT],[\n  dnl\n  dnl Simply set some default values (i.e off) if boolean options were not\n  dnl specified:\n  _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no\n  ])\n  _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no\n  ])\n  dnl\n  dnl If no reference was made to various pairs of opposing options, then\n  dnl we run the default mode handler for the pair.  For example, if neither\n  dnl `shared' nor `disable-shared' was passed, we enable building of shared\n  dnl archives by default:\n  _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])\n  _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])\n  _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])\n  _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],\n  \t\t   [_LT_ENABLE_FAST_INSTALL])\n  ])\n])# _LT_SET_OPTIONS\n\n\n## --------------------------------- ##\n## Macros to handle LT_INIT options. ##\n## --------------------------------- ##\n\n# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)\n# -----------------------------------------\nm4_define([_LT_MANGLE_DEFUN],\n[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])\n\n\n# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)\n# -----------------------------------------------\nm4_define([LT_OPTION_DEFINE],\n[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl\n])# LT_OPTION_DEFINE\n\n\n# dlopen\n# ------\nLT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes\n])\n\nAU_DEFUN([AC_LIBTOOL_DLOPEN],\n[_LT_SET_OPTION([LT_INIT], [dlopen])\nAC_DIAGNOSE([obsolete],\n[$0: Remove this warning and the call to _LT_SET_OPTION when you\nput the `dlopen' option into LT_INIT's first parameter.])\n])\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])\n\n\n# win32-dll\n# ---------\n# Declare package support for building win32 dll's.\nLT_OPTION_DEFINE([LT_INIT], [win32-dll],\n[enable_win32_dll=yes\n\ncase $host in\n*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)\n  AC_CHECK_TOOL(AS, as, false)\n  AC_CHECK_TOOL(DLLTOOL, dlltool, false)\n  AC_CHECK_TOOL(OBJDUMP, objdump, false)\n  ;;\nesac\n\ntest -z \"$AS\" && AS=as\n_LT_DECL([], [AS],      [1], [Assembler program])dnl\n\ntest -z \"$DLLTOOL\" && DLLTOOL=dlltool\n_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl\n\ntest -z \"$OBJDUMP\" && OBJDUMP=objdump\n_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl\n])# win32-dll\n\nAU_DEFUN([AC_LIBTOOL_WIN32_DLL],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\n_LT_SET_OPTION([LT_INIT], [win32-dll])\nAC_DIAGNOSE([obsolete],\n[$0: Remove this warning and the call to _LT_SET_OPTION when you\nput the `win32-dll' option into LT_INIT's first parameter.])\n])\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])\n\n\n# _LT_ENABLE_SHARED([DEFAULT])\n# ----------------------------\n# implement the --enable-shared flag, and supports the `shared' and\n# `disable-shared' LT_INIT options.\n# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.\nm4_define([_LT_ENABLE_SHARED],\n[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl\nAC_ARG_ENABLE([shared],\n    [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],\n\t[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],\n    [p=${PACKAGE-default}\n    case $enableval in\n    yes) enable_shared=yes ;;\n    no) enable_shared=no ;;\n    *)\n      enable_shared=no\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=\"$IFS\"; IFS=\"${IFS}$PATH_SEPARATOR,\"\n      for pkg in $enableval; do\n\tIFS=\"$lt_save_ifs\"\n\tif test \"X$pkg\" = \"X$p\"; then\n\t  enable_shared=yes\n\tfi\n      done\n      IFS=\"$lt_save_ifs\"\n      ;;\n    esac],\n    [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)\n\n    _LT_DECL([build_libtool_libs], [enable_shared], [0],\n\t[Whether or not to build shared libraries])\n])# _LT_ENABLE_SHARED\n\nLT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])\nLT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])\n\n# Old names:\nAC_DEFUN([AC_ENABLE_SHARED],\n[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])\n])\n\nAC_DEFUN([AC_DISABLE_SHARED],\n[_LT_SET_OPTION([LT_INIT], [disable-shared])\n])\n\nAU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])\nAU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AM_ENABLE_SHARED], [])\ndnl AC_DEFUN([AM_DISABLE_SHARED], [])\n\n\n\n# _LT_ENABLE_STATIC([DEFAULT])\n# ----------------------------\n# implement the --enable-static flag, and support the `static' and\n# `disable-static' LT_INIT options.\n# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.\nm4_define([_LT_ENABLE_STATIC],\n[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl\nAC_ARG_ENABLE([static],\n    [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],\n\t[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],\n    [p=${PACKAGE-default}\n    case $enableval in\n    yes) enable_static=yes ;;\n    no) enable_static=no ;;\n    *)\n     enable_static=no\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=\"$IFS\"; IFS=\"${IFS}$PATH_SEPARATOR,\"\n      for pkg in $enableval; do\n\tIFS=\"$lt_save_ifs\"\n\tif test \"X$pkg\" = \"X$p\"; then\n\t  enable_static=yes\n\tfi\n      done\n      IFS=\"$lt_save_ifs\"\n      ;;\n    esac],\n    [enable_static=]_LT_ENABLE_STATIC_DEFAULT)\n\n    _LT_DECL([build_old_libs], [enable_static], [0],\n\t[Whether or not to build static libraries])\n])# _LT_ENABLE_STATIC\n\nLT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])\nLT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])\n\n# Old names:\nAC_DEFUN([AC_ENABLE_STATIC],\n[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])\n])\n\nAC_DEFUN([AC_DISABLE_STATIC],\n[_LT_SET_OPTION([LT_INIT], [disable-static])\n])\n\nAU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])\nAU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AM_ENABLE_STATIC], [])\ndnl AC_DEFUN([AM_DISABLE_STATIC], [])\n\n\n\n# _LT_ENABLE_FAST_INSTALL([DEFAULT])\n# ----------------------------------\n# implement the --enable-fast-install flag, and support the `fast-install'\n# and `disable-fast-install' LT_INIT options.\n# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.\nm4_define([_LT_ENABLE_FAST_INSTALL],\n[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl\nAC_ARG_ENABLE([fast-install],\n    [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],\n    [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],\n    [p=${PACKAGE-default}\n    case $enableval in\n    yes) enable_fast_install=yes ;;\n    no) enable_fast_install=no ;;\n    *)\n      enable_fast_install=no\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=\"$IFS\"; IFS=\"${IFS}$PATH_SEPARATOR,\"\n      for pkg in $enableval; do\n\tIFS=\"$lt_save_ifs\"\n\tif test \"X$pkg\" = \"X$p\"; then\n\t  enable_fast_install=yes\n\tfi\n      done\n      IFS=\"$lt_save_ifs\"\n      ;;\n    esac],\n    [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)\n\n_LT_DECL([fast_install], [enable_fast_install], [0],\n\t [Whether or not to optimize for fast installation])dnl\n])# _LT_ENABLE_FAST_INSTALL\n\nLT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])\nLT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])\n\n# Old names:\nAU_DEFUN([AC_ENABLE_FAST_INSTALL],\n[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])\nAC_DIAGNOSE([obsolete],\n[$0: Remove this warning and the call to _LT_SET_OPTION when you put\nthe `fast-install' option into LT_INIT's first parameter.])\n])\n\nAU_DEFUN([AC_DISABLE_FAST_INSTALL],\n[_LT_SET_OPTION([LT_INIT], [disable-fast-install])\nAC_DIAGNOSE([obsolete],\n[$0: Remove this warning and the call to _LT_SET_OPTION when you put\nthe `disable-fast-install' option into LT_INIT's first parameter.])\n])\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])\ndnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])\n\n\n# _LT_WITH_PIC([MODE])\n# --------------------\n# implement the --with-pic flag, and support the `pic-only' and `no-pic'\n# LT_INIT options.\n# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.\nm4_define([_LT_WITH_PIC],\n[AC_ARG_WITH([pic],\n    [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@],\n\t[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],\n    [lt_p=${PACKAGE-default}\n    case $withval in\n    yes|no) pic_mode=$withval ;;\n    *)\n      pic_mode=default\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=\"$IFS\"; IFS=\"${IFS}$PATH_SEPARATOR,\"\n      for lt_pkg in $withval; do\n\tIFS=\"$lt_save_ifs\"\n\tif test \"X$lt_pkg\" = \"X$lt_p\"; then\n\t  pic_mode=yes\n\tfi\n      done\n      IFS=\"$lt_save_ifs\"\n      ;;\n    esac],\n    [pic_mode=default])\n\ntest -z \"$pic_mode\" && pic_mode=m4_default([$1], [default])\n\n_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl\n])# _LT_WITH_PIC\n\nLT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])\nLT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])\n\n# Old name:\nAU_DEFUN([AC_LIBTOOL_PICMODE],\n[_LT_SET_OPTION([LT_INIT], [pic-only])\nAC_DIAGNOSE([obsolete],\n[$0: Remove this warning and the call to _LT_SET_OPTION when you\nput the `pic-only' option into LT_INIT's first parameter.])\n])\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])\n\n## ----------------- ##\n## LTDL_INIT Options ##\n## ----------------- ##\n\nm4_define([_LTDL_MODE], [])\nLT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],\n\t\t [m4_define([_LTDL_MODE], [nonrecursive])])\nLT_OPTION_DEFINE([LTDL_INIT], [recursive],\n\t\t [m4_define([_LTDL_MODE], [recursive])])\nLT_OPTION_DEFINE([LTDL_INIT], [subproject],\n\t\t [m4_define([_LTDL_MODE], [subproject])])\n\nm4_define([_LTDL_TYPE], [])\nLT_OPTION_DEFINE([LTDL_INIT], [installable],\n\t\t [m4_define([_LTDL_TYPE], [installable])])\nLT_OPTION_DEFINE([LTDL_INIT], [convenience],\n\t\t [m4_define([_LTDL_TYPE], [convenience])])\n"
  },
  {
    "path": "libs/CoMISo/gmm/m4/ltsugar.m4",
    "content": "# ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-\n#\n# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.\n# Written by Gary V. Vaughan, 2004\n#\n# This file is free software; the Free Software Foundation gives\n# unlimited permission to copy and/or distribute it, with or without\n# modifications, as long as this notice is preserved.\n\n# serial 6 ltsugar.m4\n\n# This is to help aclocal find these macros, as it can't see m4_define.\nAC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])\n\n\n# lt_join(SEP, ARG1, [ARG2...])\n# -----------------------------\n# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their\n# associated separator.\n# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier\n# versions in m4sugar had bugs.\nm4_define([lt_join],\n[m4_if([$#], [1], [],\n       [$#], [2], [[$2]],\n       [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])\nm4_define([_lt_join],\n[m4_if([$#$2], [2], [],\n       [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])\n\n\n# lt_car(LIST)\n# lt_cdr(LIST)\n# ------------\n# Manipulate m4 lists.\n# These macros are necessary as long as will still need to support\n# Autoconf-2.59 which quotes differently.\nm4_define([lt_car], [[$1]])\nm4_define([lt_cdr],\n[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],\n       [$#], 1, [],\n       [m4_dquote(m4_shift($@))])])\nm4_define([lt_unquote], $1)\n\n\n# lt_append(MACRO-NAME, STRING, [SEPARATOR])\n# ------------------------------------------\n# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.\n# Note that neither SEPARATOR nor STRING are expanded; they are appended\n# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).\n# No SEPARATOR is output if MACRO-NAME was previously undefined (different\n# than defined and empty).\n#\n# This macro is needed until we can rely on Autoconf 2.62, since earlier\n# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.\nm4_define([lt_append],\n[m4_define([$1],\n\t   m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])\n\n\n\n# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])\n# ----------------------------------------------------------\n# Produce a SEP delimited list of all paired combinations of elements of\n# PREFIX-LIST with SUFFIX1 through SUFFIXn.  Each element of the list\n# has the form PREFIXmINFIXSUFFIXn.\n# Needed until we can rely on m4_combine added in Autoconf 2.62.\nm4_define([lt_combine],\n[m4_if(m4_eval([$# > 3]), [1],\n       [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl\n[[m4_foreach([_Lt_prefix], [$2],\n\t     [m4_foreach([_Lt_suffix],\n\t\t]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,\n\t[_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])\n\n\n# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])\n# -----------------------------------------------------------------------\n# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited\n# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.\nm4_define([lt_if_append_uniq],\n[m4_ifdef([$1],\n\t  [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],\n\t\t [lt_append([$1], [$2], [$3])$4],\n\t\t [$5])],\n\t  [lt_append([$1], [$2], [$3])$4])])\n\n\n# lt_dict_add(DICT, KEY, VALUE)\n# -----------------------------\nm4_define([lt_dict_add],\n[m4_define([$1($2)], [$3])])\n\n\n# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)\n# --------------------------------------------\nm4_define([lt_dict_add_subkey],\n[m4_define([$1($2:$3)], [$4])])\n\n\n# lt_dict_fetch(DICT, KEY, [SUBKEY])\n# ----------------------------------\nm4_define([lt_dict_fetch],\n[m4_ifval([$3],\n\tm4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),\n    m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])\n\n\n# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])\n# -----------------------------------------------------------------\nm4_define([lt_if_dict_fetch],\n[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],\n\t[$5],\n    [$6])])\n\n\n# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])\n# --------------------------------------------------------------\nm4_define([lt_dict_filter],\n[m4_if([$5], [], [],\n  [lt_join(m4_quote(m4_default([$4], [[, ]])),\n           lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),\n\t\t      [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl\n])\n"
  },
  {
    "path": "libs/CoMISo/gmm/m4/ltversion.m4",
    "content": "# ltversion.m4 -- version numbers\t\t\t-*- Autoconf -*-\n#\n#   Copyright (C) 2004 Free Software Foundation, Inc.\n#   Written by Scott James Remnant, 2004\n#\n# This file is free software; the Free Software Foundation gives\n# unlimited permission to copy and/or distribute it, with or without\n# modifications, as long as this notice is preserved.\n\n# @configure_input@\n\n# serial 3337 ltversion.m4\n# This file is part of GNU Libtool\n\nm4_define([LT_PACKAGE_VERSION], [2.4.2])\nm4_define([LT_PACKAGE_REVISION], [1.3337])\n\nAC_DEFUN([LTVERSION_VERSION],\n[macro_version='2.4.2'\nmacro_revision='1.3337'\n_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])\n_LT_DECL(, macro_revision, 0)\n])\n"
  },
  {
    "path": "libs/CoMISo/gmm/m4/lt~obsolete.m4",
    "content": "# lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-\n#\n#   Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.\n#   Written by Scott James Remnant, 2004.\n#\n# This file is free software; the Free Software Foundation gives\n# unlimited permission to copy and/or distribute it, with or without\n# modifications, as long as this notice is preserved.\n\n# serial 5 lt~obsolete.m4\n\n# These exist entirely to fool aclocal when bootstrapping libtool.\n#\n# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)\n# which have later been changed to m4_define as they aren't part of the\n# exported API, or moved to Autoconf or Automake where they belong.\n#\n# The trouble is, aclocal is a bit thick.  It'll see the old AC_DEFUN\n# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us\n# using a macro with the same name in our local m4/libtool.m4 it'll\n# pull the old libtool.m4 in (it doesn't see our shiny new m4_define\n# and doesn't know about Autoconf macros at all.)\n#\n# So we provide this file, which has a silly filename so it's always\n# included after everything else.  This provides aclocal with the\n# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything\n# because those macros already exist, or will be overwritten later.\n# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. \n#\n# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.\n# Yes, that means every name once taken will need to remain here until\n# we give up compatibility with versions before 1.7, at which point\n# we need to keep only those names which we still refer to.\n\n# This is to help aclocal find these macros, as it can't see m4_define.\nAC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])\n\nm4_ifndef([AC_LIBTOOL_LINKER_OPTION],\t[AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])\nm4_ifndef([AC_PROG_EGREP],\t\t[AC_DEFUN([AC_PROG_EGREP])])\nm4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH],\t[AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])\nm4_ifndef([_LT_AC_SHELL_INIT],\t\t[AC_DEFUN([_LT_AC_SHELL_INIT])])\nm4_ifndef([_LT_AC_SYS_LIBPATH_AIX],\t[AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])\nm4_ifndef([_LT_PROG_LTMAIN],\t\t[AC_DEFUN([_LT_PROG_LTMAIN])])\nm4_ifndef([_LT_AC_TAGVAR],\t\t[AC_DEFUN([_LT_AC_TAGVAR])])\nm4_ifndef([AC_LTDL_ENABLE_INSTALL],\t[AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])\nm4_ifndef([AC_LTDL_PREOPEN],\t\t[AC_DEFUN([AC_LTDL_PREOPEN])])\nm4_ifndef([_LT_AC_SYS_COMPILER],\t[AC_DEFUN([_LT_AC_SYS_COMPILER])])\nm4_ifndef([_LT_AC_LOCK],\t\t[AC_DEFUN([_LT_AC_LOCK])])\nm4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE],\t[AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])\nm4_ifndef([_LT_AC_TRY_DLOPEN_SELF],\t[AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])\nm4_ifndef([AC_LIBTOOL_PROG_CC_C_O],\t[AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])\nm4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])\nm4_ifndef([AC_LIBTOOL_OBJDIR],\t\t[AC_DEFUN([AC_LIBTOOL_OBJDIR])])\nm4_ifndef([AC_LTDL_OBJDIR],\t\t[AC_DEFUN([AC_LTDL_OBJDIR])])\nm4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])\nm4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP],\t[AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])\nm4_ifndef([AC_PATH_MAGIC],\t\t[AC_DEFUN([AC_PATH_MAGIC])])\nm4_ifndef([AC_PROG_LD_GNU],\t\t[AC_DEFUN([AC_PROG_LD_GNU])])\nm4_ifndef([AC_PROG_LD_RELOAD_FLAG],\t[AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])\nm4_ifndef([AC_DEPLIBS_CHECK_METHOD],\t[AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])\nm4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])\nm4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])\nm4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])\nm4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS],\t[AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])\nm4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP],\t[AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])\nm4_ifndef([LT_AC_PROG_EGREP],\t\t[AC_DEFUN([LT_AC_PROG_EGREP])])\nm4_ifndef([LT_AC_PROG_SED],\t\t[AC_DEFUN([LT_AC_PROG_SED])])\nm4_ifndef([_LT_CC_BASENAME],\t\t[AC_DEFUN([_LT_CC_BASENAME])])\nm4_ifndef([_LT_COMPILER_BOILERPLATE],\t[AC_DEFUN([_LT_COMPILER_BOILERPLATE])])\nm4_ifndef([_LT_LINKER_BOILERPLATE],\t[AC_DEFUN([_LT_LINKER_BOILERPLATE])])\nm4_ifndef([_AC_PROG_LIBTOOL],\t\t[AC_DEFUN([_AC_PROG_LIBTOOL])])\nm4_ifndef([AC_LIBTOOL_SETUP],\t\t[AC_DEFUN([AC_LIBTOOL_SETUP])])\nm4_ifndef([_LT_AC_CHECK_DLFCN],\t\t[AC_DEFUN([_LT_AC_CHECK_DLFCN])])\nm4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER],\t[AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])\nm4_ifndef([_LT_AC_TAGCONFIG],\t\t[AC_DEFUN([_LT_AC_TAGCONFIG])])\nm4_ifndef([AC_DISABLE_FAST_INSTALL],\t[AC_DEFUN([AC_DISABLE_FAST_INSTALL])])\nm4_ifndef([_LT_AC_LANG_CXX],\t\t[AC_DEFUN([_LT_AC_LANG_CXX])])\nm4_ifndef([_LT_AC_LANG_F77],\t\t[AC_DEFUN([_LT_AC_LANG_F77])])\nm4_ifndef([_LT_AC_LANG_GCJ],\t\t[AC_DEFUN([_LT_AC_LANG_GCJ])])\nm4_ifndef([AC_LIBTOOL_LANG_C_CONFIG],\t[AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])\nm4_ifndef([_LT_AC_LANG_C_CONFIG],\t[AC_DEFUN([_LT_AC_LANG_C_CONFIG])])\nm4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG],\t[AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])\nm4_ifndef([_LT_AC_LANG_CXX_CONFIG],\t[AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])\nm4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG],\t[AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])\nm4_ifndef([_LT_AC_LANG_F77_CONFIG],\t[AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])\nm4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG],\t[AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])\nm4_ifndef([_LT_AC_LANG_GCJ_CONFIG],\t[AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])\nm4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG],\t[AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])\nm4_ifndef([_LT_AC_LANG_RC_CONFIG],\t[AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])\nm4_ifndef([AC_LIBTOOL_CONFIG],\t\t[AC_DEFUN([AC_LIBTOOL_CONFIG])])\nm4_ifndef([_LT_AC_FILE_LTDLL_C],\t[AC_DEFUN([_LT_AC_FILE_LTDLL_C])])\nm4_ifndef([_LT_REQUIRED_DARWIN_CHECKS],\t[AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])])\nm4_ifndef([_LT_AC_PROG_CXXCPP],\t\t[AC_DEFUN([_LT_AC_PROG_CXXCPP])])\nm4_ifndef([_LT_PREPARE_SED_QUOTE_VARS],\t[AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])])\nm4_ifndef([_LT_PROG_ECHO_BACKSLASH],\t[AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])])\nm4_ifndef([_LT_PROG_F77],\t\t[AC_DEFUN([_LT_PROG_F77])])\nm4_ifndef([_LT_PROG_FC],\t\t[AC_DEFUN([_LT_PROG_FC])])\nm4_ifndef([_LT_PROG_CXX],\t\t[AC_DEFUN([_LT_PROG_CXX])])\n"
  },
  {
    "path": "libs/CoMISo/gmm/missing",
    "content": "#! /bin/sh\n# Common stub for a few missing GNU programs while installing.\n\nscriptversion=2012-01-06.13; # UTC\n\n# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,\n# 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.\n# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.\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 2, or (at your option)\n# 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 <http://www.gnu.org/licenses/>.\n\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\nif test $# -eq 0; then\n  echo 1>&2 \"Try \\`$0 --help' for more information\"\n  exit 1\nfi\n\nrun=:\nsed_output='s/.* --output[ =]\\([^ ]*\\).*/\\1/p'\nsed_minuso='s/.* -o \\([^ ]*\\).*/\\1/p'\n\n# In the cases where this matters, `missing' is being run in the\n# srcdir already.\nif test -f configure.ac; then\n  configure_ac=configure.ac\nelse\n  configure_ac=configure.in\nfi\n\nmsg=\"missing on your system\"\n\ncase $1 in\n--run)\n  # Try to run requested program, and just exit if it succeeds.\n  run=\n  shift\n  \"$@\" && exit 0\n  # Exit code 63 means version mismatch.  This often happens\n  # when the user try to use an ancient version of a tool on\n  # a file that requires a minimum version.  In this case we\n  # we should proceed has if the program had been absent, or\n  # if --run hadn't been passed.\n  if test $? = 63; then\n    run=:\n    msg=\"probably too old\"\n  fi\n  ;;\n\n  -h|--h|--he|--hel|--help)\n    echo \"\\\n$0 [OPTION]... PROGRAM [ARGUMENT]...\n\nHandle \\`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an\nerror status if there is no known handling for PROGRAM.\n\nOptions:\n  -h, --help      display this help and exit\n  -v, --version   output version information and exit\n  --run           try to run the given command, and emulate it if it fails\n\nSupported PROGRAM values:\n  aclocal      touch file \\`aclocal.m4'\n  autoconf     touch file \\`configure'\n  autoheader   touch file \\`config.h.in'\n  autom4te     touch the output file, or create a stub one\n  automake     touch all \\`Makefile.in' files\n  bison        create \\`y.tab.[ch]', if possible, from existing .[ch]\n  flex         create \\`lex.yy.c', if possible, from existing .c\n  help2man     touch the output file\n  lex          create \\`lex.yy.c', if possible, from existing .c\n  makeinfo     touch the output file\n  yacc         create \\`y.tab.[ch]', if possible, from existing .[ch]\n\nVersion suffixes to PROGRAM as well as the prefixes \\`gnu-', \\`gnu', and\n\\`g' are ignored when checking the name.\n\nSend bug reports to <bug-automake@gnu.org>.\"\n    exit $?\n    ;;\n\n  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)\n    echo \"missing $scriptversion (GNU Automake)\"\n    exit $?\n    ;;\n\n  -*)\n    echo 1>&2 \"$0: Unknown \\`$1' option\"\n    echo 1>&2 \"Try \\`$0 --help' for more information\"\n    exit 1\n    ;;\n\nesac\n\n# normalize program name to check for.\nprogram=`echo \"$1\" | sed '\n  s/^gnu-//; t\n  s/^gnu//; t\n  s/^g//; t'`\n\n# Now exit if we have it, but it failed.  Also exit now if we\n# don't have it and --version was passed (most likely to detect\n# the program).  This is about non-GNU programs, so use $1 not\n# $program.\ncase $1 in\n  lex*|yacc*)\n    # Not GNU programs, they don't have --version.\n    ;;\n\n  *)\n    if test -z \"$run\" && ($1 --version) > /dev/null 2>&1; then\n       # We have it, but it failed.\n       exit 1\n    elif test \"x$2\" = \"x--version\" || test \"x$2\" = \"x--help\"; then\n       # Could not run --version or --help.  This is probably someone\n       # running `$TOOL --version' or `$TOOL --help' to check whether\n       # $TOOL exists and not knowing $TOOL uses missing.\n       exit 1\n    fi\n    ;;\nesac\n\n# If it does not exist, or fails to run (possibly an outdated version),\n# try to emulate it.\ncase $program in\n  aclocal*)\n    echo 1>&2 \"\\\nWARNING: \\`$1' is $msg.  You should only need it if\n         you modified \\`acinclude.m4' or \\`${configure_ac}'.  You might want\n         to install the \\`Automake' and \\`Perl' packages.  Grab them from\n         any GNU archive site.\"\n    touch aclocal.m4\n    ;;\n\n  autoconf*)\n    echo 1>&2 \"\\\nWARNING: \\`$1' is $msg.  You should only need it if\n         you modified \\`${configure_ac}'.  You might want to install the\n         \\`Autoconf' and \\`GNU m4' packages.  Grab them from any GNU\n         archive site.\"\n    touch configure\n    ;;\n\n  autoheader*)\n    echo 1>&2 \"\\\nWARNING: \\`$1' is $msg.  You should only need it if\n         you modified \\`acconfig.h' or \\`${configure_ac}'.  You might want\n         to install the \\`Autoconf' and \\`GNU m4' packages.  Grab them\n         from any GNU archive site.\"\n    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\\([^)]*\\)).*/\\1/p' ${configure_ac}`\n    test -z \"$files\" && files=\"config.h\"\n    touch_files=\n    for f in $files; do\n      case $f in\n      *:*) touch_files=\"$touch_files \"`echo \"$f\" |\n\t\t\t\t       sed -e 's/^[^:]*://' -e 's/:.*//'`;;\n      *) touch_files=\"$touch_files $f.in\";;\n      esac\n    done\n    touch $touch_files\n    ;;\n\n  automake*)\n    echo 1>&2 \"\\\nWARNING: \\`$1' is $msg.  You should only need it if\n         you modified \\`Makefile.am', \\`acinclude.m4' or \\`${configure_ac}'.\n         You might want to install the \\`Automake' and \\`Perl' packages.\n         Grab them from any GNU archive site.\"\n    find . -type f -name Makefile.am -print |\n\t   sed 's/\\.am$/.in/' |\n\t   while read f; do touch \"$f\"; done\n    ;;\n\n  autom4te*)\n    echo 1>&2 \"\\\nWARNING: \\`$1' is needed, but is $msg.\n         You might have modified some files without having the\n         proper tools for further handling them.\n         You can get \\`$1' as part of \\`Autoconf' from any GNU\n         archive site.\"\n\n    file=`echo \"$*\" | sed -n \"$sed_output\"`\n    test -z \"$file\" && file=`echo \"$*\" | sed -n \"$sed_minuso\"`\n    if test -f \"$file\"; then\n\ttouch $file\n    else\n\ttest -z \"$file\" || exec >$file\n\techo \"#! /bin/sh\"\n\techo \"# Created by GNU Automake missing as a replacement of\"\n\techo \"#  $ $@\"\n\techo \"exit 0\"\n\tchmod +x $file\n\texit 1\n    fi\n    ;;\n\n  bison*|yacc*)\n    echo 1>&2 \"\\\nWARNING: \\`$1' $msg.  You should only need it if\n         you modified a \\`.y' file.  You may need the \\`Bison' package\n         in order for those modifications to take effect.  You can get\n         \\`Bison' from any GNU archive site.\"\n    rm -f y.tab.c y.tab.h\n    if test $# -ne 1; then\n        eval LASTARG=\\${$#}\n\tcase $LASTARG in\n\t*.y)\n\t    SRCFILE=`echo \"$LASTARG\" | sed 's/y$/c/'`\n\t    if test -f \"$SRCFILE\"; then\n\t         cp \"$SRCFILE\" y.tab.c\n\t    fi\n\t    SRCFILE=`echo \"$LASTARG\" | sed 's/y$/h/'`\n\t    if test -f \"$SRCFILE\"; then\n\t         cp \"$SRCFILE\" y.tab.h\n\t    fi\n\t  ;;\n\tesac\n    fi\n    if test ! -f y.tab.h; then\n\techo >y.tab.h\n    fi\n    if test ! -f y.tab.c; then\n\techo 'main() { return 0; }' >y.tab.c\n    fi\n    ;;\n\n  lex*|flex*)\n    echo 1>&2 \"\\\nWARNING: \\`$1' is $msg.  You should only need it if\n         you modified a \\`.l' file.  You may need the \\`Flex' package\n         in order for those modifications to take effect.  You can get\n         \\`Flex' from any GNU archive site.\"\n    rm -f lex.yy.c\n    if test $# -ne 1; then\n        eval LASTARG=\\${$#}\n\tcase $LASTARG in\n\t*.l)\n\t    SRCFILE=`echo \"$LASTARG\" | sed 's/l$/c/'`\n\t    if test -f \"$SRCFILE\"; then\n\t         cp \"$SRCFILE\" lex.yy.c\n\t    fi\n\t  ;;\n\tesac\n    fi\n    if test ! -f lex.yy.c; then\n\techo 'main() { return 0; }' >lex.yy.c\n    fi\n    ;;\n\n  help2man*)\n    echo 1>&2 \"\\\nWARNING: \\`$1' is $msg.  You should only need it if\n\t you modified a dependency of a manual page.  You may need the\n\t \\`Help2man' package in order for those modifications to take\n\t effect.  You can get \\`Help2man' from any GNU archive site.\"\n\n    file=`echo \"$*\" | sed -n \"$sed_output\"`\n    test -z \"$file\" && file=`echo \"$*\" | sed -n \"$sed_minuso\"`\n    if test -f \"$file\"; then\n\ttouch $file\n    else\n\ttest -z \"$file\" || exec >$file\n\techo \".ab help2man is required to generate this page\"\n\texit $?\n    fi\n    ;;\n\n  makeinfo*)\n    echo 1>&2 \"\\\nWARNING: \\`$1' is $msg.  You should only need it if\n         you modified a \\`.texi' or \\`.texinfo' file, or any other file\n         indirectly affecting the aspect of the manual.  The spurious\n         call might also be the consequence of using a buggy \\`make' (AIX,\n         DU, IRIX).  You might want to install the \\`Texinfo' package or\n         the \\`GNU make' package.  Grab either from any GNU archive site.\"\n    # The file to touch is that specified with -o ...\n    file=`echo \"$*\" | sed -n \"$sed_output\"`\n    test -z \"$file\" && file=`echo \"$*\" | sed -n \"$sed_minuso\"`\n    if test -z \"$file\"; then\n      # ... or it is the one specified with @setfilename ...\n      infile=`echo \"$*\" | sed 's/.* \\([^ ]*\\) *$/\\1/'`\n      file=`sed -n '\n\t/^@setfilename/{\n\t  s/.* \\([^ ]*\\) *$/\\1/\n\t  p\n\t  q\n\t}' $infile`\n      # ... or it is derived from the source name (dir/f.texi becomes f.info)\n      test -z \"$file\" && file=`echo \"$infile\" | sed 's,.*/,,;s,.[^.]*$,,'`.info\n    fi\n    # If the file does not exist, the user really needs makeinfo;\n    # let's fail without touching anything.\n    test -f $file || exit 1\n    touch $file\n    ;;\n\n  *)\n    echo 1>&2 \"\\\nWARNING: \\`$1' is needed, and is $msg.\n         You might have modified some files without having the\n         proper tools for further handling them.  Check the \\`README' file,\n         it often tells you about the needed prerequisites for installing\n         this package.  You may also peek at any GNU archive site, in case\n         some other package would contain this missing \\`$1' program.\"\n    exit 1\n    ;;\nesac\n\nexit 0\n\n# Local variables:\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"scriptversion=\"\n# time-stamp-format: \"%:y-%02m-%02d.%02H\"\n# time-stamp-time-zone: \"UTC\"\n# time-stamp-end: \"; # UTC\"\n# End:\n"
  },
  {
    "path": "libs/CoMISo/gmm/tests/Makefile.am",
    "content": "\ncheck_PROGRAMS = dummy \n\ndummy_SOURCES = dummy.cc \n\nINCLUDES = -I$(top_srcdir)/include -I../include\n\nLDADD    = -lm @SUPLDFLAGS@\n\nTESTS = $(top_srcdir)/tests/make_gmm_test.pl\n\nEXTRA_DIST=\\\n          make_gmm_test.pl\\\n          gmm_torture01_lusolve.cc\\\n          gmm_torture02_baseop.cc\\\n          gmm_torture05_mult.cc\\\n          gmm_torture06_mat_mult.cc\\\n          gmm_torture10_qr.cc\\\n          gmm_torture15_sub.cc\\\n          gmm_torture20_iterative_solvers.cc\n\n\nCLEANFILES = toto.mat ii_files/* auto_gmm* \n\nTESTS_ENVIRONMENT = perl\n\n"
  },
  {
    "path": "libs/CoMISo/gmm/tests/Makefile.in",
    "content": "# Makefile.in generated by automake 1.11.3 from Makefile.am.\n# @configure_input@\n\n# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,\n# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software\n# Foundation, Inc.\n# This Makefile.in is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY, to the extent permitted by law; without\n# even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n# PARTICULAR PURPOSE.\n\n@SET_MAKE@\nVPATH = @srcdir@\npkgdatadir = $(datadir)/@PACKAGE@\npkgincludedir = $(includedir)/@PACKAGE@\npkglibdir = $(libdir)/@PACKAGE@\npkglibexecdir = $(libexecdir)/@PACKAGE@\nam__cd = CDPATH=\"$${ZSH_VERSION+.}$(PATH_SEPARATOR)\" && cd\ninstall_sh_DATA = $(install_sh) -c -m 644\ninstall_sh_PROGRAM = $(install_sh) -c\ninstall_sh_SCRIPT = $(install_sh) -c\nINSTALL_HEADER = $(INSTALL_DATA)\ntransform = $(program_transform_name)\nNORMAL_INSTALL = :\nPRE_INSTALL = :\nPOST_INSTALL = :\nNORMAL_UNINSTALL = :\nPRE_UNINSTALL = :\nPOST_UNINSTALL = :\nbuild_triplet = @build@\nhost_triplet = @host@\ncheck_PROGRAMS = dummy$(EXEEXT)\nsubdir = tests\nDIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in\nACLOCAL_M4 = $(top_srcdir)/aclocal.m4\nam__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \\\n\t$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \\\n\t$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \\\n\t$(top_srcdir)/configure.in\nam__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \\\n\t$(ACLOCAL_M4)\nmkinstalldirs = $(install_sh) -d\nCONFIG_HEADER = $(top_builddir)/config.h\nCONFIG_CLEAN_FILES =\nCONFIG_CLEAN_VPATH_FILES =\nam_dummy_OBJECTS = dummy.$(OBJEXT)\ndummy_OBJECTS = $(am_dummy_OBJECTS)\ndummy_LDADD = $(LDADD)\ndummy_DEPENDENCIES =\nDEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)\ndepcomp = $(SHELL) $(top_srcdir)/depcomp\nam__depfiles_maybe = depfiles\nam__mv = mv -f\nCXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \\\n\t$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)\nLTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \\\n\t--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \\\n\t$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)\nCXXLD = $(CXX)\nCXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \\\n\t--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \\\n\t$(LDFLAGS) -o $@\nSOURCES = $(dummy_SOURCES)\nDIST_SOURCES = $(dummy_SOURCES)\nETAGS = etags\nCTAGS = ctags\nam__tty_colors = \\\nred=; grn=; lgn=; blu=; std=\nDISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)\nACLOCAL = @ACLOCAL@\nAMTAR = @AMTAR@\nAR = @AR@\nAUTOCONF = @AUTOCONF@\nAUTOHEADER = @AUTOHEADER@\nAUTOMAKE = @AUTOMAKE@\nAWK = @AWK@\nBUILDDATE = @BUILDDATE@\nBUILDER = @BUILDER@\nCC = @CC@\nCCDEPMODE = @CCDEPMODE@\nCFLAGS = @CFLAGS@\nCONFIGURE_ARGS = @CONFIGURE_ARGS@\nCPP = @CPP@\nCPPFLAGS = @CPPFLAGS@\nCXX = @CXX@\nCXXCPP = @CXXCPP@\nCXXDEPMODE = @CXXDEPMODE@\nCXXFLAGS = @CXXFLAGS@\nCYGPATH_W = @CYGPATH_W@\nDEFS = @DEFS@\nDEPDIR = @DEPDIR@\nDLLTOOL = @DLLTOOL@\nDSYMUTIL = @DSYMUTIL@\nDUMPBIN = @DUMPBIN@\nECHO_C = @ECHO_C@\nECHO_N = @ECHO_N@\nECHO_T = @ECHO_T@\nEGREP = @EGREP@\nEXEEXT = @EXEEXT@\nFGREP = @FGREP@\nGREP = @GREP@\nINSTALL = @INSTALL@\nINSTALL_DATA = @INSTALL_DATA@\nINSTALL_PROGRAM = @INSTALL_PROGRAM@\nINSTALL_SCRIPT = @INSTALL_SCRIPT@\nINSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@\nLD = @LD@\nLDFLAGS = @LDFLAGS@\nLIBOBJS = @LIBOBJS@\nLIBS = @LIBS@\nLIBTOOL = @LIBTOOL@\nLIBTOOL_DEPS = @LIBTOOL_DEPS@\nLIBTOOL_VERSION_INFO = @LIBTOOL_VERSION_INFO@\nLIPO = @LIPO@\nLN_S = @LN_S@\nLTLIBOBJS = @LTLIBOBJS@\nMAKEINFO = @MAKEINFO@\nMANIFEST_TOOL = @MANIFEST_TOOL@\nMKDIR_P = @MKDIR_P@\nNM = @NM@\nNMEDIT = @NMEDIT@\nOBJDUMP = @OBJDUMP@\nOBJEXT = @OBJEXT@\nOTOOL = @OTOOL@\nOTOOL64 = @OTOOL64@\nPACKAGE = @PACKAGE@\nPACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@\nPACKAGE_NAME = @PACKAGE_NAME@\nPACKAGE_STRING = @PACKAGE_STRING@\nPACKAGE_TARNAME = @PACKAGE_TARNAME@\nPACKAGE_URL = @PACKAGE_URL@\nPACKAGE_VERSION = @PACKAGE_VERSION@\nPATH_SEPARATOR = @PATH_SEPARATOR@\nRANLIB = @RANLIB@\nSED = @SED@\nSET_MAKE = @SET_MAKE@\nSHELL = @SHELL@\nSTRIP = @STRIP@\nSUPLDFLAGS = @SUPLDFLAGS@\nVERSION = @VERSION@\nabs_builddir = @abs_builddir@\nabs_srcdir = @abs_srcdir@\nabs_top_builddir = @abs_top_builddir@\nabs_top_srcdir = @abs_top_srcdir@\nac_ct_AR = @ac_ct_AR@\nac_ct_CC = @ac_ct_CC@\nac_ct_CXX = @ac_ct_CXX@\nac_ct_DUMPBIN = @ac_ct_DUMPBIN@\nam__include = @am__include@\nam__leading_dot = @am__leading_dot@\nam__quote = @am__quote@\nam__tar = @am__tar@\nam__untar = @am__untar@\nbindir = @bindir@\nbuild = @build@\nbuild_alias = @build_alias@\nbuild_cpu = @build_cpu@\nbuild_os = @build_os@\nbuild_vendor = @build_vendor@\nbuilddir = @builddir@\ndatadir = @datadir@\ndatarootdir = @datarootdir@\ndocdir = @docdir@\ndvidir = @dvidir@\nexec_prefix = @exec_prefix@\nhost = @host@\nhost_alias = @host_alias@\nhost_cpu = @host_cpu@\nhost_os = @host_os@\nhost_vendor = @host_vendor@\nhtmldir = @htmldir@\nincludedir = @includedir@\ninfodir = @infodir@\ninstall_sh = @install_sh@\nlibdir = @libdir@\nlibexecdir = @libexecdir@\nlocaledir = @localedir@\nlocalstatedir = @localstatedir@\nmandir = @mandir@\nmkdir_p = @mkdir_p@\noldincludedir = @oldincludedir@\npdfdir = @pdfdir@\nprefix = @prefix@\nprogram_transform_name = @program_transform_name@\npsdir = @psdir@\nsbindir = @sbindir@\nsharedstatedir = @sharedstatedir@\nsrcdir = @srcdir@\nsysconfdir = @sysconfdir@\ntarget_alias = @target_alias@\ntop_build_prefix = @top_build_prefix@\ntop_builddir = @top_builddir@\ntop_srcdir = @top_srcdir@\ndummy_SOURCES = dummy.cc \nINCLUDES = -I$(top_srcdir)/include -I../include\nLDADD = -lm @SUPLDFLAGS@\nTESTS = $(top_srcdir)/tests/make_gmm_test.pl\nEXTRA_DIST = \\\n          make_gmm_test.pl\\\n          gmm_torture01_lusolve.cc\\\n          gmm_torture02_baseop.cc\\\n          gmm_torture05_mult.cc\\\n          gmm_torture06_mat_mult.cc\\\n          gmm_torture10_qr.cc\\\n          gmm_torture15_sub.cc\\\n          gmm_torture20_iterative_solvers.cc\n\nCLEANFILES = toto.mat ii_files/* auto_gmm* \nTESTS_ENVIRONMENT = perl\nall: all-am\n\n.SUFFIXES:\n.SUFFIXES: .cc .lo .o .obj\n$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)\n\t@for dep in $?; do \\\n\t  case '$(am__configure_deps)' in \\\n\t    *$$dep*) \\\n\t      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \\\n\t        && { if test -f $@; then exit 0; else break; fi; }; \\\n\t      exit 1;; \\\n\t  esac; \\\n\tdone; \\\n\techo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/Makefile'; \\\n\t$(am__cd) $(top_srcdir) && \\\n\t  $(AUTOMAKE) --gnu tests/Makefile\n.PRECIOUS: Makefile\nMakefile: $(srcdir)/Makefile.in $(top_builddir)/config.status\n\t@case '$?' in \\\n\t  *config.status*) \\\n\t    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \\\n\t  *) \\\n\t    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \\\n\t    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \\\n\tesac;\n\n$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n\n$(top_srcdir)/configure:  $(am__configure_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(ACLOCAL_M4):  $(am__aclocal_m4_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(am__aclocal_m4_deps):\n\nclean-checkPROGRAMS:\n\t@list='$(check_PROGRAMS)'; test -n \"$$list\" || exit 0; \\\n\techo \" rm -f\" $$list; \\\n\trm -f $$list || exit $$?; \\\n\ttest -n \"$(EXEEXT)\" || exit 0; \\\n\tlist=`for p in $$list; do echo \"$$p\"; done | sed 's/$(EXEEXT)$$//'`; \\\n\techo \" rm -f\" $$list; \\\n\trm -f $$list\ndummy$(EXEEXT): $(dummy_OBJECTS) $(dummy_DEPENDENCIES) $(EXTRA_dummy_DEPENDENCIES) \n\t@rm -f dummy$(EXEEXT)\n\t$(CXXLINK) $(dummy_OBJECTS) $(dummy_LDADD) $(LIBS)\n\nmostlyclean-compile:\n\t-rm -f *.$(OBJEXT)\n\ndistclean-compile:\n\t-rm -f *.tab.c\n\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dummy.Po@am__quote@\n\n.cc.o:\n@am__fastdepCXX_TRUE@\t$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXXCOMPILE) -c -o $@ $<\n\n.cc.obj:\n@am__fastdepCXX_TRUE@\t$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`\n\n.cc.lo:\n@am__fastdepCXX_TRUE@\t$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='$<' object='$@' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(LTCXXCOMPILE) -c -o $@ $<\n\nmostlyclean-libtool:\n\t-rm -f *.lo\n\nclean-libtool:\n\t-rm -rf .libs _libs\n\nID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)\n\tlist='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \\\n\tunique=`for i in $$list; do \\\n\t    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n\t  done | \\\n\t  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \\\n\t      END { if (nonempty) { for (i in files) print i; }; }'`; \\\n\tmkid -fID $$unique\ntags: TAGS\n\nTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \\\n\t\t$(TAGS_FILES) $(LISP)\n\tset x; \\\n\there=`pwd`; \\\n\tlist='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \\\n\tunique=`for i in $$list; do \\\n\t    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n\t  done | \\\n\t  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \\\n\t      END { if (nonempty) { for (i in files) print i; }; }'`; \\\n\tshift; \\\n\tif test -z \"$(ETAGS_ARGS)$$*$$unique\"; then :; else \\\n\t  test -n \"$$unique\" || unique=$$empty_fix; \\\n\t  if test $$# -gt 0; then \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      \"$$@\" $$unique; \\\n\t  else \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      $$unique; \\\n\t  fi; \\\n\tfi\nctags: CTAGS\nCTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \\\n\t\t$(TAGS_FILES) $(LISP)\n\tlist='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \\\n\tunique=`for i in $$list; do \\\n\t    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n\t  done | \\\n\t  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \\\n\t      END { if (nonempty) { for (i in files) print i; }; }'`; \\\n\ttest -z \"$(CTAGS_ARGS)$$unique\" \\\n\t  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \\\n\t     $$unique\n\nGTAGS:\n\there=`$(am__cd) $(top_builddir) && pwd` \\\n\t  && $(am__cd) $(top_srcdir) \\\n\t  && gtags -i $(GTAGS_ARGS) \"$$here\"\n\ndistclean-tags:\n\t-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags\n\ncheck-TESTS: $(TESTS)\n\t@failed=0; all=0; xfail=0; xpass=0; skip=0; \\\n\tsrcdir=$(srcdir); export srcdir; \\\n\tlist=' $(TESTS) '; \\\n\t$(am__tty_colors); \\\n\tif test -n \"$$list\"; then \\\n\t  for tst in $$list; do \\\n\t    if test -f ./$$tst; then dir=./; \\\n\t    elif test -f $$tst; then dir=; \\\n\t    else dir=\"$(srcdir)/\"; fi; \\\n\t    if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \\\n\t      all=`expr $$all + 1`; \\\n\t      case \" $(XFAIL_TESTS) \" in \\\n\t      *[\\ \\\t]$$tst[\\ \\\t]*) \\\n\t\txpass=`expr $$xpass + 1`; \\\n\t\tfailed=`expr $$failed + 1`; \\\n\t\tcol=$$red; res=XPASS; \\\n\t      ;; \\\n\t      *) \\\n\t\tcol=$$grn; res=PASS; \\\n\t      ;; \\\n\t      esac; \\\n\t    elif test $$? -ne 77; then \\\n\t      all=`expr $$all + 1`; \\\n\t      case \" $(XFAIL_TESTS) \" in \\\n\t      *[\\ \\\t]$$tst[\\ \\\t]*) \\\n\t\txfail=`expr $$xfail + 1`; \\\n\t\tcol=$$lgn; res=XFAIL; \\\n\t      ;; \\\n\t      *) \\\n\t\tfailed=`expr $$failed + 1`; \\\n\t\tcol=$$red; res=FAIL; \\\n\t      ;; \\\n\t      esac; \\\n\t    else \\\n\t      skip=`expr $$skip + 1`; \\\n\t      col=$$blu; res=SKIP; \\\n\t    fi; \\\n\t    echo \"$${col}$$res$${std}: $$tst\"; \\\n\t  done; \\\n\t  if test \"$$all\" -eq 1; then \\\n\t    tests=\"test\"; \\\n\t    All=\"\"; \\\n\t  else \\\n\t    tests=\"tests\"; \\\n\t    All=\"All \"; \\\n\t  fi; \\\n\t  if test \"$$failed\" -eq 0; then \\\n\t    if test \"$$xfail\" -eq 0; then \\\n\t      banner=\"$$All$$all $$tests passed\"; \\\n\t    else \\\n\t      if test \"$$xfail\" -eq 1; then failures=failure; else failures=failures; fi; \\\n\t      banner=\"$$All$$all $$tests behaved as expected ($$xfail expected $$failures)\"; \\\n\t    fi; \\\n\t  else \\\n\t    if test \"$$xpass\" -eq 0; then \\\n\t      banner=\"$$failed of $$all $$tests failed\"; \\\n\t    else \\\n\t      if test \"$$xpass\" -eq 1; then passes=pass; else passes=passes; fi; \\\n\t      banner=\"$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)\"; \\\n\t    fi; \\\n\t  fi; \\\n\t  dashes=\"$$banner\"; \\\n\t  skipped=\"\"; \\\n\t  if test \"$$skip\" -ne 0; then \\\n\t    if test \"$$skip\" -eq 1; then \\\n\t      skipped=\"($$skip test was not run)\"; \\\n\t    else \\\n\t      skipped=\"($$skip tests were not run)\"; \\\n\t    fi; \\\n\t    test `echo \"$$skipped\" | wc -c` -le `echo \"$$banner\" | wc -c` || \\\n\t      dashes=\"$$skipped\"; \\\n\t  fi; \\\n\t  report=\"\"; \\\n\t  if test \"$$failed\" -ne 0 && test -n \"$(PACKAGE_BUGREPORT)\"; then \\\n\t    report=\"Please report to $(PACKAGE_BUGREPORT)\"; \\\n\t    test `echo \"$$report\" | wc -c` -le `echo \"$$banner\" | wc -c` || \\\n\t      dashes=\"$$report\"; \\\n\t  fi; \\\n\t  dashes=`echo \"$$dashes\" | sed s/./=/g`; \\\n\t  if test \"$$failed\" -eq 0; then \\\n\t    col=\"$$grn\"; \\\n\t  else \\\n\t    col=\"$$red\"; \\\n\t  fi; \\\n\t  echo \"$${col}$$dashes$${std}\"; \\\n\t  echo \"$${col}$$banner$${std}\"; \\\n\t  test -z \"$$skipped\" || echo \"$${col}$$skipped$${std}\"; \\\n\t  test -z \"$$report\" || echo \"$${col}$$report$${std}\"; \\\n\t  echo \"$${col}$$dashes$${std}\"; \\\n\t  test \"$$failed\" -eq 0; \\\n\telse :; fi\n\ndistdir: $(DISTFILES)\n\t@srcdirstrip=`echo \"$(srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\ttopsrcdirstrip=`echo \"$(top_srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\tlist='$(DISTFILES)'; \\\n\t  dist_files=`for file in $$list; do echo $$file; done | \\\n\t  sed -e \"s|^$$srcdirstrip/||;t\" \\\n\t      -e \"s|^$$topsrcdirstrip/|$(top_builddir)/|;t\"`; \\\n\tcase $$dist_files in \\\n\t  */*) $(MKDIR_P) `echo \"$$dist_files\" | \\\n\t\t\t   sed '/\\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \\\n\t\t\t   sort -u` ;; \\\n\tesac; \\\n\tfor file in $$dist_files; do \\\n\t  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \\\n\t  if test -d $$d/$$file; then \\\n\t    dir=`echo \"/$$file\" | sed -e 's,/[^/]*$$,,'`; \\\n\t    if test -d \"$(distdir)/$$file\"; then \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \\\n\t      cp -fpR $(srcdir)/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    cp -fpR $$d/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t  else \\\n\t    test -f \"$(distdir)/$$file\" \\\n\t    || cp -p $$d/$$file \"$(distdir)/$$file\" \\\n\t    || exit 1; \\\n\t  fi; \\\n\tdone\ncheck-am: all-am\n\t$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)\n\t$(MAKE) $(AM_MAKEFLAGS) check-TESTS\ncheck: check-am\nall-am: Makefile\ninstalldirs:\ninstall: install-am\ninstall-exec: install-exec-am\ninstall-data: install-data-am\nuninstall: uninstall-am\n\ninstall-am: all-am\n\t@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am\n\ninstallcheck: installcheck-am\ninstall-strip:\n\tif test -z '$(STRIP)'; then \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t      install; \\\n\telse \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t    \"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'\" install; \\\n\tfi\nmostlyclean-generic:\n\nclean-generic:\n\t-test -z \"$(CLEANFILES)\" || rm -f $(CLEANFILES)\n\ndistclean-generic:\n\t-test -z \"$(CONFIG_CLEAN_FILES)\" || rm -f $(CONFIG_CLEAN_FILES)\n\t-test . = \"$(srcdir)\" || test -z \"$(CONFIG_CLEAN_VPATH_FILES)\" || rm -f $(CONFIG_CLEAN_VPATH_FILES)\n\nmaintainer-clean-generic:\n\t@echo \"This command is intended for maintainers to use\"\n\t@echo \"it deletes files that may require special tools to rebuild.\"\nclean: clean-am\n\nclean-am: clean-checkPROGRAMS clean-generic clean-libtool \\\n\tmostlyclean-am\n\ndistclean: distclean-am\n\t-rm -rf ./$(DEPDIR)\n\t-rm -f Makefile\ndistclean-am: clean-am distclean-compile distclean-generic \\\n\tdistclean-tags\n\ndvi: dvi-am\n\ndvi-am:\n\nhtml: html-am\n\nhtml-am:\n\ninfo: info-am\n\ninfo-am:\n\ninstall-data-am:\n\ninstall-dvi: install-dvi-am\n\ninstall-dvi-am:\n\ninstall-exec-am:\n\ninstall-html: install-html-am\n\ninstall-html-am:\n\ninstall-info: install-info-am\n\ninstall-info-am:\n\ninstall-man:\n\ninstall-pdf: install-pdf-am\n\ninstall-pdf-am:\n\ninstall-ps: install-ps-am\n\ninstall-ps-am:\n\ninstallcheck-am:\n\nmaintainer-clean: maintainer-clean-am\n\t-rm -rf ./$(DEPDIR)\n\t-rm -f Makefile\nmaintainer-clean-am: distclean-am maintainer-clean-generic\n\nmostlyclean: mostlyclean-am\n\nmostlyclean-am: mostlyclean-compile mostlyclean-generic \\\n\tmostlyclean-libtool\n\npdf: pdf-am\n\npdf-am:\n\nps: ps-am\n\nps-am:\n\nuninstall-am:\n\n.MAKE: check-am install-am install-strip\n\n.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \\\n\tclean-checkPROGRAMS clean-generic clean-libtool ctags \\\n\tdistclean distclean-compile distclean-generic \\\n\tdistclean-libtool distclean-tags distdir dvi dvi-am html \\\n\thtml-am info info-am install install-am install-data \\\n\tinstall-data-am install-dvi install-dvi-am install-exec \\\n\tinstall-exec-am install-html install-html-am install-info \\\n\tinstall-info-am install-man install-pdf install-pdf-am \\\n\tinstall-ps install-ps-am install-strip installcheck \\\n\tinstallcheck-am installdirs maintainer-clean \\\n\tmaintainer-clean-generic mostlyclean mostlyclean-compile \\\n\tmostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \\\n\ttags uninstall uninstall-am\n\n\n# Tell versions [3.59,3.63) of GNU make to not export all variables.\n# Otherwise a system limit (for SysV at least) may be exceeded.\n.NOEXPORT:\n"
  },
  {
    "path": "libs/CoMISo/gmm/tests/dummy.cc",
    "content": "#include <iostream>\n\nint main(void) { return 0; }\n"
  },
  {
    "path": "libs/CoMISo/gmm/tests/gmm_torture01_lusolve.cc",
    "content": "/*===========================================================================\n \n Copyright (C) 2007-2012 Yves Renard, Julien Pommier.\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n===========================================================================*/\n// SQUARED_MATRIX_PARAM;\n// DENSE_VECTOR_PARAM;\n// VECTOR_PARAM;\n// ENDPARAM;\n\n#include \"gmm/gmm_kernel.h\"\n#include \"gmm/gmm_dense_lu.h\"\n#include \"gmm/gmm_condition_number.h\"\n\nusing std::endl; using std::cout; using std::cerr;\nusing std::ends; using std::cin;\nusing gmm::size_type;\nbool print_debug = false;\n\ntemplate <typename MAT1, typename VECT1, typename VECT2>\nbool test_procedure(const MAT1 &m1_, const VECT1 &v1_, const VECT2 &v2_) {\n  VECT1 &v1 = const_cast<VECT1 &>(v1_);\n  VECT2 &v2 = const_cast<VECT2 &>(v2_);\n  MAT1  &m1 = const_cast<MAT1  &>(m1_);\n  typedef typename gmm::linalg_traits<MAT1>::value_type T;\n  typedef typename gmm::number_traits<T>::magnitude_type R;\n  R prec = gmm::default_tol(R());\n  static size_type nb_iter = 0;\n\n  size_type m = gmm::mat_nrows(m1);\n  std::vector<T> v3(m);\n\n  R det = gmm::abs(gmm::lu_det(m1)), error;\n  R cond = gmm::condition_number(m1);\n\n  if (print_debug) cout << \"cond = \" << cond << \" det = \" << det << endl;\n  GMM_ASSERT1(det != R(0) || cond >= R(0.01) / prec || cond == R(0),\n\t      \"Inconsistent condition number: \" << cond);\n\n  if (prec * cond < R(1)/R(10000) && det != R(0)) {\n    ++nb_iter;\n\n    gmm::lu_solve(m1, v1, v2);\n    gmm::mult(m1, v1, gmm::scaled(v2, T(-1)), v3);\n\n    error = gmm::vect_norm2(v3);\n    GMM_ASSERT1(error <= prec * cond * R(20000), \"Error too large: \" << error);\n\n    gmm::lu_inverse(m1);\n    gmm::mult(m1, v2, v1);\n    gmm::lu_inverse(m1);\n    gmm::mult(m1, v1, gmm::scaled(v2, T(-1)), v3);\n    \n    error = gmm::vect_norm2(v3);\n    GMM_ASSERT1(error <= prec * cond * R(20000), \"Error too large: \" << error);\n\n    if (nb_iter == 100) return true;\n  }\n  return false;\n}\n"
  },
  {
    "path": "libs/CoMISo/gmm/tests/gmm_torture02_baseop.cc",
    "content": "/*===========================================================================\n \n Copyright (C) 2007-2012 Yves Renard, Julien Pommier.\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n===========================================================================*/\n// SQUARED_MATRIX_PARAM;\n// VECTOR_PARAM;\n// ENDPARAM;\n\n#include \"gmm/gmm_kernel.h\"\n\nusing std::endl; using std::cout; using std::cerr;\nusing std::ends; using std::cin;\nusing gmm::size_type;\nbool print_debug = false;\n\ntemplate <typename MAT1, typename VECT1>\nbool test_procedure(const MAT1 &m1_, const VECT1 &v1_) {\n  VECT1 &v1 = const_cast<VECT1 &>(v1_);\n  MAT1  &m1 = const_cast<MAT1  &>(m1_);\n  typedef typename gmm::linalg_traits<MAT1>::value_type T;\n  typedef typename gmm::number_traits<T>::magnitude_type R;\n  R prec = gmm::default_tol(R());\n\n  size_type m = gmm::mat_nrows(m1);\n\n  R norm = gmm::vect_norm2_sqr(v1);\n\n  R normtest(0);\n\n  for (size_type i = 0; i < m; ++i) {\n    T x(1), y = v1[i];;\n    x *= v1[i];\n    x += v1[i];\n    x += v1[i];\n    x -= v1[i];\n    x -= y;\n    x *= v1[i];\n    x /= v1[i];\n    GMM_ASSERT1(y == v1[i], \"Error in basic operations\");\n    normtest += gmm::abs_sqr(x);\n  }\n  \n  GMM_ASSERT1(gmm::abs(norm - normtest) <= prec * R(100),\n\t      \"Error in basic operations\");\n  \n  return true;\n}\n"
  },
  {
    "path": "libs/CoMISo/gmm/tests/gmm_torture05_mult.cc",
    "content": "/*===========================================================================\n \n Copyright (C) 2007-2012 Yves Renard, Julien Pommier.\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n===========================================================================*/\n// SQUARED_MATRIX_PARAM\n// VECTOR_PARAM;\n// VECTOR_PARAM;\n// RECTANGULAR_MATRIX_PARAM;\n// VECTOR_PARAM;\n// VECTOR_PARAM;\n// ENDPARAM;\n\n#include \"gmm/gmm_kernel.h\"\n#include \"gmm/gmm_dense_lu.h\"\n#include \"gmm/gmm_dense_qr.h\"\n#include \"gmm/gmm_condition_number.h\"\n\nusing std::endl; using std::cout; using std::cerr;\nusing std::ends; using std::cin;\nusing gmm::size_type;\n\ntemplate <typename MAT1 , typename MAT2, typename VECT1, typename VECT2,\n\t  typename VECT3, typename VECT4>\nvoid test_procedure2(const MAT1 &m1_, const VECT1 &v1_, const VECT2 &v2_, \n\t\t    const MAT2 &m2_, const VECT3 &v3_, const VECT4 &v4_) {\n  VECT1 &v1 = const_cast<VECT1 &>(v1_);\n  VECT2 &v2 = const_cast<VECT2 &>(v2_);\n  VECT3 &v3 = const_cast<VECT3 &>(v3_);\n  VECT4 &v4 = const_cast<VECT4 &>(v4_);\n  MAT1  &m1 = const_cast<MAT1  &>(m1_);\n  MAT2  &m2 = const_cast<MAT2  &>(m2_);\n  typedef typename gmm::linalg_traits<MAT1>::value_type T;\n  typedef typename gmm::number_traits<T>::magnitude_type R;\n  R prec = gmm::default_tol(R());\n\n  size_type m = gmm::vect_size(v1), n = gmm::vect_size(v3);\n  size_type nn = std::min(m,n), mm = std::max(m, n);\n  std::vector<T> v6(m);\n\n  R det = gmm::abs(gmm::lu_det(m1)), error;\n  R cond = gmm::condition_number(m1);\n\n  if (prec * cond < R(1)/R(10000) && det != R(0)) {\n\n    gmm::lu_solve(m1, v6, v2);\n    gmm::mult(m1, v6, v1);\n    gmm::add(gmm::scaled(v1, T(-1)), v2, v6);\n    if (!((error = gmm::vect_norm2(v6)) <= prec * cond * R(10000)))\n      GMM_ASSERT1(false, \"Error too large: \"<< error);\n    \n    gmm::lu_solve(gmm::transposed(m1), v6, v2);\n    gmm::mult(gmm::transposed(m1), v6, v1);\n    gmm::add(gmm::scaled(v1, T(-1)), v2, v6);\n    if (!((error = gmm::vect_norm2(v6)) <= prec * cond * R(10000)))\n      GMM_ASSERT1(false, \"Error too large: \"<< error);\n    \n    gmm::lu_solve(gmm::conjugated(m1), v6, v2);\n    gmm::mult(gmm::conjugated(m1), v6, v1);\n    gmm::add(gmm::scaled(v1, T(-1)), v2, v6);\n    if (!((error = gmm::vect_norm2(v6)) <= prec * cond * R(10000)))\n      GMM_ASSERT1(false, \"Error too large: \"<< error);\n    \n    gmm::lu_solve(gmm::transposed(gmm::conjugated(m1)), v6, v2);\n    gmm::mult(gmm::transposed(gmm::conjugated(m1)), v6, v1);\n    gmm::add(gmm::scaled(v1, T(-1)), v2, v6);\n    if (!((error = gmm::vect_norm2(v6)) <= prec * cond * R(10000)))\n      GMM_ASSERT1(false, \"Error too large: \"<< error);\n    \n    gmm::lu_solve(gmm::transposed(gmm::scaled(m1, T(-6))), v6, v2);\n    gmm::mult(gmm::transposed(gmm::scaled(m1, T(-6))), v6, v1);\n    gmm::add(gmm::scaled(v1, T(-1)), v2, v6);\n    if (!((error = gmm::vect_norm2(v6)) <= prec * cond * R(10000)))\n      GMM_ASSERT1(false, \"Error too large: \"<< error);\n\n  }\n\n  gmm::dense_matrix<T> q(mm, nn), r(nn, nn);\n  if (m >= n) {\n    std::vector<T> v5(m);\n    gmm::mult(m2, v3, v2);\n    gmm::qr_factor(m2, q, r);\n    gmm::mult(r, v3, v4);\n    gmm::mult(q, v4, gmm::scaled(v2, T(-1)), v5);\n    if (!((error = gmm::vect_norm2(v5)) <= prec * R(10000)))\n      GMM_ASSERT1(false, \"Error too large: \"<< error);\n\n  }\n  else {\n    std::vector<T> v5(n);\n    gmm::mult(gmm::conjugated(m2), v2, v3);\n    gmm::qr_factor(gmm::conjugated(m2), q, r);\n    gmm::mult(r, v2, v1);\n    gmm::mult(q, v1, gmm::scaled(v3, T(-1)), v5);\n    if (!((error = gmm::vect_norm2(v5)) <= prec * R(10000)))\n      GMM_ASSERT1(false, \"Error too large: \"<< error);\n\n  }\n  \n}\n\ntemplate<typename MAT> void test_mat_swap(MAT &, gmm::linalg_modifiable) {}\ntemplate<typename MAT> void test_mat_swap(MAT &, gmm::linalg_const) {}\ntemplate<typename MAT> void test_mat_swap(MAT &M, gmm::linalg_false) {\n  typedef typename gmm::linalg_traits<MAT>::value_type T;\n  typedef typename gmm::number_traits<T>::magnitude_type R;\n  size_type m = gmm::mat_nrows(M), n = gmm::mat_ncols(M);\n  MAT M2(m, n);\n  gmm::dense_matrix<T> M3(m, n);\n  gmm::copy(M, M3);\n  std::swap(M, M2);\n  gmm::add(gmm::scaled(M2, T(-1)), M3);\n  if (gmm::mat_euclidean_norm(M3) > R(0) || gmm::mat_euclidean_norm(M) > R(0))\n    GMM_ASSERT1(false, \"Error in swap\");\n}\n\ntemplate<typename VECT> void test_vect_swap(VECT &, gmm::linalg_modifiable) {}\ntemplate<typename VECT> void test_vect_swap(VECT &, gmm::linalg_const) {}\ntemplate<typename VECT> void test_vect_swap(VECT &V, gmm::linalg_false) {\n  typedef typename gmm::linalg_traits<VECT>::value_type T;\n  typedef typename gmm::number_traits<T>::magnitude_type R;\n  size_type n = gmm::vect_size(V);\n  VECT V2(n);\n  std::vector<T> V3(n);\n  gmm::copy(V, V3);\n  std::swap(V, V2);\n  gmm::add(gmm::scaled(V2, T(-1)), V3);\n  if (gmm::vect_norm2(V3) > R(0) || gmm::vect_norm2(V) > R(0))\n    GMM_ASSERT1(false, \"Error in swap\");\n}\n\n\ntemplate <typename MAT1 , typename MAT2, typename VECT1, typename VECT2,\n\t  typename VECT3, typename VECT4>\nbool test_procedure(const MAT1 &m1_, const VECT1 &v1_, const VECT2 &v2_, \n\t\t    const MAT2 &m2_, const VECT3 &v3_, const VECT4 &v4_) {\n  VECT1 &v1 = const_cast<VECT1 &>(v1_);\n  VECT2 &v2 = const_cast<VECT2 &>(v2_);\n  VECT3 &v3 = const_cast<VECT3 &>(v3_);\n  VECT4 &v4 = const_cast<VECT4 &>(v4_);\n  MAT1  &m1 = const_cast<MAT1  &>(m1_);\n  MAT2  &m2 = const_cast<MAT2  &>(m2_);\n  typedef typename gmm::linalg_traits<MAT1>::value_type T;\n  typedef typename gmm::number_traits<T>::magnitude_type R;\n  R prec = gmm::default_tol(R());\n  static size_type nb_iter(0);\n  ++nb_iter;\n\n  test_procedure2(m1, v1, v2, m2, v3, v4);\n\n  size_type m = gmm::vect_size(v1), n = gmm::vect_size(v3);\n  gmm::csr_matrix<T> mm1(m, m);\n  gmm::copy(m1, mm1);\n  gmm::csc_matrix<T> mm2(m, n);\n  gmm::copy(m2, mm2);\n  test_procedure2(mm1, v1, v2, mm2, v3, v4);\n\n  size_type mm = m / 2, nn = n / 2;\n  gmm::sub_interval SUBI(0, mm), SUBJ(0, nn); \n  test_procedure2(gmm::sub_matrix(mm1, SUBI),\n\t\t  gmm::sub_vector(v1, SUBI),\n\t\t  gmm::sub_vector(v2, SUBI),\n\t\t  gmm::sub_matrix(mm2, SUBI, SUBJ),\n\t\t  gmm::sub_vector(v3, SUBJ),\n\t\t  gmm::sub_vector(v4, SUBJ));\n\n  gmm::add(gmm::scaled(mm1, T(-1)), m1);\n  gmm::add(gmm::scaled(mm2, T(-1)), m2);\n  \n  R error = gmm::mat_euclidean_norm(m1) + gmm::mat_euclidean_norm(m2);\n  if (!(error <= prec * R(10000)))\n    GMM_ASSERT1(false, \"Error too large: \"<< error);\n\n  // test for row_vector and col_vector\n  std::vector<T> v5(gmm::vect_size(v2));\n  gmm::mult(m2, v3, v2);\n  gmm::copy(v2, v5);\n  gmm::mult(m2, gmm::col_vector(v3), gmm::col_vector(v2));\n  gmm::add(gmm::scaled(v5, T(-1)), v2);\n  error = gmm::vect_norm2(v2);\n  if (!(error <= prec))\n    GMM_ASSERT1(false, \"Error too large: \" << error);\n  gmm::mult(gmm::row_vector(gmm::conjugated(v3)), gmm::conjugated(m2),\n\t    gmm::row_vector(v2));\n  gmm::add(gmm::conjugated(gmm::scaled(v5, T(-1))), v2);\n  error = gmm::vect_norm2(v2);\n  if (!(error <= prec))\n    GMM_ASSERT1(false, \"Error too large: \" << error);\n\n  if (gmm::is_original_linalg(m1)) {\n    size_type a = gmm::mat_nrows(m1), b = gmm::mat_ncols(m1);\n    size_type a2 = gmm::irandom(size_type(a));\n    size_type b2 = gmm::irandom(size_type(b));\n    gmm::dense_matrix<T> m3(a, b);\n    gmm::copy(m1, m3);\n    gmm::resize(m1, a+a2, b+b2);\n    for (size_type i = 0; i < a+a2; ++i)\n      for (size_type j = 0; j < b+b2; ++j) {\n\tif (i < a && j < b) {\n\t  if (m3(i, j) != m1(i, j))\n\t    GMM_ASSERT1(false, \"Error in resize\");\n\t}\n\telse\n\t  if (m1(i, j) != T(0))\n\t    GMM_ASSERT1(false, \"Error in resize\");\n      }\n    gmm::resize(m1, a2, b2);\n    for (size_type i = 0; i < a2; ++i)\n      for (size_type j = 0; j < b2; ++j)\n\tif (m3(i, j) != m1(i, j))\n\t    GMM_ASSERT1(false, \"Error in resize\");\n  }\n\n  if (gmm::is_original_linalg(v1)) {\n    size_type a = gmm::vect_size(v1);\n    size_type a2 = gmm::irandom(size_type(a));\n    std::vector<T> v6(a);\n    gmm::copy(v1, v6);\n    gmm::resize(v1, a+a2);\n    for (size_type i = 0; i < a+a2; ++i) {\n      if (i < a) {\n\tif (v1[i] != v6[i])\n\t    GMM_ASSERT1(false, \"Error in resize\");\n\t}\n\telse\n\t  if (v1[i] != T(0))\n\t    GMM_ASSERT1(false, \"Error in resize\");\n    }\n    gmm::resize(v1, a2);\n    for (size_type i = 0; i < a2; ++i)\n      if (v1[i] != v6[i])\n\tGMM_ASSERT1(false, \"Error in resize\");\n  }\n\n  test_mat_swap(m1, typename gmm::linalg_traits<MAT1>::is_reference());\n  test_vect_swap(v1, typename gmm::linalg_traits<VECT1>::is_reference());\n  \n  if (nb_iter == 100) return true;\n  return false;\n}\n\n\n  \n"
  },
  {
    "path": "libs/CoMISo/gmm/tests/gmm_torture06_mat_mult.cc",
    "content": "/*===========================================================================\n \n Copyright (C) 2007-2012 Yves Renard, Julien Pommier.\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n===========================================================================*/\n// RECTANGULAR_MATRIX_PARAM\n// RECTANGULAR_MATRIX_PARAM;\n// RECTANGULAR_MATRIX_PARAM;\n// ENDPARAM;\n\n#include \"gmm/gmm_kernel.h\"\n\nusing std::endl; using std::cout; using std::cerr;\nusing std::ends; using std::cin;\nusing gmm::size_type;\n\ntemplate <typename MAT1, typename MAT2, typename MAT3>\nbool test_procedure(const MAT1 &m1_, const MAT2 &m2_, const MAT3 &m3_) {\n  MAT1  &m1 = const_cast<MAT1  &>(m1_);\n  MAT2  &m2 = const_cast<MAT2  &>(m2_);\n  MAT3  &m3 = const_cast<MAT3  &>(m3_);\n  typedef typename gmm::linalg_traits<MAT1>::value_type T;\n  typedef typename gmm::number_traits<T>::magnitude_type R;\n  R prec = gmm::default_tol(R());\n  static size_type nb_iter(0);\n  ++nb_iter;\n\n  size_type k = gmm::mat_nrows(m1);\n  size_type l = std::max(gmm::mat_ncols(m1), gmm::mat_nrows(m2));\n  size_type m = std::max(gmm::mat_ncols(m2), gmm::mat_nrows(m3));\n  size_type n = gmm::mat_ncols(m3);\n\n  gmm::dense_matrix<T> m4(k, m);\n  gmm::mult(m1, m2, m4);\n\n  R error = mat_euclidean_norm(m4)\n    - mat_euclidean_norm(m1) * mat_euclidean_norm(m2);\n  if (error > prec * R(100))\n    GMM_ASSERT1(false, \"Inconsistence of frbenius norm\" << error);\n\n  error = mat_norm1(m4) - mat_norm1(m1) * mat_norm1(m2);\n  if (error > prec * R(100))\n    GMM_ASSERT1(false, \"Inconsistence of norm1 for matrices\"\n\t      << error);\n  error = mat_norminf(m4) - mat_norminf(m1) * mat_norminf(m2);\n  if (error > prec * R(100))\n    GMM_ASSERT1(false, \"Inconsistence of norminf for matrices\"\n\t\t<< error);\n\n  size_type mm = std::min(m, k);\n  size_type nn = std::min(n, m);\n\n  gmm::dense_matrix<T> m1bis(mm, l), m2bis(l, nn), m3bis(mm, nn);\n  gmm::copy(gmm::sub_matrix(m1, gmm::sub_interval(0,mm),\n\t\t\t    gmm::sub_interval(0,l)), m1bis);\n  gmm::copy(gmm::sub_matrix(m2, gmm::sub_interval(0,l),\n\t\t\t    gmm::sub_interval(0,nn)), m2bis);\n  gmm::mult(m1bis, m2bis, m3bis);\n  gmm::mult(gmm::sub_matrix(m1, gmm::sub_interval(0,mm),\n\t\t\t    gmm::sub_interval(0,l)),\n\t    gmm::sub_matrix(m2, gmm::sub_interval(0,l),\n\t\t\t    gmm::sub_interval(0,nn)),\n\t    gmm::sub_matrix(m3, gmm::sub_interval(0,mm),\n\t\t\t    gmm::sub_interval(0,nn)));\n  gmm::add(gmm::scaled(m3bis, T(-1)),\n\t   gmm::sub_matrix(m3, gmm::sub_interval(0,mm),\n\t\t\t   gmm::sub_interval(0,nn)));\n  \n  error = gmm::mat_euclidean_norm(gmm::sub_matrix(m3, gmm::sub_interval(0,mm),\n\t\t\t\t\t   gmm::sub_interval(0,nn)));\n\n  if (!(error <= prec * R(10000)))\n    GMM_ASSERT1(false, \"Error too large: \" << error);\n\n  if (nn <= gmm::mat_nrows(m3) && mm <= gmm::mat_ncols(m3)) {\n    \n    gmm::scale(m1, T(2));\n    gmm::mult(gmm::scaled(gmm::sub_matrix(m1, gmm::sub_interval(0,mm),\n\t\t\t\t\t  gmm::sub_interval(0,l)), T(-1)),\n\t      gmm::sub_matrix(m2, gmm::sub_interval(0,l),\n\t\t\t      gmm::sub_interval(0,nn)),\n\t      gmm::sub_matrix(gmm::transposed(m3), gmm::sub_interval(0,mm),\n\t\t\t      gmm::sub_interval(0,nn)));\n    gmm::add(gmm::scaled(m3bis, T(2)),\n\t     gmm::transposed(gmm::sub_matrix(m3, gmm::sub_interval(0,nn),\n\t\t\t\t\t     gmm::sub_interval(0,mm))));\n    \n    error = gmm::mat_euclidean_norm(gmm::sub_matrix(m3, gmm::sub_interval(0,nn),\n\t\t\t\t\t   gmm::sub_interval(0,mm)));\n    \n    if (!(error <= prec * R(10000)))\n      GMM_ASSERT1(false, \"Error too large: \" << error);\n  }\n  if (nb_iter == 100) return true;\n  return false;\n  \n}\n"
  },
  {
    "path": "libs/CoMISo/gmm/tests/gmm_torture10_qr.cc",
    "content": "/*===========================================================================\n \n Copyright (C) 2007-2012 Yves Renard, Julien Pommier.\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n===========================================================================*/\n// RECTANGULAR_MATRIX_PARAM\n// SQUARED_MATRIX_PARAM\n// ENDPARAM;\n\n#include \"gmm/gmm_kernel.h\"\n#include \"gmm/gmm_dense_lu.h\"\n#include \"gmm/gmm_dense_qr.h\"\n#include \"gmm/gmm_condition_number.h\"\n\nusing std::endl; using std::cout; using std::cerr;\nusing std::ends; using std::cin;\nusing gmm::size_type;\nbool print_debug = false;\n\n// template <typename MAT, typename T> void print_for_matlab(const MAT &m, T) { \n//   cout.precision(16);\n//   cout << \"[ \";\n//   for (size_type i = 0; i < gmm::mat_nrows(m); ++i) {\n//     for (size_type j = 0; j < gmm::mat_ncols(m); ++j) cout << \" \" << m(i,j);\n//     if (i != gmm::mat_nrows(m)-1) cout << \" ; \\n\";\n//   }\n//   cout << \" ]\" << endl;\n// }\n\n// template <typename MAT, typename T> void print_for_matlab(const MAT &m,\n// \t\t\t\t\t\t    std::complex<T>) { \n//   cout.precision(16);\n//   cout << \"[ \";\n//   for (size_type i = 0; i < gmm::mat_nrows(m); ++i) {\n//     for (size_type j = 0; j < gmm::mat_ncols(m); ++j)\n//       cout << \" (\" << m(i,j).real() << \"+\" << m(i,j).imag() << \"*i)\" ;\n//     if (i != gmm::mat_nrows(m)-1) cout << \" ; \\n\";\n//   }\n//   cout << \" ]\" << endl;\n// }\n\n// template <typename MAT> inline void print_for_matlab(const MAT &m)\n// { print_for_matlab(m, gmm::linalg_traits<MAT>::value_type()); }\n\ntemplate <typename T> inline T real_or_complex(double a, double, T)\n{ return T(a); }\n\ntemplate <typename T> inline\nstd::complex<T> real_or_complex(double a, double b, std::complex<T>) {\n  typedef typename gmm::number_traits<T>::magnitude_type R;\n  return std::complex<T>(R(a), R(b)); \n}\n\ntemplate <typename T> struct cmp_eval {\n  bool operator()(T a, T b) {\n    typedef typename gmm::number_traits<T>::magnitude_type R;\n    // R prec = gmm::default_tol(R());\n    R dr = gmm::real(a) - gmm::real(b);\n    R di = gmm::imag(a) - gmm::imag(b);\n    if (gmm::abs(dr) > gmm::abs(di)) return (dr<R(0)); else return (di<R(0));\n  }\n};\n\ntemplate <typename T> void sort_eval(std::vector<T> &v) {\n  std::sort(v.begin(), v.end(), cmp_eval<T>());\n} \n\n\ntemplate <typename MAT1, typename MAT2>\nbool test_procedure(const MAT1 &m1_, const MAT2 &m2_) {\n  MAT1  &m1 = const_cast<MAT1  &>(m1_);\n  MAT2  &m2 = const_cast<MAT2  &>(m2_);\n  typedef typename gmm::linalg_traits<MAT1>::value_type T;\n  typedef typename gmm::number_traits<T>::magnitude_type R;\n  R prec = gmm::default_tol(R());\n  R error;\n  static size_type nb_iter(0);\n  ++nb_iter;\n\n  // gmm::qr_factor(A, Q, R) is tested in test_gmm_mult.C\n\n  //\n  // test for gmm::qr_factor(A), apply_house_right and apply_house_left\n  //\n  size_type m = gmm::mat_nrows(m1), n = gmm::mat_ncols(m1);\n  size_type k = size_type(rand() % 50);\n\n  if (print_debug) {\n    static int nexpe = 0;\n    cout << \"Begin experiment \" << ++nexpe << \"\\n\\nwith \" << m1 << \"\\n\\n\"; \n    gmm::set_warning_level(3);\n  }\n    \n  gmm::dense_matrix<T> dm1(m, n);\n  gmm::copy(m1, dm1);\n  if (m >= n) {\n    gmm::dense_matrix<T> q(k,m), qaux(k,m), q2(m,k), dm1aux(k,n), m1aux(k,n);\n    gmm::fill_random(q); gmm::copy(q, qaux);\n    gmm::mult(q, m1, m1aux);\n\n    gmm::qr_factor(dm1);\n    gmm::copy(dm1, m1);\n    \n    gmm::apply_house_right(dm1, q);\n    for (size_type j = 0; j < n; ++j)\n      for (size_type i = j+1; i < m; ++i)\n\tdm1(i, j) = T(0);\n    gmm::mult(q, dm1, dm1aux);\n    gmm::add(gmm::scaled(m1aux, T(-1)), dm1aux);\n    error = gmm::mat_euclidean_norm(dm1aux);\n    if (!(error <= prec * R(10000))) \n      GMM_ASSERT1(false, \"Error too large: \" << error);\n\n    gmm::copy(gmm::identity_matrix(), q);\n    gmm::apply_house_right(m1, q);\n    size_type min_km = std::min(k, m);\n    gmm::dense_matrix<T> a(min_km, min_km), b(min_km, min_km);\n    gmm::copy(gmm::identity_matrix(), b);\n    if (k > m) gmm::mult(gmm::conjugated(q), q, a);\n    else gmm::mult(q, gmm::conjugated(q), a);\n    gmm::add(gmm::scaled(b, T(-1)), a);\n    error = gmm::mat_euclidean_norm(a);\n    if (!(error <= prec * R(10000)))\n      GMM_ASSERT1(false, \"Error too large: \" << error);\n      \n    gmm::copy(gmm::conjugated(qaux), q2);\n    gmm::apply_house_left(m1, q2);\n    gmm::mult(gmm::conjugated(q2), dm1, dm1aux);\n    gmm::add(gmm::scaled(m1aux, T(-1)), dm1aux);\n    error = gmm::mat_euclidean_norm(dm1aux);\n    if (!(error <= prec * R(10000)))\n      GMM_ASSERT1(false, \"Error too large: \" << error);\n\n  }\n  else {\n    gmm::dense_matrix<T> q(k,n), qaux(k,n), q2(n,k), dm1aux(k,m), m1aux(k,m);\n    gmm::fill_random(q); gmm::copy(q, qaux);\n    gmm::mult(q, gmm::transposed(m1), m1aux);\n\n    gmm::qr_factor(gmm::transposed(dm1));\n    gmm::copy(dm1, m1);\n    \n    gmm::apply_house_right(gmm::transposed(dm1), q);\n    for (size_type i = 0; i < m; ++i)\n      for (size_type j = i+1; j < n; ++j)\n\tdm1(i, j) = T(0);\n    gmm::mult(q, gmm::transposed(dm1), dm1aux);\n    gmm::add(gmm::scaled(m1aux, T(-1)), dm1aux);\n    error = gmm::mat_euclidean_norm(dm1aux);\n    if (!(error <= prec * R(10000))) \n      GMM_ASSERT1(false, \"Error too large: \" << error);\n\n    gmm::copy(gmm::identity_matrix(), q);\n    gmm::apply_house_right(gmm::transposed(m1), q);\n    size_type min_km = std::min(k, n);\n    gmm::dense_matrix<T> a(min_km, min_km), b(min_km, min_km);\n    gmm::copy(gmm::identity_matrix(), b);\n    if (k > n) gmm::mult(gmm::conjugated(q), q, a);\n    else gmm::mult(q, gmm::conjugated(q), a);\n    gmm::add(gmm::scaled(b, T(-1)), a);\n    error = gmm::mat_euclidean_norm(a);\n    if (!(error <= prec * R(10000)))\n      GMM_ASSERT1(false, \"Error too large: \" << error);\n      \n    gmm::copy(gmm::conjugated(qaux), q2);\n    gmm::apply_house_left(gmm::transposed(m1), q2);\n    gmm::mult(gmm::conjugated(q2), gmm::transposed(dm1), dm1aux);\n    gmm::add(gmm::scaled(m1aux, T(-1)), dm1aux);\n    error = gmm::mat_euclidean_norm(dm1aux);\n    if (!(error <= prec * R(10000))) \n      GMM_ASSERT1(false, \"Error too large: \" << error);\n\n  }\n  \n  //\n  // Test for implicit_qr_algorithm\n  //\n\n  \n\n  m = gmm::mat_nrows(m2);\n  gmm::dense_matrix<T> cq(m, m), cr(m, m), ca(m, m);  \n  std::vector<T> cv(m);\n  std::vector<std::complex<R> > eigc(m), cvc(m);\n\n\n  gmm::fill_random(ca);\n  std::complex<R> det1(gmm::lu_det(ca)), det2(1);\n  implicit_qr_algorithm(ca, eigc, cq);\n  for (size_type i = 0; i < m; ++i) det2 *= eigc[i];\n  if (gmm::abs(det1 - det2) > (gmm::abs(det1)+gmm::abs(det2))/R(100))\n    GMM_ASSERT1(false, \"Error in QR or det. det lu: \" << det1\n\t      << \" det qr: \" << det2);\n  if (print_debug)\n    cout << \"det lu = \" << det1 << \"  det qr = \" << det2 << endl;\n\n  if (m > 0) do {\n    gmm::fill_random(cq);\n  } while (gmm::abs(gmm::lu_det(cq)) < sqrt(prec)\n\t   || gmm::condition_number(cq) > R(1000));\n  gmm::copy(cq, cr);\n  gmm::lu_inverse(cr);\n\n  \n\n  gmm::fill_random(cv);\n  if (m >  0) cv[ 0] = real_or_complex(     0.0,  0.0, cv[0]);\n  if (m >  1) cv[ 1] = real_or_complex(     0.0,  0.0, cv[0]);\n  if (m >  2) cv[ 2] = real_or_complex(     0.01,-0.1, cv[0]);\n  if (m >  3) cv[ 3] = real_or_complex(     0.01, 0.1, cv[0]);\n  if (m >  4) cv[ 4] = real_or_complex(    -2.0,  3.0, cv[0]);\n  if (m >  5) cv[ 5] = real_or_complex(    -2.0,  3.0, cv[0]);\n  if (m >  6) cv[ 6] = real_or_complex(   -50.0,  3.0, cv[0]);\n  if (m >  7) cv[ 7] = real_or_complex(   100.0,  1.0, cv[0]);\n  if (m >  8) cv[ 8] = real_or_complex(   300.0,  1.0, cv[0]);\n  if (m >  9) cv[ 9] = real_or_complex(   500.0,  1.0, cv[0]);\n  if (m > 10) cv[10] = real_or_complex(  1000.0,  1.0, cv[0]);\n  if (m > 11) cv[11] = real_or_complex(  4000.0,  1.0, cv[0]);\n  if (m > 12) cv[12] = real_or_complex(  5000.0,  1.0, cv[0]);\n  if (m > 13) cv[13] = real_or_complex( 10000.0,  1.0, cv[0]);\n  if (m > 14) cv[14] = real_or_complex( 80000.0,  1.0, cv[0]);\n  if (m > 15) cv[15] = real_or_complex(100000.0,  1.0, cv[0]);\n  gmm::clear(m2);\n  for (size_type l = 0; l < m; ++l) m2(l, l) = cv[l];\n  gmm::mult(cq, m2, ca); \n  gmm::mult(ca, cr, ca);\n  \n  implicit_qr_algorithm(ca, eigc, cq);\n  gmm::copy(cv, cvc);\n  \n  sort_eval(cvc);\n  sort_eval(eigc);\n  error = gmm::vect_dist2(cvc, eigc);\n  if (!(error <= sqrt(prec) * gmm::vect_norm2(cv) * R(10)))\n    GMM_ASSERT1(false, \"Error in QR algorithm, error = \" << error);\n\n  gmm::dense_matrix<T> aa(m, m), bb(m, m);\n  gmm::mult(gmm::conjugated(cq), ca, aa);\n  gmm::mult(aa, cq, bb);\n  for (size_type i = 0; i < m; ++i)\n    for (size_type j = (i == 0) ? 0 : i-1; j < m; ++j)\n      bb(i, j) = T(0);\n  error = gmm::mat_maxnorm(bb);\n  if (!(error <= sqrt(prec) * gmm::vect_norm2(cv) * R(10)))\n    GMM_ASSERT1(false, \"Error in Schur vectors, error = \"<< error); \n\n  //\n  // Test for symmetric_qr_algorithm\n  //\n\n  m = gmm::mat_nrows(m2);\n  std::vector<R> cvr(m), eigcr(m);\n  if (m > 0) do {\n    gmm::fill_random(cr);\n  } while (gmm::abs(gmm::lu_det(cr)) < sqrt(prec)\n\t   || gmm::condition_number(cr) > R(1000));\n  \n  gmm::qr_factor(cr, cq, ca);\n  gmm::fill_random(cvr);\n\n  gmm::copy(gmm::identity_matrix(), m2);\n\n  if (m >  0) cvr[ 0] = R(     0.0 );\n  if (m >  1) cvr[ 1] = R(     0.0 );\n  if (m >  2) cvr[ 2] = R(     0.01);\n  if (m >  3) cvr[ 3] = R(     0.01);\n  if (m >  4) cvr[ 4] = R(    -2.0 );\n  if (m >  5) cvr[ 5] = R(    -2.0 );\n  if (m >  6) cvr[ 6] = R(   -50.0 );\n  if (m >  7) cvr[ 7] = R(   100.0 );\n  if (m >  8) cvr[ 8] = R(   300.0 );\n  if (m >  9) cvr[ 9] = R(   500.0 );\n  if (m > 10) cvr[10] = R(  1000.0 );\n  if (m > 11) cvr[11] = R(  4000.0 );\n  if (m > 12) cvr[12] = R(  5000.0 );\n  if (m > 13) cvr[13] = R( 10000.0 );\n  if (m > 14) cvr[14] = R( 80000.0 );\n  if (m > 15) cvr[15] = R(100000.0 );\n  gmm::clear(m2);\n  for (size_type l = 0; l < m; ++l) m2(l, l) = cvr[l];\n\n  gmm::mult(gmm::conjugated(cq), m2, ca); \n  gmm::mult(ca, cq, ca);\n  \n  symmetric_qr_algorithm(ca, eigcr, cq);\n\n  for (size_type l = 0; l < m; ++l) {\n     std::vector<T> vy(m);\n     gmm::mult(ca, gmm::mat_col(cq, l),\n\t       gmm::scaled(gmm::mat_col(cq, l), -eigcr[l]), vy);\n     error = gmm::vect_norm2(vy);\n     if (!(error <= sqrt(prec) * gmm::vect_norm2(cvr) * R(10))) \n       GMM_ASSERT1(false, \"Error too large: \" << error);\n\n  }\n\n  sort_eval(cvr);\n  sort_eval(eigcr);\n  error = gmm::vect_dist2(cvr, eigcr);\n  if (!(error <= sqrt(prec) * gmm::vect_norm2(cvr) * R(10)))\n    GMM_ASSERT1(false, \"Error in QR algorithm.\");\n\n  if (nb_iter == 100) return true;\n  return false;\n\n}\n"
  },
  {
    "path": "libs/CoMISo/gmm/tests/gmm_torture15_sub.cc",
    "content": "/*===========================================================================\n \n Copyright (C) 2007-2012 Yves Renard, Julien Pommier.\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n===========================================================================*/\n// SQUARED_MATRIX_PARAM\n// VECTOR_PARAM;\n// VECTOR_PARAM;\n// ENDPARAM;\n\n#include \"gmm/gmm_kernel.h\"\n#include \"gmm/gmm_dense_lu.h\"\n#include \"gmm/gmm_condition_number.h\"\n\nusing std::endl; using std::cout; using std::cerr;\nusing std::ends; using std::cin;\nusing gmm::size_type;\n\nbool print_debug = false;\n\ntemplate <typename MAT1, typename VECT1, typename VECT2>\nbool test_procedure(const MAT1 &m1_, const VECT1 &v1_, const VECT2 &v2_) {\n  VECT1 &v1 = const_cast<VECT1 &>(v1_);\n  VECT2 &v2 = const_cast<VECT2 &>(v2_);\n  MAT1  &m1 = const_cast<MAT1  &>(m1_);\n  typedef typename gmm::linalg_traits<MAT1>::value_type T;\n  typedef typename gmm::number_traits<T>::magnitude_type R;\n  R prec = gmm::default_tol(R());\n  R error, det, cond;\n  static  size_type nb_iter(0);\n  ++nb_iter;\n\n  size_type m = gmm::vect_size(v1), n = m/2;\n  std::vector<T> v3(n);\n\n  det = gmm::abs(gmm::lu_det(gmm::sub_matrix(m1, gmm::sub_interval(0,n))));\n  cond = gmm::condition_number(gmm::sub_matrix(m1, gmm::sub_interval(0,n)));\n  if (prec * cond < R(1)/R(10000) && det != R(0)) {\n    gmm::lu_solve(gmm::sub_matrix(m1, gmm::sub_interval(0,n)), v3,\n\t\t  gmm::sub_vector(v2, gmm::sub_interval(0,n)));\n    gmm::mult(gmm::sub_matrix(m1, gmm::sub_interval(0,n)), v3,\n\t      gmm::sub_vector(v1, gmm::sub_interval(0,n)));\n    gmm::add(gmm::scaled(gmm::sub_vector(v1, gmm::sub_interval(0,n)), T(-1)),\n\t     gmm::sub_vector(v2, gmm::sub_interval(0,n)), v3);\n    if (!((error = gmm::vect_norm2(v3)) <= prec * R(20000) * cond))\n      GMM_THROW(gmm::failure_error, \"Error too large: \"<< error);\n  }\n\n  det = gmm::abs(gmm::lu_det(gmm::sub_matrix(m1, gmm::sub_slice(0,n,1))));\n  cond = gmm::condition_number(gmm::sub_matrix(m1, gmm::sub_slice(0,n,1)));\n  if (prec * cond < R(1)/R(10000) && det != R(0)) {\n    gmm::lu_solve(gmm::sub_matrix(m1, gmm::sub_slice(0,n,1)), v3,\n\t\t  gmm::sub_vector(v2, gmm::sub_slice(0,n,1)));\n    gmm::mult(gmm::sub_matrix(m1, gmm::sub_slice(0,n,1)), v3,\n\t      gmm::sub_vector(v1, gmm::sub_slice(0,n,1)));\n    gmm::add(gmm::scaled(gmm::sub_vector(v1, gmm::sub_slice(0,n,1)), T(-1)),\n\t     gmm::sub_vector(v2, gmm::sub_slice(0,n,1)), v3);\n    if (!((error = gmm::vect_norm2(v3)) <= prec * R(20000) * cond))\n      GMM_THROW(gmm::failure_error, \"Error too large: \"<< error);\n  }\n  \n  gmm::copy(gmm::identity_matrix(), gmm::sub_matrix(gmm::transposed(m1),\n\t\t        gmm::sub_interval(0,n), gmm::sub_interval(0,m)));\n  gmm::clear(gmm::sub_vector(v2, gmm::sub_interval(n, m-n)));\n  if (print_debug) {\n    cout << \"sub matrix of m1 : \"\n\t << gmm::sub_matrix(gmm::transposed(m1), gmm::sub_interval(0,n))\n\t << endl;\n  }\n\n  gmm::mult(gmm::sub_matrix(m1, gmm::sub_interval(0,m), \n\t\t\t    gmm::sub_interval(0,n)),\n\t    gmm::sub_vector(v2, gmm::sub_interval(0,n)),\n\t    gmm::scaled(v2, T(-1)), v1);\n  if (!((error = gmm::vect_norm2(v1)) <= prec * R(2000)))\n    GMM_THROW(gmm::failure_error, \"Error too large: \" << error);\n  \n  if (nb_iter == 100) return true;\n  return false;\n}\n"
  },
  {
    "path": "libs/CoMISo/gmm/tests/gmm_torture20_iterative_solvers.cc",
    "content": "/*===========================================================================\n \n Copyright (C) 2007-2012 Yves Renard, Julien Pommier.\n \n This file is a part of GETFEM++\n \n Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n under  the  terms  of the  GNU  Lesser General Public License as published\n by  the  Free Software Foundation;  either version 3 of the License,  or\n (at your option) any later version along with the GCC Runtime Library\n Exception either version 3.1 or (at your option) any later version.\n This program  is  distributed  in  the  hope  that it will be useful,  but\n WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n License and GCC Runtime Library Exception for more details.\n You  should  have received a copy of the GNU Lesser General Public License\n along  with  this program;  if not, write to the Free Software Foundation,\n Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n \n===========================================================================*/\n// SQUARED_MATRIX_PARAM;\n// DENSE_VECTOR_PARAM;\n// VECTOR_PARAM;\n// ENDPARAM;\n\n#include \"gmm/gmm.h\"\nusing namespace std; // in order to test a using namespace std;\n\nusing gmm::size_type;\n\nint print_debug = 0;\nsize_type nb_fault_allowed = 200;\nsize_type nb_fault = 0;\ndouble ratio_max = 0.0;\n\nstruct la_stat {\n  size_type nb_iter, nb_fault, nb_expe;\n  la_stat(void) : nb_iter(0), nb_fault(0), nb_expe(0) {};\n};\n\ntemplate <typename PS> \n  la_stat ps_stat(const PS &, size_type nb_iter, bool fault) {\n  static la_stat la;\n  if (nb_iter != size_type(-1)) {\n    la.nb_expe++;\n    la.nb_iter += nb_iter;\n    la.nb_fault += (fault) ? 1 : 0;\n  }\n  return la;\n}\n\ntemplate <typename PS>\nvoid print_stat(const PS &ps, const char *name) {\n  la_stat s = ps_stat(ps, size_type(-1), false);\n  cout << name << \"\\t: \" << s.nb_expe << \" exp. with \";\n  if (s.nb_fault > 1)  cout << s.nb_fault << \" faults\";\n  else if (s.nb_fault == 1) cout << \"1  fault\";\n  else cout << \"no fault\";\n       \n  if (s.nb_expe != 0) {\n    double ratio = double(s.nb_fault) / double(s.nb_expe);\n    ratio_max = std::max(ratio, ratio_max);\n    cout << \", ratio = \" << ratio;\n    cout << \", average nb iter = \" << double(s.nb_iter) / double(s.nb_expe);\n  } \n  cout << endl;\n}\n\nstruct LEAST_SQUARE_CG {\n  template <typename MAT, typename VECT1, typename VECT2, typename PRECOND>\n  void operator()(const MAT &m, VECT1 &v1, const VECT2 &v2, const PRECOND &,\n\t\t  gmm::iteration &iter) const\n  { gmm::least_squares_cg(m, v1, v2, iter); }\n};\n\nstruct BICGSTAB {\n  template <typename MAT, typename VECT1, typename VECT2, typename PRECOND>\n  void operator()(const MAT &m, VECT1 &v1, const VECT2 &v2, const PRECOND &P,\n\t\t  gmm::iteration &iter) const\n  { gmm::bicgstab(m, v1, v2, P, iter); }\n};\n\nstruct GMRES {\n  template <typename MAT, typename VECT1, typename VECT2, typename PRECOND>\n  void operator()(const MAT &m, VECT1 &v1, const VECT2 &v2, const PRECOND &P,\n\t\t  gmm::iteration &iter) const\n  { gmm::gmres(m, v1, v2, P, 50, iter); }\n};\n\nstruct QMR {\n  template <typename MAT, typename VECT1, typename VECT2, typename PRECOND>\n  void operator()(const MAT &m, VECT1 &v1, const VECT2 &v2, const PRECOND &P,\n\t\t  gmm::iteration &iter) const\n  { gmm::qmr(m, v1, v2, P, iter); }\n};\n\nstruct CG {\n  template <typename MAT, typename VECT1, typename VECT2, typename PRECOND>\n  void operator()(const MAT &m, VECT1 &v1, const VECT2 &v2, const PRECOND &P,\n\t\t  gmm::iteration &iter) const\n  { gmm::cg(m, v1, v2, P, iter); }\n};\n\ntemplate <typename SOLVER, typename PRECOND, typename MAT, typename VECT1,\n\t  typename VECT2, typename Rcond>\nvoid do_test(const SOLVER &solver, const MAT &m1, VECT1 &v1,\n\t    VECT2 &v2, const PRECOND &P, Rcond cond) {\n\n  typedef typename gmm::linalg_traits<MAT>::value_type T;\n  typedef typename gmm::number_traits<T>::magnitude_type R;\n  R prec = gmm::default_tol(R()), error(0);\n  size_type m = gmm::mat_nrows(m1);\n  std::vector<T> v3(m);\n\n  gmm::iteration iter((double(prec*cond))*100.0, (print_debug > 2) ? 1:0,\n\t\t      50*m);\n\n  for (int i = 0; i < 30; ++i) {\n    iter.init();\n    gmm::fill_random(v1);\n    if (i >= 4) gmm::fill_random(v2);\n    if (i == 29) gmm::clear(v1);\n    solver(m1, v1, v2, P, iter);\n    gmm::mult(m1, v1, gmm::scaled(v2, T(-1)), v3);\n    error = gmm::vect_norm2(v3) / gmm::vect_norm2(v1);\n    // if (error * R(0) != R(0))\n    //   GMM_ASSERT1(false, \"Inconsistent error: \" << error);\n    if (error <= prec * cond * R(20000)) {\n      ps_stat(solver, iter.get_iteration(), false);\n      ps_stat(P, iter.get_iteration(), false);\n      return;\n    }\n  }\n  ps_stat(solver, iter.get_iteration(), true);\n  ps_stat(P, iter.get_iteration(), true);\n  ++nb_fault;\n  if (nb_fault > nb_fault_allowed)\n      GMM_ASSERT1(false, \"Error too large: \" << error);\n\n}\n\ntemplate <typename MAT1, typename VECT1, typename VECT2>\nbool test_procedure(const MAT1 &m1_, const VECT1 &v1_, const VECT2 &v2_) {\n  VECT1 &v1 = const_cast<VECT1 &>(v1_);\n  VECT2 &v2 = const_cast<VECT2 &>(v2_);\n  MAT1  &m1 = const_cast<MAT1  &>(m1_);\n  typedef typename gmm::linalg_traits<MAT1>::value_type T;\n  typedef typename gmm::number_traits<T>::magnitude_type R;\n  R prec = gmm::default_tol(R());\n  size_type m = gmm::mat_nrows(m1);\n  if (m == 0) return true;\n  static int nexpe = 0, effexpe = 0;\n  ++nexpe;\n  gmm::set_warning_level(0);\n\n  gmm::clean(v1, 0.01);\n  for (size_type i = 0; i < gmm::vect_size(v1); ++i)\n    if (v1[i] != T(0) && gmm::abs(v1[i]) < R(1) / R(101))\n      GMM_ASSERT1(false, \"Error in clean\");\n\n  if (print_debug) {\n    cout << \"Begin experiment \" << nexpe << \"\\n\\nwith \" << m1 << \"\\n\\n\"; \n    gmm::set_warning_level(3);\n  }\n  \n  R det = gmm::abs(gmm::lu_det(m1)), cond = gmm::condest(m1);\n  \n  if (print_debug)\n    cout << \"condition number = \" << cond << \" det = \" << det << endl;\n  if (det == R(0) && cond < R(1) / prec && cond != R(0))\n    GMM_ASSERT1(false, \"Inconsistent condition number: \" << cond);\n\n  if (sqrt(prec) * cond >= R(1)/R(100) || det < sqrt(prec)*R(10)) return false;\n    \n  ++effexpe; cout << \".\"; cout.flush();\n  \n  gmm::identity_matrix P1;\n  gmm::diagonal_precond<MAT1> P2(m1);\n  gmm::mr_approx_inverse_precond<MAT1> P3(m1, 10, prec);\n  gmm::ilu_precond<MAT1> P4(m1);\n  gmm::ilut_precond<MAT1> P5(m1, 20, prec);\n  gmm::ilutp_precond<MAT1> P5b(m1, 20, prec);\n  \n  R detmr = gmm::abs(gmm::lu_det(P3.approx_inverse()));\n\n  if (sizeof(R) > 4 || m < 15) {\n    \n    if (print_debug) cout << \"\\nLeast square CG with no preconditionner\\n\";\n    do_test(LEAST_SQUARE_CG(), m1, v1, v2, P1, cond);\n\n    if (print_debug) cout << \"\\nBicgstab with no preconditionner\\n\";\n    do_test(BICGSTAB(), m1, v1, v2, P1, cond);\n    \n    if (print_debug) cout << \"\\nBicgstab with diagonal preconditionner\\n\";\n    do_test(BICGSTAB(), m1, v1, v2, P2, cond);\n    \n    if (detmr > prec * R(100)) {\n      if (print_debug) cout << \"\\nBicgstab with mr preconditionner\\n\";\n      do_test(BICGSTAB(), m1, v1, v2, P3, cond);\n    }\n    \n    if (print_debug) cout << \"\\nBicgstab with ilu preconditionner\\n\";\n    do_test(BICGSTAB(), m1, v1, v2, P4, cond);\n    \n    if (print_debug) cout << \"\\nBicgstab with ilut preconditionner\\n\";\n    do_test(BICGSTAB(), m1, v1, v2, P5, cond); \n\n    if (print_debug) cout << \"\\nBicgstab with ilutp preconditionner\\n\";\n    do_test(BICGSTAB(), m1, v1, v2, P5b, cond); \n  }\n\n  if (print_debug) cout << \"\\nGmres with no preconditionner\\n\";\n  do_test(GMRES(), m1, v1, v2, P1, cond);\n  \n  if (print_debug) cout << \"\\nGmres with diagonal preconditionner\\n\";\n  do_test(GMRES(), m1, v1, v2, P2, cond);\n  \n  if (detmr > prec * R(100)) {\n    if (print_debug) cout << \"\\nGmres with mr preconditionner\\n\";\n    do_test(GMRES(), m1, v1, v2, P3, cond);\n  }\n  \n  if (print_debug) cout << \"\\nGmres with ilu preconditionner\\n\";\n  do_test(GMRES(), m1, v1, v2, P4, cond);\n  \n  if (print_debug) cout << \"\\nGmres with ilut preconditionner\\n\";\n  do_test(GMRES(), m1, v1, v2, P5, cond);\n  \n  if (print_debug) cout << \"\\nGmres with ilutp preconditionner\\n\";\n  do_test(GMRES(), m1, v1, v2, P5b, cond);\n  \n  if (sizeof(R) > 4 || m < 20) {\n\n    if (print_debug) cout << \"\\nQmr with no preconditionner\\n\";\n    do_test(QMR(), m1, v1, v2, P1, cond);\n    \n    if (print_debug) cout << \"\\nQmr with diagonal preconditionner\\n\";\n    do_test(QMR(), m1, v1, v2, P2, cond);\n    \n    if (print_debug) cout << \"\\nQmr with ilu preconditionner\\n\";\n    do_test(QMR(), m1, v1, v2, P4, cond);\n    \n    if (print_debug) cout << \"\\nQmr with ilut preconditionner\\n\";\n    do_test(QMR(), m1, v1, v2, P5, cond);  \n\n    if (print_debug) cout << \"\\nQmr with ilutp preconditionner\\n\";\n    do_test(QMR(), m1, v1, v2, P5b, cond);  \n  }\n\n  gmm::dense_matrix<T> m2(m, m), m3(m, m);\n  gmm::mult(gmm::conjugated(m1), m1, m2);\n  gmm::copy(m1, m3);\n  gmm::add(gmm::conjugated(m1), m3);\n  gmm::copy(m2, m1);\n  gmm::cholesky_precond<MAT1> P6(m1);\n  gmm::choleskyt_precond<MAT1> P7(m1, 10, prec);\n  \n  if (!is_hermitian(m1, prec*R(100)))\n    GMM_ASSERT1(false, \"The matrix is not hermitian\");\n  \n  if (print_debug) cout << \"\\nCG with no preconditionner\\n\";\n  do_test(CG(), m1, v1, v2, P1, cond*cond);\n  \n  if (print_debug) cout << \"\\nCG with diagonal preconditionner\\n\";\n  do_test(CG(), m1, v1, v2, P2, cond*cond);\n  \n  if (print_debug) cout << \"\\nCG with ildlt preconditionner\\n\";\n  do_test(CG(), m1, v1, v2, P6, cond*cond);\n  \n  if (print_debug) cout << \"\\nCG with ildltt preconditionner\\n\";\n  do_test(CG(), m1, v1, v2, P7, cond*cond);\n\n  if (effexpe == 50) {\n    cout << \"\\n\\n\" << effexpe << \" effective experiments with \";\n    if (nb_fault > 1)  cout << nb_fault << \" faults\";\n    else if (nb_fault == 1) cout << \"1  fault\";\n    else cout << \"no fault\";\n    cout << \", size = \" << m << \" base type : \" << typeid(T).name() << endl;\n\n    cout.precision(3);\n    print_stat(LEAST_SQUARE_CG(), \"solver least square cg\");\n    print_stat(BICGSTAB(), \"solver bicgstab\");\n    print_stat(GMRES(), \"solver gmres\");\n    print_stat(QMR(), \"solver qmr\");\n    print_stat(CG(), \"solver cg\");\n    print_stat(P1, \"no precond\");\n    print_stat(P2, \"diag precond\");\n    print_stat(P3, \"mr precond\");\n    print_stat(P4, \"ilu precond\");\n    print_stat(P5, \"ilut precond\");\n    print_stat(P5b, \"ilutp precond\");\n    print_stat(P6, \"ildlt precond\");\n    print_stat(P7, \"ildltt precond\");\n    if (ratio_max > 0.2) GMM_ASSERT1(false, \"something wrong ..\");\n    return true;\n  }\n \n  return false;\n}\n"
  },
  {
    "path": "libs/CoMISo/gmm/tests/make_gmm_test.pl",
    "content": "# Copyright (C) 2001-2012 Yves Renard\n#\n# This file is a part of GETFEM++\n#\n# Getfem++  is  free software;  you  can  redistribute  it  and/or modify it\n# under  the  terms  of the  GNU  Lesser General Public License as published\n# by  the  Free Software Foundation;  either version 3 of the License,  or\n# (at your option) any later version along with the GCC Runtime Library\n# Exception either version 3.1 or (at your option) any later version.\n# This program  is  distributed  in  the  hope  that it will be useful,  but\n# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n# or  FITNESS  FOR  A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n# License and GCC Runtime Library Exception for more details.\n# You  should  have received a copy of the GNU Lesser General Public License\n# along  with  this program;  if not, write to the Free Software Foundation,\n# Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.\n\neval 'exec perl -S $0 \"$@\"'\n  if 0;\n\nsub numerique { $a <=> $b; }\n\n$nb_iter = 1;                # number of iterations on each test\n$islocal = 0;\n$with_qd = 0;                # test also with dd_real and qd_real\n$with_lapack = 0;            # link with lapack\n$srcdir = $ENV{srcdir};      # source directory\n$tests_to_be_done = \"\";\n$fix_base_type = -1;\n\nwhile(@ARGV) {               # read optional parameters\n  $param = $ARGV[0];\n  $val = int(1 * $param);\n  if ($param =~ /.cc/) {\n    $tests_to_be_done = $param;\n  }\n  elsif ($param eq \"with-qd\") {\n    $with_qd = 1;\n  }\n  elsif ($param eq \"with-lapack\") {\n    $with_lapack = 1;\n  }\n  elsif ($param eq \"float\") {\n    $fix_base_type = 0;\n  }\n  elsif ($param eq \"double\") {\n    $fix_base_type = 1;\n  }\n  elsif ($param eq \"complex_float\") {\n    $fix_base_type = 2;\n  }\n  elsif ($param eq \"complex_double\") {\n    $fix_base_type = 3;\n  }\n  elsif ($param eq \"dd_real\") {\n    $fix_base_type = 0; $with_qd = 1;\n  }\n  elsif ($param eq \"qd_real\") {\n    $fix_base_type = 1; $with_qd = 1;\n  }\n  elsif ($param eq \"complex_dd_real\") {\n    $fix_base_type = 2; $with_qd = 1;\n  }\n  elsif ($param eq \"complex_qd_real\") {\n    $fix_base_type = 3; $with_qd = 1;\n  }\n  elsif ($param =~ \"srcdir=\") {\n    ($param, $srcdir)=split('=', $param, 2);\n  }\n  elsif ($val != 0) {\n    $nb_iter = $val;\n  }\n  else {\n    print \"Unrecognized parameter: $param\\n\";\n    print \"valid parameters are:\\n\";\n    print \". the number of iterations on each test\\n\";\n    print \". with-qd : test also with dd_real and qd_real\\n\";\n    print \". with-lapack : link with lapack\\n\";\n    print \". double, float, complex_double or complex_float\";\n    print \" to fix the base type\\n\";\n    print \". source name of a test procedure\\n\";\n    print \". srcdir=name\\n\";\n    exit(1);\n  }\n  shift @ARGV;\n}\n\nif ($srcdir eq \"\") {\n  $srcdir=\"../../tests\";\n  print \"WARNING : no srcdir, taking $srcdir\\n\";\n  $islocal = 1;\n}\nif ($tests_to_be_done eq \"\") {\n  $tests_to_be_done = `ls $srcdir/gmm_torture*.cc`;  # list of tests\n}\n\nif ($with_qd && $with_lapack) {\n  print \"Options with_qd and with_lapack are not compatible\\n\";\n  exit(1);\n}\n\n$nb_test = 0;                # number of test procedures\n$tests_list = $tests_to_be_done;\nwhile ($tests_list)\n  { ($org_name, $tests_list) = split('\\s', $tests_list, 2); ++$nb_test; }\n\nprint \"Gmm tests : Making $nb_iter execution\";\nif ($nb_iter > 1) { print \"s\"; }\nif ($nb_test == 1) { print \" of $tests_to_be_done\\n\"; }\nelse { print \" of each test\\n\"; }\n\nfor ($iter = 1; $iter <= $nb_iter; ++$iter) {\n  $tests_list = $tests_to_be_done;\n  while ($tests_list) {\n    ($org_name, $tests_list) = split('\\s', $tests_list, 2);\n\n    if ($nb_iter == 1) { print \"Testing  $org_name\"; }\n    else { print \"Test $iter for $org_name\"; }\n    if ($with_lapack) { print \" linked with lapack\"; }\n    if ($with_qd) { print \" with qd types\"; }\n    print \"\\n\";\n\n    $d = $org_name;\n    do { ($b, $d) = split('/', $d, 2); } while ($d);\n    $dest_name = \"auto_$b\";\n    ($root_name, $d) = split('.cc', $dest_name, 2);\n    $size_max = 30.0;\n\n    open(DATAF, $org_name) or die \"Open input file impossible : $!\\n\";\n    open(TMPF, \">$dest_name\") or die \"Open output file impossible : $!\\n\";\n\n    print TMPF \"\\n\\n\";\n\n    if ($with_lapack) {\n      print TMPF \"#include<gmm_lapack_interface.h>\\n\\n\";\n    }\n\n    if ($with_qd) {\n      print TMPF \"#include <qd/dd.h>\\n\";\n      print TMPF \"#include <qd/qd.h>\\n\";\n      print TMPF \"#include <qd/fpu.h>\\n\\n\";\n    }\n\n    $reading_param = 1;\n    $nb_param = 0;\n\n    while (($li = <DATAF> )&& ($reading_param)) {\n      chomp($li);\n      if ($li=~/^\\/\\//) {\n      if ($li=~/ENDPARAM/) { $reading_param = 0; }\n      elsif ($li=~/DENSE_VECTOR_PARAM/) { $param[$nb_param++] = 1; }\n      elsif ($li=~/VECTOR_PARAM/) { $param[$nb_param++] = 2; }\n      elsif ($li=~/RECTANGULAR_MATRIX_PARAM/) { $param[$nb_param++] = 3; }\n      elsif ($li=~/SQUARED_MATRIX_PARAM/) { $param[$nb_param++] = 4; }\n      elsif ($li=~/\\/\\//) { }\n      else { die \"Error in parameter list\"; }\n    }\n    }\n\n    $TYPES[0] = \"float\";\n    $TYPES[1] = \"std::complex<float> \";\n    $TYPES[2] = \"double\";\n    $TYPES[3] = \"std::complex<double> \";\n    # $TYPES[4] = \"long double\";\n    # $TYPES[5] = \"std::complex<long double> \";\n    $NB_TYPES = 4.0;\n\n    if ($with_lapack) {\n      $NB_TYPES = 4.0;\n    }\n\n    if ($with_qd) {\n      $TYPES[0] = \"dd_real\";\n      $TYPES[1] = \"qd_real\";\n      $TYPES[2] = \"std::complex<dd_real> \";\n      $TYPES[3] = \"std::complex<qd_real> \";\n      $NB_TYPES = 4.0;\n    }\n\n    if ($fix_base_type == -1) { $TYPE = $TYPES[int($NB_TYPES * rand())]; }\n    else { $TYPE = $TYPES[$fix_base_type]; }\n\n    $VECTOR_TYPES[0] = \"std::vector<$TYPE> \";\n    $VECTOR_TYPES[1] = \"std::vector<$TYPE> \";\n    $VECTOR_TYPES[2] = \"gmm::rsvector<$TYPE> \";\n    $VECTOR_TYPES[3] = \"gmm::wsvector<$TYPE> \";\n    $VECTOR_TYPES[4] = \"gmm::slvector<$TYPE> \";\n    $NB_VECTOR_TYPES = 5.0;\n\n    $MATRIX_TYPES[0] = \"gmm::dense_matrix<$TYPE> \";\n    $MATRIX_TYPES[1] = \"gmm::dense_matrix<$TYPE> \";\n    $MATRIX_TYPES[2] = \"gmm::row_matrix<std::vector<$TYPE> > \";\n    $MATRIX_TYPES[3] = \"gmm::col_matrix<std::vector<$TYPE> > \";\n    $MATRIX_TYPES[4] = \"gmm::row_matrix<gmm::rsvector<$TYPE> > \";\n    $MATRIX_TYPES[5] = \"gmm::col_matrix<gmm::rsvector<$TYPE> > \";\n    $MATRIX_TYPES[6] = \"gmm::row_matrix<gmm::wsvector<$TYPE> > \";\n    $MATRIX_TYPES[7] = \"gmm::col_matrix<gmm::wsvector<$TYPE> > \";\n    $MATRIX_TYPES[8] = \"gmm::row_matrix<gmm::slvector<$TYPE> > \";\n    $MATRIX_TYPES[9] = \"gmm::col_matrix<gmm::slvector<$TYPE> > \";\n    $NB_MATRIX_TYPES = 10.0;\n\n    while ($li = <DATAF>) { print TMPF $li; }\n    $sizep = int($size_max*rand());\n    $theseed = int(10000.0*rand());\n#    print \"Parameters for the test:\\n\";\n    print TMPF \"\\n\\n\\n\";\n    print TMPF \"int main(void) {\\n\\n\";\n    if ($with_qd) {\n      print TMPF \"  fpu_fix_start(0);\\n\\n\";\n    }\n    print TMPF \"  srand($theseed);\\n\\n\";\n    print TMPF \"  gmm::set_warning_level(1);\\n\\n\";\n    print TMPF \"  for (int iter = 0; iter < 100000; ++iter) {\\n\\n\";\n    print TMPF \"    try {\\n\\n\";\n    for ($j = 0; $j < $nb_param; ++$j) {\n      $a = rand(); $b = rand();\n      if ($with_lapack) { $a = $b = 1.0; }\n      $sizepp = $sizep + int(50.0*rand());\n      $step = $sizep; if ($step == 0) { ++$step; }\n      $step = int(1.0*int($sizepp/$step - 1)*rand()) + 1;\n\n      if (($param[$j] == 1) || ($param[$j] == 2)) { # vectors\n\t$lt = $VECTOR_TYPES[0];\n\tif ($param[$j] == 2 && $with_lapack==0) {\n\t  $lt = $VECTOR_TYPES[int($NB_VECTOR_TYPES * rand())];\n\t}\n\tif ($a < 0.1) {\n\t  $li = \"      $lt param$j($sizepp);\";\n\t  $c = int(1.0*($sizepp-$sizep+1)*rand());\n\t  $param_name[$j]\n\t    = \"gmm::sub_vector(param$j, gmm::sub_interval($c, $sizep))\";\n\t}\n\telsif ($a < 0.2) {\n\t  $li = \"      $lt param$j($sizepp);\";\n\t  $c = int(1.0*($sizepp-($sizep*$step+1))*rand());\n\t  $param_name[$j]\n\t    = \"gmm::sub_vector(param$j, gmm::sub_slice($c, $sizep, $step))\";\n\t}\n\telsif ($a < 0.3) {\n\t  $li = \"      $lt param$j($sizepp);\"; @sub_index = ();\n\t  @sortind = 0 .. ($sizepp-1);\n\t  while (@sortind)\n\t    { push (@sub_index, splice(@sortind , rand @sortind, 1)); }\n\t  @sub_index = @sub_index[0..$sizep-1];\n\t  @sub_index = sort numerique @sub_index;\n\t  if ($sizep == 0)\n\t    { $li = \"$li\\n      gmm::size_type param_tab$j [1] = {0};\"; }\n\t  else {\n\t    $li=\"$li\\n      gmm::size_type param_tab$j [$sizep] ={$sub_index[0]\";\n\t    for ($k = 1; $k < $sizep; ++$k) { $li = \"$li , $sub_index[$k]\"; }\n\t    $li = \"$li};\";\n\t  }\n\t  $param_name[$j] = \"gmm::sub_vector(param$j,\".\n\t    \" gmm::sub_index(&param_tab$j [0], &param_tab$j [$sizep]))\";\n\t}\n\telse {\n\t  $li = \"      $lt param$j($sizep);\";\n\t  $param_name[$j] = \"param$j\";\n\t}\n\tprint TMPF \"$li\\n      gmm::fill_random(param$j);\\n\";\n      }\n      elsif ($param[$j] == 3 || $param[$j] == 4) { # matrices\n\t$sm = $sizep; if ($a < 0.3) { $sm = $sizep + int(50.0*rand()); }\n\t$s = $sizep; if ($param[$j] == 3) { $s = int($size_max*rand()); }\n\t$sn = $s; if ($b < 0.3) { $sn = $s + int(50.0*rand()); }\n\t$param_name[$j] = \"param$j\";\n\t$lt = $MATRIX_TYPES[0];\n\tif ($with_lapack==0) {\n\t  $lt = $MATRIX_TYPES[int($NB_MATRIX_TYPES * rand())];\n\t}\n\t$li = \"      $lt param$j($sm, $sn);\";\n\t\n\tif ($a < 0.3 || $b < 0.3) {\n\t  $sub1 = \"gmm::sub_interval(0, $sizep)\";\n\t  $sub2 = \"gmm::sub_interval(0, $s)\";\n\t  if ($a < 0.1) {\n\t    $c = int(1.0*($sm-$sizep+1)*rand());\n\t    $sub1 = \"gmm::sub_interval($c, $sizep)\";\n\t  }\n\t  elsif ($a < 0.2) {\n\t    $step = $sizep; if ($step == 0) { ++$step; }\n\t    $step = int(1.0*int($sm/$step - 1)*rand()) + 1;\n\t    $c = int(1.0*($sm-($sizep*$step+1))*rand());\n\t    $sub1 = \"gmm::sub_slice($c, $sizep, $step)\";\n\t  }\n\t  elsif ($a < 0.3) {\n\t    @sub_index = ();\n\t    @sortind = 0 .. ($sm-1);\n\t    while (@sortind)\n\t      { push (@sub_index, splice(@sortind , rand @sortind, 1)); }\n\t    @sub_index = @sub_index[0..$sizep-1];\n\t    @sub_index = sort numerique @sub_index;\n\t    if ($sizep == 0)\n\t      { $li = \"$li\\n      gmm::size_type param_t$j [1] = {0};\"; }\n\t    else {\n\t      $li=\"$li\\n      gmm::size_type param_t$j [$sizep]= {$sub_index[0]\";\n\t      for ($k = 1; $k < $sizep; ++$k) { $li = \"$li , $sub_index[$k]\"; }\n\t      $li = \"$li};\";\n\t    }\n\t    $sub1 = \"gmm::sub_index(&param_t$j [0], &param_t$j [$sizep])\";\n\t  }\n\t  if ($b < 0.1) {\n\t    $c = int(1.0*($sn-$s+1)*rand());\n\t    $sub2 = \"gmm::sub_interval($c, $s)\";\n\t  }\n\t  elsif ($b < 0.2) {\n\t    $step = $s; if ($step == 0) { ++$step; }\n\t    $step = int(1.0*int($sn/$step - 1)*rand()) + 1;\n\t    $c = int(1.0*($sn-($s*$step+1))*rand());\n\t    $sub2 = \"gmm::sub_slice($c, $s, $step)\";\n\t  }\n\t  elsif ($b < 0.3) {\n\t    @sub_index = ();\n\t    @sortind = 0 .. ($sn-1);\n\t    while (@sortind)\n\t      { push (@sub_index, splice(@sortind , rand @sortind, 1)); }\n\t    @sub_index = @sub_index[0..$s-1];\n\t    @sub_index = sort numerique @sub_index;\n\t    if ($s == 0)\n\t      { $li = \"$li\\n      gmm::size_type param_u$j [1] = {0};\"; }\n\t    else {\n\t      $li=\"$li\\n      gmm::size_type param_u$j [$s] = {$sub_index[0]\";\n\t      for ($k = 1; $k < $s; ++$k) { $li = \"$li , $sub_index[$k]\"; }\n\t      $li = \"$li};\";\n\t    }\n\t    $sub2 = \"gmm::sub_index(&param_u$j [0], &param_u$j [$s])\";\n\t  }\n\t  $param_name[$j] = \"gmm::sub_matrix(param$j, $sub1, $sub2)\";\n\t}\n\tif (1.0 * rand() < 0.5) {\n\t  print TMPF \"$li\\n      gmm::fill_random(param$j);\\n\";\n\t}\n\telse {\n\t  print TMPF \"$li\\n      gmm::fill_random(param$j, 0.2);\\n\";\n\t}\n\t$sizep = $s;\n      }\n#      print \"$li ($param_name[$j])\\n\";\n    }\n    print TMPF \"    \\n\\n      bool ret = test_procedure($param_name[0]\";\n    for ($j = 1; $j < $nb_param; ++$j) { print TMPF \", $param_name[$j]\"; }\n    print TMPF \");\\n\";\n    print TMPF \"      if (ret) return 0;\\n\\n\";\n    print TMPF \"    }\\n\";\n    print TMPF \"    GMM_STANDARD_CATCH_ERROR;\\n\";\n    print TMPF \"  }\\n\";\n    print TMPF \"  return 0;\\n\";\n    print TMPF \"}\\n\";\n\n    close(DATAF);\n    close(TMPF);\n\n    `rm -f $root_name`;\n\n    $compilo=`../gmm-config --cxx` || die('cannot execute ../gmm-config --cxx'); chomp($compilo);\n    $compile_options=`../gmm-config --build-flags`;\n    chomp($compile_options);\n    $compile_options=\"$compile_options -I$srcdir/../src -I$srcdir/../include -I../src -I../include\";\n    $compile_libs=\"-lm\";\n\n    if ($with_lapack) {\n      $compile_libs=\"-llapack -lblas -lg2c $compile_libs\";\n      $compile_options=\"$compile_options -DGMM_USES_LAPACK\"\n    }\n    if ($with_qd) { $compile_libs=\"-lqd $compile_libs\"; }\n#   print \"$compilo $compile_options $dest_name -o $root_name $compile_libs\\n\";\n    print `$compilo $compile_options $dest_name -o $root_name $compile_libs`;\n\n    if ($? != 0) {\n      print \"$compilo $compile_options $dest_name -o $root_name $compile_libs\\n\";\n      print \"\\n******************************************************\\n\";\n      print \"* Compilation error, please submit this bug to\\n\";\n      print \"* Yves.Renard\\@insa-lyon.fr, with the file\\n\";\n      print \"* $dest_name\\n\";\n      print \"* produced in directory \\\"tests\\\".\\n\";\n      print \"******************************************************\\n\";\n      exit(1);\n    }\n    print `./$root_name`;\n    if ($? != 0) {\n      print \"$compilo $compile_options $dest_name -o $root_name $compile_libs\\n\";\n      print \"\\n******************************************************\\n\";\n      print \"* Execution error, please submit this bug to\\n\";\n      print \"* Yves.Renard\\@insa-lyon.fr, with the file\\n\";\n      print \"* $dest_name\\n\";\n      print \"* produced in directory \\\"tests\\\".\\n\";\n      print \"******************************************************\\n\";\n      exit(1);\n    }\n#    `rm -f $dest_name`;\n\n  }\n\n}\n"
  },
  {
    "path": "libs/eigen/CMakeLists.txt",
    "content": "project(Eigen)\ncmake_minimum_required(VERSION 2.8.5)\n\n# guard against in-source builds\n\nif(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR})\n  message(FATAL_ERROR \"In-source builds not allowed. Please make a new directory (called a build directory) and run CMake from there. You may need to remove CMakeCache.txt. \")\nendif()\n\n# guard against bad build-type strings\n\nif (NOT CMAKE_BUILD_TYPE)\n  set(CMAKE_BUILD_TYPE \"Release\")\nendif()\n\nstring(TOLOWER \"${CMAKE_BUILD_TYPE}\" cmake_build_type_tolower)\nif(    NOT cmake_build_type_tolower STREQUAL \"debug\"\n   AND NOT cmake_build_type_tolower STREQUAL \"release\"\n   AND NOT cmake_build_type_tolower STREQUAL \"relwithdebinfo\")\n  message(FATAL_ERROR \"Unknown build type \\\"${CMAKE_BUILD_TYPE}\\\". Allowed values are Debug, Release, RelWithDebInfo (case-insensitive).\")\nendif()\n\n\n#############################################################################\n# retrieve version infomation                                               #\n#############################################################################\n\n# automatically parse the version number\nfile(READ \"${PROJECT_SOURCE_DIR}/Eigen/src/Core/util/Macros.h\" _eigen_version_header)\nstring(REGEX MATCH \"define[ \\t]+EIGEN_WORLD_VERSION[ \\t]+([0-9]+)\" _eigen_world_version_match \"${_eigen_version_header}\")\nset(EIGEN_WORLD_VERSION \"${CMAKE_MATCH_1}\")\nstring(REGEX MATCH \"define[ \\t]+EIGEN_MAJOR_VERSION[ \\t]+([0-9]+)\" _eigen_major_version_match \"${_eigen_version_header}\")\nset(EIGEN_MAJOR_VERSION \"${CMAKE_MATCH_1}\")\nstring(REGEX MATCH \"define[ \\t]+EIGEN_MINOR_VERSION[ \\t]+([0-9]+)\" _eigen_minor_version_match \"${_eigen_version_header}\")\nset(EIGEN_MINOR_VERSION \"${CMAKE_MATCH_1}\")\nset(EIGEN_VERSION_NUMBER ${EIGEN_WORLD_VERSION}.${EIGEN_MAJOR_VERSION}.${EIGEN_MINOR_VERSION})\n\n# if the mercurial program is absent, this will leave the EIGEN_HG_CHANGESET string empty,\n# but won't stop CMake.\nexecute_process(COMMAND hg tip -R ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE EIGEN_HGTIP_OUTPUT)\nexecute_process(COMMAND hg branch -R ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE EIGEN_BRANCH_OUTPUT)\n\n# if this is the default (aka development) branch, extract the mercurial changeset number from the hg tip output...\nif(EIGEN_BRANCH_OUTPUT MATCHES \"default\")\nstring(REGEX MATCH \"^changeset: *[0-9]*:([0-9;a-f]+).*\" EIGEN_HG_CHANGESET_MATCH \"${EIGEN_HGTIP_OUTPUT}\")\nset(EIGEN_HG_CHANGESET \"${CMAKE_MATCH_1}\")\nendif(EIGEN_BRANCH_OUTPUT MATCHES \"default\")\n#...and show it next to the version number\nif(EIGEN_HG_CHANGESET)\n  set(EIGEN_VERSION \"${EIGEN_VERSION_NUMBER} (mercurial changeset ${EIGEN_HG_CHANGESET})\")\nelse(EIGEN_HG_CHANGESET)\n  set(EIGEN_VERSION \"${EIGEN_VERSION_NUMBER}\")\nendif(EIGEN_HG_CHANGESET)\n\n\ninclude(CheckCXXCompilerFlag)\ninclude(GNUInstallDirs)\n\nset(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)\n\n#############################################################################\n# find how to link to the standard libraries                                #\n#############################################################################\n\nfind_package(StandardMathLibrary)\n\n\nset(EIGEN_TEST_CUSTOM_LINKER_FLAGS  \"\" CACHE STRING \"Additional linker flags when linking unit tests.\")\nset(EIGEN_TEST_CUSTOM_CXX_FLAGS     \"\" CACHE STRING \"Additional compiler flags when compiling unit tests.\")\n\nset(EIGEN_STANDARD_LIBRARIES_TO_LINK_TO \"\")\n\nif(NOT STANDARD_MATH_LIBRARY_FOUND)\n\n  message(FATAL_ERROR\n    \"Can't link to the standard math library. Please report to the Eigen developers, telling them about your platform.\")\n\nelse()\n\n  if(EIGEN_STANDARD_LIBRARIES_TO_LINK_TO)\n    set(EIGEN_STANDARD_LIBRARIES_TO_LINK_TO \"${EIGEN_STANDARD_LIBRARIES_TO_LINK_TO} ${STANDARD_MATH_LIBRARY}\")\n  else()\n    set(EIGEN_STANDARD_LIBRARIES_TO_LINK_TO \"${STANDARD_MATH_LIBRARY}\")\n  endif()\n\nendif()\n\nif(EIGEN_STANDARD_LIBRARIES_TO_LINK_TO)\n  message(STATUS \"Standard libraries to link to explicitly: ${EIGEN_STANDARD_LIBRARIES_TO_LINK_TO}\")\nelse()\n  message(STATUS \"Standard libraries to link to explicitly: none\")\nendif()\n\noption(EIGEN_BUILD_BTL \"Build benchmark suite\" OFF)\nif(NOT WIN32)\n  option(EIGEN_BUILD_PKGCONFIG \"Build pkg-config .pc file for Eigen\" ON)\nendif(NOT WIN32)\n\nset(CMAKE_INCLUDE_CURRENT_DIR ON)\n\noption(EIGEN_SPLIT_LARGE_TESTS \"Split large tests into smaller executables\" ON)\n\noption(EIGEN_DEFAULT_TO_ROW_MAJOR \"Use row-major as default matrix storage order\" OFF)\nif(EIGEN_DEFAULT_TO_ROW_MAJOR)\n  add_definitions(\"-DEIGEN_DEFAULT_TO_ROW_MAJOR\")\nendif()\n\nset(EIGEN_TEST_MAX_SIZE \"320\" CACHE STRING \"Maximal matrix/vector size, default is 320\")\n\nmacro(ei_add_cxx_compiler_flag FLAG)\n  string(REGEX REPLACE \"-\" \"\" SFLAG ${FLAG})\n  check_cxx_compiler_flag(${FLAG} COMPILER_SUPPORT_${SFLAG})\n  if(COMPILER_SUPPORT_${SFLAG})\n    set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} ${FLAG}\")\n  endif()\nendmacro(ei_add_cxx_compiler_flag)\n\nif(NOT MSVC)\n  # We assume that other compilers are partly compatible with GNUCC\n  \n  set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -fexceptions\")\n  set(CMAKE_CXX_FLAGS_DEBUG \"-g3\")\n  set(CMAKE_CXX_FLAGS_RELEASE \"-g0 -O2\")\n  \n  # clang outputs some warnings for unknwon flags that are not caught by check_cxx_compiler_flag\n  # adding -Werror turns such warnings into errors\n  check_cxx_compiler_flag(\"-Werror\" COMPILER_SUPPORT_WERROR)\n  if(COMPILER_SUPPORT_WERROR)\n    set(CMAKE_REQUIRED_FLAGS \"-Werror\")\n  endif()\n  \n  ei_add_cxx_compiler_flag(\"-pedantic\")\n  ei_add_cxx_compiler_flag(\"-Wall\")\n  ei_add_cxx_compiler_flag(\"-Wextra\")\n  #ei_add_cxx_compiler_flag(\"-Weverything\")              # clang\n  \n  ei_add_cxx_compiler_flag(\"-Wundef\")\n  ei_add_cxx_compiler_flag(\"-Wcast-align\")\n  ei_add_cxx_compiler_flag(\"-Wchar-subscripts\")\n  ei_add_cxx_compiler_flag(\"-Wnon-virtual-dtor\")\n  ei_add_cxx_compiler_flag(\"-Wunused-local-typedefs\")\n  ei_add_cxx_compiler_flag(\"-Wpointer-arith\")\n  ei_add_cxx_compiler_flag(\"-Wwrite-strings\")\n  ei_add_cxx_compiler_flag(\"-Wformat-security\")\n  \n  ei_add_cxx_compiler_flag(\"-Wno-psabi\")\n  ei_add_cxx_compiler_flag(\"-Wno-variadic-macros\")\n  ei_add_cxx_compiler_flag(\"-Wno-long-long\")\n  \n  ei_add_cxx_compiler_flag(\"-fno-check-new\")\n  ei_add_cxx_compiler_flag(\"-fno-common\")\n  ei_add_cxx_compiler_flag(\"-fstrict-aliasing\")\n  ei_add_cxx_compiler_flag(\"-wd981\")                    # disable ICC's \"operands are evaluated in unspecified order\" remark\n  ei_add_cxx_compiler_flag(\"-wd2304\")                   # disbale ICC's \"warning #2304: non-explicit constructor with single argument may cause implicit type conversion\" produced by -Wnon-virtual-dtor\n  \n  # The -ansi flag must be added last, otherwise it is also used as a linker flag by check_cxx_compiler_flag making it fails\n  # Moreover we should not set both -strict-ansi and -ansi\n  check_cxx_compiler_flag(\"-strict-ansi\" COMPILER_SUPPORT_STRICTANSI)\n  ei_add_cxx_compiler_flag(\"-Qunused-arguments\")        # disable clang warning: argument unused during compilation: '-ansi'\n  \n  if(COMPILER_SUPPORT_STRICTANSI)\n    set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -strict-ansi\")\n  else()\n    ei_add_cxx_compiler_flag(\"-ansi\")\n  endif()\n  \n  set(CMAKE_REQUIRED_FLAGS \"\")\n\n  option(EIGEN_TEST_SSE2 \"Enable/Disable SSE2 in tests/examples\" OFF)\n  if(EIGEN_TEST_SSE2)\n    set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -msse2\")\n    message(STATUS \"Enabling SSE2 in tests/examples\")\n  endif()\n\n  option(EIGEN_TEST_SSE3 \"Enable/Disable SSE3 in tests/examples\" OFF)\n  if(EIGEN_TEST_SSE3)\n    set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -msse3\")\n    message(STATUS \"Enabling SSE3 in tests/examples\")\n  endif()\n\n  option(EIGEN_TEST_SSSE3 \"Enable/Disable SSSE3 in tests/examples\" OFF)\n  if(EIGEN_TEST_SSSE3)\n    set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -mssse3\")\n    message(STATUS \"Enabling SSSE3 in tests/examples\")\n  endif()\n\n  option(EIGEN_TEST_SSE4_1 \"Enable/Disable SSE4.1 in tests/examples\" OFF)\n  if(EIGEN_TEST_SSE4_1)\n    set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -msse4.1\")\n    message(STATUS \"Enabling SSE4.1 in tests/examples\")\n  endif()\n\n  option(EIGEN_TEST_SSE4_2 \"Enable/Disable SSE4.2 in tests/examples\" OFF)\n  if(EIGEN_TEST_SSE4_2)\n    set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -msse4.2\")\n    message(STATUS \"Enabling SSE4.2 in tests/examples\")\n  endif()\n\n  option(EIGEN_TEST_ALTIVEC \"Enable/Disable AltiVec in tests/examples\" OFF)\n  if(EIGEN_TEST_ALTIVEC)\n    set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -maltivec -mabi=altivec\")\n    message(STATUS \"Enabling AltiVec in tests/examples\")\n  endif()\n\n  option(EIGEN_TEST_NEON \"Enable/Disable Neon in tests/examples\" OFF)\n  if(EIGEN_TEST_NEON)\n    set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -mfpu=neon -mcpu=cortex-a8\")\n    message(STATUS \"Enabling NEON in tests/examples\")\n  endif()\n\n  check_cxx_compiler_flag(\"-fopenmp\" COMPILER_SUPPORT_OPENMP)\n  if(COMPILER_SUPPORT_OPENMP)\n    option(EIGEN_TEST_OPENMP \"Enable/Disable OpenMP in tests/examples\" OFF)\n    if(EIGEN_TEST_OPENMP)\n      set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -fopenmp\")\n      message(STATUS \"Enabling OpenMP in tests/examples\")\n    endif()\n  endif()\n\nelse(NOT MSVC)\n\n  # C4127 - conditional expression is constant\n  # C4714 - marked as __forceinline not inlined (I failed to deactivate it selectively)\n  #         We can disable this warning in the unit tests since it is clear that it occurs\n  #         because we are oftentimes returning objects that have a destructor or may\n  #         throw exceptions - in particular in the unit tests we are throwing extra many\n  #         exceptions to cover indexing errors.\n  # C4505 - unreferenced local function has been removed (impossible to deactive selectively)\n  set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} /EHsc /wd4127 /wd4505 /wd4714\")\n\n  # replace all /Wx by /W4\n  string(REGEX REPLACE \"/W[0-9]\" \"/W4\" CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS}\")\n\n  check_cxx_compiler_flag(\"/openmp\" COMPILER_SUPPORT_OPENMP)\n  if(COMPILER_SUPPORT_OPENMP)\n    option(EIGEN_TEST_OPENMP \"Enable/Disable OpenMP in tests/examples\" OFF)\n    if(EIGEN_TEST_OPENMP)\n      set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} /openmp\")\n      message(STATUS \"Enabling OpenMP in tests/examples\")\n    endif()\n  endif()\n\n  option(EIGEN_TEST_SSE2 \"Enable/Disable SSE2 in tests/examples\" OFF)\n  if(EIGEN_TEST_SSE2)\n    if(NOT CMAKE_CL_64)\n      # arch is not supported on 64 bit systems, SSE is enabled automatically.\n      set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} /arch:SSE2\")\n    endif(NOT CMAKE_CL_64)\n    message(STATUS \"Enabling SSE2 in tests/examples\")\n  endif(EIGEN_TEST_SSE2)\nendif(NOT MSVC)\n\noption(EIGEN_TEST_NO_EXPLICIT_VECTORIZATION \"Disable explicit vectorization in tests/examples\" OFF)\noption(EIGEN_TEST_X87 \"Force using X87 instructions. Implies no vectorization.\" OFF)\noption(EIGEN_TEST_32BIT \"Force generating 32bit code.\" OFF)\n\nif(EIGEN_TEST_X87)\n  set(EIGEN_TEST_NO_EXPLICIT_VECTORIZATION ON)\n  if(CMAKE_COMPILER_IS_GNUCXX)\n    set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -mfpmath=387\")\n    message(STATUS \"Forcing use of x87 instructions in tests/examples\")\n  else()\n    message(STATUS \"EIGEN_TEST_X87 ignored on your compiler\")\n  endif()\nendif()\n\nif(EIGEN_TEST_32BIT)\n  if(CMAKE_COMPILER_IS_GNUCXX)\n    set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -m32\")\n    message(STATUS \"Forcing generation of 32-bit code in tests/examples\")\n  else()\n    message(STATUS \"EIGEN_TEST_32BIT ignored on your compiler\")\n  endif()\nendif()\n\nif(EIGEN_TEST_NO_EXPLICIT_VECTORIZATION)\n  add_definitions(-DEIGEN_DONT_VECTORIZE=1)\n  message(STATUS \"Disabling vectorization in tests/examples\")\nendif()\n\noption(EIGEN_TEST_NO_EXPLICIT_ALIGNMENT \"Disable explicit alignment (hence vectorization) in tests/examples\" OFF)\nif(EIGEN_TEST_NO_EXPLICIT_ALIGNMENT)\n  add_definitions(-DEIGEN_DONT_ALIGN=1)\n  message(STATUS \"Disabling alignment in tests/examples\")\nendif()\n\noption(EIGEN_TEST_C++0x \"Enables all C++0x features.\" OFF)\n\ninclude_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})\n\n# Backward compatibility support for EIGEN_INCLUDE_INSTALL_DIR\nif(EIGEN_INCLUDE_INSTALL_DIR AND NOT INCLUDE_INSTALL_DIR)\n  set(INCLUDE_INSTALL_DIR ${EIGEN_INCLUDE_INSTALL_DIR}\n      CACHE PATH \"The directory relative to CMAKE_PREFIX_PATH where Eigen header files are installed\")\nelse()\n  set(INCLUDE_INSTALL_DIR\n      \"${CMAKE_INSTALL_INCLUDEDIR}/eigen3\"\n      CACHE PATH \"The directory relative to CMAKE_PREFIX_PATH where Eigen header files are installed\"\n      )\nendif()\n\nset(CMAKEPACKAGE_INSTALL_DIR\n    \"${CMAKE_INSTALL_LIBDIR}/cmake/eigen3\"\n    CACHE PATH \"The directory relative to CMAKE_PREFIX_PATH where Eigen3Config.cmake is installed\"\n    )\nset(PKGCONFIG_INSTALL_DIR\n    \"${CMAKE_INSTALL_DATADIR}/pkgconfig\"\n    CACHE PATH \"The directory relative to CMAKE_PREFIX_PATH where eigen3.pc is installed\"\n    )\n\n# similar to set_target_properties but append the property instead of overwriting it\nmacro(ei_add_target_property target prop value)\n\n  get_target_property(previous ${target} ${prop})\n  # if the property wasn't previously set, ${previous} is now \"previous-NOTFOUND\" which cmake allows catching with plain if()\n  if(NOT previous)\n    set(previous \"\")\n  endif(NOT previous)\n  set_target_properties(${target} PROPERTIES ${prop} \"${previous} ${value}\")\nendmacro(ei_add_target_property)\n\ninstall(FILES\n  signature_of_eigen3_matrix_library\n  DESTINATION ${INCLUDE_INSTALL_DIR} COMPONENT Devel\n  )\n\nif(EIGEN_BUILD_PKGCONFIG)\n    configure_file(eigen3.pc.in eigen3.pc @ONLY)\n    install(FILES ${CMAKE_CURRENT_BINARY_DIR}/eigen3.pc\n        DESTINATION ${PKGCONFIG_INSTALL_DIR}\n        )\nendif(EIGEN_BUILD_PKGCONFIG)\n\nadd_subdirectory(Eigen)\n\nadd_subdirectory(doc EXCLUDE_FROM_ALL)\n\ninclude(EigenConfigureTesting)\n\n# fixme, not sure this line is still needed:\nenable_testing() # must be called from the root CMakeLists, see man page\n\n\nif(EIGEN_LEAVE_TEST_IN_ALL_TARGET)\n  add_subdirectory(test) # can't do EXCLUDE_FROM_ALL here, breaks CTest\nelse()\n  add_subdirectory(test EXCLUDE_FROM_ALL)\nendif()\n\nif(EIGEN_LEAVE_TEST_IN_ALL_TARGET)\n  add_subdirectory(blas)\n  add_subdirectory(lapack)\nelse()\n  add_subdirectory(blas EXCLUDE_FROM_ALL)\n  add_subdirectory(lapack EXCLUDE_FROM_ALL)\nendif()\n\nadd_subdirectory(unsupported)\n\nadd_subdirectory(demos EXCLUDE_FROM_ALL)\n\n# must be after test and unsupported, for configuring buildtests.in\nadd_subdirectory(scripts EXCLUDE_FROM_ALL)\n\n# TODO: consider also replacing EIGEN_BUILD_BTL by a custom target \"make btl\"?\nif(EIGEN_BUILD_BTL)\n  add_subdirectory(bench/btl EXCLUDE_FROM_ALL)\nendif(EIGEN_BUILD_BTL)\n\nif(NOT WIN32)\n  add_subdirectory(bench/spbench EXCLUDE_FROM_ALL)\nendif(NOT WIN32)\n\nconfigure_file(scripts/cdashtesting.cmake.in cdashtesting.cmake @ONLY)\n\nei_testing_print_summary()\n\nmessage(STATUS \"\")\nmessage(STATUS \"Configured Eigen ${EIGEN_VERSION_NUMBER}\")\nmessage(STATUS \"\")\n\noption(EIGEN_FAILTEST \"Enable failtests.\" OFF)\nif(EIGEN_FAILTEST)\n  add_subdirectory(failtest)\nendif()\n\nstring(TOLOWER \"${CMAKE_GENERATOR}\" cmake_generator_tolower)\nif(cmake_generator_tolower MATCHES \"makefile\")\n  message(STATUS \"Some things you can do now:\")\n  message(STATUS \"--------------+--------------------------------------------------------------\")\n  message(STATUS \"Command       |   Description\")\n  message(STATUS \"--------------+--------------------------------------------------------------\")\n  message(STATUS \"make install  | Install Eigen. Headers will be installed to:\")\n  message(STATUS \"              |     <CMAKE_INSTALL_PREFIX>/<INCLUDE_INSTALL_DIR>\")\n  message(STATUS \"              |   Using the following values:\")\n  message(STATUS \"              |     CMAKE_INSTALL_PREFIX: ${CMAKE_INSTALL_PREFIX}\")\n  message(STATUS \"              |     INCLUDE_INSTALL_DIR:  ${INCLUDE_INSTALL_DIR}\")\n  message(STATUS \"              |   Change the install location of Eigen headers using:\")\n  message(STATUS \"              |     cmake . -DCMAKE_INSTALL_PREFIX=yourprefix\")\n  message(STATUS \"              |   Or:\")\n  message(STATUS \"              |     cmake . -DINCLUDE_INSTALL_DIR=yourdir\")\n  message(STATUS \"make doc      | Generate the API documentation, requires Doxygen & LaTeX\")\n  message(STATUS \"make check    | Build and run the unit-tests. Read this page:\")\n  message(STATUS \"              |   http://eigen.tuxfamily.org/index.php?title=Tests\")\n  message(STATUS \"make blas     | Build BLAS library (not the same thing as Eigen)\")\n  message(STATUS \"--------------+--------------------------------------------------------------\")\nelse()\n  message(STATUS \"To build/run the unit tests, read this page:\")\n  message(STATUS \"  http://eigen.tuxfamily.org/index.php?title=Tests\")\nendif()\n\nmessage(STATUS \"\")\n"
  },
  {
    "path": "libs/eigen/COPYING.BSD",
    "content": "/*\n Copyright (c) 2011, Intel Corporation. All rights reserved.\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n * Neither the name of Intel Corporation nor the names of its contributors may\n   be used to endorse or promote products derived from this software without\n   specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\n ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/"
  },
  {
    "path": "libs/eigen/COPYING.GPL",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://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 <http://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<http://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<http://www.gnu.org/philosophy/why-not-lgpl.html>.\n"
  },
  {
    "path": "libs/eigen/COPYING.LGPL",
    "content": "                  GNU LESSER GENERAL PUBLIC LICENSE\n                       Version 2.1, February 1999\n\n Copyright (C) 1991, 1999 Free Software Foundation, Inc.\n 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n[This is the first released version of the Lesser GPL.  It also counts\n as the successor of the GNU Library Public License, version 2, hence\n the version number 2.1.]\n\n                            Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicenses are intended to guarantee your freedom to share and change\nfree software--to make sure the software is free for all its users.\n\n  This license, the Lesser General Public License, applies to some\nspecially designated software packages--typically libraries--of the\nFree Software Foundation and other authors who decide to use it.  You\ncan use it too, but we suggest you first think carefully about whether\nthis license or the ordinary General Public License is the better\nstrategy to use in any particular case, based on the explanations below.\n\n  When we speak of free software, we are referring to freedom of use,\nnot price.  Our General Public Licenses are designed to make sure that\nyou have the freedom to distribute copies of free software (and charge\nfor this service if you wish); that you receive source code or can get\nit if you want it; that you can change the software and use pieces of\nit in new free programs; and that you are informed that you can do\nthese things.\n\n  To protect your rights, we need to make restrictions that forbid\ndistributors to deny you these rights or to ask you to surrender these\nrights.  These restrictions translate to certain responsibilities for\nyou if you distribute copies of the library or if you modify it.\n\n  For example, if you distribute copies of the library, whether gratis\nor for a fee, you must give the recipients all the rights that we gave\nyou.  You must make sure that they, too, receive or can get the source\ncode.  If you link other code with the library, you must provide\ncomplete object files to the recipients, so that they can relink them\nwith the library after making changes to the library and recompiling\nit.  And you must show them these terms so they know their rights.\n\n  We protect your rights with a two-step method: (1) we copyright the\nlibrary, and (2) we offer you this license, which gives you legal\npermission to copy, distribute and/or modify the library.\n\n  To protect each distributor, we want to make it very clear that\nthere is no warranty for the free library.  Also, if the library is\nmodified by someone else and passed on, the recipients should know\nthat what they have is not the original version, so that the original\nauthor's reputation will not be affected by problems that might be\nintroduced by others.\n\f\n  Finally, software patents pose a constant threat to the existence of\nany free program.  We wish to make sure that a company cannot\neffectively restrict the users of a free program by obtaining a\nrestrictive license from a patent holder.  Therefore, we insist that\nany patent license obtained for a version of the library must be\nconsistent with the full freedom of use specified in this license.\n\n  Most GNU software, including some libraries, is covered by the\nordinary GNU General Public License.  This license, the GNU Lesser\nGeneral Public License, applies to certain designated libraries, and\nis quite different from the ordinary General Public License.  We use\nthis license for certain libraries in order to permit linking those\nlibraries into non-free programs.\n\n  When a program is linked with a library, whether statically or using\na shared library, the combination of the two is legally speaking a\ncombined work, a derivative of the original library.  The ordinary\nGeneral Public License therefore permits such linking only if the\nentire combination fits its criteria of freedom.  The Lesser General\nPublic License permits more lax criteria for linking other code with\nthe library.\n\n  We call this license the \"Lesser\" General Public License because it\ndoes Less to protect the user's freedom than the ordinary General\nPublic License.  It also provides other free software developers Less\nof an advantage over competing non-free programs.  These disadvantages\nare the reason we use the ordinary General Public License for many\nlibraries.  However, the Lesser license provides advantages in certain\nspecial circumstances.\n\n  For example, on rare occasions, there may be a special need to\nencourage the widest possible use of a certain library, so that it becomes\na de-facto standard.  To achieve this, non-free programs must be\nallowed to use the library.  A more frequent case is that a free\nlibrary does the same job as widely used non-free libraries.  In this\ncase, there is little to gain by limiting the free library to free\nsoftware only, so we use the Lesser General Public License.\n\n  In other cases, permission to use a particular library in non-free\nprograms enables a greater number of people to use a large body of\nfree software.  For example, permission to use the GNU C Library in\nnon-free programs enables many more people to use the whole GNU\noperating system, as well as its variant, the GNU/Linux operating\nsystem.\n\n  Although the Lesser General Public License is Less protective of the\nusers' freedom, it does ensure that the user of a program that is\nlinked with the Library has the freedom and the wherewithal to run\nthat program using a modified version of the Library.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.  Pay close attention to the difference between a\n\"work based on the library\" and a \"work that uses the library\".  The\nformer contains code derived from the library, whereas the latter must\nbe combined with the library in order to run.\n\f\n                  GNU LESSER GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License Agreement applies to any software library or other\nprogram which contains a notice placed by the copyright holder or\nother authorized party saying it may be distributed under the terms of\nthis Lesser General Public License (also called \"this License\").\nEach licensee is addressed as \"you\".\n\n  A \"library\" means a collection of software functions and/or data\nprepared so as to be conveniently linked with application programs\n(which use some of those functions and data) to form executables.\n\n  The \"Library\", below, refers to any such software library or work\nwhich has been distributed under these terms.  A \"work based on the\nLibrary\" means either the Library or any derivative work under\ncopyright law: that is to say, a work containing the Library or a\nportion of it, either verbatim or with modifications and/or translated\nstraightforwardly into another language.  (Hereinafter, translation is\nincluded without limitation in the term \"modification\".)\n\n  \"Source code\" for a work means the preferred form of the work for\nmaking modifications to it.  For a library, complete source code means\nall the source code for all modules it contains, plus any associated\ninterface definition files, plus the scripts used to control compilation\nand installation of the library.\n\n  Activities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning a program using the Library is not restricted, and output from\nsuch a program is covered only if its contents constitute a work based\non the Library (independent of the use of the Library in a tool for\nwriting it).  Whether that is true depends on what the Library does\nand what the program that uses the Library does.\n\n  1. You may copy and distribute verbatim copies of the Library's\ncomplete source code as you receive it, in any medium, provided that\nyou conspicuously and appropriately publish on each copy an\nappropriate copyright notice and disclaimer of warranty; keep intact\nall the notices that refer to this License and to the absence of any\nwarranty; and distribute a copy of this License along with the\nLibrary.\n\n  You may charge a fee for the physical act of transferring a copy,\nand you may at your option offer warranty protection in exchange for a\nfee.\n\f\n  2. You may modify your copy or copies of the Library or any portion\nof it, thus forming a work based on the Library, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) The modified work must itself be a software library.\n\n    b) You must cause the files modified to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    c) You must cause the whole of the work to be licensed at no\n    charge to all third parties under the terms of this License.\n\n    d) If a facility in the modified Library refers to a function or a\n    table of data to be supplied by an application program that uses\n    the facility, other than as an argument passed when the facility\n    is invoked, then you must make a good faith effort to ensure that,\n    in the event an application does not supply such function or\n    table, the facility still operates, and performs whatever part of\n    its purpose remains meaningful.\n\n    (For example, a function in a library to compute square roots has\n    a purpose that is entirely well-defined independent of the\n    application.  Therefore, Subsection 2d requires that any\n    application-supplied function or table used by this function must\n    be optional: if the application does not supply it, the square\n    root function must still compute square roots.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Library,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Library, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote\nit.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Library.\n\nIn addition, mere aggregation of another work not based on the Library\nwith the Library (or with a work based on the Library) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may opt to apply the terms of the ordinary GNU General Public\nLicense instead of this License to a given copy of the Library.  To do\nthis, you must alter all the notices that refer to this License, so\nthat they refer to the ordinary GNU General Public License, version 2,\ninstead of to this License.  (If a newer version than version 2 of the\nordinary GNU General Public License has appeared, then you can specify\nthat version instead if you wish.)  Do not make any other change in\nthese notices.\n\f\n  Once this change is made in a given copy, it is irreversible for\nthat copy, so the ordinary GNU General Public License applies to all\nsubsequent copies and derivative works made from that copy.\n\n  This option is useful when you wish to copy part of the code of\nthe Library into a program that is not a library.\n\n  4. You may copy and distribute the Library (or a portion or\nderivative of it, under Section 2) in object code or executable form\nunder the terms of Sections 1 and 2 above provided that you accompany\nit with the complete corresponding machine-readable source code, which\nmust be distributed under the terms of Sections 1 and 2 above on a\nmedium customarily used for software interchange.\n\n  If distribution of object code is made by offering access to copy\nfrom a designated place, then offering equivalent access to copy the\nsource code from the same place satisfies the requirement to\ndistribute the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  5. A program that contains no derivative of any portion of the\nLibrary, but is designed to work with the Library by being compiled or\nlinked with it, is called a \"work that uses the Library\".  Such a\nwork, in isolation, is not a derivative work of the Library, and\ntherefore falls outside the scope of this License.\n\n  However, linking a \"work that uses the Library\" with the Library\ncreates an executable that is a derivative of the Library (because it\ncontains portions of the Library), rather than a \"work that uses the\nlibrary\".  The executable is therefore covered by this License.\nSection 6 states terms for distribution of such executables.\n\n  When a \"work that uses the Library\" uses material from a header file\nthat is part of the Library, the object code for the work may be a\nderivative work of the Library even though the source code is not.\nWhether this is true is especially significant if the work can be\nlinked without the Library, or if the work is itself a library.  The\nthreshold for this to be true is not precisely defined by law.\n\n  If such an object file uses only numerical parameters, data\nstructure layouts and accessors, and small macros and small inline\nfunctions (ten lines or less in length), then the use of the object\nfile is unrestricted, regardless of whether it is legally a derivative\nwork.  (Executables containing this object code plus portions of the\nLibrary will still fall under Section 6.)\n\n  Otherwise, if the work is a derivative of the Library, you may\ndistribute the object code for the work under the terms of Section 6.\nAny executables containing that work also fall under Section 6,\nwhether or not they are linked directly with the Library itself.\n\f\n  6. As an exception to the Sections above, you may also combine or\nlink a \"work that uses the Library\" with the Library to produce a\nwork containing portions of the Library, and distribute that work\nunder terms of your choice, provided that the terms permit\nmodification of the work for the customer's own use and reverse\nengineering for debugging such modifications.\n\n  You must give prominent notice with each copy of the work that the\nLibrary is used in it and that the Library and its use are covered by\nthis License.  You must supply a copy of this License.  If the work\nduring execution displays copyright notices, you must include the\ncopyright notice for the Library among them, as well as a reference\ndirecting the user to the copy of this License.  Also, you must do one\nof these things:\n\n    a) Accompany the work with the complete corresponding\n    machine-readable source code for the Library including whatever\n    changes were used in the work (which must be distributed under\n    Sections 1 and 2 above); and, if the work is an executable linked\n    with the Library, with the complete machine-readable \"work that\n    uses the Library\", as object code and/or source code, so that the\n    user can modify the Library and then relink to produce a modified\n    executable containing the modified Library.  (It is understood\n    that the user who changes the contents of definitions files in the\n    Library will not necessarily be able to recompile the application\n    to use the modified definitions.)\n\n    b) Use a suitable shared library mechanism for linking with the\n    Library.  A suitable mechanism is one that (1) uses at run time a\n    copy of the library already present on the user's computer system,\n    rather than copying library functions into the executable, and (2)\n    will operate properly with a modified version of the library, if\n    the user installs one, as long as the modified version is\n    interface-compatible with the version that the work was made with.\n\n    c) Accompany the work with a written offer, valid for at\n    least three years, to give the same user the materials\n    specified in Subsection 6a, above, for a charge no more\n    than the cost of performing this distribution.\n\n    d) If distribution of the work is made by offering access to copy\n    from a designated place, offer equivalent access to copy the above\n    specified materials from the same place.\n\n    e) Verify that the user has already received a copy of these\n    materials or that you have already sent this user a copy.\n\n  For an executable, the required form of the \"work that uses the\nLibrary\" must include any data and utility programs needed for\nreproducing the executable from it.  However, as a special exception,\nthe materials to be distributed need not include anything that is\nnormally distributed (in either source or binary form) with the major\ncomponents (compiler, kernel, and so on) of the operating system on\nwhich the executable runs, unless that component itself accompanies\nthe executable.\n\n  It may happen that this requirement contradicts the license\nrestrictions of other proprietary libraries that do not normally\naccompany the operating system.  Such a contradiction means you cannot\nuse both them and the Library together in an executable that you\ndistribute.\n\f\n  7. You may place library facilities that are a work based on the\nLibrary side-by-side in a single library together with other library\nfacilities not covered by this License, and distribute such a combined\nlibrary, provided that the separate distribution of the work based on\nthe Library and of the other library facilities is otherwise\npermitted, and provided that you do these two things:\n\n    a) Accompany the combined library with a copy of the same work\n    based on the Library, uncombined with any other library\n    facilities.  This must be distributed under the terms of the\n    Sections above.\n\n    b) Give prominent notice with the combined library of the fact\n    that part of it is a work based on the Library, and explaining\n    where to find the accompanying uncombined form of the same work.\n\n  8. You may not copy, modify, sublicense, link with, or distribute\nthe Library except as expressly provided under this License.  Any\nattempt otherwise to copy, modify, sublicense, link with, or\ndistribute the Library is void, and will automatically terminate your\nrights under this License.  However, parties who have received copies,\nor rights, from you under this License will not have their licenses\nterminated so long as such parties remain in full compliance.\n\n  9. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Library or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Library (or any work based on the\nLibrary), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Library or works based on it.\n\n  10. Each time you redistribute the Library (or any work based on the\nLibrary), the recipient automatically receives a license from the\noriginal licensor to copy, distribute, link with or modify the Library\nsubject to these terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties with\nthis License.\n\f\n  11. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions 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\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Library at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Library by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Library.\n\nIf any portion of this section is held invalid or unenforceable under any\nparticular circumstance, the balance of the section is intended to apply,\nand the section as a whole is intended to apply in other circumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  12. If the distribution and/or use of the Library is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Library under this License may add\nan explicit geographical distribution limitation excluding those countries,\nso that distribution is permitted only in or among countries not thus\nexcluded.  In such case, this License incorporates the limitation as if\nwritten in the body of this License.\n\n  13. The Free Software Foundation may publish revised and/or new\nversions of the Lesser General Public License from time to time.\nSuch new versions will be similar in spirit to the present version,\nbut may differ in detail to address new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Library\nspecifies a version number of this License which applies to it and\n\"any later version\", you have the option of following the terms and\nconditions either of that version or of any later version published by\nthe Free Software Foundation.  If the Library does not specify a\nlicense version number, you may choose any version ever published by\nthe Free Software Foundation.\n\f\n  14. If you wish to incorporate parts of the Library into other free\nprograms whose distribution conditions are incompatible with these,\nwrite to the author to ask for permission.  For software which is\ncopyrighted by the Free Software Foundation, write to the Free\nSoftware Foundation; we sometimes make exceptions for this.  Our\ndecision will be guided by the two goals of preserving the free status\nof all derivatives of our free software and of promoting the sharing\nand reuse of software generally.\n\n                            NO WARRANTY\n\n  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO\nWARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.\nEXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR\nOTHER PARTIES PROVIDE THE LIBRARY \"AS IS\" WITHOUT WARRANTY OF ANY\nKIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE\nLIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME\nTHE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN\nWRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY\nAND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU\nFOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR\nCONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE\nLIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING\nRENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A\nFAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF\nSUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGES.\n\n                     END OF TERMS AND CONDITIONS\n\f\n           How to Apply These Terms to Your New Libraries\n\n  If you develop a new library, and you want it to be of the greatest\npossible use to the public, we recommend making it free software that\neveryone can redistribute and change.  You can do so by permitting\nredistribution under these terms (or, alternatively, under the terms of the\nordinary General Public License).\n\n  To apply these terms, attach the following notices to the library.  It is\nsafest to attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least the\n\"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the library's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This library is free software; you can redistribute it and/or\n    modify it under the terms of the GNU Lesser General Public\n    License as published by the Free Software Foundation; either\n    version 2.1 of the License, or (at your option) any later version.\n\n    This library 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 GNU\n    Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public\n    License along with this library; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n\nAlso add information on how to contact you by electronic and paper mail.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the library, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the\n  library `Frob' (a library for tweaking knobs) written by James Random Hacker.\n\n  <signature of Ty Coon>, 1 April 1990\n  Ty Coon, President of Vice\n\nThat's all there is to it!\n"
  },
  {
    "path": "libs/eigen/COPYING.MINPACK",
    "content": "Minpack Copyright Notice (1999) University of Chicago.  All rights reserved\r\n\r\nRedistribution and use in source and binary forms, with or\r\nwithout modification, are permitted provided that the\r\nfollowing conditions are met:\r\n\r\n1. Redistributions of source code must retain the above\r\ncopyright notice, this list of conditions and the following\r\ndisclaimer.\r\n\r\n2. Redistributions in binary form must reproduce the above\r\ncopyright notice, this list of conditions and the following\r\ndisclaimer in the documentation and/or other materials\r\nprovided with the distribution.\r\n\r\n3. The end-user documentation included with the\r\nredistribution, if any, must include the following\r\nacknowledgment:\r\n\r\n   \"This product includes software developed by the\r\n   University of Chicago, as Operator of Argonne National\r\n   Laboratory.\r\n\r\nAlternately, this acknowledgment may appear in the software\r\nitself, if and wherever such third-party acknowledgments\r\nnormally appear.\r\n\r\n4. WARRANTY DISCLAIMER. THE SOFTWARE IS SUPPLIED \"AS IS\"\r\nWITHOUT WARRANTY OF ANY KIND. THE COPYRIGHT HOLDER, THE\r\nUNITED STATES, THE UNITED STATES DEPARTMENT OF ENERGY, AND\r\nTHEIR EMPLOYEES: (1) DISCLAIM ANY WARRANTIES, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO ANY IMPLIED WARRANTIES\r\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE\r\nOR NON-INFRINGEMENT, (2) DO NOT ASSUME ANY LEGAL LIABILITY\r\nOR RESPONSIBILITY FOR THE ACCURACY, COMPLETENESS, OR\r\nUSEFULNESS OF THE SOFTWARE, (3) DO NOT REPRESENT THAT USE OF\r\nTHE SOFTWARE WOULD NOT INFRINGE PRIVATELY OWNED RIGHTS, (4)\r\nDO NOT WARRANT THAT THE SOFTWARE WILL FUNCTION\r\nUNINTERRUPTED, THAT IT IS ERROR-FREE OR THAT ANY ERRORS WILL\r\nBE CORRECTED.\r\n\r\n5. LIMITATION OF LIABILITY. IN NO EVENT WILL THE COPYRIGHT\r\nHOLDER, THE UNITED STATES, THE UNITED STATES DEPARTMENT OF\r\nENERGY, OR THEIR EMPLOYEES: BE LIABLE FOR ANY INDIRECT,\r\nINCIDENTAL, CONSEQUENTIAL, SPECIAL OR PUNITIVE DAMAGES OF\r\nANY KIND OR NATURE, INCLUDING BUT NOT LIMITED TO LOSS OF\r\nPROFITS OR LOSS OF DATA, FOR ANY REASON WHATSOEVER, WHETHER\r\nSUCH LIABILITY IS ASSERTED ON THE BASIS OF CONTRACT, TORT\r\n(INCLUDING NEGLIGENCE OR STRICT LIABILITY), OR OTHERWISE,\r\nEVEN IF ANY OF SAID PARTIES HAS BEEN WARNED OF THE\r\nPOSSIBILITY OF SUCH LOSS OR DAMAGES.\r\n\r\n"
  },
  {
    "path": "libs/eigen/COPYING.MPL2",
    "content": "Mozilla Public License Version 2.0\n==================================\n\n1. Definitions\n--------------\n\n1.1. \"Contributor\"\n    means each individual or legal entity that creates, contributes to\n    the creation of, or owns Covered Software.\n\n1.2. \"Contributor Version\"\n    means the combination of the Contributions of others (if any) used\n    by a Contributor and that particular Contributor's Contribution.\n\n1.3. \"Contribution\"\n    means Covered Software of a particular Contributor.\n\n1.4. \"Covered Software\"\n    means Source Code Form to which the initial Contributor has attached\n    the notice in Exhibit A, the Executable Form of such Source Code\n    Form, and Modifications of such Source Code Form, in each case\n    including portions thereof.\n\n1.5. \"Incompatible With Secondary Licenses\"\n    means\n\n    (a) that the initial Contributor has attached the notice described\n        in Exhibit B to the Covered Software; or\n\n    (b) that the Covered Software was made available under the terms of\n        version 1.1 or earlier of the License, but not also under the\n        terms of a Secondary License.\n\n1.6. \"Executable Form\"\n    means any form of the work other than Source Code Form.\n\n1.7. \"Larger Work\"\n    means a work that combines Covered Software with other material, in \n    a separate file or files, that is not Covered Software.\n\n1.8. \"License\"\n    means this document.\n\n1.9. \"Licensable\"\n    means having the right to grant, to the maximum extent possible,\n    whether at the time of the initial grant or subsequently, any and\n    all of the rights conveyed by this License.\n\n1.10. \"Modifications\"\n    means any of the following:\n\n    (a) any file in Source Code Form that results from an addition to,\n        deletion from, or modification of the contents of Covered\n        Software; or\n\n    (b) any new file in Source Code Form that contains any Covered\n        Software.\n\n1.11. \"Patent Claims\" of a Contributor\n    means any patent claim(s), including without limitation, method,\n    process, and apparatus claims, in any patent Licensable by such\n    Contributor that would be infringed, but for the grant of the\n    License, by the making, using, selling, offering for sale, having\n    made, import, or transfer of either its Contributions or its\n    Contributor Version.\n\n1.12. \"Secondary License\"\n    means either the GNU General Public License, Version 2.0, the GNU\n    Lesser General Public License, Version 2.1, the GNU Affero General\n    Public License, Version 3.0, or any later versions of those\n    licenses.\n\n1.13. \"Source Code Form\"\n    means the form of the work preferred for making modifications.\n\n1.14. \"You\" (or \"Your\")\n    means an individual or a legal entity exercising rights under this\n    License. For legal entities, \"You\" includes any entity that\n    controls, is controlled by, or is under common control with You. For\n    purposes of this definition, \"control\" means (a) the power, direct\n    or indirect, to cause the direction or management of such entity,\n    whether by contract or otherwise, or (b) ownership of more than\n    fifty percent (50%) of the outstanding shares or beneficial\n    ownership of such entity.\n\n2. License Grants and Conditions\n--------------------------------\n\n2.1. Grants\n\nEach Contributor hereby grants You a world-wide, royalty-free,\nnon-exclusive license:\n\n(a) under intellectual property rights (other than patent or trademark)\n    Licensable by such Contributor to use, reproduce, make available,\n    modify, display, perform, distribute, and otherwise exploit its\n    Contributions, either on an unmodified basis, with Modifications, or\n    as part of a Larger Work; and\n\n(b) under Patent Claims of such Contributor to make, use, sell, offer\n    for sale, have made, import, and otherwise transfer either its\n    Contributions or its Contributor Version.\n\n2.2. Effective Date\n\nThe licenses granted in Section 2.1 with respect to any Contribution\nbecome effective for each Contribution on the date the Contributor first\ndistributes such Contribution.\n\n2.3. Limitations on Grant Scope\n\nThe licenses granted in this Section 2 are the only rights granted under\nthis License. No additional rights or licenses will be implied from the\ndistribution or licensing of Covered Software under this License.\nNotwithstanding Section 2.1(b) above, no patent license is granted by a\nContributor:\n\n(a) for any code that a Contributor has removed from Covered Software;\n    or\n\n(b) for infringements caused by: (i) Your and any other third party's\n    modifications of Covered Software, or (ii) the combination of its\n    Contributions with other software (except as part of its Contributor\n    Version); or\n\n(c) under Patent Claims infringed by Covered Software in the absence of\n    its Contributions.\n\nThis License does not grant any rights in the trademarks, service marks,\nor logos of any Contributor (except as may be necessary to comply with\nthe notice requirements in Section 3.4).\n\n2.4. Subsequent Licenses\n\nNo Contributor makes additional grants as a result of Your choice to\ndistribute the Covered Software under a subsequent version of this\nLicense (see Section 10.2) or under the terms of a Secondary License (if\npermitted under the terms of Section 3.3).\n\n2.5. Representation\n\nEach Contributor represents that the Contributor believes its\nContributions are its original creation(s) or it has sufficient rights\nto grant the rights to its Contributions conveyed by this License.\n\n2.6. Fair Use\n\nThis License is not intended to limit any rights You have under\napplicable copyright doctrines of fair use, fair dealing, or other\nequivalents.\n\n2.7. Conditions\n\nSections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted\nin Section 2.1.\n\n3. Responsibilities\n-------------------\n\n3.1. Distribution of Source Form\n\nAll distribution of Covered Software in Source Code Form, including any\nModifications that You create or to which You contribute, must be under\nthe terms of this License. You must inform recipients that the Source\nCode Form of the Covered Software is governed by the terms of this\nLicense, and how they can obtain a copy of this License. You may not\nattempt to alter or restrict the recipients' rights in the Source Code\nForm.\n\n3.2. Distribution of Executable Form\n\nIf You distribute Covered Software in Executable Form then:\n\n(a) such Covered Software must also be made available in Source Code\n    Form, as described in Section 3.1, and You must inform recipients of\n    the Executable Form how they can obtain a copy of such Source Code\n    Form by reasonable means in a timely manner, at a charge no more\n    than the cost of distribution to the recipient; and\n\n(b) You may distribute such Executable Form under the terms of this\n    License, or sublicense it under different terms, provided that the\n    license for the Executable Form does not attempt to limit or alter\n    the recipients' rights in the Source Code Form under this License.\n\n3.3. Distribution of a Larger Work\n\nYou may create and distribute a Larger Work under terms of Your choice,\nprovided that You also comply with the requirements of this License for\nthe Covered Software. If the Larger Work is a combination of Covered\nSoftware with a work governed by one or more Secondary Licenses, and the\nCovered Software is not Incompatible With Secondary Licenses, this\nLicense permits You to additionally distribute such Covered Software\nunder the terms of such Secondary License(s), so that the recipient of\nthe Larger Work may, at their option, further distribute the Covered\nSoftware under the terms of either this License or such Secondary\nLicense(s).\n\n3.4. Notices\n\nYou may not remove or alter the substance of any license notices\n(including copyright notices, patent notices, disclaimers of warranty,\nor limitations of liability) contained within the Source Code Form of\nthe Covered Software, except that You may alter any license notices to\nthe extent required to remedy known factual inaccuracies.\n\n3.5. Application of Additional Terms\n\nYou may choose to offer, and to charge a fee for, warranty, support,\nindemnity or liability obligations to one or more recipients of Covered\nSoftware. However, You may do so only on Your own behalf, and not on\nbehalf of any Contributor. You must make it absolutely clear that any\nsuch warranty, support, indemnity, or liability obligation is offered by\nYou alone, and You hereby agree to indemnify every Contributor for any\nliability incurred by such Contributor as a result of warranty, support,\nindemnity or liability terms You offer. You may include additional\ndisclaimers of warranty and limitations of liability specific to any\njurisdiction.\n\n4. Inability to Comply Due to Statute or Regulation\n---------------------------------------------------\n\nIf it is impossible for You to comply with any of the terms of this\nLicense with respect to some or all of the Covered Software due to\nstatute, judicial order, or regulation then You must: (a) comply with\nthe terms of this License to the maximum extent possible; and (b)\ndescribe the limitations and the code they affect. Such description must\nbe placed in a text file included with all distributions of the Covered\nSoftware under this License. Except to the extent prohibited by statute\nor regulation, such description must be sufficiently detailed for a\nrecipient of ordinary skill to be able to understand it.\n\n5. Termination\n--------------\n\n5.1. The rights granted under this License will terminate automatically\nif You fail to comply with any of its terms. However, if You become\ncompliant, then the rights granted under this License from a particular\nContributor are reinstated (a) provisionally, unless and until such\nContributor explicitly and finally terminates Your grants, and (b) on an\nongoing basis, if such Contributor fails to notify You of the\nnon-compliance by some reasonable means prior to 60 days after You have\ncome back into compliance. Moreover, Your grants from a particular\nContributor are reinstated on an ongoing basis if such Contributor\nnotifies You of the non-compliance by some reasonable means, this is the\nfirst time You have received notice of non-compliance with this License\nfrom such Contributor, and You become compliant prior to 30 days after\nYour receipt of the notice.\n\n5.2. If You initiate litigation against any entity by asserting a patent\ninfringement claim (excluding declaratory judgment actions,\ncounter-claims, and cross-claims) alleging that a Contributor Version\ndirectly or indirectly infringes any patent, then the rights granted to\nYou by any and all Contributors for the Covered Software under Section\n2.1 of this License shall terminate.\n\n5.3. In the event of termination under Sections 5.1 or 5.2 above, all\nend user license agreements (excluding distributors and resellers) which\nhave been validly granted by You or Your distributors under this License\nprior to termination shall survive termination.\n\n************************************************************************\n*                                                                      *\n*  6. Disclaimer of Warranty                                           *\n*  -------------------------                                           *\n*                                                                      *\n*  Covered Software is provided under this License on an \"as is\"       *\n*  basis, without warranty of any kind, either expressed, implied, or  *\n*  statutory, including, without limitation, warranties that the       *\n*  Covered Software is free of defects, merchantable, fit for a        *\n*  particular purpose or non-infringing. The entire risk as to the     *\n*  quality and performance of the Covered Software is with You.        *\n*  Should any Covered Software prove defective in any respect, You     *\n*  (not any Contributor) assume the cost of any necessary servicing,   *\n*  repair, or correction. This disclaimer of warranty constitutes an   *\n*  essential part of this License. No use of any Covered Software is   *\n*  authorized under this License except under this disclaimer.         *\n*                                                                      *\n************************************************************************\n\n************************************************************************\n*                                                                      *\n*  7. Limitation of Liability                                          *\n*  --------------------------                                          *\n*                                                                      *\n*  Under no circumstances and under no legal theory, whether tort      *\n*  (including negligence), contract, or otherwise, shall any           *\n*  Contributor, or anyone who distributes Covered Software as          *\n*  permitted above, be liable to You for any direct, indirect,         *\n*  special, incidental, or consequential damages of any character      *\n*  including, without limitation, damages for lost profits, loss of    *\n*  goodwill, work stoppage, computer failure or malfunction, or any    *\n*  and all other commercial damages or losses, even if such party      *\n*  shall have been informed of the possibility of such damages. This   *\n*  limitation of liability shall not apply to liability for death or   *\n*  personal injury resulting from such party's negligence to the       *\n*  extent applicable law prohibits such limitation. Some               *\n*  jurisdictions do not allow the exclusion or limitation of           *\n*  incidental or consequential damages, so this exclusion and          *\n*  limitation may not apply to You.                                    *\n*                                                                      *\n************************************************************************\n\n8. Litigation\n-------------\n\nAny litigation relating to this License may be brought only in the\ncourts of a jurisdiction where the defendant maintains its principal\nplace of business and such litigation shall be governed by laws of that\njurisdiction, without reference to its conflict-of-law provisions.\nNothing in this Section shall prevent a party's ability to bring\ncross-claims or counter-claims.\n\n9. Miscellaneous\n----------------\n\nThis License represents the complete agreement concerning the subject\nmatter hereof. If any provision of this License is held to be\nunenforceable, such provision shall be reformed only to the extent\nnecessary to make it enforceable. Any law or regulation which provides\nthat the language of a contract shall be construed against the drafter\nshall not be used to construe this License against a Contributor.\n\n10. Versions of the License\n---------------------------\n\n10.1. New Versions\n\nMozilla Foundation is the license steward. Except as provided in Section\n10.3, no one other than the license steward has the right to modify or\npublish new versions of this License. Each version will be given a\ndistinguishing version number.\n\n10.2. Effect of New Versions\n\nYou may distribute the Covered Software under the terms of the version\nof the License under which You originally received the Covered Software,\nor under the terms of any subsequent version published by the license\nsteward.\n\n10.3. Modified Versions\n\nIf you create software not governed by this License, and you want to\ncreate a new license for such software, you may create and use a\nmodified version of this License if you rename the license and remove\nany references to the name of the license steward (except to note that\nsuch modified license differs from this License).\n\n10.4. Distributing Source Code Form that is Incompatible With Secondary\nLicenses\n\nIf You choose to distribute Source Code Form that is Incompatible With\nSecondary Licenses under the terms of this version of the License, the\nnotice described in Exhibit B of this License must be attached.\n\nExhibit A - Source Code Form License Notice\n-------------------------------------------\n\n  This Source Code Form is subject to the terms of the Mozilla Public\n  License, v. 2.0. If a copy of the MPL was not distributed with this\n  file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\nIf it is not possible or desirable to put the notice in a particular\nfile, then You may include the notice in a location (such as a LICENSE\nfile in a relevant directory) where a recipient would be likely to look\nfor such a notice.\n\nYou may add additional accurate notices of copyright ownership.\n\nExhibit B - \"Incompatible With Secondary Licenses\" Notice\n---------------------------------------------------------\n\n  This Source Code Form is \"Incompatible With Secondary Licenses\", as\n  defined by the Mozilla Public License, v. 2.0.\n"
  },
  {
    "path": "libs/eigen/COPYING.README",
    "content": "Eigen is primarily MPL2 licensed. See COPYING.MPL2 and these links:\n  http://www.mozilla.org/MPL/2.0/\n  http://www.mozilla.org/MPL/2.0/FAQ.html\n\nSome files contain third-party code under BSD or LGPL licenses, whence the other\nCOPYING.* files here.\n\nAll the LGPL code is either LGPL 2.1-only, or LGPL 2.1-or-later.\nFor this reason, the COPYING.LGPL file contains the LGPL 2.1 text.\n\nIf you want to guarantee that the Eigen code that you are #including is licensed\nunder the MPL2 and possibly more permissive licenses (like BSD), #define this\npreprocessor symbol:\n  EIGEN_MPL2_ONLY\nFor example, with most compilers, you could add this to your project CXXFLAGS:\n  -DEIGEN_MPL2_ONLY\nThis will cause a compilation error to be generated if you #include any code that is\nLGPL licensed.\n"
  },
  {
    "path": "libs/eigen/CTestConfig.cmake",
    "content": "## This file should be placed in the root directory of your project.\n## Then modify the CMakeLists.txt file in the root directory of your\n## project to incorporate the testing dashboard.\n## # The following are required to uses Dart and the Cdash dashboard\n##   ENABLE_TESTING()\n##   INCLUDE(CTest)\nset(CTEST_PROJECT_NAME \"Eigen3.2\")\nset(CTEST_NIGHTLY_START_TIME \"00:00:00 UTC\")\n\nset(CTEST_DROP_METHOD \"http\")\nset(CTEST_DROP_SITE \"manao.inria.fr\")\nset(CTEST_DROP_LOCATION \"/CDash/submit.php?project=Eigen3.2\")\nset(CTEST_DROP_SITE_CDASH TRUE)\n"
  },
  {
    "path": "libs/eigen/CTestCustom.cmake.in",
    "content": "\nset(CTEST_CUSTOM_MAXIMUM_NUMBER_OF_WARNINGS \"2000\")\nset(CTEST_CUSTOM_MAXIMUM_NUMBER_OF_ERRORS   \"2000\")\n"
  },
  {
    "path": "libs/eigen/Eigen/Array",
    "content": "#ifndef EIGEN_ARRAY_MODULE_H\n#define EIGEN_ARRAY_MODULE_H\n\n// include Core first to handle Eigen2 support macros\n#include \"Core\"\n\n#ifndef EIGEN2_SUPPORT\n  #error The Eigen/Array header does no longer exist in Eigen3. All that functionality has moved to Eigen/Core.\n#endif\n\n#endif // EIGEN_ARRAY_MODULE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/CMakeLists.txt",
    "content": "include(RegexUtils)\ntest_escape_string_as_regex()\n\nfile(GLOB Eigen_directory_files \"*\")\n\nescape_string_as_regex(ESCAPED_CMAKE_CURRENT_SOURCE_DIR \"${CMAKE_CURRENT_SOURCE_DIR}\")\n\nforeach(f ${Eigen_directory_files})\n  if(NOT f MATCHES \"\\\\.txt\" AND NOT f MATCHES \"${ESCAPED_CMAKE_CURRENT_SOURCE_DIR}/[.].+\" AND NOT f MATCHES \"${ESCAPED_CMAKE_CURRENT_SOURCE_DIR}/src\")\n    list(APPEND Eigen_directory_files_to_install ${f})\n  endif()\nendforeach(f ${Eigen_directory_files})\n\ninstall(FILES\n  ${Eigen_directory_files_to_install}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen COMPONENT Devel\n  )\n\nadd_subdirectory(src)\n"
  },
  {
    "path": "libs/eigen/Eigen/Cholesky",
    "content": "#ifndef EIGEN_CHOLESKY_MODULE_H\n#define EIGEN_CHOLESKY_MODULE_H\n\n#include \"Core\"\n\n#include \"src/Core/util/DisableStupidWarnings.h\"\n\n/** \\defgroup Cholesky_Module Cholesky module\n  *\n  *\n  *\n  * This module provides two variants of the Cholesky decomposition for selfadjoint (hermitian) matrices.\n  * Those decompositions are accessible via the following MatrixBase methods:\n  *  - MatrixBase::llt(),\n  *  - MatrixBase::ldlt()\n  *\n  * \\code\n  * #include <Eigen/Cholesky>\n  * \\endcode\n  */\n\n#include \"src/misc/Solve.h\"\n#include \"src/Cholesky/LLT.h\"\n#include \"src/Cholesky/LDLT.h\"\n#ifdef EIGEN_USE_LAPACKE\n#include \"src/Cholesky/LLT_MKL.h\"\n#endif\n\n#include \"src/Core/util/ReenableStupidWarnings.h\"\n\n#endif // EIGEN_CHOLESKY_MODULE_H\n/* vim: set filetype=cpp et sw=2 ts=2 ai: */\n"
  },
  {
    "path": "libs/eigen/Eigen/CholmodSupport",
    "content": "#ifndef EIGEN_CHOLMODSUPPORT_MODULE_H\n#define EIGEN_CHOLMODSUPPORT_MODULE_H\n\n#include \"SparseCore\"\n\n#include \"src/Core/util/DisableStupidWarnings.h\"\n\nextern \"C\" {\n  #include <cholmod.h>\n}\n\n/** \\ingroup Support_modules\n  * \\defgroup CholmodSupport_Module CholmodSupport module\n  *\n  * This module provides an interface to the Cholmod library which is part of the <a href=\"http://www.suitesparse.com\">suitesparse</a> package.\n  * It provides the two following main factorization classes:\n  * - class CholmodSupernodalLLT: a supernodal LLT Cholesky factorization.\n  * - class CholmodDecomposiiton: a general L(D)LT Cholesky factorization with automatic or explicit runtime selection of the underlying factorization method (supernodal or simplicial).\n  *\n  * For the sake of completeness, this module also propose the two following classes:\n  * - class CholmodSimplicialLLT\n  * - class CholmodSimplicialLDLT\n  * Note that these classes does not bring any particular advantage compared to the built-in\n  * SimplicialLLT and SimplicialLDLT factorization classes.\n  *\n  * \\code\n  * #include <Eigen/CholmodSupport>\n  * \\endcode\n  *\n  * In order to use this module, the cholmod headers must be accessible from the include paths, and your binary must be linked to the cholmod library and its dependencies.\n  * The dependencies depend on how cholmod has been compiled.\n  * For a cmake based project, you can use our FindCholmod.cmake module to help you in this task.\n  *\n  */\n\n#include \"src/misc/Solve.h\"\n#include \"src/misc/SparseSolve.h\"\n\n#include \"src/CholmodSupport/CholmodSupport.h\"\n\n\n#include \"src/Core/util/ReenableStupidWarnings.h\"\n\n#endif // EIGEN_CHOLMODSUPPORT_MODULE_H\n\n"
  },
  {
    "path": "libs/eigen/Eigen/Core",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2007-2011 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_CORE_H\n#define EIGEN_CORE_H\n\n// first thing Eigen does: stop the compiler from committing suicide\n#include \"src/Core/util/DisableStupidWarnings.h\"\n\n// then include this file where all our macros are defined. It's really important to do it first because\n// it's where we do all the alignment settings (platform detection and honoring the user's will if he\n// defined e.g. EIGEN_DONT_ALIGN) so it needs to be done before we do anything with vectorization.\n#include \"src/Core/util/Macros.h\"\n\n// Disable the ipa-cp-clone optimization flag with MinGW 6.x or newer (enabled by default with -O3)\n// See http://eigen.tuxfamily.org/bz/show_bug.cgi?id=556 for details.\n#if defined(__MINGW32__) && EIGEN_GNUC_AT_LEAST(4,6)\n  #pragma GCC optimize (\"-fno-ipa-cp-clone\")\n#endif\n\n#include <complex>\n\n// this include file manages BLAS and MKL related macros\n// and inclusion of their respective header files\n#include \"src/Core/util/MKL_support.h\"\n\n// if alignment is disabled, then disable vectorization. Note: EIGEN_ALIGN is the proper check, it takes into\n// account both the user's will (EIGEN_DONT_ALIGN) and our own platform checks\n#if !EIGEN_ALIGN\n  #ifndef EIGEN_DONT_VECTORIZE\n    #define EIGEN_DONT_VECTORIZE\n  #endif\n#endif\n\n#ifdef _MSC_VER\n  #include <malloc.h> // for _aligned_malloc -- need it regardless of whether vectorization is enabled\n  #if (_MSC_VER >= 1500) // 2008 or later\n    // Remember that usage of defined() in a #define is undefined by the standard.\n    // a user reported that in 64-bit mode, MSVC doesn't care to define _M_IX86_FP.\n    #if (defined(_M_IX86_FP) && (_M_IX86_FP >= 2)) || defined(_M_X64)\n      #define EIGEN_SSE2_ON_MSVC_2008_OR_LATER\n    #endif\n  #endif\n#else\n  // Remember that usage of defined() in a #define is undefined by the standard\n  #if (defined __SSE2__) && ( (!defined __GNUC__) || (defined __INTEL_COMPILER) || EIGEN_GNUC_AT_LEAST(4,2) )\n    #define EIGEN_SSE2_ON_NON_MSVC_BUT_NOT_OLD_GCC\n  #endif\n#endif\n\n#ifndef EIGEN_DONT_VECTORIZE\n\n  #if defined (EIGEN_SSE2_ON_NON_MSVC_BUT_NOT_OLD_GCC) || defined(EIGEN_SSE2_ON_MSVC_2008_OR_LATER)\n\n    // Defines symbols for compile-time detection of which instructions are\n    // used.\n    // EIGEN_VECTORIZE_YY is defined if and only if the instruction set YY is used\n    #define EIGEN_VECTORIZE\n    #define EIGEN_VECTORIZE_SSE\n    #define EIGEN_VECTORIZE_SSE2\n\n    // Detect sse3/ssse3/sse4:\n    // gcc and icc defines __SSE3__, ...\n    // there is no way to know about this on msvc. You can define EIGEN_VECTORIZE_SSE* if you\n    // want to force the use of those instructions with msvc.\n    #ifdef __SSE3__\n      #define EIGEN_VECTORIZE_SSE3\n    #endif\n    #ifdef __SSSE3__\n      #define EIGEN_VECTORIZE_SSSE3\n    #endif\n    #ifdef __SSE4_1__\n      #define EIGEN_VECTORIZE_SSE4_1\n    #endif\n    #ifdef __SSE4_2__\n      #define EIGEN_VECTORIZE_SSE4_2\n    #endif\n\n    // include files\n\n    // This extern \"C\" works around a MINGW-w64 compilation issue\n    // https://sourceforge.net/tracker/index.php?func=detail&aid=3018394&group_id=202880&atid=983354\n    // In essence, intrin.h is included by windows.h and also declares intrinsics (just as emmintrin.h etc. below do).\n    // However, intrin.h uses an extern \"C\" declaration, and g++ thus complains of duplicate declarations\n    // with conflicting linkage.  The linkage for intrinsics doesn't matter, but at that stage the compiler doesn't know;\n    // so, to avoid compile errors when windows.h is included after Eigen/Core, ensure intrinsics are extern \"C\" here too.\n    // notice that since these are C headers, the extern \"C\" is theoretically needed anyways.\n    extern \"C\" {\n      // In theory we should only include immintrin.h and not the other *mmintrin.h header files directly.\n      // Doing so triggers some issues with ICC. However old gcc versions seems to not have this file, thus:\n      #if defined(__INTEL_COMPILER) && __INTEL_COMPILER >= 1110\n        #include <immintrin.h>\n      #else\n        #include <emmintrin.h>\n        #include <xmmintrin.h>\n        #ifdef  EIGEN_VECTORIZE_SSE3\n        #include <pmmintrin.h>\n        #endif\n        #ifdef EIGEN_VECTORIZE_SSSE3\n        #include <tmmintrin.h>\n        #endif\n        #ifdef EIGEN_VECTORIZE_SSE4_1\n        #include <smmintrin.h>\n        #endif\n        #ifdef EIGEN_VECTORIZE_SSE4_2\n        #include <nmmintrin.h>\n        #endif\n      #endif\n    } // end extern \"C\"\n  #elif defined __ALTIVEC__\n    #define EIGEN_VECTORIZE\n    #define EIGEN_VECTORIZE_ALTIVEC\n    #include <altivec.h>\n    // We need to #undef all these ugly tokens defined in <altivec.h>\n    // => use __vector instead of vector\n    #undef bool\n    #undef vector\n    #undef pixel\n  #elif defined  __ARM_NEON\n    #define EIGEN_VECTORIZE\n    #define EIGEN_VECTORIZE_NEON\n    #include <arm_neon.h>\n  #endif\n#endif\n\n#if (defined _OPENMP) && (!defined EIGEN_DONT_PARALLELIZE)\n  #define EIGEN_HAS_OPENMP\n#endif\n\n#ifdef EIGEN_HAS_OPENMP\n#include <omp.h>\n#endif\n\n// MSVC for windows mobile does not have the errno.h file\n#if !(defined(_MSC_VER) && defined(_WIN32_WCE)) && !defined(__ARMCC_VERSION)\n#define EIGEN_HAS_ERRNO\n#endif\n\n#ifdef EIGEN_HAS_ERRNO\n#include <cerrno>\n#endif\n#include <cstddef>\n#include <cstdlib>\n#include <cmath>\n#include <cassert>\n#include <functional>\n#include <iosfwd>\n#include <cstring>\n#include <string>\n#include <limits>\n#include <climits> // for CHAR_BIT\n// for min/max:\n#include <algorithm>\n\n// for outputting debug info\n#ifdef EIGEN_DEBUG_ASSIGN\n#include <iostream>\n#endif\n\n// required for __cpuid, needs to be included after cmath\n#if defined(_MSC_VER) && (defined(_M_IX86)||defined(_M_X64)) && (!defined(_WIN32_WCE))\n  #include <intrin.h>\n#endif\n\n#if defined(_CPPUNWIND) || defined(__EXCEPTIONS)\n  #define EIGEN_EXCEPTIONS\n#endif\n\n#ifdef EIGEN_EXCEPTIONS\n  #include <new>\n#endif\n\n/** \\brief Namespace containing all symbols from the %Eigen library. */\nnamespace Eigen {\n\ninline static const char *SimdInstructionSetsInUse(void) {\n#if defined(EIGEN_VECTORIZE_SSE4_2)\n  return \"SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2\";\n#elif defined(EIGEN_VECTORIZE_SSE4_1)\n  return \"SSE, SSE2, SSE3, SSSE3, SSE4.1\";\n#elif defined(EIGEN_VECTORIZE_SSSE3)\n  return \"SSE, SSE2, SSE3, SSSE3\";\n#elif defined(EIGEN_VECTORIZE_SSE3)\n  return \"SSE, SSE2, SSE3\";\n#elif defined(EIGEN_VECTORIZE_SSE2)\n  return \"SSE, SSE2\";\n#elif defined(EIGEN_VECTORIZE_ALTIVEC)\n  return \"AltiVec\";\n#elif defined(EIGEN_VECTORIZE_NEON)\n  return \"ARM NEON\";\n#else\n  return \"None\";\n#endif\n}\n\n} // end namespace Eigen\n\n#define STAGE10_FULL_EIGEN2_API             10\n#define STAGE20_RESOLVE_API_CONFLICTS       20\n#define STAGE30_FULL_EIGEN3_API             30\n#define STAGE40_FULL_EIGEN3_STRICTNESS      40\n#define STAGE99_NO_EIGEN2_SUPPORT           99\n\n#if   defined EIGEN2_SUPPORT_STAGE40_FULL_EIGEN3_STRICTNESS\n  #define EIGEN2_SUPPORT\n  #define EIGEN2_SUPPORT_STAGE STAGE40_FULL_EIGEN3_STRICTNESS\n#elif defined EIGEN2_SUPPORT_STAGE30_FULL_EIGEN3_API\n  #define EIGEN2_SUPPORT\n  #define EIGEN2_SUPPORT_STAGE STAGE30_FULL_EIGEN3_API\n#elif defined EIGEN2_SUPPORT_STAGE20_RESOLVE_API_CONFLICTS\n  #define EIGEN2_SUPPORT\n  #define EIGEN2_SUPPORT_STAGE STAGE20_RESOLVE_API_CONFLICTS\n#elif defined EIGEN2_SUPPORT_STAGE10_FULL_EIGEN2_API\n  #define EIGEN2_SUPPORT\n  #define EIGEN2_SUPPORT_STAGE STAGE10_FULL_EIGEN2_API\n#elif defined EIGEN2_SUPPORT\n  // default to stage 3, that's what it's always meant\n  #define EIGEN2_SUPPORT_STAGE30_FULL_EIGEN3_API\n  #define EIGEN2_SUPPORT_STAGE STAGE30_FULL_EIGEN3_API\n#else\n  #define EIGEN2_SUPPORT_STAGE STAGE99_NO_EIGEN2_SUPPORT\n#endif\n\n#ifdef EIGEN2_SUPPORT\n#undef minor\n#endif\n\n// we use size_t frequently and we'll never remember to prepend it with std:: everytime just to\n// ensure QNX/QCC support\nusing std::size_t;\n// gcc 4.6.0 wants std:: for ptrdiff_t \nusing std::ptrdiff_t;\n\n/** \\defgroup Core_Module Core module\n  * This is the main module of Eigen providing dense matrix and vector support\n  * (both fixed and dynamic size) with all the features corresponding to a BLAS library\n  * and much more...\n  *\n  * \\code\n  * #include <Eigen/Core>\n  * \\endcode\n  */\n\n#include \"src/Core/util/Constants.h\"\n#include \"src/Core/util/ForwardDeclarations.h\"\n#include \"src/Core/util/Meta.h\"\n#include \"src/Core/util/StaticAssert.h\"\n#include \"src/Core/util/XprHelper.h\"\n#include \"src/Core/util/Memory.h\"\n\n#include \"src/Core/NumTraits.h\"\n#include \"src/Core/MathFunctions.h\"\n#include \"src/Core/GenericPacketMath.h\"\n\n#if defined EIGEN_VECTORIZE_SSE\n  #include \"src/Core/arch/SSE/PacketMath.h\"\n  #include \"src/Core/arch/SSE/MathFunctions.h\"\n  #include \"src/Core/arch/SSE/Complex.h\"\n#elif defined EIGEN_VECTORIZE_ALTIVEC\n  #include \"src/Core/arch/AltiVec/PacketMath.h\"\n  #include \"src/Core/arch/AltiVec/Complex.h\"\n#elif defined EIGEN_VECTORIZE_NEON\n  #include \"src/Core/arch/NEON/PacketMath.h\"\n  #include \"src/Core/arch/NEON/Complex.h\"\n#endif\n\n#include \"src/Core/arch/Default/Settings.h\"\n\n#include \"src/Core/Functors.h\"\n#include \"src/Core/DenseCoeffsBase.h\"\n#include \"src/Core/DenseBase.h\"\n#include \"src/Core/MatrixBase.h\"\n#include \"src/Core/EigenBase.h\"\n\n#ifndef EIGEN_PARSED_BY_DOXYGEN // work around Doxygen bug triggered by Assign.h r814874\n                                // at least confirmed with Doxygen 1.5.5 and 1.5.6\n  #include \"src/Core/Assign.h\"\n#endif\n\n#include \"src/Core/util/BlasUtil.h\"\n#include \"src/Core/DenseStorage.h\"\n#include \"src/Core/NestByValue.h\"\n#include \"src/Core/ForceAlignedAccess.h\"\n#include \"src/Core/ReturnByValue.h\"\n#include \"src/Core/NoAlias.h\"\n#include \"src/Core/PlainObjectBase.h\"\n#include \"src/Core/Matrix.h\"\n#include \"src/Core/Array.h\"\n#include \"src/Core/CwiseBinaryOp.h\"\n#include \"src/Core/CwiseUnaryOp.h\"\n#include \"src/Core/CwiseNullaryOp.h\"\n#include \"src/Core/CwiseUnaryView.h\"\n#include \"src/Core/SelfCwiseBinaryOp.h\"\n#include \"src/Core/Dot.h\"\n#include \"src/Core/StableNorm.h\"\n#include \"src/Core/MapBase.h\"\n#include \"src/Core/Stride.h\"\n#include \"src/Core/Map.h\"\n#include \"src/Core/Block.h\"\n#include \"src/Core/VectorBlock.h\"\n#include \"src/Core/Ref.h\"\n#include \"src/Core/Transpose.h\"\n#include \"src/Core/DiagonalMatrix.h\"\n#include \"src/Core/Diagonal.h\"\n#include \"src/Core/DiagonalProduct.h\"\n#include \"src/Core/PermutationMatrix.h\"\n#include \"src/Core/Transpositions.h\"\n#include \"src/Core/Redux.h\"\n#include \"src/Core/Visitor.h\"\n#include \"src/Core/Fuzzy.h\"\n#include \"src/Core/IO.h\"\n#include \"src/Core/Swap.h\"\n#include \"src/Core/CommaInitializer.h\"\n#include \"src/Core/Flagged.h\"\n#include \"src/Core/ProductBase.h\"\n#include \"src/Core/GeneralProduct.h\"\n#include \"src/Core/TriangularMatrix.h\"\n#include \"src/Core/SelfAdjointView.h\"\n#include \"src/Core/products/GeneralBlockPanelKernel.h\"\n#include \"src/Core/products/Parallelizer.h\"\n#include \"src/Core/products/CoeffBasedProduct.h\"\n#include \"src/Core/products/GeneralMatrixVector.h\"\n#include \"src/Core/products/GeneralMatrixMatrix.h\"\n#include \"src/Core/SolveTriangular.h\"\n#include \"src/Core/products/GeneralMatrixMatrixTriangular.h\"\n#include \"src/Core/products/SelfadjointMatrixVector.h\"\n#include \"src/Core/products/SelfadjointMatrixMatrix.h\"\n#include \"src/Core/products/SelfadjointProduct.h\"\n#include \"src/Core/products/SelfadjointRank2Update.h\"\n#include \"src/Core/products/TriangularMatrixVector.h\"\n#include \"src/Core/products/TriangularMatrixMatrix.h\"\n#include \"src/Core/products/TriangularSolverMatrix.h\"\n#include \"src/Core/products/TriangularSolverVector.h\"\n#include \"src/Core/BandMatrix.h\"\n#include \"src/Core/CoreIterators.h\"\n\n#include \"src/Core/BooleanRedux.h\"\n#include \"src/Core/Select.h\"\n#include \"src/Core/VectorwiseOp.h\"\n#include \"src/Core/Random.h\"\n#include \"src/Core/Replicate.h\"\n#include \"src/Core/Reverse.h\"\n#include \"src/Core/ArrayBase.h\"\n#include \"src/Core/ArrayWrapper.h\"\n\n#ifdef EIGEN_USE_BLAS\n#include \"src/Core/products/GeneralMatrixMatrix_MKL.h\"\n#include \"src/Core/products/GeneralMatrixVector_MKL.h\"\n#include \"src/Core/products/GeneralMatrixMatrixTriangular_MKL.h\"\n#include \"src/Core/products/SelfadjointMatrixMatrix_MKL.h\"\n#include \"src/Core/products/SelfadjointMatrixVector_MKL.h\"\n#include \"src/Core/products/TriangularMatrixMatrix_MKL.h\"\n#include \"src/Core/products/TriangularMatrixVector_MKL.h\"\n#include \"src/Core/products/TriangularSolverMatrix_MKL.h\"\n#endif // EIGEN_USE_BLAS\n\n#ifdef EIGEN_USE_MKL_VML\n#include \"src/Core/Assign_MKL.h\"\n#endif\n\n#include \"src/Core/GlobalFunctions.h\"\n\n#include \"src/Core/util/ReenableStupidWarnings.h\"\n\n#ifdef EIGEN2_SUPPORT\n#include \"Eigen2Support\"\n#endif\n\n#endif // EIGEN_CORE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/Dense",
    "content": "#include \"Core\"\n#include \"LU\"\n#include \"Cholesky\"\n#include \"QR\"\n#include \"SVD\"\n#include \"Geometry\"\n#include \"Eigenvalues\"\n"
  },
  {
    "path": "libs/eigen/Eigen/Eigen",
    "content": "#include \"Dense\"\n//#include \"Sparse\"\n"
  },
  {
    "path": "libs/eigen/Eigen/Eigen2Support",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN2SUPPORT_H\n#define EIGEN2SUPPORT_H\n\n#if (!defined(EIGEN2_SUPPORT)) || (!defined(EIGEN_CORE_H))\n#error Eigen2 support must be enabled by defining EIGEN2_SUPPORT before including any Eigen header\n#endif\n\n#ifndef EIGEN_NO_EIGEN2_DEPRECATED_WARNING\n\n#if defined(__GNUC__) || defined(__INTEL_COMPILER) || defined(__clang__)\n#warning \"Eigen2 support is deprecated in Eigen 3.2.x and it will be removed in Eigen 3.3. (Define EIGEN_NO_EIGEN2_DEPRECATED_WARNING to disable this warning)\"\n#else\n#pragma message (\"Eigen2 support is deprecated in Eigen 3.2.x and it will be removed in Eigen 3.3. (Define EIGEN_NO_EIGEN2_DEPRECATED_WARNING to disable this warning)\")\n#endif\n\n#endif // EIGEN_NO_EIGEN2_DEPRECATED_WARNING\n\n#include \"src/Core/util/DisableStupidWarnings.h\"\n\n/** \\ingroup Support_modules\n  * \\defgroup Eigen2Support_Module Eigen2 support module\n  *\n  * \\warning Eigen2 support is deprecated in Eigen 3.2.x and it will be removed in Eigen 3.3.\n  *\n  * This module provides a couple of deprecated functions improving the compatibility with Eigen2.\n  * \n  * To use it, define EIGEN2_SUPPORT before including any Eigen header\n  * \\code\n  * #define EIGEN2_SUPPORT\n  * \\endcode\n  *\n  */\n\n#include \"src/Eigen2Support/Macros.h\"\n#include \"src/Eigen2Support/Memory.h\"\n#include \"src/Eigen2Support/Meta.h\"\n#include \"src/Eigen2Support/Lazy.h\"\n#include \"src/Eigen2Support/Cwise.h\"\n#include \"src/Eigen2Support/CwiseOperators.h\"\n#include \"src/Eigen2Support/TriangularSolver.h\"\n#include \"src/Eigen2Support/Block.h\"\n#include \"src/Eigen2Support/VectorBlock.h\"\n#include \"src/Eigen2Support/Minor.h\"\n#include \"src/Eigen2Support/MathFunctions.h\"\n\n\n#include \"src/Core/util/ReenableStupidWarnings.h\"\n\n// Eigen2 used to include iostream\n#include<iostream>\n\n#define EIGEN_USING_MATRIX_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, SizeSuffix) \\\nusing Eigen::Matrix##SizeSuffix##TypeSuffix; \\\nusing Eigen::Vector##SizeSuffix##TypeSuffix; \\\nusing Eigen::RowVector##SizeSuffix##TypeSuffix;\n\n#define EIGEN_USING_MATRIX_TYPEDEFS_FOR_TYPE(TypeSuffix) \\\nEIGEN_USING_MATRIX_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, 2) \\\nEIGEN_USING_MATRIX_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, 3) \\\nEIGEN_USING_MATRIX_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, 4) \\\nEIGEN_USING_MATRIX_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, X) \\\n\n#define EIGEN_USING_MATRIX_TYPEDEFS \\\nEIGEN_USING_MATRIX_TYPEDEFS_FOR_TYPE(i) \\\nEIGEN_USING_MATRIX_TYPEDEFS_FOR_TYPE(f) \\\nEIGEN_USING_MATRIX_TYPEDEFS_FOR_TYPE(d) \\\nEIGEN_USING_MATRIX_TYPEDEFS_FOR_TYPE(cf) \\\nEIGEN_USING_MATRIX_TYPEDEFS_FOR_TYPE(cd)\n\n#define USING_PART_OF_NAMESPACE_EIGEN \\\nEIGEN_USING_MATRIX_TYPEDEFS \\\nusing Eigen::Matrix; \\\nusing Eigen::MatrixBase; \\\nusing Eigen::ei_random; \\\nusing Eigen::ei_real; \\\nusing Eigen::ei_imag; \\\nusing Eigen::ei_conj; \\\nusing Eigen::ei_abs; \\\nusing Eigen::ei_abs2; \\\nusing Eigen::ei_sqrt; \\\nusing Eigen::ei_exp; \\\nusing Eigen::ei_log; \\\nusing Eigen::ei_sin; \\\nusing Eigen::ei_cos;\n\n#endif // EIGEN2SUPPORT_H\n"
  },
  {
    "path": "libs/eigen/Eigen/Eigenvalues",
    "content": "#ifndef EIGEN_EIGENVALUES_MODULE_H\n#define EIGEN_EIGENVALUES_MODULE_H\n\n#include \"Core\"\n\n#include \"src/Core/util/DisableStupidWarnings.h\"\n\n#include \"Cholesky\"\n#include \"Jacobi\"\n#include \"Householder\"\n#include \"LU\"\n#include \"Geometry\"\n\n/** \\defgroup Eigenvalues_Module Eigenvalues module\n  *\n  *\n  *\n  * This module mainly provides various eigenvalue solvers.\n  * This module also provides some MatrixBase methods, including:\n  *  - MatrixBase::eigenvalues(),\n  *  - MatrixBase::operatorNorm()\n  *\n  * \\code\n  * #include <Eigen/Eigenvalues>\n  * \\endcode\n  */\n\n#include \"src/Eigenvalues/Tridiagonalization.h\"\n#include \"src/Eigenvalues/RealSchur.h\"\n#include \"src/Eigenvalues/EigenSolver.h\"\n#include \"src/Eigenvalues/SelfAdjointEigenSolver.h\"\n#include \"src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h\"\n#include \"src/Eigenvalues/HessenbergDecomposition.h\"\n#include \"src/Eigenvalues/ComplexSchur.h\"\n#include \"src/Eigenvalues/ComplexEigenSolver.h\"\n#include \"src/Eigenvalues/RealQZ.h\"\n#include \"src/Eigenvalues/GeneralizedEigenSolver.h\"\n#include \"src/Eigenvalues/MatrixBaseEigenvalues.h\"\n#ifdef EIGEN_USE_LAPACKE\n#include \"src/Eigenvalues/RealSchur_MKL.h\"\n#include \"src/Eigenvalues/ComplexSchur_MKL.h\"\n#include \"src/Eigenvalues/SelfAdjointEigenSolver_MKL.h\"\n#endif\n\n#include \"src/Core/util/ReenableStupidWarnings.h\"\n\n#endif // EIGEN_EIGENVALUES_MODULE_H\n/* vim: set filetype=cpp et sw=2 ts=2 ai: */\n"
  },
  {
    "path": "libs/eigen/Eigen/Geometry",
    "content": "#ifndef EIGEN_GEOMETRY_MODULE_H\n#define EIGEN_GEOMETRY_MODULE_H\n\n#include \"Core\"\n\n#include \"src/Core/util/DisableStupidWarnings.h\"\n\n#include \"SVD\"\n#include \"LU\"\n#include <limits>\n\n#ifndef M_PI\n#define M_PI 3.14159265358979323846\n#endif\n\n/** \\defgroup Geometry_Module Geometry module\n  *\n  *\n  *\n  * This module provides support for:\n  *  - fixed-size homogeneous transformations\n  *  - translation, scaling, 2D and 3D rotations\n  *  - quaternions\n  *  - \\ref MatrixBase::cross() \"cross product\"\n  *  - \\ref MatrixBase::unitOrthogonal() \"orthognal vector generation\"\n  *  - some linear components: parametrized-lines and hyperplanes\n  *\n  * \\code\n  * #include <Eigen/Geometry>\n  * \\endcode\n  */\n\n#include \"src/Geometry/OrthoMethods.h\"\n#include \"src/Geometry/EulerAngles.h\"\n\n#if EIGEN2_SUPPORT_STAGE > STAGE20_RESOLVE_API_CONFLICTS\n  #include \"src/Geometry/Homogeneous.h\"\n  #include \"src/Geometry/RotationBase.h\"\n  #include \"src/Geometry/Rotation2D.h\"\n  #include \"src/Geometry/Quaternion.h\"\n  #include \"src/Geometry/AngleAxis.h\"\n  #include \"src/Geometry/Transform.h\"\n  #include \"src/Geometry/Translation.h\"\n  #include \"src/Geometry/Scaling.h\"\n  #include \"src/Geometry/Hyperplane.h\"\n  #include \"src/Geometry/ParametrizedLine.h\"\n  #include \"src/Geometry/AlignedBox.h\"\n  #include \"src/Geometry/Umeyama.h\"\n\n  #if defined EIGEN_VECTORIZE_SSE\n    #include \"src/Geometry/arch/Geometry_SSE.h\"\n  #endif\n#endif\n\n#ifdef EIGEN2_SUPPORT\n#include \"src/Eigen2Support/Geometry/All.h\"\n#endif\n\n#include \"src/Core/util/ReenableStupidWarnings.h\"\n\n#endif // EIGEN_GEOMETRY_MODULE_H\n/* vim: set filetype=cpp et sw=2 ts=2 ai: */\n\n"
  },
  {
    "path": "libs/eigen/Eigen/Householder",
    "content": "#ifndef EIGEN_HOUSEHOLDER_MODULE_H\n#define EIGEN_HOUSEHOLDER_MODULE_H\n\n#include \"Core\"\n\n#include \"src/Core/util/DisableStupidWarnings.h\"\n\n/** \\defgroup Householder_Module Householder module\n  * This module provides Householder transformations.\n  *\n  * \\code\n  * #include <Eigen/Householder>\n  * \\endcode\n  */\n\n#include \"src/Householder/Householder.h\"\n#include \"src/Householder/HouseholderSequence.h\"\n#include \"src/Householder/BlockHouseholder.h\"\n\n#include \"src/Core/util/ReenableStupidWarnings.h\"\n\n#endif // EIGEN_HOUSEHOLDER_MODULE_H\n/* vim: set filetype=cpp et sw=2 ts=2 ai: */\n"
  },
  {
    "path": "libs/eigen/Eigen/IterativeLinearSolvers",
    "content": "#ifndef EIGEN_ITERATIVELINEARSOLVERS_MODULE_H\n#define EIGEN_ITERATIVELINEARSOLVERS_MODULE_H\n\n#include \"SparseCore\"\n#include \"OrderingMethods\"\n\n#include \"src/Core/util/DisableStupidWarnings.h\"\n\n/** \n  * \\defgroup IterativeLinearSolvers_Module IterativeLinearSolvers module\n  *\n  * This module currently provides iterative methods to solve problems of the form \\c A \\c x = \\c b, where \\c A is a squared matrix, usually very large and sparse.\n  * Those solvers are accessible via the following classes:\n  *  - ConjugateGradient for selfadjoint (hermitian) matrices,\n  *  - BiCGSTAB for general square matrices.\n  *\n  * These iterative solvers are associated with some preconditioners:\n  *  - IdentityPreconditioner - not really useful\n  *  - DiagonalPreconditioner - also called JAcobi preconditioner, work very well on diagonal dominant matrices.\n  *  - IncompleteILUT - incomplete LU factorization with dual thresholding\n  *\n  * Such problems can also be solved using the direct sparse decomposition modules: SparseCholesky, CholmodSupport, UmfPackSupport, SuperLUSupport.\n  *\n  * \\code\n  * #include <Eigen/IterativeLinearSolvers>\n  * \\endcode\n  */\n\n#include \"src/misc/Solve.h\"\n#include \"src/misc/SparseSolve.h\"\n\n#include \"src/IterativeLinearSolvers/IterativeSolverBase.h\"\n#include \"src/IterativeLinearSolvers/BasicPreconditioners.h\"\n#include \"src/IterativeLinearSolvers/ConjugateGradient.h\"\n#include \"src/IterativeLinearSolvers/BiCGSTAB.h\"\n#include \"src/IterativeLinearSolvers/IncompleteLUT.h\"\n\n#include \"src/Core/util/ReenableStupidWarnings.h\"\n\n#endif // EIGEN_ITERATIVELINEARSOLVERS_MODULE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/Jacobi",
    "content": "#ifndef EIGEN_JACOBI_MODULE_H\n#define EIGEN_JACOBI_MODULE_H\n\n#include \"Core\"\n\n#include \"src/Core/util/DisableStupidWarnings.h\"\n\n/** \\defgroup Jacobi_Module Jacobi module\n  * This module provides Jacobi and Givens rotations.\n  *\n  * \\code\n  * #include <Eigen/Jacobi>\n  * \\endcode\n  *\n  * In addition to listed classes, it defines the two following MatrixBase methods to apply a Jacobi or Givens rotation:\n  *  - MatrixBase::applyOnTheLeft()\n  *  - MatrixBase::applyOnTheRight().\n  */\n\n#include \"src/Jacobi/Jacobi.h\"\n\n#include \"src/Core/util/ReenableStupidWarnings.h\"\n\n#endif // EIGEN_JACOBI_MODULE_H\n/* vim: set filetype=cpp et sw=2 ts=2 ai: */\n\n"
  },
  {
    "path": "libs/eigen/Eigen/LU",
    "content": "#ifndef EIGEN_LU_MODULE_H\n#define EIGEN_LU_MODULE_H\n\n#include \"Core\"\n\n#include \"src/Core/util/DisableStupidWarnings.h\"\n\n/** \\defgroup LU_Module LU module\n  * This module includes %LU decomposition and related notions such as matrix inversion and determinant.\n  * This module defines the following MatrixBase methods:\n  *  - MatrixBase::inverse()\n  *  - MatrixBase::determinant()\n  *\n  * \\code\n  * #include <Eigen/LU>\n  * \\endcode\n  */\n\n#include \"src/misc/Solve.h\"\n#include \"src/misc/Kernel.h\"\n#include \"src/misc/Image.h\"\n#include \"src/LU/FullPivLU.h\"\n#include \"src/LU/PartialPivLU.h\"\n#ifdef EIGEN_USE_LAPACKE\n#include \"src/LU/PartialPivLU_MKL.h\"\n#endif\n#include \"src/LU/Determinant.h\"\n#include \"src/LU/Inverse.h\"\n\n#if defined EIGEN_VECTORIZE_SSE\n  #include \"src/LU/arch/Inverse_SSE.h\"\n#endif\n\n#ifdef EIGEN2_SUPPORT\n  #include \"src/Eigen2Support/LU.h\"\n#endif\n\n#include \"src/Core/util/ReenableStupidWarnings.h\"\n\n#endif // EIGEN_LU_MODULE_H\n/* vim: set filetype=cpp et sw=2 ts=2 ai: */\n"
  },
  {
    "path": "libs/eigen/Eigen/LeastSquares",
    "content": "#ifndef EIGEN_REGRESSION_MODULE_H\n#define EIGEN_REGRESSION_MODULE_H\n\n#ifndef EIGEN2_SUPPORT\n#error LeastSquares is only available in Eigen2 support mode (define EIGEN2_SUPPORT)\n#endif\n\n// exclude from normal eigen3-only documentation\n#ifdef EIGEN2_SUPPORT\n\n#include \"Core\"\n\n#include \"src/Core/util/DisableStupidWarnings.h\"\n\n#include \"Eigenvalues\"\n#include \"Geometry\"\n\n/** \\defgroup LeastSquares_Module LeastSquares module\n  * This module provides linear regression and related features.\n  *\n  * \\code\n  * #include <Eigen/LeastSquares>\n  * \\endcode\n  */\n\n#include \"src/Eigen2Support/LeastSquares.h\"\n\n#include \"src/Core/util/ReenableStupidWarnings.h\"\n\n#endif // EIGEN2_SUPPORT\n\n#endif // EIGEN_REGRESSION_MODULE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/MetisSupport",
    "content": "#ifndef EIGEN_METISSUPPORT_MODULE_H\n#define EIGEN_METISSUPPORT_MODULE_H\n\n#include \"SparseCore\"\n\n#include \"src/Core/util/DisableStupidWarnings.h\"\n\nextern \"C\" {\n#include <metis.h>\n}\n\n\n/** \\ingroup Support_modules\n  * \\defgroup MetisSupport_Module MetisSupport module\n  *\n  * \\code\n  * #include <Eigen/MetisSupport>\n  * \\endcode\n  * This module defines an interface to the METIS reordering package (http://glaros.dtc.umn.edu/gkhome/views/metis). \n  * It can be used just as any other built-in method as explained in \\link OrderingMethods_Module here. \\endlink\n  */\n\n\n#include \"src/MetisSupport/MetisSupport.h\"\n\n#include \"src/Core/util/ReenableStupidWarnings.h\"\n\n#endif // EIGEN_METISSUPPORT_MODULE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/OrderingMethods",
    "content": "#ifndef EIGEN_ORDERINGMETHODS_MODULE_H\n#define EIGEN_ORDERINGMETHODS_MODULE_H\n\n#include \"SparseCore\"\n\n#include \"src/Core/util/DisableStupidWarnings.h\"\n\n/** \n  * \\defgroup OrderingMethods_Module OrderingMethods module\n  *\n  * This module is currently for internal use only\n  * \n  * It defines various built-in and external ordering methods for sparse matrices. \n  * They are typically used to reduce the number of elements during \n  * the sparse matrix decomposition (LLT, LU, QR).\n  * Precisely, in a preprocessing step, a permutation matrix P is computed using \n  * those ordering methods and applied to the columns of the matrix. \n  * Using for instance the sparse Cholesky decomposition, it is expected that \n  * the nonzeros elements in LLT(A*P) will be much smaller than that in LLT(A).\n  * \n  * \n  * Usage : \n  * \\code\n  * #include <Eigen/OrderingMethods>\n  * \\endcode\n  * \n  * A simple usage is as a template parameter in the sparse decomposition classes : \n  * \n  * \\code \n  * SparseLU<MatrixType, COLAMDOrdering<int> > solver;\n  * \\endcode \n  * \n  * \\code \n  * SparseQR<MatrixType, COLAMDOrdering<int> > solver;\n  * \\endcode\n  * \n  * It is possible as well to call directly a particular ordering method for your own purpose, \n  * \\code \n  * AMDOrdering<int> ordering;\n  * PermutationMatrix<Dynamic, Dynamic, int> perm;\n  * SparseMatrix<double> A; \n  * //Fill the matrix ...\n  * \n  * ordering(A, perm); // Call AMD\n  * \\endcode\n  * \n  * \\note Some of these methods (like AMD or METIS), need the sparsity pattern \n  * of the input matrix to be symmetric. When the matrix is structurally unsymmetric, \n  * Eigen computes internally the pattern of \\f$A^T*A\\f$ before calling the method.\n  * If your matrix is already symmetric (at leat in structure), you can avoid that\n  * by calling the method with a SelfAdjointView type.\n  * \n  * \\code\n  *  // Call the ordering on the pattern of the lower triangular matrix A\n  * ordering(A.selfadjointView<Lower>(), perm);\n  * \\endcode\n  */\n\n#ifndef EIGEN_MPL2_ONLY\n#include \"src/OrderingMethods/Amd.h\"\n#endif\n\n#include \"src/OrderingMethods/Ordering.h\"\n#include \"src/Core/util/ReenableStupidWarnings.h\"\n\n#endif // EIGEN_ORDERINGMETHODS_MODULE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/PaStiXSupport",
    "content": "#ifndef EIGEN_PASTIXSUPPORT_MODULE_H\n#define EIGEN_PASTIXSUPPORT_MODULE_H\n\n#include \"SparseCore\"\n\n#include \"src/Core/util/DisableStupidWarnings.h\"\n\n#include <complex.h>\nextern \"C\" {\n#include <pastix_nompi.h>\n#include <pastix.h>\n}\n\n#ifdef complex\n#undef complex\n#endif\n\n/** \\ingroup Support_modules\n  * \\defgroup PaStiXSupport_Module PaStiXSupport module\n  * \n  * This module provides an interface to the <a href=\"http://pastix.gforge.inria.fr/\">PaSTiX</a> library.\n  * PaSTiX is a general \\b supernodal, \\b parallel and \\b opensource sparse solver.\n  * It provides the two following main factorization classes:\n  * - class PastixLLT : a supernodal, parallel LLt Cholesky factorization.\n  * - class PastixLDLT: a supernodal, parallel LDLt Cholesky factorization.\n  * - class PastixLU : a supernodal, parallel LU factorization (optimized for a symmetric pattern).\n  * \n  * \\code\n  * #include <Eigen/PaStiXSupport>\n  * \\endcode\n  *\n  * In order to use this module, the PaSTiX headers must be accessible from the include paths, and your binary must be linked to the PaSTiX library and its dependencies.\n  * The dependencies depend on how PaSTiX has been compiled.\n  * For a cmake based project, you can use our FindPaSTiX.cmake module to help you in this task.\n  *\n  */\n\n#include \"src/misc/Solve.h\"\n#include \"src/misc/SparseSolve.h\"\n\n#include \"src/PaStiXSupport/PaStiXSupport.h\"\n\n\n#include \"src/Core/util/ReenableStupidWarnings.h\"\n\n#endif // EIGEN_PASTIXSUPPORT_MODULE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/PardisoSupport",
    "content": "#ifndef EIGEN_PARDISOSUPPORT_MODULE_H\n#define EIGEN_PARDISOSUPPORT_MODULE_H\n\n#include \"SparseCore\"\n\n#include \"src/Core/util/DisableStupidWarnings.h\"\n\n#include <mkl_pardiso.h>\n\n#include <unsupported/Eigen/SparseExtra>\n\n/** \\ingroup Support_modules\n  * \\defgroup PardisoSupport_Module PardisoSupport module\n  *\n  * This module brings support for the Intel(R) MKL PARDISO direct sparse solvers.\n  *\n  * \\code\n  * #include <Eigen/PardisoSupport>\n  * \\endcode\n  *\n  * In order to use this module, the MKL headers must be accessible from the include paths, and your binary must be linked to the MKL library and its dependencies.\n  * See this \\ref TopicUsingIntelMKL \"page\" for more information on MKL-Eigen integration.\n  * \n  */\n\n#include \"src/PardisoSupport/PardisoSupport.h\"\n\n#include \"src/Core/util/ReenableStupidWarnings.h\"\n\n#endif // EIGEN_PARDISOSUPPORT_MODULE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/QR",
    "content": "#ifndef EIGEN_QR_MODULE_H\n#define EIGEN_QR_MODULE_H\n\n#include \"Core\"\n\n#include \"src/Core/util/DisableStupidWarnings.h\"\n\n#include \"Cholesky\"\n#include \"Jacobi\"\n#include \"Householder\"\n\n/** \\defgroup QR_Module QR module\n  *\n  *\n  *\n  * This module provides various QR decompositions\n  * This module also provides some MatrixBase methods, including:\n  *  - MatrixBase::qr(),\n  *\n  * \\code\n  * #include <Eigen/QR>\n  * \\endcode\n  */\n\n#include \"src/misc/Solve.h\"\n#include \"src/QR/HouseholderQR.h\"\n#include \"src/QR/FullPivHouseholderQR.h\"\n#include \"src/QR/ColPivHouseholderQR.h\"\n#ifdef EIGEN_USE_LAPACKE\n#include \"src/QR/HouseholderQR_MKL.h\"\n#include \"src/QR/ColPivHouseholderQR_MKL.h\"\n#endif\n\n#ifdef EIGEN2_SUPPORT\n#include \"src/Eigen2Support/QR.h\"\n#endif\n\n#include \"src/Core/util/ReenableStupidWarnings.h\"\n\n#ifdef EIGEN2_SUPPORT\n#include \"Eigenvalues\"\n#endif\n\n#endif // EIGEN_QR_MODULE_H\n/* vim: set filetype=cpp et sw=2 ts=2 ai: */\n"
  },
  {
    "path": "libs/eigen/Eigen/QtAlignedMalloc",
    "content": "\n#ifndef EIGEN_QTMALLOC_MODULE_H\n#define EIGEN_QTMALLOC_MODULE_H\n\n#include \"Core\"\n\n#if (!EIGEN_MALLOC_ALREADY_ALIGNED)\n\n#include \"src/Core/util/DisableStupidWarnings.h\"\n\nvoid *qMalloc(size_t size)\n{\n  return Eigen::internal::aligned_malloc(size);\n}\n\nvoid qFree(void *ptr)\n{\n  Eigen::internal::aligned_free(ptr);\n}\n\nvoid *qRealloc(void *ptr, size_t size)\n{\n  void* newPtr = Eigen::internal::aligned_malloc(size);\n  memcpy(newPtr, ptr, size);\n  Eigen::internal::aligned_free(ptr);\n  return newPtr;\n}\n\n#include \"src/Core/util/ReenableStupidWarnings.h\"\n\n#endif\n\n#endif // EIGEN_QTMALLOC_MODULE_H\n/* vim: set filetype=cpp et sw=2 ts=2 ai: */\n"
  },
  {
    "path": "libs/eigen/Eigen/SPQRSupport",
    "content": "#ifndef EIGEN_SPQRSUPPORT_MODULE_H\n#define EIGEN_SPQRSUPPORT_MODULE_H\n\n#include \"SparseCore\"\n\n#include \"src/Core/util/DisableStupidWarnings.h\"\n\n#include \"SuiteSparseQR.hpp\"\n\n/** \\ingroup Support_modules\n  * \\defgroup SPQRSupport_Module SuiteSparseQR module\n  * \n  * This module provides an interface to the SPQR library, which is part of the <a href=\"http://www.suitesparse.com\">suitesparse</a> package.\n  *\n  * \\code\n  * #include <Eigen/SPQRSupport>\n  * \\endcode\n  *\n  * In order to use this module, the SPQR headers must be accessible from the include paths, and your binary must be linked to the SPQR library and its dependencies (Cholmod, AMD, COLAMD,...).\n  * For a cmake based project, you can use our FindSPQR.cmake and FindCholmod.Cmake modules\n  *\n  */\n\n#include \"src/misc/Solve.h\"\n#include \"src/misc/SparseSolve.h\"\n#include \"src/CholmodSupport/CholmodSupport.h\"\n#include \"src/SPQRSupport/SuiteSparseQRSupport.h\"\n\n#endif\n"
  },
  {
    "path": "libs/eigen/Eigen/SVD",
    "content": "#ifndef EIGEN_SVD_MODULE_H\n#define EIGEN_SVD_MODULE_H\n\n#include \"QR\"\n#include \"Householder\"\n#include \"Jacobi\"\n\n#include \"src/Core/util/DisableStupidWarnings.h\"\n\n/** \\defgroup SVD_Module SVD module\n  *\n  *\n  *\n  * This module provides SVD decomposition for matrices (both real and complex).\n  * This decomposition is accessible via the following MatrixBase method:\n  *  - MatrixBase::jacobiSvd()\n  *\n  * \\code\n  * #include <Eigen/SVD>\n  * \\endcode\n  */\n\n#include \"src/misc/Solve.h\"\n#include \"src/SVD/JacobiSVD.h\"\n#if defined(EIGEN_USE_LAPACKE) && !defined(EIGEN_USE_LAPACKE_STRICT)\n#include \"src/SVD/JacobiSVD_MKL.h\"\n#endif\n#include \"src/SVD/UpperBidiagonalization.h\"\n\n#ifdef EIGEN2_SUPPORT\n#include \"src/Eigen2Support/SVD.h\"\n#endif\n\n#include \"src/Core/util/ReenableStupidWarnings.h\"\n\n#endif // EIGEN_SVD_MODULE_H\n/* vim: set filetype=cpp et sw=2 ts=2 ai: */\n"
  },
  {
    "path": "libs/eigen/Eigen/Sparse",
    "content": "#ifndef EIGEN_SPARSE_MODULE_H\n#define EIGEN_SPARSE_MODULE_H\n\n/** \\defgroup Sparse_Module Sparse meta-module\n  *\n  * Meta-module including all related modules:\n  * - \\ref SparseCore_Module\n  * - \\ref OrderingMethods_Module\n  * - \\ref SparseCholesky_Module\n  * - \\ref SparseLU_Module\n  * - \\ref SparseQR_Module\n  * - \\ref IterativeLinearSolvers_Module\n  *\n  * \\code\n  * #include <Eigen/Sparse>\n  * \\endcode\n  */\n\n#include \"SparseCore\"\n#include \"OrderingMethods\"\n#include \"SparseCholesky\"\n#include \"SparseLU\"\n#include \"SparseQR\"\n#include \"IterativeLinearSolvers\"\n\n#endif // EIGEN_SPARSE_MODULE_H\n\n"
  },
  {
    "path": "libs/eigen/Eigen/SparseCholesky",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2013 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SPARSECHOLESKY_MODULE_H\n#define EIGEN_SPARSECHOLESKY_MODULE_H\n\n#include \"SparseCore\"\n#include \"OrderingMethods\"\n\n#include \"src/Core/util/DisableStupidWarnings.h\"\n\n/** \n  * \\defgroup SparseCholesky_Module SparseCholesky module\n  *\n  * This module currently provides two variants of the direct sparse Cholesky decomposition for selfadjoint (hermitian) matrices.\n  * Those decompositions are accessible via the following classes:\n  *  - SimplicialLLt,\n  *  - SimplicialLDLt\n  *\n  * Such problems can also be solved using the ConjugateGradient solver from the IterativeLinearSolvers module.\n  *\n  * \\code\n  * #include <Eigen/SparseCholesky>\n  * \\endcode\n  */\n\n#ifdef EIGEN_MPL2_ONLY\n#error The SparseCholesky module has nothing to offer in MPL2 only mode\n#endif\n\n#include \"src/misc/Solve.h\"\n#include \"src/misc/SparseSolve.h\"\n#include \"src/SparseCholesky/SimplicialCholesky.h\"\n\n#ifndef EIGEN_MPL2_ONLY\n#include \"src/SparseCholesky/SimplicialCholesky_impl.h\"\n#endif\n\n#include \"src/Core/util/ReenableStupidWarnings.h\"\n\n#endif // EIGEN_SPARSECHOLESKY_MODULE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/SparseCore",
    "content": "#ifndef EIGEN_SPARSECORE_MODULE_H\n#define EIGEN_SPARSECORE_MODULE_H\n\n#include \"Core\"\n\n#include \"src/Core/util/DisableStupidWarnings.h\"\n\n#include <vector>\n#include <map>\n#include <cstdlib>\n#include <cstring>\n#include <algorithm>\n\n/** \n  * \\defgroup SparseCore_Module SparseCore module\n  *\n  * This module provides a sparse matrix representation, and basic associated matrix manipulations\n  * and operations.\n  *\n  * See the \\ref TutorialSparse \"Sparse tutorial\"\n  *\n  * \\code\n  * #include <Eigen/SparseCore>\n  * \\endcode\n  *\n  * This module depends on: Core.\n  */\n\nnamespace Eigen {\n\n/** The type used to identify a general sparse storage. */\nstruct Sparse {};\n\n}\n\n#include \"src/SparseCore/SparseUtil.h\"\n#include \"src/SparseCore/SparseMatrixBase.h\"\n#include \"src/SparseCore/CompressedStorage.h\"\n#include \"src/SparseCore/AmbiVector.h\"\n#include \"src/SparseCore/SparseMatrix.h\"\n#include \"src/SparseCore/MappedSparseMatrix.h\"\n#include \"src/SparseCore/SparseVector.h\"\n#include \"src/SparseCore/SparseBlock.h\"\n#include \"src/SparseCore/SparseTranspose.h\"\n#include \"src/SparseCore/SparseCwiseUnaryOp.h\"\n#include \"src/SparseCore/SparseCwiseBinaryOp.h\"\n#include \"src/SparseCore/SparseDot.h\"\n#include \"src/SparseCore/SparsePermutation.h\"\n#include \"src/SparseCore/SparseRedux.h\"\n#include \"src/SparseCore/SparseFuzzy.h\"\n#include \"src/SparseCore/ConservativeSparseSparseProduct.h\"\n#include \"src/SparseCore/SparseSparseProductWithPruning.h\"\n#include \"src/SparseCore/SparseProduct.h\"\n#include \"src/SparseCore/SparseDenseProduct.h\"\n#include \"src/SparseCore/SparseDiagonalProduct.h\"\n#include \"src/SparseCore/SparseTriangularView.h\"\n#include \"src/SparseCore/SparseSelfAdjointView.h\"\n#include \"src/SparseCore/TriangularSolver.h\"\n#include \"src/SparseCore/SparseView.h\"\n\n#include \"src/Core/util/ReenableStupidWarnings.h\"\n\n#endif // EIGEN_SPARSECORE_MODULE_H\n\n"
  },
  {
    "path": "libs/eigen/Eigen/SparseLU",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam@inria.fr>\n// Copyright (C) 2012 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SPARSELU_MODULE_H\n#define EIGEN_SPARSELU_MODULE_H\n\n#include \"SparseCore\"\n\n/** \n  * \\defgroup SparseLU_Module SparseLU module\n  * This module defines a supernodal factorization of general sparse matrices.\n  * The code is fully optimized for supernode-panel updates with specialized kernels.\n  * Please, see the documentation of the SparseLU class for more details.\n  */\n\n#include \"src/misc/Solve.h\"\n#include \"src/misc/SparseSolve.h\"\n\n// Ordering interface\n#include \"OrderingMethods\"\n\n#include \"src/SparseLU/SparseLU_gemm_kernel.h\"\n\n#include \"src/SparseLU/SparseLU_Structs.h\"\n#include \"src/SparseLU/SparseLU_SupernodalMatrix.h\"\n#include \"src/SparseLU/SparseLUImpl.h\"\n#include \"src/SparseCore/SparseColEtree.h\"\n#include \"src/SparseLU/SparseLU_Memory.h\"\n#include \"src/SparseLU/SparseLU_heap_relax_snode.h\"\n#include \"src/SparseLU/SparseLU_relax_snode.h\"\n#include \"src/SparseLU/SparseLU_pivotL.h\"\n#include \"src/SparseLU/SparseLU_panel_dfs.h\"\n#include \"src/SparseLU/SparseLU_kernel_bmod.h\"\n#include \"src/SparseLU/SparseLU_panel_bmod.h\"\n#include \"src/SparseLU/SparseLU_column_dfs.h\"\n#include \"src/SparseLU/SparseLU_column_bmod.h\"\n#include \"src/SparseLU/SparseLU_copy_to_ucol.h\"\n#include \"src/SparseLU/SparseLU_pruneL.h\"\n#include \"src/SparseLU/SparseLU_Utils.h\"\n#include \"src/SparseLU/SparseLU.h\"\n\n#endif // EIGEN_SPARSELU_MODULE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/SparseQR",
    "content": "#ifndef EIGEN_SPARSEQR_MODULE_H\n#define EIGEN_SPARSEQR_MODULE_H\n\n#include \"SparseCore\"\n#include \"OrderingMethods\"\n#include \"src/Core/util/DisableStupidWarnings.h\"\n\n/** \\defgroup SparseQR_Module SparseQR module\n  * \\brief Provides QR decomposition for sparse matrices\n  * \n  * This module provides a simplicial version of the left-looking Sparse QR decomposition. \n  * The columns of the input matrix should be reordered to limit the fill-in during the \n  * decomposition. Built-in methods (COLAMD, AMD) or external  methods (METIS) can be used to this end.\n  * See the \\link OrderingMethods_Module OrderingMethods\\endlink module for the list \n  * of built-in and external ordering methods.\n  * \n  * \\code\n  * #include <Eigen/SparseQR>\n  * \\endcode\n  * \n  * \n  */\n\n#include \"src/misc/Solve.h\"\n#include \"src/misc/SparseSolve.h\"\n\n#include \"OrderingMethods\"\n#include \"src/SparseCore/SparseColEtree.h\"\n#include \"src/SparseQR/SparseQR.h\"\n\n#include \"src/Core/util/ReenableStupidWarnings.h\"\n\n#endif\n"
  },
  {
    "path": "libs/eigen/Eigen/StdDeque",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2009 Hauke Heibel <hauke.heibel@googlemail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_STDDEQUE_MODULE_H\n#define EIGEN_STDDEQUE_MODULE_H\n\n#include \"Core\"\n#include <deque>\n\n#if (defined(_MSC_VER) && defined(_WIN64)) /* MSVC auto aligns in 64 bit builds */\n\n#define EIGEN_DEFINE_STL_DEQUE_SPECIALIZATION(...)\n\n#else\n\n#include \"src/StlSupport/StdDeque.h\"\n\n#endif\n\n#endif // EIGEN_STDDEQUE_MODULE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/StdList",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Hauke Heibel <hauke.heibel@googlemail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_STDLIST_MODULE_H\n#define EIGEN_STDLIST_MODULE_H\n\n#include \"Core\"\n#include <list>\n\n#if (defined(_MSC_VER) && defined(_WIN64)) /* MSVC auto aligns in 64 bit builds */    \n\n#define EIGEN_DEFINE_STL_LIST_SPECIALIZATION(...)\n\n#else\n\n#include \"src/StlSupport/StdList.h\"\n\n#endif\n\n#endif // EIGEN_STDLIST_MODULE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/StdVector",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2009 Hauke Heibel <hauke.heibel@googlemail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_STDVECTOR_MODULE_H\n#define EIGEN_STDVECTOR_MODULE_H\n\n#include \"Core\"\n#include <vector>\n\n#if (defined(_MSC_VER) && defined(_WIN64)) /* MSVC auto aligns in 64 bit builds */\n\n#define EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(...)\n\n#else\n\n#include \"src/StlSupport/StdVector.h\"\n\n#endif\n\n#endif // EIGEN_STDVECTOR_MODULE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/SuperLUSupport",
    "content": "#ifndef EIGEN_SUPERLUSUPPORT_MODULE_H\n#define EIGEN_SUPERLUSUPPORT_MODULE_H\n\n#include \"SparseCore\"\n\n#include \"src/Core/util/DisableStupidWarnings.h\"\n\n#ifdef EMPTY\n#define EIGEN_EMPTY_WAS_ALREADY_DEFINED\n#endif\n\ntypedef int int_t;\n#include <slu_Cnames.h>\n#include <supermatrix.h>\n#include <slu_util.h>\n\n// slu_util.h defines a preprocessor token named EMPTY which is really polluting,\n// so we remove it in favor of a SUPERLU_EMPTY token.\n// If EMPTY was already defined then we don't undef it.\n\n#if defined(EIGEN_EMPTY_WAS_ALREADY_DEFINED)\n# undef EIGEN_EMPTY_WAS_ALREADY_DEFINED\n#elif defined(EMPTY)\n# undef EMPTY\n#endif\n\n#define SUPERLU_EMPTY (-1)\n\nnamespace Eigen { struct SluMatrix; }\n\n/** \\ingroup Support_modules\n  * \\defgroup SuperLUSupport_Module SuperLUSupport module\n  *\n  * This module provides an interface to the <a href=\"http://crd-legacy.lbl.gov/~xiaoye/SuperLU/\">SuperLU</a> library.\n  * It provides the following factorization class:\n  * - class SuperLU: a supernodal sequential LU factorization.\n  * - class SuperILU: a supernodal sequential incomplete LU factorization (to be used as a preconditioner for iterative methods).\n  *\n  * \\warning When including this module, you have to use SUPERLU_EMPTY instead of EMPTY which is no longer defined because it is too polluting.\n  *\n  * \\code\n  * #include <Eigen/SuperLUSupport>\n  * \\endcode\n  *\n  * In order to use this module, the superlu headers must be accessible from the include paths, and your binary must be linked to the superlu library and its dependencies.\n  * The dependencies depend on how superlu has been compiled.\n  * For a cmake based project, you can use our FindSuperLU.cmake module to help you in this task.\n  *\n  */\n\n#include \"src/misc/Solve.h\"\n#include \"src/misc/SparseSolve.h\"\n\n#include \"src/SuperLUSupport/SuperLUSupport.h\"\n\n\n#include \"src/Core/util/ReenableStupidWarnings.h\"\n\n#endif // EIGEN_SUPERLUSUPPORT_MODULE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/UmfPackSupport",
    "content": "#ifndef EIGEN_UMFPACKSUPPORT_MODULE_H\n#define EIGEN_UMFPACKSUPPORT_MODULE_H\n\n#include \"SparseCore\"\n\n#include \"src/Core/util/DisableStupidWarnings.h\"\n\nextern \"C\" {\n#include <umfpack.h>\n}\n\n/** \\ingroup Support_modules\n  * \\defgroup UmfPackSupport_Module UmfPackSupport module\n  *\n  * This module provides an interface to the UmfPack library which is part of the <a href=\"http://www.suitesparse.com\">suitesparse</a> package.\n  * It provides the following factorization class:\n  * - class UmfPackLU: a multifrontal sequential LU factorization.\n  *\n  * \\code\n  * #include <Eigen/UmfPackSupport>\n  * \\endcode\n  *\n  * In order to use this module, the umfpack headers must be accessible from the include paths, and your binary must be linked to the umfpack library and its dependencies.\n  * The dependencies depend on how umfpack has been compiled.\n  * For a cmake based project, you can use our FindUmfPack.cmake module to help you in this task.\n  *\n  */\n\n#include \"src/misc/Solve.h\"\n#include \"src/misc/SparseSolve.h\"\n\n#include \"src/UmfPackSupport/UmfPackSupport.h\"\n\n#include \"src/Core/util/ReenableStupidWarnings.h\"\n\n#endif // EIGEN_UMFPACKSUPPORT_MODULE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/CMakeLists.txt",
    "content": "file(GLOB Eigen_src_subdirectories \"*\")\nescape_string_as_regex(ESCAPED_CMAKE_CURRENT_SOURCE_DIR \"${CMAKE_CURRENT_SOURCE_DIR}\")\nforeach(f ${Eigen_src_subdirectories})\n  if(NOT f MATCHES \"\\\\.txt\" AND NOT f MATCHES \"${ESCAPED_CMAKE_CURRENT_SOURCE_DIR}/[.].+\" )\n    add_subdirectory(${f})\n  endif()\nendforeach()\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Cholesky/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_Cholesky_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_Cholesky_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/Cholesky COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Cholesky/LDLT.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2011 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2009 Keir Mierle <mierle@gmail.com>\n// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n// Copyright (C) 2011 Timothy E. Holy <tim.holy@gmail.com >\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_LDLT_H\n#define EIGEN_LDLT_H\n\nnamespace Eigen { \n\nnamespace internal {\n  template<typename MatrixType, int UpLo> struct LDLT_Traits;\n\n  // PositiveSemiDef means positive semi-definite and non-zero; same for NegativeSemiDef\n  enum SignMatrix { PositiveSemiDef, NegativeSemiDef, ZeroSign, Indefinite };\n}\n\n/** \\ingroup Cholesky_Module\n  *\n  * \\class LDLT\n  *\n  * \\brief Robust Cholesky decomposition of a matrix with pivoting\n  *\n  * \\param MatrixType the type of the matrix of which to compute the LDL^T Cholesky decomposition\n  * \\param UpLo the triangular part that will be used for the decompositon: Lower (default) or Upper.\n  *             The other triangular part won't be read.\n  *\n  * Perform a robust Cholesky decomposition of a positive semidefinite or negative semidefinite\n  * matrix \\f$ A \\f$ such that \\f$ A =  P^TLDL^*P \\f$, where P is a permutation matrix, L\n  * is lower triangular with a unit diagonal and D is a diagonal matrix.\n  *\n  * The decomposition uses pivoting to ensure stability, so that L will have\n  * zeros in the bottom right rank(A) - n submatrix. Avoiding the square root\n  * on D also stabilizes the computation.\n  *\n  * Remember that Cholesky decompositions are not rank-revealing. Also, do not use a Cholesky\n  * decomposition to determine whether a system of equations has a solution.\n  *\n  * \\sa MatrixBase::ldlt(), class LLT\n  */\ntemplate<typename _MatrixType, int _UpLo> class LDLT\n{\n  public:\n    typedef _MatrixType MatrixType;\n    enum {\n      RowsAtCompileTime = MatrixType::RowsAtCompileTime,\n      ColsAtCompileTime = MatrixType::ColsAtCompileTime,\n      Options = MatrixType::Options & ~RowMajorBit, // these are the options for the TmpMatrixType, we need a ColMajor matrix here!\n      MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,\n      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime,\n      UpLo = _UpLo\n    };\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename NumTraits<typename MatrixType::Scalar>::Real RealScalar;\n    typedef typename MatrixType::Index Index;\n    typedef Matrix<Scalar, RowsAtCompileTime, 1, Options, MaxRowsAtCompileTime, 1> TmpMatrixType;\n\n    typedef Transpositions<RowsAtCompileTime, MaxRowsAtCompileTime> TranspositionType;\n    typedef PermutationMatrix<RowsAtCompileTime, MaxRowsAtCompileTime> PermutationType;\n\n    typedef internal::LDLT_Traits<MatrixType,UpLo> Traits;\n\n    /** \\brief Default Constructor.\n      *\n      * The default constructor is useful in cases in which the user intends to\n      * perform decompositions via LDLT::compute(const MatrixType&).\n      */\n    LDLT() \n      : m_matrix(), \n        m_transpositions(), \n        m_sign(internal::ZeroSign),\n        m_isInitialized(false) \n    {}\n\n    /** \\brief Default Constructor with memory preallocation\n      *\n      * Like the default constructor but with preallocation of the internal data\n      * according to the specified problem \\a size.\n      * \\sa LDLT()\n      */\n    LDLT(Index size)\n      : m_matrix(size, size),\n        m_transpositions(size),\n        m_temporary(size),\n        m_sign(internal::ZeroSign),\n        m_isInitialized(false)\n    {}\n\n    /** \\brief Constructor with decomposition\n      *\n      * This calculates the decomposition for the input \\a matrix.\n      * \\sa LDLT(Index size)\n      */\n    LDLT(const MatrixType& matrix)\n      : m_matrix(matrix.rows(), matrix.cols()),\n        m_transpositions(matrix.rows()),\n        m_temporary(matrix.rows()),\n        m_sign(internal::ZeroSign),\n        m_isInitialized(false)\n    {\n      compute(matrix);\n    }\n\n    /** Clear any existing decomposition\n     * \\sa rankUpdate(w,sigma)\n     */\n    void setZero()\n    {\n      m_isInitialized = false;\n    }\n\n    /** \\returns a view of the upper triangular matrix U */\n    inline typename Traits::MatrixU matrixU() const\n    {\n      eigen_assert(m_isInitialized && \"LDLT is not initialized.\");\n      return Traits::getU(m_matrix);\n    }\n\n    /** \\returns a view of the lower triangular matrix L */\n    inline typename Traits::MatrixL matrixL() const\n    {\n      eigen_assert(m_isInitialized && \"LDLT is not initialized.\");\n      return Traits::getL(m_matrix);\n    }\n\n    /** \\returns the permutation matrix P as a transposition sequence.\n      */\n    inline const TranspositionType& transpositionsP() const\n    {\n      eigen_assert(m_isInitialized && \"LDLT is not initialized.\");\n      return m_transpositions;\n    }\n\n    /** \\returns the coefficients of the diagonal matrix D */\n    inline Diagonal<const MatrixType> vectorD() const\n    {\n      eigen_assert(m_isInitialized && \"LDLT is not initialized.\");\n      return m_matrix.diagonal();\n    }\n\n    /** \\returns true if the matrix is positive (semidefinite) */\n    inline bool isPositive() const\n    {\n      eigen_assert(m_isInitialized && \"LDLT is not initialized.\");\n      return m_sign == internal::PositiveSemiDef || m_sign == internal::ZeroSign;\n    }\n    \n    #ifdef EIGEN2_SUPPORT\n    inline bool isPositiveDefinite() const\n    {\n      return isPositive();\n    }\n    #endif\n\n    /** \\returns true if the matrix is negative (semidefinite) */\n    inline bool isNegative(void) const\n    {\n      eigen_assert(m_isInitialized && \"LDLT is not initialized.\");\n      return m_sign == internal::NegativeSemiDef || m_sign == internal::ZeroSign;\n    }\n\n    /** \\returns a solution x of \\f$ A x = b \\f$ using the current decomposition of A.\n      *\n      * This function also supports in-place solves using the syntax <tt>x = decompositionObject.solve(x)</tt> .\n      *\n      * \\note_about_checking_solutions\n      *\n      * More precisely, this method solves \\f$ A x = b \\f$ using the decomposition \\f$ A = P^T L D L^* P \\f$\n      * by solving the systems \\f$ P^T y_1 = b \\f$, \\f$ L y_2 = y_1 \\f$, \\f$ D y_3 = y_2 \\f$, \n      * \\f$ L^* y_4 = y_3 \\f$ and \\f$ P x = y_4 \\f$ in succession. If the matrix \\f$ A \\f$ is singular, then\n      * \\f$ D \\f$ will also be singular (all the other matrices are invertible). In that case, the\n      * least-square solution of \\f$ D y_3 = y_2 \\f$ is computed. This does not mean that this function\n      * computes the least-square solution of \\f$ A x = b \\f$ is \\f$ A \\f$ is singular.\n      *\n      * \\sa MatrixBase::ldlt()\n      */\n    template<typename Rhs>\n    inline const internal::solve_retval<LDLT, Rhs>\n    solve(const MatrixBase<Rhs>& b) const\n    {\n      eigen_assert(m_isInitialized && \"LDLT is not initialized.\");\n      eigen_assert(m_matrix.rows()==b.rows()\n                && \"LDLT::solve(): invalid number of rows of the right hand side matrix b\");\n      return internal::solve_retval<LDLT, Rhs>(*this, b.derived());\n    }\n\n    #ifdef EIGEN2_SUPPORT\n    template<typename OtherDerived, typename ResultType>\n    bool solve(const MatrixBase<OtherDerived>& b, ResultType *result) const\n    {\n      *result = this->solve(b);\n      return true;\n    }\n    #endif\n\n    template<typename Derived>\n    bool solveInPlace(MatrixBase<Derived> &bAndX) const;\n\n    LDLT& compute(const MatrixType& matrix);\n\n    template <typename Derived>\n    LDLT& rankUpdate(const MatrixBase<Derived>& w, const RealScalar& alpha=1);\n\n    /** \\returns the internal LDLT decomposition matrix\n      *\n      * TODO: document the storage layout\n      */\n    inline const MatrixType& matrixLDLT() const\n    {\n      eigen_assert(m_isInitialized && \"LDLT is not initialized.\");\n      return m_matrix;\n    }\n\n    MatrixType reconstructedMatrix() const;\n\n    inline Index rows() const { return m_matrix.rows(); }\n    inline Index cols() const { return m_matrix.cols(); }\n\n    /** \\brief Reports whether previous computation was successful.\n      *\n      * \\returns \\c Success if computation was succesful,\n      *          \\c NumericalIssue if the matrix.appears to be negative.\n      */\n    ComputationInfo info() const\n    {\n      eigen_assert(m_isInitialized && \"LDLT is not initialized.\");\n      return Success;\n    }\n\n  protected:\n    \n    static void check_template_parameters()\n    {\n      EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar);\n    }\n\n    /** \\internal\n      * Used to compute and store the Cholesky decomposition A = L D L^* = U^* D U.\n      * The strict upper part is used during the decomposition, the strict lower\n      * part correspond to the coefficients of L (its diagonal is equal to 1 and\n      * is not stored), and the diagonal entries correspond to D.\n      */\n    MatrixType m_matrix;\n    TranspositionType m_transpositions;\n    TmpMatrixType m_temporary;\n    internal::SignMatrix m_sign;\n    bool m_isInitialized;\n};\n\nnamespace internal {\n\ntemplate<int UpLo> struct ldlt_inplace;\n\ntemplate<> struct ldlt_inplace<Lower>\n{\n  template<typename MatrixType, typename TranspositionType, typename Workspace>\n  static bool unblocked(MatrixType& mat, TranspositionType& transpositions, Workspace& temp, SignMatrix& sign)\n  {\n    using std::abs;\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename MatrixType::RealScalar RealScalar;\n    typedef typename MatrixType::Index Index;\n    eigen_assert(mat.rows()==mat.cols());\n    const Index size = mat.rows();\n\n    if (size <= 1)\n    {\n      transpositions.setIdentity();\n      if (numext::real(mat.coeff(0,0)) > 0) sign = PositiveSemiDef;\n      else if (numext::real(mat.coeff(0,0)) < 0) sign = NegativeSemiDef;\n      else sign = ZeroSign;\n      return true;\n    }\n\n    for (Index k = 0; k < size; ++k)\n    {\n      // Find largest diagonal element\n      Index index_of_biggest_in_corner;\n      mat.diagonal().tail(size-k).cwiseAbs().maxCoeff(&index_of_biggest_in_corner);\n      index_of_biggest_in_corner += k;\n\n      transpositions.coeffRef(k) = index_of_biggest_in_corner;\n      if(k != index_of_biggest_in_corner)\n      {\n        // apply the transposition while taking care to consider only\n        // the lower triangular part\n        Index s = size-index_of_biggest_in_corner-1; // trailing size after the biggest element\n        mat.row(k).head(k).swap(mat.row(index_of_biggest_in_corner).head(k));\n        mat.col(k).tail(s).swap(mat.col(index_of_biggest_in_corner).tail(s));\n        std::swap(mat.coeffRef(k,k),mat.coeffRef(index_of_biggest_in_corner,index_of_biggest_in_corner));\n        for(int i=k+1;i<index_of_biggest_in_corner;++i)\n        {\n          Scalar tmp = mat.coeffRef(i,k);\n          mat.coeffRef(i,k) = numext::conj(mat.coeffRef(index_of_biggest_in_corner,i));\n          mat.coeffRef(index_of_biggest_in_corner,i) = numext::conj(tmp);\n        }\n        if(NumTraits<Scalar>::IsComplex)\n          mat.coeffRef(index_of_biggest_in_corner,k) = numext::conj(mat.coeff(index_of_biggest_in_corner,k));\n      }\n\n      // partition the matrix:\n      //       A00 |  -  |  -\n      // lu  = A10 | A11 |  -\n      //       A20 | A21 | A22\n      Index rs = size - k - 1;\n      Block<MatrixType,Dynamic,1> A21(mat,k+1,k,rs,1);\n      Block<MatrixType,1,Dynamic> A10(mat,k,0,1,k);\n      Block<MatrixType,Dynamic,Dynamic> A20(mat,k+1,0,rs,k);\n\n      if(k>0)\n      {\n        temp.head(k) = mat.diagonal().real().head(k).asDiagonal() * A10.adjoint();\n        mat.coeffRef(k,k) -= (A10 * temp.head(k)).value();\n        if(rs>0)\n          A21.noalias() -= A20 * temp.head(k);\n      }\n      \n      // In some previous versions of Eigen (e.g., 3.2.1), the scaling was omitted if the pivot\n      // was smaller than the cutoff value. However, soince LDLT is not rank-revealing\n      // we should only make sure we do not introduce INF or NaN values.\n      // LAPACK also uses 0 as the cutoff value.\n      RealScalar realAkk = numext::real(mat.coeffRef(k,k));\n      if((rs>0) && (abs(realAkk) > RealScalar(0)))\n        A21 /= realAkk;\n\n      if (sign == PositiveSemiDef) {\n        if (realAkk < 0) sign = Indefinite;\n      } else if (sign == NegativeSemiDef) {\n        if (realAkk > 0) sign = Indefinite;\n      } else if (sign == ZeroSign) {\n        if (realAkk > 0) sign = PositiveSemiDef;\n        else if (realAkk < 0) sign = NegativeSemiDef;\n      }\n    }\n\n    return true;\n  }\n\n  // Reference for the algorithm: Davis and Hager, \"Multiple Rank\n  // Modifications of a Sparse Cholesky Factorization\" (Algorithm 1)\n  // Trivial rearrangements of their computations (Timothy E. Holy)\n  // allow their algorithm to work for rank-1 updates even if the\n  // original matrix is not of full rank.\n  // Here only rank-1 updates are implemented, to reduce the\n  // requirement for intermediate storage and improve accuracy\n  template<typename MatrixType, typename WDerived>\n  static bool updateInPlace(MatrixType& mat, MatrixBase<WDerived>& w, const typename MatrixType::RealScalar& sigma=1)\n  {\n    using numext::isfinite;\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename MatrixType::RealScalar RealScalar;\n    typedef typename MatrixType::Index Index;\n\n    const Index size = mat.rows();\n    eigen_assert(mat.cols() == size && w.size()==size);\n\n    RealScalar alpha = 1;\n\n    // Apply the update\n    for (Index j = 0; j < size; j++)\n    {\n      // Check for termination due to an original decomposition of low-rank\n      if (!(isfinite)(alpha))\n        break;\n\n      // Update the diagonal terms\n      RealScalar dj = numext::real(mat.coeff(j,j));\n      Scalar wj = w.coeff(j);\n      RealScalar swj2 = sigma*numext::abs2(wj);\n      RealScalar gamma = dj*alpha + swj2;\n\n      mat.coeffRef(j,j) += swj2/alpha;\n      alpha += swj2/dj;\n\n\n      // Update the terms of L\n      Index rs = size-j-1;\n      w.tail(rs) -= wj * mat.col(j).tail(rs);\n      if(gamma != 0)\n        mat.col(j).tail(rs) += (sigma*numext::conj(wj)/gamma)*w.tail(rs);\n    }\n    return true;\n  }\n\n  template<typename MatrixType, typename TranspositionType, typename Workspace, typename WType>\n  static bool update(MatrixType& mat, const TranspositionType& transpositions, Workspace& tmp, const WType& w, const typename MatrixType::RealScalar& sigma=1)\n  {\n    // Apply the permutation to the input w\n    tmp = transpositions * w;\n\n    return ldlt_inplace<Lower>::updateInPlace(mat,tmp,sigma);\n  }\n};\n\ntemplate<> struct ldlt_inplace<Upper>\n{\n  template<typename MatrixType, typename TranspositionType, typename Workspace>\n  static EIGEN_STRONG_INLINE bool unblocked(MatrixType& mat, TranspositionType& transpositions, Workspace& temp, SignMatrix& sign)\n  {\n    Transpose<MatrixType> matt(mat);\n    return ldlt_inplace<Lower>::unblocked(matt, transpositions, temp, sign);\n  }\n\n  template<typename MatrixType, typename TranspositionType, typename Workspace, typename WType>\n  static EIGEN_STRONG_INLINE bool update(MatrixType& mat, TranspositionType& transpositions, Workspace& tmp, WType& w, const typename MatrixType::RealScalar& sigma=1)\n  {\n    Transpose<MatrixType> matt(mat);\n    return ldlt_inplace<Lower>::update(matt, transpositions, tmp, w.conjugate(), sigma);\n  }\n};\n\ntemplate<typename MatrixType> struct LDLT_Traits<MatrixType,Lower>\n{\n  typedef const TriangularView<const MatrixType, UnitLower> MatrixL;\n  typedef const TriangularView<const typename MatrixType::AdjointReturnType, UnitUpper> MatrixU;\n  static inline MatrixL getL(const MatrixType& m) { return m; }\n  static inline MatrixU getU(const MatrixType& m) { return m.adjoint(); }\n};\n\ntemplate<typename MatrixType> struct LDLT_Traits<MatrixType,Upper>\n{\n  typedef const TriangularView<const typename MatrixType::AdjointReturnType, UnitLower> MatrixL;\n  typedef const TriangularView<const MatrixType, UnitUpper> MatrixU;\n  static inline MatrixL getL(const MatrixType& m) { return m.adjoint(); }\n  static inline MatrixU getU(const MatrixType& m) { return m; }\n};\n\n} // end namespace internal\n\n/** Compute / recompute the LDLT decomposition A = L D L^* = U^* D U of \\a matrix\n  */\ntemplate<typename MatrixType, int _UpLo>\nLDLT<MatrixType,_UpLo>& LDLT<MatrixType,_UpLo>::compute(const MatrixType& a)\n{\n  check_template_parameters();\n  \n  eigen_assert(a.rows()==a.cols());\n  const Index size = a.rows();\n\n  m_matrix = a;\n\n  m_transpositions.resize(size);\n  m_isInitialized = false;\n  m_temporary.resize(size);\n  m_sign = internal::ZeroSign;\n\n  internal::ldlt_inplace<UpLo>::unblocked(m_matrix, m_transpositions, m_temporary, m_sign);\n\n  m_isInitialized = true;\n  return *this;\n}\n\n/** Update the LDLT decomposition:  given A = L D L^T, efficiently compute the decomposition of A + sigma w w^T.\n * \\param w a vector to be incorporated into the decomposition.\n * \\param sigma a scalar, +1 for updates and -1 for \"downdates,\" which correspond to removing previously-added column vectors. Optional; default value is +1.\n * \\sa setZero()\n  */\ntemplate<typename MatrixType, int _UpLo>\ntemplate<typename Derived>\nLDLT<MatrixType,_UpLo>& LDLT<MatrixType,_UpLo>::rankUpdate(const MatrixBase<Derived>& w, const typename LDLT<MatrixType,_UpLo>::RealScalar& sigma)\n{\n  const Index size = w.rows();\n  if (m_isInitialized)\n  {\n    eigen_assert(m_matrix.rows()==size);\n  }\n  else\n  {    \n    m_matrix.resize(size,size);\n    m_matrix.setZero();\n    m_transpositions.resize(size);\n    for (Index i = 0; i < size; i++)\n      m_transpositions.coeffRef(i) = i;\n    m_temporary.resize(size);\n    m_sign = sigma>=0 ? internal::PositiveSemiDef : internal::NegativeSemiDef;\n    m_isInitialized = true;\n  }\n\n  internal::ldlt_inplace<UpLo>::update(m_matrix, m_transpositions, m_temporary, w, sigma);\n\n  return *this;\n}\n\nnamespace internal {\ntemplate<typename _MatrixType, int _UpLo, typename Rhs>\nstruct solve_retval<LDLT<_MatrixType,_UpLo>, Rhs>\n  : solve_retval_base<LDLT<_MatrixType,_UpLo>, Rhs>\n{\n  typedef LDLT<_MatrixType,_UpLo> LDLTType;\n  EIGEN_MAKE_SOLVE_HELPERS(LDLTType,Rhs)\n\n  template<typename Dest> void evalTo(Dest& dst) const\n  {\n    eigen_assert(rhs().rows() == dec().matrixLDLT().rows());\n    // dst = P b\n    dst = dec().transpositionsP() * rhs();\n\n    // dst = L^-1 (P b)\n    dec().matrixL().solveInPlace(dst);\n\n    // dst = D^-1 (L^-1 P b)\n    // more precisely, use pseudo-inverse of D (see bug 241)\n    using std::abs;\n    using std::max;\n    typedef typename LDLTType::MatrixType MatrixType;\n    typedef typename LDLTType::RealScalar RealScalar;\n    const typename Diagonal<const MatrixType>::RealReturnType vectorD(dec().vectorD());\n    // In some previous versions, tolerance was set to the max of 1/highest and the maximal diagonal entry * epsilon\n    // as motivated by LAPACK's xGELSS:\n    // RealScalar tolerance = (max)(vectorD.array().abs().maxCoeff() *NumTraits<RealScalar>::epsilon(),RealScalar(1) / NumTraits<RealScalar>::highest());\n    // However, LDLT is not rank revealing, and so adjusting the tolerance wrt to the highest\n    // diagonal element is not well justified and to numerical issues in some cases.\n    // Moreover, Lapack's xSYTRS routines use 0 for the tolerance.\n    RealScalar tolerance = RealScalar(1) / NumTraits<RealScalar>::highest();\n    \n    for (Index i = 0; i < vectorD.size(); ++i) {\n      if(abs(vectorD(i)) > tolerance)\n        dst.row(i) /= vectorD(i);\n      else\n        dst.row(i).setZero();\n    }\n\n    // dst = L^-T (D^-1 L^-1 P b)\n    dec().matrixU().solveInPlace(dst);\n\n    // dst = P^-1 (L^-T D^-1 L^-1 P b) = A^-1 b\n    dst = dec().transpositionsP().transpose() * dst;\n  }\n};\n}\n\n/** \\internal use x = ldlt_object.solve(x);\n  *\n  * This is the \\em in-place version of solve().\n  *\n  * \\param bAndX represents both the right-hand side matrix b and result x.\n  *\n  * \\returns true always! If you need to check for existence of solutions, use another decomposition like LU, QR, or SVD.\n  *\n  * This version avoids a copy when the right hand side matrix b is not\n  * needed anymore.\n  *\n  * \\sa LDLT::solve(), MatrixBase::ldlt()\n  */\ntemplate<typename MatrixType,int _UpLo>\ntemplate<typename Derived>\nbool LDLT<MatrixType,_UpLo>::solveInPlace(MatrixBase<Derived> &bAndX) const\n{\n  eigen_assert(m_isInitialized && \"LDLT is not initialized.\");\n  eigen_assert(m_matrix.rows() == bAndX.rows());\n\n  bAndX = this->solve(bAndX);\n\n  return true;\n}\n\n/** \\returns the matrix represented by the decomposition,\n * i.e., it returns the product: P^T L D L^* P.\n * This function is provided for debug purpose. */\ntemplate<typename MatrixType, int _UpLo>\nMatrixType LDLT<MatrixType,_UpLo>::reconstructedMatrix() const\n{\n  eigen_assert(m_isInitialized && \"LDLT is not initialized.\");\n  const Index size = m_matrix.rows();\n  MatrixType res(size,size);\n\n  // P\n  res.setIdentity();\n  res = transpositionsP() * res;\n  // L^* P\n  res = matrixU() * res;\n  // D(L^*P)\n  res = vectorD().real().asDiagonal() * res;\n  // L(DL^*P)\n  res = matrixL() * res;\n  // P^T (LDL^*P)\n  res = transpositionsP().transpose() * res;\n\n  return res;\n}\n\n/** \\cholesky_module\n  * \\returns the Cholesky decomposition with full pivoting without square root of \\c *this\n  */\ntemplate<typename MatrixType, unsigned int UpLo>\ninline const LDLT<typename SelfAdjointView<MatrixType, UpLo>::PlainObject, UpLo>\nSelfAdjointView<MatrixType, UpLo>::ldlt() const\n{\n  return LDLT<PlainObject,UpLo>(m_matrix);\n}\n\n/** \\cholesky_module\n  * \\returns the Cholesky decomposition with full pivoting without square root of \\c *this\n  */\ntemplate<typename Derived>\ninline const LDLT<typename MatrixBase<Derived>::PlainObject>\nMatrixBase<Derived>::ldlt() const\n{\n  return LDLT<PlainObject>(derived());\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_LDLT_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Cholesky/LLT.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_LLT_H\n#define EIGEN_LLT_H\n\nnamespace Eigen { \n\nnamespace internal{\ntemplate<typename MatrixType, int UpLo> struct LLT_Traits;\n}\n\n/** \\ingroup Cholesky_Module\n  *\n  * \\class LLT\n  *\n  * \\brief Standard Cholesky decomposition (LL^T) of a matrix and associated features\n  *\n  * \\param MatrixType the type of the matrix of which we are computing the LL^T Cholesky decomposition\n  * \\param UpLo the triangular part that will be used for the decompositon: Lower (default) or Upper.\n  *             The other triangular part won't be read.\n  *\n  * This class performs a LL^T Cholesky decomposition of a symmetric, positive definite\n  * matrix A such that A = LL^* = U^*U, where L is lower triangular.\n  *\n  * While the Cholesky decomposition is particularly useful to solve selfadjoint problems like  D^*D x = b,\n  * for that purpose, we recommend the Cholesky decomposition without square root which is more stable\n  * and even faster. Nevertheless, this standard Cholesky decomposition remains useful in many other\n  * situations like generalised eigen problems with hermitian matrices.\n  *\n  * Remember that Cholesky decompositions are not rank-revealing. This LLT decomposition is only stable on positive definite matrices,\n  * use LDLT instead for the semidefinite case. Also, do not use a Cholesky decomposition to determine whether a system of equations\n  * has a solution.\n  *\n  * Example: \\include LLT_example.cpp\n  * Output: \\verbinclude LLT_example.out\n  *    \n  * \\sa MatrixBase::llt(), class LDLT\n  */\n /* HEY THIS DOX IS DISABLED BECAUSE THERE's A BUG EITHER HERE OR IN LDLT ABOUT THAT (OR BOTH)\n  * Note that during the decomposition, only the upper triangular part of A is considered. Therefore,\n  * the strict lower part does not have to store correct values.\n  */\ntemplate<typename _MatrixType, int _UpLo> class LLT\n{\n  public:\n    typedef _MatrixType MatrixType;\n    enum {\n      RowsAtCompileTime = MatrixType::RowsAtCompileTime,\n      ColsAtCompileTime = MatrixType::ColsAtCompileTime,\n      Options = MatrixType::Options,\n      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime\n    };\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename NumTraits<typename MatrixType::Scalar>::Real RealScalar;\n    typedef typename MatrixType::Index Index;\n\n    enum {\n      PacketSize = internal::packet_traits<Scalar>::size,\n      AlignmentMask = int(PacketSize)-1,\n      UpLo = _UpLo\n    };\n\n    typedef internal::LLT_Traits<MatrixType,UpLo> Traits;\n\n    /**\n      * \\brief Default Constructor.\n      *\n      * The default constructor is useful in cases in which the user intends to\n      * perform decompositions via LLT::compute(const MatrixType&).\n      */\n    LLT() : m_matrix(), m_isInitialized(false) {}\n\n    /** \\brief Default Constructor with memory preallocation\n      *\n      * Like the default constructor but with preallocation of the internal data\n      * according to the specified problem \\a size.\n      * \\sa LLT()\n      */\n    LLT(Index size) : m_matrix(size, size),\n                    m_isInitialized(false) {}\n\n    LLT(const MatrixType& matrix)\n      : m_matrix(matrix.rows(), matrix.cols()),\n        m_isInitialized(false)\n    {\n      compute(matrix);\n    }\n\n    /** \\returns a view of the upper triangular matrix U */\n    inline typename Traits::MatrixU matrixU() const\n    {\n      eigen_assert(m_isInitialized && \"LLT is not initialized.\");\n      return Traits::getU(m_matrix);\n    }\n\n    /** \\returns a view of the lower triangular matrix L */\n    inline typename Traits::MatrixL matrixL() const\n    {\n      eigen_assert(m_isInitialized && \"LLT is not initialized.\");\n      return Traits::getL(m_matrix);\n    }\n\n    /** \\returns the solution x of \\f$ A x = b \\f$ using the current decomposition of A.\n      *\n      * Since this LLT class assumes anyway that the matrix A is invertible, the solution\n      * theoretically exists and is unique regardless of b.\n      *\n      * Example: \\include LLT_solve.cpp\n      * Output: \\verbinclude LLT_solve.out\n      *\n      * \\sa solveInPlace(), MatrixBase::llt()\n      */\n    template<typename Rhs>\n    inline const internal::solve_retval<LLT, Rhs>\n    solve(const MatrixBase<Rhs>& b) const\n    {\n      eigen_assert(m_isInitialized && \"LLT is not initialized.\");\n      eigen_assert(m_matrix.rows()==b.rows()\n                && \"LLT::solve(): invalid number of rows of the right hand side matrix b\");\n      return internal::solve_retval<LLT, Rhs>(*this, b.derived());\n    }\n\n    #ifdef EIGEN2_SUPPORT\n    template<typename OtherDerived, typename ResultType>\n    bool solve(const MatrixBase<OtherDerived>& b, ResultType *result) const\n    {\n      *result = this->solve(b);\n      return true;\n    }\n    \n    bool isPositiveDefinite() const { return true; }\n    #endif\n\n    template<typename Derived>\n    void solveInPlace(MatrixBase<Derived> &bAndX) const;\n\n    LLT& compute(const MatrixType& matrix);\n\n    /** \\returns the LLT decomposition matrix\n      *\n      * TODO: document the storage layout\n      */\n    inline const MatrixType& matrixLLT() const\n    {\n      eigen_assert(m_isInitialized && \"LLT is not initialized.\");\n      return m_matrix;\n    }\n\n    MatrixType reconstructedMatrix() const;\n\n\n    /** \\brief Reports whether previous computation was successful.\n      *\n      * \\returns \\c Success if computation was succesful,\n      *          \\c NumericalIssue if the matrix.appears to be negative.\n      */\n    ComputationInfo info() const\n    {\n      eigen_assert(m_isInitialized && \"LLT is not initialized.\");\n      return m_info;\n    }\n\n    inline Index rows() const { return m_matrix.rows(); }\n    inline Index cols() const { return m_matrix.cols(); }\n\n    template<typename VectorType>\n    LLT rankUpdate(const VectorType& vec, const RealScalar& sigma = 1);\n\n  protected:\n    \n    static void check_template_parameters()\n    {\n      EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar);\n    }\n    \n    /** \\internal\n      * Used to compute and store L\n      * The strict upper part is not used and even not initialized.\n      */\n    MatrixType m_matrix;\n    bool m_isInitialized;\n    ComputationInfo m_info;\n};\n\nnamespace internal {\n\ntemplate<typename Scalar, int UpLo> struct llt_inplace;\n\ntemplate<typename MatrixType, typename VectorType>\nstatic typename MatrixType::Index llt_rank_update_lower(MatrixType& mat, const VectorType& vec, const typename MatrixType::RealScalar& sigma)\n{\n  using std::sqrt;\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename MatrixType::RealScalar RealScalar;\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::ColXpr ColXpr;\n  typedef typename internal::remove_all<ColXpr>::type ColXprCleaned;\n  typedef typename ColXprCleaned::SegmentReturnType ColXprSegment;\n  typedef Matrix<Scalar,Dynamic,1> TempVectorType;\n  typedef typename TempVectorType::SegmentReturnType TempVecSegment;\n\n  Index n = mat.cols();\n  eigen_assert(mat.rows()==n && vec.size()==n);\n\n  TempVectorType temp;\n\n  if(sigma>0)\n  {\n    // This version is based on Givens rotations.\n    // It is faster than the other one below, but only works for updates,\n    // i.e., for sigma > 0\n    temp = sqrt(sigma) * vec;\n\n    for(Index i=0; i<n; ++i)\n    {\n      JacobiRotation<Scalar> g;\n      g.makeGivens(mat(i,i), -temp(i), &mat(i,i));\n\n      Index rs = n-i-1;\n      if(rs>0)\n      {\n        ColXprSegment x(mat.col(i).tail(rs));\n        TempVecSegment y(temp.tail(rs));\n        apply_rotation_in_the_plane(x, y, g);\n      }\n    }\n  }\n  else\n  {\n    temp = vec;\n    RealScalar beta = 1;\n    for(Index j=0; j<n; ++j)\n    {\n      RealScalar Ljj = numext::real(mat.coeff(j,j));\n      RealScalar dj = numext::abs2(Ljj);\n      Scalar wj = temp.coeff(j);\n      RealScalar swj2 = sigma*numext::abs2(wj);\n      RealScalar gamma = dj*beta + swj2;\n\n      RealScalar x = dj + swj2/beta;\n      if (x<=RealScalar(0))\n        return j;\n      RealScalar nLjj = sqrt(x);\n      mat.coeffRef(j,j) = nLjj;\n      beta += swj2/dj;\n\n      // Update the terms of L\n      Index rs = n-j-1;\n      if(rs)\n      {\n        temp.tail(rs) -= (wj/Ljj) * mat.col(j).tail(rs);\n        if(gamma != 0)\n          mat.col(j).tail(rs) = (nLjj/Ljj) * mat.col(j).tail(rs) + (nLjj * sigma*numext::conj(wj)/gamma)*temp.tail(rs);\n      }\n    }\n  }\n  return -1;\n}\n\ntemplate<typename Scalar> struct llt_inplace<Scalar, Lower>\n{\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  template<typename MatrixType>\n  static typename MatrixType::Index unblocked(MatrixType& mat)\n  {\n    using std::sqrt;\n    typedef typename MatrixType::Index Index;\n    \n    eigen_assert(mat.rows()==mat.cols());\n    const Index size = mat.rows();\n    for(Index k = 0; k < size; ++k)\n    {\n      Index rs = size-k-1; // remaining size\n\n      Block<MatrixType,Dynamic,1> A21(mat,k+1,k,rs,1);\n      Block<MatrixType,1,Dynamic> A10(mat,k,0,1,k);\n      Block<MatrixType,Dynamic,Dynamic> A20(mat,k+1,0,rs,k);\n\n      RealScalar x = numext::real(mat.coeff(k,k));\n      if (k>0) x -= A10.squaredNorm();\n      if (x<=RealScalar(0))\n        return k;\n      mat.coeffRef(k,k) = x = sqrt(x);\n      if (k>0 && rs>0) A21.noalias() -= A20 * A10.adjoint();\n      if (rs>0) A21 /= x;\n    }\n    return -1;\n  }\n\n  template<typename MatrixType>\n  static typename MatrixType::Index blocked(MatrixType& m)\n  {\n    typedef typename MatrixType::Index Index;\n    eigen_assert(m.rows()==m.cols());\n    Index size = m.rows();\n    if(size<32)\n      return unblocked(m);\n\n    Index blockSize = size/8;\n    blockSize = (blockSize/16)*16;\n    blockSize = (std::min)((std::max)(blockSize,Index(8)), Index(128));\n\n    for (Index k=0; k<size; k+=blockSize)\n    {\n      // partition the matrix:\n      //       A00 |  -  |  -\n      // lu  = A10 | A11 |  -\n      //       A20 | A21 | A22\n      Index bs = (std::min)(blockSize, size-k);\n      Index rs = size - k - bs;\n      Block<MatrixType,Dynamic,Dynamic> A11(m,k,   k,   bs,bs);\n      Block<MatrixType,Dynamic,Dynamic> A21(m,k+bs,k,   rs,bs);\n      Block<MatrixType,Dynamic,Dynamic> A22(m,k+bs,k+bs,rs,rs);\n\n      Index ret;\n      if((ret=unblocked(A11))>=0) return k+ret;\n      if(rs>0) A11.adjoint().template triangularView<Upper>().template solveInPlace<OnTheRight>(A21);\n      if(rs>0) A22.template selfadjointView<Lower>().rankUpdate(A21,-1); // bottleneck\n    }\n    return -1;\n  }\n\n  template<typename MatrixType, typename VectorType>\n  static typename MatrixType::Index rankUpdate(MatrixType& mat, const VectorType& vec, const RealScalar& sigma)\n  {\n    return Eigen::internal::llt_rank_update_lower(mat, vec, sigma);\n  }\n};\n  \ntemplate<typename Scalar> struct llt_inplace<Scalar, Upper>\n{\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n\n  template<typename MatrixType>\n  static EIGEN_STRONG_INLINE typename MatrixType::Index unblocked(MatrixType& mat)\n  {\n    Transpose<MatrixType> matt(mat);\n    return llt_inplace<Scalar, Lower>::unblocked(matt);\n  }\n  template<typename MatrixType>\n  static EIGEN_STRONG_INLINE typename MatrixType::Index blocked(MatrixType& mat)\n  {\n    Transpose<MatrixType> matt(mat);\n    return llt_inplace<Scalar, Lower>::blocked(matt);\n  }\n  template<typename MatrixType, typename VectorType>\n  static typename MatrixType::Index rankUpdate(MatrixType& mat, const VectorType& vec, const RealScalar& sigma)\n  {\n    Transpose<MatrixType> matt(mat);\n    return llt_inplace<Scalar, Lower>::rankUpdate(matt, vec.conjugate(), sigma);\n  }\n};\n\ntemplate<typename MatrixType> struct LLT_Traits<MatrixType,Lower>\n{\n  typedef const TriangularView<const MatrixType, Lower> MatrixL;\n  typedef const TriangularView<const typename MatrixType::AdjointReturnType, Upper> MatrixU;\n  static inline MatrixL getL(const MatrixType& m) { return m; }\n  static inline MatrixU getU(const MatrixType& m) { return m.adjoint(); }\n  static bool inplace_decomposition(MatrixType& m)\n  { return llt_inplace<typename MatrixType::Scalar, Lower>::blocked(m)==-1; }\n};\n\ntemplate<typename MatrixType> struct LLT_Traits<MatrixType,Upper>\n{\n  typedef const TriangularView<const typename MatrixType::AdjointReturnType, Lower> MatrixL;\n  typedef const TriangularView<const MatrixType, Upper> MatrixU;\n  static inline MatrixL getL(const MatrixType& m) { return m.adjoint(); }\n  static inline MatrixU getU(const MatrixType& m) { return m; }\n  static bool inplace_decomposition(MatrixType& m)\n  { return llt_inplace<typename MatrixType::Scalar, Upper>::blocked(m)==-1; }\n};\n\n} // end namespace internal\n\n/** Computes / recomputes the Cholesky decomposition A = LL^* = U^*U of \\a matrix\n  *\n  * \\returns a reference to *this\n  *\n  * Example: \\include TutorialLinAlgComputeTwice.cpp\n  * Output: \\verbinclude TutorialLinAlgComputeTwice.out\n  */\ntemplate<typename MatrixType, int _UpLo>\nLLT<MatrixType,_UpLo>& LLT<MatrixType,_UpLo>::compute(const MatrixType& a)\n{\n  check_template_parameters();\n  \n  eigen_assert(a.rows()==a.cols());\n  const Index size = a.rows();\n  m_matrix.resize(size, size);\n  m_matrix = a;\n\n  m_isInitialized = true;\n  bool ok = Traits::inplace_decomposition(m_matrix);\n  m_info = ok ? Success : NumericalIssue;\n\n  return *this;\n}\n\n/** Performs a rank one update (or dowdate) of the current decomposition.\n  * If A = LL^* before the rank one update,\n  * then after it we have LL^* = A + sigma * v v^* where \\a v must be a vector\n  * of same dimension.\n  */\ntemplate<typename _MatrixType, int _UpLo>\ntemplate<typename VectorType>\nLLT<_MatrixType,_UpLo> LLT<_MatrixType,_UpLo>::rankUpdate(const VectorType& v, const RealScalar& sigma)\n{\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(VectorType);\n  eigen_assert(v.size()==m_matrix.cols());\n  eigen_assert(m_isInitialized);\n  if(internal::llt_inplace<typename MatrixType::Scalar, UpLo>::rankUpdate(m_matrix,v,sigma)>=0)\n    m_info = NumericalIssue;\n  else\n    m_info = Success;\n\n  return *this;\n}\n    \nnamespace internal {\ntemplate<typename _MatrixType, int UpLo, typename Rhs>\nstruct solve_retval<LLT<_MatrixType, UpLo>, Rhs>\n  : solve_retval_base<LLT<_MatrixType, UpLo>, Rhs>\n{\n  typedef LLT<_MatrixType,UpLo> LLTType;\n  EIGEN_MAKE_SOLVE_HELPERS(LLTType,Rhs)\n\n  template<typename Dest> void evalTo(Dest& dst) const\n  {\n    dst = rhs();\n    dec().solveInPlace(dst);\n  }\n};\n}\n\n/** \\internal use x = llt_object.solve(x);\n  * \n  * This is the \\em in-place version of solve().\n  *\n  * \\param bAndX represents both the right-hand side matrix b and result x.\n  *\n  * \\returns true always! If you need to check for existence of solutions, use another decomposition like LU, QR, or SVD.\n  *\n  * This version avoids a copy when the right hand side matrix b is not\n  * needed anymore.\n  *\n  * \\sa LLT::solve(), MatrixBase::llt()\n  */\ntemplate<typename MatrixType, int _UpLo>\ntemplate<typename Derived>\nvoid LLT<MatrixType,_UpLo>::solveInPlace(MatrixBase<Derived> &bAndX) const\n{\n  eigen_assert(m_isInitialized && \"LLT is not initialized.\");\n  eigen_assert(m_matrix.rows()==bAndX.rows());\n  matrixL().solveInPlace(bAndX);\n  matrixU().solveInPlace(bAndX);\n}\n\n/** \\returns the matrix represented by the decomposition,\n * i.e., it returns the product: L L^*.\n * This function is provided for debug purpose. */\ntemplate<typename MatrixType, int _UpLo>\nMatrixType LLT<MatrixType,_UpLo>::reconstructedMatrix() const\n{\n  eigen_assert(m_isInitialized && \"LLT is not initialized.\");\n  return matrixL() * matrixL().adjoint().toDenseMatrix();\n}\n\n/** \\cholesky_module\n  * \\returns the LLT decomposition of \\c *this\n  */\ntemplate<typename Derived>\ninline const LLT<typename MatrixBase<Derived>::PlainObject>\nMatrixBase<Derived>::llt() const\n{\n  return LLT<PlainObject>(derived());\n}\n\n/** \\cholesky_module\n  * \\returns the LLT decomposition of \\c *this\n  */\ntemplate<typename MatrixType, unsigned int UpLo>\ninline const LLT<typename SelfAdjointView<MatrixType, UpLo>::PlainObject, UpLo>\nSelfAdjointView<MatrixType, UpLo>::llt() const\n{\n  return LLT<PlainObject,UpLo>(m_matrix);\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_LLT_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Cholesky/LLT_MKL.h",
    "content": "/*\n Copyright (c) 2011, Intel Corporation. All rights reserved.\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n * Neither the name of Intel Corporation nor the names of its contributors may\n   be used to endorse or promote products derived from this software without\n   specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\n ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n ********************************************************************************\n *   Content : Eigen bindings to Intel(R) MKL\n *     LLt decomposition based on LAPACKE_?potrf function.\n ********************************************************************************\n*/\n\n#ifndef EIGEN_LLT_MKL_H\n#define EIGEN_LLT_MKL_H\n\n#include \"Eigen/src/Core/util/MKL_support.h\"\n#include <iostream>\n\nnamespace Eigen { \n\nnamespace internal {\n\ntemplate<typename Scalar> struct mkl_llt;\n\n#define EIGEN_MKL_LLT(EIGTYPE, MKLTYPE, MKLPREFIX) \\\ntemplate<> struct mkl_llt<EIGTYPE> \\\n{ \\\n  template<typename MatrixType> \\\n  static inline typename MatrixType::Index potrf(MatrixType& m, char uplo) \\\n  { \\\n    lapack_int matrix_order; \\\n    lapack_int size, lda, info, StorageOrder; \\\n    EIGTYPE* a; \\\n    eigen_assert(m.rows()==m.cols()); \\\n    /* Set up parameters for ?potrf */ \\\n    size = m.rows(); \\\n    StorageOrder = MatrixType::Flags&RowMajorBit?RowMajor:ColMajor; \\\n    matrix_order = StorageOrder==RowMajor ? LAPACK_ROW_MAJOR : LAPACK_COL_MAJOR; \\\n    a = &(m.coeffRef(0,0)); \\\n    lda = m.outerStride(); \\\n\\\n    info = LAPACKE_##MKLPREFIX##potrf( matrix_order, uplo, size, (MKLTYPE*)a, lda ); \\\n    info = (info==0) ? -1 : info>0 ? info-1 : size; \\\n    return info; \\\n  } \\\n}; \\\ntemplate<> struct llt_inplace<EIGTYPE, Lower> \\\n{ \\\n  template<typename MatrixType> \\\n  static typename MatrixType::Index blocked(MatrixType& m) \\\n  { \\\n    return mkl_llt<EIGTYPE>::potrf(m, 'L'); \\\n  } \\\n  template<typename MatrixType, typename VectorType> \\\n  static typename MatrixType::Index rankUpdate(MatrixType& mat, const VectorType& vec, const typename MatrixType::RealScalar& sigma) \\\n  { return Eigen::internal::llt_rank_update_lower(mat, vec, sigma); } \\\n}; \\\ntemplate<> struct llt_inplace<EIGTYPE, Upper> \\\n{ \\\n  template<typename MatrixType> \\\n  static typename MatrixType::Index blocked(MatrixType& m) \\\n  { \\\n    return mkl_llt<EIGTYPE>::potrf(m, 'U'); \\\n  } \\\n  template<typename MatrixType, typename VectorType> \\\n  static typename MatrixType::Index rankUpdate(MatrixType& mat, const VectorType& vec, const typename MatrixType::RealScalar& sigma) \\\n  { \\\n    Transpose<MatrixType> matt(mat); \\\n    return llt_inplace<EIGTYPE, Lower>::rankUpdate(matt, vec.conjugate(), sigma); \\\n  } \\\n};\n\nEIGEN_MKL_LLT(double, double, d)\nEIGEN_MKL_LLT(float, float, s)\nEIGEN_MKL_LLT(dcomplex, MKL_Complex16, z)\nEIGEN_MKL_LLT(scomplex, MKL_Complex8, c)\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_LLT_MKL_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/CholmodSupport/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_CholmodSupport_SRCS \"*.h\")\n\nINSTALL(FILES \n  ${Eigen_CholmodSupport_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/CholmodSupport COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/Eigen/src/CholmodSupport/CholmodSupport.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_CHOLMODSUPPORT_H\n#define EIGEN_CHOLMODSUPPORT_H\n\nnamespace Eigen { \n\nnamespace internal {\n\ntemplate<typename Scalar, typename CholmodType>\nvoid cholmod_configure_matrix(CholmodType& mat)\n{\n  if (internal::is_same<Scalar,float>::value)\n  {\n    mat.xtype = CHOLMOD_REAL;\n    mat.dtype = CHOLMOD_SINGLE;\n  }\n  else if (internal::is_same<Scalar,double>::value)\n  {\n    mat.xtype = CHOLMOD_REAL;\n    mat.dtype = CHOLMOD_DOUBLE;\n  }\n  else if (internal::is_same<Scalar,std::complex<float> >::value)\n  {\n    mat.xtype = CHOLMOD_COMPLEX;\n    mat.dtype = CHOLMOD_SINGLE;\n  }\n  else if (internal::is_same<Scalar,std::complex<double> >::value)\n  {\n    mat.xtype = CHOLMOD_COMPLEX;\n    mat.dtype = CHOLMOD_DOUBLE;\n  }\n  else\n  {\n    eigen_assert(false && \"Scalar type not supported by CHOLMOD\");\n  }\n}\n\n} // namespace internal\n\n/** Wraps the Eigen sparse matrix \\a mat into a Cholmod sparse matrix object.\n  * Note that the data are shared.\n  */\ntemplate<typename _Scalar, int _Options, typename _Index>\ncholmod_sparse viewAsCholmod(SparseMatrix<_Scalar,_Options,_Index>& mat)\n{\n  cholmod_sparse res;\n  res.nzmax   = mat.nonZeros();\n  res.nrow    = mat.rows();;\n  res.ncol    = mat.cols();\n  res.p       = mat.outerIndexPtr();\n  res.i       = mat.innerIndexPtr();\n  res.x       = mat.valuePtr();\n  res.z       = 0;\n  res.sorted  = 1;\n  if(mat.isCompressed())\n  {\n    res.packed  = 1;\n    res.nz = 0;\n  }\n  else\n  {\n    res.packed  = 0;\n    res.nz = mat.innerNonZeroPtr();\n  }\n\n  res.dtype   = 0;\n  res.stype   = -1;\n  \n  if (internal::is_same<_Index,int>::value)\n  {\n    res.itype = CHOLMOD_INT;\n  }\n  else if (internal::is_same<_Index,SuiteSparse_long>::value)\n  {\n    res.itype = CHOLMOD_LONG;\n  }\n  else\n  {\n    eigen_assert(false && \"Index type not supported yet\");\n  }\n\n  // setup res.xtype\n  internal::cholmod_configure_matrix<_Scalar>(res);\n  \n  res.stype = 0;\n  \n  return res;\n}\n\ntemplate<typename _Scalar, int _Options, typename _Index>\nconst cholmod_sparse viewAsCholmod(const SparseMatrix<_Scalar,_Options,_Index>& mat)\n{\n  cholmod_sparse res = viewAsCholmod(mat.const_cast_derived());\n  return res;\n}\n\n/** Returns a view of the Eigen sparse matrix \\a mat as Cholmod sparse matrix.\n  * The data are not copied but shared. */\ntemplate<typename _Scalar, int _Options, typename _Index, unsigned int UpLo>\ncholmod_sparse viewAsCholmod(const SparseSelfAdjointView<SparseMatrix<_Scalar,_Options,_Index>, UpLo>& mat)\n{\n  cholmod_sparse res = viewAsCholmod(mat.matrix().const_cast_derived());\n  \n  if(UpLo==Upper) res.stype =  1;\n  if(UpLo==Lower) res.stype = -1;\n\n  return res;\n}\n\n/** Returns a view of the Eigen \\b dense matrix \\a mat as Cholmod dense matrix.\n  * The data are not copied but shared. */\ntemplate<typename Derived>\ncholmod_dense viewAsCholmod(MatrixBase<Derived>& mat)\n{\n  EIGEN_STATIC_ASSERT((internal::traits<Derived>::Flags&RowMajorBit)==0,THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES);\n  typedef typename Derived::Scalar Scalar;\n\n  cholmod_dense res;\n  res.nrow   = mat.rows();\n  res.ncol   = mat.cols();\n  res.nzmax  = res.nrow * res.ncol;\n  res.d      = Derived::IsVectorAtCompileTime ? mat.derived().size() : mat.derived().outerStride();\n  res.x      = (void*)(mat.derived().data());\n  res.z      = 0;\n\n  internal::cholmod_configure_matrix<Scalar>(res);\n\n  return res;\n}\n\n/** Returns a view of the Cholmod sparse matrix \\a cm as an Eigen sparse matrix.\n  * The data are not copied but shared. */\ntemplate<typename Scalar, int Flags, typename Index>\nMappedSparseMatrix<Scalar,Flags,Index> viewAsEigen(cholmod_sparse& cm)\n{\n  return MappedSparseMatrix<Scalar,Flags,Index>\n         (cm.nrow, cm.ncol, static_cast<Index*>(cm.p)[cm.ncol],\n          static_cast<Index*>(cm.p), static_cast<Index*>(cm.i),static_cast<Scalar*>(cm.x) );\n}\n\nenum CholmodMode {\n  CholmodAuto, CholmodSimplicialLLt, CholmodSupernodalLLt, CholmodLDLt\n};\n\n\n/** \\ingroup CholmodSupport_Module\n  * \\class CholmodBase\n  * \\brief The base class for the direct Cholesky factorization of Cholmod\n  * \\sa class CholmodSupernodalLLT, class CholmodSimplicialLDLT, class CholmodSimplicialLLT\n  */\ntemplate<typename _MatrixType, int _UpLo, typename Derived>\nclass CholmodBase : internal::noncopyable\n{\n  public:\n    typedef _MatrixType MatrixType;\n    enum { UpLo = _UpLo };\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename MatrixType::RealScalar RealScalar;\n    typedef MatrixType CholMatrixType;\n    typedef typename MatrixType::Index Index;\n\n  public:\n\n    CholmodBase()\n      : m_cholmodFactor(0), m_info(Success), m_isInitialized(false)\n    {\n      m_shiftOffset[0] = m_shiftOffset[1] = RealScalar(0.0);\n      cholmod_start(&m_cholmod);\n    }\n\n    CholmodBase(const MatrixType& matrix)\n      : m_cholmodFactor(0), m_info(Success), m_isInitialized(false)\n    {\n      m_shiftOffset[0] = m_shiftOffset[1] = RealScalar(0.0);\n      cholmod_start(&m_cholmod);\n      compute(matrix);\n    }\n\n    ~CholmodBase()\n    {\n      if(m_cholmodFactor)\n        cholmod_free_factor(&m_cholmodFactor, &m_cholmod);\n      cholmod_finish(&m_cholmod);\n    }\n    \n    inline Index cols() const { return m_cholmodFactor->n; }\n    inline Index rows() const { return m_cholmodFactor->n; }\n    \n    Derived& derived() { return *static_cast<Derived*>(this); }\n    const Derived& derived() const { return *static_cast<const Derived*>(this); }\n    \n    /** \\brief Reports whether previous computation was successful.\n      *\n      * \\returns \\c Success if computation was succesful,\n      *          \\c NumericalIssue if the matrix.appears to be negative.\n      */\n    ComputationInfo info() const\n    {\n      eigen_assert(m_isInitialized && \"Decomposition is not initialized.\");\n      return m_info;\n    }\n\n    /** Computes the sparse Cholesky decomposition of \\a matrix */\n    Derived& compute(const MatrixType& matrix)\n    {\n      analyzePattern(matrix);\n      factorize(matrix);\n      return derived();\n    }\n    \n    /** \\returns the solution x of \\f$ A x = b \\f$ using the current decomposition of A.\n      *\n      * \\sa compute()\n      */\n    template<typename Rhs>\n    inline const internal::solve_retval<CholmodBase, Rhs>\n    solve(const MatrixBase<Rhs>& b) const\n    {\n      eigen_assert(m_isInitialized && \"LLT is not initialized.\");\n      eigen_assert(rows()==b.rows()\n                && \"CholmodDecomposition::solve(): invalid number of rows of the right hand side matrix b\");\n      return internal::solve_retval<CholmodBase, Rhs>(*this, b.derived());\n    }\n    \n    /** \\returns the solution x of \\f$ A x = b \\f$ using the current decomposition of A.\n      *\n      * \\sa compute()\n      */\n    template<typename Rhs>\n    inline const internal::sparse_solve_retval<CholmodBase, Rhs>\n    solve(const SparseMatrixBase<Rhs>& b) const\n    {\n      eigen_assert(m_isInitialized && \"LLT is not initialized.\");\n      eigen_assert(rows()==b.rows()\n                && \"CholmodDecomposition::solve(): invalid number of rows of the right hand side matrix b\");\n      return internal::sparse_solve_retval<CholmodBase, Rhs>(*this, b.derived());\n    }\n    \n    /** Performs a symbolic decomposition on the sparsity pattern of \\a matrix.\n      *\n      * This function is particularly useful when solving for several problems having the same structure.\n      * \n      * \\sa factorize()\n      */\n    void analyzePattern(const MatrixType& matrix)\n    {\n      if(m_cholmodFactor)\n      {\n        cholmod_free_factor(&m_cholmodFactor, &m_cholmod);\n        m_cholmodFactor = 0;\n      }\n      cholmod_sparse A = viewAsCholmod(matrix.template selfadjointView<UpLo>());\n      m_cholmodFactor = cholmod_analyze(&A, &m_cholmod);\n      \n      this->m_isInitialized = true;\n      this->m_info = Success;\n      m_analysisIsOk = true;\n      m_factorizationIsOk = false;\n    }\n    \n    /** Performs a numeric decomposition of \\a matrix\n      *\n      * The given matrix must have the same sparsity pattern as the matrix on which the symbolic decomposition has been performed.\n      *\n      * \\sa analyzePattern()\n      */\n    void factorize(const MatrixType& matrix)\n    {\n      eigen_assert(m_analysisIsOk && \"You must first call analyzePattern()\");\n      cholmod_sparse A = viewAsCholmod(matrix.template selfadjointView<UpLo>());\n      cholmod_factorize_p(&A, m_shiftOffset, 0, 0, m_cholmodFactor, &m_cholmod);\n      \n      // If the factorization failed, minor is the column at which it did. On success minor == n.\n      this->m_info = (m_cholmodFactor->minor == m_cholmodFactor->n ? Success : NumericalIssue);\n      m_factorizationIsOk = true;\n    }\n    \n    /** Returns a reference to the Cholmod's configuration structure to get a full control over the performed operations.\n     *  See the Cholmod user guide for details. */\n    cholmod_common& cholmod() { return m_cholmod; }\n    \n    #ifndef EIGEN_PARSED_BY_DOXYGEN\n    /** \\internal */\n    template<typename Rhs,typename Dest>\n    void _solve(const MatrixBase<Rhs> &b, MatrixBase<Dest> &dest) const\n    {\n      eigen_assert(m_factorizationIsOk && \"The decomposition is not in a valid state for solving, you must first call either compute() or symbolic()/numeric()\");\n      const Index size = m_cholmodFactor->n;\n      EIGEN_UNUSED_VARIABLE(size);\n      eigen_assert(size==b.rows());\n\n      // note: cd stands for Cholmod Dense\n      Rhs& b_ref(b.const_cast_derived());\n      cholmod_dense b_cd = viewAsCholmod(b_ref);\n      cholmod_dense* x_cd = cholmod_solve(CHOLMOD_A, m_cholmodFactor, &b_cd, &m_cholmod);\n      if(!x_cd)\n      {\n        this->m_info = NumericalIssue;\n      }\n      // TODO optimize this copy by swapping when possible (be careful with alignment, etc.)\n      dest = Matrix<Scalar,Dest::RowsAtCompileTime,Dest::ColsAtCompileTime>::Map(reinterpret_cast<Scalar*>(x_cd->x),b.rows(),b.cols());\n      cholmod_free_dense(&x_cd, &m_cholmod);\n    }\n    \n    /** \\internal */\n    template<typename RhsScalar, int RhsOptions, typename RhsIndex, typename DestScalar, int DestOptions, typename DestIndex>\n    void _solve(const SparseMatrix<RhsScalar,RhsOptions,RhsIndex> &b, SparseMatrix<DestScalar,DestOptions,DestIndex> &dest) const\n    {\n      eigen_assert(m_factorizationIsOk && \"The decomposition is not in a valid state for solving, you must first call either compute() or symbolic()/numeric()\");\n      const Index size = m_cholmodFactor->n;\n      EIGEN_UNUSED_VARIABLE(size);\n      eigen_assert(size==b.rows());\n\n      // note: cs stands for Cholmod Sparse\n      cholmod_sparse b_cs = viewAsCholmod(b);\n      cholmod_sparse* x_cs = cholmod_spsolve(CHOLMOD_A, m_cholmodFactor, &b_cs, &m_cholmod);\n      if(!x_cs)\n      {\n        this->m_info = NumericalIssue;\n      }\n      // TODO optimize this copy by swapping when possible (be careful with alignment, etc.)\n      dest = viewAsEigen<DestScalar,DestOptions,DestIndex>(*x_cs);\n      cholmod_free_sparse(&x_cs, &m_cholmod);\n    }\n    #endif // EIGEN_PARSED_BY_DOXYGEN\n    \n    \n    /** Sets the shift parameter that will be used to adjust the diagonal coefficients during the numerical factorization.\n      *\n      * During the numerical factorization, an offset term is added to the diagonal coefficients:\\n\n      * \\c d_ii = \\a offset + \\c d_ii\n      *\n      * The default is \\a offset=0.\n      *\n      * \\returns a reference to \\c *this.\n      */\n    Derived& setShift(const RealScalar& offset)\n    {\n      m_shiftOffset[0] = offset;\n      return derived();\n    }\n    \n    template<typename Stream>\n    void dumpMemory(Stream& /*s*/)\n    {}\n    \n  protected:\n    mutable cholmod_common m_cholmod;\n    cholmod_factor* m_cholmodFactor;\n    RealScalar m_shiftOffset[2];\n    mutable ComputationInfo m_info;\n    bool m_isInitialized;\n    int m_factorizationIsOk;\n    int m_analysisIsOk;\n};\n\n/** \\ingroup CholmodSupport_Module\n  * \\class CholmodSimplicialLLT\n  * \\brief A simplicial direct Cholesky (LLT) factorization and solver based on Cholmod\n  *\n  * This class allows to solve for A.X = B sparse linear problems via a simplicial LL^T Cholesky factorization\n  * using the Cholmod library.\n  * This simplicial variant is equivalent to Eigen's built-in SimplicialLLT class. Therefore, it has little practical interest.\n  * The sparse matrix A must be selfadjoint and positive definite. The vectors or matrices\n  * X and B can be either dense or sparse.\n  *\n  * \\tparam _MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>\n  * \\tparam _UpLo the triangular part that will be used for the computations. It can be Lower\n  *               or Upper. Default is Lower.\n  *\n  * This class supports all kind of SparseMatrix<>: row or column major; upper, lower, or both; compressed or non compressed.\n  *\n  * \\sa \\ref TutorialSparseDirectSolvers, class CholmodSupernodalLLT, class SimplicialLLT\n  */\ntemplate<typename _MatrixType, int _UpLo = Lower>\nclass CholmodSimplicialLLT : public CholmodBase<_MatrixType, _UpLo, CholmodSimplicialLLT<_MatrixType, _UpLo> >\n{\n    typedef CholmodBase<_MatrixType, _UpLo, CholmodSimplicialLLT> Base;\n    using Base::m_cholmod;\n    \n  public:\n    \n    typedef _MatrixType MatrixType;\n    \n    CholmodSimplicialLLT() : Base() { init(); }\n\n    CholmodSimplicialLLT(const MatrixType& matrix) : Base()\n    {\n      init();\n      Base::compute(matrix);\n    }\n\n    ~CholmodSimplicialLLT() {}\n  protected:\n    void init()\n    {\n      m_cholmod.final_asis = 0;\n      m_cholmod.supernodal = CHOLMOD_SIMPLICIAL;\n      m_cholmod.final_ll = 1;\n    }\n};\n\n\n/** \\ingroup CholmodSupport_Module\n  * \\class CholmodSimplicialLDLT\n  * \\brief A simplicial direct Cholesky (LDLT) factorization and solver based on Cholmod\n  *\n  * This class allows to solve for A.X = B sparse linear problems via a simplicial LDL^T Cholesky factorization\n  * using the Cholmod library.\n  * This simplicial variant is equivalent to Eigen's built-in SimplicialLDLT class. Therefore, it has little practical interest.\n  * The sparse matrix A must be selfadjoint and positive definite. The vectors or matrices\n  * X and B can be either dense or sparse.\n  *\n  * \\tparam _MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>\n  * \\tparam _UpLo the triangular part that will be used for the computations. It can be Lower\n  *               or Upper. Default is Lower.\n  *\n  * This class supports all kind of SparseMatrix<>: row or column major; upper, lower, or both; compressed or non compressed.\n  *\n  * \\sa \\ref TutorialSparseDirectSolvers, class CholmodSupernodalLLT, class SimplicialLDLT\n  */\ntemplate<typename _MatrixType, int _UpLo = Lower>\nclass CholmodSimplicialLDLT : public CholmodBase<_MatrixType, _UpLo, CholmodSimplicialLDLT<_MatrixType, _UpLo> >\n{\n    typedef CholmodBase<_MatrixType, _UpLo, CholmodSimplicialLDLT> Base;\n    using Base::m_cholmod;\n    \n  public:\n    \n    typedef _MatrixType MatrixType;\n    \n    CholmodSimplicialLDLT() : Base() { init(); }\n\n    CholmodSimplicialLDLT(const MatrixType& matrix) : Base()\n    {\n      init();\n      Base::compute(matrix);\n    }\n\n    ~CholmodSimplicialLDLT() {}\n  protected:\n    void init()\n    {\n      m_cholmod.final_asis = 1;\n      m_cholmod.supernodal = CHOLMOD_SIMPLICIAL;\n    }\n};\n\n/** \\ingroup CholmodSupport_Module\n  * \\class CholmodSupernodalLLT\n  * \\brief A supernodal Cholesky (LLT) factorization and solver based on Cholmod\n  *\n  * This class allows to solve for A.X = B sparse linear problems via a supernodal LL^T Cholesky factorization\n  * using the Cholmod library.\n  * This supernodal variant performs best on dense enough problems, e.g., 3D FEM, or very high order 2D FEM.\n  * The sparse matrix A must be selfadjoint and positive definite. The vectors or matrices\n  * X and B can be either dense or sparse.\n  *\n  * \\tparam _MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>\n  * \\tparam _UpLo the triangular part that will be used for the computations. It can be Lower\n  *               or Upper. Default is Lower.\n  *\n  * This class supports all kind of SparseMatrix<>: row or column major; upper, lower, or both; compressed or non compressed.\n  *\n  * \\sa \\ref TutorialSparseDirectSolvers\n  */\ntemplate<typename _MatrixType, int _UpLo = Lower>\nclass CholmodSupernodalLLT : public CholmodBase<_MatrixType, _UpLo, CholmodSupernodalLLT<_MatrixType, _UpLo> >\n{\n    typedef CholmodBase<_MatrixType, _UpLo, CholmodSupernodalLLT> Base;\n    using Base::m_cholmod;\n    \n  public:\n    \n    typedef _MatrixType MatrixType;\n    \n    CholmodSupernodalLLT() : Base() { init(); }\n\n    CholmodSupernodalLLT(const MatrixType& matrix) : Base()\n    {\n      init();\n      Base::compute(matrix);\n    }\n\n    ~CholmodSupernodalLLT() {}\n  protected:\n    void init()\n    {\n      m_cholmod.final_asis = 1;\n      m_cholmod.supernodal = CHOLMOD_SUPERNODAL;\n    }\n};\n\n/** \\ingroup CholmodSupport_Module\n  * \\class CholmodDecomposition\n  * \\brief A general Cholesky factorization and solver based on Cholmod\n  *\n  * This class allows to solve for A.X = B sparse linear problems via a LL^T or LDL^T Cholesky factorization\n  * using the Cholmod library. The sparse matrix A must be selfadjoint and positive definite. The vectors or matrices\n  * X and B can be either dense or sparse.\n  *\n  * This variant permits to change the underlying Cholesky method at runtime.\n  * On the other hand, it does not provide access to the result of the factorization.\n  * The default is to let Cholmod automatically choose between a simplicial and supernodal factorization.\n  *\n  * \\tparam _MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>\n  * \\tparam _UpLo the triangular part that will be used for the computations. It can be Lower\n  *               or Upper. Default is Lower.\n  *\n  * This class supports all kind of SparseMatrix<>: row or column major; upper, lower, or both; compressed or non compressed.\n  *\n  * \\sa \\ref TutorialSparseDirectSolvers\n  */\ntemplate<typename _MatrixType, int _UpLo = Lower>\nclass CholmodDecomposition : public CholmodBase<_MatrixType, _UpLo, CholmodDecomposition<_MatrixType, _UpLo> >\n{\n    typedef CholmodBase<_MatrixType, _UpLo, CholmodDecomposition> Base;\n    using Base::m_cholmod;\n    \n  public:\n    \n    typedef _MatrixType MatrixType;\n    \n    CholmodDecomposition() : Base() { init(); }\n\n    CholmodDecomposition(const MatrixType& matrix) : Base()\n    {\n      init();\n      Base::compute(matrix);\n    }\n\n    ~CholmodDecomposition() {}\n    \n    void setMode(CholmodMode mode)\n    {\n      switch(mode)\n      {\n        case CholmodAuto:\n          m_cholmod.final_asis = 1;\n          m_cholmod.supernodal = CHOLMOD_AUTO;\n          break;\n        case CholmodSimplicialLLt:\n          m_cholmod.final_asis = 0;\n          m_cholmod.supernodal = CHOLMOD_SIMPLICIAL;\n          m_cholmod.final_ll = 1;\n          break;\n        case CholmodSupernodalLLt:\n          m_cholmod.final_asis = 1;\n          m_cholmod.supernodal = CHOLMOD_SUPERNODAL;\n          break;\n        case CholmodLDLt:\n          m_cholmod.final_asis = 1;\n          m_cholmod.supernodal = CHOLMOD_SIMPLICIAL;\n          break;\n        default:\n          break;\n      }\n    }\n  protected:\n    void init()\n    {\n      m_cholmod.final_asis = 1;\n      m_cholmod.supernodal = CHOLMOD_AUTO;\n    }\n};\n\nnamespace internal {\n  \ntemplate<typename _MatrixType, int _UpLo, typename Derived, typename Rhs>\nstruct solve_retval<CholmodBase<_MatrixType,_UpLo,Derived>, Rhs>\n  : solve_retval_base<CholmodBase<_MatrixType,_UpLo,Derived>, Rhs>\n{\n  typedef CholmodBase<_MatrixType,_UpLo,Derived> Dec;\n  EIGEN_MAKE_SOLVE_HELPERS(Dec,Rhs)\n\n  template<typename Dest> void evalTo(Dest& dst) const\n  {\n    dec()._solve(rhs(),dst);\n  }\n};\n\ntemplate<typename _MatrixType, int _UpLo, typename Derived, typename Rhs>\nstruct sparse_solve_retval<CholmodBase<_MatrixType,_UpLo,Derived>, Rhs>\n  : sparse_solve_retval_base<CholmodBase<_MatrixType,_UpLo,Derived>, Rhs>\n{\n  typedef CholmodBase<_MatrixType,_UpLo,Derived> Dec;\n  EIGEN_MAKE_SPARSE_SOLVE_HELPERS(Dec,Rhs)\n\n  template<typename Dest> void evalTo(Dest& dst) const\n  {\n    dec()._solve(rhs(),dst);\n  }\n};\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_CHOLMODSUPPORT_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/Array.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_ARRAY_H\n#define EIGEN_ARRAY_H\n\nnamespace Eigen {\n\n/** \\class Array \n  * \\ingroup Core_Module\n  *\n  * \\brief General-purpose arrays with easy API for coefficient-wise operations\n  *\n  * The %Array class is very similar to the Matrix class. It provides\n  * general-purpose one- and two-dimensional arrays. The difference between the\n  * %Array and the %Matrix class is primarily in the API: the API for the\n  * %Array class provides easy access to coefficient-wise operations, while the\n  * API for the %Matrix class provides easy access to linear-algebra\n  * operations.\n  *\n  * This class can be extended with the help of the plugin mechanism described on the page\n  * \\ref TopicCustomizingEigen by defining the preprocessor symbol \\c EIGEN_ARRAY_PLUGIN.\n  *\n  * \\sa \\ref TutorialArrayClass, \\ref TopicClassHierarchy\n  */\nnamespace internal {\ntemplate<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>\nstruct traits<Array<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> > : traits<Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> >\n{\n  typedef ArrayXpr XprKind;\n  typedef ArrayBase<Array<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> > XprBase;\n};\n}\n\ntemplate<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>\nclass Array\n  : public PlainObjectBase<Array<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> >\n{\n  public:\n\n    typedef PlainObjectBase<Array> Base;\n    EIGEN_DENSE_PUBLIC_INTERFACE(Array)\n\n    enum { Options = _Options };\n    typedef typename Base::PlainObject PlainObject;\n\n  protected:\n    template <typename Derived, typename OtherDerived, bool IsVector>\n    friend struct internal::conservative_resize_like_impl;\n\n    using Base::m_storage;\n\n  public:\n\n    using Base::base;\n    using Base::coeff;\n    using Base::coeffRef;\n\n    /**\n      * The usage of\n      *   using Base::operator=;\n      * fails on MSVC. Since the code below is working with GCC and MSVC, we skipped\n      * the usage of 'using'. This should be done only for operator=.\n      */\n    template<typename OtherDerived>\n    EIGEN_STRONG_INLINE Array& operator=(const EigenBase<OtherDerived> &other)\n    {\n      return Base::operator=(other);\n    }\n\n    /** Copies the value of the expression \\a other into \\c *this with automatic resizing.\n      *\n      * *this might be resized to match the dimensions of \\a other. If *this was a null matrix (not already initialized),\n      * it will be initialized.\n      *\n      * Note that copying a row-vector into a vector (and conversely) is allowed.\n      * The resizing, if any, is then done in the appropriate way so that row-vectors\n      * remain row-vectors and vectors remain vectors.\n      */\n    template<typename OtherDerived>\n    EIGEN_STRONG_INLINE Array& operator=(const ArrayBase<OtherDerived>& other)\n    {\n      return Base::_set(other);\n    }\n\n    /** This is a special case of the templated operator=. Its purpose is to\n      * prevent a default operator= from hiding the templated operator=.\n      */\n    EIGEN_STRONG_INLINE Array& operator=(const Array& other)\n    {\n      return Base::_set(other);\n    }\n\n    /** Default constructor.\n      *\n      * For fixed-size matrices, does nothing.\n      *\n      * For dynamic-size matrices, creates an empty matrix of size 0. Does not allocate any array. Such a matrix\n      * is called a null matrix. This constructor is the unique way to create null matrices: resizing\n      * a matrix to 0 is not supported.\n      *\n      * \\sa resize(Index,Index)\n      */\n    EIGEN_STRONG_INLINE Array() : Base()\n    {\n      Base::_check_template_params();\n      EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED\n    }\n\n#ifndef EIGEN_PARSED_BY_DOXYGEN\n    // FIXME is it still needed ??\n    /** \\internal */\n    Array(internal::constructor_without_unaligned_array_assert)\n      : Base(internal::constructor_without_unaligned_array_assert())\n    {\n      Base::_check_template_params();\n      EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED\n    }\n#endif\n\n#ifdef EIGEN_HAVE_RVALUE_REFERENCES\n    Array(Array&& other)\n      : Base(std::move(other))\n    {\n      Base::_check_template_params();\n      if (RowsAtCompileTime!=Dynamic && ColsAtCompileTime!=Dynamic)\n        Base::_set_noalias(other);\n    }\n    Array& operator=(Array&& other)\n    {\n      other.swap(*this);\n      return *this;\n    }\n#endif\n\n    /** Constructs a vector or row-vector with given dimension. \\only_for_vectors\n      *\n      * Note that this is only useful for dynamic-size vectors. For fixed-size vectors,\n      * it is redundant to pass the dimension here, so it makes more sense to use the default\n      * constructor Matrix() instead.\n      */\n    EIGEN_STRONG_INLINE explicit Array(Index dim)\n      : Base(dim, RowsAtCompileTime == 1 ? 1 : dim, ColsAtCompileTime == 1 ? 1 : dim)\n    {\n      Base::_check_template_params();\n      EIGEN_STATIC_ASSERT_VECTOR_ONLY(Array)\n      eigen_assert(dim >= 0);\n      eigen_assert(SizeAtCompileTime == Dynamic || SizeAtCompileTime == dim);\n      EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED\n    }\n\n    #ifndef EIGEN_PARSED_BY_DOXYGEN\n    template<typename T0, typename T1>\n    EIGEN_STRONG_INLINE Array(const T0& val0, const T1& val1)\n    {\n      Base::_check_template_params();\n      this->template _init2<T0,T1>(val0, val1);\n    }\n    #else\n    /** constructs an uninitialized matrix with \\a rows rows and \\a cols columns.\n      *\n      * This is useful for dynamic-size matrices. For fixed-size matrices,\n      * it is redundant to pass these parameters, so one should use the default constructor\n      * Matrix() instead. */\n    Array(Index rows, Index cols);\n    /** constructs an initialized 2D vector with given coefficients */\n    Array(const Scalar& val0, const Scalar& val1);\n    #endif\n\n    /** constructs an initialized 3D vector with given coefficients */\n    EIGEN_STRONG_INLINE Array(const Scalar& val0, const Scalar& val1, const Scalar& val2)\n    {\n      Base::_check_template_params();\n      EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Array, 3)\n      m_storage.data()[0] = val0;\n      m_storage.data()[1] = val1;\n      m_storage.data()[2] = val2;\n    }\n    /** constructs an initialized 4D vector with given coefficients */\n    EIGEN_STRONG_INLINE Array(const Scalar& val0, const Scalar& val1, const Scalar& val2, const Scalar& val3)\n    {\n      Base::_check_template_params();\n      EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Array, 4)\n      m_storage.data()[0] = val0;\n      m_storage.data()[1] = val1;\n      m_storage.data()[2] = val2;\n      m_storage.data()[3] = val3;\n    }\n\n    explicit Array(const Scalar *data);\n\n    /** Constructor copying the value of the expression \\a other */\n    template<typename OtherDerived>\n    EIGEN_STRONG_INLINE Array(const ArrayBase<OtherDerived>& other)\n             : Base(other.rows() * other.cols(), other.rows(), other.cols())\n    {\n      Base::_check_template_params();\n      Base::_set_noalias(other);\n    }\n    /** Copy constructor */\n    EIGEN_STRONG_INLINE Array(const Array& other)\n            : Base(other.rows() * other.cols(), other.rows(), other.cols())\n    {\n      Base::_check_template_params();\n      Base::_set_noalias(other);\n    }\n    /** Copy constructor with in-place evaluation */\n    template<typename OtherDerived>\n    EIGEN_STRONG_INLINE Array(const ReturnByValue<OtherDerived>& other)\n    {\n      Base::_check_template_params();\n      Base::resize(other.rows(), other.cols());\n      other.evalTo(*this);\n    }\n\n    /** \\sa MatrixBase::operator=(const EigenBase<OtherDerived>&) */\n    template<typename OtherDerived>\n    EIGEN_STRONG_INLINE Array(const EigenBase<OtherDerived> &other)\n      : Base(other.derived().rows() * other.derived().cols(), other.derived().rows(), other.derived().cols())\n    {\n      Base::_check_template_params();\n      Base::_resize_to_match(other);\n      *this = other;\n    }\n\n    /** Override MatrixBase::swap() since for dynamic-sized matrices of same type it is enough to swap the\n      * data pointers.\n      */\n    template<typename OtherDerived>\n    void swap(ArrayBase<OtherDerived> const & other)\n    { this->_swap(other.derived()); }\n\n    inline Index innerStride() const { return 1; }\n    inline Index outerStride() const { return this->innerSize(); }\n\n    #ifdef EIGEN_ARRAY_PLUGIN\n    #include EIGEN_ARRAY_PLUGIN\n    #endif\n\n  private:\n\n    template<typename MatrixType, typename OtherDerived, bool SwapPointers>\n    friend struct internal::matrix_swap_impl;\n};\n\n/** \\defgroup arraytypedefs Global array typedefs\n  * \\ingroup Core_Module\n  *\n  * Eigen defines several typedef shortcuts for most common 1D and 2D array types.\n  *\n  * The general patterns are the following:\n  *\n  * \\c ArrayRowsColsType where \\c Rows and \\c Cols can be \\c 2,\\c 3,\\c 4 for fixed size square matrices or \\c X for dynamic size,\n  * and where \\c Type can be \\c i for integer, \\c f for float, \\c d for double, \\c cf for complex float, \\c cd\n  * for complex double.\n  *\n  * For example, \\c Array33d is a fixed-size 3x3 array type of doubles, and \\c ArrayXXf is a dynamic-size matrix of floats.\n  *\n  * There are also \\c ArraySizeType which are self-explanatory. For example, \\c Array4cf is\n  * a fixed-size 1D array of 4 complex floats.\n  *\n  * \\sa class Array\n  */\n\n#define EIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, Size, SizeSuffix)   \\\n/** \\ingroup arraytypedefs */                                    \\\ntypedef Array<Type, Size, Size> Array##SizeSuffix##SizeSuffix##TypeSuffix;  \\\n/** \\ingroup arraytypedefs */                                    \\\ntypedef Array<Type, Size, 1>    Array##SizeSuffix##TypeSuffix;\n\n#define EIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, Size)         \\\n/** \\ingroup arraytypedefs */                                    \\\ntypedef Array<Type, Size, Dynamic> Array##Size##X##TypeSuffix;  \\\n/** \\ingroup arraytypedefs */                                    \\\ntypedef Array<Type, Dynamic, Size> Array##X##Size##TypeSuffix;\n\n#define EIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(Type, TypeSuffix) \\\nEIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, 2, 2) \\\nEIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, 3, 3) \\\nEIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, 4, 4) \\\nEIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, Dynamic, X) \\\nEIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, 2) \\\nEIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, 3) \\\nEIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, 4)\n\nEIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(int,                  i)\nEIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(float,                f)\nEIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(double,               d)\nEIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(std::complex<float>,  cf)\nEIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(std::complex<double>, cd)\n\n#undef EIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES\n#undef EIGEN_MAKE_ARRAY_TYPEDEFS\n\n#undef EIGEN_MAKE_ARRAY_TYPEDEFS_LARGE\n\n#define EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, SizeSuffix) \\\nusing Eigen::Matrix##SizeSuffix##TypeSuffix; \\\nusing Eigen::Vector##SizeSuffix##TypeSuffix; \\\nusing Eigen::RowVector##SizeSuffix##TypeSuffix;\n\n#define EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(TypeSuffix) \\\nEIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, 2) \\\nEIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, 3) \\\nEIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, 4) \\\nEIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, X) \\\n\n#define EIGEN_USING_ARRAY_TYPEDEFS \\\nEIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(i) \\\nEIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(f) \\\nEIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(d) \\\nEIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(cf) \\\nEIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(cd)\n\n} // end namespace Eigen\n\n#endif // EIGEN_ARRAY_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/ArrayBase.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_ARRAYBASE_H\n#define EIGEN_ARRAYBASE_H\n\nnamespace Eigen { \n\ntemplate<typename ExpressionType> class MatrixWrapper;\n\n/** \\class ArrayBase\n  * \\ingroup Core_Module\n  *\n  * \\brief Base class for all 1D and 2D array, and related expressions\n  *\n  * An array is similar to a dense vector or matrix. While matrices are mathematical\n  * objects with well defined linear algebra operators, an array is just a collection\n  * of scalar values arranged in a one or two dimensionnal fashion. As the main consequence,\n  * all operations applied to an array are performed coefficient wise. Furthermore,\n  * arrays support scalar math functions of the c++ standard library (e.g., std::sin(x)), and convenient\n  * constructors allowing to easily write generic code working for both scalar values\n  * and arrays.\n  *\n  * This class is the base that is inherited by all array expression types.\n  *\n  * \\tparam Derived is the derived type, e.g., an array or an expression type.\n  *\n  * This class can be extended with the help of the plugin mechanism described on the page\n  * \\ref TopicCustomizingEigen by defining the preprocessor symbol \\c EIGEN_ARRAYBASE_PLUGIN.\n  *\n  * \\sa class MatrixBase, \\ref TopicClassHierarchy\n  */\ntemplate<typename Derived> class ArrayBase\n  : public DenseBase<Derived>\n{\n  public:\n#ifndef EIGEN_PARSED_BY_DOXYGEN\n    /** The base class for a given storage type. */\n    typedef ArrayBase StorageBaseType;\n\n    typedef ArrayBase Eigen_BaseClassForSpecializationOfGlobalMathFuncImpl;\n\n    typedef typename internal::traits<Derived>::StorageKind StorageKind;\n    typedef typename internal::traits<Derived>::Index Index;\n    typedef typename internal::traits<Derived>::Scalar Scalar;\n    typedef typename internal::packet_traits<Scalar>::type PacketScalar;\n    typedef typename NumTraits<Scalar>::Real RealScalar;\n\n    typedef DenseBase<Derived> Base;\n    using Base::operator*;\n    using Base::RowsAtCompileTime;\n    using Base::ColsAtCompileTime;\n    using Base::SizeAtCompileTime;\n    using Base::MaxRowsAtCompileTime;\n    using Base::MaxColsAtCompileTime;\n    using Base::MaxSizeAtCompileTime;\n    using Base::IsVectorAtCompileTime;\n    using Base::Flags;\n    using Base::CoeffReadCost;\n\n    using Base::derived;\n    using Base::const_cast_derived;\n    using Base::rows;\n    using Base::cols;\n    using Base::size;\n    using Base::coeff;\n    using Base::coeffRef;\n    using Base::lazyAssign;\n    using Base::operator=;\n    using Base::operator+=;\n    using Base::operator-=;\n    using Base::operator*=;\n    using Base::operator/=;\n\n    typedef typename Base::CoeffReturnType CoeffReturnType;\n\n#endif // not EIGEN_PARSED_BY_DOXYGEN\n\n#ifndef EIGEN_PARSED_BY_DOXYGEN\n    /** \\internal the plain matrix type corresponding to this expression. Note that is not necessarily\n      * exactly the return type of eval(): in the case of plain matrices, the return type of eval() is a const\n      * reference to a matrix, not a matrix! It is however guaranteed that the return type of eval() is either\n      * PlainObject or const PlainObject&.\n      */\n    typedef Array<typename internal::traits<Derived>::Scalar,\n                internal::traits<Derived>::RowsAtCompileTime,\n                internal::traits<Derived>::ColsAtCompileTime,\n                AutoAlign | (internal::traits<Derived>::Flags&RowMajorBit ? RowMajor : ColMajor),\n                internal::traits<Derived>::MaxRowsAtCompileTime,\n                internal::traits<Derived>::MaxColsAtCompileTime\n          > PlainObject;\n\n\n    /** \\internal Represents a matrix with all coefficients equal to one another*/\n    typedef CwiseNullaryOp<internal::scalar_constant_op<Scalar>,Derived> ConstantReturnType;\n#endif // not EIGEN_PARSED_BY_DOXYGEN\n\n#define EIGEN_CURRENT_STORAGE_BASE_CLASS Eigen::ArrayBase\n#   include \"../plugins/CommonCwiseUnaryOps.h\"\n#   include \"../plugins/MatrixCwiseUnaryOps.h\"\n#   include \"../plugins/ArrayCwiseUnaryOps.h\"\n#   include \"../plugins/CommonCwiseBinaryOps.h\"\n#   include \"../plugins/MatrixCwiseBinaryOps.h\"\n#   include \"../plugins/ArrayCwiseBinaryOps.h\"\n#   ifdef EIGEN_ARRAYBASE_PLUGIN\n#     include EIGEN_ARRAYBASE_PLUGIN\n#   endif\n#undef EIGEN_CURRENT_STORAGE_BASE_CLASS\n\n    /** Special case of the template operator=, in order to prevent the compiler\n      * from generating a default operator= (issue hit with g++ 4.1)\n      */\n    Derived& operator=(const ArrayBase& other)\n    {\n      return internal::assign_selector<Derived,Derived>::run(derived(), other.derived());\n    }\n\n    Derived& operator+=(const Scalar& scalar)\n    { return *this = derived() + scalar; }\n    Derived& operator-=(const Scalar& scalar)\n    { return *this = derived() - scalar; }\n\n    template<typename OtherDerived>\n    Derived& operator+=(const ArrayBase<OtherDerived>& other);\n    template<typename OtherDerived>\n    Derived& operator-=(const ArrayBase<OtherDerived>& other);\n\n    template<typename OtherDerived>\n    Derived& operator*=(const ArrayBase<OtherDerived>& other);\n\n    template<typename OtherDerived>\n    Derived& operator/=(const ArrayBase<OtherDerived>& other);\n\n  public:\n    ArrayBase<Derived>& array() { return *this; }\n    const ArrayBase<Derived>& array() const { return *this; }\n\n    /** \\returns an \\link Eigen::MatrixBase Matrix \\endlink expression of this array\n      * \\sa MatrixBase::array() */\n    MatrixWrapper<Derived> matrix() { return derived(); }\n    const MatrixWrapper<const Derived> matrix() const { return derived(); }\n\n//     template<typename Dest>\n//     inline void evalTo(Dest& dst) const { dst = matrix(); }\n\n  protected:\n    ArrayBase() : Base() {}\n\n  private:\n    explicit ArrayBase(Index);\n    ArrayBase(Index,Index);\n    template<typename OtherDerived> explicit ArrayBase(const ArrayBase<OtherDerived>&);\n  protected:\n    // mixing arrays and matrices is not legal\n    template<typename OtherDerived> Derived& operator+=(const MatrixBase<OtherDerived>& )\n    {EIGEN_STATIC_ASSERT(std::ptrdiff_t(sizeof(typename OtherDerived::Scalar))==-1,YOU_CANNOT_MIX_ARRAYS_AND_MATRICES); return *this;}\n    // mixing arrays and matrices is not legal\n    template<typename OtherDerived> Derived& operator-=(const MatrixBase<OtherDerived>& )\n    {EIGEN_STATIC_ASSERT(std::ptrdiff_t(sizeof(typename OtherDerived::Scalar))==-1,YOU_CANNOT_MIX_ARRAYS_AND_MATRICES); return *this;}\n};\n\n/** replaces \\c *this by \\c *this - \\a other.\n  *\n  * \\returns a reference to \\c *this\n  */\ntemplate<typename Derived>\ntemplate<typename OtherDerived>\nEIGEN_STRONG_INLINE Derived &\nArrayBase<Derived>::operator-=(const ArrayBase<OtherDerived> &other)\n{\n  SelfCwiseBinaryOp<internal::scalar_difference_op<Scalar>, Derived, OtherDerived> tmp(derived());\n  tmp = other.derived();\n  return derived();\n}\n\n/** replaces \\c *this by \\c *this + \\a other.\n  *\n  * \\returns a reference to \\c *this\n  */\ntemplate<typename Derived>\ntemplate<typename OtherDerived>\nEIGEN_STRONG_INLINE Derived &\nArrayBase<Derived>::operator+=(const ArrayBase<OtherDerived>& other)\n{\n  SelfCwiseBinaryOp<internal::scalar_sum_op<Scalar>, Derived, OtherDerived> tmp(derived());\n  tmp = other.derived();\n  return derived();\n}\n\n/** replaces \\c *this by \\c *this * \\a other coefficient wise.\n  *\n  * \\returns a reference to \\c *this\n  */\ntemplate<typename Derived>\ntemplate<typename OtherDerived>\nEIGEN_STRONG_INLINE Derived &\nArrayBase<Derived>::operator*=(const ArrayBase<OtherDerived>& other)\n{\n  SelfCwiseBinaryOp<internal::scalar_product_op<Scalar>, Derived, OtherDerived> tmp(derived());\n  tmp = other.derived();\n  return derived();\n}\n\n/** replaces \\c *this by \\c *this / \\a other coefficient wise.\n  *\n  * \\returns a reference to \\c *this\n  */\ntemplate<typename Derived>\ntemplate<typename OtherDerived>\nEIGEN_STRONG_INLINE Derived &\nArrayBase<Derived>::operator/=(const ArrayBase<OtherDerived>& other)\n{\n  SelfCwiseBinaryOp<internal::scalar_quotient_op<Scalar>, Derived, OtherDerived> tmp(derived());\n  tmp = other.derived();\n  return derived();\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_ARRAYBASE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/ArrayWrapper.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_ARRAYWRAPPER_H\n#define EIGEN_ARRAYWRAPPER_H\n\nnamespace Eigen { \n\n/** \\class ArrayWrapper\n  * \\ingroup Core_Module\n  *\n  * \\brief Expression of a mathematical vector or matrix as an array object\n  *\n  * This class is the return type of MatrixBase::array(), and most of the time\n  * this is the only way it is use.\n  *\n  * \\sa MatrixBase::array(), class MatrixWrapper\n  */\n\nnamespace internal {\ntemplate<typename ExpressionType>\nstruct traits<ArrayWrapper<ExpressionType> >\n  : public traits<typename remove_all<typename ExpressionType::Nested>::type >\n{\n  typedef ArrayXpr XprKind;\n  // Let's remove NestByRefBit\n  enum {\n    Flags0 = traits<typename remove_all<typename ExpressionType::Nested>::type >::Flags,\n    Flags = Flags0 & ~NestByRefBit\n  };\n};\n}\n\ntemplate<typename ExpressionType>\nclass ArrayWrapper : public ArrayBase<ArrayWrapper<ExpressionType> >\n{\n  public:\n    typedef ArrayBase<ArrayWrapper> Base;\n    EIGEN_DENSE_PUBLIC_INTERFACE(ArrayWrapper)\n    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(ArrayWrapper)\n\n    typedef typename internal::conditional<\n                       internal::is_lvalue<ExpressionType>::value,\n                       Scalar,\n                       const Scalar\n                     >::type ScalarWithConstIfNotLvalue;\n\n    typedef typename internal::nested<ExpressionType>::type NestedExpressionType;\n\n    inline ArrayWrapper(ExpressionType& matrix) : m_expression(matrix) {}\n\n    inline Index rows() const { return m_expression.rows(); }\n    inline Index cols() const { return m_expression.cols(); }\n    inline Index outerStride() const { return m_expression.outerStride(); }\n    inline Index innerStride() const { return m_expression.innerStride(); }\n\n    inline ScalarWithConstIfNotLvalue* data() { return m_expression.const_cast_derived().data(); }\n    inline const Scalar* data() const { return m_expression.data(); }\n\n    inline CoeffReturnType coeff(Index rowId, Index colId) const\n    {\n      return m_expression.coeff(rowId, colId);\n    }\n\n    inline Scalar& coeffRef(Index rowId, Index colId)\n    {\n      return m_expression.const_cast_derived().coeffRef(rowId, colId);\n    }\n\n    inline const Scalar& coeffRef(Index rowId, Index colId) const\n    {\n      return m_expression.const_cast_derived().coeffRef(rowId, colId);\n    }\n\n    inline CoeffReturnType coeff(Index index) const\n    {\n      return m_expression.coeff(index);\n    }\n\n    inline Scalar& coeffRef(Index index)\n    {\n      return m_expression.const_cast_derived().coeffRef(index);\n    }\n\n    inline const Scalar& coeffRef(Index index) const\n    {\n      return m_expression.const_cast_derived().coeffRef(index);\n    }\n\n    template<int LoadMode>\n    inline const PacketScalar packet(Index rowId, Index colId) const\n    {\n      return m_expression.template packet<LoadMode>(rowId, colId);\n    }\n\n    template<int LoadMode>\n    inline void writePacket(Index rowId, Index colId, const PacketScalar& val)\n    {\n      m_expression.const_cast_derived().template writePacket<LoadMode>(rowId, colId, val);\n    }\n\n    template<int LoadMode>\n    inline const PacketScalar packet(Index index) const\n    {\n      return m_expression.template packet<LoadMode>(index);\n    }\n\n    template<int LoadMode>\n    inline void writePacket(Index index, const PacketScalar& val)\n    {\n      m_expression.const_cast_derived().template writePacket<LoadMode>(index, val);\n    }\n\n    template<typename Dest>\n    inline void evalTo(Dest& dst) const { dst = m_expression; }\n\n    const typename internal::remove_all<NestedExpressionType>::type& \n    nestedExpression() const \n    {\n      return m_expression;\n    }\n\n    /** Forwards the resizing request to the nested expression\n      * \\sa DenseBase::resize(Index)  */\n    void resize(Index newSize) { m_expression.const_cast_derived().resize(newSize); }\n    /** Forwards the resizing request to the nested expression\n      * \\sa DenseBase::resize(Index,Index)*/\n    void resize(Index nbRows, Index nbCols) { m_expression.const_cast_derived().resize(nbRows,nbCols); }\n\n  protected:\n    NestedExpressionType m_expression;\n};\n\n/** \\class MatrixWrapper\n  * \\ingroup Core_Module\n  *\n  * \\brief Expression of an array as a mathematical vector or matrix\n  *\n  * This class is the return type of ArrayBase::matrix(), and most of the time\n  * this is the only way it is use.\n  *\n  * \\sa MatrixBase::matrix(), class ArrayWrapper\n  */\n\nnamespace internal {\ntemplate<typename ExpressionType>\nstruct traits<MatrixWrapper<ExpressionType> >\n : public traits<typename remove_all<typename ExpressionType::Nested>::type >\n{\n  typedef MatrixXpr XprKind;\n  // Let's remove NestByRefBit\n  enum {\n    Flags0 = traits<typename remove_all<typename ExpressionType::Nested>::type >::Flags,\n    Flags = Flags0 & ~NestByRefBit\n  };\n};\n}\n\ntemplate<typename ExpressionType>\nclass MatrixWrapper : public MatrixBase<MatrixWrapper<ExpressionType> >\n{\n  public:\n    typedef MatrixBase<MatrixWrapper<ExpressionType> > Base;\n    EIGEN_DENSE_PUBLIC_INTERFACE(MatrixWrapper)\n    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(MatrixWrapper)\n\n    typedef typename internal::conditional<\n                       internal::is_lvalue<ExpressionType>::value,\n                       Scalar,\n                       const Scalar\n                     >::type ScalarWithConstIfNotLvalue;\n\n    typedef typename internal::nested<ExpressionType>::type NestedExpressionType;\n\n    inline MatrixWrapper(ExpressionType& a_matrix) : m_expression(a_matrix) {}\n\n    inline Index rows() const { return m_expression.rows(); }\n    inline Index cols() const { return m_expression.cols(); }\n    inline Index outerStride() const { return m_expression.outerStride(); }\n    inline Index innerStride() const { return m_expression.innerStride(); }\n\n    inline ScalarWithConstIfNotLvalue* data() { return m_expression.const_cast_derived().data(); }\n    inline const Scalar* data() const { return m_expression.data(); }\n\n    inline CoeffReturnType coeff(Index rowId, Index colId) const\n    {\n      return m_expression.coeff(rowId, colId);\n    }\n\n    inline Scalar& coeffRef(Index rowId, Index colId)\n    {\n      return m_expression.const_cast_derived().coeffRef(rowId, colId);\n    }\n\n    inline const Scalar& coeffRef(Index rowId, Index colId) const\n    {\n      return m_expression.derived().coeffRef(rowId, colId);\n    }\n\n    inline CoeffReturnType coeff(Index index) const\n    {\n      return m_expression.coeff(index);\n    }\n\n    inline Scalar& coeffRef(Index index)\n    {\n      return m_expression.const_cast_derived().coeffRef(index);\n    }\n\n    inline const Scalar& coeffRef(Index index) const\n    {\n      return m_expression.const_cast_derived().coeffRef(index);\n    }\n\n    template<int LoadMode>\n    inline const PacketScalar packet(Index rowId, Index colId) const\n    {\n      return m_expression.template packet<LoadMode>(rowId, colId);\n    }\n\n    template<int LoadMode>\n    inline void writePacket(Index rowId, Index colId, const PacketScalar& val)\n    {\n      m_expression.const_cast_derived().template writePacket<LoadMode>(rowId, colId, val);\n    }\n\n    template<int LoadMode>\n    inline const PacketScalar packet(Index index) const\n    {\n      return m_expression.template packet<LoadMode>(index);\n    }\n\n    template<int LoadMode>\n    inline void writePacket(Index index, const PacketScalar& val)\n    {\n      m_expression.const_cast_derived().template writePacket<LoadMode>(index, val);\n    }\n\n    const typename internal::remove_all<NestedExpressionType>::type& \n    nestedExpression() const \n    {\n      return m_expression;\n    }\n\n    /** Forwards the resizing request to the nested expression\n      * \\sa DenseBase::resize(Index)  */\n    void resize(Index newSize) { m_expression.const_cast_derived().resize(newSize); }\n    /** Forwards the resizing request to the nested expression\n      * \\sa DenseBase::resize(Index,Index)*/\n    void resize(Index nbRows, Index nbCols) { m_expression.const_cast_derived().resize(nbRows,nbCols); }\n\n  protected:\n    NestedExpressionType m_expression;\n};\n\n} // end namespace Eigen\n\n#endif // EIGEN_ARRAYWRAPPER_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/Assign.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2007 Michael Olbrich <michael.olbrich@gmx.net>\n// Copyright (C) 2006-2010 Benoit Jacob <jacob.benoit.1@gmail.com>\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_ASSIGN_H\n#define EIGEN_ASSIGN_H\n\nnamespace Eigen {\n\nnamespace internal {\n\n/***************************************************************************\n* Part 1 : the logic deciding a strategy for traversal and unrolling       *\n***************************************************************************/\n\ntemplate <typename Derived, typename OtherDerived>\nstruct assign_traits\n{\npublic:\n  enum {\n    DstIsAligned = Derived::Flags & AlignedBit,\n    DstHasDirectAccess = Derived::Flags & DirectAccessBit,\n    SrcIsAligned = OtherDerived::Flags & AlignedBit,\n    JointAlignment = bool(DstIsAligned) && bool(SrcIsAligned) ? Aligned : Unaligned\n  };\n\nprivate:\n  enum {\n    InnerSize = int(Derived::IsVectorAtCompileTime) ? int(Derived::SizeAtCompileTime)\n              : int(Derived::Flags)&RowMajorBit ? int(Derived::ColsAtCompileTime)\n              : int(Derived::RowsAtCompileTime),\n    InnerMaxSize = int(Derived::IsVectorAtCompileTime) ? int(Derived::MaxSizeAtCompileTime)\n              : int(Derived::Flags)&RowMajorBit ? int(Derived::MaxColsAtCompileTime)\n              : int(Derived::MaxRowsAtCompileTime),\n    MaxSizeAtCompileTime = Derived::SizeAtCompileTime,\n    PacketSize = packet_traits<typename Derived::Scalar>::size\n  };\n\n  enum {\n    StorageOrdersAgree = (int(Derived::IsRowMajor) == int(OtherDerived::IsRowMajor)),\n    MightVectorize = StorageOrdersAgree\n                  && (int(Derived::Flags) & int(OtherDerived::Flags) & ActualPacketAccessBit),\n    MayInnerVectorize  = MightVectorize && int(InnerSize)!=Dynamic && int(InnerSize)%int(PacketSize)==0\n                       && int(DstIsAligned) && int(SrcIsAligned),\n    MayLinearize = StorageOrdersAgree && (int(Derived::Flags) & int(OtherDerived::Flags) & LinearAccessBit),\n    MayLinearVectorize = MightVectorize && MayLinearize && DstHasDirectAccess\n                       && (DstIsAligned || MaxSizeAtCompileTime == Dynamic),\n      /* If the destination isn't aligned, we have to do runtime checks and we don't unroll,\n         so it's only good for large enough sizes. */\n    MaySliceVectorize  = MightVectorize && DstHasDirectAccess\n                       && (int(InnerMaxSize)==Dynamic || int(InnerMaxSize)>=3*PacketSize)\n      /* slice vectorization can be slow, so we only want it if the slices are big, which is\n         indicated by InnerMaxSize rather than InnerSize, think of the case of a dynamic block\n         in a fixed-size matrix */\n  };\n\npublic:\n  enum {\n    Traversal = int(MayInnerVectorize)  ? int(InnerVectorizedTraversal)\n              : int(MayLinearVectorize) ? int(LinearVectorizedTraversal)\n              : int(MaySliceVectorize)  ? int(SliceVectorizedTraversal)\n              : int(MayLinearize)       ? int(LinearTraversal)\n                                        : int(DefaultTraversal),\n    Vectorized = int(Traversal) == InnerVectorizedTraversal\n              || int(Traversal) == LinearVectorizedTraversal\n              || int(Traversal) == SliceVectorizedTraversal\n  };\n\nprivate:\n  enum {\n    UnrollingLimit      = EIGEN_UNROLLING_LIMIT * (Vectorized ? int(PacketSize) : 1),\n    MayUnrollCompletely = int(Derived::SizeAtCompileTime) != Dynamic\n                       && int(OtherDerived::CoeffReadCost) != Dynamic\n                       && int(Derived::SizeAtCompileTime) * int(OtherDerived::CoeffReadCost) <= int(UnrollingLimit),\n    MayUnrollInner      = int(InnerSize) != Dynamic\n                       && int(OtherDerived::CoeffReadCost) != Dynamic\n                       && int(InnerSize) * int(OtherDerived::CoeffReadCost) <= int(UnrollingLimit)\n  };\n\npublic:\n  enum {\n    Unrolling = (int(Traversal) == int(InnerVectorizedTraversal) || int(Traversal) == int(DefaultTraversal))\n                ? (\n                    int(MayUnrollCompletely) ? int(CompleteUnrolling)\n                  : int(MayUnrollInner)      ? int(InnerUnrolling)\n                                             : int(NoUnrolling)\n                  )\n              : int(Traversal) == int(LinearVectorizedTraversal)\n                ? ( bool(MayUnrollCompletely) && bool(DstIsAligned) ? int(CompleteUnrolling) : int(NoUnrolling) )\n              : int(Traversal) == int(LinearTraversal)\n                ? ( bool(MayUnrollCompletely) ? int(CompleteUnrolling) : int(NoUnrolling) )\n              : int(NoUnrolling)\n  };\n\n#ifdef EIGEN_DEBUG_ASSIGN\n  static void debug()\n  {\n    EIGEN_DEBUG_VAR(DstIsAligned)\n    EIGEN_DEBUG_VAR(SrcIsAligned)\n    EIGEN_DEBUG_VAR(JointAlignment)\n    EIGEN_DEBUG_VAR(InnerSize)\n    EIGEN_DEBUG_VAR(InnerMaxSize)\n    EIGEN_DEBUG_VAR(PacketSize)\n    EIGEN_DEBUG_VAR(StorageOrdersAgree)\n    EIGEN_DEBUG_VAR(MightVectorize)\n    EIGEN_DEBUG_VAR(MayLinearize)\n    EIGEN_DEBUG_VAR(MayInnerVectorize)\n    EIGEN_DEBUG_VAR(MayLinearVectorize)\n    EIGEN_DEBUG_VAR(MaySliceVectorize)\n    EIGEN_DEBUG_VAR(Traversal)\n    EIGEN_DEBUG_VAR(UnrollingLimit)\n    EIGEN_DEBUG_VAR(MayUnrollCompletely)\n    EIGEN_DEBUG_VAR(MayUnrollInner)\n    EIGEN_DEBUG_VAR(Unrolling)\n  }\n#endif\n};\n\n/***************************************************************************\n* Part 2 : meta-unrollers\n***************************************************************************/\n\n/************************\n*** Default traversal ***\n************************/\n\ntemplate<typename Derived1, typename Derived2, int Index, int Stop>\nstruct assign_DefaultTraversal_CompleteUnrolling\n{\n  enum {\n    outer = Index / Derived1::InnerSizeAtCompileTime,\n    inner = Index % Derived1::InnerSizeAtCompileTime\n  };\n\n  static EIGEN_STRONG_INLINE void run(Derived1 &dst, const Derived2 &src)\n  {\n    dst.copyCoeffByOuterInner(outer, inner, src);\n    assign_DefaultTraversal_CompleteUnrolling<Derived1, Derived2, Index+1, Stop>::run(dst, src);\n  }\n};\n\ntemplate<typename Derived1, typename Derived2, int Stop>\nstruct assign_DefaultTraversal_CompleteUnrolling<Derived1, Derived2, Stop, Stop>\n{\n  static EIGEN_STRONG_INLINE void run(Derived1 &, const Derived2 &) {}\n};\n\ntemplate<typename Derived1, typename Derived2, int Index, int Stop>\nstruct assign_DefaultTraversal_InnerUnrolling\n{\n  static EIGEN_STRONG_INLINE void run(Derived1 &dst, const Derived2 &src, typename Derived1::Index outer)\n  {\n    dst.copyCoeffByOuterInner(outer, Index, src);\n    assign_DefaultTraversal_InnerUnrolling<Derived1, Derived2, Index+1, Stop>::run(dst, src, outer);\n  }\n};\n\ntemplate<typename Derived1, typename Derived2, int Stop>\nstruct assign_DefaultTraversal_InnerUnrolling<Derived1, Derived2, Stop, Stop>\n{\n  static EIGEN_STRONG_INLINE void run(Derived1 &, const Derived2 &, typename Derived1::Index) {}\n};\n\n/***********************\n*** Linear traversal ***\n***********************/\n\ntemplate<typename Derived1, typename Derived2, int Index, int Stop>\nstruct assign_LinearTraversal_CompleteUnrolling\n{\n  static EIGEN_STRONG_INLINE void run(Derived1 &dst, const Derived2 &src)\n  {\n    dst.copyCoeff(Index, src);\n    assign_LinearTraversal_CompleteUnrolling<Derived1, Derived2, Index+1, Stop>::run(dst, src);\n  }\n};\n\ntemplate<typename Derived1, typename Derived2, int Stop>\nstruct assign_LinearTraversal_CompleteUnrolling<Derived1, Derived2, Stop, Stop>\n{\n  static EIGEN_STRONG_INLINE void run(Derived1 &, const Derived2 &) {}\n};\n\n/**************************\n*** Inner vectorization ***\n**************************/\n\ntemplate<typename Derived1, typename Derived2, int Index, int Stop>\nstruct assign_innervec_CompleteUnrolling\n{\n  enum {\n    outer = Index / Derived1::InnerSizeAtCompileTime,\n    inner = Index % Derived1::InnerSizeAtCompileTime,\n    JointAlignment = assign_traits<Derived1,Derived2>::JointAlignment\n  };\n\n  static EIGEN_STRONG_INLINE void run(Derived1 &dst, const Derived2 &src)\n  {\n    dst.template copyPacketByOuterInner<Derived2, Aligned, JointAlignment>(outer, inner, src);\n    assign_innervec_CompleteUnrolling<Derived1, Derived2,\n      Index+packet_traits<typename Derived1::Scalar>::size, Stop>::run(dst, src);\n  }\n};\n\ntemplate<typename Derived1, typename Derived2, int Stop>\nstruct assign_innervec_CompleteUnrolling<Derived1, Derived2, Stop, Stop>\n{\n  static EIGEN_STRONG_INLINE void run(Derived1 &, const Derived2 &) {}\n};\n\ntemplate<typename Derived1, typename Derived2, int Index, int Stop>\nstruct assign_innervec_InnerUnrolling\n{\n  static EIGEN_STRONG_INLINE void run(Derived1 &dst, const Derived2 &src, typename Derived1::Index outer)\n  {\n    dst.template copyPacketByOuterInner<Derived2, Aligned, Aligned>(outer, Index, src);\n    assign_innervec_InnerUnrolling<Derived1, Derived2,\n      Index+packet_traits<typename Derived1::Scalar>::size, Stop>::run(dst, src, outer);\n  }\n};\n\ntemplate<typename Derived1, typename Derived2, int Stop>\nstruct assign_innervec_InnerUnrolling<Derived1, Derived2, Stop, Stop>\n{\n  static EIGEN_STRONG_INLINE void run(Derived1 &, const Derived2 &, typename Derived1::Index) {}\n};\n\n/***************************************************************************\n* Part 3 : implementation of all cases\n***************************************************************************/\n\ntemplate<typename Derived1, typename Derived2,\n         int Traversal = assign_traits<Derived1, Derived2>::Traversal,\n         int Unrolling = assign_traits<Derived1, Derived2>::Unrolling,\n         int Version = Specialized>\nstruct assign_impl;\n\n/************************\n*** Default traversal ***\n************************/\n\ntemplate<typename Derived1, typename Derived2, int Unrolling, int Version>\nstruct assign_impl<Derived1, Derived2, InvalidTraversal, Unrolling, Version>\n{\n  static inline void run(Derived1 &, const Derived2 &) { }\n};\n\ntemplate<typename Derived1, typename Derived2, int Version>\nstruct assign_impl<Derived1, Derived2, DefaultTraversal, NoUnrolling, Version>\n{\n  typedef typename Derived1::Index Index;\n  static inline void run(Derived1 &dst, const Derived2 &src)\n  {\n    const Index innerSize = dst.innerSize();\n    const Index outerSize = dst.outerSize();\n    for(Index outer = 0; outer < outerSize; ++outer)\n      for(Index inner = 0; inner < innerSize; ++inner)\n        dst.copyCoeffByOuterInner(outer, inner, src);\n  }\n};\n\ntemplate<typename Derived1, typename Derived2, int Version>\nstruct assign_impl<Derived1, Derived2, DefaultTraversal, CompleteUnrolling, Version>\n{\n  static EIGEN_STRONG_INLINE void run(Derived1 &dst, const Derived2 &src)\n  {\n    assign_DefaultTraversal_CompleteUnrolling<Derived1, Derived2, 0, Derived1::SizeAtCompileTime>\n      ::run(dst, src);\n  }\n};\n\ntemplate<typename Derived1, typename Derived2, int Version>\nstruct assign_impl<Derived1, Derived2, DefaultTraversal, InnerUnrolling, Version>\n{\n  typedef typename Derived1::Index Index;\n  static EIGEN_STRONG_INLINE void run(Derived1 &dst, const Derived2 &src)\n  {\n    const Index outerSize = dst.outerSize();\n    for(Index outer = 0; outer < outerSize; ++outer)\n      assign_DefaultTraversal_InnerUnrolling<Derived1, Derived2, 0, Derived1::InnerSizeAtCompileTime>\n        ::run(dst, src, outer);\n  }\n};\n\n/***********************\n*** Linear traversal ***\n***********************/\n\ntemplate<typename Derived1, typename Derived2, int Version>\nstruct assign_impl<Derived1, Derived2, LinearTraversal, NoUnrolling, Version>\n{\n  typedef typename Derived1::Index Index;\n  static inline void run(Derived1 &dst, const Derived2 &src)\n  {\n    const Index size = dst.size();\n    for(Index i = 0; i < size; ++i)\n      dst.copyCoeff(i, src);\n  }\n};\n\ntemplate<typename Derived1, typename Derived2, int Version>\nstruct assign_impl<Derived1, Derived2, LinearTraversal, CompleteUnrolling, Version>\n{\n  static EIGEN_STRONG_INLINE void run(Derived1 &dst, const Derived2 &src)\n  {\n    assign_LinearTraversal_CompleteUnrolling<Derived1, Derived2, 0, Derived1::SizeAtCompileTime>\n      ::run(dst, src);\n  }\n};\n\n/**************************\n*** Inner vectorization ***\n**************************/\n\ntemplate<typename Derived1, typename Derived2, int Version>\nstruct assign_impl<Derived1, Derived2, InnerVectorizedTraversal, NoUnrolling, Version>\n{\n  typedef typename Derived1::Index Index;\n  static inline void run(Derived1 &dst, const Derived2 &src)\n  {\n    const Index innerSize = dst.innerSize();\n    const Index outerSize = dst.outerSize();\n    const Index packetSize = packet_traits<typename Derived1::Scalar>::size;\n    for(Index outer = 0; outer < outerSize; ++outer)\n      for(Index inner = 0; inner < innerSize; inner+=packetSize)\n        dst.template copyPacketByOuterInner<Derived2, Aligned, Aligned>(outer, inner, src);\n  }\n};\n\ntemplate<typename Derived1, typename Derived2, int Version>\nstruct assign_impl<Derived1, Derived2, InnerVectorizedTraversal, CompleteUnrolling, Version>\n{\n  static EIGEN_STRONG_INLINE void run(Derived1 &dst, const Derived2 &src)\n  {\n    assign_innervec_CompleteUnrolling<Derived1, Derived2, 0, Derived1::SizeAtCompileTime>\n      ::run(dst, src);\n  }\n};\n\ntemplate<typename Derived1, typename Derived2, int Version>\nstruct assign_impl<Derived1, Derived2, InnerVectorizedTraversal, InnerUnrolling, Version>\n{\n  typedef typename Derived1::Index Index;\n  static EIGEN_STRONG_INLINE void run(Derived1 &dst, const Derived2 &src)\n  {\n    const Index outerSize = dst.outerSize();\n    for(Index outer = 0; outer < outerSize; ++outer)\n      assign_innervec_InnerUnrolling<Derived1, Derived2, 0, Derived1::InnerSizeAtCompileTime>\n        ::run(dst, src, outer);\n  }\n};\n\n/***************************\n*** Linear vectorization ***\n***************************/\n\ntemplate <bool IsAligned = false>\nstruct unaligned_assign_impl\n{\n  template <typename Derived, typename OtherDerived>\n  static EIGEN_STRONG_INLINE void run(const Derived&, OtherDerived&, typename Derived::Index, typename Derived::Index) {}\n};\n\ntemplate <>\nstruct unaligned_assign_impl<false>\n{\n  // MSVC must not inline this functions. If it does, it fails to optimize the\n  // packet access path.\n#ifdef _MSC_VER\n  template <typename Derived, typename OtherDerived>\n  static EIGEN_DONT_INLINE void run(const Derived& src, OtherDerived& dst, typename Derived::Index start, typename Derived::Index end)\n#else\n  template <typename Derived, typename OtherDerived>\n  static EIGEN_STRONG_INLINE void run(const Derived& src, OtherDerived& dst, typename Derived::Index start, typename Derived::Index end)\n#endif\n  {\n    for (typename Derived::Index index = start; index < end; ++index)\n      dst.copyCoeff(index, src);\n  }\n};\n\ntemplate<typename Derived1, typename Derived2, int Version>\nstruct assign_impl<Derived1, Derived2, LinearVectorizedTraversal, NoUnrolling, Version>\n{\n  typedef typename Derived1::Index Index;\n  static EIGEN_STRONG_INLINE void run(Derived1 &dst, const Derived2 &src)\n  {\n    const Index size = dst.size();\n    typedef packet_traits<typename Derived1::Scalar> PacketTraits;\n    enum {\n      packetSize = PacketTraits::size,\n      dstAlignment = PacketTraits::AlignedOnScalar ? Aligned : int(assign_traits<Derived1,Derived2>::DstIsAligned) ,\n      srcAlignment = assign_traits<Derived1,Derived2>::JointAlignment\n    };\n    const Index alignedStart = assign_traits<Derived1,Derived2>::DstIsAligned ? 0\n                             : internal::first_aligned(&dst.coeffRef(0), size);\n    const Index alignedEnd = alignedStart + ((size-alignedStart)/packetSize)*packetSize;\n\n    unaligned_assign_impl<assign_traits<Derived1,Derived2>::DstIsAligned!=0>::run(src,dst,0,alignedStart);\n\n    for(Index index = alignedStart; index < alignedEnd; index += packetSize)\n    {\n      dst.template copyPacket<Derived2, dstAlignment, srcAlignment>(index, src);\n    }\n\n    unaligned_assign_impl<>::run(src,dst,alignedEnd,size);\n  }\n};\n\ntemplate<typename Derived1, typename Derived2, int Version>\nstruct assign_impl<Derived1, Derived2, LinearVectorizedTraversal, CompleteUnrolling, Version>\n{\n  typedef typename Derived1::Index Index;\n  static EIGEN_STRONG_INLINE void run(Derived1 &dst, const Derived2 &src)\n  {\n    enum { size = Derived1::SizeAtCompileTime,\n           packetSize = packet_traits<typename Derived1::Scalar>::size,\n           alignedSize = (size/packetSize)*packetSize };\n\n    assign_innervec_CompleteUnrolling<Derived1, Derived2, 0, alignedSize>::run(dst, src);\n    assign_DefaultTraversal_CompleteUnrolling<Derived1, Derived2, alignedSize, size>::run(dst, src);\n  }\n};\n\n/**************************\n*** Slice vectorization ***\n***************************/\n\ntemplate<typename Derived1, typename Derived2, int Version>\nstruct assign_impl<Derived1, Derived2, SliceVectorizedTraversal, NoUnrolling, Version>\n{\n  typedef typename Derived1::Index Index;\n  static inline void run(Derived1 &dst, const Derived2 &src)\n  {\n    typedef typename Derived1::Scalar Scalar;\n    typedef packet_traits<Scalar> PacketTraits;\n    enum {\n      packetSize = PacketTraits::size,\n      alignable = PacketTraits::AlignedOnScalar,\n      dstIsAligned = assign_traits<Derived1,Derived2>::DstIsAligned,\n      dstAlignment = alignable ? Aligned : int(dstIsAligned),\n      srcAlignment = assign_traits<Derived1,Derived2>::JointAlignment\n    };\n    const Scalar *dst_ptr = &dst.coeffRef(0,0);\n    if((!bool(dstIsAligned)) && (size_t(dst_ptr) % sizeof(Scalar))>0)\n    {\n      // the pointer is not aligend-on scalar, so alignment is not possible\n      return assign_impl<Derived1,Derived2,DefaultTraversal,NoUnrolling>::run(dst, src);\n    }\n    const Index packetAlignedMask = packetSize - 1;\n    const Index innerSize = dst.innerSize();\n    const Index outerSize = dst.outerSize();\n    const Index alignedStep = alignable ? (packetSize - dst.outerStride() % packetSize) & packetAlignedMask : 0;\n    Index alignedStart = ((!alignable) || bool(dstIsAligned)) ? 0 : internal::first_aligned(dst_ptr, innerSize);\n\n    for(Index outer = 0; outer < outerSize; ++outer)\n    {\n      const Index alignedEnd = alignedStart + ((innerSize-alignedStart) & ~packetAlignedMask);\n      // do the non-vectorizable part of the assignment\n      for(Index inner = 0; inner<alignedStart ; ++inner)\n        dst.copyCoeffByOuterInner(outer, inner, src);\n\n      // do the vectorizable part of the assignment\n      for(Index inner = alignedStart; inner<alignedEnd; inner+=packetSize)\n        dst.template copyPacketByOuterInner<Derived2, dstAlignment, Unaligned>(outer, inner, src);\n\n      // do the non-vectorizable part of the assignment\n      for(Index inner = alignedEnd; inner<innerSize ; ++inner)\n        dst.copyCoeffByOuterInner(outer, inner, src);\n\n      alignedStart = std::min<Index>((alignedStart+alignedStep)%packetSize, innerSize);\n    }\n  }\n};\n\n} // end namespace internal\n\n/***************************************************************************\n* Part 4 : implementation of DenseBase methods\n***************************************************************************/\n\ntemplate<typename Derived>\ntemplate<typename OtherDerived>\nEIGEN_STRONG_INLINE Derived& DenseBase<Derived>\n  ::lazyAssign(const DenseBase<OtherDerived>& other)\n{\n  enum{\n    SameType = internal::is_same<typename Derived::Scalar,typename OtherDerived::Scalar>::value\n  };\n\n  EIGEN_STATIC_ASSERT_LVALUE(Derived)\n  EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(Derived,OtherDerived)\n  EIGEN_STATIC_ASSERT(SameType,YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)\n\n#ifdef EIGEN_DEBUG_ASSIGN\n  internal::assign_traits<Derived, OtherDerived>::debug();\n#endif\n  eigen_assert(rows() == other.rows() && cols() == other.cols());\n  internal::assign_impl<Derived, OtherDerived, int(SameType) ? int(internal::assign_traits<Derived, OtherDerived>::Traversal)\n                                                       : int(InvalidTraversal)>::run(derived(),other.derived());\n#ifndef EIGEN_NO_DEBUG\n  checkTransposeAliasing(other.derived());\n#endif\n  return derived();\n}\n\nnamespace internal {\n\ntemplate<typename Derived, typename OtherDerived,\n         bool EvalBeforeAssigning = (int(internal::traits<OtherDerived>::Flags) & EvalBeforeAssigningBit) != 0,\n         bool NeedToTranspose = ((int(Derived::RowsAtCompileTime) == 1 && int(OtherDerived::ColsAtCompileTime) == 1)\n                              |   // FIXME | instead of || to please GCC 4.4.0 stupid warning \"suggest parentheses around &&\".\n                                  // revert to || as soon as not needed anymore.\n                                  (int(Derived::ColsAtCompileTime) == 1 && int(OtherDerived::RowsAtCompileTime) == 1))\n                              && int(Derived::SizeAtCompileTime) != 1>\nstruct assign_selector;\n\ntemplate<typename Derived, typename OtherDerived>\nstruct assign_selector<Derived,OtherDerived,false,false> {\n  static EIGEN_STRONG_INLINE Derived& run(Derived& dst, const OtherDerived& other) { return dst.lazyAssign(other.derived()); }\n  template<typename ActualDerived, typename ActualOtherDerived>\n  static EIGEN_STRONG_INLINE Derived& evalTo(ActualDerived& dst, const ActualOtherDerived& other) { other.evalTo(dst); return dst; }\n};\ntemplate<typename Derived, typename OtherDerived>\nstruct assign_selector<Derived,OtherDerived,true,false> {\n  static EIGEN_STRONG_INLINE Derived& run(Derived& dst, const OtherDerived& other) { return dst.lazyAssign(other.eval()); }\n};\ntemplate<typename Derived, typename OtherDerived>\nstruct assign_selector<Derived,OtherDerived,false,true> {\n  static EIGEN_STRONG_INLINE Derived& run(Derived& dst, const OtherDerived& other) { return dst.lazyAssign(other.transpose()); }\n  template<typename ActualDerived, typename ActualOtherDerived>\n  static EIGEN_STRONG_INLINE Derived& evalTo(ActualDerived& dst, const ActualOtherDerived& other) { Transpose<ActualDerived> dstTrans(dst); other.evalTo(dstTrans); return dst; }\n};\ntemplate<typename Derived, typename OtherDerived>\nstruct assign_selector<Derived,OtherDerived,true,true> {\n  static EIGEN_STRONG_INLINE Derived& run(Derived& dst, const OtherDerived& other) { return dst.lazyAssign(other.transpose().eval()); }\n};\n\n} // end namespace internal\n\ntemplate<typename Derived>\ntemplate<typename OtherDerived>\nEIGEN_STRONG_INLINE Derived& DenseBase<Derived>::operator=(const DenseBase<OtherDerived>& other)\n{\n  return internal::assign_selector<Derived,OtherDerived>::run(derived(), other.derived());\n}\n\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE Derived& DenseBase<Derived>::operator=(const DenseBase& other)\n{\n  return internal::assign_selector<Derived,Derived>::run(derived(), other.derived());\n}\n\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::operator=(const MatrixBase& other)\n{\n  return internal::assign_selector<Derived,Derived>::run(derived(), other.derived());\n}\n\ntemplate<typename Derived>\ntemplate <typename OtherDerived>\nEIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::operator=(const DenseBase<OtherDerived>& other)\n{\n  return internal::assign_selector<Derived,OtherDerived>::run(derived(), other.derived());\n}\n\ntemplate<typename Derived>\ntemplate <typename OtherDerived>\nEIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::operator=(const EigenBase<OtherDerived>& other)\n{\n  return internal::assign_selector<Derived,OtherDerived,false>::evalTo(derived(), other.derived());\n}\n\ntemplate<typename Derived>\ntemplate<typename OtherDerived>\nEIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::operator=(const ReturnByValue<OtherDerived>& other)\n{\n  return internal::assign_selector<Derived,OtherDerived,false>::evalTo(derived(), other.derived());\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_ASSIGN_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/Assign_MKL.h",
    "content": "/*\n Copyright (c) 2011, Intel Corporation. All rights reserved.\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n * Neither the name of Intel Corporation nor the names of its contributors may\n   be used to endorse or promote products derived from this software without\n   specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\n ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n ********************************************************************************\n *   Content : Eigen bindings to Intel(R) MKL\n *   MKL VML support for coefficient-wise unary Eigen expressions like a=b.sin()\n ********************************************************************************\n*/\n\n#ifndef EIGEN_ASSIGN_VML_H\n#define EIGEN_ASSIGN_VML_H\n\nnamespace Eigen { \n\nnamespace internal {\n\ntemplate<typename Op> struct vml_call\n{ enum { IsSupported = 0 }; };\n\ntemplate<typename Dst, typename Src, typename UnaryOp>\nclass vml_assign_traits\n{\n  private:\n    enum {\n      DstHasDirectAccess = Dst::Flags & DirectAccessBit,\n      SrcHasDirectAccess = Src::Flags & DirectAccessBit,\n\n      StorageOrdersAgree = (int(Dst::IsRowMajor) == int(Src::IsRowMajor)),\n      InnerSize = int(Dst::IsVectorAtCompileTime) ? int(Dst::SizeAtCompileTime)\n                : int(Dst::Flags)&RowMajorBit ? int(Dst::ColsAtCompileTime)\n                : int(Dst::RowsAtCompileTime),\n      InnerMaxSize  = int(Dst::IsVectorAtCompileTime) ? int(Dst::MaxSizeAtCompileTime)\n                    : int(Dst::Flags)&RowMajorBit ? int(Dst::MaxColsAtCompileTime)\n                    : int(Dst::MaxRowsAtCompileTime),\n      MaxSizeAtCompileTime = Dst::SizeAtCompileTime,\n\n      MightEnableVml =  vml_call<UnaryOp>::IsSupported && StorageOrdersAgree && DstHasDirectAccess && SrcHasDirectAccess\n                     && Src::InnerStrideAtCompileTime==1 && Dst::InnerStrideAtCompileTime==1,\n      MightLinearize = MightEnableVml && (int(Dst::Flags) & int(Src::Flags) & LinearAccessBit),\n      VmlSize = MightLinearize ? MaxSizeAtCompileTime : InnerMaxSize,\n      LargeEnough = VmlSize==Dynamic || VmlSize>=EIGEN_MKL_VML_THRESHOLD,\n      MayEnableVml = MightEnableVml && LargeEnough,\n      MayLinearize = MayEnableVml && MightLinearize\n    };\n  public:\n    enum {\n      Traversal = MayLinearize ? LinearVectorizedTraversal\n                : MayEnableVml ? InnerVectorizedTraversal\n                : DefaultTraversal\n    };\n};\n\ntemplate<typename Derived1, typename Derived2, typename UnaryOp, int Traversal, int Unrolling,\n         int VmlTraversal = vml_assign_traits<Derived1, Derived2, UnaryOp>::Traversal >\nstruct vml_assign_impl\n  : assign_impl<Derived1, Eigen::CwiseUnaryOp<UnaryOp, Derived2>,Traversal,Unrolling,BuiltIn>\n{\n};\n\ntemplate<typename Derived1, typename Derived2, typename UnaryOp, int Traversal, int Unrolling>\nstruct vml_assign_impl<Derived1, Derived2, UnaryOp, Traversal, Unrolling, InnerVectorizedTraversal>\n{\n  typedef typename Derived1::Scalar Scalar;\n  typedef typename Derived1::Index Index;\n  static inline void run(Derived1& dst, const CwiseUnaryOp<UnaryOp, Derived2>& src)\n  {\n    // in case we want to (or have to) skip VML at runtime we can call:\n    // assign_impl<Derived1,Eigen::CwiseUnaryOp<UnaryOp, Derived2>,Traversal,Unrolling,BuiltIn>::run(dst,src);\n    const Index innerSize = dst.innerSize();\n    const Index outerSize = dst.outerSize();\n    for(Index outer = 0; outer < outerSize; ++outer) {\n      const Scalar *src_ptr = src.IsRowMajor ?  &(src.nestedExpression().coeffRef(outer,0)) :\n                                                &(src.nestedExpression().coeffRef(0, outer));\n      Scalar *dst_ptr = dst.IsRowMajor ? &(dst.coeffRef(outer,0)) : &(dst.coeffRef(0, outer));\n      vml_call<UnaryOp>::run(src.functor(), innerSize, src_ptr, dst_ptr );\n    }\n  }\n};\n\ntemplate<typename Derived1, typename Derived2, typename UnaryOp, int Traversal, int Unrolling>\nstruct vml_assign_impl<Derived1, Derived2, UnaryOp, Traversal, Unrolling, LinearVectorizedTraversal>\n{\n  static inline void run(Derived1& dst, const CwiseUnaryOp<UnaryOp, Derived2>& src)\n  {\n    // in case we want to (or have to) skip VML at runtime we can call:\n    // assign_impl<Derived1,Eigen::CwiseUnaryOp<UnaryOp, Derived2>,Traversal,Unrolling,BuiltIn>::run(dst,src);\n    vml_call<UnaryOp>::run(src.functor(), dst.size(), src.nestedExpression().data(), dst.data() );\n  }\n};\n\n// Macroses\n\n#define EIGEN_MKL_VML_SPECIALIZE_ASSIGN(TRAVERSAL,UNROLLING) \\\n  template<typename Derived1, typename Derived2, typename UnaryOp> \\\n  struct assign_impl<Derived1, Eigen::CwiseUnaryOp<UnaryOp, Derived2>, TRAVERSAL, UNROLLING, Specialized>  {  \\\n    static inline void run(Derived1 &dst, const Eigen::CwiseUnaryOp<UnaryOp, Derived2> &src) { \\\n      vml_assign_impl<Derived1,Derived2,UnaryOp,TRAVERSAL,UNROLLING>::run(dst, src); \\\n    } \\\n  };\n\nEIGEN_MKL_VML_SPECIALIZE_ASSIGN(DefaultTraversal,NoUnrolling)\nEIGEN_MKL_VML_SPECIALIZE_ASSIGN(DefaultTraversal,CompleteUnrolling)\nEIGEN_MKL_VML_SPECIALIZE_ASSIGN(DefaultTraversal,InnerUnrolling)\nEIGEN_MKL_VML_SPECIALIZE_ASSIGN(LinearTraversal,NoUnrolling)\nEIGEN_MKL_VML_SPECIALIZE_ASSIGN(LinearTraversal,CompleteUnrolling)\nEIGEN_MKL_VML_SPECIALIZE_ASSIGN(InnerVectorizedTraversal,NoUnrolling)\nEIGEN_MKL_VML_SPECIALIZE_ASSIGN(InnerVectorizedTraversal,CompleteUnrolling)\nEIGEN_MKL_VML_SPECIALIZE_ASSIGN(InnerVectorizedTraversal,InnerUnrolling)\nEIGEN_MKL_VML_SPECIALIZE_ASSIGN(LinearVectorizedTraversal,CompleteUnrolling)\nEIGEN_MKL_VML_SPECIALIZE_ASSIGN(LinearVectorizedTraversal,NoUnrolling)\nEIGEN_MKL_VML_SPECIALIZE_ASSIGN(SliceVectorizedTraversal,NoUnrolling)\n\n\n#if !defined (EIGEN_FAST_MATH) || (EIGEN_FAST_MATH != 1)\n#define  EIGEN_MKL_VML_MODE VML_HA\n#else\n#define  EIGEN_MKL_VML_MODE VML_LA\n#endif\n\n#define EIGEN_MKL_VML_DECLARE_UNARY_CALL(EIGENOP, VMLOP, EIGENTYPE, VMLTYPE)     \\\n  template<> struct vml_call< scalar_##EIGENOP##_op<EIGENTYPE> > {               \\\n    enum { IsSupported = 1 };                                                    \\\n    static inline void run( const scalar_##EIGENOP##_op<EIGENTYPE>& /*func*/,        \\\n                            int size, const EIGENTYPE* src, EIGENTYPE* dst) {    \\\n      VMLOP(size, (const VMLTYPE*)src, (VMLTYPE*)dst);                           \\\n    }                                                                            \\\n  };\n\n#define EIGEN_MKL_VML_DECLARE_UNARY_CALL_LA(EIGENOP, VMLOP, EIGENTYPE, VMLTYPE)  \\\n  template<> struct vml_call< scalar_##EIGENOP##_op<EIGENTYPE> > {               \\\n    enum { IsSupported = 1 };                                                    \\\n    static inline void run( const scalar_##EIGENOP##_op<EIGENTYPE>& /*func*/,        \\\n                            int size, const EIGENTYPE* src, EIGENTYPE* dst) {    \\\n      MKL_INT64 vmlMode = EIGEN_MKL_VML_MODE;                                    \\\n      VMLOP(size, (const VMLTYPE*)src, (VMLTYPE*)dst, vmlMode);                  \\\n    }                                                                            \\\n  };\n\n#define EIGEN_MKL_VML_DECLARE_POW_CALL(EIGENOP, VMLOP, EIGENTYPE, VMLTYPE)       \\\n  template<> struct vml_call< scalar_##EIGENOP##_op<EIGENTYPE> > {               \\\n    enum { IsSupported = 1 };                                                    \\\n    static inline void run( const scalar_##EIGENOP##_op<EIGENTYPE>& func,        \\\n                          int size, const EIGENTYPE* src, EIGENTYPE* dst) {      \\\n      EIGENTYPE exponent = func.m_exponent;                                      \\\n      MKL_INT64 vmlMode = EIGEN_MKL_VML_MODE;                                    \\\n      VMLOP(&size, (const VMLTYPE*)src, (const VMLTYPE*)&exponent,               \\\n                        (VMLTYPE*)dst, &vmlMode);                                \\\n    }                                                                            \\\n  };\n\n#define EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(EIGENOP, VMLOP)                   \\\n  EIGEN_MKL_VML_DECLARE_UNARY_CALL(EIGENOP, vs##VMLOP, float, float)             \\\n  EIGEN_MKL_VML_DECLARE_UNARY_CALL(EIGENOP, vd##VMLOP, double, double)\n\n#define EIGEN_MKL_VML_DECLARE_UNARY_CALLS_COMPLEX(EIGENOP, VMLOP)                \\\n  EIGEN_MKL_VML_DECLARE_UNARY_CALL(EIGENOP, vc##VMLOP, scomplex, MKL_Complex8)   \\\n  EIGEN_MKL_VML_DECLARE_UNARY_CALL(EIGENOP, vz##VMLOP, dcomplex, MKL_Complex16)\n\n#define EIGEN_MKL_VML_DECLARE_UNARY_CALLS(EIGENOP, VMLOP)                        \\\n  EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(EIGENOP, VMLOP)                         \\\n  EIGEN_MKL_VML_DECLARE_UNARY_CALLS_COMPLEX(EIGENOP, VMLOP)\n\n\n#define EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL_LA(EIGENOP, VMLOP)                \\\n  EIGEN_MKL_VML_DECLARE_UNARY_CALL_LA(EIGENOP, vms##VMLOP, float, float)         \\\n  EIGEN_MKL_VML_DECLARE_UNARY_CALL_LA(EIGENOP, vmd##VMLOP, double, double)\n\n#define EIGEN_MKL_VML_DECLARE_UNARY_CALLS_COMPLEX_LA(EIGENOP, VMLOP)             \\\n  EIGEN_MKL_VML_DECLARE_UNARY_CALL_LA(EIGENOP, vmc##VMLOP, scomplex, MKL_Complex8)  \\\n  EIGEN_MKL_VML_DECLARE_UNARY_CALL_LA(EIGENOP, vmz##VMLOP, dcomplex, MKL_Complex16)\n\n#define EIGEN_MKL_VML_DECLARE_UNARY_CALLS_LA(EIGENOP, VMLOP)                     \\\n  EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL_LA(EIGENOP, VMLOP)                      \\\n  EIGEN_MKL_VML_DECLARE_UNARY_CALLS_COMPLEX_LA(EIGENOP, VMLOP)\n\n\nEIGEN_MKL_VML_DECLARE_UNARY_CALLS_LA(sin,  Sin)\nEIGEN_MKL_VML_DECLARE_UNARY_CALLS_LA(asin, Asin)\nEIGEN_MKL_VML_DECLARE_UNARY_CALLS_LA(cos,  Cos)\nEIGEN_MKL_VML_DECLARE_UNARY_CALLS_LA(acos, Acos)\nEIGEN_MKL_VML_DECLARE_UNARY_CALLS_LA(tan,  Tan)\n//EIGEN_MKL_VML_DECLARE_UNARY_CALLS(abs,  Abs)\nEIGEN_MKL_VML_DECLARE_UNARY_CALLS_LA(exp,  Exp)\nEIGEN_MKL_VML_DECLARE_UNARY_CALLS_LA(log,  Ln)\nEIGEN_MKL_VML_DECLARE_UNARY_CALLS_LA(sqrt, Sqrt)\n\nEIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(square, Sqr)\n\n// The vm*powx functions are not avaibale in the windows version of MKL.\n#ifndef _WIN32\nEIGEN_MKL_VML_DECLARE_POW_CALL(pow, vmspowx_, float, float)\nEIGEN_MKL_VML_DECLARE_POW_CALL(pow, vmdpowx_, double, double)\nEIGEN_MKL_VML_DECLARE_POW_CALL(pow, vmcpowx_, scomplex, MKL_Complex8)\nEIGEN_MKL_VML_DECLARE_POW_CALL(pow, vmzpowx_, dcomplex, MKL_Complex16)\n#endif\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_ASSIGN_VML_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/BandMatrix.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_BANDMATRIX_H\n#define EIGEN_BANDMATRIX_H\n\nnamespace Eigen { \n\nnamespace internal {\n\ntemplate<typename Derived>\nclass BandMatrixBase : public EigenBase<Derived>\n{\n  public:\n\n    enum {\n      Flags = internal::traits<Derived>::Flags,\n      CoeffReadCost = internal::traits<Derived>::CoeffReadCost,\n      RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,\n      ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,\n      MaxRowsAtCompileTime = internal::traits<Derived>::MaxRowsAtCompileTime,\n      MaxColsAtCompileTime = internal::traits<Derived>::MaxColsAtCompileTime,\n      Supers = internal::traits<Derived>::Supers,\n      Subs   = internal::traits<Derived>::Subs,\n      Options = internal::traits<Derived>::Options\n    };\n    typedef typename internal::traits<Derived>::Scalar Scalar;\n    typedef Matrix<Scalar,RowsAtCompileTime,ColsAtCompileTime> DenseMatrixType;\n    typedef typename DenseMatrixType::Index Index;\n    typedef typename internal::traits<Derived>::CoefficientsType CoefficientsType;\n    typedef EigenBase<Derived> Base;\n\n  protected:\n    enum {\n      DataRowsAtCompileTime = ((Supers!=Dynamic) && (Subs!=Dynamic))\n                            ? 1 + Supers + Subs\n                            : Dynamic,\n      SizeAtCompileTime = EIGEN_SIZE_MIN_PREFER_DYNAMIC(RowsAtCompileTime,ColsAtCompileTime)\n    };\n\n  public:\n    \n    using Base::derived;\n    using Base::rows;\n    using Base::cols;\n\n    /** \\returns the number of super diagonals */\n    inline Index supers() const { return derived().supers(); }\n\n    /** \\returns the number of sub diagonals */\n    inline Index subs() const { return derived().subs(); }\n    \n    /** \\returns an expression of the underlying coefficient matrix */\n    inline const CoefficientsType& coeffs() const { return derived().coeffs(); }\n    \n    /** \\returns an expression of the underlying coefficient matrix */\n    inline CoefficientsType& coeffs() { return derived().coeffs(); }\n\n    /** \\returns a vector expression of the \\a i -th column,\n      * only the meaningful part is returned.\n      * \\warning the internal storage must be column major. */\n    inline Block<CoefficientsType,Dynamic,1> col(Index i)\n    {\n      EIGEN_STATIC_ASSERT((Options&RowMajor)==0,THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES);\n      Index start = 0;\n      Index len = coeffs().rows();\n      if (i<=supers())\n      {\n        start = supers()-i;\n        len = (std::min)(rows(),std::max<Index>(0,coeffs().rows() - (supers()-i)));\n      }\n      else if (i>=rows()-subs())\n        len = std::max<Index>(0,coeffs().rows() - (i + 1 - rows() + subs()));\n      return Block<CoefficientsType,Dynamic,1>(coeffs(), start, i, len, 1);\n    }\n\n    /** \\returns a vector expression of the main diagonal */\n    inline Block<CoefficientsType,1,SizeAtCompileTime> diagonal()\n    { return Block<CoefficientsType,1,SizeAtCompileTime>(coeffs(),supers(),0,1,(std::min)(rows(),cols())); }\n\n    /** \\returns a vector expression of the main diagonal (const version) */\n    inline const Block<const CoefficientsType,1,SizeAtCompileTime> diagonal() const\n    { return Block<const CoefficientsType,1,SizeAtCompileTime>(coeffs(),supers(),0,1,(std::min)(rows(),cols())); }\n\n    template<int Index> struct DiagonalIntReturnType {\n      enum {\n        ReturnOpposite = (Options&SelfAdjoint) && (((Index)>0 && Supers==0) || ((Index)<0 && Subs==0)),\n        Conjugate = ReturnOpposite && NumTraits<Scalar>::IsComplex,\n        ActualIndex = ReturnOpposite ? -Index : Index,\n        DiagonalSize = (RowsAtCompileTime==Dynamic || ColsAtCompileTime==Dynamic)\n                     ? Dynamic\n                     : (ActualIndex<0\n                     ? EIGEN_SIZE_MIN_PREFER_DYNAMIC(ColsAtCompileTime, RowsAtCompileTime + ActualIndex)\n                     : EIGEN_SIZE_MIN_PREFER_DYNAMIC(RowsAtCompileTime, ColsAtCompileTime - ActualIndex))\n      };\n      typedef Block<CoefficientsType,1, DiagonalSize> BuildType;\n      typedef typename internal::conditional<Conjugate,\n                 CwiseUnaryOp<internal::scalar_conjugate_op<Scalar>,BuildType >,\n                 BuildType>::type Type;\n    };\n\n    /** \\returns a vector expression of the \\a N -th sub or super diagonal */\n    template<int N> inline typename DiagonalIntReturnType<N>::Type diagonal()\n    {\n      return typename DiagonalIntReturnType<N>::BuildType(coeffs(), supers()-N, (std::max)(0,N), 1, diagonalLength(N));\n    }\n\n    /** \\returns a vector expression of the \\a N -th sub or super diagonal */\n    template<int N> inline const typename DiagonalIntReturnType<N>::Type diagonal() const\n    {\n      return typename DiagonalIntReturnType<N>::BuildType(coeffs(), supers()-N, (std::max)(0,N), 1, diagonalLength(N));\n    }\n\n    /** \\returns a vector expression of the \\a i -th sub or super diagonal */\n    inline Block<CoefficientsType,1,Dynamic> diagonal(Index i)\n    {\n      eigen_assert((i<0 && -i<=subs()) || (i>=0 && i<=supers()));\n      return Block<CoefficientsType,1,Dynamic>(coeffs(), supers()-i, std::max<Index>(0,i), 1, diagonalLength(i));\n    }\n\n    /** \\returns a vector expression of the \\a i -th sub or super diagonal */\n    inline const Block<const CoefficientsType,1,Dynamic> diagonal(Index i) const\n    {\n      eigen_assert((i<0 && -i<=subs()) || (i>=0 && i<=supers()));\n      return Block<const CoefficientsType,1,Dynamic>(coeffs(), supers()-i, std::max<Index>(0,i), 1, diagonalLength(i));\n    }\n    \n    template<typename Dest> inline void evalTo(Dest& dst) const\n    {\n      dst.resize(rows(),cols());\n      dst.setZero();\n      dst.diagonal() = diagonal();\n      for (Index i=1; i<=supers();++i)\n        dst.diagonal(i) = diagonal(i);\n      for (Index i=1; i<=subs();++i)\n        dst.diagonal(-i) = diagonal(-i);\n    }\n\n    DenseMatrixType toDenseMatrix() const\n    {\n      DenseMatrixType res(rows(),cols());\n      evalTo(res);\n      return res;\n    }\n\n  protected:\n\n    inline Index diagonalLength(Index i) const\n    { return i<0 ? (std::min)(cols(),rows()+i) : (std::min)(rows(),cols()-i); }\n};\n\n/**\n  * \\class BandMatrix\n  * \\ingroup Core_Module\n  *\n  * \\brief Represents a rectangular matrix with a banded storage\n  *\n  * \\param _Scalar Numeric type, i.e. float, double, int\n  * \\param Rows Number of rows, or \\b Dynamic\n  * \\param Cols Number of columns, or \\b Dynamic\n  * \\param Supers Number of super diagonal\n  * \\param Subs Number of sub diagonal\n  * \\param _Options A combination of either \\b #RowMajor or \\b #ColMajor, and of \\b #SelfAdjoint\n  *                 The former controls \\ref TopicStorageOrders \"storage order\", and defaults to\n  *                 column-major. The latter controls whether the matrix represents a selfadjoint \n  *                 matrix in which case either Supers of Subs have to be null.\n  *\n  * \\sa class TridiagonalMatrix\n  */\n\ntemplate<typename _Scalar, int _Rows, int _Cols, int _Supers, int _Subs, int _Options>\nstruct traits<BandMatrix<_Scalar,_Rows,_Cols,_Supers,_Subs,_Options> >\n{\n  typedef _Scalar Scalar;\n  typedef Dense StorageKind;\n  typedef DenseIndex Index;\n  enum {\n    CoeffReadCost = NumTraits<Scalar>::ReadCost,\n    RowsAtCompileTime = _Rows,\n    ColsAtCompileTime = _Cols,\n    MaxRowsAtCompileTime = _Rows,\n    MaxColsAtCompileTime = _Cols,\n    Flags = LvalueBit,\n    Supers = _Supers,\n    Subs = _Subs,\n    Options = _Options,\n    DataRowsAtCompileTime = ((Supers!=Dynamic) && (Subs!=Dynamic)) ? 1 + Supers + Subs : Dynamic\n  };\n  typedef Matrix<Scalar,DataRowsAtCompileTime,ColsAtCompileTime,Options&RowMajor?RowMajor:ColMajor> CoefficientsType;\n};\n\ntemplate<typename _Scalar, int Rows, int Cols, int Supers, int Subs, int Options>\nclass BandMatrix : public BandMatrixBase<BandMatrix<_Scalar,Rows,Cols,Supers,Subs,Options> >\n{\n  public:\n\n    typedef typename internal::traits<BandMatrix>::Scalar Scalar;\n    typedef typename internal::traits<BandMatrix>::Index Index;\n    typedef typename internal::traits<BandMatrix>::CoefficientsType CoefficientsType;\n\n    inline BandMatrix(Index rows=Rows, Index cols=Cols, Index supers=Supers, Index subs=Subs)\n      : m_coeffs(1+supers+subs,cols),\n        m_rows(rows), m_supers(supers), m_subs(subs)\n    {\n    }\n\n    /** \\returns the number of columns */\n    inline Index rows() const { return m_rows.value(); }\n\n    /** \\returns the number of rows */\n    inline Index cols() const { return m_coeffs.cols(); }\n\n    /** \\returns the number of super diagonals */\n    inline Index supers() const { return m_supers.value(); }\n\n    /** \\returns the number of sub diagonals */\n    inline Index subs() const { return m_subs.value(); }\n\n    inline const CoefficientsType& coeffs() const { return m_coeffs; }\n    inline CoefficientsType& coeffs() { return m_coeffs; }\n\n  protected:\n\n    CoefficientsType m_coeffs;\n    internal::variable_if_dynamic<Index, Rows>   m_rows;\n    internal::variable_if_dynamic<Index, Supers> m_supers;\n    internal::variable_if_dynamic<Index, Subs>   m_subs;\n};\n\ntemplate<typename _CoefficientsType,int _Rows, int _Cols, int _Supers, int _Subs,int _Options>\nclass BandMatrixWrapper;\n\ntemplate<typename _CoefficientsType,int _Rows, int _Cols, int _Supers, int _Subs,int _Options>\nstruct traits<BandMatrixWrapper<_CoefficientsType,_Rows,_Cols,_Supers,_Subs,_Options> >\n{\n  typedef typename _CoefficientsType::Scalar Scalar;\n  typedef typename _CoefficientsType::StorageKind StorageKind;\n  typedef typename _CoefficientsType::Index Index;\n  enum {\n    CoeffReadCost = internal::traits<_CoefficientsType>::CoeffReadCost,\n    RowsAtCompileTime = _Rows,\n    ColsAtCompileTime = _Cols,\n    MaxRowsAtCompileTime = _Rows,\n    MaxColsAtCompileTime = _Cols,\n    Flags = LvalueBit,\n    Supers = _Supers,\n    Subs = _Subs,\n    Options = _Options,\n    DataRowsAtCompileTime = ((Supers!=Dynamic) && (Subs!=Dynamic)) ? 1 + Supers + Subs : Dynamic\n  };\n  typedef _CoefficientsType CoefficientsType;\n};\n\ntemplate<typename _CoefficientsType,int _Rows, int _Cols, int _Supers, int _Subs,int _Options>\nclass BandMatrixWrapper : public BandMatrixBase<BandMatrixWrapper<_CoefficientsType,_Rows,_Cols,_Supers,_Subs,_Options> >\n{\n  public:\n\n    typedef typename internal::traits<BandMatrixWrapper>::Scalar Scalar;\n    typedef typename internal::traits<BandMatrixWrapper>::CoefficientsType CoefficientsType;\n    typedef typename internal::traits<BandMatrixWrapper>::Index Index;\n\n    inline BandMatrixWrapper(const CoefficientsType& coeffs, Index rows=_Rows, Index cols=_Cols, Index supers=_Supers, Index subs=_Subs)\n      : m_coeffs(coeffs),\n        m_rows(rows), m_supers(supers), m_subs(subs)\n    {\n      EIGEN_UNUSED_VARIABLE(cols);\n      //internal::assert(coeffs.cols()==cols() && (supers()+subs()+1)==coeffs.rows());\n    }\n\n    /** \\returns the number of columns */\n    inline Index rows() const { return m_rows.value(); }\n\n    /** \\returns the number of rows */\n    inline Index cols() const { return m_coeffs.cols(); }\n\n    /** \\returns the number of super diagonals */\n    inline Index supers() const { return m_supers.value(); }\n\n    /** \\returns the number of sub diagonals */\n    inline Index subs() const { return m_subs.value(); }\n\n    inline const CoefficientsType& coeffs() const { return m_coeffs; }\n\n  protected:\n\n    const CoefficientsType& m_coeffs;\n    internal::variable_if_dynamic<Index, _Rows>   m_rows;\n    internal::variable_if_dynamic<Index, _Supers> m_supers;\n    internal::variable_if_dynamic<Index, _Subs>   m_subs;\n};\n\n/**\n  * \\class TridiagonalMatrix\n  * \\ingroup Core_Module\n  *\n  * \\brief Represents a tridiagonal matrix with a compact banded storage\n  *\n  * \\param _Scalar Numeric type, i.e. float, double, int\n  * \\param Size Number of rows and cols, or \\b Dynamic\n  * \\param _Options Can be 0 or \\b SelfAdjoint\n  *\n  * \\sa class BandMatrix\n  */\ntemplate<typename Scalar, int Size, int Options>\nclass TridiagonalMatrix : public BandMatrix<Scalar,Size,Size,Options&SelfAdjoint?0:1,1,Options|RowMajor>\n{\n    typedef BandMatrix<Scalar,Size,Size,Options&SelfAdjoint?0:1,1,Options|RowMajor> Base;\n    typedef typename Base::Index Index;\n  public:\n    TridiagonalMatrix(Index size = Size) : Base(size,size,Options&SelfAdjoint?0:1,1) {}\n\n    inline typename Base::template DiagonalIntReturnType<1>::Type super()\n    { return Base::template diagonal<1>(); }\n    inline const typename Base::template DiagonalIntReturnType<1>::Type super() const\n    { return Base::template diagonal<1>(); }\n    inline typename Base::template DiagonalIntReturnType<-1>::Type sub()\n    { return Base::template diagonal<-1>(); }\n    inline const typename Base::template DiagonalIntReturnType<-1>::Type sub() const\n    { return Base::template diagonal<-1>(); }\n  protected:\n};\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_BANDMATRIX_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/Block.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2006-2010 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_BLOCK_H\n#define EIGEN_BLOCK_H\n\nnamespace Eigen { \n\n/** \\class Block\n  * \\ingroup Core_Module\n  *\n  * \\brief Expression of a fixed-size or dynamic-size block\n  *\n  * \\param XprType the type of the expression in which we are taking a block\n  * \\param BlockRows the number of rows of the block we are taking at compile time (optional)\n  * \\param BlockCols the number of columns of the block we are taking at compile time (optional)\n  *\n  * This class represents an expression of either a fixed-size or dynamic-size block. It is the return\n  * type of DenseBase::block(Index,Index,Index,Index) and DenseBase::block<int,int>(Index,Index) and\n  * most of the time this is the only way it is used.\n  *\n  * However, if you want to directly maniputate block expressions,\n  * for instance if you want to write a function returning such an expression, you\n  * will need to use this class.\n  *\n  * Here is an example illustrating the dynamic case:\n  * \\include class_Block.cpp\n  * Output: \\verbinclude class_Block.out\n  *\n  * \\note Even though this expression has dynamic size, in the case where \\a XprType\n  * has fixed size, this expression inherits a fixed maximal size which means that evaluating\n  * it does not cause a dynamic memory allocation.\n  *\n  * Here is an example illustrating the fixed-size case:\n  * \\include class_FixedBlock.cpp\n  * Output: \\verbinclude class_FixedBlock.out\n  *\n  * \\sa DenseBase::block(Index,Index,Index,Index), DenseBase::block(Index,Index), class VectorBlock\n  */\n\nnamespace internal {\ntemplate<typename XprType, int BlockRows, int BlockCols, bool InnerPanel>\nstruct traits<Block<XprType, BlockRows, BlockCols, InnerPanel> > : traits<XprType>\n{\n  typedef typename traits<XprType>::Scalar Scalar;\n  typedef typename traits<XprType>::StorageKind StorageKind;\n  typedef typename traits<XprType>::XprKind XprKind;\n  typedef typename nested<XprType>::type XprTypeNested;\n  typedef typename remove_reference<XprTypeNested>::type _XprTypeNested;\n  enum{\n    MatrixRows = traits<XprType>::RowsAtCompileTime,\n    MatrixCols = traits<XprType>::ColsAtCompileTime,\n    RowsAtCompileTime = MatrixRows == 0 ? 0 : BlockRows,\n    ColsAtCompileTime = MatrixCols == 0 ? 0 : BlockCols,\n    MaxRowsAtCompileTime = BlockRows==0 ? 0\n                         : RowsAtCompileTime != Dynamic ? int(RowsAtCompileTime)\n                         : int(traits<XprType>::MaxRowsAtCompileTime),\n    MaxColsAtCompileTime = BlockCols==0 ? 0\n                         : ColsAtCompileTime != Dynamic ? int(ColsAtCompileTime)\n                         : int(traits<XprType>::MaxColsAtCompileTime),\n    XprTypeIsRowMajor = (int(traits<XprType>::Flags)&RowMajorBit) != 0,\n    IsDense = is_same<StorageKind,Dense>::value,\n    IsRowMajor = (IsDense&&MaxRowsAtCompileTime==1&&MaxColsAtCompileTime!=1) ? 1\n               : (IsDense&&MaxColsAtCompileTime==1&&MaxRowsAtCompileTime!=1) ? 0\n               : XprTypeIsRowMajor,\n    HasSameStorageOrderAsXprType = (IsRowMajor == XprTypeIsRowMajor),\n    InnerSize = IsRowMajor ? int(ColsAtCompileTime) : int(RowsAtCompileTime),\n    InnerStrideAtCompileTime = HasSameStorageOrderAsXprType\n                             ? int(inner_stride_at_compile_time<XprType>::ret)\n                             : int(outer_stride_at_compile_time<XprType>::ret),\n    OuterStrideAtCompileTime = HasSameStorageOrderAsXprType\n                             ? int(outer_stride_at_compile_time<XprType>::ret)\n                             : int(inner_stride_at_compile_time<XprType>::ret),\n    MaskPacketAccessBit = (InnerSize == Dynamic || (InnerSize % packet_traits<Scalar>::size) == 0)\n                       && (InnerStrideAtCompileTime == 1)\n                        ? PacketAccessBit : 0,\n    MaskAlignedBit = (InnerPanel && (OuterStrideAtCompileTime!=Dynamic) && (((OuterStrideAtCompileTime * int(sizeof(Scalar))) % 16) == 0)) ? AlignedBit : 0,\n    FlagsLinearAccessBit = (RowsAtCompileTime == 1 || ColsAtCompileTime == 1 || (InnerPanel && (traits<XprType>::Flags&LinearAccessBit))) ? LinearAccessBit : 0,\n    FlagsLvalueBit = is_lvalue<XprType>::value ? LvalueBit : 0,\n    FlagsRowMajorBit = IsRowMajor ? RowMajorBit : 0,\n    Flags0 = traits<XprType>::Flags & ( (HereditaryBits & ~RowMajorBit) |\n                                        DirectAccessBit |\n                                        MaskPacketAccessBit |\n                                        MaskAlignedBit),\n    Flags = Flags0 | FlagsLinearAccessBit | FlagsLvalueBit | FlagsRowMajorBit\n  };\n};\n\ntemplate<typename XprType, int BlockRows=Dynamic, int BlockCols=Dynamic, bool InnerPanel = false,\n         bool HasDirectAccess = internal::has_direct_access<XprType>::ret> class BlockImpl_dense;\n         \n} // end namespace internal\n\ntemplate<typename XprType, int BlockRows, int BlockCols, bool InnerPanel, typename StorageKind> class BlockImpl;\n\ntemplate<typename XprType, int BlockRows, int BlockCols, bool InnerPanel> class Block\n  : public BlockImpl<XprType, BlockRows, BlockCols, InnerPanel, typename internal::traits<XprType>::StorageKind>\n{\n    typedef BlockImpl<XprType, BlockRows, BlockCols, InnerPanel, typename internal::traits<XprType>::StorageKind> Impl;\n  public:\n    //typedef typename Impl::Base Base;\n    typedef Impl Base;\n    EIGEN_GENERIC_PUBLIC_INTERFACE(Block)\n    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Block)\n  \n    /** Column or Row constructor\n      */\n    inline Block(XprType& xpr, Index i) : Impl(xpr,i)\n    {\n      eigen_assert( (i>=0) && (\n          ((BlockRows==1) && (BlockCols==XprType::ColsAtCompileTime) && i<xpr.rows())\n        ||((BlockRows==XprType::RowsAtCompileTime) && (BlockCols==1) && i<xpr.cols())));\n    }\n\n    /** Fixed-size constructor\n      */\n    inline Block(XprType& xpr, Index a_startRow, Index a_startCol)\n      : Impl(xpr, a_startRow, a_startCol)\n    {\n      EIGEN_STATIC_ASSERT(RowsAtCompileTime!=Dynamic && ColsAtCompileTime!=Dynamic,THIS_METHOD_IS_ONLY_FOR_FIXED_SIZE)\n      eigen_assert(a_startRow >= 0 && BlockRows >= 1 && a_startRow + BlockRows <= xpr.rows()\n             && a_startCol >= 0 && BlockCols >= 1 && a_startCol + BlockCols <= xpr.cols());\n    }\n\n    /** Dynamic-size constructor\n      */\n    inline Block(XprType& xpr,\n          Index a_startRow, Index a_startCol,\n          Index blockRows, Index blockCols)\n      : Impl(xpr, a_startRow, a_startCol, blockRows, blockCols)\n    {\n      eigen_assert((RowsAtCompileTime==Dynamic || RowsAtCompileTime==blockRows)\n          && (ColsAtCompileTime==Dynamic || ColsAtCompileTime==blockCols));\n      eigen_assert(a_startRow >= 0 && blockRows >= 0 && a_startRow  <= xpr.rows() - blockRows\n          && a_startCol >= 0 && blockCols >= 0 && a_startCol <= xpr.cols() - blockCols);\n    }\n};\n         \n// The generic default implementation for dense block simplu forward to the internal::BlockImpl_dense\n// that must be specialized for direct and non-direct access...\ntemplate<typename XprType, int BlockRows, int BlockCols, bool InnerPanel>\nclass BlockImpl<XprType, BlockRows, BlockCols, InnerPanel, Dense>\n  : public internal::BlockImpl_dense<XprType, BlockRows, BlockCols, InnerPanel>\n{\n    typedef internal::BlockImpl_dense<XprType, BlockRows, BlockCols, InnerPanel> Impl;\n    typedef typename XprType::Index Index;\n  public:\n    typedef Impl Base;\n    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(BlockImpl)\n    inline BlockImpl(XprType& xpr, Index i) : Impl(xpr,i) {}\n    inline BlockImpl(XprType& xpr, Index a_startRow, Index a_startCol) : Impl(xpr, a_startRow, a_startCol) {}\n    inline BlockImpl(XprType& xpr, Index a_startRow, Index a_startCol, Index blockRows, Index blockCols)\n      : Impl(xpr, a_startRow, a_startCol, blockRows, blockCols) {}\n};\n\nnamespace internal {\n\n/** \\internal Internal implementation of dense Blocks in the general case. */\ntemplate<typename XprType, int BlockRows, int BlockCols, bool InnerPanel, bool HasDirectAccess> class BlockImpl_dense\n  : public internal::dense_xpr_base<Block<XprType, BlockRows, BlockCols, InnerPanel> >::type\n{\n    typedef Block<XprType, BlockRows, BlockCols, InnerPanel> BlockType;\n  public:\n\n    typedef typename internal::dense_xpr_base<BlockType>::type Base;\n    EIGEN_DENSE_PUBLIC_INTERFACE(BlockType)\n    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(BlockImpl_dense)\n\n    class InnerIterator;\n\n    /** Column or Row constructor\n      */\n    inline BlockImpl_dense(XprType& xpr, Index i)\n      : m_xpr(xpr),\n        // It is a row if and only if BlockRows==1 and BlockCols==XprType::ColsAtCompileTime,\n        // and it is a column if and only if BlockRows==XprType::RowsAtCompileTime and BlockCols==1,\n        // all other cases are invalid.\n        // The case a 1x1 matrix seems ambiguous, but the result is the same anyway.\n        m_startRow( (BlockRows==1) && (BlockCols==XprType::ColsAtCompileTime) ? i : 0),\n        m_startCol( (BlockRows==XprType::RowsAtCompileTime) && (BlockCols==1) ? i : 0),\n        m_blockRows(BlockRows==1 ? 1 : xpr.rows()),\n        m_blockCols(BlockCols==1 ? 1 : xpr.cols())\n    {}\n\n    /** Fixed-size constructor\n      */\n    inline BlockImpl_dense(XprType& xpr, Index a_startRow, Index a_startCol)\n      : m_xpr(xpr), m_startRow(a_startRow), m_startCol(a_startCol),\n                    m_blockRows(BlockRows), m_blockCols(BlockCols)\n    {}\n\n    /** Dynamic-size constructor\n      */\n    inline BlockImpl_dense(XprType& xpr,\n          Index a_startRow, Index a_startCol,\n          Index blockRows, Index blockCols)\n      : m_xpr(xpr), m_startRow(a_startRow), m_startCol(a_startCol),\n                    m_blockRows(blockRows), m_blockCols(blockCols)\n    {}\n\n    inline Index rows() const { return m_blockRows.value(); }\n    inline Index cols() const { return m_blockCols.value(); }\n\n    inline Scalar& coeffRef(Index rowId, Index colId)\n    {\n      EIGEN_STATIC_ASSERT_LVALUE(XprType)\n      return m_xpr.const_cast_derived()\n               .coeffRef(rowId + m_startRow.value(), colId + m_startCol.value());\n    }\n\n    inline const Scalar& coeffRef(Index rowId, Index colId) const\n    {\n      return m_xpr.derived()\n               .coeffRef(rowId + m_startRow.value(), colId + m_startCol.value());\n    }\n\n    EIGEN_STRONG_INLINE const CoeffReturnType coeff(Index rowId, Index colId) const\n    {\n      return m_xpr.coeff(rowId + m_startRow.value(), colId + m_startCol.value());\n    }\n\n    inline Scalar& coeffRef(Index index)\n    {\n      EIGEN_STATIC_ASSERT_LVALUE(XprType)\n      return m_xpr.const_cast_derived()\n             .coeffRef(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),\n                       m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0));\n    }\n\n    inline const Scalar& coeffRef(Index index) const\n    {\n      return m_xpr.const_cast_derived()\n             .coeffRef(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),\n                       m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0));\n    }\n\n    inline const CoeffReturnType coeff(Index index) const\n    {\n      return m_xpr\n             .coeff(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),\n                    m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0));\n    }\n\n    template<int LoadMode>\n    inline PacketScalar packet(Index rowId, Index colId) const\n    {\n      return m_xpr.template packet<Unaligned>\n              (rowId + m_startRow.value(), colId + m_startCol.value());\n    }\n\n    template<int LoadMode>\n    inline void writePacket(Index rowId, Index colId, const PacketScalar& val)\n    {\n      m_xpr.const_cast_derived().template writePacket<Unaligned>\n              (rowId + m_startRow.value(), colId + m_startCol.value(), val);\n    }\n\n    template<int LoadMode>\n    inline PacketScalar packet(Index index) const\n    {\n      return m_xpr.template packet<Unaligned>\n              (m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),\n               m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0));\n    }\n\n    template<int LoadMode>\n    inline void writePacket(Index index, const PacketScalar& val)\n    {\n      m_xpr.const_cast_derived().template writePacket<Unaligned>\n         (m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),\n          m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0), val);\n    }\n\n    #ifdef EIGEN_PARSED_BY_DOXYGEN\n    /** \\sa MapBase::data() */\n    inline const Scalar* data() const;\n    inline Index innerStride() const;\n    inline Index outerStride() const;\n    #endif\n\n    const typename internal::remove_all<typename XprType::Nested>::type& nestedExpression() const \n    { \n      return m_xpr; \n    }\n      \n    Index startRow() const \n    { \n      return m_startRow.value(); \n    }\n      \n    Index startCol() const \n    { \n      return m_startCol.value(); \n    }\n\n  protected:\n\n    const typename XprType::Nested m_xpr;\n    const internal::variable_if_dynamic<Index, XprType::RowsAtCompileTime == 1 ? 0 : Dynamic> m_startRow;\n    const internal::variable_if_dynamic<Index, XprType::ColsAtCompileTime == 1 ? 0 : Dynamic> m_startCol;\n    const internal::variable_if_dynamic<Index, RowsAtCompileTime> m_blockRows;\n    const internal::variable_if_dynamic<Index, ColsAtCompileTime> m_blockCols;\n};\n\n/** \\internal Internal implementation of dense Blocks in the direct access case.*/\ntemplate<typename XprType, int BlockRows, int BlockCols, bool InnerPanel>\nclass BlockImpl_dense<XprType,BlockRows,BlockCols, InnerPanel,true>\n  : public MapBase<Block<XprType, BlockRows, BlockCols, InnerPanel> >\n{\n    typedef Block<XprType, BlockRows, BlockCols, InnerPanel> BlockType;\n  public:\n\n    typedef MapBase<BlockType> Base;\n    EIGEN_DENSE_PUBLIC_INTERFACE(BlockType)\n    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(BlockImpl_dense)\n\n    /** Column or Row constructor\n      */\n    inline BlockImpl_dense(XprType& xpr, Index i)\n      : Base(internal::const_cast_ptr(&xpr.coeffRef(\n              (BlockRows==1) && (BlockCols==XprType::ColsAtCompileTime) ? i : 0,\n              (BlockRows==XprType::RowsAtCompileTime) && (BlockCols==1) ? i : 0)),\n             BlockRows==1 ? 1 : xpr.rows(),\n             BlockCols==1 ? 1 : xpr.cols()),\n        m_xpr(xpr)\n    {\n      init();\n    }\n\n    /** Fixed-size constructor\n      */\n    inline BlockImpl_dense(XprType& xpr, Index startRow, Index startCol)\n      : Base(internal::const_cast_ptr(&xpr.coeffRef(startRow,startCol))), m_xpr(xpr)\n    {\n      init();\n    }\n\n    /** Dynamic-size constructor\n      */\n    inline BlockImpl_dense(XprType& xpr,\n          Index startRow, Index startCol,\n          Index blockRows, Index blockCols)\n      : Base(internal::const_cast_ptr(&xpr.coeffRef(startRow,startCol)), blockRows, blockCols),\n        m_xpr(xpr)\n    {\n      init();\n    }\n\n    const typename internal::remove_all<typename XprType::Nested>::type& nestedExpression() const \n    { \n      return m_xpr; \n    }\n      \n    /** \\sa MapBase::innerStride() */\n    inline Index innerStride() const\n    {\n      return internal::traits<BlockType>::HasSameStorageOrderAsXprType\n             ? m_xpr.innerStride()\n             : m_xpr.outerStride();\n    }\n\n    /** \\sa MapBase::outerStride() */\n    inline Index outerStride() const\n    {\n      return m_outerStride;\n    }\n\n  #ifndef __SUNPRO_CC\n  // FIXME sunstudio is not friendly with the above friend...\n  // META-FIXME there is no 'friend' keyword around here. Is this obsolete?\n  protected:\n  #endif\n\n    #ifndef EIGEN_PARSED_BY_DOXYGEN\n    /** \\internal used by allowAligned() */\n    inline BlockImpl_dense(XprType& xpr, const Scalar* data, Index blockRows, Index blockCols)\n      : Base(data, blockRows, blockCols), m_xpr(xpr)\n    {\n      init();\n    }\n    #endif\n\n  protected:\n    void init()\n    {\n      m_outerStride = internal::traits<BlockType>::HasSameStorageOrderAsXprType\n                    ? m_xpr.outerStride()\n                    : m_xpr.innerStride();\n    }\n\n    typename XprType::Nested m_xpr;\n    Index m_outerStride;\n};\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_BLOCK_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/BooleanRedux.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_ALLANDANY_H\n#define EIGEN_ALLANDANY_H\n\nnamespace Eigen { \n\nnamespace internal {\n\ntemplate<typename Derived, int UnrollCount>\nstruct all_unroller\n{\n  enum {\n    col = (UnrollCount-1) / Derived::RowsAtCompileTime,\n    row = (UnrollCount-1) % Derived::RowsAtCompileTime\n  };\n\n  static inline bool run(const Derived &mat)\n  {\n    return all_unroller<Derived, UnrollCount-1>::run(mat) && mat.coeff(row, col);\n  }\n};\n\ntemplate<typename Derived>\nstruct all_unroller<Derived, 0>\n{\n  static inline bool run(const Derived &/*mat*/) { return true; }\n};\n\ntemplate<typename Derived>\nstruct all_unroller<Derived, Dynamic>\n{\n  static inline bool run(const Derived &) { return false; }\n};\n\ntemplate<typename Derived, int UnrollCount>\nstruct any_unroller\n{\n  enum {\n    col = (UnrollCount-1) / Derived::RowsAtCompileTime,\n    row = (UnrollCount-1) % Derived::RowsAtCompileTime\n  };\n\n  static inline bool run(const Derived &mat)\n  {\n    return any_unroller<Derived, UnrollCount-1>::run(mat) || mat.coeff(row, col);\n  }\n};\n\ntemplate<typename Derived>\nstruct any_unroller<Derived, 0>\n{\n  static inline bool run(const Derived & /*mat*/) { return false; }\n};\n\ntemplate<typename Derived>\nstruct any_unroller<Derived, Dynamic>\n{\n  static inline bool run(const Derived &) { return false; }\n};\n\n} // end namespace internal\n\n/** \\returns true if all coefficients are true\n  *\n  * Example: \\include MatrixBase_all.cpp\n  * Output: \\verbinclude MatrixBase_all.out\n  *\n  * \\sa any(), Cwise::operator<()\n  */\ntemplate<typename Derived>\ninline bool DenseBase<Derived>::all() const\n{\n  enum {\n    unroll = SizeAtCompileTime != Dynamic\n          && CoeffReadCost != Dynamic\n          && NumTraits<Scalar>::AddCost != Dynamic\n          && SizeAtCompileTime * (CoeffReadCost + NumTraits<Scalar>::AddCost) <= EIGEN_UNROLLING_LIMIT\n  };\n  if(unroll)\n    return internal::all_unroller<Derived, unroll ? int(SizeAtCompileTime) : Dynamic>::run(derived());\n  else\n  {\n    for(Index j = 0; j < cols(); ++j)\n      for(Index i = 0; i < rows(); ++i)\n        if (!coeff(i, j)) return false;\n    return true;\n  }\n}\n\n/** \\returns true if at least one coefficient is true\n  *\n  * \\sa all()\n  */\ntemplate<typename Derived>\ninline bool DenseBase<Derived>::any() const\n{\n  enum {\n    unroll = SizeAtCompileTime != Dynamic\n          && CoeffReadCost != Dynamic\n          && NumTraits<Scalar>::AddCost != Dynamic\n          && SizeAtCompileTime * (CoeffReadCost + NumTraits<Scalar>::AddCost) <= EIGEN_UNROLLING_LIMIT\n  };\n  if(unroll)\n    return internal::any_unroller<Derived, unroll ? int(SizeAtCompileTime) : Dynamic>::run(derived());\n  else\n  {\n    for(Index j = 0; j < cols(); ++j)\n      for(Index i = 0; i < rows(); ++i)\n        if (coeff(i, j)) return true;\n    return false;\n  }\n}\n\n/** \\returns the number of coefficients which evaluate to true\n  *\n  * \\sa all(), any()\n  */\ntemplate<typename Derived>\ninline typename DenseBase<Derived>::Index DenseBase<Derived>::count() const\n{\n  return derived().template cast<bool>().template cast<Index>().sum();\n}\n\n/** \\returns true is \\c *this contains at least one Not A Number (NaN).\n  *\n  * \\sa allFinite()\n  */\ntemplate<typename Derived>\ninline bool DenseBase<Derived>::hasNaN() const\n{\n  return !((derived().array()==derived().array()).all());\n}\n\n/** \\returns true if \\c *this contains only finite numbers, i.e., no NaN and no +/-INF values.\n  *\n  * \\sa hasNaN()\n  */\ntemplate<typename Derived>\ninline bool DenseBase<Derived>::allFinite() const\n{\n  return !((derived()-derived()).hasNaN());\n}\n    \n} // end namespace Eigen\n\n#endif // EIGEN_ALLANDANY_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_Core_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_Core_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/Core COMPONENT Devel\n  )\n\nADD_SUBDIRECTORY(products)\nADD_SUBDIRECTORY(util)\nADD_SUBDIRECTORY(arch)\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/CommaInitializer.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_COMMAINITIALIZER_H\n#define EIGEN_COMMAINITIALIZER_H\n\nnamespace Eigen { \n\n/** \\class CommaInitializer\n  * \\ingroup Core_Module\n  *\n  * \\brief Helper class used by the comma initializer operator\n  *\n  * This class is internally used to implement the comma initializer feature. It is\n  * the return type of MatrixBase::operator<<, and most of the time this is the only\n  * way it is used.\n  *\n  * \\sa \\ref MatrixBaseCommaInitRef \"MatrixBase::operator<<\", CommaInitializer::finished()\n  */\ntemplate<typename XprType>\nstruct CommaInitializer\n{\n  typedef typename XprType::Scalar Scalar;\n  typedef typename XprType::Index Index;\n\n  inline CommaInitializer(XprType& xpr, const Scalar& s)\n    : m_xpr(xpr), m_row(0), m_col(1), m_currentBlockRows(1)\n  {\n    m_xpr.coeffRef(0,0) = s;\n  }\n\n  template<typename OtherDerived>\n  inline CommaInitializer(XprType& xpr, const DenseBase<OtherDerived>& other)\n    : m_xpr(xpr), m_row(0), m_col(other.cols()), m_currentBlockRows(other.rows())\n  {\n    m_xpr.block(0, 0, other.rows(), other.cols()) = other;\n  }\n\n  /* Copy/Move constructor which transfers ownership. This is crucial in \n   * absence of return value optimization to avoid assertions during destruction. */\n  // FIXME in C++11 mode this could be replaced by a proper RValue constructor\n  inline CommaInitializer(const CommaInitializer& o)\n  : m_xpr(o.m_xpr), m_row(o.m_row), m_col(o.m_col), m_currentBlockRows(o.m_currentBlockRows) {\n    // Mark original object as finished. In absence of R-value references we need to const_cast:\n    const_cast<CommaInitializer&>(o).m_row = m_xpr.rows();\n    const_cast<CommaInitializer&>(o).m_col = m_xpr.cols();\n    const_cast<CommaInitializer&>(o).m_currentBlockRows = 0;\n  }\n\n  /* inserts a scalar value in the target matrix */\n  CommaInitializer& operator,(const Scalar& s)\n  {\n    if (m_col==m_xpr.cols())\n    {\n      m_row+=m_currentBlockRows;\n      m_col = 0;\n      m_currentBlockRows = 1;\n      eigen_assert(m_row<m_xpr.rows()\n        && \"Too many rows passed to comma initializer (operator<<)\");\n    }\n    eigen_assert(m_col<m_xpr.cols()\n      && \"Too many coefficients passed to comma initializer (operator<<)\");\n    eigen_assert(m_currentBlockRows==1);\n    m_xpr.coeffRef(m_row, m_col++) = s;\n    return *this;\n  }\n\n  /* inserts a matrix expression in the target matrix */\n  template<typename OtherDerived>\n  CommaInitializer& operator,(const DenseBase<OtherDerived>& other)\n  {\n    if(other.rows()==0)\n    {\n      m_col += other.cols();\n      return *this;\n    }\n    if (m_col==m_xpr.cols())\n    {\n      m_row+=m_currentBlockRows;\n      m_col = 0;\n      m_currentBlockRows = other.rows();\n      eigen_assert(m_row+m_currentBlockRows<=m_xpr.rows()\n        && \"Too many rows passed to comma initializer (operator<<)\");\n    }\n    eigen_assert((m_col<m_xpr.cols() || (m_xpr.cols()==0 && m_col==0))\n      && \"Too many coefficients passed to comma initializer (operator<<)\");\n    eigen_assert(m_currentBlockRows==other.rows());\n    if (OtherDerived::SizeAtCompileTime != Dynamic)\n      m_xpr.template block<OtherDerived::RowsAtCompileTime != Dynamic ? OtherDerived::RowsAtCompileTime : 1,\n                              OtherDerived::ColsAtCompileTime != Dynamic ? OtherDerived::ColsAtCompileTime : 1>\n                    (m_row, m_col) = other;\n    else\n      m_xpr.block(m_row, m_col, other.rows(), other.cols()) = other;\n    m_col += other.cols();\n    return *this;\n  }\n\n  inline ~CommaInitializer()\n  {\n    eigen_assert((m_row+m_currentBlockRows) == m_xpr.rows()\n         && m_col == m_xpr.cols()\n         && \"Too few coefficients passed to comma initializer (operator<<)\");\n  }\n\n  /** \\returns the built matrix once all its coefficients have been set.\n    * Calling finished is 100% optional. Its purpose is to write expressions\n    * like this:\n    * \\code\n    * quaternion.fromRotationMatrix((Matrix3f() << axis0, axis1, axis2).finished());\n    * \\endcode\n    */\n  inline XprType& finished() { return m_xpr; }\n\n  XprType& m_xpr;   // target expression\n  Index m_row;              // current row id\n  Index m_col;              // current col id\n  Index m_currentBlockRows; // current block height\n};\n\n/** \\anchor MatrixBaseCommaInitRef\n  * Convenient operator to set the coefficients of a matrix.\n  *\n  * The coefficients must be provided in a row major order and exactly match\n  * the size of the matrix. Otherwise an assertion is raised.\n  *\n  * Example: \\include MatrixBase_set.cpp\n  * Output: \\verbinclude MatrixBase_set.out\n  * \n  * \\note According the c++ standard, the argument expressions of this comma initializer are evaluated in arbitrary order.\n  *\n  * \\sa CommaInitializer::finished(), class CommaInitializer\n  */\ntemplate<typename Derived>\ninline CommaInitializer<Derived> DenseBase<Derived>::operator<< (const Scalar& s)\n{\n  return CommaInitializer<Derived>(*static_cast<Derived*>(this), s);\n}\n\n/** \\sa operator<<(const Scalar&) */\ntemplate<typename Derived>\ntemplate<typename OtherDerived>\ninline CommaInitializer<Derived>\nDenseBase<Derived>::operator<<(const DenseBase<OtherDerived>& other)\n{\n  return CommaInitializer<Derived>(*static_cast<Derived *>(this), other);\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_COMMAINITIALIZER_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/CoreIterators.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_COREITERATORS_H\n#define EIGEN_COREITERATORS_H\n\nnamespace Eigen { \n\n/* This file contains the respective InnerIterator definition of the expressions defined in Eigen/Core\n */\n\n/** \\ingroup SparseCore_Module\n  * \\class InnerIterator\n  * \\brief An InnerIterator allows to loop over the element of a sparse (or dense) matrix or expression\n  *\n  * todo\n  */\n\n// generic version for dense matrix and expressions\ntemplate<typename Derived> class DenseBase<Derived>::InnerIterator\n{\n  protected:\n    typedef typename Derived::Scalar Scalar;\n    typedef typename Derived::Index Index;\n\n    enum { IsRowMajor = (Derived::Flags&RowMajorBit)==RowMajorBit };\n  public:\n    EIGEN_STRONG_INLINE InnerIterator(const Derived& expr, Index outer)\n      : m_expression(expr), m_inner(0), m_outer(outer), m_end(expr.innerSize())\n    {}\n\n    EIGEN_STRONG_INLINE Scalar value() const\n    {\n      return (IsRowMajor) ? m_expression.coeff(m_outer, m_inner)\n                          : m_expression.coeff(m_inner, m_outer);\n    }\n\n    EIGEN_STRONG_INLINE InnerIterator& operator++() { m_inner++; return *this; }\n\n    EIGEN_STRONG_INLINE Index index() const { return m_inner; }\n    inline Index row() const { return IsRowMajor ? m_outer : index(); }\n    inline Index col() const { return IsRowMajor ? index() : m_outer; }\n\n    EIGEN_STRONG_INLINE operator bool() const { return m_inner < m_end && m_inner>=0; }\n\n  protected:\n    const Derived& m_expression;\n    Index m_inner;\n    const Index m_outer;\n    const Index m_end;\n};\n\n} // end namespace Eigen\n\n#endif // EIGEN_COREITERATORS_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/CwiseBinaryOp.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_CWISE_BINARY_OP_H\n#define EIGEN_CWISE_BINARY_OP_H\n\nnamespace Eigen {\n\n/** \\class CwiseBinaryOp\n  * \\ingroup Core_Module\n  *\n  * \\brief Generic expression where a coefficient-wise binary operator is applied to two expressions\n  *\n  * \\param BinaryOp template functor implementing the operator\n  * \\param Lhs the type of the left-hand side\n  * \\param Rhs the type of the right-hand side\n  *\n  * This class represents an expression  where a coefficient-wise binary operator is applied to two expressions.\n  * It is the return type of binary operators, by which we mean only those binary operators where\n  * both the left-hand side and the right-hand side are Eigen expressions.\n  * For example, the return type of matrix1+matrix2 is a CwiseBinaryOp.\n  *\n  * Most of the time, this is the only way that it is used, so you typically don't have to name\n  * CwiseBinaryOp types explicitly.\n  *\n  * \\sa MatrixBase::binaryExpr(const MatrixBase<OtherDerived> &,const CustomBinaryOp &) const, class CwiseUnaryOp, class CwiseNullaryOp\n  */\n\nnamespace internal {\ntemplate<typename BinaryOp, typename Lhs, typename Rhs>\nstruct traits<CwiseBinaryOp<BinaryOp, Lhs, Rhs> >\n{\n  // we must not inherit from traits<Lhs> since it has\n  // the potential to cause problems with MSVC\n  typedef typename remove_all<Lhs>::type Ancestor;\n  typedef typename traits<Ancestor>::XprKind XprKind;\n  enum {\n    RowsAtCompileTime = traits<Ancestor>::RowsAtCompileTime,\n    ColsAtCompileTime = traits<Ancestor>::ColsAtCompileTime,\n    MaxRowsAtCompileTime = traits<Ancestor>::MaxRowsAtCompileTime,\n    MaxColsAtCompileTime = traits<Ancestor>::MaxColsAtCompileTime\n  };\n\n  // even though we require Lhs and Rhs to have the same scalar type (see CwiseBinaryOp constructor),\n  // we still want to handle the case when the result type is different.\n  typedef typename result_of<\n                     BinaryOp(\n                       typename Lhs::Scalar,\n                       typename Rhs::Scalar\n                     )\n                   >::type Scalar;\n  typedef typename promote_storage_type<typename traits<Lhs>::StorageKind,\n                                           typename traits<Rhs>::StorageKind>::ret StorageKind;\n  typedef typename promote_index_type<typename traits<Lhs>::Index,\n                                         typename traits<Rhs>::Index>::type Index;\n  typedef typename Lhs::Nested LhsNested;\n  typedef typename Rhs::Nested RhsNested;\n  typedef typename remove_reference<LhsNested>::type _LhsNested;\n  typedef typename remove_reference<RhsNested>::type _RhsNested;\n  enum {\n    LhsCoeffReadCost = _LhsNested::CoeffReadCost,\n    RhsCoeffReadCost = _RhsNested::CoeffReadCost,\n    LhsFlags = _LhsNested::Flags,\n    RhsFlags = _RhsNested::Flags,\n    SameType = is_same<typename _LhsNested::Scalar,typename _RhsNested::Scalar>::value,\n    StorageOrdersAgree = (int(Lhs::Flags)&RowMajorBit)==(int(Rhs::Flags)&RowMajorBit),\n    Flags0 = (int(LhsFlags) | int(RhsFlags)) & (\n        HereditaryBits\n      | (int(LhsFlags) & int(RhsFlags) &\n           ( AlignedBit\n           | (StorageOrdersAgree ? LinearAccessBit : 0)\n           | (functor_traits<BinaryOp>::PacketAccess && StorageOrdersAgree && SameType ? PacketAccessBit : 0)\n           )\n        )\n     ),\n    Flags = (Flags0 & ~RowMajorBit) | (LhsFlags & RowMajorBit),\n    Cost0 = EIGEN_ADD_COST(LhsCoeffReadCost,RhsCoeffReadCost),\n    CoeffReadCost = EIGEN_ADD_COST(Cost0,functor_traits<BinaryOp>::Cost)\n  };\n};\n} // end namespace internal\n\n// we require Lhs and Rhs to have the same scalar type. Currently there is no example of a binary functor\n// that would take two operands of different types. If there were such an example, then this check should be\n// moved to the BinaryOp functors, on a per-case basis. This would however require a change in the BinaryOp functors, as\n// currently they take only one typename Scalar template parameter.\n// It is tempting to always allow mixing different types but remember that this is often impossible in the vectorized paths.\n// So allowing mixing different types gives very unexpected errors when enabling vectorization, when the user tries to\n// add together a float matrix and a double matrix.\n#define EIGEN_CHECK_BINARY_COMPATIBILIY(BINOP,LHS,RHS) \\\n  EIGEN_STATIC_ASSERT((internal::functor_is_product_like<BINOP>::ret \\\n                        ? int(internal::scalar_product_traits<LHS, RHS>::Defined) \\\n                        : int(internal::is_same<LHS, RHS>::value)), \\\n    YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)\n\ntemplate<typename BinaryOp, typename Lhs, typename Rhs, typename StorageKind>\nclass CwiseBinaryOpImpl;\n\ntemplate<typename BinaryOp, typename Lhs, typename Rhs>\nclass CwiseBinaryOp : internal::no_assignment_operator,\n  public CwiseBinaryOpImpl<\n          BinaryOp, Lhs, Rhs,\n          typename internal::promote_storage_type<typename internal::traits<Lhs>::StorageKind,\n                                           typename internal::traits<Rhs>::StorageKind>::ret>\n{\n  public:\n\n    typedef typename CwiseBinaryOpImpl<\n        BinaryOp, Lhs, Rhs,\n        typename internal::promote_storage_type<typename internal::traits<Lhs>::StorageKind,\n                                         typename internal::traits<Rhs>::StorageKind>::ret>::Base Base;\n    EIGEN_GENERIC_PUBLIC_INTERFACE(CwiseBinaryOp)\n\n    typedef typename internal::nested<Lhs>::type LhsNested;\n    typedef typename internal::nested<Rhs>::type RhsNested;\n    typedef typename internal::remove_reference<LhsNested>::type _LhsNested;\n    typedef typename internal::remove_reference<RhsNested>::type _RhsNested;\n\n    EIGEN_STRONG_INLINE CwiseBinaryOp(const Lhs& aLhs, const Rhs& aRhs, const BinaryOp& func = BinaryOp())\n      : m_lhs(aLhs), m_rhs(aRhs), m_functor(func)\n    {\n      EIGEN_CHECK_BINARY_COMPATIBILIY(BinaryOp,typename Lhs::Scalar,typename Rhs::Scalar);\n      // require the sizes to match\n      EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(Lhs, Rhs)\n      eigen_assert(aLhs.rows() == aRhs.rows() && aLhs.cols() == aRhs.cols());\n    }\n\n    EIGEN_STRONG_INLINE Index rows() const {\n      // return the fixed size type if available to enable compile time optimizations\n      if (internal::traits<typename internal::remove_all<LhsNested>::type>::RowsAtCompileTime==Dynamic)\n        return m_rhs.rows();\n      else\n        return m_lhs.rows();\n    }\n    EIGEN_STRONG_INLINE Index cols() const {\n      // return the fixed size type if available to enable compile time optimizations\n      if (internal::traits<typename internal::remove_all<LhsNested>::type>::ColsAtCompileTime==Dynamic)\n        return m_rhs.cols();\n      else\n        return m_lhs.cols();\n    }\n\n    /** \\returns the left hand side nested expression */\n    const _LhsNested& lhs() const { return m_lhs; }\n    /** \\returns the right hand side nested expression */\n    const _RhsNested& rhs() const { return m_rhs; }\n    /** \\returns the functor representing the binary operation */\n    const BinaryOp& functor() const { return m_functor; }\n\n  protected:\n    LhsNested m_lhs;\n    RhsNested m_rhs;\n    const BinaryOp m_functor;\n};\n\ntemplate<typename BinaryOp, typename Lhs, typename Rhs>\nclass CwiseBinaryOpImpl<BinaryOp, Lhs, Rhs, Dense>\n  : public internal::dense_xpr_base<CwiseBinaryOp<BinaryOp, Lhs, Rhs> >::type\n{\n    typedef CwiseBinaryOp<BinaryOp, Lhs, Rhs> Derived;\n  public:\n\n    typedef typename internal::dense_xpr_base<CwiseBinaryOp<BinaryOp, Lhs, Rhs> >::type Base;\n    EIGEN_DENSE_PUBLIC_INTERFACE( Derived )\n\n    EIGEN_STRONG_INLINE const Scalar coeff(Index rowId, Index colId) const\n    {\n      return derived().functor()(derived().lhs().coeff(rowId, colId),\n                                 derived().rhs().coeff(rowId, colId));\n    }\n\n    template<int LoadMode>\n    EIGEN_STRONG_INLINE PacketScalar packet(Index rowId, Index colId) const\n    {\n      return derived().functor().packetOp(derived().lhs().template packet<LoadMode>(rowId, colId),\n                                          derived().rhs().template packet<LoadMode>(rowId, colId));\n    }\n\n    EIGEN_STRONG_INLINE const Scalar coeff(Index index) const\n    {\n      return derived().functor()(derived().lhs().coeff(index),\n                                 derived().rhs().coeff(index));\n    }\n\n    template<int LoadMode>\n    EIGEN_STRONG_INLINE PacketScalar packet(Index index) const\n    {\n      return derived().functor().packetOp(derived().lhs().template packet<LoadMode>(index),\n                                          derived().rhs().template packet<LoadMode>(index));\n    }\n};\n\n/** replaces \\c *this by \\c *this - \\a other.\n  *\n  * \\returns a reference to \\c *this\n  */\ntemplate<typename Derived>\ntemplate<typename OtherDerived>\nEIGEN_STRONG_INLINE Derived &\nMatrixBase<Derived>::operator-=(const MatrixBase<OtherDerived> &other)\n{\n  SelfCwiseBinaryOp<internal::scalar_difference_op<Scalar>, Derived, OtherDerived> tmp(derived());\n  tmp = other.derived();\n  return derived();\n}\n\n/** replaces \\c *this by \\c *this + \\a other.\n  *\n  * \\returns a reference to \\c *this\n  */\ntemplate<typename Derived>\ntemplate<typename OtherDerived>\nEIGEN_STRONG_INLINE Derived &\nMatrixBase<Derived>::operator+=(const MatrixBase<OtherDerived>& other)\n{\n  SelfCwiseBinaryOp<internal::scalar_sum_op<Scalar>, Derived, OtherDerived> tmp(derived());\n  tmp = other.derived();\n  return derived();\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_CWISE_BINARY_OP_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/CwiseNullaryOp.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_CWISE_NULLARY_OP_H\n#define EIGEN_CWISE_NULLARY_OP_H\n\nnamespace Eigen {\n\n/** \\class CwiseNullaryOp\n  * \\ingroup Core_Module\n  *\n  * \\brief Generic expression of a matrix where all coefficients are defined by a functor\n  *\n  * \\param NullaryOp template functor implementing the operator\n  * \\param PlainObjectType the underlying plain matrix/array type\n  *\n  * This class represents an expression of a generic nullary operator.\n  * It is the return type of the Ones(), Zero(), Constant(), Identity() and Random() methods,\n  * and most of the time this is the only way it is used.\n  *\n  * However, if you want to write a function returning such an expression, you\n  * will need to use this class.\n  *\n  * \\sa class CwiseUnaryOp, class CwiseBinaryOp, DenseBase::NullaryExpr()\n  */\n\nnamespace internal {\ntemplate<typename NullaryOp, typename PlainObjectType>\nstruct traits<CwiseNullaryOp<NullaryOp, PlainObjectType> > : traits<PlainObjectType>\n{\n  enum {\n    Flags = (traits<PlainObjectType>::Flags\n      & (  HereditaryBits\n         | (functor_has_linear_access<NullaryOp>::ret ? LinearAccessBit : 0)\n         | (functor_traits<NullaryOp>::PacketAccess ? PacketAccessBit : 0)))\n      | (functor_traits<NullaryOp>::IsRepeatable ? 0 : EvalBeforeNestingBit),\n    CoeffReadCost = functor_traits<NullaryOp>::Cost\n  };\n};\n}\n\ntemplate<typename NullaryOp, typename PlainObjectType>\nclass CwiseNullaryOp : internal::no_assignment_operator,\n  public internal::dense_xpr_base< CwiseNullaryOp<NullaryOp, PlainObjectType> >::type\n{\n  public:\n\n    typedef typename internal::dense_xpr_base<CwiseNullaryOp>::type Base;\n    EIGEN_DENSE_PUBLIC_INTERFACE(CwiseNullaryOp)\n\n    CwiseNullaryOp(Index nbRows, Index nbCols, const NullaryOp& func = NullaryOp())\n      : m_rows(nbRows), m_cols(nbCols), m_functor(func)\n    {\n      eigen_assert(nbRows >= 0\n            && (RowsAtCompileTime == Dynamic || RowsAtCompileTime == nbRows)\n            &&  nbCols >= 0\n            && (ColsAtCompileTime == Dynamic || ColsAtCompileTime == nbCols));\n    }\n\n    EIGEN_STRONG_INLINE Index rows() const { return m_rows.value(); }\n    EIGEN_STRONG_INLINE Index cols() const { return m_cols.value(); }\n\n    EIGEN_STRONG_INLINE const Scalar coeff(Index rowId, Index colId) const\n    {\n      return m_functor(rowId, colId);\n    }\n\n    template<int LoadMode>\n    EIGEN_STRONG_INLINE PacketScalar packet(Index rowId, Index colId) const\n    {\n      return m_functor.packetOp(rowId, colId);\n    }\n\n    EIGEN_STRONG_INLINE const Scalar coeff(Index index) const\n    {\n      return m_functor(index);\n    }\n\n    template<int LoadMode>\n    EIGEN_STRONG_INLINE PacketScalar packet(Index index) const\n    {\n      return m_functor.packetOp(index);\n    }\n\n    /** \\returns the functor representing the nullary operation */\n    const NullaryOp& functor() const { return m_functor; }\n\n  protected:\n    const internal::variable_if_dynamic<Index, RowsAtCompileTime> m_rows;\n    const internal::variable_if_dynamic<Index, ColsAtCompileTime> m_cols;\n    const NullaryOp m_functor;\n};\n\n\n/** \\returns an expression of a matrix defined by a custom functor \\a func\n  *\n  * The parameters \\a rows and \\a cols are the number of rows and of columns of\n  * the returned matrix. Must be compatible with this MatrixBase type.\n  *\n  * This variant is meant to be used for dynamic-size matrix types. For fixed-size types,\n  * it is redundant to pass \\a rows and \\a cols as arguments, so Zero() should be used\n  * instead.\n  *\n  * The template parameter \\a CustomNullaryOp is the type of the functor.\n  *\n  * \\sa class CwiseNullaryOp\n  */\ntemplate<typename Derived>\ntemplate<typename CustomNullaryOp>\nEIGEN_STRONG_INLINE const CwiseNullaryOp<CustomNullaryOp, Derived>\nDenseBase<Derived>::NullaryExpr(Index rows, Index cols, const CustomNullaryOp& func)\n{\n  return CwiseNullaryOp<CustomNullaryOp, Derived>(rows, cols, func);\n}\n\n/** \\returns an expression of a matrix defined by a custom functor \\a func\n  *\n  * The parameter \\a size is the size of the returned vector.\n  * Must be compatible with this MatrixBase type.\n  *\n  * \\only_for_vectors\n  *\n  * This variant is meant to be used for dynamic-size vector types. For fixed-size types,\n  * it is redundant to pass \\a size as argument, so Zero() should be used\n  * instead.\n  *\n  * The template parameter \\a CustomNullaryOp is the type of the functor.\n  *\n  * \\sa class CwiseNullaryOp\n  */\ntemplate<typename Derived>\ntemplate<typename CustomNullaryOp>\nEIGEN_STRONG_INLINE const CwiseNullaryOp<CustomNullaryOp, Derived>\nDenseBase<Derived>::NullaryExpr(Index size, const CustomNullaryOp& func)\n{\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)\n  if(RowsAtCompileTime == 1) return CwiseNullaryOp<CustomNullaryOp, Derived>(1, size, func);\n  else return CwiseNullaryOp<CustomNullaryOp, Derived>(size, 1, func);\n}\n\n/** \\returns an expression of a matrix defined by a custom functor \\a func\n  *\n  * This variant is only for fixed-size DenseBase types. For dynamic-size types, you\n  * need to use the variants taking size arguments.\n  *\n  * The template parameter \\a CustomNullaryOp is the type of the functor.\n  *\n  * \\sa class CwiseNullaryOp\n  */\ntemplate<typename Derived>\ntemplate<typename CustomNullaryOp>\nEIGEN_STRONG_INLINE const CwiseNullaryOp<CustomNullaryOp, Derived>\nDenseBase<Derived>::NullaryExpr(const CustomNullaryOp& func)\n{\n  return CwiseNullaryOp<CustomNullaryOp, Derived>(RowsAtCompileTime, ColsAtCompileTime, func);\n}\n\n/** \\returns an expression of a constant matrix of value \\a value\n  *\n  * The parameters \\a nbRows and \\a nbCols are the number of rows and of columns of\n  * the returned matrix. Must be compatible with this DenseBase type.\n  *\n  * This variant is meant to be used for dynamic-size matrix types. For fixed-size types,\n  * it is redundant to pass \\a nbRows and \\a nbCols as arguments, so Zero() should be used\n  * instead.\n  *\n  * The template parameter \\a CustomNullaryOp is the type of the functor.\n  *\n  * \\sa class CwiseNullaryOp\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType\nDenseBase<Derived>::Constant(Index nbRows, Index nbCols, const Scalar& value)\n{\n  return DenseBase<Derived>::NullaryExpr(nbRows, nbCols, internal::scalar_constant_op<Scalar>(value));\n}\n\n/** \\returns an expression of a constant matrix of value \\a value\n  *\n  * The parameter \\a size is the size of the returned vector.\n  * Must be compatible with this DenseBase type.\n  *\n  * \\only_for_vectors\n  *\n  * This variant is meant to be used for dynamic-size vector types. For fixed-size types,\n  * it is redundant to pass \\a size as argument, so Zero() should be used\n  * instead.\n  *\n  * The template parameter \\a CustomNullaryOp is the type of the functor.\n  *\n  * \\sa class CwiseNullaryOp\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType\nDenseBase<Derived>::Constant(Index size, const Scalar& value)\n{\n  return DenseBase<Derived>::NullaryExpr(size, internal::scalar_constant_op<Scalar>(value));\n}\n\n/** \\returns an expression of a constant matrix of value \\a value\n  *\n  * This variant is only for fixed-size DenseBase types. For dynamic-size types, you\n  * need to use the variants taking size arguments.\n  *\n  * The template parameter \\a CustomNullaryOp is the type of the functor.\n  *\n  * \\sa class CwiseNullaryOp\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType\nDenseBase<Derived>::Constant(const Scalar& value)\n{\n  EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)\n  return DenseBase<Derived>::NullaryExpr(RowsAtCompileTime, ColsAtCompileTime, internal::scalar_constant_op<Scalar>(value));\n}\n\n/**\n  * \\brief Sets a linearly space vector.\n  *\n  * The function generates 'size' equally spaced values in the closed interval [low,high].\n  * This particular version of LinSpaced() uses sequential access, i.e. vector access is\n  * assumed to be a(0), a(1), ..., a(size). This assumption allows for better vectorization\n  * and yields faster code than the random access version.\n  *\n  * When size is set to 1, a vector of length 1 containing 'high' is returned.\n  *\n  * \\only_for_vectors\n  *\n  * Example: \\include DenseBase_LinSpaced_seq.cpp\n  * Output: \\verbinclude DenseBase_LinSpaced_seq.out\n  *\n  * \\sa setLinSpaced(Index,const Scalar&,const Scalar&), LinSpaced(Index,Scalar,Scalar), CwiseNullaryOp\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE const typename DenseBase<Derived>::SequentialLinSpacedReturnType\nDenseBase<Derived>::LinSpaced(Sequential_t, Index size, const Scalar& low, const Scalar& high)\n{\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)\n  return DenseBase<Derived>::NullaryExpr(size, internal::linspaced_op<Scalar,false>(low,high,size));\n}\n\n/**\n  * \\copydoc DenseBase::LinSpaced(Sequential_t, Index, const Scalar&, const Scalar&)\n  * Special version for fixed size types which does not require the size parameter.\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE const typename DenseBase<Derived>::SequentialLinSpacedReturnType\nDenseBase<Derived>::LinSpaced(Sequential_t, const Scalar& low, const Scalar& high)\n{\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)\n  EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)\n  return DenseBase<Derived>::NullaryExpr(Derived::SizeAtCompileTime, internal::linspaced_op<Scalar,false>(low,high,Derived::SizeAtCompileTime));\n}\n\n/**\n  * \\brief Sets a linearly space vector.\n  *\n  * The function generates 'size' equally spaced values in the closed interval [low,high].\n  * When size is set to 1, a vector of length 1 containing 'high' is returned.\n  *\n  * \\only_for_vectors\n  *\n  * Example: \\include DenseBase_LinSpaced.cpp\n  * Output: \\verbinclude DenseBase_LinSpaced.out\n  *\n  * \\sa setLinSpaced(Index,const Scalar&,const Scalar&), LinSpaced(Sequential_t,Index,const Scalar&,const Scalar&,Index), CwiseNullaryOp\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE const typename DenseBase<Derived>::RandomAccessLinSpacedReturnType\nDenseBase<Derived>::LinSpaced(Index size, const Scalar& low, const Scalar& high)\n{\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)\n  return DenseBase<Derived>::NullaryExpr(size, internal::linspaced_op<Scalar,true>(low,high,size));\n}\n\n/**\n  * \\copydoc DenseBase::LinSpaced(Index, const Scalar&, const Scalar&)\n  * Special version for fixed size types which does not require the size parameter.\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE const typename DenseBase<Derived>::RandomAccessLinSpacedReturnType\nDenseBase<Derived>::LinSpaced(const Scalar& low, const Scalar& high)\n{\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)\n  EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)\n  return DenseBase<Derived>::NullaryExpr(Derived::SizeAtCompileTime, internal::linspaced_op<Scalar,true>(low,high,Derived::SizeAtCompileTime));\n}\n\n/** \\returns true if all coefficients in this matrix are approximately equal to \\a val, to within precision \\a prec */\ntemplate<typename Derived>\nbool DenseBase<Derived>::isApproxToConstant\n(const Scalar& val, const RealScalar& prec) const\n{\n  for(Index j = 0; j < cols(); ++j)\n    for(Index i = 0; i < rows(); ++i)\n      if(!internal::isApprox(this->coeff(i, j), val, prec))\n        return false;\n  return true;\n}\n\n/** This is just an alias for isApproxToConstant().\n  *\n  * \\returns true if all coefficients in this matrix are approximately equal to \\a value, to within precision \\a prec */\ntemplate<typename Derived>\nbool DenseBase<Derived>::isConstant\n(const Scalar& val, const RealScalar& prec) const\n{\n  return isApproxToConstant(val, prec);\n}\n\n/** Alias for setConstant(): sets all coefficients in this expression to \\a val.\n  *\n  * \\sa setConstant(), Constant(), class CwiseNullaryOp\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE void DenseBase<Derived>::fill(const Scalar& val)\n{\n  setConstant(val);\n}\n\n/** Sets all coefficients in this expression to \\a value.\n  *\n  * \\sa fill(), setConstant(Index,const Scalar&), setConstant(Index,Index,const Scalar&), setZero(), setOnes(), Constant(), class CwiseNullaryOp, setZero(), setOnes()\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setConstant(const Scalar& val)\n{\n  return derived() = Constant(rows(), cols(), val);\n}\n\n/** Resizes to the given \\a size, and sets all coefficients in this expression to the given \\a value.\n  *\n  * \\only_for_vectors\n  *\n  * Example: \\include Matrix_setConstant_int.cpp\n  * Output: \\verbinclude Matrix_setConstant_int.out\n  *\n  * \\sa MatrixBase::setConstant(const Scalar&), setConstant(Index,Index,const Scalar&), class CwiseNullaryOp, MatrixBase::Constant(const Scalar&)\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE Derived&\nPlainObjectBase<Derived>::setConstant(Index size, const Scalar& val)\n{\n  resize(size);\n  return setConstant(val);\n}\n\n/** Resizes to the given size, and sets all coefficients in this expression to the given \\a value.\n  *\n  * \\param nbRows the new number of rows\n  * \\param nbCols the new number of columns\n  * \\param val the value to which all coefficients are set\n  *\n  * Example: \\include Matrix_setConstant_int_int.cpp\n  * Output: \\verbinclude Matrix_setConstant_int_int.out\n  *\n  * \\sa MatrixBase::setConstant(const Scalar&), setConstant(Index,const Scalar&), class CwiseNullaryOp, MatrixBase::Constant(const Scalar&)\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE Derived&\nPlainObjectBase<Derived>::setConstant(Index nbRows, Index nbCols, const Scalar& val)\n{\n  resize(nbRows, nbCols);\n  return setConstant(val);\n}\n\n/**\n  * \\brief Sets a linearly space vector.\n  *\n  * The function generates 'size' equally spaced values in the closed interval [low,high].\n  * When size is set to 1, a vector of length 1 containing 'high' is returned.\n  *\n  * \\only_for_vectors\n  *\n  * Example: \\include DenseBase_setLinSpaced.cpp\n  * Output: \\verbinclude DenseBase_setLinSpaced.out\n  *\n  * \\sa CwiseNullaryOp\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setLinSpaced(Index newSize, const Scalar& low, const Scalar& high)\n{\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)\n  return derived() = Derived::NullaryExpr(newSize, internal::linspaced_op<Scalar,false>(low,high,newSize));\n}\n\n/**\n  * \\brief Sets a linearly space vector.\n  *\n  * The function fill *this with equally spaced values in the closed interval [low,high].\n  * When size is set to 1, a vector of length 1 containing 'high' is returned.\n  *\n  * \\only_for_vectors\n  *\n  * \\sa setLinSpaced(Index, const Scalar&, const Scalar&), CwiseNullaryOp\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setLinSpaced(const Scalar& low, const Scalar& high)\n{\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)\n  return setLinSpaced(size(), low, high);\n}\n\n// zero:\n\n/** \\returns an expression of a zero matrix.\n  *\n  * The parameters \\a rows and \\a cols are the number of rows and of columns of\n  * the returned matrix. Must be compatible with this MatrixBase type.\n  *\n  * This variant is meant to be used for dynamic-size matrix types. For fixed-size types,\n  * it is redundant to pass \\a rows and \\a cols as arguments, so Zero() should be used\n  * instead.\n  *\n  * Example: \\include MatrixBase_zero_int_int.cpp\n  * Output: \\verbinclude MatrixBase_zero_int_int.out\n  *\n  * \\sa Zero(), Zero(Index)\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType\nDenseBase<Derived>::Zero(Index nbRows, Index nbCols)\n{\n  return Constant(nbRows, nbCols, Scalar(0));\n}\n\n/** \\returns an expression of a zero vector.\n  *\n  * The parameter \\a size is the size of the returned vector.\n  * Must be compatible with this MatrixBase type.\n  *\n  * \\only_for_vectors\n  *\n  * This variant is meant to be used for dynamic-size vector types. For fixed-size types,\n  * it is redundant to pass \\a size as argument, so Zero() should be used\n  * instead.\n  *\n  * Example: \\include MatrixBase_zero_int.cpp\n  * Output: \\verbinclude MatrixBase_zero_int.out\n  *\n  * \\sa Zero(), Zero(Index,Index)\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType\nDenseBase<Derived>::Zero(Index size)\n{\n  return Constant(size, Scalar(0));\n}\n\n/** \\returns an expression of a fixed-size zero matrix or vector.\n  *\n  * This variant is only for fixed-size MatrixBase types. For dynamic-size types, you\n  * need to use the variants taking size arguments.\n  *\n  * Example: \\include MatrixBase_zero.cpp\n  * Output: \\verbinclude MatrixBase_zero.out\n  *\n  * \\sa Zero(Index), Zero(Index,Index)\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType\nDenseBase<Derived>::Zero()\n{\n  return Constant(Scalar(0));\n}\n\n/** \\returns true if *this is approximately equal to the zero matrix,\n  *          within the precision given by \\a prec.\n  *\n  * Example: \\include MatrixBase_isZero.cpp\n  * Output: \\verbinclude MatrixBase_isZero.out\n  *\n  * \\sa class CwiseNullaryOp, Zero()\n  */\ntemplate<typename Derived>\nbool DenseBase<Derived>::isZero(const RealScalar& prec) const\n{\n  for(Index j = 0; j < cols(); ++j)\n    for(Index i = 0; i < rows(); ++i)\n      if(!internal::isMuchSmallerThan(this->coeff(i, j), static_cast<Scalar>(1), prec))\n        return false;\n  return true;\n}\n\n/** Sets all coefficients in this expression to zero.\n  *\n  * Example: \\include MatrixBase_setZero.cpp\n  * Output: \\verbinclude MatrixBase_setZero.out\n  *\n  * \\sa class CwiseNullaryOp, Zero()\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setZero()\n{\n  return setConstant(Scalar(0));\n}\n\n/** Resizes to the given \\a size, and sets all coefficients in this expression to zero.\n  *\n  * \\only_for_vectors\n  *\n  * Example: \\include Matrix_setZero_int.cpp\n  * Output: \\verbinclude Matrix_setZero_int.out\n  *\n  * \\sa DenseBase::setZero(), setZero(Index,Index), class CwiseNullaryOp, DenseBase::Zero()\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE Derived&\nPlainObjectBase<Derived>::setZero(Index newSize)\n{\n  resize(newSize);\n  return setConstant(Scalar(0));\n}\n\n/** Resizes to the given size, and sets all coefficients in this expression to zero.\n  *\n  * \\param nbRows the new number of rows\n  * \\param nbCols the new number of columns\n  *\n  * Example: \\include Matrix_setZero_int_int.cpp\n  * Output: \\verbinclude Matrix_setZero_int_int.out\n  *\n  * \\sa DenseBase::setZero(), setZero(Index), class CwiseNullaryOp, DenseBase::Zero()\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE Derived&\nPlainObjectBase<Derived>::setZero(Index nbRows, Index nbCols)\n{\n  resize(nbRows, nbCols);\n  return setConstant(Scalar(0));\n}\n\n// ones:\n\n/** \\returns an expression of a matrix where all coefficients equal one.\n  *\n  * The parameters \\a nbRows and \\a nbCols are the number of rows and of columns of\n  * the returned matrix. Must be compatible with this MatrixBase type.\n  *\n  * This variant is meant to be used for dynamic-size matrix types. For fixed-size types,\n  * it is redundant to pass \\a rows and \\a cols as arguments, so Ones() should be used\n  * instead.\n  *\n  * Example: \\include MatrixBase_ones_int_int.cpp\n  * Output: \\verbinclude MatrixBase_ones_int_int.out\n  *\n  * \\sa Ones(), Ones(Index), isOnes(), class Ones\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType\nDenseBase<Derived>::Ones(Index nbRows, Index nbCols)\n{\n  return Constant(nbRows, nbCols, Scalar(1));\n}\n\n/** \\returns an expression of a vector where all coefficients equal one.\n  *\n  * The parameter \\a newSize is the size of the returned vector.\n  * Must be compatible with this MatrixBase type.\n  *\n  * \\only_for_vectors\n  *\n  * This variant is meant to be used for dynamic-size vector types. For fixed-size types,\n  * it is redundant to pass \\a size as argument, so Ones() should be used\n  * instead.\n  *\n  * Example: \\include MatrixBase_ones_int.cpp\n  * Output: \\verbinclude MatrixBase_ones_int.out\n  *\n  * \\sa Ones(), Ones(Index,Index), isOnes(), class Ones\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType\nDenseBase<Derived>::Ones(Index newSize)\n{\n  return Constant(newSize, Scalar(1));\n}\n\n/** \\returns an expression of a fixed-size matrix or vector where all coefficients equal one.\n  *\n  * This variant is only for fixed-size MatrixBase types. For dynamic-size types, you\n  * need to use the variants taking size arguments.\n  *\n  * Example: \\include MatrixBase_ones.cpp\n  * Output: \\verbinclude MatrixBase_ones.out\n  *\n  * \\sa Ones(Index), Ones(Index,Index), isOnes(), class Ones\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType\nDenseBase<Derived>::Ones()\n{\n  return Constant(Scalar(1));\n}\n\n/** \\returns true if *this is approximately equal to the matrix where all coefficients\n  *          are equal to 1, within the precision given by \\a prec.\n  *\n  * Example: \\include MatrixBase_isOnes.cpp\n  * Output: \\verbinclude MatrixBase_isOnes.out\n  *\n  * \\sa class CwiseNullaryOp, Ones()\n  */\ntemplate<typename Derived>\nbool DenseBase<Derived>::isOnes\n(const RealScalar& prec) const\n{\n  return isApproxToConstant(Scalar(1), prec);\n}\n\n/** Sets all coefficients in this expression to one.\n  *\n  * Example: \\include MatrixBase_setOnes.cpp\n  * Output: \\verbinclude MatrixBase_setOnes.out\n  *\n  * \\sa class CwiseNullaryOp, Ones()\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setOnes()\n{\n  return setConstant(Scalar(1));\n}\n\n/** Resizes to the given \\a newSize, and sets all coefficients in this expression to one.\n  *\n  * \\only_for_vectors\n  *\n  * Example: \\include Matrix_setOnes_int.cpp\n  * Output: \\verbinclude Matrix_setOnes_int.out\n  *\n  * \\sa MatrixBase::setOnes(), setOnes(Index,Index), class CwiseNullaryOp, MatrixBase::Ones()\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE Derived&\nPlainObjectBase<Derived>::setOnes(Index newSize)\n{\n  resize(newSize);\n  return setConstant(Scalar(1));\n}\n\n/** Resizes to the given size, and sets all coefficients in this expression to one.\n  *\n  * \\param nbRows the new number of rows\n  * \\param nbCols the new number of columns\n  *\n  * Example: \\include Matrix_setOnes_int_int.cpp\n  * Output: \\verbinclude Matrix_setOnes_int_int.out\n  *\n  * \\sa MatrixBase::setOnes(), setOnes(Index), class CwiseNullaryOp, MatrixBase::Ones()\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE Derived&\nPlainObjectBase<Derived>::setOnes(Index nbRows, Index nbCols)\n{\n  resize(nbRows, nbCols);\n  return setConstant(Scalar(1));\n}\n\n// Identity:\n\n/** \\returns an expression of the identity matrix (not necessarily square).\n  *\n  * The parameters \\a nbRows and \\a nbCols are the number of rows and of columns of\n  * the returned matrix. Must be compatible with this MatrixBase type.\n  *\n  * This variant is meant to be used for dynamic-size matrix types. For fixed-size types,\n  * it is redundant to pass \\a rows and \\a cols as arguments, so Identity() should be used\n  * instead.\n  *\n  * Example: \\include MatrixBase_identity_int_int.cpp\n  * Output: \\verbinclude MatrixBase_identity_int_int.out\n  *\n  * \\sa Identity(), setIdentity(), isIdentity()\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE const typename MatrixBase<Derived>::IdentityReturnType\nMatrixBase<Derived>::Identity(Index nbRows, Index nbCols)\n{\n  return DenseBase<Derived>::NullaryExpr(nbRows, nbCols, internal::scalar_identity_op<Scalar>());\n}\n\n/** \\returns an expression of the identity matrix (not necessarily square).\n  *\n  * This variant is only for fixed-size MatrixBase types. For dynamic-size types, you\n  * need to use the variant taking size arguments.\n  *\n  * Example: \\include MatrixBase_identity.cpp\n  * Output: \\verbinclude MatrixBase_identity.out\n  *\n  * \\sa Identity(Index,Index), setIdentity(), isIdentity()\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE const typename MatrixBase<Derived>::IdentityReturnType\nMatrixBase<Derived>::Identity()\n{\n  EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)\n  return MatrixBase<Derived>::NullaryExpr(RowsAtCompileTime, ColsAtCompileTime, internal::scalar_identity_op<Scalar>());\n}\n\n/** \\returns true if *this is approximately equal to the identity matrix\n  *          (not necessarily square),\n  *          within the precision given by \\a prec.\n  *\n  * Example: \\include MatrixBase_isIdentity.cpp\n  * Output: \\verbinclude MatrixBase_isIdentity.out\n  *\n  * \\sa class CwiseNullaryOp, Identity(), Identity(Index,Index), setIdentity()\n  */\ntemplate<typename Derived>\nbool MatrixBase<Derived>::isIdentity\n(const RealScalar& prec) const\n{\n  for(Index j = 0; j < cols(); ++j)\n  {\n    for(Index i = 0; i < rows(); ++i)\n    {\n      if(i == j)\n      {\n        if(!internal::isApprox(this->coeff(i, j), static_cast<Scalar>(1), prec))\n          return false;\n      }\n      else\n      {\n        if(!internal::isMuchSmallerThan(this->coeff(i, j), static_cast<RealScalar>(1), prec))\n          return false;\n      }\n    }\n  }\n  return true;\n}\n\nnamespace internal {\n\ntemplate<typename Derived, bool Big = (Derived::SizeAtCompileTime>=16)>\nstruct setIdentity_impl\n{\n  static EIGEN_STRONG_INLINE Derived& run(Derived& m)\n  {\n    return m = Derived::Identity(m.rows(), m.cols());\n  }\n};\n\ntemplate<typename Derived>\nstruct setIdentity_impl<Derived, true>\n{\n  typedef typename Derived::Index Index;\n  static EIGEN_STRONG_INLINE Derived& run(Derived& m)\n  {\n    m.setZero();\n    const Index size = (std::min)(m.rows(), m.cols());\n    for(Index i = 0; i < size; ++i) m.coeffRef(i,i) = typename Derived::Scalar(1);\n    return m;\n  }\n};\n\n} // end namespace internal\n\n/** Writes the identity expression (not necessarily square) into *this.\n  *\n  * Example: \\include MatrixBase_setIdentity.cpp\n  * Output: \\verbinclude MatrixBase_setIdentity.out\n  *\n  * \\sa class CwiseNullaryOp, Identity(), Identity(Index,Index), isIdentity()\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::setIdentity()\n{\n  return internal::setIdentity_impl<Derived>::run(derived());\n}\n\n/** \\brief Resizes to the given size, and writes the identity expression (not necessarily square) into *this.\n  *\n  * \\param nbRows the new number of rows\n  * \\param nbCols the new number of columns\n  *\n  * Example: \\include Matrix_setIdentity_int_int.cpp\n  * Output: \\verbinclude Matrix_setIdentity_int_int.out\n  *\n  * \\sa MatrixBase::setIdentity(), class CwiseNullaryOp, MatrixBase::Identity()\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::setIdentity(Index nbRows, Index nbCols)\n{\n  derived().resize(nbRows, nbCols);\n  return setIdentity();\n}\n\n/** \\returns an expression of the i-th unit (basis) vector.\n  *\n  * \\only_for_vectors\n  *\n  * \\sa MatrixBase::Unit(Index), MatrixBase::UnitX(), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::Unit(Index newSize, Index i)\n{\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)\n  return BasisReturnType(SquareMatrixType::Identity(newSize,newSize), i);\n}\n\n/** \\returns an expression of the i-th unit (basis) vector.\n  *\n  * \\only_for_vectors\n  *\n  * This variant is for fixed-size vector only.\n  *\n  * \\sa MatrixBase::Unit(Index,Index), MatrixBase::UnitX(), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::Unit(Index i)\n{\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)\n  return BasisReturnType(SquareMatrixType::Identity(),i);\n}\n\n/** \\returns an expression of the X axis unit vector (1{,0}^*)\n  *\n  * \\only_for_vectors\n  *\n  * \\sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitX()\n{ return Derived::Unit(0); }\n\n/** \\returns an expression of the Y axis unit vector (0,1{,0}^*)\n  *\n  * \\only_for_vectors\n  *\n  * \\sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitY()\n{ return Derived::Unit(1); }\n\n/** \\returns an expression of the Z axis unit vector (0,0,1{,0}^*)\n  *\n  * \\only_for_vectors\n  *\n  * \\sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitZ()\n{ return Derived::Unit(2); }\n\n/** \\returns an expression of the W axis unit vector (0,0,0,1)\n  *\n  * \\only_for_vectors\n  *\n  * \\sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitW()\n{ return Derived::Unit(3); }\n\n} // end namespace Eigen\n\n#endif // EIGEN_CWISE_NULLARY_OP_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/CwiseUnaryOp.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_CWISE_UNARY_OP_H\n#define EIGEN_CWISE_UNARY_OP_H\n\nnamespace Eigen { \n\n/** \\class CwiseUnaryOp\n  * \\ingroup Core_Module\n  *\n  * \\brief Generic expression where a coefficient-wise unary operator is applied to an expression\n  *\n  * \\param UnaryOp template functor implementing the operator\n  * \\param XprType the type of the expression to which we are applying the unary operator\n  *\n  * This class represents an expression where a unary operator is applied to an expression.\n  * It is the return type of all operations taking exactly 1 input expression, regardless of the\n  * presence of other inputs such as scalars. For example, the operator* in the expression 3*matrix\n  * is considered unary, because only the right-hand side is an expression, and its\n  * return type is a specialization of CwiseUnaryOp.\n  *\n  * Most of the time, this is the only way that it is used, so you typically don't have to name\n  * CwiseUnaryOp types explicitly.\n  *\n  * \\sa MatrixBase::unaryExpr(const CustomUnaryOp &) const, class CwiseBinaryOp, class CwiseNullaryOp\n  */\n\nnamespace internal {\ntemplate<typename UnaryOp, typename XprType>\nstruct traits<CwiseUnaryOp<UnaryOp, XprType> >\n : traits<XprType>\n{\n  typedef typename result_of<\n                     UnaryOp(typename XprType::Scalar)\n                   >::type Scalar;\n  typedef typename XprType::Nested XprTypeNested;\n  typedef typename remove_reference<XprTypeNested>::type _XprTypeNested;\n  enum {\n    Flags = _XprTypeNested::Flags & (\n      HereditaryBits | LinearAccessBit | AlignedBit\n      | (functor_traits<UnaryOp>::PacketAccess ? PacketAccessBit : 0)),\n    CoeffReadCost = EIGEN_ADD_COST(_XprTypeNested::CoeffReadCost, functor_traits<UnaryOp>::Cost)\n  };\n};\n}\n\ntemplate<typename UnaryOp, typename XprType, typename StorageKind>\nclass CwiseUnaryOpImpl;\n\ntemplate<typename UnaryOp, typename XprType>\nclass CwiseUnaryOp : internal::no_assignment_operator,\n  public CwiseUnaryOpImpl<UnaryOp, XprType, typename internal::traits<XprType>::StorageKind>\n{\n  public:\n\n    typedef typename CwiseUnaryOpImpl<UnaryOp, XprType,typename internal::traits<XprType>::StorageKind>::Base Base;\n    EIGEN_GENERIC_PUBLIC_INTERFACE(CwiseUnaryOp)\n\n    inline CwiseUnaryOp(const XprType& xpr, const UnaryOp& func = UnaryOp())\n      : m_xpr(xpr), m_functor(func) {}\n\n    EIGEN_STRONG_INLINE Index rows() const { return m_xpr.rows(); }\n    EIGEN_STRONG_INLINE Index cols() const { return m_xpr.cols(); }\n\n    /** \\returns the functor representing the unary operation */\n    const UnaryOp& functor() const { return m_functor; }\n\n    /** \\returns the nested expression */\n    const typename internal::remove_all<typename XprType::Nested>::type&\n    nestedExpression() const { return m_xpr; }\n\n    /** \\returns the nested expression */\n    typename internal::remove_all<typename XprType::Nested>::type&\n    nestedExpression() { return m_xpr.const_cast_derived(); }\n\n  protected:\n    typename XprType::Nested m_xpr;\n    const UnaryOp m_functor;\n};\n\n// This is the generic implementation for dense storage.\n// It can be used for any expression types implementing the dense concept.\ntemplate<typename UnaryOp, typename XprType>\nclass CwiseUnaryOpImpl<UnaryOp,XprType,Dense>\n  : public internal::dense_xpr_base<CwiseUnaryOp<UnaryOp, XprType> >::type\n{\n  public:\n\n    typedef CwiseUnaryOp<UnaryOp, XprType> Derived;\n    typedef typename internal::dense_xpr_base<CwiseUnaryOp<UnaryOp, XprType> >::type Base;\n    EIGEN_DENSE_PUBLIC_INTERFACE(Derived)\n\n    EIGEN_STRONG_INLINE const Scalar coeff(Index rowId, Index colId) const\n    {\n      return derived().functor()(derived().nestedExpression().coeff(rowId, colId));\n    }\n\n    template<int LoadMode>\n    EIGEN_STRONG_INLINE PacketScalar packet(Index rowId, Index colId) const\n    {\n      return derived().functor().packetOp(derived().nestedExpression().template packet<LoadMode>(rowId, colId));\n    }\n\n    EIGEN_STRONG_INLINE const Scalar coeff(Index index) const\n    {\n      return derived().functor()(derived().nestedExpression().coeff(index));\n    }\n\n    template<int LoadMode>\n    EIGEN_STRONG_INLINE PacketScalar packet(Index index) const\n    {\n      return derived().functor().packetOp(derived().nestedExpression().template packet<LoadMode>(index));\n    }\n};\n\n} // end namespace Eigen\n\n#endif // EIGEN_CWISE_UNARY_OP_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/CwiseUnaryView.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_CWISE_UNARY_VIEW_H\n#define EIGEN_CWISE_UNARY_VIEW_H\n\nnamespace Eigen {\n\n/** \\class CwiseUnaryView\n  * \\ingroup Core_Module\n  *\n  * \\brief Generic lvalue expression of a coefficient-wise unary operator of a matrix or a vector\n  *\n  * \\param ViewOp template functor implementing the view\n  * \\param MatrixType the type of the matrix we are applying the unary operator\n  *\n  * This class represents a lvalue expression of a generic unary view operator of a matrix or a vector.\n  * It is the return type of real() and imag(), and most of the time this is the only way it is used.\n  *\n  * \\sa MatrixBase::unaryViewExpr(const CustomUnaryOp &) const, class CwiseUnaryOp\n  */\n\nnamespace internal {\ntemplate<typename ViewOp, typename MatrixType>\nstruct traits<CwiseUnaryView<ViewOp, MatrixType> >\n : traits<MatrixType>\n{\n  typedef typename result_of<\n                     ViewOp(typename traits<MatrixType>::Scalar)\n                   >::type Scalar;\n  typedef typename MatrixType::Nested MatrixTypeNested;\n  typedef typename remove_all<MatrixTypeNested>::type _MatrixTypeNested;\n  enum {\n    Flags = (traits<_MatrixTypeNested>::Flags & (HereditaryBits | LvalueBit | LinearAccessBit | DirectAccessBit)),\n    CoeffReadCost = EIGEN_ADD_COST(traits<_MatrixTypeNested>::CoeffReadCost, functor_traits<ViewOp>::Cost),\n    MatrixTypeInnerStride =  inner_stride_at_compile_time<MatrixType>::ret,\n    // need to cast the sizeof's from size_t to int explicitly, otherwise:\n    // \"error: no integral type can represent all of the enumerator values\n    InnerStrideAtCompileTime = MatrixTypeInnerStride == Dynamic\n                             ? int(Dynamic)\n                             : int(MatrixTypeInnerStride) * int(sizeof(typename traits<MatrixType>::Scalar) / sizeof(Scalar)),\n    OuterStrideAtCompileTime = outer_stride_at_compile_time<MatrixType>::ret == Dynamic\n                             ? int(Dynamic)\n                             : outer_stride_at_compile_time<MatrixType>::ret * int(sizeof(typename traits<MatrixType>::Scalar) / sizeof(Scalar))\n  };\n};\n}\n\ntemplate<typename ViewOp, typename MatrixType, typename StorageKind>\nclass CwiseUnaryViewImpl;\n\ntemplate<typename ViewOp, typename MatrixType>\nclass CwiseUnaryView : public CwiseUnaryViewImpl<ViewOp, MatrixType, typename internal::traits<MatrixType>::StorageKind>\n{\n  public:\n\n    typedef typename CwiseUnaryViewImpl<ViewOp, MatrixType,typename internal::traits<MatrixType>::StorageKind>::Base Base;\n    EIGEN_GENERIC_PUBLIC_INTERFACE(CwiseUnaryView)\n\n    inline CwiseUnaryView(const MatrixType& mat, const ViewOp& func = ViewOp())\n      : m_matrix(mat), m_functor(func) {}\n\n    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(CwiseUnaryView)\n\n    EIGEN_STRONG_INLINE Index rows() const { return m_matrix.rows(); }\n    EIGEN_STRONG_INLINE Index cols() const { return m_matrix.cols(); }\n\n    /** \\returns the functor representing unary operation */\n    const ViewOp& functor() const { return m_functor; }\n\n    /** \\returns the nested expression */\n    const typename internal::remove_all<typename MatrixType::Nested>::type&\n    nestedExpression() const { return m_matrix; }\n\n    /** \\returns the nested expression */\n    typename internal::remove_all<typename MatrixType::Nested>::type&\n    nestedExpression() { return m_matrix.const_cast_derived(); }\n\n  protected:\n    // FIXME changed from MatrixType::Nested because of a weird compilation error with sun CC\n    typename internal::nested<MatrixType>::type m_matrix;\n    ViewOp m_functor;\n};\n\ntemplate<typename ViewOp, typename MatrixType>\nclass CwiseUnaryViewImpl<ViewOp,MatrixType,Dense>\n  : public internal::dense_xpr_base< CwiseUnaryView<ViewOp, MatrixType> >::type\n{\n  public:\n\n    typedef CwiseUnaryView<ViewOp, MatrixType> Derived;\n    typedef typename internal::dense_xpr_base< CwiseUnaryView<ViewOp, MatrixType> >::type Base;\n\n    EIGEN_DENSE_PUBLIC_INTERFACE(Derived)\n    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(CwiseUnaryViewImpl)\n    \n    inline Scalar* data() { return &coeffRef(0); }\n    inline const Scalar* data() const { return &coeff(0); }\n\n    inline Index innerStride() const\n    {\n      return derived().nestedExpression().innerStride() * sizeof(typename internal::traits<MatrixType>::Scalar) / sizeof(Scalar);\n    }\n\n    inline Index outerStride() const\n    {\n      return derived().nestedExpression().outerStride() * sizeof(typename internal::traits<MatrixType>::Scalar) / sizeof(Scalar);\n    }\n\n    EIGEN_STRONG_INLINE CoeffReturnType coeff(Index row, Index col) const\n    {\n      return derived().functor()(derived().nestedExpression().coeff(row, col));\n    }\n\n    EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const\n    {\n      return derived().functor()(derived().nestedExpression().coeff(index));\n    }\n\n    EIGEN_STRONG_INLINE Scalar& coeffRef(Index row, Index col)\n    {\n      return derived().functor()(const_cast_derived().nestedExpression().coeffRef(row, col));\n    }\n\n    EIGEN_STRONG_INLINE Scalar& coeffRef(Index index)\n    {\n      return derived().functor()(const_cast_derived().nestedExpression().coeffRef(index));\n    }\n};\n\n} // end namespace Eigen\n\n#endif // EIGEN_CWISE_UNARY_VIEW_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/DenseBase.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2007-2010 Benoit Jacob <jacob.benoit.1@gmail.com>\n// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_DENSEBASE_H\n#define EIGEN_DENSEBASE_H\n\nnamespace Eigen {\n\nnamespace internal {\n  \n// The index type defined by EIGEN_DEFAULT_DENSE_INDEX_TYPE must be a signed type.\n// This dummy function simply aims at checking that at compile time.\nstatic inline void check_DenseIndex_is_signed() {\n  EIGEN_STATIC_ASSERT(NumTraits<DenseIndex>::IsSigned,THE_INDEX_TYPE_MUST_BE_A_SIGNED_TYPE); \n}\n\n} // end namespace internal\n  \n/** \\class DenseBase\n  * \\ingroup Core_Module\n  *\n  * \\brief Base class for all dense matrices, vectors, and arrays\n  *\n  * This class is the base that is inherited by all dense objects (matrix, vector, arrays,\n  * and related expression types). The common Eigen API for dense objects is contained in this class.\n  *\n  * \\tparam Derived is the derived type, e.g., a matrix type or an expression.\n  *\n  * This class can be extended with the help of the plugin mechanism described on the page\n  * \\ref TopicCustomizingEigen by defining the preprocessor symbol \\c EIGEN_DENSEBASE_PLUGIN.\n  *\n  * \\sa \\ref TopicClassHierarchy\n  */\ntemplate<typename Derived> class DenseBase\n#ifndef EIGEN_PARSED_BY_DOXYGEN\n  : public internal::special_scalar_op_base<Derived, typename internal::traits<Derived>::Scalar,\n                                            typename NumTraits<typename internal::traits<Derived>::Scalar>::Real,\n                                            DenseCoeffsBase<Derived> >\n#else\n  : public DenseCoeffsBase<Derived>\n#endif // not EIGEN_PARSED_BY_DOXYGEN\n{\n  public:\n\n    class InnerIterator;\n\n    typedef typename internal::traits<Derived>::StorageKind StorageKind;\n\n    /** \\brief The type of indices \n      * \\details To change this, \\c \\#define the preprocessor symbol \\c EIGEN_DEFAULT_DENSE_INDEX_TYPE.\n      * \\sa \\ref TopicPreprocessorDirectives.\n      */\n    typedef typename internal::traits<Derived>::Index Index; \n\n    typedef typename internal::traits<Derived>::Scalar Scalar;\n    typedef typename internal::packet_traits<Scalar>::type PacketScalar;\n    typedef typename NumTraits<Scalar>::Real RealScalar;\n    typedef internal::special_scalar_op_base<Derived,Scalar,RealScalar, DenseCoeffsBase<Derived> > Base;\n\n    using Base::operator*;\n    using Base::derived;\n    using Base::const_cast_derived;\n    using Base::rows;\n    using Base::cols;\n    using Base::size;\n    using Base::rowIndexByOuterInner;\n    using Base::colIndexByOuterInner;\n    using Base::coeff;\n    using Base::coeffByOuterInner;\n    using Base::packet;\n    using Base::packetByOuterInner;\n    using Base::writePacket;\n    using Base::writePacketByOuterInner;\n    using Base::coeffRef;\n    using Base::coeffRefByOuterInner;\n    using Base::copyCoeff;\n    using Base::copyCoeffByOuterInner;\n    using Base::copyPacket;\n    using Base::copyPacketByOuterInner;\n    using Base::operator();\n    using Base::operator[];\n    using Base::x;\n    using Base::y;\n    using Base::z;\n    using Base::w;\n    using Base::stride;\n    using Base::innerStride;\n    using Base::outerStride;\n    using Base::rowStride;\n    using Base::colStride;\n    typedef typename Base::CoeffReturnType CoeffReturnType;\n\n    enum {\n\n      RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,\n        /**< The number of rows at compile-time. This is just a copy of the value provided\n          * by the \\a Derived type. If a value is not known at compile-time,\n          * it is set to the \\a Dynamic constant.\n          * \\sa MatrixBase::rows(), MatrixBase::cols(), ColsAtCompileTime, SizeAtCompileTime */\n\n      ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,\n        /**< The number of columns at compile-time. This is just a copy of the value provided\n          * by the \\a Derived type. If a value is not known at compile-time,\n          * it is set to the \\a Dynamic constant.\n          * \\sa MatrixBase::rows(), MatrixBase::cols(), RowsAtCompileTime, SizeAtCompileTime */\n\n\n      SizeAtCompileTime = (internal::size_at_compile_time<internal::traits<Derived>::RowsAtCompileTime,\n                                                   internal::traits<Derived>::ColsAtCompileTime>::ret),\n        /**< This is equal to the number of coefficients, i.e. the number of\n          * rows times the number of columns, or to \\a Dynamic if this is not\n          * known at compile-time. \\sa RowsAtCompileTime, ColsAtCompileTime */\n\n      MaxRowsAtCompileTime = internal::traits<Derived>::MaxRowsAtCompileTime,\n        /**< This value is equal to the maximum possible number of rows that this expression\n          * might have. If this expression might have an arbitrarily high number of rows,\n          * this value is set to \\a Dynamic.\n          *\n          * This value is useful to know when evaluating an expression, in order to determine\n          * whether it is possible to avoid doing a dynamic memory allocation.\n          *\n          * \\sa RowsAtCompileTime, MaxColsAtCompileTime, MaxSizeAtCompileTime\n          */\n\n      MaxColsAtCompileTime = internal::traits<Derived>::MaxColsAtCompileTime,\n        /**< This value is equal to the maximum possible number of columns that this expression\n          * might have. If this expression might have an arbitrarily high number of columns,\n          * this value is set to \\a Dynamic.\n          *\n          * This value is useful to know when evaluating an expression, in order to determine\n          * whether it is possible to avoid doing a dynamic memory allocation.\n          *\n          * \\sa ColsAtCompileTime, MaxRowsAtCompileTime, MaxSizeAtCompileTime\n          */\n\n      MaxSizeAtCompileTime = (internal::size_at_compile_time<internal::traits<Derived>::MaxRowsAtCompileTime,\n                                                      internal::traits<Derived>::MaxColsAtCompileTime>::ret),\n        /**< This value is equal to the maximum possible number of coefficients that this expression\n          * might have. If this expression might have an arbitrarily high number of coefficients,\n          * this value is set to \\a Dynamic.\n          *\n          * This value is useful to know when evaluating an expression, in order to determine\n          * whether it is possible to avoid doing a dynamic memory allocation.\n          *\n          * \\sa SizeAtCompileTime, MaxRowsAtCompileTime, MaxColsAtCompileTime\n          */\n\n      IsVectorAtCompileTime = internal::traits<Derived>::MaxRowsAtCompileTime == 1\n                           || internal::traits<Derived>::MaxColsAtCompileTime == 1,\n        /**< This is set to true if either the number of rows or the number of\n          * columns is known at compile-time to be equal to 1. Indeed, in that case,\n          * we are dealing with a column-vector (if there is only one column) or with\n          * a row-vector (if there is only one row). */\n\n      Flags = internal::traits<Derived>::Flags,\n        /**< This stores expression \\ref flags flags which may or may not be inherited by new expressions\n          * constructed from this one. See the \\ref flags \"list of flags\".\n          */\n\n      IsRowMajor = int(Flags) & RowMajorBit, /**< True if this expression has row-major storage order. */\n\n      InnerSizeAtCompileTime = int(IsVectorAtCompileTime) ? int(SizeAtCompileTime)\n                             : int(IsRowMajor) ? int(ColsAtCompileTime) : int(RowsAtCompileTime),\n\n      CoeffReadCost = internal::traits<Derived>::CoeffReadCost,\n        /**< This is a rough measure of how expensive it is to read one coefficient from\n          * this expression.\n          */\n\n      InnerStrideAtCompileTime = internal::inner_stride_at_compile_time<Derived>::ret,\n      OuterStrideAtCompileTime = internal::outer_stride_at_compile_time<Derived>::ret\n    };\n\n    enum { ThisConstantIsPrivateInPlainObjectBase };\n\n    /** \\returns the number of nonzero coefficients which is in practice the number\n      * of stored coefficients. */\n    inline Index nonZeros() const { return size(); }\n\n    /** \\returns the outer size.\n      *\n      * \\note For a vector, this returns just 1. For a matrix (non-vector), this is the major dimension\n      * with respect to the \\ref TopicStorageOrders \"storage order\", i.e., the number of columns for a\n      * column-major matrix, and the number of rows for a row-major matrix. */\n    Index outerSize() const\n    {\n      return IsVectorAtCompileTime ? 1\n           : int(IsRowMajor) ? this->rows() : this->cols();\n    }\n\n    /** \\returns the inner size.\n      *\n      * \\note For a vector, this is just the size. For a matrix (non-vector), this is the minor dimension\n      * with respect to the \\ref TopicStorageOrders \"storage order\", i.e., the number of rows for a \n      * column-major matrix, and the number of columns for a row-major matrix. */\n    Index innerSize() const\n    {\n      return IsVectorAtCompileTime ? this->size()\n           : int(IsRowMajor) ? this->cols() : this->rows();\n    }\n\n    /** Only plain matrices/arrays, not expressions, may be resized; therefore the only useful resize methods are\n      * Matrix::resize() and Array::resize(). The present method only asserts that the new size equals the old size, and does\n      * nothing else.\n      */\n    void resize(Index newSize)\n    {\n      EIGEN_ONLY_USED_FOR_DEBUG(newSize);\n      eigen_assert(newSize == this->size()\n                && \"DenseBase::resize() does not actually allow to resize.\");\n    }\n    /** Only plain matrices/arrays, not expressions, may be resized; therefore the only useful resize methods are\n      * Matrix::resize() and Array::resize(). The present method only asserts that the new size equals the old size, and does\n      * nothing else.\n      */\n    void resize(Index nbRows, Index nbCols)\n    {\n      EIGEN_ONLY_USED_FOR_DEBUG(nbRows);\n      EIGEN_ONLY_USED_FOR_DEBUG(nbCols);\n      eigen_assert(nbRows == this->rows() && nbCols == this->cols()\n                && \"DenseBase::resize() does not actually allow to resize.\");\n    }\n\n#ifndef EIGEN_PARSED_BY_DOXYGEN\n\n    /** \\internal Represents a matrix with all coefficients equal to one another*/\n    typedef CwiseNullaryOp<internal::scalar_constant_op<Scalar>,Derived> ConstantReturnType;\n    /** \\internal Represents a vector with linearly spaced coefficients that allows sequential access only. */\n    typedef CwiseNullaryOp<internal::linspaced_op<Scalar,false>,Derived> SequentialLinSpacedReturnType;\n    /** \\internal Represents a vector with linearly spaced coefficients that allows random access. */\n    typedef CwiseNullaryOp<internal::linspaced_op<Scalar,true>,Derived> RandomAccessLinSpacedReturnType;\n    /** \\internal the return type of MatrixBase::eigenvalues() */\n    typedef Matrix<typename NumTraits<typename internal::traits<Derived>::Scalar>::Real, internal::traits<Derived>::ColsAtCompileTime, 1> EigenvaluesReturnType;\n\n#endif // not EIGEN_PARSED_BY_DOXYGEN\n\n    /** Copies \\a other into *this. \\returns a reference to *this. */\n    template<typename OtherDerived>\n    Derived& operator=(const DenseBase<OtherDerived>& other);\n\n    /** Special case of the template operator=, in order to prevent the compiler\n      * from generating a default operator= (issue hit with g++ 4.1)\n      */\n    Derived& operator=(const DenseBase& other);\n\n    template<typename OtherDerived>\n    Derived& operator=(const EigenBase<OtherDerived> &other);\n\n    template<typename OtherDerived>\n    Derived& operator+=(const EigenBase<OtherDerived> &other);\n\n    template<typename OtherDerived>\n    Derived& operator-=(const EigenBase<OtherDerived> &other);\n\n    template<typename OtherDerived>\n    Derived& operator=(const ReturnByValue<OtherDerived>& func);\n\n    /** \\internal Copies \\a other into *this without evaluating other. \\returns a reference to *this. */\n    template<typename OtherDerived>\n    Derived& lazyAssign(const DenseBase<OtherDerived>& other);\n\n    /** \\internal Evaluates \\a other into *this. \\returns a reference to *this. */\n    template<typename OtherDerived>\n    Derived& lazyAssign(const ReturnByValue<OtherDerived>& other);\n\n    CommaInitializer<Derived> operator<< (const Scalar& s);\n\n    template<unsigned int Added,unsigned int Removed>\n    const Flagged<Derived, Added, Removed> flagged() const;\n\n    template<typename OtherDerived>\n    CommaInitializer<Derived> operator<< (const DenseBase<OtherDerived>& other);\n\n    Eigen::Transpose<Derived> transpose();\n\ttypedef typename internal::add_const<Transpose<const Derived> >::type ConstTransposeReturnType;\n    ConstTransposeReturnType transpose() const;\n    void transposeInPlace();\n#ifndef EIGEN_NO_DEBUG\n  protected:\n    template<typename OtherDerived>\n    void checkTransposeAliasing(const OtherDerived& other) const;\n  public:\n#endif\n\n\n    static const ConstantReturnType\n    Constant(Index rows, Index cols, const Scalar& value);\n    static const ConstantReturnType\n    Constant(Index size, const Scalar& value);\n    static const ConstantReturnType\n    Constant(const Scalar& value);\n\n    static const SequentialLinSpacedReturnType\n    LinSpaced(Sequential_t, Index size, const Scalar& low, const Scalar& high);\n    static const RandomAccessLinSpacedReturnType\n    LinSpaced(Index size, const Scalar& low, const Scalar& high);\n    static const SequentialLinSpacedReturnType\n    LinSpaced(Sequential_t, const Scalar& low, const Scalar& high);\n    static const RandomAccessLinSpacedReturnType\n    LinSpaced(const Scalar& low, const Scalar& high);\n\n    template<typename CustomNullaryOp>\n    static const CwiseNullaryOp<CustomNullaryOp, Derived>\n    NullaryExpr(Index rows, Index cols, const CustomNullaryOp& func);\n    template<typename CustomNullaryOp>\n    static const CwiseNullaryOp<CustomNullaryOp, Derived>\n    NullaryExpr(Index size, const CustomNullaryOp& func);\n    template<typename CustomNullaryOp>\n    static const CwiseNullaryOp<CustomNullaryOp, Derived>\n    NullaryExpr(const CustomNullaryOp& func);\n\n    static const ConstantReturnType Zero(Index rows, Index cols);\n    static const ConstantReturnType Zero(Index size);\n    static const ConstantReturnType Zero();\n    static const ConstantReturnType Ones(Index rows, Index cols);\n    static const ConstantReturnType Ones(Index size);\n    static const ConstantReturnType Ones();\n\n    void fill(const Scalar& value);\n    Derived& setConstant(const Scalar& value);\n    Derived& setLinSpaced(Index size, const Scalar& low, const Scalar& high);\n    Derived& setLinSpaced(const Scalar& low, const Scalar& high);\n    Derived& setZero();\n    Derived& setOnes();\n    Derived& setRandom();\n\n    template<typename OtherDerived>\n    bool isApprox(const DenseBase<OtherDerived>& other,\n                  const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;\n    bool isMuchSmallerThan(const RealScalar& other,\n                           const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;\n    template<typename OtherDerived>\n    bool isMuchSmallerThan(const DenseBase<OtherDerived>& other,\n                           const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;\n\n    bool isApproxToConstant(const Scalar& value, const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;\n    bool isConstant(const Scalar& value, const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;\n    bool isZero(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;\n    bool isOnes(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;\n    \n    inline bool hasNaN() const;\n    inline bool allFinite() const;\n\n    inline Derived& operator*=(const Scalar& other);\n    inline Derived& operator/=(const Scalar& other);\n\n    typedef typename internal::add_const_on_value_type<typename internal::eval<Derived>::type>::type EvalReturnType;\n    /** \\returns the matrix or vector obtained by evaluating this expression.\n      *\n      * Notice that in the case of a plain matrix or vector (not an expression) this function just returns\n      * a const reference, in order to avoid a useless copy.\n      */\n    EIGEN_STRONG_INLINE EvalReturnType eval() const\n    {\n      // Even though MSVC does not honor strong inlining when the return type\n      // is a dynamic matrix, we desperately need strong inlining for fixed\n      // size types on MSVC.\n      return typename internal::eval<Derived>::type(derived());\n    }\n\n    /** swaps *this with the expression \\a other.\n      *\n      */\n    template<typename OtherDerived>\n    void swap(const DenseBase<OtherDerived>& other,\n              int = OtherDerived::ThisConstantIsPrivateInPlainObjectBase)\n    {\n      SwapWrapper<Derived>(derived()).lazyAssign(other.derived());\n    }\n\n    /** swaps *this with the matrix or array \\a other.\n      *\n      */\n    template<typename OtherDerived>\n    void swap(PlainObjectBase<OtherDerived>& other)\n    {\n      SwapWrapper<Derived>(derived()).lazyAssign(other.derived());\n    }\n\n\n    inline const NestByValue<Derived> nestByValue() const;\n    inline const ForceAlignedAccess<Derived> forceAlignedAccess() const;\n    inline ForceAlignedAccess<Derived> forceAlignedAccess();\n    template<bool Enable> inline const typename internal::conditional<Enable,ForceAlignedAccess<Derived>,Derived&>::type forceAlignedAccessIf() const;\n    template<bool Enable> inline typename internal::conditional<Enable,ForceAlignedAccess<Derived>,Derived&>::type forceAlignedAccessIf();\n\n    Scalar sum() const;\n    Scalar mean() const;\n    Scalar trace() const;\n\n    Scalar prod() const;\n\n    typename internal::traits<Derived>::Scalar minCoeff() const;\n    typename internal::traits<Derived>::Scalar maxCoeff() const;\n\n    template<typename IndexType>\n    typename internal::traits<Derived>::Scalar minCoeff(IndexType* row, IndexType* col) const;\n    template<typename IndexType>\n    typename internal::traits<Derived>::Scalar maxCoeff(IndexType* row, IndexType* col) const;\n    template<typename IndexType>\n    typename internal::traits<Derived>::Scalar minCoeff(IndexType* index) const;\n    template<typename IndexType>\n    typename internal::traits<Derived>::Scalar maxCoeff(IndexType* index) const;\n\n    template<typename BinaryOp>\n    typename internal::result_of<BinaryOp(typename internal::traits<Derived>::Scalar)>::type\n    redux(const BinaryOp& func) const;\n\n    template<typename Visitor>\n    void visit(Visitor& func) const;\n\n    inline const WithFormat<Derived> format(const IOFormat& fmt) const;\n\n    /** \\returns the unique coefficient of a 1x1 expression */\n    CoeffReturnType value() const\n    {\n      EIGEN_STATIC_ASSERT_SIZE_1x1(Derived)\n      eigen_assert(this->rows() == 1 && this->cols() == 1);\n      return derived().coeff(0,0);\n    }\n\n    bool all(void) const;\n    bool any(void) const;\n    Index count() const;\n\n    typedef VectorwiseOp<Derived, Horizontal> RowwiseReturnType;\n    typedef const VectorwiseOp<const Derived, Horizontal> ConstRowwiseReturnType;\n    typedef VectorwiseOp<Derived, Vertical> ColwiseReturnType;\n    typedef const VectorwiseOp<const Derived, Vertical> ConstColwiseReturnType;\n\n    ConstRowwiseReturnType rowwise() const;\n    RowwiseReturnType rowwise();\n    ConstColwiseReturnType colwise() const;\n    ColwiseReturnType colwise();\n\n    static const CwiseNullaryOp<internal::scalar_random_op<Scalar>,Derived> Random(Index rows, Index cols);\n    static const CwiseNullaryOp<internal::scalar_random_op<Scalar>,Derived> Random(Index size);\n    static const CwiseNullaryOp<internal::scalar_random_op<Scalar>,Derived> Random();\n\n    template<typename ThenDerived,typename ElseDerived>\n    const Select<Derived,ThenDerived,ElseDerived>\n    select(const DenseBase<ThenDerived>& thenMatrix,\n           const DenseBase<ElseDerived>& elseMatrix) const;\n\n    template<typename ThenDerived>\n    inline const Select<Derived,ThenDerived, typename ThenDerived::ConstantReturnType>\n    select(const DenseBase<ThenDerived>& thenMatrix, const typename ThenDerived::Scalar& elseScalar) const;\n\n    template<typename ElseDerived>\n    inline const Select<Derived, typename ElseDerived::ConstantReturnType, ElseDerived >\n    select(const typename ElseDerived::Scalar& thenScalar, const DenseBase<ElseDerived>& elseMatrix) const;\n\n    template<int p> RealScalar lpNorm() const;\n\n    template<int RowFactor, int ColFactor>\n    inline const Replicate<Derived,RowFactor,ColFactor> replicate() const;\n    \n    typedef Replicate<Derived,Dynamic,Dynamic> ReplicateReturnType;\n    inline const ReplicateReturnType replicate(Index rowFacor,Index colFactor) const;\n\n    typedef Reverse<Derived, BothDirections> ReverseReturnType;\n    typedef const Reverse<const Derived, BothDirections> ConstReverseReturnType;\n    ReverseReturnType reverse();\n    ConstReverseReturnType reverse() const;\n    void reverseInPlace();\n\n#define EIGEN_CURRENT_STORAGE_BASE_CLASS Eigen::DenseBase\n#   include \"../plugins/BlockMethods.h\"\n#   ifdef EIGEN_DENSEBASE_PLUGIN\n#     include EIGEN_DENSEBASE_PLUGIN\n#   endif\n#undef EIGEN_CURRENT_STORAGE_BASE_CLASS\n\n#ifdef EIGEN2_SUPPORT\n\n    Block<Derived> corner(CornerType type, Index cRows, Index cCols);\n    const Block<Derived> corner(CornerType type, Index cRows, Index cCols) const;\n    template<int CRows, int CCols>\n    Block<Derived, CRows, CCols> corner(CornerType type);\n    template<int CRows, int CCols>\n    const Block<Derived, CRows, CCols> corner(CornerType type) const;\n\n#endif // EIGEN2_SUPPORT\n\n\n    // disable the use of evalTo for dense objects with a nice compilation error\n    template<typename Dest> inline void evalTo(Dest& ) const\n    {\n      EIGEN_STATIC_ASSERT((internal::is_same<Dest,void>::value),THE_EVAL_EVALTO_FUNCTION_SHOULD_NEVER_BE_CALLED_FOR_DENSE_OBJECTS);\n    }\n\n  protected:\n    /** Default constructor. Do nothing. */\n    DenseBase()\n    {\n      /* Just checks for self-consistency of the flags.\n       * Only do it when debugging Eigen, as this borders on paranoiac and could slow compilation down\n       */\n#ifdef EIGEN_INTERNAL_DEBUGGING\n      EIGEN_STATIC_ASSERT((EIGEN_IMPLIES(MaxRowsAtCompileTime==1 && MaxColsAtCompileTime!=1, int(IsRowMajor))\n                        && EIGEN_IMPLIES(MaxColsAtCompileTime==1 && MaxRowsAtCompileTime!=1, int(!IsRowMajor))),\n                          INVALID_STORAGE_ORDER_FOR_THIS_VECTOR_EXPRESSION)\n#endif\n    }\n\n  private:\n    explicit DenseBase(int);\n    DenseBase(int,int);\n    template<typename OtherDerived> explicit DenseBase(const DenseBase<OtherDerived>&);\n};\n\n} // end namespace Eigen\n\n#endif // EIGEN_DENSEBASE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/DenseCoeffsBase.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2006-2010 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_DENSECOEFFSBASE_H\n#define EIGEN_DENSECOEFFSBASE_H\n\nnamespace Eigen {\n\nnamespace internal {\ntemplate<typename T> struct add_const_on_value_type_if_arithmetic\n{\n  typedef typename conditional<is_arithmetic<T>::value, T, typename add_const_on_value_type<T>::type>::type type;\n};\n}\n\n/** \\brief Base class providing read-only coefficient access to matrices and arrays.\n  * \\ingroup Core_Module\n  * \\tparam Derived Type of the derived class\n  * \\tparam #ReadOnlyAccessors Constant indicating read-only access\n  *\n  * This class defines the \\c operator() \\c const function and friends, which can be used to read specific\n  * entries of a matrix or array.\n  * \n  * \\sa DenseCoeffsBase<Derived, WriteAccessors>, DenseCoeffsBase<Derived, DirectAccessors>,\n  *     \\ref TopicClassHierarchy\n  */\ntemplate<typename Derived>\nclass DenseCoeffsBase<Derived,ReadOnlyAccessors> : public EigenBase<Derived>\n{\n  public:\n    typedef typename internal::traits<Derived>::StorageKind StorageKind;\n    typedef typename internal::traits<Derived>::Index Index;\n    typedef typename internal::traits<Derived>::Scalar Scalar;\n    typedef typename internal::packet_traits<Scalar>::type PacketScalar;\n\n    // Explanation for this CoeffReturnType typedef.\n    // - This is the return type of the coeff() method.\n    // - The LvalueBit means exactly that we can offer a coeffRef() method, which means exactly that we can get references\n    // to coeffs, which means exactly that we can have coeff() return a const reference (as opposed to returning a value).\n    // - The is_artihmetic check is required since \"const int\", \"const double\", etc. will cause warnings on some systems\n    // while the declaration of \"const T\", where T is a non arithmetic type does not. Always returning \"const Scalar&\" is\n    // not possible, since the underlying expressions might not offer a valid address the reference could be referring to.\n    typedef typename internal::conditional<bool(internal::traits<Derived>::Flags&LvalueBit),\n                         const Scalar&,\n                         typename internal::conditional<internal::is_arithmetic<Scalar>::value, Scalar, const Scalar>::type\n                     >::type CoeffReturnType;\n\n    typedef typename internal::add_const_on_value_type_if_arithmetic<\n                         typename internal::packet_traits<Scalar>::type\n                     >::type PacketReturnType;\n\n    typedef EigenBase<Derived> Base;\n    using Base::rows;\n    using Base::cols;\n    using Base::size;\n    using Base::derived;\n\n    EIGEN_STRONG_INLINE Index rowIndexByOuterInner(Index outer, Index inner) const\n    {\n      return int(Derived::RowsAtCompileTime) == 1 ? 0\n          : int(Derived::ColsAtCompileTime) == 1 ? inner\n          : int(Derived::Flags)&RowMajorBit ? outer\n          : inner;\n    }\n\n    EIGEN_STRONG_INLINE Index colIndexByOuterInner(Index outer, Index inner) const\n    {\n      return int(Derived::ColsAtCompileTime) == 1 ? 0\n          : int(Derived::RowsAtCompileTime) == 1 ? inner\n          : int(Derived::Flags)&RowMajorBit ? inner\n          : outer;\n    }\n\n    /** Short version: don't use this function, use\n      * \\link operator()(Index,Index) const \\endlink instead.\n      *\n      * Long version: this function is similar to\n      * \\link operator()(Index,Index) const \\endlink, but without the assertion.\n      * Use this for limiting the performance cost of debugging code when doing\n      * repeated coefficient access. Only use this when it is guaranteed that the\n      * parameters \\a row and \\a col are in range.\n      *\n      * If EIGEN_INTERNAL_DEBUGGING is defined, an assertion will be made, making this\n      * function equivalent to \\link operator()(Index,Index) const \\endlink.\n      *\n      * \\sa operator()(Index,Index) const, coeffRef(Index,Index), coeff(Index) const\n      */\n    EIGEN_STRONG_INLINE CoeffReturnType coeff(Index row, Index col) const\n    {\n      eigen_internal_assert(row >= 0 && row < rows()\n                        && col >= 0 && col < cols());\n      return derived().coeff(row, col);\n    }\n\n    EIGEN_STRONG_INLINE CoeffReturnType coeffByOuterInner(Index outer, Index inner) const\n    {\n      return coeff(rowIndexByOuterInner(outer, inner),\n                   colIndexByOuterInner(outer, inner));\n    }\n\n    /** \\returns the coefficient at given the given row and column.\n      *\n      * \\sa operator()(Index,Index), operator[](Index)\n      */\n    EIGEN_STRONG_INLINE CoeffReturnType operator()(Index row, Index col) const\n    {\n      eigen_assert(row >= 0 && row < rows()\n          && col >= 0 && col < cols());\n      return derived().coeff(row, col);\n    }\n\n    /** Short version: don't use this function, use\n      * \\link operator[](Index) const \\endlink instead.\n      *\n      * Long version: this function is similar to\n      * \\link operator[](Index) const \\endlink, but without the assertion.\n      * Use this for limiting the performance cost of debugging code when doing\n      * repeated coefficient access. Only use this when it is guaranteed that the\n      * parameter \\a index is in range.\n      *\n      * If EIGEN_INTERNAL_DEBUGGING is defined, an assertion will be made, making this\n      * function equivalent to \\link operator[](Index) const \\endlink.\n      *\n      * \\sa operator[](Index) const, coeffRef(Index), coeff(Index,Index) const\n      */\n\n    EIGEN_STRONG_INLINE CoeffReturnType\n    coeff(Index index) const\n    {\n      eigen_internal_assert(index >= 0 && index < size());\n      return derived().coeff(index);\n    }\n\n\n    /** \\returns the coefficient at given index.\n      *\n      * This method is allowed only for vector expressions, and for matrix expressions having the LinearAccessBit.\n      *\n      * \\sa operator[](Index), operator()(Index,Index) const, x() const, y() const,\n      * z() const, w() const\n      */\n\n    EIGEN_STRONG_INLINE CoeffReturnType\n    operator[](Index index) const\n    {\n      #ifndef EIGEN2_SUPPORT\n      EIGEN_STATIC_ASSERT(Derived::IsVectorAtCompileTime,\n                          THE_BRACKET_OPERATOR_IS_ONLY_FOR_VECTORS__USE_THE_PARENTHESIS_OPERATOR_INSTEAD)\n      #endif\n      eigen_assert(index >= 0 && index < size());\n      return derived().coeff(index);\n    }\n\n    /** \\returns the coefficient at given index.\n      *\n      * This is synonymous to operator[](Index) const.\n      *\n      * This method is allowed only for vector expressions, and for matrix expressions having the LinearAccessBit.\n      *\n      * \\sa operator[](Index), operator()(Index,Index) const, x() const, y() const,\n      * z() const, w() const\n      */\n\n    EIGEN_STRONG_INLINE CoeffReturnType\n    operator()(Index index) const\n    {\n      eigen_assert(index >= 0 && index < size());\n      return derived().coeff(index);\n    }\n\n    /** equivalent to operator[](0).  */\n\n    EIGEN_STRONG_INLINE CoeffReturnType\n    x() const { return (*this)[0]; }\n\n    /** equivalent to operator[](1).  */\n\n    EIGEN_STRONG_INLINE CoeffReturnType\n    y() const { return (*this)[1]; }\n\n    /** equivalent to operator[](2).  */\n\n    EIGEN_STRONG_INLINE CoeffReturnType\n    z() const { return (*this)[2]; }\n\n    /** equivalent to operator[](3).  */\n\n    EIGEN_STRONG_INLINE CoeffReturnType\n    w() const { return (*this)[3]; }\n\n    /** \\internal\n      * \\returns the packet of coefficients starting at the given row and column. It is your responsibility\n      * to ensure that a packet really starts there. This method is only available on expressions having the\n      * PacketAccessBit.\n      *\n      * The \\a LoadMode parameter may have the value \\a #Aligned or \\a #Unaligned. Its effect is to select\n      * the appropriate vectorization instruction. Aligned access is faster, but is only possible for packets\n      * starting at an address which is a multiple of the packet size.\n      */\n\n    template<int LoadMode>\n    EIGEN_STRONG_INLINE PacketReturnType packet(Index row, Index col) const\n    {\n      eigen_internal_assert(row >= 0 && row < rows()\n                      && col >= 0 && col < cols());\n      return derived().template packet<LoadMode>(row,col);\n    }\n\n\n    /** \\internal */\n    template<int LoadMode>\n    EIGEN_STRONG_INLINE PacketReturnType packetByOuterInner(Index outer, Index inner) const\n    {\n      return packet<LoadMode>(rowIndexByOuterInner(outer, inner),\n                              colIndexByOuterInner(outer, inner));\n    }\n\n    /** \\internal\n      * \\returns the packet of coefficients starting at the given index. It is your responsibility\n      * to ensure that a packet really starts there. This method is only available on expressions having the\n      * PacketAccessBit and the LinearAccessBit.\n      *\n      * The \\a LoadMode parameter may have the value \\a #Aligned or \\a #Unaligned. Its effect is to select\n      * the appropriate vectorization instruction. Aligned access is faster, but is only possible for packets\n      * starting at an address which is a multiple of the packet size.\n      */\n\n    template<int LoadMode>\n    EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const\n    {\n      eigen_internal_assert(index >= 0 && index < size());\n      return derived().template packet<LoadMode>(index);\n    }\n\n  protected:\n    // explanation: DenseBase is doing \"using ...\" on the methods from DenseCoeffsBase.\n    // But some methods are only available in the DirectAccess case.\n    // So we add dummy methods here with these names, so that \"using... \" doesn't fail.\n    // It's not private so that the child class DenseBase can access them, and it's not public\n    // either since it's an implementation detail, so has to be protected.\n    void coeffRef();\n    void coeffRefByOuterInner();\n    void writePacket();\n    void writePacketByOuterInner();\n    void copyCoeff();\n    void copyCoeffByOuterInner();\n    void copyPacket();\n    void copyPacketByOuterInner();\n    void stride();\n    void innerStride();\n    void outerStride();\n    void rowStride();\n    void colStride();\n};\n\n/** \\brief Base class providing read/write coefficient access to matrices and arrays.\n  * \\ingroup Core_Module\n  * \\tparam Derived Type of the derived class\n  * \\tparam #WriteAccessors Constant indicating read/write access\n  *\n  * This class defines the non-const \\c operator() function and friends, which can be used to write specific\n  * entries of a matrix or array. This class inherits DenseCoeffsBase<Derived, ReadOnlyAccessors> which\n  * defines the const variant for reading specific entries.\n  * \n  * \\sa DenseCoeffsBase<Derived, DirectAccessors>, \\ref TopicClassHierarchy\n  */\ntemplate<typename Derived>\nclass DenseCoeffsBase<Derived, WriteAccessors> : public DenseCoeffsBase<Derived, ReadOnlyAccessors>\n{\n  public:\n\n    typedef DenseCoeffsBase<Derived, ReadOnlyAccessors> Base;\n\n    typedef typename internal::traits<Derived>::StorageKind StorageKind;\n    typedef typename internal::traits<Derived>::Index Index;\n    typedef typename internal::traits<Derived>::Scalar Scalar;\n    typedef typename internal::packet_traits<Scalar>::type PacketScalar;\n    typedef typename NumTraits<Scalar>::Real RealScalar;\n\n    using Base::coeff;\n    using Base::rows;\n    using Base::cols;\n    using Base::size;\n    using Base::derived;\n    using Base::rowIndexByOuterInner;\n    using Base::colIndexByOuterInner;\n    using Base::operator[];\n    using Base::operator();\n    using Base::x;\n    using Base::y;\n    using Base::z;\n    using Base::w;\n\n    /** Short version: don't use this function, use\n      * \\link operator()(Index,Index) \\endlink instead.\n      *\n      * Long version: this function is similar to\n      * \\link operator()(Index,Index) \\endlink, but without the assertion.\n      * Use this for limiting the performance cost of debugging code when doing\n      * repeated coefficient access. Only use this when it is guaranteed that the\n      * parameters \\a row and \\a col are in range.\n      *\n      * If EIGEN_INTERNAL_DEBUGGING is defined, an assertion will be made, making this\n      * function equivalent to \\link operator()(Index,Index) \\endlink.\n      *\n      * \\sa operator()(Index,Index), coeff(Index, Index) const, coeffRef(Index)\n      */\n    EIGEN_STRONG_INLINE Scalar& coeffRef(Index row, Index col)\n    {\n      eigen_internal_assert(row >= 0 && row < rows()\n                        && col >= 0 && col < cols());\n      return derived().coeffRef(row, col);\n    }\n\n    EIGEN_STRONG_INLINE Scalar&\n    coeffRefByOuterInner(Index outer, Index inner)\n    {\n      return coeffRef(rowIndexByOuterInner(outer, inner),\n                      colIndexByOuterInner(outer, inner));\n    }\n\n    /** \\returns a reference to the coefficient at given the given row and column.\n      *\n      * \\sa operator[](Index)\n      */\n\n    EIGEN_STRONG_INLINE Scalar&\n    operator()(Index row, Index col)\n    {\n      eigen_assert(row >= 0 && row < rows()\n          && col >= 0 && col < cols());\n      return derived().coeffRef(row, col);\n    }\n\n\n    /** Short version: don't use this function, use\n      * \\link operator[](Index) \\endlink instead.\n      *\n      * Long version: this function is similar to\n      * \\link operator[](Index) \\endlink, but without the assertion.\n      * Use this for limiting the performance cost of debugging code when doing\n      * repeated coefficient access. Only use this when it is guaranteed that the\n      * parameters \\a row and \\a col are in range.\n      *\n      * If EIGEN_INTERNAL_DEBUGGING is defined, an assertion will be made, making this\n      * function equivalent to \\link operator[](Index) \\endlink.\n      *\n      * \\sa operator[](Index), coeff(Index) const, coeffRef(Index,Index)\n      */\n\n    EIGEN_STRONG_INLINE Scalar&\n    coeffRef(Index index)\n    {\n      eigen_internal_assert(index >= 0 && index < size());\n      return derived().coeffRef(index);\n    }\n\n    /** \\returns a reference to the coefficient at given index.\n      *\n      * This method is allowed only for vector expressions, and for matrix expressions having the LinearAccessBit.\n      *\n      * \\sa operator[](Index) const, operator()(Index,Index), x(), y(), z(), w()\n      */\n\n    EIGEN_STRONG_INLINE Scalar&\n    operator[](Index index)\n    {\n      #ifndef EIGEN2_SUPPORT\n      EIGEN_STATIC_ASSERT(Derived::IsVectorAtCompileTime,\n                          THE_BRACKET_OPERATOR_IS_ONLY_FOR_VECTORS__USE_THE_PARENTHESIS_OPERATOR_INSTEAD)\n      #endif\n      eigen_assert(index >= 0 && index < size());\n      return derived().coeffRef(index);\n    }\n\n    /** \\returns a reference to the coefficient at given index.\n      *\n      * This is synonymous to operator[](Index).\n      *\n      * This method is allowed only for vector expressions, and for matrix expressions having the LinearAccessBit.\n      *\n      * \\sa operator[](Index) const, operator()(Index,Index), x(), y(), z(), w()\n      */\n\n    EIGEN_STRONG_INLINE Scalar&\n    operator()(Index index)\n    {\n      eigen_assert(index >= 0 && index < size());\n      return derived().coeffRef(index);\n    }\n\n    /** equivalent to operator[](0).  */\n\n    EIGEN_STRONG_INLINE Scalar&\n    x() { return (*this)[0]; }\n\n    /** equivalent to operator[](1).  */\n\n    EIGEN_STRONG_INLINE Scalar&\n    y() { return (*this)[1]; }\n\n    /** equivalent to operator[](2).  */\n\n    EIGEN_STRONG_INLINE Scalar&\n    z() { return (*this)[2]; }\n\n    /** equivalent to operator[](3).  */\n\n    EIGEN_STRONG_INLINE Scalar&\n    w() { return (*this)[3]; }\n\n    /** \\internal\n      * Stores the given packet of coefficients, at the given row and column of this expression. It is your responsibility\n      * to ensure that a packet really starts there. This method is only available on expressions having the\n      * PacketAccessBit.\n      *\n      * The \\a LoadMode parameter may have the value \\a #Aligned or \\a #Unaligned. Its effect is to select\n      * the appropriate vectorization instruction. Aligned access is faster, but is only possible for packets\n      * starting at an address which is a multiple of the packet size.\n      */\n\n    template<int StoreMode>\n    EIGEN_STRONG_INLINE void writePacket\n    (Index row, Index col, const typename internal::packet_traits<Scalar>::type& val)\n    {\n      eigen_internal_assert(row >= 0 && row < rows()\n                        && col >= 0 && col < cols());\n      derived().template writePacket<StoreMode>(row,col,val);\n    }\n\n\n    /** \\internal */\n    template<int StoreMode>\n    EIGEN_STRONG_INLINE void writePacketByOuterInner\n    (Index outer, Index inner, const typename internal::packet_traits<Scalar>::type& val)\n    {\n      writePacket<StoreMode>(rowIndexByOuterInner(outer, inner),\n                            colIndexByOuterInner(outer, inner),\n                            val);\n    }\n\n    /** \\internal\n      * Stores the given packet of coefficients, at the given index in this expression. It is your responsibility\n      * to ensure that a packet really starts there. This method is only available on expressions having the\n      * PacketAccessBit and the LinearAccessBit.\n      *\n      * The \\a LoadMode parameter may have the value \\a Aligned or \\a Unaligned. Its effect is to select\n      * the appropriate vectorization instruction. Aligned access is faster, but is only possible for packets\n      * starting at an address which is a multiple of the packet size.\n      */\n    template<int StoreMode>\n    EIGEN_STRONG_INLINE void writePacket\n    (Index index, const typename internal::packet_traits<Scalar>::type& val)\n    {\n      eigen_internal_assert(index >= 0 && index < size());\n      derived().template writePacket<StoreMode>(index,val);\n    }\n\n#ifndef EIGEN_PARSED_BY_DOXYGEN\n\n    /** \\internal Copies the coefficient at position (row,col) of other into *this.\n      *\n      * This method is overridden in SwapWrapper, allowing swap() assignments to share 99% of their code\n      * with usual assignments.\n      *\n      * Outside of this internal usage, this method has probably no usefulness. It is hidden in the public API dox.\n      */\n\n    template<typename OtherDerived>\n    EIGEN_STRONG_INLINE void copyCoeff(Index row, Index col, const DenseBase<OtherDerived>& other)\n    {\n      eigen_internal_assert(row >= 0 && row < rows()\n                        && col >= 0 && col < cols());\n      derived().coeffRef(row, col) = other.derived().coeff(row, col);\n    }\n\n    /** \\internal Copies the coefficient at the given index of other into *this.\n      *\n      * This method is overridden in SwapWrapper, allowing swap() assignments to share 99% of their code\n      * with usual assignments.\n      *\n      * Outside of this internal usage, this method has probably no usefulness. It is hidden in the public API dox.\n      */\n\n    template<typename OtherDerived>\n    EIGEN_STRONG_INLINE void copyCoeff(Index index, const DenseBase<OtherDerived>& other)\n    {\n      eigen_internal_assert(index >= 0 && index < size());\n      derived().coeffRef(index) = other.derived().coeff(index);\n    }\n\n\n    template<typename OtherDerived>\n    EIGEN_STRONG_INLINE void copyCoeffByOuterInner(Index outer, Index inner, const DenseBase<OtherDerived>& other)\n    {\n      const Index row = rowIndexByOuterInner(outer,inner);\n      const Index col = colIndexByOuterInner(outer,inner);\n      // derived() is important here: copyCoeff() may be reimplemented in Derived!\n      derived().copyCoeff(row, col, other);\n    }\n\n    /** \\internal Copies the packet at position (row,col) of other into *this.\n      *\n      * This method is overridden in SwapWrapper, allowing swap() assignments to share 99% of their code\n      * with usual assignments.\n      *\n      * Outside of this internal usage, this method has probably no usefulness. It is hidden in the public API dox.\n      */\n\n    template<typename OtherDerived, int StoreMode, int LoadMode>\n    EIGEN_STRONG_INLINE void copyPacket(Index row, Index col, const DenseBase<OtherDerived>& other)\n    {\n      eigen_internal_assert(row >= 0 && row < rows()\n                        && col >= 0 && col < cols());\n      derived().template writePacket<StoreMode>(row, col,\n        other.derived().template packet<LoadMode>(row, col));\n    }\n\n    /** \\internal Copies the packet at the given index of other into *this.\n      *\n      * This method is overridden in SwapWrapper, allowing swap() assignments to share 99% of their code\n      * with usual assignments.\n      *\n      * Outside of this internal usage, this method has probably no usefulness. It is hidden in the public API dox.\n      */\n\n    template<typename OtherDerived, int StoreMode, int LoadMode>\n    EIGEN_STRONG_INLINE void copyPacket(Index index, const DenseBase<OtherDerived>& other)\n    {\n      eigen_internal_assert(index >= 0 && index < size());\n      derived().template writePacket<StoreMode>(index,\n        other.derived().template packet<LoadMode>(index));\n    }\n\n    /** \\internal */\n    template<typename OtherDerived, int StoreMode, int LoadMode>\n    EIGEN_STRONG_INLINE void copyPacketByOuterInner(Index outer, Index inner, const DenseBase<OtherDerived>& other)\n    {\n      const Index row = rowIndexByOuterInner(outer,inner);\n      const Index col = colIndexByOuterInner(outer,inner);\n      // derived() is important here: copyCoeff() may be reimplemented in Derived!\n      derived().template copyPacket< OtherDerived, StoreMode, LoadMode>(row, col, other);\n    }\n#endif\n\n};\n\n/** \\brief Base class providing direct read-only coefficient access to matrices and arrays.\n  * \\ingroup Core_Module\n  * \\tparam Derived Type of the derived class\n  * \\tparam #DirectAccessors Constant indicating direct access\n  *\n  * This class defines functions to work with strides which can be used to access entries directly. This class\n  * inherits DenseCoeffsBase<Derived, ReadOnlyAccessors> which defines functions to access entries read-only using\n  * \\c operator() .\n  *\n  * \\sa \\ref TopicClassHierarchy\n  */\ntemplate<typename Derived>\nclass DenseCoeffsBase<Derived, DirectAccessors> : public DenseCoeffsBase<Derived, ReadOnlyAccessors>\n{\n  public:\n\n    typedef DenseCoeffsBase<Derived, ReadOnlyAccessors> Base;\n    typedef typename internal::traits<Derived>::Index Index;\n    typedef typename internal::traits<Derived>::Scalar Scalar;\n    typedef typename NumTraits<Scalar>::Real RealScalar;\n\n    using Base::rows;\n    using Base::cols;\n    using Base::size;\n    using Base::derived;\n\n    /** \\returns the pointer increment between two consecutive elements within a slice in the inner direction.\n      *\n      * \\sa outerStride(), rowStride(), colStride()\n      */\n    inline Index innerStride() const\n    {\n      return derived().innerStride();\n    }\n\n    /** \\returns the pointer increment between two consecutive inner slices (for example, between two consecutive columns\n      *          in a column-major matrix).\n      *\n      * \\sa innerStride(), rowStride(), colStride()\n      */\n    inline Index outerStride() const\n    {\n      return derived().outerStride();\n    }\n\n    // FIXME shall we remove it ?\n    inline Index stride() const\n    {\n      return Derived::IsVectorAtCompileTime ? innerStride() : outerStride();\n    }\n\n    /** \\returns the pointer increment between two consecutive rows.\n      *\n      * \\sa innerStride(), outerStride(), colStride()\n      */\n    inline Index rowStride() const\n    {\n      return Derived::IsRowMajor ? outerStride() : innerStride();\n    }\n\n    /** \\returns the pointer increment between two consecutive columns.\n      *\n      * \\sa innerStride(), outerStride(), rowStride()\n      */\n    inline Index colStride() const\n    {\n      return Derived::IsRowMajor ? innerStride() : outerStride();\n    }\n};\n\n/** \\brief Base class providing direct read/write coefficient access to matrices and arrays.\n  * \\ingroup Core_Module\n  * \\tparam Derived Type of the derived class\n  * \\tparam #DirectWriteAccessors Constant indicating direct access\n  *\n  * This class defines functions to work with strides which can be used to access entries directly. This class\n  * inherits DenseCoeffsBase<Derived, WriteAccessors> which defines functions to access entries read/write using\n  * \\c operator().\n  *\n  * \\sa \\ref TopicClassHierarchy\n  */\ntemplate<typename Derived>\nclass DenseCoeffsBase<Derived, DirectWriteAccessors>\n  : public DenseCoeffsBase<Derived, WriteAccessors>\n{\n  public:\n\n    typedef DenseCoeffsBase<Derived, WriteAccessors> Base;\n    typedef typename internal::traits<Derived>::Index Index;\n    typedef typename internal::traits<Derived>::Scalar Scalar;\n    typedef typename NumTraits<Scalar>::Real RealScalar;\n\n    using Base::rows;\n    using Base::cols;\n    using Base::size;\n    using Base::derived;\n\n    /** \\returns the pointer increment between two consecutive elements within a slice in the inner direction.\n      *\n      * \\sa outerStride(), rowStride(), colStride()\n      */\n    inline Index innerStride() const\n    {\n      return derived().innerStride();\n    }\n\n    /** \\returns the pointer increment between two consecutive inner slices (for example, between two consecutive columns\n      *          in a column-major matrix).\n      *\n      * \\sa innerStride(), rowStride(), colStride()\n      */\n    inline Index outerStride() const\n    {\n      return derived().outerStride();\n    }\n\n    // FIXME shall we remove it ?\n    inline Index stride() const\n    {\n      return Derived::IsVectorAtCompileTime ? innerStride() : outerStride();\n    }\n\n    /** \\returns the pointer increment between two consecutive rows.\n      *\n      * \\sa innerStride(), outerStride(), colStride()\n      */\n    inline Index rowStride() const\n    {\n      return Derived::IsRowMajor ? outerStride() : innerStride();\n    }\n\n    /** \\returns the pointer increment between two consecutive columns.\n      *\n      * \\sa innerStride(), outerStride(), rowStride()\n      */\n    inline Index colStride() const\n    {\n      return Derived::IsRowMajor ? innerStride() : outerStride();\n    }\n};\n\nnamespace internal {\n\ntemplate<typename Derived, bool JustReturnZero>\nstruct first_aligned_impl\n{\n  static inline typename Derived::Index run(const Derived&)\n  { return 0; }\n};\n\ntemplate<typename Derived>\nstruct first_aligned_impl<Derived, false>\n{\n  static inline typename Derived::Index run(const Derived& m)\n  {\n    return internal::first_aligned(&m.const_cast_derived().coeffRef(0,0), m.size());\n  }\n};\n\n/** \\internal \\returns the index of the first element of the array that is well aligned for vectorization.\n  *\n  * There is also the variant first_aligned(const Scalar*, Integer) defined in Memory.h. See it for more\n  * documentation.\n  */\ntemplate<typename Derived>\nstatic inline typename Derived::Index first_aligned(const Derived& m)\n{\n  return first_aligned_impl\n          <Derived, (Derived::Flags & AlignedBit) || !(Derived::Flags & DirectAccessBit)>\n          ::run(m);\n}\n\ntemplate<typename Derived, bool HasDirectAccess = has_direct_access<Derived>::ret>\nstruct inner_stride_at_compile_time\n{\n  enum { ret = traits<Derived>::InnerStrideAtCompileTime };\n};\n\ntemplate<typename Derived>\nstruct inner_stride_at_compile_time<Derived, false>\n{\n  enum { ret = 0 };\n};\n\ntemplate<typename Derived, bool HasDirectAccess = has_direct_access<Derived>::ret>\nstruct outer_stride_at_compile_time\n{\n  enum { ret = traits<Derived>::OuterStrideAtCompileTime };\n};\n\ntemplate<typename Derived>\nstruct outer_stride_at_compile_time<Derived, false>\n{\n  enum { ret = 0 };\n};\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_DENSECOEFFSBASE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/DenseStorage.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2006-2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n// Copyright (C) 2010 Hauke Heibel <hauke.heibel@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_MATRIXSTORAGE_H\n#define EIGEN_MATRIXSTORAGE_H\n\n#ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN\n  #define EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN EIGEN_DENSE_STORAGE_CTOR_PLUGIN;\n#else\n  #define EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN\n#endif\n\nnamespace Eigen {\n\nnamespace internal {\n\nstruct constructor_without_unaligned_array_assert {};\n\ntemplate<typename T, int Size> void check_static_allocation_size()\n{\n  // if EIGEN_STACK_ALLOCATION_LIMIT is defined to 0, then no limit\n  #if EIGEN_STACK_ALLOCATION_LIMIT\n  EIGEN_STATIC_ASSERT(Size * sizeof(T) <= EIGEN_STACK_ALLOCATION_LIMIT, OBJECT_ALLOCATED_ON_STACK_IS_TOO_BIG);\n  #endif\n}\n\n/** \\internal\n  * Static array. If the MatrixOrArrayOptions require auto-alignment, the array will be automatically aligned:\n  * to 16 bytes boundary if the total size is a multiple of 16 bytes.\n  */\ntemplate <typename T, int Size, int MatrixOrArrayOptions,\n          int Alignment = (MatrixOrArrayOptions&DontAlign) ? 0\n                        : (((Size*sizeof(T))%16)==0) ? 16\n                        : 0 >\nstruct plain_array\n{\n  T array[Size];\n\n  plain_array() \n  { \n    check_static_allocation_size<T,Size>();\n  }\n\n  plain_array(constructor_without_unaligned_array_assert) \n  { \n    check_static_allocation_size<T,Size>();\n  }\n};\n\n#if defined(EIGEN_DISABLE_UNALIGNED_ARRAY_ASSERT)\n  #define EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(sizemask)\n#elif EIGEN_GNUC_AT_LEAST(4,7) \n  // GCC 4.7 is too aggressive in its optimizations and remove the alignement test based on the fact the array is declared to be aligned.\n  // See this bug report: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53900\n  // Hiding the origin of the array pointer behind a function argument seems to do the trick even if the function is inlined:\n  template<typename PtrType>\n  EIGEN_ALWAYS_INLINE PtrType eigen_unaligned_array_assert_workaround_gcc47(PtrType array) { return array; }\n  #define EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(sizemask) \\\n    eigen_assert((reinterpret_cast<size_t>(eigen_unaligned_array_assert_workaround_gcc47(array)) & sizemask) == 0 \\\n              && \"this assertion is explained here: \" \\\n              \"http://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html\" \\\n              \" **** READ THIS WEB PAGE !!! ****\");\n#else\n  #define EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(sizemask) \\\n    eigen_assert((reinterpret_cast<size_t>(array) & sizemask) == 0 \\\n              && \"this assertion is explained here: \" \\\n              \"http://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html\" \\\n              \" **** READ THIS WEB PAGE !!! ****\");\n#endif\n\ntemplate <typename T, int Size, int MatrixOrArrayOptions>\nstruct plain_array<T, Size, MatrixOrArrayOptions, 16>\n{\n  EIGEN_USER_ALIGN16 T array[Size];\n\n  plain_array() \n  { \n    EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(0xf);\n    check_static_allocation_size<T,Size>();\n  }\n\n  plain_array(constructor_without_unaligned_array_assert) \n  { \n    check_static_allocation_size<T,Size>();\n  }\n};\n\ntemplate <typename T, int MatrixOrArrayOptions, int Alignment>\nstruct plain_array<T, 0, MatrixOrArrayOptions, Alignment>\n{\n  EIGEN_USER_ALIGN16 T array[1];\n  plain_array() {}\n  plain_array(constructor_without_unaligned_array_assert) {}\n};\n\n} // end namespace internal\n\n/** \\internal\n  *\n  * \\class DenseStorage\n  * \\ingroup Core_Module\n  *\n  * \\brief Stores the data of a matrix\n  *\n  * This class stores the data of fixed-size, dynamic-size or mixed matrices\n  * in a way as compact as possible.\n  *\n  * \\sa Matrix\n  */\ntemplate<typename T, int Size, int _Rows, int _Cols, int _Options> class DenseStorage;\n\n// purely fixed-size matrix\ntemplate<typename T, int Size, int _Rows, int _Cols, int _Options> class DenseStorage\n{\n    internal::plain_array<T,Size,_Options> m_data;\n  public:\n    DenseStorage() {}\n    DenseStorage(internal::constructor_without_unaligned_array_assert)\n      : m_data(internal::constructor_without_unaligned_array_assert()) {}\n    DenseStorage(const DenseStorage& other) : m_data(other.m_data) {}\n    DenseStorage& operator=(const DenseStorage& other)\n    {\n      if (this != &other) m_data = other.m_data;\n      return *this;\n    }\n    DenseStorage(DenseIndex,DenseIndex,DenseIndex) {}\n    void swap(DenseStorage& other) { std::swap(m_data,other.m_data); }\n    static DenseIndex rows(void) {return _Rows;}\n    static DenseIndex cols(void) {return _Cols;}\n    void conservativeResize(DenseIndex,DenseIndex,DenseIndex) {}\n    void resize(DenseIndex,DenseIndex,DenseIndex) {}\n    const T *data() const { return m_data.array; }\n    T *data() { return m_data.array; }\n};\n\n// null matrix\ntemplate<typename T, int _Rows, int _Cols, int _Options> class DenseStorage<T, 0, _Rows, _Cols, _Options>\n{\n  public:\n    DenseStorage() {}\n    DenseStorage(internal::constructor_without_unaligned_array_assert) {}\n    DenseStorage(const DenseStorage&) {}\n    DenseStorage& operator=(const DenseStorage&) { return *this; }\n    DenseStorage(DenseIndex,DenseIndex,DenseIndex) {}\n    void swap(DenseStorage& ) {}\n    static DenseIndex rows(void) {return _Rows;}\n    static DenseIndex cols(void) {return _Cols;}\n    void conservativeResize(DenseIndex,DenseIndex,DenseIndex) {}\n    void resize(DenseIndex,DenseIndex,DenseIndex) {}\n    const T *data() const { return 0; }\n    T *data() { return 0; }\n};\n\n// more specializations for null matrices; these are necessary to resolve ambiguities\ntemplate<typename T, int _Options> class DenseStorage<T, 0, Dynamic, Dynamic, _Options>\n: public DenseStorage<T, 0, 0, 0, _Options> { };\n\ntemplate<typename T, int _Rows, int _Options> class DenseStorage<T, 0, _Rows, Dynamic, _Options>\n: public DenseStorage<T, 0, 0, 0, _Options> { };\n\ntemplate<typename T, int _Cols, int _Options> class DenseStorage<T, 0, Dynamic, _Cols, _Options>\n: public DenseStorage<T, 0, 0, 0, _Options> { };\n\n// dynamic-size matrix with fixed-size storage\ntemplate<typename T, int Size, int _Options> class DenseStorage<T, Size, Dynamic, Dynamic, _Options>\n{\n    internal::plain_array<T,Size,_Options> m_data;\n    DenseIndex m_rows;\n    DenseIndex m_cols;\n  public:\n    DenseStorage() : m_rows(0), m_cols(0) {}\n    DenseStorage(internal::constructor_without_unaligned_array_assert)\n      : m_data(internal::constructor_without_unaligned_array_assert()), m_rows(0), m_cols(0) {}\n    DenseStorage(const DenseStorage& other) : m_data(other.m_data), m_rows(other.m_rows), m_cols(other.m_cols) {}\n    DenseStorage& operator=(const DenseStorage& other)\n    {\n      if (this != &other)\n      {\n        m_data = other.m_data;\n        m_rows = other.m_rows;\n        m_cols = other.m_cols;\n      }\n      return *this;\n    }\n    DenseStorage(DenseIndex, DenseIndex nbRows, DenseIndex nbCols) : m_rows(nbRows), m_cols(nbCols) {}\n    void swap(DenseStorage& other)\n    { std::swap(m_data,other.m_data); std::swap(m_rows,other.m_rows); std::swap(m_cols,other.m_cols); }\n    DenseIndex rows() const {return m_rows;}\n    DenseIndex cols() const {return m_cols;}\n    void conservativeResize(DenseIndex, DenseIndex nbRows, DenseIndex nbCols) { m_rows = nbRows; m_cols = nbCols; }\n    void resize(DenseIndex, DenseIndex nbRows, DenseIndex nbCols) { m_rows = nbRows; m_cols = nbCols; }\n    const T *data() const { return m_data.array; }\n    T *data() { return m_data.array; }\n};\n\n// dynamic-size matrix with fixed-size storage and fixed width\ntemplate<typename T, int Size, int _Cols, int _Options> class DenseStorage<T, Size, Dynamic, _Cols, _Options>\n{\n    internal::plain_array<T,Size,_Options> m_data;\n    DenseIndex m_rows;\n  public:\n    DenseStorage() : m_rows(0) {}\n    DenseStorage(internal::constructor_without_unaligned_array_assert)\n      : m_data(internal::constructor_without_unaligned_array_assert()), m_rows(0) {}\n    DenseStorage(const DenseStorage& other) : m_data(other.m_data), m_rows(other.m_rows) {}\n    DenseStorage& operator=(const DenseStorage& other)\n    {\n      if (this != &other)\n      {\n        m_data = other.m_data;\n        m_rows = other.m_rows;\n      }\n      return *this;\n    }\n    DenseStorage(DenseIndex, DenseIndex nbRows, DenseIndex) : m_rows(nbRows) {}\n    void swap(DenseStorage& other) { std::swap(m_data,other.m_data); std::swap(m_rows,other.m_rows); }\n    DenseIndex rows(void) const {return m_rows;}\n    DenseIndex cols(void) const {return _Cols;}\n    void conservativeResize(DenseIndex, DenseIndex nbRows, DenseIndex) { m_rows = nbRows; }\n    void resize(DenseIndex, DenseIndex nbRows, DenseIndex) { m_rows = nbRows; }\n    const T *data() const { return m_data.array; }\n    T *data() { return m_data.array; }\n};\n\n// dynamic-size matrix with fixed-size storage and fixed height\ntemplate<typename T, int Size, int _Rows, int _Options> class DenseStorage<T, Size, _Rows, Dynamic, _Options>\n{\n    internal::plain_array<T,Size,_Options> m_data;\n    DenseIndex m_cols;\n  public:\n    DenseStorage() : m_cols(0) {}\n    DenseStorage(internal::constructor_without_unaligned_array_assert)\n      : m_data(internal::constructor_without_unaligned_array_assert()), m_cols(0) {}\n    DenseStorage(const DenseStorage& other) : m_data(other.m_data), m_cols(other.m_cols) {}\n    DenseStorage& operator=(const DenseStorage& other)\n    {\n      if (this != &other)\n      {\n        m_data = other.m_data;\n        m_cols = other.m_cols;\n      }\n      return *this;\n    }\n    DenseStorage(DenseIndex, DenseIndex, DenseIndex nbCols) : m_cols(nbCols) {}\n    void swap(DenseStorage& other) { std::swap(m_data,other.m_data); std::swap(m_cols,other.m_cols); }\n    DenseIndex rows(void) const {return _Rows;}\n    DenseIndex cols(void) const {return m_cols;}\n    void conservativeResize(DenseIndex, DenseIndex, DenseIndex nbCols) { m_cols = nbCols; }\n    void resize(DenseIndex, DenseIndex, DenseIndex nbCols) { m_cols = nbCols; }\n    const T *data() const { return m_data.array; }\n    T *data() { return m_data.array; }\n};\n\n// purely dynamic matrix.\ntemplate<typename T, int _Options> class DenseStorage<T, Dynamic, Dynamic, Dynamic, _Options>\n{\n    T *m_data;\n    DenseIndex m_rows;\n    DenseIndex m_cols;\n  public:\n    DenseStorage() : m_data(0), m_rows(0), m_cols(0) {}\n    DenseStorage(internal::constructor_without_unaligned_array_assert)\n       : m_data(0), m_rows(0), m_cols(0) {}\n    DenseStorage(DenseIndex size, DenseIndex nbRows, DenseIndex nbCols)\n      : m_data(internal::conditional_aligned_new_auto<T,(_Options&DontAlign)==0>(size)), m_rows(nbRows), m_cols(nbCols)\n    { EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN }\n#ifdef EIGEN_HAVE_RVALUE_REFERENCES\n    DenseStorage(DenseStorage&& other)\n      : m_data(std::move(other.m_data))\n      , m_rows(std::move(other.m_rows))\n      , m_cols(std::move(other.m_cols))\n    {\n      other.m_data = nullptr;\n    }\n    DenseStorage& operator=(DenseStorage&& other)\n    {\n      using std::swap;\n      swap(m_data, other.m_data);\n      swap(m_rows, other.m_rows);\n      swap(m_cols, other.m_cols);\n      return *this;\n    }\n#endif\n    ~DenseStorage() { internal::conditional_aligned_delete_auto<T,(_Options&DontAlign)==0>(m_data, m_rows*m_cols); }\n    void swap(DenseStorage& other)\n    { std::swap(m_data,other.m_data); std::swap(m_rows,other.m_rows); std::swap(m_cols,other.m_cols); }\n    DenseIndex rows(void) const {return m_rows;}\n    DenseIndex cols(void) const {return m_cols;}\n    void conservativeResize(DenseIndex size, DenseIndex nbRows, DenseIndex nbCols)\n    {\n      m_data = internal::conditional_aligned_realloc_new_auto<T,(_Options&DontAlign)==0>(m_data, size, m_rows*m_cols);\n      m_rows = nbRows;\n      m_cols = nbCols;\n    }\n    void resize(DenseIndex size, DenseIndex nbRows, DenseIndex nbCols)\n    {\n      if(size != m_rows*m_cols)\n      {\n        internal::conditional_aligned_delete_auto<T,(_Options&DontAlign)==0>(m_data, m_rows*m_cols);\n        if (size)\n          m_data = internal::conditional_aligned_new_auto<T,(_Options&DontAlign)==0>(size);\n        else\n          m_data = 0;\n        EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN\n      }\n      m_rows = nbRows;\n      m_cols = nbCols;\n    }\n    const T *data() const { return m_data; }\n    T *data() { return m_data; }\n  private:\n    DenseStorage(const DenseStorage&);\n    DenseStorage& operator=(const DenseStorage&);\n};\n\n// matrix with dynamic width and fixed height (so that matrix has dynamic size).\ntemplate<typename T, int _Rows, int _Options> class DenseStorage<T, Dynamic, _Rows, Dynamic, _Options>\n{\n    T *m_data;\n    DenseIndex m_cols;\n  public:\n    DenseStorage() : m_data(0), m_cols(0) {}\n    DenseStorage(internal::constructor_without_unaligned_array_assert) : m_data(0), m_cols(0) {}\n    DenseStorage(DenseIndex size, DenseIndex, DenseIndex nbCols) : m_data(internal::conditional_aligned_new_auto<T,(_Options&DontAlign)==0>(size)), m_cols(nbCols)\n    { EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN }\n#ifdef EIGEN_HAVE_RVALUE_REFERENCES\n    DenseStorage(DenseStorage&& other)\n      : m_data(std::move(other.m_data))\n      , m_cols(std::move(other.m_cols))\n    {\n      other.m_data = nullptr;\n    }\n    DenseStorage& operator=(DenseStorage&& other)\n    {\n      using std::swap;\n      swap(m_data, other.m_data);\n      swap(m_cols, other.m_cols);\n      return *this;\n    }\n#endif\n    ~DenseStorage() { internal::conditional_aligned_delete_auto<T,(_Options&DontAlign)==0>(m_data, _Rows*m_cols); }\n    void swap(DenseStorage& other) { std::swap(m_data,other.m_data); std::swap(m_cols,other.m_cols); }\n    static DenseIndex rows(void) {return _Rows;}\n    DenseIndex cols(void) const {return m_cols;}\n    void conservativeResize(DenseIndex size, DenseIndex, DenseIndex nbCols)\n    {\n      m_data = internal::conditional_aligned_realloc_new_auto<T,(_Options&DontAlign)==0>(m_data, size, _Rows*m_cols);\n      m_cols = nbCols;\n    }\n    EIGEN_STRONG_INLINE void resize(DenseIndex size, DenseIndex, DenseIndex nbCols)\n    {\n      if(size != _Rows*m_cols)\n      {\n        internal::conditional_aligned_delete_auto<T,(_Options&DontAlign)==0>(m_data, _Rows*m_cols);\n        if (size)\n          m_data = internal::conditional_aligned_new_auto<T,(_Options&DontAlign)==0>(size);\n        else\n          m_data = 0;\n        EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN\n      }\n      m_cols = nbCols;\n    }\n    const T *data() const { return m_data; }\n    T *data() { return m_data; }\n  private:\n    DenseStorage(const DenseStorage&);\n    DenseStorage& operator=(const DenseStorage&);\n};\n\n// matrix with dynamic height and fixed width (so that matrix has dynamic size).\ntemplate<typename T, int _Cols, int _Options> class DenseStorage<T, Dynamic, Dynamic, _Cols, _Options>\n{\n    T *m_data;\n    DenseIndex m_rows;\n  public:\n    DenseStorage() : m_data(0), m_rows(0) {}\n    DenseStorage(internal::constructor_without_unaligned_array_assert) : m_data(0), m_rows(0) {}\n    DenseStorage(DenseIndex size, DenseIndex nbRows, DenseIndex) : m_data(internal::conditional_aligned_new_auto<T,(_Options&DontAlign)==0>(size)), m_rows(nbRows)\n    { EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN }\n#ifdef EIGEN_HAVE_RVALUE_REFERENCES\n    DenseStorage(DenseStorage&& other)\n      : m_data(std::move(other.m_data))\n      , m_rows(std::move(other.m_rows))\n    {\n      other.m_data = nullptr;\n    }\n    DenseStorage& operator=(DenseStorage&& other)\n    {\n      using std::swap;\n      swap(m_data, other.m_data);\n      swap(m_rows, other.m_rows);\n      return *this;\n    }\n#endif\n    ~DenseStorage() { internal::conditional_aligned_delete_auto<T,(_Options&DontAlign)==0>(m_data, _Cols*m_rows); }\n    void swap(DenseStorage& other) { std::swap(m_data,other.m_data); std::swap(m_rows,other.m_rows); }\n    DenseIndex rows(void) const {return m_rows;}\n    static DenseIndex cols(void) {return _Cols;}\n    void conservativeResize(DenseIndex size, DenseIndex nbRows, DenseIndex)\n    {\n      m_data = internal::conditional_aligned_realloc_new_auto<T,(_Options&DontAlign)==0>(m_data, size, m_rows*_Cols);\n      m_rows = nbRows;\n    }\n    EIGEN_STRONG_INLINE void resize(DenseIndex size, DenseIndex nbRows, DenseIndex)\n    {\n      if(size != m_rows*_Cols)\n      {\n        internal::conditional_aligned_delete_auto<T,(_Options&DontAlign)==0>(m_data, _Cols*m_rows);\n        if (size)\n          m_data = internal::conditional_aligned_new_auto<T,(_Options&DontAlign)==0>(size);\n        else\n          m_data = 0;\n        EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN\n      }\n      m_rows = nbRows;\n    }\n    const T *data() const { return m_data; }\n    T *data() { return m_data; }\n  private:\n    DenseStorage(const DenseStorage&);\n    DenseStorage& operator=(const DenseStorage&);\n};\n\n} // end namespace Eigen\n\n#endif // EIGEN_MATRIX_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/Diagonal.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2007-2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_DIAGONAL_H\n#define EIGEN_DIAGONAL_H\n\nnamespace Eigen { \n\n/** \\class Diagonal\n  * \\ingroup Core_Module\n  *\n  * \\brief Expression of a diagonal/subdiagonal/superdiagonal in a matrix\n  *\n  * \\param MatrixType the type of the object in which we are taking a sub/main/super diagonal\n  * \\param DiagIndex the index of the sub/super diagonal. The default is 0 and it means the main diagonal.\n  *              A positive value means a superdiagonal, a negative value means a subdiagonal.\n  *              You can also use Dynamic so the index can be set at runtime.\n  *\n  * The matrix is not required to be square.\n  *\n  * This class represents an expression of the main diagonal, or any sub/super diagonal\n  * of a square matrix. It is the return type of MatrixBase::diagonal() and MatrixBase::diagonal(Index) and most of the\n  * time this is the only way it is used.\n  *\n  * \\sa MatrixBase::diagonal(), MatrixBase::diagonal(Index)\n  */\n\nnamespace internal {\ntemplate<typename MatrixType, int DiagIndex>\nstruct traits<Diagonal<MatrixType,DiagIndex> >\n : traits<MatrixType>\n{\n  typedef typename nested<MatrixType>::type MatrixTypeNested;\n  typedef typename remove_reference<MatrixTypeNested>::type _MatrixTypeNested;\n  typedef typename MatrixType::StorageKind StorageKind;\n  enum {\n    RowsAtCompileTime = (int(DiagIndex) == DynamicIndex || int(MatrixType::SizeAtCompileTime) == Dynamic) ? Dynamic\n                      : (EIGEN_PLAIN_ENUM_MIN(MatrixType::RowsAtCompileTime - EIGEN_PLAIN_ENUM_MAX(-DiagIndex, 0),\n                                              MatrixType::ColsAtCompileTime - EIGEN_PLAIN_ENUM_MAX( DiagIndex, 0))),\n    ColsAtCompileTime = 1,\n    MaxRowsAtCompileTime = int(MatrixType::MaxSizeAtCompileTime) == Dynamic ? Dynamic\n                         : DiagIndex == DynamicIndex ? EIGEN_SIZE_MIN_PREFER_FIXED(MatrixType::MaxRowsAtCompileTime,\n                                                                              MatrixType::MaxColsAtCompileTime)\n                         : (EIGEN_PLAIN_ENUM_MIN(MatrixType::MaxRowsAtCompileTime - EIGEN_PLAIN_ENUM_MAX(-DiagIndex, 0),\n                                                 MatrixType::MaxColsAtCompileTime - EIGEN_PLAIN_ENUM_MAX( DiagIndex, 0))),\n    MaxColsAtCompileTime = 1,\n    MaskLvalueBit = is_lvalue<MatrixType>::value ? LvalueBit : 0,\n    Flags = (unsigned int)_MatrixTypeNested::Flags & (HereditaryBits | LinearAccessBit | MaskLvalueBit | DirectAccessBit) & ~RowMajorBit,\n    CoeffReadCost = _MatrixTypeNested::CoeffReadCost,\n    MatrixTypeOuterStride = outer_stride_at_compile_time<MatrixType>::ret,\n    InnerStrideAtCompileTime = MatrixTypeOuterStride == Dynamic ? Dynamic : MatrixTypeOuterStride+1,\n    OuterStrideAtCompileTime = 0\n  };\n};\n}\n\ntemplate<typename MatrixType, int _DiagIndex> class Diagonal\n   : public internal::dense_xpr_base< Diagonal<MatrixType,_DiagIndex> >::type\n{\n  public:\n\n    enum { DiagIndex = _DiagIndex };\n    typedef typename internal::dense_xpr_base<Diagonal>::type Base;\n    EIGEN_DENSE_PUBLIC_INTERFACE(Diagonal)\n\n    inline Diagonal(MatrixType& matrix, Index a_index = DiagIndex) : m_matrix(matrix), m_index(a_index) {}\n\n    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Diagonal)\n\n    inline Index rows() const\n    { return m_index.value()<0 ? (std::min<Index>)(m_matrix.cols(),m_matrix.rows()+m_index.value()) : (std::min<Index>)(m_matrix.rows(),m_matrix.cols()-m_index.value()); }\n\n    inline Index cols() const { return 1; }\n\n    inline Index innerStride() const\n    {\n      return m_matrix.outerStride() + 1;\n    }\n\n    inline Index outerStride() const\n    {\n      return 0;\n    }\n\n    typedef typename internal::conditional<\n                       internal::is_lvalue<MatrixType>::value,\n                       Scalar,\n                       const Scalar\n                     >::type ScalarWithConstIfNotLvalue;\n\n    inline ScalarWithConstIfNotLvalue* data() { return &(m_matrix.const_cast_derived().coeffRef(rowOffset(), colOffset())); }\n    inline const Scalar* data() const { return &(m_matrix.const_cast_derived().coeffRef(rowOffset(), colOffset())); }\n\n    inline Scalar& coeffRef(Index row, Index)\n    {\n      EIGEN_STATIC_ASSERT_LVALUE(MatrixType)\n      return m_matrix.const_cast_derived().coeffRef(row+rowOffset(), row+colOffset());\n    }\n\n    inline const Scalar& coeffRef(Index row, Index) const\n    {\n      return m_matrix.const_cast_derived().coeffRef(row+rowOffset(), row+colOffset());\n    }\n\n    inline CoeffReturnType coeff(Index row, Index) const\n    {\n      return m_matrix.coeff(row+rowOffset(), row+colOffset());\n    }\n\n    inline Scalar& coeffRef(Index idx)\n    {\n      EIGEN_STATIC_ASSERT_LVALUE(MatrixType)\n      return m_matrix.const_cast_derived().coeffRef(idx+rowOffset(), idx+colOffset());\n    }\n\n    inline const Scalar& coeffRef(Index idx) const\n    {\n      return m_matrix.const_cast_derived().coeffRef(idx+rowOffset(), idx+colOffset());\n    }\n\n    inline CoeffReturnType coeff(Index idx) const\n    {\n      return m_matrix.coeff(idx+rowOffset(), idx+colOffset());\n    }\n\n    const typename internal::remove_all<typename MatrixType::Nested>::type& \n    nestedExpression() const \n    {\n      return m_matrix;\n    }\n\n    int index() const\n    {\n      return m_index.value();\n    }\n\n  protected:\n    typename MatrixType::Nested m_matrix;\n    const internal::variable_if_dynamicindex<Index, DiagIndex> m_index;\n\n  private:\n    // some compilers may fail to optimize std::max etc in case of compile-time constants...\n    EIGEN_STRONG_INLINE Index absDiagIndex() const { return m_index.value()>0 ? m_index.value() : -m_index.value(); }\n    EIGEN_STRONG_INLINE Index rowOffset() const { return m_index.value()>0 ? 0 : -m_index.value(); }\n    EIGEN_STRONG_INLINE Index colOffset() const { return m_index.value()>0 ? m_index.value() : 0; }\n    // triger a compile time error is someone try to call packet\n    template<int LoadMode> typename MatrixType::PacketReturnType packet(Index) const;\n    template<int LoadMode> typename MatrixType::PacketReturnType packet(Index,Index) const;\n};\n\n/** \\returns an expression of the main diagonal of the matrix \\c *this\n  *\n  * \\c *this is not required to be square.\n  *\n  * Example: \\include MatrixBase_diagonal.cpp\n  * Output: \\verbinclude MatrixBase_diagonal.out\n  *\n  * \\sa class Diagonal */\ntemplate<typename Derived>\ninline typename MatrixBase<Derived>::DiagonalReturnType\nMatrixBase<Derived>::diagonal()\n{\n  return derived();\n}\n\n/** This is the const version of diagonal(). */\ntemplate<typename Derived>\ninline typename MatrixBase<Derived>::ConstDiagonalReturnType\nMatrixBase<Derived>::diagonal() const\n{\n  return ConstDiagonalReturnType(derived());\n}\n\n/** \\returns an expression of the \\a DiagIndex-th sub or super diagonal of the matrix \\c *this\n  *\n  * \\c *this is not required to be square.\n  *\n  * The template parameter \\a DiagIndex represent a super diagonal if \\a DiagIndex > 0\n  * and a sub diagonal otherwise. \\a DiagIndex == 0 is equivalent to the main diagonal.\n  *\n  * Example: \\include MatrixBase_diagonal_int.cpp\n  * Output: \\verbinclude MatrixBase_diagonal_int.out\n  *\n  * \\sa MatrixBase::diagonal(), class Diagonal */\ntemplate<typename Derived>\ninline typename MatrixBase<Derived>::DiagonalDynamicIndexReturnType\nMatrixBase<Derived>::diagonal(Index index)\n{\n  return DiagonalDynamicIndexReturnType(derived(), index);\n}\n\n/** This is the const version of diagonal(Index). */\ntemplate<typename Derived>\ninline typename MatrixBase<Derived>::ConstDiagonalDynamicIndexReturnType\nMatrixBase<Derived>::diagonal(Index index) const\n{\n  return ConstDiagonalDynamicIndexReturnType(derived(), index);\n}\n\n/** \\returns an expression of the \\a DiagIndex-th sub or super diagonal of the matrix \\c *this\n  *\n  * \\c *this is not required to be square.\n  *\n  * The template parameter \\a DiagIndex represent a super diagonal if \\a DiagIndex > 0\n  * and a sub diagonal otherwise. \\a DiagIndex == 0 is equivalent to the main diagonal.\n  *\n  * Example: \\include MatrixBase_diagonal_template_int.cpp\n  * Output: \\verbinclude MatrixBase_diagonal_template_int.out\n  *\n  * \\sa MatrixBase::diagonal(), class Diagonal */\ntemplate<typename Derived>\ntemplate<int Index>\ninline typename MatrixBase<Derived>::template DiagonalIndexReturnType<Index>::Type\nMatrixBase<Derived>::diagonal()\n{\n  return derived();\n}\n\n/** This is the const version of diagonal<int>(). */\ntemplate<typename Derived>\ntemplate<int Index>\ninline typename MatrixBase<Derived>::template ConstDiagonalIndexReturnType<Index>::Type\nMatrixBase<Derived>::diagonal() const\n{\n  return derived();\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_DIAGONAL_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/DiagonalMatrix.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2007-2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_DIAGONALMATRIX_H\n#define EIGEN_DIAGONALMATRIX_H\n\nnamespace Eigen { \n\n#ifndef EIGEN_PARSED_BY_DOXYGEN\ntemplate<typename Derived>\nclass DiagonalBase : public EigenBase<Derived>\n{\n  public:\n    typedef typename internal::traits<Derived>::DiagonalVectorType DiagonalVectorType;\n    typedef typename DiagonalVectorType::Scalar Scalar;\n    typedef typename DiagonalVectorType::RealScalar RealScalar;\n    typedef typename internal::traits<Derived>::StorageKind StorageKind;\n    typedef typename internal::traits<Derived>::Index Index;\n\n    enum {\n      RowsAtCompileTime = DiagonalVectorType::SizeAtCompileTime,\n      ColsAtCompileTime = DiagonalVectorType::SizeAtCompileTime,\n      MaxRowsAtCompileTime = DiagonalVectorType::MaxSizeAtCompileTime,\n      MaxColsAtCompileTime = DiagonalVectorType::MaxSizeAtCompileTime,\n      IsVectorAtCompileTime = 0,\n      Flags = 0\n    };\n\n    typedef Matrix<Scalar, RowsAtCompileTime, ColsAtCompileTime, 0, MaxRowsAtCompileTime, MaxColsAtCompileTime> DenseMatrixType;\n    typedef DenseMatrixType DenseType;\n    typedef DiagonalMatrix<Scalar,DiagonalVectorType::SizeAtCompileTime,DiagonalVectorType::MaxSizeAtCompileTime> PlainObject;\n\n    inline const Derived& derived() const { return *static_cast<const Derived*>(this); }\n    inline Derived& derived() { return *static_cast<Derived*>(this); }\n\n    DenseMatrixType toDenseMatrix() const { return derived(); }\n    template<typename DenseDerived>\n    void evalTo(MatrixBase<DenseDerived> &other) const;\n    template<typename DenseDerived>\n    inline void addTo(MatrixBase<DenseDerived> &other) const\n    { other.diagonal() += diagonal(); }\n    template<typename DenseDerived>\n    inline void subTo(MatrixBase<DenseDerived> &other) const\n    { other.diagonal() -= diagonal(); }\n\n    inline const DiagonalVectorType& diagonal() const { return derived().diagonal(); }\n    inline DiagonalVectorType& diagonal() { return derived().diagonal(); }\n\n    inline Index rows() const { return diagonal().size(); }\n    inline Index cols() const { return diagonal().size(); }\n\n    /** \\returns the diagonal matrix product of \\c *this by the matrix \\a matrix.\n      */\n    template<typename MatrixDerived>\n    const DiagonalProduct<MatrixDerived, Derived, OnTheLeft>\n    operator*(const MatrixBase<MatrixDerived> &matrix) const\n    {\n      return DiagonalProduct<MatrixDerived, Derived, OnTheLeft>(matrix.derived(), derived());\n    }\n\n    inline const DiagonalWrapper<const CwiseUnaryOp<internal::scalar_inverse_op<Scalar>, const DiagonalVectorType> >\n    inverse() const\n    {\n      return diagonal().cwiseInverse();\n    }\n    \n    inline const DiagonalWrapper<const CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const DiagonalVectorType> >\n    operator*(const Scalar& scalar) const\n    {\n      return diagonal() * scalar;\n    }\n    friend inline const DiagonalWrapper<const CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const DiagonalVectorType> >\n    operator*(const Scalar& scalar, const DiagonalBase& other)\n    {\n      return other.diagonal() * scalar;\n    }\n    \n    #ifdef EIGEN2_SUPPORT\n    template<typename OtherDerived>\n    bool isApprox(const DiagonalBase<OtherDerived>& other, typename NumTraits<Scalar>::Real precision = NumTraits<Scalar>::dummy_precision()) const\n    {\n      return diagonal().isApprox(other.diagonal(), precision);\n    }\n    template<typename OtherDerived>\n    bool isApprox(const MatrixBase<OtherDerived>& other, typename NumTraits<Scalar>::Real precision = NumTraits<Scalar>::dummy_precision()) const\n    {\n      return toDenseMatrix().isApprox(other, precision);\n    }\n    #endif\n};\n\ntemplate<typename Derived>\ntemplate<typename DenseDerived>\ninline void DiagonalBase<Derived>::evalTo(MatrixBase<DenseDerived> &other) const\n{\n  other.setZero();\n  other.diagonal() = diagonal();\n}\n#endif\n\n/** \\class DiagonalMatrix\n  * \\ingroup Core_Module\n  *\n  * \\brief Represents a diagonal matrix with its storage\n  *\n  * \\param _Scalar the type of coefficients\n  * \\param SizeAtCompileTime the dimension of the matrix, or Dynamic\n  * \\param MaxSizeAtCompileTime the dimension of the matrix, or Dynamic. This parameter is optional and defaults\n  *        to SizeAtCompileTime. Most of the time, you do not need to specify it.\n  *\n  * \\sa class DiagonalWrapper\n  */\n\nnamespace internal {\ntemplate<typename _Scalar, int SizeAtCompileTime, int MaxSizeAtCompileTime>\nstruct traits<DiagonalMatrix<_Scalar,SizeAtCompileTime,MaxSizeAtCompileTime> >\n : traits<Matrix<_Scalar,SizeAtCompileTime,SizeAtCompileTime,0,MaxSizeAtCompileTime,MaxSizeAtCompileTime> >\n{\n  typedef Matrix<_Scalar,SizeAtCompileTime,1,0,MaxSizeAtCompileTime,1> DiagonalVectorType;\n  typedef Dense StorageKind;\n  typedef DenseIndex Index;\n  enum {\n    Flags = LvalueBit\n  };\n};\n}\ntemplate<typename _Scalar, int SizeAtCompileTime, int MaxSizeAtCompileTime>\nclass DiagonalMatrix\n  : public DiagonalBase<DiagonalMatrix<_Scalar,SizeAtCompileTime,MaxSizeAtCompileTime> >\n{\n  public:\n    #ifndef EIGEN_PARSED_BY_DOXYGEN\n    typedef typename internal::traits<DiagonalMatrix>::DiagonalVectorType DiagonalVectorType;\n    typedef const DiagonalMatrix& Nested;\n    typedef _Scalar Scalar;\n    typedef typename internal::traits<DiagonalMatrix>::StorageKind StorageKind;\n    typedef typename internal::traits<DiagonalMatrix>::Index Index;\n    #endif\n\n  protected:\n\n    DiagonalVectorType m_diagonal;\n\n  public:\n\n    /** const version of diagonal(). */\n    inline const DiagonalVectorType& diagonal() const { return m_diagonal; }\n    /** \\returns a reference to the stored vector of diagonal coefficients. */\n    inline DiagonalVectorType& diagonal() { return m_diagonal; }\n\n    /** Default constructor without initialization */\n    inline DiagonalMatrix() {}\n\n    /** Constructs a diagonal matrix with given dimension  */\n    inline DiagonalMatrix(Index dim) : m_diagonal(dim) {}\n\n    /** 2D constructor. */\n    inline DiagonalMatrix(const Scalar& x, const Scalar& y) : m_diagonal(x,y) {}\n\n    /** 3D constructor. */\n    inline DiagonalMatrix(const Scalar& x, const Scalar& y, const Scalar& z) : m_diagonal(x,y,z) {}\n\n    /** Copy constructor. */\n    template<typename OtherDerived>\n    inline DiagonalMatrix(const DiagonalBase<OtherDerived>& other) : m_diagonal(other.diagonal()) {}\n\n    #ifndef EIGEN_PARSED_BY_DOXYGEN\n    /** copy constructor. prevent a default copy constructor from hiding the other templated constructor */\n    inline DiagonalMatrix(const DiagonalMatrix& other) : m_diagonal(other.diagonal()) {}\n    #endif\n\n    /** generic constructor from expression of the diagonal coefficients */\n    template<typename OtherDerived>\n    explicit inline DiagonalMatrix(const MatrixBase<OtherDerived>& other) : m_diagonal(other)\n    {}\n\n    /** Copy operator. */\n    template<typename OtherDerived>\n    DiagonalMatrix& operator=(const DiagonalBase<OtherDerived>& other)\n    {\n      m_diagonal = other.diagonal();\n      return *this;\n    }\n\n    #ifndef EIGEN_PARSED_BY_DOXYGEN\n    /** This is a special case of the templated operator=. Its purpose is to\n      * prevent a default operator= from hiding the templated operator=.\n      */\n    DiagonalMatrix& operator=(const DiagonalMatrix& other)\n    {\n      m_diagonal = other.diagonal();\n      return *this;\n    }\n    #endif\n\n    /** Resizes to given size. */\n    inline void resize(Index size) { m_diagonal.resize(size); }\n    /** Sets all coefficients to zero. */\n    inline void setZero() { m_diagonal.setZero(); }\n    /** Resizes and sets all coefficients to zero. */\n    inline void setZero(Index size) { m_diagonal.setZero(size); }\n    /** Sets this matrix to be the identity matrix of the current size. */\n    inline void setIdentity() { m_diagonal.setOnes(); }\n    /** Sets this matrix to be the identity matrix of the given size. */\n    inline void setIdentity(Index size) { m_diagonal.setOnes(size); }\n};\n\n/** \\class DiagonalWrapper\n  * \\ingroup Core_Module\n  *\n  * \\brief Expression of a diagonal matrix\n  *\n  * \\param _DiagonalVectorType the type of the vector of diagonal coefficients\n  *\n  * This class is an expression of a diagonal matrix, but not storing its own vector of diagonal coefficients,\n  * instead wrapping an existing vector expression. It is the return type of MatrixBase::asDiagonal()\n  * and most of the time this is the only way that it is used.\n  *\n  * \\sa class DiagonalMatrix, class DiagonalBase, MatrixBase::asDiagonal()\n  */\n\nnamespace internal {\ntemplate<typename _DiagonalVectorType>\nstruct traits<DiagonalWrapper<_DiagonalVectorType> >\n{\n  typedef _DiagonalVectorType DiagonalVectorType;\n  typedef typename DiagonalVectorType::Scalar Scalar;\n  typedef typename DiagonalVectorType::Index Index;\n  typedef typename DiagonalVectorType::StorageKind StorageKind;\n  enum {\n    RowsAtCompileTime = DiagonalVectorType::SizeAtCompileTime,\n    ColsAtCompileTime = DiagonalVectorType::SizeAtCompileTime,\n    MaxRowsAtCompileTime = DiagonalVectorType::SizeAtCompileTime,\n    MaxColsAtCompileTime = DiagonalVectorType::SizeAtCompileTime,\n    Flags =  traits<DiagonalVectorType>::Flags & LvalueBit\n  };\n};\n}\n\ntemplate<typename _DiagonalVectorType>\nclass DiagonalWrapper\n  : public DiagonalBase<DiagonalWrapper<_DiagonalVectorType> >, internal::no_assignment_operator\n{\n  public:\n    #ifndef EIGEN_PARSED_BY_DOXYGEN\n    typedef _DiagonalVectorType DiagonalVectorType;\n    typedef DiagonalWrapper Nested;\n    #endif\n\n    /** Constructor from expression of diagonal coefficients to wrap. */\n    inline DiagonalWrapper(DiagonalVectorType& a_diagonal) : m_diagonal(a_diagonal) {}\n\n    /** \\returns a const reference to the wrapped expression of diagonal coefficients. */\n    const DiagonalVectorType& diagonal() const { return m_diagonal; }\n\n  protected:\n    typename DiagonalVectorType::Nested m_diagonal;\n};\n\n/** \\returns a pseudo-expression of a diagonal matrix with *this as vector of diagonal coefficients\n  *\n  * \\only_for_vectors\n  *\n  * Example: \\include MatrixBase_asDiagonal.cpp\n  * Output: \\verbinclude MatrixBase_asDiagonal.out\n  *\n  * \\sa class DiagonalWrapper, class DiagonalMatrix, diagonal(), isDiagonal()\n  **/\ntemplate<typename Derived>\ninline const DiagonalWrapper<const Derived>\nMatrixBase<Derived>::asDiagonal() const\n{\n  return derived();\n}\n\n/** \\returns true if *this is approximately equal to a diagonal matrix,\n  *          within the precision given by \\a prec.\n  *\n  * Example: \\include MatrixBase_isDiagonal.cpp\n  * Output: \\verbinclude MatrixBase_isDiagonal.out\n  *\n  * \\sa asDiagonal()\n  */\ntemplate<typename Derived>\nbool MatrixBase<Derived>::isDiagonal(const RealScalar& prec) const\n{\n  using std::abs;\n  if(cols() != rows()) return false;\n  RealScalar maxAbsOnDiagonal = static_cast<RealScalar>(-1);\n  for(Index j = 0; j < cols(); ++j)\n  {\n    RealScalar absOnDiagonal = abs(coeff(j,j));\n    if(absOnDiagonal > maxAbsOnDiagonal) maxAbsOnDiagonal = absOnDiagonal;\n  }\n  for(Index j = 0; j < cols(); ++j)\n    for(Index i = 0; i < j; ++i)\n    {\n      if(!internal::isMuchSmallerThan(coeff(i, j), maxAbsOnDiagonal, prec)) return false;\n      if(!internal::isMuchSmallerThan(coeff(j, i), maxAbsOnDiagonal, prec)) return false;\n    }\n  return true;\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_DIAGONALMATRIX_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/DiagonalProduct.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2007-2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_DIAGONALPRODUCT_H\n#define EIGEN_DIAGONALPRODUCT_H\n\nnamespace Eigen { \n\nnamespace internal {\ntemplate<typename MatrixType, typename DiagonalType, int ProductOrder>\nstruct traits<DiagonalProduct<MatrixType, DiagonalType, ProductOrder> >\n : traits<MatrixType>\n{\n  typedef typename scalar_product_traits<typename MatrixType::Scalar, typename DiagonalType::Scalar>::ReturnType Scalar;\n  enum {\n    RowsAtCompileTime = MatrixType::RowsAtCompileTime,\n    ColsAtCompileTime = MatrixType::ColsAtCompileTime,\n    MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,\n    MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime,\n\n    _StorageOrder = MatrixType::Flags & RowMajorBit ? RowMajor : ColMajor,\n    _ScalarAccessOnDiag =  !((int(_StorageOrder) == ColMajor && int(ProductOrder) == OnTheLeft)\n                          ||(int(_StorageOrder) == RowMajor && int(ProductOrder) == OnTheRight)),\n    _SameTypes = is_same<typename MatrixType::Scalar, typename DiagonalType::Scalar>::value,\n    // FIXME currently we need same types, but in the future the next rule should be the one\n    //_Vectorizable = bool(int(MatrixType::Flags)&PacketAccessBit) && ((!_PacketOnDiag) || (_SameTypes && bool(int(DiagonalType::DiagonalVectorType::Flags)&PacketAccessBit))),\n    _Vectorizable = bool(int(MatrixType::Flags)&PacketAccessBit) && _SameTypes && (_ScalarAccessOnDiag || (bool(int(DiagonalType::DiagonalVectorType::Flags)&PacketAccessBit))),\n    _LinearAccessMask = (RowsAtCompileTime==1 || ColsAtCompileTime==1) ? LinearAccessBit : 0,\n\n    Flags = ((HereditaryBits|_LinearAccessMask|AlignedBit) & (unsigned int)(MatrixType::Flags)) | (_Vectorizable ? PacketAccessBit : 0),//(int(MatrixType::Flags)&int(DiagonalType::DiagonalVectorType::Flags)&AlignedBit),\n    Cost0 = EIGEN_ADD_COST(NumTraits<Scalar>::MulCost, MatrixType::CoeffReadCost),\n    CoeffReadCost = EIGEN_ADD_COST(Cost0,DiagonalType::DiagonalVectorType::CoeffReadCost)\n  };\n};\n}\n\ntemplate<typename MatrixType, typename DiagonalType, int ProductOrder>\nclass DiagonalProduct : internal::no_assignment_operator,\n                        public MatrixBase<DiagonalProduct<MatrixType, DiagonalType, ProductOrder> >\n{\n  public:\n\n    typedef MatrixBase<DiagonalProduct> Base;\n    EIGEN_DENSE_PUBLIC_INTERFACE(DiagonalProduct)\n\n    inline DiagonalProduct(const MatrixType& matrix, const DiagonalType& diagonal)\n      : m_matrix(matrix), m_diagonal(diagonal)\n    {\n      eigen_assert(diagonal.diagonal().size() == (ProductOrder == OnTheLeft ? matrix.rows() : matrix.cols()));\n    }\n\n    EIGEN_STRONG_INLINE Index rows() const { return m_matrix.rows(); }\n    EIGEN_STRONG_INLINE Index cols() const { return m_matrix.cols(); }\n\n    EIGEN_STRONG_INLINE const Scalar coeff(Index row, Index col) const\n    {\n      return m_diagonal.diagonal().coeff(ProductOrder == OnTheLeft ? row : col) * m_matrix.coeff(row, col);\n    }\n    \n    EIGEN_STRONG_INLINE const Scalar coeff(Index idx) const\n    {\n      enum {\n        StorageOrder = int(MatrixType::Flags) & RowMajorBit ? RowMajor : ColMajor\n      };\n      return coeff(int(StorageOrder)==ColMajor?idx:0,int(StorageOrder)==ColMajor?0:idx);\n    }\n\n    template<int LoadMode>\n    EIGEN_STRONG_INLINE PacketScalar packet(Index row, Index col) const\n    {\n      enum {\n        StorageOrder = Flags & RowMajorBit ? RowMajor : ColMajor\n      };\n      const Index indexInDiagonalVector = ProductOrder == OnTheLeft ? row : col;\n      return packet_impl<LoadMode>(row,col,indexInDiagonalVector,typename internal::conditional<\n        ((int(StorageOrder) == RowMajor && int(ProductOrder) == OnTheLeft)\n       ||(int(StorageOrder) == ColMajor && int(ProductOrder) == OnTheRight)), internal::true_type, internal::false_type>::type());\n    }\n    \n    template<int LoadMode>\n    EIGEN_STRONG_INLINE PacketScalar packet(Index idx) const\n    {\n      enum {\n        StorageOrder = int(MatrixType::Flags) & RowMajorBit ? RowMajor : ColMajor\n      };\n      return packet<LoadMode>(int(StorageOrder)==ColMajor?idx:0,int(StorageOrder)==ColMajor?0:idx);\n    }\n\n  protected:\n    template<int LoadMode>\n    EIGEN_STRONG_INLINE PacketScalar packet_impl(Index row, Index col, Index id, internal::true_type) const\n    {\n      return internal::pmul(m_matrix.template packet<LoadMode>(row, col),\n                     internal::pset1<PacketScalar>(m_diagonal.diagonal().coeff(id)));\n    }\n\n    template<int LoadMode>\n    EIGEN_STRONG_INLINE PacketScalar packet_impl(Index row, Index col, Index id, internal::false_type) const\n    {\n      enum {\n        InnerSize = (MatrixType::Flags & RowMajorBit) ? MatrixType::ColsAtCompileTime : MatrixType::RowsAtCompileTime,\n        DiagonalVectorPacketLoadMode = (LoadMode == Aligned && (((InnerSize%16) == 0) || (int(DiagonalType::DiagonalVectorType::Flags)&AlignedBit)==AlignedBit) ? Aligned : Unaligned)\n      };\n      return internal::pmul(m_matrix.template packet<LoadMode>(row, col),\n                     m_diagonal.diagonal().template packet<DiagonalVectorPacketLoadMode>(id));\n    }\n\n    typename MatrixType::Nested m_matrix;\n    typename DiagonalType::Nested m_diagonal;\n};\n\n/** \\returns the diagonal matrix product of \\c *this by the diagonal matrix \\a diagonal.\n  */\ntemplate<typename Derived>\ntemplate<typename DiagonalDerived>\ninline const DiagonalProduct<Derived, DiagonalDerived, OnTheRight>\nMatrixBase<Derived>::operator*(const DiagonalBase<DiagonalDerived> &a_diagonal) const\n{\n  return DiagonalProduct<Derived, DiagonalDerived, OnTheRight>(derived(), a_diagonal.derived());\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_DIAGONALPRODUCT_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/Dot.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2006-2008, 2010 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_DOT_H\n#define EIGEN_DOT_H\n\nnamespace Eigen { \n\nnamespace internal {\n\n// helper function for dot(). The problem is that if we put that in the body of dot(), then upon calling dot\n// with mismatched types, the compiler emits errors about failing to instantiate cwiseProduct BEFORE\n// looking at the static assertions. Thus this is a trick to get better compile errors.\ntemplate<typename T, typename U,\n// the NeedToTranspose condition here is taken straight from Assign.h\n         bool NeedToTranspose = T::IsVectorAtCompileTime\n                && U::IsVectorAtCompileTime\n                && ((int(T::RowsAtCompileTime) == 1 && int(U::ColsAtCompileTime) == 1)\n                      |  // FIXME | instead of || to please GCC 4.4.0 stupid warning \"suggest parentheses around &&\".\n                         // revert to || as soon as not needed anymore.\n                    (int(T::ColsAtCompileTime) == 1 && int(U::RowsAtCompileTime) == 1))\n>\nstruct dot_nocheck\n{\n  typedef typename scalar_product_traits<typename traits<T>::Scalar,typename traits<U>::Scalar>::ReturnType ResScalar;\n  static inline ResScalar run(const MatrixBase<T>& a, const MatrixBase<U>& b)\n  {\n    return a.template binaryExpr<scalar_conj_product_op<typename traits<T>::Scalar,typename traits<U>::Scalar> >(b).sum();\n  }\n};\n\ntemplate<typename T, typename U>\nstruct dot_nocheck<T, U, true>\n{\n  typedef typename scalar_product_traits<typename traits<T>::Scalar,typename traits<U>::Scalar>::ReturnType ResScalar;\n  static inline ResScalar run(const MatrixBase<T>& a, const MatrixBase<U>& b)\n  {\n    return a.transpose().template binaryExpr<scalar_conj_product_op<typename traits<T>::Scalar,typename traits<U>::Scalar> >(b).sum();\n  }\n};\n\n} // end namespace internal\n\n/** \\returns the dot product of *this with other.\n  *\n  * \\only_for_vectors\n  *\n  * \\note If the scalar type is complex numbers, then this function returns the hermitian\n  * (sesquilinear) dot product, conjugate-linear in the first variable and linear in the\n  * second variable.\n  *\n  * \\sa squaredNorm(), norm()\n  */\ntemplate<typename Derived>\ntemplate<typename OtherDerived>\ninline typename internal::scalar_product_traits<typename internal::traits<Derived>::Scalar,typename internal::traits<OtherDerived>::Scalar>::ReturnType\nMatrixBase<Derived>::dot(const MatrixBase<OtherDerived>& other) const\n{\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)\n  EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Derived,OtherDerived)\n  typedef internal::scalar_conj_product_op<Scalar,typename OtherDerived::Scalar> func;\n  EIGEN_CHECK_BINARY_COMPATIBILIY(func,Scalar,typename OtherDerived::Scalar);\n\n  eigen_assert(size() == other.size());\n\n  return internal::dot_nocheck<Derived,OtherDerived>::run(*this, other);\n}\n\n#ifdef EIGEN2_SUPPORT\n/** \\returns the dot product of *this with other, with the Eigen2 convention that the dot product is linear in the first variable\n  * (conjugating the second variable). Of course this only makes a difference in the complex case.\n  *\n  * This method is only available in EIGEN2_SUPPORT mode.\n  *\n  * \\only_for_vectors\n  *\n  * \\sa dot()\n  */\ntemplate<typename Derived>\ntemplate<typename OtherDerived>\ntypename internal::traits<Derived>::Scalar\nMatrixBase<Derived>::eigen2_dot(const MatrixBase<OtherDerived>& other) const\n{\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)\n  EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Derived,OtherDerived)\n  EIGEN_STATIC_ASSERT((internal::is_same<Scalar, typename OtherDerived::Scalar>::value),\n    YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)\n\n  eigen_assert(size() == other.size());\n\n  return internal::dot_nocheck<OtherDerived,Derived>::run(other,*this);\n}\n#endif\n\n\n//---------- implementation of L2 norm and related functions ----------\n\n/** \\returns, for vectors, the squared \\em l2 norm of \\c *this, and for matrices the Frobenius norm.\n  * In both cases, it consists in the sum of the square of all the matrix entries.\n  * For vectors, this is also equals to the dot product of \\c *this with itself.\n  *\n  * \\sa dot(), norm()\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE typename NumTraits<typename internal::traits<Derived>::Scalar>::Real MatrixBase<Derived>::squaredNorm() const\n{\n  return numext::real((*this).cwiseAbs2().sum());\n}\n\n/** \\returns, for vectors, the \\em l2 norm of \\c *this, and for matrices the Frobenius norm.\n  * In both cases, it consists in the square root of the sum of the square of all the matrix entries.\n  * For vectors, this is also equals to the square root of the dot product of \\c *this with itself.\n  *\n  * \\sa dot(), squaredNorm()\n  */\ntemplate<typename Derived>\ninline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real MatrixBase<Derived>::norm() const\n{\n  using std::sqrt;\n  return sqrt(squaredNorm());\n}\n\n/** \\returns an expression of the quotient of *this by its own norm.\n  *\n  * \\only_for_vectors\n  *\n  * \\sa norm(), normalize()\n  */\ntemplate<typename Derived>\ninline const typename MatrixBase<Derived>::PlainObject\nMatrixBase<Derived>::normalized() const\n{\n  typedef typename internal::nested<Derived>::type Nested;\n  typedef typename internal::remove_reference<Nested>::type _Nested;\n  _Nested n(derived());\n  return n / n.norm();\n}\n\n/** Normalizes the vector, i.e. divides it by its own norm.\n  *\n  * \\only_for_vectors\n  *\n  * \\sa norm(), normalized()\n  */\ntemplate<typename Derived>\ninline void MatrixBase<Derived>::normalize()\n{\n  *this /= norm();\n}\n\n//---------- implementation of other norms ----------\n\nnamespace internal {\n\ntemplate<typename Derived, int p>\nstruct lpNorm_selector\n{\n  typedef typename NumTraits<typename traits<Derived>::Scalar>::Real RealScalar;\n  static inline RealScalar run(const MatrixBase<Derived>& m)\n  {\n    using std::pow;\n    return pow(m.cwiseAbs().array().pow(p).sum(), RealScalar(1)/p);\n  }\n};\n\ntemplate<typename Derived>\nstruct lpNorm_selector<Derived, 1>\n{\n  static inline typename NumTraits<typename traits<Derived>::Scalar>::Real run(const MatrixBase<Derived>& m)\n  {\n    return m.cwiseAbs().sum();\n  }\n};\n\ntemplate<typename Derived>\nstruct lpNorm_selector<Derived, 2>\n{\n  static inline typename NumTraits<typename traits<Derived>::Scalar>::Real run(const MatrixBase<Derived>& m)\n  {\n    return m.norm();\n  }\n};\n\ntemplate<typename Derived>\nstruct lpNorm_selector<Derived, Infinity>\n{\n  static inline typename NumTraits<typename traits<Derived>::Scalar>::Real run(const MatrixBase<Derived>& m)\n  {\n    return m.cwiseAbs().maxCoeff();\n  }\n};\n\n} // end namespace internal\n\n/** \\returns the \\f$ \\ell^p \\f$ norm of *this, that is, returns the p-th root of the sum of the p-th powers of the absolute values\n  *          of the coefficients of *this. If \\a p is the special value \\a Eigen::Infinity, this function returns the \\f$ \\ell^\\infty \\f$\n  *          norm, that is the maximum of the absolute values of the coefficients of *this.\n  *\n  * \\sa norm()\n  */\ntemplate<typename Derived>\ntemplate<int p>\ninline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real\nMatrixBase<Derived>::lpNorm() const\n{\n  return internal::lpNorm_selector<Derived, p>::run(*this);\n}\n\n//---------- implementation of isOrthogonal / isUnitary ----------\n\n/** \\returns true if *this is approximately orthogonal to \\a other,\n  *          within the precision given by \\a prec.\n  *\n  * Example: \\include MatrixBase_isOrthogonal.cpp\n  * Output: \\verbinclude MatrixBase_isOrthogonal.out\n  */\ntemplate<typename Derived>\ntemplate<typename OtherDerived>\nbool MatrixBase<Derived>::isOrthogonal\n(const MatrixBase<OtherDerived>& other, const RealScalar& prec) const\n{\n  typename internal::nested<Derived,2>::type nested(derived());\n  typename internal::nested<OtherDerived,2>::type otherNested(other.derived());\n  return numext::abs2(nested.dot(otherNested)) <= prec * prec * nested.squaredNorm() * otherNested.squaredNorm();\n}\n\n/** \\returns true if *this is approximately an unitary matrix,\n  *          within the precision given by \\a prec. In the case where the \\a Scalar\n  *          type is real numbers, a unitary matrix is an orthogonal matrix, whence the name.\n  *\n  * \\note This can be used to check whether a family of vectors forms an orthonormal basis.\n  *       Indeed, \\c m.isUnitary() returns true if and only if the columns (equivalently, the rows) of m form an\n  *       orthonormal basis.\n  *\n  * Example: \\include MatrixBase_isUnitary.cpp\n  * Output: \\verbinclude MatrixBase_isUnitary.out\n  */\ntemplate<typename Derived>\nbool MatrixBase<Derived>::isUnitary(const RealScalar& prec) const\n{\n  typename Derived::Nested nested(derived());\n  for(Index i = 0; i < cols(); ++i)\n  {\n    if(!internal::isApprox(nested.col(i).squaredNorm(), static_cast<RealScalar>(1), prec))\n      return false;\n    for(Index j = 0; j < i; ++j)\n      if(!internal::isMuchSmallerThan(nested.col(i).dot(nested.col(j)), static_cast<Scalar>(1), prec))\n        return false;\n  }\n  return true;\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_DOT_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/EigenBase.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_EIGENBASE_H\n#define EIGEN_EIGENBASE_H\n\nnamespace Eigen {\n\n/** Common base class for all classes T such that MatrixBase has an operator=(T) and a constructor MatrixBase(T).\n  *\n  * In other words, an EigenBase object is an object that can be copied into a MatrixBase.\n  *\n  * Besides MatrixBase-derived classes, this also includes special matrix classes such as diagonal matrices, etc.\n  *\n  * Notice that this class is trivial, it is only used to disambiguate overloaded functions.\n  *\n  * \\sa \\ref TopicClassHierarchy\n  */\ntemplate<typename Derived> struct EigenBase\n{\n//   typedef typename internal::plain_matrix_type<Derived>::type PlainObject;\n\n  typedef typename internal::traits<Derived>::StorageKind StorageKind;\n  typedef typename internal::traits<Derived>::Index Index;\n\n  /** \\returns a reference to the derived object */\n  Derived& derived() { return *static_cast<Derived*>(this); }\n  /** \\returns a const reference to the derived object */\n  const Derived& derived() const { return *static_cast<const Derived*>(this); }\n\n  inline Derived& const_cast_derived() const\n  { return *static_cast<Derived*>(const_cast<EigenBase*>(this)); }\n  inline const Derived& const_derived() const\n  { return *static_cast<const Derived*>(this); }\n\n  /** \\returns the number of rows. \\sa cols(), RowsAtCompileTime */\n  inline Index rows() const { return derived().rows(); }\n  /** \\returns the number of columns. \\sa rows(), ColsAtCompileTime*/\n  inline Index cols() const { return derived().cols(); }\n  /** \\returns the number of coefficients, which is rows()*cols().\n    * \\sa rows(), cols(), SizeAtCompileTime. */\n  inline Index size() const { return rows() * cols(); }\n\n  /** \\internal Don't use it, but do the equivalent: \\code dst = *this; \\endcode */\n  template<typename Dest> inline void evalTo(Dest& dst) const\n  { derived().evalTo(dst); }\n\n  /** \\internal Don't use it, but do the equivalent: \\code dst += *this; \\endcode */\n  template<typename Dest> inline void addTo(Dest& dst) const\n  {\n    // This is the default implementation,\n    // derived class can reimplement it in a more optimized way.\n    typename Dest::PlainObject res(rows(),cols());\n    evalTo(res);\n    dst += res;\n  }\n\n  /** \\internal Don't use it, but do the equivalent: \\code dst -= *this; \\endcode */\n  template<typename Dest> inline void subTo(Dest& dst) const\n  {\n    // This is the default implementation,\n    // derived class can reimplement it in a more optimized way.\n    typename Dest::PlainObject res(rows(),cols());\n    evalTo(res);\n    dst -= res;\n  }\n\n  /** \\internal Don't use it, but do the equivalent: \\code dst.applyOnTheRight(*this); \\endcode */\n  template<typename Dest> inline void applyThisOnTheRight(Dest& dst) const\n  {\n    // This is the default implementation,\n    // derived class can reimplement it in a more optimized way.\n    dst = dst * this->derived();\n  }\n\n  /** \\internal Don't use it, but do the equivalent: \\code dst.applyOnTheLeft(*this); \\endcode */\n  template<typename Dest> inline void applyThisOnTheLeft(Dest& dst) const\n  {\n    // This is the default implementation,\n    // derived class can reimplement it in a more optimized way.\n    dst = this->derived() * dst;\n  }\n\n};\n\n/***************************************************************************\n* Implementation of matrix base methods\n***************************************************************************/\n\n/** \\brief Copies the generic expression \\a other into *this.\n  *\n  * \\details The expression must provide a (templated) evalTo(Derived& dst) const\n  * function which does the actual job. In practice, this allows any user to write\n  * its own special matrix without having to modify MatrixBase\n  *\n  * \\returns a reference to *this.\n  */\ntemplate<typename Derived>\ntemplate<typename OtherDerived>\nDerived& DenseBase<Derived>::operator=(const EigenBase<OtherDerived> &other)\n{\n  other.derived().evalTo(derived());\n  return derived();\n}\n\ntemplate<typename Derived>\ntemplate<typename OtherDerived>\nDerived& DenseBase<Derived>::operator+=(const EigenBase<OtherDerived> &other)\n{\n  other.derived().addTo(derived());\n  return derived();\n}\n\ntemplate<typename Derived>\ntemplate<typename OtherDerived>\nDerived& DenseBase<Derived>::operator-=(const EigenBase<OtherDerived> &other)\n{\n  other.derived().subTo(derived());\n  return derived();\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_EIGENBASE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/Flagged.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_FLAGGED_H\n#define EIGEN_FLAGGED_H\n\nnamespace Eigen { \n\n/** \\class Flagged\n  * \\ingroup Core_Module\n  *\n  * \\brief Expression with modified flags\n  *\n  * \\param ExpressionType the type of the object of which we are modifying the flags\n  * \\param Added the flags added to the expression\n  * \\param Removed the flags removed from the expression (has priority over Added).\n  *\n  * This class represents an expression whose flags have been modified.\n  * It is the return type of MatrixBase::flagged()\n  * and most of the time this is the only way it is used.\n  *\n  * \\sa MatrixBase::flagged()\n  */\n\nnamespace internal {\ntemplate<typename ExpressionType, unsigned int Added, unsigned int Removed>\nstruct traits<Flagged<ExpressionType, Added, Removed> > : traits<ExpressionType>\n{\n  enum { Flags = (ExpressionType::Flags | Added) & ~Removed };\n};\n}\n\ntemplate<typename ExpressionType, unsigned int Added, unsigned int Removed> class Flagged\n  : public MatrixBase<Flagged<ExpressionType, Added, Removed> >\n{\n  public:\n\n    typedef MatrixBase<Flagged> Base;\n    \n    EIGEN_DENSE_PUBLIC_INTERFACE(Flagged)\n    typedef typename internal::conditional<internal::must_nest_by_value<ExpressionType>::ret,\n        ExpressionType, const ExpressionType&>::type ExpressionTypeNested;\n    typedef typename ExpressionType::InnerIterator InnerIterator;\n\n    inline Flagged(const ExpressionType& matrix) : m_matrix(matrix) {}\n\n    inline Index rows() const { return m_matrix.rows(); }\n    inline Index cols() const { return m_matrix.cols(); }\n    inline Index outerStride() const { return m_matrix.outerStride(); }\n    inline Index innerStride() const { return m_matrix.innerStride(); }\n\n    inline CoeffReturnType coeff(Index row, Index col) const\n    {\n      return m_matrix.coeff(row, col);\n    }\n\n    inline CoeffReturnType coeff(Index index) const\n    {\n      return m_matrix.coeff(index);\n    }\n    \n    inline const Scalar& coeffRef(Index row, Index col) const\n    {\n      return m_matrix.const_cast_derived().coeffRef(row, col);\n    }\n\n    inline const Scalar& coeffRef(Index index) const\n    {\n      return m_matrix.const_cast_derived().coeffRef(index);\n    }\n\n    inline Scalar& coeffRef(Index row, Index col)\n    {\n      return m_matrix.const_cast_derived().coeffRef(row, col);\n    }\n\n    inline Scalar& coeffRef(Index index)\n    {\n      return m_matrix.const_cast_derived().coeffRef(index);\n    }\n\n    template<int LoadMode>\n    inline const PacketScalar packet(Index row, Index col) const\n    {\n      return m_matrix.template packet<LoadMode>(row, col);\n    }\n\n    template<int LoadMode>\n    inline void writePacket(Index row, Index col, const PacketScalar& x)\n    {\n      m_matrix.const_cast_derived().template writePacket<LoadMode>(row, col, x);\n    }\n\n    template<int LoadMode>\n    inline const PacketScalar packet(Index index) const\n    {\n      return m_matrix.template packet<LoadMode>(index);\n    }\n\n    template<int LoadMode>\n    inline void writePacket(Index index, const PacketScalar& x)\n    {\n      m_matrix.const_cast_derived().template writePacket<LoadMode>(index, x);\n    }\n\n    const ExpressionType& _expression() const { return m_matrix; }\n\n    template<typename OtherDerived>\n    typename ExpressionType::PlainObject solveTriangular(const MatrixBase<OtherDerived>& other) const;\n\n    template<typename OtherDerived>\n    void solveTriangularInPlace(const MatrixBase<OtherDerived>& other) const;\n\n  protected:\n    ExpressionTypeNested m_matrix;\n};\n\n/** \\returns an expression of *this with added and removed flags\n  *\n  * This is mostly for internal use.\n  *\n  * \\sa class Flagged\n  */\ntemplate<typename Derived>\ntemplate<unsigned int Added,unsigned int Removed>\ninline const Flagged<Derived, Added, Removed>\nDenseBase<Derived>::flagged() const\n{\n  return derived();\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_FLAGGED_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/ForceAlignedAccess.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_FORCEALIGNEDACCESS_H\n#define EIGEN_FORCEALIGNEDACCESS_H\n\nnamespace Eigen {\n\n/** \\class ForceAlignedAccess\n  * \\ingroup Core_Module\n  *\n  * \\brief Enforce aligned packet loads and stores regardless of what is requested\n  *\n  * \\param ExpressionType the type of the object of which we are forcing aligned packet access\n  *\n  * This class is the return type of MatrixBase::forceAlignedAccess()\n  * and most of the time this is the only way it is used.\n  *\n  * \\sa MatrixBase::forceAlignedAccess()\n  */\n\nnamespace internal {\ntemplate<typename ExpressionType>\nstruct traits<ForceAlignedAccess<ExpressionType> > : public traits<ExpressionType>\n{};\n}\n\ntemplate<typename ExpressionType> class ForceAlignedAccess\n  : public internal::dense_xpr_base< ForceAlignedAccess<ExpressionType> >::type\n{\n  public:\n\n    typedef typename internal::dense_xpr_base<ForceAlignedAccess>::type Base;\n    EIGEN_DENSE_PUBLIC_INTERFACE(ForceAlignedAccess)\n\n    inline ForceAlignedAccess(const ExpressionType& matrix) : m_expression(matrix) {}\n\n    inline Index rows() const { return m_expression.rows(); }\n    inline Index cols() const { return m_expression.cols(); }\n    inline Index outerStride() const { return m_expression.outerStride(); }\n    inline Index innerStride() const { return m_expression.innerStride(); }\n\n    inline const CoeffReturnType coeff(Index row, Index col) const\n    {\n      return m_expression.coeff(row, col);\n    }\n\n    inline Scalar& coeffRef(Index row, Index col)\n    {\n      return m_expression.const_cast_derived().coeffRef(row, col);\n    }\n\n    inline const CoeffReturnType coeff(Index index) const\n    {\n      return m_expression.coeff(index);\n    }\n\n    inline Scalar& coeffRef(Index index)\n    {\n      return m_expression.const_cast_derived().coeffRef(index);\n    }\n\n    template<int LoadMode>\n    inline const PacketScalar packet(Index row, Index col) const\n    {\n      return m_expression.template packet<Aligned>(row, col);\n    }\n\n    template<int LoadMode>\n    inline void writePacket(Index row, Index col, const PacketScalar& x)\n    {\n      m_expression.const_cast_derived().template writePacket<Aligned>(row, col, x);\n    }\n\n    template<int LoadMode>\n    inline const PacketScalar packet(Index index) const\n    {\n      return m_expression.template packet<Aligned>(index);\n    }\n\n    template<int LoadMode>\n    inline void writePacket(Index index, const PacketScalar& x)\n    {\n      m_expression.const_cast_derived().template writePacket<Aligned>(index, x);\n    }\n\n    operator const ExpressionType&() const { return m_expression; }\n\n  protected:\n    const ExpressionType& m_expression;\n\n  private:\n    ForceAlignedAccess& operator=(const ForceAlignedAccess&);\n};\n\n/** \\returns an expression of *this with forced aligned access\n  * \\sa forceAlignedAccessIf(),class ForceAlignedAccess\n  */\ntemplate<typename Derived>\ninline const ForceAlignedAccess<Derived>\nMatrixBase<Derived>::forceAlignedAccess() const\n{\n  return ForceAlignedAccess<Derived>(derived());\n}\n\n/** \\returns an expression of *this with forced aligned access\n  * \\sa forceAlignedAccessIf(), class ForceAlignedAccess\n  */\ntemplate<typename Derived>\ninline ForceAlignedAccess<Derived>\nMatrixBase<Derived>::forceAlignedAccess()\n{\n  return ForceAlignedAccess<Derived>(derived());\n}\n\n/** \\returns an expression of *this with forced aligned access if \\a Enable is true.\n  * \\sa forceAlignedAccess(), class ForceAlignedAccess\n  */\ntemplate<typename Derived>\ntemplate<bool Enable>\ninline typename internal::add_const_on_value_type<typename internal::conditional<Enable,ForceAlignedAccess<Derived>,Derived&>::type>::type\nMatrixBase<Derived>::forceAlignedAccessIf() const\n{\n  return derived();\n}\n\n/** \\returns an expression of *this with forced aligned access if \\a Enable is true.\n  * \\sa forceAlignedAccess(), class ForceAlignedAccess\n  */\ntemplate<typename Derived>\ntemplate<bool Enable>\ninline typename internal::conditional<Enable,ForceAlignedAccess<Derived>,Derived&>::type\nMatrixBase<Derived>::forceAlignedAccessIf()\n{\n  return derived();\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_FORCEALIGNEDACCESS_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/Functors.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_FUNCTORS_H\n#define EIGEN_FUNCTORS_H\n\nnamespace Eigen {\n\nnamespace internal {\n\n// associative functors:\n\n/** \\internal\n  * \\brief Template functor to compute the sum of two scalars\n  *\n  * \\sa class CwiseBinaryOp, MatrixBase::operator+, class VectorwiseOp, MatrixBase::sum()\n  */\ntemplate<typename Scalar> struct scalar_sum_op {\n  EIGEN_EMPTY_STRUCT_CTOR(scalar_sum_op)\n  EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a, const Scalar& b) const { return a + b; }\n  template<typename Packet>\n  EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const\n  { return internal::padd(a,b); }\n  template<typename Packet>\n  EIGEN_STRONG_INLINE const Scalar predux(const Packet& a) const\n  { return internal::predux(a); }\n};\ntemplate<typename Scalar>\nstruct functor_traits<scalar_sum_op<Scalar> > {\n  enum {\n    Cost = NumTraits<Scalar>::AddCost,\n    PacketAccess = packet_traits<Scalar>::HasAdd\n  };\n};\n\n/** \\internal\n  * \\brief Template functor to compute the product of two scalars\n  *\n  * \\sa class CwiseBinaryOp, Cwise::operator*(), class VectorwiseOp, MatrixBase::redux()\n  */\ntemplate<typename LhsScalar,typename RhsScalar> struct scalar_product_op {\n  enum {\n    // TODO vectorize mixed product\n    Vectorizable = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasMul && packet_traits<RhsScalar>::HasMul\n  };\n  typedef typename scalar_product_traits<LhsScalar,RhsScalar>::ReturnType result_type;\n  EIGEN_EMPTY_STRUCT_CTOR(scalar_product_op)\n  EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const { return a * b; }\n  template<typename Packet>\n  EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const\n  { return internal::pmul(a,b); }\n  template<typename Packet>\n  EIGEN_STRONG_INLINE const result_type predux(const Packet& a) const\n  { return internal::predux_mul(a); }\n};\ntemplate<typename LhsScalar,typename RhsScalar>\nstruct functor_traits<scalar_product_op<LhsScalar,RhsScalar> > {\n  enum {\n    Cost = (NumTraits<LhsScalar>::MulCost + NumTraits<RhsScalar>::MulCost)/2, // rough estimate!\n    PacketAccess = scalar_product_op<LhsScalar,RhsScalar>::Vectorizable\n  };\n};\n\n/** \\internal\n  * \\brief Template functor to compute the conjugate product of two scalars\n  *\n  * This is a short cut for conj(x) * y which is needed for optimization purpose; in Eigen2 support mode, this becomes x * conj(y)\n  */\ntemplate<typename LhsScalar,typename RhsScalar> struct scalar_conj_product_op {\n\n  enum {\n    Conj = NumTraits<LhsScalar>::IsComplex\n  };\n  \n  typedef typename scalar_product_traits<LhsScalar,RhsScalar>::ReturnType result_type;\n  \n  EIGEN_EMPTY_STRUCT_CTOR(scalar_conj_product_op)\n  EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const\n  { return conj_helper<LhsScalar,RhsScalar,Conj,false>().pmul(a,b); }\n  \n  template<typename Packet>\n  EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const\n  { return conj_helper<Packet,Packet,Conj,false>().pmul(a,b); }\n};\ntemplate<typename LhsScalar,typename RhsScalar>\nstruct functor_traits<scalar_conj_product_op<LhsScalar,RhsScalar> > {\n  enum {\n    Cost = NumTraits<LhsScalar>::MulCost,\n    PacketAccess = internal::is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasMul\n  };\n};\n\n/** \\internal\n  * \\brief Template functor to compute the min of two scalars\n  *\n  * \\sa class CwiseBinaryOp, MatrixBase::cwiseMin, class VectorwiseOp, MatrixBase::minCoeff()\n  */\ntemplate<typename Scalar> struct scalar_min_op {\n  EIGEN_EMPTY_STRUCT_CTOR(scalar_min_op)\n  EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a, const Scalar& b) const { using std::min; return (min)(a, b); }\n  template<typename Packet>\n  EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const\n  { return internal::pmin(a,b); }\n  template<typename Packet>\n  EIGEN_STRONG_INLINE const Scalar predux(const Packet& a) const\n  { return internal::predux_min(a); }\n};\ntemplate<typename Scalar>\nstruct functor_traits<scalar_min_op<Scalar> > {\n  enum {\n    Cost = NumTraits<Scalar>::AddCost,\n    PacketAccess = packet_traits<Scalar>::HasMin\n  };\n};\n\n/** \\internal\n  * \\brief Template functor to compute the max of two scalars\n  *\n  * \\sa class CwiseBinaryOp, MatrixBase::cwiseMax, class VectorwiseOp, MatrixBase::maxCoeff()\n  */\ntemplate<typename Scalar> struct scalar_max_op {\n  EIGEN_EMPTY_STRUCT_CTOR(scalar_max_op)\n  EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a, const Scalar& b) const { using std::max; return (max)(a, b); }\n  template<typename Packet>\n  EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const\n  { return internal::pmax(a,b); }\n  template<typename Packet>\n  EIGEN_STRONG_INLINE const Scalar predux(const Packet& a) const\n  { return internal::predux_max(a); }\n};\ntemplate<typename Scalar>\nstruct functor_traits<scalar_max_op<Scalar> > {\n  enum {\n    Cost = NumTraits<Scalar>::AddCost,\n    PacketAccess = packet_traits<Scalar>::HasMax\n  };\n};\n\n/** \\internal\n  * \\brief Template functor to compute the hypot of two scalars\n  *\n  * \\sa MatrixBase::stableNorm(), class Redux\n  */\ntemplate<typename Scalar> struct scalar_hypot_op {\n  EIGEN_EMPTY_STRUCT_CTOR(scalar_hypot_op)\n//   typedef typename NumTraits<Scalar>::Real result_type;\n  EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& _x, const Scalar& _y) const\n  {\n    using std::max;\n    using std::min;\n    using std::sqrt;\n    Scalar p = (max)(_x, _y);\n    Scalar q = (min)(_x, _y);\n    Scalar qp = q/p;\n    return p * sqrt(Scalar(1) + qp*qp);\n  }\n};\ntemplate<typename Scalar>\nstruct functor_traits<scalar_hypot_op<Scalar> > {\n  enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess=0 };\n};\n\n/** \\internal\n  * \\brief Template functor to compute the pow of two scalars\n  */\ntemplate<typename Scalar, typename OtherScalar> struct scalar_binary_pow_op {\n  EIGEN_EMPTY_STRUCT_CTOR(scalar_binary_pow_op)\n  inline Scalar operator() (const Scalar& a, const OtherScalar& b) const { return numext::pow(a, b); }\n};\ntemplate<typename Scalar, typename OtherScalar>\nstruct functor_traits<scalar_binary_pow_op<Scalar,OtherScalar> > {\n  enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = false };\n};\n\n// other binary functors:\n\n/** \\internal\n  * \\brief Template functor to compute the difference of two scalars\n  *\n  * \\sa class CwiseBinaryOp, MatrixBase::operator-\n  */\ntemplate<typename Scalar> struct scalar_difference_op {\n  EIGEN_EMPTY_STRUCT_CTOR(scalar_difference_op)\n  EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a, const Scalar& b) const { return a - b; }\n  template<typename Packet>\n  EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const\n  { return internal::psub(a,b); }\n};\ntemplate<typename Scalar>\nstruct functor_traits<scalar_difference_op<Scalar> > {\n  enum {\n    Cost = NumTraits<Scalar>::AddCost,\n    PacketAccess = packet_traits<Scalar>::HasSub\n  };\n};\n\n/** \\internal\n  * \\brief Template functor to compute the quotient of two scalars\n  *\n  * \\sa class CwiseBinaryOp, Cwise::operator/()\n  */\ntemplate<typename LhsScalar,typename RhsScalar> struct scalar_quotient_op {\n  enum {\n    // TODO vectorize mixed product\n    Vectorizable = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasDiv && packet_traits<RhsScalar>::HasDiv\n  };\n  typedef typename scalar_product_traits<LhsScalar,RhsScalar>::ReturnType result_type;\n  EIGEN_EMPTY_STRUCT_CTOR(scalar_quotient_op)\n  EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const { return a / b; }\n  template<typename Packet>\n  EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const\n  { return internal::pdiv(a,b); }\n};\ntemplate<typename LhsScalar,typename RhsScalar>\nstruct functor_traits<scalar_quotient_op<LhsScalar,RhsScalar> > {\n  enum {\n    Cost = (NumTraits<LhsScalar>::MulCost + NumTraits<RhsScalar>::MulCost), // rough estimate!\n    PacketAccess = scalar_quotient_op<LhsScalar,RhsScalar>::Vectorizable\n  };\n};\n\n\n\n/** \\internal\n  * \\brief Template functor to compute the and of two booleans\n  *\n  * \\sa class CwiseBinaryOp, ArrayBase::operator&&\n  */\nstruct scalar_boolean_and_op {\n  EIGEN_EMPTY_STRUCT_CTOR(scalar_boolean_and_op)\n  EIGEN_STRONG_INLINE bool operator() (const bool& a, const bool& b) const { return a && b; }\n};\ntemplate<> struct functor_traits<scalar_boolean_and_op> {\n  enum {\n    Cost = NumTraits<bool>::AddCost,\n    PacketAccess = false\n  };\n};\n\n/** \\internal\n  * \\brief Template functor to compute the or of two booleans\n  *\n  * \\sa class CwiseBinaryOp, ArrayBase::operator||\n  */\nstruct scalar_boolean_or_op {\n  EIGEN_EMPTY_STRUCT_CTOR(scalar_boolean_or_op)\n  EIGEN_STRONG_INLINE bool operator() (const bool& a, const bool& b) const { return a || b; }\n};\ntemplate<> struct functor_traits<scalar_boolean_or_op> {\n  enum {\n    Cost = NumTraits<bool>::AddCost,\n    PacketAccess = false\n  };\n};\n\n/** \\internal\n  * \\brief Template functors for comparison of two scalars\n  * \\todo Implement packet-comparisons\n  */\ntemplate<typename Scalar, ComparisonName cmp> struct scalar_cmp_op;\n\ntemplate<typename Scalar, ComparisonName cmp>\nstruct functor_traits<scalar_cmp_op<Scalar, cmp> > {\n  enum {\n    Cost = NumTraits<Scalar>::AddCost,\n    PacketAccess = false\n  };\n};\n\ntemplate<ComparisonName Cmp, typename Scalar>\nstruct result_of<scalar_cmp_op<Scalar, Cmp>(Scalar,Scalar)> {\n  typedef bool type;\n};\n\n\ntemplate<typename Scalar> struct scalar_cmp_op<Scalar, cmp_EQ> {\n  EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op)\n  EIGEN_STRONG_INLINE bool operator()(const Scalar& a, const Scalar& b) const {return a==b;}\n};\ntemplate<typename Scalar> struct scalar_cmp_op<Scalar, cmp_LT> {\n  EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op)\n  EIGEN_STRONG_INLINE bool operator()(const Scalar& a, const Scalar& b) const {return a<b;}\n};\ntemplate<typename Scalar> struct scalar_cmp_op<Scalar, cmp_LE> {\n  EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op)\n  EIGEN_STRONG_INLINE bool operator()(const Scalar& a, const Scalar& b) const {return a<=b;}\n};\ntemplate<typename Scalar> struct scalar_cmp_op<Scalar, cmp_UNORD> {\n  EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op)\n  EIGEN_STRONG_INLINE bool operator()(const Scalar& a, const Scalar& b) const {return !(a<=b || b<=a);}\n};\ntemplate<typename Scalar> struct scalar_cmp_op<Scalar, cmp_NEQ> {\n  EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op)\n  EIGEN_STRONG_INLINE bool operator()(const Scalar& a, const Scalar& b) const {return a!=b;}\n};\n\n// unary functors:\n\n/** \\internal\n  * \\brief Template functor to compute the opposite of a scalar\n  *\n  * \\sa class CwiseUnaryOp, MatrixBase::operator-\n  */\ntemplate<typename Scalar> struct scalar_opposite_op {\n  EIGEN_EMPTY_STRUCT_CTOR(scalar_opposite_op)\n  EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { return -a; }\n  template<typename Packet>\n  EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const\n  { return internal::pnegate(a); }\n};\ntemplate<typename Scalar>\nstruct functor_traits<scalar_opposite_op<Scalar> >\n{ enum {\n    Cost = NumTraits<Scalar>::AddCost,\n    PacketAccess = packet_traits<Scalar>::HasNegate };\n};\n\n/** \\internal\n  * \\brief Template functor to compute the absolute value of a scalar\n  *\n  * \\sa class CwiseUnaryOp, Cwise::abs\n  */\ntemplate<typename Scalar> struct scalar_abs_op {\n  EIGEN_EMPTY_STRUCT_CTOR(scalar_abs_op)\n  typedef typename NumTraits<Scalar>::Real result_type;\n  EIGEN_STRONG_INLINE const result_type operator() (const Scalar& a) const { using std::abs; return abs(a); }\n  template<typename Packet>\n  EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const\n  { return internal::pabs(a); }\n};\ntemplate<typename Scalar>\nstruct functor_traits<scalar_abs_op<Scalar> >\n{\n  enum {\n    Cost = NumTraits<Scalar>::AddCost,\n    PacketAccess = packet_traits<Scalar>::HasAbs\n  };\n};\n\n/** \\internal\n  * \\brief Template functor to compute the squared absolute value of a scalar\n  *\n  * \\sa class CwiseUnaryOp, Cwise::abs2\n  */\ntemplate<typename Scalar> struct scalar_abs2_op {\n  EIGEN_EMPTY_STRUCT_CTOR(scalar_abs2_op)\n  typedef typename NumTraits<Scalar>::Real result_type;\n  EIGEN_STRONG_INLINE const result_type operator() (const Scalar& a) const { return numext::abs2(a); }\n  template<typename Packet>\n  EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const\n  { return internal::pmul(a,a); }\n};\ntemplate<typename Scalar>\nstruct functor_traits<scalar_abs2_op<Scalar> >\n{ enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasAbs2 }; };\n\n/** \\internal\n  * \\brief Template functor to compute the conjugate of a complex value\n  *\n  * \\sa class CwiseUnaryOp, MatrixBase::conjugate()\n  */\ntemplate<typename Scalar> struct scalar_conjugate_op {\n  EIGEN_EMPTY_STRUCT_CTOR(scalar_conjugate_op)\n  EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { using numext::conj; return conj(a); }\n  template<typename Packet>\n  EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const { return internal::pconj(a); }\n};\ntemplate<typename Scalar>\nstruct functor_traits<scalar_conjugate_op<Scalar> >\n{\n  enum {\n    Cost = NumTraits<Scalar>::IsComplex ? NumTraits<Scalar>::AddCost : 0,\n    PacketAccess = packet_traits<Scalar>::HasConj\n  };\n};\n\n/** \\internal\n  * \\brief Template functor to cast a scalar to another type\n  *\n  * \\sa class CwiseUnaryOp, MatrixBase::cast()\n  */\ntemplate<typename Scalar, typename NewType>\nstruct scalar_cast_op {\n  EIGEN_EMPTY_STRUCT_CTOR(scalar_cast_op)\n  typedef NewType result_type;\n  EIGEN_STRONG_INLINE const NewType operator() (const Scalar& a) const { return cast<Scalar, NewType>(a); }\n};\ntemplate<typename Scalar, typename NewType>\nstruct functor_traits<scalar_cast_op<Scalar,NewType> >\n{ enum { Cost = is_same<Scalar, NewType>::value ? 0 : NumTraits<NewType>::AddCost, PacketAccess = false }; };\n\n/** \\internal\n  * \\brief Template functor to extract the real part of a complex\n  *\n  * \\sa class CwiseUnaryOp, MatrixBase::real()\n  */\ntemplate<typename Scalar>\nstruct scalar_real_op {\n  EIGEN_EMPTY_STRUCT_CTOR(scalar_real_op)\n  typedef typename NumTraits<Scalar>::Real result_type;\n  EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return numext::real(a); }\n};\ntemplate<typename Scalar>\nstruct functor_traits<scalar_real_op<Scalar> >\n{ enum { Cost = 0, PacketAccess = false }; };\n\n/** \\internal\n  * \\brief Template functor to extract the imaginary part of a complex\n  *\n  * \\sa class CwiseUnaryOp, MatrixBase::imag()\n  */\ntemplate<typename Scalar>\nstruct scalar_imag_op {\n  EIGEN_EMPTY_STRUCT_CTOR(scalar_imag_op)\n  typedef typename NumTraits<Scalar>::Real result_type;\n  EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return numext::imag(a); }\n};\ntemplate<typename Scalar>\nstruct functor_traits<scalar_imag_op<Scalar> >\n{ enum { Cost = 0, PacketAccess = false }; };\n\n/** \\internal\n  * \\brief Template functor to extract the real part of a complex as a reference\n  *\n  * \\sa class CwiseUnaryOp, MatrixBase::real()\n  */\ntemplate<typename Scalar>\nstruct scalar_real_ref_op {\n  EIGEN_EMPTY_STRUCT_CTOR(scalar_real_ref_op)\n  typedef typename NumTraits<Scalar>::Real result_type;\n  EIGEN_STRONG_INLINE result_type& operator() (const Scalar& a) const { return numext::real_ref(*const_cast<Scalar*>(&a)); }\n};\ntemplate<typename Scalar>\nstruct functor_traits<scalar_real_ref_op<Scalar> >\n{ enum { Cost = 0, PacketAccess = false }; };\n\n/** \\internal\n  * \\brief Template functor to extract the imaginary part of a complex as a reference\n  *\n  * \\sa class CwiseUnaryOp, MatrixBase::imag()\n  */\ntemplate<typename Scalar>\nstruct scalar_imag_ref_op {\n  EIGEN_EMPTY_STRUCT_CTOR(scalar_imag_ref_op)\n  typedef typename NumTraits<Scalar>::Real result_type;\n  EIGEN_STRONG_INLINE result_type& operator() (const Scalar& a) const { return numext::imag_ref(*const_cast<Scalar*>(&a)); }\n};\ntemplate<typename Scalar>\nstruct functor_traits<scalar_imag_ref_op<Scalar> >\n{ enum { Cost = 0, PacketAccess = false }; };\n\n/** \\internal\n  *\n  * \\brief Template functor to compute the exponential of a scalar\n  *\n  * \\sa class CwiseUnaryOp, Cwise::exp()\n  */\ntemplate<typename Scalar> struct scalar_exp_op {\n  EIGEN_EMPTY_STRUCT_CTOR(scalar_exp_op)\n  inline const Scalar operator() (const Scalar& a) const { using std::exp; return exp(a); }\n  typedef typename packet_traits<Scalar>::type Packet;\n  inline Packet packetOp(const Packet& a) const { return internal::pexp(a); }\n};\ntemplate<typename Scalar>\nstruct functor_traits<scalar_exp_op<Scalar> >\n{ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasExp }; };\n\n/** \\internal\n  *\n  * \\brief Template functor to compute the logarithm of a scalar\n  *\n  * \\sa class CwiseUnaryOp, Cwise::log()\n  */\ntemplate<typename Scalar> struct scalar_log_op {\n  EIGEN_EMPTY_STRUCT_CTOR(scalar_log_op)\n  inline const Scalar operator() (const Scalar& a) const { using std::log; return log(a); }\n  typedef typename packet_traits<Scalar>::type Packet;\n  inline Packet packetOp(const Packet& a) const { return internal::plog(a); }\n};\ntemplate<typename Scalar>\nstruct functor_traits<scalar_log_op<Scalar> >\n{ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasLog }; };\n\n/** \\internal\n  * \\brief Template functor to multiply a scalar by a fixed other one\n  *\n  * \\sa class CwiseUnaryOp, MatrixBase::operator*, MatrixBase::operator/\n  */\n/* NOTE why doing the pset1() in packetOp *is* an optimization ?\n * indeed it seems better to declare m_other as a Packet and do the pset1() once\n * in the constructor. However, in practice:\n *  - GCC does not like m_other as a Packet and generate a load every time it needs it\n *  - on the other hand GCC is able to moves the pset1() outside the loop :)\n *  - simpler code ;)\n * (ICC and gcc 4.4 seems to perform well in both cases, the issue is visible with y = a*x + b*y)\n */\ntemplate<typename Scalar>\nstruct scalar_multiple_op {\n  typedef typename packet_traits<Scalar>::type Packet;\n  // FIXME default copy constructors seems bugged with std::complex<>\n  EIGEN_STRONG_INLINE scalar_multiple_op(const scalar_multiple_op& other) : m_other(other.m_other) { }\n  EIGEN_STRONG_INLINE scalar_multiple_op(const Scalar& other) : m_other(other) { }\n  EIGEN_STRONG_INLINE Scalar operator() (const Scalar& a) const { return a * m_other; }\n  EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const\n  { return internal::pmul(a, pset1<Packet>(m_other)); }\n  typename add_const_on_value_type<typename NumTraits<Scalar>::Nested>::type m_other;\n};\ntemplate<typename Scalar>\nstruct functor_traits<scalar_multiple_op<Scalar> >\n{ enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; };\n\ntemplate<typename Scalar1, typename Scalar2>\nstruct scalar_multiple2_op {\n  typedef typename scalar_product_traits<Scalar1,Scalar2>::ReturnType result_type;\n  EIGEN_STRONG_INLINE scalar_multiple2_op(const scalar_multiple2_op& other) : m_other(other.m_other) { }\n  EIGEN_STRONG_INLINE scalar_multiple2_op(const Scalar2& other) : m_other(other) { }\n  EIGEN_STRONG_INLINE result_type operator() (const Scalar1& a) const { return a * m_other; }\n  typename add_const_on_value_type<typename NumTraits<Scalar2>::Nested>::type m_other;\n};\ntemplate<typename Scalar1,typename Scalar2>\nstruct functor_traits<scalar_multiple2_op<Scalar1,Scalar2> >\n{ enum { Cost = NumTraits<Scalar1>::MulCost, PacketAccess = false }; };\n\n/** \\internal\n  * \\brief Template functor to divide a scalar by a fixed other one\n  *\n  * This functor is used to implement the quotient of a matrix by\n  * a scalar where the scalar type is not necessarily a floating point type.\n  *\n  * \\sa class CwiseUnaryOp, MatrixBase::operator/\n  */\ntemplate<typename Scalar>\nstruct scalar_quotient1_op {\n  typedef typename packet_traits<Scalar>::type Packet;\n  // FIXME default copy constructors seems bugged with std::complex<>\n  EIGEN_STRONG_INLINE scalar_quotient1_op(const scalar_quotient1_op& other) : m_other(other.m_other) { }\n  EIGEN_STRONG_INLINE scalar_quotient1_op(const Scalar& other) : m_other(other) {}\n  EIGEN_STRONG_INLINE Scalar operator() (const Scalar& a) const { return a / m_other; }\n  EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const\n  { return internal::pdiv(a, pset1<Packet>(m_other)); }\n  typename add_const_on_value_type<typename NumTraits<Scalar>::Nested>::type m_other;\n};\ntemplate<typename Scalar>\nstruct functor_traits<scalar_quotient1_op<Scalar> >\n{ enum { Cost = 2 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasDiv }; };\n\n// nullary functors\n\ntemplate<typename Scalar>\nstruct scalar_constant_op {\n  typedef typename packet_traits<Scalar>::type Packet;\n  EIGEN_STRONG_INLINE scalar_constant_op(const scalar_constant_op& other) : m_other(other.m_other) { }\n  EIGEN_STRONG_INLINE scalar_constant_op(const Scalar& other) : m_other(other) { }\n  template<typename Index>\n  EIGEN_STRONG_INLINE const Scalar operator() (Index, Index = 0) const { return m_other; }\n  template<typename Index>\n  EIGEN_STRONG_INLINE const Packet packetOp(Index, Index = 0) const { return internal::pset1<Packet>(m_other); }\n  const Scalar m_other;\n};\ntemplate<typename Scalar>\nstruct functor_traits<scalar_constant_op<Scalar> >\n// FIXME replace this packet test by a safe one\n{ enum { Cost = 1, PacketAccess = packet_traits<Scalar>::Vectorizable, IsRepeatable = true }; };\n\ntemplate<typename Scalar> struct scalar_identity_op {\n  EIGEN_EMPTY_STRUCT_CTOR(scalar_identity_op)\n  template<typename Index>\n  EIGEN_STRONG_INLINE const Scalar operator() (Index row, Index col) const { return row==col ? Scalar(1) : Scalar(0); }\n};\ntemplate<typename Scalar>\nstruct functor_traits<scalar_identity_op<Scalar> >\n{ enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = false, IsRepeatable = true }; };\n\ntemplate <typename Scalar, bool RandomAccess> struct linspaced_op_impl;\n\n// linear access for packet ops:\n// 1) initialization\n//   base = [low, ..., low] + ([step, ..., step] * [-size, ..., 0])\n// 2) each step (where size is 1 for coeff access or PacketSize for packet access)\n//   base += [size*step, ..., size*step]\n//\n// TODO: Perhaps it's better to initialize lazily (so not in the constructor but in packetOp)\n//       in order to avoid the padd() in operator() ?\ntemplate <typename Scalar>\nstruct linspaced_op_impl<Scalar,false>\n{\n  typedef typename packet_traits<Scalar>::type Packet;\n\n  linspaced_op_impl(const Scalar& low, const Scalar& step) :\n  m_low(low), m_step(step),\n  m_packetStep(pset1<Packet>(packet_traits<Scalar>::size*step)),\n  m_base(padd(pset1<Packet>(low), pmul(pset1<Packet>(step),plset<Scalar>(-packet_traits<Scalar>::size)))) {}\n\n  template<typename Index>\n  EIGEN_STRONG_INLINE const Scalar operator() (Index i) const \n  { \n    m_base = padd(m_base, pset1<Packet>(m_step));\n    return m_low+Scalar(i)*m_step; \n  }\n\n  template<typename Index>\n  EIGEN_STRONG_INLINE const Packet packetOp(Index) const { return m_base = padd(m_base,m_packetStep); }\n\n  const Scalar m_low;\n  const Scalar m_step;\n  const Packet m_packetStep;\n  mutable Packet m_base;\n};\n\n// random access for packet ops:\n// 1) each step\n//   [low, ..., low] + ( [step, ..., step] * ( [i, ..., i] + [0, ..., size] ) )\ntemplate <typename Scalar>\nstruct linspaced_op_impl<Scalar,true>\n{\n  typedef typename packet_traits<Scalar>::type Packet;\n\n  linspaced_op_impl(const Scalar& low, const Scalar& step) :\n  m_low(low), m_step(step),\n  m_lowPacket(pset1<Packet>(m_low)), m_stepPacket(pset1<Packet>(m_step)), m_interPacket(plset<Scalar>(0)) {}\n\n  template<typename Index>\n  EIGEN_STRONG_INLINE const Scalar operator() (Index i) const { return m_low+i*m_step; }\n\n  template<typename Index>\n  EIGEN_STRONG_INLINE const Packet packetOp(Index i) const\n  { return internal::padd(m_lowPacket, pmul(m_stepPacket, padd(pset1<Packet>(Scalar(i)),m_interPacket))); }\n\n  const Scalar m_low;\n  const Scalar m_step;\n  const Packet m_lowPacket;\n  const Packet m_stepPacket;\n  const Packet m_interPacket;\n};\n\n// ----- Linspace functor ----------------------------------------------------------------\n\n// Forward declaration (we default to random access which does not really give\n// us a speed gain when using packet access but it allows to use the functor in\n// nested expressions).\ntemplate <typename Scalar, bool RandomAccess = true> struct linspaced_op;\ntemplate <typename Scalar, bool RandomAccess> struct functor_traits< linspaced_op<Scalar,RandomAccess> >\n{ enum { Cost = 1, PacketAccess = packet_traits<Scalar>::HasSetLinear, IsRepeatable = true }; };\ntemplate <typename Scalar, bool RandomAccess> struct linspaced_op\n{\n  typedef typename packet_traits<Scalar>::type Packet;\n  linspaced_op(const Scalar& low, const Scalar& high, DenseIndex num_steps) : impl((num_steps==1 ? high : low), (num_steps==1 ? Scalar() : (high-low)/Scalar(num_steps-1))) {}\n\n  template<typename Index>\n  EIGEN_STRONG_INLINE const Scalar operator() (Index i) const { return impl(i); }\n\n  // We need this function when assigning e.g. a RowVectorXd to a MatrixXd since\n  // there row==0 and col is used for the actual iteration.\n  template<typename Index>\n  EIGEN_STRONG_INLINE const Scalar operator() (Index row, Index col) const \n  {\n    eigen_assert(col==0 || row==0);\n    return impl(col + row);\n  }\n\n  template<typename Index>\n  EIGEN_STRONG_INLINE const Packet packetOp(Index i) const { return impl.packetOp(i); }\n\n  // We need this function when assigning e.g. a RowVectorXd to a MatrixXd since\n  // there row==0 and col is used for the actual iteration.\n  template<typename Index>\n  EIGEN_STRONG_INLINE const Packet packetOp(Index row, Index col) const\n  {\n    eigen_assert(col==0 || row==0);\n    return impl.packetOp(col + row);\n  }\n\n  // This proxy object handles the actual required temporaries, the different\n  // implementations (random vs. sequential access) as well as the\n  // correct piping to size 2/4 packet operations.\n  const linspaced_op_impl<Scalar,RandomAccess> impl;\n};\n\n// all functors allow linear access, except scalar_identity_op. So we fix here a quick meta\n// to indicate whether a functor allows linear access, just always answering 'yes' except for\n// scalar_identity_op.\n// FIXME move this to functor_traits adding a functor_default\ntemplate<typename Functor> struct functor_has_linear_access { enum { ret = 1 }; };\ntemplate<typename Scalar> struct functor_has_linear_access<scalar_identity_op<Scalar> > { enum { ret = 0 }; };\n\n// In Eigen, any binary op (Product, CwiseBinaryOp) require the Lhs and Rhs to have the same scalar type, except for multiplication\n// where the mixing of different types is handled by scalar_product_traits\n// In particular, real * complex<real> is allowed.\n// FIXME move this to functor_traits adding a functor_default\ntemplate<typename Functor> struct functor_is_product_like { enum { ret = 0 }; };\ntemplate<typename LhsScalar,typename RhsScalar> struct functor_is_product_like<scalar_product_op<LhsScalar,RhsScalar> > { enum { ret = 1 }; };\ntemplate<typename LhsScalar,typename RhsScalar> struct functor_is_product_like<scalar_conj_product_op<LhsScalar,RhsScalar> > { enum { ret = 1 }; };\ntemplate<typename LhsScalar,typename RhsScalar> struct functor_is_product_like<scalar_quotient_op<LhsScalar,RhsScalar> > { enum { ret = 1 }; };\n\n\n/** \\internal\n  * \\brief Template functor to add a scalar to a fixed other one\n  * \\sa class CwiseUnaryOp, Array::operator+\n  */\n/* If you wonder why doing the pset1() in packetOp() is an optimization check scalar_multiple_op */\ntemplate<typename Scalar>\nstruct scalar_add_op {\n  typedef typename packet_traits<Scalar>::type Packet;\n  // FIXME default copy constructors seems bugged with std::complex<>\n  inline scalar_add_op(const scalar_add_op& other) : m_other(other.m_other) { }\n  inline scalar_add_op(const Scalar& other) : m_other(other) { }\n  inline Scalar operator() (const Scalar& a) const { return a + m_other; }\n  inline const Packet packetOp(const Packet& a) const\n  { return internal::padd(a, pset1<Packet>(m_other)); }\n  const Scalar m_other;\n};\ntemplate<typename Scalar>\nstruct functor_traits<scalar_add_op<Scalar> >\n{ enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = packet_traits<Scalar>::HasAdd }; };\n\n/** \\internal\n  * \\brief Template functor to compute the square root of a scalar\n  * \\sa class CwiseUnaryOp, Cwise::sqrt()\n  */\ntemplate<typename Scalar> struct scalar_sqrt_op {\n  EIGEN_EMPTY_STRUCT_CTOR(scalar_sqrt_op)\n  inline const Scalar operator() (const Scalar& a) const { using std::sqrt; return sqrt(a); }\n  typedef typename packet_traits<Scalar>::type Packet;\n  inline Packet packetOp(const Packet& a) const { return internal::psqrt(a); }\n};\ntemplate<typename Scalar>\nstruct functor_traits<scalar_sqrt_op<Scalar> >\n{ enum {\n    Cost = 5 * NumTraits<Scalar>::MulCost,\n    PacketAccess = packet_traits<Scalar>::HasSqrt\n  };\n};\n\n/** \\internal\n  * \\brief Template functor to compute the cosine of a scalar\n  * \\sa class CwiseUnaryOp, ArrayBase::cos()\n  */\ntemplate<typename Scalar> struct scalar_cos_op {\n  EIGEN_EMPTY_STRUCT_CTOR(scalar_cos_op)\n  inline Scalar operator() (const Scalar& a) const { using std::cos; return cos(a); }\n  typedef typename packet_traits<Scalar>::type Packet;\n  inline Packet packetOp(const Packet& a) const { return internal::pcos(a); }\n};\ntemplate<typename Scalar>\nstruct functor_traits<scalar_cos_op<Scalar> >\n{\n  enum {\n    Cost = 5 * NumTraits<Scalar>::MulCost,\n    PacketAccess = packet_traits<Scalar>::HasCos\n  };\n};\n\n/** \\internal\n  * \\brief Template functor to compute the sine of a scalar\n  * \\sa class CwiseUnaryOp, ArrayBase::sin()\n  */\ntemplate<typename Scalar> struct scalar_sin_op {\n  EIGEN_EMPTY_STRUCT_CTOR(scalar_sin_op)\n  inline const Scalar operator() (const Scalar& a) const { using std::sin; return sin(a); }\n  typedef typename packet_traits<Scalar>::type Packet;\n  inline Packet packetOp(const Packet& a) const { return internal::psin(a); }\n};\ntemplate<typename Scalar>\nstruct functor_traits<scalar_sin_op<Scalar> >\n{\n  enum {\n    Cost = 5 * NumTraits<Scalar>::MulCost,\n    PacketAccess = packet_traits<Scalar>::HasSin\n  };\n};\n\n\n/** \\internal\n  * \\brief Template functor to compute the tan of a scalar\n  * \\sa class CwiseUnaryOp, ArrayBase::tan()\n  */\ntemplate<typename Scalar> struct scalar_tan_op {\n  EIGEN_EMPTY_STRUCT_CTOR(scalar_tan_op)\n  inline const Scalar operator() (const Scalar& a) const { using std::tan; return tan(a); }\n  typedef typename packet_traits<Scalar>::type Packet;\n  inline Packet packetOp(const Packet& a) const { return internal::ptan(a); }\n};\ntemplate<typename Scalar>\nstruct functor_traits<scalar_tan_op<Scalar> >\n{\n  enum {\n    Cost = 5 * NumTraits<Scalar>::MulCost,\n    PacketAccess = packet_traits<Scalar>::HasTan\n  };\n};\n\n/** \\internal\n  * \\brief Template functor to compute the arc cosine of a scalar\n  * \\sa class CwiseUnaryOp, ArrayBase::acos()\n  */\ntemplate<typename Scalar> struct scalar_acos_op {\n  EIGEN_EMPTY_STRUCT_CTOR(scalar_acos_op)\n  inline const Scalar operator() (const Scalar& a) const { using std::acos; return acos(a); }\n  typedef typename packet_traits<Scalar>::type Packet;\n  inline Packet packetOp(const Packet& a) const { return internal::pacos(a); }\n};\ntemplate<typename Scalar>\nstruct functor_traits<scalar_acos_op<Scalar> >\n{\n  enum {\n    Cost = 5 * NumTraits<Scalar>::MulCost,\n    PacketAccess = packet_traits<Scalar>::HasACos\n  };\n};\n\n/** \\internal\n  * \\brief Template functor to compute the arc sine of a scalar\n  * \\sa class CwiseUnaryOp, ArrayBase::asin()\n  */\ntemplate<typename Scalar> struct scalar_asin_op {\n  EIGEN_EMPTY_STRUCT_CTOR(scalar_asin_op)\n  inline const Scalar operator() (const Scalar& a) const { using std::asin; return asin(a); }\n  typedef typename packet_traits<Scalar>::type Packet;\n  inline Packet packetOp(const Packet& a) const { return internal::pasin(a); }\n};\ntemplate<typename Scalar>\nstruct functor_traits<scalar_asin_op<Scalar> >\n{\n  enum {\n    Cost = 5 * NumTraits<Scalar>::MulCost,\n    PacketAccess = packet_traits<Scalar>::HasASin\n  };\n};\n\n/** \\internal\n  * \\brief Template functor to raise a scalar to a power\n  * \\sa class CwiseUnaryOp, Cwise::pow\n  */\ntemplate<typename Scalar>\nstruct scalar_pow_op {\n  // FIXME default copy constructors seems bugged with std::complex<>\n  inline scalar_pow_op(const scalar_pow_op& other) : m_exponent(other.m_exponent) { }\n  inline scalar_pow_op(const Scalar& exponent) : m_exponent(exponent) {}\n  inline Scalar operator() (const Scalar& a) const { return numext::pow(a, m_exponent); }\n  const Scalar m_exponent;\n};\ntemplate<typename Scalar>\nstruct functor_traits<scalar_pow_op<Scalar> >\n{ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = false }; };\n\n/** \\internal\n  * \\brief Template functor to compute the quotient between a scalar and array entries.\n  * \\sa class CwiseUnaryOp, Cwise::inverse()\n  */\ntemplate<typename Scalar>\nstruct scalar_inverse_mult_op {\n  scalar_inverse_mult_op(const Scalar& other) : m_other(other) {}\n  inline Scalar operator() (const Scalar& a) const { return m_other / a; }\n  template<typename Packet>\n  inline const Packet packetOp(const Packet& a) const\n  { return internal::pdiv(pset1<Packet>(m_other),a); }\n  Scalar m_other;\n};\n\n/** \\internal\n  * \\brief Template functor to compute the inverse of a scalar\n  * \\sa class CwiseUnaryOp, Cwise::inverse()\n  */\ntemplate<typename Scalar>\nstruct scalar_inverse_op {\n  EIGEN_EMPTY_STRUCT_CTOR(scalar_inverse_op)\n  inline Scalar operator() (const Scalar& a) const { return Scalar(1)/a; }\n  template<typename Packet>\n  inline const Packet packetOp(const Packet& a) const\n  { return internal::pdiv(pset1<Packet>(Scalar(1)),a); }\n};\ntemplate<typename Scalar>\nstruct functor_traits<scalar_inverse_op<Scalar> >\n{ enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasDiv }; };\n\n/** \\internal\n  * \\brief Template functor to compute the square of a scalar\n  * \\sa class CwiseUnaryOp, Cwise::square()\n  */\ntemplate<typename Scalar>\nstruct scalar_square_op {\n  EIGEN_EMPTY_STRUCT_CTOR(scalar_square_op)\n  inline Scalar operator() (const Scalar& a) const { return a*a; }\n  template<typename Packet>\n  inline const Packet packetOp(const Packet& a) const\n  { return internal::pmul(a,a); }\n};\ntemplate<typename Scalar>\nstruct functor_traits<scalar_square_op<Scalar> >\n{ enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; };\n\n/** \\internal\n  * \\brief Template functor to compute the cube of a scalar\n  * \\sa class CwiseUnaryOp, Cwise::cube()\n  */\ntemplate<typename Scalar>\nstruct scalar_cube_op {\n  EIGEN_EMPTY_STRUCT_CTOR(scalar_cube_op)\n  inline Scalar operator() (const Scalar& a) const { return a*a*a; }\n  template<typename Packet>\n  inline const Packet packetOp(const Packet& a) const\n  { return internal::pmul(a,pmul(a,a)); }\n};\ntemplate<typename Scalar>\nstruct functor_traits<scalar_cube_op<Scalar> >\n{ enum { Cost = 2*NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; };\n\n// default functor traits for STL functors:\n\ntemplate<typename T>\nstruct functor_traits<std::multiplies<T> >\n{ enum { Cost = NumTraits<T>::MulCost, PacketAccess = false }; };\n\ntemplate<typename T>\nstruct functor_traits<std::divides<T> >\n{ enum { Cost = NumTraits<T>::MulCost, PacketAccess = false }; };\n\ntemplate<typename T>\nstruct functor_traits<std::plus<T> >\n{ enum { Cost = NumTraits<T>::AddCost, PacketAccess = false }; };\n\ntemplate<typename T>\nstruct functor_traits<std::minus<T> >\n{ enum { Cost = NumTraits<T>::AddCost, PacketAccess = false }; };\n\ntemplate<typename T>\nstruct functor_traits<std::negate<T> >\n{ enum { Cost = NumTraits<T>::AddCost, PacketAccess = false }; };\n\ntemplate<typename T>\nstruct functor_traits<std::logical_or<T> >\n{ enum { Cost = 1, PacketAccess = false }; };\n\ntemplate<typename T>\nstruct functor_traits<std::logical_and<T> >\n{ enum { Cost = 1, PacketAccess = false }; };\n\ntemplate<typename T>\nstruct functor_traits<std::logical_not<T> >\n{ enum { Cost = 1, PacketAccess = false }; };\n\ntemplate<typename T>\nstruct functor_traits<std::greater<T> >\n{ enum { Cost = 1, PacketAccess = false }; };\n\ntemplate<typename T>\nstruct functor_traits<std::less<T> >\n{ enum { Cost = 1, PacketAccess = false }; };\n\ntemplate<typename T>\nstruct functor_traits<std::greater_equal<T> >\n{ enum { Cost = 1, PacketAccess = false }; };\n\ntemplate<typename T>\nstruct functor_traits<std::less_equal<T> >\n{ enum { Cost = 1, PacketAccess = false }; };\n\ntemplate<typename T>\nstruct functor_traits<std::equal_to<T> >\n{ enum { Cost = 1, PacketAccess = false }; };\n\ntemplate<typename T>\nstruct functor_traits<std::not_equal_to<T> >\n{ enum { Cost = 1, PacketAccess = false }; };\n\ntemplate<typename T>\nstruct functor_traits<std::binder2nd<T> >\n{ enum { Cost = functor_traits<T>::Cost, PacketAccess = false }; };\n\ntemplate<typename T>\nstruct functor_traits<std::binder1st<T> >\n{ enum { Cost = functor_traits<T>::Cost, PacketAccess = false }; };\n\ntemplate<typename T>\nstruct functor_traits<std::unary_negate<T> >\n{ enum { Cost = 1 + functor_traits<T>::Cost, PacketAccess = false }; };\n\ntemplate<typename T>\nstruct functor_traits<std::binary_negate<T> >\n{ enum { Cost = 1 + functor_traits<T>::Cost, PacketAccess = false }; };\n\n#ifdef EIGEN_STDEXT_SUPPORT\n\ntemplate<typename T0,typename T1>\nstruct functor_traits<std::project1st<T0,T1> >\n{ enum { Cost = 0, PacketAccess = false }; };\n\ntemplate<typename T0,typename T1>\nstruct functor_traits<std::project2nd<T0,T1> >\n{ enum { Cost = 0, PacketAccess = false }; };\n\ntemplate<typename T0,typename T1>\nstruct functor_traits<std::select2nd<std::pair<T0,T1> > >\n{ enum { Cost = 0, PacketAccess = false }; };\n\ntemplate<typename T0,typename T1>\nstruct functor_traits<std::select1st<std::pair<T0,T1> > >\n{ enum { Cost = 0, PacketAccess = false }; };\n\ntemplate<typename T0,typename T1>\nstruct functor_traits<std::unary_compose<T0,T1> >\n{ enum { Cost = functor_traits<T0>::Cost + functor_traits<T1>::Cost, PacketAccess = false }; };\n\ntemplate<typename T0,typename T1,typename T2>\nstruct functor_traits<std::binary_compose<T0,T1,T2> >\n{ enum { Cost = functor_traits<T0>::Cost + functor_traits<T1>::Cost + functor_traits<T2>::Cost, PacketAccess = false }; };\n\n#endif // EIGEN_STDEXT_SUPPORT\n\n// allow to add new functors and specializations of functor_traits from outside Eigen.\n// this macro is really needed because functor_traits must be specialized after it is declared but before it is used...\n#ifdef EIGEN_FUNCTORS_PLUGIN\n#include EIGEN_FUNCTORS_PLUGIN\n#endif\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_FUNCTORS_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/Fuzzy.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_FUZZY_H\n#define EIGEN_FUZZY_H\n\nnamespace Eigen { \n\nnamespace internal\n{\n\ntemplate<typename Derived, typename OtherDerived, bool is_integer = NumTraits<typename Derived::Scalar>::IsInteger>\nstruct isApprox_selector\n{\n  static bool run(const Derived& x, const OtherDerived& y, const typename Derived::RealScalar& prec)\n  {\n    using std::min;\n    typename internal::nested<Derived,2>::type nested(x);\n    typename internal::nested<OtherDerived,2>::type otherNested(y);\n    return (nested - otherNested).cwiseAbs2().sum() <= prec * prec * (min)(nested.cwiseAbs2().sum(), otherNested.cwiseAbs2().sum());\n  }\n};\n\ntemplate<typename Derived, typename OtherDerived>\nstruct isApprox_selector<Derived, OtherDerived, true>\n{\n  static bool run(const Derived& x, const OtherDerived& y, const typename Derived::RealScalar&)\n  {\n    return x.matrix() == y.matrix();\n  }\n};\n\ntemplate<typename Derived, typename OtherDerived, bool is_integer = NumTraits<typename Derived::Scalar>::IsInteger>\nstruct isMuchSmallerThan_object_selector\n{\n  static bool run(const Derived& x, const OtherDerived& y, const typename Derived::RealScalar& prec)\n  {\n    return x.cwiseAbs2().sum() <= numext::abs2(prec) * y.cwiseAbs2().sum();\n  }\n};\n\ntemplate<typename Derived, typename OtherDerived>\nstruct isMuchSmallerThan_object_selector<Derived, OtherDerived, true>\n{\n  static bool run(const Derived& x, const OtherDerived&, const typename Derived::RealScalar&)\n  {\n    return x.matrix() == Derived::Zero(x.rows(), x.cols()).matrix();\n  }\n};\n\ntemplate<typename Derived, bool is_integer = NumTraits<typename Derived::Scalar>::IsInteger>\nstruct isMuchSmallerThan_scalar_selector\n{\n  static bool run(const Derived& x, const typename Derived::RealScalar& y, const typename Derived::RealScalar& prec)\n  {\n    return x.cwiseAbs2().sum() <= numext::abs2(prec * y);\n  }\n};\n\ntemplate<typename Derived>\nstruct isMuchSmallerThan_scalar_selector<Derived, true>\n{\n  static bool run(const Derived& x, const typename Derived::RealScalar&, const typename Derived::RealScalar&)\n  {\n    return x.matrix() == Derived::Zero(x.rows(), x.cols()).matrix();\n  }\n};\n\n} // end namespace internal\n\n\n/** \\returns \\c true if \\c *this is approximately equal to \\a other, within the precision\n  * determined by \\a prec.\n  *\n  * \\note The fuzzy compares are done multiplicatively. Two vectors \\f$ v \\f$ and \\f$ w \\f$\n  * are considered to be approximately equal within precision \\f$ p \\f$ if\n  * \\f[ \\Vert v - w \\Vert \\leqslant p\\,\\min(\\Vert v\\Vert, \\Vert w\\Vert). \\f]\n  * For matrices, the comparison is done using the Hilbert-Schmidt norm (aka Frobenius norm\n  * L2 norm).\n  *\n  * \\note Because of the multiplicativeness of this comparison, one can't use this function\n  * to check whether \\c *this is approximately equal to the zero matrix or vector.\n  * Indeed, \\c isApprox(zero) returns false unless \\c *this itself is exactly the zero matrix\n  * or vector. If you want to test whether \\c *this is zero, use internal::isMuchSmallerThan(const\n  * RealScalar&, RealScalar) instead.\n  *\n  * \\sa internal::isMuchSmallerThan(const RealScalar&, RealScalar) const\n  */\ntemplate<typename Derived>\ntemplate<typename OtherDerived>\nbool DenseBase<Derived>::isApprox(\n  const DenseBase<OtherDerived>& other,\n  const RealScalar& prec\n) const\n{\n  return internal::isApprox_selector<Derived, OtherDerived>::run(derived(), other.derived(), prec);\n}\n\n/** \\returns \\c true if the norm of \\c *this is much smaller than \\a other,\n  * within the precision determined by \\a prec.\n  *\n  * \\note The fuzzy compares are done multiplicatively. A vector \\f$ v \\f$ is\n  * considered to be much smaller than \\f$ x \\f$ within precision \\f$ p \\f$ if\n  * \\f[ \\Vert v \\Vert \\leqslant p\\,\\vert x\\vert. \\f]\n  *\n  * For matrices, the comparison is done using the Hilbert-Schmidt norm. For this reason,\n  * the value of the reference scalar \\a other should come from the Hilbert-Schmidt norm\n  * of a reference matrix of same dimensions.\n  *\n  * \\sa isApprox(), isMuchSmallerThan(const DenseBase<OtherDerived>&, RealScalar) const\n  */\ntemplate<typename Derived>\nbool DenseBase<Derived>::isMuchSmallerThan(\n  const typename NumTraits<Scalar>::Real& other,\n  const RealScalar& prec\n) const\n{\n  return internal::isMuchSmallerThan_scalar_selector<Derived>::run(derived(), other, prec);\n}\n\n/** \\returns \\c true if the norm of \\c *this is much smaller than the norm of \\a other,\n  * within the precision determined by \\a prec.\n  *\n  * \\note The fuzzy compares are done multiplicatively. A vector \\f$ v \\f$ is\n  * considered to be much smaller than a vector \\f$ w \\f$ within precision \\f$ p \\f$ if\n  * \\f[ \\Vert v \\Vert \\leqslant p\\,\\Vert w\\Vert. \\f]\n  * For matrices, the comparison is done using the Hilbert-Schmidt norm.\n  *\n  * \\sa isApprox(), isMuchSmallerThan(const RealScalar&, RealScalar) const\n  */\ntemplate<typename Derived>\ntemplate<typename OtherDerived>\nbool DenseBase<Derived>::isMuchSmallerThan(\n  const DenseBase<OtherDerived>& other,\n  const RealScalar& prec\n) const\n{\n  return internal::isMuchSmallerThan_object_selector<Derived, OtherDerived>::run(derived(), other.derived(), prec);\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_FUZZY_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/GeneralProduct.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n// Copyright (C) 2008-2011 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_GENERAL_PRODUCT_H\n#define EIGEN_GENERAL_PRODUCT_H\n\nnamespace Eigen { \n\n/** \\class GeneralProduct\n  * \\ingroup Core_Module\n  *\n  * \\brief Expression of the product of two general matrices or vectors\n  *\n  * \\param LhsNested the type used to store the left-hand side\n  * \\param RhsNested the type used to store the right-hand side\n  * \\param ProductMode the type of the product\n  *\n  * This class represents an expression of the product of two general matrices.\n  * We call a general matrix, a dense matrix with full storage. For instance,\n  * This excludes triangular, selfadjoint, and sparse matrices.\n  * It is the return type of the operator* between general matrices. Its template\n  * arguments are determined automatically by ProductReturnType. Therefore,\n  * GeneralProduct should never be used direclty. To determine the result type of a\n  * function which involves a matrix product, use ProductReturnType::Type.\n  *\n  * \\sa ProductReturnType, MatrixBase::operator*(const MatrixBase<OtherDerived>&)\n  */\ntemplate<typename Lhs, typename Rhs, int ProductType = internal::product_type<Lhs,Rhs>::value>\nclass GeneralProduct;\n\nenum {\n  Large = 2,\n  Small = 3\n};\n\nnamespace internal {\n\ntemplate<int Rows, int Cols, int Depth> struct product_type_selector;\n\ntemplate<int Size, int MaxSize> struct product_size_category\n{\n  enum { is_large = MaxSize == Dynamic ||\n                    Size >= EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD,\n         value = is_large  ? Large\n               : Size == 1 ? 1\n                           : Small\n  };\n};\n\ntemplate<typename Lhs, typename Rhs> struct product_type\n{\n  typedef typename remove_all<Lhs>::type _Lhs;\n  typedef typename remove_all<Rhs>::type _Rhs;\n  enum {\n    MaxRows  = _Lhs::MaxRowsAtCompileTime,\n    Rows  = _Lhs::RowsAtCompileTime,\n    MaxCols  = _Rhs::MaxColsAtCompileTime,\n    Cols  = _Rhs::ColsAtCompileTime,\n    MaxDepth = EIGEN_SIZE_MIN_PREFER_FIXED(_Lhs::MaxColsAtCompileTime,\n                                           _Rhs::MaxRowsAtCompileTime),\n    Depth = EIGEN_SIZE_MIN_PREFER_FIXED(_Lhs::ColsAtCompileTime,\n                                        _Rhs::RowsAtCompileTime),\n    LargeThreshold = EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD\n  };\n\n  // the splitting into different lines of code here, introducing the _select enums and the typedef below,\n  // is to work around an internal compiler error with gcc 4.1 and 4.2.\nprivate:\n  enum {\n    rows_select = product_size_category<Rows,MaxRows>::value,\n    cols_select = product_size_category<Cols,MaxCols>::value,\n    depth_select = product_size_category<Depth,MaxDepth>::value\n  };\n  typedef product_type_selector<rows_select, cols_select, depth_select> selector;\n\npublic:\n  enum {\n    value = selector::ret\n  };\n#ifdef EIGEN_DEBUG_PRODUCT\n  static void debug()\n  {\n      EIGEN_DEBUG_VAR(Rows);\n      EIGEN_DEBUG_VAR(Cols);\n      EIGEN_DEBUG_VAR(Depth);\n      EIGEN_DEBUG_VAR(rows_select);\n      EIGEN_DEBUG_VAR(cols_select);\n      EIGEN_DEBUG_VAR(depth_select);\n      EIGEN_DEBUG_VAR(value);\n  }\n#endif\n};\n\n\n/* The following allows to select the kind of product at compile time\n * based on the three dimensions of the product.\n * This is a compile time mapping from {1,Small,Large}^3 -> {product types} */\n// FIXME I'm not sure the current mapping is the ideal one.\ntemplate<int M, int N>  struct product_type_selector<M,N,1>              { enum { ret = OuterProduct }; };\ntemplate<int Depth>     struct product_type_selector<1,    1,    Depth>  { enum { ret = InnerProduct }; };\ntemplate<>              struct product_type_selector<1,    1,    1>      { enum { ret = InnerProduct }; };\ntemplate<>              struct product_type_selector<Small,1,    Small>  { enum { ret = CoeffBasedProductMode }; };\ntemplate<>              struct product_type_selector<1,    Small,Small>  { enum { ret = CoeffBasedProductMode }; };\ntemplate<>              struct product_type_selector<Small,Small,Small>  { enum { ret = CoeffBasedProductMode }; };\ntemplate<>              struct product_type_selector<Small, Small, 1>    { enum { ret = LazyCoeffBasedProductMode }; };\ntemplate<>              struct product_type_selector<Small, Large, 1>    { enum { ret = LazyCoeffBasedProductMode }; };\ntemplate<>              struct product_type_selector<Large, Small, 1>    { enum { ret = LazyCoeffBasedProductMode }; };\ntemplate<>              struct product_type_selector<1,    Large,Small>  { enum { ret = CoeffBasedProductMode }; };\ntemplate<>              struct product_type_selector<1,    Large,Large>  { enum { ret = GemvProduct }; };\ntemplate<>              struct product_type_selector<1,    Small,Large>  { enum { ret = CoeffBasedProductMode }; };\ntemplate<>              struct product_type_selector<Large,1,    Small>  { enum { ret = CoeffBasedProductMode }; };\ntemplate<>              struct product_type_selector<Large,1,    Large>  { enum { ret = GemvProduct }; };\ntemplate<>              struct product_type_selector<Small,1,    Large>  { enum { ret = CoeffBasedProductMode }; };\ntemplate<>              struct product_type_selector<Small,Small,Large>  { enum { ret = GemmProduct }; };\ntemplate<>              struct product_type_selector<Large,Small,Large>  { enum { ret = GemmProduct }; };\ntemplate<>              struct product_type_selector<Small,Large,Large>  { enum { ret = GemmProduct }; };\ntemplate<>              struct product_type_selector<Large,Large,Large>  { enum { ret = GemmProduct }; };\ntemplate<>              struct product_type_selector<Large,Small,Small>  { enum { ret = GemmProduct }; };\ntemplate<>              struct product_type_selector<Small,Large,Small>  { enum { ret = GemmProduct }; };\ntemplate<>              struct product_type_selector<Large,Large,Small>  { enum { ret = GemmProduct }; };\n\n} // end namespace internal\n\n/** \\class ProductReturnType\n  * \\ingroup Core_Module\n  *\n  * \\brief Helper class to get the correct and optimized returned type of operator*\n  *\n  * \\param Lhs the type of the left-hand side\n  * \\param Rhs the type of the right-hand side\n  * \\param ProductMode the type of the product (determined automatically by internal::product_mode)\n  *\n  * This class defines the typename Type representing the optimized product expression\n  * between two matrix expressions. In practice, using ProductReturnType<Lhs,Rhs>::Type\n  * is the recommended way to define the result type of a function returning an expression\n  * which involve a matrix product. The class Product should never be\n  * used directly.\n  *\n  * \\sa class Product, MatrixBase::operator*(const MatrixBase<OtherDerived>&)\n  */\ntemplate<typename Lhs, typename Rhs, int ProductType>\nstruct ProductReturnType\n{\n  // TODO use the nested type to reduce instanciations ????\n//   typedef typename internal::nested<Lhs,Rhs::ColsAtCompileTime>::type LhsNested;\n//   typedef typename internal::nested<Rhs,Lhs::RowsAtCompileTime>::type RhsNested;\n\n  typedef GeneralProduct<Lhs/*Nested*/, Rhs/*Nested*/, ProductType> Type;\n};\n\ntemplate<typename Lhs, typename Rhs>\nstruct ProductReturnType<Lhs,Rhs,CoeffBasedProductMode>\n{\n  typedef typename internal::nested<Lhs, Rhs::ColsAtCompileTime, typename internal::plain_matrix_type<Lhs>::type >::type LhsNested;\n  typedef typename internal::nested<Rhs, Lhs::RowsAtCompileTime, typename internal::plain_matrix_type<Rhs>::type >::type RhsNested;\n  typedef CoeffBasedProduct<LhsNested, RhsNested, EvalBeforeAssigningBit | EvalBeforeNestingBit> Type;\n};\n\ntemplate<typename Lhs, typename Rhs>\nstruct ProductReturnType<Lhs,Rhs,LazyCoeffBasedProductMode>\n{\n  typedef typename internal::nested<Lhs, Rhs::ColsAtCompileTime, typename internal::plain_matrix_type<Lhs>::type >::type LhsNested;\n  typedef typename internal::nested<Rhs, Lhs::RowsAtCompileTime, typename internal::plain_matrix_type<Rhs>::type >::type RhsNested;\n  typedef CoeffBasedProduct<LhsNested, RhsNested, NestByRefBit> Type;\n};\n\n// this is a workaround for sun CC\ntemplate<typename Lhs, typename Rhs>\nstruct LazyProductReturnType : public ProductReturnType<Lhs,Rhs,LazyCoeffBasedProductMode>\n{};\n\n/***********************************************************************\n*  Implementation of Inner Vector Vector Product\n***********************************************************************/\n\n// FIXME : maybe the \"inner product\" could return a Scalar\n// instead of a 1x1 matrix ??\n// Pro: more natural for the user\n// Cons: this could be a problem if in a meta unrolled algorithm a matrix-matrix\n// product ends up to a row-vector times col-vector product... To tackle this use\n// case, we could have a specialization for Block<MatrixType,1,1> with: operator=(Scalar x);\n\nnamespace internal {\n\ntemplate<typename Lhs, typename Rhs>\nstruct traits<GeneralProduct<Lhs,Rhs,InnerProduct> >\n : traits<Matrix<typename scalar_product_traits<typename Lhs::Scalar, typename Rhs::Scalar>::ReturnType,1,1> >\n{};\n\n}\n\ntemplate<typename Lhs, typename Rhs>\nclass GeneralProduct<Lhs, Rhs, InnerProduct>\n  : internal::no_assignment_operator,\n    public Matrix<typename internal::scalar_product_traits<typename Lhs::Scalar, typename Rhs::Scalar>::ReturnType,1,1>\n{\n    typedef Matrix<typename internal::scalar_product_traits<typename Lhs::Scalar, typename Rhs::Scalar>::ReturnType,1,1> Base;\n  public:\n    GeneralProduct(const Lhs& lhs, const Rhs& rhs)\n    {\n      Base::coeffRef(0,0) = (lhs.transpose().cwiseProduct(rhs)).sum();\n    }\n\n    /** Convertion to scalar */\n    operator const typename Base::Scalar() const {\n      return Base::coeff(0,0);\n    }\n};\n\n/***********************************************************************\n*  Implementation of Outer Vector Vector Product\n***********************************************************************/\n\nnamespace internal {\n\n// Column major\ntemplate<typename ProductType, typename Dest, typename Func>\nEIGEN_DONT_INLINE void outer_product_selector_run(const ProductType& prod, Dest& dest, const Func& func, const false_type&)\n{\n  typedef typename Dest::Index Index;\n  // FIXME make sure lhs is sequentially stored\n  // FIXME not very good if rhs is real and lhs complex while alpha is real too\n  const Index cols = dest.cols();\n  for (Index j=0; j<cols; ++j)\n    func(dest.col(j), prod.rhs().coeff(0,j) * prod.lhs());\n}\n\n// Row major\ntemplate<typename ProductType, typename Dest, typename Func>\nEIGEN_DONT_INLINE void outer_product_selector_run(const ProductType& prod, Dest& dest, const Func& func, const true_type&) {\n  typedef typename Dest::Index Index;\n  // FIXME make sure rhs is sequentially stored\n  // FIXME not very good if lhs is real and rhs complex while alpha is real too\n  const Index rows = dest.rows();\n  for (Index i=0; i<rows; ++i)\n    func(dest.row(i), prod.lhs().coeff(i,0) * prod.rhs());\n}\n\ntemplate<typename Lhs, typename Rhs>\nstruct traits<GeneralProduct<Lhs,Rhs,OuterProduct> >\n : traits<ProductBase<GeneralProduct<Lhs,Rhs,OuterProduct>, Lhs, Rhs> >\n{};\n\n}\n\ntemplate<typename Lhs, typename Rhs>\nclass GeneralProduct<Lhs, Rhs, OuterProduct>\n  : public ProductBase<GeneralProduct<Lhs,Rhs,OuterProduct>, Lhs, Rhs>\n{\n    template<typename T> struct is_row_major : internal::conditional<(int(T::Flags)&RowMajorBit), internal::true_type, internal::false_type>::type {};\n    \n  public:\n    EIGEN_PRODUCT_PUBLIC_INTERFACE(GeneralProduct)\n\n    GeneralProduct(const Lhs& lhs, const Rhs& rhs) : Base(lhs,rhs)\n    {\n    }\n    \n    struct set  { template<typename Dst, typename Src> void operator()(const Dst& dst, const Src& src) const { dst.const_cast_derived()  = src; } };\n    struct add  { template<typename Dst, typename Src> void operator()(const Dst& dst, const Src& src) const { dst.const_cast_derived() += src; } };\n    struct sub  { template<typename Dst, typename Src> void operator()(const Dst& dst, const Src& src) const { dst.const_cast_derived() -= src; } };\n    struct adds {\n      Scalar m_scale;\n      adds(const Scalar& s) : m_scale(s) {}\n      template<typename Dst, typename Src> void operator()(const Dst& dst, const Src& src) const {\n        dst.const_cast_derived() += m_scale * src;\n      }\n    };\n    \n    template<typename Dest>\n    inline void evalTo(Dest& dest) const {\n      internal::outer_product_selector_run(*this, dest, set(), is_row_major<Dest>());\n    }\n    \n    template<typename Dest>\n    inline void addTo(Dest& dest) const {\n      internal::outer_product_selector_run(*this, dest, add(), is_row_major<Dest>());\n    }\n\n    template<typename Dest>\n    inline void subTo(Dest& dest) const {\n      internal::outer_product_selector_run(*this, dest, sub(), is_row_major<Dest>());\n    }\n\n    template<typename Dest> void scaleAndAddTo(Dest& dest, const Scalar& alpha) const\n    {\n      internal::outer_product_selector_run(*this, dest, adds(alpha), is_row_major<Dest>());\n    }\n};\n\n/***********************************************************************\n*  Implementation of General Matrix Vector Product\n***********************************************************************/\n\n/*  According to the shape/flags of the matrix we have to distinghish 3 different cases:\n *   1 - the matrix is col-major, BLAS compatible and M is large => call fast BLAS-like colmajor routine\n *   2 - the matrix is row-major, BLAS compatible and N is large => call fast BLAS-like rowmajor routine\n *   3 - all other cases are handled using a simple loop along the outer-storage direction.\n *  Therefore we need a lower level meta selector.\n *  Furthermore, if the matrix is the rhs, then the product has to be transposed.\n */\nnamespace internal {\n\ntemplate<typename Lhs, typename Rhs>\nstruct traits<GeneralProduct<Lhs,Rhs,GemvProduct> >\n : traits<ProductBase<GeneralProduct<Lhs,Rhs,GemvProduct>, Lhs, Rhs> >\n{};\n\ntemplate<int Side, int StorageOrder, bool BlasCompatible>\nstruct gemv_selector;\n\n} // end namespace internal\n\ntemplate<typename Lhs, typename Rhs>\nclass GeneralProduct<Lhs, Rhs, GemvProduct>\n  : public ProductBase<GeneralProduct<Lhs,Rhs,GemvProduct>, Lhs, Rhs>\n{\n  public:\n    EIGEN_PRODUCT_PUBLIC_INTERFACE(GeneralProduct)\n\n    typedef typename Lhs::Scalar LhsScalar;\n    typedef typename Rhs::Scalar RhsScalar;\n\n    GeneralProduct(const Lhs& a_lhs, const Rhs& a_rhs) : Base(a_lhs,a_rhs)\n    {\n//       EIGEN_STATIC_ASSERT((internal::is_same<typename Lhs::Scalar, typename Rhs::Scalar>::value),\n//         YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)\n    }\n\n    enum { Side = Lhs::IsVectorAtCompileTime ? OnTheLeft : OnTheRight };\n    typedef typename internal::conditional<int(Side)==OnTheRight,_LhsNested,_RhsNested>::type MatrixType;\n\n    template<typename Dest> void scaleAndAddTo(Dest& dst, const Scalar& alpha) const\n    {\n      eigen_assert(m_lhs.rows() == dst.rows() && m_rhs.cols() == dst.cols());\n      internal::gemv_selector<Side,(int(MatrixType::Flags)&RowMajorBit) ? RowMajor : ColMajor,\n                       bool(internal::blas_traits<MatrixType>::HasUsableDirectAccess)>::run(*this, dst, alpha);\n    }\n};\n\nnamespace internal {\n\n// The vector is on the left => transposition\ntemplate<int StorageOrder, bool BlasCompatible>\nstruct gemv_selector<OnTheLeft,StorageOrder,BlasCompatible>\n{\n  template<typename ProductType, typename Dest>\n  static void run(const ProductType& prod, Dest& dest, const typename ProductType::Scalar& alpha)\n  {\n    Transpose<Dest> destT(dest);\n    enum { OtherStorageOrder = StorageOrder == RowMajor ? ColMajor : RowMajor };\n    gemv_selector<OnTheRight,OtherStorageOrder,BlasCompatible>\n      ::run(GeneralProduct<Transpose<const typename ProductType::_RhsNested>,Transpose<const typename ProductType::_LhsNested>, GemvProduct>\n        (prod.rhs().transpose(), prod.lhs().transpose()), destT, alpha);\n  }\n};\n\ntemplate<typename Scalar,int Size,int MaxSize,bool Cond> struct gemv_static_vector_if;\n\ntemplate<typename Scalar,int Size,int MaxSize>\nstruct gemv_static_vector_if<Scalar,Size,MaxSize,false>\n{\n  EIGEN_STRONG_INLINE  Scalar* data() { eigen_internal_assert(false && \"should never be called\"); return 0; }\n};\n\ntemplate<typename Scalar,int Size>\nstruct gemv_static_vector_if<Scalar,Size,Dynamic,true>\n{\n  EIGEN_STRONG_INLINE Scalar* data() { return 0; }\n};\n\ntemplate<typename Scalar,int Size,int MaxSize>\nstruct gemv_static_vector_if<Scalar,Size,MaxSize,true>\n{\n  #if EIGEN_ALIGN_STATICALLY\n  internal::plain_array<Scalar,EIGEN_SIZE_MIN_PREFER_FIXED(Size,MaxSize),0> m_data;\n  EIGEN_STRONG_INLINE Scalar* data() { return m_data.array; }\n  #else\n  // Some architectures cannot align on the stack,\n  // => let's manually enforce alignment by allocating more data and return the address of the first aligned element.\n  enum {\n    ForceAlignment  = internal::packet_traits<Scalar>::Vectorizable,\n    PacketSize      = internal::packet_traits<Scalar>::size\n  };\n  internal::plain_array<Scalar,EIGEN_SIZE_MIN_PREFER_FIXED(Size,MaxSize)+(ForceAlignment?PacketSize:0),0> m_data;\n  EIGEN_STRONG_INLINE Scalar* data() {\n    return ForceAlignment\n            ? reinterpret_cast<Scalar*>((reinterpret_cast<size_t>(m_data.array) & ~(size_t(15))) + 16)\n            : m_data.array;\n  }\n  #endif\n};\n\ntemplate<> struct gemv_selector<OnTheRight,ColMajor,true>\n{\n  template<typename ProductType, typename Dest>\n  static inline void run(const ProductType& prod, Dest& dest, const typename ProductType::Scalar& alpha)\n  {\n    typedef typename ProductType::Index Index;\n    typedef typename ProductType::LhsScalar   LhsScalar;\n    typedef typename ProductType::RhsScalar   RhsScalar;\n    typedef typename ProductType::Scalar      ResScalar;\n    typedef typename ProductType::RealScalar  RealScalar;\n    typedef typename ProductType::ActualLhsType ActualLhsType;\n    typedef typename ProductType::ActualRhsType ActualRhsType;\n    typedef typename ProductType::LhsBlasTraits LhsBlasTraits;\n    typedef typename ProductType::RhsBlasTraits RhsBlasTraits;\n    typedef Map<Matrix<ResScalar,Dynamic,1>, Aligned> MappedDest;\n\n    ActualLhsType actualLhs = LhsBlasTraits::extract(prod.lhs());\n    ActualRhsType actualRhs = RhsBlasTraits::extract(prod.rhs());\n\n    ResScalar actualAlpha = alpha * LhsBlasTraits::extractScalarFactor(prod.lhs())\n                                  * RhsBlasTraits::extractScalarFactor(prod.rhs());\n\n    // make sure Dest is a compile-time vector type (bug 1166)\n    typedef typename conditional<Dest::IsVectorAtCompileTime, Dest, typename Dest::ColXpr>::type ActualDest;\n\n    enum {\n      // FIXME find a way to allow an inner stride on the result if packet_traits<Scalar>::size==1\n      // on, the other hand it is good for the cache to pack the vector anyways...\n      EvalToDestAtCompileTime = (ActualDest::InnerStrideAtCompileTime==1),\n      ComplexByReal = (NumTraits<LhsScalar>::IsComplex) && (!NumTraits<RhsScalar>::IsComplex),\n      MightCannotUseDest = (ActualDest::InnerStrideAtCompileTime!=1) || ComplexByReal\n    };\n\n    gemv_static_vector_if<ResScalar,ActualDest::SizeAtCompileTime,ActualDest::MaxSizeAtCompileTime,MightCannotUseDest> static_dest;\n\n    bool alphaIsCompatible = (!ComplexByReal) || (numext::imag(actualAlpha)==RealScalar(0));\n    bool evalToDest = EvalToDestAtCompileTime && alphaIsCompatible;\n    \n    RhsScalar compatibleAlpha = get_factor<ResScalar,RhsScalar>::run(actualAlpha);\n\n    ei_declare_aligned_stack_constructed_variable(ResScalar,actualDestPtr,dest.size(),\n                                                  evalToDest ? dest.data() : static_dest.data());\n    \n    if(!evalToDest)\n    {\n      #ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN\n      int size = dest.size();\n      EIGEN_DENSE_STORAGE_CTOR_PLUGIN\n      #endif\n      if(!alphaIsCompatible)\n      {\n        MappedDest(actualDestPtr, dest.size()).setZero();\n        compatibleAlpha = RhsScalar(1);\n      }\n      else\n        MappedDest(actualDestPtr, dest.size()) = dest;\n    }\n\n    general_matrix_vector_product\n      <Index,LhsScalar,ColMajor,LhsBlasTraits::NeedToConjugate,RhsScalar,RhsBlasTraits::NeedToConjugate>::run(\n        actualLhs.rows(), actualLhs.cols(),\n        actualLhs.data(), actualLhs.outerStride(),\n        actualRhs.data(), actualRhs.innerStride(),\n        actualDestPtr, 1,\n        compatibleAlpha);\n\n    if (!evalToDest)\n    {\n      if(!alphaIsCompatible)\n        dest += actualAlpha * MappedDest(actualDestPtr, dest.size());\n      else\n        dest = MappedDest(actualDestPtr, dest.size());\n    }\n  }\n};\n\ntemplate<> struct gemv_selector<OnTheRight,RowMajor,true>\n{\n  template<typename ProductType, typename Dest>\n  static void run(const ProductType& prod, Dest& dest, const typename ProductType::Scalar& alpha)\n  {\n    typedef typename ProductType::LhsScalar LhsScalar;\n    typedef typename ProductType::RhsScalar RhsScalar;\n    typedef typename ProductType::Scalar    ResScalar;\n    typedef typename ProductType::Index Index;\n    typedef typename ProductType::ActualLhsType ActualLhsType;\n    typedef typename ProductType::ActualRhsType ActualRhsType;\n    typedef typename ProductType::_ActualRhsType _ActualRhsType;\n    typedef typename ProductType::LhsBlasTraits LhsBlasTraits;\n    typedef typename ProductType::RhsBlasTraits RhsBlasTraits;\n\n    typename add_const<ActualLhsType>::type actualLhs = LhsBlasTraits::extract(prod.lhs());\n    typename add_const<ActualRhsType>::type actualRhs = RhsBlasTraits::extract(prod.rhs());\n\n    ResScalar actualAlpha = alpha * LhsBlasTraits::extractScalarFactor(prod.lhs())\n                                  * RhsBlasTraits::extractScalarFactor(prod.rhs());\n\n    enum {\n      // FIXME find a way to allow an inner stride on the result if packet_traits<Scalar>::size==1\n      // on, the other hand it is good for the cache to pack the vector anyways...\n      DirectlyUseRhs = _ActualRhsType::InnerStrideAtCompileTime==1\n    };\n\n    gemv_static_vector_if<RhsScalar,_ActualRhsType::SizeAtCompileTime,_ActualRhsType::MaxSizeAtCompileTime,!DirectlyUseRhs> static_rhs;\n\n    ei_declare_aligned_stack_constructed_variable(RhsScalar,actualRhsPtr,actualRhs.size(),\n        DirectlyUseRhs ? const_cast<RhsScalar*>(actualRhs.data()) : static_rhs.data());\n\n    if(!DirectlyUseRhs)\n    {\n      #ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN\n      int size = actualRhs.size();\n      EIGEN_DENSE_STORAGE_CTOR_PLUGIN\n      #endif\n      Map<typename _ActualRhsType::PlainObject>(actualRhsPtr, actualRhs.size()) = actualRhs;\n    }\n\n    general_matrix_vector_product\n      <Index,LhsScalar,RowMajor,LhsBlasTraits::NeedToConjugate,RhsScalar,RhsBlasTraits::NeedToConjugate>::run(\n        actualLhs.rows(), actualLhs.cols(),\n        actualLhs.data(), actualLhs.outerStride(),\n        actualRhsPtr, 1,\n        dest.data(), dest.col(0).innerStride(), //NOTE  if dest is not a vector at compile-time, then dest.innerStride() might be wrong. (bug 1166)\n        actualAlpha);\n  }\n};\n\ntemplate<> struct gemv_selector<OnTheRight,ColMajor,false>\n{\n  template<typename ProductType, typename Dest>\n  static void run(const ProductType& prod, Dest& dest, const typename ProductType::Scalar& alpha)\n  {\n    typedef typename Dest::Index Index;\n    // TODO makes sure dest is sequentially stored in memory, otherwise use a temp\n    const Index size = prod.rhs().rows();\n    for(Index k=0; k<size; ++k)\n      dest += (alpha*prod.rhs().coeff(k)) * prod.lhs().col(k);\n  }\n};\n\ntemplate<> struct gemv_selector<OnTheRight,RowMajor,false>\n{\n  template<typename ProductType, typename Dest>\n  static void run(const ProductType& prod, Dest& dest, const typename ProductType::Scalar& alpha)\n  {\n    typedef typename Dest::Index Index;\n    // TODO makes sure rhs is sequentially stored in memory, otherwise use a temp\n    const Index rows = prod.rows();\n    for(Index i=0; i<rows; ++i)\n      dest.coeffRef(i) += alpha * (prod.lhs().row(i).cwiseProduct(prod.rhs().transpose())).sum();\n  }\n};\n\n} // end namespace internal\n\n/***************************************************************************\n* Implementation of matrix base methods\n***************************************************************************/\n\n/** \\returns the matrix product of \\c *this and \\a other.\n  *\n  * \\note If instead of the matrix product you want the coefficient-wise product, see Cwise::operator*().\n  *\n  * \\sa lazyProduct(), operator*=(const MatrixBase&), Cwise::operator*()\n  */\ntemplate<typename Derived>\ntemplate<typename OtherDerived>\ninline const typename ProductReturnType<Derived, OtherDerived>::Type\nMatrixBase<Derived>::operator*(const MatrixBase<OtherDerived> &other) const\n{\n  // A note regarding the function declaration: In MSVC, this function will sometimes\n  // not be inlined since DenseStorage is an unwindable object for dynamic\n  // matrices and product types are holding a member to store the result.\n  // Thus it does not help tagging this function with EIGEN_STRONG_INLINE.\n  enum {\n    ProductIsValid =  Derived::ColsAtCompileTime==Dynamic\n                   || OtherDerived::RowsAtCompileTime==Dynamic\n                   || int(Derived::ColsAtCompileTime)==int(OtherDerived::RowsAtCompileTime),\n    AreVectors = Derived::IsVectorAtCompileTime && OtherDerived::IsVectorAtCompileTime,\n    SameSizes = EIGEN_PREDICATE_SAME_MATRIX_SIZE(Derived,OtherDerived)\n  };\n  // note to the lost user:\n  //    * for a dot product use: v1.dot(v2)\n  //    * for a coeff-wise product use: v1.cwiseProduct(v2)\n  EIGEN_STATIC_ASSERT(ProductIsValid || !(AreVectors && SameSizes),\n    INVALID_VECTOR_VECTOR_PRODUCT__IF_YOU_WANTED_A_DOT_OR_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTIONS)\n  EIGEN_STATIC_ASSERT(ProductIsValid || !(SameSizes && !AreVectors),\n    INVALID_MATRIX_PRODUCT__IF_YOU_WANTED_A_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTION)\n  EIGEN_STATIC_ASSERT(ProductIsValid || SameSizes, INVALID_MATRIX_PRODUCT)\n#ifdef EIGEN_DEBUG_PRODUCT\n  internal::product_type<Derived,OtherDerived>::debug();\n#endif\n  return typename ProductReturnType<Derived,OtherDerived>::Type(derived(), other.derived());\n}\n\n/** \\returns an expression of the matrix product of \\c *this and \\a other without implicit evaluation.\n  *\n  * The returned product will behave like any other expressions: the coefficients of the product will be\n  * computed once at a time as requested. This might be useful in some extremely rare cases when only\n  * a small and no coherent fraction of the result's coefficients have to be computed.\n  *\n  * \\warning This version of the matrix product can be much much slower. So use it only if you know\n  * what you are doing and that you measured a true speed improvement.\n  *\n  * \\sa operator*(const MatrixBase&)\n  */\ntemplate<typename Derived>\ntemplate<typename OtherDerived>\nconst typename LazyProductReturnType<Derived,OtherDerived>::Type\nMatrixBase<Derived>::lazyProduct(const MatrixBase<OtherDerived> &other) const\n{\n  enum {\n    ProductIsValid =  Derived::ColsAtCompileTime==Dynamic\n                   || OtherDerived::RowsAtCompileTime==Dynamic\n                   || int(Derived::ColsAtCompileTime)==int(OtherDerived::RowsAtCompileTime),\n    AreVectors = Derived::IsVectorAtCompileTime && OtherDerived::IsVectorAtCompileTime,\n    SameSizes = EIGEN_PREDICATE_SAME_MATRIX_SIZE(Derived,OtherDerived)\n  };\n  // note to the lost user:\n  //    * for a dot product use: v1.dot(v2)\n  //    * for a coeff-wise product use: v1.cwiseProduct(v2)\n  EIGEN_STATIC_ASSERT(ProductIsValid || !(AreVectors && SameSizes),\n    INVALID_VECTOR_VECTOR_PRODUCT__IF_YOU_WANTED_A_DOT_OR_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTIONS)\n  EIGEN_STATIC_ASSERT(ProductIsValid || !(SameSizes && !AreVectors),\n    INVALID_MATRIX_PRODUCT__IF_YOU_WANTED_A_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTION)\n  EIGEN_STATIC_ASSERT(ProductIsValid || SameSizes, INVALID_MATRIX_PRODUCT)\n\n  return typename LazyProductReturnType<Derived,OtherDerived>::Type(derived(), other.derived());\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_PRODUCT_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/GenericPacketMath.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_GENERIC_PACKET_MATH_H\n#define EIGEN_GENERIC_PACKET_MATH_H\n\nnamespace Eigen {\n\nnamespace internal {\n\n/** \\internal\n  * \\file GenericPacketMath.h\n  *\n  * Default implementation for types not supported by the vectorization.\n  * In practice these functions are provided to make easier the writing\n  * of generic vectorized code.\n  */\n\n#ifndef EIGEN_DEBUG_ALIGNED_LOAD\n#define EIGEN_DEBUG_ALIGNED_LOAD\n#endif\n\n#ifndef EIGEN_DEBUG_UNALIGNED_LOAD\n#define EIGEN_DEBUG_UNALIGNED_LOAD\n#endif\n\n#ifndef EIGEN_DEBUG_ALIGNED_STORE\n#define EIGEN_DEBUG_ALIGNED_STORE\n#endif\n\n#ifndef EIGEN_DEBUG_UNALIGNED_STORE\n#define EIGEN_DEBUG_UNALIGNED_STORE\n#endif\n\nstruct default_packet_traits\n{\n  enum {\n    HasAdd    = 1,\n    HasSub    = 1,\n    HasMul    = 1,\n    HasNegate = 1,\n    HasAbs    = 1,\n    HasAbs2   = 1,\n    HasMin    = 1,\n    HasMax    = 1,\n    HasConj   = 1,\n    HasSetLinear = 1,\n\n    HasDiv    = 0,\n    HasSqrt   = 0,\n    HasExp    = 0,\n    HasLog    = 0,\n    HasPow    = 0,\n\n    HasSin    = 0,\n    HasCos    = 0,\n    HasTan    = 0,\n    HasASin   = 0,\n    HasACos   = 0,\n    HasATan   = 0\n  };\n};\n\ntemplate<typename T> struct packet_traits : default_packet_traits\n{\n  typedef T type;\n  enum {\n    Vectorizable = 0,\n    size = 1,\n    AlignedOnScalar = 0\n  };\n  enum {\n    HasAdd    = 0,\n    HasSub    = 0,\n    HasMul    = 0,\n    HasNegate = 0,\n    HasAbs    = 0,\n    HasAbs2   = 0,\n    HasMin    = 0,\n    HasMax    = 0,\n    HasConj   = 0,\n    HasSetLinear = 0\n  };\n};\n\n/** \\internal \\returns a + b (coeff-wise) */\ntemplate<typename Packet> inline Packet\npadd(const Packet& a,\n        const Packet& b) { return a+b; }\n\n/** \\internal \\returns a - b (coeff-wise) */\ntemplate<typename Packet> inline Packet\npsub(const Packet& a,\n        const Packet& b) { return a-b; }\n\n/** \\internal \\returns -a (coeff-wise) */\ntemplate<typename Packet> inline Packet\npnegate(const Packet& a) { return -a; }\n\n/** \\internal \\returns conj(a) (coeff-wise) */\ntemplate<typename Packet> inline Packet\npconj(const Packet& a) { return numext::conj(a); }\n\n/** \\internal \\returns a * b (coeff-wise) */\ntemplate<typename Packet> inline Packet\npmul(const Packet& a,\n        const Packet& b) { return a*b; }\n\n/** \\internal \\returns a / b (coeff-wise) */\ntemplate<typename Packet> inline Packet\npdiv(const Packet& a,\n        const Packet& b) { return a/b; }\n\n/** \\internal \\returns the min of \\a a and \\a b  (coeff-wise) */\ntemplate<typename Packet> inline Packet\npmin(const Packet& a,\n        const Packet& b) { using std::min; return (min)(a, b); }\n\n/** \\internal \\returns the max of \\a a and \\a b  (coeff-wise) */\ntemplate<typename Packet> inline Packet\npmax(const Packet& a,\n        const Packet& b) { using std::max; return (max)(a, b); }\n\n/** \\internal \\returns the absolute value of \\a a */\ntemplate<typename Packet> inline Packet\npabs(const Packet& a) { using std::abs; return abs(a); }\n\n/** \\internal \\returns the bitwise and of \\a a and \\a b */\ntemplate<typename Packet> inline Packet\npand(const Packet& a, const Packet& b) { return a & b; }\n\n/** \\internal \\returns the bitwise or of \\a a and \\a b */\ntemplate<typename Packet> inline Packet\npor(const Packet& a, const Packet& b) { return a | b; }\n\n/** \\internal \\returns the bitwise xor of \\a a and \\a b */\ntemplate<typename Packet> inline Packet\npxor(const Packet& a, const Packet& b) { return a ^ b; }\n\n/** \\internal \\returns the bitwise andnot of \\a a and \\a b */\ntemplate<typename Packet> inline Packet\npandnot(const Packet& a, const Packet& b) { return a & (!b); }\n\n/** \\internal \\returns a packet version of \\a *from, from must be 16 bytes aligned */\ntemplate<typename Packet> inline Packet\npload(const typename unpacket_traits<Packet>::type* from) { return *from; }\n\n/** \\internal \\returns a packet version of \\a *from, (un-aligned load) */\ntemplate<typename Packet> inline Packet\nploadu(const typename unpacket_traits<Packet>::type* from) { return *from; }\n\n/** \\internal \\returns a packet with elements of \\a *from duplicated.\n  * For instance, for a packet of 8 elements, 4 scalar will be read from \\a *from and\n  * duplicated to form: {from[0],from[0],from[1],from[1],,from[2],from[2],,from[3],from[3]}\n  * Currently, this function is only used for scalar * complex products.\n */\ntemplate<typename Packet> inline Packet\nploaddup(const typename unpacket_traits<Packet>::type* from) { return *from; }\n\n/** \\internal \\returns a packet with constant coefficients \\a a, e.g.: (a,a,a,a) */\ntemplate<typename Packet> inline Packet\npset1(const typename unpacket_traits<Packet>::type& a) { return a; }\n\n/** \\internal \\brief Returns a packet with coefficients (a,a+1,...,a+packet_size-1). */\ntemplate<typename Scalar> inline typename packet_traits<Scalar>::type\nplset(const Scalar& a) { return a; }\n\n/** \\internal copy the packet \\a from to \\a *to, \\a to must be 16 bytes aligned */\ntemplate<typename Scalar, typename Packet> inline void pstore(Scalar* to, const Packet& from)\n{ (*to) = from; }\n\n/** \\internal copy the packet \\a from to \\a *to, (un-aligned store) */\ntemplate<typename Scalar, typename Packet> inline void pstoreu(Scalar* to, const Packet& from)\n{ (*to) = from; }\n\n/** \\internal tries to do cache prefetching of \\a addr */\ntemplate<typename Scalar> inline void prefetch(const Scalar* addr)\n{\n#if !defined(_MSC_VER)\n__builtin_prefetch(addr);\n#endif\n}\n\n/** \\internal \\returns the first element of a packet */\ntemplate<typename Packet> inline typename unpacket_traits<Packet>::type pfirst(const Packet& a)\n{ return a; }\n\n/** \\internal \\returns a packet where the element i contains the sum of the packet of \\a vec[i] */\ntemplate<typename Packet> inline Packet\npreduxp(const Packet* vecs) { return vecs[0]; }\n\n/** \\internal \\returns the sum of the elements of \\a a*/\ntemplate<typename Packet> inline typename unpacket_traits<Packet>::type predux(const Packet& a)\n{ return a; }\n\n/** \\internal \\returns the product of the elements of \\a a*/\ntemplate<typename Packet> inline typename unpacket_traits<Packet>::type predux_mul(const Packet& a)\n{ return a; }\n\n/** \\internal \\returns the min of the elements of \\a a*/\ntemplate<typename Packet> inline typename unpacket_traits<Packet>::type predux_min(const Packet& a)\n{ return a; }\n\n/** \\internal \\returns the max of the elements of \\a a*/\ntemplate<typename Packet> inline typename unpacket_traits<Packet>::type predux_max(const Packet& a)\n{ return a; }\n\n/** \\internal \\returns the reversed elements of \\a a*/\ntemplate<typename Packet> inline Packet preverse(const Packet& a)\n{ return a; }\n\n\n/** \\internal \\returns \\a a with real and imaginary part flipped (for complex type only) */\ntemplate<typename Packet> inline Packet pcplxflip(const Packet& a)\n{\n  // FIXME: uncomment the following in case we drop the internal imag and real functions.\n//   using std::imag;\n//   using std::real;\n  return Packet(imag(a),real(a));\n}\n\n/**************************\n* Special math functions\n***************************/\n\n/** \\internal \\returns the sine of \\a a (coeff-wise) */\ntemplate<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS\nPacket psin(const Packet& a) { using std::sin; return sin(a); }\n\n/** \\internal \\returns the cosine of \\a a (coeff-wise) */\ntemplate<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS\nPacket pcos(const Packet& a) { using std::cos; return cos(a); }\n\n/** \\internal \\returns the tan of \\a a (coeff-wise) */\ntemplate<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS\nPacket ptan(const Packet& a) { using std::tan; return tan(a); }\n\n/** \\internal \\returns the arc sine of \\a a (coeff-wise) */\ntemplate<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS\nPacket pasin(const Packet& a) { using std::asin; return asin(a); }\n\n/** \\internal \\returns the arc cosine of \\a a (coeff-wise) */\ntemplate<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS\nPacket pacos(const Packet& a) { using std::acos; return acos(a); }\n\n/** \\internal \\returns the exp of \\a a (coeff-wise) */\ntemplate<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS\nPacket pexp(const Packet& a) { using std::exp; return exp(a); }\n\n/** \\internal \\returns the log of \\a a (coeff-wise) */\ntemplate<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS\nPacket plog(const Packet& a) { using std::log; return log(a); }\n\n/** \\internal \\returns the square-root of \\a a (coeff-wise) */\ntemplate<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS\nPacket psqrt(const Packet& a) { using std::sqrt; return sqrt(a); }\n\n/***************************************************************************\n* The following functions might not have to be overwritten for vectorized types\n***************************************************************************/\n\n/** \\internal copy a packet with constant coeficient \\a a (e.g., [a,a,a,a]) to \\a *to. \\a to must be 16 bytes aligned */\n// NOTE: this function must really be templated on the packet type (think about different packet types for the same scalar type)\ntemplate<typename Packet>\ninline void pstore1(typename unpacket_traits<Packet>::type* to, const typename unpacket_traits<Packet>::type& a)\n{\n  pstore(to, pset1<Packet>(a));\n}\n\n/** \\internal \\returns a * b + c (coeff-wise) */\ntemplate<typename Packet> inline Packet\npmadd(const Packet&  a,\n         const Packet&  b,\n         const Packet&  c)\n{ return padd(pmul(a, b),c); }\n\n/** \\internal \\returns a packet version of \\a *from.\n  * If LoadMode equals #Aligned, \\a from must be 16 bytes aligned */\ntemplate<typename Packet, int LoadMode>\ninline Packet ploadt(const typename unpacket_traits<Packet>::type* from)\n{\n  if(LoadMode == Aligned)\n    return pload<Packet>(from);\n  else\n    return ploadu<Packet>(from);\n}\n\n/** \\internal copy the packet \\a from to \\a *to.\n  * If StoreMode equals #Aligned, \\a to must be 16 bytes aligned */\ntemplate<typename Scalar, typename Packet, int LoadMode>\ninline void pstoret(Scalar* to, const Packet& from)\n{\n  if(LoadMode == Aligned)\n    pstore(to, from);\n  else\n    pstoreu(to, from);\n}\n\n/** \\internal default implementation of palign() allowing partial specialization */\ntemplate<int Offset,typename PacketType>\nstruct palign_impl\n{\n  // by default data are aligned, so there is nothing to be done :)\n  static inline void run(PacketType&, const PacketType&) {}\n};\n\n/** \\internal update \\a first using the concatenation of the packet_size minus \\a Offset last elements\n  * of \\a first and \\a Offset first elements of \\a second.\n  * \n  * This function is currently only used to optimize matrix-vector products on unligned matrices.\n  * It takes 2 packets that represent a contiguous memory array, and returns a packet starting\n  * at the position \\a Offset. For instance, for packets of 4 elements, we have:\n  *  Input:\n  *  - first = {f0,f1,f2,f3}\n  *  - second = {s0,s1,s2,s3}\n  * Output: \n  *   - if Offset==0 then {f0,f1,f2,f3}\n  *   - if Offset==1 then {f1,f2,f3,s0}\n  *   - if Offset==2 then {f2,f3,s0,s1}\n  *   - if Offset==3 then {f3,s0,s1,s3}\n  */\ntemplate<int Offset,typename PacketType>\ninline void palign(PacketType& first, const PacketType& second)\n{\n  palign_impl<Offset,PacketType>::run(first,second);\n}\n\n/***************************************************************************\n* Fast complex products (GCC generates a function call which is very slow)\n***************************************************************************/\n\ntemplate<> inline std::complex<float> pmul(const std::complex<float>& a, const std::complex<float>& b)\n{ return std::complex<float>(real(a)*real(b) - imag(a)*imag(b), imag(a)*real(b) + real(a)*imag(b)); }\n\ntemplate<> inline std::complex<double> pmul(const std::complex<double>& a, const std::complex<double>& b)\n{ return std::complex<double>(real(a)*real(b) - imag(a)*imag(b), imag(a)*real(b) + real(a)*imag(b)); }\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_GENERIC_PACKET_MATH_H\n\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/GlobalFunctions.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2010-2012 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2010 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_GLOBAL_FUNCTIONS_H\n#define EIGEN_GLOBAL_FUNCTIONS_H\n\n#define EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(NAME,FUNCTOR) \\\n  template<typename Derived> \\\n  inline const Eigen::CwiseUnaryOp<Eigen::internal::FUNCTOR<typename Derived::Scalar>, const Derived> \\\n  NAME(const Eigen::ArrayBase<Derived>& x) { \\\n    return x.derived(); \\\n  }\n\n#define EIGEN_ARRAY_DECLARE_GLOBAL_EIGEN_UNARY(NAME,FUNCTOR) \\\n  \\\n  template<typename Derived> \\\n  struct NAME##_retval<ArrayBase<Derived> > \\\n  { \\\n    typedef const Eigen::CwiseUnaryOp<Eigen::internal::FUNCTOR<typename Derived::Scalar>, const Derived> type; \\\n  }; \\\n  template<typename Derived> \\\n  struct NAME##_impl<ArrayBase<Derived> > \\\n  { \\\n    static inline typename NAME##_retval<ArrayBase<Derived> >::type run(const Eigen::ArrayBase<Derived>& x) \\\n    { \\\n      return x.derived(); \\\n    } \\\n  };\n\n\nnamespace Eigen\n{\n  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(real,scalar_real_op)\n  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(imag,scalar_imag_op)\n  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(conj,scalar_conjugate_op)\n  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(sin,scalar_sin_op)\n  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(cos,scalar_cos_op)\n  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(asin,scalar_asin_op)\n  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(acos,scalar_acos_op)\n  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(tan,scalar_tan_op)\n  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(exp,scalar_exp_op)\n  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(log,scalar_log_op)\n  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(abs,scalar_abs_op)\n  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(sqrt,scalar_sqrt_op)\n  \n  template<typename Derived>\n  inline const Eigen::CwiseUnaryOp<Eigen::internal::scalar_pow_op<typename Derived::Scalar>, const Derived>\n  pow(const Eigen::ArrayBase<Derived>& x, const typename Derived::Scalar& exponent) {\n    return x.derived().pow(exponent);\n  }\n\n  template<typename Derived>\n  inline const Eigen::CwiseBinaryOp<Eigen::internal::scalar_binary_pow_op<typename Derived::Scalar, typename Derived::Scalar>, const Derived, const Derived>\n  pow(const Eigen::ArrayBase<Derived>& x, const Eigen::ArrayBase<Derived>& exponents) \n  {\n    return Eigen::CwiseBinaryOp<Eigen::internal::scalar_binary_pow_op<typename Derived::Scalar, typename Derived::Scalar>, const Derived, const Derived>(\n      x.derived(),\n      exponents.derived()\n    );\n  }\n  \n  /**\n  * \\brief Component-wise division of a scalar by array elements.\n  **/\n  template <typename Derived>\n  inline const Eigen::CwiseUnaryOp<Eigen::internal::scalar_inverse_mult_op<typename Derived::Scalar>, const Derived>\n    operator/(const typename Derived::Scalar& s, const Eigen::ArrayBase<Derived>& a)\n  {\n    return Eigen::CwiseUnaryOp<Eigen::internal::scalar_inverse_mult_op<typename Derived::Scalar>, const Derived>(\n      a.derived(),\n      Eigen::internal::scalar_inverse_mult_op<typename Derived::Scalar>(s)  \n    );\n  }\n\n  namespace internal\n  {\n    EIGEN_ARRAY_DECLARE_GLOBAL_EIGEN_UNARY(real,scalar_real_op)\n    EIGEN_ARRAY_DECLARE_GLOBAL_EIGEN_UNARY(imag,scalar_imag_op)\n    EIGEN_ARRAY_DECLARE_GLOBAL_EIGEN_UNARY(abs2,scalar_abs2_op)\n  }\n}\n\n// TODO: cleanly disable those functions that are not supported on Array (numext::real_ref, internal::random, internal::isApprox...)\n\n#endif // EIGEN_GLOBAL_FUNCTIONS_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/IO.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_IO_H\n#define EIGEN_IO_H\n\nnamespace Eigen { \n\nenum { DontAlignCols = 1 };\nenum { StreamPrecision = -1,\n       FullPrecision = -2 };\n\nnamespace internal {\ntemplate<typename Derived>\nstd::ostream & print_matrix(std::ostream & s, const Derived& _m, const IOFormat& fmt);\n}\n\n/** \\class IOFormat\n  * \\ingroup Core_Module\n  *\n  * \\brief Stores a set of parameters controlling the way matrices are printed\n  *\n  * List of available parameters:\n  *  - \\b precision number of digits for floating point values, or one of the special constants \\c StreamPrecision and \\c FullPrecision.\n  *                 The default is the special value \\c StreamPrecision which means to use the\n  *                 stream's own precision setting, as set for instance using \\c cout.precision(3). The other special value\n  *                 \\c FullPrecision means that the number of digits will be computed to match the full precision of each floating-point\n  *                 type.\n  *  - \\b flags an OR-ed combination of flags, the default value is 0, the only currently available flag is \\c DontAlignCols which\n  *             allows to disable the alignment of columns, resulting in faster code.\n  *  - \\b coeffSeparator string printed between two coefficients of the same row\n  *  - \\b rowSeparator string printed between two rows\n  *  - \\b rowPrefix string printed at the beginning of each row\n  *  - \\b rowSuffix string printed at the end of each row\n  *  - \\b matPrefix string printed at the beginning of the matrix\n  *  - \\b matSuffix string printed at the end of the matrix\n  *\n  * Example: \\include IOFormat.cpp\n  * Output: \\verbinclude IOFormat.out\n  *\n  * \\sa DenseBase::format(), class WithFormat\n  */\nstruct IOFormat\n{\n  /** Default contructor, see class IOFormat for the meaning of the parameters */\n  IOFormat(int _precision = StreamPrecision, int _flags = 0,\n    const std::string& _coeffSeparator = \" \",\n    const std::string& _rowSeparator = \"\\n\", const std::string& _rowPrefix=\"\", const std::string& _rowSuffix=\"\",\n    const std::string& _matPrefix=\"\", const std::string& _matSuffix=\"\")\n  : matPrefix(_matPrefix), matSuffix(_matSuffix), rowPrefix(_rowPrefix), rowSuffix(_rowSuffix), rowSeparator(_rowSeparator),\n    rowSpacer(\"\"), coeffSeparator(_coeffSeparator), precision(_precision), flags(_flags)\n  {\n    int i = int(matSuffix.length())-1;\n    while (i>=0 && matSuffix[i]!='\\n')\n    {\n      rowSpacer += ' ';\n      i--;\n    }\n  }\n  std::string matPrefix, matSuffix;\n  std::string rowPrefix, rowSuffix, rowSeparator, rowSpacer;\n  std::string coeffSeparator;\n  int precision;\n  int flags;\n};\n\n/** \\class WithFormat\n  * \\ingroup Core_Module\n  *\n  * \\brief Pseudo expression providing matrix output with given format\n  *\n  * \\param ExpressionType the type of the object on which IO stream operations are performed\n  *\n  * This class represents an expression with stream operators controlled by a given IOFormat.\n  * It is the return type of DenseBase::format()\n  * and most of the time this is the only way it is used.\n  *\n  * See class IOFormat for some examples.\n  *\n  * \\sa DenseBase::format(), class IOFormat\n  */\ntemplate<typename ExpressionType>\nclass WithFormat\n{\n  public:\n\n    WithFormat(const ExpressionType& matrix, const IOFormat& format)\n      : m_matrix(matrix), m_format(format)\n    {}\n\n    friend std::ostream & operator << (std::ostream & s, const WithFormat& wf)\n    {\n      return internal::print_matrix(s, wf.m_matrix.eval(), wf.m_format);\n    }\n\n  protected:\n    const typename ExpressionType::Nested m_matrix;\n    IOFormat m_format;\n};\n\n/** \\returns a WithFormat proxy object allowing to print a matrix the with given\n  * format \\a fmt.\n  *\n  * See class IOFormat for some examples.\n  *\n  * \\sa class IOFormat, class WithFormat\n  */\ntemplate<typename Derived>\ninline const WithFormat<Derived>\nDenseBase<Derived>::format(const IOFormat& fmt) const\n{\n  return WithFormat<Derived>(derived(), fmt);\n}\n\nnamespace internal {\n\ntemplate<typename Scalar, bool IsInteger>\nstruct significant_decimals_default_impl\n{\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  static inline int run()\n  {\n    using std::ceil;\n    using std::log;\n    return cast<RealScalar,int>(ceil(-log(NumTraits<RealScalar>::epsilon())/log(RealScalar(10))));\n  }\n};\n\ntemplate<typename Scalar>\nstruct significant_decimals_default_impl<Scalar, true>\n{\n  static inline int run()\n  {\n    return 0;\n  }\n};\n\ntemplate<typename Scalar>\nstruct significant_decimals_impl\n  : significant_decimals_default_impl<Scalar, NumTraits<Scalar>::IsInteger>\n{};\n\n/** \\internal\n  * print the matrix \\a _m to the output stream \\a s using the output format \\a fmt */\ntemplate<typename Derived>\nstd::ostream & print_matrix(std::ostream & s, const Derived& _m, const IOFormat& fmt)\n{\n  if(_m.size() == 0)\n  {\n    s << fmt.matPrefix << fmt.matSuffix;\n    return s;\n  }\n  \n  typename Derived::Nested m = _m;\n  typedef typename Derived::Scalar Scalar;\n  typedef typename Derived::Index Index;\n\n  Index width = 0;\n\n  std::streamsize explicit_precision;\n  if(fmt.precision == StreamPrecision)\n  {\n    explicit_precision = 0;\n  }\n  else if(fmt.precision == FullPrecision)\n  {\n    if (NumTraits<Scalar>::IsInteger)\n    {\n      explicit_precision = 0;\n    }\n    else\n    {\n      explicit_precision = significant_decimals_impl<Scalar>::run();\n    }\n  }\n  else\n  {\n    explicit_precision = fmt.precision;\n  }\n\n  std::streamsize old_precision = 0;\n  if(explicit_precision) old_precision = s.precision(explicit_precision);\n\n  bool align_cols = !(fmt.flags & DontAlignCols);\n  if(align_cols)\n  {\n    // compute the largest width\n    for(Index j = 0; j < m.cols(); ++j)\n      for(Index i = 0; i < m.rows(); ++i)\n      {\n        std::stringstream sstr;\n        sstr.copyfmt(s);\n        sstr << m.coeff(i,j);\n        width = std::max<Index>(width, Index(sstr.str().length()));\n      }\n  }\n  s << fmt.matPrefix;\n  for(Index i = 0; i < m.rows(); ++i)\n  {\n    if (i)\n      s << fmt.rowSpacer;\n    s << fmt.rowPrefix;\n    if(width) s.width(width);\n    s << m.coeff(i, 0);\n    for(Index j = 1; j < m.cols(); ++j)\n    {\n      s << fmt.coeffSeparator;\n      if (width) s.width(width);\n      s << m.coeff(i, j);\n    }\n    s << fmt.rowSuffix;\n    if( i < m.rows() - 1)\n      s << fmt.rowSeparator;\n  }\n  s << fmt.matSuffix;\n  if(explicit_precision) s.precision(old_precision);\n  return s;\n}\n\n} // end namespace internal\n\n/** \\relates DenseBase\n  *\n  * Outputs the matrix, to the given stream.\n  *\n  * If you wish to print the matrix with a format different than the default, use DenseBase::format().\n  *\n  * It is also possible to change the default format by defining EIGEN_DEFAULT_IO_FORMAT before including Eigen headers.\n  * If not defined, this will automatically be defined to Eigen::IOFormat(), that is the Eigen::IOFormat with default parameters.\n  *\n  * \\sa DenseBase::format()\n  */\ntemplate<typename Derived>\nstd::ostream & operator <<\n(std::ostream & s,\n const DenseBase<Derived> & m)\n{\n  return internal::print_matrix(s, m.eval(), EIGEN_DEFAULT_IO_FORMAT);\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_IO_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/Map.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2007-2010 Benoit Jacob <jacob.benoit.1@gmail.com>\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_MAP_H\n#define EIGEN_MAP_H\n\nnamespace Eigen { \n\n/** \\class Map\n  * \\ingroup Core_Module\n  *\n  * \\brief A matrix or vector expression mapping an existing array of data.\n  *\n  * \\tparam PlainObjectType the equivalent matrix type of the mapped data\n  * \\tparam MapOptions specifies whether the pointer is \\c #Aligned, or \\c #Unaligned.\n  *                The default is \\c #Unaligned.\n  * \\tparam StrideType optionally specifies strides. By default, Map assumes the memory layout\n  *                   of an ordinary, contiguous array. This can be overridden by specifying strides.\n  *                   The type passed here must be a specialization of the Stride template, see examples below.\n  *\n  * This class represents a matrix or vector expression mapping an existing array of data.\n  * It can be used to let Eigen interface without any overhead with non-Eigen data structures,\n  * such as plain C arrays or structures from other libraries. By default, it assumes that the\n  * data is laid out contiguously in memory. You can however override this by explicitly specifying\n  * inner and outer strides.\n  *\n  * Here's an example of simply mapping a contiguous array as a \\ref TopicStorageOrders \"column-major\" matrix:\n  * \\include Map_simple.cpp\n  * Output: \\verbinclude Map_simple.out\n  *\n  * If you need to map non-contiguous arrays, you can do so by specifying strides:\n  *\n  * Here's an example of mapping an array as a vector, specifying an inner stride, that is, the pointer\n  * increment between two consecutive coefficients. Here, we're specifying the inner stride as a compile-time\n  * fixed value.\n  * \\include Map_inner_stride.cpp\n  * Output: \\verbinclude Map_inner_stride.out\n  *\n  * Here's an example of mapping an array while specifying an outer stride. Here, since we're mapping\n  * as a column-major matrix, 'outer stride' means the pointer increment between two consecutive columns.\n  * Here, we're specifying the outer stride as a runtime parameter. Note that here \\c OuterStride<> is\n  * a short version of \\c OuterStride<Dynamic> because the default template parameter of OuterStride\n  * is  \\c Dynamic\n  * \\include Map_outer_stride.cpp\n  * Output: \\verbinclude Map_outer_stride.out\n  *\n  * For more details and for an example of specifying both an inner and an outer stride, see class Stride.\n  *\n  * \\b Tip: to change the array of data mapped by a Map object, you can use the C++\n  * placement new syntax:\n  *\n  * Example: \\include Map_placement_new.cpp\n  * Output: \\verbinclude Map_placement_new.out\n  *\n  * This class is the return type of PlainObjectBase::Map() but can also be used directly.\n  *\n  * \\sa PlainObjectBase::Map(), \\ref TopicStorageOrders\n  */\n\nnamespace internal {\ntemplate<typename PlainObjectType, int MapOptions, typename StrideType>\nstruct traits<Map<PlainObjectType, MapOptions, StrideType> >\n  : public traits<PlainObjectType>\n{\n  typedef traits<PlainObjectType> TraitsBase;\n  typedef typename PlainObjectType::Index Index;\n  typedef typename PlainObjectType::Scalar Scalar;\n  enum {\n    InnerStrideAtCompileTime = StrideType::InnerStrideAtCompileTime == 0\n                             ? int(PlainObjectType::InnerStrideAtCompileTime)\n                             : int(StrideType::InnerStrideAtCompileTime),\n    OuterStrideAtCompileTime = StrideType::OuterStrideAtCompileTime == 0\n                             ? int(PlainObjectType::OuterStrideAtCompileTime)\n                             : int(StrideType::OuterStrideAtCompileTime),\n    HasNoInnerStride = InnerStrideAtCompileTime == 1,\n    HasNoOuterStride = StrideType::OuterStrideAtCompileTime == 0,\n    HasNoStride = HasNoInnerStride && HasNoOuterStride,\n    IsAligned = bool(EIGEN_ALIGN) && ((int(MapOptions)&Aligned)==Aligned),\n    IsDynamicSize = PlainObjectType::SizeAtCompileTime==Dynamic,\n    KeepsPacketAccess = bool(HasNoInnerStride)\n                        && ( bool(IsDynamicSize)\n                           || HasNoOuterStride\n                           || ( OuterStrideAtCompileTime!=Dynamic\n                           && ((static_cast<int>(sizeof(Scalar))*OuterStrideAtCompileTime)%16)==0 ) ),\n    Flags0 = TraitsBase::Flags & (~NestByRefBit),\n    Flags1 = IsAligned ? (int(Flags0) | AlignedBit) : (int(Flags0) & ~AlignedBit),\n    Flags2 = (bool(HasNoStride) || bool(PlainObjectType::IsVectorAtCompileTime))\n           ? int(Flags1) : int(Flags1 & ~LinearAccessBit),\n    Flags3 = is_lvalue<PlainObjectType>::value ? int(Flags2) : (int(Flags2) & ~LvalueBit),\n    Flags = KeepsPacketAccess ? int(Flags3) : (int(Flags3) & ~PacketAccessBit)\n  };\nprivate:\n  enum { Options }; // Expressions don't have Options\n};\n}\n\ntemplate<typename PlainObjectType, int MapOptions, typename StrideType> class Map\n  : public MapBase<Map<PlainObjectType, MapOptions, StrideType> >\n{\n  public:\n\n    typedef MapBase<Map> Base;\n    EIGEN_DENSE_PUBLIC_INTERFACE(Map)\n\n    typedef typename Base::PointerType PointerType;\n#if EIGEN2_SUPPORT_STAGE <= STAGE30_FULL_EIGEN3_API\n    typedef const Scalar* PointerArgType;\n    inline PointerType cast_to_pointer_type(PointerArgType ptr) { return const_cast<PointerType>(ptr); }\n#else\n    typedef PointerType PointerArgType;\n    inline PointerType cast_to_pointer_type(PointerArgType ptr) { return ptr; }\n#endif\n\n    inline Index innerStride() const\n    {\n      return StrideType::InnerStrideAtCompileTime != 0 ? m_stride.inner() : 1;\n    }\n\n    inline Index outerStride() const\n    {\n      return StrideType::OuterStrideAtCompileTime != 0 ? m_stride.outer()\n           : IsVectorAtCompileTime ? this->size()\n           : int(Flags)&RowMajorBit ? this->cols()\n           : this->rows();\n    }\n\n    /** Constructor in the fixed-size case.\n      *\n      * \\param dataPtr pointer to the array to map\n      * \\param a_stride optional Stride object, passing the strides.\n      */\n    inline Map(PointerArgType dataPtr, const StrideType& a_stride = StrideType())\n      : Base(cast_to_pointer_type(dataPtr)), m_stride(a_stride)\n    {\n      PlainObjectType::Base::_check_template_params();\n    }\n\n    /** Constructor in the dynamic-size vector case.\n      *\n      * \\param dataPtr pointer to the array to map\n      * \\param a_size the size of the vector expression\n      * \\param a_stride optional Stride object, passing the strides.\n      */\n    inline Map(PointerArgType dataPtr, Index a_size, const StrideType& a_stride = StrideType())\n      : Base(cast_to_pointer_type(dataPtr), a_size), m_stride(a_stride)\n    {\n      PlainObjectType::Base::_check_template_params();\n    }\n\n    /** Constructor in the dynamic-size matrix case.\n      *\n      * \\param dataPtr pointer to the array to map\n      * \\param nbRows the number of rows of the matrix expression\n      * \\param nbCols the number of columns of the matrix expression\n      * \\param a_stride optional Stride object, passing the strides.\n      */\n    inline Map(PointerArgType dataPtr, Index nbRows, Index nbCols, const StrideType& a_stride = StrideType())\n      : Base(cast_to_pointer_type(dataPtr), nbRows, nbCols), m_stride(a_stride)\n    {\n      PlainObjectType::Base::_check_template_params();\n    }\n\n    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Map)\n\n  protected:\n    StrideType m_stride;\n};\n\ntemplate<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>\ninline Array<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>\n  ::Array(const Scalar *data)\n{\n  this->_set_noalias(Eigen::Map<const Array>(data));\n}\n\ntemplate<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>\ninline Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>\n  ::Matrix(const Scalar *data)\n{\n  this->_set_noalias(Eigen::Map<const Matrix>(data));\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_MAP_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/MapBase.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2007-2010 Benoit Jacob <jacob.benoit.1@gmail.com>\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_MAPBASE_H\n#define EIGEN_MAPBASE_H\n\n#define EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived) \\\n      EIGEN_STATIC_ASSERT((int(internal::traits<Derived>::Flags) & LinearAccessBit) || Derived::IsVectorAtCompileTime, \\\n                          YOU_ARE_TRYING_TO_USE_AN_INDEX_BASED_ACCESSOR_ON_AN_EXPRESSION_THAT_DOES_NOT_SUPPORT_THAT)\n\nnamespace Eigen { \n\n/** \\class MapBase\n  * \\ingroup Core_Module\n  *\n  * \\brief Base class for Map and Block expression with direct access\n  *\n  * \\sa class Map, class Block\n  */\ntemplate<typename Derived> class MapBase<Derived, ReadOnlyAccessors>\n  : public internal::dense_xpr_base<Derived>::type\n{\n  public:\n\n    typedef typename internal::dense_xpr_base<Derived>::type Base;\n    enum {\n      RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,\n      ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,\n      SizeAtCompileTime = Base::SizeAtCompileTime\n    };\n\n    typedef typename internal::traits<Derived>::StorageKind StorageKind;\n    typedef typename internal::traits<Derived>::Index Index;\n    typedef typename internal::traits<Derived>::Scalar Scalar;\n    typedef typename internal::packet_traits<Scalar>::type PacketScalar;\n    typedef typename NumTraits<Scalar>::Real RealScalar;\n    typedef typename internal::conditional<\n                         bool(internal::is_lvalue<Derived>::value),\n                         Scalar *,\n                         const Scalar *>::type\n                     PointerType;\n\n    using Base::derived;\n//    using Base::RowsAtCompileTime;\n//    using Base::ColsAtCompileTime;\n//    using Base::SizeAtCompileTime;\n    using Base::MaxRowsAtCompileTime;\n    using Base::MaxColsAtCompileTime;\n    using Base::MaxSizeAtCompileTime;\n    using Base::IsVectorAtCompileTime;\n    using Base::Flags;\n    using Base::IsRowMajor;\n\n    using Base::rows;\n    using Base::cols;\n    using Base::size;\n    using Base::coeff;\n    using Base::coeffRef;\n    using Base::lazyAssign;\n    using Base::eval;\n\n    using Base::innerStride;\n    using Base::outerStride;\n    using Base::rowStride;\n    using Base::colStride;\n\n    // bug 217 - compile error on ICC 11.1\n    using Base::operator=;\n\n    typedef typename Base::CoeffReturnType CoeffReturnType;\n\n    inline Index rows() const { return m_rows.value(); }\n    inline Index cols() const { return m_cols.value(); }\n\n    /** Returns a pointer to the first coefficient of the matrix or vector.\n      *\n      * \\note When addressing this data, make sure to honor the strides returned by innerStride() and outerStride().\n      *\n      * \\sa innerStride(), outerStride()\n      */\n    inline const Scalar* data() const { return m_data; }\n\n    inline const Scalar& coeff(Index rowId, Index colId) const\n    {\n      return m_data[colId * colStride() + rowId * rowStride()];\n    }\n\n    inline const Scalar& coeff(Index index) const\n    {\n      EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived)\n      return m_data[index * innerStride()];\n    }\n\n    inline const Scalar& coeffRef(Index rowId, Index colId) const\n    {\n      return this->m_data[colId * colStride() + rowId * rowStride()];\n    }\n\n    inline const Scalar& coeffRef(Index index) const\n    {\n      EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived)\n      return this->m_data[index * innerStride()];\n    }\n\n    template<int LoadMode>\n    inline PacketScalar packet(Index rowId, Index colId) const\n    {\n      return internal::ploadt<PacketScalar, LoadMode>\n               (m_data + (colId * colStride() + rowId * rowStride()));\n    }\n\n    template<int LoadMode>\n    inline PacketScalar packet(Index index) const\n    {\n      EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived)\n      return internal::ploadt<PacketScalar, LoadMode>(m_data + index * innerStride());\n    }\n\n    explicit inline MapBase(PointerType dataPtr) : m_data(dataPtr), m_rows(RowsAtCompileTime), m_cols(ColsAtCompileTime)\n    {\n      EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)\n      checkSanity();\n    }\n\n    inline MapBase(PointerType dataPtr, Index vecSize)\n            : m_data(dataPtr),\n              m_rows(RowsAtCompileTime == Dynamic ? vecSize : Index(RowsAtCompileTime)),\n              m_cols(ColsAtCompileTime == Dynamic ? vecSize : Index(ColsAtCompileTime))\n    {\n      EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)\n      eigen_assert(vecSize >= 0);\n      eigen_assert(dataPtr == 0 || SizeAtCompileTime == Dynamic || SizeAtCompileTime == vecSize);\n      checkSanity();\n    }\n\n    inline MapBase(PointerType dataPtr, Index nbRows, Index nbCols)\n            : m_data(dataPtr), m_rows(nbRows), m_cols(nbCols)\n    {\n      eigen_assert( (dataPtr == 0)\n              || (   nbRows >= 0 && (RowsAtCompileTime == Dynamic || RowsAtCompileTime == nbRows)\n                  && nbCols >= 0 && (ColsAtCompileTime == Dynamic || ColsAtCompileTime == nbCols)));\n      checkSanity();\n    }\n\n    #ifdef EIGEN_MAPBASE_PLUGIN\n    #include EIGEN_MAPBASE_PLUGIN\n    #endif\n\n  protected:\n\n    void checkSanity() const\n    {\n      EIGEN_STATIC_ASSERT(EIGEN_IMPLIES(internal::traits<Derived>::Flags&PacketAccessBit,\n                                        internal::inner_stride_at_compile_time<Derived>::ret==1),\n                          PACKET_ACCESS_REQUIRES_TO_HAVE_INNER_STRIDE_FIXED_TO_1);\n      eigen_assert(EIGEN_IMPLIES(internal::traits<Derived>::Flags&AlignedBit, (size_t(m_data) % 16) == 0)\n                   && \"input pointer is not aligned on a 16 byte boundary\");\n    }\n\n    PointerType m_data;\n    const internal::variable_if_dynamic<Index, RowsAtCompileTime> m_rows;\n    const internal::variable_if_dynamic<Index, ColsAtCompileTime> m_cols;\n};\n\ntemplate<typename Derived> class MapBase<Derived, WriteAccessors>\n  : public MapBase<Derived, ReadOnlyAccessors>\n{\n    typedef MapBase<Derived, ReadOnlyAccessors> ReadOnlyMapBase;\n  public:\n\n    typedef MapBase<Derived, ReadOnlyAccessors> Base;\n\n    typedef typename Base::Scalar Scalar;\n    typedef typename Base::PacketScalar PacketScalar;\n    typedef typename Base::Index Index;\n    typedef typename Base::PointerType PointerType;\n\n    using Base::derived;\n    using Base::rows;\n    using Base::cols;\n    using Base::size;\n    using Base::coeff;\n    using Base::coeffRef;\n\n    using Base::innerStride;\n    using Base::outerStride;\n    using Base::rowStride;\n    using Base::colStride;\n\n    typedef typename internal::conditional<\n                    internal::is_lvalue<Derived>::value,\n                    Scalar,\n                    const Scalar\n                  >::type ScalarWithConstIfNotLvalue;\n\n    inline const Scalar* data() const { return this->m_data; }\n    inline ScalarWithConstIfNotLvalue* data() { return this->m_data; } // no const-cast here so non-const-correct code will give a compile error\n\n    inline ScalarWithConstIfNotLvalue& coeffRef(Index row, Index col)\n    {\n      return this->m_data[col * colStride() + row * rowStride()];\n    }\n\n    inline ScalarWithConstIfNotLvalue& coeffRef(Index index)\n    {\n      EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived)\n      return this->m_data[index * innerStride()];\n    }\n\n    template<int StoreMode>\n    inline void writePacket(Index row, Index col, const PacketScalar& val)\n    {\n      internal::pstoret<Scalar, PacketScalar, StoreMode>\n               (this->m_data + (col * colStride() + row * rowStride()), val);\n    }\n\n    template<int StoreMode>\n    inline void writePacket(Index index, const PacketScalar& val)\n    {\n      EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived)\n      internal::pstoret<Scalar, PacketScalar, StoreMode>\n                (this->m_data + index * innerStride(), val);\n    }\n\n    explicit inline MapBase(PointerType dataPtr) : Base(dataPtr) {}\n    inline MapBase(PointerType dataPtr, Index vecSize) : Base(dataPtr, vecSize) {}\n    inline MapBase(PointerType dataPtr, Index nbRows, Index nbCols) : Base(dataPtr, nbRows, nbCols) {}\n\n    Derived& operator=(const MapBase& other)\n    {\n      ReadOnlyMapBase::Base::operator=(other);\n      return derived();\n    }\n\n    // In theory we could simply refer to Base:Base::operator=, but MSVC does not like Base::Base,\n    // see bugs 821 and 920.\n    using ReadOnlyMapBase::Base::operator=;\n};\n\n#undef EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS\n\n} // end namespace Eigen\n\n#endif // EIGEN_MAPBASE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/MathFunctions.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2006-2010 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_MATHFUNCTIONS_H\n#define EIGEN_MATHFUNCTIONS_H\n\nnamespace Eigen {\n\nnamespace internal {\n\n/** \\internal \\struct global_math_functions_filtering_base\n  *\n  * What it does:\n  * Defines a typedef 'type' as follows:\n  * - if type T has a member typedef Eigen_BaseClassForSpecializationOfGlobalMathFuncImpl, then\n  *   global_math_functions_filtering_base<T>::type is a typedef for it.\n  * - otherwise, global_math_functions_filtering_base<T>::type is a typedef for T.\n  *\n  * How it's used:\n  * To allow to defined the global math functions (like sin...) in certain cases, like the Array expressions.\n  * When you do sin(array1+array2), the object array1+array2 has a complicated expression type, all what you want to know\n  * is that it inherits ArrayBase. So we implement a partial specialization of sin_impl for ArrayBase<Derived>.\n  * So we must make sure to use sin_impl<ArrayBase<Derived> > and not sin_impl<Derived>, otherwise our partial specialization\n  * won't be used. How does sin know that? That's exactly what global_math_functions_filtering_base tells it.\n  *\n  * How it's implemented:\n  * SFINAE in the style of enable_if. Highly susceptible of breaking compilers. With GCC, it sure does work, but if you replace\n  * the typename dummy by an integer template parameter, it doesn't work anymore!\n  */\n\ntemplate<typename T, typename dummy = void>\nstruct global_math_functions_filtering_base\n{\n  typedef T type;\n};\n\ntemplate<typename T> struct always_void { typedef void type; };\n\ntemplate<typename T>\nstruct global_math_functions_filtering_base\n  <T,\n   typename always_void<typename T::Eigen_BaseClassForSpecializationOfGlobalMathFuncImpl>::type\n  >\n{\n  typedef typename T::Eigen_BaseClassForSpecializationOfGlobalMathFuncImpl type;\n};\n\n#define EIGEN_MATHFUNC_IMPL(func, scalar) Eigen::internal::func##_impl<typename Eigen::internal::global_math_functions_filtering_base<scalar>::type>\n#define EIGEN_MATHFUNC_RETVAL(func, scalar) typename Eigen::internal::func##_retval<typename Eigen::internal::global_math_functions_filtering_base<scalar>::type>::type\n\n/****************************************************************************\n* Implementation of real                                                 *\n****************************************************************************/\n\ntemplate<typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>\nstruct real_default_impl\n{\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  static inline RealScalar run(const Scalar& x)\n  {\n    return x;\n  }\n};\n\ntemplate<typename Scalar>\nstruct real_default_impl<Scalar,true>\n{\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  static inline RealScalar run(const Scalar& x)\n  {\n    using std::real;\n    return real(x);\n  }\n};\n\ntemplate<typename Scalar> struct real_impl : real_default_impl<Scalar> {};\n\ntemplate<typename Scalar>\nstruct real_retval\n{\n  typedef typename NumTraits<Scalar>::Real type;\n};\n\n\n/****************************************************************************\n* Implementation of imag                                                 *\n****************************************************************************/\n\ntemplate<typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>\nstruct imag_default_impl\n{\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  static inline RealScalar run(const Scalar&)\n  {\n    return RealScalar(0);\n  }\n};\n\ntemplate<typename Scalar>\nstruct imag_default_impl<Scalar,true>\n{\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  static inline RealScalar run(const Scalar& x)\n  {\n    using std::imag;\n    return imag(x);\n  }\n};\n\ntemplate<typename Scalar> struct imag_impl : imag_default_impl<Scalar> {};\n\ntemplate<typename Scalar>\nstruct imag_retval\n{\n  typedef typename NumTraits<Scalar>::Real type;\n};\n\n/****************************************************************************\n* Implementation of real_ref                                             *\n****************************************************************************/\n\ntemplate<typename Scalar>\nstruct real_ref_impl\n{\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  static inline RealScalar& run(Scalar& x)\n  {\n    return reinterpret_cast<RealScalar*>(&x)[0];\n  }\n  static inline const RealScalar& run(const Scalar& x)\n  {\n    return reinterpret_cast<const RealScalar*>(&x)[0];\n  }\n};\n\ntemplate<typename Scalar>\nstruct real_ref_retval\n{\n  typedef typename NumTraits<Scalar>::Real & type;\n};\n\n/****************************************************************************\n* Implementation of imag_ref                                             *\n****************************************************************************/\n\ntemplate<typename Scalar, bool IsComplex>\nstruct imag_ref_default_impl\n{\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  static inline RealScalar& run(Scalar& x)\n  {\n    return reinterpret_cast<RealScalar*>(&x)[1];\n  }\n  static inline const RealScalar& run(const Scalar& x)\n  {\n    return reinterpret_cast<RealScalar*>(&x)[1];\n  }\n};\n\ntemplate<typename Scalar>\nstruct imag_ref_default_impl<Scalar, false>\n{\n  static inline Scalar run(Scalar&)\n  {\n    return Scalar(0);\n  }\n  static inline const Scalar run(const Scalar&)\n  {\n    return Scalar(0);\n  }\n};\n\ntemplate<typename Scalar>\nstruct imag_ref_impl : imag_ref_default_impl<Scalar, NumTraits<Scalar>::IsComplex> {};\n\ntemplate<typename Scalar>\nstruct imag_ref_retval\n{\n  typedef typename NumTraits<Scalar>::Real & type;\n};\n\n/****************************************************************************\n* Implementation of conj                                                 *\n****************************************************************************/\n\ntemplate<typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>\nstruct conj_impl\n{\n  static inline Scalar run(const Scalar& x)\n  {\n    return x;\n  }\n};\n\ntemplate<typename Scalar>\nstruct conj_impl<Scalar,true>\n{\n  static inline Scalar run(const Scalar& x)\n  {\n    using std::conj;\n    return conj(x);\n  }\n};\n\ntemplate<typename Scalar>\nstruct conj_retval\n{\n  typedef Scalar type;\n};\n\n/****************************************************************************\n* Implementation of abs2                                                 *\n****************************************************************************/\n\ntemplate<typename Scalar,bool IsComplex>\nstruct abs2_impl_default\n{\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  static inline RealScalar run(const Scalar& x)\n  {\n    return x*x;\n  }\n};\n\ntemplate<typename Scalar>\nstruct abs2_impl_default<Scalar, true> // IsComplex\n{\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  static inline RealScalar run(const Scalar& x)\n  {\n    return real(x)*real(x) + imag(x)*imag(x);\n  }\n};\n\ntemplate<typename Scalar>\nstruct abs2_impl\n{\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  static inline RealScalar run(const Scalar& x)\n  {\n    return abs2_impl_default<Scalar,NumTraits<Scalar>::IsComplex>::run(x);\n  }\n};\n\ntemplate<typename Scalar>\nstruct abs2_retval\n{\n  typedef typename NumTraits<Scalar>::Real type;\n};\n\n/****************************************************************************\n* Implementation of norm1                                                *\n****************************************************************************/\n\ntemplate<typename Scalar, bool IsComplex>\nstruct norm1_default_impl\n{\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  static inline RealScalar run(const Scalar& x)\n  {\n    using std::abs;\n    return abs(real(x)) + abs(imag(x));\n  }\n};\n\ntemplate<typename Scalar>\nstruct norm1_default_impl<Scalar, false>\n{\n  static inline Scalar run(const Scalar& x)\n  {\n    using std::abs;\n    return abs(x);\n  }\n};\n\ntemplate<typename Scalar>\nstruct norm1_impl : norm1_default_impl<Scalar, NumTraits<Scalar>::IsComplex> {};\n\ntemplate<typename Scalar>\nstruct norm1_retval\n{\n  typedef typename NumTraits<Scalar>::Real type;\n};\n\n/****************************************************************************\n* Implementation of hypot                                                *\n****************************************************************************/\n\ntemplate<typename Scalar>\nstruct hypot_impl\n{\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  static inline RealScalar run(const Scalar& x, const Scalar& y)\n  {\n    using std::max;\n    using std::min;\n    using std::abs;\n    using std::sqrt;\n    RealScalar _x = abs(x);\n    RealScalar _y = abs(y);\n    RealScalar p = (max)(_x, _y);\n    if(p==RealScalar(0)) return RealScalar(0);\n    RealScalar q = (min)(_x, _y);\n    RealScalar qp = q/p;\n    return p * sqrt(RealScalar(1) + qp*qp);\n  }\n};\n\ntemplate<typename Scalar>\nstruct hypot_retval\n{\n  typedef typename NumTraits<Scalar>::Real type;\n};\n\n/****************************************************************************\n* Implementation of cast                                                 *\n****************************************************************************/\n\ntemplate<typename OldType, typename NewType>\nstruct cast_impl\n{\n  static inline NewType run(const OldType& x)\n  {\n    return static_cast<NewType>(x);\n  }\n};\n\n// here, for once, we're plainly returning NewType: we don't want cast to do weird things.\n\ntemplate<typename OldType, typename NewType>\ninline NewType cast(const OldType& x)\n{\n  return cast_impl<OldType, NewType>::run(x);\n}\n\n/****************************************************************************\n* Implementation of atanh2                                                *\n****************************************************************************/\n\ntemplate<typename Scalar, bool IsInteger>\nstruct atanh2_default_impl\n{\n  typedef Scalar retval;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  static inline Scalar run(const Scalar& x, const Scalar& y)\n  {\n    using std::abs;\n    using std::log;\n    using std::sqrt;\n    Scalar z = x / y;\n    if (y == Scalar(0) || abs(z) > sqrt(NumTraits<RealScalar>::epsilon()))\n      return RealScalar(0.5) * log((y + x) / (y - x));\n    else\n      return z + z*z*z / RealScalar(3);\n  }\n};\n\ntemplate<typename Scalar>\nstruct atanh2_default_impl<Scalar, true>\n{\n  static inline Scalar run(const Scalar&, const Scalar&)\n  {\n    EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)\n    return Scalar(0);\n  }\n};\n\ntemplate<typename Scalar>\nstruct atanh2_impl : atanh2_default_impl<Scalar, NumTraits<Scalar>::IsInteger> {};\n\ntemplate<typename Scalar>\nstruct atanh2_retval\n{\n  typedef Scalar type;\n};\n\n/****************************************************************************\n* Implementation of pow                                                  *\n****************************************************************************/\n\ntemplate<typename Scalar, bool IsInteger>\nstruct pow_default_impl\n{\n  typedef Scalar retval;\n  static inline Scalar run(const Scalar& x, const Scalar& y)\n  {\n    using std::pow;\n    return pow(x, y);\n  }\n};\n\ntemplate<typename Scalar>\nstruct pow_default_impl<Scalar, true>\n{\n  static inline Scalar run(Scalar x, Scalar y)\n  {\n    Scalar res(1);\n    eigen_assert(!NumTraits<Scalar>::IsSigned || y >= 0);\n    if(y & 1) res *= x;\n    y >>= 1;\n    while(y)\n    {\n      x *= x;\n      if(y&1) res *= x;\n      y >>= 1;\n    }\n    return res;\n  }\n};\n\ntemplate<typename Scalar>\nstruct pow_impl : pow_default_impl<Scalar, NumTraits<Scalar>::IsInteger> {};\n\ntemplate<typename Scalar>\nstruct pow_retval\n{\n  typedef Scalar type;\n};\n\n/****************************************************************************\n* Implementation of random                                               *\n****************************************************************************/\n\ntemplate<typename Scalar,\n         bool IsComplex,\n         bool IsInteger>\nstruct random_default_impl {};\n\ntemplate<typename Scalar>\nstruct random_impl : random_default_impl<Scalar, NumTraits<Scalar>::IsComplex, NumTraits<Scalar>::IsInteger> {};\n\ntemplate<typename Scalar>\nstruct random_retval\n{\n  typedef Scalar type;\n};\n\ntemplate<typename Scalar> inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random(const Scalar& x, const Scalar& y);\ntemplate<typename Scalar> inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random();\n\ntemplate<typename Scalar>\nstruct random_default_impl<Scalar, false, false>\n{\n  static inline Scalar run(const Scalar& x, const Scalar& y)\n  {\n    return x + (y-x) * Scalar(std::rand()) / Scalar(RAND_MAX);\n  }\n  static inline Scalar run()\n  {\n    return run(Scalar(NumTraits<Scalar>::IsSigned ? -1 : 0), Scalar(1));\n  }\n};\n\nenum {\n  floor_log2_terminate,\n  floor_log2_move_up,\n  floor_log2_move_down,\n  floor_log2_bogus\n};\n\ntemplate<unsigned int n, int lower, int upper> struct floor_log2_selector\n{\n  enum { middle = (lower + upper) / 2,\n         value = (upper <= lower + 1) ? int(floor_log2_terminate)\n               : (n < (1 << middle)) ? int(floor_log2_move_down)\n               : (n==0) ? int(floor_log2_bogus)\n               : int(floor_log2_move_up)\n  };\n};\n\ntemplate<unsigned int n,\n         int lower = 0,\n         int upper = sizeof(unsigned int) * CHAR_BIT - 1,\n         int selector = floor_log2_selector<n, lower, upper>::value>\nstruct floor_log2 {};\n\ntemplate<unsigned int n, int lower, int upper>\nstruct floor_log2<n, lower, upper, floor_log2_move_down>\n{\n  enum { value = floor_log2<n, lower, floor_log2_selector<n, lower, upper>::middle>::value };\n};\n\ntemplate<unsigned int n, int lower, int upper>\nstruct floor_log2<n, lower, upper, floor_log2_move_up>\n{\n  enum { value = floor_log2<n, floor_log2_selector<n, lower, upper>::middle, upper>::value };\n};\n\ntemplate<unsigned int n, int lower, int upper>\nstruct floor_log2<n, lower, upper, floor_log2_terminate>\n{\n  enum { value = (n >= ((unsigned int)(1) << (lower+1))) ? lower+1 : lower };\n};\n\ntemplate<unsigned int n, int lower, int upper>\nstruct floor_log2<n, lower, upper, floor_log2_bogus>\n{\n  // no value, error at compile time\n};\n\ntemplate<typename Scalar>\nstruct random_default_impl<Scalar, false, true>\n{\n  typedef typename NumTraits<Scalar>::NonInteger NonInteger;\n\n  static inline Scalar run(const Scalar& x, const Scalar& y)\n  {\n    return x + Scalar((NonInteger(y)-x+1) * std::rand() / (RAND_MAX + NonInteger(1)));\n  }\n\n  static inline Scalar run()\n  {\n#ifdef EIGEN_MAKING_DOCS\n    return run(Scalar(NumTraits<Scalar>::IsSigned ? -10 : 0), Scalar(10));\n#else\n    enum { rand_bits = floor_log2<(unsigned int)(RAND_MAX)+1>::value,\n           scalar_bits = sizeof(Scalar) * CHAR_BIT,\n           shift = EIGEN_PLAIN_ENUM_MAX(0, int(rand_bits) - int(scalar_bits)),\n           offset = NumTraits<Scalar>::IsSigned ? (1 << (EIGEN_PLAIN_ENUM_MIN(rand_bits,scalar_bits)-1)) : 0\n    };\n    return Scalar((std::rand() >> shift) - offset);\n#endif\n  }\n};\n\ntemplate<typename Scalar>\nstruct random_default_impl<Scalar, true, false>\n{\n  static inline Scalar run(const Scalar& x, const Scalar& y)\n  {\n    return Scalar(random(real(x), real(y)),\n                  random(imag(x), imag(y)));\n  }\n  static inline Scalar run()\n  {\n    typedef typename NumTraits<Scalar>::Real RealScalar;\n    return Scalar(random<RealScalar>(), random<RealScalar>());\n  }\n};\n\ntemplate<typename Scalar>\ninline EIGEN_MATHFUNC_RETVAL(random, Scalar) random(const Scalar& x, const Scalar& y)\n{\n  return EIGEN_MATHFUNC_IMPL(random, Scalar)::run(x, y);\n}\n\ntemplate<typename Scalar>\ninline EIGEN_MATHFUNC_RETVAL(random, Scalar) random()\n{\n  return EIGEN_MATHFUNC_IMPL(random, Scalar)::run();\n}\n\n} // end namespace internal\n\n/****************************************************************************\n* Generic math function                                                    *\n****************************************************************************/\n\nnamespace numext {\n\ntemplate<typename Scalar>\ninline EIGEN_MATHFUNC_RETVAL(real, Scalar) real(const Scalar& x)\n{\n  return EIGEN_MATHFUNC_IMPL(real, Scalar)::run(x);\n}  \n\ntemplate<typename Scalar>\ninline typename internal::add_const_on_value_type< EIGEN_MATHFUNC_RETVAL(real_ref, Scalar) >::type real_ref(const Scalar& x)\n{\n  return internal::real_ref_impl<Scalar>::run(x);\n}\n\ntemplate<typename Scalar>\ninline EIGEN_MATHFUNC_RETVAL(real_ref, Scalar) real_ref(Scalar& x)\n{\n  return EIGEN_MATHFUNC_IMPL(real_ref, Scalar)::run(x);\n}\n\ntemplate<typename Scalar>\ninline EIGEN_MATHFUNC_RETVAL(imag, Scalar) imag(const Scalar& x)\n{\n  return EIGEN_MATHFUNC_IMPL(imag, Scalar)::run(x);\n}\n\ntemplate<typename Scalar>\ninline typename internal::add_const_on_value_type< EIGEN_MATHFUNC_RETVAL(imag_ref, Scalar) >::type imag_ref(const Scalar& x)\n{\n  return internal::imag_ref_impl<Scalar>::run(x);\n}\n\ntemplate<typename Scalar>\ninline EIGEN_MATHFUNC_RETVAL(imag_ref, Scalar) imag_ref(Scalar& x)\n{\n  return EIGEN_MATHFUNC_IMPL(imag_ref, Scalar)::run(x);\n}\n\ntemplate<typename Scalar>\ninline EIGEN_MATHFUNC_RETVAL(conj, Scalar) conj(const Scalar& x)\n{\n  return EIGEN_MATHFUNC_IMPL(conj, Scalar)::run(x);\n}\n\ntemplate<typename Scalar>\ninline EIGEN_MATHFUNC_RETVAL(abs2, Scalar) abs2(const Scalar& x)\n{\n  return EIGEN_MATHFUNC_IMPL(abs2, Scalar)::run(x);\n}\n\ntemplate<typename Scalar>\ninline EIGEN_MATHFUNC_RETVAL(norm1, Scalar) norm1(const Scalar& x)\n{\n  return EIGEN_MATHFUNC_IMPL(norm1, Scalar)::run(x);\n}\n\ntemplate<typename Scalar>\ninline EIGEN_MATHFUNC_RETVAL(hypot, Scalar) hypot(const Scalar& x, const Scalar& y)\n{\n  return EIGEN_MATHFUNC_IMPL(hypot, Scalar)::run(x, y);\n}\n\ntemplate<typename Scalar>\ninline EIGEN_MATHFUNC_RETVAL(atanh2, Scalar) atanh2(const Scalar& x, const Scalar& y)\n{\n  return EIGEN_MATHFUNC_IMPL(atanh2, Scalar)::run(x, y);\n}\n\ntemplate<typename Scalar>\ninline EIGEN_MATHFUNC_RETVAL(pow, Scalar) pow(const Scalar& x, const Scalar& y)\n{\n  return EIGEN_MATHFUNC_IMPL(pow, Scalar)::run(x, y);\n}\n\n// std::isfinite is non standard, so let's define our own version,\n// even though it is not very efficient.\ntemplate<typename T> bool (isfinite)(const T& x)\n{\n  return x<NumTraits<T>::highest() && x>NumTraits<T>::lowest();\n}\n\n} // end namespace numext\n\nnamespace internal {\n\n/****************************************************************************\n* Implementation of fuzzy comparisons                                       *\n****************************************************************************/\n\ntemplate<typename Scalar,\n         bool IsComplex,\n         bool IsInteger>\nstruct scalar_fuzzy_default_impl {};\n\ntemplate<typename Scalar>\nstruct scalar_fuzzy_default_impl<Scalar, false, false>\n{\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  template<typename OtherScalar>\n  static inline bool isMuchSmallerThan(const Scalar& x, const OtherScalar& y, const RealScalar& prec)\n  {\n    using std::abs;\n    return abs(x) <= abs(y) * prec;\n  }\n  static inline bool isApprox(const Scalar& x, const Scalar& y, const RealScalar& prec)\n  {\n    using std::min;\n    using std::abs;\n    return abs(x - y) <= (min)(abs(x), abs(y)) * prec;\n  }\n  static inline bool isApproxOrLessThan(const Scalar& x, const Scalar& y, const RealScalar& prec)\n  {\n    return x <= y || isApprox(x, y, prec);\n  }\n};\n\ntemplate<typename Scalar>\nstruct scalar_fuzzy_default_impl<Scalar, false, true>\n{\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  template<typename OtherScalar>\n  static inline bool isMuchSmallerThan(const Scalar& x, const Scalar&, const RealScalar&)\n  {\n    return x == Scalar(0);\n  }\n  static inline bool isApprox(const Scalar& x, const Scalar& y, const RealScalar&)\n  {\n    return x == y;\n  }\n  static inline bool isApproxOrLessThan(const Scalar& x, const Scalar& y, const RealScalar&)\n  {\n    return x <= y;\n  }\n};\n\ntemplate<typename Scalar>\nstruct scalar_fuzzy_default_impl<Scalar, true, false>\n{\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  template<typename OtherScalar>\n  static inline bool isMuchSmallerThan(const Scalar& x, const OtherScalar& y, const RealScalar& prec)\n  {\n    return numext::abs2(x) <= numext::abs2(y) * prec * prec;\n  }\n  static inline bool isApprox(const Scalar& x, const Scalar& y, const RealScalar& prec)\n  {\n    using std::min;\n    return numext::abs2(x - y) <= (min)(numext::abs2(x), numext::abs2(y)) * prec * prec;\n  }\n};\n\ntemplate<typename Scalar>\nstruct scalar_fuzzy_impl : scalar_fuzzy_default_impl<Scalar, NumTraits<Scalar>::IsComplex, NumTraits<Scalar>::IsInteger> {};\n\ntemplate<typename Scalar, typename OtherScalar>\ninline bool isMuchSmallerThan(const Scalar& x, const OtherScalar& y,\n                              const typename NumTraits<Scalar>::Real &precision = NumTraits<Scalar>::dummy_precision())\n{\n  return scalar_fuzzy_impl<Scalar>::template isMuchSmallerThan<OtherScalar>(x, y, precision);\n}\n\ntemplate<typename Scalar>\ninline bool isApprox(const Scalar& x, const Scalar& y,\n                     const typename NumTraits<Scalar>::Real &precision = NumTraits<Scalar>::dummy_precision())\n{\n  return scalar_fuzzy_impl<Scalar>::isApprox(x, y, precision);\n}\n\ntemplate<typename Scalar>\ninline bool isApproxOrLessThan(const Scalar& x, const Scalar& y,\n                               const typename NumTraits<Scalar>::Real &precision = NumTraits<Scalar>::dummy_precision())\n{\n  return scalar_fuzzy_impl<Scalar>::isApproxOrLessThan(x, y, precision);\n}\n\n/******************************************\n***  The special case of the  bool type ***\n******************************************/\n\ntemplate<> struct random_impl<bool>\n{\n  static inline bool run()\n  {\n    return random<int>(0,1)==0 ? false : true;\n  }\n};\n\ntemplate<> struct scalar_fuzzy_impl<bool>\n{\n  typedef bool RealScalar;\n  \n  template<typename OtherScalar>\n  static inline bool isMuchSmallerThan(const bool& x, const bool&, const bool&)\n  {\n    return !x;\n  }\n  \n  static inline bool isApprox(bool x, bool y, bool)\n  {\n    return x == y;\n  }\n\n  static inline bool isApproxOrLessThan(const bool& x, const bool& y, const bool&)\n  {\n    return (!x) || y;\n  }\n  \n};\n\n  \n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_MATHFUNCTIONS_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/Matrix.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2006-2010 Benoit Jacob <jacob.benoit.1@gmail.com>\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_MATRIX_H\n#define EIGEN_MATRIX_H\n\nnamespace Eigen {\n\n/** \\class Matrix\n  * \\ingroup Core_Module\n  *\n  * \\brief The matrix class, also used for vectors and row-vectors\n  *\n  * The %Matrix class is the work-horse for all \\em dense (\\ref dense \"note\") matrices and vectors within Eigen.\n  * Vectors are matrices with one column, and row-vectors are matrices with one row.\n  *\n  * The %Matrix class encompasses \\em both fixed-size and dynamic-size objects (\\ref fixedsize \"note\").\n  *\n  * The first three template parameters are required:\n  * \\tparam _Scalar \\anchor matrix_tparam_scalar Numeric type, e.g. float, double, int or std::complex<float>.\n  *                 User defined sclar types are supported as well (see \\ref user_defined_scalars \"here\").\n  * \\tparam _Rows Number of rows, or \\b Dynamic\n  * \\tparam _Cols Number of columns, or \\b Dynamic\n  *\n  * The remaining template parameters are optional -- in most cases you don't have to worry about them.\n  * \\tparam _Options \\anchor matrix_tparam_options A combination of either \\b #RowMajor or \\b #ColMajor, and of either\n  *                 \\b #AutoAlign or \\b #DontAlign.\n  *                 The former controls \\ref TopicStorageOrders \"storage order\", and defaults to column-major. The latter controls alignment, which is required\n  *                 for vectorization. It defaults to aligning matrices except for fixed sizes that aren't a multiple of the packet size.\n  * \\tparam _MaxRows Maximum number of rows. Defaults to \\a _Rows (\\ref maxrows \"note\").\n  * \\tparam _MaxCols Maximum number of columns. Defaults to \\a _Cols (\\ref maxrows \"note\").\n  *\n  * Eigen provides a number of typedefs covering the usual cases. Here are some examples:\n  *\n  * \\li \\c Matrix2d is a 2x2 square matrix of doubles (\\c Matrix<double, 2, 2>)\n  * \\li \\c Vector4f is a vector of 4 floats (\\c Matrix<float, 4, 1>)\n  * \\li \\c RowVector3i is a row-vector of 3 ints (\\c Matrix<int, 1, 3>)\n  *\n  * \\li \\c MatrixXf is a dynamic-size matrix of floats (\\c Matrix<float, Dynamic, Dynamic>)\n  * \\li \\c VectorXf is a dynamic-size vector of floats (\\c Matrix<float, Dynamic, 1>)\n  *\n  * \\li \\c Matrix2Xf is a partially fixed-size (dynamic-size) matrix of floats (\\c Matrix<float, 2, Dynamic>)\n  * \\li \\c MatrixX3d is a partially dynamic-size (fixed-size) matrix of double (\\c Matrix<double, Dynamic, 3>)\n  *\n  * See \\link matrixtypedefs this page \\endlink for a complete list of predefined \\em %Matrix and \\em Vector typedefs.\n  *\n  * You can access elements of vectors and matrices using normal subscripting:\n  *\n  * \\code\n  * Eigen::VectorXd v(10);\n  * v[0] = 0.1;\n  * v[1] = 0.2;\n  * v(0) = 0.3;\n  * v(1) = 0.4;\n  *\n  * Eigen::MatrixXi m(10, 10);\n  * m(0, 1) = 1;\n  * m(0, 2) = 2;\n  * m(0, 3) = 3;\n  * \\endcode\n  *\n  * This class can be extended with the help of the plugin mechanism described on the page\n  * \\ref TopicCustomizingEigen by defining the preprocessor symbol \\c EIGEN_MATRIX_PLUGIN.\n  *\n  * <i><b>Some notes:</b></i>\n  *\n  * <dl>\n  * <dt><b>\\anchor dense Dense versus sparse:</b></dt>\n  * <dd>This %Matrix class handles dense, not sparse matrices and vectors. For sparse matrices and vectors, see the Sparse module.\n  *\n  * Dense matrices and vectors are plain usual arrays of coefficients. All the coefficients are stored, in an ordinary contiguous array.\n  * This is unlike Sparse matrices and vectors where the coefficients are stored as a list of nonzero coefficients.</dd>\n  *\n  * <dt><b>\\anchor fixedsize Fixed-size versus dynamic-size:</b></dt>\n  * <dd>Fixed-size means that the numbers of rows and columns are known are compile-time. In this case, Eigen allocates the array\n  * of coefficients as a fixed-size array, as a class member. This makes sense for very small matrices, typically up to 4x4, sometimes up\n  * to 16x16. Larger matrices should be declared as dynamic-size even if one happens to know their size at compile-time.\n  *\n  * Dynamic-size means that the numbers of rows or columns are not necessarily known at compile-time. In this case they are runtime\n  * variables, and the array of coefficients is allocated dynamically on the heap.\n  *\n  * Note that \\em dense matrices, be they Fixed-size or Dynamic-size, <em>do not</em> expand dynamically in the sense of a std::map.\n  * If you want this behavior, see the Sparse module.</dd>\n  *\n  * <dt><b>\\anchor maxrows _MaxRows and _MaxCols:</b></dt>\n  * <dd>In most cases, one just leaves these parameters to the default values.\n  * These parameters mean the maximum size of rows and columns that the matrix may have. They are useful in cases\n  * when the exact numbers of rows and columns are not known are compile-time, but it is known at compile-time that they cannot\n  * exceed a certain value. This happens when taking dynamic-size blocks inside fixed-size matrices: in this case _MaxRows and _MaxCols\n  * are the dimensions of the original matrix, while _Rows and _Cols are Dynamic.</dd>\n  * </dl>\n  *\n  * \\see MatrixBase for the majority of the API methods for matrices, \\ref TopicClassHierarchy, \n  * \\ref TopicStorageOrders \n  */\n\nnamespace internal {\ntemplate<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>\nstruct traits<Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> >\n{\n  typedef _Scalar Scalar;\n  typedef Dense StorageKind;\n  typedef DenseIndex Index;\n  typedef MatrixXpr XprKind;\n  enum {\n    RowsAtCompileTime = _Rows,\n    ColsAtCompileTime = _Cols,\n    MaxRowsAtCompileTime = _MaxRows,\n    MaxColsAtCompileTime = _MaxCols,\n    Flags = compute_matrix_flags<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>::ret,\n    CoeffReadCost = NumTraits<Scalar>::ReadCost,\n    Options = _Options,\n    InnerStrideAtCompileTime = 1,\n    OuterStrideAtCompileTime = (Options&RowMajor) ? ColsAtCompileTime : RowsAtCompileTime\n  };\n};\n}\n\ntemplate<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>\nclass Matrix\n  : public PlainObjectBase<Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> >\n{\n  public:\n\n    /** \\brief Base class typedef.\n      * \\sa PlainObjectBase\n      */\n    typedef PlainObjectBase<Matrix> Base;\n\n    enum { Options = _Options };\n\n    EIGEN_DENSE_PUBLIC_INTERFACE(Matrix)\n\n    typedef typename Base::PlainObject PlainObject;\n\n    using Base::base;\n    using Base::coeffRef;\n\n    /**\n      * \\brief Assigns matrices to each other.\n      *\n      * \\note This is a special case of the templated operator=. Its purpose is\n      * to prevent a default operator= from hiding the templated operator=.\n      *\n      * \\callgraph\n      */\n    EIGEN_STRONG_INLINE Matrix& operator=(const Matrix& other)\n    {\n      return Base::_set(other);\n    }\n\n    /** \\internal\n      * \\brief Copies the value of the expression \\a other into \\c *this with automatic resizing.\n      *\n      * *this might be resized to match the dimensions of \\a other. If *this was a null matrix (not already initialized),\n      * it will be initialized.\n      *\n      * Note that copying a row-vector into a vector (and conversely) is allowed.\n      * The resizing, if any, is then done in the appropriate way so that row-vectors\n      * remain row-vectors and vectors remain vectors.\n      */\n    template<typename OtherDerived>\n    EIGEN_STRONG_INLINE Matrix& operator=(const MatrixBase<OtherDerived>& other)\n    {\n      return Base::_set(other);\n    }\n\n    /* Here, doxygen failed to copy the brief information when using \\copydoc */\n\n    /**\n      * \\brief Copies the generic expression \\a other into *this.\n      * \\copydetails DenseBase::operator=(const EigenBase<OtherDerived> &other)\n      */\n    template<typename OtherDerived>\n    EIGEN_STRONG_INLINE Matrix& operator=(const EigenBase<OtherDerived> &other)\n    {\n      return Base::operator=(other);\n    }\n\n    template<typename OtherDerived>\n    EIGEN_STRONG_INLINE Matrix& operator=(const ReturnByValue<OtherDerived>& func)\n    {\n      return Base::operator=(func);\n    }\n\n    /** \\brief Default constructor.\n      *\n      * For fixed-size matrices, does nothing.\n      *\n      * For dynamic-size matrices, creates an empty matrix of size 0. Does not allocate any array. Such a matrix\n      * is called a null matrix. This constructor is the unique way to create null matrices: resizing\n      * a matrix to 0 is not supported.\n      *\n      * \\sa resize(Index,Index)\n      */\n    EIGEN_STRONG_INLINE Matrix() : Base()\n    {\n      Base::_check_template_params();\n      EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED\n    }\n\n    // FIXME is it still needed\n    Matrix(internal::constructor_without_unaligned_array_assert)\n      : Base(internal::constructor_without_unaligned_array_assert())\n    { Base::_check_template_params(); EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED }\n\n#ifdef EIGEN_HAVE_RVALUE_REFERENCES\n    Matrix(Matrix&& other)\n      : Base(std::move(other))\n    {\n      Base::_check_template_params();\n      if (RowsAtCompileTime!=Dynamic && ColsAtCompileTime!=Dynamic)\n        Base::_set_noalias(other);\n    }\n    Matrix& operator=(Matrix&& other)\n    {\n      other.swap(*this);\n      return *this;\n    }\n#endif\n\n    /** \\brief Constructs a vector or row-vector with given dimension. \\only_for_vectors\n      *\n      * Note that this is only useful for dynamic-size vectors. For fixed-size vectors,\n      * it is redundant to pass the dimension here, so it makes more sense to use the default\n      * constructor Matrix() instead.\n      */\n    EIGEN_STRONG_INLINE explicit Matrix(Index dim)\n      : Base(dim, RowsAtCompileTime == 1 ? 1 : dim, ColsAtCompileTime == 1 ? 1 : dim)\n    {\n      Base::_check_template_params();\n      EIGEN_STATIC_ASSERT_VECTOR_ONLY(Matrix)\n      eigen_assert(dim >= 0);\n      eigen_assert(SizeAtCompileTime == Dynamic || SizeAtCompileTime == dim);\n      EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED\n    }\n\n    #ifndef EIGEN_PARSED_BY_DOXYGEN\n    template<typename T0, typename T1>\n    EIGEN_STRONG_INLINE Matrix(const T0& x, const T1& y)\n    {\n      Base::_check_template_params();\n      Base::template _init2<T0,T1>(x, y);\n    }\n    #else\n    /** \\brief Constructs an uninitialized matrix with \\a rows rows and \\a cols columns.\n      *\n      * This is useful for dynamic-size matrices. For fixed-size matrices,\n      * it is redundant to pass these parameters, so one should use the default constructor\n      * Matrix() instead. */\n    Matrix(Index rows, Index cols);\n    /** \\brief Constructs an initialized 2D vector with given coefficients */\n    Matrix(const Scalar& x, const Scalar& y);\n    #endif\n\n    /** \\brief Constructs an initialized 3D vector with given coefficients */\n    EIGEN_STRONG_INLINE Matrix(const Scalar& x, const Scalar& y, const Scalar& z)\n    {\n      Base::_check_template_params();\n      EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Matrix, 3)\n      m_storage.data()[0] = x;\n      m_storage.data()[1] = y;\n      m_storage.data()[2] = z;\n    }\n    /** \\brief Constructs an initialized 4D vector with given coefficients */\n    EIGEN_STRONG_INLINE Matrix(const Scalar& x, const Scalar& y, const Scalar& z, const Scalar& w)\n    {\n      Base::_check_template_params();\n      EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Matrix, 4)\n      m_storage.data()[0] = x;\n      m_storage.data()[1] = y;\n      m_storage.data()[2] = z;\n      m_storage.data()[3] = w;\n    }\n\n    explicit Matrix(const Scalar *data);\n\n    /** \\brief Constructor copying the value of the expression \\a other */\n    template<typename OtherDerived>\n    EIGEN_STRONG_INLINE Matrix(const MatrixBase<OtherDerived>& other)\n             : Base(other.rows() * other.cols(), other.rows(), other.cols())\n    {\n      // This test resides here, to bring the error messages closer to the user. Normally, these checks\n      // are performed deeply within the library, thus causing long and scary error traces.\n      EIGEN_STATIC_ASSERT((internal::is_same<Scalar, typename OtherDerived::Scalar>::value),\n        YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)\n\n      Base::_check_template_params();\n      Base::_set_noalias(other);\n    }\n    /** \\brief Copy constructor */\n    EIGEN_STRONG_INLINE Matrix(const Matrix& other)\n            : Base(other.rows() * other.cols(), other.rows(), other.cols())\n    {\n      Base::_check_template_params();\n      Base::_set_noalias(other);\n    }\n    /** \\brief Copy constructor with in-place evaluation */\n    template<typename OtherDerived>\n    EIGEN_STRONG_INLINE Matrix(const ReturnByValue<OtherDerived>& other)\n    {\n      Base::_check_template_params();\n      Base::resize(other.rows(), other.cols());\n      other.evalTo(*this);\n    }\n\n    /** \\brief Copy constructor for generic expressions.\n      * \\sa MatrixBase::operator=(const EigenBase<OtherDerived>&)\n      */\n    template<typename OtherDerived>\n    EIGEN_STRONG_INLINE Matrix(const EigenBase<OtherDerived> &other)\n      : Base(other.derived().rows() * other.derived().cols(), other.derived().rows(), other.derived().cols())\n    {\n      Base::_check_template_params();\n      Base::_resize_to_match(other);\n      // FIXME/CHECK: isn't *this = other.derived() more efficient. it allows to\n      //              go for pure _set() implementations, right?\n      *this = other;\n    }\n\n    /** \\internal\n      * \\brief Override MatrixBase::swap() since for dynamic-sized matrices\n      * of same type it is enough to swap the data pointers.\n      */\n    template<typename OtherDerived>\n    void swap(MatrixBase<OtherDerived> const & other)\n    { this->_swap(other.derived()); }\n\n    inline Index innerStride() const { return 1; }\n    inline Index outerStride() const { return this->innerSize(); }\n\n    /////////// Geometry module ///////////\n\n    template<typename OtherDerived>\n    explicit Matrix(const RotationBase<OtherDerived,ColsAtCompileTime>& r);\n    template<typename OtherDerived>\n    Matrix& operator=(const RotationBase<OtherDerived,ColsAtCompileTime>& r);\n\n    #ifdef EIGEN2_SUPPORT\n    template<typename OtherDerived>\n    explicit Matrix(const eigen2_RotationBase<OtherDerived,ColsAtCompileTime>& r);\n    template<typename OtherDerived>\n    Matrix& operator=(const eigen2_RotationBase<OtherDerived,ColsAtCompileTime>& r);\n    #endif\n\n    // allow to extend Matrix outside Eigen\n    #ifdef EIGEN_MATRIX_PLUGIN\n    #include EIGEN_MATRIX_PLUGIN\n    #endif\n\n  protected:\n    template <typename Derived, typename OtherDerived, bool IsVector>\n    friend struct internal::conservative_resize_like_impl;\n\n    using Base::m_storage;\n};\n\n/** \\defgroup matrixtypedefs Global matrix typedefs\n  *\n  * \\ingroup Core_Module\n  *\n  * Eigen defines several typedef shortcuts for most common matrix and vector types.\n  *\n  * The general patterns are the following:\n  *\n  * \\c MatrixSizeType where \\c Size can be \\c 2,\\c 3,\\c 4 for fixed size square matrices or \\c X for dynamic size,\n  * and where \\c Type can be \\c i for integer, \\c f for float, \\c d for double, \\c cf for complex float, \\c cd\n  * for complex double.\n  *\n  * For example, \\c Matrix3d is a fixed-size 3x3 matrix type of doubles, and \\c MatrixXf is a dynamic-size matrix of floats.\n  *\n  * There are also \\c VectorSizeType and \\c RowVectorSizeType which are self-explanatory. For example, \\c Vector4cf is\n  * a fixed-size vector of 4 complex floats.\n  *\n  * \\sa class Matrix\n  */\n\n#define EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, Size, SizeSuffix)   \\\n/** \\ingroup matrixtypedefs */                                    \\\ntypedef Matrix<Type, Size, Size> Matrix##SizeSuffix##TypeSuffix;  \\\n/** \\ingroup matrixtypedefs */                                    \\\ntypedef Matrix<Type, Size, 1>    Vector##SizeSuffix##TypeSuffix;  \\\n/** \\ingroup matrixtypedefs */                                    \\\ntypedef Matrix<Type, 1, Size>    RowVector##SizeSuffix##TypeSuffix;\n\n#define EIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, Size)         \\\n/** \\ingroup matrixtypedefs */                                    \\\ntypedef Matrix<Type, Size, Dynamic> Matrix##Size##X##TypeSuffix;  \\\n/** \\ingroup matrixtypedefs */                                    \\\ntypedef Matrix<Type, Dynamic, Size> Matrix##X##Size##TypeSuffix;\n\n#define EIGEN_MAKE_TYPEDEFS_ALL_SIZES(Type, TypeSuffix) \\\nEIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 2, 2) \\\nEIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 3, 3) \\\nEIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 4, 4) \\\nEIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, Dynamic, X) \\\nEIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 2) \\\nEIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 3) \\\nEIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 4)\n\nEIGEN_MAKE_TYPEDEFS_ALL_SIZES(int,                  i)\nEIGEN_MAKE_TYPEDEFS_ALL_SIZES(float,                f)\nEIGEN_MAKE_TYPEDEFS_ALL_SIZES(double,               d)\nEIGEN_MAKE_TYPEDEFS_ALL_SIZES(std::complex<float>,  cf)\nEIGEN_MAKE_TYPEDEFS_ALL_SIZES(std::complex<double>, cd)\n\n#undef EIGEN_MAKE_TYPEDEFS_ALL_SIZES\n#undef EIGEN_MAKE_TYPEDEFS\n#undef EIGEN_MAKE_FIXED_TYPEDEFS\n\n} // end namespace Eigen\n\n#endif // EIGEN_MATRIX_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/MatrixBase.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2006-2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_MATRIXBASE_H\n#define EIGEN_MATRIXBASE_H\n\nnamespace Eigen {\n\n/** \\class MatrixBase\n  * \\ingroup Core_Module\n  *\n  * \\brief Base class for all dense matrices, vectors, and expressions\n  *\n  * This class is the base that is inherited by all matrix, vector, and related expression\n  * types. Most of the Eigen API is contained in this class, and its base classes. Other important\n  * classes for the Eigen API are Matrix, and VectorwiseOp.\n  *\n  * Note that some methods are defined in other modules such as the \\ref LU_Module LU module\n  * for all functions related to matrix inversions.\n  *\n  * \\tparam Derived is the derived type, e.g. a matrix type, or an expression, etc.\n  *\n  * When writing a function taking Eigen objects as argument, if you want your function\n  * to take as argument any matrix, vector, or expression, just let it take a\n  * MatrixBase argument. As an example, here is a function printFirstRow which, given\n  * a matrix, vector, or expression \\a x, prints the first row of \\a x.\n  *\n  * \\code\n    template<typename Derived>\n    void printFirstRow(const Eigen::MatrixBase<Derived>& x)\n    {\n      cout << x.row(0) << endl;\n    }\n  * \\endcode\n  *\n  * This class can be extended with the help of the plugin mechanism described on the page\n  * \\ref TopicCustomizingEigen by defining the preprocessor symbol \\c EIGEN_MATRIXBASE_PLUGIN.\n  *\n  * \\sa \\ref TopicClassHierarchy\n  */\ntemplate<typename Derived> class MatrixBase\n  : public DenseBase<Derived>\n{\n  public:\n#ifndef EIGEN_PARSED_BY_DOXYGEN\n    typedef MatrixBase StorageBaseType;\n    typedef typename internal::traits<Derived>::StorageKind StorageKind;\n    typedef typename internal::traits<Derived>::Index Index;\n    typedef typename internal::traits<Derived>::Scalar Scalar;\n    typedef typename internal::packet_traits<Scalar>::type PacketScalar;\n    typedef typename NumTraits<Scalar>::Real RealScalar;\n\n    typedef DenseBase<Derived> Base;\n    using Base::RowsAtCompileTime;\n    using Base::ColsAtCompileTime;\n    using Base::SizeAtCompileTime;\n    using Base::MaxRowsAtCompileTime;\n    using Base::MaxColsAtCompileTime;\n    using Base::MaxSizeAtCompileTime;\n    using Base::IsVectorAtCompileTime;\n    using Base::Flags;\n    using Base::CoeffReadCost;\n\n    using Base::derived;\n    using Base::const_cast_derived;\n    using Base::rows;\n    using Base::cols;\n    using Base::size;\n    using Base::coeff;\n    using Base::coeffRef;\n    using Base::lazyAssign;\n    using Base::eval;\n    using Base::operator+=;\n    using Base::operator-=;\n    using Base::operator*=;\n    using Base::operator/=;\n\n    typedef typename Base::CoeffReturnType CoeffReturnType;\n    typedef typename Base::ConstTransposeReturnType ConstTransposeReturnType;\n    typedef typename Base::RowXpr RowXpr;\n    typedef typename Base::ColXpr ColXpr;\n#endif // not EIGEN_PARSED_BY_DOXYGEN\n\n\n\n#ifndef EIGEN_PARSED_BY_DOXYGEN\n    /** type of the equivalent square matrix */\n    typedef Matrix<Scalar,EIGEN_SIZE_MAX(RowsAtCompileTime,ColsAtCompileTime),\n                          EIGEN_SIZE_MAX(RowsAtCompileTime,ColsAtCompileTime)> SquareMatrixType;\n#endif // not EIGEN_PARSED_BY_DOXYGEN\n\n    /** \\returns the size of the main diagonal, which is min(rows(),cols()).\n      * \\sa rows(), cols(), SizeAtCompileTime. */\n    inline Index diagonalSize() const { return (std::min)(rows(),cols()); }\n\n    /** \\brief The plain matrix type corresponding to this expression.\n      *\n      * This is not necessarily exactly the return type of eval(). In the case of plain matrices,\n      * the return type of eval() is a const reference to a matrix, not a matrix! It is however guaranteed\n      * that the return type of eval() is either PlainObject or const PlainObject&.\n      */\n    typedef Matrix<typename internal::traits<Derived>::Scalar,\n                internal::traits<Derived>::RowsAtCompileTime,\n                internal::traits<Derived>::ColsAtCompileTime,\n                AutoAlign | (internal::traits<Derived>::Flags&RowMajorBit ? RowMajor : ColMajor),\n                internal::traits<Derived>::MaxRowsAtCompileTime,\n                internal::traits<Derived>::MaxColsAtCompileTime\n          > PlainObject;\n\n#ifndef EIGEN_PARSED_BY_DOXYGEN\n    /** \\internal Represents a matrix with all coefficients equal to one another*/\n    typedef CwiseNullaryOp<internal::scalar_constant_op<Scalar>,Derived> ConstantReturnType;\n    /** \\internal the return type of MatrixBase::adjoint() */\n    typedef typename internal::conditional<NumTraits<Scalar>::IsComplex,\n                        CwiseUnaryOp<internal::scalar_conjugate_op<Scalar>, ConstTransposeReturnType>,\n                        ConstTransposeReturnType\n                     >::type AdjointReturnType;\n    /** \\internal Return type of eigenvalues() */\n    typedef Matrix<std::complex<RealScalar>, internal::traits<Derived>::ColsAtCompileTime, 1, ColMajor> EigenvaluesReturnType;\n    /** \\internal the return type of identity */\n    typedef CwiseNullaryOp<internal::scalar_identity_op<Scalar>,Derived> IdentityReturnType;\n    /** \\internal the return type of unit vectors */\n    typedef Block<const CwiseNullaryOp<internal::scalar_identity_op<Scalar>, SquareMatrixType>,\n                  internal::traits<Derived>::RowsAtCompileTime,\n                  internal::traits<Derived>::ColsAtCompileTime> BasisReturnType;\n#endif // not EIGEN_PARSED_BY_DOXYGEN\n\n#define EIGEN_CURRENT_STORAGE_BASE_CLASS Eigen::MatrixBase\n#   include \"../plugins/CommonCwiseUnaryOps.h\"\n#   include \"../plugins/CommonCwiseBinaryOps.h\"\n#   include \"../plugins/MatrixCwiseUnaryOps.h\"\n#   include \"../plugins/MatrixCwiseBinaryOps.h\"\n#   ifdef EIGEN_MATRIXBASE_PLUGIN\n#     include EIGEN_MATRIXBASE_PLUGIN\n#   endif\n#undef EIGEN_CURRENT_STORAGE_BASE_CLASS\n\n    /** Special case of the template operator=, in order to prevent the compiler\n      * from generating a default operator= (issue hit with g++ 4.1)\n      */\n    Derived& operator=(const MatrixBase& other);\n\n    // We cannot inherit here via Base::operator= since it is causing\n    // trouble with MSVC.\n\n    template <typename OtherDerived>\n    Derived& operator=(const DenseBase<OtherDerived>& other);\n\n    template <typename OtherDerived>\n    Derived& operator=(const EigenBase<OtherDerived>& other);\n\n    template<typename OtherDerived>\n    Derived& operator=(const ReturnByValue<OtherDerived>& other);\n\n    template<typename ProductDerived, typename Lhs, typename Rhs>\n    Derived& lazyAssign(const ProductBase<ProductDerived, Lhs,Rhs>& other);\n\n    template<typename MatrixPower, typename Lhs, typename Rhs>\n    Derived& lazyAssign(const MatrixPowerProduct<MatrixPower, Lhs,Rhs>& other);\n\n    template<typename OtherDerived>\n    Derived& operator+=(const MatrixBase<OtherDerived>& other);\n    template<typename OtherDerived>\n    Derived& operator-=(const MatrixBase<OtherDerived>& other);\n\n    template<typename OtherDerived>\n    const typename ProductReturnType<Derived,OtherDerived>::Type\n    operator*(const MatrixBase<OtherDerived> &other) const;\n\n    template<typename OtherDerived>\n    const typename LazyProductReturnType<Derived,OtherDerived>::Type\n    lazyProduct(const MatrixBase<OtherDerived> &other) const;\n\n    template<typename OtherDerived>\n    Derived& operator*=(const EigenBase<OtherDerived>& other);\n\n    template<typename OtherDerived>\n    void applyOnTheLeft(const EigenBase<OtherDerived>& other);\n\n    template<typename OtherDerived>\n    void applyOnTheRight(const EigenBase<OtherDerived>& other);\n\n    template<typename DiagonalDerived>\n    const DiagonalProduct<Derived, DiagonalDerived, OnTheRight>\n    operator*(const DiagonalBase<DiagonalDerived> &diagonal) const;\n\n    template<typename OtherDerived>\n    typename internal::scalar_product_traits<typename internal::traits<Derived>::Scalar,typename internal::traits<OtherDerived>::Scalar>::ReturnType\n    dot(const MatrixBase<OtherDerived>& other) const;\n\n    #ifdef EIGEN2_SUPPORT\n      template<typename OtherDerived>\n      Scalar eigen2_dot(const MatrixBase<OtherDerived>& other) const;\n    #endif\n\n    RealScalar squaredNorm() const;\n    RealScalar norm() const;\n    RealScalar stableNorm() const;\n    RealScalar blueNorm() const;\n    RealScalar hypotNorm() const;\n    const PlainObject normalized() const;\n    void normalize();\n\n    const AdjointReturnType adjoint() const;\n    void adjointInPlace();\n\n    typedef Diagonal<Derived> DiagonalReturnType;\n    DiagonalReturnType diagonal();\n    typedef typename internal::add_const<Diagonal<const Derived> >::type ConstDiagonalReturnType;\n    ConstDiagonalReturnType diagonal() const;\n\n    template<int Index> struct DiagonalIndexReturnType { typedef Diagonal<Derived,Index> Type; };\n    template<int Index> struct ConstDiagonalIndexReturnType { typedef const Diagonal<const Derived,Index> Type; };\n\n    template<int Index> typename DiagonalIndexReturnType<Index>::Type diagonal();\n    template<int Index> typename ConstDiagonalIndexReturnType<Index>::Type diagonal() const;\n    \n    typedef Diagonal<Derived,DynamicIndex> DiagonalDynamicIndexReturnType;\n    typedef typename internal::add_const<Diagonal<const Derived,DynamicIndex> >::type ConstDiagonalDynamicIndexReturnType;\n\n    DiagonalDynamicIndexReturnType diagonal(Index index);\n    ConstDiagonalDynamicIndexReturnType diagonal(Index index) const;\n\n    #ifdef EIGEN2_SUPPORT\n    template<unsigned int Mode> typename internal::eigen2_part_return_type<Derived, Mode>::type part();\n    template<unsigned int Mode> const typename internal::eigen2_part_return_type<Derived, Mode>::type part() const;\n    \n    // huuuge hack. make Eigen2's matrix.part<Diagonal>() work in eigen3. Problem: Diagonal is now a class template instead\n    // of an integer constant. Solution: overload the part() method template wrt template parameters list.\n    template<template<typename T, int N> class U>\n    const DiagonalWrapper<ConstDiagonalReturnType> part() const\n    { return diagonal().asDiagonal(); }\n    #endif // EIGEN2_SUPPORT\n\n    template<unsigned int Mode> struct TriangularViewReturnType { typedef TriangularView<Derived, Mode> Type; };\n    template<unsigned int Mode> struct ConstTriangularViewReturnType { typedef const TriangularView<const Derived, Mode> Type; };\n\n    template<unsigned int Mode> typename TriangularViewReturnType<Mode>::Type triangularView();\n    template<unsigned int Mode> typename ConstTriangularViewReturnType<Mode>::Type triangularView() const;\n\n    template<unsigned int UpLo> struct SelfAdjointViewReturnType { typedef SelfAdjointView<Derived, UpLo> Type; };\n    template<unsigned int UpLo> struct ConstSelfAdjointViewReturnType { typedef const SelfAdjointView<const Derived, UpLo> Type; };\n\n    template<unsigned int UpLo> typename SelfAdjointViewReturnType<UpLo>::Type selfadjointView();\n    template<unsigned int UpLo> typename ConstSelfAdjointViewReturnType<UpLo>::Type selfadjointView() const;\n\n    const SparseView<Derived> sparseView(const Scalar& m_reference = Scalar(0),\n                                         const typename NumTraits<Scalar>::Real& m_epsilon = NumTraits<Scalar>::dummy_precision()) const;\n    static const IdentityReturnType Identity();\n    static const IdentityReturnType Identity(Index rows, Index cols);\n    static const BasisReturnType Unit(Index size, Index i);\n    static const BasisReturnType Unit(Index i);\n    static const BasisReturnType UnitX();\n    static const BasisReturnType UnitY();\n    static const BasisReturnType UnitZ();\n    static const BasisReturnType UnitW();\n\n    const DiagonalWrapper<const Derived> asDiagonal() const;\n    const PermutationWrapper<const Derived> asPermutation() const;\n\n    Derived& setIdentity();\n    Derived& setIdentity(Index rows, Index cols);\n\n    bool isIdentity(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;\n    bool isDiagonal(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;\n\n    bool isUpperTriangular(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;\n    bool isLowerTriangular(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;\n\n    template<typename OtherDerived>\n    bool isOrthogonal(const MatrixBase<OtherDerived>& other,\n                      const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;\n    bool isUnitary(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;\n\n    /** \\returns true if each coefficients of \\c *this and \\a other are all exactly equal.\n      * \\warning When using floating point scalar values you probably should rather use a\n      *          fuzzy comparison such as isApprox()\n      * \\sa isApprox(), operator!= */\n    template<typename OtherDerived>\n    inline bool operator==(const MatrixBase<OtherDerived>& other) const\n    { return cwiseEqual(other).all(); }\n\n    /** \\returns true if at least one pair of coefficients of \\c *this and \\a other are not exactly equal to each other.\n      * \\warning When using floating point scalar values you probably should rather use a\n      *          fuzzy comparison such as isApprox()\n      * \\sa isApprox(), operator== */\n    template<typename OtherDerived>\n    inline bool operator!=(const MatrixBase<OtherDerived>& other) const\n    { return cwiseNotEqual(other).any(); }\n\n    NoAlias<Derived,Eigen::MatrixBase > noalias();\n\n    inline const ForceAlignedAccess<Derived> forceAlignedAccess() const;\n    inline ForceAlignedAccess<Derived> forceAlignedAccess();\n    template<bool Enable> inline typename internal::add_const_on_value_type<typename internal::conditional<Enable,ForceAlignedAccess<Derived>,Derived&>::type>::type forceAlignedAccessIf() const;\n    template<bool Enable> inline typename internal::conditional<Enable,ForceAlignedAccess<Derived>,Derived&>::type forceAlignedAccessIf();\n\n    Scalar trace() const;\n\n/////////// Array module ///////////\n\n    template<int p> RealScalar lpNorm() const;\n\n    MatrixBase<Derived>& matrix() { return *this; }\n    const MatrixBase<Derived>& matrix() const { return *this; }\n\n    /** \\returns an \\link Eigen::ArrayBase Array \\endlink expression of this matrix\n      * \\sa ArrayBase::matrix() */\n    ArrayWrapper<Derived> array() { return derived(); }\n    const ArrayWrapper<const Derived> array() const { return derived(); }\n\n/////////// LU module ///////////\n\n    const FullPivLU<PlainObject> fullPivLu() const;\n    const PartialPivLU<PlainObject> partialPivLu() const;\n\n    #if EIGEN2_SUPPORT_STAGE < STAGE20_RESOLVE_API_CONFLICTS\n    const LU<PlainObject> lu() const;\n    #endif\n\n    #ifdef EIGEN2_SUPPORT\n    const LU<PlainObject> eigen2_lu() const;\n    #endif\n\n    #if EIGEN2_SUPPORT_STAGE > STAGE20_RESOLVE_API_CONFLICTS\n    const PartialPivLU<PlainObject> lu() const;\n    #endif\n    \n    #ifdef EIGEN2_SUPPORT\n    template<typename ResultType>\n    void computeInverse(MatrixBase<ResultType> *result) const {\n      *result = this->inverse();\n    }\n    #endif\n\n    const internal::inverse_impl<Derived> inverse() const;\n    template<typename ResultType>\n    void computeInverseAndDetWithCheck(\n      ResultType& inverse,\n      typename ResultType::Scalar& determinant,\n      bool& invertible,\n      const RealScalar& absDeterminantThreshold = NumTraits<Scalar>::dummy_precision()\n    ) const;\n    template<typename ResultType>\n    void computeInverseWithCheck(\n      ResultType& inverse,\n      bool& invertible,\n      const RealScalar& absDeterminantThreshold = NumTraits<Scalar>::dummy_precision()\n    ) const;\n    Scalar determinant() const;\n\n/////////// Cholesky module ///////////\n\n    const LLT<PlainObject>  llt() const;\n    const LDLT<PlainObject> ldlt() const;\n\n/////////// QR module ///////////\n\n    const HouseholderQR<PlainObject> householderQr() const;\n    const ColPivHouseholderQR<PlainObject> colPivHouseholderQr() const;\n    const FullPivHouseholderQR<PlainObject> fullPivHouseholderQr() const;\n    \n    #ifdef EIGEN2_SUPPORT\n    const QR<PlainObject> qr() const;\n    #endif\n\n    EigenvaluesReturnType eigenvalues() const;\n    RealScalar operatorNorm() const;\n\n/////////// SVD module ///////////\n\n    JacobiSVD<PlainObject> jacobiSvd(unsigned int computationOptions = 0) const;\n\n    #ifdef EIGEN2_SUPPORT\n    SVD<PlainObject> svd() const;\n    #endif\n\n/////////// Geometry module ///////////\n\n    #ifndef EIGEN_PARSED_BY_DOXYGEN\n    /// \\internal helper struct to form the return type of the cross product\n    template<typename OtherDerived> struct cross_product_return_type {\n      typedef typename internal::scalar_product_traits<typename internal::traits<Derived>::Scalar,typename internal::traits<OtherDerived>::Scalar>::ReturnType Scalar;\n      typedef Matrix<Scalar,MatrixBase::RowsAtCompileTime,MatrixBase::ColsAtCompileTime> type;\n    };\n    #endif // EIGEN_PARSED_BY_DOXYGEN\n    template<typename OtherDerived>\n    typename cross_product_return_type<OtherDerived>::type\n    cross(const MatrixBase<OtherDerived>& other) const;\n    template<typename OtherDerived>\n    PlainObject cross3(const MatrixBase<OtherDerived>& other) const;\n    PlainObject unitOrthogonal(void) const;\n    Matrix<Scalar,3,1> eulerAngles(Index a0, Index a1, Index a2) const;\n    \n    #if EIGEN2_SUPPORT_STAGE > STAGE20_RESOLVE_API_CONFLICTS\n    ScalarMultipleReturnType operator*(const UniformScaling<Scalar>& s) const;\n    // put this as separate enum value to work around possible GCC 4.3 bug (?)\n    enum { HomogeneousReturnTypeDirection = ColsAtCompileTime==1?Vertical:Horizontal };\n    typedef Homogeneous<Derived, HomogeneousReturnTypeDirection> HomogeneousReturnType;\n    HomogeneousReturnType homogeneous() const;\n    #endif\n    \n    enum {\n      SizeMinusOne = SizeAtCompileTime==Dynamic ? Dynamic : SizeAtCompileTime-1\n    };\n    typedef Block<const Derived,\n                  internal::traits<Derived>::ColsAtCompileTime==1 ? SizeMinusOne : 1,\n                  internal::traits<Derived>::ColsAtCompileTime==1 ? 1 : SizeMinusOne> ConstStartMinusOne;\n    typedef CwiseUnaryOp<internal::scalar_quotient1_op<typename internal::traits<Derived>::Scalar>,\n                const ConstStartMinusOne > HNormalizedReturnType;\n\n    const HNormalizedReturnType hnormalized() const;\n\n////////// Householder module ///////////\n\n    void makeHouseholderInPlace(Scalar& tau, RealScalar& beta);\n    template<typename EssentialPart>\n    void makeHouseholder(EssentialPart& essential,\n                         Scalar& tau, RealScalar& beta) const;\n    template<typename EssentialPart>\n    void applyHouseholderOnTheLeft(const EssentialPart& essential,\n                                   const Scalar& tau,\n                                   Scalar* workspace);\n    template<typename EssentialPart>\n    void applyHouseholderOnTheRight(const EssentialPart& essential,\n                                    const Scalar& tau,\n                                    Scalar* workspace);\n\n///////// Jacobi module /////////\n\n    template<typename OtherScalar>\n    void applyOnTheLeft(Index p, Index q, const JacobiRotation<OtherScalar>& j);\n    template<typename OtherScalar>\n    void applyOnTheRight(Index p, Index q, const JacobiRotation<OtherScalar>& j);\n\n///////// SparseCore module /////////\n\n    template<typename OtherDerived>\n    EIGEN_STRONG_INLINE const typename SparseMatrixBase<OtherDerived>::template CwiseProductDenseReturnType<Derived>::Type\n    cwiseProduct(const SparseMatrixBase<OtherDerived> &other) const\n    {\n      return other.cwiseProduct(derived());\n    }\n\n///////// MatrixFunctions module /////////\n\n    typedef typename internal::stem_function<Scalar>::type StemFunction;\n    const MatrixExponentialReturnValue<Derived> exp() const;\n    const MatrixFunctionReturnValue<Derived> matrixFunction(StemFunction f) const;\n    const MatrixFunctionReturnValue<Derived> cosh() const;\n    const MatrixFunctionReturnValue<Derived> sinh() const;\n    const MatrixFunctionReturnValue<Derived> cos() const;\n    const MatrixFunctionReturnValue<Derived> sin() const;\n    const MatrixSquareRootReturnValue<Derived> sqrt() const;\n    const MatrixLogarithmReturnValue<Derived> log() const;\n    const MatrixPowerReturnValue<Derived> pow(const RealScalar& p) const;\n\n#ifdef EIGEN2_SUPPORT\n    template<typename ProductDerived, typename Lhs, typename Rhs>\n    Derived& operator+=(const Flagged<ProductBase<ProductDerived, Lhs,Rhs>, 0,\n                                      EvalBeforeAssigningBit>& other);\n\n    template<typename ProductDerived, typename Lhs, typename Rhs>\n    Derived& operator-=(const Flagged<ProductBase<ProductDerived, Lhs,Rhs>, 0,\n                                      EvalBeforeAssigningBit>& other);\n\n    /** \\deprecated because .lazy() is deprecated\n      * Overloaded for cache friendly product evaluation */\n    template<typename OtherDerived>\n    Derived& lazyAssign(const Flagged<OtherDerived, 0, EvalBeforeAssigningBit>& other)\n    { return lazyAssign(other._expression()); }\n\n    template<unsigned int Added>\n    const Flagged<Derived, Added, 0> marked() const;\n    const Flagged<Derived, 0, EvalBeforeAssigningBit> lazy() const;\n\n    inline const Cwise<Derived> cwise() const;\n    inline Cwise<Derived> cwise();\n\n    VectorBlock<Derived> start(Index size);\n    const VectorBlock<const Derived> start(Index size) const;\n    VectorBlock<Derived> end(Index size);\n    const VectorBlock<const Derived> end(Index size) const;\n    template<int Size> VectorBlock<Derived,Size> start();\n    template<int Size> const VectorBlock<const Derived,Size> start() const;\n    template<int Size> VectorBlock<Derived,Size> end();\n    template<int Size> const VectorBlock<const Derived,Size> end() const;\n\n    Minor<Derived> minor(Index row, Index col);\n    const Minor<Derived> minor(Index row, Index col) const;\n#endif\n\n  protected:\n    MatrixBase() : Base() {}\n\n  private:\n    explicit MatrixBase(int);\n    MatrixBase(int,int);\n    template<typename OtherDerived> explicit MatrixBase(const MatrixBase<OtherDerived>&);\n  protected:\n    // mixing arrays and matrices is not legal\n    template<typename OtherDerived> Derived& operator+=(const ArrayBase<OtherDerived>& )\n    {EIGEN_STATIC_ASSERT(std::ptrdiff_t(sizeof(typename OtherDerived::Scalar))==-1,YOU_CANNOT_MIX_ARRAYS_AND_MATRICES); return *this;}\n    // mixing arrays and matrices is not legal\n    template<typename OtherDerived> Derived& operator-=(const ArrayBase<OtherDerived>& )\n    {EIGEN_STATIC_ASSERT(std::ptrdiff_t(sizeof(typename OtherDerived::Scalar))==-1,YOU_CANNOT_MIX_ARRAYS_AND_MATRICES); return *this;}\n};\n\n\n/***************************************************************************\n* Implementation of matrix base methods\n***************************************************************************/\n\n/** replaces \\c *this by \\c *this * \\a other.\n  *\n  * \\returns a reference to \\c *this\n  *\n  * Example: \\include MatrixBase_applyOnTheRight.cpp\n  * Output: \\verbinclude MatrixBase_applyOnTheRight.out\n  */\ntemplate<typename Derived>\ntemplate<typename OtherDerived>\ninline Derived&\nMatrixBase<Derived>::operator*=(const EigenBase<OtherDerived> &other)\n{\n  other.derived().applyThisOnTheRight(derived());\n  return derived();\n}\n\n/** replaces \\c *this by \\c *this * \\a other. It is equivalent to MatrixBase::operator*=().\n  *\n  * Example: \\include MatrixBase_applyOnTheRight.cpp\n  * Output: \\verbinclude MatrixBase_applyOnTheRight.out\n  */\ntemplate<typename Derived>\ntemplate<typename OtherDerived>\ninline void MatrixBase<Derived>::applyOnTheRight(const EigenBase<OtherDerived> &other)\n{\n  other.derived().applyThisOnTheRight(derived());\n}\n\n/** replaces \\c *this by \\a other * \\c *this.\n  *\n  * Example: \\include MatrixBase_applyOnTheLeft.cpp\n  * Output: \\verbinclude MatrixBase_applyOnTheLeft.out\n  */\ntemplate<typename Derived>\ntemplate<typename OtherDerived>\ninline void MatrixBase<Derived>::applyOnTheLeft(const EigenBase<OtherDerived> &other)\n{\n  other.derived().applyThisOnTheLeft(derived());\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_MATRIXBASE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/NestByValue.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_NESTBYVALUE_H\n#define EIGEN_NESTBYVALUE_H\n\nnamespace Eigen {\n\n/** \\class NestByValue\n  * \\ingroup Core_Module\n  *\n  * \\brief Expression which must be nested by value\n  *\n  * \\param ExpressionType the type of the object of which we are requiring nesting-by-value\n  *\n  * This class is the return type of MatrixBase::nestByValue()\n  * and most of the time this is the only way it is used.\n  *\n  * \\sa MatrixBase::nestByValue()\n  */\n\nnamespace internal {\ntemplate<typename ExpressionType>\nstruct traits<NestByValue<ExpressionType> > : public traits<ExpressionType>\n{};\n}\n\ntemplate<typename ExpressionType> class NestByValue\n  : public internal::dense_xpr_base< NestByValue<ExpressionType> >::type\n{\n  public:\n\n    typedef typename internal::dense_xpr_base<NestByValue>::type Base;\n    EIGEN_DENSE_PUBLIC_INTERFACE(NestByValue)\n\n    inline NestByValue(const ExpressionType& matrix) : m_expression(matrix) {}\n\n    inline Index rows() const { return m_expression.rows(); }\n    inline Index cols() const { return m_expression.cols(); }\n    inline Index outerStride() const { return m_expression.outerStride(); }\n    inline Index innerStride() const { return m_expression.innerStride(); }\n\n    inline const CoeffReturnType coeff(Index row, Index col) const\n    {\n      return m_expression.coeff(row, col);\n    }\n\n    inline Scalar& coeffRef(Index row, Index col)\n    {\n      return m_expression.const_cast_derived().coeffRef(row, col);\n    }\n\n    inline const CoeffReturnType coeff(Index index) const\n    {\n      return m_expression.coeff(index);\n    }\n\n    inline Scalar& coeffRef(Index index)\n    {\n      return m_expression.const_cast_derived().coeffRef(index);\n    }\n\n    template<int LoadMode>\n    inline const PacketScalar packet(Index row, Index col) const\n    {\n      return m_expression.template packet<LoadMode>(row, col);\n    }\n\n    template<int LoadMode>\n    inline void writePacket(Index row, Index col, const PacketScalar& x)\n    {\n      m_expression.const_cast_derived().template writePacket<LoadMode>(row, col, x);\n    }\n\n    template<int LoadMode>\n    inline const PacketScalar packet(Index index) const\n    {\n      return m_expression.template packet<LoadMode>(index);\n    }\n\n    template<int LoadMode>\n    inline void writePacket(Index index, const PacketScalar& x)\n    {\n      m_expression.const_cast_derived().template writePacket<LoadMode>(index, x);\n    }\n\n    operator const ExpressionType&() const { return m_expression; }\n\n  protected:\n    const ExpressionType m_expression;\n};\n\n/** \\returns an expression of the temporary version of *this.\n  */\ntemplate<typename Derived>\ninline const NestByValue<Derived>\nDenseBase<Derived>::nestByValue() const\n{\n  return NestByValue<Derived>(derived());\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_NESTBYVALUE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/NoAlias.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_NOALIAS_H\n#define EIGEN_NOALIAS_H\n\nnamespace Eigen {\n\n/** \\class NoAlias\n  * \\ingroup Core_Module\n  *\n  * \\brief Pseudo expression providing an operator = assuming no aliasing\n  *\n  * \\param ExpressionType the type of the object on which to do the lazy assignment\n  *\n  * This class represents an expression with special assignment operators\n  * assuming no aliasing between the target expression and the source expression.\n  * More precisely it alloas to bypass the EvalBeforeAssignBit flag of the source expression.\n  * It is the return type of MatrixBase::noalias()\n  * and most of the time this is the only way it is used.\n  *\n  * \\sa MatrixBase::noalias()\n  */\ntemplate<typename ExpressionType, template <typename> class StorageBase>\nclass NoAlias\n{\n    typedef typename ExpressionType::Scalar Scalar;\n  public:\n    NoAlias(ExpressionType& expression) : m_expression(expression) {}\n\n    /** Behaves like MatrixBase::lazyAssign(other)\n      * \\sa MatrixBase::lazyAssign() */\n    template<typename OtherDerived>\n    EIGEN_STRONG_INLINE ExpressionType& operator=(const StorageBase<OtherDerived>& other)\n    { return internal::assign_selector<ExpressionType,OtherDerived,false>::run(m_expression,other.derived()); }\n\n    /** \\sa MatrixBase::operator+= */\n    template<typename OtherDerived>\n    EIGEN_STRONG_INLINE ExpressionType& operator+=(const StorageBase<OtherDerived>& other)\n    {\n      typedef SelfCwiseBinaryOp<internal::scalar_sum_op<Scalar>, ExpressionType, OtherDerived> SelfAdder;\n      SelfAdder tmp(m_expression);\n      typedef typename internal::nested<OtherDerived>::type OtherDerivedNested;\n      typedef typename internal::remove_all<OtherDerivedNested>::type _OtherDerivedNested;\n      internal::assign_selector<SelfAdder,_OtherDerivedNested,false>::run(tmp,OtherDerivedNested(other.derived()));\n      return m_expression;\n    }\n\n    /** \\sa MatrixBase::operator-= */\n    template<typename OtherDerived>\n    EIGEN_STRONG_INLINE ExpressionType& operator-=(const StorageBase<OtherDerived>& other)\n    {\n      typedef SelfCwiseBinaryOp<internal::scalar_difference_op<Scalar>, ExpressionType, OtherDerived> SelfAdder;\n      SelfAdder tmp(m_expression);\n      typedef typename internal::nested<OtherDerived>::type OtherDerivedNested;\n      typedef typename internal::remove_all<OtherDerivedNested>::type _OtherDerivedNested;\n      internal::assign_selector<SelfAdder,_OtherDerivedNested,false>::run(tmp,OtherDerivedNested(other.derived()));\n      return m_expression;\n    }\n\n#ifndef EIGEN_PARSED_BY_DOXYGEN\n    template<typename ProductDerived, typename Lhs, typename Rhs>\n    EIGEN_STRONG_INLINE ExpressionType& operator+=(const ProductBase<ProductDerived, Lhs,Rhs>& other)\n    { other.derived().addTo(m_expression); return m_expression; }\n\n    template<typename ProductDerived, typename Lhs, typename Rhs>\n    EIGEN_STRONG_INLINE ExpressionType& operator-=(const ProductBase<ProductDerived, Lhs,Rhs>& other)\n    { other.derived().subTo(m_expression); return m_expression; }\n\n    template<typename Lhs, typename Rhs, int NestingFlags>\n    EIGEN_STRONG_INLINE ExpressionType& operator+=(const CoeffBasedProduct<Lhs,Rhs,NestingFlags>& other)\n    { return m_expression.derived() += CoeffBasedProduct<Lhs,Rhs,NestByRefBit>(other.lhs(), other.rhs()); }\n\n    template<typename Lhs, typename Rhs, int NestingFlags>\n    EIGEN_STRONG_INLINE ExpressionType& operator-=(const CoeffBasedProduct<Lhs,Rhs,NestingFlags>& other)\n    { return m_expression.derived() -= CoeffBasedProduct<Lhs,Rhs,NestByRefBit>(other.lhs(), other.rhs()); }\n    \n    template<typename OtherDerived>\n    ExpressionType& operator=(const ReturnByValue<OtherDerived>& func)\n    { return m_expression = func; }\n#endif\n\n    ExpressionType& expression() const\n    {\n      return m_expression;\n    }\n\n  protected:\n    ExpressionType& m_expression;\n};\n\n/** \\returns a pseudo expression of \\c *this with an operator= assuming\n  * no aliasing between \\c *this and the source expression.\n  *\n  * More precisely, noalias() allows to bypass the EvalBeforeAssignBit flag.\n  * Currently, even though several expressions may alias, only product\n  * expressions have this flag. Therefore, noalias() is only usefull when\n  * the source expression contains a matrix product.\n  *\n  * Here are some examples where noalias is usefull:\n  * \\code\n  * D.noalias()  = A * B;\n  * D.noalias() += A.transpose() * B;\n  * D.noalias() -= 2 * A * B.adjoint();\n  * \\endcode\n  *\n  * On the other hand the following example will lead to a \\b wrong result:\n  * \\code\n  * A.noalias() = A * B;\n  * \\endcode\n  * because the result matrix A is also an operand of the matrix product. Therefore,\n  * there is no alternative than evaluating A * B in a temporary, that is the default\n  * behavior when you write:\n  * \\code\n  * A = A * B;\n  * \\endcode\n  *\n  * \\sa class NoAlias\n  */\ntemplate<typename Derived>\nNoAlias<Derived,MatrixBase> MatrixBase<Derived>::noalias()\n{\n  return derived();\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_NOALIAS_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/NumTraits.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2006-2010 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_NUMTRAITS_H\n#define EIGEN_NUMTRAITS_H\n\nnamespace Eigen {\n\n/** \\class NumTraits\n  * \\ingroup Core_Module\n  *\n  * \\brief Holds information about the various numeric (i.e. scalar) types allowed by Eigen.\n  *\n  * \\param T the numeric type at hand\n  *\n  * This class stores enums, typedefs and static methods giving information about a numeric type.\n  *\n  * The provided data consists of:\n  * \\li A typedef \\a Real, giving the \"real part\" type of \\a T. If \\a T is already real,\n  *     then \\a Real is just a typedef to \\a T. If \\a T is \\c std::complex<U> then \\a Real\n  *     is a typedef to \\a U.\n  * \\li A typedef \\a NonInteger, giving the type that should be used for operations producing non-integral values,\n  *     such as quotients, square roots, etc. If \\a T is a floating-point type, then this typedef just gives\n  *     \\a T again. Note however that many Eigen functions such as internal::sqrt simply refuse to\n  *     take integers. Outside of a few cases, Eigen doesn't do automatic type promotion. Thus, this typedef is\n  *     only intended as a helper for code that needs to explicitly promote types.\n  * \\li A typedef \\a Nested giving the type to use to nest a value inside of the expression tree. If you don't know what\n  *     this means, just use \\a T here.\n  * \\li An enum value \\a IsComplex. It is equal to 1 if \\a T is a \\c std::complex\n  *     type, and to 0 otherwise.\n  * \\li An enum value \\a IsInteger. It is equal to \\c 1 if \\a T is an integer type such as \\c int,\n  *     and to \\c 0 otherwise.\n  * \\li Enum values ReadCost, AddCost and MulCost representing a rough estimate of the number of CPU cycles needed\n  *     to by move / add / mul instructions respectively, assuming the data is already stored in CPU registers.\n  *     Stay vague here. No need to do architecture-specific stuff.\n  * \\li An enum value \\a IsSigned. It is equal to \\c 1 if \\a T is a signed type and to 0 if \\a T is unsigned.\n  * \\li An enum value \\a RequireInitialization. It is equal to \\c 1 if the constructor of the numeric type \\a T must\n  *     be called, and to 0 if it is safe not to call it. Default is 0 if \\a T is an arithmetic type, and 1 otherwise.\n  * \\li An epsilon() function which, unlike std::numeric_limits::epsilon(), returns a \\a Real instead of a \\a T.\n  * \\li A dummy_precision() function returning a weak epsilon value. It is mainly used as a default\n  *     value by the fuzzy comparison operators.\n  * \\li highest() and lowest() functions returning the highest and lowest possible values respectively.\n  */\n\ntemplate<typename T> struct GenericNumTraits\n{\n  enum {\n    IsInteger = std::numeric_limits<T>::is_integer,\n    IsSigned = std::numeric_limits<T>::is_signed,\n    IsComplex = 0,\n    RequireInitialization = internal::is_arithmetic<T>::value ? 0 : 1,\n    ReadCost = 1,\n    AddCost = 1,\n    MulCost = 1\n  };\n\n  typedef T Real;\n  typedef typename internal::conditional<\n                     IsInteger,\n                     typename internal::conditional<sizeof(T)<=2, float, double>::type,\n                     T\n                   >::type NonInteger;\n  typedef T Nested;\n\n  static inline Real epsilon() { return std::numeric_limits<T>::epsilon(); }\n  static inline Real dummy_precision()\n  {\n    // make sure to override this for floating-point types\n    return Real(0);\n  }\n  static inline T highest() { return (std::numeric_limits<T>::max)(); }\n  static inline T lowest()  { return IsInteger ? (std::numeric_limits<T>::min)() : (-(std::numeric_limits<T>::max)()); }\n  \n#ifdef EIGEN2_SUPPORT\n  enum {\n    HasFloatingPoint = !IsInteger\n  };\n  typedef NonInteger FloatingPoint;\n#endif\n};\n\ntemplate<typename T> struct NumTraits : GenericNumTraits<T>\n{};\n\ntemplate<> struct NumTraits<float>\n  : GenericNumTraits<float>\n{\n  static inline float dummy_precision() { return 1e-5f; }\n};\n\ntemplate<> struct NumTraits<double> : GenericNumTraits<double>\n{\n  static inline double dummy_precision() { return 1e-12; }\n};\n\ntemplate<> struct NumTraits<long double>\n  : GenericNumTraits<long double>\n{\n  static inline long double dummy_precision() { return 1e-15l; }\n};\n\ntemplate<typename _Real> struct NumTraits<std::complex<_Real> >\n  : GenericNumTraits<std::complex<_Real> >\n{\n  typedef _Real Real;\n  enum {\n    IsComplex = 1,\n    RequireInitialization = NumTraits<_Real>::RequireInitialization,\n    ReadCost = 2 * NumTraits<_Real>::ReadCost,\n    AddCost = 2 * NumTraits<Real>::AddCost,\n    MulCost = 4 * NumTraits<Real>::MulCost + 2 * NumTraits<Real>::AddCost\n  };\n\n  static inline Real epsilon() { return NumTraits<Real>::epsilon(); }\n  static inline Real dummy_precision() { return NumTraits<Real>::dummy_precision(); }\n};\n\ntemplate<typename Scalar, int Rows, int Cols, int Options, int MaxRows, int MaxCols>\nstruct NumTraits<Array<Scalar, Rows, Cols, Options, MaxRows, MaxCols> >\n{\n  typedef Array<Scalar, Rows, Cols, Options, MaxRows, MaxCols> ArrayType;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  typedef Array<RealScalar, Rows, Cols, Options, MaxRows, MaxCols> Real;\n  typedef typename NumTraits<Scalar>::NonInteger NonIntegerScalar;\n  typedef Array<NonIntegerScalar, Rows, Cols, Options, MaxRows, MaxCols> NonInteger;\n  typedef ArrayType & Nested;\n  \n  enum {\n    IsComplex = NumTraits<Scalar>::IsComplex,\n    IsInteger = NumTraits<Scalar>::IsInteger,\n    IsSigned  = NumTraits<Scalar>::IsSigned,\n    RequireInitialization = 1,\n    ReadCost = ArrayType::SizeAtCompileTime==Dynamic ? Dynamic : ArrayType::SizeAtCompileTime * NumTraits<Scalar>::ReadCost,\n    AddCost  = ArrayType::SizeAtCompileTime==Dynamic ? Dynamic : ArrayType::SizeAtCompileTime * NumTraits<Scalar>::AddCost,\n    MulCost  = ArrayType::SizeAtCompileTime==Dynamic ? Dynamic : ArrayType::SizeAtCompileTime * NumTraits<Scalar>::MulCost\n  };\n  \n  static inline RealScalar epsilon() { return NumTraits<RealScalar>::epsilon(); }\n  static inline RealScalar dummy_precision() { return NumTraits<RealScalar>::dummy_precision(); }\n};\n\n} // end namespace Eigen\n\n#endif // EIGEN_NUMTRAITS_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/PermutationMatrix.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n// Copyright (C) 2009-2011 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_PERMUTATIONMATRIX_H\n#define EIGEN_PERMUTATIONMATRIX_H\n\nnamespace Eigen { \n\ntemplate<int RowCol,typename IndicesType,typename MatrixType, typename StorageKind> class PermutedImpl;\n\n/** \\class PermutationBase\n  * \\ingroup Core_Module\n  *\n  * \\brief Base class for permutations\n  *\n  * \\param Derived the derived class\n  *\n  * This class is the base class for all expressions representing a permutation matrix,\n  * internally stored as a vector of integers.\n  * The convention followed here is that if \\f$ \\sigma \\f$ is a permutation, the corresponding permutation matrix\n  * \\f$ P_\\sigma \\f$ is such that if \\f$ (e_1,\\ldots,e_p) \\f$ is the canonical basis, we have:\n  *  \\f[ P_\\sigma(e_i) = e_{\\sigma(i)}. \\f]\n  * This convention ensures that for any two permutations \\f$ \\sigma, \\tau \\f$, we have:\n  *  \\f[ P_{\\sigma\\circ\\tau} = P_\\sigma P_\\tau. \\f]\n  *\n  * Permutation matrices are square and invertible.\n  *\n  * Notice that in addition to the member functions and operators listed here, there also are non-member\n  * operator* to multiply any kind of permutation object with any kind of matrix expression (MatrixBase)\n  * on either side.\n  *\n  * \\sa class PermutationMatrix, class PermutationWrapper\n  */\n\nnamespace internal {\n\ntemplate<typename PermutationType, typename MatrixType, int Side, bool Transposed=false>\nstruct permut_matrix_product_retval;\ntemplate<typename PermutationType, typename MatrixType, int Side, bool Transposed=false>\nstruct permut_sparsematrix_product_retval;\nenum PermPermProduct_t {PermPermProduct};\n\n} // end namespace internal\n\ntemplate<typename Derived>\nclass PermutationBase : public EigenBase<Derived>\n{\n    typedef internal::traits<Derived> Traits;\n    typedef EigenBase<Derived> Base;\n  public:\n\n    #ifndef EIGEN_PARSED_BY_DOXYGEN\n    typedef typename Traits::IndicesType IndicesType;\n    enum {\n      Flags = Traits::Flags,\n      CoeffReadCost = Traits::CoeffReadCost,\n      RowsAtCompileTime = Traits::RowsAtCompileTime,\n      ColsAtCompileTime = Traits::ColsAtCompileTime,\n      MaxRowsAtCompileTime = Traits::MaxRowsAtCompileTime,\n      MaxColsAtCompileTime = Traits::MaxColsAtCompileTime\n    };\n    typedef typename Traits::Scalar Scalar;\n    typedef typename Traits::Index Index;\n    typedef Matrix<Scalar,RowsAtCompileTime,ColsAtCompileTime,0,MaxRowsAtCompileTime,MaxColsAtCompileTime>\n            DenseMatrixType;\n    typedef PermutationMatrix<IndicesType::SizeAtCompileTime,IndicesType::MaxSizeAtCompileTime,Index>\n            PlainPermutationType;\n    using Base::derived;\n    #endif\n\n    /** Copies the other permutation into *this */\n    template<typename OtherDerived>\n    Derived& operator=(const PermutationBase<OtherDerived>& other)\n    {\n      indices() = other.indices();\n      return derived();\n    }\n\n    /** Assignment from the Transpositions \\a tr */\n    template<typename OtherDerived>\n    Derived& operator=(const TranspositionsBase<OtherDerived>& tr)\n    {\n      setIdentity(tr.size());\n      for(Index k=size()-1; k>=0; --k)\n        applyTranspositionOnTheRight(k,tr.coeff(k));\n      return derived();\n    }\n\n    #ifndef EIGEN_PARSED_BY_DOXYGEN\n    /** This is a special case of the templated operator=. Its purpose is to\n      * prevent a default operator= from hiding the templated operator=.\n      */\n    Derived& operator=(const PermutationBase& other)\n    {\n      indices() = other.indices();\n      return derived();\n    }\n    #endif\n\n    /** \\returns the number of rows */\n    inline Index rows() const { return Index(indices().size()); }\n\n    /** \\returns the number of columns */\n    inline Index cols() const { return Index(indices().size()); }\n\n    /** \\returns the size of a side of the respective square matrix, i.e., the number of indices */\n    inline Index size() const { return Index(indices().size()); }\n\n    #ifndef EIGEN_PARSED_BY_DOXYGEN\n    template<typename DenseDerived>\n    void evalTo(MatrixBase<DenseDerived>& other) const\n    {\n      other.setZero();\n      for (int i=0; i<rows();++i)\n        other.coeffRef(indices().coeff(i),i) = typename DenseDerived::Scalar(1);\n    }\n    #endif\n\n    /** \\returns a Matrix object initialized from this permutation matrix. Notice that it\n      * is inefficient to return this Matrix object by value. For efficiency, favor using\n      * the Matrix constructor taking EigenBase objects.\n      */\n    DenseMatrixType toDenseMatrix() const\n    {\n      return derived();\n    }\n\n    /** const version of indices(). */\n    const IndicesType& indices() const { return derived().indices(); }\n    /** \\returns a reference to the stored array representing the permutation. */\n    IndicesType& indices() { return derived().indices(); }\n\n    /** Resizes to given size.\n      */\n    inline void resize(Index newSize)\n    {\n      indices().resize(newSize);\n    }\n\n    /** Sets *this to be the identity permutation matrix */\n    void setIdentity()\n    {\n      for(Index i = 0; i < size(); ++i)\n        indices().coeffRef(i) = i;\n    }\n\n    /** Sets *this to be the identity permutation matrix of given size.\n      */\n    void setIdentity(Index newSize)\n    {\n      resize(newSize);\n      setIdentity();\n    }\n\n    /** Multiplies *this by the transposition \\f$(ij)\\f$ on the left.\n      *\n      * \\returns a reference to *this.\n      *\n      * \\warning This is much slower than applyTranspositionOnTheRight(int,int):\n      * this has linear complexity and requires a lot of branching.\n      *\n      * \\sa applyTranspositionOnTheRight(int,int)\n      */\n    Derived& applyTranspositionOnTheLeft(Index i, Index j)\n    {\n      eigen_assert(i>=0 && j>=0 && i<size() && j<size());\n      for(Index k = 0; k < size(); ++k)\n      {\n        if(indices().coeff(k) == i) indices().coeffRef(k) = j;\n        else if(indices().coeff(k) == j) indices().coeffRef(k) = i;\n      }\n      return derived();\n    }\n\n    /** Multiplies *this by the transposition \\f$(ij)\\f$ on the right.\n      *\n      * \\returns a reference to *this.\n      *\n      * This is a fast operation, it only consists in swapping two indices.\n      *\n      * \\sa applyTranspositionOnTheLeft(int,int)\n      */\n    Derived& applyTranspositionOnTheRight(Index i, Index j)\n    {\n      eigen_assert(i>=0 && j>=0 && i<size() && j<size());\n      std::swap(indices().coeffRef(i), indices().coeffRef(j));\n      return derived();\n    }\n\n    /** \\returns the inverse permutation matrix.\n      *\n      * \\note \\note_try_to_help_rvo\n      */\n    inline Transpose<PermutationBase> inverse() const\n    { return derived(); }\n    /** \\returns the tranpose permutation matrix.\n      *\n      * \\note \\note_try_to_help_rvo\n      */\n    inline Transpose<PermutationBase> transpose() const\n    { return derived(); }\n\n    /**** multiplication helpers to hopefully get RVO ****/\n\n  \n#ifndef EIGEN_PARSED_BY_DOXYGEN\n  protected:\n    template<typename OtherDerived>\n    void assignTranspose(const PermutationBase<OtherDerived>& other)\n    {\n      for (int i=0; i<rows();++i) indices().coeffRef(other.indices().coeff(i)) = i;\n    }\n    template<typename Lhs,typename Rhs>\n    void assignProduct(const Lhs& lhs, const Rhs& rhs)\n    {\n      eigen_assert(lhs.cols() == rhs.rows());\n      for (int i=0; i<rows();++i) indices().coeffRef(i) = lhs.indices().coeff(rhs.indices().coeff(i));\n    }\n#endif\n\n  public:\n\n    /** \\returns the product permutation matrix.\n      *\n      * \\note \\note_try_to_help_rvo\n      */\n    template<typename Other>\n    inline PlainPermutationType operator*(const PermutationBase<Other>& other) const\n    { return PlainPermutationType(internal::PermPermProduct, derived(), other.derived()); }\n\n    /** \\returns the product of a permutation with another inverse permutation.\n      *\n      * \\note \\note_try_to_help_rvo\n      */\n    template<typename Other>\n    inline PlainPermutationType operator*(const Transpose<PermutationBase<Other> >& other) const\n    { return PlainPermutationType(internal::PermPermProduct, *this, other.eval()); }\n\n    /** \\returns the product of an inverse permutation with another permutation.\n      *\n      * \\note \\note_try_to_help_rvo\n      */\n    template<typename Other> friend\n    inline PlainPermutationType operator*(const Transpose<PermutationBase<Other> >& other, const PermutationBase& perm)\n    { return PlainPermutationType(internal::PermPermProduct, other.eval(), perm); }\n    \n    /** \\returns the determinant of the permutation matrix, which is either 1 or -1 depending on the parity of the permutation.\n      *\n      * This function is O(\\c n) procedure allocating a buffer of \\c n booleans.\n      */\n    Index determinant() const\n    {\n      Index res = 1;\n      Index n = size();\n      Matrix<bool,RowsAtCompileTime,1,0,MaxRowsAtCompileTime> mask(n);\n      mask.fill(false);\n      Index r = 0;\n      while(r < n)\n      {\n        // search for the next seed\n        while(r<n && mask[r]) r++;\n        if(r>=n)\n          break;\n        // we got one, let's follow it until we are back to the seed\n        Index k0 = r++;\n        mask.coeffRef(k0) = true;\n        for(Index k=indices().coeff(k0); k!=k0; k=indices().coeff(k))\n        {\n          mask.coeffRef(k) = true;\n          res = -res;\n        }\n      }\n      return res;\n    }\n\n  protected:\n\n};\n\n/** \\class PermutationMatrix\n  * \\ingroup Core_Module\n  *\n  * \\brief Permutation matrix\n  *\n  * \\param SizeAtCompileTime the number of rows/cols, or Dynamic\n  * \\param MaxSizeAtCompileTime the maximum number of rows/cols, or Dynamic. This optional parameter defaults to SizeAtCompileTime. Most of the time, you should not have to specify it.\n  * \\param IndexType the interger type of the indices\n  *\n  * This class represents a permutation matrix, internally stored as a vector of integers.\n  *\n  * \\sa class PermutationBase, class PermutationWrapper, class DiagonalMatrix\n  */\n\nnamespace internal {\ntemplate<int SizeAtCompileTime, int MaxSizeAtCompileTime, typename IndexType>\nstruct traits<PermutationMatrix<SizeAtCompileTime, MaxSizeAtCompileTime, IndexType> >\n : traits<Matrix<IndexType,SizeAtCompileTime,SizeAtCompileTime,0,MaxSizeAtCompileTime,MaxSizeAtCompileTime> >\n{\n  typedef IndexType Index;\n  typedef Matrix<IndexType, SizeAtCompileTime, 1, 0, MaxSizeAtCompileTime, 1> IndicesType;\n};\n}\n\ntemplate<int SizeAtCompileTime, int MaxSizeAtCompileTime, typename IndexType>\nclass PermutationMatrix : public PermutationBase<PermutationMatrix<SizeAtCompileTime, MaxSizeAtCompileTime, IndexType> >\n{\n    typedef PermutationBase<PermutationMatrix> Base;\n    typedef internal::traits<PermutationMatrix> Traits;\n  public:\n\n    #ifndef EIGEN_PARSED_BY_DOXYGEN\n    typedef typename Traits::IndicesType IndicesType;\n    #endif\n\n    inline PermutationMatrix()\n    {}\n\n    /** Constructs an uninitialized permutation matrix of given size.\n      */\n    inline PermutationMatrix(int size) : m_indices(size)\n    {}\n\n    /** Copy constructor. */\n    template<typename OtherDerived>\n    inline PermutationMatrix(const PermutationBase<OtherDerived>& other)\n      : m_indices(other.indices()) {}\n\n    #ifndef EIGEN_PARSED_BY_DOXYGEN\n    /** Standard copy constructor. Defined only to prevent a default copy constructor\n      * from hiding the other templated constructor */\n    inline PermutationMatrix(const PermutationMatrix& other) : m_indices(other.indices()) {}\n    #endif\n\n    /** Generic constructor from expression of the indices. The indices\n      * array has the meaning that the permutations sends each integer i to indices[i].\n      *\n      * \\warning It is your responsibility to check that the indices array that you passes actually\n      * describes a permutation, i.e., each value between 0 and n-1 occurs exactly once, where n is the\n      * array's size.\n      */\n    template<typename Other>\n    explicit inline PermutationMatrix(const MatrixBase<Other>& a_indices) : m_indices(a_indices)\n    {}\n\n    /** Convert the Transpositions \\a tr to a permutation matrix */\n    template<typename Other>\n    explicit PermutationMatrix(const TranspositionsBase<Other>& tr)\n      : m_indices(tr.size())\n    {\n      *this = tr;\n    }\n\n    /** Copies the other permutation into *this */\n    template<typename Other>\n    PermutationMatrix& operator=(const PermutationBase<Other>& other)\n    {\n      m_indices = other.indices();\n      return *this;\n    }\n\n    /** Assignment from the Transpositions \\a tr */\n    template<typename Other>\n    PermutationMatrix& operator=(const TranspositionsBase<Other>& tr)\n    {\n      return Base::operator=(tr.derived());\n    }\n\n    #ifndef EIGEN_PARSED_BY_DOXYGEN\n    /** This is a special case of the templated operator=. Its purpose is to\n      * prevent a default operator= from hiding the templated operator=.\n      */\n    PermutationMatrix& operator=(const PermutationMatrix& other)\n    {\n      m_indices = other.m_indices;\n      return *this;\n    }\n    #endif\n\n    /** const version of indices(). */\n    const IndicesType& indices() const { return m_indices; }\n    /** \\returns a reference to the stored array representing the permutation. */\n    IndicesType& indices() { return m_indices; }\n\n\n    /**** multiplication helpers to hopefully get RVO ****/\n\n#ifndef EIGEN_PARSED_BY_DOXYGEN\n    template<typename Other>\n    PermutationMatrix(const Transpose<PermutationBase<Other> >& other)\n      : m_indices(other.nestedPermutation().size())\n    {\n      for (int i=0; i<m_indices.size();++i) m_indices.coeffRef(other.nestedPermutation().indices().coeff(i)) = i;\n    }\n    template<typename Lhs,typename Rhs>\n    PermutationMatrix(internal::PermPermProduct_t, const Lhs& lhs, const Rhs& rhs)\n      : m_indices(lhs.indices().size())\n    {\n      Base::assignProduct(lhs,rhs);\n    }\n#endif\n\n  protected:\n\n    IndicesType m_indices;\n};\n\n\nnamespace internal {\ntemplate<int SizeAtCompileTime, int MaxSizeAtCompileTime, typename IndexType, int _PacketAccess>\nstruct traits<Map<PermutationMatrix<SizeAtCompileTime, MaxSizeAtCompileTime, IndexType>,_PacketAccess> >\n : traits<Matrix<IndexType,SizeAtCompileTime,SizeAtCompileTime,0,MaxSizeAtCompileTime,MaxSizeAtCompileTime> >\n{\n  typedef IndexType Index;\n  typedef Map<const Matrix<IndexType, SizeAtCompileTime, 1, 0, MaxSizeAtCompileTime, 1>, _PacketAccess> IndicesType;\n};\n}\n\ntemplate<int SizeAtCompileTime, int MaxSizeAtCompileTime, typename IndexType, int _PacketAccess>\nclass Map<PermutationMatrix<SizeAtCompileTime, MaxSizeAtCompileTime, IndexType>,_PacketAccess>\n  : public PermutationBase<Map<PermutationMatrix<SizeAtCompileTime, MaxSizeAtCompileTime, IndexType>,_PacketAccess> >\n{\n    typedef PermutationBase<Map> Base;\n    typedef internal::traits<Map> Traits;\n  public:\n\n    #ifndef EIGEN_PARSED_BY_DOXYGEN\n    typedef typename Traits::IndicesType IndicesType;\n    typedef typename IndicesType::Scalar Index;\n    #endif\n\n    inline Map(const Index* indicesPtr)\n      : m_indices(indicesPtr)\n    {}\n\n    inline Map(const Index* indicesPtr, Index size)\n      : m_indices(indicesPtr,size)\n    {}\n\n    /** Copies the other permutation into *this */\n    template<typename Other>\n    Map& operator=(const PermutationBase<Other>& other)\n    { return Base::operator=(other.derived()); }\n\n    /** Assignment from the Transpositions \\a tr */\n    template<typename Other>\n    Map& operator=(const TranspositionsBase<Other>& tr)\n    { return Base::operator=(tr.derived()); }\n\n    #ifndef EIGEN_PARSED_BY_DOXYGEN\n    /** This is a special case of the templated operator=. Its purpose is to\n      * prevent a default operator= from hiding the templated operator=.\n      */\n    Map& operator=(const Map& other)\n    {\n      m_indices = other.m_indices;\n      return *this;\n    }\n    #endif\n\n    /** const version of indices(). */\n    const IndicesType& indices() const { return m_indices; }\n    /** \\returns a reference to the stored array representing the permutation. */\n    IndicesType& indices() { return m_indices; }\n\n  protected:\n\n    IndicesType m_indices;\n};\n\n/** \\class PermutationWrapper\n  * \\ingroup Core_Module\n  *\n  * \\brief Class to view a vector of integers as a permutation matrix\n  *\n  * \\param _IndicesType the type of the vector of integer (can be any compatible expression)\n  *\n  * This class allows to view any vector expression of integers as a permutation matrix.\n  *\n  * \\sa class PermutationBase, class PermutationMatrix\n  */\n\nstruct PermutationStorage {};\n\ntemplate<typename _IndicesType> class TranspositionsWrapper;\nnamespace internal {\ntemplate<typename _IndicesType>\nstruct traits<PermutationWrapper<_IndicesType> >\n{\n  typedef PermutationStorage StorageKind;\n  typedef typename _IndicesType::Scalar Scalar;\n  typedef typename _IndicesType::Scalar Index;\n  typedef _IndicesType IndicesType;\n  enum {\n    RowsAtCompileTime = _IndicesType::SizeAtCompileTime,\n    ColsAtCompileTime = _IndicesType::SizeAtCompileTime,\n    MaxRowsAtCompileTime = IndicesType::MaxRowsAtCompileTime,\n    MaxColsAtCompileTime = IndicesType::MaxColsAtCompileTime,\n    Flags = 0,\n    CoeffReadCost = _IndicesType::CoeffReadCost\n  };\n};\n}\n\ntemplate<typename _IndicesType>\nclass PermutationWrapper : public PermutationBase<PermutationWrapper<_IndicesType> >\n{\n    typedef PermutationBase<PermutationWrapper> Base;\n    typedef internal::traits<PermutationWrapper> Traits;\n  public:\n\n    #ifndef EIGEN_PARSED_BY_DOXYGEN\n    typedef typename Traits::IndicesType IndicesType;\n    #endif\n\n    inline PermutationWrapper(const IndicesType& a_indices)\n      : m_indices(a_indices)\n    {}\n\n    /** const version of indices(). */\n    const typename internal::remove_all<typename IndicesType::Nested>::type&\n    indices() const { return m_indices; }\n\n  protected:\n\n    typename IndicesType::Nested m_indices;\n};\n\n/** \\returns the matrix with the permutation applied to the columns.\n  */\ntemplate<typename Derived, typename PermutationDerived>\ninline const internal::permut_matrix_product_retval<PermutationDerived, Derived, OnTheRight>\noperator*(const MatrixBase<Derived>& matrix,\n          const PermutationBase<PermutationDerived> &permutation)\n{\n  return internal::permut_matrix_product_retval\n           <PermutationDerived, Derived, OnTheRight>\n           (permutation.derived(), matrix.derived());\n}\n\n/** \\returns the matrix with the permutation applied to the rows.\n  */\ntemplate<typename Derived, typename PermutationDerived>\ninline const internal::permut_matrix_product_retval\n               <PermutationDerived, Derived, OnTheLeft>\noperator*(const PermutationBase<PermutationDerived> &permutation,\n          const MatrixBase<Derived>& matrix)\n{\n  return internal::permut_matrix_product_retval\n           <PermutationDerived, Derived, OnTheLeft>\n           (permutation.derived(), matrix.derived());\n}\n\nnamespace internal {\n\ntemplate<typename PermutationType, typename MatrixType, int Side, bool Transposed>\nstruct traits<permut_matrix_product_retval<PermutationType, MatrixType, Side, Transposed> >\n{\n  typedef typename MatrixType::PlainObject ReturnType;\n};\n\ntemplate<typename PermutationType, typename MatrixType, int Side, bool Transposed>\nstruct permut_matrix_product_retval\n : public ReturnByValue<permut_matrix_product_retval<PermutationType, MatrixType, Side, Transposed> >\n{\n    typedef typename remove_all<typename MatrixType::Nested>::type MatrixTypeNestedCleaned;\n    typedef typename MatrixType::Index Index;\n\n    permut_matrix_product_retval(const PermutationType& perm, const MatrixType& matrix)\n      : m_permutation(perm), m_matrix(matrix)\n    {}\n\n    inline Index rows() const { return m_matrix.rows(); }\n    inline Index cols() const { return m_matrix.cols(); }\n\n    template<typename Dest> inline void evalTo(Dest& dst) const\n    {\n      const Index n = Side==OnTheLeft ? rows() : cols();\n      // FIXME we need an is_same for expression that is not sensitive to constness. For instance\n      // is_same_xpr<Block<const Matrix>, Block<Matrix> >::value should be true.\n      const typename Dest::Scalar *dst_data = internal::extract_data(dst);\n      if(    is_same<MatrixTypeNestedCleaned,Dest>::value\n          && blas_traits<MatrixTypeNestedCleaned>::HasUsableDirectAccess\n          && blas_traits<Dest>::HasUsableDirectAccess\n          && dst_data!=0 && dst_data == extract_data(m_matrix))\n      {\n        // apply the permutation inplace\n        Matrix<bool,PermutationType::RowsAtCompileTime,1,0,PermutationType::MaxRowsAtCompileTime> mask(m_permutation.size());\n        mask.fill(false);\n        Index r = 0;\n        while(r < m_permutation.size())\n        {\n          // search for the next seed\n          while(r<m_permutation.size() && mask[r]) r++;\n          if(r>=m_permutation.size())\n            break;\n          // we got one, let's follow it until we are back to the seed\n          Index k0 = r++;\n          Index kPrev = k0;\n          mask.coeffRef(k0) = true;\n          for(Index k=m_permutation.indices().coeff(k0); k!=k0; k=m_permutation.indices().coeff(k))\n          {\n                  Block<Dest, Side==OnTheLeft ? 1 : Dest::RowsAtCompileTime, Side==OnTheRight ? 1 : Dest::ColsAtCompileTime>(dst, k)\n            .swap(Block<Dest, Side==OnTheLeft ? 1 : Dest::RowsAtCompileTime, Side==OnTheRight ? 1 : Dest::ColsAtCompileTime>\n                       (dst,((Side==OnTheLeft) ^ Transposed) ? k0 : kPrev));\n\n            mask.coeffRef(k) = true;\n            kPrev = k;\n          }\n        }\n      }\n      else\n      {\n        for(int i = 0; i < n; ++i)\n        {\n          Block<Dest, Side==OnTheLeft ? 1 : Dest::RowsAtCompileTime, Side==OnTheRight ? 1 : Dest::ColsAtCompileTime>\n               (dst, ((Side==OnTheLeft) ^ Transposed) ? m_permutation.indices().coeff(i) : i)\n\n          =\n\n          Block<const MatrixTypeNestedCleaned,Side==OnTheLeft ? 1 : MatrixType::RowsAtCompileTime,Side==OnTheRight ? 1 : MatrixType::ColsAtCompileTime>\n               (m_matrix, ((Side==OnTheRight) ^ Transposed) ? m_permutation.indices().coeff(i) : i);\n        }\n      }\n    }\n\n  protected:\n    const PermutationType& m_permutation;\n    typename MatrixType::Nested m_matrix;\n};\n\n/* Template partial specialization for transposed/inverse permutations */\n\ntemplate<typename Derived>\nstruct traits<Transpose<PermutationBase<Derived> > >\n : traits<Derived>\n{};\n\n} // end namespace internal\n\ntemplate<typename Derived>\nclass Transpose<PermutationBase<Derived> >\n  : public EigenBase<Transpose<PermutationBase<Derived> > >\n{\n    typedef Derived PermutationType;\n    typedef typename PermutationType::IndicesType IndicesType;\n    typedef typename PermutationType::PlainPermutationType PlainPermutationType;\n  public:\n\n    #ifndef EIGEN_PARSED_BY_DOXYGEN\n    typedef internal::traits<PermutationType> Traits;\n    typedef typename Derived::DenseMatrixType DenseMatrixType;\n    enum {\n      Flags = Traits::Flags,\n      CoeffReadCost = Traits::CoeffReadCost,\n      RowsAtCompileTime = Traits::RowsAtCompileTime,\n      ColsAtCompileTime = Traits::ColsAtCompileTime,\n      MaxRowsAtCompileTime = Traits::MaxRowsAtCompileTime,\n      MaxColsAtCompileTime = Traits::MaxColsAtCompileTime\n    };\n    typedef typename Traits::Scalar Scalar;\n    #endif\n\n    Transpose(const PermutationType& p) : m_permutation(p) {}\n\n    inline int rows() const { return m_permutation.rows(); }\n    inline int cols() const { return m_permutation.cols(); }\n\n    #ifndef EIGEN_PARSED_BY_DOXYGEN\n    template<typename DenseDerived>\n    void evalTo(MatrixBase<DenseDerived>& other) const\n    {\n      other.setZero();\n      for (int i=0; i<rows();++i)\n        other.coeffRef(i, m_permutation.indices().coeff(i)) = typename DenseDerived::Scalar(1);\n    }\n    #endif\n\n    /** \\return the equivalent permutation matrix */\n    PlainPermutationType eval() const { return *this; }\n\n    DenseMatrixType toDenseMatrix() const { return *this; }\n\n    /** \\returns the matrix with the inverse permutation applied to the columns.\n      */\n    template<typename OtherDerived> friend\n    inline const internal::permut_matrix_product_retval<PermutationType, OtherDerived, OnTheRight, true>\n    operator*(const MatrixBase<OtherDerived>& matrix, const Transpose& trPerm)\n    {\n      return internal::permut_matrix_product_retval<PermutationType, OtherDerived, OnTheRight, true>(trPerm.m_permutation, matrix.derived());\n    }\n\n    /** \\returns the matrix with the inverse permutation applied to the rows.\n      */\n    template<typename OtherDerived>\n    inline const internal::permut_matrix_product_retval<PermutationType, OtherDerived, OnTheLeft, true>\n    operator*(const MatrixBase<OtherDerived>& matrix) const\n    {\n      return internal::permut_matrix_product_retval<PermutationType, OtherDerived, OnTheLeft, true>(m_permutation, matrix.derived());\n    }\n\n    const PermutationType& nestedPermutation() const { return m_permutation; }\n\n  protected:\n    const PermutationType& m_permutation;\n};\n\ntemplate<typename Derived>\nconst PermutationWrapper<const Derived> MatrixBase<Derived>::asPermutation() const\n{\n  return derived();\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_PERMUTATIONMATRIX_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/PlainObjectBase.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_DENSESTORAGEBASE_H\n#define EIGEN_DENSESTORAGEBASE_H\n\n#if defined(EIGEN_INITIALIZE_MATRICES_BY_ZERO)\n# define EIGEN_INITIALIZE_COEFFS\n# define EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED for(int i=0;i<base().size();++i) coeffRef(i)=Scalar(0);\n#elif defined(EIGEN_INITIALIZE_MATRICES_BY_NAN)\n# define EIGEN_INITIALIZE_COEFFS\n# define EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED for(int i=0;i<base().size();++i) coeffRef(i)=std::numeric_limits<Scalar>::quiet_NaN();\n#else\n# undef EIGEN_INITIALIZE_COEFFS\n# define EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED\n#endif\n\nnamespace Eigen {\n\nnamespace internal {\n\ntemplate<int MaxSizeAtCompileTime> struct check_rows_cols_for_overflow {\n  template<typename Index>\n  static EIGEN_ALWAYS_INLINE void run(Index, Index)\n  {\n  }\n};\n\ntemplate<> struct check_rows_cols_for_overflow<Dynamic> {\n  template<typename Index>\n  static EIGEN_ALWAYS_INLINE void run(Index rows, Index cols)\n  {\n    // http://hg.mozilla.org/mozilla-central/file/6c8a909977d3/xpcom/ds/CheckedInt.h#l242\n    // we assume Index is signed\n    Index max_index = (size_t(1) << (8 * sizeof(Index) - 1)) - 1; // assume Index is signed\n    bool error = (rows == 0 || cols == 0) ? false\n               : (rows > max_index / cols);\n    if (error)\n      throw_std_bad_alloc();\n  }\n};\n\ntemplate <typename Derived,\n          typename OtherDerived = Derived,\n          bool IsVector = bool(Derived::IsVectorAtCompileTime) && bool(OtherDerived::IsVectorAtCompileTime)>\nstruct conservative_resize_like_impl;\n\ntemplate<typename MatrixTypeA, typename MatrixTypeB, bool SwapPointers> struct matrix_swap_impl;\n\n} // end namespace internal\n\n/** \\class PlainObjectBase\n  * \\brief %Dense storage base class for matrices and arrays.\n  *\n  * This class can be extended with the help of the plugin mechanism described on the page\n  * \\ref TopicCustomizingEigen by defining the preprocessor symbol \\c EIGEN_PLAINOBJECTBASE_PLUGIN.\n  *\n  * \\sa \\ref TopicClassHierarchy\n  */\n#ifdef EIGEN_PARSED_BY_DOXYGEN\nnamespace internal {\n\n// this is a warkaround to doxygen not being able to understand the inheritence logic\n// when it is hidden by the dense_xpr_base helper struct.\ntemplate<typename Derived> struct dense_xpr_base_dispatcher_for_doxygen;// : public MatrixBase<Derived> {};\n/** This class is just a workaround for Doxygen and it does not not actually exist. */\ntemplate<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>\nstruct dense_xpr_base_dispatcher_for_doxygen<Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> >\n    : public MatrixBase<Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> > {};\n/** This class is just a workaround for Doxygen and it does not not actually exist. */\ntemplate<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>\nstruct dense_xpr_base_dispatcher_for_doxygen<Array<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> >\n    : public ArrayBase<Array<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> > {};\n\n} // namespace internal\n\ntemplate<typename Derived>\nclass PlainObjectBase : public internal::dense_xpr_base_dispatcher_for_doxygen<Derived>\n#else\ntemplate<typename Derived>\nclass PlainObjectBase : public internal::dense_xpr_base<Derived>::type\n#endif\n{\n  public:\n    enum { Options = internal::traits<Derived>::Options };\n    typedef typename internal::dense_xpr_base<Derived>::type Base;\n\n    typedef typename internal::traits<Derived>::StorageKind StorageKind;\n    typedef typename internal::traits<Derived>::Index Index;\n    typedef typename internal::traits<Derived>::Scalar Scalar;\n    typedef typename internal::packet_traits<Scalar>::type PacketScalar;\n    typedef typename NumTraits<Scalar>::Real RealScalar;\n    typedef Derived DenseType;\n\n    using Base::RowsAtCompileTime;\n    using Base::ColsAtCompileTime;\n    using Base::SizeAtCompileTime;\n    using Base::MaxRowsAtCompileTime;\n    using Base::MaxColsAtCompileTime;\n    using Base::MaxSizeAtCompileTime;\n    using Base::IsVectorAtCompileTime;\n    using Base::Flags;\n\n    template<typename PlainObjectType, int MapOptions, typename StrideType> friend class Eigen::Map;\n    friend  class Eigen::Map<Derived, Unaligned>;\n    typedef Eigen::Map<Derived, Unaligned>  MapType;\n    friend  class Eigen::Map<const Derived, Unaligned>;\n    typedef const Eigen::Map<const Derived, Unaligned> ConstMapType;\n    friend  class Eigen::Map<Derived, Aligned>;\n    typedef Eigen::Map<Derived, Aligned> AlignedMapType;\n    friend  class Eigen::Map<const Derived, Aligned>;\n    typedef const Eigen::Map<const Derived, Aligned> ConstAlignedMapType;\n    template<typename StrideType> struct StridedMapType { typedef Eigen::Map<Derived, Unaligned, StrideType> type; };\n    template<typename StrideType> struct StridedConstMapType { typedef Eigen::Map<const Derived, Unaligned, StrideType> type; };\n    template<typename StrideType> struct StridedAlignedMapType { typedef Eigen::Map<Derived, Aligned, StrideType> type; };\n    template<typename StrideType> struct StridedConstAlignedMapType { typedef Eigen::Map<const Derived, Aligned, StrideType> type; };\n\n  protected:\n    DenseStorage<Scalar, Base::MaxSizeAtCompileTime, Base::RowsAtCompileTime, Base::ColsAtCompileTime, Options> m_storage;\n\n  public:\n    enum { NeedsToAlign = SizeAtCompileTime != Dynamic && (internal::traits<Derived>::Flags & AlignedBit) != 0 };\n    EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(NeedsToAlign)\n\n    Base& base() { return *static_cast<Base*>(this); }\n    const Base& base() const { return *static_cast<const Base*>(this); }\n\n    EIGEN_STRONG_INLINE Index rows() const { return m_storage.rows(); }\n    EIGEN_STRONG_INLINE Index cols() const { return m_storage.cols(); }\n\n    EIGEN_STRONG_INLINE const Scalar& coeff(Index rowId, Index colId) const\n    {\n      if(Flags & RowMajorBit)\n        return m_storage.data()[colId + rowId * m_storage.cols()];\n      else // column-major\n        return m_storage.data()[rowId + colId * m_storage.rows()];\n    }\n\n    EIGEN_STRONG_INLINE const Scalar& coeff(Index index) const\n    {\n      return m_storage.data()[index];\n    }\n\n    EIGEN_STRONG_INLINE Scalar& coeffRef(Index rowId, Index colId)\n    {\n      if(Flags & RowMajorBit)\n        return m_storage.data()[colId + rowId * m_storage.cols()];\n      else // column-major\n        return m_storage.data()[rowId + colId * m_storage.rows()];\n    }\n\n    EIGEN_STRONG_INLINE Scalar& coeffRef(Index index)\n    {\n      return m_storage.data()[index];\n    }\n\n    EIGEN_STRONG_INLINE const Scalar& coeffRef(Index rowId, Index colId) const\n    {\n      if(Flags & RowMajorBit)\n        return m_storage.data()[colId + rowId * m_storage.cols()];\n      else // column-major\n        return m_storage.data()[rowId + colId * m_storage.rows()];\n    }\n\n    EIGEN_STRONG_INLINE const Scalar& coeffRef(Index index) const\n    {\n      return m_storage.data()[index];\n    }\n\n    /** \\internal */\n    template<int LoadMode>\n    EIGEN_STRONG_INLINE PacketScalar packet(Index rowId, Index colId) const\n    {\n      return internal::ploadt<PacketScalar, LoadMode>\n               (m_storage.data() + (Flags & RowMajorBit\n                                   ? colId + rowId * m_storage.cols()\n                                   : rowId + colId * m_storage.rows()));\n    }\n\n    /** \\internal */\n    template<int LoadMode>\n    EIGEN_STRONG_INLINE PacketScalar packet(Index index) const\n    {\n      return internal::ploadt<PacketScalar, LoadMode>(m_storage.data() + index);\n    }\n\n    /** \\internal */\n    template<int StoreMode>\n    EIGEN_STRONG_INLINE void writePacket(Index rowId, Index colId, const PacketScalar& val)\n    {\n      internal::pstoret<Scalar, PacketScalar, StoreMode>\n              (m_storage.data() + (Flags & RowMajorBit\n                                   ? colId + rowId * m_storage.cols()\n                                   : rowId + colId * m_storage.rows()), val);\n    }\n\n    /** \\internal */\n    template<int StoreMode>\n    EIGEN_STRONG_INLINE void writePacket(Index index, const PacketScalar& val)\n    {\n      internal::pstoret<Scalar, PacketScalar, StoreMode>(m_storage.data() + index, val);\n    }\n\n    /** \\returns a const pointer to the data array of this matrix */\n    EIGEN_STRONG_INLINE const Scalar *data() const\n    { return m_storage.data(); }\n\n    /** \\returns a pointer to the data array of this matrix */\n    EIGEN_STRONG_INLINE Scalar *data()\n    { return m_storage.data(); }\n\n    /** Resizes \\c *this to a \\a rows x \\a cols matrix.\n      *\n      * This method is intended for dynamic-size matrices, although it is legal to call it on any\n      * matrix as long as fixed dimensions are left unchanged. If you only want to change the number\n      * of rows and/or of columns, you can use resize(NoChange_t, Index), resize(Index, NoChange_t).\n      *\n      * If the current number of coefficients of \\c *this exactly matches the\n      * product \\a rows * \\a cols, then no memory allocation is performed and\n      * the current values are left unchanged. In all other cases, including\n      * shrinking, the data is reallocated and all previous values are lost.\n      *\n      * Example: \\include Matrix_resize_int_int.cpp\n      * Output: \\verbinclude Matrix_resize_int_int.out\n      *\n      * \\sa resize(Index) for vectors, resize(NoChange_t, Index), resize(Index, NoChange_t)\n      */\n    EIGEN_STRONG_INLINE void resize(Index nbRows, Index nbCols)\n    {\n      eigen_assert(   EIGEN_IMPLIES(RowsAtCompileTime!=Dynamic,nbRows==RowsAtCompileTime)\n                   && EIGEN_IMPLIES(ColsAtCompileTime!=Dynamic,nbCols==ColsAtCompileTime)\n                   && EIGEN_IMPLIES(RowsAtCompileTime==Dynamic && MaxRowsAtCompileTime!=Dynamic,nbRows<=MaxRowsAtCompileTime)\n                   && EIGEN_IMPLIES(ColsAtCompileTime==Dynamic && MaxColsAtCompileTime!=Dynamic,nbCols<=MaxColsAtCompileTime)\n                   && nbRows>=0 && nbCols>=0 && \"Invalid sizes when resizing a matrix or array.\");\n      internal::check_rows_cols_for_overflow<MaxSizeAtCompileTime>::run(nbRows, nbCols);\n      #ifdef EIGEN_INITIALIZE_COEFFS\n        Index size = nbRows*nbCols;\n        bool size_changed = size != this->size();\n        m_storage.resize(size, nbRows, nbCols);\n        if(size_changed) EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED\n      #else\n        internal::check_rows_cols_for_overflow<MaxSizeAtCompileTime>::run(nbRows, nbCols);\n        m_storage.resize(nbRows*nbCols, nbRows, nbCols);\n      #endif\n    }\n\n    /** Resizes \\c *this to a vector of length \\a size\n      *\n      * \\only_for_vectors. This method does not work for\n      * partially dynamic matrices when the static dimension is anything other\n      * than 1. For example it will not work with Matrix<double, 2, Dynamic>.\n      *\n      * Example: \\include Matrix_resize_int.cpp\n      * Output: \\verbinclude Matrix_resize_int.out\n      *\n      * \\sa resize(Index,Index), resize(NoChange_t, Index), resize(Index, NoChange_t)\n      */\n    inline void resize(Index size)\n    {\n      EIGEN_STATIC_ASSERT_VECTOR_ONLY(PlainObjectBase)\n      eigen_assert(((SizeAtCompileTime == Dynamic && (MaxSizeAtCompileTime==Dynamic || size<=MaxSizeAtCompileTime)) || SizeAtCompileTime == size) && size>=0);\n      #ifdef EIGEN_INITIALIZE_COEFFS\n        bool size_changed = size != this->size();\n      #endif\n      if(RowsAtCompileTime == 1)\n        m_storage.resize(size, 1, size);\n      else\n        m_storage.resize(size, size, 1);\n      #ifdef EIGEN_INITIALIZE_COEFFS\n        if(size_changed) EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED\n      #endif\n    }\n\n    /** Resizes the matrix, changing only the number of columns. For the parameter of type NoChange_t, just pass the special value \\c NoChange\n      * as in the example below.\n      *\n      * Example: \\include Matrix_resize_NoChange_int.cpp\n      * Output: \\verbinclude Matrix_resize_NoChange_int.out\n      *\n      * \\sa resize(Index,Index)\n      */\n    inline void resize(NoChange_t, Index nbCols)\n    {\n      resize(rows(), nbCols);\n    }\n\n    /** Resizes the matrix, changing only the number of rows. For the parameter of type NoChange_t, just pass the special value \\c NoChange\n      * as in the example below.\n      *\n      * Example: \\include Matrix_resize_int_NoChange.cpp\n      * Output: \\verbinclude Matrix_resize_int_NoChange.out\n      *\n      * \\sa resize(Index,Index)\n      */\n    inline void resize(Index nbRows, NoChange_t)\n    {\n      resize(nbRows, cols());\n    }\n\n    /** Resizes \\c *this to have the same dimensions as \\a other.\n      * Takes care of doing all the checking that's needed.\n      *\n      * Note that copying a row-vector into a vector (and conversely) is allowed.\n      * The resizing, if any, is then done in the appropriate way so that row-vectors\n      * remain row-vectors and vectors remain vectors.\n      */\n    template<typename OtherDerived>\n    EIGEN_STRONG_INLINE void resizeLike(const EigenBase<OtherDerived>& _other)\n    {\n      const OtherDerived& other = _other.derived();\n      internal::check_rows_cols_for_overflow<MaxSizeAtCompileTime>::run(Index(other.rows()), Index(other.cols()));\n      const Index othersize = Index(other.rows())*Index(other.cols());\n      if(RowsAtCompileTime == 1)\n      {\n        eigen_assert(other.rows() == 1 || other.cols() == 1);\n        resize(1, othersize);\n      }\n      else if(ColsAtCompileTime == 1)\n      {\n        eigen_assert(other.rows() == 1 || other.cols() == 1);\n        resize(othersize, 1);\n      }\n      else resize(other.rows(), other.cols());\n    }\n\n    /** Resizes the matrix to \\a rows x \\a cols while leaving old values untouched.\n      *\n      * The method is intended for matrices of dynamic size. If you only want to change the number\n      * of rows and/or of columns, you can use conservativeResize(NoChange_t, Index) or\n      * conservativeResize(Index, NoChange_t).\n      *\n      * Matrices are resized relative to the top-left element. In case values need to be \n      * appended to the matrix they will be uninitialized.\n      */\n    EIGEN_STRONG_INLINE void conservativeResize(Index nbRows, Index nbCols)\n    {\n      internal::conservative_resize_like_impl<Derived>::run(*this, nbRows, nbCols);\n    }\n\n    /** Resizes the matrix to \\a rows x \\a cols while leaving old values untouched.\n      *\n      * As opposed to conservativeResize(Index rows, Index cols), this version leaves\n      * the number of columns unchanged.\n      *\n      * In case the matrix is growing, new rows will be uninitialized.\n      */\n    EIGEN_STRONG_INLINE void conservativeResize(Index nbRows, NoChange_t)\n    {\n      // Note: see the comment in conservativeResize(Index,Index)\n      conservativeResize(nbRows, cols());\n    }\n\n    /** Resizes the matrix to \\a rows x \\a cols while leaving old values untouched.\n      *\n      * As opposed to conservativeResize(Index rows, Index cols), this version leaves\n      * the number of rows unchanged.\n      *\n      * In case the matrix is growing, new columns will be uninitialized.\n      */\n    EIGEN_STRONG_INLINE void conservativeResize(NoChange_t, Index nbCols)\n    {\n      // Note: see the comment in conservativeResize(Index,Index)\n      conservativeResize(rows(), nbCols);\n    }\n\n    /** Resizes the vector to \\a size while retaining old values.\n      *\n      * \\only_for_vectors. This method does not work for\n      * partially dynamic matrices when the static dimension is anything other\n      * than 1. For example it will not work with Matrix<double, 2, Dynamic>.\n      *\n      * When values are appended, they will be uninitialized.\n      */\n    EIGEN_STRONG_INLINE void conservativeResize(Index size)\n    {\n      internal::conservative_resize_like_impl<Derived>::run(*this, size);\n    }\n\n    /** Resizes the matrix to \\a rows x \\a cols of \\c other, while leaving old values untouched.\n      *\n      * The method is intended for matrices of dynamic size. If you only want to change the number\n      * of rows and/or of columns, you can use conservativeResize(NoChange_t, Index) or\n      * conservativeResize(Index, NoChange_t).\n      *\n      * Matrices are resized relative to the top-left element. In case values need to be \n      * appended to the matrix they will copied from \\c other.\n      */\n    template<typename OtherDerived>\n    EIGEN_STRONG_INLINE void conservativeResizeLike(const DenseBase<OtherDerived>& other)\n    {\n      internal::conservative_resize_like_impl<Derived,OtherDerived>::run(*this, other);\n    }\n\n    /** This is a special case of the templated operator=. Its purpose is to\n      * prevent a default operator= from hiding the templated operator=.\n      */\n    EIGEN_STRONG_INLINE Derived& operator=(const PlainObjectBase& other)\n    {\n      return _set(other);\n    }\n\n    /** \\sa MatrixBase::lazyAssign() */\n    template<typename OtherDerived>\n    EIGEN_STRONG_INLINE Derived& lazyAssign(const DenseBase<OtherDerived>& other)\n    {\n      _resize_to_match(other);\n      return Base::lazyAssign(other.derived());\n    }\n\n    template<typename OtherDerived>\n    EIGEN_STRONG_INLINE Derived& operator=(const ReturnByValue<OtherDerived>& func)\n    {\n      resize(func.rows(), func.cols());\n      return Base::operator=(func);\n    }\n\n    EIGEN_STRONG_INLINE PlainObjectBase() : m_storage()\n    {\n//       _check_template_params();\n//       EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED\n    }\n\n#ifndef EIGEN_PARSED_BY_DOXYGEN\n    // FIXME is it still needed ?\n    /** \\internal */\n    PlainObjectBase(internal::constructor_without_unaligned_array_assert)\n      : m_storage(internal::constructor_without_unaligned_array_assert())\n    {\n//       _check_template_params(); EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED\n    }\n#endif\n\n#ifdef EIGEN_HAVE_RVALUE_REFERENCES\n    PlainObjectBase(PlainObjectBase&& other)\n      : m_storage( std::move(other.m_storage) )\n    {\n    }\n\n    PlainObjectBase& operator=(PlainObjectBase&& other)\n    {\n      using std::swap;\n      swap(m_storage, other.m_storage);\n      return *this;\n    }\n#endif\n\n    /** Copy constructor */\n    EIGEN_STRONG_INLINE PlainObjectBase(const PlainObjectBase& other)\n      : m_storage()\n    {\n      _check_template_params();\n      lazyAssign(other);\n    }\n\n    template<typename OtherDerived>\n    EIGEN_STRONG_INLINE PlainObjectBase(const DenseBase<OtherDerived> &other)\n      : m_storage()\n    {\n      _check_template_params();\n      lazyAssign(other);\n    }\n\n    EIGEN_STRONG_INLINE PlainObjectBase(Index a_size, Index nbRows, Index nbCols)\n      : m_storage(a_size, nbRows, nbCols)\n    {\n//       _check_template_params();\n//       EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED\n    }\n\n    /** \\copydoc MatrixBase::operator=(const EigenBase<OtherDerived>&)\n      */\n    template<typename OtherDerived>\n    EIGEN_STRONG_INLINE Derived& operator=(const EigenBase<OtherDerived> &other)\n    {\n      _resize_to_match(other);\n      Base::operator=(other.derived());\n      return this->derived();\n    }\n\n    /** \\sa MatrixBase::operator=(const EigenBase<OtherDerived>&) */\n    template<typename OtherDerived>\n    EIGEN_STRONG_INLINE PlainObjectBase(const EigenBase<OtherDerived> &other)\n      : m_storage(Index(other.derived().rows()) * Index(other.derived().cols()), other.derived().rows(), other.derived().cols())\n    {\n      _check_template_params();\n      internal::check_rows_cols_for_overflow<MaxSizeAtCompileTime>::run(other.derived().rows(), other.derived().cols());\n      Base::operator=(other.derived());\n    }\n\n    /** \\name Map\n      * These are convenience functions returning Map objects. The Map() static functions return unaligned Map objects,\n      * while the AlignedMap() functions return aligned Map objects and thus should be called only with 16-byte-aligned\n      * \\a data pointers.\n      *\n      * \\see class Map\n      */\n    //@{\n    static inline ConstMapType Map(const Scalar* data)\n    { return ConstMapType(data); }\n    static inline MapType Map(Scalar* data)\n    { return MapType(data); }\n    static inline ConstMapType Map(const Scalar* data, Index size)\n    { return ConstMapType(data, size); }\n    static inline MapType Map(Scalar* data, Index size)\n    { return MapType(data, size); }\n    static inline ConstMapType Map(const Scalar* data, Index rows, Index cols)\n    { return ConstMapType(data, rows, cols); }\n    static inline MapType Map(Scalar* data, Index rows, Index cols)\n    { return MapType(data, rows, cols); }\n\n    static inline ConstAlignedMapType MapAligned(const Scalar* data)\n    { return ConstAlignedMapType(data); }\n    static inline AlignedMapType MapAligned(Scalar* data)\n    { return AlignedMapType(data); }\n    static inline ConstAlignedMapType MapAligned(const Scalar* data, Index size)\n    { return ConstAlignedMapType(data, size); }\n    static inline AlignedMapType MapAligned(Scalar* data, Index size)\n    { return AlignedMapType(data, size); }\n    static inline ConstAlignedMapType MapAligned(const Scalar* data, Index rows, Index cols)\n    { return ConstAlignedMapType(data, rows, cols); }\n    static inline AlignedMapType MapAligned(Scalar* data, Index rows, Index cols)\n    { return AlignedMapType(data, rows, cols); }\n\n    template<int Outer, int Inner>\n    static inline typename StridedConstMapType<Stride<Outer, Inner> >::type Map(const Scalar* data, const Stride<Outer, Inner>& stride)\n    { return typename StridedConstMapType<Stride<Outer, Inner> >::type(data, stride); }\n    template<int Outer, int Inner>\n    static inline typename StridedMapType<Stride<Outer, Inner> >::type Map(Scalar* data, const Stride<Outer, Inner>& stride)\n    { return typename StridedMapType<Stride<Outer, Inner> >::type(data, stride); }\n    template<int Outer, int Inner>\n    static inline typename StridedConstMapType<Stride<Outer, Inner> >::type Map(const Scalar* data, Index size, const Stride<Outer, Inner>& stride)\n    { return typename StridedConstMapType<Stride<Outer, Inner> >::type(data, size, stride); }\n    template<int Outer, int Inner>\n    static inline typename StridedMapType<Stride<Outer, Inner> >::type Map(Scalar* data, Index size, const Stride<Outer, Inner>& stride)\n    { return typename StridedMapType<Stride<Outer, Inner> >::type(data, size, stride); }\n    template<int Outer, int Inner>\n    static inline typename StridedConstMapType<Stride<Outer, Inner> >::type Map(const Scalar* data, Index rows, Index cols, const Stride<Outer, Inner>& stride)\n    { return typename StridedConstMapType<Stride<Outer, Inner> >::type(data, rows, cols, stride); }\n    template<int Outer, int Inner>\n    static inline typename StridedMapType<Stride<Outer, Inner> >::type Map(Scalar* data, Index rows, Index cols, const Stride<Outer, Inner>& stride)\n    { return typename StridedMapType<Stride<Outer, Inner> >::type(data, rows, cols, stride); }\n\n    template<int Outer, int Inner>\n    static inline typename StridedConstAlignedMapType<Stride<Outer, Inner> >::type MapAligned(const Scalar* data, const Stride<Outer, Inner>& stride)\n    { return typename StridedConstAlignedMapType<Stride<Outer, Inner> >::type(data, stride); }\n    template<int Outer, int Inner>\n    static inline typename StridedAlignedMapType<Stride<Outer, Inner> >::type MapAligned(Scalar* data, const Stride<Outer, Inner>& stride)\n    { return typename StridedAlignedMapType<Stride<Outer, Inner> >::type(data, stride); }\n    template<int Outer, int Inner>\n    static inline typename StridedConstAlignedMapType<Stride<Outer, Inner> >::type MapAligned(const Scalar* data, Index size, const Stride<Outer, Inner>& stride)\n    { return typename StridedConstAlignedMapType<Stride<Outer, Inner> >::type(data, size, stride); }\n    template<int Outer, int Inner>\n    static inline typename StridedAlignedMapType<Stride<Outer, Inner> >::type MapAligned(Scalar* data, Index size, const Stride<Outer, Inner>& stride)\n    { return typename StridedAlignedMapType<Stride<Outer, Inner> >::type(data, size, stride); }\n    template<int Outer, int Inner>\n    static inline typename StridedConstAlignedMapType<Stride<Outer, Inner> >::type MapAligned(const Scalar* data, Index rows, Index cols, const Stride<Outer, Inner>& stride)\n    { return typename StridedConstAlignedMapType<Stride<Outer, Inner> >::type(data, rows, cols, stride); }\n    template<int Outer, int Inner>\n    static inline typename StridedAlignedMapType<Stride<Outer, Inner> >::type MapAligned(Scalar* data, Index rows, Index cols, const Stride<Outer, Inner>& stride)\n    { return typename StridedAlignedMapType<Stride<Outer, Inner> >::type(data, rows, cols, stride); }\n    //@}\n\n    using Base::setConstant;\n    Derived& setConstant(Index size, const Scalar& value);\n    Derived& setConstant(Index rows, Index cols, const Scalar& value);\n\n    using Base::setZero;\n    Derived& setZero(Index size);\n    Derived& setZero(Index rows, Index cols);\n\n    using Base::setOnes;\n    Derived& setOnes(Index size);\n    Derived& setOnes(Index rows, Index cols);\n\n    using Base::setRandom;\n    Derived& setRandom(Index size);\n    Derived& setRandom(Index rows, Index cols);\n\n    #ifdef EIGEN_PLAINOBJECTBASE_PLUGIN\n    #include EIGEN_PLAINOBJECTBASE_PLUGIN\n    #endif\n\n  protected:\n    /** \\internal Resizes *this in preparation for assigning \\a other to it.\n      * Takes care of doing all the checking that's needed.\n      *\n      * Note that copying a row-vector into a vector (and conversely) is allowed.\n      * The resizing, if any, is then done in the appropriate way so that row-vectors\n      * remain row-vectors and vectors remain vectors.\n      */\n    template<typename OtherDerived>\n    EIGEN_STRONG_INLINE void _resize_to_match(const EigenBase<OtherDerived>& other)\n    {\n      #ifdef EIGEN_NO_AUTOMATIC_RESIZING\n      eigen_assert((this->size()==0 || (IsVectorAtCompileTime ? (this->size() == other.size())\n                 : (rows() == other.rows() && cols() == other.cols())))\n        && \"Size mismatch. Automatic resizing is disabled because EIGEN_NO_AUTOMATIC_RESIZING is defined\");\n      EIGEN_ONLY_USED_FOR_DEBUG(other);\n      if(this->size()==0)\n        resizeLike(other);\n      #else\n      resizeLike(other);\n      #endif\n    }\n\n    /**\n      * \\brief Copies the value of the expression \\a other into \\c *this with automatic resizing.\n      *\n      * *this might be resized to match the dimensions of \\a other. If *this was a null matrix (not already initialized),\n      * it will be initialized.\n      *\n      * Note that copying a row-vector into a vector (and conversely) is allowed.\n      * The resizing, if any, is then done in the appropriate way so that row-vectors\n      * remain row-vectors and vectors remain vectors.\n      *\n      * \\sa operator=(const MatrixBase<OtherDerived>&), _set_noalias()\n      *\n      * \\internal\n      */\n    template<typename OtherDerived>\n    EIGEN_STRONG_INLINE Derived& _set(const DenseBase<OtherDerived>& other)\n    {\n      _set_selector(other.derived(), typename internal::conditional<static_cast<bool>(int(OtherDerived::Flags) & EvalBeforeAssigningBit), internal::true_type, internal::false_type>::type());\n      return this->derived();\n    }\n\n    template<typename OtherDerived>\n    EIGEN_STRONG_INLINE void _set_selector(const OtherDerived& other, const internal::true_type&) { _set_noalias(other.eval()); }\n\n    template<typename OtherDerived>\n    EIGEN_STRONG_INLINE void _set_selector(const OtherDerived& other, const internal::false_type&) { _set_noalias(other); }\n\n    /** \\internal Like _set() but additionally makes the assumption that no aliasing effect can happen (which\n      * is the case when creating a new matrix) so one can enforce lazy evaluation.\n      *\n      * \\sa operator=(const MatrixBase<OtherDerived>&), _set()\n      */\n    template<typename OtherDerived>\n    EIGEN_STRONG_INLINE Derived& _set_noalias(const DenseBase<OtherDerived>& other)\n    {\n      // I don't think we need this resize call since the lazyAssign will anyways resize\n      // and lazyAssign will be called by the assign selector.\n      //_resize_to_match(other);\n      // the 'false' below means to enforce lazy evaluation. We don't use lazyAssign() because\n      // it wouldn't allow to copy a row-vector into a column-vector.\n      return internal::assign_selector<Derived,OtherDerived,false>::run(this->derived(), other.derived());\n    }\n\n    template<typename T0, typename T1>\n    EIGEN_STRONG_INLINE void _init2(Index nbRows, Index nbCols, typename internal::enable_if<Base::SizeAtCompileTime!=2,T0>::type* = 0)\n    {\n      EIGEN_STATIC_ASSERT(bool(NumTraits<T0>::IsInteger) &&\n                          bool(NumTraits<T1>::IsInteger),\n                          FLOATING_POINT_ARGUMENT_PASSED__INTEGER_WAS_EXPECTED)\n      resize(nbRows,nbCols);\n    }\n    template<typename T0, typename T1>\n    EIGEN_STRONG_INLINE void _init2(const Scalar& val0, const Scalar& val1, typename internal::enable_if<Base::SizeAtCompileTime==2,T0>::type* = 0)\n    {\n      EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(PlainObjectBase, 2)\n      m_storage.data()[0] = val0;\n      m_storage.data()[1] = val1;\n    }\n\n    template<typename MatrixTypeA, typename MatrixTypeB, bool SwapPointers>\n    friend struct internal::matrix_swap_impl;\n\n    /** \\internal generic implementation of swap for dense storage since for dynamic-sized matrices of same type it is enough to swap the\n      * data pointers.\n      */\n    template<typename OtherDerived>\n    void _swap(DenseBase<OtherDerived> const & other)\n    {\n      enum { SwapPointers = internal::is_same<Derived, OtherDerived>::value && Base::SizeAtCompileTime==Dynamic };\n      internal::matrix_swap_impl<Derived, OtherDerived, bool(SwapPointers)>::run(this->derived(), other.const_cast_derived());\n    }\n\n  public:\n#ifndef EIGEN_PARSED_BY_DOXYGEN\n    static EIGEN_STRONG_INLINE void _check_template_params()\n    {\n      EIGEN_STATIC_ASSERT((EIGEN_IMPLIES(MaxRowsAtCompileTime==1 && MaxColsAtCompileTime!=1, (Options&RowMajor)==RowMajor)\n                        && EIGEN_IMPLIES(MaxColsAtCompileTime==1 && MaxRowsAtCompileTime!=1, (Options&RowMajor)==0)\n                        && ((RowsAtCompileTime == Dynamic) || (RowsAtCompileTime >= 0))\n                        && ((ColsAtCompileTime == Dynamic) || (ColsAtCompileTime >= 0))\n                        && ((MaxRowsAtCompileTime == Dynamic) || (MaxRowsAtCompileTime >= 0))\n                        && ((MaxColsAtCompileTime == Dynamic) || (MaxColsAtCompileTime >= 0))\n                        && (MaxRowsAtCompileTime == RowsAtCompileTime || RowsAtCompileTime==Dynamic)\n                        && (MaxColsAtCompileTime == ColsAtCompileTime || ColsAtCompileTime==Dynamic)\n                        && (Options & (DontAlign|RowMajor)) == Options),\n        INVALID_MATRIX_TEMPLATE_PARAMETERS)\n    }\n#endif\n\nprivate:\n    enum { ThisConstantIsPrivateInPlainObjectBase };\n};\n\nnamespace internal {\n\ntemplate <typename Derived, typename OtherDerived, bool IsVector>\nstruct conservative_resize_like_impl\n{\n  typedef typename Derived::Index Index;\n  static void run(DenseBase<Derived>& _this, Index rows, Index cols)\n  {\n    if (_this.rows() == rows && _this.cols() == cols) return;\n    EIGEN_STATIC_ASSERT_DYNAMIC_SIZE(Derived)\n\n    if ( ( Derived::IsRowMajor && _this.cols() == cols) || // row-major and we change only the number of rows\n         (!Derived::IsRowMajor && _this.rows() == rows) )  // column-major and we change only the number of columns\n    {\n      internal::check_rows_cols_for_overflow<Derived::MaxSizeAtCompileTime>::run(rows, cols);\n      _this.derived().m_storage.conservativeResize(rows*cols,rows,cols);\n    }\n    else\n    {\n      // The storage order does not allow us to use reallocation.\n      typename Derived::PlainObject tmp(rows,cols);\n      const Index common_rows = (std::min)(rows, _this.rows());\n      const Index common_cols = (std::min)(cols, _this.cols());\n      tmp.block(0,0,common_rows,common_cols) = _this.block(0,0,common_rows,common_cols);\n      _this.derived().swap(tmp);\n    }\n  }\n\n  static void run(DenseBase<Derived>& _this, const DenseBase<OtherDerived>& other)\n  {\n    if (_this.rows() == other.rows() && _this.cols() == other.cols()) return;\n\n    // Note: Here is space for improvement. Basically, for conservativeResize(Index,Index),\n    // neither RowsAtCompileTime or ColsAtCompileTime must be Dynamic. If only one of the\n    // dimensions is dynamic, one could use either conservativeResize(Index rows, NoChange_t) or\n    // conservativeResize(NoChange_t, Index cols). For these methods new static asserts like\n    // EIGEN_STATIC_ASSERT_DYNAMIC_ROWS and EIGEN_STATIC_ASSERT_DYNAMIC_COLS would be good.\n    EIGEN_STATIC_ASSERT_DYNAMIC_SIZE(Derived)\n    EIGEN_STATIC_ASSERT_DYNAMIC_SIZE(OtherDerived)\n\n    if ( ( Derived::IsRowMajor && _this.cols() == other.cols()) || // row-major and we change only the number of rows\n         (!Derived::IsRowMajor && _this.rows() == other.rows()) )  // column-major and we change only the number of columns\n    {\n      const Index new_rows = other.rows() - _this.rows();\n      const Index new_cols = other.cols() - _this.cols();\n      _this.derived().m_storage.conservativeResize(other.size(),other.rows(),other.cols());\n      if (new_rows>0)\n        _this.bottomRightCorner(new_rows, other.cols()) = other.bottomRows(new_rows);\n      else if (new_cols>0)\n        _this.bottomRightCorner(other.rows(), new_cols) = other.rightCols(new_cols);\n    }\n    else\n    {\n      // The storage order does not allow us to use reallocation.\n      typename Derived::PlainObject tmp(other);\n      const Index common_rows = (std::min)(tmp.rows(), _this.rows());\n      const Index common_cols = (std::min)(tmp.cols(), _this.cols());\n      tmp.block(0,0,common_rows,common_cols) = _this.block(0,0,common_rows,common_cols);\n      _this.derived().swap(tmp);\n    }\n  }\n};\n\n// Here, the specialization for vectors inherits from the general matrix case\n// to allow calling .conservativeResize(rows,cols) on vectors.\ntemplate <typename Derived, typename OtherDerived>\nstruct conservative_resize_like_impl<Derived,OtherDerived,true>\n  : conservative_resize_like_impl<Derived,OtherDerived,false>\n{\n  using conservative_resize_like_impl<Derived,OtherDerived,false>::run;\n  \n  typedef typename Derived::Index Index;\n  static void run(DenseBase<Derived>& _this, Index size)\n  {\n    const Index new_rows = Derived::RowsAtCompileTime==1 ? 1 : size;\n    const Index new_cols = Derived::RowsAtCompileTime==1 ? size : 1;\n    _this.derived().m_storage.conservativeResize(size,new_rows,new_cols);\n  }\n\n  static void run(DenseBase<Derived>& _this, const DenseBase<OtherDerived>& other)\n  {\n    if (_this.rows() == other.rows() && _this.cols() == other.cols()) return;\n\n    const Index num_new_elements = other.size() - _this.size();\n\n    const Index new_rows = Derived::RowsAtCompileTime==1 ? 1 : other.rows();\n    const Index new_cols = Derived::RowsAtCompileTime==1 ? other.cols() : 1;\n    _this.derived().m_storage.conservativeResize(other.size(),new_rows,new_cols);\n\n    if (num_new_elements > 0)\n      _this.tail(num_new_elements) = other.tail(num_new_elements);\n  }\n};\n\ntemplate<typename MatrixTypeA, typename MatrixTypeB, bool SwapPointers>\nstruct matrix_swap_impl\n{\n  static inline void run(MatrixTypeA& a, MatrixTypeB& b)\n  {\n    a.base().swap(b);\n  }\n};\n\ntemplate<typename MatrixTypeA, typename MatrixTypeB>\nstruct matrix_swap_impl<MatrixTypeA, MatrixTypeB, true>\n{\n  static inline void run(MatrixTypeA& a, MatrixTypeB& b)\n  {\n    static_cast<typename MatrixTypeA::Base&>(a).m_storage.swap(static_cast<typename MatrixTypeB::Base&>(b).m_storage);\n  }\n};\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_DENSESTORAGEBASE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/ProductBase.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_PRODUCTBASE_H\n#define EIGEN_PRODUCTBASE_H\n\nnamespace Eigen { \n\n/** \\class ProductBase\n  * \\ingroup Core_Module\n  *\n  */\n\nnamespace internal {\ntemplate<typename Derived, typename _Lhs, typename _Rhs>\nstruct traits<ProductBase<Derived,_Lhs,_Rhs> >\n{\n  typedef MatrixXpr XprKind;\n  typedef typename remove_all<_Lhs>::type Lhs;\n  typedef typename remove_all<_Rhs>::type Rhs;\n  typedef typename scalar_product_traits<typename Lhs::Scalar, typename Rhs::Scalar>::ReturnType Scalar;\n  typedef typename promote_storage_type<typename traits<Lhs>::StorageKind,\n                                           typename traits<Rhs>::StorageKind>::ret StorageKind;\n  typedef typename promote_index_type<typename traits<Lhs>::Index,\n                                         typename traits<Rhs>::Index>::type Index;\n  enum {\n    RowsAtCompileTime = traits<Lhs>::RowsAtCompileTime,\n    ColsAtCompileTime = traits<Rhs>::ColsAtCompileTime,\n    MaxRowsAtCompileTime = traits<Lhs>::MaxRowsAtCompileTime,\n    MaxColsAtCompileTime = traits<Rhs>::MaxColsAtCompileTime,\n    Flags = (MaxRowsAtCompileTime==1 ? RowMajorBit : 0)\n          | EvalBeforeNestingBit | EvalBeforeAssigningBit | NestByRefBit,\n                  // Note that EvalBeforeNestingBit and NestByRefBit\n                  // are not used in practice because nested is overloaded for products\n    CoeffReadCost = 0 // FIXME why is it needed ?\n  };\n};\n}\n\n#define EIGEN_PRODUCT_PUBLIC_INTERFACE(Derived) \\\n  typedef ProductBase<Derived, Lhs, Rhs > Base; \\\n  EIGEN_DENSE_PUBLIC_INTERFACE(Derived) \\\n  typedef typename Base::LhsNested LhsNested; \\\n  typedef typename Base::_LhsNested _LhsNested; \\\n  typedef typename Base::LhsBlasTraits LhsBlasTraits; \\\n  typedef typename Base::ActualLhsType ActualLhsType; \\\n  typedef typename Base::_ActualLhsType _ActualLhsType; \\\n  typedef typename Base::RhsNested RhsNested; \\\n  typedef typename Base::_RhsNested _RhsNested; \\\n  typedef typename Base::RhsBlasTraits RhsBlasTraits; \\\n  typedef typename Base::ActualRhsType ActualRhsType; \\\n  typedef typename Base::_ActualRhsType _ActualRhsType; \\\n  using Base::m_lhs; \\\n  using Base::m_rhs;\n\ntemplate<typename Derived, typename Lhs, typename Rhs>\nclass ProductBase : public MatrixBase<Derived>\n{\n  public:\n    typedef MatrixBase<Derived> Base;\n    EIGEN_DENSE_PUBLIC_INTERFACE(ProductBase)\n    \n    typedef typename Lhs::Nested LhsNested;\n    typedef typename internal::remove_all<LhsNested>::type _LhsNested;\n    typedef internal::blas_traits<_LhsNested> LhsBlasTraits;\n    typedef typename LhsBlasTraits::DirectLinearAccessType ActualLhsType;\n    typedef typename internal::remove_all<ActualLhsType>::type _ActualLhsType;\n    typedef typename internal::traits<Lhs>::Scalar LhsScalar;\n\n    typedef typename Rhs::Nested RhsNested;\n    typedef typename internal::remove_all<RhsNested>::type _RhsNested;\n    typedef internal::blas_traits<_RhsNested> RhsBlasTraits;\n    typedef typename RhsBlasTraits::DirectLinearAccessType ActualRhsType;\n    typedef typename internal::remove_all<ActualRhsType>::type _ActualRhsType;\n    typedef typename internal::traits<Rhs>::Scalar RhsScalar;\n\n    // Diagonal of a product: no need to evaluate the arguments because they are going to be evaluated only once\n    typedef CoeffBasedProduct<LhsNested, RhsNested, 0> FullyLazyCoeffBaseProductType;\n\n  public:\n\n#ifndef EIGEN_NO_MALLOC\n    typedef typename Base::PlainObject BasePlainObject;\n    typedef Matrix<Scalar,RowsAtCompileTime==1?1:Dynamic,ColsAtCompileTime==1?1:Dynamic,BasePlainObject::Options> DynPlainObject;\n    typedef typename internal::conditional<(BasePlainObject::SizeAtCompileTime==Dynamic) || (BasePlainObject::SizeAtCompileTime*int(sizeof(Scalar)) < int(EIGEN_STACK_ALLOCATION_LIMIT)),\n                                           BasePlainObject, DynPlainObject>::type PlainObject;\n#else\n    typedef typename Base::PlainObject PlainObject;\n#endif\n\n    ProductBase(const Lhs& a_lhs, const Rhs& a_rhs)\n      : m_lhs(a_lhs), m_rhs(a_rhs)\n    {\n      eigen_assert(a_lhs.cols() == a_rhs.rows()\n        && \"invalid matrix product\"\n        && \"if you wanted a coeff-wise or a dot product use the respective explicit functions\");\n    }\n\n    inline Index rows() const { return m_lhs.rows(); }\n    inline Index cols() const { return m_rhs.cols(); }\n\n    template<typename Dest>\n    inline void evalTo(Dest& dst) const { dst.setZero(); scaleAndAddTo(dst,Scalar(1)); }\n\n    template<typename Dest>\n    inline void addTo(Dest& dst) const { scaleAndAddTo(dst,Scalar(1)); }\n\n    template<typename Dest>\n    inline void subTo(Dest& dst) const { scaleAndAddTo(dst,Scalar(-1)); }\n\n    template<typename Dest>\n    inline void scaleAndAddTo(Dest& dst, const Scalar& alpha) const { derived().scaleAndAddTo(dst,alpha); }\n\n    const _LhsNested& lhs() const { return m_lhs; }\n    const _RhsNested& rhs() const { return m_rhs; }\n\n    // Implicit conversion to the nested type (trigger the evaluation of the product)\n    operator const PlainObject& () const\n    {\n      m_result.resize(m_lhs.rows(), m_rhs.cols());\n      derived().evalTo(m_result);\n      return m_result;\n    }\n\n    const Diagonal<const FullyLazyCoeffBaseProductType,0> diagonal() const\n    { return FullyLazyCoeffBaseProductType(m_lhs, m_rhs); }\n\n    template<int Index>\n    const Diagonal<FullyLazyCoeffBaseProductType,Index> diagonal() const\n    { return FullyLazyCoeffBaseProductType(m_lhs, m_rhs); }\n\n    const Diagonal<FullyLazyCoeffBaseProductType,Dynamic> diagonal(Index index) const\n    { return FullyLazyCoeffBaseProductType(m_lhs, m_rhs).diagonal(index); }\n\n    // restrict coeff accessors to 1x1 expressions. No need to care about mutators here since this isnt a Lvalue expression\n    typename Base::CoeffReturnType coeff(Index row, Index col) const\n    {\n#ifdef EIGEN2_SUPPORT\n      return lhs().row(row).cwiseProduct(rhs().col(col).transpose()).sum();\n#else\n      EIGEN_STATIC_ASSERT_SIZE_1x1(Derived)\n      eigen_assert(this->rows() == 1 && this->cols() == 1);\n      Matrix<Scalar,1,1> result = *this;\n      return result.coeff(row,col);\n#endif\n    }\n\n    typename Base::CoeffReturnType coeff(Index i) const\n    {\n      EIGEN_STATIC_ASSERT_SIZE_1x1(Derived)\n      eigen_assert(this->rows() == 1 && this->cols() == 1);\n      Matrix<Scalar,1,1> result = *this;\n      return result.coeff(i);\n    }\n\n    const Scalar& coeffRef(Index row, Index col) const\n    {\n      EIGEN_STATIC_ASSERT_SIZE_1x1(Derived)\n      eigen_assert(this->rows() == 1 && this->cols() == 1);\n      return derived().coeffRef(row,col);\n    }\n\n    const Scalar& coeffRef(Index i) const\n    {\n      EIGEN_STATIC_ASSERT_SIZE_1x1(Derived)\n      eigen_assert(this->rows() == 1 && this->cols() == 1);\n      return derived().coeffRef(i);\n    }\n\n  protected:\n\n    LhsNested m_lhs;\n    RhsNested m_rhs;\n\n    mutable PlainObject m_result;\n};\n\n// here we need to overload the nested rule for products\n// such that the nested type is a const reference to a plain matrix\nnamespace internal {\ntemplate<typename Lhs, typename Rhs, int Mode, int N, typename PlainObject>\nstruct nested<GeneralProduct<Lhs,Rhs,Mode>, N, PlainObject>\n{\n  typedef typename GeneralProduct<Lhs,Rhs,Mode>::PlainObject const& type;\n};\ntemplate<typename Lhs, typename Rhs, int Mode, int N, typename PlainObject>\nstruct nested<const GeneralProduct<Lhs,Rhs,Mode>, N, PlainObject>\n{\n  typedef typename GeneralProduct<Lhs,Rhs,Mode>::PlainObject const& type;\n};\n}\n\ntemplate<typename NestedProduct>\nclass ScaledProduct;\n\n// Note that these two operator* functions are not defined as member\n// functions of ProductBase, because, otherwise we would have to\n// define all overloads defined in MatrixBase. Furthermore, Using\n// \"using Base::operator*\" would not work with MSVC.\n//\n// Also note that here we accept any compatible scalar types\ntemplate<typename Derived,typename Lhs,typename Rhs>\nconst ScaledProduct<Derived>\noperator*(const ProductBase<Derived,Lhs,Rhs>& prod, const typename Derived::Scalar& x)\n{ return ScaledProduct<Derived>(prod.derived(), x); }\n\ntemplate<typename Derived,typename Lhs,typename Rhs>\ntypename internal::enable_if<!internal::is_same<typename Derived::Scalar,typename Derived::RealScalar>::value,\n                      const ScaledProduct<Derived> >::type\noperator*(const ProductBase<Derived,Lhs,Rhs>& prod, const typename Derived::RealScalar& x)\n{ return ScaledProduct<Derived>(prod.derived(), x); }\n\n\ntemplate<typename Derived,typename Lhs,typename Rhs>\nconst ScaledProduct<Derived>\noperator*(const typename Derived::Scalar& x,const ProductBase<Derived,Lhs,Rhs>& prod)\n{ return ScaledProduct<Derived>(prod.derived(), x); }\n\ntemplate<typename Derived,typename Lhs,typename Rhs>\ntypename internal::enable_if<!internal::is_same<typename Derived::Scalar,typename Derived::RealScalar>::value,\n                      const ScaledProduct<Derived> >::type\noperator*(const typename Derived::RealScalar& x,const ProductBase<Derived,Lhs,Rhs>& prod)\n{ return ScaledProduct<Derived>(prod.derived(), x); }\n\nnamespace internal {\ntemplate<typename NestedProduct>\nstruct traits<ScaledProduct<NestedProduct> >\n : traits<ProductBase<ScaledProduct<NestedProduct>,\n                         typename NestedProduct::_LhsNested,\n                         typename NestedProduct::_RhsNested> >\n{\n  typedef typename traits<NestedProduct>::StorageKind StorageKind;\n};\n}\n\ntemplate<typename NestedProduct>\nclass ScaledProduct\n  : public ProductBase<ScaledProduct<NestedProduct>,\n                       typename NestedProduct::_LhsNested,\n                       typename NestedProduct::_RhsNested>\n{\n  public:\n    typedef ProductBase<ScaledProduct<NestedProduct>,\n                       typename NestedProduct::_LhsNested,\n                       typename NestedProduct::_RhsNested> Base;\n    typedef typename Base::Scalar Scalar;\n    typedef typename Base::PlainObject PlainObject;\n//     EIGEN_PRODUCT_PUBLIC_INTERFACE(ScaledProduct)\n\n    ScaledProduct(const NestedProduct& prod, const Scalar& x)\n    : Base(prod.lhs(),prod.rhs()), m_prod(prod), m_alpha(x) {}\n\n    template<typename Dest>\n    inline void evalTo(Dest& dst) const { dst.setZero(); scaleAndAddTo(dst, Scalar(1)); }\n\n    template<typename Dest>\n    inline void addTo(Dest& dst) const { scaleAndAddTo(dst, Scalar(1)); }\n\n    template<typename Dest>\n    inline void subTo(Dest& dst) const { scaleAndAddTo(dst, Scalar(-1)); }\n\n    template<typename Dest>\n    inline void scaleAndAddTo(Dest& dst, const Scalar& a_alpha) const { m_prod.derived().scaleAndAddTo(dst,a_alpha * m_alpha); }\n\n    const Scalar& alpha() const { return m_alpha; }\n    \n  protected:\n    const NestedProduct& m_prod;\n    Scalar m_alpha;\n};\n\n/** \\internal\n  * Overloaded to perform an efficient C = (A*B).lazy() */\ntemplate<typename Derived>\ntemplate<typename ProductDerived, typename Lhs, typename Rhs>\nDerived& MatrixBase<Derived>::lazyAssign(const ProductBase<ProductDerived, Lhs,Rhs>& other)\n{\n  other.derived().evalTo(derived());\n  return derived();\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_PRODUCTBASE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/Random.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_RANDOM_H\n#define EIGEN_RANDOM_H\n\nnamespace Eigen { \n\nnamespace internal {\n\ntemplate<typename Scalar> struct scalar_random_op {\n  EIGEN_EMPTY_STRUCT_CTOR(scalar_random_op)\n  template<typename Index>\n  inline const Scalar operator() (Index, Index = 0) const { return random<Scalar>(); }\n};\n\ntemplate<typename Scalar>\nstruct functor_traits<scalar_random_op<Scalar> >\n{ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = false, IsRepeatable = false }; };\n\n} // end namespace internal\n\n/** \\returns a random matrix expression\n  *\n  * The parameters \\a rows and \\a cols are the number of rows and of columns of\n  * the returned matrix. Must be compatible with this MatrixBase type.\n  *\n  * This variant is meant to be used for dynamic-size matrix types. For fixed-size types,\n  * it is redundant to pass \\a rows and \\a cols as arguments, so Random() should be used\n  * instead.\n  *\n  * Example: \\include MatrixBase_random_int_int.cpp\n  * Output: \\verbinclude MatrixBase_random_int_int.out\n  *\n  * This expression has the \"evaluate before nesting\" flag so that it will be evaluated into\n  * a temporary matrix whenever it is nested in a larger expression. This prevents unexpected\n  * behavior with expressions involving random matrices.\n  *\n  * \\sa MatrixBase::setRandom(), MatrixBase::Random(Index), MatrixBase::Random()\n  */\ntemplate<typename Derived>\ninline const CwiseNullaryOp<internal::scalar_random_op<typename internal::traits<Derived>::Scalar>, Derived>\nDenseBase<Derived>::Random(Index rows, Index cols)\n{\n  return NullaryExpr(rows, cols, internal::scalar_random_op<Scalar>());\n}\n\n/** \\returns a random vector expression\n  *\n  * The parameter \\a size is the size of the returned vector.\n  * Must be compatible with this MatrixBase type.\n  *\n  * \\only_for_vectors\n  *\n  * This variant is meant to be used for dynamic-size vector types. For fixed-size types,\n  * it is redundant to pass \\a size as argument, so Random() should be used\n  * instead.\n  *\n  * Example: \\include MatrixBase_random_int.cpp\n  * Output: \\verbinclude MatrixBase_random_int.out\n  *\n  * This expression has the \"evaluate before nesting\" flag so that it will be evaluated into\n  * a temporary vector whenever it is nested in a larger expression. This prevents unexpected\n  * behavior with expressions involving random matrices.\n  *\n  * \\sa MatrixBase::setRandom(), MatrixBase::Random(Index,Index), MatrixBase::Random()\n  */\ntemplate<typename Derived>\ninline const CwiseNullaryOp<internal::scalar_random_op<typename internal::traits<Derived>::Scalar>, Derived>\nDenseBase<Derived>::Random(Index size)\n{\n  return NullaryExpr(size, internal::scalar_random_op<Scalar>());\n}\n\n/** \\returns a fixed-size random matrix or vector expression\n  *\n  * This variant is only for fixed-size MatrixBase types. For dynamic-size types, you\n  * need to use the variants taking size arguments.\n  *\n  * Example: \\include MatrixBase_random.cpp\n  * Output: \\verbinclude MatrixBase_random.out\n  *\n  * This expression has the \"evaluate before nesting\" flag so that it will be evaluated into\n  * a temporary matrix whenever it is nested in a larger expression. This prevents unexpected\n  * behavior with expressions involving random matrices.\n  *\n  * \\sa MatrixBase::setRandom(), MatrixBase::Random(Index,Index), MatrixBase::Random(Index)\n  */\ntemplate<typename Derived>\ninline const CwiseNullaryOp<internal::scalar_random_op<typename internal::traits<Derived>::Scalar>, Derived>\nDenseBase<Derived>::Random()\n{\n  return NullaryExpr(RowsAtCompileTime, ColsAtCompileTime, internal::scalar_random_op<Scalar>());\n}\n\n/** Sets all coefficients in this expression to random values.\n  *\n  * Example: \\include MatrixBase_setRandom.cpp\n  * Output: \\verbinclude MatrixBase_setRandom.out\n  *\n  * \\sa class CwiseNullaryOp, setRandom(Index), setRandom(Index,Index)\n  */\ntemplate<typename Derived>\ninline Derived& DenseBase<Derived>::setRandom()\n{\n  return *this = Random(rows(), cols());\n}\n\n/** Resizes to the given \\a newSize, and sets all coefficients in this expression to random values.\n  *\n  * \\only_for_vectors\n  *\n  * Example: \\include Matrix_setRandom_int.cpp\n  * Output: \\verbinclude Matrix_setRandom_int.out\n  *\n  * \\sa MatrixBase::setRandom(), setRandom(Index,Index), class CwiseNullaryOp, MatrixBase::Random()\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE Derived&\nPlainObjectBase<Derived>::setRandom(Index newSize)\n{\n  resize(newSize);\n  return setRandom();\n}\n\n/** Resizes to the given size, and sets all coefficients in this expression to random values.\n  *\n  * \\param nbRows the new number of rows\n  * \\param nbCols the new number of columns\n  *\n  * Example: \\include Matrix_setRandom_int_int.cpp\n  * Output: \\verbinclude Matrix_setRandom_int_int.out\n  *\n  * \\sa MatrixBase::setRandom(), setRandom(Index), class CwiseNullaryOp, MatrixBase::Random()\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE Derived&\nPlainObjectBase<Derived>::setRandom(Index nbRows, Index nbCols)\n{\n  resize(nbRows, nbCols);\n  return setRandom();\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_RANDOM_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/Redux.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_REDUX_H\n#define EIGEN_REDUX_H\n\nnamespace Eigen { \n\nnamespace internal {\n\n// TODO\n//  * implement other kind of vectorization\n//  * factorize code\n\n/***************************************************************************\n* Part 1 : the logic deciding a strategy for vectorization and unrolling\n***************************************************************************/\n\ntemplate<typename Func, typename Derived>\nstruct redux_traits\n{\npublic:\n  enum {\n    PacketSize = packet_traits<typename Derived::Scalar>::size,\n    InnerMaxSize = int(Derived::IsRowMajor)\n                 ? Derived::MaxColsAtCompileTime\n                 : Derived::MaxRowsAtCompileTime\n  };\n\n  enum {\n    MightVectorize = (int(Derived::Flags)&ActualPacketAccessBit)\n                  && (functor_traits<Func>::PacketAccess),\n    MayLinearVectorize = MightVectorize && (int(Derived::Flags)&LinearAccessBit),\n    MaySliceVectorize  = MightVectorize && int(InnerMaxSize)>=3*PacketSize\n  };\n\npublic:\n  enum {\n    Traversal = int(MayLinearVectorize) ? int(LinearVectorizedTraversal)\n              : int(MaySliceVectorize)  ? int(SliceVectorizedTraversal)\n                                        : int(DefaultTraversal)\n  };\n\npublic:\n  enum {\n    Cost = (  Derived::SizeAtCompileTime == Dynamic\n           || Derived::CoeffReadCost == Dynamic\n           || (Derived::SizeAtCompileTime!=1 && functor_traits<Func>::Cost == Dynamic)\n           ) ? Dynamic\n           : Derived::SizeAtCompileTime * Derived::CoeffReadCost\n               + (Derived::SizeAtCompileTime-1) * functor_traits<Func>::Cost,\n    UnrollingLimit = EIGEN_UNROLLING_LIMIT * (int(Traversal) == int(DefaultTraversal) ? 1 : int(PacketSize))\n  };\n\npublic:\n  enum {\n    Unrolling = Cost != Dynamic && Cost <= UnrollingLimit\n              ? CompleteUnrolling\n              : NoUnrolling\n  };\n};\n\n/***************************************************************************\n* Part 2 : unrollers\n***************************************************************************/\n\n/*** no vectorization ***/\n\ntemplate<typename Func, typename Derived, int Start, int Length>\nstruct redux_novec_unroller\n{\n  enum {\n    HalfLength = Length/2\n  };\n\n  typedef typename Derived::Scalar Scalar;\n\n  static EIGEN_STRONG_INLINE Scalar run(const Derived &mat, const Func& func)\n  {\n    return func(redux_novec_unroller<Func, Derived, Start, HalfLength>::run(mat,func),\n                redux_novec_unroller<Func, Derived, Start+HalfLength, Length-HalfLength>::run(mat,func));\n  }\n};\n\ntemplate<typename Func, typename Derived, int Start>\nstruct redux_novec_unroller<Func, Derived, Start, 1>\n{\n  enum {\n    outer = Start / Derived::InnerSizeAtCompileTime,\n    inner = Start % Derived::InnerSizeAtCompileTime\n  };\n\n  typedef typename Derived::Scalar Scalar;\n\n  static EIGEN_STRONG_INLINE Scalar run(const Derived &mat, const Func&)\n  {\n    return mat.coeffByOuterInner(outer, inner);\n  }\n};\n\n// This is actually dead code and will never be called. It is required\n// to prevent false warnings regarding failed inlining though\n// for 0 length run() will never be called at all.\ntemplate<typename Func, typename Derived, int Start>\nstruct redux_novec_unroller<Func, Derived, Start, 0>\n{\n  typedef typename Derived::Scalar Scalar;\n  static EIGEN_STRONG_INLINE Scalar run(const Derived&, const Func&) { return Scalar(); }\n};\n\n/*** vectorization ***/\n\ntemplate<typename Func, typename Derived, int Start, int Length>\nstruct redux_vec_unroller\n{\n  enum {\n    PacketSize = packet_traits<typename Derived::Scalar>::size,\n    HalfLength = Length/2\n  };\n\n  typedef typename Derived::Scalar Scalar;\n  typedef typename packet_traits<Scalar>::type PacketScalar;\n\n  static EIGEN_STRONG_INLINE PacketScalar run(const Derived &mat, const Func& func)\n  {\n    return func.packetOp(\n            redux_vec_unroller<Func, Derived, Start, HalfLength>::run(mat,func),\n            redux_vec_unroller<Func, Derived, Start+HalfLength, Length-HalfLength>::run(mat,func) );\n  }\n};\n\ntemplate<typename Func, typename Derived, int Start>\nstruct redux_vec_unroller<Func, Derived, Start, 1>\n{\n  enum {\n    index = Start * packet_traits<typename Derived::Scalar>::size,\n    outer = index / int(Derived::InnerSizeAtCompileTime),\n    inner = index % int(Derived::InnerSizeAtCompileTime),\n    alignment = (Derived::Flags & AlignedBit) ? Aligned : Unaligned\n  };\n\n  typedef typename Derived::Scalar Scalar;\n  typedef typename packet_traits<Scalar>::type PacketScalar;\n\n  static EIGEN_STRONG_INLINE PacketScalar run(const Derived &mat, const Func&)\n  {\n    return mat.template packetByOuterInner<alignment>(outer, inner);\n  }\n};\n\n/***************************************************************************\n* Part 3 : implementation of all cases\n***************************************************************************/\n\ntemplate<typename Func, typename Derived,\n         int Traversal = redux_traits<Func, Derived>::Traversal,\n         int Unrolling = redux_traits<Func, Derived>::Unrolling\n>\nstruct redux_impl;\n\ntemplate<typename Func, typename Derived>\nstruct redux_impl<Func, Derived, DefaultTraversal, NoUnrolling>\n{\n  typedef typename Derived::Scalar Scalar;\n  typedef typename Derived::Index Index;\n  static EIGEN_STRONG_INLINE Scalar run(const Derived& mat, const Func& func)\n  {\n    eigen_assert(mat.rows()>0 && mat.cols()>0 && \"you are using an empty matrix\");\n    Scalar res;\n    res = mat.coeffByOuterInner(0, 0);\n    for(Index i = 1; i < mat.innerSize(); ++i)\n      res = func(res, mat.coeffByOuterInner(0, i));\n    for(Index i = 1; i < mat.outerSize(); ++i)\n      for(Index j = 0; j < mat.innerSize(); ++j)\n        res = func(res, mat.coeffByOuterInner(i, j));\n    return res;\n  }\n};\n\ntemplate<typename Func, typename Derived>\nstruct redux_impl<Func,Derived, DefaultTraversal, CompleteUnrolling>\n  : public redux_novec_unroller<Func,Derived, 0, Derived::SizeAtCompileTime>\n{};\n\ntemplate<typename Func, typename Derived>\nstruct redux_impl<Func, Derived, LinearVectorizedTraversal, NoUnrolling>\n{\n  typedef typename Derived::Scalar Scalar;\n  typedef typename packet_traits<Scalar>::type PacketScalar;\n  typedef typename Derived::Index Index;\n\n  static Scalar run(const Derived& mat, const Func& func)\n  {\n    const Index size = mat.size();\n    eigen_assert(size && \"you are using an empty matrix\");\n    const Index packetSize = packet_traits<Scalar>::size;\n    const Index alignedStart = internal::first_aligned(mat);\n    enum {\n      alignment = bool(Derived::Flags & DirectAccessBit) || bool(Derived::Flags & AlignedBit)\n                ? Aligned : Unaligned\n    };\n    const Index alignedSize2 = ((size-alignedStart)/(2*packetSize))*(2*packetSize);\n    const Index alignedSize = ((size-alignedStart)/(packetSize))*(packetSize);\n    const Index alignedEnd2 = alignedStart + alignedSize2;\n    const Index alignedEnd  = alignedStart + alignedSize;\n    Scalar res;\n    if(alignedSize)\n    {\n      PacketScalar packet_res0 = mat.template packet<alignment>(alignedStart);\n      if(alignedSize>packetSize) // we have at least two packets to partly unroll the loop\n      {\n        PacketScalar packet_res1 = mat.template packet<alignment>(alignedStart+packetSize);\n        for(Index index = alignedStart + 2*packetSize; index < alignedEnd2; index += 2*packetSize)\n        {\n          packet_res0 = func.packetOp(packet_res0, mat.template packet<alignment>(index));\n          packet_res1 = func.packetOp(packet_res1, mat.template packet<alignment>(index+packetSize));\n        }\n\n        packet_res0 = func.packetOp(packet_res0,packet_res1);\n        if(alignedEnd>alignedEnd2)\n          packet_res0 = func.packetOp(packet_res0, mat.template packet<alignment>(alignedEnd2));\n      }\n      res = func.predux(packet_res0);\n\n      for(Index index = 0; index < alignedStart; ++index)\n        res = func(res,mat.coeff(index));\n\n      for(Index index = alignedEnd; index < size; ++index)\n        res = func(res,mat.coeff(index));\n    }\n    else // too small to vectorize anything.\n         // since this is dynamic-size hence inefficient anyway for such small sizes, don't try to optimize.\n    {\n      res = mat.coeff(0);\n      for(Index index = 1; index < size; ++index)\n        res = func(res,mat.coeff(index));\n    }\n\n    return res;\n  }\n};\n\n// NOTE: for SliceVectorizedTraversal we simply bypass unrolling\ntemplate<typename Func, typename Derived, int Unrolling>\nstruct redux_impl<Func, Derived, SliceVectorizedTraversal, Unrolling>\n{\n  typedef typename Derived::Scalar Scalar;\n  typedef typename packet_traits<Scalar>::type PacketScalar;\n  typedef typename Derived::Index Index;\n\n  static Scalar run(const Derived& mat, const Func& func)\n  {\n    eigen_assert(mat.rows()>0 && mat.cols()>0 && \"you are using an empty matrix\");\n    const Index innerSize = mat.innerSize();\n    const Index outerSize = mat.outerSize();\n    enum {\n      packetSize = packet_traits<Scalar>::size\n    };\n    const Index packetedInnerSize = ((innerSize)/packetSize)*packetSize;\n    Scalar res;\n    if(packetedInnerSize)\n    {\n      PacketScalar packet_res = mat.template packet<Unaligned>(0,0);\n      for(Index j=0; j<outerSize; ++j)\n        for(Index i=(j==0?packetSize:0); i<packetedInnerSize; i+=Index(packetSize))\n          packet_res = func.packetOp(packet_res, mat.template packetByOuterInner<Unaligned>(j,i));\n\n      res = func.predux(packet_res);\n      for(Index j=0; j<outerSize; ++j)\n        for(Index i=packetedInnerSize; i<innerSize; ++i)\n          res = func(res, mat.coeffByOuterInner(j,i));\n    }\n    else // too small to vectorize anything.\n         // since this is dynamic-size hence inefficient anyway for such small sizes, don't try to optimize.\n    {\n      res = redux_impl<Func, Derived, DefaultTraversal, NoUnrolling>::run(mat, func);\n    }\n\n    return res;\n  }\n};\n\ntemplate<typename Func, typename Derived>\nstruct redux_impl<Func, Derived, LinearVectorizedTraversal, CompleteUnrolling>\n{\n  typedef typename Derived::Scalar Scalar;\n  typedef typename packet_traits<Scalar>::type PacketScalar;\n  enum {\n    PacketSize = packet_traits<Scalar>::size,\n    Size = Derived::SizeAtCompileTime,\n    VectorizedSize = (Size / PacketSize) * PacketSize\n  };\n  static EIGEN_STRONG_INLINE Scalar run(const Derived& mat, const Func& func)\n  {\n    eigen_assert(mat.rows()>0 && mat.cols()>0 && \"you are using an empty matrix\");\n    Scalar res = func.predux(redux_vec_unroller<Func, Derived, 0, Size / PacketSize>::run(mat,func));\n    if (VectorizedSize != Size)\n      res = func(res,redux_novec_unroller<Func, Derived, VectorizedSize, Size-VectorizedSize>::run(mat,func));\n    return res;\n  }\n};\n\n} // end namespace internal\n\n/***************************************************************************\n* Part 4 : public API\n***************************************************************************/\n\n\n/** \\returns the result of a full redux operation on the whole matrix or vector using \\a func\n  *\n  * The template parameter \\a BinaryOp is the type of the functor \\a func which must be\n  * an associative operator. Both current STL and TR1 functor styles are handled.\n  *\n  * \\sa DenseBase::sum(), DenseBase::minCoeff(), DenseBase::maxCoeff(), MatrixBase::colwise(), MatrixBase::rowwise()\n  */\ntemplate<typename Derived>\ntemplate<typename Func>\nEIGEN_STRONG_INLINE typename internal::result_of<Func(typename internal::traits<Derived>::Scalar)>::type\nDenseBase<Derived>::redux(const Func& func) const\n{\n  typedef typename internal::remove_all<typename Derived::Nested>::type ThisNested;\n  return internal::redux_impl<Func, ThisNested>\n            ::run(derived(), func);\n}\n\n/** \\returns the minimum of all coefficients of \\c *this.\n  * \\warning the result is undefined if \\c *this contains NaN.\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar\nDenseBase<Derived>::minCoeff() const\n{\n  return this->redux(Eigen::internal::scalar_min_op<Scalar>());\n}\n\n/** \\returns the maximum of all coefficients of \\c *this.\n  * \\warning the result is undefined if \\c *this contains NaN.\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar\nDenseBase<Derived>::maxCoeff() const\n{\n  return this->redux(Eigen::internal::scalar_max_op<Scalar>());\n}\n\n/** \\returns the sum of all coefficients of *this\n  *\n  * \\sa trace(), prod(), mean()\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar\nDenseBase<Derived>::sum() const\n{\n  if(SizeAtCompileTime==0 || (SizeAtCompileTime==Dynamic && size()==0))\n    return Scalar(0);\n  return this->redux(Eigen::internal::scalar_sum_op<Scalar>());\n}\n\n/** \\returns the mean of all coefficients of *this\n*\n* \\sa trace(), prod(), sum()\n*/\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar\nDenseBase<Derived>::mean() const\n{\n  return Scalar(this->redux(Eigen::internal::scalar_sum_op<Scalar>())) / Scalar(this->size());\n}\n\n/** \\returns the product of all coefficients of *this\n  *\n  * Example: \\include MatrixBase_prod.cpp\n  * Output: \\verbinclude MatrixBase_prod.out\n  *\n  * \\sa sum(), mean(), trace()\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar\nDenseBase<Derived>::prod() const\n{\n  if(SizeAtCompileTime==0 || (SizeAtCompileTime==Dynamic && size()==0))\n    return Scalar(1);\n  return this->redux(Eigen::internal::scalar_product_op<Scalar>());\n}\n\n/** \\returns the trace of \\c *this, i.e. the sum of the coefficients on the main diagonal.\n  *\n  * \\c *this can be any matrix, not necessarily square.\n  *\n  * \\sa diagonal(), sum()\n  */\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar\nMatrixBase<Derived>::trace() const\n{\n  return derived().diagonal().sum();\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_REDUX_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/Ref.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_REF_H\n#define EIGEN_REF_H\n\nnamespace Eigen { \n\ntemplate<typename Derived> class RefBase;\ntemplate<typename PlainObjectType, int Options = 0,\n         typename StrideType = typename internal::conditional<PlainObjectType::IsVectorAtCompileTime,InnerStride<1>,OuterStride<> >::type > class Ref;\n\n/** \\class Ref\n  * \\ingroup Core_Module\n  *\n  * \\brief A matrix or vector expression mapping an existing expressions\n  *\n  * \\tparam PlainObjectType the equivalent matrix type of the mapped data\n  * \\tparam Options specifies whether the pointer is \\c #Aligned, or \\c #Unaligned.\n  *                The default is \\c #Unaligned.\n  * \\tparam StrideType optionally specifies strides. By default, Ref implies a contiguous storage along the inner dimension (inner stride==1),\n  *                   but accept a variable outer stride (leading dimension).\n  *                   This can be overridden by specifying strides.\n  *                   The type passed here must be a specialization of the Stride template, see examples below.\n  *\n  * This class permits to write non template functions taking Eigen's object as parameters while limiting the number of copies.\n  * A Ref<> object can represent either a const expression or a l-value:\n  * \\code\n  * // in-out argument:\n  * void foo1(Ref<VectorXf> x);\n  *\n  * // read-only const argument:\n  * void foo2(const Ref<const VectorXf>& x);\n  * \\endcode\n  *\n  * In the in-out case, the input argument must satisfies the constraints of the actual Ref<> type, otherwise a compilation issue will be triggered.\n  * By default, a Ref<VectorXf> can reference any dense vector expression of float having a contiguous memory layout.\n  * Likewise, a Ref<MatrixXf> can reference any column major dense matrix expression of float whose column's elements are contiguously stored with\n  * the possibility to have a constant space inbetween each column, i.e.: the inner stride mmust be equal to 1, but the outer-stride (or leading dimension),\n  * can be greater than the number of rows.\n  *\n  * In the const case, if the input expression does not match the above requirement, then it is evaluated into a temporary before being passed to the function.\n  * Here are some examples:\n  * \\code\n  * MatrixXf A;\n  * VectorXf a;\n  * foo1(a.head());             // OK\n  * foo1(A.col());              // OK\n  * foo1(A.row());              // compilation error because here innerstride!=1\n  * foo2(A.row());              // The row is copied into a contiguous temporary\n  * foo2(2*a);                  // The expression is evaluated into a temporary\n  * foo2(A.col().segment(2,4)); // No temporary\n  * \\endcode\n  *\n  * The range of inputs that can be referenced without temporary can be enlarged using the last two template parameter.\n  * Here is an example accepting an innerstride!=1:\n  * \\code\n  * // in-out argument:\n  * void foo3(Ref<VectorXf,0,InnerStride<> > x);\n  * foo3(A.row());              // OK\n  * \\endcode\n  * The downside here is that the function foo3 might be significantly slower than foo1 because it won't be able to exploit vectorization, and will involved more\n  * expensive address computations even if the input is contiguously stored in memory. To overcome this issue, one might propose to overloads internally calling a\n  * template function, e.g.:\n  * \\code\n  * // in the .h:\n  * void foo(const Ref<MatrixXf>& A);\n  * void foo(const Ref<MatrixXf,0,Stride<> >& A);\n  *\n  * // in the .cpp:\n  * template<typename TypeOfA> void foo_impl(const TypeOfA& A) {\n  *     ... // crazy code goes here\n  * }\n  * void foo(const Ref<MatrixXf>& A) { foo_impl(A); }\n  * void foo(const Ref<MatrixXf,0,Stride<> >& A) { foo_impl(A); }\n  * \\endcode\n  *\n  *\n  * \\sa PlainObjectBase::Map(), \\ref TopicStorageOrders\n  */\n\nnamespace internal {\n\ntemplate<typename _PlainObjectType, int _Options, typename _StrideType>\nstruct traits<Ref<_PlainObjectType, _Options, _StrideType> >\n  : public traits<Map<_PlainObjectType, _Options, _StrideType> >\n{\n  typedef _PlainObjectType PlainObjectType;\n  typedef _StrideType StrideType;\n  enum {\n    Options = _Options,\n    Flags = traits<Map<_PlainObjectType, _Options, _StrideType> >::Flags | NestByRefBit\n  };\n\n  template<typename Derived> struct match {\n    enum {\n      HasDirectAccess = internal::has_direct_access<Derived>::ret,\n      StorageOrderMatch = PlainObjectType::IsVectorAtCompileTime || Derived::IsVectorAtCompileTime || ((PlainObjectType::Flags&RowMajorBit)==(Derived::Flags&RowMajorBit)),\n      InnerStrideMatch = int(StrideType::InnerStrideAtCompileTime)==int(Dynamic)\n                      || int(StrideType::InnerStrideAtCompileTime)==int(Derived::InnerStrideAtCompileTime)\n                      || (int(StrideType::InnerStrideAtCompileTime)==0 && int(Derived::InnerStrideAtCompileTime)==1),\n      OuterStrideMatch = Derived::IsVectorAtCompileTime\n                      || int(StrideType::OuterStrideAtCompileTime)==int(Dynamic) || int(StrideType::OuterStrideAtCompileTime)==int(Derived::OuterStrideAtCompileTime),\n      AlignmentMatch = (_Options!=Aligned) || ((PlainObjectType::Flags&AlignedBit)==0) || ((traits<Derived>::Flags&AlignedBit)==AlignedBit),\n      ScalarTypeMatch = internal::is_same<typename PlainObjectType::Scalar, typename Derived::Scalar>::value,\n      MatchAtCompileTime = HasDirectAccess && StorageOrderMatch && InnerStrideMatch && OuterStrideMatch && AlignmentMatch && ScalarTypeMatch\n    };\n    typedef typename internal::conditional<MatchAtCompileTime,internal::true_type,internal::false_type>::type type;\n  };\n  \n};\n\ntemplate<typename Derived>\nstruct traits<RefBase<Derived> > : public traits<Derived> {};\n\n}\n\ntemplate<typename Derived> class RefBase\n : public MapBase<Derived>\n{\n  typedef typename internal::traits<Derived>::PlainObjectType PlainObjectType;\n  typedef typename internal::traits<Derived>::StrideType StrideType;\n\npublic:\n\n  typedef MapBase<Derived> Base;\n  EIGEN_DENSE_PUBLIC_INTERFACE(RefBase)\n\n  inline Index innerStride() const\n  {\n    return StrideType::InnerStrideAtCompileTime != 0 ? m_stride.inner() : 1;\n  }\n\n  inline Index outerStride() const\n  {\n    return StrideType::OuterStrideAtCompileTime != 0 ? m_stride.outer()\n         : IsVectorAtCompileTime ? this->size()\n         : int(Flags)&RowMajorBit ? this->cols()\n         : this->rows();\n  }\n\n  RefBase()\n    : Base(0,RowsAtCompileTime==Dynamic?0:RowsAtCompileTime,ColsAtCompileTime==Dynamic?0:ColsAtCompileTime),\n      // Stride<> does not allow default ctor for Dynamic strides, so let' initialize it with dummy values:\n      m_stride(StrideType::OuterStrideAtCompileTime==Dynamic?0:StrideType::OuterStrideAtCompileTime,\n               StrideType::InnerStrideAtCompileTime==Dynamic?0:StrideType::InnerStrideAtCompileTime)\n  {}\n  \n  EIGEN_INHERIT_ASSIGNMENT_OPERATORS(RefBase)\n\nprotected:\n\n  typedef Stride<StrideType::OuterStrideAtCompileTime,StrideType::InnerStrideAtCompileTime> StrideBase;\n\n  template<typename Expression>\n  void construct(Expression& expr)\n  {\n    if(PlainObjectType::RowsAtCompileTime==1)\n    {\n      eigen_assert(expr.rows()==1 || expr.cols()==1);\n      ::new (static_cast<Base*>(this)) Base(expr.data(), 1, expr.size());\n    }\n    else if(PlainObjectType::ColsAtCompileTime==1)\n    {\n      eigen_assert(expr.rows()==1 || expr.cols()==1);\n      ::new (static_cast<Base*>(this)) Base(expr.data(), expr.size(), 1);\n    }\n    else\n      ::new (static_cast<Base*>(this)) Base(expr.data(), expr.rows(), expr.cols());\n    \n    if(Expression::IsVectorAtCompileTime && (!PlainObjectType::IsVectorAtCompileTime) && ((Expression::Flags&RowMajorBit)!=(PlainObjectType::Flags&RowMajorBit)))\n      ::new (&m_stride) StrideBase(expr.innerStride(), StrideType::InnerStrideAtCompileTime==0?0:1);\n    else\n      ::new (&m_stride) StrideBase(StrideType::OuterStrideAtCompileTime==0?0:expr.outerStride(),\n                                   StrideType::InnerStrideAtCompileTime==0?0:expr.innerStride());    \n  }\n\n  StrideBase m_stride;\n};\n\n\ntemplate<typename PlainObjectType, int Options, typename StrideType> class Ref\n  : public RefBase<Ref<PlainObjectType, Options, StrideType> >\n{\n  private:\n    typedef internal::traits<Ref> Traits;\n    template<typename Derived>\n    inline Ref(const PlainObjectBase<Derived>& expr,\n               typename internal::enable_if<bool(Traits::template match<Derived>::MatchAtCompileTime),Derived>::type* = 0);\n  public:\n\n    typedef RefBase<Ref> Base;\n    EIGEN_DENSE_PUBLIC_INTERFACE(Ref)\n\n\n    #ifndef EIGEN_PARSED_BY_DOXYGEN\n    template<typename Derived>\n    inline Ref(PlainObjectBase<Derived>& expr,\n               typename internal::enable_if<bool(Traits::template match<Derived>::MatchAtCompileTime),Derived>::type* = 0)\n    {\n      EIGEN_STATIC_ASSERT(static_cast<bool>(Traits::template match<Derived>::MatchAtCompileTime), STORAGE_LAYOUT_DOES_NOT_MATCH);\n      Base::construct(expr.derived());\n    }\n    template<typename Derived>\n    inline Ref(const DenseBase<Derived>& expr,\n               typename internal::enable_if<bool(Traits::template match<Derived>::MatchAtCompileTime),Derived>::type* = 0)\n    #else\n    template<typename Derived>\n    inline Ref(DenseBase<Derived>& expr)\n    #endif\n    {\n      EIGEN_STATIC_ASSERT(static_cast<bool>(internal::is_lvalue<Derived>::value), THIS_EXPRESSION_IS_NOT_A_LVALUE__IT_IS_READ_ONLY);\n      EIGEN_STATIC_ASSERT(static_cast<bool>(Traits::template match<Derived>::MatchAtCompileTime), STORAGE_LAYOUT_DOES_NOT_MATCH);\n      enum { THIS_EXPRESSION_IS_NOT_A_LVALUE__IT_IS_READ_ONLY = Derived::ThisConstantIsPrivateInPlainObjectBase};\n      Base::construct(expr.const_cast_derived());\n    }\n\n    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Ref)\n\n};\n\n// this is the const ref version\ntemplate<typename TPlainObjectType, int Options, typename StrideType> class Ref<const TPlainObjectType, Options, StrideType>\n  : public RefBase<Ref<const TPlainObjectType, Options, StrideType> >\n{\n    typedef internal::traits<Ref> Traits;\n  public:\n\n    typedef RefBase<Ref> Base;\n    EIGEN_DENSE_PUBLIC_INTERFACE(Ref)\n\n    template<typename Derived>\n    inline Ref(const DenseBase<Derived>& expr,\n               typename internal::enable_if<bool(Traits::template match<Derived>::ScalarTypeMatch),Derived>::type* = 0)\n    {\n//      std::cout << match_helper<Derived>::HasDirectAccess << \",\" << match_helper<Derived>::OuterStrideMatch << \",\" << match_helper<Derived>::InnerStrideMatch << \"\\n\";\n//      std::cout << int(StrideType::OuterStrideAtCompileTime) << \" - \" << int(Derived::OuterStrideAtCompileTime) << \"\\n\";\n//      std::cout << int(StrideType::InnerStrideAtCompileTime) << \" - \" << int(Derived::InnerStrideAtCompileTime) << \"\\n\";\n      construct(expr.derived(), typename Traits::template match<Derived>::type());\n    }\n    \n    inline Ref(const Ref& other) : Base(other) {\n      // copy constructor shall not copy the m_object, to avoid unnecessary malloc and copy\n    }\n\n    template<typename OtherRef>\n    inline Ref(const RefBase<OtherRef>& other) {\n      construct(other.derived(), typename Traits::template match<OtherRef>::type());\n    }\n\n  protected:\n\n    template<typename Expression>\n    void construct(const Expression& expr,internal::true_type)\n    {\n      Base::construct(expr);\n    }\n\n    template<typename Expression>\n    void construct(const Expression& expr, internal::false_type)\n    {\n      m_object.lazyAssign(expr);\n      Base::construct(m_object);\n    }\n\n  protected:\n    TPlainObjectType m_object;\n};\n\n} // end namespace Eigen\n\n#endif // EIGEN_REF_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/Replicate.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_REPLICATE_H\n#define EIGEN_REPLICATE_H\n\nnamespace Eigen { \n\n/**\n  * \\class Replicate\n  * \\ingroup Core_Module\n  *\n  * \\brief Expression of the multiple replication of a matrix or vector\n  *\n  * \\param MatrixType the type of the object we are replicating\n  *\n  * This class represents an expression of the multiple replication of a matrix or vector.\n  * It is the return type of DenseBase::replicate() and most of the time\n  * this is the only way it is used.\n  *\n  * \\sa DenseBase::replicate()\n  */\n\nnamespace internal {\ntemplate<typename MatrixType,int RowFactor,int ColFactor>\nstruct traits<Replicate<MatrixType,RowFactor,ColFactor> >\n : traits<MatrixType>\n{\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename traits<MatrixType>::StorageKind StorageKind;\n  typedef typename traits<MatrixType>::XprKind XprKind;\n  enum {\n    Factor = (RowFactor==Dynamic || ColFactor==Dynamic) ? Dynamic : RowFactor*ColFactor\n  };\n  typedef typename nested<MatrixType,Factor>::type MatrixTypeNested;\n  typedef typename remove_reference<MatrixTypeNested>::type _MatrixTypeNested;\n  enum {\n    RowsAtCompileTime = RowFactor==Dynamic || int(MatrixType::RowsAtCompileTime)==Dynamic\n                      ? Dynamic\n                      : RowFactor * MatrixType::RowsAtCompileTime,\n    ColsAtCompileTime = ColFactor==Dynamic || int(MatrixType::ColsAtCompileTime)==Dynamic\n                      ? Dynamic\n                      : ColFactor * MatrixType::ColsAtCompileTime,\n   //FIXME we don't propagate the max sizes !!!\n    MaxRowsAtCompileTime = RowsAtCompileTime,\n    MaxColsAtCompileTime = ColsAtCompileTime,\n    IsRowMajor = MaxRowsAtCompileTime==1 && MaxColsAtCompileTime!=1 ? 1\n               : MaxColsAtCompileTime==1 && MaxRowsAtCompileTime!=1 ? 0\n               : (MatrixType::Flags & RowMajorBit) ? 1 : 0,\n    Flags = (_MatrixTypeNested::Flags & HereditaryBits & ~RowMajorBit) | (IsRowMajor ? RowMajorBit : 0),\n    CoeffReadCost = _MatrixTypeNested::CoeffReadCost\n  };\n};\n}\n\ntemplate<typename MatrixType,int RowFactor,int ColFactor> class Replicate\n  : public internal::dense_xpr_base< Replicate<MatrixType,RowFactor,ColFactor> >::type\n{\n    typedef typename internal::traits<Replicate>::MatrixTypeNested MatrixTypeNested;\n    typedef typename internal::traits<Replicate>::_MatrixTypeNested _MatrixTypeNested;\n  public:\n\n    typedef typename internal::dense_xpr_base<Replicate>::type Base;\n    EIGEN_DENSE_PUBLIC_INTERFACE(Replicate)\n\n    template<typename OriginalMatrixType>\n    inline explicit Replicate(const OriginalMatrixType& a_matrix)\n      : m_matrix(a_matrix), m_rowFactor(RowFactor), m_colFactor(ColFactor)\n    {\n      EIGEN_STATIC_ASSERT((internal::is_same<typename internal::remove_const<MatrixType>::type,OriginalMatrixType>::value),\n                          THE_MATRIX_OR_EXPRESSION_THAT_YOU_PASSED_DOES_NOT_HAVE_THE_EXPECTED_TYPE)\n      eigen_assert(RowFactor!=Dynamic && ColFactor!=Dynamic);\n    }\n\n    template<typename OriginalMatrixType>\n    inline Replicate(const OriginalMatrixType& a_matrix, Index rowFactor, Index colFactor)\n      : m_matrix(a_matrix), m_rowFactor(rowFactor), m_colFactor(colFactor)\n    {\n      EIGEN_STATIC_ASSERT((internal::is_same<typename internal::remove_const<MatrixType>::type,OriginalMatrixType>::value),\n                          THE_MATRIX_OR_EXPRESSION_THAT_YOU_PASSED_DOES_NOT_HAVE_THE_EXPECTED_TYPE)\n    }\n\n    inline Index rows() const { return m_matrix.rows() * m_rowFactor.value(); }\n    inline Index cols() const { return m_matrix.cols() * m_colFactor.value(); }\n\n    inline Scalar coeff(Index rowId, Index colId) const\n    {\n      // try to avoid using modulo; this is a pure optimization strategy\n      const Index actual_row  = internal::traits<MatrixType>::RowsAtCompileTime==1 ? 0\n                            : RowFactor==1 ? rowId\n                            : rowId%m_matrix.rows();\n      const Index actual_col  = internal::traits<MatrixType>::ColsAtCompileTime==1 ? 0\n                            : ColFactor==1 ? colId\n                            : colId%m_matrix.cols();\n\n      return m_matrix.coeff(actual_row, actual_col);\n    }\n    template<int LoadMode>\n    inline PacketScalar packet(Index rowId, Index colId) const\n    {\n      const Index actual_row  = internal::traits<MatrixType>::RowsAtCompileTime==1 ? 0\n                            : RowFactor==1 ? rowId\n                            : rowId%m_matrix.rows();\n      const Index actual_col  = internal::traits<MatrixType>::ColsAtCompileTime==1 ? 0\n                            : ColFactor==1 ? colId\n                            : colId%m_matrix.cols();\n\n      return m_matrix.template packet<LoadMode>(actual_row, actual_col);\n    }\n\n    const _MatrixTypeNested& nestedExpression() const\n    { \n      return m_matrix; \n    }\n\n  protected:\n    MatrixTypeNested m_matrix;\n    const internal::variable_if_dynamic<Index, RowFactor> m_rowFactor;\n    const internal::variable_if_dynamic<Index, ColFactor> m_colFactor;\n};\n\n/**\n  * \\return an expression of the replication of \\c *this\n  *\n  * Example: \\include MatrixBase_replicate.cpp\n  * Output: \\verbinclude MatrixBase_replicate.out\n  *\n  * \\sa VectorwiseOp::replicate(), DenseBase::replicate(Index,Index), class Replicate\n  */\ntemplate<typename Derived>\ntemplate<int RowFactor, int ColFactor>\nconst Replicate<Derived,RowFactor,ColFactor>\nDenseBase<Derived>::replicate() const\n{\n  return Replicate<Derived,RowFactor,ColFactor>(derived());\n}\n\n/**\n  * \\return an expression of the replication of \\c *this\n  *\n  * Example: \\include MatrixBase_replicate_int_int.cpp\n  * Output: \\verbinclude MatrixBase_replicate_int_int.out\n  *\n  * \\sa VectorwiseOp::replicate(), DenseBase::replicate<int,int>(), class Replicate\n  */\ntemplate<typename Derived>\nconst typename DenseBase<Derived>::ReplicateReturnType\nDenseBase<Derived>::replicate(Index rowFactor,Index colFactor) const\n{\n  return Replicate<Derived,Dynamic,Dynamic>(derived(),rowFactor,colFactor);\n}\n\n/**\n  * \\return an expression of the replication of each column (or row) of \\c *this\n  *\n  * Example: \\include DirectionWise_replicate_int.cpp\n  * Output: \\verbinclude DirectionWise_replicate_int.out\n  *\n  * \\sa VectorwiseOp::replicate(), DenseBase::replicate(), class Replicate\n  */\ntemplate<typename ExpressionType, int Direction>\nconst typename VectorwiseOp<ExpressionType,Direction>::ReplicateReturnType\nVectorwiseOp<ExpressionType,Direction>::replicate(Index factor) const\n{\n  return typename VectorwiseOp<ExpressionType,Direction>::ReplicateReturnType\n          (_expression(),Direction==Vertical?factor:1,Direction==Horizontal?factor:1);\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_REPLICATE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/ReturnByValue.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2009-2010 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_RETURNBYVALUE_H\n#define EIGEN_RETURNBYVALUE_H\n\nnamespace Eigen {\n\n/** \\class ReturnByValue\n  * \\ingroup Core_Module\n  *\n  */\n\nnamespace internal {\n\ntemplate<typename Derived>\nstruct traits<ReturnByValue<Derived> >\n  : public traits<typename traits<Derived>::ReturnType>\n{\n  enum {\n    // We're disabling the DirectAccess because e.g. the constructor of\n    // the Block-with-DirectAccess expression requires to have a coeffRef method.\n    // Also, we don't want to have to implement the stride stuff.\n    Flags = (traits<typename traits<Derived>::ReturnType>::Flags\n             | EvalBeforeNestingBit) & ~DirectAccessBit\n  };\n};\n\n/* The ReturnByValue object doesn't even have a coeff() method.\n * So the only way that nesting it in an expression can work, is by evaluating it into a plain matrix.\n * So internal::nested always gives the plain return matrix type.\n *\n * FIXME: I don't understand why we need this specialization: isn't this taken care of by the EvalBeforeNestingBit ??\n */\ntemplate<typename Derived,int n,typename PlainObject>\nstruct nested<ReturnByValue<Derived>, n, PlainObject>\n{\n  typedef typename traits<Derived>::ReturnType type;\n};\n\n} // end namespace internal\n\ntemplate<typename Derived> class ReturnByValue\n  : internal::no_assignment_operator, public internal::dense_xpr_base< ReturnByValue<Derived> >::type\n{\n  public:\n    typedef typename internal::traits<Derived>::ReturnType ReturnType;\n\n    typedef typename internal::dense_xpr_base<ReturnByValue>::type Base;\n    EIGEN_DENSE_PUBLIC_INTERFACE(ReturnByValue)\n\n    template<typename Dest>\n    inline void evalTo(Dest& dst) const\n    { static_cast<const Derived*>(this)->evalTo(dst); }\n    inline Index rows() const { return static_cast<const Derived*>(this)->rows(); }\n    inline Index cols() const { return static_cast<const Derived*>(this)->cols(); }\n\n#ifndef EIGEN_PARSED_BY_DOXYGEN\n#define Unusable YOU_ARE_TRYING_TO_ACCESS_A_SINGLE_COEFFICIENT_IN_A_SPECIAL_EXPRESSION_WHERE_THAT_IS_NOT_ALLOWED_BECAUSE_THAT_WOULD_BE_INEFFICIENT\n    class Unusable{\n      Unusable(const Unusable&) {}\n      Unusable& operator=(const Unusable&) {return *this;}\n    };\n    const Unusable& coeff(Index) const { return *reinterpret_cast<const Unusable*>(this); }\n    const Unusable& coeff(Index,Index) const { return *reinterpret_cast<const Unusable*>(this); }\n    Unusable& coeffRef(Index) { return *reinterpret_cast<Unusable*>(this); }\n    Unusable& coeffRef(Index,Index) { return *reinterpret_cast<Unusable*>(this); }\n    template<int LoadMode>  Unusable& packet(Index) const;\n    template<int LoadMode>  Unusable& packet(Index, Index) const;\n#endif\n};\n\ntemplate<typename Derived>\ntemplate<typename OtherDerived>\nDerived& DenseBase<Derived>::operator=(const ReturnByValue<OtherDerived>& other)\n{\n  other.evalTo(derived());\n  return derived();\n}\n\ntemplate<typename Derived>\ntemplate<typename OtherDerived>\nDerived& DenseBase<Derived>::lazyAssign(const ReturnByValue<OtherDerived>& other)\n{\n  other.evalTo(derived());\n  return derived();\n}\n\n\n} // end namespace Eigen\n\n#endif // EIGEN_RETURNBYVALUE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/Reverse.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n// Copyright (C) 2009 Ricard Marxer <email@ricardmarxer.com>\n// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_REVERSE_H\n#define EIGEN_REVERSE_H\n\nnamespace Eigen { \n\n/** \\class Reverse\n  * \\ingroup Core_Module\n  *\n  * \\brief Expression of the reverse of a vector or matrix\n  *\n  * \\param MatrixType the type of the object of which we are taking the reverse\n  *\n  * This class represents an expression of the reverse of a vector.\n  * It is the return type of MatrixBase::reverse() and VectorwiseOp::reverse()\n  * and most of the time this is the only way it is used.\n  *\n  * \\sa MatrixBase::reverse(), VectorwiseOp::reverse()\n  */\n\nnamespace internal {\n\ntemplate<typename MatrixType, int Direction>\nstruct traits<Reverse<MatrixType, Direction> >\n : traits<MatrixType>\n{\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename traits<MatrixType>::StorageKind StorageKind;\n  typedef typename traits<MatrixType>::XprKind XprKind;\n  typedef typename nested<MatrixType>::type MatrixTypeNested;\n  typedef typename remove_reference<MatrixTypeNested>::type _MatrixTypeNested;\n  enum {\n    RowsAtCompileTime = MatrixType::RowsAtCompileTime,\n    ColsAtCompileTime = MatrixType::ColsAtCompileTime,\n    MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,\n    MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime,\n\n    // let's enable LinearAccess only with vectorization because of the product overhead\n    LinearAccess = ( (Direction==BothDirections) && (int(_MatrixTypeNested::Flags)&PacketAccessBit) )\n                 ? LinearAccessBit : 0,\n\n    Flags = int(_MatrixTypeNested::Flags) & (HereditaryBits | LvalueBit | PacketAccessBit | LinearAccess),\n\n    CoeffReadCost = _MatrixTypeNested::CoeffReadCost\n  };\n};\n\ntemplate<typename PacketScalar, bool ReversePacket> struct reverse_packet_cond\n{\n  static inline PacketScalar run(const PacketScalar& x) { return preverse(x); }\n};\n\ntemplate<typename PacketScalar> struct reverse_packet_cond<PacketScalar,false>\n{\n  static inline PacketScalar run(const PacketScalar& x) { return x; }\n};\n\n} // end namespace internal \n\ntemplate<typename MatrixType, int Direction> class Reverse\n  : public internal::dense_xpr_base< Reverse<MatrixType, Direction> >::type\n{\n  public:\n\n    typedef typename internal::dense_xpr_base<Reverse>::type Base;\n    EIGEN_DENSE_PUBLIC_INTERFACE(Reverse)\n    using Base::IsRowMajor;\n\n    // next line is necessary because otherwise const version of operator()\n    // is hidden by non-const version defined in this file\n    using Base::operator(); \n\n  protected:\n    enum {\n      PacketSize = internal::packet_traits<Scalar>::size,\n      IsColMajor = !IsRowMajor,\n      ReverseRow = (Direction == Vertical)   || (Direction == BothDirections),\n      ReverseCol = (Direction == Horizontal) || (Direction == BothDirections),\n      OffsetRow  = ReverseRow && IsColMajor ? PacketSize : 1,\n      OffsetCol  = ReverseCol && IsRowMajor ? PacketSize : 1,\n      ReversePacket = (Direction == BothDirections)\n                    || ((Direction == Vertical)   && IsColMajor)\n                    || ((Direction == Horizontal) && IsRowMajor)\n    };\n    typedef internal::reverse_packet_cond<PacketScalar,ReversePacket> reverse_packet;\n  public:\n\n    inline Reverse(const MatrixType& matrix) : m_matrix(matrix) { }\n\n    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Reverse)\n\n    inline Index rows() const { return m_matrix.rows(); }\n    inline Index cols() const { return m_matrix.cols(); }\n\n    inline Index innerStride() const\n    {\n      return -m_matrix.innerStride();\n    }\n\n    inline Scalar& operator()(Index row, Index col)\n    {\n      eigen_assert(row >= 0 && row < rows() && col >= 0 && col < cols());\n      return coeffRef(row, col);\n    }\n\n    inline Scalar& coeffRef(Index row, Index col)\n    {\n      return m_matrix.const_cast_derived().coeffRef(ReverseRow ? m_matrix.rows() - row - 1 : row,\n                                                    ReverseCol ? m_matrix.cols() - col - 1 : col);\n    }\n\n    inline CoeffReturnType coeff(Index row, Index col) const\n    {\n      return m_matrix.coeff(ReverseRow ? m_matrix.rows() - row - 1 : row,\n                            ReverseCol ? m_matrix.cols() - col - 1 : col);\n    }\n\n    inline CoeffReturnType coeff(Index index) const\n    {\n      return m_matrix.coeff(m_matrix.size() - index - 1);\n    }\n\n    inline Scalar& coeffRef(Index index)\n    {\n      return m_matrix.const_cast_derived().coeffRef(m_matrix.size() - index - 1);\n    }\n\n    inline Scalar& operator()(Index index)\n    {\n      eigen_assert(index >= 0 && index < m_matrix.size());\n      return coeffRef(index);\n    }\n\n    template<int LoadMode>\n    inline const PacketScalar packet(Index row, Index col) const\n    {\n      return reverse_packet::run(m_matrix.template packet<LoadMode>(\n                                    ReverseRow ? m_matrix.rows() - row - OffsetRow : row,\n                                    ReverseCol ? m_matrix.cols() - col - OffsetCol : col));\n    }\n\n    template<int LoadMode>\n    inline void writePacket(Index row, Index col, const PacketScalar& x)\n    {\n      m_matrix.const_cast_derived().template writePacket<LoadMode>(\n                                      ReverseRow ? m_matrix.rows() - row - OffsetRow : row,\n                                      ReverseCol ? m_matrix.cols() - col - OffsetCol : col,\n                                      reverse_packet::run(x));\n    }\n\n    template<int LoadMode>\n    inline const PacketScalar packet(Index index) const\n    {\n      return internal::preverse(m_matrix.template packet<LoadMode>( m_matrix.size() - index - PacketSize ));\n    }\n\n    template<int LoadMode>\n    inline void writePacket(Index index, const PacketScalar& x)\n    {\n      m_matrix.const_cast_derived().template writePacket<LoadMode>(m_matrix.size() - index - PacketSize, internal::preverse(x));\n    }\n\n    const typename internal::remove_all<typename MatrixType::Nested>::type& \n    nestedExpression() const \n    {\n      return m_matrix;\n    }\n\n  protected:\n    typename MatrixType::Nested m_matrix;\n};\n\n/** \\returns an expression of the reverse of *this.\n  *\n  * Example: \\include MatrixBase_reverse.cpp\n  * Output: \\verbinclude MatrixBase_reverse.out\n  *\n  */\ntemplate<typename Derived>\ninline typename DenseBase<Derived>::ReverseReturnType\nDenseBase<Derived>::reverse()\n{\n  return derived();\n}\n\n/** This is the const version of reverse(). */\ntemplate<typename Derived>\ninline const typename DenseBase<Derived>::ConstReverseReturnType\nDenseBase<Derived>::reverse() const\n{\n  return derived();\n}\n\n/** This is the \"in place\" version of reverse: it reverses \\c *this.\n  *\n  * In most cases it is probably better to simply use the reversed expression\n  * of a matrix. However, when reversing the matrix data itself is really needed,\n  * then this \"in-place\" version is probably the right choice because it provides\n  * the following additional features:\n  *  - less error prone: doing the same operation with .reverse() requires special care:\n  *    \\code m = m.reverse().eval(); \\endcode\n  *  - this API allows to avoid creating a temporary (the current implementation creates a temporary, but that could be avoided using swap)\n  *  - it allows future optimizations (cache friendliness, etc.)\n  *\n  * \\sa reverse() */\ntemplate<typename Derived>\ninline void DenseBase<Derived>::reverseInPlace()\n{\n  derived() = derived().reverse().eval();\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_REVERSE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/Select.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SELECT_H\n#define EIGEN_SELECT_H\n\nnamespace Eigen { \n\n/** \\class Select\n  * \\ingroup Core_Module\n  *\n  * \\brief Expression of a coefficient wise version of the C++ ternary operator ?:\n  *\n  * \\param ConditionMatrixType the type of the \\em condition expression which must be a boolean matrix\n  * \\param ThenMatrixType the type of the \\em then expression\n  * \\param ElseMatrixType the type of the \\em else expression\n  *\n  * This class represents an expression of a coefficient wise version of the C++ ternary operator ?:.\n  * It is the return type of DenseBase::select() and most of the time this is the only way it is used.\n  *\n  * \\sa DenseBase::select(const DenseBase<ThenDerived>&, const DenseBase<ElseDerived>&) const\n  */\n\nnamespace internal {\ntemplate<typename ConditionMatrixType, typename ThenMatrixType, typename ElseMatrixType>\nstruct traits<Select<ConditionMatrixType, ThenMatrixType, ElseMatrixType> >\n : traits<ThenMatrixType>\n{\n  typedef typename traits<ThenMatrixType>::Scalar Scalar;\n  typedef Dense StorageKind;\n  typedef typename traits<ThenMatrixType>::XprKind XprKind;\n  typedef typename ConditionMatrixType::Nested ConditionMatrixNested;\n  typedef typename ThenMatrixType::Nested ThenMatrixNested;\n  typedef typename ElseMatrixType::Nested ElseMatrixNested;\n  enum {\n    RowsAtCompileTime = ConditionMatrixType::RowsAtCompileTime,\n    ColsAtCompileTime = ConditionMatrixType::ColsAtCompileTime,\n    MaxRowsAtCompileTime = ConditionMatrixType::MaxRowsAtCompileTime,\n    MaxColsAtCompileTime = ConditionMatrixType::MaxColsAtCompileTime,\n    Flags = (unsigned int)ThenMatrixType::Flags & ElseMatrixType::Flags & HereditaryBits,\n    CoeffReadCost = traits<typename remove_all<ConditionMatrixNested>::type>::CoeffReadCost\n                  + EIGEN_SIZE_MAX(traits<typename remove_all<ThenMatrixNested>::type>::CoeffReadCost,\n                                   traits<typename remove_all<ElseMatrixNested>::type>::CoeffReadCost)\n  };\n};\n}\n\ntemplate<typename ConditionMatrixType, typename ThenMatrixType, typename ElseMatrixType>\nclass Select : internal::no_assignment_operator,\n  public internal::dense_xpr_base< Select<ConditionMatrixType, ThenMatrixType, ElseMatrixType> >::type\n{\n  public:\n\n    typedef typename internal::dense_xpr_base<Select>::type Base;\n    EIGEN_DENSE_PUBLIC_INTERFACE(Select)\n\n    Select(const ConditionMatrixType& a_conditionMatrix,\n           const ThenMatrixType& a_thenMatrix,\n           const ElseMatrixType& a_elseMatrix)\n      : m_condition(a_conditionMatrix), m_then(a_thenMatrix), m_else(a_elseMatrix)\n    {\n      eigen_assert(m_condition.rows() == m_then.rows() && m_condition.rows() == m_else.rows());\n      eigen_assert(m_condition.cols() == m_then.cols() && m_condition.cols() == m_else.cols());\n    }\n\n    Index rows() const { return m_condition.rows(); }\n    Index cols() const { return m_condition.cols(); }\n\n    const Scalar coeff(Index i, Index j) const\n    {\n      if (m_condition.coeff(i,j))\n        return m_then.coeff(i,j);\n      else\n        return m_else.coeff(i,j);\n    }\n\n    const Scalar coeff(Index i) const\n    {\n      if (m_condition.coeff(i))\n        return m_then.coeff(i);\n      else\n        return m_else.coeff(i);\n    }\n\n    const ConditionMatrixType& conditionMatrix() const\n    {\n      return m_condition;\n    }\n\n    const ThenMatrixType& thenMatrix() const\n    {\n      return m_then;\n    }\n\n    const ElseMatrixType& elseMatrix() const\n    {\n      return m_else;\n    }\n\n  protected:\n    typename ConditionMatrixType::Nested m_condition;\n    typename ThenMatrixType::Nested m_then;\n    typename ElseMatrixType::Nested m_else;\n};\n\n\n/** \\returns a matrix where each coefficient (i,j) is equal to \\a thenMatrix(i,j)\n  * if \\c *this(i,j), and \\a elseMatrix(i,j) otherwise.\n  *\n  * Example: \\include MatrixBase_select.cpp\n  * Output: \\verbinclude MatrixBase_select.out\n  *\n  * \\sa class Select\n  */\ntemplate<typename Derived>\ntemplate<typename ThenDerived,typename ElseDerived>\ninline const Select<Derived,ThenDerived,ElseDerived>\nDenseBase<Derived>::select(const DenseBase<ThenDerived>& thenMatrix,\n                            const DenseBase<ElseDerived>& elseMatrix) const\n{\n  return Select<Derived,ThenDerived,ElseDerived>(derived(), thenMatrix.derived(), elseMatrix.derived());\n}\n\n/** Version of DenseBase::select(const DenseBase&, const DenseBase&) with\n  * the \\em else expression being a scalar value.\n  *\n  * \\sa DenseBase::select(const DenseBase<ThenDerived>&, const DenseBase<ElseDerived>&) const, class Select\n  */\ntemplate<typename Derived>\ntemplate<typename ThenDerived>\ninline const Select<Derived,ThenDerived, typename ThenDerived::ConstantReturnType>\nDenseBase<Derived>::select(const DenseBase<ThenDerived>& thenMatrix,\n                           const typename ThenDerived::Scalar& elseScalar) const\n{\n  return Select<Derived,ThenDerived,typename ThenDerived::ConstantReturnType>(\n    derived(), thenMatrix.derived(), ThenDerived::Constant(rows(),cols(),elseScalar));\n}\n\n/** Version of DenseBase::select(const DenseBase&, const DenseBase&) with\n  * the \\em then expression being a scalar value.\n  *\n  * \\sa DenseBase::select(const DenseBase<ThenDerived>&, const DenseBase<ElseDerived>&) const, class Select\n  */\ntemplate<typename Derived>\ntemplate<typename ElseDerived>\ninline const Select<Derived, typename ElseDerived::ConstantReturnType, ElseDerived >\nDenseBase<Derived>::select(const typename ElseDerived::Scalar& thenScalar,\n                           const DenseBase<ElseDerived>& elseMatrix) const\n{\n  return Select<Derived,typename ElseDerived::ConstantReturnType,ElseDerived>(\n    derived(), ElseDerived::Constant(rows(),cols(),thenScalar), elseMatrix.derived());\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_SELECT_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/SelfAdjointView.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SELFADJOINTMATRIX_H\n#define EIGEN_SELFADJOINTMATRIX_H\n\nnamespace Eigen { \n\n/** \\class SelfAdjointView\n  * \\ingroup Core_Module\n  *\n  *\n  * \\brief Expression of a selfadjoint matrix from a triangular part of a dense matrix\n  *\n  * \\param MatrixType the type of the dense matrix storing the coefficients\n  * \\param TriangularPart can be either \\c #Lower or \\c #Upper\n  *\n  * This class is an expression of a sefladjoint matrix from a triangular part of a matrix\n  * with given dense storage of the coefficients. It is the return type of MatrixBase::selfadjointView()\n  * and most of the time this is the only way that it is used.\n  *\n  * \\sa class TriangularBase, MatrixBase::selfadjointView()\n  */\n\nnamespace internal {\ntemplate<typename MatrixType, unsigned int UpLo>\nstruct traits<SelfAdjointView<MatrixType, UpLo> > : traits<MatrixType>\n{\n  typedef typename nested<MatrixType>::type MatrixTypeNested;\n  typedef typename remove_all<MatrixTypeNested>::type MatrixTypeNestedCleaned;\n  typedef MatrixType ExpressionType;\n  typedef typename MatrixType::PlainObject DenseMatrixType;\n  enum {\n    Mode = UpLo | SelfAdjoint,\n    Flags =  MatrixTypeNestedCleaned::Flags & (HereditaryBits)\n           & (~(PacketAccessBit | DirectAccessBit | LinearAccessBit)), // FIXME these flags should be preserved\n    CoeffReadCost = MatrixTypeNestedCleaned::CoeffReadCost\n  };\n};\n}\n\ntemplate <typename Lhs, int LhsMode, bool LhsIsVector,\n          typename Rhs, int RhsMode, bool RhsIsVector>\nstruct SelfadjointProductMatrix;\n\n// FIXME could also be called SelfAdjointWrapper to be consistent with DiagonalWrapper ??\ntemplate<typename MatrixType, unsigned int UpLo> class SelfAdjointView\n  : public TriangularBase<SelfAdjointView<MatrixType, UpLo> >\n{\n  public:\n\n    typedef TriangularBase<SelfAdjointView> Base;\n    typedef typename internal::traits<SelfAdjointView>::MatrixTypeNested MatrixTypeNested;\n    typedef typename internal::traits<SelfAdjointView>::MatrixTypeNestedCleaned MatrixTypeNestedCleaned;\n\n    /** \\brief The type of coefficients in this matrix */\n    typedef typename internal::traits<SelfAdjointView>::Scalar Scalar; \n\n    typedef typename MatrixType::Index Index;\n\n    enum {\n      Mode = internal::traits<SelfAdjointView>::Mode\n    };\n    typedef typename MatrixType::PlainObject PlainObject;\n\n    inline SelfAdjointView(MatrixType& matrix) : m_matrix(matrix)\n    {}\n\n    inline Index rows() const { return m_matrix.rows(); }\n    inline Index cols() const { return m_matrix.cols(); }\n    inline Index outerStride() const { return m_matrix.outerStride(); }\n    inline Index innerStride() const { return m_matrix.innerStride(); }\n\n    /** \\sa MatrixBase::coeff()\n      * \\warning the coordinates must fit into the referenced triangular part\n      */\n    inline Scalar coeff(Index row, Index col) const\n    {\n      Base::check_coordinates_internal(row, col);\n      return m_matrix.coeff(row, col);\n    }\n\n    /** \\sa MatrixBase::coeffRef()\n      * \\warning the coordinates must fit into the referenced triangular part\n      */\n    inline Scalar& coeffRef(Index row, Index col)\n    {\n      Base::check_coordinates_internal(row, col);\n      return m_matrix.const_cast_derived().coeffRef(row, col);\n    }\n\n    /** \\internal */\n    const MatrixTypeNestedCleaned& _expression() const { return m_matrix; }\n\n    const MatrixTypeNestedCleaned& nestedExpression() const { return m_matrix; }\n    MatrixTypeNestedCleaned& nestedExpression() { return *const_cast<MatrixTypeNestedCleaned*>(&m_matrix); }\n\n    /** Efficient self-adjoint matrix times vector/matrix product */\n    template<typename OtherDerived>\n    SelfadjointProductMatrix<MatrixType,Mode,false,OtherDerived,0,OtherDerived::IsVectorAtCompileTime>\n    operator*(const MatrixBase<OtherDerived>& rhs) const\n    {\n      return SelfadjointProductMatrix\n              <MatrixType,Mode,false,OtherDerived,0,OtherDerived::IsVectorAtCompileTime>\n              (m_matrix, rhs.derived());\n    }\n\n    /** Efficient vector/matrix times self-adjoint matrix product */\n    template<typename OtherDerived> friend\n    SelfadjointProductMatrix<OtherDerived,0,OtherDerived::IsVectorAtCompileTime,MatrixType,Mode,false>\n    operator*(const MatrixBase<OtherDerived>& lhs, const SelfAdjointView& rhs)\n    {\n      return SelfadjointProductMatrix\n              <OtherDerived,0,OtherDerived::IsVectorAtCompileTime,MatrixType,Mode,false>\n              (lhs.derived(),rhs.m_matrix);\n    }\n\n    /** Perform a symmetric rank 2 update of the selfadjoint matrix \\c *this:\n      * \\f$ this = this + \\alpha u v^* + conj(\\alpha) v u^* \\f$\n      * \\returns a reference to \\c *this\n      *\n      * The vectors \\a u and \\c v \\b must be column vectors, however they can be\n      * a adjoint expression without any overhead. Only the meaningful triangular\n      * part of the matrix is updated, the rest is left unchanged.\n      *\n      * \\sa rankUpdate(const MatrixBase<DerivedU>&, Scalar)\n      */\n    template<typename DerivedU, typename DerivedV>\n    SelfAdjointView& rankUpdate(const MatrixBase<DerivedU>& u, const MatrixBase<DerivedV>& v, const Scalar& alpha = Scalar(1));\n\n    /** Perform a symmetric rank K update of the selfadjoint matrix \\c *this:\n      * \\f$ this = this + \\alpha ( u u^* ) \\f$ where \\a u is a vector or matrix.\n      *\n      * \\returns a reference to \\c *this\n      *\n      * Note that to perform \\f$ this = this + \\alpha ( u^* u ) \\f$ you can simply\n      * call this function with u.adjoint().\n      *\n      * \\sa rankUpdate(const MatrixBase<DerivedU>&, const MatrixBase<DerivedV>&, Scalar)\n      */\n    template<typename DerivedU>\n    SelfAdjointView& rankUpdate(const MatrixBase<DerivedU>& u, const Scalar& alpha = Scalar(1));\n\n/////////// Cholesky module ///////////\n\n    const LLT<PlainObject, UpLo> llt() const;\n    const LDLT<PlainObject, UpLo> ldlt() const;\n\n/////////// Eigenvalue module ///////////\n\n    /** Real part of #Scalar */\n    typedef typename NumTraits<Scalar>::Real RealScalar;\n    /** Return type of eigenvalues() */\n    typedef Matrix<RealScalar, internal::traits<MatrixType>::ColsAtCompileTime, 1> EigenvaluesReturnType;\n\n    EigenvaluesReturnType eigenvalues() const;\n    RealScalar operatorNorm() const;\n    \n    #ifdef EIGEN2_SUPPORT\n    template<typename OtherDerived>\n    SelfAdjointView& operator=(const MatrixBase<OtherDerived>& other)\n    {\n      enum {\n        OtherPart = UpLo == Upper ? StrictlyLower : StrictlyUpper\n      };\n      m_matrix.const_cast_derived().template triangularView<UpLo>() = other;\n      m_matrix.const_cast_derived().template triangularView<OtherPart>() = other.adjoint();\n      return *this;\n    }\n    template<typename OtherMatrixType, unsigned int OtherMode>\n    SelfAdjointView& operator=(const TriangularView<OtherMatrixType, OtherMode>& other)\n    {\n      enum {\n        OtherPart = UpLo == Upper ? StrictlyLower : StrictlyUpper\n      };\n      m_matrix.const_cast_derived().template triangularView<UpLo>() = other.toDenseMatrix();\n      m_matrix.const_cast_derived().template triangularView<OtherPart>() = other.toDenseMatrix().adjoint();\n      return *this;\n    }\n    #endif\n\n  protected:\n    MatrixTypeNested m_matrix;\n};\n\n\n// template<typename OtherDerived, typename MatrixType, unsigned int UpLo>\n// internal::selfadjoint_matrix_product_returntype<OtherDerived,SelfAdjointView<MatrixType,UpLo> >\n// operator*(const MatrixBase<OtherDerived>& lhs, const SelfAdjointView<MatrixType,UpLo>& rhs)\n// {\n//   return internal::matrix_selfadjoint_product_returntype<OtherDerived,SelfAdjointView<MatrixType,UpLo> >(lhs.derived(),rhs);\n// }\n\n// selfadjoint to dense matrix\n\nnamespace internal {\n\ntemplate<typename Derived1, typename Derived2, int UnrollCount, bool ClearOpposite>\nstruct triangular_assignment_selector<Derived1, Derived2, (SelfAdjoint|Upper), UnrollCount, ClearOpposite>\n{\n  enum {\n    col = (UnrollCount-1) / Derived1::RowsAtCompileTime,\n    row = (UnrollCount-1) % Derived1::RowsAtCompileTime\n  };\n\n  static inline void run(Derived1 &dst, const Derived2 &src)\n  {\n    triangular_assignment_selector<Derived1, Derived2, (SelfAdjoint|Upper), UnrollCount-1, ClearOpposite>::run(dst, src);\n\n    if(row == col)\n      dst.coeffRef(row, col) = numext::real(src.coeff(row, col));\n    else if(row < col)\n      dst.coeffRef(col, row) = numext::conj(dst.coeffRef(row, col) = src.coeff(row, col));\n  }\n};\n\ntemplate<typename Derived1, typename Derived2, bool ClearOpposite>\nstruct triangular_assignment_selector<Derived1, Derived2, SelfAdjoint|Upper, 0, ClearOpposite>\n{\n  static inline void run(Derived1 &, const Derived2 &) {}\n};\n\ntemplate<typename Derived1, typename Derived2, int UnrollCount, bool ClearOpposite>\nstruct triangular_assignment_selector<Derived1, Derived2, (SelfAdjoint|Lower), UnrollCount, ClearOpposite>\n{\n  enum {\n    col = (UnrollCount-1) / Derived1::RowsAtCompileTime,\n    row = (UnrollCount-1) % Derived1::RowsAtCompileTime\n  };\n\n  static inline void run(Derived1 &dst, const Derived2 &src)\n  {\n    triangular_assignment_selector<Derived1, Derived2, (SelfAdjoint|Lower), UnrollCount-1, ClearOpposite>::run(dst, src);\n\n    if(row == col)\n      dst.coeffRef(row, col) = numext::real(src.coeff(row, col));\n    else if(row > col)\n      dst.coeffRef(col, row) = numext::conj(dst.coeffRef(row, col) = src.coeff(row, col));\n  }\n};\n\ntemplate<typename Derived1, typename Derived2, bool ClearOpposite>\nstruct triangular_assignment_selector<Derived1, Derived2, SelfAdjoint|Lower, 0, ClearOpposite>\n{\n  static inline void run(Derived1 &, const Derived2 &) {}\n};\n\ntemplate<typename Derived1, typename Derived2, bool ClearOpposite>\nstruct triangular_assignment_selector<Derived1, Derived2, SelfAdjoint|Upper, Dynamic, ClearOpposite>\n{\n  typedef typename Derived1::Index Index;\n  static inline void run(Derived1 &dst, const Derived2 &src)\n  {\n    for(Index j = 0; j < dst.cols(); ++j)\n    {\n      for(Index i = 0; i < j; ++i)\n      {\n        dst.copyCoeff(i, j, src);\n        dst.coeffRef(j,i) = numext::conj(dst.coeff(i,j));\n      }\n      dst.copyCoeff(j, j, src);\n    }\n  }\n};\n\ntemplate<typename Derived1, typename Derived2, bool ClearOpposite>\nstruct triangular_assignment_selector<Derived1, Derived2, SelfAdjoint|Lower, Dynamic, ClearOpposite>\n{\n  static inline void run(Derived1 &dst, const Derived2 &src)\n  {\n  typedef typename Derived1::Index Index;\n    for(Index i = 0; i < dst.rows(); ++i)\n    {\n      for(Index j = 0; j < i; ++j)\n      {\n        dst.copyCoeff(i, j, src);\n        dst.coeffRef(j,i) = numext::conj(dst.coeff(i,j));\n      }\n      dst.copyCoeff(i, i, src);\n    }\n  }\n};\n\n} // end namespace internal\n\n/***************************************************************************\n* Implementation of MatrixBase methods\n***************************************************************************/\n\ntemplate<typename Derived>\ntemplate<unsigned int UpLo>\ntypename MatrixBase<Derived>::template ConstSelfAdjointViewReturnType<UpLo>::Type\nMatrixBase<Derived>::selfadjointView() const\n{\n  return derived();\n}\n\ntemplate<typename Derived>\ntemplate<unsigned int UpLo>\ntypename MatrixBase<Derived>::template SelfAdjointViewReturnType<UpLo>::Type\nMatrixBase<Derived>::selfadjointView()\n{\n  return derived();\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_SELFADJOINTMATRIX_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/SelfCwiseBinaryOp.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SELFCWISEBINARYOP_H\n#define EIGEN_SELFCWISEBINARYOP_H\n\nnamespace Eigen { \n\n/** \\class SelfCwiseBinaryOp\n  * \\ingroup Core_Module\n  *\n  * \\internal\n  *\n  * \\brief Internal helper class for optimizing operators like +=, -=\n  *\n  * This is a pseudo expression class re-implementing the copyCoeff/copyPacket\n  * method to directly performs a +=/-= operations in an optimal way. In particular,\n  * this allows to make sure that the input/output data are loaded only once using\n  * aligned packet loads.\n  *\n  * \\sa class SwapWrapper for a similar trick.\n  */\n\nnamespace internal {\ntemplate<typename BinaryOp, typename Lhs, typename Rhs>\nstruct traits<SelfCwiseBinaryOp<BinaryOp,Lhs,Rhs> >\n  : traits<CwiseBinaryOp<BinaryOp,Lhs,Rhs> >\n{\n  enum {\n    // Note that it is still a good idea to preserve the DirectAccessBit\n    // so that assign can correctly align the data.\n    Flags = traits<CwiseBinaryOp<BinaryOp,Lhs,Rhs> >::Flags | (Lhs::Flags&DirectAccessBit) | (Lhs::Flags&LvalueBit),\n    OuterStrideAtCompileTime = Lhs::OuterStrideAtCompileTime,\n    InnerStrideAtCompileTime = Lhs::InnerStrideAtCompileTime\n  };\n};\n}\n\ntemplate<typename BinaryOp, typename Lhs, typename Rhs> class SelfCwiseBinaryOp\n  : public internal::dense_xpr_base< SelfCwiseBinaryOp<BinaryOp, Lhs, Rhs> >::type\n{\n  public:\n\n    typedef typename internal::dense_xpr_base<SelfCwiseBinaryOp>::type Base;\n    EIGEN_DENSE_PUBLIC_INTERFACE(SelfCwiseBinaryOp)\n\n    typedef typename internal::packet_traits<Scalar>::type Packet;\n\n    inline SelfCwiseBinaryOp(Lhs& xpr, const BinaryOp& func = BinaryOp()) : m_matrix(xpr), m_functor(func) {}\n\n    inline Index rows() const { return m_matrix.rows(); }\n    inline Index cols() const { return m_matrix.cols(); }\n    inline Index outerStride() const { return m_matrix.outerStride(); }\n    inline Index innerStride() const { return m_matrix.innerStride(); }\n    inline const Scalar* data() const { return m_matrix.data(); }\n\n    // note that this function is needed by assign to correctly align loads/stores\n    // TODO make Assign use .data()\n    inline Scalar& coeffRef(Index row, Index col)\n    {\n      EIGEN_STATIC_ASSERT_LVALUE(Lhs)\n      return m_matrix.const_cast_derived().coeffRef(row, col);\n    }\n    inline const Scalar& coeffRef(Index row, Index col) const\n    {\n      return m_matrix.coeffRef(row, col);\n    }\n\n    // note that this function is needed by assign to correctly align loads/stores\n    // TODO make Assign use .data()\n    inline Scalar& coeffRef(Index index)\n    {\n      EIGEN_STATIC_ASSERT_LVALUE(Lhs)\n      return m_matrix.const_cast_derived().coeffRef(index);\n    }\n    inline const Scalar& coeffRef(Index index) const\n    {\n      return m_matrix.const_cast_derived().coeffRef(index);\n    }\n\n    template<typename OtherDerived>\n    void copyCoeff(Index row, Index col, const DenseBase<OtherDerived>& other)\n    {\n      OtherDerived& _other = other.const_cast_derived();\n      eigen_internal_assert(row >= 0 && row < rows()\n                         && col >= 0 && col < cols());\n      Scalar& tmp = m_matrix.coeffRef(row,col);\n      tmp = m_functor(tmp, _other.coeff(row,col));\n    }\n\n    template<typename OtherDerived>\n    void copyCoeff(Index index, const DenseBase<OtherDerived>& other)\n    {\n      OtherDerived& _other = other.const_cast_derived();\n      eigen_internal_assert(index >= 0 && index < m_matrix.size());\n      Scalar& tmp = m_matrix.coeffRef(index);\n      tmp = m_functor(tmp, _other.coeff(index));\n    }\n\n    template<typename OtherDerived, int StoreMode, int LoadMode>\n    void copyPacket(Index row, Index col, const DenseBase<OtherDerived>& other)\n    {\n      OtherDerived& _other = other.const_cast_derived();\n      eigen_internal_assert(row >= 0 && row < rows()\n                        && col >= 0 && col < cols());\n      m_matrix.template writePacket<StoreMode>(row, col,\n        m_functor.packetOp(m_matrix.template packet<StoreMode>(row, col),_other.template packet<LoadMode>(row, col)) );\n    }\n\n    template<typename OtherDerived, int StoreMode, int LoadMode>\n    void copyPacket(Index index, const DenseBase<OtherDerived>& other)\n    {\n      OtherDerived& _other = other.const_cast_derived();\n      eigen_internal_assert(index >= 0 && index < m_matrix.size());\n      m_matrix.template writePacket<StoreMode>(index,\n        m_functor.packetOp(m_matrix.template packet<StoreMode>(index),_other.template packet<LoadMode>(index)) );\n    }\n\n    // reimplement lazyAssign to handle complex *= real\n    // see CwiseBinaryOp ctor for details\n    template<typename RhsDerived>\n    EIGEN_STRONG_INLINE SelfCwiseBinaryOp& lazyAssign(const DenseBase<RhsDerived>& rhs)\n    {\n      EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(Lhs,RhsDerived)\n      EIGEN_CHECK_BINARY_COMPATIBILIY(BinaryOp,typename Lhs::Scalar,typename RhsDerived::Scalar);\n      \n    #ifdef EIGEN_DEBUG_ASSIGN\n      internal::assign_traits<SelfCwiseBinaryOp, RhsDerived>::debug();\n    #endif\n      eigen_assert(rows() == rhs.rows() && cols() == rhs.cols());\n      internal::assign_impl<SelfCwiseBinaryOp, RhsDerived>::run(*this,rhs.derived());\n    #ifndef EIGEN_NO_DEBUG\n      this->checkTransposeAliasing(rhs.derived());\n    #endif\n      return *this;\n    }\n    \n    // overloaded to honor evaluation of special matrices\n    // maybe another solution would be to not use SelfCwiseBinaryOp\n    // at first...\n    SelfCwiseBinaryOp& operator=(const Rhs& _rhs)\n    {\n      typename internal::nested<Rhs>::type rhs(_rhs);\n      return Base::operator=(rhs);\n    }\n\n    Lhs& expression() const \n    { \n      return m_matrix;\n    }\n\n    const BinaryOp& functor() const \n    { \n      return m_functor;\n    }\n\n  protected:\n    Lhs& m_matrix;\n    const BinaryOp& m_functor;\n\n  private:\n    SelfCwiseBinaryOp& operator=(const SelfCwiseBinaryOp&);\n};\n\ntemplate<typename Derived>\ninline Derived& DenseBase<Derived>::operator*=(const Scalar& other)\n{\n  typedef typename Derived::PlainObject PlainObject;\n  SelfCwiseBinaryOp<internal::scalar_product_op<Scalar>, Derived, typename PlainObject::ConstantReturnType> tmp(derived());\n  tmp = PlainObject::Constant(rows(),cols(),other);\n  return derived();\n}\n\ntemplate<typename Derived>\ninline Derived& DenseBase<Derived>::operator/=(const Scalar& other)\n{\n  typedef typename Derived::PlainObject PlainObject;\n  SelfCwiseBinaryOp<internal::scalar_quotient_op<Scalar>, Derived, typename PlainObject::ConstantReturnType> tmp(derived());\n  tmp = PlainObject::Constant(rows(),cols(), other);\n  return derived();\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_SELFCWISEBINARYOP_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/SolveTriangular.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SOLVETRIANGULAR_H\n#define EIGEN_SOLVETRIANGULAR_H\n\nnamespace Eigen { \n\nnamespace internal {\n\n// Forward declarations:\n// The following two routines are implemented in the products/TriangularSolver*.h files\ntemplate<typename LhsScalar, typename RhsScalar, typename Index, int Side, int Mode, bool Conjugate, int StorageOrder>\nstruct triangular_solve_vector;\n\ntemplate <typename Scalar, typename Index, int Side, int Mode, bool Conjugate, int TriStorageOrder, int OtherStorageOrder>\nstruct triangular_solve_matrix;\n\n// small helper struct extracting some traits on the underlying solver operation\ntemplate<typename Lhs, typename Rhs, int Side>\nclass trsolve_traits\n{\n  private:\n    enum {\n      RhsIsVectorAtCompileTime = (Side==OnTheLeft ? Rhs::ColsAtCompileTime : Rhs::RowsAtCompileTime)==1\n    };\n  public:\n    enum {\n      Unrolling   = (RhsIsVectorAtCompileTime && Rhs::SizeAtCompileTime != Dynamic && Rhs::SizeAtCompileTime <= 8)\n                  ? CompleteUnrolling : NoUnrolling,\n      RhsVectors  = RhsIsVectorAtCompileTime ? 1 : Dynamic\n    };\n};\n\ntemplate<typename Lhs, typename Rhs,\n  int Side, // can be OnTheLeft/OnTheRight\n  int Mode, // can be Upper/Lower | UnitDiag\n  int Unrolling = trsolve_traits<Lhs,Rhs,Side>::Unrolling,\n  int RhsVectors = trsolve_traits<Lhs,Rhs,Side>::RhsVectors\n  >\nstruct triangular_solver_selector;\n\ntemplate<typename Lhs, typename Rhs, int Side, int Mode>\nstruct triangular_solver_selector<Lhs,Rhs,Side,Mode,NoUnrolling,1>\n{\n  typedef typename Lhs::Scalar LhsScalar;\n  typedef typename Rhs::Scalar RhsScalar;\n  typedef blas_traits<Lhs> LhsProductTraits;\n  typedef typename LhsProductTraits::ExtractType ActualLhsType;\n  typedef Map<Matrix<RhsScalar,Dynamic,1>, Aligned> MappedRhs;\n  static void run(const Lhs& lhs, Rhs& rhs)\n  {\n    ActualLhsType actualLhs = LhsProductTraits::extract(lhs);\n\n    // FIXME find a way to allow an inner stride if packet_traits<Scalar>::size==1\n\n    bool useRhsDirectly = Rhs::InnerStrideAtCompileTime==1 || rhs.innerStride()==1;\n\n    ei_declare_aligned_stack_constructed_variable(RhsScalar,actualRhs,rhs.size(),\n                                                  (useRhsDirectly ? rhs.data() : 0));\n                                                  \n    if(!useRhsDirectly)\n      MappedRhs(actualRhs,rhs.size()) = rhs;\n\n    triangular_solve_vector<LhsScalar, RhsScalar, typename Lhs::Index, Side, Mode, LhsProductTraits::NeedToConjugate,\n                            (int(Lhs::Flags) & RowMajorBit) ? RowMajor : ColMajor>\n      ::run(actualLhs.cols(), actualLhs.data(), actualLhs.outerStride(), actualRhs);\n\n    if(!useRhsDirectly)\n      rhs = MappedRhs(actualRhs, rhs.size());\n  }\n};\n\n// the rhs is a matrix\ntemplate<typename Lhs, typename Rhs, int Side, int Mode>\nstruct triangular_solver_selector<Lhs,Rhs,Side,Mode,NoUnrolling,Dynamic>\n{\n  typedef typename Rhs::Scalar Scalar;\n  typedef typename Rhs::Index Index;\n  typedef blas_traits<Lhs> LhsProductTraits;\n  typedef typename LhsProductTraits::DirectLinearAccessType ActualLhsType;\n\n  static void run(const Lhs& lhs, Rhs& rhs)\n  {\n    typename internal::add_const_on_value_type<ActualLhsType>::type actualLhs = LhsProductTraits::extract(lhs);\n\n    const Index size = lhs.rows();\n    const Index othersize = Side==OnTheLeft? rhs.cols() : rhs.rows();\n\n    typedef internal::gemm_blocking_space<(Rhs::Flags&RowMajorBit) ? RowMajor : ColMajor,Scalar,Scalar,\n              Rhs::MaxRowsAtCompileTime, Rhs::MaxColsAtCompileTime, Lhs::MaxRowsAtCompileTime,4> BlockingType;\n\n    BlockingType blocking(rhs.rows(), rhs.cols(), size);\n\n    triangular_solve_matrix<Scalar,Index,Side,Mode,LhsProductTraits::NeedToConjugate,(int(Lhs::Flags) & RowMajorBit) ? RowMajor : ColMajor,\n                               (Rhs::Flags&RowMajorBit) ? RowMajor : ColMajor>\n      ::run(size, othersize, &actualLhs.coeffRef(0,0), actualLhs.outerStride(), &rhs.coeffRef(0,0), rhs.outerStride(), blocking);\n  }\n};\n\n/***************************************************************************\n* meta-unrolling implementation\n***************************************************************************/\n\ntemplate<typename Lhs, typename Rhs, int Mode, int Index, int Size,\n         bool Stop = Index==Size>\nstruct triangular_solver_unroller;\n\ntemplate<typename Lhs, typename Rhs, int Mode, int Index, int Size>\nstruct triangular_solver_unroller<Lhs,Rhs,Mode,Index,Size,false> {\n  enum {\n    IsLower = ((Mode&Lower)==Lower),\n    RowIndex = IsLower ? Index : Size - Index - 1,\n    S = IsLower ? 0     : RowIndex+1\n  };\n  static void run(const Lhs& lhs, Rhs& rhs)\n  {\n    if (Index>0)\n      rhs.coeffRef(RowIndex) -= lhs.row(RowIndex).template segment<Index>(S).transpose()\n                         .cwiseProduct(rhs.template segment<Index>(S)).sum();\n\n    if(!(Mode & UnitDiag))\n      rhs.coeffRef(RowIndex) /= lhs.coeff(RowIndex,RowIndex);\n\n    triangular_solver_unroller<Lhs,Rhs,Mode,Index+1,Size>::run(lhs,rhs);\n  }\n};\n\ntemplate<typename Lhs, typename Rhs, int Mode, int Index, int Size>\nstruct triangular_solver_unroller<Lhs,Rhs,Mode,Index,Size,true> {\n  static void run(const Lhs&, Rhs&) {}\n};\n\ntemplate<typename Lhs, typename Rhs, int Mode>\nstruct triangular_solver_selector<Lhs,Rhs,OnTheLeft,Mode,CompleteUnrolling,1> {\n  static void run(const Lhs& lhs, Rhs& rhs)\n  { triangular_solver_unroller<Lhs,Rhs,Mode,0,Rhs::SizeAtCompileTime>::run(lhs,rhs); }\n};\n\ntemplate<typename Lhs, typename Rhs, int Mode>\nstruct triangular_solver_selector<Lhs,Rhs,OnTheRight,Mode,CompleteUnrolling,1> {\n  static void run(const Lhs& lhs, Rhs& rhs)\n  {\n    Transpose<const Lhs> trLhs(lhs);\n    Transpose<Rhs> trRhs(rhs);\n    \n    triangular_solver_unroller<Transpose<const Lhs>,Transpose<Rhs>,\n                              ((Mode&Upper)==Upper ? Lower : Upper) | (Mode&UnitDiag),\n                              0,Rhs::SizeAtCompileTime>::run(trLhs,trRhs);\n  }\n};\n\n} // end namespace internal\n\n/***************************************************************************\n* TriangularView methods\n***************************************************************************/\n\n/** \"in-place\" version of TriangularView::solve() where the result is written in \\a other\n  *\n  * \\warning The parameter is only marked 'const' to make the C++ compiler accept a temporary expression here.\n  * This function will const_cast it, so constness isn't honored here.\n  *\n  * See TriangularView:solve() for the details.\n  */\ntemplate<typename MatrixType, unsigned int Mode>\ntemplate<int Side, typename OtherDerived>\nvoid TriangularView<MatrixType,Mode>::solveInPlace(const MatrixBase<OtherDerived>& _other) const\n{\n  OtherDerived& other = _other.const_cast_derived();\n  eigen_assert( cols() == rows() && ((Side==OnTheLeft && cols() == other.rows()) || (Side==OnTheRight && cols() == other.cols())) );\n  eigen_assert((!(Mode & ZeroDiag)) && bool(Mode & (Upper|Lower)));\n\n  enum { copy = internal::traits<OtherDerived>::Flags & RowMajorBit  && OtherDerived::IsVectorAtCompileTime };\n  typedef typename internal::conditional<copy,\n    typename internal::plain_matrix_type_column_major<OtherDerived>::type, OtherDerived&>::type OtherCopy;\n  OtherCopy otherCopy(other);\n\n  internal::triangular_solver_selector<MatrixType, typename internal::remove_reference<OtherCopy>::type,\n    Side, Mode>::run(nestedExpression(), otherCopy);\n\n  if (copy)\n    other = otherCopy;\n}\n\n/** \\returns the product of the inverse of \\c *this with \\a other, \\a *this being triangular.\n  *\n  * This function computes the inverse-matrix matrix product inverse(\\c *this) * \\a other if\n  * \\a Side==OnTheLeft (the default), or the right-inverse-multiply  \\a other * inverse(\\c *this) if\n  * \\a Side==OnTheRight.\n  *\n  * The matrix \\c *this must be triangular and invertible (i.e., all the coefficients of the\n  * diagonal must be non zero). It works as a forward (resp. backward) substitution if \\c *this\n  * is an upper (resp. lower) triangular matrix.\n  *\n  * Example: \\include MatrixBase_marked.cpp\n  * Output: \\verbinclude MatrixBase_marked.out\n  *\n  * This function returns an expression of the inverse-multiply and can works in-place if it is assigned\n  * to the same matrix or vector \\a other.\n  *\n  * For users coming from BLAS, this function (and more specifically solveInPlace()) offer\n  * all the operations supported by the \\c *TRSV and \\c *TRSM BLAS routines.\n  *\n  * \\sa TriangularView::solveInPlace()\n  */\ntemplate<typename Derived, unsigned int Mode>\ntemplate<int Side, typename Other>\nconst internal::triangular_solve_retval<Side,TriangularView<Derived,Mode>,Other>\nTriangularView<Derived,Mode>::solve(const MatrixBase<Other>& other) const\n{\n  return internal::triangular_solve_retval<Side,TriangularView,Other>(*this, other.derived());\n}\n\nnamespace internal {\n\n\ntemplate<int Side, typename TriangularType, typename Rhs>\nstruct traits<triangular_solve_retval<Side, TriangularType, Rhs> >\n{\n  typedef typename internal::plain_matrix_type_column_major<Rhs>::type ReturnType;\n};\n\ntemplate<int Side, typename TriangularType, typename Rhs> struct triangular_solve_retval\n : public ReturnByValue<triangular_solve_retval<Side, TriangularType, Rhs> >\n{\n  typedef typename remove_all<typename Rhs::Nested>::type RhsNestedCleaned;\n  typedef ReturnByValue<triangular_solve_retval> Base;\n  typedef typename Base::Index Index;\n\n  triangular_solve_retval(const TriangularType& tri, const Rhs& rhs)\n    : m_triangularMatrix(tri), m_rhs(rhs)\n  {}\n\n  inline Index rows() const { return m_rhs.rows(); }\n  inline Index cols() const { return m_rhs.cols(); }\n\n  template<typename Dest> inline void evalTo(Dest& dst) const\n  {\n    const typename Dest::Scalar *dst_data = internal::extract_data(dst);\n    if(!(is_same<RhsNestedCleaned,Dest>::value && dst_data!=0 && extract_data(dst) == extract_data(m_rhs)))\n      dst = m_rhs;\n    m_triangularMatrix.template solveInPlace<Side>(dst);\n  }\n\n  protected:\n    const TriangularType& m_triangularMatrix;\n    typename Rhs::Nested m_rhs;\n};\n\n} // namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_SOLVETRIANGULAR_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/StableNorm.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_STABLENORM_H\n#define EIGEN_STABLENORM_H\n\nnamespace Eigen { \n\nnamespace internal {\n\ntemplate<typename ExpressionType, typename Scalar>\ninline void stable_norm_kernel(const ExpressionType& bl, Scalar& ssq, Scalar& scale, Scalar& invScale)\n{\n  using std::max;\n  Scalar maxCoeff = bl.cwiseAbs().maxCoeff();\n  \n  if (maxCoeff>scale)\n  {\n    ssq = ssq * numext::abs2(scale/maxCoeff);\n    Scalar tmp = Scalar(1)/maxCoeff;\n    if(tmp > NumTraits<Scalar>::highest())\n    {\n      invScale = NumTraits<Scalar>::highest();\n      scale = Scalar(1)/invScale;\n    }\n    else\n    {\n      scale = maxCoeff;\n      invScale = tmp;\n    }\n  }\n  \n  // TODO if the maxCoeff is much much smaller than the current scale,\n  // then we can neglect this sub vector\n  if(scale>Scalar(0)) // if scale==0, then bl is 0 \n    ssq += (bl*invScale).squaredNorm();\n}\n\ntemplate<typename Derived>\ninline typename NumTraits<typename traits<Derived>::Scalar>::Real\nblueNorm_impl(const EigenBase<Derived>& _vec)\n{\n  typedef typename Derived::RealScalar RealScalar;  \n  typedef typename Derived::Index Index;\n  using std::pow;\n  using std::min;\n  using std::max;\n  using std::sqrt;\n  using std::abs;\n  const Derived& vec(_vec.derived());\n  static bool initialized = false;\n  static RealScalar b1, b2, s1m, s2m, overfl, rbig, relerr;\n  if(!initialized)\n  {\n    int ibeta, it, iemin, iemax, iexp;\n    RealScalar eps;\n    // This program calculates the machine-dependent constants\n    // bl, b2, slm, s2m, relerr overfl\n    // from the \"basic\" machine-dependent numbers\n    // nbig, ibeta, it, iemin, iemax, rbig.\n    // The following define the basic machine-dependent constants.\n    // For portability, the PORT subprograms \"ilmaeh\" and \"rlmach\"\n    // are used. For any specific computer, each of the assignment\n    // statements can be replaced\n    ibeta = std::numeric_limits<RealScalar>::radix;                 // base for floating-point numbers\n    it    = std::numeric_limits<RealScalar>::digits;                // number of base-beta digits in mantissa\n    iemin = std::numeric_limits<RealScalar>::min_exponent;          // minimum exponent\n    iemax = std::numeric_limits<RealScalar>::max_exponent;          // maximum exponent\n    rbig  = (std::numeric_limits<RealScalar>::max)();               // largest floating-point number\n\n    iexp  = -((1-iemin)/2);\n    b1    = RealScalar(pow(RealScalar(ibeta),RealScalar(iexp)));    // lower boundary of midrange\n    iexp  = (iemax + 1 - it)/2;\n    b2    = RealScalar(pow(RealScalar(ibeta),RealScalar(iexp)));    // upper boundary of midrange\n\n    iexp  = (2-iemin)/2;\n    s1m   = RealScalar(pow(RealScalar(ibeta),RealScalar(iexp)));    // scaling factor for lower range\n    iexp  = - ((iemax+it)/2);\n    s2m   = RealScalar(pow(RealScalar(ibeta),RealScalar(iexp)));    // scaling factor for upper range\n\n    overfl  = rbig*s2m;                                             // overflow boundary for abig\n    eps     = RealScalar(pow(double(ibeta), 1-it));\n    relerr  = sqrt(eps);                                            // tolerance for neglecting asml\n    initialized = true;\n  }\n  Index n = vec.size();\n  RealScalar ab2 = b2 / RealScalar(n);\n  RealScalar asml = RealScalar(0);\n  RealScalar amed = RealScalar(0);\n  RealScalar abig = RealScalar(0);\n  for(typename Derived::InnerIterator it(vec, 0); it; ++it)\n  {\n    RealScalar ax = abs(it.value());\n    if(ax > ab2)     abig += numext::abs2(ax*s2m);\n    else if(ax < b1) asml += numext::abs2(ax*s1m);\n    else             amed += numext::abs2(ax);\n  }\n  if(abig > RealScalar(0))\n  {\n    abig = sqrt(abig);\n    if(abig > overfl)\n    {\n      return rbig;\n    }\n    if(amed > RealScalar(0))\n    {\n      abig = abig/s2m;\n      amed = sqrt(amed);\n    }\n    else\n      return abig/s2m;\n  }\n  else if(asml > RealScalar(0))\n  {\n    if (amed > RealScalar(0))\n    {\n      abig = sqrt(amed);\n      amed = sqrt(asml) / s1m;\n    }\n    else\n      return sqrt(asml)/s1m;\n  }\n  else\n    return sqrt(amed);\n  asml = (min)(abig, amed);\n  abig = (max)(abig, amed);\n  if(asml <= abig*relerr)\n    return abig;\n  else\n    return abig * sqrt(RealScalar(1) + numext::abs2(asml/abig));\n}\n\n} // end namespace internal\n\n/** \\returns the \\em l2 norm of \\c *this avoiding underflow and overflow.\n  * This version use a blockwise two passes algorithm:\n  *  1 - find the absolute largest coefficient \\c s\n  *  2 - compute \\f$ s \\Vert \\frac{*this}{s} \\Vert \\f$ in a standard way\n  *\n  * For architecture/scalar types supporting vectorization, this version\n  * is faster than blueNorm(). Otherwise the blueNorm() is much faster.\n  *\n  * \\sa norm(), blueNorm(), hypotNorm()\n  */\ntemplate<typename Derived>\ninline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real\nMatrixBase<Derived>::stableNorm() const\n{\n  using std::min;\n  using std::sqrt;\n  const Index blockSize = 4096;\n  RealScalar scale(0);\n  RealScalar invScale(1);\n  RealScalar ssq(0); // sum of square\n  enum {\n    Alignment = (int(Flags)&DirectAccessBit) || (int(Flags)&AlignedBit) ? 1 : 0\n  };\n  Index n = size();\n  Index bi = internal::first_aligned(derived());\n  if (bi>0)\n    internal::stable_norm_kernel(this->head(bi), ssq, scale, invScale);\n  for (; bi<n; bi+=blockSize)\n    internal::stable_norm_kernel(this->segment(bi,(min)(blockSize, n - bi)).template forceAlignedAccessIf<Alignment>(), ssq, scale, invScale);\n  return scale * sqrt(ssq);\n}\n\n/** \\returns the \\em l2 norm of \\c *this using the Blue's algorithm.\n  * A Portable Fortran Program to Find the Euclidean Norm of a Vector,\n  * ACM TOMS, Vol 4, Issue 1, 1978.\n  *\n  * For architecture/scalar types without vectorization, this version\n  * is much faster than stableNorm(). Otherwise the stableNorm() is faster.\n  *\n  * \\sa norm(), stableNorm(), hypotNorm()\n  */\ntemplate<typename Derived>\ninline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real\nMatrixBase<Derived>::blueNorm() const\n{\n  return internal::blueNorm_impl(*this);\n}\n\n/** \\returns the \\em l2 norm of \\c *this avoiding undeflow and overflow.\n  * This version use a concatenation of hypot() calls, and it is very slow.\n  *\n  * \\sa norm(), stableNorm()\n  */\ntemplate<typename Derived>\ninline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real\nMatrixBase<Derived>::hypotNorm() const\n{\n  return this->cwiseAbs().redux(internal::scalar_hypot_op<RealScalar>());\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_STABLENORM_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/Stride.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2010 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_STRIDE_H\n#define EIGEN_STRIDE_H\n\nnamespace Eigen { \n\n/** \\class Stride\n  * \\ingroup Core_Module\n  *\n  * \\brief Holds strides information for Map\n  *\n  * This class holds the strides information for mapping arrays with strides with class Map.\n  *\n  * It holds two values: the inner stride and the outer stride.\n  *\n  * The inner stride is the pointer increment between two consecutive entries within a given row of a\n  * row-major matrix or within a given column of a column-major matrix.\n  *\n  * The outer stride is the pointer increment between two consecutive rows of a row-major matrix or\n  * between two consecutive columns of a column-major matrix.\n  *\n  * These two values can be passed either at compile-time as template parameters, or at runtime as\n  * arguments to the constructor.\n  *\n  * Indeed, this class takes two template parameters:\n  *  \\param _OuterStrideAtCompileTime the outer stride, or Dynamic if you want to specify it at runtime.\n  *  \\param _InnerStrideAtCompileTime the inner stride, or Dynamic if you want to specify it at runtime.\n  *\n  * Here is an example:\n  * \\include Map_general_stride.cpp\n  * Output: \\verbinclude Map_general_stride.out\n  *\n  * \\sa class InnerStride, class OuterStride, \\ref TopicStorageOrders\n  */\ntemplate<int _OuterStrideAtCompileTime, int _InnerStrideAtCompileTime>\nclass Stride\n{\n  public:\n    typedef DenseIndex Index;\n    enum {\n      InnerStrideAtCompileTime = _InnerStrideAtCompileTime,\n      OuterStrideAtCompileTime = _OuterStrideAtCompileTime\n    };\n\n    /** Default constructor, for use when strides are fixed at compile time */\n    Stride()\n      : m_outer(OuterStrideAtCompileTime), m_inner(InnerStrideAtCompileTime)\n    {\n      eigen_assert(InnerStrideAtCompileTime != Dynamic && OuterStrideAtCompileTime != Dynamic);\n    }\n\n    /** Constructor allowing to pass the strides at runtime */\n    Stride(Index outerStride, Index innerStride)\n      : m_outer(outerStride), m_inner(innerStride)\n    {\n      eigen_assert(innerStride>=0 && outerStride>=0);\n    }\n\n    /** Copy constructor */\n    Stride(const Stride& other)\n      : m_outer(other.outer()), m_inner(other.inner())\n    {}\n\n    /** \\returns the outer stride */\n    inline Index outer() const { return m_outer.value(); }\n    /** \\returns the inner stride */\n    inline Index inner() const { return m_inner.value(); }\n\n  protected:\n    internal::variable_if_dynamic<Index, OuterStrideAtCompileTime> m_outer;\n    internal::variable_if_dynamic<Index, InnerStrideAtCompileTime> m_inner;\n};\n\n/** \\brief Convenience specialization of Stride to specify only an inner stride\n  * See class Map for some examples */\ntemplate<int Value = Dynamic>\nclass InnerStride : public Stride<0, Value>\n{\n    typedef Stride<0, Value> Base;\n  public:\n    typedef DenseIndex Index;\n    InnerStride() : Base() {}\n    InnerStride(Index v) : Base(0, v) {}\n};\n\n/** \\brief Convenience specialization of Stride to specify only an outer stride\n  * See class Map for some examples */\ntemplate<int Value = Dynamic>\nclass OuterStride : public Stride<Value, 0>\n{\n    typedef Stride<Value, 0> Base;\n  public:\n    typedef DenseIndex Index;\n    OuterStride() : Base() {}\n    OuterStride(Index v) : Base(v,0) {}\n};\n\n} // end namespace Eigen\n\n#endif // EIGEN_STRIDE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/Swap.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SWAP_H\n#define EIGEN_SWAP_H\n\nnamespace Eigen { \n\n/** \\class SwapWrapper\n  * \\ingroup Core_Module\n  *\n  * \\internal\n  *\n  * \\brief Internal helper class for swapping two expressions\n  */\nnamespace internal {\ntemplate<typename ExpressionType>\nstruct traits<SwapWrapper<ExpressionType> > : traits<ExpressionType> {};\n}\n\ntemplate<typename ExpressionType> class SwapWrapper\n  : public internal::dense_xpr_base<SwapWrapper<ExpressionType> >::type\n{\n  public:\n\n    typedef typename internal::dense_xpr_base<SwapWrapper>::type Base;\n    EIGEN_DENSE_PUBLIC_INTERFACE(SwapWrapper)\n    typedef typename internal::packet_traits<Scalar>::type Packet;\n\n    inline SwapWrapper(ExpressionType& xpr) : m_expression(xpr) {}\n\n    inline Index rows() const { return m_expression.rows(); }\n    inline Index cols() const { return m_expression.cols(); }\n    inline Index outerStride() const { return m_expression.outerStride(); }\n    inline Index innerStride() const { return m_expression.innerStride(); }\n    \n    typedef typename internal::conditional<\n                       internal::is_lvalue<ExpressionType>::value,\n                       Scalar,\n                       const Scalar\n                     >::type ScalarWithConstIfNotLvalue;\n                     \n    inline ScalarWithConstIfNotLvalue* data() { return m_expression.data(); }\n    inline const Scalar* data() const { return m_expression.data(); }\n\n    inline Scalar& coeffRef(Index rowId, Index colId)\n    {\n      return m_expression.const_cast_derived().coeffRef(rowId, colId);\n    }\n\n    inline Scalar& coeffRef(Index index)\n    {\n      return m_expression.const_cast_derived().coeffRef(index);\n    }\n\n    inline Scalar& coeffRef(Index rowId, Index colId) const\n    {\n      return m_expression.coeffRef(rowId, colId);\n    }\n\n    inline Scalar& coeffRef(Index index) const\n    {\n      return m_expression.coeffRef(index);\n    }\n\n    template<typename OtherDerived>\n    void copyCoeff(Index rowId, Index colId, const DenseBase<OtherDerived>& other)\n    {\n      OtherDerived& _other = other.const_cast_derived();\n      eigen_internal_assert(rowId >= 0 && rowId < rows()\n                         && colId >= 0 && colId < cols());\n      Scalar tmp = m_expression.coeff(rowId, colId);\n      m_expression.coeffRef(rowId, colId) = _other.coeff(rowId, colId);\n      _other.coeffRef(rowId, colId) = tmp;\n    }\n\n    template<typename OtherDerived>\n    void copyCoeff(Index index, const DenseBase<OtherDerived>& other)\n    {\n      OtherDerived& _other = other.const_cast_derived();\n      eigen_internal_assert(index >= 0 && index < m_expression.size());\n      Scalar tmp = m_expression.coeff(index);\n      m_expression.coeffRef(index) = _other.coeff(index);\n      _other.coeffRef(index) = tmp;\n    }\n\n    template<typename OtherDerived, int StoreMode, int LoadMode>\n    void copyPacket(Index rowId, Index colId, const DenseBase<OtherDerived>& other)\n    {\n      OtherDerived& _other = other.const_cast_derived();\n      eigen_internal_assert(rowId >= 0 && rowId < rows()\n                        && colId >= 0 && colId < cols());\n      Packet tmp = m_expression.template packet<StoreMode>(rowId, colId);\n      m_expression.template writePacket<StoreMode>(rowId, colId,\n        _other.template packet<LoadMode>(rowId, colId)\n      );\n      _other.template writePacket<LoadMode>(rowId, colId, tmp);\n    }\n\n    template<typename OtherDerived, int StoreMode, int LoadMode>\n    void copyPacket(Index index, const DenseBase<OtherDerived>& other)\n    {\n      OtherDerived& _other = other.const_cast_derived();\n      eigen_internal_assert(index >= 0 && index < m_expression.size());\n      Packet tmp = m_expression.template packet<StoreMode>(index);\n      m_expression.template writePacket<StoreMode>(index,\n        _other.template packet<LoadMode>(index)\n      );\n      _other.template writePacket<LoadMode>(index, tmp);\n    }\n\n    ExpressionType& expression() const { return m_expression; }\n\n  protected:\n    ExpressionType& m_expression;\n};\n\n} // end namespace Eigen\n\n#endif // EIGEN_SWAP_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/Transpose.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_TRANSPOSE_H\n#define EIGEN_TRANSPOSE_H\n\nnamespace Eigen { \n\n/** \\class Transpose\n  * \\ingroup Core_Module\n  *\n  * \\brief Expression of the transpose of a matrix\n  *\n  * \\param MatrixType the type of the object of which we are taking the transpose\n  *\n  * This class represents an expression of the transpose of a matrix.\n  * It is the return type of MatrixBase::transpose() and MatrixBase::adjoint()\n  * and most of the time this is the only way it is used.\n  *\n  * \\sa MatrixBase::transpose(), MatrixBase::adjoint()\n  */\n\nnamespace internal {\ntemplate<typename MatrixType>\nstruct traits<Transpose<MatrixType> > : traits<MatrixType>\n{\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename nested<MatrixType>::type MatrixTypeNested;\n  typedef typename remove_reference<MatrixTypeNested>::type MatrixTypeNestedPlain;\n  typedef typename traits<MatrixType>::StorageKind StorageKind;\n  typedef typename traits<MatrixType>::XprKind XprKind;\n  enum {\n    RowsAtCompileTime = MatrixType::ColsAtCompileTime,\n    ColsAtCompileTime = MatrixType::RowsAtCompileTime,\n    MaxRowsAtCompileTime = MatrixType::MaxColsAtCompileTime,\n    MaxColsAtCompileTime = MatrixType::MaxRowsAtCompileTime,\n    FlagsLvalueBit = is_lvalue<MatrixType>::value ? LvalueBit : 0,\n    Flags0 = MatrixTypeNestedPlain::Flags & ~(LvalueBit | NestByRefBit),\n    Flags1 = Flags0 | FlagsLvalueBit,\n    Flags = Flags1 ^ RowMajorBit,\n    CoeffReadCost = MatrixTypeNestedPlain::CoeffReadCost,\n    InnerStrideAtCompileTime = inner_stride_at_compile_time<MatrixType>::ret,\n    OuterStrideAtCompileTime = outer_stride_at_compile_time<MatrixType>::ret\n  };\n};\n}\n\ntemplate<typename MatrixType, typename StorageKind> class TransposeImpl;\n\ntemplate<typename MatrixType> class Transpose\n  : public TransposeImpl<MatrixType,typename internal::traits<MatrixType>::StorageKind>\n{\n  public:\n\n    typedef typename TransposeImpl<MatrixType,typename internal::traits<MatrixType>::StorageKind>::Base Base;\n    EIGEN_GENERIC_PUBLIC_INTERFACE(Transpose)\n\n    inline Transpose(MatrixType& a_matrix) : m_matrix(a_matrix) {}\n\n    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Transpose)\n\n    inline Index rows() const { return m_matrix.cols(); }\n    inline Index cols() const { return m_matrix.rows(); }\n\n    /** \\returns the nested expression */\n    const typename internal::remove_all<typename MatrixType::Nested>::type&\n    nestedExpression() const { return m_matrix; }\n\n    /** \\returns the nested expression */\n    typename internal::remove_all<typename MatrixType::Nested>::type&\n    nestedExpression() { return m_matrix.const_cast_derived(); }\n\n  protected:\n    typename MatrixType::Nested m_matrix;\n};\n\nnamespace internal {\n\ntemplate<typename MatrixType, bool HasDirectAccess = has_direct_access<MatrixType>::ret>\nstruct TransposeImpl_base\n{\n  typedef typename dense_xpr_base<Transpose<MatrixType> >::type type;\n};\n\ntemplate<typename MatrixType>\nstruct TransposeImpl_base<MatrixType, false>\n{\n  typedef typename dense_xpr_base<Transpose<MatrixType> >::type type;\n};\n\n} // end namespace internal\n\ntemplate<typename MatrixType> class TransposeImpl<MatrixType,Dense>\n  : public internal::TransposeImpl_base<MatrixType>::type\n{\n  public:\n\n    typedef typename internal::TransposeImpl_base<MatrixType>::type Base;\n    EIGEN_DENSE_PUBLIC_INTERFACE(Transpose<MatrixType>)\n    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(TransposeImpl)\n\n    inline Index innerStride() const { return derived().nestedExpression().innerStride(); }\n    inline Index outerStride() const { return derived().nestedExpression().outerStride(); }\n\n    typedef typename internal::conditional<\n                       internal::is_lvalue<MatrixType>::value,\n                       Scalar,\n                       const Scalar\n                     >::type ScalarWithConstIfNotLvalue;\n\n    inline ScalarWithConstIfNotLvalue* data() { return derived().nestedExpression().data(); }\n    inline const Scalar* data() const { return derived().nestedExpression().data(); }\n\n    inline ScalarWithConstIfNotLvalue& coeffRef(Index rowId, Index colId)\n    {\n      EIGEN_STATIC_ASSERT_LVALUE(MatrixType)\n      return derived().nestedExpression().const_cast_derived().coeffRef(colId, rowId);\n    }\n\n    inline ScalarWithConstIfNotLvalue& coeffRef(Index index)\n    {\n      EIGEN_STATIC_ASSERT_LVALUE(MatrixType)\n      return derived().nestedExpression().const_cast_derived().coeffRef(index);\n    }\n\n    inline const Scalar& coeffRef(Index rowId, Index colId) const\n    {\n      return derived().nestedExpression().coeffRef(colId, rowId);\n    }\n\n    inline const Scalar& coeffRef(Index index) const\n    {\n      return derived().nestedExpression().coeffRef(index);\n    }\n\n    inline CoeffReturnType coeff(Index rowId, Index colId) const\n    {\n      return derived().nestedExpression().coeff(colId, rowId);\n    }\n\n    inline CoeffReturnType coeff(Index index) const\n    {\n      return derived().nestedExpression().coeff(index);\n    }\n\n    template<int LoadMode>\n    inline const PacketScalar packet(Index rowId, Index colId) const\n    {\n      return derived().nestedExpression().template packet<LoadMode>(colId, rowId);\n    }\n\n    template<int LoadMode>\n    inline void writePacket(Index rowId, Index colId, const PacketScalar& x)\n    {\n      derived().nestedExpression().const_cast_derived().template writePacket<LoadMode>(colId, rowId, x);\n    }\n\n    template<int LoadMode>\n    inline const PacketScalar packet(Index index) const\n    {\n      return derived().nestedExpression().template packet<LoadMode>(index);\n    }\n\n    template<int LoadMode>\n    inline void writePacket(Index index, const PacketScalar& x)\n    {\n      derived().nestedExpression().const_cast_derived().template writePacket<LoadMode>(index, x);\n    }\n};\n\n/** \\returns an expression of the transpose of *this.\n  *\n  * Example: \\include MatrixBase_transpose.cpp\n  * Output: \\verbinclude MatrixBase_transpose.out\n  *\n  * \\warning If you want to replace a matrix by its own transpose, do \\b NOT do this:\n  * \\code\n  * m = m.transpose(); // bug!!! caused by aliasing effect\n  * \\endcode\n  * Instead, use the transposeInPlace() method:\n  * \\code\n  * m.transposeInPlace();\n  * \\endcode\n  * which gives Eigen good opportunities for optimization, or alternatively you can also do:\n  * \\code\n  * m = m.transpose().eval();\n  * \\endcode\n  *\n  * \\sa transposeInPlace(), adjoint() */\ntemplate<typename Derived>\ninline Transpose<Derived>\nDenseBase<Derived>::transpose()\n{\n  return derived();\n}\n\n/** This is the const version of transpose().\n  *\n  * Make sure you read the warning for transpose() !\n  *\n  * \\sa transposeInPlace(), adjoint() */\ntemplate<typename Derived>\ninline typename DenseBase<Derived>::ConstTransposeReturnType\nDenseBase<Derived>::transpose() const\n{\n  return ConstTransposeReturnType(derived());\n}\n\n/** \\returns an expression of the adjoint (i.e. conjugate transpose) of *this.\n  *\n  * Example: \\include MatrixBase_adjoint.cpp\n  * Output: \\verbinclude MatrixBase_adjoint.out\n  *\n  * \\warning If you want to replace a matrix by its own adjoint, do \\b NOT do this:\n  * \\code\n  * m = m.adjoint(); // bug!!! caused by aliasing effect\n  * \\endcode\n  * Instead, use the adjointInPlace() method:\n  * \\code\n  * m.adjointInPlace();\n  * \\endcode\n  * which gives Eigen good opportunities for optimization, or alternatively you can also do:\n  * \\code\n  * m = m.adjoint().eval();\n  * \\endcode\n  *\n  * \\sa adjointInPlace(), transpose(), conjugate(), class Transpose, class internal::scalar_conjugate_op */\ntemplate<typename Derived>\ninline const typename MatrixBase<Derived>::AdjointReturnType\nMatrixBase<Derived>::adjoint() const\n{\n  return this->transpose(); // in the complex case, the .conjugate() is be implicit here\n                            // due to implicit conversion to return type\n}\n\n/***************************************************************************\n* \"in place\" transpose implementation\n***************************************************************************/\n\nnamespace internal {\n\ntemplate<typename MatrixType,\n  bool IsSquare = (MatrixType::RowsAtCompileTime == MatrixType::ColsAtCompileTime) && MatrixType::RowsAtCompileTime!=Dynamic>\nstruct inplace_transpose_selector;\n\ntemplate<typename MatrixType>\nstruct inplace_transpose_selector<MatrixType,true> { // square matrix\n  static void run(MatrixType& m) {\n    m.matrix().template triangularView<StrictlyUpper>().swap(m.matrix().transpose());\n  }\n};\n\ntemplate<typename MatrixType>\nstruct inplace_transpose_selector<MatrixType,false> { // non square matrix\n  static void run(MatrixType& m) {\n    if (m.rows()==m.cols())\n      m.matrix().template triangularView<StrictlyUpper>().swap(m.matrix().transpose());\n    else\n      m = m.transpose().eval();\n  }\n};\n\n} // end namespace internal\n\n/** This is the \"in place\" version of transpose(): it replaces \\c *this by its own transpose.\n  * Thus, doing\n  * \\code\n  * m.transposeInPlace();\n  * \\endcode\n  * has the same effect on m as doing\n  * \\code\n  * m = m.transpose().eval();\n  * \\endcode\n  * and is faster and also safer because in the latter line of code, forgetting the eval() results\n  * in a bug caused by \\ref TopicAliasing \"aliasing\".\n  *\n  * Notice however that this method is only useful if you want to replace a matrix by its own transpose.\n  * If you just need the transpose of a matrix, use transpose().\n  *\n  * \\note if the matrix is not square, then \\c *this must be a resizable matrix. \n  * This excludes (non-square) fixed-size matrices, block-expressions and maps.\n  *\n  * \\sa transpose(), adjoint(), adjointInPlace() */\ntemplate<typename Derived>\ninline void DenseBase<Derived>::transposeInPlace()\n{\n  eigen_assert((rows() == cols() || (RowsAtCompileTime == Dynamic && ColsAtCompileTime == Dynamic))\n               && \"transposeInPlace() called on a non-square non-resizable matrix\");\n  internal::inplace_transpose_selector<Derived>::run(derived());\n}\n\n/***************************************************************************\n* \"in place\" adjoint implementation\n***************************************************************************/\n\n/** This is the \"in place\" version of adjoint(): it replaces \\c *this by its own transpose.\n  * Thus, doing\n  * \\code\n  * m.adjointInPlace();\n  * \\endcode\n  * has the same effect on m as doing\n  * \\code\n  * m = m.adjoint().eval();\n  * \\endcode\n  * and is faster and also safer because in the latter line of code, forgetting the eval() results\n  * in a bug caused by aliasing.\n  *\n  * Notice however that this method is only useful if you want to replace a matrix by its own adjoint.\n  * If you just need the adjoint of a matrix, use adjoint().\n  *\n  * \\note if the matrix is not square, then \\c *this must be a resizable matrix.\n  * This excludes (non-square) fixed-size matrices, block-expressions and maps.\n  *\n  * \\sa transpose(), adjoint(), transposeInPlace() */\ntemplate<typename Derived>\ninline void MatrixBase<Derived>::adjointInPlace()\n{\n  derived() = adjoint().eval();\n}\n\n#ifndef EIGEN_NO_DEBUG\n\n// The following is to detect aliasing problems in most common cases.\n\nnamespace internal {\n\ntemplate<typename BinOp,typename Xpr,typename Rhs>\nstruct blas_traits<SelfCwiseBinaryOp<BinOp,Xpr,Rhs> >\n : blas_traits<typename internal::remove_all<typename Xpr::Nested>::type>\n{\n  typedef SelfCwiseBinaryOp<BinOp,Xpr,Rhs> XprType;\n  static inline const XprType extract(const XprType& x) { return x; }\n};\n\ntemplate<bool DestIsTransposed, typename OtherDerived>\nstruct check_transpose_aliasing_compile_time_selector\n{\n  enum { ret = bool(blas_traits<OtherDerived>::IsTransposed) != DestIsTransposed };\n};\n\ntemplate<bool DestIsTransposed, typename BinOp, typename DerivedA, typename DerivedB>\nstruct check_transpose_aliasing_compile_time_selector<DestIsTransposed,CwiseBinaryOp<BinOp,DerivedA,DerivedB> >\n{\n  enum { ret =    bool(blas_traits<DerivedA>::IsTransposed) != DestIsTransposed\n               || bool(blas_traits<DerivedB>::IsTransposed) != DestIsTransposed\n  };\n};\n\ntemplate<typename Scalar, bool DestIsTransposed, typename OtherDerived>\nstruct check_transpose_aliasing_run_time_selector\n{\n  static bool run(const Scalar* dest, const OtherDerived& src)\n  {\n    return (bool(blas_traits<OtherDerived>::IsTransposed) != DestIsTransposed) && (dest!=0 && dest==(const Scalar*)extract_data(src));\n  }\n};\n\ntemplate<typename Scalar, bool DestIsTransposed, typename BinOp, typename DerivedA, typename DerivedB>\nstruct check_transpose_aliasing_run_time_selector<Scalar,DestIsTransposed,CwiseBinaryOp<BinOp,DerivedA,DerivedB> >\n{\n  static bool run(const Scalar* dest, const CwiseBinaryOp<BinOp,DerivedA,DerivedB>& src)\n  {\n    return ((blas_traits<DerivedA>::IsTransposed != DestIsTransposed) && (dest!=0 && dest==(const Scalar*)extract_data(src.lhs())))\n        || ((blas_traits<DerivedB>::IsTransposed != DestIsTransposed) && (dest!=0 && dest==(const Scalar*)extract_data(src.rhs())));\n  }\n};\n\n// the following selector, checkTransposeAliasing_impl, based on MightHaveTransposeAliasing,\n// is because when the condition controlling the assert is known at compile time, ICC emits a warning.\n// This is actually a good warning: in expressions that don't have any transposing, the condition is\n// known at compile time to be false, and using that, we can avoid generating the code of the assert again\n// and again for all these expressions that don't need it.\n\ntemplate<typename Derived, typename OtherDerived,\n         bool MightHaveTransposeAliasing\n                 = check_transpose_aliasing_compile_time_selector\n                     <blas_traits<Derived>::IsTransposed,OtherDerived>::ret\n        >\nstruct checkTransposeAliasing_impl\n{\n    static void run(const Derived& dst, const OtherDerived& other)\n    {\n        eigen_assert((!check_transpose_aliasing_run_time_selector\n                      <typename Derived::Scalar,blas_traits<Derived>::IsTransposed,OtherDerived>\n                      ::run(extract_data(dst), other))\n          && \"aliasing detected during transposition, use transposeInPlace() \"\n             \"or evaluate the rhs into a temporary using .eval()\");\n    }\n};\n\ntemplate<typename Derived, typename OtherDerived>\nstruct checkTransposeAliasing_impl<Derived, OtherDerived, false>\n{\n    static void run(const Derived&, const OtherDerived&)\n    {\n    }\n};\n\n} // end namespace internal\n\ntemplate<typename Derived>\ntemplate<typename OtherDerived>\nvoid DenseBase<Derived>::checkTransposeAliasing(const OtherDerived& other) const\n{\n    internal::checkTransposeAliasing_impl<Derived, OtherDerived>::run(derived(), other);\n}\n#endif\n\n} // end namespace Eigen\n\n#endif // EIGEN_TRANSPOSE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/Transpositions.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2010-2011 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_TRANSPOSITIONS_H\n#define EIGEN_TRANSPOSITIONS_H\n\nnamespace Eigen { \n\n/** \\class Transpositions\n  * \\ingroup Core_Module\n  *\n  * \\brief Represents a sequence of transpositions (row/column interchange)\n  *\n  * \\param SizeAtCompileTime the number of transpositions, or Dynamic\n  * \\param MaxSizeAtCompileTime the maximum number of transpositions, or Dynamic. This optional parameter defaults to SizeAtCompileTime. Most of the time, you should not have to specify it.\n  *\n  * This class represents a permutation transformation as a sequence of \\em n transpositions\n  * \\f$[T_{n-1} \\ldots T_{i} \\ldots T_{0}]\\f$. It is internally stored as a vector of integers \\c indices.\n  * Each transposition \\f$ T_{i} \\f$ applied on the left of a matrix (\\f$ T_{i} M\\f$) interchanges\n  * the rows \\c i and \\c indices[i] of the matrix \\c M.\n  * A transposition applied on the right (e.g., \\f$ M T_{i}\\f$) yields a column interchange.\n  *\n  * Compared to the class PermutationMatrix, such a sequence of transpositions is what is\n  * computed during a decomposition with pivoting, and it is faster when applying the permutation in-place.\n  * \n  * To apply a sequence of transpositions to a matrix, simply use the operator * as in the following example:\n  * \\code\n  * Transpositions tr;\n  * MatrixXf mat;\n  * mat = tr * mat;\n  * \\endcode\n  * In this example, we detect that the matrix appears on both side, and so the transpositions\n  * are applied in-place without any temporary or extra copy.\n  *\n  * \\sa class PermutationMatrix\n  */\n\nnamespace internal {\ntemplate<typename TranspositionType, typename MatrixType, int Side, bool Transposed=false> struct transposition_matrix_product_retval;\n}\n\ntemplate<typename Derived>\nclass TranspositionsBase\n{\n    typedef internal::traits<Derived> Traits;\n    \n  public:\n\n    typedef typename Traits::IndicesType IndicesType;\n    typedef typename IndicesType::Scalar Index;\n\n    Derived& derived() { return *static_cast<Derived*>(this); }\n    const Derived& derived() const { return *static_cast<const Derived*>(this); }\n\n    /** Copies the \\a other transpositions into \\c *this */\n    template<typename OtherDerived>\n    Derived& operator=(const TranspositionsBase<OtherDerived>& other)\n    {\n      indices() = other.indices();\n      return derived();\n    }\n\n    #ifndef EIGEN_PARSED_BY_DOXYGEN\n    /** This is a special case of the templated operator=. Its purpose is to\n      * prevent a default operator= from hiding the templated operator=.\n      */\n    Derived& operator=(const TranspositionsBase& other)\n    {\n      indices() = other.indices();\n      return derived();\n    }\n    #endif\n\n    /** \\returns the number of transpositions */\n    inline Index size() const { return indices().size(); }\n\n    /** Direct access to the underlying index vector */\n    inline const Index& coeff(Index i) const { return indices().coeff(i); }\n    /** Direct access to the underlying index vector */\n    inline Index& coeffRef(Index i) { return indices().coeffRef(i); }\n    /** Direct access to the underlying index vector */\n    inline const Index& operator()(Index i) const { return indices()(i); }\n    /** Direct access to the underlying index vector */\n    inline Index& operator()(Index i) { return indices()(i); }\n    /** Direct access to the underlying index vector */\n    inline const Index& operator[](Index i) const { return indices()(i); }\n    /** Direct access to the underlying index vector */\n    inline Index& operator[](Index i) { return indices()(i); }\n\n    /** const version of indices(). */\n    const IndicesType& indices() const { return derived().indices(); }\n    /** \\returns a reference to the stored array representing the transpositions. */\n    IndicesType& indices() { return derived().indices(); }\n\n    /** Resizes to given size. */\n    inline void resize(int newSize)\n    {\n      indices().resize(newSize);\n    }\n\n    /** Sets \\c *this to represents an identity transformation */\n    void setIdentity()\n    {\n      for(int i = 0; i < indices().size(); ++i)\n        coeffRef(i) = i;\n    }\n\n    // FIXME: do we want such methods ?\n    // might be usefull when the target matrix expression is complex, e.g.:\n    // object.matrix().block(..,..,..,..) = trans * object.matrix().block(..,..,..,..);\n    /*\n    template<typename MatrixType>\n    void applyForwardToRows(MatrixType& mat) const\n    {\n      for(Index k=0 ; k<size() ; ++k)\n        if(m_indices(k)!=k)\n          mat.row(k).swap(mat.row(m_indices(k)));\n    }\n\n    template<typename MatrixType>\n    void applyBackwardToRows(MatrixType& mat) const\n    {\n      for(Index k=size()-1 ; k>=0 ; --k)\n        if(m_indices(k)!=k)\n          mat.row(k).swap(mat.row(m_indices(k)));\n    }\n    */\n\n    /** \\returns the inverse transformation */\n    inline Transpose<TranspositionsBase> inverse() const\n    { return Transpose<TranspositionsBase>(derived()); }\n\n    /** \\returns the tranpose transformation */\n    inline Transpose<TranspositionsBase> transpose() const\n    { return Transpose<TranspositionsBase>(derived()); }\n\n  protected:\n};\n\nnamespace internal {\ntemplate<int SizeAtCompileTime, int MaxSizeAtCompileTime, typename IndexType>\nstruct traits<Transpositions<SizeAtCompileTime,MaxSizeAtCompileTime,IndexType> >\n{\n  typedef IndexType Index;\n  typedef Matrix<Index, SizeAtCompileTime, 1, 0, MaxSizeAtCompileTime, 1> IndicesType;\n};\n}\n\ntemplate<int SizeAtCompileTime, int MaxSizeAtCompileTime, typename IndexType>\nclass Transpositions : public TranspositionsBase<Transpositions<SizeAtCompileTime,MaxSizeAtCompileTime,IndexType> >\n{\n    typedef internal::traits<Transpositions> Traits;\n  public:\n\n    typedef TranspositionsBase<Transpositions> Base;\n    typedef typename Traits::IndicesType IndicesType;\n    typedef typename IndicesType::Scalar Index;\n\n    inline Transpositions() {}\n\n    /** Copy constructor. */\n    template<typename OtherDerived>\n    inline Transpositions(const TranspositionsBase<OtherDerived>& other)\n      : m_indices(other.indices()) {}\n\n    #ifndef EIGEN_PARSED_BY_DOXYGEN\n    /** Standard copy constructor. Defined only to prevent a default copy constructor\n      * from hiding the other templated constructor */\n    inline Transpositions(const Transpositions& other) : m_indices(other.indices()) {}\n    #endif\n\n    /** Generic constructor from expression of the transposition indices. */\n    template<typename Other>\n    explicit inline Transpositions(const MatrixBase<Other>& a_indices) : m_indices(a_indices)\n    {}\n\n    /** Copies the \\a other transpositions into \\c *this */\n    template<typename OtherDerived>\n    Transpositions& operator=(const TranspositionsBase<OtherDerived>& other)\n    {\n      return Base::operator=(other);\n    }\n\n    #ifndef EIGEN_PARSED_BY_DOXYGEN\n    /** This is a special case of the templated operator=. Its purpose is to\n      * prevent a default operator= from hiding the templated operator=.\n      */\n    Transpositions& operator=(const Transpositions& other)\n    {\n      m_indices = other.m_indices;\n      return *this;\n    }\n    #endif\n\n    /** Constructs an uninitialized permutation matrix of given size.\n      */\n    inline Transpositions(Index size) : m_indices(size)\n    {}\n\n    /** const version of indices(). */\n    const IndicesType& indices() const { return m_indices; }\n    /** \\returns a reference to the stored array representing the transpositions. */\n    IndicesType& indices() { return m_indices; }\n\n  protected:\n\n    IndicesType m_indices;\n};\n\n\nnamespace internal {\ntemplate<int SizeAtCompileTime, int MaxSizeAtCompileTime, typename IndexType, int _PacketAccess>\nstruct traits<Map<Transpositions<SizeAtCompileTime,MaxSizeAtCompileTime,IndexType>,_PacketAccess> >\n{\n  typedef IndexType Index;\n  typedef Map<const Matrix<Index,SizeAtCompileTime,1,0,MaxSizeAtCompileTime,1>, _PacketAccess> IndicesType;\n};\n}\n\ntemplate<int SizeAtCompileTime, int MaxSizeAtCompileTime, typename IndexType, int PacketAccess>\nclass Map<Transpositions<SizeAtCompileTime,MaxSizeAtCompileTime,IndexType>,PacketAccess>\n : public TranspositionsBase<Map<Transpositions<SizeAtCompileTime,MaxSizeAtCompileTime,IndexType>,PacketAccess> >\n{\n    typedef internal::traits<Map> Traits;\n  public:\n\n    typedef TranspositionsBase<Map> Base;\n    typedef typename Traits::IndicesType IndicesType;\n    typedef typename IndicesType::Scalar Index;\n\n    inline Map(const Index* indicesPtr)\n      : m_indices(indicesPtr)\n    {}\n\n    inline Map(const Index* indicesPtr, Index size)\n      : m_indices(indicesPtr,size)\n    {}\n\n    /** Copies the \\a other transpositions into \\c *this */\n    template<typename OtherDerived>\n    Map& operator=(const TranspositionsBase<OtherDerived>& other)\n    {\n      return Base::operator=(other);\n    }\n\n    #ifndef EIGEN_PARSED_BY_DOXYGEN\n    /** This is a special case of the templated operator=. Its purpose is to\n      * prevent a default operator= from hiding the templated operator=.\n      */\n    Map& operator=(const Map& other)\n    {\n      m_indices = other.m_indices;\n      return *this;\n    }\n    #endif\n\n    /** const version of indices(). */\n    const IndicesType& indices() const { return m_indices; }\n    \n    /** \\returns a reference to the stored array representing the transpositions. */\n    IndicesType& indices() { return m_indices; }\n\n  protected:\n\n    IndicesType m_indices;\n};\n\nnamespace internal {\ntemplate<typename _IndicesType>\nstruct traits<TranspositionsWrapper<_IndicesType> >\n{\n  typedef typename _IndicesType::Scalar Index;\n  typedef _IndicesType IndicesType;\n};\n}\n\ntemplate<typename _IndicesType>\nclass TranspositionsWrapper\n : public TranspositionsBase<TranspositionsWrapper<_IndicesType> >\n{\n    typedef internal::traits<TranspositionsWrapper> Traits;\n  public:\n\n    typedef TranspositionsBase<TranspositionsWrapper> Base;\n    typedef typename Traits::IndicesType IndicesType;\n    typedef typename IndicesType::Scalar Index;\n\n    inline TranspositionsWrapper(IndicesType& a_indices)\n      : m_indices(a_indices)\n    {}\n\n    /** Copies the \\a other transpositions into \\c *this */\n    template<typename OtherDerived>\n    TranspositionsWrapper& operator=(const TranspositionsBase<OtherDerived>& other)\n    {\n      return Base::operator=(other);\n    }\n\n    #ifndef EIGEN_PARSED_BY_DOXYGEN\n    /** This is a special case of the templated operator=. Its purpose is to\n      * prevent a default operator= from hiding the templated operator=.\n      */\n    TranspositionsWrapper& operator=(const TranspositionsWrapper& other)\n    {\n      m_indices = other.m_indices;\n      return *this;\n    }\n    #endif\n\n    /** const version of indices(). */\n    const IndicesType& indices() const { return m_indices; }\n\n    /** \\returns a reference to the stored array representing the transpositions. */\n    IndicesType& indices() { return m_indices; }\n\n  protected:\n\n    const typename IndicesType::Nested m_indices;\n};\n\n/** \\returns the \\a matrix with the \\a transpositions applied to the columns.\n  */\ntemplate<typename Derived, typename TranspositionsDerived>\ninline const internal::transposition_matrix_product_retval<TranspositionsDerived, Derived, OnTheRight>\noperator*(const MatrixBase<Derived>& matrix,\n          const TranspositionsBase<TranspositionsDerived> &transpositions)\n{\n  return internal::transposition_matrix_product_retval\n           <TranspositionsDerived, Derived, OnTheRight>\n           (transpositions.derived(), matrix.derived());\n}\n\n/** \\returns the \\a matrix with the \\a transpositions applied to the rows.\n  */\ntemplate<typename Derived, typename TranspositionDerived>\ninline const internal::transposition_matrix_product_retval\n               <TranspositionDerived, Derived, OnTheLeft>\noperator*(const TranspositionsBase<TranspositionDerived> &transpositions,\n          const MatrixBase<Derived>& matrix)\n{\n  return internal::transposition_matrix_product_retval\n           <TranspositionDerived, Derived, OnTheLeft>\n           (transpositions.derived(), matrix.derived());\n}\n\nnamespace internal {\n\ntemplate<typename TranspositionType, typename MatrixType, int Side, bool Transposed>\nstruct traits<transposition_matrix_product_retval<TranspositionType, MatrixType, Side, Transposed> >\n{\n  typedef typename MatrixType::PlainObject ReturnType;\n};\n\ntemplate<typename TranspositionType, typename MatrixType, int Side, bool Transposed>\nstruct transposition_matrix_product_retval\n : public ReturnByValue<transposition_matrix_product_retval<TranspositionType, MatrixType, Side, Transposed> >\n{\n    typedef typename remove_all<typename MatrixType::Nested>::type MatrixTypeNestedCleaned;\n    typedef typename TranspositionType::Index Index;\n\n    transposition_matrix_product_retval(const TranspositionType& tr, const MatrixType& matrix)\n      : m_transpositions(tr), m_matrix(matrix)\n    {}\n\n    inline int rows() const { return m_matrix.rows(); }\n    inline int cols() const { return m_matrix.cols(); }\n\n    template<typename Dest> inline void evalTo(Dest& dst) const\n    {\n      const int size = m_transpositions.size();\n      Index j = 0;\n\n      const typename Dest::Scalar *dst_data = internal::extract_data(dst);\n      if(!(is_same<MatrixTypeNestedCleaned,Dest>::value && dst_data!=0 && dst_data == extract_data(m_matrix)))\n        dst = m_matrix;\n\n      for(int k=(Transposed?size-1:0) ; Transposed?k>=0:k<size ; Transposed?--k:++k)\n        if((j=m_transpositions.coeff(k))!=k)\n        {\n          if(Side==OnTheLeft)\n            dst.row(k).swap(dst.row(j));\n          else if(Side==OnTheRight)\n            dst.col(k).swap(dst.col(j));\n        }\n    }\n\n  protected:\n    const TranspositionType& m_transpositions;\n    typename MatrixType::Nested m_matrix;\n};\n\n} // end namespace internal\n\n/* Template partial specialization for transposed/inverse transpositions */\n\ntemplate<typename TranspositionsDerived>\nclass Transpose<TranspositionsBase<TranspositionsDerived> >\n{\n    typedef TranspositionsDerived TranspositionType;\n    typedef typename TranspositionType::IndicesType IndicesType;\n  public:\n\n    Transpose(const TranspositionType& t) : m_transpositions(t) {}\n\n    inline int size() const { return m_transpositions.size(); }\n\n    /** \\returns the \\a matrix with the inverse transpositions applied to the columns.\n      */\n    template<typename Derived> friend\n    inline const internal::transposition_matrix_product_retval<TranspositionType, Derived, OnTheRight, true>\n    operator*(const MatrixBase<Derived>& matrix, const Transpose& trt)\n    {\n      return internal::transposition_matrix_product_retval<TranspositionType, Derived, OnTheRight, true>(trt.m_transpositions, matrix.derived());\n    }\n\n    /** \\returns the \\a matrix with the inverse transpositions applied to the rows.\n      */\n    template<typename Derived>\n    inline const internal::transposition_matrix_product_retval<TranspositionType, Derived, OnTheLeft, true>\n    operator*(const MatrixBase<Derived>& matrix) const\n    {\n      return internal::transposition_matrix_product_retval<TranspositionType, Derived, OnTheLeft, true>(m_transpositions, matrix.derived());\n    }\n\n  protected:\n    const TranspositionType& m_transpositions;\n};\n\n} // end namespace Eigen\n\n#endif // EIGEN_TRANSPOSITIONS_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/TriangularMatrix.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_TRIANGULARMATRIX_H\n#define EIGEN_TRIANGULARMATRIX_H\n\nnamespace Eigen { \n\nnamespace internal {\n  \ntemplate<int Side, typename TriangularType, typename Rhs> struct triangular_solve_retval;\n  \n}\n\n/** \\internal\n  *\n  * \\class TriangularBase\n  * \\ingroup Core_Module\n  *\n  * \\brief Base class for triangular part in a matrix\n  */\ntemplate<typename Derived> class TriangularBase : public EigenBase<Derived>\n{\n  public:\n\n    enum {\n      Mode = internal::traits<Derived>::Mode,\n      CoeffReadCost = internal::traits<Derived>::CoeffReadCost,\n      RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,\n      ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,\n      MaxRowsAtCompileTime = internal::traits<Derived>::MaxRowsAtCompileTime,\n      MaxColsAtCompileTime = internal::traits<Derived>::MaxColsAtCompileTime\n    };\n    typedef typename internal::traits<Derived>::Scalar Scalar;\n    typedef typename internal::traits<Derived>::StorageKind StorageKind;\n    typedef typename internal::traits<Derived>::Index Index;\n    typedef typename internal::traits<Derived>::DenseMatrixType DenseMatrixType;\n    typedef DenseMatrixType DenseType;\n\n    inline TriangularBase() { eigen_assert(!((Mode&UnitDiag) && (Mode&ZeroDiag))); }\n\n    inline Index rows() const { return derived().rows(); }\n    inline Index cols() const { return derived().cols(); }\n    inline Index outerStride() const { return derived().outerStride(); }\n    inline Index innerStride() const { return derived().innerStride(); }\n\n    inline Scalar coeff(Index row, Index col) const  { return derived().coeff(row,col); }\n    inline Scalar& coeffRef(Index row, Index col) { return derived().coeffRef(row,col); }\n\n    /** \\see MatrixBase::copyCoeff(row,col)\n      */\n    template<typename Other>\n    EIGEN_STRONG_INLINE void copyCoeff(Index row, Index col, Other& other)\n    {\n      derived().coeffRef(row, col) = other.coeff(row, col);\n    }\n\n    inline Scalar operator()(Index row, Index col) const\n    {\n      check_coordinates(row, col);\n      return coeff(row,col);\n    }\n    inline Scalar& operator()(Index row, Index col)\n    {\n      check_coordinates(row, col);\n      return coeffRef(row,col);\n    }\n\n    #ifndef EIGEN_PARSED_BY_DOXYGEN\n    inline const Derived& derived() const { return *static_cast<const Derived*>(this); }\n    inline Derived& derived() { return *static_cast<Derived*>(this); }\n    #endif // not EIGEN_PARSED_BY_DOXYGEN\n\n    template<typename DenseDerived>\n    void evalTo(MatrixBase<DenseDerived> &other) const;\n    template<typename DenseDerived>\n    void evalToLazy(MatrixBase<DenseDerived> &other) const;\n\n    DenseMatrixType toDenseMatrix() const\n    {\n      DenseMatrixType res(rows(), cols());\n      evalToLazy(res);\n      return res;\n    }\n\n  protected:\n\n    void check_coordinates(Index row, Index col) const\n    {\n      EIGEN_ONLY_USED_FOR_DEBUG(row);\n      EIGEN_ONLY_USED_FOR_DEBUG(col);\n      eigen_assert(col>=0 && col<cols() && row>=0 && row<rows());\n      const int mode = int(Mode) & ~SelfAdjoint;\n      EIGEN_ONLY_USED_FOR_DEBUG(mode);\n      eigen_assert((mode==Upper && col>=row)\n                || (mode==Lower && col<=row)\n                || ((mode==StrictlyUpper || mode==UnitUpper) && col>row)\n                || ((mode==StrictlyLower || mode==UnitLower) && col<row));\n    }\n\n    #ifdef EIGEN_INTERNAL_DEBUGGING\n    void check_coordinates_internal(Index row, Index col) const\n    {\n      check_coordinates(row, col);\n    }\n    #else\n    void check_coordinates_internal(Index , Index ) const {}\n    #endif\n\n};\n\n/** \\class TriangularView\n  * \\ingroup Core_Module\n  *\n  * \\brief Base class for triangular part in a matrix\n  *\n  * \\param MatrixType the type of the object in which we are taking the triangular part\n  * \\param Mode the kind of triangular matrix expression to construct. Can be #Upper,\n  *             #Lower, #UnitUpper, #UnitLower, #StrictlyUpper, or #StrictlyLower.\n  *             This is in fact a bit field; it must have either #Upper or #Lower, \n  *             and additionnaly it may have #UnitDiag or #ZeroDiag or neither.\n  *\n  * This class represents a triangular part of a matrix, not necessarily square. Strictly speaking, for rectangular\n  * matrices one should speak of \"trapezoid\" parts. This class is the return type\n  * of MatrixBase::triangularView() and most of the time this is the only way it is used.\n  *\n  * \\sa MatrixBase::triangularView()\n  */\nnamespace internal {\ntemplate<typename MatrixType, unsigned int _Mode>\nstruct traits<TriangularView<MatrixType, _Mode> > : traits<MatrixType>\n{\n  typedef typename nested<MatrixType>::type MatrixTypeNested;\n  typedef typename remove_reference<MatrixTypeNested>::type MatrixTypeNestedNonRef;\n  typedef typename remove_all<MatrixTypeNested>::type MatrixTypeNestedCleaned;\n  typedef MatrixType ExpressionType;\n  typedef typename MatrixType::PlainObject DenseMatrixType;\n  enum {\n    Mode = _Mode,\n    Flags = (MatrixTypeNestedCleaned::Flags & (HereditaryBits) & (~(PacketAccessBit | DirectAccessBit | LinearAccessBit))) | Mode,\n    CoeffReadCost = MatrixTypeNestedCleaned::CoeffReadCost\n  };\n};\n}\n\ntemplate<int Mode, bool LhsIsTriangular,\n         typename Lhs, bool LhsIsVector,\n         typename Rhs, bool RhsIsVector>\nstruct TriangularProduct;\n\ntemplate<typename _MatrixType, unsigned int _Mode> class TriangularView\n  : public TriangularBase<TriangularView<_MatrixType, _Mode> >\n{\n  public:\n\n    typedef TriangularBase<TriangularView> Base;\n    typedef typename internal::traits<TriangularView>::Scalar Scalar;\n\n    typedef _MatrixType MatrixType;\n    typedef typename internal::traits<TriangularView>::DenseMatrixType DenseMatrixType;\n    typedef DenseMatrixType PlainObject;\n\n  protected:\n    typedef typename internal::traits<TriangularView>::MatrixTypeNested MatrixTypeNested;\n    typedef typename internal::traits<TriangularView>::MatrixTypeNestedNonRef MatrixTypeNestedNonRef;\n    typedef typename internal::traits<TriangularView>::MatrixTypeNestedCleaned MatrixTypeNestedCleaned;\n\n    typedef typename internal::remove_all<typename MatrixType::ConjugateReturnType>::type MatrixConjugateReturnType;\n    \n  public:\n    using Base::evalToLazy;\n  \n\n    typedef typename internal::traits<TriangularView>::StorageKind StorageKind;\n    typedef typename internal::traits<TriangularView>::Index Index;\n\n    enum {\n      Mode = _Mode,\n      TransposeMode = (Mode & Upper ? Lower : 0)\n                    | (Mode & Lower ? Upper : 0)\n                    | (Mode & (UnitDiag))\n                    | (Mode & (ZeroDiag))\n    };\n\n    inline TriangularView(const MatrixType& matrix) : m_matrix(matrix)\n    {}\n\n    inline Index rows() const { return m_matrix.rows(); }\n    inline Index cols() const { return m_matrix.cols(); }\n    inline Index outerStride() const { return m_matrix.outerStride(); }\n    inline Index innerStride() const { return m_matrix.innerStride(); }\n\n    /** \\sa MatrixBase::operator+=() */\n    template<typename Other> TriangularView&  operator+=(const DenseBase<Other>& other) { return *this = m_matrix + other.derived(); }\n    /** \\sa MatrixBase::operator-=() */\n    template<typename Other> TriangularView&  operator-=(const DenseBase<Other>& other) { return *this = m_matrix - other.derived(); }\n    /** \\sa MatrixBase::operator*=() */\n    TriangularView&  operator*=(const typename internal::traits<MatrixType>::Scalar& other) { return *this = m_matrix * other; }\n    /** \\sa MatrixBase::operator/=() */\n    TriangularView&  operator/=(const typename internal::traits<MatrixType>::Scalar& other) { return *this = m_matrix / other; }\n\n    /** \\sa MatrixBase::fill() */\n    void fill(const Scalar& value) { setConstant(value); }\n    /** \\sa MatrixBase::setConstant() */\n    TriangularView& setConstant(const Scalar& value)\n    { return *this = MatrixType::Constant(rows(), cols(), value); }\n    /** \\sa MatrixBase::setZero() */\n    TriangularView& setZero() { return setConstant(Scalar(0)); }\n    /** \\sa MatrixBase::setOnes() */\n    TriangularView& setOnes() { return setConstant(Scalar(1)); }\n\n    /** \\sa MatrixBase::coeff()\n      * \\warning the coordinates must fit into the referenced triangular part\n      */\n    inline Scalar coeff(Index row, Index col) const\n    {\n      Base::check_coordinates_internal(row, col);\n      return m_matrix.coeff(row, col);\n    }\n\n    /** \\sa MatrixBase::coeffRef()\n      * \\warning the coordinates must fit into the referenced triangular part\n      */\n    inline Scalar& coeffRef(Index row, Index col)\n    {\n      Base::check_coordinates_internal(row, col);\n      return m_matrix.const_cast_derived().coeffRef(row, col);\n    }\n\n    const MatrixTypeNestedCleaned& nestedExpression() const { return m_matrix; }\n    MatrixTypeNestedCleaned& nestedExpression() { return *const_cast<MatrixTypeNestedCleaned*>(&m_matrix); }\n\n    /** Assigns a triangular matrix to a triangular part of a dense matrix */\n    template<typename OtherDerived>\n    TriangularView& operator=(const TriangularBase<OtherDerived>& other);\n\n    template<typename OtherDerived>\n    TriangularView& operator=(const MatrixBase<OtherDerived>& other);\n\n    TriangularView& operator=(const TriangularView& other)\n    { return *this = other.nestedExpression(); }\n\n    template<typename OtherDerived>\n    void lazyAssign(const TriangularBase<OtherDerived>& other);\n\n    template<typename OtherDerived>\n    void lazyAssign(const MatrixBase<OtherDerived>& other);\n\n    /** \\sa MatrixBase::conjugate() */\n    inline TriangularView<MatrixConjugateReturnType,Mode> conjugate()\n    { return m_matrix.conjugate(); }\n    /** \\sa MatrixBase::conjugate() const */\n    inline const TriangularView<MatrixConjugateReturnType,Mode> conjugate() const\n    { return m_matrix.conjugate(); }\n\n    /** \\sa MatrixBase::adjoint() const */\n    inline const TriangularView<const typename MatrixType::AdjointReturnType,TransposeMode> adjoint() const\n    { return m_matrix.adjoint(); }\n\n    /** \\sa MatrixBase::transpose() */\n    inline TriangularView<Transpose<MatrixType>,TransposeMode> transpose()\n    {\n      EIGEN_STATIC_ASSERT_LVALUE(MatrixType)\n      return m_matrix.const_cast_derived().transpose();\n    }\n    /** \\sa MatrixBase::transpose() const */\n    inline const TriangularView<Transpose<MatrixType>,TransposeMode> transpose() const\n    {\n      return m_matrix.transpose();\n    }\n\n    /** Efficient triangular matrix times vector/matrix product */\n    template<typename OtherDerived>\n    TriangularProduct<Mode, true, MatrixType, false, OtherDerived, OtherDerived::ColsAtCompileTime==1>\n    operator*(const MatrixBase<OtherDerived>& rhs) const\n    {\n      return TriangularProduct\n              <Mode, true, MatrixType, false, OtherDerived, OtherDerived::ColsAtCompileTime==1>\n              (m_matrix, rhs.derived());\n    }\n\n    /** Efficient vector/matrix times triangular matrix product */\n    template<typename OtherDerived> friend\n    TriangularProduct<Mode, false, OtherDerived, OtherDerived::RowsAtCompileTime==1, MatrixType, false>\n    operator*(const MatrixBase<OtherDerived>& lhs, const TriangularView& rhs)\n    {\n      return TriangularProduct\n              <Mode, false, OtherDerived, OtherDerived::RowsAtCompileTime==1, MatrixType, false>\n              (lhs.derived(),rhs.m_matrix);\n    }\n\n    #ifdef EIGEN2_SUPPORT\n    template<typename OtherDerived>\n    struct eigen2_product_return_type\n    {\n      typedef typename TriangularView<MatrixType,Mode>::DenseMatrixType DenseMatrixType;\n      typedef typename OtherDerived::PlainObject::DenseType OtherPlainObject;\n      typedef typename ProductReturnType<DenseMatrixType, OtherPlainObject>::Type ProdRetType;\n      typedef typename ProdRetType::PlainObject type;\n    };\n    template<typename OtherDerived>\n    const typename eigen2_product_return_type<OtherDerived>::type\n    operator*(const EigenBase<OtherDerived>& rhs) const\n    {\n      typename OtherDerived::PlainObject::DenseType rhsPlainObject;\n      rhs.evalTo(rhsPlainObject);\n      return this->toDenseMatrix() * rhsPlainObject;\n    }\n    template<typename OtherMatrixType>\n    bool isApprox(const TriangularView<OtherMatrixType, Mode>& other, typename NumTraits<Scalar>::Real precision = NumTraits<Scalar>::dummy_precision()) const\n    {\n      return this->toDenseMatrix().isApprox(other.toDenseMatrix(), precision);\n    }\n    template<typename OtherDerived>\n    bool isApprox(const MatrixBase<OtherDerived>& other, typename NumTraits<Scalar>::Real precision = NumTraits<Scalar>::dummy_precision()) const\n    {\n      return this->toDenseMatrix().isApprox(other, precision);\n    }\n    #endif // EIGEN2_SUPPORT\n\n    template<int Side, typename Other>\n    inline const internal::triangular_solve_retval<Side,TriangularView, Other>\n    solve(const MatrixBase<Other>& other) const;\n\n    template<int Side, typename OtherDerived>\n    void solveInPlace(const MatrixBase<OtherDerived>& other) const;\n\n    template<typename Other>\n    inline const internal::triangular_solve_retval<OnTheLeft,TriangularView, Other> \n    solve(const MatrixBase<Other>& other) const\n    { return solve<OnTheLeft>(other); }\n\n    template<typename OtherDerived>\n    void solveInPlace(const MatrixBase<OtherDerived>& other) const\n    { return solveInPlace<OnTheLeft>(other); }\n\n    const SelfAdjointView<MatrixTypeNestedNonRef,Mode> selfadjointView() const\n    {\n      EIGEN_STATIC_ASSERT((Mode&UnitDiag)==0,PROGRAMMING_ERROR);\n      return SelfAdjointView<MatrixTypeNestedNonRef,Mode>(m_matrix);\n    }\n    SelfAdjointView<MatrixTypeNestedNonRef,Mode> selfadjointView()\n    {\n      EIGEN_STATIC_ASSERT((Mode&UnitDiag)==0,PROGRAMMING_ERROR);\n      return SelfAdjointView<MatrixTypeNestedNonRef,Mode>(m_matrix);\n    }\n\n    template<typename OtherDerived>\n    void swap(TriangularBase<OtherDerived> const & other)\n    {\n      TriangularView<SwapWrapper<MatrixType>,Mode>(const_cast<MatrixType&>(m_matrix)).lazyAssign(other.derived());\n    }\n\n    template<typename OtherDerived>\n    void swap(MatrixBase<OtherDerived> const & other)\n    {\n      SwapWrapper<MatrixType> swaper(const_cast<MatrixType&>(m_matrix));\n      TriangularView<SwapWrapper<MatrixType>,Mode>(swaper).lazyAssign(other.derived());\n    }\n\n    Scalar determinant() const\n    {\n      if (Mode & UnitDiag)\n        return 1;\n      else if (Mode & ZeroDiag)\n        return 0;\n      else\n        return m_matrix.diagonal().prod();\n    }\n    \n    // TODO simplify the following:\n    template<typename ProductDerived, typename Lhs, typename Rhs>\n    EIGEN_STRONG_INLINE TriangularView& operator=(const ProductBase<ProductDerived, Lhs,Rhs>& other)\n    {\n      setZero();\n      return assignProduct(other.derived(),1);\n    }\n    \n    template<typename ProductDerived, typename Lhs, typename Rhs>\n    EIGEN_STRONG_INLINE TriangularView& operator+=(const ProductBase<ProductDerived, Lhs,Rhs>& other)\n    {\n      return assignProduct(other.derived(),1);\n    }\n    \n    template<typename ProductDerived, typename Lhs, typename Rhs>\n    EIGEN_STRONG_INLINE TriangularView& operator-=(const ProductBase<ProductDerived, Lhs,Rhs>& other)\n    {\n      return assignProduct(other.derived(),-1);\n    }\n    \n    \n    template<typename ProductDerived>\n    EIGEN_STRONG_INLINE TriangularView& operator=(const ScaledProduct<ProductDerived>& other)\n    {\n      setZero();\n      return assignProduct(other.derived(),other.alpha());\n    }\n    \n    template<typename ProductDerived>\n    EIGEN_STRONG_INLINE TriangularView& operator+=(const ScaledProduct<ProductDerived>& other)\n    {\n      return assignProduct(other.derived(),other.alpha());\n    }\n    \n    template<typename ProductDerived>\n    EIGEN_STRONG_INLINE TriangularView& operator-=(const ScaledProduct<ProductDerived>& other)\n    {\n      return assignProduct(other.derived(),-other.alpha());\n    }\n    \n  protected:\n    \n    template<typename ProductDerived, typename Lhs, typename Rhs>\n    EIGEN_STRONG_INLINE TriangularView& assignProduct(const ProductBase<ProductDerived, Lhs,Rhs>& prod, const Scalar& alpha);\n    \n    template<int Mode, bool LhsIsTriangular,\n         typename Lhs, bool LhsIsVector,\n         typename Rhs, bool RhsIsVector>\n    EIGEN_STRONG_INLINE TriangularView& assignProduct(const TriangularProduct<Mode, LhsIsTriangular, Lhs, LhsIsVector, Rhs, RhsIsVector>& prod, const Scalar& alpha)\n    {\n      lazyAssign(alpha*prod.eval());\n      return *this;\n    }\n\n    MatrixTypeNested m_matrix;\n};\n\n/***************************************************************************\n* Implementation of triangular evaluation/assignment\n***************************************************************************/\n\nnamespace internal {\n\ntemplate<typename Derived1, typename Derived2, unsigned int Mode, int UnrollCount, bool ClearOpposite>\nstruct triangular_assignment_selector\n{\n  enum {\n    col = (UnrollCount-1) / Derived1::RowsAtCompileTime,\n    row = (UnrollCount-1) % Derived1::RowsAtCompileTime\n  };\n  \n  typedef typename Derived1::Scalar Scalar;\n\n  static inline void run(Derived1 &dst, const Derived2 &src)\n  {\n    triangular_assignment_selector<Derived1, Derived2, Mode, UnrollCount-1, ClearOpposite>::run(dst, src);\n\n    eigen_assert( Mode == Upper || Mode == Lower\n            || Mode == StrictlyUpper || Mode == StrictlyLower\n            || Mode == UnitUpper || Mode == UnitLower);\n    if((Mode == Upper && row <= col)\n    || (Mode == Lower && row >= col)\n    || (Mode == StrictlyUpper && row < col)\n    || (Mode == StrictlyLower && row > col)\n    || (Mode == UnitUpper && row < col)\n    || (Mode == UnitLower && row > col))\n      dst.copyCoeff(row, col, src);\n    else if(ClearOpposite)\n    {\n      if (Mode&UnitDiag && row==col)\n        dst.coeffRef(row, col) = Scalar(1);\n      else\n        dst.coeffRef(row, col) = Scalar(0);\n    }\n  }\n};\n\n// prevent buggy user code from causing an infinite recursion\ntemplate<typename Derived1, typename Derived2, unsigned int Mode, bool ClearOpposite>\nstruct triangular_assignment_selector<Derived1, Derived2, Mode, 0, ClearOpposite>\n{\n  static inline void run(Derived1 &, const Derived2 &) {}\n};\n\ntemplate<typename Derived1, typename Derived2, bool ClearOpposite>\nstruct triangular_assignment_selector<Derived1, Derived2, Upper, Dynamic, ClearOpposite>\n{\n  typedef typename Derived1::Index Index;\n  typedef typename Derived1::Scalar Scalar;\n  static inline void run(Derived1 &dst, const Derived2 &src)\n  {\n    for(Index j = 0; j < dst.cols(); ++j)\n    {\n      Index maxi = (std::min)(j, dst.rows()-1);\n      for(Index i = 0; i <= maxi; ++i)\n        dst.copyCoeff(i, j, src);\n      if (ClearOpposite)\n        for(Index i = maxi+1; i < dst.rows(); ++i)\n          dst.coeffRef(i, j) = Scalar(0);\n    }\n  }\n};\n\ntemplate<typename Derived1, typename Derived2, bool ClearOpposite>\nstruct triangular_assignment_selector<Derived1, Derived2, Lower, Dynamic, ClearOpposite>\n{\n  typedef typename Derived1::Index Index;\n  static inline void run(Derived1 &dst, const Derived2 &src)\n  {\n    for(Index j = 0; j < dst.cols(); ++j)\n    {\n      for(Index i = j; i < dst.rows(); ++i)\n        dst.copyCoeff(i, j, src);\n      Index maxi = (std::min)(j, dst.rows());\n      if (ClearOpposite)\n        for(Index i = 0; i < maxi; ++i)\n          dst.coeffRef(i, j) = static_cast<typename Derived1::Scalar>(0);\n    }\n  }\n};\n\ntemplate<typename Derived1, typename Derived2, bool ClearOpposite>\nstruct triangular_assignment_selector<Derived1, Derived2, StrictlyUpper, Dynamic, ClearOpposite>\n{\n  typedef typename Derived1::Index Index;\n  typedef typename Derived1::Scalar Scalar;\n  static inline void run(Derived1 &dst, const Derived2 &src)\n  {\n    for(Index j = 0; j < dst.cols(); ++j)\n    {\n      Index maxi = (std::min)(j, dst.rows());\n      for(Index i = 0; i < maxi; ++i)\n        dst.copyCoeff(i, j, src);\n      if (ClearOpposite)\n        for(Index i = maxi; i < dst.rows(); ++i)\n          dst.coeffRef(i, j) = Scalar(0);\n    }\n  }\n};\n\ntemplate<typename Derived1, typename Derived2, bool ClearOpposite>\nstruct triangular_assignment_selector<Derived1, Derived2, StrictlyLower, Dynamic, ClearOpposite>\n{\n  typedef typename Derived1::Index Index;\n  static inline void run(Derived1 &dst, const Derived2 &src)\n  {\n    for(Index j = 0; j < dst.cols(); ++j)\n    {\n      for(Index i = j+1; i < dst.rows(); ++i)\n        dst.copyCoeff(i, j, src);\n      Index maxi = (std::min)(j, dst.rows()-1);\n      if (ClearOpposite)\n        for(Index i = 0; i <= maxi; ++i)\n          dst.coeffRef(i, j) = static_cast<typename Derived1::Scalar>(0);\n    }\n  }\n};\n\ntemplate<typename Derived1, typename Derived2, bool ClearOpposite>\nstruct triangular_assignment_selector<Derived1, Derived2, UnitUpper, Dynamic, ClearOpposite>\n{\n  typedef typename Derived1::Index Index;\n  static inline void run(Derived1 &dst, const Derived2 &src)\n  {\n    for(Index j = 0; j < dst.cols(); ++j)\n    {\n      Index maxi = (std::min)(j, dst.rows());\n      for(Index i = 0; i < maxi; ++i)\n        dst.copyCoeff(i, j, src);\n      if (ClearOpposite)\n      {\n        for(Index i = maxi+1; i < dst.rows(); ++i)\n          dst.coeffRef(i, j) = 0;\n      }\n    }\n    dst.diagonal().setOnes();\n  }\n};\ntemplate<typename Derived1, typename Derived2, bool ClearOpposite>\nstruct triangular_assignment_selector<Derived1, Derived2, UnitLower, Dynamic, ClearOpposite>\n{\n  typedef typename Derived1::Index Index;\n  static inline void run(Derived1 &dst, const Derived2 &src)\n  {\n    for(Index j = 0; j < dst.cols(); ++j)\n    {\n      Index maxi = (std::min)(j, dst.rows());\n      for(Index i = maxi+1; i < dst.rows(); ++i)\n        dst.copyCoeff(i, j, src);\n      if (ClearOpposite)\n      {\n        for(Index i = 0; i < maxi; ++i)\n          dst.coeffRef(i, j) = 0;\n      }\n    }\n    dst.diagonal().setOnes();\n  }\n};\n\n} // end namespace internal\n\n// FIXME should we keep that possibility\ntemplate<typename MatrixType, unsigned int Mode>\ntemplate<typename OtherDerived>\ninline TriangularView<MatrixType, Mode>&\nTriangularView<MatrixType, Mode>::operator=(const MatrixBase<OtherDerived>& other)\n{\n  if(OtherDerived::Flags & EvalBeforeAssigningBit)\n  {\n    typename internal::plain_matrix_type<OtherDerived>::type other_evaluated(other.rows(), other.cols());\n    other_evaluated.template triangularView<Mode>().lazyAssign(other.derived());\n    lazyAssign(other_evaluated);\n  }\n  else\n    lazyAssign(other.derived());\n  return *this;\n}\n\n// FIXME should we keep that possibility\ntemplate<typename MatrixType, unsigned int Mode>\ntemplate<typename OtherDerived>\nvoid TriangularView<MatrixType, Mode>::lazyAssign(const MatrixBase<OtherDerived>& other)\n{\n  enum {\n    unroll = MatrixType::SizeAtCompileTime != Dynamic\n          && internal::traits<OtherDerived>::CoeffReadCost != Dynamic\n          && MatrixType::SizeAtCompileTime*internal::traits<OtherDerived>::CoeffReadCost/2 <= EIGEN_UNROLLING_LIMIT\n  };\n  eigen_assert(m_matrix.rows() == other.rows() && m_matrix.cols() == other.cols());\n\n  internal::triangular_assignment_selector\n    <MatrixType, OtherDerived, int(Mode),\n    unroll ? int(MatrixType::SizeAtCompileTime) : Dynamic,\n    false // do not change the opposite triangular part\n    >::run(m_matrix.const_cast_derived(), other.derived());\n}\n\n\n\ntemplate<typename MatrixType, unsigned int Mode>\ntemplate<typename OtherDerived>\ninline TriangularView<MatrixType, Mode>&\nTriangularView<MatrixType, Mode>::operator=(const TriangularBase<OtherDerived>& other)\n{\n  eigen_assert(Mode == int(OtherDerived::Mode));\n  if(internal::traits<OtherDerived>::Flags & EvalBeforeAssigningBit)\n  {\n    typename OtherDerived::DenseMatrixType other_evaluated(other.rows(), other.cols());\n    other_evaluated.template triangularView<Mode>().lazyAssign(other.derived().nestedExpression());\n    lazyAssign(other_evaluated);\n  }\n  else\n    lazyAssign(other.derived().nestedExpression());\n  return *this;\n}\n\ntemplate<typename MatrixType, unsigned int Mode>\ntemplate<typename OtherDerived>\nvoid TriangularView<MatrixType, Mode>::lazyAssign(const TriangularBase<OtherDerived>& other)\n{\n  enum {\n    unroll = MatrixType::SizeAtCompileTime != Dynamic\n                   && internal::traits<OtherDerived>::CoeffReadCost != Dynamic\n                   && MatrixType::SizeAtCompileTime * internal::traits<OtherDerived>::CoeffReadCost / 2\n                        <= EIGEN_UNROLLING_LIMIT\n  };\n  eigen_assert(m_matrix.rows() == other.rows() && m_matrix.cols() == other.cols());\n\n  internal::triangular_assignment_selector\n    <MatrixType, OtherDerived, int(Mode),\n    unroll ? int(MatrixType::SizeAtCompileTime) : Dynamic,\n    false // preserve the opposite triangular part\n    >::run(m_matrix.const_cast_derived(), other.derived().nestedExpression());\n}\n\n/***************************************************************************\n* Implementation of TriangularBase methods\n***************************************************************************/\n\n/** Assigns a triangular or selfadjoint matrix to a dense matrix.\n  * If the matrix is triangular, the opposite part is set to zero. */\ntemplate<typename Derived>\ntemplate<typename DenseDerived>\nvoid TriangularBase<Derived>::evalTo(MatrixBase<DenseDerived> &other) const\n{\n  if(internal::traits<Derived>::Flags & EvalBeforeAssigningBit)\n  {\n    typename internal::plain_matrix_type<Derived>::type other_evaluated(rows(), cols());\n    evalToLazy(other_evaluated);\n    other.derived().swap(other_evaluated);\n  }\n  else\n    evalToLazy(other.derived());\n}\n\n/** Assigns a triangular or selfadjoint matrix to a dense matrix.\n  * If the matrix is triangular, the opposite part is set to zero. */\ntemplate<typename Derived>\ntemplate<typename DenseDerived>\nvoid TriangularBase<Derived>::evalToLazy(MatrixBase<DenseDerived> &other) const\n{\n  enum {\n    unroll = DenseDerived::SizeAtCompileTime != Dynamic\n                   && internal::traits<Derived>::CoeffReadCost != Dynamic\n                   && DenseDerived::SizeAtCompileTime * internal::traits<Derived>::CoeffReadCost / 2\n                        <= EIGEN_UNROLLING_LIMIT\n  };\n  other.derived().resize(this->rows(), this->cols());\n\n  internal::triangular_assignment_selector\n    <DenseDerived, typename internal::traits<Derived>::MatrixTypeNestedCleaned, Derived::Mode,\n    unroll ? int(DenseDerived::SizeAtCompileTime) : Dynamic,\n    true // clear the opposite triangular part\n    >::run(other.derived(), derived().nestedExpression());\n}\n\n/***************************************************************************\n* Implementation of TriangularView methods\n***************************************************************************/\n\n/***************************************************************************\n* Implementation of MatrixBase methods\n***************************************************************************/\n\n#ifdef EIGEN2_SUPPORT\n\n// implementation of part<>(), including the SelfAdjoint case.\n\nnamespace internal {\ntemplate<typename MatrixType, unsigned int Mode>\nstruct eigen2_part_return_type\n{\n  typedef TriangularView<MatrixType, Mode> type;\n};\n\ntemplate<typename MatrixType>\nstruct eigen2_part_return_type<MatrixType, SelfAdjoint>\n{\n  typedef SelfAdjointView<MatrixType, Upper> type;\n};\n}\n\n/** \\deprecated use MatrixBase::triangularView() */\ntemplate<typename Derived>\ntemplate<unsigned int Mode>\nconst typename internal::eigen2_part_return_type<Derived, Mode>::type MatrixBase<Derived>::part() const\n{\n  return derived();\n}\n\n/** \\deprecated use MatrixBase::triangularView() */\ntemplate<typename Derived>\ntemplate<unsigned int Mode>\ntypename internal::eigen2_part_return_type<Derived, Mode>::type MatrixBase<Derived>::part()\n{\n  return derived();\n}\n#endif\n\n/**\n  * \\returns an expression of a triangular view extracted from the current matrix\n  *\n  * The parameter \\a Mode can have the following values: \\c #Upper, \\c #StrictlyUpper, \\c #UnitUpper,\n  * \\c #Lower, \\c #StrictlyLower, \\c #UnitLower.\n  *\n  * Example: \\include MatrixBase_extract.cpp\n  * Output: \\verbinclude MatrixBase_extract.out\n  *\n  * \\sa class TriangularView\n  */\ntemplate<typename Derived>\ntemplate<unsigned int Mode>\ntypename MatrixBase<Derived>::template TriangularViewReturnType<Mode>::Type\nMatrixBase<Derived>::triangularView()\n{\n  return derived();\n}\n\n/** This is the const version of MatrixBase::triangularView() */\ntemplate<typename Derived>\ntemplate<unsigned int Mode>\ntypename MatrixBase<Derived>::template ConstTriangularViewReturnType<Mode>::Type\nMatrixBase<Derived>::triangularView() const\n{\n  return derived();\n}\n\n/** \\returns true if *this is approximately equal to an upper triangular matrix,\n  *          within the precision given by \\a prec.\n  *\n  * \\sa isLowerTriangular()\n  */\ntemplate<typename Derived>\nbool MatrixBase<Derived>::isUpperTriangular(const RealScalar& prec) const\n{\n  using std::abs;\n  RealScalar maxAbsOnUpperPart = static_cast<RealScalar>(-1);\n  for(Index j = 0; j < cols(); ++j)\n  {\n    Index maxi = (std::min)(j, rows()-1);\n    for(Index i = 0; i <= maxi; ++i)\n    {\n      RealScalar absValue = abs(coeff(i,j));\n      if(absValue > maxAbsOnUpperPart) maxAbsOnUpperPart = absValue;\n    }\n  }\n  RealScalar threshold = maxAbsOnUpperPart * prec;\n  for(Index j = 0; j < cols(); ++j)\n    for(Index i = j+1; i < rows(); ++i)\n      if(abs(coeff(i, j)) > threshold) return false;\n  return true;\n}\n\n/** \\returns true if *this is approximately equal to a lower triangular matrix,\n  *          within the precision given by \\a prec.\n  *\n  * \\sa isUpperTriangular()\n  */\ntemplate<typename Derived>\nbool MatrixBase<Derived>::isLowerTriangular(const RealScalar& prec) const\n{\n  using std::abs;\n  RealScalar maxAbsOnLowerPart = static_cast<RealScalar>(-1);\n  for(Index j = 0; j < cols(); ++j)\n    for(Index i = j; i < rows(); ++i)\n    {\n      RealScalar absValue = abs(coeff(i,j));\n      if(absValue > maxAbsOnLowerPart) maxAbsOnLowerPart = absValue;\n    }\n  RealScalar threshold = maxAbsOnLowerPart * prec;\n  for(Index j = 1; j < cols(); ++j)\n  {\n    Index maxi = (std::min)(j, rows()-1);\n    for(Index i = 0; i < maxi; ++i)\n      if(abs(coeff(i, j)) > threshold) return false;\n  }\n  return true;\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_TRIANGULARMATRIX_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/VectorBlock.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_VECTORBLOCK_H\n#define EIGEN_VECTORBLOCK_H\n\nnamespace Eigen { \n\n/** \\class VectorBlock\n  * \\ingroup Core_Module\n  *\n  * \\brief Expression of a fixed-size or dynamic-size sub-vector\n  *\n  * \\param VectorType the type of the object in which we are taking a sub-vector\n  * \\param Size size of the sub-vector we are taking at compile time (optional)\n  *\n  * This class represents an expression of either a fixed-size or dynamic-size sub-vector.\n  * It is the return type of DenseBase::segment(Index,Index) and DenseBase::segment<int>(Index) and\n  * most of the time this is the only way it is used.\n  *\n  * However, if you want to directly maniputate sub-vector expressions,\n  * for instance if you want to write a function returning such an expression, you\n  * will need to use this class.\n  *\n  * Here is an example illustrating the dynamic case:\n  * \\include class_VectorBlock.cpp\n  * Output: \\verbinclude class_VectorBlock.out\n  *\n  * \\note Even though this expression has dynamic size, in the case where \\a VectorType\n  * has fixed size, this expression inherits a fixed maximal size which means that evaluating\n  * it does not cause a dynamic memory allocation.\n  *\n  * Here is an example illustrating the fixed-size case:\n  * \\include class_FixedVectorBlock.cpp\n  * Output: \\verbinclude class_FixedVectorBlock.out\n  *\n  * \\sa class Block, DenseBase::segment(Index,Index,Index,Index), DenseBase::segment(Index,Index)\n  */\n\nnamespace internal {\ntemplate<typename VectorType, int Size>\nstruct traits<VectorBlock<VectorType, Size> >\n  : public traits<Block<VectorType,\n                     traits<VectorType>::Flags & RowMajorBit ? 1 : Size,\n                     traits<VectorType>::Flags & RowMajorBit ? Size : 1> >\n{\n};\n}\n\ntemplate<typename VectorType, int Size> class VectorBlock\n  : public Block<VectorType,\n                     internal::traits<VectorType>::Flags & RowMajorBit ? 1 : Size,\n                     internal::traits<VectorType>::Flags & RowMajorBit ? Size : 1>\n{\n    typedef Block<VectorType,\n                     internal::traits<VectorType>::Flags & RowMajorBit ? 1 : Size,\n                     internal::traits<VectorType>::Flags & RowMajorBit ? Size : 1> Base;\n    enum {\n      IsColVector = !(internal::traits<VectorType>::Flags & RowMajorBit)\n    };\n  public:\n    EIGEN_DENSE_PUBLIC_INTERFACE(VectorBlock)\n\n    using Base::operator=;\n\n    /** Dynamic-size constructor\n      */\n    inline VectorBlock(VectorType& vector, Index start, Index size)\n      : Base(vector,\n             IsColVector ? start : 0, IsColVector ? 0 : start,\n             IsColVector ? size  : 1, IsColVector ? 1 : size)\n    {\n      EIGEN_STATIC_ASSERT_VECTOR_ONLY(VectorBlock);\n    }\n\n    /** Fixed-size constructor\n      */\n    inline VectorBlock(VectorType& vector, Index start)\n      : Base(vector, IsColVector ? start : 0, IsColVector ? 0 : start)\n    {\n      EIGEN_STATIC_ASSERT_VECTOR_ONLY(VectorBlock);\n    }\n};\n\n\n} // end namespace Eigen\n\n#endif // EIGEN_VECTORBLOCK_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/VectorwiseOp.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_PARTIAL_REDUX_H\n#define EIGEN_PARTIAL_REDUX_H\n\nnamespace Eigen { \n\n/** \\class PartialReduxExpr\n  * \\ingroup Core_Module\n  *\n  * \\brief Generic expression of a partially reduxed matrix\n  *\n  * \\tparam MatrixType the type of the matrix we are applying the redux operation\n  * \\tparam MemberOp type of the member functor\n  * \\tparam Direction indicates the direction of the redux (#Vertical or #Horizontal)\n  *\n  * This class represents an expression of a partial redux operator of a matrix.\n  * It is the return type of some VectorwiseOp functions,\n  * and most of the time this is the only way it is used.\n  *\n  * \\sa class VectorwiseOp\n  */\n\ntemplate< typename MatrixType, typename MemberOp, int Direction>\nclass PartialReduxExpr;\n\nnamespace internal {\ntemplate<typename MatrixType, typename MemberOp, int Direction>\nstruct traits<PartialReduxExpr<MatrixType, MemberOp, Direction> >\n : traits<MatrixType>\n{\n  typedef typename MemberOp::result_type Scalar;\n  typedef typename traits<MatrixType>::StorageKind StorageKind;\n  typedef typename traits<MatrixType>::XprKind XprKind;\n  typedef typename MatrixType::Scalar InputScalar;\n  typedef typename nested<MatrixType>::type MatrixTypeNested;\n  typedef typename remove_all<MatrixTypeNested>::type _MatrixTypeNested;\n  enum {\n    RowsAtCompileTime = Direction==Vertical   ? 1 : MatrixType::RowsAtCompileTime,\n    ColsAtCompileTime = Direction==Horizontal ? 1 : MatrixType::ColsAtCompileTime,\n    MaxRowsAtCompileTime = Direction==Vertical   ? 1 : MatrixType::MaxRowsAtCompileTime,\n    MaxColsAtCompileTime = Direction==Horizontal ? 1 : MatrixType::MaxColsAtCompileTime,\n    Flags0 = (unsigned int)_MatrixTypeNested::Flags & HereditaryBits,\n    Flags = (Flags0 & ~RowMajorBit) | (RowsAtCompileTime == 1 ? RowMajorBit : 0),\n    TraversalSize = Direction==Vertical ? MatrixType::RowsAtCompileTime :  MatrixType::ColsAtCompileTime\n  };\n  #if EIGEN_GNUC_AT_LEAST(3,4)\n  typedef typename MemberOp::template Cost<InputScalar,int(TraversalSize)> CostOpType;\n  #else\n  typedef typename MemberOp::template Cost<InputScalar,TraversalSize> CostOpType;\n  #endif\n  enum {\n    CoeffReadCost = TraversalSize==Dynamic ? Dynamic\n                  : TraversalSize * traits<_MatrixTypeNested>::CoeffReadCost + int(CostOpType::value)\n  };\n};\n}\n\ntemplate< typename MatrixType, typename MemberOp, int Direction>\nclass PartialReduxExpr : internal::no_assignment_operator,\n  public internal::dense_xpr_base< PartialReduxExpr<MatrixType, MemberOp, Direction> >::type\n{\n  public:\n\n    typedef typename internal::dense_xpr_base<PartialReduxExpr>::type Base;\n    EIGEN_DENSE_PUBLIC_INTERFACE(PartialReduxExpr)\n    typedef typename internal::traits<PartialReduxExpr>::MatrixTypeNested MatrixTypeNested;\n    typedef typename internal::traits<PartialReduxExpr>::_MatrixTypeNested _MatrixTypeNested;\n\n    PartialReduxExpr(const MatrixType& mat, const MemberOp& func = MemberOp())\n      : m_matrix(mat), m_functor(func) {}\n\n    Index rows() const { return (Direction==Vertical   ? 1 : m_matrix.rows()); }\n    Index cols() const { return (Direction==Horizontal ? 1 : m_matrix.cols()); }\n\n    EIGEN_STRONG_INLINE const Scalar coeff(Index i, Index j) const\n    {\n      if (Direction==Vertical)\n        return m_functor(m_matrix.col(j));\n      else\n        return m_functor(m_matrix.row(i));\n    }\n\n    const Scalar coeff(Index index) const\n    {\n      if (Direction==Vertical)\n        return m_functor(m_matrix.col(index));\n      else\n        return m_functor(m_matrix.row(index));\n    }\n\n  protected:\n    MatrixTypeNested m_matrix;\n    const MemberOp m_functor;\n};\n\n#define EIGEN_MEMBER_FUNCTOR(MEMBER,COST)                               \\\n  template <typename ResultType>                                        \\\n  struct member_##MEMBER {                                              \\\n    EIGEN_EMPTY_STRUCT_CTOR(member_##MEMBER)                            \\\n    typedef ResultType result_type;                                     \\\n    template<typename Scalar, int Size> struct Cost                     \\\n    { enum { value = COST }; };                                         \\\n    template<typename XprType>                                          \\\n    EIGEN_STRONG_INLINE ResultType operator()(const XprType& mat) const \\\n    { return mat.MEMBER(); } \\\n  }\n\nnamespace internal {\n\nEIGEN_MEMBER_FUNCTOR(squaredNorm, Size * NumTraits<Scalar>::MulCost + (Size-1)*NumTraits<Scalar>::AddCost);\nEIGEN_MEMBER_FUNCTOR(norm, (Size+5) * NumTraits<Scalar>::MulCost + (Size-1)*NumTraits<Scalar>::AddCost);\nEIGEN_MEMBER_FUNCTOR(stableNorm, (Size+5) * NumTraits<Scalar>::MulCost + (Size-1)*NumTraits<Scalar>::AddCost);\nEIGEN_MEMBER_FUNCTOR(blueNorm, (Size+5) * NumTraits<Scalar>::MulCost + (Size-1)*NumTraits<Scalar>::AddCost);\nEIGEN_MEMBER_FUNCTOR(hypotNorm, (Size-1) * functor_traits<scalar_hypot_op<Scalar> >::Cost );\nEIGEN_MEMBER_FUNCTOR(sum, (Size-1)*NumTraits<Scalar>::AddCost);\nEIGEN_MEMBER_FUNCTOR(mean, (Size-1)*NumTraits<Scalar>::AddCost + NumTraits<Scalar>::MulCost);\nEIGEN_MEMBER_FUNCTOR(minCoeff, (Size-1)*NumTraits<Scalar>::AddCost);\nEIGEN_MEMBER_FUNCTOR(maxCoeff, (Size-1)*NumTraits<Scalar>::AddCost);\nEIGEN_MEMBER_FUNCTOR(all, (Size-1)*NumTraits<Scalar>::AddCost);\nEIGEN_MEMBER_FUNCTOR(any, (Size-1)*NumTraits<Scalar>::AddCost);\nEIGEN_MEMBER_FUNCTOR(count, (Size-1)*NumTraits<Scalar>::AddCost);\nEIGEN_MEMBER_FUNCTOR(prod, (Size-1)*NumTraits<Scalar>::MulCost);\n\n\ntemplate <typename BinaryOp, typename Scalar>\nstruct member_redux {\n  typedef typename result_of<\n                     BinaryOp(Scalar)\n                   >::type  result_type;\n  template<typename _Scalar, int Size> struct Cost\n  { enum { value = (Size-1) * functor_traits<BinaryOp>::Cost }; };\n  member_redux(const BinaryOp func) : m_functor(func) {}\n  template<typename Derived>\n  inline result_type operator()(const DenseBase<Derived>& mat) const\n  { return mat.redux(m_functor); }\n  const BinaryOp m_functor;\n};\n}\n\n/** \\class VectorwiseOp\n  * \\ingroup Core_Module\n  *\n  * \\brief Pseudo expression providing partial reduction operations\n  *\n  * \\param ExpressionType the type of the object on which to do partial reductions\n  * \\param Direction indicates the direction of the redux (#Vertical or #Horizontal)\n  *\n  * This class represents a pseudo expression with partial reduction features.\n  * It is the return type of DenseBase::colwise() and DenseBase::rowwise()\n  * and most of the time this is the only way it is used.\n  *\n  * Example: \\include MatrixBase_colwise.cpp\n  * Output: \\verbinclude MatrixBase_colwise.out\n  *\n  * \\sa DenseBase::colwise(), DenseBase::rowwise(), class PartialReduxExpr\n  */\ntemplate<typename ExpressionType, int Direction> class VectorwiseOp\n{\n  public:\n\n    typedef typename ExpressionType::Scalar Scalar;\n    typedef typename ExpressionType::RealScalar RealScalar;\n    typedef typename ExpressionType::Index Index;\n    typedef typename internal::conditional<internal::must_nest_by_value<ExpressionType>::ret,\n        ExpressionType, ExpressionType&>::type ExpressionTypeNested;\n    typedef typename internal::remove_all<ExpressionTypeNested>::type ExpressionTypeNestedCleaned;\n\n    template<template<typename _Scalar> class Functor,\n                      typename Scalar=typename internal::traits<ExpressionType>::Scalar> struct ReturnType\n    {\n      typedef PartialReduxExpr<ExpressionType,\n                               Functor<Scalar>,\n                               Direction\n                              > Type;\n    };\n\n    template<typename BinaryOp> struct ReduxReturnType\n    {\n      typedef PartialReduxExpr<ExpressionType,\n                               internal::member_redux<BinaryOp,typename internal::traits<ExpressionType>::Scalar>,\n                               Direction\n                              > Type;\n    };\n\n    enum {\n      IsVertical   = (Direction==Vertical) ? 1 : 0,\n      IsHorizontal = (Direction==Horizontal) ? 1 : 0\n    };\n\n  protected:\n\n    /** \\internal\n      * \\returns the i-th subvector according to the \\c Direction */\n    typedef typename internal::conditional<Direction==Vertical,\n                               typename ExpressionType::ColXpr,\n                               typename ExpressionType::RowXpr>::type SubVector;\n    SubVector subVector(Index i)\n    {\n      return SubVector(m_matrix.derived(),i);\n    }\n\n    /** \\internal\n      * \\returns the number of subvectors in the direction \\c Direction */\n    Index subVectors() const\n    { return Direction==Vertical?m_matrix.cols():m_matrix.rows(); }\n\n    template<typename OtherDerived> struct ExtendedType {\n      typedef Replicate<OtherDerived,\n                        Direction==Vertical   ? 1 : ExpressionType::RowsAtCompileTime,\n                        Direction==Horizontal ? 1 : ExpressionType::ColsAtCompileTime> Type;\n    };\n\n    /** \\internal\n      * Replicates a vector to match the size of \\c *this */\n    template<typename OtherDerived>\n    typename ExtendedType<OtherDerived>::Type\n    extendedTo(const DenseBase<OtherDerived>& other) const\n    {\n      EIGEN_STATIC_ASSERT(EIGEN_IMPLIES(Direction==Vertical, OtherDerived::MaxColsAtCompileTime==1),\n                          YOU_PASSED_A_ROW_VECTOR_BUT_A_COLUMN_VECTOR_WAS_EXPECTED)\n      EIGEN_STATIC_ASSERT(EIGEN_IMPLIES(Direction==Horizontal, OtherDerived::MaxRowsAtCompileTime==1),\n                          YOU_PASSED_A_COLUMN_VECTOR_BUT_A_ROW_VECTOR_WAS_EXPECTED)\n      return typename ExtendedType<OtherDerived>::Type\n                      (other.derived(),\n                       Direction==Vertical   ? 1 : m_matrix.rows(),\n                       Direction==Horizontal ? 1 : m_matrix.cols());\n    }\n    \n    template<typename OtherDerived> struct OppositeExtendedType {\n      typedef Replicate<OtherDerived,\n                        Direction==Horizontal ? 1 : ExpressionType::RowsAtCompileTime,\n                        Direction==Vertical   ? 1 : ExpressionType::ColsAtCompileTime> Type;\n    };\n\n    /** \\internal\n      * Replicates a vector in the opposite direction to match the size of \\c *this */\n    template<typename OtherDerived>\n    typename OppositeExtendedType<OtherDerived>::Type\n    extendedToOpposite(const DenseBase<OtherDerived>& other) const\n    {\n      EIGEN_STATIC_ASSERT(EIGEN_IMPLIES(Direction==Horizontal, OtherDerived::MaxColsAtCompileTime==1),\n                          YOU_PASSED_A_ROW_VECTOR_BUT_A_COLUMN_VECTOR_WAS_EXPECTED)\n      EIGEN_STATIC_ASSERT(EIGEN_IMPLIES(Direction==Vertical, OtherDerived::MaxRowsAtCompileTime==1),\n                          YOU_PASSED_A_COLUMN_VECTOR_BUT_A_ROW_VECTOR_WAS_EXPECTED)\n      return typename OppositeExtendedType<OtherDerived>::Type\n                      (other.derived(),\n                       Direction==Horizontal  ? 1 : m_matrix.rows(),\n                       Direction==Vertical    ? 1 : m_matrix.cols());\n    }\n\n  public:\n\n    inline VectorwiseOp(ExpressionType& matrix) : m_matrix(matrix) {}\n\n    /** \\internal */\n    inline const ExpressionType& _expression() const { return m_matrix; }\n\n    /** \\returns a row or column vector expression of \\c *this reduxed by \\a func\n      *\n      * The template parameter \\a BinaryOp is the type of the functor\n      * of the custom redux operator. Note that func must be an associative operator.\n      *\n      * \\sa class VectorwiseOp, DenseBase::colwise(), DenseBase::rowwise()\n      */\n    template<typename BinaryOp>\n    const typename ReduxReturnType<BinaryOp>::Type\n    redux(const BinaryOp& func = BinaryOp()) const\n    { return typename ReduxReturnType<BinaryOp>::Type(_expression(), func); }\n\n    /** \\returns a row (or column) vector expression of the smallest coefficient\n      * of each column (or row) of the referenced expression.\n      * \n      * \\warning the result is undefined if \\c *this contains NaN.\n      *\n      * Example: \\include PartialRedux_minCoeff.cpp\n      * Output: \\verbinclude PartialRedux_minCoeff.out\n      *\n      * \\sa DenseBase::minCoeff() */\n    const typename ReturnType<internal::member_minCoeff>::Type minCoeff() const\n    { return _expression(); }\n\n    /** \\returns a row (or column) vector expression of the largest coefficient\n      * of each column (or row) of the referenced expression.\n      * \n      * \\warning the result is undefined if \\c *this contains NaN.\n      *\n      * Example: \\include PartialRedux_maxCoeff.cpp\n      * Output: \\verbinclude PartialRedux_maxCoeff.out\n      *\n      * \\sa DenseBase::maxCoeff() */\n    const typename ReturnType<internal::member_maxCoeff>::Type maxCoeff() const\n    { return _expression(); }\n\n    /** \\returns a row (or column) vector expression of the squared norm\n      * of each column (or row) of the referenced expression.\n      *\n      * Example: \\include PartialRedux_squaredNorm.cpp\n      * Output: \\verbinclude PartialRedux_squaredNorm.out\n      *\n      * \\sa DenseBase::squaredNorm() */\n    const typename ReturnType<internal::member_squaredNorm,RealScalar>::Type squaredNorm() const\n    { return _expression(); }\n\n    /** \\returns a row (or column) vector expression of the norm\n      * of each column (or row) of the referenced expression.\n      *\n      * Example: \\include PartialRedux_norm.cpp\n      * Output: \\verbinclude PartialRedux_norm.out\n      *\n      * \\sa DenseBase::norm() */\n    const typename ReturnType<internal::member_norm,RealScalar>::Type norm() const\n    { return _expression(); }\n\n\n    /** \\returns a row (or column) vector expression of the norm\n      * of each column (or row) of the referenced expression, using\n      * blue's algorithm.\n      *\n      * \\sa DenseBase::blueNorm() */\n    const typename ReturnType<internal::member_blueNorm,RealScalar>::Type blueNorm() const\n    { return _expression(); }\n\n\n    /** \\returns a row (or column) vector expression of the norm\n      * of each column (or row) of the referenced expression, avoiding\n      * underflow and overflow.\n      *\n      * \\sa DenseBase::stableNorm() */\n    const typename ReturnType<internal::member_stableNorm,RealScalar>::Type stableNorm() const\n    { return _expression(); }\n\n\n    /** \\returns a row (or column) vector expression of the norm\n      * of each column (or row) of the referenced expression, avoiding\n      * underflow and overflow using a concatenation of hypot() calls.\n      *\n      * \\sa DenseBase::hypotNorm() */\n    const typename ReturnType<internal::member_hypotNorm,RealScalar>::Type hypotNorm() const\n    { return _expression(); }\n\n    /** \\returns a row (or column) vector expression of the sum\n      * of each column (or row) of the referenced expression.\n      *\n      * Example: \\include PartialRedux_sum.cpp\n      * Output: \\verbinclude PartialRedux_sum.out\n      *\n      * \\sa DenseBase::sum() */\n    const typename ReturnType<internal::member_sum>::Type sum() const\n    { return _expression(); }\n\n    /** \\returns a row (or column) vector expression of the mean\n    * of each column (or row) of the referenced expression.\n    *\n    * \\sa DenseBase::mean() */\n    const typename ReturnType<internal::member_mean>::Type mean() const\n    { return _expression(); }\n\n    /** \\returns a row (or column) vector expression representing\n      * whether \\b all coefficients of each respective column (or row) are \\c true.\n      *\n      * \\sa DenseBase::all() */\n    const typename ReturnType<internal::member_all>::Type all() const\n    { return _expression(); }\n\n    /** \\returns a row (or column) vector expression representing\n      * whether \\b at \\b least one coefficient of each respective column (or row) is \\c true.\n      *\n      * \\sa DenseBase::any() */\n    const typename ReturnType<internal::member_any>::Type any() const\n    { return _expression(); }\n\n    /** \\returns a row (or column) vector expression representing\n      * the number of \\c true coefficients of each respective column (or row).\n      *\n      * Example: \\include PartialRedux_count.cpp\n      * Output: \\verbinclude PartialRedux_count.out\n      *\n      * \\sa DenseBase::count() */\n    const PartialReduxExpr<ExpressionType, internal::member_count<Index>, Direction> count() const\n    { return _expression(); }\n\n    /** \\returns a row (or column) vector expression of the product\n      * of each column (or row) of the referenced expression.\n      *\n      * Example: \\include PartialRedux_prod.cpp\n      * Output: \\verbinclude PartialRedux_prod.out\n      *\n      * \\sa DenseBase::prod() */\n    const typename ReturnType<internal::member_prod>::Type prod() const\n    { return _expression(); }\n\n\n    /** \\returns a matrix expression\n      * where each column (or row) are reversed.\n      *\n      * Example: \\include Vectorwise_reverse.cpp\n      * Output: \\verbinclude Vectorwise_reverse.out\n      *\n      * \\sa DenseBase::reverse() */\n    const Reverse<ExpressionType, Direction> reverse() const\n    { return Reverse<ExpressionType, Direction>( _expression() ); }\n\n    typedef Replicate<ExpressionType,Direction==Vertical?Dynamic:1,Direction==Horizontal?Dynamic:1> ReplicateReturnType;\n    const ReplicateReturnType replicate(Index factor) const;\n\n    /**\n      * \\return an expression of the replication of each column (or row) of \\c *this\n      *\n      * Example: \\include DirectionWise_replicate.cpp\n      * Output: \\verbinclude DirectionWise_replicate.out\n      *\n      * \\sa VectorwiseOp::replicate(Index), DenseBase::replicate(), class Replicate\n      */\n    // NOTE implemented here because of sunstudio's compilation errors\n    template<int Factor> const Replicate<ExpressionType,(IsVertical?Factor:1),(IsHorizontal?Factor:1)>\n    replicate(Index factor = Factor) const\n    {\n      return Replicate<ExpressionType,Direction==Vertical?Factor:1,Direction==Horizontal?Factor:1>\n          (_expression(),Direction==Vertical?factor:1,Direction==Horizontal?factor:1);\n    }\n\n/////////// Artithmetic operators ///////////\n\n    /** Copies the vector \\a other to each subvector of \\c *this */\n    template<typename OtherDerived>\n    ExpressionType& operator=(const DenseBase<OtherDerived>& other)\n    {\n      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)\n      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)\n      //eigen_assert((m_matrix.isNull()) == (other.isNull())); FIXME\n      return const_cast<ExpressionType&>(m_matrix = extendedTo(other.derived()));\n    }\n\n    /** Adds the vector \\a other to each subvector of \\c *this */\n    template<typename OtherDerived>\n    ExpressionType& operator+=(const DenseBase<OtherDerived>& other)\n    {\n      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)\n      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)\n      return const_cast<ExpressionType&>(m_matrix += extendedTo(other.derived()));\n    }\n\n    /** Substracts the vector \\a other to each subvector of \\c *this */\n    template<typename OtherDerived>\n    ExpressionType& operator-=(const DenseBase<OtherDerived>& other)\n    {\n      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)\n      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)\n      return const_cast<ExpressionType&>(m_matrix -= extendedTo(other.derived()));\n    }\n\n    /** Multiples each subvector of \\c *this by the vector \\a other */\n    template<typename OtherDerived>\n    ExpressionType& operator*=(const DenseBase<OtherDerived>& other)\n    {\n      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)\n      EIGEN_STATIC_ASSERT_ARRAYXPR(ExpressionType)\n      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)\n      m_matrix *= extendedTo(other.derived());\n      return const_cast<ExpressionType&>(m_matrix);\n    }\n\n    /** Divides each subvector of \\c *this by the vector \\a other */\n    template<typename OtherDerived>\n    ExpressionType& operator/=(const DenseBase<OtherDerived>& other)\n    {\n      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)\n      EIGEN_STATIC_ASSERT_ARRAYXPR(ExpressionType)\n      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)\n      m_matrix /= extendedTo(other.derived());\n      return const_cast<ExpressionType&>(m_matrix);\n    }\n\n    /** Returns the expression of the sum of the vector \\a other to each subvector of \\c *this */\n    template<typename OtherDerived> EIGEN_STRONG_INLINE\n    CwiseBinaryOp<internal::scalar_sum_op<Scalar>,\n                  const ExpressionTypeNestedCleaned,\n                  const typename ExtendedType<OtherDerived>::Type>\n    operator+(const DenseBase<OtherDerived>& other) const\n    {\n      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)\n      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)\n      return m_matrix + extendedTo(other.derived());\n    }\n\n    /** Returns the expression of the difference between each subvector of \\c *this and the vector \\a other */\n    template<typename OtherDerived>\n    CwiseBinaryOp<internal::scalar_difference_op<Scalar>,\n                  const ExpressionTypeNestedCleaned,\n                  const typename ExtendedType<OtherDerived>::Type>\n    operator-(const DenseBase<OtherDerived>& other) const\n    {\n      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)\n      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)\n      return m_matrix - extendedTo(other.derived());\n    }\n\n    /** Returns the expression where each subvector is the product of the vector \\a other\n      * by the corresponding subvector of \\c *this */\n    template<typename OtherDerived> EIGEN_STRONG_INLINE\n    CwiseBinaryOp<internal::scalar_product_op<Scalar>,\n                  const ExpressionTypeNestedCleaned,\n                  const typename ExtendedType<OtherDerived>::Type>\n    operator*(const DenseBase<OtherDerived>& other) const\n    {\n      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)\n      EIGEN_STATIC_ASSERT_ARRAYXPR(ExpressionType)\n      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)\n      return m_matrix * extendedTo(other.derived());\n    }\n\n    /** Returns the expression where each subvector is the quotient of the corresponding\n      * subvector of \\c *this by the vector \\a other */\n    template<typename OtherDerived>\n    CwiseBinaryOp<internal::scalar_quotient_op<Scalar>,\n                  const ExpressionTypeNestedCleaned,\n                  const typename ExtendedType<OtherDerived>::Type>\n    operator/(const DenseBase<OtherDerived>& other) const\n    {\n      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)\n      EIGEN_STATIC_ASSERT_ARRAYXPR(ExpressionType)\n      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)\n      return m_matrix / extendedTo(other.derived());\n    }\n    \n    /** \\returns an expression where each column of row of the referenced matrix are normalized.\n      * The referenced matrix is \\b not modified.\n      * \\sa MatrixBase::normalized(), normalize()\n      */\n    CwiseBinaryOp<internal::scalar_quotient_op<Scalar>,\n                  const ExpressionTypeNestedCleaned,\n                  const typename OppositeExtendedType<typename ReturnType<internal::member_norm,RealScalar>::Type>::Type>\n    normalized() const { return m_matrix.cwiseQuotient(extendedToOpposite(this->norm())); }\n    \n    \n    /** Normalize in-place each row or columns of the referenced matrix.\n      * \\sa MatrixBase::normalize(), normalized()\n      */\n    void normalize() {\n      m_matrix = this->normalized();\n    }\n\n/////////// Geometry module ///////////\n\n    #if EIGEN2_SUPPORT_STAGE > STAGE20_RESOLVE_API_CONFLICTS\n    Homogeneous<ExpressionType,Direction> homogeneous() const;\n    #endif\n\n    typedef typename ExpressionType::PlainObject CrossReturnType;\n    template<typename OtherDerived>\n    const CrossReturnType cross(const MatrixBase<OtherDerived>& other) const;\n\n    enum {\n      HNormalized_Size = Direction==Vertical ? internal::traits<ExpressionType>::RowsAtCompileTime\n                                             : internal::traits<ExpressionType>::ColsAtCompileTime,\n      HNormalized_SizeMinusOne = HNormalized_Size==Dynamic ? Dynamic : HNormalized_Size-1\n    };\n    typedef Block<const ExpressionType,\n                  Direction==Vertical   ? int(HNormalized_SizeMinusOne)\n                                        : int(internal::traits<ExpressionType>::RowsAtCompileTime),\n                  Direction==Horizontal ? int(HNormalized_SizeMinusOne)\n                                        : int(internal::traits<ExpressionType>::ColsAtCompileTime)>\n            HNormalized_Block;\n    typedef Block<const ExpressionType,\n                  Direction==Vertical   ? 1 : int(internal::traits<ExpressionType>::RowsAtCompileTime),\n                  Direction==Horizontal ? 1 : int(internal::traits<ExpressionType>::ColsAtCompileTime)>\n            HNormalized_Factors;\n    typedef CwiseBinaryOp<internal::scalar_quotient_op<typename internal::traits<ExpressionType>::Scalar>,\n                const HNormalized_Block,\n                const Replicate<HNormalized_Factors,\n                  Direction==Vertical   ? HNormalized_SizeMinusOne : 1,\n                  Direction==Horizontal ? HNormalized_SizeMinusOne : 1> >\n            HNormalizedReturnType;\n\n    const HNormalizedReturnType hnormalized() const;\n\n  protected:\n    ExpressionTypeNested m_matrix;\n};\n\n/** \\returns a VectorwiseOp wrapper of *this providing additional partial reduction operations\n  *\n  * Example: \\include MatrixBase_colwise.cpp\n  * Output: \\verbinclude MatrixBase_colwise.out\n  *\n  * \\sa rowwise(), class VectorwiseOp, \\ref TutorialReductionsVisitorsBroadcasting\n  */\ntemplate<typename Derived>\ninline const typename DenseBase<Derived>::ConstColwiseReturnType\nDenseBase<Derived>::colwise() const\n{\n  return derived();\n}\n\n/** \\returns a writable VectorwiseOp wrapper of *this providing additional partial reduction operations\n  *\n  * \\sa rowwise(), class VectorwiseOp, \\ref TutorialReductionsVisitorsBroadcasting\n  */\ntemplate<typename Derived>\ninline typename DenseBase<Derived>::ColwiseReturnType\nDenseBase<Derived>::colwise()\n{\n  return derived();\n}\n\n/** \\returns a VectorwiseOp wrapper of *this providing additional partial reduction operations\n  *\n  * Example: \\include MatrixBase_rowwise.cpp\n  * Output: \\verbinclude MatrixBase_rowwise.out\n  *\n  * \\sa colwise(), class VectorwiseOp, \\ref TutorialReductionsVisitorsBroadcasting\n  */\ntemplate<typename Derived>\ninline const typename DenseBase<Derived>::ConstRowwiseReturnType\nDenseBase<Derived>::rowwise() const\n{\n  return derived();\n}\n\n/** \\returns a writable VectorwiseOp wrapper of *this providing additional partial reduction operations\n  *\n  * \\sa colwise(), class VectorwiseOp, \\ref TutorialReductionsVisitorsBroadcasting\n  */\ntemplate<typename Derived>\ninline typename DenseBase<Derived>::RowwiseReturnType\nDenseBase<Derived>::rowwise()\n{\n  return derived();\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_PARTIAL_REDUX_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/Visitor.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_VISITOR_H\n#define EIGEN_VISITOR_H\n\nnamespace Eigen { \n\nnamespace internal {\n\ntemplate<typename Visitor, typename Derived, int UnrollCount>\nstruct visitor_impl\n{\n  enum {\n    col = (UnrollCount-1) / Derived::RowsAtCompileTime,\n    row = (UnrollCount-1) % Derived::RowsAtCompileTime\n  };\n\n  static inline void run(const Derived &mat, Visitor& visitor)\n  {\n    visitor_impl<Visitor, Derived, UnrollCount-1>::run(mat, visitor);\n    visitor(mat.coeff(row, col), row, col);\n  }\n};\n\ntemplate<typename Visitor, typename Derived>\nstruct visitor_impl<Visitor, Derived, 1>\n{\n  static inline void run(const Derived &mat, Visitor& visitor)\n  {\n    return visitor.init(mat.coeff(0, 0), 0, 0);\n  }\n};\n\ntemplate<typename Visitor, typename Derived>\nstruct visitor_impl<Visitor, Derived, Dynamic>\n{\n  typedef typename Derived::Index Index;\n  static inline void run(const Derived& mat, Visitor& visitor)\n  {\n    visitor.init(mat.coeff(0,0), 0, 0);\n    for(Index i = 1; i < mat.rows(); ++i)\n      visitor(mat.coeff(i, 0), i, 0);\n    for(Index j = 1; j < mat.cols(); ++j)\n      for(Index i = 0; i < mat.rows(); ++i)\n        visitor(mat.coeff(i, j), i, j);\n  }\n};\n\n} // end namespace internal\n\n/** Applies the visitor \\a visitor to the whole coefficients of the matrix or vector.\n  *\n  * The template parameter \\a Visitor is the type of the visitor and provides the following interface:\n  * \\code\n  * struct MyVisitor {\n  *   // called for the first coefficient\n  *   void init(const Scalar& value, Index i, Index j);\n  *   // called for all other coefficients\n  *   void operator() (const Scalar& value, Index i, Index j);\n  * };\n  * \\endcode\n  *\n  * \\note compared to one or two \\em for \\em loops, visitors offer automatic\n  * unrolling for small fixed size matrix.\n  *\n  * \\sa minCoeff(Index*,Index*), maxCoeff(Index*,Index*), DenseBase::redux()\n  */\ntemplate<typename Derived>\ntemplate<typename Visitor>\nvoid DenseBase<Derived>::visit(Visitor& visitor) const\n{\n  typedef typename internal::remove_all<typename Derived::Nested>::type ThisNested;\n  typename Derived::Nested thisNested(derived());\n\n  enum { unroll = SizeAtCompileTime != Dynamic\n                   && CoeffReadCost != Dynamic\n                   && (SizeAtCompileTime == 1 || internal::functor_traits<Visitor>::Cost != Dynamic)\n                   && SizeAtCompileTime * CoeffReadCost + (SizeAtCompileTime-1) * internal::functor_traits<Visitor>::Cost\n                      <= EIGEN_UNROLLING_LIMIT };\n  return internal::visitor_impl<Visitor, ThisNested,\n      unroll ? int(SizeAtCompileTime) : Dynamic\n    >::run(thisNested, visitor);\n}\n\nnamespace internal {\n\n/** \\internal\n  * \\brief Base class to implement min and max visitors\n  */\ntemplate <typename Derived>\nstruct coeff_visitor\n{\n  typedef typename Derived::Index Index;\n  typedef typename Derived::Scalar Scalar;\n  Index row, col;\n  Scalar res;\n  inline void init(const Scalar& value, Index i, Index j)\n  {\n    res = value;\n    row = i;\n    col = j;\n  }\n};\n\n/** \\internal\n  * \\brief Visitor computing the min coefficient with its value and coordinates\n  *\n  * \\sa DenseBase::minCoeff(Index*, Index*)\n  */\ntemplate <typename Derived>\nstruct min_coeff_visitor : coeff_visitor<Derived>\n{\n  typedef typename Derived::Index Index;\n  typedef typename Derived::Scalar Scalar;\n  void operator() (const Scalar& value, Index i, Index j)\n  {\n    if(value < this->res)\n    {\n      this->res = value;\n      this->row = i;\n      this->col = j;\n    }\n  }\n};\n\ntemplate<typename Scalar>\nstruct functor_traits<min_coeff_visitor<Scalar> > {\n  enum {\n    Cost = NumTraits<Scalar>::AddCost\n  };\n};\n\n/** \\internal\n  * \\brief Visitor computing the max coefficient with its value and coordinates\n  *\n  * \\sa DenseBase::maxCoeff(Index*, Index*)\n  */\ntemplate <typename Derived>\nstruct max_coeff_visitor : coeff_visitor<Derived>\n{\n  typedef typename Derived::Index Index;\n  typedef typename Derived::Scalar Scalar;\n  void operator() (const Scalar& value, Index i, Index j)\n  {\n    if(value > this->res)\n    {\n      this->res = value;\n      this->row = i;\n      this->col = j;\n    }\n  }\n};\n\ntemplate<typename Scalar>\nstruct functor_traits<max_coeff_visitor<Scalar> > {\n  enum {\n    Cost = NumTraits<Scalar>::AddCost\n  };\n};\n\n} // end namespace internal\n\n/** \\returns the minimum of all coefficients of *this and puts in *row and *col its location.\n  * \\warning the result is undefined if \\c *this contains NaN.\n  *\n  * \\sa DenseBase::minCoeff(Index*), DenseBase::maxCoeff(Index*,Index*), DenseBase::visitor(), DenseBase::minCoeff()\n  */\ntemplate<typename Derived>\ntemplate<typename IndexType>\ntypename internal::traits<Derived>::Scalar\nDenseBase<Derived>::minCoeff(IndexType* rowId, IndexType* colId) const\n{\n  internal::min_coeff_visitor<Derived> minVisitor;\n  this->visit(minVisitor);\n  *rowId = minVisitor.row;\n  if (colId) *colId = minVisitor.col;\n  return minVisitor.res;\n}\n\n/** \\returns the minimum of all coefficients of *this and puts in *index its location.\n  * \\warning the result is undefined if \\c *this contains NaN. \n  *\n  * \\sa DenseBase::minCoeff(IndexType*,IndexType*), DenseBase::maxCoeff(IndexType*,IndexType*), DenseBase::visitor(), DenseBase::minCoeff()\n  */\ntemplate<typename Derived>\ntemplate<typename IndexType>\ntypename internal::traits<Derived>::Scalar\nDenseBase<Derived>::minCoeff(IndexType* index) const\n{\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)\n  internal::min_coeff_visitor<Derived> minVisitor;\n  this->visit(minVisitor);\n  *index = (RowsAtCompileTime==1) ? minVisitor.col : minVisitor.row;\n  return minVisitor.res;\n}\n\n/** \\returns the maximum of all coefficients of *this and puts in *row and *col its location.\n  * \\warning the result is undefined if \\c *this contains NaN. \n  *\n  * \\sa DenseBase::minCoeff(IndexType*,IndexType*), DenseBase::visitor(), DenseBase::maxCoeff()\n  */\ntemplate<typename Derived>\ntemplate<typename IndexType>\ntypename internal::traits<Derived>::Scalar\nDenseBase<Derived>::maxCoeff(IndexType* rowPtr, IndexType* colPtr) const\n{\n  internal::max_coeff_visitor<Derived> maxVisitor;\n  this->visit(maxVisitor);\n  *rowPtr = maxVisitor.row;\n  if (colPtr) *colPtr = maxVisitor.col;\n  return maxVisitor.res;\n}\n\n/** \\returns the maximum of all coefficients of *this and puts in *index its location.\n  * \\warning the result is undefined if \\c *this contains NaN.\n  *\n  * \\sa DenseBase::maxCoeff(IndexType*,IndexType*), DenseBase::minCoeff(IndexType*,IndexType*), DenseBase::visitor(), DenseBase::maxCoeff()\n  */\ntemplate<typename Derived>\ntemplate<typename IndexType>\ntypename internal::traits<Derived>::Scalar\nDenseBase<Derived>::maxCoeff(IndexType* index) const\n{\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)\n  internal::max_coeff_visitor<Derived> maxVisitor;\n  this->visit(maxVisitor);\n  *index = (RowsAtCompileTime==1) ? maxVisitor.col : maxVisitor.row;\n  return maxVisitor.res;\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_VISITOR_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/arch/AltiVec/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_Core_arch_AltiVec_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_Core_arch_AltiVec_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/Core/arch/AltiVec COMPONENT Devel\n)\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/arch/AltiVec/Complex.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_COMPLEX_ALTIVEC_H\n#define EIGEN_COMPLEX_ALTIVEC_H\n\nnamespace Eigen {\n\nnamespace internal {\n\nstatic Packet4ui  p4ui_CONJ_XOR = vec_mergeh((Packet4ui)p4i_ZERO, (Packet4ui)p4f_ZERO_);//{ 0x00000000, 0x80000000, 0x00000000, 0x80000000 };\nstatic Packet16uc p16uc_COMPLEX_RE   = vec_sld((Packet16uc) vec_splat((Packet4ui)p16uc_FORWARD, 0), (Packet16uc) vec_splat((Packet4ui)p16uc_FORWARD, 2), 8);//{ 0,1,2,3, 0,1,2,3, 8,9,10,11, 8,9,10,11 };\nstatic Packet16uc p16uc_COMPLEX_IM   = vec_sld((Packet16uc) vec_splat((Packet4ui)p16uc_FORWARD, 1), (Packet16uc) vec_splat((Packet4ui)p16uc_FORWARD, 3), 8);//{ 4,5,6,7, 4,5,6,7, 12,13,14,15, 12,13,14,15 };\nstatic Packet16uc p16uc_COMPLEX_REV  = vec_sld(p16uc_REVERSE, p16uc_REVERSE, 8);//{ 4,5,6,7, 0,1,2,3, 12,13,14,15, 8,9,10,11 };\nstatic Packet16uc p16uc_COMPLEX_REV2 = vec_sld(p16uc_FORWARD, p16uc_FORWARD, 8);//{ 8,9,10,11, 12,13,14,15, 0,1,2,3, 4,5,6,7 };\nstatic Packet16uc p16uc_PSET_HI = (Packet16uc) vec_mergeh((Packet4ui) vec_splat((Packet4ui)p16uc_FORWARD, 0), (Packet4ui) vec_splat((Packet4ui)p16uc_FORWARD, 1));//{ 0,1,2,3, 4,5,6,7, 0,1,2,3, 4,5,6,7 };\nstatic Packet16uc p16uc_PSET_LO = (Packet16uc) vec_mergeh((Packet4ui) vec_splat((Packet4ui)p16uc_FORWARD, 2), (Packet4ui) vec_splat((Packet4ui)p16uc_FORWARD, 3));//{ 8,9,10,11, 12,13,14,15, 8,9,10,11, 12,13,14,15 };\n\n//---------- float ----------\nstruct Packet2cf\n{\n  EIGEN_STRONG_INLINE Packet2cf() {}\n  EIGEN_STRONG_INLINE explicit Packet2cf(const Packet4f& a) : v(a) {}\n  Packet4f  v;\n};\n\ntemplate<> struct packet_traits<std::complex<float> >  : default_packet_traits\n{\n  typedef Packet2cf type;\n  enum {\n    Vectorizable = 1,\n    AlignedOnScalar = 1,\n    size = 2,\n\n    HasAdd    = 1,\n    HasSub    = 1,\n    HasMul    = 1,\n    HasDiv    = 1,\n    HasNegate = 1,\n    HasAbs    = 0,\n    HasAbs2   = 0,\n    HasMin    = 0,\n    HasMax    = 0,\n    HasSetLinear = 0\n  };\n};\n\ntemplate<> struct unpacket_traits<Packet2cf> { typedef std::complex<float> type; enum {size=2}; };\n\ntemplate<> EIGEN_STRONG_INLINE Packet2cf pset1<Packet2cf>(const std::complex<float>&  from)\n{\n  Packet2cf res;\n  /* On AltiVec we cannot load 64-bit registers, so wa have to take care of alignment */\n  if((ptrdiff_t(&from) % 16) == 0)\n    res.v = pload<Packet4f>((const float *)&from);\n  else\n    res.v = ploadu<Packet4f>((const float *)&from);\n  res.v = vec_perm(res.v, res.v, p16uc_PSET_HI);\n  return res;\n}\n\ntemplate<> EIGEN_STRONG_INLINE Packet2cf padd<Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(vec_add(a.v,b.v)); }\ntemplate<> EIGEN_STRONG_INLINE Packet2cf psub<Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(vec_sub(a.v,b.v)); }\ntemplate<> EIGEN_STRONG_INLINE Packet2cf pnegate(const Packet2cf& a) { return Packet2cf(pnegate(a.v)); }\ntemplate<> EIGEN_STRONG_INLINE Packet2cf pconj(const Packet2cf& a) { return Packet2cf((Packet4f)vec_xor((Packet4ui)a.v, p4ui_CONJ_XOR)); }\n\ntemplate<> EIGEN_STRONG_INLINE Packet2cf pmul<Packet2cf>(const Packet2cf& a, const Packet2cf& b)\n{\n  Packet4f v1, v2;\n\n  // Permute and multiply the real parts of a and b\n  v1 = vec_perm(a.v, a.v, p16uc_COMPLEX_RE);\n  // Get the imaginary parts of a\n  v2 = vec_perm(a.v, a.v, p16uc_COMPLEX_IM);\n  // multiply a_re * b \n  v1 = vec_madd(v1, b.v, p4f_ZERO);\n  // multiply a_im * b and get the conjugate result\n  v2 = vec_madd(v2, b.v, p4f_ZERO);\n  v2 = (Packet4f) vec_xor((Packet4ui)v2, p4ui_CONJ_XOR);\n  // permute back to a proper order\n  v2 = vec_perm(v2, v2, p16uc_COMPLEX_REV);\n  \n  return Packet2cf(vec_add(v1, v2));\n}\n\ntemplate<> EIGEN_STRONG_INLINE Packet2cf pand   <Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(vec_and(a.v,b.v)); }\ntemplate<> EIGEN_STRONG_INLINE Packet2cf por    <Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(vec_or(a.v,b.v)); }\ntemplate<> EIGEN_STRONG_INLINE Packet2cf pxor   <Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(vec_xor(a.v,b.v)); }\ntemplate<> EIGEN_STRONG_INLINE Packet2cf pandnot<Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(vec_and(a.v, vec_nor(b.v,b.v))); }\n\ntemplate<> EIGEN_STRONG_INLINE Packet2cf pload <Packet2cf>(const std::complex<float>* from) { EIGEN_DEBUG_ALIGNED_LOAD return Packet2cf(pload<Packet4f>((const float*)from)); }\ntemplate<> EIGEN_STRONG_INLINE Packet2cf ploadu<Packet2cf>(const std::complex<float>* from) { EIGEN_DEBUG_UNALIGNED_LOAD return Packet2cf(ploadu<Packet4f>((const float*)from)); }\n\ntemplate<> EIGEN_STRONG_INLINE Packet2cf ploaddup<Packet2cf>(const std::complex<float>*     from)\n{\n  return pset1<Packet2cf>(*from);\n}\n\ntemplate<> EIGEN_STRONG_INLINE void pstore <std::complex<float> >(std::complex<float> *   to, const Packet2cf& from) { EIGEN_DEBUG_ALIGNED_STORE pstore((float*)to, from.v); }\ntemplate<> EIGEN_STRONG_INLINE void pstoreu<std::complex<float> >(std::complex<float> *   to, const Packet2cf& from) { EIGEN_DEBUG_UNALIGNED_STORE pstoreu((float*)to, from.v); }\n\ntemplate<> EIGEN_STRONG_INLINE void prefetch<std::complex<float> >(const std::complex<float> *   addr) { vec_dstt((float *)addr, DST_CTRL(2,2,32), DST_CHAN); }\n\ntemplate<> EIGEN_STRONG_INLINE std::complex<float>  pfirst<Packet2cf>(const Packet2cf& a)\n{\n  std::complex<float> EIGEN_ALIGN16 res[2];\n  pstore((float *)&res, a.v);\n\n  return res[0];\n}\n\ntemplate<> EIGEN_STRONG_INLINE Packet2cf preverse(const Packet2cf& a)\n{\n  Packet4f rev_a;\n  rev_a = vec_perm(a.v, a.v, p16uc_COMPLEX_REV2);\n  return Packet2cf(rev_a);\n}\n\ntemplate<> EIGEN_STRONG_INLINE std::complex<float> predux<Packet2cf>(const Packet2cf& a)\n{\n  Packet4f b;\n  b = (Packet4f) vec_sld(a.v, a.v, 8);\n  b = padd(a.v, b);\n  return pfirst(Packet2cf(b));\n}\n\ntemplate<> EIGEN_STRONG_INLINE Packet2cf preduxp<Packet2cf>(const Packet2cf* vecs)\n{\n  Packet4f b1, b2;\n  \n  b1 = (Packet4f) vec_sld(vecs[0].v, vecs[1].v, 8);\n  b2 = (Packet4f) vec_sld(vecs[1].v, vecs[0].v, 8);\n  b2 = (Packet4f) vec_sld(b2, b2, 8);\n  b2 = padd(b1, b2);\n\n  return Packet2cf(b2);\n}\n\ntemplate<> EIGEN_STRONG_INLINE std::complex<float> predux_mul<Packet2cf>(const Packet2cf& a)\n{\n  Packet4f b;\n  Packet2cf prod;\n  b = (Packet4f) vec_sld(a.v, a.v, 8);\n  prod = pmul(a, Packet2cf(b));\n\n  return pfirst(prod);\n}\n\ntemplate<int Offset>\nstruct palign_impl<Offset,Packet2cf>\n{\n  static EIGEN_STRONG_INLINE void run(Packet2cf& first, const Packet2cf& second)\n  {\n    if (Offset==1)\n    {\n      first.v = vec_sld(first.v, second.v, 8);\n    }\n  }\n};\n\ntemplate<> struct conj_helper<Packet2cf, Packet2cf, false,true>\n{\n  EIGEN_STRONG_INLINE Packet2cf pmadd(const Packet2cf& x, const Packet2cf& y, const Packet2cf& c) const\n  { return padd(pmul(x,y),c); }\n\n  EIGEN_STRONG_INLINE Packet2cf pmul(const Packet2cf& a, const Packet2cf& b) const\n  {\n    return internal::pmul(a, pconj(b));\n  }\n};\n\ntemplate<> struct conj_helper<Packet2cf, Packet2cf, true,false>\n{\n  EIGEN_STRONG_INLINE Packet2cf pmadd(const Packet2cf& x, const Packet2cf& y, const Packet2cf& c) const\n  { return padd(pmul(x,y),c); }\n\n  EIGEN_STRONG_INLINE Packet2cf pmul(const Packet2cf& a, const Packet2cf& b) const\n  {\n    return internal::pmul(pconj(a), b);\n  }\n};\n\ntemplate<> struct conj_helper<Packet2cf, Packet2cf, true,true>\n{\n  EIGEN_STRONG_INLINE Packet2cf pmadd(const Packet2cf& x, const Packet2cf& y, const Packet2cf& c) const\n  { return padd(pmul(x,y),c); }\n\n  EIGEN_STRONG_INLINE Packet2cf pmul(const Packet2cf& a, const Packet2cf& b) const\n  {\n    return pconj(internal::pmul(a, b));\n  }\n};\n\ntemplate<> EIGEN_STRONG_INLINE Packet2cf pdiv<Packet2cf>(const Packet2cf& a, const Packet2cf& b)\n{\n  // TODO optimize it for AltiVec\n  Packet2cf res = conj_helper<Packet2cf,Packet2cf,false,true>().pmul(a,b);\n  Packet4f s = vec_madd(b.v, b.v, p4f_ZERO);\n  return Packet2cf(pdiv(res.v, vec_add(s,vec_perm(s, s, p16uc_COMPLEX_REV))));\n}\n\ntemplate<> EIGEN_STRONG_INLINE Packet2cf pcplxflip<Packet2cf>(const Packet2cf& x)\n{\n  return Packet2cf(vec_perm(x.v, x.v, p16uc_COMPLEX_REV));\n}\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_COMPLEX_ALTIVEC_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/arch/AltiVec/PacketMath.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Konstantinos Margaritis <markos@codex.gr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_PACKET_MATH_ALTIVEC_H\n#define EIGEN_PACKET_MATH_ALTIVEC_H\n\nnamespace Eigen {\n\nnamespace internal {\n\n#ifndef EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD\n#define EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD 4\n#endif\n\n#ifndef EIGEN_HAS_FUSE_CJMADD\n#define EIGEN_HAS_FUSE_CJMADD 1\n#endif\n\n// NOTE Altivec has 32 registers, but Eigen only accepts a value of 8 or 16\n#ifndef EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS\n#define EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS 16\n#endif\n\ntypedef __vector float          Packet4f;\ntypedef __vector int            Packet4i;\ntypedef __vector unsigned int   Packet4ui;\ntypedef __vector __bool int     Packet4bi;\ntypedef __vector short int      Packet8i;\ntypedef __vector unsigned char  Packet16uc;\n\n// We don't want to write the same code all the time, but we need to reuse the constants\n// and it doesn't really work to declare them global, so we define macros instead\n\n#define _EIGEN_DECLARE_CONST_FAST_Packet4f(NAME,X) \\\n  Packet4f p4f_##NAME = (Packet4f) vec_splat_s32(X)\n\n#define _EIGEN_DECLARE_CONST_FAST_Packet4i(NAME,X) \\\n  Packet4i p4i_##NAME = vec_splat_s32(X)\n\n#define _EIGEN_DECLARE_CONST_Packet4f(NAME,X) \\\n  Packet4f p4f_##NAME = pset1<Packet4f>(X)\n\n#define _EIGEN_DECLARE_CONST_Packet4f_FROM_INT(NAME,X) \\\n  Packet4f p4f_##NAME = vreinterpretq_f32_u32(pset1<int>(X))\n\n#define _EIGEN_DECLARE_CONST_Packet4i(NAME,X) \\\n  Packet4i p4i_##NAME = pset1<Packet4i>(X)\n\n#define DST_CHAN 1\n#define DST_CTRL(size, count, stride) (((size) << 24) | ((count) << 16) | (stride))\n\n// Define global static constants:\nstatic Packet4f p4f_COUNTDOWN = { 3.0, 2.0, 1.0, 0.0 };\nstatic Packet4i p4i_COUNTDOWN = { 3, 2, 1, 0 };\nstatic Packet16uc p16uc_REVERSE = {12,13,14,15, 8,9,10,11, 4,5,6,7, 0,1,2,3};\nstatic Packet16uc p16uc_FORWARD = vec_lvsl(0, (float*)0);\nstatic Packet16uc p16uc_DUPLICATE = {0,1,2,3, 0,1,2,3, 4,5,6,7, 4,5,6,7};\n\nstatic _EIGEN_DECLARE_CONST_FAST_Packet4f(ZERO, 0);\nstatic _EIGEN_DECLARE_CONST_FAST_Packet4i(ZERO, 0);\nstatic _EIGEN_DECLARE_CONST_FAST_Packet4i(ONE,1);\nstatic _EIGEN_DECLARE_CONST_FAST_Packet4i(MINUS16,-16);\nstatic _EIGEN_DECLARE_CONST_FAST_Packet4i(MINUS1,-1);\nstatic Packet4f p4f_ONE = vec_ctf(p4i_ONE, 0);\nstatic Packet4f p4f_ZERO_ = (Packet4f) vec_sl((Packet4ui)p4i_MINUS1, (Packet4ui)p4i_MINUS1);\n\ntemplate<> struct packet_traits<float>  : default_packet_traits\n{\n  typedef Packet4f type;\n  enum {\n    Vectorizable = 1,\n    AlignedOnScalar = 1,\n    size=4,\n\n    // FIXME check the Has*\n    HasSin  = 0,\n    HasCos  = 0,\n    HasLog  = 0,\n    HasExp  = 0,\n    HasSqrt = 0\n  };\n};\ntemplate<> struct packet_traits<int>    : default_packet_traits\n{\n  typedef Packet4i type;\n  enum {\n    // FIXME check the Has*\n    Vectorizable = 1,\n    AlignedOnScalar = 1,\n    size=4\n  };\n};\n\ntemplate<> struct unpacket_traits<Packet4f> { typedef float  type; enum {size=4}; };\ntemplate<> struct unpacket_traits<Packet4i> { typedef int    type; enum {size=4}; };\n/*\ninline std::ostream & operator <<(std::ostream & s, const Packet4f & v)\n{\n  union {\n    Packet4f   v;\n    float n[4];\n  } vt;\n  vt.v = v;\n  s << vt.n[0] << \", \" << vt.n[1] << \", \" << vt.n[2] << \", \" << vt.n[3];\n  return s;\n}\n\ninline std::ostream & operator <<(std::ostream & s, const Packet4i & v)\n{\n  union {\n    Packet4i   v;\n    int n[4];\n  } vt;\n  vt.v = v;\n  s << vt.n[0] << \", \" << vt.n[1] << \", \" << vt.n[2] << \", \" << vt.n[3];\n  return s;\n}\n\ninline std::ostream & operator <<(std::ostream & s, const Packet4ui & v)\n{\n  union {\n    Packet4ui   v;\n    unsigned int n[4];\n  } vt;\n  vt.v = v;\n  s << vt.n[0] << \", \" << vt.n[1] << \", \" << vt.n[2] << \", \" << vt.n[3];\n  return s;\n}\n\ninline std::ostream & operator <<(std::ostream & s, const Packetbi & v)\n{\n  union {\n    Packet4bi v;\n    unsigned int n[4];\n  } vt;\n  vt.v = v;\n  s << vt.n[0] << \", \" << vt.n[1] << \", \" << vt.n[2] << \", \" << vt.n[3];\n  return s;\n}\n*/\ntemplate<> EIGEN_STRONG_INLINE Packet4f pset1<Packet4f>(const float&  from) {\n  // Taken from http://developer.apple.com/hardwaredrivers/ve/alignment.html\n  float EIGEN_ALIGN16 af[4];\n  af[0] = from;\n  Packet4f vc = vec_ld(0, af);\n  vc = vec_splat(vc, 0);\n  return vc;\n}\n\ntemplate<> EIGEN_STRONG_INLINE Packet4i pset1<Packet4i>(const int&    from)   {\n  int EIGEN_ALIGN16 ai[4];\n  ai[0] = from;\n  Packet4i vc = vec_ld(0, ai);\n  vc = vec_splat(vc, 0);\n  return vc;\n}\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f plset<float>(const float& a) { return vec_add(pset1<Packet4f>(a), p4f_COUNTDOWN); }\ntemplate<> EIGEN_STRONG_INLINE Packet4i plset<int>(const int& a)     { return vec_add(pset1<Packet4i>(a), p4i_COUNTDOWN); }\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f padd<Packet4f>(const Packet4f& a, const Packet4f& b) { return vec_add(a,b); }\ntemplate<> EIGEN_STRONG_INLINE Packet4i padd<Packet4i>(const Packet4i& a, const Packet4i& b) { return vec_add(a,b); }\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f psub<Packet4f>(const Packet4f& a, const Packet4f& b) { return vec_sub(a,b); }\ntemplate<> EIGEN_STRONG_INLINE Packet4i psub<Packet4i>(const Packet4i& a, const Packet4i& b) { return vec_sub(a,b); }\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f pnegate(const Packet4f& a) { return psub<Packet4f>(p4f_ZERO, a); }\ntemplate<> EIGEN_STRONG_INLINE Packet4i pnegate(const Packet4i& a) { return psub<Packet4i>(p4i_ZERO, a); }\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f pconj(const Packet4f& a) { return a; }\ntemplate<> EIGEN_STRONG_INLINE Packet4i pconj(const Packet4i& a) { return a; }\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f pmul<Packet4f>(const Packet4f& a, const Packet4f& b) { return vec_madd(a,b,p4f_ZERO); }\n/* Commented out: it's actually slower than processing it scalar\n *\ntemplate<> EIGEN_STRONG_INLINE Packet4i pmul<Packet4i>(const Packet4i& a, const Packet4i& b)\n{\n  // Detailed in: http://freevec.org/content/32bit_signed_integer_multiplication_altivec\n  //Set up constants, variables\n  Packet4i a1, b1, bswap, low_prod, high_prod, prod, prod_, v1sel;\n\n  // Get the absolute values\n  a1  = vec_abs(a);\n  b1  = vec_abs(b);\n\n  // Get the signs using xor\n  Packet4bi sgn = (Packet4bi) vec_cmplt(vec_xor(a, b), p4i_ZERO);\n\n  // Do the multiplication for the asbolute values.\n  bswap = (Packet4i) vec_rl((Packet4ui) b1, (Packet4ui) p4i_MINUS16 );\n  low_prod = vec_mulo((Packet8i) a1, (Packet8i)b1);\n  high_prod = vec_msum((Packet8i) a1, (Packet8i) bswap, p4i_ZERO);\n  high_prod = (Packet4i) vec_sl((Packet4ui) high_prod, (Packet4ui) p4i_MINUS16);\n  prod = vec_add( low_prod, high_prod );\n\n  // NOR the product and select only the negative elements according to the sign mask\n  prod_ = vec_nor(prod, prod);\n  prod_ = vec_sel(p4i_ZERO, prod_, sgn);\n\n  // Add 1 to the result to get the negative numbers\n  v1sel = vec_sel(p4i_ZERO, p4i_ONE, sgn);\n  prod_ = vec_add(prod_, v1sel);\n\n  // Merge the results back to the final vector.\n  prod = vec_sel(prod, prod_, sgn);\n\n  return prod;\n}\n*/\ntemplate<> EIGEN_STRONG_INLINE Packet4f pdiv<Packet4f>(const Packet4f& a, const Packet4f& b)\n{\n  Packet4f t, y_0, y_1, res;\n\n  // Altivec does not offer a divide instruction, we have to do a reciprocal approximation\n  y_0 = vec_re(b);\n\n  // Do one Newton-Raphson iteration to get the needed accuracy\n  t   = vec_nmsub(y_0, b, p4f_ONE);\n  y_1 = vec_madd(y_0, t, y_0);\n\n  res = vec_madd(a, y_1, p4f_ZERO);\n  return res;\n}\n\ntemplate<> EIGEN_STRONG_INLINE Packet4i pdiv<Packet4i>(const Packet4i& /*a*/, const Packet4i& /*b*/)\n{ eigen_assert(false && \"packet integer division are not supported by AltiVec\");\n  return pset1<Packet4i>(0);\n}\n\n// for some weird raisons, it has to be overloaded for packet of integers\ntemplate<> EIGEN_STRONG_INLINE Packet4f pmadd(const Packet4f& a, const Packet4f& b, const Packet4f& c) { return vec_madd(a, b, c); }\ntemplate<> EIGEN_STRONG_INLINE Packet4i pmadd(const Packet4i& a, const Packet4i& b, const Packet4i& c) { return padd(pmul(a,b), c); }\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f pmin<Packet4f>(const Packet4f& a, const Packet4f& b) { return vec_min(a, b); }\ntemplate<> EIGEN_STRONG_INLINE Packet4i pmin<Packet4i>(const Packet4i& a, const Packet4i& b) { return vec_min(a, b); }\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f pmax<Packet4f>(const Packet4f& a, const Packet4f& b) { return vec_max(a, b); }\ntemplate<> EIGEN_STRONG_INLINE Packet4i pmax<Packet4i>(const Packet4i& a, const Packet4i& b) { return vec_max(a, b); }\n\n// Logical Operations are not supported for float, so we have to reinterpret casts using NEON intrinsics\ntemplate<> EIGEN_STRONG_INLINE Packet4f pand<Packet4f>(const Packet4f& a, const Packet4f& b) { return vec_and(a, b); }\ntemplate<> EIGEN_STRONG_INLINE Packet4i pand<Packet4i>(const Packet4i& a, const Packet4i& b) { return vec_and(a, b); }\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f por<Packet4f>(const Packet4f& a, const Packet4f& b) { return vec_or(a, b); }\ntemplate<> EIGEN_STRONG_INLINE Packet4i por<Packet4i>(const Packet4i& a, const Packet4i& b) { return vec_or(a, b); }\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f pxor<Packet4f>(const Packet4f& a, const Packet4f& b) { return vec_xor(a, b); }\ntemplate<> EIGEN_STRONG_INLINE Packet4i pxor<Packet4i>(const Packet4i& a, const Packet4i& b) { return vec_xor(a, b); }\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f pandnot<Packet4f>(const Packet4f& a, const Packet4f& b) { return vec_and(a, vec_nor(b, b)); }\ntemplate<> EIGEN_STRONG_INLINE Packet4i pandnot<Packet4i>(const Packet4i& a, const Packet4i& b) { return vec_and(a, vec_nor(b, b)); }\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f pload<Packet4f>(const float* from) { EIGEN_DEBUG_ALIGNED_LOAD return vec_ld(0, from); }\ntemplate<> EIGEN_STRONG_INLINE Packet4i pload<Packet4i>(const int*     from) { EIGEN_DEBUG_ALIGNED_LOAD return vec_ld(0, from); }\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f ploadu<Packet4f>(const float* from)\n{\n  EIGEN_DEBUG_ALIGNED_LOAD\n  // Taken from http://developer.apple.com/hardwaredrivers/ve/alignment.html\n  Packet16uc MSQ, LSQ;\n  Packet16uc mask;\n  MSQ = vec_ld(0, (unsigned char *)from);          // most significant quadword\n  LSQ = vec_ld(15, (unsigned char *)from);         // least significant quadword\n  mask = vec_lvsl(0, from);                        // create the permute mask\n  return (Packet4f) vec_perm(MSQ, LSQ, mask);           // align the data\n\n}\ntemplate<> EIGEN_STRONG_INLINE Packet4i ploadu<Packet4i>(const int* from)\n{\n  EIGEN_DEBUG_ALIGNED_LOAD\n  // Taken from http://developer.apple.com/hardwaredrivers/ve/alignment.html\n  Packet16uc MSQ, LSQ;\n  Packet16uc mask;\n  MSQ = vec_ld(0, (unsigned char *)from);          // most significant quadword\n  LSQ = vec_ld(15, (unsigned char *)from);         // least significant quadword\n  mask = vec_lvsl(0, from);                        // create the permute mask\n  return (Packet4i) vec_perm(MSQ, LSQ, mask);    // align the data\n}\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f ploaddup<Packet4f>(const float*   from)\n{\n  Packet4f p;\n  if((ptrdiff_t(&from) % 16) == 0)  p = pload<Packet4f>(from);\n  else                              p = ploadu<Packet4f>(from);\n  return vec_perm(p, p, p16uc_DUPLICATE);\n}\ntemplate<> EIGEN_STRONG_INLINE Packet4i ploaddup<Packet4i>(const int*     from)\n{\n  Packet4i p;\n  if((ptrdiff_t(&from) % 16) == 0)  p = pload<Packet4i>(from);\n  else                              p = ploadu<Packet4i>(from);\n  return vec_perm(p, p, p16uc_DUPLICATE);\n}\n\ntemplate<> EIGEN_STRONG_INLINE void pstore<float>(float*   to, const Packet4f& from) { EIGEN_DEBUG_ALIGNED_STORE vec_st(from, 0, to); }\ntemplate<> EIGEN_STRONG_INLINE void pstore<int>(int*       to, const Packet4i& from) { EIGEN_DEBUG_ALIGNED_STORE vec_st(from, 0, to); }\n\ntemplate<> EIGEN_STRONG_INLINE void pstoreu<float>(float*  to, const Packet4f& from)\n{\n  EIGEN_DEBUG_UNALIGNED_STORE\n  // Taken from http://developer.apple.com/hardwaredrivers/ve/alignment.html\n  // Warning: not thread safe!\n  Packet16uc MSQ, LSQ, edges;\n  Packet16uc edgeAlign, align;\n\n  MSQ = vec_ld(0, (unsigned char *)to);                     // most significant quadword\n  LSQ = vec_ld(15, (unsigned char *)to);                    // least significant quadword\n  edgeAlign = vec_lvsl(0, to);                              // permute map to extract edges\n  edges=vec_perm(LSQ,MSQ,edgeAlign);                        // extract the edges\n  align = vec_lvsr( 0, to );                                // permute map to misalign data\n  MSQ = vec_perm(edges,(Packet16uc)from,align);             // misalign the data (MSQ)\n  LSQ = vec_perm((Packet16uc)from,edges,align);             // misalign the data (LSQ)\n  vec_st( LSQ, 15, (unsigned char *)to );                   // Store the LSQ part first\n  vec_st( MSQ, 0, (unsigned char *)to );                    // Store the MSQ part\n}\ntemplate<> EIGEN_STRONG_INLINE void pstoreu<int>(int*      to, const Packet4i& from)\n{\n  EIGEN_DEBUG_UNALIGNED_STORE\n  // Taken from http://developer.apple.com/hardwaredrivers/ve/alignment.html\n  // Warning: not thread safe!\n  Packet16uc MSQ, LSQ, edges;\n  Packet16uc edgeAlign, align;\n\n  MSQ = vec_ld(0, (unsigned char *)to);                     // most significant quadword\n  LSQ = vec_ld(15, (unsigned char *)to);                    // least significant quadword\n  edgeAlign = vec_lvsl(0, to);                              // permute map to extract edges\n  edges=vec_perm(LSQ, MSQ, edgeAlign);                      // extract the edges\n  align = vec_lvsr( 0, to );                                // permute map to misalign data\n  MSQ = vec_perm(edges, (Packet16uc) from, align);          // misalign the data (MSQ)\n  LSQ = vec_perm((Packet16uc) from, edges, align);          // misalign the data (LSQ)\n  vec_st( LSQ, 15, (unsigned char *)to );                   // Store the LSQ part first\n  vec_st( MSQ, 0, (unsigned char *)to );                    // Store the MSQ part\n}\n\ntemplate<> EIGEN_STRONG_INLINE void prefetch<float>(const float* addr) { vec_dstt(addr, DST_CTRL(2,2,32), DST_CHAN); }\ntemplate<> EIGEN_STRONG_INLINE void prefetch<int>(const int*     addr) { vec_dstt(addr, DST_CTRL(2,2,32), DST_CHAN); }\n\ntemplate<> EIGEN_STRONG_INLINE float  pfirst<Packet4f>(const Packet4f& a) { float EIGEN_ALIGN16 x[4]; vec_st(a, 0, x); return x[0]; }\ntemplate<> EIGEN_STRONG_INLINE int    pfirst<Packet4i>(const Packet4i& a) { int   EIGEN_ALIGN16 x[4]; vec_st(a, 0, x); return x[0]; }\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f preverse(const Packet4f& a) { return (Packet4f)vec_perm((Packet16uc)a,(Packet16uc)a, p16uc_REVERSE); }\ntemplate<> EIGEN_STRONG_INLINE Packet4i preverse(const Packet4i& a) { return (Packet4i)vec_perm((Packet16uc)a,(Packet16uc)a, p16uc_REVERSE); }\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f pabs(const Packet4f& a) { return vec_abs(a); }\ntemplate<> EIGEN_STRONG_INLINE Packet4i pabs(const Packet4i& a) { return vec_abs(a); }\n\ntemplate<> EIGEN_STRONG_INLINE float predux<Packet4f>(const Packet4f& a)\n{\n  Packet4f b, sum;\n  b   = (Packet4f) vec_sld(a, a, 8);\n  sum = vec_add(a, b);\n  b   = (Packet4f) vec_sld(sum, sum, 4);\n  sum = vec_add(sum, b);\n  return pfirst(sum);\n}\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f preduxp<Packet4f>(const Packet4f* vecs)\n{\n  Packet4f v[4], sum[4];\n\n  // It's easier and faster to transpose then add as columns\n  // Check: http://www.freevec.org/function/matrix_4x4_transpose_floats for explanation\n  // Do the transpose, first set of moves\n  v[0] = vec_mergeh(vecs[0], vecs[2]);\n  v[1] = vec_mergel(vecs[0], vecs[2]);\n  v[2] = vec_mergeh(vecs[1], vecs[3]);\n  v[3] = vec_mergel(vecs[1], vecs[3]);\n  // Get the resulting vectors\n  sum[0] = vec_mergeh(v[0], v[2]);\n  sum[1] = vec_mergel(v[0], v[2]);\n  sum[2] = vec_mergeh(v[1], v[3]);\n  sum[3] = vec_mergel(v[1], v[3]);\n\n  // Now do the summation:\n  // Lines 0+1\n  sum[0] = vec_add(sum[0], sum[1]);\n  // Lines 2+3\n  sum[1] = vec_add(sum[2], sum[3]);\n  // Add the results\n  sum[0] = vec_add(sum[0], sum[1]);\n\n  return sum[0];\n}\n\ntemplate<> EIGEN_STRONG_INLINE int predux<Packet4i>(const Packet4i& a)\n{\n  Packet4i sum;\n  sum = vec_sums(a, p4i_ZERO);\n  sum = vec_sld(sum, p4i_ZERO, 12);\n  return pfirst(sum);\n}\n\ntemplate<> EIGEN_STRONG_INLINE Packet4i preduxp<Packet4i>(const Packet4i* vecs)\n{\n  Packet4i v[4], sum[4];\n\n  // It's easier and faster to transpose then add as columns\n  // Check: http://www.freevec.org/function/matrix_4x4_transpose_floats for explanation\n  // Do the transpose, first set of moves\n  v[0] = vec_mergeh(vecs[0], vecs[2]);\n  v[1] = vec_mergel(vecs[0], vecs[2]);\n  v[2] = vec_mergeh(vecs[1], vecs[3]);\n  v[3] = vec_mergel(vecs[1], vecs[3]);\n  // Get the resulting vectors\n  sum[0] = vec_mergeh(v[0], v[2]);\n  sum[1] = vec_mergel(v[0], v[2]);\n  sum[2] = vec_mergeh(v[1], v[3]);\n  sum[3] = vec_mergel(v[1], v[3]);\n\n  // Now do the summation:\n  // Lines 0+1\n  sum[0] = vec_add(sum[0], sum[1]);\n  // Lines 2+3\n  sum[1] = vec_add(sum[2], sum[3]);\n  // Add the results\n  sum[0] = vec_add(sum[0], sum[1]);\n\n  return sum[0];\n}\n\n// Other reduction functions:\n// mul\ntemplate<> EIGEN_STRONG_INLINE float predux_mul<Packet4f>(const Packet4f& a)\n{\n  Packet4f prod;\n  prod = pmul(a, (Packet4f)vec_sld(a, a, 8));\n  return pfirst(pmul(prod, (Packet4f)vec_sld(prod, prod, 4)));\n}\n\ntemplate<> EIGEN_STRONG_INLINE int predux_mul<Packet4i>(const Packet4i& a)\n{\n  EIGEN_ALIGN16 int aux[4];\n  pstore(aux, a);\n  return aux[0] * aux[1] * aux[2] * aux[3];\n}\n\n// min\ntemplate<> EIGEN_STRONG_INLINE float predux_min<Packet4f>(const Packet4f& a)\n{\n  Packet4f b, res;\n  b = vec_min(a, vec_sld(a, a, 8));\n  res = vec_min(b, vec_sld(b, b, 4));\n  return pfirst(res);\n}\n\ntemplate<> EIGEN_STRONG_INLINE int predux_min<Packet4i>(const Packet4i& a)\n{\n  Packet4i b, res;\n  b = vec_min(a, vec_sld(a, a, 8));\n  res = vec_min(b, vec_sld(b, b, 4));\n  return pfirst(res);\n}\n\n// max\ntemplate<> EIGEN_STRONG_INLINE float predux_max<Packet4f>(const Packet4f& a)\n{\n  Packet4f b, res;\n  b = vec_max(a, vec_sld(a, a, 8));\n  res = vec_max(b, vec_sld(b, b, 4));\n  return pfirst(res);\n}\n\ntemplate<> EIGEN_STRONG_INLINE int predux_max<Packet4i>(const Packet4i& a)\n{\n  Packet4i b, res;\n  b = vec_max(a, vec_sld(a, a, 8));\n  res = vec_max(b, vec_sld(b, b, 4));\n  return pfirst(res);\n}\n\ntemplate<int Offset>\nstruct palign_impl<Offset,Packet4f>\n{\n  static EIGEN_STRONG_INLINE void run(Packet4f& first, const Packet4f& second)\n  {\n    if (Offset!=0)\n      first = vec_sld(first, second, Offset*4);\n  }\n};\n\ntemplate<int Offset>\nstruct palign_impl<Offset,Packet4i>\n{\n  static EIGEN_STRONG_INLINE void run(Packet4i& first, const Packet4i& second)\n  {\n    if (Offset!=0)\n      first = vec_sld(first, second, Offset*4);\n  }\n};\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_PACKET_MATH_ALTIVEC_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/arch/CMakeLists.txt",
    "content": "ADD_SUBDIRECTORY(SSE)\nADD_SUBDIRECTORY(AltiVec)\nADD_SUBDIRECTORY(NEON)\nADD_SUBDIRECTORY(Default)\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/arch/Default/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_Core_arch_Default_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_Core_arch_Default_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/Core/arch/Default COMPONENT Devel\n)\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/arch/Default/Settings.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n/* All the parameters defined in this file can be specialized in the\n * architecture specific files, and/or by the user.\n * More to come... */\n\n#ifndef EIGEN_DEFAULT_SETTINGS_H\n#define EIGEN_DEFAULT_SETTINGS_H\n\n/** Defines the maximal loop size to enable meta unrolling of loops.\n  * Note that the value here is expressed in Eigen's own notion of \"number of FLOPS\",\n  * it does not correspond to the number of iterations or the number of instructions\n  */\n#ifndef EIGEN_UNROLLING_LIMIT\n#define EIGEN_UNROLLING_LIMIT 100\n#endif\n\n/** Defines the threshold between a \"small\" and a \"large\" matrix.\n  * This threshold is mainly used to select the proper product implementation.\n  */\n#ifndef EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD\n#define EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD 8\n#endif\n\n/** Defines the maximal width of the blocks used in the triangular product and solver\n  * for vectors (level 2 blas xTRMV and xTRSV). The default is 8.\n  */\n#ifndef EIGEN_TUNE_TRIANGULAR_PANEL_WIDTH\n#define EIGEN_TUNE_TRIANGULAR_PANEL_WIDTH 8\n#endif\n\n\n/** Defines the default number of registers available for that architecture.\n  * Currently it must be 8 or 16. Other values will fail.\n  */\n#ifndef EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS\n#define EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS 8\n#endif\n\n#endif // EIGEN_DEFAULT_SETTINGS_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/arch/NEON/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_Core_arch_NEON_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_Core_arch_NEON_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/Core/arch/NEON COMPONENT Devel\n)\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/arch/NEON/Complex.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_COMPLEX_NEON_H\n#define EIGEN_COMPLEX_NEON_H\n\nnamespace Eigen {\n\nnamespace internal {\n\nstatic uint32x4_t p4ui_CONJ_XOR = EIGEN_INIT_NEON_PACKET4(0x00000000, 0x80000000, 0x00000000, 0x80000000);\nstatic uint32x2_t p2ui_CONJ_XOR = EIGEN_INIT_NEON_PACKET2(0x00000000, 0x80000000);\n\n//---------- float ----------\nstruct Packet2cf\n{\n  EIGEN_STRONG_INLINE Packet2cf() {}\n  EIGEN_STRONG_INLINE explicit Packet2cf(const Packet4f& a) : v(a) {}\n  Packet4f  v;\n};\n\ntemplate<> struct packet_traits<std::complex<float> >  : default_packet_traits\n{\n  typedef Packet2cf type;\n  enum {\n    Vectorizable = 1,\n    AlignedOnScalar = 1,\n    size = 2,\n\n    HasAdd    = 1,\n    HasSub    = 1,\n    HasMul    = 1,\n    HasDiv    = 1,\n    HasNegate = 1,\n    HasAbs    = 0,\n    HasAbs2   = 0,\n    HasMin    = 0,\n    HasMax    = 0,\n    HasSetLinear = 0\n  };\n};\n\ntemplate<> struct unpacket_traits<Packet2cf> { typedef std::complex<float> type; enum {size=2}; };\n\ntemplate<> EIGEN_STRONG_INLINE Packet2cf pset1<Packet2cf>(const std::complex<float>&  from)\n{\n  float32x2_t r64;\n  r64 = vld1_f32((float *)&from);\n\n  return Packet2cf(vcombine_f32(r64, r64));\n}\n\ntemplate<> EIGEN_STRONG_INLINE Packet2cf padd<Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(padd<Packet4f>(a.v,b.v)); }\ntemplate<> EIGEN_STRONG_INLINE Packet2cf psub<Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(psub<Packet4f>(a.v,b.v)); }\ntemplate<> EIGEN_STRONG_INLINE Packet2cf pnegate(const Packet2cf& a) { return Packet2cf(pnegate<Packet4f>(a.v)); }\ntemplate<> EIGEN_STRONG_INLINE Packet2cf pconj(const Packet2cf& a)\n{\n  Packet4ui b = vreinterpretq_u32_f32(a.v);\n  return Packet2cf(vreinterpretq_f32_u32(veorq_u32(b, p4ui_CONJ_XOR)));\n}\n\ntemplate<> EIGEN_STRONG_INLINE Packet2cf pmul<Packet2cf>(const Packet2cf& a, const Packet2cf& b)\n{\n  Packet4f v1, v2;\n\n  // Get the real values of a | a1_re | a1_re | a2_re | a2_re |\n  v1 = vcombine_f32(vdup_lane_f32(vget_low_f32(a.v), 0), vdup_lane_f32(vget_high_f32(a.v), 0));\n  // Get the real values of a | a1_im | a1_im | a2_im | a2_im |\n  v2 = vcombine_f32(vdup_lane_f32(vget_low_f32(a.v), 1), vdup_lane_f32(vget_high_f32(a.v), 1));\n  // Multiply the real a with b\n  v1 = vmulq_f32(v1, b.v);\n  // Multiply the imag a with b\n  v2 = vmulq_f32(v2, b.v);\n  // Conjugate v2 \n  v2 = vreinterpretq_f32_u32(veorq_u32(vreinterpretq_u32_f32(v2), p4ui_CONJ_XOR));\n  // Swap real/imag elements in v2.\n  v2 = vrev64q_f32(v2);\n  // Add and return the result\n  return Packet2cf(vaddq_f32(v1, v2));\n}\n\ntemplate<> EIGEN_STRONG_INLINE Packet2cf pand   <Packet2cf>(const Packet2cf& a, const Packet2cf& b)\n{\n  return Packet2cf(vreinterpretq_f32_u32(vorrq_u32(vreinterpretq_u32_f32(a.v),vreinterpretq_u32_f32(b.v))));\n}\ntemplate<> EIGEN_STRONG_INLINE Packet2cf por    <Packet2cf>(const Packet2cf& a, const Packet2cf& b)\n{\n  return Packet2cf(vreinterpretq_f32_u32(vorrq_u32(vreinterpretq_u32_f32(a.v),vreinterpretq_u32_f32(b.v))));\n}\ntemplate<> EIGEN_STRONG_INLINE Packet2cf pxor   <Packet2cf>(const Packet2cf& a, const Packet2cf& b)\n{\n  return Packet2cf(vreinterpretq_f32_u32(veorq_u32(vreinterpretq_u32_f32(a.v),vreinterpretq_u32_f32(b.v))));\n}\ntemplate<> EIGEN_STRONG_INLINE Packet2cf pandnot<Packet2cf>(const Packet2cf& a, const Packet2cf& b)\n{\n  return Packet2cf(vreinterpretq_f32_u32(vbicq_u32(vreinterpretq_u32_f32(a.v),vreinterpretq_u32_f32(b.v))));\n}\n\ntemplate<> EIGEN_STRONG_INLINE Packet2cf pload<Packet2cf>(const std::complex<float>* from) { EIGEN_DEBUG_ALIGNED_LOAD return Packet2cf(pload<Packet4f>((const float*)from)); }\ntemplate<> EIGEN_STRONG_INLINE Packet2cf ploadu<Packet2cf>(const std::complex<float>* from) { EIGEN_DEBUG_UNALIGNED_LOAD return Packet2cf(ploadu<Packet4f>((const float*)from)); }\n\ntemplate<> EIGEN_STRONG_INLINE Packet2cf ploaddup<Packet2cf>(const std::complex<float>* from) { return pset1<Packet2cf>(*from); }\n\ntemplate<> EIGEN_STRONG_INLINE void pstore <std::complex<float> >(std::complex<float> *   to, const Packet2cf& from) { EIGEN_DEBUG_ALIGNED_STORE pstore((float*)to, from.v); }\ntemplate<> EIGEN_STRONG_INLINE void pstoreu<std::complex<float> >(std::complex<float> *   to, const Packet2cf& from) { EIGEN_DEBUG_UNALIGNED_STORE pstoreu((float*)to, from.v); }\n\ntemplate<> EIGEN_STRONG_INLINE void prefetch<std::complex<float> >(const std::complex<float> *   addr) { EIGEN_ARM_PREFETCH((float *)addr); }\n\ntemplate<> EIGEN_STRONG_INLINE std::complex<float>  pfirst<Packet2cf>(const Packet2cf& a)\n{\n  std::complex<float> EIGEN_ALIGN16 x[2];\n  vst1q_f32((float *)x, a.v);\n  return x[0];\n}\n\ntemplate<> EIGEN_STRONG_INLINE Packet2cf preverse(const Packet2cf& a)\n{\n  float32x2_t a_lo, a_hi;\n  Packet4f a_r128;\n\n  a_lo = vget_low_f32(a.v);\n  a_hi = vget_high_f32(a.v);\n  a_r128 = vcombine_f32(a_hi, a_lo);\n\n  return Packet2cf(a_r128);\n}\n\ntemplate<> EIGEN_STRONG_INLINE Packet2cf pcplxflip<Packet2cf>(const Packet2cf& a)\n{\n  return Packet2cf(vrev64q_f32(a.v));\n}\n\ntemplate<> EIGEN_STRONG_INLINE std::complex<float> predux<Packet2cf>(const Packet2cf& a)\n{\n  float32x2_t a1, a2;\n  std::complex<float> s;\n\n  a1 = vget_low_f32(a.v);\n  a2 = vget_high_f32(a.v);\n  a2 = vadd_f32(a1, a2);\n  vst1_f32((float *)&s, a2);\n\n  return s;\n}\n\ntemplate<> EIGEN_STRONG_INLINE Packet2cf preduxp<Packet2cf>(const Packet2cf* vecs)\n{\n  Packet4f sum1, sum2, sum;\n\n  // Add the first two 64-bit float32x2_t of vecs[0]\n  sum1 = vcombine_f32(vget_low_f32(vecs[0].v), vget_low_f32(vecs[1].v));\n  sum2 = vcombine_f32(vget_high_f32(vecs[0].v), vget_high_f32(vecs[1].v));\n  sum = vaddq_f32(sum1, sum2);\n\n  return Packet2cf(sum);\n}\n\ntemplate<> EIGEN_STRONG_INLINE std::complex<float> predux_mul<Packet2cf>(const Packet2cf& a)\n{\n  float32x2_t a1, a2, v1, v2, prod;\n  std::complex<float> s;\n\n  a1 = vget_low_f32(a.v);\n  a2 = vget_high_f32(a.v);\n   // Get the real values of a | a1_re | a1_re | a2_re | a2_re |\n  v1 = vdup_lane_f32(a1, 0);\n  // Get the real values of a | a1_im | a1_im | a2_im | a2_im |\n  v2 = vdup_lane_f32(a1, 1);\n  // Multiply the real a with b\n  v1 = vmul_f32(v1, a2);\n  // Multiply the imag a with b\n  v2 = vmul_f32(v2, a2);\n  // Conjugate v2 \n  v2 = vreinterpret_f32_u32(veor_u32(vreinterpret_u32_f32(v2), p2ui_CONJ_XOR));\n  // Swap real/imag elements in v2.\n  v2 = vrev64_f32(v2);\n  // Add v1, v2\n  prod = vadd_f32(v1, v2);\n\n  vst1_f32((float *)&s, prod);\n\n  return s;\n}\n\ntemplate<int Offset>\nstruct palign_impl<Offset,Packet2cf>\n{\n  EIGEN_STRONG_INLINE static void run(Packet2cf& first, const Packet2cf& second)\n  {\n    if (Offset==1)\n    {\n      first.v = vextq_f32(first.v, second.v, 2);\n    }\n  }\n};\n\ntemplate<> struct conj_helper<Packet2cf, Packet2cf, false,true>\n{\n  EIGEN_STRONG_INLINE Packet2cf pmadd(const Packet2cf& x, const Packet2cf& y, const Packet2cf& c) const\n  { return padd(pmul(x,y),c); }\n\n  EIGEN_STRONG_INLINE Packet2cf pmul(const Packet2cf& a, const Packet2cf& b) const\n  {\n    return internal::pmul(a, pconj(b));\n  }\n};\n\ntemplate<> struct conj_helper<Packet2cf, Packet2cf, true,false>\n{\n  EIGEN_STRONG_INLINE Packet2cf pmadd(const Packet2cf& x, const Packet2cf& y, const Packet2cf& c) const\n  { return padd(pmul(x,y),c); }\n\n  EIGEN_STRONG_INLINE Packet2cf pmul(const Packet2cf& a, const Packet2cf& b) const\n  {\n    return internal::pmul(pconj(a), b);\n  }\n};\n\ntemplate<> struct conj_helper<Packet2cf, Packet2cf, true,true>\n{\n  EIGEN_STRONG_INLINE Packet2cf pmadd(const Packet2cf& x, const Packet2cf& y, const Packet2cf& c) const\n  { return padd(pmul(x,y),c); }\n\n  EIGEN_STRONG_INLINE Packet2cf pmul(const Packet2cf& a, const Packet2cf& b) const\n  {\n    return pconj(internal::pmul(a, b));\n  }\n};\n\ntemplate<> EIGEN_STRONG_INLINE Packet2cf pdiv<Packet2cf>(const Packet2cf& a, const Packet2cf& b)\n{\n  // TODO optimize it for AltiVec\n  Packet2cf res = conj_helper<Packet2cf,Packet2cf,false,true>().pmul(a,b);\n  Packet4f s, rev_s;\n\n  // this computes the norm\n  s = vmulq_f32(b.v, b.v);\n  rev_s = vrev64q_f32(s);\n\n  return Packet2cf(pdiv(res.v, vaddq_f32(s,rev_s)));\n}\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_COMPLEX_NEON_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/arch/NEON/PacketMath.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2010 Konstantinos Margaritis <markos@codex.gr>\n// Heavily based on Gael's SSE version.\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_PACKET_MATH_NEON_H\n#define EIGEN_PACKET_MATH_NEON_H\n\nnamespace Eigen {\n\nnamespace internal {\n\n#ifndef EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD\n#define EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD 8\n#endif\n\n// FIXME NEON has 16 quad registers, but since the current register allocator\n// is so bad, it is much better to reduce it to 8\n#ifndef EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS\n#define EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS 8\n#endif\n\ntypedef float32x4_t Packet4f;\ntypedef int32x4_t   Packet4i;\ntypedef uint32x4_t  Packet4ui;\n\n#define _EIGEN_DECLARE_CONST_Packet4f(NAME,X) \\\n  const Packet4f p4f_##NAME = pset1<Packet4f>(X)\n\n#define _EIGEN_DECLARE_CONST_Packet4f_FROM_INT(NAME,X) \\\n  const Packet4f p4f_##NAME = vreinterpretq_f32_u32(pset1<int>(X))\n\n#define _EIGEN_DECLARE_CONST_Packet4i(NAME,X) \\\n  const Packet4i p4i_##NAME = pset1<Packet4i>(X)\n\n#if defined(__llvm__) && !defined(__clang__)\n  //Special treatment for Apple's llvm-gcc, its NEON packet types are unions\n  #define EIGEN_INIT_NEON_PACKET2(X, Y)       {{X, Y}}\n  #define EIGEN_INIT_NEON_PACKET4(X, Y, Z, W) {{X, Y, Z, W}}\n#else\n  //Default initializer for packets\n  #define EIGEN_INIT_NEON_PACKET2(X, Y)       {X, Y}\n  #define EIGEN_INIT_NEON_PACKET4(X, Y, Z, W) {X, Y, Z, W}\n#endif\n\n// arm64 does have the pld instruction. If available, let's trust the __builtin_prefetch built-in function\n// which available on LLVM and GCC (at least)\n#if EIGEN_HAS_BUILTIN(__builtin_prefetch) || defined(__GNUC__)\n  #define EIGEN_ARM_PREFETCH(ADDR) __builtin_prefetch(ADDR);\n#elif defined __pld\n  #define EIGEN_ARM_PREFETCH(ADDR) __pld(ADDR)\n#elif !defined(__aarch64__)\n  #define EIGEN_ARM_PREFETCH(ADDR) __asm__ __volatile__ ( \"   pld [%[addr]]\\n\" :: [addr] \"r\" (ADDR) : \"cc\" );\n#else\n  // by default no explicit prefetching\n  #define EIGEN_ARM_PREFETCH(ADDR)\n#endif\n\ntemplate<> struct packet_traits<float>  : default_packet_traits\n{\n  typedef Packet4f type;\n  enum {\n    Vectorizable = 1,\n    AlignedOnScalar = 1,\n    size = 4,\n   \n    HasDiv  = 1,\n    // FIXME check the Has*\n    HasSin  = 0,\n    HasCos  = 0,\n    HasLog  = 0,\n    HasExp  = 0,\n    HasSqrt = 0\n  };\n};\ntemplate<> struct packet_traits<int>    : default_packet_traits\n{\n  typedef Packet4i type;\n  enum {\n    Vectorizable = 1,\n    AlignedOnScalar = 1,\n    size=4\n    // FIXME check the Has*\n  };\n};\n\n#if EIGEN_GNUC_AT_MOST(4,4) && !defined(__llvm__)\n// workaround gcc 4.2, 4.3 and 4.4 compilatin issue\nEIGEN_STRONG_INLINE float32x4_t vld1q_f32(const float* x) { return ::vld1q_f32((const float32_t*)x); }\nEIGEN_STRONG_INLINE float32x2_t vld1_f32 (const float* x) { return ::vld1_f32 ((const float32_t*)x); }\nEIGEN_STRONG_INLINE void        vst1q_f32(float* to, float32x4_t from) { ::vst1q_f32((float32_t*)to,from); }\nEIGEN_STRONG_INLINE void        vst1_f32 (float* to, float32x2_t from) { ::vst1_f32 ((float32_t*)to,from); }\n#endif\n\ntemplate<> struct unpacket_traits<Packet4f> { typedef float  type; enum {size=4}; };\ntemplate<> struct unpacket_traits<Packet4i> { typedef int    type; enum {size=4}; };\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f pset1<Packet4f>(const float&  from) { return vdupq_n_f32(from); }\ntemplate<> EIGEN_STRONG_INLINE Packet4i pset1<Packet4i>(const int&    from)   { return vdupq_n_s32(from); }\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f plset<float>(const float& a)\n{\n  Packet4f countdown = EIGEN_INIT_NEON_PACKET4(0, 1, 2, 3);\n  return vaddq_f32(pset1<Packet4f>(a), countdown);\n}\ntemplate<> EIGEN_STRONG_INLINE Packet4i plset<int>(const int& a)\n{\n  Packet4i countdown = EIGEN_INIT_NEON_PACKET4(0, 1, 2, 3);\n  return vaddq_s32(pset1<Packet4i>(a), countdown);\n}\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f padd<Packet4f>(const Packet4f& a, const Packet4f& b) { return vaddq_f32(a,b); }\ntemplate<> EIGEN_STRONG_INLINE Packet4i padd<Packet4i>(const Packet4i& a, const Packet4i& b) { return vaddq_s32(a,b); }\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f psub<Packet4f>(const Packet4f& a, const Packet4f& b) { return vsubq_f32(a,b); }\ntemplate<> EIGEN_STRONG_INLINE Packet4i psub<Packet4i>(const Packet4i& a, const Packet4i& b) { return vsubq_s32(a,b); }\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f pnegate(const Packet4f& a) { return vnegq_f32(a); }\ntemplate<> EIGEN_STRONG_INLINE Packet4i pnegate(const Packet4i& a) { return vnegq_s32(a); }\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f pconj(const Packet4f& a) { return a; }\ntemplate<> EIGEN_STRONG_INLINE Packet4i pconj(const Packet4i& a) { return a; }\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f pmul<Packet4f>(const Packet4f& a, const Packet4f& b) { return vmulq_f32(a,b); }\ntemplate<> EIGEN_STRONG_INLINE Packet4i pmul<Packet4i>(const Packet4i& a, const Packet4i& b) { return vmulq_s32(a,b); }\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f pdiv<Packet4f>(const Packet4f& a, const Packet4f& b)\n{\n  Packet4f inv, restep, div;\n\n  // NEON does not offer a divide instruction, we have to do a reciprocal approximation\n  // However NEON in contrast to other SIMD engines (AltiVec/SSE), offers\n  // a reciprocal estimate AND a reciprocal step -which saves a few instructions\n  // vrecpeq_f32() returns an estimate to 1/b, which we will finetune with\n  // Newton-Raphson and vrecpsq_f32()\n  inv = vrecpeq_f32(b);\n\n  // This returns a differential, by which we will have to multiply inv to get a better\n  // approximation of 1/b.\n  restep = vrecpsq_f32(b, inv);\n  inv = vmulq_f32(restep, inv);\n\n  // Finally, multiply a by 1/b and get the wanted result of the division.\n  div = vmulq_f32(a, inv);\n\n  return div;\n}\ntemplate<> EIGEN_STRONG_INLINE Packet4i pdiv<Packet4i>(const Packet4i& /*a*/, const Packet4i& /*b*/)\n{ eigen_assert(false && \"packet integer division are not supported by NEON\");\n  return pset1<Packet4i>(0);\n}\n\n// for some weird raisons, it has to be overloaded for packet of integers\ntemplate<> EIGEN_STRONG_INLINE Packet4f pmadd(const Packet4f& a, const Packet4f& b, const Packet4f& c) { return vmlaq_f32(c,a,b); }\ntemplate<> EIGEN_STRONG_INLINE Packet4i pmadd(const Packet4i& a, const Packet4i& b, const Packet4i& c) { return vmlaq_s32(c,a,b); }\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f pmin<Packet4f>(const Packet4f& a, const Packet4f& b) { return vminq_f32(a,b); }\ntemplate<> EIGEN_STRONG_INLINE Packet4i pmin<Packet4i>(const Packet4i& a, const Packet4i& b) { return vminq_s32(a,b); }\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f pmax<Packet4f>(const Packet4f& a, const Packet4f& b) { return vmaxq_f32(a,b); }\ntemplate<> EIGEN_STRONG_INLINE Packet4i pmax<Packet4i>(const Packet4i& a, const Packet4i& b) { return vmaxq_s32(a,b); }\n\n// Logical Operations are not supported for float, so we have to reinterpret casts using NEON intrinsics\ntemplate<> EIGEN_STRONG_INLINE Packet4f pand<Packet4f>(const Packet4f& a, const Packet4f& b)\n{\n  return vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(a),vreinterpretq_u32_f32(b)));\n}\ntemplate<> EIGEN_STRONG_INLINE Packet4i pand<Packet4i>(const Packet4i& a, const Packet4i& b) { return vandq_s32(a,b); }\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f por<Packet4f>(const Packet4f& a, const Packet4f& b)\n{\n  return vreinterpretq_f32_u32(vorrq_u32(vreinterpretq_u32_f32(a),vreinterpretq_u32_f32(b)));\n}\ntemplate<> EIGEN_STRONG_INLINE Packet4i por<Packet4i>(const Packet4i& a, const Packet4i& b) { return vorrq_s32(a,b); }\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f pxor<Packet4f>(const Packet4f& a, const Packet4f& b)\n{\n  return vreinterpretq_f32_u32(veorq_u32(vreinterpretq_u32_f32(a),vreinterpretq_u32_f32(b)));\n}\ntemplate<> EIGEN_STRONG_INLINE Packet4i pxor<Packet4i>(const Packet4i& a, const Packet4i& b) { return veorq_s32(a,b); }\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f pandnot<Packet4f>(const Packet4f& a, const Packet4f& b)\n{\n  return vreinterpretq_f32_u32(vbicq_u32(vreinterpretq_u32_f32(a),vreinterpretq_u32_f32(b)));\n}\ntemplate<> EIGEN_STRONG_INLINE Packet4i pandnot<Packet4i>(const Packet4i& a, const Packet4i& b) { return vbicq_s32(a,b); }\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f pload<Packet4f>(const float* from) { EIGEN_DEBUG_ALIGNED_LOAD return vld1q_f32(from); }\ntemplate<> EIGEN_STRONG_INLINE Packet4i pload<Packet4i>(const int*   from) { EIGEN_DEBUG_ALIGNED_LOAD return vld1q_s32(from); }\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f ploadu<Packet4f>(const float* from) { EIGEN_DEBUG_UNALIGNED_LOAD return vld1q_f32(from); }\ntemplate<> EIGEN_STRONG_INLINE Packet4i ploadu<Packet4i>(const int* from)   { EIGEN_DEBUG_UNALIGNED_LOAD return vld1q_s32(from); }\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f ploaddup<Packet4f>(const float*   from)\n{\n  float32x2_t lo, hi;\n  lo = vld1_dup_f32(from);\n  hi = vld1_dup_f32(from+1);\n  return vcombine_f32(lo, hi);\n}\ntemplate<> EIGEN_STRONG_INLINE Packet4i ploaddup<Packet4i>(const int*     from)\n{\n  int32x2_t lo, hi;\n  lo = vld1_dup_s32(from);\n  hi = vld1_dup_s32(from+1);\n  return vcombine_s32(lo, hi);\n}\n\ntemplate<> EIGEN_STRONG_INLINE void pstore<float>(float*   to, const Packet4f& from) { EIGEN_DEBUG_ALIGNED_STORE vst1q_f32(to, from); }\ntemplate<> EIGEN_STRONG_INLINE void pstore<int>(int*       to, const Packet4i& from) { EIGEN_DEBUG_ALIGNED_STORE vst1q_s32(to, from); }\n\ntemplate<> EIGEN_STRONG_INLINE void pstoreu<float>(float*  to, const Packet4f& from) { EIGEN_DEBUG_UNALIGNED_STORE vst1q_f32(to, from); }\ntemplate<> EIGEN_STRONG_INLINE void pstoreu<int>(int*      to, const Packet4i& from) { EIGEN_DEBUG_UNALIGNED_STORE vst1q_s32(to, from); }\n\ntemplate<> EIGEN_STRONG_INLINE void prefetch<float>(const float* addr) { EIGEN_ARM_PREFETCH(addr); }\ntemplate<> EIGEN_STRONG_INLINE void prefetch<int>(const int*     addr) { EIGEN_ARM_PREFETCH(addr); }\n\n// FIXME only store the 2 first elements ?\ntemplate<> EIGEN_STRONG_INLINE float  pfirst<Packet4f>(const Packet4f& a) { float EIGEN_ALIGN16 x[4]; vst1q_f32(x, a); return x[0]; }\ntemplate<> EIGEN_STRONG_INLINE int    pfirst<Packet4i>(const Packet4i& a) { int   EIGEN_ALIGN16 x[4]; vst1q_s32(x, a); return x[0]; }\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f preverse(const Packet4f& a) {\n  float32x2_t a_lo, a_hi;\n  Packet4f a_r64;\n\n  a_r64 = vrev64q_f32(a);\n  a_lo = vget_low_f32(a_r64);\n  a_hi = vget_high_f32(a_r64);\n  return vcombine_f32(a_hi, a_lo);\n}\ntemplate<> EIGEN_STRONG_INLINE Packet4i preverse(const Packet4i& a) {\n  int32x2_t a_lo, a_hi;\n  Packet4i a_r64;\n\n  a_r64 = vrev64q_s32(a);\n  a_lo = vget_low_s32(a_r64);\n  a_hi = vget_high_s32(a_r64);\n  return vcombine_s32(a_hi, a_lo);\n}\ntemplate<> EIGEN_STRONG_INLINE Packet4f pabs(const Packet4f& a) { return vabsq_f32(a); }\ntemplate<> EIGEN_STRONG_INLINE Packet4i pabs(const Packet4i& a) { return vabsq_s32(a); }\n\ntemplate<> EIGEN_STRONG_INLINE float predux<Packet4f>(const Packet4f& a)\n{\n  float32x2_t a_lo, a_hi, sum;\n\n  a_lo = vget_low_f32(a);\n  a_hi = vget_high_f32(a);\n  sum = vpadd_f32(a_lo, a_hi);\n  sum = vpadd_f32(sum, sum);\n  return vget_lane_f32(sum, 0);\n}\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f preduxp<Packet4f>(const Packet4f* vecs)\n{\n  float32x4x2_t vtrn1, vtrn2, res1, res2;\n  Packet4f sum1, sum2, sum;\n\n  // NEON zip performs interleaving of the supplied vectors.\n  // We perform two interleaves in a row to acquire the transposed vector\n  vtrn1 = vzipq_f32(vecs[0], vecs[2]);\n  vtrn2 = vzipq_f32(vecs[1], vecs[3]);\n  res1 = vzipq_f32(vtrn1.val[0], vtrn2.val[0]);\n  res2 = vzipq_f32(vtrn1.val[1], vtrn2.val[1]);\n\n  // Do the addition of the resulting vectors\n  sum1 = vaddq_f32(res1.val[0], res1.val[1]);\n  sum2 = vaddq_f32(res2.val[0], res2.val[1]);\n  sum = vaddq_f32(sum1, sum2);\n\n  return sum;\n}\n\ntemplate<> EIGEN_STRONG_INLINE int predux<Packet4i>(const Packet4i& a)\n{\n  int32x2_t a_lo, a_hi, sum;\n\n  a_lo = vget_low_s32(a);\n  a_hi = vget_high_s32(a);\n  sum = vpadd_s32(a_lo, a_hi);\n  sum = vpadd_s32(sum, sum);\n  return vget_lane_s32(sum, 0);\n}\n\ntemplate<> EIGEN_STRONG_INLINE Packet4i preduxp<Packet4i>(const Packet4i* vecs)\n{\n  int32x4x2_t vtrn1, vtrn2, res1, res2;\n  Packet4i sum1, sum2, sum;\n\n  // NEON zip performs interleaving of the supplied vectors.\n  // We perform two interleaves in a row to acquire the transposed vector\n  vtrn1 = vzipq_s32(vecs[0], vecs[2]);\n  vtrn2 = vzipq_s32(vecs[1], vecs[3]);\n  res1 = vzipq_s32(vtrn1.val[0], vtrn2.val[0]);\n  res2 = vzipq_s32(vtrn1.val[1], vtrn2.val[1]);\n\n  // Do the addition of the resulting vectors\n  sum1 = vaddq_s32(res1.val[0], res1.val[1]);\n  sum2 = vaddq_s32(res2.val[0], res2.val[1]);\n  sum = vaddq_s32(sum1, sum2);\n\n  return sum;\n}\n\n// Other reduction functions:\n// mul\ntemplate<> EIGEN_STRONG_INLINE float predux_mul<Packet4f>(const Packet4f& a)\n{\n  float32x2_t a_lo, a_hi, prod;\n\n  // Get a_lo = |a1|a2| and a_hi = |a3|a4|\n  a_lo = vget_low_f32(a);\n  a_hi = vget_high_f32(a);\n  // Get the product of a_lo * a_hi -> |a1*a3|a2*a4|\n  prod = vmul_f32(a_lo, a_hi);\n  // Multiply prod with its swapped value |a2*a4|a1*a3|\n  prod = vmul_f32(prod, vrev64_f32(prod));\n\n  return vget_lane_f32(prod, 0);\n}\ntemplate<> EIGEN_STRONG_INLINE int predux_mul<Packet4i>(const Packet4i& a)\n{\n  int32x2_t a_lo, a_hi, prod;\n\n  // Get a_lo = |a1|a2| and a_hi = |a3|a4|\n  a_lo = vget_low_s32(a);\n  a_hi = vget_high_s32(a);\n  // Get the product of a_lo * a_hi -> |a1*a3|a2*a4|\n  prod = vmul_s32(a_lo, a_hi);\n  // Multiply prod with its swapped value |a2*a4|a1*a3|\n  prod = vmul_s32(prod, vrev64_s32(prod));\n\n  return vget_lane_s32(prod, 0);\n}\n\n// min\ntemplate<> EIGEN_STRONG_INLINE float predux_min<Packet4f>(const Packet4f& a)\n{\n  float32x2_t a_lo, a_hi, min;\n\n  a_lo = vget_low_f32(a);\n  a_hi = vget_high_f32(a);\n  min = vpmin_f32(a_lo, a_hi);\n  min = vpmin_f32(min, min);\n\n  return vget_lane_f32(min, 0);\n}\n\ntemplate<> EIGEN_STRONG_INLINE int predux_min<Packet4i>(const Packet4i& a)\n{\n  int32x2_t a_lo, a_hi, min;\n\n  a_lo = vget_low_s32(a);\n  a_hi = vget_high_s32(a);\n  min = vpmin_s32(a_lo, a_hi);\n  min = vpmin_s32(min, min);\n  \n  return vget_lane_s32(min, 0);\n}\n\n// max\ntemplate<> EIGEN_STRONG_INLINE float predux_max<Packet4f>(const Packet4f& a)\n{\n  float32x2_t a_lo, a_hi, max;\n\n  a_lo = vget_low_f32(a);\n  a_hi = vget_high_f32(a);\n  max = vpmax_f32(a_lo, a_hi);\n  max = vpmax_f32(max, max);\n\n  return vget_lane_f32(max, 0);\n}\n\ntemplate<> EIGEN_STRONG_INLINE int predux_max<Packet4i>(const Packet4i& a)\n{\n  int32x2_t a_lo, a_hi, max;\n\n  a_lo = vget_low_s32(a);\n  a_hi = vget_high_s32(a);\n  max = vpmax_s32(a_lo, a_hi);\n  max = vpmax_s32(max, max);\n\n  return vget_lane_s32(max, 0);\n}\n\n// this PALIGN_NEON business is to work around a bug in LLVM Clang 3.0 causing incorrect compilation errors,\n// see bug 347 and this LLVM bug: http://llvm.org/bugs/show_bug.cgi?id=11074\n#define PALIGN_NEON(Offset,Type,Command) \\\ntemplate<>\\\nstruct palign_impl<Offset,Type>\\\n{\\\n    EIGEN_STRONG_INLINE static void run(Type& first, const Type& second)\\\n    {\\\n        if (Offset!=0)\\\n            first = Command(first, second, Offset);\\\n    }\\\n};\\\n\nPALIGN_NEON(0,Packet4f,vextq_f32)\nPALIGN_NEON(1,Packet4f,vextq_f32)\nPALIGN_NEON(2,Packet4f,vextq_f32)\nPALIGN_NEON(3,Packet4f,vextq_f32)\nPALIGN_NEON(0,Packet4i,vextq_s32)\nPALIGN_NEON(1,Packet4i,vextq_s32)\nPALIGN_NEON(2,Packet4i,vextq_s32)\nPALIGN_NEON(3,Packet4i,vextq_s32)\n    \n#undef PALIGN_NEON\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_PACKET_MATH_NEON_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/arch/SSE/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_Core_arch_SSE_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_Core_arch_SSE_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/Core/arch/SSE COMPONENT Devel\n)\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/arch/SSE/Complex.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_COMPLEX_SSE_H\n#define EIGEN_COMPLEX_SSE_H\n\nnamespace Eigen {\n\nnamespace internal {\n\n//---------- float ----------\nstruct Packet2cf\n{\n  EIGEN_STRONG_INLINE Packet2cf() {}\n  EIGEN_STRONG_INLINE explicit Packet2cf(const __m128& a) : v(a) {}\n  __m128  v;\n};\n\ntemplate<> struct packet_traits<std::complex<float> >  : default_packet_traits\n{\n  typedef Packet2cf type;\n  enum {\n    Vectorizable = 1,\n    AlignedOnScalar = 1,\n    size = 2,\n\n    HasAdd    = 1,\n    HasSub    = 1,\n    HasMul    = 1,\n    HasDiv    = 1,\n    HasNegate = 1,\n    HasAbs    = 0,\n    HasAbs2   = 0,\n    HasMin    = 0,\n    HasMax    = 0,\n    HasSetLinear = 0\n  };\n};\n\ntemplate<> struct unpacket_traits<Packet2cf> { typedef std::complex<float> type; enum {size=2}; };\n\ntemplate<> EIGEN_STRONG_INLINE Packet2cf padd<Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(_mm_add_ps(a.v,b.v)); }\ntemplate<> EIGEN_STRONG_INLINE Packet2cf psub<Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(_mm_sub_ps(a.v,b.v)); }\ntemplate<> EIGEN_STRONG_INLINE Packet2cf pnegate(const Packet2cf& a)\n{\n  const __m128 mask = _mm_castsi128_ps(_mm_setr_epi32(0x80000000,0x80000000,0x80000000,0x80000000));\n  return Packet2cf(_mm_xor_ps(a.v,mask));\n}\ntemplate<> EIGEN_STRONG_INLINE Packet2cf pconj(const Packet2cf& a)\n{\n  const __m128 mask = _mm_castsi128_ps(_mm_setr_epi32(0x00000000,0x80000000,0x00000000,0x80000000));\n  return Packet2cf(_mm_xor_ps(a.v,mask));\n}\n\ntemplate<> EIGEN_STRONG_INLINE Packet2cf pmul<Packet2cf>(const Packet2cf& a, const Packet2cf& b)\n{\n  // TODO optimize it for SSE3 and 4\n  #ifdef EIGEN_VECTORIZE_SSE3\n  return Packet2cf(_mm_addsub_ps(_mm_mul_ps(_mm_moveldup_ps(a.v), b.v),\n                                 _mm_mul_ps(_mm_movehdup_ps(a.v),\n                                            vec4f_swizzle1(b.v, 1, 0, 3, 2))));\n//   return Packet2cf(_mm_addsub_ps(_mm_mul_ps(vec4f_swizzle1(a.v, 0, 0, 2, 2), b.v),\n//                                  _mm_mul_ps(vec4f_swizzle1(a.v, 1, 1, 3, 3),\n//                                             vec4f_swizzle1(b.v, 1, 0, 3, 2))));\n  #else\n  const __m128 mask = _mm_castsi128_ps(_mm_setr_epi32(0x80000000,0x00000000,0x80000000,0x00000000));\n  return Packet2cf(_mm_add_ps(_mm_mul_ps(vec4f_swizzle1(a.v, 0, 0, 2, 2), b.v),\n                              _mm_xor_ps(_mm_mul_ps(vec4f_swizzle1(a.v, 1, 1, 3, 3),\n                                                    vec4f_swizzle1(b.v, 1, 0, 3, 2)), mask)));\n  #endif\n}\n\ntemplate<> EIGEN_STRONG_INLINE Packet2cf pand   <Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(_mm_and_ps(a.v,b.v)); }\ntemplate<> EIGEN_STRONG_INLINE Packet2cf por    <Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(_mm_or_ps(a.v,b.v)); }\ntemplate<> EIGEN_STRONG_INLINE Packet2cf pxor   <Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(_mm_xor_ps(a.v,b.v)); }\ntemplate<> EIGEN_STRONG_INLINE Packet2cf pandnot<Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(_mm_andnot_ps(a.v,b.v)); }\n\ntemplate<> EIGEN_STRONG_INLINE Packet2cf pload <Packet2cf>(const std::complex<float>* from) { EIGEN_DEBUG_ALIGNED_LOAD return Packet2cf(pload<Packet4f>(&numext::real_ref(*from))); }\ntemplate<> EIGEN_STRONG_INLINE Packet2cf ploadu<Packet2cf>(const std::complex<float>* from) { EIGEN_DEBUG_UNALIGNED_LOAD return Packet2cf(ploadu<Packet4f>(&numext::real_ref(*from))); }\n\ntemplate<> EIGEN_STRONG_INLINE Packet2cf pset1<Packet2cf>(const std::complex<float>&  from)\n{\n  Packet2cf res;\n#if EIGEN_GNUC_AT_MOST(4,2)\n  // Workaround annoying \"may be used uninitialized in this function\" warning with gcc 4.2\n  res.v = _mm_loadl_pi(_mm_set1_ps(0.0f), reinterpret_cast<const __m64*>(&from));\n#elif EIGEN_GNUC_AT_LEAST(4,6)\n  // Suppress annoying \"may be used uninitialized in this function\" warning with gcc >= 4.6\n  #pragma GCC diagnostic push\n  #pragma GCC diagnostic ignored \"-Wuninitialized\"\n  res.v = _mm_loadl_pi(res.v, (const __m64*)&from);\n  #pragma GCC diagnostic pop\n#else\n  res.v = _mm_loadl_pi(res.v, (const __m64*)&from);\n#endif\n  return Packet2cf(_mm_movelh_ps(res.v,res.v));\n}\n\ntemplate<> EIGEN_STRONG_INLINE Packet2cf ploaddup<Packet2cf>(const std::complex<float>* from) { return pset1<Packet2cf>(*from); }\n\ntemplate<> EIGEN_STRONG_INLINE void pstore <std::complex<float> >(std::complex<float> *   to, const Packet2cf& from) { EIGEN_DEBUG_ALIGNED_STORE pstore(&numext::real_ref(*to), from.v); }\ntemplate<> EIGEN_STRONG_INLINE void pstoreu<std::complex<float> >(std::complex<float> *   to, const Packet2cf& from) { EIGEN_DEBUG_UNALIGNED_STORE pstoreu(&numext::real_ref(*to), from.v); }\n\ntemplate<> EIGEN_STRONG_INLINE void prefetch<std::complex<float> >(const std::complex<float> *   addr) { _mm_prefetch((const char*)(addr), _MM_HINT_T0); }\n\ntemplate<> EIGEN_STRONG_INLINE std::complex<float>  pfirst<Packet2cf>(const Packet2cf& a)\n{\n  #if EIGEN_GNUC_AT_MOST(4,3)\n  // Workaround gcc 4.2 ICE - this is not performance wise ideal, but who cares...\n  // This workaround also fix invalid code generation with gcc 4.3\n  EIGEN_ALIGN16 std::complex<float> res[2];\n  _mm_store_ps((float*)res, a.v);\n  return res[0];\n  #else\n  std::complex<float> res;\n  _mm_storel_pi((__m64*)&res, a.v);\n  return res;\n  #endif\n}\n\ntemplate<> EIGEN_STRONG_INLINE Packet2cf preverse(const Packet2cf& a) { return Packet2cf(_mm_castpd_ps(preverse(_mm_castps_pd(a.v)))); }\n\ntemplate<> EIGEN_STRONG_INLINE std::complex<float> predux<Packet2cf>(const Packet2cf& a)\n{\n  return pfirst(Packet2cf(_mm_add_ps(a.v, _mm_movehl_ps(a.v,a.v))));\n}\n\ntemplate<> EIGEN_STRONG_INLINE Packet2cf preduxp<Packet2cf>(const Packet2cf* vecs)\n{\n  return Packet2cf(_mm_add_ps(_mm_movelh_ps(vecs[0].v,vecs[1].v), _mm_movehl_ps(vecs[1].v,vecs[0].v)));\n}\n\ntemplate<> EIGEN_STRONG_INLINE std::complex<float> predux_mul<Packet2cf>(const Packet2cf& a)\n{\n  return pfirst(pmul(a, Packet2cf(_mm_movehl_ps(a.v,a.v))));\n}\n\ntemplate<int Offset>\nstruct palign_impl<Offset,Packet2cf>\n{\n  static EIGEN_STRONG_INLINE void run(Packet2cf& first, const Packet2cf& second)\n  {\n    if (Offset==1)\n    {\n      first.v = _mm_movehl_ps(first.v, first.v);\n      first.v = _mm_movelh_ps(first.v, second.v);\n    }\n  }\n};\n\ntemplate<> struct conj_helper<Packet2cf, Packet2cf, false,true>\n{\n  EIGEN_STRONG_INLINE Packet2cf pmadd(const Packet2cf& x, const Packet2cf& y, const Packet2cf& c) const\n  { return padd(pmul(x,y),c); }\n\n  EIGEN_STRONG_INLINE Packet2cf pmul(const Packet2cf& a, const Packet2cf& b) const\n  {\n    #ifdef EIGEN_VECTORIZE_SSE3\n    return internal::pmul(a, pconj(b));\n    #else\n    const __m128 mask = _mm_castsi128_ps(_mm_setr_epi32(0x00000000,0x80000000,0x00000000,0x80000000));\n    return Packet2cf(_mm_add_ps(_mm_xor_ps(_mm_mul_ps(vec4f_swizzle1(a.v, 0, 0, 2, 2), b.v), mask),\n                                _mm_mul_ps(vec4f_swizzle1(a.v, 1, 1, 3, 3),\n                                           vec4f_swizzle1(b.v, 1, 0, 3, 2))));\n    #endif\n  }\n};\n\ntemplate<> struct conj_helper<Packet2cf, Packet2cf, true,false>\n{\n  EIGEN_STRONG_INLINE Packet2cf pmadd(const Packet2cf& x, const Packet2cf& y, const Packet2cf& c) const\n  { return padd(pmul(x,y),c); }\n\n  EIGEN_STRONG_INLINE Packet2cf pmul(const Packet2cf& a, const Packet2cf& b) const\n  {\n    #ifdef EIGEN_VECTORIZE_SSE3\n    return internal::pmul(pconj(a), b);\n    #else\n    const __m128 mask = _mm_castsi128_ps(_mm_setr_epi32(0x00000000,0x80000000,0x00000000,0x80000000));\n    return Packet2cf(_mm_add_ps(_mm_mul_ps(vec4f_swizzle1(a.v, 0, 0, 2, 2), b.v),\n                                _mm_xor_ps(_mm_mul_ps(vec4f_swizzle1(a.v, 1, 1, 3, 3),\n                                                      vec4f_swizzle1(b.v, 1, 0, 3, 2)), mask)));\n    #endif\n  }\n};\n\ntemplate<> struct conj_helper<Packet2cf, Packet2cf, true,true>\n{\n  EIGEN_STRONG_INLINE Packet2cf pmadd(const Packet2cf& x, const Packet2cf& y, const Packet2cf& c) const\n  { return padd(pmul(x,y),c); }\n\n  EIGEN_STRONG_INLINE Packet2cf pmul(const Packet2cf& a, const Packet2cf& b) const\n  {\n    #ifdef EIGEN_VECTORIZE_SSE3\n    return pconj(internal::pmul(a, b));\n    #else\n    const __m128 mask = _mm_castsi128_ps(_mm_setr_epi32(0x00000000,0x80000000,0x00000000,0x80000000));\n    return Packet2cf(_mm_sub_ps(_mm_xor_ps(_mm_mul_ps(vec4f_swizzle1(a.v, 0, 0, 2, 2), b.v), mask),\n                                _mm_mul_ps(vec4f_swizzle1(a.v, 1, 1, 3, 3),\n                                           vec4f_swizzle1(b.v, 1, 0, 3, 2))));\n    #endif\n  }\n};\n\ntemplate<> struct conj_helper<Packet4f, Packet2cf, false,false>\n{\n  EIGEN_STRONG_INLINE Packet2cf pmadd(const Packet4f& x, const Packet2cf& y, const Packet2cf& c) const\n  { return padd(c, pmul(x,y)); }\n\n  EIGEN_STRONG_INLINE Packet2cf pmul(const Packet4f& x, const Packet2cf& y) const\n  { return Packet2cf(Eigen::internal::pmul(x, y.v)); }\n};\n\ntemplate<> struct conj_helper<Packet2cf, Packet4f, false,false>\n{\n  EIGEN_STRONG_INLINE Packet2cf pmadd(const Packet2cf& x, const Packet4f& y, const Packet2cf& c) const\n  { return padd(c, pmul(x,y)); }\n\n  EIGEN_STRONG_INLINE Packet2cf pmul(const Packet2cf& x, const Packet4f& y) const\n  { return Packet2cf(Eigen::internal::pmul(x.v, y)); }\n};\n\ntemplate<> EIGEN_STRONG_INLINE Packet2cf pdiv<Packet2cf>(const Packet2cf& a, const Packet2cf& b)\n{\n  // TODO optimize it for SSE3 and 4\n  Packet2cf res = conj_helper<Packet2cf,Packet2cf,false,true>().pmul(a,b);\n  __m128 s = _mm_mul_ps(b.v,b.v);\n  return Packet2cf(_mm_div_ps(res.v,_mm_add_ps(s,_mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(s), 0xb1)))));\n}\n\nEIGEN_STRONG_INLINE Packet2cf pcplxflip/*<Packet2cf>*/(const Packet2cf& x)\n{\n  return Packet2cf(vec4f_swizzle1(x.v, 1, 0, 3, 2));\n}\n\n\n//---------- double ----------\nstruct Packet1cd\n{\n  EIGEN_STRONG_INLINE Packet1cd() {}\n  EIGEN_STRONG_INLINE explicit Packet1cd(const __m128d& a) : v(a) {}\n  __m128d  v;\n};\n\ntemplate<> struct packet_traits<std::complex<double> >  : default_packet_traits\n{\n  typedef Packet1cd type;\n  enum {\n    Vectorizable = 1,\n    AlignedOnScalar = 0,\n    size = 1,\n\n    HasAdd    = 1,\n    HasSub    = 1,\n    HasMul    = 1,\n    HasDiv    = 1,\n    HasNegate = 1,\n    HasAbs    = 0,\n    HasAbs2   = 0,\n    HasMin    = 0,\n    HasMax    = 0,\n    HasSetLinear = 0\n  };\n};\n\ntemplate<> struct unpacket_traits<Packet1cd> { typedef std::complex<double> type; enum {size=1}; };\n\ntemplate<> EIGEN_STRONG_INLINE Packet1cd padd<Packet1cd>(const Packet1cd& a, const Packet1cd& b) { return Packet1cd(_mm_add_pd(a.v,b.v)); }\ntemplate<> EIGEN_STRONG_INLINE Packet1cd psub<Packet1cd>(const Packet1cd& a, const Packet1cd& b) { return Packet1cd(_mm_sub_pd(a.v,b.v)); }\ntemplate<> EIGEN_STRONG_INLINE Packet1cd pnegate(const Packet1cd& a) { return Packet1cd(pnegate(a.v)); }\ntemplate<> EIGEN_STRONG_INLINE Packet1cd pconj(const Packet1cd& a)\n{\n  const __m128d mask = _mm_castsi128_pd(_mm_set_epi32(0x80000000,0x0,0x0,0x0));\n  return Packet1cd(_mm_xor_pd(a.v,mask));\n}\n\ntemplate<> EIGEN_STRONG_INLINE Packet1cd pmul<Packet1cd>(const Packet1cd& a, const Packet1cd& b)\n{\n  // TODO optimize it for SSE3 and 4\n  #ifdef EIGEN_VECTORIZE_SSE3\n  return Packet1cd(_mm_addsub_pd(_mm_mul_pd(vec2d_swizzle1(a.v, 0, 0), b.v),\n                                 _mm_mul_pd(vec2d_swizzle1(a.v, 1, 1),\n                                            vec2d_swizzle1(b.v, 1, 0))));\n  #else\n  const __m128d mask = _mm_castsi128_pd(_mm_set_epi32(0x0,0x0,0x80000000,0x0));\n  return Packet1cd(_mm_add_pd(_mm_mul_pd(vec2d_swizzle1(a.v, 0, 0), b.v),\n                              _mm_xor_pd(_mm_mul_pd(vec2d_swizzle1(a.v, 1, 1),\n                                                    vec2d_swizzle1(b.v, 1, 0)), mask)));\n  #endif\n}\n\ntemplate<> EIGEN_STRONG_INLINE Packet1cd pand   <Packet1cd>(const Packet1cd& a, const Packet1cd& b) { return Packet1cd(_mm_and_pd(a.v,b.v)); }\ntemplate<> EIGEN_STRONG_INLINE Packet1cd por    <Packet1cd>(const Packet1cd& a, const Packet1cd& b) { return Packet1cd(_mm_or_pd(a.v,b.v)); }\ntemplate<> EIGEN_STRONG_INLINE Packet1cd pxor   <Packet1cd>(const Packet1cd& a, const Packet1cd& b) { return Packet1cd(_mm_xor_pd(a.v,b.v)); }\ntemplate<> EIGEN_STRONG_INLINE Packet1cd pandnot<Packet1cd>(const Packet1cd& a, const Packet1cd& b) { return Packet1cd(_mm_andnot_pd(a.v,b.v)); }\n\n// FIXME force unaligned load, this is a temporary fix\ntemplate<> EIGEN_STRONG_INLINE Packet1cd pload <Packet1cd>(const std::complex<double>* from)\n{ EIGEN_DEBUG_ALIGNED_LOAD return Packet1cd(pload<Packet2d>((const double*)from)); }\ntemplate<> EIGEN_STRONG_INLINE Packet1cd ploadu<Packet1cd>(const std::complex<double>* from)\n{ EIGEN_DEBUG_UNALIGNED_LOAD return Packet1cd(ploadu<Packet2d>((const double*)from)); }\ntemplate<> EIGEN_STRONG_INLINE Packet1cd pset1<Packet1cd>(const std::complex<double>&  from)\n{ /* here we really have to use unaligned loads :( */ return ploadu<Packet1cd>(&from); }\n\ntemplate<> EIGEN_STRONG_INLINE Packet1cd ploaddup<Packet1cd>(const std::complex<double>* from) { return pset1<Packet1cd>(*from); }\n\n// FIXME force unaligned store, this is a temporary fix\ntemplate<> EIGEN_STRONG_INLINE void pstore <std::complex<double> >(std::complex<double> *   to, const Packet1cd& from) { EIGEN_DEBUG_ALIGNED_STORE pstore((double*)to, from.v); }\ntemplate<> EIGEN_STRONG_INLINE void pstoreu<std::complex<double> >(std::complex<double> *   to, const Packet1cd& from) { EIGEN_DEBUG_UNALIGNED_STORE pstoreu((double*)to, from.v); }\n\ntemplate<> EIGEN_STRONG_INLINE void prefetch<std::complex<double> >(const std::complex<double> *   addr) { _mm_prefetch((const char*)(addr), _MM_HINT_T0); }\n\ntemplate<> EIGEN_STRONG_INLINE std::complex<double>  pfirst<Packet1cd>(const Packet1cd& a)\n{\n  EIGEN_ALIGN16 double res[2];\n  _mm_store_pd(res, a.v);\n  return std::complex<double>(res[0],res[1]);\n}\n\ntemplate<> EIGEN_STRONG_INLINE Packet1cd preverse(const Packet1cd& a) { return a; }\n\ntemplate<> EIGEN_STRONG_INLINE std::complex<double> predux<Packet1cd>(const Packet1cd& a)\n{\n  return pfirst(a);\n}\n\ntemplate<> EIGEN_STRONG_INLINE Packet1cd preduxp<Packet1cd>(const Packet1cd* vecs)\n{\n  return vecs[0];\n}\n\ntemplate<> EIGEN_STRONG_INLINE std::complex<double> predux_mul<Packet1cd>(const Packet1cd& a)\n{\n  return pfirst(a);\n}\n\ntemplate<int Offset>\nstruct palign_impl<Offset,Packet1cd>\n{\n  static EIGEN_STRONG_INLINE void run(Packet1cd& /*first*/, const Packet1cd& /*second*/)\n  {\n    // FIXME is it sure we never have to align a Packet1cd?\n    // Even though a std::complex<double> has 16 bytes, it is not necessarily aligned on a 16 bytes boundary...\n  }\n};\n\ntemplate<> struct conj_helper<Packet1cd, Packet1cd, false,true>\n{\n  EIGEN_STRONG_INLINE Packet1cd pmadd(const Packet1cd& x, const Packet1cd& y, const Packet1cd& c) const\n  { return padd(pmul(x,y),c); }\n\n  EIGEN_STRONG_INLINE Packet1cd pmul(const Packet1cd& a, const Packet1cd& b) const\n  {\n    #ifdef EIGEN_VECTORIZE_SSE3\n    return internal::pmul(a, pconj(b));\n    #else\n    const __m128d mask = _mm_castsi128_pd(_mm_set_epi32(0x80000000,0x0,0x0,0x0));\n    return Packet1cd(_mm_add_pd(_mm_xor_pd(_mm_mul_pd(vec2d_swizzle1(a.v, 0, 0), b.v), mask),\n                                _mm_mul_pd(vec2d_swizzle1(a.v, 1, 1),\n                                           vec2d_swizzle1(b.v, 1, 0))));\n    #endif\n  }\n};\n\ntemplate<> struct conj_helper<Packet1cd, Packet1cd, true,false>\n{\n  EIGEN_STRONG_INLINE Packet1cd pmadd(const Packet1cd& x, const Packet1cd& y, const Packet1cd& c) const\n  { return padd(pmul(x,y),c); }\n\n  EIGEN_STRONG_INLINE Packet1cd pmul(const Packet1cd& a, const Packet1cd& b) const\n  {\n    #ifdef EIGEN_VECTORIZE_SSE3\n    return internal::pmul(pconj(a), b);\n    #else\n    const __m128d mask = _mm_castsi128_pd(_mm_set_epi32(0x80000000,0x0,0x0,0x0));\n    return Packet1cd(_mm_add_pd(_mm_mul_pd(vec2d_swizzle1(a.v, 0, 0), b.v),\n                                _mm_xor_pd(_mm_mul_pd(vec2d_swizzle1(a.v, 1, 1),\n                                                      vec2d_swizzle1(b.v, 1, 0)), mask)));\n    #endif\n  }\n};\n\ntemplate<> struct conj_helper<Packet1cd, Packet1cd, true,true>\n{\n  EIGEN_STRONG_INLINE Packet1cd pmadd(const Packet1cd& x, const Packet1cd& y, const Packet1cd& c) const\n  { return padd(pmul(x,y),c); }\n\n  EIGEN_STRONG_INLINE Packet1cd pmul(const Packet1cd& a, const Packet1cd& b) const\n  {\n    #ifdef EIGEN_VECTORIZE_SSE3\n    return pconj(internal::pmul(a, b));\n    #else\n    const __m128d mask = _mm_castsi128_pd(_mm_set_epi32(0x80000000,0x0,0x0,0x0));\n    return Packet1cd(_mm_sub_pd(_mm_xor_pd(_mm_mul_pd(vec2d_swizzle1(a.v, 0, 0), b.v), mask),\n                                _mm_mul_pd(vec2d_swizzle1(a.v, 1, 1),\n                                           vec2d_swizzle1(b.v, 1, 0))));\n    #endif\n  }\n};\n\ntemplate<> struct conj_helper<Packet2d, Packet1cd, false,false>\n{\n  EIGEN_STRONG_INLINE Packet1cd pmadd(const Packet2d& x, const Packet1cd& y, const Packet1cd& c) const\n  { return padd(c, pmul(x,y)); }\n\n  EIGEN_STRONG_INLINE Packet1cd pmul(const Packet2d& x, const Packet1cd& y) const\n  { return Packet1cd(Eigen::internal::pmul(x, y.v)); }\n};\n\ntemplate<> struct conj_helper<Packet1cd, Packet2d, false,false>\n{\n  EIGEN_STRONG_INLINE Packet1cd pmadd(const Packet1cd& x, const Packet2d& y, const Packet1cd& c) const\n  { return padd(c, pmul(x,y)); }\n\n  EIGEN_STRONG_INLINE Packet1cd pmul(const Packet1cd& x, const Packet2d& y) const\n  { return Packet1cd(Eigen::internal::pmul(x.v, y)); }\n};\n\ntemplate<> EIGEN_STRONG_INLINE Packet1cd pdiv<Packet1cd>(const Packet1cd& a, const Packet1cd& b)\n{\n  // TODO optimize it for SSE3 and 4\n  Packet1cd res = conj_helper<Packet1cd,Packet1cd,false,true>().pmul(a,b);\n  __m128d s = _mm_mul_pd(b.v,b.v);\n  return Packet1cd(_mm_div_pd(res.v, _mm_add_pd(s,_mm_shuffle_pd(s, s, 0x1))));\n}\n\nEIGEN_STRONG_INLINE Packet1cd pcplxflip/*<Packet1cd>*/(const Packet1cd& x)\n{\n  return Packet1cd(preverse(x.v));\n}\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_COMPLEX_SSE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/arch/SSE/MathFunctions.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2007 Julien Pommier\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n/* The sin, cos, exp, and log functions of this file come from\n * Julien Pommier's sse math library: http://gruntthepeon.free.fr/ssemath/\n */\n\n#ifndef EIGEN_MATH_FUNCTIONS_SSE_H\n#define EIGEN_MATH_FUNCTIONS_SSE_H\n\nnamespace Eigen {\n\nnamespace internal {\n\ntemplate<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED\nPacket4f plog<Packet4f>(const Packet4f& _x)\n{\n  Packet4f x = _x;\n  _EIGEN_DECLARE_CONST_Packet4f(1 , 1.0f);\n  _EIGEN_DECLARE_CONST_Packet4f(half, 0.5f);\n  _EIGEN_DECLARE_CONST_Packet4i(0x7f, 0x7f);\n\n  _EIGEN_DECLARE_CONST_Packet4f_FROM_INT(inv_mant_mask, ~0x7f800000);\n\n  /* the smallest non denormalized float number */\n  _EIGEN_DECLARE_CONST_Packet4f_FROM_INT(min_norm_pos,  0x00800000);\n  _EIGEN_DECLARE_CONST_Packet4f_FROM_INT(minus_inf,     0xff800000);//-1.f/0.f);\n  \n  /* natural logarithm computed for 4 simultaneous float\n    return NaN for x <= 0\n  */\n  _EIGEN_DECLARE_CONST_Packet4f(cephes_SQRTHF, 0.707106781186547524f);\n  _EIGEN_DECLARE_CONST_Packet4f(cephes_log_p0, 7.0376836292E-2f);\n  _EIGEN_DECLARE_CONST_Packet4f(cephes_log_p1, - 1.1514610310E-1f);\n  _EIGEN_DECLARE_CONST_Packet4f(cephes_log_p2, 1.1676998740E-1f);\n  _EIGEN_DECLARE_CONST_Packet4f(cephes_log_p3, - 1.2420140846E-1f);\n  _EIGEN_DECLARE_CONST_Packet4f(cephes_log_p4, + 1.4249322787E-1f);\n  _EIGEN_DECLARE_CONST_Packet4f(cephes_log_p5, - 1.6668057665E-1f);\n  _EIGEN_DECLARE_CONST_Packet4f(cephes_log_p6, + 2.0000714765E-1f);\n  _EIGEN_DECLARE_CONST_Packet4f(cephes_log_p7, - 2.4999993993E-1f);\n  _EIGEN_DECLARE_CONST_Packet4f(cephes_log_p8, + 3.3333331174E-1f);\n  _EIGEN_DECLARE_CONST_Packet4f(cephes_log_q1, -2.12194440e-4f);\n  _EIGEN_DECLARE_CONST_Packet4f(cephes_log_q2, 0.693359375f);\n\n\n  Packet4i emm0;\n\n  Packet4f invalid_mask = _mm_cmpnge_ps(x, _mm_setzero_ps()); // not greater equal is true if x is NaN\n  Packet4f iszero_mask = _mm_cmpeq_ps(x, _mm_setzero_ps());\n\n  x = pmax(x, p4f_min_norm_pos);  /* cut off denormalized stuff */\n  emm0 = _mm_srli_epi32(_mm_castps_si128(x), 23);\n\n  /* keep only the fractional part */\n  x = _mm_and_ps(x, p4f_inv_mant_mask);\n  x = _mm_or_ps(x, p4f_half);\n\n  emm0 = _mm_sub_epi32(emm0, p4i_0x7f);\n  Packet4f e = padd(_mm_cvtepi32_ps(emm0), p4f_1);\n\n  /* part2:\n     if( x < SQRTHF ) {\n       e -= 1;\n       x = x + x - 1.0;\n     } else { x = x - 1.0; }\n  */\n  Packet4f mask = _mm_cmplt_ps(x, p4f_cephes_SQRTHF);\n  Packet4f tmp = _mm_and_ps(x, mask);\n  x = psub(x, p4f_1);\n  e = psub(e, _mm_and_ps(p4f_1, mask));\n  x = padd(x, tmp);\n\n  Packet4f x2 = pmul(x,x);\n  Packet4f x3 = pmul(x2,x);\n\n  Packet4f y, y1, y2;\n  y  = pmadd(p4f_cephes_log_p0, x, p4f_cephes_log_p1);\n  y1 = pmadd(p4f_cephes_log_p3, x, p4f_cephes_log_p4);\n  y2 = pmadd(p4f_cephes_log_p6, x, p4f_cephes_log_p7);\n  y  = pmadd(y , x, p4f_cephes_log_p2);\n  y1 = pmadd(y1, x, p4f_cephes_log_p5);\n  y2 = pmadd(y2, x, p4f_cephes_log_p8);\n  y = pmadd(y, x3, y1);\n  y = pmadd(y, x3, y2);\n  y = pmul(y, x3);\n\n  y1 = pmul(e, p4f_cephes_log_q1);\n  tmp = pmul(x2, p4f_half);\n  y = padd(y, y1);\n  x = psub(x, tmp);\n  y2 = pmul(e, p4f_cephes_log_q2);\n  x = padd(x, y);\n  x = padd(x, y2);\n  // negative arg will be NAN, 0 will be -INF\n  return _mm_or_ps(_mm_andnot_ps(iszero_mask, _mm_or_ps(x, invalid_mask)),\n                   _mm_and_ps(iszero_mask, p4f_minus_inf));\n}\n\ntemplate<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED\nPacket4f pexp<Packet4f>(const Packet4f& _x)\n{\n  Packet4f x = _x;\n  _EIGEN_DECLARE_CONST_Packet4f(1 , 1.0f);\n  _EIGEN_DECLARE_CONST_Packet4f(half, 0.5f);\n  _EIGEN_DECLARE_CONST_Packet4i(0x7f, 0x7f);\n\n\n  _EIGEN_DECLARE_CONST_Packet4f(exp_hi,  88.3762626647950f);\n  _EIGEN_DECLARE_CONST_Packet4f(exp_lo, -88.3762626647949f);\n\n  _EIGEN_DECLARE_CONST_Packet4f(cephes_LOG2EF, 1.44269504088896341f);\n  _EIGEN_DECLARE_CONST_Packet4f(cephes_exp_C1, 0.693359375f);\n  _EIGEN_DECLARE_CONST_Packet4f(cephes_exp_C2, -2.12194440e-4f);\n\n  _EIGEN_DECLARE_CONST_Packet4f(cephes_exp_p0, 1.9875691500E-4f);\n  _EIGEN_DECLARE_CONST_Packet4f(cephes_exp_p1, 1.3981999507E-3f);\n  _EIGEN_DECLARE_CONST_Packet4f(cephes_exp_p2, 8.3334519073E-3f);\n  _EIGEN_DECLARE_CONST_Packet4f(cephes_exp_p3, 4.1665795894E-2f);\n  _EIGEN_DECLARE_CONST_Packet4f(cephes_exp_p4, 1.6666665459E-1f);\n  _EIGEN_DECLARE_CONST_Packet4f(cephes_exp_p5, 5.0000001201E-1f);\n\n  Packet4f tmp, fx;\n  Packet4i emm0;\n\n  // clamp x\n  x = pmax(pmin(x, p4f_exp_hi), p4f_exp_lo);\n\n  /* express exp(x) as exp(g + n*log(2)) */\n  fx = pmadd(x, p4f_cephes_LOG2EF, p4f_half);\n\n#ifdef EIGEN_VECTORIZE_SSE4_1\n  fx = _mm_floor_ps(fx);\n#else\n  emm0 = _mm_cvttps_epi32(fx);\n  tmp  = _mm_cvtepi32_ps(emm0);\n  /* if greater, substract 1 */\n  Packet4f mask = _mm_cmpgt_ps(tmp, fx);\n  mask = _mm_and_ps(mask, p4f_1);\n  fx = psub(tmp, mask);\n#endif\n\n  tmp = pmul(fx, p4f_cephes_exp_C1);\n  Packet4f z = pmul(fx, p4f_cephes_exp_C2);\n  x = psub(x, tmp);\n  x = psub(x, z);\n\n  z = pmul(x,x);\n\n  Packet4f y = p4f_cephes_exp_p0;\n  y = pmadd(y, x, p4f_cephes_exp_p1);\n  y = pmadd(y, x, p4f_cephes_exp_p2);\n  y = pmadd(y, x, p4f_cephes_exp_p3);\n  y = pmadd(y, x, p4f_cephes_exp_p4);\n  y = pmadd(y, x, p4f_cephes_exp_p5);\n  y = pmadd(y, z, x);\n  y = padd(y, p4f_1);\n\n  // build 2^n\n  emm0 = _mm_cvttps_epi32(fx);\n  emm0 = _mm_add_epi32(emm0, p4i_0x7f);\n  emm0 = _mm_slli_epi32(emm0, 23);\n  return pmax(pmul(y, Packet4f(_mm_castsi128_ps(emm0))), _x);\n}\ntemplate<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED\nPacket2d pexp<Packet2d>(const Packet2d& _x)\n{\n  Packet2d x = _x;\n\n  _EIGEN_DECLARE_CONST_Packet2d(1 , 1.0);\n  _EIGEN_DECLARE_CONST_Packet2d(2 , 2.0);\n  _EIGEN_DECLARE_CONST_Packet2d(half, 0.5);\n\n  _EIGEN_DECLARE_CONST_Packet2d(exp_hi,  709.437);\n  _EIGEN_DECLARE_CONST_Packet2d(exp_lo, -709.436139303);\n\n  _EIGEN_DECLARE_CONST_Packet2d(cephes_LOG2EF, 1.4426950408889634073599);\n\n  _EIGEN_DECLARE_CONST_Packet2d(cephes_exp_p0, 1.26177193074810590878e-4);\n  _EIGEN_DECLARE_CONST_Packet2d(cephes_exp_p1, 3.02994407707441961300e-2);\n  _EIGEN_DECLARE_CONST_Packet2d(cephes_exp_p2, 9.99999999999999999910e-1);\n\n  _EIGEN_DECLARE_CONST_Packet2d(cephes_exp_q0, 3.00198505138664455042e-6);\n  _EIGEN_DECLARE_CONST_Packet2d(cephes_exp_q1, 2.52448340349684104192e-3);\n  _EIGEN_DECLARE_CONST_Packet2d(cephes_exp_q2, 2.27265548208155028766e-1);\n  _EIGEN_DECLARE_CONST_Packet2d(cephes_exp_q3, 2.00000000000000000009e0);\n\n  _EIGEN_DECLARE_CONST_Packet2d(cephes_exp_C1, 0.693145751953125);\n  _EIGEN_DECLARE_CONST_Packet2d(cephes_exp_C2, 1.42860682030941723212e-6);\n  static const __m128i p4i_1023_0 = _mm_setr_epi32(1023, 1023, 0, 0);\n\n  Packet2d tmp, fx;\n  Packet4i emm0;\n\n  // clamp x\n  x = pmax(pmin(x, p2d_exp_hi), p2d_exp_lo);\n  /* express exp(x) as exp(g + n*log(2)) */\n  fx = pmadd(p2d_cephes_LOG2EF, x, p2d_half);\n\n#ifdef EIGEN_VECTORIZE_SSE4_1\n  fx = _mm_floor_pd(fx);\n#else\n  emm0 = _mm_cvttpd_epi32(fx);\n  tmp  = _mm_cvtepi32_pd(emm0);\n  /* if greater, substract 1 */\n  Packet2d mask = _mm_cmpgt_pd(tmp, fx);\n  mask = _mm_and_pd(mask, p2d_1);\n  fx = psub(tmp, mask);\n#endif\n\n  tmp = pmul(fx, p2d_cephes_exp_C1);\n  Packet2d z = pmul(fx, p2d_cephes_exp_C2);\n  x = psub(x, tmp);\n  x = psub(x, z);\n\n  Packet2d x2 = pmul(x,x);\n\n  Packet2d px = p2d_cephes_exp_p0;\n  px = pmadd(px, x2, p2d_cephes_exp_p1);\n  px = pmadd(px, x2, p2d_cephes_exp_p2);\n  px = pmul (px, x);\n\n  Packet2d qx = p2d_cephes_exp_q0;\n  qx = pmadd(qx, x2, p2d_cephes_exp_q1);\n  qx = pmadd(qx, x2, p2d_cephes_exp_q2);\n  qx = pmadd(qx, x2, p2d_cephes_exp_q3);\n\n  x = pdiv(px,psub(qx,px));\n  x = pmadd(p2d_2,x,p2d_1);\n\n  // build 2^n\n  emm0 = _mm_cvttpd_epi32(fx);\n  emm0 = _mm_add_epi32(emm0, p4i_1023_0);\n  emm0 = _mm_slli_epi32(emm0, 20);\n  emm0 = _mm_shuffle_epi32(emm0, _MM_SHUFFLE(1,2,0,3));\n  return pmax(pmul(x, Packet2d(_mm_castsi128_pd(emm0))), _x);\n}\n\n/* evaluation of 4 sines at onces, using SSE2 intrinsics.\n\n   The code is the exact rewriting of the cephes sinf function.\n   Precision is excellent as long as x < 8192 (I did not bother to\n   take into account the special handling they have for greater values\n   -- it does not return garbage for arguments over 8192, though, but\n   the extra precision is missing).\n\n   Note that it is such that sinf((float)M_PI) = 8.74e-8, which is the\n   surprising but correct result.\n*/\n\ntemplate<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED\nPacket4f psin<Packet4f>(const Packet4f& _x)\n{\n  Packet4f x = _x;\n  _EIGEN_DECLARE_CONST_Packet4f(1 , 1.0f);\n  _EIGEN_DECLARE_CONST_Packet4f(half, 0.5f);\n\n  _EIGEN_DECLARE_CONST_Packet4i(1, 1);\n  _EIGEN_DECLARE_CONST_Packet4i(not1, ~1);\n  _EIGEN_DECLARE_CONST_Packet4i(2, 2);\n  _EIGEN_DECLARE_CONST_Packet4i(4, 4);\n\n  _EIGEN_DECLARE_CONST_Packet4f_FROM_INT(sign_mask, 0x80000000);\n\n  _EIGEN_DECLARE_CONST_Packet4f(minus_cephes_DP1,-0.78515625f);\n  _EIGEN_DECLARE_CONST_Packet4f(minus_cephes_DP2, -2.4187564849853515625e-4f);\n  _EIGEN_DECLARE_CONST_Packet4f(minus_cephes_DP3, -3.77489497744594108e-8f);\n  _EIGEN_DECLARE_CONST_Packet4f(sincof_p0, -1.9515295891E-4f);\n  _EIGEN_DECLARE_CONST_Packet4f(sincof_p1,  8.3321608736E-3f);\n  _EIGEN_DECLARE_CONST_Packet4f(sincof_p2, -1.6666654611E-1f);\n  _EIGEN_DECLARE_CONST_Packet4f(coscof_p0,  2.443315711809948E-005f);\n  _EIGEN_DECLARE_CONST_Packet4f(coscof_p1, -1.388731625493765E-003f);\n  _EIGEN_DECLARE_CONST_Packet4f(coscof_p2,  4.166664568298827E-002f);\n  _EIGEN_DECLARE_CONST_Packet4f(cephes_FOPI, 1.27323954473516f); // 4 / M_PI\n\n  Packet4f xmm1, xmm2, xmm3, sign_bit, y;\n\n  Packet4i emm0, emm2;\n  sign_bit = x;\n  /* take the absolute value */\n  x = pabs(x);\n\n  /* take the modulo */\n\n  /* extract the sign bit (upper one) */\n  sign_bit = _mm_and_ps(sign_bit, p4f_sign_mask);\n\n  /* scale by 4/Pi */\n  y = pmul(x, p4f_cephes_FOPI);\n\n  /* store the integer part of y in mm0 */\n  emm2 = _mm_cvttps_epi32(y);\n  /* j=(j+1) & (~1) (see the cephes sources) */\n  emm2 = _mm_add_epi32(emm2, p4i_1);\n  emm2 = _mm_and_si128(emm2, p4i_not1);\n  y = _mm_cvtepi32_ps(emm2);\n  /* get the swap sign flag */\n  emm0 = _mm_and_si128(emm2, p4i_4);\n  emm0 = _mm_slli_epi32(emm0, 29);\n  /* get the polynom selection mask\n     there is one polynom for 0 <= x <= Pi/4\n     and another one for Pi/4<x<=Pi/2\n\n     Both branches will be computed.\n  */\n  emm2 = _mm_and_si128(emm2, p4i_2);\n  emm2 = _mm_cmpeq_epi32(emm2, _mm_setzero_si128());\n\n  Packet4f swap_sign_bit = _mm_castsi128_ps(emm0);\n  Packet4f poly_mask = _mm_castsi128_ps(emm2);\n  sign_bit = _mm_xor_ps(sign_bit, swap_sign_bit);\n\n  /* The magic pass: \"Extended precision modular arithmetic\"\n     x = ((x - y * DP1) - y * DP2) - y * DP3; */\n  xmm1 = pmul(y, p4f_minus_cephes_DP1);\n  xmm2 = pmul(y, p4f_minus_cephes_DP2);\n  xmm3 = pmul(y, p4f_minus_cephes_DP3);\n  x = padd(x, xmm1);\n  x = padd(x, xmm2);\n  x = padd(x, xmm3);\n\n  /* Evaluate the first polynom  (0 <= x <= Pi/4) */\n  y = p4f_coscof_p0;\n  Packet4f z = _mm_mul_ps(x,x);\n\n  y = pmadd(y, z, p4f_coscof_p1);\n  y = pmadd(y, z, p4f_coscof_p2);\n  y = pmul(y, z);\n  y = pmul(y, z);\n  Packet4f tmp = pmul(z, p4f_half);\n  y = psub(y, tmp);\n  y = padd(y, p4f_1);\n\n  /* Evaluate the second polynom  (Pi/4 <= x <= 0) */\n\n  Packet4f y2 = p4f_sincof_p0;\n  y2 = pmadd(y2, z, p4f_sincof_p1);\n  y2 = pmadd(y2, z, p4f_sincof_p2);\n  y2 = pmul(y2, z);\n  y2 = pmul(y2, x);\n  y2 = padd(y2, x);\n\n  /* select the correct result from the two polynoms */\n  y2 = _mm_and_ps(poly_mask, y2);\n  y = _mm_andnot_ps(poly_mask, y);\n  y = _mm_or_ps(y,y2);\n  /* update the sign */\n  return _mm_xor_ps(y, sign_bit);\n}\n\n/* almost the same as psin */\ntemplate<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED\nPacket4f pcos<Packet4f>(const Packet4f& _x)\n{\n  Packet4f x = _x;\n  _EIGEN_DECLARE_CONST_Packet4f(1 , 1.0f);\n  _EIGEN_DECLARE_CONST_Packet4f(half, 0.5f);\n\n  _EIGEN_DECLARE_CONST_Packet4i(1, 1);\n  _EIGEN_DECLARE_CONST_Packet4i(not1, ~1);\n  _EIGEN_DECLARE_CONST_Packet4i(2, 2);\n  _EIGEN_DECLARE_CONST_Packet4i(4, 4);\n\n  _EIGEN_DECLARE_CONST_Packet4f(minus_cephes_DP1,-0.78515625f);\n  _EIGEN_DECLARE_CONST_Packet4f(minus_cephes_DP2, -2.4187564849853515625e-4f);\n  _EIGEN_DECLARE_CONST_Packet4f(minus_cephes_DP3, -3.77489497744594108e-8f);\n  _EIGEN_DECLARE_CONST_Packet4f(sincof_p0, -1.9515295891E-4f);\n  _EIGEN_DECLARE_CONST_Packet4f(sincof_p1,  8.3321608736E-3f);\n  _EIGEN_DECLARE_CONST_Packet4f(sincof_p2, -1.6666654611E-1f);\n  _EIGEN_DECLARE_CONST_Packet4f(coscof_p0,  2.443315711809948E-005f);\n  _EIGEN_DECLARE_CONST_Packet4f(coscof_p1, -1.388731625493765E-003f);\n  _EIGEN_DECLARE_CONST_Packet4f(coscof_p2,  4.166664568298827E-002f);\n  _EIGEN_DECLARE_CONST_Packet4f(cephes_FOPI, 1.27323954473516f); // 4 / M_PI\n\n  Packet4f xmm1, xmm2, xmm3, y;\n  Packet4i emm0, emm2;\n\n  x = pabs(x);\n\n  /* scale by 4/Pi */\n  y = pmul(x, p4f_cephes_FOPI);\n\n  /* get the integer part of y */\n  emm2 = _mm_cvttps_epi32(y);\n  /* j=(j+1) & (~1) (see the cephes sources) */\n  emm2 = _mm_add_epi32(emm2, p4i_1);\n  emm2 = _mm_and_si128(emm2, p4i_not1);\n  y = _mm_cvtepi32_ps(emm2);\n\n  emm2 = _mm_sub_epi32(emm2, p4i_2);\n\n  /* get the swap sign flag */\n  emm0 = _mm_andnot_si128(emm2, p4i_4);\n  emm0 = _mm_slli_epi32(emm0, 29);\n  /* get the polynom selection mask */\n  emm2 = _mm_and_si128(emm2, p4i_2);\n  emm2 = _mm_cmpeq_epi32(emm2, _mm_setzero_si128());\n\n  Packet4f sign_bit = _mm_castsi128_ps(emm0);\n  Packet4f poly_mask = _mm_castsi128_ps(emm2);\n\n  /* The magic pass: \"Extended precision modular arithmetic\"\n     x = ((x - y * DP1) - y * DP2) - y * DP3; */\n  xmm1 = pmul(y, p4f_minus_cephes_DP1);\n  xmm2 = pmul(y, p4f_minus_cephes_DP2);\n  xmm3 = pmul(y, p4f_minus_cephes_DP3);\n  x = padd(x, xmm1);\n  x = padd(x, xmm2);\n  x = padd(x, xmm3);\n\n  /* Evaluate the first polynom  (0 <= x <= Pi/4) */\n  y = p4f_coscof_p0;\n  Packet4f z = pmul(x,x);\n\n  y = pmadd(y,z,p4f_coscof_p1);\n  y = pmadd(y,z,p4f_coscof_p2);\n  y = pmul(y, z);\n  y = pmul(y, z);\n  Packet4f tmp = _mm_mul_ps(z, p4f_half);\n  y = psub(y, tmp);\n  y = padd(y, p4f_1);\n\n  /* Evaluate the second polynom  (Pi/4 <= x <= 0) */\n  Packet4f y2 = p4f_sincof_p0;\n  y2 = pmadd(y2, z, p4f_sincof_p1);\n  y2 = pmadd(y2, z, p4f_sincof_p2);\n  y2 = pmul(y2, z);\n  y2 = pmadd(y2, x, x);\n\n  /* select the correct result from the two polynoms */\n  y2 = _mm_and_ps(poly_mask, y2);\n  y  = _mm_andnot_ps(poly_mask, y);\n  y  = _mm_or_ps(y,y2);\n\n  /* update the sign */\n  return _mm_xor_ps(y, sign_bit);\n}\n\n#if EIGEN_FAST_MATH\n\n// This is based on Quake3's fast inverse square root.\n// For detail see here: http://www.beyond3d.com/content/articles/8/\n// It lacks 1 (or 2 bits in some rare cases) of precision, and does not handle negative, +inf, or denormalized numbers correctly.\ntemplate<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED\nPacket4f psqrt<Packet4f>(const Packet4f& _x)\n{\n  Packet4f half = pmul(_x, pset1<Packet4f>(.5f));\n\n  /* select only the inverse sqrt of non-zero inputs */\n  Packet4f non_zero_mask = _mm_cmpge_ps(_x, pset1<Packet4f>((std::numeric_limits<float>::min)()));\n  Packet4f x = _mm_and_ps(non_zero_mask, _mm_rsqrt_ps(_x));\n\n  x = pmul(x, psub(pset1<Packet4f>(1.5f), pmul(half, pmul(x,x))));\n  return pmul(_x,x);\n}\n\n#else\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f psqrt<Packet4f>(const Packet4f& x) { return _mm_sqrt_ps(x); }\n\n#endif\n\ntemplate<> EIGEN_STRONG_INLINE Packet2d psqrt<Packet2d>(const Packet2d& x) { return _mm_sqrt_pd(x); }\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_MATH_FUNCTIONS_SSE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/arch/SSE/PacketMath.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_PACKET_MATH_SSE_H\n#define EIGEN_PACKET_MATH_SSE_H\n\nnamespace Eigen {\n\nnamespace internal {\n\n#ifndef EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD\n#define EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD 8\n#endif\n\n#ifndef EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS\n#define EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS (2*sizeof(void*))\n#endif\n\ntypedef __m128  Packet4f;\ntypedef __m128i Packet4i;\ntypedef __m128d Packet2d;\n\ntemplate<> struct is_arithmetic<__m128>  { enum { value = true }; };\ntemplate<> struct is_arithmetic<__m128i> { enum { value = true }; };\ntemplate<> struct is_arithmetic<__m128d> { enum { value = true }; };\n\n#define vec4f_swizzle1(v,p,q,r,s) \\\n  (_mm_castsi128_ps(_mm_shuffle_epi32( _mm_castps_si128(v), ((s)<<6|(r)<<4|(q)<<2|(p)))))\n\n#define vec4i_swizzle1(v,p,q,r,s) \\\n  (_mm_shuffle_epi32( v, ((s)<<6|(r)<<4|(q)<<2|(p))))\n\n#define vec2d_swizzle1(v,p,q) \\\n  (_mm_castsi128_pd(_mm_shuffle_epi32( _mm_castpd_si128(v), ((q*2+1)<<6|(q*2)<<4|(p*2+1)<<2|(p*2)))))\n  \n#define vec4f_swizzle2(a,b,p,q,r,s) \\\n  (_mm_shuffle_ps( (a), (b), ((s)<<6|(r)<<4|(q)<<2|(p))))\n\n#define vec4i_swizzle2(a,b,p,q,r,s) \\\n  (_mm_castps_si128( (_mm_shuffle_ps( _mm_castsi128_ps(a), _mm_castsi128_ps(b), ((s)<<6|(r)<<4|(q)<<2|(p))))))\n\n#define _EIGEN_DECLARE_CONST_Packet4f(NAME,X) \\\n  const Packet4f p4f_##NAME = pset1<Packet4f>(X)\n\n#define _EIGEN_DECLARE_CONST_Packet2d(NAME,X) \\\n  const Packet2d p2d_##NAME = pset1<Packet2d>(X)\n\n#define _EIGEN_DECLARE_CONST_Packet4f_FROM_INT(NAME,X) \\\n  const Packet4f p4f_##NAME = _mm_castsi128_ps(pset1<Packet4i>(X))\n\n#define _EIGEN_DECLARE_CONST_Packet4i(NAME,X) \\\n  const Packet4i p4i_##NAME = pset1<Packet4i>(X)\n\n\ntemplate<> struct packet_traits<float>  : default_packet_traits\n{\n  typedef Packet4f type;\n  enum {\n    Vectorizable = 1,\n    AlignedOnScalar = 1,\n    size=4,\n\n    HasDiv  = 1,\n    HasSin  = EIGEN_FAST_MATH,\n    HasCos  = EIGEN_FAST_MATH,\n    HasLog  = 1,\n    HasExp  = 1,\n    HasSqrt = 1\n  };\n};\ntemplate<> struct packet_traits<double> : default_packet_traits\n{\n  typedef Packet2d type;\n  enum {\n    Vectorizable = 1,\n    AlignedOnScalar = 1,\n    size=2,\n\n    HasDiv  = 1,\n    HasExp  = 1,\n    HasSqrt = 1\n  };\n};\ntemplate<> struct packet_traits<int>    : default_packet_traits\n{\n  typedef Packet4i type;\n  enum {\n    // FIXME check the Has*\n    Vectorizable = 1,\n    AlignedOnScalar = 1,\n    size=4\n  };\n};\n\ntemplate<> struct unpacket_traits<Packet4f> { typedef float  type; enum {size=4}; };\ntemplate<> struct unpacket_traits<Packet2d> { typedef double type; enum {size=2}; };\ntemplate<> struct unpacket_traits<Packet4i> { typedef int    type; enum {size=4}; };\n\n#if defined(_MSC_VER) && (_MSC_VER==1500)\n// Workaround MSVC 9 internal compiler error.\n// TODO: It has been detected with win64 builds (amd64), so let's check whether it also happens in 32bits+SSE mode\n// TODO: let's check whether there does not exist a better fix, like adding a pset0() function. (it crashed on pset1(0)).\ntemplate<> EIGEN_STRONG_INLINE Packet4f pset1<Packet4f>(const float&  from) { return _mm_set_ps(from,from,from,from); }\ntemplate<> EIGEN_STRONG_INLINE Packet2d pset1<Packet2d>(const double& from) { return _mm_set_pd(from,from); }\ntemplate<> EIGEN_STRONG_INLINE Packet4i pset1<Packet4i>(const int&    from) { return _mm_set_epi32(from,from,from,from); }\n#else\ntemplate<> EIGEN_STRONG_INLINE Packet4f pset1<Packet4f>(const float&  from) { return _mm_set1_ps(from); }\ntemplate<> EIGEN_STRONG_INLINE Packet2d pset1<Packet2d>(const double& from) { return _mm_set1_pd(from); }\ntemplate<> EIGEN_STRONG_INLINE Packet4i pset1<Packet4i>(const int&    from) { return _mm_set1_epi32(from); }\n#endif\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f plset<float>(const float& a) { return _mm_add_ps(pset1<Packet4f>(a), _mm_set_ps(3,2,1,0)); }\ntemplate<> EIGEN_STRONG_INLINE Packet2d plset<double>(const double& a) { return _mm_add_pd(pset1<Packet2d>(a),_mm_set_pd(1,0)); }\ntemplate<> EIGEN_STRONG_INLINE Packet4i plset<int>(const int& a) { return _mm_add_epi32(pset1<Packet4i>(a),_mm_set_epi32(3,2,1,0)); }\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f padd<Packet4f>(const Packet4f& a, const Packet4f& b) { return _mm_add_ps(a,b); }\ntemplate<> EIGEN_STRONG_INLINE Packet2d padd<Packet2d>(const Packet2d& a, const Packet2d& b) { return _mm_add_pd(a,b); }\ntemplate<> EIGEN_STRONG_INLINE Packet4i padd<Packet4i>(const Packet4i& a, const Packet4i& b) { return _mm_add_epi32(a,b); }\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f psub<Packet4f>(const Packet4f& a, const Packet4f& b) { return _mm_sub_ps(a,b); }\ntemplate<> EIGEN_STRONG_INLINE Packet2d psub<Packet2d>(const Packet2d& a, const Packet2d& b) { return _mm_sub_pd(a,b); }\ntemplate<> EIGEN_STRONG_INLINE Packet4i psub<Packet4i>(const Packet4i& a, const Packet4i& b) { return _mm_sub_epi32(a,b); }\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f pnegate(const Packet4f& a)\n{\n  const Packet4f mask = _mm_castsi128_ps(_mm_setr_epi32(0x80000000,0x80000000,0x80000000,0x80000000));\n  return _mm_xor_ps(a,mask);\n}\ntemplate<> EIGEN_STRONG_INLINE Packet2d pnegate(const Packet2d& a)\n{\n  const Packet2d mask = _mm_castsi128_pd(_mm_setr_epi32(0x0,0x80000000,0x0,0x80000000));\n  return _mm_xor_pd(a,mask);\n}\ntemplate<> EIGEN_STRONG_INLINE Packet4i pnegate(const Packet4i& a)\n{\n  return psub(_mm_setr_epi32(0,0,0,0), a);\n}\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f pconj(const Packet4f& a) { return a; }\ntemplate<> EIGEN_STRONG_INLINE Packet2d pconj(const Packet2d& a) { return a; }\ntemplate<> EIGEN_STRONG_INLINE Packet4i pconj(const Packet4i& a) { return a; }\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f pmul<Packet4f>(const Packet4f& a, const Packet4f& b) { return _mm_mul_ps(a,b); }\ntemplate<> EIGEN_STRONG_INLINE Packet2d pmul<Packet2d>(const Packet2d& a, const Packet2d& b) { return _mm_mul_pd(a,b); }\ntemplate<> EIGEN_STRONG_INLINE Packet4i pmul<Packet4i>(const Packet4i& a, const Packet4i& b)\n{\n#ifdef EIGEN_VECTORIZE_SSE4_1\n  return _mm_mullo_epi32(a,b);\n#else\n  // this version is slightly faster than 4 scalar products\n  return vec4i_swizzle1(\n            vec4i_swizzle2(\n              _mm_mul_epu32(a,b),\n              _mm_mul_epu32(vec4i_swizzle1(a,1,0,3,2),\n                            vec4i_swizzle1(b,1,0,3,2)),\n              0,2,0,2),\n            0,2,1,3);\n#endif\n}\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f pdiv<Packet4f>(const Packet4f& a, const Packet4f& b) { return _mm_div_ps(a,b); }\ntemplate<> EIGEN_STRONG_INLINE Packet2d pdiv<Packet2d>(const Packet2d& a, const Packet2d& b) { return _mm_div_pd(a,b); }\ntemplate<> EIGEN_STRONG_INLINE Packet4i pdiv<Packet4i>(const Packet4i& /*a*/, const Packet4i& /*b*/)\n{ eigen_assert(false && \"packet integer division are not supported by SSE\");\n  return pset1<Packet4i>(0);\n}\n\n// for some weird raisons, it has to be overloaded for packet of integers\ntemplate<> EIGEN_STRONG_INLINE Packet4i pmadd(const Packet4i& a, const Packet4i& b, const Packet4i& c) { return padd(pmul(a,b), c); }\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f pmin<Packet4f>(const Packet4f& a, const Packet4f& b) { return _mm_min_ps(a,b); }\ntemplate<> EIGEN_STRONG_INLINE Packet2d pmin<Packet2d>(const Packet2d& a, const Packet2d& b) { return _mm_min_pd(a,b); }\ntemplate<> EIGEN_STRONG_INLINE Packet4i pmin<Packet4i>(const Packet4i& a, const Packet4i& b)\n{\n#ifdef EIGEN_VECTORIZE_SSE4_1\n  return _mm_min_epi32(a,b);\n#else\n  // after some bench, this version *is* faster than a scalar implementation\n  Packet4i mask = _mm_cmplt_epi32(a,b);\n  return _mm_or_si128(_mm_and_si128(mask,a),_mm_andnot_si128(mask,b));\n#endif\n}\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f pmax<Packet4f>(const Packet4f& a, const Packet4f& b) { return _mm_max_ps(a,b); }\ntemplate<> EIGEN_STRONG_INLINE Packet2d pmax<Packet2d>(const Packet2d& a, const Packet2d& b) { return _mm_max_pd(a,b); }\ntemplate<> EIGEN_STRONG_INLINE Packet4i pmax<Packet4i>(const Packet4i& a, const Packet4i& b)\n{\n#ifdef EIGEN_VECTORIZE_SSE4_1\n  return _mm_max_epi32(a,b);\n#else\n  // after some bench, this version *is* faster than a scalar implementation\n  Packet4i mask = _mm_cmpgt_epi32(a,b);\n  return _mm_or_si128(_mm_and_si128(mask,a),_mm_andnot_si128(mask,b));\n#endif\n}\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f pand<Packet4f>(const Packet4f& a, const Packet4f& b) { return _mm_and_ps(a,b); }\ntemplate<> EIGEN_STRONG_INLINE Packet2d pand<Packet2d>(const Packet2d& a, const Packet2d& b) { return _mm_and_pd(a,b); }\ntemplate<> EIGEN_STRONG_INLINE Packet4i pand<Packet4i>(const Packet4i& a, const Packet4i& b) { return _mm_and_si128(a,b); }\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f por<Packet4f>(const Packet4f& a, const Packet4f& b) { return _mm_or_ps(a,b); }\ntemplate<> EIGEN_STRONG_INLINE Packet2d por<Packet2d>(const Packet2d& a, const Packet2d& b) { return _mm_or_pd(a,b); }\ntemplate<> EIGEN_STRONG_INLINE Packet4i por<Packet4i>(const Packet4i& a, const Packet4i& b) { return _mm_or_si128(a,b); }\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f pxor<Packet4f>(const Packet4f& a, const Packet4f& b) { return _mm_xor_ps(a,b); }\ntemplate<> EIGEN_STRONG_INLINE Packet2d pxor<Packet2d>(const Packet2d& a, const Packet2d& b) { return _mm_xor_pd(a,b); }\ntemplate<> EIGEN_STRONG_INLINE Packet4i pxor<Packet4i>(const Packet4i& a, const Packet4i& b) { return _mm_xor_si128(a,b); }\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f pandnot<Packet4f>(const Packet4f& a, const Packet4f& b) { return _mm_andnot_ps(a,b); }\ntemplate<> EIGEN_STRONG_INLINE Packet2d pandnot<Packet2d>(const Packet2d& a, const Packet2d& b) { return _mm_andnot_pd(a,b); }\ntemplate<> EIGEN_STRONG_INLINE Packet4i pandnot<Packet4i>(const Packet4i& a, const Packet4i& b) { return _mm_andnot_si128(a,b); }\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f pload<Packet4f>(const float*   from) { EIGEN_DEBUG_ALIGNED_LOAD return _mm_load_ps(from); }\ntemplate<> EIGEN_STRONG_INLINE Packet2d pload<Packet2d>(const double*  from) { EIGEN_DEBUG_ALIGNED_LOAD return _mm_load_pd(from); }\ntemplate<> EIGEN_STRONG_INLINE Packet4i pload<Packet4i>(const int*     from) { EIGEN_DEBUG_ALIGNED_LOAD return _mm_load_si128(reinterpret_cast<const Packet4i*>(from)); }\n\n#if defined(_MSC_VER)\n  template<> EIGEN_STRONG_INLINE Packet4f ploadu<Packet4f>(const float*  from) {\n    EIGEN_DEBUG_UNALIGNED_LOAD\n    #if (_MSC_VER==1600)\n    // NOTE Some version of MSVC10 generates bad code when using _mm_loadu_ps\n    // (i.e., it does not generate an unaligned load!!\n    // TODO On most architectures this version should also be faster than a single _mm_loadu_ps\n    // so we could also enable it for MSVC08 but first we have to make this later does not generate crap when doing so...\n    __m128 res = _mm_loadl_pi(_mm_set1_ps(0.0f), (const __m64*)(from));\n    res = _mm_loadh_pi(res, (const __m64*)(from+2));\n    return res;\n    #else\n    return _mm_loadu_ps(from);\n    #endif\n  }\n#else\n// NOTE: with the code below, MSVC's compiler crashes!\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f ploadu<Packet4f>(const float* from)\n{\n  EIGEN_DEBUG_UNALIGNED_LOAD\n  return _mm_loadu_ps(from);\n}\n#endif\n\ntemplate<> EIGEN_STRONG_INLINE Packet2d ploadu<Packet2d>(const double* from)\n{\n  EIGEN_DEBUG_UNALIGNED_LOAD\n  return _mm_loadu_pd(from);\n}\ntemplate<> EIGEN_STRONG_INLINE Packet4i ploadu<Packet4i>(const int* from)\n{\n  EIGEN_DEBUG_UNALIGNED_LOAD\n  return _mm_loadu_si128(reinterpret_cast<const __m128i*>(from));\n}\n\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f ploaddup<Packet4f>(const float*   from)\n{\n  return vec4f_swizzle1(_mm_castpd_ps(_mm_load_sd(reinterpret_cast<const double*>(from))), 0, 0, 1, 1);\n}\ntemplate<> EIGEN_STRONG_INLINE Packet2d ploaddup<Packet2d>(const double*  from)\n{ return pset1<Packet2d>(from[0]); }\ntemplate<> EIGEN_STRONG_INLINE Packet4i ploaddup<Packet4i>(const int*     from)\n{\n  Packet4i tmp;\n  tmp = _mm_loadl_epi64(reinterpret_cast<const Packet4i*>(from));\n  return vec4i_swizzle1(tmp, 0, 0, 1, 1);\n}\n\ntemplate<> EIGEN_STRONG_INLINE void pstore<float>(float*   to, const Packet4f& from) { EIGEN_DEBUG_ALIGNED_STORE _mm_store_ps(to, from); }\ntemplate<> EIGEN_STRONG_INLINE void pstore<double>(double* to, const Packet2d& from) { EIGEN_DEBUG_ALIGNED_STORE _mm_store_pd(to, from); }\ntemplate<> EIGEN_STRONG_INLINE void pstore<int>(int*       to, const Packet4i& from) { EIGEN_DEBUG_ALIGNED_STORE _mm_store_si128(reinterpret_cast<Packet4i*>(to), from); }\n\ntemplate<> EIGEN_STRONG_INLINE void pstoreu<double>(double* to, const Packet2d& from) {\n  EIGEN_DEBUG_UNALIGNED_STORE\n  _mm_storel_pd((to), from);\n  _mm_storeh_pd((to+1), from);\n}\ntemplate<> EIGEN_STRONG_INLINE void pstoreu<float>(float*  to, const Packet4f& from) { EIGEN_DEBUG_UNALIGNED_STORE pstoreu(reinterpret_cast<double*>(to), _mm_castps_pd(from)); }\ntemplate<> EIGEN_STRONG_INLINE void pstoreu<int>(int*      to, const Packet4i& from) { EIGEN_DEBUG_UNALIGNED_STORE pstoreu(reinterpret_cast<double*>(to), _mm_castsi128_pd(from)); }\n\n// some compilers might be tempted to perform multiple moves instead of using a vector path.\ntemplate<> EIGEN_STRONG_INLINE void pstore1<Packet4f>(float* to, const float& a)\n{\n  Packet4f pa = _mm_set_ss(a);\n  pstore(to, vec4f_swizzle1(pa,0,0,0,0));\n}\n// some compilers might be tempted to perform multiple moves instead of using a vector path.\ntemplate<> EIGEN_STRONG_INLINE void pstore1<Packet2d>(double* to, const double& a)\n{\n  Packet2d pa = _mm_set_sd(a);\n  pstore(to, vec2d_swizzle1(pa,0,0));\n}\n\ntemplate<> EIGEN_STRONG_INLINE void prefetch<float>(const float*   addr) { _mm_prefetch((const char*)(addr), _MM_HINT_T0); }\ntemplate<> EIGEN_STRONG_INLINE void prefetch<double>(const double* addr) { _mm_prefetch((const char*)(addr), _MM_HINT_T0); }\ntemplate<> EIGEN_STRONG_INLINE void prefetch<int>(const int*       addr) { _mm_prefetch((const char*)(addr), _MM_HINT_T0); }\n\n#if defined(_MSC_VER) && defined(_WIN64) && !defined(__INTEL_COMPILER)\n// The temporary variable fixes an internal compilation error in vs <= 2008 and a wrong-result bug in vs 2010\n// Direct of the struct members fixed bug #62.\ntemplate<> EIGEN_STRONG_INLINE float  pfirst<Packet4f>(const Packet4f& a) { return a.m128_f32[0]; }\ntemplate<> EIGEN_STRONG_INLINE double pfirst<Packet2d>(const Packet2d& a) { return a.m128d_f64[0]; }\ntemplate<> EIGEN_STRONG_INLINE int    pfirst<Packet4i>(const Packet4i& a) { int x = _mm_cvtsi128_si32(a); return x; }\n#elif defined(_MSC_VER) && !defined(__INTEL_COMPILER)\n// The temporary variable fixes an internal compilation error in vs <= 2008 and a wrong-result bug in vs 2010\ntemplate<> EIGEN_STRONG_INLINE float  pfirst<Packet4f>(const Packet4f& a) { float x = _mm_cvtss_f32(a); return x; }\ntemplate<> EIGEN_STRONG_INLINE double pfirst<Packet2d>(const Packet2d& a) { double x = _mm_cvtsd_f64(a); return x; }\ntemplate<> EIGEN_STRONG_INLINE int    pfirst<Packet4i>(const Packet4i& a) { int x = _mm_cvtsi128_si32(a); return x; }\n#else\ntemplate<> EIGEN_STRONG_INLINE float  pfirst<Packet4f>(const Packet4f& a) { return _mm_cvtss_f32(a); }\ntemplate<> EIGEN_STRONG_INLINE double pfirst<Packet2d>(const Packet2d& a) { return _mm_cvtsd_f64(a); }\ntemplate<> EIGEN_STRONG_INLINE int    pfirst<Packet4i>(const Packet4i& a) { return _mm_cvtsi128_si32(a); }\n#endif\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f preverse(const Packet4f& a)\n{ return _mm_shuffle_ps(a,a,0x1B); }\ntemplate<> EIGEN_STRONG_INLINE Packet2d preverse(const Packet2d& a)\n{ return _mm_shuffle_pd(a,a,0x1); }\ntemplate<> EIGEN_STRONG_INLINE Packet4i preverse(const Packet4i& a)\n{ return _mm_shuffle_epi32(a,0x1B); }\n\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f pabs(const Packet4f& a)\n{\n  const Packet4f mask = _mm_castsi128_ps(_mm_setr_epi32(0x7FFFFFFF,0x7FFFFFFF,0x7FFFFFFF,0x7FFFFFFF));\n  return _mm_and_ps(a,mask);\n}\ntemplate<> EIGEN_STRONG_INLINE Packet2d pabs(const Packet2d& a)\n{\n  const Packet2d mask = _mm_castsi128_pd(_mm_setr_epi32(0xFFFFFFFF,0x7FFFFFFF,0xFFFFFFFF,0x7FFFFFFF));\n  return _mm_and_pd(a,mask);\n}\ntemplate<> EIGEN_STRONG_INLINE Packet4i pabs(const Packet4i& a)\n{\n  #ifdef EIGEN_VECTORIZE_SSSE3\n  return _mm_abs_epi32(a);\n  #else\n  Packet4i aux = _mm_srai_epi32(a,31);\n  return _mm_sub_epi32(_mm_xor_si128(a,aux),aux);\n  #endif\n}\n\nEIGEN_STRONG_INLINE void punpackp(Packet4f* vecs)\n{\n  vecs[1] = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(vecs[0]), 0x55));\n  vecs[2] = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(vecs[0]), 0xAA));\n  vecs[3] = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(vecs[0]), 0xFF));\n  vecs[0] = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(vecs[0]), 0x00));\n}\n\n#ifdef EIGEN_VECTORIZE_SSE3\n// TODO implement SSE2 versions as well as integer versions\ntemplate<> EIGEN_STRONG_INLINE Packet4f preduxp<Packet4f>(const Packet4f* vecs)\n{\n  return _mm_hadd_ps(_mm_hadd_ps(vecs[0], vecs[1]),_mm_hadd_ps(vecs[2], vecs[3]));\n}\ntemplate<> EIGEN_STRONG_INLINE Packet2d preduxp<Packet2d>(const Packet2d* vecs)\n{\n  return _mm_hadd_pd(vecs[0], vecs[1]);\n}\n// SSSE3 version:\n// EIGEN_STRONG_INLINE Packet4i preduxp(const Packet4i* vecs)\n// {\n//   return _mm_hadd_epi32(_mm_hadd_epi32(vecs[0], vecs[1]),_mm_hadd_epi32(vecs[2], vecs[3]));\n// }\n\ntemplate<> EIGEN_STRONG_INLINE float predux<Packet4f>(const Packet4f& a)\n{\n  Packet4f tmp0 = _mm_hadd_ps(a,a);\n  return pfirst(_mm_hadd_ps(tmp0, tmp0));\n}\n\ntemplate<> EIGEN_STRONG_INLINE double predux<Packet2d>(const Packet2d& a) { return pfirst(_mm_hadd_pd(a, a)); }\n\n// SSSE3 version:\n// EIGEN_STRONG_INLINE float predux(const Packet4i& a)\n// {\n//   Packet4i tmp0 = _mm_hadd_epi32(a,a);\n//   return pfirst(_mm_hadd_epi32(tmp0, tmp0));\n// }\n#else\n// SSE2 versions\ntemplate<> EIGEN_STRONG_INLINE float predux<Packet4f>(const Packet4f& a)\n{\n  Packet4f tmp = _mm_add_ps(a, _mm_movehl_ps(a,a));\n  return pfirst(_mm_add_ss(tmp, _mm_shuffle_ps(tmp,tmp, 1)));\n}\ntemplate<> EIGEN_STRONG_INLINE double predux<Packet2d>(const Packet2d& a)\n{\n  return pfirst(_mm_add_sd(a, _mm_unpackhi_pd(a,a)));\n}\n\ntemplate<> EIGEN_STRONG_INLINE Packet4f preduxp<Packet4f>(const Packet4f* vecs)\n{\n  Packet4f tmp0, tmp1, tmp2;\n  tmp0 = _mm_unpacklo_ps(vecs[0], vecs[1]);\n  tmp1 = _mm_unpackhi_ps(vecs[0], vecs[1]);\n  tmp2 = _mm_unpackhi_ps(vecs[2], vecs[3]);\n  tmp0 = _mm_add_ps(tmp0, tmp1);\n  tmp1 = _mm_unpacklo_ps(vecs[2], vecs[3]);\n  tmp1 = _mm_add_ps(tmp1, tmp2);\n  tmp2 = _mm_movehl_ps(tmp1, tmp0);\n  tmp0 = _mm_movelh_ps(tmp0, tmp1);\n  return _mm_add_ps(tmp0, tmp2);\n}\n\ntemplate<> EIGEN_STRONG_INLINE Packet2d preduxp<Packet2d>(const Packet2d* vecs)\n{\n  return _mm_add_pd(_mm_unpacklo_pd(vecs[0], vecs[1]), _mm_unpackhi_pd(vecs[0], vecs[1]));\n}\n#endif  // SSE3\n\ntemplate<> EIGEN_STRONG_INLINE int predux<Packet4i>(const Packet4i& a)\n{\n  Packet4i tmp = _mm_add_epi32(a, _mm_unpackhi_epi64(a,a));\n  return pfirst(tmp) + pfirst(_mm_shuffle_epi32(tmp, 1));\n}\n\ntemplate<> EIGEN_STRONG_INLINE Packet4i preduxp<Packet4i>(const Packet4i* vecs)\n{\n  Packet4i tmp0, tmp1, tmp2;\n  tmp0 = _mm_unpacklo_epi32(vecs[0], vecs[1]);\n  tmp1 = _mm_unpackhi_epi32(vecs[0], vecs[1]);\n  tmp2 = _mm_unpackhi_epi32(vecs[2], vecs[3]);\n  tmp0 = _mm_add_epi32(tmp0, tmp1);\n  tmp1 = _mm_unpacklo_epi32(vecs[2], vecs[3]);\n  tmp1 = _mm_add_epi32(tmp1, tmp2);\n  tmp2 = _mm_unpacklo_epi64(tmp0, tmp1);\n  tmp0 = _mm_unpackhi_epi64(tmp0, tmp1);\n  return _mm_add_epi32(tmp0, tmp2);\n}\n\n// Other reduction functions:\n\n// mul\ntemplate<> EIGEN_STRONG_INLINE float predux_mul<Packet4f>(const Packet4f& a)\n{\n  Packet4f tmp = _mm_mul_ps(a, _mm_movehl_ps(a,a));\n  return pfirst(_mm_mul_ss(tmp, _mm_shuffle_ps(tmp,tmp, 1)));\n}\ntemplate<> EIGEN_STRONG_INLINE double predux_mul<Packet2d>(const Packet2d& a)\n{\n  return pfirst(_mm_mul_sd(a, _mm_unpackhi_pd(a,a)));\n}\ntemplate<> EIGEN_STRONG_INLINE int predux_mul<Packet4i>(const Packet4i& a)\n{\n  // after some experiments, it is seems this is the fastest way to implement it\n  // for GCC (eg., reusing pmul is very slow !)\n  // TODO try to call _mm_mul_epu32 directly\n  EIGEN_ALIGN16 int aux[4];\n  pstore(aux, a);\n  return  (aux[0] * aux[1]) * (aux[2] * aux[3]);;\n}\n\n// min\ntemplate<> EIGEN_STRONG_INLINE float predux_min<Packet4f>(const Packet4f& a)\n{\n  Packet4f tmp = _mm_min_ps(a, _mm_movehl_ps(a,a));\n  return pfirst(_mm_min_ss(tmp, _mm_shuffle_ps(tmp,tmp, 1)));\n}\ntemplate<> EIGEN_STRONG_INLINE double predux_min<Packet2d>(const Packet2d& a)\n{\n  return pfirst(_mm_min_sd(a, _mm_unpackhi_pd(a,a)));\n}\ntemplate<> EIGEN_STRONG_INLINE int predux_min<Packet4i>(const Packet4i& a)\n{\n  // after some experiments, it is seems this is the fastest way to implement it\n  // for GCC (eg., it does not like using std::min after the pstore !!)\n  EIGEN_ALIGN16 int aux[4];\n  pstore(aux, a);\n  int aux0 = aux[0]<aux[1] ? aux[0] : aux[1];\n  int aux2 = aux[2]<aux[3] ? aux[2] : aux[3];\n  return aux0<aux2 ? aux0 : aux2;\n}\n\n// max\ntemplate<> EIGEN_STRONG_INLINE float predux_max<Packet4f>(const Packet4f& a)\n{\n  Packet4f tmp = _mm_max_ps(a, _mm_movehl_ps(a,a));\n  return pfirst(_mm_max_ss(tmp, _mm_shuffle_ps(tmp,tmp, 1)));\n}\ntemplate<> EIGEN_STRONG_INLINE double predux_max<Packet2d>(const Packet2d& a)\n{\n  return pfirst(_mm_max_sd(a, _mm_unpackhi_pd(a,a)));\n}\ntemplate<> EIGEN_STRONG_INLINE int predux_max<Packet4i>(const Packet4i& a)\n{\n  // after some experiments, it is seems this is the fastest way to implement it\n  // for GCC (eg., it does not like using std::min after the pstore !!)\n  EIGEN_ALIGN16 int aux[4];\n  pstore(aux, a);\n  int aux0 = aux[0]>aux[1] ? aux[0] : aux[1];\n  int aux2 = aux[2]>aux[3] ? aux[2] : aux[3];\n  return aux0>aux2 ? aux0 : aux2;\n}\n\n#if (defined __GNUC__)\n// template <> EIGEN_STRONG_INLINE Packet4f pmadd(const Packet4f&  a, const Packet4f&  b, const Packet4f&  c)\n// {\n//   Packet4f res = b;\n//   asm(\"mulps %[a], %[b] \\n\\taddps %[c], %[b]\" : [b] \"+x\" (res) : [a] \"x\" (a), [c] \"x\" (c));\n//   return res;\n// }\n// EIGEN_STRONG_INLINE Packet4i _mm_alignr_epi8(const Packet4i&  a, const Packet4i&  b, const int i)\n// {\n//   Packet4i res = a;\n//   asm(\"palignr %[i], %[a], %[b] \" : [b] \"+x\" (res) : [a] \"x\" (a), [i] \"i\" (i));\n//   return res;\n// }\n#endif\n\n#ifdef EIGEN_VECTORIZE_SSSE3\n// SSSE3 versions\ntemplate<int Offset>\nstruct palign_impl<Offset,Packet4f>\n{\n  static EIGEN_STRONG_INLINE void run(Packet4f& first, const Packet4f& second)\n  {\n    if (Offset!=0)\n      first = _mm_castsi128_ps(_mm_alignr_epi8(_mm_castps_si128(second), _mm_castps_si128(first), Offset*4));\n  }\n};\n\ntemplate<int Offset>\nstruct palign_impl<Offset,Packet4i>\n{\n  static EIGEN_STRONG_INLINE void run(Packet4i& first, const Packet4i& second)\n  {\n    if (Offset!=0)\n      first = _mm_alignr_epi8(second,first, Offset*4);\n  }\n};\n\ntemplate<int Offset>\nstruct palign_impl<Offset,Packet2d>\n{\n  static EIGEN_STRONG_INLINE void run(Packet2d& first, const Packet2d& second)\n  {\n    if (Offset==1)\n      first = _mm_castsi128_pd(_mm_alignr_epi8(_mm_castpd_si128(second), _mm_castpd_si128(first), 8));\n  }\n};\n#else\n// SSE2 versions\ntemplate<int Offset>\nstruct palign_impl<Offset,Packet4f>\n{\n  static EIGEN_STRONG_INLINE void run(Packet4f& first, const Packet4f& second)\n  {\n    if (Offset==1)\n    {\n      first = _mm_move_ss(first,second);\n      first = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(first),0x39));\n    }\n    else if (Offset==2)\n    {\n      first = _mm_movehl_ps(first,first);\n      first = _mm_movelh_ps(first,second);\n    }\n    else if (Offset==3)\n    {\n      first = _mm_move_ss(first,second);\n      first = _mm_shuffle_ps(first,second,0x93);\n    }\n  }\n};\n\ntemplate<int Offset>\nstruct palign_impl<Offset,Packet4i>\n{\n  static EIGEN_STRONG_INLINE void run(Packet4i& first, const Packet4i& second)\n  {\n    if (Offset==1)\n    {\n      first = _mm_castps_si128(_mm_move_ss(_mm_castsi128_ps(first),_mm_castsi128_ps(second)));\n      first = _mm_shuffle_epi32(first,0x39);\n    }\n    else if (Offset==2)\n    {\n      first = _mm_castps_si128(_mm_movehl_ps(_mm_castsi128_ps(first),_mm_castsi128_ps(first)));\n      first = _mm_castps_si128(_mm_movelh_ps(_mm_castsi128_ps(first),_mm_castsi128_ps(second)));\n    }\n    else if (Offset==3)\n    {\n      first = _mm_castps_si128(_mm_move_ss(_mm_castsi128_ps(first),_mm_castsi128_ps(second)));\n      first = _mm_castps_si128(_mm_shuffle_ps(_mm_castsi128_ps(first),_mm_castsi128_ps(second),0x93));\n    }\n  }\n};\n\ntemplate<int Offset>\nstruct palign_impl<Offset,Packet2d>\n{\n  static EIGEN_STRONG_INLINE void run(Packet2d& first, const Packet2d& second)\n  {\n    if (Offset==1)\n    {\n      first = _mm_castps_pd(_mm_movehl_ps(_mm_castpd_ps(first),_mm_castpd_ps(first)));\n      first = _mm_castps_pd(_mm_movelh_ps(_mm_castpd_ps(first),_mm_castpd_ps(second)));\n    }\n  }\n};\n#endif\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_PACKET_MATH_SSE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/products/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_Core_Product_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_Core_Product_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/Core/products COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/products/CoeffBasedProduct.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_COEFFBASED_PRODUCT_H\n#define EIGEN_COEFFBASED_PRODUCT_H\n\nnamespace Eigen { \n\nnamespace internal {\n\n/*********************************************************************************\n*  Coefficient based product implementation.\n*  It is designed for the following use cases:\n*  - small fixed sizes\n*  - lazy products\n*********************************************************************************/\n\n/* Since the all the dimensions of the product are small, here we can rely\n * on the generic Assign mechanism to evaluate the product per coeff (or packet).\n *\n * Note that here the inner-loops should always be unrolled.\n */\n\ntemplate<int Traversal, int UnrollingIndex, typename Lhs, typename Rhs, typename RetScalar>\nstruct product_coeff_impl;\n\ntemplate<int StorageOrder, int UnrollingIndex, typename Lhs, typename Rhs, typename Packet, int LoadMode>\nstruct product_packet_impl;\n\ntemplate<typename LhsNested, typename RhsNested, int NestingFlags>\nstruct traits<CoeffBasedProduct<LhsNested,RhsNested,NestingFlags> >\n{\n  typedef MatrixXpr XprKind;\n  typedef typename remove_all<LhsNested>::type _LhsNested;\n  typedef typename remove_all<RhsNested>::type _RhsNested;\n  typedef typename scalar_product_traits<typename _LhsNested::Scalar, typename _RhsNested::Scalar>::ReturnType Scalar;\n  typedef typename promote_storage_type<typename traits<_LhsNested>::StorageKind,\n                                           typename traits<_RhsNested>::StorageKind>::ret StorageKind;\n  typedef typename promote_index_type<typename traits<_LhsNested>::Index,\n                                         typename traits<_RhsNested>::Index>::type Index;\n\n  enum {\n      LhsCoeffReadCost = _LhsNested::CoeffReadCost,\n      RhsCoeffReadCost = _RhsNested::CoeffReadCost,\n      LhsFlags = _LhsNested::Flags,\n      RhsFlags = _RhsNested::Flags,\n\n      RowsAtCompileTime = _LhsNested::RowsAtCompileTime,\n      ColsAtCompileTime = _RhsNested::ColsAtCompileTime,\n      InnerSize = EIGEN_SIZE_MIN_PREFER_FIXED(_LhsNested::ColsAtCompileTime, _RhsNested::RowsAtCompileTime),\n\n      MaxRowsAtCompileTime = _LhsNested::MaxRowsAtCompileTime,\n      MaxColsAtCompileTime = _RhsNested::MaxColsAtCompileTime,\n\n      LhsRowMajor = LhsFlags & RowMajorBit,\n      RhsRowMajor = RhsFlags & RowMajorBit,\n\n      SameType = is_same<typename _LhsNested::Scalar,typename _RhsNested::Scalar>::value,\n\n      CanVectorizeRhs = RhsRowMajor && (RhsFlags & PacketAccessBit)\n                      && (ColsAtCompileTime == Dynamic\n                          || ( (ColsAtCompileTime % packet_traits<Scalar>::size) == 0\n                              && (RhsFlags&AlignedBit)\n                             )\n                         ),\n\n      CanVectorizeLhs = (!LhsRowMajor) && (LhsFlags & PacketAccessBit)\n                      && (RowsAtCompileTime == Dynamic\n                          || ( (RowsAtCompileTime % packet_traits<Scalar>::size) == 0\n                              && (LhsFlags&AlignedBit)\n                             )\n                         ),\n\n      EvalToRowMajor = (MaxRowsAtCompileTime==1&&MaxColsAtCompileTime!=1) ? 1\n                     : (MaxColsAtCompileTime==1&&MaxRowsAtCompileTime!=1) ? 0\n                     : (RhsRowMajor && !CanVectorizeLhs),\n\n      Flags = ((unsigned int)(LhsFlags | RhsFlags) & HereditaryBits & ~RowMajorBit)\n            | (EvalToRowMajor ? RowMajorBit : 0)\n            | NestingFlags\n            | (LhsFlags & RhsFlags & AlignedBit)\n            // TODO enable vectorization for mixed types\n            | (SameType && (CanVectorizeLhs || CanVectorizeRhs) ? PacketAccessBit : 0),\n\n      CoeffReadCost = InnerSize == Dynamic ? Dynamic\n                    : InnerSize == 0 ? 0\n                    : InnerSize * (NumTraits<Scalar>::MulCost + LhsCoeffReadCost + RhsCoeffReadCost)\n                      + (InnerSize - 1) * NumTraits<Scalar>::AddCost,\n\n      /* CanVectorizeInner deserves special explanation. It does not affect the product flags. It is not used outside\n      * of Product. If the Product itself is not a packet-access expression, there is still a chance that the inner\n      * loop of the product might be vectorized. This is the meaning of CanVectorizeInner. Since it doesn't affect\n      * the Flags, it is safe to make this value depend on ActualPacketAccessBit, that doesn't affect the ABI.\n      */\n      CanVectorizeInner =    SameType\n                          && LhsRowMajor\n                          && (!RhsRowMajor)\n                          && (LhsFlags & RhsFlags & ActualPacketAccessBit)\n                          && (LhsFlags & RhsFlags & AlignedBit)\n                          && (InnerSize % packet_traits<Scalar>::size == 0)\n    };\n};\n\n} // end namespace internal\n\ntemplate<typename LhsNested, typename RhsNested, int NestingFlags>\nclass CoeffBasedProduct\n  : internal::no_assignment_operator,\n    public MatrixBase<CoeffBasedProduct<LhsNested, RhsNested, NestingFlags> >\n{\n  public:\n\n    typedef MatrixBase<CoeffBasedProduct> Base;\n    EIGEN_DENSE_PUBLIC_INTERFACE(CoeffBasedProduct)\n    typedef typename Base::PlainObject PlainObject;\n\n  private:\n\n    typedef typename internal::traits<CoeffBasedProduct>::_LhsNested _LhsNested;\n    typedef typename internal::traits<CoeffBasedProduct>::_RhsNested _RhsNested;\n\n    enum {\n      PacketSize = internal::packet_traits<Scalar>::size,\n      InnerSize  = internal::traits<CoeffBasedProduct>::InnerSize,\n      Unroll = CoeffReadCost != Dynamic && CoeffReadCost <= EIGEN_UNROLLING_LIMIT,\n      CanVectorizeInner = internal::traits<CoeffBasedProduct>::CanVectorizeInner\n    };\n\n    typedef internal::product_coeff_impl<CanVectorizeInner ? InnerVectorizedTraversal : DefaultTraversal,\n                                   Unroll ? InnerSize : Dynamic,\n                                   _LhsNested, _RhsNested, Scalar> ScalarCoeffImpl;\n\n    typedef CoeffBasedProduct<LhsNested,RhsNested,NestByRefBit> LazyCoeffBasedProductType;\n\n  public:\n\n    inline CoeffBasedProduct(const CoeffBasedProduct& other)\n      : Base(), m_lhs(other.m_lhs), m_rhs(other.m_rhs)\n    {}\n\n    template<typename Lhs, typename Rhs>\n    inline CoeffBasedProduct(const Lhs& lhs, const Rhs& rhs)\n      : m_lhs(lhs), m_rhs(rhs)\n    {\n      // we don't allow taking products of matrices of different real types, as that wouldn't be vectorizable.\n      // We still allow to mix T and complex<T>.\n      EIGEN_STATIC_ASSERT((internal::scalar_product_traits<typename Lhs::RealScalar, typename Rhs::RealScalar>::Defined),\n        YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)\n      eigen_assert(lhs.cols() == rhs.rows()\n        && \"invalid matrix product\"\n        && \"if you wanted a coeff-wise or a dot product use the respective explicit functions\");\n    }\n\n    EIGEN_STRONG_INLINE Index rows() const { return m_lhs.rows(); }\n    EIGEN_STRONG_INLINE Index cols() const { return m_rhs.cols(); }\n\n    EIGEN_STRONG_INLINE const Scalar coeff(Index row, Index col) const\n    {\n      Scalar res;\n      ScalarCoeffImpl::run(row, col, m_lhs, m_rhs, res);\n      return res;\n    }\n\n    /* Allow index-based non-packet access. It is impossible though to allow index-based packed access,\n     * which is why we don't set the LinearAccessBit.\n     */\n    EIGEN_STRONG_INLINE const Scalar coeff(Index index) const\n    {\n      Scalar res;\n      const Index row = RowsAtCompileTime == 1 ? 0 : index;\n      const Index col = RowsAtCompileTime == 1 ? index : 0;\n      ScalarCoeffImpl::run(row, col, m_lhs, m_rhs, res);\n      return res;\n    }\n\n    template<int LoadMode>\n    EIGEN_STRONG_INLINE const PacketScalar packet(Index row, Index col) const\n    {\n      PacketScalar res;\n      internal::product_packet_impl<Flags&RowMajorBit ? RowMajor : ColMajor,\n                              Unroll ? InnerSize : Dynamic,\n                              _LhsNested, _RhsNested, PacketScalar, LoadMode>\n        ::run(row, col, m_lhs, m_rhs, res);\n      return res;\n    }\n\n    // Implicit conversion to the nested type (trigger the evaluation of the product)\n    EIGEN_STRONG_INLINE operator const PlainObject& () const\n    {\n      m_result.lazyAssign(*this);\n      return m_result;\n    }\n\n    const _LhsNested& lhs() const { return m_lhs; }\n    const _RhsNested& rhs() const { return m_rhs; }\n\n    const Diagonal<const LazyCoeffBasedProductType,0> diagonal() const\n    { return reinterpret_cast<const LazyCoeffBasedProductType&>(*this); }\n\n    template<int DiagonalIndex>\n    const Diagonal<const LazyCoeffBasedProductType,DiagonalIndex> diagonal() const\n    { return reinterpret_cast<const LazyCoeffBasedProductType&>(*this); }\n\n    const Diagonal<const LazyCoeffBasedProductType,Dynamic> diagonal(Index index) const\n    { return reinterpret_cast<const LazyCoeffBasedProductType&>(*this).diagonal(index); }\n\n  protected:\n    typename internal::add_const_on_value_type<LhsNested>::type m_lhs;\n    typename internal::add_const_on_value_type<RhsNested>::type m_rhs;\n\n    mutable PlainObject m_result;\n};\n\nnamespace internal {\n\n// here we need to overload the nested rule for products\n// such that the nested type is a const reference to a plain matrix\ntemplate<typename Lhs, typename Rhs, int N, typename PlainObject>\nstruct nested<CoeffBasedProduct<Lhs,Rhs,EvalBeforeNestingBit|EvalBeforeAssigningBit>, N, PlainObject>\n{\n  typedef PlainObject const& type;\n};\n\n/***************************************************************************\n* Normal product .coeff() implementation (with meta-unrolling)\n***************************************************************************/\n\n/**************************************\n*** Scalar path  - no vectorization ***\n**************************************/\n\ntemplate<int UnrollingIndex, typename Lhs, typename Rhs, typename RetScalar>\nstruct product_coeff_impl<DefaultTraversal, UnrollingIndex, Lhs, Rhs, RetScalar>\n{\n  typedef typename Lhs::Index Index;\n  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, RetScalar &res)\n  {\n    product_coeff_impl<DefaultTraversal, UnrollingIndex-1, Lhs, Rhs, RetScalar>::run(row, col, lhs, rhs, res);\n    res += lhs.coeff(row, UnrollingIndex-1) * rhs.coeff(UnrollingIndex-1, col);\n  }\n};\n\ntemplate<typename Lhs, typename Rhs, typename RetScalar>\nstruct product_coeff_impl<DefaultTraversal, 1, Lhs, Rhs, RetScalar>\n{\n  typedef typename Lhs::Index Index;\n  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, RetScalar &res)\n  {\n    res = lhs.coeff(row, 0) * rhs.coeff(0, col);\n  }\n};\n\ntemplate<typename Lhs, typename Rhs, typename RetScalar>\nstruct product_coeff_impl<DefaultTraversal, 0, Lhs, Rhs, RetScalar>\n{\n  typedef typename Lhs::Index Index;\n  static EIGEN_STRONG_INLINE void run(Index /*row*/, Index /*col*/, const Lhs& /*lhs*/, const Rhs& /*rhs*/, RetScalar &res)\n  {\n    res = RetScalar(0);\n  }\n};\n\ntemplate<typename Lhs, typename Rhs, typename RetScalar>\nstruct product_coeff_impl<DefaultTraversal, Dynamic, Lhs, Rhs, RetScalar>\n{\n  typedef typename Lhs::Index Index;\n  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, RetScalar& res)\n  {\n    res = (lhs.row(row).transpose().cwiseProduct( rhs.col(col) )).sum();\n  }\n};\n\n/*******************************************\n*** Scalar path with inner vectorization ***\n*******************************************/\n\ntemplate<int UnrollingIndex, typename Lhs, typename Rhs, typename Packet>\nstruct product_coeff_vectorized_unroller\n{\n  typedef typename Lhs::Index Index;\n  enum { PacketSize = packet_traits<typename Lhs::Scalar>::size };\n  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, typename Lhs::PacketScalar &pres)\n  {\n    product_coeff_vectorized_unroller<UnrollingIndex-PacketSize, Lhs, Rhs, Packet>::run(row, col, lhs, rhs, pres);\n    pres = padd(pres, pmul( lhs.template packet<Aligned>(row, UnrollingIndex) , rhs.template packet<Aligned>(UnrollingIndex, col) ));\n  }\n};\n\ntemplate<typename Lhs, typename Rhs, typename Packet>\nstruct product_coeff_vectorized_unroller<0, Lhs, Rhs, Packet>\n{\n  typedef typename Lhs::Index Index;\n  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, typename Lhs::PacketScalar &pres)\n  {\n    pres = pmul(lhs.template packet<Aligned>(row, 0) , rhs.template packet<Aligned>(0, col));\n  }\n};\n\ntemplate<typename Lhs, typename Rhs, typename RetScalar>\nstruct product_coeff_impl<InnerVectorizedTraversal, 0, Lhs, Rhs, RetScalar>\n{\n  typedef typename Lhs::Index Index;\n  static EIGEN_STRONG_INLINE void run(Index /*row*/, Index /*col*/, const Lhs& /*lhs*/, const Rhs& /*rhs*/, RetScalar &res)\n  {\n    res = 0;\n  }\n};\n\ntemplate<int UnrollingIndex, typename Lhs, typename Rhs, typename RetScalar>\nstruct product_coeff_impl<InnerVectorizedTraversal, UnrollingIndex, Lhs, Rhs, RetScalar>\n{\n  typedef typename Lhs::PacketScalar Packet;\n  typedef typename Lhs::Index Index;\n  enum { PacketSize = packet_traits<typename Lhs::Scalar>::size };\n  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, RetScalar &res)\n  {\n    Packet pres;\n    product_coeff_vectorized_unroller<UnrollingIndex-PacketSize, Lhs, Rhs, Packet>::run(row, col, lhs, rhs, pres);\n    res = predux(pres);\n  }\n};\n\ntemplate<typename Lhs, typename Rhs, int LhsRows = Lhs::RowsAtCompileTime, int RhsCols = Rhs::ColsAtCompileTime>\nstruct product_coeff_vectorized_dyn_selector\n{\n  typedef typename Lhs::Index Index;\n  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, typename Lhs::Scalar &res)\n  {\n    res = lhs.row(row).transpose().cwiseProduct(rhs.col(col)).sum();\n  }\n};\n\n// NOTE the 3 following specializations are because taking .col(0) on a vector is a bit slower\n// NOTE maybe they are now useless since we have a specialization for Block<Matrix>\ntemplate<typename Lhs, typename Rhs, int RhsCols>\nstruct product_coeff_vectorized_dyn_selector<Lhs,Rhs,1,RhsCols>\n{\n  typedef typename Lhs::Index Index;\n  static EIGEN_STRONG_INLINE void run(Index /*row*/, Index col, const Lhs& lhs, const Rhs& rhs, typename Lhs::Scalar &res)\n  {\n    res = lhs.transpose().cwiseProduct(rhs.col(col)).sum();\n  }\n};\n\ntemplate<typename Lhs, typename Rhs, int LhsRows>\nstruct product_coeff_vectorized_dyn_selector<Lhs,Rhs,LhsRows,1>\n{\n  typedef typename Lhs::Index Index;\n  static EIGEN_STRONG_INLINE void run(Index row, Index /*col*/, const Lhs& lhs, const Rhs& rhs, typename Lhs::Scalar &res)\n  {\n    res = lhs.row(row).transpose().cwiseProduct(rhs).sum();\n  }\n};\n\ntemplate<typename Lhs, typename Rhs>\nstruct product_coeff_vectorized_dyn_selector<Lhs,Rhs,1,1>\n{\n  typedef typename Lhs::Index Index;\n  static EIGEN_STRONG_INLINE void run(Index /*row*/, Index /*col*/, const Lhs& lhs, const Rhs& rhs, typename Lhs::Scalar &res)\n  {\n    res = lhs.transpose().cwiseProduct(rhs).sum();\n  }\n};\n\ntemplate<typename Lhs, typename Rhs, typename RetScalar>\nstruct product_coeff_impl<InnerVectorizedTraversal, Dynamic, Lhs, Rhs, RetScalar>\n{\n  typedef typename Lhs::Index Index;\n  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, typename Lhs::Scalar &res)\n  {\n    product_coeff_vectorized_dyn_selector<Lhs,Rhs>::run(row, col, lhs, rhs, res);\n  }\n};\n\n/*******************\n*** Packet path  ***\n*******************/\n\ntemplate<int UnrollingIndex, typename Lhs, typename Rhs, typename Packet, int LoadMode>\nstruct product_packet_impl<RowMajor, UnrollingIndex, Lhs, Rhs, Packet, LoadMode>\n{\n  typedef typename Lhs::Index Index;\n  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Packet &res)\n  {\n    product_packet_impl<RowMajor, UnrollingIndex-1, Lhs, Rhs, Packet, LoadMode>::run(row, col, lhs, rhs, res);\n    res =  pmadd(pset1<Packet>(lhs.coeff(row, UnrollingIndex-1)), rhs.template packet<LoadMode>(UnrollingIndex-1, col), res);\n  }\n};\n\ntemplate<int UnrollingIndex, typename Lhs, typename Rhs, typename Packet, int LoadMode>\nstruct product_packet_impl<ColMajor, UnrollingIndex, Lhs, Rhs, Packet, LoadMode>\n{\n  typedef typename Lhs::Index Index;\n  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Packet &res)\n  {\n    product_packet_impl<ColMajor, UnrollingIndex-1, Lhs, Rhs, Packet, LoadMode>::run(row, col, lhs, rhs, res);\n    res =  pmadd(lhs.template packet<LoadMode>(row, UnrollingIndex-1), pset1<Packet>(rhs.coeff(UnrollingIndex-1, col)), res);\n  }\n};\n\ntemplate<typename Lhs, typename Rhs, typename Packet, int LoadMode>\nstruct product_packet_impl<RowMajor, 1, Lhs, Rhs, Packet, LoadMode>\n{\n  typedef typename Lhs::Index Index;\n  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Packet &res)\n  {\n    res = pmul(pset1<Packet>(lhs.coeff(row, 0)),rhs.template packet<LoadMode>(0, col));\n  }\n};\n\ntemplate<typename Lhs, typename Rhs, typename Packet, int LoadMode>\nstruct product_packet_impl<ColMajor, 1, Lhs, Rhs, Packet, LoadMode>\n{\n  typedef typename Lhs::Index Index;\n  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Packet &res)\n  {\n    res = pmul(lhs.template packet<LoadMode>(row, 0), pset1<Packet>(rhs.coeff(0, col)));\n  }\n};\n\ntemplate<typename Lhs, typename Rhs, typename Packet, int LoadMode>\nstruct product_packet_impl<RowMajor, 0, Lhs, Rhs, Packet, LoadMode>\n{\n  typedef typename Lhs::Index Index;\n  static EIGEN_STRONG_INLINE void run(Index /*row*/, Index /*col*/, const Lhs& /*lhs*/, const Rhs& /*rhs*/, Packet &res)\n  {\n    res = pset1<Packet>(0);\n  }\n};\n\ntemplate<typename Lhs, typename Rhs, typename Packet, int LoadMode>\nstruct product_packet_impl<ColMajor, 0, Lhs, Rhs, Packet, LoadMode>\n{\n  typedef typename Lhs::Index Index;\n  static EIGEN_STRONG_INLINE void run(Index /*row*/, Index /*col*/, const Lhs& /*lhs*/, const Rhs& /*rhs*/, Packet &res)\n  {\n    res = pset1<Packet>(0);\n  }\n};\n\ntemplate<typename Lhs, typename Rhs, typename Packet, int LoadMode>\nstruct product_packet_impl<RowMajor, Dynamic, Lhs, Rhs, Packet, LoadMode>\n{\n  typedef typename Lhs::Index Index;\n  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Packet& res)\n  {\n    res = pset1<Packet>(0);\n    for(Index i = 0; i < lhs.cols(); ++i)\n      res =  pmadd(pset1<Packet>(lhs.coeff(row, i)), rhs.template packet<LoadMode>(i, col), res);\n  }\n};\n\ntemplate<typename Lhs, typename Rhs, typename Packet, int LoadMode>\nstruct product_packet_impl<ColMajor, Dynamic, Lhs, Rhs, Packet, LoadMode>\n{\n  typedef typename Lhs::Index Index;\n  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Packet& res)\n  {\n    res = pset1<Packet>(0);\n    for(Index i = 0; i < lhs.cols(); ++i)\n      res =  pmadd(lhs.template packet<LoadMode>(row, i), pset1<Packet>(rhs.coeff(i, col)), res);\n  }\n};\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_COEFFBASED_PRODUCT_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_GENERAL_BLOCK_PANEL_H\n#define EIGEN_GENERAL_BLOCK_PANEL_H\n\nnamespace Eigen { \n  \nnamespace internal {\n\ntemplate<typename _LhsScalar, typename _RhsScalar, bool _ConjLhs=false, bool _ConjRhs=false>\nclass gebp_traits;\n\n\n/** \\internal \\returns b if a<=0, and returns a otherwise. */\ninline std::ptrdiff_t manage_caching_sizes_helper(std::ptrdiff_t a, std::ptrdiff_t b)\n{\n  return a<=0 ? b : a;\n}\n\n/** \\internal */\ninline void manage_caching_sizes(Action action, std::ptrdiff_t* l1=0, std::ptrdiff_t* l2=0)\n{\n  static std::ptrdiff_t m_l1CacheSize = 0;\n  static std::ptrdiff_t m_l2CacheSize = 0;\n  if(m_l2CacheSize==0)\n  {\n    m_l1CacheSize = manage_caching_sizes_helper(queryL1CacheSize(),8 * 1024);\n    m_l2CacheSize = manage_caching_sizes_helper(queryTopLevelCacheSize(),1*1024*1024);\n  }\n  \n  if(action==SetAction)\n  {\n    // set the cpu cache size and cache all block sizes from a global cache size in byte\n    eigen_internal_assert(l1!=0 && l2!=0);\n    m_l1CacheSize = *l1;\n    m_l2CacheSize = *l2;\n  }\n  else if(action==GetAction)\n  {\n    eigen_internal_assert(l1!=0 && l2!=0);\n    *l1 = m_l1CacheSize;\n    *l2 = m_l2CacheSize;\n  }\n  else\n  {\n    eigen_internal_assert(false);\n  }\n}\n\n/** \\brief Computes the blocking parameters for a m x k times k x n matrix product\n  *\n  * \\param[in,out] k Input: the third dimension of the product. Output: the blocking size along the same dimension.\n  * \\param[in,out] m Input: the number of rows of the left hand side. Output: the blocking size along the same dimension.\n  * \\param[in,out] n Input: the number of columns of the right hand side. Output: the blocking size along the same dimension.\n  *\n  * Given a m x k times k x n matrix product of scalar types \\c LhsScalar and \\c RhsScalar,\n  * this function computes the blocking size parameters along the respective dimensions\n  * for matrix products and related algorithms. The blocking sizes depends on various\n  * parameters:\n  * - the L1 and L2 cache sizes,\n  * - the register level blocking sizes defined by gebp_traits,\n  * - the number of scalars that fit into a packet (when vectorization is enabled).\n  *\n  * \\sa setCpuCacheSizes */\ntemplate<typename LhsScalar, typename RhsScalar, int KcFactor, typename SizeType>\nvoid computeProductBlockingSizes(SizeType& k, SizeType& m, SizeType& n)\n{\n  EIGEN_UNUSED_VARIABLE(n);\n  // Explanations:\n  // Let's recall the product algorithms form kc x nc horizontal panels B' on the rhs and\n  // mc x kc blocks A' on the lhs. A' has to fit into L2 cache. Moreover, B' is processed\n  // per kc x nr vertical small panels where nr is the blocking size along the n dimension\n  // at the register level. For vectorization purpose, these small vertical panels are unpacked,\n  // e.g., each coefficient is replicated to fit a packet. This small vertical panel has to\n  // stay in L1 cache.\n  std::ptrdiff_t l1, l2;\n\n  typedef gebp_traits<LhsScalar,RhsScalar> Traits;\n  enum {\n    kdiv = KcFactor * 2 * Traits::nr\n         * Traits::RhsProgress * sizeof(RhsScalar),\n    mr = gebp_traits<LhsScalar,RhsScalar>::mr,\n    mr_mask = (0xffffffff/mr)*mr\n  };\n\n  manage_caching_sizes(GetAction, &l1, &l2);\n  k = std::min<SizeType>(k, l1/kdiv);\n  SizeType _m = k>0 ? l2/(4 * sizeof(LhsScalar) * k) : 0;\n  if(_m<m) m = _m & mr_mask;\n}\n\ntemplate<typename LhsScalar, typename RhsScalar, typename SizeType>\ninline void computeProductBlockingSizes(SizeType& k, SizeType& m, SizeType& n)\n{\n  computeProductBlockingSizes<LhsScalar,RhsScalar,1>(k, m, n);\n}\n\n#ifdef EIGEN_HAS_FUSE_CJMADD\n  #define MADD(CJ,A,B,C,T)  C = CJ.pmadd(A,B,C);\n#else\n\n  // FIXME (a bit overkill maybe ?)\n\n  template<typename CJ, typename A, typename B, typename C, typename T> struct gebp_madd_selector {\n    EIGEN_ALWAYS_INLINE static void run(const CJ& cj, A& a, B& b, C& c, T& /*t*/)\n    {\n      c = cj.pmadd(a,b,c);\n    }\n  };\n\n  template<typename CJ, typename T> struct gebp_madd_selector<CJ,T,T,T,T> {\n    EIGEN_ALWAYS_INLINE static void run(const CJ& cj, T& a, T& b, T& c, T& t)\n    {\n      t = b; t = cj.pmul(a,t); c = padd(c,t);\n    }\n  };\n\n  template<typename CJ, typename A, typename B, typename C, typename T>\n  EIGEN_STRONG_INLINE void gebp_madd(const CJ& cj, A& a, B& b, C& c, T& t)\n  {\n    gebp_madd_selector<CJ,A,B,C,T>::run(cj,a,b,c,t);\n  }\n\n  #define MADD(CJ,A,B,C,T)  gebp_madd(CJ,A,B,C,T);\n//   #define MADD(CJ,A,B,C,T)  T = B; T = CJ.pmul(A,T); C = padd(C,T);\n#endif\n\n/* Vectorization logic\n *  real*real: unpack rhs to constant packets, ...\n * \n *  cd*cd : unpack rhs to (b_r,b_r), (b_i,b_i), mul to get (a_r b_r,a_i b_r) (a_r b_i,a_i b_i),\n *          storing each res packet into two packets (2x2),\n *          at the end combine them: swap the second and addsub them \n *  cf*cf : same but with 2x4 blocks\n *  cplx*real : unpack rhs to constant packets, ...\n *  real*cplx : load lhs as (a0,a0,a1,a1), and mul as usual\n */\ntemplate<typename _LhsScalar, typename _RhsScalar, bool _ConjLhs, bool _ConjRhs>\nclass gebp_traits\n{\npublic:\n  typedef _LhsScalar LhsScalar;\n  typedef _RhsScalar RhsScalar;\n  typedef typename scalar_product_traits<LhsScalar, RhsScalar>::ReturnType ResScalar;\n\n  enum {\n    ConjLhs = _ConjLhs,\n    ConjRhs = _ConjRhs,\n    Vectorizable = packet_traits<LhsScalar>::Vectorizable && packet_traits<RhsScalar>::Vectorizable,\n    LhsPacketSize = Vectorizable ? packet_traits<LhsScalar>::size : 1,\n    RhsPacketSize = Vectorizable ? packet_traits<RhsScalar>::size : 1,\n    ResPacketSize = Vectorizable ? packet_traits<ResScalar>::size : 1,\n    \n    NumberOfRegisters = EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS,\n\n    // register block size along the N direction (must be either 2 or 4)\n    nr = NumberOfRegisters/4,\n\n    // register block size along the M direction (currently, this one cannot be modified)\n    mr = 2 * LhsPacketSize,\n    \n    WorkSpaceFactor = nr * RhsPacketSize,\n\n    LhsProgress = LhsPacketSize,\n    RhsProgress = RhsPacketSize\n  };\n\n  typedef typename packet_traits<LhsScalar>::type  _LhsPacket;\n  typedef typename packet_traits<RhsScalar>::type  _RhsPacket;\n  typedef typename packet_traits<ResScalar>::type  _ResPacket;\n\n  typedef typename conditional<Vectorizable,_LhsPacket,LhsScalar>::type LhsPacket;\n  typedef typename conditional<Vectorizable,_RhsPacket,RhsScalar>::type RhsPacket;\n  typedef typename conditional<Vectorizable,_ResPacket,ResScalar>::type ResPacket;\n\n  typedef ResPacket AccPacket;\n  \n  EIGEN_STRONG_INLINE void initAcc(AccPacket& p)\n  {\n    p = pset1<ResPacket>(ResScalar(0));\n  }\n\n  EIGEN_STRONG_INLINE void unpackRhs(DenseIndex n, const RhsScalar* rhs, RhsScalar* b)\n  {\n    for(DenseIndex k=0; k<n; k++)\n      pstore1<RhsPacket>(&b[k*RhsPacketSize], rhs[k]);\n  }\n\n  EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, RhsPacket& dest) const\n  {\n    dest = pload<RhsPacket>(b);\n  }\n\n  EIGEN_STRONG_INLINE void loadLhs(const LhsScalar* a, LhsPacket& dest) const\n  {\n    dest = pload<LhsPacket>(a);\n  }\n\n  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacket& b, AccPacket& c, AccPacket& tmp) const\n  {\n    tmp = b; tmp = pmul(a,tmp); c = padd(c,tmp);\n  }\n\n  EIGEN_STRONG_INLINE void acc(const AccPacket& c, const ResPacket& alpha, ResPacket& r) const\n  {\n    r = pmadd(c,alpha,r);\n  }\n\nprotected:\n//   conj_helper<LhsScalar,RhsScalar,ConjLhs,ConjRhs> cj;\n//   conj_helper<LhsPacket,RhsPacket,ConjLhs,ConjRhs> pcj;\n};\n\ntemplate<typename RealScalar, bool _ConjLhs>\nclass gebp_traits<std::complex<RealScalar>, RealScalar, _ConjLhs, false>\n{\npublic:\n  typedef std::complex<RealScalar> LhsScalar;\n  typedef RealScalar RhsScalar;\n  typedef typename scalar_product_traits<LhsScalar, RhsScalar>::ReturnType ResScalar;\n\n  enum {\n    ConjLhs = _ConjLhs,\n    ConjRhs = false,\n    Vectorizable = packet_traits<LhsScalar>::Vectorizable && packet_traits<RhsScalar>::Vectorizable,\n    LhsPacketSize = Vectorizable ? packet_traits<LhsScalar>::size : 1,\n    RhsPacketSize = Vectorizable ? packet_traits<RhsScalar>::size : 1,\n    ResPacketSize = Vectorizable ? packet_traits<ResScalar>::size : 1,\n    \n    NumberOfRegisters = EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS,\n    nr = NumberOfRegisters/4,\n    mr = 2 * LhsPacketSize,\n    WorkSpaceFactor = nr*RhsPacketSize,\n\n    LhsProgress = LhsPacketSize,\n    RhsProgress = RhsPacketSize\n  };\n\n  typedef typename packet_traits<LhsScalar>::type  _LhsPacket;\n  typedef typename packet_traits<RhsScalar>::type  _RhsPacket;\n  typedef typename packet_traits<ResScalar>::type  _ResPacket;\n\n  typedef typename conditional<Vectorizable,_LhsPacket,LhsScalar>::type LhsPacket;\n  typedef typename conditional<Vectorizable,_RhsPacket,RhsScalar>::type RhsPacket;\n  typedef typename conditional<Vectorizable,_ResPacket,ResScalar>::type ResPacket;\n\n  typedef ResPacket AccPacket;\n\n  EIGEN_STRONG_INLINE void initAcc(AccPacket& p)\n  {\n    p = pset1<ResPacket>(ResScalar(0));\n  }\n\n  EIGEN_STRONG_INLINE void unpackRhs(DenseIndex n, const RhsScalar* rhs, RhsScalar* b)\n  {\n    for(DenseIndex k=0; k<n; k++)\n      pstore1<RhsPacket>(&b[k*RhsPacketSize], rhs[k]);\n  }\n\n  EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, RhsPacket& dest) const\n  {\n    dest = pload<RhsPacket>(b);\n  }\n\n  EIGEN_STRONG_INLINE void loadLhs(const LhsScalar* a, LhsPacket& dest) const\n  {\n    dest = pload<LhsPacket>(a);\n  }\n\n  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacket& b, AccPacket& c, RhsPacket& tmp) const\n  {\n    madd_impl(a, b, c, tmp, typename conditional<Vectorizable,true_type,false_type>::type());\n  }\n\n  EIGEN_STRONG_INLINE void madd_impl(const LhsPacket& a, const RhsPacket& b, AccPacket& c, RhsPacket& tmp, const true_type&) const\n  {\n    tmp = b; tmp = pmul(a.v,tmp); c.v = padd(c.v,tmp);\n  }\n\n  EIGEN_STRONG_INLINE void madd_impl(const LhsScalar& a, const RhsScalar& b, ResScalar& c, RhsScalar& /*tmp*/, const false_type&) const\n  {\n    c += a * b;\n  }\n\n  EIGEN_STRONG_INLINE void acc(const AccPacket& c, const ResPacket& alpha, ResPacket& r) const\n  {\n    r = cj.pmadd(c,alpha,r);\n  }\n\nprotected:\n  conj_helper<ResPacket,ResPacket,ConjLhs,false> cj;\n};\n\ntemplate<typename RealScalar, bool _ConjLhs, bool _ConjRhs>\nclass gebp_traits<std::complex<RealScalar>, std::complex<RealScalar>, _ConjLhs, _ConjRhs >\n{\npublic:\n  typedef std::complex<RealScalar>  Scalar;\n  typedef std::complex<RealScalar>  LhsScalar;\n  typedef std::complex<RealScalar>  RhsScalar;\n  typedef std::complex<RealScalar>  ResScalar;\n  \n  enum {\n    ConjLhs = _ConjLhs,\n    ConjRhs = _ConjRhs,\n    Vectorizable = packet_traits<RealScalar>::Vectorizable\n                && packet_traits<Scalar>::Vectorizable,\n    RealPacketSize  = Vectorizable ? packet_traits<RealScalar>::size : 1,\n    ResPacketSize   = Vectorizable ? packet_traits<ResScalar>::size : 1,\n    \n    nr = 2,\n    mr = 2 * ResPacketSize,\n    WorkSpaceFactor = Vectorizable ? 2*nr*RealPacketSize : nr,\n\n    LhsProgress = ResPacketSize,\n    RhsProgress = Vectorizable ? 2*ResPacketSize : 1\n  };\n  \n  typedef typename packet_traits<RealScalar>::type RealPacket;\n  typedef typename packet_traits<Scalar>::type     ScalarPacket;\n  struct DoublePacket\n  {\n    RealPacket first;\n    RealPacket second;\n  };\n\n  typedef typename conditional<Vectorizable,RealPacket,  Scalar>::type LhsPacket;\n  typedef typename conditional<Vectorizable,DoublePacket,Scalar>::type RhsPacket;\n  typedef typename conditional<Vectorizable,ScalarPacket,Scalar>::type ResPacket;\n  typedef typename conditional<Vectorizable,DoublePacket,Scalar>::type AccPacket;\n  \n  EIGEN_STRONG_INLINE void initAcc(Scalar& p) { p = Scalar(0); }\n\n  EIGEN_STRONG_INLINE void initAcc(DoublePacket& p)\n  {\n    p.first   = pset1<RealPacket>(RealScalar(0));\n    p.second  = pset1<RealPacket>(RealScalar(0));\n  }\n\n  /* Unpack the rhs coeff such that each complex coefficient is spread into\n   * two packects containing respectively the real and imaginary coefficient\n   * duplicated as many time as needed: (x+iy) => [x, ..., x] [y, ..., y]\n   */\n  EIGEN_STRONG_INLINE void unpackRhs(DenseIndex n, const Scalar* rhs, Scalar* b)\n  {\n    for(DenseIndex k=0; k<n; k++)\n    {\n      if(Vectorizable)\n      {\n        pstore1<RealPacket>((RealScalar*)&b[k*ResPacketSize*2+0],             real(rhs[k]));\n        pstore1<RealPacket>((RealScalar*)&b[k*ResPacketSize*2+ResPacketSize], imag(rhs[k]));\n      }\n      else\n        b[k] = rhs[k];\n    }\n  }\n\n  EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, ResPacket& dest) const { dest = *b; }\n\n  EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, DoublePacket& dest) const\n  {\n    dest.first  = pload<RealPacket>((const RealScalar*)b);\n    dest.second = pload<RealPacket>((const RealScalar*)(b+ResPacketSize));\n  }\n\n  // nothing special here\n  EIGEN_STRONG_INLINE void loadLhs(const LhsScalar* a, LhsPacket& dest) const\n  {\n    dest = pload<LhsPacket>((const typename unpacket_traits<LhsPacket>::type*)(a));\n  }\n\n  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacket& b, DoublePacket& c, RhsPacket& /*tmp*/) const\n  {\n    c.first   = padd(pmul(a,b.first), c.first);\n    c.second  = padd(pmul(a,b.second),c.second);\n  }\n\n  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacket& b, ResPacket& c, RhsPacket& /*tmp*/) const\n  {\n    c = cj.pmadd(a,b,c);\n  }\n  \n  EIGEN_STRONG_INLINE void acc(const Scalar& c, const Scalar& alpha, Scalar& r) const { r += alpha * c; }\n  \n  EIGEN_STRONG_INLINE void acc(const DoublePacket& c, const ResPacket& alpha, ResPacket& r) const\n  {\n    // assemble c\n    ResPacket tmp;\n    if((!ConjLhs)&&(!ConjRhs))\n    {\n      tmp = pcplxflip(pconj(ResPacket(c.second)));\n      tmp = padd(ResPacket(c.first),tmp);\n    }\n    else if((!ConjLhs)&&(ConjRhs))\n    {\n      tmp = pconj(pcplxflip(ResPacket(c.second)));\n      tmp = padd(ResPacket(c.first),tmp);\n    }\n    else if((ConjLhs)&&(!ConjRhs))\n    {\n      tmp = pcplxflip(ResPacket(c.second));\n      tmp = padd(pconj(ResPacket(c.first)),tmp);\n    }\n    else if((ConjLhs)&&(ConjRhs))\n    {\n      tmp = pcplxflip(ResPacket(c.second));\n      tmp = psub(pconj(ResPacket(c.first)),tmp);\n    }\n    \n    r = pmadd(tmp,alpha,r);\n  }\n\nprotected:\n  conj_helper<LhsScalar,RhsScalar,ConjLhs,ConjRhs> cj;\n};\n\ntemplate<typename RealScalar, bool _ConjRhs>\nclass gebp_traits<RealScalar, std::complex<RealScalar>, false, _ConjRhs >\n{\npublic:\n  typedef std::complex<RealScalar>  Scalar;\n  typedef RealScalar  LhsScalar;\n  typedef Scalar      RhsScalar;\n  typedef Scalar      ResScalar;\n\n  enum {\n    ConjLhs = false,\n    ConjRhs = _ConjRhs,\n    Vectorizable = packet_traits<RealScalar>::Vectorizable\n                && packet_traits<Scalar>::Vectorizable,\n    LhsPacketSize = Vectorizable ? packet_traits<LhsScalar>::size : 1,\n    RhsPacketSize = Vectorizable ? packet_traits<RhsScalar>::size : 1,\n    ResPacketSize = Vectorizable ? packet_traits<ResScalar>::size : 1,\n    \n    NumberOfRegisters = EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS,\n    nr = 4,\n    mr = 2*ResPacketSize,\n    WorkSpaceFactor = nr*RhsPacketSize,\n\n    LhsProgress = ResPacketSize,\n    RhsProgress = ResPacketSize\n  };\n\n  typedef typename packet_traits<LhsScalar>::type  _LhsPacket;\n  typedef typename packet_traits<RhsScalar>::type  _RhsPacket;\n  typedef typename packet_traits<ResScalar>::type  _ResPacket;\n\n  typedef typename conditional<Vectorizable,_LhsPacket,LhsScalar>::type LhsPacket;\n  typedef typename conditional<Vectorizable,_RhsPacket,RhsScalar>::type RhsPacket;\n  typedef typename conditional<Vectorizable,_ResPacket,ResScalar>::type ResPacket;\n\n  typedef ResPacket AccPacket;\n\n  EIGEN_STRONG_INLINE void initAcc(AccPacket& p)\n  {\n    p = pset1<ResPacket>(ResScalar(0));\n  }\n\n  EIGEN_STRONG_INLINE void unpackRhs(DenseIndex n, const RhsScalar* rhs, RhsScalar* b)\n  {\n    for(DenseIndex k=0; k<n; k++)\n      pstore1<RhsPacket>(&b[k*RhsPacketSize], rhs[k]);\n  }\n\n  EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, RhsPacket& dest) const\n  {\n    dest = pload<RhsPacket>(b);\n  }\n\n  EIGEN_STRONG_INLINE void loadLhs(const LhsScalar* a, LhsPacket& dest) const\n  {\n    dest = ploaddup<LhsPacket>(a);\n  }\n\n  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacket& b, AccPacket& c, RhsPacket& tmp) const\n  {\n    madd_impl(a, b, c, tmp, typename conditional<Vectorizable,true_type,false_type>::type());\n  }\n\n  EIGEN_STRONG_INLINE void madd_impl(const LhsPacket& a, const RhsPacket& b, AccPacket& c, RhsPacket& tmp, const true_type&) const\n  {\n    tmp = b; tmp.v = pmul(a,tmp.v); c = padd(c,tmp);\n  }\n\n  EIGEN_STRONG_INLINE void madd_impl(const LhsScalar& a, const RhsScalar& b, ResScalar& c, RhsScalar& /*tmp*/, const false_type&) const\n  {\n    c += a * b;\n  }\n\n  EIGEN_STRONG_INLINE void acc(const AccPacket& c, const ResPacket& alpha, ResPacket& r) const\n  {\n    r = cj.pmadd(alpha,c,r);\n  }\n\nprotected:\n  conj_helper<ResPacket,ResPacket,false,ConjRhs> cj;\n};\n\n/* optimized GEneral packed Block * packed Panel product kernel\n *\n * Mixing type logic: C += A * B\n *  |  A  |  B  | comments\n *  |real |cplx | no vectorization yet, would require to pack A with duplication\n *  |cplx |real | easy vectorization\n */\ntemplate<typename LhsScalar, typename RhsScalar, typename Index, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>\nstruct gebp_kernel\n{\n  typedef gebp_traits<LhsScalar,RhsScalar,ConjugateLhs,ConjugateRhs> Traits;\n  typedef typename Traits::ResScalar ResScalar;\n  typedef typename Traits::LhsPacket LhsPacket;\n  typedef typename Traits::RhsPacket RhsPacket;\n  typedef typename Traits::ResPacket ResPacket;\n  typedef typename Traits::AccPacket AccPacket;\n\n  enum {\n    Vectorizable  = Traits::Vectorizable,\n    LhsProgress   = Traits::LhsProgress,\n    RhsProgress   = Traits::RhsProgress,\n    ResPacketSize = Traits::ResPacketSize\n  };\n\n  EIGEN_DONT_INLINE\n  void operator()(ResScalar* res, Index resStride, const LhsScalar* blockA, const RhsScalar* blockB, Index rows, Index depth, Index cols, ResScalar alpha,\n                  Index strideA=-1, Index strideB=-1, Index offsetA=0, Index offsetB=0, RhsScalar* unpackedB=0);\n};\n\ntemplate<typename LhsScalar, typename RhsScalar, typename Index, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>\nEIGEN_DONT_INLINE\nvoid gebp_kernel<LhsScalar,RhsScalar,Index,mr,nr,ConjugateLhs,ConjugateRhs>\n  ::operator()(ResScalar* res, Index resStride, const LhsScalar* blockA, const RhsScalar* blockB, Index rows, Index depth, Index cols, ResScalar alpha,\n               Index strideA, Index strideB, Index offsetA, Index offsetB, RhsScalar* unpackedB)\n  {\n    Traits traits;\n    \n    if(strideA==-1) strideA = depth;\n    if(strideB==-1) strideB = depth;\n    conj_helper<LhsScalar,RhsScalar,ConjugateLhs,ConjugateRhs> cj;\n//     conj_helper<LhsPacket,RhsPacket,ConjugateLhs,ConjugateRhs> pcj;\n    Index packet_cols = (cols/nr) * nr;\n    const Index peeled_mc = (rows/mr)*mr;\n    // FIXME:\n    const Index peeled_mc2 = peeled_mc + (rows-peeled_mc >= LhsProgress ? LhsProgress : 0);\n    const Index peeled_kc = (depth/4)*4;\n\n    if(unpackedB==0)\n      unpackedB = const_cast<RhsScalar*>(blockB - strideB * nr * RhsProgress);\n\n    // loops on each micro vertical panel of rhs (depth x nr)\n    for(Index j2=0; j2<packet_cols; j2+=nr)\n    {\n      traits.unpackRhs(depth*nr,&blockB[j2*strideB+offsetB*nr],unpackedB); \n\n      // loops on each largest micro horizontal panel of lhs (mr x depth)\n      // => we select a mr x nr micro block of res which is entirely\n      //    stored into mr/packet_size x nr registers.\n      for(Index i=0; i<peeled_mc; i+=mr)\n      {\n        const LhsScalar* blA = &blockA[i*strideA+offsetA*mr];\n        prefetch(&blA[0]);\n\n        // gets res block as register\n        AccPacket C0, C1, C2, C3, C4, C5, C6, C7;\n                  traits.initAcc(C0);\n                  traits.initAcc(C1);\n        if(nr==4) traits.initAcc(C2);\n        if(nr==4) traits.initAcc(C3);\n                  traits.initAcc(C4);\n                  traits.initAcc(C5);\n        if(nr==4) traits.initAcc(C6);\n        if(nr==4) traits.initAcc(C7);\n\n        ResScalar* r0 = &res[(j2+0)*resStride + i];\n        ResScalar* r1 = r0 + resStride;\n        ResScalar* r2 = r1 + resStride;\n        ResScalar* r3 = r2 + resStride;\n\n        prefetch(r0+16);\n        prefetch(r1+16);\n        prefetch(r2+16);\n        prefetch(r3+16);\n\n        // performs \"inner\" product\n        // TODO let's check wether the folowing peeled loop could not be\n        //      optimized via optimal prefetching from one loop to the other\n        const RhsScalar* blB = unpackedB;\n        for(Index k=0; k<peeled_kc; k+=4)\n        {\n          if(nr==2)\n          {\n            LhsPacket A0, A1;\n            RhsPacket B_0;\n            RhsPacket T0;\n            \nEIGEN_ASM_COMMENT(\"mybegin2\");\n            traits.loadLhs(&blA[0*LhsProgress], A0);\n            traits.loadLhs(&blA[1*LhsProgress], A1);\n            traits.loadRhs(&blB[0*RhsProgress], B_0);\n            traits.madd(A0,B_0,C0,T0);\n            traits.madd(A1,B_0,C4,B_0);\n            traits.loadRhs(&blB[1*RhsProgress], B_0);\n            traits.madd(A0,B_0,C1,T0);\n            traits.madd(A1,B_0,C5,B_0);\n\n            traits.loadLhs(&blA[2*LhsProgress], A0);\n            traits.loadLhs(&blA[3*LhsProgress], A1);\n            traits.loadRhs(&blB[2*RhsProgress], B_0);\n            traits.madd(A0,B_0,C0,T0);\n            traits.madd(A1,B_0,C4,B_0);\n            traits.loadRhs(&blB[3*RhsProgress], B_0);\n            traits.madd(A0,B_0,C1,T0);\n            traits.madd(A1,B_0,C5,B_0);\n\n            traits.loadLhs(&blA[4*LhsProgress], A0);\n            traits.loadLhs(&blA[5*LhsProgress], A1);\n            traits.loadRhs(&blB[4*RhsProgress], B_0);\n            traits.madd(A0,B_0,C0,T0);\n            traits.madd(A1,B_0,C4,B_0);\n            traits.loadRhs(&blB[5*RhsProgress], B_0);\n            traits.madd(A0,B_0,C1,T0);\n            traits.madd(A1,B_0,C5,B_0);\n\n            traits.loadLhs(&blA[6*LhsProgress], A0);\n            traits.loadLhs(&blA[7*LhsProgress], A1);\n            traits.loadRhs(&blB[6*RhsProgress], B_0);\n            traits.madd(A0,B_0,C0,T0);\n            traits.madd(A1,B_0,C4,B_0);\n            traits.loadRhs(&blB[7*RhsProgress], B_0);\n            traits.madd(A0,B_0,C1,T0);\n            traits.madd(A1,B_0,C5,B_0);\nEIGEN_ASM_COMMENT(\"myend\");\n          }\n          else\n          {\nEIGEN_ASM_COMMENT(\"mybegin4\");\n            LhsPacket A0, A1;\n            RhsPacket B_0, B1, B2, B3;\n            RhsPacket T0;\n            \n            traits.loadLhs(&blA[0*LhsProgress], A0);\n            traits.loadLhs(&blA[1*LhsProgress], A1);\n            traits.loadRhs(&blB[0*RhsProgress], B_0);\n            traits.loadRhs(&blB[1*RhsProgress], B1);\n\n            traits.madd(A0,B_0,C0,T0);\n            traits.loadRhs(&blB[2*RhsProgress], B2);\n            traits.madd(A1,B_0,C4,B_0);\n            traits.loadRhs(&blB[3*RhsProgress], B3);\n            traits.loadRhs(&blB[4*RhsProgress], B_0);\n            traits.madd(A0,B1,C1,T0);\n            traits.madd(A1,B1,C5,B1);\n            traits.loadRhs(&blB[5*RhsProgress], B1);\n            traits.madd(A0,B2,C2,T0);\n            traits.madd(A1,B2,C6,B2);\n            traits.loadRhs(&blB[6*RhsProgress], B2);\n            traits.madd(A0,B3,C3,T0);\n            traits.loadLhs(&blA[2*LhsProgress], A0);\n            traits.madd(A1,B3,C7,B3);\n            traits.loadLhs(&blA[3*LhsProgress], A1);\n            traits.loadRhs(&blB[7*RhsProgress], B3);\n            traits.madd(A0,B_0,C0,T0);\n            traits.madd(A1,B_0,C4,B_0);\n            traits.loadRhs(&blB[8*RhsProgress], B_0);\n            traits.madd(A0,B1,C1,T0);\n            traits.madd(A1,B1,C5,B1);\n            traits.loadRhs(&blB[9*RhsProgress], B1);\n            traits.madd(A0,B2,C2,T0);\n            traits.madd(A1,B2,C6,B2);\n            traits.loadRhs(&blB[10*RhsProgress], B2);\n            traits.madd(A0,B3,C3,T0);\n            traits.loadLhs(&blA[4*LhsProgress], A0);\n            traits.madd(A1,B3,C7,B3);\n            traits.loadLhs(&blA[5*LhsProgress], A1);\n            traits.loadRhs(&blB[11*RhsProgress], B3);\n\n            traits.madd(A0,B_0,C0,T0);\n            traits.madd(A1,B_0,C4,B_0);\n            traits.loadRhs(&blB[12*RhsProgress], B_0);\n            traits.madd(A0,B1,C1,T0);\n            traits.madd(A1,B1,C5,B1);\n            traits.loadRhs(&blB[13*RhsProgress], B1);\n            traits.madd(A0,B2,C2,T0);\n            traits.madd(A1,B2,C6,B2);\n            traits.loadRhs(&blB[14*RhsProgress], B2);\n            traits.madd(A0,B3,C3,T0);\n            traits.loadLhs(&blA[6*LhsProgress], A0);\n            traits.madd(A1,B3,C7,B3);\n            traits.loadLhs(&blA[7*LhsProgress], A1);\n            traits.loadRhs(&blB[15*RhsProgress], B3);\n            traits.madd(A0,B_0,C0,T0);\n            traits.madd(A1,B_0,C4,B_0);\n            traits.madd(A0,B1,C1,T0);\n            traits.madd(A1,B1,C5,B1);\n            traits.madd(A0,B2,C2,T0);\n            traits.madd(A1,B2,C6,B2);\n            traits.madd(A0,B3,C3,T0);\n            traits.madd(A1,B3,C7,B3);\n          }\n\n          blB += 4*nr*RhsProgress;\n          blA += 4*mr;\n        }\n        // process remaining peeled loop\n        for(Index k=peeled_kc; k<depth; k++)\n        {\n          if(nr==2)\n          {\n            LhsPacket A0, A1;\n            RhsPacket B_0;\n            RhsPacket T0;\n\n            traits.loadLhs(&blA[0*LhsProgress], A0);\n            traits.loadLhs(&blA[1*LhsProgress], A1);\n            traits.loadRhs(&blB[0*RhsProgress], B_0);\n            traits.madd(A0,B_0,C0,T0);\n            traits.madd(A1,B_0,C4,B_0);\n            traits.loadRhs(&blB[1*RhsProgress], B_0);\n            traits.madd(A0,B_0,C1,T0);\n            traits.madd(A1,B_0,C5,B_0);\n          }\n          else\n          {\n            LhsPacket A0, A1;\n            RhsPacket B_0, B1, B2, B3;\n            RhsPacket T0;\n\n            traits.loadLhs(&blA[0*LhsProgress], A0);\n            traits.loadLhs(&blA[1*LhsProgress], A1);\n            traits.loadRhs(&blB[0*RhsProgress], B_0);\n            traits.loadRhs(&blB[1*RhsProgress], B1);\n\n            traits.madd(A0,B_0,C0,T0);\n            traits.loadRhs(&blB[2*RhsProgress], B2);\n            traits.madd(A1,B_0,C4,B_0);\n            traits.loadRhs(&blB[3*RhsProgress], B3);\n            traits.madd(A0,B1,C1,T0);\n            traits.madd(A1,B1,C5,B1);\n            traits.madd(A0,B2,C2,T0);\n            traits.madd(A1,B2,C6,B2);\n            traits.madd(A0,B3,C3,T0);\n            traits.madd(A1,B3,C7,B3);\n          }\n\n          blB += nr*RhsProgress;\n          blA += mr;\n        }\n\n        if(nr==4)\n        {\n          ResPacket R0, R1, R2, R3, R4, R5, R6;\n          ResPacket alphav = pset1<ResPacket>(alpha);\n\n          R0 = ploadu<ResPacket>(r0);\n          R1 = ploadu<ResPacket>(r1);\n          R2 = ploadu<ResPacket>(r2);\n          R3 = ploadu<ResPacket>(r3);\n          R4 = ploadu<ResPacket>(r0 + ResPacketSize);\n          R5 = ploadu<ResPacket>(r1 + ResPacketSize);\n          R6 = ploadu<ResPacket>(r2 + ResPacketSize);\n          traits.acc(C0, alphav, R0);\n          pstoreu(r0, R0);\n          R0 = ploadu<ResPacket>(r3 + ResPacketSize);\n\n          traits.acc(C1, alphav, R1);\n          traits.acc(C2, alphav, R2);\n          traits.acc(C3, alphav, R3);\n          traits.acc(C4, alphav, R4);\n          traits.acc(C5, alphav, R5);\n          traits.acc(C6, alphav, R6);\n          traits.acc(C7, alphav, R0);\n          \n          pstoreu(r1, R1);\n          pstoreu(r2, R2);\n          pstoreu(r3, R3);\n          pstoreu(r0 + ResPacketSize, R4);\n          pstoreu(r1 + ResPacketSize, R5);\n          pstoreu(r2 + ResPacketSize, R6);\n          pstoreu(r3 + ResPacketSize, R0);\n        }\n        else\n        {\n          ResPacket R0, R1, R4;\n          ResPacket alphav = pset1<ResPacket>(alpha);\n\n          R0 = ploadu<ResPacket>(r0);\n          R1 = ploadu<ResPacket>(r1);\n          R4 = ploadu<ResPacket>(r0 + ResPacketSize);\n          traits.acc(C0, alphav, R0);\n          pstoreu(r0, R0);\n          R0 = ploadu<ResPacket>(r1 + ResPacketSize);\n          traits.acc(C1, alphav, R1);\n          traits.acc(C4, alphav, R4);\n          traits.acc(C5, alphav, R0);\n          pstoreu(r1, R1);\n          pstoreu(r0 + ResPacketSize, R4);\n          pstoreu(r1 + ResPacketSize, R0);\n        }\n        \n      }\n      \n      if(rows-peeled_mc>=LhsProgress)\n      {\n        Index i = peeled_mc;\n        const LhsScalar* blA = &blockA[i*strideA+offsetA*LhsProgress];\n        prefetch(&blA[0]);\n\n        // gets res block as register\n        AccPacket C0, C1, C2, C3;\n                  traits.initAcc(C0);\n                  traits.initAcc(C1);\n        if(nr==4) traits.initAcc(C2);\n        if(nr==4) traits.initAcc(C3);\n\n        // performs \"inner\" product\n        const RhsScalar* blB = unpackedB;\n        for(Index k=0; k<peeled_kc; k+=4)\n        {\n          if(nr==2)\n          {\n            LhsPacket A0;\n            RhsPacket B_0, B1;\n\n            traits.loadLhs(&blA[0*LhsProgress], A0);\n            traits.loadRhs(&blB[0*RhsProgress], B_0);\n            traits.loadRhs(&blB[1*RhsProgress], B1);\n            traits.madd(A0,B_0,C0,B_0);\n            traits.loadRhs(&blB[2*RhsProgress], B_0);\n            traits.madd(A0,B1,C1,B1);\n            traits.loadLhs(&blA[1*LhsProgress], A0);\n            traits.loadRhs(&blB[3*RhsProgress], B1);\n            traits.madd(A0,B_0,C0,B_0);\n            traits.loadRhs(&blB[4*RhsProgress], B_0);\n            traits.madd(A0,B1,C1,B1);\n            traits.loadLhs(&blA[2*LhsProgress], A0);\n            traits.loadRhs(&blB[5*RhsProgress], B1);\n            traits.madd(A0,B_0,C0,B_0);\n            traits.loadRhs(&blB[6*RhsProgress], B_0);\n            traits.madd(A0,B1,C1,B1);\n            traits.loadLhs(&blA[3*LhsProgress], A0);\n            traits.loadRhs(&blB[7*RhsProgress], B1);\n            traits.madd(A0,B_0,C0,B_0);\n            traits.madd(A0,B1,C1,B1);\n          }\n          else\n          {\n            LhsPacket A0;\n            RhsPacket B_0, B1, B2, B3;\n\n            traits.loadLhs(&blA[0*LhsProgress], A0);\n            traits.loadRhs(&blB[0*RhsProgress], B_0);\n            traits.loadRhs(&blB[1*RhsProgress], B1);\n\n            traits.madd(A0,B_0,C0,B_0);\n            traits.loadRhs(&blB[2*RhsProgress], B2);\n            traits.loadRhs(&blB[3*RhsProgress], B3);\n            traits.loadRhs(&blB[4*RhsProgress], B_0);\n            traits.madd(A0,B1,C1,B1);\n            traits.loadRhs(&blB[5*RhsProgress], B1);\n            traits.madd(A0,B2,C2,B2);\n            traits.loadRhs(&blB[6*RhsProgress], B2);\n            traits.madd(A0,B3,C3,B3);\n            traits.loadLhs(&blA[1*LhsProgress], A0);\n            traits.loadRhs(&blB[7*RhsProgress], B3);\n            traits.madd(A0,B_0,C0,B_0);\n            traits.loadRhs(&blB[8*RhsProgress], B_0);\n            traits.madd(A0,B1,C1,B1);\n            traits.loadRhs(&blB[9*RhsProgress], B1);\n            traits.madd(A0,B2,C2,B2);\n            traits.loadRhs(&blB[10*RhsProgress], B2);\n            traits.madd(A0,B3,C3,B3);\n            traits.loadLhs(&blA[2*LhsProgress], A0);\n            traits.loadRhs(&blB[11*RhsProgress], B3);\n\n            traits.madd(A0,B_0,C0,B_0);\n            traits.loadRhs(&blB[12*RhsProgress], B_0);\n            traits.madd(A0,B1,C1,B1);\n            traits.loadRhs(&blB[13*RhsProgress], B1);\n            traits.madd(A0,B2,C2,B2);\n            traits.loadRhs(&blB[14*RhsProgress], B2);\n            traits.madd(A0,B3,C3,B3);\n\n            traits.loadLhs(&blA[3*LhsProgress], A0);\n            traits.loadRhs(&blB[15*RhsProgress], B3);\n            traits.madd(A0,B_0,C0,B_0);\n            traits.madd(A0,B1,C1,B1);\n            traits.madd(A0,B2,C2,B2);\n            traits.madd(A0,B3,C3,B3);\n          }\n\n          blB += nr*4*RhsProgress;\n          blA += 4*LhsProgress;\n        }\n        // process remaining peeled loop\n        for(Index k=peeled_kc; k<depth; k++)\n        {\n          if(nr==2)\n          {\n            LhsPacket A0;\n            RhsPacket B_0, B1;\n\n            traits.loadLhs(&blA[0*LhsProgress], A0);\n            traits.loadRhs(&blB[0*RhsProgress], B_0);\n            traits.loadRhs(&blB[1*RhsProgress], B1);\n            traits.madd(A0,B_0,C0,B_0);\n            traits.madd(A0,B1,C1,B1);\n          }\n          else\n          {\n            LhsPacket A0;\n            RhsPacket B_0, B1, B2, B3;\n\n            traits.loadLhs(&blA[0*LhsProgress], A0);\n            traits.loadRhs(&blB[0*RhsProgress], B_0);\n            traits.loadRhs(&blB[1*RhsProgress], B1);\n            traits.loadRhs(&blB[2*RhsProgress], B2);\n            traits.loadRhs(&blB[3*RhsProgress], B3);\n\n            traits.madd(A0,B_0,C0,B_0);\n            traits.madd(A0,B1,C1,B1);\n            traits.madd(A0,B2,C2,B2);\n            traits.madd(A0,B3,C3,B3);\n          }\n\n          blB += nr*RhsProgress;\n          blA += LhsProgress;\n        }\n\n        ResPacket R0, R1, R2, R3;\n        ResPacket alphav = pset1<ResPacket>(alpha);\n\n        ResScalar* r0 = &res[(j2+0)*resStride + i];\n        ResScalar* r1 = r0 + resStride;\n        ResScalar* r2 = r1 + resStride;\n        ResScalar* r3 = r2 + resStride;\n\n                  R0 = ploadu<ResPacket>(r0);\n                  R1 = ploadu<ResPacket>(r1);\n        if(nr==4) R2 = ploadu<ResPacket>(r2);\n        if(nr==4) R3 = ploadu<ResPacket>(r3);\n\n                  traits.acc(C0, alphav, R0);\n                  traits.acc(C1, alphav, R1);\n        if(nr==4) traits.acc(C2, alphav, R2);\n        if(nr==4) traits.acc(C3, alphav, R3);\n\n                  pstoreu(r0, R0);\n                  pstoreu(r1, R1);\n        if(nr==4) pstoreu(r2, R2);\n        if(nr==4) pstoreu(r3, R3);\n      }\n      for(Index i=peeled_mc2; i<rows; i++)\n      {\n        const LhsScalar* blA = &blockA[i*strideA+offsetA];\n        prefetch(&blA[0]);\n\n        // gets a 1 x nr res block as registers\n        ResScalar C0(0), C1(0), C2(0), C3(0);\n        // TODO directly use blockB ???\n        const RhsScalar* blB = &blockB[j2*strideB+offsetB*nr];\n        for(Index k=0; k<depth; k++)\n        {\n          if(nr==2)\n          {\n            LhsScalar A0;\n            RhsScalar B_0, B1;\n\n            A0 = blA[k];\n            B_0 = blB[0];\n            B1 = blB[1];\n            MADD(cj,A0,B_0,C0,B_0);\n            MADD(cj,A0,B1,C1,B1);\n          }\n          else\n          {\n            LhsScalar A0;\n            RhsScalar B_0, B1, B2, B3;\n\n            A0 = blA[k];\n            B_0 = blB[0];\n            B1 = blB[1];\n            B2 = blB[2];\n            B3 = blB[3];\n\n            MADD(cj,A0,B_0,C0,B_0);\n            MADD(cj,A0,B1,C1,B1);\n            MADD(cj,A0,B2,C2,B2);\n            MADD(cj,A0,B3,C3,B3);\n          }\n\n          blB += nr;\n        }\n                  res[(j2+0)*resStride + i] += alpha*C0;\n                  res[(j2+1)*resStride + i] += alpha*C1;\n        if(nr==4) res[(j2+2)*resStride + i] += alpha*C2;\n        if(nr==4) res[(j2+3)*resStride + i] += alpha*C3;\n      }\n    }\n    // process remaining rhs/res columns one at a time\n    // => do the same but with nr==1\n    for(Index j2=packet_cols; j2<cols; j2++)\n    {\n      // unpack B\n      traits.unpackRhs(depth, &blockB[j2*strideB+offsetB], unpackedB);\n\n      for(Index i=0; i<peeled_mc; i+=mr)\n      {\n        const LhsScalar* blA = &blockA[i*strideA+offsetA*mr];\n        prefetch(&blA[0]);\n\n        // TODO move the res loads to the stores\n\n        // get res block as registers\n        AccPacket C0, C4;\n        traits.initAcc(C0);\n        traits.initAcc(C4);\n\n        const RhsScalar* blB = unpackedB;\n        for(Index k=0; k<depth; k++)\n        {\n          LhsPacket A0, A1;\n          RhsPacket B_0;\n          RhsPacket T0;\n\n          traits.loadLhs(&blA[0*LhsProgress], A0);\n          traits.loadLhs(&blA[1*LhsProgress], A1);\n          traits.loadRhs(&blB[0*RhsProgress], B_0);\n          traits.madd(A0,B_0,C0,T0);\n          traits.madd(A1,B_0,C4,B_0);\n\n          blB += RhsProgress;\n          blA += 2*LhsProgress;\n        }\n        ResPacket R0, R4;\n        ResPacket alphav = pset1<ResPacket>(alpha);\n\n        ResScalar* r0 = &res[(j2+0)*resStride + i];\n\n        R0 = ploadu<ResPacket>(r0);\n        R4 = ploadu<ResPacket>(r0+ResPacketSize);\n\n        traits.acc(C0, alphav, R0);\n        traits.acc(C4, alphav, R4);\n\n        pstoreu(r0,               R0);\n        pstoreu(r0+ResPacketSize, R4);\n      }\n      if(rows-peeled_mc>=LhsProgress)\n      {\n        Index i = peeled_mc;\n        const LhsScalar* blA = &blockA[i*strideA+offsetA*LhsProgress];\n        prefetch(&blA[0]);\n\n        AccPacket C0;\n        traits.initAcc(C0);\n\n        const RhsScalar* blB = unpackedB;\n        for(Index k=0; k<depth; k++)\n        {\n          LhsPacket A0;\n          RhsPacket B_0;\n          traits.loadLhs(blA, A0);\n          traits.loadRhs(blB, B_0);\n          traits.madd(A0, B_0, C0, B_0);\n          blB += RhsProgress;\n          blA += LhsProgress;\n        }\n\n        ResPacket alphav = pset1<ResPacket>(alpha);\n        ResPacket R0 = ploadu<ResPacket>(&res[(j2+0)*resStride + i]);\n        traits.acc(C0, alphav, R0);\n        pstoreu(&res[(j2+0)*resStride + i], R0);\n      }\n      for(Index i=peeled_mc2; i<rows; i++)\n      {\n        const LhsScalar* blA = &blockA[i*strideA+offsetA];\n        prefetch(&blA[0]);\n\n        // gets a 1 x 1 res block as registers\n        ResScalar C0(0);\n        // FIXME directly use blockB ??\n        const RhsScalar* blB = &blockB[j2*strideB+offsetB];\n        for(Index k=0; k<depth; k++)\n        {\n          LhsScalar A0 = blA[k];\n          RhsScalar B_0 = blB[k];\n          MADD(cj, A0, B_0, C0, B_0);\n        }\n        res[(j2+0)*resStride + i] += alpha*C0;\n      }\n    }\n  }\n\n\n#undef CJMADD\n\n// pack a block of the lhs\n// The traversal is as follow (mr==4):\n//   0  4  8 12 ...\n//   1  5  9 13 ...\n//   2  6 10 14 ...\n//   3  7 11 15 ...\n//\n//  16 20 24 28 ...\n//  17 21 25 29 ...\n//  18 22 26 30 ...\n//  19 23 27 31 ...\n//\n//  32 33 34 35 ...\n//  36 36 38 39 ...\ntemplate<typename Scalar, typename Index, int Pack1, int Pack2, int StorageOrder, bool Conjugate, bool PanelMode>\nstruct gemm_pack_lhs\n{\n  EIGEN_DONT_INLINE void operator()(Scalar* blockA, const Scalar* EIGEN_RESTRICT _lhs, Index lhsStride, Index depth, Index rows, Index stride=0, Index offset=0);\n};\n\ntemplate<typename Scalar, typename Index, int Pack1, int Pack2, int StorageOrder, bool Conjugate, bool PanelMode>\nEIGEN_DONT_INLINE void gemm_pack_lhs<Scalar, Index, Pack1, Pack2, StorageOrder, Conjugate, PanelMode>\n  ::operator()(Scalar* blockA, const Scalar* EIGEN_RESTRICT _lhs, Index lhsStride, Index depth, Index rows, Index stride, Index offset)\n{\n  typedef typename packet_traits<Scalar>::type Packet;\n  enum { PacketSize = packet_traits<Scalar>::size };\n\n  EIGEN_ASM_COMMENT(\"EIGEN PRODUCT PACK LHS\");\n  EIGEN_UNUSED_VARIABLE(stride)\n  EIGEN_UNUSED_VARIABLE(offset)\n  eigen_assert(((!PanelMode) && stride==0 && offset==0) || (PanelMode && stride>=depth && offset<=stride));\n  eigen_assert( (StorageOrder==RowMajor) || ((Pack1%PacketSize)==0 && Pack1<=4*PacketSize) );\n  conj_if<NumTraits<Scalar>::IsComplex && Conjugate> cj;\n  const_blas_data_mapper<Scalar, Index, StorageOrder> lhs(_lhs,lhsStride);\n  Index count = 0;\n  Index peeled_mc = (rows/Pack1)*Pack1;\n  for(Index i=0; i<peeled_mc; i+=Pack1)\n  {\n    if(PanelMode) count += Pack1 * offset;\n\n    if(StorageOrder==ColMajor)\n    {\n      for(Index k=0; k<depth; k++)\n      {\n        Packet A, B, C, D;\n        if(Pack1>=1*PacketSize) A = ploadu<Packet>(&lhs(i+0*PacketSize, k));\n        if(Pack1>=2*PacketSize) B = ploadu<Packet>(&lhs(i+1*PacketSize, k));\n        if(Pack1>=3*PacketSize) C = ploadu<Packet>(&lhs(i+2*PacketSize, k));\n        if(Pack1>=4*PacketSize) D = ploadu<Packet>(&lhs(i+3*PacketSize, k));\n        if(Pack1>=1*PacketSize) { pstore(blockA+count, cj.pconj(A)); count+=PacketSize; }\n        if(Pack1>=2*PacketSize) { pstore(blockA+count, cj.pconj(B)); count+=PacketSize; }\n        if(Pack1>=3*PacketSize) { pstore(blockA+count, cj.pconj(C)); count+=PacketSize; }\n        if(Pack1>=4*PacketSize) { pstore(blockA+count, cj.pconj(D)); count+=PacketSize; }\n      }\n    }\n    else\n    {\n      for(Index k=0; k<depth; k++)\n      {\n        // TODO add a vectorized transpose here\n        Index w=0;\n        for(; w<Pack1-3; w+=4)\n        {\n          Scalar a(cj(lhs(i+w+0, k))),\n                  b(cj(lhs(i+w+1, k))),\n                  c(cj(lhs(i+w+2, k))),\n                  d(cj(lhs(i+w+3, k)));\n          blockA[count++] = a;\n          blockA[count++] = b;\n          blockA[count++] = c;\n          blockA[count++] = d;\n        }\n        if(Pack1%4)\n          for(;w<Pack1;++w)\n            blockA[count++] = cj(lhs(i+w, k));\n      }\n    }\n    if(PanelMode) count += Pack1 * (stride-offset-depth);\n  }\n  if(rows-peeled_mc>=Pack2)\n  {\n    if(PanelMode) count += Pack2*offset;\n    for(Index k=0; k<depth; k++)\n      for(Index w=0; w<Pack2; w++)\n        blockA[count++] = cj(lhs(peeled_mc+w, k));\n    if(PanelMode) count += Pack2 * (stride-offset-depth);\n    peeled_mc += Pack2;\n  }\n  for(Index i=peeled_mc; i<rows; i++)\n  {\n    if(PanelMode) count += offset;\n    for(Index k=0; k<depth; k++)\n      blockA[count++] = cj(lhs(i, k));\n    if(PanelMode) count += (stride-offset-depth);\n  }\n}\n\n// copy a complete panel of the rhs\n// this version is optimized for column major matrices\n// The traversal order is as follow: (nr==4):\n//  0  1  2  3   12 13 14 15   24 27\n//  4  5  6  7   16 17 18 19   25 28\n//  8  9 10 11   20 21 22 23   26 29\n//  .  .  .  .    .  .  .  .    .  .\ntemplate<typename Scalar, typename Index, int nr, bool Conjugate, bool PanelMode>\nstruct gemm_pack_rhs<Scalar, Index, nr, ColMajor, Conjugate, PanelMode>\n{\n  typedef typename packet_traits<Scalar>::type Packet;\n  enum { PacketSize = packet_traits<Scalar>::size };\n  EIGEN_DONT_INLINE void operator()(Scalar* blockB, const Scalar* rhs, Index rhsStride, Index depth, Index cols, Index stride=0, Index offset=0);\n};\n\ntemplate<typename Scalar, typename Index, int nr, bool Conjugate, bool PanelMode>\nEIGEN_DONT_INLINE void gemm_pack_rhs<Scalar, Index, nr, ColMajor, Conjugate, PanelMode>\n  ::operator()(Scalar* blockB, const Scalar* rhs, Index rhsStride, Index depth, Index cols, Index stride, Index offset)\n{\n  EIGEN_ASM_COMMENT(\"EIGEN PRODUCT PACK RHS COLMAJOR\");\n  EIGEN_UNUSED_VARIABLE(stride)\n  EIGEN_UNUSED_VARIABLE(offset)\n  eigen_assert(((!PanelMode) && stride==0 && offset==0) || (PanelMode && stride>=depth && offset<=stride));\n  conj_if<NumTraits<Scalar>::IsComplex && Conjugate> cj;\n  Index packet_cols = (cols/nr) * nr;\n  Index count = 0;\n  for(Index j2=0; j2<packet_cols; j2+=nr)\n  {\n    // skip what we have before\n    if(PanelMode) count += nr * offset;\n    const Scalar* b0 = &rhs[(j2+0)*rhsStride];\n    const Scalar* b1 = &rhs[(j2+1)*rhsStride];\n    const Scalar* b2 = &rhs[(j2+2)*rhsStride];\n    const Scalar* b3 = &rhs[(j2+3)*rhsStride];\n    for(Index k=0; k<depth; k++)\n    {\n                blockB[count+0] = cj(b0[k]);\n                blockB[count+1] = cj(b1[k]);\n      if(nr==4) blockB[count+2] = cj(b2[k]);\n      if(nr==4) blockB[count+3] = cj(b3[k]);\n      count += nr;\n    }\n    // skip what we have after\n    if(PanelMode) count += nr * (stride-offset-depth);\n  }\n\n  // copy the remaining columns one at a time (nr==1)\n  for(Index j2=packet_cols; j2<cols; ++j2)\n  {\n    if(PanelMode) count += offset;\n    const Scalar* b0 = &rhs[(j2+0)*rhsStride];\n    for(Index k=0; k<depth; k++)\n    {\n      blockB[count] = cj(b0[k]);\n      count += 1;\n    }\n    if(PanelMode) count += (stride-offset-depth);\n  }\n}\n\n// this version is optimized for row major matrices\ntemplate<typename Scalar, typename Index, int nr, bool Conjugate, bool PanelMode>\nstruct gemm_pack_rhs<Scalar, Index, nr, RowMajor, Conjugate, PanelMode>\n{\n  enum { PacketSize = packet_traits<Scalar>::size };\n  EIGEN_DONT_INLINE void operator()(Scalar* blockB, const Scalar* rhs, Index rhsStride, Index depth, Index cols, Index stride=0, Index offset=0);\n};\n\ntemplate<typename Scalar, typename Index, int nr, bool Conjugate, bool PanelMode>\nEIGEN_DONT_INLINE void gemm_pack_rhs<Scalar, Index, nr, RowMajor, Conjugate, PanelMode>\n  ::operator()(Scalar* blockB, const Scalar* rhs, Index rhsStride, Index depth, Index cols, Index stride, Index offset)\n{\n  EIGEN_ASM_COMMENT(\"EIGEN PRODUCT PACK RHS ROWMAJOR\");\n  EIGEN_UNUSED_VARIABLE(stride)\n  EIGEN_UNUSED_VARIABLE(offset)\n  eigen_assert(((!PanelMode) && stride==0 && offset==0) || (PanelMode && stride>=depth && offset<=stride));\n  conj_if<NumTraits<Scalar>::IsComplex && Conjugate> cj;\n  Index packet_cols = (cols/nr) * nr;\n  Index count = 0;\n  for(Index j2=0; j2<packet_cols; j2+=nr)\n  {\n    // skip what we have before\n    if(PanelMode) count += nr * offset;\n    for(Index k=0; k<depth; k++)\n    {\n      const Scalar* b0 = &rhs[k*rhsStride + j2];\n                blockB[count+0] = cj(b0[0]);\n                blockB[count+1] = cj(b0[1]);\n      if(nr==4) blockB[count+2] = cj(b0[2]);\n      if(nr==4) blockB[count+3] = cj(b0[3]);\n      count += nr;\n    }\n    // skip what we have after\n    if(PanelMode) count += nr * (stride-offset-depth);\n  }\n  // copy the remaining columns one at a time (nr==1)\n  for(Index j2=packet_cols; j2<cols; ++j2)\n  {\n    if(PanelMode) count += offset;\n    const Scalar* b0 = &rhs[j2];\n    for(Index k=0; k<depth; k++)\n    {\n      blockB[count] = cj(b0[k*rhsStride]);\n      count += 1;\n    }\n    if(PanelMode) count += stride-offset-depth;\n  }\n}\n\n} // end namespace internal\n\n/** \\returns the currently set level 1 cpu cache size (in bytes) used to estimate the ideal blocking size parameters.\n  * \\sa setCpuCacheSize */\ninline std::ptrdiff_t l1CacheSize()\n{\n  std::ptrdiff_t l1, l2;\n  internal::manage_caching_sizes(GetAction, &l1, &l2);\n  return l1;\n}\n\n/** \\returns the currently set level 2 cpu cache size (in bytes) used to estimate the ideal blocking size parameters.\n  * \\sa setCpuCacheSize */\ninline std::ptrdiff_t l2CacheSize()\n{\n  std::ptrdiff_t l1, l2;\n  internal::manage_caching_sizes(GetAction, &l1, &l2);\n  return l2;\n}\n\n/** Set the cpu L1 and L2 cache sizes (in bytes).\n  * These values are use to adjust the size of the blocks\n  * for the algorithms working per blocks.\n  *\n  * \\sa computeProductBlockingSizes */\ninline void setCpuCacheSizes(std::ptrdiff_t l1, std::ptrdiff_t l2)\n{\n  internal::manage_caching_sizes(SetAction, &l1, &l2);\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_GENERAL_BLOCK_PANEL_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/products/GeneralMatrixMatrix.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_GENERAL_MATRIX_MATRIX_H\n#define EIGEN_GENERAL_MATRIX_MATRIX_H\n\nnamespace Eigen { \n\nnamespace internal {\n\ntemplate<typename _LhsScalar, typename _RhsScalar> class level3_blocking;\n\n/* Specialization for a row-major destination matrix => simple transposition of the product */\ntemplate<\n  typename Index,\n  typename LhsScalar, int LhsStorageOrder, bool ConjugateLhs,\n  typename RhsScalar, int RhsStorageOrder, bool ConjugateRhs>\nstruct general_matrix_matrix_product<Index,LhsScalar,LhsStorageOrder,ConjugateLhs,RhsScalar,RhsStorageOrder,ConjugateRhs,RowMajor>\n{\n  typedef typename scalar_product_traits<LhsScalar, RhsScalar>::ReturnType ResScalar;\n  static EIGEN_STRONG_INLINE void run(\n    Index rows, Index cols, Index depth,\n    const LhsScalar* lhs, Index lhsStride,\n    const RhsScalar* rhs, Index rhsStride,\n    ResScalar* res, Index resStride,\n    ResScalar alpha,\n    level3_blocking<RhsScalar,LhsScalar>& blocking,\n    GemmParallelInfo<Index>* info = 0)\n  {\n    // transpose the product such that the result is column major\n    general_matrix_matrix_product<Index,\n      RhsScalar, RhsStorageOrder==RowMajor ? ColMajor : RowMajor, ConjugateRhs,\n      LhsScalar, LhsStorageOrder==RowMajor ? ColMajor : RowMajor, ConjugateLhs,\n      ColMajor>\n    ::run(cols,rows,depth,rhs,rhsStride,lhs,lhsStride,res,resStride,alpha,blocking,info);\n  }\n};\n\n/*  Specialization for a col-major destination matrix\n *    => Blocking algorithm following Goto's paper */\ntemplate<\n  typename Index,\n  typename LhsScalar, int LhsStorageOrder, bool ConjugateLhs,\n  typename RhsScalar, int RhsStorageOrder, bool ConjugateRhs>\nstruct general_matrix_matrix_product<Index,LhsScalar,LhsStorageOrder,ConjugateLhs,RhsScalar,RhsStorageOrder,ConjugateRhs,ColMajor>\n{\n\ntypedef typename scalar_product_traits<LhsScalar, RhsScalar>::ReturnType ResScalar;\nstatic void run(Index rows, Index cols, Index depth,\n  const LhsScalar* _lhs, Index lhsStride,\n  const RhsScalar* _rhs, Index rhsStride,\n  ResScalar* res, Index resStride,\n  ResScalar alpha,\n  level3_blocking<LhsScalar,RhsScalar>& blocking,\n  GemmParallelInfo<Index>* info = 0)\n{\n  const_blas_data_mapper<LhsScalar, Index, LhsStorageOrder> lhs(_lhs,lhsStride);\n  const_blas_data_mapper<RhsScalar, Index, RhsStorageOrder> rhs(_rhs,rhsStride);\n\n  typedef gebp_traits<LhsScalar,RhsScalar> Traits;\n\n  Index kc = blocking.kc();                   // cache block size along the K direction\n  Index mc = (std::min)(rows,blocking.mc());  // cache block size along the M direction\n  //Index nc = blocking.nc(); // cache block size along the N direction\n\n  gemm_pack_lhs<LhsScalar, Index, Traits::mr, Traits::LhsProgress, LhsStorageOrder> pack_lhs;\n  gemm_pack_rhs<RhsScalar, Index, Traits::nr, RhsStorageOrder> pack_rhs;\n  gebp_kernel<LhsScalar, RhsScalar, Index, Traits::mr, Traits::nr, ConjugateLhs, ConjugateRhs> gebp;\n\n#ifdef EIGEN_HAS_OPENMP\n  if(info)\n  {\n    // this is the parallel version!\n    Index tid = omp_get_thread_num();\n    Index threads = omp_get_num_threads();\n    \n    std::size_t sizeA = kc*mc;\n    std::size_t sizeW = kc*Traits::WorkSpaceFactor;\n    ei_declare_aligned_stack_constructed_variable(LhsScalar, blockA, sizeA, 0);\n    ei_declare_aligned_stack_constructed_variable(RhsScalar, w, sizeW, 0);\n    \n    RhsScalar* blockB = blocking.blockB();\n    eigen_internal_assert(blockB!=0);\n\n    // For each horizontal panel of the rhs, and corresponding vertical panel of the lhs...\n    for(Index k=0; k<depth; k+=kc)\n    {\n      const Index actual_kc = (std::min)(k+kc,depth)-k; // => rows of B', and cols of the A'\n\n      // In order to reduce the chance that a thread has to wait for the other,\n      // let's start by packing A'.\n      pack_lhs(blockA, &lhs(0,k), lhsStride, actual_kc, mc);\n\n      // Pack B_k to B' in a parallel fashion:\n      // each thread packs the sub block B_k,j to B'_j where j is the thread id.\n\n      // However, before copying to B'_j, we have to make sure that no other thread is still using it,\n      // i.e., we test that info[tid].users equals 0.\n      // Then, we set info[tid].users to the number of threads to mark that all other threads are going to use it.\n      while(info[tid].users!=0) {}\n      info[tid].users += threads;\n\n      pack_rhs(blockB+info[tid].rhs_start*actual_kc, &rhs(k,info[tid].rhs_start), rhsStride, actual_kc, info[tid].rhs_length);\n\n      // Notify the other threads that the part B'_j is ready to go.\n      info[tid].sync = k;\n\n      // Computes C_i += A' * B' per B'_j\n      for(Index shift=0; shift<threads; ++shift)\n      {\n        Index j = (tid+shift)%threads;\n\n        // At this point we have to make sure that B'_j has been updated by the thread j,\n        // we use testAndSetOrdered to mimic a volatile access.\n        // However, no need to wait for the B' part which has been updated by the current thread!\n        if(shift>0)\n          while(info[j].sync!=k) {}\n\n        gebp(res+info[j].rhs_start*resStride, resStride, blockA, blockB+info[j].rhs_start*actual_kc, mc, actual_kc, info[j].rhs_length, alpha, -1,-1,0,0, w);\n      }\n\n      // Then keep going as usual with the remaining A'\n      for(Index i=mc; i<rows; i+=mc)\n      {\n        const Index actual_mc = (std::min)(i+mc,rows)-i;\n\n        // pack A_i,k to A'\n        pack_lhs(blockA, &lhs(i,k), lhsStride, actual_kc, actual_mc);\n\n        // C_i += A' * B'\n        gebp(res+i, resStride, blockA, blockB, actual_mc, actual_kc, cols, alpha, -1,-1,0,0, w);\n      }\n\n      // Release all the sub blocks B'_j of B' for the current thread,\n      // i.e., we simply decrement the number of users by 1\n      for(Index j=0; j<threads; ++j)\n      {\n        #pragma omp atomic\n        info[j].users -= 1;\n      }\n    }\n  }\n  else\n#endif // EIGEN_HAS_OPENMP\n  {\n    EIGEN_UNUSED_VARIABLE(info);\n\n    // this is the sequential version!\n    std::size_t sizeA = kc*mc;\n    std::size_t sizeB = kc*cols;\n    std::size_t sizeW = kc*Traits::WorkSpaceFactor;\n\n    ei_declare_aligned_stack_constructed_variable(LhsScalar, blockA, sizeA, blocking.blockA());\n    ei_declare_aligned_stack_constructed_variable(RhsScalar, blockB, sizeB, blocking.blockB());\n    ei_declare_aligned_stack_constructed_variable(RhsScalar, blockW, sizeW, blocking.blockW());\n\n    // For each horizontal panel of the rhs, and corresponding panel of the lhs...\n    // (==GEMM_VAR1)\n    for(Index k2=0; k2<depth; k2+=kc)\n    {\n      const Index actual_kc = (std::min)(k2+kc,depth)-k2;\n\n      // OK, here we have selected one horizontal panel of rhs and one vertical panel of lhs.\n      // => Pack rhs's panel into a sequential chunk of memory (L2 caching)\n      // Note that this panel will be read as many times as the number of blocks in the lhs's\n      // vertical panel which is, in practice, a very low number.\n      pack_rhs(blockB, &rhs(k2,0), rhsStride, actual_kc, cols);\n\n      // For each mc x kc block of the lhs's vertical panel...\n      // (==GEPP_VAR1)\n      for(Index i2=0; i2<rows; i2+=mc)\n      {\n        const Index actual_mc = (std::min)(i2+mc,rows)-i2;\n\n        // We pack the lhs's block into a sequential chunk of memory (L1 caching)\n        // Note that this block will be read a very high number of times, which is equal to the number of\n        // micro vertical panel of the large rhs's panel (e.g., cols/4 times).\n        pack_lhs(blockA, &lhs(i2,k2), lhsStride, actual_kc, actual_mc);\n\n        // Everything is packed, we can now call the block * panel kernel:\n        gebp(res+i2, resStride, blockA, blockB, actual_mc, actual_kc, cols, alpha, -1, -1, 0, 0, blockW);\n      }\n    }\n  }\n}\n\n};\n\n/*********************************************************************************\n*  Specialization of GeneralProduct<> for \"large\" GEMM, i.e.,\n*  implementation of the high level wrapper to general_matrix_matrix_product\n**********************************************************************************/\n\ntemplate<typename Lhs, typename Rhs>\nstruct traits<GeneralProduct<Lhs,Rhs,GemmProduct> >\n : traits<ProductBase<GeneralProduct<Lhs,Rhs,GemmProduct>, Lhs, Rhs> >\n{};\n\ntemplate<typename Scalar, typename Index, typename Gemm, typename Lhs, typename Rhs, typename Dest, typename BlockingType>\nstruct gemm_functor\n{\n  gemm_functor(const Lhs& lhs, const Rhs& rhs, Dest& dest, const Scalar& actualAlpha,\n                  BlockingType& blocking)\n    : m_lhs(lhs), m_rhs(rhs), m_dest(dest), m_actualAlpha(actualAlpha), m_blocking(blocking)\n  {}\n\n  void initParallelSession() const\n  {\n    m_blocking.allocateB();\n  }\n\n  void operator() (Index row, Index rows, Index col=0, Index cols=-1, GemmParallelInfo<Index>* info=0) const\n  {\n    if(cols==-1)\n      cols = m_rhs.cols();\n\n    Gemm::run(rows, cols, m_lhs.cols(),\n              /*(const Scalar*)*/&m_lhs.coeffRef(row,0), m_lhs.outerStride(),\n              /*(const Scalar*)*/&m_rhs.coeffRef(0,col), m_rhs.outerStride(),\n              (Scalar*)&(m_dest.coeffRef(row,col)), m_dest.outerStride(),\n              m_actualAlpha, m_blocking, info);\n  }\n\n  protected:\n    const Lhs& m_lhs;\n    const Rhs& m_rhs;\n    Dest& m_dest;\n    Scalar m_actualAlpha;\n    BlockingType& m_blocking;\n};\n\ntemplate<int StorageOrder, typename LhsScalar, typename RhsScalar, int MaxRows, int MaxCols, int MaxDepth, int KcFactor=1,\nbool FiniteAtCompileTime = MaxRows!=Dynamic && MaxCols!=Dynamic && MaxDepth != Dynamic> class gemm_blocking_space;\n\ntemplate<typename _LhsScalar, typename _RhsScalar>\nclass level3_blocking\n{\n    typedef _LhsScalar LhsScalar;\n    typedef _RhsScalar RhsScalar;\n\n  protected:\n    LhsScalar* m_blockA;\n    RhsScalar* m_blockB;\n    RhsScalar* m_blockW;\n\n    DenseIndex m_mc;\n    DenseIndex m_nc;\n    DenseIndex m_kc;\n\n  public:\n\n    level3_blocking()\n      : m_blockA(0), m_blockB(0), m_blockW(0), m_mc(0), m_nc(0), m_kc(0)\n    {}\n\n    inline DenseIndex mc() const { return m_mc; }\n    inline DenseIndex nc() const { return m_nc; }\n    inline DenseIndex kc() const { return m_kc; }\n\n    inline LhsScalar* blockA() { return m_blockA; }\n    inline RhsScalar* blockB() { return m_blockB; }\n    inline RhsScalar* blockW() { return m_blockW; }\n};\n\ntemplate<int StorageOrder, typename _LhsScalar, typename _RhsScalar, int MaxRows, int MaxCols, int MaxDepth, int KcFactor>\nclass gemm_blocking_space<StorageOrder,_LhsScalar,_RhsScalar,MaxRows, MaxCols, MaxDepth, KcFactor, true>\n  : public level3_blocking<\n      typename conditional<StorageOrder==RowMajor,_RhsScalar,_LhsScalar>::type,\n      typename conditional<StorageOrder==RowMajor,_LhsScalar,_RhsScalar>::type>\n{\n    enum {\n      Transpose = StorageOrder==RowMajor,\n      ActualRows = Transpose ? MaxCols : MaxRows,\n      ActualCols = Transpose ? MaxRows : MaxCols\n    };\n    typedef typename conditional<Transpose,_RhsScalar,_LhsScalar>::type LhsScalar;\n    typedef typename conditional<Transpose,_LhsScalar,_RhsScalar>::type RhsScalar;\n    typedef gebp_traits<LhsScalar,RhsScalar> Traits;\n    enum {\n      SizeA = ActualRows * MaxDepth,\n      SizeB = ActualCols * MaxDepth,\n      SizeW = MaxDepth * Traits::WorkSpaceFactor\n    };\n\n    EIGEN_ALIGN16 LhsScalar m_staticA[SizeA];\n    EIGEN_ALIGN16 RhsScalar m_staticB[SizeB];\n    EIGEN_ALIGN16 RhsScalar m_staticW[SizeW];\n\n  public:\n\n    gemm_blocking_space(DenseIndex /*rows*/, DenseIndex /*cols*/, DenseIndex /*depth*/)\n    {\n      this->m_mc = ActualRows;\n      this->m_nc = ActualCols;\n      this->m_kc = MaxDepth;\n      this->m_blockA = m_staticA;\n      this->m_blockB = m_staticB;\n      this->m_blockW = m_staticW;\n    }\n\n    inline void allocateA() {}\n    inline void allocateB() {}\n    inline void allocateW() {}\n    inline void allocateAll() {}\n};\n\ntemplate<int StorageOrder, typename _LhsScalar, typename _RhsScalar, int MaxRows, int MaxCols, int MaxDepth, int KcFactor>\nclass gemm_blocking_space<StorageOrder,_LhsScalar,_RhsScalar,MaxRows, MaxCols, MaxDepth, KcFactor, false>\n  : public level3_blocking<\n      typename conditional<StorageOrder==RowMajor,_RhsScalar,_LhsScalar>::type,\n      typename conditional<StorageOrder==RowMajor,_LhsScalar,_RhsScalar>::type>\n{\n    enum {\n      Transpose = StorageOrder==RowMajor\n    };\n    typedef typename conditional<Transpose,_RhsScalar,_LhsScalar>::type LhsScalar;\n    typedef typename conditional<Transpose,_LhsScalar,_RhsScalar>::type RhsScalar;\n    typedef gebp_traits<LhsScalar,RhsScalar> Traits;\n\n    DenseIndex m_sizeA;\n    DenseIndex m_sizeB;\n    DenseIndex m_sizeW;\n\n  public:\n\n    gemm_blocking_space(DenseIndex rows, DenseIndex cols, DenseIndex depth)\n    {\n      this->m_mc = Transpose ? cols : rows;\n      this->m_nc = Transpose ? rows : cols;\n      this->m_kc = depth;\n\n      computeProductBlockingSizes<LhsScalar,RhsScalar,KcFactor>(this->m_kc, this->m_mc, this->m_nc);\n      m_sizeA = this->m_mc * this->m_kc;\n      m_sizeB = this->m_kc * this->m_nc;\n      m_sizeW = this->m_kc*Traits::WorkSpaceFactor;\n    }\n\n    void allocateA()\n    {\n      if(this->m_blockA==0)\n        this->m_blockA = aligned_new<LhsScalar>(m_sizeA);\n    }\n\n    void allocateB()\n    {\n      if(this->m_blockB==0)\n        this->m_blockB = aligned_new<RhsScalar>(m_sizeB);\n    }\n\n    void allocateW()\n    {\n      if(this->m_blockW==0)\n        this->m_blockW = aligned_new<RhsScalar>(m_sizeW);\n    }\n\n    void allocateAll()\n    {\n      allocateA();\n      allocateB();\n      allocateW();\n    }\n\n    ~gemm_blocking_space()\n    {\n      aligned_delete(this->m_blockA, m_sizeA);\n      aligned_delete(this->m_blockB, m_sizeB);\n      aligned_delete(this->m_blockW, m_sizeW);\n    }\n};\n\n} // end namespace internal\n\ntemplate<typename Lhs, typename Rhs>\nclass GeneralProduct<Lhs, Rhs, GemmProduct>\n  : public ProductBase<GeneralProduct<Lhs,Rhs,GemmProduct>, Lhs, Rhs>\n{\n    enum {\n      MaxDepthAtCompileTime = EIGEN_SIZE_MIN_PREFER_FIXED(Lhs::MaxColsAtCompileTime,Rhs::MaxRowsAtCompileTime)\n    };\n  public:\n    EIGEN_PRODUCT_PUBLIC_INTERFACE(GeneralProduct)\n    \n    typedef typename  Lhs::Scalar LhsScalar;\n    typedef typename  Rhs::Scalar RhsScalar;\n    typedef           Scalar      ResScalar;\n\n    GeneralProduct(const Lhs& lhs, const Rhs& rhs) : Base(lhs,rhs)\n    {\n#if !(defined(EIGEN_NO_STATIC_ASSERT) && defined(EIGEN_NO_DEBUG))\n      typedef internal::scalar_product_op<LhsScalar,RhsScalar> BinOp;\n      EIGEN_CHECK_BINARY_COMPATIBILIY(BinOp,LhsScalar,RhsScalar);\n#endif\n    }\n\n    template<typename Dest> void scaleAndAddTo(Dest& dst, const Scalar& alpha) const\n    {\n      eigen_assert(dst.rows()==m_lhs.rows() && dst.cols()==m_rhs.cols());\n      if(m_lhs.cols()==0 || m_lhs.rows()==0 || m_rhs.cols()==0)\n        return;\n\n      typename internal::add_const_on_value_type<ActualLhsType>::type lhs = LhsBlasTraits::extract(m_lhs);\n      typename internal::add_const_on_value_type<ActualRhsType>::type rhs = RhsBlasTraits::extract(m_rhs);\n\n      Scalar actualAlpha = alpha * LhsBlasTraits::extractScalarFactor(m_lhs)\n                                 * RhsBlasTraits::extractScalarFactor(m_rhs);\n\n      typedef internal::gemm_blocking_space<(Dest::Flags&RowMajorBit) ? RowMajor : ColMajor,LhsScalar,RhsScalar,\n              Dest::MaxRowsAtCompileTime,Dest::MaxColsAtCompileTime,MaxDepthAtCompileTime> BlockingType;\n\n      typedef internal::gemm_functor<\n        Scalar, Index,\n        internal::general_matrix_matrix_product<\n          Index,\n          LhsScalar, (_ActualLhsType::Flags&RowMajorBit) ? RowMajor : ColMajor, bool(LhsBlasTraits::NeedToConjugate),\n          RhsScalar, (_ActualRhsType::Flags&RowMajorBit) ? RowMajor : ColMajor, bool(RhsBlasTraits::NeedToConjugate),\n          (Dest::Flags&RowMajorBit) ? RowMajor : ColMajor>,\n        _ActualLhsType, _ActualRhsType, Dest, BlockingType> GemmFunctor;\n\n      BlockingType blocking(dst.rows(), dst.cols(), lhs.cols());\n\n      internal::parallelize_gemm<(Dest::MaxRowsAtCompileTime>32 || Dest::MaxRowsAtCompileTime==Dynamic)>(GemmFunctor(lhs, rhs, dst, actualAlpha, blocking), this->rows(), this->cols(), Dest::Flags&RowMajorBit);\n    }\n};\n\n} // end namespace Eigen\n\n#endif // EIGEN_GENERAL_MATRIX_MATRIX_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_GENERAL_MATRIX_MATRIX_TRIANGULAR_H\n#define EIGEN_GENERAL_MATRIX_MATRIX_TRIANGULAR_H\n\nnamespace Eigen { \n\ntemplate<typename Scalar, typename Index, int StorageOrder, int UpLo, bool ConjLhs, bool ConjRhs>\nstruct selfadjoint_rank1_update;\n\nnamespace internal {\n\n/**********************************************************************\n* This file implements a general A * B product while\n* evaluating only one triangular part of the product.\n* This is more general version of self adjoint product (C += A A^T)\n* as the level 3 SYRK Blas routine.\n**********************************************************************/\n\n// forward declarations (defined at the end of this file)\ntemplate<typename LhsScalar, typename RhsScalar, typename Index, int mr, int nr, bool ConjLhs, bool ConjRhs, int UpLo>\nstruct tribb_kernel;\n  \n/* Optimized matrix-matrix product evaluating only one triangular half */\ntemplate <typename Index,\n          typename LhsScalar, int LhsStorageOrder, bool ConjugateLhs,\n          typename RhsScalar, int RhsStorageOrder, bool ConjugateRhs,\n                              int ResStorageOrder, int  UpLo, int Version = Specialized>\nstruct general_matrix_matrix_triangular_product;\n\n// as usual if the result is row major => we transpose the product\ntemplate <typename Index, typename LhsScalar, int LhsStorageOrder, bool ConjugateLhs,\n                          typename RhsScalar, int RhsStorageOrder, bool ConjugateRhs, int  UpLo, int Version>\nstruct general_matrix_matrix_triangular_product<Index,LhsScalar,LhsStorageOrder,ConjugateLhs,RhsScalar,RhsStorageOrder,ConjugateRhs,RowMajor,UpLo,Version>\n{\n  typedef typename scalar_product_traits<LhsScalar, RhsScalar>::ReturnType ResScalar;\n  static EIGEN_STRONG_INLINE void run(Index size, Index depth,const LhsScalar* lhs, Index lhsStride,\n                                      const RhsScalar* rhs, Index rhsStride, ResScalar* res, Index resStride, const ResScalar& alpha)\n  {\n    general_matrix_matrix_triangular_product<Index,\n        RhsScalar, RhsStorageOrder==RowMajor ? ColMajor : RowMajor, ConjugateRhs,\n        LhsScalar, LhsStorageOrder==RowMajor ? ColMajor : RowMajor, ConjugateLhs,\n        ColMajor, UpLo==Lower?Upper:Lower>\n      ::run(size,depth,rhs,rhsStride,lhs,lhsStride,res,resStride,alpha);\n  }\n};\n\ntemplate <typename Index, typename LhsScalar, int LhsStorageOrder, bool ConjugateLhs,\n                          typename RhsScalar, int RhsStorageOrder, bool ConjugateRhs, int  UpLo, int Version>\nstruct general_matrix_matrix_triangular_product<Index,LhsScalar,LhsStorageOrder,ConjugateLhs,RhsScalar,RhsStorageOrder,ConjugateRhs,ColMajor,UpLo,Version>\n{\n  typedef typename scalar_product_traits<LhsScalar, RhsScalar>::ReturnType ResScalar;\n  static EIGEN_STRONG_INLINE void run(Index size, Index depth,const LhsScalar* _lhs, Index lhsStride,\n                                      const RhsScalar* _rhs, Index rhsStride, ResScalar* res, Index resStride, const ResScalar& alpha)\n  {\n    const_blas_data_mapper<LhsScalar, Index, LhsStorageOrder> lhs(_lhs,lhsStride);\n    const_blas_data_mapper<RhsScalar, Index, RhsStorageOrder> rhs(_rhs,rhsStride);\n\n    typedef gebp_traits<LhsScalar,RhsScalar> Traits;\n\n    Index kc = depth; // cache block size along the K direction\n    Index mc = size;  // cache block size along the M direction\n    Index nc = size;  // cache block size along the N direction\n    computeProductBlockingSizes<LhsScalar,RhsScalar>(kc, mc, nc);\n    // !!! mc must be a multiple of nr:\n    if(mc > Traits::nr)\n      mc = (mc/Traits::nr)*Traits::nr;\n\n    std::size_t sizeW = kc*Traits::WorkSpaceFactor;\n    std::size_t sizeB = sizeW + kc*size;\n    ei_declare_aligned_stack_constructed_variable(LhsScalar, blockA, kc*mc, 0);\n    ei_declare_aligned_stack_constructed_variable(RhsScalar, allocatedBlockB, sizeB, 0);\n    RhsScalar* blockB = allocatedBlockB + sizeW;\n    \n    gemm_pack_lhs<LhsScalar, Index, Traits::mr, Traits::LhsProgress, LhsStorageOrder> pack_lhs;\n    gemm_pack_rhs<RhsScalar, Index, Traits::nr, RhsStorageOrder> pack_rhs;\n    gebp_kernel <LhsScalar, RhsScalar, Index, Traits::mr, Traits::nr, ConjugateLhs, ConjugateRhs> gebp;\n    tribb_kernel<LhsScalar, RhsScalar, Index, Traits::mr, Traits::nr, ConjugateLhs, ConjugateRhs, UpLo> sybb;\n\n    for(Index k2=0; k2<depth; k2+=kc)\n    {\n      const Index actual_kc = (std::min)(k2+kc,depth)-k2;\n\n      // note that the actual rhs is the transpose/adjoint of mat\n      pack_rhs(blockB, &rhs(k2,0), rhsStride, actual_kc, size);\n\n      for(Index i2=0; i2<size; i2+=mc)\n      {\n        const Index actual_mc = (std::min)(i2+mc,size)-i2;\n\n        pack_lhs(blockA, &lhs(i2, k2), lhsStride, actual_kc, actual_mc);\n\n        // the selected actual_mc * size panel of res is split into three different part:\n        //  1 - before the diagonal => processed with gebp or skipped\n        //  2 - the actual_mc x actual_mc symmetric block => processed with a special kernel\n        //  3 - after the diagonal => processed with gebp or skipped\n        if (UpLo==Lower)\n          gebp(res+i2, resStride, blockA, blockB, actual_mc, actual_kc, (std::min)(size,i2), alpha,\n               -1, -1, 0, 0, allocatedBlockB);\n\n        sybb(res+resStride*i2 + i2, resStride, blockA, blockB + actual_kc*i2, actual_mc, actual_kc, alpha, allocatedBlockB);\n\n        if (UpLo==Upper)\n        {\n          Index j2 = i2+actual_mc;\n          gebp(res+resStride*j2+i2, resStride, blockA, blockB+actual_kc*j2, actual_mc, actual_kc, (std::max)(Index(0), size-j2), alpha,\n               -1, -1, 0, 0, allocatedBlockB);\n        }\n      }\n    }\n  }\n};\n\n// Optimized packed Block * packed Block product kernel evaluating only one given triangular part\n// This kernel is built on top of the gebp kernel:\n// - the current destination block is processed per panel of actual_mc x BlockSize\n//   where BlockSize is set to the minimal value allowing gebp to be as fast as possible\n// - then, as usual, each panel is split into three parts along the diagonal,\n//   the sub blocks above and below the diagonal are processed as usual,\n//   while the triangular block overlapping the diagonal is evaluated into a\n//   small temporary buffer which is then accumulated into the result using a\n//   triangular traversal.\ntemplate<typename LhsScalar, typename RhsScalar, typename Index, int mr, int nr, bool ConjLhs, bool ConjRhs, int UpLo>\nstruct tribb_kernel\n{\n  typedef gebp_traits<LhsScalar,RhsScalar,ConjLhs,ConjRhs> Traits;\n  typedef typename Traits::ResScalar ResScalar;\n  \n  enum {\n    BlockSize  = EIGEN_PLAIN_ENUM_MAX(mr,nr)\n  };\n  void operator()(ResScalar* res, Index resStride, const LhsScalar* blockA, const RhsScalar* blockB, Index size, Index depth, const ResScalar& alpha, RhsScalar* workspace)\n  {\n    gebp_kernel<LhsScalar, RhsScalar, Index, mr, nr, ConjLhs, ConjRhs> gebp_kernel;\n    Matrix<ResScalar,BlockSize,BlockSize,ColMajor> buffer;\n\n    // let's process the block per panel of actual_mc x BlockSize,\n    // again, each is split into three parts, etc.\n    for (Index j=0; j<size; j+=BlockSize)\n    {\n      Index actualBlockSize = std::min<Index>(BlockSize,size - j);\n      const RhsScalar* actual_b = blockB+j*depth;\n\n      if(UpLo==Upper)\n        gebp_kernel(res+j*resStride, resStride, blockA, actual_b, j, depth, actualBlockSize, alpha,\n                    -1, -1, 0, 0, workspace);\n\n      // selfadjoint micro block\n      {\n        Index i = j;\n        buffer.setZero();\n        // 1 - apply the kernel on the temporary buffer\n        gebp_kernel(buffer.data(), BlockSize, blockA+depth*i, actual_b, actualBlockSize, depth, actualBlockSize, alpha,\n                    -1, -1, 0, 0, workspace);\n        // 2 - triangular accumulation\n        for(Index j1=0; j1<actualBlockSize; ++j1)\n        {\n          ResScalar* r = res + (j+j1)*resStride + i;\n          for(Index i1=UpLo==Lower ? j1 : 0;\n              UpLo==Lower ? i1<actualBlockSize : i1<=j1; ++i1)\n            r[i1] += buffer(i1,j1);\n        }\n      }\n\n      if(UpLo==Lower)\n      {\n        Index i = j+actualBlockSize;\n        gebp_kernel(res+j*resStride+i, resStride, blockA+depth*i, actual_b, size-i, depth, actualBlockSize, alpha,\n                    -1, -1, 0, 0, workspace);\n      }\n    }\n  }\n};\n\n} // end namespace internal\n\n// high level API\n\ntemplate<typename MatrixType, typename ProductType, int UpLo, bool IsOuterProduct>\nstruct general_product_to_triangular_selector;\n\n\ntemplate<typename MatrixType, typename ProductType, int UpLo>\nstruct general_product_to_triangular_selector<MatrixType,ProductType,UpLo,true>\n{\n  static void run(MatrixType& mat, const ProductType& prod, const typename MatrixType::Scalar& alpha)\n  {\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename MatrixType::Index Index;\n    \n    typedef typename internal::remove_all<typename ProductType::LhsNested>::type Lhs;\n    typedef internal::blas_traits<Lhs> LhsBlasTraits;\n    typedef typename LhsBlasTraits::DirectLinearAccessType ActualLhs;\n    typedef typename internal::remove_all<ActualLhs>::type _ActualLhs;\n    typename internal::add_const_on_value_type<ActualLhs>::type actualLhs = LhsBlasTraits::extract(prod.lhs());\n    \n    typedef typename internal::remove_all<typename ProductType::RhsNested>::type Rhs;\n    typedef internal::blas_traits<Rhs> RhsBlasTraits;\n    typedef typename RhsBlasTraits::DirectLinearAccessType ActualRhs;\n    typedef typename internal::remove_all<ActualRhs>::type _ActualRhs;\n    typename internal::add_const_on_value_type<ActualRhs>::type actualRhs = RhsBlasTraits::extract(prod.rhs());\n\n    Scalar actualAlpha = alpha * LhsBlasTraits::extractScalarFactor(prod.lhs().derived()) * RhsBlasTraits::extractScalarFactor(prod.rhs().derived());\n\n    enum {\n      StorageOrder = (internal::traits<MatrixType>::Flags&RowMajorBit) ? RowMajor : ColMajor,\n      UseLhsDirectly = _ActualLhs::InnerStrideAtCompileTime==1,\n      UseRhsDirectly = _ActualRhs::InnerStrideAtCompileTime==1\n    };\n    \n    internal::gemv_static_vector_if<Scalar,Lhs::SizeAtCompileTime,Lhs::MaxSizeAtCompileTime,!UseLhsDirectly> static_lhs;\n    ei_declare_aligned_stack_constructed_variable(Scalar, actualLhsPtr, actualLhs.size(),\n      (UseLhsDirectly ? const_cast<Scalar*>(actualLhs.data()) : static_lhs.data()));\n    if(!UseLhsDirectly) Map<typename _ActualLhs::PlainObject>(actualLhsPtr, actualLhs.size()) = actualLhs;\n    \n    internal::gemv_static_vector_if<Scalar,Rhs::SizeAtCompileTime,Rhs::MaxSizeAtCompileTime,!UseRhsDirectly> static_rhs;\n    ei_declare_aligned_stack_constructed_variable(Scalar, actualRhsPtr, actualRhs.size(),\n      (UseRhsDirectly ? const_cast<Scalar*>(actualRhs.data()) : static_rhs.data()));\n    if(!UseRhsDirectly) Map<typename _ActualRhs::PlainObject>(actualRhsPtr, actualRhs.size()) = actualRhs;\n    \n    \n    selfadjoint_rank1_update<Scalar,Index,StorageOrder,UpLo,\n                              LhsBlasTraits::NeedToConjugate && NumTraits<Scalar>::IsComplex,\n                              RhsBlasTraits::NeedToConjugate && NumTraits<Scalar>::IsComplex>\n          ::run(actualLhs.size(), mat.data(), mat.outerStride(), actualLhsPtr, actualRhsPtr, actualAlpha);\n  }\n};\n\ntemplate<typename MatrixType, typename ProductType, int UpLo>\nstruct general_product_to_triangular_selector<MatrixType,ProductType,UpLo,false>\n{\n  static void run(MatrixType& mat, const ProductType& prod, const typename MatrixType::Scalar& alpha)\n  {\n    typedef typename MatrixType::Index Index;\n    \n    typedef typename internal::remove_all<typename ProductType::LhsNested>::type Lhs;\n    typedef internal::blas_traits<Lhs> LhsBlasTraits;\n    typedef typename LhsBlasTraits::DirectLinearAccessType ActualLhs;\n    typedef typename internal::remove_all<ActualLhs>::type _ActualLhs;\n    typename internal::add_const_on_value_type<ActualLhs>::type actualLhs = LhsBlasTraits::extract(prod.lhs());\n    \n    typedef typename internal::remove_all<typename ProductType::RhsNested>::type Rhs;\n    typedef internal::blas_traits<Rhs> RhsBlasTraits;\n    typedef typename RhsBlasTraits::DirectLinearAccessType ActualRhs;\n    typedef typename internal::remove_all<ActualRhs>::type _ActualRhs;\n    typename internal::add_const_on_value_type<ActualRhs>::type actualRhs = RhsBlasTraits::extract(prod.rhs());\n\n    typename ProductType::Scalar actualAlpha = alpha * LhsBlasTraits::extractScalarFactor(prod.lhs().derived()) * RhsBlasTraits::extractScalarFactor(prod.rhs().derived());\n\n    internal::general_matrix_matrix_triangular_product<Index,\n      typename Lhs::Scalar, _ActualLhs::Flags&RowMajorBit ? RowMajor : ColMajor, LhsBlasTraits::NeedToConjugate,\n      typename Rhs::Scalar, _ActualRhs::Flags&RowMajorBit ? RowMajor : ColMajor, RhsBlasTraits::NeedToConjugate,\n      MatrixType::Flags&RowMajorBit ? RowMajor : ColMajor, UpLo>\n      ::run(mat.cols(), actualLhs.cols(),\n            &actualLhs.coeffRef(0,0), actualLhs.outerStride(), &actualRhs.coeffRef(0,0), actualRhs.outerStride(),\n            mat.data(), mat.outerStride(), actualAlpha);\n  }\n};\n\ntemplate<typename MatrixType, unsigned int UpLo>\ntemplate<typename ProductDerived, typename _Lhs, typename _Rhs>\nTriangularView<MatrixType,UpLo>& TriangularView<MatrixType,UpLo>::assignProduct(const ProductBase<ProductDerived, _Lhs,_Rhs>& prod, const Scalar& alpha)\n{\n  general_product_to_triangular_selector<MatrixType, ProductDerived, UpLo, (_Lhs::ColsAtCompileTime==1) || (_Rhs::RowsAtCompileTime==1)>::run(m_matrix.const_cast_derived(), prod.derived(), alpha);\n  \n  return *this;\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_GENERAL_MATRIX_MATRIX_TRIANGULAR_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_MKL.h",
    "content": "/*\n Copyright (c) 2011, Intel Corporation. All rights reserved.\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n * Neither the name of Intel Corporation nor the names of its contributors may\n   be used to endorse or promote products derived from this software without\n   specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\n ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n ********************************************************************************\n *   Content : Eigen bindings to Intel(R) MKL\n *   Level 3 BLAS SYRK/HERK implementation.\n ********************************************************************************\n*/\n\n#ifndef EIGEN_GENERAL_MATRIX_MATRIX_TRIANGULAR_MKL_H\n#define EIGEN_GENERAL_MATRIX_MATRIX_TRIANGULAR_MKL_H\n\nnamespace Eigen { \n\nnamespace internal {\n\ntemplate <typename Index, typename Scalar, int AStorageOrder, bool ConjugateA, int ResStorageOrder, int  UpLo>\nstruct general_matrix_matrix_rankupdate :\n       general_matrix_matrix_triangular_product<\n         Index,Scalar,AStorageOrder,ConjugateA,Scalar,AStorageOrder,ConjugateA,ResStorageOrder,UpLo,BuiltIn> {};\n\n\n// try to go to BLAS specialization\n#define EIGEN_MKL_RANKUPDATE_SPECIALIZE(Scalar) \\\ntemplate <typename Index, int LhsStorageOrder, bool ConjugateLhs, \\\n                          int RhsStorageOrder, bool ConjugateRhs, int  UpLo> \\\nstruct general_matrix_matrix_triangular_product<Index,Scalar,LhsStorageOrder,ConjugateLhs, \\\n               Scalar,RhsStorageOrder,ConjugateRhs,ColMajor,UpLo,Specialized> { \\\n  static EIGEN_STRONG_INLINE void run(Index size, Index depth,const Scalar* lhs, Index lhsStride, \\\n                          const Scalar* rhs, Index rhsStride, Scalar* res, Index resStride, Scalar alpha) \\\n  { \\\n    if (lhs==rhs) { \\\n      general_matrix_matrix_rankupdate<Index,Scalar,LhsStorageOrder,ConjugateLhs,ColMajor,UpLo> \\\n      ::run(size,depth,lhs,lhsStride,rhs,rhsStride,res,resStride,alpha); \\\n    } else { \\\n      general_matrix_matrix_triangular_product<Index, \\\n        Scalar, LhsStorageOrder, ConjugateLhs, \\\n        Scalar, RhsStorageOrder, ConjugateRhs, \\\n        ColMajor, UpLo, BuiltIn> \\\n      ::run(size,depth,lhs,lhsStride,rhs,rhsStride,res,resStride,alpha); \\\n    } \\\n  } \\\n};\n\nEIGEN_MKL_RANKUPDATE_SPECIALIZE(double)\n//EIGEN_MKL_RANKUPDATE_SPECIALIZE(dcomplex)\nEIGEN_MKL_RANKUPDATE_SPECIALIZE(float)\n//EIGEN_MKL_RANKUPDATE_SPECIALIZE(scomplex)\n\n// SYRK for float/double\n#define EIGEN_MKL_RANKUPDATE_R(EIGTYPE, MKLTYPE, MKLFUNC) \\\ntemplate <typename Index, int AStorageOrder, bool ConjugateA, int  UpLo> \\\nstruct general_matrix_matrix_rankupdate<Index,EIGTYPE,AStorageOrder,ConjugateA,ColMajor,UpLo> { \\\n  enum { \\\n    IsLower = (UpLo&Lower) == Lower, \\\n    LowUp = IsLower ? Lower : Upper, \\\n    conjA = ((AStorageOrder==ColMajor) && ConjugateA) ? 1 : 0 \\\n  }; \\\n  static EIGEN_STRONG_INLINE void run(Index size, Index depth,const EIGTYPE* lhs, Index lhsStride, \\\n                          const EIGTYPE* rhs, Index rhsStride, EIGTYPE* res, Index resStride, EIGTYPE alpha) \\\n  { \\\n  /* typedef Matrix<EIGTYPE, Dynamic, Dynamic, RhsStorageOrder> MatrixRhs;*/ \\\n\\\n   MKL_INT lda=lhsStride, ldc=resStride, n=size, k=depth; \\\n   char uplo=(IsLower) ? 'L' : 'U', trans=(AStorageOrder==RowMajor) ? 'T':'N'; \\\n   MKLTYPE alpha_, beta_; \\\n\\\n/* Set alpha_ & beta_ */ \\\n   assign_scalar_eig2mkl<MKLTYPE, EIGTYPE>(alpha_, alpha); \\\n   assign_scalar_eig2mkl<MKLTYPE, EIGTYPE>(beta_, EIGTYPE(1)); \\\n   MKLFUNC(&uplo, &trans, &n, &k, &alpha_, lhs, &lda, &beta_, res, &ldc); \\\n  } \\\n};\n\n// HERK for complex data\n#define EIGEN_MKL_RANKUPDATE_C(EIGTYPE, MKLTYPE, RTYPE, MKLFUNC) \\\ntemplate <typename Index, int AStorageOrder, bool ConjugateA, int  UpLo> \\\nstruct general_matrix_matrix_rankupdate<Index,EIGTYPE,AStorageOrder,ConjugateA,ColMajor,UpLo> { \\\n  enum { \\\n    IsLower = (UpLo&Lower) == Lower, \\\n    LowUp = IsLower ? Lower : Upper, \\\n    conjA = (((AStorageOrder==ColMajor) && ConjugateA) || ((AStorageOrder==RowMajor) && !ConjugateA)) ? 1 : 0 \\\n  }; \\\n  static EIGEN_STRONG_INLINE void run(Index size, Index depth,const EIGTYPE* lhs, Index lhsStride, \\\n                          const EIGTYPE* rhs, Index rhsStride, EIGTYPE* res, Index resStride, EIGTYPE alpha) \\\n  { \\\n   typedef Matrix<EIGTYPE, Dynamic, Dynamic, AStorageOrder> MatrixType; \\\n\\\n   MKL_INT lda=lhsStride, ldc=resStride, n=size, k=depth; \\\n   char uplo=(IsLower) ? 'L' : 'U', trans=(AStorageOrder==RowMajor) ? 'C':'N'; \\\n   RTYPE alpha_, beta_; \\\n   const EIGTYPE* a_ptr; \\\n\\\n/* Set alpha_ & beta_ */ \\\n/*   assign_scalar_eig2mkl<MKLTYPE, EIGTYPE>(alpha_, alpha); */\\\n/*   assign_scalar_eig2mkl<MKLTYPE, EIGTYPE>(beta_, EIGTYPE(1));*/ \\\n   alpha_ = alpha.real(); \\\n   beta_ = 1.0; \\\n/* Copy with conjugation in some cases*/ \\\n   MatrixType a; \\\n   if (conjA) { \\\n     Map<const MatrixType, 0, OuterStride<> > mapA(lhs,n,k,OuterStride<>(lhsStride)); \\\n     a = mapA.conjugate(); \\\n     lda = a.outerStride(); \\\n     a_ptr = a.data(); \\\n   } else a_ptr=lhs; \\\n   MKLFUNC(&uplo, &trans, &n, &k, &alpha_, (MKLTYPE*)a_ptr, &lda, &beta_, (MKLTYPE*)res, &ldc); \\\n  } \\\n};\n\n\nEIGEN_MKL_RANKUPDATE_R(double, double, dsyrk)\nEIGEN_MKL_RANKUPDATE_R(float,  float,  ssyrk)\n\n//EIGEN_MKL_RANKUPDATE_C(dcomplex, MKL_Complex16, double, zherk)\n//EIGEN_MKL_RANKUPDATE_C(scomplex, MKL_Complex8,  double, cherk)\n\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_GENERAL_MATRIX_MATRIX_TRIANGULAR_MKL_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/products/GeneralMatrixMatrix_MKL.h",
    "content": "/*\n Copyright (c) 2011, Intel Corporation. All rights reserved.\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n * Neither the name of Intel Corporation nor the names of its contributors may\n   be used to endorse or promote products derived from this software without\n   specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\n ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n ********************************************************************************\n *   Content : Eigen bindings to Intel(R) MKL\n *   General matrix-matrix product functionality based on ?GEMM.\n ********************************************************************************\n*/\n\n#ifndef EIGEN_GENERAL_MATRIX_MATRIX_MKL_H\n#define EIGEN_GENERAL_MATRIX_MATRIX_MKL_H\n\nnamespace Eigen { \n\nnamespace internal {\n\n/**********************************************************************\n* This file implements general matrix-matrix multiplication using BLAS\n* gemm function via partial specialization of\n* general_matrix_matrix_product::run(..) method for float, double,\n* std::complex<float> and std::complex<double> types\n**********************************************************************/\n\n// gemm specialization\n\n#define GEMM_SPECIALIZATION(EIGTYPE, EIGPREFIX, MKLTYPE, MKLPREFIX) \\\ntemplate< \\\n  typename Index, \\\n  int LhsStorageOrder, bool ConjugateLhs, \\\n  int RhsStorageOrder, bool ConjugateRhs> \\\nstruct general_matrix_matrix_product<Index,EIGTYPE,LhsStorageOrder,ConjugateLhs,EIGTYPE,RhsStorageOrder,ConjugateRhs,ColMajor> \\\n{ \\\nstatic void run(Index rows, Index cols, Index depth, \\\n  const EIGTYPE* _lhs, Index lhsStride, \\\n  const EIGTYPE* _rhs, Index rhsStride, \\\n  EIGTYPE* res, Index resStride, \\\n  EIGTYPE alpha, \\\n  level3_blocking<EIGTYPE, EIGTYPE>& /*blocking*/, \\\n  GemmParallelInfo<Index>* /*info = 0*/) \\\n{ \\\n  using std::conj; \\\n\\\n  char transa, transb; \\\n  MKL_INT m, n, k, lda, ldb, ldc; \\\n  const EIGTYPE *a, *b; \\\n  MKLTYPE alpha_, beta_; \\\n  MatrixX##EIGPREFIX a_tmp, b_tmp; \\\n  EIGTYPE myone(1);\\\n\\\n/* Set transpose options */ \\\n  transa = (LhsStorageOrder==RowMajor) ? ((ConjugateLhs) ? 'C' : 'T') : 'N'; \\\n  transb = (RhsStorageOrder==RowMajor) ? ((ConjugateRhs) ? 'C' : 'T') : 'N'; \\\n\\\n/* Set m, n, k */ \\\n  m = (MKL_INT)rows;  \\\n  n = (MKL_INT)cols;  \\\n  k = (MKL_INT)depth; \\\n\\\n/* Set alpha_ & beta_ */ \\\n  assign_scalar_eig2mkl(alpha_, alpha); \\\n  assign_scalar_eig2mkl(beta_, myone); \\\n\\\n/* Set lda, ldb, ldc */ \\\n  lda = (MKL_INT)lhsStride; \\\n  ldb = (MKL_INT)rhsStride; \\\n  ldc = (MKL_INT)resStride; \\\n\\\n/* Set a, b, c */ \\\n  if ((LhsStorageOrder==ColMajor) && (ConjugateLhs)) { \\\n    Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > lhs(_lhs,m,k,OuterStride<>(lhsStride)); \\\n    a_tmp = lhs.conjugate(); \\\n    a = a_tmp.data(); \\\n    lda = a_tmp.outerStride(); \\\n  } else a = _lhs; \\\n\\\n  if ((RhsStorageOrder==ColMajor) && (ConjugateRhs)) { \\\n    Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > rhs(_rhs,k,n,OuterStride<>(rhsStride)); \\\n    b_tmp = rhs.conjugate(); \\\n    b = b_tmp.data(); \\\n    ldb = b_tmp.outerStride(); \\\n  } else b = _rhs; \\\n\\\n  MKLPREFIX##gemm(&transa, &transb, &m, &n, &k, &alpha_, (const MKLTYPE*)a, &lda, (const MKLTYPE*)b, &ldb, &beta_, (MKLTYPE*)res, &ldc); \\\n}};\n\nGEMM_SPECIALIZATION(double,   d,  double,        d)\nGEMM_SPECIALIZATION(float,    f,  float,         s)\nGEMM_SPECIALIZATION(dcomplex, cd, MKL_Complex16, z)\nGEMM_SPECIALIZATION(scomplex, cf, MKL_Complex8,  c)\n\n} // end namespase internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_GENERAL_MATRIX_MATRIX_MKL_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/products/GeneralMatrixVector.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_GENERAL_MATRIX_VECTOR_H\n#define EIGEN_GENERAL_MATRIX_VECTOR_H\n\nnamespace Eigen { \n\nnamespace internal {\n\n/* Optimized col-major matrix * vector product:\n * This algorithm processes 4 columns at onces that allows to both reduce\n * the number of load/stores of the result by a factor 4 and to reduce\n * the instruction dependency. Moreover, we know that all bands have the\n * same alignment pattern.\n *\n * Mixing type logic: C += alpha * A * B\n *  |  A  |  B  |alpha| comments\n *  |real |cplx |cplx | no vectorization\n *  |real |cplx |real | alpha is converted to a cplx when calling the run function, no vectorization\n *  |cplx |real |cplx | invalid, the caller has to do tmp: = A * B; C += alpha*tmp\n *  |cplx |real |real | optimal case, vectorization possible via real-cplx mul\n */\ntemplate<typename Index, typename LhsScalar, bool ConjugateLhs, typename RhsScalar, bool ConjugateRhs, int Version>\nstruct general_matrix_vector_product<Index,LhsScalar,ColMajor,ConjugateLhs,RhsScalar,ConjugateRhs,Version>\n{\ntypedef typename scalar_product_traits<LhsScalar, RhsScalar>::ReturnType ResScalar;\n\nenum {\n  Vectorizable = packet_traits<LhsScalar>::Vectorizable && packet_traits<RhsScalar>::Vectorizable\n              && int(packet_traits<LhsScalar>::size)==int(packet_traits<RhsScalar>::size),\n  LhsPacketSize = Vectorizable ? packet_traits<LhsScalar>::size : 1,\n  RhsPacketSize = Vectorizable ? packet_traits<RhsScalar>::size : 1,\n  ResPacketSize = Vectorizable ? packet_traits<ResScalar>::size : 1\n};\n\ntypedef typename packet_traits<LhsScalar>::type  _LhsPacket;\ntypedef typename packet_traits<RhsScalar>::type  _RhsPacket;\ntypedef typename packet_traits<ResScalar>::type  _ResPacket;\n\ntypedef typename conditional<Vectorizable,_LhsPacket,LhsScalar>::type LhsPacket;\ntypedef typename conditional<Vectorizable,_RhsPacket,RhsScalar>::type RhsPacket;\ntypedef typename conditional<Vectorizable,_ResPacket,ResScalar>::type ResPacket;\n\nEIGEN_DONT_INLINE static void run(\n  Index rows, Index cols,\n  const LhsScalar* lhs, Index lhsStride,\n  const RhsScalar* rhs, Index rhsIncr,\n  ResScalar* res, Index resIncr, RhsScalar alpha);\n};\n\ntemplate<typename Index, typename LhsScalar, bool ConjugateLhs, typename RhsScalar, bool ConjugateRhs, int Version>\nEIGEN_DONT_INLINE void general_matrix_vector_product<Index,LhsScalar,ColMajor,ConjugateLhs,RhsScalar,ConjugateRhs,Version>::run(\n  Index rows, Index cols,\n  const LhsScalar* lhs, Index lhsStride,\n  const RhsScalar* rhs, Index rhsIncr,\n  ResScalar* res, Index resIncr, RhsScalar alpha)\n{\n  EIGEN_UNUSED_VARIABLE(resIncr)\n  eigen_internal_assert(resIncr==1);\n  #ifdef _EIGEN_ACCUMULATE_PACKETS\n  #error _EIGEN_ACCUMULATE_PACKETS has already been defined\n  #endif\n  #define _EIGEN_ACCUMULATE_PACKETS(A0,A13,A2) \\\n    pstore(&res[j], \\\n      padd(pload<ResPacket>(&res[j]), \\\n        padd( \\\n          padd(pcj.pmul(EIGEN_CAT(ploa , A0)<LhsPacket>(&lhs0[j]),    ptmp0), \\\n                  pcj.pmul(EIGEN_CAT(ploa , A13)<LhsPacket>(&lhs1[j]),   ptmp1)), \\\n          padd(pcj.pmul(EIGEN_CAT(ploa , A2)<LhsPacket>(&lhs2[j]),    ptmp2), \\\n                  pcj.pmul(EIGEN_CAT(ploa , A13)<LhsPacket>(&lhs3[j]),   ptmp3)) )))\n\n  conj_helper<LhsScalar,RhsScalar,ConjugateLhs,ConjugateRhs> cj;\n  conj_helper<LhsPacket,RhsPacket,ConjugateLhs,ConjugateRhs> pcj;\n  if(ConjugateRhs)\n    alpha = numext::conj(alpha);\n\n  enum { AllAligned = 0, EvenAligned, FirstAligned, NoneAligned };\n  const Index columnsAtOnce = 4;\n  const Index peels = 2;\n  const Index LhsPacketAlignedMask = LhsPacketSize-1;\n  const Index ResPacketAlignedMask = ResPacketSize-1;\n//  const Index PeelAlignedMask = ResPacketSize*peels-1;\n  const Index size = rows;\n  \n  // How many coeffs of the result do we have to skip to be aligned.\n  // Here we assume data are at least aligned on the base scalar type.\n  Index alignedStart = internal::first_aligned(res,size);\n  Index alignedSize = ResPacketSize>1 ? alignedStart + ((size-alignedStart) & ~ResPacketAlignedMask) : 0;\n  const Index peeledSize = alignedSize - RhsPacketSize*peels - RhsPacketSize + 1;\n\n  const Index alignmentStep = LhsPacketSize>1 ? (LhsPacketSize - lhsStride % LhsPacketSize) & LhsPacketAlignedMask : 0;\n  Index alignmentPattern = alignmentStep==0 ? AllAligned\n                       : alignmentStep==(LhsPacketSize/2) ? EvenAligned\n                       : FirstAligned;\n\n  // we cannot assume the first element is aligned because of sub-matrices\n  const Index lhsAlignmentOffset = internal::first_aligned(lhs,size);\n\n  // find how many columns do we have to skip to be aligned with the result (if possible)\n  Index skipColumns = 0;\n  // if the data cannot be aligned (TODO add some compile time tests when possible, e.g. for floats)\n  if( (size_t(lhs)%sizeof(LhsScalar)) || (size_t(res)%sizeof(ResScalar)) )\n  {\n    alignedSize = 0;\n    alignedStart = 0;\n  }\n  else if (LhsPacketSize>1)\n  {\n    eigen_internal_assert(size_t(lhs+lhsAlignmentOffset)%sizeof(LhsPacket)==0 || size<LhsPacketSize);\n\n    while (skipColumns<LhsPacketSize &&\n          alignedStart != ((lhsAlignmentOffset + alignmentStep*skipColumns)%LhsPacketSize))\n      ++skipColumns;\n    if (skipColumns==LhsPacketSize)\n    {\n      // nothing can be aligned, no need to skip any column\n      alignmentPattern = NoneAligned;\n      skipColumns = 0;\n    }\n    else\n    {\n      skipColumns = (std::min)(skipColumns,cols);\n      // note that the skiped columns are processed later.\n    }\n\n    eigen_internal_assert(  (alignmentPattern==NoneAligned)\n                      || (skipColumns + columnsAtOnce >= cols)\n                      || LhsPacketSize > size\n                      || (size_t(lhs+alignedStart+lhsStride*skipColumns)%sizeof(LhsPacket))==0);\n  }\n  else if(Vectorizable)\n  {\n    alignedStart = 0;\n    alignedSize = size;\n    alignmentPattern = AllAligned;\n  }\n\n  Index offset1 = (FirstAligned && alignmentStep==1?3:1);\n  Index offset3 = (FirstAligned && alignmentStep==1?1:3);\n\n  Index columnBound = ((cols-skipColumns)/columnsAtOnce)*columnsAtOnce + skipColumns;\n  for (Index i=skipColumns; i<columnBound; i+=columnsAtOnce)\n  {\n    RhsPacket ptmp0 = pset1<RhsPacket>(alpha*rhs[i*rhsIncr]),\n              ptmp1 = pset1<RhsPacket>(alpha*rhs[(i+offset1)*rhsIncr]),\n              ptmp2 = pset1<RhsPacket>(alpha*rhs[(i+2)*rhsIncr]),\n              ptmp3 = pset1<RhsPacket>(alpha*rhs[(i+offset3)*rhsIncr]);\n\n    // this helps a lot generating better binary code\n    const LhsScalar *lhs0 = lhs + i*lhsStride,     *lhs1 = lhs + (i+offset1)*lhsStride,\n                    *lhs2 = lhs + (i+2)*lhsStride, *lhs3 = lhs + (i+offset3)*lhsStride;\n\n    if (Vectorizable)\n    {\n      /* explicit vectorization */\n      // process initial unaligned coeffs\n      for (Index j=0; j<alignedStart; ++j)\n      {\n        res[j] = cj.pmadd(lhs0[j], pfirst(ptmp0), res[j]);\n        res[j] = cj.pmadd(lhs1[j], pfirst(ptmp1), res[j]);\n        res[j] = cj.pmadd(lhs2[j], pfirst(ptmp2), res[j]);\n        res[j] = cj.pmadd(lhs3[j], pfirst(ptmp3), res[j]);\n      }\n\n      if (alignedSize>alignedStart)\n      {\n        switch(alignmentPattern)\n        {\n          case AllAligned:\n            for (Index j = alignedStart; j<alignedSize; j+=ResPacketSize)\n              _EIGEN_ACCUMULATE_PACKETS(d,d,d);\n            break;\n          case EvenAligned:\n            for (Index j = alignedStart; j<alignedSize; j+=ResPacketSize)\n              _EIGEN_ACCUMULATE_PACKETS(d,du,d);\n            break;\n          case FirstAligned:\n          {\n            Index j = alignedStart;\n            if(peels>1)\n            {\n              LhsPacket A00, A01, A02, A03, A10, A11, A12, A13;\n              ResPacket T0, T1;\n\n              A01 = pload<LhsPacket>(&lhs1[alignedStart-1]);\n              A02 = pload<LhsPacket>(&lhs2[alignedStart-2]);\n              A03 = pload<LhsPacket>(&lhs3[alignedStart-3]);\n\n              for (; j<peeledSize; j+=peels*ResPacketSize)\n              {\n                A11 = pload<LhsPacket>(&lhs1[j-1+LhsPacketSize]);  palign<1>(A01,A11);\n                A12 = pload<LhsPacket>(&lhs2[j-2+LhsPacketSize]);  palign<2>(A02,A12);\n                A13 = pload<LhsPacket>(&lhs3[j-3+LhsPacketSize]);  palign<3>(A03,A13);\n\n                A00 = pload<LhsPacket>(&lhs0[j]);\n                A10 = pload<LhsPacket>(&lhs0[j+LhsPacketSize]);\n                T0  = pcj.pmadd(A00, ptmp0, pload<ResPacket>(&res[j]));\n                T1  = pcj.pmadd(A10, ptmp0, pload<ResPacket>(&res[j+ResPacketSize]));\n\n                T0  = pcj.pmadd(A01, ptmp1, T0);\n                A01 = pload<LhsPacket>(&lhs1[j-1+2*LhsPacketSize]);  palign<1>(A11,A01);\n                T0  = pcj.pmadd(A02, ptmp2, T0);\n                A02 = pload<LhsPacket>(&lhs2[j-2+2*LhsPacketSize]);  palign<2>(A12,A02);\n                T0  = pcj.pmadd(A03, ptmp3, T0);\n                pstore(&res[j],T0);\n                A03 = pload<LhsPacket>(&lhs3[j-3+2*LhsPacketSize]);  palign<3>(A13,A03);\n                T1  = pcj.pmadd(A11, ptmp1, T1);\n                T1  = pcj.pmadd(A12, ptmp2, T1);\n                T1  = pcj.pmadd(A13, ptmp3, T1);\n                pstore(&res[j+ResPacketSize],T1);\n              }\n            }\n            for (; j<alignedSize; j+=ResPacketSize)\n              _EIGEN_ACCUMULATE_PACKETS(d,du,du);\n            break;\n          }\n          default:\n            for (Index j = alignedStart; j<alignedSize; j+=ResPacketSize)\n              _EIGEN_ACCUMULATE_PACKETS(du,du,du);\n            break;\n        }\n      }\n    } // end explicit vectorization\n\n    /* process remaining coeffs (or all if there is no explicit vectorization) */\n    for (Index j=alignedSize; j<size; ++j)\n    {\n      res[j] = cj.pmadd(lhs0[j], pfirst(ptmp0), res[j]);\n      res[j] = cj.pmadd(lhs1[j], pfirst(ptmp1), res[j]);\n      res[j] = cj.pmadd(lhs2[j], pfirst(ptmp2), res[j]);\n      res[j] = cj.pmadd(lhs3[j], pfirst(ptmp3), res[j]);\n    }\n  }\n\n  // process remaining first and last columns (at most columnsAtOnce-1)\n  Index end = cols;\n  Index start = columnBound;\n  do\n  {\n    for (Index k=start; k<end; ++k)\n    {\n      RhsPacket ptmp0 = pset1<RhsPacket>(alpha*rhs[k*rhsIncr]);\n      const LhsScalar* lhs0 = lhs + k*lhsStride;\n\n      if (Vectorizable)\n      {\n        /* explicit vectorization */\n        // process first unaligned result's coeffs\n        for (Index j=0; j<alignedStart; ++j)\n          res[j] += cj.pmul(lhs0[j], pfirst(ptmp0));\n        // process aligned result's coeffs\n        if ((size_t(lhs0+alignedStart)%sizeof(LhsPacket))==0)\n          for (Index i = alignedStart;i<alignedSize;i+=ResPacketSize)\n            pstore(&res[i], pcj.pmadd(pload<LhsPacket>(&lhs0[i]), ptmp0, pload<ResPacket>(&res[i])));\n        else\n          for (Index i = alignedStart;i<alignedSize;i+=ResPacketSize)\n            pstore(&res[i], pcj.pmadd(ploadu<LhsPacket>(&lhs0[i]), ptmp0, pload<ResPacket>(&res[i])));\n      }\n\n      // process remaining scalars (or all if no explicit vectorization)\n      for (Index i=alignedSize; i<size; ++i)\n        res[i] += cj.pmul(lhs0[i], pfirst(ptmp0));\n    }\n    if (skipColumns)\n    {\n      start = 0;\n      end = skipColumns;\n      skipColumns = 0;\n    }\n    else\n      break;\n  } while(Vectorizable);\n  #undef _EIGEN_ACCUMULATE_PACKETS\n}\n\n/* Optimized row-major matrix * vector product:\n * This algorithm processes 4 rows at onces that allows to both reduce\n * the number of load/stores of the result by a factor 4 and to reduce\n * the instruction dependency. Moreover, we know that all bands have the\n * same alignment pattern.\n *\n * Mixing type logic:\n *  - alpha is always a complex (or converted to a complex)\n *  - no vectorization\n */\ntemplate<typename Index, typename LhsScalar, bool ConjugateLhs, typename RhsScalar, bool ConjugateRhs, int Version>\nstruct general_matrix_vector_product<Index,LhsScalar,RowMajor,ConjugateLhs,RhsScalar,ConjugateRhs,Version>\n{\ntypedef typename scalar_product_traits<LhsScalar, RhsScalar>::ReturnType ResScalar;\n\nenum {\n  Vectorizable = packet_traits<LhsScalar>::Vectorizable && packet_traits<RhsScalar>::Vectorizable\n              && int(packet_traits<LhsScalar>::size)==int(packet_traits<RhsScalar>::size),\n  LhsPacketSize = Vectorizable ? packet_traits<LhsScalar>::size : 1,\n  RhsPacketSize = Vectorizable ? packet_traits<RhsScalar>::size : 1,\n  ResPacketSize = Vectorizable ? packet_traits<ResScalar>::size : 1\n};\n\ntypedef typename packet_traits<LhsScalar>::type  _LhsPacket;\ntypedef typename packet_traits<RhsScalar>::type  _RhsPacket;\ntypedef typename packet_traits<ResScalar>::type  _ResPacket;\n\ntypedef typename conditional<Vectorizable,_LhsPacket,LhsScalar>::type LhsPacket;\ntypedef typename conditional<Vectorizable,_RhsPacket,RhsScalar>::type RhsPacket;\ntypedef typename conditional<Vectorizable,_ResPacket,ResScalar>::type ResPacket;\n  \nEIGEN_DONT_INLINE static void run(\n  Index rows, Index cols,\n  const LhsScalar* lhs, Index lhsStride,\n  const RhsScalar* rhs, Index rhsIncr,\n  ResScalar* res, Index resIncr,\n  ResScalar alpha);\n};\n\ntemplate<typename Index, typename LhsScalar, bool ConjugateLhs, typename RhsScalar, bool ConjugateRhs, int Version>\nEIGEN_DONT_INLINE void general_matrix_vector_product<Index,LhsScalar,RowMajor,ConjugateLhs,RhsScalar,ConjugateRhs,Version>::run(\n  Index rows, Index cols,\n  const LhsScalar* lhs, Index lhsStride,\n  const RhsScalar* rhs, Index rhsIncr,\n  ResScalar* res, Index resIncr,\n  ResScalar alpha)\n{\n  EIGEN_UNUSED_VARIABLE(rhsIncr);\n  eigen_internal_assert(rhsIncr==1);\n  #ifdef _EIGEN_ACCUMULATE_PACKETS\n  #error _EIGEN_ACCUMULATE_PACKETS has already been defined\n  #endif\n\n  #define _EIGEN_ACCUMULATE_PACKETS(A0,A13,A2) {\\\n    RhsPacket b = pload<RhsPacket>(&rhs[j]); \\\n    ptmp0 = pcj.pmadd(EIGEN_CAT(ploa,A0) <LhsPacket>(&lhs0[j]), b, ptmp0); \\\n    ptmp1 = pcj.pmadd(EIGEN_CAT(ploa,A13)<LhsPacket>(&lhs1[j]), b, ptmp1); \\\n    ptmp2 = pcj.pmadd(EIGEN_CAT(ploa,A2) <LhsPacket>(&lhs2[j]), b, ptmp2); \\\n    ptmp3 = pcj.pmadd(EIGEN_CAT(ploa,A13)<LhsPacket>(&lhs3[j]), b, ptmp3); }\n\n  conj_helper<LhsScalar,RhsScalar,ConjugateLhs,ConjugateRhs> cj;\n  conj_helper<LhsPacket,RhsPacket,ConjugateLhs,ConjugateRhs> pcj;\n\n  enum { AllAligned=0, EvenAligned=1, FirstAligned=2, NoneAligned=3 };\n  const Index rowsAtOnce = 4;\n  const Index peels = 2;\n  const Index RhsPacketAlignedMask = RhsPacketSize-1;\n  const Index LhsPacketAlignedMask = LhsPacketSize-1;\n//   const Index PeelAlignedMask = RhsPacketSize*peels-1;\n  const Index depth = cols;\n\n  // How many coeffs of the result do we have to skip to be aligned.\n  // Here we assume data are at least aligned on the base scalar type\n  // if that's not the case then vectorization is discarded, see below.\n  Index alignedStart = internal::first_aligned(rhs, depth);\n  Index alignedSize = RhsPacketSize>1 ? alignedStart + ((depth-alignedStart) & ~RhsPacketAlignedMask) : 0;\n  const Index peeledSize = alignedSize - RhsPacketSize*peels - RhsPacketSize + 1;\n\n  const Index alignmentStep = LhsPacketSize>1 ? (LhsPacketSize - lhsStride % LhsPacketSize) & LhsPacketAlignedMask : 0;\n  Index alignmentPattern = alignmentStep==0 ? AllAligned\n                         : alignmentStep==(LhsPacketSize/2) ? EvenAligned\n                         : FirstAligned;\n\n  // we cannot assume the first element is aligned because of sub-matrices\n  const Index lhsAlignmentOffset = internal::first_aligned(lhs,depth);\n\n  // find how many rows do we have to skip to be aligned with rhs (if possible)\n  Index skipRows = 0;\n  // if the data cannot be aligned (TODO add some compile time tests when possible, e.g. for floats)\n  if( (sizeof(LhsScalar)!=sizeof(RhsScalar)) || (size_t(lhs)%sizeof(LhsScalar)) || (size_t(rhs)%sizeof(RhsScalar)) )\n  {\n    alignedSize = 0;\n    alignedStart = 0;\n  }\n  else if (LhsPacketSize>1)\n  {\n    eigen_internal_assert(size_t(lhs+lhsAlignmentOffset)%sizeof(LhsPacket)==0  || depth<LhsPacketSize);\n\n    while (skipRows<LhsPacketSize &&\n           alignedStart != ((lhsAlignmentOffset + alignmentStep*skipRows)%LhsPacketSize))\n      ++skipRows;\n    if (skipRows==LhsPacketSize)\n    {\n      // nothing can be aligned, no need to skip any column\n      alignmentPattern = NoneAligned;\n      skipRows = 0;\n    }\n    else\n    {\n      skipRows = (std::min)(skipRows,Index(rows));\n      // note that the skiped columns are processed later.\n    }\n    eigen_internal_assert(  alignmentPattern==NoneAligned\n                      || LhsPacketSize==1\n                      || (skipRows + rowsAtOnce >= rows)\n                      || LhsPacketSize > depth\n                      || (size_t(lhs+alignedStart+lhsStride*skipRows)%sizeof(LhsPacket))==0);\n  }\n  else if(Vectorizable)\n  {\n    alignedStart = 0;\n    alignedSize = depth;\n    alignmentPattern = AllAligned;\n  }\n\n  Index offset1 = (FirstAligned && alignmentStep==1?3:1);\n  Index offset3 = (FirstAligned && alignmentStep==1?1:3);\n\n  Index rowBound = ((rows-skipRows)/rowsAtOnce)*rowsAtOnce + skipRows;\n  for (Index i=skipRows; i<rowBound; i+=rowsAtOnce)\n  {\n    EIGEN_ALIGN16 ResScalar tmp0 = ResScalar(0);\n    ResScalar tmp1 = ResScalar(0), tmp2 = ResScalar(0), tmp3 = ResScalar(0);\n\n    // this helps the compiler generating good binary code\n    const LhsScalar *lhs0 = lhs + i*lhsStride,     *lhs1 = lhs + (i+offset1)*lhsStride,\n                    *lhs2 = lhs + (i+2)*lhsStride, *lhs3 = lhs + (i+offset3)*lhsStride;\n\n    if (Vectorizable)\n    {\n      /* explicit vectorization */\n      ResPacket ptmp0 = pset1<ResPacket>(ResScalar(0)), ptmp1 = pset1<ResPacket>(ResScalar(0)),\n                ptmp2 = pset1<ResPacket>(ResScalar(0)), ptmp3 = pset1<ResPacket>(ResScalar(0));\n\n      // process initial unaligned coeffs\n      // FIXME this loop get vectorized by the compiler !\n      for (Index j=0; j<alignedStart; ++j)\n      {\n        RhsScalar b = rhs[j];\n        tmp0 += cj.pmul(lhs0[j],b); tmp1 += cj.pmul(lhs1[j],b);\n        tmp2 += cj.pmul(lhs2[j],b); tmp3 += cj.pmul(lhs3[j],b);\n      }\n\n      if (alignedSize>alignedStart)\n      {\n        switch(alignmentPattern)\n        {\n          case AllAligned:\n            for (Index j = alignedStart; j<alignedSize; j+=RhsPacketSize)\n              _EIGEN_ACCUMULATE_PACKETS(d,d,d);\n            break;\n          case EvenAligned:\n            for (Index j = alignedStart; j<alignedSize; j+=RhsPacketSize)\n              _EIGEN_ACCUMULATE_PACKETS(d,du,d);\n            break;\n          case FirstAligned:\n          {\n            Index j = alignedStart;\n            if (peels>1)\n            {\n              /* Here we proccess 4 rows with with two peeled iterations to hide\n               * the overhead of unaligned loads. Moreover unaligned loads are handled\n               * using special shift/move operations between the two aligned packets\n               * overlaping the desired unaligned packet. This is *much* more efficient\n               * than basic unaligned loads.\n               */\n              LhsPacket A01, A02, A03, A11, A12, A13;\n              A01 = pload<LhsPacket>(&lhs1[alignedStart-1]);\n              A02 = pload<LhsPacket>(&lhs2[alignedStart-2]);\n              A03 = pload<LhsPacket>(&lhs3[alignedStart-3]);\n\n              for (; j<peeledSize; j+=peels*RhsPacketSize)\n              {\n                RhsPacket b = pload<RhsPacket>(&rhs[j]);\n                A11 = pload<LhsPacket>(&lhs1[j-1+LhsPacketSize]);  palign<1>(A01,A11);\n                A12 = pload<LhsPacket>(&lhs2[j-2+LhsPacketSize]);  palign<2>(A02,A12);\n                A13 = pload<LhsPacket>(&lhs3[j-3+LhsPacketSize]);  palign<3>(A03,A13);\n\n                ptmp0 = pcj.pmadd(pload<LhsPacket>(&lhs0[j]), b, ptmp0);\n                ptmp1 = pcj.pmadd(A01, b, ptmp1);\n                A01 = pload<LhsPacket>(&lhs1[j-1+2*LhsPacketSize]);  palign<1>(A11,A01);\n                ptmp2 = pcj.pmadd(A02, b, ptmp2);\n                A02 = pload<LhsPacket>(&lhs2[j-2+2*LhsPacketSize]);  palign<2>(A12,A02);\n                ptmp3 = pcj.pmadd(A03, b, ptmp3);\n                A03 = pload<LhsPacket>(&lhs3[j-3+2*LhsPacketSize]);  palign<3>(A13,A03);\n\n                b = pload<RhsPacket>(&rhs[j+RhsPacketSize]);\n                ptmp0 = pcj.pmadd(pload<LhsPacket>(&lhs0[j+LhsPacketSize]), b, ptmp0);\n                ptmp1 = pcj.pmadd(A11, b, ptmp1);\n                ptmp2 = pcj.pmadd(A12, b, ptmp2);\n                ptmp3 = pcj.pmadd(A13, b, ptmp3);\n              }\n            }\n            for (; j<alignedSize; j+=RhsPacketSize)\n              _EIGEN_ACCUMULATE_PACKETS(d,du,du);\n            break;\n          }\n          default:\n            for (Index j = alignedStart; j<alignedSize; j+=RhsPacketSize)\n              _EIGEN_ACCUMULATE_PACKETS(du,du,du);\n            break;\n        }\n        tmp0 += predux(ptmp0);\n        tmp1 += predux(ptmp1);\n        tmp2 += predux(ptmp2);\n        tmp3 += predux(ptmp3);\n      }\n    } // end explicit vectorization\n\n    // process remaining coeffs (or all if no explicit vectorization)\n    // FIXME this loop get vectorized by the compiler !\n    for (Index j=alignedSize; j<depth; ++j)\n    {\n      RhsScalar b = rhs[j];\n      tmp0 += cj.pmul(lhs0[j],b); tmp1 += cj.pmul(lhs1[j],b);\n      tmp2 += cj.pmul(lhs2[j],b); tmp3 += cj.pmul(lhs3[j],b);\n    }\n    res[i*resIncr]            += alpha*tmp0;\n    res[(i+offset1)*resIncr]  += alpha*tmp1;\n    res[(i+2)*resIncr]        += alpha*tmp2;\n    res[(i+offset3)*resIncr]  += alpha*tmp3;\n  }\n\n  // process remaining first and last rows (at most columnsAtOnce-1)\n  Index end = rows;\n  Index start = rowBound;\n  do\n  {\n    for (Index i=start; i<end; ++i)\n    {\n      EIGEN_ALIGN16 ResScalar tmp0 = ResScalar(0);\n      ResPacket ptmp0 = pset1<ResPacket>(tmp0);\n      const LhsScalar* lhs0 = lhs + i*lhsStride;\n      // process first unaligned result's coeffs\n      // FIXME this loop get vectorized by the compiler !\n      for (Index j=0; j<alignedStart; ++j)\n        tmp0 += cj.pmul(lhs0[j], rhs[j]);\n\n      if (alignedSize>alignedStart)\n      {\n        // process aligned rhs coeffs\n        if ((size_t(lhs0+alignedStart)%sizeof(LhsPacket))==0)\n          for (Index j = alignedStart;j<alignedSize;j+=RhsPacketSize)\n            ptmp0 = pcj.pmadd(pload<LhsPacket>(&lhs0[j]), pload<RhsPacket>(&rhs[j]), ptmp0);\n        else\n          for (Index j = alignedStart;j<alignedSize;j+=RhsPacketSize)\n            ptmp0 = pcj.pmadd(ploadu<LhsPacket>(&lhs0[j]), pload<RhsPacket>(&rhs[j]), ptmp0);\n        tmp0 += predux(ptmp0);\n      }\n\n      // process remaining scalars\n      // FIXME this loop get vectorized by the compiler !\n      for (Index j=alignedSize; j<depth; ++j)\n        tmp0 += cj.pmul(lhs0[j], rhs[j]);\n      res[i*resIncr] += alpha*tmp0;\n    }\n    if (skipRows)\n    {\n      start = 0;\n      end = skipRows;\n      skipRows = 0;\n    }\n    else\n      break;\n  } while(Vectorizable);\n\n  #undef _EIGEN_ACCUMULATE_PACKETS\n}\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_GENERAL_MATRIX_VECTOR_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/products/GeneralMatrixVector_MKL.h",
    "content": "/*\n Copyright (c) 2011, Intel Corporation. All rights reserved.\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n * Neither the name of Intel Corporation nor the names of its contributors may\n   be used to endorse or promote products derived from this software without\n   specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\n ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n ********************************************************************************\n *   Content : Eigen bindings to Intel(R) MKL\n *   General matrix-vector product functionality based on ?GEMV.\n ********************************************************************************\n*/\n\n#ifndef EIGEN_GENERAL_MATRIX_VECTOR_MKL_H\n#define EIGEN_GENERAL_MATRIX_VECTOR_MKL_H\n\nnamespace Eigen { \n\nnamespace internal {\n\n/**********************************************************************\n* This file implements general matrix-vector multiplication using BLAS\n* gemv function via partial specialization of\n* general_matrix_vector_product::run(..) method for float, double,\n* std::complex<float> and std::complex<double> types\n**********************************************************************/\n\n// gemv specialization\n\ntemplate<typename Index, typename LhsScalar, int LhsStorageOrder, bool ConjugateLhs, typename RhsScalar, bool ConjugateRhs>\nstruct general_matrix_vector_product_gemv :\n  general_matrix_vector_product<Index,LhsScalar,LhsStorageOrder,ConjugateLhs,RhsScalar,ConjugateRhs,BuiltIn> {};\n\n#define EIGEN_MKL_GEMV_SPECIALIZE(Scalar) \\\ntemplate<typename Index, bool ConjugateLhs, bool ConjugateRhs> \\\nstruct general_matrix_vector_product<Index,Scalar,ColMajor,ConjugateLhs,Scalar,ConjugateRhs,Specialized> { \\\nstatic void run( \\\n  Index rows, Index cols, \\\n  const Scalar* lhs, Index lhsStride, \\\n  const Scalar* rhs, Index rhsIncr, \\\n  Scalar* res, Index resIncr, Scalar alpha) \\\n{ \\\n  if (ConjugateLhs) { \\\n    general_matrix_vector_product<Index,Scalar,ColMajor,ConjugateLhs,Scalar,ConjugateRhs,BuiltIn>::run( \\\n      rows, cols, lhs, lhsStride, rhs, rhsIncr, res, resIncr, alpha); \\\n  } else { \\\n    general_matrix_vector_product_gemv<Index,Scalar,ColMajor,ConjugateLhs,Scalar,ConjugateRhs>::run( \\\n      rows, cols, lhs, lhsStride, rhs, rhsIncr, res, resIncr, alpha); \\\n  } \\\n} \\\n}; \\\ntemplate<typename Index, bool ConjugateLhs, bool ConjugateRhs> \\\nstruct general_matrix_vector_product<Index,Scalar,RowMajor,ConjugateLhs,Scalar,ConjugateRhs,Specialized> { \\\nstatic void run( \\\n  Index rows, Index cols, \\\n  const Scalar* lhs, Index lhsStride, \\\n  const Scalar* rhs, Index rhsIncr, \\\n  Scalar* res, Index resIncr, Scalar alpha) \\\n{ \\\n    general_matrix_vector_product_gemv<Index,Scalar,RowMajor,ConjugateLhs,Scalar,ConjugateRhs>::run( \\\n      rows, cols, lhs, lhsStride, rhs, rhsIncr, res, resIncr, alpha); \\\n} \\\n}; \\\n\nEIGEN_MKL_GEMV_SPECIALIZE(double)\nEIGEN_MKL_GEMV_SPECIALIZE(float)\nEIGEN_MKL_GEMV_SPECIALIZE(dcomplex)\nEIGEN_MKL_GEMV_SPECIALIZE(scomplex)\n\n#define EIGEN_MKL_GEMV_SPECIALIZATION(EIGTYPE,MKLTYPE,MKLPREFIX) \\\ntemplate<typename Index, int LhsStorageOrder, bool ConjugateLhs, bool ConjugateRhs> \\\nstruct general_matrix_vector_product_gemv<Index,EIGTYPE,LhsStorageOrder,ConjugateLhs,EIGTYPE,ConjugateRhs> \\\n{ \\\ntypedef Matrix<EIGTYPE,Dynamic,1,ColMajor> GEMVVector;\\\n\\\nstatic void run( \\\n  Index rows, Index cols, \\\n  const EIGTYPE* lhs, Index lhsStride, \\\n  const EIGTYPE* rhs, Index rhsIncr, \\\n  EIGTYPE* res, Index resIncr, EIGTYPE alpha) \\\n{ \\\n  MKL_INT m=rows, n=cols, lda=lhsStride, incx=rhsIncr, incy=resIncr; \\\n  MKLTYPE alpha_, beta_; \\\n  const EIGTYPE *x_ptr, myone(1); \\\n  char trans=(LhsStorageOrder==ColMajor) ? 'N' : (ConjugateLhs) ? 'C' : 'T'; \\\n  if (LhsStorageOrder==RowMajor) { \\\n    m=cols; \\\n    n=rows; \\\n  }\\\n  assign_scalar_eig2mkl(alpha_, alpha); \\\n  assign_scalar_eig2mkl(beta_, myone); \\\n  GEMVVector x_tmp; \\\n  if (ConjugateRhs) { \\\n    Map<const GEMVVector, 0, InnerStride<> > map_x(rhs,cols,1,InnerStride<>(incx)); \\\n    x_tmp=map_x.conjugate(); \\\n    x_ptr=x_tmp.data(); \\\n    incx=1; \\\n  } else x_ptr=rhs; \\\n  MKLPREFIX##gemv(&trans, &m, &n, &alpha_, (const MKLTYPE*)lhs, &lda, (const MKLTYPE*)x_ptr, &incx, &beta_, (MKLTYPE*)res, &incy); \\\n}\\\n};\n\nEIGEN_MKL_GEMV_SPECIALIZATION(double,   double,        d)\nEIGEN_MKL_GEMV_SPECIALIZATION(float,    float,         s)\nEIGEN_MKL_GEMV_SPECIALIZATION(dcomplex, MKL_Complex16, z)\nEIGEN_MKL_GEMV_SPECIALIZATION(scomplex, MKL_Complex8,  c)\n\n} // end namespase internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_GENERAL_MATRIX_VECTOR_MKL_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/products/Parallelizer.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_PARALLELIZER_H\n#define EIGEN_PARALLELIZER_H\n\nnamespace Eigen { \n\nnamespace internal {\n\n/** \\internal */\ninline void manage_multi_threading(Action action, int* v)\n{\n  static EIGEN_UNUSED int m_maxThreads = -1;\n\n  if(action==SetAction)\n  {\n    eigen_internal_assert(v!=0);\n    m_maxThreads = *v;\n  }\n  else if(action==GetAction)\n  {\n    eigen_internal_assert(v!=0);\n    #ifdef EIGEN_HAS_OPENMP\n    if(m_maxThreads>0)\n      *v = m_maxThreads;\n    else\n      *v = omp_get_max_threads();\n    #else\n    *v = 1;\n    #endif\n  }\n  else\n  {\n    eigen_internal_assert(false);\n  }\n}\n\n}\n\n/** Must be call first when calling Eigen from multiple threads */\ninline void initParallel()\n{\n  int nbt;\n  internal::manage_multi_threading(GetAction, &nbt);\n  std::ptrdiff_t l1, l2;\n  internal::manage_caching_sizes(GetAction, &l1, &l2);\n}\n\n/** \\returns the max number of threads reserved for Eigen\n  * \\sa setNbThreads */\ninline int nbThreads()\n{\n  int ret;\n  internal::manage_multi_threading(GetAction, &ret);\n  return ret;\n}\n\n/** Sets the max number of threads reserved for Eigen\n  * \\sa nbThreads */\ninline void setNbThreads(int v)\n{\n  internal::manage_multi_threading(SetAction, &v);\n}\n\nnamespace internal {\n\ntemplate<typename Index> struct GemmParallelInfo\n{\n  GemmParallelInfo() : sync(-1), users(0), rhs_start(0), rhs_length(0) {}\n\n  int volatile sync;\n  int volatile users;\n\n  Index rhs_start;\n  Index rhs_length;\n};\n\ntemplate<bool Condition, typename Functor, typename Index>\nvoid parallelize_gemm(const Functor& func, Index rows, Index cols, bool transpose)\n{\n  // TODO when EIGEN_USE_BLAS is defined,\n  // we should still enable OMP for other scalar types\n#if !(defined (EIGEN_HAS_OPENMP)) || defined (EIGEN_USE_BLAS)\n  // FIXME the transpose variable is only needed to properly split\n  // the matrix product when multithreading is enabled. This is a temporary\n  // fix to support row-major destination matrices. This whole\n  // parallelizer mechanism has to be redisigned anyway.\n  EIGEN_UNUSED_VARIABLE(transpose);\n  func(0,rows, 0,cols);\n#else\n\n  // Dynamically check whether we should enable or disable OpenMP.\n  // The conditions are:\n  // - the max number of threads we can create is greater than 1\n  // - we are not already in a parallel code\n  // - the sizes are large enough\n\n  // 1- are we already in a parallel session?\n  // FIXME omp_get_num_threads()>1 only works for openmp, what if the user does not use openmp?\n  if((!Condition) || (omp_get_num_threads()>1))\n    return func(0,rows, 0,cols);\n\n  Index size = transpose ? cols : rows;\n\n  // 2- compute the maximal number of threads from the size of the product:\n  // FIXME this has to be fine tuned\n  Index max_threads = std::max<Index>(1,size / 32);\n\n  // 3 - compute the number of threads we are going to use\n  Index threads = std::min<Index>(nbThreads(), max_threads);\n\n  if(threads==1)\n    return func(0,rows, 0,cols);\n\n  Eigen::initParallel();\n  func.initParallelSession();\n\n  if(transpose)\n    std::swap(rows,cols);\n\n  GemmParallelInfo<Index>* info = new GemmParallelInfo<Index>[threads];\n\n  #pragma omp parallel num_threads(threads)\n  {\n    Index i = omp_get_thread_num();\n    // Note that the actual number of threads might be lower than the number of request ones.\n    Index actual_threads = omp_get_num_threads();\n    \n    Index blockCols = (cols / actual_threads) & ~Index(0x3);\n    Index blockRows = (rows / actual_threads) & ~Index(0x7);\n    \n    Index r0 = i*blockRows;\n    Index actualBlockRows = (i+1==actual_threads) ? rows-r0 : blockRows;\n\n    Index c0 = i*blockCols;\n    Index actualBlockCols = (i+1==actual_threads) ? cols-c0 : blockCols;\n\n    info[i].rhs_start = c0;\n    info[i].rhs_length = actualBlockCols;\n\n    if(transpose)\n      func(0, cols, r0, actualBlockRows, info);\n    else\n      func(r0, actualBlockRows, 0,cols, info);\n  }\n\n  delete[] info;\n#endif\n}\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_PARALLELIZER_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SELFADJOINT_MATRIX_MATRIX_H\n#define EIGEN_SELFADJOINT_MATRIX_MATRIX_H\n\nnamespace Eigen { \n\nnamespace internal {\n\n// pack a selfadjoint block diagonal for use with the gebp_kernel\ntemplate<typename Scalar, typename Index, int Pack1, int Pack2, int StorageOrder>\nstruct symm_pack_lhs\n{\n  template<int BlockRows> inline\n  void pack(Scalar* blockA, const const_blas_data_mapper<Scalar,Index,StorageOrder>& lhs, Index cols, Index i, Index& count)\n  {\n    // normal copy\n    for(Index k=0; k<i; k++)\n      for(Index w=0; w<BlockRows; w++)\n        blockA[count++] = lhs(i+w,k);           // normal\n    // symmetric copy\n    Index h = 0;\n    for(Index k=i; k<i+BlockRows; k++)\n    {\n      for(Index w=0; w<h; w++)\n        blockA[count++] = numext::conj(lhs(k, i+w)); // transposed\n\n      blockA[count++] = numext::real(lhs(k,k));   // real (diagonal)\n\n      for(Index w=h+1; w<BlockRows; w++)\n        blockA[count++] = lhs(i+w, k);          // normal\n      ++h;\n    }\n    // transposed copy\n    for(Index k=i+BlockRows; k<cols; k++)\n      for(Index w=0; w<BlockRows; w++)\n        blockA[count++] = numext::conj(lhs(k, i+w)); // transposed\n  }\n  void operator()(Scalar* blockA, const Scalar* _lhs, Index lhsStride, Index cols, Index rows)\n  {\n    const_blas_data_mapper<Scalar,Index,StorageOrder> lhs(_lhs,lhsStride);\n    Index count = 0;\n    Index peeled_mc = (rows/Pack1)*Pack1;\n    for(Index i=0; i<peeled_mc; i+=Pack1)\n    {\n      pack<Pack1>(blockA, lhs, cols, i, count);\n    }\n\n    if(rows-peeled_mc>=Pack2)\n    {\n      pack<Pack2>(blockA, lhs, cols, peeled_mc, count);\n      peeled_mc += Pack2;\n    }\n\n    // do the same with mr==1\n    for(Index i=peeled_mc; i<rows; i++)\n    {\n      for(Index k=0; k<i; k++)\n        blockA[count++] = lhs(i, k);              // normal\n\n      blockA[count++] = numext::real(lhs(i, i));       // real (diagonal)\n\n      for(Index k=i+1; k<cols; k++)\n        blockA[count++] = numext::conj(lhs(k, i));     // transposed\n    }\n  }\n};\n\ntemplate<typename Scalar, typename Index, int nr, int StorageOrder>\nstruct symm_pack_rhs\n{\n  enum { PacketSize = packet_traits<Scalar>::size };\n  void operator()(Scalar* blockB, const Scalar* _rhs, Index rhsStride, Index rows, Index cols, Index k2)\n  {\n    Index end_k = k2 + rows;\n    Index count = 0;\n    const_blas_data_mapper<Scalar,Index,StorageOrder> rhs(_rhs,rhsStride);\n    Index packet_cols = (cols/nr)*nr;\n\n    // first part: normal case\n    for(Index j2=0; j2<k2; j2+=nr)\n    {\n      for(Index k=k2; k<end_k; k++)\n      {\n        blockB[count+0] = rhs(k,j2+0);\n        blockB[count+1] = rhs(k,j2+1);\n        if (nr==4)\n        {\n          blockB[count+2] = rhs(k,j2+2);\n          blockB[count+3] = rhs(k,j2+3);\n        }\n        count += nr;\n      }\n    }\n\n    // second part: diagonal block\n    for(Index j2=k2; j2<(std::min)(k2+rows,packet_cols); j2+=nr)\n    {\n      // again we can split vertically in three different parts (transpose, symmetric, normal)\n      // transpose\n      for(Index k=k2; k<j2; k++)\n      {\n        blockB[count+0] = numext::conj(rhs(j2+0,k));\n        blockB[count+1] = numext::conj(rhs(j2+1,k));\n        if (nr==4)\n        {\n          blockB[count+2] = numext::conj(rhs(j2+2,k));\n          blockB[count+3] = numext::conj(rhs(j2+3,k));\n        }\n        count += nr;\n      }\n      // symmetric\n      Index h = 0;\n      for(Index k=j2; k<j2+nr; k++)\n      {\n        // normal\n        for (Index w=0 ; w<h; ++w)\n          blockB[count+w] = rhs(k,j2+w);\n\n        blockB[count+h] = numext::real(rhs(k,k));\n\n        // transpose\n        for (Index w=h+1 ; w<nr; ++w)\n          blockB[count+w] = numext::conj(rhs(j2+w,k));\n        count += nr;\n        ++h;\n      }\n      // normal\n      for(Index k=j2+nr; k<end_k; k++)\n      {\n        blockB[count+0] = rhs(k,j2+0);\n        blockB[count+1] = rhs(k,j2+1);\n        if (nr==4)\n        {\n          blockB[count+2] = rhs(k,j2+2);\n          blockB[count+3] = rhs(k,j2+3);\n        }\n        count += nr;\n      }\n    }\n\n    // third part: transposed\n    for(Index j2=k2+rows; j2<packet_cols; j2+=nr)\n    {\n      for(Index k=k2; k<end_k; k++)\n      {\n        blockB[count+0] = numext::conj(rhs(j2+0,k));\n        blockB[count+1] = numext::conj(rhs(j2+1,k));\n        if (nr==4)\n        {\n          blockB[count+2] = numext::conj(rhs(j2+2,k));\n          blockB[count+3] = numext::conj(rhs(j2+3,k));\n        }\n        count += nr;\n      }\n    }\n\n    // copy the remaining columns one at a time (=> the same with nr==1)\n    for(Index j2=packet_cols; j2<cols; ++j2)\n    {\n      // transpose\n      Index half = (std::min)(end_k,j2);\n      for(Index k=k2; k<half; k++)\n      {\n        blockB[count] = numext::conj(rhs(j2,k));\n        count += 1;\n      }\n\n      if(half==j2 && half<k2+rows)\n      {\n        blockB[count] = numext::real(rhs(j2,j2));\n        count += 1;\n      }\n      else\n        half--;\n\n      // normal\n      for(Index k=half+1; k<k2+rows; k++)\n      {\n        blockB[count] = rhs(k,j2);\n        count += 1;\n      }\n    }\n  }\n};\n\n/* Optimized selfadjoint matrix * matrix (_SYMM) product built on top of\n * the general matrix matrix product.\n */\ntemplate <typename Scalar, typename Index,\n          int LhsStorageOrder, bool LhsSelfAdjoint, bool ConjugateLhs,\n          int RhsStorageOrder, bool RhsSelfAdjoint, bool ConjugateRhs,\n          int ResStorageOrder>\nstruct product_selfadjoint_matrix;\n\ntemplate <typename Scalar, typename Index,\n          int LhsStorageOrder, bool LhsSelfAdjoint, bool ConjugateLhs,\n          int RhsStorageOrder, bool RhsSelfAdjoint, bool ConjugateRhs>\nstruct product_selfadjoint_matrix<Scalar,Index,LhsStorageOrder,LhsSelfAdjoint,ConjugateLhs, RhsStorageOrder,RhsSelfAdjoint,ConjugateRhs,RowMajor>\n{\n\n  static EIGEN_STRONG_INLINE void run(\n    Index rows, Index cols,\n    const Scalar* lhs, Index lhsStride,\n    const Scalar* rhs, Index rhsStride,\n    Scalar* res,       Index resStride,\n    const Scalar& alpha)\n  {\n    product_selfadjoint_matrix<Scalar, Index,\n      EIGEN_LOGICAL_XOR(RhsSelfAdjoint,RhsStorageOrder==RowMajor) ? ColMajor : RowMajor,\n      RhsSelfAdjoint, NumTraits<Scalar>::IsComplex && EIGEN_LOGICAL_XOR(RhsSelfAdjoint,ConjugateRhs),\n      EIGEN_LOGICAL_XOR(LhsSelfAdjoint,LhsStorageOrder==RowMajor) ? ColMajor : RowMajor,\n      LhsSelfAdjoint, NumTraits<Scalar>::IsComplex && EIGEN_LOGICAL_XOR(LhsSelfAdjoint,ConjugateLhs),\n      ColMajor>\n      ::run(cols, rows,  rhs, rhsStride,  lhs, lhsStride,  res, resStride,  alpha);\n  }\n};\n\ntemplate <typename Scalar, typename Index,\n          int LhsStorageOrder, bool ConjugateLhs,\n          int RhsStorageOrder, bool ConjugateRhs>\nstruct product_selfadjoint_matrix<Scalar,Index,LhsStorageOrder,true,ConjugateLhs, RhsStorageOrder,false,ConjugateRhs,ColMajor>\n{\n\n  static EIGEN_DONT_INLINE void run(\n    Index rows, Index cols,\n    const Scalar* _lhs, Index lhsStride,\n    const Scalar* _rhs, Index rhsStride,\n    Scalar* res,        Index resStride,\n    const Scalar& alpha);\n};\n\ntemplate <typename Scalar, typename Index,\n          int LhsStorageOrder, bool ConjugateLhs,\n          int RhsStorageOrder, bool ConjugateRhs>\nEIGEN_DONT_INLINE void product_selfadjoint_matrix<Scalar,Index,LhsStorageOrder,true,ConjugateLhs, RhsStorageOrder,false,ConjugateRhs,ColMajor>::run(\n    Index rows, Index cols,\n    const Scalar* _lhs, Index lhsStride,\n    const Scalar* _rhs, Index rhsStride,\n    Scalar* res,        Index resStride,\n    const Scalar& alpha)\n  {\n    Index size = rows;\n\n    const_blas_data_mapper<Scalar, Index, LhsStorageOrder> lhs(_lhs,lhsStride);\n    const_blas_data_mapper<Scalar, Index, RhsStorageOrder> rhs(_rhs,rhsStride);\n\n    typedef gebp_traits<Scalar,Scalar> Traits;\n\n    Index kc = size;  // cache block size along the K direction\n    Index mc = rows;  // cache block size along the M direction\n    Index nc = cols;  // cache block size along the N direction\n    computeProductBlockingSizes<Scalar,Scalar>(kc, mc, nc);\n    // kc must smaller than mc\n    kc = (std::min)(kc,mc);\n\n    std::size_t sizeW = kc*Traits::WorkSpaceFactor;\n    std::size_t sizeB = sizeW + kc*cols;\n    ei_declare_aligned_stack_constructed_variable(Scalar, blockA, kc*mc, 0);\n    ei_declare_aligned_stack_constructed_variable(Scalar, allocatedBlockB, sizeB, 0);\n    Scalar* blockB = allocatedBlockB + sizeW;\n\n    gebp_kernel<Scalar, Scalar, Index, Traits::mr, Traits::nr, ConjugateLhs, ConjugateRhs> gebp_kernel;\n    symm_pack_lhs<Scalar, Index, Traits::mr, Traits::LhsProgress, LhsStorageOrder> pack_lhs;\n    gemm_pack_rhs<Scalar, Index, Traits::nr,RhsStorageOrder> pack_rhs;\n    gemm_pack_lhs<Scalar, Index, Traits::mr, Traits::LhsProgress, LhsStorageOrder==RowMajor?ColMajor:RowMajor, true> pack_lhs_transposed;\n\n    for(Index k2=0; k2<size; k2+=kc)\n    {\n      const Index actual_kc = (std::min)(k2+kc,size)-k2;\n\n      // we have selected one row panel of rhs and one column panel of lhs\n      // pack rhs's panel into a sequential chunk of memory\n      // and expand each coeff to a constant packet for further reuse\n      pack_rhs(blockB, &rhs(k2,0), rhsStride, actual_kc, cols);\n\n      // the select lhs's panel has to be split in three different parts:\n      //  1 - the transposed panel above the diagonal block => transposed packed copy\n      //  2 - the diagonal block => special packed copy\n      //  3 - the panel below the diagonal block => generic packed copy\n      for(Index i2=0; i2<k2; i2+=mc)\n      {\n        const Index actual_mc = (std::min)(i2+mc,k2)-i2;\n        // transposed packed copy\n        pack_lhs_transposed(blockA, &lhs(k2, i2), lhsStride, actual_kc, actual_mc);\n\n        gebp_kernel(res+i2, resStride, blockA, blockB, actual_mc, actual_kc, cols, alpha);\n      }\n      // the block diagonal\n      {\n        const Index actual_mc = (std::min)(k2+kc,size)-k2;\n        // symmetric packed copy\n        pack_lhs(blockA, &lhs(k2,k2), lhsStride, actual_kc, actual_mc);\n\n        gebp_kernel(res+k2, resStride, blockA, blockB, actual_mc, actual_kc, cols, alpha);\n      }\n\n      for(Index i2=k2+kc; i2<size; i2+=mc)\n      {\n        const Index actual_mc = (std::min)(i2+mc,size)-i2;\n        gemm_pack_lhs<Scalar, Index, Traits::mr, Traits::LhsProgress, LhsStorageOrder,false>()\n          (blockA, &lhs(i2, k2), lhsStride, actual_kc, actual_mc);\n\n        gebp_kernel(res+i2, resStride, blockA, blockB, actual_mc, actual_kc, cols, alpha);\n      }\n    }\n  }\n\n// matrix * selfadjoint product\ntemplate <typename Scalar, typename Index,\n          int LhsStorageOrder, bool ConjugateLhs,\n          int RhsStorageOrder, bool ConjugateRhs>\nstruct product_selfadjoint_matrix<Scalar,Index,LhsStorageOrder,false,ConjugateLhs, RhsStorageOrder,true,ConjugateRhs,ColMajor>\n{\n\n  static EIGEN_DONT_INLINE void run(\n    Index rows, Index cols,\n    const Scalar* _lhs, Index lhsStride,\n    const Scalar* _rhs, Index rhsStride,\n    Scalar* res,        Index resStride,\n    const Scalar& alpha);\n};\n\ntemplate <typename Scalar, typename Index,\n          int LhsStorageOrder, bool ConjugateLhs,\n          int RhsStorageOrder, bool ConjugateRhs>\nEIGEN_DONT_INLINE void product_selfadjoint_matrix<Scalar,Index,LhsStorageOrder,false,ConjugateLhs, RhsStorageOrder,true,ConjugateRhs,ColMajor>::run(\n    Index rows, Index cols,\n    const Scalar* _lhs, Index lhsStride,\n    const Scalar* _rhs, Index rhsStride,\n    Scalar* res,        Index resStride,\n    const Scalar& alpha)\n  {\n    Index size = cols;\n\n    const_blas_data_mapper<Scalar, Index, LhsStorageOrder> lhs(_lhs,lhsStride);\n\n    typedef gebp_traits<Scalar,Scalar> Traits;\n\n    Index kc = size; // cache block size along the K direction\n    Index mc = rows;  // cache block size along the M direction\n    Index nc = cols;  // cache block size along the N direction\n    computeProductBlockingSizes<Scalar,Scalar>(kc, mc, nc);\n    std::size_t sizeW = kc*Traits::WorkSpaceFactor;\n    std::size_t sizeB = sizeW + kc*cols;\n    ei_declare_aligned_stack_constructed_variable(Scalar, blockA, kc*mc, 0);\n    ei_declare_aligned_stack_constructed_variable(Scalar, allocatedBlockB, sizeB, 0);\n    Scalar* blockB = allocatedBlockB + sizeW;\n\n    gebp_kernel<Scalar, Scalar, Index, Traits::mr, Traits::nr, ConjugateLhs, ConjugateRhs> gebp_kernel;\n    gemm_pack_lhs<Scalar, Index, Traits::mr, Traits::LhsProgress, LhsStorageOrder> pack_lhs;\n    symm_pack_rhs<Scalar, Index, Traits::nr,RhsStorageOrder> pack_rhs;\n\n    for(Index k2=0; k2<size; k2+=kc)\n    {\n      const Index actual_kc = (std::min)(k2+kc,size)-k2;\n\n      pack_rhs(blockB, _rhs, rhsStride, actual_kc, cols, k2);\n\n      // => GEPP\n      for(Index i2=0; i2<rows; i2+=mc)\n      {\n        const Index actual_mc = (std::min)(i2+mc,rows)-i2;\n        pack_lhs(blockA, &lhs(i2, k2), lhsStride, actual_kc, actual_mc);\n\n        gebp_kernel(res+i2, resStride, blockA, blockB, actual_mc, actual_kc, cols, alpha);\n      }\n    }\n  }\n\n} // end namespace internal\n\n/***************************************************************************\n* Wrapper to product_selfadjoint_matrix\n***************************************************************************/\n\nnamespace internal {\ntemplate<typename Lhs, int LhsMode, typename Rhs, int RhsMode>\nstruct traits<SelfadjointProductMatrix<Lhs,LhsMode,false,Rhs,RhsMode,false> >\n  : traits<ProductBase<SelfadjointProductMatrix<Lhs,LhsMode,false,Rhs,RhsMode,false>, Lhs, Rhs> >\n{};\n}\n\ntemplate<typename Lhs, int LhsMode, typename Rhs, int RhsMode>\nstruct SelfadjointProductMatrix<Lhs,LhsMode,false,Rhs,RhsMode,false>\n  : public ProductBase<SelfadjointProductMatrix<Lhs,LhsMode,false,Rhs,RhsMode,false>, Lhs, Rhs >\n{\n  EIGEN_PRODUCT_PUBLIC_INTERFACE(SelfadjointProductMatrix)\n\n  SelfadjointProductMatrix(const Lhs& lhs, const Rhs& rhs) : Base(lhs,rhs) {}\n\n  enum {\n    LhsIsUpper = (LhsMode&(Upper|Lower))==Upper,\n    LhsIsSelfAdjoint = (LhsMode&SelfAdjoint)==SelfAdjoint,\n    RhsIsUpper = (RhsMode&(Upper|Lower))==Upper,\n    RhsIsSelfAdjoint = (RhsMode&SelfAdjoint)==SelfAdjoint\n  };\n\n  template<typename Dest> void scaleAndAddTo(Dest& dst, const Scalar& alpha) const\n  {\n    eigen_assert(dst.rows()==m_lhs.rows() && dst.cols()==m_rhs.cols());\n\n    typename internal::add_const_on_value_type<ActualLhsType>::type lhs = LhsBlasTraits::extract(m_lhs);\n    typename internal::add_const_on_value_type<ActualRhsType>::type rhs = RhsBlasTraits::extract(m_rhs);\n\n    Scalar actualAlpha = alpha * LhsBlasTraits::extractScalarFactor(m_lhs)\n                               * RhsBlasTraits::extractScalarFactor(m_rhs);\n\n    internal::product_selfadjoint_matrix<Scalar, Index,\n      EIGEN_LOGICAL_XOR(LhsIsUpper,\n                        internal::traits<Lhs>::Flags &RowMajorBit) ? RowMajor : ColMajor, LhsIsSelfAdjoint,\n      NumTraits<Scalar>::IsComplex && EIGEN_LOGICAL_XOR(LhsIsUpper,bool(LhsBlasTraits::NeedToConjugate)),\n      EIGEN_LOGICAL_XOR(RhsIsUpper,\n                        internal::traits<Rhs>::Flags &RowMajorBit) ? RowMajor : ColMajor, RhsIsSelfAdjoint,\n      NumTraits<Scalar>::IsComplex && EIGEN_LOGICAL_XOR(RhsIsUpper,bool(RhsBlasTraits::NeedToConjugate)),\n      internal::traits<Dest>::Flags&RowMajorBit  ? RowMajor : ColMajor>\n      ::run(\n        lhs.rows(), rhs.cols(),                 // sizes\n        &lhs.coeffRef(0,0),    lhs.outerStride(),  // lhs info\n        &rhs.coeffRef(0,0),    rhs.outerStride(),  // rhs info\n        &dst.coeffRef(0,0), dst.outerStride(),  // result info\n        actualAlpha                             // alpha\n      );\n  }\n};\n\n} // end namespace Eigen\n\n#endif // EIGEN_SELFADJOINT_MATRIX_MATRIX_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix_MKL.h",
    "content": "/*\n Copyright (c) 2011, Intel Corporation. All rights reserved.\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n * Neither the name of Intel Corporation nor the names of its contributors may\n   be used to endorse or promote products derived from this software without\n   specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\n ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n ********************************************************************************\n *   Content : Eigen bindings to Intel(R) MKL\n *   Self adjoint matrix * matrix product functionality based on ?SYMM/?HEMM.\n ********************************************************************************\n*/\n\n#ifndef EIGEN_SELFADJOINT_MATRIX_MATRIX_MKL_H\n#define EIGEN_SELFADJOINT_MATRIX_MATRIX_MKL_H\n\nnamespace Eigen { \n\nnamespace internal {\n\n\n/* Optimized selfadjoint matrix * matrix (?SYMM/?HEMM) product */\n\n#define EIGEN_MKL_SYMM_L(EIGTYPE, MKLTYPE, EIGPREFIX, MKLPREFIX) \\\ntemplate <typename Index, \\\n          int LhsStorageOrder, bool ConjugateLhs, \\\n          int RhsStorageOrder, bool ConjugateRhs> \\\nstruct product_selfadjoint_matrix<EIGTYPE,Index,LhsStorageOrder,true,ConjugateLhs,RhsStorageOrder,false,ConjugateRhs,ColMajor> \\\n{\\\n\\\n  static void run( \\\n    Index rows, Index cols, \\\n    const EIGTYPE* _lhs, Index lhsStride, \\\n    const EIGTYPE* _rhs, Index rhsStride, \\\n    EIGTYPE* res,        Index resStride, \\\n    EIGTYPE alpha) \\\n  { \\\n    char side='L', uplo='L'; \\\n    MKL_INT m, n, lda, ldb, ldc; \\\n    const EIGTYPE *a, *b; \\\n    MKLTYPE alpha_, beta_; \\\n    MatrixX##EIGPREFIX b_tmp; \\\n    EIGTYPE myone(1);\\\n\\\n/* Set transpose options */ \\\n/* Set m, n, k */ \\\n    m = (MKL_INT)rows;  \\\n    n = (MKL_INT)cols;  \\\n\\\n/* Set alpha_ & beta_ */ \\\n    assign_scalar_eig2mkl(alpha_, alpha); \\\n    assign_scalar_eig2mkl(beta_, myone); \\\n\\\n/* Set lda, ldb, ldc */ \\\n    lda = (MKL_INT)lhsStride; \\\n    ldb = (MKL_INT)rhsStride; \\\n    ldc = (MKL_INT)resStride; \\\n\\\n/* Set a, b, c */ \\\n    if (LhsStorageOrder==RowMajor) uplo='U'; \\\n    a = _lhs; \\\n\\\n    if (RhsStorageOrder==RowMajor) { \\\n      Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > rhs(_rhs,n,m,OuterStride<>(rhsStride)); \\\n      b_tmp = rhs.adjoint(); \\\n      b = b_tmp.data(); \\\n      ldb = b_tmp.outerStride(); \\\n    } else b = _rhs; \\\n\\\n    MKLPREFIX##symm(&side, &uplo, &m, &n, &alpha_, (const MKLTYPE*)a, &lda, (const MKLTYPE*)b, &ldb, &beta_, (MKLTYPE*)res, &ldc); \\\n\\\n  } \\\n};\n\n\n#define EIGEN_MKL_HEMM_L(EIGTYPE, MKLTYPE, EIGPREFIX, MKLPREFIX) \\\ntemplate <typename Index, \\\n          int LhsStorageOrder, bool ConjugateLhs, \\\n          int RhsStorageOrder, bool ConjugateRhs> \\\nstruct product_selfadjoint_matrix<EIGTYPE,Index,LhsStorageOrder,true,ConjugateLhs,RhsStorageOrder,false,ConjugateRhs,ColMajor> \\\n{\\\n  static void run( \\\n    Index rows, Index cols, \\\n    const EIGTYPE* _lhs, Index lhsStride, \\\n    const EIGTYPE* _rhs, Index rhsStride, \\\n    EIGTYPE* res,        Index resStride, \\\n    EIGTYPE alpha) \\\n  { \\\n    char side='L', uplo='L'; \\\n    MKL_INT m, n, lda, ldb, ldc; \\\n    const EIGTYPE *a, *b; \\\n    MKLTYPE alpha_, beta_; \\\n    MatrixX##EIGPREFIX b_tmp; \\\n    Matrix<EIGTYPE, Dynamic, Dynamic, LhsStorageOrder> a_tmp; \\\n    EIGTYPE myone(1); \\\n\\\n/* Set transpose options */ \\\n/* Set m, n, k */ \\\n    m = (MKL_INT)rows; \\\n    n = (MKL_INT)cols; \\\n\\\n/* Set alpha_ & beta_ */ \\\n    assign_scalar_eig2mkl(alpha_, alpha); \\\n    assign_scalar_eig2mkl(beta_, myone); \\\n\\\n/* Set lda, ldb, ldc */ \\\n    lda = (MKL_INT)lhsStride; \\\n    ldb = (MKL_INT)rhsStride; \\\n    ldc = (MKL_INT)resStride; \\\n\\\n/* Set a, b, c */ \\\n    if (((LhsStorageOrder==ColMajor) && ConjugateLhs) || ((LhsStorageOrder==RowMajor) && (!ConjugateLhs))) { \\\n      Map<const Matrix<EIGTYPE, Dynamic, Dynamic, LhsStorageOrder>, 0, OuterStride<> > lhs(_lhs,m,m,OuterStride<>(lhsStride)); \\\n      a_tmp = lhs.conjugate(); \\\n      a = a_tmp.data(); \\\n      lda = a_tmp.outerStride(); \\\n    } else a = _lhs; \\\n    if (LhsStorageOrder==RowMajor) uplo='U'; \\\n\\\n    if (RhsStorageOrder==ColMajor && (!ConjugateRhs)) { \\\n       b = _rhs; } \\\n    else { \\\n      if (RhsStorageOrder==ColMajor && ConjugateRhs) { \\\n        Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > rhs(_rhs,m,n,OuterStride<>(rhsStride)); \\\n        b_tmp = rhs.conjugate(); \\\n      } else \\\n      if (ConjugateRhs) { \\\n        Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > rhs(_rhs,n,m,OuterStride<>(rhsStride)); \\\n        b_tmp = rhs.adjoint(); \\\n      } else { \\\n        Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > rhs(_rhs,n,m,OuterStride<>(rhsStride)); \\\n        b_tmp = rhs.transpose(); \\\n      } \\\n      b = b_tmp.data(); \\\n      ldb = b_tmp.outerStride(); \\\n    } \\\n\\\n    MKLPREFIX##hemm(&side, &uplo, &m, &n, &alpha_, (const MKLTYPE*)a, &lda, (const MKLTYPE*)b, &ldb, &beta_, (MKLTYPE*)res, &ldc); \\\n\\\n  } \\\n};\n\nEIGEN_MKL_SYMM_L(double, double, d, d)\nEIGEN_MKL_SYMM_L(float, float, f, s)\nEIGEN_MKL_HEMM_L(dcomplex, MKL_Complex16, cd, z)\nEIGEN_MKL_HEMM_L(scomplex, MKL_Complex8, cf, c)\n\n\n/* Optimized matrix * selfadjoint matrix (?SYMM/?HEMM) product */\n\n#define EIGEN_MKL_SYMM_R(EIGTYPE, MKLTYPE, EIGPREFIX, MKLPREFIX) \\\ntemplate <typename Index, \\\n          int LhsStorageOrder, bool ConjugateLhs, \\\n          int RhsStorageOrder, bool ConjugateRhs> \\\nstruct product_selfadjoint_matrix<EIGTYPE,Index,LhsStorageOrder,false,ConjugateLhs,RhsStorageOrder,true,ConjugateRhs,ColMajor> \\\n{\\\n\\\n  static void run( \\\n    Index rows, Index cols, \\\n    const EIGTYPE* _lhs, Index lhsStride, \\\n    const EIGTYPE* _rhs, Index rhsStride, \\\n    EIGTYPE* res,        Index resStride, \\\n    EIGTYPE alpha) \\\n  { \\\n    char side='R', uplo='L'; \\\n    MKL_INT m, n, lda, ldb, ldc; \\\n    const EIGTYPE *a, *b; \\\n    MKLTYPE alpha_, beta_; \\\n    MatrixX##EIGPREFIX b_tmp; \\\n    EIGTYPE myone(1);\\\n\\\n/* Set m, n, k */ \\\n    m = (MKL_INT)rows;  \\\n    n = (MKL_INT)cols;  \\\n\\\n/* Set alpha_ & beta_ */ \\\n    assign_scalar_eig2mkl(alpha_, alpha); \\\n    assign_scalar_eig2mkl(beta_, myone); \\\n\\\n/* Set lda, ldb, ldc */ \\\n    lda = (MKL_INT)rhsStride; \\\n    ldb = (MKL_INT)lhsStride; \\\n    ldc = (MKL_INT)resStride; \\\n\\\n/* Set a, b, c */ \\\n    if (RhsStorageOrder==RowMajor) uplo='U'; \\\n    a = _rhs; \\\n\\\n    if (LhsStorageOrder==RowMajor) { \\\n      Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > lhs(_lhs,n,m,OuterStride<>(rhsStride)); \\\n      b_tmp = lhs.adjoint(); \\\n      b = b_tmp.data(); \\\n      ldb = b_tmp.outerStride(); \\\n    } else b = _lhs; \\\n\\\n    MKLPREFIX##symm(&side, &uplo, &m, &n, &alpha_, (const MKLTYPE*)a, &lda, (const MKLTYPE*)b, &ldb, &beta_, (MKLTYPE*)res, &ldc); \\\n\\\n  } \\\n};\n\n\n#define EIGEN_MKL_HEMM_R(EIGTYPE, MKLTYPE, EIGPREFIX, MKLPREFIX) \\\ntemplate <typename Index, \\\n          int LhsStorageOrder, bool ConjugateLhs, \\\n          int RhsStorageOrder, bool ConjugateRhs> \\\nstruct product_selfadjoint_matrix<EIGTYPE,Index,LhsStorageOrder,false,ConjugateLhs,RhsStorageOrder,true,ConjugateRhs,ColMajor> \\\n{\\\n  static void run( \\\n    Index rows, Index cols, \\\n    const EIGTYPE* _lhs, Index lhsStride, \\\n    const EIGTYPE* _rhs, Index rhsStride, \\\n    EIGTYPE* res,        Index resStride, \\\n    EIGTYPE alpha) \\\n  { \\\n    char side='R', uplo='L'; \\\n    MKL_INT m, n, lda, ldb, ldc; \\\n    const EIGTYPE *a, *b; \\\n    MKLTYPE alpha_, beta_; \\\n    MatrixX##EIGPREFIX b_tmp; \\\n    Matrix<EIGTYPE, Dynamic, Dynamic, RhsStorageOrder> a_tmp; \\\n    EIGTYPE myone(1); \\\n\\\n/* Set m, n, k */ \\\n    m = (MKL_INT)rows; \\\n    n = (MKL_INT)cols; \\\n\\\n/* Set alpha_ & beta_ */ \\\n    assign_scalar_eig2mkl(alpha_, alpha); \\\n    assign_scalar_eig2mkl(beta_, myone); \\\n\\\n/* Set lda, ldb, ldc */ \\\n    lda = (MKL_INT)rhsStride; \\\n    ldb = (MKL_INT)lhsStride; \\\n    ldc = (MKL_INT)resStride; \\\n\\\n/* Set a, b, c */ \\\n    if (((RhsStorageOrder==ColMajor) && ConjugateRhs) || ((RhsStorageOrder==RowMajor) && (!ConjugateRhs))) { \\\n      Map<const Matrix<EIGTYPE, Dynamic, Dynamic, RhsStorageOrder>, 0, OuterStride<> > rhs(_rhs,n,n,OuterStride<>(rhsStride)); \\\n      a_tmp = rhs.conjugate(); \\\n      a = a_tmp.data(); \\\n      lda = a_tmp.outerStride(); \\\n    } else a = _rhs; \\\n    if (RhsStorageOrder==RowMajor) uplo='U'; \\\n\\\n    if (LhsStorageOrder==ColMajor && (!ConjugateLhs)) { \\\n       b = _lhs; } \\\n    else { \\\n      if (LhsStorageOrder==ColMajor && ConjugateLhs) { \\\n        Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > lhs(_lhs,m,n,OuterStride<>(lhsStride)); \\\n        b_tmp = lhs.conjugate(); \\\n      } else \\\n      if (ConjugateLhs) { \\\n        Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > lhs(_lhs,n,m,OuterStride<>(lhsStride)); \\\n        b_tmp = lhs.adjoint(); \\\n      } else { \\\n        Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > lhs(_lhs,n,m,OuterStride<>(lhsStride)); \\\n        b_tmp = lhs.transpose(); \\\n      } \\\n      b = b_tmp.data(); \\\n      ldb = b_tmp.outerStride(); \\\n    } \\\n\\\n    MKLPREFIX##hemm(&side, &uplo, &m, &n, &alpha_, (const MKLTYPE*)a, &lda, (const MKLTYPE*)b, &ldb, &beta_, (MKLTYPE*)res, &ldc); \\\n  } \\\n};\n\nEIGEN_MKL_SYMM_R(double, double, d, d)\nEIGEN_MKL_SYMM_R(float, float, f, s)\nEIGEN_MKL_HEMM_R(dcomplex, MKL_Complex16, cd, z)\nEIGEN_MKL_HEMM_R(scomplex, MKL_Complex8, cf, c)\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_SELFADJOINT_MATRIX_MATRIX_MKL_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/products/SelfadjointMatrixVector.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SELFADJOINT_MATRIX_VECTOR_H\n#define EIGEN_SELFADJOINT_MATRIX_VECTOR_H\n\nnamespace Eigen { \n\nnamespace internal {\n\n/* Optimized selfadjoint matrix * vector product:\n * This algorithm processes 2 columns at onces that allows to both reduce\n * the number of load/stores of the result by a factor 2 and to reduce\n * the instruction dependency.\n */\n\ntemplate<typename Scalar, typename Index, int StorageOrder, int UpLo, bool ConjugateLhs, bool ConjugateRhs, int Version=Specialized>\nstruct selfadjoint_matrix_vector_product;\n\ntemplate<typename Scalar, typename Index, int StorageOrder, int UpLo, bool ConjugateLhs, bool ConjugateRhs, int Version>\nstruct selfadjoint_matrix_vector_product\n\n{\nstatic EIGEN_DONT_INLINE void run(\n  Index size,\n  const Scalar*  lhs, Index lhsStride,\n  const Scalar* _rhs, Index rhsIncr,\n  Scalar* res,\n  Scalar alpha);\n};\n\ntemplate<typename Scalar, typename Index, int StorageOrder, int UpLo, bool ConjugateLhs, bool ConjugateRhs, int Version>\nEIGEN_DONT_INLINE void selfadjoint_matrix_vector_product<Scalar,Index,StorageOrder,UpLo,ConjugateLhs,ConjugateRhs,Version>::run(\n  Index size,\n  const Scalar*  lhs, Index lhsStride,\n  const Scalar* _rhs, Index rhsIncr,\n  Scalar* res,\n  Scalar alpha)\n{\n  typedef typename packet_traits<Scalar>::type Packet;\n  const Index PacketSize = sizeof(Packet)/sizeof(Scalar);\n\n  enum {\n    IsRowMajor = StorageOrder==RowMajor ? 1 : 0,\n    IsLower = UpLo == Lower ? 1 : 0,\n    FirstTriangular = IsRowMajor == IsLower\n  };\n\n  conj_helper<Scalar,Scalar,NumTraits<Scalar>::IsComplex && EIGEN_LOGICAL_XOR(ConjugateLhs,  IsRowMajor), ConjugateRhs> cj0;\n  conj_helper<Scalar,Scalar,NumTraits<Scalar>::IsComplex && EIGEN_LOGICAL_XOR(ConjugateLhs, !IsRowMajor), ConjugateRhs> cj1;\n  conj_helper<Scalar,Scalar,NumTraits<Scalar>::IsComplex, ConjugateRhs> cjd;\n\n  conj_helper<Packet,Packet,NumTraits<Scalar>::IsComplex && EIGEN_LOGICAL_XOR(ConjugateLhs,  IsRowMajor), ConjugateRhs> pcj0;\n  conj_helper<Packet,Packet,NumTraits<Scalar>::IsComplex && EIGEN_LOGICAL_XOR(ConjugateLhs, !IsRowMajor), ConjugateRhs> pcj1;\n\n  Scalar cjAlpha = ConjugateRhs ? numext::conj(alpha) : alpha;\n\n  // FIXME this copy is now handled outside product_selfadjoint_vector, so it could probably be removed.\n  // if the rhs is not sequentially stored in memory we copy it to a temporary buffer,\n  // this is because we need to extract packets\n  ei_declare_aligned_stack_constructed_variable(Scalar,rhs,size,rhsIncr==1 ? const_cast<Scalar*>(_rhs) : 0);  \n  if (rhsIncr!=1)\n  {\n    const Scalar* it = _rhs;\n    for (Index i=0; i<size; ++i, it+=rhsIncr)\n      rhs[i] = *it;\n  }\n\n  Index bound = (std::max)(Index(0),size-8) & 0xfffffffe;\n  if (FirstTriangular)\n    bound = size - bound;\n\n  for (Index j=FirstTriangular ? bound : 0;\n       j<(FirstTriangular ? size : bound);j+=2)\n  {\n    const Scalar* EIGEN_RESTRICT A0 = lhs + j*lhsStride;\n    const Scalar* EIGEN_RESTRICT A1 = lhs + (j+1)*lhsStride;\n\n    Scalar t0 = cjAlpha * rhs[j];\n    Packet ptmp0 = pset1<Packet>(t0);\n    Scalar t1 = cjAlpha * rhs[j+1];\n    Packet ptmp1 = pset1<Packet>(t1);\n\n    Scalar t2(0);\n    Packet ptmp2 = pset1<Packet>(t2);\n    Scalar t3(0);\n    Packet ptmp3 = pset1<Packet>(t3);\n\n    size_t starti = FirstTriangular ? 0 : j+2;\n    size_t endi   = FirstTriangular ? j : size;\n    size_t alignedStart = (starti) + internal::first_aligned(&res[starti], endi-starti);\n    size_t alignedEnd = alignedStart + ((endi-alignedStart)/(PacketSize))*(PacketSize);\n\n    // TODO make sure this product is a real * complex and that the rhs is properly conjugated if needed\n    res[j]   += cjd.pmul(numext::real(A0[j]), t0);\n    res[j+1] += cjd.pmul(numext::real(A1[j+1]), t1);\n    if(FirstTriangular)\n    {\n      res[j]   += cj0.pmul(A1[j],   t1);\n      t3       += cj1.pmul(A1[j],   rhs[j]);\n    }\n    else\n    {\n      res[j+1] += cj0.pmul(A0[j+1],t0);\n      t2 += cj1.pmul(A0[j+1], rhs[j+1]);\n    }\n\n    for (size_t i=starti; i<alignedStart; ++i)\n    {\n      res[i] += t0 * A0[i] + t1 * A1[i];\n      t2 += numext::conj(A0[i]) * rhs[i];\n      t3 += numext::conj(A1[i]) * rhs[i];\n    }\n    // Yes this an optimization for gcc 4.3 and 4.4 (=> huge speed up)\n    // gcc 4.2 does this optimization automatically.\n    const Scalar* EIGEN_RESTRICT a0It  = A0  + alignedStart;\n    const Scalar* EIGEN_RESTRICT a1It  = A1  + alignedStart;\n    const Scalar* EIGEN_RESTRICT rhsIt = rhs + alignedStart;\n          Scalar* EIGEN_RESTRICT resIt = res + alignedStart;\n    for (size_t i=alignedStart; i<alignedEnd; i+=PacketSize)\n    {\n      Packet A0i = ploadu<Packet>(a0It);  a0It  += PacketSize;\n      Packet A1i = ploadu<Packet>(a1It);  a1It  += PacketSize;\n      Packet Bi  = ploadu<Packet>(rhsIt); rhsIt += PacketSize; // FIXME should be aligned in most cases\n      Packet Xi  = pload <Packet>(resIt);\n\n      Xi    = pcj0.pmadd(A0i,ptmp0, pcj0.pmadd(A1i,ptmp1,Xi));\n      ptmp2 = pcj1.pmadd(A0i,  Bi, ptmp2);\n      ptmp3 = pcj1.pmadd(A1i,  Bi, ptmp3);\n      pstore(resIt,Xi); resIt += PacketSize;\n    }\n    for (size_t i=alignedEnd; i<endi; i++)\n    {\n      res[i] += cj0.pmul(A0[i], t0) + cj0.pmul(A1[i],t1);\n      t2 += cj1.pmul(A0[i], rhs[i]);\n      t3 += cj1.pmul(A1[i], rhs[i]);\n    }\n\n    res[j]   += alpha * (t2 + predux(ptmp2));\n    res[j+1] += alpha * (t3 + predux(ptmp3));\n  }\n  for (Index j=FirstTriangular ? 0 : bound;j<(FirstTriangular ? bound : size);j++)\n  {\n    const Scalar* EIGEN_RESTRICT A0 = lhs + j*lhsStride;\n\n    Scalar t1 = cjAlpha * rhs[j];\n    Scalar t2(0);\n    // TODO make sure this product is a real * complex and that the rhs is properly conjugated if needed\n    res[j] += cjd.pmul(numext::real(A0[j]), t1);\n    for (Index i=FirstTriangular ? 0 : j+1; i<(FirstTriangular ? j : size); i++)\n    {\n      res[i] += cj0.pmul(A0[i], t1);\n      t2 += cj1.pmul(A0[i], rhs[i]);\n    }\n    res[j] += alpha * t2;\n  }\n}\n\n} // end namespace internal \n\n/***************************************************************************\n* Wrapper to product_selfadjoint_vector\n***************************************************************************/\n\nnamespace internal {\ntemplate<typename Lhs, int LhsMode, typename Rhs>\nstruct traits<SelfadjointProductMatrix<Lhs,LhsMode,false,Rhs,0,true> >\n  : traits<ProductBase<SelfadjointProductMatrix<Lhs,LhsMode,false,Rhs,0,true>, Lhs, Rhs> >\n{};\n}\n\ntemplate<typename Lhs, int LhsMode, typename Rhs>\nstruct SelfadjointProductMatrix<Lhs,LhsMode,false,Rhs,0,true>\n  : public ProductBase<SelfadjointProductMatrix<Lhs,LhsMode,false,Rhs,0,true>, Lhs, Rhs >\n{\n  EIGEN_PRODUCT_PUBLIC_INTERFACE(SelfadjointProductMatrix)\n\n  enum {\n    LhsUpLo = LhsMode&(Upper|Lower)\n  };\n\n  SelfadjointProductMatrix(const Lhs& lhs, const Rhs& rhs) : Base(lhs,rhs) {}\n\n  template<typename Dest> void scaleAndAddTo(Dest& dest, const Scalar& alpha) const\n  {\n    typedef typename Dest::Scalar ResScalar;\n    typedef typename Base::RhsScalar RhsScalar;\n    typedef Map<Matrix<ResScalar,Dynamic,1>, Aligned> MappedDest;\n    \n    eigen_assert(dest.rows()==m_lhs.rows() && dest.cols()==m_rhs.cols());\n\n    typename internal::add_const_on_value_type<ActualLhsType>::type lhs = LhsBlasTraits::extract(m_lhs);\n    typename internal::add_const_on_value_type<ActualRhsType>::type rhs = RhsBlasTraits::extract(m_rhs);\n\n    Scalar actualAlpha = alpha * LhsBlasTraits::extractScalarFactor(m_lhs)\n                               * RhsBlasTraits::extractScalarFactor(m_rhs);\n\n    enum {\n      EvalToDest = (Dest::InnerStrideAtCompileTime==1),\n      UseRhs = (_ActualRhsType::InnerStrideAtCompileTime==1)\n    };\n    \n    internal::gemv_static_vector_if<ResScalar,Dest::SizeAtCompileTime,Dest::MaxSizeAtCompileTime,!EvalToDest> static_dest;\n    internal::gemv_static_vector_if<RhsScalar,_ActualRhsType::SizeAtCompileTime,_ActualRhsType::MaxSizeAtCompileTime,!UseRhs> static_rhs;\n\n    ei_declare_aligned_stack_constructed_variable(ResScalar,actualDestPtr,dest.size(),\n                                                  EvalToDest ? dest.data() : static_dest.data());\n                                                  \n    ei_declare_aligned_stack_constructed_variable(RhsScalar,actualRhsPtr,rhs.size(),\n        UseRhs ? const_cast<RhsScalar*>(rhs.data()) : static_rhs.data());\n    \n    if(!EvalToDest)\n    {\n      #ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN\n      int size = dest.size();\n      EIGEN_DENSE_STORAGE_CTOR_PLUGIN\n      #endif\n      MappedDest(actualDestPtr, dest.size()) = dest;\n    }\n      \n    if(!UseRhs)\n    {\n      #ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN\n      int size = rhs.size();\n      EIGEN_DENSE_STORAGE_CTOR_PLUGIN\n      #endif\n      Map<typename _ActualRhsType::PlainObject>(actualRhsPtr, rhs.size()) = rhs;\n    }\n      \n      \n    internal::selfadjoint_matrix_vector_product<Scalar, Index, (internal::traits<_ActualLhsType>::Flags&RowMajorBit) ? RowMajor : ColMajor, int(LhsUpLo), bool(LhsBlasTraits::NeedToConjugate), bool(RhsBlasTraits::NeedToConjugate)>::run\n      (\n        lhs.rows(),                             // size\n        &lhs.coeffRef(0,0),  lhs.outerStride(), // lhs info\n        actualRhsPtr, 1,                        // rhs info\n        actualDestPtr,                          // result info\n        actualAlpha                             // scale factor\n      );\n    \n    if(!EvalToDest)\n      dest = MappedDest(actualDestPtr, dest.size());\n  }\n};\n\nnamespace internal {\ntemplate<typename Lhs, typename Rhs, int RhsMode>\nstruct traits<SelfadjointProductMatrix<Lhs,0,true,Rhs,RhsMode,false> >\n  : traits<ProductBase<SelfadjointProductMatrix<Lhs,0,true,Rhs,RhsMode,false>, Lhs, Rhs> >\n{};\n}\n\ntemplate<typename Lhs, typename Rhs, int RhsMode>\nstruct SelfadjointProductMatrix<Lhs,0,true,Rhs,RhsMode,false>\n  : public ProductBase<SelfadjointProductMatrix<Lhs,0,true,Rhs,RhsMode,false>, Lhs, Rhs >\n{\n  EIGEN_PRODUCT_PUBLIC_INTERFACE(SelfadjointProductMatrix)\n\n  enum {\n    RhsUpLo = RhsMode&(Upper|Lower)\n  };\n\n  SelfadjointProductMatrix(const Lhs& lhs, const Rhs& rhs) : Base(lhs,rhs) {}\n\n  template<typename Dest> void scaleAndAddTo(Dest& dest, const Scalar& alpha) const\n  {\n    // let's simply transpose the product\n    Transpose<Dest> destT(dest);\n    SelfadjointProductMatrix<Transpose<const Rhs>, int(RhsUpLo)==Upper ? Lower : Upper, false,\n                             Transpose<const Lhs>, 0, true>(m_rhs.transpose(), m_lhs.transpose()).scaleAndAddTo(destT, alpha);\n  }\n};\n\n} // end namespace Eigen\n\n#endif // EIGEN_SELFADJOINT_MATRIX_VECTOR_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/products/SelfadjointMatrixVector_MKL.h",
    "content": "/*\n Copyright (c) 2011, Intel Corporation. All rights reserved.\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n * Neither the name of Intel Corporation nor the names of its contributors may\n   be used to endorse or promote products derived from this software without\n   specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\n ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n ********************************************************************************\n *   Content : Eigen bindings to Intel(R) MKL\n *   Selfadjoint matrix-vector product functionality based on ?SYMV/HEMV.\n ********************************************************************************\n*/\n\n#ifndef EIGEN_SELFADJOINT_MATRIX_VECTOR_MKL_H\n#define EIGEN_SELFADJOINT_MATRIX_VECTOR_MKL_H\n\nnamespace Eigen { \n\nnamespace internal {\n\n/**********************************************************************\n* This file implements selfadjoint matrix-vector multiplication using BLAS\n**********************************************************************/\n\n// symv/hemv specialization\n\ntemplate<typename Scalar, typename Index, int StorageOrder, int UpLo, bool ConjugateLhs, bool ConjugateRhs>\nstruct selfadjoint_matrix_vector_product_symv :\n  selfadjoint_matrix_vector_product<Scalar,Index,StorageOrder,UpLo,ConjugateLhs,ConjugateRhs,BuiltIn> {};\n\n#define EIGEN_MKL_SYMV_SPECIALIZE(Scalar) \\\ntemplate<typename Index, int StorageOrder, int UpLo, bool ConjugateLhs, bool ConjugateRhs> \\\nstruct selfadjoint_matrix_vector_product<Scalar,Index,StorageOrder,UpLo,ConjugateLhs,ConjugateRhs,Specialized> { \\\nstatic void run( \\\n  Index size, const Scalar*  lhs, Index lhsStride, \\\n  const Scalar* _rhs, Index rhsIncr, Scalar* res, Scalar alpha) { \\\n    enum {\\\n      IsColMajor = StorageOrder==ColMajor \\\n    }; \\\n    if (IsColMajor == ConjugateLhs) {\\\n      selfadjoint_matrix_vector_product<Scalar,Index,StorageOrder,UpLo,ConjugateLhs,ConjugateRhs,BuiltIn>::run( \\\n        size, lhs, lhsStride, _rhs, rhsIncr, res, alpha);  \\\n    } else {\\\n      selfadjoint_matrix_vector_product_symv<Scalar,Index,StorageOrder,UpLo,ConjugateLhs,ConjugateRhs>::run( \\\n        size, lhs, lhsStride, _rhs, rhsIncr, res, alpha);  \\\n    }\\\n  } \\\n}; \\\n\nEIGEN_MKL_SYMV_SPECIALIZE(double)\nEIGEN_MKL_SYMV_SPECIALIZE(float)\nEIGEN_MKL_SYMV_SPECIALIZE(dcomplex)\nEIGEN_MKL_SYMV_SPECIALIZE(scomplex)\n\n#define EIGEN_MKL_SYMV_SPECIALIZATION(EIGTYPE,MKLTYPE,MKLFUNC) \\\ntemplate<typename Index, int StorageOrder, int UpLo, bool ConjugateLhs, bool ConjugateRhs> \\\nstruct selfadjoint_matrix_vector_product_symv<EIGTYPE,Index,StorageOrder,UpLo,ConjugateLhs,ConjugateRhs> \\\n{ \\\ntypedef Matrix<EIGTYPE,Dynamic,1,ColMajor> SYMVVector;\\\n\\\nstatic void run( \\\nIndex size, const EIGTYPE*  lhs, Index lhsStride, \\\nconst EIGTYPE* _rhs, Index rhsIncr, EIGTYPE* res, EIGTYPE alpha) \\\n{ \\\n  enum {\\\n    IsRowMajor = StorageOrder==RowMajor ? 1 : 0, \\\n    IsLower = UpLo == Lower ? 1 : 0 \\\n  }; \\\n  MKL_INT n=size, lda=lhsStride, incx=rhsIncr, incy=1; \\\n  MKLTYPE alpha_, beta_; \\\n  const EIGTYPE *x_ptr, myone(1); \\\n  char uplo=(IsRowMajor) ? (IsLower ? 'U' : 'L') : (IsLower ? 'L' : 'U'); \\\n  assign_scalar_eig2mkl(alpha_, alpha); \\\n  assign_scalar_eig2mkl(beta_, myone); \\\n  SYMVVector x_tmp; \\\n  if (ConjugateRhs) { \\\n    Map<const SYMVVector, 0, InnerStride<> > map_x(_rhs,size,1,InnerStride<>(incx)); \\\n    x_tmp=map_x.conjugate(); \\\n    x_ptr=x_tmp.data(); \\\n    incx=1; \\\n  } else x_ptr=_rhs; \\\n  MKLFUNC(&uplo, &n, &alpha_, (const MKLTYPE*)lhs, &lda, (const MKLTYPE*)x_ptr, &incx, &beta_, (MKLTYPE*)res, &incy); \\\n}\\\n};\n\nEIGEN_MKL_SYMV_SPECIALIZATION(double,   double,        dsymv)\nEIGEN_MKL_SYMV_SPECIALIZATION(float,    float,         ssymv)\nEIGEN_MKL_SYMV_SPECIALIZATION(dcomplex, MKL_Complex16, zhemv)\nEIGEN_MKL_SYMV_SPECIALIZATION(scomplex, MKL_Complex8,  chemv)\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_SELFADJOINT_MATRIX_VECTOR_MKL_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/products/SelfadjointProduct.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SELFADJOINT_PRODUCT_H\n#define EIGEN_SELFADJOINT_PRODUCT_H\n\n/**********************************************************************\n* This file implements a self adjoint product: C += A A^T updating only\n* half of the selfadjoint matrix C.\n* It corresponds to the level 3 SYRK and level 2 SYR Blas routines.\n**********************************************************************/\n\nnamespace Eigen { \n\n\ntemplate<typename Scalar, typename Index, int UpLo, bool ConjLhs, bool ConjRhs>\nstruct selfadjoint_rank1_update<Scalar,Index,ColMajor,UpLo,ConjLhs,ConjRhs>\n{\n  static void run(Index size, Scalar* mat, Index stride, const Scalar* vecX, const Scalar* vecY, const Scalar& alpha)\n  {\n    internal::conj_if<ConjRhs> cj;\n    typedef Map<const Matrix<Scalar,Dynamic,1> > OtherMap;\n    typedef typename internal::conditional<ConjLhs,typename OtherMap::ConjugateReturnType,const OtherMap&>::type ConjLhsType;\n    for (Index i=0; i<size; ++i)\n    {\n      Map<Matrix<Scalar,Dynamic,1> >(mat+stride*i+(UpLo==Lower ? i : 0), (UpLo==Lower ? size-i : (i+1)))\n          += (alpha * cj(vecY[i])) * ConjLhsType(OtherMap(vecX+(UpLo==Lower ? i : 0),UpLo==Lower ? size-i : (i+1)));\n    }\n  }\n};\n\ntemplate<typename Scalar, typename Index, int UpLo, bool ConjLhs, bool ConjRhs>\nstruct selfadjoint_rank1_update<Scalar,Index,RowMajor,UpLo,ConjLhs,ConjRhs>\n{\n  static void run(Index size, Scalar* mat, Index stride, const Scalar* vecX, const Scalar* vecY, const Scalar& alpha)\n  {\n    selfadjoint_rank1_update<Scalar,Index,ColMajor,UpLo==Lower?Upper:Lower,ConjRhs,ConjLhs>::run(size,mat,stride,vecY,vecX,alpha);\n  }\n};\n\ntemplate<typename MatrixType, typename OtherType, int UpLo, bool OtherIsVector = OtherType::IsVectorAtCompileTime>\nstruct selfadjoint_product_selector;\n\ntemplate<typename MatrixType, typename OtherType, int UpLo>\nstruct selfadjoint_product_selector<MatrixType,OtherType,UpLo,true>\n{\n  static void run(MatrixType& mat, const OtherType& other, const typename MatrixType::Scalar& alpha)\n  {\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename MatrixType::Index Index;\n    typedef internal::blas_traits<OtherType> OtherBlasTraits;\n    typedef typename OtherBlasTraits::DirectLinearAccessType ActualOtherType;\n    typedef typename internal::remove_all<ActualOtherType>::type _ActualOtherType;\n    typename internal::add_const_on_value_type<ActualOtherType>::type actualOther = OtherBlasTraits::extract(other.derived());\n\n    Scalar actualAlpha = alpha * OtherBlasTraits::extractScalarFactor(other.derived());\n\n    enum {\n      StorageOrder = (internal::traits<MatrixType>::Flags&RowMajorBit) ? RowMajor : ColMajor,\n      UseOtherDirectly = _ActualOtherType::InnerStrideAtCompileTime==1\n    };\n    internal::gemv_static_vector_if<Scalar,OtherType::SizeAtCompileTime,OtherType::MaxSizeAtCompileTime,!UseOtherDirectly> static_other;\n\n    ei_declare_aligned_stack_constructed_variable(Scalar, actualOtherPtr, other.size(),\n      (UseOtherDirectly ? const_cast<Scalar*>(actualOther.data()) : static_other.data()));\n      \n    if(!UseOtherDirectly)\n      Map<typename _ActualOtherType::PlainObject>(actualOtherPtr, actualOther.size()) = actualOther;\n    \n    selfadjoint_rank1_update<Scalar,Index,StorageOrder,UpLo,\n                              OtherBlasTraits::NeedToConjugate  && NumTraits<Scalar>::IsComplex,\n                            (!OtherBlasTraits::NeedToConjugate) && NumTraits<Scalar>::IsComplex>\n          ::run(other.size(), mat.data(), mat.outerStride(), actualOtherPtr, actualOtherPtr, actualAlpha);\n  }\n};\n\ntemplate<typename MatrixType, typename OtherType, int UpLo>\nstruct selfadjoint_product_selector<MatrixType,OtherType,UpLo,false>\n{\n  static void run(MatrixType& mat, const OtherType& other, const typename MatrixType::Scalar& alpha)\n  {\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename MatrixType::Index Index;\n    typedef internal::blas_traits<OtherType> OtherBlasTraits;\n    typedef typename OtherBlasTraits::DirectLinearAccessType ActualOtherType;\n    typedef typename internal::remove_all<ActualOtherType>::type _ActualOtherType;\n    typename internal::add_const_on_value_type<ActualOtherType>::type actualOther = OtherBlasTraits::extract(other.derived());\n\n    Scalar actualAlpha = alpha * OtherBlasTraits::extractScalarFactor(other.derived());\n\n    enum { IsRowMajor = (internal::traits<MatrixType>::Flags&RowMajorBit) ? 1 : 0 };\n\n    internal::general_matrix_matrix_triangular_product<Index,\n      Scalar, _ActualOtherType::Flags&RowMajorBit ? RowMajor : ColMajor,   OtherBlasTraits::NeedToConjugate  && NumTraits<Scalar>::IsComplex,\n      Scalar, _ActualOtherType::Flags&RowMajorBit ? ColMajor : RowMajor, (!OtherBlasTraits::NeedToConjugate) && NumTraits<Scalar>::IsComplex,\n      MatrixType::Flags&RowMajorBit ? RowMajor : ColMajor, UpLo>\n      ::run(mat.cols(), actualOther.cols(),\n            &actualOther.coeffRef(0,0), actualOther.outerStride(), &actualOther.coeffRef(0,0), actualOther.outerStride(),\n            mat.data(), mat.outerStride(), actualAlpha);\n  }\n};\n\n// high level API\n\ntemplate<typename MatrixType, unsigned int UpLo>\ntemplate<typename DerivedU>\nSelfAdjointView<MatrixType,UpLo>& SelfAdjointView<MatrixType,UpLo>\n::rankUpdate(const MatrixBase<DerivedU>& u, const Scalar& alpha)\n{\n  selfadjoint_product_selector<MatrixType,DerivedU,UpLo>::run(_expression().const_cast_derived(), u.derived(), alpha);\n\n  return *this;\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_SELFADJOINT_PRODUCT_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/products/SelfadjointRank2Update.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SELFADJOINTRANK2UPTADE_H\n#define EIGEN_SELFADJOINTRANK2UPTADE_H\n\nnamespace Eigen { \n\nnamespace internal {\n\n/* Optimized selfadjoint matrix += alpha * uv' + conj(alpha)*vu'\n * It corresponds to the Level2 syr2 BLAS routine\n */\n\ntemplate<typename Scalar, typename Index, typename UType, typename VType, int UpLo>\nstruct selfadjoint_rank2_update_selector;\n\ntemplate<typename Scalar, typename Index, typename UType, typename VType>\nstruct selfadjoint_rank2_update_selector<Scalar,Index,UType,VType,Lower>\n{\n  static void run(Scalar* mat, Index stride, const UType& u, const VType& v, const Scalar& alpha)\n  {\n    const Index size = u.size();\n    for (Index i=0; i<size; ++i)\n    {\n      Map<Matrix<Scalar,Dynamic,1> >(mat+stride*i+i, size-i) +=\n                        (numext::conj(alpha) * numext::conj(u.coeff(i))) * v.tail(size-i)\n                      + (alpha * numext::conj(v.coeff(i))) * u.tail(size-i);\n    }\n  }\n};\n\ntemplate<typename Scalar, typename Index, typename UType, typename VType>\nstruct selfadjoint_rank2_update_selector<Scalar,Index,UType,VType,Upper>\n{\n  static void run(Scalar* mat, Index stride, const UType& u, const VType& v, const Scalar& alpha)\n  {\n    const Index size = u.size();\n    for (Index i=0; i<size; ++i)\n      Map<Matrix<Scalar,Dynamic,1> >(mat+stride*i, i+1) +=\n                        (numext::conj(alpha)  * numext::conj(u.coeff(i))) * v.head(i+1)\n                      + (alpha * numext::conj(v.coeff(i))) * u.head(i+1);\n  }\n};\n\ntemplate<bool Cond, typename T> struct conj_expr_if\n  : conditional<!Cond, const T&,\n      CwiseUnaryOp<scalar_conjugate_op<typename traits<T>::Scalar>,T> > {};\n\n} // end namespace internal\n\ntemplate<typename MatrixType, unsigned int UpLo>\ntemplate<typename DerivedU, typename DerivedV>\nSelfAdjointView<MatrixType,UpLo>& SelfAdjointView<MatrixType,UpLo>\n::rankUpdate(const MatrixBase<DerivedU>& u, const MatrixBase<DerivedV>& v, const Scalar& alpha)\n{\n  typedef internal::blas_traits<DerivedU> UBlasTraits;\n  typedef typename UBlasTraits::DirectLinearAccessType ActualUType;\n  typedef typename internal::remove_all<ActualUType>::type _ActualUType;\n  typename internal::add_const_on_value_type<ActualUType>::type actualU = UBlasTraits::extract(u.derived());\n\n  typedef internal::blas_traits<DerivedV> VBlasTraits;\n  typedef typename VBlasTraits::DirectLinearAccessType ActualVType;\n  typedef typename internal::remove_all<ActualVType>::type _ActualVType;\n  typename internal::add_const_on_value_type<ActualVType>::type actualV = VBlasTraits::extract(v.derived());\n\n  // If MatrixType is row major, then we use the routine for lower triangular in the upper triangular case and\n  // vice versa, and take the complex conjugate of all coefficients and vector entries.\n\n  enum { IsRowMajor = (internal::traits<MatrixType>::Flags&RowMajorBit) ? 1 : 0 };\n  Scalar actualAlpha = alpha * UBlasTraits::extractScalarFactor(u.derived())\n                             * numext::conj(VBlasTraits::extractScalarFactor(v.derived()));\n  if (IsRowMajor)\n    actualAlpha = numext::conj(actualAlpha);\n\n  internal::selfadjoint_rank2_update_selector<Scalar, Index,\n    typename internal::remove_all<typename internal::conj_expr_if<IsRowMajor ^ UBlasTraits::NeedToConjugate,_ActualUType>::type>::type,\n    typename internal::remove_all<typename internal::conj_expr_if<IsRowMajor ^ VBlasTraits::NeedToConjugate,_ActualVType>::type>::type,\n    (IsRowMajor ? int(UpLo==Upper ? Lower : Upper) : UpLo)>\n    ::run(_expression().const_cast_derived().data(),_expression().outerStride(),actualU,actualV,actualAlpha);\n\n  return *this;\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_SELFADJOINTRANK2UPTADE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/products/TriangularMatrixMatrix.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_TRIANGULAR_MATRIX_MATRIX_H\n#define EIGEN_TRIANGULAR_MATRIX_MATRIX_H\n\nnamespace Eigen { \n\nnamespace internal {\n\n// template<typename Scalar, int mr, int StorageOrder, bool Conjugate, int Mode>\n// struct gemm_pack_lhs_triangular\n// {\n//   Matrix<Scalar,mr,mr,\n//   void operator()(Scalar* blockA, const EIGEN_RESTRICT Scalar* _lhs, int lhsStride, int depth, int rows)\n//   {\n//     conj_if<NumTraits<Scalar>::IsComplex && Conjugate> cj;\n//     const_blas_data_mapper<Scalar, StorageOrder> lhs(_lhs,lhsStride);\n//     int count = 0;\n//     const int peeled_mc = (rows/mr)*mr;\n//     for(int i=0; i<peeled_mc; i+=mr)\n//     {\n//       for(int k=0; k<depth; k++)\n//         for(int w=0; w<mr; w++)\n//           blockA[count++] = cj(lhs(i+w, k));\n//     }\n//     for(int i=peeled_mc; i<rows; i++)\n//     {\n//       for(int k=0; k<depth; k++)\n//         blockA[count++] = cj(lhs(i, k));\n//     }\n//   }\n// };\n\n/* Optimized triangular matrix * matrix (_TRMM++) product built on top of\n * the general matrix matrix product.\n */\ntemplate <typename Scalar, typename Index,\n          int Mode, bool LhsIsTriangular,\n          int LhsStorageOrder, bool ConjugateLhs,\n          int RhsStorageOrder, bool ConjugateRhs,\n          int ResStorageOrder, int Version = Specialized>\nstruct product_triangular_matrix_matrix;\n\ntemplate <typename Scalar, typename Index,\n          int Mode, bool LhsIsTriangular,\n          int LhsStorageOrder, bool ConjugateLhs,\n          int RhsStorageOrder, bool ConjugateRhs, int Version>\nstruct product_triangular_matrix_matrix<Scalar,Index,Mode,LhsIsTriangular,\n                                           LhsStorageOrder,ConjugateLhs,\n                                           RhsStorageOrder,ConjugateRhs,RowMajor,Version>\n{\n  static EIGEN_STRONG_INLINE void run(\n    Index rows, Index cols, Index depth,\n    const Scalar* lhs, Index lhsStride,\n    const Scalar* rhs, Index rhsStride,\n    Scalar* res,       Index resStride,\n    const Scalar& alpha, level3_blocking<Scalar,Scalar>& blocking)\n  {\n    product_triangular_matrix_matrix<Scalar, Index,\n      (Mode&(UnitDiag|ZeroDiag)) | ((Mode&Upper) ? Lower : Upper),\n      (!LhsIsTriangular),\n      RhsStorageOrder==RowMajor ? ColMajor : RowMajor,\n      ConjugateRhs,\n      LhsStorageOrder==RowMajor ? ColMajor : RowMajor,\n      ConjugateLhs,\n      ColMajor>\n      ::run(cols, rows, depth, rhs, rhsStride, lhs, lhsStride, res, resStride, alpha, blocking);\n  }\n};\n\n// implements col-major += alpha * op(triangular) * op(general)\ntemplate <typename Scalar, typename Index, int Mode,\n          int LhsStorageOrder, bool ConjugateLhs,\n          int RhsStorageOrder, bool ConjugateRhs, int Version>\nstruct product_triangular_matrix_matrix<Scalar,Index,Mode,true,\n                                           LhsStorageOrder,ConjugateLhs,\n                                           RhsStorageOrder,ConjugateRhs,ColMajor,Version>\n{\n  \n  typedef gebp_traits<Scalar,Scalar> Traits;\n  enum {\n    SmallPanelWidth   = 2 * EIGEN_PLAIN_ENUM_MAX(Traits::mr,Traits::nr),\n    IsLower = (Mode&Lower) == Lower,\n    SetDiag = (Mode&(ZeroDiag|UnitDiag)) ? 0 : 1\n  };\n\n  static EIGEN_DONT_INLINE void run(\n    Index _rows, Index _cols, Index _depth,\n    const Scalar* _lhs, Index lhsStride,\n    const Scalar* _rhs, Index rhsStride,\n    Scalar* res,        Index resStride,\n    const Scalar& alpha, level3_blocking<Scalar,Scalar>& blocking);\n};\n\ntemplate <typename Scalar, typename Index, int Mode,\n          int LhsStorageOrder, bool ConjugateLhs,\n          int RhsStorageOrder, bool ConjugateRhs, int Version>\nEIGEN_DONT_INLINE void product_triangular_matrix_matrix<Scalar,Index,Mode,true,\n                                                        LhsStorageOrder,ConjugateLhs,\n                                                        RhsStorageOrder,ConjugateRhs,ColMajor,Version>::run(\n    Index _rows, Index _cols, Index _depth,\n    const Scalar* _lhs, Index lhsStride,\n    const Scalar* _rhs, Index rhsStride,\n    Scalar* res,        Index resStride,\n    const Scalar& alpha, level3_blocking<Scalar,Scalar>& blocking)\n  {\n    // strip zeros\n    Index diagSize  = (std::min)(_rows,_depth);\n    Index rows      = IsLower ? _rows : diagSize;\n    Index depth     = IsLower ? diagSize : _depth;\n    Index cols      = _cols;\n    \n    const_blas_data_mapper<Scalar, Index, LhsStorageOrder> lhs(_lhs,lhsStride);\n    const_blas_data_mapper<Scalar, Index, RhsStorageOrder> rhs(_rhs,rhsStride);\n\n    Index kc = blocking.kc();                   // cache block size along the K direction\n    Index mc = (std::min)(rows,blocking.mc());  // cache block size along the M direction\n\n    std::size_t sizeA = kc*mc;\n    std::size_t sizeB = kc*cols;\n    std::size_t sizeW = kc*Traits::WorkSpaceFactor;\n\n    ei_declare_aligned_stack_constructed_variable(Scalar, blockA, sizeA, blocking.blockA());\n    ei_declare_aligned_stack_constructed_variable(Scalar, blockB, sizeB, blocking.blockB());\n    ei_declare_aligned_stack_constructed_variable(Scalar, blockW, sizeW, blocking.blockW());\n\n    Matrix<Scalar,SmallPanelWidth,SmallPanelWidth,LhsStorageOrder> triangularBuffer;\n    triangularBuffer.setZero();\n    if((Mode&ZeroDiag)==ZeroDiag)\n      triangularBuffer.diagonal().setZero();\n    else\n      triangularBuffer.diagonal().setOnes();\n\n    gebp_kernel<Scalar, Scalar, Index, Traits::mr, Traits::nr, ConjugateLhs, ConjugateRhs> gebp_kernel;\n    gemm_pack_lhs<Scalar, Index, Traits::mr, Traits::LhsProgress, LhsStorageOrder> pack_lhs;\n    gemm_pack_rhs<Scalar, Index, Traits::nr,RhsStorageOrder> pack_rhs;\n\n    for(Index k2=IsLower ? depth : 0;\n        IsLower ? k2>0 : k2<depth;\n        IsLower ? k2-=kc : k2+=kc)\n    {\n      Index actual_kc = (std::min)(IsLower ? k2 : depth-k2, kc);\n      Index actual_k2 = IsLower ? k2-actual_kc : k2;\n\n      // align blocks with the end of the triangular part for trapezoidal lhs\n      if((!IsLower)&&(k2<rows)&&(k2+actual_kc>rows))\n      {\n        actual_kc = rows-k2;\n        k2 = k2+actual_kc-kc;\n      }\n\n      pack_rhs(blockB, &rhs(actual_k2,0), rhsStride, actual_kc, cols);\n\n      // the selected lhs's panel has to be split in three different parts:\n      //  1 - the part which is zero => skip it\n      //  2 - the diagonal block => special kernel\n      //  3 - the dense panel below (lower case) or above (upper case) the diagonal block => GEPP\n\n      // the block diagonal, if any:\n      if(IsLower || actual_k2<rows)\n      {\n        // for each small vertical panels of lhs\n        for (Index k1=0; k1<actual_kc; k1+=SmallPanelWidth)\n        {\n          Index actualPanelWidth = std::min<Index>(actual_kc-k1, SmallPanelWidth);\n          Index lengthTarget = IsLower ? actual_kc-k1-actualPanelWidth : k1;\n          Index startBlock   = actual_k2+k1;\n          Index blockBOffset = k1;\n\n          // => GEBP with the micro triangular block\n          // The trick is to pack this micro block while filling the opposite triangular part with zeros.\n          // To this end we do an extra triangular copy to a small temporary buffer\n          for (Index k=0;k<actualPanelWidth;++k)\n          {\n            if (SetDiag)\n              triangularBuffer.coeffRef(k,k) = lhs(startBlock+k,startBlock+k);\n            for (Index i=IsLower ? k+1 : 0; IsLower ? i<actualPanelWidth : i<k; ++i)\n              triangularBuffer.coeffRef(i,k) = lhs(startBlock+i,startBlock+k);\n          }\n          pack_lhs(blockA, triangularBuffer.data(), triangularBuffer.outerStride(), actualPanelWidth, actualPanelWidth);\n\n          gebp_kernel(res+startBlock, resStride, blockA, blockB, actualPanelWidth, actualPanelWidth, cols, alpha,\n                      actualPanelWidth, actual_kc, 0, blockBOffset, blockW);\n\n          // GEBP with remaining micro panel\n          if (lengthTarget>0)\n          {\n            Index startTarget  = IsLower ? actual_k2+k1+actualPanelWidth : actual_k2;\n\n            pack_lhs(blockA, &lhs(startTarget,startBlock), lhsStride, actualPanelWidth, lengthTarget);\n\n            gebp_kernel(res+startTarget, resStride, blockA, blockB, lengthTarget, actualPanelWidth, cols, alpha,\n                        actualPanelWidth, actual_kc, 0, blockBOffset, blockW);\n          }\n        }\n      }\n      // the part below (lower case) or above (upper case) the diagonal => GEPP\n      {\n        Index start = IsLower ? k2 : 0;\n        Index end   = IsLower ? rows : (std::min)(actual_k2,rows);\n        for(Index i2=start; i2<end; i2+=mc)\n        {\n          const Index actual_mc = (std::min)(i2+mc,end)-i2;\n          gemm_pack_lhs<Scalar, Index, Traits::mr,Traits::LhsProgress, LhsStorageOrder,false>()\n            (blockA, &lhs(i2, actual_k2), lhsStride, actual_kc, actual_mc);\n\n          gebp_kernel(res+i2, resStride, blockA, blockB, actual_mc, actual_kc, cols, alpha, -1, -1, 0, 0, blockW);\n        }\n      }\n    }\n  }\n\n// implements col-major += alpha * op(general) * op(triangular)\ntemplate <typename Scalar, typename Index, int Mode,\n          int LhsStorageOrder, bool ConjugateLhs,\n          int RhsStorageOrder, bool ConjugateRhs, int Version>\nstruct product_triangular_matrix_matrix<Scalar,Index,Mode,false,\n                                        LhsStorageOrder,ConjugateLhs,\n                                        RhsStorageOrder,ConjugateRhs,ColMajor,Version>\n{\n  typedef gebp_traits<Scalar,Scalar> Traits;\n  enum {\n    SmallPanelWidth   = EIGEN_PLAIN_ENUM_MAX(Traits::mr,Traits::nr),\n    IsLower = (Mode&Lower) == Lower,\n    SetDiag = (Mode&(ZeroDiag|UnitDiag)) ? 0 : 1\n  };\n\n  static EIGEN_DONT_INLINE void run(\n    Index _rows, Index _cols, Index _depth,\n    const Scalar* _lhs, Index lhsStride,\n    const Scalar* _rhs, Index rhsStride,\n    Scalar* res,        Index resStride,\n    const Scalar& alpha, level3_blocking<Scalar,Scalar>& blocking);\n};\n\ntemplate <typename Scalar, typename Index, int Mode,\n          int LhsStorageOrder, bool ConjugateLhs,\n          int RhsStorageOrder, bool ConjugateRhs, int Version>\nEIGEN_DONT_INLINE void product_triangular_matrix_matrix<Scalar,Index,Mode,false,\n                                                        LhsStorageOrder,ConjugateLhs,\n                                                        RhsStorageOrder,ConjugateRhs,ColMajor,Version>::run(\n    Index _rows, Index _cols, Index _depth,\n    const Scalar* _lhs, Index lhsStride,\n    const Scalar* _rhs, Index rhsStride,\n    Scalar* res,        Index resStride,\n    const Scalar& alpha, level3_blocking<Scalar,Scalar>& blocking)\n  {\n    // strip zeros\n    Index diagSize  = (std::min)(_cols,_depth);\n    Index rows      = _rows;\n    Index depth     = IsLower ? _depth : diagSize;\n    Index cols      = IsLower ? diagSize : _cols;\n    \n    const_blas_data_mapper<Scalar, Index, LhsStorageOrder> lhs(_lhs,lhsStride);\n    const_blas_data_mapper<Scalar, Index, RhsStorageOrder> rhs(_rhs,rhsStride);\n\n    Index kc = blocking.kc();                   // cache block size along the K direction\n    Index mc = (std::min)(rows,blocking.mc());  // cache block size along the M direction\n\n    std::size_t sizeA = kc*mc;\n    std::size_t sizeB = kc*cols;\n    std::size_t sizeW = kc*Traits::WorkSpaceFactor;\n\n    ei_declare_aligned_stack_constructed_variable(Scalar, blockA, sizeA, blocking.blockA());\n    ei_declare_aligned_stack_constructed_variable(Scalar, blockB, sizeB, blocking.blockB());\n    ei_declare_aligned_stack_constructed_variable(Scalar, blockW, sizeW, blocking.blockW());\n\n    Matrix<Scalar,SmallPanelWidth,SmallPanelWidth,RhsStorageOrder> triangularBuffer;\n    triangularBuffer.setZero();\n    if((Mode&ZeroDiag)==ZeroDiag)\n      triangularBuffer.diagonal().setZero();\n    else\n      triangularBuffer.diagonal().setOnes();\n\n    gebp_kernel<Scalar, Scalar, Index, Traits::mr, Traits::nr, ConjugateLhs, ConjugateRhs> gebp_kernel;\n    gemm_pack_lhs<Scalar, Index, Traits::mr, Traits::LhsProgress, LhsStorageOrder> pack_lhs;\n    gemm_pack_rhs<Scalar, Index, Traits::nr,RhsStorageOrder> pack_rhs;\n    gemm_pack_rhs<Scalar, Index, Traits::nr,RhsStorageOrder,false,true> pack_rhs_panel;\n\n    for(Index k2=IsLower ? 0 : depth;\n        IsLower ? k2<depth  : k2>0;\n        IsLower ? k2+=kc   : k2-=kc)\n    {\n      Index actual_kc = (std::min)(IsLower ? depth-k2 : k2, kc);\n      Index actual_k2 = IsLower ? k2 : k2-actual_kc;\n\n      // align blocks with the end of the triangular part for trapezoidal rhs\n      if(IsLower && (k2<cols) && (actual_k2+actual_kc>cols))\n      {\n        actual_kc = cols-k2;\n        k2 = actual_k2 + actual_kc - kc;\n      }\n\n      // remaining size\n      Index rs = IsLower ? (std::min)(cols,actual_k2) : cols - k2;\n      // size of the triangular part\n      Index ts = (IsLower && actual_k2>=cols) ? 0 : actual_kc;\n\n      Scalar* geb = blockB+ts*ts;\n\n      pack_rhs(geb, &rhs(actual_k2,IsLower ? 0 : k2), rhsStride, actual_kc, rs);\n\n      // pack the triangular part of the rhs padding the unrolled blocks with zeros\n      if(ts>0)\n      {\n        for (Index j2=0; j2<actual_kc; j2+=SmallPanelWidth)\n        {\n          Index actualPanelWidth = std::min<Index>(actual_kc-j2, SmallPanelWidth);\n          Index actual_j2 = actual_k2 + j2;\n          Index panelOffset = IsLower ? j2+actualPanelWidth : 0;\n          Index panelLength = IsLower ? actual_kc-j2-actualPanelWidth : j2;\n          // general part\n          pack_rhs_panel(blockB+j2*actual_kc,\n                         &rhs(actual_k2+panelOffset, actual_j2), rhsStride,\n                         panelLength, actualPanelWidth,\n                         actual_kc, panelOffset);\n\n          // append the triangular part via a temporary buffer\n          for (Index j=0;j<actualPanelWidth;++j)\n          {\n            if (SetDiag)\n              triangularBuffer.coeffRef(j,j) = rhs(actual_j2+j,actual_j2+j);\n            for (Index k=IsLower ? j+1 : 0; IsLower ? k<actualPanelWidth : k<j; ++k)\n              triangularBuffer.coeffRef(k,j) = rhs(actual_j2+k,actual_j2+j);\n          }\n\n          pack_rhs_panel(blockB+j2*actual_kc,\n                         triangularBuffer.data(), triangularBuffer.outerStride(),\n                         actualPanelWidth, actualPanelWidth,\n                         actual_kc, j2);\n        }\n      }\n\n      for (Index i2=0; i2<rows; i2+=mc)\n      {\n        const Index actual_mc = (std::min)(mc,rows-i2);\n        pack_lhs(blockA, &lhs(i2, actual_k2), lhsStride, actual_kc, actual_mc);\n\n        // triangular kernel\n        if(ts>0)\n        {\n          for (Index j2=0; j2<actual_kc; j2+=SmallPanelWidth)\n          {\n            Index actualPanelWidth = std::min<Index>(actual_kc-j2, SmallPanelWidth);\n            Index panelLength = IsLower ? actual_kc-j2 : j2+actualPanelWidth;\n            Index blockOffset = IsLower ? j2 : 0;\n\n            gebp_kernel(res+i2+(actual_k2+j2)*resStride, resStride,\n                        blockA, blockB+j2*actual_kc,\n                        actual_mc, panelLength, actualPanelWidth,\n                        alpha,\n                        actual_kc, actual_kc,  // strides\n                        blockOffset, blockOffset,// offsets\n                        blockW); // workspace\n          }\n        }\n        gebp_kernel(res+i2+(IsLower ? 0 : k2)*resStride, resStride,\n                    blockA, geb, actual_mc, actual_kc, rs,\n                    alpha,\n                    -1, -1, 0, 0, blockW);\n      }\n    }\n  }\n\n/***************************************************************************\n* Wrapper to product_triangular_matrix_matrix\n***************************************************************************/\n\ntemplate<int Mode, bool LhsIsTriangular, typename Lhs, typename Rhs>\nstruct traits<TriangularProduct<Mode,LhsIsTriangular,Lhs,false,Rhs,false> >\n  : traits<ProductBase<TriangularProduct<Mode,LhsIsTriangular,Lhs,false,Rhs,false>, Lhs, Rhs> >\n{};\n\n} // end namespace internal\n\ntemplate<int Mode, bool LhsIsTriangular, typename Lhs, typename Rhs>\nstruct TriangularProduct<Mode,LhsIsTriangular,Lhs,false,Rhs,false>\n  : public ProductBase<TriangularProduct<Mode,LhsIsTriangular,Lhs,false,Rhs,false>, Lhs, Rhs >\n{\n  EIGEN_PRODUCT_PUBLIC_INTERFACE(TriangularProduct)\n\n  TriangularProduct(const Lhs& lhs, const Rhs& rhs) : Base(lhs,rhs) {}\n\n  template<typename Dest> void scaleAndAddTo(Dest& dst, const Scalar& alpha) const\n  {\n    typename internal::add_const_on_value_type<ActualLhsType>::type lhs = LhsBlasTraits::extract(m_lhs);\n    typename internal::add_const_on_value_type<ActualRhsType>::type rhs = RhsBlasTraits::extract(m_rhs);\n\n    Scalar actualAlpha = alpha * LhsBlasTraits::extractScalarFactor(m_lhs)\n                               * RhsBlasTraits::extractScalarFactor(m_rhs);\n\n    typedef internal::gemm_blocking_space<(Dest::Flags&RowMajorBit) ? RowMajor : ColMajor,Scalar,Scalar,\n              Lhs::MaxRowsAtCompileTime, Rhs::MaxColsAtCompileTime, Lhs::MaxColsAtCompileTime,4> BlockingType;\n\n    enum { IsLower = (Mode&Lower) == Lower };\n    Index stripedRows  = ((!LhsIsTriangular) || (IsLower))  ? lhs.rows() : (std::min)(lhs.rows(),lhs.cols());\n    Index stripedCols  = ((LhsIsTriangular)  || (!IsLower)) ? rhs.cols() : (std::min)(rhs.cols(),rhs.rows());\n    Index stripedDepth = LhsIsTriangular ? ((!IsLower) ? lhs.cols() : (std::min)(lhs.cols(),lhs.rows()))\n                                         : ((IsLower)  ? rhs.rows() : (std::min)(rhs.rows(),rhs.cols()));\n\n    BlockingType blocking(stripedRows, stripedCols, stripedDepth);\n\n    internal::product_triangular_matrix_matrix<Scalar, Index,\n      Mode, LhsIsTriangular,\n      (internal::traits<_ActualLhsType>::Flags&RowMajorBit) ? RowMajor : ColMajor, LhsBlasTraits::NeedToConjugate,\n      (internal::traits<_ActualRhsType>::Flags&RowMajorBit) ? RowMajor : ColMajor, RhsBlasTraits::NeedToConjugate,\n      (internal::traits<Dest          >::Flags&RowMajorBit) ? RowMajor : ColMajor>\n      ::run(\n        stripedRows, stripedCols, stripedDepth,   // sizes\n        &lhs.coeffRef(0,0),    lhs.outerStride(), // lhs info\n        &rhs.coeffRef(0,0),    rhs.outerStride(), // rhs info\n        &dst.coeffRef(0,0), dst.outerStride(),    // result info\n        actualAlpha, blocking\n      );\n  }\n};\n\n} // end namespace Eigen\n\n#endif // EIGEN_TRIANGULAR_MATRIX_MATRIX_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/products/TriangularMatrixMatrix_MKL.h",
    "content": "/*\n Copyright (c) 2011, Intel Corporation. All rights reserved.\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n * Neither the name of Intel Corporation nor the names of its contributors may\n   be used to endorse or promote products derived from this software without\n   specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\n ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n ********************************************************************************\n *   Content : Eigen bindings to Intel(R) MKL\n *   Triangular matrix * matrix product functionality based on ?TRMM.\n ********************************************************************************\n*/\n\n#ifndef EIGEN_TRIANGULAR_MATRIX_MATRIX_MKL_H\n#define EIGEN_TRIANGULAR_MATRIX_MATRIX_MKL_H\n\nnamespace Eigen { \n\nnamespace internal {\n\n\ntemplate <typename Scalar, typename Index,\n          int Mode, bool LhsIsTriangular,\n          int LhsStorageOrder, bool ConjugateLhs,\n          int RhsStorageOrder, bool ConjugateRhs,\n          int ResStorageOrder>\nstruct product_triangular_matrix_matrix_trmm :\n       product_triangular_matrix_matrix<Scalar,Index,Mode,\n          LhsIsTriangular,LhsStorageOrder,ConjugateLhs,\n          RhsStorageOrder, ConjugateRhs, ResStorageOrder, BuiltIn> {};\n\n\n// try to go to BLAS specialization\n#define EIGEN_MKL_TRMM_SPECIALIZE(Scalar, LhsIsTriangular) \\\ntemplate <typename Index, int Mode, \\\n          int LhsStorageOrder, bool ConjugateLhs, \\\n          int RhsStorageOrder, bool ConjugateRhs> \\\nstruct product_triangular_matrix_matrix<Scalar,Index, Mode, LhsIsTriangular, \\\n           LhsStorageOrder,ConjugateLhs, RhsStorageOrder,ConjugateRhs,ColMajor,Specialized> { \\\n  static inline void run(Index _rows, Index _cols, Index _depth, const Scalar* _lhs, Index lhsStride,\\\n    const Scalar* _rhs, Index rhsStride, Scalar* res, Index resStride, Scalar alpha, level3_blocking<Scalar,Scalar>& blocking) { \\\n      product_triangular_matrix_matrix_trmm<Scalar,Index,Mode, \\\n        LhsIsTriangular,LhsStorageOrder,ConjugateLhs, \\\n        RhsStorageOrder, ConjugateRhs, ColMajor>::run( \\\n        _rows, _cols, _depth, _lhs, lhsStride, _rhs, rhsStride, res, resStride, alpha, blocking); \\\n  } \\\n};\n\nEIGEN_MKL_TRMM_SPECIALIZE(double, true)\nEIGEN_MKL_TRMM_SPECIALIZE(double, false)\nEIGEN_MKL_TRMM_SPECIALIZE(dcomplex, true)\nEIGEN_MKL_TRMM_SPECIALIZE(dcomplex, false)\nEIGEN_MKL_TRMM_SPECIALIZE(float, true)\nEIGEN_MKL_TRMM_SPECIALIZE(float, false)\nEIGEN_MKL_TRMM_SPECIALIZE(scomplex, true)\nEIGEN_MKL_TRMM_SPECIALIZE(scomplex, false)\n\n// implements col-major += alpha * op(triangular) * op(general)\n#define EIGEN_MKL_TRMM_L(EIGTYPE, MKLTYPE, EIGPREFIX, MKLPREFIX) \\\ntemplate <typename Index, int Mode, \\\n          int LhsStorageOrder, bool ConjugateLhs, \\\n          int RhsStorageOrder, bool ConjugateRhs> \\\nstruct product_triangular_matrix_matrix_trmm<EIGTYPE,Index,Mode,true, \\\n         LhsStorageOrder,ConjugateLhs,RhsStorageOrder,ConjugateRhs,ColMajor> \\\n{ \\\n  enum { \\\n    IsLower = (Mode&Lower) == Lower, \\\n    SetDiag = (Mode&(ZeroDiag|UnitDiag)) ? 0 : 1, \\\n    IsUnitDiag  = (Mode&UnitDiag) ? 1 : 0, \\\n    IsZeroDiag  = (Mode&ZeroDiag) ? 1 : 0, \\\n    LowUp = IsLower ? Lower : Upper, \\\n    conjA = ((LhsStorageOrder==ColMajor) && ConjugateLhs) ? 1 : 0 \\\n  }; \\\n\\\n  static void run( \\\n    Index _rows, Index _cols, Index _depth, \\\n    const EIGTYPE* _lhs, Index lhsStride, \\\n    const EIGTYPE* _rhs, Index rhsStride, \\\n    EIGTYPE* res,        Index resStride, \\\n    EIGTYPE alpha, level3_blocking<EIGTYPE,EIGTYPE>& blocking) \\\n  { \\\n   Index diagSize  = (std::min)(_rows,_depth); \\\n   Index rows      = IsLower ? _rows : diagSize; \\\n   Index depth     = IsLower ? diagSize : _depth; \\\n   Index cols      = _cols; \\\n\\\n   typedef Matrix<EIGTYPE, Dynamic, Dynamic, LhsStorageOrder> MatrixLhs; \\\n   typedef Matrix<EIGTYPE, Dynamic, Dynamic, RhsStorageOrder> MatrixRhs; \\\n\\\n/* Non-square case - doesn't fit to MKL ?TRMM. Fall to default triangular product or call MKL ?GEMM*/ \\\n   if (rows != depth) { \\\n\\\n     int nthr = mkl_domain_get_max_threads(EIGEN_MKL_DOMAIN_BLAS); \\\n\\\n     if (((nthr==1) && (((std::max)(rows,depth)-diagSize)/(double)diagSize < 0.5))) { \\\n     /* Most likely no benefit to call TRMM or GEMM from MKL*/ \\\n       product_triangular_matrix_matrix<EIGTYPE,Index,Mode,true, \\\n       LhsStorageOrder,ConjugateLhs, RhsStorageOrder, ConjugateRhs, ColMajor, BuiltIn>::run( \\\n           _rows, _cols, _depth, _lhs, lhsStride, _rhs, rhsStride, res, resStride, alpha, blocking); \\\n     /*std::cout << \"TRMM_L: A is not square! Go to Eigen TRMM implementation!\\n\";*/ \\\n     } else { \\\n     /* Make sense to call GEMM */ \\\n       Map<const MatrixLhs, 0, OuterStride<> > lhsMap(_lhs,rows,depth,OuterStride<>(lhsStride)); \\\n       MatrixLhs aa_tmp=lhsMap.template triangularView<Mode>(); \\\n       MKL_INT aStride = aa_tmp.outerStride(); \\\n       gemm_blocking_space<ColMajor,EIGTYPE,EIGTYPE,Dynamic,Dynamic,Dynamic> gemm_blocking(_rows,_cols,_depth); \\\n       general_matrix_matrix_product<Index,EIGTYPE,LhsStorageOrder,ConjugateLhs,EIGTYPE,RhsStorageOrder,ConjugateRhs,ColMajor>::run( \\\n       rows, cols, depth, aa_tmp.data(), aStride, _rhs, rhsStride, res, resStride, alpha, gemm_blocking, 0); \\\n\\\n     /*std::cout << \"TRMM_L: A is not square! Go to MKL GEMM implementation! \" << nthr<<\" \\n\";*/ \\\n     } \\\n     return; \\\n   } \\\n   char side = 'L', transa, uplo, diag = 'N'; \\\n   EIGTYPE *b; \\\n   const EIGTYPE *a; \\\n   MKL_INT m, n, lda, ldb; \\\n   MKLTYPE alpha_; \\\n\\\n/* Set alpha_*/ \\\n   assign_scalar_eig2mkl<MKLTYPE, EIGTYPE>(alpha_, alpha); \\\n\\\n/* Set m, n */ \\\n   m = (MKL_INT)diagSize; \\\n   n = (MKL_INT)cols; \\\n\\\n/* Set trans */ \\\n   transa = (LhsStorageOrder==RowMajor) ? ((ConjugateLhs) ? 'C' : 'T') : 'N'; \\\n\\\n/* Set b, ldb */ \\\n   Map<const MatrixRhs, 0, OuterStride<> > rhs(_rhs,depth,cols,OuterStride<>(rhsStride)); \\\n   MatrixX##EIGPREFIX b_tmp; \\\n\\\n   if (ConjugateRhs) b_tmp = rhs.conjugate(); else b_tmp = rhs; \\\n   b = b_tmp.data(); \\\n   ldb = b_tmp.outerStride(); \\\n\\\n/* Set uplo */ \\\n   uplo = IsLower ? 'L' : 'U'; \\\n   if (LhsStorageOrder==RowMajor) uplo = (uplo == 'L') ? 'U' : 'L'; \\\n/* Set a, lda */ \\\n   Map<const MatrixLhs, 0, OuterStride<> > lhs(_lhs,rows,depth,OuterStride<>(lhsStride)); \\\n   MatrixLhs a_tmp; \\\n\\\n   if ((conjA!=0) || (SetDiag==0)) { \\\n     if (conjA) a_tmp = lhs.conjugate(); else a_tmp = lhs; \\\n     if (IsZeroDiag) \\\n       a_tmp.diagonal().setZero(); \\\n     else if (IsUnitDiag) \\\n       a_tmp.diagonal().setOnes();\\\n     a = a_tmp.data(); \\\n     lda = a_tmp.outerStride(); \\\n   } else { \\\n     a = _lhs; \\\n     lda = lhsStride; \\\n   } \\\n   /*std::cout << \"TRMM_L: A is square! Go to MKL TRMM implementation! \\n\";*/ \\\n/* call ?trmm*/ \\\n   MKLPREFIX##trmm(&side, &uplo, &transa, &diag, &m, &n, &alpha_, (const MKLTYPE*)a, &lda, (MKLTYPE*)b, &ldb); \\\n\\\n/* Add op(a_triangular)*b into res*/ \\\n   Map<MatrixX##EIGPREFIX, 0, OuterStride<> > res_tmp(res,rows,cols,OuterStride<>(resStride)); \\\n   res_tmp=res_tmp+b_tmp; \\\n  } \\\n};\n\nEIGEN_MKL_TRMM_L(double, double, d, d)\nEIGEN_MKL_TRMM_L(dcomplex, MKL_Complex16, cd, z)\nEIGEN_MKL_TRMM_L(float, float, f, s)\nEIGEN_MKL_TRMM_L(scomplex, MKL_Complex8, cf, c)\n\n// implements col-major += alpha * op(general) * op(triangular)\n#define EIGEN_MKL_TRMM_R(EIGTYPE, MKLTYPE, EIGPREFIX, MKLPREFIX) \\\ntemplate <typename Index, int Mode, \\\n          int LhsStorageOrder, bool ConjugateLhs, \\\n          int RhsStorageOrder, bool ConjugateRhs> \\\nstruct product_triangular_matrix_matrix_trmm<EIGTYPE,Index,Mode,false, \\\n         LhsStorageOrder,ConjugateLhs,RhsStorageOrder,ConjugateRhs,ColMajor> \\\n{ \\\n  enum { \\\n    IsLower = (Mode&Lower) == Lower, \\\n    SetDiag = (Mode&(ZeroDiag|UnitDiag)) ? 0 : 1, \\\n    IsUnitDiag  = (Mode&UnitDiag) ? 1 : 0, \\\n    IsZeroDiag  = (Mode&ZeroDiag) ? 1 : 0, \\\n    LowUp = IsLower ? Lower : Upper, \\\n    conjA = ((RhsStorageOrder==ColMajor) && ConjugateRhs) ? 1 : 0 \\\n  }; \\\n\\\n  static void run( \\\n    Index _rows, Index _cols, Index _depth, \\\n    const EIGTYPE* _lhs, Index lhsStride, \\\n    const EIGTYPE* _rhs, Index rhsStride, \\\n    EIGTYPE* res,        Index resStride, \\\n    EIGTYPE alpha, level3_blocking<EIGTYPE,EIGTYPE>& blocking) \\\n  { \\\n   Index diagSize  = (std::min)(_cols,_depth); \\\n   Index rows      = _rows; \\\n   Index depth     = IsLower ? _depth : diagSize; \\\n   Index cols      = IsLower ? diagSize : _cols; \\\n\\\n   typedef Matrix<EIGTYPE, Dynamic, Dynamic, LhsStorageOrder> MatrixLhs; \\\n   typedef Matrix<EIGTYPE, Dynamic, Dynamic, RhsStorageOrder> MatrixRhs; \\\n\\\n/* Non-square case - doesn't fit to MKL ?TRMM. Fall to default triangular product or call MKL ?GEMM*/ \\\n   if (cols != depth) { \\\n\\\n     int nthr = mkl_domain_get_max_threads(EIGEN_MKL_DOMAIN_BLAS); \\\n\\\n     if ((nthr==1) && (((std::max)(cols,depth)-diagSize)/(double)diagSize < 0.5)) { \\\n     /* Most likely no benefit to call TRMM or GEMM from MKL*/ \\\n       product_triangular_matrix_matrix<EIGTYPE,Index,Mode,false, \\\n       LhsStorageOrder,ConjugateLhs, RhsStorageOrder, ConjugateRhs, ColMajor, BuiltIn>::run( \\\n           _rows, _cols, _depth, _lhs, lhsStride, _rhs, rhsStride, res, resStride, alpha, blocking); \\\n       /*std::cout << \"TRMM_R: A is not square! Go to Eigen TRMM implementation!\\n\";*/ \\\n     } else { \\\n     /* Make sense to call GEMM */ \\\n       Map<const MatrixRhs, 0, OuterStride<> > rhsMap(_rhs,depth,cols, OuterStride<>(rhsStride)); \\\n       MatrixRhs aa_tmp=rhsMap.template triangularView<Mode>(); \\\n       MKL_INT aStride = aa_tmp.outerStride(); \\\n       gemm_blocking_space<ColMajor,EIGTYPE,EIGTYPE,Dynamic,Dynamic,Dynamic> gemm_blocking(_rows,_cols,_depth); \\\n       general_matrix_matrix_product<Index,EIGTYPE,LhsStorageOrder,ConjugateLhs,EIGTYPE,RhsStorageOrder,ConjugateRhs,ColMajor>::run( \\\n       rows, cols, depth, _lhs, lhsStride, aa_tmp.data(), aStride, res, resStride, alpha, gemm_blocking, 0); \\\n\\\n     /*std::cout << \"TRMM_R: A is not square! Go to MKL GEMM implementation! \" << nthr<<\" \\n\";*/ \\\n     } \\\n     return; \\\n   } \\\n   char side = 'R', transa, uplo, diag = 'N'; \\\n   EIGTYPE *b; \\\n   const EIGTYPE *a; \\\n   MKL_INT m, n, lda, ldb; \\\n   MKLTYPE alpha_; \\\n\\\n/* Set alpha_*/ \\\n   assign_scalar_eig2mkl<MKLTYPE, EIGTYPE>(alpha_, alpha); \\\n\\\n/* Set m, n */ \\\n   m = (MKL_INT)rows; \\\n   n = (MKL_INT)diagSize; \\\n\\\n/* Set trans */ \\\n   transa = (RhsStorageOrder==RowMajor) ? ((ConjugateRhs) ? 'C' : 'T') : 'N'; \\\n\\\n/* Set b, ldb */ \\\n   Map<const MatrixLhs, 0, OuterStride<> > lhs(_lhs,rows,depth,OuterStride<>(lhsStride)); \\\n   MatrixX##EIGPREFIX b_tmp; \\\n\\\n   if (ConjugateLhs) b_tmp = lhs.conjugate(); else b_tmp = lhs; \\\n   b = b_tmp.data(); \\\n   ldb = b_tmp.outerStride(); \\\n\\\n/* Set uplo */ \\\n   uplo = IsLower ? 'L' : 'U'; \\\n   if (RhsStorageOrder==RowMajor) uplo = (uplo == 'L') ? 'U' : 'L'; \\\n/* Set a, lda */ \\\n   Map<const MatrixRhs, 0, OuterStride<> > rhs(_rhs,depth,cols, OuterStride<>(rhsStride)); \\\n   MatrixRhs a_tmp; \\\n\\\n   if ((conjA!=0) || (SetDiag==0)) { \\\n     if (conjA) a_tmp = rhs.conjugate(); else a_tmp = rhs; \\\n     if (IsZeroDiag) \\\n       a_tmp.diagonal().setZero(); \\\n     else if (IsUnitDiag) \\\n       a_tmp.diagonal().setOnes();\\\n     a = a_tmp.data(); \\\n     lda = a_tmp.outerStride(); \\\n   } else { \\\n     a = _rhs; \\\n     lda = rhsStride; \\\n   } \\\n   /*std::cout << \"TRMM_R: A is square! Go to MKL TRMM implementation! \\n\";*/ \\\n/* call ?trmm*/ \\\n   MKLPREFIX##trmm(&side, &uplo, &transa, &diag, &m, &n, &alpha_, (const MKLTYPE*)a, &lda, (MKLTYPE*)b, &ldb); \\\n\\\n/* Add op(a_triangular)*b into res*/ \\\n   Map<MatrixX##EIGPREFIX, 0, OuterStride<> > res_tmp(res,rows,cols,OuterStride<>(resStride)); \\\n   res_tmp=res_tmp+b_tmp; \\\n  } \\\n};\n\nEIGEN_MKL_TRMM_R(double, double, d, d)\nEIGEN_MKL_TRMM_R(dcomplex, MKL_Complex16, cd, z)\nEIGEN_MKL_TRMM_R(float, float, f, s)\nEIGEN_MKL_TRMM_R(scomplex, MKL_Complex8, cf, c)\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_TRIANGULAR_MATRIX_MATRIX_MKL_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/products/TriangularMatrixVector.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_TRIANGULARMATRIXVECTOR_H\n#define EIGEN_TRIANGULARMATRIXVECTOR_H\n\nnamespace Eigen { \n\nnamespace internal {\n\ntemplate<typename Index, int Mode, typename LhsScalar, bool ConjLhs, typename RhsScalar, bool ConjRhs, int StorageOrder, int Version=Specialized>\nstruct triangular_matrix_vector_product;\n\ntemplate<typename Index, int Mode, typename LhsScalar, bool ConjLhs, typename RhsScalar, bool ConjRhs, int Version>\nstruct triangular_matrix_vector_product<Index,Mode,LhsScalar,ConjLhs,RhsScalar,ConjRhs,ColMajor,Version>\n{\n  typedef typename scalar_product_traits<LhsScalar, RhsScalar>::ReturnType ResScalar;\n  enum {\n    IsLower = ((Mode&Lower)==Lower),\n    HasUnitDiag = (Mode & UnitDiag)==UnitDiag,\n    HasZeroDiag = (Mode & ZeroDiag)==ZeroDiag\n  };\n  static EIGEN_DONT_INLINE  void run(Index _rows, Index _cols, const LhsScalar* _lhs, Index lhsStride,\n                                     const RhsScalar* _rhs, Index rhsIncr, ResScalar* _res, Index resIncr, const ResScalar& alpha);\n};\n\ntemplate<typename Index, int Mode, typename LhsScalar, bool ConjLhs, typename RhsScalar, bool ConjRhs, int Version>\nEIGEN_DONT_INLINE void triangular_matrix_vector_product<Index,Mode,LhsScalar,ConjLhs,RhsScalar,ConjRhs,ColMajor,Version>\n  ::run(Index _rows, Index _cols, const LhsScalar* _lhs, Index lhsStride,\n        const RhsScalar* _rhs, Index rhsIncr, ResScalar* _res, Index resIncr, const ResScalar& alpha)\n  {\n    static const Index PanelWidth = EIGEN_TUNE_TRIANGULAR_PANEL_WIDTH;\n    Index size = (std::min)(_rows,_cols);\n    Index rows = IsLower ? _rows : (std::min)(_rows,_cols);\n    Index cols = IsLower ? (std::min)(_rows,_cols) : _cols;\n\n    typedef Map<const Matrix<LhsScalar,Dynamic,Dynamic,ColMajor>, 0, OuterStride<> > LhsMap;\n    const LhsMap lhs(_lhs,rows,cols,OuterStride<>(lhsStride));\n    typename conj_expr_if<ConjLhs,LhsMap>::type cjLhs(lhs);\n    \n    typedef Map<const Matrix<RhsScalar,Dynamic,1>, 0, InnerStride<> > RhsMap;\n    const RhsMap rhs(_rhs,cols,InnerStride<>(rhsIncr));\n    typename conj_expr_if<ConjRhs,RhsMap>::type cjRhs(rhs);\n\n    typedef Map<Matrix<ResScalar,Dynamic,1> > ResMap;\n    ResMap res(_res,rows);\n\n    for (Index pi=0; pi<size; pi+=PanelWidth)\n    {\n      Index actualPanelWidth = (std::min)(PanelWidth, size-pi);\n      for (Index k=0; k<actualPanelWidth; ++k)\n      {\n        Index i = pi + k;\n        Index s = IsLower ? ((HasUnitDiag||HasZeroDiag) ? i+1 : i ) : pi;\n        Index r = IsLower ? actualPanelWidth-k : k+1;\n        if ((!(HasUnitDiag||HasZeroDiag)) || (--r)>0)\n          res.segment(s,r) += (alpha * cjRhs.coeff(i)) * cjLhs.col(i).segment(s,r);\n        if (HasUnitDiag)\n          res.coeffRef(i) += alpha * cjRhs.coeff(i);\n      }\n      Index r = IsLower ? rows - pi - actualPanelWidth : pi;\n      if (r>0)\n      {\n        Index s = IsLower ? pi+actualPanelWidth : 0;\n        general_matrix_vector_product<Index,LhsScalar,ColMajor,ConjLhs,RhsScalar,ConjRhs,BuiltIn>::run(\n            r, actualPanelWidth,\n            &lhs.coeffRef(s,pi), lhsStride,\n            &rhs.coeffRef(pi), rhsIncr,\n            &res.coeffRef(s), resIncr, alpha);\n      }\n    }\n    if((!IsLower) && cols>size)\n    {\n      general_matrix_vector_product<Index,LhsScalar,ColMajor,ConjLhs,RhsScalar,ConjRhs>::run(\n          rows, cols-size,\n          &lhs.coeffRef(0,size), lhsStride,\n          &rhs.coeffRef(size), rhsIncr,\n          _res, resIncr, alpha);\n    }\n  }\n\ntemplate<typename Index, int Mode, typename LhsScalar, bool ConjLhs, typename RhsScalar, bool ConjRhs,int Version>\nstruct triangular_matrix_vector_product<Index,Mode,LhsScalar,ConjLhs,RhsScalar,ConjRhs,RowMajor,Version>\n{\n  typedef typename scalar_product_traits<LhsScalar, RhsScalar>::ReturnType ResScalar;\n  enum {\n    IsLower = ((Mode&Lower)==Lower),\n    HasUnitDiag = (Mode & UnitDiag)==UnitDiag,\n    HasZeroDiag = (Mode & ZeroDiag)==ZeroDiag\n  };\n  static EIGEN_DONT_INLINE void run(Index _rows, Index _cols, const LhsScalar* _lhs, Index lhsStride,\n                                    const RhsScalar* _rhs, Index rhsIncr, ResScalar* _res, Index resIncr, const ResScalar& alpha);\n};\n\ntemplate<typename Index, int Mode, typename LhsScalar, bool ConjLhs, typename RhsScalar, bool ConjRhs,int Version>\nEIGEN_DONT_INLINE void triangular_matrix_vector_product<Index,Mode,LhsScalar,ConjLhs,RhsScalar,ConjRhs,RowMajor,Version>\n  ::run(Index _rows, Index _cols, const LhsScalar* _lhs, Index lhsStride,\n        const RhsScalar* _rhs, Index rhsIncr, ResScalar* _res, Index resIncr, const ResScalar& alpha)\n  {\n    static const Index PanelWidth = EIGEN_TUNE_TRIANGULAR_PANEL_WIDTH;\n    Index diagSize = (std::min)(_rows,_cols);\n    Index rows = IsLower ? _rows : diagSize;\n    Index cols = IsLower ? diagSize : _cols;\n\n    typedef Map<const Matrix<LhsScalar,Dynamic,Dynamic,RowMajor>, 0, OuterStride<> > LhsMap;\n    const LhsMap lhs(_lhs,rows,cols,OuterStride<>(lhsStride));\n    typename conj_expr_if<ConjLhs,LhsMap>::type cjLhs(lhs);\n\n    typedef Map<const Matrix<RhsScalar,Dynamic,1> > RhsMap;\n    const RhsMap rhs(_rhs,cols);\n    typename conj_expr_if<ConjRhs,RhsMap>::type cjRhs(rhs);\n\n    typedef Map<Matrix<ResScalar,Dynamic,1>, 0, InnerStride<> > ResMap;\n    ResMap res(_res,rows,InnerStride<>(resIncr));\n    \n    for (Index pi=0; pi<diagSize; pi+=PanelWidth)\n    {\n      Index actualPanelWidth = (std::min)(PanelWidth, diagSize-pi);\n      for (Index k=0; k<actualPanelWidth; ++k)\n      {\n        Index i = pi + k;\n        Index s = IsLower ? pi  : ((HasUnitDiag||HasZeroDiag) ? i+1 : i);\n        Index r = IsLower ? k+1 : actualPanelWidth-k;\n        if ((!(HasUnitDiag||HasZeroDiag)) || (--r)>0)\n          res.coeffRef(i) += alpha * (cjLhs.row(i).segment(s,r).cwiseProduct(cjRhs.segment(s,r).transpose())).sum();\n        if (HasUnitDiag)\n          res.coeffRef(i) += alpha * cjRhs.coeff(i);\n      }\n      Index r = IsLower ? pi : cols - pi - actualPanelWidth;\n      if (r>0)\n      {\n        Index s = IsLower ? 0 : pi + actualPanelWidth;\n        general_matrix_vector_product<Index,LhsScalar,RowMajor,ConjLhs,RhsScalar,ConjRhs,BuiltIn>::run(\n            actualPanelWidth, r,\n            &lhs.coeffRef(pi,s), lhsStride,\n            &rhs.coeffRef(s), rhsIncr,\n            &res.coeffRef(pi), resIncr, alpha);\n      }\n    }\n    if(IsLower && rows>diagSize)\n    {\n      general_matrix_vector_product<Index,LhsScalar,RowMajor,ConjLhs,RhsScalar,ConjRhs>::run(\n            rows-diagSize, cols,\n            &lhs.coeffRef(diagSize,0), lhsStride,\n            &rhs.coeffRef(0), rhsIncr,\n            &res.coeffRef(diagSize), resIncr, alpha);\n    }\n  }\n\n/***************************************************************************\n* Wrapper to product_triangular_vector\n***************************************************************************/\n\ntemplate<int Mode, bool LhsIsTriangular, typename Lhs, typename Rhs>\nstruct traits<TriangularProduct<Mode,LhsIsTriangular,Lhs,false,Rhs,true> >\n : traits<ProductBase<TriangularProduct<Mode,LhsIsTriangular,Lhs,false,Rhs,true>, Lhs, Rhs> >\n{};\n\ntemplate<int Mode, bool LhsIsTriangular, typename Lhs, typename Rhs>\nstruct traits<TriangularProduct<Mode,LhsIsTriangular,Lhs,true,Rhs,false> >\n : traits<ProductBase<TriangularProduct<Mode,LhsIsTriangular,Lhs,true,Rhs,false>, Lhs, Rhs> >\n{};\n\n\ntemplate<int StorageOrder>\nstruct trmv_selector;\n\n} // end namespace internal\n\ntemplate<int Mode, typename Lhs, typename Rhs>\nstruct TriangularProduct<Mode,true,Lhs,false,Rhs,true>\n  : public ProductBase<TriangularProduct<Mode,true,Lhs,false,Rhs,true>, Lhs, Rhs >\n{\n  EIGEN_PRODUCT_PUBLIC_INTERFACE(TriangularProduct)\n\n  TriangularProduct(const Lhs& lhs, const Rhs& rhs) : Base(lhs,rhs) {}\n\n  template<typename Dest> void scaleAndAddTo(Dest& dst, const Scalar& alpha) const\n  {\n    eigen_assert(dst.rows()==m_lhs.rows() && dst.cols()==m_rhs.cols());\n  \n    internal::trmv_selector<(int(internal::traits<Lhs>::Flags)&RowMajorBit) ? RowMajor : ColMajor>::run(*this, dst, alpha);\n  }\n};\n\ntemplate<int Mode, typename Lhs, typename Rhs>\nstruct TriangularProduct<Mode,false,Lhs,true,Rhs,false>\n  : public ProductBase<TriangularProduct<Mode,false,Lhs,true,Rhs,false>, Lhs, Rhs >\n{\n  EIGEN_PRODUCT_PUBLIC_INTERFACE(TriangularProduct)\n\n  TriangularProduct(const Lhs& lhs, const Rhs& rhs) : Base(lhs,rhs) {}\n\n  template<typename Dest> void scaleAndAddTo(Dest& dst, const Scalar& alpha) const\n  {\n    eigen_assert(dst.rows()==m_lhs.rows() && dst.cols()==m_rhs.cols());\n\n    typedef TriangularProduct<(Mode & (UnitDiag|ZeroDiag)) | ((Mode & Lower) ? Upper : Lower),true,Transpose<const Rhs>,false,Transpose<const Lhs>,true> TriangularProductTranspose;\n    Transpose<Dest> dstT(dst);\n    internal::trmv_selector<(int(internal::traits<Rhs>::Flags)&RowMajorBit) ? ColMajor : RowMajor>::run(\n      TriangularProductTranspose(m_rhs.transpose(),m_lhs.transpose()), dstT, alpha);\n  }\n};\n\nnamespace internal {\n\n// TODO: find a way to factorize this piece of code with gemv_selector since the logic is exactly the same.\n  \ntemplate<> struct trmv_selector<ColMajor>\n{\n  template<int Mode, typename Lhs, typename Rhs, typename Dest>\n  static void run(const TriangularProduct<Mode,true,Lhs,false,Rhs,true>& prod, Dest& dest, const typename TriangularProduct<Mode,true,Lhs,false,Rhs,true>::Scalar& alpha)\n  {\n    typedef TriangularProduct<Mode,true,Lhs,false,Rhs,true> ProductType;\n    typedef typename ProductType::Index Index;\n    typedef typename ProductType::LhsScalar   LhsScalar;\n    typedef typename ProductType::RhsScalar   RhsScalar;\n    typedef typename ProductType::Scalar      ResScalar;\n    typedef typename ProductType::RealScalar  RealScalar;\n    typedef typename ProductType::ActualLhsType ActualLhsType;\n    typedef typename ProductType::ActualRhsType ActualRhsType;\n    typedef typename ProductType::LhsBlasTraits LhsBlasTraits;\n    typedef typename ProductType::RhsBlasTraits RhsBlasTraits;\n    typedef Map<Matrix<ResScalar,Dynamic,1>, Aligned> MappedDest;\n\n    typename internal::add_const_on_value_type<ActualLhsType>::type actualLhs = LhsBlasTraits::extract(prod.lhs());\n    typename internal::add_const_on_value_type<ActualRhsType>::type actualRhs = RhsBlasTraits::extract(prod.rhs());\n\n    ResScalar actualAlpha = alpha * LhsBlasTraits::extractScalarFactor(prod.lhs())\n                                  * RhsBlasTraits::extractScalarFactor(prod.rhs());\n\n    enum {\n      // FIXME find a way to allow an inner stride on the result if packet_traits<Scalar>::size==1\n      // on, the other hand it is good for the cache to pack the vector anyways...\n      EvalToDestAtCompileTime = Dest::InnerStrideAtCompileTime==1,\n      ComplexByReal = (NumTraits<LhsScalar>::IsComplex) && (!NumTraits<RhsScalar>::IsComplex),\n      MightCannotUseDest = (Dest::InnerStrideAtCompileTime!=1) || ComplexByReal\n    };\n\n    gemv_static_vector_if<ResScalar,Dest::SizeAtCompileTime,Dest::MaxSizeAtCompileTime,MightCannotUseDest> static_dest;\n\n    bool alphaIsCompatible = (!ComplexByReal) || (numext::imag(actualAlpha)==RealScalar(0));\n    bool evalToDest = EvalToDestAtCompileTime && alphaIsCompatible;\n    \n    RhsScalar compatibleAlpha = get_factor<ResScalar,RhsScalar>::run(actualAlpha);\n\n    ei_declare_aligned_stack_constructed_variable(ResScalar,actualDestPtr,dest.size(),\n                                                  evalToDest ? dest.data() : static_dest.data());\n\n    if(!evalToDest)\n    {\n      #ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN\n      Index size = dest.size();\n      EIGEN_DENSE_STORAGE_CTOR_PLUGIN\n      #endif\n      if(!alphaIsCompatible)\n      {\n        MappedDest(actualDestPtr, dest.size()).setZero();\n        compatibleAlpha = RhsScalar(1);\n      }\n      else\n        MappedDest(actualDestPtr, dest.size()) = dest;\n    }\n    \n    internal::triangular_matrix_vector_product\n      <Index,Mode,\n       LhsScalar, LhsBlasTraits::NeedToConjugate,\n       RhsScalar, RhsBlasTraits::NeedToConjugate,\n       ColMajor>\n      ::run(actualLhs.rows(),actualLhs.cols(),\n            actualLhs.data(),actualLhs.outerStride(),\n            actualRhs.data(),actualRhs.innerStride(),\n            actualDestPtr,1,compatibleAlpha);\n\n    if (!evalToDest)\n    {\n      if(!alphaIsCompatible)\n        dest += actualAlpha * MappedDest(actualDestPtr, dest.size());\n      else\n        dest = MappedDest(actualDestPtr, dest.size());\n    }\n  }\n};\n\ntemplate<> struct trmv_selector<RowMajor>\n{\n  template<int Mode, typename Lhs, typename Rhs, typename Dest>\n  static void run(const TriangularProduct<Mode,true,Lhs,false,Rhs,true>& prod, Dest& dest, const typename TriangularProduct<Mode,true,Lhs,false,Rhs,true>::Scalar& alpha)\n  {\n    typedef TriangularProduct<Mode,true,Lhs,false,Rhs,true> ProductType;\n    typedef typename ProductType::LhsScalar LhsScalar;\n    typedef typename ProductType::RhsScalar RhsScalar;\n    typedef typename ProductType::Scalar    ResScalar;\n    typedef typename ProductType::Index Index;\n    typedef typename ProductType::ActualLhsType ActualLhsType;\n    typedef typename ProductType::ActualRhsType ActualRhsType;\n    typedef typename ProductType::_ActualRhsType _ActualRhsType;\n    typedef typename ProductType::LhsBlasTraits LhsBlasTraits;\n    typedef typename ProductType::RhsBlasTraits RhsBlasTraits;\n\n    typename add_const<ActualLhsType>::type actualLhs = LhsBlasTraits::extract(prod.lhs());\n    typename add_const<ActualRhsType>::type actualRhs = RhsBlasTraits::extract(prod.rhs());\n\n    ResScalar actualAlpha = alpha * LhsBlasTraits::extractScalarFactor(prod.lhs())\n                                  * RhsBlasTraits::extractScalarFactor(prod.rhs());\n\n    enum {\n      DirectlyUseRhs = _ActualRhsType::InnerStrideAtCompileTime==1\n    };\n\n    gemv_static_vector_if<RhsScalar,_ActualRhsType::SizeAtCompileTime,_ActualRhsType::MaxSizeAtCompileTime,!DirectlyUseRhs> static_rhs;\n\n    ei_declare_aligned_stack_constructed_variable(RhsScalar,actualRhsPtr,actualRhs.size(),\n        DirectlyUseRhs ? const_cast<RhsScalar*>(actualRhs.data()) : static_rhs.data());\n\n    if(!DirectlyUseRhs)\n    {\n      #ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN\n      int size = actualRhs.size();\n      EIGEN_DENSE_STORAGE_CTOR_PLUGIN\n      #endif\n      Map<typename _ActualRhsType::PlainObject>(actualRhsPtr, actualRhs.size()) = actualRhs;\n    }\n    \n    internal::triangular_matrix_vector_product\n      <Index,Mode,\n       LhsScalar, LhsBlasTraits::NeedToConjugate,\n       RhsScalar, RhsBlasTraits::NeedToConjugate,\n       RowMajor>\n      ::run(actualLhs.rows(),actualLhs.cols(),\n            actualLhs.data(),actualLhs.outerStride(),\n            actualRhsPtr,1,\n            dest.data(),dest.innerStride(),\n            actualAlpha);\n  }\n};\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_TRIANGULARMATRIXVECTOR_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/products/TriangularMatrixVector_MKL.h",
    "content": "/*\n Copyright (c) 2011, Intel Corporation. All rights reserved.\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n * Neither the name of Intel Corporation nor the names of its contributors may\n   be used to endorse or promote products derived from this software without\n   specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\n ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n ********************************************************************************\n *   Content : Eigen bindings to Intel(R) MKL\n *   Triangular matrix-vector product functionality based on ?TRMV.\n ********************************************************************************\n*/\n\n#ifndef EIGEN_TRIANGULAR_MATRIX_VECTOR_MKL_H\n#define EIGEN_TRIANGULAR_MATRIX_VECTOR_MKL_H\n\nnamespace Eigen { \n\nnamespace internal {\n\n/**********************************************************************\n* This file implements triangular matrix-vector multiplication using BLAS\n**********************************************************************/\n\n// trmv/hemv specialization\n\ntemplate<typename Index, int Mode, typename LhsScalar, bool ConjLhs, typename RhsScalar, bool ConjRhs, int StorageOrder>\nstruct triangular_matrix_vector_product_trmv :\n  triangular_matrix_vector_product<Index,Mode,LhsScalar,ConjLhs,RhsScalar,ConjRhs,StorageOrder,BuiltIn> {};\n\n#define EIGEN_MKL_TRMV_SPECIALIZE(Scalar) \\\ntemplate<typename Index, int Mode, bool ConjLhs, bool ConjRhs> \\\nstruct triangular_matrix_vector_product<Index,Mode,Scalar,ConjLhs,Scalar,ConjRhs,ColMajor,Specialized> { \\\n static void run(Index _rows, Index _cols, const Scalar* _lhs, Index lhsStride, \\\n                                     const Scalar* _rhs, Index rhsIncr, Scalar* _res, Index resIncr, Scalar alpha) { \\\n      triangular_matrix_vector_product_trmv<Index,Mode,Scalar,ConjLhs,Scalar,ConjRhs,ColMajor>::run( \\\n        _rows, _cols, _lhs, lhsStride, _rhs, rhsIncr, _res, resIncr, alpha); \\\n  } \\\n}; \\\ntemplate<typename Index, int Mode, bool ConjLhs, bool ConjRhs> \\\nstruct triangular_matrix_vector_product<Index,Mode,Scalar,ConjLhs,Scalar,ConjRhs,RowMajor,Specialized> { \\\n static void run(Index _rows, Index _cols, const Scalar* _lhs, Index lhsStride, \\\n                                     const Scalar* _rhs, Index rhsIncr, Scalar* _res, Index resIncr, Scalar alpha) { \\\n      triangular_matrix_vector_product_trmv<Index,Mode,Scalar,ConjLhs,Scalar,ConjRhs,RowMajor>::run( \\\n        _rows, _cols, _lhs, lhsStride, _rhs, rhsIncr, _res, resIncr, alpha); \\\n  } \\\n};\n\nEIGEN_MKL_TRMV_SPECIALIZE(double)\nEIGEN_MKL_TRMV_SPECIALIZE(float)\nEIGEN_MKL_TRMV_SPECIALIZE(dcomplex)\nEIGEN_MKL_TRMV_SPECIALIZE(scomplex)\n\n// implements col-major: res += alpha * op(triangular) * vector\n#define EIGEN_MKL_TRMV_CM(EIGTYPE, MKLTYPE, EIGPREFIX, MKLPREFIX) \\\ntemplate<typename Index, int Mode, bool ConjLhs, bool ConjRhs> \\\nstruct triangular_matrix_vector_product_trmv<Index,Mode,EIGTYPE,ConjLhs,EIGTYPE,ConjRhs,ColMajor> { \\\n  enum { \\\n    IsLower = (Mode&Lower) == Lower, \\\n    SetDiag = (Mode&(ZeroDiag|UnitDiag)) ? 0 : 1, \\\n    IsUnitDiag  = (Mode&UnitDiag) ? 1 : 0, \\\n    IsZeroDiag  = (Mode&ZeroDiag) ? 1 : 0, \\\n    LowUp = IsLower ? Lower : Upper \\\n  }; \\\n static void run(Index _rows, Index _cols, const EIGTYPE* _lhs, Index lhsStride, \\\n                 const EIGTYPE* _rhs, Index rhsIncr, EIGTYPE* _res, Index resIncr, EIGTYPE alpha) \\\n { \\\n   if (ConjLhs || IsZeroDiag) { \\\n     triangular_matrix_vector_product<Index,Mode,EIGTYPE,ConjLhs,EIGTYPE,ConjRhs,ColMajor,BuiltIn>::run( \\\n       _rows, _cols, _lhs, lhsStride, _rhs, rhsIncr, _res, resIncr, alpha); \\\n     return; \\\n   }\\\n   Index size = (std::min)(_rows,_cols); \\\n   Index rows = IsLower ? _rows : size; \\\n   Index cols = IsLower ? size : _cols; \\\n\\\n   typedef VectorX##EIGPREFIX VectorRhs; \\\n   EIGTYPE *x, *y;\\\n\\\n/* Set x*/ \\\n   Map<const VectorRhs, 0, InnerStride<> > rhs(_rhs,cols,InnerStride<>(rhsIncr)); \\\n   VectorRhs x_tmp; \\\n   if (ConjRhs) x_tmp = rhs.conjugate(); else x_tmp = rhs; \\\n   x = x_tmp.data(); \\\n\\\n/* Square part handling */\\\n\\\n   char trans, uplo, diag; \\\n   MKL_INT m, n, lda, incx, incy; \\\n   EIGTYPE const *a; \\\n   MKLTYPE alpha_, beta_; \\\n   assign_scalar_eig2mkl<MKLTYPE, EIGTYPE>(alpha_, alpha); \\\n   assign_scalar_eig2mkl<MKLTYPE, EIGTYPE>(beta_, EIGTYPE(1)); \\\n\\\n/* Set m, n */ \\\n   n = (MKL_INT)size; \\\n   lda = lhsStride; \\\n   incx = 1; \\\n   incy = resIncr; \\\n\\\n/* Set uplo, trans and diag*/ \\\n   trans = 'N'; \\\n   uplo = IsLower ? 'L' : 'U'; \\\n   diag = IsUnitDiag ? 'U' : 'N'; \\\n\\\n/* call ?TRMV*/ \\\n   MKLPREFIX##trmv(&uplo, &trans, &diag, &n, (const MKLTYPE*)_lhs, &lda, (MKLTYPE*)x, &incx); \\\n\\\n/* Add op(a_tr)rhs into res*/ \\\n   MKLPREFIX##axpy(&n, &alpha_,(const MKLTYPE*)x, &incx, (MKLTYPE*)_res, &incy); \\\n/* Non-square case - doesn't fit to MKL ?TRMV. Fall to default triangular product*/ \\\n   if (size<(std::max)(rows,cols)) { \\\n     typedef Matrix<EIGTYPE, Dynamic, Dynamic> MatrixLhs; \\\n     if (ConjRhs) x_tmp = rhs.conjugate(); else x_tmp = rhs; \\\n     x = x_tmp.data(); \\\n     if (size<rows) { \\\n       y = _res + size*resIncr; \\\n       a = _lhs + size; \\\n       m = rows-size; \\\n       n = size; \\\n     } \\\n     else { \\\n       x += size; \\\n       y = _res; \\\n       a = _lhs + size*lda; \\\n       m = size; \\\n       n = cols-size; \\\n     } \\\n     MKLPREFIX##gemv(&trans, &m, &n, &alpha_, (const MKLTYPE*)a, &lda, (const MKLTYPE*)x, &incx, &beta_, (MKLTYPE*)y, &incy); \\\n   } \\\n  } \\\n};\n\nEIGEN_MKL_TRMV_CM(double, double, d, d)\nEIGEN_MKL_TRMV_CM(dcomplex, MKL_Complex16, cd, z)\nEIGEN_MKL_TRMV_CM(float, float, f, s)\nEIGEN_MKL_TRMV_CM(scomplex, MKL_Complex8, cf, c)\n\n// implements row-major: res += alpha * op(triangular) * vector\n#define EIGEN_MKL_TRMV_RM(EIGTYPE, MKLTYPE, EIGPREFIX, MKLPREFIX) \\\ntemplate<typename Index, int Mode, bool ConjLhs, bool ConjRhs> \\\nstruct triangular_matrix_vector_product_trmv<Index,Mode,EIGTYPE,ConjLhs,EIGTYPE,ConjRhs,RowMajor> { \\\n  enum { \\\n    IsLower = (Mode&Lower) == Lower, \\\n    SetDiag = (Mode&(ZeroDiag|UnitDiag)) ? 0 : 1, \\\n    IsUnitDiag  = (Mode&UnitDiag) ? 1 : 0, \\\n    IsZeroDiag  = (Mode&ZeroDiag) ? 1 : 0, \\\n    LowUp = IsLower ? Lower : Upper \\\n  }; \\\n static void run(Index _rows, Index _cols, const EIGTYPE* _lhs, Index lhsStride, \\\n                 const EIGTYPE* _rhs, Index rhsIncr, EIGTYPE* _res, Index resIncr, EIGTYPE alpha) \\\n { \\\n   if (IsZeroDiag) { \\\n     triangular_matrix_vector_product<Index,Mode,EIGTYPE,ConjLhs,EIGTYPE,ConjRhs,RowMajor,BuiltIn>::run( \\\n       _rows, _cols, _lhs, lhsStride, _rhs, rhsIncr, _res, resIncr, alpha); \\\n     return; \\\n   }\\\n   Index size = (std::min)(_rows,_cols); \\\n   Index rows = IsLower ? _rows : size; \\\n   Index cols = IsLower ? size : _cols; \\\n\\\n   typedef VectorX##EIGPREFIX VectorRhs; \\\n   EIGTYPE *x, *y;\\\n\\\n/* Set x*/ \\\n   Map<const VectorRhs, 0, InnerStride<> > rhs(_rhs,cols,InnerStride<>(rhsIncr)); \\\n   VectorRhs x_tmp; \\\n   if (ConjRhs) x_tmp = rhs.conjugate(); else x_tmp = rhs; \\\n   x = x_tmp.data(); \\\n\\\n/* Square part handling */\\\n\\\n   char trans, uplo, diag; \\\n   MKL_INT m, n, lda, incx, incy; \\\n   EIGTYPE const *a; \\\n   MKLTYPE alpha_, beta_; \\\n   assign_scalar_eig2mkl<MKLTYPE, EIGTYPE>(alpha_, alpha); \\\n   assign_scalar_eig2mkl<MKLTYPE, EIGTYPE>(beta_, EIGTYPE(1)); \\\n\\\n/* Set m, n */ \\\n   n = (MKL_INT)size; \\\n   lda = lhsStride; \\\n   incx = 1; \\\n   incy = resIncr; \\\n\\\n/* Set uplo, trans and diag*/ \\\n   trans = ConjLhs ? 'C' : 'T'; \\\n   uplo = IsLower ? 'U' : 'L'; \\\n   diag = IsUnitDiag ? 'U' : 'N'; \\\n\\\n/* call ?TRMV*/ \\\n   MKLPREFIX##trmv(&uplo, &trans, &diag, &n, (const MKLTYPE*)_lhs, &lda, (MKLTYPE*)x, &incx); \\\n\\\n/* Add op(a_tr)rhs into res*/ \\\n   MKLPREFIX##axpy(&n, &alpha_,(const MKLTYPE*)x, &incx, (MKLTYPE*)_res, &incy); \\\n/* Non-square case - doesn't fit to MKL ?TRMV. Fall to default triangular product*/ \\\n   if (size<(std::max)(rows,cols)) { \\\n     typedef Matrix<EIGTYPE, Dynamic, Dynamic> MatrixLhs; \\\n     if (ConjRhs) x_tmp = rhs.conjugate(); else x_tmp = rhs; \\\n     x = x_tmp.data(); \\\n     if (size<rows) { \\\n       y = _res + size*resIncr; \\\n       a = _lhs + size*lda; \\\n       m = rows-size; \\\n       n = size; \\\n     } \\\n     else { \\\n       x += size; \\\n       y = _res; \\\n       a = _lhs + size; \\\n       m = size; \\\n       n = cols-size; \\\n     } \\\n     MKLPREFIX##gemv(&trans, &n, &m, &alpha_, (const MKLTYPE*)a, &lda, (const MKLTYPE*)x, &incx, &beta_, (MKLTYPE*)y, &incy); \\\n   } \\\n  } \\\n};\n\nEIGEN_MKL_TRMV_RM(double, double, d, d)\nEIGEN_MKL_TRMV_RM(dcomplex, MKL_Complex16, cd, z)\nEIGEN_MKL_TRMV_RM(float, float, f, s)\nEIGEN_MKL_TRMV_RM(scomplex, MKL_Complex8, cf, c)\n\n} // end namespase internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_TRIANGULAR_MATRIX_VECTOR_MKL_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/products/TriangularSolverMatrix.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_TRIANGULAR_SOLVER_MATRIX_H\n#define EIGEN_TRIANGULAR_SOLVER_MATRIX_H\n\nnamespace Eigen { \n\nnamespace internal {\n\n// if the rhs is row major, let's transpose the product\ntemplate <typename Scalar, typename Index, int Side, int Mode, bool Conjugate, int TriStorageOrder>\nstruct triangular_solve_matrix<Scalar,Index,Side,Mode,Conjugate,TriStorageOrder,RowMajor>\n{\n  static void run(\n    Index size, Index cols,\n    const Scalar*  tri, Index triStride,\n    Scalar* _other, Index otherStride,\n    level3_blocking<Scalar,Scalar>& blocking)\n  {\n    triangular_solve_matrix<\n      Scalar, Index, Side==OnTheLeft?OnTheRight:OnTheLeft,\n      (Mode&UnitDiag) | ((Mode&Upper) ? Lower : Upper),\n      NumTraits<Scalar>::IsComplex && Conjugate,\n      TriStorageOrder==RowMajor ? ColMajor : RowMajor, ColMajor>\n      ::run(size, cols, tri, triStride, _other, otherStride, blocking);\n  }\n};\n\n/* Optimized triangular solver with multiple right hand side and the triangular matrix on the left\n */\ntemplate <typename Scalar, typename Index, int Mode, bool Conjugate, int TriStorageOrder>\nstruct triangular_solve_matrix<Scalar,Index,OnTheLeft,Mode,Conjugate,TriStorageOrder,ColMajor>\n{\n  static EIGEN_DONT_INLINE void run(\n    Index size, Index otherSize,\n    const Scalar* _tri, Index triStride,\n    Scalar* _other, Index otherStride,\n    level3_blocking<Scalar,Scalar>& blocking);\n};\ntemplate <typename Scalar, typename Index, int Mode, bool Conjugate, int TriStorageOrder>\nEIGEN_DONT_INLINE void triangular_solve_matrix<Scalar,Index,OnTheLeft,Mode,Conjugate,TriStorageOrder,ColMajor>::run(\n    Index size, Index otherSize,\n    const Scalar* _tri, Index triStride,\n    Scalar* _other, Index otherStride,\n    level3_blocking<Scalar,Scalar>& blocking)\n  {\n    Index cols = otherSize;\n    const_blas_data_mapper<Scalar, Index, TriStorageOrder> tri(_tri,triStride);\n    blas_data_mapper<Scalar, Index, ColMajor> other(_other,otherStride);\n\n    typedef gebp_traits<Scalar,Scalar> Traits;\n    enum {\n      SmallPanelWidth   = EIGEN_PLAIN_ENUM_MAX(Traits::mr,Traits::nr),\n      IsLower = (Mode&Lower) == Lower\n    };\n\n    Index kc = blocking.kc();                   // cache block size along the K direction\n    Index mc = (std::min)(size,blocking.mc());  // cache block size along the M direction\n\n    std::size_t sizeA = kc*mc;\n    std::size_t sizeB = kc*cols;\n    std::size_t sizeW = kc*Traits::WorkSpaceFactor;\n\n    ei_declare_aligned_stack_constructed_variable(Scalar, blockA, sizeA, blocking.blockA());\n    ei_declare_aligned_stack_constructed_variable(Scalar, blockB, sizeB, blocking.blockB());\n    ei_declare_aligned_stack_constructed_variable(Scalar, blockW, sizeW, blocking.blockW());\n\n    conj_if<Conjugate> conj;\n    gebp_kernel<Scalar, Scalar, Index, Traits::mr, Traits::nr, Conjugate, false> gebp_kernel;\n    gemm_pack_lhs<Scalar, Index, Traits::mr, Traits::LhsProgress, TriStorageOrder> pack_lhs;\n    gemm_pack_rhs<Scalar, Index, Traits::nr, ColMajor, false, true> pack_rhs;\n\n    // the goal here is to subdivise the Rhs panels such that we keep some cache\n    // coherence when accessing the rhs elements\n    std::ptrdiff_t l1, l2;\n    manage_caching_sizes(GetAction, &l1, &l2);\n    Index subcols = cols>0 ? l2/(4 * sizeof(Scalar) *  std::max<Index>(otherStride,size)) : 0;\n    subcols = std::max<Index>((subcols/Traits::nr)*Traits::nr, Traits::nr);\n\n    for(Index k2=IsLower ? 0 : size;\n        IsLower ? k2<size : k2>0;\n        IsLower ? k2+=kc : k2-=kc)\n    {\n      const Index actual_kc = (std::min)(IsLower ? size-k2 : k2, kc);\n\n      // We have selected and packed a big horizontal panel R1 of rhs. Let B be the packed copy of this panel,\n      // and R2 the remaining part of rhs. The corresponding vertical panel of lhs is split into\n      // A11 (the triangular part) and A21 the remaining rectangular part.\n      // Then the high level algorithm is:\n      //  - B = R1                    => general block copy (done during the next step)\n      //  - R1 = A11^-1 B             => tricky part\n      //  - update B from the new R1  => actually this has to be performed continuously during the above step\n      //  - R2 -= A21 * B             => GEPP\n\n      // The tricky part: compute R1 = A11^-1 B while updating B from R1\n      // The idea is to split A11 into multiple small vertical panels.\n      // Each panel can be split into a small triangular part T1k which is processed without optimization,\n      // and the remaining small part T2k which is processed using gebp with appropriate block strides\n      for(Index j2=0; j2<cols; j2+=subcols)\n      {\n        Index actual_cols = (std::min)(cols-j2,subcols);\n        // for each small vertical panels [T1k^T, T2k^T]^T of lhs\n        for (Index k1=0; k1<actual_kc; k1+=SmallPanelWidth)\n        {\n          Index actualPanelWidth = std::min<Index>(actual_kc-k1, SmallPanelWidth);\n          // tr solve\n          for (Index k=0; k<actualPanelWidth; ++k)\n          {\n            // TODO write a small kernel handling this (can be shared with trsv)\n            Index i  = IsLower ? k2+k1+k : k2-k1-k-1;\n            Index rs = actualPanelWidth - k - 1; // remaining size\n            Index s  = TriStorageOrder==RowMajor ? (IsLower ? k2+k1 : i+1)\n                                                 :  IsLower ? i+1 : i-rs;\n\n            Scalar a = (Mode & UnitDiag) ? Scalar(1) : Scalar(1)/conj(tri(i,i));\n            for (Index j=j2; j<j2+actual_cols; ++j)\n            {\n              if (TriStorageOrder==RowMajor)\n              {\n                Scalar b(0);\n                const Scalar* l = &tri(i,s);\n                Scalar* r = &other(s,j);\n                for (Index i3=0; i3<k; ++i3)\n                  b += conj(l[i3]) * r[i3];\n\n                other(i,j) = (other(i,j) - b)*a;\n              }\n              else\n              {\n                Scalar b = (other(i,j) *= a);\n                Scalar* r = &other(s,j);\n                const Scalar* l = &tri(s,i);\n                for (Index i3=0;i3<rs;++i3)\n                  r[i3] -= b * conj(l[i3]);\n              }\n            }\n          }\n\n          Index lengthTarget = actual_kc-k1-actualPanelWidth;\n          Index startBlock   = IsLower ? k2+k1 : k2-k1-actualPanelWidth;\n          Index blockBOffset = IsLower ? k1 : lengthTarget;\n\n          // update the respective rows of B from other\n          pack_rhs(blockB+actual_kc*j2, &other(startBlock,j2), otherStride, actualPanelWidth, actual_cols, actual_kc, blockBOffset);\n\n          // GEBP\n          if (lengthTarget>0)\n          {\n            Index startTarget  = IsLower ? k2+k1+actualPanelWidth : k2-actual_kc;\n\n            pack_lhs(blockA, &tri(startTarget,startBlock), triStride, actualPanelWidth, lengthTarget);\n\n            gebp_kernel(&other(startTarget,j2), otherStride, blockA, blockB+actual_kc*j2, lengthTarget, actualPanelWidth, actual_cols, Scalar(-1),\n                        actualPanelWidth, actual_kc, 0, blockBOffset, blockW);\n          }\n        }\n      }\n      \n      // R2 -= A21 * B => GEPP\n      {\n        Index start = IsLower ? k2+kc : 0;\n        Index end   = IsLower ? size : k2-kc;\n        for(Index i2=start; i2<end; i2+=mc)\n        {\n          const Index actual_mc = (std::min)(mc,end-i2);\n          if (actual_mc>0)\n          {\n            pack_lhs(blockA, &tri(i2, IsLower ? k2 : k2-kc), triStride, actual_kc, actual_mc);\n\n            gebp_kernel(_other+i2, otherStride, blockA, blockB, actual_mc, actual_kc, cols, Scalar(-1), -1, -1, 0, 0, blockW);\n          }\n        }\n      }\n    }\n  }\n\n/* Optimized triangular solver with multiple left hand sides and the trinagular matrix on the right\n */\ntemplate <typename Scalar, typename Index, int Mode, bool Conjugate, int TriStorageOrder>\nstruct triangular_solve_matrix<Scalar,Index,OnTheRight,Mode,Conjugate,TriStorageOrder,ColMajor>\n{\n  static EIGEN_DONT_INLINE void run(\n    Index size, Index otherSize,\n    const Scalar* _tri, Index triStride,\n    Scalar* _other, Index otherStride,\n    level3_blocking<Scalar,Scalar>& blocking);\n};\ntemplate <typename Scalar, typename Index, int Mode, bool Conjugate, int TriStorageOrder>\nEIGEN_DONT_INLINE void triangular_solve_matrix<Scalar,Index,OnTheRight,Mode,Conjugate,TriStorageOrder,ColMajor>::run(\n    Index size, Index otherSize,\n    const Scalar* _tri, Index triStride,\n    Scalar* _other, Index otherStride,\n    level3_blocking<Scalar,Scalar>& blocking)\n  {\n    Index rows = otherSize;\n    const_blas_data_mapper<Scalar, Index, TriStorageOrder> rhs(_tri,triStride);\n    blas_data_mapper<Scalar, Index, ColMajor> lhs(_other,otherStride);\n\n    typedef gebp_traits<Scalar,Scalar> Traits;\n    enum {\n      RhsStorageOrder   = TriStorageOrder,\n      SmallPanelWidth   = EIGEN_PLAIN_ENUM_MAX(Traits::mr,Traits::nr),\n      IsLower = (Mode&Lower) == Lower\n    };\n\n    Index kc = blocking.kc();                   // cache block size along the K direction\n    Index mc = (std::min)(rows,blocking.mc());  // cache block size along the M direction\n\n    std::size_t sizeA = kc*mc;\n    std::size_t sizeB = kc*size;\n    std::size_t sizeW = kc*Traits::WorkSpaceFactor;\n\n    ei_declare_aligned_stack_constructed_variable(Scalar, blockA, sizeA, blocking.blockA());\n    ei_declare_aligned_stack_constructed_variable(Scalar, blockB, sizeB, blocking.blockB());\n    ei_declare_aligned_stack_constructed_variable(Scalar, blockW, sizeW, blocking.blockW());\n\n    conj_if<Conjugate> conj;\n    gebp_kernel<Scalar,Scalar, Index, Traits::mr, Traits::nr, false, Conjugate> gebp_kernel;\n    gemm_pack_rhs<Scalar, Index, Traits::nr,RhsStorageOrder> pack_rhs;\n    gemm_pack_rhs<Scalar, Index, Traits::nr,RhsStorageOrder,false,true> pack_rhs_panel;\n    gemm_pack_lhs<Scalar, Index, Traits::mr, Traits::LhsProgress, ColMajor, false, true> pack_lhs_panel;\n\n    for(Index k2=IsLower ? size : 0;\n        IsLower ? k2>0 : k2<size;\n        IsLower ? k2-=kc : k2+=kc)\n    {\n      const Index actual_kc = (std::min)(IsLower ? k2 : size-k2, kc);\n      Index actual_k2 = IsLower ? k2-actual_kc : k2 ;\n\n      Index startPanel = IsLower ? 0 : k2+actual_kc;\n      Index rs = IsLower ? actual_k2 : size - actual_k2 - actual_kc;\n      Scalar* geb = blockB+actual_kc*actual_kc;\n\n      if (rs>0) pack_rhs(geb, &rhs(actual_k2,startPanel), triStride, actual_kc, rs);\n\n      // triangular packing (we only pack the panels off the diagonal,\n      // neglecting the blocks overlapping the diagonal\n      {\n        for (Index j2=0; j2<actual_kc; j2+=SmallPanelWidth)\n        {\n          Index actualPanelWidth = std::min<Index>(actual_kc-j2, SmallPanelWidth);\n          Index actual_j2 = actual_k2 + j2;\n          Index panelOffset = IsLower ? j2+actualPanelWidth : 0;\n          Index panelLength = IsLower ? actual_kc-j2-actualPanelWidth : j2;\n\n          if (panelLength>0)\n          pack_rhs_panel(blockB+j2*actual_kc,\n                         &rhs(actual_k2+panelOffset, actual_j2), triStride,\n                         panelLength, actualPanelWidth,\n                         actual_kc, panelOffset);\n        }\n      }\n\n      for(Index i2=0; i2<rows; i2+=mc)\n      {\n        const Index actual_mc = (std::min)(mc,rows-i2);\n\n        // triangular solver kernel\n        {\n          // for each small block of the diagonal (=> vertical panels of rhs)\n          for (Index j2 = IsLower\n                      ? (actual_kc - ((actual_kc%SmallPanelWidth) ? Index(actual_kc%SmallPanelWidth)\n                                                                  : Index(SmallPanelWidth)))\n                      : 0;\n               IsLower ? j2>=0 : j2<actual_kc;\n               IsLower ? j2-=SmallPanelWidth : j2+=SmallPanelWidth)\n          {\n            Index actualPanelWidth = std::min<Index>(actual_kc-j2, SmallPanelWidth);\n            Index absolute_j2 = actual_k2 + j2;\n            Index panelOffset = IsLower ? j2+actualPanelWidth : 0;\n            Index panelLength = IsLower ? actual_kc - j2 - actualPanelWidth : j2;\n\n            // GEBP\n            if(panelLength>0)\n            {\n              gebp_kernel(&lhs(i2,absolute_j2), otherStride,\n                          blockA, blockB+j2*actual_kc,\n                          actual_mc, panelLength, actualPanelWidth,\n                          Scalar(-1),\n                          actual_kc, actual_kc, // strides\n                          panelOffset, panelOffset, // offsets\n                          blockW);  // workspace\n            }\n\n            // unblocked triangular solve\n            for (Index k=0; k<actualPanelWidth; ++k)\n            {\n              Index j = IsLower ? absolute_j2+actualPanelWidth-k-1 : absolute_j2+k;\n\n              Scalar* r = &lhs(i2,j);\n              for (Index k3=0; k3<k; ++k3)\n              {\n                Scalar b = conj(rhs(IsLower ? j+1+k3 : absolute_j2+k3,j));\n                Scalar* a = &lhs(i2,IsLower ? j+1+k3 : absolute_j2+k3);\n                for (Index i=0; i<actual_mc; ++i)\n                  r[i] -= a[i] * b;\n              }\n              if((Mode & UnitDiag)==0)\n              {\n                Scalar b = conj(rhs(j,j));\n                for (Index i=0; i<actual_mc; ++i)\n                  r[i] /= b;\n              }\n            }\n\n            // pack the just computed part of lhs to A\n            pack_lhs_panel(blockA, _other+absolute_j2*otherStride+i2, otherStride,\n                           actualPanelWidth, actual_mc,\n                           actual_kc, j2);\n          }\n        }\n\n        if (rs>0)\n          gebp_kernel(_other+i2+startPanel*otherStride, otherStride, blockA, geb,\n                      actual_mc, actual_kc, rs, Scalar(-1),\n                      -1, -1, 0, 0, blockW);\n      }\n    }\n  }\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_TRIANGULAR_SOLVER_MATRIX_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/products/TriangularSolverMatrix_MKL.h",
    "content": "/*\n Copyright (c) 2011, Intel Corporation. All rights reserved.\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n * Neither the name of Intel Corporation nor the names of its contributors may\n   be used to endorse or promote products derived from this software without\n   specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\n ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n ********************************************************************************\n *   Content : Eigen bindings to Intel(R) MKL\n *   Triangular matrix * matrix product functionality based on ?TRMM.\n ********************************************************************************\n*/\n\n#ifndef EIGEN_TRIANGULAR_SOLVER_MATRIX_MKL_H\n#define EIGEN_TRIANGULAR_SOLVER_MATRIX_MKL_H\n\nnamespace Eigen {\n\nnamespace internal {\n\n// implements LeftSide op(triangular)^-1 * general\n#define EIGEN_MKL_TRSM_L(EIGTYPE, MKLTYPE, MKLPREFIX) \\\ntemplate <typename Index, int Mode, bool Conjugate, int TriStorageOrder> \\\nstruct triangular_solve_matrix<EIGTYPE,Index,OnTheLeft,Mode,Conjugate,TriStorageOrder,ColMajor> \\\n{ \\\n  enum { \\\n    IsLower = (Mode&Lower) == Lower, \\\n    IsUnitDiag  = (Mode&UnitDiag) ? 1 : 0, \\\n    IsZeroDiag  = (Mode&ZeroDiag) ? 1 : 0, \\\n    conjA = ((TriStorageOrder==ColMajor) && Conjugate) ? 1 : 0 \\\n  }; \\\n  static void run( \\\n      Index size, Index otherSize, \\\n      const EIGTYPE* _tri, Index triStride, \\\n      EIGTYPE* _other, Index otherStride, level3_blocking<EIGTYPE,EIGTYPE>& /*blocking*/) \\\n  { \\\n   MKL_INT m = size, n = otherSize, lda, ldb; \\\n   char side = 'L', uplo, diag='N', transa; \\\n   /* Set alpha_ */ \\\n   MKLTYPE alpha; \\\n   EIGTYPE myone(1); \\\n   assign_scalar_eig2mkl(alpha, myone); \\\n   ldb = otherStride;\\\n\\\n   const EIGTYPE *a; \\\n/* Set trans */ \\\n   transa = (TriStorageOrder==RowMajor) ? ((Conjugate) ? 'C' : 'T') : 'N'; \\\n/* Set uplo */ \\\n   uplo = IsLower ? 'L' : 'U'; \\\n   if (TriStorageOrder==RowMajor) uplo = (uplo == 'L') ? 'U' : 'L'; \\\n/* Set a, lda */ \\\n   typedef Matrix<EIGTYPE, Dynamic, Dynamic, TriStorageOrder> MatrixTri; \\\n   Map<const MatrixTri, 0, OuterStride<> > tri(_tri,size,size,OuterStride<>(triStride)); \\\n   MatrixTri a_tmp; \\\n\\\n   if (conjA) { \\\n     a_tmp = tri.conjugate(); \\\n     a = a_tmp.data(); \\\n     lda = a_tmp.outerStride(); \\\n   } else { \\\n     a = _tri; \\\n     lda = triStride; \\\n   } \\\n   if (IsUnitDiag) diag='U'; \\\n/* call ?trsm*/ \\\n   MKLPREFIX##trsm(&side, &uplo, &transa, &diag, &m, &n, &alpha, (const MKLTYPE*)a, &lda, (MKLTYPE*)_other, &ldb); \\\n } \\\n};\n\nEIGEN_MKL_TRSM_L(double, double, d)\nEIGEN_MKL_TRSM_L(dcomplex, MKL_Complex16, z)\nEIGEN_MKL_TRSM_L(float, float, s)\nEIGEN_MKL_TRSM_L(scomplex, MKL_Complex8, c)\n\n\n// implements RightSide general * op(triangular)^-1\n#define EIGEN_MKL_TRSM_R(EIGTYPE, MKLTYPE, MKLPREFIX) \\\ntemplate <typename Index, int Mode, bool Conjugate, int TriStorageOrder> \\\nstruct triangular_solve_matrix<EIGTYPE,Index,OnTheRight,Mode,Conjugate,TriStorageOrder,ColMajor> \\\n{ \\\n  enum { \\\n    IsLower = (Mode&Lower) == Lower, \\\n    IsUnitDiag  = (Mode&UnitDiag) ? 1 : 0, \\\n    IsZeroDiag  = (Mode&ZeroDiag) ? 1 : 0, \\\n    conjA = ((TriStorageOrder==ColMajor) && Conjugate) ? 1 : 0 \\\n  }; \\\n  static void run( \\\n      Index size, Index otherSize, \\\n      const EIGTYPE* _tri, Index triStride, \\\n      EIGTYPE* _other, Index otherStride, level3_blocking<EIGTYPE,EIGTYPE>& /*blocking*/) \\\n  { \\\n   MKL_INT m = otherSize, n = size, lda, ldb; \\\n   char side = 'R', uplo, diag='N', transa; \\\n   /* Set alpha_ */ \\\n   MKLTYPE alpha; \\\n   EIGTYPE myone(1); \\\n   assign_scalar_eig2mkl(alpha, myone); \\\n   ldb = otherStride;\\\n\\\n   const EIGTYPE *a; \\\n/* Set trans */ \\\n   transa = (TriStorageOrder==RowMajor) ? ((Conjugate) ? 'C' : 'T') : 'N'; \\\n/* Set uplo */ \\\n   uplo = IsLower ? 'L' : 'U'; \\\n   if (TriStorageOrder==RowMajor) uplo = (uplo == 'L') ? 'U' : 'L'; \\\n/* Set a, lda */ \\\n   typedef Matrix<EIGTYPE, Dynamic, Dynamic, TriStorageOrder> MatrixTri; \\\n   Map<const MatrixTri, 0, OuterStride<> > tri(_tri,size,size,OuterStride<>(triStride)); \\\n   MatrixTri a_tmp; \\\n\\\n   if (conjA) { \\\n     a_tmp = tri.conjugate(); \\\n     a = a_tmp.data(); \\\n     lda = a_tmp.outerStride(); \\\n   } else { \\\n     a = _tri; \\\n     lda = triStride; \\\n   } \\\n   if (IsUnitDiag) diag='U'; \\\n/* call ?trsm*/ \\\n   MKLPREFIX##trsm(&side, &uplo, &transa, &diag, &m, &n, &alpha, (const MKLTYPE*)a, &lda, (MKLTYPE*)_other, &ldb); \\\n   /*std::cout << \"TRMS_L specialization!\\n\";*/ \\\n } \\\n};\n\nEIGEN_MKL_TRSM_R(double, double, d)\nEIGEN_MKL_TRSM_R(dcomplex, MKL_Complex16, z)\nEIGEN_MKL_TRSM_R(float, float, s)\nEIGEN_MKL_TRSM_R(scomplex, MKL_Complex8, c)\n\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_TRIANGULAR_SOLVER_MATRIX_MKL_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/products/TriangularSolverVector.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_TRIANGULAR_SOLVER_VECTOR_H\n#define EIGEN_TRIANGULAR_SOLVER_VECTOR_H\n\nnamespace Eigen { \n\nnamespace internal {\n\ntemplate<typename LhsScalar, typename RhsScalar, typename Index, int Mode, bool Conjugate, int StorageOrder>\nstruct triangular_solve_vector<LhsScalar, RhsScalar, Index, OnTheRight, Mode, Conjugate, StorageOrder>\n{\n  static void run(Index size, const LhsScalar* _lhs, Index lhsStride, RhsScalar* rhs)\n  {\n    triangular_solve_vector<LhsScalar,RhsScalar,Index,OnTheLeft,\n        ((Mode&Upper)==Upper ? Lower : Upper) | (Mode&UnitDiag),\n        Conjugate,StorageOrder==RowMajor?ColMajor:RowMajor\n      >::run(size, _lhs, lhsStride, rhs);\n  }\n};\n    \n// forward and backward substitution, row-major, rhs is a vector\ntemplate<typename LhsScalar, typename RhsScalar, typename Index, int Mode, bool Conjugate>\nstruct triangular_solve_vector<LhsScalar, RhsScalar, Index, OnTheLeft, Mode, Conjugate, RowMajor>\n{\n  enum {\n    IsLower = ((Mode&Lower)==Lower)\n  };\n  static void run(Index size, const LhsScalar* _lhs, Index lhsStride, RhsScalar* rhs)\n  {\n    typedef Map<const Matrix<LhsScalar,Dynamic,Dynamic,RowMajor>, 0, OuterStride<> > LhsMap;\n    const LhsMap lhs(_lhs,size,size,OuterStride<>(lhsStride));\n    typename internal::conditional<\n                          Conjugate,\n                          const CwiseUnaryOp<typename internal::scalar_conjugate_op<LhsScalar>,LhsMap>,\n                          const LhsMap&>\n                        ::type cjLhs(lhs);\n    static const Index PanelWidth = EIGEN_TUNE_TRIANGULAR_PANEL_WIDTH;\n    for(Index pi=IsLower ? 0 : size;\n        IsLower ? pi<size : pi>0;\n        IsLower ? pi+=PanelWidth : pi-=PanelWidth)\n    {\n      Index actualPanelWidth = (std::min)(IsLower ? size - pi : pi, PanelWidth);\n\n      Index r = IsLower ? pi : size - pi; // remaining size\n      if (r > 0)\n      {\n        // let's directly call the low level product function because:\n        // 1 - it is faster to compile\n        // 2 - it is slighlty faster at runtime\n        Index startRow = IsLower ? pi : pi-actualPanelWidth;\n        Index startCol = IsLower ? 0 : pi;\n\n        general_matrix_vector_product<Index,LhsScalar,RowMajor,Conjugate,RhsScalar,false>::run(\n          actualPanelWidth, r,\n          &lhs.coeffRef(startRow,startCol), lhsStride,\n          rhs + startCol, 1,\n          rhs + startRow, 1,\n          RhsScalar(-1));\n      }\n\n      for(Index k=0; k<actualPanelWidth; ++k)\n      {\n        Index i = IsLower ? pi+k : pi-k-1;\n        Index s = IsLower ? pi   : i+1;\n        if (k>0)\n          rhs[i] -= (cjLhs.row(i).segment(s,k).transpose().cwiseProduct(Map<const Matrix<RhsScalar,Dynamic,1> >(rhs+s,k))).sum();\n        \n        if(!(Mode & UnitDiag))\n          rhs[i] /= cjLhs(i,i);\n      }\n    }\n  }\n};\n\n// forward and backward substitution, column-major, rhs is a vector\ntemplate<typename LhsScalar, typename RhsScalar, typename Index, int Mode, bool Conjugate>\nstruct triangular_solve_vector<LhsScalar, RhsScalar, Index, OnTheLeft, Mode, Conjugate, ColMajor>\n{\n  enum {\n    IsLower = ((Mode&Lower)==Lower)\n  };\n  static void run(Index size, const LhsScalar* _lhs, Index lhsStride, RhsScalar* rhs)\n  {\n    typedef Map<const Matrix<LhsScalar,Dynamic,Dynamic,ColMajor>, 0, OuterStride<> > LhsMap;\n    const LhsMap lhs(_lhs,size,size,OuterStride<>(lhsStride));\n    typename internal::conditional<Conjugate,\n                                   const CwiseUnaryOp<typename internal::scalar_conjugate_op<LhsScalar>,LhsMap>,\n                                   const LhsMap&\n                                  >::type cjLhs(lhs);\n    static const Index PanelWidth = EIGEN_TUNE_TRIANGULAR_PANEL_WIDTH;\n\n    for(Index pi=IsLower ? 0 : size;\n        IsLower ? pi<size : pi>0;\n        IsLower ? pi+=PanelWidth : pi-=PanelWidth)\n    {\n      Index actualPanelWidth = (std::min)(IsLower ? size - pi : pi, PanelWidth);\n      Index startBlock = IsLower ? pi : pi-actualPanelWidth;\n      Index endBlock = IsLower ? pi + actualPanelWidth : 0;\n\n      for(Index k=0; k<actualPanelWidth; ++k)\n      {\n        Index i = IsLower ? pi+k : pi-k-1;\n        if(!(Mode & UnitDiag))\n          rhs[i] /= cjLhs.coeff(i,i);\n\n        Index r = actualPanelWidth - k - 1; // remaining size\n        Index s = IsLower ? i+1 : i-r;\n        if (r>0)\n          Map<Matrix<RhsScalar,Dynamic,1> >(rhs+s,r) -= rhs[i] * cjLhs.col(i).segment(s,r);\n      }\n      Index r = IsLower ? size - endBlock : startBlock; // remaining size\n      if (r > 0)\n      {\n        // let's directly call the low level product function because:\n        // 1 - it is faster to compile\n        // 2 - it is slighlty faster at runtime\n        general_matrix_vector_product<Index,LhsScalar,ColMajor,Conjugate,RhsScalar,false>::run(\n            r, actualPanelWidth,\n            &lhs.coeffRef(endBlock,startBlock), lhsStride,\n            rhs+startBlock, 1,\n            rhs+endBlock, 1, RhsScalar(-1));\n      }\n    }\n  }\n};\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_TRIANGULAR_SOLVER_VECTOR_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/util/BlasUtil.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_BLASUTIL_H\n#define EIGEN_BLASUTIL_H\n\n// This file contains many lightweight helper classes used to\n// implement and control fast level 2 and level 3 BLAS-like routines.\n\nnamespace Eigen {\n\nnamespace internal {\n\n// forward declarations\ntemplate<typename LhsScalar, typename RhsScalar, typename Index, int mr, int nr, bool ConjugateLhs=false, bool ConjugateRhs=false>\nstruct gebp_kernel;\n\ntemplate<typename Scalar, typename Index, int nr, int StorageOrder, bool Conjugate = false, bool PanelMode=false>\nstruct gemm_pack_rhs;\n\ntemplate<typename Scalar, typename Index, int Pack1, int Pack2, int StorageOrder, bool Conjugate = false, bool PanelMode = false>\nstruct gemm_pack_lhs;\n\ntemplate<\n  typename Index,\n  typename LhsScalar, int LhsStorageOrder, bool ConjugateLhs,\n  typename RhsScalar, int RhsStorageOrder, bool ConjugateRhs,\n  int ResStorageOrder>\nstruct general_matrix_matrix_product;\n\ntemplate<typename Index, typename LhsScalar, int LhsStorageOrder, bool ConjugateLhs, typename RhsScalar, bool ConjugateRhs, int Version=Specialized>\nstruct general_matrix_vector_product;\n\n\ntemplate<bool Conjugate> struct conj_if;\n\ntemplate<> struct conj_if<true> {\n  template<typename T>\n  inline T operator()(const T& x) { return numext::conj(x); }\n  template<typename T>\n  inline T pconj(const T& x) { return internal::pconj(x); }\n};\n\ntemplate<> struct conj_if<false> {\n  template<typename T>\n  inline const T& operator()(const T& x) { return x; }\n  template<typename T>\n  inline const T& pconj(const T& x) { return x; }\n};\n\ntemplate<typename Scalar> struct conj_helper<Scalar,Scalar,false,false>\n{\n  EIGEN_STRONG_INLINE Scalar pmadd(const Scalar& x, const Scalar& y, const Scalar& c) const { return internal::pmadd(x,y,c); }\n  EIGEN_STRONG_INLINE Scalar pmul(const Scalar& x, const Scalar& y) const { return internal::pmul(x,y); }\n};\n\ntemplate<typename RealScalar> struct conj_helper<std::complex<RealScalar>, std::complex<RealScalar>, false,true>\n{\n  typedef std::complex<RealScalar> Scalar;\n  EIGEN_STRONG_INLINE Scalar pmadd(const Scalar& x, const Scalar& y, const Scalar& c) const\n  { return c + pmul(x,y); }\n\n  EIGEN_STRONG_INLINE Scalar pmul(const Scalar& x, const Scalar& y) const\n  { return Scalar(numext::real(x)*numext::real(y) + numext::imag(x)*numext::imag(y), numext::imag(x)*numext::real(y) - numext::real(x)*numext::imag(y)); }\n};\n\ntemplate<typename RealScalar> struct conj_helper<std::complex<RealScalar>, std::complex<RealScalar>, true,false>\n{\n  typedef std::complex<RealScalar> Scalar;\n  EIGEN_STRONG_INLINE Scalar pmadd(const Scalar& x, const Scalar& y, const Scalar& c) const\n  { return c + pmul(x,y); }\n\n  EIGEN_STRONG_INLINE Scalar pmul(const Scalar& x, const Scalar& y) const\n  { return Scalar(numext::real(x)*numext::real(y) + numext::imag(x)*numext::imag(y), numext::real(x)*numext::imag(y) - numext::imag(x)*numext::real(y)); }\n};\n\ntemplate<typename RealScalar> struct conj_helper<std::complex<RealScalar>, std::complex<RealScalar>, true,true>\n{\n  typedef std::complex<RealScalar> Scalar;\n  EIGEN_STRONG_INLINE Scalar pmadd(const Scalar& x, const Scalar& y, const Scalar& c) const\n  { return c + pmul(x,y); }\n\n  EIGEN_STRONG_INLINE Scalar pmul(const Scalar& x, const Scalar& y) const\n  { return Scalar(numext::real(x)*numext::real(y) - numext::imag(x)*numext::imag(y), - numext::real(x)*numext::imag(y) - numext::imag(x)*numext::real(y)); }\n};\n\ntemplate<typename RealScalar,bool Conj> struct conj_helper<std::complex<RealScalar>, RealScalar, Conj,false>\n{\n  typedef std::complex<RealScalar> Scalar;\n  EIGEN_STRONG_INLINE Scalar pmadd(const Scalar& x, const RealScalar& y, const Scalar& c) const\n  { return padd(c, pmul(x,y)); }\n  EIGEN_STRONG_INLINE Scalar pmul(const Scalar& x, const RealScalar& y) const\n  { return conj_if<Conj>()(x)*y; }\n};\n\ntemplate<typename RealScalar,bool Conj> struct conj_helper<RealScalar, std::complex<RealScalar>, false,Conj>\n{\n  typedef std::complex<RealScalar> Scalar;\n  EIGEN_STRONG_INLINE Scalar pmadd(const RealScalar& x, const Scalar& y, const Scalar& c) const\n  { return padd(c, pmul(x,y)); }\n  EIGEN_STRONG_INLINE Scalar pmul(const RealScalar& x, const Scalar& y) const\n  { return x*conj_if<Conj>()(y); }\n};\n\ntemplate<typename From,typename To> struct get_factor {\n  static EIGEN_STRONG_INLINE To run(const From& x) { return x; }\n};\n\ntemplate<typename Scalar> struct get_factor<Scalar,typename NumTraits<Scalar>::Real> {\n  static EIGEN_STRONG_INLINE typename NumTraits<Scalar>::Real run(const Scalar& x) { return numext::real(x); }\n};\n\n// Lightweight helper class to access matrix coefficients.\n// Yes, this is somehow redundant with Map<>, but this version is much much lighter,\n// and so I hope better compilation performance (time and code quality).\ntemplate<typename Scalar, typename Index, int StorageOrder>\nclass blas_data_mapper\n{\n  public:\n    blas_data_mapper(Scalar* data, Index stride) : m_data(data), m_stride(stride) {}\n    EIGEN_STRONG_INLINE Scalar& operator()(Index i, Index j)\n    { return m_data[StorageOrder==RowMajor ? j + i*m_stride : i + j*m_stride]; }\n  protected:\n    Scalar* EIGEN_RESTRICT m_data;\n    Index m_stride;\n};\n\n// lightweight helper class to access matrix coefficients (const version)\ntemplate<typename Scalar, typename Index, int StorageOrder>\nclass const_blas_data_mapper\n{\n  public:\n    const_blas_data_mapper(const Scalar* data, Index stride) : m_data(data), m_stride(stride) {}\n    EIGEN_STRONG_INLINE const Scalar& operator()(Index i, Index j) const\n    { return m_data[StorageOrder==RowMajor ? j + i*m_stride : i + j*m_stride]; }\n  protected:\n    const Scalar* EIGEN_RESTRICT m_data;\n    Index m_stride;\n};\n\n\n/* Helper class to analyze the factors of a Product expression.\n * In particular it allows to pop out operator-, scalar multiples,\n * and conjugate */\ntemplate<typename XprType> struct blas_traits\n{\n  typedef typename traits<XprType>::Scalar Scalar;\n  typedef const XprType& ExtractType;\n  typedef XprType _ExtractType;\n  enum {\n    IsComplex = NumTraits<Scalar>::IsComplex,\n    IsTransposed = false,\n    NeedToConjugate = false,\n    HasUsableDirectAccess = (    (int(XprType::Flags)&DirectAccessBit)\n                              && (   bool(XprType::IsVectorAtCompileTime)\n                                  || int(inner_stride_at_compile_time<XprType>::ret) == 1)\n                             ) ?  1 : 0\n  };\n  typedef typename conditional<bool(HasUsableDirectAccess),\n    ExtractType,\n    typename _ExtractType::PlainObject\n    >::type DirectLinearAccessType;\n  static inline ExtractType extract(const XprType& x) { return x; }\n  static inline const Scalar extractScalarFactor(const XprType&) { return Scalar(1); }\n};\n\n// pop conjugate\ntemplate<typename Scalar, typename Xpr>\nstruct blas_traits<CwiseUnaryOp<scalar_conjugate_op<Scalar>, Xpr> >\n : blas_traits<typename internal::remove_all<typename Xpr::Nested>::type>\n{\n  typedef typename internal::remove_all<typename Xpr::Nested>::type NestedXpr;\n  typedef blas_traits<NestedXpr> Base;\n  typedef CwiseUnaryOp<scalar_conjugate_op<Scalar>, Xpr> XprType;\n  typedef typename Base::ExtractType ExtractType;\n\n  enum {\n    IsComplex = NumTraits<Scalar>::IsComplex,\n    NeedToConjugate = Base::NeedToConjugate ? 0 : IsComplex\n  };\n  static inline ExtractType extract(const XprType& x) { return Base::extract(x.nestedExpression()); }\n  static inline Scalar extractScalarFactor(const XprType& x) { return conj(Base::extractScalarFactor(x.nestedExpression())); }\n};\n\n// pop scalar multiple\ntemplate<typename Scalar, typename Xpr>\nstruct blas_traits<CwiseUnaryOp<scalar_multiple_op<Scalar>, Xpr> >\n : blas_traits<typename internal::remove_all<typename Xpr::Nested>::type>\n{\n  typedef typename internal::remove_all<typename Xpr::Nested>::type NestedXpr;\n  typedef blas_traits<NestedXpr> Base;\n  typedef CwiseUnaryOp<scalar_multiple_op<Scalar>, Xpr> XprType;\n  typedef typename Base::ExtractType ExtractType;\n  static inline ExtractType extract(const XprType& x) { return Base::extract(x.nestedExpression()); }\n  static inline Scalar extractScalarFactor(const XprType& x)\n  { return x.functor().m_other * Base::extractScalarFactor(x.nestedExpression()); }\n};\n\n// pop opposite\ntemplate<typename Scalar, typename Xpr>\nstruct blas_traits<CwiseUnaryOp<scalar_opposite_op<Scalar>, Xpr> >\n : blas_traits<typename internal::remove_all<typename Xpr::Nested>::type>\n{\n  typedef typename internal::remove_all<typename Xpr::Nested>::type NestedXpr;\n  typedef blas_traits<NestedXpr> Base;\n  typedef CwiseUnaryOp<scalar_opposite_op<Scalar>, Xpr> XprType;\n  typedef typename Base::ExtractType ExtractType;\n  static inline ExtractType extract(const XprType& x) { return Base::extract(x.nestedExpression()); }\n  static inline Scalar extractScalarFactor(const XprType& x)\n  { return - Base::extractScalarFactor(x.nestedExpression()); }\n};\n\n// pop/push transpose\ntemplate<typename Xpr>\nstruct blas_traits<Transpose<Xpr> >\n : blas_traits<typename internal::remove_all<typename Xpr::Nested>::type>\n{\n  typedef typename internal::remove_all<typename Xpr::Nested>::type NestedXpr;\n  typedef typename NestedXpr::Scalar Scalar;\n  typedef blas_traits<NestedXpr> Base;\n  typedef Transpose<Xpr> XprType;\n  typedef Transpose<const typename Base::_ExtractType>  ExtractType; // const to get rid of a compile error; anyway blas traits are only used on the RHS\n  typedef Transpose<const typename Base::_ExtractType> _ExtractType;\n  typedef typename conditional<bool(Base::HasUsableDirectAccess),\n    ExtractType,\n    typename ExtractType::PlainObject\n    >::type DirectLinearAccessType;\n  enum {\n    IsTransposed = Base::IsTransposed ? 0 : 1\n  };\n  static inline ExtractType extract(const XprType& x) { return Base::extract(x.nestedExpression()); }\n  static inline Scalar extractScalarFactor(const XprType& x) { return Base::extractScalarFactor(x.nestedExpression()); }\n};\n\ntemplate<typename T>\nstruct blas_traits<const T>\n     : blas_traits<T>\n{};\n\ntemplate<typename T, bool HasUsableDirectAccess=blas_traits<T>::HasUsableDirectAccess>\nstruct extract_data_selector {\n  static const typename T::Scalar* run(const T& m)\n  {\n    return blas_traits<T>::extract(m).data();\n  }\n};\n\ntemplate<typename T>\nstruct extract_data_selector<T,false> {\n  static typename T::Scalar* run(const T&) { return 0; }\n};\n\ntemplate<typename T> const typename T::Scalar* extract_data(const T& m)\n{\n  return extract_data_selector<T>::run(m);\n}\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_BLASUTIL_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/util/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_Core_util_SRCS \"*.h\")\n\nINSTALL(FILES \n  ${Eigen_Core_util_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/Core/util COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/util/Constants.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2007-2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_CONSTANTS_H\n#define EIGEN_CONSTANTS_H\n\nnamespace Eigen {\n\n/** This value means that a positive quantity (e.g., a size) is not known at compile-time, and that instead the value is\n  * stored in some runtime variable.\n  *\n  * Changing the value of Dynamic breaks the ABI, as Dynamic is often used as a template parameter for Matrix.\n  */\nconst int Dynamic = -1;\n\n/** This value means that a signed quantity (e.g., a signed index) is not known at compile-time, and that instead its value\n  * has to be specified at runtime.\n  */\nconst int DynamicIndex = 0xffffff;\n\n/** This value means +Infinity; it is currently used only as the p parameter to MatrixBase::lpNorm<int>().\n  * The value Infinity there means the L-infinity norm.\n  */\nconst int Infinity = -1;\n\n/** \\defgroup flags Flags\n  * \\ingroup Core_Module\n  *\n  * These are the possible bits which can be OR'ed to constitute the flags of a matrix or\n  * expression.\n  *\n  * It is important to note that these flags are a purely compile-time notion. They are a compile-time property of\n  * an expression type, implemented as enum's. They are not stored in memory at runtime, and they do not incur any\n  * runtime overhead.\n  *\n  * \\sa MatrixBase::Flags\n  */\n\n/** \\ingroup flags\n  *\n  * for a matrix, this means that the storage order is row-major.\n  * If this bit is not set, the storage order is column-major.\n  * For an expression, this determines the storage order of\n  * the matrix created by evaluation of that expression. \n  * \\sa \\ref TopicStorageOrders */\nconst unsigned int RowMajorBit = 0x1;\n\n/** \\ingroup flags\n  *\n  * means the expression should be evaluated by the calling expression */\nconst unsigned int EvalBeforeNestingBit = 0x2;\n\n/** \\ingroup flags\n  *\n  * means the expression should be evaluated before any assignment */\nconst unsigned int EvalBeforeAssigningBit = 0x4;\n\n/** \\ingroup flags\n  *\n  * Short version: means the expression might be vectorized\n  *\n  * Long version: means that the coefficients can be handled by packets\n  * and start at a memory location whose alignment meets the requirements\n  * of the present CPU architecture for optimized packet access. In the fixed-size\n  * case, there is the additional condition that it be possible to access all the\n  * coefficients by packets (this implies the requirement that the size be a multiple of 16 bytes,\n  * and that any nontrivial strides don't break the alignment). In the dynamic-size case,\n  * there is no such condition on the total size and strides, so it might not be possible to access\n  * all coeffs by packets.\n  *\n  * \\note This bit can be set regardless of whether vectorization is actually enabled.\n  *       To check for actual vectorizability, see \\a ActualPacketAccessBit.\n  */\nconst unsigned int PacketAccessBit = 0x8;\n\n#ifdef EIGEN_VECTORIZE\n/** \\ingroup flags\n  *\n  * If vectorization is enabled (EIGEN_VECTORIZE is defined) this constant\n  * is set to the value \\a PacketAccessBit.\n  *\n  * If vectorization is not enabled (EIGEN_VECTORIZE is not defined) this constant\n  * is set to the value 0.\n  */\nconst unsigned int ActualPacketAccessBit = PacketAccessBit;\n#else\nconst unsigned int ActualPacketAccessBit = 0x0;\n#endif\n\n/** \\ingroup flags\n  *\n  * Short version: means the expression can be seen as 1D vector.\n  *\n  * Long version: means that one can access the coefficients\n  * of this expression by coeff(int), and coeffRef(int) in the case of a lvalue expression. These\n  * index-based access methods are guaranteed\n  * to not have to do any runtime computation of a (row, col)-pair from the index, so that it\n  * is guaranteed that whenever it is available, index-based access is at least as fast as\n  * (row,col)-based access. Expressions for which that isn't possible don't have the LinearAccessBit.\n  *\n  * If both PacketAccessBit and LinearAccessBit are set, then the\n  * packets of this expression can be accessed by packet(int), and writePacket(int) in the case of a\n  * lvalue expression.\n  *\n  * Typically, all vector expressions have the LinearAccessBit, but there is one exception:\n  * Product expressions don't have it, because it would be troublesome for vectorization, even when the\n  * Product is a vector expression. Thus, vector Product expressions allow index-based coefficient access but\n  * not index-based packet access, so they don't have the LinearAccessBit.\n  */\nconst unsigned int LinearAccessBit = 0x10;\n\n/** \\ingroup flags\n  *\n  * Means the expression has a coeffRef() method, i.e. is writable as its individual coefficients are directly addressable.\n  * This rules out read-only expressions.\n  *\n  * Note that DirectAccessBit and LvalueBit are mutually orthogonal, as there are examples of expression having one but note\n  * the other:\n  *   \\li writable expressions that don't have a very simple memory layout as a strided array, have LvalueBit but not DirectAccessBit\n  *   \\li Map-to-const expressions, for example Map<const Matrix>, have DirectAccessBit but not LvalueBit\n  *\n  * Expressions having LvalueBit also have their coeff() method returning a const reference instead of returning a new value.\n  */\nconst unsigned int LvalueBit = 0x20;\n\n/** \\ingroup flags\n  *\n  * Means that the underlying array of coefficients can be directly accessed as a plain strided array. The memory layout\n  * of the array of coefficients must be exactly the natural one suggested by rows(), cols(),\n  * outerStride(), innerStride(), and the RowMajorBit. This rules out expressions such as Diagonal, whose coefficients,\n  * though referencable, do not have such a regular memory layout.\n  *\n  * See the comment on LvalueBit for an explanation of how LvalueBit and DirectAccessBit are mutually orthogonal.\n  */\nconst unsigned int DirectAccessBit = 0x40;\n\n/** \\ingroup flags\n  *\n  * means the first coefficient packet is guaranteed to be aligned */\nconst unsigned int AlignedBit = 0x80;\n\nconst unsigned int NestByRefBit = 0x100;\n\n// list of flags that are inherited by default\nconst unsigned int HereditaryBits = RowMajorBit\n                                  | EvalBeforeNestingBit\n                                  | EvalBeforeAssigningBit;\n\n/** \\defgroup enums Enumerations\n  * \\ingroup Core_Module\n  *\n  * Various enumerations used in %Eigen. Many of these are used as template parameters.\n  */\n\n/** \\ingroup enums\n  * Enum containing possible values for the \\p Mode parameter of \n  * MatrixBase::selfadjointView() and MatrixBase::triangularView(). */\nenum UpLoType {\n  /** View matrix as a lower triangular matrix. */\n  Lower=0x1,                      \n  /** View matrix as an upper triangular matrix. */\n  Upper=0x2,                      \n  /** %Matrix has ones on the diagonal; to be used in combination with #Lower or #Upper. */\n  UnitDiag=0x4, \n  /** %Matrix has zeros on the diagonal; to be used in combination with #Lower or #Upper. */\n  ZeroDiag=0x8,\n  /** View matrix as a lower triangular matrix with ones on the diagonal. */\n  UnitLower=UnitDiag|Lower, \n  /** View matrix as an upper triangular matrix with ones on the diagonal. */\n  UnitUpper=UnitDiag|Upper,\n  /** View matrix as a lower triangular matrix with zeros on the diagonal. */\n  StrictlyLower=ZeroDiag|Lower, \n  /** View matrix as an upper triangular matrix with zeros on the diagonal. */\n  StrictlyUpper=ZeroDiag|Upper,\n  /** Used in BandMatrix and SelfAdjointView to indicate that the matrix is self-adjoint. */\n  SelfAdjoint=0x10,\n  /** Used to support symmetric, non-selfadjoint, complex matrices. */\n  Symmetric=0x20\n};\n\n/** \\ingroup enums\n  * Enum for indicating whether an object is aligned or not. */\nenum AlignmentType {\n  /** Object is not correctly aligned for vectorization. */\n  Unaligned=0, \n  /** Object is aligned for vectorization. */\n  Aligned=1 \n};\n\n/** \\ingroup enums\n * Enum used by DenseBase::corner() in Eigen2 compatibility mode. */\n// FIXME after the corner() API change, this was not needed anymore, except by AlignedBox\n// TODO: find out what to do with that. Adapt the AlignedBox API ?\nenum CornerType { TopLeft, TopRight, BottomLeft, BottomRight };\n\n/** \\ingroup enums\n  * Enum containing possible values for the \\p Direction parameter of\n  * Reverse, PartialReduxExpr and VectorwiseOp. */\nenum DirectionType { \n  /** For Reverse, all columns are reversed; \n    * for PartialReduxExpr and VectorwiseOp, act on columns. */\n  Vertical, \n  /** For Reverse, all rows are reversed; \n    * for PartialReduxExpr and VectorwiseOp, act on rows. */\n  Horizontal, \n  /** For Reverse, both rows and columns are reversed; \n    * not used for PartialReduxExpr and VectorwiseOp. */\n  BothDirections \n};\n\n/** \\internal \\ingroup enums\n  * Enum to specify how to traverse the entries of a matrix. */\nenum TraversalType {\n  /** \\internal Default traversal, no vectorization, no index-based access */\n  DefaultTraversal,\n  /** \\internal No vectorization, use index-based access to have only one for loop instead of 2 nested loops */\n  LinearTraversal,\n  /** \\internal Equivalent to a slice vectorization for fixed-size matrices having good alignment\n    * and good size */\n  InnerVectorizedTraversal,\n  /** \\internal Vectorization path using a single loop plus scalar loops for the\n    * unaligned boundaries */\n  LinearVectorizedTraversal,\n  /** \\internal Generic vectorization path using one vectorized loop per row/column with some\n    * scalar loops to handle the unaligned boundaries */\n  SliceVectorizedTraversal,\n  /** \\internal Special case to properly handle incompatible scalar types or other defecting cases*/\n  InvalidTraversal,\n  /** \\internal Evaluate all entries at once */\n  AllAtOnceTraversal\n};\n\n/** \\internal \\ingroup enums\n  * Enum to specify whether to unroll loops when traversing over the entries of a matrix. */\nenum UnrollingType {\n  /** \\internal Do not unroll loops. */\n  NoUnrolling,\n  /** \\internal Unroll only the inner loop, but not the outer loop. */\n  InnerUnrolling,\n  /** \\internal Unroll both the inner and the outer loop. If there is only one loop, \n    * because linear traversal is used, then unroll that loop. */\n  CompleteUnrolling\n};\n\n/** \\internal \\ingroup enums\n  * Enum to specify whether to use the default (built-in) implementation or the specialization. */\nenum SpecializedType {\n  Specialized,\n  BuiltIn\n};\n\n/** \\ingroup enums\n  * Enum containing possible values for the \\p _Options template parameter of\n  * Matrix, Array and BandMatrix. */\nenum StorageOptions {\n  /** Storage order is column major (see \\ref TopicStorageOrders). */\n  ColMajor = 0,\n  /** Storage order is row major (see \\ref TopicStorageOrders). */\n  RowMajor = 0x1,  // it is only a coincidence that this is equal to RowMajorBit -- don't rely on that\n  /** Align the matrix itself if it is vectorizable fixed-size */\n  AutoAlign = 0,\n  /** Don't require alignment for the matrix itself (the array of coefficients, if dynamically allocated, may still be requested to be aligned) */ // FIXME --- clarify the situation\n  DontAlign = 0x2\n};\n\n/** \\ingroup enums\n  * Enum for specifying whether to apply or solve on the left or right. */\nenum SideType {\n  /** Apply transformation on the left. */\n  OnTheLeft = 1,  \n  /** Apply transformation on the right. */\n  OnTheRight = 2  \n};\n\n/* the following used to be written as:\n *\n *   struct NoChange_t {};\n *   namespace {\n *     EIGEN_UNUSED NoChange_t NoChange;\n *   }\n *\n * on the ground that it feels dangerous to disambiguate overloaded functions on enum/integer types.  \n * However, this leads to \"variable declared but never referenced\" warnings on Intel Composer XE,\n * and we do not know how to get rid of them (bug 450).\n */\n\nenum NoChange_t   { NoChange };\nenum Sequential_t { Sequential };\nenum Default_t    { Default };\n\n/** \\internal \\ingroup enums\n  * Used in AmbiVector. */\nenum {\n  IsDense         = 0,\n  IsSparse\n};\n\n/** \\ingroup enums\n  * Used as template parameter in DenseCoeffBase and MapBase to indicate \n  * which accessors should be provided. */\nenum AccessorLevels {\n  /** Read-only access via a member function. */\n  ReadOnlyAccessors, \n  /** Read/write access via member functions. */\n  WriteAccessors, \n  /** Direct read-only access to the coefficients. */\n  DirectAccessors, \n  /** Direct read/write access to the coefficients. */\n  DirectWriteAccessors\n};\n\n/** \\ingroup enums\n  * Enum with options to give to various decompositions. */\nenum DecompositionOptions {\n  /** \\internal Not used (meant for LDLT?). */\n  Pivoting            = 0x01, \n  /** \\internal Not used (meant for LDLT?). */\n  NoPivoting          = 0x02, \n  /** Used in JacobiSVD to indicate that the square matrix U is to be computed. */\n  ComputeFullU        = 0x04,\n  /** Used in JacobiSVD to indicate that the thin matrix U is to be computed. */\n  ComputeThinU        = 0x08,\n  /** Used in JacobiSVD to indicate that the square matrix V is to be computed. */\n  ComputeFullV        = 0x10,\n  /** Used in JacobiSVD to indicate that the thin matrix V is to be computed. */\n  ComputeThinV        = 0x20,\n  /** Used in SelfAdjointEigenSolver and GeneralizedSelfAdjointEigenSolver to specify\n    * that only the eigenvalues are to be computed and not the eigenvectors. */\n  EigenvaluesOnly     = 0x40,\n  /** Used in SelfAdjointEigenSolver and GeneralizedSelfAdjointEigenSolver to specify\n    * that both the eigenvalues and the eigenvectors are to be computed. */\n  ComputeEigenvectors = 0x80,\n  /** \\internal */\n  EigVecMask = EigenvaluesOnly | ComputeEigenvectors,\n  /** Used in GeneralizedSelfAdjointEigenSolver to indicate that it should\n    * solve the generalized eigenproblem \\f$ Ax = \\lambda B x \\f$. */\n  Ax_lBx              = 0x100,\n  /** Used in GeneralizedSelfAdjointEigenSolver to indicate that it should\n    * solve the generalized eigenproblem \\f$ ABx = \\lambda x \\f$. */\n  ABx_lx              = 0x200,\n  /** Used in GeneralizedSelfAdjointEigenSolver to indicate that it should\n    * solve the generalized eigenproblem \\f$ BAx = \\lambda x \\f$. */\n  BAx_lx              = 0x400,\n  /** \\internal */\n  GenEigMask = Ax_lBx | ABx_lx | BAx_lx\n};\n\n/** \\ingroup enums\n  * Possible values for the \\p QRPreconditioner template parameter of JacobiSVD. */\nenum QRPreconditioners {\n  /** Do not specify what is to be done if the SVD of a non-square matrix is asked for. */\n  NoQRPreconditioner,\n  /** Use a QR decomposition without pivoting as the first step. */\n  HouseholderQRPreconditioner,\n  /** Use a QR decomposition with column pivoting as the first step. */\n  ColPivHouseholderQRPreconditioner,\n  /** Use a QR decomposition with full pivoting as the first step. */\n  FullPivHouseholderQRPreconditioner\n};\n\n#ifdef Success\n#error The preprocessor symbol 'Success' is defined, possibly by the X11 header file X.h\n#endif\n\n/** \\ingroup enums\n  * Enum for reporting the status of a computation. */\nenum ComputationInfo {\n  /** Computation was successful. */\n  Success = 0,        \n  /** The provided data did not satisfy the prerequisites. */\n  NumericalIssue = 1, \n  /** Iterative procedure did not converge. */\n  NoConvergence = 2,\n  /** The inputs are invalid, or the algorithm has been improperly called.\n    * When assertions are enabled, such errors trigger an assert. */\n  InvalidInput = 3\n};\n\n/** \\ingroup enums\n  * Enum used to specify how a particular transformation is stored in a matrix.\n  * \\sa Transform, Hyperplane::transform(). */\nenum TransformTraits {\n  /** Transformation is an isometry. */\n  Isometry      = 0x1,\n  /** Transformation is an affine transformation stored as a (Dim+1)^2 matrix whose last row is \n    * assumed to be [0 ... 0 1]. */\n  Affine        = 0x2,\n  /** Transformation is an affine transformation stored as a (Dim) x (Dim+1) matrix. */\n  AffineCompact = 0x10 | Affine,\n  /** Transformation is a general projective transformation stored as a (Dim+1)^2 matrix. */\n  Projective    = 0x20\n};\n\n/** \\internal \\ingroup enums\n  * Enum used to choose between implementation depending on the computer architecture. */\nnamespace Architecture\n{\n  enum Type {\n    Generic = 0x0,\n    SSE = 0x1,\n    AltiVec = 0x2,\n#if defined EIGEN_VECTORIZE_SSE\n    Target = SSE\n#elif defined EIGEN_VECTORIZE_ALTIVEC\n    Target = AltiVec\n#else\n    Target = Generic\n#endif\n  };\n}\n\n/** \\internal \\ingroup enums\n  * Enum used as template parameter in GeneralProduct. */\nenum ProductImplType { CoeffBasedProductMode, LazyCoeffBasedProductMode, OuterProduct, InnerProduct, GemvProduct, GemmProduct };\n\n/** \\internal \\ingroup enums\n  * Enum used in experimental parallel implementation. */\nenum Action {GetAction, SetAction};\n\n/** The type used to identify a dense storage. */\nstruct Dense {};\n\n/** The type used to identify a matrix expression */\nstruct MatrixXpr {};\n\n/** The type used to identify an array expression */\nstruct ArrayXpr {};\n\nnamespace internal {\n  /** \\internal\n  * Constants for comparison functors\n  */\n  enum ComparisonName {\n    cmp_EQ = 0,\n    cmp_LT = 1,\n    cmp_LE = 2,\n    cmp_UNORD = 3,\n    cmp_NEQ = 4\n  };\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_CONSTANTS_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/util/DisableStupidWarnings.h",
    "content": "#ifndef EIGEN_WARNINGS_DISABLED\n#define EIGEN_WARNINGS_DISABLED\n\n#ifdef _MSC_VER\n  // 4100 - unreferenced formal parameter (occurred e.g. in aligned_allocator::destroy(pointer p))\n  // 4101 - unreferenced local variable\n  // 4127 - conditional expression is constant\n  // 4181 - qualifier applied to reference type ignored\n  // 4211 - nonstandard extension used : redefined extern to static\n  // 4244 - 'argument' : conversion from 'type1' to 'type2', possible loss of data\n  // 4273 - QtAlignedMalloc, inconsistent DLL linkage\n  // 4324 - structure was padded due to declspec(align())\n  // 4512 - assignment operator could not be generated\n  // 4522 - 'class' : multiple assignment operators specified\n  // 4700 - uninitialized local variable 'xyz' used\n  // 4717 - 'function' : recursive on all control paths, function will cause runtime stack overflow\n  #ifndef EIGEN_PERMANENTLY_DISABLE_STUPID_WARNINGS\n    #pragma warning( push )\n  #endif\n  #pragma warning( disable : 4100 4101 4127 4181 4211 4244 4273 4324 4512 4522 4700 4717 )\n#elif defined __INTEL_COMPILER\n  // 2196 - routine is both \"inline\" and \"noinline\" (\"noinline\" assumed)\n  //        ICC 12 generates this warning even without any inline keyword, when defining class methods 'inline' i.e. inside of class body\n  //        typedef that may be a reference type.\n  // 279  - controlling expression is constant\n  //        ICC 12 generates this warning on assert(constant_expression_depending_on_template_params) and frankly this is a legitimate use case.\n  #ifndef EIGEN_PERMANENTLY_DISABLE_STUPID_WARNINGS\n    #pragma warning push\n  #endif\n  #pragma warning disable 2196 279\n#elif defined __clang__\n  // -Wconstant-logical-operand - warning: use of logical && with constant operand; switch to bitwise & or remove constant\n  //     this is really a stupid warning as it warns on compile-time expressions involving enums\n  #ifndef EIGEN_PERMANENTLY_DISABLE_STUPID_WARNINGS\n    #pragma clang diagnostic push\n  #endif\n  #pragma clang diagnostic ignored \"-Wconstant-logical-operand\"\n\n#elif defined __GNUC__ && __GNUC__>=6\n\n  #ifndef EIGEN_PERMANENTLY_DISABLE_STUPID_WARNINGS\n    #pragma GCC diagnostic push\n  #endif\n  #pragma GCC diagnostic ignored \"-Wignored-attributes\"\n\n#endif\n\n#endif // not EIGEN_WARNINGS_DISABLED\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/util/ForwardDeclarations.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2007-2010 Benoit Jacob <jacob.benoit.1@gmail.com>\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_FORWARDDECLARATIONS_H\n#define EIGEN_FORWARDDECLARATIONS_H\n\nnamespace Eigen {\nnamespace internal {\n\ntemplate<typename T> struct traits;\n\n// here we say once and for all that traits<const T> == traits<T>\n// When constness must affect traits, it has to be constness on template parameters on which T itself depends.\n// For example, traits<Map<const T> > != traits<Map<T> >, but\n//              traits<const Map<T> > == traits<Map<T> >\ntemplate<typename T> struct traits<const T> : traits<T> {};\n\ntemplate<typename Derived> struct has_direct_access\n{\n  enum { ret = (traits<Derived>::Flags & DirectAccessBit) ? 1 : 0 };\n};\n\ntemplate<typename Derived> struct accessors_level\n{\n  enum { has_direct_access = (traits<Derived>::Flags & DirectAccessBit) ? 1 : 0,\n         has_write_access = (traits<Derived>::Flags & LvalueBit) ? 1 : 0,\n         value = has_direct_access ? (has_write_access ? DirectWriteAccessors : DirectAccessors)\n                                   : (has_write_access ? WriteAccessors       : ReadOnlyAccessors)\n  };\n};\n\n} // end namespace internal\n\ntemplate<typename T> struct NumTraits;\n\ntemplate<typename Derived> struct EigenBase;\ntemplate<typename Derived> class DenseBase;\ntemplate<typename Derived> class PlainObjectBase;\n\n\ntemplate<typename Derived,\n         int Level = internal::accessors_level<Derived>::value >\nclass DenseCoeffsBase;\n\ntemplate<typename _Scalar, int _Rows, int _Cols,\n         int _Options = AutoAlign |\n#if defined(__GNUC__) && __GNUC__==3 && __GNUC_MINOR__==4\n    // workaround a bug in at least gcc 3.4.6\n    // the innermost ?: ternary operator is misparsed. We write it slightly\n    // differently and this makes gcc 3.4.6 happy, but it's ugly.\n    // The error would only show up with EIGEN_DEFAULT_TO_ROW_MAJOR is defined\n    // (when EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION is RowMajor)\n                          ( (_Rows==1 && _Cols!=1) ? RowMajor\n                          : !(_Cols==1 && _Rows!=1) ?  EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION\n                          : ColMajor ),\n#else\n                          ( (_Rows==1 && _Cols!=1) ? RowMajor\n                          : (_Cols==1 && _Rows!=1) ? ColMajor\n                          : EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION ),\n#endif\n         int _MaxRows = _Rows,\n         int _MaxCols = _Cols\n> class Matrix;\n\ntemplate<typename Derived> class MatrixBase;\ntemplate<typename Derived> class ArrayBase;\n\ntemplate<typename ExpressionType, unsigned int Added, unsigned int Removed> class Flagged;\ntemplate<typename ExpressionType, template <typename> class StorageBase > class NoAlias;\ntemplate<typename ExpressionType> class NestByValue;\ntemplate<typename ExpressionType> class ForceAlignedAccess;\ntemplate<typename ExpressionType> class SwapWrapper;\n\ntemplate<typename XprType, int BlockRows=Dynamic, int BlockCols=Dynamic, bool InnerPanel = false> class Block;\n\ntemplate<typename MatrixType, int Size=Dynamic> class VectorBlock;\ntemplate<typename MatrixType> class Transpose;\ntemplate<typename MatrixType> class Conjugate;\ntemplate<typename NullaryOp, typename MatrixType>         class CwiseNullaryOp;\ntemplate<typename UnaryOp,   typename MatrixType>         class CwiseUnaryOp;\ntemplate<typename ViewOp,    typename MatrixType>         class CwiseUnaryView;\ntemplate<typename BinaryOp,  typename Lhs, typename Rhs>  class CwiseBinaryOp;\ntemplate<typename BinOp,     typename Lhs, typename Rhs>  class SelfCwiseBinaryOp;\ntemplate<typename Derived,   typename Lhs, typename Rhs>  class ProductBase;\ntemplate<typename Lhs, typename Rhs, int Mode>            class GeneralProduct;\ntemplate<typename Lhs, typename Rhs, int NestingFlags>    class CoeffBasedProduct;\n\ntemplate<typename Derived> class DiagonalBase;\ntemplate<typename _DiagonalVectorType> class DiagonalWrapper;\ntemplate<typename _Scalar, int SizeAtCompileTime, int MaxSizeAtCompileTime=SizeAtCompileTime> class DiagonalMatrix;\ntemplate<typename MatrixType, typename DiagonalType, int ProductOrder> class DiagonalProduct;\ntemplate<typename MatrixType, int Index = 0> class Diagonal;\ntemplate<int SizeAtCompileTime, int MaxSizeAtCompileTime = SizeAtCompileTime, typename IndexType=int> class PermutationMatrix;\ntemplate<int SizeAtCompileTime, int MaxSizeAtCompileTime = SizeAtCompileTime, typename IndexType=int> class Transpositions;\ntemplate<typename Derived> class PermutationBase;\ntemplate<typename Derived> class TranspositionsBase;\ntemplate<typename _IndicesType> class PermutationWrapper;\ntemplate<typename _IndicesType> class TranspositionsWrapper;\n\ntemplate<typename Derived,\n         int Level = internal::accessors_level<Derived>::has_write_access ? WriteAccessors : ReadOnlyAccessors\n> class MapBase;\ntemplate<int InnerStrideAtCompileTime, int OuterStrideAtCompileTime> class Stride;\ntemplate<typename MatrixType, int MapOptions=Unaligned, typename StrideType = Stride<0,0> > class Map;\n\ntemplate<typename Derived> class TriangularBase;\ntemplate<typename MatrixType, unsigned int Mode> class TriangularView;\ntemplate<typename MatrixType, unsigned int Mode> class SelfAdjointView;\ntemplate<typename MatrixType> class SparseView;\ntemplate<typename ExpressionType> class WithFormat;\ntemplate<typename MatrixType> struct CommaInitializer;\ntemplate<typename Derived> class ReturnByValue;\ntemplate<typename ExpressionType> class ArrayWrapper;\ntemplate<typename ExpressionType> class MatrixWrapper;\n\nnamespace internal {\ntemplate<typename DecompositionType, typename Rhs> struct solve_retval_base;\ntemplate<typename DecompositionType, typename Rhs> struct solve_retval;\ntemplate<typename DecompositionType> struct kernel_retval_base;\ntemplate<typename DecompositionType> struct kernel_retval;\ntemplate<typename DecompositionType> struct image_retval_base;\ntemplate<typename DecompositionType> struct image_retval;\n} // end namespace internal\n\nnamespace internal {\ntemplate<typename _Scalar, int Rows=Dynamic, int Cols=Dynamic, int Supers=Dynamic, int Subs=Dynamic, int Options=0> class BandMatrix;\n}\n\nnamespace internal {\ntemplate<typename Lhs, typename Rhs> struct product_type;\n}\n\ntemplate<typename Lhs, typename Rhs,\n         int ProductType = internal::product_type<Lhs,Rhs>::value>\nstruct ProductReturnType;\n\n// this is a workaround for sun CC\ntemplate<typename Lhs, typename Rhs> struct LazyProductReturnType;\n\nnamespace internal {\n\n// Provides scalar/packet-wise product and product with accumulation\n// with optional conjugation of the arguments.\ntemplate<typename LhsScalar, typename RhsScalar, bool ConjLhs=false, bool ConjRhs=false> struct conj_helper;\n\ntemplate<typename Scalar> struct scalar_sum_op;\ntemplate<typename Scalar> struct scalar_difference_op;\ntemplate<typename LhsScalar,typename RhsScalar> struct scalar_conj_product_op;\ntemplate<typename Scalar> struct scalar_opposite_op;\ntemplate<typename Scalar> struct scalar_conjugate_op;\ntemplate<typename Scalar> struct scalar_real_op;\ntemplate<typename Scalar> struct scalar_imag_op;\ntemplate<typename Scalar> struct scalar_abs_op;\ntemplate<typename Scalar> struct scalar_abs2_op;\ntemplate<typename Scalar> struct scalar_sqrt_op;\ntemplate<typename Scalar> struct scalar_exp_op;\ntemplate<typename Scalar> struct scalar_log_op;\ntemplate<typename Scalar> struct scalar_cos_op;\ntemplate<typename Scalar> struct scalar_sin_op;\ntemplate<typename Scalar> struct scalar_acos_op;\ntemplate<typename Scalar> struct scalar_asin_op;\ntemplate<typename Scalar> struct scalar_tan_op;\ntemplate<typename Scalar> struct scalar_pow_op;\ntemplate<typename Scalar> struct scalar_inverse_op;\ntemplate<typename Scalar> struct scalar_square_op;\ntemplate<typename Scalar> struct scalar_cube_op;\ntemplate<typename Scalar, typename NewType> struct scalar_cast_op;\ntemplate<typename Scalar> struct scalar_multiple_op;\ntemplate<typename Scalar> struct scalar_quotient1_op;\ntemplate<typename Scalar> struct scalar_min_op;\ntemplate<typename Scalar> struct scalar_max_op;\ntemplate<typename Scalar> struct scalar_random_op;\ntemplate<typename Scalar> struct scalar_add_op;\ntemplate<typename Scalar> struct scalar_constant_op;\ntemplate<typename Scalar> struct scalar_identity_op;\n\ntemplate<typename LhsScalar,typename RhsScalar=LhsScalar> struct scalar_product_op;\ntemplate<typename LhsScalar,typename RhsScalar> struct scalar_multiple2_op;\ntemplate<typename LhsScalar,typename RhsScalar=LhsScalar> struct scalar_quotient_op;\n\n} // end namespace internal\n\nstruct IOFormat;\n\n// Array module\ntemplate<typename _Scalar, int _Rows, int _Cols,\n         int _Options = AutoAlign |\n#if defined(__GNUC__) && __GNUC__==3 && __GNUC_MINOR__==4\n    // workaround a bug in at least gcc 3.4.6\n    // the innermost ?: ternary operator is misparsed. We write it slightly\n    // differently and this makes gcc 3.4.6 happy, but it's ugly.\n    // The error would only show up with EIGEN_DEFAULT_TO_ROW_MAJOR is defined\n    // (when EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION is RowMajor)\n                          ( (_Rows==1 && _Cols!=1) ? RowMajor\n                          : !(_Cols==1 && _Rows!=1) ?  EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION\n                          : ColMajor ),\n#else\n                          ( (_Rows==1 && _Cols!=1) ? RowMajor\n                          : (_Cols==1 && _Rows!=1) ? ColMajor\n                          : EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION ),\n#endif\n         int _MaxRows = _Rows, int _MaxCols = _Cols> class Array;\ntemplate<typename ConditionMatrixType, typename ThenMatrixType, typename ElseMatrixType> class Select;\ntemplate<typename MatrixType, typename BinaryOp, int Direction> class PartialReduxExpr;\ntemplate<typename ExpressionType, int Direction> class VectorwiseOp;\ntemplate<typename MatrixType,int RowFactor,int ColFactor> class Replicate;\ntemplate<typename MatrixType, int Direction = BothDirections> class Reverse;\n\ntemplate<typename MatrixType> class FullPivLU;\ntemplate<typename MatrixType> class PartialPivLU;\nnamespace internal {\ntemplate<typename MatrixType> struct inverse_impl;\n}\ntemplate<typename MatrixType> class HouseholderQR;\ntemplate<typename MatrixType> class ColPivHouseholderQR;\ntemplate<typename MatrixType> class FullPivHouseholderQR;\ntemplate<typename MatrixType, int QRPreconditioner = ColPivHouseholderQRPreconditioner> class JacobiSVD;\ntemplate<typename MatrixType, int UpLo = Lower> class LLT;\ntemplate<typename MatrixType, int UpLo = Lower> class LDLT;\ntemplate<typename VectorsType, typename CoeffsType, int Side=OnTheLeft> class HouseholderSequence;\ntemplate<typename Scalar>     class JacobiRotation;\n\n// Geometry module:\ntemplate<typename Derived, int _Dim> class RotationBase;\ntemplate<typename Lhs, typename Rhs> class Cross;\ntemplate<typename Derived> class QuaternionBase;\ntemplate<typename Scalar> class Rotation2D;\ntemplate<typename Scalar> class AngleAxis;\ntemplate<typename Scalar,int Dim> class Translation;\n\n// Sparse module:\ntemplate<typename Derived> class SparseMatrixBase;\n\n#ifdef EIGEN2_SUPPORT\ntemplate<typename Derived, int _Dim> class eigen2_RotationBase;\ntemplate<typename Lhs, typename Rhs> class eigen2_Cross;\ntemplate<typename Scalar> class eigen2_Quaternion;\ntemplate<typename Scalar> class eigen2_Rotation2D;\ntemplate<typename Scalar> class eigen2_AngleAxis;\ntemplate<typename Scalar,int Dim> class eigen2_Transform;\ntemplate <typename _Scalar, int _AmbientDim> class eigen2_ParametrizedLine;\ntemplate <typename _Scalar, int _AmbientDim> class eigen2_Hyperplane;\ntemplate<typename Scalar,int Dim> class eigen2_Translation;\ntemplate<typename Scalar,int Dim> class eigen2_Scaling;\n#endif\n\n#if EIGEN2_SUPPORT_STAGE < STAGE20_RESOLVE_API_CONFLICTS\ntemplate<typename Scalar> class Quaternion;\ntemplate<typename Scalar,int Dim> class Transform;\ntemplate <typename _Scalar, int _AmbientDim> class ParametrizedLine;\ntemplate <typename _Scalar, int _AmbientDim> class Hyperplane;\ntemplate<typename Scalar,int Dim> class Scaling;\n#endif\n\n#if EIGEN2_SUPPORT_STAGE > STAGE20_RESOLVE_API_CONFLICTS\ntemplate<typename Scalar, int Options = AutoAlign> class Quaternion;\ntemplate<typename Scalar,int Dim,int Mode,int _Options=AutoAlign> class Transform;\ntemplate <typename _Scalar, int _AmbientDim, int Options=AutoAlign> class ParametrizedLine;\ntemplate <typename _Scalar, int _AmbientDim, int Options=AutoAlign> class Hyperplane;\ntemplate<typename Scalar> class UniformScaling;\ntemplate<typename MatrixType,int Direction> class Homogeneous;\n#endif\n\n// MatrixFunctions module\ntemplate<typename Derived> struct MatrixExponentialReturnValue;\ntemplate<typename Derived> class MatrixFunctionReturnValue;\ntemplate<typename Derived> class MatrixSquareRootReturnValue;\ntemplate<typename Derived> class MatrixLogarithmReturnValue;\ntemplate<typename Derived> class MatrixPowerReturnValue;\ntemplate<typename Derived, typename Lhs, typename Rhs> class MatrixPowerProduct;\n\nnamespace internal {\ntemplate <typename Scalar>\nstruct stem_function\n{\n  typedef std::complex<typename NumTraits<Scalar>::Real> ComplexScalar;\n  typedef ComplexScalar type(ComplexScalar, int);\n};\n}\n\n\n#ifdef EIGEN2_SUPPORT\ntemplate<typename ExpressionType> class Cwise;\ntemplate<typename MatrixType> class Minor;\ntemplate<typename MatrixType> class LU;\ntemplate<typename MatrixType> class QR;\ntemplate<typename MatrixType> class SVD;\nnamespace internal {\ntemplate<typename MatrixType, unsigned int Mode> struct eigen2_part_return_type;\n}\n#endif\n\n} // end namespace Eigen\n\n#endif // EIGEN_FORWARDDECLARATIONS_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/util/MKL_support.h",
    "content": "/*\n Copyright (c) 2011, Intel Corporation. All rights reserved.\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n * Neither the name of Intel Corporation nor the names of its contributors may\n   be used to endorse or promote products derived from this software without\n   specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\n ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n ********************************************************************************\n *   Content : Eigen bindings to Intel(R) MKL\n *   Include file with common MKL declarations\n ********************************************************************************\n*/\n\n#ifndef EIGEN_MKL_SUPPORT_H\n#define EIGEN_MKL_SUPPORT_H\n\n#ifdef EIGEN_USE_MKL_ALL\n  #ifndef EIGEN_USE_BLAS\n    #define EIGEN_USE_BLAS\n  #endif\n  #ifndef EIGEN_USE_LAPACKE\n    #define EIGEN_USE_LAPACKE\n  #endif\n  #ifndef EIGEN_USE_MKL_VML\n    #define EIGEN_USE_MKL_VML\n  #endif\n#endif\n\n#ifdef EIGEN_USE_LAPACKE_STRICT\n  #define EIGEN_USE_LAPACKE\n#endif\n\n#if defined(EIGEN_USE_BLAS) || defined(EIGEN_USE_LAPACKE) || defined(EIGEN_USE_MKL_VML)\n  #define EIGEN_USE_MKL\n#endif\n\n#if defined EIGEN_USE_MKL\n#   include <mkl.h> \n/*Check IMKL version for compatibility: < 10.3 is not usable with Eigen*/\n#   ifndef INTEL_MKL_VERSION\n#       undef EIGEN_USE_MKL /* INTEL_MKL_VERSION is not even defined on older versions */\n#   elif INTEL_MKL_VERSION < 100305    /* the intel-mkl-103-release-notes say this was when the lapacke.h interface was added*/\n#       undef EIGEN_USE_MKL\n#   endif\n#   ifndef EIGEN_USE_MKL\n    /*If the MKL version is too old, undef everything*/\n#       undef   EIGEN_USE_MKL_ALL\n#       undef   EIGEN_USE_BLAS\n#       undef   EIGEN_USE_LAPACKE\n#       undef   EIGEN_USE_MKL_VML\n#       undef   EIGEN_USE_LAPACKE_STRICT\n#       undef   EIGEN_USE_LAPACKE\n#   endif\n#endif\n\n#if defined EIGEN_USE_MKL\n#include <mkl_lapacke.h>\n#define EIGEN_MKL_VML_THRESHOLD 128\n\n/* MKL_DOMAIN_BLAS, etc are defined only in 10.3 update 7 */\n/* MKL_BLAS, etc are not defined in 11.2 */\n#ifdef MKL_DOMAIN_ALL\n#define EIGEN_MKL_DOMAIN_ALL MKL_DOMAIN_ALL\n#else\n#define EIGEN_MKL_DOMAIN_ALL MKL_ALL\n#endif\n\n#ifdef MKL_DOMAIN_BLAS\n#define EIGEN_MKL_DOMAIN_BLAS MKL_DOMAIN_BLAS\n#else\n#define EIGEN_MKL_DOMAIN_BLAS MKL_BLAS\n#endif\n\n#ifdef MKL_DOMAIN_FFT\n#define EIGEN_MKL_DOMAIN_FFT MKL_DOMAIN_FFT\n#else\n#define EIGEN_MKL_DOMAIN_FFT MKL_FFT\n#endif\n\n#ifdef MKL_DOMAIN_VML\n#define EIGEN_MKL_DOMAIN_VML MKL_DOMAIN_VML\n#else\n#define EIGEN_MKL_DOMAIN_VML MKL_VML\n#endif\n\n#ifdef MKL_DOMAIN_PARDISO\n#define EIGEN_MKL_DOMAIN_PARDISO MKL_DOMAIN_PARDISO\n#else\n#define EIGEN_MKL_DOMAIN_PARDISO MKL_PARDISO\n#endif\n\nnamespace Eigen {\n\ntypedef std::complex<double> dcomplex;\ntypedef std::complex<float>  scomplex;\n\nnamespace internal {\n\ntemplate<typename MKLType, typename EigenType>\nstatic inline void assign_scalar_eig2mkl(MKLType& mklScalar, const EigenType& eigenScalar) {\n  mklScalar=eigenScalar;\n}\n\ntemplate<typename MKLType, typename EigenType>\nstatic inline void assign_conj_scalar_eig2mkl(MKLType& mklScalar, const EigenType& eigenScalar) {\n  mklScalar=eigenScalar;\n}\n\ntemplate <>\ninline void assign_scalar_eig2mkl<MKL_Complex16,dcomplex>(MKL_Complex16& mklScalar, const dcomplex& eigenScalar) {\n  mklScalar.real=eigenScalar.real();\n  mklScalar.imag=eigenScalar.imag();\n}\n\ntemplate <>\ninline void assign_scalar_eig2mkl<MKL_Complex8,scomplex>(MKL_Complex8& mklScalar, const scomplex& eigenScalar) {\n  mklScalar.real=eigenScalar.real();\n  mklScalar.imag=eigenScalar.imag();\n}\n\ntemplate <>\ninline void assign_conj_scalar_eig2mkl<MKL_Complex16,dcomplex>(MKL_Complex16& mklScalar, const dcomplex& eigenScalar) {\n  mklScalar.real=eigenScalar.real();\n  mklScalar.imag=-eigenScalar.imag();\n}\n\ntemplate <>\ninline void assign_conj_scalar_eig2mkl<MKL_Complex8,scomplex>(MKL_Complex8& mklScalar, const scomplex& eigenScalar) {\n  mklScalar.real=eigenScalar.real();\n  mklScalar.imag=-eigenScalar.imag();\n}\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif\n\n#endif // EIGEN_MKL_SUPPORT_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/util/Macros.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_MACROS_H\n#define EIGEN_MACROS_H\n\n#define EIGEN_WORLD_VERSION 3\n#define EIGEN_MAJOR_VERSION 2\n#define EIGEN_MINOR_VERSION 9\n\n#define EIGEN_VERSION_AT_LEAST(x,y,z) (EIGEN_WORLD_VERSION>x || (EIGEN_WORLD_VERSION>=x && \\\n                                      (EIGEN_MAJOR_VERSION>y || (EIGEN_MAJOR_VERSION>=y && \\\n                                                                 EIGEN_MINOR_VERSION>=z))))\n\n\n// Compiler identification, EIGEN_COMP_*\n\n/// \\internal EIGEN_COMP_GNUC set to 1 for all compilers compatible with GCC\n#ifdef __GNUC__\n  #define EIGEN_COMP_GNUC 1\n#else\n  #define EIGEN_COMP_GNUC 0\n#endif\n\n/// \\internal EIGEN_COMP_CLANG set to 1 if the compiler is clang (alias for __clang__)\n#if defined(__clang__)\n  #define EIGEN_COMP_CLANG 1\n#else\n  #define EIGEN_COMP_CLANG 0\n#endif\n\n\n/// \\internal EIGEN_COMP_LLVM set to 1 if the compiler backend is llvm\n#if defined(__llvm__)\n  #define EIGEN_COMP_LLVM 1\n#else\n  #define EIGEN_COMP_LLVM 0\n#endif\n\n/// \\internal EIGEN_COMP_ICC set to __INTEL_COMPILER if the compiler is Intel compiler, 0 otherwise\n#if defined(__INTEL_COMPILER)\n  #define EIGEN_COMP_ICC __INTEL_COMPILER\n#else\n  #define EIGEN_COMP_ICC 0\n#endif\n\n/// \\internal EIGEN_COMP_MINGW set to 1 if the compiler is mingw\n#if defined(__MINGW32__)\n  #define EIGEN_COMP_MINGW 1\n#else\n  #define EIGEN_COMP_MINGW 0\n#endif\n\n/// \\internal EIGEN_COMP_SUNCC set to 1 if the compiler is Solaris Studio\n#if defined(__SUNPRO_CC)\n  #define EIGEN_COMP_SUNCC 1\n#else\n  #define EIGEN_COMP_SUNCC 0\n#endif\n\n/// \\internal EIGEN_COMP_MSVC set to _MSC_VER if the compiler is Microsoft Visual C++, 0 otherwise.\n#if defined(_MSC_VER)\n  #define EIGEN_COMP_MSVC _MSC_VER\n#else\n  #define EIGEN_COMP_MSVC 0\n#endif\n\n/// \\internal EIGEN_COMP_MSVC_STRICT set to 1 if the compiler is really Microsoft Visual C++ and not ,e.g., ICC\n#if EIGEN_COMP_MSVC && !(EIGEN_COMP_ICC)\n  #define EIGEN_COMP_MSVC_STRICT _MSC_VER\n#else\n  #define EIGEN_COMP_MSVC_STRICT 0\n#endif\n\n/// \\internal EIGEN_COMP_IBM set to 1 if the compiler is IBM XL C++\n#if defined(__IBMCPP__) || defined(__xlc__)\n  #define EIGEN_COMP_IBM 1\n#else\n  #define EIGEN_COMP_IBM 0\n#endif\n\n/// \\internal EIGEN_COMP_PGI set to 1 if the compiler is Portland Group Compiler\n#if defined(__PGI)\n  #define EIGEN_COMP_PGI 1\n#else\n  #define EIGEN_COMP_PGI 0\n#endif\n\n/// \\internal EIGEN_COMP_ARM set to 1 if the compiler is ARM Compiler\n#if defined(__CC_ARM) || defined(__ARMCC_VERSION)\n  #define EIGEN_COMP_ARM 1\n#else\n  #define EIGEN_COMP_ARM 0\n#endif\n\n\n/// \\internal EIGEN_GNUC_STRICT set to 1 if the compiler is really GCC and not a compatible compiler (e.g., ICC, clang, mingw, etc.)\n#if EIGEN_COMP_GNUC && !(EIGEN_COMP_CLANG || EIGEN_COMP_ICC || EIGEN_COMP_MINGW || EIGEN_COMP_PGI || EIGEN_COMP_IBM || EIGEN_COMP_ARM )\n  #define EIGEN_COMP_GNUC_STRICT 1\n#else\n  #define EIGEN_COMP_GNUC_STRICT 0\n#endif\n\n\n#if EIGEN_COMP_GNUC\n  #define EIGEN_GNUC_AT_LEAST(x,y) ((__GNUC__==x && __GNUC_MINOR__>=y) || __GNUC__>x)\n  #define EIGEN_GNUC_AT_MOST(x,y)  ((__GNUC__==x && __GNUC_MINOR__<=y) || __GNUC__<x)\n  #define EIGEN_GNUC_AT(x,y)       ( __GNUC__==x && __GNUC_MINOR__==y )\n#else\n  #define EIGEN_GNUC_AT_LEAST(x,y) 0\n  #define EIGEN_GNUC_AT_MOST(x,y)  0\n  #define EIGEN_GNUC_AT(x,y)       0\n#endif\n\n// FIXME: could probably be removed as we do not support gcc 3.x anymore\n#if EIGEN_COMP_GNUC && (__GNUC__ <= 3)\n#define EIGEN_GCC3_OR_OLDER 1\n#else\n#define EIGEN_GCC3_OR_OLDER 0\n#endif\n\n\n// Architecture identification, EIGEN_ARCH_*\n\n#if defined(__x86_64__) || defined(_M_X64) || defined(__amd64)\n  #define EIGEN_ARCH_x86_64 1\n#else\n  #define EIGEN_ARCH_x86_64 0\n#endif\n\n#if defined(__i386__) || defined(_M_IX86) || defined(_X86_) || defined(__i386)\n  #define EIGEN_ARCH_i386 1\n#else\n  #define EIGEN_ARCH_i386 0\n#endif\n\n#if EIGEN_ARCH_x86_64 || EIGEN_ARCH_i386\n  #define EIGEN_ARCH_i386_OR_x86_64 1\n#else\n  #define EIGEN_ARCH_i386_OR_x86_64 0\n#endif\n\n/// \\internal EIGEN_ARCH_ARM set to 1 if the architecture is ARM\n#if defined(__arm__)\n  #define EIGEN_ARCH_ARM 1\n#else\n  #define EIGEN_ARCH_ARM 0\n#endif\n\n/// \\internal EIGEN_ARCH_ARM64 set to 1 if the architecture is ARM64\n#if defined(__aarch64__)\n  #define EIGEN_ARCH_ARM64 1\n#else\n  #define EIGEN_ARCH_ARM64 0\n#endif\n\n#if EIGEN_ARCH_ARM || EIGEN_ARCH_ARM64\n  #define EIGEN_ARCH_ARM_OR_ARM64 1\n#else\n  #define EIGEN_ARCH_ARM_OR_ARM64 0\n#endif\n\n/// \\internal EIGEN_ARCH_MIPS set to 1 if the architecture is MIPS\n#if defined(__mips__) || defined(__mips)\n  #define EIGEN_ARCH_MIPS 1\n#else\n  #define EIGEN_ARCH_MIPS 0\n#endif\n\n/// \\internal EIGEN_ARCH_SPARC set to 1 if the architecture is SPARC\n#if defined(__sparc__) || defined(__sparc)\n  #define EIGEN_ARCH_SPARC 1\n#else\n  #define EIGEN_ARCH_SPARC 0\n#endif\n\n/// \\internal EIGEN_ARCH_IA64 set to 1 if the architecture is Intel Itanium\n#if defined(__ia64__)\n  #define EIGEN_ARCH_IA64 1\n#else\n  #define EIGEN_ARCH_IA64 0\n#endif\n\n/// \\internal EIGEN_ARCH_PPC set to 1 if the architecture is PowerPC\n#if defined(__powerpc__) || defined(__ppc__) || defined(_M_PPC)\n  #define EIGEN_ARCH_PPC 1\n#else\n  #define EIGEN_ARCH_PPC 0\n#endif\n\n\n\n// Operating system identification, EIGEN_OS_*\n\n/// \\internal EIGEN_OS_UNIX set to 1 if the OS is a unix variant\n#if defined(__unix__) || defined(__unix)\n  #define EIGEN_OS_UNIX 1\n#else\n  #define EIGEN_OS_UNIX 0\n#endif\n\n/// \\internal EIGEN_OS_LINUX set to 1 if the OS is based on Linux kernel\n#if defined(__linux__)\n  #define EIGEN_OS_LINUX 1\n#else\n  #define EIGEN_OS_LINUX 0\n#endif\n\n/// \\internal EIGEN_OS_ANDROID set to 1 if the OS is Android\n// note: ANDROID is defined when using ndk_build, __ANDROID__ is defined when using a standalone toolchain.\n#if defined(__ANDROID__) || defined(ANDROID)\n  #define EIGEN_OS_ANDROID 1\n#else\n  #define EIGEN_OS_ANDROID 0\n#endif\n\n/// \\internal EIGEN_OS_GNULINUX set to 1 if the OS is GNU Linux and not Linux-based OS (e.g., not android)\n#if defined(__gnu_linux__) && !(EIGEN_OS_ANDROID)\n  #define EIGEN_OS_GNULINUX 1\n#else\n  #define EIGEN_OS_GNULINUX 0\n#endif\n\n/// \\internal EIGEN_OS_BSD set to 1 if the OS is a BSD variant\n#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__DragonFly__)\n  #define EIGEN_OS_BSD 1\n#else\n  #define EIGEN_OS_BSD 0\n#endif\n\n/// \\internal EIGEN_OS_MAC set to 1 if the OS is MacOS\n#if defined(__APPLE__)\n  #define EIGEN_OS_MAC 1\n#else\n  #define EIGEN_OS_MAC 0\n#endif\n\n/// \\internal EIGEN_OS_QNX set to 1 if the OS is QNX\n#if defined(__QNX__)\n  #define EIGEN_OS_QNX 1\n#else\n  #define EIGEN_OS_QNX 0\n#endif\n\n/// \\internal EIGEN_OS_WIN set to 1 if the OS is Windows based\n#if defined(_WIN32)\n  #define EIGEN_OS_WIN 1\n#else\n  #define EIGEN_OS_WIN 0\n#endif\n\n/// \\internal EIGEN_OS_WIN64 set to 1 if the OS is Windows 64bits\n#if defined(_WIN64)\n  #define EIGEN_OS_WIN64 1\n#else\n  #define EIGEN_OS_WIN64 0\n#endif\n\n/// \\internal EIGEN_OS_WINCE set to 1 if the OS is Windows CE\n#if defined(_WIN32_WCE)\n  #define EIGEN_OS_WINCE 1\n#else\n  #define EIGEN_OS_WINCE 0\n#endif\n\n/// \\internal EIGEN_OS_CYGWIN set to 1 if the OS is Windows/Cygwin\n#if defined(__CYGWIN__)\n  #define EIGEN_OS_CYGWIN 1\n#else\n  #define EIGEN_OS_CYGWIN 0\n#endif\n\n/// \\internal EIGEN_OS_WIN_STRICT set to 1 if the OS is really Windows and not some variants\n#if EIGEN_OS_WIN && !( EIGEN_OS_WINCE || EIGEN_OS_CYGWIN )\n  #define EIGEN_OS_WIN_STRICT 1\n#else\n  #define EIGEN_OS_WIN_STRICT 0\n#endif\n\n/// \\internal EIGEN_OS_SUN set to 1 if the OS is SUN\n#if (defined(sun) || defined(__sun)) && !(defined(__SVR4) || defined(__svr4__))\n  #define EIGEN_OS_SUN 1\n#else\n  #define EIGEN_OS_SUN 0\n#endif\n\n/// \\internal EIGEN_OS_SOLARIS set to 1 if the OS is Solaris\n#if (defined(sun) || defined(__sun)) && (defined(__SVR4) || defined(__svr4__))\n  #define EIGEN_OS_SOLARIS 1\n#else\n  #define EIGEN_OS_SOLARIS 0\n#endif\n\n\n#if EIGEN_GNUC_AT_MOST(4,3) && !defined(__clang__)\n  // see bug 89\n  #define EIGEN_SAFE_TO_USE_STANDARD_ASSERT_MACRO 0\n#else\n  #define EIGEN_SAFE_TO_USE_STANDARD_ASSERT_MACRO 1\n#endif\n\n// 16 byte alignment is only useful for vectorization. Since it affects the ABI, we need to enable\n// 16 byte alignment on all platforms where vectorization might be enabled. In theory we could always\n// enable alignment, but it can be a cause of problems on some platforms, so we just disable it in\n// certain common platform (compiler+architecture combinations) to avoid these problems.\n// Only static alignment is really problematic (relies on nonstandard compiler extensions that don't\n// work everywhere, for example don't work on GCC/ARM), try to keep heap alignment even\n// when we have to disable static alignment.\n#if defined(__GNUC__) && !(defined(__i386__) || defined(__x86_64__) || defined(__powerpc__) || defined(__ppc__) || defined(__ia64__))\n#define EIGEN_GCC_AND_ARCH_DOESNT_WANT_STACK_ALIGNMENT 1\n#else\n#define EIGEN_GCC_AND_ARCH_DOESNT_WANT_STACK_ALIGNMENT 0\n#endif\n\n// static alignment is completely disabled with GCC 3, Sun Studio, and QCC/QNX\n#if !EIGEN_GCC_AND_ARCH_DOESNT_WANT_STACK_ALIGNMENT \\\n && !EIGEN_GCC3_OR_OLDER \\\n && !defined(__SUNPRO_CC) \\\n && !defined(__QNXNTO__)\n  #define EIGEN_ARCH_WANTS_STACK_ALIGNMENT 1\n#else\n  #define EIGEN_ARCH_WANTS_STACK_ALIGNMENT 0\n#endif\n\n#ifdef EIGEN_DONT_ALIGN\n  #ifndef EIGEN_DONT_ALIGN_STATICALLY\n    #define EIGEN_DONT_ALIGN_STATICALLY\n  #endif\n  #define EIGEN_ALIGN 0\n#else\n  #define EIGEN_ALIGN 1\n#endif\n\n// EIGEN_ALIGN_STATICALLY is the true test whether we want to align arrays on the stack or not. It takes into account both the user choice to explicitly disable\n// alignment (EIGEN_DONT_ALIGN_STATICALLY) and the architecture config (EIGEN_ARCH_WANTS_STACK_ALIGNMENT). Henceforth, only EIGEN_ALIGN_STATICALLY should be used.\n#if EIGEN_ARCH_WANTS_STACK_ALIGNMENT && !defined(EIGEN_DONT_ALIGN_STATICALLY)\n  #define EIGEN_ALIGN_STATICALLY 1\n#else\n  #define EIGEN_ALIGN_STATICALLY 0\n  #ifndef EIGEN_DISABLE_UNALIGNED_ARRAY_ASSERT\n    #define EIGEN_DISABLE_UNALIGNED_ARRAY_ASSERT\n  #endif\n#endif\n\n#ifdef EIGEN_DEFAULT_TO_ROW_MAJOR\n#define EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION RowMajor\n#else\n#define EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION ColMajor\n#endif\n\n#ifndef EIGEN_DEFAULT_DENSE_INDEX_TYPE\n#define EIGEN_DEFAULT_DENSE_INDEX_TYPE std::ptrdiff_t\n#endif\n\n// A Clang feature extension to determine compiler features.\n// We use it to determine 'cxx_rvalue_references'\n#ifndef __has_feature\n# define __has_feature(x) 0\n#endif\n\n// Do we support r-value references?\n#if (__has_feature(cxx_rvalue_references) || \\\n     (defined(__cplusplus) && __cplusplus >= 201103L) || \\\n     (defined(_MSC_VER) && _MSC_VER >= 1600))\n  #define EIGEN_HAVE_RVALUE_REFERENCES\n#endif\n\n\n// Cross compiler wrapper around LLVM's __has_builtin\n#ifdef __has_builtin\n#  define EIGEN_HAS_BUILTIN(x) __has_builtin(x)\n#else\n#  define EIGEN_HAS_BUILTIN(x) 0\n#endif\n\n/** Allows to disable some optimizations which might affect the accuracy of the result.\n  * Such optimization are enabled by default, and set EIGEN_FAST_MATH to 0 to disable them.\n  * They currently include:\n  *   - single precision Cwise::sin() and Cwise::cos() when SSE vectorization is enabled.\n  */\n#ifndef EIGEN_FAST_MATH\n#define EIGEN_FAST_MATH 1\n#endif\n\n#define EIGEN_DEBUG_VAR(x) std::cerr << #x << \" = \" << x << std::endl;\n\n// concatenate two tokens\n#define EIGEN_CAT2(a,b) a ## b\n#define EIGEN_CAT(a,b) EIGEN_CAT2(a,b)\n\n// convert a token to a string\n#define EIGEN_MAKESTRING2(a) #a\n#define EIGEN_MAKESTRING(a) EIGEN_MAKESTRING2(a)\n\n// EIGEN_STRONG_INLINE is a stronger version of the inline, using __forceinline on MSVC,\n// but it still doesn't use GCC's always_inline. This is useful in (common) situations where MSVC needs forceinline\n// but GCC is still doing fine with just inline.\n#if (defined _MSC_VER) || (defined __INTEL_COMPILER)\n#define EIGEN_STRONG_INLINE __forceinline\n#else\n#define EIGEN_STRONG_INLINE inline\n#endif\n\n// EIGEN_ALWAYS_INLINE is the stronget, it has the effect of making the function inline and adding every possible\n// attribute to maximize inlining. This should only be used when really necessary: in particular,\n// it uses __attribute__((always_inline)) on GCC, which most of the time is useless and can severely harm compile times.\n// FIXME with the always_inline attribute,\n// gcc 3.4.x reports the following compilation error:\n//   Eval.h:91: sorry, unimplemented: inlining failed in call to 'const Eigen::Eval<Derived> Eigen::MatrixBase<Scalar, Derived>::eval() const'\n//    : function body not available\n#if EIGEN_GNUC_AT_LEAST(4,0)\n#define EIGEN_ALWAYS_INLINE __attribute__((always_inline)) inline\n#else\n#define EIGEN_ALWAYS_INLINE EIGEN_STRONG_INLINE\n#endif\n\n#if (defined __GNUC__)\n#define EIGEN_DONT_INLINE __attribute__((noinline))\n#elif (defined _MSC_VER)\n#define EIGEN_DONT_INLINE __declspec(noinline)\n#else\n#define EIGEN_DONT_INLINE\n#endif\n\n#if (defined __GNUC__)\n#define EIGEN_PERMISSIVE_EXPR __extension__\n#else\n#define EIGEN_PERMISSIVE_EXPR\n#endif\n\n// this macro allows to get rid of linking errors about multiply defined functions.\n//  - static is not very good because it prevents definitions from different object files to be merged.\n//           So static causes the resulting linked executable to be bloated with multiple copies of the same function.\n//  - inline is not perfect either as it unwantedly hints the compiler toward inlining the function.\n#define EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS\n#define EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS inline\n\n#ifdef NDEBUG\n# ifndef EIGEN_NO_DEBUG\n#  define EIGEN_NO_DEBUG\n# endif\n#endif\n\n// eigen_plain_assert is where we implement the workaround for the assert() bug in GCC <= 4.3, see bug 89\n#ifdef EIGEN_NO_DEBUG\n  #define eigen_plain_assert(x)\n#else\n  #if EIGEN_SAFE_TO_USE_STANDARD_ASSERT_MACRO\n    namespace Eigen {\n    namespace internal {\n    inline bool copy_bool(bool b) { return b; }\n    }\n    }\n    #define eigen_plain_assert(x) assert(x)\n  #else\n    // work around bug 89\n    #include <cstdlib>   // for abort\n    #include <iostream>  // for std::cerr\n\n    namespace Eigen {\n    namespace internal {\n    // trivial function copying a bool. Must be EIGEN_DONT_INLINE, so we implement it after including Eigen headers.\n    // see bug 89.\n    namespace {\n    EIGEN_DONT_INLINE bool copy_bool(bool b) { return b; }\n    }\n    inline void assert_fail(const char *condition, const char *function, const char *file, int line)\n    {\n      std::cerr << \"assertion failed: \" << condition << \" in function \" << function << \" at \" << file << \":\" << line << std::endl;\n      abort();\n    }\n    }\n    }\n    #define eigen_plain_assert(x) \\\n      do { \\\n        if(!Eigen::internal::copy_bool(x)) \\\n          Eigen::internal::assert_fail(EIGEN_MAKESTRING(x), __PRETTY_FUNCTION__, __FILE__, __LINE__); \\\n      } while(false)\n  #endif\n#endif\n\n// eigen_assert can be overridden\n#ifndef eigen_assert\n#define eigen_assert(x) eigen_plain_assert(x)\n#endif\n\n#ifdef EIGEN_INTERNAL_DEBUGGING\n#define eigen_internal_assert(x) eigen_assert(x)\n#else\n#define eigen_internal_assert(x)\n#endif\n\n#ifdef EIGEN_NO_DEBUG\n#define EIGEN_ONLY_USED_FOR_DEBUG(x) (void)x\n#else\n#define EIGEN_ONLY_USED_FOR_DEBUG(x)\n#endif\n\n#ifndef EIGEN_NO_DEPRECATED_WARNING\n  #if (defined __GNUC__)\n    #define EIGEN_DEPRECATED __attribute__((deprecated))\n  #elif (defined _MSC_VER)\n    #define EIGEN_DEPRECATED __declspec(deprecated)\n  #else\n    #define EIGEN_DEPRECATED\n  #endif\n#else\n  #define EIGEN_DEPRECATED\n#endif\n\n#if (defined __GNUC__)\n#define EIGEN_UNUSED __attribute__((unused))\n#else\n#define EIGEN_UNUSED\n#endif\n\n// Suppresses 'unused variable' warnings.\nnamespace Eigen {\n  namespace internal {\n    template<typename T> void ignore_unused_variable(const T&) {}\n  }\n}\n#define EIGEN_UNUSED_VARIABLE(var) Eigen::internal::ignore_unused_variable(var);\n\n#if !defined(EIGEN_ASM_COMMENT)\n  #if (defined __GNUC__) && ( defined(__i386__) || defined(__x86_64__) )\n    #define EIGEN_ASM_COMMENT(X)  __asm__(\"#\" X)\n  #else\n    #define EIGEN_ASM_COMMENT(X)\n  #endif\n#endif\n\n/* EIGEN_ALIGN_TO_BOUNDARY(n) forces data to be n-byte aligned. This is used to satisfy SIMD requirements.\n * However, we do that EVEN if vectorization (EIGEN_VECTORIZE) is disabled,\n * so that vectorization doesn't affect binary compatibility.\n *\n * If we made alignment depend on whether or not EIGEN_VECTORIZE is defined, it would be impossible to link\n * vectorized and non-vectorized code.\n */\n#if (defined __GNUC__) || (defined __PGI) || (defined __IBMCPP__) || (defined __ARMCC_VERSION)\n  #define EIGEN_ALIGN_TO_BOUNDARY(n) __attribute__((aligned(n)))\n#elif (defined _MSC_VER)\n  #define EIGEN_ALIGN_TO_BOUNDARY(n) __declspec(align(n))\n#elif (defined __SUNPRO_CC)\n  // FIXME not sure about this one:\n  #define EIGEN_ALIGN_TO_BOUNDARY(n) __attribute__((aligned(n)))\n#else\n  #error Please tell me what is the equivalent of __attribute__((aligned(n))) for your compiler\n#endif\n\n#define EIGEN_ALIGN8  EIGEN_ALIGN_TO_BOUNDARY(8)\n#define EIGEN_ALIGN16 EIGEN_ALIGN_TO_BOUNDARY(16)\n\n#if EIGEN_ALIGN_STATICALLY\n#define EIGEN_USER_ALIGN_TO_BOUNDARY(n) EIGEN_ALIGN_TO_BOUNDARY(n)\n#define EIGEN_USER_ALIGN16 EIGEN_ALIGN16\n#else\n#define EIGEN_USER_ALIGN_TO_BOUNDARY(n)\n#define EIGEN_USER_ALIGN16\n#endif\n\n#ifdef EIGEN_DONT_USE_RESTRICT_KEYWORD\n  #define EIGEN_RESTRICT\n#endif\n#ifndef EIGEN_RESTRICT\n  #define EIGEN_RESTRICT __restrict\n#endif\n\n#ifndef EIGEN_STACK_ALLOCATION_LIMIT\n// 131072 == 128 KB\n#define EIGEN_STACK_ALLOCATION_LIMIT 131072\n#endif\n\n#ifndef EIGEN_DEFAULT_IO_FORMAT\n#ifdef EIGEN_MAKING_DOCS\n// format used in Eigen's documentation\n// needed to define it here as escaping characters in CMake add_definition's argument seems very problematic.\n#define EIGEN_DEFAULT_IO_FORMAT Eigen::IOFormat(3, 0, \" \", \"\\n\", \"\", \"\")\n#else\n#define EIGEN_DEFAULT_IO_FORMAT Eigen::IOFormat()\n#endif\n#endif\n\n// just an empty macro !\n#define EIGEN_EMPTY\n\n#if defined(_MSC_VER) && (_MSC_VER < 1900) && (!defined(__INTEL_COMPILER))\n#define EIGEN_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(Derived) \\\n  using Base::operator =;\n#elif defined(__clang__) // workaround clang bug (see http://forum.kde.org/viewtopic.php?f=74&t=102653)\n#define EIGEN_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(Derived) \\\n  using Base::operator =; \\\n  EIGEN_STRONG_INLINE Derived& operator=(const Derived& other) { Base::operator=(other); return *this; } \\\n  template <typename OtherDerived> \\\n  EIGEN_STRONG_INLINE Derived& operator=(const DenseBase<OtherDerived>& other) { Base::operator=(other.derived()); return *this; }\n#else\n#define EIGEN_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(Derived) \\\n  using Base::operator =; \\\n  EIGEN_STRONG_INLINE Derived& operator=(const Derived& other) \\\n  { \\\n    Base::operator=(other); \\\n    return *this; \\\n  }\n#endif\n\n/** \\internal\n * \\brief Macro to manually inherit assignment operators.\n * This is necessary, because the implicitly defined assignment operator gets deleted when a custom operator= is defined.\n */\n#define EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Derived) EIGEN_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(Derived)\n\n/**\n* Just a side note. Commenting within defines works only by documenting\n* behind the object (via '!<'). Comments cannot be multi-line and thus\n* we have these extra long lines. What is confusing doxygen over here is\n* that we use '\\' and basically have a bunch of typedefs with their\n* documentation in a single line.\n**/\n\n#define EIGEN_GENERIC_PUBLIC_INTERFACE(Derived) \\\n  typedef typename Eigen::internal::traits<Derived>::Scalar Scalar; /*!< \\brief Numeric type, e.g. float, double, int or std::complex<float>. */ \\\n  typedef typename Eigen::NumTraits<Scalar>::Real RealScalar; /*!< \\brief The underlying numeric type for composed scalar types. \\details In cases where Scalar is e.g. std::complex<T>, T were corresponding to RealScalar. */ \\\n  typedef typename Base::CoeffReturnType CoeffReturnType; /*!< \\brief The return type for coefficient access. \\details Depending on whether the object allows direct coefficient access (e.g. for a MatrixXd), this type is either 'const Scalar&' or simply 'Scalar' for objects that do not allow direct coefficient access. */ \\\n  typedef typename Eigen::internal::nested<Derived>::type Nested; \\\n  typedef typename Eigen::internal::traits<Derived>::StorageKind StorageKind; \\\n  typedef typename Eigen::internal::traits<Derived>::Index Index; \\\n  enum { RowsAtCompileTime = Eigen::internal::traits<Derived>::RowsAtCompileTime, \\\n        ColsAtCompileTime = Eigen::internal::traits<Derived>::ColsAtCompileTime, \\\n        Flags = Eigen::internal::traits<Derived>::Flags, \\\n        CoeffReadCost = Eigen::internal::traits<Derived>::CoeffReadCost, \\\n        SizeAtCompileTime = Base::SizeAtCompileTime, \\\n        MaxSizeAtCompileTime = Base::MaxSizeAtCompileTime, \\\n        IsVectorAtCompileTime = Base::IsVectorAtCompileTime };\n\n\n#define EIGEN_DENSE_PUBLIC_INTERFACE(Derived) \\\n  typedef typename Eigen::internal::traits<Derived>::Scalar Scalar; /*!< \\brief Numeric type, e.g. float, double, int or std::complex<float>. */ \\\n  typedef typename Eigen::NumTraits<Scalar>::Real RealScalar; /*!< \\brief The underlying numeric type for composed scalar types. \\details In cases where Scalar is e.g. std::complex<T>, T were corresponding to RealScalar. */ \\\n  typedef typename Base::PacketScalar PacketScalar; \\\n  typedef typename Base::CoeffReturnType CoeffReturnType; /*!< \\brief The return type for coefficient access. \\details Depending on whether the object allows direct coefficient access (e.g. for a MatrixXd), this type is either 'const Scalar&' or simply 'Scalar' for objects that do not allow direct coefficient access. */ \\\n  typedef typename Eigen::internal::nested<Derived>::type Nested; \\\n  typedef typename Eigen::internal::traits<Derived>::StorageKind StorageKind; \\\n  typedef typename Eigen::internal::traits<Derived>::Index Index; \\\n  enum { RowsAtCompileTime = Eigen::internal::traits<Derived>::RowsAtCompileTime, \\\n        ColsAtCompileTime = Eigen::internal::traits<Derived>::ColsAtCompileTime, \\\n        MaxRowsAtCompileTime = Eigen::internal::traits<Derived>::MaxRowsAtCompileTime, \\\n        MaxColsAtCompileTime = Eigen::internal::traits<Derived>::MaxColsAtCompileTime, \\\n        Flags = Eigen::internal::traits<Derived>::Flags, \\\n        CoeffReadCost = Eigen::internal::traits<Derived>::CoeffReadCost, \\\n        SizeAtCompileTime = Base::SizeAtCompileTime, \\\n        MaxSizeAtCompileTime = Base::MaxSizeAtCompileTime, \\\n        IsVectorAtCompileTime = Base::IsVectorAtCompileTime }; \\\n  using Base::derived; \\\n  using Base::const_cast_derived;\n\n\n#define EIGEN_PLAIN_ENUM_MIN(a,b) (((int)a <= (int)b) ? (int)a : (int)b)\n#define EIGEN_PLAIN_ENUM_MAX(a,b) (((int)a >= (int)b) ? (int)a : (int)b)\n\n// EIGEN_SIZE_MIN_PREFER_DYNAMIC gives the min between compile-time sizes. 0 has absolute priority, followed by 1,\n// followed by Dynamic, followed by other finite values. The reason for giving Dynamic the priority over\n// finite values is that min(3, Dynamic) should be Dynamic, since that could be anything between 0 and 3.\n#define EIGEN_SIZE_MIN_PREFER_DYNAMIC(a,b) (((int)a == 0 || (int)b == 0) ? 0 \\\n                           : ((int)a == 1 || (int)b == 1) ? 1 \\\n                           : ((int)a == Dynamic || (int)b == Dynamic) ? Dynamic \\\n                           : ((int)a <= (int)b) ? (int)a : (int)b)\n\n// EIGEN_SIZE_MIN_PREFER_FIXED is a variant of EIGEN_SIZE_MIN_PREFER_DYNAMIC comparing MaxSizes. The difference is that finite values\n// now have priority over Dynamic, so that min(3, Dynamic) gives 3. Indeed, whatever the actual value is\n// (between 0 and 3), it is not more than 3.\n#define EIGEN_SIZE_MIN_PREFER_FIXED(a,b)  (((int)a == 0 || (int)b == 0) ? 0 \\\n                           : ((int)a == 1 || (int)b == 1) ? 1 \\\n                           : ((int)a == Dynamic && (int)b == Dynamic) ? Dynamic \\\n                           : ((int)a == Dynamic) ? (int)b \\\n                           : ((int)b == Dynamic) ? (int)a \\\n                           : ((int)a <= (int)b) ? (int)a : (int)b)\n\n// see EIGEN_SIZE_MIN_PREFER_DYNAMIC. No need for a separate variant for MaxSizes here.\n#define EIGEN_SIZE_MAX(a,b) (((int)a == Dynamic || (int)b == Dynamic) ? Dynamic \\\n                           : ((int)a >= (int)b) ? (int)a : (int)b)\n\n#define EIGEN_ADD_COST(a,b) int(a)==Dynamic || int(b)==Dynamic ? Dynamic : int(a)+int(b)\n\n#define EIGEN_LOGICAL_XOR(a,b) (((a) || (b)) && !((a) && (b)))\n\n#define EIGEN_IMPLIES(a,b) (!(a) || (b))\n\n#define EIGEN_MAKE_CWISE_BINARY_OP(METHOD,FUNCTOR) \\\n  template<typename OtherDerived> \\\n  EIGEN_STRONG_INLINE const CwiseBinaryOp<FUNCTOR<Scalar>, const Derived, const OtherDerived> \\\n  (METHOD)(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const \\\n  { \\\n    return CwiseBinaryOp<FUNCTOR<Scalar>, const Derived, const OtherDerived>(derived(), other.derived()); \\\n  }\n\n// the expression type of a cwise product\n#define EIGEN_CWISE_PRODUCT_RETURN_TYPE(LHS,RHS) \\\n    CwiseBinaryOp< \\\n      internal::scalar_product_op< \\\n          typename internal::traits<LHS>::Scalar, \\\n          typename internal::traits<RHS>::Scalar \\\n      >, \\\n      const LHS, \\\n      const RHS \\\n    >\n\n#endif // EIGEN_MACROS_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/util/Memory.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2008-2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n// Copyright (C) 2009 Kenneth Riddile <kfriddile@yahoo.com>\n// Copyright (C) 2010 Hauke Heibel <hauke.heibel@gmail.com>\n// Copyright (C) 2010 Thomas Capricelli <orzel@freehackers.org>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n/*****************************************************************************\n*** Platform checks for aligned malloc functions                           ***\n*****************************************************************************/\n\n#ifndef EIGEN_MEMORY_H\n#define EIGEN_MEMORY_H\n\n#ifndef EIGEN_MALLOC_ALREADY_ALIGNED\n\n// Try to determine automatically if malloc is already aligned.\n\n// On 64-bit systems, glibc's malloc returns 16-byte-aligned pointers, see:\n//   http://www.gnu.org/s/libc/manual/html_node/Aligned-Memory-Blocks.html\n// This is true at least since glibc 2.8.\n// This leaves the question how to detect 64-bit. According to this document,\n//   http://gcc.fyxm.net/summit/2003/Porting%20to%2064%20bit.pdf\n// page 114, \"[The] LP64 model [...] is used by all 64-bit UNIX ports\" so it's indeed\n// quite safe, at least within the context of glibc, to equate 64-bit with LP64.\n#if defined(__GLIBC__) && ((__GLIBC__>=2 && __GLIBC_MINOR__ >= 8) || __GLIBC__>2) \\\n && defined(__LP64__) && ! defined( __SANITIZE_ADDRESS__ )\n  #define EIGEN_GLIBC_MALLOC_ALREADY_ALIGNED 1\n#else\n  #define EIGEN_GLIBC_MALLOC_ALREADY_ALIGNED 0\n#endif\n\n// FreeBSD 6 seems to have 16-byte aligned malloc\n//   See http://svn.freebsd.org/viewvc/base/stable/6/lib/libc/stdlib/malloc.c?view=markup\n// FreeBSD 7 seems to have 16-byte aligned malloc except on ARM and MIPS architectures\n//   See http://svn.freebsd.org/viewvc/base/stable/7/lib/libc/stdlib/malloc.c?view=markup\n#if defined(__FreeBSD__) && !defined(__arm__) && !defined(__mips__)\n  #define EIGEN_FREEBSD_MALLOC_ALREADY_ALIGNED 1\n#else\n  #define EIGEN_FREEBSD_MALLOC_ALREADY_ALIGNED 0\n#endif\n\n#if defined(__APPLE__) \\\n || defined(_WIN64) \\\n || EIGEN_GLIBC_MALLOC_ALREADY_ALIGNED \\\n || EIGEN_FREEBSD_MALLOC_ALREADY_ALIGNED\n  #define EIGEN_MALLOC_ALREADY_ALIGNED 1\n#else\n  #define EIGEN_MALLOC_ALREADY_ALIGNED 0\n#endif\n\n#endif\n\n// See bug 554 (http://eigen.tuxfamily.org/bz/show_bug.cgi?id=554)\n// It seems to be unsafe to check _POSIX_ADVISORY_INFO without including unistd.h first.\n// Currently, let's include it only on unix systems:\n#if defined(__unix__) || defined(__unix)\n  #include <unistd.h>\n  #if ((defined __QNXNTO__) || (defined _GNU_SOURCE) || (defined __PGI) || ((defined _XOPEN_SOURCE) && (_XOPEN_SOURCE >= 600))) && (defined _POSIX_ADVISORY_INFO) && (_POSIX_ADVISORY_INFO > 0)\n    #define EIGEN_HAS_POSIX_MEMALIGN 1\n  #endif\n#endif\n\n#ifndef EIGEN_HAS_POSIX_MEMALIGN\n  #define EIGEN_HAS_POSIX_MEMALIGN 0\n#endif\n\n#ifdef EIGEN_VECTORIZE_SSE\n  #define EIGEN_HAS_MM_MALLOC 1\n#else\n  #define EIGEN_HAS_MM_MALLOC 0\n#endif\n\nnamespace Eigen {\n\nnamespace internal {\n\ninline void throw_std_bad_alloc()\n{\n  #ifdef EIGEN_EXCEPTIONS\n    throw std::bad_alloc();\n  #else\n    std::size_t huge = -1;\n    new int[huge];\n  #endif\n}\n\n/*****************************************************************************\n*** Implementation of handmade aligned functions                           ***\n*****************************************************************************/\n\n/* ----- Hand made implementations of aligned malloc/free and realloc ----- */\n\n/** \\internal Like malloc, but the returned pointer is guaranteed to be 16-byte aligned.\n  * Fast, but wastes 16 additional bytes of memory. Does not throw any exception.\n  */\ninline void* handmade_aligned_malloc(std::size_t size)\n{\n  void *original = std::malloc(size+16);\n  if (original == 0) return 0;\n  void *aligned = reinterpret_cast<void*>((reinterpret_cast<std::size_t>(original) & ~(std::size_t(15))) + 16);\n  *(reinterpret_cast<void**>(aligned) - 1) = original;\n  return aligned;\n}\n\n/** \\internal Frees memory allocated with handmade_aligned_malloc */\ninline void handmade_aligned_free(void *ptr)\n{\n  if (ptr) std::free(*(reinterpret_cast<void**>(ptr) - 1));\n}\n\n/** \\internal\n  * \\brief Reallocates aligned memory.\n  * Since we know that our handmade version is based on std::realloc\n  * we can use std::realloc to implement efficient reallocation.\n  */\ninline void* handmade_aligned_realloc(void* ptr, std::size_t size, std::size_t = 0)\n{\n  if (ptr == 0) return handmade_aligned_malloc(size);\n  void *original = *(reinterpret_cast<void**>(ptr) - 1);\n  std::ptrdiff_t previous_offset = static_cast<char *>(ptr)-static_cast<char *>(original);\n  original = std::realloc(original,size+16);\n  if (original == 0) return 0;\n  void *aligned = reinterpret_cast<void*>((reinterpret_cast<std::size_t>(original) & ~(std::size_t(15))) + 16);\n  void *previous_aligned = static_cast<char *>(original)+previous_offset;\n  if(aligned!=previous_aligned)\n    std::memmove(aligned, previous_aligned, size);\n  \n  *(reinterpret_cast<void**>(aligned) - 1) = original;\n  return aligned;\n}\n\n/*****************************************************************************\n*** Implementation of generic aligned realloc (when no realloc can be used)***\n*****************************************************************************/\n\nvoid* aligned_malloc(std::size_t size);\nvoid  aligned_free(void *ptr);\n\n/** \\internal\n  * \\brief Reallocates aligned memory.\n  * Allows reallocation with aligned ptr types. This implementation will\n  * always create a new memory chunk and copy the old data.\n  */\ninline void* generic_aligned_realloc(void* ptr, size_t size, size_t old_size)\n{\n  if (ptr==0)\n    return aligned_malloc(size);\n\n  if (size==0)\n  {\n    aligned_free(ptr);\n    return 0;\n  }\n\n  void* newptr = aligned_malloc(size);\n  if (newptr == 0)\n  {\n    #ifdef EIGEN_HAS_ERRNO\n    errno = ENOMEM; // according to the standard\n    #endif\n    return 0;\n  }\n\n  if (ptr != 0)\n  {\n    std::memcpy(newptr, ptr, (std::min)(size,old_size));\n    aligned_free(ptr);\n  }\n\n  return newptr;\n}\n\n/*****************************************************************************\n*** Implementation of portable aligned versions of malloc/free/realloc     ***\n*****************************************************************************/\n\n#ifdef EIGEN_NO_MALLOC\ninline void check_that_malloc_is_allowed()\n{\n  eigen_assert(false && \"heap allocation is forbidden (EIGEN_NO_MALLOC is defined)\");\n}\n#elif defined EIGEN_RUNTIME_NO_MALLOC\ninline bool is_malloc_allowed_impl(bool update, bool new_value = false)\n{\n  static bool value = true;\n  if (update == 1)\n    value = new_value;\n  return value;\n}\ninline bool is_malloc_allowed() { return is_malloc_allowed_impl(false); }\ninline bool set_is_malloc_allowed(bool new_value) { return is_malloc_allowed_impl(true, new_value); }\ninline void check_that_malloc_is_allowed()\n{\n  eigen_assert(is_malloc_allowed() && \"heap allocation is forbidden (EIGEN_RUNTIME_NO_MALLOC is defined and g_is_malloc_allowed is false)\");\n}\n#else \ninline void check_that_malloc_is_allowed()\n{}\n#endif\n\n/** \\internal Allocates \\a size bytes. The returned pointer is guaranteed to have 16 bytes alignment.\n  * On allocation error, the returned pointer is null, and std::bad_alloc is thrown.\n  */\ninline void* aligned_malloc(size_t size)\n{\n  check_that_malloc_is_allowed();\n\n  void *result;\n  #if !EIGEN_ALIGN\n    result = std::malloc(size);\n  #elif EIGEN_MALLOC_ALREADY_ALIGNED\n    result = std::malloc(size);\n  #elif EIGEN_HAS_POSIX_MEMALIGN\n    if(posix_memalign(&result, 16, size)) result = 0;\n  #elif EIGEN_HAS_MM_MALLOC\n    result = _mm_malloc(size, 16);\n  #elif defined(_MSC_VER) && (!defined(_WIN32_WCE))\n    result = _aligned_malloc(size, 16);\n  #else\n    result = handmade_aligned_malloc(size);\n  #endif\n\n  if(!result && size)\n    throw_std_bad_alloc();\n\n  return result;\n}\n\n/** \\internal Frees memory allocated with aligned_malloc. */\ninline void aligned_free(void *ptr)\n{\n  #if !EIGEN_ALIGN\n    std::free(ptr);\n  #elif EIGEN_MALLOC_ALREADY_ALIGNED\n    std::free(ptr);\n  #elif EIGEN_HAS_POSIX_MEMALIGN\n    std::free(ptr);\n  #elif EIGEN_HAS_MM_MALLOC\n    _mm_free(ptr);\n  #elif defined(_MSC_VER) && (!defined(_WIN32_WCE))\n    _aligned_free(ptr);\n  #else\n    handmade_aligned_free(ptr);\n  #endif\n}\n\n/**\n* \\internal\n* \\brief Reallocates an aligned block of memory.\n* \\throws std::bad_alloc on allocation failure\n**/\ninline void* aligned_realloc(void *ptr, size_t new_size, size_t old_size)\n{\n  EIGEN_UNUSED_VARIABLE(old_size);\n\n  void *result;\n#if !EIGEN_ALIGN\n  result = std::realloc(ptr,new_size);\n#elif EIGEN_MALLOC_ALREADY_ALIGNED\n  result = std::realloc(ptr,new_size);\n#elif EIGEN_HAS_POSIX_MEMALIGN\n  result = generic_aligned_realloc(ptr,new_size,old_size);\n#elif EIGEN_HAS_MM_MALLOC\n  // The defined(_mm_free) is just here to verify that this MSVC version\n  // implements _mm_malloc/_mm_free based on the corresponding _aligned_\n  // functions. This may not always be the case and we just try to be safe.\n  #if defined(_MSC_VER) && (!defined(_WIN32_WCE)) && defined(_mm_free)\n    result = _aligned_realloc(ptr,new_size,16);\n  #else\n    result = generic_aligned_realloc(ptr,new_size,old_size);\n  #endif\n#elif defined(_MSC_VER) && (!defined(_WIN32_WCE))\n  result = _aligned_realloc(ptr,new_size,16);\n#else\n  result = handmade_aligned_realloc(ptr,new_size,old_size);\n#endif\n\n  if (!result && new_size)\n    throw_std_bad_alloc();\n\n  return result;\n}\n\n/*****************************************************************************\n*** Implementation of conditionally aligned functions                      ***\n*****************************************************************************/\n\n/** \\internal Allocates \\a size bytes. If Align is true, then the returned ptr is 16-byte-aligned.\n  * On allocation error, the returned pointer is null, and a std::bad_alloc is thrown.\n  */\ntemplate<bool Align> inline void* conditional_aligned_malloc(size_t size)\n{\n  return aligned_malloc(size);\n}\n\ntemplate<> inline void* conditional_aligned_malloc<false>(size_t size)\n{\n  check_that_malloc_is_allowed();\n\n  void *result = std::malloc(size);\n  if(!result && size)\n    throw_std_bad_alloc();\n  return result;\n}\n\n/** \\internal Frees memory allocated with conditional_aligned_malloc */\ntemplate<bool Align> inline void conditional_aligned_free(void *ptr)\n{\n  aligned_free(ptr);\n}\n\ntemplate<> inline void conditional_aligned_free<false>(void *ptr)\n{\n  std::free(ptr);\n}\n\ntemplate<bool Align> inline void* conditional_aligned_realloc(void* ptr, size_t new_size, size_t old_size)\n{\n  return aligned_realloc(ptr, new_size, old_size);\n}\n\ntemplate<> inline void* conditional_aligned_realloc<false>(void* ptr, size_t new_size, size_t)\n{\n  return std::realloc(ptr, new_size);\n}\n\n/*****************************************************************************\n*** Construction/destruction of array elements                             ***\n*****************************************************************************/\n\n/** \\internal Constructs the elements of an array.\n  * The \\a size parameter tells on how many objects to call the constructor of T.\n  */\ntemplate<typename T> inline T* construct_elements_of_array(T *ptr, size_t size)\n{\n  for (size_t i=0; i < size; ++i) ::new (ptr + i) T;\n  return ptr;\n}\n\n/** \\internal Destructs the elements of an array.\n  * The \\a size parameters tells on how many objects to call the destructor of T.\n  */\ntemplate<typename T> inline void destruct_elements_of_array(T *ptr, size_t size)\n{\n  // always destruct an array starting from the end.\n  if(ptr)\n    while(size) ptr[--size].~T();\n}\n\n/*****************************************************************************\n*** Implementation of aligned new/delete-like functions                    ***\n*****************************************************************************/\n\ntemplate<typename T>\nEIGEN_ALWAYS_INLINE void check_size_for_overflow(size_t size)\n{\n  if(size > size_t(-1) / sizeof(T))\n    throw_std_bad_alloc();\n}\n\n/** \\internal Allocates \\a size objects of type T. The returned pointer is guaranteed to have 16 bytes alignment.\n  * On allocation error, the returned pointer is undefined, but a std::bad_alloc is thrown.\n  * The default constructor of T is called.\n  */\ntemplate<typename T> inline T* aligned_new(size_t size)\n{\n  check_size_for_overflow<T>(size);\n  T *result = reinterpret_cast<T*>(aligned_malloc(sizeof(T)*size));\n  return construct_elements_of_array(result, size);\n}\n\ntemplate<typename T, bool Align> inline T* conditional_aligned_new(size_t size)\n{\n  check_size_for_overflow<T>(size);\n  T *result = reinterpret_cast<T*>(conditional_aligned_malloc<Align>(sizeof(T)*size));\n  return construct_elements_of_array(result, size);\n}\n\n/** \\internal Deletes objects constructed with aligned_new\n  * The \\a size parameters tells on how many objects to call the destructor of T.\n  */\ntemplate<typename T> inline void aligned_delete(T *ptr, size_t size)\n{\n  destruct_elements_of_array<T>(ptr, size);\n  aligned_free(ptr);\n}\n\n/** \\internal Deletes objects constructed with conditional_aligned_new\n  * The \\a size parameters tells on how many objects to call the destructor of T.\n  */\ntemplate<typename T, bool Align> inline void conditional_aligned_delete(T *ptr, size_t size)\n{\n  destruct_elements_of_array<T>(ptr, size);\n  conditional_aligned_free<Align>(ptr);\n}\n\ntemplate<typename T, bool Align> inline T* conditional_aligned_realloc_new(T* pts, size_t new_size, size_t old_size)\n{\n  check_size_for_overflow<T>(new_size);\n  check_size_for_overflow<T>(old_size);\n  if(new_size < old_size)\n    destruct_elements_of_array(pts+new_size, old_size-new_size);\n  T *result = reinterpret_cast<T*>(conditional_aligned_realloc<Align>(reinterpret_cast<void*>(pts), sizeof(T)*new_size, sizeof(T)*old_size));\n  if(new_size > old_size)\n    construct_elements_of_array(result+old_size, new_size-old_size);\n  return result;\n}\n\n\ntemplate<typename T, bool Align> inline T* conditional_aligned_new_auto(size_t size)\n{\n  if(size==0)\n    return 0; // short-cut. Also fixes Bug 884\n  check_size_for_overflow<T>(size);\n  T *result = reinterpret_cast<T*>(conditional_aligned_malloc<Align>(sizeof(T)*size));\n  if(NumTraits<T>::RequireInitialization)\n    construct_elements_of_array(result, size);\n  return result;\n}\n\ntemplate<typename T, bool Align> inline T* conditional_aligned_realloc_new_auto(T* pts, size_t new_size, size_t old_size)\n{\n  check_size_for_overflow<T>(new_size);\n  check_size_for_overflow<T>(old_size);\n  if(NumTraits<T>::RequireInitialization && (new_size < old_size))\n    destruct_elements_of_array(pts+new_size, old_size-new_size);\n  T *result = reinterpret_cast<T*>(conditional_aligned_realloc<Align>(reinterpret_cast<void*>(pts), sizeof(T)*new_size, sizeof(T)*old_size));\n  if(NumTraits<T>::RequireInitialization && (new_size > old_size))\n    construct_elements_of_array(result+old_size, new_size-old_size);\n  return result;\n}\n\ntemplate<typename T, bool Align> inline void conditional_aligned_delete_auto(T *ptr, size_t size)\n{\n  if(NumTraits<T>::RequireInitialization)\n    destruct_elements_of_array<T>(ptr, size);\n  conditional_aligned_free<Align>(ptr);\n}\n\n/****************************************************************************/\n\n/** \\internal Returns the index of the first element of the array that is well aligned for vectorization.\n  *\n  * \\param array the address of the start of the array\n  * \\param size the size of the array\n  *\n  * \\note If no element of the array is well aligned, the size of the array is returned. Typically,\n  * for example with SSE, \"well aligned\" means 16-byte-aligned. If vectorization is disabled or if the\n  * packet size for the given scalar type is 1, then everything is considered well-aligned.\n  *\n  * \\note If the scalar type is vectorizable, we rely on the following assumptions: sizeof(Scalar) is a\n  * power of 2, the packet size in bytes is also a power of 2, and is a multiple of sizeof(Scalar). On the\n  * other hand, we do not assume that the array address is a multiple of sizeof(Scalar), as that fails for\n  * example with Scalar=double on certain 32-bit platforms, see bug #79.\n  *\n  * There is also the variant first_aligned(const MatrixBase&) defined in DenseCoeffsBase.h.\n  */\ntemplate<typename Scalar, typename Index>\nstatic inline Index first_aligned(const Scalar* array, Index size)\n{\n  static const Index PacketSize = packet_traits<Scalar>::size;\n  static const Index PacketAlignedMask = PacketSize-1;\n\n  if(PacketSize==1)\n  {\n    // Either there is no vectorization, or a packet consists of exactly 1 scalar so that all elements\n    // of the array have the same alignment.\n    return 0;\n  }\n  else if(size_t(array) & (sizeof(Scalar)-1))\n  {\n    // There is vectorization for this scalar type, but the array is not aligned to the size of a single scalar.\n    // Consequently, no element of the array is well aligned.\n    return size;\n  }\n  else\n  {\n    return std::min<Index>( (PacketSize - (Index((size_t(array)/sizeof(Scalar))) & PacketAlignedMask))\n                           & PacketAlignedMask, size);\n  }\n}\n\n/** \\internal Returns the smallest integer multiple of \\a base and greater or equal to \\a size\n  */ \ntemplate<typename Index> \ninline static Index first_multiple(Index size, Index base)\n{\n  return ((size+base-1)/base)*base;\n}\n\n// std::copy is much slower than memcpy, so let's introduce a smart_copy which\n// use memcpy on trivial types, i.e., on types that does not require an initialization ctor.\ntemplate<typename T, bool UseMemcpy> struct smart_copy_helper;\n\ntemplate<typename T> void smart_copy(const T* start, const T* end, T* target)\n{\n  smart_copy_helper<T,!NumTraits<T>::RequireInitialization>::run(start, end, target);\n}\n\ntemplate<typename T> struct smart_copy_helper<T,true> {\n  static inline void run(const T* start, const T* end, T* target)\n  {\n    std::ptrdiff_t size = std::ptrdiff_t(end)-std::ptrdiff_t(start);\n    if(size==0) return;\n    eigen_internal_assert(start!=0 && end!=0 && target!=0);\n    memcpy(target, start, size);\n  }\n};\n\ntemplate<typename T> struct smart_copy_helper<T,false> {\n  static inline void run(const T* start, const T* end, T* target)\n  { std::copy(start, end, target); }\n};\n\n/*****************************************************************************\n*** Implementation of runtime stack allocation (falling back to malloc)    ***\n*****************************************************************************/\n\n// you can overwrite Eigen's default behavior regarding alloca by defining EIGEN_ALLOCA\n// to the appropriate stack allocation function\n#ifndef EIGEN_ALLOCA\n  #if (defined __linux__) || (defined __APPLE__) || (defined alloca)\n    #define EIGEN_ALLOCA alloca\n  #elif defined(_MSC_VER)\n    #define EIGEN_ALLOCA _alloca\n  #endif\n#endif\n\n// This helper class construct the allocated memory, and takes care of destructing and freeing the handled data\n// at destruction time. In practice this helper class is mainly useful to avoid memory leak in case of exceptions.\ntemplate<typename T> class aligned_stack_memory_handler\n{\n  public:\n    /* Creates a stack_memory_handler responsible for the buffer \\a ptr of size \\a size.\n     * Note that \\a ptr can be 0 regardless of the other parameters.\n     * This constructor takes care of constructing/initializing the elements of the buffer if required by the scalar type T (see NumTraits<T>::RequireInitialization).\n     * In this case, the buffer elements will also be destructed when this handler will be destructed.\n     * Finally, if \\a dealloc is true, then the pointer \\a ptr is freed.\n     **/\n    aligned_stack_memory_handler(T* ptr, size_t size, bool dealloc)\n      : m_ptr(ptr), m_size(size), m_deallocate(dealloc)\n    {\n      if(NumTraits<T>::RequireInitialization && m_ptr)\n        Eigen::internal::construct_elements_of_array(m_ptr, size);\n    }\n    ~aligned_stack_memory_handler()\n    {\n      if(NumTraits<T>::RequireInitialization && m_ptr)\n        Eigen::internal::destruct_elements_of_array<T>(m_ptr, m_size);\n      if(m_deallocate)\n        Eigen::internal::aligned_free(m_ptr);\n    }\n  protected:\n    T* m_ptr;\n    size_t m_size;\n    bool m_deallocate;\n};\n\n} // end namespace internal\n\n/** \\internal\n  * Declares, allocates and construct an aligned buffer named NAME of SIZE elements of type TYPE on the stack\n  * if SIZE is smaller than EIGEN_STACK_ALLOCATION_LIMIT, and if stack allocation is supported by the platform\n  * (currently, this is Linux and Visual Studio only). Otherwise the memory is allocated on the heap.\n  * The allocated buffer is automatically deleted when exiting the scope of this declaration.\n  * If BUFFER is non null, then the declared variable is simply an alias for BUFFER, and no allocation/deletion occurs.\n  * Here is an example:\n  * \\code\n  * {\n  *   ei_declare_aligned_stack_constructed_variable(float,data,size,0);\n  *   // use data[0] to data[size-1]\n  * }\n  * \\endcode\n  * The underlying stack allocation function can controlled with the EIGEN_ALLOCA preprocessor token.\n  */\n#ifdef EIGEN_ALLOCA\n\n  #if defined(__arm__) || defined(_WIN32)\n    #define EIGEN_ALIGNED_ALLOCA(SIZE) reinterpret_cast<void*>((reinterpret_cast<size_t>(EIGEN_ALLOCA(SIZE+16)) & ~(size_t(15))) + 16)\n  #else\n    #define EIGEN_ALIGNED_ALLOCA EIGEN_ALLOCA\n  #endif\n\n  #define ei_declare_aligned_stack_constructed_variable(TYPE,NAME,SIZE,BUFFER) \\\n    Eigen::internal::check_size_for_overflow<TYPE>(SIZE); \\\n    TYPE* NAME = (BUFFER)!=0 ? (BUFFER) \\\n               : reinterpret_cast<TYPE*>( \\\n                      (sizeof(TYPE)*SIZE<=EIGEN_STACK_ALLOCATION_LIMIT) ? EIGEN_ALIGNED_ALLOCA(sizeof(TYPE)*SIZE) \\\n                    : Eigen::internal::aligned_malloc(sizeof(TYPE)*SIZE) );  \\\n    Eigen::internal::aligned_stack_memory_handler<TYPE> EIGEN_CAT(NAME,_stack_memory_destructor)((BUFFER)==0 ? NAME : 0,SIZE,sizeof(TYPE)*SIZE>EIGEN_STACK_ALLOCATION_LIMIT)\n\n#else\n\n  #define ei_declare_aligned_stack_constructed_variable(TYPE,NAME,SIZE,BUFFER) \\\n    Eigen::internal::check_size_for_overflow<TYPE>(SIZE); \\\n    TYPE* NAME = (BUFFER)!=0 ? BUFFER : reinterpret_cast<TYPE*>(Eigen::internal::aligned_malloc(sizeof(TYPE)*SIZE));    \\\n    Eigen::internal::aligned_stack_memory_handler<TYPE> EIGEN_CAT(NAME,_stack_memory_destructor)((BUFFER)==0 ? NAME : 0,SIZE,true)\n    \n#endif\n\n\n/*****************************************************************************\n*** Implementation of EIGEN_MAKE_ALIGNED_OPERATOR_NEW [_IF]                ***\n*****************************************************************************/\n\n#if EIGEN_ALIGN\n  #ifdef EIGEN_EXCEPTIONS\n    #define EIGEN_MAKE_ALIGNED_OPERATOR_NEW_NOTHROW(NeedsToAlign) \\\n      void* operator new(size_t size, const std::nothrow_t&) throw() { \\\n        try { return Eigen::internal::conditional_aligned_malloc<NeedsToAlign>(size); } \\\n        catch (...) { return 0; } \\\n      }\n  #else\n    #define EIGEN_MAKE_ALIGNED_OPERATOR_NEW_NOTHROW(NeedsToAlign) \\\n      void* operator new(size_t size, const std::nothrow_t&) throw() { \\\n        return Eigen::internal::conditional_aligned_malloc<NeedsToAlign>(size); \\\n      }\n  #endif\n\n  #define EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(NeedsToAlign) \\\n      void *operator new(size_t size) { \\\n        return Eigen::internal::conditional_aligned_malloc<NeedsToAlign>(size); \\\n      } \\\n      void *operator new[](size_t size) { \\\n        return Eigen::internal::conditional_aligned_malloc<NeedsToAlign>(size); \\\n      } \\\n      void operator delete(void * ptr) throw() { Eigen::internal::conditional_aligned_free<NeedsToAlign>(ptr); } \\\n      void operator delete[](void * ptr) throw() { Eigen::internal::conditional_aligned_free<NeedsToAlign>(ptr); } \\\n      void operator delete(void * ptr, std::size_t /* sz */) throw() { Eigen::internal::conditional_aligned_free<NeedsToAlign>(ptr); } \\\n      void operator delete[](void * ptr, std::size_t /* sz */) throw() { Eigen::internal::conditional_aligned_free<NeedsToAlign>(ptr); } \\\n      /* in-place new and delete. since (at least afaik) there is no actual   */ \\\n      /* memory allocated we can safely let the default implementation handle */ \\\n      /* this particular case. */ \\\n      static void *operator new(size_t size, void *ptr) { return ::operator new(size,ptr); } \\\n      static void *operator new[](size_t size, void* ptr) { return ::operator new[](size,ptr); } \\\n      void operator delete(void * memory, void *ptr) throw() { return ::operator delete(memory,ptr); } \\\n      void operator delete[](void * memory, void *ptr) throw() { return ::operator delete[](memory,ptr); } \\\n      /* nothrow-new (returns zero instead of std::bad_alloc) */ \\\n      EIGEN_MAKE_ALIGNED_OPERATOR_NEW_NOTHROW(NeedsToAlign) \\\n      void operator delete(void *ptr, const std::nothrow_t&) throw() { \\\n        Eigen::internal::conditional_aligned_free<NeedsToAlign>(ptr); \\\n      } \\\n      typedef void eigen_aligned_operator_new_marker_type;\n#else\n  #define EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(NeedsToAlign)\n#endif\n\n#define EIGEN_MAKE_ALIGNED_OPERATOR_NEW EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(true)\n#define EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(Scalar,Size) \\\n  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(bool(((Size)!=Eigen::Dynamic) && ((sizeof(Scalar)*(Size))%16==0)))\n\n/****************************************************************************/\n\n\n/** \\class aligned_allocator\n  * \\ingroup Core_Module\n  *\n  * \\brief STL compatible allocator to use with with 16 byte aligned types\n  *\n  * Example:\n  * \\code\n  * // Matrix4f requires 16 bytes alignment:\n  * std::map< int, Matrix4f, std::less<int>,\n  *           aligned_allocator<std::pair<const int, Matrix4f> > > my_map_mat4;\n  * // Vector3f does not require 16 bytes alignment, no need to use Eigen's allocator:\n  * std::map< int, Vector3f > my_map_vec3;\n  * \\endcode\n  *\n  * \\sa \\blank \\ref TopicStlContainers.\n  */\ntemplate<class T>\nclass aligned_allocator : public std::allocator<T>\n{\npublic:\n  typedef size_t          size_type;\n  typedef std::ptrdiff_t  difference_type;\n  typedef T*              pointer;\n  typedef const T*        const_pointer;\n  typedef T&              reference;\n  typedef const T&        const_reference;\n  typedef T               value_type;\n\n  template<class U>\n  struct rebind\n  {\n    typedef aligned_allocator<U> other;\n  };\n\n  aligned_allocator() : std::allocator<T>() {}\n\n  aligned_allocator(const aligned_allocator& other) : std::allocator<T>(other) {}\n\n  template<class U>\n  aligned_allocator(const aligned_allocator<U>& other) : std::allocator<T>(other) {}\n\n  ~aligned_allocator() {}\n\n  pointer allocate(size_type num, const void* /*hint*/ = 0)\n  {\n    internal::check_size_for_overflow<T>(num);\n    return static_cast<pointer>( internal::aligned_malloc(num * sizeof(T)) );\n  }\n\n  void deallocate(pointer p, size_type /*num*/)\n  {\n    internal::aligned_free(p);\n  }\n};\n\n//---------- Cache sizes ----------\n\n#if !defined(EIGEN_NO_CPUID)\n#  if defined(__GNUC__) && ( defined(__i386__) || defined(__x86_64__) )\n#    if defined(__PIC__) && defined(__i386__)\n       // Case for x86 with PIC\n#      define EIGEN_CPUID(abcd,func,id) \\\n         __asm__ __volatile__ (\"xchgl %%ebx, %k1;cpuid; xchgl %%ebx,%k1\": \"=a\" (abcd[0]), \"=&r\" (abcd[1]), \"=c\" (abcd[2]), \"=d\" (abcd[3]) : \"a\" (func), \"c\" (id));\n#    elif defined(__PIC__) && defined(__x86_64__)\n       // Case for x64 with PIC. In theory this is only a problem with recent gcc and with medium or large code model, not with the default small code model.\n       // However, we cannot detect which code model is used, and the xchg overhead is negligible anyway.\n#      define EIGEN_CPUID(abcd,func,id) \\\n        __asm__ __volatile__ (\"xchg{q}\\t{%%}rbx, %q1; cpuid; xchg{q}\\t{%%}rbx, %q1\": \"=a\" (abcd[0]), \"=&r\" (abcd[1]), \"=c\" (abcd[2]), \"=d\" (abcd[3]) : \"0\" (func), \"2\" (id));\n#    else\n       // Case for x86_64 or x86 w/o PIC\n#      define EIGEN_CPUID(abcd,func,id) \\\n         __asm__ __volatile__ (\"cpuid\": \"=a\" (abcd[0]), \"=b\" (abcd[1]), \"=c\" (abcd[2]), \"=d\" (abcd[3]) : \"0\" (func), \"2\" (id) );\n#    endif\n#  elif defined(_MSC_VER)\n#    if (_MSC_VER > 1500) && ( defined(_M_IX86) || defined(_M_X64) )\n#      define EIGEN_CPUID(abcd,func,id) __cpuidex((int*)abcd,func,id)\n#    endif\n#  endif\n#endif\n\nnamespace internal {\n\n#ifdef EIGEN_CPUID\n\ninline bool cpuid_is_vendor(int abcd[4], const int vendor[3])\n{\n  return abcd[1]==vendor[0] && abcd[3]==vendor[1] && abcd[2]==vendor[2];\n}\n\ninline void queryCacheSizes_intel_direct(int& l1, int& l2, int& l3)\n{\n  int abcd[4];\n  l1 = l2 = l3 = 0;\n  int cache_id = 0;\n  int cache_type = 0;\n  do {\n    abcd[0] = abcd[1] = abcd[2] = abcd[3] = 0;\n    EIGEN_CPUID(abcd,0x4,cache_id);\n    cache_type  = (abcd[0] & 0x0F) >> 0;\n    if(cache_type==1||cache_type==3) // data or unified cache\n    {\n      int cache_level = (abcd[0] & 0xE0) >> 5;  // A[7:5]\n      int ways        = (abcd[1] & 0xFFC00000) >> 22; // B[31:22]\n      int partitions  = (abcd[1] & 0x003FF000) >> 12; // B[21:12]\n      int line_size   = (abcd[1] & 0x00000FFF) >>  0; // B[11:0]\n      int sets        = (abcd[2]);                    // C[31:0]\n\n      int cache_size = (ways+1) * (partitions+1) * (line_size+1) * (sets+1);\n\n      switch(cache_level)\n      {\n        case 1: l1 = cache_size; break;\n        case 2: l2 = cache_size; break;\n        case 3: l3 = cache_size; break;\n        default: break;\n      }\n    }\n    cache_id++;\n  } while(cache_type>0 && cache_id<16);\n}\n\ninline void queryCacheSizes_intel_codes(int& l1, int& l2, int& l3)\n{\n  int abcd[4];\n  abcd[0] = abcd[1] = abcd[2] = abcd[3] = 0;\n  l1 = l2 = l3 = 0;\n  EIGEN_CPUID(abcd,0x00000002,0);\n  unsigned char * bytes = reinterpret_cast<unsigned char *>(abcd)+2;\n  bool check_for_p2_core2 = false;\n  for(int i=0; i<14; ++i)\n  {\n    switch(bytes[i])\n    {\n      case 0x0A: l1 = 8; break;   // 0Ah   data L1 cache, 8 KB, 2 ways, 32 byte lines\n      case 0x0C: l1 = 16; break;  // 0Ch   data L1 cache, 16 KB, 4 ways, 32 byte lines\n      case 0x0E: l1 = 24; break;  // 0Eh   data L1 cache, 24 KB, 6 ways, 64 byte lines\n      case 0x10: l1 = 16; break;  // 10h   data L1 cache, 16 KB, 4 ways, 32 byte lines (IA-64)\n      case 0x15: l1 = 16; break;  // 15h   code L1 cache, 16 KB, 4 ways, 32 byte lines (IA-64)\n      case 0x2C: l1 = 32; break;  // 2Ch   data L1 cache, 32 KB, 8 ways, 64 byte lines\n      case 0x30: l1 = 32; break;  // 30h   code L1 cache, 32 KB, 8 ways, 64 byte lines\n      case 0x60: l1 = 16; break;  // 60h   data L1 cache, 16 KB, 8 ways, 64 byte lines, sectored\n      case 0x66: l1 = 8; break;   // 66h   data L1 cache, 8 KB, 4 ways, 64 byte lines, sectored\n      case 0x67: l1 = 16; break;  // 67h   data L1 cache, 16 KB, 4 ways, 64 byte lines, sectored\n      case 0x68: l1 = 32; break;  // 68h   data L1 cache, 32 KB, 4 ways, 64 byte lines, sectored\n      case 0x1A: l2 = 96; break;   // code and data L2 cache, 96 KB, 6 ways, 64 byte lines (IA-64)\n      case 0x22: l3 = 512; break;   // code and data L3 cache, 512 KB, 4 ways (!), 64 byte lines, dual-sectored\n      case 0x23: l3 = 1024; break;   // code and data L3 cache, 1024 KB, 8 ways, 64 byte lines, dual-sectored\n      case 0x25: l3 = 2048; break;   // code and data L3 cache, 2048 KB, 8 ways, 64 byte lines, dual-sectored\n      case 0x29: l3 = 4096; break;   // code and data L3 cache, 4096 KB, 8 ways, 64 byte lines, dual-sectored\n      case 0x39: l2 = 128; break;   // code and data L2 cache, 128 KB, 4 ways, 64 byte lines, sectored\n      case 0x3A: l2 = 192; break;   // code and data L2 cache, 192 KB, 6 ways, 64 byte lines, sectored\n      case 0x3B: l2 = 128; break;   // code and data L2 cache, 128 KB, 2 ways, 64 byte lines, sectored\n      case 0x3C: l2 = 256; break;   // code and data L2 cache, 256 KB, 4 ways, 64 byte lines, sectored\n      case 0x3D: l2 = 384; break;   // code and data L2 cache, 384 KB, 6 ways, 64 byte lines, sectored\n      case 0x3E: l2 = 512; break;   // code and data L2 cache, 512 KB, 4 ways, 64 byte lines, sectored\n      case 0x40: l2 = 0; break;   // no integrated L2 cache (P6 core) or L3 cache (P4 core)\n      case 0x41: l2 = 128; break;   // code and data L2 cache, 128 KB, 4 ways, 32 byte lines\n      case 0x42: l2 = 256; break;   // code and data L2 cache, 256 KB, 4 ways, 32 byte lines\n      case 0x43: l2 = 512; break;   // code and data L2 cache, 512 KB, 4 ways, 32 byte lines\n      case 0x44: l2 = 1024; break;   // code and data L2 cache, 1024 KB, 4 ways, 32 byte lines\n      case 0x45: l2 = 2048; break;   // code and data L2 cache, 2048 KB, 4 ways, 32 byte lines\n      case 0x46: l3 = 4096; break;   // code and data L3 cache, 4096 KB, 4 ways, 64 byte lines\n      case 0x47: l3 = 8192; break;   // code and data L3 cache, 8192 KB, 8 ways, 64 byte lines\n      case 0x48: l2 = 3072; break;   // code and data L2 cache, 3072 KB, 12 ways, 64 byte lines\n      case 0x49: if(l2!=0) l3 = 4096; else {check_for_p2_core2=true; l3 = l2 = 4096;} break;// code and data L3 cache, 4096 KB, 16 ways, 64 byte lines (P4) or L2 for core2\n      case 0x4A: l3 = 6144; break;   // code and data L3 cache, 6144 KB, 12 ways, 64 byte lines\n      case 0x4B: l3 = 8192; break;   // code and data L3 cache, 8192 KB, 16 ways, 64 byte lines\n      case 0x4C: l3 = 12288; break;   // code and data L3 cache, 12288 KB, 12 ways, 64 byte lines\n      case 0x4D: l3 = 16384; break;   // code and data L3 cache, 16384 KB, 16 ways, 64 byte lines\n      case 0x4E: l2 = 6144; break;   // code and data L2 cache, 6144 KB, 24 ways, 64 byte lines\n      case 0x78: l2 = 1024; break;   // code and data L2 cache, 1024 KB, 4 ways, 64 byte lines\n      case 0x79: l2 = 128; break;   // code and data L2 cache, 128 KB, 8 ways, 64 byte lines, dual-sectored\n      case 0x7A: l2 = 256; break;   // code and data L2 cache, 256 KB, 8 ways, 64 byte lines, dual-sectored\n      case 0x7B: l2 = 512; break;   // code and data L2 cache, 512 KB, 8 ways, 64 byte lines, dual-sectored\n      case 0x7C: l2 = 1024; break;   // code and data L2 cache, 1024 KB, 8 ways, 64 byte lines, dual-sectored\n      case 0x7D: l2 = 2048; break;   // code and data L2 cache, 2048 KB, 8 ways, 64 byte lines\n      case 0x7E: l2 = 256; break;   // code and data L2 cache, 256 KB, 8 ways, 128 byte lines, sect. (IA-64)\n      case 0x7F: l2 = 512; break;   // code and data L2 cache, 512 KB, 2 ways, 64 byte lines\n      case 0x80: l2 = 512; break;   // code and data L2 cache, 512 KB, 8 ways, 64 byte lines\n      case 0x81: l2 = 128; break;   // code and data L2 cache, 128 KB, 8 ways, 32 byte lines\n      case 0x82: l2 = 256; break;   // code and data L2 cache, 256 KB, 8 ways, 32 byte lines\n      case 0x83: l2 = 512; break;   // code and data L2 cache, 512 KB, 8 ways, 32 byte lines\n      case 0x84: l2 = 1024; break;   // code and data L2 cache, 1024 KB, 8 ways, 32 byte lines\n      case 0x85: l2 = 2048; break;   // code and data L2 cache, 2048 KB, 8 ways, 32 byte lines\n      case 0x86: l2 = 512; break;   // code and data L2 cache, 512 KB, 4 ways, 64 byte lines\n      case 0x87: l2 = 1024; break;   // code and data L2 cache, 1024 KB, 8 ways, 64 byte lines\n      case 0x88: l3 = 2048; break;   // code and data L3 cache, 2048 KB, 4 ways, 64 byte lines (IA-64)\n      case 0x89: l3 = 4096; break;   // code and data L3 cache, 4096 KB, 4 ways, 64 byte lines (IA-64)\n      case 0x8A: l3 = 8192; break;   // code and data L3 cache, 8192 KB, 4 ways, 64 byte lines (IA-64)\n      case 0x8D: l3 = 3072; break;   // code and data L3 cache, 3072 KB, 12 ways, 128 byte lines (IA-64)\n\n      default: break;\n    }\n  }\n  if(check_for_p2_core2 && l2 == l3)\n    l3 = 0;\n  l1 *= 1024;\n  l2 *= 1024;\n  l3 *= 1024;\n}\n\ninline void queryCacheSizes_intel(int& l1, int& l2, int& l3, int max_std_funcs)\n{\n  if(max_std_funcs>=4)\n    queryCacheSizes_intel_direct(l1,l2,l3);\n  else\n    queryCacheSizes_intel_codes(l1,l2,l3);\n}\n\ninline void queryCacheSizes_amd(int& l1, int& l2, int& l3)\n{\n  int abcd[4];\n  abcd[0] = abcd[1] = abcd[2] = abcd[3] = 0;\n  EIGEN_CPUID(abcd,0x80000005,0);\n  l1 = (abcd[2] >> 24) * 1024; // C[31:24] = L1 size in KB\n  abcd[0] = abcd[1] = abcd[2] = abcd[3] = 0;\n  EIGEN_CPUID(abcd,0x80000006,0);\n  l2 = (abcd[2] >> 16) * 1024; // C[31;16] = l2 cache size in KB\n  l3 = ((abcd[3] & 0xFFFC000) >> 18) * 512 * 1024; // D[31;18] = l3 cache size in 512KB\n}\n#endif\n\n/** \\internal\n * Queries and returns the cache sizes in Bytes of the L1, L2, and L3 data caches respectively */\ninline void queryCacheSizes(int& l1, int& l2, int& l3)\n{\n  #ifdef EIGEN_CPUID\n  int abcd[4];\n  const int GenuineIntel[] = {0x756e6547, 0x49656e69, 0x6c65746e};\n  const int AuthenticAMD[] = {0x68747541, 0x69746e65, 0x444d4163};\n  const int AMDisbetter_[] = {0x69444d41, 0x74656273, 0x21726574}; // \"AMDisbetter!\"\n\n  // identify the CPU vendor\n  EIGEN_CPUID(abcd,0x0,0);\n  int max_std_funcs = abcd[1];\n  if(cpuid_is_vendor(abcd,GenuineIntel))\n    queryCacheSizes_intel(l1,l2,l3,max_std_funcs);\n  else if(cpuid_is_vendor(abcd,AuthenticAMD) || cpuid_is_vendor(abcd,AMDisbetter_))\n    queryCacheSizes_amd(l1,l2,l3);\n  else\n    // by default let's use Intel's API\n    queryCacheSizes_intel(l1,l2,l3,max_std_funcs);\n\n  // here is the list of other vendors:\n//   ||cpuid_is_vendor(abcd,\"VIA VIA VIA \")\n//   ||cpuid_is_vendor(abcd,\"CyrixInstead\")\n//   ||cpuid_is_vendor(abcd,\"CentaurHauls\")\n//   ||cpuid_is_vendor(abcd,\"GenuineTMx86\")\n//   ||cpuid_is_vendor(abcd,\"TransmetaCPU\")\n//   ||cpuid_is_vendor(abcd,\"RiseRiseRise\")\n//   ||cpuid_is_vendor(abcd,\"Geode by NSC\")\n//   ||cpuid_is_vendor(abcd,\"SiS SiS SiS \")\n//   ||cpuid_is_vendor(abcd,\"UMC UMC UMC \")\n//   ||cpuid_is_vendor(abcd,\"NexGenDriven\")\n  #else\n  l1 = l2 = l3 = -1;\n  #endif\n}\n\n/** \\internal\n * \\returns the size in Bytes of the L1 data cache */\ninline int queryL1CacheSize()\n{\n  int l1(-1), l2, l3;\n  queryCacheSizes(l1,l2,l3);\n  return l1;\n}\n\n/** \\internal\n * \\returns the size in Bytes of the L2 or L3 cache if this later is present */\ninline int queryTopLevelCacheSize()\n{\n  int l1, l2(-1), l3(-1);\n  queryCacheSizes(l1,l2,l3);\n  return (std::max)(l2,l3);\n}\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_MEMORY_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/util/Meta.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_META_H\n#define EIGEN_META_H\n\nnamespace Eigen {\n\nnamespace internal {\n\n/** \\internal\n  * \\file Meta.h\n  * This file contains generic metaprogramming classes which are not specifically related to Eigen.\n  * \\note In case you wonder, yes we're aware that Boost already provides all these features,\n  * we however don't want to add a dependency to Boost.\n  */\n\nstruct true_type {  enum { value = 1 }; };\nstruct false_type { enum { value = 0 }; };\n\ntemplate<bool Condition, typename Then, typename Else>\nstruct conditional { typedef Then type; };\n\ntemplate<typename Then, typename Else>\nstruct conditional <false, Then, Else> { typedef Else type; };\n\ntemplate<typename T, typename U> struct is_same { enum { value = 0 }; };\ntemplate<typename T> struct is_same<T,T> { enum { value = 1 }; };\n\ntemplate<typename T> struct remove_reference { typedef T type; };\ntemplate<typename T> struct remove_reference<T&> { typedef T type; };\n\ntemplate<typename T> struct remove_pointer { typedef T type; };\ntemplate<typename T> struct remove_pointer<T*> { typedef T type; };\ntemplate<typename T> struct remove_pointer<T*const> { typedef T type; };\n\ntemplate <class T> struct remove_const { typedef T type; };\ntemplate <class T> struct remove_const<const T> { typedef T type; };\ntemplate <class T> struct remove_const<const T[]> { typedef T type[]; };\ntemplate <class T, unsigned int Size> struct remove_const<const T[Size]> { typedef T type[Size]; };\n\ntemplate<typename T> struct remove_all { typedef T type; };\ntemplate<typename T> struct remove_all<const T>   { typedef typename remove_all<T>::type type; };\ntemplate<typename T> struct remove_all<T const&>  { typedef typename remove_all<T>::type type; };\ntemplate<typename T> struct remove_all<T&>        { typedef typename remove_all<T>::type type; };\ntemplate<typename T> struct remove_all<T const*>  { typedef typename remove_all<T>::type type; };\ntemplate<typename T> struct remove_all<T*>        { typedef typename remove_all<T>::type type; };\n\ntemplate<typename T> struct is_arithmetic      { enum { value = false }; };\ntemplate<> struct is_arithmetic<float>         { enum { value = true }; };\ntemplate<> struct is_arithmetic<double>        { enum { value = true }; };\ntemplate<> struct is_arithmetic<long double>   { enum { value = true }; };\ntemplate<> struct is_arithmetic<bool>          { enum { value = true }; };\ntemplate<> struct is_arithmetic<char>          { enum { value = true }; };\ntemplate<> struct is_arithmetic<signed char>   { enum { value = true }; };\ntemplate<> struct is_arithmetic<unsigned char> { enum { value = true }; };\ntemplate<> struct is_arithmetic<signed short>  { enum { value = true }; };\ntemplate<> struct is_arithmetic<unsigned short>{ enum { value = true }; };\ntemplate<> struct is_arithmetic<signed int>    { enum { value = true }; };\ntemplate<> struct is_arithmetic<unsigned int>  { enum { value = true }; };\ntemplate<> struct is_arithmetic<signed long>   { enum { value = true }; };\ntemplate<> struct is_arithmetic<unsigned long> { enum { value = true }; };\n\ntemplate <typename T> struct add_const { typedef const T type; };\ntemplate <typename T> struct add_const<T&> { typedef T& type; };\n\ntemplate <typename T> struct is_const { enum { value = 0 }; };\ntemplate <typename T> struct is_const<T const> { enum { value = 1 }; };\n\ntemplate<typename T> struct add_const_on_value_type            { typedef const T type;  };\ntemplate<typename T> struct add_const_on_value_type<T&>        { typedef T const& type; };\ntemplate<typename T> struct add_const_on_value_type<T*>        { typedef T const* type; };\ntemplate<typename T> struct add_const_on_value_type<T* const>  { typedef T const* const type; };\ntemplate<typename T> struct add_const_on_value_type<T const* const>  { typedef T const* const type; };\n\n/** \\internal Allows to enable/disable an overload\n  * according to a compile time condition.\n  */\ntemplate<bool Condition, typename T> struct enable_if;\n\ntemplate<typename T> struct enable_if<true,T>\n{ typedef T type; };\n\n\n\n/** \\internal\n  * A base class do disable default copy ctor and copy assignement operator.\n  */\nclass noncopyable\n{\n  noncopyable(const noncopyable&);\n  const noncopyable& operator=(const noncopyable&);\nprotected:\n  noncopyable() {}\n  ~noncopyable() {}\n};\n\n\n/** \\internal\n  * Convenient struct to get the result type of a unary or binary functor.\n  *\n  * It supports both the current STL mechanism (using the result_type member) as well as\n  * upcoming next STL generation (using a templated result member).\n  * If none of these members is provided, then the type of the first argument is returned. FIXME, that behavior is a pretty bad hack.\n  */\ntemplate<typename T> struct result_of {};\n\nstruct has_none {int a[1];};\nstruct has_std_result_type {int a[2];};\nstruct has_tr1_result {int a[3];};\n\ntemplate<typename Func, typename ArgType, int SizeOf=sizeof(has_none)>\nstruct unary_result_of_select {typedef ArgType type;};\n\ntemplate<typename Func, typename ArgType>\nstruct unary_result_of_select<Func, ArgType, sizeof(has_std_result_type)> {typedef typename Func::result_type type;};\n\ntemplate<typename Func, typename ArgType>\nstruct unary_result_of_select<Func, ArgType, sizeof(has_tr1_result)> {typedef typename Func::template result<Func(ArgType)>::type type;};\n\ntemplate<typename Func, typename ArgType>\nstruct result_of<Func(ArgType)> {\n    template<typename T>\n    static has_std_result_type testFunctor(T const *, typename T::result_type const * = 0);\n    template<typename T>\n    static has_tr1_result      testFunctor(T const *, typename T::template result<T(ArgType)>::type const * = 0);\n    static has_none            testFunctor(...);\n\n    // note that the following indirection is needed for gcc-3.3\n    enum {FunctorType = sizeof(testFunctor(static_cast<Func*>(0)))};\n    typedef typename unary_result_of_select<Func, ArgType, FunctorType>::type type;\n};\n\ntemplate<typename Func, typename ArgType0, typename ArgType1, int SizeOf=sizeof(has_none)>\nstruct binary_result_of_select {typedef ArgType0 type;};\n\ntemplate<typename Func, typename ArgType0, typename ArgType1>\nstruct binary_result_of_select<Func, ArgType0, ArgType1, sizeof(has_std_result_type)>\n{typedef typename Func::result_type type;};\n\ntemplate<typename Func, typename ArgType0, typename ArgType1>\nstruct binary_result_of_select<Func, ArgType0, ArgType1, sizeof(has_tr1_result)>\n{typedef typename Func::template result<Func(ArgType0,ArgType1)>::type type;};\n\ntemplate<typename Func, typename ArgType0, typename ArgType1>\nstruct result_of<Func(ArgType0,ArgType1)> {\n    template<typename T>\n    static has_std_result_type testFunctor(T const *, typename T::result_type const * = 0);\n    template<typename T>\n    static has_tr1_result      testFunctor(T const *, typename T::template result<T(ArgType0,ArgType1)>::type const * = 0);\n    static has_none            testFunctor(...);\n\n    // note that the following indirection is needed for gcc-3.3\n    enum {FunctorType = sizeof(testFunctor(static_cast<Func*>(0)))};\n    typedef typename binary_result_of_select<Func, ArgType0, ArgType1, FunctorType>::type type;\n};\n\n/** \\internal In short, it computes int(sqrt(\\a Y)) with \\a Y an integer.\n  * Usage example: \\code meta_sqrt<1023>::ret \\endcode\n  */\ntemplate<int Y,\n         int InfX = 0,\n         int SupX = ((Y==1) ? 1 : Y/2),\n         bool Done = ((SupX-InfX)<=1 ? true : ((SupX*SupX <= Y) && ((SupX+1)*(SupX+1) > Y))) >\n                                // use ?: instead of || just to shut up a stupid gcc 4.3 warning\nclass meta_sqrt\n{\n    enum {\n      MidX = (InfX+SupX)/2,\n      TakeInf = MidX*MidX > Y ? 1 : 0,\n      NewInf = int(TakeInf) ? InfX : int(MidX),\n      NewSup = int(TakeInf) ? int(MidX) : SupX\n    };\n  public:\n    enum { ret = meta_sqrt<Y,NewInf,NewSup>::ret };\n};\n\ntemplate<int Y, int InfX, int SupX>\nclass meta_sqrt<Y, InfX, SupX, true> { public:  enum { ret = (SupX*SupX <= Y) ? SupX : InfX }; };\n\n/** \\internal determines whether the product of two numeric types is allowed and what the return type is */\ntemplate<typename T, typename U> struct scalar_product_traits\n{\n  enum { Defined = 0 };\n};\n\ntemplate<typename T> struct scalar_product_traits<T,T>\n{\n  enum {\n    // Cost = NumTraits<T>::MulCost,\n    Defined = 1\n  };\n  typedef T ReturnType;\n};\n\ntemplate<typename T> struct scalar_product_traits<T,std::complex<T> >\n{\n  enum {\n    // Cost = 2*NumTraits<T>::MulCost,\n    Defined = 1\n  };\n  typedef std::complex<T> ReturnType;\n};\n\ntemplate<typename T> struct scalar_product_traits<std::complex<T>, T>\n{\n  enum {\n    // Cost = 2*NumTraits<T>::MulCost,\n    Defined = 1\n  };\n  typedef std::complex<T> ReturnType;\n};\n\n// FIXME quick workaround around current limitation of result_of\n// template<typename Scalar, typename ArgType0, typename ArgType1>\n// struct result_of<scalar_product_op<Scalar>(ArgType0,ArgType1)> {\n// typedef typename scalar_product_traits<typename remove_all<ArgType0>::type, typename remove_all<ArgType1>::type>::ReturnType type;\n// };\n\ntemplate<typename T> struct is_diagonal\n{ enum { ret = false }; };\n\ntemplate<typename T> struct is_diagonal<DiagonalBase<T> >\n{ enum { ret = true }; };\n\ntemplate<typename T> struct is_diagonal<DiagonalWrapper<T> >\n{ enum { ret = true }; };\n\ntemplate<typename T, int S> struct is_diagonal<DiagonalMatrix<T,S> >\n{ enum { ret = true }; };\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_META_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/util/NonMPL2.h",
    "content": "#ifdef EIGEN_MPL2_ONLY\n#error Including non-MPL2 code in EIGEN_MPL2_ONLY mode\n#endif\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/util/ReenableStupidWarnings.h",
    "content": "#ifdef EIGEN_WARNINGS_DISABLED\n#undef EIGEN_WARNINGS_DISABLED\n\n#ifndef EIGEN_PERMANENTLY_DISABLE_STUPID_WARNINGS\n  #ifdef _MSC_VER\n    #pragma warning( pop )\n  #elif defined __INTEL_COMPILER\n    #pragma warning pop\n  #elif defined __clang__\n    #pragma clang diagnostic pop\n  #elif defined __GNUC__ && __GNUC__>=6\n    #pragma GCC diagnostic pop\n  #endif\n\n#endif\n\n#endif // EIGEN_WARNINGS_DISABLED\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/util/StaticAssert.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_STATIC_ASSERT_H\n#define EIGEN_STATIC_ASSERT_H\n\n/* Some notes on Eigen's static assertion mechanism:\n *\n *  - in EIGEN_STATIC_ASSERT(CONDITION,MSG) the parameter CONDITION must be a compile time boolean\n *    expression, and MSG an enum listed in struct internal::static_assertion<true>\n *\n *  - define EIGEN_NO_STATIC_ASSERT to disable them (and save compilation time)\n *    in that case, the static assertion is converted to the following runtime assert:\n *      eigen_assert(CONDITION && \"MSG\")\n *\n *  - currently EIGEN_STATIC_ASSERT can only be used in function scope\n *\n */\n\n#ifndef EIGEN_NO_STATIC_ASSERT\n\n  #if __has_feature(cxx_static_assert) || (defined(__cplusplus) && __cplusplus >= 201103L) || (EIGEN_COMP_MSVC >= 1600)\n\n    // if native static_assert is enabled, let's use it\n    #define EIGEN_STATIC_ASSERT(X,MSG) static_assert(X,#MSG);\n\n  #else // not CXX0X\n\n    namespace Eigen {\n\n    namespace internal {\n\n    template<bool condition>\n    struct static_assertion {};\n\n    template<>\n    struct static_assertion<true>\n    {\n      enum {\n        YOU_TRIED_CALLING_A_VECTOR_METHOD_ON_A_MATRIX,\n        YOU_MIXED_VECTORS_OF_DIFFERENT_SIZES,\n        YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES,\n        THIS_METHOD_IS_ONLY_FOR_VECTORS_OF_A_SPECIFIC_SIZE,\n        THIS_METHOD_IS_ONLY_FOR_MATRICES_OF_A_SPECIFIC_SIZE,\n        THIS_METHOD_IS_ONLY_FOR_OBJECTS_OF_A_SPECIFIC_SIZE,\n        YOU_MADE_A_PROGRAMMING_MISTAKE,\n        EIGEN_INTERNAL_ERROR_PLEASE_FILE_A_BUG_REPORT,\n        EIGEN_INTERNAL_COMPILATION_ERROR_OR_YOU_MADE_A_PROGRAMMING_MISTAKE,\n        YOU_CALLED_A_FIXED_SIZE_METHOD_ON_A_DYNAMIC_SIZE_MATRIX_OR_VECTOR,\n        YOU_CALLED_A_DYNAMIC_SIZE_METHOD_ON_A_FIXED_SIZE_MATRIX_OR_VECTOR,\n        UNALIGNED_LOAD_AND_STORE_OPERATIONS_UNIMPLEMENTED_ON_ALTIVEC,\n        THIS_FUNCTION_IS_NOT_FOR_INTEGER_NUMERIC_TYPES,\n        FLOATING_POINT_ARGUMENT_PASSED__INTEGER_WAS_EXPECTED,\n        NUMERIC_TYPE_MUST_BE_REAL,\n        COEFFICIENT_WRITE_ACCESS_TO_SELFADJOINT_NOT_SUPPORTED,\n        WRITING_TO_TRIANGULAR_PART_WITH_UNIT_DIAGONAL_IS_NOT_SUPPORTED,\n        THIS_METHOD_IS_ONLY_FOR_FIXED_SIZE,\n        INVALID_MATRIX_PRODUCT,\n        INVALID_VECTOR_VECTOR_PRODUCT__IF_YOU_WANTED_A_DOT_OR_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTIONS,\n        INVALID_MATRIX_PRODUCT__IF_YOU_WANTED_A_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTION,\n        YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY,\n        THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES,\n        THIS_METHOD_IS_ONLY_FOR_ROW_MAJOR_MATRICES,\n        INVALID_MATRIX_TEMPLATE_PARAMETERS,\n        INVALID_MATRIXBASE_TEMPLATE_PARAMETERS,\n        BOTH_MATRICES_MUST_HAVE_THE_SAME_STORAGE_ORDER,\n        THIS_METHOD_IS_ONLY_FOR_DIAGONAL_MATRIX,\n        THE_MATRIX_OR_EXPRESSION_THAT_YOU_PASSED_DOES_NOT_HAVE_THE_EXPECTED_TYPE,\n        THIS_METHOD_IS_ONLY_FOR_EXPRESSIONS_WITH_DIRECT_MEMORY_ACCESS_SUCH_AS_MAP_OR_PLAIN_MATRICES,\n        YOU_ALREADY_SPECIFIED_THIS_STRIDE,\n        INVALID_STORAGE_ORDER_FOR_THIS_VECTOR_EXPRESSION,\n        THE_BRACKET_OPERATOR_IS_ONLY_FOR_VECTORS__USE_THE_PARENTHESIS_OPERATOR_INSTEAD,\n        PACKET_ACCESS_REQUIRES_TO_HAVE_INNER_STRIDE_FIXED_TO_1,\n        THIS_METHOD_IS_ONLY_FOR_SPECIFIC_TRANSFORMATIONS,\n        YOU_CANNOT_MIX_ARRAYS_AND_MATRICES,\n        YOU_PERFORMED_AN_INVALID_TRANSFORMATION_CONVERSION,\n        THIS_EXPRESSION_IS_NOT_A_LVALUE__IT_IS_READ_ONLY,\n        YOU_ARE_TRYING_TO_USE_AN_INDEX_BASED_ACCESSOR_ON_AN_EXPRESSION_THAT_DOES_NOT_SUPPORT_THAT,\n        THIS_METHOD_IS_ONLY_FOR_1x1_EXPRESSIONS,\n        THIS_METHOD_IS_ONLY_FOR_EXPRESSIONS_OF_BOOL,\n        THIS_METHOD_IS_ONLY_FOR_ARRAYS_NOT_MATRICES,\n        YOU_PASSED_A_ROW_VECTOR_BUT_A_COLUMN_VECTOR_WAS_EXPECTED,\n        YOU_PASSED_A_COLUMN_VECTOR_BUT_A_ROW_VECTOR_WAS_EXPECTED,\n        THE_INDEX_TYPE_MUST_BE_A_SIGNED_TYPE,\n        THE_STORAGE_ORDER_OF_BOTH_SIDES_MUST_MATCH,\n        OBJECT_ALLOCATED_ON_STACK_IS_TOO_BIG,\n        IMPLICIT_CONVERSION_TO_SCALAR_IS_FOR_INNER_PRODUCT_ONLY,\n        STORAGE_LAYOUT_DOES_NOT_MATCH\n      };\n    };\n\n    } // end namespace internal\n\n    } // end namespace Eigen\n\n    // Specialized implementation for MSVC to avoid \"conditional\n    // expression is constant\" warnings.  This implementation doesn't\n    // appear to work under GCC, hence the multiple implementations.\n    #ifdef _MSC_VER\n\n      #define EIGEN_STATIC_ASSERT(CONDITION,MSG) \\\n        {Eigen::internal::static_assertion<bool(CONDITION)>::MSG;}\n\n    #else\n\n      #define EIGEN_STATIC_ASSERT(CONDITION,MSG) \\\n        if (Eigen::internal::static_assertion<bool(CONDITION)>::MSG) {}\n\n    #endif\n\n  #endif // not CXX0X\n\n#else // EIGEN_NO_STATIC_ASSERT\n\n  #define EIGEN_STATIC_ASSERT(CONDITION,MSG) eigen_assert((CONDITION) && #MSG);\n\n#endif // EIGEN_NO_STATIC_ASSERT\n\n\n// static assertion failing if the type \\a TYPE is not a vector type\n#define EIGEN_STATIC_ASSERT_VECTOR_ONLY(TYPE) \\\n  EIGEN_STATIC_ASSERT(TYPE::IsVectorAtCompileTime, \\\n                      YOU_TRIED_CALLING_A_VECTOR_METHOD_ON_A_MATRIX)\n\n// static assertion failing if the type \\a TYPE is not fixed-size\n#define EIGEN_STATIC_ASSERT_FIXED_SIZE(TYPE) \\\n  EIGEN_STATIC_ASSERT(TYPE::SizeAtCompileTime!=Eigen::Dynamic, \\\n                      YOU_CALLED_A_FIXED_SIZE_METHOD_ON_A_DYNAMIC_SIZE_MATRIX_OR_VECTOR)\n\n// static assertion failing if the type \\a TYPE is not dynamic-size\n#define EIGEN_STATIC_ASSERT_DYNAMIC_SIZE(TYPE) \\\n  EIGEN_STATIC_ASSERT(TYPE::SizeAtCompileTime==Eigen::Dynamic, \\\n                      YOU_CALLED_A_DYNAMIC_SIZE_METHOD_ON_A_FIXED_SIZE_MATRIX_OR_VECTOR)\n\n// static assertion failing if the type \\a TYPE is not a vector type of the given size\n#define EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(TYPE, SIZE) \\\n  EIGEN_STATIC_ASSERT(TYPE::IsVectorAtCompileTime && TYPE::SizeAtCompileTime==SIZE, \\\n                      THIS_METHOD_IS_ONLY_FOR_VECTORS_OF_A_SPECIFIC_SIZE)\n\n// static assertion failing if the type \\a TYPE is not a vector type of the given size\n#define EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(TYPE, ROWS, COLS) \\\n  EIGEN_STATIC_ASSERT(TYPE::RowsAtCompileTime==ROWS && TYPE::ColsAtCompileTime==COLS, \\\n                      THIS_METHOD_IS_ONLY_FOR_MATRICES_OF_A_SPECIFIC_SIZE)\n\n// static assertion failing if the two vector expression types are not compatible (same fixed-size or dynamic size)\n#define EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(TYPE0,TYPE1) \\\n  EIGEN_STATIC_ASSERT( \\\n      (int(TYPE0::SizeAtCompileTime)==Eigen::Dynamic \\\n    || int(TYPE1::SizeAtCompileTime)==Eigen::Dynamic \\\n    || int(TYPE0::SizeAtCompileTime)==int(TYPE1::SizeAtCompileTime)),\\\n    YOU_MIXED_VECTORS_OF_DIFFERENT_SIZES)\n\n#define EIGEN_PREDICATE_SAME_MATRIX_SIZE(TYPE0,TYPE1) \\\n     ( \\\n        (int(TYPE0::SizeAtCompileTime)==0 && int(TYPE1::SizeAtCompileTime)==0) \\\n    || (\\\n          (int(TYPE0::RowsAtCompileTime)==Eigen::Dynamic \\\n        || int(TYPE1::RowsAtCompileTime)==Eigen::Dynamic \\\n        || int(TYPE0::RowsAtCompileTime)==int(TYPE1::RowsAtCompileTime)) \\\n      &&  (int(TYPE0::ColsAtCompileTime)==Eigen::Dynamic \\\n        || int(TYPE1::ColsAtCompileTime)==Eigen::Dynamic \\\n        || int(TYPE0::ColsAtCompileTime)==int(TYPE1::ColsAtCompileTime))\\\n       ) \\\n     )\n\n#ifdef EIGEN2_SUPPORT\n  #define EIGEN_STATIC_ASSERT_NON_INTEGER(TYPE) \\\n    eigen_assert(!NumTraits<Scalar>::IsInteger);\n#else\n  #define EIGEN_STATIC_ASSERT_NON_INTEGER(TYPE) \\\n    EIGEN_STATIC_ASSERT(!NumTraits<TYPE>::IsInteger, THIS_FUNCTION_IS_NOT_FOR_INTEGER_NUMERIC_TYPES)\n#endif\n\n\n// static assertion failing if it is guaranteed at compile-time that the two matrix expression types have different sizes\n#define EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(TYPE0,TYPE1) \\\n  EIGEN_STATIC_ASSERT( \\\n     EIGEN_PREDICATE_SAME_MATRIX_SIZE(TYPE0,TYPE1),\\\n    YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES)\n\n#define EIGEN_STATIC_ASSERT_SIZE_1x1(TYPE) \\\n      EIGEN_STATIC_ASSERT((TYPE::RowsAtCompileTime == 1 || TYPE::RowsAtCompileTime == Dynamic) && \\\n                          (TYPE::ColsAtCompileTime == 1 || TYPE::ColsAtCompileTime == Dynamic), \\\n                          THIS_METHOD_IS_ONLY_FOR_1x1_EXPRESSIONS)\n\n#define EIGEN_STATIC_ASSERT_LVALUE(Derived) \\\n      EIGEN_STATIC_ASSERT(internal::is_lvalue<Derived>::value, \\\n                          THIS_EXPRESSION_IS_NOT_A_LVALUE__IT_IS_READ_ONLY)\n\n#define EIGEN_STATIC_ASSERT_ARRAYXPR(Derived) \\\n      EIGEN_STATIC_ASSERT((internal::is_same<typename internal::traits<Derived>::XprKind, ArrayXpr>::value), \\\n                          THIS_METHOD_IS_ONLY_FOR_ARRAYS_NOT_MATRICES)\n\n#define EIGEN_STATIC_ASSERT_SAME_XPR_KIND(Derived1, Derived2) \\\n      EIGEN_STATIC_ASSERT((internal::is_same<typename internal::traits<Derived1>::XprKind, \\\n                                             typename internal::traits<Derived2>::XprKind \\\n                                            >::value), \\\n                          YOU_CANNOT_MIX_ARRAYS_AND_MATRICES)\n\n\n#endif // EIGEN_STATIC_ASSERT_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Core/util/XprHelper.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_XPRHELPER_H\n#define EIGEN_XPRHELPER_H\n\n// just a workaround because GCC seems to not really like empty structs\n// FIXME: gcc 4.3 generates bad code when strict-aliasing is enabled\n// so currently we simply disable this optimization for gcc 4.3\n#if (defined __GNUG__) && !((__GNUC__==4) && (__GNUC_MINOR__==3))\n  #define EIGEN_EMPTY_STRUCT_CTOR(X) \\\n    EIGEN_STRONG_INLINE X() {} \\\n    EIGEN_STRONG_INLINE X(const X& ) {}\n#else\n  #define EIGEN_EMPTY_STRUCT_CTOR(X)\n#endif\n\nnamespace Eigen {\n\ntypedef EIGEN_DEFAULT_DENSE_INDEX_TYPE DenseIndex;\n\nnamespace internal {\n\n//classes inheriting no_assignment_operator don't generate a default operator=.\nclass no_assignment_operator\n{\n  private:\n    no_assignment_operator& operator=(const no_assignment_operator&);\n};\n\n/** \\internal return the index type with the largest number of bits */\ntemplate<typename I1, typename I2>\nstruct promote_index_type\n{\n  typedef typename conditional<(sizeof(I1)<sizeof(I2)), I2, I1>::type type;\n};\n\n/** \\internal If the template parameter Value is Dynamic, this class is just a wrapper around a T variable that\n  * can be accessed using value() and setValue().\n  * Otherwise, this class is an empty structure and value() just returns the template parameter Value.\n  */\ntemplate<typename T, int Value> class variable_if_dynamic\n{\n  public:\n    EIGEN_EMPTY_STRUCT_CTOR(variable_if_dynamic)\n    explicit variable_if_dynamic(T v) { EIGEN_ONLY_USED_FOR_DEBUG(v); assert(v == T(Value)); }\n    static T value() { return T(Value); }\n    void setValue(T) {}\n};\n\ntemplate<typename T> class variable_if_dynamic<T, Dynamic>\n{\n    T m_value;\n    variable_if_dynamic() { assert(false); }\n  public:\n    explicit variable_if_dynamic(T value) : m_value(value) {}\n    T value() const { return m_value; }\n    void setValue(T value) { m_value = value; }\n};\n\n/** \\internal like variable_if_dynamic but for DynamicIndex\n  */\ntemplate<typename T, int Value> class variable_if_dynamicindex\n{\n  public:\n    EIGEN_EMPTY_STRUCT_CTOR(variable_if_dynamicindex)\n    explicit variable_if_dynamicindex(T v) { EIGEN_ONLY_USED_FOR_DEBUG(v); assert(v == T(Value)); }\n    static T value() { return T(Value); }\n    void setValue(T) {}\n};\n\ntemplate<typename T> class variable_if_dynamicindex<T, DynamicIndex>\n{\n    T m_value;\n    variable_if_dynamicindex() { assert(false); }\n  public:\n    explicit variable_if_dynamicindex(T value) : m_value(value) {}\n    T value() const { return m_value; }\n    void setValue(T value) { m_value = value; }\n};\n\ntemplate<typename T> struct functor_traits\n{\n  enum\n  {\n    Cost = 10,\n    PacketAccess = false,\n    IsRepeatable = false\n  };\n};\n\ntemplate<typename T> struct packet_traits;\n\ntemplate<typename T> struct unpacket_traits\n{\n  typedef T type;\n  enum {size=1};\n};\n\ntemplate<typename _Scalar, int _Rows, int _Cols,\n         int _Options = AutoAlign |\n                          ( (_Rows==1 && _Cols!=1) ? RowMajor\n                          : (_Cols==1 && _Rows!=1) ? ColMajor\n                          : EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION ),\n         int _MaxRows = _Rows,\n         int _MaxCols = _Cols\n> class make_proper_matrix_type\n{\n    enum {\n      IsColVector = _Cols==1 && _Rows!=1,\n      IsRowVector = _Rows==1 && _Cols!=1,\n      Options = IsColVector ? (_Options | ColMajor) & ~RowMajor\n              : IsRowVector ? (_Options | RowMajor) & ~ColMajor\n              : _Options\n    };\n  public:\n    typedef Matrix<_Scalar, _Rows, _Cols, Options, _MaxRows, _MaxCols> type;\n};\n\ntemplate<typename Scalar, int Rows, int Cols, int Options, int MaxRows, int MaxCols>\nclass compute_matrix_flags\n{\n    enum {\n      row_major_bit = Options&RowMajor ? RowMajorBit : 0,\n      is_dynamic_size_storage = MaxRows==Dynamic || MaxCols==Dynamic,\n\n      aligned_bit =\n      (\n            ((Options&DontAlign)==0)\n        && (\n#if EIGEN_ALIGN_STATICALLY\n             ((!is_dynamic_size_storage) && (((MaxCols*MaxRows*int(sizeof(Scalar))) % 16) == 0))\n#else\n             0\n#endif\n\n          ||\n\n#if EIGEN_ALIGN\n             is_dynamic_size_storage\n#else\n             0\n#endif\n\n          )\n      ) ? AlignedBit : 0,\n      packet_access_bit = packet_traits<Scalar>::Vectorizable && aligned_bit ? PacketAccessBit : 0\n    };\n\n  public:\n    enum { ret = LinearAccessBit | LvalueBit | DirectAccessBit | NestByRefBit | packet_access_bit | row_major_bit | aligned_bit };\n};\n\ntemplate<int _Rows, int _Cols> struct size_at_compile_time\n{\n  enum { ret = (_Rows==Dynamic || _Cols==Dynamic) ? Dynamic : _Rows * _Cols };\n};\n\n/* plain_matrix_type : the difference from eval is that plain_matrix_type is always a plain matrix type,\n * whereas eval is a const reference in the case of a matrix\n */\n\ntemplate<typename T, typename StorageKind = typename traits<T>::StorageKind> struct plain_matrix_type;\ntemplate<typename T, typename BaseClassType> struct plain_matrix_type_dense;\ntemplate<typename T> struct plain_matrix_type<T,Dense>\n{\n  typedef typename plain_matrix_type_dense<T,typename traits<T>::XprKind>::type type;\n};\n\ntemplate<typename T> struct plain_matrix_type_dense<T,MatrixXpr>\n{\n  typedef Matrix<typename traits<T>::Scalar,\n                traits<T>::RowsAtCompileTime,\n                traits<T>::ColsAtCompileTime,\n                AutoAlign | (traits<T>::Flags&RowMajorBit ? RowMajor : ColMajor),\n                traits<T>::MaxRowsAtCompileTime,\n                traits<T>::MaxColsAtCompileTime\n          > type;\n};\n\ntemplate<typename T> struct plain_matrix_type_dense<T,ArrayXpr>\n{\n  typedef Array<typename traits<T>::Scalar,\n                traits<T>::RowsAtCompileTime,\n                traits<T>::ColsAtCompileTime,\n                AutoAlign | (traits<T>::Flags&RowMajorBit ? RowMajor : ColMajor),\n                traits<T>::MaxRowsAtCompileTime,\n                traits<T>::MaxColsAtCompileTime\n          > type;\n};\n\n/* eval : the return type of eval(). For matrices, this is just a const reference\n * in order to avoid a useless copy\n */\n\ntemplate<typename T, typename StorageKind = typename traits<T>::StorageKind> struct eval;\n\ntemplate<typename T> struct eval<T,Dense>\n{\n  typedef typename plain_matrix_type<T>::type type;\n//   typedef typename T::PlainObject type;\n//   typedef T::Matrix<typename traits<T>::Scalar,\n//                 traits<T>::RowsAtCompileTime,\n//                 traits<T>::ColsAtCompileTime,\n//                 AutoAlign | (traits<T>::Flags&RowMajorBit ? RowMajor : ColMajor),\n//                 traits<T>::MaxRowsAtCompileTime,\n//                 traits<T>::MaxColsAtCompileTime\n//           > type;\n};\n\n// for matrices, no need to evaluate, just use a const reference to avoid a useless copy\ntemplate<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>\nstruct eval<Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>, Dense>\n{\n  typedef const Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>& type;\n};\n\ntemplate<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>\nstruct eval<Array<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>, Dense>\n{\n  typedef const Array<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>& type;\n};\n\n\n\n/* plain_matrix_type_column_major : same as plain_matrix_type but guaranteed to be column-major\n */\ntemplate<typename T> struct plain_matrix_type_column_major\n{\n  enum { Rows = traits<T>::RowsAtCompileTime,\n         Cols = traits<T>::ColsAtCompileTime,\n         MaxRows = traits<T>::MaxRowsAtCompileTime,\n         MaxCols = traits<T>::MaxColsAtCompileTime\n  };\n  typedef Matrix<typename traits<T>::Scalar,\n                Rows,\n                Cols,\n                (MaxRows==1&&MaxCols!=1) ? RowMajor : ColMajor,\n                MaxRows,\n                MaxCols\n          > type;\n};\n\n/* plain_matrix_type_row_major : same as plain_matrix_type but guaranteed to be row-major\n */\ntemplate<typename T> struct plain_matrix_type_row_major\n{\n  enum { Rows = traits<T>::RowsAtCompileTime,\n         Cols = traits<T>::ColsAtCompileTime,\n         MaxRows = traits<T>::MaxRowsAtCompileTime,\n         MaxCols = traits<T>::MaxColsAtCompileTime\n  };\n  typedef Matrix<typename traits<T>::Scalar,\n                Rows,\n                Cols,\n                (MaxCols==1&&MaxRows!=1) ? RowMajor : ColMajor,\n                MaxRows,\n                MaxCols\n          > type;\n};\n\n// we should be able to get rid of this one too\ntemplate<typename T> struct must_nest_by_value { enum { ret = false }; };\n\n/** \\internal The reference selector for template expressions. The idea is that we don't\n  * need to use references for expressions since they are light weight proxy\n  * objects which should generate no copying overhead. */\ntemplate <typename T>\nstruct ref_selector\n{\n  typedef typename conditional<\n    bool(traits<T>::Flags & NestByRefBit),\n    T const&,\n    const T\n  >::type type;\n};\n\n/** \\internal Adds the const qualifier on the value-type of T2 if and only if T1 is a const type */\ntemplate<typename T1, typename T2>\nstruct transfer_constness\n{\n  typedef typename conditional<\n    bool(internal::is_const<T1>::value),\n    typename internal::add_const_on_value_type<T2>::type,\n    T2\n  >::type type;\n};\n\n/** \\internal Determines how a given expression should be nested into another one.\n  * For example, when you do a * (b+c), Eigen will determine how the expression b+c should be\n  * nested into the bigger product expression. The choice is between nesting the expression b+c as-is, or\n  * evaluating that expression b+c into a temporary variable d, and nest d so that the resulting expression is\n  * a*d. Evaluating can be beneficial for example if every coefficient access in the resulting expression causes\n  * many coefficient accesses in the nested expressions -- as is the case with matrix product for example.\n  *\n  * \\param T the type of the expression being nested\n  * \\param n the number of coefficient accesses in the nested expression for each coefficient access in the bigger expression.\n  *\n  * Note that if no evaluation occur, then the constness of T is preserved.\n  *\n  * Example. Suppose that a, b, and c are of type Matrix3d. The user forms the expression a*(b+c).\n  * b+c is an expression \"sum of matrices\", which we will denote by S. In order to determine how to nest it,\n  * the Product expression uses: nested<S, 3>::ret, which turns out to be Matrix3d because the internal logic of\n  * nested determined that in this case it was better to evaluate the expression b+c into a temporary. On the other hand,\n  * since a is of type Matrix3d, the Product expression nests it as nested<Matrix3d, 3>::ret, which turns out to be\n  * const Matrix3d&, because the internal logic of nested determined that since a was already a matrix, there was no point\n  * in copying it into another matrix.\n  */\ntemplate<typename T, int n=1, typename PlainObject = typename eval<T>::type> struct nested\n{\n  enum {\n    // for the purpose of this test, to keep it reasonably simple, we arbitrarily choose a value of Dynamic values.\n    // the choice of 10000 makes it larger than any practical fixed value and even most dynamic values.\n    // in extreme cases where these assumptions would be wrong, we would still at worst suffer performance issues\n    // (poor choice of temporaries).\n    // it's important that this value can still be squared without integer overflowing.\n    DynamicAsInteger = 10000,\n    ScalarReadCost = NumTraits<typename traits<T>::Scalar>::ReadCost,\n    ScalarReadCostAsInteger = ScalarReadCost == Dynamic ? int(DynamicAsInteger) : int(ScalarReadCost),\n    CoeffReadCost = traits<T>::CoeffReadCost,\n    CoeffReadCostAsInteger = CoeffReadCost == Dynamic ? int(DynamicAsInteger) : int(CoeffReadCost),\n    NAsInteger = n == Dynamic ? int(DynamicAsInteger) : n,\n    CostEvalAsInteger   = (NAsInteger+1) * ScalarReadCostAsInteger + CoeffReadCostAsInteger,\n    CostNoEvalAsInteger = NAsInteger * CoeffReadCostAsInteger\n  };\n\n  typedef typename conditional<\n      ( (int(traits<T>::Flags) & EvalBeforeNestingBit) ||\n        int(CostEvalAsInteger) < int(CostNoEvalAsInteger)\n      ),\n      PlainObject,\n      typename ref_selector<T>::type\n  >::type type;\n};\n\ntemplate<typename T>\ninline T* const_cast_ptr(const T* ptr)\n{\n  return const_cast<T*>(ptr);\n}\n\ntemplate<typename Derived, typename XprKind = typename traits<Derived>::XprKind>\nstruct dense_xpr_base\n{\n  /* dense_xpr_base should only ever be used on dense expressions, thus falling either into the MatrixXpr or into the ArrayXpr cases */\n};\n\ntemplate<typename Derived>\nstruct dense_xpr_base<Derived, MatrixXpr>\n{\n  typedef MatrixBase<Derived> type;\n};\n\ntemplate<typename Derived>\nstruct dense_xpr_base<Derived, ArrayXpr>\n{\n  typedef ArrayBase<Derived> type;\n};\n\n/** \\internal Helper base class to add a scalar multiple operator\n  * overloads for complex types */\ntemplate<typename Derived, typename Scalar, typename OtherScalar, typename BaseType,\n         bool EnableIt = !is_same<Scalar,OtherScalar>::value >\nstruct special_scalar_op_base : public BaseType\n{\n  // dummy operator* so that the\n  // \"using special_scalar_op_base::operator*\" compiles\n  void operator*() const;\n};\n\ntemplate<typename Derived,typename Scalar,typename OtherScalar, typename BaseType>\nstruct special_scalar_op_base<Derived,Scalar,OtherScalar,BaseType,true>  : public BaseType\n{\n  const CwiseUnaryOp<scalar_multiple2_op<Scalar,OtherScalar>, Derived>\n  operator*(const OtherScalar& scalar) const\n  {\n    return CwiseUnaryOp<scalar_multiple2_op<Scalar,OtherScalar>, Derived>\n      (*static_cast<const Derived*>(this), scalar_multiple2_op<Scalar,OtherScalar>(scalar));\n  }\n\n  inline friend const CwiseUnaryOp<scalar_multiple2_op<Scalar,OtherScalar>, Derived>\n  operator*(const OtherScalar& scalar, const Derived& matrix)\n  { return static_cast<const special_scalar_op_base&>(matrix).operator*(scalar); }\n};\n\ntemplate<typename XprType, typename CastType> struct cast_return_type\n{\n  typedef typename XprType::Scalar CurrentScalarType;\n  typedef typename remove_all<CastType>::type _CastType;\n  typedef typename _CastType::Scalar NewScalarType;\n  typedef typename conditional<is_same<CurrentScalarType,NewScalarType>::value,\n                              const XprType&,CastType>::type type;\n};\n\ntemplate <typename A, typename B> struct promote_storage_type;\n\ntemplate <typename A> struct promote_storage_type<A,A>\n{\n  typedef A ret;\n};\n\n/** \\internal gives the plain matrix or array type to store a row/column/diagonal of a matrix type.\n  * \\param Scalar optional parameter allowing to pass a different scalar type than the one of the MatrixType.\n  */\ntemplate<typename ExpressionType, typename Scalar = typename ExpressionType::Scalar>\nstruct plain_row_type\n{\n  typedef Matrix<Scalar, 1, ExpressionType::ColsAtCompileTime,\n                 ExpressionType::PlainObject::Options | RowMajor, 1, ExpressionType::MaxColsAtCompileTime> MatrixRowType;\n  typedef Array<Scalar, 1, ExpressionType::ColsAtCompileTime,\n                 ExpressionType::PlainObject::Options | RowMajor, 1, ExpressionType::MaxColsAtCompileTime> ArrayRowType;\n\n  typedef typename conditional<\n    is_same< typename traits<ExpressionType>::XprKind, MatrixXpr >::value,\n    MatrixRowType,\n    ArrayRowType \n  >::type type;\n};\n\ntemplate<typename ExpressionType, typename Scalar = typename ExpressionType::Scalar>\nstruct plain_col_type\n{\n  typedef Matrix<Scalar, ExpressionType::RowsAtCompileTime, 1,\n                 ExpressionType::PlainObject::Options & ~RowMajor, ExpressionType::MaxRowsAtCompileTime, 1> MatrixColType;\n  typedef Array<Scalar, ExpressionType::RowsAtCompileTime, 1,\n                 ExpressionType::PlainObject::Options & ~RowMajor, ExpressionType::MaxRowsAtCompileTime, 1> ArrayColType;\n\n  typedef typename conditional<\n    is_same< typename traits<ExpressionType>::XprKind, MatrixXpr >::value,\n    MatrixColType,\n    ArrayColType \n  >::type type;\n};\n\ntemplate<typename ExpressionType, typename Scalar = typename ExpressionType::Scalar>\nstruct plain_diag_type\n{\n  enum { diag_size = EIGEN_SIZE_MIN_PREFER_DYNAMIC(ExpressionType::RowsAtCompileTime, ExpressionType::ColsAtCompileTime),\n         max_diag_size = EIGEN_SIZE_MIN_PREFER_FIXED(ExpressionType::MaxRowsAtCompileTime, ExpressionType::MaxColsAtCompileTime)\n  };\n  typedef Matrix<Scalar, diag_size, 1, ExpressionType::PlainObject::Options & ~RowMajor, max_diag_size, 1> MatrixDiagType;\n  typedef Array<Scalar, diag_size, 1, ExpressionType::PlainObject::Options & ~RowMajor, max_diag_size, 1> ArrayDiagType;\n\n  typedef typename conditional<\n    is_same< typename traits<ExpressionType>::XprKind, MatrixXpr >::value,\n    MatrixDiagType,\n    ArrayDiagType \n  >::type type;\n};\n\ntemplate<typename ExpressionType>\nstruct is_lvalue\n{\n  enum { value = !bool(is_const<ExpressionType>::value) &&\n                 bool(traits<ExpressionType>::Flags & LvalueBit) };\n};\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_XPRHELPER_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigen2Support/Block.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_BLOCK2_H\n#define EIGEN_BLOCK2_H\n\nnamespace Eigen { \n\n/** \\returns a dynamic-size expression of a corner of *this.\n  *\n  * \\param type the type of corner. Can be \\a Eigen::TopLeft, \\a Eigen::TopRight,\n  * \\a Eigen::BottomLeft, \\a Eigen::BottomRight.\n  * \\param cRows the number of rows in the corner\n  * \\param cCols the number of columns in the corner\n  *\n  * Example: \\include MatrixBase_corner_enum_int_int.cpp\n  * Output: \\verbinclude MatrixBase_corner_enum_int_int.out\n  *\n  * \\note Even though the returned expression has dynamic size, in the case\n  * when it is applied to a fixed-size matrix, it inherits a fixed maximal size,\n  * which means that evaluating it does not cause a dynamic memory allocation.\n  *\n  * \\sa class Block, block(Index,Index,Index,Index)\n  */\ntemplate<typename Derived>\ninline Block<Derived> DenseBase<Derived>\n  ::corner(CornerType type, Index cRows, Index cCols)\n{\n  switch(type)\n  {\n    default:\n      eigen_assert(false && \"Bad corner type.\");\n    case TopLeft:\n      return Block<Derived>(derived(), 0, 0, cRows, cCols);\n    case TopRight:\n      return Block<Derived>(derived(), 0, cols() - cCols, cRows, cCols);\n    case BottomLeft:\n      return Block<Derived>(derived(), rows() - cRows, 0, cRows, cCols);\n    case BottomRight:\n      return Block<Derived>(derived(), rows() - cRows, cols() - cCols, cRows, cCols);\n  }\n}\n\n/** This is the const version of corner(CornerType, Index, Index).*/\ntemplate<typename Derived>\ninline const Block<Derived>\nDenseBase<Derived>::corner(CornerType type, Index cRows, Index cCols) const\n{\n  switch(type)\n  {\n    default:\n      eigen_assert(false && \"Bad corner type.\");\n    case TopLeft:\n      return Block<Derived>(derived(), 0, 0, cRows, cCols);\n    case TopRight:\n      return Block<Derived>(derived(), 0, cols() - cCols, cRows, cCols);\n    case BottomLeft:\n      return Block<Derived>(derived(), rows() - cRows, 0, cRows, cCols);\n    case BottomRight:\n      return Block<Derived>(derived(), rows() - cRows, cols() - cCols, cRows, cCols);\n  }\n}\n\n/** \\returns a fixed-size expression of a corner of *this.\n  *\n  * \\param type the type of corner. Can be \\a Eigen::TopLeft, \\a Eigen::TopRight,\n  * \\a Eigen::BottomLeft, \\a Eigen::BottomRight.\n  *\n  * The template parameters CRows and CCols arethe number of rows and columns in the corner.\n  *\n  * Example: \\include MatrixBase_template_int_int_corner_enum.cpp\n  * Output: \\verbinclude MatrixBase_template_int_int_corner_enum.out\n  *\n  * \\sa class Block, block(Index,Index,Index,Index)\n  */\ntemplate<typename Derived>\ntemplate<int CRows, int CCols>\ninline Block<Derived, CRows, CCols>\nDenseBase<Derived>::corner(CornerType type)\n{\n  switch(type)\n  {\n    default:\n      eigen_assert(false && \"Bad corner type.\");\n    case TopLeft:\n      return Block<Derived, CRows, CCols>(derived(), 0, 0);\n    case TopRight:\n      return Block<Derived, CRows, CCols>(derived(), 0, cols() - CCols);\n    case BottomLeft:\n      return Block<Derived, CRows, CCols>(derived(), rows() - CRows, 0);\n    case BottomRight:\n      return Block<Derived, CRows, CCols>(derived(), rows() - CRows, cols() - CCols);\n  }\n}\n\n/** This is the const version of corner<int, int>(CornerType).*/\ntemplate<typename Derived>\ntemplate<int CRows, int CCols>\ninline const Block<Derived, CRows, CCols>\nDenseBase<Derived>::corner(CornerType type) const\n{\n  switch(type)\n  {\n    default:\n      eigen_assert(false && \"Bad corner type.\");\n    case TopLeft:\n      return Block<Derived, CRows, CCols>(derived(), 0, 0);\n    case TopRight:\n      return Block<Derived, CRows, CCols>(derived(), 0, cols() - CCols);\n    case BottomLeft:\n      return Block<Derived, CRows, CCols>(derived(), rows() - CRows, 0);\n    case BottomRight:\n      return Block<Derived, CRows, CCols>(derived(), rows() - CRows, cols() - CCols);\n  }\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_BLOCK2_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigen2Support/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_Eigen2Support_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_Eigen2Support_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/Eigen2Support COMPONENT Devel\n  )\n\nADD_SUBDIRECTORY(Geometry)"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigen2Support/Cwise.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_CWISE_H\n#define EIGEN_CWISE_H\n\nnamespace Eigen { \n\n/** \\internal\n  * convenient macro to defined the return type of a cwise binary operation */\n#define EIGEN_CWISE_BINOP_RETURN_TYPE(OP) \\\n    CwiseBinaryOp<OP<typename internal::traits<ExpressionType>::Scalar>, ExpressionType, OtherDerived>\n\n/** \\internal\n  * convenient macro to defined the return type of a cwise unary operation */\n#define EIGEN_CWISE_UNOP_RETURN_TYPE(OP) \\\n    CwiseUnaryOp<OP<typename internal::traits<ExpressionType>::Scalar>, ExpressionType>\n\n/** \\internal\n  * convenient macro to defined the return type of a cwise comparison to a scalar */\n#define EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(OP) \\\n    CwiseBinaryOp<OP<typename internal::traits<ExpressionType>::Scalar>, ExpressionType, \\\n        typename ExpressionType::ConstantReturnType >\n\n/** \\class Cwise\n  *\n  * \\brief Pseudo expression providing additional coefficient-wise operations\n  *\n  * \\param ExpressionType the type of the object on which to do coefficient-wise operations\n  *\n  * This class represents an expression with additional coefficient-wise features.\n  * It is the return type of MatrixBase::cwise()\n  * and most of the time this is the only way it is used.\n  *\n  * Example: \\include MatrixBase_cwise_const.cpp\n  * Output: \\verbinclude MatrixBase_cwise_const.out\n  *\n  * This class can be extended with the help of the plugin mechanism described on the page\n  * \\ref TopicCustomizingEigen by defining the preprocessor symbol \\c EIGEN_CWISE_PLUGIN.\n  *\n  * \\sa MatrixBase::cwise() const, MatrixBase::cwise()\n  */\ntemplate<typename ExpressionType> class Cwise\n{\n  public:\n\n    typedef typename internal::traits<ExpressionType>::Scalar Scalar;\n    typedef typename internal::conditional<internal::must_nest_by_value<ExpressionType>::ret,\n        ExpressionType, const ExpressionType&>::type ExpressionTypeNested;\n    typedef CwiseUnaryOp<internal::scalar_add_op<Scalar>, ExpressionType> ScalarAddReturnType;\n\n    inline Cwise(const ExpressionType& matrix) : m_matrix(matrix) {}\n\n    /** \\internal */\n    inline const ExpressionType& _expression() const { return m_matrix; }\n\n    template<typename OtherDerived>\n    const EIGEN_CWISE_PRODUCT_RETURN_TYPE(ExpressionType,OtherDerived)\n    operator*(const MatrixBase<OtherDerived> &other) const;\n\n    template<typename OtherDerived>\n    const EIGEN_CWISE_BINOP_RETURN_TYPE(internal::scalar_quotient_op)\n    operator/(const MatrixBase<OtherDerived> &other) const;\n\n    /** \\deprecated ArrayBase::min() */\n    template<typename OtherDerived>\n    const EIGEN_CWISE_BINOP_RETURN_TYPE(internal::scalar_min_op)\n    (min)(const MatrixBase<OtherDerived> &other) const\n    { return EIGEN_CWISE_BINOP_RETURN_TYPE(internal::scalar_min_op)(_expression(), other.derived()); }\n\n    /** \\deprecated ArrayBase::max() */\n    template<typename OtherDerived>\n    const EIGEN_CWISE_BINOP_RETURN_TYPE(internal::scalar_max_op)\n    (max)(const MatrixBase<OtherDerived> &other) const\n    { return EIGEN_CWISE_BINOP_RETURN_TYPE(internal::scalar_max_op)(_expression(), other.derived()); }\n\n    const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_abs_op)      abs() const;\n    const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_abs2_op)     abs2() const;\n    const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_square_op)   square() const;\n    const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_cube_op)     cube() const;\n    const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_inverse_op)  inverse() const;\n    const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_sqrt_op)     sqrt() const;\n    const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_exp_op)      exp() const;\n    const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_log_op)      log() const;\n    const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_cos_op)      cos() const;\n    const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_sin_op)      sin() const;\n    const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_pow_op)      pow(const Scalar& exponent) const;\n\n    const ScalarAddReturnType\n    operator+(const Scalar& scalar) const;\n\n    /** \\relates Cwise */\n    friend const ScalarAddReturnType\n    operator+(const Scalar& scalar, const Cwise& mat)\n    { return mat + scalar; }\n\n    ExpressionType& operator+=(const Scalar& scalar);\n\n    const ScalarAddReturnType\n    operator-(const Scalar& scalar) const;\n\n    ExpressionType& operator-=(const Scalar& scalar);\n\n    template<typename OtherDerived>\n    inline ExpressionType& operator*=(const MatrixBase<OtherDerived> &other);\n\n    template<typename OtherDerived>\n    inline ExpressionType& operator/=(const MatrixBase<OtherDerived> &other);\n\n    template<typename OtherDerived> const EIGEN_CWISE_BINOP_RETURN_TYPE(std::less)\n    operator<(const MatrixBase<OtherDerived>& other) const;\n\n    template<typename OtherDerived> const EIGEN_CWISE_BINOP_RETURN_TYPE(std::less_equal)\n    operator<=(const MatrixBase<OtherDerived>& other) const;\n\n    template<typename OtherDerived> const EIGEN_CWISE_BINOP_RETURN_TYPE(std::greater)\n    operator>(const MatrixBase<OtherDerived>& other) const;\n\n    template<typename OtherDerived> const EIGEN_CWISE_BINOP_RETURN_TYPE(std::greater_equal)\n    operator>=(const MatrixBase<OtherDerived>& other) const;\n\n    template<typename OtherDerived> const EIGEN_CWISE_BINOP_RETURN_TYPE(std::equal_to)\n    operator==(const MatrixBase<OtherDerived>& other) const;\n\n    template<typename OtherDerived> const EIGEN_CWISE_BINOP_RETURN_TYPE(std::not_equal_to)\n    operator!=(const MatrixBase<OtherDerived>& other) const;\n\n    // comparisons to a scalar value\n    const EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::less)\n    operator<(Scalar s) const;\n\n    const EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::less_equal)\n    operator<=(Scalar s) const;\n\n    const EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::greater)\n    operator>(Scalar s) const;\n\n    const EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::greater_equal)\n    operator>=(Scalar s) const;\n\n    const EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::equal_to)\n    operator==(Scalar s) const;\n\n    const EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::not_equal_to)\n    operator!=(Scalar s) const;\n\n    // allow to extend Cwise outside Eigen\n    #ifdef EIGEN_CWISE_PLUGIN\n    #include EIGEN_CWISE_PLUGIN\n    #endif\n\n  protected:\n    ExpressionTypeNested m_matrix;\n};\n\n\n/** \\returns a Cwise wrapper of *this providing additional coefficient-wise operations\n  *\n  * Example: \\include MatrixBase_cwise_const.cpp\n  * Output: \\verbinclude MatrixBase_cwise_const.out\n  *\n  * \\sa class Cwise, cwise()\n  */\ntemplate<typename Derived>\ninline const Cwise<Derived> MatrixBase<Derived>::cwise() const\n{\n  return derived();\n}\n\n/** \\returns a Cwise wrapper of *this providing additional coefficient-wise operations\n  *\n  * Example: \\include MatrixBase_cwise.cpp\n  * Output: \\verbinclude MatrixBase_cwise.out\n  *\n  * \\sa class Cwise, cwise() const\n  */\ntemplate<typename Derived>\ninline Cwise<Derived> MatrixBase<Derived>::cwise()\n{\n  return derived();\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_CWISE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigen2Support/CwiseOperators.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_ARRAY_CWISE_OPERATORS_H\n#define EIGEN_ARRAY_CWISE_OPERATORS_H\n\nnamespace Eigen { \n\n/***************************************************************************\n* The following functions were defined in Core\n***************************************************************************/\n\n\n/** \\deprecated ArrayBase::abs() */\ntemplate<typename ExpressionType>\nEIGEN_STRONG_INLINE const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_abs_op)\nCwise<ExpressionType>::abs() const\n{\n  return _expression();\n}\n\n/** \\deprecated ArrayBase::abs2() */\ntemplate<typename ExpressionType>\nEIGEN_STRONG_INLINE const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_abs2_op)\nCwise<ExpressionType>::abs2() const\n{\n  return _expression();\n}\n\n/** \\deprecated ArrayBase::exp() */\ntemplate<typename ExpressionType>\ninline const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_exp_op)\nCwise<ExpressionType>::exp() const\n{\n  return _expression();\n}\n\n/** \\deprecated ArrayBase::log() */\ntemplate<typename ExpressionType>\ninline const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_log_op)\nCwise<ExpressionType>::log() const\n{\n  return _expression();\n}\n\n/** \\deprecated ArrayBase::operator*() */\ntemplate<typename ExpressionType>\ntemplate<typename OtherDerived>\nEIGEN_STRONG_INLINE const EIGEN_CWISE_PRODUCT_RETURN_TYPE(ExpressionType,OtherDerived)\nCwise<ExpressionType>::operator*(const MatrixBase<OtherDerived> &other) const\n{\n  return EIGEN_CWISE_PRODUCT_RETURN_TYPE(ExpressionType,OtherDerived)(_expression(), other.derived());\n}\n\n/** \\deprecated ArrayBase::operator/() */\ntemplate<typename ExpressionType>\ntemplate<typename OtherDerived>\nEIGEN_STRONG_INLINE const EIGEN_CWISE_BINOP_RETURN_TYPE(internal::scalar_quotient_op)\nCwise<ExpressionType>::operator/(const MatrixBase<OtherDerived> &other) const\n{\n  return EIGEN_CWISE_BINOP_RETURN_TYPE(internal::scalar_quotient_op)(_expression(), other.derived());\n}\n\n/** \\deprecated ArrayBase::operator*=() */\ntemplate<typename ExpressionType>\ntemplate<typename OtherDerived>\ninline ExpressionType& Cwise<ExpressionType>::operator*=(const MatrixBase<OtherDerived> &other)\n{\n  return m_matrix.const_cast_derived() = *this * other;\n}\n\n/** \\deprecated ArrayBase::operator/=() */\ntemplate<typename ExpressionType>\ntemplate<typename OtherDerived>\ninline ExpressionType& Cwise<ExpressionType>::operator/=(const MatrixBase<OtherDerived> &other)\n{\n  return m_matrix.const_cast_derived() = *this / other;\n}\n\n/***************************************************************************\n* The following functions were defined in Array\n***************************************************************************/\n\n// -- unary operators --\n\n/** \\deprecated ArrayBase::sqrt() */\ntemplate<typename ExpressionType>\ninline const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_sqrt_op)\nCwise<ExpressionType>::sqrt() const\n{\n  return _expression();\n}\n\n/** \\deprecated ArrayBase::cos() */\ntemplate<typename ExpressionType>\ninline const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_cos_op)\nCwise<ExpressionType>::cos() const\n{\n  return _expression();\n}\n\n\n/** \\deprecated ArrayBase::sin() */\ntemplate<typename ExpressionType>\ninline const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_sin_op)\nCwise<ExpressionType>::sin() const\n{\n  return _expression();\n}\n\n\n/** \\deprecated ArrayBase::log() */\ntemplate<typename ExpressionType>\ninline const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_pow_op)\nCwise<ExpressionType>::pow(const Scalar& exponent) const\n{\n  return EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_pow_op)(_expression(), internal::scalar_pow_op<Scalar>(exponent));\n}\n\n\n/** \\deprecated ArrayBase::inverse() */\ntemplate<typename ExpressionType>\ninline const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_inverse_op)\nCwise<ExpressionType>::inverse() const\n{\n  return _expression();\n}\n\n/** \\deprecated ArrayBase::square() */\ntemplate<typename ExpressionType>\ninline const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_square_op)\nCwise<ExpressionType>::square() const\n{\n  return _expression();\n}\n\n/** \\deprecated ArrayBase::cube() */\ntemplate<typename ExpressionType>\ninline const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_cube_op)\nCwise<ExpressionType>::cube() const\n{\n  return _expression();\n}\n\n\n// -- binary operators --\n\n/** \\deprecated ArrayBase::operator<() */\ntemplate<typename ExpressionType>\ntemplate<typename OtherDerived>\ninline const EIGEN_CWISE_BINOP_RETURN_TYPE(std::less)\nCwise<ExpressionType>::operator<(const MatrixBase<OtherDerived> &other) const\n{\n  return EIGEN_CWISE_BINOP_RETURN_TYPE(std::less)(_expression(), other.derived());\n}\n\n/** \\deprecated ArrayBase::<=() */\ntemplate<typename ExpressionType>\ntemplate<typename OtherDerived>\ninline const EIGEN_CWISE_BINOP_RETURN_TYPE(std::less_equal)\nCwise<ExpressionType>::operator<=(const MatrixBase<OtherDerived> &other) const\n{\n  return EIGEN_CWISE_BINOP_RETURN_TYPE(std::less_equal)(_expression(), other.derived());\n}\n\n/** \\deprecated ArrayBase::operator>() */\ntemplate<typename ExpressionType>\ntemplate<typename OtherDerived>\ninline const EIGEN_CWISE_BINOP_RETURN_TYPE(std::greater)\nCwise<ExpressionType>::operator>(const MatrixBase<OtherDerived> &other) const\n{\n  return EIGEN_CWISE_BINOP_RETURN_TYPE(std::greater)(_expression(), other.derived());\n}\n\n/** \\deprecated ArrayBase::operator>=() */\ntemplate<typename ExpressionType>\ntemplate<typename OtherDerived>\ninline const EIGEN_CWISE_BINOP_RETURN_TYPE(std::greater_equal)\nCwise<ExpressionType>::operator>=(const MatrixBase<OtherDerived> &other) const\n{\n  return EIGEN_CWISE_BINOP_RETURN_TYPE(std::greater_equal)(_expression(), other.derived());\n}\n\n/** \\deprecated ArrayBase::operator==() */\ntemplate<typename ExpressionType>\ntemplate<typename OtherDerived>\ninline const EIGEN_CWISE_BINOP_RETURN_TYPE(std::equal_to)\nCwise<ExpressionType>::operator==(const MatrixBase<OtherDerived> &other) const\n{\n  return EIGEN_CWISE_BINOP_RETURN_TYPE(std::equal_to)(_expression(), other.derived());\n}\n\n/** \\deprecated ArrayBase::operator!=() */\ntemplate<typename ExpressionType>\ntemplate<typename OtherDerived>\ninline const EIGEN_CWISE_BINOP_RETURN_TYPE(std::not_equal_to)\nCwise<ExpressionType>::operator!=(const MatrixBase<OtherDerived> &other) const\n{\n  return EIGEN_CWISE_BINOP_RETURN_TYPE(std::not_equal_to)(_expression(), other.derived());\n}\n\n// comparisons to scalar value\n\n/** \\deprecated ArrayBase::operator<(Scalar) */\ntemplate<typename ExpressionType>\ninline const EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::less)\nCwise<ExpressionType>::operator<(Scalar s) const\n{\n  return EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::less)(_expression(),\n            typename ExpressionType::ConstantReturnType(_expression().rows(), _expression().cols(), s));\n}\n\n/** \\deprecated ArrayBase::operator<=(Scalar) */\ntemplate<typename ExpressionType>\ninline const EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::less_equal)\nCwise<ExpressionType>::operator<=(Scalar s) const\n{\n  return EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::less_equal)(_expression(),\n            typename ExpressionType::ConstantReturnType(_expression().rows(), _expression().cols(), s));\n}\n\n/** \\deprecated ArrayBase::operator>(Scalar) */\ntemplate<typename ExpressionType>\ninline const EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::greater)\nCwise<ExpressionType>::operator>(Scalar s) const\n{\n  return EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::greater)(_expression(),\n            typename ExpressionType::ConstantReturnType(_expression().rows(), _expression().cols(), s));\n}\n\n/** \\deprecated ArrayBase::operator>=(Scalar) */\ntemplate<typename ExpressionType>\ninline const EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::greater_equal)\nCwise<ExpressionType>::operator>=(Scalar s) const\n{\n  return EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::greater_equal)(_expression(),\n            typename ExpressionType::ConstantReturnType(_expression().rows(), _expression().cols(), s));\n}\n\n/** \\deprecated ArrayBase::operator==(Scalar) */\ntemplate<typename ExpressionType>\ninline const EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::equal_to)\nCwise<ExpressionType>::operator==(Scalar s) const\n{\n  return EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::equal_to)(_expression(),\n            typename ExpressionType::ConstantReturnType(_expression().rows(), _expression().cols(), s));\n}\n\n/** \\deprecated ArrayBase::operator!=(Scalar) */\ntemplate<typename ExpressionType>\ninline const EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::not_equal_to)\nCwise<ExpressionType>::operator!=(Scalar s) const\n{\n  return EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::not_equal_to)(_expression(),\n            typename ExpressionType::ConstantReturnType(_expression().rows(), _expression().cols(), s));\n}\n\n// scalar addition\n\n/** \\deprecated ArrayBase::operator+(Scalar) */\ntemplate<typename ExpressionType>\ninline const typename Cwise<ExpressionType>::ScalarAddReturnType\nCwise<ExpressionType>::operator+(const Scalar& scalar) const\n{\n  return typename Cwise<ExpressionType>::ScalarAddReturnType(m_matrix, internal::scalar_add_op<Scalar>(scalar));\n}\n\n/** \\deprecated ArrayBase::operator+=(Scalar) */\ntemplate<typename ExpressionType>\ninline ExpressionType& Cwise<ExpressionType>::operator+=(const Scalar& scalar)\n{\n  return m_matrix.const_cast_derived() = *this + scalar;\n}\n\n/** \\deprecated ArrayBase::operator-(Scalar) */\ntemplate<typename ExpressionType>\ninline const typename Cwise<ExpressionType>::ScalarAddReturnType\nCwise<ExpressionType>::operator-(const Scalar& scalar) const\n{\n  return *this + (-scalar);\n}\n\n/** \\deprecated ArrayBase::operator-=(Scalar) */\ntemplate<typename ExpressionType>\ninline ExpressionType& Cwise<ExpressionType>::operator-=(const Scalar& scalar)\n{\n  return m_matrix.const_cast_derived() = *this - scalar;\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_ARRAY_CWISE_OPERATORS_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigen2Support/Geometry/AlignedBox.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n// no include guard, we'll include this twice from All.h from Eigen2Support, and it's internal anyway\n\nnamespace Eigen { \n\n/** \\geometry_module \\ingroup Geometry_Module\n  * \\nonstableyet\n  *\n  * \\class AlignedBox\n  *\n  * \\brief An axis aligned box\n  *\n  * \\param _Scalar the type of the scalar coefficients\n  * \\param _AmbientDim the dimension of the ambient space, can be a compile time value or Dynamic.\n  *\n  * This class represents an axis aligned box as a pair of the minimal and maximal corners.\n  */\ntemplate <typename _Scalar, int _AmbientDim>\nclass AlignedBox\n{\npublic:\nEIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_AmbientDim==Dynamic ? Dynamic : _AmbientDim+1)\n  enum { AmbientDimAtCompileTime = _AmbientDim };\n  typedef _Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  typedef Matrix<Scalar,AmbientDimAtCompileTime,1> VectorType;\n\n  /** Default constructor initializing a null box. */\n  inline AlignedBox()\n  { if (AmbientDimAtCompileTime!=Dynamic) setNull(); }\n\n  /** Constructs a null box with \\a _dim the dimension of the ambient space. */\n  inline explicit AlignedBox(int _dim) : m_min(_dim), m_max(_dim)\n  { setNull(); }\n\n  /** Constructs a box with extremities \\a _min and \\a _max. */\n  inline AlignedBox(const VectorType& _min, const VectorType& _max) : m_min(_min), m_max(_max) {}\n\n  /** Constructs a box containing a single point \\a p. */\n  inline explicit AlignedBox(const VectorType& p) : m_min(p), m_max(p) {}\n\n  ~AlignedBox() {}\n\n  /** \\returns the dimension in which the box holds */\n  inline int dim() const { return AmbientDimAtCompileTime==Dynamic ? m_min.size()-1 : AmbientDimAtCompileTime; }\n\n  /** \\returns true if the box is null, i.e, empty. */\n  inline bool isNull() const { return (m_min.cwise() > m_max).any(); }\n\n  /** Makes \\c *this a null/empty box. */\n  inline void setNull()\n  {\n    m_min.setConstant( (std::numeric_limits<Scalar>::max)());\n    m_max.setConstant(-(std::numeric_limits<Scalar>::max)());\n  }\n\n  /** \\returns the minimal corner */\n  inline const VectorType& (min)() const { return m_min; }\n  /** \\returns a non const reference to the minimal corner */\n  inline VectorType& (min)() { return m_min; }\n  /** \\returns the maximal corner */\n  inline const VectorType& (max)() const { return m_max; }\n  /** \\returns a non const reference to the maximal corner */\n  inline VectorType& (max)() { return m_max; }\n\n  /** \\returns true if the point \\a p is inside the box \\c *this. */\n  inline bool contains(const VectorType& p) const\n  { return (m_min.cwise()<=p).all() && (p.cwise()<=m_max).all(); }\n\n  /** \\returns true if the box \\a b is entirely inside the box \\c *this. */\n  inline bool contains(const AlignedBox& b) const\n  { return (m_min.cwise()<=(b.min)()).all() && ((b.max)().cwise()<=m_max).all(); }\n\n  /** Extends \\c *this such that it contains the point \\a p and returns a reference to \\c *this. */\n  inline AlignedBox& extend(const VectorType& p)\n  { m_min = (m_min.cwise().min)(p); m_max = (m_max.cwise().max)(p); return *this; }\n\n  /** Extends \\c *this such that it contains the box \\a b and returns a reference to \\c *this. */\n  inline AlignedBox& extend(const AlignedBox& b)\n  { m_min = (m_min.cwise().min)(b.m_min); m_max = (m_max.cwise().max)(b.m_max); return *this; }\n\n  /** Clamps \\c *this by the box \\a b and returns a reference to \\c *this. */\n  inline AlignedBox& clamp(const AlignedBox& b)\n  { m_min = (m_min.cwise().max)(b.m_min); m_max = (m_max.cwise().min)(b.m_max); return *this; }\n\n  /** Translate \\c *this by the vector \\a t and returns a reference to \\c *this. */\n  inline AlignedBox& translate(const VectorType& t)\n  { m_min += t; m_max += t; return *this; }\n\n  /** \\returns the squared distance between the point \\a p and the box \\c *this,\n    * and zero if \\a p is inside the box.\n    * \\sa exteriorDistance()\n    */\n  inline Scalar squaredExteriorDistance(const VectorType& p) const;\n\n  /** \\returns the distance between the point \\a p and the box \\c *this,\n    * and zero if \\a p is inside the box.\n    * \\sa squaredExteriorDistance()\n    */\n  inline Scalar exteriorDistance(const VectorType& p) const\n  { return ei_sqrt(squaredExteriorDistance(p)); }\n\n  /** \\returns \\c *this with scalar type casted to \\a NewScalarType\n    *\n    * Note that if \\a NewScalarType is equal to the current scalar type of \\c *this\n    * then this function smartly returns a const reference to \\c *this.\n    */\n  template<typename NewScalarType>\n  inline typename internal::cast_return_type<AlignedBox,\n           AlignedBox<NewScalarType,AmbientDimAtCompileTime> >::type cast() const\n  {\n    return typename internal::cast_return_type<AlignedBox,\n                    AlignedBox<NewScalarType,AmbientDimAtCompileTime> >::type(*this);\n  }\n\n  /** Copy constructor with scalar type conversion */\n  template<typename OtherScalarType>\n  inline explicit AlignedBox(const AlignedBox<OtherScalarType,AmbientDimAtCompileTime>& other)\n  {\n    m_min = (other.min)().template cast<Scalar>();\n    m_max = (other.max)().template cast<Scalar>();\n  }\n\n  /** \\returns \\c true if \\c *this is approximately equal to \\a other, within the precision\n    * determined by \\a prec.\n    *\n    * \\sa MatrixBase::isApprox() */\n  bool isApprox(const AlignedBox& other, typename NumTraits<Scalar>::Real prec = precision<Scalar>()) const\n  { return m_min.isApprox(other.m_min, prec) && m_max.isApprox(other.m_max, prec); }\n\nprotected:\n\n  VectorType m_min, m_max;\n};\n\ntemplate<typename Scalar,int AmbiantDim>\ninline Scalar AlignedBox<Scalar,AmbiantDim>::squaredExteriorDistance(const VectorType& p) const\n{\n  Scalar dist2(0);\n  Scalar aux;\n  for (int k=0; k<dim(); ++k)\n  {\n    if ((aux = (p[k]-m_min[k]))<Scalar(0))\n      dist2 += aux*aux;\n    else if ( (aux = (m_max[k]-p[k]))<Scalar(0))\n      dist2 += aux*aux;\n  }\n  return dist2;\n}\n\n} // end namespace Eigen\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigen2Support/Geometry/All.h",
    "content": "#ifndef EIGEN2_GEOMETRY_MODULE_H\n#define EIGEN2_GEOMETRY_MODULE_H\n\n#include <limits>\n\n#ifndef M_PI\n#define M_PI 3.14159265358979323846\n#endif\n\n#if EIGEN2_SUPPORT_STAGE < STAGE20_RESOLVE_API_CONFLICTS\n#include \"RotationBase.h\"\n#include \"Rotation2D.h\"\n#include \"Quaternion.h\"\n#include \"AngleAxis.h\"\n#include \"Transform.h\"\n#include \"Translation.h\"\n#include \"Scaling.h\"\n#include \"AlignedBox.h\"\n#include \"Hyperplane.h\"\n#include \"ParametrizedLine.h\"\n#endif\n\n\n#define RotationBase eigen2_RotationBase\n#define Rotation2D eigen2_Rotation2D\n#define Rotation2Df eigen2_Rotation2Df\n#define Rotation2Dd eigen2_Rotation2Dd\n\n#define Quaternion  eigen2_Quaternion\n#define Quaternionf eigen2_Quaternionf\n#define Quaterniond eigen2_Quaterniond\n\n#define AngleAxis eigen2_AngleAxis\n#define AngleAxisf eigen2_AngleAxisf\n#define AngleAxisd eigen2_AngleAxisd\n\n#define Transform   eigen2_Transform\n#define Transform2f eigen2_Transform2f\n#define Transform2d eigen2_Transform2d\n#define Transform3f eigen2_Transform3f\n#define Transform3d eigen2_Transform3d\n\n#define Translation eigen2_Translation\n#define Translation2f eigen2_Translation2f\n#define Translation2d eigen2_Translation2d\n#define Translation3f eigen2_Translation3f\n#define Translation3d eigen2_Translation3d\n\n#define Scaling eigen2_Scaling\n#define Scaling2f eigen2_Scaling2f\n#define Scaling2d eigen2_Scaling2d\n#define Scaling3f eigen2_Scaling3f\n#define Scaling3d eigen2_Scaling3d\n\n#define AlignedBox eigen2_AlignedBox\n\n#define Hyperplane eigen2_Hyperplane\n#define ParametrizedLine eigen2_ParametrizedLine\n\n#define ei_toRotationMatrix eigen2_ei_toRotationMatrix\n#define ei_quaternion_assign_impl eigen2_ei_quaternion_assign_impl\n#define ei_transform_product_impl eigen2_ei_transform_product_impl\n\n#include \"RotationBase.h\"\n#include \"Rotation2D.h\"\n#include \"Quaternion.h\"\n#include \"AngleAxis.h\"\n#include \"Transform.h\"\n#include \"Translation.h\"\n#include \"Scaling.h\"\n#include \"AlignedBox.h\"\n#include \"Hyperplane.h\"\n#include \"ParametrizedLine.h\"\n\n#undef ei_toRotationMatrix\n#undef ei_quaternion_assign_impl\n#undef ei_transform_product_impl\n\n#undef RotationBase\n#undef Rotation2D\n#undef Rotation2Df\n#undef Rotation2Dd\n\n#undef Quaternion\n#undef Quaternionf\n#undef Quaterniond\n\n#undef AngleAxis\n#undef AngleAxisf\n#undef AngleAxisd\n\n#undef Transform\n#undef Transform2f\n#undef Transform2d\n#undef Transform3f\n#undef Transform3d\n\n#undef Translation\n#undef Translation2f\n#undef Translation2d\n#undef Translation3f\n#undef Translation3d\n\n#undef Scaling\n#undef Scaling2f\n#undef Scaling2d\n#undef Scaling3f\n#undef Scaling3d\n\n#undef AlignedBox\n\n#undef Hyperplane\n#undef ParametrizedLine\n\n#endif // EIGEN2_GEOMETRY_MODULE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigen2Support/Geometry/AngleAxis.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n// no include guard, we'll include this twice from All.h from Eigen2Support, and it's internal anyway\n\nnamespace Eigen { \n\n/** \\geometry_module \\ingroup Geometry_Module\n  *\n  * \\class AngleAxis\n  *\n  * \\brief Represents a 3D rotation as a rotation angle around an arbitrary 3D axis\n  *\n  * \\param _Scalar the scalar type, i.e., the type of the coefficients.\n  *\n  * The following two typedefs are provided for convenience:\n  * \\li \\c AngleAxisf for \\c float\n  * \\li \\c AngleAxisd for \\c double\n  *\n  * \\addexample AngleAxisForEuler \\label How to define a rotation from Euler-angles\n  *\n  * Combined with MatrixBase::Unit{X,Y,Z}, AngleAxis can be used to easily\n  * mimic Euler-angles. Here is an example:\n  * \\include AngleAxis_mimic_euler.cpp\n  * Output: \\verbinclude AngleAxis_mimic_euler.out\n  *\n  * \\note This class is not aimed to be used to store a rotation transformation,\n  * but rather to make easier the creation of other rotation (Quaternion, rotation Matrix)\n  * and transformation objects.\n  *\n  * \\sa class Quaternion, class Transform, MatrixBase::UnitX()\n  */\n\ntemplate<typename _Scalar> struct ei_traits<AngleAxis<_Scalar> >\n{\n  typedef _Scalar Scalar;\n};\n\ntemplate<typename _Scalar>\nclass AngleAxis : public RotationBase<AngleAxis<_Scalar>,3>\n{\n  typedef RotationBase<AngleAxis<_Scalar>,3> Base;\n\npublic:\n\n  using Base::operator*;\n\n  enum { Dim = 3 };\n  /** the scalar type of the coefficients */\n  typedef _Scalar Scalar;\n  typedef Matrix<Scalar,3,3> Matrix3;\n  typedef Matrix<Scalar,3,1> Vector3;\n  typedef Quaternion<Scalar> QuaternionType;\n\nprotected:\n\n  Vector3 m_axis;\n  Scalar m_angle;\n\npublic:\n\n  /** Default constructor without initialization. */\n  AngleAxis() {}\n  /** Constructs and initialize the angle-axis rotation from an \\a angle in radian\n    * and an \\a axis which must be normalized. */\n  template<typename Derived>\n  inline AngleAxis(Scalar angle, const MatrixBase<Derived>& axis) : m_axis(axis), m_angle(angle) {}\n  /** Constructs and initialize the angle-axis rotation from a quaternion \\a q. */\n  inline AngleAxis(const QuaternionType& q) { *this = q; }\n  /** Constructs and initialize the angle-axis rotation from a 3x3 rotation matrix. */\n  template<typename Derived>\n  inline explicit AngleAxis(const MatrixBase<Derived>& m) { *this = m; }\n\n  Scalar angle() const { return m_angle; }\n  Scalar& angle() { return m_angle; }\n\n  const Vector3& axis() const { return m_axis; }\n  Vector3& axis() { return m_axis; }\n\n  /** Concatenates two rotations */\n  inline QuaternionType operator* (const AngleAxis& other) const\n  { return QuaternionType(*this) * QuaternionType(other); }\n\n  /** Concatenates two rotations */\n  inline QuaternionType operator* (const QuaternionType& other) const\n  { return QuaternionType(*this) * other; }\n\n  /** Concatenates two rotations */\n  friend inline QuaternionType operator* (const QuaternionType& a, const AngleAxis& b)\n  { return a * QuaternionType(b); }\n\n  /** Concatenates two rotations */\n  inline Matrix3 operator* (const Matrix3& other) const\n  { return toRotationMatrix() * other; }\n\n  /** Concatenates two rotations */\n  inline friend Matrix3 operator* (const Matrix3& a, const AngleAxis& b)\n  { return a * b.toRotationMatrix(); }\n\n  /** Applies rotation to vector */\n  inline Vector3 operator* (const Vector3& other) const\n  { return toRotationMatrix() * other; }\n\n  /** \\returns the inverse rotation, i.e., an angle-axis with opposite rotation angle */\n  AngleAxis inverse() const\n  { return AngleAxis(-m_angle, m_axis); }\n\n  AngleAxis& operator=(const QuaternionType& q);\n  template<typename Derived>\n  AngleAxis& operator=(const MatrixBase<Derived>& m);\n\n  template<typename Derived>\n  AngleAxis& fromRotationMatrix(const MatrixBase<Derived>& m);\n  Matrix3 toRotationMatrix(void) const;\n\n  /** \\returns \\c *this with scalar type casted to \\a NewScalarType\n    *\n    * Note that if \\a NewScalarType is equal to the current scalar type of \\c *this\n    * then this function smartly returns a const reference to \\c *this.\n    */\n  template<typename NewScalarType>\n  inline typename internal::cast_return_type<AngleAxis,AngleAxis<NewScalarType> >::type cast() const\n  { return typename internal::cast_return_type<AngleAxis,AngleAxis<NewScalarType> >::type(*this); }\n\n  /** Copy constructor with scalar type conversion */\n  template<typename OtherScalarType>\n  inline explicit AngleAxis(const AngleAxis<OtherScalarType>& other)\n  {\n    m_axis = other.axis().template cast<Scalar>();\n    m_angle = Scalar(other.angle());\n  }\n\n  /** \\returns \\c true if \\c *this is approximately equal to \\a other, within the precision\n    * determined by \\a prec.\n    *\n    * \\sa MatrixBase::isApprox() */\n  bool isApprox(const AngleAxis& other, typename NumTraits<Scalar>::Real prec = precision<Scalar>()) const\n  { return m_axis.isApprox(other.m_axis, prec) && ei_isApprox(m_angle,other.m_angle, prec); }\n};\n\n/** \\ingroup Geometry_Module\n  * single precision angle-axis type */\ntypedef AngleAxis<float> AngleAxisf;\n/** \\ingroup Geometry_Module\n  * double precision angle-axis type */\ntypedef AngleAxis<double> AngleAxisd;\n\n/** Set \\c *this from a quaternion.\n  * The axis is normalized.\n  */\ntemplate<typename Scalar>\nAngleAxis<Scalar>& AngleAxis<Scalar>::operator=(const QuaternionType& q)\n{\n  Scalar n2 = q.vec().squaredNorm();\n  if (n2 < precision<Scalar>()*precision<Scalar>())\n  {\n    m_angle = 0;\n    m_axis << 1, 0, 0;\n  }\n  else\n  {\n    m_angle = 2*std::acos(q.w());\n    m_axis = q.vec() / ei_sqrt(n2);\n  }\n  return *this;\n}\n\n/** Set \\c *this from a 3x3 rotation matrix \\a mat.\n  */\ntemplate<typename Scalar>\ntemplate<typename Derived>\nAngleAxis<Scalar>& AngleAxis<Scalar>::operator=(const MatrixBase<Derived>& mat)\n{\n  // Since a direct conversion would not be really faster,\n  // let's use the robust Quaternion implementation:\n  return *this = QuaternionType(mat);\n}\n\n/** Constructs and \\returns an equivalent 3x3 rotation matrix.\n  */\ntemplate<typename Scalar>\ntypename AngleAxis<Scalar>::Matrix3\nAngleAxis<Scalar>::toRotationMatrix(void) const\n{\n  Matrix3 res;\n  Vector3 sin_axis  = ei_sin(m_angle) * m_axis;\n  Scalar c = ei_cos(m_angle);\n  Vector3 cos1_axis = (Scalar(1)-c) * m_axis;\n\n  Scalar tmp;\n  tmp = cos1_axis.x() * m_axis.y();\n  res.coeffRef(0,1) = tmp - sin_axis.z();\n  res.coeffRef(1,0) = tmp + sin_axis.z();\n\n  tmp = cos1_axis.x() * m_axis.z();\n  res.coeffRef(0,2) = tmp + sin_axis.y();\n  res.coeffRef(2,0) = tmp - sin_axis.y();\n\n  tmp = cos1_axis.y() * m_axis.z();\n  res.coeffRef(1,2) = tmp - sin_axis.x();\n  res.coeffRef(2,1) = tmp + sin_axis.x();\n\n  res.diagonal() = (cos1_axis.cwise() * m_axis).cwise() + c;\n\n  return res;\n}\n\n} // end namespace Eigen\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigen2Support/Geometry/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_Eigen2Support_Geometry_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_Eigen2Support_Geometry_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/Eigen2Support/Geometry\n  )\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigen2Support/Geometry/Hyperplane.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>\n// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n// no include guard, we'll include this twice from All.h from Eigen2Support, and it's internal anyway\n\nnamespace Eigen { \n\n/** \\geometry_module \\ingroup Geometry_Module\n  *\n  * \\class Hyperplane\n  *\n  * \\brief A hyperplane\n  *\n  * A hyperplane is an affine subspace of dimension n-1 in a space of dimension n.\n  * For example, a hyperplane in a plane is a line; a hyperplane in 3-space is a plane.\n  *\n  * \\param _Scalar the scalar type, i.e., the type of the coefficients\n  * \\param _AmbientDim the dimension of the ambient space, can be a compile time value or Dynamic.\n  *             Notice that the dimension of the hyperplane is _AmbientDim-1.\n  *\n  * This class represents an hyperplane as the zero set of the implicit equation\n  * \\f$ n \\cdot x + d = 0 \\f$ where \\f$ n \\f$ is a unit normal vector of the plane (linear part)\n  * and \\f$ d \\f$ is the distance (offset) to the origin.\n  */\ntemplate <typename _Scalar, int _AmbientDim>\nclass Hyperplane\n{\npublic:\n  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_AmbientDim==Dynamic ? Dynamic : _AmbientDim+1)\n  enum { AmbientDimAtCompileTime = _AmbientDim };\n  typedef _Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  typedef Matrix<Scalar,AmbientDimAtCompileTime,1> VectorType;\n  typedef Matrix<Scalar,int(AmbientDimAtCompileTime)==Dynamic\n                        ? Dynamic\n                        : int(AmbientDimAtCompileTime)+1,1> Coefficients;\n  typedef Block<Coefficients,AmbientDimAtCompileTime,1> NormalReturnType;\n\n  /** Default constructor without initialization */\n  inline Hyperplane() {}\n\n  /** Constructs a dynamic-size hyperplane with \\a _dim the dimension\n    * of the ambient space */\n  inline explicit Hyperplane(int _dim) : m_coeffs(_dim+1) {}\n\n  /** Construct a plane from its normal \\a n and a point \\a e onto the plane.\n    * \\warning the vector normal is assumed to be normalized.\n    */\n  inline Hyperplane(const VectorType& n, const VectorType& e)\n    : m_coeffs(n.size()+1)\n  {\n    normal() = n;\n    offset() = -e.eigen2_dot(n);\n  }\n\n  /** Constructs a plane from its normal \\a n and distance to the origin \\a d\n    * such that the algebraic equation of the plane is \\f$ n \\cdot x + d = 0 \\f$.\n    * \\warning the vector normal is assumed to be normalized.\n    */\n  inline Hyperplane(const VectorType& n, Scalar d)\n    : m_coeffs(n.size()+1)\n  {\n    normal() = n;\n    offset() = d;\n  }\n\n  /** Constructs a hyperplane passing through the two points. If the dimension of the ambient space\n    * is greater than 2, then there isn't uniqueness, so an arbitrary choice is made.\n    */\n  static inline Hyperplane Through(const VectorType& p0, const VectorType& p1)\n  {\n    Hyperplane result(p0.size());\n    result.normal() = (p1 - p0).unitOrthogonal();\n    result.offset() = -result.normal().eigen2_dot(p0);\n    return result;\n  }\n\n  /** Constructs a hyperplane passing through the three points. The dimension of the ambient space\n    * is required to be exactly 3.\n    */\n  static inline Hyperplane Through(const VectorType& p0, const VectorType& p1, const VectorType& p2)\n  {\n    EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(VectorType, 3)\n    Hyperplane result(p0.size());\n    result.normal() = (p2 - p0).cross(p1 - p0).normalized();\n    result.offset() = -result.normal().eigen2_dot(p0);\n    return result;\n  }\n\n  /** Constructs a hyperplane passing through the parametrized line \\a parametrized.\n    * If the dimension of the ambient space is greater than 2, then there isn't uniqueness,\n    * so an arbitrary choice is made.\n    */\n  // FIXME to be consitent with the rest this could be implemented as a static Through function ??\n  explicit Hyperplane(const ParametrizedLine<Scalar, AmbientDimAtCompileTime>& parametrized)\n  {\n    normal() = parametrized.direction().unitOrthogonal();\n    offset() = -normal().eigen2_dot(parametrized.origin());\n  }\n\n  ~Hyperplane() {}\n\n  /** \\returns the dimension in which the plane holds */\n  inline int dim() const { return int(AmbientDimAtCompileTime)==Dynamic ? m_coeffs.size()-1 : int(AmbientDimAtCompileTime); }\n\n  /** normalizes \\c *this */\n  void normalize(void)\n  {\n    m_coeffs /= normal().norm();\n  }\n\n  /** \\returns the signed distance between the plane \\c *this and a point \\a p.\n    * \\sa absDistance()\n    */\n  inline Scalar signedDistance(const VectorType& p) const { return p.eigen2_dot(normal()) + offset(); }\n\n  /** \\returns the absolute distance between the plane \\c *this and a point \\a p.\n    * \\sa signedDistance()\n    */\n  inline Scalar absDistance(const VectorType& p) const { return ei_abs(signedDistance(p)); }\n\n  /** \\returns the projection of a point \\a p onto the plane \\c *this.\n    */\n  inline VectorType projection(const VectorType& p) const { return p - signedDistance(p) * normal(); }\n\n  /** \\returns a constant reference to the unit normal vector of the plane, which corresponds\n    * to the linear part of the implicit equation.\n    */\n  inline const NormalReturnType normal() const { return NormalReturnType(*const_cast<Coefficients*>(&m_coeffs),0,0,dim(),1); }\n\n  /** \\returns a non-constant reference to the unit normal vector of the plane, which corresponds\n    * to the linear part of the implicit equation.\n    */\n  inline NormalReturnType normal() { return NormalReturnType(m_coeffs,0,0,dim(),1); }\n\n  /** \\returns the distance to the origin, which is also the \"constant term\" of the implicit equation\n    * \\warning the vector normal is assumed to be normalized.\n    */\n  inline const Scalar& offset() const { return m_coeffs.coeff(dim()); }\n\n  /** \\returns a non-constant reference to the distance to the origin, which is also the constant part\n    * of the implicit equation */\n  inline Scalar& offset() { return m_coeffs(dim()); }\n\n  /** \\returns a constant reference to the coefficients c_i of the plane equation:\n    * \\f$ c_0*x_0 + ... + c_{d-1}*x_{d-1} + c_d = 0 \\f$\n    */\n  inline const Coefficients& coeffs() const { return m_coeffs; }\n\n  /** \\returns a non-constant reference to the coefficients c_i of the plane equation:\n    * \\f$ c_0*x_0 + ... + c_{d-1}*x_{d-1} + c_d = 0 \\f$\n    */\n  inline Coefficients& coeffs() { return m_coeffs; }\n\n  /** \\returns the intersection of *this with \\a other.\n    *\n    * \\warning The ambient space must be a plane, i.e. have dimension 2, so that \\c *this and \\a other are lines.\n    *\n    * \\note If \\a other is approximately parallel to *this, this method will return any point on *this.\n    */\n  VectorType intersection(const Hyperplane& other)\n  {\n    EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(VectorType, 2)\n    Scalar det = coeffs().coeff(0) * other.coeffs().coeff(1) - coeffs().coeff(1) * other.coeffs().coeff(0);\n    // since the line equations ax+by=c are normalized with a^2+b^2=1, the following tests\n    // whether the two lines are approximately parallel.\n    if(ei_isMuchSmallerThan(det, Scalar(1)))\n    {   // special case where the two lines are approximately parallel. Pick any point on the first line.\n        if(ei_abs(coeffs().coeff(1))>ei_abs(coeffs().coeff(0)))\n            return VectorType(coeffs().coeff(1), -coeffs().coeff(2)/coeffs().coeff(1)-coeffs().coeff(0));\n        else\n            return VectorType(-coeffs().coeff(2)/coeffs().coeff(0)-coeffs().coeff(1), coeffs().coeff(0));\n    }\n    else\n    {   // general case\n        Scalar invdet = Scalar(1) / det;\n        return VectorType(invdet*(coeffs().coeff(1)*other.coeffs().coeff(2)-other.coeffs().coeff(1)*coeffs().coeff(2)),\n                          invdet*(other.coeffs().coeff(0)*coeffs().coeff(2)-coeffs().coeff(0)*other.coeffs().coeff(2)));\n    }\n  }\n\n  /** Applies the transformation matrix \\a mat to \\c *this and returns a reference to \\c *this.\n    *\n    * \\param mat the Dim x Dim transformation matrix\n    * \\param traits specifies whether the matrix \\a mat represents an Isometry\n    *               or a more generic Affine transformation. The default is Affine.\n    */\n  template<typename XprType>\n  inline Hyperplane& transform(const MatrixBase<XprType>& mat, TransformTraits traits = Affine)\n  {\n    if (traits==Affine)\n      normal() = mat.inverse().transpose() * normal();\n    else if (traits==Isometry)\n      normal() = mat * normal();\n    else\n    {\n      ei_assert(\"invalid traits value in Hyperplane::transform()\");\n    }\n    return *this;\n  }\n\n  /** Applies the transformation \\a t to \\c *this and returns a reference to \\c *this.\n    *\n    * \\param t the transformation of dimension Dim\n    * \\param traits specifies whether the transformation \\a t represents an Isometry\n    *               or a more generic Affine transformation. The default is Affine.\n    *               Other kind of transformations are not supported.\n    */\n  inline Hyperplane& transform(const Transform<Scalar,AmbientDimAtCompileTime>& t,\n                                TransformTraits traits = Affine)\n  {\n    transform(t.linear(), traits);\n    offset() -= t.translation().eigen2_dot(normal());\n    return *this;\n  }\n\n  /** \\returns \\c *this with scalar type casted to \\a NewScalarType\n    *\n    * Note that if \\a NewScalarType is equal to the current scalar type of \\c *this\n    * then this function smartly returns a const reference to \\c *this.\n    */\n  template<typename NewScalarType>\n  inline typename internal::cast_return_type<Hyperplane,\n           Hyperplane<NewScalarType,AmbientDimAtCompileTime> >::type cast() const\n  {\n    return typename internal::cast_return_type<Hyperplane,\n                    Hyperplane<NewScalarType,AmbientDimAtCompileTime> >::type(*this);\n  }\n\n  /** Copy constructor with scalar type conversion */\n  template<typename OtherScalarType>\n  inline explicit Hyperplane(const Hyperplane<OtherScalarType,AmbientDimAtCompileTime>& other)\n  { m_coeffs = other.coeffs().template cast<Scalar>(); }\n\n  /** \\returns \\c true if \\c *this is approximately equal to \\a other, within the precision\n    * determined by \\a prec.\n    *\n    * \\sa MatrixBase::isApprox() */\n  bool isApprox(const Hyperplane& other, typename NumTraits<Scalar>::Real prec = precision<Scalar>()) const\n  { return m_coeffs.isApprox(other.m_coeffs, prec); }\n\nprotected:\n\n  Coefficients m_coeffs;\n};\n\n} // end namespace Eigen\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigen2Support/Geometry/ParametrizedLine.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>\n// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n// no include guard, we'll include this twice from All.h from Eigen2Support, and it's internal anyway\n\nnamespace Eigen { \n\n/** \\geometry_module \\ingroup Geometry_Module\n  *\n  * \\class ParametrizedLine\n  *\n  * \\brief A parametrized line\n  *\n  * A parametrized line is defined by an origin point \\f$ \\mathbf{o} \\f$ and a unit\n  * direction vector \\f$ \\mathbf{d} \\f$ such that the line corresponds to\n  * the set \\f$ l(t) = \\mathbf{o} + t \\mathbf{d} \\f$, \\f$ l \\in \\mathbf{R} \\f$.\n  *\n  * \\param _Scalar the scalar type, i.e., the type of the coefficients\n  * \\param _AmbientDim the dimension of the ambient space, can be a compile time value or Dynamic.\n  */\ntemplate <typename _Scalar, int _AmbientDim>\nclass ParametrizedLine\n{\npublic:\n  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_AmbientDim)\n  enum { AmbientDimAtCompileTime = _AmbientDim };\n  typedef _Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  typedef Matrix<Scalar,AmbientDimAtCompileTime,1> VectorType;\n\n  /** Default constructor without initialization */\n  inline ParametrizedLine() {}\n\n  /** Constructs a dynamic-size line with \\a _dim the dimension\n    * of the ambient space */\n  inline explicit ParametrizedLine(int _dim) : m_origin(_dim), m_direction(_dim) {}\n\n  /** Initializes a parametrized line of direction \\a direction and origin \\a origin.\n    * \\warning the vector direction is assumed to be normalized.\n    */\n  ParametrizedLine(const VectorType& origin, const VectorType& direction)\n    : m_origin(origin), m_direction(direction) {}\n\n  explicit ParametrizedLine(const Hyperplane<_Scalar, _AmbientDim>& hyperplane);\n\n  /** Constructs a parametrized line going from \\a p0 to \\a p1. */\n  static inline ParametrizedLine Through(const VectorType& p0, const VectorType& p1)\n  { return ParametrizedLine(p0, (p1-p0).normalized()); }\n\n  ~ParametrizedLine() {}\n\n  /** \\returns the dimension in which the line holds */\n  inline int dim() const { return m_direction.size(); }\n\n  const VectorType& origin() const { return m_origin; }\n  VectorType& origin() { return m_origin; }\n\n  const VectorType& direction() const { return m_direction; }\n  VectorType& direction() { return m_direction; }\n\n  /** \\returns the squared distance of a point \\a p to its projection onto the line \\c *this.\n    * \\sa distance()\n    */\n  RealScalar squaredDistance(const VectorType& p) const\n  {\n    VectorType diff = p-origin();\n    return (diff - diff.eigen2_dot(direction())* direction()).squaredNorm();\n  }\n  /** \\returns the distance of a point \\a p to its projection onto the line \\c *this.\n    * \\sa squaredDistance()\n    */\n  RealScalar distance(const VectorType& p) const { return ei_sqrt(squaredDistance(p)); }\n\n  /** \\returns the projection of a point \\a p onto the line \\c *this. */\n  VectorType projection(const VectorType& p) const\n  { return origin() + (p-origin()).eigen2_dot(direction()) * direction(); }\n\n  Scalar intersection(const Hyperplane<_Scalar, _AmbientDim>& hyperplane);\n\n  /** \\returns \\c *this with scalar type casted to \\a NewScalarType\n    *\n    * Note that if \\a NewScalarType is equal to the current scalar type of \\c *this\n    * then this function smartly returns a const reference to \\c *this.\n    */\n  template<typename NewScalarType>\n  inline typename internal::cast_return_type<ParametrizedLine,\n           ParametrizedLine<NewScalarType,AmbientDimAtCompileTime> >::type cast() const\n  {\n    return typename internal::cast_return_type<ParametrizedLine,\n                    ParametrizedLine<NewScalarType,AmbientDimAtCompileTime> >::type(*this);\n  }\n\n  /** Copy constructor with scalar type conversion */\n  template<typename OtherScalarType>\n  inline explicit ParametrizedLine(const ParametrizedLine<OtherScalarType,AmbientDimAtCompileTime>& other)\n  {\n    m_origin = other.origin().template cast<Scalar>();\n    m_direction = other.direction().template cast<Scalar>();\n  }\n\n  /** \\returns \\c true if \\c *this is approximately equal to \\a other, within the precision\n    * determined by \\a prec.\n    *\n    * \\sa MatrixBase::isApprox() */\n  bool isApprox(const ParametrizedLine& other, typename NumTraits<Scalar>::Real prec = precision<Scalar>()) const\n  { return m_origin.isApprox(other.m_origin, prec) && m_direction.isApprox(other.m_direction, prec); }\n\nprotected:\n\n  VectorType m_origin, m_direction;\n};\n\n/** Constructs a parametrized line from a 2D hyperplane\n  *\n  * \\warning the ambient space must have dimension 2 such that the hyperplane actually describes a line\n  */\ntemplate <typename _Scalar, int _AmbientDim>\ninline ParametrizedLine<_Scalar, _AmbientDim>::ParametrizedLine(const Hyperplane<_Scalar, _AmbientDim>& hyperplane)\n{\n  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(VectorType, 2)\n  direction() = hyperplane.normal().unitOrthogonal();\n  origin() = -hyperplane.normal()*hyperplane.offset();\n}\n\n/** \\returns the parameter value of the intersection between \\c *this and the given hyperplane\n  */\ntemplate <typename _Scalar, int _AmbientDim>\ninline _Scalar ParametrizedLine<_Scalar, _AmbientDim>::intersection(const Hyperplane<_Scalar, _AmbientDim>& hyperplane)\n{\n  return -(hyperplane.offset()+origin().eigen2_dot(hyperplane.normal()))\n          /(direction().eigen2_dot(hyperplane.normal()));\n}\n\n} // end namespace Eigen\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigen2Support/Geometry/Quaternion.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n// no include guard, we'll include this twice from All.h from Eigen2Support, and it's internal anyway\n\nnamespace Eigen { \n\ntemplate<typename Other,\n         int OtherRows=Other::RowsAtCompileTime,\n         int OtherCols=Other::ColsAtCompileTime>\nstruct ei_quaternion_assign_impl;\n\n/** \\geometry_module \\ingroup Geometry_Module\n  *\n  * \\class Quaternion\n  *\n  * \\brief The quaternion class used to represent 3D orientations and rotations\n  *\n  * \\param _Scalar the scalar type, i.e., the type of the coefficients\n  *\n  * This class represents a quaternion \\f$ w+xi+yj+zk \\f$ that is a convenient representation of\n  * orientations and rotations of objects in three dimensions. Compared to other representations\n  * like Euler angles or 3x3 matrices, quatertions offer the following advantages:\n  * \\li \\b compact storage (4 scalars)\n  * \\li \\b efficient to compose (28 flops),\n  * \\li \\b stable spherical interpolation\n  *\n  * The following two typedefs are provided for convenience:\n  * \\li \\c Quaternionf for \\c float\n  * \\li \\c Quaterniond for \\c double\n  *\n  * \\sa  class AngleAxis, class Transform\n  */\n\ntemplate<typename _Scalar> struct ei_traits<Quaternion<_Scalar> >\n{\n  typedef _Scalar Scalar;\n};\n\ntemplate<typename _Scalar>\nclass Quaternion : public RotationBase<Quaternion<_Scalar>,3>\n{\n  typedef RotationBase<Quaternion<_Scalar>,3> Base;\n\npublic:\n  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,4)\n\n  using Base::operator*;\n\n  /** the scalar type of the coefficients */\n  typedef _Scalar Scalar;\n\n  /** the type of the Coefficients 4-vector */\n  typedef Matrix<Scalar, 4, 1> Coefficients;\n  /** the type of a 3D vector */\n  typedef Matrix<Scalar,3,1> Vector3;\n  /** the equivalent rotation matrix type */\n  typedef Matrix<Scalar,3,3> Matrix3;\n  /** the equivalent angle-axis type */\n  typedef AngleAxis<Scalar> AngleAxisType;\n\n  /** \\returns the \\c x coefficient */\n  inline Scalar x() const { return m_coeffs.coeff(0); }\n  /** \\returns the \\c y coefficient */\n  inline Scalar y() const { return m_coeffs.coeff(1); }\n  /** \\returns the \\c z coefficient */\n  inline Scalar z() const { return m_coeffs.coeff(2); }\n  /** \\returns the \\c w coefficient */\n  inline Scalar w() const { return m_coeffs.coeff(3); }\n\n  /** \\returns a reference to the \\c x coefficient */\n  inline Scalar& x() { return m_coeffs.coeffRef(0); }\n  /** \\returns a reference to the \\c y coefficient */\n  inline Scalar& y() { return m_coeffs.coeffRef(1); }\n  /** \\returns a reference to the \\c z coefficient */\n  inline Scalar& z() { return m_coeffs.coeffRef(2); }\n  /** \\returns a reference to the \\c w coefficient */\n  inline Scalar& w() { return m_coeffs.coeffRef(3); }\n\n  /** \\returns a read-only vector expression of the imaginary part (x,y,z) */\n  inline const Block<const Coefficients,3,1> vec() const { return m_coeffs.template start<3>(); }\n\n  /** \\returns a vector expression of the imaginary part (x,y,z) */\n  inline Block<Coefficients,3,1> vec() { return m_coeffs.template start<3>(); }\n\n  /** \\returns a read-only vector expression of the coefficients (x,y,z,w) */\n  inline const Coefficients& coeffs() const { return m_coeffs; }\n\n  /** \\returns a vector expression of the coefficients (x,y,z,w) */\n  inline Coefficients& coeffs() { return m_coeffs; }\n\n  /** Default constructor leaving the quaternion uninitialized. */\n  inline Quaternion() {}\n\n  /** Constructs and initializes the quaternion \\f$ w+xi+yj+zk \\f$ from\n    * its four coefficients \\a w, \\a x, \\a y and \\a z.\n    *\n    * \\warning Note the order of the arguments: the real \\a w coefficient first,\n    * while internally the coefficients are stored in the following order:\n    * [\\c x, \\c y, \\c z, \\c w]\n    */\n  inline Quaternion(Scalar w, Scalar x, Scalar y, Scalar z)\n  { m_coeffs << x, y, z, w; }\n\n  /** Copy constructor */\n  inline Quaternion(const Quaternion& other) { m_coeffs = other.m_coeffs; }\n\n  /** Constructs and initializes a quaternion from the angle-axis \\a aa */\n  explicit inline Quaternion(const AngleAxisType& aa) { *this = aa; }\n\n  /** Constructs and initializes a quaternion from either:\n    *  - a rotation matrix expression,\n    *  - a 4D vector expression representing quaternion coefficients.\n    * \\sa operator=(MatrixBase<Derived>)\n    */\n  template<typename Derived>\n  explicit inline Quaternion(const MatrixBase<Derived>& other) { *this = other; }\n\n  Quaternion& operator=(const Quaternion& other);\n  Quaternion& operator=(const AngleAxisType& aa);\n  template<typename Derived>\n  Quaternion& operator=(const MatrixBase<Derived>& m);\n\n  /** \\returns a quaternion representing an identity rotation\n    * \\sa MatrixBase::Identity()\n    */\n  static inline Quaternion Identity() { return Quaternion(1, 0, 0, 0); }\n\n  /** \\sa Quaternion::Identity(), MatrixBase::setIdentity()\n    */\n  inline Quaternion& setIdentity() { m_coeffs << 0, 0, 0, 1; return *this; }\n\n  /** \\returns the squared norm of the quaternion's coefficients\n    * \\sa Quaternion::norm(), MatrixBase::squaredNorm()\n    */\n  inline Scalar squaredNorm() const { return m_coeffs.squaredNorm(); }\n\n  /** \\returns the norm of the quaternion's coefficients\n    * \\sa Quaternion::squaredNorm(), MatrixBase::norm()\n    */\n  inline Scalar norm() const { return m_coeffs.norm(); }\n\n  /** Normalizes the quaternion \\c *this\n    * \\sa normalized(), MatrixBase::normalize() */\n  inline void normalize() { m_coeffs.normalize(); }\n  /** \\returns a normalized version of \\c *this\n    * \\sa normalize(), MatrixBase::normalized() */\n  inline Quaternion normalized() const { return Quaternion(m_coeffs.normalized()); }\n\n  /** \\returns the dot product of \\c *this and \\a other\n    * Geometrically speaking, the dot product of two unit quaternions\n    * corresponds to the cosine of half the angle between the two rotations.\n    * \\sa angularDistance()\n    */\n  inline Scalar eigen2_dot(const Quaternion& other) const { return m_coeffs.eigen2_dot(other.m_coeffs); }\n\n  inline Scalar angularDistance(const Quaternion& other) const;\n\n  Matrix3 toRotationMatrix(void) const;\n\n  template<typename Derived1, typename Derived2>\n  Quaternion& setFromTwoVectors(const MatrixBase<Derived1>& a, const MatrixBase<Derived2>& b);\n\n  inline Quaternion operator* (const Quaternion& q) const;\n  inline Quaternion& operator*= (const Quaternion& q);\n\n  Quaternion inverse(void) const;\n  Quaternion conjugate(void) const;\n\n  Quaternion slerp(Scalar t, const Quaternion& other) const;\n\n  template<typename Derived>\n  Vector3 operator* (const MatrixBase<Derived>& vec) const;\n\n  /** \\returns \\c *this with scalar type casted to \\a NewScalarType\n    *\n    * Note that if \\a NewScalarType is equal to the current scalar type of \\c *this\n    * then this function smartly returns a const reference to \\c *this.\n    */\n  template<typename NewScalarType>\n  inline typename internal::cast_return_type<Quaternion,Quaternion<NewScalarType> >::type cast() const\n  { return typename internal::cast_return_type<Quaternion,Quaternion<NewScalarType> >::type(*this); }\n\n  /** Copy constructor with scalar type conversion */\n  template<typename OtherScalarType>\n  inline explicit Quaternion(const Quaternion<OtherScalarType>& other)\n  { m_coeffs = other.coeffs().template cast<Scalar>(); }\n\n  /** \\returns \\c true if \\c *this is approximately equal to \\a other, within the precision\n    * determined by \\a prec.\n    *\n    * \\sa MatrixBase::isApprox() */\n  bool isApprox(const Quaternion& other, typename NumTraits<Scalar>::Real prec = precision<Scalar>()) const\n  { return m_coeffs.isApprox(other.m_coeffs, prec); }\n\nprotected:\n  Coefficients m_coeffs;\n};\n\n/** \\ingroup Geometry_Module\n  * single precision quaternion type */\ntypedef Quaternion<float> Quaternionf;\n/** \\ingroup Geometry_Module\n  * double precision quaternion type */\ntypedef Quaternion<double> Quaterniond;\n\n// Generic Quaternion * Quaternion product\ntemplate<typename Scalar> inline Quaternion<Scalar>\nei_quaternion_product(const Quaternion<Scalar>& a, const Quaternion<Scalar>& b)\n{\n  return Quaternion<Scalar>\n  (\n    a.w() * b.w() - a.x() * b.x() - a.y() * b.y() - a.z() * b.z(),\n    a.w() * b.x() + a.x() * b.w() + a.y() * b.z() - a.z() * b.y(),\n    a.w() * b.y() + a.y() * b.w() + a.z() * b.x() - a.x() * b.z(),\n    a.w() * b.z() + a.z() * b.w() + a.x() * b.y() - a.y() * b.x()\n  );\n}\n\n/** \\returns the concatenation of two rotations as a quaternion-quaternion product */\ntemplate <typename Scalar>\ninline Quaternion<Scalar> Quaternion<Scalar>::operator* (const Quaternion& other) const\n{\n  return ei_quaternion_product(*this,other);\n}\n\n/** \\sa operator*(Quaternion) */\ntemplate <typename Scalar>\ninline Quaternion<Scalar>& Quaternion<Scalar>::operator*= (const Quaternion& other)\n{\n  return (*this = *this * other);\n}\n\n/** Rotation of a vector by a quaternion.\n  * \\remarks If the quaternion is used to rotate several points (>1)\n  * then it is much more efficient to first convert it to a 3x3 Matrix.\n  * Comparison of the operation cost for n transformations:\n  *   - Quaternion:    30n\n  *   - Via a Matrix3: 24 + 15n\n  */\ntemplate <typename Scalar>\ntemplate<typename Derived>\ninline typename Quaternion<Scalar>::Vector3\nQuaternion<Scalar>::operator* (const MatrixBase<Derived>& v) const\n{\n    // Note that this algorithm comes from the optimization by hand\n    // of the conversion to a Matrix followed by a Matrix/Vector product.\n    // It appears to be much faster than the common algorithm found\n    // in the litterature (30 versus 39 flops). It also requires two\n    // Vector3 as temporaries.\n    Vector3 uv;\n    uv = 2 * this->vec().cross(v);\n    return v + this->w() * uv + this->vec().cross(uv);\n}\n\ntemplate<typename Scalar>\ninline Quaternion<Scalar>& Quaternion<Scalar>::operator=(const Quaternion& other)\n{\n  m_coeffs = other.m_coeffs;\n  return *this;\n}\n\n/** Set \\c *this from an angle-axis \\a aa and returns a reference to \\c *this\n  */\ntemplate<typename Scalar>\ninline Quaternion<Scalar>& Quaternion<Scalar>::operator=(const AngleAxisType& aa)\n{\n  Scalar ha = Scalar(0.5)*aa.angle(); // Scalar(0.5) to suppress precision loss warnings\n  this->w() = ei_cos(ha);\n  this->vec() = ei_sin(ha) * aa.axis();\n  return *this;\n}\n\n/** Set \\c *this from the expression \\a xpr:\n  *   - if \\a xpr is a 4x1 vector, then \\a xpr is assumed to be a quaternion\n  *   - if \\a xpr is a 3x3 matrix, then \\a xpr is assumed to be rotation matrix\n  *     and \\a xpr is converted to a quaternion\n  */\ntemplate<typename Scalar>\ntemplate<typename Derived>\ninline Quaternion<Scalar>& Quaternion<Scalar>::operator=(const MatrixBase<Derived>& xpr)\n{\n  ei_quaternion_assign_impl<Derived>::run(*this, xpr.derived());\n  return *this;\n}\n\n/** Convert the quaternion to a 3x3 rotation matrix */\ntemplate<typename Scalar>\ninline typename Quaternion<Scalar>::Matrix3\nQuaternion<Scalar>::toRotationMatrix(void) const\n{\n  // NOTE if inlined, then gcc 4.2 and 4.4 get rid of the temporary (not gcc 4.3 !!)\n  // if not inlined then the cost of the return by value is huge ~ +35%,\n  // however, not inlining this function is an order of magnitude slower, so\n  // it has to be inlined, and so the return by value is not an issue\n  Matrix3 res;\n\n  const Scalar tx  = Scalar(2)*this->x();\n  const Scalar ty  = Scalar(2)*this->y();\n  const Scalar tz  = Scalar(2)*this->z();\n  const Scalar twx = tx*this->w();\n  const Scalar twy = ty*this->w();\n  const Scalar twz = tz*this->w();\n  const Scalar txx = tx*this->x();\n  const Scalar txy = ty*this->x();\n  const Scalar txz = tz*this->x();\n  const Scalar tyy = ty*this->y();\n  const Scalar tyz = tz*this->y();\n  const Scalar tzz = tz*this->z();\n\n  res.coeffRef(0,0) = Scalar(1)-(tyy+tzz);\n  res.coeffRef(0,1) = txy-twz;\n  res.coeffRef(0,2) = txz+twy;\n  res.coeffRef(1,0) = txy+twz;\n  res.coeffRef(1,1) = Scalar(1)-(txx+tzz);\n  res.coeffRef(1,2) = tyz-twx;\n  res.coeffRef(2,0) = txz-twy;\n  res.coeffRef(2,1) = tyz+twx;\n  res.coeffRef(2,2) = Scalar(1)-(txx+tyy);\n\n  return res;\n}\n\n/** Sets *this to be a quaternion representing a rotation sending the vector \\a a to the vector \\a b.\n  *\n  * \\returns a reference to *this.\n  *\n  * Note that the two input vectors do \\b not have to be normalized.\n  */\ntemplate<typename Scalar>\ntemplate<typename Derived1, typename Derived2>\ninline Quaternion<Scalar>& Quaternion<Scalar>::setFromTwoVectors(const MatrixBase<Derived1>& a, const MatrixBase<Derived2>& b)\n{\n  Vector3 v0 = a.normalized();\n  Vector3 v1 = b.normalized();\n  Scalar c = v0.eigen2_dot(v1);\n\n  // if dot == 1, vectors are the same\n  if (ei_isApprox(c,Scalar(1)))\n  {\n    // set to identity\n    this->w() = 1; this->vec().setZero();\n    return *this;\n  }\n  // if dot == -1, vectors are opposites\n  if (ei_isApprox(c,Scalar(-1)))\n  {\n    this->vec() = v0.unitOrthogonal();\n    this->w() = 0;\n    return *this;\n  }\n\n  Vector3 axis = v0.cross(v1);\n  Scalar s = ei_sqrt((Scalar(1)+c)*Scalar(2));\n  Scalar invs = Scalar(1)/s;\n  this->vec() = axis * invs;\n  this->w() = s * Scalar(0.5);\n\n  return *this;\n}\n\n/** \\returns the multiplicative inverse of \\c *this\n  * Note that in most cases, i.e., if you simply want the opposite rotation,\n  * and/or the quaternion is normalized, then it is enough to use the conjugate.\n  *\n  * \\sa Quaternion::conjugate()\n  */\ntemplate <typename Scalar>\ninline Quaternion<Scalar> Quaternion<Scalar>::inverse() const\n{\n  // FIXME should this function be called multiplicativeInverse and conjugate() be called inverse() or opposite()  ??\n  Scalar n2 = this->squaredNorm();\n  if (n2 > 0)\n    return Quaternion(conjugate().coeffs() / n2);\n  else\n  {\n    // return an invalid result to flag the error\n    return Quaternion(Coefficients::Zero());\n  }\n}\n\n/** \\returns the conjugate of the \\c *this which is equal to the multiplicative inverse\n  * if the quaternion is normalized.\n  * The conjugate of a quaternion represents the opposite rotation.\n  *\n  * \\sa Quaternion::inverse()\n  */\ntemplate <typename Scalar>\ninline Quaternion<Scalar> Quaternion<Scalar>::conjugate() const\n{\n  return Quaternion(this->w(),-this->x(),-this->y(),-this->z());\n}\n\n/** \\returns the angle (in radian) between two rotations\n  * \\sa eigen2_dot()\n  */\ntemplate <typename Scalar>\ninline Scalar Quaternion<Scalar>::angularDistance(const Quaternion& other) const\n{\n  double d = ei_abs(this->eigen2_dot(other));\n  if (d>=1.0)\n    return 0;\n  return Scalar(2) * std::acos(d);\n}\n\n/** \\returns the spherical linear interpolation between the two quaternions\n  * \\c *this and \\a other at the parameter \\a t\n  */\ntemplate <typename Scalar>\nQuaternion<Scalar> Quaternion<Scalar>::slerp(Scalar t, const Quaternion& other) const\n{\n  static const Scalar one = Scalar(1) - machine_epsilon<Scalar>();\n  Scalar d = this->eigen2_dot(other);\n  Scalar absD = ei_abs(d);\n\n  Scalar scale0;\n  Scalar scale1;\n\n  if (absD>=one)\n  {\n    scale0 = Scalar(1) - t;\n    scale1 = t;\n  }\n  else\n  {\n    // theta is the angle between the 2 quaternions\n    Scalar theta = std::acos(absD);\n    Scalar sinTheta = ei_sin(theta);\n\n    scale0 = ei_sin( ( Scalar(1) - t ) * theta) / sinTheta;\n    scale1 = ei_sin( ( t * theta) ) / sinTheta;\n    if (d<0)\n      scale1 = -scale1;\n  }\n\n  return Quaternion<Scalar>(scale0 * coeffs() + scale1 * other.coeffs());\n}\n\n// set from a rotation matrix\ntemplate<typename Other>\nstruct ei_quaternion_assign_impl<Other,3,3>\n{\n  typedef typename Other::Scalar Scalar;\n  static inline void run(Quaternion<Scalar>& q, const Other& mat)\n  {\n    // This algorithm comes from  \"Quaternion Calculus and Fast Animation\",\n    // Ken Shoemake, 1987 SIGGRAPH course notes\n    Scalar t = mat.trace();\n    if (t > 0)\n    {\n      t = ei_sqrt(t + Scalar(1.0));\n      q.w() = Scalar(0.5)*t;\n      t = Scalar(0.5)/t;\n      q.x() = (mat.coeff(2,1) - mat.coeff(1,2)) * t;\n      q.y() = (mat.coeff(0,2) - mat.coeff(2,0)) * t;\n      q.z() = (mat.coeff(1,0) - mat.coeff(0,1)) * t;\n    }\n    else\n    {\n      int i = 0;\n      if (mat.coeff(1,1) > mat.coeff(0,0))\n        i = 1;\n      if (mat.coeff(2,2) > mat.coeff(i,i))\n        i = 2;\n      int j = (i+1)%3;\n      int k = (j+1)%3;\n\n      t = ei_sqrt(mat.coeff(i,i)-mat.coeff(j,j)-mat.coeff(k,k) + Scalar(1.0));\n      q.coeffs().coeffRef(i) = Scalar(0.5) * t;\n      t = Scalar(0.5)/t;\n      q.w() = (mat.coeff(k,j)-mat.coeff(j,k))*t;\n      q.coeffs().coeffRef(j) = (mat.coeff(j,i)+mat.coeff(i,j))*t;\n      q.coeffs().coeffRef(k) = (mat.coeff(k,i)+mat.coeff(i,k))*t;\n    }\n  }\n};\n\n// set from a vector of coefficients assumed to be a quaternion\ntemplate<typename Other>\nstruct ei_quaternion_assign_impl<Other,4,1>\n{\n  typedef typename Other::Scalar Scalar;\n  static inline void run(Quaternion<Scalar>& q, const Other& vec)\n  {\n    q.coeffs() = vec;\n  }\n};\n\n} // end namespace Eigen\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigen2Support/Geometry/Rotation2D.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n// no include guard, we'll include this twice from All.h from Eigen2Support, and it's internal anyway\n\nnamespace Eigen { \n\n/** \\geometry_module \\ingroup Geometry_Module\n  *\n  * \\class Rotation2D\n  *\n  * \\brief Represents a rotation/orientation in a 2 dimensional space.\n  *\n  * \\param _Scalar the scalar type, i.e., the type of the coefficients\n  *\n  * This class is equivalent to a single scalar representing a counter clock wise rotation\n  * as a single angle in radian. It provides some additional features such as the automatic\n  * conversion from/to a 2x2 rotation matrix. Moreover this class aims to provide a similar\n  * interface to Quaternion in order to facilitate the writing of generic algorithms\n  * dealing with rotations.\n  *\n  * \\sa class Quaternion, class Transform\n  */\ntemplate<typename _Scalar> struct ei_traits<Rotation2D<_Scalar> >\n{\n  typedef _Scalar Scalar;\n};\n\ntemplate<typename _Scalar>\nclass Rotation2D : public RotationBase<Rotation2D<_Scalar>,2>\n{\n  typedef RotationBase<Rotation2D<_Scalar>,2> Base;\n\npublic:\n\n  using Base::operator*;\n\n  enum { Dim = 2 };\n  /** the scalar type of the coefficients */\n  typedef _Scalar Scalar;\n  typedef Matrix<Scalar,2,1> Vector2;\n  typedef Matrix<Scalar,2,2> Matrix2;\n\nprotected:\n\n  Scalar m_angle;\n\npublic:\n\n  /** Construct a 2D counter clock wise rotation from the angle \\a a in radian. */\n  inline Rotation2D(Scalar a) : m_angle(a) {}\n\n  /** \\returns the rotation angle */\n  inline Scalar angle() const { return m_angle; }\n\n  /** \\returns a read-write reference to the rotation angle */\n  inline Scalar& angle() { return m_angle; }\n\n  /** \\returns the inverse rotation */\n  inline Rotation2D inverse() const { return -m_angle; }\n\n  /** Concatenates two rotations */\n  inline Rotation2D operator*(const Rotation2D& other) const\n  { return m_angle + other.m_angle; }\n\n  /** Concatenates two rotations */\n  inline Rotation2D& operator*=(const Rotation2D& other)\n  { return m_angle += other.m_angle; return *this; }\n\n  /** Applies the rotation to a 2D vector */\n  Vector2 operator* (const Vector2& vec) const\n  { return toRotationMatrix() * vec; }\n\n  template<typename Derived>\n  Rotation2D& fromRotationMatrix(const MatrixBase<Derived>& m);\n  Matrix2 toRotationMatrix(void) const;\n\n  /** \\returns the spherical interpolation between \\c *this and \\a other using\n    * parameter \\a t. It is in fact equivalent to a linear interpolation.\n    */\n  inline Rotation2D slerp(Scalar t, const Rotation2D& other) const\n  { return m_angle * (1-t) + other.angle() * t; }\n\n  /** \\returns \\c *this with scalar type casted to \\a NewScalarType\n    *\n    * Note that if \\a NewScalarType is equal to the current scalar type of \\c *this\n    * then this function smartly returns a const reference to \\c *this.\n    */\n  template<typename NewScalarType>\n  inline typename internal::cast_return_type<Rotation2D,Rotation2D<NewScalarType> >::type cast() const\n  { return typename internal::cast_return_type<Rotation2D,Rotation2D<NewScalarType> >::type(*this); }\n\n  /** Copy constructor with scalar type conversion */\n  template<typename OtherScalarType>\n  inline explicit Rotation2D(const Rotation2D<OtherScalarType>& other)\n  {\n    m_angle = Scalar(other.angle());\n  }\n\n  /** \\returns \\c true if \\c *this is approximately equal to \\a other, within the precision\n    * determined by \\a prec.\n    *\n    * \\sa MatrixBase::isApprox() */\n  bool isApprox(const Rotation2D& other, typename NumTraits<Scalar>::Real prec = precision<Scalar>()) const\n  { return ei_isApprox(m_angle,other.m_angle, prec); }\n};\n\n/** \\ingroup Geometry_Module\n  * single precision 2D rotation type */\ntypedef Rotation2D<float> Rotation2Df;\n/** \\ingroup Geometry_Module\n  * double precision 2D rotation type */\ntypedef Rotation2D<double> Rotation2Dd;\n\n/** Set \\c *this from a 2x2 rotation matrix \\a mat.\n  * In other words, this function extract the rotation angle\n  * from the rotation matrix.\n  */\ntemplate<typename Scalar>\ntemplate<typename Derived>\nRotation2D<Scalar>& Rotation2D<Scalar>::fromRotationMatrix(const MatrixBase<Derived>& mat)\n{\n  EIGEN_STATIC_ASSERT(Derived::RowsAtCompileTime==2 && Derived::ColsAtCompileTime==2,YOU_MADE_A_PROGRAMMING_MISTAKE)\n  m_angle = ei_atan2(mat.coeff(1,0), mat.coeff(0,0));\n  return *this;\n}\n\n/** Constructs and \\returns an equivalent 2x2 rotation matrix.\n  */\ntemplate<typename Scalar>\ntypename Rotation2D<Scalar>::Matrix2\nRotation2D<Scalar>::toRotationMatrix(void) const\n{\n  Scalar sinA = ei_sin(m_angle);\n  Scalar cosA = ei_cos(m_angle);\n  return (Matrix2() << cosA, -sinA, sinA, cosA).finished();\n}\n\n} // end namespace Eigen\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigen2Support/Geometry/RotationBase.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n// no include guard, we'll include this twice from All.h from Eigen2Support, and it's internal anyway\n\nnamespace Eigen { \n\n// this file aims to contains the various representations of rotation/orientation\n// in 2D and 3D space excepted Matrix and Quaternion.\n\n/** \\class RotationBase\n  *\n  * \\brief Common base class for compact rotation representations\n  *\n  * \\param Derived is the derived type, i.e., a rotation type\n  * \\param _Dim the dimension of the space\n  */\ntemplate<typename Derived, int _Dim>\nclass RotationBase\n{\n  public:\n    enum { Dim = _Dim };\n    /** the scalar type of the coefficients */\n    typedef typename ei_traits<Derived>::Scalar Scalar;\n    \n    /** corresponding linear transformation matrix type */\n    typedef Matrix<Scalar,Dim,Dim> RotationMatrixType;\n\n    inline const Derived& derived() const { return *static_cast<const Derived*>(this); }\n    inline Derived& derived() { return *static_cast<Derived*>(this); }\n\n    /** \\returns an equivalent rotation matrix */\n    inline RotationMatrixType toRotationMatrix() const { return derived().toRotationMatrix(); }\n\n    /** \\returns the inverse rotation */\n    inline Derived inverse() const { return derived().inverse(); }\n\n    /** \\returns the concatenation of the rotation \\c *this with a translation \\a t */\n    inline Transform<Scalar,Dim> operator*(const Translation<Scalar,Dim>& t) const\n    { return toRotationMatrix() * t; }\n\n    /** \\returns the concatenation of the rotation \\c *this with a scaling \\a s */\n    inline RotationMatrixType operator*(const Scaling<Scalar,Dim>& s) const\n    { return toRotationMatrix() * s; }\n\n    /** \\returns the concatenation of the rotation \\c *this with an affine transformation \\a t */\n    inline Transform<Scalar,Dim> operator*(const Transform<Scalar,Dim>& t) const\n    { return toRotationMatrix() * t; }\n};\n\n/** \\geometry_module\n  *\n  * Constructs a Dim x Dim rotation matrix from the rotation \\a r\n  */\ntemplate<typename _Scalar, int _Rows, int _Cols, int _Storage, int _MaxRows, int _MaxCols>\ntemplate<typename OtherDerived>\nMatrix<_Scalar, _Rows, _Cols, _Storage, _MaxRows, _MaxCols>\n::Matrix(const RotationBase<OtherDerived,ColsAtCompileTime>& r)\n{\n  EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix,int(OtherDerived::Dim),int(OtherDerived::Dim))\n  *this = r.toRotationMatrix();\n}\n\n/** \\geometry_module\n  *\n  * Set a Dim x Dim rotation matrix from the rotation \\a r\n  */\ntemplate<typename _Scalar, int _Rows, int _Cols, int _Storage, int _MaxRows, int _MaxCols>\ntemplate<typename OtherDerived>\nMatrix<_Scalar, _Rows, _Cols, _Storage, _MaxRows, _MaxCols>&\nMatrix<_Scalar, _Rows, _Cols, _Storage, _MaxRows, _MaxCols>\n::operator=(const RotationBase<OtherDerived,ColsAtCompileTime>& r)\n{\n  EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix,int(OtherDerived::Dim),int(OtherDerived::Dim))\n  return *this = r.toRotationMatrix();\n}\n\n/** \\internal\n  *\n  * Helper function to return an arbitrary rotation object to a rotation matrix.\n  *\n  * \\param Scalar the numeric type of the matrix coefficients\n  * \\param Dim the dimension of the current space\n  *\n  * It returns a Dim x Dim fixed size matrix.\n  *\n  * Default specializations are provided for:\n  *   - any scalar type (2D),\n  *   - any matrix expression,\n  *   - any type based on RotationBase (e.g., Quaternion, AngleAxis, Rotation2D)\n  *\n  * Currently ei_toRotationMatrix is only used by Transform.\n  *\n  * \\sa class Transform, class Rotation2D, class Quaternion, class AngleAxis\n  */\ntemplate<typename Scalar, int Dim>\nstatic inline Matrix<Scalar,2,2> ei_toRotationMatrix(const Scalar& s)\n{\n  EIGEN_STATIC_ASSERT(Dim==2,YOU_MADE_A_PROGRAMMING_MISTAKE)\n  return Rotation2D<Scalar>(s).toRotationMatrix();\n}\n\ntemplate<typename Scalar, int Dim, typename OtherDerived>\nstatic inline Matrix<Scalar,Dim,Dim> ei_toRotationMatrix(const RotationBase<OtherDerived,Dim>& r)\n{\n  return r.toRotationMatrix();\n}\n\ntemplate<typename Scalar, int Dim, typename OtherDerived>\nstatic inline const MatrixBase<OtherDerived>& ei_toRotationMatrix(const MatrixBase<OtherDerived>& mat)\n{\n  EIGEN_STATIC_ASSERT(OtherDerived::RowsAtCompileTime==Dim && OtherDerived::ColsAtCompileTime==Dim,\n    YOU_MADE_A_PROGRAMMING_MISTAKE)\n  return mat;\n}\n\n} // end namespace Eigen\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigen2Support/Geometry/Scaling.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n// no include guard, we'll include this twice from All.h from Eigen2Support, and it's internal anyway\n\nnamespace Eigen { \n\n/** \\geometry_module \\ingroup Geometry_Module\n  *\n  * \\class Scaling\n  *\n  * \\brief Represents a possibly non uniform scaling transformation\n  *\n  * \\param _Scalar the scalar type, i.e., the type of the coefficients.\n  * \\param _Dim the  dimension of the space, can be a compile time value or Dynamic\n  *\n  * \\note This class is not aimed to be used to store a scaling transformation,\n  * but rather to make easier the constructions and updates of Transform objects.\n  *\n  * \\sa class Translation, class Transform\n  */\ntemplate<typename _Scalar, int _Dim>\nclass Scaling\n{\npublic:\n  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_Dim)\n  /** dimension of the space */\n  enum { Dim = _Dim };\n  /** the scalar type of the coefficients */\n  typedef _Scalar Scalar;\n  /** corresponding vector type */\n  typedef Matrix<Scalar,Dim,1> VectorType;\n  /** corresponding linear transformation matrix type */\n  typedef Matrix<Scalar,Dim,Dim> LinearMatrixType;\n  /** corresponding translation type */\n  typedef Translation<Scalar,Dim> TranslationType;\n  /** corresponding affine transformation type */\n  typedef Transform<Scalar,Dim> TransformType;\n\nprotected:\n\n  VectorType m_coeffs;\n\npublic:\n\n  /** Default constructor without initialization. */\n  Scaling() {}\n  /** Constructs and initialize a uniform scaling transformation */\n  explicit inline Scaling(const Scalar& s) { m_coeffs.setConstant(s); }\n  /** 2D only */\n  inline Scaling(const Scalar& sx, const Scalar& sy)\n  {\n    ei_assert(Dim==2);\n    m_coeffs.x() = sx;\n    m_coeffs.y() = sy;\n  }\n  /** 3D only */\n  inline Scaling(const Scalar& sx, const Scalar& sy, const Scalar& sz)\n  {\n    ei_assert(Dim==3);\n    m_coeffs.x() = sx;\n    m_coeffs.y() = sy;\n    m_coeffs.z() = sz;\n  }\n  /** Constructs and initialize the scaling transformation from a vector of scaling coefficients */\n  explicit inline Scaling(const VectorType& coeffs) : m_coeffs(coeffs) {}\n\n  const VectorType& coeffs() const { return m_coeffs; }\n  VectorType& coeffs() { return m_coeffs; }\n\n  /** Concatenates two scaling */\n  inline Scaling operator* (const Scaling& other) const\n  { return Scaling(coeffs().cwise() * other.coeffs()); }\n\n  /** Concatenates a scaling and a translation */\n  inline TransformType operator* (const TranslationType& t) const;\n\n  /** Concatenates a scaling and an affine transformation */\n  inline TransformType operator* (const TransformType& t) const;\n\n  /** Concatenates a scaling and a linear transformation matrix */\n  // TODO returns an expression\n  inline LinearMatrixType operator* (const LinearMatrixType& other) const\n  { return coeffs().asDiagonal() * other; }\n\n  /** Concatenates a linear transformation matrix and a scaling */\n  // TODO returns an expression\n  friend inline LinearMatrixType operator* (const LinearMatrixType& other, const Scaling& s)\n  { return other * s.coeffs().asDiagonal(); }\n\n  template<typename Derived>\n  inline LinearMatrixType operator*(const RotationBase<Derived,Dim>& r) const\n  { return *this * r.toRotationMatrix(); }\n\n  /** Applies scaling to vector */\n  inline VectorType operator* (const VectorType& other) const\n  { return coeffs().asDiagonal() * other; }\n\n  /** \\returns the inverse scaling */\n  inline Scaling inverse() const\n  { return Scaling(coeffs().cwise().inverse()); }\n\n  inline Scaling& operator=(const Scaling& other)\n  {\n    m_coeffs = other.m_coeffs;\n    return *this;\n  }\n\n  /** \\returns \\c *this with scalar type casted to \\a NewScalarType\n    *\n    * Note that if \\a NewScalarType is equal to the current scalar type of \\c *this\n    * then this function smartly returns a const reference to \\c *this.\n    */\n  template<typename NewScalarType>\n  inline typename internal::cast_return_type<Scaling,Scaling<NewScalarType,Dim> >::type cast() const\n  { return typename internal::cast_return_type<Scaling,Scaling<NewScalarType,Dim> >::type(*this); }\n\n  /** Copy constructor with scalar type conversion */\n  template<typename OtherScalarType>\n  inline explicit Scaling(const Scaling<OtherScalarType,Dim>& other)\n  { m_coeffs = other.coeffs().template cast<Scalar>(); }\n\n  /** \\returns \\c true if \\c *this is approximately equal to \\a other, within the precision\n    * determined by \\a prec.\n    *\n    * \\sa MatrixBase::isApprox() */\n  bool isApprox(const Scaling& other, typename NumTraits<Scalar>::Real prec = precision<Scalar>()) const\n  { return m_coeffs.isApprox(other.m_coeffs, prec); }\n\n};\n\n/** \\addtogroup Geometry_Module */\n//@{\ntypedef Scaling<float, 2> Scaling2f;\ntypedef Scaling<double,2> Scaling2d;\ntypedef Scaling<float, 3> Scaling3f;\ntypedef Scaling<double,3> Scaling3d;\n//@}\n\ntemplate<typename Scalar, int Dim>\ninline typename Scaling<Scalar,Dim>::TransformType\nScaling<Scalar,Dim>::operator* (const TranslationType& t) const\n{\n  TransformType res;\n  res.matrix().setZero();\n  res.linear().diagonal() = coeffs();\n  res.translation() = m_coeffs.cwise() * t.vector();\n  res(Dim,Dim) = Scalar(1);\n  return res;\n}\n\ntemplate<typename Scalar, int Dim>\ninline typename Scaling<Scalar,Dim>::TransformType\nScaling<Scalar,Dim>::operator* (const TransformType& t) const\n{\n  TransformType res = t;\n  res.prescale(m_coeffs);\n  return res;\n}\n\n} // end namespace Eigen\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigen2Support/Geometry/Transform.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>\n// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n// no include guard, we'll include this twice from All.h from Eigen2Support, and it's internal anyway\n\nnamespace Eigen { \n\n// Note that we have to pass Dim and HDim because it is not allowed to use a template\n// parameter to define a template specialization. To be more precise, in the following\n// specializations, it is not allowed to use Dim+1 instead of HDim.\ntemplate< typename Other,\n          int Dim,\n          int HDim,\n          int OtherRows=Other::RowsAtCompileTime,\n          int OtherCols=Other::ColsAtCompileTime>\nstruct ei_transform_product_impl;\n\n/** \\geometry_module \\ingroup Geometry_Module\n  *\n  * \\class Transform\n  *\n  * \\brief Represents an homogeneous transformation in a N dimensional space\n  *\n  * \\param _Scalar the scalar type, i.e., the type of the coefficients\n  * \\param _Dim the dimension of the space\n  *\n  * The homography is internally represented and stored as a (Dim+1)^2 matrix which\n  * is available through the matrix() method.\n  *\n  * Conversion methods from/to Qt's QMatrix and QTransform are available if the\n  * preprocessor token EIGEN_QT_SUPPORT is defined.\n  *\n  * \\sa class Matrix, class Quaternion\n  */\ntemplate<typename _Scalar, int _Dim>\nclass Transform\n{\npublic:\n  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_Dim==Dynamic ? Dynamic : (_Dim+1)*(_Dim+1))\n  enum {\n    Dim = _Dim,     ///< space dimension in which the transformation holds\n    HDim = _Dim+1   ///< size of a respective homogeneous vector\n  };\n  /** the scalar type of the coefficients */\n  typedef _Scalar Scalar;\n  /** type of the matrix used to represent the transformation */\n  typedef Matrix<Scalar,HDim,HDim> MatrixType;\n  /** type of the matrix used to represent the linear part of the transformation */\n  typedef Matrix<Scalar,Dim,Dim> LinearMatrixType;\n  /** type of read/write reference to the linear part of the transformation */\n  typedef Block<MatrixType,Dim,Dim> LinearPart;\n  /** type of read/write reference to the linear part of the transformation */\n  typedef const Block<const MatrixType,Dim,Dim> ConstLinearPart;\n  /** type of a vector */\n  typedef Matrix<Scalar,Dim,1> VectorType;\n  /** type of a read/write reference to the translation part of the rotation */\n  typedef Block<MatrixType,Dim,1> TranslationPart;\n  /** type of a read/write reference to the translation part of the rotation */\n  typedef const Block<const MatrixType,Dim,1> ConstTranslationPart;\n  /** corresponding translation type */\n  typedef Translation<Scalar,Dim> TranslationType;\n  /** corresponding scaling transformation type */\n  typedef Scaling<Scalar,Dim> ScalingType;\n\nprotected:\n\n  MatrixType m_matrix;\n\npublic:\n\n  /** Default constructor without initialization of the coefficients. */\n  inline Transform() { }\n\n  inline Transform(const Transform& other)\n  {\n    m_matrix = other.m_matrix;\n  }\n\n  inline explicit Transform(const TranslationType& t) { *this = t; }\n  inline explicit Transform(const ScalingType& s) { *this = s; }\n  template<typename Derived>\n  inline explicit Transform(const RotationBase<Derived, Dim>& r) { *this = r; }\n\n  inline Transform& operator=(const Transform& other)\n  { m_matrix = other.m_matrix; return *this; }\n\n  template<typename OtherDerived, bool BigMatrix> // MSVC 2005 will commit suicide if BigMatrix has a default value\n  struct construct_from_matrix\n  {\n    static inline void run(Transform *transform, const MatrixBase<OtherDerived>& other)\n    {\n      transform->matrix() = other;\n    }\n  };\n\n  template<typename OtherDerived> struct construct_from_matrix<OtherDerived, true>\n  {\n    static inline void run(Transform *transform, const MatrixBase<OtherDerived>& other)\n    {\n      transform->linear() = other;\n      transform->translation().setZero();\n      transform->matrix()(Dim,Dim) = Scalar(1);\n      transform->matrix().template block<1,Dim>(Dim,0).setZero();\n    }\n  };\n\n  /** Constructs and initializes a transformation from a Dim^2 or a (Dim+1)^2 matrix. */\n  template<typename OtherDerived>\n  inline explicit Transform(const MatrixBase<OtherDerived>& other)\n  {\n    construct_from_matrix<OtherDerived, int(OtherDerived::RowsAtCompileTime) == Dim>::run(this, other);\n  }\n\n  /** Set \\c *this from a (Dim+1)^2 matrix. */\n  template<typename OtherDerived>\n  inline Transform& operator=(const MatrixBase<OtherDerived>& other)\n  { m_matrix = other; return *this; }\n\n  #ifdef EIGEN_QT_SUPPORT\n  inline Transform(const QMatrix& other);\n  inline Transform& operator=(const QMatrix& other);\n  inline QMatrix toQMatrix(void) const;\n  inline Transform(const QTransform& other);\n  inline Transform& operator=(const QTransform& other);\n  inline QTransform toQTransform(void) const;\n  #endif\n\n  /** shortcut for m_matrix(row,col);\n    * \\sa MatrixBase::operaror(int,int) const */\n  inline Scalar operator() (int row, int col) const { return m_matrix(row,col); }\n  /** shortcut for m_matrix(row,col);\n    * \\sa MatrixBase::operaror(int,int) */\n  inline Scalar& operator() (int row, int col) { return m_matrix(row,col); }\n\n  /** \\returns a read-only expression of the transformation matrix */\n  inline const MatrixType& matrix() const { return m_matrix; }\n  /** \\returns a writable expression of the transformation matrix */\n  inline MatrixType& matrix() { return m_matrix; }\n\n  /** \\returns a read-only expression of the linear (linear) part of the transformation */\n  inline ConstLinearPart linear() const { return m_matrix.template block<Dim,Dim>(0,0); }\n  /** \\returns a writable expression of the linear (linear) part of the transformation */\n  inline LinearPart linear() { return m_matrix.template block<Dim,Dim>(0,0); }\n\n  /** \\returns a read-only expression of the translation vector of the transformation */\n  inline ConstTranslationPart translation() const { return m_matrix.template block<Dim,1>(0,Dim); }\n  /** \\returns a writable expression of the translation vector of the transformation */\n  inline TranslationPart translation() { return m_matrix.template block<Dim,1>(0,Dim); }\n\n  /** \\returns an expression of the product between the transform \\c *this and a matrix expression \\a other\n  *\n  * The right hand side \\a other might be either:\n  * \\li a vector of size Dim,\n  * \\li an homogeneous vector of size Dim+1,\n  * \\li a transformation matrix of size Dim+1 x Dim+1.\n  */\n  // note: this function is defined here because some compilers cannot find the respective declaration\n  template<typename OtherDerived>\n  inline const typename ei_transform_product_impl<OtherDerived,_Dim,_Dim+1>::ResultType\n  operator * (const MatrixBase<OtherDerived> &other) const\n  { return ei_transform_product_impl<OtherDerived,Dim,HDim>::run(*this,other.derived()); }\n\n  /** \\returns the product expression of a transformation matrix \\a a times a transform \\a b\n    * The transformation matrix \\a a must have a Dim+1 x Dim+1 sizes. */\n  template<typename OtherDerived>\n  friend inline const typename ProductReturnType<OtherDerived,MatrixType>::Type\n  operator * (const MatrixBase<OtherDerived> &a, const Transform &b)\n  { return a.derived() * b.matrix(); }\n\n  /** Contatenates two transformations */\n  inline const Transform\n  operator * (const Transform& other) const\n  { return Transform(m_matrix * other.matrix()); }\n\n  /** \\sa MatrixBase::setIdentity() */\n  void setIdentity() { m_matrix.setIdentity(); }\n  static const typename MatrixType::IdentityReturnType Identity()\n  {\n    return MatrixType::Identity();\n  }\n\n  template<typename OtherDerived>\n  inline Transform& scale(const MatrixBase<OtherDerived> &other);\n\n  template<typename OtherDerived>\n  inline Transform& prescale(const MatrixBase<OtherDerived> &other);\n\n  inline Transform& scale(Scalar s);\n  inline Transform& prescale(Scalar s);\n\n  template<typename OtherDerived>\n  inline Transform& translate(const MatrixBase<OtherDerived> &other);\n\n  template<typename OtherDerived>\n  inline Transform& pretranslate(const MatrixBase<OtherDerived> &other);\n\n  template<typename RotationType>\n  inline Transform& rotate(const RotationType& rotation);\n\n  template<typename RotationType>\n  inline Transform& prerotate(const RotationType& rotation);\n\n  Transform& shear(Scalar sx, Scalar sy);\n  Transform& preshear(Scalar sx, Scalar sy);\n\n  inline Transform& operator=(const TranslationType& t);\n  inline Transform& operator*=(const TranslationType& t) { return translate(t.vector()); }\n  inline Transform operator*(const TranslationType& t) const;\n\n  inline Transform& operator=(const ScalingType& t);\n  inline Transform& operator*=(const ScalingType& s) { return scale(s.coeffs()); }\n  inline Transform operator*(const ScalingType& s) const;\n  friend inline Transform operator*(const LinearMatrixType& mat, const Transform& t)\n  {\n    Transform res = t;\n    res.matrix().row(Dim) = t.matrix().row(Dim);\n    res.matrix().template block<Dim,HDim>(0,0) = (mat * t.matrix().template block<Dim,HDim>(0,0)).lazy();\n    return res;\n  }\n\n  template<typename Derived>\n  inline Transform& operator=(const RotationBase<Derived,Dim>& r);\n  template<typename Derived>\n  inline Transform& operator*=(const RotationBase<Derived,Dim>& r) { return rotate(r.toRotationMatrix()); }\n  template<typename Derived>\n  inline Transform operator*(const RotationBase<Derived,Dim>& r) const;\n\n  LinearMatrixType rotation() const;\n  template<typename RotationMatrixType, typename ScalingMatrixType>\n  void computeRotationScaling(RotationMatrixType *rotation, ScalingMatrixType *scaling) const;\n  template<typename ScalingMatrixType, typename RotationMatrixType>\n  void computeScalingRotation(ScalingMatrixType *scaling, RotationMatrixType *rotation) const;\n\n  template<typename PositionDerived, typename OrientationType, typename ScaleDerived>\n  Transform& fromPositionOrientationScale(const MatrixBase<PositionDerived> &position,\n    const OrientationType& orientation, const MatrixBase<ScaleDerived> &scale);\n\n  inline const MatrixType inverse(TransformTraits traits = Affine) const;\n\n  /** \\returns a const pointer to the column major internal matrix */\n  const Scalar* data() const { return m_matrix.data(); }\n  /** \\returns a non-const pointer to the column major internal matrix */\n  Scalar* data() { return m_matrix.data(); }\n\n  /** \\returns \\c *this with scalar type casted to \\a NewScalarType\n    *\n    * Note that if \\a NewScalarType is equal to the current scalar type of \\c *this\n    * then this function smartly returns a const reference to \\c *this.\n    */\n  template<typename NewScalarType>\n  inline typename internal::cast_return_type<Transform,Transform<NewScalarType,Dim> >::type cast() const\n  { return typename internal::cast_return_type<Transform,Transform<NewScalarType,Dim> >::type(*this); }\n\n  /** Copy constructor with scalar type conversion */\n  template<typename OtherScalarType>\n  inline explicit Transform(const Transform<OtherScalarType,Dim>& other)\n  { m_matrix = other.matrix().template cast<Scalar>(); }\n\n  /** \\returns \\c true if \\c *this is approximately equal to \\a other, within the precision\n    * determined by \\a prec.\n    *\n    * \\sa MatrixBase::isApprox() */\n  bool isApprox(const Transform& other, typename NumTraits<Scalar>::Real prec = precision<Scalar>()) const\n  { return m_matrix.isApprox(other.m_matrix, prec); }\n\n  #ifdef EIGEN_TRANSFORM_PLUGIN\n  #include EIGEN_TRANSFORM_PLUGIN\n  #endif\n\nprotected:\n\n};\n\n/** \\ingroup Geometry_Module */\ntypedef Transform<float,2> Transform2f;\n/** \\ingroup Geometry_Module */\ntypedef Transform<float,3> Transform3f;\n/** \\ingroup Geometry_Module */\ntypedef Transform<double,2> Transform2d;\n/** \\ingroup Geometry_Module */\ntypedef Transform<double,3> Transform3d;\n\n/**************************\n*** Optional QT support ***\n**************************/\n\n#ifdef EIGEN_QT_SUPPORT\n/** Initialises \\c *this from a QMatrix assuming the dimension is 2.\n  *\n  * This function is available only if the token EIGEN_QT_SUPPORT is defined.\n  */\ntemplate<typename Scalar, int Dim>\nTransform<Scalar,Dim>::Transform(const QMatrix& other)\n{\n  *this = other;\n}\n\n/** Set \\c *this from a QMatrix assuming the dimension is 2.\n  *\n  * This function is available only if the token EIGEN_QT_SUPPORT is defined.\n  */\ntemplate<typename Scalar, int Dim>\nTransform<Scalar,Dim>& Transform<Scalar,Dim>::operator=(const QMatrix& other)\n{\n  EIGEN_STATIC_ASSERT(Dim==2, YOU_MADE_A_PROGRAMMING_MISTAKE)\n  m_matrix << other.m11(), other.m21(), other.dx(),\n              other.m12(), other.m22(), other.dy(),\n              0, 0, 1;\n   return *this;\n}\n\n/** \\returns a QMatrix from \\c *this assuming the dimension is 2.\n  *\n  * \\warning this convertion might loss data if \\c *this is not affine\n  *\n  * This function is available only if the token EIGEN_QT_SUPPORT is defined.\n  */\ntemplate<typename Scalar, int Dim>\nQMatrix Transform<Scalar,Dim>::toQMatrix(void) const\n{\n  EIGEN_STATIC_ASSERT(Dim==2, YOU_MADE_A_PROGRAMMING_MISTAKE)\n  return QMatrix(m_matrix.coeff(0,0), m_matrix.coeff(1,0),\n                 m_matrix.coeff(0,1), m_matrix.coeff(1,1),\n                 m_matrix.coeff(0,2), m_matrix.coeff(1,2));\n}\n\n/** Initialises \\c *this from a QTransform assuming the dimension is 2.\n  *\n  * This function is available only if the token EIGEN_QT_SUPPORT is defined.\n  */\ntemplate<typename Scalar, int Dim>\nTransform<Scalar,Dim>::Transform(const QTransform& other)\n{\n  *this = other;\n}\n\n/** Set \\c *this from a QTransform assuming the dimension is 2.\n  *\n  * This function is available only if the token EIGEN_QT_SUPPORT is defined.\n  */\ntemplate<typename Scalar, int Dim>\nTransform<Scalar,Dim>& Transform<Scalar,Dim>::operator=(const QTransform& other)\n{\n  EIGEN_STATIC_ASSERT(Dim==2, YOU_MADE_A_PROGRAMMING_MISTAKE)\n  m_matrix << other.m11(), other.m21(), other.dx(),\n              other.m12(), other.m22(), other.dy(),\n              other.m13(), other.m23(), other.m33();\n   return *this;\n}\n\n/** \\returns a QTransform from \\c *this assuming the dimension is 2.\n  *\n  * This function is available only if the token EIGEN_QT_SUPPORT is defined.\n  */\ntemplate<typename Scalar, int Dim>\nQTransform Transform<Scalar,Dim>::toQTransform(void) const\n{\n  EIGEN_STATIC_ASSERT(Dim==2, YOU_MADE_A_PROGRAMMING_MISTAKE)\n  return QTransform(m_matrix.coeff(0,0), m_matrix.coeff(1,0), m_matrix.coeff(2,0),\n                    m_matrix.coeff(0,1), m_matrix.coeff(1,1), m_matrix.coeff(2,1),\n                    m_matrix.coeff(0,2), m_matrix.coeff(1,2), m_matrix.coeff(2,2));\n}\n#endif\n\n/*********************\n*** Procedural API ***\n*********************/\n\n/** Applies on the right the non uniform scale transformation represented\n  * by the vector \\a other to \\c *this and returns a reference to \\c *this.\n  * \\sa prescale()\n  */\ntemplate<typename Scalar, int Dim>\ntemplate<typename OtherDerived>\nTransform<Scalar,Dim>&\nTransform<Scalar,Dim>::scale(const MatrixBase<OtherDerived> &other)\n{\n  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived,int(Dim))\n  linear() = (linear() * other.asDiagonal()).lazy();\n  return *this;\n}\n\n/** Applies on the right a uniform scale of a factor \\a c to \\c *this\n  * and returns a reference to \\c *this.\n  * \\sa prescale(Scalar)\n  */\ntemplate<typename Scalar, int Dim>\ninline Transform<Scalar,Dim>& Transform<Scalar,Dim>::scale(Scalar s)\n{\n  linear() *= s;\n  return *this;\n}\n\n/** Applies on the left the non uniform scale transformation represented\n  * by the vector \\a other to \\c *this and returns a reference to \\c *this.\n  * \\sa scale()\n  */\ntemplate<typename Scalar, int Dim>\ntemplate<typename OtherDerived>\nTransform<Scalar,Dim>&\nTransform<Scalar,Dim>::prescale(const MatrixBase<OtherDerived> &other)\n{\n  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived,int(Dim))\n  m_matrix.template block<Dim,HDim>(0,0) = (other.asDiagonal() * m_matrix.template block<Dim,HDim>(0,0)).lazy();\n  return *this;\n}\n\n/** Applies on the left a uniform scale of a factor \\a c to \\c *this\n  * and returns a reference to \\c *this.\n  * \\sa scale(Scalar)\n  */\ntemplate<typename Scalar, int Dim>\ninline Transform<Scalar,Dim>& Transform<Scalar,Dim>::prescale(Scalar s)\n{\n  m_matrix.template corner<Dim,HDim>(TopLeft) *= s;\n  return *this;\n}\n\n/** Applies on the right the translation matrix represented by the vector \\a other\n  * to \\c *this and returns a reference to \\c *this.\n  * \\sa pretranslate()\n  */\ntemplate<typename Scalar, int Dim>\ntemplate<typename OtherDerived>\nTransform<Scalar,Dim>&\nTransform<Scalar,Dim>::translate(const MatrixBase<OtherDerived> &other)\n{\n  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived,int(Dim))\n  translation() += linear() * other;\n  return *this;\n}\n\n/** Applies on the left the translation matrix represented by the vector \\a other\n  * to \\c *this and returns a reference to \\c *this.\n  * \\sa translate()\n  */\ntemplate<typename Scalar, int Dim>\ntemplate<typename OtherDerived>\nTransform<Scalar,Dim>&\nTransform<Scalar,Dim>::pretranslate(const MatrixBase<OtherDerived> &other)\n{\n  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived,int(Dim))\n  translation() += other;\n  return *this;\n}\n\n/** Applies on the right the rotation represented by the rotation \\a rotation\n  * to \\c *this and returns a reference to \\c *this.\n  *\n  * The template parameter \\a RotationType is the type of the rotation which\n  * must be known by ei_toRotationMatrix<>.\n  *\n  * Natively supported types includes:\n  *   - any scalar (2D),\n  *   - a Dim x Dim matrix expression,\n  *   - a Quaternion (3D),\n  *   - a AngleAxis (3D)\n  *\n  * This mechanism is easily extendable to support user types such as Euler angles,\n  * or a pair of Quaternion for 4D rotations.\n  *\n  * \\sa rotate(Scalar), class Quaternion, class AngleAxis, prerotate(RotationType)\n  */\ntemplate<typename Scalar, int Dim>\ntemplate<typename RotationType>\nTransform<Scalar,Dim>&\nTransform<Scalar,Dim>::rotate(const RotationType& rotation)\n{\n  linear() *= ei_toRotationMatrix<Scalar,Dim>(rotation);\n  return *this;\n}\n\n/** Applies on the left the rotation represented by the rotation \\a rotation\n  * to \\c *this and returns a reference to \\c *this.\n  *\n  * See rotate() for further details.\n  *\n  * \\sa rotate()\n  */\ntemplate<typename Scalar, int Dim>\ntemplate<typename RotationType>\nTransform<Scalar,Dim>&\nTransform<Scalar,Dim>::prerotate(const RotationType& rotation)\n{\n  m_matrix.template block<Dim,HDim>(0,0) = ei_toRotationMatrix<Scalar,Dim>(rotation)\n                                         * m_matrix.template block<Dim,HDim>(0,0);\n  return *this;\n}\n\n/** Applies on the right the shear transformation represented\n  * by the vector \\a other to \\c *this and returns a reference to \\c *this.\n  * \\warning 2D only.\n  * \\sa preshear()\n  */\ntemplate<typename Scalar, int Dim>\nTransform<Scalar,Dim>&\nTransform<Scalar,Dim>::shear(Scalar sx, Scalar sy)\n{\n  EIGEN_STATIC_ASSERT(int(Dim)==2, YOU_MADE_A_PROGRAMMING_MISTAKE)\n  VectorType tmp = linear().col(0)*sy + linear().col(1);\n  linear() << linear().col(0) + linear().col(1)*sx, tmp;\n  return *this;\n}\n\n/** Applies on the left the shear transformation represented\n  * by the vector \\a other to \\c *this and returns a reference to \\c *this.\n  * \\warning 2D only.\n  * \\sa shear()\n  */\ntemplate<typename Scalar, int Dim>\nTransform<Scalar,Dim>&\nTransform<Scalar,Dim>::preshear(Scalar sx, Scalar sy)\n{\n  EIGEN_STATIC_ASSERT(int(Dim)==2, YOU_MADE_A_PROGRAMMING_MISTAKE)\n  m_matrix.template block<Dim,HDim>(0,0) = LinearMatrixType(1, sx, sy, 1) * m_matrix.template block<Dim,HDim>(0,0);\n  return *this;\n}\n\n/******************************************************\n*** Scaling, Translation and Rotation compatibility ***\n******************************************************/\n\ntemplate<typename Scalar, int Dim>\ninline Transform<Scalar,Dim>& Transform<Scalar,Dim>::operator=(const TranslationType& t)\n{\n  linear().setIdentity();\n  translation() = t.vector();\n  m_matrix.template block<1,Dim>(Dim,0).setZero();\n  m_matrix(Dim,Dim) = Scalar(1);\n  return *this;\n}\n\ntemplate<typename Scalar, int Dim>\ninline Transform<Scalar,Dim> Transform<Scalar,Dim>::operator*(const TranslationType& t) const\n{\n  Transform res = *this;\n  res.translate(t.vector());\n  return res;\n}\n\ntemplate<typename Scalar, int Dim>\ninline Transform<Scalar,Dim>& Transform<Scalar,Dim>::operator=(const ScalingType& s)\n{\n  m_matrix.setZero();\n  linear().diagonal() = s.coeffs();\n  m_matrix.coeffRef(Dim,Dim) = Scalar(1);\n  return *this;\n}\n\ntemplate<typename Scalar, int Dim>\ninline Transform<Scalar,Dim> Transform<Scalar,Dim>::operator*(const ScalingType& s) const\n{\n  Transform res = *this;\n  res.scale(s.coeffs());\n  return res;\n}\n\ntemplate<typename Scalar, int Dim>\ntemplate<typename Derived>\ninline Transform<Scalar,Dim>& Transform<Scalar,Dim>::operator=(const RotationBase<Derived,Dim>& r)\n{\n  linear() = ei_toRotationMatrix<Scalar,Dim>(r);\n  translation().setZero();\n  m_matrix.template block<1,Dim>(Dim,0).setZero();\n  m_matrix.coeffRef(Dim,Dim) = Scalar(1);\n  return *this;\n}\n\ntemplate<typename Scalar, int Dim>\ntemplate<typename Derived>\ninline Transform<Scalar,Dim> Transform<Scalar,Dim>::operator*(const RotationBase<Derived,Dim>& r) const\n{\n  Transform res = *this;\n  res.rotate(r.derived());\n  return res;\n}\n\n/************************\n*** Special functions ***\n************************/\n\n/** \\returns the rotation part of the transformation\n  * \\nonstableyet\n  *\n  * \\svd_module\n  *\n  * \\sa computeRotationScaling(), computeScalingRotation(), class SVD\n  */\ntemplate<typename Scalar, int Dim>\ntypename Transform<Scalar,Dim>::LinearMatrixType\nTransform<Scalar,Dim>::rotation() const\n{\n  LinearMatrixType result;\n  computeRotationScaling(&result, (LinearMatrixType*)0);\n  return result;\n}\n\n\n/** decomposes the linear part of the transformation as a product rotation x scaling, the scaling being\n  * not necessarily positive.\n  *\n  * If either pointer is zero, the corresponding computation is skipped.\n  *\n  * \\nonstableyet\n  *\n  * \\svd_module\n  *\n  * \\sa computeScalingRotation(), rotation(), class SVD\n  */\ntemplate<typename Scalar, int Dim>\ntemplate<typename RotationMatrixType, typename ScalingMatrixType>\nvoid Transform<Scalar,Dim>::computeRotationScaling(RotationMatrixType *rotation, ScalingMatrixType *scaling) const\n{\n  JacobiSVD<LinearMatrixType> svd(linear(), ComputeFullU|ComputeFullV);\n  Scalar x = (svd.matrixU() * svd.matrixV().adjoint()).determinant(); // so x has absolute value 1\n  Matrix<Scalar, Dim, 1> sv(svd.singularValues());\n  sv.coeffRef(0) *= x;\n  if(scaling)\n  {\n    scaling->noalias() = svd.matrixV() * sv.asDiagonal() * svd.matrixV().adjoint();\n  }\n  if(rotation)\n  {\n    LinearMatrixType m(svd.matrixU());\n    m.col(0) /= x;\n    rotation->noalias() = m * svd.matrixV().adjoint();\n  }\n}\n\n/** decomposes the linear part of the transformation as a product rotation x scaling, the scaling being\n  * not necessarily positive.\n  *\n  * If either pointer is zero, the corresponding computation is skipped.\n  *\n  * \\nonstableyet\n  *\n  * \\svd_module\n  *\n  * \\sa computeRotationScaling(), rotation(), class SVD\n  */\ntemplate<typename Scalar, int Dim>\ntemplate<typename ScalingMatrixType, typename RotationMatrixType>\nvoid Transform<Scalar,Dim>::computeScalingRotation(ScalingMatrixType *scaling, RotationMatrixType *rotation) const\n{\n  JacobiSVD<LinearMatrixType> svd(linear(), ComputeFullU|ComputeFullV);\n  Scalar x = (svd.matrixU() * svd.matrixV().adjoint()).determinant(); // so x has absolute value 1\n  Matrix<Scalar, Dim, 1> sv(svd.singularValues());\n  sv.coeffRef(0) *= x;\n  if(scaling)\n  {\n    scaling->noalias() = svd.matrixU() * sv.asDiagonal() * svd.matrixU().adjoint();\n  }\n  if(rotation)\n  {\n    LinearMatrixType m(svd.matrixU());\n    m.col(0) /= x;\n    rotation->noalias() = m * svd.matrixV().adjoint();\n  }\n}\n\n/** Convenient method to set \\c *this from a position, orientation and scale\n  * of a 3D object.\n  */\ntemplate<typename Scalar, int Dim>\ntemplate<typename PositionDerived, typename OrientationType, typename ScaleDerived>\nTransform<Scalar,Dim>&\nTransform<Scalar,Dim>::fromPositionOrientationScale(const MatrixBase<PositionDerived> &position,\n  const OrientationType& orientation, const MatrixBase<ScaleDerived> &scale)\n{\n  linear() = ei_toRotationMatrix<Scalar,Dim>(orientation);\n  linear() *= scale.asDiagonal();\n  translation() = position;\n  m_matrix.template block<1,Dim>(Dim,0).setZero();\n  m_matrix(Dim,Dim) = Scalar(1);\n  return *this;\n}\n\n/** \\nonstableyet\n  *\n  * \\returns the inverse transformation matrix according to some given knowledge\n  * on \\c *this.\n  *\n  * \\param traits allows to optimize the inversion process when the transformion\n  * is known to be not a general transformation. The possible values are:\n  *  - Projective if the transformation is not necessarily affine, i.e., if the\n  *    last row is not guaranteed to be [0 ... 0 1]\n  *  - Affine is the default, the last row is assumed to be [0 ... 0 1]\n  *  - Isometry if the transformation is only a concatenations of translations\n  *    and rotations.\n  *\n  * \\warning unless \\a traits is always set to NoShear or NoScaling, this function\n  * requires the generic inverse method of MatrixBase defined in the LU module. If\n  * you forget to include this module, then you will get hard to debug linking errors.\n  *\n  * \\sa MatrixBase::inverse()\n  */\ntemplate<typename Scalar, int Dim>\ninline const typename Transform<Scalar,Dim>::MatrixType\nTransform<Scalar,Dim>::inverse(TransformTraits traits) const\n{\n  if (traits == Projective)\n  {\n    return m_matrix.inverse();\n  }\n  else\n  {\n    MatrixType res;\n    if (traits == Affine)\n    {\n      res.template corner<Dim,Dim>(TopLeft) = linear().inverse();\n    }\n    else if (traits == Isometry)\n    {\n      res.template corner<Dim,Dim>(TopLeft) = linear().transpose();\n    }\n    else\n    {\n      ei_assert(\"invalid traits value in Transform::inverse()\");\n    }\n    // translation and remaining parts\n    res.template corner<Dim,1>(TopRight) = - res.template corner<Dim,Dim>(TopLeft) * translation();\n    res.template corner<1,Dim>(BottomLeft).setZero();\n    res.coeffRef(Dim,Dim) = Scalar(1);\n    return res;\n  }\n}\n\n/*****************************************************\n*** Specializations of operator* with a MatrixBase ***\n*****************************************************/\n\ntemplate<typename Other, int Dim, int HDim>\nstruct ei_transform_product_impl<Other,Dim,HDim, HDim,HDim>\n{\n  typedef Transform<typename Other::Scalar,Dim> TransformType;\n  typedef typename TransformType::MatrixType MatrixType;\n  typedef typename ProductReturnType<MatrixType,Other>::Type ResultType;\n  static ResultType run(const TransformType& tr, const Other& other)\n  { return tr.matrix() * other; }\n};\n\ntemplate<typename Other, int Dim, int HDim>\nstruct ei_transform_product_impl<Other,Dim,HDim, Dim,Dim>\n{\n  typedef Transform<typename Other::Scalar,Dim> TransformType;\n  typedef typename TransformType::MatrixType MatrixType;\n  typedef TransformType ResultType;\n  static ResultType run(const TransformType& tr, const Other& other)\n  {\n    TransformType res;\n    res.translation() = tr.translation();\n    res.matrix().row(Dim) = tr.matrix().row(Dim);\n    res.linear() = (tr.linear() * other).lazy();\n    return res;\n  }\n};\n\ntemplate<typename Other, int Dim, int HDim>\nstruct ei_transform_product_impl<Other,Dim,HDim, HDim,1>\n{\n  typedef Transform<typename Other::Scalar,Dim> TransformType;\n  typedef typename TransformType::MatrixType MatrixType;\n  typedef typename ProductReturnType<MatrixType,Other>::Type ResultType;\n  static ResultType run(const TransformType& tr, const Other& other)\n  { return tr.matrix() * other; }\n};\n\ntemplate<typename Other, int Dim, int HDim>\nstruct ei_transform_product_impl<Other,Dim,HDim, Dim,1>\n{\n  typedef typename Other::Scalar Scalar;\n  typedef Transform<Scalar,Dim> TransformType;\n  typedef Matrix<Scalar,Dim,1> ResultType;\n  static ResultType run(const TransformType& tr, const Other& other)\n  { return ((tr.linear() * other) + tr.translation())\n          * (Scalar(1) / ( (tr.matrix().template block<1,Dim>(Dim,0) * other).coeff(0) + tr.matrix().coeff(Dim,Dim))); }\n};\n\n} // end namespace Eigen\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigen2Support/Geometry/Translation.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n// no include guard, we'll include this twice from All.h from Eigen2Support, and it's internal anyway\n\nnamespace Eigen { \n\n/** \\geometry_module \\ingroup Geometry_Module\n  *\n  * \\class Translation\n  *\n  * \\brief Represents a translation transformation\n  *\n  * \\param _Scalar the scalar type, i.e., the type of the coefficients.\n  * \\param _Dim the  dimension of the space, can be a compile time value or Dynamic\n  *\n  * \\note This class is not aimed to be used to store a translation transformation,\n  * but rather to make easier the constructions and updates of Transform objects.\n  *\n  * \\sa class Scaling, class Transform\n  */\ntemplate<typename _Scalar, int _Dim>\nclass Translation\n{\npublic:\n  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_Dim)\n  /** dimension of the space */\n  enum { Dim = _Dim };\n  /** the scalar type of the coefficients */\n  typedef _Scalar Scalar;\n  /** corresponding vector type */\n  typedef Matrix<Scalar,Dim,1> VectorType;\n  /** corresponding linear transformation matrix type */\n  typedef Matrix<Scalar,Dim,Dim> LinearMatrixType;\n  /** corresponding scaling transformation type */\n  typedef Scaling<Scalar,Dim> ScalingType;\n  /** corresponding affine transformation type */\n  typedef Transform<Scalar,Dim> TransformType;\n\nprotected:\n\n  VectorType m_coeffs;\n\npublic:\n\n  /** Default constructor without initialization. */\n  Translation() {}\n  /**  */\n  inline Translation(const Scalar& sx, const Scalar& sy)\n  {\n    ei_assert(Dim==2);\n    m_coeffs.x() = sx;\n    m_coeffs.y() = sy;\n  }\n  /**  */\n  inline Translation(const Scalar& sx, const Scalar& sy, const Scalar& sz)\n  {\n    ei_assert(Dim==3);\n    m_coeffs.x() = sx;\n    m_coeffs.y() = sy;\n    m_coeffs.z() = sz;\n  }\n  /** Constructs and initialize the scaling transformation from a vector of scaling coefficients */\n  explicit inline Translation(const VectorType& vector) : m_coeffs(vector) {}\n\n  const VectorType& vector() const { return m_coeffs; }\n  VectorType& vector() { return m_coeffs; }\n\n  /** Concatenates two translation */\n  inline Translation operator* (const Translation& other) const\n  { return Translation(m_coeffs + other.m_coeffs); }\n\n  /** Concatenates a translation and a scaling */\n  inline TransformType operator* (const ScalingType& other) const;\n\n  /** Concatenates a translation and a linear transformation */\n  inline TransformType operator* (const LinearMatrixType& linear) const;\n\n  template<typename Derived>\n  inline TransformType operator*(const RotationBase<Derived,Dim>& r) const\n  { return *this * r.toRotationMatrix(); }\n\n  /** Concatenates a linear transformation and a translation */\n  // its a nightmare to define a templated friend function outside its declaration\n  friend inline TransformType operator* (const LinearMatrixType& linear, const Translation& t)\n  {\n    TransformType res;\n    res.matrix().setZero();\n    res.linear() = linear;\n    res.translation() = linear * t.m_coeffs;\n    res.matrix().row(Dim).setZero();\n    res(Dim,Dim) = Scalar(1);\n    return res;\n  }\n\n  /** Concatenates a translation and an affine transformation */\n  inline TransformType operator* (const TransformType& t) const;\n\n  /** Applies translation to vector */\n  inline VectorType operator* (const VectorType& other) const\n  { return m_coeffs + other; }\n\n  /** \\returns the inverse translation (opposite) */\n  Translation inverse() const { return Translation(-m_coeffs); }\n\n  Translation& operator=(const Translation& other)\n  {\n    m_coeffs = other.m_coeffs;\n    return *this;\n  }\n\n  /** \\returns \\c *this with scalar type casted to \\a NewScalarType\n    *\n    * Note that if \\a NewScalarType is equal to the current scalar type of \\c *this\n    * then this function smartly returns a const reference to \\c *this.\n    */\n  template<typename NewScalarType>\n  inline typename internal::cast_return_type<Translation,Translation<NewScalarType,Dim> >::type cast() const\n  { return typename internal::cast_return_type<Translation,Translation<NewScalarType,Dim> >::type(*this); }\n\n  /** Copy constructor with scalar type conversion */\n  template<typename OtherScalarType>\n  inline explicit Translation(const Translation<OtherScalarType,Dim>& other)\n  { m_coeffs = other.vector().template cast<Scalar>(); }\n\n  /** \\returns \\c true if \\c *this is approximately equal to \\a other, within the precision\n    * determined by \\a prec.\n    *\n    * \\sa MatrixBase::isApprox() */\n  bool isApprox(const Translation& other, typename NumTraits<Scalar>::Real prec = precision<Scalar>()) const\n  { return m_coeffs.isApprox(other.m_coeffs, prec); }\n\n};\n\n/** \\addtogroup Geometry_Module */\n//@{\ntypedef Translation<float, 2> Translation2f;\ntypedef Translation<double,2> Translation2d;\ntypedef Translation<float, 3> Translation3f;\ntypedef Translation<double,3> Translation3d;\n//@}\n\n\ntemplate<typename Scalar, int Dim>\ninline typename Translation<Scalar,Dim>::TransformType\nTranslation<Scalar,Dim>::operator* (const ScalingType& other) const\n{\n  TransformType res;\n  res.matrix().setZero();\n  res.linear().diagonal() = other.coeffs();\n  res.translation() = m_coeffs;\n  res(Dim,Dim) = Scalar(1);\n  return res;\n}\n\ntemplate<typename Scalar, int Dim>\ninline typename Translation<Scalar,Dim>::TransformType\nTranslation<Scalar,Dim>::operator* (const LinearMatrixType& linear) const\n{\n  TransformType res;\n  res.matrix().setZero();\n  res.linear() = linear;\n  res.translation() = m_coeffs;\n  res.matrix().row(Dim).setZero();\n  res(Dim,Dim) = Scalar(1);\n  return res;\n}\n\ntemplate<typename Scalar, int Dim>\ninline typename Translation<Scalar,Dim>::TransformType\nTranslation<Scalar,Dim>::operator* (const TransformType& t) const\n{\n  TransformType res = t;\n  res.pretranslate(m_coeffs);\n  return res;\n}\n\n} // end namespace Eigen\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigen2Support/LU.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2011 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN2_LU_H\n#define EIGEN2_LU_H\n\nnamespace Eigen { \n\ntemplate<typename MatrixType>\nclass LU : public FullPivLU<MatrixType>\n{\n  public:\n\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename NumTraits<typename MatrixType::Scalar>::Real RealScalar;\n    typedef Matrix<int, 1, MatrixType::ColsAtCompileTime, MatrixType::Options, 1, MatrixType::MaxColsAtCompileTime> IntRowVectorType;\n    typedef Matrix<int, MatrixType::RowsAtCompileTime, 1, MatrixType::Options, MatrixType::MaxRowsAtCompileTime, 1> IntColVectorType;\n    typedef Matrix<Scalar, 1, MatrixType::ColsAtCompileTime, MatrixType::Options, 1, MatrixType::MaxColsAtCompileTime> RowVectorType;\n    typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1, MatrixType::Options, MatrixType::MaxRowsAtCompileTime, 1> ColVectorType;\n\n    typedef Matrix<typename MatrixType::Scalar,\n                  MatrixType::ColsAtCompileTime, // the number of rows in the \"kernel matrix\" is the number of cols of the original matrix\n                                                 // so that the product \"matrix * kernel = zero\" makes sense\n                  Dynamic,                       // we don't know at compile-time the dimension of the kernel\n                  MatrixType::Options,\n                  MatrixType::MaxColsAtCompileTime, // see explanation for 2nd template parameter\n                  MatrixType::MaxColsAtCompileTime // the kernel is a subspace of the domain space, whose dimension is the number\n                                                   // of columns of the original matrix\n    > KernelResultType;\n\n    typedef Matrix<typename MatrixType::Scalar,\n                   MatrixType::RowsAtCompileTime, // the image is a subspace of the destination space, whose dimension is the number\n                                                  // of rows of the original matrix\n                   Dynamic,                       // we don't know at compile time the dimension of the image (the rank)\n                   MatrixType::Options,\n                   MatrixType::MaxRowsAtCompileTime, // the image matrix will consist of columns from the original matrix,\n                   MatrixType::MaxColsAtCompileTime  // so it has the same number of rows and at most as many columns.\n    > ImageResultType;\n\n    typedef FullPivLU<MatrixType> Base;\n\n    template<typename T>\n    explicit LU(const T& t) : Base(t), m_originalMatrix(t) {}\n\n    template<typename OtherDerived, typename ResultType>\n    bool solve(const MatrixBase<OtherDerived>& b, ResultType *result) const\n    {\n      *result = static_cast<const Base*>(this)->solve(b);\n      return true;\n    }\n\n    template<typename ResultType>\n    inline void computeInverse(ResultType *result) const\n    {\n      solve(MatrixType::Identity(this->rows(), this->cols()), result);\n    }\n    \n    template<typename KernelMatrixType>\n    void computeKernel(KernelMatrixType *result) const\n    {\n      *result = static_cast<const Base*>(this)->kernel();\n    }\n    \n    template<typename ImageMatrixType>\n    void computeImage(ImageMatrixType *result) const\n    {\n      *result = static_cast<const Base*>(this)->image(m_originalMatrix);\n    }\n    \n    const ImageResultType image() const\n    {\n      return static_cast<const Base*>(this)->image(m_originalMatrix);\n    }\n    \n    const MatrixType& m_originalMatrix;\n};\n\n#if EIGEN2_SUPPORT_STAGE < STAGE20_RESOLVE_API_CONFLICTS\n/** \\lu_module\n  *\n  * Synonym of partialPivLu().\n  *\n  * \\return the partial-pivoting LU decomposition of \\c *this.\n  *\n  * \\sa class PartialPivLU\n  */\ntemplate<typename Derived>\ninline const LU<typename MatrixBase<Derived>::PlainObject>\nMatrixBase<Derived>::lu() const\n{\n  return LU<PlainObject>(eval());\n}\n#endif\n\n#ifdef EIGEN2_SUPPORT\n/** \\lu_module\n  *\n  * Synonym of partialPivLu().\n  *\n  * \\return the partial-pivoting LU decomposition of \\c *this.\n  *\n  * \\sa class PartialPivLU\n  */\ntemplate<typename Derived>\ninline const LU<typename MatrixBase<Derived>::PlainObject>\nMatrixBase<Derived>::eigen2_lu() const\n{\n  return LU<PlainObject>(eval());\n}\n#endif\n\n} // end namespace Eigen\n\n#endif // EIGEN2_LU_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigen2Support/Lazy.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_LAZY_H\n#define EIGEN_LAZY_H\n\nnamespace Eigen { \n\n/** \\deprecated it is only used by lazy() which is deprecated\n  *\n  * \\returns an expression of *this with added flags\n  *\n  * Example: \\include MatrixBase_marked.cpp\n  * Output: \\verbinclude MatrixBase_marked.out\n  *\n  * \\sa class Flagged, extract(), part()\n  */\ntemplate<typename Derived>\ntemplate<unsigned int Added>\ninline const Flagged<Derived, Added, 0>\nMatrixBase<Derived>::marked() const\n{\n  return derived();\n}\n\n/** \\deprecated use MatrixBase::noalias()\n  *\n  * \\returns an expression of *this with the EvalBeforeAssigningBit flag removed.\n  *\n  * Example: \\include MatrixBase_lazy.cpp\n  * Output: \\verbinclude MatrixBase_lazy.out\n  *\n  * \\sa class Flagged, marked()\n  */\ntemplate<typename Derived>\ninline const Flagged<Derived, 0, EvalBeforeAssigningBit>\nMatrixBase<Derived>::lazy() const\n{\n  return derived();\n}\n\n\n/** \\internal\n  * Overloaded to perform an efficient C += (A*B).lazy() */\ntemplate<typename Derived>\ntemplate<typename ProductDerived, typename Lhs, typename Rhs>\nDerived& MatrixBase<Derived>::operator+=(const Flagged<ProductBase<ProductDerived, Lhs,Rhs>, 0,\n                                                       EvalBeforeAssigningBit>& other)\n{\n  other._expression().derived().addTo(derived()); return derived();\n}\n\n/** \\internal\n  * Overloaded to perform an efficient C -= (A*B).lazy() */\ntemplate<typename Derived>\ntemplate<typename ProductDerived, typename Lhs, typename Rhs>\nDerived& MatrixBase<Derived>::operator-=(const Flagged<ProductBase<ProductDerived, Lhs,Rhs>, 0,\n                                                       EvalBeforeAssigningBit>& other)\n{\n  other._expression().derived().subTo(derived()); return derived();\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_LAZY_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigen2Support/LeastSquares.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2006-2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN2_LEASTSQUARES_H\n#define EIGEN2_LEASTSQUARES_H\n\nnamespace Eigen { \n\n/** \\ingroup LeastSquares_Module\n  *\n  * \\leastsquares_module\n  *\n  * For a set of points, this function tries to express\n  * one of the coords as a linear (affine) function of the other coords.\n  *\n  * This is best explained by an example. This function works in full\n  * generality, for points in a space of arbitrary dimension, and also over\n  * the complex numbers, but for this example we will work in dimension 3\n  * over the real numbers (doubles).\n  *\n  * So let us work with the following set of 5 points given by their\n  * \\f$(x,y,z)\\f$ coordinates:\n  * @code\n    Vector3d points[5];\n    points[0] = Vector3d( 3.02, 6.89, -4.32 );\n    points[1] = Vector3d( 2.01, 5.39, -3.79 );\n    points[2] = Vector3d( 2.41, 6.01, -4.01 );\n    points[3] = Vector3d( 2.09, 5.55, -3.86 );\n    points[4] = Vector3d( 2.58, 6.32, -4.10 );\n  * @endcode\n  * Suppose that we want to express the second coordinate (\\f$y\\f$) as a linear\n  * expression in \\f$x\\f$ and \\f$z\\f$, that is,\n  * \\f[ y=ax+bz+c \\f]\n  * for some constants \\f$a,b,c\\f$. Thus, we want to find the best possible\n  * constants \\f$a,b,c\\f$ so that the plane of equation \\f$y=ax+bz+c\\f$ fits\n  * best the five above points. To do that, call this function as follows:\n  * @code\n    Vector3d coeffs; // will store the coefficients a, b, c\n    linearRegression(\n      5,\n      &points,\n      &coeffs,\n      1 // the coord to express as a function of\n        // the other ones. 0 means x, 1 means y, 2 means z.\n    );\n  * @endcode\n  * Now the vector \\a coeffs is approximately\n  * \\f$( 0.495 ,  -1.927 ,  -2.906 )\\f$.\n  * Thus, we get \\f$a=0.495, b = -1.927, c = -2.906\\f$. Let us check for\n  * instance how near points[0] is from the plane of equation \\f$y=ax+bz+c\\f$.\n  * Looking at the coords of points[0], we see that:\n  * \\f[ax+bz+c = 0.495 * 3.02 + (-1.927) * (-4.32) + (-2.906) = 6.91.\\f]\n  * On the other hand, we have \\f$y=6.89\\f$. We see that the values\n  * \\f$6.91\\f$ and \\f$6.89\\f$\n  * are near, so points[0] is very near the plane of equation \\f$y=ax+bz+c\\f$.\n  *\n  * Let's now describe precisely the parameters:\n  * @param numPoints the number of points\n  * @param points the array of pointers to the points on which to perform the linear regression\n  * @param result pointer to the vector in which to store the result.\n                  This vector must be of the same type and size as the\n                  data points. The meaning of its coords is as follows.\n                  For brevity, let \\f$n=Size\\f$,\n                  \\f$r_i=result[i]\\f$,\n                  and \\f$f=funcOfOthers\\f$. Denote by\n                  \\f$x_0,\\ldots,x_{n-1}\\f$\n                  the n coordinates in the n-dimensional space.\n                  Then the resulting equation is:\n                  \\f[ x_f = r_0 x_0 + \\cdots + r_{f-1}x_{f-1}\n                   + r_{f+1}x_{f+1} + \\cdots + r_{n-1}x_{n-1} + r_n. \\f]\n  * @param funcOfOthers Determines which coord to express as a function of the\n                        others. Coords are numbered starting from 0, so that a\n                        value of 0 means \\f$x\\f$, 1 means \\f$y\\f$,\n                        2 means \\f$z\\f$, ...\n  *\n  * \\sa fitHyperplane()\n  */\ntemplate<typename VectorType>\nvoid linearRegression(int numPoints,\n                      VectorType **points,\n                      VectorType *result,\n                      int funcOfOthers )\n{\n  typedef typename VectorType::Scalar Scalar;\n  typedef Hyperplane<Scalar, VectorType::SizeAtCompileTime> HyperplaneType;\n  const int size = points[0]->size();\n  result->resize(size);\n  HyperplaneType h(size);\n  fitHyperplane(numPoints, points, &h);\n  for(int i = 0; i < funcOfOthers; i++)\n    result->coeffRef(i) = - h.coeffs()[i] / h.coeffs()[funcOfOthers];\n  for(int i = funcOfOthers; i < size; i++)\n    result->coeffRef(i) = - h.coeffs()[i+1] / h.coeffs()[funcOfOthers];\n}\n\n/** \\ingroup LeastSquares_Module\n  *\n  * \\leastsquares_module\n  *\n  * This function is quite similar to linearRegression(), so we refer to the\n  * documentation of this function and only list here the differences.\n  *\n  * The main difference from linearRegression() is that this function doesn't\n  * take a \\a funcOfOthers argument. Instead, it finds a general equation\n  * of the form\n  * \\f[ r_0 x_0 + \\cdots + r_{n-1}x_{n-1} + r_n = 0, \\f]\n  * where \\f$n=Size\\f$, \\f$r_i=retCoefficients[i]\\f$, and we denote by\n  * \\f$x_0,\\ldots,x_{n-1}\\f$ the n coordinates in the n-dimensional space.\n  *\n  * Thus, the vector \\a retCoefficients has size \\f$n+1\\f$, which is another\n  * difference from linearRegression().\n  *\n  * In practice, this function performs an hyper-plane fit in a total least square sense\n  * via the following steps:\n  *  1 - center the data to the mean\n  *  2 - compute the covariance matrix\n  *  3 - pick the eigenvector corresponding to the smallest eigenvalue of the covariance matrix\n  * The ratio of the smallest eigenvalue and the second one gives us a hint about the relevance\n  * of the solution. This value is optionally returned in \\a soundness.\n  *\n  * \\sa linearRegression()\n  */\ntemplate<typename VectorType, typename HyperplaneType>\nvoid fitHyperplane(int numPoints,\n                   VectorType **points,\n                   HyperplaneType *result,\n                   typename NumTraits<typename VectorType::Scalar>::Real* soundness = 0)\n{\n  typedef typename VectorType::Scalar Scalar;\n  typedef Matrix<Scalar,VectorType::SizeAtCompileTime,VectorType::SizeAtCompileTime> CovMatrixType;\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(VectorType)\n  ei_assert(numPoints >= 1);\n  int size = points[0]->size();\n  ei_assert(size+1 == result->coeffs().size());\n\n  // compute the mean of the data\n  VectorType mean = VectorType::Zero(size);\n  for(int i = 0; i < numPoints; ++i)\n    mean += *(points[i]);\n  mean /= numPoints;\n\n  // compute the covariance matrix\n  CovMatrixType covMat = CovMatrixType::Zero(size, size);\n  for(int i = 0; i < numPoints; ++i)\n  {\n    VectorType diff = (*(points[i]) - mean).conjugate();\n    covMat += diff * diff.adjoint();\n  }\n\n  // now we just have to pick the eigen vector with smallest eigen value\n  SelfAdjointEigenSolver<CovMatrixType> eig(covMat);\n  result->normal() = eig.eigenvectors().col(0);\n  if (soundness)\n    *soundness = eig.eigenvalues().coeff(0)/eig.eigenvalues().coeff(1);\n\n  // let's compute the constant coefficient such that the\n  // plane pass trough the mean point:\n  result->offset() = - (result->normal().cwise()* mean).sum();\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN2_LEASTSQUARES_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigen2Support/Macros.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2011 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN2_MACROS_H\n#define EIGEN2_MACROS_H\n\n#define ei_assert eigen_assert\n#define ei_internal_assert eigen_internal_assert\n\n#define EIGEN_ALIGN_128 EIGEN_ALIGN16\n\n#define EIGEN_ARCH_WANTS_ALIGNMENT EIGEN_ALIGN_STATICALLY\n\n#endif // EIGEN2_MACROS_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigen2Support/MathFunctions.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN2_MATH_FUNCTIONS_H\n#define EIGEN2_MATH_FUNCTIONS_H\n\nnamespace Eigen { \n\ntemplate<typename T> inline typename NumTraits<T>::Real ei_real(const T& x) { return numext::real(x); }\ntemplate<typename T> inline typename NumTraits<T>::Real ei_imag(const T& x) { return numext::imag(x); }\ntemplate<typename T> inline T ei_conj(const T& x) { return numext::conj(x); }\ntemplate<typename T> inline typename NumTraits<T>::Real ei_abs (const T& x) { using std::abs; return abs(x); }\ntemplate<typename T> inline typename NumTraits<T>::Real ei_abs2(const T& x) { return numext::abs2(x); }\ntemplate<typename T> inline T ei_sqrt(const T& x) { using std::sqrt; return sqrt(x); }\ntemplate<typename T> inline T ei_exp (const T& x) { using std::exp;  return exp(x); }\ntemplate<typename T> inline T ei_log (const T& x) { using std::log;  return log(x); }\ntemplate<typename T> inline T ei_sin (const T& x) { using std::sin;  return sin(x); }\ntemplate<typename T> inline T ei_cos (const T& x) { using std::cos;  return cos(x); }\ntemplate<typename T> inline T ei_atan2(const T& x,const T& y) { using std::atan2; return atan2(x,y); }\ntemplate<typename T> inline T ei_pow (const T& x,const T& y) { return numext::pow(x,y); }\ntemplate<typename T> inline T ei_random () { return internal::random<T>(); }\ntemplate<typename T> inline T ei_random (const T& x, const T& y) { return internal::random(x, y); }\n\ntemplate<typename T> inline T precision () { return NumTraits<T>::dummy_precision(); }\ntemplate<typename T> inline T machine_epsilon () { return NumTraits<T>::epsilon(); }\n\n\ntemplate<typename Scalar, typename OtherScalar>\ninline bool ei_isMuchSmallerThan(const Scalar& x, const OtherScalar& y,\n                                   typename NumTraits<Scalar>::Real precision = NumTraits<Scalar>::dummy_precision())\n{\n  return internal::isMuchSmallerThan(x, y, precision);\n}\n\ntemplate<typename Scalar>\ninline bool ei_isApprox(const Scalar& x, const Scalar& y,\n                          typename NumTraits<Scalar>::Real precision = NumTraits<Scalar>::dummy_precision())\n{\n  return internal::isApprox(x, y, precision);\n}\n\ntemplate<typename Scalar>\ninline bool ei_isApproxOrLessThan(const Scalar& x, const Scalar& y,\n                                    typename NumTraits<Scalar>::Real precision = NumTraits<Scalar>::dummy_precision())\n{\n  return internal::isApproxOrLessThan(x, y, precision);\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN2_MATH_FUNCTIONS_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigen2Support/Memory.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2011 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN2_MEMORY_H\n#define EIGEN2_MEMORY_H\n\nnamespace Eigen { \n\ninline void* ei_aligned_malloc(size_t size) { return internal::aligned_malloc(size); }\ninline void  ei_aligned_free(void *ptr) { internal::aligned_free(ptr); }\ninline void* ei_aligned_realloc(void *ptr, size_t new_size, size_t old_size) { return internal::aligned_realloc(ptr, new_size, old_size); }\ninline void* ei_handmade_aligned_malloc(size_t size) { return internal::handmade_aligned_malloc(size); }\ninline void  ei_handmade_aligned_free(void *ptr) { internal::handmade_aligned_free(ptr); }\n\ntemplate<bool Align> inline void* ei_conditional_aligned_malloc(size_t size)\n{\n  return internal::conditional_aligned_malloc<Align>(size);\n}\ntemplate<bool Align> inline void ei_conditional_aligned_free(void *ptr)\n{\n  internal::conditional_aligned_free<Align>(ptr);\n}\ntemplate<bool Align> inline void* ei_conditional_aligned_realloc(void* ptr, size_t new_size, size_t old_size)\n{\n  return internal::conditional_aligned_realloc<Align>(ptr, new_size, old_size);\n}\n\ntemplate<typename T> inline T* ei_aligned_new(size_t size)\n{\n  return internal::aligned_new<T>(size);\n}\ntemplate<typename T> inline void ei_aligned_delete(T *ptr, size_t size)\n{\n  return internal::aligned_delete(ptr, size);\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN2_MACROS_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigen2Support/Meta.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2011 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN2_META_H\n#define EIGEN2_META_H\n\nnamespace Eigen { \n\ntemplate<typename T>\nstruct ei_traits : internal::traits<T>\n{};\n\nstruct ei_meta_true {  enum { ret = 1 }; };\nstruct ei_meta_false { enum { ret = 0 }; };\n\ntemplate<bool Condition, typename Then, typename Else>\nstruct ei_meta_if { typedef Then ret; };\n\ntemplate<typename Then, typename Else>\nstruct ei_meta_if <false, Then, Else> { typedef Else ret; };\n\ntemplate<typename T, typename U> struct ei_is_same_type { enum { ret = 0 }; };\ntemplate<typename T> struct ei_is_same_type<T,T> { enum { ret = 1 }; };\n\ntemplate<typename T> struct ei_unref { typedef T type; };\ntemplate<typename T> struct ei_unref<T&> { typedef T type; };\n\ntemplate<typename T> struct ei_unpointer { typedef T type; };\ntemplate<typename T> struct ei_unpointer<T*> { typedef T type; };\ntemplate<typename T> struct ei_unpointer<T*const> { typedef T type; };\n\ntemplate<typename T> struct ei_unconst { typedef T type; };\ntemplate<typename T> struct ei_unconst<const T> { typedef T type; };\ntemplate<typename T> struct ei_unconst<T const &> { typedef T & type; };\ntemplate<typename T> struct ei_unconst<T const *> { typedef T * type; };\n\ntemplate<typename T> struct ei_cleantype { typedef T type; };\ntemplate<typename T> struct ei_cleantype<const T>   { typedef typename ei_cleantype<T>::type type; };\ntemplate<typename T> struct ei_cleantype<const T&>  { typedef typename ei_cleantype<T>::type type; };\ntemplate<typename T> struct ei_cleantype<T&>        { typedef typename ei_cleantype<T>::type type; };\ntemplate<typename T> struct ei_cleantype<const T*>  { typedef typename ei_cleantype<T>::type type; };\ntemplate<typename T> struct ei_cleantype<T*>        { typedef typename ei_cleantype<T>::type type; };\n\n/** \\internal In short, it computes int(sqrt(\\a Y)) with \\a Y an integer.\n  * Usage example: \\code ei_meta_sqrt<1023>::ret \\endcode\n  */\ntemplate<int Y,\n         int InfX = 0,\n         int SupX = ((Y==1) ? 1 : Y/2),\n         bool Done = ((SupX-InfX)<=1 ? true : ((SupX*SupX <= Y) && ((SupX+1)*(SupX+1) > Y))) >\n                                // use ?: instead of || just to shut up a stupid gcc 4.3 warning\nclass ei_meta_sqrt\n{\n    enum {\n      MidX = (InfX+SupX)/2,\n      TakeInf = MidX*MidX > Y ? 1 : 0,\n      NewInf = int(TakeInf) ? InfX : int(MidX),\n      NewSup = int(TakeInf) ? int(MidX) : SupX\n    };\n  public:\n    enum { ret = ei_meta_sqrt<Y,NewInf,NewSup>::ret };\n};\n\ntemplate<int Y, int InfX, int SupX>\nclass ei_meta_sqrt<Y, InfX, SupX, true> { public:  enum { ret = (SupX*SupX <= Y) ? SupX : InfX }; };\n\n} // end namespace Eigen\n\n#endif // EIGEN2_META_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigen2Support/Minor.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2006-2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_MINOR_H\n#define EIGEN_MINOR_H\n\nnamespace Eigen { \n\n/**\n  * \\class Minor\n  *\n  * \\brief Expression of a minor\n  *\n  * \\param MatrixType the type of the object in which we are taking a minor\n  *\n  * This class represents an expression of a minor. It is the return\n  * type of MatrixBase::minor() and most of the time this is the only way it\n  * is used.\n  *\n  * \\sa MatrixBase::minor()\n  */\n\nnamespace internal {\ntemplate<typename MatrixType>\nstruct traits<Minor<MatrixType> >\n : traits<MatrixType>\n{\n  typedef typename nested<MatrixType>::type MatrixTypeNested;\n  typedef typename remove_reference<MatrixTypeNested>::type _MatrixTypeNested;\n  typedef typename MatrixType::StorageKind StorageKind;\n  enum {\n    RowsAtCompileTime = (MatrixType::RowsAtCompileTime != Dynamic) ?\n                          int(MatrixType::RowsAtCompileTime) - 1 : Dynamic,\n    ColsAtCompileTime = (MatrixType::ColsAtCompileTime != Dynamic) ?\n                          int(MatrixType::ColsAtCompileTime) - 1 : Dynamic,\n    MaxRowsAtCompileTime = (MatrixType::MaxRowsAtCompileTime != Dynamic) ?\n                             int(MatrixType::MaxRowsAtCompileTime) - 1 : Dynamic,\n    MaxColsAtCompileTime = (MatrixType::MaxColsAtCompileTime != Dynamic) ?\n                             int(MatrixType::MaxColsAtCompileTime) - 1 : Dynamic,\n    Flags = _MatrixTypeNested::Flags & (HereditaryBits | LvalueBit),\n    CoeffReadCost = _MatrixTypeNested::CoeffReadCost // minor is used typically on tiny matrices,\n      // where loops are unrolled and the 'if' evaluates at compile time\n  };\n};\n}\n\ntemplate<typename MatrixType> class Minor\n  : public MatrixBase<Minor<MatrixType> >\n{\n  public:\n\n    typedef MatrixBase<Minor> Base;\n    EIGEN_DENSE_PUBLIC_INTERFACE(Minor)\n\n    inline Minor(const MatrixType& matrix,\n                       Index row, Index col)\n      : m_matrix(matrix), m_row(row), m_col(col)\n    {\n      eigen_assert(row >= 0 && row < matrix.rows()\n          && col >= 0 && col < matrix.cols());\n    }\n\n    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Minor)\n\n    inline Index rows() const { return m_matrix.rows() - 1; }\n    inline Index cols() const { return m_matrix.cols() - 1; }\n\n    inline Scalar& coeffRef(Index row, Index col)\n    {\n      return m_matrix.const_cast_derived().coeffRef(row + (row >= m_row), col + (col >= m_col));\n    }\n\n    inline const Scalar coeff(Index row, Index col) const\n    {\n      return m_matrix.coeff(row + (row >= m_row), col + (col >= m_col));\n    }\n\n  protected:\n    const typename MatrixType::Nested m_matrix;\n    const Index m_row, m_col;\n};\n\n/**\n  * \\return an expression of the (\\a row, \\a col)-minor of *this,\n  * i.e. an expression constructed from *this by removing the specified\n  * row and column.\n  *\n  * Example: \\include MatrixBase_minor.cpp\n  * Output: \\verbinclude MatrixBase_minor.out\n  *\n  * \\sa class Minor\n  */\ntemplate<typename Derived>\ninline Minor<Derived>\nMatrixBase<Derived>::minor(Index row, Index col)\n{\n  return Minor<Derived>(derived(), row, col);\n}\n\n/**\n  * This is the const version of minor(). */\ntemplate<typename Derived>\ninline const Minor<Derived>\nMatrixBase<Derived>::minor(Index row, Index col) const\n{\n  return Minor<Derived>(derived(), row, col);\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_MINOR_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigen2Support/QR.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>\n// Copyright (C) 2011 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN2_QR_H\n#define EIGEN2_QR_H\n\nnamespace Eigen { \n\ntemplate<typename MatrixType>\nclass QR : public HouseholderQR<MatrixType>\n{\n  public:\n\n    typedef HouseholderQR<MatrixType> Base;\n    typedef Block<const MatrixType, MatrixType::ColsAtCompileTime, MatrixType::ColsAtCompileTime> MatrixRBlockType;\n\n    QR() : Base() {}\n\n    template<typename T>\n    explicit QR(const T& t) : Base(t) {}\n\n    template<typename OtherDerived, typename ResultType>\n    bool solve(const MatrixBase<OtherDerived>& b, ResultType *result) const\n    {\n      *result = static_cast<const Base*>(this)->solve(b);\n      return true;\n    }\n\n    MatrixType matrixQ(void) const {\n      MatrixType ret = MatrixType::Identity(this->rows(), this->cols());\n      ret = this->householderQ() * ret;\n      return ret;\n    }\n\n    bool isFullRank() const {\n      return true;\n    }\n    \n    const TriangularView<MatrixRBlockType, UpperTriangular>\n    matrixR(void) const\n    {\n      int cols = this->cols();\n      return MatrixRBlockType(this->matrixQR(), 0, 0, cols, cols).template triangularView<UpperTriangular>();\n    }\n};\n\n/** \\return the QR decomposition of \\c *this.\n  *\n  * \\sa class QR\n  */\ntemplate<typename Derived>\nconst QR<typename MatrixBase<Derived>::PlainObject>\nMatrixBase<Derived>::qr() const\n{\n  return QR<PlainObject>(eval());\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN2_QR_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigen2Support/SVD.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN2_SVD_H\n#define EIGEN2_SVD_H\n\nnamespace Eigen {\n\n/** \\ingroup SVD_Module\n  * \\nonstableyet\n  *\n  * \\class SVD\n  *\n  * \\brief Standard SVD decomposition of a matrix and associated features\n  *\n  * \\param MatrixType the type of the matrix of which we are computing the SVD decomposition\n  *\n  * This class performs a standard SVD decomposition of a real matrix A of size \\c M x \\c N\n  * with \\c M \\>= \\c N.\n  *\n  *\n  * \\sa MatrixBase::SVD()\n  */\ntemplate<typename MatrixType> class SVD\n{\n  private:\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename NumTraits<typename MatrixType::Scalar>::Real RealScalar;\n\n    enum {\n      PacketSize = internal::packet_traits<Scalar>::size,\n      AlignmentMask = int(PacketSize)-1,\n      MinSize = EIGEN_SIZE_MIN_PREFER_DYNAMIC(MatrixType::RowsAtCompileTime, MatrixType::ColsAtCompileTime)\n    };\n\n    typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> ColVector;\n    typedef Matrix<Scalar, MatrixType::ColsAtCompileTime, 1> RowVector;\n\n    typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, MinSize> MatrixUType;\n    typedef Matrix<Scalar, MatrixType::ColsAtCompileTime, MatrixType::ColsAtCompileTime> MatrixVType;\n    typedef Matrix<Scalar, MinSize, 1> SingularValuesType;\n\n  public:\n\n    SVD() {} // a user who relied on compiler-generated default compiler reported problems with MSVC in 2.0.7\n    \n    SVD(const MatrixType& matrix)\n      : m_matU(matrix.rows(), (std::min)(matrix.rows(), matrix.cols())),\n        m_matV(matrix.cols(),matrix.cols()),\n        m_sigma((std::min)(matrix.rows(),matrix.cols()))\n    {\n      compute(matrix);\n    }\n\n    template<typename OtherDerived, typename ResultType>\n    bool solve(const MatrixBase<OtherDerived> &b, ResultType* result) const;\n\n    const MatrixUType& matrixU() const { return m_matU; }\n    const SingularValuesType& singularValues() const { return m_sigma; }\n    const MatrixVType& matrixV() const { return m_matV; }\n\n    void compute(const MatrixType& matrix);\n    SVD& sort();\n\n    template<typename UnitaryType, typename PositiveType>\n    void computeUnitaryPositive(UnitaryType *unitary, PositiveType *positive) const;\n    template<typename PositiveType, typename UnitaryType>\n    void computePositiveUnitary(PositiveType *positive, UnitaryType *unitary) const;\n    template<typename RotationType, typename ScalingType>\n    void computeRotationScaling(RotationType *unitary, ScalingType *positive) const;\n    template<typename ScalingType, typename RotationType>\n    void computeScalingRotation(ScalingType *positive, RotationType *unitary) const;\n\n  protected:\n    /** \\internal */\n    MatrixUType m_matU;\n    /** \\internal */\n    MatrixVType m_matV;\n    /** \\internal */\n    SingularValuesType m_sigma;\n};\n\n/** Computes / recomputes the SVD decomposition A = U S V^* of \\a matrix\n  *\n  * \\note this code has been adapted from JAMA (public domain)\n  */\ntemplate<typename MatrixType>\nvoid SVD<MatrixType>::compute(const MatrixType& matrix)\n{\n  const int m = matrix.rows();\n  const int n = matrix.cols();\n  const int nu = (std::min)(m,n);\n  ei_assert(m>=n && \"In Eigen 2.0, SVD only works for MxN matrices with M>=N. Sorry!\");\n  ei_assert(m>1 && \"In Eigen 2.0, SVD doesn't work on 1x1 matrices\");\n\n  m_matU.resize(m, nu);\n  m_matU.setZero();\n  m_sigma.resize((std::min)(m,n));\n  m_matV.resize(n,n);\n\n  RowVector e(n);\n  ColVector work(m);\n  MatrixType matA(matrix);\n  const bool wantu = true;\n  const bool wantv = true;\n  int i=0, j=0, k=0;\n\n  // Reduce A to bidiagonal form, storing the diagonal elements\n  // in s and the super-diagonal elements in e.\n  int nct = (std::min)(m-1,n);\n  int nrt = (std::max)(0,(std::min)(n-2,m));\n  for (k = 0; k < (std::max)(nct,nrt); ++k)\n  {\n    if (k < nct)\n    {\n      // Compute the transformation for the k-th column and\n      // place the k-th diagonal in m_sigma[k].\n      m_sigma[k] = matA.col(k).end(m-k).norm();\n      if (m_sigma[k] != 0.0) // FIXME\n      {\n        if (matA(k,k) < 0.0)\n          m_sigma[k] = -m_sigma[k];\n        matA.col(k).end(m-k) /= m_sigma[k];\n        matA(k,k) += 1.0;\n      }\n      m_sigma[k] = -m_sigma[k];\n    }\n\n    for (j = k+1; j < n; ++j)\n    {\n      if ((k < nct) && (m_sigma[k] != 0.0))\n      {\n        // Apply the transformation.\n        Scalar t = matA.col(k).end(m-k).eigen2_dot(matA.col(j).end(m-k)); // FIXME dot product or cwise prod + .sum() ??\n        t = -t/matA(k,k);\n        matA.col(j).end(m-k) += t * matA.col(k).end(m-k);\n      }\n\n      // Place the k-th row of A into e for the\n      // subsequent calculation of the row transformation.\n      e[j] = matA(k,j);\n    }\n\n    // Place the transformation in U for subsequent back multiplication.\n    if (wantu & (k < nct))\n      m_matU.col(k).end(m-k) = matA.col(k).end(m-k);\n\n    if (k < nrt)\n    {\n      // Compute the k-th row transformation and place the\n      // k-th super-diagonal in e[k].\n      e[k] = e.end(n-k-1).norm();\n      if (e[k] != 0.0)\n      {\n          if (e[k+1] < 0.0)\n            e[k] = -e[k];\n          e.end(n-k-1) /= e[k];\n          e[k+1] += 1.0;\n      }\n      e[k] = -e[k];\n      if ((k+1 < m) & (e[k] != 0.0))\n      {\n        // Apply the transformation.\n        work.end(m-k-1) = matA.corner(BottomRight,m-k-1,n-k-1) * e.end(n-k-1);\n        for (j = k+1; j < n; ++j)\n          matA.col(j).end(m-k-1) += (-e[j]/e[k+1]) * work.end(m-k-1);\n      }\n\n      // Place the transformation in V for subsequent back multiplication.\n      if (wantv)\n        m_matV.col(k).end(n-k-1) = e.end(n-k-1);\n    }\n  }\n\n\n  // Set up the final bidiagonal matrix or order p.\n  int p = (std::min)(n,m+1);\n  if (nct < n)\n    m_sigma[nct] = matA(nct,nct);\n  if (m < p)\n    m_sigma[p-1] = 0.0;\n  if (nrt+1 < p)\n    e[nrt] = matA(nrt,p-1);\n  e[p-1] = 0.0;\n\n  // If required, generate U.\n  if (wantu)\n  {\n    for (j = nct; j < nu; ++j)\n    {\n      m_matU.col(j).setZero();\n      m_matU(j,j) = 1.0;\n    }\n    for (k = nct-1; k >= 0; k--)\n    {\n      if (m_sigma[k] != 0.0)\n      {\n        for (j = k+1; j < nu; ++j)\n        {\n          Scalar t = m_matU.col(k).end(m-k).eigen2_dot(m_matU.col(j).end(m-k)); // FIXME is it really a dot product we want ?\n          t = -t/m_matU(k,k);\n          m_matU.col(j).end(m-k) += t * m_matU.col(k).end(m-k);\n        }\n        m_matU.col(k).end(m-k) = - m_matU.col(k).end(m-k);\n        m_matU(k,k) = Scalar(1) + m_matU(k,k);\n        if (k-1>0)\n          m_matU.col(k).start(k-1).setZero();\n      }\n      else\n      {\n        m_matU.col(k).setZero();\n        m_matU(k,k) = 1.0;\n      }\n    }\n  }\n\n  // If required, generate V.\n  if (wantv)\n  {\n    for (k = n-1; k >= 0; k--)\n    {\n      if ((k < nrt) & (e[k] != 0.0))\n      {\n        for (j = k+1; j < nu; ++j)\n        {\n          Scalar t = m_matV.col(k).end(n-k-1).eigen2_dot(m_matV.col(j).end(n-k-1)); // FIXME is it really a dot product we want ?\n          t = -t/m_matV(k+1,k);\n          m_matV.col(j).end(n-k-1) += t * m_matV.col(k).end(n-k-1);\n        }\n      }\n      m_matV.col(k).setZero();\n      m_matV(k,k) = 1.0;\n    }\n  }\n\n  // Main iteration loop for the singular values.\n  int pp = p-1;\n  int iter = 0;\n  Scalar eps = ei_pow(Scalar(2),ei_is_same_type<Scalar,float>::ret ? Scalar(-23) : Scalar(-52));\n  while (p > 0)\n  {\n    int k=0;\n    int kase=0;\n\n    // Here is where a test for too many iterations would go.\n\n    // This section of the program inspects for\n    // negligible elements in the s and e arrays.  On\n    // completion the variables kase and k are set as follows.\n\n    // kase = 1     if s(p) and e[k-1] are negligible and k<p\n    // kase = 2     if s(k) is negligible and k<p\n    // kase = 3     if e[k-1] is negligible, k<p, and\n    //              s(k), ..., s(p) are not negligible (qr step).\n    // kase = 4     if e(p-1) is negligible (convergence).\n\n    for (k = p-2; k >= -1; --k)\n    {\n      if (k == -1)\n          break;\n      if (ei_abs(e[k]) <= eps*(ei_abs(m_sigma[k]) + ei_abs(m_sigma[k+1])))\n      {\n          e[k] = 0.0;\n          break;\n      }\n    }\n    if (k == p-2)\n    {\n      kase = 4;\n    }\n    else\n    {\n      int ks;\n      for (ks = p-1; ks >= k; --ks)\n      {\n        if (ks == k)\n          break;\n        Scalar t = (ks != p ? ei_abs(e[ks]) : Scalar(0)) + (ks != k+1 ? ei_abs(e[ks-1]) : Scalar(0));\n        if (ei_abs(m_sigma[ks]) <= eps*t)\n        {\n          m_sigma[ks] = 0.0;\n          break;\n        }\n      }\n      if (ks == k)\n      {\n        kase = 3;\n      }\n      else if (ks == p-1)\n      {\n        kase = 1;\n      }\n      else\n      {\n        kase = 2;\n        k = ks;\n      }\n    }\n    ++k;\n\n    // Perform the task indicated by kase.\n    switch (kase)\n    {\n\n      // Deflate negligible s(p).\n      case 1:\n      {\n        Scalar f(e[p-2]);\n        e[p-2] = 0.0;\n        for (j = p-2; j >= k; --j)\n        {\n          Scalar t(numext::hypot(m_sigma[j],f));\n          Scalar cs(m_sigma[j]/t);\n          Scalar sn(f/t);\n          m_sigma[j] = t;\n          if (j != k)\n          {\n            f = -sn*e[j-1];\n            e[j-1] = cs*e[j-1];\n          }\n          if (wantv)\n          {\n            for (i = 0; i < n; ++i)\n            {\n              t = cs*m_matV(i,j) + sn*m_matV(i,p-1);\n              m_matV(i,p-1) = -sn*m_matV(i,j) + cs*m_matV(i,p-1);\n              m_matV(i,j) = t;\n            }\n          }\n        }\n      }\n      break;\n\n      // Split at negligible s(k).\n      case 2:\n      {\n        Scalar f(e[k-1]);\n        e[k-1] = 0.0;\n        for (j = k; j < p; ++j)\n        {\n          Scalar t(numext::hypot(m_sigma[j],f));\n          Scalar cs( m_sigma[j]/t);\n          Scalar sn(f/t);\n          m_sigma[j] = t;\n          f = -sn*e[j];\n          e[j] = cs*e[j];\n          if (wantu)\n          {\n            for (i = 0; i < m; ++i)\n            {\n              t = cs*m_matU(i,j) + sn*m_matU(i,k-1);\n              m_matU(i,k-1) = -sn*m_matU(i,j) + cs*m_matU(i,k-1);\n              m_matU(i,j) = t;\n            }\n          }\n        }\n      }\n      break;\n\n      // Perform one qr step.\n      case 3:\n      {\n        // Calculate the shift.\n        Scalar scale = (std::max)((std::max)((std::max)((std::max)(\n                        ei_abs(m_sigma[p-1]),ei_abs(m_sigma[p-2])),ei_abs(e[p-2])),\n                        ei_abs(m_sigma[k])),ei_abs(e[k]));\n        Scalar sp = m_sigma[p-1]/scale;\n        Scalar spm1 = m_sigma[p-2]/scale;\n        Scalar epm1 = e[p-2]/scale;\n        Scalar sk = m_sigma[k]/scale;\n        Scalar ek = e[k]/scale;\n        Scalar b = ((spm1 + sp)*(spm1 - sp) + epm1*epm1)/Scalar(2);\n        Scalar c = (sp*epm1)*(sp*epm1);\n        Scalar shift(0);\n        if ((b != 0.0) || (c != 0.0))\n        {\n          shift = ei_sqrt(b*b + c);\n          if (b < 0.0)\n            shift = -shift;\n          shift = c/(b + shift);\n        }\n        Scalar f = (sk + sp)*(sk - sp) + shift;\n        Scalar g = sk*ek;\n\n        // Chase zeros.\n\n        for (j = k; j < p-1; ++j)\n        {\n          Scalar t = numext::hypot(f,g);\n          Scalar cs = f/t;\n          Scalar sn = g/t;\n          if (j != k)\n            e[j-1] = t;\n          f = cs*m_sigma[j] + sn*e[j];\n          e[j] = cs*e[j] - sn*m_sigma[j];\n          g = sn*m_sigma[j+1];\n          m_sigma[j+1] = cs*m_sigma[j+1];\n          if (wantv)\n          {\n            for (i = 0; i < n; ++i)\n            {\n              t = cs*m_matV(i,j) + sn*m_matV(i,j+1);\n              m_matV(i,j+1) = -sn*m_matV(i,j) + cs*m_matV(i,j+1);\n              m_matV(i,j) = t;\n            }\n          }\n          t = numext::hypot(f,g);\n          cs = f/t;\n          sn = g/t;\n          m_sigma[j] = t;\n          f = cs*e[j] + sn*m_sigma[j+1];\n          m_sigma[j+1] = -sn*e[j] + cs*m_sigma[j+1];\n          g = sn*e[j+1];\n          e[j+1] = cs*e[j+1];\n          if (wantu && (j < m-1))\n          {\n            for (i = 0; i < m; ++i)\n            {\n              t = cs*m_matU(i,j) + sn*m_matU(i,j+1);\n              m_matU(i,j+1) = -sn*m_matU(i,j) + cs*m_matU(i,j+1);\n              m_matU(i,j) = t;\n            }\n          }\n        }\n        e[p-2] = f;\n        iter = iter + 1;\n      }\n      break;\n\n      // Convergence.\n      case 4:\n      {\n        // Make the singular values positive.\n        if (m_sigma[k] <= 0.0)\n        {\n          m_sigma[k] = m_sigma[k] < Scalar(0) ? -m_sigma[k] : Scalar(0);\n          if (wantv)\n            m_matV.col(k).start(pp+1) = -m_matV.col(k).start(pp+1);\n        }\n\n        // Order the singular values.\n        while (k < pp)\n        {\n          if (m_sigma[k] >= m_sigma[k+1])\n            break;\n          Scalar t = m_sigma[k];\n          m_sigma[k] = m_sigma[k+1];\n          m_sigma[k+1] = t;\n          if (wantv && (k < n-1))\n            m_matV.col(k).swap(m_matV.col(k+1));\n          if (wantu && (k < m-1))\n            m_matU.col(k).swap(m_matU.col(k+1));\n          ++k;\n        }\n        iter = 0;\n        p--;\n      }\n      break;\n    } // end big switch\n  } // end iterations\n}\n\ntemplate<typename MatrixType>\nSVD<MatrixType>& SVD<MatrixType>::sort()\n{\n  int mu = m_matU.rows();\n  int mv = m_matV.rows();\n  int n  = m_matU.cols();\n\n  for (int i=0; i<n; ++i)\n  {\n    int  k = i;\n    Scalar p = m_sigma.coeff(i);\n\n    for (int j=i+1; j<n; ++j)\n    {\n      if (m_sigma.coeff(j) > p)\n      {\n        k = j;\n        p = m_sigma.coeff(j);\n      }\n    }\n    if (k != i)\n    {\n      m_sigma.coeffRef(k) = m_sigma.coeff(i);  // i.e.\n      m_sigma.coeffRef(i) = p;                 // swaps the i-th and the k-th elements\n\n      int j = mu;\n      for(int s=0; j!=0; ++s, --j)\n        std::swap(m_matU.coeffRef(s,i), m_matU.coeffRef(s,k));\n\n      j = mv;\n      for (int s=0; j!=0; ++s, --j)\n        std::swap(m_matV.coeffRef(s,i), m_matV.coeffRef(s,k));\n    }\n  }\n  return *this;\n}\n\n/** \\returns the solution of \\f$ A x = b \\f$ using the current SVD decomposition of A.\n  * The parts of the solution corresponding to zero singular values are ignored.\n  *\n  * \\sa MatrixBase::svd(), LU::solve(), LLT::solve()\n  */\ntemplate<typename MatrixType>\ntemplate<typename OtherDerived, typename ResultType>\nbool SVD<MatrixType>::solve(const MatrixBase<OtherDerived> &b, ResultType* result) const\n{\n  ei_assert(b.rows() == m_matU.rows());\n\n  Scalar maxVal = m_sigma.cwise().abs().maxCoeff();\n  for (int j=0; j<b.cols(); ++j)\n  {\n    Matrix<Scalar,MatrixUType::RowsAtCompileTime,1> aux = m_matU.transpose() * b.col(j);\n\n    for (int i = 0; i <m_matU.cols(); ++i)\n    {\n      Scalar si = m_sigma.coeff(i);\n      if (ei_isMuchSmallerThan(ei_abs(si),maxVal))\n        aux.coeffRef(i) = 0;\n      else\n        aux.coeffRef(i) /= si;\n    }\n\n    result->col(j) = m_matV * aux;\n  }\n  return true;\n}\n\n/** Computes the polar decomposition of the matrix, as a product unitary x positive.\n  *\n  * If either pointer is zero, the corresponding computation is skipped.\n  *\n  * Only for square matrices.\n  *\n  * \\sa computePositiveUnitary(), computeRotationScaling()\n  */\ntemplate<typename MatrixType>\ntemplate<typename UnitaryType, typename PositiveType>\nvoid SVD<MatrixType>::computeUnitaryPositive(UnitaryType *unitary,\n                                             PositiveType *positive) const\n{\n  ei_assert(m_matU.cols() == m_matV.cols() && \"Polar decomposition is only for square matrices\");\n  if(unitary) *unitary = m_matU * m_matV.adjoint();\n  if(positive) *positive = m_matV * m_sigma.asDiagonal() * m_matV.adjoint();\n}\n\n/** Computes the polar decomposition of the matrix, as a product positive x unitary.\n  *\n  * If either pointer is zero, the corresponding computation is skipped.\n  *\n  * Only for square matrices.\n  *\n  * \\sa computeUnitaryPositive(), computeRotationScaling()\n  */\ntemplate<typename MatrixType>\ntemplate<typename UnitaryType, typename PositiveType>\nvoid SVD<MatrixType>::computePositiveUnitary(UnitaryType *positive,\n                                             PositiveType *unitary) const\n{\n  ei_assert(m_matU.rows() == m_matV.rows() && \"Polar decomposition is only for square matrices\");\n  if(unitary) *unitary = m_matU * m_matV.adjoint();\n  if(positive) *positive = m_matU * m_sigma.asDiagonal() * m_matU.adjoint();\n}\n\n/** decomposes the matrix as a product rotation x scaling, the scaling being\n  * not necessarily positive.\n  *\n  * If either pointer is zero, the corresponding computation is skipped.\n  *\n  * This method requires the Geometry module.\n  *\n  * \\sa computeScalingRotation(), computeUnitaryPositive()\n  */\ntemplate<typename MatrixType>\ntemplate<typename RotationType, typename ScalingType>\nvoid SVD<MatrixType>::computeRotationScaling(RotationType *rotation, ScalingType *scaling) const\n{\n  ei_assert(m_matU.rows() == m_matV.rows() && \"Polar decomposition is only for square matrices\");\n  Scalar x = (m_matU * m_matV.adjoint()).determinant(); // so x has absolute value 1\n  Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> sv(m_sigma);\n  sv.coeffRef(0) *= x;\n  if(scaling) scaling->lazyAssign(m_matV * sv.asDiagonal() * m_matV.adjoint());\n  if(rotation)\n  {\n    MatrixType m(m_matU);\n    m.col(0) /= x;\n    rotation->lazyAssign(m * m_matV.adjoint());\n  }\n}\n\n/** decomposes the matrix as a product scaling x rotation, the scaling being\n  * not necessarily positive.\n  *\n  * If either pointer is zero, the corresponding computation is skipped.\n  *\n  * This method requires the Geometry module.\n  *\n  * \\sa computeRotationScaling(), computeUnitaryPositive()\n  */\ntemplate<typename MatrixType>\ntemplate<typename ScalingType, typename RotationType>\nvoid SVD<MatrixType>::computeScalingRotation(ScalingType *scaling, RotationType *rotation) const\n{\n  ei_assert(m_matU.rows() == m_matV.rows() && \"Polar decomposition is only for square matrices\");\n  Scalar x = (m_matU * m_matV.adjoint()).determinant(); // so x has absolute value 1\n  Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> sv(m_sigma);\n  sv.coeffRef(0) *= x;\n  if(scaling) scaling->lazyAssign(m_matU * sv.asDiagonal() * m_matU.adjoint());\n  if(rotation)\n  {\n    MatrixType m(m_matU);\n    m.col(0) /= x;\n    rotation->lazyAssign(m * m_matV.adjoint());\n  }\n}\n\n\n/** \\svd_module\n  * \\returns the SVD decomposition of \\c *this\n  */\ntemplate<typename Derived>\ninline SVD<typename MatrixBase<Derived>::PlainObject>\nMatrixBase<Derived>::svd() const\n{\n  return SVD<PlainObject>(derived());\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN2_SVD_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigen2Support/TriangularSolver.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_TRIANGULAR_SOLVER2_H\n#define EIGEN_TRIANGULAR_SOLVER2_H\n\nnamespace Eigen { \n\nconst unsigned int UnitDiagBit = UnitDiag;\nconst unsigned int SelfAdjointBit = SelfAdjoint;\nconst unsigned int UpperTriangularBit = Upper;\nconst unsigned int LowerTriangularBit = Lower;\n\nconst unsigned int UpperTriangular = Upper;\nconst unsigned int LowerTriangular = Lower;\nconst unsigned int UnitUpperTriangular = UnitUpper;\nconst unsigned int UnitLowerTriangular = UnitLower;\n\ntemplate<typename ExpressionType, unsigned int Added, unsigned int Removed>\ntemplate<typename OtherDerived>\ntypename ExpressionType::PlainObject\nFlagged<ExpressionType,Added,Removed>::solveTriangular(const MatrixBase<OtherDerived>& other) const\n{\n  return m_matrix.template triangularView<Added>().solve(other.derived());\n}\n\ntemplate<typename ExpressionType, unsigned int Added, unsigned int Removed>\ntemplate<typename OtherDerived>\nvoid Flagged<ExpressionType,Added,Removed>::solveTriangularInPlace(const MatrixBase<OtherDerived>& other) const\n{\n  m_matrix.template triangularView<Added>().solveInPlace(other.derived());\n}\n\n} // end namespace Eigen\n    \n#endif // EIGEN_TRIANGULAR_SOLVER2_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigen2Support/VectorBlock.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN2_VECTORBLOCK_H\n#define EIGEN2_VECTORBLOCK_H\n\nnamespace Eigen { \n\n/** \\deprecated use DenseMase::head(Index) */\ntemplate<typename Derived>\ninline VectorBlock<Derived>\nMatrixBase<Derived>::start(Index size)\n{\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)\n  return VectorBlock<Derived>(derived(), 0, size);\n}\n\n/** \\deprecated use DenseMase::head(Index) */\ntemplate<typename Derived>\ninline const VectorBlock<const Derived>\nMatrixBase<Derived>::start(Index size) const\n{\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)\n  return VectorBlock<const Derived>(derived(), 0, size);\n}\n\n/** \\deprecated use DenseMase::tail(Index) */\ntemplate<typename Derived>\ninline VectorBlock<Derived>\nMatrixBase<Derived>::end(Index size)\n{\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)\n  return VectorBlock<Derived>(derived(), this->size() - size, size);\n}\n\n/** \\deprecated use DenseMase::tail(Index) */\ntemplate<typename Derived>\ninline const VectorBlock<const Derived>\nMatrixBase<Derived>::end(Index size) const\n{\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)\n  return VectorBlock<const Derived>(derived(), this->size() - size, size);\n}\n\n/** \\deprecated use DenseMase::head() */\ntemplate<typename Derived>\ntemplate<int Size>\ninline VectorBlock<Derived,Size>\nMatrixBase<Derived>::start()\n{\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)\n  return VectorBlock<Derived,Size>(derived(), 0);\n}\n\n/** \\deprecated use DenseMase::head() */\ntemplate<typename Derived>\ntemplate<int Size>\ninline const VectorBlock<const Derived,Size>\nMatrixBase<Derived>::start() const\n{\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)\n  return VectorBlock<const Derived,Size>(derived(), 0);\n}\n\n/** \\deprecated use DenseMase::tail() */\ntemplate<typename Derived>\ntemplate<int Size>\ninline VectorBlock<Derived,Size>\nMatrixBase<Derived>::end()\n{\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)\n  return VectorBlock<Derived, Size>(derived(), size() - Size);\n}\n\n/** \\deprecated use DenseMase::tail() */\ntemplate<typename Derived>\ntemplate<int Size>\ninline const VectorBlock<const Derived,Size>\nMatrixBase<Derived>::end() const\n{\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)\n  return VectorBlock<const Derived, Size>(derived(), size() - Size);\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN2_VECTORBLOCK_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigenvalues/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_EIGENVALUES_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_EIGENVALUES_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/Eigenvalues COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigenvalues/ComplexEigenSolver.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Claire Maurice\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2010,2012 Jitse Niesen <jitse@maths.leeds.ac.uk>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_COMPLEX_EIGEN_SOLVER_H\n#define EIGEN_COMPLEX_EIGEN_SOLVER_H\n\n#include \"./ComplexSchur.h\"\n\nnamespace Eigen { \n\n/** \\eigenvalues_module \\ingroup Eigenvalues_Module\n  *\n  *\n  * \\class ComplexEigenSolver\n  *\n  * \\brief Computes eigenvalues and eigenvectors of general complex matrices\n  *\n  * \\tparam _MatrixType the type of the matrix of which we are\n  * computing the eigendecomposition; this is expected to be an\n  * instantiation of the Matrix class template.\n  *\n  * The eigenvalues and eigenvectors of a matrix \\f$ A \\f$ are scalars\n  * \\f$ \\lambda \\f$ and vectors \\f$ v \\f$ such that \\f$ Av = \\lambda v\n  * \\f$.  If \\f$ D \\f$ is a diagonal matrix with the eigenvalues on\n  * the diagonal, and \\f$ V \\f$ is a matrix with the eigenvectors as\n  * its columns, then \\f$ A V = V D \\f$. The matrix \\f$ V \\f$ is\n  * almost always invertible, in which case we have \\f$ A = V D V^{-1}\n  * \\f$. This is called the eigendecomposition.\n  *\n  * The main function in this class is compute(), which computes the\n  * eigenvalues and eigenvectors of a given function. The\n  * documentation for that function contains an example showing the\n  * main features of the class.\n  *\n  * \\sa class EigenSolver, class SelfAdjointEigenSolver\n  */\ntemplate<typename _MatrixType> class ComplexEigenSolver\n{\n  public:\n\n    /** \\brief Synonym for the template parameter \\p _MatrixType. */\n    typedef _MatrixType MatrixType;\n\n    enum {\n      RowsAtCompileTime = MatrixType::RowsAtCompileTime,\n      ColsAtCompileTime = MatrixType::ColsAtCompileTime,\n      Options = MatrixType::Options,\n      MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,\n      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime\n    };\n\n    /** \\brief Scalar type for matrices of type #MatrixType. */\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename NumTraits<Scalar>::Real RealScalar;\n    typedef typename MatrixType::Index Index;\n\n    /** \\brief Complex scalar type for #MatrixType.\n      *\n      * This is \\c std::complex<Scalar> if #Scalar is real (e.g.,\n      * \\c float or \\c double) and just \\c Scalar if #Scalar is\n      * complex.\n      */\n    typedef std::complex<RealScalar> ComplexScalar;\n\n    /** \\brief Type for vector of eigenvalues as returned by eigenvalues().\n      *\n      * This is a column vector with entries of type #ComplexScalar.\n      * The length of the vector is the size of #MatrixType.\n      */\n    typedef Matrix<ComplexScalar, ColsAtCompileTime, 1, Options&(~RowMajor), MaxColsAtCompileTime, 1> EigenvalueType;\n\n    /** \\brief Type for matrix of eigenvectors as returned by eigenvectors().\n      *\n      * This is a square matrix with entries of type #ComplexScalar.\n      * The size is the same as the size of #MatrixType.\n      */\n    typedef Matrix<ComplexScalar, RowsAtCompileTime, ColsAtCompileTime, Options, MaxRowsAtCompileTime, MaxColsAtCompileTime> EigenvectorType;\n\n    /** \\brief Default constructor.\n      *\n      * The default constructor is useful in cases in which the user intends to\n      * perform decompositions via compute().\n      */\n    ComplexEigenSolver()\n            : m_eivec(),\n              m_eivalues(),\n              m_schur(),\n              m_isInitialized(false),\n              m_eigenvectorsOk(false),\n              m_matX()\n    {}\n\n    /** \\brief Default Constructor with memory preallocation\n      *\n      * Like the default constructor but with preallocation of the internal data\n      * according to the specified problem \\a size.\n      * \\sa ComplexEigenSolver()\n      */\n    ComplexEigenSolver(Index size)\n            : m_eivec(size, size),\n              m_eivalues(size),\n              m_schur(size),\n              m_isInitialized(false),\n              m_eigenvectorsOk(false),\n              m_matX(size, size)\n    {}\n\n    /** \\brief Constructor; computes eigendecomposition of given matrix.\n      *\n      * \\param[in]  matrix  Square matrix whose eigendecomposition is to be computed.\n      * \\param[in]  computeEigenvectors  If true, both the eigenvectors and the\n      *    eigenvalues are computed; if false, only the eigenvalues are\n      *    computed.\n      *\n      * This constructor calls compute() to compute the eigendecomposition.\n      */\n      ComplexEigenSolver(const MatrixType& matrix, bool computeEigenvectors = true)\n            : m_eivec(matrix.rows(),matrix.cols()),\n              m_eivalues(matrix.cols()),\n              m_schur(matrix.rows()),\n              m_isInitialized(false),\n              m_eigenvectorsOk(false),\n              m_matX(matrix.rows(),matrix.cols())\n    {\n      compute(matrix, computeEigenvectors);\n    }\n\n    /** \\brief Returns the eigenvectors of given matrix.\n      *\n      * \\returns  A const reference to the matrix whose columns are the eigenvectors.\n      *\n      * \\pre Either the constructor\n      * ComplexEigenSolver(const MatrixType& matrix, bool) or the member\n      * function compute(const MatrixType& matrix, bool) has been called before\n      * to compute the eigendecomposition of a matrix, and\n      * \\p computeEigenvectors was set to true (the default).\n      *\n      * This function returns a matrix whose columns are the eigenvectors. Column\n      * \\f$ k \\f$ is an eigenvector corresponding to eigenvalue number \\f$ k\n      * \\f$ as returned by eigenvalues().  The eigenvectors are normalized to\n      * have (Euclidean) norm equal to one. The matrix returned by this\n      * function is the matrix \\f$ V \\f$ in the eigendecomposition \\f$ A = V D\n      * V^{-1} \\f$, if it exists.\n      *\n      * Example: \\include ComplexEigenSolver_eigenvectors.cpp\n      * Output: \\verbinclude ComplexEigenSolver_eigenvectors.out\n      */\n    const EigenvectorType& eigenvectors() const\n    {\n      eigen_assert(m_isInitialized && \"ComplexEigenSolver is not initialized.\");\n      eigen_assert(m_eigenvectorsOk && \"The eigenvectors have not been computed together with the eigenvalues.\");\n      return m_eivec;\n    }\n\n    /** \\brief Returns the eigenvalues of given matrix.\n      *\n      * \\returns A const reference to the column vector containing the eigenvalues.\n      *\n      * \\pre Either the constructor\n      * ComplexEigenSolver(const MatrixType& matrix, bool) or the member\n      * function compute(const MatrixType& matrix, bool) has been called before\n      * to compute the eigendecomposition of a matrix.\n      *\n      * This function returns a column vector containing the\n      * eigenvalues. Eigenvalues are repeated according to their\n      * algebraic multiplicity, so there are as many eigenvalues as\n      * rows in the matrix. The eigenvalues are not sorted in any particular\n      * order.\n      *\n      * Example: \\include ComplexEigenSolver_eigenvalues.cpp\n      * Output: \\verbinclude ComplexEigenSolver_eigenvalues.out\n      */\n    const EigenvalueType& eigenvalues() const\n    {\n      eigen_assert(m_isInitialized && \"ComplexEigenSolver is not initialized.\");\n      return m_eivalues;\n    }\n\n    /** \\brief Computes eigendecomposition of given matrix.\n      *\n      * \\param[in]  matrix  Square matrix whose eigendecomposition is to be computed.\n      * \\param[in]  computeEigenvectors  If true, both the eigenvectors and the\n      *    eigenvalues are computed; if false, only the eigenvalues are\n      *    computed.\n      * \\returns    Reference to \\c *this\n      *\n      * This function computes the eigenvalues of the complex matrix \\p matrix.\n      * The eigenvalues() function can be used to retrieve them.  If\n      * \\p computeEigenvectors is true, then the eigenvectors are also computed\n      * and can be retrieved by calling eigenvectors().\n      *\n      * The matrix is first reduced to Schur form using the\n      * ComplexSchur class. The Schur decomposition is then used to\n      * compute the eigenvalues and eigenvectors.\n      *\n      * The cost of the computation is dominated by the cost of the\n      * Schur decomposition, which is \\f$ O(n^3) \\f$ where \\f$ n \\f$\n      * is the size of the matrix.\n      *\n      * Example: \\include ComplexEigenSolver_compute.cpp\n      * Output: \\verbinclude ComplexEigenSolver_compute.out\n      */\n    ComplexEigenSolver& compute(const MatrixType& matrix, bool computeEigenvectors = true);\n\n    /** \\brief Reports whether previous computation was successful.\n      *\n      * \\returns \\c Success if computation was succesful, \\c NoConvergence otherwise.\n      */\n    ComputationInfo info() const\n    {\n      eigen_assert(m_isInitialized && \"ComplexEigenSolver is not initialized.\");\n      return m_schur.info();\n    }\n\n    /** \\brief Sets the maximum number of iterations allowed. */\n    ComplexEigenSolver& setMaxIterations(Index maxIters)\n    {\n      m_schur.setMaxIterations(maxIters);\n      return *this;\n    }\n\n    /** \\brief Returns the maximum number of iterations. */\n    Index getMaxIterations()\n    {\n      return m_schur.getMaxIterations();\n    }\n\n  protected:\n    \n    static void check_template_parameters()\n    {\n      EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar);\n    }\n    \n    EigenvectorType m_eivec;\n    EigenvalueType m_eivalues;\n    ComplexSchur<MatrixType> m_schur;\n    bool m_isInitialized;\n    bool m_eigenvectorsOk;\n    EigenvectorType m_matX;\n\n  private:\n    void doComputeEigenvectors(const RealScalar& matrixnorm);\n    void sortEigenvalues(bool computeEigenvectors);\n};\n\n\ntemplate<typename MatrixType>\nComplexEigenSolver<MatrixType>& \nComplexEigenSolver<MatrixType>::compute(const MatrixType& matrix, bool computeEigenvectors)\n{\n  check_template_parameters();\n  \n  // this code is inspired from Jampack\n  eigen_assert(matrix.cols() == matrix.rows());\n\n  // Do a complex Schur decomposition, A = U T U^*\n  // The eigenvalues are on the diagonal of T.\n  m_schur.compute(matrix, computeEigenvectors);\n\n  if(m_schur.info() == Success)\n  {\n    m_eivalues = m_schur.matrixT().diagonal();\n    if(computeEigenvectors)\n      doComputeEigenvectors(matrix.norm());\n    sortEigenvalues(computeEigenvectors);\n  }\n\n  m_isInitialized = true;\n  m_eigenvectorsOk = computeEigenvectors;\n  return *this;\n}\n\n\ntemplate<typename MatrixType>\nvoid ComplexEigenSolver<MatrixType>::doComputeEigenvectors(const RealScalar& matrixnorm)\n{\n  const Index n = m_eivalues.size();\n\n  // Compute X such that T = X D X^(-1), where D is the diagonal of T.\n  // The matrix X is unit triangular.\n  m_matX = EigenvectorType::Zero(n, n);\n  for(Index k=n-1 ; k>=0 ; k--)\n  {\n    m_matX.coeffRef(k,k) = ComplexScalar(1.0,0.0);\n    // Compute X(i,k) using the (i,k) entry of the equation X T = D X\n    for(Index i=k-1 ; i>=0 ; i--)\n    {\n      m_matX.coeffRef(i,k) = -m_schur.matrixT().coeff(i,k);\n      if(k-i-1>0)\n        m_matX.coeffRef(i,k) -= (m_schur.matrixT().row(i).segment(i+1,k-i-1) * m_matX.col(k).segment(i+1,k-i-1)).value();\n      ComplexScalar z = m_schur.matrixT().coeff(i,i) - m_schur.matrixT().coeff(k,k);\n      if(z==ComplexScalar(0))\n      {\n        // If the i-th and k-th eigenvalue are equal, then z equals 0.\n        // Use a small value instead, to prevent division by zero.\n        numext::real_ref(z) = NumTraits<RealScalar>::epsilon() * matrixnorm;\n      }\n      m_matX.coeffRef(i,k) = m_matX.coeff(i,k) / z;\n    }\n  }\n\n  // Compute V as V = U X; now A = U T U^* = U X D X^(-1) U^* = V D V^(-1)\n  m_eivec.noalias() = m_schur.matrixU() * m_matX;\n  // .. and normalize the eigenvectors\n  for(Index k=0 ; k<n ; k++)\n  {\n    m_eivec.col(k).normalize();\n  }\n}\n\n\ntemplate<typename MatrixType>\nvoid ComplexEigenSolver<MatrixType>::sortEigenvalues(bool computeEigenvectors)\n{\n  const Index n =  m_eivalues.size();\n  for (Index i=0; i<n; i++)\n  {\n    Index k;\n    m_eivalues.cwiseAbs().tail(n-i).minCoeff(&k);\n    if (k != 0)\n    {\n      k += i;\n      std::swap(m_eivalues[k],m_eivalues[i]);\n      if(computeEigenvectors)\n\tm_eivec.col(i).swap(m_eivec.col(k));\n    }\n  }\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_COMPLEX_EIGEN_SOLVER_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigenvalues/ComplexSchur.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Claire Maurice\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2010,2012 Jitse Niesen <jitse@maths.leeds.ac.uk>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_COMPLEX_SCHUR_H\n#define EIGEN_COMPLEX_SCHUR_H\n\n#include \"./HessenbergDecomposition.h\"\n\nnamespace Eigen { \n\nnamespace internal {\ntemplate<typename MatrixType, bool IsComplex> struct complex_schur_reduce_to_hessenberg;\n}\n\n/** \\eigenvalues_module \\ingroup Eigenvalues_Module\n  *\n  *\n  * \\class ComplexSchur\n  *\n  * \\brief Performs a complex Schur decomposition of a real or complex square matrix\n  *\n  * \\tparam _MatrixType the type of the matrix of which we are\n  * computing the Schur decomposition; this is expected to be an\n  * instantiation of the Matrix class template.\n  *\n  * Given a real or complex square matrix A, this class computes the\n  * Schur decomposition: \\f$ A = U T U^*\\f$ where U is a unitary\n  * complex matrix, and T is a complex upper triangular matrix.  The\n  * diagonal of the matrix T corresponds to the eigenvalues of the\n  * matrix A.\n  *\n  * Call the function compute() to compute the Schur decomposition of\n  * a given matrix. Alternatively, you can use the \n  * ComplexSchur(const MatrixType&, bool) constructor which computes\n  * the Schur decomposition at construction time. Once the\n  * decomposition is computed, you can use the matrixU() and matrixT()\n  * functions to retrieve the matrices U and V in the decomposition.\n  *\n  * \\note This code is inspired from Jampack\n  *\n  * \\sa class RealSchur, class EigenSolver, class ComplexEigenSolver\n  */\ntemplate<typename _MatrixType> class ComplexSchur\n{\n  public:\n    typedef _MatrixType MatrixType;\n    enum {\n      RowsAtCompileTime = MatrixType::RowsAtCompileTime,\n      ColsAtCompileTime = MatrixType::ColsAtCompileTime,\n      Options = MatrixType::Options,\n      MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,\n      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime\n    };\n\n    /** \\brief Scalar type for matrices of type \\p _MatrixType. */\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename NumTraits<Scalar>::Real RealScalar;\n    typedef typename MatrixType::Index Index;\n\n    /** \\brief Complex scalar type for \\p _MatrixType. \n      *\n      * This is \\c std::complex<Scalar> if #Scalar is real (e.g.,\n      * \\c float or \\c double) and just \\c Scalar if #Scalar is\n      * complex.\n      */\n    typedef std::complex<RealScalar> ComplexScalar;\n\n    /** \\brief Type for the matrices in the Schur decomposition.\n      *\n      * This is a square matrix with entries of type #ComplexScalar. \n      * The size is the same as the size of \\p _MatrixType.\n      */\n    typedef Matrix<ComplexScalar, RowsAtCompileTime, ColsAtCompileTime, Options, MaxRowsAtCompileTime, MaxColsAtCompileTime> ComplexMatrixType;\n\n    /** \\brief Default constructor.\n      *\n      * \\param [in] size  Positive integer, size of the matrix whose Schur decomposition will be computed.\n      *\n      * The default constructor is useful in cases in which the user\n      * intends to perform decompositions via compute().  The \\p size\n      * parameter is only used as a hint. It is not an error to give a\n      * wrong \\p size, but it may impair performance.\n      *\n      * \\sa compute() for an example.\n      */\n    ComplexSchur(Index size = RowsAtCompileTime==Dynamic ? 1 : RowsAtCompileTime)\n      : m_matT(size,size),\n        m_matU(size,size),\n        m_hess(size),\n        m_isInitialized(false),\n        m_matUisUptodate(false),\n        m_maxIters(-1)\n    {}\n\n    /** \\brief Constructor; computes Schur decomposition of given matrix. \n      * \n      * \\param[in]  matrix    Square matrix whose Schur decomposition is to be computed.\n      * \\param[in]  computeU  If true, both T and U are computed; if false, only T is computed.\n      *\n      * This constructor calls compute() to compute the Schur decomposition.\n      *\n      * \\sa matrixT() and matrixU() for examples.\n      */\n    ComplexSchur(const MatrixType& matrix, bool computeU = true)\n      : m_matT(matrix.rows(),matrix.cols()),\n        m_matU(matrix.rows(),matrix.cols()),\n        m_hess(matrix.rows()),\n        m_isInitialized(false),\n        m_matUisUptodate(false),\n        m_maxIters(-1)\n    {\n      compute(matrix, computeU);\n    }\n\n    /** \\brief Returns the unitary matrix in the Schur decomposition. \n      *\n      * \\returns A const reference to the matrix U.\n      *\n      * It is assumed that either the constructor\n      * ComplexSchur(const MatrixType& matrix, bool computeU) or the\n      * member function compute(const MatrixType& matrix, bool computeU)\n      * has been called before to compute the Schur decomposition of a\n      * matrix, and that \\p computeU was set to true (the default\n      * value).\n      *\n      * Example: \\include ComplexSchur_matrixU.cpp\n      * Output: \\verbinclude ComplexSchur_matrixU.out\n      */\n    const ComplexMatrixType& matrixU() const\n    {\n      eigen_assert(m_isInitialized && \"ComplexSchur is not initialized.\");\n      eigen_assert(m_matUisUptodate && \"The matrix U has not been computed during the ComplexSchur decomposition.\");\n      return m_matU;\n    }\n\n    /** \\brief Returns the triangular matrix in the Schur decomposition. \n      *\n      * \\returns A const reference to the matrix T.\n      *\n      * It is assumed that either the constructor\n      * ComplexSchur(const MatrixType& matrix, bool computeU) or the\n      * member function compute(const MatrixType& matrix, bool computeU)\n      * has been called before to compute the Schur decomposition of a\n      * matrix.\n      *\n      * Note that this function returns a plain square matrix. If you want to reference\n      * only the upper triangular part, use:\n      * \\code schur.matrixT().triangularView<Upper>() \\endcode \n      *\n      * Example: \\include ComplexSchur_matrixT.cpp\n      * Output: \\verbinclude ComplexSchur_matrixT.out\n      */\n    const ComplexMatrixType& matrixT() const\n    {\n      eigen_assert(m_isInitialized && \"ComplexSchur is not initialized.\");\n      return m_matT;\n    }\n\n    /** \\brief Computes Schur decomposition of given matrix. \n      * \n      * \\param[in]  matrix  Square matrix whose Schur decomposition is to be computed.\n      * \\param[in]  computeU  If true, both T and U are computed; if false, only T is computed.\n\n      * \\returns    Reference to \\c *this\n      *\n      * The Schur decomposition is computed by first reducing the\n      * matrix to Hessenberg form using the class\n      * HessenbergDecomposition. The Hessenberg matrix is then reduced\n      * to triangular form by performing QR iterations with a single\n      * shift. The cost of computing the Schur decomposition depends\n      * on the number of iterations; as a rough guide, it may be taken\n      * on the number of iterations; as a rough guide, it may be taken\n      * to be \\f$25n^3\\f$ complex flops, or \\f$10n^3\\f$ complex flops\n      * if \\a computeU is false.\n      *\n      * Example: \\include ComplexSchur_compute.cpp\n      * Output: \\verbinclude ComplexSchur_compute.out\n      *\n      * \\sa compute(const MatrixType&, bool, Index)\n      */\n    ComplexSchur& compute(const MatrixType& matrix, bool computeU = true);\n    \n    /** \\brief Compute Schur decomposition from a given Hessenberg matrix\n     *  \\param[in] matrixH Matrix in Hessenberg form H\n     *  \\param[in] matrixQ orthogonal matrix Q that transform a matrix A to H : A = Q H Q^T\n     *  \\param computeU Computes the matriX U of the Schur vectors\n     * \\return Reference to \\c *this\n     * \n     *  This routine assumes that the matrix is already reduced in Hessenberg form matrixH\n     *  using either the class HessenbergDecomposition or another mean. \n     *  It computes the upper quasi-triangular matrix T of the Schur decomposition of H\n     *  When computeU is true, this routine computes the matrix U such that \n     *  A = U T U^T =  (QZ) T (QZ)^T = Q H Q^T where A is the initial matrix\n     * \n     * NOTE Q is referenced if computeU is true; so, if the initial orthogonal matrix\n     * is not available, the user should give an identity matrix (Q.setIdentity())\n     * \n     * \\sa compute(const MatrixType&, bool)\n     */\n    template<typename HessMatrixType, typename OrthMatrixType>\n    ComplexSchur& computeFromHessenberg(const HessMatrixType& matrixH, const OrthMatrixType& matrixQ,  bool computeU=true);\n\n    /** \\brief Reports whether previous computation was successful.\n      *\n      * \\returns \\c Success if computation was succesful, \\c NoConvergence otherwise.\n      */\n    ComputationInfo info() const\n    {\n      eigen_assert(m_isInitialized && \"ComplexSchur is not initialized.\");\n      return m_info;\n    }\n\n    /** \\brief Sets the maximum number of iterations allowed. \n      *\n      * If not specified by the user, the maximum number of iterations is m_maxIterationsPerRow times the size\n      * of the matrix.\n      */\n    ComplexSchur& setMaxIterations(Index maxIters)\n    {\n      m_maxIters = maxIters;\n      return *this;\n    }\n\n    /** \\brief Returns the maximum number of iterations. */\n    Index getMaxIterations()\n    {\n      return m_maxIters;\n    }\n\n    /** \\brief Maximum number of iterations per row.\n      *\n      * If not otherwise specified, the maximum number of iterations is this number times the size of the\n      * matrix. It is currently set to 30.\n      */\n    static const int m_maxIterationsPerRow = 30;\n\n  protected:\n    ComplexMatrixType m_matT, m_matU;\n    HessenbergDecomposition<MatrixType> m_hess;\n    ComputationInfo m_info;\n    bool m_isInitialized;\n    bool m_matUisUptodate;\n    Index m_maxIters;\n\n  private:  \n    bool subdiagonalEntryIsNeglegible(Index i);\n    ComplexScalar computeShift(Index iu, Index iter);\n    void reduceToTriangularForm(bool computeU);\n    friend struct internal::complex_schur_reduce_to_hessenberg<MatrixType, NumTraits<Scalar>::IsComplex>;\n};\n\n/** If m_matT(i+1,i) is neglegible in floating point arithmetic\n  * compared to m_matT(i,i) and m_matT(j,j), then set it to zero and\n  * return true, else return false. */\ntemplate<typename MatrixType>\ninline bool ComplexSchur<MatrixType>::subdiagonalEntryIsNeglegible(Index i)\n{\n  RealScalar d = numext::norm1(m_matT.coeff(i,i)) + numext::norm1(m_matT.coeff(i+1,i+1));\n  RealScalar sd = numext::norm1(m_matT.coeff(i+1,i));\n  if (internal::isMuchSmallerThan(sd, d, NumTraits<RealScalar>::epsilon()))\n  {\n    m_matT.coeffRef(i+1,i) = ComplexScalar(0);\n    return true;\n  }\n  return false;\n}\n\n\n/** Compute the shift in the current QR iteration. */\ntemplate<typename MatrixType>\ntypename ComplexSchur<MatrixType>::ComplexScalar ComplexSchur<MatrixType>::computeShift(Index iu, Index iter)\n{\n  using std::abs;\n  if (iter == 10 || iter == 20) \n  {\n    // exceptional shift, taken from http://www.netlib.org/eispack/comqr.f\n    return abs(numext::real(m_matT.coeff(iu,iu-1))) + abs(numext::real(m_matT.coeff(iu-1,iu-2)));\n  }\n\n  // compute the shift as one of the eigenvalues of t, the 2x2\n  // diagonal block on the bottom of the active submatrix\n  Matrix<ComplexScalar,2,2> t = m_matT.template block<2,2>(iu-1,iu-1);\n  RealScalar normt = t.cwiseAbs().sum();\n  t /= normt;     // the normalization by sf is to avoid under/overflow\n\n  ComplexScalar b = t.coeff(0,1) * t.coeff(1,0);\n  ComplexScalar c = t.coeff(0,0) - t.coeff(1,1);\n  ComplexScalar disc = sqrt(c*c + RealScalar(4)*b);\n  ComplexScalar det = t.coeff(0,0) * t.coeff(1,1) - b;\n  ComplexScalar trace = t.coeff(0,0) + t.coeff(1,1);\n  ComplexScalar eival1 = (trace + disc) / RealScalar(2);\n  ComplexScalar eival2 = (trace - disc) / RealScalar(2);\n\n  if(numext::norm1(eival1) > numext::norm1(eival2))\n    eival2 = det / eival1;\n  else\n    eival1 = det / eival2;\n\n  // choose the eigenvalue closest to the bottom entry of the diagonal\n  if(numext::norm1(eival1-t.coeff(1,1)) < numext::norm1(eival2-t.coeff(1,1)))\n    return normt * eival1;\n  else\n    return normt * eival2;\n}\n\n\ntemplate<typename MatrixType>\nComplexSchur<MatrixType>& ComplexSchur<MatrixType>::compute(const MatrixType& matrix, bool computeU)\n{\n  m_matUisUptodate = false;\n  eigen_assert(matrix.cols() == matrix.rows());\n\n  if(matrix.cols() == 1)\n  {\n    m_matT = matrix.template cast<ComplexScalar>();\n    if(computeU)  m_matU = ComplexMatrixType::Identity(1,1);\n    m_info = Success;\n    m_isInitialized = true;\n    m_matUisUptodate = computeU;\n    return *this;\n  }\n\n  internal::complex_schur_reduce_to_hessenberg<MatrixType, NumTraits<Scalar>::IsComplex>::run(*this, matrix, computeU);\n  computeFromHessenberg(m_matT, m_matU, computeU);\n  return *this;\n}\n\ntemplate<typename MatrixType>\ntemplate<typename HessMatrixType, typename OrthMatrixType>\nComplexSchur<MatrixType>& ComplexSchur<MatrixType>::computeFromHessenberg(const HessMatrixType& matrixH, const OrthMatrixType& matrixQ, bool computeU)\n{\n  m_matT = matrixH;\n  if(computeU)\n    m_matU = matrixQ;\n  reduceToTriangularForm(computeU);\n  return *this;\n}\nnamespace internal {\n\n/* Reduce given matrix to Hessenberg form */\ntemplate<typename MatrixType, bool IsComplex>\nstruct complex_schur_reduce_to_hessenberg\n{\n  // this is the implementation for the case IsComplex = true\n  static void run(ComplexSchur<MatrixType>& _this, const MatrixType& matrix, bool computeU)\n  {\n    _this.m_hess.compute(matrix);\n    _this.m_matT = _this.m_hess.matrixH();\n    if(computeU)  _this.m_matU = _this.m_hess.matrixQ();\n  }\n};\n\ntemplate<typename MatrixType>\nstruct complex_schur_reduce_to_hessenberg<MatrixType, false>\n{\n  static void run(ComplexSchur<MatrixType>& _this, const MatrixType& matrix, bool computeU)\n  {\n    typedef typename ComplexSchur<MatrixType>::ComplexScalar ComplexScalar;\n\n    // Note: m_hess is over RealScalar; m_matT and m_matU is over ComplexScalar\n    _this.m_hess.compute(matrix);\n    _this.m_matT = _this.m_hess.matrixH().template cast<ComplexScalar>();\n    if(computeU)  \n    {\n      // This may cause an allocation which seems to be avoidable\n      MatrixType Q = _this.m_hess.matrixQ(); \n      _this.m_matU = Q.template cast<ComplexScalar>();\n    }\n  }\n};\n\n} // end namespace internal\n\n// Reduce the Hessenberg matrix m_matT to triangular form by QR iteration.\ntemplate<typename MatrixType>\nvoid ComplexSchur<MatrixType>::reduceToTriangularForm(bool computeU)\n{  \n  Index maxIters = m_maxIters;\n  if (maxIters == -1)\n    maxIters = m_maxIterationsPerRow * m_matT.rows();\n\n  // The matrix m_matT is divided in three parts. \n  // Rows 0,...,il-1 are decoupled from the rest because m_matT(il,il-1) is zero. \n  // Rows il,...,iu is the part we are working on (the active submatrix).\n  // Rows iu+1,...,end are already brought in triangular form.\n  Index iu = m_matT.cols() - 1;\n  Index il;\n  Index iter = 0; // number of iterations we are working on the (iu,iu) element\n  Index totalIter = 0; // number of iterations for whole matrix\n\n  while(true)\n  {\n    // find iu, the bottom row of the active submatrix\n    while(iu > 0)\n    {\n      if(!subdiagonalEntryIsNeglegible(iu-1)) break;\n      iter = 0;\n      --iu;\n    }\n\n    // if iu is zero then we are done; the whole matrix is triangularized\n    if(iu==0) break;\n\n    // if we spent too many iterations, we give up\n    iter++;\n    totalIter++;\n    if(totalIter > maxIters) break;\n\n    // find il, the top row of the active submatrix\n    il = iu-1;\n    while(il > 0 && !subdiagonalEntryIsNeglegible(il-1))\n    {\n      --il;\n    }\n\n    /* perform the QR step using Givens rotations. The first rotation\n       creates a bulge; the (il+2,il) element becomes nonzero. This\n       bulge is chased down to the bottom of the active submatrix. */\n\n    ComplexScalar shift = computeShift(iu, iter);\n    JacobiRotation<ComplexScalar> rot;\n    rot.makeGivens(m_matT.coeff(il,il) - shift, m_matT.coeff(il+1,il));\n    m_matT.rightCols(m_matT.cols()-il).applyOnTheLeft(il, il+1, rot.adjoint());\n    m_matT.topRows((std::min)(il+2,iu)+1).applyOnTheRight(il, il+1, rot);\n    if(computeU) m_matU.applyOnTheRight(il, il+1, rot);\n\n    for(Index i=il+1 ; i<iu ; i++)\n    {\n      rot.makeGivens(m_matT.coeffRef(i,i-1), m_matT.coeffRef(i+1,i-1), &m_matT.coeffRef(i,i-1));\n      m_matT.coeffRef(i+1,i-1) = ComplexScalar(0);\n      m_matT.rightCols(m_matT.cols()-i).applyOnTheLeft(i, i+1, rot.adjoint());\n      m_matT.topRows((std::min)(i+2,iu)+1).applyOnTheRight(i, i+1, rot);\n      if(computeU) m_matU.applyOnTheRight(i, i+1, rot);\n    }\n  }\n\n  if(totalIter <= maxIters)\n    m_info = Success;\n  else\n    m_info = NoConvergence;\n\n  m_isInitialized = true;\n  m_matUisUptodate = computeU;\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_COMPLEX_SCHUR_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigenvalues/ComplexSchur_MKL.h",
    "content": "/*\n Copyright (c) 2011, Intel Corporation. All rights reserved.\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n * Neither the name of Intel Corporation nor the names of its contributors may\n   be used to endorse or promote products derived from this software without\n   specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\n ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n ********************************************************************************\n *   Content : Eigen bindings to Intel(R) MKL\n *    Complex Schur needed to complex unsymmetrical eigenvalues/eigenvectors.\n ********************************************************************************\n*/\n\n#ifndef EIGEN_COMPLEX_SCHUR_MKL_H\n#define EIGEN_COMPLEX_SCHUR_MKL_H\n\n#include \"Eigen/src/Core/util/MKL_support.h\"\n\nnamespace Eigen { \n\n/** \\internal Specialization for the data types supported by MKL */\n\n#define EIGEN_MKL_SCHUR_COMPLEX(EIGTYPE, MKLTYPE, MKLPREFIX, MKLPREFIX_U, EIGCOLROW, MKLCOLROW) \\\ntemplate<> inline \\\nComplexSchur<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW> >& \\\nComplexSchur<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW> >::compute(const Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW>& matrix, bool computeU) \\\n{ \\\n  typedef Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW> MatrixType; \\\n  typedef MatrixType::RealScalar RealScalar; \\\n  typedef std::complex<RealScalar> ComplexScalar; \\\n\\\n  eigen_assert(matrix.cols() == matrix.rows()); \\\n\\\n  m_matUisUptodate = false; \\\n  if(matrix.cols() == 1) \\\n  { \\\n    m_matT = matrix.cast<ComplexScalar>(); \\\n    if(computeU)  m_matU = ComplexMatrixType::Identity(1,1); \\\n      m_info = Success; \\\n      m_isInitialized = true; \\\n      m_matUisUptodate = computeU; \\\n      return *this; \\\n  } \\\n  lapack_int n = matrix.cols(), sdim, info; \\\n  lapack_int lda = matrix.outerStride(); \\\n  lapack_int matrix_order = MKLCOLROW; \\\n  char jobvs, sort='N'; \\\n  LAPACK_##MKLPREFIX_U##_SELECT1 select = 0; \\\n  jobvs = (computeU) ? 'V' : 'N'; \\\n  m_matU.resize(n, n); \\\n  lapack_int ldvs  = m_matU.outerStride(); \\\n  m_matT = matrix; \\\n  Matrix<EIGTYPE, Dynamic, Dynamic> w; \\\n  w.resize(n, 1);\\\n  info = LAPACKE_##MKLPREFIX##gees( matrix_order, jobvs, sort, select, n, (MKLTYPE*)m_matT.data(), lda, &sdim, (MKLTYPE*)w.data(), (MKLTYPE*)m_matU.data(), ldvs ); \\\n  if(info == 0) \\\n    m_info = Success; \\\n  else \\\n    m_info = NoConvergence; \\\n\\\n  m_isInitialized = true; \\\n  m_matUisUptodate = computeU; \\\n  return *this; \\\n\\\n}\n\nEIGEN_MKL_SCHUR_COMPLEX(dcomplex, MKL_Complex16, z, Z, ColMajor, LAPACK_COL_MAJOR)\nEIGEN_MKL_SCHUR_COMPLEX(scomplex, MKL_Complex8,  c, C, ColMajor, LAPACK_COL_MAJOR)\nEIGEN_MKL_SCHUR_COMPLEX(dcomplex, MKL_Complex16, z, Z, RowMajor, LAPACK_ROW_MAJOR)\nEIGEN_MKL_SCHUR_COMPLEX(scomplex, MKL_Complex8,  c, C, RowMajor, LAPACK_ROW_MAJOR)\n\n} // end namespace Eigen\n\n#endif // EIGEN_COMPLEX_SCHUR_MKL_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigenvalues/EigenSolver.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2010,2012 Jitse Niesen <jitse@maths.leeds.ac.uk>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_EIGENSOLVER_H\n#define EIGEN_EIGENSOLVER_H\n\n#include \"./RealSchur.h\"\n\nnamespace Eigen { \n\n/** \\eigenvalues_module \\ingroup Eigenvalues_Module\n  *\n  *\n  * \\class EigenSolver\n  *\n  * \\brief Computes eigenvalues and eigenvectors of general matrices\n  *\n  * \\tparam _MatrixType the type of the matrix of which we are computing the\n  * eigendecomposition; this is expected to be an instantiation of the Matrix\n  * class template. Currently, only real matrices are supported.\n  *\n  * The eigenvalues and eigenvectors of a matrix \\f$ A \\f$ are scalars\n  * \\f$ \\lambda \\f$ and vectors \\f$ v \\f$ such that \\f$ Av = \\lambda v \\f$.  If\n  * \\f$ D \\f$ is a diagonal matrix with the eigenvalues on the diagonal, and\n  * \\f$ V \\f$ is a matrix with the eigenvectors as its columns, then \\f$ A V =\n  * V D \\f$. The matrix \\f$ V \\f$ is almost always invertible, in which case we\n  * have \\f$ A = V D V^{-1} \\f$. This is called the eigendecomposition.\n  *\n  * The eigenvalues and eigenvectors of a matrix may be complex, even when the\n  * matrix is real. However, we can choose real matrices \\f$ V \\f$ and \\f$ D\n  * \\f$ satisfying \\f$ A V = V D \\f$, just like the eigendecomposition, if the\n  * matrix \\f$ D \\f$ is not required to be diagonal, but if it is allowed to\n  * have blocks of the form\n  * \\f[ \\begin{bmatrix} u & v \\\\ -v & u \\end{bmatrix} \\f]\n  * (where \\f$ u \\f$ and \\f$ v \\f$ are real numbers) on the diagonal.  These\n  * blocks correspond to complex eigenvalue pairs \\f$ u \\pm iv \\f$. We call\n  * this variant of the eigendecomposition the pseudo-eigendecomposition.\n  *\n  * Call the function compute() to compute the eigenvalues and eigenvectors of\n  * a given matrix. Alternatively, you can use the \n  * EigenSolver(const MatrixType&, bool) constructor which computes the\n  * eigenvalues and eigenvectors at construction time. Once the eigenvalue and\n  * eigenvectors are computed, they can be retrieved with the eigenvalues() and\n  * eigenvectors() functions. The pseudoEigenvalueMatrix() and\n  * pseudoEigenvectors() methods allow the construction of the\n  * pseudo-eigendecomposition.\n  *\n  * The documentation for EigenSolver(const MatrixType&, bool) contains an\n  * example of the typical use of this class.\n  *\n  * \\note The implementation is adapted from\n  * <a href=\"http://math.nist.gov/javanumerics/jama/\">JAMA</a> (public domain).\n  * Their code is based on EISPACK.\n  *\n  * \\sa MatrixBase::eigenvalues(), class ComplexEigenSolver, class SelfAdjointEigenSolver\n  */\ntemplate<typename _MatrixType> class EigenSolver\n{\n  public:\n\n    /** \\brief Synonym for the template parameter \\p _MatrixType. */\n    typedef _MatrixType MatrixType;\n\n    enum {\n      RowsAtCompileTime = MatrixType::RowsAtCompileTime,\n      ColsAtCompileTime = MatrixType::ColsAtCompileTime,\n      Options = MatrixType::Options,\n      MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,\n      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime\n    };\n\n    /** \\brief Scalar type for matrices of type #MatrixType. */\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename NumTraits<Scalar>::Real RealScalar;\n    typedef typename MatrixType::Index Index;\n\n    /** \\brief Complex scalar type for #MatrixType. \n      *\n      * This is \\c std::complex<Scalar> if #Scalar is real (e.g.,\n      * \\c float or \\c double) and just \\c Scalar if #Scalar is\n      * complex.\n      */\n    typedef std::complex<RealScalar> ComplexScalar;\n\n    /** \\brief Type for vector of eigenvalues as returned by eigenvalues(). \n      *\n      * This is a column vector with entries of type #ComplexScalar.\n      * The length of the vector is the size of #MatrixType.\n      */\n    typedef Matrix<ComplexScalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> EigenvalueType;\n\n    /** \\brief Type for matrix of eigenvectors as returned by eigenvectors(). \n      *\n      * This is a square matrix with entries of type #ComplexScalar. \n      * The size is the same as the size of #MatrixType.\n      */\n    typedef Matrix<ComplexScalar, RowsAtCompileTime, ColsAtCompileTime, Options, MaxRowsAtCompileTime, MaxColsAtCompileTime> EigenvectorsType;\n\n    /** \\brief Default constructor.\n      *\n      * The default constructor is useful in cases in which the user intends to\n      * perform decompositions via EigenSolver::compute(const MatrixType&, bool).\n      *\n      * \\sa compute() for an example.\n      */\n EigenSolver() : m_eivec(), m_eivalues(), m_isInitialized(false), m_realSchur(), m_matT(), m_tmp() {}\n\n    /** \\brief Default constructor with memory preallocation\n      *\n      * Like the default constructor but with preallocation of the internal data\n      * according to the specified problem \\a size.\n      * \\sa EigenSolver()\n      */\n    EigenSolver(Index size)\n      : m_eivec(size, size),\n        m_eivalues(size),\n        m_isInitialized(false),\n        m_eigenvectorsOk(false),\n        m_realSchur(size),\n        m_matT(size, size), \n        m_tmp(size)\n    {}\n\n    /** \\brief Constructor; computes eigendecomposition of given matrix. \n      * \n      * \\param[in]  matrix  Square matrix whose eigendecomposition is to be computed.\n      * \\param[in]  computeEigenvectors  If true, both the eigenvectors and the\n      *    eigenvalues are computed; if false, only the eigenvalues are\n      *    computed. \n      *\n      * This constructor calls compute() to compute the eigenvalues\n      * and eigenvectors.\n      *\n      * Example: \\include EigenSolver_EigenSolver_MatrixType.cpp\n      * Output: \\verbinclude EigenSolver_EigenSolver_MatrixType.out\n      *\n      * \\sa compute()\n      */\n    EigenSolver(const MatrixType& matrix, bool computeEigenvectors = true)\n      : m_eivec(matrix.rows(), matrix.cols()),\n        m_eivalues(matrix.cols()),\n        m_isInitialized(false),\n        m_eigenvectorsOk(false),\n        m_realSchur(matrix.cols()),\n        m_matT(matrix.rows(), matrix.cols()), \n        m_tmp(matrix.cols())\n    {\n      compute(matrix, computeEigenvectors);\n    }\n\n    /** \\brief Returns the eigenvectors of given matrix. \n      *\n      * \\returns  %Matrix whose columns are the (possibly complex) eigenvectors.\n      *\n      * \\pre Either the constructor \n      * EigenSolver(const MatrixType&,bool) or the member function\n      * compute(const MatrixType&, bool) has been called before, and\n      * \\p computeEigenvectors was set to true (the default).\n      *\n      * Column \\f$ k \\f$ of the returned matrix is an eigenvector corresponding\n      * to eigenvalue number \\f$ k \\f$ as returned by eigenvalues().  The\n      * eigenvectors are normalized to have (Euclidean) norm equal to one. The\n      * matrix returned by this function is the matrix \\f$ V \\f$ in the\n      * eigendecomposition \\f$ A = V D V^{-1} \\f$, if it exists.\n      *\n      * Example: \\include EigenSolver_eigenvectors.cpp\n      * Output: \\verbinclude EigenSolver_eigenvectors.out\n      *\n      * \\sa eigenvalues(), pseudoEigenvectors()\n      */\n    EigenvectorsType eigenvectors() const;\n\n    /** \\brief Returns the pseudo-eigenvectors of given matrix. \n      *\n      * \\returns  Const reference to matrix whose columns are the pseudo-eigenvectors.\n      *\n      * \\pre Either the constructor \n      * EigenSolver(const MatrixType&,bool) or the member function\n      * compute(const MatrixType&, bool) has been called before, and\n      * \\p computeEigenvectors was set to true (the default).\n      *\n      * The real matrix \\f$ V \\f$ returned by this function and the\n      * block-diagonal matrix \\f$ D \\f$ returned by pseudoEigenvalueMatrix()\n      * satisfy \\f$ AV = VD \\f$.\n      *\n      * Example: \\include EigenSolver_pseudoEigenvectors.cpp\n      * Output: \\verbinclude EigenSolver_pseudoEigenvectors.out\n      *\n      * \\sa pseudoEigenvalueMatrix(), eigenvectors()\n      */\n    const MatrixType& pseudoEigenvectors() const\n    {\n      eigen_assert(m_isInitialized && \"EigenSolver is not initialized.\");\n      eigen_assert(m_eigenvectorsOk && \"The eigenvectors have not been computed together with the eigenvalues.\");\n      return m_eivec;\n    }\n\n    /** \\brief Returns the block-diagonal matrix in the pseudo-eigendecomposition.\n      *\n      * \\returns  A block-diagonal matrix.\n      *\n      * \\pre Either the constructor \n      * EigenSolver(const MatrixType&,bool) or the member function\n      * compute(const MatrixType&, bool) has been called before.\n      *\n      * The matrix \\f$ D \\f$ returned by this function is real and\n      * block-diagonal. The blocks on the diagonal are either 1-by-1 or 2-by-2\n      * blocks of the form\n      * \\f$ \\begin{bmatrix} u & v \\\\ -v & u \\end{bmatrix} \\f$.\n      * These blocks are not sorted in any particular order.\n      * The matrix \\f$ D \\f$ and the matrix \\f$ V \\f$ returned by\n      * pseudoEigenvectors() satisfy \\f$ AV = VD \\f$.\n      *\n      * \\sa pseudoEigenvectors() for an example, eigenvalues()\n      */\n    MatrixType pseudoEigenvalueMatrix() const;\n\n    /** \\brief Returns the eigenvalues of given matrix. \n      *\n      * \\returns A const reference to the column vector containing the eigenvalues.\n      *\n      * \\pre Either the constructor \n      * EigenSolver(const MatrixType&,bool) or the member function\n      * compute(const MatrixType&, bool) has been called before.\n      *\n      * The eigenvalues are repeated according to their algebraic multiplicity,\n      * so there are as many eigenvalues as rows in the matrix. The eigenvalues \n      * are not sorted in any particular order.\n      *\n      * Example: \\include EigenSolver_eigenvalues.cpp\n      * Output: \\verbinclude EigenSolver_eigenvalues.out\n      *\n      * \\sa eigenvectors(), pseudoEigenvalueMatrix(),\n      *     MatrixBase::eigenvalues()\n      */\n    const EigenvalueType& eigenvalues() const\n    {\n      eigen_assert(m_isInitialized && \"EigenSolver is not initialized.\");\n      return m_eivalues;\n    }\n\n    /** \\brief Computes eigendecomposition of given matrix. \n      * \n      * \\param[in]  matrix  Square matrix whose eigendecomposition is to be computed.\n      * \\param[in]  computeEigenvectors  If true, both the eigenvectors and the\n      *    eigenvalues are computed; if false, only the eigenvalues are\n      *    computed. \n      * \\returns    Reference to \\c *this\n      *\n      * This function computes the eigenvalues of the real matrix \\p matrix.\n      * The eigenvalues() function can be used to retrieve them.  If \n      * \\p computeEigenvectors is true, then the eigenvectors are also computed\n      * and can be retrieved by calling eigenvectors().\n      *\n      * The matrix is first reduced to real Schur form using the RealSchur\n      * class. The Schur decomposition is then used to compute the eigenvalues\n      * and eigenvectors.\n      *\n      * The cost of the computation is dominated by the cost of the\n      * Schur decomposition, which is very approximately \\f$ 25n^3 \\f$\n      * (where \\f$ n \\f$ is the size of the matrix) if \\p computeEigenvectors \n      * is true, and \\f$ 10n^3 \\f$ if \\p computeEigenvectors is false.\n      *\n      * This method reuses of the allocated data in the EigenSolver object.\n      *\n      * Example: \\include EigenSolver_compute.cpp\n      * Output: \\verbinclude EigenSolver_compute.out\n      */\n    EigenSolver& compute(const MatrixType& matrix, bool computeEigenvectors = true);\n\n    ComputationInfo info() const\n    {\n      eigen_assert(m_isInitialized && \"EigenSolver is not initialized.\");\n      return m_realSchur.info();\n    }\n\n    /** \\brief Sets the maximum number of iterations allowed. */\n    EigenSolver& setMaxIterations(Index maxIters)\n    {\n      m_realSchur.setMaxIterations(maxIters);\n      return *this;\n    }\n\n    /** \\brief Returns the maximum number of iterations. */\n    Index getMaxIterations()\n    {\n      return m_realSchur.getMaxIterations();\n    }\n\n  private:\n    void doComputeEigenvectors();\n\n  protected:\n    \n    static void check_template_parameters()\n    {\n      EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar);\n      EIGEN_STATIC_ASSERT(!NumTraits<Scalar>::IsComplex, NUMERIC_TYPE_MUST_BE_REAL);\n    }\n    \n    MatrixType m_eivec;\n    EigenvalueType m_eivalues;\n    bool m_isInitialized;\n    bool m_eigenvectorsOk;\n    RealSchur<MatrixType> m_realSchur;\n    MatrixType m_matT;\n\n    typedef Matrix<Scalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> ColumnVectorType;\n    ColumnVectorType m_tmp;\n};\n\ntemplate<typename MatrixType>\nMatrixType EigenSolver<MatrixType>::pseudoEigenvalueMatrix() const\n{\n  eigen_assert(m_isInitialized && \"EigenSolver is not initialized.\");\n  Index n = m_eivalues.rows();\n  MatrixType matD = MatrixType::Zero(n,n);\n  for (Index i=0; i<n; ++i)\n  {\n    if (internal::isMuchSmallerThan(numext::imag(m_eivalues.coeff(i)), numext::real(m_eivalues.coeff(i))))\n      matD.coeffRef(i,i) = numext::real(m_eivalues.coeff(i));\n    else\n    {\n      matD.template block<2,2>(i,i) <<  numext::real(m_eivalues.coeff(i)), numext::imag(m_eivalues.coeff(i)),\n                                       -numext::imag(m_eivalues.coeff(i)), numext::real(m_eivalues.coeff(i));\n      ++i;\n    }\n  }\n  return matD;\n}\n\ntemplate<typename MatrixType>\ntypename EigenSolver<MatrixType>::EigenvectorsType EigenSolver<MatrixType>::eigenvectors() const\n{\n  eigen_assert(m_isInitialized && \"EigenSolver is not initialized.\");\n  eigen_assert(m_eigenvectorsOk && \"The eigenvectors have not been computed together with the eigenvalues.\");\n  Index n = m_eivec.cols();\n  EigenvectorsType matV(n,n);\n  for (Index j=0; j<n; ++j)\n  {\n    if (internal::isMuchSmallerThan(numext::imag(m_eivalues.coeff(j)), numext::real(m_eivalues.coeff(j))) || j+1==n)\n    {\n      // we have a real eigen value\n      matV.col(j) = m_eivec.col(j).template cast<ComplexScalar>();\n      matV.col(j).normalize();\n    }\n    else\n    {\n      // we have a pair of complex eigen values\n      for (Index i=0; i<n; ++i)\n      {\n        matV.coeffRef(i,j)   = ComplexScalar(m_eivec.coeff(i,j),  m_eivec.coeff(i,j+1));\n        matV.coeffRef(i,j+1) = ComplexScalar(m_eivec.coeff(i,j), -m_eivec.coeff(i,j+1));\n      }\n      matV.col(j).normalize();\n      matV.col(j+1).normalize();\n      ++j;\n    }\n  }\n  return matV;\n}\n\ntemplate<typename MatrixType>\nEigenSolver<MatrixType>& \nEigenSolver<MatrixType>::compute(const MatrixType& matrix, bool computeEigenvectors)\n{\n  check_template_parameters();\n  \n  using std::sqrt;\n  using std::abs;\n  eigen_assert(matrix.cols() == matrix.rows());\n\n  // Reduce to real Schur form.\n  m_realSchur.compute(matrix, computeEigenvectors);\n\n  if (m_realSchur.info() == Success)\n  {\n    m_matT = m_realSchur.matrixT();\n    if (computeEigenvectors)\n      m_eivec = m_realSchur.matrixU();\n  \n    // Compute eigenvalues from matT\n    m_eivalues.resize(matrix.cols());\n    Index i = 0;\n    while (i < matrix.cols()) \n    {\n      if (i == matrix.cols() - 1 || m_matT.coeff(i+1, i) == Scalar(0)) \n      {\n        m_eivalues.coeffRef(i) = m_matT.coeff(i, i);\n        ++i;\n      }\n      else\n      {\n        Scalar p = Scalar(0.5) * (m_matT.coeff(i, i) - m_matT.coeff(i+1, i+1));\n        Scalar z = sqrt(abs(p * p + m_matT.coeff(i+1, i) * m_matT.coeff(i, i+1)));\n        m_eivalues.coeffRef(i)   = ComplexScalar(m_matT.coeff(i+1, i+1) + p, z);\n        m_eivalues.coeffRef(i+1) = ComplexScalar(m_matT.coeff(i+1, i+1) + p, -z);\n        i += 2;\n      }\n    }\n    \n    // Compute eigenvectors.\n    if (computeEigenvectors)\n      doComputeEigenvectors();\n  }\n\n  m_isInitialized = true;\n  m_eigenvectorsOk = computeEigenvectors;\n\n  return *this;\n}\n\n// Complex scalar division.\ntemplate<typename Scalar>\nstd::complex<Scalar> cdiv(const Scalar& xr, const Scalar& xi, const Scalar& yr, const Scalar& yi)\n{\n  using std::abs;\n  Scalar r,d;\n  if (abs(yr) > abs(yi))\n  {\n      r = yi/yr;\n      d = yr + r*yi;\n      return std::complex<Scalar>((xr + r*xi)/d, (xi - r*xr)/d);\n  }\n  else\n  {\n      r = yr/yi;\n      d = yi + r*yr;\n      return std::complex<Scalar>((r*xr + xi)/d, (r*xi - xr)/d);\n  }\n}\n\n\ntemplate<typename MatrixType>\nvoid EigenSolver<MatrixType>::doComputeEigenvectors()\n{\n  using std::abs;\n  const Index size = m_eivec.cols();\n  const Scalar eps = NumTraits<Scalar>::epsilon();\n\n  // inefficient! this is already computed in RealSchur\n  Scalar norm(0);\n  for (Index j = 0; j < size; ++j)\n  {\n    norm += m_matT.row(j).segment((std::max)(j-1,Index(0)), size-(std::max)(j-1,Index(0))).cwiseAbs().sum();\n  }\n  \n  // Backsubstitute to find vectors of upper triangular form\n  if (norm == 0.0)\n  {\n    return;\n  }\n\n  for (Index n = size-1; n >= 0; n--)\n  {\n    Scalar p = m_eivalues.coeff(n).real();\n    Scalar q = m_eivalues.coeff(n).imag();\n\n    // Scalar vector\n    if (q == Scalar(0))\n    {\n      Scalar lastr(0), lastw(0);\n      Index l = n;\n\n      m_matT.coeffRef(n,n) = 1.0;\n      for (Index i = n-1; i >= 0; i--)\n      {\n        Scalar w = m_matT.coeff(i,i) - p;\n        Scalar r = m_matT.row(i).segment(l,n-l+1).dot(m_matT.col(n).segment(l, n-l+1));\n\n        if (m_eivalues.coeff(i).imag() < 0.0)\n        {\n          lastw = w;\n          lastr = r;\n        }\n        else\n        {\n          l = i;\n          if (m_eivalues.coeff(i).imag() == 0.0)\n          {\n            if (w != 0.0)\n              m_matT.coeffRef(i,n) = -r / w;\n            else\n              m_matT.coeffRef(i,n) = -r / (eps * norm);\n          }\n          else // Solve real equations\n          {\n            Scalar x = m_matT.coeff(i,i+1);\n            Scalar y = m_matT.coeff(i+1,i);\n            Scalar denom = (m_eivalues.coeff(i).real() - p) * (m_eivalues.coeff(i).real() - p) + m_eivalues.coeff(i).imag() * m_eivalues.coeff(i).imag();\n            Scalar t = (x * lastr - lastw * r) / denom;\n            m_matT.coeffRef(i,n) = t;\n            if (abs(x) > abs(lastw))\n              m_matT.coeffRef(i+1,n) = (-r - w * t) / x;\n            else\n              m_matT.coeffRef(i+1,n) = (-lastr - y * t) / lastw;\n          }\n\n          // Overflow control\n          Scalar t = abs(m_matT.coeff(i,n));\n          if ((eps * t) * t > Scalar(1))\n            m_matT.col(n).tail(size-i) /= t;\n        }\n      }\n    }\n    else if (q < Scalar(0) && n > 0) // Complex vector\n    {\n      Scalar lastra(0), lastsa(0), lastw(0);\n      Index l = n-1;\n\n      // Last vector component imaginary so matrix is triangular\n      if (abs(m_matT.coeff(n,n-1)) > abs(m_matT.coeff(n-1,n)))\n      {\n        m_matT.coeffRef(n-1,n-1) = q / m_matT.coeff(n,n-1);\n        m_matT.coeffRef(n-1,n) = -(m_matT.coeff(n,n) - p) / m_matT.coeff(n,n-1);\n      }\n      else\n      {\n        std::complex<Scalar> cc = cdiv<Scalar>(0.0,-m_matT.coeff(n-1,n),m_matT.coeff(n-1,n-1)-p,q);\n        m_matT.coeffRef(n-1,n-1) = numext::real(cc);\n        m_matT.coeffRef(n-1,n) = numext::imag(cc);\n      }\n      m_matT.coeffRef(n,n-1) = 0.0;\n      m_matT.coeffRef(n,n) = 1.0;\n      for (Index i = n-2; i >= 0; i--)\n      {\n        Scalar ra = m_matT.row(i).segment(l, n-l+1).dot(m_matT.col(n-1).segment(l, n-l+1));\n        Scalar sa = m_matT.row(i).segment(l, n-l+1).dot(m_matT.col(n).segment(l, n-l+1));\n        Scalar w = m_matT.coeff(i,i) - p;\n\n        if (m_eivalues.coeff(i).imag() < 0.0)\n        {\n          lastw = w;\n          lastra = ra;\n          lastsa = sa;\n        }\n        else\n        {\n          l = i;\n          if (m_eivalues.coeff(i).imag() == RealScalar(0))\n          {\n            std::complex<Scalar> cc = cdiv(-ra,-sa,w,q);\n            m_matT.coeffRef(i,n-1) = numext::real(cc);\n            m_matT.coeffRef(i,n) = numext::imag(cc);\n          }\n          else\n          {\n            // Solve complex equations\n            Scalar x = m_matT.coeff(i,i+1);\n            Scalar y = m_matT.coeff(i+1,i);\n            Scalar vr = (m_eivalues.coeff(i).real() - p) * (m_eivalues.coeff(i).real() - p) + m_eivalues.coeff(i).imag() * m_eivalues.coeff(i).imag() - q * q;\n            Scalar vi = (m_eivalues.coeff(i).real() - p) * Scalar(2) * q;\n            if ((vr == 0.0) && (vi == 0.0))\n              vr = eps * norm * (abs(w) + abs(q) + abs(x) + abs(y) + abs(lastw));\n\n            std::complex<Scalar> cc = cdiv(x*lastra-lastw*ra+q*sa,x*lastsa-lastw*sa-q*ra,vr,vi);\n            m_matT.coeffRef(i,n-1) = numext::real(cc);\n            m_matT.coeffRef(i,n) = numext::imag(cc);\n            if (abs(x) > (abs(lastw) + abs(q)))\n            {\n              m_matT.coeffRef(i+1,n-1) = (-ra - w * m_matT.coeff(i,n-1) + q * m_matT.coeff(i,n)) / x;\n              m_matT.coeffRef(i+1,n) = (-sa - w * m_matT.coeff(i,n) - q * m_matT.coeff(i,n-1)) / x;\n            }\n            else\n            {\n              cc = cdiv(-lastra-y*m_matT.coeff(i,n-1),-lastsa-y*m_matT.coeff(i,n),lastw,q);\n              m_matT.coeffRef(i+1,n-1) = numext::real(cc);\n              m_matT.coeffRef(i+1,n) = numext::imag(cc);\n            }\n          }\n\n          // Overflow control\n          using std::max;\n          Scalar t = (max)(abs(m_matT.coeff(i,n-1)),abs(m_matT.coeff(i,n)));\n          if ((eps * t) * t > Scalar(1))\n            m_matT.block(i, n-1, size-i, 2) /= t;\n\n        }\n      }\n      \n      // We handled a pair of complex conjugate eigenvalues, so need to skip them both\n      n--;\n    }\n    else\n    {\n      eigen_assert(0 && \"Internal bug in EigenSolver\"); // this should not happen\n    }\n  }\n\n  // Back transformation to get eigenvectors of original matrix\n  for (Index j = size-1; j >= 0; j--)\n  {\n    m_tmp.noalias() = m_eivec.leftCols(j+1) * m_matT.col(j).segment(0, j+1);\n    m_eivec.col(j) = m_tmp;\n  }\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_EIGENSOLVER_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2010,2012 Jitse Niesen <jitse@maths.leeds.ac.uk>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_GENERALIZEDEIGENSOLVER_H\n#define EIGEN_GENERALIZEDEIGENSOLVER_H\n\n#include \"./RealQZ.h\"\n\nnamespace Eigen { \n\n/** \\eigenvalues_module \\ingroup Eigenvalues_Module\n  *\n  *\n  * \\class GeneralizedEigenSolver\n  *\n  * \\brief Computes the generalized eigenvalues and eigenvectors of a pair of general matrices\n  *\n  * \\tparam _MatrixType the type of the matrices of which we are computing the\n  * eigen-decomposition; this is expected to be an instantiation of the Matrix\n  * class template. Currently, only real matrices are supported.\n  *\n  * The generalized eigenvalues and eigenvectors of a matrix pair \\f$ A \\f$ and \\f$ B \\f$ are scalars\n  * \\f$ \\lambda \\f$ and vectors \\f$ v \\f$ such that \\f$ Av = \\lambda Bv \\f$.  If\n  * \\f$ D \\f$ is a diagonal matrix with the eigenvalues on the diagonal, and\n  * \\f$ V \\f$ is a matrix with the eigenvectors as its columns, then \\f$ A V =\n  * B V D \\f$. The matrix \\f$ V \\f$ is almost always invertible, in which case we\n  * have \\f$ A = B V D V^{-1} \\f$. This is called the generalized eigen-decomposition.\n  *\n  * The generalized eigenvalues and eigenvectors of a matrix pair may be complex, even when the\n  * matrices are real. Moreover, the generalized eigenvalue might be infinite if the matrix B is\n  * singular. To workaround this difficulty, the eigenvalues are provided as a pair of complex \\f$ \\alpha \\f$\n  * and real \\f$ \\beta \\f$ such that: \\f$ \\lambda_i = \\alpha_i / \\beta_i \\f$. If \\f$ \\beta_i \\f$ is (nearly) zero,\n  * then one can consider the well defined left eigenvalue \\f$ \\mu = \\beta_i / \\alpha_i\\f$ such that:\n  * \\f$ \\mu_i A v_i = B v_i \\f$, or even \\f$ \\mu_i u_i^T A  = u_i^T B \\f$ where \\f$ u_i \\f$ is\n  * called the left eigenvector.\n  *\n  * Call the function compute() to compute the generalized eigenvalues and eigenvectors of\n  * a given matrix pair. Alternatively, you can use the\n  * GeneralizedEigenSolver(const MatrixType&, const MatrixType&, bool) constructor which computes the\n  * eigenvalues and eigenvectors at construction time. Once the eigenvalue and\n  * eigenvectors are computed, they can be retrieved with the eigenvalues() and\n  * eigenvectors() functions.\n  *\n  * Here is an usage example of this class:\n  * Example: \\include GeneralizedEigenSolver.cpp\n  * Output: \\verbinclude GeneralizedEigenSolver.out\n  *\n  * \\sa MatrixBase::eigenvalues(), class ComplexEigenSolver, class SelfAdjointEigenSolver\n  */\ntemplate<typename _MatrixType> class GeneralizedEigenSolver\n{\n  public:\n\n    /** \\brief Synonym for the template parameter \\p _MatrixType. */\n    typedef _MatrixType MatrixType;\n\n    enum {\n      RowsAtCompileTime = MatrixType::RowsAtCompileTime,\n      ColsAtCompileTime = MatrixType::ColsAtCompileTime,\n      Options = MatrixType::Options,\n      MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,\n      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime\n    };\n\n    /** \\brief Scalar type for matrices of type #MatrixType. */\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename NumTraits<Scalar>::Real RealScalar;\n    typedef typename MatrixType::Index Index;\n\n    /** \\brief Complex scalar type for #MatrixType. \n      *\n      * This is \\c std::complex<Scalar> if #Scalar is real (e.g.,\n      * \\c float or \\c double) and just \\c Scalar if #Scalar is\n      * complex.\n      */\n    typedef std::complex<RealScalar> ComplexScalar;\n\n    /** \\brief Type for vector of real scalar values eigenvalues as returned by betas().\n      *\n      * This is a column vector with entries of type #Scalar.\n      * The length of the vector is the size of #MatrixType.\n      */\n    typedef Matrix<Scalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> VectorType;\n\n    /** \\brief Type for vector of complex scalar values eigenvalues as returned by betas().\n      *\n      * This is a column vector with entries of type #ComplexScalar.\n      * The length of the vector is the size of #MatrixType.\n      */\n    typedef Matrix<ComplexScalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> ComplexVectorType;\n\n    /** \\brief Expression type for the eigenvalues as returned by eigenvalues().\n      */\n    typedef CwiseBinaryOp<internal::scalar_quotient_op<ComplexScalar,Scalar>,ComplexVectorType,VectorType> EigenvalueType;\n\n    /** \\brief Type for matrix of eigenvectors as returned by eigenvectors(). \n      *\n      * This is a square matrix with entries of type #ComplexScalar. \n      * The size is the same as the size of #MatrixType.\n      */\n    typedef Matrix<ComplexScalar, RowsAtCompileTime, ColsAtCompileTime, Options, MaxRowsAtCompileTime, MaxColsAtCompileTime> EigenvectorsType;\n\n    /** \\brief Default constructor.\n      *\n      * The default constructor is useful in cases in which the user intends to\n      * perform decompositions via EigenSolver::compute(const MatrixType&, bool).\n      *\n      * \\sa compute() for an example.\n      */\n    GeneralizedEigenSolver() : m_eivec(), m_alphas(), m_betas(), m_isInitialized(false), m_realQZ(), m_matS(), m_tmp() {}\n\n    /** \\brief Default constructor with memory preallocation\n      *\n      * Like the default constructor but with preallocation of the internal data\n      * according to the specified problem \\a size.\n      * \\sa GeneralizedEigenSolver()\n      */\n    GeneralizedEigenSolver(Index size)\n      : m_eivec(size, size),\n        m_alphas(size),\n        m_betas(size),\n        m_isInitialized(false),\n        m_eigenvectorsOk(false),\n        m_realQZ(size),\n        m_matS(size, size),\n        m_tmp(size)\n    {}\n\n    /** \\brief Constructor; computes the generalized eigendecomposition of given matrix pair.\n      * \n      * \\param[in]  A  Square matrix whose eigendecomposition is to be computed.\n      * \\param[in]  B  Square matrix whose eigendecomposition is to be computed.\n      * \\param[in]  computeEigenvectors  If true, both the eigenvectors and the\n      *    eigenvalues are computed; if false, only the eigenvalues are computed.\n      *\n      * This constructor calls compute() to compute the generalized eigenvalues\n      * and eigenvectors.\n      *\n      * \\sa compute()\n      */\n    GeneralizedEigenSolver(const MatrixType& A, const MatrixType& B, bool computeEigenvectors = true)\n      : m_eivec(A.rows(), A.cols()),\n        m_alphas(A.cols()),\n        m_betas(A.cols()),\n        m_isInitialized(false),\n        m_eigenvectorsOk(false),\n        m_realQZ(A.cols()),\n        m_matS(A.rows(), A.cols()),\n        m_tmp(A.cols())\n    {\n      compute(A, B, computeEigenvectors);\n    }\n\n    /* \\brief Returns the computed generalized eigenvectors.\n      *\n      * \\returns  %Matrix whose columns are the (possibly complex) eigenvectors.\n      *\n      * \\pre Either the constructor \n      * GeneralizedEigenSolver(const MatrixType&,const MatrixType&, bool) or the member function\n      * compute(const MatrixType&, const MatrixType& bool) has been called before, and\n      * \\p computeEigenvectors was set to true (the default).\n      *\n      * Column \\f$ k \\f$ of the returned matrix is an eigenvector corresponding\n      * to eigenvalue number \\f$ k \\f$ as returned by eigenvalues().  The\n      * eigenvectors are normalized to have (Euclidean) norm equal to one. The\n      * matrix returned by this function is the matrix \\f$ V \\f$ in the\n      * generalized eigendecomposition \\f$ A = B V D V^{-1} \\f$, if it exists.\n      *\n      * \\sa eigenvalues()\n      */\n//    EigenvectorsType eigenvectors() const;\n\n    /** \\brief Returns an expression of the computed generalized eigenvalues.\n      *\n      * \\returns An expression of the column vector containing the eigenvalues.\n      *\n      * It is a shortcut for \\code this->alphas().cwiseQuotient(this->betas()); \\endcode\n      * Not that betas might contain zeros. It is therefore not recommended to use this function,\n      * but rather directly deal with the alphas and betas vectors.\n      *\n      * \\pre Either the constructor \n      * GeneralizedEigenSolver(const MatrixType&,const MatrixType&,bool) or the member function\n      * compute(const MatrixType&,const MatrixType&,bool) has been called before.\n      *\n      * The eigenvalues are repeated according to their algebraic multiplicity,\n      * so there are as many eigenvalues as rows in the matrix. The eigenvalues \n      * are not sorted in any particular order.\n      *\n      * \\sa alphas(), betas(), eigenvectors()\n      */\n    EigenvalueType eigenvalues() const\n    {\n      eigen_assert(m_isInitialized && \"GeneralizedEigenSolver is not initialized.\");\n      return EigenvalueType(m_alphas,m_betas);\n    }\n\n    /** \\returns A const reference to the vectors containing the alpha values\n      *\n      * This vector permits to reconstruct the j-th eigenvalues as alphas(i)/betas(j).\n      *\n      * \\sa betas(), eigenvalues() */\n    ComplexVectorType alphas() const\n    {\n      eigen_assert(m_isInitialized && \"GeneralizedEigenSolver is not initialized.\");\n      return m_alphas;\n    }\n\n    /** \\returns A const reference to the vectors containing the beta values\n      *\n      * This vector permits to reconstruct the j-th eigenvalues as alphas(i)/betas(j).\n      *\n      * \\sa alphas(), eigenvalues() */\n    VectorType betas() const\n    {\n      eigen_assert(m_isInitialized && \"GeneralizedEigenSolver is not initialized.\");\n      return m_betas;\n    }\n\n    /** \\brief Computes generalized eigendecomposition of given matrix.\n      * \n      * \\param[in]  A  Square matrix whose eigendecomposition is to be computed.\n      * \\param[in]  B  Square matrix whose eigendecomposition is to be computed.\n      * \\param[in]  computeEigenvectors  If true, both the eigenvectors and the\n      *    eigenvalues are computed; if false, only the eigenvalues are\n      *    computed. \n      * \\returns    Reference to \\c *this\n      *\n      * This function computes the eigenvalues of the real matrix \\p matrix.\n      * The eigenvalues() function can be used to retrieve them.  If \n      * \\p computeEigenvectors is true, then the eigenvectors are also computed\n      * and can be retrieved by calling eigenvectors().\n      *\n      * The matrix is first reduced to real generalized Schur form using the RealQZ\n      * class. The generalized Schur decomposition is then used to compute the eigenvalues\n      * and eigenvectors.\n      *\n      * The cost of the computation is dominated by the cost of the\n      * generalized Schur decomposition.\n      *\n      * This method reuses of the allocated data in the GeneralizedEigenSolver object.\n      */\n    GeneralizedEigenSolver& compute(const MatrixType& A, const MatrixType& B, bool computeEigenvectors = true);\n\n    ComputationInfo info() const\n    {\n      eigen_assert(m_isInitialized && \"EigenSolver is not initialized.\");\n      return m_realQZ.info();\n    }\n\n    /** Sets the maximal number of iterations allowed.\n    */\n    GeneralizedEigenSolver& setMaxIterations(Index maxIters)\n    {\n      m_realQZ.setMaxIterations(maxIters);\n      return *this;\n    }\n\n  protected:\n    \n    static void check_template_parameters()\n    {\n      EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar);\n      EIGEN_STATIC_ASSERT(!NumTraits<Scalar>::IsComplex, NUMERIC_TYPE_MUST_BE_REAL);\n    }\n    \n    MatrixType m_eivec;\n    ComplexVectorType m_alphas;\n    VectorType m_betas;\n    bool m_isInitialized;\n    bool m_eigenvectorsOk;\n    RealQZ<MatrixType> m_realQZ;\n    MatrixType m_matS;\n\n    typedef Matrix<Scalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> ColumnVectorType;\n    ColumnVectorType m_tmp;\n};\n\n//template<typename MatrixType>\n//typename GeneralizedEigenSolver<MatrixType>::EigenvectorsType GeneralizedEigenSolver<MatrixType>::eigenvectors() const\n//{\n//  eigen_assert(m_isInitialized && \"EigenSolver is not initialized.\");\n//  eigen_assert(m_eigenvectorsOk && \"The eigenvectors have not been computed together with the eigenvalues.\");\n//  Index n = m_eivec.cols();\n//  EigenvectorsType matV(n,n);\n//  // TODO\n//  return matV;\n//}\n\ntemplate<typename MatrixType>\nGeneralizedEigenSolver<MatrixType>&\nGeneralizedEigenSolver<MatrixType>::compute(const MatrixType& A, const MatrixType& B, bool computeEigenvectors)\n{\n  check_template_parameters();\n  \n  using std::sqrt;\n  using std::abs;\n  eigen_assert(A.cols() == A.rows() && B.cols() == A.rows() && B.cols() == B.rows());\n\n  // Reduce to generalized real Schur form:\n  // A = Q S Z and B = Q T Z\n  m_realQZ.compute(A, B, computeEigenvectors);\n\n  if (m_realQZ.info() == Success)\n  {\n    m_matS = m_realQZ.matrixS();\n    if (computeEigenvectors)\n      m_eivec = m_realQZ.matrixZ().transpose();\n  \n    // Compute eigenvalues from matS\n    m_alphas.resize(A.cols());\n    m_betas.resize(A.cols());\n    Index i = 0;\n    while (i < A.cols())\n    {\n      if (i == A.cols() - 1 || m_matS.coeff(i+1, i) == Scalar(0))\n      {\n        m_alphas.coeffRef(i) = m_matS.coeff(i, i);\n        m_betas.coeffRef(i)  = m_realQZ.matrixT().coeff(i,i);\n        ++i;\n      }\n      else\n      {\n        // We need to extract the generalized eigenvalues of the pair of a general 2x2 block S and a triangular 2x2 block T\n        // From the eigen decomposition of T = U * E * U^-1,\n        // we can extract the eigenvalues of (U^-1 * S * U) / E\n        // Here, we can take advantage that E = diag(T), and U = [ 1 T_01 ; 0 T_11-T_00], and U^-1 = [1 -T_11/(T_11-T_00) ; 0 1/(T_11-T_00)].\n        // Then taking beta=T_00*T_11*(T_11-T_00), we can avoid any division, and alpha is the eigenvalues of A = (U^-1 * S * U) * diag(T_11,T_00) * (T_11-T_00):\n\n        // T =  [a b ; 0 c]\n        // S =  [e f ; g h]\n        RealScalar a = m_realQZ.matrixT().coeff(i, i), b = m_realQZ.matrixT().coeff(i, i+1), c = m_realQZ.matrixT().coeff(i+1, i+1);\n        RealScalar e = m_matS.coeff(i, i), f = m_matS.coeff(i, i+1), g = m_matS.coeff(i+1, i), h = m_matS.coeff(i+1, i+1);\n        RealScalar d = c-a;\n        RealScalar gb = g*b;\n        Matrix<RealScalar,2,2> A;\n        A <<  (e*d-gb)*c,  ((e*b+f*d-h*b)*d-gb*b)*a,\n              g*c       ,  (gb+h*d)*a;\n\n        // NOTE, we could also compute the SVD of T's block during the QZ factorization so that the respective T block is guaranteed to be diagonal,\n        // and then we could directly apply the formula below (while taking care of scaling S columns by T11,T00):\n\n        Scalar p = Scalar(0.5) * (A.coeff(i, i) - A.coeff(i+1, i+1));\n        Scalar z = sqrt(abs(p * p + A.coeff(i+1, i) * A.coeff(i, i+1)));\n        m_alphas.coeffRef(i)   = ComplexScalar(A.coeff(i+1, i+1) + p, z);\n        m_alphas.coeffRef(i+1) = ComplexScalar(A.coeff(i+1, i+1) + p, -z);\n\n        m_betas.coeffRef(i)   =\n        m_betas.coeffRef(i+1) = a*c*d;\n\n        i += 2;\n      }\n    }\n  }\n\n  m_isInitialized = true;\n  m_eigenvectorsOk = false;//computeEigenvectors;\n\n  return *this;\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_GENERALIZEDEIGENSOLVER_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2010 Jitse Niesen <jitse@maths.leeds.ac.uk>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_GENERALIZEDSELFADJOINTEIGENSOLVER_H\n#define EIGEN_GENERALIZEDSELFADJOINTEIGENSOLVER_H\n\n#include \"./Tridiagonalization.h\"\n\nnamespace Eigen { \n\n/** \\eigenvalues_module \\ingroup Eigenvalues_Module\n  *\n  *\n  * \\class GeneralizedSelfAdjointEigenSolver\n  *\n  * \\brief Computes eigenvalues and eigenvectors of the generalized selfadjoint eigen problem\n  *\n  * \\tparam _MatrixType the type of the matrix of which we are computing the\n  * eigendecomposition; this is expected to be an instantiation of the Matrix\n  * class template.\n  *\n  * This class solves the generalized eigenvalue problem\n  * \\f$ Av = \\lambda Bv \\f$. In this case, the matrix \\f$ A \\f$ should be\n  * selfadjoint and the matrix \\f$ B \\f$ should be positive definite.\n  *\n  * Only the \\b lower \\b triangular \\b part of the input matrix is referenced.\n  *\n  * Call the function compute() to compute the eigenvalues and eigenvectors of\n  * a given matrix. Alternatively, you can use the\n  * GeneralizedSelfAdjointEigenSolver(const MatrixType&, const MatrixType&, int)\n  * constructor which computes the eigenvalues and eigenvectors at construction time.\n  * Once the eigenvalue and eigenvectors are computed, they can be retrieved with the eigenvalues()\n  * and eigenvectors() functions.\n  *\n  * The documentation for GeneralizedSelfAdjointEigenSolver(const MatrixType&, const MatrixType&, int)\n  * contains an example of the typical use of this class.\n  *\n  * \\sa class SelfAdjointEigenSolver, class EigenSolver, class ComplexEigenSolver\n  */\ntemplate<typename _MatrixType>\nclass GeneralizedSelfAdjointEigenSolver : public SelfAdjointEigenSolver<_MatrixType>\n{\n    typedef SelfAdjointEigenSolver<_MatrixType> Base;\n  public:\n\n    typedef typename Base::Index Index;\n    typedef _MatrixType MatrixType;\n\n    /** \\brief Default constructor for fixed-size matrices.\n      *\n      * The default constructor is useful in cases in which the user intends to\n      * perform decompositions via compute(). This constructor\n      * can only be used if \\p _MatrixType is a fixed-size matrix; use\n      * GeneralizedSelfAdjointEigenSolver(Index) for dynamic-size matrices.\n      */\n    GeneralizedSelfAdjointEigenSolver() : Base() {}\n\n    /** \\brief Constructor, pre-allocates memory for dynamic-size matrices.\n      *\n      * \\param [in]  size  Positive integer, size of the matrix whose\n      * eigenvalues and eigenvectors will be computed.\n      *\n      * This constructor is useful for dynamic-size matrices, when the user\n      * intends to perform decompositions via compute(). The \\p size\n      * parameter is only used as a hint. It is not an error to give a wrong\n      * \\p size, but it may impair performance.\n      *\n      * \\sa compute() for an example\n      */\n    GeneralizedSelfAdjointEigenSolver(Index size)\n        : Base(size)\n    {}\n\n    /** \\brief Constructor; computes generalized eigendecomposition of given matrix pencil.\n      *\n      * \\param[in]  matA  Selfadjoint matrix in matrix pencil.\n      *                   Only the lower triangular part of the matrix is referenced.\n      * \\param[in]  matB  Positive-definite matrix in matrix pencil.\n      *                   Only the lower triangular part of the matrix is referenced.\n      * \\param[in]  options A or-ed set of flags {#ComputeEigenvectors,#EigenvaluesOnly} | {#Ax_lBx,#ABx_lx,#BAx_lx}.\n      *                     Default is #ComputeEigenvectors|#Ax_lBx.\n      *\n      * This constructor calls compute(const MatrixType&, const MatrixType&, int)\n      * to compute the eigenvalues and (if requested) the eigenvectors of the\n      * generalized eigenproblem \\f$ Ax = \\lambda B x \\f$ with \\a matA the\n      * selfadjoint matrix \\f$ A \\f$ and \\a matB the positive definite matrix\n      * \\f$ B \\f$. Each eigenvector \\f$ x \\f$ satisfies the property\n      * \\f$ x^* B x = 1 \\f$. The eigenvectors are computed if\n      * \\a options contains ComputeEigenvectors.\n      *\n      * In addition, the two following variants can be solved via \\p options:\n      * - \\c ABx_lx: \\f$ ABx = \\lambda x \\f$\n      * - \\c BAx_lx: \\f$ BAx = \\lambda x \\f$\n      *\n      * Example: \\include SelfAdjointEigenSolver_SelfAdjointEigenSolver_MatrixType2.cpp\n      * Output: \\verbinclude SelfAdjointEigenSolver_SelfAdjointEigenSolver_MatrixType2.out\n      *\n      * \\sa compute(const MatrixType&, const MatrixType&, int)\n      */\n    GeneralizedSelfAdjointEigenSolver(const MatrixType& matA, const MatrixType& matB,\n                                      int options = ComputeEigenvectors|Ax_lBx)\n      : Base(matA.cols())\n    {\n      compute(matA, matB, options);\n    }\n\n    /** \\brief Computes generalized eigendecomposition of given matrix pencil.\n      *\n      * \\param[in]  matA  Selfadjoint matrix in matrix pencil.\n      *                   Only the lower triangular part of the matrix is referenced.\n      * \\param[in]  matB  Positive-definite matrix in matrix pencil.\n      *                   Only the lower triangular part of the matrix is referenced.\n      * \\param[in]  options A or-ed set of flags {#ComputeEigenvectors,#EigenvaluesOnly} | {#Ax_lBx,#ABx_lx,#BAx_lx}.\n      *                     Default is #ComputeEigenvectors|#Ax_lBx.\n      *\n      * \\returns    Reference to \\c *this\n      *\n      * Accoring to \\p options, this function computes eigenvalues and (if requested)\n      * the eigenvectors of one of the following three generalized eigenproblems:\n      * - \\c Ax_lBx: \\f$ Ax = \\lambda B x \\f$\n      * - \\c ABx_lx: \\f$ ABx = \\lambda x \\f$\n      * - \\c BAx_lx: \\f$ BAx = \\lambda x \\f$\n      * with \\a matA the selfadjoint matrix \\f$ A \\f$ and \\a matB the positive definite\n      * matrix \\f$ B \\f$.\n      * In addition, each eigenvector \\f$ x \\f$ satisfies the property \\f$ x^* B x = 1 \\f$.\n      *\n      * The eigenvalues() function can be used to retrieve\n      * the eigenvalues. If \\p options contains ComputeEigenvectors, then the\n      * eigenvectors are also computed and can be retrieved by calling\n      * eigenvectors().\n      *\n      * The implementation uses LLT to compute the Cholesky decomposition\n      * \\f$ B = LL^* \\f$ and computes the classical eigendecomposition\n      * of the selfadjoint matrix \\f$ L^{-1} A (L^*)^{-1} \\f$ if \\p options contains Ax_lBx\n      * and of \\f$ L^{*} A L \\f$ otherwise. This solves the\n      * generalized eigenproblem, because any solution of the generalized\n      * eigenproblem \\f$ Ax = \\lambda B x \\f$ corresponds to a solution\n      * \\f$ L^{-1} A (L^*)^{-1} (L^* x) = \\lambda (L^* x) \\f$ of the\n      * eigenproblem for \\f$ L^{-1} A (L^*)^{-1} \\f$. Similar statements\n      * can be made for the two other variants.\n      *\n      * Example: \\include SelfAdjointEigenSolver_compute_MatrixType2.cpp\n      * Output: \\verbinclude SelfAdjointEigenSolver_compute_MatrixType2.out\n      *\n      * \\sa GeneralizedSelfAdjointEigenSolver(const MatrixType&, const MatrixType&, int)\n      */\n    GeneralizedSelfAdjointEigenSolver& compute(const MatrixType& matA, const MatrixType& matB,\n                                               int options = ComputeEigenvectors|Ax_lBx);\n\n  protected:\n\n};\n\n\ntemplate<typename MatrixType>\nGeneralizedSelfAdjointEigenSolver<MatrixType>& GeneralizedSelfAdjointEigenSolver<MatrixType>::\ncompute(const MatrixType& matA, const MatrixType& matB, int options)\n{\n  eigen_assert(matA.cols()==matA.rows() && matB.rows()==matA.rows() && matB.cols()==matB.rows());\n  eigen_assert((options&~(EigVecMask|GenEigMask))==0\n          && (options&EigVecMask)!=EigVecMask\n          && ((options&GenEigMask)==0 || (options&GenEigMask)==Ax_lBx\n           || (options&GenEigMask)==ABx_lx || (options&GenEigMask)==BAx_lx)\n          && \"invalid option parameter\");\n\n  bool computeEigVecs = ((options&EigVecMask)==0) || ((options&EigVecMask)==ComputeEigenvectors);\n\n  // Compute the cholesky decomposition of matB = L L' = U'U\n  LLT<MatrixType> cholB(matB);\n\n  int type = (options&GenEigMask);\n  if(type==0)\n    type = Ax_lBx;\n\n  if(type==Ax_lBx)\n  {\n    // compute C = inv(L) A inv(L')\n    MatrixType matC = matA.template selfadjointView<Lower>();\n    cholB.matrixL().template solveInPlace<OnTheLeft>(matC);\n    cholB.matrixU().template solveInPlace<OnTheRight>(matC);\n\n    Base::compute(matC, computeEigVecs ? ComputeEigenvectors : EigenvaluesOnly );\n\n    // transform back the eigen vectors: evecs = inv(U) * evecs\n    if(computeEigVecs)\n      cholB.matrixU().solveInPlace(Base::m_eivec);\n  }\n  else if(type==ABx_lx)\n  {\n    // compute C = L' A L\n    MatrixType matC = matA.template selfadjointView<Lower>();\n    matC = matC * cholB.matrixL();\n    matC = cholB.matrixU() * matC;\n\n    Base::compute(matC, computeEigVecs ? ComputeEigenvectors : EigenvaluesOnly);\n\n    // transform back the eigen vectors: evecs = inv(U) * evecs\n    if(computeEigVecs)\n      cholB.matrixU().solveInPlace(Base::m_eivec);\n  }\n  else if(type==BAx_lx)\n  {\n    // compute C = L' A L\n    MatrixType matC = matA.template selfadjointView<Lower>();\n    matC = matC * cholB.matrixL();\n    matC = cholB.matrixU() * matC;\n\n    Base::compute(matC, computeEigVecs ? ComputeEigenvectors : EigenvaluesOnly);\n\n    // transform back the eigen vectors: evecs = L * evecs\n    if(computeEigVecs)\n      Base::m_eivec = cholB.matrixL() * Base::m_eivec;\n  }\n\n  return *this;\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_GENERALIZEDSELFADJOINTEIGENSOLVER_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigenvalues/HessenbergDecomposition.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2010 Jitse Niesen <jitse@maths.leeds.ac.uk>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_HESSENBERGDECOMPOSITION_H\n#define EIGEN_HESSENBERGDECOMPOSITION_H\n\nnamespace Eigen { \n\nnamespace internal {\n  \ntemplate<typename MatrixType> struct HessenbergDecompositionMatrixHReturnType;\ntemplate<typename MatrixType>\nstruct traits<HessenbergDecompositionMatrixHReturnType<MatrixType> >\n{\n  typedef MatrixType ReturnType;\n};\n\n}\n\n/** \\eigenvalues_module \\ingroup Eigenvalues_Module\n  *\n  *\n  * \\class HessenbergDecomposition\n  *\n  * \\brief Reduces a square matrix to Hessenberg form by an orthogonal similarity transformation\n  *\n  * \\tparam _MatrixType the type of the matrix of which we are computing the Hessenberg decomposition\n  *\n  * This class performs an Hessenberg decomposition of a matrix \\f$ A \\f$. In\n  * the real case, the Hessenberg decomposition consists of an orthogonal\n  * matrix \\f$ Q \\f$ and a Hessenberg matrix \\f$ H \\f$ such that \\f$ A = Q H\n  * Q^T \\f$. An orthogonal matrix is a matrix whose inverse equals its\n  * transpose (\\f$ Q^{-1} = Q^T \\f$). A Hessenberg matrix has zeros below the\n  * subdiagonal, so it is almost upper triangular. The Hessenberg decomposition\n  * of a complex matrix is \\f$ A = Q H Q^* \\f$ with \\f$ Q \\f$ unitary (that is,\n  * \\f$ Q^{-1} = Q^* \\f$).\n  *\n  * Call the function compute() to compute the Hessenberg decomposition of a\n  * given matrix. Alternatively, you can use the\n  * HessenbergDecomposition(const MatrixType&) constructor which computes the\n  * Hessenberg decomposition at construction time. Once the decomposition is\n  * computed, you can use the matrixH() and matrixQ() functions to construct\n  * the matrices H and Q in the decomposition.\n  *\n  * The documentation for matrixH() contains an example of the typical use of\n  * this class.\n  *\n  * \\sa class ComplexSchur, class Tridiagonalization, \\ref QR_Module \"QR Module\"\n  */\ntemplate<typename _MatrixType> class HessenbergDecomposition\n{\n  public:\n\n    /** \\brief Synonym for the template parameter \\p _MatrixType. */\n    typedef _MatrixType MatrixType;\n\n    enum {\n      Size = MatrixType::RowsAtCompileTime,\n      SizeMinusOne = Size == Dynamic ? Dynamic : Size - 1,\n      Options = MatrixType::Options,\n      MaxSize = MatrixType::MaxRowsAtCompileTime,\n      MaxSizeMinusOne = MaxSize == Dynamic ? Dynamic : MaxSize - 1\n    };\n\n    /** \\brief Scalar type for matrices of type #MatrixType. */\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename MatrixType::Index Index;\n\n    /** \\brief Type for vector of Householder coefficients.\n      *\n      * This is column vector with entries of type #Scalar. The length of the\n      * vector is one less than the size of #MatrixType, if it is a fixed-side\n      * type.\n      */\n    typedef Matrix<Scalar, SizeMinusOne, 1, Options & ~RowMajor, MaxSizeMinusOne, 1> CoeffVectorType;\n\n    /** \\brief Return type of matrixQ() */\n    typedef HouseholderSequence<MatrixType,typename internal::remove_all<typename CoeffVectorType::ConjugateReturnType>::type> HouseholderSequenceType;\n    \n    typedef internal::HessenbergDecompositionMatrixHReturnType<MatrixType> MatrixHReturnType;\n\n    /** \\brief Default constructor; the decomposition will be computed later.\n      *\n      * \\param [in] size  The size of the matrix whose Hessenberg decomposition will be computed.\n      *\n      * The default constructor is useful in cases in which the user intends to\n      * perform decompositions via compute().  The \\p size parameter is only\n      * used as a hint. It is not an error to give a wrong \\p size, but it may\n      * impair performance.\n      *\n      * \\sa compute() for an example.\n      */\n    HessenbergDecomposition(Index size = Size==Dynamic ? 2 : Size)\n      : m_matrix(size,size),\n        m_temp(size),\n        m_isInitialized(false)\n    {\n      if(size>1)\n        m_hCoeffs.resize(size-1);\n    }\n\n    /** \\brief Constructor; computes Hessenberg decomposition of given matrix.\n      *\n      * \\param[in]  matrix  Square matrix whose Hessenberg decomposition is to be computed.\n      *\n      * This constructor calls compute() to compute the Hessenberg\n      * decomposition.\n      *\n      * \\sa matrixH() for an example.\n      */\n    HessenbergDecomposition(const MatrixType& matrix)\n      : m_matrix(matrix),\n        m_temp(matrix.rows()),\n        m_isInitialized(false)\n    {\n      if(matrix.rows()<2)\n      {\n        m_isInitialized = true;\n        return;\n      }\n      m_hCoeffs.resize(matrix.rows()-1,1);\n      _compute(m_matrix, m_hCoeffs, m_temp);\n      m_isInitialized = true;\n    }\n\n    /** \\brief Computes Hessenberg decomposition of given matrix.\n      *\n      * \\param[in]  matrix  Square matrix whose Hessenberg decomposition is to be computed.\n      * \\returns    Reference to \\c *this\n      *\n      * The Hessenberg decomposition is computed by bringing the columns of the\n      * matrix successively in the required form using Householder reflections\n      * (see, e.g., Algorithm 7.4.2 in Golub \\& Van Loan, <i>%Matrix\n      * Computations</i>). The cost is \\f$ 10n^3/3 \\f$ flops, where \\f$ n \\f$\n      * denotes the size of the given matrix.\n      *\n      * This method reuses of the allocated data in the HessenbergDecomposition\n      * object.\n      *\n      * Example: \\include HessenbergDecomposition_compute.cpp\n      * Output: \\verbinclude HessenbergDecomposition_compute.out\n      */\n    HessenbergDecomposition& compute(const MatrixType& matrix)\n    {\n      m_matrix = matrix;\n      if(matrix.rows()<2)\n      {\n        m_isInitialized = true;\n        return *this;\n      }\n      m_hCoeffs.resize(matrix.rows()-1,1);\n      _compute(m_matrix, m_hCoeffs, m_temp);\n      m_isInitialized = true;\n      return *this;\n    }\n\n    /** \\brief Returns the Householder coefficients.\n      *\n      * \\returns a const reference to the vector of Householder coefficients\n      *\n      * \\pre Either the constructor HessenbergDecomposition(const MatrixType&)\n      * or the member function compute(const MatrixType&) has been called\n      * before to compute the Hessenberg decomposition of a matrix.\n      *\n      * The Householder coefficients allow the reconstruction of the matrix\n      * \\f$ Q \\f$ in the Hessenberg decomposition from the packed data.\n      *\n      * \\sa packedMatrix(), \\ref Householder_Module \"Householder module\"\n      */\n    const CoeffVectorType& householderCoefficients() const\n    {\n      eigen_assert(m_isInitialized && \"HessenbergDecomposition is not initialized.\");\n      return m_hCoeffs;\n    }\n\n    /** \\brief Returns the internal representation of the decomposition\n      *\n      *\t\\returns a const reference to a matrix with the internal representation\n      *\t         of the decomposition.\n      *\n      * \\pre Either the constructor HessenbergDecomposition(const MatrixType&)\n      * or the member function compute(const MatrixType&) has been called\n      * before to compute the Hessenberg decomposition of a matrix.\n      *\n      * The returned matrix contains the following information:\n      *  - the upper part and lower sub-diagonal represent the Hessenberg matrix H\n      *  - the rest of the lower part contains the Householder vectors that, combined with\n      *    Householder coefficients returned by householderCoefficients(),\n      *    allows to reconstruct the matrix Q as\n      *       \\f$ Q = H_{N-1} \\ldots H_1 H_0 \\f$.\n      *    Here, the matrices \\f$ H_i \\f$ are the Householder transformations\n      *       \\f$ H_i = (I - h_i v_i v_i^T) \\f$\n      *    where \\f$ h_i \\f$ is the \\f$ i \\f$th Householder coefficient and\n      *    \\f$ v_i \\f$ is the Householder vector defined by\n      *       \\f$ v_i = [ 0, \\ldots, 0, 1, M(i+2,i), \\ldots, M(N-1,i) ]^T \\f$\n      *    with M the matrix returned by this function.\n      *\n      * See LAPACK for further details on this packed storage.\n      *\n      * Example: \\include HessenbergDecomposition_packedMatrix.cpp\n      * Output: \\verbinclude HessenbergDecomposition_packedMatrix.out\n      *\n      * \\sa householderCoefficients()\n      */\n    const MatrixType& packedMatrix() const\n    {\n      eigen_assert(m_isInitialized && \"HessenbergDecomposition is not initialized.\");\n      return m_matrix;\n    }\n\n    /** \\brief Reconstructs the orthogonal matrix Q in the decomposition\n      *\n      * \\returns object representing the matrix Q\n      *\n      * \\pre Either the constructor HessenbergDecomposition(const MatrixType&)\n      * or the member function compute(const MatrixType&) has been called\n      * before to compute the Hessenberg decomposition of a matrix.\n      *\n      * This function returns a light-weight object of template class\n      * HouseholderSequence. You can either apply it directly to a matrix or\n      * you can convert it to a matrix of type #MatrixType.\n      *\n      * \\sa matrixH() for an example, class HouseholderSequence\n      */\n    HouseholderSequenceType matrixQ() const\n    {\n      eigen_assert(m_isInitialized && \"HessenbergDecomposition is not initialized.\");\n      return HouseholderSequenceType(m_matrix, m_hCoeffs.conjugate())\n             .setLength(m_matrix.rows() - 1)\n             .setShift(1);\n    }\n\n    /** \\brief Constructs the Hessenberg matrix H in the decomposition\n      *\n      * \\returns expression object representing the matrix H\n      *\n      * \\pre Either the constructor HessenbergDecomposition(const MatrixType&)\n      * or the member function compute(const MatrixType&) has been called\n      * before to compute the Hessenberg decomposition of a matrix.\n      *\n      * The object returned by this function constructs the Hessenberg matrix H\n      * when it is assigned to a matrix or otherwise evaluated. The matrix H is\n      * constructed from the packed matrix as returned by packedMatrix(): The\n      * upper part (including the subdiagonal) of the packed matrix contains\n      * the matrix H. It may sometimes be better to directly use the packed\n      * matrix instead of constructing the matrix H.\n      *\n      * Example: \\include HessenbergDecomposition_matrixH.cpp\n      * Output: \\verbinclude HessenbergDecomposition_matrixH.out\n      *\n      * \\sa matrixQ(), packedMatrix()\n      */\n    MatrixHReturnType matrixH() const\n    {\n      eigen_assert(m_isInitialized && \"HessenbergDecomposition is not initialized.\");\n      return MatrixHReturnType(*this);\n    }\n\n  private:\n\n    typedef Matrix<Scalar, 1, Size, Options | RowMajor, 1, MaxSize> VectorType;\n    typedef typename NumTraits<Scalar>::Real RealScalar;\n    static void _compute(MatrixType& matA, CoeffVectorType& hCoeffs, VectorType& temp);\n\n  protected:\n    MatrixType m_matrix;\n    CoeffVectorType m_hCoeffs;\n    VectorType m_temp;\n    bool m_isInitialized;\n};\n\n/** \\internal\n  * Performs a tridiagonal decomposition of \\a matA in place.\n  *\n  * \\param matA the input selfadjoint matrix\n  * \\param hCoeffs returned Householder coefficients\n  *\n  * The result is written in the lower triangular part of \\a matA.\n  *\n  * Implemented from Golub's \"%Matrix Computations\", algorithm 8.3.1.\n  *\n  * \\sa packedMatrix()\n  */\ntemplate<typename MatrixType>\nvoid HessenbergDecomposition<MatrixType>::_compute(MatrixType& matA, CoeffVectorType& hCoeffs, VectorType& temp)\n{\n  eigen_assert(matA.rows()==matA.cols());\n  Index n = matA.rows();\n  temp.resize(n);\n  for (Index i = 0; i<n-1; ++i)\n  {\n    // let's consider the vector v = i-th column starting at position i+1\n    Index remainingSize = n-i-1;\n    RealScalar beta;\n    Scalar h;\n    matA.col(i).tail(remainingSize).makeHouseholderInPlace(h, beta);\n    matA.col(i).coeffRef(i+1) = beta;\n    hCoeffs.coeffRef(i) = h;\n\n    // Apply similarity transformation to remaining columns,\n    // i.e., compute A = H A H'\n\n    // A = H A\n    matA.bottomRightCorner(remainingSize, remainingSize)\n        .applyHouseholderOnTheLeft(matA.col(i).tail(remainingSize-1), h, &temp.coeffRef(0));\n\n    // A = A H'\n    matA.rightCols(remainingSize)\n        .applyHouseholderOnTheRight(matA.col(i).tail(remainingSize-1).conjugate(), numext::conj(h), &temp.coeffRef(0));\n  }\n}\n\nnamespace internal {\n\n/** \\eigenvalues_module \\ingroup Eigenvalues_Module\n  *\n  *\n  * \\brief Expression type for return value of HessenbergDecomposition::matrixH()\n  *\n  * \\tparam MatrixType type of matrix in the Hessenberg decomposition\n  *\n  * Objects of this type represent the Hessenberg matrix in the Hessenberg\n  * decomposition of some matrix. The object holds a reference to the\n  * HessenbergDecomposition class until the it is assigned or evaluated for\n  * some other reason (the reference should remain valid during the life time\n  * of this object). This class is the return type of\n  * HessenbergDecomposition::matrixH(); there is probably no other use for this\n  * class.\n  */\ntemplate<typename MatrixType> struct HessenbergDecompositionMatrixHReturnType\n: public ReturnByValue<HessenbergDecompositionMatrixHReturnType<MatrixType> >\n{\n    typedef typename MatrixType::Index Index;\n  public:\n    /** \\brief Constructor.\n      *\n      * \\param[in] hess  Hessenberg decomposition\n      */\n    HessenbergDecompositionMatrixHReturnType(const HessenbergDecomposition<MatrixType>& hess) : m_hess(hess) { }\n\n    /** \\brief Hessenberg matrix in decomposition.\n      *\n      * \\param[out] result  Hessenberg matrix in decomposition \\p hess which\n      *                     was passed to the constructor\n      */\n    template <typename ResultType>\n    inline void evalTo(ResultType& result) const\n    {\n      result = m_hess.packedMatrix();\n      Index n = result.rows();\n      if (n>2)\n        result.bottomLeftCorner(n-2, n-2).template triangularView<Lower>().setZero();\n    }\n\n    Index rows() const { return m_hess.packedMatrix().rows(); }\n    Index cols() const { return m_hess.packedMatrix().cols(); }\n\n  protected:\n    const HessenbergDecomposition<MatrixType>& m_hess;\n};\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_HESSENBERGDECOMPOSITION_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2010 Jitse Niesen <jitse@maths.leeds.ac.uk>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_MATRIXBASEEIGENVALUES_H\n#define EIGEN_MATRIXBASEEIGENVALUES_H\n\nnamespace Eigen { \n\nnamespace internal {\n\ntemplate<typename Derived, bool IsComplex>\nstruct eigenvalues_selector\n{\n  // this is the implementation for the case IsComplex = true\n  static inline typename MatrixBase<Derived>::EigenvaluesReturnType const\n  run(const MatrixBase<Derived>& m)\n  {\n    typedef typename Derived::PlainObject PlainObject;\n    PlainObject m_eval(m);\n    return ComplexEigenSolver<PlainObject>(m_eval, false).eigenvalues();\n  }\n};\n\ntemplate<typename Derived>\nstruct eigenvalues_selector<Derived, false>\n{\n  static inline typename MatrixBase<Derived>::EigenvaluesReturnType const\n  run(const MatrixBase<Derived>& m)\n  {\n    typedef typename Derived::PlainObject PlainObject;\n    PlainObject m_eval(m);\n    return EigenSolver<PlainObject>(m_eval, false).eigenvalues();\n  }\n};\n\n} // end namespace internal\n\n/** \\brief Computes the eigenvalues of a matrix \n  * \\returns Column vector containing the eigenvalues.\n  *\n  * \\eigenvalues_module\n  * This function computes the eigenvalues with the help of the EigenSolver\n  * class (for real matrices) or the ComplexEigenSolver class (for complex\n  * matrices). \n  *\n  * The eigenvalues are repeated according to their algebraic multiplicity,\n  * so there are as many eigenvalues as rows in the matrix.\n  *\n  * The SelfAdjointView class provides a better algorithm for selfadjoint\n  * matrices.\n  *\n  * Example: \\include MatrixBase_eigenvalues.cpp\n  * Output: \\verbinclude MatrixBase_eigenvalues.out\n  *\n  * \\sa EigenSolver::eigenvalues(), ComplexEigenSolver::eigenvalues(),\n  *     SelfAdjointView::eigenvalues()\n  */\ntemplate<typename Derived>\ninline typename MatrixBase<Derived>::EigenvaluesReturnType\nMatrixBase<Derived>::eigenvalues() const\n{\n  typedef typename internal::traits<Derived>::Scalar Scalar;\n  return internal::eigenvalues_selector<Derived, NumTraits<Scalar>::IsComplex>::run(derived());\n}\n\n/** \\brief Computes the eigenvalues of a matrix\n  * \\returns Column vector containing the eigenvalues.\n  *\n  * \\eigenvalues_module\n  * This function computes the eigenvalues with the help of the\n  * SelfAdjointEigenSolver class.  The eigenvalues are repeated according to\n  * their algebraic multiplicity, so there are as many eigenvalues as rows in\n  * the matrix.\n  *\n  * Example: \\include SelfAdjointView_eigenvalues.cpp\n  * Output: \\verbinclude SelfAdjointView_eigenvalues.out\n  *\n  * \\sa SelfAdjointEigenSolver::eigenvalues(), MatrixBase::eigenvalues()\n  */\ntemplate<typename MatrixType, unsigned int UpLo> \ninline typename SelfAdjointView<MatrixType, UpLo>::EigenvaluesReturnType\nSelfAdjointView<MatrixType, UpLo>::eigenvalues() const\n{\n  typedef typename SelfAdjointView<MatrixType, UpLo>::PlainObject PlainObject;\n  PlainObject thisAsMatrix(*this);\n  return SelfAdjointEigenSolver<PlainObject>(thisAsMatrix, false).eigenvalues();\n}\n\n\n\n/** \\brief Computes the L2 operator norm\n  * \\returns Operator norm of the matrix.\n  *\n  * \\eigenvalues_module\n  * This function computes the L2 operator norm of a matrix, which is also\n  * known as the spectral norm. The norm of a matrix \\f$ A \\f$ is defined to be\n  * \\f[ \\|A\\|_2 = \\max_x \\frac{\\|Ax\\|_2}{\\|x\\|_2} \\f]\n  * where the maximum is over all vectors and the norm on the right is the\n  * Euclidean vector norm. The norm equals the largest singular value, which is\n  * the square root of the largest eigenvalue of the positive semi-definite\n  * matrix \\f$ A^*A \\f$.\n  *\n  * The current implementation uses the eigenvalues of \\f$ A^*A \\f$, as computed\n  * by SelfAdjointView::eigenvalues(), to compute the operator norm of a\n  * matrix.  The SelfAdjointView class provides a better algorithm for\n  * selfadjoint matrices.\n  *\n  * Example: \\include MatrixBase_operatorNorm.cpp\n  * Output: \\verbinclude MatrixBase_operatorNorm.out\n  *\n  * \\sa SelfAdjointView::eigenvalues(), SelfAdjointView::operatorNorm()\n  */\ntemplate<typename Derived>\ninline typename MatrixBase<Derived>::RealScalar\nMatrixBase<Derived>::operatorNorm() const\n{\n  using std::sqrt;\n  typename Derived::PlainObject m_eval(derived());\n  // FIXME if it is really guaranteed that the eigenvalues are already sorted,\n  // then we don't need to compute a maxCoeff() here, comparing the 1st and last ones is enough.\n  return sqrt((m_eval*m_eval.adjoint())\n                 .eval()\n\t\t .template selfadjointView<Lower>()\n\t\t .eigenvalues()\n\t\t .maxCoeff()\n\t\t );\n}\n\n/** \\brief Computes the L2 operator norm\n  * \\returns Operator norm of the matrix.\n  *\n  * \\eigenvalues_module\n  * This function computes the L2 operator norm of a self-adjoint matrix. For a\n  * self-adjoint matrix, the operator norm is the largest eigenvalue.\n  *\n  * The current implementation uses the eigenvalues of the matrix, as computed\n  * by eigenvalues(), to compute the operator norm of the matrix.\n  *\n  * Example: \\include SelfAdjointView_operatorNorm.cpp\n  * Output: \\verbinclude SelfAdjointView_operatorNorm.out\n  *\n  * \\sa eigenvalues(), MatrixBase::operatorNorm()\n  */\ntemplate<typename MatrixType, unsigned int UpLo>\ninline typename SelfAdjointView<MatrixType, UpLo>::RealScalar\nSelfAdjointView<MatrixType, UpLo>::operatorNorm() const\n{\n  return eigenvalues().cwiseAbs().maxCoeff();\n}\n\n} // end namespace Eigen\n\n#endif\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigenvalues/RealQZ.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Alexey Korepanov <kaikaikai@yandex.ru>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_REAL_QZ_H\n#define EIGEN_REAL_QZ_H\n\nnamespace Eigen {\n\n  /** \\eigenvalues_module \\ingroup Eigenvalues_Module\n   *\n   *\n   * \\class RealQZ\n   *\n   * \\brief Performs a real QZ decomposition of a pair of square matrices\n   *\n   * \\tparam _MatrixType the type of the matrix of which we are computing the\n   * real QZ decomposition; this is expected to be an instantiation of the\n   * Matrix class template.\n   *\n   * Given a real square matrices A and B, this class computes the real QZ\n   * decomposition: \\f$ A = Q S Z \\f$, \\f$ B = Q T Z \\f$ where Q and Z are\n   * real orthogonal matrixes, T is upper-triangular matrix, and S is upper\n   * quasi-triangular matrix. An orthogonal matrix is a matrix whose\n   * inverse is equal to its transpose, \\f$ U^{-1} = U^T \\f$. A quasi-triangular\n   * matrix is a block-triangular matrix whose diagonal consists of 1-by-1\n   * blocks and 2-by-2 blocks where further reduction is impossible due to\n   * complex eigenvalues. \n   *\n   * The eigenvalues of the pencil \\f$ A - z B \\f$ can be obtained from\n   * 1x1 and 2x2 blocks on the diagonals of S and T.\n   *\n   * Call the function compute() to compute the real QZ decomposition of a\n   * given pair of matrices. Alternatively, you can use the \n   * RealQZ(const MatrixType& B, const MatrixType& B, bool computeQZ)\n   * constructor which computes the real QZ decomposition at construction\n   * time. Once the decomposition is computed, you can use the matrixS(),\n   * matrixT(), matrixQ() and matrixZ() functions to retrieve the matrices\n   * S, T, Q and Z in the decomposition. If computeQZ==false, some time\n   * is saved by not computing matrices Q and Z.\n   *\n   * Example: \\include RealQZ_compute.cpp\n   * Output: \\include RealQZ_compute.out\n   *\n   * \\note The implementation is based on the algorithm in \"Matrix Computations\"\n   * by Gene H. Golub and Charles F. Van Loan, and a paper \"An algorithm for\n   * generalized eigenvalue problems\" by C.B.Moler and G.W.Stewart.\n   *\n   * \\sa class RealSchur, class ComplexSchur, class EigenSolver, class ComplexEigenSolver\n   */\n\n  template<typename _MatrixType> class RealQZ\n  {\n    public:\n      typedef _MatrixType MatrixType;\n      enum {\n        RowsAtCompileTime = MatrixType::RowsAtCompileTime,\n        ColsAtCompileTime = MatrixType::ColsAtCompileTime,\n        Options = MatrixType::Options,\n        MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,\n        MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime\n      };\n      typedef typename MatrixType::Scalar Scalar;\n      typedef std::complex<typename NumTraits<Scalar>::Real> ComplexScalar;\n      typedef typename MatrixType::Index Index;\n\n      typedef Matrix<ComplexScalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> EigenvalueType;\n      typedef Matrix<Scalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> ColumnVectorType;\n\n      /** \\brief Default constructor.\n       *\n       * \\param [in] size  Positive integer, size of the matrix whose QZ decomposition will be computed.\n       *\n       * The default constructor is useful in cases in which the user intends to\n       * perform decompositions via compute().  The \\p size parameter is only\n       * used as a hint. It is not an error to give a wrong \\p size, but it may\n       * impair performance.\n       *\n       * \\sa compute() for an example.\n       */\n      RealQZ(Index size = RowsAtCompileTime==Dynamic ? 1 : RowsAtCompileTime) : \n        m_S(size, size),\n        m_T(size, size),\n        m_Q(size, size),\n        m_Z(size, size),\n        m_workspace(size*2),\n        m_maxIters(400),\n        m_isInitialized(false)\n        { }\n\n      /** \\brief Constructor; computes real QZ decomposition of given matrices\n       * \n       * \\param[in]  A          Matrix A.\n       * \\param[in]  B          Matrix B.\n       * \\param[in]  computeQZ  If false, A and Z are not computed.\n       *\n       * This constructor calls compute() to compute the QZ decomposition.\n       */\n      RealQZ(const MatrixType& A, const MatrixType& B, bool computeQZ = true) :\n        m_S(A.rows(),A.cols()),\n        m_T(A.rows(),A.cols()),\n        m_Q(A.rows(),A.cols()),\n        m_Z(A.rows(),A.cols()),\n        m_workspace(A.rows()*2),\n        m_maxIters(400),\n        m_isInitialized(false) {\n          compute(A, B, computeQZ);\n        }\n\n      /** \\brief Returns matrix Q in the QZ decomposition. \n       *\n       * \\returns A const reference to the matrix Q.\n       */\n      const MatrixType& matrixQ() const {\n        eigen_assert(m_isInitialized && \"RealQZ is not initialized.\");\n        eigen_assert(m_computeQZ && \"The matrices Q and Z have not been computed during the QZ decomposition.\");\n        return m_Q;\n      }\n\n      /** \\brief Returns matrix Z in the QZ decomposition. \n       *\n       * \\returns A const reference to the matrix Z.\n       */\n      const MatrixType& matrixZ() const {\n        eigen_assert(m_isInitialized && \"RealQZ is not initialized.\");\n        eigen_assert(m_computeQZ && \"The matrices Q and Z have not been computed during the QZ decomposition.\");\n        return m_Z;\n      }\n\n      /** \\brief Returns matrix S in the QZ decomposition. \n       *\n       * \\returns A const reference to the matrix S.\n       */\n      const MatrixType& matrixS() const {\n        eigen_assert(m_isInitialized && \"RealQZ is not initialized.\");\n        return m_S;\n      }\n\n      /** \\brief Returns matrix S in the QZ decomposition. \n       *\n       * \\returns A const reference to the matrix S.\n       */\n      const MatrixType& matrixT() const {\n        eigen_assert(m_isInitialized && \"RealQZ is not initialized.\");\n        return m_T;\n      }\n\n      /** \\brief Computes QZ decomposition of given matrix. \n       * \n       * \\param[in]  A          Matrix A.\n       * \\param[in]  B          Matrix B.\n       * \\param[in]  computeQZ  If false, A and Z are not computed.\n       * \\returns    Reference to \\c *this\n       */\n      RealQZ& compute(const MatrixType& A, const MatrixType& B, bool computeQZ = true);\n\n      /** \\brief Reports whether previous computation was successful.\n       *\n       * \\returns \\c Success if computation was succesful, \\c NoConvergence otherwise.\n       */\n      ComputationInfo info() const\n      {\n        eigen_assert(m_isInitialized && \"RealQZ is not initialized.\");\n        return m_info;\n      }\n\n      /** \\brief Returns number of performed QR-like iterations.\n      */\n      Index iterations() const\n      {\n        eigen_assert(m_isInitialized && \"RealQZ is not initialized.\");\n        return m_global_iter;\n      }\n\n      /** Sets the maximal number of iterations allowed to converge to one eigenvalue\n       * or decouple the problem.\n      */\n      RealQZ& setMaxIterations(Index maxIters)\n      {\n        m_maxIters = maxIters;\n        return *this;\n      }\n\n    private:\n\n      MatrixType m_S, m_T, m_Q, m_Z;\n      Matrix<Scalar,Dynamic,1> m_workspace;\n      ComputationInfo m_info;\n      Index m_maxIters;\n      bool m_isInitialized;\n      bool m_computeQZ;\n      Scalar m_normOfT, m_normOfS;\n      Index m_global_iter;\n\n      typedef Matrix<Scalar,3,1> Vector3s;\n      typedef Matrix<Scalar,2,1> Vector2s;\n      typedef Matrix<Scalar,2,2> Matrix2s;\n      typedef JacobiRotation<Scalar> JRs;\n\n      void hessenbergTriangular();\n      void computeNorms();\n      Index findSmallSubdiagEntry(Index iu);\n      Index findSmallDiagEntry(Index f, Index l);\n      void splitOffTwoRows(Index i);\n      void pushDownZero(Index z, Index f, Index l);\n      void step(Index f, Index l, Index iter);\n\n  }; // RealQZ\n\n  /** \\internal Reduces S and T to upper Hessenberg - triangular form */\n  template<typename MatrixType>\n    void RealQZ<MatrixType>::hessenbergTriangular()\n    {\n\n      const Index dim = m_S.cols();\n\n      // perform QR decomposition of T, overwrite T with R, save Q\n      HouseholderQR<MatrixType> qrT(m_T);\n      m_T = qrT.matrixQR();\n      m_T.template triangularView<StrictlyLower>().setZero();\n      m_Q = qrT.householderQ();\n      // overwrite S with Q* S\n      m_S.applyOnTheLeft(m_Q.adjoint());\n      // init Z as Identity\n      if (m_computeQZ)\n        m_Z = MatrixType::Identity(dim,dim);\n      // reduce S to upper Hessenberg with Givens rotations\n      for (Index j=0; j<=dim-3; j++) {\n        for (Index i=dim-1; i>=j+2; i--) {\n          JRs G;\n          // kill S(i,j)\n          if(m_S.coeff(i,j) != 0)\n          {\n            G.makeGivens(m_S.coeff(i-1,j), m_S.coeff(i,j), &m_S.coeffRef(i-1, j));\n            m_S.coeffRef(i,j) = Scalar(0.0);\n            m_S.rightCols(dim-j-1).applyOnTheLeft(i-1,i,G.adjoint());\n            m_T.rightCols(dim-i+1).applyOnTheLeft(i-1,i,G.adjoint());\n            // update Q\n            if (m_computeQZ)\n              m_Q.applyOnTheRight(i-1,i,G);\n          }\n          // kill T(i,i-1)\n          if(m_T.coeff(i,i-1)!=Scalar(0))\n          {\n            G.makeGivens(m_T.coeff(i,i), m_T.coeff(i,i-1), &m_T.coeffRef(i,i));\n            m_T.coeffRef(i,i-1) = Scalar(0.0);\n            m_S.applyOnTheRight(i,i-1,G);\n            m_T.topRows(i).applyOnTheRight(i,i-1,G);\n            // update Z\n            if (m_computeQZ)\n              m_Z.applyOnTheLeft(i,i-1,G.adjoint());\n          }\n        }\n      }\n    }\n\n  /** \\internal Computes vector L1 norms of S and T when in Hessenberg-Triangular form already */\n  template<typename MatrixType>\n    inline void RealQZ<MatrixType>::computeNorms()\n    {\n      const Index size = m_S.cols();\n      m_normOfS = Scalar(0.0);\n      m_normOfT = Scalar(0.0);\n      for (Index j = 0; j < size; ++j)\n      {\n        m_normOfS += m_S.col(j).segment(0, (std::min)(size,j+2)).cwiseAbs().sum();\n        m_normOfT += m_T.row(j).segment(j, size - j).cwiseAbs().sum();\n      }\n    }\n\n\n  /** \\internal Look for single small sub-diagonal element S(res, res-1) and return res (or 0) */\n  template<typename MatrixType>\n    inline typename MatrixType::Index RealQZ<MatrixType>::findSmallSubdiagEntry(Index iu)\n    {\n      using std::abs;\n      Index res = iu;\n      while (res > 0)\n      {\n        Scalar s = abs(m_S.coeff(res-1,res-1)) + abs(m_S.coeff(res,res));\n        if (s == Scalar(0.0))\n          s = m_normOfS;\n        if (abs(m_S.coeff(res,res-1)) < NumTraits<Scalar>::epsilon() * s)\n          break;\n        res--;\n      }\n      return res;\n    }\n\n  /** \\internal Look for single small diagonal element T(res, res) for res between f and l, and return res (or f-1)  */\n  template<typename MatrixType>\n    inline typename MatrixType::Index RealQZ<MatrixType>::findSmallDiagEntry(Index f, Index l)\n    {\n      using std::abs;\n      Index res = l;\n      while (res >= f) {\n        if (abs(m_T.coeff(res,res)) <= NumTraits<Scalar>::epsilon() * m_normOfT)\n          break;\n        res--;\n      }\n      return res;\n    }\n\n  /** \\internal decouple 2x2 diagonal block in rows i, i+1 if eigenvalues are real */\n  template<typename MatrixType>\n    inline void RealQZ<MatrixType>::splitOffTwoRows(Index i)\n    {\n      using std::abs;\n      using std::sqrt;\n      const Index dim=m_S.cols();\n      if (abs(m_S.coeff(i+1,i))==Scalar(0))\n        return;\n      Index z = findSmallDiagEntry(i,i+1);\n      if (z==i-1)\n      {\n        // block of (S T^{-1})\n        Matrix2s STi = m_T.template block<2,2>(i,i).template triangularView<Upper>().\n          template solve<OnTheRight>(m_S.template block<2,2>(i,i));\n        Scalar p = Scalar(0.5)*(STi(0,0)-STi(1,1));\n        Scalar q = p*p + STi(1,0)*STi(0,1);\n        if (q>=0) {\n          Scalar z = sqrt(q);\n          // one QR-like iteration for ABi - lambda I\n          // is enough - when we know exact eigenvalue in advance,\n          // convergence is immediate\n          JRs G;\n          if (p>=0)\n            G.makeGivens(p + z, STi(1,0));\n          else\n            G.makeGivens(p - z, STi(1,0));\n          m_S.rightCols(dim-i).applyOnTheLeft(i,i+1,G.adjoint());\n          m_T.rightCols(dim-i).applyOnTheLeft(i,i+1,G.adjoint());\n          // update Q\n          if (m_computeQZ)\n            m_Q.applyOnTheRight(i,i+1,G);\n\n          G.makeGivens(m_T.coeff(i+1,i+1), m_T.coeff(i+1,i));\n          m_S.topRows(i+2).applyOnTheRight(i+1,i,G);\n          m_T.topRows(i+2).applyOnTheRight(i+1,i,G);\n          // update Z\n          if (m_computeQZ)\n            m_Z.applyOnTheLeft(i+1,i,G.adjoint());\n\n          m_S.coeffRef(i+1,i) = Scalar(0.0);\n          m_T.coeffRef(i+1,i) = Scalar(0.0);\n        }\n      }\n      else\n      {\n        pushDownZero(z,i,i+1);\n      }\n    }\n\n  /** \\internal use zero in T(z,z) to zero S(l,l-1), working in block f..l */\n  template<typename MatrixType>\n    inline void RealQZ<MatrixType>::pushDownZero(Index z, Index f, Index l)\n    {\n      JRs G;\n      const Index dim = m_S.cols();\n      for (Index zz=z; zz<l; zz++)\n      {\n        // push 0 down\n        Index firstColS = zz>f ? (zz-1) : zz;\n        G.makeGivens(m_T.coeff(zz, zz+1), m_T.coeff(zz+1, zz+1));\n        m_S.rightCols(dim-firstColS).applyOnTheLeft(zz,zz+1,G.adjoint());\n        m_T.rightCols(dim-zz).applyOnTheLeft(zz,zz+1,G.adjoint());\n        m_T.coeffRef(zz+1,zz+1) = Scalar(0.0);\n        // update Q\n        if (m_computeQZ)\n          m_Q.applyOnTheRight(zz,zz+1,G);\n        // kill S(zz+1, zz-1)\n        if (zz>f)\n        {\n          G.makeGivens(m_S.coeff(zz+1, zz), m_S.coeff(zz+1,zz-1));\n          m_S.topRows(zz+2).applyOnTheRight(zz, zz-1,G);\n          m_T.topRows(zz+1).applyOnTheRight(zz, zz-1,G);\n          m_S.coeffRef(zz+1,zz-1) = Scalar(0.0);\n          // update Z\n          if (m_computeQZ)\n            m_Z.applyOnTheLeft(zz,zz-1,G.adjoint());\n        }\n      }\n      // finally kill S(l,l-1)\n      G.makeGivens(m_S.coeff(l,l), m_S.coeff(l,l-1));\n      m_S.applyOnTheRight(l,l-1,G);\n      m_T.applyOnTheRight(l,l-1,G);\n      m_S.coeffRef(l,l-1)=Scalar(0.0);\n      // update Z\n      if (m_computeQZ)\n        m_Z.applyOnTheLeft(l,l-1,G.adjoint());\n    }\n\n  /** \\internal QR-like iterative step for block f..l */\n  template<typename MatrixType>\n    inline void RealQZ<MatrixType>::step(Index f, Index l, Index iter)\n    {\n      using std::abs;\n      const Index dim = m_S.cols();\n\n      // x, y, z\n      Scalar x, y, z;\n      if (iter==10)\n      {\n        // Wilkinson ad hoc shift\n        const Scalar\n          a11=m_S.coeff(f+0,f+0), a12=m_S.coeff(f+0,f+1),\n          a21=m_S.coeff(f+1,f+0), a22=m_S.coeff(f+1,f+1), a32=m_S.coeff(f+2,f+1),\n          b12=m_T.coeff(f+0,f+1),\n          b11i=Scalar(1.0)/m_T.coeff(f+0,f+0),\n          b22i=Scalar(1.0)/m_T.coeff(f+1,f+1),\n          a87=m_S.coeff(l-1,l-2),\n          a98=m_S.coeff(l-0,l-1),\n          b77i=Scalar(1.0)/m_T.coeff(l-2,l-2),\n          b88i=Scalar(1.0)/m_T.coeff(l-1,l-1);\n        Scalar ss = abs(a87*b77i) + abs(a98*b88i),\n               lpl = Scalar(1.5)*ss,\n               ll = ss*ss;\n        x = ll + a11*a11*b11i*b11i - lpl*a11*b11i + a12*a21*b11i*b22i\n          - a11*a21*b12*b11i*b11i*b22i;\n        y = a11*a21*b11i*b11i - lpl*a21*b11i + a21*a22*b11i*b22i \n          - a21*a21*b12*b11i*b11i*b22i;\n        z = a21*a32*b11i*b22i;\n      }\n      else if (iter==16)\n      {\n        // another exceptional shift\n        x = m_S.coeff(f,f)/m_T.coeff(f,f)-m_S.coeff(l,l)/m_T.coeff(l,l) + m_S.coeff(l,l-1)*m_T.coeff(l-1,l) /\n          (m_T.coeff(l-1,l-1)*m_T.coeff(l,l));\n        y = m_S.coeff(f+1,f)/m_T.coeff(f,f);\n        z = 0;\n      }\n      else if (iter>23 && !(iter%8))\n      {\n        // extremely exceptional shift\n        x = internal::random<Scalar>(-1.0,1.0);\n        y = internal::random<Scalar>(-1.0,1.0);\n        z = internal::random<Scalar>(-1.0,1.0);\n      }\n      else\n      {\n        // Compute the shifts: (x,y,z,0...) = (AB^-1 - l1 I) (AB^-1 - l2 I) e1\n        // where l1 and l2 are the eigenvalues of the 2x2 matrix C = U V^-1 where\n        // U and V are 2x2 bottom right sub matrices of A and B. Thus:\n        //  = AB^-1AB^-1 + l1 l2 I - (l1+l2)(AB^-1)\n        //  = AB^-1AB^-1 + det(M) - tr(M)(AB^-1)\n        // Since we are only interested in having x, y, z with a correct ratio, we have:\n        const Scalar\n          a11 = m_S.coeff(f,f),     a12 = m_S.coeff(f,f+1),\n          a21 = m_S.coeff(f+1,f),   a22 = m_S.coeff(f+1,f+1),\n                                    a32 = m_S.coeff(f+2,f+1),\n\n          a88 = m_S.coeff(l-1,l-1), a89 = m_S.coeff(l-1,l),\n          a98 = m_S.coeff(l,l-1),   a99 = m_S.coeff(l,l),\n\n          b11 = m_T.coeff(f,f),     b12 = m_T.coeff(f,f+1),\n                                    b22 = m_T.coeff(f+1,f+1),\n\n          b88 = m_T.coeff(l-1,l-1), b89 = m_T.coeff(l-1,l),\n                                    b99 = m_T.coeff(l,l);\n\n        x = ( (a88/b88 - a11/b11)*(a99/b99 - a11/b11) - (a89/b99)*(a98/b88) + (a98/b88)*(b89/b99)*(a11/b11) ) * (b11/a21)\n          + a12/b22 - (a11/b11)*(b12/b22);\n        y = (a22/b22-a11/b11) - (a21/b11)*(b12/b22) - (a88/b88-a11/b11) - (a99/b99-a11/b11) + (a98/b88)*(b89/b99);\n        z = a32/b22;\n      }\n\n      JRs G;\n\n      for (Index k=f; k<=l-2; k++)\n      {\n        // variables for Householder reflections\n        Vector2s essential2;\n        Scalar tau, beta;\n\n        Vector3s hr(x,y,z);\n\n        // Q_k to annihilate S(k+1,k-1) and S(k+2,k-1)\n        hr.makeHouseholderInPlace(tau, beta);\n        essential2 = hr.template bottomRows<2>();\n        Index fc=(std::max)(k-1,Index(0));  // first col to update\n        m_S.template middleRows<3>(k).rightCols(dim-fc).applyHouseholderOnTheLeft(essential2, tau, m_workspace.data());\n        m_T.template middleRows<3>(k).rightCols(dim-fc).applyHouseholderOnTheLeft(essential2, tau, m_workspace.data());\n        if (m_computeQZ)\n          m_Q.template middleCols<3>(k).applyHouseholderOnTheRight(essential2, tau, m_workspace.data());\n        if (k>f)\n          m_S.coeffRef(k+2,k-1) = m_S.coeffRef(k+1,k-1) = Scalar(0.0);\n\n        // Z_{k1} to annihilate T(k+2,k+1) and T(k+2,k)\n        hr << m_T.coeff(k+2,k+2),m_T.coeff(k+2,k),m_T.coeff(k+2,k+1);\n        hr.makeHouseholderInPlace(tau, beta);\n        essential2 = hr.template bottomRows<2>();\n        {\n          Index lr = (std::min)(k+4,dim); // last row to update\n          Map<Matrix<Scalar,Dynamic,1> > tmp(m_workspace.data(),lr);\n          // S\n          tmp = m_S.template middleCols<2>(k).topRows(lr) * essential2;\n          tmp += m_S.col(k+2).head(lr);\n          m_S.col(k+2).head(lr) -= tau*tmp;\n          m_S.template middleCols<2>(k).topRows(lr) -= (tau*tmp) * essential2.adjoint();\n          // T\n          tmp = m_T.template middleCols<2>(k).topRows(lr) * essential2;\n          tmp += m_T.col(k+2).head(lr);\n          m_T.col(k+2).head(lr) -= tau*tmp;\n          m_T.template middleCols<2>(k).topRows(lr) -= (tau*tmp) * essential2.adjoint();\n        }\n        if (m_computeQZ)\n        {\n          // Z\n          Map<Matrix<Scalar,1,Dynamic> > tmp(m_workspace.data(),dim);\n          tmp = essential2.adjoint()*(m_Z.template middleRows<2>(k));\n          tmp += m_Z.row(k+2);\n          m_Z.row(k+2) -= tau*tmp;\n          m_Z.template middleRows<2>(k) -= essential2 * (tau*tmp);\n        }\n        m_T.coeffRef(k+2,k) = m_T.coeffRef(k+2,k+1) = Scalar(0.0);\n\n        // Z_{k2} to annihilate T(k+1,k)\n        G.makeGivens(m_T.coeff(k+1,k+1), m_T.coeff(k+1,k));\n        m_S.applyOnTheRight(k+1,k,G);\n        m_T.applyOnTheRight(k+1,k,G);\n        // update Z\n        if (m_computeQZ)\n          m_Z.applyOnTheLeft(k+1,k,G.adjoint());\n        m_T.coeffRef(k+1,k) = Scalar(0.0);\n\n        // update x,y,z\n        x = m_S.coeff(k+1,k);\n        y = m_S.coeff(k+2,k);\n        if (k < l-2)\n          z = m_S.coeff(k+3,k);\n      } // loop over k\n\n      // Q_{n-1} to annihilate y = S(l,l-2)\n      G.makeGivens(x,y);\n      m_S.applyOnTheLeft(l-1,l,G.adjoint());\n      m_T.applyOnTheLeft(l-1,l,G.adjoint());\n      if (m_computeQZ)\n        m_Q.applyOnTheRight(l-1,l,G);\n      m_S.coeffRef(l,l-2) = Scalar(0.0);\n\n      // Z_{n-1} to annihilate T(l,l-1)\n      G.makeGivens(m_T.coeff(l,l),m_T.coeff(l,l-1));\n      m_S.applyOnTheRight(l,l-1,G);\n      m_T.applyOnTheRight(l,l-1,G);\n      if (m_computeQZ)\n        m_Z.applyOnTheLeft(l,l-1,G.adjoint());\n      m_T.coeffRef(l,l-1) = Scalar(0.0);\n    }\n\n\n  template<typename MatrixType>\n    RealQZ<MatrixType>& RealQZ<MatrixType>::compute(const MatrixType& A_in, const MatrixType& B_in, bool computeQZ)\n    {\n\n      const Index dim = A_in.cols();\n\n      eigen_assert (A_in.rows()==dim && A_in.cols()==dim \n          && B_in.rows()==dim && B_in.cols()==dim \n          && \"Need square matrices of the same dimension\");\n\n      m_isInitialized = true;\n      m_computeQZ = computeQZ;\n      m_S = A_in; m_T = B_in;\n      m_workspace.resize(dim*2);\n      m_global_iter = 0;\n\n      // entrance point: hessenberg triangular decomposition\n      hessenbergTriangular();\n      // compute L1 vector norms of T, S into m_normOfS, m_normOfT\n      computeNorms();\n\n      Index l = dim-1, \n            f, \n            local_iter = 0;\n\n      while (l>0 && local_iter<m_maxIters)\n      {\n        f = findSmallSubdiagEntry(l);\n        // now rows and columns f..l (including) decouple from the rest of the problem\n        if (f>0) m_S.coeffRef(f,f-1) = Scalar(0.0);\n        if (f == l) // One root found\n        {\n          l--;\n          local_iter = 0;\n        }\n        else if (f == l-1) // Two roots found\n        {\n          splitOffTwoRows(f);\n          l -= 2;\n          local_iter = 0;\n        }\n        else // No convergence yet\n        {\n          // if there's zero on diagonal of T, we can isolate an eigenvalue with Givens rotations\n          Index z = findSmallDiagEntry(f,l);\n          if (z>=f)\n          {\n            // zero found\n            pushDownZero(z,f,l);\n          }\n          else\n          {\n            // We are sure now that S.block(f,f, l-f+1,l-f+1) is underuced upper-Hessenberg \n            // and T.block(f,f, l-f+1,l-f+1) is invertible uper-triangular, which allows to\n            // apply a QR-like iteration to rows and columns f..l.\n            step(f,l, local_iter);\n            local_iter++;\n            m_global_iter++;\n          }\n        }\n      }\n      // check if we converged before reaching iterations limit\n      m_info = (local_iter<m_maxIters) ? Success : NoConvergence;\n      return *this;\n    } // end compute\n\n} // end namespace Eigen\n\n#endif //EIGEN_REAL_QZ\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigenvalues/RealSchur.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2010,2012 Jitse Niesen <jitse@maths.leeds.ac.uk>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_REAL_SCHUR_H\n#define EIGEN_REAL_SCHUR_H\n\n#include \"./HessenbergDecomposition.h\"\n\nnamespace Eigen { \n\n/** \\eigenvalues_module \\ingroup Eigenvalues_Module\n  *\n  *\n  * \\class RealSchur\n  *\n  * \\brief Performs a real Schur decomposition of a square matrix\n  *\n  * \\tparam _MatrixType the type of the matrix of which we are computing the\n  * real Schur decomposition; this is expected to be an instantiation of the\n  * Matrix class template.\n  *\n  * Given a real square matrix A, this class computes the real Schur\n  * decomposition: \\f$ A = U T U^T \\f$ where U is a real orthogonal matrix and\n  * T is a real quasi-triangular matrix. An orthogonal matrix is a matrix whose\n  * inverse is equal to its transpose, \\f$ U^{-1} = U^T \\f$. A quasi-triangular\n  * matrix is a block-triangular matrix whose diagonal consists of 1-by-1\n  * blocks and 2-by-2 blocks with complex eigenvalues. The eigenvalues of the\n  * blocks on the diagonal of T are the same as the eigenvalues of the matrix\n  * A, and thus the real Schur decomposition is used in EigenSolver to compute\n  * the eigendecomposition of a matrix.\n  *\n  * Call the function compute() to compute the real Schur decomposition of a\n  * given matrix. Alternatively, you can use the RealSchur(const MatrixType&, bool)\n  * constructor which computes the real Schur decomposition at construction\n  * time. Once the decomposition is computed, you can use the matrixU() and\n  * matrixT() functions to retrieve the matrices U and T in the decomposition.\n  *\n  * The documentation of RealSchur(const MatrixType&, bool) contains an example\n  * of the typical use of this class.\n  *\n  * \\note The implementation is adapted from\n  * <a href=\"http://math.nist.gov/javanumerics/jama/\">JAMA</a> (public domain).\n  * Their code is based on EISPACK.\n  *\n  * \\sa class ComplexSchur, class EigenSolver, class ComplexEigenSolver\n  */\ntemplate<typename _MatrixType> class RealSchur\n{\n  public:\n    typedef _MatrixType MatrixType;\n    enum {\n      RowsAtCompileTime = MatrixType::RowsAtCompileTime,\n      ColsAtCompileTime = MatrixType::ColsAtCompileTime,\n      Options = MatrixType::Options,\n      MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,\n      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime\n    };\n    typedef typename MatrixType::Scalar Scalar;\n    typedef std::complex<typename NumTraits<Scalar>::Real> ComplexScalar;\n    typedef typename MatrixType::Index Index;\n\n    typedef Matrix<ComplexScalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> EigenvalueType;\n    typedef Matrix<Scalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> ColumnVectorType;\n\n    /** \\brief Default constructor.\n      *\n      * \\param [in] size  Positive integer, size of the matrix whose Schur decomposition will be computed.\n      *\n      * The default constructor is useful in cases in which the user intends to\n      * perform decompositions via compute().  The \\p size parameter is only\n      * used as a hint. It is not an error to give a wrong \\p size, but it may\n      * impair performance.\n      *\n      * \\sa compute() for an example.\n      */\n    RealSchur(Index size = RowsAtCompileTime==Dynamic ? 1 : RowsAtCompileTime)\n            : m_matT(size, size),\n              m_matU(size, size),\n              m_workspaceVector(size),\n              m_hess(size),\n              m_isInitialized(false),\n              m_matUisUptodate(false),\n              m_maxIters(-1)\n    { }\n\n    /** \\brief Constructor; computes real Schur decomposition of given matrix. \n      * \n      * \\param[in]  matrix    Square matrix whose Schur decomposition is to be computed.\n      * \\param[in]  computeU  If true, both T and U are computed; if false, only T is computed.\n      *\n      * This constructor calls compute() to compute the Schur decomposition.\n      *\n      * Example: \\include RealSchur_RealSchur_MatrixType.cpp\n      * Output: \\verbinclude RealSchur_RealSchur_MatrixType.out\n      */\n    RealSchur(const MatrixType& matrix, bool computeU = true)\n            : m_matT(matrix.rows(),matrix.cols()),\n              m_matU(matrix.rows(),matrix.cols()),\n              m_workspaceVector(matrix.rows()),\n              m_hess(matrix.rows()),\n              m_isInitialized(false),\n              m_matUisUptodate(false),\n              m_maxIters(-1)\n    {\n      compute(matrix, computeU);\n    }\n\n    /** \\brief Returns the orthogonal matrix in the Schur decomposition. \n      *\n      * \\returns A const reference to the matrix U.\n      *\n      * \\pre Either the constructor RealSchur(const MatrixType&, bool) or the\n      * member function compute(const MatrixType&, bool) has been called before\n      * to compute the Schur decomposition of a matrix, and \\p computeU was set\n      * to true (the default value).\n      *\n      * \\sa RealSchur(const MatrixType&, bool) for an example\n      */\n    const MatrixType& matrixU() const\n    {\n      eigen_assert(m_isInitialized && \"RealSchur is not initialized.\");\n      eigen_assert(m_matUisUptodate && \"The matrix U has not been computed during the RealSchur decomposition.\");\n      return m_matU;\n    }\n\n    /** \\brief Returns the quasi-triangular matrix in the Schur decomposition. \n      *\n      * \\returns A const reference to the matrix T.\n      *\n      * \\pre Either the constructor RealSchur(const MatrixType&, bool) or the\n      * member function compute(const MatrixType&, bool) has been called before\n      * to compute the Schur decomposition of a matrix.\n      *\n      * \\sa RealSchur(const MatrixType&, bool) for an example\n      */\n    const MatrixType& matrixT() const\n    {\n      eigen_assert(m_isInitialized && \"RealSchur is not initialized.\");\n      return m_matT;\n    }\n  \n    /** \\brief Computes Schur decomposition of given matrix. \n      * \n      * \\param[in]  matrix    Square matrix whose Schur decomposition is to be computed.\n      * \\param[in]  computeU  If true, both T and U are computed; if false, only T is computed.\n      * \\returns    Reference to \\c *this\n      *\n      * The Schur decomposition is computed by first reducing the matrix to\n      * Hessenberg form using the class HessenbergDecomposition. The Hessenberg\n      * matrix is then reduced to triangular form by performing Francis QR\n      * iterations with implicit double shift. The cost of computing the Schur\n      * decomposition depends on the number of iterations; as a rough guide, it\n      * may be taken to be \\f$25n^3\\f$ flops if \\a computeU is true and\n      * \\f$10n^3\\f$ flops if \\a computeU is false.\n      *\n      * Example: \\include RealSchur_compute.cpp\n      * Output: \\verbinclude RealSchur_compute.out\n      *\n      * \\sa compute(const MatrixType&, bool, Index)\n      */\n    RealSchur& compute(const MatrixType& matrix, bool computeU = true);\n\n    /** \\brief Computes Schur decomposition of a Hessenberg matrix H = Z T Z^T\n     *  \\param[in] matrixH Matrix in Hessenberg form H\n     *  \\param[in] matrixQ orthogonal matrix Q that transform a matrix A to H : A = Q H Q^T\n     *  \\param computeU Computes the matriX U of the Schur vectors\n     * \\return Reference to \\c *this\n     * \n     *  This routine assumes that the matrix is already reduced in Hessenberg form matrixH\n     *  using either the class HessenbergDecomposition or another mean. \n     *  It computes the upper quasi-triangular matrix T of the Schur decomposition of H\n     *  When computeU is true, this routine computes the matrix U such that \n     *  A = U T U^T =  (QZ) T (QZ)^T = Q H Q^T where A is the initial matrix\n     * \n     * NOTE Q is referenced if computeU is true; so, if the initial orthogonal matrix\n     * is not available, the user should give an identity matrix (Q.setIdentity())\n     * \n     * \\sa compute(const MatrixType&, bool)\n     */\n    template<typename HessMatrixType, typename OrthMatrixType>\n    RealSchur& computeFromHessenberg(const HessMatrixType& matrixH, const OrthMatrixType& matrixQ,  bool computeU);\n    /** \\brief Reports whether previous computation was successful.\n      *\n      * \\returns \\c Success if computation was succesful, \\c NoConvergence otherwise.\n      */\n    ComputationInfo info() const\n    {\n      eigen_assert(m_isInitialized && \"RealSchur is not initialized.\");\n      return m_info;\n    }\n\n    /** \\brief Sets the maximum number of iterations allowed. \n      *\n      * If not specified by the user, the maximum number of iterations is m_maxIterationsPerRow times the size\n      * of the matrix.\n      */\n    RealSchur& setMaxIterations(Index maxIters)\n    {\n      m_maxIters = maxIters;\n      return *this;\n    }\n\n    /** \\brief Returns the maximum number of iterations. */\n    Index getMaxIterations()\n    {\n      return m_maxIters;\n    }\n\n    /** \\brief Maximum number of iterations per row.\n      *\n      * If not otherwise specified, the maximum number of iterations is this number times the size of the\n      * matrix. It is currently set to 40.\n      */\n    static const int m_maxIterationsPerRow = 40;\n\n  private:\n    \n    MatrixType m_matT;\n    MatrixType m_matU;\n    ColumnVectorType m_workspaceVector;\n    HessenbergDecomposition<MatrixType> m_hess;\n    ComputationInfo m_info;\n    bool m_isInitialized;\n    bool m_matUisUptodate;\n    Index m_maxIters;\n\n    typedef Matrix<Scalar,3,1> Vector3s;\n\n    Scalar computeNormOfT();\n    Index findSmallSubdiagEntry(Index iu);\n    void splitOffTwoRows(Index iu, bool computeU, const Scalar& exshift);\n    void computeShift(Index iu, Index iter, Scalar& exshift, Vector3s& shiftInfo);\n    void initFrancisQRStep(Index il, Index iu, const Vector3s& shiftInfo, Index& im, Vector3s& firstHouseholderVector);\n    void performFrancisQRStep(Index il, Index im, Index iu, bool computeU, const Vector3s& firstHouseholderVector, Scalar* workspace);\n};\n\n\ntemplate<typename MatrixType>\nRealSchur<MatrixType>& RealSchur<MatrixType>::compute(const MatrixType& matrix, bool computeU)\n{\n  eigen_assert(matrix.cols() == matrix.rows());\n  Index maxIters = m_maxIters;\n  if (maxIters == -1)\n    maxIters = m_maxIterationsPerRow * matrix.rows();\n\n  // Step 1. Reduce to Hessenberg form\n  m_hess.compute(matrix);\n\n  // Step 2. Reduce to real Schur form  \n  computeFromHessenberg(m_hess.matrixH(), m_hess.matrixQ(), computeU);\n  \n  return *this;\n}\ntemplate<typename MatrixType>\ntemplate<typename HessMatrixType, typename OrthMatrixType>\nRealSchur<MatrixType>& RealSchur<MatrixType>::computeFromHessenberg(const HessMatrixType& matrixH, const OrthMatrixType& matrixQ,  bool computeU)\n{  \n  m_matT = matrixH; \n  if(computeU)\n    m_matU = matrixQ;\n  \n  Index maxIters = m_maxIters;\n  if (maxIters == -1)\n    maxIters = m_maxIterationsPerRow * matrixH.rows();\n  m_workspaceVector.resize(m_matT.cols());\n  Scalar* workspace = &m_workspaceVector.coeffRef(0);\n\n  // The matrix m_matT is divided in three parts. \n  // Rows 0,...,il-1 are decoupled from the rest because m_matT(il,il-1) is zero. \n  // Rows il,...,iu is the part we are working on (the active window).\n  // Rows iu+1,...,end are already brought in triangular form.\n  Index iu = m_matT.cols() - 1;\n  Index iter = 0;      // iteration count for current eigenvalue\n  Index totalIter = 0; // iteration count for whole matrix\n  Scalar exshift(0);   // sum of exceptional shifts\n  Scalar norm = computeNormOfT();\n\n  if(norm!=0)\n  {\n    while (iu >= 0)\n    {\n      Index il = findSmallSubdiagEntry(iu);\n\n      // Check for convergence\n      if (il == iu) // One root found\n      {\n        m_matT.coeffRef(iu,iu) = m_matT.coeff(iu,iu) + exshift;\n        if (iu > 0)\n          m_matT.coeffRef(iu, iu-1) = Scalar(0);\n        iu--;\n        iter = 0;\n      }\n      else if (il == iu-1) // Two roots found\n      {\n        splitOffTwoRows(iu, computeU, exshift);\n        iu -= 2;\n        iter = 0;\n      }\n      else // No convergence yet\n      {\n        // The firstHouseholderVector vector has to be initialized to something to get rid of a silly GCC warning (-O1 -Wall -DNDEBUG )\n        Vector3s firstHouseholderVector(0,0,0), shiftInfo;\n        computeShift(iu, iter, exshift, shiftInfo);\n        iter = iter + 1;\n        totalIter = totalIter + 1;\n        if (totalIter > maxIters) break;\n        Index im;\n        initFrancisQRStep(il, iu, shiftInfo, im, firstHouseholderVector);\n        performFrancisQRStep(il, im, iu, computeU, firstHouseholderVector, workspace);\n      }\n    }\n  }\n  if(totalIter <= maxIters)\n    m_info = Success;\n  else\n    m_info = NoConvergence;\n\n  m_isInitialized = true;\n  m_matUisUptodate = computeU;\n  return *this;\n}\n\n/** \\internal Computes and returns vector L1 norm of T */\ntemplate<typename MatrixType>\ninline typename MatrixType::Scalar RealSchur<MatrixType>::computeNormOfT()\n{\n  const Index size = m_matT.cols();\n  // FIXME to be efficient the following would requires a triangular reduxion code\n  // Scalar norm = m_matT.upper().cwiseAbs().sum() \n  //               + m_matT.bottomLeftCorner(size-1,size-1).diagonal().cwiseAbs().sum();\n  Scalar norm(0);\n  for (Index j = 0; j < size; ++j)\n    norm += m_matT.col(j).segment(0, (std::min)(size,j+2)).cwiseAbs().sum();\n  return norm;\n}\n\n/** \\internal Look for single small sub-diagonal element and returns its index */\ntemplate<typename MatrixType>\ninline typename MatrixType::Index RealSchur<MatrixType>::findSmallSubdiagEntry(Index iu)\n{\n  using std::abs;\n  Index res = iu;\n  while (res > 0)\n  {\n    Scalar s = abs(m_matT.coeff(res-1,res-1)) + abs(m_matT.coeff(res,res));\n    if (abs(m_matT.coeff(res,res-1)) <= NumTraits<Scalar>::epsilon() * s)\n      break;\n    res--;\n  }\n  return res;\n}\n\n/** \\internal Update T given that rows iu-1 and iu decouple from the rest. */\ntemplate<typename MatrixType>\ninline void RealSchur<MatrixType>::splitOffTwoRows(Index iu, bool computeU, const Scalar& exshift)\n{\n  using std::sqrt;\n  using std::abs;\n  const Index size = m_matT.cols();\n\n  // The eigenvalues of the 2x2 matrix [a b; c d] are \n  // trace +/- sqrt(discr/4) where discr = tr^2 - 4*det, tr = a + d, det = ad - bc\n  Scalar p = Scalar(0.5) * (m_matT.coeff(iu-1,iu-1) - m_matT.coeff(iu,iu));\n  Scalar q = p * p + m_matT.coeff(iu,iu-1) * m_matT.coeff(iu-1,iu);   // q = tr^2 / 4 - det = discr/4\n  m_matT.coeffRef(iu,iu) += exshift;\n  m_matT.coeffRef(iu-1,iu-1) += exshift;\n\n  if (q >= Scalar(0)) // Two real eigenvalues\n  {\n    Scalar z = sqrt(abs(q));\n    JacobiRotation<Scalar> rot;\n    if (p >= Scalar(0))\n      rot.makeGivens(p + z, m_matT.coeff(iu, iu-1));\n    else\n      rot.makeGivens(p - z, m_matT.coeff(iu, iu-1));\n\n    m_matT.rightCols(size-iu+1).applyOnTheLeft(iu-1, iu, rot.adjoint());\n    m_matT.topRows(iu+1).applyOnTheRight(iu-1, iu, rot);\n    m_matT.coeffRef(iu, iu-1) = Scalar(0); \n    if (computeU)\n      m_matU.applyOnTheRight(iu-1, iu, rot);\n  }\n\n  if (iu > 1) \n    m_matT.coeffRef(iu-1, iu-2) = Scalar(0);\n}\n\n/** \\internal Form shift in shiftInfo, and update exshift if an exceptional shift is performed. */\ntemplate<typename MatrixType>\ninline void RealSchur<MatrixType>::computeShift(Index iu, Index iter, Scalar& exshift, Vector3s& shiftInfo)\n{\n  using std::sqrt;\n  using std::abs;\n  shiftInfo.coeffRef(0) = m_matT.coeff(iu,iu);\n  shiftInfo.coeffRef(1) = m_matT.coeff(iu-1,iu-1);\n  shiftInfo.coeffRef(2) = m_matT.coeff(iu,iu-1) * m_matT.coeff(iu-1,iu);\n\n  // Wilkinson's original ad hoc shift\n  if (iter == 10)\n  {\n    exshift += shiftInfo.coeff(0);\n    for (Index i = 0; i <= iu; ++i)\n      m_matT.coeffRef(i,i) -= shiftInfo.coeff(0);\n    Scalar s = abs(m_matT.coeff(iu,iu-1)) + abs(m_matT.coeff(iu-1,iu-2));\n    shiftInfo.coeffRef(0) = Scalar(0.75) * s;\n    shiftInfo.coeffRef(1) = Scalar(0.75) * s;\n    shiftInfo.coeffRef(2) = Scalar(-0.4375) * s * s;\n  }\n\n  // MATLAB's new ad hoc shift\n  if (iter == 30)\n  {\n    Scalar s = (shiftInfo.coeff(1) - shiftInfo.coeff(0)) / Scalar(2.0);\n    s = s * s + shiftInfo.coeff(2);\n    if (s > Scalar(0))\n    {\n      s = sqrt(s);\n      if (shiftInfo.coeff(1) < shiftInfo.coeff(0))\n        s = -s;\n      s = s + (shiftInfo.coeff(1) - shiftInfo.coeff(0)) / Scalar(2.0);\n      s = shiftInfo.coeff(0) - shiftInfo.coeff(2) / s;\n      exshift += s;\n      for (Index i = 0; i <= iu; ++i)\n        m_matT.coeffRef(i,i) -= s;\n      shiftInfo.setConstant(Scalar(0.964));\n    }\n  }\n}\n\n/** \\internal Compute index im at which Francis QR step starts and the first Householder vector. */\ntemplate<typename MatrixType>\ninline void RealSchur<MatrixType>::initFrancisQRStep(Index il, Index iu, const Vector3s& shiftInfo, Index& im, Vector3s& firstHouseholderVector)\n{\n  using std::abs;\n  Vector3s& v = firstHouseholderVector; // alias to save typing\n\n  for (im = iu-2; im >= il; --im)\n  {\n    const Scalar Tmm = m_matT.coeff(im,im);\n    const Scalar r = shiftInfo.coeff(0) - Tmm;\n    const Scalar s = shiftInfo.coeff(1) - Tmm;\n    v.coeffRef(0) = (r * s - shiftInfo.coeff(2)) / m_matT.coeff(im+1,im) + m_matT.coeff(im,im+1);\n    v.coeffRef(1) = m_matT.coeff(im+1,im+1) - Tmm - r - s;\n    v.coeffRef(2) = m_matT.coeff(im+2,im+1);\n    if (im == il) {\n      break;\n    }\n    const Scalar lhs = m_matT.coeff(im,im-1) * (abs(v.coeff(1)) + abs(v.coeff(2)));\n    const Scalar rhs = v.coeff(0) * (abs(m_matT.coeff(im-1,im-1)) + abs(Tmm) + abs(m_matT.coeff(im+1,im+1)));\n    if (abs(lhs) < NumTraits<Scalar>::epsilon() * rhs)\n      break;\n  }\n}\n\n/** \\internal Perform a Francis QR step involving rows il:iu and columns im:iu. */\ntemplate<typename MatrixType>\ninline void RealSchur<MatrixType>::performFrancisQRStep(Index il, Index im, Index iu, bool computeU, const Vector3s& firstHouseholderVector, Scalar* workspace)\n{\n  eigen_assert(im >= il);\n  eigen_assert(im <= iu-2);\n\n  const Index size = m_matT.cols();\n\n  for (Index k = im; k <= iu-2; ++k)\n  {\n    bool firstIteration = (k == im);\n\n    Vector3s v;\n    if (firstIteration)\n      v = firstHouseholderVector;\n    else\n      v = m_matT.template block<3,1>(k,k-1);\n\n    Scalar tau, beta;\n    Matrix<Scalar, 2, 1> ess;\n    v.makeHouseholder(ess, tau, beta);\n    \n    if (beta != Scalar(0)) // if v is not zero\n    {\n      if (firstIteration && k > il)\n        m_matT.coeffRef(k,k-1) = -m_matT.coeff(k,k-1);\n      else if (!firstIteration)\n        m_matT.coeffRef(k,k-1) = beta;\n\n      // These Householder transformations form the O(n^3) part of the algorithm\n      m_matT.block(k, k, 3, size-k).applyHouseholderOnTheLeft(ess, tau, workspace);\n      m_matT.block(0, k, (std::min)(iu,k+3) + 1, 3).applyHouseholderOnTheRight(ess, tau, workspace);\n      if (computeU)\n        m_matU.block(0, k, size, 3).applyHouseholderOnTheRight(ess, tau, workspace);\n    }\n  }\n\n  Matrix<Scalar, 2, 1> v = m_matT.template block<2,1>(iu-1, iu-2);\n  Scalar tau, beta;\n  Matrix<Scalar, 1, 1> ess;\n  v.makeHouseholder(ess, tau, beta);\n\n  if (beta != Scalar(0)) // if v is not zero\n  {\n    m_matT.coeffRef(iu-1, iu-2) = beta;\n    m_matT.block(iu-1, iu-1, 2, size-iu+1).applyHouseholderOnTheLeft(ess, tau, workspace);\n    m_matT.block(0, iu-1, iu+1, 2).applyHouseholderOnTheRight(ess, tau, workspace);\n    if (computeU)\n      m_matU.block(0, iu-1, size, 2).applyHouseholderOnTheRight(ess, tau, workspace);\n  }\n\n  // clean up pollution due to round-off errors\n  for (Index i = im+2; i <= iu; ++i)\n  {\n    m_matT.coeffRef(i,i-2) = Scalar(0);\n    if (i > im+2)\n      m_matT.coeffRef(i,i-3) = Scalar(0);\n  }\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_REAL_SCHUR_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigenvalues/RealSchur_MKL.h",
    "content": "/*\n Copyright (c) 2011, Intel Corporation. All rights reserved.\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n * Neither the name of Intel Corporation nor the names of its contributors may\n   be used to endorse or promote products derived from this software without\n   specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\n ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n ********************************************************************************\n *   Content : Eigen bindings to Intel(R) MKL\n *    Real Schur needed to real unsymmetrical eigenvalues/eigenvectors.\n ********************************************************************************\n*/\n\n#ifndef EIGEN_REAL_SCHUR_MKL_H\n#define EIGEN_REAL_SCHUR_MKL_H\n\n#include \"Eigen/src/Core/util/MKL_support.h\"\n\nnamespace Eigen { \n\n/** \\internal Specialization for the data types supported by MKL */\n\n#define EIGEN_MKL_SCHUR_REAL(EIGTYPE, MKLTYPE, MKLPREFIX, MKLPREFIX_U, EIGCOLROW, MKLCOLROW) \\\ntemplate<> inline \\\nRealSchur<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW> >& \\\nRealSchur<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW> >::compute(const Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW>& matrix, bool computeU) \\\n{ \\\n  eigen_assert(matrix.cols() == matrix.rows()); \\\n\\\n  lapack_int n = matrix.cols(), sdim, info; \\\n  lapack_int lda = matrix.outerStride(); \\\n  lapack_int matrix_order = MKLCOLROW; \\\n  char jobvs, sort='N'; \\\n  LAPACK_##MKLPREFIX_U##_SELECT2 select = 0; \\\n  jobvs = (computeU) ? 'V' : 'N'; \\\n  m_matU.resize(n, n); \\\n  lapack_int ldvs  = m_matU.outerStride(); \\\n  m_matT = matrix; \\\n  Matrix<EIGTYPE, Dynamic, Dynamic> wr, wi; \\\n  wr.resize(n, 1); wi.resize(n, 1); \\\n  info = LAPACKE_##MKLPREFIX##gees( matrix_order, jobvs, sort, select, n, (MKLTYPE*)m_matT.data(), lda, &sdim, (MKLTYPE*)wr.data(), (MKLTYPE*)wi.data(), (MKLTYPE*)m_matU.data(), ldvs ); \\\n  if(info == 0) \\\n    m_info = Success; \\\n  else \\\n    m_info = NoConvergence; \\\n\\\n  m_isInitialized = true; \\\n  m_matUisUptodate = computeU; \\\n  return *this; \\\n\\\n}\n\nEIGEN_MKL_SCHUR_REAL(double,   double, d, D, ColMajor, LAPACK_COL_MAJOR)\nEIGEN_MKL_SCHUR_REAL(float,    float,  s, S, ColMajor, LAPACK_COL_MAJOR)\nEIGEN_MKL_SCHUR_REAL(double,   double, d, D, RowMajor, LAPACK_ROW_MAJOR)\nEIGEN_MKL_SCHUR_REAL(float,    float,  s, S, RowMajor, LAPACK_ROW_MAJOR)\n\n} // end namespace Eigen\n\n#endif // EIGEN_REAL_SCHUR_MKL_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2010 Jitse Niesen <jitse@maths.leeds.ac.uk>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SELFADJOINTEIGENSOLVER_H\n#define EIGEN_SELFADJOINTEIGENSOLVER_H\n\n#include \"./Tridiagonalization.h\"\n\nnamespace Eigen { \n\ntemplate<typename _MatrixType>\nclass GeneralizedSelfAdjointEigenSolver;\n\nnamespace internal {\ntemplate<typename SolverType,int Size,bool IsComplex> struct direct_selfadjoint_eigenvalues;\n}\n\n/** \\eigenvalues_module \\ingroup Eigenvalues_Module\n  *\n  *\n  * \\class SelfAdjointEigenSolver\n  *\n  * \\brief Computes eigenvalues and eigenvectors of selfadjoint matrices\n  *\n  * \\tparam _MatrixType the type of the matrix of which we are computing the\n  * eigendecomposition; this is expected to be an instantiation of the Matrix\n  * class template.\n  *\n  * A matrix \\f$ A \\f$ is selfadjoint if it equals its adjoint. For real\n  * matrices, this means that the matrix is symmetric: it equals its\n  * transpose. This class computes the eigenvalues and eigenvectors of a\n  * selfadjoint matrix. These are the scalars \\f$ \\lambda \\f$ and vectors\n  * \\f$ v \\f$ such that \\f$ Av = \\lambda v \\f$.  The eigenvalues of a\n  * selfadjoint matrix are always real. If \\f$ D \\f$ is a diagonal matrix with\n  * the eigenvalues on the diagonal, and \\f$ V \\f$ is a matrix with the\n  * eigenvectors as its columns, then \\f$ A = V D V^{-1} \\f$ (for selfadjoint\n  * matrices, the matrix \\f$ V \\f$ is always invertible). This is called the\n  * eigendecomposition.\n  *\n  * The algorithm exploits the fact that the matrix is selfadjoint, making it\n  * faster and more accurate than the general purpose eigenvalue algorithms\n  * implemented in EigenSolver and ComplexEigenSolver.\n  *\n  * Only the \\b lower \\b triangular \\b part of the input matrix is referenced.\n  *\n  * Call the function compute() to compute the eigenvalues and eigenvectors of\n  * a given matrix. Alternatively, you can use the\n  * SelfAdjointEigenSolver(const MatrixType&, int) constructor which computes\n  * the eigenvalues and eigenvectors at construction time. Once the eigenvalue\n  * and eigenvectors are computed, they can be retrieved with the eigenvalues()\n  * and eigenvectors() functions.\n  *\n  * The documentation for SelfAdjointEigenSolver(const MatrixType&, int)\n  * contains an example of the typical use of this class.\n  *\n  * To solve the \\em generalized eigenvalue problem \\f$ Av = \\lambda Bv \\f$ and\n  * the likes, see the class GeneralizedSelfAdjointEigenSolver.\n  *\n  * \\sa MatrixBase::eigenvalues(), class EigenSolver, class ComplexEigenSolver\n  */\ntemplate<typename _MatrixType> class SelfAdjointEigenSolver\n{\n  public:\n\n    typedef _MatrixType MatrixType;\n    enum {\n      Size = MatrixType::RowsAtCompileTime,\n      ColsAtCompileTime = MatrixType::ColsAtCompileTime,\n      Options = MatrixType::Options,\n      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime\n    };\n    \n    /** \\brief Scalar type for matrices of type \\p _MatrixType. */\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename MatrixType::Index Index;\n    \n    typedef Matrix<Scalar,Size,Size,ColMajor,MaxColsAtCompileTime,MaxColsAtCompileTime> EigenvectorsType;\n\n    /** \\brief Real scalar type for \\p _MatrixType.\n      *\n      * This is just \\c Scalar if #Scalar is real (e.g., \\c float or\n      * \\c double), and the type of the real part of \\c Scalar if #Scalar is\n      * complex.\n      */\n    typedef typename NumTraits<Scalar>::Real RealScalar;\n    \n    friend struct internal::direct_selfadjoint_eigenvalues<SelfAdjointEigenSolver,Size,NumTraits<Scalar>::IsComplex>;\n\n    /** \\brief Type for vector of eigenvalues as returned by eigenvalues().\n      *\n      * This is a column vector with entries of type #RealScalar.\n      * The length of the vector is the size of \\p _MatrixType.\n      */\n    typedef typename internal::plain_col_type<MatrixType, RealScalar>::type RealVectorType;\n    typedef Tridiagonalization<MatrixType> TridiagonalizationType;\n\n    /** \\brief Default constructor for fixed-size matrices.\n      *\n      * The default constructor is useful in cases in which the user intends to\n      * perform decompositions via compute(). This constructor\n      * can only be used if \\p _MatrixType is a fixed-size matrix; use\n      * SelfAdjointEigenSolver(Index) for dynamic-size matrices.\n      *\n      * Example: \\include SelfAdjointEigenSolver_SelfAdjointEigenSolver.cpp\n      * Output: \\verbinclude SelfAdjointEigenSolver_SelfAdjointEigenSolver.out\n      */\n    SelfAdjointEigenSolver()\n        : m_eivec(),\n          m_eivalues(),\n          m_subdiag(),\n          m_isInitialized(false)\n    { }\n\n    /** \\brief Constructor, pre-allocates memory for dynamic-size matrices.\n      *\n      * \\param [in]  size  Positive integer, size of the matrix whose\n      * eigenvalues and eigenvectors will be computed.\n      *\n      * This constructor is useful for dynamic-size matrices, when the user\n      * intends to perform decompositions via compute(). The \\p size\n      * parameter is only used as a hint. It is not an error to give a wrong\n      * \\p size, but it may impair performance.\n      *\n      * \\sa compute() for an example\n      */\n    SelfAdjointEigenSolver(Index size)\n        : m_eivec(size, size),\n          m_eivalues(size),\n          m_subdiag(size > 1 ? size - 1 : 1),\n          m_isInitialized(false)\n    {}\n\n    /** \\brief Constructor; computes eigendecomposition of given matrix.\n      *\n      * \\param[in]  matrix  Selfadjoint matrix whose eigendecomposition is to\n      *    be computed. Only the lower triangular part of the matrix is referenced.\n      * \\param[in]  options Can be #ComputeEigenvectors (default) or #EigenvaluesOnly.\n      *\n      * This constructor calls compute(const MatrixType&, int) to compute the\n      * eigenvalues of the matrix \\p matrix. The eigenvectors are computed if\n      * \\p options equals #ComputeEigenvectors.\n      *\n      * Example: \\include SelfAdjointEigenSolver_SelfAdjointEigenSolver_MatrixType.cpp\n      * Output: \\verbinclude SelfAdjointEigenSolver_SelfAdjointEigenSolver_MatrixType.out\n      *\n      * \\sa compute(const MatrixType&, int)\n      */\n    SelfAdjointEigenSolver(const MatrixType& matrix, int options = ComputeEigenvectors)\n      : m_eivec(matrix.rows(), matrix.cols()),\n        m_eivalues(matrix.cols()),\n        m_subdiag(matrix.rows() > 1 ? matrix.rows() - 1 : 1),\n        m_isInitialized(false)\n    {\n      compute(matrix, options);\n    }\n\n    /** \\brief Computes eigendecomposition of given matrix.\n      *\n      * \\param[in]  matrix  Selfadjoint matrix whose eigendecomposition is to\n      *    be computed. Only the lower triangular part of the matrix is referenced.\n      * \\param[in]  options Can be #ComputeEigenvectors (default) or #EigenvaluesOnly.\n      * \\returns    Reference to \\c *this\n      *\n      * This function computes the eigenvalues of \\p matrix.  The eigenvalues()\n      * function can be used to retrieve them.  If \\p options equals #ComputeEigenvectors,\n      * then the eigenvectors are also computed and can be retrieved by\n      * calling eigenvectors().\n      *\n      * This implementation uses a symmetric QR algorithm. The matrix is first\n      * reduced to tridiagonal form using the Tridiagonalization class. The\n      * tridiagonal matrix is then brought to diagonal form with implicit\n      * symmetric QR steps with Wilkinson shift. Details can be found in\n      * Section 8.3 of Golub \\& Van Loan, <i>%Matrix Computations</i>.\n      *\n      * The cost of the computation is about \\f$ 9n^3 \\f$ if the eigenvectors\n      * are required and \\f$ 4n^3/3 \\f$ if they are not required.\n      *\n      * This method reuses the memory in the SelfAdjointEigenSolver object that\n      * was allocated when the object was constructed, if the size of the\n      * matrix does not change.\n      *\n      * Example: \\include SelfAdjointEigenSolver_compute_MatrixType.cpp\n      * Output: \\verbinclude SelfAdjointEigenSolver_compute_MatrixType.out\n      *\n      * \\sa SelfAdjointEigenSolver(const MatrixType&, int)\n      */\n    SelfAdjointEigenSolver& compute(const MatrixType& matrix, int options = ComputeEigenvectors);\n    \n    /** \\brief Computes eigendecomposition of given matrix using a direct algorithm\n      *\n      * This is a variant of compute(const MatrixType&, int options) which\n      * directly solves the underlying polynomial equation.\n      * \n      * Currently only 3x3 matrices for which the sizes are known at compile time are supported (e.g., Matrix3d).\n      * \n      * This method is usually significantly faster than the QR algorithm\n      * but it might also be less accurate. It is also worth noting that\n      * for 3x3 matrices it involves trigonometric operations which are\n      * not necessarily available for all scalar types.\n      *\n      * \\sa compute(const MatrixType&, int options)\n      */\n    SelfAdjointEigenSolver& computeDirect(const MatrixType& matrix, int options = ComputeEigenvectors);\n\n    /** \\brief Returns the eigenvectors of given matrix.\n      *\n      * \\returns  A const reference to the matrix whose columns are the eigenvectors.\n      *\n      * \\pre The eigenvectors have been computed before.\n      *\n      * Column \\f$ k \\f$ of the returned matrix is an eigenvector corresponding\n      * to eigenvalue number \\f$ k \\f$ as returned by eigenvalues().  The\n      * eigenvectors are normalized to have (Euclidean) norm equal to one. If\n      * this object was used to solve the eigenproblem for the selfadjoint\n      * matrix \\f$ A \\f$, then the matrix returned by this function is the\n      * matrix \\f$ V \\f$ in the eigendecomposition \\f$ A = V D V^{-1} \\f$.\n      *\n      * Example: \\include SelfAdjointEigenSolver_eigenvectors.cpp\n      * Output: \\verbinclude SelfAdjointEigenSolver_eigenvectors.out\n      *\n      * \\sa eigenvalues()\n      */\n    const EigenvectorsType& eigenvectors() const\n    {\n      eigen_assert(m_isInitialized && \"SelfAdjointEigenSolver is not initialized.\");\n      eigen_assert(m_eigenvectorsOk && \"The eigenvectors have not been computed together with the eigenvalues.\");\n      return m_eivec;\n    }\n\n    /** \\brief Returns the eigenvalues of given matrix.\n      *\n      * \\returns A const reference to the column vector containing the eigenvalues.\n      *\n      * \\pre The eigenvalues have been computed before.\n      *\n      * The eigenvalues are repeated according to their algebraic multiplicity,\n      * so there are as many eigenvalues as rows in the matrix. The eigenvalues\n      * are sorted in increasing order.\n      *\n      * Example: \\include SelfAdjointEigenSolver_eigenvalues.cpp\n      * Output: \\verbinclude SelfAdjointEigenSolver_eigenvalues.out\n      *\n      * \\sa eigenvectors(), MatrixBase::eigenvalues()\n      */\n    const RealVectorType& eigenvalues() const\n    {\n      eigen_assert(m_isInitialized && \"SelfAdjointEigenSolver is not initialized.\");\n      return m_eivalues;\n    }\n\n    /** \\brief Computes the positive-definite square root of the matrix.\n      *\n      * \\returns the positive-definite square root of the matrix\n      *\n      * \\pre The eigenvalues and eigenvectors of a positive-definite matrix\n      * have been computed before.\n      *\n      * The square root of a positive-definite matrix \\f$ A \\f$ is the\n      * positive-definite matrix whose square equals \\f$ A \\f$. This function\n      * uses the eigendecomposition \\f$ A = V D V^{-1} \\f$ to compute the\n      * square root as \\f$ A^{1/2} = V D^{1/2} V^{-1} \\f$.\n      *\n      * Example: \\include SelfAdjointEigenSolver_operatorSqrt.cpp\n      * Output: \\verbinclude SelfAdjointEigenSolver_operatorSqrt.out\n      *\n      * \\sa operatorInverseSqrt(),\n      *     \\ref MatrixFunctions_Module \"MatrixFunctions Module\"\n      */\n    MatrixType operatorSqrt() const\n    {\n      eigen_assert(m_isInitialized && \"SelfAdjointEigenSolver is not initialized.\");\n      eigen_assert(m_eigenvectorsOk && \"The eigenvectors have not been computed together with the eigenvalues.\");\n      return m_eivec * m_eivalues.cwiseSqrt().asDiagonal() * m_eivec.adjoint();\n    }\n\n    /** \\brief Computes the inverse square root of the matrix.\n      *\n      * \\returns the inverse positive-definite square root of the matrix\n      *\n      * \\pre The eigenvalues and eigenvectors of a positive-definite matrix\n      * have been computed before.\n      *\n      * This function uses the eigendecomposition \\f$ A = V D V^{-1} \\f$ to\n      * compute the inverse square root as \\f$ V D^{-1/2} V^{-1} \\f$. This is\n      * cheaper than first computing the square root with operatorSqrt() and\n      * then its inverse with MatrixBase::inverse().\n      *\n      * Example: \\include SelfAdjointEigenSolver_operatorInverseSqrt.cpp\n      * Output: \\verbinclude SelfAdjointEigenSolver_operatorInverseSqrt.out\n      *\n      * \\sa operatorSqrt(), MatrixBase::inverse(),\n      *     \\ref MatrixFunctions_Module \"MatrixFunctions Module\"\n      */\n    MatrixType operatorInverseSqrt() const\n    {\n      eigen_assert(m_isInitialized && \"SelfAdjointEigenSolver is not initialized.\");\n      eigen_assert(m_eigenvectorsOk && \"The eigenvectors have not been computed together with the eigenvalues.\");\n      return m_eivec * m_eivalues.cwiseInverse().cwiseSqrt().asDiagonal() * m_eivec.adjoint();\n    }\n\n    /** \\brief Reports whether previous computation was successful.\n      *\n      * \\returns \\c Success if computation was succesful, \\c NoConvergence otherwise.\n      */\n    ComputationInfo info() const\n    {\n      eigen_assert(m_isInitialized && \"SelfAdjointEigenSolver is not initialized.\");\n      return m_info;\n    }\n\n    /** \\brief Maximum number of iterations.\n      *\n      * The algorithm terminates if it does not converge within m_maxIterations * n iterations, where n\n      * denotes the size of the matrix. This value is currently set to 30 (copied from LAPACK).\n      */\n    static const int m_maxIterations = 30;\n\n    #ifdef EIGEN2_SUPPORT\n    SelfAdjointEigenSolver(const MatrixType& matrix, bool computeEigenvectors)\n      : m_eivec(matrix.rows(), matrix.cols()),\n        m_eivalues(matrix.cols()),\n        m_subdiag(matrix.rows() > 1 ? matrix.rows() - 1 : 1),\n        m_isInitialized(false)\n    {\n      compute(matrix, computeEigenvectors);\n    }\n    \n    SelfAdjointEigenSolver(const MatrixType& matA, const MatrixType& matB, bool computeEigenvectors = true)\n        : m_eivec(matA.cols(), matA.cols()),\n          m_eivalues(matA.cols()),\n          m_subdiag(matA.cols() > 1 ? matA.cols() - 1 : 1),\n          m_isInitialized(false)\n    {\n      static_cast<GeneralizedSelfAdjointEigenSolver<MatrixType>*>(this)->compute(matA, matB, computeEigenvectors ? ComputeEigenvectors : EigenvaluesOnly);\n    }\n    \n    void compute(const MatrixType& matrix, bool computeEigenvectors)\n    {\n      compute(matrix, computeEigenvectors ? ComputeEigenvectors : EigenvaluesOnly);\n    }\n\n    void compute(const MatrixType& matA, const MatrixType& matB, bool computeEigenvectors = true)\n    {\n      compute(matA, matB, computeEigenvectors ? ComputeEigenvectors : EigenvaluesOnly);\n    }\n    #endif // EIGEN2_SUPPORT\n\n  protected:\n    static void check_template_parameters()\n    {\n      EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar);\n    }\n    \n    EigenvectorsType m_eivec;\n    RealVectorType m_eivalues;\n    typename TridiagonalizationType::SubDiagonalType m_subdiag;\n    ComputationInfo m_info;\n    bool m_isInitialized;\n    bool m_eigenvectorsOk;\n};\n\n/** \\internal\n  *\n  * \\eigenvalues_module \\ingroup Eigenvalues_Module\n  *\n  * Performs a QR step on a tridiagonal symmetric matrix represented as a\n  * pair of two vectors \\a diag and \\a subdiag.\n  *\n  * \\param matA the input selfadjoint matrix\n  * \\param hCoeffs returned Householder coefficients\n  *\n  * For compilation efficiency reasons, this procedure does not use eigen expression\n  * for its arguments.\n  *\n  * Implemented from Golub's \"Matrix Computations\", algorithm 8.3.2:\n  * \"implicit symmetric QR step with Wilkinson shift\"\n  */\nnamespace internal {\ntemplate<typename RealScalar, typename Scalar, typename Index>\nstatic void tridiagonal_qr_step(RealScalar* diag, RealScalar* subdiag, Index start, Index end, Scalar* matrixQ, Index n);\n}\n\ntemplate<typename MatrixType>\nSelfAdjointEigenSolver<MatrixType>& SelfAdjointEigenSolver<MatrixType>\n::compute(const MatrixType& matrix, int options)\n{\n  check_template_parameters();\n  \n  using std::abs;\n  eigen_assert(matrix.cols() == matrix.rows());\n  eigen_assert((options&~(EigVecMask|GenEigMask))==0\n          && (options&EigVecMask)!=EigVecMask\n          && \"invalid option parameter\");\n  bool computeEigenvectors = (options&ComputeEigenvectors)==ComputeEigenvectors;\n  Index n = matrix.cols();\n  m_eivalues.resize(n,1);\n\n  if(n==1)\n  {\n    m_eivalues.coeffRef(0,0) = numext::real(matrix.coeff(0,0));\n    if(computeEigenvectors)\n      m_eivec.setOnes(n,n);\n    m_info = Success;\n    m_isInitialized = true;\n    m_eigenvectorsOk = computeEigenvectors;\n    return *this;\n  }\n\n  // declare some aliases\n  RealVectorType& diag = m_eivalues;\n  EigenvectorsType& mat = m_eivec;\n\n  // map the matrix coefficients to [-1:1] to avoid over- and underflow.\n  mat = matrix.template triangularView<Lower>();\n  RealScalar scale = mat.cwiseAbs().maxCoeff();\n  if(scale==RealScalar(0)) scale = RealScalar(1);\n  mat.template triangularView<Lower>() /= scale;\n  m_subdiag.resize(n-1);\n  internal::tridiagonalization_inplace(mat, diag, m_subdiag, computeEigenvectors);\n  \n  Index end = n-1;\n  Index start = 0;\n  Index iter = 0; // total number of iterations\n\n  while (end>0)\n  {\n    for (Index i = start; i<end; ++i)\n      if (internal::isMuchSmallerThan(abs(m_subdiag[i]),(abs(diag[i])+abs(diag[i+1]))))\n        m_subdiag[i] = 0;\n\n    // find the largest unreduced block\n    while (end>0 && m_subdiag[end-1]==0)\n    {\n      end--;\n    }\n    if (end<=0)\n      break;\n\n    // if we spent too many iterations, we give up\n    iter++;\n    if(iter > m_maxIterations * n) break;\n\n    start = end - 1;\n    while (start>0 && m_subdiag[start-1]!=0)\n      start--;\n\n    internal::tridiagonal_qr_step(diag.data(), m_subdiag.data(), start, end, computeEigenvectors ? m_eivec.data() : (Scalar*)0, n);\n  }\n\n  if (iter <= m_maxIterations * n)\n    m_info = Success;\n  else\n    m_info = NoConvergence;\n\n  // Sort eigenvalues and corresponding vectors.\n  // TODO make the sort optional ?\n  // TODO use a better sort algorithm !!\n  if (m_info == Success)\n  {\n    for (Index i = 0; i < n-1; ++i)\n    {\n      Index k;\n      m_eivalues.segment(i,n-i).minCoeff(&k);\n      if (k > 0)\n      {\n        std::swap(m_eivalues[i], m_eivalues[k+i]);\n        if(computeEigenvectors)\n          m_eivec.col(i).swap(m_eivec.col(k+i));\n      }\n    }\n  }\n  \n  // scale back the eigen values\n  m_eivalues *= scale;\n\n  m_isInitialized = true;\n  m_eigenvectorsOk = computeEigenvectors;\n  return *this;\n}\n\n\nnamespace internal {\n  \ntemplate<typename SolverType,int Size,bool IsComplex> struct direct_selfadjoint_eigenvalues\n{\n  static inline void run(SolverType& eig, const typename SolverType::MatrixType& A, int options)\n  { eig.compute(A,options); }\n};\n\ntemplate<typename SolverType> struct direct_selfadjoint_eigenvalues<SolverType,3,false>\n{\n  typedef typename SolverType::MatrixType MatrixType;\n  typedef typename SolverType::RealVectorType VectorType;\n  typedef typename SolverType::Scalar Scalar;\n  typedef typename MatrixType::Index Index;\n  typedef typename SolverType::EigenvectorsType EigenvectorsType;\n  \n  /** \\internal\n   * Computes the roots of the characteristic polynomial of \\a m.\n   * For numerical stability m.trace() should be near zero and to avoid over- or underflow m should be normalized.\n   */\n  static inline void computeRoots(const MatrixType& m, VectorType& roots)\n  {\n    using std::sqrt;\n    using std::atan2;\n    using std::cos;\n    using std::sin;\n    const Scalar s_inv3 = Scalar(1.0)/Scalar(3.0);\n    const Scalar s_sqrt3 = sqrt(Scalar(3.0));\n\n    // The characteristic equation is x^3 - c2*x^2 + c1*x - c0 = 0.  The\n    // eigenvalues are the roots to this equation, all guaranteed to be\n    // real-valued, because the matrix is symmetric.\n    Scalar c0 = m(0,0)*m(1,1)*m(2,2) + Scalar(2)*m(1,0)*m(2,0)*m(2,1) - m(0,0)*m(2,1)*m(2,1) - m(1,1)*m(2,0)*m(2,0) - m(2,2)*m(1,0)*m(1,0);\n    Scalar c1 = m(0,0)*m(1,1) - m(1,0)*m(1,0) + m(0,0)*m(2,2) - m(2,0)*m(2,0) + m(1,1)*m(2,2) - m(2,1)*m(2,1);\n    Scalar c2 = m(0,0) + m(1,1) + m(2,2);\n\n    // Construct the parameters used in classifying the roots of the equation\n    // and in solving the equation for the roots in closed form.\n    Scalar c2_over_3 = c2*s_inv3;\n    Scalar a_over_3 = (c2*c2_over_3 - c1)*s_inv3;\n    if(a_over_3<Scalar(0))\n      a_over_3 = Scalar(0);\n\n    Scalar half_b = Scalar(0.5)*(c0 + c2_over_3*(Scalar(2)*c2_over_3*c2_over_3 - c1));\n\n    Scalar q = a_over_3*a_over_3*a_over_3 - half_b*half_b;\n    if(q<Scalar(0))\n      q = Scalar(0);\n\n    // Compute the eigenvalues by solving for the roots of the polynomial.\n    Scalar rho = sqrt(a_over_3);\n    Scalar theta = atan2(sqrt(q),half_b)*s_inv3;  // since sqrt(q) > 0, atan2 is in [0, pi] and theta is in [0, pi/3]\n    Scalar cos_theta = cos(theta);\n    Scalar sin_theta = sin(theta);\n    // roots are already sorted, since cos is monotonically decreasing on [0, pi]\n    roots(0) = c2_over_3 - rho*(cos_theta + s_sqrt3*sin_theta); // == 2*rho*cos(theta+2pi/3)\n    roots(1) = c2_over_3 - rho*(cos_theta - s_sqrt3*sin_theta); // == 2*rho*cos(theta+ pi/3)\n    roots(2) = c2_over_3 + Scalar(2)*rho*cos_theta;\n  }\n\n  static inline bool extract_kernel(MatrixType& mat, Ref<VectorType> res, Ref<VectorType> representative)\n  {\n    using std::abs;\n    Index i0;\n    // Find non-zero column i0 (by construction, there must exist a non zero coefficient on the diagonal):\n    mat.diagonal().cwiseAbs().maxCoeff(&i0);\n    // mat.col(i0) is a good candidate for an orthogonal vector to the current eigenvector,\n    // so let's save it:\n    representative = mat.col(i0);\n    Scalar n0, n1;\n    VectorType c0, c1;\n    n0 = (c0 = representative.cross(mat.col((i0+1)%3))).squaredNorm();\n    n1 = (c1 = representative.cross(mat.col((i0+2)%3))).squaredNorm();\n    if(n0>n1) res = c0/std::sqrt(n0);\n    else      res = c1/std::sqrt(n1);\n\n    return true;\n  }\n\n  static inline void run(SolverType& solver, const MatrixType& mat, int options)\n  {\n    eigen_assert(mat.cols() == 3 && mat.cols() == mat.rows());\n    eigen_assert((options&~(EigVecMask|GenEigMask))==0\n            && (options&EigVecMask)!=EigVecMask\n            && \"invalid option parameter\");\n    bool computeEigenvectors = (options&ComputeEigenvectors)==ComputeEigenvectors;\n    \n    EigenvectorsType& eivecs = solver.m_eivec;\n    VectorType& eivals = solver.m_eivalues;\n  \n    // Shift the matrix to the mean eigenvalue and map the matrix coefficients to [-1:1] to avoid over- and underflow.\n    Scalar shift = mat.trace() / Scalar(3);\n    // TODO Avoid this copy. Currently it is necessary to suppress bogus values when determining maxCoeff and for computing the eigenvectors later\n    MatrixType scaledMat = mat.template selfadjointView<Lower>();\n    scaledMat.diagonal().array() -= shift;\n    Scalar scale = scaledMat.cwiseAbs().maxCoeff();\n    if(scale > 0) scaledMat /= scale;   // TODO for scale==0 we could save the remaining operations\n\n    // compute the eigenvalues\n    computeRoots(scaledMat,eivals);\n\n    // compute the eigenvectors\n    if(computeEigenvectors)\n    {\n      if((eivals(2)-eivals(0))<=Eigen::NumTraits<Scalar>::epsilon())\n      {\n        // All three eigenvalues are numerically the same\n        eivecs.setIdentity();\n      }\n      else\n      {\n        MatrixType tmp;\n        tmp = scaledMat;\n\n        // Compute the eigenvector of the most distinct eigenvalue\n        Scalar d0 = eivals(2) - eivals(1);\n        Scalar d1 = eivals(1) - eivals(0);\n        Index k(0), l(2);\n        if(d0 > d1)\n        {\n          std::swap(k,l);\n          d0 = d1;\n        }\n\n        // Compute the eigenvector of index k\n        {\n          tmp.diagonal().array () -= eivals(k);\n          // By construction, 'tmp' is of rank 2, and its kernel corresponds to the respective eigenvector.\n          extract_kernel(tmp, eivecs.col(k), eivecs.col(l));\n        }\n\n        // Compute eigenvector of index l\n        if(d0<=2*Eigen::NumTraits<Scalar>::epsilon()*d1)\n        {\n          // If d0 is too small, then the two other eigenvalues are numerically the same,\n          // and thus we only have to ortho-normalize the near orthogonal vector we saved above.\n          eivecs.col(l) -= eivecs.col(k).dot(eivecs.col(l))*eivecs.col(l);\n          eivecs.col(l).normalize();\n        }\n        else\n        {\n          tmp = scaledMat;\n          tmp.diagonal().array () -= eivals(l);\n\n          VectorType dummy;\n          extract_kernel(tmp, eivecs.col(l), dummy);\n        }\n\n        // Compute last eigenvector from the other two\n        eivecs.col(1) = eivecs.col(2).cross(eivecs.col(0)).normalized();\n      }\n    }\n\n    // Rescale back to the original size.\n    eivals *= scale;\n    eivals.array() += shift;\n    \n    solver.m_info = Success;\n    solver.m_isInitialized = true;\n    solver.m_eigenvectorsOk = computeEigenvectors;\n  }\n};\n\n// 2x2 direct eigenvalues decomposition, code from Hauke Heibel\ntemplate<typename SolverType> struct direct_selfadjoint_eigenvalues<SolverType,2,false>\n{\n  typedef typename SolverType::MatrixType MatrixType;\n  typedef typename SolverType::RealVectorType VectorType;\n  typedef typename SolverType::Scalar Scalar;\n  typedef typename SolverType::EigenvectorsType EigenvectorsType;\n  \n  static inline void computeRoots(const MatrixType& m, VectorType& roots)\n  {\n    using std::sqrt;\n    const Scalar t0 = Scalar(0.5) * sqrt( numext::abs2(m(0,0)-m(1,1)) + Scalar(4)*numext::abs2(m(1,0)));\n    const Scalar t1 = Scalar(0.5) * (m(0,0) + m(1,1));\n    roots(0) = t1 - t0;\n    roots(1) = t1 + t0;\n  }\n  \n  static inline void run(SolverType& solver, const MatrixType& mat, int options)\n  {\n    using std::sqrt;\n    using std::abs;\n\n    eigen_assert(mat.cols() == 2 && mat.cols() == mat.rows());\n    eigen_assert((options&~(EigVecMask|GenEigMask))==0\n            && (options&EigVecMask)!=EigVecMask\n            && \"invalid option parameter\");\n    bool computeEigenvectors = (options&ComputeEigenvectors)==ComputeEigenvectors;\n    \n    EigenvectorsType& eivecs = solver.m_eivec;\n    VectorType& eivals = solver.m_eivalues;\n  \n    // map the matrix coefficients to [-1:1] to avoid over- and underflow.\n    Scalar scale = mat.cwiseAbs().maxCoeff();\n    scale = (std::max)(scale,Scalar(1));\n    MatrixType scaledMat = mat / scale;\n    \n    // Compute the eigenvalues\n    computeRoots(scaledMat,eivals);\n    \n    // compute the eigen vectors\n    if(computeEigenvectors)\n    {\n      if((eivals(1)-eivals(0))<=abs(eivals(1))*Eigen::NumTraits<Scalar>::epsilon())\n      {\n        eivecs.setIdentity();\n      }\n      else\n      {\n        scaledMat.diagonal().array () -= eivals(1);\n        Scalar a2 = numext::abs2(scaledMat(0,0));\n        Scalar c2 = numext::abs2(scaledMat(1,1));\n        Scalar b2 = numext::abs2(scaledMat(1,0));\n        if(a2>c2)\n        {\n          eivecs.col(1) << -scaledMat(1,0), scaledMat(0,0);\n          eivecs.col(1) /= sqrt(a2+b2);\n        }\n        else\n        {\n          eivecs.col(1) << -scaledMat(1,1), scaledMat(1,0);\n          eivecs.col(1) /= sqrt(c2+b2);\n        }\n\n        eivecs.col(0) << eivecs.col(1).unitOrthogonal();\n      }\n    }\n    \n    // Rescale back to the original size.\n    eivals *= scale;\n    \n    solver.m_info = Success;\n    solver.m_isInitialized = true;\n    solver.m_eigenvectorsOk = computeEigenvectors;\n  }\n};\n\n}\n\ntemplate<typename MatrixType>\nSelfAdjointEigenSolver<MatrixType>& SelfAdjointEigenSolver<MatrixType>\n::computeDirect(const MatrixType& matrix, int options)\n{\n  internal::direct_selfadjoint_eigenvalues<SelfAdjointEigenSolver,Size,NumTraits<Scalar>::IsComplex>::run(*this,matrix,options);\n  return *this;\n}\n\nnamespace internal {\ntemplate<typename RealScalar, typename Scalar, typename Index>\nstatic void tridiagonal_qr_step(RealScalar* diag, RealScalar* subdiag, Index start, Index end, Scalar* matrixQ, Index n)\n{\n  using std::abs;\n  RealScalar td = (diag[end-1] - diag[end])*RealScalar(0.5);\n  RealScalar e = subdiag[end-1];\n  // Note that thanks to scaling, e^2 or td^2 cannot overflow, however they can still\n  // underflow thus leading to inf/NaN values when using the following commented code:\n//   RealScalar e2 = numext::abs2(subdiag[end-1]);\n//   RealScalar mu = diag[end] - e2 / (td + (td>0 ? 1 : -1) * sqrt(td*td + e2));\n  // This explain the following, somewhat more complicated, version:\n  RealScalar mu = diag[end];\n  if(td==0)\n    mu -= abs(e);\n  else\n  {\n    RealScalar e2 = numext::abs2(subdiag[end-1]);\n    RealScalar h = numext::hypot(td,e);\n    if(e2==0)  mu -= (e / (td + (td>0 ? 1 : -1))) * (e / h);\n    else       mu -= e2 / (td + (td>0 ? h : -h));\n  }\n  \n  RealScalar x = diag[start] - mu;\n  RealScalar z = subdiag[start];\n  for (Index k = start; k < end; ++k)\n  {\n    JacobiRotation<RealScalar> rot;\n    rot.makeGivens(x, z);\n\n    // do T = G' T G\n    RealScalar sdk = rot.s() * diag[k] + rot.c() * subdiag[k];\n    RealScalar dkp1 = rot.s() * subdiag[k] + rot.c() * diag[k+1];\n\n    diag[k] = rot.c() * (rot.c() * diag[k] - rot.s() * subdiag[k]) - rot.s() * (rot.c() * subdiag[k] - rot.s() * diag[k+1]);\n    diag[k+1] = rot.s() * sdk + rot.c() * dkp1;\n    subdiag[k] = rot.c() * sdk - rot.s() * dkp1;\n    \n\n    if (k > start)\n      subdiag[k - 1] = rot.c() * subdiag[k-1] - rot.s() * z;\n\n    x = subdiag[k];\n\n    if (k < end - 1)\n    {\n      z = -rot.s() * subdiag[k+1];\n      subdiag[k + 1] = rot.c() * subdiag[k+1];\n    }\n    \n    // apply the givens rotation to the unit matrix Q = Q * G\n    if (matrixQ)\n    {\n      Map<Matrix<Scalar,Dynamic,Dynamic,ColMajor> > q(matrixQ,n,n);\n      q.applyOnTheRight(k,k+1,rot);\n    }\n  }\n}\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_SELFADJOINTEIGENSOLVER_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_MKL.h",
    "content": "/*\n Copyright (c) 2011, Intel Corporation. All rights reserved.\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n * Neither the name of Intel Corporation nor the names of its contributors may\n   be used to endorse or promote products derived from this software without\n   specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\n ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n ********************************************************************************\n *   Content : Eigen bindings to Intel(R) MKL\n *    Self-adjoint eigenvalues/eigenvectors.\n ********************************************************************************\n*/\n\n#ifndef EIGEN_SAEIGENSOLVER_MKL_H\n#define EIGEN_SAEIGENSOLVER_MKL_H\n\n#include \"Eigen/src/Core/util/MKL_support.h\"\n\nnamespace Eigen { \n\n/** \\internal Specialization for the data types supported by MKL */\n\n#define EIGEN_MKL_EIG_SELFADJ(EIGTYPE, MKLTYPE, MKLRTYPE, MKLNAME, EIGCOLROW, MKLCOLROW ) \\\ntemplate<> inline \\\nSelfAdjointEigenSolver<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW> >& \\\nSelfAdjointEigenSolver<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW> >::compute(const Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW>& matrix, int options) \\\n{ \\\n  eigen_assert(matrix.cols() == matrix.rows()); \\\n  eigen_assert((options&~(EigVecMask|GenEigMask))==0 \\\n          && (options&EigVecMask)!=EigVecMask \\\n          && \"invalid option parameter\"); \\\n  bool computeEigenvectors = (options&ComputeEigenvectors)==ComputeEigenvectors; \\\n  lapack_int n = matrix.cols(), lda, matrix_order, info; \\\n  m_eivalues.resize(n,1); \\\n  m_subdiag.resize(n-1); \\\n  m_eivec = matrix; \\\n\\\n  if(n==1) \\\n  { \\\n    m_eivalues.coeffRef(0,0) = numext::real(matrix.coeff(0,0)); \\\n    if(computeEigenvectors) m_eivec.setOnes(n,n); \\\n    m_info = Success; \\\n    m_isInitialized = true; \\\n    m_eigenvectorsOk = computeEigenvectors; \\\n    return *this; \\\n  } \\\n\\\n  lda = matrix.outerStride(); \\\n  matrix_order=MKLCOLROW; \\\n  char jobz, uplo='L'/*, range='A'*/; \\\n  jobz = computeEigenvectors ? 'V' : 'N'; \\\n\\\n  info = LAPACKE_##MKLNAME( matrix_order, jobz, uplo, n, (MKLTYPE*)m_eivec.data(), lda, (MKLRTYPE*)m_eivalues.data() ); \\\n  m_info = (info==0) ? Success : NoConvergence; \\\n  m_isInitialized = true; \\\n  m_eigenvectorsOk = computeEigenvectors; \\\n  return *this; \\\n}\n\n\nEIGEN_MKL_EIG_SELFADJ(double,   double,        double, dsyev, ColMajor, LAPACK_COL_MAJOR)\nEIGEN_MKL_EIG_SELFADJ(float,    float,         float,  ssyev, ColMajor, LAPACK_COL_MAJOR)\nEIGEN_MKL_EIG_SELFADJ(dcomplex, MKL_Complex16, double, zheev, ColMajor, LAPACK_COL_MAJOR)\nEIGEN_MKL_EIG_SELFADJ(scomplex, MKL_Complex8,  float,  cheev, ColMajor, LAPACK_COL_MAJOR)\n\nEIGEN_MKL_EIG_SELFADJ(double,   double,        double, dsyev, RowMajor, LAPACK_ROW_MAJOR)\nEIGEN_MKL_EIG_SELFADJ(float,    float,         float,  ssyev, RowMajor, LAPACK_ROW_MAJOR)\nEIGEN_MKL_EIG_SELFADJ(dcomplex, MKL_Complex16, double, zheev, RowMajor, LAPACK_ROW_MAJOR)\nEIGEN_MKL_EIG_SELFADJ(scomplex, MKL_Complex8,  float,  cheev, RowMajor, LAPACK_ROW_MAJOR)\n\n} // end namespace Eigen\n\n#endif // EIGEN_SAEIGENSOLVER_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Eigenvalues/Tridiagonalization.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2010 Jitse Niesen <jitse@maths.leeds.ac.uk>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_TRIDIAGONALIZATION_H\n#define EIGEN_TRIDIAGONALIZATION_H\n\nnamespace Eigen { \n\nnamespace internal {\n  \ntemplate<typename MatrixType> struct TridiagonalizationMatrixTReturnType;\ntemplate<typename MatrixType>\nstruct traits<TridiagonalizationMatrixTReturnType<MatrixType> >\n{\n  typedef typename MatrixType::PlainObject ReturnType;\n};\n\ntemplate<typename MatrixType, typename CoeffVectorType>\nvoid tridiagonalization_inplace(MatrixType& matA, CoeffVectorType& hCoeffs);\n}\n\n/** \\eigenvalues_module \\ingroup Eigenvalues_Module\n  *\n  *\n  * \\class Tridiagonalization\n  *\n  * \\brief Tridiagonal decomposition of a selfadjoint matrix\n  *\n  * \\tparam _MatrixType the type of the matrix of which we are computing the\n  * tridiagonal decomposition; this is expected to be an instantiation of the\n  * Matrix class template.\n  *\n  * This class performs a tridiagonal decomposition of a selfadjoint matrix \\f$ A \\f$ such that:\n  * \\f$ A = Q T Q^* \\f$ where \\f$ Q \\f$ is unitary and \\f$ T \\f$ a real symmetric tridiagonal matrix.\n  *\n  * A tridiagonal matrix is a matrix which has nonzero elements only on the\n  * main diagonal and the first diagonal below and above it. The Hessenberg\n  * decomposition of a selfadjoint matrix is in fact a tridiagonal\n  * decomposition. This class is used in SelfAdjointEigenSolver to compute the\n  * eigenvalues and eigenvectors of a selfadjoint matrix.\n  *\n  * Call the function compute() to compute the tridiagonal decomposition of a\n  * given matrix. Alternatively, you can use the Tridiagonalization(const MatrixType&)\n  * constructor which computes the tridiagonal Schur decomposition at\n  * construction time. Once the decomposition is computed, you can use the\n  * matrixQ() and matrixT() functions to retrieve the matrices Q and T in the\n  * decomposition.\n  *\n  * The documentation of Tridiagonalization(const MatrixType&) contains an\n  * example of the typical use of this class.\n  *\n  * \\sa class HessenbergDecomposition, class SelfAdjointEigenSolver\n  */\ntemplate<typename _MatrixType> class Tridiagonalization\n{\n  public:\n\n    /** \\brief Synonym for the template parameter \\p _MatrixType. */\n    typedef _MatrixType MatrixType;\n\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename NumTraits<Scalar>::Real RealScalar;\n    typedef typename MatrixType::Index Index;\n\n    enum {\n      Size = MatrixType::RowsAtCompileTime,\n      SizeMinusOne = Size == Dynamic ? Dynamic : (Size > 1 ? Size - 1 : 1),\n      Options = MatrixType::Options,\n      MaxSize = MatrixType::MaxRowsAtCompileTime,\n      MaxSizeMinusOne = MaxSize == Dynamic ? Dynamic : (MaxSize > 1 ? MaxSize - 1 : 1)\n    };\n\n    typedef Matrix<Scalar, SizeMinusOne, 1, Options & ~RowMajor, MaxSizeMinusOne, 1> CoeffVectorType;\n    typedef typename internal::plain_col_type<MatrixType, RealScalar>::type DiagonalType;\n    typedef Matrix<RealScalar, SizeMinusOne, 1, Options & ~RowMajor, MaxSizeMinusOne, 1> SubDiagonalType;\n    typedef typename internal::remove_all<typename MatrixType::RealReturnType>::type MatrixTypeRealView;\n    typedef internal::TridiagonalizationMatrixTReturnType<MatrixTypeRealView> MatrixTReturnType;\n\n    typedef typename internal::conditional<NumTraits<Scalar>::IsComplex,\n              typename internal::add_const_on_value_type<typename Diagonal<const MatrixType>::RealReturnType>::type,\n              const Diagonal<const MatrixType>\n            >::type DiagonalReturnType;\n\n    typedef typename internal::conditional<NumTraits<Scalar>::IsComplex,\n              typename internal::add_const_on_value_type<typename Diagonal<\n                Block<const MatrixType,SizeMinusOne,SizeMinusOne> >::RealReturnType>::type,\n              const Diagonal<\n                Block<const MatrixType,SizeMinusOne,SizeMinusOne> >\n            >::type SubDiagonalReturnType;\n\n    /** \\brief Return type of matrixQ() */\n    typedef HouseholderSequence<MatrixType,typename internal::remove_all<typename CoeffVectorType::ConjugateReturnType>::type> HouseholderSequenceType;\n\n    /** \\brief Default constructor.\n      *\n      * \\param [in]  size  Positive integer, size of the matrix whose tridiagonal\n      * decomposition will be computed.\n      *\n      * The default constructor is useful in cases in which the user intends to\n      * perform decompositions via compute().  The \\p size parameter is only\n      * used as a hint. It is not an error to give a wrong \\p size, but it may\n      * impair performance.\n      *\n      * \\sa compute() for an example.\n      */\n    Tridiagonalization(Index size = Size==Dynamic ? 2 : Size)\n      : m_matrix(size,size),\n        m_hCoeffs(size > 1 ? size-1 : 1),\n        m_isInitialized(false)\n    {}\n\n    /** \\brief Constructor; computes tridiagonal decomposition of given matrix.\n      *\n      * \\param[in]  matrix  Selfadjoint matrix whose tridiagonal decomposition\n      * is to be computed.\n      *\n      * This constructor calls compute() to compute the tridiagonal decomposition.\n      *\n      * Example: \\include Tridiagonalization_Tridiagonalization_MatrixType.cpp\n      * Output: \\verbinclude Tridiagonalization_Tridiagonalization_MatrixType.out\n      */\n    Tridiagonalization(const MatrixType& matrix)\n      : m_matrix(matrix),\n        m_hCoeffs(matrix.cols() > 1 ? matrix.cols()-1 : 1),\n        m_isInitialized(false)\n    {\n      internal::tridiagonalization_inplace(m_matrix, m_hCoeffs);\n      m_isInitialized = true;\n    }\n\n    /** \\brief Computes tridiagonal decomposition of given matrix.\n      *\n      * \\param[in]  matrix  Selfadjoint matrix whose tridiagonal decomposition\n      * is to be computed.\n      * \\returns    Reference to \\c *this\n      *\n      * The tridiagonal decomposition is computed by bringing the columns of\n      * the matrix successively in the required form using Householder\n      * reflections. The cost is \\f$ 4n^3/3 \\f$ flops, where \\f$ n \\f$ denotes\n      * the size of the given matrix.\n      *\n      * This method reuses of the allocated data in the Tridiagonalization\n      * object, if the size of the matrix does not change.\n      *\n      * Example: \\include Tridiagonalization_compute.cpp\n      * Output: \\verbinclude Tridiagonalization_compute.out\n      */\n    Tridiagonalization& compute(const MatrixType& matrix)\n    {\n      m_matrix = matrix;\n      m_hCoeffs.resize(matrix.rows()-1, 1);\n      internal::tridiagonalization_inplace(m_matrix, m_hCoeffs);\n      m_isInitialized = true;\n      return *this;\n    }\n\n    /** \\brief Returns the Householder coefficients.\n      *\n      * \\returns a const reference to the vector of Householder coefficients\n      *\n      * \\pre Either the constructor Tridiagonalization(const MatrixType&) or\n      * the member function compute(const MatrixType&) has been called before\n      * to compute the tridiagonal decomposition of a matrix.\n      *\n      * The Householder coefficients allow the reconstruction of the matrix\n      * \\f$ Q \\f$ in the tridiagonal decomposition from the packed data.\n      *\n      * Example: \\include Tridiagonalization_householderCoefficients.cpp\n      * Output: \\verbinclude Tridiagonalization_householderCoefficients.out\n      *\n      * \\sa packedMatrix(), \\ref Householder_Module \"Householder module\"\n      */\n    inline CoeffVectorType householderCoefficients() const\n    {\n      eigen_assert(m_isInitialized && \"Tridiagonalization is not initialized.\");\n      return m_hCoeffs;\n    }\n\n    /** \\brief Returns the internal representation of the decomposition\n      *\n      *\t\\returns a const reference to a matrix with the internal representation\n      *\t         of the decomposition.\n      *\n      * \\pre Either the constructor Tridiagonalization(const MatrixType&) or\n      * the member function compute(const MatrixType&) has been called before\n      * to compute the tridiagonal decomposition of a matrix.\n      *\n      * The returned matrix contains the following information:\n      *  - the strict upper triangular part is equal to the input matrix A.\n      *  - the diagonal and lower sub-diagonal represent the real tridiagonal\n      *    symmetric matrix T.\n      *  - the rest of the lower part contains the Householder vectors that,\n      *    combined with Householder coefficients returned by\n      *    householderCoefficients(), allows to reconstruct the matrix Q as\n      *       \\f$ Q = H_{N-1} \\ldots H_1 H_0 \\f$.\n      *    Here, the matrices \\f$ H_i \\f$ are the Householder transformations\n      *       \\f$ H_i = (I - h_i v_i v_i^T) \\f$\n      *    where \\f$ h_i \\f$ is the \\f$ i \\f$th Householder coefficient and\n      *    \\f$ v_i \\f$ is the Householder vector defined by\n      *       \\f$ v_i = [ 0, \\ldots, 0, 1, M(i+2,i), \\ldots, M(N-1,i) ]^T \\f$\n      *    with M the matrix returned by this function.\n      *\n      * See LAPACK for further details on this packed storage.\n      *\n      * Example: \\include Tridiagonalization_packedMatrix.cpp\n      * Output: \\verbinclude Tridiagonalization_packedMatrix.out\n      *\n      * \\sa householderCoefficients()\n      */\n    inline const MatrixType& packedMatrix() const\n    {\n      eigen_assert(m_isInitialized && \"Tridiagonalization is not initialized.\");\n      return m_matrix;\n    }\n\n    /** \\brief Returns the unitary matrix Q in the decomposition\n      *\n      * \\returns object representing the matrix Q\n      *\n      * \\pre Either the constructor Tridiagonalization(const MatrixType&) or\n      * the member function compute(const MatrixType&) has been called before\n      * to compute the tridiagonal decomposition of a matrix.\n      *\n      * This function returns a light-weight object of template class\n      * HouseholderSequence. You can either apply it directly to a matrix or\n      * you can convert it to a matrix of type #MatrixType.\n      *\n      * \\sa Tridiagonalization(const MatrixType&) for an example,\n      *     matrixT(), class HouseholderSequence\n      */\n    HouseholderSequenceType matrixQ() const\n    {\n      eigen_assert(m_isInitialized && \"Tridiagonalization is not initialized.\");\n      return HouseholderSequenceType(m_matrix, m_hCoeffs.conjugate())\n             .setLength(m_matrix.rows() - 1)\n             .setShift(1);\n    }\n\n    /** \\brief Returns an expression of the tridiagonal matrix T in the decomposition\n      *\n      * \\returns expression object representing the matrix T\n      *\n      * \\pre Either the constructor Tridiagonalization(const MatrixType&) or\n      * the member function compute(const MatrixType&) has been called before\n      * to compute the tridiagonal decomposition of a matrix.\n      *\n      * Currently, this function can be used to extract the matrix T from internal\n      * data and copy it to a dense matrix object. In most cases, it may be\n      * sufficient to directly use the packed matrix or the vector expressions\n      * returned by diagonal() and subDiagonal() instead of creating a new\n      * dense copy matrix with this function.\n      *\n      * \\sa Tridiagonalization(const MatrixType&) for an example,\n      * matrixQ(), packedMatrix(), diagonal(), subDiagonal()\n      */\n    MatrixTReturnType matrixT() const\n    {\n      eigen_assert(m_isInitialized && \"Tridiagonalization is not initialized.\");\n      return MatrixTReturnType(m_matrix.real());\n    }\n\n    /** \\brief Returns the diagonal of the tridiagonal matrix T in the decomposition.\n      *\n      * \\returns expression representing the diagonal of T\n      *\n      * \\pre Either the constructor Tridiagonalization(const MatrixType&) or\n      * the member function compute(const MatrixType&) has been called before\n      * to compute the tridiagonal decomposition of a matrix.\n      *\n      * Example: \\include Tridiagonalization_diagonal.cpp\n      * Output: \\verbinclude Tridiagonalization_diagonal.out\n      *\n      * \\sa matrixT(), subDiagonal()\n      */\n    DiagonalReturnType diagonal() const;\n\n    /** \\brief Returns the subdiagonal of the tridiagonal matrix T in the decomposition.\n      *\n      * \\returns expression representing the subdiagonal of T\n      *\n      * \\pre Either the constructor Tridiagonalization(const MatrixType&) or\n      * the member function compute(const MatrixType&) has been called before\n      * to compute the tridiagonal decomposition of a matrix.\n      *\n      * \\sa diagonal() for an example, matrixT()\n      */\n    SubDiagonalReturnType subDiagonal() const;\n\n  protected:\n\n    MatrixType m_matrix;\n    CoeffVectorType m_hCoeffs;\n    bool m_isInitialized;\n};\n\ntemplate<typename MatrixType>\ntypename Tridiagonalization<MatrixType>::DiagonalReturnType\nTridiagonalization<MatrixType>::diagonal() const\n{\n  eigen_assert(m_isInitialized && \"Tridiagonalization is not initialized.\");\n  return m_matrix.diagonal();\n}\n\ntemplate<typename MatrixType>\ntypename Tridiagonalization<MatrixType>::SubDiagonalReturnType\nTridiagonalization<MatrixType>::subDiagonal() const\n{\n  eigen_assert(m_isInitialized && \"Tridiagonalization is not initialized.\");\n  Index n = m_matrix.rows();\n  return Block<const MatrixType,SizeMinusOne,SizeMinusOne>(m_matrix, 1, 0, n-1,n-1).diagonal();\n}\n\nnamespace internal {\n\n/** \\internal\n  * Performs a tridiagonal decomposition of the selfadjoint matrix \\a matA in-place.\n  *\n  * \\param[in,out] matA On input the selfadjoint matrix. Only the \\b lower triangular part is referenced.\n  *                     On output, the strict upper part is left unchanged, and the lower triangular part\n  *                     represents the T and Q matrices in packed format has detailed below.\n  * \\param[out]    hCoeffs returned Householder coefficients (see below)\n  *\n  * On output, the tridiagonal selfadjoint matrix T is stored in the diagonal\n  * and lower sub-diagonal of the matrix \\a matA.\n  * The unitary matrix Q is represented in a compact way as a product of\n  * Householder reflectors \\f$ H_i \\f$ such that:\n  *       \\f$ Q = H_{N-1} \\ldots H_1 H_0 \\f$.\n  * The Householder reflectors are defined as\n  *       \\f$ H_i = (I - h_i v_i v_i^T) \\f$\n  * where \\f$ h_i = hCoeffs[i]\\f$ is the \\f$ i \\f$th Householder coefficient and\n  * \\f$ v_i \\f$ is the Householder vector defined by\n  *       \\f$ v_i = [ 0, \\ldots, 0, 1, matA(i+2,i), \\ldots, matA(N-1,i) ]^T \\f$.\n  *\n  * Implemented from Golub's \"Matrix Computations\", algorithm 8.3.1.\n  *\n  * \\sa Tridiagonalization::packedMatrix()\n  */\ntemplate<typename MatrixType, typename CoeffVectorType>\nvoid tridiagonalization_inplace(MatrixType& matA, CoeffVectorType& hCoeffs)\n{\n  using numext::conj;\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename MatrixType::RealScalar RealScalar;\n  Index n = matA.rows();\n  eigen_assert(n==matA.cols());\n  eigen_assert(n==hCoeffs.size()+1 || n==1);\n  \n  for (Index i = 0; i<n-1; ++i)\n  {\n    Index remainingSize = n-i-1;\n    RealScalar beta;\n    Scalar h;\n    matA.col(i).tail(remainingSize).makeHouseholderInPlace(h, beta);\n\n    // Apply similarity transformation to remaining columns,\n    // i.e., A = H A H' where H = I - h v v' and v = matA.col(i).tail(n-i-1)\n    matA.col(i).coeffRef(i+1) = 1;\n\n    hCoeffs.tail(n-i-1).noalias() = (matA.bottomRightCorner(remainingSize,remainingSize).template selfadjointView<Lower>()\n                                  * (conj(h) * matA.col(i).tail(remainingSize)));\n\n    hCoeffs.tail(n-i-1) += (conj(h)*RealScalar(-0.5)*(hCoeffs.tail(remainingSize).dot(matA.col(i).tail(remainingSize)))) * matA.col(i).tail(n-i-1);\n\n    matA.bottomRightCorner(remainingSize, remainingSize).template selfadjointView<Lower>()\n      .rankUpdate(matA.col(i).tail(remainingSize), hCoeffs.tail(remainingSize), Scalar(-1));\n\n    matA.col(i).coeffRef(i+1) = beta;\n    hCoeffs.coeffRef(i) = h;\n  }\n}\n\n// forward declaration, implementation at the end of this file\ntemplate<typename MatrixType,\n         int Size=MatrixType::ColsAtCompileTime,\n         bool IsComplex=NumTraits<typename MatrixType::Scalar>::IsComplex>\nstruct tridiagonalization_inplace_selector;\n\n/** \\brief Performs a full tridiagonalization in place\n  *\n  * \\param[in,out]  mat  On input, the selfadjoint matrix whose tridiagonal\n  *    decomposition is to be computed. Only the lower triangular part referenced.\n  *    The rest is left unchanged. On output, the orthogonal matrix Q\n  *    in the decomposition if \\p extractQ is true.\n  * \\param[out]  diag  The diagonal of the tridiagonal matrix T in the\n  *    decomposition.\n  * \\param[out]  subdiag  The subdiagonal of the tridiagonal matrix T in\n  *    the decomposition.\n  * \\param[in]  extractQ  If true, the orthogonal matrix Q in the\n  *    decomposition is computed and stored in \\p mat.\n  *\n  * Computes the tridiagonal decomposition of the selfadjoint matrix \\p mat in place\n  * such that \\f$ mat = Q T Q^* \\f$ where \\f$ Q \\f$ is unitary and \\f$ T \\f$ a real\n  * symmetric tridiagonal matrix.\n  *\n  * The tridiagonal matrix T is passed to the output parameters \\p diag and \\p subdiag. If\n  * \\p extractQ is true, then the orthogonal matrix Q is passed to \\p mat. Otherwise the lower\n  * part of the matrix \\p mat is destroyed.\n  *\n  * The vectors \\p diag and \\p subdiag are not resized. The function\n  * assumes that they are already of the correct size. The length of the\n  * vector \\p diag should equal the number of rows in \\p mat, and the\n  * length of the vector \\p subdiag should be one left.\n  *\n  * This implementation contains an optimized path for 3-by-3 matrices\n  * which is especially useful for plane fitting.\n  *\n  * \\note Currently, it requires two temporary vectors to hold the intermediate\n  * Householder coefficients, and to reconstruct the matrix Q from the Householder\n  * reflectors.\n  *\n  * Example (this uses the same matrix as the example in\n  *    Tridiagonalization::Tridiagonalization(const MatrixType&)):\n  *    \\include Tridiagonalization_decomposeInPlace.cpp\n  * Output: \\verbinclude Tridiagonalization_decomposeInPlace.out\n  *\n  * \\sa class Tridiagonalization\n  */\ntemplate<typename MatrixType, typename DiagonalType, typename SubDiagonalType>\nvoid tridiagonalization_inplace(MatrixType& mat, DiagonalType& diag, SubDiagonalType& subdiag, bool extractQ)\n{\n  eigen_assert(mat.cols()==mat.rows() && diag.size()==mat.rows() && subdiag.size()==mat.rows()-1);\n  tridiagonalization_inplace_selector<MatrixType>::run(mat, diag, subdiag, extractQ);\n}\n\n/** \\internal\n  * General full tridiagonalization\n  */\ntemplate<typename MatrixType, int Size, bool IsComplex>\nstruct tridiagonalization_inplace_selector\n{\n  typedef typename Tridiagonalization<MatrixType>::CoeffVectorType CoeffVectorType;\n  typedef typename Tridiagonalization<MatrixType>::HouseholderSequenceType HouseholderSequenceType;\n  typedef typename MatrixType::Index Index;\n  template<typename DiagonalType, typename SubDiagonalType>\n  static void run(MatrixType& mat, DiagonalType& diag, SubDiagonalType& subdiag, bool extractQ)\n  {\n    CoeffVectorType hCoeffs(mat.cols()-1);\n    tridiagonalization_inplace(mat,hCoeffs);\n    diag = mat.diagonal().real();\n    subdiag = mat.template diagonal<-1>().real();\n    if(extractQ)\n      mat = HouseholderSequenceType(mat, hCoeffs.conjugate())\n            .setLength(mat.rows() - 1)\n            .setShift(1);\n  }\n};\n\n/** \\internal\n  * Specialization for 3x3 real matrices.\n  * Especially useful for plane fitting.\n  */\ntemplate<typename MatrixType>\nstruct tridiagonalization_inplace_selector<MatrixType,3,false>\n{\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename MatrixType::RealScalar RealScalar;\n\n  template<typename DiagonalType, typename SubDiagonalType>\n  static void run(MatrixType& mat, DiagonalType& diag, SubDiagonalType& subdiag, bool extractQ)\n  {\n    using std::sqrt;\n    diag[0] = mat(0,0);\n    RealScalar v1norm2 = numext::abs2(mat(2,0));\n    if(v1norm2 == RealScalar(0))\n    {\n      diag[1] = mat(1,1);\n      diag[2] = mat(2,2);\n      subdiag[0] = mat(1,0);\n      subdiag[1] = mat(2,1);\n      if (extractQ)\n        mat.setIdentity();\n    }\n    else\n    {\n      RealScalar beta = sqrt(numext::abs2(mat(1,0)) + v1norm2);\n      RealScalar invBeta = RealScalar(1)/beta;\n      Scalar m01 = mat(1,0) * invBeta;\n      Scalar m02 = mat(2,0) * invBeta;\n      Scalar q = RealScalar(2)*m01*mat(2,1) + m02*(mat(2,2) - mat(1,1));\n      diag[1] = mat(1,1) + m02*q;\n      diag[2] = mat(2,2) - m02*q;\n      subdiag[0] = beta;\n      subdiag[1] = mat(2,1) - m01 * q;\n      if (extractQ)\n      {\n        mat << 1,   0,    0,\n               0, m01,  m02,\n               0, m02, -m01;\n      }\n    }\n  }\n};\n\n/** \\internal\n  * Trivial specialization for 1x1 matrices\n  */\ntemplate<typename MatrixType, bool IsComplex>\nstruct tridiagonalization_inplace_selector<MatrixType,1,IsComplex>\n{\n  typedef typename MatrixType::Scalar Scalar;\n\n  template<typename DiagonalType, typename SubDiagonalType>\n  static void run(MatrixType& mat, DiagonalType& diag, SubDiagonalType&, bool extractQ)\n  {\n    diag(0,0) = numext::real(mat(0,0));\n    if(extractQ)\n      mat(0,0) = Scalar(1);\n  }\n};\n\n/** \\internal\n  * \\eigenvalues_module \\ingroup Eigenvalues_Module\n  *\n  * \\brief Expression type for return value of Tridiagonalization::matrixT()\n  *\n  * \\tparam MatrixType type of underlying dense matrix\n  */\ntemplate<typename MatrixType> struct TridiagonalizationMatrixTReturnType\n: public ReturnByValue<TridiagonalizationMatrixTReturnType<MatrixType> >\n{\n    typedef typename MatrixType::Index Index;\n  public:\n    /** \\brief Constructor.\n      *\n      * \\param[in] mat The underlying dense matrix\n      */\n    TridiagonalizationMatrixTReturnType(const MatrixType& mat) : m_matrix(mat) { }\n\n    template <typename ResultType>\n    inline void evalTo(ResultType& result) const\n    {\n      result.setZero();\n      result.template diagonal<1>() = m_matrix.template diagonal<-1>().conjugate();\n      result.diagonal() = m_matrix.diagonal();\n      result.template diagonal<-1>() = m_matrix.template diagonal<-1>();\n    }\n\n    Index rows() const { return m_matrix.rows(); }\n    Index cols() const { return m_matrix.cols(); }\n\n  protected:\n    typename MatrixType::Nested m_matrix;\n};\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_TRIDIAGONALIZATION_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Geometry/AlignedBox.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_ALIGNEDBOX_H\n#define EIGEN_ALIGNEDBOX_H\n\nnamespace Eigen { \n\n/** \\geometry_module \\ingroup Geometry_Module\n  *\n  *\n  * \\class AlignedBox\n  *\n  * \\brief An axis aligned box\n  *\n  * \\tparam _Scalar the type of the scalar coefficients\n  * \\tparam _AmbientDim the dimension of the ambient space, can be a compile time value or Dynamic.\n  *\n  * This class represents an axis aligned box as a pair of the minimal and maximal corners.\n  * \\warning The result of most methods is undefined when applied to an empty box. You can check for empty boxes using isEmpty().\n  * \\sa alignedboxtypedefs\n  */\ntemplate <typename _Scalar, int _AmbientDim>\nclass AlignedBox\n{\npublic:\nEIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_AmbientDim)\n  enum { AmbientDimAtCompileTime = _AmbientDim };\n  typedef _Scalar                                   Scalar;\n  typedef NumTraits<Scalar>                         ScalarTraits;\n  typedef DenseIndex                                Index;\n  typedef typename ScalarTraits::Real               RealScalar;\n  typedef typename ScalarTraits::NonInteger      NonInteger;\n  typedef Matrix<Scalar,AmbientDimAtCompileTime,1>  VectorType;\n\n  /** Define constants to name the corners of a 1D, 2D or 3D axis aligned bounding box */\n  enum CornerType\n  {\n    /** 1D names @{ */\n    Min=0, Max=1,\n    /** @} */\n\n    /** Identifier for 2D corner @{ */\n    BottomLeft=0, BottomRight=1,\n    TopLeft=2, TopRight=3,\n    /** @} */\n\n    /** Identifier for 3D corner  @{ */\n    BottomLeftFloor=0, BottomRightFloor=1,\n    TopLeftFloor=2, TopRightFloor=3,\n    BottomLeftCeil=4, BottomRightCeil=5,\n    TopLeftCeil=6, TopRightCeil=7\n    /** @} */\n  };\n\n\n  /** Default constructor initializing a null box. */\n  inline AlignedBox()\n  { if (AmbientDimAtCompileTime!=Dynamic) setEmpty(); }\n\n  /** Constructs a null box with \\a _dim the dimension of the ambient space. */\n  inline explicit AlignedBox(Index _dim) : m_min(_dim), m_max(_dim)\n  { setEmpty(); }\n\n  /** Constructs a box with extremities \\a _min and \\a _max.\n   * \\warning If either component of \\a _min is larger than the same component of \\a _max, the constructed box is empty. */\n  template<typename OtherVectorType1, typename OtherVectorType2>\n  inline AlignedBox(const OtherVectorType1& _min, const OtherVectorType2& _max) : m_min(_min), m_max(_max) {}\n\n  /** Constructs a box containing a single point \\a p. */\n  template<typename Derived>\n  inline explicit AlignedBox(const MatrixBase<Derived>& p) : m_min(p), m_max(m_min)\n  { }\n\n  ~AlignedBox() {}\n\n  /** \\returns the dimension in which the box holds */\n  inline Index dim() const { return AmbientDimAtCompileTime==Dynamic ? m_min.size() : Index(AmbientDimAtCompileTime); }\n\n  /** \\deprecated use isEmpty() */\n  inline bool isNull() const { return isEmpty(); }\n\n  /** \\deprecated use setEmpty() */\n  inline void setNull() { setEmpty(); }\n\n  /** \\returns true if the box is empty.\n   * \\sa setEmpty */\n  inline bool isEmpty() const { return (m_min.array() > m_max.array()).any(); }\n\n  /** Makes \\c *this an empty box.\n   * \\sa isEmpty */\n  inline void setEmpty()\n  {\n    m_min.setConstant( ScalarTraits::highest() );\n    m_max.setConstant( ScalarTraits::lowest() );\n  }\n\n  /** \\returns the minimal corner */\n  inline const VectorType& (min)() const { return m_min; }\n  /** \\returns a non const reference to the minimal corner */\n  inline VectorType& (min)() { return m_min; }\n  /** \\returns the maximal corner */\n  inline const VectorType& (max)() const { return m_max; }\n  /** \\returns a non const reference to the maximal corner */\n  inline VectorType& (max)() { return m_max; }\n\n  /** \\returns the center of the box */\n  inline const CwiseUnaryOp<internal::scalar_quotient1_op<Scalar>,\n                            const CwiseBinaryOp<internal::scalar_sum_op<Scalar>, const VectorType, const VectorType> >\n  center() const\n  { return (m_min+m_max)/2; }\n\n  /** \\returns the lengths of the sides of the bounding box.\n    * Note that this function does not get the same\n    * result for integral or floating scalar types: see\n    */\n  inline const CwiseBinaryOp< internal::scalar_difference_op<Scalar>, const VectorType, const VectorType> sizes() const\n  { return m_max - m_min; }\n\n  /** \\returns the volume of the bounding box */\n  inline Scalar volume() const\n  { return sizes().prod(); }\n\n  /** \\returns an expression for the bounding box diagonal vector\n    * if the length of the diagonal is needed: diagonal().norm()\n    * will provide it.\n    */\n  inline CwiseBinaryOp< internal::scalar_difference_op<Scalar>, const VectorType, const VectorType> diagonal() const\n  { return sizes(); }\n\n  /** \\returns the vertex of the bounding box at the corner defined by\n    * the corner-id corner. It works only for a 1D, 2D or 3D bounding box.\n    * For 1D bounding boxes corners are named by 2 enum constants:\n    * BottomLeft and BottomRight.\n    * For 2D bounding boxes, corners are named by 4 enum constants:\n    * BottomLeft, BottomRight, TopLeft, TopRight.\n    * For 3D bounding boxes, the following names are added:\n    * BottomLeftCeil, BottomRightCeil, TopLeftCeil, TopRightCeil.\n    */\n  inline VectorType corner(CornerType corner) const\n  {\n    EIGEN_STATIC_ASSERT(_AmbientDim <= 3, THIS_METHOD_IS_ONLY_FOR_VECTORS_OF_A_SPECIFIC_SIZE);\n\n    VectorType res;\n\n    Index mult = 1;\n    for(Index d=0; d<dim(); ++d)\n    {\n      if( mult & corner ) res[d] = m_max[d];\n      else                res[d] = m_min[d];\n      mult *= 2;\n    }\n    return res;\n  }\n\n  /** \\returns a random point inside the bounding box sampled with\n   * a uniform distribution */\n  inline VectorType sample() const\n  {\n    VectorType r(dim());\n    for(Index d=0; d<dim(); ++d)\n    {\n      if(!ScalarTraits::IsInteger)\n      {\n        r[d] = m_min[d] + (m_max[d]-m_min[d])\n             * internal::random<Scalar>(Scalar(0), Scalar(1));\n      }\n      else\n        r[d] = internal::random(m_min[d], m_max[d]);\n    }\n    return r;\n  }\n\n  /** \\returns true if the point \\a p is inside the box \\c *this. */\n  template<typename Derived>\n  inline bool contains(const MatrixBase<Derived>& p) const\n  {\n    typename internal::nested<Derived,2>::type p_n(p.derived());\n    return (m_min.array()<=p_n.array()).all() && (p_n.array()<=m_max.array()).all();\n  }\n\n  /** \\returns true if the box \\a b is entirely inside the box \\c *this. */\n  inline bool contains(const AlignedBox& b) const\n  { return (m_min.array()<=(b.min)().array()).all() && ((b.max)().array()<=m_max.array()).all(); }\n\n  /** \\returns true if the box \\a b is intersecting the box \\c *this.\n   * \\sa intersection, clamp */\n  inline bool intersects(const AlignedBox& b) const\n  { return (m_min.array()<=(b.max)().array()).all() && ((b.min)().array()<=m_max.array()).all(); }\n\n  /** Extends \\c *this such that it contains the point \\a p and returns a reference to \\c *this.\n   * \\sa extend(const AlignedBox&) */\n  template<typename Derived>\n  inline AlignedBox& extend(const MatrixBase<Derived>& p)\n  {\n    typename internal::nested<Derived,2>::type p_n(p.derived());\n    m_min = m_min.cwiseMin(p_n);\n    m_max = m_max.cwiseMax(p_n);\n    return *this;\n  }\n\n  /** Extends \\c *this such that it contains the box \\a b and returns a reference to \\c *this.\n   * \\sa merged, extend(const MatrixBase&) */\n  inline AlignedBox& extend(const AlignedBox& b)\n  {\n    m_min = m_min.cwiseMin(b.m_min);\n    m_max = m_max.cwiseMax(b.m_max);\n    return *this;\n  }\n\n  /** Clamps \\c *this by the box \\a b and returns a reference to \\c *this.\n   * \\note If the boxes don't intersect, the resulting box is empty.\n   * \\sa intersection(), intersects() */\n  inline AlignedBox& clamp(const AlignedBox& b)\n  {\n    m_min = m_min.cwiseMax(b.m_min);\n    m_max = m_max.cwiseMin(b.m_max);\n    return *this;\n  }\n\n  /** Returns an AlignedBox that is the intersection of \\a b and \\c *this\n   * \\note If the boxes don't intersect, the resulting box is empty.\n   * \\sa intersects(), clamp, contains()  */\n  inline AlignedBox intersection(const AlignedBox& b) const\n  {return AlignedBox(m_min.cwiseMax(b.m_min), m_max.cwiseMin(b.m_max)); }\n\n  /** Returns an AlignedBox that is the union of \\a b and \\c *this.\n   * \\note Merging with an empty box may result in a box bigger than \\c *this. \n   * \\sa extend(const AlignedBox&) */\n  inline AlignedBox merged(const AlignedBox& b) const\n  { return AlignedBox(m_min.cwiseMin(b.m_min), m_max.cwiseMax(b.m_max)); }\n\n  /** Translate \\c *this by the vector \\a t and returns a reference to \\c *this. */\n  template<typename Derived>\n  inline AlignedBox& translate(const MatrixBase<Derived>& a_t)\n  {\n    const typename internal::nested<Derived,2>::type t(a_t.derived());\n    m_min += t;\n    m_max += t;\n    return *this;\n  }\n\n  /** \\returns the squared distance between the point \\a p and the box \\c *this,\n    * and zero if \\a p is inside the box.\n    * \\sa exteriorDistance(const MatrixBase&), squaredExteriorDistance(const AlignedBox&)\n    */\n  template<typename Derived>\n  inline Scalar squaredExteriorDistance(const MatrixBase<Derived>& p) const;\n\n  /** \\returns the squared distance between the boxes \\a b and \\c *this,\n    * and zero if the boxes intersect.\n    * \\sa exteriorDistance(const AlignedBox&), squaredExteriorDistance(const MatrixBase&)\n    */\n  inline Scalar squaredExteriorDistance(const AlignedBox& b) const;\n\n  /** \\returns the distance between the point \\a p and the box \\c *this,\n    * and zero if \\a p is inside the box.\n    * \\sa squaredExteriorDistance(const MatrixBase&), exteriorDistance(const AlignedBox&)\n    */\n  template<typename Derived>\n  inline NonInteger exteriorDistance(const MatrixBase<Derived>& p) const\n  { using std::sqrt; return sqrt(NonInteger(squaredExteriorDistance(p))); }\n\n  /** \\returns the distance between the boxes \\a b and \\c *this,\n    * and zero if the boxes intersect.\n    * \\sa squaredExteriorDistance(const AlignedBox&), exteriorDistance(const MatrixBase&)\n    */\n  inline NonInteger exteriorDistance(const AlignedBox& b) const\n  { using std::sqrt; return sqrt(NonInteger(squaredExteriorDistance(b))); }\n\n  /** \\returns \\c *this with scalar type casted to \\a NewScalarType\n    *\n    * Note that if \\a NewScalarType is equal to the current scalar type of \\c *this\n    * then this function smartly returns a const reference to \\c *this.\n    */\n  template<typename NewScalarType>\n  inline typename internal::cast_return_type<AlignedBox,\n           AlignedBox<NewScalarType,AmbientDimAtCompileTime> >::type cast() const\n  {\n    return typename internal::cast_return_type<AlignedBox,\n                    AlignedBox<NewScalarType,AmbientDimAtCompileTime> >::type(*this);\n  }\n\n  /** Copy constructor with scalar type conversion */\n  template<typename OtherScalarType>\n  inline explicit AlignedBox(const AlignedBox<OtherScalarType,AmbientDimAtCompileTime>& other)\n  {\n    m_min = (other.min)().template cast<Scalar>();\n    m_max = (other.max)().template cast<Scalar>();\n  }\n\n  /** \\returns \\c true if \\c *this is approximately equal to \\a other, within the precision\n    * determined by \\a prec.\n    *\n    * \\sa MatrixBase::isApprox() */\n  bool isApprox(const AlignedBox& other, const RealScalar& prec = ScalarTraits::dummy_precision()) const\n  { return m_min.isApprox(other.m_min, prec) && m_max.isApprox(other.m_max, prec); }\n\nprotected:\n\n  VectorType m_min, m_max;\n};\n\n\n\ntemplate<typename Scalar,int AmbientDim>\ntemplate<typename Derived>\ninline Scalar AlignedBox<Scalar,AmbientDim>::squaredExteriorDistance(const MatrixBase<Derived>& a_p) const\n{\n  typename internal::nested<Derived,2*AmbientDim>::type p(a_p.derived());\n  Scalar dist2(0);\n  Scalar aux;\n  for (Index k=0; k<dim(); ++k)\n  {\n    if( m_min[k] > p[k] )\n    {\n      aux = m_min[k] - p[k];\n      dist2 += aux*aux;\n    }\n    else if( p[k] > m_max[k] )\n    {\n      aux = p[k] - m_max[k];\n      dist2 += aux*aux;\n    }\n  }\n  return dist2;\n}\n\ntemplate<typename Scalar,int AmbientDim>\ninline Scalar AlignedBox<Scalar,AmbientDim>::squaredExteriorDistance(const AlignedBox& b) const\n{\n  Scalar dist2(0);\n  Scalar aux;\n  for (Index k=0; k<dim(); ++k)\n  {\n    if( m_min[k] > b.m_max[k] )\n    {\n      aux = m_min[k] - b.m_max[k];\n      dist2 += aux*aux;\n    }\n    else if( b.m_min[k] > m_max[k] )\n    {\n      aux = b.m_min[k] - m_max[k];\n      dist2 += aux*aux;\n    }\n  }\n  return dist2;\n}\n\n/** \\defgroup alignedboxtypedefs Global aligned box typedefs\n  *\n  * \\ingroup Geometry_Module\n  *\n  * Eigen defines several typedef shortcuts for most common aligned box types.\n  *\n  * The general patterns are the following:\n  *\n  * \\c AlignedBoxSizeType where \\c Size can be \\c 1, \\c 2,\\c 3,\\c 4 for fixed size boxes or \\c X for dynamic size,\n  * and where \\c Type can be \\c i for integer, \\c f for float, \\c d for double.\n  *\n  * For example, \\c AlignedBox3d is a fixed-size 3x3 aligned box type of doubles, and \\c AlignedBoxXf is a dynamic-size aligned box of floats.\n  *\n  * \\sa class AlignedBox\n  */\n\n#define EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, Size, SizeSuffix)    \\\n/** \\ingroup alignedboxtypedefs */                                 \\\ntypedef AlignedBox<Type, Size>   AlignedBox##SizeSuffix##TypeSuffix;\n\n#define EIGEN_MAKE_TYPEDEFS_ALL_SIZES(Type, TypeSuffix) \\\nEIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 1, 1) \\\nEIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 2, 2) \\\nEIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 3, 3) \\\nEIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 4, 4) \\\nEIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, Dynamic, X)\n\nEIGEN_MAKE_TYPEDEFS_ALL_SIZES(int,                  i)\nEIGEN_MAKE_TYPEDEFS_ALL_SIZES(float,                f)\nEIGEN_MAKE_TYPEDEFS_ALL_SIZES(double,               d)\n\n#undef EIGEN_MAKE_TYPEDEFS_ALL_SIZES\n#undef EIGEN_MAKE_TYPEDEFS\n\n} // end namespace Eigen\n\n#endif // EIGEN_ALIGNEDBOX_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Geometry/AngleAxis.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_ANGLEAXIS_H\n#define EIGEN_ANGLEAXIS_H\n\nnamespace Eigen { \n\n/** \\geometry_module \\ingroup Geometry_Module\n  *\n  * \\class AngleAxis\n  *\n  * \\brief Represents a 3D rotation as a rotation angle around an arbitrary 3D axis\n  *\n  * \\param _Scalar the scalar type, i.e., the type of the coefficients.\n  *\n  * \\warning When setting up an AngleAxis object, the axis vector \\b must \\b be \\b normalized.\n  *\n  * The following two typedefs are provided for convenience:\n  * \\li \\c AngleAxisf for \\c float\n  * \\li \\c AngleAxisd for \\c double\n  *\n  * Combined with MatrixBase::Unit{X,Y,Z}, AngleAxis can be used to easily\n  * mimic Euler-angles. Here is an example:\n  * \\include AngleAxis_mimic_euler.cpp\n  * Output: \\verbinclude AngleAxis_mimic_euler.out\n  *\n  * \\note This class is not aimed to be used to store a rotation transformation,\n  * but rather to make easier the creation of other rotation (Quaternion, rotation Matrix)\n  * and transformation objects.\n  *\n  * \\sa class Quaternion, class Transform, MatrixBase::UnitX()\n  */\n\nnamespace internal {\ntemplate<typename _Scalar> struct traits<AngleAxis<_Scalar> >\n{\n  typedef _Scalar Scalar;\n};\n}\n\ntemplate<typename _Scalar>\nclass AngleAxis : public RotationBase<AngleAxis<_Scalar>,3>\n{\n  typedef RotationBase<AngleAxis<_Scalar>,3> Base;\n\npublic:\n\n  using Base::operator*;\n\n  enum { Dim = 3 };\n  /** the scalar type of the coefficients */\n  typedef _Scalar Scalar;\n  typedef Matrix<Scalar,3,3> Matrix3;\n  typedef Matrix<Scalar,3,1> Vector3;\n  typedef Quaternion<Scalar> QuaternionType;\n\nprotected:\n\n  Vector3 m_axis;\n  Scalar m_angle;\n\npublic:\n\n  /** Default constructor without initialization. */\n  AngleAxis() {}\n  /** Constructs and initialize the angle-axis rotation from an \\a angle in radian\n    * and an \\a axis which \\b must \\b be \\b normalized.\n    *\n    * \\warning If the \\a axis vector is not normalized, then the angle-axis object\n    *          represents an invalid rotation. */\n  template<typename Derived>\n  inline AngleAxis(const Scalar& angle, const MatrixBase<Derived>& axis) : m_axis(axis), m_angle(angle) {}\n  /** Constructs and initialize the angle-axis rotation from a quaternion \\a q. */\n  template<typename QuatDerived> inline explicit AngleAxis(const QuaternionBase<QuatDerived>& q) { *this = q; }\n  /** Constructs and initialize the angle-axis rotation from a 3x3 rotation matrix. */\n  template<typename Derived>\n  inline explicit AngleAxis(const MatrixBase<Derived>& m) { *this = m; }\n\n  /** \\returns the value of the rotation angle in radian */\n  Scalar angle() const { return m_angle; }\n  /** \\returns a read-write reference to the stored angle in radian */\n  Scalar& angle() { return m_angle; }\n\n  /** \\returns the rotation axis */\n  const Vector3& axis() const { return m_axis; }\n  /** \\returns a read-write reference to the stored rotation axis.\n    *\n    * \\warning The rotation axis must remain a \\b unit vector.\n    */\n  Vector3& axis() { return m_axis; }\n\n  /** Concatenates two rotations */\n  inline QuaternionType operator* (const AngleAxis& other) const\n  { return QuaternionType(*this) * QuaternionType(other); }\n\n  /** Concatenates two rotations */\n  inline QuaternionType operator* (const QuaternionType& other) const\n  { return QuaternionType(*this) * other; }\n\n  /** Concatenates two rotations */\n  friend inline QuaternionType operator* (const QuaternionType& a, const AngleAxis& b)\n  { return a * QuaternionType(b); }\n\n  /** \\returns the inverse rotation, i.e., an angle-axis with opposite rotation angle */\n  AngleAxis inverse() const\n  { return AngleAxis(-m_angle, m_axis); }\n\n  template<class QuatDerived>\n  AngleAxis& operator=(const QuaternionBase<QuatDerived>& q);\n  template<typename Derived>\n  AngleAxis& operator=(const MatrixBase<Derived>& m);\n\n  template<typename Derived>\n  AngleAxis& fromRotationMatrix(const MatrixBase<Derived>& m);\n  Matrix3 toRotationMatrix(void) const;\n\n  /** \\returns \\c *this with scalar type casted to \\a NewScalarType\n    *\n    * Note that if \\a NewScalarType is equal to the current scalar type of \\c *this\n    * then this function smartly returns a const reference to \\c *this.\n    */\n  template<typename NewScalarType>\n  inline typename internal::cast_return_type<AngleAxis,AngleAxis<NewScalarType> >::type cast() const\n  { return typename internal::cast_return_type<AngleAxis,AngleAxis<NewScalarType> >::type(*this); }\n\n  /** Copy constructor with scalar type conversion */\n  template<typename OtherScalarType>\n  inline explicit AngleAxis(const AngleAxis<OtherScalarType>& other)\n  {\n    m_axis = other.axis().template cast<Scalar>();\n    m_angle = Scalar(other.angle());\n  }\n\n  static inline const AngleAxis Identity() { return AngleAxis(Scalar(0), Vector3::UnitX()); }\n\n  /** \\returns \\c true if \\c *this is approximately equal to \\a other, within the precision\n    * determined by \\a prec.\n    *\n    * \\sa MatrixBase::isApprox() */\n  bool isApprox(const AngleAxis& other, const typename NumTraits<Scalar>::Real& prec = NumTraits<Scalar>::dummy_precision()) const\n  { return m_axis.isApprox(other.m_axis, prec) && internal::isApprox(m_angle,other.m_angle, prec); }\n};\n\n/** \\ingroup Geometry_Module\n  * single precision angle-axis type */\ntypedef AngleAxis<float> AngleAxisf;\n/** \\ingroup Geometry_Module\n  * double precision angle-axis type */\ntypedef AngleAxis<double> AngleAxisd;\n\n/** Set \\c *this from a \\b unit quaternion.\n  * The axis is normalized.\n  * \n  * \\warning As any other method dealing with quaternion, if the input quaternion\n  *          is not normalized then the result is undefined.\n  */\ntemplate<typename Scalar>\ntemplate<typename QuatDerived>\nAngleAxis<Scalar>& AngleAxis<Scalar>::operator=(const QuaternionBase<QuatDerived>& q)\n{\n  using std::acos;\n  using std::min;\n  using std::max;\n  using std::sqrt;\n  Scalar n2 = q.vec().squaredNorm();\n  if (n2 < NumTraits<Scalar>::dummy_precision()*NumTraits<Scalar>::dummy_precision())\n  {\n    m_angle = Scalar(0);\n    m_axis << Scalar(1), Scalar(0), Scalar(0);\n  }\n  else\n  {\n    m_angle = Scalar(2)*acos((min)((max)(Scalar(-1),q.w()),Scalar(1)));\n    m_axis = q.vec() / sqrt(n2);\n  }\n  return *this;\n}\n\n/** Set \\c *this from a 3x3 rotation matrix \\a mat.\n  */\ntemplate<typename Scalar>\ntemplate<typename Derived>\nAngleAxis<Scalar>& AngleAxis<Scalar>::operator=(const MatrixBase<Derived>& mat)\n{\n  // Since a direct conversion would not be really faster,\n  // let's use the robust Quaternion implementation:\n  return *this = QuaternionType(mat);\n}\n\n/**\n* \\brief Sets \\c *this from a 3x3 rotation matrix.\n**/\ntemplate<typename Scalar>\ntemplate<typename Derived>\nAngleAxis<Scalar>& AngleAxis<Scalar>::fromRotationMatrix(const MatrixBase<Derived>& mat)\n{\n  return *this = QuaternionType(mat);\n}\n\n/** Constructs and \\returns an equivalent 3x3 rotation matrix.\n  */\ntemplate<typename Scalar>\ntypename AngleAxis<Scalar>::Matrix3\nAngleAxis<Scalar>::toRotationMatrix(void) const\n{\n  using std::sin;\n  using std::cos;\n  Matrix3 res;\n  Vector3 sin_axis  = sin(m_angle) * m_axis;\n  Scalar c = cos(m_angle);\n  Vector3 cos1_axis = (Scalar(1)-c) * m_axis;\n\n  Scalar tmp;\n  tmp = cos1_axis.x() * m_axis.y();\n  res.coeffRef(0,1) = tmp - sin_axis.z();\n  res.coeffRef(1,0) = tmp + sin_axis.z();\n\n  tmp = cos1_axis.x() * m_axis.z();\n  res.coeffRef(0,2) = tmp + sin_axis.y();\n  res.coeffRef(2,0) = tmp - sin_axis.y();\n\n  tmp = cos1_axis.y() * m_axis.z();\n  res.coeffRef(1,2) = tmp - sin_axis.x();\n  res.coeffRef(2,1) = tmp + sin_axis.x();\n\n  res.diagonal() = (cos1_axis.cwiseProduct(m_axis)).array() + c;\n\n  return res;\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_ANGLEAXIS_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Geometry/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_Geometry_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_Geometry_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/Geometry COMPONENT Devel\n  )\n\nADD_SUBDIRECTORY(arch)\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Geometry/EulerAngles.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_EULERANGLES_H\n#define EIGEN_EULERANGLES_H\n\nnamespace Eigen { \n\n/** \\geometry_module \\ingroup Geometry_Module\n  *\n  *\n  * \\returns the Euler-angles of the rotation matrix \\c *this using the convention defined by the triplet (\\a a0,\\a a1,\\a a2)\n  *\n  * Each of the three parameters \\a a0,\\a a1,\\a a2 represents the respective rotation axis as an integer in {0,1,2}.\n  * For instance, in:\n  * \\code Vector3f ea = mat.eulerAngles(2, 0, 2); \\endcode\n  * \"2\" represents the z axis and \"0\" the x axis, etc. The returned angles are such that\n  * we have the following equality:\n  * \\code\n  * mat == AngleAxisf(ea[0], Vector3f::UnitZ())\n  *      * AngleAxisf(ea[1], Vector3f::UnitX())\n  *      * AngleAxisf(ea[2], Vector3f::UnitZ()); \\endcode\n  * This corresponds to the right-multiply conventions (with right hand side frames).\n  * \n  * The returned angles are in the ranges [0:pi]x[-pi:pi]x[-pi:pi].\n  * \n  * \\sa class AngleAxis\n  */\ntemplate<typename Derived>\ninline Matrix<typename MatrixBase<Derived>::Scalar,3,1>\nMatrixBase<Derived>::eulerAngles(Index a0, Index a1, Index a2) const\n{\n  using std::atan2;\n  using std::sin;\n  using std::cos;\n  /* Implemented from Graphics Gems IV */\n  EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Derived,3,3)\n\n  Matrix<Scalar,3,1> res;\n  typedef Matrix<typename Derived::Scalar,2,1> Vector2;\n\n  const Index odd = ((a0+1)%3 == a1) ? 0 : 1;\n  const Index i = a0;\n  const Index j = (a0 + 1 + odd)%3;\n  const Index k = (a0 + 2 - odd)%3;\n  \n  if (a0==a2)\n  {\n    res[0] = atan2(coeff(j,i), coeff(k,i));\n    if((odd && res[0]<Scalar(0)) || ((!odd) && res[0]>Scalar(0)))\n    {\n      res[0] = (res[0] > Scalar(0)) ? res[0] - Scalar(M_PI) : res[0] + Scalar(M_PI);\n      Scalar s2 = Vector2(coeff(j,i), coeff(k,i)).norm();\n      res[1] = -atan2(s2, coeff(i,i));\n    }\n    else\n    {\n      Scalar s2 = Vector2(coeff(j,i), coeff(k,i)).norm();\n      res[1] = atan2(s2, coeff(i,i));\n    }\n    \n    // With a=(0,1,0), we have i=0; j=1; k=2, and after computing the first two angles,\n    // we can compute their respective rotation, and apply its inverse to M. Since the result must\n    // be a rotation around x, we have:\n    //\n    //  c2  s1.s2 c1.s2                   1  0   0 \n    //  0   c1    -s1       *    M    =   0  c3  s3\n    //  -s2 s1.c2 c1.c2                   0 -s3  c3\n    //\n    //  Thus:  m11.c1 - m21.s1 = c3  &   m12.c1 - m22.s1 = s3\n    \n    Scalar s1 = sin(res[0]);\n    Scalar c1 = cos(res[0]);\n    res[2] = atan2(c1*coeff(j,k)-s1*coeff(k,k), c1*coeff(j,j) - s1 * coeff(k,j));\n  } \n  else\n  {\n    res[0] = atan2(coeff(j,k), coeff(k,k));\n    Scalar c2 = Vector2(coeff(i,i), coeff(i,j)).norm();\n    if((odd && res[0]<Scalar(0)) || ((!odd) && res[0]>Scalar(0))) {\n      res[0] = (res[0] > Scalar(0)) ? res[0] - Scalar(M_PI) : res[0] + Scalar(M_PI);\n      res[1] = atan2(-coeff(i,k), -c2);\n    }\n    else\n      res[1] = atan2(-coeff(i,k), c2);\n    Scalar s1 = sin(res[0]);\n    Scalar c1 = cos(res[0]);\n    res[2] = atan2(s1*coeff(k,i)-c1*coeff(j,i), c1*coeff(j,j) - s1 * coeff(k,j));\n  }\n  if (!odd)\n    res = -res;\n  \n  return res;\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_EULERANGLES_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Geometry/Homogeneous.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_HOMOGENEOUS_H\n#define EIGEN_HOMOGENEOUS_H\n\nnamespace Eigen { \n\n/** \\geometry_module \\ingroup Geometry_Module\n  *\n  * \\class Homogeneous\n  *\n  * \\brief Expression of one (or a set of) homogeneous vector(s)\n  *\n  * \\param MatrixType the type of the object in which we are making homogeneous\n  *\n  * This class represents an expression of one (or a set of) homogeneous vector(s).\n  * It is the return type of MatrixBase::homogeneous() and most of the time\n  * this is the only way it is used.\n  *\n  * \\sa MatrixBase::homogeneous()\n  */\n\nnamespace internal {\n\ntemplate<typename MatrixType,int Direction>\nstruct traits<Homogeneous<MatrixType,Direction> >\n : traits<MatrixType>\n{\n  typedef typename traits<MatrixType>::StorageKind StorageKind;\n  typedef typename nested<MatrixType>::type MatrixTypeNested;\n  typedef typename remove_reference<MatrixTypeNested>::type _MatrixTypeNested;\n  enum {\n    RowsPlusOne = (MatrixType::RowsAtCompileTime != Dynamic) ?\n                  int(MatrixType::RowsAtCompileTime) + 1 : Dynamic,\n    ColsPlusOne = (MatrixType::ColsAtCompileTime != Dynamic) ?\n                  int(MatrixType::ColsAtCompileTime) + 1 : Dynamic,\n    RowsAtCompileTime = Direction==Vertical  ?  RowsPlusOne : MatrixType::RowsAtCompileTime,\n    ColsAtCompileTime = Direction==Horizontal ? ColsPlusOne : MatrixType::ColsAtCompileTime,\n    MaxRowsAtCompileTime = RowsAtCompileTime,\n    MaxColsAtCompileTime = ColsAtCompileTime,\n    TmpFlags = _MatrixTypeNested::Flags & HereditaryBits,\n    Flags = ColsAtCompileTime==1 ? (TmpFlags & ~RowMajorBit)\n          : RowsAtCompileTime==1 ? (TmpFlags | RowMajorBit)\n          : TmpFlags,\n    CoeffReadCost = _MatrixTypeNested::CoeffReadCost\n  };\n};\n\ntemplate<typename MatrixType,typename Lhs> struct homogeneous_left_product_impl;\ntemplate<typename MatrixType,typename Rhs> struct homogeneous_right_product_impl;\n\n} // end namespace internal\n\ntemplate<typename MatrixType,int _Direction> class Homogeneous\n  : internal::no_assignment_operator, public MatrixBase<Homogeneous<MatrixType,_Direction> >\n{\n  public:\n\n    enum { Direction = _Direction };\n\n    typedef MatrixBase<Homogeneous> Base;\n    EIGEN_DENSE_PUBLIC_INTERFACE(Homogeneous)\n\n    inline Homogeneous(const MatrixType& matrix)\n      : m_matrix(matrix)\n    {}\n\n    inline Index rows() const { return m_matrix.rows() + (int(Direction)==Vertical   ? 1 : 0); }\n    inline Index cols() const { return m_matrix.cols() + (int(Direction)==Horizontal ? 1 : 0); }\n\n    inline Scalar coeff(Index row, Index col=0) const\n    {\n      if(  (int(Direction)==Vertical   && row==m_matrix.rows())\n        || (int(Direction)==Horizontal && col==m_matrix.cols()))\n        return Scalar(1);\n      return m_matrix.coeff(row, col);\n    }\n\n    template<typename Rhs>\n    inline const internal::homogeneous_right_product_impl<Homogeneous,Rhs>\n    operator* (const MatrixBase<Rhs>& rhs) const\n    {\n      eigen_assert(int(Direction)==Horizontal);\n      return internal::homogeneous_right_product_impl<Homogeneous,Rhs>(m_matrix,rhs.derived());\n    }\n\n    template<typename Lhs> friend\n    inline const internal::homogeneous_left_product_impl<Homogeneous,Lhs>\n    operator* (const MatrixBase<Lhs>& lhs, const Homogeneous& rhs)\n    {\n      eigen_assert(int(Direction)==Vertical);\n      return internal::homogeneous_left_product_impl<Homogeneous,Lhs>(lhs.derived(),rhs.m_matrix);\n    }\n\n    template<typename Scalar, int Dim, int Mode, int Options> friend\n    inline const internal::homogeneous_left_product_impl<Homogeneous,Transform<Scalar,Dim,Mode,Options> >\n    operator* (const Transform<Scalar,Dim,Mode,Options>& lhs, const Homogeneous& rhs)\n    {\n      eigen_assert(int(Direction)==Vertical);\n      return internal::homogeneous_left_product_impl<Homogeneous,Transform<Scalar,Dim,Mode,Options> >(lhs,rhs.m_matrix);\n    }\n\n  protected:\n    typename MatrixType::Nested m_matrix;\n};\n\n/** \\geometry_module\n  *\n  * \\return an expression of the equivalent homogeneous vector\n  *\n  * \\only_for_vectors\n  *\n  * Example: \\include MatrixBase_homogeneous.cpp\n  * Output: \\verbinclude MatrixBase_homogeneous.out\n  *\n  * \\sa class Homogeneous\n  */\ntemplate<typename Derived>\ninline typename MatrixBase<Derived>::HomogeneousReturnType\nMatrixBase<Derived>::homogeneous() const\n{\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);\n  return derived();\n}\n\n/** \\geometry_module\n  *\n  * \\returns a matrix expression of homogeneous column (or row) vectors\n  *\n  * Example: \\include VectorwiseOp_homogeneous.cpp\n  * Output: \\verbinclude VectorwiseOp_homogeneous.out\n  *\n  * \\sa MatrixBase::homogeneous() */\ntemplate<typename ExpressionType, int Direction>\ninline Homogeneous<ExpressionType,Direction>\nVectorwiseOp<ExpressionType,Direction>::homogeneous() const\n{\n  return _expression();\n}\n\n/** \\geometry_module\n  *\n  * \\returns an expression of the homogeneous normalized vector of \\c *this\n  *\n  * Example: \\include MatrixBase_hnormalized.cpp\n  * Output: \\verbinclude MatrixBase_hnormalized.out\n  *\n  * \\sa VectorwiseOp::hnormalized() */\ntemplate<typename Derived>\ninline const typename MatrixBase<Derived>::HNormalizedReturnType\nMatrixBase<Derived>::hnormalized() const\n{\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);\n  return ConstStartMinusOne(derived(),0,0,\n    ColsAtCompileTime==1?size()-1:1,\n    ColsAtCompileTime==1?1:size()-1) / coeff(size()-1);\n}\n\n/** \\geometry_module\n  *\n  * \\returns an expression of the homogeneous normalized vector of \\c *this\n  *\n  * Example: \\include DirectionWise_hnormalized.cpp\n  * Output: \\verbinclude DirectionWise_hnormalized.out\n  *\n  * \\sa MatrixBase::hnormalized() */\ntemplate<typename ExpressionType, int Direction>\ninline const typename VectorwiseOp<ExpressionType,Direction>::HNormalizedReturnType\nVectorwiseOp<ExpressionType,Direction>::hnormalized() const\n{\n  return HNormalized_Block(_expression(),0,0,\n      Direction==Vertical   ? _expression().rows()-1 : _expression().rows(),\n      Direction==Horizontal ? _expression().cols()-1 : _expression().cols()).cwiseQuotient(\n      Replicate<HNormalized_Factors,\n                Direction==Vertical   ? HNormalized_SizeMinusOne : 1,\n                Direction==Horizontal ? HNormalized_SizeMinusOne : 1>\n        (HNormalized_Factors(_expression(),\n          Direction==Vertical    ? _expression().rows()-1:0,\n          Direction==Horizontal  ? _expression().cols()-1:0,\n          Direction==Vertical    ? 1 : _expression().rows(),\n          Direction==Horizontal  ? 1 : _expression().cols()),\n         Direction==Vertical   ? _expression().rows()-1 : 1,\n         Direction==Horizontal ? _expression().cols()-1 : 1));\n}\n\nnamespace internal {\n\ntemplate<typename MatrixOrTransformType>\nstruct take_matrix_for_product\n{\n  typedef MatrixOrTransformType type;\n  static const type& run(const type &x) { return x; }\n};\n\ntemplate<typename Scalar, int Dim, int Mode,int Options>\nstruct take_matrix_for_product<Transform<Scalar, Dim, Mode, Options> >\n{\n  typedef Transform<Scalar, Dim, Mode, Options> TransformType;\n  typedef typename internal::add_const<typename TransformType::ConstAffinePart>::type type;\n  static type run (const TransformType& x) { return x.affine(); }\n};\n\ntemplate<typename Scalar, int Dim, int Options>\nstruct take_matrix_for_product<Transform<Scalar, Dim, Projective, Options> >\n{\n  typedef Transform<Scalar, Dim, Projective, Options> TransformType;\n  typedef typename TransformType::MatrixType type;\n  static const type& run (const TransformType& x) { return x.matrix(); }\n};\n\ntemplate<typename MatrixType,typename Lhs>\nstruct traits<homogeneous_left_product_impl<Homogeneous<MatrixType,Vertical>,Lhs> >\n{\n  typedef typename take_matrix_for_product<Lhs>::type LhsMatrixType;\n  typedef typename remove_all<MatrixType>::type MatrixTypeCleaned;\n  typedef typename remove_all<LhsMatrixType>::type LhsMatrixTypeCleaned;\n  typedef typename make_proper_matrix_type<\n                 typename traits<MatrixTypeCleaned>::Scalar,\n                 LhsMatrixTypeCleaned::RowsAtCompileTime,\n                 MatrixTypeCleaned::ColsAtCompileTime,\n                 MatrixTypeCleaned::PlainObject::Options,\n                 LhsMatrixTypeCleaned::MaxRowsAtCompileTime,\n                 MatrixTypeCleaned::MaxColsAtCompileTime>::type ReturnType;\n};\n\ntemplate<typename MatrixType,typename Lhs>\nstruct homogeneous_left_product_impl<Homogeneous<MatrixType,Vertical>,Lhs>\n  : public ReturnByValue<homogeneous_left_product_impl<Homogeneous<MatrixType,Vertical>,Lhs> >\n{\n  typedef typename traits<homogeneous_left_product_impl>::LhsMatrixType LhsMatrixType;\n  typedef typename remove_all<LhsMatrixType>::type LhsMatrixTypeCleaned;\n  typedef typename remove_all<typename LhsMatrixTypeCleaned::Nested>::type LhsMatrixTypeNested;\n  typedef typename MatrixType::Index Index;\n  homogeneous_left_product_impl(const Lhs& lhs, const MatrixType& rhs)\n    : m_lhs(take_matrix_for_product<Lhs>::run(lhs)),\n      m_rhs(rhs)\n  {}\n\n  inline Index rows() const { return m_lhs.rows(); }\n  inline Index cols() const { return m_rhs.cols(); }\n\n  template<typename Dest> void evalTo(Dest& dst) const\n  {\n    // FIXME investigate how to allow lazy evaluation of this product when possible\n    dst = Block<const LhsMatrixTypeNested,\n              LhsMatrixTypeNested::RowsAtCompileTime,\n              LhsMatrixTypeNested::ColsAtCompileTime==Dynamic?Dynamic:LhsMatrixTypeNested::ColsAtCompileTime-1>\n            (m_lhs,0,0,m_lhs.rows(),m_lhs.cols()-1) * m_rhs;\n    dst += m_lhs.col(m_lhs.cols()-1).rowwise()\n            .template replicate<MatrixType::ColsAtCompileTime>(m_rhs.cols());\n  }\n\n  typename LhsMatrixTypeCleaned::Nested m_lhs;\n  typename MatrixType::Nested m_rhs;\n};\n\ntemplate<typename MatrixType,typename Rhs>\nstruct traits<homogeneous_right_product_impl<Homogeneous<MatrixType,Horizontal>,Rhs> >\n{\n  typedef typename make_proper_matrix_type<typename traits<MatrixType>::Scalar,\n                 MatrixType::RowsAtCompileTime,\n                 Rhs::ColsAtCompileTime,\n                 MatrixType::PlainObject::Options,\n                 MatrixType::MaxRowsAtCompileTime,\n                 Rhs::MaxColsAtCompileTime>::type ReturnType;\n};\n\ntemplate<typename MatrixType,typename Rhs>\nstruct homogeneous_right_product_impl<Homogeneous<MatrixType,Horizontal>,Rhs>\n  : public ReturnByValue<homogeneous_right_product_impl<Homogeneous<MatrixType,Horizontal>,Rhs> >\n{\n  typedef typename remove_all<typename Rhs::Nested>::type RhsNested;\n  typedef typename MatrixType::Index Index;\n  homogeneous_right_product_impl(const MatrixType& lhs, const Rhs& rhs)\n    : m_lhs(lhs), m_rhs(rhs)\n  {}\n\n  inline Index rows() const { return m_lhs.rows(); }\n  inline Index cols() const { return m_rhs.cols(); }\n\n  template<typename Dest> void evalTo(Dest& dst) const\n  {\n    // FIXME investigate how to allow lazy evaluation of this product when possible\n    dst = m_lhs * Block<const RhsNested,\n                        RhsNested::RowsAtCompileTime==Dynamic?Dynamic:RhsNested::RowsAtCompileTime-1,\n                        RhsNested::ColsAtCompileTime>\n            (m_rhs,0,0,m_rhs.rows()-1,m_rhs.cols());\n    dst += m_rhs.row(m_rhs.rows()-1).colwise()\n            .template replicate<MatrixType::RowsAtCompileTime>(m_lhs.rows());\n  }\n\n  typename MatrixType::Nested m_lhs;\n  typename Rhs::Nested m_rhs;\n};\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_HOMOGENEOUS_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Geometry/Hyperplane.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_HYPERPLANE_H\n#define EIGEN_HYPERPLANE_H\n\nnamespace Eigen { \n\n/** \\geometry_module \\ingroup Geometry_Module\n  *\n  * \\class Hyperplane\n  *\n  * \\brief A hyperplane\n  *\n  * A hyperplane is an affine subspace of dimension n-1 in a space of dimension n.\n  * For example, a hyperplane in a plane is a line; a hyperplane in 3-space is a plane.\n  *\n  * \\param _Scalar the scalar type, i.e., the type of the coefficients\n  * \\param _AmbientDim the dimension of the ambient space, can be a compile time value or Dynamic.\n  *             Notice that the dimension of the hyperplane is _AmbientDim-1.\n  *\n  * This class represents an hyperplane as the zero set of the implicit equation\n  * \\f$ n \\cdot x + d = 0 \\f$ where \\f$ n \\f$ is a unit normal vector of the plane (linear part)\n  * and \\f$ d \\f$ is the distance (offset) to the origin.\n  */\ntemplate <typename _Scalar, int _AmbientDim, int _Options>\nclass Hyperplane\n{\npublic:\n  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_AmbientDim==Dynamic ? Dynamic : _AmbientDim+1)\n  enum {\n    AmbientDimAtCompileTime = _AmbientDim,\n    Options = _Options\n  };\n  typedef _Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  typedef DenseIndex Index;\n  typedef Matrix<Scalar,AmbientDimAtCompileTime,1> VectorType;\n  typedef Matrix<Scalar,Index(AmbientDimAtCompileTime)==Dynamic\n                        ? Dynamic\n                        : Index(AmbientDimAtCompileTime)+1,1,Options> Coefficients;\n  typedef Block<Coefficients,AmbientDimAtCompileTime,1> NormalReturnType;\n  typedef const Block<const Coefficients,AmbientDimAtCompileTime,1> ConstNormalReturnType;\n\n  /** Default constructor without initialization */\n  inline Hyperplane() {}\n  \n  template<int OtherOptions>\n  Hyperplane(const Hyperplane<Scalar,AmbientDimAtCompileTime,OtherOptions>& other)\n   : m_coeffs(other.coeffs())\n  {}\n\n  /** Constructs a dynamic-size hyperplane with \\a _dim the dimension\n    * of the ambient space */\n  inline explicit Hyperplane(Index _dim) : m_coeffs(_dim+1) {}\n\n  /** Construct a plane from its normal \\a n and a point \\a e onto the plane.\n    * \\warning the vector normal is assumed to be normalized.\n    */\n  inline Hyperplane(const VectorType& n, const VectorType& e)\n    : m_coeffs(n.size()+1)\n  {\n    normal() = n;\n    offset() = -n.dot(e);\n  }\n\n  /** Constructs a plane from its normal \\a n and distance to the origin \\a d\n    * such that the algebraic equation of the plane is \\f$ n \\cdot x + d = 0 \\f$.\n    * \\warning the vector normal is assumed to be normalized.\n    */\n  inline Hyperplane(const VectorType& n, const Scalar& d)\n    : m_coeffs(n.size()+1)\n  {\n    normal() = n;\n    offset() = d;\n  }\n\n  /** Constructs a hyperplane passing through the two points. If the dimension of the ambient space\n    * is greater than 2, then there isn't uniqueness, so an arbitrary choice is made.\n    */\n  static inline Hyperplane Through(const VectorType& p0, const VectorType& p1)\n  {\n    Hyperplane result(p0.size());\n    result.normal() = (p1 - p0).unitOrthogonal();\n    result.offset() = -p0.dot(result.normal());\n    return result;\n  }\n\n  /** Constructs a hyperplane passing through the three points. The dimension of the ambient space\n    * is required to be exactly 3.\n    */\n  static inline Hyperplane Through(const VectorType& p0, const VectorType& p1, const VectorType& p2)\n  {\n    EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(VectorType, 3)\n    Hyperplane result(p0.size());\n    VectorType v0(p2 - p0), v1(p1 - p0);\n    result.normal() = v0.cross(v1);\n    RealScalar norm = result.normal().norm();\n    if(norm <= v0.norm() * v1.norm() * NumTraits<RealScalar>::epsilon())\n    {\n      Matrix<Scalar,2,3> m; m << v0.transpose(), v1.transpose();\n      JacobiSVD<Matrix<Scalar,2,3> > svd(m, ComputeFullV);\n      result.normal() = svd.matrixV().col(2);\n    }\n    else\n      result.normal() /= norm;\n    result.offset() = -p0.dot(result.normal());\n    return result;\n  }\n\n  /** Constructs a hyperplane passing through the parametrized line \\a parametrized.\n    * If the dimension of the ambient space is greater than 2, then there isn't uniqueness,\n    * so an arbitrary choice is made.\n    */\n  // FIXME to be consitent with the rest this could be implemented as a static Through function ??\n  explicit Hyperplane(const ParametrizedLine<Scalar, AmbientDimAtCompileTime>& parametrized)\n  {\n    normal() = parametrized.direction().unitOrthogonal();\n    offset() = -parametrized.origin().dot(normal());\n  }\n\n  ~Hyperplane() {}\n\n  /** \\returns the dimension in which the plane holds */\n  inline Index dim() const { return AmbientDimAtCompileTime==Dynamic ? m_coeffs.size()-1 : Index(AmbientDimAtCompileTime); }\n\n  /** normalizes \\c *this */\n  void normalize(void)\n  {\n    m_coeffs /= normal().norm();\n  }\n\n  /** \\returns the signed distance between the plane \\c *this and a point \\a p.\n    * \\sa absDistance()\n    */\n  inline Scalar signedDistance(const VectorType& p) const { return normal().dot(p) + offset(); }\n\n  /** \\returns the absolute distance between the plane \\c *this and a point \\a p.\n    * \\sa signedDistance()\n    */\n  inline Scalar absDistance(const VectorType& p) const { using std::abs; return abs(signedDistance(p)); }\n\n  /** \\returns the projection of a point \\a p onto the plane \\c *this.\n    */\n  inline VectorType projection(const VectorType& p) const { return p - signedDistance(p) * normal(); }\n\n  /** \\returns a constant reference to the unit normal vector of the plane, which corresponds\n    * to the linear part of the implicit equation.\n    */\n  inline ConstNormalReturnType normal() const { return ConstNormalReturnType(m_coeffs,0,0,dim(),1); }\n\n  /** \\returns a non-constant reference to the unit normal vector of the plane, which corresponds\n    * to the linear part of the implicit equation.\n    */\n  inline NormalReturnType normal() { return NormalReturnType(m_coeffs,0,0,dim(),1); }\n\n  /** \\returns the distance to the origin, which is also the \"constant term\" of the implicit equation\n    * \\warning the vector normal is assumed to be normalized.\n    */\n  inline const Scalar& offset() const { return m_coeffs.coeff(dim()); }\n\n  /** \\returns a non-constant reference to the distance to the origin, which is also the constant part\n    * of the implicit equation */\n  inline Scalar& offset() { return m_coeffs(dim()); }\n\n  /** \\returns a constant reference to the coefficients c_i of the plane equation:\n    * \\f$ c_0*x_0 + ... + c_{d-1}*x_{d-1} + c_d = 0 \\f$\n    */\n  inline const Coefficients& coeffs() const { return m_coeffs; }\n\n  /** \\returns a non-constant reference to the coefficients c_i of the plane equation:\n    * \\f$ c_0*x_0 + ... + c_{d-1}*x_{d-1} + c_d = 0 \\f$\n    */\n  inline Coefficients& coeffs() { return m_coeffs; }\n\n  /** \\returns the intersection of *this with \\a other.\n    *\n    * \\warning The ambient space must be a plane, i.e. have dimension 2, so that \\c *this and \\a other are lines.\n    *\n    * \\note If \\a other is approximately parallel to *this, this method will return any point on *this.\n    */\n  VectorType intersection(const Hyperplane& other) const\n  {\n    using std::abs;\n    EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(VectorType, 2)\n    Scalar det = coeffs().coeff(0) * other.coeffs().coeff(1) - coeffs().coeff(1) * other.coeffs().coeff(0);\n    // since the line equations ax+by=c are normalized with a^2+b^2=1, the following tests\n    // whether the two lines are approximately parallel.\n    if(internal::isMuchSmallerThan(det, Scalar(1)))\n    {   // special case where the two lines are approximately parallel. Pick any point on the first line.\n        if(abs(coeffs().coeff(1))>abs(coeffs().coeff(0)))\n            return VectorType(coeffs().coeff(1), -coeffs().coeff(2)/coeffs().coeff(1)-coeffs().coeff(0));\n        else\n            return VectorType(-coeffs().coeff(2)/coeffs().coeff(0)-coeffs().coeff(1), coeffs().coeff(0));\n    }\n    else\n    {   // general case\n        Scalar invdet = Scalar(1) / det;\n        return VectorType(invdet*(coeffs().coeff(1)*other.coeffs().coeff(2)-other.coeffs().coeff(1)*coeffs().coeff(2)),\n                          invdet*(other.coeffs().coeff(0)*coeffs().coeff(2)-coeffs().coeff(0)*other.coeffs().coeff(2)));\n    }\n  }\n\n  /** Applies the transformation matrix \\a mat to \\c *this and returns a reference to \\c *this.\n    *\n    * \\param mat the Dim x Dim transformation matrix\n    * \\param traits specifies whether the matrix \\a mat represents an #Isometry\n    *               or a more generic #Affine transformation. The default is #Affine.\n    */\n  template<typename XprType>\n  inline Hyperplane& transform(const MatrixBase<XprType>& mat, TransformTraits traits = Affine)\n  {\n    if (traits==Affine)\n      normal() = mat.inverse().transpose() * normal();\n    else if (traits==Isometry)\n      normal() = mat * normal();\n    else\n    {\n      eigen_assert(0 && \"invalid traits value in Hyperplane::transform()\");\n    }\n    return *this;\n  }\n\n  /** Applies the transformation \\a t to \\c *this and returns a reference to \\c *this.\n    *\n    * \\param t the transformation of dimension Dim\n    * \\param traits specifies whether the transformation \\a t represents an #Isometry\n    *               or a more generic #Affine transformation. The default is #Affine.\n    *               Other kind of transformations are not supported.\n    */\n  template<int TrOptions>\n  inline Hyperplane& transform(const Transform<Scalar,AmbientDimAtCompileTime,Affine,TrOptions>& t,\n                                TransformTraits traits = Affine)\n  {\n    transform(t.linear(), traits);\n    offset() -= normal().dot(t.translation());\n    return *this;\n  }\n\n  /** \\returns \\c *this with scalar type casted to \\a NewScalarType\n    *\n    * Note that if \\a NewScalarType is equal to the current scalar type of \\c *this\n    * then this function smartly returns a const reference to \\c *this.\n    */\n  template<typename NewScalarType>\n  inline typename internal::cast_return_type<Hyperplane,\n           Hyperplane<NewScalarType,AmbientDimAtCompileTime,Options> >::type cast() const\n  {\n    return typename internal::cast_return_type<Hyperplane,\n                    Hyperplane<NewScalarType,AmbientDimAtCompileTime,Options> >::type(*this);\n  }\n\n  /** Copy constructor with scalar type conversion */\n  template<typename OtherScalarType,int OtherOptions>\n  inline explicit Hyperplane(const Hyperplane<OtherScalarType,AmbientDimAtCompileTime,OtherOptions>& other)\n  { m_coeffs = other.coeffs().template cast<Scalar>(); }\n\n  /** \\returns \\c true if \\c *this is approximately equal to \\a other, within the precision\n    * determined by \\a prec.\n    *\n    * \\sa MatrixBase::isApprox() */\n  template<int OtherOptions>\n  bool isApprox(const Hyperplane<Scalar,AmbientDimAtCompileTime,OtherOptions>& other, const typename NumTraits<Scalar>::Real& prec = NumTraits<Scalar>::dummy_precision()) const\n  { return m_coeffs.isApprox(other.m_coeffs, prec); }\n\nprotected:\n\n  Coefficients m_coeffs;\n};\n\n} // end namespace Eigen\n\n#endif // EIGEN_HYPERPLANE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Geometry/OrthoMethods.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_ORTHOMETHODS_H\n#define EIGEN_ORTHOMETHODS_H\n\nnamespace Eigen { \n\n/** \\geometry_module\n  *\n  * \\returns the cross product of \\c *this and \\a other\n  *\n  * Here is a very good explanation of cross-product: http://xkcd.com/199/\n  * \\sa MatrixBase::cross3()\n  */\ntemplate<typename Derived>\ntemplate<typename OtherDerived>\ninline typename MatrixBase<Derived>::template cross_product_return_type<OtherDerived>::type\nMatrixBase<Derived>::cross(const MatrixBase<OtherDerived>& other) const\n{\n  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Derived,3)\n  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived,3)\n\n  // Note that there is no need for an expression here since the compiler\n  // optimize such a small temporary very well (even within a complex expression)\n  typename internal::nested<Derived,2>::type lhs(derived());\n  typename internal::nested<OtherDerived,2>::type rhs(other.derived());\n  return typename cross_product_return_type<OtherDerived>::type(\n    numext::conj(lhs.coeff(1) * rhs.coeff(2) - lhs.coeff(2) * rhs.coeff(1)),\n    numext::conj(lhs.coeff(2) * rhs.coeff(0) - lhs.coeff(0) * rhs.coeff(2)),\n    numext::conj(lhs.coeff(0) * rhs.coeff(1) - lhs.coeff(1) * rhs.coeff(0))\n  );\n}\n\nnamespace internal {\n\ntemplate< int Arch,typename VectorLhs,typename VectorRhs,\n          typename Scalar = typename VectorLhs::Scalar,\n          bool Vectorizable = bool((VectorLhs::Flags&VectorRhs::Flags)&PacketAccessBit)>\nstruct cross3_impl {\n  static inline typename internal::plain_matrix_type<VectorLhs>::type\n  run(const VectorLhs& lhs, const VectorRhs& rhs)\n  {\n    return typename internal::plain_matrix_type<VectorLhs>::type(\n      numext::conj(lhs.coeff(1) * rhs.coeff(2) - lhs.coeff(2) * rhs.coeff(1)),\n      numext::conj(lhs.coeff(2) * rhs.coeff(0) - lhs.coeff(0) * rhs.coeff(2)),\n      numext::conj(lhs.coeff(0) * rhs.coeff(1) - lhs.coeff(1) * rhs.coeff(0)),\n      0\n    );\n  }\n};\n\n}\n\n/** \\geometry_module\n  *\n  * \\returns the cross product of \\c *this and \\a other using only the x, y, and z coefficients\n  *\n  * The size of \\c *this and \\a other must be four. This function is especially useful\n  * when using 4D vectors instead of 3D ones to get advantage of SSE/AltiVec vectorization.\n  *\n  * \\sa MatrixBase::cross()\n  */\ntemplate<typename Derived>\ntemplate<typename OtherDerived>\ninline typename MatrixBase<Derived>::PlainObject\nMatrixBase<Derived>::cross3(const MatrixBase<OtherDerived>& other) const\n{\n  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Derived,4)\n  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived,4)\n\n  typedef typename internal::nested<Derived,2>::type DerivedNested;\n  typedef typename internal::nested<OtherDerived,2>::type OtherDerivedNested;\n  DerivedNested lhs(derived());\n  OtherDerivedNested rhs(other.derived());\n\n  return internal::cross3_impl<Architecture::Target,\n                        typename internal::remove_all<DerivedNested>::type,\n                        typename internal::remove_all<OtherDerivedNested>::type>::run(lhs,rhs);\n}\n\n/** \\returns a matrix expression of the cross product of each column or row\n  * of the referenced expression with the \\a other vector.\n  *\n  * The referenced matrix must have one dimension equal to 3.\n  * The result matrix has the same dimensions than the referenced one.\n  *\n  * \\geometry_module\n  *\n  * \\sa MatrixBase::cross() */\ntemplate<typename ExpressionType, int Direction>\ntemplate<typename OtherDerived>\nconst typename VectorwiseOp<ExpressionType,Direction>::CrossReturnType\nVectorwiseOp<ExpressionType,Direction>::cross(const MatrixBase<OtherDerived>& other) const\n{\n  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived,3)\n  EIGEN_STATIC_ASSERT((internal::is_same<Scalar, typename OtherDerived::Scalar>::value),\n    YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)\n\n  CrossReturnType res(_expression().rows(),_expression().cols());\n  if(Direction==Vertical)\n  {\n    eigen_assert(CrossReturnType::RowsAtCompileTime==3 && \"the matrix must have exactly 3 rows\");\n    res.row(0) = (_expression().row(1) * other.coeff(2) - _expression().row(2) * other.coeff(1)).conjugate();\n    res.row(1) = (_expression().row(2) * other.coeff(0) - _expression().row(0) * other.coeff(2)).conjugate();\n    res.row(2) = (_expression().row(0) * other.coeff(1) - _expression().row(1) * other.coeff(0)).conjugate();\n  }\n  else\n  {\n    eigen_assert(CrossReturnType::ColsAtCompileTime==3 && \"the matrix must have exactly 3 columns\");\n    res.col(0) = (_expression().col(1) * other.coeff(2) - _expression().col(2) * other.coeff(1)).conjugate();\n    res.col(1) = (_expression().col(2) * other.coeff(0) - _expression().col(0) * other.coeff(2)).conjugate();\n    res.col(2) = (_expression().col(0) * other.coeff(1) - _expression().col(1) * other.coeff(0)).conjugate();\n  }\n  return res;\n}\n\nnamespace internal {\n\ntemplate<typename Derived, int Size = Derived::SizeAtCompileTime>\nstruct unitOrthogonal_selector\n{\n  typedef typename plain_matrix_type<Derived>::type VectorType;\n  typedef typename traits<Derived>::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  typedef typename Derived::Index Index;\n  typedef Matrix<Scalar,2,1> Vector2;\n  static inline VectorType run(const Derived& src)\n  {\n    VectorType perp = VectorType::Zero(src.size());\n    Index maxi = 0;\n    Index sndi = 0;\n    src.cwiseAbs().maxCoeff(&maxi);\n    if (maxi==0)\n      sndi = 1;\n    RealScalar invnm = RealScalar(1)/(Vector2() << src.coeff(sndi),src.coeff(maxi)).finished().norm();\n    perp.coeffRef(maxi) = -numext::conj(src.coeff(sndi)) * invnm;\n    perp.coeffRef(sndi) =  numext::conj(src.coeff(maxi)) * invnm;\n\n    return perp;\n   }\n};\n\ntemplate<typename Derived>\nstruct unitOrthogonal_selector<Derived,3>\n{\n  typedef typename plain_matrix_type<Derived>::type VectorType;\n  typedef typename traits<Derived>::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  static inline VectorType run(const Derived& src)\n  {\n    VectorType perp;\n    /* Let us compute the crossed product of *this with a vector\n     * that is not too close to being colinear to *this.\n     */\n\n    /* unless the x and y coords are both close to zero, we can\n     * simply take ( -y, x, 0 ) and normalize it.\n     */\n    if((!isMuchSmallerThan(src.x(), src.z()))\n    || (!isMuchSmallerThan(src.y(), src.z())))\n    {\n      RealScalar invnm = RealScalar(1)/src.template head<2>().norm();\n      perp.coeffRef(0) = -numext::conj(src.y())*invnm;\n      perp.coeffRef(1) = numext::conj(src.x())*invnm;\n      perp.coeffRef(2) = 0;\n    }\n    /* if both x and y are close to zero, then the vector is close\n     * to the z-axis, so it's far from colinear to the x-axis for instance.\n     * So we take the crossed product with (1,0,0) and normalize it.\n     */\n    else\n    {\n      RealScalar invnm = RealScalar(1)/src.template tail<2>().norm();\n      perp.coeffRef(0) = 0;\n      perp.coeffRef(1) = -numext::conj(src.z())*invnm;\n      perp.coeffRef(2) = numext::conj(src.y())*invnm;\n    }\n\n    return perp;\n   }\n};\n\ntemplate<typename Derived>\nstruct unitOrthogonal_selector<Derived,2>\n{\n  typedef typename plain_matrix_type<Derived>::type VectorType;\n  static inline VectorType run(const Derived& src)\n  { return VectorType(-numext::conj(src.y()), numext::conj(src.x())).normalized(); }\n};\n\n} // end namespace internal\n\n/** \\returns a unit vector which is orthogonal to \\c *this\n  *\n  * The size of \\c *this must be at least 2. If the size is exactly 2,\n  * then the returned vector is a counter clock wise rotation of \\c *this, i.e., (-y,x).normalized().\n  *\n  * \\sa cross()\n  */\ntemplate<typename Derived>\ntypename MatrixBase<Derived>::PlainObject\nMatrixBase<Derived>::unitOrthogonal() const\n{\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)\n  return internal::unitOrthogonal_selector<Derived>::run(derived());\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_ORTHOMETHODS_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Geometry/ParametrizedLine.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_PARAMETRIZEDLINE_H\n#define EIGEN_PARAMETRIZEDLINE_H\n\nnamespace Eigen { \n\n/** \\geometry_module \\ingroup Geometry_Module\n  *\n  * \\class ParametrizedLine\n  *\n  * \\brief A parametrized line\n  *\n  * A parametrized line is defined by an origin point \\f$ \\mathbf{o} \\f$ and a unit\n  * direction vector \\f$ \\mathbf{d} \\f$ such that the line corresponds to\n  * the set \\f$ l(t) = \\mathbf{o} + t \\mathbf{d} \\f$, \\f$ t \\in \\mathbf{R} \\f$.\n  *\n  * \\param _Scalar the scalar type, i.e., the type of the coefficients\n  * \\param _AmbientDim the dimension of the ambient space, can be a compile time value or Dynamic.\n  */\ntemplate <typename _Scalar, int _AmbientDim, int _Options>\nclass ParametrizedLine\n{\npublic:\n  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_AmbientDim)\n  enum {\n    AmbientDimAtCompileTime = _AmbientDim,\n    Options = _Options\n  };\n  typedef _Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  typedef DenseIndex Index;\n  typedef Matrix<Scalar,AmbientDimAtCompileTime,1,Options> VectorType;\n\n  /** Default constructor without initialization */\n  inline ParametrizedLine() {}\n  \n  template<int OtherOptions>\n  ParametrizedLine(const ParametrizedLine<Scalar,AmbientDimAtCompileTime,OtherOptions>& other)\n   : m_origin(other.origin()), m_direction(other.direction())\n  {}\n\n  /** Constructs a dynamic-size line with \\a _dim the dimension\n    * of the ambient space */\n  inline explicit ParametrizedLine(Index _dim) : m_origin(_dim), m_direction(_dim) {}\n\n  /** Initializes a parametrized line of direction \\a direction and origin \\a origin.\n    * \\warning the vector direction is assumed to be normalized.\n    */\n  ParametrizedLine(const VectorType& origin, const VectorType& direction)\n    : m_origin(origin), m_direction(direction) {}\n\n  template <int OtherOptions>\n  explicit ParametrizedLine(const Hyperplane<_Scalar, _AmbientDim, OtherOptions>& hyperplane);\n\n  /** Constructs a parametrized line going from \\a p0 to \\a p1. */\n  static inline ParametrizedLine Through(const VectorType& p0, const VectorType& p1)\n  { return ParametrizedLine(p0, (p1-p0).normalized()); }\n\n  ~ParametrizedLine() {}\n\n  /** \\returns the dimension in which the line holds */\n  inline Index dim() const { return m_direction.size(); }\n\n  const VectorType& origin() const { return m_origin; }\n  VectorType& origin() { return m_origin; }\n\n  const VectorType& direction() const { return m_direction; }\n  VectorType& direction() { return m_direction; }\n\n  /** \\returns the squared distance of a point \\a p to its projection onto the line \\c *this.\n    * \\sa distance()\n    */\n  RealScalar squaredDistance(const VectorType& p) const\n  {\n    VectorType diff = p - origin();\n    return (diff - direction().dot(diff) * direction()).squaredNorm();\n  }\n  /** \\returns the distance of a point \\a p to its projection onto the line \\c *this.\n    * \\sa squaredDistance()\n    */\n  RealScalar distance(const VectorType& p) const { using std::sqrt; return sqrt(squaredDistance(p)); }\n\n  /** \\returns the projection of a point \\a p onto the line \\c *this. */\n  VectorType projection(const VectorType& p) const\n  { return origin() + direction().dot(p-origin()) * direction(); }\n\n  VectorType pointAt(const Scalar& t) const;\n  \n  template <int OtherOptions>\n  Scalar intersectionParameter(const Hyperplane<_Scalar, _AmbientDim, OtherOptions>& hyperplane) const;\n \n  template <int OtherOptions>\n  Scalar intersection(const Hyperplane<_Scalar, _AmbientDim, OtherOptions>& hyperplane) const;\n  \n  template <int OtherOptions>\n  VectorType intersectionPoint(const Hyperplane<_Scalar, _AmbientDim, OtherOptions>& hyperplane) const;\n\n  /** \\returns \\c *this with scalar type casted to \\a NewScalarType\n    *\n    * Note that if \\a NewScalarType is equal to the current scalar type of \\c *this\n    * then this function smartly returns a const reference to \\c *this.\n    */\n  template<typename NewScalarType>\n  inline typename internal::cast_return_type<ParametrizedLine,\n           ParametrizedLine<NewScalarType,AmbientDimAtCompileTime,Options> >::type cast() const\n  {\n    return typename internal::cast_return_type<ParametrizedLine,\n                    ParametrizedLine<NewScalarType,AmbientDimAtCompileTime,Options> >::type(*this);\n  }\n\n  /** Copy constructor with scalar type conversion */\n  template<typename OtherScalarType,int OtherOptions>\n  inline explicit ParametrizedLine(const ParametrizedLine<OtherScalarType,AmbientDimAtCompileTime,OtherOptions>& other)\n  {\n    m_origin = other.origin().template cast<Scalar>();\n    m_direction = other.direction().template cast<Scalar>();\n  }\n\n  /** \\returns \\c true if \\c *this is approximately equal to \\a other, within the precision\n    * determined by \\a prec.\n    *\n    * \\sa MatrixBase::isApprox() */\n  bool isApprox(const ParametrizedLine& other, const typename NumTraits<Scalar>::Real& prec = NumTraits<Scalar>::dummy_precision()) const\n  { return m_origin.isApprox(other.m_origin, prec) && m_direction.isApprox(other.m_direction, prec); }\n\nprotected:\n\n  VectorType m_origin, m_direction;\n};\n\n/** Constructs a parametrized line from a 2D hyperplane\n  *\n  * \\warning the ambient space must have dimension 2 such that the hyperplane actually describes a line\n  */\ntemplate <typename _Scalar, int _AmbientDim, int _Options>\ntemplate <int OtherOptions>\ninline ParametrizedLine<_Scalar, _AmbientDim,_Options>::ParametrizedLine(const Hyperplane<_Scalar, _AmbientDim,OtherOptions>& hyperplane)\n{\n  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(VectorType, 2)\n  direction() = hyperplane.normal().unitOrthogonal();\n  origin() = -hyperplane.normal()*hyperplane.offset();\n}\n\n/** \\returns the point at \\a t along this line\n  */\ntemplate <typename _Scalar, int _AmbientDim, int _Options>\ninline typename ParametrizedLine<_Scalar, _AmbientDim,_Options>::VectorType\nParametrizedLine<_Scalar, _AmbientDim,_Options>::pointAt(const _Scalar& t) const\n{\n  return origin() + (direction()*t); \n}\n\n/** \\returns the parameter value of the intersection between \\c *this and the given \\a hyperplane\n  */\ntemplate <typename _Scalar, int _AmbientDim, int _Options>\ntemplate <int OtherOptions>\ninline _Scalar ParametrizedLine<_Scalar, _AmbientDim,_Options>::intersectionParameter(const Hyperplane<_Scalar, _AmbientDim, OtherOptions>& hyperplane) const\n{\n  return -(hyperplane.offset()+hyperplane.normal().dot(origin()))\n          / hyperplane.normal().dot(direction());\n}\n\n\n/** \\deprecated use intersectionParameter()\n  * \\returns the parameter value of the intersection between \\c *this and the given \\a hyperplane\n  */\ntemplate <typename _Scalar, int _AmbientDim, int _Options>\ntemplate <int OtherOptions>\ninline _Scalar ParametrizedLine<_Scalar, _AmbientDim,_Options>::intersection(const Hyperplane<_Scalar, _AmbientDim, OtherOptions>& hyperplane) const\n{\n  return intersectionParameter(hyperplane);\n}\n\n/** \\returns the point of the intersection between \\c *this and the given hyperplane\n  */\ntemplate <typename _Scalar, int _AmbientDim, int _Options>\ntemplate <int OtherOptions>\ninline typename ParametrizedLine<_Scalar, _AmbientDim,_Options>::VectorType\nParametrizedLine<_Scalar, _AmbientDim,_Options>::intersectionPoint(const Hyperplane<_Scalar, _AmbientDim, OtherOptions>& hyperplane) const\n{\n  return pointAt(intersectionParameter(hyperplane));\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_PARAMETRIZEDLINE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Geometry/Quaternion.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2009 Mathieu Gautier <mathieu.gautier@cea.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_QUATERNION_H\n#define EIGEN_QUATERNION_H\nnamespace Eigen { \n\n\n/***************************************************************************\n* Definition of QuaternionBase<Derived>\n* The implementation is at the end of the file\n***************************************************************************/\n\nnamespace internal {\ntemplate<typename Other,\n         int OtherRows=Other::RowsAtCompileTime,\n         int OtherCols=Other::ColsAtCompileTime>\nstruct quaternionbase_assign_impl;\n}\n\n/** \\geometry_module \\ingroup Geometry_Module\n  * \\class QuaternionBase\n  * \\brief Base class for quaternion expressions\n  * \\tparam Derived derived type (CRTP)\n  * \\sa class Quaternion\n  */\ntemplate<class Derived>\nclass QuaternionBase : public RotationBase<Derived, 3>\n{\n  typedef RotationBase<Derived, 3> Base;\npublic:\n  using Base::operator*;\n  using Base::derived;\n\n  typedef typename internal::traits<Derived>::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  typedef typename internal::traits<Derived>::Coefficients Coefficients;\n  enum {\n    Flags = Eigen::internal::traits<Derived>::Flags\n  };\n\n // typedef typename Matrix<Scalar,4,1> Coefficients;\n  /** the type of a 3D vector */\n  typedef Matrix<Scalar,3,1> Vector3;\n  /** the equivalent rotation matrix type */\n  typedef Matrix<Scalar,3,3> Matrix3;\n  /** the equivalent angle-axis type */\n  typedef AngleAxis<Scalar> AngleAxisType;\n\n\n\n  /** \\returns the \\c x coefficient */\n  inline Scalar x() const { return this->derived().coeffs().coeff(0); }\n  /** \\returns the \\c y coefficient */\n  inline Scalar y() const { return this->derived().coeffs().coeff(1); }\n  /** \\returns the \\c z coefficient */\n  inline Scalar z() const { return this->derived().coeffs().coeff(2); }\n  /** \\returns the \\c w coefficient */\n  inline Scalar w() const { return this->derived().coeffs().coeff(3); }\n\n  /** \\returns a reference to the \\c x coefficient */\n  inline Scalar& x() { return this->derived().coeffs().coeffRef(0); }\n  /** \\returns a reference to the \\c y coefficient */\n  inline Scalar& y() { return this->derived().coeffs().coeffRef(1); }\n  /** \\returns a reference to the \\c z coefficient */\n  inline Scalar& z() { return this->derived().coeffs().coeffRef(2); }\n  /** \\returns a reference to the \\c w coefficient */\n  inline Scalar& w() { return this->derived().coeffs().coeffRef(3); }\n\n  /** \\returns a read-only vector expression of the imaginary part (x,y,z) */\n  inline const VectorBlock<const Coefficients,3> vec() const { return coeffs().template head<3>(); }\n\n  /** \\returns a vector expression of the imaginary part (x,y,z) */\n  inline VectorBlock<Coefficients,3> vec() { return coeffs().template head<3>(); }\n\n  /** \\returns a read-only vector expression of the coefficients (x,y,z,w) */\n  inline const typename internal::traits<Derived>::Coefficients& coeffs() const { return derived().coeffs(); }\n\n  /** \\returns a vector expression of the coefficients (x,y,z,w) */\n  inline typename internal::traits<Derived>::Coefficients& coeffs() { return derived().coeffs(); }\n\n  EIGEN_STRONG_INLINE QuaternionBase<Derived>& operator=(const QuaternionBase<Derived>& other);\n  template<class OtherDerived> EIGEN_STRONG_INLINE Derived& operator=(const QuaternionBase<OtherDerived>& other);\n\n// disabled this copy operator as it is giving very strange compilation errors when compiling\n// test_stdvector with GCC 4.4.2. This looks like a GCC bug though, so feel free to re-enable it if it's\n// useful; however notice that we already have the templated operator= above and e.g. in MatrixBase\n// we didn't have to add, in addition to templated operator=, such a non-templated copy operator.\n//  Derived& operator=(const QuaternionBase& other)\n//  { return operator=<Derived>(other); }\n\n  Derived& operator=(const AngleAxisType& aa);\n  template<class OtherDerived> Derived& operator=(const MatrixBase<OtherDerived>& m);\n\n  /** \\returns a quaternion representing an identity rotation\n    * \\sa MatrixBase::Identity()\n    */\n  static inline Quaternion<Scalar> Identity() { return Quaternion<Scalar>(Scalar(1), Scalar(0), Scalar(0), Scalar(0)); }\n\n  /** \\sa QuaternionBase::Identity(), MatrixBase::setIdentity()\n    */\n  inline QuaternionBase& setIdentity() { coeffs() << Scalar(0), Scalar(0), Scalar(0), Scalar(1); return *this; }\n\n  /** \\returns the squared norm of the quaternion's coefficients\n    * \\sa QuaternionBase::norm(), MatrixBase::squaredNorm()\n    */\n  inline Scalar squaredNorm() const { return coeffs().squaredNorm(); }\n\n  /** \\returns the norm of the quaternion's coefficients\n    * \\sa QuaternionBase::squaredNorm(), MatrixBase::norm()\n    */\n  inline Scalar norm() const { return coeffs().norm(); }\n\n  /** Normalizes the quaternion \\c *this\n    * \\sa normalized(), MatrixBase::normalize() */\n  inline void normalize() { coeffs().normalize(); }\n  /** \\returns a normalized copy of \\c *this\n    * \\sa normalize(), MatrixBase::normalized() */\n  inline Quaternion<Scalar> normalized() const { return Quaternion<Scalar>(coeffs().normalized()); }\n\n    /** \\returns the dot product of \\c *this and \\a other\n    * Geometrically speaking, the dot product of two unit quaternions\n    * corresponds to the cosine of half the angle between the two rotations.\n    * \\sa angularDistance()\n    */\n  template<class OtherDerived> inline Scalar dot(const QuaternionBase<OtherDerived>& other) const { return coeffs().dot(other.coeffs()); }\n\n  template<class OtherDerived> Scalar angularDistance(const QuaternionBase<OtherDerived>& other) const;\n\n  /** \\returns an equivalent 3x3 rotation matrix */\n  Matrix3 toRotationMatrix() const;\n\n  /** \\returns the quaternion which transform \\a a into \\a b through a rotation */\n  template<typename Derived1, typename Derived2>\n  Derived& setFromTwoVectors(const MatrixBase<Derived1>& a, const MatrixBase<Derived2>& b);\n\n  template<class OtherDerived> EIGEN_STRONG_INLINE Quaternion<Scalar> operator* (const QuaternionBase<OtherDerived>& q) const;\n  template<class OtherDerived> EIGEN_STRONG_INLINE Derived& operator*= (const QuaternionBase<OtherDerived>& q);\n\n  /** \\returns the quaternion describing the inverse rotation */\n  Quaternion<Scalar> inverse() const;\n\n  /** \\returns the conjugated quaternion */\n  Quaternion<Scalar> conjugate() const;\n\n  template<class OtherDerived> Quaternion<Scalar> slerp(const Scalar& t, const QuaternionBase<OtherDerived>& other) const;\n\n  /** \\returns \\c true if \\c *this is approximately equal to \\a other, within the precision\n    * determined by \\a prec.\n    *\n    * \\sa MatrixBase::isApprox() */\n  template<class OtherDerived>\n  bool isApprox(const QuaternionBase<OtherDerived>& other, const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const\n  { return coeffs().isApprox(other.coeffs(), prec); }\n\n\t/** return the result vector of \\a v through the rotation*/\n  EIGEN_STRONG_INLINE Vector3 _transformVector(const Vector3& v) const;\n\n  /** \\returns \\c *this with scalar type casted to \\a NewScalarType\n    *\n    * Note that if \\a NewScalarType is equal to the current scalar type of \\c *this\n    * then this function smartly returns a const reference to \\c *this.\n    */\n  template<typename NewScalarType>\n  inline typename internal::cast_return_type<Derived,Quaternion<NewScalarType> >::type cast() const\n  {\n    return typename internal::cast_return_type<Derived,Quaternion<NewScalarType> >::type(derived());\n  }\n\n#ifdef EIGEN_QUATERNIONBASE_PLUGIN\n# include EIGEN_QUATERNIONBASE_PLUGIN\n#endif\n};\n\n/***************************************************************************\n* Definition/implementation of Quaternion<Scalar>\n***************************************************************************/\n\n/** \\geometry_module \\ingroup Geometry_Module\n  *\n  * \\class Quaternion\n  *\n  * \\brief The quaternion class used to represent 3D orientations and rotations\n  *\n  * \\tparam _Scalar the scalar type, i.e., the type of the coefficients\n  * \\tparam _Options controls the memory alignment of the coefficients. Can be \\# AutoAlign or \\# DontAlign. Default is AutoAlign.\n  *\n  * This class represents a quaternion \\f$ w+xi+yj+zk \\f$ that is a convenient representation of\n  * orientations and rotations of objects in three dimensions. Compared to other representations\n  * like Euler angles or 3x3 matrices, quaternions offer the following advantages:\n  * \\li \\b compact storage (4 scalars)\n  * \\li \\b efficient to compose (28 flops),\n  * \\li \\b stable spherical interpolation\n  *\n  * The following two typedefs are provided for convenience:\n  * \\li \\c Quaternionf for \\c float\n  * \\li \\c Quaterniond for \\c double\n  *\n  * \\warning Operations interpreting the quaternion as rotation have undefined behavior if the quaternion is not normalized.\n  *\n  * \\sa  class AngleAxis, class Transform\n  */\n\nnamespace internal {\ntemplate<typename _Scalar,int _Options>\nstruct traits<Quaternion<_Scalar,_Options> >\n{\n  typedef Quaternion<_Scalar,_Options> PlainObject;\n  typedef _Scalar Scalar;\n  typedef Matrix<_Scalar,4,1,_Options> Coefficients;\n  enum{\n    IsAligned = internal::traits<Coefficients>::Flags & AlignedBit,\n    Flags = IsAligned ? (AlignedBit | LvalueBit) : LvalueBit\n  };\n};\n}\n\ntemplate<typename _Scalar, int _Options>\nclass Quaternion : public QuaternionBase<Quaternion<_Scalar,_Options> >\n{\n  typedef QuaternionBase<Quaternion<_Scalar,_Options> > Base;\n  enum { IsAligned = internal::traits<Quaternion>::IsAligned };\n\npublic:\n  typedef _Scalar Scalar;\n\n  EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Quaternion)\n  using Base::operator*=;\n\n  typedef typename internal::traits<Quaternion>::Coefficients Coefficients;\n  typedef typename Base::AngleAxisType AngleAxisType;\n\n  /** Default constructor leaving the quaternion uninitialized. */\n  inline Quaternion() {}\n\n  /** Constructs and initializes the quaternion \\f$ w+xi+yj+zk \\f$ from\n    * its four coefficients \\a w, \\a x, \\a y and \\a z.\n    *\n    * \\warning Note the order of the arguments: the real \\a w coefficient first,\n    * while internally the coefficients are stored in the following order:\n    * [\\c x, \\c y, \\c z, \\c w]\n    */\n  inline Quaternion(const Scalar& w, const Scalar& x, const Scalar& y, const Scalar& z) : m_coeffs(x, y, z, w){}\n\n  /** Constructs and initialize a quaternion from the array data */\n  inline Quaternion(const Scalar* data) : m_coeffs(data) {}\n\n  /** Copy constructor */\n  template<class Derived> EIGEN_STRONG_INLINE Quaternion(const QuaternionBase<Derived>& other) { this->Base::operator=(other); }\n\n  /** Constructs and initializes a quaternion from the angle-axis \\a aa */\n  explicit inline Quaternion(const AngleAxisType& aa) { *this = aa; }\n\n  /** Constructs and initializes a quaternion from either:\n    *  - a rotation matrix expression,\n    *  - a 4D vector expression representing quaternion coefficients.\n    */\n  template<typename Derived>\n  explicit inline Quaternion(const MatrixBase<Derived>& other) { *this = other; }\n\n  /** Explicit copy constructor with scalar conversion */\n  template<typename OtherScalar, int OtherOptions>\n  explicit inline Quaternion(const Quaternion<OtherScalar, OtherOptions>& other)\n  { m_coeffs = other.coeffs().template cast<Scalar>(); }\n\n  template<typename Derived1, typename Derived2>\n  static Quaternion FromTwoVectors(const MatrixBase<Derived1>& a, const MatrixBase<Derived2>& b);\n\n  inline Coefficients& coeffs() { return m_coeffs;}\n  inline const Coefficients& coeffs() const { return m_coeffs;}\n\n  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(bool(IsAligned))\n\nprotected:\n  Coefficients m_coeffs;\n  \n#ifndef EIGEN_PARSED_BY_DOXYGEN\n    static EIGEN_STRONG_INLINE void _check_template_params()\n    {\n      EIGEN_STATIC_ASSERT( (_Options & DontAlign) == _Options,\n        INVALID_MATRIX_TEMPLATE_PARAMETERS)\n    }\n#endif\n};\n\n/** \\ingroup Geometry_Module\n  * single precision quaternion type */\ntypedef Quaternion<float> Quaternionf;\n/** \\ingroup Geometry_Module\n  * double precision quaternion type */\ntypedef Quaternion<double> Quaterniond;\n\n/***************************************************************************\n* Specialization of Map<Quaternion<Scalar>>\n***************************************************************************/\n\nnamespace internal {\n  template<typename _Scalar, int _Options>\n  struct traits<Map<Quaternion<_Scalar>, _Options> > : traits<Quaternion<_Scalar, (int(_Options)&Aligned)==Aligned ? AutoAlign : DontAlign> >\n  {\n    typedef Map<Matrix<_Scalar,4,1>, _Options> Coefficients;\n  };\n}\n\nnamespace internal {\n  template<typename _Scalar, int _Options>\n  struct traits<Map<const Quaternion<_Scalar>, _Options> > : traits<Quaternion<_Scalar, (int(_Options)&Aligned)==Aligned ? AutoAlign : DontAlign> >\n  {\n    typedef Map<const Matrix<_Scalar,4,1>, _Options> Coefficients;\n    typedef traits<Quaternion<_Scalar, (int(_Options)&Aligned)==Aligned ? AutoAlign : DontAlign> > TraitsBase;\n    enum {\n      Flags = TraitsBase::Flags & ~LvalueBit\n    };\n  };\n}\n\n/** \\ingroup Geometry_Module\n  * \\brief Quaternion expression mapping a constant memory buffer\n  *\n  * \\tparam _Scalar the type of the Quaternion coefficients\n  * \\tparam _Options see class Map\n  *\n  * This is a specialization of class Map for Quaternion. This class allows to view\n  * a 4 scalar memory buffer as an Eigen's Quaternion object.\n  *\n  * \\sa class Map, class Quaternion, class QuaternionBase\n  */\ntemplate<typename _Scalar, int _Options>\nclass Map<const Quaternion<_Scalar>, _Options >\n  : public QuaternionBase<Map<const Quaternion<_Scalar>, _Options> >\n{\n    typedef QuaternionBase<Map<const Quaternion<_Scalar>, _Options> > Base;\n\n  public:\n    typedef _Scalar Scalar;\n    typedef typename internal::traits<Map>::Coefficients Coefficients;\n    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Map)\n    using Base::operator*=;\n\n    /** Constructs a Mapped Quaternion object from the pointer \\a coeffs\n      *\n      * The pointer \\a coeffs must reference the four coefficients of Quaternion in the following order:\n      * \\code *coeffs == {x, y, z, w} \\endcode\n      *\n      * If the template parameter _Options is set to #Aligned, then the pointer coeffs must be aligned. */\n    EIGEN_STRONG_INLINE Map(const Scalar* coeffs) : m_coeffs(coeffs) {}\n\n    inline const Coefficients& coeffs() const { return m_coeffs;}\n\n  protected:\n    const Coefficients m_coeffs;\n};\n\n/** \\ingroup Geometry_Module\n  * \\brief Expression of a quaternion from a memory buffer\n  *\n  * \\tparam _Scalar the type of the Quaternion coefficients\n  * \\tparam _Options see class Map\n  *\n  * This is a specialization of class Map for Quaternion. This class allows to view\n  * a 4 scalar memory buffer as an Eigen's  Quaternion object.\n  *\n  * \\sa class Map, class Quaternion, class QuaternionBase\n  */\ntemplate<typename _Scalar, int _Options>\nclass Map<Quaternion<_Scalar>, _Options >\n  : public QuaternionBase<Map<Quaternion<_Scalar>, _Options> >\n{\n    typedef QuaternionBase<Map<Quaternion<_Scalar>, _Options> > Base;\n\n  public:\n    typedef _Scalar Scalar;\n    typedef typename internal::traits<Map>::Coefficients Coefficients;\n    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Map)\n    using Base::operator*=;\n\n    /** Constructs a Mapped Quaternion object from the pointer \\a coeffs\n      *\n      * The pointer \\a coeffs must reference the four coefficients of Quaternion in the following order:\n      * \\code *coeffs == {x, y, z, w} \\endcode\n      *\n      * If the template parameter _Options is set to #Aligned, then the pointer coeffs must be aligned. */\n    EIGEN_STRONG_INLINE Map(Scalar* coeffs) : m_coeffs(coeffs) {}\n\n    inline Coefficients& coeffs() { return m_coeffs; }\n    inline const Coefficients& coeffs() const { return m_coeffs; }\n\n  protected:\n    Coefficients m_coeffs;\n};\n\n/** \\ingroup Geometry_Module\n  * Map an unaligned array of single precision scalars as a quaternion */\ntypedef Map<Quaternion<float>, 0>         QuaternionMapf;\n/** \\ingroup Geometry_Module\n  * Map an unaligned array of double precision scalars as a quaternion */\ntypedef Map<Quaternion<double>, 0>        QuaternionMapd;\n/** \\ingroup Geometry_Module\n  * Map a 16-byte aligned array of single precision scalars as a quaternion */\ntypedef Map<Quaternion<float>, Aligned>   QuaternionMapAlignedf;\n/** \\ingroup Geometry_Module\n  * Map a 16-byte aligned array of double precision scalars as a quaternion */\ntypedef Map<Quaternion<double>, Aligned>  QuaternionMapAlignedd;\n\n/***************************************************************************\n* Implementation of QuaternionBase methods\n***************************************************************************/\n\n// Generic Quaternion * Quaternion product\n// This product can be specialized for a given architecture via the Arch template argument.\nnamespace internal {\ntemplate<int Arch, class Derived1, class Derived2, typename Scalar, int _Options> struct quat_product\n{\n  static EIGEN_STRONG_INLINE Quaternion<Scalar> run(const QuaternionBase<Derived1>& a, const QuaternionBase<Derived2>& b){\n    return Quaternion<Scalar>\n    (\n      a.w() * b.w() - a.x() * b.x() - a.y() * b.y() - a.z() * b.z(),\n      a.w() * b.x() + a.x() * b.w() + a.y() * b.z() - a.z() * b.y(),\n      a.w() * b.y() + a.y() * b.w() + a.z() * b.x() - a.x() * b.z(),\n      a.w() * b.z() + a.z() * b.w() + a.x() * b.y() - a.y() * b.x()\n    );\n  }\n};\n}\n\n/** \\returns the concatenation of two rotations as a quaternion-quaternion product */\ntemplate <class Derived>\ntemplate <class OtherDerived>\nEIGEN_STRONG_INLINE Quaternion<typename internal::traits<Derived>::Scalar>\nQuaternionBase<Derived>::operator* (const QuaternionBase<OtherDerived>& other) const\n{\n  EIGEN_STATIC_ASSERT((internal::is_same<typename Derived::Scalar, typename OtherDerived::Scalar>::value),\n   YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)\n  return internal::quat_product<Architecture::Target, Derived, OtherDerived,\n                         typename internal::traits<Derived>::Scalar,\n                         internal::traits<Derived>::IsAligned && internal::traits<OtherDerived>::IsAligned>::run(*this, other);\n}\n\n/** \\sa operator*(Quaternion) */\ntemplate <class Derived>\ntemplate <class OtherDerived>\nEIGEN_STRONG_INLINE Derived& QuaternionBase<Derived>::operator*= (const QuaternionBase<OtherDerived>& other)\n{\n  derived() = derived() * other.derived();\n  return derived();\n}\n\n/** Rotation of a vector by a quaternion.\n  * \\remarks If the quaternion is used to rotate several points (>1)\n  * then it is much more efficient to first convert it to a 3x3 Matrix.\n  * Comparison of the operation cost for n transformations:\n  *   - Quaternion2:    30n\n  *   - Via a Matrix3: 24 + 15n\n  */\ntemplate <class Derived>\nEIGEN_STRONG_INLINE typename QuaternionBase<Derived>::Vector3\nQuaternionBase<Derived>::_transformVector(const Vector3& v) const\n{\n    // Note that this algorithm comes from the optimization by hand\n    // of the conversion to a Matrix followed by a Matrix/Vector product.\n    // It appears to be much faster than the common algorithm found\n    // in the literature (30 versus 39 flops). It also requires two\n    // Vector3 as temporaries.\n    Vector3 uv = this->vec().cross(v);\n    uv += uv;\n    return v + this->w() * uv + this->vec().cross(uv);\n}\n\ntemplate<class Derived>\nEIGEN_STRONG_INLINE QuaternionBase<Derived>& QuaternionBase<Derived>::operator=(const QuaternionBase<Derived>& other)\n{\n  coeffs() = other.coeffs();\n  return derived();\n}\n\ntemplate<class Derived>\ntemplate<class OtherDerived>\nEIGEN_STRONG_INLINE Derived& QuaternionBase<Derived>::operator=(const QuaternionBase<OtherDerived>& other)\n{\n  coeffs() = other.coeffs();\n  return derived();\n}\n\n/** Set \\c *this from an angle-axis \\a aa and returns a reference to \\c *this\n  */\ntemplate<class Derived>\nEIGEN_STRONG_INLINE Derived& QuaternionBase<Derived>::operator=(const AngleAxisType& aa)\n{\n  using std::cos;\n  using std::sin;\n  Scalar ha = Scalar(0.5)*aa.angle(); // Scalar(0.5) to suppress precision loss warnings\n  this->w() = cos(ha);\n  this->vec() = sin(ha) * aa.axis();\n  return derived();\n}\n\n/** Set \\c *this from the expression \\a xpr:\n  *   - if \\a xpr is a 4x1 vector, then \\a xpr is assumed to be a quaternion\n  *   - if \\a xpr is a 3x3 matrix, then \\a xpr is assumed to be rotation matrix\n  *     and \\a xpr is converted to a quaternion\n  */\n\ntemplate<class Derived>\ntemplate<class MatrixDerived>\ninline Derived& QuaternionBase<Derived>::operator=(const MatrixBase<MatrixDerived>& xpr)\n{\n  EIGEN_STATIC_ASSERT((internal::is_same<typename Derived::Scalar, typename MatrixDerived::Scalar>::value),\n   YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)\n  internal::quaternionbase_assign_impl<MatrixDerived>::run(*this, xpr.derived());\n  return derived();\n}\n\n/** Convert the quaternion to a 3x3 rotation matrix. The quaternion is required to\n  * be normalized, otherwise the result is undefined.\n  */\ntemplate<class Derived>\ninline typename QuaternionBase<Derived>::Matrix3\nQuaternionBase<Derived>::toRotationMatrix(void) const\n{\n  // NOTE if inlined, then gcc 4.2 and 4.4 get rid of the temporary (not gcc 4.3 !!)\n  // if not inlined then the cost of the return by value is huge ~ +35%,\n  // however, not inlining this function is an order of magnitude slower, so\n  // it has to be inlined, and so the return by value is not an issue\n  Matrix3 res;\n\n  const Scalar tx  = Scalar(2)*this->x();\n  const Scalar ty  = Scalar(2)*this->y();\n  const Scalar tz  = Scalar(2)*this->z();\n  const Scalar twx = tx*this->w();\n  const Scalar twy = ty*this->w();\n  const Scalar twz = tz*this->w();\n  const Scalar txx = tx*this->x();\n  const Scalar txy = ty*this->x();\n  const Scalar txz = tz*this->x();\n  const Scalar tyy = ty*this->y();\n  const Scalar tyz = tz*this->y();\n  const Scalar tzz = tz*this->z();\n\n  res.coeffRef(0,0) = Scalar(1)-(tyy+tzz);\n  res.coeffRef(0,1) = txy-twz;\n  res.coeffRef(0,2) = txz+twy;\n  res.coeffRef(1,0) = txy+twz;\n  res.coeffRef(1,1) = Scalar(1)-(txx+tzz);\n  res.coeffRef(1,2) = tyz-twx;\n  res.coeffRef(2,0) = txz-twy;\n  res.coeffRef(2,1) = tyz+twx;\n  res.coeffRef(2,2) = Scalar(1)-(txx+tyy);\n\n  return res;\n}\n\n/** Sets \\c *this to be a quaternion representing a rotation between\n  * the two arbitrary vectors \\a a and \\a b. In other words, the built\n  * rotation represent a rotation sending the line of direction \\a a\n  * to the line of direction \\a b, both lines passing through the origin.\n  *\n  * \\returns a reference to \\c *this.\n  *\n  * Note that the two input vectors do \\b not have to be normalized, and\n  * do not need to have the same norm.\n  */\ntemplate<class Derived>\ntemplate<typename Derived1, typename Derived2>\ninline Derived& QuaternionBase<Derived>::setFromTwoVectors(const MatrixBase<Derived1>& a, const MatrixBase<Derived2>& b)\n{\n  using std::max;\n  using std::sqrt;\n  Vector3 v0 = a.normalized();\n  Vector3 v1 = b.normalized();\n  Scalar c = v1.dot(v0);\n\n  // if dot == -1, vectors are nearly opposites\n  // => accurately compute the rotation axis by computing the\n  //    intersection of the two planes. This is done by solving:\n  //       x^T v0 = 0\n  //       x^T v1 = 0\n  //    under the constraint:\n  //       ||x|| = 1\n  //    which yields a singular value problem\n  if (c < Scalar(-1)+NumTraits<Scalar>::dummy_precision())\n  {\n    c = (max)(c,Scalar(-1));\n    Matrix<Scalar,2,3> m; m << v0.transpose(), v1.transpose();\n    JacobiSVD<Matrix<Scalar,2,3> > svd(m, ComputeFullV);\n    Vector3 axis = svd.matrixV().col(2);\n\n    Scalar w2 = (Scalar(1)+c)*Scalar(0.5);\n    this->w() = sqrt(w2);\n    this->vec() = axis * sqrt(Scalar(1) - w2);\n    return derived();\n  }\n  Vector3 axis = v0.cross(v1);\n  Scalar s = sqrt((Scalar(1)+c)*Scalar(2));\n  Scalar invs = Scalar(1)/s;\n  this->vec() = axis * invs;\n  this->w() = s * Scalar(0.5);\n\n  return derived();\n}\n\n\n/** Returns a quaternion representing a rotation between\n  * the two arbitrary vectors \\a a and \\a b. In other words, the built\n  * rotation represent a rotation sending the line of direction \\a a\n  * to the line of direction \\a b, both lines passing through the origin.\n  *\n  * \\returns resulting quaternion\n  *\n  * Note that the two input vectors do \\b not have to be normalized, and\n  * do not need to have the same norm.\n  */\ntemplate<typename Scalar, int Options>\ntemplate<typename Derived1, typename Derived2>\nQuaternion<Scalar,Options> Quaternion<Scalar,Options>::FromTwoVectors(const MatrixBase<Derived1>& a, const MatrixBase<Derived2>& b)\n{\n    Quaternion quat;\n    quat.setFromTwoVectors(a, b);\n    return quat;\n}\n\n\n/** \\returns the multiplicative inverse of \\c *this\n  * Note that in most cases, i.e., if you simply want the opposite rotation,\n  * and/or the quaternion is normalized, then it is enough to use the conjugate.\n  *\n  * \\sa QuaternionBase::conjugate()\n  */\ntemplate <class Derived>\ninline Quaternion<typename internal::traits<Derived>::Scalar> QuaternionBase<Derived>::inverse() const\n{\n  // FIXME should this function be called multiplicativeInverse and conjugate() be called inverse() or opposite()  ??\n  Scalar n2 = this->squaredNorm();\n  if (n2 > Scalar(0))\n    return Quaternion<Scalar>(conjugate().coeffs() / n2);\n  else\n  {\n    // return an invalid result to flag the error\n    return Quaternion<Scalar>(Coefficients::Zero());\n  }\n}\n\n/** \\returns the conjugate of the \\c *this which is equal to the multiplicative inverse\n  * if the quaternion is normalized.\n  * The conjugate of a quaternion represents the opposite rotation.\n  *\n  * \\sa Quaternion2::inverse()\n  */\ntemplate <class Derived>\ninline Quaternion<typename internal::traits<Derived>::Scalar>\nQuaternionBase<Derived>::conjugate() const\n{\n  return Quaternion<Scalar>(this->w(),-this->x(),-this->y(),-this->z());\n}\n\n/** \\returns the angle (in radian) between two rotations\n  * \\sa dot()\n  */\ntemplate <class Derived>\ntemplate <class OtherDerived>\ninline typename internal::traits<Derived>::Scalar\nQuaternionBase<Derived>::angularDistance(const QuaternionBase<OtherDerived>& other) const\n{\n  using std::atan2;\n  using std::abs;\n  Quaternion<Scalar> d = (*this) * other.conjugate();\n  return Scalar(2) * atan2( d.vec().norm(), abs(d.w()) );\n}\n\n \n    \n/** \\returns the spherical linear interpolation between the two quaternions\n  * \\c *this and \\a other at the parameter \\a t in [0;1].\n  * \n  * This represents an interpolation for a constant motion between \\c *this and \\a other,\n  * see also http://en.wikipedia.org/wiki/Slerp.\n  */\ntemplate <class Derived>\ntemplate <class OtherDerived>\nQuaternion<typename internal::traits<Derived>::Scalar>\nQuaternionBase<Derived>::slerp(const Scalar& t, const QuaternionBase<OtherDerived>& other) const\n{\n  using std::acos;\n  using std::sin;\n  using std::abs;\n  static const Scalar one = Scalar(1) - NumTraits<Scalar>::epsilon();\n  Scalar d = this->dot(other);\n  Scalar absD = abs(d);\n\n  Scalar scale0;\n  Scalar scale1;\n\n  if(absD>=one)\n  {\n    scale0 = Scalar(1) - t;\n    scale1 = t;\n  }\n  else\n  {\n    // theta is the angle between the 2 quaternions\n    Scalar theta = acos(absD);\n    Scalar sinTheta = sin(theta);\n\n    scale0 = sin( ( Scalar(1) - t ) * theta) / sinTheta;\n    scale1 = sin( ( t * theta) ) / sinTheta;\n  }\n  if(d<Scalar(0)) scale1 = -scale1;\n\n  return Quaternion<Scalar>(scale0 * coeffs() + scale1 * other.coeffs());\n}\n\nnamespace internal {\n\n// set from a rotation matrix\ntemplate<typename Other>\nstruct quaternionbase_assign_impl<Other,3,3>\n{\n  typedef typename Other::Scalar Scalar;\n  typedef DenseIndex Index;\n  template<class Derived> static inline void run(QuaternionBase<Derived>& q, const Other& mat)\n  {\n    using std::sqrt;\n    // This algorithm comes from  \"Quaternion Calculus and Fast Animation\",\n    // Ken Shoemake, 1987 SIGGRAPH course notes\n    Scalar t = mat.trace();\n    if (t > Scalar(0))\n    {\n      t = sqrt(t + Scalar(1.0));\n      q.w() = Scalar(0.5)*t;\n      t = Scalar(0.5)/t;\n      q.x() = (mat.coeff(2,1) - mat.coeff(1,2)) * t;\n      q.y() = (mat.coeff(0,2) - mat.coeff(2,0)) * t;\n      q.z() = (mat.coeff(1,0) - mat.coeff(0,1)) * t;\n    }\n    else\n    {\n      DenseIndex i = 0;\n      if (mat.coeff(1,1) > mat.coeff(0,0))\n        i = 1;\n      if (mat.coeff(2,2) > mat.coeff(i,i))\n        i = 2;\n      DenseIndex j = (i+1)%3;\n      DenseIndex k = (j+1)%3;\n\n      t = sqrt(mat.coeff(i,i)-mat.coeff(j,j)-mat.coeff(k,k) + Scalar(1.0));\n      q.coeffs().coeffRef(i) = Scalar(0.5) * t;\n      t = Scalar(0.5)/t;\n      q.w() = (mat.coeff(k,j)-mat.coeff(j,k))*t;\n      q.coeffs().coeffRef(j) = (mat.coeff(j,i)+mat.coeff(i,j))*t;\n      q.coeffs().coeffRef(k) = (mat.coeff(k,i)+mat.coeff(i,k))*t;\n    }\n  }\n};\n\n// set from a vector of coefficients assumed to be a quaternion\ntemplate<typename Other>\nstruct quaternionbase_assign_impl<Other,4,1>\n{\n  typedef typename Other::Scalar Scalar;\n  template<class Derived> static inline void run(QuaternionBase<Derived>& q, const Other& vec)\n  {\n    q.coeffs() = vec;\n  }\n};\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_QUATERNION_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Geometry/Rotation2D.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_ROTATION2D_H\n#define EIGEN_ROTATION2D_H\n\nnamespace Eigen { \n\n/** \\geometry_module \\ingroup Geometry_Module\n  *\n  * \\class Rotation2D\n  *\n  * \\brief Represents a rotation/orientation in a 2 dimensional space.\n  *\n  * \\param _Scalar the scalar type, i.e., the type of the coefficients\n  *\n  * This class is equivalent to a single scalar representing a counter clock wise rotation\n  * as a single angle in radian. It provides some additional features such as the automatic\n  * conversion from/to a 2x2 rotation matrix. Moreover this class aims to provide a similar\n  * interface to Quaternion in order to facilitate the writing of generic algorithms\n  * dealing with rotations.\n  *\n  * \\sa class Quaternion, class Transform\n  */\n\nnamespace internal {\n\ntemplate<typename _Scalar> struct traits<Rotation2D<_Scalar> >\n{\n  typedef _Scalar Scalar;\n};\n} // end namespace internal\n\ntemplate<typename _Scalar>\nclass Rotation2D : public RotationBase<Rotation2D<_Scalar>,2>\n{\n  typedef RotationBase<Rotation2D<_Scalar>,2> Base;\n\npublic:\n\n  using Base::operator*;\n\n  enum { Dim = 2 };\n  /** the scalar type of the coefficients */\n  typedef _Scalar Scalar;\n  typedef Matrix<Scalar,2,1> Vector2;\n  typedef Matrix<Scalar,2,2> Matrix2;\n\nprotected:\n\n  Scalar m_angle;\n\npublic:\n\n  /** Construct a 2D counter clock wise rotation from the angle \\a a in radian. */\n  inline Rotation2D(const Scalar& a) : m_angle(a) {}\n  \n  /** Default constructor wihtout initialization. The represented rotation is undefined. */\n  Rotation2D() {}\n\n  /** \\returns the rotation angle */\n  inline Scalar angle() const { return m_angle; }\n\n  /** \\returns a read-write reference to the rotation angle */\n  inline Scalar& angle() { return m_angle; }\n\n  /** \\returns the inverse rotation */\n  inline Rotation2D inverse() const { return -m_angle; }\n\n  /** Concatenates two rotations */\n  inline Rotation2D operator*(const Rotation2D& other) const\n  { return m_angle + other.m_angle; }\n\n  /** Concatenates two rotations */\n  inline Rotation2D& operator*=(const Rotation2D& other)\n  { m_angle += other.m_angle; return *this; }\n\n  /** Applies the rotation to a 2D vector */\n  Vector2 operator* (const Vector2& vec) const\n  { return toRotationMatrix() * vec; }\n  \n  template<typename Derived>\n  Rotation2D& fromRotationMatrix(const MatrixBase<Derived>& m);\n  Matrix2 toRotationMatrix() const;\n\n  /** \\returns the spherical interpolation between \\c *this and \\a other using\n    * parameter \\a t. It is in fact equivalent to a linear interpolation.\n    */\n  inline Rotation2D slerp(const Scalar& t, const Rotation2D& other) const\n  { return m_angle * (1-t) + other.angle() * t; }\n\n  /** \\returns \\c *this with scalar type casted to \\a NewScalarType\n    *\n    * Note that if \\a NewScalarType is equal to the current scalar type of \\c *this\n    * then this function smartly returns a const reference to \\c *this.\n    */\n  template<typename NewScalarType>\n  inline typename internal::cast_return_type<Rotation2D,Rotation2D<NewScalarType> >::type cast() const\n  { return typename internal::cast_return_type<Rotation2D,Rotation2D<NewScalarType> >::type(*this); }\n\n  /** Copy constructor with scalar type conversion */\n  template<typename OtherScalarType>\n  inline explicit Rotation2D(const Rotation2D<OtherScalarType>& other)\n  {\n    m_angle = Scalar(other.angle());\n  }\n\n  static inline Rotation2D Identity() { return Rotation2D(0); }\n\n  /** \\returns \\c true if \\c *this is approximately equal to \\a other, within the precision\n    * determined by \\a prec.\n    *\n    * \\sa MatrixBase::isApprox() */\n  bool isApprox(const Rotation2D& other, const typename NumTraits<Scalar>::Real& prec = NumTraits<Scalar>::dummy_precision()) const\n  { return internal::isApprox(m_angle,other.m_angle, prec); }\n};\n\n/** \\ingroup Geometry_Module\n  * single precision 2D rotation type */\ntypedef Rotation2D<float> Rotation2Df;\n/** \\ingroup Geometry_Module\n  * double precision 2D rotation type */\ntypedef Rotation2D<double> Rotation2Dd;\n\n/** Set \\c *this from a 2x2 rotation matrix \\a mat.\n  * In other words, this function extract the rotation angle\n  * from the rotation matrix.\n  */\ntemplate<typename Scalar>\ntemplate<typename Derived>\nRotation2D<Scalar>& Rotation2D<Scalar>::fromRotationMatrix(const MatrixBase<Derived>& mat)\n{\n  using std::atan2;\n  EIGEN_STATIC_ASSERT(Derived::RowsAtCompileTime==2 && Derived::ColsAtCompileTime==2,YOU_MADE_A_PROGRAMMING_MISTAKE)\n  m_angle = atan2(mat.coeff(1,0), mat.coeff(0,0));\n  return *this;\n}\n\n/** Constructs and \\returns an equivalent 2x2 rotation matrix.\n  */\ntemplate<typename Scalar>\ntypename Rotation2D<Scalar>::Matrix2\nRotation2D<Scalar>::toRotationMatrix(void) const\n{\n  using std::sin;\n  using std::cos;\n  Scalar sinA = sin(m_angle);\n  Scalar cosA = cos(m_angle);\n  return (Matrix2() << cosA, -sinA, sinA, cosA).finished();\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_ROTATION2D_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Geometry/RotationBase.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_ROTATIONBASE_H\n#define EIGEN_ROTATIONBASE_H\n\nnamespace Eigen { \n\n// forward declaration\nnamespace internal {\ntemplate<typename RotationDerived, typename MatrixType, bool IsVector=MatrixType::IsVectorAtCompileTime>\nstruct rotation_base_generic_product_selector;\n}\n\n/** \\class RotationBase\n  *\n  * \\brief Common base class for compact rotation representations\n  *\n  * \\param Derived is the derived type, i.e., a rotation type\n  * \\param _Dim the dimension of the space\n  */\ntemplate<typename Derived, int _Dim>\nclass RotationBase\n{\n  public:\n    enum { Dim = _Dim };\n    /** the scalar type of the coefficients */\n    typedef typename internal::traits<Derived>::Scalar Scalar;\n\n    /** corresponding linear transformation matrix type */\n    typedef Matrix<Scalar,Dim,Dim> RotationMatrixType;\n    typedef Matrix<Scalar,Dim,1> VectorType;\n\n  public:\n    inline const Derived& derived() const { return *static_cast<const Derived*>(this); }\n    inline Derived& derived() { return *static_cast<Derived*>(this); }\n\n    /** \\returns an equivalent rotation matrix */\n    inline RotationMatrixType toRotationMatrix() const { return derived().toRotationMatrix(); }\n\n    /** \\returns an equivalent rotation matrix \n      * This function is added to be conform with the Transform class' naming scheme.\n      */\n    inline RotationMatrixType matrix() const { return derived().toRotationMatrix(); }\n\n    /** \\returns the inverse rotation */\n    inline Derived inverse() const { return derived().inverse(); }\n\n    /** \\returns the concatenation of the rotation \\c *this with a translation \\a t */\n    inline Transform<Scalar,Dim,Isometry> operator*(const Translation<Scalar,Dim>& t) const\n    { return Transform<Scalar,Dim,Isometry>(*this) * t; }\n\n    /** \\returns the concatenation of the rotation \\c *this with a uniform scaling \\a s */\n    inline RotationMatrixType operator*(const UniformScaling<Scalar>& s) const\n    { return toRotationMatrix() * s.factor(); }\n\n    /** \\returns the concatenation of the rotation \\c *this with a generic expression \\a e\n      * \\a e can be:\n      *  - a DimxDim linear transformation matrix\n      *  - a DimxDim diagonal matrix (axis aligned scaling)\n      *  - a vector of size Dim\n      */\n    template<typename OtherDerived>\n    EIGEN_STRONG_INLINE typename internal::rotation_base_generic_product_selector<Derived,OtherDerived,OtherDerived::IsVectorAtCompileTime>::ReturnType\n    operator*(const EigenBase<OtherDerived>& e) const\n    { return internal::rotation_base_generic_product_selector<Derived,OtherDerived>::run(derived(), e.derived()); }\n\n    /** \\returns the concatenation of a linear transformation \\a l with the rotation \\a r */\n    template<typename OtherDerived> friend\n    inline RotationMatrixType operator*(const EigenBase<OtherDerived>& l, const Derived& r)\n    { return l.derived() * r.toRotationMatrix(); }\n\n    /** \\returns the concatenation of a scaling \\a l with the rotation \\a r */\n    friend inline Transform<Scalar,Dim,Affine> operator*(const DiagonalMatrix<Scalar,Dim>& l, const Derived& r)\n    { \n      Transform<Scalar,Dim,Affine> res(r);\n      res.linear().applyOnTheLeft(l);\n      return res;\n    }\n\n    /** \\returns the concatenation of the rotation \\c *this with a transformation \\a t */\n    template<int Mode, int Options>\n    inline Transform<Scalar,Dim,Mode> operator*(const Transform<Scalar,Dim,Mode,Options>& t) const\n    { return toRotationMatrix() * t; }\n\n    template<typename OtherVectorType>\n    inline VectorType _transformVector(const OtherVectorType& v) const\n    { return toRotationMatrix() * v; }\n};\n\nnamespace internal {\n\n// implementation of the generic product rotation * matrix\ntemplate<typename RotationDerived, typename MatrixType>\nstruct rotation_base_generic_product_selector<RotationDerived,MatrixType,false>\n{\n  enum { Dim = RotationDerived::Dim };\n  typedef Matrix<typename RotationDerived::Scalar,Dim,Dim> ReturnType;\n  static inline ReturnType run(const RotationDerived& r, const MatrixType& m)\n  { return r.toRotationMatrix() * m; }\n};\n\ntemplate<typename RotationDerived, typename Scalar, int Dim, int MaxDim>\nstruct rotation_base_generic_product_selector< RotationDerived, DiagonalMatrix<Scalar,Dim,MaxDim>, false >\n{\n  typedef Transform<Scalar,Dim,Affine> ReturnType;\n  static inline ReturnType run(const RotationDerived& r, const DiagonalMatrix<Scalar,Dim,MaxDim>& m)\n  {\n    ReturnType res(r);\n    res.linear() *= m;\n    return res;\n  }\n};\n\ntemplate<typename RotationDerived,typename OtherVectorType>\nstruct rotation_base_generic_product_selector<RotationDerived,OtherVectorType,true>\n{\n  enum { Dim = RotationDerived::Dim };\n  typedef Matrix<typename RotationDerived::Scalar,Dim,1> ReturnType;\n  static EIGEN_STRONG_INLINE ReturnType run(const RotationDerived& r, const OtherVectorType& v)\n  {\n    return r._transformVector(v);\n  }\n};\n\n} // end namespace internal\n\n/** \\geometry_module\n  *\n  * \\brief Constructs a Dim x Dim rotation matrix from the rotation \\a r\n  */\ntemplate<typename _Scalar, int _Rows, int _Cols, int _Storage, int _MaxRows, int _MaxCols>\ntemplate<typename OtherDerived>\nMatrix<_Scalar, _Rows, _Cols, _Storage, _MaxRows, _MaxCols>\n::Matrix(const RotationBase<OtherDerived,ColsAtCompileTime>& r)\n{\n  EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix,int(OtherDerived::Dim),int(OtherDerived::Dim))\n  *this = r.toRotationMatrix();\n}\n\n/** \\geometry_module\n  *\n  * \\brief Set a Dim x Dim rotation matrix from the rotation \\a r\n  */\ntemplate<typename _Scalar, int _Rows, int _Cols, int _Storage, int _MaxRows, int _MaxCols>\ntemplate<typename OtherDerived>\nMatrix<_Scalar, _Rows, _Cols, _Storage, _MaxRows, _MaxCols>&\nMatrix<_Scalar, _Rows, _Cols, _Storage, _MaxRows, _MaxCols>\n::operator=(const RotationBase<OtherDerived,ColsAtCompileTime>& r)\n{\n  EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix,int(OtherDerived::Dim),int(OtherDerived::Dim))\n  return *this = r.toRotationMatrix();\n}\n\nnamespace internal {\n\n/** \\internal\n  *\n  * Helper function to return an arbitrary rotation object to a rotation matrix.\n  *\n  * \\param Scalar the numeric type of the matrix coefficients\n  * \\param Dim the dimension of the current space\n  *\n  * It returns a Dim x Dim fixed size matrix.\n  *\n  * Default specializations are provided for:\n  *   - any scalar type (2D),\n  *   - any matrix expression,\n  *   - any type based on RotationBase (e.g., Quaternion, AngleAxis, Rotation2D)\n  *\n  * Currently toRotationMatrix is only used by Transform.\n  *\n  * \\sa class Transform, class Rotation2D, class Quaternion, class AngleAxis\n  */\ntemplate<typename Scalar, int Dim>\nstatic inline Matrix<Scalar,2,2> toRotationMatrix(const Scalar& s)\n{\n  EIGEN_STATIC_ASSERT(Dim==2,YOU_MADE_A_PROGRAMMING_MISTAKE)\n  return Rotation2D<Scalar>(s).toRotationMatrix();\n}\n\ntemplate<typename Scalar, int Dim, typename OtherDerived>\nstatic inline Matrix<Scalar,Dim,Dim> toRotationMatrix(const RotationBase<OtherDerived,Dim>& r)\n{\n  return r.toRotationMatrix();\n}\n\ntemplate<typename Scalar, int Dim, typename OtherDerived>\nstatic inline const MatrixBase<OtherDerived>& toRotationMatrix(const MatrixBase<OtherDerived>& mat)\n{\n  EIGEN_STATIC_ASSERT(OtherDerived::RowsAtCompileTime==Dim && OtherDerived::ColsAtCompileTime==Dim,\n    YOU_MADE_A_PROGRAMMING_MISTAKE)\n  return mat;\n}\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_ROTATIONBASE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Geometry/Scaling.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SCALING_H\n#define EIGEN_SCALING_H\n\nnamespace Eigen { \n\n/** \\geometry_module \\ingroup Geometry_Module\n  *\n  * \\class Scaling\n  *\n  * \\brief Represents a generic uniform scaling transformation\n  *\n  * \\param _Scalar the scalar type, i.e., the type of the coefficients.\n  *\n  * This class represent a uniform scaling transformation. It is the return\n  * type of Scaling(Scalar), and most of the time this is the only way it\n  * is used. In particular, this class is not aimed to be used to store a scaling transformation,\n  * but rather to make easier the constructions and updates of Transform objects.\n  *\n  * To represent an axis aligned scaling, use the DiagonalMatrix class.\n  *\n  * \\sa Scaling(), class DiagonalMatrix, MatrixBase::asDiagonal(), class Translation, class Transform\n  */\ntemplate<typename _Scalar>\nclass UniformScaling\n{\npublic:\n  /** the scalar type of the coefficients */\n  typedef _Scalar Scalar;\n\nprotected:\n\n  Scalar m_factor;\n\npublic:\n\n  /** Default constructor without initialization. */\n  UniformScaling() {}\n  /** Constructs and initialize a uniform scaling transformation */\n  explicit inline UniformScaling(const Scalar& s) : m_factor(s) {}\n\n  inline const Scalar& factor() const { return m_factor; }\n  inline Scalar& factor() { return m_factor; }\n\n  /** Concatenates two uniform scaling */\n  inline UniformScaling operator* (const UniformScaling& other) const\n  { return UniformScaling(m_factor * other.factor()); }\n\n  /** Concatenates a uniform scaling and a translation */\n  template<int Dim>\n  inline Transform<Scalar,Dim,Affine> operator* (const Translation<Scalar,Dim>& t) const;\n\n  /** Concatenates a uniform scaling and an affine transformation */\n  template<int Dim, int Mode, int Options>\n  inline Transform<Scalar,Dim,(int(Mode)==int(Isometry)?Affine:Mode)> operator* (const Transform<Scalar,Dim, Mode, Options>& t) const\n  {\n   Transform<Scalar,Dim,(int(Mode)==int(Isometry)?Affine:Mode)> res = t;\n   res.prescale(factor());\n   return res;\n}\n\n  /** Concatenates a uniform scaling and a linear transformation matrix */\n  // TODO returns an expression\n  template<typename Derived>\n  inline typename internal::plain_matrix_type<Derived>::type operator* (const MatrixBase<Derived>& other) const\n  { return other * m_factor; }\n\n  template<typename Derived,int Dim>\n  inline Matrix<Scalar,Dim,Dim> operator*(const RotationBase<Derived,Dim>& r) const\n  { return r.toRotationMatrix() * m_factor; }\n\n  /** \\returns the inverse scaling */\n  inline UniformScaling inverse() const\n  { return UniformScaling(Scalar(1)/m_factor); }\n\n  /** \\returns \\c *this with scalar type casted to \\a NewScalarType\n    *\n    * Note that if \\a NewScalarType is equal to the current scalar type of \\c *this\n    * then this function smartly returns a const reference to \\c *this.\n    */\n  template<typename NewScalarType>\n  inline UniformScaling<NewScalarType> cast() const\n  { return UniformScaling<NewScalarType>(NewScalarType(m_factor)); }\n\n  /** Copy constructor with scalar type conversion */\n  template<typename OtherScalarType>\n  inline explicit UniformScaling(const UniformScaling<OtherScalarType>& other)\n  { m_factor = Scalar(other.factor()); }\n\n  /** \\returns \\c true if \\c *this is approximately equal to \\a other, within the precision\n    * determined by \\a prec.\n    *\n    * \\sa MatrixBase::isApprox() */\n  bool isApprox(const UniformScaling& other, const typename NumTraits<Scalar>::Real& prec = NumTraits<Scalar>::dummy_precision()) const\n  { return internal::isApprox(m_factor, other.factor(), prec); }\n\n};\n\n/** Concatenates a linear transformation matrix and a uniform scaling */\n// NOTE this operator is defiend in MatrixBase and not as a friend function\n// of UniformScaling to fix an internal crash of Intel's ICC\ntemplate<typename Derived> typename MatrixBase<Derived>::ScalarMultipleReturnType\nMatrixBase<Derived>::operator*(const UniformScaling<Scalar>& s) const\n{ return derived() * s.factor(); }\n\n/** Constructs a uniform scaling from scale factor \\a s */\nstatic inline UniformScaling<float> Scaling(float s) { return UniformScaling<float>(s); }\n/** Constructs a uniform scaling from scale factor \\a s */\nstatic inline UniformScaling<double> Scaling(double s) { return UniformScaling<double>(s); }\n/** Constructs a uniform scaling from scale factor \\a s */\ntemplate<typename RealScalar>\nstatic inline UniformScaling<std::complex<RealScalar> > Scaling(const std::complex<RealScalar>& s)\n{ return UniformScaling<std::complex<RealScalar> >(s); }\n\n/** Constructs a 2D axis aligned scaling */\ntemplate<typename Scalar>\nstatic inline DiagonalMatrix<Scalar,2> Scaling(const Scalar& sx, const Scalar& sy)\n{ return DiagonalMatrix<Scalar,2>(sx, sy); }\n/** Constructs a 3D axis aligned scaling */\ntemplate<typename Scalar>\nstatic inline DiagonalMatrix<Scalar,3> Scaling(const Scalar& sx, const Scalar& sy, const Scalar& sz)\n{ return DiagonalMatrix<Scalar,3>(sx, sy, sz); }\n\n/** Constructs an axis aligned scaling expression from vector expression \\a coeffs\n  * This is an alias for coeffs.asDiagonal()\n  */\ntemplate<typename Derived>\nstatic inline const DiagonalWrapper<const Derived> Scaling(const MatrixBase<Derived>& coeffs)\n{ return coeffs.asDiagonal(); }\n\n/** \\addtogroup Geometry_Module */\n//@{\n/** \\deprecated */\ntypedef DiagonalMatrix<float, 2> AlignedScaling2f;\n/** \\deprecated */\ntypedef DiagonalMatrix<double,2> AlignedScaling2d;\n/** \\deprecated */\ntypedef DiagonalMatrix<float, 3> AlignedScaling3f;\n/** \\deprecated */\ntypedef DiagonalMatrix<double,3> AlignedScaling3d;\n//@}\n\ntemplate<typename Scalar>\ntemplate<int Dim>\ninline Transform<Scalar,Dim,Affine>\nUniformScaling<Scalar>::operator* (const Translation<Scalar,Dim>& t) const\n{\n  Transform<Scalar,Dim,Affine> res;\n  res.matrix().setZero();\n  res.linear().diagonal().fill(factor());\n  res.translation() = factor() * t.vector();\n  res(Dim,Dim) = Scalar(1);\n  return res;\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_SCALING_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Geometry/Transform.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n// Copyright (C) 2010 Hauke Heibel <hauke.heibel@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_TRANSFORM_H\n#define EIGEN_TRANSFORM_H\n\nnamespace Eigen { \n\nnamespace internal {\n\ntemplate<typename Transform>\nstruct transform_traits\n{\n  enum\n  {\n    Dim = Transform::Dim,\n    HDim = Transform::HDim,\n    Mode = Transform::Mode,\n    IsProjective = (int(Mode)==int(Projective))\n  };\n};\n\ntemplate< typename TransformType,\n          typename MatrixType,\n          int Case = transform_traits<TransformType>::IsProjective ? 0\n                   : int(MatrixType::RowsAtCompileTime) == int(transform_traits<TransformType>::HDim) ? 1\n                   : 2>\nstruct transform_right_product_impl;\n\ntemplate< typename Other,\n          int Mode,\n          int Options,\n          int Dim,\n          int HDim,\n          int OtherRows=Other::RowsAtCompileTime,\n          int OtherCols=Other::ColsAtCompileTime>\nstruct transform_left_product_impl;\n\ntemplate< typename Lhs,\n          typename Rhs,\n          bool AnyProjective = \n            transform_traits<Lhs>::IsProjective ||\n            transform_traits<Rhs>::IsProjective>\nstruct transform_transform_product_impl;\n\ntemplate< typename Other,\n          int Mode,\n          int Options,\n          int Dim,\n          int HDim,\n          int OtherRows=Other::RowsAtCompileTime,\n          int OtherCols=Other::ColsAtCompileTime>\nstruct transform_construct_from_matrix;\n\ntemplate<typename TransformType> struct transform_take_affine_part;\n\ntemplate<int Mode> struct transform_make_affine;\n\n} // end namespace internal\n\n/** \\geometry_module \\ingroup Geometry_Module\n  *\n  * \\class Transform\n  *\n  * \\brief Represents an homogeneous transformation in a N dimensional space\n  *\n  * \\tparam _Scalar the scalar type, i.e., the type of the coefficients\n  * \\tparam _Dim the dimension of the space\n  * \\tparam _Mode the type of the transformation. Can be:\n  *              - #Affine: the transformation is stored as a (Dim+1)^2 matrix,\n  *                         where the last row is assumed to be [0 ... 0 1].\n  *              - #AffineCompact: the transformation is stored as a (Dim)x(Dim+1) matrix.\n  *              - #Projective: the transformation is stored as a (Dim+1)^2 matrix\n  *                             without any assumption.\n  * \\tparam _Options has the same meaning as in class Matrix. It allows to specify DontAlign and/or RowMajor.\n  *                  These Options are passed directly to the underlying matrix type.\n  *\n  * The homography is internally represented and stored by a matrix which\n  * is available through the matrix() method. To understand the behavior of\n  * this class you have to think a Transform object as its internal\n  * matrix representation. The chosen convention is right multiply:\n  *\n  * \\code v' = T * v \\endcode\n  *\n  * Therefore, an affine transformation matrix M is shaped like this:\n  *\n  * \\f$ \\left( \\begin{array}{cc}\n  * linear & translation\\\\\n  * 0 ... 0 & 1\n  * \\end{array} \\right) \\f$\n  *\n  * Note that for a projective transformation the last row can be anything,\n  * and then the interpretation of different parts might be sightly different.\n  *\n  * However, unlike a plain matrix, the Transform class provides many features\n  * simplifying both its assembly and usage. In particular, it can be composed\n  * with any other transformations (Transform,Translation,RotationBase,DiagonalMatrix)\n  * and can be directly used to transform implicit homogeneous vectors. All these\n  * operations are handled via the operator*. For the composition of transformations,\n  * its principle consists to first convert the right/left hand sides of the product\n  * to a compatible (Dim+1)^2 matrix and then perform a pure matrix product.\n  * Of course, internally, operator* tries to perform the minimal number of operations\n  * according to the nature of each terms. Likewise, when applying the transform\n  * to points, the latters are automatically promoted to homogeneous vectors\n  * before doing the matrix product. The conventions to homogeneous representations\n  * are performed as follow:\n  *\n  * \\b Translation t (Dim)x(1):\n  * \\f$ \\left( \\begin{array}{cc}\n  * I & t \\\\\n  * 0\\,...\\,0 & 1\n  * \\end{array} \\right) \\f$\n  *\n  * \\b Rotation R (Dim)x(Dim):\n  * \\f$ \\left( \\begin{array}{cc}\n  * R & 0\\\\\n  * 0\\,...\\,0 & 1\n  * \\end{array} \\right) \\f$\n  *<!--\n  * \\b Linear \\b Matrix L (Dim)x(Dim):\n  * \\f$ \\left( \\begin{array}{cc}\n  * L & 0\\\\\n  * 0\\,...\\,0 & 1\n  * \\end{array} \\right) \\f$\n  *\n  * \\b Affine \\b Matrix A (Dim)x(Dim+1):\n  * \\f$ \\left( \\begin{array}{c}\n  * A\\\\\n  * 0\\,...\\,0\\,1\n  * \\end{array} \\right) \\f$\n  *-->\n  * \\b Scaling \\b DiagonalMatrix S (Dim)x(Dim):\n  * \\f$ \\left( \\begin{array}{cc}\n  * S & 0\\\\\n  * 0\\,...\\,0 & 1\n  * \\end{array} \\right) \\f$\n  *\n  * \\b Column \\b point v (Dim)x(1):\n  * \\f$ \\left( \\begin{array}{c}\n  * v\\\\\n  * 1\n  * \\end{array} \\right) \\f$\n  *\n  * \\b Set \\b of \\b column \\b points V1...Vn (Dim)x(n):\n  * \\f$ \\left( \\begin{array}{ccc}\n  * v_1 & ... & v_n\\\\\n  * 1 & ... & 1\n  * \\end{array} \\right) \\f$\n  *\n  * The concatenation of a Transform object with any kind of other transformation\n  * always returns a Transform object.\n  *\n  * A little exception to the \"as pure matrix product\" rule is the case of the\n  * transformation of non homogeneous vectors by an affine transformation. In\n  * that case the last matrix row can be ignored, and the product returns non\n  * homogeneous vectors.\n  *\n  * Since, for instance, a Dim x Dim matrix is interpreted as a linear transformation,\n  * it is not possible to directly transform Dim vectors stored in a Dim x Dim matrix.\n  * The solution is either to use a Dim x Dynamic matrix or explicitly request a\n  * vector transformation by making the vector homogeneous:\n  * \\code\n  * m' = T * m.colwise().homogeneous();\n  * \\endcode\n  * Note that there is zero overhead.\n  *\n  * Conversion methods from/to Qt's QMatrix and QTransform are available if the\n  * preprocessor token EIGEN_QT_SUPPORT is defined.\n  *\n  * This class can be extended with the help of the plugin mechanism described on the page\n  * \\ref TopicCustomizingEigen by defining the preprocessor symbol \\c EIGEN_TRANSFORM_PLUGIN.\n  *\n  * \\sa class Matrix, class Quaternion\n  */\ntemplate<typename _Scalar, int _Dim, int _Mode, int _Options>\nclass Transform\n{\npublic:\n  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_Dim==Dynamic ? Dynamic : (_Dim+1)*(_Dim+1))\n  enum {\n    Mode = _Mode,\n    Options = _Options,\n    Dim = _Dim,     ///< space dimension in which the transformation holds\n    HDim = _Dim+1,  ///< size of a respective homogeneous vector\n    Rows = int(Mode)==(AffineCompact) ? Dim : HDim\n  };\n  /** the scalar type of the coefficients */\n  typedef _Scalar Scalar;\n  typedef DenseIndex Index;\n  /** type of the matrix used to represent the transformation */\n  typedef typename internal::make_proper_matrix_type<Scalar,Rows,HDim,Options>::type MatrixType;\n  /** constified MatrixType */\n  typedef const MatrixType ConstMatrixType;\n  /** type of the matrix used to represent the linear part of the transformation */\n  typedef Matrix<Scalar,Dim,Dim,Options> LinearMatrixType;\n  /** type of read/write reference to the linear part of the transformation */\n  typedef Block<MatrixType,Dim,Dim,int(Mode)==(AffineCompact) && (Options&RowMajor)==0> LinearPart;\n  /** type of read reference to the linear part of the transformation */\n  typedef const Block<ConstMatrixType,Dim,Dim,int(Mode)==(AffineCompact) && (Options&RowMajor)==0> ConstLinearPart;\n  /** type of read/write reference to the affine part of the transformation */\n  typedef typename internal::conditional<int(Mode)==int(AffineCompact),\n                              MatrixType&,\n                              Block<MatrixType,Dim,HDim> >::type AffinePart;\n  /** type of read reference to the affine part of the transformation */\n  typedef typename internal::conditional<int(Mode)==int(AffineCompact),\n                              const MatrixType&,\n                              const Block<const MatrixType,Dim,HDim> >::type ConstAffinePart;\n  /** type of a vector */\n  typedef Matrix<Scalar,Dim,1> VectorType;\n  /** type of a read/write reference to the translation part of the rotation */\n  typedef Block<MatrixType,Dim,1,int(Mode)==(AffineCompact)> TranslationPart;\n  /** type of a read reference to the translation part of the rotation */\n  typedef const Block<ConstMatrixType,Dim,1,int(Mode)==(AffineCompact)> ConstTranslationPart;\n  /** corresponding translation type */\n  typedef Translation<Scalar,Dim> TranslationType;\n  \n  // this intermediate enum is needed to avoid an ICE with gcc 3.4 and 4.0\n  enum { TransformTimeDiagonalMode = ((Mode==int(Isometry))?Affine:int(Mode)) };\n  /** The return type of the product between a diagonal matrix and a transform */\n  typedef Transform<Scalar,Dim,TransformTimeDiagonalMode> TransformTimeDiagonalReturnType;\n\nprotected:\n\n  MatrixType m_matrix;\n\npublic:\n\n  /** Default constructor without initialization of the meaningful coefficients.\n    * If Mode==Affine, then the last row is set to [0 ... 0 1] */\n  inline Transform()\n  {\n    check_template_params();\n    internal::transform_make_affine<(int(Mode)==Affine) ? Affine : AffineCompact>::run(m_matrix);\n  }\n\n  inline Transform(const Transform& other)\n  {\n    check_template_params();\n    m_matrix = other.m_matrix;\n  }\n\n  inline explicit Transform(const TranslationType& t)\n  {\n    check_template_params();\n    *this = t;\n  }\n  inline explicit Transform(const UniformScaling<Scalar>& s)\n  {\n    check_template_params();\n    *this = s;\n  }\n  template<typename Derived>\n  inline explicit Transform(const RotationBase<Derived, Dim>& r)\n  {\n    check_template_params();\n    *this = r;\n  }\n\n  inline Transform& operator=(const Transform& other)\n  { m_matrix = other.m_matrix; return *this; }\n\n  typedef internal::transform_take_affine_part<Transform> take_affine_part;\n\n  /** Constructs and initializes a transformation from a Dim^2 or a (Dim+1)^2 matrix. */\n  template<typename OtherDerived>\n  inline explicit Transform(const EigenBase<OtherDerived>& other)\n  {\n    EIGEN_STATIC_ASSERT((internal::is_same<Scalar,typename OtherDerived::Scalar>::value),\n      YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY);\n\n    check_template_params();\n    internal::transform_construct_from_matrix<OtherDerived,Mode,Options,Dim,HDim>::run(this, other.derived());\n  }\n\n  /** Set \\c *this from a Dim^2 or (Dim+1)^2 matrix. */\n  template<typename OtherDerived>\n  inline Transform& operator=(const EigenBase<OtherDerived>& other)\n  {\n    EIGEN_STATIC_ASSERT((internal::is_same<Scalar,typename OtherDerived::Scalar>::value),\n      YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY);\n\n    internal::transform_construct_from_matrix<OtherDerived,Mode,Options,Dim,HDim>::run(this, other.derived());\n    return *this;\n  }\n  \n  template<int OtherOptions>\n  inline Transform(const Transform<Scalar,Dim,Mode,OtherOptions>& other)\n  {\n    check_template_params();\n    // only the options change, we can directly copy the matrices\n    m_matrix = other.matrix();\n  }\n\n  template<int OtherMode,int OtherOptions>\n  inline Transform(const Transform<Scalar,Dim,OtherMode,OtherOptions>& other)\n  {\n    check_template_params();\n    // prevent conversions as:\n    // Affine | AffineCompact | Isometry = Projective\n    EIGEN_STATIC_ASSERT(EIGEN_IMPLIES(OtherMode==int(Projective), Mode==int(Projective)),\n                        YOU_PERFORMED_AN_INVALID_TRANSFORMATION_CONVERSION)\n\n    // prevent conversions as:\n    // Isometry = Affine | AffineCompact\n    EIGEN_STATIC_ASSERT(EIGEN_IMPLIES(OtherMode==int(Affine)||OtherMode==int(AffineCompact), Mode!=int(Isometry)),\n                        YOU_PERFORMED_AN_INVALID_TRANSFORMATION_CONVERSION)\n\n    enum { ModeIsAffineCompact = Mode == int(AffineCompact),\n           OtherModeIsAffineCompact = OtherMode == int(AffineCompact)\n    };\n\n    if(ModeIsAffineCompact == OtherModeIsAffineCompact)\n    {\n      // We need the block expression because the code is compiled for all\n      // combinations of transformations and will trigger a compile time error\n      // if one tries to assign the matrices directly\n      m_matrix.template block<Dim,Dim+1>(0,0) = other.matrix().template block<Dim,Dim+1>(0,0);\n      makeAffine();\n    }\n    else if(OtherModeIsAffineCompact)\n    {\n      typedef typename Transform<Scalar,Dim,OtherMode,OtherOptions>::MatrixType OtherMatrixType;\n      internal::transform_construct_from_matrix<OtherMatrixType,Mode,Options,Dim,HDim>::run(this, other.matrix());\n    }\n    else\n    {\n      // here we know that Mode == AffineCompact and OtherMode != AffineCompact.\n      // if OtherMode were Projective, the static assert above would already have caught it.\n      // So the only possibility is that OtherMode == Affine\n      linear() = other.linear();\n      translation() = other.translation();\n    }\n  }\n\n  template<typename OtherDerived>\n  Transform(const ReturnByValue<OtherDerived>& other)\n  {\n    check_template_params();\n    other.evalTo(*this);\n  }\n\n  template<typename OtherDerived>\n  Transform& operator=(const ReturnByValue<OtherDerived>& other)\n  {\n    other.evalTo(*this);\n    return *this;\n  }\n\n  #ifdef EIGEN_QT_SUPPORT\n  inline Transform(const QMatrix& other);\n  inline Transform& operator=(const QMatrix& other);\n  inline QMatrix toQMatrix(void) const;\n  inline Transform(const QTransform& other);\n  inline Transform& operator=(const QTransform& other);\n  inline QTransform toQTransform(void) const;\n  #endif\n\n  /** shortcut for m_matrix(row,col);\n    * \\sa MatrixBase::operator(Index,Index) const */\n  inline Scalar operator() (Index row, Index col) const { return m_matrix(row,col); }\n  /** shortcut for m_matrix(row,col);\n    * \\sa MatrixBase::operator(Index,Index) */\n  inline Scalar& operator() (Index row, Index col) { return m_matrix(row,col); }\n\n  /** \\returns a read-only expression of the transformation matrix */\n  inline const MatrixType& matrix() const { return m_matrix; }\n  /** \\returns a writable expression of the transformation matrix */\n  inline MatrixType& matrix() { return m_matrix; }\n\n  /** \\returns a read-only expression of the linear part of the transformation */\n  inline ConstLinearPart linear() const { return ConstLinearPart(m_matrix,0,0); }\n  /** \\returns a writable expression of the linear part of the transformation */\n  inline LinearPart linear() { return LinearPart(m_matrix,0,0); }\n\n  /** \\returns a read-only expression of the Dim x HDim affine part of the transformation */\n  inline ConstAffinePart affine() const { return take_affine_part::run(m_matrix); }\n  /** \\returns a writable expression of the Dim x HDim affine part of the transformation */\n  inline AffinePart affine() { return take_affine_part::run(m_matrix); }\n\n  /** \\returns a read-only expression of the translation vector of the transformation */\n  inline ConstTranslationPart translation() const { return ConstTranslationPart(m_matrix,0,Dim); }\n  /** \\returns a writable expression of the translation vector of the transformation */\n  inline TranslationPart translation() { return TranslationPart(m_matrix,0,Dim); }\n\n  /** \\returns an expression of the product between the transform \\c *this and a matrix expression \\a other.\n    *\n    * The right-hand-side \\a other can be either:\n    * \\li an homogeneous vector of size Dim+1,\n    * \\li a set of homogeneous vectors of size Dim+1 x N,\n    * \\li a transformation matrix of size Dim+1 x Dim+1.\n    *\n    * Moreover, if \\c *this represents an affine transformation (i.e., Mode!=Projective), then \\a other can also be:\n    * \\li a point of size Dim (computes: \\code this->linear() * other + this->translation()\\endcode),\n    * \\li a set of N points as a Dim x N matrix (computes: \\code (this->linear() * other).colwise() + this->translation()\\endcode),\n    *\n    * In all cases, the return type is a matrix or vector of same sizes as the right-hand-side \\a other.\n    *\n    * If you want to interpret \\a other as a linear or affine transformation, then first convert it to a Transform<> type,\n    * or do your own cooking.\n    *\n    * Finally, if you want to apply Affine transformations to vectors, then explicitly apply the linear part only:\n    * \\code\n    * Affine3f A;\n    * Vector3f v1, v2;\n    * v2 = A.linear() * v1;\n    * \\endcode\n    *\n    */\n  // note: this function is defined here because some compilers cannot find the respective declaration\n  template<typename OtherDerived>\n  EIGEN_STRONG_INLINE const typename OtherDerived::PlainObject\n  operator * (const EigenBase<OtherDerived> &other) const\n  { return internal::transform_right_product_impl<Transform, OtherDerived>::run(*this,other.derived()); }\n\n  /** \\returns the product expression of a transformation matrix \\a a times a transform \\a b\n    *\n    * The left hand side \\a other can be either:\n    * \\li a linear transformation matrix of size Dim x Dim,\n    * \\li an affine transformation matrix of size Dim x Dim+1,\n    * \\li a general transformation matrix of size Dim+1 x Dim+1.\n    */\n  template<typename OtherDerived> friend\n  inline const typename internal::transform_left_product_impl<OtherDerived,Mode,Options,_Dim,_Dim+1>::ResultType\n    operator * (const EigenBase<OtherDerived> &a, const Transform &b)\n  { return internal::transform_left_product_impl<OtherDerived,Mode,Options,Dim,HDim>::run(a.derived(),b); }\n\n  /** \\returns The product expression of a transform \\a a times a diagonal matrix \\a b\n    *\n    * The rhs diagonal matrix is interpreted as an affine scaling transformation. The\n    * product results in a Transform of the same type (mode) as the lhs only if the lhs \n    * mode is no isometry. In that case, the returned transform is an affinity.\n    */\n  template<typename DiagonalDerived>\n  inline const TransformTimeDiagonalReturnType\n    operator * (const DiagonalBase<DiagonalDerived> &b) const\n  {\n    TransformTimeDiagonalReturnType res(*this);\n    res.linear() *= b;\n    return res;\n  }\n\n  /** \\returns The product expression of a diagonal matrix \\a a times a transform \\a b\n    *\n    * The lhs diagonal matrix is interpreted as an affine scaling transformation. The\n    * product results in a Transform of the same type (mode) as the lhs only if the lhs \n    * mode is no isometry. In that case, the returned transform is an affinity.\n    */\n  template<typename DiagonalDerived>\n  friend inline TransformTimeDiagonalReturnType\n    operator * (const DiagonalBase<DiagonalDerived> &a, const Transform &b)\n  {\n    TransformTimeDiagonalReturnType res;\n    res.linear().noalias() = a*b.linear();\n    res.translation().noalias() = a*b.translation();\n    if (Mode!=int(AffineCompact))\n      res.matrix().row(Dim) = b.matrix().row(Dim);\n    return res;\n  }\n\n  template<typename OtherDerived>\n  inline Transform& operator*=(const EigenBase<OtherDerived>& other) { return *this = *this * other; }\n\n  /** Concatenates two transformations */\n  inline const Transform operator * (const Transform& other) const\n  {\n    return internal::transform_transform_product_impl<Transform,Transform>::run(*this,other);\n  }\n  \n  #ifdef __INTEL_COMPILER\nprivate:\n  // this intermediate structure permits to workaround a bug in ICC 11:\n  //   error: template instantiation resulted in unexpected function type of \"Eigen::Transform<double, 3, 32, 0>\n  //             (const Eigen::Transform<double, 3, 2, 0> &) const\"\n  //  (the meaning of a name may have changed since the template declaration -- the type of the template is:\n  // \"Eigen::internal::transform_transform_product_impl<Eigen::Transform<double, 3, 32, 0>,\n  //     Eigen::Transform<double, 3, Mode, Options>, <expression>>::ResultType (const Eigen::Transform<double, 3, Mode, Options> &) const\")\n  // \n  template<int OtherMode,int OtherOptions> struct icc_11_workaround\n  {\n    typedef internal::transform_transform_product_impl<Transform,Transform<Scalar,Dim,OtherMode,OtherOptions> > ProductType;\n    typedef typename ProductType::ResultType ResultType;\n  };\n  \npublic:\n  /** Concatenates two different transformations */\n  template<int OtherMode,int OtherOptions>\n  inline typename icc_11_workaround<OtherMode,OtherOptions>::ResultType\n    operator * (const Transform<Scalar,Dim,OtherMode,OtherOptions>& other) const\n  {\n    typedef typename icc_11_workaround<OtherMode,OtherOptions>::ProductType ProductType;\n    return ProductType::run(*this,other);\n  }\n  #else\n  /** Concatenates two different transformations */\n  template<int OtherMode,int OtherOptions>\n  inline typename internal::transform_transform_product_impl<Transform,Transform<Scalar,Dim,OtherMode,OtherOptions> >::ResultType\n    operator * (const Transform<Scalar,Dim,OtherMode,OtherOptions>& other) const\n  {\n    return internal::transform_transform_product_impl<Transform,Transform<Scalar,Dim,OtherMode,OtherOptions> >::run(*this,other);\n  }\n  #endif\n\n  /** \\sa MatrixBase::setIdentity() */\n  void setIdentity() { m_matrix.setIdentity(); }\n\n  /**\n   * \\brief Returns an identity transformation.\n   * \\todo In the future this function should be returning a Transform expression.\n   */\n  static const Transform Identity()\n  {\n    return Transform(MatrixType::Identity());\n  }\n\n  template<typename OtherDerived>\n  inline Transform& scale(const MatrixBase<OtherDerived> &other);\n\n  template<typename OtherDerived>\n  inline Transform& prescale(const MatrixBase<OtherDerived> &other);\n\n  inline Transform& scale(const Scalar& s);\n  inline Transform& prescale(const Scalar& s);\n\n  template<typename OtherDerived>\n  inline Transform& translate(const MatrixBase<OtherDerived> &other);\n\n  template<typename OtherDerived>\n  inline Transform& pretranslate(const MatrixBase<OtherDerived> &other);\n\n  template<typename RotationType>\n  inline Transform& rotate(const RotationType& rotation);\n\n  template<typename RotationType>\n  inline Transform& prerotate(const RotationType& rotation);\n\n  Transform& shear(const Scalar& sx, const Scalar& sy);\n  Transform& preshear(const Scalar& sx, const Scalar& sy);\n\n  inline Transform& operator=(const TranslationType& t);\n  inline Transform& operator*=(const TranslationType& t) { return translate(t.vector()); }\n  inline Transform operator*(const TranslationType& t) const;\n\n  inline Transform& operator=(const UniformScaling<Scalar>& t);\n  inline Transform& operator*=(const UniformScaling<Scalar>& s) { return scale(s.factor()); }\n  inline Transform<Scalar,Dim,(int(Mode)==int(Isometry)?int(Affine):int(Mode))> operator*(const UniformScaling<Scalar>& s) const\n  {\n    Transform<Scalar,Dim,(int(Mode)==int(Isometry)?int(Affine):int(Mode)),Options> res = *this;\n    res.scale(s.factor());\n    return res;\n  }\n\n  inline Transform& operator*=(const DiagonalMatrix<Scalar,Dim>& s) { linear() *= s; return *this; }\n\n  template<typename Derived>\n  inline Transform& operator=(const RotationBase<Derived,Dim>& r);\n  template<typename Derived>\n  inline Transform& operator*=(const RotationBase<Derived,Dim>& r) { return rotate(r.toRotationMatrix()); }\n  template<typename Derived>\n  inline Transform operator*(const RotationBase<Derived,Dim>& r) const;\n\n  const LinearMatrixType rotation() const;\n  template<typename RotationMatrixType, typename ScalingMatrixType>\n  void computeRotationScaling(RotationMatrixType *rotation, ScalingMatrixType *scaling) const;\n  template<typename ScalingMatrixType, typename RotationMatrixType>\n  void computeScalingRotation(ScalingMatrixType *scaling, RotationMatrixType *rotation) const;\n\n  template<typename PositionDerived, typename OrientationType, typename ScaleDerived>\n  Transform& fromPositionOrientationScale(const MatrixBase<PositionDerived> &position,\n    const OrientationType& orientation, const MatrixBase<ScaleDerived> &scale);\n\n  inline Transform inverse(TransformTraits traits = (TransformTraits)Mode) const;\n\n  /** \\returns a const pointer to the column major internal matrix */\n  const Scalar* data() const { return m_matrix.data(); }\n  /** \\returns a non-const pointer to the column major internal matrix */\n  Scalar* data() { return m_matrix.data(); }\n\n  /** \\returns \\c *this with scalar type casted to \\a NewScalarType\n    *\n    * Note that if \\a NewScalarType is equal to the current scalar type of \\c *this\n    * then this function smartly returns a const reference to \\c *this.\n    */\n  template<typename NewScalarType>\n  inline typename internal::cast_return_type<Transform,Transform<NewScalarType,Dim,Mode,Options> >::type cast() const\n  { return typename internal::cast_return_type<Transform,Transform<NewScalarType,Dim,Mode,Options> >::type(*this); }\n\n  /** Copy constructor with scalar type conversion */\n  template<typename OtherScalarType>\n  inline explicit Transform(const Transform<OtherScalarType,Dim,Mode,Options>& other)\n  {\n    check_template_params();\n    m_matrix = other.matrix().template cast<Scalar>();\n  }\n\n  /** \\returns \\c true if \\c *this is approximately equal to \\a other, within the precision\n    * determined by \\a prec.\n    *\n    * \\sa MatrixBase::isApprox() */\n  bool isApprox(const Transform& other, const typename NumTraits<Scalar>::Real& prec = NumTraits<Scalar>::dummy_precision()) const\n  { return m_matrix.isApprox(other.m_matrix, prec); }\n\n  /** Sets the last row to [0 ... 0 1]\n    */\n  void makeAffine()\n  {\n    internal::transform_make_affine<int(Mode)>::run(m_matrix);\n  }\n\n  /** \\internal\n    * \\returns the Dim x Dim linear part if the transformation is affine,\n    *          and the HDim x Dim part for projective transformations.\n    */\n  inline Block<MatrixType,int(Mode)==int(Projective)?HDim:Dim,Dim> linearExt()\n  { return m_matrix.template block<int(Mode)==int(Projective)?HDim:Dim,Dim>(0,0); }\n  /** \\internal\n    * \\returns the Dim x Dim linear part if the transformation is affine,\n    *          and the HDim x Dim part for projective transformations.\n    */\n  inline const Block<MatrixType,int(Mode)==int(Projective)?HDim:Dim,Dim> linearExt() const\n  { return m_matrix.template block<int(Mode)==int(Projective)?HDim:Dim,Dim>(0,0); }\n\n  /** \\internal\n    * \\returns the translation part if the transformation is affine,\n    *          and the last column for projective transformations.\n    */\n  inline Block<MatrixType,int(Mode)==int(Projective)?HDim:Dim,1> translationExt()\n  { return m_matrix.template block<int(Mode)==int(Projective)?HDim:Dim,1>(0,Dim); }\n  /** \\internal\n    * \\returns the translation part if the transformation is affine,\n    *          and the last column for projective transformations.\n    */\n  inline const Block<MatrixType,int(Mode)==int(Projective)?HDim:Dim,1> translationExt() const\n  { return m_matrix.template block<int(Mode)==int(Projective)?HDim:Dim,1>(0,Dim); }\n\n\n  #ifdef EIGEN_TRANSFORM_PLUGIN\n  #include EIGEN_TRANSFORM_PLUGIN\n  #endif\n  \nprotected:\n  #ifndef EIGEN_PARSED_BY_DOXYGEN\n    static EIGEN_STRONG_INLINE void check_template_params()\n    {\n      EIGEN_STATIC_ASSERT((Options & (DontAlign|RowMajor)) == Options, INVALID_MATRIX_TEMPLATE_PARAMETERS)\n    }\n  #endif\n\n};\n\n/** \\ingroup Geometry_Module */\ntypedef Transform<float,2,Isometry> Isometry2f;\n/** \\ingroup Geometry_Module */\ntypedef Transform<float,3,Isometry> Isometry3f;\n/** \\ingroup Geometry_Module */\ntypedef Transform<double,2,Isometry> Isometry2d;\n/** \\ingroup Geometry_Module */\ntypedef Transform<double,3,Isometry> Isometry3d;\n\n/** \\ingroup Geometry_Module */\ntypedef Transform<float,2,Affine> Affine2f;\n/** \\ingroup Geometry_Module */\ntypedef Transform<float,3,Affine> Affine3f;\n/** \\ingroup Geometry_Module */\ntypedef Transform<double,2,Affine> Affine2d;\n/** \\ingroup Geometry_Module */\ntypedef Transform<double,3,Affine> Affine3d;\n\n/** \\ingroup Geometry_Module */\ntypedef Transform<float,2,AffineCompact> AffineCompact2f;\n/** \\ingroup Geometry_Module */\ntypedef Transform<float,3,AffineCompact> AffineCompact3f;\n/** \\ingroup Geometry_Module */\ntypedef Transform<double,2,AffineCompact> AffineCompact2d;\n/** \\ingroup Geometry_Module */\ntypedef Transform<double,3,AffineCompact> AffineCompact3d;\n\n/** \\ingroup Geometry_Module */\ntypedef Transform<float,2,Projective> Projective2f;\n/** \\ingroup Geometry_Module */\ntypedef Transform<float,3,Projective> Projective3f;\n/** \\ingroup Geometry_Module */\ntypedef Transform<double,2,Projective> Projective2d;\n/** \\ingroup Geometry_Module */\ntypedef Transform<double,3,Projective> Projective3d;\n\n/**************************\n*** Optional QT support ***\n**************************/\n\n#ifdef EIGEN_QT_SUPPORT\n/** Initializes \\c *this from a QMatrix assuming the dimension is 2.\n  *\n  * This function is available only if the token EIGEN_QT_SUPPORT is defined.\n  */\ntemplate<typename Scalar, int Dim, int Mode,int Options>\nTransform<Scalar,Dim,Mode,Options>::Transform(const QMatrix& other)\n{\n  check_template_params();\n  *this = other;\n}\n\n/** Set \\c *this from a QMatrix assuming the dimension is 2.\n  *\n  * This function is available only if the token EIGEN_QT_SUPPORT is defined.\n  */\ntemplate<typename Scalar, int Dim, int Mode,int Options>\nTransform<Scalar,Dim,Mode,Options>& Transform<Scalar,Dim,Mode,Options>::operator=(const QMatrix& other)\n{\n  EIGEN_STATIC_ASSERT(Dim==2, YOU_MADE_A_PROGRAMMING_MISTAKE)\n  m_matrix << other.m11(), other.m21(), other.dx(),\n              other.m12(), other.m22(), other.dy(),\n              0, 0, 1;\n  return *this;\n}\n\n/** \\returns a QMatrix from \\c *this assuming the dimension is 2.\n  *\n  * \\warning this conversion might loss data if \\c *this is not affine\n  *\n  * This function is available only if the token EIGEN_QT_SUPPORT is defined.\n  */\ntemplate<typename Scalar, int Dim, int Mode, int Options>\nQMatrix Transform<Scalar,Dim,Mode,Options>::toQMatrix(void) const\n{\n  check_template_params();\n  EIGEN_STATIC_ASSERT(Dim==2, YOU_MADE_A_PROGRAMMING_MISTAKE)\n  return QMatrix(m_matrix.coeff(0,0), m_matrix.coeff(1,0),\n                 m_matrix.coeff(0,1), m_matrix.coeff(1,1),\n                 m_matrix.coeff(0,2), m_matrix.coeff(1,2));\n}\n\n/** Initializes \\c *this from a QTransform assuming the dimension is 2.\n  *\n  * This function is available only if the token EIGEN_QT_SUPPORT is defined.\n  */\ntemplate<typename Scalar, int Dim, int Mode,int Options>\nTransform<Scalar,Dim,Mode,Options>::Transform(const QTransform& other)\n{\n  check_template_params();\n  *this = other;\n}\n\n/** Set \\c *this from a QTransform assuming the dimension is 2.\n  *\n  * This function is available only if the token EIGEN_QT_SUPPORT is defined.\n  */\ntemplate<typename Scalar, int Dim, int Mode, int Options>\nTransform<Scalar,Dim,Mode,Options>& Transform<Scalar,Dim,Mode,Options>::operator=(const QTransform& other)\n{\n  check_template_params();\n  EIGEN_STATIC_ASSERT(Dim==2, YOU_MADE_A_PROGRAMMING_MISTAKE)\n  if (Mode == int(AffineCompact))\n    m_matrix << other.m11(), other.m21(), other.dx(),\n                other.m12(), other.m22(), other.dy();\n  else\n    m_matrix << other.m11(), other.m21(), other.dx(),\n                other.m12(), other.m22(), other.dy(),\n                other.m13(), other.m23(), other.m33();\n  return *this;\n}\n\n/** \\returns a QTransform from \\c *this assuming the dimension is 2.\n  *\n  * This function is available only if the token EIGEN_QT_SUPPORT is defined.\n  */\ntemplate<typename Scalar, int Dim, int Mode, int Options>\nQTransform Transform<Scalar,Dim,Mode,Options>::toQTransform(void) const\n{\n  EIGEN_STATIC_ASSERT(Dim==2, YOU_MADE_A_PROGRAMMING_MISTAKE)\n  if (Mode == int(AffineCompact))\n    return QTransform(m_matrix.coeff(0,0), m_matrix.coeff(1,0),\n                      m_matrix.coeff(0,1), m_matrix.coeff(1,1),\n                      m_matrix.coeff(0,2), m_matrix.coeff(1,2));\n  else\n    return QTransform(m_matrix.coeff(0,0), m_matrix.coeff(1,0), m_matrix.coeff(2,0),\n                      m_matrix.coeff(0,1), m_matrix.coeff(1,1), m_matrix.coeff(2,1),\n                      m_matrix.coeff(0,2), m_matrix.coeff(1,2), m_matrix.coeff(2,2));\n}\n#endif\n\n/*********************\n*** Procedural API ***\n*********************/\n\n/** Applies on the right the non uniform scale transformation represented\n  * by the vector \\a other to \\c *this and returns a reference to \\c *this.\n  * \\sa prescale()\n  */\ntemplate<typename Scalar, int Dim, int Mode, int Options>\ntemplate<typename OtherDerived>\nTransform<Scalar,Dim,Mode,Options>&\nTransform<Scalar,Dim,Mode,Options>::scale(const MatrixBase<OtherDerived> &other)\n{\n  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived,int(Dim))\n  EIGEN_STATIC_ASSERT(Mode!=int(Isometry), THIS_METHOD_IS_ONLY_FOR_SPECIFIC_TRANSFORMATIONS)\n  linearExt().noalias() = (linearExt() * other.asDiagonal());\n  return *this;\n}\n\n/** Applies on the right a uniform scale of a factor \\a c to \\c *this\n  * and returns a reference to \\c *this.\n  * \\sa prescale(Scalar)\n  */\ntemplate<typename Scalar, int Dim, int Mode, int Options>\ninline Transform<Scalar,Dim,Mode,Options>& Transform<Scalar,Dim,Mode,Options>::scale(const Scalar& s)\n{\n  EIGEN_STATIC_ASSERT(Mode!=int(Isometry), THIS_METHOD_IS_ONLY_FOR_SPECIFIC_TRANSFORMATIONS)\n  linearExt() *= s;\n  return *this;\n}\n\n/** Applies on the left the non uniform scale transformation represented\n  * by the vector \\a other to \\c *this and returns a reference to \\c *this.\n  * \\sa scale()\n  */\ntemplate<typename Scalar, int Dim, int Mode, int Options>\ntemplate<typename OtherDerived>\nTransform<Scalar,Dim,Mode,Options>&\nTransform<Scalar,Dim,Mode,Options>::prescale(const MatrixBase<OtherDerived> &other)\n{\n  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived,int(Dim))\n  EIGEN_STATIC_ASSERT(Mode!=int(Isometry), THIS_METHOD_IS_ONLY_FOR_SPECIFIC_TRANSFORMATIONS)\n  m_matrix.template block<Dim,HDim>(0,0).noalias() = (other.asDiagonal() * m_matrix.template block<Dim,HDim>(0,0));\n  return *this;\n}\n\n/** Applies on the left a uniform scale of a factor \\a c to \\c *this\n  * and returns a reference to \\c *this.\n  * \\sa scale(Scalar)\n  */\ntemplate<typename Scalar, int Dim, int Mode, int Options>\ninline Transform<Scalar,Dim,Mode,Options>& Transform<Scalar,Dim,Mode,Options>::prescale(const Scalar& s)\n{\n  EIGEN_STATIC_ASSERT(Mode!=int(Isometry), THIS_METHOD_IS_ONLY_FOR_SPECIFIC_TRANSFORMATIONS)\n  m_matrix.template topRows<Dim>() *= s;\n  return *this;\n}\n\n/** Applies on the right the translation matrix represented by the vector \\a other\n  * to \\c *this and returns a reference to \\c *this.\n  * \\sa pretranslate()\n  */\ntemplate<typename Scalar, int Dim, int Mode, int Options>\ntemplate<typename OtherDerived>\nTransform<Scalar,Dim,Mode,Options>&\nTransform<Scalar,Dim,Mode,Options>::translate(const MatrixBase<OtherDerived> &other)\n{\n  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived,int(Dim))\n  translationExt() += linearExt() * other;\n  return *this;\n}\n\n/** Applies on the left the translation matrix represented by the vector \\a other\n  * to \\c *this and returns a reference to \\c *this.\n  * \\sa translate()\n  */\ntemplate<typename Scalar, int Dim, int Mode, int Options>\ntemplate<typename OtherDerived>\nTransform<Scalar,Dim,Mode,Options>&\nTransform<Scalar,Dim,Mode,Options>::pretranslate(const MatrixBase<OtherDerived> &other)\n{\n  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived,int(Dim))\n  if(int(Mode)==int(Projective))\n    affine() += other * m_matrix.row(Dim);\n  else\n    translation() += other;\n  return *this;\n}\n\n/** Applies on the right the rotation represented by the rotation \\a rotation\n  * to \\c *this and returns a reference to \\c *this.\n  *\n  * The template parameter \\a RotationType is the type of the rotation which\n  * must be known by internal::toRotationMatrix<>.\n  *\n  * Natively supported types includes:\n  *   - any scalar (2D),\n  *   - a Dim x Dim matrix expression,\n  *   - a Quaternion (3D),\n  *   - a AngleAxis (3D)\n  *\n  * This mechanism is easily extendable to support user types such as Euler angles,\n  * or a pair of Quaternion for 4D rotations.\n  *\n  * \\sa rotate(Scalar), class Quaternion, class AngleAxis, prerotate(RotationType)\n  */\ntemplate<typename Scalar, int Dim, int Mode, int Options>\ntemplate<typename RotationType>\nTransform<Scalar,Dim,Mode,Options>&\nTransform<Scalar,Dim,Mode,Options>::rotate(const RotationType& rotation)\n{\n  linearExt() *= internal::toRotationMatrix<Scalar,Dim>(rotation);\n  return *this;\n}\n\n/** Applies on the left the rotation represented by the rotation \\a rotation\n  * to \\c *this and returns a reference to \\c *this.\n  *\n  * See rotate() for further details.\n  *\n  * \\sa rotate()\n  */\ntemplate<typename Scalar, int Dim, int Mode, int Options>\ntemplate<typename RotationType>\nTransform<Scalar,Dim,Mode,Options>&\nTransform<Scalar,Dim,Mode,Options>::prerotate(const RotationType& rotation)\n{\n  m_matrix.template block<Dim,HDim>(0,0) = internal::toRotationMatrix<Scalar,Dim>(rotation)\n                                         * m_matrix.template block<Dim,HDim>(0,0);\n  return *this;\n}\n\n/** Applies on the right the shear transformation represented\n  * by the vector \\a other to \\c *this and returns a reference to \\c *this.\n  * \\warning 2D only.\n  * \\sa preshear()\n  */\ntemplate<typename Scalar, int Dim, int Mode, int Options>\nTransform<Scalar,Dim,Mode,Options>&\nTransform<Scalar,Dim,Mode,Options>::shear(const Scalar& sx, const Scalar& sy)\n{\n  EIGEN_STATIC_ASSERT(int(Dim)==2, YOU_MADE_A_PROGRAMMING_MISTAKE)\n  EIGEN_STATIC_ASSERT(Mode!=int(Isometry), THIS_METHOD_IS_ONLY_FOR_SPECIFIC_TRANSFORMATIONS)\n  VectorType tmp = linear().col(0)*sy + linear().col(1);\n  linear() << linear().col(0) + linear().col(1)*sx, tmp;\n  return *this;\n}\n\n/** Applies on the left the shear transformation represented\n  * by the vector \\a other to \\c *this and returns a reference to \\c *this.\n  * \\warning 2D only.\n  * \\sa shear()\n  */\ntemplate<typename Scalar, int Dim, int Mode, int Options>\nTransform<Scalar,Dim,Mode,Options>&\nTransform<Scalar,Dim,Mode,Options>::preshear(const Scalar& sx, const Scalar& sy)\n{\n  EIGEN_STATIC_ASSERT(int(Dim)==2, YOU_MADE_A_PROGRAMMING_MISTAKE)\n  EIGEN_STATIC_ASSERT(Mode!=int(Isometry), THIS_METHOD_IS_ONLY_FOR_SPECIFIC_TRANSFORMATIONS)\n  m_matrix.template block<Dim,HDim>(0,0) = LinearMatrixType(1, sx, sy, 1) * m_matrix.template block<Dim,HDim>(0,0);\n  return *this;\n}\n\n/******************************************************\n*** Scaling, Translation and Rotation compatibility ***\n******************************************************/\n\ntemplate<typename Scalar, int Dim, int Mode, int Options>\ninline Transform<Scalar,Dim,Mode,Options>& Transform<Scalar,Dim,Mode,Options>::operator=(const TranslationType& t)\n{\n  linear().setIdentity();\n  translation() = t.vector();\n  makeAffine();\n  return *this;\n}\n\ntemplate<typename Scalar, int Dim, int Mode, int Options>\ninline Transform<Scalar,Dim,Mode,Options> Transform<Scalar,Dim,Mode,Options>::operator*(const TranslationType& t) const\n{\n  Transform res = *this;\n  res.translate(t.vector());\n  return res;\n}\n\ntemplate<typename Scalar, int Dim, int Mode, int Options>\ninline Transform<Scalar,Dim,Mode,Options>& Transform<Scalar,Dim,Mode,Options>::operator=(const UniformScaling<Scalar>& s)\n{\n  m_matrix.setZero();\n  linear().diagonal().fill(s.factor());\n  makeAffine();\n  return *this;\n}\n\ntemplate<typename Scalar, int Dim, int Mode, int Options>\ntemplate<typename Derived>\ninline Transform<Scalar,Dim,Mode,Options>& Transform<Scalar,Dim,Mode,Options>::operator=(const RotationBase<Derived,Dim>& r)\n{\n  linear() = internal::toRotationMatrix<Scalar,Dim>(r);\n  translation().setZero();\n  makeAffine();\n  return *this;\n}\n\ntemplate<typename Scalar, int Dim, int Mode, int Options>\ntemplate<typename Derived>\ninline Transform<Scalar,Dim,Mode,Options> Transform<Scalar,Dim,Mode,Options>::operator*(const RotationBase<Derived,Dim>& r) const\n{\n  Transform res = *this;\n  res.rotate(r.derived());\n  return res;\n}\n\n/************************\n*** Special functions ***\n************************/\n\n/** \\returns the rotation part of the transformation\n  *\n  *\n  * \\svd_module\n  *\n  * \\sa computeRotationScaling(), computeScalingRotation(), class SVD\n  */\ntemplate<typename Scalar, int Dim, int Mode, int Options>\nconst typename Transform<Scalar,Dim,Mode,Options>::LinearMatrixType\nTransform<Scalar,Dim,Mode,Options>::rotation() const\n{\n  LinearMatrixType result;\n  computeRotationScaling(&result, (LinearMatrixType*)0);\n  return result;\n}\n\n\n/** decomposes the linear part of the transformation as a product rotation x scaling, the scaling being\n  * not necessarily positive.\n  *\n  * If either pointer is zero, the corresponding computation is skipped.\n  *\n  *\n  *\n  * \\svd_module\n  *\n  * \\sa computeScalingRotation(), rotation(), class SVD\n  */\ntemplate<typename Scalar, int Dim, int Mode, int Options>\ntemplate<typename RotationMatrixType, typename ScalingMatrixType>\nvoid Transform<Scalar,Dim,Mode,Options>::computeRotationScaling(RotationMatrixType *rotation, ScalingMatrixType *scaling) const\n{\n  JacobiSVD<LinearMatrixType> svd(linear(), ComputeFullU | ComputeFullV);\n\n  Scalar x = (svd.matrixU() * svd.matrixV().adjoint()).determinant(); // so x has absolute value 1\n  VectorType sv(svd.singularValues());\n  sv.coeffRef(0) *= x;\n  if(scaling) scaling->lazyAssign(svd.matrixV() * sv.asDiagonal() * svd.matrixV().adjoint());\n  if(rotation)\n  {\n    LinearMatrixType m(svd.matrixU());\n    m.col(0) /= x;\n    rotation->lazyAssign(m * svd.matrixV().adjoint());\n  }\n}\n\n/** decomposes the linear part of the transformation as a product rotation x scaling, the scaling being\n  * not necessarily positive.\n  *\n  * If either pointer is zero, the corresponding computation is skipped.\n  *\n  *\n  *\n  * \\svd_module\n  *\n  * \\sa computeRotationScaling(), rotation(), class SVD\n  */\ntemplate<typename Scalar, int Dim, int Mode, int Options>\ntemplate<typename ScalingMatrixType, typename RotationMatrixType>\nvoid Transform<Scalar,Dim,Mode,Options>::computeScalingRotation(ScalingMatrixType *scaling, RotationMatrixType *rotation) const\n{\n  JacobiSVD<LinearMatrixType> svd(linear(), ComputeFullU | ComputeFullV);\n\n  Scalar x = (svd.matrixU() * svd.matrixV().adjoint()).determinant(); // so x has absolute value 1\n  VectorType sv(svd.singularValues());\n  sv.coeffRef(0) *= x;\n  if(scaling) scaling->lazyAssign(svd.matrixU() * sv.asDiagonal() * svd.matrixU().adjoint());\n  if(rotation)\n  {\n    LinearMatrixType m(svd.matrixU());\n    m.col(0) /= x;\n    rotation->lazyAssign(m * svd.matrixV().adjoint());\n  }\n}\n\n/** Convenient method to set \\c *this from a position, orientation and scale\n  * of a 3D object.\n  */\ntemplate<typename Scalar, int Dim, int Mode, int Options>\ntemplate<typename PositionDerived, typename OrientationType, typename ScaleDerived>\nTransform<Scalar,Dim,Mode,Options>&\nTransform<Scalar,Dim,Mode,Options>::fromPositionOrientationScale(const MatrixBase<PositionDerived> &position,\n  const OrientationType& orientation, const MatrixBase<ScaleDerived> &scale)\n{\n  linear() = internal::toRotationMatrix<Scalar,Dim>(orientation);\n  linear() *= scale.asDiagonal();\n  translation() = position;\n  makeAffine();\n  return *this;\n}\n\nnamespace internal {\n\ntemplate<int Mode>\nstruct transform_make_affine\n{\n  template<typename MatrixType>\n  static void run(MatrixType &mat)\n  {\n    static const int Dim = MatrixType::ColsAtCompileTime-1;\n    mat.template block<1,Dim>(Dim,0).setZero();\n    mat.coeffRef(Dim,Dim) = typename MatrixType::Scalar(1);\n  }\n};\n\ntemplate<>\nstruct transform_make_affine<AffineCompact>\n{\n  template<typename MatrixType> static void run(MatrixType &) { }\n};\n    \n// selector needed to avoid taking the inverse of a 3x4 matrix\ntemplate<typename TransformType, int Mode=TransformType::Mode>\nstruct projective_transform_inverse\n{\n  static inline void run(const TransformType&, TransformType&)\n  {}\n};\n\ntemplate<typename TransformType>\nstruct projective_transform_inverse<TransformType, Projective>\n{\n  static inline void run(const TransformType& m, TransformType& res)\n  {\n    res.matrix() = m.matrix().inverse();\n  }\n};\n\n} // end namespace internal\n\n\n/**\n  *\n  * \\returns the inverse transformation according to some given knowledge\n  * on \\c *this.\n  *\n  * \\param hint allows to optimize the inversion process when the transformation\n  * is known to be not a general transformation (optional). The possible values are:\n  *  - #Projective if the transformation is not necessarily affine, i.e., if the\n  *    last row is not guaranteed to be [0 ... 0 1]\n  *  - #Affine if the last row can be assumed to be [0 ... 0 1]\n  *  - #Isometry if the transformation is only a concatenations of translations\n  *    and rotations.\n  *  The default is the template class parameter \\c Mode.\n  *\n  * \\warning unless \\a traits is always set to NoShear or NoScaling, this function\n  * requires the generic inverse method of MatrixBase defined in the LU module. If\n  * you forget to include this module, then you will get hard to debug linking errors.\n  *\n  * \\sa MatrixBase::inverse()\n  */\ntemplate<typename Scalar, int Dim, int Mode, int Options>\nTransform<Scalar,Dim,Mode,Options>\nTransform<Scalar,Dim,Mode,Options>::inverse(TransformTraits hint) const\n{\n  Transform res;\n  if (hint == Projective)\n  {\n    internal::projective_transform_inverse<Transform>::run(*this, res);\n  }\n  else\n  {\n    if (hint == Isometry)\n    {\n      res.matrix().template topLeftCorner<Dim,Dim>() = linear().transpose();\n    }\n    else if(hint&Affine)\n    {\n      res.matrix().template topLeftCorner<Dim,Dim>() = linear().inverse();\n    }\n    else\n    {\n      eigen_assert(false && \"Invalid transform traits in Transform::Inverse\");\n    }\n    // translation and remaining parts\n    res.matrix().template topRightCorner<Dim,1>()\n      = - res.matrix().template topLeftCorner<Dim,Dim>() * translation();\n    res.makeAffine(); // we do need this, because in the beginning res is uninitialized\n  }\n  return res;\n}\n\nnamespace internal {\n\n/*****************************************************\n*** Specializations of take affine part            ***\n*****************************************************/\n\ntemplate<typename TransformType> struct transform_take_affine_part {\n  typedef typename TransformType::MatrixType MatrixType;\n  typedef typename TransformType::AffinePart AffinePart;\n  typedef typename TransformType::ConstAffinePart ConstAffinePart;\n  static inline AffinePart run(MatrixType& m)\n  { return m.template block<TransformType::Dim,TransformType::HDim>(0,0); }\n  static inline ConstAffinePart run(const MatrixType& m)\n  { return m.template block<TransformType::Dim,TransformType::HDim>(0,0); }\n};\n\ntemplate<typename Scalar, int Dim, int Options>\nstruct transform_take_affine_part<Transform<Scalar,Dim,AffineCompact, Options> > {\n  typedef typename Transform<Scalar,Dim,AffineCompact,Options>::MatrixType MatrixType;\n  static inline MatrixType& run(MatrixType& m) { return m; }\n  static inline const MatrixType& run(const MatrixType& m) { return m; }\n};\n\n/*****************************************************\n*** Specializations of construct from matrix       ***\n*****************************************************/\n\ntemplate<typename Other, int Mode, int Options, int Dim, int HDim>\nstruct transform_construct_from_matrix<Other, Mode,Options,Dim,HDim, Dim,Dim>\n{\n  static inline void run(Transform<typename Other::Scalar,Dim,Mode,Options> *transform, const Other& other)\n  {\n    transform->linear() = other;\n    transform->translation().setZero();\n    transform->makeAffine();\n  }\n};\n\ntemplate<typename Other, int Mode, int Options, int Dim, int HDim>\nstruct transform_construct_from_matrix<Other, Mode,Options,Dim,HDim, Dim,HDim>\n{\n  static inline void run(Transform<typename Other::Scalar,Dim,Mode,Options> *transform, const Other& other)\n  {\n    transform->affine() = other;\n    transform->makeAffine();\n  }\n};\n\ntemplate<typename Other, int Mode, int Options, int Dim, int HDim>\nstruct transform_construct_from_matrix<Other, Mode,Options,Dim,HDim, HDim,HDim>\n{\n  static inline void run(Transform<typename Other::Scalar,Dim,Mode,Options> *transform, const Other& other)\n  { transform->matrix() = other; }\n};\n\ntemplate<typename Other, int Options, int Dim, int HDim>\nstruct transform_construct_from_matrix<Other, AffineCompact,Options,Dim,HDim, HDim,HDim>\n{\n  static inline void run(Transform<typename Other::Scalar,Dim,AffineCompact,Options> *transform, const Other& other)\n  { transform->matrix() = other.template block<Dim,HDim>(0,0); }\n};\n\n/**********************************************************\n***   Specializations of operator* with rhs EigenBase   ***\n**********************************************************/\n\ntemplate<int LhsMode,int RhsMode>\nstruct transform_product_result\n{\n  enum \n  { \n    Mode =\n      (LhsMode == (int)Projective    || RhsMode == (int)Projective    ) ? Projective :\n      (LhsMode == (int)Affine        || RhsMode == (int)Affine        ) ? Affine :\n      (LhsMode == (int)AffineCompact || RhsMode == (int)AffineCompact ) ? AffineCompact :\n      (LhsMode == (int)Isometry      || RhsMode == (int)Isometry      ) ? Isometry : Projective\n  };\n};\n\ntemplate< typename TransformType, typename MatrixType >\nstruct transform_right_product_impl< TransformType, MatrixType, 0 >\n{\n  typedef typename MatrixType::PlainObject ResultType;\n\n  static EIGEN_STRONG_INLINE ResultType run(const TransformType& T, const MatrixType& other)\n  {\n    return T.matrix() * other;\n  }\n};\n\ntemplate< typename TransformType, typename MatrixType >\nstruct transform_right_product_impl< TransformType, MatrixType, 1 >\n{\n  enum { \n    Dim = TransformType::Dim, \n    HDim = TransformType::HDim,\n    OtherRows = MatrixType::RowsAtCompileTime,\n    OtherCols = MatrixType::ColsAtCompileTime\n  };\n\n  typedef typename MatrixType::PlainObject ResultType;\n\n  static EIGEN_STRONG_INLINE ResultType run(const TransformType& T, const MatrixType& other)\n  {\n    EIGEN_STATIC_ASSERT(OtherRows==HDim, YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES);\n\n    typedef Block<ResultType, Dim, OtherCols, int(MatrixType::RowsAtCompileTime)==Dim> TopLeftLhs;\n\n    ResultType res(other.rows(),other.cols());\n    TopLeftLhs(res, 0, 0, Dim, other.cols()).noalias() = T.affine() * other;\n    res.row(OtherRows-1) = other.row(OtherRows-1);\n    \n    return res;\n  }\n};\n\ntemplate< typename TransformType, typename MatrixType >\nstruct transform_right_product_impl< TransformType, MatrixType, 2 >\n{\n  enum { \n    Dim = TransformType::Dim, \n    HDim = TransformType::HDim,\n    OtherRows = MatrixType::RowsAtCompileTime,\n    OtherCols = MatrixType::ColsAtCompileTime\n  };\n\n  typedef typename MatrixType::PlainObject ResultType;\n\n  static EIGEN_STRONG_INLINE ResultType run(const TransformType& T, const MatrixType& other)\n  {\n    EIGEN_STATIC_ASSERT(OtherRows==Dim, YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES);\n\n    typedef Block<ResultType, Dim, OtherCols, true> TopLeftLhs;\n    ResultType res(Replicate<typename TransformType::ConstTranslationPart, 1, OtherCols>(T.translation(),1,other.cols()));\n    TopLeftLhs(res, 0, 0, Dim, other.cols()).noalias() += T.linear() * other;\n\n    return res;\n  }\n};\n\n/**********************************************************\n***   Specializations of operator* with lhs EigenBase   ***\n**********************************************************/\n\n// generic HDim x HDim matrix * T => Projective\ntemplate<typename Other,int Mode, int Options, int Dim, int HDim>\nstruct transform_left_product_impl<Other,Mode,Options,Dim,HDim, HDim,HDim>\n{\n  typedef Transform<typename Other::Scalar,Dim,Mode,Options> TransformType;\n  typedef typename TransformType::MatrixType MatrixType;\n  typedef Transform<typename Other::Scalar,Dim,Projective,Options> ResultType;\n  static ResultType run(const Other& other,const TransformType& tr)\n  { return ResultType(other * tr.matrix()); }\n};\n\n// generic HDim x HDim matrix * AffineCompact => Projective\ntemplate<typename Other, int Options, int Dim, int HDim>\nstruct transform_left_product_impl<Other,AffineCompact,Options,Dim,HDim, HDim,HDim>\n{\n  typedef Transform<typename Other::Scalar,Dim,AffineCompact,Options> TransformType;\n  typedef typename TransformType::MatrixType MatrixType;\n  typedef Transform<typename Other::Scalar,Dim,Projective,Options> ResultType;\n  static ResultType run(const Other& other,const TransformType& tr)\n  {\n    ResultType res;\n    res.matrix().noalias() = other.template block<HDim,Dim>(0,0) * tr.matrix();\n    res.matrix().col(Dim) += other.col(Dim);\n    return res;\n  }\n};\n\n// affine matrix * T\ntemplate<typename Other,int Mode, int Options, int Dim, int HDim>\nstruct transform_left_product_impl<Other,Mode,Options,Dim,HDim, Dim,HDim>\n{\n  typedef Transform<typename Other::Scalar,Dim,Mode,Options> TransformType;\n  typedef typename TransformType::MatrixType MatrixType;\n  typedef TransformType ResultType;\n  static ResultType run(const Other& other,const TransformType& tr)\n  {\n    ResultType res;\n    res.affine().noalias() = other * tr.matrix();\n    res.matrix().row(Dim) = tr.matrix().row(Dim);\n    return res;\n  }\n};\n\n// affine matrix * AffineCompact\ntemplate<typename Other, int Options, int Dim, int HDim>\nstruct transform_left_product_impl<Other,AffineCompact,Options,Dim,HDim, Dim,HDim>\n{\n  typedef Transform<typename Other::Scalar,Dim,AffineCompact,Options> TransformType;\n  typedef typename TransformType::MatrixType MatrixType;\n  typedef TransformType ResultType;\n  static ResultType run(const Other& other,const TransformType& tr)\n  {\n    ResultType res;\n    res.matrix().noalias() = other.template block<Dim,Dim>(0,0) * tr.matrix();\n    res.translation() += other.col(Dim);\n    return res;\n  }\n};\n\n// linear matrix * T\ntemplate<typename Other,int Mode, int Options, int Dim, int HDim>\nstruct transform_left_product_impl<Other,Mode,Options,Dim,HDim, Dim,Dim>\n{\n  typedef Transform<typename Other::Scalar,Dim,Mode,Options> TransformType;\n  typedef typename TransformType::MatrixType MatrixType;\n  typedef TransformType ResultType;\n  static ResultType run(const Other& other, const TransformType& tr)\n  {\n    TransformType res;\n    if(Mode!=int(AffineCompact))\n      res.matrix().row(Dim) = tr.matrix().row(Dim);\n    res.matrix().template topRows<Dim>().noalias()\n      = other * tr.matrix().template topRows<Dim>();\n    return res;\n  }\n};\n\n/**********************************************************\n*** Specializations of operator* with another Transform ***\n**********************************************************/\n\ntemplate<typename Scalar, int Dim, int LhsMode, int LhsOptions, int RhsMode, int RhsOptions>\nstruct transform_transform_product_impl<Transform<Scalar,Dim,LhsMode,LhsOptions>,Transform<Scalar,Dim,RhsMode,RhsOptions>,false >\n{\n  enum { ResultMode = transform_product_result<LhsMode,RhsMode>::Mode };\n  typedef Transform<Scalar,Dim,LhsMode,LhsOptions> Lhs;\n  typedef Transform<Scalar,Dim,RhsMode,RhsOptions> Rhs;\n  typedef Transform<Scalar,Dim,ResultMode,LhsOptions> ResultType;\n  static ResultType run(const Lhs& lhs, const Rhs& rhs)\n  {\n    ResultType res;\n    res.linear() = lhs.linear() * rhs.linear();\n    res.translation() = lhs.linear() * rhs.translation() + lhs.translation();\n    res.makeAffine();\n    return res;\n  }\n};\n\ntemplate<typename Scalar, int Dim, int LhsMode, int LhsOptions, int RhsMode, int RhsOptions>\nstruct transform_transform_product_impl<Transform<Scalar,Dim,LhsMode,LhsOptions>,Transform<Scalar,Dim,RhsMode,RhsOptions>,true >\n{\n  typedef Transform<Scalar,Dim,LhsMode,LhsOptions> Lhs;\n  typedef Transform<Scalar,Dim,RhsMode,RhsOptions> Rhs;\n  typedef Transform<Scalar,Dim,Projective> ResultType;\n  static ResultType run(const Lhs& lhs, const Rhs& rhs)\n  {\n    return ResultType( lhs.matrix() * rhs.matrix() );\n  }\n};\n\ntemplate<typename Scalar, int Dim, int LhsOptions, int RhsOptions>\nstruct transform_transform_product_impl<Transform<Scalar,Dim,AffineCompact,LhsOptions>,Transform<Scalar,Dim,Projective,RhsOptions>,true >\n{\n  typedef Transform<Scalar,Dim,AffineCompact,LhsOptions> Lhs;\n  typedef Transform<Scalar,Dim,Projective,RhsOptions> Rhs;\n  typedef Transform<Scalar,Dim,Projective> ResultType;\n  static ResultType run(const Lhs& lhs, const Rhs& rhs)\n  {\n    ResultType res;\n    res.matrix().template topRows<Dim>() = lhs.matrix() * rhs.matrix();\n    res.matrix().row(Dim) = rhs.matrix().row(Dim);\n    return res;\n  }\n};\n\ntemplate<typename Scalar, int Dim, int LhsOptions, int RhsOptions>\nstruct transform_transform_product_impl<Transform<Scalar,Dim,Projective,LhsOptions>,Transform<Scalar,Dim,AffineCompact,RhsOptions>,true >\n{\n  typedef Transform<Scalar,Dim,Projective,LhsOptions> Lhs;\n  typedef Transform<Scalar,Dim,AffineCompact,RhsOptions> Rhs;\n  typedef Transform<Scalar,Dim,Projective> ResultType;\n  static ResultType run(const Lhs& lhs, const Rhs& rhs)\n  {\n    ResultType res(lhs.matrix().template leftCols<Dim>() * rhs.matrix());\n    res.matrix().col(Dim) += lhs.matrix().col(Dim);\n    return res;\n  }\n};\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_TRANSFORM_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Geometry/Translation.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_TRANSLATION_H\n#define EIGEN_TRANSLATION_H\n\nnamespace Eigen { \n\n/** \\geometry_module \\ingroup Geometry_Module\n  *\n  * \\class Translation\n  *\n  * \\brief Represents a translation transformation\n  *\n  * \\param _Scalar the scalar type, i.e., the type of the coefficients.\n  * \\param _Dim the  dimension of the space, can be a compile time value or Dynamic\n  *\n  * \\note This class is not aimed to be used to store a translation transformation,\n  * but rather to make easier the constructions and updates of Transform objects.\n  *\n  * \\sa class Scaling, class Transform\n  */\ntemplate<typename _Scalar, int _Dim>\nclass Translation\n{\npublic:\n  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_Dim)\n  /** dimension of the space */\n  enum { Dim = _Dim };\n  /** the scalar type of the coefficients */\n  typedef _Scalar Scalar;\n  /** corresponding vector type */\n  typedef Matrix<Scalar,Dim,1> VectorType;\n  /** corresponding linear transformation matrix type */\n  typedef Matrix<Scalar,Dim,Dim> LinearMatrixType;\n  /** corresponding affine transformation type */\n  typedef Transform<Scalar,Dim,Affine> AffineTransformType;\n  /** corresponding isometric transformation type */\n  typedef Transform<Scalar,Dim,Isometry> IsometryTransformType;\n\nprotected:\n\n  VectorType m_coeffs;\n\npublic:\n\n  /** Default constructor without initialization. */\n  Translation() {}\n  /**  */\n  inline Translation(const Scalar& sx, const Scalar& sy)\n  {\n    eigen_assert(Dim==2);\n    m_coeffs.x() = sx;\n    m_coeffs.y() = sy;\n  }\n  /**  */\n  inline Translation(const Scalar& sx, const Scalar& sy, const Scalar& sz)\n  {\n    eigen_assert(Dim==3);\n    m_coeffs.x() = sx;\n    m_coeffs.y() = sy;\n    m_coeffs.z() = sz;\n  }\n  /** Constructs and initialize the translation transformation from a vector of translation coefficients */\n  explicit inline Translation(const VectorType& vector) : m_coeffs(vector) {}\n\n  /** \\brief Retruns the x-translation by value. **/\n  inline Scalar x() const { return m_coeffs.x(); }\n  /** \\brief Retruns the y-translation by value. **/\n  inline Scalar y() const { return m_coeffs.y(); }\n  /** \\brief Retruns the z-translation by value. **/\n  inline Scalar z() const { return m_coeffs.z(); }\n\n  /** \\brief Retruns the x-translation as a reference. **/\n  inline Scalar& x() { return m_coeffs.x(); }\n  /** \\brief Retruns the y-translation as a reference. **/\n  inline Scalar& y() { return m_coeffs.y(); }\n  /** \\brief Retruns the z-translation as a reference. **/\n  inline Scalar& z() { return m_coeffs.z(); }\n\n  const VectorType& vector() const { return m_coeffs; }\n  VectorType& vector() { return m_coeffs; }\n\n  const VectorType& translation() const { return m_coeffs; }\n  VectorType& translation() { return m_coeffs; }\n\n  /** Concatenates two translation */\n  inline Translation operator* (const Translation& other) const\n  { return Translation(m_coeffs + other.m_coeffs); }\n\n  /** Concatenates a translation and a uniform scaling */\n  inline AffineTransformType operator* (const UniformScaling<Scalar>& other) const;\n\n  /** Concatenates a translation and a linear transformation */\n  template<typename OtherDerived>\n  inline AffineTransformType operator* (const EigenBase<OtherDerived>& linear) const;\n\n  /** Concatenates a translation and a rotation */\n  template<typename Derived>\n  inline IsometryTransformType operator*(const RotationBase<Derived,Dim>& r) const\n  { return *this * IsometryTransformType(r); }\n\n  /** \\returns the concatenation of a linear transformation \\a l with the translation \\a t */\n  // its a nightmare to define a templated friend function outside its declaration\n  template<typename OtherDerived> friend\n  inline AffineTransformType operator*(const EigenBase<OtherDerived>& linear, const Translation& t)\n  {\n    AffineTransformType res;\n    res.matrix().setZero();\n    res.linear() = linear.derived();\n    res.translation() = linear.derived() * t.m_coeffs;\n    res.matrix().row(Dim).setZero();\n    res(Dim,Dim) = Scalar(1);\n    return res;\n  }\n\n  /** Concatenates a translation and a transformation */\n  template<int Mode, int Options>\n  inline Transform<Scalar,Dim,Mode> operator* (const Transform<Scalar,Dim,Mode,Options>& t) const\n  {\n    Transform<Scalar,Dim,Mode> res = t;\n    res.pretranslate(m_coeffs);\n    return res;\n  }\n\n  /** Applies translation to vector */\n  inline VectorType operator* (const VectorType& other) const\n  { return m_coeffs + other; }\n\n  /** \\returns the inverse translation (opposite) */\n  Translation inverse() const { return Translation(-m_coeffs); }\n\n  Translation& operator=(const Translation& other)\n  {\n    m_coeffs = other.m_coeffs;\n    return *this;\n  }\n\n  static const Translation Identity() { return Translation(VectorType::Zero()); }\n\n  /** \\returns \\c *this with scalar type casted to \\a NewScalarType\n    *\n    * Note that if \\a NewScalarType is equal to the current scalar type of \\c *this\n    * then this function smartly returns a const reference to \\c *this.\n    */\n  template<typename NewScalarType>\n  inline typename internal::cast_return_type<Translation,Translation<NewScalarType,Dim> >::type cast() const\n  { return typename internal::cast_return_type<Translation,Translation<NewScalarType,Dim> >::type(*this); }\n\n  /** Copy constructor with scalar type conversion */\n  template<typename OtherScalarType>\n  inline explicit Translation(const Translation<OtherScalarType,Dim>& other)\n  { m_coeffs = other.vector().template cast<Scalar>(); }\n\n  /** \\returns \\c true if \\c *this is approximately equal to \\a other, within the precision\n    * determined by \\a prec.\n    *\n    * \\sa MatrixBase::isApprox() */\n  bool isApprox(const Translation& other, const typename NumTraits<Scalar>::Real& prec = NumTraits<Scalar>::dummy_precision()) const\n  { return m_coeffs.isApprox(other.m_coeffs, prec); }\n\n};\n\n/** \\addtogroup Geometry_Module */\n//@{\ntypedef Translation<float, 2> Translation2f;\ntypedef Translation<double,2> Translation2d;\ntypedef Translation<float, 3> Translation3f;\ntypedef Translation<double,3> Translation3d;\n//@}\n\ntemplate<typename Scalar, int Dim>\ninline typename Translation<Scalar,Dim>::AffineTransformType\nTranslation<Scalar,Dim>::operator* (const UniformScaling<Scalar>& other) const\n{\n  AffineTransformType res;\n  res.matrix().setZero();\n  res.linear().diagonal().fill(other.factor());\n  res.translation() = m_coeffs;\n  res(Dim,Dim) = Scalar(1);\n  return res;\n}\n\ntemplate<typename Scalar, int Dim>\ntemplate<typename OtherDerived>\ninline typename Translation<Scalar,Dim>::AffineTransformType\nTranslation<Scalar,Dim>::operator* (const EigenBase<OtherDerived>& linear) const\n{\n  AffineTransformType res;\n  res.matrix().setZero();\n  res.linear() = linear.derived();\n  res.translation() = m_coeffs;\n  res.matrix().row(Dim).setZero();\n  res(Dim,Dim) = Scalar(1);\n  return res;\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_TRANSLATION_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Geometry/Umeyama.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Hauke Heibel <hauke.heibel@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_UMEYAMA_H\n#define EIGEN_UMEYAMA_H\n\n// This file requires the user to include \n// * Eigen/Core\n// * Eigen/LU \n// * Eigen/SVD\n// * Eigen/Array\n\nnamespace Eigen { \n\n#ifndef EIGEN_PARSED_BY_DOXYGEN\n\n// These helpers are required since it allows to use mixed types as parameters\n// for the Umeyama. The problem with mixed parameters is that the return type\n// cannot trivially be deduced when float and double types are mixed.\nnamespace internal {\n\n// Compile time return type deduction for different MatrixBase types.\n// Different means here different alignment and parameters but the same underlying\n// real scalar type.\ntemplate<typename MatrixType, typename OtherMatrixType>\nstruct umeyama_transform_matrix_type\n{\n  enum {\n    MinRowsAtCompileTime = EIGEN_SIZE_MIN_PREFER_DYNAMIC(MatrixType::RowsAtCompileTime, OtherMatrixType::RowsAtCompileTime),\n\n    // When possible we want to choose some small fixed size value since the result\n    // is likely to fit on the stack. So here, EIGEN_SIZE_MIN_PREFER_DYNAMIC is not what we want.\n    HomogeneousDimension = int(MinRowsAtCompileTime) == Dynamic ? Dynamic : int(MinRowsAtCompileTime)+1\n  };\n\n  typedef Matrix<typename traits<MatrixType>::Scalar,\n    HomogeneousDimension,\n    HomogeneousDimension,\n    AutoAlign | (traits<MatrixType>::Flags & RowMajorBit ? RowMajor : ColMajor),\n    HomogeneousDimension,\n    HomogeneousDimension\n  > type;\n};\n\n}\n\n#endif\n\n/**\n* \\geometry_module \\ingroup Geometry_Module\n*\n* \\brief Returns the transformation between two point sets.\n*\n* The algorithm is based on:\n* \"Least-squares estimation of transformation parameters between two point patterns\",\n* Shinji Umeyama, PAMI 1991, DOI: 10.1109/34.88573\n*\n* It estimates parameters \\f$ c, \\mathbf{R}, \\f$ and \\f$ \\mathbf{t} \\f$ such that\n* \\f{align*}\n*   \\frac{1}{n} \\sum_{i=1}^n \\vert\\vert y_i - (c\\mathbf{R}x_i + \\mathbf{t}) \\vert\\vert_2^2\n* \\f}\n* is minimized.\n*\n* The algorithm is based on the analysis of the covariance matrix\n* \\f$ \\Sigma_{\\mathbf{x}\\mathbf{y}} \\in \\mathbb{R}^{d \\times d} \\f$\n* of the input point sets \\f$ \\mathbf{x} \\f$ and \\f$ \\mathbf{y} \\f$ where \n* \\f$d\\f$ is corresponding to the dimension (which is typically small).\n* The analysis is involving the SVD having a complexity of \\f$O(d^3)\\f$\n* though the actual computational effort lies in the covariance\n* matrix computation which has an asymptotic lower bound of \\f$O(dm)\\f$ when \n* the input point sets have dimension \\f$d \\times m\\f$.\n*\n* Currently the method is working only for floating point matrices.\n*\n* \\todo Should the return type of umeyama() become a Transform?\n*\n* \\param src Source points \\f$ \\mathbf{x} = \\left( x_1, \\hdots, x_n \\right) \\f$.\n* \\param dst Destination points \\f$ \\mathbf{y} = \\left( y_1, \\hdots, y_n \\right) \\f$.\n* \\param with_scaling Sets \\f$ c=1 \\f$ when <code>false</code> is passed.\n* \\return The homogeneous transformation \n* \\f{align*}\n*   T = \\begin{bmatrix} c\\mathbf{R} & \\mathbf{t} \\\\ \\mathbf{0} & 1 \\end{bmatrix}\n* \\f}\n* minimizing the resudiual above. This transformation is always returned as an \n* Eigen::Matrix.\n*/\ntemplate <typename Derived, typename OtherDerived>\ntypename internal::umeyama_transform_matrix_type<Derived, OtherDerived>::type\numeyama(const MatrixBase<Derived>& src, const MatrixBase<OtherDerived>& dst, bool with_scaling = true)\n{\n  typedef typename internal::umeyama_transform_matrix_type<Derived, OtherDerived>::type TransformationMatrixType;\n  typedef typename internal::traits<TransformationMatrixType>::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  typedef typename Derived::Index Index;\n\n  EIGEN_STATIC_ASSERT(!NumTraits<Scalar>::IsComplex, NUMERIC_TYPE_MUST_BE_REAL)\n  EIGEN_STATIC_ASSERT((internal::is_same<Scalar, typename internal::traits<OtherDerived>::Scalar>::value),\n    YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)\n\n  enum { Dimension = EIGEN_SIZE_MIN_PREFER_DYNAMIC(Derived::RowsAtCompileTime, OtherDerived::RowsAtCompileTime) };\n\n  typedef Matrix<Scalar, Dimension, 1> VectorType;\n  typedef Matrix<Scalar, Dimension, Dimension> MatrixType;\n  typedef typename internal::plain_matrix_type_row_major<Derived>::type RowMajorMatrixType;\n\n  const Index m = src.rows(); // dimension\n  const Index n = src.cols(); // number of measurements\n\n  // required for demeaning ...\n  const RealScalar one_over_n = RealScalar(1) / static_cast<RealScalar>(n);\n\n  // computation of mean\n  const VectorType src_mean = src.rowwise().sum() * one_over_n;\n  const VectorType dst_mean = dst.rowwise().sum() * one_over_n;\n\n  // demeaning of src and dst points\n  const RowMajorMatrixType src_demean = src.colwise() - src_mean;\n  const RowMajorMatrixType dst_demean = dst.colwise() - dst_mean;\n\n  // Eq. (36)-(37)\n  const Scalar src_var = src_demean.rowwise().squaredNorm().sum() * one_over_n;\n\n  // Eq. (38)\n  const MatrixType sigma = one_over_n * dst_demean * src_demean.transpose();\n\n  JacobiSVD<MatrixType> svd(sigma, ComputeFullU | ComputeFullV);\n\n  // Initialize the resulting transformation with an identity matrix...\n  TransformationMatrixType Rt = TransformationMatrixType::Identity(m+1,m+1);\n\n  // Eq. (39)\n  VectorType S = VectorType::Ones(m);\n  if (sigma.determinant()<Scalar(0)) S(m-1) = Scalar(-1);\n\n  // Eq. (40) and (43)\n  const VectorType& d = svd.singularValues();\n  Index rank = 0; for (Index i=0; i<m; ++i) if (!internal::isMuchSmallerThan(d.coeff(i),d.coeff(0))) ++rank;\n  if (rank == m-1) {\n    if ( svd.matrixU().determinant() * svd.matrixV().determinant() > Scalar(0) ) {\n      Rt.block(0,0,m,m).noalias() = svd.matrixU()*svd.matrixV().transpose();\n    } else {\n      const Scalar s = S(m-1); S(m-1) = Scalar(-1);\n      Rt.block(0,0,m,m).noalias() = svd.matrixU() * S.asDiagonal() * svd.matrixV().transpose();\n      S(m-1) = s;\n    }\n  } else {\n    Rt.block(0,0,m,m).noalias() = svd.matrixU() * S.asDiagonal() * svd.matrixV().transpose();\n  }\n\n  if (with_scaling)\n  {\n    // Eq. (42)\n    const Scalar c = Scalar(1)/src_var * svd.singularValues().dot(S);\n\n    // Eq. (41)\n    Rt.col(m).head(m) = dst_mean;\n    Rt.col(m).head(m).noalias() -= c*Rt.topLeftCorner(m,m)*src_mean;\n    Rt.block(0,0,m,m) *= c;\n  }\n  else\n  {\n    Rt.col(m).head(m) = dst_mean;\n    Rt.col(m).head(m).noalias() -= Rt.topLeftCorner(m,m)*src_mean;\n  }\n\n  return Rt;\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_UMEYAMA_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Geometry/arch/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_Geometry_arch_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_Geometry_arch_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/Geometry/arch COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Geometry/arch/Geometry_SSE.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Rohit Garg <rpg.314@gmail.com>\n// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_GEOMETRY_SSE_H\n#define EIGEN_GEOMETRY_SSE_H\n\nnamespace Eigen { \n\nnamespace internal {\n\ntemplate<class Derived, class OtherDerived>\nstruct quat_product<Architecture::SSE, Derived, OtherDerived, float, Aligned>\n{\n  static inline Quaternion<float> run(const QuaternionBase<Derived>& _a, const QuaternionBase<OtherDerived>& _b)\n  {\n    const __m128 mask = _mm_castsi128_ps(_mm_setr_epi32(0,0,0,0x80000000));\n    Quaternion<float> res;\n    __m128 a = _a.coeffs().template packet<Aligned>(0);\n    __m128 b = _b.coeffs().template packet<Aligned>(0);\n    __m128 flip1 = _mm_xor_ps(_mm_mul_ps(vec4f_swizzle1(a,1,2,0,2),\n                                         vec4f_swizzle1(b,2,0,1,2)),mask);\n    __m128 flip2 = _mm_xor_ps(_mm_mul_ps(vec4f_swizzle1(a,3,3,3,1),\n                                         vec4f_swizzle1(b,0,1,2,1)),mask);\n    pstore(&res.x(),\n              _mm_add_ps(_mm_sub_ps(_mm_mul_ps(a,vec4f_swizzle1(b,3,3,3,3)),\n                                    _mm_mul_ps(vec4f_swizzle1(a,2,0,1,0),\n                                               vec4f_swizzle1(b,1,2,0,0))),\n                         _mm_add_ps(flip1,flip2)));\n    return res;\n  }\n};\n\ntemplate<typename VectorLhs,typename VectorRhs>\nstruct cross3_impl<Architecture::SSE,VectorLhs,VectorRhs,float,true>\n{\n  static inline typename plain_matrix_type<VectorLhs>::type\n  run(const VectorLhs& lhs, const VectorRhs& rhs)\n  {\n    __m128 a = lhs.template packet<VectorLhs::Flags&AlignedBit ? Aligned : Unaligned>(0);\n    __m128 b = rhs.template packet<VectorRhs::Flags&AlignedBit ? Aligned : Unaligned>(0);\n    __m128 mul1=_mm_mul_ps(vec4f_swizzle1(a,1,2,0,3),vec4f_swizzle1(b,2,0,1,3));\n    __m128 mul2=_mm_mul_ps(vec4f_swizzle1(a,2,0,1,3),vec4f_swizzle1(b,1,2,0,3));\n    typename plain_matrix_type<VectorLhs>::type res;\n    pstore(&res.x(),_mm_sub_ps(mul1,mul2));\n    return res;\n  }\n};\n\n\n\n\ntemplate<class Derived, class OtherDerived>\nstruct quat_product<Architecture::SSE, Derived, OtherDerived, double, Aligned>\n{\n  static inline Quaternion<double> run(const QuaternionBase<Derived>& _a, const QuaternionBase<OtherDerived>& _b)\n  {\n  const Packet2d mask = _mm_castsi128_pd(_mm_set_epi32(0x0,0x0,0x80000000,0x0));\n\n  Quaternion<double> res;\n\n  const double* a = _a.coeffs().data();\n  Packet2d b_xy = _b.coeffs().template packet<Aligned>(0);\n  Packet2d b_zw = _b.coeffs().template packet<Aligned>(2);\n  Packet2d a_xx = pset1<Packet2d>(a[0]);\n  Packet2d a_yy = pset1<Packet2d>(a[1]);\n  Packet2d a_zz = pset1<Packet2d>(a[2]);\n  Packet2d a_ww = pset1<Packet2d>(a[3]);\n\n  // two temporaries:\n  Packet2d t1, t2;\n\n  /*\n   * t1 = ww*xy + yy*zw\n   * t2 = zz*xy - xx*zw\n   * res.xy = t1 +/- swap(t2)\n   */\n  t1 = padd(pmul(a_ww, b_xy), pmul(a_yy, b_zw));\n  t2 = psub(pmul(a_zz, b_xy), pmul(a_xx, b_zw));\n#ifdef EIGEN_VECTORIZE_SSE3\n  EIGEN_UNUSED_VARIABLE(mask)\n  pstore(&res.x(), _mm_addsub_pd(t1, preverse(t2)));\n#else\n  pstore(&res.x(), padd(t1, pxor(mask,preverse(t2))));\n#endif\n  \n  /*\n   * t1 = ww*zw - yy*xy\n   * t2 = zz*zw + xx*xy\n   * res.zw = t1 -/+ swap(t2) = swap( swap(t1) +/- t2)\n   */\n  t1 = psub(pmul(a_ww, b_zw), pmul(a_yy, b_xy));\n  t2 = padd(pmul(a_zz, b_zw), pmul(a_xx, b_xy));\n#ifdef EIGEN_VECTORIZE_SSE3\n  EIGEN_UNUSED_VARIABLE(mask)\n  pstore(&res.z(), preverse(_mm_addsub_pd(preverse(t1), t2)));\n#else\n  pstore(&res.z(), psub(t1, pxor(mask,preverse(t2))));\n#endif\n\n  return res;\n}\n};\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_GEOMETRY_SSE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Householder/BlockHouseholder.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2010 Vincent Lejeune\n// Copyright (C) 2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_BLOCK_HOUSEHOLDER_H\n#define EIGEN_BLOCK_HOUSEHOLDER_H\n\n// This file contains some helper function to deal with block householder reflectors\n\nnamespace Eigen { \n\nnamespace internal {\n\n/** \\internal */\ntemplate<typename TriangularFactorType,typename VectorsType,typename CoeffsType>\nvoid make_block_householder_triangular_factor(TriangularFactorType& triFactor, const VectorsType& vectors, const CoeffsType& hCoeffs)\n{\n  typedef typename TriangularFactorType::Index Index;\n  typedef typename VectorsType::Scalar Scalar;\n  const Index nbVecs = vectors.cols();\n  eigen_assert(triFactor.rows() == nbVecs && triFactor.cols() == nbVecs && vectors.rows()>=nbVecs);\n\n  for(Index i = 0; i < nbVecs; i++)\n  {\n    Index rs = vectors.rows() - i;\n    Scalar Vii = vectors(i,i);\n    vectors.const_cast_derived().coeffRef(i,i) = Scalar(1);\n    triFactor.col(i).head(i).noalias() = -hCoeffs(i) * vectors.block(i, 0, rs, i).adjoint()\n                                       * vectors.col(i).tail(rs);\n    vectors.const_cast_derived().coeffRef(i, i) = Vii;\n    // FIXME add .noalias() once the triangular product can work inplace\n    triFactor.col(i).head(i) = triFactor.block(0,0,i,i).template triangularView<Upper>()\n                             * triFactor.col(i).head(i);\n    triFactor(i,i) = hCoeffs(i);\n  }\n}\n\n/** \\internal */\ntemplate<typename MatrixType,typename VectorsType,typename CoeffsType>\nvoid apply_block_householder_on_the_left(MatrixType& mat, const VectorsType& vectors, const CoeffsType& hCoeffs)\n{\n  typedef typename MatrixType::Index Index;\n  enum { TFactorSize = MatrixType::ColsAtCompileTime };\n  Index nbVecs = vectors.cols();\n  Matrix<typename MatrixType::Scalar, TFactorSize, TFactorSize, ColMajor> T(nbVecs,nbVecs);\n  make_block_householder_triangular_factor(T, vectors, hCoeffs);\n\n  const TriangularView<const VectorsType, UnitLower>& V(vectors);\n\n  // A -= V T V^* A\n  Matrix<typename MatrixType::Scalar,VectorsType::ColsAtCompileTime,MatrixType::ColsAtCompileTime,0,\n         VectorsType::MaxColsAtCompileTime,MatrixType::MaxColsAtCompileTime> tmp = V.adjoint() * mat;\n  // FIXME add .noalias() once the triangular product can work inplace\n  tmp = T.template triangularView<Upper>().adjoint() * tmp;\n  mat.noalias() -= V * tmp;\n}\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_BLOCK_HOUSEHOLDER_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Householder/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_Householder_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_Householder_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/Householder COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Householder/Householder.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2010 Benoit Jacob <jacob.benoit.1@gmail.com>\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_HOUSEHOLDER_H\n#define EIGEN_HOUSEHOLDER_H\n\nnamespace Eigen { \n\nnamespace internal {\ntemplate<int n> struct decrement_size\n{\n  enum {\n    ret = n==Dynamic ? n : n-1\n  };\n};\n}\n\n/** Computes the elementary reflector H such that:\n  * \\f$ H *this = [ beta 0 ... 0]^T \\f$\n  * where the transformation H is:\n  * \\f$ H = I - tau v v^*\\f$\n  * and the vector v is:\n  * \\f$ v^T = [1 essential^T] \\f$\n  *\n  * The essential part of the vector \\c v is stored in *this.\n  * \n  * On output:\n  * \\param tau the scaling factor of the Householder transformation\n  * \\param beta the result of H * \\c *this\n  *\n  * \\sa MatrixBase::makeHouseholder(), MatrixBase::applyHouseholderOnTheLeft(),\n  *     MatrixBase::applyHouseholderOnTheRight()\n  */\ntemplate<typename Derived>\nvoid MatrixBase<Derived>::makeHouseholderInPlace(Scalar& tau, RealScalar& beta)\n{\n  VectorBlock<Derived, internal::decrement_size<Base::SizeAtCompileTime>::ret> essentialPart(derived(), 1, size()-1);\n  makeHouseholder(essentialPart, tau, beta);\n}\n\n/** Computes the elementary reflector H such that:\n  * \\f$ H *this = [ beta 0 ... 0]^T \\f$\n  * where the transformation H is:\n  * \\f$ H = I - tau v v^*\\f$\n  * and the vector v is:\n  * \\f$ v^T = [1 essential^T] \\f$\n  *\n  * On output:\n  * \\param essential the essential part of the vector \\c v\n  * \\param tau the scaling factor of the Householder transformation\n  * \\param beta the result of H * \\c *this\n  *\n  * \\sa MatrixBase::makeHouseholderInPlace(), MatrixBase::applyHouseholderOnTheLeft(),\n  *     MatrixBase::applyHouseholderOnTheRight()\n  */\ntemplate<typename Derived>\ntemplate<typename EssentialPart>\nvoid MatrixBase<Derived>::makeHouseholder(\n  EssentialPart& essential,\n  Scalar& tau,\n  RealScalar& beta) const\n{\n  using std::sqrt;\n  using numext::conj;\n  \n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(EssentialPart)\n  VectorBlock<const Derived, EssentialPart::SizeAtCompileTime> tail(derived(), 1, size()-1);\n  \n  RealScalar tailSqNorm = size()==1 ? RealScalar(0) : tail.squaredNorm();\n  Scalar c0 = coeff(0);\n  const RealScalar tol = (std::numeric_limits<RealScalar>::min)();\n\n  if(tailSqNorm <= tol && numext::abs2(numext::imag(c0))<=tol)\n  {\n    tau = RealScalar(0);\n    beta = numext::real(c0);\n    essential.setZero();\n  }\n  else\n  {\n    beta = sqrt(numext::abs2(c0) + tailSqNorm);\n    if (numext::real(c0)>=RealScalar(0))\n      beta = -beta;\n    essential = tail / (c0 - beta);\n    tau = conj((beta - c0) / beta);\n  }\n}\n\n/** Apply the elementary reflector H given by\n  * \\f$ H = I - tau v v^*\\f$\n  * with\n  * \\f$ v^T = [1 essential^T] \\f$\n  * from the left to a vector or matrix.\n  *\n  * On input:\n  * \\param essential the essential part of the vector \\c v\n  * \\param tau the scaling factor of the Householder transformation\n  * \\param workspace a pointer to working space with at least\n  *                  this->cols() * essential.size() entries\n  *\n  * \\sa MatrixBase::makeHouseholder(), MatrixBase::makeHouseholderInPlace(), \n  *     MatrixBase::applyHouseholderOnTheRight()\n  */\ntemplate<typename Derived>\ntemplate<typename EssentialPart>\nvoid MatrixBase<Derived>::applyHouseholderOnTheLeft(\n  const EssentialPart& essential,\n  const Scalar& tau,\n  Scalar* workspace)\n{\n  if(rows() == 1)\n  {\n    *this *= Scalar(1)-tau;\n  }\n  else\n  {\n    Map<typename internal::plain_row_type<PlainObject>::type> tmp(workspace,cols());\n    Block<Derived, EssentialPart::SizeAtCompileTime, Derived::ColsAtCompileTime> bottom(derived(), 1, 0, rows()-1, cols());\n    tmp.noalias() = essential.adjoint() * bottom;\n    tmp += this->row(0);\n    this->row(0) -= tau * tmp;\n    bottom.noalias() -= tau * essential * tmp;\n  }\n}\n\n/** Apply the elementary reflector H given by\n  * \\f$ H = I - tau v v^*\\f$\n  * with\n  * \\f$ v^T = [1 essential^T] \\f$\n  * from the right to a vector or matrix.\n  *\n  * On input:\n  * \\param essential the essential part of the vector \\c v\n  * \\param tau the scaling factor of the Householder transformation\n  * \\param workspace a pointer to working space with at least\n  *                  this->cols() * essential.size() entries\n  *\n  * \\sa MatrixBase::makeHouseholder(), MatrixBase::makeHouseholderInPlace(), \n  *     MatrixBase::applyHouseholderOnTheLeft()\n  */\ntemplate<typename Derived>\ntemplate<typename EssentialPart>\nvoid MatrixBase<Derived>::applyHouseholderOnTheRight(\n  const EssentialPart& essential,\n  const Scalar& tau,\n  Scalar* workspace)\n{\n  if(cols() == 1)\n  {\n    *this *= Scalar(1)-tau;\n  }\n  else\n  {\n    Map<typename internal::plain_col_type<PlainObject>::type> tmp(workspace,rows());\n    Block<Derived, Derived::RowsAtCompileTime, EssentialPart::SizeAtCompileTime> right(derived(), 0, 1, rows(), cols()-1);\n    tmp.noalias() = right * essential.conjugate();\n    tmp += this->col(0);\n    this->col(0) -= tau * tmp;\n    right.noalias() -= tau * tmp * essential.transpose();\n  }\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_HOUSEHOLDER_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Householder/HouseholderSequence.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2010 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_HOUSEHOLDER_SEQUENCE_H\n#define EIGEN_HOUSEHOLDER_SEQUENCE_H\n\nnamespace Eigen { \n\n/** \\ingroup Householder_Module\n  * \\householder_module\n  * \\class HouseholderSequence\n  * \\brief Sequence of Householder reflections acting on subspaces with decreasing size\n  * \\tparam VectorsType type of matrix containing the Householder vectors\n  * \\tparam CoeffsType  type of vector containing the Householder coefficients\n  * \\tparam Side        either OnTheLeft (the default) or OnTheRight\n  *\n  * This class represents a product sequence of Householder reflections where the first Householder reflection\n  * acts on the whole space, the second Householder reflection leaves the one-dimensional subspace spanned by\n  * the first unit vector invariant, the third Householder reflection leaves the two-dimensional subspace\n  * spanned by the first two unit vectors invariant, and so on up to the last reflection which leaves all but\n  * one dimensions invariant and acts only on the last dimension. Such sequences of Householder reflections\n  * are used in several algorithms to zero out certain parts of a matrix. Indeed, the methods\n  * HessenbergDecomposition::matrixQ(), Tridiagonalization::matrixQ(), HouseholderQR::householderQ(),\n  * and ColPivHouseholderQR::householderQ() all return a %HouseholderSequence.\n  *\n  * More precisely, the class %HouseholderSequence represents an \\f$ n \\times n \\f$ matrix \\f$ H \\f$ of the\n  * form \\f$ H = \\prod_{i=0}^{n-1} H_i \\f$ where the i-th Householder reflection is \\f$ H_i = I - h_i v_i\n  * v_i^* \\f$. The i-th Householder coefficient \\f$ h_i \\f$ is a scalar and the i-th Householder vector \\f$\n  * v_i \\f$ is a vector of the form\n  * \\f[ \n  * v_i = [\\underbrace{0, \\ldots, 0}_{i-1\\mbox{ zeros}}, 1, \\underbrace{*, \\ldots,*}_{n-i\\mbox{ arbitrary entries}} ]. \n  * \\f]\n  * The last \\f$ n-i \\f$ entries of \\f$ v_i \\f$ are called the essential part of the Householder vector.\n  *\n  * Typical usages are listed below, where H is a HouseholderSequence:\n  * \\code\n  * A.applyOnTheRight(H);             // A = A * H\n  * A.applyOnTheLeft(H);              // A = H * A\n  * A.applyOnTheRight(H.adjoint());   // A = A * H^*\n  * A.applyOnTheLeft(H.adjoint());    // A = H^* * A\n  * MatrixXd Q = H;                   // conversion to a dense matrix\n  * \\endcode\n  * In addition to the adjoint, you can also apply the inverse (=adjoint), the transpose, and the conjugate operators.\n  *\n  * See the documentation for HouseholderSequence(const VectorsType&, const CoeffsType&) for an example.\n  *\n  * \\sa MatrixBase::applyOnTheLeft(), MatrixBase::applyOnTheRight()\n  */\n\nnamespace internal {\n\ntemplate<typename VectorsType, typename CoeffsType, int Side>\nstruct traits<HouseholderSequence<VectorsType,CoeffsType,Side> >\n{\n  typedef typename VectorsType::Scalar Scalar;\n  typedef typename VectorsType::Index Index;\n  typedef typename VectorsType::StorageKind StorageKind;\n  enum {\n    RowsAtCompileTime = Side==OnTheLeft ? traits<VectorsType>::RowsAtCompileTime\n                                        : traits<VectorsType>::ColsAtCompileTime,\n    ColsAtCompileTime = RowsAtCompileTime,\n    MaxRowsAtCompileTime = Side==OnTheLeft ? traits<VectorsType>::MaxRowsAtCompileTime\n                                           : traits<VectorsType>::MaxColsAtCompileTime,\n    MaxColsAtCompileTime = MaxRowsAtCompileTime,\n    Flags = 0\n  };\n};\n\ntemplate<typename VectorsType, typename CoeffsType, int Side>\nstruct hseq_side_dependent_impl\n{\n  typedef Block<const VectorsType, Dynamic, 1> EssentialVectorType;\n  typedef HouseholderSequence<VectorsType, CoeffsType, OnTheLeft> HouseholderSequenceType;\n  typedef typename VectorsType::Index Index;\n  static inline const EssentialVectorType essentialVector(const HouseholderSequenceType& h, Index k)\n  {\n    Index start = k+1+h.m_shift;\n    return Block<const VectorsType,Dynamic,1>(h.m_vectors, start, k, h.rows()-start, 1);\n  }\n};\n\ntemplate<typename VectorsType, typename CoeffsType>\nstruct hseq_side_dependent_impl<VectorsType, CoeffsType, OnTheRight>\n{\n  typedef Transpose<Block<const VectorsType, 1, Dynamic> > EssentialVectorType;\n  typedef HouseholderSequence<VectorsType, CoeffsType, OnTheRight> HouseholderSequenceType;\n  typedef typename VectorsType::Index Index;\n  static inline const EssentialVectorType essentialVector(const HouseholderSequenceType& h, Index k)\n  {\n    Index start = k+1+h.m_shift;\n    return Block<const VectorsType,1,Dynamic>(h.m_vectors, k, start, 1, h.rows()-start).transpose();\n  }\n};\n\ntemplate<typename OtherScalarType, typename MatrixType> struct matrix_type_times_scalar_type\n{\n  typedef typename scalar_product_traits<OtherScalarType, typename MatrixType::Scalar>::ReturnType\n    ResultScalar;\n  typedef Matrix<ResultScalar, MatrixType::RowsAtCompileTime, MatrixType::ColsAtCompileTime,\n                 0, MatrixType::MaxRowsAtCompileTime, MatrixType::MaxColsAtCompileTime> Type;\n};\n\n} // end namespace internal\n\ntemplate<typename VectorsType, typename CoeffsType, int Side> class HouseholderSequence\n  : public EigenBase<HouseholderSequence<VectorsType,CoeffsType,Side> >\n{\n    typedef typename internal::hseq_side_dependent_impl<VectorsType,CoeffsType,Side>::EssentialVectorType EssentialVectorType;\n  \n  public:\n    enum {\n      RowsAtCompileTime = internal::traits<HouseholderSequence>::RowsAtCompileTime,\n      ColsAtCompileTime = internal::traits<HouseholderSequence>::ColsAtCompileTime,\n      MaxRowsAtCompileTime = internal::traits<HouseholderSequence>::MaxRowsAtCompileTime,\n      MaxColsAtCompileTime = internal::traits<HouseholderSequence>::MaxColsAtCompileTime\n    };\n    typedef typename internal::traits<HouseholderSequence>::Scalar Scalar;\n    typedef typename VectorsType::Index Index;\n\n    typedef HouseholderSequence<\n      typename internal::conditional<NumTraits<Scalar>::IsComplex,\n        typename internal::remove_all<typename VectorsType::ConjugateReturnType>::type,\n        VectorsType>::type,\n      typename internal::conditional<NumTraits<Scalar>::IsComplex,\n        typename internal::remove_all<typename CoeffsType::ConjugateReturnType>::type,\n        CoeffsType>::type,\n      Side\n    > ConjugateReturnType;\n\n    /** \\brief Constructor.\n      * \\param[in]  v      %Matrix containing the essential parts of the Householder vectors\n      * \\param[in]  h      Vector containing the Householder coefficients\n      *\n      * Constructs the Householder sequence with coefficients given by \\p h and vectors given by \\p v. The\n      * i-th Householder coefficient \\f$ h_i \\f$ is given by \\p h(i) and the essential part of the i-th\n      * Householder vector \\f$ v_i \\f$ is given by \\p v(k,i) with \\p k > \\p i (the subdiagonal part of the\n      * i-th column). If \\p v has fewer columns than rows, then the Householder sequence contains as many\n      * Householder reflections as there are columns.\n      *\n      * \\note The %HouseholderSequence object stores \\p v and \\p h by reference.\n      *\n      * Example: \\include HouseholderSequence_HouseholderSequence.cpp\n      * Output: \\verbinclude HouseholderSequence_HouseholderSequence.out\n      *\n      * \\sa setLength(), setShift()\n      */\n    HouseholderSequence(const VectorsType& v, const CoeffsType& h)\n      : m_vectors(v), m_coeffs(h), m_trans(false), m_length(v.diagonalSize()),\n        m_shift(0)\n    {\n    }\n\n    /** \\brief Copy constructor. */\n    HouseholderSequence(const HouseholderSequence& other)\n      : m_vectors(other.m_vectors),\n        m_coeffs(other.m_coeffs),\n        m_trans(other.m_trans),\n        m_length(other.m_length),\n        m_shift(other.m_shift)\n    {\n    }\n\n    /** \\brief Number of rows of transformation viewed as a matrix.\n      * \\returns Number of rows \n      * \\details This equals the dimension of the space that the transformation acts on.\n      */\n    Index rows() const { return Side==OnTheLeft ? m_vectors.rows() : m_vectors.cols(); }\n\n    /** \\brief Number of columns of transformation viewed as a matrix.\n      * \\returns Number of columns\n      * \\details This equals the dimension of the space that the transformation acts on.\n      */\n    Index cols() const { return rows(); }\n\n    /** \\brief Essential part of a Householder vector.\n      * \\param[in]  k  Index of Householder reflection\n      * \\returns    Vector containing non-trivial entries of k-th Householder vector\n      *\n      * This function returns the essential part of the Householder vector \\f$ v_i \\f$. This is a vector of\n      * length \\f$ n-i \\f$ containing the last \\f$ n-i \\f$ entries of the vector\n      * \\f[ \n      * v_i = [\\underbrace{0, \\ldots, 0}_{i-1\\mbox{ zeros}}, 1, \\underbrace{*, \\ldots,*}_{n-i\\mbox{ arbitrary entries}} ]. \n      * \\f]\n      * The index \\f$ i \\f$ equals \\p k + shift(), corresponding to the k-th column of the matrix \\p v\n      * passed to the constructor.\n      *\n      * \\sa setShift(), shift()\n      */\n    const EssentialVectorType essentialVector(Index k) const\n    {\n      eigen_assert(k >= 0 && k < m_length);\n      return internal::hseq_side_dependent_impl<VectorsType,CoeffsType,Side>::essentialVector(*this, k);\n    }\n\n    /** \\brief %Transpose of the Householder sequence. */\n    HouseholderSequence transpose() const\n    {\n      return HouseholderSequence(*this).setTrans(!m_trans);\n    }\n\n    /** \\brief Complex conjugate of the Householder sequence. */\n    ConjugateReturnType conjugate() const\n    {\n      return ConjugateReturnType(m_vectors.conjugate(), m_coeffs.conjugate())\n             .setTrans(m_trans)\n             .setLength(m_length)\n             .setShift(m_shift);\n    }\n\n    /** \\brief Adjoint (conjugate transpose) of the Householder sequence. */\n    ConjugateReturnType adjoint() const\n    {\n      return conjugate().setTrans(!m_trans);\n    }\n\n    /** \\brief Inverse of the Householder sequence (equals the adjoint). */\n    ConjugateReturnType inverse() const { return adjoint(); }\n\n    /** \\internal */\n    template<typename DestType> inline void evalTo(DestType& dst) const\n    {\n      Matrix<Scalar, DestType::RowsAtCompileTime, 1,\n             AutoAlign|ColMajor, DestType::MaxRowsAtCompileTime, 1> workspace(rows());\n      evalTo(dst, workspace);\n    }\n\n    /** \\internal */\n    template<typename Dest, typename Workspace>\n    void evalTo(Dest& dst, Workspace& workspace) const\n    {\n      workspace.resize(rows());\n      Index vecs = m_length;\n      const typename Dest::Scalar *dst_data = internal::extract_data(dst);\n      if(    internal::is_same<typename internal::remove_all<VectorsType>::type,Dest>::value\n          && dst_data!=0 && dst_data == internal::extract_data(m_vectors))\n      {\n        // in-place\n        dst.diagonal().setOnes();\n        dst.template triangularView<StrictlyUpper>().setZero();\n        for(Index k = vecs-1; k >= 0; --k)\n        {\n          Index cornerSize = rows() - k - m_shift;\n          if(m_trans)\n            dst.bottomRightCorner(cornerSize, cornerSize)\n               .applyHouseholderOnTheRight(essentialVector(k), m_coeffs.coeff(k), workspace.data());\n          else\n            dst.bottomRightCorner(cornerSize, cornerSize)\n               .applyHouseholderOnTheLeft(essentialVector(k), m_coeffs.coeff(k), workspace.data());\n\n          // clear the off diagonal vector\n          dst.col(k).tail(rows()-k-1).setZero();\n        }\n        // clear the remaining columns if needed\n        for(Index k = 0; k<cols()-vecs ; ++k)\n          dst.col(k).tail(rows()-k-1).setZero();\n      }\n      else\n      {\n        dst.setIdentity(rows(), rows());\n        for(Index k = vecs-1; k >= 0; --k)\n        {\n          Index cornerSize = rows() - k - m_shift;\n          if(m_trans)\n            dst.bottomRightCorner(cornerSize, cornerSize)\n               .applyHouseholderOnTheRight(essentialVector(k), m_coeffs.coeff(k), &workspace.coeffRef(0));\n          else\n            dst.bottomRightCorner(cornerSize, cornerSize)\n               .applyHouseholderOnTheLeft(essentialVector(k), m_coeffs.coeff(k), &workspace.coeffRef(0));\n        }\n      }\n    }\n\n    /** \\internal */\n    template<typename Dest> inline void applyThisOnTheRight(Dest& dst) const\n    {\n      Matrix<Scalar,1,Dest::RowsAtCompileTime,RowMajor,1,Dest::MaxRowsAtCompileTime> workspace(dst.rows());\n      applyThisOnTheRight(dst, workspace);\n    }\n\n    /** \\internal */\n    template<typename Dest, typename Workspace>\n    inline void applyThisOnTheRight(Dest& dst, Workspace& workspace) const\n    {\n      workspace.resize(dst.rows());\n      for(Index k = 0; k < m_length; ++k)\n      {\n        Index actual_k = m_trans ? m_length-k-1 : k;\n        dst.rightCols(rows()-m_shift-actual_k)\n           .applyHouseholderOnTheRight(essentialVector(actual_k), m_coeffs.coeff(actual_k), workspace.data());\n      }\n    }\n\n    /** \\internal */\n    template<typename Dest> inline void applyThisOnTheLeft(Dest& dst) const\n    {\n      Matrix<Scalar,1,Dest::ColsAtCompileTime,RowMajor,1,Dest::MaxColsAtCompileTime> workspace(dst.cols());\n      applyThisOnTheLeft(dst, workspace);\n    }\n\n    /** \\internal */\n    template<typename Dest, typename Workspace>\n    inline void applyThisOnTheLeft(Dest& dst, Workspace& workspace) const\n    {\n      workspace.resize(dst.cols());\n      for(Index k = 0; k < m_length; ++k)\n      {\n        Index actual_k = m_trans ? k : m_length-k-1;\n        dst.bottomRows(rows()-m_shift-actual_k)\n           .applyHouseholderOnTheLeft(essentialVector(actual_k), m_coeffs.coeff(actual_k), workspace.data());\n      }\n    }\n\n    /** \\brief Computes the product of a Householder sequence with a matrix.\n      * \\param[in]  other  %Matrix being multiplied.\n      * \\returns    Expression object representing the product.\n      *\n      * This function computes \\f$ HM \\f$ where \\f$ H \\f$ is the Householder sequence represented by \\p *this\n      * and \\f$ M \\f$ is the matrix \\p other.\n      */\n    template<typename OtherDerived>\n    typename internal::matrix_type_times_scalar_type<Scalar, OtherDerived>::Type operator*(const MatrixBase<OtherDerived>& other) const\n    {\n      typename internal::matrix_type_times_scalar_type<Scalar, OtherDerived>::Type\n        res(other.template cast<typename internal::matrix_type_times_scalar_type<Scalar,OtherDerived>::ResultScalar>());\n      applyThisOnTheLeft(res);\n      return res;\n    }\n\n    template<typename _VectorsType, typename _CoeffsType, int _Side> friend struct internal::hseq_side_dependent_impl;\n\n    /** \\brief Sets the length of the Householder sequence.\n      * \\param [in]  length  New value for the length.\n      *\n      * By default, the length \\f$ n \\f$ of the Householder sequence \\f$ H = H_0 H_1 \\ldots H_{n-1} \\f$ is set\n      * to the number of columns of the matrix \\p v passed to the constructor, or the number of rows if that\n      * is smaller. After this function is called, the length equals \\p length.\n      *\n      * \\sa length()\n      */\n    HouseholderSequence& setLength(Index length)\n    {\n      m_length = length;\n      return *this;\n    }\n\n    /** \\brief Sets the shift of the Householder sequence.\n      * \\param [in]  shift  New value for the shift.\n      *\n      * By default, a %HouseholderSequence object represents \\f$ H = H_0 H_1 \\ldots H_{n-1} \\f$ and the i-th\n      * column of the matrix \\p v passed to the constructor corresponds to the i-th Householder\n      * reflection. After this function is called, the object represents \\f$ H = H_{\\mathrm{shift}}\n      * H_{\\mathrm{shift}+1} \\ldots H_{n-1} \\f$ and the i-th column of \\p v corresponds to the (shift+i)-th\n      * Householder reflection.\n      *\n      * \\sa shift()\n      */\n    HouseholderSequence& setShift(Index shift)\n    {\n      m_shift = shift;\n      return *this;\n    }\n\n    Index length() const { return m_length; }  /**< \\brief Returns the length of the Householder sequence. */\n    Index shift() const { return m_shift; }    /**< \\brief Returns the shift of the Householder sequence. */\n\n    /* Necessary for .adjoint() and .conjugate() */\n    template <typename VectorsType2, typename CoeffsType2, int Side2> friend class HouseholderSequence;\n\n  protected:\n\n    /** \\brief Sets the transpose flag.\n      * \\param [in]  trans  New value of the transpose flag.\n      *\n      * By default, the transpose flag is not set. If the transpose flag is set, then this object represents \n      * \\f$ H^T = H_{n-1}^T \\ldots H_1^T H_0^T \\f$ instead of \\f$ H = H_0 H_1 \\ldots H_{n-1} \\f$.\n      *\n      * \\sa trans()\n      */\n    HouseholderSequence& setTrans(bool trans)\n    {\n      m_trans = trans;\n      return *this;\n    }\n\n    bool trans() const { return m_trans; }     /**< \\brief Returns the transpose flag. */\n\n    typename VectorsType::Nested m_vectors;\n    typename CoeffsType::Nested m_coeffs;\n    bool m_trans;\n    Index m_length;\n    Index m_shift;\n};\n\n/** \\brief Computes the product of a matrix with a Householder sequence.\n  * \\param[in]  other  %Matrix being multiplied.\n  * \\param[in]  h      %HouseholderSequence being multiplied.\n  * \\returns    Expression object representing the product.\n  *\n  * This function computes \\f$ MH \\f$ where \\f$ M \\f$ is the matrix \\p other and \\f$ H \\f$ is the\n  * Householder sequence represented by \\p h.\n  */\ntemplate<typename OtherDerived, typename VectorsType, typename CoeffsType, int Side>\ntypename internal::matrix_type_times_scalar_type<typename VectorsType::Scalar,OtherDerived>::Type operator*(const MatrixBase<OtherDerived>& other, const HouseholderSequence<VectorsType,CoeffsType,Side>& h)\n{\n  typename internal::matrix_type_times_scalar_type<typename VectorsType::Scalar,OtherDerived>::Type\n    res(other.template cast<typename internal::matrix_type_times_scalar_type<typename VectorsType::Scalar,OtherDerived>::ResultScalar>());\n  h.applyThisOnTheRight(res);\n  return res;\n}\n\n/** \\ingroup Householder_Module \\householder_module\n  * \\brief Convenience function for constructing a Householder sequence. \n  * \\returns A HouseholderSequence constructed from the specified arguments.\n  */\ntemplate<typename VectorsType, typename CoeffsType>\nHouseholderSequence<VectorsType,CoeffsType> householderSequence(const VectorsType& v, const CoeffsType& h)\n{\n  return HouseholderSequence<VectorsType,CoeffsType,OnTheLeft>(v, h);\n}\n\n/** \\ingroup Householder_Module \\householder_module\n  * \\brief Convenience function for constructing a Householder sequence. \n  * \\returns A HouseholderSequence constructed from the specified arguments.\n  * \\details This function differs from householderSequence() in that the template argument \\p OnTheSide of\n  * the constructed HouseholderSequence is set to OnTheRight, instead of the default OnTheLeft.\n  */\ntemplate<typename VectorsType, typename CoeffsType>\nHouseholderSequence<VectorsType,CoeffsType,OnTheRight> rightHouseholderSequence(const VectorsType& v, const CoeffsType& h)\n{\n  return HouseholderSequence<VectorsType,CoeffsType,OnTheRight>(v, h);\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_HOUSEHOLDER_SEQUENCE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2011 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_BASIC_PRECONDITIONERS_H\n#define EIGEN_BASIC_PRECONDITIONERS_H\n\nnamespace Eigen { \n\n/** \\ingroup IterativeLinearSolvers_Module\n  * \\brief A preconditioner based on the digonal entries\n  *\n  * This class allows to approximately solve for A.x = b problems assuming A is a diagonal matrix.\n  * In other words, this preconditioner neglects all off diagonal entries and, in Eigen's language, solves for:\n  * \\code\n  * A.diagonal().asDiagonal() . x = b\n  * \\endcode\n  *\n  * \\tparam _Scalar the type of the scalar.\n  *\n  * This preconditioner is suitable for both selfadjoint and general problems.\n  * The diagonal entries are pre-inverted and stored into a dense vector.\n  *\n  * \\note A variant that has yet to be implemented would attempt to preserve the norm of each column.\n  *\n  */\ntemplate <typename _Scalar>\nclass DiagonalPreconditioner\n{\n    typedef _Scalar Scalar;\n    typedef Matrix<Scalar,Dynamic,1> Vector;\n    typedef typename Vector::Index Index;\n\n  public:\n    // this typedef is only to export the scalar type and compile-time dimensions to solve_retval\n    typedef Matrix<Scalar,Dynamic,Dynamic> MatrixType;\n\n    DiagonalPreconditioner() : m_isInitialized(false) {}\n\n    template<typename MatType>\n    DiagonalPreconditioner(const MatType& mat) : m_invdiag(mat.cols())\n    {\n      compute(mat);\n    }\n\n    Index rows() const { return m_invdiag.size(); }\n    Index cols() const { return m_invdiag.size(); }\n    \n    template<typename MatType>\n    DiagonalPreconditioner& analyzePattern(const MatType& )\n    {\n      return *this;\n    }\n    \n    template<typename MatType>\n    DiagonalPreconditioner& factorize(const MatType& mat)\n    {\n      m_invdiag.resize(mat.cols());\n      for(int j=0; j<mat.outerSize(); ++j)\n      {\n        typename MatType::InnerIterator it(mat,j);\n        while(it && it.index()!=j) ++it;\n        if(it && it.index()==j && it.value()!=Scalar(0))\n          m_invdiag(j) = Scalar(1)/it.value();\n        else\n          m_invdiag(j) = Scalar(1);\n      }\n      m_isInitialized = true;\n      return *this;\n    }\n    \n    template<typename MatType>\n    DiagonalPreconditioner& compute(const MatType& mat)\n    {\n      return factorize(mat);\n    }\n\n    template<typename Rhs, typename Dest>\n    void _solve(const Rhs& b, Dest& x) const\n    {\n      x = m_invdiag.array() * b.array() ;\n    }\n\n    template<typename Rhs> inline const internal::solve_retval<DiagonalPreconditioner, Rhs>\n    solve(const MatrixBase<Rhs>& b) const\n    {\n      eigen_assert(m_isInitialized && \"DiagonalPreconditioner is not initialized.\");\n      eigen_assert(m_invdiag.size()==b.rows()\n                && \"DiagonalPreconditioner::solve(): invalid number of rows of the right hand side matrix b\");\n      return internal::solve_retval<DiagonalPreconditioner, Rhs>(*this, b.derived());\n    }\n\n  protected:\n    Vector m_invdiag;\n    bool m_isInitialized;\n};\n\nnamespace internal {\n\ntemplate<typename _MatrixType, typename Rhs>\nstruct solve_retval<DiagonalPreconditioner<_MatrixType>, Rhs>\n  : solve_retval_base<DiagonalPreconditioner<_MatrixType>, Rhs>\n{\n  typedef DiagonalPreconditioner<_MatrixType> Dec;\n  EIGEN_MAKE_SOLVE_HELPERS(Dec,Rhs)\n\n  template<typename Dest> void evalTo(Dest& dst) const\n  {\n    dec()._solve(rhs(),dst);\n  }\n};\n\n}\n\n/** \\ingroup IterativeLinearSolvers_Module\n  * \\brief A naive preconditioner which approximates any matrix as the identity matrix\n  *\n  * \\sa class DiagonalPreconditioner\n  */\nclass IdentityPreconditioner\n{\n  public:\n\n    IdentityPreconditioner() {}\n\n    template<typename MatrixType>\n    IdentityPreconditioner(const MatrixType& ) {}\n    \n    template<typename MatrixType>\n    IdentityPreconditioner& analyzePattern(const MatrixType& ) { return *this; }\n    \n    template<typename MatrixType>\n    IdentityPreconditioner& factorize(const MatrixType& ) { return *this; }\n\n    template<typename MatrixType>\n    IdentityPreconditioner& compute(const MatrixType& ) { return *this; }\n    \n    template<typename Rhs>\n    inline const Rhs& solve(const Rhs& b) const { return b; }\n};\n\n} // end namespace Eigen\n\n#endif // EIGEN_BASIC_PRECONDITIONERS_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2011 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_BICGSTAB_H\n#define EIGEN_BICGSTAB_H\n\nnamespace Eigen { \n\nnamespace internal {\n\n/** \\internal Low-level bi conjugate gradient stabilized algorithm\n  * \\param mat The matrix A\n  * \\param rhs The right hand side vector b\n  * \\param x On input and initial solution, on output the computed solution.\n  * \\param precond A preconditioner being able to efficiently solve for an\n  *                approximation of Ax=b (regardless of b)\n  * \\param iters On input the max number of iteration, on output the number of performed iterations.\n  * \\param tol_error On input the tolerance error, on output an estimation of the relative error.\n  * \\return false in the case of numerical issue, for example a break down of BiCGSTAB. \n  */\ntemplate<typename MatrixType, typename Rhs, typename Dest, typename Preconditioner>\nbool bicgstab(const MatrixType& mat, const Rhs& rhs, Dest& x,\n              const Preconditioner& precond, int& iters,\n              typename Dest::RealScalar& tol_error)\n{\n  using std::sqrt;\n  using std::abs;\n  typedef typename Dest::RealScalar RealScalar;\n  typedef typename Dest::Scalar Scalar;\n  typedef Matrix<Scalar,Dynamic,1> VectorType;\n  RealScalar tol = tol_error;\n  int maxIters = iters;\n\n  int n = mat.cols();\n  VectorType r  = rhs - mat * x;\n  VectorType r0 = r;\n  \n  RealScalar r0_sqnorm = r0.squaredNorm();\n  RealScalar rhs_sqnorm = rhs.squaredNorm();\n  if(rhs_sqnorm == 0)\n  {\n    x.setZero();\n    return true;\n  }\n  Scalar rho    = 1;\n  Scalar alpha  = 1;\n  Scalar w      = 1;\n  \n  VectorType v = VectorType::Zero(n), p = VectorType::Zero(n);\n  VectorType y(n),  z(n);\n  VectorType kt(n), ks(n);\n\n  VectorType s(n), t(n);\n\n  RealScalar tol2 = tol*tol;\n  RealScalar eps2 = NumTraits<Scalar>::epsilon()*NumTraits<Scalar>::epsilon();\n  int i = 0;\n  int restarts = 0;\n\n  while ( r.squaredNorm()/rhs_sqnorm > tol2 && i<maxIters )\n  {\n    Scalar rho_old = rho;\n\n    rho = r0.dot(r);\n    if (abs(rho) < eps2*r0_sqnorm)\n    {\n      // The new residual vector became too orthogonal to the arbitrarily choosen direction r0\n      // Let's restart with a new r0:\n      r0 = r;\n      rho = r0_sqnorm = r.squaredNorm();\n      if(restarts++ == 0)\n        i = 0;\n    }\n    Scalar beta = (rho/rho_old) * (alpha / w);\n    p = r + beta * (p - w * v);\n    \n    y = precond.solve(p);\n    \n    v.noalias() = mat * y;\n\n    alpha = rho / r0.dot(v);\n    s = r - alpha * v;\n\n    z = precond.solve(s);\n    t.noalias() = mat * z;\n\n    RealScalar tmp = t.squaredNorm();\n    if(tmp>RealScalar(0))\n      w = t.dot(s) / tmp;\n    else\n      w = Scalar(0);\n    x += alpha * y + w * z;\n    r = s - w * t;\n    ++i;\n  }\n  tol_error = sqrt(r.squaredNorm()/rhs_sqnorm);\n  iters = i;\n  return true; \n}\n\n}\n\ntemplate< typename _MatrixType,\n          typename _Preconditioner = DiagonalPreconditioner<typename _MatrixType::Scalar> >\nclass BiCGSTAB;\n\nnamespace internal {\n\ntemplate< typename _MatrixType, typename _Preconditioner>\nstruct traits<BiCGSTAB<_MatrixType,_Preconditioner> >\n{\n  typedef _MatrixType MatrixType;\n  typedef _Preconditioner Preconditioner;\n};\n\n}\n\n/** \\ingroup IterativeLinearSolvers_Module\n  * \\brief A bi conjugate gradient stabilized solver for sparse square problems\n  *\n  * This class allows to solve for A.x = b sparse linear problems using a bi conjugate gradient\n  * stabilized algorithm. The vectors x and b can be either dense or sparse.\n  *\n  * \\tparam _MatrixType the type of the sparse matrix A, can be a dense or a sparse matrix.\n  * \\tparam _Preconditioner the type of the preconditioner. Default is DiagonalPreconditioner\n  *\n  * The maximal number of iterations and tolerance value can be controlled via the setMaxIterations()\n  * and setTolerance() methods. The defaults are the size of the problem for the maximal number of iterations\n  * and NumTraits<Scalar>::epsilon() for the tolerance.\n  * \n  * This class can be used as the direct solver classes. Here is a typical usage example:\n  * \\code\n  * int n = 10000;\n  * VectorXd x(n), b(n);\n  * SparseMatrix<double> A(n,n);\n  * // fill A and b\n  * BiCGSTAB<SparseMatrix<double> > solver;\n  * solver.compute(A);\n  * x = solver.solve(b);\n  * std::cout << \"#iterations:     \" << solver.iterations() << std::endl;\n  * std::cout << \"estimated error: \" << solver.error()      << std::endl;\n  * // update b, and solve again\n  * x = solver.solve(b);\n  * \\endcode\n  * \n  * By default the iterations start with x=0 as an initial guess of the solution.\n  * One can control the start using the solveWithGuess() method.\n  * \n  * \\sa class SimplicialCholesky, DiagonalPreconditioner, IdentityPreconditioner\n  */\ntemplate< typename _MatrixType, typename _Preconditioner>\nclass BiCGSTAB : public IterativeSolverBase<BiCGSTAB<_MatrixType,_Preconditioner> >\n{\n  typedef IterativeSolverBase<BiCGSTAB> Base;\n  using Base::mp_matrix;\n  using Base::m_error;\n  using Base::m_iterations;\n  using Base::m_info;\n  using Base::m_isInitialized;\npublic:\n  typedef _MatrixType MatrixType;\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::RealScalar RealScalar;\n  typedef _Preconditioner Preconditioner;\n\npublic:\n\n  /** Default constructor. */\n  BiCGSTAB() : Base() {}\n\n  /** Initialize the solver with matrix \\a A for further \\c Ax=b solving.\n    * \n    * This constructor is a shortcut for the default constructor followed\n    * by a call to compute().\n    * \n    * \\warning this class stores a reference to the matrix A as well as some\n    * precomputed values that depend on it. Therefore, if \\a A is changed\n    * this class becomes invalid. Call compute() to update it with the new\n    * matrix A, or modify a copy of A.\n    */\n  template<typename MatrixDerived>\n  explicit BiCGSTAB(const EigenBase<MatrixDerived>& A) : Base(A.derived()) {}\n\n  ~BiCGSTAB() {}\n  \n  /** \\returns the solution x of \\f$ A x = b \\f$ using the current decomposition of A\n    * \\a x0 as an initial solution.\n    *\n    * \\sa compute()\n    */\n  template<typename Rhs,typename Guess>\n  inline const internal::solve_retval_with_guess<BiCGSTAB, Rhs, Guess>\n  solveWithGuess(const MatrixBase<Rhs>& b, const Guess& x0) const\n  {\n    eigen_assert(m_isInitialized && \"BiCGSTAB is not initialized.\");\n    eigen_assert(Base::rows()==b.rows()\n              && \"BiCGSTAB::solve(): invalid number of rows of the right hand side matrix b\");\n    return internal::solve_retval_with_guess\n            <BiCGSTAB, Rhs, Guess>(*this, b.derived(), x0);\n  }\n  \n  /** \\internal */\n  template<typename Rhs,typename Dest>\n  void _solveWithGuess(const Rhs& b, Dest& x) const\n  {    \n    bool failed = false;\n    for(int j=0; j<b.cols(); ++j)\n    {\n      m_iterations = Base::maxIterations();\n      m_error = Base::m_tolerance;\n      \n      typename Dest::ColXpr xj(x,j);\n      if(!internal::bicgstab(*mp_matrix, b.col(j), xj, Base::m_preconditioner, m_iterations, m_error))\n        failed = true;\n    }\n    m_info = failed ? NumericalIssue\n           : m_error <= Base::m_tolerance ? Success\n           : NoConvergence;\n    m_isInitialized = true;\n  }\n\n  /** \\internal */\n  template<typename Rhs,typename Dest>\n  void _solve(const Rhs& b, Dest& x) const\n  {\n//     x.setZero();\n  x = b;\n    _solveWithGuess(b,x);\n  }\n\nprotected:\n\n};\n\n\nnamespace internal {\n\n  template<typename _MatrixType, typename _Preconditioner, typename Rhs>\nstruct solve_retval<BiCGSTAB<_MatrixType, _Preconditioner>, Rhs>\n  : solve_retval_base<BiCGSTAB<_MatrixType, _Preconditioner>, Rhs>\n{\n  typedef BiCGSTAB<_MatrixType, _Preconditioner> Dec;\n  EIGEN_MAKE_SOLVE_HELPERS(Dec,Rhs)\n\n  template<typename Dest> void evalTo(Dest& dst) const\n  {\n    dec()._solve(rhs(),dst);\n  }\n};\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_BICGSTAB_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/IterativeLinearSolvers/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_IterativeLinearSolvers_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_IterativeLinearSolvers_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/IterativeLinearSolvers COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2011 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_CONJUGATE_GRADIENT_H\n#define EIGEN_CONJUGATE_GRADIENT_H\n\nnamespace Eigen { \n\nnamespace internal {\n\n/** \\internal Low-level conjugate gradient algorithm\n  * \\param mat The matrix A\n  * \\param rhs The right hand side vector b\n  * \\param x On input and initial solution, on output the computed solution.\n  * \\param precond A preconditioner being able to efficiently solve for an\n  *                approximation of Ax=b (regardless of b)\n  * \\param iters On input the max number of iteration, on output the number of performed iterations.\n  * \\param tol_error On input the tolerance error, on output an estimation of the relative error.\n  */\ntemplate<typename MatrixType, typename Rhs, typename Dest, typename Preconditioner>\nEIGEN_DONT_INLINE\nvoid conjugate_gradient(const MatrixType& mat, const Rhs& rhs, Dest& x,\n                        const Preconditioner& precond, int& iters,\n                        typename Dest::RealScalar& tol_error)\n{\n  using std::sqrt;\n  using std::abs;\n  typedef typename Dest::RealScalar RealScalar;\n  typedef typename Dest::Scalar Scalar;\n  typedef Matrix<Scalar,Dynamic,1> VectorType;\n  \n  RealScalar tol = tol_error;\n  int maxIters = iters;\n  \n  int n = mat.cols();\n\n  VectorType residual = rhs - mat * x; //initial residual\n\n  RealScalar rhsNorm2 = rhs.squaredNorm();\n  if(rhsNorm2 == 0) \n  {\n    x.setZero();\n    iters = 0;\n    tol_error = 0;\n    return;\n  }\n  RealScalar threshold = tol*tol*rhsNorm2;\n  RealScalar residualNorm2 = residual.squaredNorm();\n  if (residualNorm2 < threshold)\n  {\n    iters = 0;\n    tol_error = sqrt(residualNorm2 / rhsNorm2);\n    return;\n  }\n  \n  VectorType p(n);\n  p = precond.solve(residual);      //initial search direction\n\n  VectorType z(n), tmp(n);\n  RealScalar absNew = numext::real(residual.dot(p));  // the square of the absolute value of r scaled by invM\n  int i = 0;\n  while(i < maxIters)\n  {\n    tmp.noalias() = mat * p;              // the bottleneck of the algorithm\n\n    Scalar alpha = absNew / p.dot(tmp);   // the amount we travel on dir\n    x += alpha * p;                       // update solution\n    residual -= alpha * tmp;              // update residue\n    \n    residualNorm2 = residual.squaredNorm();\n    if(residualNorm2 < threshold)\n      break;\n    \n    z = precond.solve(residual);          // approximately solve for \"A z = residual\"\n\n    RealScalar absOld = absNew;\n    absNew = numext::real(residual.dot(z));     // update the absolute value of r\n    RealScalar beta = absNew / absOld;            // calculate the Gram-Schmidt value used to create the new search direction\n    p = z + beta * p;                             // update search direction\n    i++;\n  }\n  tol_error = sqrt(residualNorm2 / rhsNorm2);\n  iters = i;\n}\n\n}\n\ntemplate< typename _MatrixType, int _UpLo=Lower,\n          typename _Preconditioner = DiagonalPreconditioner<typename _MatrixType::Scalar> >\nclass ConjugateGradient;\n\nnamespace internal {\n\ntemplate< typename _MatrixType, int _UpLo, typename _Preconditioner>\nstruct traits<ConjugateGradient<_MatrixType,_UpLo,_Preconditioner> >\n{\n  typedef _MatrixType MatrixType;\n  typedef _Preconditioner Preconditioner;\n};\n\n}\n\n/** \\ingroup IterativeLinearSolvers_Module\n  * \\brief A conjugate gradient solver for sparse self-adjoint problems\n  *\n  * This class allows to solve for A.x = b sparse linear problems using a conjugate gradient algorithm.\n  * The sparse matrix A must be selfadjoint. The vectors x and b can be either dense or sparse.\n  *\n  * \\tparam _MatrixType the type of the matrix A, can be a dense or a sparse matrix.\n  * \\tparam _UpLo the triangular part that will be used for the computations. It can be Lower,\n  *               Upper, or Lower|Upper in which the full matrix entries will be considered. Default is Lower.\n  * \\tparam _Preconditioner the type of the preconditioner. Default is DiagonalPreconditioner\n  *\n  * The maximal number of iterations and tolerance value can be controlled via the setMaxIterations()\n  * and setTolerance() methods. The defaults are the size of the problem for the maximal number of iterations\n  * and NumTraits<Scalar>::epsilon() for the tolerance.\n  * \n  * This class can be used as the direct solver classes. Here is a typical usage example:\n  * \\code\n  * int n = 10000;\n  * VectorXd x(n), b(n);\n  * SparseMatrix<double> A(n,n);\n  * // fill A and b\n  * ConjugateGradient<SparseMatrix<double> > cg;\n  * cg.compute(A);\n  * x = cg.solve(b);\n  * std::cout << \"#iterations:     \" << cg.iterations() << std::endl;\n  * std::cout << \"estimated error: \" << cg.error()      << std::endl;\n  * // update b, and solve again\n  * x = cg.solve(b);\n  * \\endcode\n  * \n  * By default the iterations start with x=0 as an initial guess of the solution.\n  * One can control the start using the solveWithGuess() method.\n  * \n  * ConjugateGradient can also be used in a matrix-free context, see the following \\link MatrixfreeSolverExample example \\endlink.\n  *\n  * \\sa class SimplicialCholesky, DiagonalPreconditioner, IdentityPreconditioner\n  */\ntemplate< typename _MatrixType, int _UpLo, typename _Preconditioner>\nclass ConjugateGradient : public IterativeSolverBase<ConjugateGradient<_MatrixType,_UpLo,_Preconditioner> >\n{\n  typedef IterativeSolverBase<ConjugateGradient> Base;\n  using Base::mp_matrix;\n  using Base::m_error;\n  using Base::m_iterations;\n  using Base::m_info;\n  using Base::m_isInitialized;\npublic:\n  typedef _MatrixType MatrixType;\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::RealScalar RealScalar;\n  typedef _Preconditioner Preconditioner;\n\n  enum {\n    UpLo = _UpLo\n  };\n\npublic:\n\n  /** Default constructor. */\n  ConjugateGradient() : Base() {}\n\n  /** Initialize the solver with matrix \\a A for further \\c Ax=b solving.\n    * \n    * This constructor is a shortcut for the default constructor followed\n    * by a call to compute().\n    * \n    * \\warning this class stores a reference to the matrix A as well as some\n    * precomputed values that depend on it. Therefore, if \\a A is changed\n    * this class becomes invalid. Call compute() to update it with the new\n    * matrix A, or modify a copy of A.\n    */\n  template<typename MatrixDerived>\n  explicit ConjugateGradient(const EigenBase<MatrixDerived>& A) : Base(A.derived()) {}\n\n  ~ConjugateGradient() {}\n  \n  /** \\returns the solution x of \\f$ A x = b \\f$ using the current decomposition of A\n    * \\a x0 as an initial solution.\n    *\n    * \\sa compute()\n    */\n  template<typename Rhs,typename Guess>\n  inline const internal::solve_retval_with_guess<ConjugateGradient, Rhs, Guess>\n  solveWithGuess(const MatrixBase<Rhs>& b, const Guess& x0) const\n  {\n    eigen_assert(m_isInitialized && \"ConjugateGradient is not initialized.\");\n    eigen_assert(Base::rows()==b.rows()\n              && \"ConjugateGradient::solve(): invalid number of rows of the right hand side matrix b\");\n    return internal::solve_retval_with_guess\n            <ConjugateGradient, Rhs, Guess>(*this, b.derived(), x0);\n  }\n\n  /** \\internal */\n  template<typename Rhs,typename Dest>\n  void _solveWithGuess(const Rhs& b, Dest& x) const\n  {\n    typedef typename internal::conditional<UpLo==(Lower|Upper),\n                                           const MatrixType&,\n                                           SparseSelfAdjointView<const MatrixType, UpLo>\n                                          >::type MatrixWrapperType;\n    m_iterations = Base::maxIterations();\n    m_error = Base::m_tolerance;\n\n    for(int j=0; j<b.cols(); ++j)\n    {\n      m_iterations = Base::maxIterations();\n      m_error = Base::m_tolerance;\n\n      typename Dest::ColXpr xj(x,j);\n      internal::conjugate_gradient(MatrixWrapperType(*mp_matrix), b.col(j), xj, Base::m_preconditioner, m_iterations, m_error);\n    }\n\n    m_isInitialized = true;\n    m_info = m_error <= Base::m_tolerance ? Success : NoConvergence;\n  }\n  \n  /** \\internal */\n  template<typename Rhs,typename Dest>\n  void _solve(const Rhs& b, Dest& x) const\n  {\n    x.setZero();\n    _solveWithGuess(b,x);\n  }\n\nprotected:\n\n};\n\n\nnamespace internal {\n\ntemplate<typename _MatrixType, int _UpLo, typename _Preconditioner, typename Rhs>\nstruct solve_retval<ConjugateGradient<_MatrixType,_UpLo,_Preconditioner>, Rhs>\n  : solve_retval_base<ConjugateGradient<_MatrixType,_UpLo,_Preconditioner>, Rhs>\n{\n  typedef ConjugateGradient<_MatrixType,_UpLo,_Preconditioner> Dec;\n  EIGEN_MAKE_SOLVE_HELPERS(Dec,Rhs)\n\n  template<typename Dest> void evalTo(Dest& dst) const\n  {\n    dec()._solve(rhs(),dst);\n  }\n};\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_CONJUGATE_GRADIENT_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_INCOMPLETE_LUT_H\n#define EIGEN_INCOMPLETE_LUT_H\n\n\nnamespace Eigen { \n\nnamespace internal {\n    \n/** \\internal\n  * Compute a quick-sort split of a vector \n  * On output, the vector row is permuted such that its elements satisfy\n  * abs(row(i)) >= abs(row(ncut)) if i<ncut\n  * abs(row(i)) <= abs(row(ncut)) if i>ncut \n  * \\param row The vector of values\n  * \\param ind The array of index for the elements in @p row\n  * \\param ncut  The number of largest elements to keep\n  **/ \ntemplate <typename VectorV, typename VectorI, typename Index>\nIndex QuickSplit(VectorV &row, VectorI &ind, Index ncut)\n{\n  typedef typename VectorV::RealScalar RealScalar;\n  using std::swap;\n  using std::abs;\n  Index mid;\n  Index n = row.size(); /* length of the vector */\n  Index first, last ;\n  \n  ncut--; /* to fit the zero-based indices */\n  first = 0; \n  last = n-1; \n  if (ncut < first || ncut > last ) return 0;\n  \n  do {\n    mid = first; \n    RealScalar abskey = abs(row(mid)); \n    for (Index j = first + 1; j <= last; j++) {\n      if ( abs(row(j)) > abskey) {\n        ++mid;\n        swap(row(mid), row(j));\n        swap(ind(mid), ind(j));\n      }\n    }\n    /* Interchange for the pivot element */\n    swap(row(mid), row(first));\n    swap(ind(mid), ind(first));\n    \n    if (mid > ncut) last = mid - 1;\n    else if (mid < ncut ) first = mid + 1; \n  } while (mid != ncut );\n  \n  return 0; /* mid is equal to ncut */ \n}\n\n}// end namespace internal\n\n/** \\ingroup IterativeLinearSolvers_Module\n  * \\class IncompleteLUT\n  * \\brief Incomplete LU factorization with dual-threshold strategy\n  *\n  * During the numerical factorization, two dropping rules are used :\n  *  1) any element whose magnitude is less than some tolerance is dropped.\n  *    This tolerance is obtained by multiplying the input tolerance @p droptol \n  *    by the average magnitude of all the original elements in the current row.\n  *  2) After the elimination of the row, only the @p fill largest elements in \n  *    the L part and the @p fill largest elements in the U part are kept \n  *    (in addition to the diagonal element ). Note that @p fill is computed from \n  *    the input parameter @p fillfactor which is used the ratio to control the fill_in \n  *    relatively to the initial number of nonzero elements.\n  * \n  * The two extreme cases are when @p droptol=0 (to keep all the @p fill*2 largest elements)\n  * and when @p fill=n/2 with @p droptol being different to zero. \n  * \n  * References : Yousef Saad, ILUT: A dual threshold incomplete LU factorization, \n  *              Numerical Linear Algebra with Applications, 1(4), pp 387-402, 1994.\n  * \n  * NOTE : The following implementation is derived from the ILUT implementation\n  * in the SPARSKIT package, Copyright (C) 2005, the Regents of the University of Minnesota \n  *  released under the terms of the GNU LGPL: \n  *    http://www-users.cs.umn.edu/~saad/software/SPARSKIT/README\n  * However, Yousef Saad gave us permission to relicense his ILUT code to MPL2.\n  * See the Eigen mailing list archive, thread: ILUT, date: July 8, 2012:\n  *   http://listengine.tuxfamily.org/lists.tuxfamily.org/eigen/2012/07/msg00064.html\n  * alternatively, on GMANE:\n  *   http://comments.gmane.org/gmane.comp.lib.eigen/3302\n  */\ntemplate <typename _Scalar>\nclass IncompleteLUT : internal::noncopyable\n{\n    typedef _Scalar Scalar;\n    typedef typename NumTraits<Scalar>::Real RealScalar;\n    typedef Matrix<Scalar,Dynamic,1> Vector;\n    typedef SparseMatrix<Scalar,RowMajor> FactorType;\n    typedef SparseMatrix<Scalar,ColMajor> PermutType;\n    typedef typename FactorType::Index Index;\n\n  public:\n    typedef Matrix<Scalar,Dynamic,Dynamic> MatrixType;\n    \n    IncompleteLUT()\n      : m_droptol(NumTraits<Scalar>::dummy_precision()), m_fillfactor(10),\n        m_analysisIsOk(false), m_factorizationIsOk(false), m_isInitialized(false)\n    {}\n    \n    template<typename MatrixType>\n    IncompleteLUT(const MatrixType& mat, const RealScalar& droptol=NumTraits<Scalar>::dummy_precision(), int fillfactor = 10)\n      : m_droptol(droptol),m_fillfactor(fillfactor),\n        m_analysisIsOk(false),m_factorizationIsOk(false),m_isInitialized(false)\n    {\n      eigen_assert(fillfactor != 0);\n      compute(mat); \n    }\n    \n    Index rows() const { return m_lu.rows(); }\n    \n    Index cols() const { return m_lu.cols(); }\n\n    /** \\brief Reports whether previous computation was successful.\n      *\n      * \\returns \\c Success if computation was succesful,\n      *          \\c NumericalIssue if the matrix.appears to be negative.\n      */\n    ComputationInfo info() const\n    {\n      eigen_assert(m_isInitialized && \"IncompleteLUT is not initialized.\");\n      return m_info;\n    }\n    \n    template<typename MatrixType>\n    void analyzePattern(const MatrixType& amat);\n    \n    template<typename MatrixType>\n    void factorize(const MatrixType& amat);\n    \n    /**\n      * Compute an incomplete LU factorization with dual threshold on the matrix mat\n      * No pivoting is done in this version\n      * \n      **/\n    template<typename MatrixType>\n    IncompleteLUT<Scalar>& compute(const MatrixType& amat)\n    {\n      analyzePattern(amat); \n      factorize(amat);\n      return *this;\n    }\n\n    void setDroptol(const RealScalar& droptol); \n    void setFillfactor(int fillfactor); \n    \n    template<typename Rhs, typename Dest>\n    void _solve(const Rhs& b, Dest& x) const\n    {\n      x = m_Pinv * b;\n      x = m_lu.template triangularView<UnitLower>().solve(x);\n      x = m_lu.template triangularView<Upper>().solve(x);\n      x = m_P * x; \n    }\n\n    template<typename Rhs> inline const internal::solve_retval<IncompleteLUT, Rhs>\n     solve(const MatrixBase<Rhs>& b) const\n    {\n      eigen_assert(m_isInitialized && \"IncompleteLUT is not initialized.\");\n      eigen_assert(cols()==b.rows()\n                && \"IncompleteLUT::solve(): invalid number of rows of the right hand side matrix b\");\n      return internal::solve_retval<IncompleteLUT, Rhs>(*this, b.derived());\n    }\n\nprotected:\n\n    /** keeps off-diagonal entries; drops diagonal entries */\n    struct keep_diag {\n      inline bool operator() (const Index& row, const Index& col, const Scalar&) const\n      {\n        return row!=col;\n      }\n    };\n\nprotected:\n\n    FactorType m_lu;\n    RealScalar m_droptol;\n    int m_fillfactor;\n    bool m_analysisIsOk;\n    bool m_factorizationIsOk;\n    bool m_isInitialized;\n    ComputationInfo m_info;\n    PermutationMatrix<Dynamic,Dynamic,Index> m_P;     // Fill-reducing permutation\n    PermutationMatrix<Dynamic,Dynamic,Index> m_Pinv;  // Inverse permutation\n};\n\n/**\n * Set control parameter droptol\n *  \\param droptol   Drop any element whose magnitude is less than this tolerance \n **/ \ntemplate<typename Scalar>\nvoid IncompleteLUT<Scalar>::setDroptol(const RealScalar& droptol)\n{\n  this->m_droptol = droptol;   \n}\n\n/**\n * Set control parameter fillfactor\n * \\param fillfactor  This is used to compute the  number @p fill_in of largest elements to keep on each row. \n **/ \ntemplate<typename Scalar>\nvoid IncompleteLUT<Scalar>::setFillfactor(int fillfactor)\n{\n  this->m_fillfactor = fillfactor;   \n}\n\ntemplate <typename Scalar>\ntemplate<typename _MatrixType>\nvoid IncompleteLUT<Scalar>::analyzePattern(const _MatrixType& amat)\n{\n  // Compute the Fill-reducing permutation\n  // Since ILUT does not perform any numerical pivoting,\n  // it is highly preferable to keep the diagonal through symmetric permutations.\n#ifndef EIGEN_MPL2_ONLY\n  // To this end, let's symmetrize the pattern and perform AMD on it.\n  SparseMatrix<Scalar,ColMajor, Index> mat1 = amat;\n  SparseMatrix<Scalar,ColMajor, Index> mat2 = amat.transpose();\n  // FIXME for a matrix with nearly symmetric pattern, mat2+mat1 is the appropriate choice.\n  //       on the other hand for a really non-symmetric pattern, mat2*mat1 should be prefered...\n  SparseMatrix<Scalar,ColMajor, Index> AtA = mat2 + mat1;\n  AMDOrdering<Index> ordering;\n  ordering(AtA,m_P);\n  m_Pinv  = m_P.inverse(); // cache the inverse permutation\n#else\n  // If AMD is not available, (MPL2-only), then let's use the slower COLAMD routine.\n  SparseMatrix<Scalar,ColMajor, Index> mat1 = amat;\n  COLAMDOrdering<Index> ordering;\n  ordering(mat1,m_Pinv);\n  m_P = m_Pinv.inverse();\n#endif\n\n  m_analysisIsOk = true;\n  m_factorizationIsOk = false;\n  m_isInitialized = false;\n}\n\ntemplate <typename Scalar>\ntemplate<typename _MatrixType>\nvoid IncompleteLUT<Scalar>::factorize(const _MatrixType& amat)\n{\n  using std::sqrt;\n  using std::swap;\n  using std::abs;\n\n  eigen_assert((amat.rows() == amat.cols()) && \"The factorization should be done on a square matrix\");\n  Index n = amat.cols();  // Size of the matrix\n  m_lu.resize(n,n);\n  // Declare Working vectors and variables\n  Vector u(n) ;     // real values of the row -- maximum size is n --\n  VectorXi ju(n);   // column position of the values in u -- maximum size  is n\n  VectorXi jr(n);   // Indicate the position of the nonzero elements in the vector u -- A zero location is indicated by -1\n\n  // Apply the fill-reducing permutation\n  eigen_assert(m_analysisIsOk && \"You must first call analyzePattern()\");\n  SparseMatrix<Scalar,RowMajor, Index> mat;\n  mat = amat.twistedBy(m_Pinv);\n\n  // Initialization\n  jr.fill(-1);\n  ju.fill(0);\n  u.fill(0);\n\n  // number of largest elements to keep in each row:\n  Index fill_in =   static_cast<Index> (amat.nonZeros()*m_fillfactor)/n+1;\n  if (fill_in > n) fill_in = n;\n\n  // number of largest nonzero elements to keep in the L and the U part of the current row:\n  Index nnzL = fill_in/2;\n  Index nnzU = nnzL;\n  m_lu.reserve(n * (nnzL + nnzU + 1));\n\n  // global loop over the rows of the sparse matrix\n  for (Index ii = 0; ii < n; ii++)\n  {\n    // 1 - copy the lower and the upper part of the row i of mat in the working vector u\n\n    Index sizeu = 1; // number of nonzero elements in the upper part of the current row\n    Index sizel = 0; // number of nonzero elements in the lower part of the current row\n    ju(ii)    = ii;\n    u(ii)     = 0;\n    jr(ii)    = ii;\n    RealScalar rownorm = 0;\n\n    typename FactorType::InnerIterator j_it(mat, ii); // Iterate through the current row ii\n    for (; j_it; ++j_it)\n    {\n      Index k = j_it.index();\n      if (k < ii)\n      {\n        // copy the lower part\n        ju(sizel) = k;\n        u(sizel) = j_it.value();\n        jr(k) = sizel;\n        ++sizel;\n      }\n      else if (k == ii)\n      {\n        u(ii) = j_it.value();\n      }\n      else\n      {\n        // copy the upper part\n        Index jpos = ii + sizeu;\n        ju(jpos) = k;\n        u(jpos) = j_it.value();\n        jr(k) = jpos;\n        ++sizeu;\n      }\n      rownorm += numext::abs2(j_it.value());\n    }\n\n    // 2 - detect possible zero row\n    if(rownorm==0)\n    {\n      m_info = NumericalIssue;\n      return;\n    }\n    // Take the 2-norm of the current row as a relative tolerance\n    rownorm = sqrt(rownorm);\n\n    // 3 - eliminate the previous nonzero rows\n    Index jj = 0;\n    Index len = 0;\n    while (jj < sizel)\n    {\n      // In order to eliminate in the correct order,\n      // we must select first the smallest column index among  ju(jj:sizel)\n      Index k;\n      Index minrow = ju.segment(jj,sizel-jj).minCoeff(&k); // k is relative to the segment\n      k += jj;\n      if (minrow != ju(jj))\n      {\n        // swap the two locations\n        Index j = ju(jj);\n        swap(ju(jj), ju(k));\n        jr(minrow) = jj;   jr(j) = k;\n        swap(u(jj), u(k));\n      }\n      // Reset this location\n      jr(minrow) = -1;\n\n      // Start elimination\n      typename FactorType::InnerIterator ki_it(m_lu, minrow);\n      while (ki_it && ki_it.index() < minrow) ++ki_it;\n      eigen_internal_assert(ki_it && ki_it.col()==minrow);\n      Scalar fact = u(jj) / ki_it.value();\n\n      // drop too small elements\n      if(abs(fact) <= m_droptol)\n      {\n        jj++;\n        continue;\n      }\n\n      // linear combination of the current row ii and the row minrow\n      ++ki_it;\n      for (; ki_it; ++ki_it)\n      {\n        Scalar prod = fact * ki_it.value();\n        Index j       = ki_it.index();\n        Index jpos    = jr(j);\n        if (jpos == -1) // fill-in element\n        {\n          Index newpos;\n          if (j >= ii) // dealing with the upper part\n          {\n            newpos = ii + sizeu;\n            sizeu++;\n            eigen_internal_assert(sizeu<=n);\n          }\n          else // dealing with the lower part\n          {\n            newpos = sizel;\n            sizel++;\n            eigen_internal_assert(sizel<=ii);\n          }\n          ju(newpos) = j;\n          u(newpos) = -prod;\n          jr(j) = newpos;\n        }\n        else\n          u(jpos) -= prod;\n      }\n      // store the pivot element\n      u(len) = fact;\n      ju(len) = minrow;\n      ++len;\n\n      jj++;\n    } // end of the elimination on the row ii\n\n    // reset the upper part of the pointer jr to zero\n    for(Index k = 0; k <sizeu; k++) jr(ju(ii+k)) = -1;\n\n    // 4 - partially sort and insert the elements in the m_lu matrix\n\n    // sort the L-part of the row\n    sizel = len;\n    len = (std::min)(sizel, nnzL);\n    typename Vector::SegmentReturnType ul(u.segment(0, sizel));\n    typename VectorXi::SegmentReturnType jul(ju.segment(0, sizel));\n    internal::QuickSplit(ul, jul, len);\n\n    // store the largest m_fill elements of the L part\n    m_lu.startVec(ii);\n    for(Index k = 0; k < len; k++)\n      m_lu.insertBackByOuterInnerUnordered(ii,ju(k)) = u(k);\n\n    // store the diagonal element\n    // apply a shifting rule to avoid zero pivots (we are doing an incomplete factorization)\n    if (u(ii) == Scalar(0))\n      u(ii) = sqrt(m_droptol) * rownorm;\n    m_lu.insertBackByOuterInnerUnordered(ii, ii) = u(ii);\n\n    // sort the U-part of the row\n    // apply the dropping rule first\n    len = 0;\n    for(Index k = 1; k < sizeu; k++)\n    {\n      if(abs(u(ii+k)) > m_droptol * rownorm )\n      {\n        ++len;\n        u(ii + len)  = u(ii + k);\n        ju(ii + len) = ju(ii + k);\n      }\n    }\n    sizeu = len + 1; // +1 to take into account the diagonal element\n    len = (std::min)(sizeu, nnzU);\n    typename Vector::SegmentReturnType uu(u.segment(ii+1, sizeu-1));\n    typename VectorXi::SegmentReturnType juu(ju.segment(ii+1, sizeu-1));\n    internal::QuickSplit(uu, juu, len);\n\n    // store the largest elements of the U part\n    for(Index k = ii + 1; k < ii + len; k++)\n      m_lu.insertBackByOuterInnerUnordered(ii,ju(k)) = u(k);\n  }\n\n  m_lu.finalize();\n  m_lu.makeCompressed();\n\n  m_factorizationIsOk = true;\n  m_isInitialized = m_factorizationIsOk;\n  m_info = Success;\n}\n\nnamespace internal {\n\ntemplate<typename _MatrixType, typename Rhs>\nstruct solve_retval<IncompleteLUT<_MatrixType>, Rhs>\n  : solve_retval_base<IncompleteLUT<_MatrixType>, Rhs>\n{\n  typedef IncompleteLUT<_MatrixType> Dec;\n  EIGEN_MAKE_SOLVE_HELPERS(Dec,Rhs)\n\n  template<typename Dest> void evalTo(Dest& dst) const\n  {\n    dec()._solve(rhs(),dst);\n  }\n};\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_INCOMPLETE_LUT_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2011 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_ITERATIVE_SOLVER_BASE_H\n#define EIGEN_ITERATIVE_SOLVER_BASE_H\n\nnamespace Eigen { \n\n/** \\ingroup IterativeLinearSolvers_Module\n  * \\brief Base class for linear iterative solvers\n  *\n  * \\sa class SimplicialCholesky, DiagonalPreconditioner, IdentityPreconditioner\n  */\ntemplate< typename Derived>\nclass IterativeSolverBase : internal::noncopyable\n{\npublic:\n  typedef typename internal::traits<Derived>::MatrixType MatrixType;\n  typedef typename internal::traits<Derived>::Preconditioner Preconditioner;\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::RealScalar RealScalar;\n\npublic:\n\n  Derived& derived() { return *static_cast<Derived*>(this); }\n  const Derived& derived() const { return *static_cast<const Derived*>(this); }\n\n  /** Default constructor. */\n  IterativeSolverBase()\n    : mp_matrix(0)\n  {\n    init();\n  }\n\n  /** Initialize the solver with matrix \\a A for further \\c Ax=b solving.\n    * \n    * This constructor is a shortcut for the default constructor followed\n    * by a call to compute().\n    * \n    * \\warning this class stores a reference to the matrix A as well as some\n    * precomputed values that depend on it. Therefore, if \\a A is changed\n    * this class becomes invalid. Call compute() to update it with the new\n    * matrix A, or modify a copy of A.\n    */\n  template<typename InputDerived>\n  IterativeSolverBase(const EigenBase<InputDerived>& A)\n  {\n    init();\n    compute(A.derived());\n  }\n\n  ~IterativeSolverBase() {}\n  \n  /** Initializes the iterative solver for the sparcity pattern of the matrix \\a A for further solving \\c Ax=b problems.\n    *\n    * Currently, this function mostly call analyzePattern on the preconditioner. In the future\n    * we might, for instance, implement column reodering for faster matrix vector products.\n    */\n  template<typename InputDerived>\n  Derived& analyzePattern(const EigenBase<InputDerived>& A)\n  {\n    grabInput(A.derived());\n    m_preconditioner.analyzePattern(*mp_matrix);\n    m_isInitialized = true;\n    m_analysisIsOk = true;\n    m_info = Success;\n    return derived();\n  }\n  \n  /** Initializes the iterative solver with the numerical values of the matrix \\a A for further solving \\c Ax=b problems.\n    *\n    * Currently, this function mostly call factorize on the preconditioner.\n    *\n    * \\warning this class stores a reference to the matrix A as well as some\n    * precomputed values that depend on it. Therefore, if \\a A is changed\n    * this class becomes invalid. Call compute() to update it with the new\n    * matrix A, or modify a copy of A.\n    */\n  template<typename InputDerived>\n  Derived& factorize(const EigenBase<InputDerived>& A)\n  {\n    grabInput(A.derived());\n    eigen_assert(m_analysisIsOk && \"You must first call analyzePattern()\"); \n    m_preconditioner.factorize(*mp_matrix);\n    m_factorizationIsOk = true;\n    m_info = Success;\n    return derived();\n  }\n\n  /** Initializes the iterative solver with the matrix \\a A for further solving \\c Ax=b problems.\n    *\n    * Currently, this function mostly initialized/compute the preconditioner. In the future\n    * we might, for instance, implement column reodering for faster matrix vector products.\n    *\n    * \\warning this class stores a reference to the matrix A as well as some\n    * precomputed values that depend on it. Therefore, if \\a A is changed\n    * this class becomes invalid. Call compute() to update it with the new\n    * matrix A, or modify a copy of A.\n    */\n  template<typename InputDerived>\n  Derived& compute(const EigenBase<InputDerived>& A)\n  {\n    grabInput(A.derived());\n    m_preconditioner.compute(*mp_matrix);\n    m_isInitialized = true;\n    m_analysisIsOk = true;\n    m_factorizationIsOk = true;\n    m_info = Success;\n    return derived();\n  }\n\n  /** \\internal */\n  Index rows() const { return mp_matrix ? mp_matrix->rows() : 0; }\n  /** \\internal */\n  Index cols() const { return mp_matrix ? mp_matrix->cols() : 0; }\n\n  /** \\returns the tolerance threshold used by the stopping criteria */\n  RealScalar tolerance() const { return m_tolerance; }\n  \n  /** Sets the tolerance threshold used by the stopping criteria */\n  Derived& setTolerance(const RealScalar& tolerance)\n  {\n    m_tolerance = tolerance;\n    return derived();\n  }\n\n  /** \\returns a read-write reference to the preconditioner for custom configuration. */\n  Preconditioner& preconditioner() { return m_preconditioner; }\n  \n  /** \\returns a read-only reference to the preconditioner. */\n  const Preconditioner& preconditioner() const { return m_preconditioner; }\n\n  /** \\returns the max number of iterations */\n  int maxIterations() const\n  {\n    return (mp_matrix && m_maxIterations<0) ? mp_matrix->cols() : m_maxIterations;\n  }\n  \n  /** Sets the max number of iterations */\n  Derived& setMaxIterations(int maxIters)\n  {\n    m_maxIterations = maxIters;\n    return derived();\n  }\n\n  /** \\returns the number of iterations performed during the last solve */\n  int iterations() const\n  {\n    eigen_assert(m_isInitialized && \"ConjugateGradient is not initialized.\");\n    return m_iterations;\n  }\n\n  /** \\returns the tolerance error reached during the last solve */\n  RealScalar error() const\n  {\n    eigen_assert(m_isInitialized && \"ConjugateGradient is not initialized.\");\n    return m_error;\n  }\n\n  /** \\returns the solution x of \\f$ A x = b \\f$ using the current decomposition of A.\n    *\n    * \\sa compute()\n    */\n  template<typename Rhs> inline const internal::solve_retval<Derived, Rhs>\n  solve(const MatrixBase<Rhs>& b) const\n  {\n    eigen_assert(m_isInitialized && \"IterativeSolverBase is not initialized.\");\n    eigen_assert(rows()==b.rows()\n              && \"IterativeSolverBase::solve(): invalid number of rows of the right hand side matrix b\");\n    return internal::solve_retval<Derived, Rhs>(derived(), b.derived());\n  }\n  \n  /** \\returns the solution x of \\f$ A x = b \\f$ using the current decomposition of A.\n    *\n    * \\sa compute()\n    */\n  template<typename Rhs>\n  inline const internal::sparse_solve_retval<IterativeSolverBase, Rhs>\n  solve(const SparseMatrixBase<Rhs>& b) const\n  {\n    eigen_assert(m_isInitialized && \"IterativeSolverBase is not initialized.\");\n    eigen_assert(rows()==b.rows()\n              && \"IterativeSolverBase::solve(): invalid number of rows of the right hand side matrix b\");\n    return internal::sparse_solve_retval<IterativeSolverBase, Rhs>(*this, b.derived());\n  }\n\n  /** \\returns Success if the iterations converged, and NoConvergence otherwise. */\n  ComputationInfo info() const\n  {\n    eigen_assert(m_isInitialized && \"IterativeSolverBase is not initialized.\");\n    return m_info;\n  }\n  \n  /** \\internal */\n  template<typename Rhs, typename DestScalar, int DestOptions, typename DestIndex>\n  void _solve_sparse(const Rhs& b, SparseMatrix<DestScalar,DestOptions,DestIndex> &dest) const\n  {\n    eigen_assert(rows()==b.rows());\n    \n    int rhsCols = b.cols();\n    int size = b.rows();\n    Eigen::Matrix<DestScalar,Dynamic,1> tb(size);\n    Eigen::Matrix<DestScalar,Dynamic,1> tx(size);\n    for(int k=0; k<rhsCols; ++k)\n    {\n      tb = b.col(k);\n      tx = derived().solve(tb);\n      dest.col(k) = tx.sparseView(0);\n    }\n  }\n\nprotected:\n\n  template<typename InputDerived>\n  void grabInput(const EigenBase<InputDerived>& A)\n  {\n    // we const cast to prevent the creation of a MatrixType temporary by the compiler.\n    grabInput_impl(A.const_cast_derived());\n  }\n\n  template<typename InputDerived>\n  void grabInput_impl(const EigenBase<InputDerived>& A)\n  {\n    m_copyMatrix = A;\n    mp_matrix = &m_copyMatrix;\n  }\n\n  void grabInput_impl(MatrixType& A)\n  {\n    if(MatrixType::RowsAtCompileTime==Dynamic && MatrixType::ColsAtCompileTime==Dynamic)\n      m_copyMatrix.resize(0,0);\n    mp_matrix = &A;\n  }\n\n  void init()\n  {\n    m_isInitialized = false;\n    m_analysisIsOk = false;\n    m_factorizationIsOk = false;\n    m_maxIterations = -1;\n    m_tolerance = NumTraits<Scalar>::epsilon();\n  }\n  MatrixType m_copyMatrix;\n  const MatrixType* mp_matrix;\n  Preconditioner m_preconditioner;\n\n  int m_maxIterations;\n  RealScalar m_tolerance;\n  \n  mutable RealScalar m_error;\n  mutable int m_iterations;\n  mutable ComputationInfo m_info;\n  mutable bool m_isInitialized, m_analysisIsOk, m_factorizationIsOk;\n};\n\nnamespace internal {\n \ntemplate<typename Derived, typename Rhs>\nstruct sparse_solve_retval<IterativeSolverBase<Derived>, Rhs>\n  : sparse_solve_retval_base<IterativeSolverBase<Derived>, Rhs>\n{\n  typedef IterativeSolverBase<Derived> Dec;\n  EIGEN_MAKE_SPARSE_SOLVE_HELPERS(Dec,Rhs)\n\n  template<typename Dest> void evalTo(Dest& dst) const\n  {\n    dec().derived()._solve_sparse(rhs(),dst);\n  }\n};\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_ITERATIVE_SOLVER_BASE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Jacobi/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_Jacobi_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_Jacobi_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/Jacobi COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/Eigen/src/Jacobi/Jacobi.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_JACOBI_H\n#define EIGEN_JACOBI_H\n\nnamespace Eigen { \n\n/** \\ingroup Jacobi_Module\n  * \\jacobi_module\n  * \\class JacobiRotation\n  * \\brief Rotation given by a cosine-sine pair.\n  *\n  * This class represents a Jacobi or Givens rotation.\n  * This is a 2D rotation in the plane \\c J of angle \\f$ \\theta \\f$ defined by\n  * its cosine \\c c and sine \\c s as follow:\n  * \\f$ J = \\left ( \\begin{array}{cc} c & \\overline s \\\\ -s  & \\overline c \\end{array} \\right ) \\f$\n  *\n  * You can apply the respective counter-clockwise rotation to a column vector \\c v by\n  * applying its adjoint on the left: \\f$ v = J^* v \\f$ that translates to the following Eigen code:\n  * \\code\n  * v.applyOnTheLeft(J.adjoint());\n  * \\endcode\n  *\n  * \\sa MatrixBase::applyOnTheLeft(), MatrixBase::applyOnTheRight()\n  */\ntemplate<typename Scalar> class JacobiRotation\n{\n  public:\n    typedef typename NumTraits<Scalar>::Real RealScalar;\n\n    /** Default constructor without any initialization. */\n    JacobiRotation() {}\n\n    /** Construct a planar rotation from a cosine-sine pair (\\a c, \\c s). */\n    JacobiRotation(const Scalar& c, const Scalar& s) : m_c(c), m_s(s) {}\n\n    Scalar& c() { return m_c; }\n    Scalar c() const { return m_c; }\n    Scalar& s() { return m_s; }\n    Scalar s() const { return m_s; }\n\n    /** Concatenates two planar rotation */\n    JacobiRotation operator*(const JacobiRotation& other)\n    {\n      using numext::conj;\n      return JacobiRotation(m_c * other.m_c - conj(m_s) * other.m_s,\n                            conj(m_c * conj(other.m_s) + conj(m_s) * conj(other.m_c)));\n    }\n\n    /** Returns the transposed transformation */\n    JacobiRotation transpose() const { using numext::conj; return JacobiRotation(m_c, -conj(m_s)); }\n\n    /** Returns the adjoint transformation */\n    JacobiRotation adjoint() const { using numext::conj; return JacobiRotation(conj(m_c), -m_s); }\n\n    template<typename Derived>\n    bool makeJacobi(const MatrixBase<Derived>&, typename Derived::Index p, typename Derived::Index q);\n    bool makeJacobi(const RealScalar& x, const Scalar& y, const RealScalar& z);\n\n    void makeGivens(const Scalar& p, const Scalar& q, Scalar* z=0);\n\n  protected:\n    void makeGivens(const Scalar& p, const Scalar& q, Scalar* z, internal::true_type);\n    void makeGivens(const Scalar& p, const Scalar& q, Scalar* z, internal::false_type);\n\n    Scalar m_c, m_s;\n};\n\n/** Makes \\c *this as a Jacobi rotation \\a J such that applying \\a J on both the right and left sides of the selfadjoint 2x2 matrix\n  * \\f$ B = \\left ( \\begin{array}{cc} x & y \\\\ \\overline y & z \\end{array} \\right )\\f$ yields a diagonal matrix \\f$ A = J^* B J \\f$\n  *\n  * \\sa MatrixBase::makeJacobi(const MatrixBase<Derived>&, Index, Index), MatrixBase::applyOnTheLeft(), MatrixBase::applyOnTheRight()\n  */\ntemplate<typename Scalar>\nbool JacobiRotation<Scalar>::makeJacobi(const RealScalar& x, const Scalar& y, const RealScalar& z)\n{\n  using std::sqrt;\n  using std::abs;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  if(y == Scalar(0))\n  {\n    m_c = Scalar(1);\n    m_s = Scalar(0);\n    return false;\n  }\n  else\n  {\n    RealScalar tau = (x-z)/(RealScalar(2)*abs(y));\n    RealScalar w = sqrt(numext::abs2(tau) + RealScalar(1));\n    RealScalar t;\n    if(tau>RealScalar(0))\n    {\n      t = RealScalar(1) / (tau + w);\n    }\n    else\n    {\n      t = RealScalar(1) / (tau - w);\n    }\n    RealScalar sign_t = t > RealScalar(0) ? RealScalar(1) : RealScalar(-1);\n    RealScalar n = RealScalar(1) / sqrt(numext::abs2(t)+RealScalar(1));\n    m_s = - sign_t * (numext::conj(y) / abs(y)) * abs(t) * n;\n    m_c = n;\n    return true;\n  }\n}\n\n/** Makes \\c *this as a Jacobi rotation \\c J such that applying \\a J on both the right and left sides of the 2x2 selfadjoint matrix\n  * \\f$ B = \\left ( \\begin{array}{cc} \\text{this}_{pp} & \\text{this}_{pq} \\\\ (\\text{this}_{pq})^* & \\text{this}_{qq} \\end{array} \\right )\\f$ yields\n  * a diagonal matrix \\f$ A = J^* B J \\f$\n  *\n  * Example: \\include Jacobi_makeJacobi.cpp\n  * Output: \\verbinclude Jacobi_makeJacobi.out\n  *\n  * \\sa JacobiRotation::makeJacobi(RealScalar, Scalar, RealScalar), MatrixBase::applyOnTheLeft(), MatrixBase::applyOnTheRight()\n  */\ntemplate<typename Scalar>\ntemplate<typename Derived>\ninline bool JacobiRotation<Scalar>::makeJacobi(const MatrixBase<Derived>& m, typename Derived::Index p, typename Derived::Index q)\n{\n  return makeJacobi(numext::real(m.coeff(p,p)), m.coeff(p,q), numext::real(m.coeff(q,q)));\n}\n\n/** Makes \\c *this as a Givens rotation \\c G such that applying \\f$ G^* \\f$ to the left of the vector\n  * \\f$ V = \\left ( \\begin{array}{c} p \\\\ q \\end{array} \\right )\\f$ yields:\n  * \\f$ G^* V = \\left ( \\begin{array}{c} r \\\\ 0 \\end{array} \\right )\\f$.\n  *\n  * The value of \\a z is returned if \\a z is not null (the default is null).\n  * Also note that G is built such that the cosine is always real.\n  *\n  * Example: \\include Jacobi_makeGivens.cpp\n  * Output: \\verbinclude Jacobi_makeGivens.out\n  *\n  * This function implements the continuous Givens rotation generation algorithm\n  * found in Anderson (2000), Discontinuous Plane Rotations and the Symmetric Eigenvalue Problem.\n  * LAPACK Working Note 150, University of Tennessee, UT-CS-00-454, December 4, 2000.\n  *\n  * \\sa MatrixBase::applyOnTheLeft(), MatrixBase::applyOnTheRight()\n  */\ntemplate<typename Scalar>\nvoid JacobiRotation<Scalar>::makeGivens(const Scalar& p, const Scalar& q, Scalar* z)\n{\n  makeGivens(p, q, z, typename internal::conditional<NumTraits<Scalar>::IsComplex, internal::true_type, internal::false_type>::type());\n}\n\n\n// specialization for complexes\ntemplate<typename Scalar>\nvoid JacobiRotation<Scalar>::makeGivens(const Scalar& p, const Scalar& q, Scalar* r, internal::true_type)\n{\n  using std::sqrt;\n  using std::abs;\n  using numext::conj;\n  \n  if(q==Scalar(0))\n  {\n    m_c = numext::real(p)<0 ? Scalar(-1) : Scalar(1);\n    m_s = 0;\n    if(r) *r = m_c * p;\n  }\n  else if(p==Scalar(0))\n  {\n    m_c = 0;\n    m_s = -q/abs(q);\n    if(r) *r = abs(q);\n  }\n  else\n  {\n    RealScalar p1 = numext::norm1(p);\n    RealScalar q1 = numext::norm1(q);\n    if(p1>=q1)\n    {\n      Scalar ps = p / p1;\n      RealScalar p2 = numext::abs2(ps);\n      Scalar qs = q / p1;\n      RealScalar q2 = numext::abs2(qs);\n\n      RealScalar u = sqrt(RealScalar(1) + q2/p2);\n      if(numext::real(p)<RealScalar(0))\n        u = -u;\n\n      m_c = Scalar(1)/u;\n      m_s = -qs*conj(ps)*(m_c/p2);\n      if(r) *r = p * u;\n    }\n    else\n    {\n      Scalar ps = p / q1;\n      RealScalar p2 = numext::abs2(ps);\n      Scalar qs = q / q1;\n      RealScalar q2 = numext::abs2(qs);\n\n      RealScalar u = q1 * sqrt(p2 + q2);\n      if(numext::real(p)<RealScalar(0))\n        u = -u;\n\n      p1 = abs(p);\n      ps = p/p1;\n      m_c = p1/u;\n      m_s = -conj(ps) * (q/u);\n      if(r) *r = ps * u;\n    }\n  }\n}\n\n// specialization for reals\ntemplate<typename Scalar>\nvoid JacobiRotation<Scalar>::makeGivens(const Scalar& p, const Scalar& q, Scalar* r, internal::false_type)\n{\n  using std::sqrt;\n  using std::abs;\n  if(q==Scalar(0))\n  {\n    m_c = p<Scalar(0) ? Scalar(-1) : Scalar(1);\n    m_s = Scalar(0);\n    if(r) *r = abs(p);\n  }\n  else if(p==Scalar(0))\n  {\n    m_c = Scalar(0);\n    m_s = q<Scalar(0) ? Scalar(1) : Scalar(-1);\n    if(r) *r = abs(q);\n  }\n  else if(abs(p) > abs(q))\n  {\n    Scalar t = q/p;\n    Scalar u = sqrt(Scalar(1) + numext::abs2(t));\n    if(p<Scalar(0))\n      u = -u;\n    m_c = Scalar(1)/u;\n    m_s = -t * m_c;\n    if(r) *r = p * u;\n  }\n  else\n  {\n    Scalar t = p/q;\n    Scalar u = sqrt(Scalar(1) + numext::abs2(t));\n    if(q<Scalar(0))\n      u = -u;\n    m_s = -Scalar(1)/u;\n    m_c = -t * m_s;\n    if(r) *r = q * u;\n  }\n\n}\n\n/****************************************************************************************\n*   Implementation of MatrixBase methods\n****************************************************************************************/\n\n/** \\jacobi_module\n  * Applies the clock wise 2D rotation \\a j to the set of 2D vectors of cordinates \\a x and \\a y:\n  * \\f$ \\left ( \\begin{array}{cc} x \\\\ y \\end{array} \\right )  =  J \\left ( \\begin{array}{cc} x \\\\ y \\end{array} \\right ) \\f$\n  *\n  * \\sa MatrixBase::applyOnTheLeft(), MatrixBase::applyOnTheRight()\n  */\nnamespace internal {\ntemplate<typename VectorX, typename VectorY, typename OtherScalar>\nvoid apply_rotation_in_the_plane(VectorX& _x, VectorY& _y, const JacobiRotation<OtherScalar>& j);\n}\n\n/** \\jacobi_module\n  * Applies the rotation in the plane \\a j to the rows \\a p and \\a q of \\c *this, i.e., it computes B = J * B,\n  * with \\f$ B = \\left ( \\begin{array}{cc} \\text{*this.row}(p) \\\\ \\text{*this.row}(q) \\end{array} \\right ) \\f$.\n  *\n  * \\sa class JacobiRotation, MatrixBase::applyOnTheRight(), internal::apply_rotation_in_the_plane()\n  */\ntemplate<typename Derived>\ntemplate<typename OtherScalar>\ninline void MatrixBase<Derived>::applyOnTheLeft(Index p, Index q, const JacobiRotation<OtherScalar>& j)\n{\n  RowXpr x(this->row(p));\n  RowXpr y(this->row(q));\n  internal::apply_rotation_in_the_plane(x, y, j);\n}\n\n/** \\ingroup Jacobi_Module\n  * Applies the rotation in the plane \\a j to the columns \\a p and \\a q of \\c *this, i.e., it computes B = B * J\n  * with \\f$ B = \\left ( \\begin{array}{cc} \\text{*this.col}(p) & \\text{*this.col}(q) \\end{array} \\right ) \\f$.\n  *\n  * \\sa class JacobiRotation, MatrixBase::applyOnTheLeft(), internal::apply_rotation_in_the_plane()\n  */\ntemplate<typename Derived>\ntemplate<typename OtherScalar>\ninline void MatrixBase<Derived>::applyOnTheRight(Index p, Index q, const JacobiRotation<OtherScalar>& j)\n{\n  ColXpr x(this->col(p));\n  ColXpr y(this->col(q));\n  internal::apply_rotation_in_the_plane(x, y, j.transpose());\n}\n\nnamespace internal {\ntemplate<typename VectorX, typename VectorY, typename OtherScalar>\nvoid /*EIGEN_DONT_INLINE*/ apply_rotation_in_the_plane(VectorX& _x, VectorY& _y, const JacobiRotation<OtherScalar>& j)\n{\n  typedef typename VectorX::Index Index;\n  typedef typename VectorX::Scalar Scalar;\n  enum { PacketSize = packet_traits<Scalar>::size };\n  typedef typename packet_traits<Scalar>::type Packet;\n  eigen_assert(_x.size() == _y.size());\n  Index size = _x.size();\n  Index incrx = _x.innerStride();\n  Index incry = _y.innerStride();\n\n  Scalar* EIGEN_RESTRICT x = &_x.coeffRef(0);\n  Scalar* EIGEN_RESTRICT y = &_y.coeffRef(0);\n  \n  OtherScalar c = j.c();\n  OtherScalar s = j.s();\n  if (c==OtherScalar(1) && s==OtherScalar(0))\n    return;\n\n  /*** dynamic-size vectorized paths ***/\n\n  if(VectorX::SizeAtCompileTime == Dynamic &&\n    (VectorX::Flags & VectorY::Flags & PacketAccessBit) &&\n    ((incrx==1 && incry==1) || PacketSize == 1))\n  {\n    // both vectors are sequentially stored in memory => vectorization\n    enum { Peeling = 2 };\n\n    Index alignedStart = internal::first_aligned(y, size);\n    Index alignedEnd = alignedStart + ((size-alignedStart)/PacketSize)*PacketSize;\n\n    const Packet pc = pset1<Packet>(c);\n    const Packet ps = pset1<Packet>(s);\n    conj_helper<Packet,Packet,NumTraits<Scalar>::IsComplex,false> pcj;\n\n    for(Index i=0; i<alignedStart; ++i)\n    {\n      Scalar xi = x[i];\n      Scalar yi = y[i];\n      x[i] =  c * xi + numext::conj(s) * yi;\n      y[i] = -s * xi + numext::conj(c) * yi;\n    }\n\n    Scalar* EIGEN_RESTRICT px = x + alignedStart;\n    Scalar* EIGEN_RESTRICT py = y + alignedStart;\n\n    if(internal::first_aligned(x, size)==alignedStart)\n    {\n      for(Index i=alignedStart; i<alignedEnd; i+=PacketSize)\n      {\n        Packet xi = pload<Packet>(px);\n        Packet yi = pload<Packet>(py);\n        pstore(px, padd(pmul(pc,xi),pcj.pmul(ps,yi)));\n        pstore(py, psub(pcj.pmul(pc,yi),pmul(ps,xi)));\n        px += PacketSize;\n        py += PacketSize;\n      }\n    }\n    else\n    {\n      Index peelingEnd = alignedStart + ((size-alignedStart)/(Peeling*PacketSize))*(Peeling*PacketSize);\n      for(Index i=alignedStart; i<peelingEnd; i+=Peeling*PacketSize)\n      {\n        Packet xi   = ploadu<Packet>(px);\n        Packet xi1  = ploadu<Packet>(px+PacketSize);\n        Packet yi   = pload <Packet>(py);\n        Packet yi1  = pload <Packet>(py+PacketSize);\n        pstoreu(px, padd(pmul(pc,xi),pcj.pmul(ps,yi)));\n        pstoreu(px+PacketSize, padd(pmul(pc,xi1),pcj.pmul(ps,yi1)));\n        pstore (py, psub(pcj.pmul(pc,yi),pmul(ps,xi)));\n        pstore (py+PacketSize, psub(pcj.pmul(pc,yi1),pmul(ps,xi1)));\n        px += Peeling*PacketSize;\n        py += Peeling*PacketSize;\n      }\n      if(alignedEnd!=peelingEnd)\n      {\n        Packet xi = ploadu<Packet>(x+peelingEnd);\n        Packet yi = pload <Packet>(y+peelingEnd);\n        pstoreu(x+peelingEnd, padd(pmul(pc,xi),pcj.pmul(ps,yi)));\n        pstore (y+peelingEnd, psub(pcj.pmul(pc,yi),pmul(ps,xi)));\n      }\n    }\n\n    for(Index i=alignedEnd; i<size; ++i)\n    {\n      Scalar xi = x[i];\n      Scalar yi = y[i];\n      x[i] =  c * xi + numext::conj(s) * yi;\n      y[i] = -s * xi + numext::conj(c) * yi;\n    }\n  }\n\n  /*** fixed-size vectorized path ***/\n  else if(VectorX::SizeAtCompileTime != Dynamic &&\n          (VectorX::Flags & VectorY::Flags & PacketAccessBit) &&\n          (VectorX::Flags & VectorY::Flags & AlignedBit))\n  {\n    const Packet pc = pset1<Packet>(c);\n    const Packet ps = pset1<Packet>(s);\n    conj_helper<Packet,Packet,NumTraits<Scalar>::IsComplex,false> pcj;\n    Scalar* EIGEN_RESTRICT px = x;\n    Scalar* EIGEN_RESTRICT py = y;\n    for(Index i=0; i<size; i+=PacketSize)\n    {\n      Packet xi = pload<Packet>(px);\n      Packet yi = pload<Packet>(py);\n      pstore(px, padd(pmul(pc,xi),pcj.pmul(ps,yi)));\n      pstore(py, psub(pcj.pmul(pc,yi),pmul(ps,xi)));\n      px += PacketSize;\n      py += PacketSize;\n    }\n  }\n\n  /*** non-vectorized path ***/\n  else\n  {\n    for(Index i=0; i<size; ++i)\n    {\n      Scalar xi = *x;\n      Scalar yi = *y;\n      *x =  c * xi + numext::conj(s) * yi;\n      *y = -s * xi + numext::conj(c) * yi;\n      x += incrx;\n      y += incry;\n    }\n  }\n}\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_JACOBI_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/LU/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_LU_SRCS \"*.h\")\n\nINSTALL(FILES \n  ${Eigen_LU_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/LU COMPONENT Devel\n  )\n\nADD_SUBDIRECTORY(arch)\n"
  },
  {
    "path": "libs/eigen/Eigen/src/LU/Determinant.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_DETERMINANT_H\n#define EIGEN_DETERMINANT_H\n\nnamespace Eigen { \n\nnamespace internal {\n\ntemplate<typename Derived>\ninline const typename Derived::Scalar bruteforce_det3_helper\n(const MatrixBase<Derived>& matrix, int a, int b, int c)\n{\n  return matrix.coeff(0,a)\n         * (matrix.coeff(1,b) * matrix.coeff(2,c) - matrix.coeff(1,c) * matrix.coeff(2,b));\n}\n\ntemplate<typename Derived>\nconst typename Derived::Scalar bruteforce_det4_helper\n(const MatrixBase<Derived>& matrix, int j, int k, int m, int n)\n{\n  return (matrix.coeff(j,0) * matrix.coeff(k,1) - matrix.coeff(k,0) * matrix.coeff(j,1))\n       * (matrix.coeff(m,2) * matrix.coeff(n,3) - matrix.coeff(n,2) * matrix.coeff(m,3));\n}\n\ntemplate<typename Derived,\n         int DeterminantType = Derived::RowsAtCompileTime\n> struct determinant_impl\n{\n  static inline typename traits<Derived>::Scalar run(const Derived& m)\n  {\n    if(Derived::ColsAtCompileTime==Dynamic && m.rows()==0)\n      return typename traits<Derived>::Scalar(1);\n    return m.partialPivLu().determinant();\n  }\n};\n\ntemplate<typename Derived> struct determinant_impl<Derived, 1>\n{\n  static inline typename traits<Derived>::Scalar run(const Derived& m)\n  {\n    return m.coeff(0,0);\n  }\n};\n\ntemplate<typename Derived> struct determinant_impl<Derived, 2>\n{\n  static inline typename traits<Derived>::Scalar run(const Derived& m)\n  {\n    return m.coeff(0,0) * m.coeff(1,1) - m.coeff(1,0) * m.coeff(0,1);\n  }\n};\n\ntemplate<typename Derived> struct determinant_impl<Derived, 3>\n{\n  static inline typename traits<Derived>::Scalar run(const Derived& m)\n  {\n    return bruteforce_det3_helper(m,0,1,2)\n          - bruteforce_det3_helper(m,1,0,2)\n          + bruteforce_det3_helper(m,2,0,1);\n  }\n};\n\ntemplate<typename Derived> struct determinant_impl<Derived, 4>\n{\n  static typename traits<Derived>::Scalar run(const Derived& m)\n  {\n    // trick by Martin Costabel to compute 4x4 det with only 30 muls\n    return bruteforce_det4_helper(m,0,1,2,3)\n          - bruteforce_det4_helper(m,0,2,1,3)\n          + bruteforce_det4_helper(m,0,3,1,2)\n          + bruteforce_det4_helper(m,1,2,0,3)\n          - bruteforce_det4_helper(m,1,3,0,2)\n          + bruteforce_det4_helper(m,2,3,0,1);\n  }\n};\n\n} // end namespace internal\n\n/** \\lu_module\n  *\n  * \\returns the determinant of this matrix\n  */\ntemplate<typename Derived>\ninline typename internal::traits<Derived>::Scalar MatrixBase<Derived>::determinant() const\n{\n  eigen_assert(rows() == cols());\n  typedef typename internal::nested<Derived,Base::RowsAtCompileTime>::type Nested;\n  return internal::determinant_impl<typename internal::remove_all<Nested>::type>::run(derived());\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_DETERMINANT_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/LU/FullPivLU.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2006-2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_LU_H\n#define EIGEN_LU_H\n\nnamespace Eigen { \n\n/** \\ingroup LU_Module\n  *\n  * \\class FullPivLU\n  *\n  * \\brief LU decomposition of a matrix with complete pivoting, and related features\n  *\n  * \\param MatrixType the type of the matrix of which we are computing the LU decomposition\n  *\n  * This class represents a LU decomposition of any matrix, with complete pivoting: the matrix A is\n  * decomposed as \\f$ A = P^{-1} L U Q^{-1} \\f$ where L is unit-lower-triangular, U is\n  * upper-triangular, and P and Q are permutation matrices. This is a rank-revealing LU\n  * decomposition. The eigenvalues (diagonal coefficients) of U are sorted in such a way that any\n  * zeros are at the end.\n  *\n  * This decomposition provides the generic approach to solving systems of linear equations, computing\n  * the rank, invertibility, inverse, kernel, and determinant.\n  *\n  * This LU decomposition is very stable and well tested with large matrices. However there are use cases where the SVD\n  * decomposition is inherently more stable and/or flexible. For example, when computing the kernel of a matrix,\n  * working with the SVD allows to select the smallest singular values of the matrix, something that\n  * the LU decomposition doesn't see.\n  *\n  * The data of the LU decomposition can be directly accessed through the methods matrixLU(),\n  * permutationP(), permutationQ().\n  *\n  * As an exemple, here is how the original matrix can be retrieved:\n  * \\include class_FullPivLU.cpp\n  * Output: \\verbinclude class_FullPivLU.out\n  *\n  * \\sa MatrixBase::fullPivLu(), MatrixBase::determinant(), MatrixBase::inverse()\n  */\ntemplate<typename _MatrixType> class FullPivLU\n{\n  public:\n    typedef _MatrixType MatrixType;\n    enum {\n      RowsAtCompileTime = MatrixType::RowsAtCompileTime,\n      ColsAtCompileTime = MatrixType::ColsAtCompileTime,\n      Options = MatrixType::Options,\n      MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,\n      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime\n    };\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename NumTraits<typename MatrixType::Scalar>::Real RealScalar;\n    typedef typename internal::traits<MatrixType>::StorageKind StorageKind;\n    typedef typename MatrixType::Index Index;\n    typedef typename internal::plain_row_type<MatrixType, Index>::type IntRowVectorType;\n    typedef typename internal::plain_col_type<MatrixType, Index>::type IntColVectorType;\n    typedef PermutationMatrix<ColsAtCompileTime, MaxColsAtCompileTime> PermutationQType;\n    typedef PermutationMatrix<RowsAtCompileTime, MaxRowsAtCompileTime> PermutationPType;\n\n    /**\n      * \\brief Default Constructor.\n      *\n      * The default constructor is useful in cases in which the user intends to\n      * perform decompositions via LU::compute(const MatrixType&).\n      */\n    FullPivLU();\n\n    /** \\brief Default Constructor with memory preallocation\n      *\n      * Like the default constructor but with preallocation of the internal data\n      * according to the specified problem \\a size.\n      * \\sa FullPivLU()\n      */\n    FullPivLU(Index rows, Index cols);\n\n    /** Constructor.\n      *\n      * \\param matrix the matrix of which to compute the LU decomposition.\n      *               It is required to be nonzero.\n      */\n    FullPivLU(const MatrixType& matrix);\n\n    /** Computes the LU decomposition of the given matrix.\n      *\n      * \\param matrix the matrix of which to compute the LU decomposition.\n      *               It is required to be nonzero.\n      *\n      * \\returns a reference to *this\n      */\n    FullPivLU& compute(const MatrixType& matrix);\n\n    /** \\returns the LU decomposition matrix: the upper-triangular part is U, the\n      * unit-lower-triangular part is L (at least for square matrices; in the non-square\n      * case, special care is needed, see the documentation of class FullPivLU).\n      *\n      * \\sa matrixL(), matrixU()\n      */\n    inline const MatrixType& matrixLU() const\n    {\n      eigen_assert(m_isInitialized && \"LU is not initialized.\");\n      return m_lu;\n    }\n\n    /** \\returns the number of nonzero pivots in the LU decomposition.\n      * Here nonzero is meant in the exact sense, not in a fuzzy sense.\n      * So that notion isn't really intrinsically interesting, but it is\n      * still useful when implementing algorithms.\n      *\n      * \\sa rank()\n      */\n    inline Index nonzeroPivots() const\n    {\n      eigen_assert(m_isInitialized && \"LU is not initialized.\");\n      return m_nonzero_pivots;\n    }\n\n    /** \\returns the absolute value of the biggest pivot, i.e. the biggest\n      *          diagonal coefficient of U.\n      */\n    RealScalar maxPivot() const { return m_maxpivot; }\n\n    /** \\returns the permutation matrix P\n      *\n      * \\sa permutationQ()\n      */\n    inline const PermutationPType& permutationP() const\n    {\n      eigen_assert(m_isInitialized && \"LU is not initialized.\");\n      return m_p;\n    }\n\n    /** \\returns the permutation matrix Q\n      *\n      * \\sa permutationP()\n      */\n    inline const PermutationQType& permutationQ() const\n    {\n      eigen_assert(m_isInitialized && \"LU is not initialized.\");\n      return m_q;\n    }\n\n    /** \\returns the kernel of the matrix, also called its null-space. The columns of the returned matrix\n      * will form a basis of the kernel.\n      *\n      * \\note If the kernel has dimension zero, then the returned matrix is a column-vector filled with zeros.\n      *\n      * \\note This method has to determine which pivots should be considered nonzero.\n      *       For that, it uses the threshold value that you can control by calling\n      *       setThreshold(const RealScalar&).\n      *\n      * Example: \\include FullPivLU_kernel.cpp\n      * Output: \\verbinclude FullPivLU_kernel.out\n      *\n      * \\sa image()\n      */\n    inline const internal::kernel_retval<FullPivLU> kernel() const\n    {\n      eigen_assert(m_isInitialized && \"LU is not initialized.\");\n      return internal::kernel_retval<FullPivLU>(*this);\n    }\n\n    /** \\returns the image of the matrix, also called its column-space. The columns of the returned matrix\n      * will form a basis of the kernel.\n      *\n      * \\param originalMatrix the original matrix, of which *this is the LU decomposition.\n      *                       The reason why it is needed to pass it here, is that this allows\n      *                       a large optimization, as otherwise this method would need to reconstruct it\n      *                       from the LU decomposition.\n      *\n      * \\note If the image has dimension zero, then the returned matrix is a column-vector filled with zeros.\n      *\n      * \\note This method has to determine which pivots should be considered nonzero.\n      *       For that, it uses the threshold value that you can control by calling\n      *       setThreshold(const RealScalar&).\n      *\n      * Example: \\include FullPivLU_image.cpp\n      * Output: \\verbinclude FullPivLU_image.out\n      *\n      * \\sa kernel()\n      */\n    inline const internal::image_retval<FullPivLU>\n      image(const MatrixType& originalMatrix) const\n    {\n      eigen_assert(m_isInitialized && \"LU is not initialized.\");\n      return internal::image_retval<FullPivLU>(*this, originalMatrix);\n    }\n\n    /** \\return a solution x to the equation Ax=b, where A is the matrix of which\n      * *this is the LU decomposition.\n      *\n      * \\param b the right-hand-side of the equation to solve. Can be a vector or a matrix,\n      *          the only requirement in order for the equation to make sense is that\n      *          b.rows()==A.rows(), where A is the matrix of which *this is the LU decomposition.\n      *\n      * \\returns a solution.\n      *\n      * \\note_about_checking_solutions\n      *\n      * \\note_about_arbitrary_choice_of_solution\n      * \\note_about_using_kernel_to_study_multiple_solutions\n      *\n      * Example: \\include FullPivLU_solve.cpp\n      * Output: \\verbinclude FullPivLU_solve.out\n      *\n      * \\sa TriangularView::solve(), kernel(), inverse()\n      */\n    template<typename Rhs>\n    inline const internal::solve_retval<FullPivLU, Rhs>\n    solve(const MatrixBase<Rhs>& b) const\n    {\n      eigen_assert(m_isInitialized && \"LU is not initialized.\");\n      return internal::solve_retval<FullPivLU, Rhs>(*this, b.derived());\n    }\n\n    /** \\returns the determinant of the matrix of which\n      * *this is the LU decomposition. It has only linear complexity\n      * (that is, O(n) where n is the dimension of the square matrix)\n      * as the LU decomposition has already been computed.\n      *\n      * \\note This is only for square matrices.\n      *\n      * \\note For fixed-size matrices of size up to 4, MatrixBase::determinant() offers\n      *       optimized paths.\n      *\n      * \\warning a determinant can be very big or small, so for matrices\n      * of large enough dimension, there is a risk of overflow/underflow.\n      *\n      * \\sa MatrixBase::determinant()\n      */\n    typename internal::traits<MatrixType>::Scalar determinant() const;\n\n    /** Allows to prescribe a threshold to be used by certain methods, such as rank(),\n      * who need to determine when pivots are to be considered nonzero. This is not used for the\n      * LU decomposition itself.\n      *\n      * When it needs to get the threshold value, Eigen calls threshold(). By default, this\n      * uses a formula to automatically determine a reasonable threshold.\n      * Once you have called the present method setThreshold(const RealScalar&),\n      * your value is used instead.\n      *\n      * \\param threshold The new value to use as the threshold.\n      *\n      * A pivot will be considered nonzero if its absolute value is strictly greater than\n      *  \\f$ \\vert pivot \\vert \\leqslant threshold \\times \\vert maxpivot \\vert \\f$\n      * where maxpivot is the biggest pivot.\n      *\n      * If you want to come back to the default behavior, call setThreshold(Default_t)\n      */\n    FullPivLU& setThreshold(const RealScalar& threshold)\n    {\n      m_usePrescribedThreshold = true;\n      m_prescribedThreshold = threshold;\n      return *this;\n    }\n\n    /** Allows to come back to the default behavior, letting Eigen use its default formula for\n      * determining the threshold.\n      *\n      * You should pass the special object Eigen::Default as parameter here.\n      * \\code lu.setThreshold(Eigen::Default); \\endcode\n      *\n      * See the documentation of setThreshold(const RealScalar&).\n      */\n    FullPivLU& setThreshold(Default_t)\n    {\n      m_usePrescribedThreshold = false;\n      return *this;\n    }\n\n    /** Returns the threshold that will be used by certain methods such as rank().\n      *\n      * See the documentation of setThreshold(const RealScalar&).\n      */\n    RealScalar threshold() const\n    {\n      eigen_assert(m_isInitialized || m_usePrescribedThreshold);\n      return m_usePrescribedThreshold ? m_prescribedThreshold\n      // this formula comes from experimenting (see \"LU precision tuning\" thread on the list)\n      // and turns out to be identical to Higham's formula used already in LDLt.\n                                      : NumTraits<Scalar>::epsilon() * m_lu.diagonalSize();\n    }\n\n    /** \\returns the rank of the matrix of which *this is the LU decomposition.\n      *\n      * \\note This method has to determine which pivots should be considered nonzero.\n      *       For that, it uses the threshold value that you can control by calling\n      *       setThreshold(const RealScalar&).\n      */\n    inline Index rank() const\n    {\n      using std::abs;\n      eigen_assert(m_isInitialized && \"LU is not initialized.\");\n      RealScalar premultiplied_threshold = abs(m_maxpivot) * threshold();\n      Index result = 0;\n      for(Index i = 0; i < m_nonzero_pivots; ++i)\n        result += (abs(m_lu.coeff(i,i)) > premultiplied_threshold);\n      return result;\n    }\n\n    /** \\returns the dimension of the kernel of the matrix of which *this is the LU decomposition.\n      *\n      * \\note This method has to determine which pivots should be considered nonzero.\n      *       For that, it uses the threshold value that you can control by calling\n      *       setThreshold(const RealScalar&).\n      */\n    inline Index dimensionOfKernel() const\n    {\n      eigen_assert(m_isInitialized && \"LU is not initialized.\");\n      return cols() - rank();\n    }\n\n    /** \\returns true if the matrix of which *this is the LU decomposition represents an injective\n      *          linear map, i.e. has trivial kernel; false otherwise.\n      *\n      * \\note This method has to determine which pivots should be considered nonzero.\n      *       For that, it uses the threshold value that you can control by calling\n      *       setThreshold(const RealScalar&).\n      */\n    inline bool isInjective() const\n    {\n      eigen_assert(m_isInitialized && \"LU is not initialized.\");\n      return rank() == cols();\n    }\n\n    /** \\returns true if the matrix of which *this is the LU decomposition represents a surjective\n      *          linear map; false otherwise.\n      *\n      * \\note This method has to determine which pivots should be considered nonzero.\n      *       For that, it uses the threshold value that you can control by calling\n      *       setThreshold(const RealScalar&).\n      */\n    inline bool isSurjective() const\n    {\n      eigen_assert(m_isInitialized && \"LU is not initialized.\");\n      return rank() == rows();\n    }\n\n    /** \\returns true if the matrix of which *this is the LU decomposition is invertible.\n      *\n      * \\note This method has to determine which pivots should be considered nonzero.\n      *       For that, it uses the threshold value that you can control by calling\n      *       setThreshold(const RealScalar&).\n      */\n    inline bool isInvertible() const\n    {\n      eigen_assert(m_isInitialized && \"LU is not initialized.\");\n      return isInjective() && (m_lu.rows() == m_lu.cols());\n    }\n\n    /** \\returns the inverse of the matrix of which *this is the LU decomposition.\n      *\n      * \\note If this matrix is not invertible, the returned matrix has undefined coefficients.\n      *       Use isInvertible() to first determine whether this matrix is invertible.\n      *\n      * \\sa MatrixBase::inverse()\n      */\n    inline const internal::solve_retval<FullPivLU,typename MatrixType::IdentityReturnType> inverse() const\n    {\n      eigen_assert(m_isInitialized && \"LU is not initialized.\");\n      eigen_assert(m_lu.rows() == m_lu.cols() && \"You can't take the inverse of a non-square matrix!\");\n      return internal::solve_retval<FullPivLU,typename MatrixType::IdentityReturnType>\n               (*this, MatrixType::Identity(m_lu.rows(), m_lu.cols()));\n    }\n\n    MatrixType reconstructedMatrix() const;\n\n    inline Index rows() const { return m_lu.rows(); }\n    inline Index cols() const { return m_lu.cols(); }\n\n  protected:\n    \n    static void check_template_parameters()\n    {\n      EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar);\n    }\n    \n    MatrixType m_lu;\n    PermutationPType m_p;\n    PermutationQType m_q;\n    IntColVectorType m_rowsTranspositions;\n    IntRowVectorType m_colsTranspositions;\n    Index m_det_pq, m_nonzero_pivots;\n    RealScalar m_maxpivot, m_prescribedThreshold;\n    bool m_isInitialized, m_usePrescribedThreshold;\n};\n\ntemplate<typename MatrixType>\nFullPivLU<MatrixType>::FullPivLU()\n  : m_isInitialized(false), m_usePrescribedThreshold(false)\n{\n}\n\ntemplate<typename MatrixType>\nFullPivLU<MatrixType>::FullPivLU(Index rows, Index cols)\n  : m_lu(rows, cols),\n    m_p(rows),\n    m_q(cols),\n    m_rowsTranspositions(rows),\n    m_colsTranspositions(cols),\n    m_isInitialized(false),\n    m_usePrescribedThreshold(false)\n{\n}\n\ntemplate<typename MatrixType>\nFullPivLU<MatrixType>::FullPivLU(const MatrixType& matrix)\n  : m_lu(matrix.rows(), matrix.cols()),\n    m_p(matrix.rows()),\n    m_q(matrix.cols()),\n    m_rowsTranspositions(matrix.rows()),\n    m_colsTranspositions(matrix.cols()),\n    m_isInitialized(false),\n    m_usePrescribedThreshold(false)\n{\n  compute(matrix);\n}\n\ntemplate<typename MatrixType>\nFullPivLU<MatrixType>& FullPivLU<MatrixType>::compute(const MatrixType& matrix)\n{\n  check_template_parameters();\n  \n  // the permutations are stored as int indices, so just to be sure:\n  eigen_assert(matrix.rows()<=NumTraits<int>::highest() && matrix.cols()<=NumTraits<int>::highest());\n  \n  m_isInitialized = true;\n  m_lu = matrix;\n\n  const Index size = matrix.diagonalSize();\n  const Index rows = matrix.rows();\n  const Index cols = matrix.cols();\n\n  // will store the transpositions, before we accumulate them at the end.\n  // can't accumulate on-the-fly because that will be done in reverse order for the rows.\n  m_rowsTranspositions.resize(matrix.rows());\n  m_colsTranspositions.resize(matrix.cols());\n  Index number_of_transpositions = 0; // number of NONTRIVIAL transpositions, i.e. m_rowsTranspositions[i]!=i\n\n  m_nonzero_pivots = size; // the generic case is that in which all pivots are nonzero (invertible case)\n  m_maxpivot = RealScalar(0);\n\n  for(Index k = 0; k < size; ++k)\n  {\n    // First, we need to find the pivot.\n\n    // biggest coefficient in the remaining bottom-right corner (starting at row k, col k)\n    Index row_of_biggest_in_corner, col_of_biggest_in_corner;\n    RealScalar biggest_in_corner;\n    biggest_in_corner = m_lu.bottomRightCorner(rows-k, cols-k)\n                        .cwiseAbs()\n                        .maxCoeff(&row_of_biggest_in_corner, &col_of_biggest_in_corner);\n    row_of_biggest_in_corner += k; // correct the values! since they were computed in the corner,\n    col_of_biggest_in_corner += k; // need to add k to them.\n\n    if(biggest_in_corner==RealScalar(0))\n    {\n      // before exiting, make sure to initialize the still uninitialized transpositions\n      // in a sane state without destroying what we already have.\n      m_nonzero_pivots = k;\n      for(Index i = k; i < size; ++i)\n      {\n        m_rowsTranspositions.coeffRef(i) = i;\n        m_colsTranspositions.coeffRef(i) = i;\n      }\n      break;\n    }\n\n    if(biggest_in_corner > m_maxpivot) m_maxpivot = biggest_in_corner;\n\n    // Now that we've found the pivot, we need to apply the row/col swaps to\n    // bring it to the location (k,k).\n\n    m_rowsTranspositions.coeffRef(k) = row_of_biggest_in_corner;\n    m_colsTranspositions.coeffRef(k) = col_of_biggest_in_corner;\n    if(k != row_of_biggest_in_corner) {\n      m_lu.row(k).swap(m_lu.row(row_of_biggest_in_corner));\n      ++number_of_transpositions;\n    }\n    if(k != col_of_biggest_in_corner) {\n      m_lu.col(k).swap(m_lu.col(col_of_biggest_in_corner));\n      ++number_of_transpositions;\n    }\n\n    // Now that the pivot is at the right location, we update the remaining\n    // bottom-right corner by Gaussian elimination.\n\n    if(k<rows-1)\n      m_lu.col(k).tail(rows-k-1) /= m_lu.coeff(k,k);\n    if(k<size-1)\n      m_lu.block(k+1,k+1,rows-k-1,cols-k-1).noalias() -= m_lu.col(k).tail(rows-k-1) * m_lu.row(k).tail(cols-k-1);\n  }\n\n  // the main loop is over, we still have to accumulate the transpositions to find the\n  // permutations P and Q\n\n  m_p.setIdentity(rows);\n  for(Index k = size-1; k >= 0; --k)\n    m_p.applyTranspositionOnTheRight(k, m_rowsTranspositions.coeff(k));\n\n  m_q.setIdentity(cols);\n  for(Index k = 0; k < size; ++k)\n    m_q.applyTranspositionOnTheRight(k, m_colsTranspositions.coeff(k));\n\n  m_det_pq = (number_of_transpositions%2) ? -1 : 1;\n  return *this;\n}\n\ntemplate<typename MatrixType>\ntypename internal::traits<MatrixType>::Scalar FullPivLU<MatrixType>::determinant() const\n{\n  eigen_assert(m_isInitialized && \"LU is not initialized.\");\n  eigen_assert(m_lu.rows() == m_lu.cols() && \"You can't take the determinant of a non-square matrix!\");\n  return Scalar(m_det_pq) * Scalar(m_lu.diagonal().prod());\n}\n\n/** \\returns the matrix represented by the decomposition,\n * i.e., it returns the product: \\f$ P^{-1} L U Q^{-1} \\f$.\n * This function is provided for debug purposes. */\ntemplate<typename MatrixType>\nMatrixType FullPivLU<MatrixType>::reconstructedMatrix() const\n{\n  eigen_assert(m_isInitialized && \"LU is not initialized.\");\n  const Index smalldim = (std::min)(m_lu.rows(), m_lu.cols());\n  // LU\n  MatrixType res(m_lu.rows(),m_lu.cols());\n  // FIXME the .toDenseMatrix() should not be needed...\n  res = m_lu.leftCols(smalldim)\n            .template triangularView<UnitLower>().toDenseMatrix()\n      * m_lu.topRows(smalldim)\n            .template triangularView<Upper>().toDenseMatrix();\n\n  // P^{-1}(LU)\n  res = m_p.inverse() * res;\n\n  // (P^{-1}LU)Q^{-1}\n  res = res * m_q.inverse();\n\n  return res;\n}\n\n/********* Implementation of kernel() **************************************************/\n\nnamespace internal {\ntemplate<typename _MatrixType>\nstruct kernel_retval<FullPivLU<_MatrixType> >\n  : kernel_retval_base<FullPivLU<_MatrixType> >\n{\n  EIGEN_MAKE_KERNEL_HELPERS(FullPivLU<_MatrixType>)\n\n  enum { MaxSmallDimAtCompileTime = EIGEN_SIZE_MIN_PREFER_FIXED(\n            MatrixType::MaxColsAtCompileTime,\n            MatrixType::MaxRowsAtCompileTime)\n  };\n\n  template<typename Dest> void evalTo(Dest& dst) const\n  {\n    using std::abs;\n    const Index cols = dec().matrixLU().cols(), dimker = cols - rank();\n    if(dimker == 0)\n    {\n      // The Kernel is just {0}, so it doesn't have a basis properly speaking, but let's\n      // avoid crashing/asserting as that depends on floating point calculations. Let's\n      // just return a single column vector filled with zeros.\n      dst.setZero();\n      return;\n    }\n\n    /* Let us use the following lemma:\n      *\n      * Lemma: If the matrix A has the LU decomposition PAQ = LU,\n      * then Ker A = Q(Ker U).\n      *\n      * Proof: trivial: just keep in mind that P, Q, L are invertible.\n      */\n\n    /* Thus, all we need to do is to compute Ker U, and then apply Q.\n      *\n      * U is upper triangular, with eigenvalues sorted so that any zeros appear at the end.\n      * Thus, the diagonal of U ends with exactly\n      * dimKer zero's. Let us use that to construct dimKer linearly\n      * independent vectors in Ker U.\n      */\n\n    Matrix<Index, Dynamic, 1, 0, MaxSmallDimAtCompileTime, 1> pivots(rank());\n    RealScalar premultiplied_threshold = dec().maxPivot() * dec().threshold();\n    Index p = 0;\n    for(Index i = 0; i < dec().nonzeroPivots(); ++i)\n      if(abs(dec().matrixLU().coeff(i,i)) > premultiplied_threshold)\n        pivots.coeffRef(p++) = i;\n    eigen_internal_assert(p == rank());\n\n    // we construct a temporaty trapezoid matrix m, by taking the U matrix and\n    // permuting the rows and cols to bring the nonnegligible pivots to the top of\n    // the main diagonal. We need that to be able to apply our triangular solvers.\n    // FIXME when we get triangularView-for-rectangular-matrices, this can be simplified\n    Matrix<typename MatrixType::Scalar, Dynamic, Dynamic, MatrixType::Options,\n           MaxSmallDimAtCompileTime, MatrixType::MaxColsAtCompileTime>\n      m(dec().matrixLU().block(0, 0, rank(), cols));\n    for(Index i = 0; i < rank(); ++i)\n    {\n      if(i) m.row(i).head(i).setZero();\n      m.row(i).tail(cols-i) = dec().matrixLU().row(pivots.coeff(i)).tail(cols-i);\n    }\n    m.block(0, 0, rank(), rank());\n    m.block(0, 0, rank(), rank()).template triangularView<StrictlyLower>().setZero();\n    for(Index i = 0; i < rank(); ++i)\n      m.col(i).swap(m.col(pivots.coeff(i)));\n\n    // ok, we have our trapezoid matrix, we can apply the triangular solver.\n    // notice that the math behind this suggests that we should apply this to the\n    // negative of the RHS, but for performance we just put the negative sign elsewhere, see below.\n    m.topLeftCorner(rank(), rank())\n     .template triangularView<Upper>().solveInPlace(\n        m.topRightCorner(rank(), dimker)\n      );\n\n    // now we must undo the column permutation that we had applied!\n    for(Index i = rank()-1; i >= 0; --i)\n      m.col(i).swap(m.col(pivots.coeff(i)));\n\n    // see the negative sign in the next line, that's what we were talking about above.\n    for(Index i = 0; i < rank(); ++i) dst.row(dec().permutationQ().indices().coeff(i)) = -m.row(i).tail(dimker);\n    for(Index i = rank(); i < cols; ++i) dst.row(dec().permutationQ().indices().coeff(i)).setZero();\n    for(Index k = 0; k < dimker; ++k) dst.coeffRef(dec().permutationQ().indices().coeff(rank()+k), k) = Scalar(1);\n  }\n};\n\n/***** Implementation of image() *****************************************************/\n\ntemplate<typename _MatrixType>\nstruct image_retval<FullPivLU<_MatrixType> >\n  : image_retval_base<FullPivLU<_MatrixType> >\n{\n  EIGEN_MAKE_IMAGE_HELPERS(FullPivLU<_MatrixType>)\n\n  enum { MaxSmallDimAtCompileTime = EIGEN_SIZE_MIN_PREFER_FIXED(\n            MatrixType::MaxColsAtCompileTime,\n            MatrixType::MaxRowsAtCompileTime)\n  };\n\n  template<typename Dest> void evalTo(Dest& dst) const\n  {\n    using std::abs;\n    if(rank() == 0)\n    {\n      // The Image is just {0}, so it doesn't have a basis properly speaking, but let's\n      // avoid crashing/asserting as that depends on floating point calculations. Let's\n      // just return a single column vector filled with zeros.\n      dst.setZero();\n      return;\n    }\n\n    Matrix<Index, Dynamic, 1, 0, MaxSmallDimAtCompileTime, 1> pivots(rank());\n    RealScalar premultiplied_threshold = dec().maxPivot() * dec().threshold();\n    Index p = 0;\n    for(Index i = 0; i < dec().nonzeroPivots(); ++i)\n      if(abs(dec().matrixLU().coeff(i,i)) > premultiplied_threshold)\n        pivots.coeffRef(p++) = i;\n    eigen_internal_assert(p == rank());\n\n    for(Index i = 0; i < rank(); ++i)\n      dst.col(i) = originalMatrix().col(dec().permutationQ().indices().coeff(pivots.coeff(i)));\n  }\n};\n\n/***** Implementation of solve() *****************************************************/\n\ntemplate<typename _MatrixType, typename Rhs>\nstruct solve_retval<FullPivLU<_MatrixType>, Rhs>\n  : solve_retval_base<FullPivLU<_MatrixType>, Rhs>\n{\n  EIGEN_MAKE_SOLVE_HELPERS(FullPivLU<_MatrixType>,Rhs)\n\n  template<typename Dest> void evalTo(Dest& dst) const\n  {\n    /* The decomposition PAQ = LU can be rewritten as A = P^{-1} L U Q^{-1}.\n     * So we proceed as follows:\n     * Step 1: compute c = P * rhs.\n     * Step 2: replace c by the solution x to Lx = c. Exists because L is invertible.\n     * Step 3: replace c by the solution x to Ux = c. May or may not exist.\n     * Step 4: result = Q * c;\n     */\n\n    const Index rows = dec().rows(), cols = dec().cols(),\n              nonzero_pivots = dec().rank();\n    eigen_assert(rhs().rows() == rows);\n    const Index smalldim = (std::min)(rows, cols);\n\n    if(nonzero_pivots == 0)\n    {\n      dst.setZero();\n      return;\n    }\n\n    typename Rhs::PlainObject c(rhs().rows(), rhs().cols());\n\n    // Step 1\n    c = dec().permutationP() * rhs();\n\n    // Step 2\n    dec().matrixLU()\n        .topLeftCorner(smalldim,smalldim)\n        .template triangularView<UnitLower>()\n        .solveInPlace(c.topRows(smalldim));\n    if(rows>cols)\n    {\n      c.bottomRows(rows-cols)\n        -= dec().matrixLU().bottomRows(rows-cols)\n         * c.topRows(cols);\n    }\n\n    // Step 3\n    dec().matrixLU()\n        .topLeftCorner(nonzero_pivots, nonzero_pivots)\n        .template triangularView<Upper>()\n        .solveInPlace(c.topRows(nonzero_pivots));\n\n    // Step 4\n    for(Index i = 0; i < nonzero_pivots; ++i)\n      dst.row(dec().permutationQ().indices().coeff(i)) = c.row(i);\n    for(Index i = nonzero_pivots; i < dec().matrixLU().cols(); ++i)\n      dst.row(dec().permutationQ().indices().coeff(i)).setZero();\n  }\n};\n\n} // end namespace internal\n\n/******* MatrixBase methods *****************************************************************/\n\n/** \\lu_module\n  *\n  * \\return the full-pivoting LU decomposition of \\c *this.\n  *\n  * \\sa class FullPivLU\n  */\ntemplate<typename Derived>\ninline const FullPivLU<typename MatrixBase<Derived>::PlainObject>\nMatrixBase<Derived>::fullPivLu() const\n{\n  return FullPivLU<PlainObject>(eval());\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_LU_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/LU/Inverse.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2010 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_INVERSE_H\n#define EIGEN_INVERSE_H\n\nnamespace Eigen { \n\nnamespace internal {\n\n/**********************************\n*** General case implementation ***\n**********************************/\n\ntemplate<typename MatrixType, typename ResultType, int Size = MatrixType::RowsAtCompileTime>\nstruct compute_inverse\n{\n  static inline void run(const MatrixType& matrix, ResultType& result)\n  {\n    result = matrix.partialPivLu().inverse();\n  }\n};\n\ntemplate<typename MatrixType, typename ResultType, int Size = MatrixType::RowsAtCompileTime>\nstruct compute_inverse_and_det_with_check { /* nothing! general case not supported. */ };\n\n/****************************\n*** Size 1 implementation ***\n****************************/\n\ntemplate<typename MatrixType, typename ResultType>\nstruct compute_inverse<MatrixType, ResultType, 1>\n{\n  static inline void run(const MatrixType& matrix, ResultType& result)\n  {\n    typedef typename MatrixType::Scalar Scalar;\n    result.coeffRef(0,0) = Scalar(1) / matrix.coeff(0,0);\n  }\n};\n\ntemplate<typename MatrixType, typename ResultType>\nstruct compute_inverse_and_det_with_check<MatrixType, ResultType, 1>\n{\n  static inline void run(\n    const MatrixType& matrix,\n    const typename MatrixType::RealScalar& absDeterminantThreshold,\n    ResultType& result,\n    typename ResultType::Scalar& determinant,\n    bool& invertible\n  )\n  {\n    using std::abs;\n    determinant = matrix.coeff(0,0);\n    invertible = abs(determinant) > absDeterminantThreshold;\n    if(invertible) result.coeffRef(0,0) = typename ResultType::Scalar(1) / determinant;\n  }\n};\n\n/****************************\n*** Size 2 implementation ***\n****************************/\n\ntemplate<typename MatrixType, typename ResultType>\ninline void compute_inverse_size2_helper(\n    const MatrixType& matrix, const typename ResultType::Scalar& invdet,\n    ResultType& result)\n{\n  result.coeffRef(0,0) = matrix.coeff(1,1) * invdet;\n  result.coeffRef(1,0) = -matrix.coeff(1,0) * invdet;\n  result.coeffRef(0,1) = -matrix.coeff(0,1) * invdet;\n  result.coeffRef(1,1) = matrix.coeff(0,0) * invdet;\n}\n\ntemplate<typename MatrixType, typename ResultType>\nstruct compute_inverse<MatrixType, ResultType, 2>\n{\n  static inline void run(const MatrixType& matrix, ResultType& result)\n  {\n    typedef typename ResultType::Scalar Scalar;\n    const Scalar invdet = typename MatrixType::Scalar(1) / matrix.determinant();\n    compute_inverse_size2_helper(matrix, invdet, result);\n  }\n};\n\ntemplate<typename MatrixType, typename ResultType>\nstruct compute_inverse_and_det_with_check<MatrixType, ResultType, 2>\n{\n  static inline void run(\n    const MatrixType& matrix,\n    const typename MatrixType::RealScalar& absDeterminantThreshold,\n    ResultType& inverse,\n    typename ResultType::Scalar& determinant,\n    bool& invertible\n  )\n  {\n    using std::abs;\n    typedef typename ResultType::Scalar Scalar;\n    determinant = matrix.determinant();\n    invertible = abs(determinant) > absDeterminantThreshold;\n    if(!invertible) return;\n    const Scalar invdet = Scalar(1) / determinant;\n    compute_inverse_size2_helper(matrix, invdet, inverse);\n  }\n};\n\n/****************************\n*** Size 3 implementation ***\n****************************/\n\ntemplate<typename MatrixType, int i, int j>\ninline typename MatrixType::Scalar cofactor_3x3(const MatrixType& m)\n{\n  enum {\n    i1 = (i+1) % 3,\n    i2 = (i+2) % 3,\n    j1 = (j+1) % 3,\n    j2 = (j+2) % 3\n  };\n  return m.coeff(i1, j1) * m.coeff(i2, j2)\n       - m.coeff(i1, j2) * m.coeff(i2, j1);\n}\n\ntemplate<typename MatrixType, typename ResultType>\ninline void compute_inverse_size3_helper(\n    const MatrixType& matrix,\n    const typename ResultType::Scalar& invdet,\n    const Matrix<typename ResultType::Scalar,3,1>& cofactors_col0,\n    ResultType& result)\n{\n  result.row(0) = cofactors_col0 * invdet;\n  result.coeffRef(1,0) =  cofactor_3x3<MatrixType,0,1>(matrix) * invdet;\n  result.coeffRef(1,1) =  cofactor_3x3<MatrixType,1,1>(matrix) * invdet;\n  result.coeffRef(1,2) =  cofactor_3x3<MatrixType,2,1>(matrix) * invdet;\n  result.coeffRef(2,0) =  cofactor_3x3<MatrixType,0,2>(matrix) * invdet;\n  result.coeffRef(2,1) =  cofactor_3x3<MatrixType,1,2>(matrix) * invdet;\n  result.coeffRef(2,2) =  cofactor_3x3<MatrixType,2,2>(matrix) * invdet;\n}\n\ntemplate<typename MatrixType, typename ResultType>\nstruct compute_inverse<MatrixType, ResultType, 3>\n{\n  static inline void run(const MatrixType& matrix, ResultType& result)\n  {\n    typedef typename ResultType::Scalar Scalar;\n    Matrix<typename MatrixType::Scalar,3,1> cofactors_col0;\n    cofactors_col0.coeffRef(0) =  cofactor_3x3<MatrixType,0,0>(matrix);\n    cofactors_col0.coeffRef(1) =  cofactor_3x3<MatrixType,1,0>(matrix);\n    cofactors_col0.coeffRef(2) =  cofactor_3x3<MatrixType,2,0>(matrix);\n    const Scalar det = (cofactors_col0.cwiseProduct(matrix.col(0))).sum();\n    const Scalar invdet = Scalar(1) / det;\n    compute_inverse_size3_helper(matrix, invdet, cofactors_col0, result);\n  }\n};\n\ntemplate<typename MatrixType, typename ResultType>\nstruct compute_inverse_and_det_with_check<MatrixType, ResultType, 3>\n{\n  static inline void run(\n    const MatrixType& matrix,\n    const typename MatrixType::RealScalar& absDeterminantThreshold,\n    ResultType& inverse,\n    typename ResultType::Scalar& determinant,\n    bool& invertible\n  )\n  {\n    using std::abs;\n    typedef typename ResultType::Scalar Scalar;\n    Matrix<Scalar,3,1> cofactors_col0;\n    cofactors_col0.coeffRef(0) =  cofactor_3x3<MatrixType,0,0>(matrix);\n    cofactors_col0.coeffRef(1) =  cofactor_3x3<MatrixType,1,0>(matrix);\n    cofactors_col0.coeffRef(2) =  cofactor_3x3<MatrixType,2,0>(matrix);\n    determinant = (cofactors_col0.cwiseProduct(matrix.col(0))).sum();\n    invertible = abs(determinant) > absDeterminantThreshold;\n    if(!invertible) return;\n    const Scalar invdet = Scalar(1) / determinant;\n    compute_inverse_size3_helper(matrix, invdet, cofactors_col0, inverse);\n  }\n};\n\n/****************************\n*** Size 4 implementation ***\n****************************/\n\ntemplate<typename Derived>\ninline const typename Derived::Scalar general_det3_helper\n(const MatrixBase<Derived>& matrix, int i1, int i2, int i3, int j1, int j2, int j3)\n{\n  return matrix.coeff(i1,j1)\n         * (matrix.coeff(i2,j2) * matrix.coeff(i3,j3) - matrix.coeff(i2,j3) * matrix.coeff(i3,j2));\n}\n\ntemplate<typename MatrixType, int i, int j>\ninline typename MatrixType::Scalar cofactor_4x4(const MatrixType& matrix)\n{\n  enum {\n    i1 = (i+1) % 4,\n    i2 = (i+2) % 4,\n    i3 = (i+3) % 4,\n    j1 = (j+1) % 4,\n    j2 = (j+2) % 4,\n    j3 = (j+3) % 4\n  };\n  return general_det3_helper(matrix, i1, i2, i3, j1, j2, j3)\n       + general_det3_helper(matrix, i2, i3, i1, j1, j2, j3)\n       + general_det3_helper(matrix, i3, i1, i2, j1, j2, j3);\n}\n\ntemplate<int Arch, typename Scalar, typename MatrixType, typename ResultType>\nstruct compute_inverse_size4\n{\n  static void run(const MatrixType& matrix, ResultType& result)\n  {\n    result.coeffRef(0,0) =  cofactor_4x4<MatrixType,0,0>(matrix);\n    result.coeffRef(1,0) = -cofactor_4x4<MatrixType,0,1>(matrix);\n    result.coeffRef(2,0) =  cofactor_4x4<MatrixType,0,2>(matrix);\n    result.coeffRef(3,0) = -cofactor_4x4<MatrixType,0,3>(matrix);\n    result.coeffRef(0,2) =  cofactor_4x4<MatrixType,2,0>(matrix);\n    result.coeffRef(1,2) = -cofactor_4x4<MatrixType,2,1>(matrix);\n    result.coeffRef(2,2) =  cofactor_4x4<MatrixType,2,2>(matrix);\n    result.coeffRef(3,2) = -cofactor_4x4<MatrixType,2,3>(matrix);\n    result.coeffRef(0,1) = -cofactor_4x4<MatrixType,1,0>(matrix);\n    result.coeffRef(1,1) =  cofactor_4x4<MatrixType,1,1>(matrix);\n    result.coeffRef(2,1) = -cofactor_4x4<MatrixType,1,2>(matrix);\n    result.coeffRef(3,1) =  cofactor_4x4<MatrixType,1,3>(matrix);\n    result.coeffRef(0,3) = -cofactor_4x4<MatrixType,3,0>(matrix);\n    result.coeffRef(1,3) =  cofactor_4x4<MatrixType,3,1>(matrix);\n    result.coeffRef(2,3) = -cofactor_4x4<MatrixType,3,2>(matrix);\n    result.coeffRef(3,3) =  cofactor_4x4<MatrixType,3,3>(matrix);\n    result /= (matrix.col(0).cwiseProduct(result.row(0).transpose())).sum();\n  }\n};\n\ntemplate<typename MatrixType, typename ResultType>\nstruct compute_inverse<MatrixType, ResultType, 4>\n : compute_inverse_size4<Architecture::Target, typename MatrixType::Scalar,\n                            MatrixType, ResultType>\n{\n};\n\ntemplate<typename MatrixType, typename ResultType>\nstruct compute_inverse_and_det_with_check<MatrixType, ResultType, 4>\n{\n  static inline void run(\n    const MatrixType& matrix,\n    const typename MatrixType::RealScalar& absDeterminantThreshold,\n    ResultType& inverse,\n    typename ResultType::Scalar& determinant,\n    bool& invertible\n  )\n  {\n    using std::abs;\n    determinant = matrix.determinant();\n    invertible = abs(determinant) > absDeterminantThreshold;\n    if(invertible) compute_inverse<MatrixType, ResultType>::run(matrix, inverse);\n  }\n};\n\n/*************************\n*** MatrixBase methods ***\n*************************/\n\ntemplate<typename MatrixType>\nstruct traits<inverse_impl<MatrixType> >\n{\n  typedef typename MatrixType::PlainObject ReturnType;\n};\n\ntemplate<typename MatrixType>\nstruct inverse_impl : public ReturnByValue<inverse_impl<MatrixType> >\n{\n  typedef typename MatrixType::Index Index;\n  typedef typename internal::eval<MatrixType>::type MatrixTypeNested;\n  typedef typename remove_all<MatrixTypeNested>::type MatrixTypeNestedCleaned;\n  MatrixTypeNested m_matrix;\n\n  inverse_impl(const MatrixType& matrix)\n    : m_matrix(matrix)\n  {}\n\n  inline Index rows() const { return m_matrix.rows(); }\n  inline Index cols() const { return m_matrix.cols(); }\n\n  template<typename Dest> inline void evalTo(Dest& dst) const\n  {\n    const int Size = EIGEN_PLAIN_ENUM_MIN(MatrixType::ColsAtCompileTime,Dest::ColsAtCompileTime);\n    EIGEN_ONLY_USED_FOR_DEBUG(Size);\n    eigen_assert(( (Size<=1) || (Size>4) || (extract_data(m_matrix)!=0 && extract_data(m_matrix)!=extract_data(dst)))\n              && \"Aliasing problem detected in inverse(), you need to do inverse().eval() here.\");\n\n    compute_inverse<MatrixTypeNestedCleaned, Dest>::run(m_matrix, dst);\n  }\n};\n\n} // end namespace internal\n\n/** \\lu_module\n  *\n  * \\returns the matrix inverse of this matrix.\n  *\n  * For small fixed sizes up to 4x4, this method uses cofactors.\n  * In the general case, this method uses class PartialPivLU.\n  *\n  * \\note This matrix must be invertible, otherwise the result is undefined. If you need an\n  * invertibility check, do the following:\n  * \\li for fixed sizes up to 4x4, use computeInverseAndDetWithCheck().\n  * \\li for the general case, use class FullPivLU.\n  *\n  * Example: \\include MatrixBase_inverse.cpp\n  * Output: \\verbinclude MatrixBase_inverse.out\n  *\n  * \\sa computeInverseAndDetWithCheck()\n  */\ntemplate<typename Derived>\ninline const internal::inverse_impl<Derived> MatrixBase<Derived>::inverse() const\n{\n  EIGEN_STATIC_ASSERT(!NumTraits<Scalar>::IsInteger,THIS_FUNCTION_IS_NOT_FOR_INTEGER_NUMERIC_TYPES)\n  eigen_assert(rows() == cols());\n  return internal::inverse_impl<Derived>(derived());\n}\n\n/** \\lu_module\n  *\n  * Computation of matrix inverse and determinant, with invertibility check.\n  *\n  * This is only for fixed-size square matrices of size up to 4x4.\n  *\n  * \\param inverse Reference to the matrix in which to store the inverse.\n  * \\param determinant Reference to the variable in which to store the determinant.\n  * \\param invertible Reference to the bool variable in which to store whether the matrix is invertible.\n  * \\param absDeterminantThreshold Optional parameter controlling the invertibility check.\n  *                                The matrix will be declared invertible if the absolute value of its\n  *                                determinant is greater than this threshold.\n  *\n  * Example: \\include MatrixBase_computeInverseAndDetWithCheck.cpp\n  * Output: \\verbinclude MatrixBase_computeInverseAndDetWithCheck.out\n  *\n  * \\sa inverse(), computeInverseWithCheck()\n  */\ntemplate<typename Derived>\ntemplate<typename ResultType>\ninline void MatrixBase<Derived>::computeInverseAndDetWithCheck(\n    ResultType& inverse,\n    typename ResultType::Scalar& determinant,\n    bool& invertible,\n    const RealScalar& absDeterminantThreshold\n  ) const\n{\n  // i'd love to put some static assertions there, but SFINAE means that they have no effect...\n  eigen_assert(rows() == cols());\n  // for 2x2, it's worth giving a chance to avoid evaluating.\n  // for larger sizes, evaluating has negligible cost and limits code size.\n  typedef typename internal::conditional<\n    RowsAtCompileTime == 2,\n    typename internal::remove_all<typename internal::nested<Derived, 2>::type>::type,\n    PlainObject\n  >::type MatrixType;\n  internal::compute_inverse_and_det_with_check<MatrixType, ResultType>::run\n    (derived(), absDeterminantThreshold, inverse, determinant, invertible);\n}\n\n/** \\lu_module\n  *\n  * Computation of matrix inverse, with invertibility check.\n  *\n  * This is only for fixed-size square matrices of size up to 4x4.\n  *\n  * \\param inverse Reference to the matrix in which to store the inverse.\n  * \\param invertible Reference to the bool variable in which to store whether the matrix is invertible.\n  * \\param absDeterminantThreshold Optional parameter controlling the invertibility check.\n  *                                The matrix will be declared invertible if the absolute value of its\n  *                                determinant is greater than this threshold.\n  *\n  * Example: \\include MatrixBase_computeInverseWithCheck.cpp\n  * Output: \\verbinclude MatrixBase_computeInverseWithCheck.out\n  *\n  * \\sa inverse(), computeInverseAndDetWithCheck()\n  */\ntemplate<typename Derived>\ntemplate<typename ResultType>\ninline void MatrixBase<Derived>::computeInverseWithCheck(\n    ResultType& inverse,\n    bool& invertible,\n    const RealScalar& absDeterminantThreshold\n  ) const\n{\n  RealScalar determinant;\n  // i'd love to put some static assertions there, but SFINAE means that they have no effect...\n  eigen_assert(rows() == cols());\n  computeInverseAndDetWithCheck(inverse,determinant,invertible,absDeterminantThreshold);\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_INVERSE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/LU/PartialPivLU.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2006-2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_PARTIALLU_H\n#define EIGEN_PARTIALLU_H\n\nnamespace Eigen { \n\n/** \\ingroup LU_Module\n  *\n  * \\class PartialPivLU\n  *\n  * \\brief LU decomposition of a matrix with partial pivoting, and related features\n  *\n  * \\param MatrixType the type of the matrix of which we are computing the LU decomposition\n  *\n  * This class represents a LU decomposition of a \\b square \\b invertible matrix, with partial pivoting: the matrix A\n  * is decomposed as A = PLU where L is unit-lower-triangular, U is upper-triangular, and P\n  * is a permutation matrix.\n  *\n  * Typically, partial pivoting LU decomposition is only considered numerically stable for square invertible\n  * matrices. Thus LAPACK's dgesv and dgesvx require the matrix to be square and invertible. The present class\n  * does the same. It will assert that the matrix is square, but it won't (actually it can't) check that the\n  * matrix is invertible: it is your task to check that you only use this decomposition on invertible matrices.\n  *\n  * The guaranteed safe alternative, working for all matrices, is the full pivoting LU decomposition, provided\n  * by class FullPivLU.\n  *\n  * This is \\b not a rank-revealing LU decomposition. Many features are intentionally absent from this class,\n  * such as rank computation. If you need these features, use class FullPivLU.\n  *\n  * This LU decomposition is suitable to invert invertible matrices. It is what MatrixBase::inverse() uses\n  * in the general case.\n  * On the other hand, it is \\b not suitable to determine whether a given matrix is invertible.\n  *\n  * The data of the LU decomposition can be directly accessed through the methods matrixLU(), permutationP().\n  *\n  * \\sa MatrixBase::partialPivLu(), MatrixBase::determinant(), MatrixBase::inverse(), MatrixBase::computeInverse(), class FullPivLU\n  */\ntemplate<typename _MatrixType> class PartialPivLU\n{\n  public:\n\n    typedef _MatrixType MatrixType;\n    enum {\n      RowsAtCompileTime = MatrixType::RowsAtCompileTime,\n      ColsAtCompileTime = MatrixType::ColsAtCompileTime,\n      Options = MatrixType::Options,\n      MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,\n      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime\n    };\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename NumTraits<typename MatrixType::Scalar>::Real RealScalar;\n    typedef typename internal::traits<MatrixType>::StorageKind StorageKind;\n    typedef typename MatrixType::Index Index;\n    typedef PermutationMatrix<RowsAtCompileTime, MaxRowsAtCompileTime> PermutationType;\n    typedef Transpositions<RowsAtCompileTime, MaxRowsAtCompileTime> TranspositionType;\n\n\n    /**\n    * \\brief Default Constructor.\n    *\n    * The default constructor is useful in cases in which the user intends to\n    * perform decompositions via PartialPivLU::compute(const MatrixType&).\n    */\n    PartialPivLU();\n\n    /** \\brief Default Constructor with memory preallocation\n      *\n      * Like the default constructor but with preallocation of the internal data\n      * according to the specified problem \\a size.\n      * \\sa PartialPivLU()\n      */\n    PartialPivLU(Index size);\n\n    /** Constructor.\n      *\n      * \\param matrix the matrix of which to compute the LU decomposition.\n      *\n      * \\warning The matrix should have full rank (e.g. if it's square, it should be invertible).\n      * If you need to deal with non-full rank, use class FullPivLU instead.\n      */\n    PartialPivLU(const MatrixType& matrix);\n\n    PartialPivLU& compute(const MatrixType& matrix);\n\n    /** \\returns the LU decomposition matrix: the upper-triangular part is U, the\n      * unit-lower-triangular part is L (at least for square matrices; in the non-square\n      * case, special care is needed, see the documentation of class FullPivLU).\n      *\n      * \\sa matrixL(), matrixU()\n      */\n    inline const MatrixType& matrixLU() const\n    {\n      eigen_assert(m_isInitialized && \"PartialPivLU is not initialized.\");\n      return m_lu;\n    }\n\n    /** \\returns the permutation matrix P.\n      */\n    inline const PermutationType& permutationP() const\n    {\n      eigen_assert(m_isInitialized && \"PartialPivLU is not initialized.\");\n      return m_p;\n    }\n\n    /** This method returns the solution x to the equation Ax=b, where A is the matrix of which\n      * *this is the LU decomposition.\n      *\n      * \\param b the right-hand-side of the equation to solve. Can be a vector or a matrix,\n      *          the only requirement in order for the equation to make sense is that\n      *          b.rows()==A.rows(), where A is the matrix of which *this is the LU decomposition.\n      *\n      * \\returns the solution.\n      *\n      * Example: \\include PartialPivLU_solve.cpp\n      * Output: \\verbinclude PartialPivLU_solve.out\n      *\n      * Since this PartialPivLU class assumes anyway that the matrix A is invertible, the solution\n      * theoretically exists and is unique regardless of b.\n      *\n      * \\sa TriangularView::solve(), inverse(), computeInverse()\n      */\n    template<typename Rhs>\n    inline const internal::solve_retval<PartialPivLU, Rhs>\n    solve(const MatrixBase<Rhs>& b) const\n    {\n      eigen_assert(m_isInitialized && \"PartialPivLU is not initialized.\");\n      return internal::solve_retval<PartialPivLU, Rhs>(*this, b.derived());\n    }\n\n    /** \\returns the inverse of the matrix of which *this is the LU decomposition.\n      *\n      * \\warning The matrix being decomposed here is assumed to be invertible. If you need to check for\n      *          invertibility, use class FullPivLU instead.\n      *\n      * \\sa MatrixBase::inverse(), LU::inverse()\n      */\n    inline const internal::solve_retval<PartialPivLU,typename MatrixType::IdentityReturnType> inverse() const\n    {\n      eigen_assert(m_isInitialized && \"PartialPivLU is not initialized.\");\n      return internal::solve_retval<PartialPivLU,typename MatrixType::IdentityReturnType>\n               (*this, MatrixType::Identity(m_lu.rows(), m_lu.cols()));\n    }\n\n    /** \\returns the determinant of the matrix of which\n      * *this is the LU decomposition. It has only linear complexity\n      * (that is, O(n) where n is the dimension of the square matrix)\n      * as the LU decomposition has already been computed.\n      *\n      * \\note For fixed-size matrices of size up to 4, MatrixBase::determinant() offers\n      *       optimized paths.\n      *\n      * \\warning a determinant can be very big or small, so for matrices\n      * of large enough dimension, there is a risk of overflow/underflow.\n      *\n      * \\sa MatrixBase::determinant()\n      */\n    typename internal::traits<MatrixType>::Scalar determinant() const;\n\n    MatrixType reconstructedMatrix() const;\n\n    inline Index rows() const { return m_lu.rows(); }\n    inline Index cols() const { return m_lu.cols(); }\n\n  protected:\n    \n    static void check_template_parameters()\n    {\n      EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar);\n    }\n    \n    MatrixType m_lu;\n    PermutationType m_p;\n    TranspositionType m_rowsTranspositions;\n    Index m_det_p;\n    bool m_isInitialized;\n};\n\ntemplate<typename MatrixType>\nPartialPivLU<MatrixType>::PartialPivLU()\n  : m_lu(),\n    m_p(),\n    m_rowsTranspositions(),\n    m_det_p(0),\n    m_isInitialized(false)\n{\n}\n\ntemplate<typename MatrixType>\nPartialPivLU<MatrixType>::PartialPivLU(Index size)\n  : m_lu(size, size),\n    m_p(size),\n    m_rowsTranspositions(size),\n    m_det_p(0),\n    m_isInitialized(false)\n{\n}\n\ntemplate<typename MatrixType>\nPartialPivLU<MatrixType>::PartialPivLU(const MatrixType& matrix)\n  : m_lu(matrix.rows(), matrix.rows()),\n    m_p(matrix.rows()),\n    m_rowsTranspositions(matrix.rows()),\n    m_det_p(0),\n    m_isInitialized(false)\n{\n  compute(matrix);\n}\n\nnamespace internal {\n\n/** \\internal This is the blocked version of fullpivlu_unblocked() */\ntemplate<typename Scalar, int StorageOrder, typename PivIndex>\nstruct partial_lu_impl\n{\n  // FIXME add a stride to Map, so that the following mapping becomes easier,\n  // another option would be to create an expression being able to automatically\n  // warp any Map, Matrix, and Block expressions as a unique type, but since that's exactly\n  // a Map + stride, why not adding a stride to Map, and convenient ctors from a Matrix,\n  // and Block.\n  typedef Map<Matrix<Scalar, Dynamic, Dynamic, StorageOrder> > MapLU;\n  typedef Block<MapLU, Dynamic, Dynamic> MatrixType;\n  typedef Block<MatrixType,Dynamic,Dynamic> BlockType;\n  typedef typename MatrixType::RealScalar RealScalar;\n  typedef typename MatrixType::Index Index;\n\n  /** \\internal performs the LU decomposition in-place of the matrix \\a lu\n    * using an unblocked algorithm.\n    *\n    * In addition, this function returns the row transpositions in the\n    * vector \\a row_transpositions which must have a size equal to the number\n    * of columns of the matrix \\a lu, and an integer \\a nb_transpositions\n    * which returns the actual number of transpositions.\n    *\n    * \\returns The index of the first pivot which is exactly zero if any, or a negative number otherwise.\n    */\n  static Index unblocked_lu(MatrixType& lu, PivIndex* row_transpositions, PivIndex& nb_transpositions)\n  {\n    const Index rows = lu.rows();\n    const Index cols = lu.cols();\n    const Index size = (std::min)(rows,cols);\n    nb_transpositions = 0;\n    Index first_zero_pivot = -1;\n    for(Index k = 0; k < size; ++k)\n    {\n      Index rrows = rows-k-1;\n      Index rcols = cols-k-1;\n        \n      Index row_of_biggest_in_col;\n      RealScalar biggest_in_corner\n        = lu.col(k).tail(rows-k).cwiseAbs().maxCoeff(&row_of_biggest_in_col);\n      row_of_biggest_in_col += k;\n\n      row_transpositions[k] = PivIndex(row_of_biggest_in_col);\n\n      if(biggest_in_corner != RealScalar(0))\n      {\n        if(k != row_of_biggest_in_col)\n        {\n          lu.row(k).swap(lu.row(row_of_biggest_in_col));\n          ++nb_transpositions;\n        }\n\n        // FIXME shall we introduce a safe quotient expression in cas 1/lu.coeff(k,k)\n        // overflow but not the actual quotient?\n        lu.col(k).tail(rrows) /= lu.coeff(k,k);\n      }\n      else if(first_zero_pivot==-1)\n      {\n        // the pivot is exactly zero, we record the index of the first pivot which is exactly 0,\n        // and continue the factorization such we still have A = PLU\n        first_zero_pivot = k;\n      }\n\n      if(k<rows-1)\n        lu.bottomRightCorner(rrows,rcols).noalias() -= lu.col(k).tail(rrows) * lu.row(k).tail(rcols);\n    }\n    return first_zero_pivot;\n  }\n\n  /** \\internal performs the LU decomposition in-place of the matrix represented\n    * by the variables \\a rows, \\a cols, \\a lu_data, and \\a lu_stride using a\n    * recursive, blocked algorithm.\n    *\n    * In addition, this function returns the row transpositions in the\n    * vector \\a row_transpositions which must have a size equal to the number\n    * of columns of the matrix \\a lu, and an integer \\a nb_transpositions\n    * which returns the actual number of transpositions.\n    *\n    * \\returns The index of the first pivot which is exactly zero if any, or a negative number otherwise.\n    *\n    * \\note This very low level interface using pointers, etc. is to:\n    *   1 - reduce the number of instanciations to the strict minimum\n    *   2 - avoid infinite recursion of the instanciations with Block<Block<Block<...> > >\n    */\n  static Index blocked_lu(Index rows, Index cols, Scalar* lu_data, Index luStride, PivIndex* row_transpositions, PivIndex& nb_transpositions, Index maxBlockSize=256)\n  {\n    MapLU lu1(lu_data,StorageOrder==RowMajor?rows:luStride,StorageOrder==RowMajor?luStride:cols);\n    MatrixType lu(lu1,0,0,rows,cols);\n\n    const Index size = (std::min)(rows,cols);\n\n    // if the matrix is too small, no blocking:\n    if(size<=16)\n    {\n      return unblocked_lu(lu, row_transpositions, nb_transpositions);\n    }\n\n    // automatically adjust the number of subdivisions to the size\n    // of the matrix so that there is enough sub blocks:\n    Index blockSize;\n    {\n      blockSize = size/8;\n      blockSize = (blockSize/16)*16;\n      blockSize = (std::min)((std::max)(blockSize,Index(8)), maxBlockSize);\n    }\n\n    nb_transpositions = 0;\n    Index first_zero_pivot = -1;\n    for(Index k = 0; k < size; k+=blockSize)\n    {\n      Index bs = (std::min)(size-k,blockSize); // actual size of the block\n      Index trows = rows - k - bs; // trailing rows\n      Index tsize = size - k - bs; // trailing size\n\n      // partition the matrix:\n      //                          A00 | A01 | A02\n      // lu  = A_0 | A_1 | A_2 =  A10 | A11 | A12\n      //                          A20 | A21 | A22\n      BlockType A_0(lu,0,0,rows,k);\n      BlockType A_2(lu,0,k+bs,rows,tsize);\n      BlockType A11(lu,k,k,bs,bs);\n      BlockType A12(lu,k,k+bs,bs,tsize);\n      BlockType A21(lu,k+bs,k,trows,bs);\n      BlockType A22(lu,k+bs,k+bs,trows,tsize);\n\n      PivIndex nb_transpositions_in_panel;\n      // recursively call the blocked LU algorithm on [A11^T A21^T]^T\n      // with a very small blocking size:\n      Index ret = blocked_lu(trows+bs, bs, &lu.coeffRef(k,k), luStride,\n                   row_transpositions+k, nb_transpositions_in_panel, 16);\n      if(ret>=0 && first_zero_pivot==-1)\n        first_zero_pivot = k+ret;\n\n      nb_transpositions += nb_transpositions_in_panel;\n      // update permutations and apply them to A_0\n      for(Index i=k; i<k+bs; ++i)\n      {\n        Index piv = (row_transpositions[i] += k);\n        A_0.row(i).swap(A_0.row(piv));\n      }\n\n      if(trows)\n      {\n        // apply permutations to A_2\n        for(Index i=k;i<k+bs; ++i)\n          A_2.row(i).swap(A_2.row(row_transpositions[i]));\n\n        // A12 = A11^-1 A12\n        A11.template triangularView<UnitLower>().solveInPlace(A12);\n\n        A22.noalias() -= A21 * A12;\n      }\n    }\n    return first_zero_pivot;\n  }\n};\n\n/** \\internal performs the LU decomposition with partial pivoting in-place.\n  */\ntemplate<typename MatrixType, typename TranspositionType>\nvoid partial_lu_inplace(MatrixType& lu, TranspositionType& row_transpositions, typename TranspositionType::Index& nb_transpositions)\n{\n  eigen_assert(lu.cols() == row_transpositions.size());\n  eigen_assert((&row_transpositions.coeffRef(1)-&row_transpositions.coeffRef(0)) == 1);\n\n  partial_lu_impl\n    <typename MatrixType::Scalar, MatrixType::Flags&RowMajorBit?RowMajor:ColMajor, typename TranspositionType::Index>\n    ::blocked_lu(lu.rows(), lu.cols(), &lu.coeffRef(0,0), lu.outerStride(), &row_transpositions.coeffRef(0), nb_transpositions);\n}\n\n} // end namespace internal\n\ntemplate<typename MatrixType>\nPartialPivLU<MatrixType>& PartialPivLU<MatrixType>::compute(const MatrixType& matrix)\n{\n  check_template_parameters();\n  \n  // the row permutation is stored as int indices, so just to be sure:\n  eigen_assert(matrix.rows()<NumTraits<int>::highest());\n  \n  m_lu = matrix;\n\n  eigen_assert(matrix.rows() == matrix.cols() && \"PartialPivLU is only for square (and moreover invertible) matrices\");\n  const Index size = matrix.rows();\n\n  m_rowsTranspositions.resize(size);\n\n  typename TranspositionType::Index nb_transpositions;\n  internal::partial_lu_inplace(m_lu, m_rowsTranspositions, nb_transpositions);\n  m_det_p = (nb_transpositions%2) ? -1 : 1;\n\n  m_p = m_rowsTranspositions;\n\n  m_isInitialized = true;\n  return *this;\n}\n\ntemplate<typename MatrixType>\ntypename internal::traits<MatrixType>::Scalar PartialPivLU<MatrixType>::determinant() const\n{\n  eigen_assert(m_isInitialized && \"PartialPivLU is not initialized.\");\n  return Scalar(m_det_p) * m_lu.diagonal().prod();\n}\n\n/** \\returns the matrix represented by the decomposition,\n * i.e., it returns the product: P^{-1} L U.\n * This function is provided for debug purpose. */\ntemplate<typename MatrixType>\nMatrixType PartialPivLU<MatrixType>::reconstructedMatrix() const\n{\n  eigen_assert(m_isInitialized && \"LU is not initialized.\");\n  // LU\n  MatrixType res = m_lu.template triangularView<UnitLower>().toDenseMatrix()\n                 * m_lu.template triangularView<Upper>();\n\n  // P^{-1}(LU)\n  res = m_p.inverse() * res;\n\n  return res;\n}\n\n/***** Implementation of solve() *****************************************************/\n\nnamespace internal {\n\ntemplate<typename _MatrixType, typename Rhs>\nstruct solve_retval<PartialPivLU<_MatrixType>, Rhs>\n  : solve_retval_base<PartialPivLU<_MatrixType>, Rhs>\n{\n  EIGEN_MAKE_SOLVE_HELPERS(PartialPivLU<_MatrixType>,Rhs)\n\n  template<typename Dest> void evalTo(Dest& dst) const\n  {\n    /* The decomposition PA = LU can be rewritten as A = P^{-1} L U.\n    * So we proceed as follows:\n    * Step 1: compute c = Pb.\n    * Step 2: replace c by the solution x to Lx = c.\n    * Step 3: replace c by the solution x to Ux = c.\n    */\n\n    eigen_assert(rhs().rows() == dec().matrixLU().rows());\n\n    // Step 1\n    dst = dec().permutationP() * rhs();\n\n    // Step 2\n    dec().matrixLU().template triangularView<UnitLower>().solveInPlace(dst);\n\n    // Step 3\n    dec().matrixLU().template triangularView<Upper>().solveInPlace(dst);\n  }\n};\n\n} // end namespace internal\n\n/******** MatrixBase methods *******/\n\n/** \\lu_module\n  *\n  * \\return the partial-pivoting LU decomposition of \\c *this.\n  *\n  * \\sa class PartialPivLU\n  */\ntemplate<typename Derived>\ninline const PartialPivLU<typename MatrixBase<Derived>::PlainObject>\nMatrixBase<Derived>::partialPivLu() const\n{\n  return PartialPivLU<PlainObject>(eval());\n}\n\n#if EIGEN2_SUPPORT_STAGE > STAGE20_RESOLVE_API_CONFLICTS\n/** \\lu_module\n  *\n  * Synonym of partialPivLu().\n  *\n  * \\return the partial-pivoting LU decomposition of \\c *this.\n  *\n  * \\sa class PartialPivLU\n  */\ntemplate<typename Derived>\ninline const PartialPivLU<typename MatrixBase<Derived>::PlainObject>\nMatrixBase<Derived>::lu() const\n{\n  return PartialPivLU<PlainObject>(eval());\n}\n#endif\n\n} // end namespace Eigen\n\n#endif // EIGEN_PARTIALLU_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/LU/PartialPivLU_MKL.h",
    "content": "/*\n Copyright (c) 2011, Intel Corporation. All rights reserved.\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n * Neither the name of Intel Corporation nor the names of its contributors may\n   be used to endorse or promote products derived from this software without\n   specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\n ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n ********************************************************************************\n *   Content : Eigen bindings to Intel(R) MKL\n *     LU decomposition with partial pivoting based on LAPACKE_?getrf function.\n ********************************************************************************\n*/\n\n#ifndef EIGEN_PARTIALLU_LAPACK_H\n#define EIGEN_PARTIALLU_LAPACK_H\n\n#include \"Eigen/src/Core/util/MKL_support.h\"\n\nnamespace Eigen { \n\nnamespace internal {\n\n/** \\internal Specialization for the data types supported by MKL */\n\n#define EIGEN_MKL_LU_PARTPIV(EIGTYPE, MKLTYPE, MKLPREFIX) \\\ntemplate<int StorageOrder> \\\nstruct partial_lu_impl<EIGTYPE, StorageOrder, lapack_int> \\\n{ \\\n  /* \\internal performs the LU decomposition in-place of the matrix represented */ \\\n  static lapack_int blocked_lu(lapack_int rows, lapack_int cols, EIGTYPE* lu_data, lapack_int luStride, lapack_int* row_transpositions, lapack_int& nb_transpositions, lapack_int maxBlockSize=256) \\\n  { \\\n    EIGEN_UNUSED_VARIABLE(maxBlockSize);\\\n    lapack_int matrix_order, first_zero_pivot; \\\n    lapack_int m, n, lda, *ipiv, info; \\\n    EIGTYPE* a; \\\n/* Set up parameters for ?getrf */ \\\n    matrix_order = StorageOrder==RowMajor ? LAPACK_ROW_MAJOR : LAPACK_COL_MAJOR; \\\n    lda = luStride; \\\n    a = lu_data; \\\n    ipiv = row_transpositions; \\\n    m = rows; \\\n    n = cols; \\\n    nb_transpositions = 0; \\\n\\\n    info = LAPACKE_##MKLPREFIX##getrf( matrix_order, m, n, (MKLTYPE*)a, lda, ipiv ); \\\n\\\n    for(int i=0;i<m;i++) { ipiv[i]--; if (ipiv[i]!=i) nb_transpositions++; } \\\n\\\n    eigen_assert(info >= 0); \\\n/* something should be done with nb_transpositions */ \\\n\\\n    first_zero_pivot = info; \\\n    return first_zero_pivot; \\\n  } \\\n};\n\nEIGEN_MKL_LU_PARTPIV(double, double, d)\nEIGEN_MKL_LU_PARTPIV(float, float, s)\nEIGEN_MKL_LU_PARTPIV(dcomplex, MKL_Complex16, z)\nEIGEN_MKL_LU_PARTPIV(scomplex, MKL_Complex8, c)\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_PARTIALLU_LAPACK_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/LU/arch/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_LU_arch_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_LU_arch_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/LU/arch COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/Eigen/src/LU/arch/Inverse_SSE.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2001 Intel Corporation\n// Copyright (C) 2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n// The SSE code for the 4x4 float and double matrix inverse in this file\n// comes from the following Intel's library:\n// http://software.intel.com/en-us/articles/optimized-matrix-library-for-use-with-the-intel-pentiumr-4-processors-sse2-instructions/\n//\n// Here is the respective copyright and license statement:\n//\n//   Copyright (c) 2001 Intel Corporation.\n//\n// Permition is granted to use, copy, distribute and prepare derivative works\n// of this library for any purpose and without fee, provided, that the above\n// copyright notice and this statement appear in all copies.\n// Intel makes no representations about the suitability of this software for\n// any purpose, and specifically disclaims all warranties.\n// See LEGAL.TXT for all the legal information.\n\n#ifndef EIGEN_INVERSE_SSE_H\n#define EIGEN_INVERSE_SSE_H\n\nnamespace Eigen { \n\nnamespace internal {\n\ntemplate<typename MatrixType, typename ResultType>\nstruct compute_inverse_size4<Architecture::SSE, float, MatrixType, ResultType>\n{\n  enum {\n    MatrixAlignment     = bool(MatrixType::Flags&AlignedBit),\n    ResultAlignment     = bool(ResultType::Flags&AlignedBit),\n    StorageOrdersMatch  = (MatrixType::Flags&RowMajorBit) == (ResultType::Flags&RowMajorBit)\n  };\n  \n  static void run(const MatrixType& matrix, ResultType& result)\n  {\n    EIGEN_ALIGN16 const unsigned int _Sign_PNNP[4] = { 0x00000000, 0x80000000, 0x80000000, 0x00000000 };\n\n    // Load the full matrix into registers\n    __m128 _L1 = matrix.template packet<MatrixAlignment>( 0);\n    __m128 _L2 = matrix.template packet<MatrixAlignment>( 4);\n    __m128 _L3 = matrix.template packet<MatrixAlignment>( 8);\n    __m128 _L4 = matrix.template packet<MatrixAlignment>(12);\n\n    // The inverse is calculated using \"Divide and Conquer\" technique. The\n    // original matrix is divide into four 2x2 sub-matrices. Since each\n    // register holds four matrix element, the smaller matrices are\n    // represented as a registers. Hence we get a better locality of the\n    // calculations.\n\n    __m128 A, B, C, D; // the four sub-matrices\n    if(!StorageOrdersMatch)\n    {\n      A = _mm_unpacklo_ps(_L1, _L2);\n      B = _mm_unpacklo_ps(_L3, _L4);\n      C = _mm_unpackhi_ps(_L1, _L2);\n      D = _mm_unpackhi_ps(_L3, _L4);\n    }\n    else\n    {\n      A = _mm_movelh_ps(_L1, _L2);\n      B = _mm_movehl_ps(_L2, _L1);\n      C = _mm_movelh_ps(_L3, _L4);\n      D = _mm_movehl_ps(_L4, _L3);\n    }\n\n    __m128 iA, iB, iC, iD,                 // partial inverse of the sub-matrices\n            DC, AB;\n    __m128 dA, dB, dC, dD;                 // determinant of the sub-matrices\n    __m128 det, d, d1, d2;\n    __m128 rd;                             // reciprocal of the determinant\n\n    //  AB = A# * B\n    AB = _mm_mul_ps(_mm_shuffle_ps(A,A,0x0F), B);\n    AB = _mm_sub_ps(AB,_mm_mul_ps(_mm_shuffle_ps(A,A,0xA5), _mm_shuffle_ps(B,B,0x4E)));\n    //  DC = D# * C\n    DC = _mm_mul_ps(_mm_shuffle_ps(D,D,0x0F), C);\n    DC = _mm_sub_ps(DC,_mm_mul_ps(_mm_shuffle_ps(D,D,0xA5), _mm_shuffle_ps(C,C,0x4E)));\n\n    //  dA = |A|\n    dA = _mm_mul_ps(_mm_shuffle_ps(A, A, 0x5F),A);\n    dA = _mm_sub_ss(dA, _mm_movehl_ps(dA,dA));\n    //  dB = |B|\n    dB = _mm_mul_ps(_mm_shuffle_ps(B, B, 0x5F),B);\n    dB = _mm_sub_ss(dB, _mm_movehl_ps(dB,dB));\n\n    //  dC = |C|\n    dC = _mm_mul_ps(_mm_shuffle_ps(C, C, 0x5F),C);\n    dC = _mm_sub_ss(dC, _mm_movehl_ps(dC,dC));\n    //  dD = |D|\n    dD = _mm_mul_ps(_mm_shuffle_ps(D, D, 0x5F),D);\n    dD = _mm_sub_ss(dD, _mm_movehl_ps(dD,dD));\n\n    //  d = trace(AB*DC) = trace(A#*B*D#*C)\n    d = _mm_mul_ps(_mm_shuffle_ps(DC,DC,0xD8),AB);\n\n    //  iD = C*A#*B\n    iD = _mm_mul_ps(_mm_shuffle_ps(C,C,0xA0), _mm_movelh_ps(AB,AB));\n    iD = _mm_add_ps(iD,_mm_mul_ps(_mm_shuffle_ps(C,C,0xF5), _mm_movehl_ps(AB,AB)));\n    //  iA = B*D#*C\n    iA = _mm_mul_ps(_mm_shuffle_ps(B,B,0xA0), _mm_movelh_ps(DC,DC));\n    iA = _mm_add_ps(iA,_mm_mul_ps(_mm_shuffle_ps(B,B,0xF5), _mm_movehl_ps(DC,DC)));\n\n    //  d = trace(AB*DC) = trace(A#*B*D#*C) [continue]\n    d  = _mm_add_ps(d, _mm_movehl_ps(d, d));\n    d  = _mm_add_ss(d, _mm_shuffle_ps(d, d, 1));\n    d1 = _mm_mul_ss(dA,dD);\n    d2 = _mm_mul_ss(dB,dC);\n\n    //  iD = D*|A| - C*A#*B\n    iD = _mm_sub_ps(_mm_mul_ps(D,_mm_shuffle_ps(dA,dA,0)), iD);\n\n    //  iA = A*|D| - B*D#*C;\n    iA = _mm_sub_ps(_mm_mul_ps(A,_mm_shuffle_ps(dD,dD,0)), iA);\n\n    //  det = |A|*|D| + |B|*|C| - trace(A#*B*D#*C)\n    det = _mm_sub_ss(_mm_add_ss(d1,d2),d);\n    rd  = _mm_div_ss(_mm_set_ss(1.0f), det);\n\n//     #ifdef ZERO_SINGULAR\n//         rd = _mm_and_ps(_mm_cmpneq_ss(det,_mm_setzero_ps()), rd);\n//     #endif\n\n    //  iB = D * (A#B)# = D*B#*A\n    iB = _mm_mul_ps(D, _mm_shuffle_ps(AB,AB,0x33));\n    iB = _mm_sub_ps(iB, _mm_mul_ps(_mm_shuffle_ps(D,D,0xB1), _mm_shuffle_ps(AB,AB,0x66)));\n    //  iC = A * (D#C)# = A*C#*D\n    iC = _mm_mul_ps(A, _mm_shuffle_ps(DC,DC,0x33));\n    iC = _mm_sub_ps(iC, _mm_mul_ps(_mm_shuffle_ps(A,A,0xB1), _mm_shuffle_ps(DC,DC,0x66)));\n\n    rd = _mm_shuffle_ps(rd,rd,0);\n    rd = _mm_xor_ps(rd, _mm_load_ps((float*)_Sign_PNNP));\n\n    //  iB = C*|B| - D*B#*A\n    iB = _mm_sub_ps(_mm_mul_ps(C,_mm_shuffle_ps(dB,dB,0)), iB);\n\n    //  iC = B*|C| - A*C#*D;\n    iC = _mm_sub_ps(_mm_mul_ps(B,_mm_shuffle_ps(dC,dC,0)), iC);\n\n    //  iX = iX / det\n    iA = _mm_mul_ps(rd,iA);\n    iB = _mm_mul_ps(rd,iB);\n    iC = _mm_mul_ps(rd,iC);\n    iD = _mm_mul_ps(rd,iD);\n\n    result.template writePacket<ResultAlignment>( 0, _mm_shuffle_ps(iA,iB,0x77));\n    result.template writePacket<ResultAlignment>( 4, _mm_shuffle_ps(iA,iB,0x22));\n    result.template writePacket<ResultAlignment>( 8, _mm_shuffle_ps(iC,iD,0x77));\n    result.template writePacket<ResultAlignment>(12, _mm_shuffle_ps(iC,iD,0x22));\n  }\n\n};\n\ntemplate<typename MatrixType, typename ResultType>\nstruct compute_inverse_size4<Architecture::SSE, double, MatrixType, ResultType>\n{\n  enum {\n    MatrixAlignment = bool(MatrixType::Flags&AlignedBit),\n    ResultAlignment = bool(ResultType::Flags&AlignedBit),\n    StorageOrdersMatch  = (MatrixType::Flags&RowMajorBit) == (ResultType::Flags&RowMajorBit)\n  };\n  static void run(const MatrixType& matrix, ResultType& result)\n  {\n    const __m128d _Sign_NP = _mm_castsi128_pd(_mm_set_epi32(0x0,0x0,0x80000000,0x0));\n    const __m128d _Sign_PN = _mm_castsi128_pd(_mm_set_epi32(0x80000000,0x0,0x0,0x0));\n\n    // The inverse is calculated using \"Divide and Conquer\" technique. The\n    // original matrix is divide into four 2x2 sub-matrices. Since each\n    // register of the matrix holds two element, the smaller matrices are\n    // consisted of two registers. Hence we get a better locality of the\n    // calculations.\n\n    // the four sub-matrices\n    __m128d A1, A2, B1, B2, C1, C2, D1, D2;\n    \n    if(StorageOrdersMatch)\n    {\n      A1 = matrix.template packet<MatrixAlignment>( 0); B1 = matrix.template packet<MatrixAlignment>( 2);\n      A2 = matrix.template packet<MatrixAlignment>( 4); B2 = matrix.template packet<MatrixAlignment>( 6);\n      C1 = matrix.template packet<MatrixAlignment>( 8); D1 = matrix.template packet<MatrixAlignment>(10);\n      C2 = matrix.template packet<MatrixAlignment>(12); D2 = matrix.template packet<MatrixAlignment>(14);\n    }\n    else\n    {\n      __m128d tmp;\n      A1 = matrix.template packet<MatrixAlignment>( 0); C1 = matrix.template packet<MatrixAlignment>( 2);\n      A2 = matrix.template packet<MatrixAlignment>( 4); C2 = matrix.template packet<MatrixAlignment>( 6);\n      tmp = A1;\n      A1 = _mm_unpacklo_pd(A1,A2);\n      A2 = _mm_unpackhi_pd(tmp,A2);\n      tmp = C1;\n      C1 = _mm_unpacklo_pd(C1,C2);\n      C2 = _mm_unpackhi_pd(tmp,C2);\n      \n      B1 = matrix.template packet<MatrixAlignment>( 8); D1 = matrix.template packet<MatrixAlignment>(10);\n      B2 = matrix.template packet<MatrixAlignment>(12); D2 = matrix.template packet<MatrixAlignment>(14);\n      tmp = B1;\n      B1 = _mm_unpacklo_pd(B1,B2);\n      B2 = _mm_unpackhi_pd(tmp,B2);\n      tmp = D1;\n      D1 = _mm_unpacklo_pd(D1,D2);\n      D2 = _mm_unpackhi_pd(tmp,D2);\n    }\n    \n    __m128d iA1, iA2, iB1, iB2, iC1, iC2, iD1, iD2,     // partial invese of the sub-matrices\n            DC1, DC2, AB1, AB2;\n    __m128d dA, dB, dC, dD;     // determinant of the sub-matrices\n    __m128d det, d1, d2, rd;\n\n    //  dA = |A|\n    dA = _mm_shuffle_pd(A2, A2, 1);\n    dA = _mm_mul_pd(A1, dA);\n    dA = _mm_sub_sd(dA, _mm_shuffle_pd(dA,dA,3));\n    //  dB = |B|\n    dB = _mm_shuffle_pd(B2, B2, 1);\n    dB = _mm_mul_pd(B1, dB);\n    dB = _mm_sub_sd(dB, _mm_shuffle_pd(dB,dB,3));\n\n    //  AB = A# * B\n    AB1 = _mm_mul_pd(B1, _mm_shuffle_pd(A2,A2,3));\n    AB2 = _mm_mul_pd(B2, _mm_shuffle_pd(A1,A1,0));\n    AB1 = _mm_sub_pd(AB1, _mm_mul_pd(B2, _mm_shuffle_pd(A1,A1,3)));\n    AB2 = _mm_sub_pd(AB2, _mm_mul_pd(B1, _mm_shuffle_pd(A2,A2,0)));\n\n    //  dC = |C|\n    dC = _mm_shuffle_pd(C2, C2, 1);\n    dC = _mm_mul_pd(C1, dC);\n    dC = _mm_sub_sd(dC, _mm_shuffle_pd(dC,dC,3));\n    //  dD = |D|\n    dD = _mm_shuffle_pd(D2, D2, 1);\n    dD = _mm_mul_pd(D1, dD);\n    dD = _mm_sub_sd(dD, _mm_shuffle_pd(dD,dD,3));\n\n    //  DC = D# * C\n    DC1 = _mm_mul_pd(C1, _mm_shuffle_pd(D2,D2,3));\n    DC2 = _mm_mul_pd(C2, _mm_shuffle_pd(D1,D1,0));\n    DC1 = _mm_sub_pd(DC1, _mm_mul_pd(C2, _mm_shuffle_pd(D1,D1,3)));\n    DC2 = _mm_sub_pd(DC2, _mm_mul_pd(C1, _mm_shuffle_pd(D2,D2,0)));\n\n    //  rd = trace(AB*DC) = trace(A#*B*D#*C)\n    d1 = _mm_mul_pd(AB1, _mm_shuffle_pd(DC1, DC2, 0));\n    d2 = _mm_mul_pd(AB2, _mm_shuffle_pd(DC1, DC2, 3));\n    rd = _mm_add_pd(d1, d2);\n    rd = _mm_add_sd(rd, _mm_shuffle_pd(rd, rd,3));\n\n    //  iD = C*A#*B\n    iD1 = _mm_mul_pd(AB1, _mm_shuffle_pd(C1,C1,0));\n    iD2 = _mm_mul_pd(AB1, _mm_shuffle_pd(C2,C2,0));\n    iD1 = _mm_add_pd(iD1, _mm_mul_pd(AB2, _mm_shuffle_pd(C1,C1,3)));\n    iD2 = _mm_add_pd(iD2, _mm_mul_pd(AB2, _mm_shuffle_pd(C2,C2,3)));\n\n    //  iA = B*D#*C\n    iA1 = _mm_mul_pd(DC1, _mm_shuffle_pd(B1,B1,0));\n    iA2 = _mm_mul_pd(DC1, _mm_shuffle_pd(B2,B2,0));\n    iA1 = _mm_add_pd(iA1, _mm_mul_pd(DC2, _mm_shuffle_pd(B1,B1,3)));\n    iA2 = _mm_add_pd(iA2, _mm_mul_pd(DC2, _mm_shuffle_pd(B2,B2,3)));\n\n    //  iD = D*|A| - C*A#*B\n    dA = _mm_shuffle_pd(dA,dA,0);\n    iD1 = _mm_sub_pd(_mm_mul_pd(D1, dA), iD1);\n    iD2 = _mm_sub_pd(_mm_mul_pd(D2, dA), iD2);\n\n    //  iA = A*|D| - B*D#*C;\n    dD = _mm_shuffle_pd(dD,dD,0);\n    iA1 = _mm_sub_pd(_mm_mul_pd(A1, dD), iA1);\n    iA2 = _mm_sub_pd(_mm_mul_pd(A2, dD), iA2);\n\n    d1 = _mm_mul_sd(dA, dD);\n    d2 = _mm_mul_sd(dB, dC);\n\n    //  iB = D * (A#B)# = D*B#*A\n    iB1 = _mm_mul_pd(D1, _mm_shuffle_pd(AB2,AB1,1));\n    iB2 = _mm_mul_pd(D2, _mm_shuffle_pd(AB2,AB1,1));\n    iB1 = _mm_sub_pd(iB1, _mm_mul_pd(_mm_shuffle_pd(D1,D1,1), _mm_shuffle_pd(AB2,AB1,2)));\n    iB2 = _mm_sub_pd(iB2, _mm_mul_pd(_mm_shuffle_pd(D2,D2,1), _mm_shuffle_pd(AB2,AB1,2)));\n\n    //  det = |A|*|D| + |B|*|C| - trace(A#*B*D#*C)\n    det = _mm_add_sd(d1, d2);\n    det = _mm_sub_sd(det, rd);\n\n    //  iC = A * (D#C)# = A*C#*D\n    iC1 = _mm_mul_pd(A1, _mm_shuffle_pd(DC2,DC1,1));\n    iC2 = _mm_mul_pd(A2, _mm_shuffle_pd(DC2,DC1,1));\n    iC1 = _mm_sub_pd(iC1, _mm_mul_pd(_mm_shuffle_pd(A1,A1,1), _mm_shuffle_pd(DC2,DC1,2)));\n    iC2 = _mm_sub_pd(iC2, _mm_mul_pd(_mm_shuffle_pd(A2,A2,1), _mm_shuffle_pd(DC2,DC1,2)));\n\n    rd = _mm_div_sd(_mm_set_sd(1.0), det);\n//     #ifdef ZERO_SINGULAR\n//         rd = _mm_and_pd(_mm_cmpneq_sd(det,_mm_setzero_pd()), rd);\n//     #endif\n    rd = _mm_shuffle_pd(rd,rd,0);\n\n    //  iB = C*|B| - D*B#*A\n    dB = _mm_shuffle_pd(dB,dB,0);\n    iB1 = _mm_sub_pd(_mm_mul_pd(C1, dB), iB1);\n    iB2 = _mm_sub_pd(_mm_mul_pd(C2, dB), iB2);\n\n    d1 = _mm_xor_pd(rd, _Sign_PN);\n    d2 = _mm_xor_pd(rd, _Sign_NP);\n\n    //  iC = B*|C| - A*C#*D;\n    dC = _mm_shuffle_pd(dC,dC,0);\n    iC1 = _mm_sub_pd(_mm_mul_pd(B1, dC), iC1);\n    iC2 = _mm_sub_pd(_mm_mul_pd(B2, dC), iC2);\n\n    result.template writePacket<ResultAlignment>( 0, _mm_mul_pd(_mm_shuffle_pd(iA2, iA1, 3), d1));     // iA# / det\n    result.template writePacket<ResultAlignment>( 4, _mm_mul_pd(_mm_shuffle_pd(iA2, iA1, 0), d2));\n    result.template writePacket<ResultAlignment>( 2, _mm_mul_pd(_mm_shuffle_pd(iB2, iB1, 3), d1));     // iB# / det\n    result.template writePacket<ResultAlignment>( 6, _mm_mul_pd(_mm_shuffle_pd(iB2, iB1, 0), d2));\n    result.template writePacket<ResultAlignment>( 8, _mm_mul_pd(_mm_shuffle_pd(iC2, iC1, 3), d1));     // iC# / det\n    result.template writePacket<ResultAlignment>(12, _mm_mul_pd(_mm_shuffle_pd(iC2, iC1, 0), d2));\n    result.template writePacket<ResultAlignment>(10, _mm_mul_pd(_mm_shuffle_pd(iD2, iD1, 3), d1));     // iD# / det\n    result.template writePacket<ResultAlignment>(14, _mm_mul_pd(_mm_shuffle_pd(iD2, iD1, 0), d2));\n  }\n};\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_INVERSE_SSE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/MetisSupport/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_MetisSupport_SRCS \"*.h\")\n\nINSTALL(FILES \n  ${Eigen_MetisSupport_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/MetisSupport COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/Eigen/src/MetisSupport/MetisSupport.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef METIS_SUPPORT_H\n#define METIS_SUPPORT_H\n\nnamespace Eigen {\n/**\n * Get the fill-reducing ordering from the METIS package\n * \n * If A is the original matrix and Ap is the permuted matrix, \n * the fill-reducing permutation is defined as follows :\n * Row (column) i of A is the matperm(i) row (column) of Ap. \n * WARNING: As computed by METIS, this corresponds to the vector iperm (instead of perm)\n */\ntemplate <typename Index>\nclass MetisOrdering\n{\npublic:\n  typedef PermutationMatrix<Dynamic,Dynamic,Index> PermutationType;\n  typedef Matrix<Index,Dynamic,1> IndexVector; \n  \n  template <typename MatrixType>\n  void get_symmetrized_graph(const MatrixType& A)\n  {\n    Index m = A.cols(); \n    eigen_assert((A.rows() == A.cols()) && \"ONLY FOR SQUARED MATRICES\");\n    // Get the transpose of the input matrix \n    MatrixType At = A.transpose(); \n    // Get the number of nonzeros elements in each row/col of At+A\n    Index TotNz = 0; \n    IndexVector visited(m); \n    visited.setConstant(-1); \n    for (int j = 0; j < m; j++)\n    {\n      // Compute the union structure of of A(j,:) and At(j,:)\n      visited(j) = j; // Do not include the diagonal element\n      // Get the nonzeros in row/column j of A\n      for (typename MatrixType::InnerIterator it(A, j); it; ++it)\n      {\n        Index idx = it.index(); // Get the row index (for column major) or column index (for row major)\n        if (visited(idx) != j ) \n        {\n          visited(idx) = j; \n          ++TotNz; \n        }\n      }\n      //Get the nonzeros in row/column j of At\n      for (typename MatrixType::InnerIterator it(At, j); it; ++it)\n      {\n        Index idx = it.index(); \n        if(visited(idx) != j)\n        {\n          visited(idx) = j; \n          ++TotNz; \n        }\n      }\n    }\n    // Reserve place for A + At\n    m_indexPtr.resize(m+1);\n    m_innerIndices.resize(TotNz); \n\n    // Now compute the real adjacency list of each column/row \n    visited.setConstant(-1); \n    Index CurNz = 0; \n    for (int j = 0; j < m; j++)\n    {\n      m_indexPtr(j) = CurNz; \n      \n      visited(j) = j; // Do not include the diagonal element\n      // Add the pattern of row/column j of A to A+At\n      for (typename MatrixType::InnerIterator it(A,j); it; ++it)\n      {\n        Index idx = it.index(); // Get the row index (for column major) or column index (for row major)\n        if (visited(idx) != j ) \n        {\n          visited(idx) = j; \n          m_innerIndices(CurNz) = idx; \n          CurNz++; \n        }\n      }\n      //Add the pattern of row/column j of At to A+At\n      for (typename MatrixType::InnerIterator it(At, j); it; ++it)\n      {\n        Index idx = it.index(); \n        if(visited(idx) != j)\n        {\n          visited(idx) = j; \n          m_innerIndices(CurNz) = idx; \n          ++CurNz; \n        }\n      }\n    }\n    m_indexPtr(m) = CurNz;    \n  }\n  \n  template <typename MatrixType>\n  void operator() (const MatrixType& A, PermutationType& matperm)\n  {\n     Index m = A.cols();\n     IndexVector perm(m),iperm(m); \n    // First, symmetrize the matrix graph. \n     get_symmetrized_graph(A); \n     int output_error;\n     \n     // Call the fill-reducing routine from METIS \n     output_error = METIS_NodeND(&m, m_indexPtr.data(), m_innerIndices.data(), NULL, NULL, perm.data(), iperm.data());\n     \n    if(output_error != METIS_OK) \n    {\n      //FIXME The ordering interface should define a class of possible errors \n     std::cerr << \"ERROR WHILE CALLING THE METIS PACKAGE \\n\"; \n     return; \n    }\n    \n    // Get the fill-reducing permutation \n    //NOTE:  If Ap is the permuted matrix then perm and iperm vectors are defined as follows \n    // Row (column) i of Ap is the perm(i) row(column) of A, and row (column) i of A is the iperm(i) row(column) of Ap\n    \n     matperm.resize(m);\n     for (int j = 0; j < m; j++)\n       matperm.indices()(iperm(j)) = j;\n   \n  }\n  \n  protected:\n    IndexVector m_indexPtr; // Pointer to the adjacenccy list of each row/column\n    IndexVector m_innerIndices; // Adjacency list \n};\n\n}// end namespace eigen \n#endif\n"
  },
  {
    "path": "libs/eigen/Eigen/src/OrderingMethods/Amd.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n\n/*\n\nNOTE: this routine has been adapted from the CSparse library:\n\nCopyright (c) 2006, Timothy A. Davis.\nhttp://www.suitesparse.com\n\nCSparse is free software; you can redistribute it and/or\nmodify it under the terms of the GNU Lesser General Public\nLicense as published by the Free Software Foundation; either\nversion 2.1 of the License, or (at your option) any later version.\n\nCSparse is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\nLesser General Public License for more details.\n\nYou should have received a copy of the GNU Lesser General Public\nLicense along with this Module; if not, write to the Free Software\nFoundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n\n*/\n\n#include \"../Core/util/NonMPL2.h\"\n\n#ifndef EIGEN_SPARSE_AMD_H\n#define EIGEN_SPARSE_AMD_H\n\nnamespace Eigen { \n\nnamespace internal {\n  \ntemplate<typename T> inline T amd_flip(const T& i) { return -i-2; }\ntemplate<typename T> inline T amd_unflip(const T& i) { return i<0 ? amd_flip(i) : i; }\ntemplate<typename T0, typename T1> inline bool amd_marked(const T0* w, const T1& j) { return w[j]<0; }\ntemplate<typename T0, typename T1> inline void amd_mark(const T0* w, const T1& j) { return w[j] = amd_flip(w[j]); }\n\n/* clear w */\ntemplate<typename Index>\nstatic int cs_wclear (Index mark, Index lemax, Index *w, Index n)\n{\n  Index k;\n  if(mark < 2 || (mark + lemax < 0))\n  {\n    for(k = 0; k < n; k++)\n      if(w[k] != 0)\n        w[k] = 1;\n    mark = 2;\n  }\n  return (mark);     /* at this point, w[0..n-1] < mark holds */\n}\n\n/* depth-first search and postorder of a tree rooted at node j */\ntemplate<typename Index>\nIndex cs_tdfs(Index j, Index k, Index *head, const Index *next, Index *post, Index *stack)\n{\n  int i, p, top = 0;\n  if(!head || !next || !post || !stack) return (-1);    /* check inputs */\n  stack[0] = j;                 /* place j on the stack */\n  while (top >= 0)                /* while (stack is not empty) */\n  {\n    p = stack[top];           /* p = top of stack */\n    i = head[p];              /* i = youngest child of p */\n    if(i == -1)\n    {\n      top--;                 /* p has no unordered children left */\n      post[k++] = p;        /* node p is the kth postordered node */\n    }\n    else\n    {\n      head[p] = next[i];   /* remove i from children of p */\n      stack[++top] = i;     /* start dfs on child node i */\n    }\n  }\n  return k;\n}\n\n\n/** \\internal\n  * \\ingroup OrderingMethods_Module \n  * Approximate minimum degree ordering algorithm.\n  * \\returns the permutation P reducing the fill-in of the input matrix \\a C\n  * The input matrix \\a C must be a selfadjoint compressed column major SparseMatrix object. Both the upper and lower parts have to be stored, but the diagonal entries are optional.\n  * On exit the values of C are destroyed */\ntemplate<typename Scalar, typename Index>\nvoid minimum_degree_ordering(SparseMatrix<Scalar,ColMajor,Index>& C, PermutationMatrix<Dynamic,Dynamic,Index>& perm)\n{\n  using std::sqrt;\n  \n  int d, dk, dext, lemax = 0, e, elenk, eln, i, j, k, k1,\n      k2, k3, jlast, ln, dense, nzmax, mindeg = 0, nvi, nvj, nvk, mark, wnvi,\n      ok, nel = 0, p, p1, p2, p3, p4, pj, pk, pk1, pk2, pn, q, t;\n  unsigned int h;\n  \n  Index n = C.cols();\n  dense = std::max<Index> (16, Index(10 * sqrt(double(n))));   /* find dense threshold */\n  dense = std::min<Index> (n-2, dense);\n  \n  Index cnz = C.nonZeros();\n  perm.resize(n+1);\n  t = cnz + cnz/5 + 2*n;                 /* add elbow room to C */\n  C.resizeNonZeros(t);\n  \n  Index* W       = new Index[8*(n+1)]; /* get workspace */\n  Index* len     = W;\n  Index* nv      = W +   (n+1);\n  Index* next    = W + 2*(n+1);\n  Index* head    = W + 3*(n+1);\n  Index* elen    = W + 4*(n+1);\n  Index* degree  = W + 5*(n+1);\n  Index* w       = W + 6*(n+1);\n  Index* hhead   = W + 7*(n+1);\n  Index* last    = perm.indices().data();                              /* use P as workspace for last */\n  \n  /* --- Initialize quotient graph ---------------------------------------- */\n  Index* Cp = C.outerIndexPtr();\n  Index* Ci = C.innerIndexPtr();\n  for(k = 0; k < n; k++)\n    len[k] = Cp[k+1] - Cp[k];\n  len[n] = 0;\n  nzmax = t;\n  \n  for(i = 0; i <= n; i++)\n  {\n    head[i]   = -1;                     // degree list i is empty\n    last[i]   = -1;\n    next[i]   = -1;\n    hhead[i]  = -1;                     // hash list i is empty \n    nv[i]     = 1;                      // node i is just one node\n    w[i]      = 1;                      // node i is alive\n    elen[i]   = 0;                      // Ek of node i is empty\n    degree[i] = len[i];                 // degree of node i\n  }\n  mark = internal::cs_wclear<Index>(0, 0, w, n);         /* clear w */\n  \n  /* --- Initialize degree lists ------------------------------------------ */\n  for(i = 0; i < n; i++)\n  {\n    bool has_diag = false;\n    for(p = Cp[i]; p<Cp[i+1]; ++p)\n      if(Ci[p]==i)\n      {\n        has_diag = true;\n        break;\n      }\n   \n    d = degree[i];\n    if(d == 1 && has_diag)           /* node i is empty */\n    {\n      elen[i] = -2;                 /* element i is dead */\n      nel++;\n      Cp[i] = -1;                   /* i is a root of assembly tree */\n      w[i] = 0;\n    }\n    else if(d > dense || !has_diag)  /* node i is dense or has no structural diagonal element */\n    {\n      nv[i] = 0;                    /* absorb i into element n */\n      elen[i] = -1;                 /* node i is dead */\n      nel++;\n      Cp[i] = amd_flip (n);\n      nv[n]++;\n    }\n    else\n    {\n      if(head[d] != -1) last[head[d]] = i;\n      next[i] = head[d];           /* put node i in degree list d */\n      head[d] = i;\n    }\n  }\n  \n  elen[n] = -2;                         /* n is a dead element */\n  Cp[n] = -1;                           /* n is a root of assembly tree */\n  w[n] = 0;                             /* n is a dead element */\n  \n  while (nel < n)                         /* while (selecting pivots) do */\n  {\n    /* --- Select node of minimum approximate degree -------------------- */\n    for(k = -1; mindeg < n && (k = head[mindeg]) == -1; mindeg++) {}\n    if(next[k] != -1) last[next[k]] = -1;\n    head[mindeg] = next[k];          /* remove k from degree list */\n    elenk = elen[k];                  /* elenk = |Ek| */\n    nvk = nv[k];                      /* # of nodes k represents */\n    nel += nvk;                        /* nv[k] nodes of A eliminated */\n    \n    /* --- Garbage collection ------------------------------------------- */\n    if(elenk > 0 && cnz + mindeg >= nzmax)\n    {\n      for(j = 0; j < n; j++)\n      {\n        if((p = Cp[j]) >= 0)      /* j is a live node or element */\n        {\n          Cp[j] = Ci[p];          /* save first entry of object */\n          Ci[p] = amd_flip (j);    /* first entry is now amd_flip(j) */\n        }\n      }\n      for(q = 0, p = 0; p < cnz; ) /* scan all of memory */\n      {\n        if((j = amd_flip (Ci[p++])) >= 0)  /* found object j */\n        {\n          Ci[q] = Cp[j];       /* restore first entry of object */\n          Cp[j] = q++;          /* new pointer to object j */\n          for(k3 = 0; k3 < len[j]-1; k3++) Ci[q++] = Ci[p++];\n        }\n      }\n      cnz = q;                       /* Ci[cnz...nzmax-1] now free */\n    }\n    \n    /* --- Construct new element ---------------------------------------- */\n    dk = 0;\n    nv[k] = -nvk;                     /* flag k as in Lk */\n    p = Cp[k];\n    pk1 = (elenk == 0) ? p : cnz;      /* do in place if elen[k] == 0 */\n    pk2 = pk1;\n    for(k1 = 1; k1 <= elenk + 1; k1++)\n    {\n      if(k1 > elenk)\n      {\n        e = k;                     /* search the nodes in k */\n        pj = p;                    /* list of nodes starts at Ci[pj]*/\n        ln = len[k] - elenk;      /* length of list of nodes in k */\n      }\n      else\n      {\n        e = Ci[p++];              /* search the nodes in e */\n        pj = Cp[e];\n        ln = len[e];              /* length of list of nodes in e */\n      }\n      for(k2 = 1; k2 <= ln; k2++)\n      {\n        i = Ci[pj++];\n        if((nvi = nv[i]) <= 0) continue; /* node i dead, or seen */\n        dk += nvi;                 /* degree[Lk] += size of node i */\n        nv[i] = -nvi;             /* negate nv[i] to denote i in Lk*/\n        Ci[pk2++] = i;            /* place i in Lk */\n        if(next[i] != -1) last[next[i]] = last[i];\n        if(last[i] != -1)         /* remove i from degree list */\n        {\n          next[last[i]] = next[i];\n        }\n        else\n        {\n          head[degree[i]] = next[i];\n        }\n      }\n      if(e != k)\n      {\n        Cp[e] = amd_flip (k);      /* absorb e into k */\n        w[e] = 0;                 /* e is now a dead element */\n      }\n    }\n    if(elenk != 0) cnz = pk2;         /* Ci[cnz...nzmax] is free */\n    degree[k] = dk;                   /* external degree of k - |Lk\\i| */\n    Cp[k] = pk1;                      /* element k is in Ci[pk1..pk2-1] */\n    len[k] = pk2 - pk1;\n    elen[k] = -2;                     /* k is now an element */\n    \n    /* --- Find set differences ----------------------------------------- */\n    mark = internal::cs_wclear<Index>(mark, lemax, w, n);  /* clear w if necessary */\n    for(pk = pk1; pk < pk2; pk++)    /* scan 1: find |Le\\Lk| */\n    {\n      i = Ci[pk];\n      if((eln = elen[i]) <= 0) continue;/* skip if elen[i] empty */\n      nvi = -nv[i];                      /* nv[i] was negated */\n      wnvi = mark - nvi;\n      for(p = Cp[i]; p <= Cp[i] + eln - 1; p++)  /* scan Ei */\n      {\n        e = Ci[p];\n        if(w[e] >= mark)\n        {\n          w[e] -= nvi;          /* decrement |Le\\Lk| */\n        }\n        else if(w[e] != 0)        /* ensure e is a live element */\n        {\n          w[e] = degree[e] + wnvi; /* 1st time e seen in scan 1 */\n        }\n      }\n    }\n    \n    /* --- Degree update ------------------------------------------------ */\n    for(pk = pk1; pk < pk2; pk++)    /* scan2: degree update */\n    {\n      i = Ci[pk];                   /* consider node i in Lk */\n      p1 = Cp[i];\n      p2 = p1 + elen[i] - 1;\n      pn = p1;\n      for(h = 0, d = 0, p = p1; p <= p2; p++)    /* scan Ei */\n      {\n        e = Ci[p];\n        if(w[e] != 0)             /* e is an unabsorbed element */\n        {\n          dext = w[e] - mark;   /* dext = |Le\\Lk| */\n          if(dext > 0)\n          {\n            d += dext;         /* sum up the set differences */\n            Ci[pn++] = e;     /* keep e in Ei */\n            h += e;            /* compute the hash of node i */\n          }\n          else\n          {\n            Cp[e] = amd_flip (k);  /* aggressive absorb. e->k */\n            w[e] = 0;             /* e is a dead element */\n          }\n        }\n      }\n      elen[i] = pn - p1 + 1;        /* elen[i] = |Ei| */\n      p3 = pn;\n      p4 = p1 + len[i];\n      for(p = p2 + 1; p < p4; p++) /* prune edges in Ai */\n      {\n        j = Ci[p];\n        if((nvj = nv[j]) <= 0) continue; /* node j dead or in Lk */\n        d += nvj;                  /* degree(i) += |j| */\n        Ci[pn++] = j;             /* place j in node list of i */\n        h += j;                    /* compute hash for node i */\n      }\n      if(d == 0)                     /* check for mass elimination */\n      {\n        Cp[i] = amd_flip (k);      /* absorb i into k */\n        nvi = -nv[i];\n        dk -= nvi;                 /* |Lk| -= |i| */\n        nvk += nvi;                /* |k| += nv[i] */\n        nel += nvi;\n        nv[i] = 0;\n        elen[i] = -1;             /* node i is dead */\n      }\n      else\n      {\n        degree[i] = std::min<Index> (degree[i], d);   /* update degree(i) */\n        Ci[pn] = Ci[p3];         /* move first node to end */\n        Ci[p3] = Ci[p1];         /* move 1st el. to end of Ei */\n        Ci[p1] = k;               /* add k as 1st element in of Ei */\n        len[i] = pn - p1 + 1;     /* new len of adj. list of node i */\n        h %= n;                    /* finalize hash of i */\n        next[i] = hhead[h];      /* place i in hash bucket */\n        hhead[h] = i;\n        last[i] = h;              /* save hash of i in last[i] */\n      }\n    }                                   /* scan2 is done */\n    degree[k] = dk;                   /* finalize |Lk| */\n    lemax = std::max<Index>(lemax, dk);\n    mark = internal::cs_wclear<Index>(mark+lemax, lemax, w, n);    /* clear w */\n    \n    /* --- Supernode detection ------------------------------------------ */\n    for(pk = pk1; pk < pk2; pk++)\n    {\n      i = Ci[pk];\n      if(nv[i] >= 0) continue;         /* skip if i is dead */\n      h = last[i];                      /* scan hash bucket of node i */\n      i = hhead[h];\n      hhead[h] = -1;                    /* hash bucket will be empty */\n      for(; i != -1 && next[i] != -1; i = next[i], mark++)\n      {\n        ln = len[i];\n        eln = elen[i];\n        for(p = Cp[i]+1; p <= Cp[i] + ln-1; p++) w[Ci[p]] = mark;\n        jlast = i;\n        for(j = next[i]; j != -1; ) /* compare i with all j */\n        {\n          ok = (len[j] == ln) && (elen[j] == eln);\n          for(p = Cp[j] + 1; ok && p <= Cp[j] + ln - 1; p++)\n          {\n            if(w[Ci[p]] != mark) ok = 0;    /* compare i and j*/\n          }\n          if(ok)                     /* i and j are identical */\n          {\n            Cp[j] = amd_flip (i);  /* absorb j into i */\n            nv[i] += nv[j];\n            nv[j] = 0;\n            elen[j] = -1;         /* node j is dead */\n            j = next[j];          /* delete j from hash bucket */\n            next[jlast] = j;\n          }\n          else\n          {\n            jlast = j;             /* j and i are different */\n            j = next[j];\n          }\n        }\n      }\n    }\n    \n    /* --- Finalize new element------------------------------------------ */\n    for(p = pk1, pk = pk1; pk < pk2; pk++)   /* finalize Lk */\n    {\n      i = Ci[pk];\n      if((nvi = -nv[i]) <= 0) continue;/* skip if i is dead */\n      nv[i] = nvi;                      /* restore nv[i] */\n      d = degree[i] + dk - nvi;         /* compute external degree(i) */\n      d = std::min<Index> (d, n - nel - nvi);\n      if(head[d] != -1) last[head[d]] = i;\n      next[i] = head[d];               /* put i back in degree list */\n      last[i] = -1;\n      head[d] = i;\n      mindeg = std::min<Index> (mindeg, d);       /* find new minimum degree */\n      degree[i] = d;\n      Ci[p++] = i;                      /* place i in Lk */\n    }\n    nv[k] = nvk;                      /* # nodes absorbed into k */\n    if((len[k] = p-pk1) == 0)         /* length of adj list of element k*/\n    {\n      Cp[k] = -1;                   /* k is a root of the tree */\n      w[k] = 0;                     /* k is now a dead element */\n    }\n    if(elenk != 0) cnz = p;           /* free unused space in Lk */\n  }\n  \n  /* --- Postordering ----------------------------------------------------- */\n  for(i = 0; i < n; i++) Cp[i] = amd_flip (Cp[i]);/* fix assembly tree */\n  for(j = 0; j <= n; j++) head[j] = -1;\n  for(j = n; j >= 0; j--)              /* place unordered nodes in lists */\n  {\n    if(nv[j] > 0) continue;          /* skip if j is an element */\n    next[j] = head[Cp[j]];          /* place j in list of its parent */\n    head[Cp[j]] = j;\n  }\n  for(e = n; e >= 0; e--)              /* place elements in lists */\n  {\n    if(nv[e] <= 0) continue;         /* skip unless e is an element */\n    if(Cp[e] != -1)\n    {\n      next[e] = head[Cp[e]];      /* place e in list of its parent */\n      head[Cp[e]] = e;\n    }\n  }\n  for(k = 0, i = 0; i <= n; i++)       /* postorder the assembly tree */\n  {\n    if(Cp[i] == -1) k = internal::cs_tdfs<Index>(i, k, head, next, perm.indices().data(), w);\n  }\n  \n  perm.indices().conservativeResize(n);\n\n  delete[] W;\n}\n\n} // namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_SPARSE_AMD_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/OrderingMethods/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_OrderingMethods_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_OrderingMethods_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/OrderingMethods COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/Eigen/src/OrderingMethods/Eigen_Colamd.h",
    "content": "// // This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Desire Nuentsa Wakam <desire.nuentsa_wakam@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n// This file is modified from the colamd/symamd library. The copyright is below\n\n//   The authors of the code itself are Stefan I. Larimore and Timothy A.\n//   Davis (davis@cise.ufl.edu), University of Florida.  The algorithm was\n//   developed in collaboration with John Gilbert, Xerox PARC, and Esmond\n//   Ng, Oak Ridge National Laboratory.\n// \n//     Date:\n// \n//   September 8, 2003.  Version 2.3.\n// \n//     Acknowledgements:\n// \n//   This work was supported by the National Science Foundation, under\n//   grants DMS-9504974 and DMS-9803599.\n// \n//     Notice:\n// \n//   Copyright (c) 1998-2003 by the University of Florida.\n//   All Rights Reserved.\n// \n//   THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY\n//   EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.\n// \n//   Permission is hereby granted to use, copy, modify, and/or distribute\n//   this program, provided that the Copyright, this License, and the\n//   Availability of the original version is retained on all copies and made\n//   accessible to the end-user of any code or package that includes COLAMD\n//   or any modified version of COLAMD. \n// \n//     Availability:\n// \n//   The colamd/symamd library is available at\n// \n//       http://www.suitesparse.com\n\n  \n#ifndef EIGEN_COLAMD_H\n#define EIGEN_COLAMD_H\n\nnamespace internal {\n/* Ensure that debugging is turned off: */\n#ifndef COLAMD_NDEBUG\n#define COLAMD_NDEBUG\n#endif /* NDEBUG */\n/* ========================================================================== */\n/* === Knob and statistics definitions ====================================== */\n/* ========================================================================== */\n\n/* size of the knobs [ ] array.  Only knobs [0..1] are currently used. */\n#define COLAMD_KNOBS 20\n\n/* number of output statistics.  Only stats [0..6] are currently used. */\n#define COLAMD_STATS 20 \n\n/* knobs [0] and stats [0]: dense row knob and output statistic. */\n#define COLAMD_DENSE_ROW 0\n\n/* knobs [1] and stats [1]: dense column knob and output statistic. */\n#define COLAMD_DENSE_COL 1\n\n/* stats [2]: memory defragmentation count output statistic */\n#define COLAMD_DEFRAG_COUNT 2\n\n/* stats [3]: colamd status:  zero OK, > 0 warning or notice, < 0 error */\n#define COLAMD_STATUS 3\n\n/* stats [4..6]: error info, or info on jumbled columns */ \n#define COLAMD_INFO1 4\n#define COLAMD_INFO2 5\n#define COLAMD_INFO3 6\n\n/* error codes returned in stats [3]: */\n#define COLAMD_OK       (0)\n#define COLAMD_OK_BUT_JUMBLED     (1)\n#define COLAMD_ERROR_A_not_present    (-1)\n#define COLAMD_ERROR_p_not_present    (-2)\n#define COLAMD_ERROR_nrow_negative    (-3)\n#define COLAMD_ERROR_ncol_negative    (-4)\n#define COLAMD_ERROR_nnz_negative   (-5)\n#define COLAMD_ERROR_p0_nonzero     (-6)\n#define COLAMD_ERROR_A_too_small    (-7)\n#define COLAMD_ERROR_col_length_negative  (-8)\n#define COLAMD_ERROR_row_index_out_of_bounds  (-9)\n#define COLAMD_ERROR_out_of_memory    (-10)\n#define COLAMD_ERROR_internal_error   (-999)\n\n/* ========================================================================== */\n/* === Definitions ========================================================== */\n/* ========================================================================== */\n\n#define ONES_COMPLEMENT(r) (-(r)-1)\n\n/* -------------------------------------------------------------------------- */\n\n#define COLAMD_EMPTY (-1)\n\n/* Row and column status */\n#define ALIVE (0)\n#define DEAD  (-1)\n\n/* Column status */\n#define DEAD_PRINCIPAL    (-1)\n#define DEAD_NON_PRINCIPAL  (-2)\n\n/* Macros for row and column status update and checking. */\n#define ROW_IS_DEAD(r)      ROW_IS_MARKED_DEAD (Row[r].shared2.mark)\n#define ROW_IS_MARKED_DEAD(row_mark)  (row_mark < ALIVE)\n#define ROW_IS_ALIVE(r)     (Row [r].shared2.mark >= ALIVE)\n#define COL_IS_DEAD(c)      (Col [c].start < ALIVE)\n#define COL_IS_ALIVE(c)     (Col [c].start >= ALIVE)\n#define COL_IS_DEAD_PRINCIPAL(c)  (Col [c].start == DEAD_PRINCIPAL)\n#define KILL_ROW(r)     { Row [r].shared2.mark = DEAD ; }\n#define KILL_PRINCIPAL_COL(c)   { Col [c].start = DEAD_PRINCIPAL ; }\n#define KILL_NON_PRINCIPAL_COL(c) { Col [c].start = DEAD_NON_PRINCIPAL ; }\n\n/* ========================================================================== */\n/* === Colamd reporting mechanism =========================================== */\n/* ========================================================================== */\n\n// == Row and Column structures ==\ntemplate <typename Index>\nstruct colamd_col\n{\n  Index start ;   /* index for A of first row in this column, or DEAD */\n  /* if column is dead */\n  Index length ;  /* number of rows in this column */\n  union\n  {\n    Index thickness ; /* number of original columns represented by this */\n    /* col, if the column is alive */\n    Index parent ;  /* parent in parent tree super-column structure, if */\n    /* the column is dead */\n  } shared1 ;\n  union\n  {\n    Index score ; /* the score used to maintain heap, if col is alive */\n    Index order ; /* pivot ordering of this column, if col is dead */\n  } shared2 ;\n  union\n  {\n    Index headhash ;  /* head of a hash bucket, if col is at the head of */\n    /* a degree list */\n    Index hash ;  /* hash value, if col is not in a degree list */\n    Index prev ;  /* previous column in degree list, if col is in a */\n    /* degree list (but not at the head of a degree list) */\n  } shared3 ;\n  union\n  {\n    Index degree_next ; /* next column, if col is in a degree list */\n    Index hash_next ;   /* next column, if col is in a hash list */\n  } shared4 ;\n  \n};\n \ntemplate <typename Index>\nstruct Colamd_Row\n{\n  Index start ;   /* index for A of first col in this row */\n  Index length ;  /* number of principal columns in this row */\n  union\n  {\n    Index degree ;  /* number of principal & non-principal columns in row */\n    Index p ;   /* used as a row pointer in init_rows_cols () */\n  } shared1 ;\n  union\n  {\n    Index mark ;  /* for computing set differences and marking dead rows*/\n    Index first_column ;/* first column in row (used in garbage collection) */\n  } shared2 ;\n  \n};\n \n/* ========================================================================== */\n/* === Colamd recommended memory size ======================================= */\n/* ========================================================================== */\n \n/*\n  The recommended length Alen of the array A passed to colamd is given by\n  the COLAMD_RECOMMENDED (nnz, n_row, n_col) macro.  It returns -1 if any\n  argument is negative.  2*nnz space is required for the row and column\n  indices of the matrix. colamd_c (n_col) + colamd_r (n_row) space is\n  required for the Col and Row arrays, respectively, which are internal to\n  colamd.  An additional n_col space is the minimal amount of \"elbow room\",\n  and nnz/5 more space is recommended for run time efficiency.\n  \n  This macro is not needed when using symamd.\n  \n  Explicit typecast to Index added Sept. 23, 2002, COLAMD version 2.2, to avoid\n  gcc -pedantic warning messages.\n*/\ntemplate <typename Index>\ninline Index colamd_c(Index n_col) \n{ return Index( ((n_col) + 1) * sizeof (colamd_col<Index>) / sizeof (Index) ) ; }\n\ntemplate <typename Index>\ninline Index  colamd_r(Index n_row)\n{ return Index(((n_row) + 1) * sizeof (Colamd_Row<Index>) / sizeof (Index)); }\n\n// Prototypes of non-user callable routines\ntemplate <typename Index>\nstatic Index init_rows_cols (Index n_row, Index n_col, Colamd_Row<Index> Row [], colamd_col<Index> col [], Index A [], Index p [], Index stats[COLAMD_STATS] ); \n\ntemplate <typename Index>\nstatic void init_scoring (Index n_row, Index n_col, Colamd_Row<Index> Row [], colamd_col<Index> Col [], Index A [], Index head [], double knobs[COLAMD_KNOBS], Index *p_n_row2, Index *p_n_col2, Index *p_max_deg);\n\ntemplate <typename Index>\nstatic Index find_ordering (Index n_row, Index n_col, Index Alen, Colamd_Row<Index> Row [], colamd_col<Index> Col [], Index A [], Index head [], Index n_col2, Index max_deg, Index pfree);\n\ntemplate <typename Index>\nstatic void order_children (Index n_col, colamd_col<Index> Col [], Index p []);\n\ntemplate <typename Index>\nstatic void detect_super_cols (colamd_col<Index> Col [], Index A [], Index head [], Index row_start, Index row_length ) ;\n\ntemplate <typename Index>\nstatic Index garbage_collection (Index n_row, Index n_col, Colamd_Row<Index> Row [], colamd_col<Index> Col [], Index A [], Index *pfree) ;\n\ntemplate <typename Index>\nstatic inline  Index clear_mark (Index n_row, Colamd_Row<Index> Row [] ) ;\n\n/* === No debugging ========================================================= */\n\n#define COLAMD_DEBUG0(params) ;\n#define COLAMD_DEBUG1(params) ;\n#define COLAMD_DEBUG2(params) ;\n#define COLAMD_DEBUG3(params) ;\n#define COLAMD_DEBUG4(params) ;\n\n#define COLAMD_ASSERT(expression) ((void) 0)\n\n\n/**\n * \\brief Returns the recommended value of Alen \n * \n * Returns recommended value of Alen for use by colamd.  \n * Returns -1 if any input argument is negative.  \n * The use of this routine or macro is optional.  \n * Note that the macro uses its arguments   more than once, \n * so be careful for side effects, if you pass expressions as arguments to COLAMD_RECOMMENDED.  \n * \n * \\param nnz nonzeros in A\n * \\param n_row number of rows in A\n * \\param n_col number of columns in A\n * \\return recommended value of Alen for use by colamd\n */\ntemplate <typename Index>\ninline Index colamd_recommended ( Index nnz, Index n_row, Index n_col)\n{\n  if ((nnz) < 0 || (n_row) < 0 || (n_col) < 0)\n    return (-1);\n  else\n    return (2 * (nnz) + colamd_c (n_col) + colamd_r (n_row) + (n_col) + ((nnz) / 5)); \n}\n\n/**\n * \\brief set default parameters  The use of this routine is optional.\n * \n * Colamd: rows with more than (knobs [COLAMD_DENSE_ROW] * n_col)\n * entries are removed prior to ordering.  Columns with more than\n * (knobs [COLAMD_DENSE_COL] * n_row) entries are removed prior to\n * ordering, and placed last in the output column ordering. \n *\n * COLAMD_DENSE_ROW and COLAMD_DENSE_COL are defined as 0 and 1,\n * respectively, in colamd.h.  Default values of these two knobs\n * are both 0.5.  Currently, only knobs [0] and knobs [1] are\n * used, but future versions may use more knobs.  If so, they will\n * be properly set to their defaults by the future version of\n * colamd_set_defaults, so that the code that calls colamd will\n * not need to change, assuming that you either use\n * colamd_set_defaults, or pass a (double *) NULL pointer as the\n * knobs array to colamd or symamd.\n * \n * \\param knobs parameter settings for colamd\n */\n\nstatic inline void colamd_set_defaults(double knobs[COLAMD_KNOBS])\n{\n  /* === Local variables ================================================== */\n  \n  int i ;\n\n  if (!knobs)\n  {\n    return ;      /* no knobs to initialize */\n  }\n  for (i = 0 ; i < COLAMD_KNOBS ; i++)\n  {\n    knobs [i] = 0 ;\n  }\n  knobs [COLAMD_DENSE_ROW] = 0.5 ;  /* ignore rows over 50% dense */\n  knobs [COLAMD_DENSE_COL] = 0.5 ;  /* ignore columns over 50% dense */\n}\n\n/** \n * \\brief  Computes a column ordering using the column approximate minimum degree ordering\n * \n * Computes a column ordering (Q) of A such that P(AQ)=LU or\n * (AQ)'AQ=LL' have less fill-in and require fewer floating point\n * operations than factorizing the unpermuted matrix A or A'A,\n * respectively.\n * \n * \n * \\param n_row number of rows in A\n * \\param n_col number of columns in A\n * \\param Alen, size of the array A\n * \\param A row indices of the matrix, of size ALen\n * \\param p column pointers of A, of size n_col+1\n * \\param knobs parameter settings for colamd\n * \\param stats colamd output statistics and error codes\n */\ntemplate <typename Index>\nstatic bool colamd(Index n_row, Index n_col, Index Alen, Index *A, Index *p, double knobs[COLAMD_KNOBS], Index stats[COLAMD_STATS])\n{\n  /* === Local variables ================================================== */\n  \n  Index i ;     /* loop index */\n  Index nnz ;     /* nonzeros in A */\n  Index Row_size ;    /* size of Row [], in integers */\n  Index Col_size ;    /* size of Col [], in integers */\n  Index need ;      /* minimum required length of A */\n  Colamd_Row<Index> *Row ;   /* pointer into A of Row [0..n_row] array */\n  colamd_col<Index> *Col ;   /* pointer into A of Col [0..n_col] array */\n  Index n_col2 ;    /* number of non-dense, non-empty columns */\n  Index n_row2 ;    /* number of non-dense, non-empty rows */\n  Index ngarbage ;    /* number of garbage collections performed */\n  Index max_deg ;   /* maximum row degree */\n  double default_knobs [COLAMD_KNOBS] ; /* default knobs array */\n  \n  \n  /* === Check the input arguments ======================================== */\n  \n  if (!stats)\n  {\n    COLAMD_DEBUG0 ((\"colamd: stats not present\\n\")) ;\n    return (false) ;\n  }\n  for (i = 0 ; i < COLAMD_STATS ; i++)\n  {\n    stats [i] = 0 ;\n  }\n  stats [COLAMD_STATUS] = COLAMD_OK ;\n  stats [COLAMD_INFO1] = -1 ;\n  stats [COLAMD_INFO2] = -1 ;\n  \n  if (!A)   /* A is not present */\n  {\n    stats [COLAMD_STATUS] = COLAMD_ERROR_A_not_present ;\n    COLAMD_DEBUG0 ((\"colamd: A not present\\n\")) ;\n    return (false) ;\n  }\n  \n  if (!p)   /* p is not present */\n  {\n    stats [COLAMD_STATUS] = COLAMD_ERROR_p_not_present ;\n    COLAMD_DEBUG0 ((\"colamd: p not present\\n\")) ;\n    return (false) ;\n  }\n  \n  if (n_row < 0)  /* n_row must be >= 0 */\n  {\n    stats [COLAMD_STATUS] = COLAMD_ERROR_nrow_negative ;\n    stats [COLAMD_INFO1] = n_row ;\n    COLAMD_DEBUG0 ((\"colamd: nrow negative %d\\n\", n_row)) ;\n    return (false) ;\n  }\n  \n  if (n_col < 0)  /* n_col must be >= 0 */\n  {\n    stats [COLAMD_STATUS] = COLAMD_ERROR_ncol_negative ;\n    stats [COLAMD_INFO1] = n_col ;\n    COLAMD_DEBUG0 ((\"colamd: ncol negative %d\\n\", n_col)) ;\n    return (false) ;\n  }\n  \n  nnz = p [n_col] ;\n  if (nnz < 0)  /* nnz must be >= 0 */\n  {\n    stats [COLAMD_STATUS] = COLAMD_ERROR_nnz_negative ;\n    stats [COLAMD_INFO1] = nnz ;\n    COLAMD_DEBUG0 ((\"colamd: number of entries negative %d\\n\", nnz)) ;\n    return (false) ;\n  }\n  \n  if (p [0] != 0)\n  {\n    stats [COLAMD_STATUS] = COLAMD_ERROR_p0_nonzero ;\n    stats [COLAMD_INFO1] = p [0] ;\n    COLAMD_DEBUG0 ((\"colamd: p[0] not zero %d\\n\", p [0])) ;\n    return (false) ;\n  }\n  \n  /* === If no knobs, set default knobs =================================== */\n  \n  if (!knobs)\n  {\n    colamd_set_defaults (default_knobs) ;\n    knobs = default_knobs ;\n  }\n  \n  /* === Allocate the Row and Col arrays from array A ===================== */\n  \n  Col_size = colamd_c (n_col) ;\n  Row_size = colamd_r (n_row) ;\n  need = 2*nnz + n_col + Col_size + Row_size ;\n  \n  if (need > Alen)\n  {\n    /* not enough space in array A to perform the ordering */\n    stats [COLAMD_STATUS] = COLAMD_ERROR_A_too_small ;\n    stats [COLAMD_INFO1] = need ;\n    stats [COLAMD_INFO2] = Alen ;\n    COLAMD_DEBUG0 ((\"colamd: Need Alen >= %d, given only Alen = %d\\n\", need,Alen));\n    return (false) ;\n  }\n  \n  Alen -= Col_size + Row_size ;\n  Col = (colamd_col<Index> *) &A [Alen] ;\n  Row = (Colamd_Row<Index> *) &A [Alen + Col_size] ;\n\n  /* === Construct the row and column data structures ===================== */\n  \n  if (!Eigen::internal::init_rows_cols (n_row, n_col, Row, Col, A, p, stats))\n  {\n    /* input matrix is invalid */\n    COLAMD_DEBUG0 ((\"colamd: Matrix invalid\\n\")) ;\n    return (false) ;\n  }\n  \n  /* === Initialize scores, kill dense rows/columns ======================= */\n\n  Eigen::internal::init_scoring (n_row, n_col, Row, Col, A, p, knobs,\n\t\t&n_row2, &n_col2, &max_deg) ;\n  \n  /* === Order the supercolumns =========================================== */\n  \n  ngarbage = Eigen::internal::find_ordering (n_row, n_col, Alen, Row, Col, A, p,\n\t\t\t    n_col2, max_deg, 2*nnz) ;\n  \n  /* === Order the non-principal columns ================================== */\n  \n  Eigen::internal::order_children (n_col, Col, p) ;\n  \n  /* === Return statistics in stats ======================================= */\n  \n  stats [COLAMD_DENSE_ROW] = n_row - n_row2 ;\n  stats [COLAMD_DENSE_COL] = n_col - n_col2 ;\n  stats [COLAMD_DEFRAG_COUNT] = ngarbage ;\n  COLAMD_DEBUG0 ((\"colamd: done.\\n\")) ; \n  return (true) ;\n}\n\n/* ========================================================================== */\n/* === NON-USER-CALLABLE ROUTINES: ========================================== */\n/* ========================================================================== */\n\n/* There are no user-callable routines beyond this point in the file */\n\n\n/* ========================================================================== */\n/* === init_rows_cols ======================================================= */\n/* ========================================================================== */\n\n/*\n  Takes the column form of the matrix in A and creates the row form of the\n  matrix.  Also, row and column attributes are stored in the Col and Row\n  structs.  If the columns are un-sorted or contain duplicate row indices,\n  this routine will also sort and remove duplicate row indices from the\n  column form of the matrix.  Returns false if the matrix is invalid,\n  true otherwise.  Not user-callable.\n*/\ntemplate <typename Index>\nstatic Index init_rows_cols  /* returns true if OK, or false otherwise */\n  (\n    /* === Parameters ======================================================= */\n\n    Index n_row,      /* number of rows of A */\n    Index n_col,      /* number of columns of A */\n    Colamd_Row<Index> Row [],    /* of size n_row+1 */\n    colamd_col<Index> Col [],    /* of size n_col+1 */\n    Index A [],     /* row indices of A, of size Alen */\n    Index p [],     /* pointers to columns in A, of size n_col+1 */\n    Index stats [COLAMD_STATS]  /* colamd statistics */ \n    )\n{\n  /* === Local variables ================================================== */\n\n  Index col ;     /* a column index */\n  Index row ;     /* a row index */\n  Index *cp ;     /* a column pointer */\n  Index *cp_end ;   /* a pointer to the end of a column */\n  Index *rp ;     /* a row pointer */\n  Index *rp_end ;   /* a pointer to the end of a row */\n  Index last_row ;    /* previous row */\n\n  /* === Initialize columns, and check column pointers ==================== */\n\n  for (col = 0 ; col < n_col ; col++)\n  {\n    Col [col].start = p [col] ;\n    Col [col].length = p [col+1] - p [col] ;\n\n    if ((Col [col].length) < 0) // extra parentheses to work-around gcc bug 10200\n    {\n      /* column pointers must be non-decreasing */\n      stats [COLAMD_STATUS] = COLAMD_ERROR_col_length_negative ;\n      stats [COLAMD_INFO1] = col ;\n      stats [COLAMD_INFO2] = Col [col].length ;\n      COLAMD_DEBUG0 ((\"colamd: col %d length %d < 0\\n\", col, Col [col].length)) ;\n      return (false) ;\n    }\n\n    Col [col].shared1.thickness = 1 ;\n    Col [col].shared2.score = 0 ;\n    Col [col].shared3.prev = COLAMD_EMPTY ;\n    Col [col].shared4.degree_next = COLAMD_EMPTY ;\n  }\n\n  /* p [0..n_col] no longer needed, used as \"head\" in subsequent routines */\n\n  /* === Scan columns, compute row degrees, and check row indices ========= */\n\n  stats [COLAMD_INFO3] = 0 ;  /* number of duplicate or unsorted row indices*/\n\n  for (row = 0 ; row < n_row ; row++)\n  {\n    Row [row].length = 0 ;\n    Row [row].shared2.mark = -1 ;\n  }\n\n  for (col = 0 ; col < n_col ; col++)\n  {\n    last_row = -1 ;\n\n    cp = &A [p [col]] ;\n    cp_end = &A [p [col+1]] ;\n\n    while (cp < cp_end)\n    {\n      row = *cp++ ;\n\n      /* make sure row indices within range */\n      if (row < 0 || row >= n_row)\n      {\n\tstats [COLAMD_STATUS] = COLAMD_ERROR_row_index_out_of_bounds ;\n\tstats [COLAMD_INFO1] = col ;\n\tstats [COLAMD_INFO2] = row ;\n\tstats [COLAMD_INFO3] = n_row ;\n\tCOLAMD_DEBUG0 ((\"colamd: row %d col %d out of bounds\\n\", row, col)) ;\n\treturn (false) ;\n      }\n\n      if (row <= last_row || Row [row].shared2.mark == col)\n      {\n\t/* row index are unsorted or repeated (or both), thus col */\n\t/* is jumbled.  This is a notice, not an error condition. */\n\tstats [COLAMD_STATUS] = COLAMD_OK_BUT_JUMBLED ;\n\tstats [COLAMD_INFO1] = col ;\n\tstats [COLAMD_INFO2] = row ;\n\t(stats [COLAMD_INFO3]) ++ ;\n\tCOLAMD_DEBUG1 ((\"colamd: row %d col %d unsorted/duplicate\\n\",row,col));\n      }\n\n      if (Row [row].shared2.mark != col)\n      {\n\tRow [row].length++ ;\n      }\n      else\n      {\n\t/* this is a repeated entry in the column, */\n\t/* it will be removed */\n\tCol [col].length-- ;\n      }\n\n      /* mark the row as having been seen in this column */\n      Row [row].shared2.mark = col ;\n\n      last_row = row ;\n    }\n  }\n\n  /* === Compute row pointers ============================================= */\n\n  /* row form of the matrix starts directly after the column */\n  /* form of matrix in A */\n  Row [0].start = p [n_col] ;\n  Row [0].shared1.p = Row [0].start ;\n  Row [0].shared2.mark = -1 ;\n  for (row = 1 ; row < n_row ; row++)\n  {\n    Row [row].start = Row [row-1].start + Row [row-1].length ;\n    Row [row].shared1.p = Row [row].start ;\n    Row [row].shared2.mark = -1 ;\n  }\n\n  /* === Create row form ================================================== */\n\n  if (stats [COLAMD_STATUS] == COLAMD_OK_BUT_JUMBLED)\n  {\n    /* if cols jumbled, watch for repeated row indices */\n    for (col = 0 ; col < n_col ; col++)\n    {\n      cp = &A [p [col]] ;\n      cp_end = &A [p [col+1]] ;\n      while (cp < cp_end)\n      {\n\trow = *cp++ ;\n\tif (Row [row].shared2.mark != col)\n\t{\n\t  A [(Row [row].shared1.p)++] = col ;\n\t  Row [row].shared2.mark = col ;\n\t}\n      }\n    }\n  }\n  else\n  {\n    /* if cols not jumbled, we don't need the mark (this is faster) */\n    for (col = 0 ; col < n_col ; col++)\n    {\n      cp = &A [p [col]] ;\n      cp_end = &A [p [col+1]] ;\n      while (cp < cp_end)\n      {\n\tA [(Row [*cp++].shared1.p)++] = col ;\n      }\n    }\n  }\n\n  /* === Clear the row marks and set row degrees ========================== */\n\n  for (row = 0 ; row < n_row ; row++)\n  {\n    Row [row].shared2.mark = 0 ;\n    Row [row].shared1.degree = Row [row].length ;\n  }\n\n  /* === See if we need to re-create columns ============================== */\n\n  if (stats [COLAMD_STATUS] == COLAMD_OK_BUT_JUMBLED)\n  {\n    COLAMD_DEBUG0 ((\"colamd: reconstructing column form, matrix jumbled\\n\")) ;\n\n\n    /* === Compute col pointers ========================================= */\n\n    /* col form of the matrix starts at A [0]. */\n    /* Note, we may have a gap between the col form and the row */\n    /* form if there were duplicate entries, if so, it will be */\n    /* removed upon the first garbage collection */\n    Col [0].start = 0 ;\n    p [0] = Col [0].start ;\n    for (col = 1 ; col < n_col ; col++)\n    {\n      /* note that the lengths here are for pruned columns, i.e. */\n      /* no duplicate row indices will exist for these columns */\n      Col [col].start = Col [col-1].start + Col [col-1].length ;\n      p [col] = Col [col].start ;\n    }\n\n    /* === Re-create col form =========================================== */\n\n    for (row = 0 ; row < n_row ; row++)\n    {\n      rp = &A [Row [row].start] ;\n      rp_end = rp + Row [row].length ;\n      while (rp < rp_end)\n      {\n\tA [(p [*rp++])++] = row ;\n      }\n    }\n  }\n\n  /* === Done.  Matrix is not (or no longer) jumbled ====================== */\n\n  return (true) ;\n}\n\n\n/* ========================================================================== */\n/* === init_scoring ========================================================= */\n/* ========================================================================== */\n\n/*\n  Kills dense or empty columns and rows, calculates an initial score for\n  each column, and places all columns in the degree lists.  Not user-callable.\n*/\ntemplate <typename Index>\nstatic void init_scoring\n  (\n    /* === Parameters ======================================================= */\n\n    Index n_row,      /* number of rows of A */\n    Index n_col,      /* number of columns of A */\n    Colamd_Row<Index> Row [],    /* of size n_row+1 */\n    colamd_col<Index> Col [],    /* of size n_col+1 */\n    Index A [],     /* column form and row form of A */\n    Index head [],    /* of size n_col+1 */\n    double knobs [COLAMD_KNOBS],/* parameters */\n    Index *p_n_row2,    /* number of non-dense, non-empty rows */\n    Index *p_n_col2,    /* number of non-dense, non-empty columns */\n    Index *p_max_deg    /* maximum row degree */\n    )\n{\n  /* === Local variables ================================================== */\n\n  Index c ;     /* a column index */\n  Index r, row ;    /* a row index */\n  Index *cp ;     /* a column pointer */\n  Index deg ;     /* degree of a row or column */\n  Index *cp_end ;   /* a pointer to the end of a column */\n  Index *new_cp ;   /* new column pointer */\n  Index col_length ;    /* length of pruned column */\n  Index score ;     /* current column score */\n  Index n_col2 ;    /* number of non-dense, non-empty columns */\n  Index n_row2 ;    /* number of non-dense, non-empty rows */\n  Index dense_row_count ; /* remove rows with more entries than this */\n  Index dense_col_count ; /* remove cols with more entries than this */\n  Index min_score ;   /* smallest column score */\n  Index max_deg ;   /* maximum row degree */\n  Index next_col ;    /* Used to add to degree list.*/\n\n\n  /* === Extract knobs ==================================================== */\n\n  dense_row_count = std::max<Index>(0, (std::min)(Index(knobs [COLAMD_DENSE_ROW] * n_col), n_col)) ;\n  dense_col_count = std::max<Index>(0, (std::min)(Index(knobs [COLAMD_DENSE_COL] * n_row), n_row)) ;\n  COLAMD_DEBUG1 ((\"colamd: densecount: %d %d\\n\", dense_row_count, dense_col_count)) ;\n  max_deg = 0 ;\n  n_col2 = n_col ;\n  n_row2 = n_row ;\n\n  /* === Kill empty columns =============================================== */\n\n  /* Put the empty columns at the end in their natural order, so that LU */\n  /* factorization can proceed as far as possible. */\n  for (c = n_col-1 ; c >= 0 ; c--)\n  {\n    deg = Col [c].length ;\n    if (deg == 0)\n    {\n      /* this is a empty column, kill and order it last */\n      Col [c].shared2.order = --n_col2 ;\n      KILL_PRINCIPAL_COL (c) ;\n    }\n  }\n  COLAMD_DEBUG1 ((\"colamd: null columns killed: %d\\n\", n_col - n_col2)) ;\n\n  /* === Kill dense columns =============================================== */\n\n  /* Put the dense columns at the end, in their natural order */\n  for (c = n_col-1 ; c >= 0 ; c--)\n  {\n    /* skip any dead columns */\n    if (COL_IS_DEAD (c))\n    {\n      continue ;\n    }\n    deg = Col [c].length ;\n    if (deg > dense_col_count)\n    {\n      /* this is a dense column, kill and order it last */\n      Col [c].shared2.order = --n_col2 ;\n      /* decrement the row degrees */\n      cp = &A [Col [c].start] ;\n      cp_end = cp + Col [c].length ;\n      while (cp < cp_end)\n      {\n\tRow [*cp++].shared1.degree-- ;\n      }\n      KILL_PRINCIPAL_COL (c) ;\n    }\n  }\n  COLAMD_DEBUG1 ((\"colamd: Dense and null columns killed: %d\\n\", n_col - n_col2)) ;\n\n  /* === Kill dense and empty rows ======================================== */\n\n  for (r = 0 ; r < n_row ; r++)\n  {\n    deg = Row [r].shared1.degree ;\n    COLAMD_ASSERT (deg >= 0 && deg <= n_col) ;\n    if (deg > dense_row_count || deg == 0)\n    {\n      /* kill a dense or empty row */\n      KILL_ROW (r) ;\n      --n_row2 ;\n    }\n    else\n    {\n      /* keep track of max degree of remaining rows */\n      max_deg = (std::max)(max_deg, deg) ;\n    }\n  }\n  COLAMD_DEBUG1 ((\"colamd: Dense and null rows killed: %d\\n\", n_row - n_row2)) ;\n\n  /* === Compute initial column scores ==================================== */\n\n  /* At this point the row degrees are accurate.  They reflect the number */\n  /* of \"live\" (non-dense) columns in each row.  No empty rows exist. */\n  /* Some \"live\" columns may contain only dead rows, however.  These are */\n  /* pruned in the code below. */\n\n  /* now find the initial matlab score for each column */\n  for (c = n_col-1 ; c >= 0 ; c--)\n  {\n    /* skip dead column */\n    if (COL_IS_DEAD (c))\n    {\n      continue ;\n    }\n    score = 0 ;\n    cp = &A [Col [c].start] ;\n    new_cp = cp ;\n    cp_end = cp + Col [c].length ;\n    while (cp < cp_end)\n    {\n      /* get a row */\n      row = *cp++ ;\n      /* skip if dead */\n      if (ROW_IS_DEAD (row))\n      {\n\tcontinue ;\n      }\n      /* compact the column */\n      *new_cp++ = row ;\n      /* add row's external degree */\n      score += Row [row].shared1.degree - 1 ;\n      /* guard against integer overflow */\n      score = (std::min)(score, n_col) ;\n    }\n    /* determine pruned column length */\n    col_length = (Index) (new_cp - &A [Col [c].start]) ;\n    if (col_length == 0)\n    {\n      /* a newly-made null column (all rows in this col are \"dense\" */\n      /* and have already been killed) */\n      COLAMD_DEBUG2 ((\"Newly null killed: %d\\n\", c)) ;\n      Col [c].shared2.order = --n_col2 ;\n      KILL_PRINCIPAL_COL (c) ;\n    }\n    else\n    {\n      /* set column length and set score */\n      COLAMD_ASSERT (score >= 0) ;\n      COLAMD_ASSERT (score <= n_col) ;\n      Col [c].length = col_length ;\n      Col [c].shared2.score = score ;\n    }\n  }\n  COLAMD_DEBUG1 ((\"colamd: Dense, null, and newly-null columns killed: %d\\n\",\n\t\t  n_col-n_col2)) ;\n\n  /* At this point, all empty rows and columns are dead.  All live columns */\n  /* are \"clean\" (containing no dead rows) and simplicial (no supercolumns */\n  /* yet).  Rows may contain dead columns, but all live rows contain at */\n  /* least one live column. */\n\n  /* === Initialize degree lists ========================================== */\n\n\n  /* clear the hash buckets */\n  for (c = 0 ; c <= n_col ; c++)\n  {\n    head [c] = COLAMD_EMPTY ;\n  }\n  min_score = n_col ;\n  /* place in reverse order, so low column indices are at the front */\n  /* of the lists.  This is to encourage natural tie-breaking */\n  for (c = n_col-1 ; c >= 0 ; c--)\n  {\n    /* only add principal columns to degree lists */\n    if (COL_IS_ALIVE (c))\n    {\n      COLAMD_DEBUG4 ((\"place %d score %d minscore %d ncol %d\\n\",\n\t\t      c, Col [c].shared2.score, min_score, n_col)) ;\n\n      /* === Add columns score to DList =============================== */\n\n      score = Col [c].shared2.score ;\n\n      COLAMD_ASSERT (min_score >= 0) ;\n      COLAMD_ASSERT (min_score <= n_col) ;\n      COLAMD_ASSERT (score >= 0) ;\n      COLAMD_ASSERT (score <= n_col) ;\n      COLAMD_ASSERT (head [score] >= COLAMD_EMPTY) ;\n\n      /* now add this column to dList at proper score location */\n      next_col = head [score] ;\n      Col [c].shared3.prev = COLAMD_EMPTY ;\n      Col [c].shared4.degree_next = next_col ;\n\n      /* if there already was a column with the same score, set its */\n      /* previous pointer to this new column */\n      if (next_col != COLAMD_EMPTY)\n      {\n\tCol [next_col].shared3.prev = c ;\n      }\n      head [score] = c ;\n\n      /* see if this score is less than current min */\n      min_score = (std::min)(min_score, score) ;\n\n\n    }\n  }\n\n\n  /* === Return number of remaining columns, and max row degree =========== */\n\n  *p_n_col2 = n_col2 ;\n  *p_n_row2 = n_row2 ;\n  *p_max_deg = max_deg ;\n}\n\n\n/* ========================================================================== */\n/* === find_ordering ======================================================== */\n/* ========================================================================== */\n\n/*\n  Order the principal columns of the supercolumn form of the matrix\n  (no supercolumns on input).  Uses a minimum approximate column minimum\n  degree ordering method.  Not user-callable.\n*/\ntemplate <typename Index>\nstatic Index find_ordering /* return the number of garbage collections */\n  (\n    /* === Parameters ======================================================= */\n\n    Index n_row,      /* number of rows of A */\n    Index n_col,      /* number of columns of A */\n    Index Alen,     /* size of A, 2*nnz + n_col or larger */\n    Colamd_Row<Index> Row [],    /* of size n_row+1 */\n    colamd_col<Index> Col [],    /* of size n_col+1 */\n    Index A [],     /* column form and row form of A */\n    Index head [],    /* of size n_col+1 */\n    Index n_col2,     /* Remaining columns to order */\n    Index max_deg,    /* Maximum row degree */\n    Index pfree     /* index of first free slot (2*nnz on entry) */\n    )\n{\n  /* === Local variables ================================================== */\n\n  Index k ;     /* current pivot ordering step */\n  Index pivot_col ;   /* current pivot column */\n  Index *cp ;     /* a column pointer */\n  Index *rp ;     /* a row pointer */\n  Index pivot_row ;   /* current pivot row */\n  Index *new_cp ;   /* modified column pointer */\n  Index *new_rp ;   /* modified row pointer */\n  Index pivot_row_start ; /* pointer to start of pivot row */\n  Index pivot_row_degree ;  /* number of columns in pivot row */\n  Index pivot_row_length ;  /* number of supercolumns in pivot row */\n  Index pivot_col_score ; /* score of pivot column */\n  Index needed_memory ;   /* free space needed for pivot row */\n  Index *cp_end ;   /* pointer to the end of a column */\n  Index *rp_end ;   /* pointer to the end of a row */\n  Index row ;     /* a row index */\n  Index col ;     /* a column index */\n  Index max_score ;   /* maximum possible score */\n  Index cur_score ;   /* score of current column */\n  unsigned int hash ;   /* hash value for supernode detection */\n  Index head_column ;   /* head of hash bucket */\n  Index first_col ;   /* first column in hash bucket */\n  Index tag_mark ;    /* marker value for mark array */\n  Index row_mark ;    /* Row [row].shared2.mark */\n  Index set_difference ;  /* set difference size of row with pivot row */\n  Index min_score ;   /* smallest column score */\n  Index col_thickness ;   /* \"thickness\" (no. of columns in a supercol) */\n  Index max_mark ;    /* maximum value of tag_mark */\n  Index pivot_col_thickness ; /* number of columns represented by pivot col */\n  Index prev_col ;    /* Used by Dlist operations. */\n  Index next_col ;    /* Used by Dlist operations. */\n  Index ngarbage ;    /* number of garbage collections performed */\n\n\n  /* === Initialization and clear mark ==================================== */\n\n  max_mark = INT_MAX - n_col ;  /* INT_MAX defined in <limits.h> */\n  tag_mark = Eigen::internal::clear_mark (n_row, Row) ;\n  min_score = 0 ;\n  ngarbage = 0 ;\n  COLAMD_DEBUG1 ((\"colamd: Ordering, n_col2=%d\\n\", n_col2)) ;\n\n  /* === Order the columns ================================================ */\n\n  for (k = 0 ; k < n_col2 ; /* 'k' is incremented below */)\n  {\n\n    /* === Select pivot column, and order it ============================ */\n\n    /* make sure degree list isn't empty */\n    COLAMD_ASSERT (min_score >= 0) ;\n    COLAMD_ASSERT (min_score <= n_col) ;\n    COLAMD_ASSERT (head [min_score] >= COLAMD_EMPTY) ;\n\n    /* get pivot column from head of minimum degree list */\n    while (head [min_score] == COLAMD_EMPTY && min_score < n_col)\n    {\n      min_score++ ;\n    }\n    pivot_col = head [min_score] ;\n    COLAMD_ASSERT (pivot_col >= 0 && pivot_col <= n_col) ;\n    next_col = Col [pivot_col].shared4.degree_next ;\n    head [min_score] = next_col ;\n    if (next_col != COLAMD_EMPTY)\n    {\n      Col [next_col].shared3.prev = COLAMD_EMPTY ;\n    }\n\n    COLAMD_ASSERT (COL_IS_ALIVE (pivot_col)) ;\n    COLAMD_DEBUG3 ((\"Pivot col: %d\\n\", pivot_col)) ;\n\n    /* remember score for defrag check */\n    pivot_col_score = Col [pivot_col].shared2.score ;\n\n    /* the pivot column is the kth column in the pivot order */\n    Col [pivot_col].shared2.order = k ;\n\n    /* increment order count by column thickness */\n    pivot_col_thickness = Col [pivot_col].shared1.thickness ;\n    k += pivot_col_thickness ;\n    COLAMD_ASSERT (pivot_col_thickness > 0) ;\n\n    /* === Garbage_collection, if necessary ============================= */\n\n    needed_memory = (std::min)(pivot_col_score, n_col - k) ;\n    if (pfree + needed_memory >= Alen)\n    {\n      pfree = Eigen::internal::garbage_collection (n_row, n_col, Row, Col, A, &A [pfree]) ;\n      ngarbage++ ;\n      /* after garbage collection we will have enough */\n      COLAMD_ASSERT (pfree + needed_memory < Alen) ;\n      /* garbage collection has wiped out the Row[].shared2.mark array */\n      tag_mark = Eigen::internal::clear_mark (n_row, Row) ;\n\n    }\n\n    /* === Compute pivot row pattern ==================================== */\n\n    /* get starting location for this new merged row */\n    pivot_row_start = pfree ;\n\n    /* initialize new row counts to zero */\n    pivot_row_degree = 0 ;\n\n    /* tag pivot column as having been visited so it isn't included */\n    /* in merged pivot row */\n    Col [pivot_col].shared1.thickness = -pivot_col_thickness ;\n\n    /* pivot row is the union of all rows in the pivot column pattern */\n    cp = &A [Col [pivot_col].start] ;\n    cp_end = cp + Col [pivot_col].length ;\n    while (cp < cp_end)\n    {\n      /* get a row */\n      row = *cp++ ;\n      COLAMD_DEBUG4 ((\"Pivot col pattern %d %d\\n\", ROW_IS_ALIVE (row), row)) ;\n      /* skip if row is dead */\n      if (ROW_IS_DEAD (row))\n      {\n\tcontinue ;\n      }\n      rp = &A [Row [row].start] ;\n      rp_end = rp + Row [row].length ;\n      while (rp < rp_end)\n      {\n\t/* get a column */\n\tcol = *rp++ ;\n\t/* add the column, if alive and untagged */\n\tcol_thickness = Col [col].shared1.thickness ;\n\tif (col_thickness > 0 && COL_IS_ALIVE (col))\n\t{\n\t  /* tag column in pivot row */\n\t  Col [col].shared1.thickness = -col_thickness ;\n\t  COLAMD_ASSERT (pfree < Alen) ;\n\t  /* place column in pivot row */\n\t  A [pfree++] = col ;\n\t  pivot_row_degree += col_thickness ;\n\t}\n      }\n    }\n\n    /* clear tag on pivot column */\n    Col [pivot_col].shared1.thickness = pivot_col_thickness ;\n    max_deg = (std::max)(max_deg, pivot_row_degree) ;\n\n\n    /* === Kill all rows used to construct pivot row ==================== */\n\n    /* also kill pivot row, temporarily */\n    cp = &A [Col [pivot_col].start] ;\n    cp_end = cp + Col [pivot_col].length ;\n    while (cp < cp_end)\n    {\n      /* may be killing an already dead row */\n      row = *cp++ ;\n      COLAMD_DEBUG3 ((\"Kill row in pivot col: %d\\n\", row)) ;\n      KILL_ROW (row) ;\n    }\n\n    /* === Select a row index to use as the new pivot row =============== */\n\n    pivot_row_length = pfree - pivot_row_start ;\n    if (pivot_row_length > 0)\n    {\n      /* pick the \"pivot\" row arbitrarily (first row in col) */\n      pivot_row = A [Col [pivot_col].start] ;\n      COLAMD_DEBUG3 ((\"Pivotal row is %d\\n\", pivot_row)) ;\n    }\n    else\n    {\n      /* there is no pivot row, since it is of zero length */\n      pivot_row = COLAMD_EMPTY ;\n      COLAMD_ASSERT (pivot_row_length == 0) ;\n    }\n    COLAMD_ASSERT (Col [pivot_col].length > 0 || pivot_row_length == 0) ;\n\n    /* === Approximate degree computation =============================== */\n\n    /* Here begins the computation of the approximate degree.  The column */\n    /* score is the sum of the pivot row \"length\", plus the size of the */\n    /* set differences of each row in the column minus the pattern of the */\n    /* pivot row itself.  The column (\"thickness\") itself is also */\n    /* excluded from the column score (we thus use an approximate */\n    /* external degree). */\n\n    /* The time taken by the following code (compute set differences, and */\n    /* add them up) is proportional to the size of the data structure */\n    /* being scanned - that is, the sum of the sizes of each column in */\n    /* the pivot row.  Thus, the amortized time to compute a column score */\n    /* is proportional to the size of that column (where size, in this */\n    /* context, is the column \"length\", or the number of row indices */\n    /* in that column).  The number of row indices in a column is */\n    /* monotonically non-decreasing, from the length of the original */\n    /* column on input to colamd. */\n\n    /* === Compute set differences ====================================== */\n\n    COLAMD_DEBUG3 ((\"** Computing set differences phase. **\\n\")) ;\n\n    /* pivot row is currently dead - it will be revived later. */\n\n    COLAMD_DEBUG3 ((\"Pivot row: \")) ;\n    /* for each column in pivot row */\n    rp = &A [pivot_row_start] ;\n    rp_end = rp + pivot_row_length ;\n    while (rp < rp_end)\n    {\n      col = *rp++ ;\n      COLAMD_ASSERT (COL_IS_ALIVE (col) && col != pivot_col) ;\n      COLAMD_DEBUG3 ((\"Col: %d\\n\", col)) ;\n\n      /* clear tags used to construct pivot row pattern */\n      col_thickness = -Col [col].shared1.thickness ;\n      COLAMD_ASSERT (col_thickness > 0) ;\n      Col [col].shared1.thickness = col_thickness ;\n\n      /* === Remove column from degree list =========================== */\n\n      cur_score = Col [col].shared2.score ;\n      prev_col = Col [col].shared3.prev ;\n      next_col = Col [col].shared4.degree_next ;\n      COLAMD_ASSERT (cur_score >= 0) ;\n      COLAMD_ASSERT (cur_score <= n_col) ;\n      COLAMD_ASSERT (cur_score >= COLAMD_EMPTY) ;\n      if (prev_col == COLAMD_EMPTY)\n      {\n\thead [cur_score] = next_col ;\n      }\n      else\n      {\n\tCol [prev_col].shared4.degree_next = next_col ;\n      }\n      if (next_col != COLAMD_EMPTY)\n      {\n\tCol [next_col].shared3.prev = prev_col ;\n      }\n\n      /* === Scan the column ========================================== */\n\n      cp = &A [Col [col].start] ;\n      cp_end = cp + Col [col].length ;\n      while (cp < cp_end)\n      {\n\t/* get a row */\n\trow = *cp++ ;\n\trow_mark = Row [row].shared2.mark ;\n\t/* skip if dead */\n\tif (ROW_IS_MARKED_DEAD (row_mark))\n\t{\n\t  continue ;\n\t}\n\tCOLAMD_ASSERT (row != pivot_row) ;\n\tset_difference = row_mark - tag_mark ;\n\t/* check if the row has been seen yet */\n\tif (set_difference < 0)\n\t{\n\t  COLAMD_ASSERT (Row [row].shared1.degree <= max_deg) ;\n\t  set_difference = Row [row].shared1.degree ;\n\t}\n\t/* subtract column thickness from this row's set difference */\n\tset_difference -= col_thickness ;\n\tCOLAMD_ASSERT (set_difference >= 0) ;\n\t/* absorb this row if the set difference becomes zero */\n\tif (set_difference == 0)\n\t{\n\t  COLAMD_DEBUG3 ((\"aggressive absorption. Row: %d\\n\", row)) ;\n\t  KILL_ROW (row) ;\n\t}\n\telse\n\t{\n\t  /* save the new mark */\n\t  Row [row].shared2.mark = set_difference + tag_mark ;\n\t}\n      }\n    }\n\n\n    /* === Add up set differences for each column ======================= */\n\n    COLAMD_DEBUG3 ((\"** Adding set differences phase. **\\n\")) ;\n\n    /* for each column in pivot row */\n    rp = &A [pivot_row_start] ;\n    rp_end = rp + pivot_row_length ;\n    while (rp < rp_end)\n    {\n      /* get a column */\n      col = *rp++ ;\n      COLAMD_ASSERT (COL_IS_ALIVE (col) && col != pivot_col) ;\n      hash = 0 ;\n      cur_score = 0 ;\n      cp = &A [Col [col].start] ;\n      /* compact the column */\n      new_cp = cp ;\n      cp_end = cp + Col [col].length ;\n\n      COLAMD_DEBUG4 ((\"Adding set diffs for Col: %d.\\n\", col)) ;\n\n      while (cp < cp_end)\n      {\n\t/* get a row */\n\trow = *cp++ ;\n\tCOLAMD_ASSERT(row >= 0 && row < n_row) ;\n\trow_mark = Row [row].shared2.mark ;\n\t/* skip if dead */\n\tif (ROW_IS_MARKED_DEAD (row_mark))\n\t{\n\t  continue ;\n\t}\n\tCOLAMD_ASSERT (row_mark > tag_mark) ;\n\t/* compact the column */\n\t*new_cp++ = row ;\n\t/* compute hash function */\n\thash += row ;\n\t/* add set difference */\n\tcur_score += row_mark - tag_mark ;\n\t/* integer overflow... */\n\tcur_score = (std::min)(cur_score, n_col) ;\n      }\n\n      /* recompute the column's length */\n      Col [col].length = (Index) (new_cp - &A [Col [col].start]) ;\n\n      /* === Further mass elimination ================================= */\n\n      if (Col [col].length == 0)\n      {\n\tCOLAMD_DEBUG4 ((\"further mass elimination. Col: %d\\n\", col)) ;\n\t/* nothing left but the pivot row in this column */\n\tKILL_PRINCIPAL_COL (col) ;\n\tpivot_row_degree -= Col [col].shared1.thickness ;\n\tCOLAMD_ASSERT (pivot_row_degree >= 0) ;\n\t/* order it */\n\tCol [col].shared2.order = k ;\n\t/* increment order count by column thickness */\n\tk += Col [col].shared1.thickness ;\n      }\n      else\n      {\n\t/* === Prepare for supercolumn detection ==================== */\n\n\tCOLAMD_DEBUG4 ((\"Preparing supercol detection for Col: %d.\\n\", col)) ;\n\n\t/* save score so far */\n\tCol [col].shared2.score = cur_score ;\n\n\t/* add column to hash table, for supercolumn detection */\n\thash %= n_col + 1 ;\n\n\tCOLAMD_DEBUG4 ((\" Hash = %d, n_col = %d.\\n\", hash, n_col)) ;\n\tCOLAMD_ASSERT (hash <= n_col) ;\n\n\thead_column = head [hash] ;\n\tif (head_column > COLAMD_EMPTY)\n\t{\n\t  /* degree list \"hash\" is non-empty, use prev (shared3) of */\n\t  /* first column in degree list as head of hash bucket */\n\t  first_col = Col [head_column].shared3.headhash ;\n\t  Col [head_column].shared3.headhash = col ;\n\t}\n\telse\n\t{\n\t  /* degree list \"hash\" is empty, use head as hash bucket */\n\t  first_col = - (head_column + 2) ;\n\t  head [hash] = - (col + 2) ;\n\t}\n\tCol [col].shared4.hash_next = first_col ;\n\n\t/* save hash function in Col [col].shared3.hash */\n\tCol [col].shared3.hash = (Index) hash ;\n\tCOLAMD_ASSERT (COL_IS_ALIVE (col)) ;\n      }\n    }\n\n    /* The approximate external column degree is now computed.  */\n\n    /* === Supercolumn detection ======================================== */\n\n    COLAMD_DEBUG3 ((\"** Supercolumn detection phase. **\\n\")) ;\n\n    Eigen::internal::detect_super_cols (Col, A, head, pivot_row_start, pivot_row_length) ;\n\n    /* === Kill the pivotal column ====================================== */\n\n    KILL_PRINCIPAL_COL (pivot_col) ;\n\n    /* === Clear mark =================================================== */\n\n    tag_mark += (max_deg + 1) ;\n    if (tag_mark >= max_mark)\n    {\n      COLAMD_DEBUG2 ((\"clearing tag_mark\\n\")) ;\n      tag_mark = Eigen::internal::clear_mark (n_row, Row) ;\n    }\n\n    /* === Finalize the new pivot row, and column scores ================ */\n\n    COLAMD_DEBUG3 ((\"** Finalize scores phase. **\\n\")) ;\n\n    /* for each column in pivot row */\n    rp = &A [pivot_row_start] ;\n    /* compact the pivot row */\n    new_rp = rp ;\n    rp_end = rp + pivot_row_length ;\n    while (rp < rp_end)\n    {\n      col = *rp++ ;\n      /* skip dead columns */\n      if (COL_IS_DEAD (col))\n      {\n\tcontinue ;\n      }\n      *new_rp++ = col ;\n      /* add new pivot row to column */\n      A [Col [col].start + (Col [col].length++)] = pivot_row ;\n\n      /* retrieve score so far and add on pivot row's degree. */\n      /* (we wait until here for this in case the pivot */\n      /* row's degree was reduced due to mass elimination). */\n      cur_score = Col [col].shared2.score + pivot_row_degree ;\n\n      /* calculate the max possible score as the number of */\n      /* external columns minus the 'k' value minus the */\n      /* columns thickness */\n      max_score = n_col - k - Col [col].shared1.thickness ;\n\n      /* make the score the external degree of the union-of-rows */\n      cur_score -= Col [col].shared1.thickness ;\n\n      /* make sure score is less or equal than the max score */\n      cur_score = (std::min)(cur_score, max_score) ;\n      COLAMD_ASSERT (cur_score >= 0) ;\n\n      /* store updated score */\n      Col [col].shared2.score = cur_score ;\n\n      /* === Place column back in degree list ========================= */\n\n      COLAMD_ASSERT (min_score >= 0) ;\n      COLAMD_ASSERT (min_score <= n_col) ;\n      COLAMD_ASSERT (cur_score >= 0) ;\n      COLAMD_ASSERT (cur_score <= n_col) ;\n      COLAMD_ASSERT (head [cur_score] >= COLAMD_EMPTY) ;\n      next_col = head [cur_score] ;\n      Col [col].shared4.degree_next = next_col ;\n      Col [col].shared3.prev = COLAMD_EMPTY ;\n      if (next_col != COLAMD_EMPTY)\n      {\n\tCol [next_col].shared3.prev = col ;\n      }\n      head [cur_score] = col ;\n\n      /* see if this score is less than current min */\n      min_score = (std::min)(min_score, cur_score) ;\n\n    }\n\n    /* === Resurrect the new pivot row ================================== */\n\n    if (pivot_row_degree > 0)\n    {\n      /* update pivot row length to reflect any cols that were killed */\n      /* during super-col detection and mass elimination */\n      Row [pivot_row].start  = pivot_row_start ;\n      Row [pivot_row].length = (Index) (new_rp - &A[pivot_row_start]) ;\n      Row [pivot_row].shared1.degree = pivot_row_degree ;\n      Row [pivot_row].shared2.mark = 0 ;\n      /* pivot row is no longer dead */\n    }\n  }\n\n  /* === All principal columns have now been ordered ====================== */\n\n  return (ngarbage) ;\n}\n\n\n/* ========================================================================== */\n/* === order_children ======================================================= */\n/* ========================================================================== */\n\n/*\n  The find_ordering routine has ordered all of the principal columns (the\n  representatives of the supercolumns).  The non-principal columns have not\n  yet been ordered.  This routine orders those columns by walking up the\n  parent tree (a column is a child of the column which absorbed it).  The\n  final permutation vector is then placed in p [0 ... n_col-1], with p [0]\n  being the first column, and p [n_col-1] being the last.  It doesn't look\n  like it at first glance, but be assured that this routine takes time linear\n  in the number of columns.  Although not immediately obvious, the time\n  taken by this routine is O (n_col), that is, linear in the number of\n  columns.  Not user-callable.\n*/\ntemplate <typename Index>\nstatic inline  void order_children\n(\n  /* === Parameters ======================================================= */\n\n  Index n_col,      /* number of columns of A */\n  colamd_col<Index> Col [],    /* of size n_col+1 */\n  Index p []      /* p [0 ... n_col-1] is the column permutation*/\n  )\n{\n  /* === Local variables ================================================== */\n\n  Index i ;     /* loop counter for all columns */\n  Index c ;     /* column index */\n  Index parent ;    /* index of column's parent */\n  Index order ;     /* column's order */\n\n  /* === Order each non-principal column ================================== */\n\n  for (i = 0 ; i < n_col ; i++)\n  {\n    /* find an un-ordered non-principal column */\n    COLAMD_ASSERT (COL_IS_DEAD (i)) ;\n    if (!COL_IS_DEAD_PRINCIPAL (i) && Col [i].shared2.order == COLAMD_EMPTY)\n    {\n      parent = i ;\n      /* once found, find its principal parent */\n      do\n      {\n\tparent = Col [parent].shared1.parent ;\n      } while (!COL_IS_DEAD_PRINCIPAL (parent)) ;\n\n      /* now, order all un-ordered non-principal columns along path */\n      /* to this parent.  collapse tree at the same time */\n      c = i ;\n      /* get order of parent */\n      order = Col [parent].shared2.order ;\n\n      do\n      {\n\tCOLAMD_ASSERT (Col [c].shared2.order == COLAMD_EMPTY) ;\n\n\t/* order this column */\n\tCol [c].shared2.order = order++ ;\n\t/* collaps tree */\n\tCol [c].shared1.parent = parent ;\n\n\t/* get immediate parent of this column */\n\tc = Col [c].shared1.parent ;\n\n\t/* continue until we hit an ordered column.  There are */\n\t/* guarranteed not to be anymore unordered columns */\n\t/* above an ordered column */\n      } while (Col [c].shared2.order == COLAMD_EMPTY) ;\n\n      /* re-order the super_col parent to largest order for this group */\n      Col [parent].shared2.order = order ;\n    }\n  }\n\n  /* === Generate the permutation ========================================= */\n\n  for (c = 0 ; c < n_col ; c++)\n  {\n    p [Col [c].shared2.order] = c ;\n  }\n}\n\n\n/* ========================================================================== */\n/* === detect_super_cols ==================================================== */\n/* ========================================================================== */\n\n/*\n  Detects supercolumns by finding matches between columns in the hash buckets.\n  Check amongst columns in the set A [row_start ... row_start + row_length-1].\n  The columns under consideration are currently *not* in the degree lists,\n  and have already been placed in the hash buckets.\n\n  The hash bucket for columns whose hash function is equal to h is stored\n  as follows:\n\n  if head [h] is >= 0, then head [h] contains a degree list, so:\n\n  head [h] is the first column in degree bucket h.\n  Col [head [h]].headhash gives the first column in hash bucket h.\n\n  otherwise, the degree list is empty, and:\n\n  -(head [h] + 2) is the first column in hash bucket h.\n\n  For a column c in a hash bucket, Col [c].shared3.prev is NOT a \"previous\n  column\" pointer.  Col [c].shared3.hash is used instead as the hash number\n  for that column.  The value of Col [c].shared4.hash_next is the next column\n  in the same hash bucket.\n\n  Assuming no, or \"few\" hash collisions, the time taken by this routine is\n  linear in the sum of the sizes (lengths) of each column whose score has\n  just been computed in the approximate degree computation.\n  Not user-callable.\n*/\ntemplate <typename Index>\nstatic void detect_super_cols\n(\n  /* === Parameters ======================================================= */\n  \n  colamd_col<Index> Col [],    /* of size n_col+1 */\n  Index A [],     /* row indices of A */\n  Index head [],    /* head of degree lists and hash buckets */\n  Index row_start,    /* pointer to set of columns to check */\n  Index row_length    /* number of columns to check */\n)\n{\n  /* === Local variables ================================================== */\n\n  Index hash ;      /* hash value for a column */\n  Index *rp ;     /* pointer to a row */\n  Index c ;     /* a column index */\n  Index super_c ;   /* column index of the column to absorb into */\n  Index *cp1 ;      /* column pointer for column super_c */\n  Index *cp2 ;      /* column pointer for column c */\n  Index length ;    /* length of column super_c */\n  Index prev_c ;    /* column preceding c in hash bucket */\n  Index i ;     /* loop counter */\n  Index *rp_end ;   /* pointer to the end of the row */\n  Index col ;     /* a column index in the row to check */\n  Index head_column ;   /* first column in hash bucket or degree list */\n  Index first_col ;   /* first column in hash bucket */\n\n  /* === Consider each column in the row ================================== */\n\n  rp = &A [row_start] ;\n  rp_end = rp + row_length ;\n  while (rp < rp_end)\n  {\n    col = *rp++ ;\n    if (COL_IS_DEAD (col))\n    {\n      continue ;\n    }\n\n    /* get hash number for this column */\n    hash = Col [col].shared3.hash ;\n    COLAMD_ASSERT (hash <= n_col) ;\n\n    /* === Get the first column in this hash bucket ===================== */\n\n    head_column = head [hash] ;\n    if (head_column > COLAMD_EMPTY)\n    {\n      first_col = Col [head_column].shared3.headhash ;\n    }\n    else\n    {\n      first_col = - (head_column + 2) ;\n    }\n\n    /* === Consider each column in the hash bucket ====================== */\n\n    for (super_c = first_col ; super_c != COLAMD_EMPTY ;\n\t super_c = Col [super_c].shared4.hash_next)\n    {\n      COLAMD_ASSERT (COL_IS_ALIVE (super_c)) ;\n      COLAMD_ASSERT (Col [super_c].shared3.hash == hash) ;\n      length = Col [super_c].length ;\n\n      /* prev_c is the column preceding column c in the hash bucket */\n      prev_c = super_c ;\n\n      /* === Compare super_c with all columns after it ================ */\n\n      for (c = Col [super_c].shared4.hash_next ;\n\t   c != COLAMD_EMPTY ; c = Col [c].shared4.hash_next)\n      {\n\tCOLAMD_ASSERT (c != super_c) ;\n\tCOLAMD_ASSERT (COL_IS_ALIVE (c)) ;\n\tCOLAMD_ASSERT (Col [c].shared3.hash == hash) ;\n\n\t/* not identical if lengths or scores are different */\n\tif (Col [c].length != length ||\n\t    Col [c].shared2.score != Col [super_c].shared2.score)\n\t{\n\t  prev_c = c ;\n\t  continue ;\n\t}\n\n\t/* compare the two columns */\n\tcp1 = &A [Col [super_c].start] ;\n\tcp2 = &A [Col [c].start] ;\n\n\tfor (i = 0 ; i < length ; i++)\n\t{\n\t  /* the columns are \"clean\" (no dead rows) */\n\t  COLAMD_ASSERT (ROW_IS_ALIVE (*cp1))  ;\n\t  COLAMD_ASSERT (ROW_IS_ALIVE (*cp2))  ;\n\t  /* row indices will same order for both supercols, */\n\t  /* no gather scatter nessasary */\n\t  if (*cp1++ != *cp2++)\n\t  {\n\t    break ;\n\t  }\n\t}\n\n\t/* the two columns are different if the for-loop \"broke\" */\n\tif (i != length)\n\t{\n\t  prev_c = c ;\n\t  continue ;\n\t}\n\n\t/* === Got it!  two columns are identical =================== */\n\n\tCOLAMD_ASSERT (Col [c].shared2.score == Col [super_c].shared2.score) ;\n\n\tCol [super_c].shared1.thickness += Col [c].shared1.thickness ;\n\tCol [c].shared1.parent = super_c ;\n\tKILL_NON_PRINCIPAL_COL (c) ;\n\t/* order c later, in order_children() */\n\tCol [c].shared2.order = COLAMD_EMPTY ;\n\t/* remove c from hash bucket */\n\tCol [prev_c].shared4.hash_next = Col [c].shared4.hash_next ;\n      }\n    }\n\n    /* === Empty this hash bucket ======================================= */\n\n    if (head_column > COLAMD_EMPTY)\n    {\n      /* corresponding degree list \"hash\" is not empty */\n      Col [head_column].shared3.headhash = COLAMD_EMPTY ;\n    }\n    else\n    {\n      /* corresponding degree list \"hash\" is empty */\n      head [hash] = COLAMD_EMPTY ;\n    }\n  }\n}\n\n\n/* ========================================================================== */\n/* === garbage_collection =================================================== */\n/* ========================================================================== */\n\n/*\n  Defragments and compacts columns and rows in the workspace A.  Used when\n  all avaliable memory has been used while performing row merging.  Returns\n  the index of the first free position in A, after garbage collection.  The\n  time taken by this routine is linear is the size of the array A, which is\n  itself linear in the number of nonzeros in the input matrix.\n  Not user-callable.\n*/\ntemplate <typename Index>\nstatic Index garbage_collection  /* returns the new value of pfree */\n  (\n    /* === Parameters ======================================================= */\n    \n    Index n_row,      /* number of rows */\n    Index n_col,      /* number of columns */\n    Colamd_Row<Index> Row [],    /* row info */\n    colamd_col<Index> Col [],    /* column info */\n    Index A [],     /* A [0 ... Alen-1] holds the matrix */\n    Index *pfree      /* &A [0] ... pfree is in use */\n    )\n{\n  /* === Local variables ================================================== */\n\n  Index *psrc ;     /* source pointer */\n  Index *pdest ;    /* destination pointer */\n  Index j ;     /* counter */\n  Index r ;     /* a row index */\n  Index c ;     /* a column index */\n  Index length ;    /* length of a row or column */\n\n  /* === Defragment the columns =========================================== */\n\n  pdest = &A[0] ;\n  for (c = 0 ; c < n_col ; c++)\n  {\n    if (COL_IS_ALIVE (c))\n    {\n      psrc = &A [Col [c].start] ;\n\n      /* move and compact the column */\n      COLAMD_ASSERT (pdest <= psrc) ;\n      Col [c].start = (Index) (pdest - &A [0]) ;\n      length = Col [c].length ;\n      for (j = 0 ; j < length ; j++)\n      {\n\tr = *psrc++ ;\n\tif (ROW_IS_ALIVE (r))\n\t{\n\t  *pdest++ = r ;\n\t}\n      }\n      Col [c].length = (Index) (pdest - &A [Col [c].start]) ;\n    }\n  }\n\n  /* === Prepare to defragment the rows =================================== */\n\n  for (r = 0 ; r < n_row ; r++)\n  {\n    if (ROW_IS_ALIVE (r))\n    {\n      if (Row [r].length == 0)\n      {\n\t/* this row is of zero length.  cannot compact it, so kill it */\n\tCOLAMD_DEBUG3 ((\"Defrag row kill\\n\")) ;\n\tKILL_ROW (r) ;\n      }\n      else\n      {\n\t/* save first column index in Row [r].shared2.first_column */\n\tpsrc = &A [Row [r].start] ;\n\tRow [r].shared2.first_column = *psrc ;\n\tCOLAMD_ASSERT (ROW_IS_ALIVE (r)) ;\n\t/* flag the start of the row with the one's complement of row */\n\t*psrc = ONES_COMPLEMENT (r) ;\n\n      }\n    }\n  }\n\n  /* === Defragment the rows ============================================== */\n\n  psrc = pdest ;\n  while (psrc < pfree)\n  {\n    /* find a negative number ... the start of a row */\n    if (*psrc++ < 0)\n    {\n      psrc-- ;\n      /* get the row index */\n      r = ONES_COMPLEMENT (*psrc) ;\n      COLAMD_ASSERT (r >= 0 && r < n_row) ;\n      /* restore first column index */\n      *psrc = Row [r].shared2.first_column ;\n      COLAMD_ASSERT (ROW_IS_ALIVE (r)) ;\n\n      /* move and compact the row */\n      COLAMD_ASSERT (pdest <= psrc) ;\n      Row [r].start = (Index) (pdest - &A [0]) ;\n      length = Row [r].length ;\n      for (j = 0 ; j < length ; j++)\n      {\n\tc = *psrc++ ;\n\tif (COL_IS_ALIVE (c))\n\t{\n\t  *pdest++ = c ;\n\t}\n      }\n      Row [r].length = (Index) (pdest - &A [Row [r].start]) ;\n\n    }\n  }\n  /* ensure we found all the rows */\n  COLAMD_ASSERT (debug_rows == 0) ;\n\n  /* === Return the new value of pfree ==================================== */\n\n  return ((Index) (pdest - &A [0])) ;\n}\n\n\n/* ========================================================================== */\n/* === clear_mark =========================================================== */\n/* ========================================================================== */\n\n/*\n  Clears the Row [].shared2.mark array, and returns the new tag_mark.\n  Return value is the new tag_mark.  Not user-callable.\n*/\ntemplate <typename Index>\nstatic inline  Index clear_mark  /* return the new value for tag_mark */\n  (\n      /* === Parameters ======================================================= */\n\n    Index n_row,    /* number of rows in A */\n    Colamd_Row<Index> Row [] /* Row [0 ... n_row-1].shared2.mark is set to zero */\n    )\n{\n  /* === Local variables ================================================== */\n\n  Index r ;\n\n  for (r = 0 ; r < n_row ; r++)\n  {\n    if (ROW_IS_ALIVE (r))\n    {\n      Row [r].shared2.mark = 0 ;\n    }\n  }\n  return (1) ;\n}\n\n\n} // namespace internal \n#endif\n"
  },
  {
    "path": "libs/eigen/Eigen/src/OrderingMethods/Ordering.h",
    "content": " \n// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012  Désiré Nuentsa-Wakam <desire.nuentsa_wakam@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_ORDERING_H\n#define EIGEN_ORDERING_H\n\nnamespace Eigen {\n  \n#include \"Eigen_Colamd.h\"\n\nnamespace internal {\n    \n/** \\internal\n  * \\ingroup OrderingMethods_Module\n  * \\returns the symmetric pattern A^T+A from the input matrix A. \n  * FIXME: The values should not be considered here\n  */\ntemplate<typename MatrixType> \nvoid ordering_helper_at_plus_a(const MatrixType& mat, MatrixType& symmat)\n{\n  MatrixType C;\n  C = mat.transpose(); // NOTE: Could be  costly\n  for (int i = 0; i < C.rows(); i++) \n  {\n      for (typename MatrixType::InnerIterator it(C, i); it; ++it)\n        it.valueRef() = 0.0;\n  }\n  symmat = C + mat; \n}\n    \n}\n\n#ifndef EIGEN_MPL2_ONLY\n\n/** \\ingroup OrderingMethods_Module\n  * \\class AMDOrdering\n  *\n  * Functor computing the \\em approximate \\em minimum \\em degree ordering\n  * If the matrix is not structurally symmetric, an ordering of A^T+A is computed\n  * \\tparam  Index The type of indices of the matrix \n  * \\sa COLAMDOrdering\n  */\ntemplate <typename Index>\nclass AMDOrdering\n{\n  public:\n    typedef PermutationMatrix<Dynamic, Dynamic, Index> PermutationType;\n    \n    /** Compute the permutation vector from a sparse matrix\n     * This routine is much faster if the input matrix is column-major     \n     */\n    template <typename MatrixType>\n    void operator()(const MatrixType& mat, PermutationType& perm)\n    {\n      // Compute the symmetric pattern\n      SparseMatrix<typename MatrixType::Scalar, ColMajor, Index> symm;\n      internal::ordering_helper_at_plus_a(mat,symm); \n    \n      // Call the AMD routine \n      //m_mat.prune(keep_diag());\n      internal::minimum_degree_ordering(symm, perm);\n    }\n    \n    /** Compute the permutation with a selfadjoint matrix */\n    template <typename SrcType, unsigned int SrcUpLo> \n    void operator()(const SparseSelfAdjointView<SrcType, SrcUpLo>& mat, PermutationType& perm)\n    { \n      SparseMatrix<typename SrcType::Scalar, ColMajor, Index> C; C = mat;\n      \n      // Call the AMD routine \n      // m_mat.prune(keep_diag()); //Remove the diagonal elements \n      internal::minimum_degree_ordering(C, perm);\n    }\n};\n\n#endif // EIGEN_MPL2_ONLY\n\n/** \\ingroup OrderingMethods_Module\n  * \\class NaturalOrdering\n  *\n  * Functor computing the natural ordering (identity)\n  * \n  * \\note Returns an empty permutation matrix\n  * \\tparam  Index The type of indices of the matrix \n  */\ntemplate <typename Index>\nclass NaturalOrdering\n{\n  public:\n    typedef PermutationMatrix<Dynamic, Dynamic, Index> PermutationType;\n    \n    /** Compute the permutation vector from a column-major sparse matrix */\n    template <typename MatrixType>\n    void operator()(const MatrixType& /*mat*/, PermutationType& perm)\n    {\n      perm.resize(0); \n    }\n    \n};\n\n/** \\ingroup OrderingMethods_Module\n  * \\class COLAMDOrdering\n  *\n  * Functor computing the \\em column \\em approximate \\em minimum \\em degree ordering \n  * The matrix should be in column-major and \\b compressed format (see SparseMatrix::makeCompressed()).\n  */\ntemplate<typename Index>\nclass COLAMDOrdering\n{\n  public:\n    typedef PermutationMatrix<Dynamic, Dynamic, Index> PermutationType; \n    typedef Matrix<Index, Dynamic, 1> IndexVector;\n    \n    /** Compute the permutation vector \\a perm form the sparse matrix \\a mat\n      * \\warning The input sparse matrix \\a mat must be in compressed mode (see SparseMatrix::makeCompressed()).\n      */\n    template <typename MatrixType>\n    void operator() (const MatrixType& mat, PermutationType& perm)\n    {\n      eigen_assert(mat.isCompressed() && \"COLAMDOrdering requires a sparse matrix in compressed mode. Call .makeCompressed() before passing it to COLAMDOrdering\");\n      \n      Index m = mat.rows();\n      Index n = mat.cols();\n      Index nnz = mat.nonZeros();\n      // Get the recommended value of Alen to be used by colamd\n      Index Alen = internal::colamd_recommended(nnz, m, n); \n      // Set the default parameters\n      double knobs [COLAMD_KNOBS]; \n      Index stats [COLAMD_STATS];\n      internal::colamd_set_defaults(knobs);\n      \n      IndexVector p(n+1), A(Alen); \n      for(Index i=0; i <= n; i++)   p(i) = mat.outerIndexPtr()[i];\n      for(Index i=0; i < nnz; i++)  A(i) = mat.innerIndexPtr()[i];\n      // Call Colamd routine to compute the ordering \n      Index info = internal::colamd(m, n, Alen, A.data(), p.data(), knobs, stats); \n      EIGEN_UNUSED_VARIABLE(info);\n      eigen_assert( info && \"COLAMD failed \" );\n      \n      perm.resize(n);\n      for (Index i = 0; i < n; i++) perm.indices()(p(i)) = i;\n    }\n};\n\n} // end namespace Eigen\n\n#endif\n"
  },
  {
    "path": "libs/eigen/Eigen/src/PaStiXSupport/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_PastixSupport_SRCS \"*.h\")\n\nINSTALL(FILES \n  ${Eigen_PastixSupport_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/PaStiXSupport COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/Eigen/src/PaStiXSupport/PaStiXSupport.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_PASTIXSUPPORT_H\n#define EIGEN_PASTIXSUPPORT_H\n\n#if defined(DCOMPLEX)\n  #define PASTIX_COMPLEX  COMPLEX\n  #define PASTIX_DCOMPLEX DCOMPLEX\n#else\n  #define PASTIX_COMPLEX  std::complex<float>\n  #define PASTIX_DCOMPLEX std::complex<double>\n#endif\n\nnamespace Eigen { \n\n/** \\ingroup PaStiXSupport_Module\n  * \\brief Interface to the PaStix solver\n  * \n  * This class is used to solve the linear systems A.X = B via the PaStix library. \n  * The matrix can be either real or complex, symmetric or not.\n  *\n  * \\sa TutorialSparseDirectSolvers\n  */\ntemplate<typename _MatrixType, bool IsStrSym = false> class PastixLU;\ntemplate<typename _MatrixType, int Options> class PastixLLT;\ntemplate<typename _MatrixType, int Options> class PastixLDLT;\n\nnamespace internal\n{\n    \n  template<class Pastix> struct pastix_traits;\n\n  template<typename _MatrixType>\n  struct pastix_traits< PastixLU<_MatrixType> >\n  {\n    typedef _MatrixType MatrixType;\n    typedef typename _MatrixType::Scalar Scalar;\n    typedef typename _MatrixType::RealScalar RealScalar;\n    typedef typename _MatrixType::Index Index;\n  };\n\n  template<typename _MatrixType, int Options>\n  struct pastix_traits< PastixLLT<_MatrixType,Options> >\n  {\n    typedef _MatrixType MatrixType;\n    typedef typename _MatrixType::Scalar Scalar;\n    typedef typename _MatrixType::RealScalar RealScalar;\n    typedef typename _MatrixType::Index Index;\n  };\n\n  template<typename _MatrixType, int Options>\n  struct pastix_traits< PastixLDLT<_MatrixType,Options> >\n  {\n    typedef _MatrixType MatrixType;\n    typedef typename _MatrixType::Scalar Scalar;\n    typedef typename _MatrixType::RealScalar RealScalar;\n    typedef typename _MatrixType::Index Index;\n  };\n  \n  void eigen_pastix(pastix_data_t **pastix_data, int pastix_comm, int n, int *ptr, int *idx, float *vals, int *perm, int * invp, float *x, int nbrhs, int *iparm, double *dparm)\n  {\n    if (n == 0) { ptr = NULL; idx = NULL; vals = NULL; }\n    if (nbrhs == 0) {x = NULL; nbrhs=1;}\n    s_pastix(pastix_data, pastix_comm, n, ptr, idx, vals, perm, invp, x, nbrhs, iparm, dparm); \n  }\n  \n  void eigen_pastix(pastix_data_t **pastix_data, int pastix_comm, int n, int *ptr, int *idx, double *vals, int *perm, int * invp, double *x, int nbrhs, int *iparm, double *dparm)\n  {\n    if (n == 0) { ptr = NULL; idx = NULL; vals = NULL; }\n    if (nbrhs == 0) {x = NULL; nbrhs=1;}\n    d_pastix(pastix_data, pastix_comm, n, ptr, idx, vals, perm, invp, x, nbrhs, iparm, dparm); \n  }\n  \n  void eigen_pastix(pastix_data_t **pastix_data, int pastix_comm, int n, int *ptr, int *idx, std::complex<float> *vals, int *perm, int * invp, std::complex<float> *x, int nbrhs, int *iparm, double *dparm)\n  {\n    if (n == 0) { ptr = NULL; idx = NULL; vals = NULL; }\n    if (nbrhs == 0) {x = NULL; nbrhs=1;}\n    c_pastix(pastix_data, pastix_comm, n, ptr, idx, reinterpret_cast<PASTIX_COMPLEX*>(vals), perm, invp, reinterpret_cast<PASTIX_COMPLEX*>(x), nbrhs, iparm, dparm);\n  }\n  \n  void eigen_pastix(pastix_data_t **pastix_data, int pastix_comm, int n, int *ptr, int *idx, std::complex<double> *vals, int *perm, int * invp, std::complex<double> *x, int nbrhs, int *iparm, double *dparm)\n  {\n    if (n == 0) { ptr = NULL; idx = NULL; vals = NULL; }\n    if (nbrhs == 0) {x = NULL; nbrhs=1;}\n    z_pastix(pastix_data, pastix_comm, n, ptr, idx, reinterpret_cast<PASTIX_DCOMPLEX*>(vals), perm, invp, reinterpret_cast<PASTIX_DCOMPLEX*>(x), nbrhs, iparm, dparm);\n  }\n\n  // Convert the matrix  to Fortran-style Numbering\n  template <typename MatrixType>\n  void c_to_fortran_numbering (MatrixType& mat)\n  {\n    if ( !(mat.outerIndexPtr()[0]) ) \n    { \n      int i;\n      for(i = 0; i <= mat.rows(); ++i)\n        ++mat.outerIndexPtr()[i];\n      for(i = 0; i < mat.nonZeros(); ++i)\n        ++mat.innerIndexPtr()[i];\n    }\n  }\n  \n  // Convert to C-style Numbering\n  template <typename MatrixType>\n  void fortran_to_c_numbering (MatrixType& mat)\n  {\n    // Check the Numbering\n    if ( mat.outerIndexPtr()[0] == 1 ) \n    { // Convert to C-style numbering\n      int i;\n      for(i = 0; i <= mat.rows(); ++i)\n        --mat.outerIndexPtr()[i];\n      for(i = 0; i < mat.nonZeros(); ++i)\n        --mat.innerIndexPtr()[i];\n    }\n  }\n}\n\n// This is the base class to interface with PaStiX functions. \n// Users should not used this class directly. \ntemplate <class Derived>\nclass PastixBase : internal::noncopyable\n{\n  public:\n    typedef typename internal::pastix_traits<Derived>::MatrixType _MatrixType;\n    typedef _MatrixType MatrixType;\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename MatrixType::RealScalar RealScalar;\n    typedef typename MatrixType::Index Index;\n    typedef Matrix<Scalar,Dynamic,1> Vector;\n    typedef SparseMatrix<Scalar, ColMajor> ColSpMatrix;\n    \n  public:\n    \n    PastixBase() : m_initisOk(false), m_analysisIsOk(false), m_factorizationIsOk(false), m_isInitialized(false), m_pastixdata(0), m_size(0)\n    {\n      init();\n    }\n    \n    ~PastixBase() \n    {\n      clean();\n    }\n\n    /** \\returns the solution x of \\f$ A x = b \\f$ using the current decomposition of A.\n      *\n      * \\sa compute()\n      */\n    template<typename Rhs>\n    inline const internal::solve_retval<PastixBase, Rhs>\n    solve(const MatrixBase<Rhs>& b) const\n    {\n      eigen_assert(m_isInitialized && \"Pastix solver is not initialized.\");\n      eigen_assert(rows()==b.rows()\n                && \"PastixBase::solve(): invalid number of rows of the right hand side matrix b\");\n      return internal::solve_retval<PastixBase, Rhs>(*this, b.derived());\n    }\n    \n    template<typename Rhs,typename Dest>\n    bool _solve (const MatrixBase<Rhs> &b, MatrixBase<Dest> &x) const;\n    \n    Derived& derived()\n    {\n      return *static_cast<Derived*>(this);\n    }\n    const Derived& derived() const\n    {\n      return *static_cast<const Derived*>(this);\n    }\n\n    /** Returns a reference to the integer vector IPARM of PaStiX parameters\n      * to modify the default parameters. \n      * The statistics related to the different phases of factorization and solve are saved here as well\n      * \\sa analyzePattern() factorize()\n      */\n    Array<Index,IPARM_SIZE,1>& iparm()\n    {\n      return m_iparm; \n    }\n    \n    /** Return a reference to a particular index parameter of the IPARM vector \n     * \\sa iparm()\n     */\n    \n    int& iparm(int idxparam)\n    {\n      return m_iparm(idxparam);\n    }\n    \n     /** Returns a reference to the double vector DPARM of PaStiX parameters \n      * The statistics related to the different phases of factorization and solve are saved here as well\n      * \\sa analyzePattern() factorize()\n      */\n    Array<RealScalar,IPARM_SIZE,1>& dparm()\n    {\n      return m_dparm; \n    }\n    \n    \n    /** Return a reference to a particular index parameter of the DPARM vector \n     * \\sa dparm()\n     */\n    double& dparm(int idxparam)\n    {\n      return m_dparm(idxparam);\n    }\n    \n    inline Index cols() const { return m_size; }\n    inline Index rows() const { return m_size; }\n    \n     /** \\brief Reports whether previous computation was successful.\n      *\n      * \\returns \\c Success if computation was succesful,\n      *          \\c NumericalIssue if the PaStiX reports a problem\n      *          \\c InvalidInput if the input matrix is invalid\n      *\n      * \\sa iparm()          \n      */\n    ComputationInfo info() const\n    {\n      eigen_assert(m_isInitialized && \"Decomposition is not initialized.\");\n      return m_info;\n    }\n    \n    /** \\returns the solution x of \\f$ A x = b \\f$ using the current decomposition of A.\n      *\n      * \\sa compute()\n      */\n    template<typename Rhs>\n    inline const internal::sparse_solve_retval<PastixBase, Rhs>\n    solve(const SparseMatrixBase<Rhs>& b) const\n    {\n      eigen_assert(m_isInitialized && \"Pastix LU, LLT or LDLT is not initialized.\");\n      eigen_assert(rows()==b.rows()\n                && \"PastixBase::solve(): invalid number of rows of the right hand side matrix b\");\n      return internal::sparse_solve_retval<PastixBase, Rhs>(*this, b.derived());\n    }\n    \n  protected:\n\n    // Initialize the Pastix data structure, check the matrix\n    void init(); \n    \n    // Compute the ordering and the symbolic factorization\n    void analyzePattern(ColSpMatrix& mat);\n    \n    // Compute the numerical factorization\n    void factorize(ColSpMatrix& mat);\n    \n    // Free all the data allocated by Pastix\n    void clean()\n    {\n      eigen_assert(m_initisOk && \"The Pastix structure should be allocated first\"); \n      m_iparm(IPARM_START_TASK) = API_TASK_CLEAN;\n      m_iparm(IPARM_END_TASK) = API_TASK_CLEAN;\n      internal::eigen_pastix(&m_pastixdata, MPI_COMM_WORLD, 0, 0, 0, (Scalar*)0,\n                             m_perm.data(), m_invp.data(), 0, 0, m_iparm.data(), m_dparm.data());\n    }\n    \n    void compute(ColSpMatrix& mat);\n    \n    int m_initisOk; \n    int m_analysisIsOk;\n    int m_factorizationIsOk;\n    bool m_isInitialized;\n    mutable ComputationInfo m_info; \n    mutable pastix_data_t *m_pastixdata; // Data structure for pastix\n    mutable int m_comm; // The MPI communicator identifier\n    mutable Matrix<int,IPARM_SIZE,1> m_iparm; // integer vector for the input parameters\n    mutable Matrix<double,DPARM_SIZE,1> m_dparm; // Scalar vector for the input parameters\n    mutable Matrix<Index,Dynamic,1> m_perm;  // Permutation vector\n    mutable Matrix<Index,Dynamic,1> m_invp;  // Inverse permutation vector\n    mutable int m_size; // Size of the matrix \n}; \n\n /** Initialize the PaStiX data structure. \n   *A first call to this function fills iparm and dparm with the default PaStiX parameters\n   * \\sa iparm() dparm()\n   */\ntemplate <class Derived>\nvoid PastixBase<Derived>::init()\n{\n  m_size = 0; \n  m_iparm.setZero(IPARM_SIZE);\n  m_dparm.setZero(DPARM_SIZE);\n  \n  m_iparm(IPARM_MODIFY_PARAMETER) = API_NO;\n  pastix(&m_pastixdata, MPI_COMM_WORLD,\n         0, 0, 0, 0,\n         0, 0, 0, 1, m_iparm.data(), m_dparm.data());\n  \n  m_iparm[IPARM_MATRIX_VERIFICATION] = API_NO;\n  m_iparm[IPARM_VERBOSE]             = 2;\n  m_iparm[IPARM_ORDERING]            = API_ORDER_SCOTCH;\n  m_iparm[IPARM_INCOMPLETE]          = API_NO;\n  m_iparm[IPARM_OOC_LIMIT]           = 2000;\n  m_iparm[IPARM_RHS_MAKING]          = API_RHS_B;\n  m_iparm(IPARM_MATRIX_VERIFICATION) = API_NO;\n  \n  m_iparm(IPARM_START_TASK) = API_TASK_INIT;\n  m_iparm(IPARM_END_TASK) = API_TASK_INIT;\n  internal::eigen_pastix(&m_pastixdata, MPI_COMM_WORLD, 0, 0, 0, (Scalar*)0,\n                         0, 0, 0, 0, m_iparm.data(), m_dparm.data());\n  \n  // Check the returned error\n  if(m_iparm(IPARM_ERROR_NUMBER)) {\n    m_info = InvalidInput;\n    m_initisOk = false;\n  }\n  else { \n    m_info = Success;\n    m_initisOk = true;\n  }\n}\n\ntemplate <class Derived>\nvoid PastixBase<Derived>::compute(ColSpMatrix& mat)\n{\n  eigen_assert(mat.rows() == mat.cols() && \"The input matrix should be squared\");\n  \n  analyzePattern(mat);  \n  factorize(mat);\n  \n  m_iparm(IPARM_MATRIX_VERIFICATION) = API_NO;\n  m_isInitialized = m_factorizationIsOk;\n}\n\n\ntemplate <class Derived>\nvoid PastixBase<Derived>::analyzePattern(ColSpMatrix& mat)\n{                         \n  eigen_assert(m_initisOk && \"The initialization of PaSTiX failed\");\n  \n  // clean previous calls\n  if(m_size>0)\n    clean();\n  \n  m_size = mat.rows();\n  m_perm.resize(m_size);\n  m_invp.resize(m_size);\n  \n  m_iparm(IPARM_START_TASK) = API_TASK_ORDERING;\n  m_iparm(IPARM_END_TASK) = API_TASK_ANALYSE;\n  internal::eigen_pastix(&m_pastixdata, MPI_COMM_WORLD, m_size, mat.outerIndexPtr(), mat.innerIndexPtr(),\n               mat.valuePtr(), m_perm.data(), m_invp.data(), 0, 0, m_iparm.data(), m_dparm.data());\n  \n  // Check the returned error\n  if(m_iparm(IPARM_ERROR_NUMBER))\n  {\n    m_info = NumericalIssue;\n    m_analysisIsOk = false;\n  }\n  else\n  { \n    m_info = Success;\n    m_analysisIsOk = true;\n  }\n}\n\ntemplate <class Derived>\nvoid PastixBase<Derived>::factorize(ColSpMatrix& mat)\n{\n//   if(&m_cpyMat != &mat) m_cpyMat = mat;\n  eigen_assert(m_analysisIsOk && \"The analysis phase should be called before the factorization phase\");\n  m_iparm(IPARM_START_TASK) = API_TASK_NUMFACT;\n  m_iparm(IPARM_END_TASK) = API_TASK_NUMFACT;\n  m_size = mat.rows();\n  \n  internal::eigen_pastix(&m_pastixdata, MPI_COMM_WORLD, m_size, mat.outerIndexPtr(), mat.innerIndexPtr(),\n               mat.valuePtr(), m_perm.data(), m_invp.data(), 0, 0, m_iparm.data(), m_dparm.data());\n  \n  // Check the returned error\n  if(m_iparm(IPARM_ERROR_NUMBER))\n  {\n    m_info = NumericalIssue;\n    m_factorizationIsOk = false;\n    m_isInitialized = false;\n  }\n  else\n  {\n    m_info = Success;\n    m_factorizationIsOk = true;\n    m_isInitialized = true;\n  }\n}\n\n/* Solve the system */\ntemplate<typename Base>\ntemplate<typename Rhs,typename Dest>\nbool PastixBase<Base>::_solve (const MatrixBase<Rhs> &b, MatrixBase<Dest> &x) const\n{\n  eigen_assert(m_isInitialized && \"The matrix should be factorized first\");\n  EIGEN_STATIC_ASSERT((Dest::Flags&RowMajorBit)==0,\n                     THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES);\n  int rhs = 1;\n  \n  x = b; /* on return, x is overwritten by the computed solution */\n  \n  for (int i = 0; i < b.cols(); i++){\n    m_iparm[IPARM_START_TASK]          = API_TASK_SOLVE;\n    m_iparm[IPARM_END_TASK]            = API_TASK_REFINE;\n  \n    internal::eigen_pastix(&m_pastixdata, MPI_COMM_WORLD, x.rows(), 0, 0, 0,\n                           m_perm.data(), m_invp.data(), &x(0, i), rhs, m_iparm.data(), m_dparm.data());\n  }\n  \n  // Check the returned error\n  m_info = m_iparm(IPARM_ERROR_NUMBER)==0 ? Success : NumericalIssue;\n  \n  return m_iparm(IPARM_ERROR_NUMBER)==0;\n}\n\n/** \\ingroup PaStiXSupport_Module\n  * \\class PastixLU\n  * \\brief Sparse direct LU solver based on PaStiX library\n  * \n  * This class is used to solve the linear systems A.X = B with a supernodal LU \n  * factorization in the PaStiX library. The matrix A should be squared and nonsingular\n  * PaStiX requires that the matrix A has a symmetric structural pattern. \n  * This interface can symmetrize the input matrix otherwise. \n  * The vectors or matrices X and B can be either dense or sparse.\n  * \n  * \\tparam _MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>\n  * \\tparam IsStrSym Indicates if the input matrix has a symmetric pattern, default is false\n  * NOTE : Note that if the analysis and factorization phase are called separately, \n  * the input matrix will be symmetrized at each call, hence it is advised to \n  * symmetrize the matrix in a end-user program and set \\p IsStrSym to true\n  * \n  * \\sa \\ref TutorialSparseDirectSolvers\n  * \n  */\ntemplate<typename _MatrixType, bool IsStrSym>\nclass PastixLU : public PastixBase< PastixLU<_MatrixType> >\n{\n  public:\n    typedef _MatrixType MatrixType;\n    typedef PastixBase<PastixLU<MatrixType> > Base;\n    typedef typename Base::ColSpMatrix ColSpMatrix;\n    typedef typename MatrixType::Index Index;\n    \n  public:\n    PastixLU() : Base()\n    {\n      init();\n    }\n    \n    PastixLU(const MatrixType& matrix):Base()\n    {\n      init();\n      compute(matrix);\n    }\n    /** Compute the LU supernodal factorization of \\p matrix. \n      * iparm and dparm can be used to tune the PaStiX parameters. \n      * see the PaStiX user's manual\n      * \\sa analyzePattern() factorize()\n      */\n    void compute (const MatrixType& matrix)\n    {\n      m_structureIsUptodate = false;\n      ColSpMatrix temp;\n      grabMatrix(matrix, temp);\n      Base::compute(temp);\n    }\n    /** Compute the LU symbolic factorization of \\p matrix using its sparsity pattern. \n      * Several ordering methods can be used at this step. See the PaStiX user's manual. \n      * The result of this operation can be used with successive matrices having the same pattern as \\p matrix\n      * \\sa factorize()\n      */\n    void analyzePattern(const MatrixType& matrix)\n    {\n      m_structureIsUptodate = false;\n      ColSpMatrix temp;\n      grabMatrix(matrix, temp);\n      Base::analyzePattern(temp);\n    }\n\n    /** Compute the LU supernodal factorization of \\p matrix\n      * WARNING The matrix \\p matrix should have the same structural pattern \n      * as the same used in the analysis phase.\n      * \\sa analyzePattern()\n      */ \n    void factorize(const MatrixType& matrix)\n    {\n      ColSpMatrix temp;\n      grabMatrix(matrix, temp);\n      Base::factorize(temp);\n    }\n  protected:\n    \n    void init()\n    {\n      m_structureIsUptodate = false;\n      m_iparm(IPARM_SYM) = API_SYM_NO;\n      m_iparm(IPARM_FACTORIZATION) = API_FACT_LU;\n    }\n    \n    void grabMatrix(const MatrixType& matrix, ColSpMatrix& out)\n    {\n      if(IsStrSym)\n        out = matrix;\n      else\n      {\n        if(!m_structureIsUptodate)\n        {\n          // update the transposed structure\n          m_transposedStructure = matrix.transpose();\n          \n          // Set the elements of the matrix to zero \n          for (Index j=0; j<m_transposedStructure.outerSize(); ++j) \n            for(typename ColSpMatrix::InnerIterator it(m_transposedStructure, j); it; ++it)\n              it.valueRef() = 0.0;\n\n          m_structureIsUptodate = true;\n        }\n        \n        out = m_transposedStructure + matrix;\n      }\n      internal::c_to_fortran_numbering(out);\n    }\n    \n    using Base::m_iparm;\n    using Base::m_dparm;\n    \n    ColSpMatrix m_transposedStructure;\n    bool m_structureIsUptodate;\n};\n\n/** \\ingroup PaStiXSupport_Module\n  * \\class PastixLLT\n  * \\brief A sparse direct supernodal Cholesky (LLT) factorization and solver based on the PaStiX library\n  * \n  * This class is used to solve the linear systems A.X = B via a LL^T supernodal Cholesky factorization\n  * available in the PaStiX library. The matrix A should be symmetric and positive definite\n  * WARNING Selfadjoint complex matrices are not supported in the current version of PaStiX\n  * The vectors or matrices X and B can be either dense or sparse\n  * \n  * \\tparam MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>\n  * \\tparam UpLo The part of the matrix to use : Lower or Upper. The default is Lower as required by PaStiX\n  * \n  * \\sa \\ref TutorialSparseDirectSolvers\n  */\ntemplate<typename _MatrixType, int _UpLo>\nclass PastixLLT : public PastixBase< PastixLLT<_MatrixType, _UpLo> >\n{\n  public:\n    typedef _MatrixType MatrixType;\n    typedef PastixBase<PastixLLT<MatrixType, _UpLo> > Base;\n    typedef typename Base::ColSpMatrix ColSpMatrix;\n    \n  public:\n    enum { UpLo = _UpLo };\n    PastixLLT() : Base()\n    {\n      init();\n    }\n    \n    PastixLLT(const MatrixType& matrix):Base()\n    {\n      init();\n      compute(matrix);\n    }\n\n    /** Compute the L factor of the LL^T supernodal factorization of \\p matrix \n      * \\sa analyzePattern() factorize()\n      */\n    void compute (const MatrixType& matrix)\n    {\n      ColSpMatrix temp;\n      grabMatrix(matrix, temp);\n      Base::compute(temp);\n    }\n\n     /** Compute the LL^T symbolic factorization of \\p matrix using its sparsity pattern\n      * The result of this operation can be used with successive matrices having the same pattern as \\p matrix\n      * \\sa factorize()\n      */\n    void analyzePattern(const MatrixType& matrix)\n    {\n      ColSpMatrix temp;\n      grabMatrix(matrix, temp);\n      Base::analyzePattern(temp);\n    }\n      /** Compute the LL^T supernodal numerical factorization of \\p matrix \n        * \\sa analyzePattern()\n        */\n    void factorize(const MatrixType& matrix)\n    {\n      ColSpMatrix temp;\n      grabMatrix(matrix, temp);\n      Base::factorize(temp);\n    }\n  protected:\n    using Base::m_iparm;\n    \n    void init()\n    {\n      m_iparm(IPARM_SYM) = API_SYM_YES;\n      m_iparm(IPARM_FACTORIZATION) = API_FACT_LLT;\n    }\n    \n    void grabMatrix(const MatrixType& matrix, ColSpMatrix& out)\n    {\n      // Pastix supports only lower, column-major matrices \n      out.template selfadjointView<Lower>() = matrix.template selfadjointView<UpLo>();\n      internal::c_to_fortran_numbering(out);\n    }\n};\n\n/** \\ingroup PaStiXSupport_Module\n  * \\class PastixLDLT\n  * \\brief A sparse direct supernodal Cholesky (LLT) factorization and solver based on the PaStiX library\n  * \n  * This class is used to solve the linear systems A.X = B via a LDL^T supernodal Cholesky factorization\n  * available in the PaStiX library. The matrix A should be symmetric and positive definite\n  * WARNING Selfadjoint complex matrices are not supported in the current version of PaStiX\n  * The vectors or matrices X and B can be either dense or sparse\n  * \n  * \\tparam MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>\n  * \\tparam UpLo The part of the matrix to use : Lower or Upper. The default is Lower as required by PaStiX\n  * \n  * \\sa \\ref TutorialSparseDirectSolvers\n  */\ntemplate<typename _MatrixType, int _UpLo>\nclass PastixLDLT : public PastixBase< PastixLDLT<_MatrixType, _UpLo> >\n{\n  public:\n    typedef _MatrixType MatrixType;\n    typedef PastixBase<PastixLDLT<MatrixType, _UpLo> > Base; \n    typedef typename Base::ColSpMatrix ColSpMatrix;\n    \n  public:\n    enum { UpLo = _UpLo };\n    PastixLDLT():Base()\n    {\n      init();\n    }\n    \n    PastixLDLT(const MatrixType& matrix):Base()\n    {\n      init();\n      compute(matrix);\n    }\n\n    /** Compute the L and D factors of the LDL^T factorization of \\p matrix \n      * \\sa analyzePattern() factorize()\n      */\n    void compute (const MatrixType& matrix)\n    {\n      ColSpMatrix temp;\n      grabMatrix(matrix, temp);\n      Base::compute(temp);\n    }\n\n    /** Compute the LDL^T symbolic factorization of \\p matrix using its sparsity pattern\n      * The result of this operation can be used with successive matrices having the same pattern as \\p matrix\n      * \\sa factorize()\n      */\n    void analyzePattern(const MatrixType& matrix)\n    { \n      ColSpMatrix temp;\n      grabMatrix(matrix, temp);\n      Base::analyzePattern(temp);\n    }\n    /** Compute the LDL^T supernodal numerical factorization of \\p matrix \n      * \n      */\n    void factorize(const MatrixType& matrix)\n    {\n      ColSpMatrix temp;\n      grabMatrix(matrix, temp);\n      Base::factorize(temp);\n    }\n\n  protected:\n    using Base::m_iparm;\n    \n    void init()\n    {\n      m_iparm(IPARM_SYM) = API_SYM_YES;\n      m_iparm(IPARM_FACTORIZATION) = API_FACT_LDLT;\n    }\n    \n    void grabMatrix(const MatrixType& matrix, ColSpMatrix& out)\n    {\n      // Pastix supports only lower, column-major matrices \n      out.template selfadjointView<Lower>() = matrix.template selfadjointView<UpLo>();\n      internal::c_to_fortran_numbering(out);\n    }\n};\n\nnamespace internal {\n\ntemplate<typename _MatrixType, typename Rhs>\nstruct solve_retval<PastixBase<_MatrixType>, Rhs>\n  : solve_retval_base<PastixBase<_MatrixType>, Rhs>\n{\n  typedef PastixBase<_MatrixType> Dec;\n  EIGEN_MAKE_SOLVE_HELPERS(Dec,Rhs)\n\n  template<typename Dest> void evalTo(Dest& dst) const\n  {\n    dec()._solve(rhs(),dst);\n  }\n};\n\ntemplate<typename _MatrixType, typename Rhs>\nstruct sparse_solve_retval<PastixBase<_MatrixType>, Rhs>\n  : sparse_solve_retval_base<PastixBase<_MatrixType>, Rhs>\n{\n  typedef PastixBase<_MatrixType> Dec;\n  EIGEN_MAKE_SPARSE_SOLVE_HELPERS(Dec,Rhs)\n\n  template<typename Dest> void evalTo(Dest& dst) const\n  {\n    this->defaultEvalTo(dst);\n  }\n};\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif\n"
  },
  {
    "path": "libs/eigen/Eigen/src/PardisoSupport/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_PardisoSupport_SRCS \"*.h\")\n\nINSTALL(FILES \n  ${Eigen_PardisoSupport_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/PardisoSupport COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/Eigen/src/PardisoSupport/PardisoSupport.h",
    "content": "/*\n Copyright (c) 2011, Intel Corporation. All rights reserved.\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n * Neither the name of Intel Corporation nor the names of its contributors may\n   be used to endorse or promote products derived from this software without\n   specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\n ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n ********************************************************************************\n *   Content : Eigen bindings to Intel(R) MKL PARDISO\n ********************************************************************************\n*/\n\n#ifndef EIGEN_PARDISOSUPPORT_H\n#define EIGEN_PARDISOSUPPORT_H\n\nnamespace Eigen { \n\ntemplate<typename _MatrixType> class PardisoLU;\ntemplate<typename _MatrixType, int Options=Upper> class PardisoLLT;\ntemplate<typename _MatrixType, int Options=Upper> class PardisoLDLT;\n\nnamespace internal\n{\n  template<typename Index>\n  struct pardiso_run_selector\n  {\n    static Index run( _MKL_DSS_HANDLE_t pt, Index maxfct, Index mnum, Index type, Index phase, Index n, void *a,\n                      Index *ia, Index *ja, Index *perm, Index nrhs, Index *iparm, Index msglvl, void *b, void *x)\n    {\n      Index error = 0;\n      ::pardiso(pt, &maxfct, &mnum, &type, &phase, &n, a, ia, ja, perm, &nrhs, iparm, &msglvl, b, x, &error);\n      return error;\n    }\n  };\n  template<>\n  struct pardiso_run_selector<long long int>\n  {\n    typedef long long int Index;\n    static Index run( _MKL_DSS_HANDLE_t pt, Index maxfct, Index mnum, Index type, Index phase, Index n, void *a,\n                      Index *ia, Index *ja, Index *perm, Index nrhs, Index *iparm, Index msglvl, void *b, void *x)\n    {\n      Index error = 0;\n      ::pardiso_64(pt, &maxfct, &mnum, &type, &phase, &n, a, ia, ja, perm, &nrhs, iparm, &msglvl, b, x, &error);\n      return error;\n    }\n  };\n\n  template<class Pardiso> struct pardiso_traits;\n\n  template<typename _MatrixType>\n  struct pardiso_traits< PardisoLU<_MatrixType> >\n  {\n    typedef _MatrixType MatrixType;\n    typedef typename _MatrixType::Scalar Scalar;\n    typedef typename _MatrixType::RealScalar RealScalar;\n    typedef typename _MatrixType::Index Index;\n  };\n\n  template<typename _MatrixType, int Options>\n  struct pardiso_traits< PardisoLLT<_MatrixType, Options> >\n  {\n    typedef _MatrixType MatrixType;\n    typedef typename _MatrixType::Scalar Scalar;\n    typedef typename _MatrixType::RealScalar RealScalar;\n    typedef typename _MatrixType::Index Index;\n  };\n\n  template<typename _MatrixType, int Options>\n  struct pardiso_traits< PardisoLDLT<_MatrixType, Options> >\n  {\n    typedef _MatrixType MatrixType;\n    typedef typename _MatrixType::Scalar Scalar;\n    typedef typename _MatrixType::RealScalar RealScalar;\n    typedef typename _MatrixType::Index Index;    \n  };\n\n}\n\ntemplate<class Derived>\nclass PardisoImpl\n{\n    typedef internal::pardiso_traits<Derived> Traits;\n  public:\n    typedef typename Traits::MatrixType MatrixType;\n    typedef typename Traits::Scalar Scalar;\n    typedef typename Traits::RealScalar RealScalar;\n    typedef typename Traits::Index Index;\n    typedef SparseMatrix<Scalar,RowMajor,Index> SparseMatrixType;\n    typedef Matrix<Scalar,Dynamic,1> VectorType;\n    typedef Matrix<Index, 1, MatrixType::ColsAtCompileTime> IntRowVectorType;\n    typedef Matrix<Index, MatrixType::RowsAtCompileTime, 1> IntColVectorType;\n    typedef Array<Index,64,1,DontAlign> ParameterType;\n    enum {\n      ScalarIsComplex = NumTraits<Scalar>::IsComplex\n    };\n\n    PardisoImpl()\n    {\n      eigen_assert((sizeof(Index) >= sizeof(_INTEGER_t) && sizeof(Index) <= 8) && \"Non-supported index type\");\n      m_iparm.setZero();\n      m_msglvl = 0; // No output\n      m_initialized = false;\n    }\n\n    ~PardisoImpl()\n    {\n      pardisoRelease();\n    }\n\n    inline Index cols() const { return m_size; }\n    inline Index rows() const { return m_size; }\n  \n    /** \\brief Reports whether previous computation was successful.\n      *\n      * \\returns \\c Success if computation was succesful,\n      *          \\c NumericalIssue if the matrix appears to be negative.\n      */\n    ComputationInfo info() const\n    {\n      eigen_assert(m_initialized && \"Decomposition is not initialized.\");\n      return m_info;\n    }\n\n    /** \\warning for advanced usage only.\n      * \\returns a reference to the parameter array controlling PARDISO.\n      * See the PARDISO manual to know how to use it. */\n    ParameterType& pardisoParameterArray()\n    {\n      return m_iparm;\n    }\n    \n    /** Performs a symbolic decomposition on the sparcity of \\a matrix.\n      *\n      * This function is particularly useful when solving for several problems having the same structure.\n      * \n      * \\sa factorize()\n      */\n    Derived& analyzePattern(const MatrixType& matrix);\n    \n    /** Performs a numeric decomposition of \\a matrix\n      *\n      * The given matrix must has the same sparcity than the matrix on which the symbolic decomposition has been performed.\n      *\n      * \\sa analyzePattern()\n      */\n    Derived& factorize(const MatrixType& matrix);\n\n    Derived& compute(const MatrixType& matrix);\n    \n    /** \\returns the solution x of \\f$ A x = b \\f$ using the current decomposition of A.\n      *\n      * \\sa compute()\n      */\n    template<typename Rhs>\n    inline const internal::solve_retval<PardisoImpl, Rhs>\n    solve(const MatrixBase<Rhs>& b) const\n    {\n      eigen_assert(m_initialized && \"Pardiso solver is not initialized.\");\n      eigen_assert(rows()==b.rows()\n                && \"PardisoImpl::solve(): invalid number of rows of the right hand side matrix b\");\n      return internal::solve_retval<PardisoImpl, Rhs>(*this, b.derived());\n    }\n\n    /** \\returns the solution x of \\f$ A x = b \\f$ using the current decomposition of A.\n      *\n      * \\sa compute()\n      */\n    template<typename Rhs>\n    inline const internal::sparse_solve_retval<PardisoImpl, Rhs>\n    solve(const SparseMatrixBase<Rhs>& b) const\n    {\n      eigen_assert(m_initialized && \"Pardiso solver is not initialized.\");\n      eigen_assert(rows()==b.rows()\n                && \"PardisoImpl::solve(): invalid number of rows of the right hand side matrix b\");\n      return internal::sparse_solve_retval<PardisoImpl, Rhs>(*this, b.derived());\n    }\n\n    Derived& derived()\n    {\n      return *static_cast<Derived*>(this);\n    }\n    const Derived& derived() const\n    {\n      return *static_cast<const Derived*>(this);\n    }\n\n    template<typename BDerived, typename XDerived>\n    bool _solve(const MatrixBase<BDerived> &b, MatrixBase<XDerived>& x) const;\n\n  protected:\n    void pardisoRelease()\n    {\n      if(m_initialized) // Factorization ran at least once\n      {\n        internal::pardiso_run_selector<Index>::run(m_pt, 1, 1, m_type, -1, m_size, 0, 0, 0, m_perm.data(), 0,\n                                                   m_iparm.data(), m_msglvl, 0, 0);\n      }\n    }\n\n    void pardisoInit(int type)\n    {\n      m_type = type;\n      bool symmetric = std::abs(m_type) < 10;\n      m_iparm[0] = 1;   // No solver default\n      m_iparm[1] = 2;   // use Metis for the ordering\n      m_iparm[2] = 0;   // Reserved. Set to zero. (??Numbers of processors, value of OMP_NUM_THREADS??)\n      m_iparm[3] = 0;   // No iterative-direct algorithm\n      m_iparm[4] = 0;   // No user fill-in reducing permutation\n      m_iparm[5] = 0;   // Write solution into x, b is left unchanged\n      m_iparm[6] = 0;   // Not in use\n      m_iparm[7] = 2;   // Max numbers of iterative refinement steps\n      m_iparm[8] = 0;   // Not in use\n      m_iparm[9] = 13;  // Perturb the pivot elements with 1E-13\n      m_iparm[10] = symmetric ? 0 : 1; // Use nonsymmetric permutation and scaling MPS\n      m_iparm[11] = 0;  // Not in use\n      m_iparm[12] = symmetric ? 0 : 1;  // Maximum weighted matching algorithm is switched-off (default for symmetric).\n                                        // Try m_iparm[12] = 1 in case of inappropriate accuracy\n      m_iparm[13] = 0;  // Output: Number of perturbed pivots\n      m_iparm[14] = 0;  // Not in use\n      m_iparm[15] = 0;  // Not in use\n      m_iparm[16] = 0;  // Not in use\n      m_iparm[17] = -1; // Output: Number of nonzeros in the factor LU\n      m_iparm[18] = -1; // Output: Mflops for LU factorization\n      m_iparm[19] = 0;  // Output: Numbers of CG Iterations\n      \n      m_iparm[20] = 0;  // 1x1 pivoting\n      m_iparm[26] = 0;  // No matrix checker\n      m_iparm[27] = (sizeof(RealScalar) == 4) ? 1 : 0;\n      m_iparm[34] = 1;  // C indexing\n      m_iparm[36] = 0;  // CSR\n      m_iparm[59] = 0;  // 0 - In-Core ; 1 - Automatic switch between In-Core and Out-of-Core modes ; 2 - Out-of-Core\n      \n      memset(m_pt, 0, sizeof(m_pt));\n    }\n\n  protected:\n    // cached data to reduce reallocation, etc.\n    \n    void manageErrorCode(Index error)\n    {\n      switch(error)\n      {\n        case 0:\n          m_info = Success;\n          break;\n        case -4:\n        case -7:\n          m_info = NumericalIssue;\n          break;\n        default:\n          m_info = InvalidInput;\n      }\n    }\n\n    mutable SparseMatrixType m_matrix;\n    ComputationInfo m_info;\n    bool m_initialized, m_analysisIsOk, m_factorizationIsOk;\n    Index m_type, m_msglvl;\n    mutable void *m_pt[64];\n    mutable ParameterType m_iparm;\n    mutable IntColVectorType m_perm;\n    Index m_size;\n    \n  private:\n    PardisoImpl(PardisoImpl &) {}\n};\n\ntemplate<class Derived>\nDerived& PardisoImpl<Derived>::compute(const MatrixType& a)\n{\n  m_size = a.rows();\n  eigen_assert(a.rows() == a.cols());\n\n  pardisoRelease();\n  memset(m_pt, 0, sizeof(m_pt));\n  m_perm.setZero(m_size);\n  derived().getMatrix(a);\n  \n  Index error;\n  error = internal::pardiso_run_selector<Index>::run(m_pt, 1, 1, m_type, 12, m_size,\n                                                     m_matrix.valuePtr(), m_matrix.outerIndexPtr(), m_matrix.innerIndexPtr(),\n                                                     m_perm.data(), 0, m_iparm.data(), m_msglvl, NULL, NULL);\n\n  manageErrorCode(error);\n  m_analysisIsOk = true;\n  m_factorizationIsOk = true;\n  m_initialized = true;\n  return derived();\n}\n\ntemplate<class Derived>\nDerived& PardisoImpl<Derived>::analyzePattern(const MatrixType& a)\n{\n  m_size = a.rows();\n  eigen_assert(m_size == a.cols());\n\n  pardisoRelease();\n  memset(m_pt, 0, sizeof(m_pt));\n  m_perm.setZero(m_size);\n  derived().getMatrix(a);\n  \n  Index error;\n  error = internal::pardiso_run_selector<Index>::run(m_pt, 1, 1, m_type, 11, m_size,\n                                                     m_matrix.valuePtr(), m_matrix.outerIndexPtr(), m_matrix.innerIndexPtr(),\n                                                     m_perm.data(), 0, m_iparm.data(), m_msglvl, NULL, NULL);\n  \n  manageErrorCode(error);\n  m_analysisIsOk = true;\n  m_factorizationIsOk = false;\n  m_initialized = true;\n  return derived();\n}\n\ntemplate<class Derived>\nDerived& PardisoImpl<Derived>::factorize(const MatrixType& a)\n{\n  eigen_assert(m_analysisIsOk && \"You must first call analyzePattern()\");\n  eigen_assert(m_size == a.rows() && m_size == a.cols());\n  \n  derived().getMatrix(a);\n\n  Index error;  \n  error = internal::pardiso_run_selector<Index>::run(m_pt, 1, 1, m_type, 22, m_size,\n                                                     m_matrix.valuePtr(), m_matrix.outerIndexPtr(), m_matrix.innerIndexPtr(),\n                                                     m_perm.data(), 0, m_iparm.data(), m_msglvl, NULL, NULL);\n  \n  manageErrorCode(error);\n  m_factorizationIsOk = true;\n  return derived();\n}\n\ntemplate<class Base>\ntemplate<typename BDerived,typename XDerived>\nbool PardisoImpl<Base>::_solve(const MatrixBase<BDerived> &b, MatrixBase<XDerived>& x) const\n{\n  if(m_iparm[0] == 0) // Factorization was not computed\n    return false;\n\n  //Index n = m_matrix.rows();\n  Index nrhs = Index(b.cols());\n  eigen_assert(m_size==b.rows());\n  eigen_assert(((MatrixBase<BDerived>::Flags & RowMajorBit) == 0 || nrhs == 1) && \"Row-major right hand sides are not supported\");\n  eigen_assert(((MatrixBase<XDerived>::Flags & RowMajorBit) == 0 || nrhs == 1) && \"Row-major matrices of unknowns are not supported\");\n  eigen_assert(((nrhs == 1) || b.outerStride() == b.rows()));\n\n\n//  switch (transposed) {\n//    case SvNoTrans    : m_iparm[11] = 0 ; break;\n//    case SvTranspose  : m_iparm[11] = 2 ; break;\n//    case SvAdjoint    : m_iparm[11] = 1 ; break;\n//    default:\n//      //std::cerr << \"Eigen: transposition  option \\\"\" << transposed << \"\\\" not supported by the PARDISO backend\\n\";\n//      m_iparm[11] = 0;\n//  }\n\n  Scalar* rhs_ptr = const_cast<Scalar*>(b.derived().data());\n  Matrix<Scalar,Dynamic,Dynamic,ColMajor> tmp;\n  \n  // Pardiso cannot solve in-place\n  if(rhs_ptr == x.derived().data())\n  {\n    tmp = b;\n    rhs_ptr = tmp.data();\n  }\n  \n  Index error;\n  error = internal::pardiso_run_selector<Index>::run(m_pt, 1, 1, m_type, 33, m_size,\n                                                     m_matrix.valuePtr(), m_matrix.outerIndexPtr(), m_matrix.innerIndexPtr(),\n                                                     m_perm.data(), nrhs, m_iparm.data(), m_msglvl,\n                                                     rhs_ptr, x.derived().data());\n  return error==0;\n}\n\n\n/** \\ingroup PardisoSupport_Module\n  * \\class PardisoLU\n  * \\brief A sparse direct LU factorization and solver based on the PARDISO library\n  *\n  * This class allows to solve for A.X = B sparse linear problems via a direct LU factorization\n  * using the Intel MKL PARDISO library. The sparse matrix A must be squared and invertible.\n  * The vectors or matrices X and B can be either dense or sparse.\n  *\n  * By default, it runs in in-core mode. To enable PARDISO's out-of-core feature, set:\n  * \\code solver.pardisoParameterArray()[59] = 1; \\endcode\n  *\n  * \\tparam _MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>\n  *\n  * \\sa \\ref TutorialSparseDirectSolvers\n  */\ntemplate<typename MatrixType>\nclass PardisoLU : public PardisoImpl< PardisoLU<MatrixType> >\n{\n  protected:\n    typedef PardisoImpl< PardisoLU<MatrixType> > Base;\n    typedef typename Base::Scalar Scalar;\n    typedef typename Base::RealScalar RealScalar;\n    using Base::pardisoInit;\n    using Base::m_matrix;\n    friend class PardisoImpl< PardisoLU<MatrixType> >;\n\n  public:\n\n    using Base::compute;\n    using Base::solve;\n\n    PardisoLU()\n      : Base()\n    {\n      pardisoInit(Base::ScalarIsComplex ? 13 : 11);\n    }\n\n    PardisoLU(const MatrixType& matrix)\n      : Base()\n    {\n      pardisoInit(Base::ScalarIsComplex ? 13 : 11);\n      compute(matrix);\n    }\n  protected:\n    void getMatrix(const MatrixType& matrix)\n    {\n      m_matrix = matrix;\n    }\n    \n  private:\n    PardisoLU(PardisoLU& ) {}\n};\n\n/** \\ingroup PardisoSupport_Module\n  * \\class PardisoLLT\n  * \\brief A sparse direct Cholesky (LLT) factorization and solver based on the PARDISO library\n  *\n  * This class allows to solve for A.X = B sparse linear problems via a LL^T Cholesky factorization\n  * using the Intel MKL PARDISO library. The sparse matrix A must be selfajoint and positive definite.\n  * The vectors or matrices X and B can be either dense or sparse.\n  *\n  * By default, it runs in in-core mode. To enable PARDISO's out-of-core feature, set:\n  * \\code solver.pardisoParameterArray()[59] = 1; \\endcode\n  *\n  * \\tparam MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>\n  * \\tparam UpLo can be any bitwise combination of Upper, Lower. The default is Upper, meaning only the upper triangular part has to be used.\n  *         Upper|Lower can be used to tell both triangular parts can be used as input.\n  *\n  * \\sa \\ref TutorialSparseDirectSolvers\n  */\ntemplate<typename MatrixType, int _UpLo>\nclass PardisoLLT : public PardisoImpl< PardisoLLT<MatrixType,_UpLo> >\n{\n  protected:\n    typedef PardisoImpl< PardisoLLT<MatrixType,_UpLo> > Base;\n    typedef typename Base::Scalar Scalar;\n    typedef typename Base::Index Index;\n    typedef typename Base::RealScalar RealScalar;\n    using Base::pardisoInit;\n    using Base::m_matrix;\n    friend class PardisoImpl< PardisoLLT<MatrixType,_UpLo> >;\n\n  public:\n\n    enum { UpLo = _UpLo };\n    using Base::compute;\n    using Base::solve;\n\n    PardisoLLT()\n      : Base()\n    {\n      pardisoInit(Base::ScalarIsComplex ? 4 : 2);\n    }\n\n    PardisoLLT(const MatrixType& matrix)\n      : Base()\n    {\n      pardisoInit(Base::ScalarIsComplex ? 4 : 2);\n      compute(matrix);\n    }\n    \n  protected:\n    \n    void getMatrix(const MatrixType& matrix)\n    {\n      // PARDISO supports only upper, row-major matrices\n      PermutationMatrix<Dynamic,Dynamic,Index> p_null;\n      m_matrix.resize(matrix.rows(), matrix.cols());\n      m_matrix.template selfadjointView<Upper>() = matrix.template selfadjointView<UpLo>().twistedBy(p_null);\n    }\n    \n  private:\n    PardisoLLT(PardisoLLT& ) {}\n};\n\n/** \\ingroup PardisoSupport_Module\n  * \\class PardisoLDLT\n  * \\brief A sparse direct Cholesky (LDLT) factorization and solver based on the PARDISO library\n  *\n  * This class allows to solve for A.X = B sparse linear problems via a LDL^T Cholesky factorization\n  * using the Intel MKL PARDISO library. The sparse matrix A is assumed to be selfajoint and positive definite.\n  * For complex matrices, A can also be symmetric only, see the \\a Options template parameter.\n  * The vectors or matrices X and B can be either dense or sparse.\n  *\n  * By default, it runs in in-core mode. To enable PARDISO's out-of-core feature, set:\n  * \\code solver.pardisoParameterArray()[59] = 1; \\endcode\n  *\n  * \\tparam MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>\n  * \\tparam Options can be any bitwise combination of Upper, Lower, and Symmetric. The default is Upper, meaning only the upper triangular part has to be used.\n  *         Symmetric can be used for symmetric, non-selfadjoint complex matrices, the default being to assume a selfadjoint matrix.\n  *         Upper|Lower can be used to tell both triangular parts can be used as input.\n  *\n  * \\sa \\ref TutorialSparseDirectSolvers\n  */\ntemplate<typename MatrixType, int Options>\nclass PardisoLDLT : public PardisoImpl< PardisoLDLT<MatrixType,Options> >\n{\n  protected:\n    typedef PardisoImpl< PardisoLDLT<MatrixType,Options> > Base;\n    typedef typename Base::Scalar Scalar;\n    typedef typename Base::Index Index;\n    typedef typename Base::RealScalar RealScalar;\n    using Base::pardisoInit;\n    using Base::m_matrix;\n    friend class PardisoImpl< PardisoLDLT<MatrixType,Options> >;\n\n  public:\n\n    using Base::compute;\n    using Base::solve;\n    enum { UpLo = Options&(Upper|Lower) };\n\n    PardisoLDLT()\n      : Base()\n    {\n      pardisoInit(Base::ScalarIsComplex ? ( bool(Options&Symmetric) ? 6 : -4 ) : -2);\n    }\n\n    PardisoLDLT(const MatrixType& matrix)\n      : Base()\n    {\n      pardisoInit(Base::ScalarIsComplex ? ( bool(Options&Symmetric) ? 6 : -4 ) : -2);\n      compute(matrix);\n    }\n    \n    void getMatrix(const MatrixType& matrix)\n    {\n      // PARDISO supports only upper, row-major matrices\n      PermutationMatrix<Dynamic,Dynamic,Index> p_null;\n      m_matrix.resize(matrix.rows(), matrix.cols());\n      m_matrix.template selfadjointView<Upper>() = matrix.template selfadjointView<UpLo>().twistedBy(p_null);\n    }\n    \n  private:\n    PardisoLDLT(PardisoLDLT& ) {}\n};\n\nnamespace internal {\n  \ntemplate<typename _Derived, typename Rhs>\nstruct solve_retval<PardisoImpl<_Derived>, Rhs>\n  : solve_retval_base<PardisoImpl<_Derived>, Rhs>\n{\n  typedef PardisoImpl<_Derived> Dec;\n  EIGEN_MAKE_SOLVE_HELPERS(Dec,Rhs)\n\n  template<typename Dest> void evalTo(Dest& dst) const\n  {\n    dec()._solve(rhs(),dst);\n  }\n};\n\ntemplate<typename Derived, typename Rhs>\nstruct sparse_solve_retval<PardisoImpl<Derived>, Rhs>\n  : sparse_solve_retval_base<PardisoImpl<Derived>, Rhs>\n{\n  typedef PardisoImpl<Derived> Dec;\n  EIGEN_MAKE_SPARSE_SOLVE_HELPERS(Dec,Rhs)\n\n  template<typename Dest> void evalTo(Dest& dst) const\n  {\n    this->defaultEvalTo(dst);\n  }\n};\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_PARDISOSUPPORT_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/QR/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_QR_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_QR_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/QR COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/Eigen/src/QR/ColPivHouseholderQR.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_COLPIVOTINGHOUSEHOLDERQR_H\n#define EIGEN_COLPIVOTINGHOUSEHOLDERQR_H\n\nnamespace Eigen { \n\n/** \\ingroup QR_Module\n  *\n  * \\class ColPivHouseholderQR\n  *\n  * \\brief Householder rank-revealing QR decomposition of a matrix with column-pivoting\n  *\n  * \\param MatrixType the type of the matrix of which we are computing the QR decomposition\n  *\n  * This class performs a rank-revealing QR decomposition of a matrix \\b A into matrices \\b P, \\b Q and \\b R\n  * such that \n  * \\f[\n  *  \\mathbf{A} \\, \\mathbf{P} = \\mathbf{Q} \\, \\mathbf{R}\n  * \\f]\n  * by using Householder transformations. Here, \\b P is a permutation matrix, \\b Q a unitary matrix and \\b R an \n  * upper triangular matrix.\n  *\n  * This decomposition performs column pivoting in order to be rank-revealing and improve\n  * numerical stability. It is slower than HouseholderQR, and faster than FullPivHouseholderQR.\n  *\n  * \\sa MatrixBase::colPivHouseholderQr()\n  */\ntemplate<typename _MatrixType> class ColPivHouseholderQR\n{\n  public:\n\n    typedef _MatrixType MatrixType;\n    enum {\n      RowsAtCompileTime = MatrixType::RowsAtCompileTime,\n      ColsAtCompileTime = MatrixType::ColsAtCompileTime,\n      Options = MatrixType::Options,\n      MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,\n      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime\n    };\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename MatrixType::RealScalar RealScalar;\n    typedef typename MatrixType::Index Index;\n    typedef Matrix<Scalar, RowsAtCompileTime, RowsAtCompileTime, Options, MaxRowsAtCompileTime, MaxRowsAtCompileTime> MatrixQType;\n    typedef typename internal::plain_diag_type<MatrixType>::type HCoeffsType;\n    typedef PermutationMatrix<ColsAtCompileTime, MaxColsAtCompileTime> PermutationType;\n    typedef typename internal::plain_row_type<MatrixType, Index>::type IntRowVectorType;\n    typedef typename internal::plain_row_type<MatrixType>::type RowVectorType;\n    typedef typename internal::plain_row_type<MatrixType, RealScalar>::type RealRowVectorType;\n    typedef HouseholderSequence<MatrixType,typename internal::remove_all<typename HCoeffsType::ConjugateReturnType>::type> HouseholderSequenceType;\n    \n  private:\n    \n    typedef typename PermutationType::Index PermIndexType;\n    \n  public:\n\n    /**\n    * \\brief Default Constructor.\n    *\n    * The default constructor is useful in cases in which the user intends to\n    * perform decompositions via ColPivHouseholderQR::compute(const MatrixType&).\n    */\n    ColPivHouseholderQR()\n      : m_qr(),\n        m_hCoeffs(),\n        m_colsPermutation(),\n        m_colsTranspositions(),\n        m_temp(),\n        m_colSqNorms(),\n        m_isInitialized(false),\n        m_usePrescribedThreshold(false) {}\n\n    /** \\brief Default Constructor with memory preallocation\n      *\n      * Like the default constructor but with preallocation of the internal data\n      * according to the specified problem \\a size.\n      * \\sa ColPivHouseholderQR()\n      */\n    ColPivHouseholderQR(Index rows, Index cols)\n      : m_qr(rows, cols),\n        m_hCoeffs((std::min)(rows,cols)),\n        m_colsPermutation(PermIndexType(cols)),\n        m_colsTranspositions(cols),\n        m_temp(cols),\n        m_colSqNorms(cols),\n        m_isInitialized(false),\n        m_usePrescribedThreshold(false) {}\n\n    /** \\brief Constructs a QR factorization from a given matrix\n      *\n      * This constructor computes the QR factorization of the matrix \\a matrix by calling\n      * the method compute(). It is a short cut for:\n      * \n      * \\code\n      * ColPivHouseholderQR<MatrixType> qr(matrix.rows(), matrix.cols());\n      * qr.compute(matrix);\n      * \\endcode\n      * \n      * \\sa compute()\n      */\n    ColPivHouseholderQR(const MatrixType& matrix)\n      : m_qr(matrix.rows(), matrix.cols()),\n        m_hCoeffs((std::min)(matrix.rows(),matrix.cols())),\n        m_colsPermutation(PermIndexType(matrix.cols())),\n        m_colsTranspositions(matrix.cols()),\n        m_temp(matrix.cols()),\n        m_colSqNorms(matrix.cols()),\n        m_isInitialized(false),\n        m_usePrescribedThreshold(false)\n    {\n      compute(matrix);\n    }\n\n    /** This method finds a solution x to the equation Ax=b, where A is the matrix of which\n      * *this is the QR decomposition, if any exists.\n      *\n      * \\param b the right-hand-side of the equation to solve.\n      *\n      * \\returns a solution.\n      *\n      * \\note The case where b is a matrix is not yet implemented. Also, this\n      *       code is space inefficient.\n      *\n      * \\note_about_checking_solutions\n      *\n      * \\note_about_arbitrary_choice_of_solution\n      *\n      * Example: \\include ColPivHouseholderQR_solve.cpp\n      * Output: \\verbinclude ColPivHouseholderQR_solve.out\n      */\n    template<typename Rhs>\n    inline const internal::solve_retval<ColPivHouseholderQR, Rhs>\n    solve(const MatrixBase<Rhs>& b) const\n    {\n      eigen_assert(m_isInitialized && \"ColPivHouseholderQR is not initialized.\");\n      return internal::solve_retval<ColPivHouseholderQR, Rhs>(*this, b.derived());\n    }\n\n    HouseholderSequenceType householderQ(void) const;\n    HouseholderSequenceType matrixQ(void) const\n    {\n      return householderQ(); \n    }\n\n    /** \\returns a reference to the matrix where the Householder QR decomposition is stored\n      */\n    const MatrixType& matrixQR() const\n    {\n      eigen_assert(m_isInitialized && \"ColPivHouseholderQR is not initialized.\");\n      return m_qr;\n    }\n    \n    /** \\returns a reference to the matrix where the result Householder QR is stored \n     * \\warning The strict lower part of this matrix contains internal values. \n     * Only the upper triangular part should be referenced. To get it, use\n     * \\code matrixR().template triangularView<Upper>() \\endcode\n     * For rank-deficient matrices, use \n     * \\code \n     * matrixR().topLeftCorner(rank(), rank()).template triangularView<Upper>() \n     * \\endcode\n     */\n    const MatrixType& matrixR() const\n    {\n      eigen_assert(m_isInitialized && \"ColPivHouseholderQR is not initialized.\");\n      return m_qr;\n    }\n    \n    ColPivHouseholderQR& compute(const MatrixType& matrix);\n\n    /** \\returns a const reference to the column permutation matrix */\n    const PermutationType& colsPermutation() const\n    {\n      eigen_assert(m_isInitialized && \"ColPivHouseholderQR is not initialized.\");\n      return m_colsPermutation;\n    }\n\n    /** \\returns the absolute value of the determinant of the matrix of which\n      * *this is the QR decomposition. It has only linear complexity\n      * (that is, O(n) where n is the dimension of the square matrix)\n      * as the QR decomposition has already been computed.\n      *\n      * \\note This is only for square matrices.\n      *\n      * \\warning a determinant can be very big or small, so for matrices\n      * of large enough dimension, there is a risk of overflow/underflow.\n      * One way to work around that is to use logAbsDeterminant() instead.\n      *\n      * \\sa logAbsDeterminant(), MatrixBase::determinant()\n      */\n    typename MatrixType::RealScalar absDeterminant() const;\n\n    /** \\returns the natural log of the absolute value of the determinant of the matrix of which\n      * *this is the QR decomposition. It has only linear complexity\n      * (that is, O(n) where n is the dimension of the square matrix)\n      * as the QR decomposition has already been computed.\n      *\n      * \\note This is only for square matrices.\n      *\n      * \\note This method is useful to work around the risk of overflow/underflow that's inherent\n      * to determinant computation.\n      *\n      * \\sa absDeterminant(), MatrixBase::determinant()\n      */\n    typename MatrixType::RealScalar logAbsDeterminant() const;\n\n    /** \\returns the rank of the matrix of which *this is the QR decomposition.\n      *\n      * \\note This method has to determine which pivots should be considered nonzero.\n      *       For that, it uses the threshold value that you can control by calling\n      *       setThreshold(const RealScalar&).\n      */\n    inline Index rank() const\n    {\n      using std::abs;\n      eigen_assert(m_isInitialized && \"ColPivHouseholderQR is not initialized.\");\n      RealScalar premultiplied_threshold = abs(m_maxpivot) * threshold();\n      Index result = 0;\n      for(Index i = 0; i < m_nonzero_pivots; ++i)\n        result += (abs(m_qr.coeff(i,i)) > premultiplied_threshold);\n      return result;\n    }\n\n    /** \\returns the dimension of the kernel of the matrix of which *this is the QR decomposition.\n      *\n      * \\note This method has to determine which pivots should be considered nonzero.\n      *       For that, it uses the threshold value that you can control by calling\n      *       setThreshold(const RealScalar&).\n      */\n    inline Index dimensionOfKernel() const\n    {\n      eigen_assert(m_isInitialized && \"ColPivHouseholderQR is not initialized.\");\n      return cols() - rank();\n    }\n\n    /** \\returns true if the matrix of which *this is the QR decomposition represents an injective\n      *          linear map, i.e. has trivial kernel; false otherwise.\n      *\n      * \\note This method has to determine which pivots should be considered nonzero.\n      *       For that, it uses the threshold value that you can control by calling\n      *       setThreshold(const RealScalar&).\n      */\n    inline bool isInjective() const\n    {\n      eigen_assert(m_isInitialized && \"ColPivHouseholderQR is not initialized.\");\n      return rank() == cols();\n    }\n\n    /** \\returns true if the matrix of which *this is the QR decomposition represents a surjective\n      *          linear map; false otherwise.\n      *\n      * \\note This method has to determine which pivots should be considered nonzero.\n      *       For that, it uses the threshold value that you can control by calling\n      *       setThreshold(const RealScalar&).\n      */\n    inline bool isSurjective() const\n    {\n      eigen_assert(m_isInitialized && \"ColPivHouseholderQR is not initialized.\");\n      return rank() == rows();\n    }\n\n    /** \\returns true if the matrix of which *this is the QR decomposition is invertible.\n      *\n      * \\note This method has to determine which pivots should be considered nonzero.\n      *       For that, it uses the threshold value that you can control by calling\n      *       setThreshold(const RealScalar&).\n      */\n    inline bool isInvertible() const\n    {\n      eigen_assert(m_isInitialized && \"ColPivHouseholderQR is not initialized.\");\n      return isInjective() && isSurjective();\n    }\n\n    /** \\returns the inverse of the matrix of which *this is the QR decomposition.\n      *\n      * \\note If this matrix is not invertible, the returned matrix has undefined coefficients.\n      *       Use isInvertible() to first determine whether this matrix is invertible.\n      */\n    inline const\n    internal::solve_retval<ColPivHouseholderQR, typename MatrixType::IdentityReturnType>\n    inverse() const\n    {\n      eigen_assert(m_isInitialized && \"ColPivHouseholderQR is not initialized.\");\n      return internal::solve_retval<ColPivHouseholderQR,typename MatrixType::IdentityReturnType>\n               (*this, MatrixType::Identity(m_qr.rows(), m_qr.cols()));\n    }\n\n    inline Index rows() const { return m_qr.rows(); }\n    inline Index cols() const { return m_qr.cols(); }\n    \n    /** \\returns a const reference to the vector of Householder coefficients used to represent the factor \\c Q.\n      * \n      * For advanced uses only.\n      */\n    const HCoeffsType& hCoeffs() const { return m_hCoeffs; }\n\n    /** Allows to prescribe a threshold to be used by certain methods, such as rank(),\n      * who need to determine when pivots are to be considered nonzero. This is not used for the\n      * QR decomposition itself.\n      *\n      * When it needs to get the threshold value, Eigen calls threshold(). By default, this\n      * uses a formula to automatically determine a reasonable threshold.\n      * Once you have called the present method setThreshold(const RealScalar&),\n      * your value is used instead.\n      *\n      * \\param threshold The new value to use as the threshold.\n      *\n      * A pivot will be considered nonzero if its absolute value is strictly greater than\n      *  \\f$ \\vert pivot \\vert \\leqslant threshold \\times \\vert maxpivot \\vert \\f$\n      * where maxpivot is the biggest pivot.\n      *\n      * If you want to come back to the default behavior, call setThreshold(Default_t)\n      */\n    ColPivHouseholderQR& setThreshold(const RealScalar& threshold)\n    {\n      m_usePrescribedThreshold = true;\n      m_prescribedThreshold = threshold;\n      return *this;\n    }\n\n    /** Allows to come back to the default behavior, letting Eigen use its default formula for\n      * determining the threshold.\n      *\n      * You should pass the special object Eigen::Default as parameter here.\n      * \\code qr.setThreshold(Eigen::Default); \\endcode\n      *\n      * See the documentation of setThreshold(const RealScalar&).\n      */\n    ColPivHouseholderQR& setThreshold(Default_t)\n    {\n      m_usePrescribedThreshold = false;\n      return *this;\n    }\n\n    /** Returns the threshold that will be used by certain methods such as rank().\n      *\n      * See the documentation of setThreshold(const RealScalar&).\n      */\n    RealScalar threshold() const\n    {\n      eigen_assert(m_isInitialized || m_usePrescribedThreshold);\n      return m_usePrescribedThreshold ? m_prescribedThreshold\n      // this formula comes from experimenting (see \"LU precision tuning\" thread on the list)\n      // and turns out to be identical to Higham's formula used already in LDLt.\n                                      : NumTraits<Scalar>::epsilon() * RealScalar(m_qr.diagonalSize());\n    }\n\n    /** \\returns the number of nonzero pivots in the QR decomposition.\n      * Here nonzero is meant in the exact sense, not in a fuzzy sense.\n      * So that notion isn't really intrinsically interesting, but it is\n      * still useful when implementing algorithms.\n      *\n      * \\sa rank()\n      */\n    inline Index nonzeroPivots() const\n    {\n      eigen_assert(m_isInitialized && \"ColPivHouseholderQR is not initialized.\");\n      return m_nonzero_pivots;\n    }\n\n    /** \\returns the absolute value of the biggest pivot, i.e. the biggest\n      *          diagonal coefficient of R.\n      */\n    RealScalar maxPivot() const { return m_maxpivot; }\n    \n    /** \\brief Reports whether the QR factorization was succesful.\n      *\n      * \\note This function always returns \\c Success. It is provided for compatibility \n      * with other factorization routines.\n      * \\returns \\c Success \n      */\n    ComputationInfo info() const\n    {\n      eigen_assert(m_isInitialized && \"Decomposition is not initialized.\");\n      return Success;\n    }\n\n  protected:\n    \n    static void check_template_parameters()\n    {\n      EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar);\n    }\n    \n    MatrixType m_qr;\n    HCoeffsType m_hCoeffs;\n    PermutationType m_colsPermutation;\n    IntRowVectorType m_colsTranspositions;\n    RowVectorType m_temp;\n    RealRowVectorType m_colSqNorms;\n    bool m_isInitialized, m_usePrescribedThreshold;\n    RealScalar m_prescribedThreshold, m_maxpivot;\n    Index m_nonzero_pivots;\n    Index m_det_pq;\n};\n\ntemplate<typename MatrixType>\ntypename MatrixType::RealScalar ColPivHouseholderQR<MatrixType>::absDeterminant() const\n{\n  using std::abs;\n  eigen_assert(m_isInitialized && \"ColPivHouseholderQR is not initialized.\");\n  eigen_assert(m_qr.rows() == m_qr.cols() && \"You can't take the determinant of a non-square matrix!\");\n  return abs(m_qr.diagonal().prod());\n}\n\ntemplate<typename MatrixType>\ntypename MatrixType::RealScalar ColPivHouseholderQR<MatrixType>::logAbsDeterminant() const\n{\n  eigen_assert(m_isInitialized && \"ColPivHouseholderQR is not initialized.\");\n  eigen_assert(m_qr.rows() == m_qr.cols() && \"You can't take the determinant of a non-square matrix!\");\n  return m_qr.diagonal().cwiseAbs().array().log().sum();\n}\n\n/** Performs the QR factorization of the given matrix \\a matrix. The result of\n  * the factorization is stored into \\c *this, and a reference to \\c *this\n  * is returned.\n  *\n  * \\sa class ColPivHouseholderQR, ColPivHouseholderQR(const MatrixType&)\n  */\ntemplate<typename MatrixType>\nColPivHouseholderQR<MatrixType>& ColPivHouseholderQR<MatrixType>::compute(const MatrixType& matrix)\n{\n  check_template_parameters();\n  \n  using std::abs;\n  Index rows = matrix.rows();\n  Index cols = matrix.cols();\n  Index size = matrix.diagonalSize();\n  \n  // the column permutation is stored as int indices, so just to be sure:\n  eigen_assert(cols<=NumTraits<int>::highest());\n\n  m_qr = matrix;\n  m_hCoeffs.resize(size);\n\n  m_temp.resize(cols);\n\n  m_colsTranspositions.resize(matrix.cols());\n  Index number_of_transpositions = 0;\n\n  m_colSqNorms.resize(cols);\n  for(Index k = 0; k < cols; ++k)\n    m_colSqNorms.coeffRef(k) = m_qr.col(k).squaredNorm();\n\n  RealScalar threshold_helper = m_colSqNorms.maxCoeff() * numext::abs2(NumTraits<Scalar>::epsilon()) / RealScalar(rows);\n\n  m_nonzero_pivots = size; // the generic case is that in which all pivots are nonzero (invertible case)\n  m_maxpivot = RealScalar(0);\n\n  for(Index k = 0; k < size; ++k)\n  {\n    // first, we look up in our table m_colSqNorms which column has the biggest squared norm\n    Index biggest_col_index;\n    RealScalar biggest_col_sq_norm = m_colSqNorms.tail(cols-k).maxCoeff(&biggest_col_index);\n    biggest_col_index += k;\n\n    // since our table m_colSqNorms accumulates imprecision at every step, we must now recompute\n    // the actual squared norm of the selected column.\n    // Note that not doing so does result in solve() sometimes returning inf/nan values\n    // when running the unit test with 1000 repetitions.\n    biggest_col_sq_norm = m_qr.col(biggest_col_index).tail(rows-k).squaredNorm();\n\n    // we store that back into our table: it can't hurt to correct our table.\n    m_colSqNorms.coeffRef(biggest_col_index) = biggest_col_sq_norm;\n\n    // Track the number of meaningful pivots but do not stop the decomposition to make\n    // sure that the initial matrix is properly reproduced. See bug 941.\n    if(m_nonzero_pivots==size && biggest_col_sq_norm < threshold_helper * RealScalar(rows-k))\n      m_nonzero_pivots = k;\n\n    // apply the transposition to the columns\n    m_colsTranspositions.coeffRef(k) = biggest_col_index;\n    if(k != biggest_col_index) {\n      m_qr.col(k).swap(m_qr.col(biggest_col_index));\n      std::swap(m_colSqNorms.coeffRef(k), m_colSqNorms.coeffRef(biggest_col_index));\n      ++number_of_transpositions;\n    }\n\n    // generate the householder vector, store it below the diagonal\n    RealScalar beta;\n    m_qr.col(k).tail(rows-k).makeHouseholderInPlace(m_hCoeffs.coeffRef(k), beta);\n\n    // apply the householder transformation to the diagonal coefficient\n    m_qr.coeffRef(k,k) = beta;\n\n    // remember the maximum absolute value of diagonal coefficients\n    if(abs(beta) > m_maxpivot) m_maxpivot = abs(beta);\n\n    // apply the householder transformation\n    m_qr.bottomRightCorner(rows-k, cols-k-1)\n        .applyHouseholderOnTheLeft(m_qr.col(k).tail(rows-k-1), m_hCoeffs.coeffRef(k), &m_temp.coeffRef(k+1));\n\n    // update our table of squared norms of the columns\n    m_colSqNorms.tail(cols-k-1) -= m_qr.row(k).tail(cols-k-1).cwiseAbs2();\n  }\n\n  m_colsPermutation.setIdentity(PermIndexType(cols));\n  for(PermIndexType k = 0; k < size/*m_nonzero_pivots*/; ++k)\n    m_colsPermutation.applyTranspositionOnTheRight(k, PermIndexType(m_colsTranspositions.coeff(k)));\n\n  m_det_pq = (number_of_transpositions%2) ? -1 : 1;\n  m_isInitialized = true;\n\n  return *this;\n}\n\nnamespace internal {\n\ntemplate<typename _MatrixType, typename Rhs>\nstruct solve_retval<ColPivHouseholderQR<_MatrixType>, Rhs>\n  : solve_retval_base<ColPivHouseholderQR<_MatrixType>, Rhs>\n{\n  EIGEN_MAKE_SOLVE_HELPERS(ColPivHouseholderQR<_MatrixType>,Rhs)\n\n  template<typename Dest> void evalTo(Dest& dst) const\n  {\n    eigen_assert(rhs().rows() == dec().rows());\n\n    const Index cols = dec().cols(),\n\t\t\t\tnonzero_pivots = dec().nonzeroPivots();\n\n    if(nonzero_pivots == 0)\n    {\n      dst.setZero();\n      return;\n    }\n\n    typename Rhs::PlainObject c(rhs());\n\n    // Note that the matrix Q = H_0^* H_1^*... so its inverse is Q^* = (H_0 H_1 ...)^T\n    c.applyOnTheLeft(householderSequence(dec().matrixQR(), dec().hCoeffs())\n                     .setLength(dec().nonzeroPivots())\n\t\t     .transpose()\n      );\n\n    dec().matrixR()\n       .topLeftCorner(nonzero_pivots, nonzero_pivots)\n       .template triangularView<Upper>()\n       .solveInPlace(c.topRows(nonzero_pivots));\n\n    for(Index i = 0; i < nonzero_pivots; ++i) dst.row(dec().colsPermutation().indices().coeff(i)) = c.row(i);\n    for(Index i = nonzero_pivots; i < cols; ++i) dst.row(dec().colsPermutation().indices().coeff(i)).setZero();\n  }\n};\n\n} // end namespace internal\n\n/** \\returns the matrix Q as a sequence of householder transformations.\n  * You can extract the meaningful part only by using:\n  * \\code qr.householderQ().setLength(qr.nonzeroPivots()) \\endcode*/\ntemplate<typename MatrixType>\ntypename ColPivHouseholderQR<MatrixType>::HouseholderSequenceType ColPivHouseholderQR<MatrixType>\n  ::householderQ() const\n{\n  eigen_assert(m_isInitialized && \"ColPivHouseholderQR is not initialized.\");\n  return HouseholderSequenceType(m_qr, m_hCoeffs.conjugate());\n}\n\n/** \\return the column-pivoting Householder QR decomposition of \\c *this.\n  *\n  * \\sa class ColPivHouseholderQR\n  */\ntemplate<typename Derived>\nconst ColPivHouseholderQR<typename MatrixBase<Derived>::PlainObject>\nMatrixBase<Derived>::colPivHouseholderQr() const\n{\n  return ColPivHouseholderQR<PlainObject>(eval());\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_COLPIVOTINGHOUSEHOLDERQR_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/QR/ColPivHouseholderQR_MKL.h",
    "content": "/*\n Copyright (c) 2011, Intel Corporation. All rights reserved.\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n * Neither the name of Intel Corporation nor the names of its contributors may\n   be used to endorse or promote products derived from this software without\n   specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\n ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n ********************************************************************************\n *   Content : Eigen bindings to Intel(R) MKL\n *    Householder QR decomposition of a matrix with column pivoting based on\n *    LAPACKE_?geqp3 function.\n ********************************************************************************\n*/\n\n#ifndef EIGEN_COLPIVOTINGHOUSEHOLDERQR_MKL_H\n#define EIGEN_COLPIVOTINGHOUSEHOLDERQR_MKL_H\n\n#include \"Eigen/src/Core/util/MKL_support.h\"\n\nnamespace Eigen { \n\n/** \\internal Specialization for the data types supported by MKL */\n\n#define EIGEN_MKL_QR_COLPIV(EIGTYPE, MKLTYPE, MKLPREFIX, EIGCOLROW, MKLCOLROW) \\\ntemplate<> inline \\\nColPivHouseholderQR<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW, Dynamic, Dynamic> >& \\\nColPivHouseholderQR<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW, Dynamic, Dynamic> >::compute( \\\n              const Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW, Dynamic, Dynamic>& matrix) \\\n\\\n{ \\\n  using std::abs; \\\n  typedef Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW, Dynamic, Dynamic> MatrixType; \\\n  typedef MatrixType::RealScalar RealScalar; \\\n  Index rows = matrix.rows();\\\n  Index cols = matrix.cols();\\\n  Index size = matrix.diagonalSize();\\\n\\\n  m_qr = matrix;\\\n  m_hCoeffs.resize(size);\\\n\\\n  m_colsTranspositions.resize(cols);\\\n  /*Index number_of_transpositions = 0;*/ \\\n\\\n  m_nonzero_pivots = 0; \\\n  m_maxpivot = RealScalar(0);\\\n  m_colsPermutation.resize(cols); \\\n  m_colsPermutation.indices().setZero(); \\\n\\\n  lapack_int lda = m_qr.outerStride(), i; \\\n  lapack_int matrix_order = MKLCOLROW; \\\n  LAPACKE_##MKLPREFIX##geqp3( matrix_order, rows, cols, (MKLTYPE*)m_qr.data(), lda, (lapack_int*)m_colsPermutation.indices().data(), (MKLTYPE*)m_hCoeffs.data()); \\\n  m_isInitialized = true; \\\n  m_maxpivot=m_qr.diagonal().cwiseAbs().maxCoeff(); \\\n  m_hCoeffs.adjointInPlace(); \\\n  RealScalar premultiplied_threshold = abs(m_maxpivot) * threshold(); \\\n  lapack_int *perm = m_colsPermutation.indices().data(); \\\n  for(i=0;i<size;i++) { \\\n    m_nonzero_pivots += (abs(m_qr.coeff(i,i)) > premultiplied_threshold);\\\n  } \\\n  for(i=0;i<cols;i++) perm[i]--;\\\n\\\n  /*m_det_pq = (number_of_transpositions%2) ? -1 : 1;  // TODO: It's not needed now; fix upon availability in Eigen */ \\\n\\\n  return *this; \\\n}\n\nEIGEN_MKL_QR_COLPIV(double,   double,        d, ColMajor, LAPACK_COL_MAJOR)\nEIGEN_MKL_QR_COLPIV(float,    float,         s, ColMajor, LAPACK_COL_MAJOR)\nEIGEN_MKL_QR_COLPIV(dcomplex, MKL_Complex16, z, ColMajor, LAPACK_COL_MAJOR)\nEIGEN_MKL_QR_COLPIV(scomplex, MKL_Complex8,  c, ColMajor, LAPACK_COL_MAJOR)\n\nEIGEN_MKL_QR_COLPIV(double,   double,        d, RowMajor, LAPACK_ROW_MAJOR)\nEIGEN_MKL_QR_COLPIV(float,    float,         s, RowMajor, LAPACK_ROW_MAJOR)\nEIGEN_MKL_QR_COLPIV(dcomplex, MKL_Complex16, z, RowMajor, LAPACK_ROW_MAJOR)\nEIGEN_MKL_QR_COLPIV(scomplex, MKL_Complex8,  c, RowMajor, LAPACK_ROW_MAJOR)\n\n} // end namespace Eigen\n\n#endif // EIGEN_COLPIVOTINGHOUSEHOLDERQR_MKL_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/QR/FullPivHouseholderQR.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_FULLPIVOTINGHOUSEHOLDERQR_H\n#define EIGEN_FULLPIVOTINGHOUSEHOLDERQR_H\n\nnamespace Eigen { \n\nnamespace internal {\n\ntemplate<typename MatrixType> struct FullPivHouseholderQRMatrixQReturnType;\n\ntemplate<typename MatrixType>\nstruct traits<FullPivHouseholderQRMatrixQReturnType<MatrixType> >\n{\n  typedef typename MatrixType::PlainObject ReturnType;\n};\n\n}\n\n/** \\ingroup QR_Module\n  *\n  * \\class FullPivHouseholderQR\n  *\n  * \\brief Householder rank-revealing QR decomposition of a matrix with full pivoting\n  *\n  * \\param MatrixType the type of the matrix of which we are computing the QR decomposition\n  *\n  * This class performs a rank-revealing QR decomposition of a matrix \\b A into matrices \\b P, \\b Q and \\b R\n  * such that \n  * \\f[\n  *  \\mathbf{A} \\, \\mathbf{P} = \\mathbf{Q} \\, \\mathbf{R}\n  * \\f]\n  * by using Householder transformations. Here, \\b P is a permutation matrix, \\b Q a unitary matrix and \\b R an \n  * upper triangular matrix.\n  *\n  * This decomposition performs a very prudent full pivoting in order to be rank-revealing and achieve optimal\n  * numerical stability. The trade-off is that it is slower than HouseholderQR and ColPivHouseholderQR.\n  *\n  * \\sa MatrixBase::fullPivHouseholderQr()\n  */\ntemplate<typename _MatrixType> class FullPivHouseholderQR\n{\n  public:\n\n    typedef _MatrixType MatrixType;\n    enum {\n      RowsAtCompileTime = MatrixType::RowsAtCompileTime,\n      ColsAtCompileTime = MatrixType::ColsAtCompileTime,\n      Options = MatrixType::Options,\n      MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,\n      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime\n    };\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename MatrixType::RealScalar RealScalar;\n    typedef typename MatrixType::Index Index;\n    typedef internal::FullPivHouseholderQRMatrixQReturnType<MatrixType> MatrixQReturnType;\n    typedef typename internal::plain_diag_type<MatrixType>::type HCoeffsType;\n    typedef Matrix<Index, 1,\n                   EIGEN_SIZE_MIN_PREFER_DYNAMIC(ColsAtCompileTime,RowsAtCompileTime), RowMajor, 1,\n                   EIGEN_SIZE_MIN_PREFER_FIXED(MaxColsAtCompileTime,MaxRowsAtCompileTime)> IntDiagSizeVectorType;\n    typedef PermutationMatrix<ColsAtCompileTime, MaxColsAtCompileTime> PermutationType;\n    typedef typename internal::plain_row_type<MatrixType>::type RowVectorType;\n    typedef typename internal::plain_col_type<MatrixType>::type ColVectorType;\n\n    /** \\brief Default Constructor.\n      *\n      * The default constructor is useful in cases in which the user intends to\n      * perform decompositions via FullPivHouseholderQR::compute(const MatrixType&).\n      */\n    FullPivHouseholderQR()\n      : m_qr(),\n        m_hCoeffs(),\n        m_rows_transpositions(),\n        m_cols_transpositions(),\n        m_cols_permutation(),\n        m_temp(),\n        m_isInitialized(false),\n        m_usePrescribedThreshold(false) {}\n\n    /** \\brief Default Constructor with memory preallocation\n      *\n      * Like the default constructor but with preallocation of the internal data\n      * according to the specified problem \\a size.\n      * \\sa FullPivHouseholderQR()\n      */\n    FullPivHouseholderQR(Index rows, Index cols)\n      : m_qr(rows, cols),\n        m_hCoeffs((std::min)(rows,cols)),\n        m_rows_transpositions((std::min)(rows,cols)),\n        m_cols_transpositions((std::min)(rows,cols)),\n        m_cols_permutation(cols),\n        m_temp(cols),\n        m_isInitialized(false),\n        m_usePrescribedThreshold(false) {}\n\n    /** \\brief Constructs a QR factorization from a given matrix\n      *\n      * This constructor computes the QR factorization of the matrix \\a matrix by calling\n      * the method compute(). It is a short cut for:\n      * \n      * \\code\n      * FullPivHouseholderQR<MatrixType> qr(matrix.rows(), matrix.cols());\n      * qr.compute(matrix);\n      * \\endcode\n      * \n      * \\sa compute()\n      */\n    FullPivHouseholderQR(const MatrixType& matrix)\n      : m_qr(matrix.rows(), matrix.cols()),\n        m_hCoeffs((std::min)(matrix.rows(), matrix.cols())),\n        m_rows_transpositions((std::min)(matrix.rows(), matrix.cols())),\n        m_cols_transpositions((std::min)(matrix.rows(), matrix.cols())),\n        m_cols_permutation(matrix.cols()),\n        m_temp(matrix.cols()),\n        m_isInitialized(false),\n        m_usePrescribedThreshold(false)\n    {\n      compute(matrix);\n    }\n\n    /** This method finds a solution x to the equation Ax=b, where A is the matrix of which\n      * \\c *this is the QR decomposition.\n      *\n      * \\param b the right-hand-side of the equation to solve.\n      *\n      * \\returns the exact or least-square solution if the rank is greater or equal to the number of columns of A,\n      * and an arbitrary solution otherwise.\n      *\n      * \\note The case where b is a matrix is not yet implemented. Also, this\n      *       code is space inefficient.\n      *\n      * \\note_about_checking_solutions\n      *\n      * \\note_about_arbitrary_choice_of_solution\n      *\n      * Example: \\include FullPivHouseholderQR_solve.cpp\n      * Output: \\verbinclude FullPivHouseholderQR_solve.out\n      */\n    template<typename Rhs>\n    inline const internal::solve_retval<FullPivHouseholderQR, Rhs>\n    solve(const MatrixBase<Rhs>& b) const\n    {\n      eigen_assert(m_isInitialized && \"FullPivHouseholderQR is not initialized.\");\n      return internal::solve_retval<FullPivHouseholderQR, Rhs>(*this, b.derived());\n    }\n\n    /** \\returns Expression object representing the matrix Q\n      */\n    MatrixQReturnType matrixQ(void) const;\n\n    /** \\returns a reference to the matrix where the Householder QR decomposition is stored\n      */\n    const MatrixType& matrixQR() const\n    {\n      eigen_assert(m_isInitialized && \"FullPivHouseholderQR is not initialized.\");\n      return m_qr;\n    }\n\n    FullPivHouseholderQR& compute(const MatrixType& matrix);\n\n    /** \\returns a const reference to the column permutation matrix */\n    const PermutationType& colsPermutation() const\n    {\n      eigen_assert(m_isInitialized && \"FullPivHouseholderQR is not initialized.\");\n      return m_cols_permutation;\n    }\n\n    /** \\returns a const reference to the vector of indices representing the rows transpositions */\n    const IntDiagSizeVectorType& rowsTranspositions() const\n    {\n      eigen_assert(m_isInitialized && \"FullPivHouseholderQR is not initialized.\");\n      return m_rows_transpositions;\n    }\n\n    /** \\returns the absolute value of the determinant of the matrix of which\n      * *this is the QR decomposition. It has only linear complexity\n      * (that is, O(n) where n is the dimension of the square matrix)\n      * as the QR decomposition has already been computed.\n      *\n      * \\note This is only for square matrices.\n      *\n      * \\warning a determinant can be very big or small, so for matrices\n      * of large enough dimension, there is a risk of overflow/underflow.\n      * One way to work around that is to use logAbsDeterminant() instead.\n      *\n      * \\sa logAbsDeterminant(), MatrixBase::determinant()\n      */\n    typename MatrixType::RealScalar absDeterminant() const;\n\n    /** \\returns the natural log of the absolute value of the determinant of the matrix of which\n      * *this is the QR decomposition. It has only linear complexity\n      * (that is, O(n) where n is the dimension of the square matrix)\n      * as the QR decomposition has already been computed.\n      *\n      * \\note This is only for square matrices.\n      *\n      * \\note This method is useful to work around the risk of overflow/underflow that's inherent\n      * to determinant computation.\n      *\n      * \\sa absDeterminant(), MatrixBase::determinant()\n      */\n    typename MatrixType::RealScalar logAbsDeterminant() const;\n\n    /** \\returns the rank of the matrix of which *this is the QR decomposition.\n      *\n      * \\note This method has to determine which pivots should be considered nonzero.\n      *       For that, it uses the threshold value that you can control by calling\n      *       setThreshold(const RealScalar&).\n      */\n    inline Index rank() const\n    {\n      using std::abs;\n      eigen_assert(m_isInitialized && \"FullPivHouseholderQR is not initialized.\");\n      RealScalar premultiplied_threshold = abs(m_maxpivot) * threshold();\n      Index result = 0;\n      for(Index i = 0; i < m_nonzero_pivots; ++i)\n        result += (abs(m_qr.coeff(i,i)) > premultiplied_threshold);\n      return result;\n    }\n\n    /** \\returns the dimension of the kernel of the matrix of which *this is the QR decomposition.\n      *\n      * \\note This method has to determine which pivots should be considered nonzero.\n      *       For that, it uses the threshold value that you can control by calling\n      *       setThreshold(const RealScalar&).\n      */\n    inline Index dimensionOfKernel() const\n    {\n      eigen_assert(m_isInitialized && \"FullPivHouseholderQR is not initialized.\");\n      return cols() - rank();\n    }\n\n    /** \\returns true if the matrix of which *this is the QR decomposition represents an injective\n      *          linear map, i.e. has trivial kernel; false otherwise.\n      *\n      * \\note This method has to determine which pivots should be considered nonzero.\n      *       For that, it uses the threshold value that you can control by calling\n      *       setThreshold(const RealScalar&).\n      */\n    inline bool isInjective() const\n    {\n      eigen_assert(m_isInitialized && \"FullPivHouseholderQR is not initialized.\");\n      return rank() == cols();\n    }\n\n    /** \\returns true if the matrix of which *this is the QR decomposition represents a surjective\n      *          linear map; false otherwise.\n      *\n      * \\note This method has to determine which pivots should be considered nonzero.\n      *       For that, it uses the threshold value that you can control by calling\n      *       setThreshold(const RealScalar&).\n      */\n    inline bool isSurjective() const\n    {\n      eigen_assert(m_isInitialized && \"FullPivHouseholderQR is not initialized.\");\n      return rank() == rows();\n    }\n\n    /** \\returns true if the matrix of which *this is the QR decomposition is invertible.\n      *\n      * \\note This method has to determine which pivots should be considered nonzero.\n      *       For that, it uses the threshold value that you can control by calling\n      *       setThreshold(const RealScalar&).\n      */\n    inline bool isInvertible() const\n    {\n      eigen_assert(m_isInitialized && \"FullPivHouseholderQR is not initialized.\");\n      return isInjective() && isSurjective();\n    }\n\n    /** \\returns the inverse of the matrix of which *this is the QR decomposition.\n      *\n      * \\note If this matrix is not invertible, the returned matrix has undefined coefficients.\n      *       Use isInvertible() to first determine whether this matrix is invertible.\n      */    inline const\n    internal::solve_retval<FullPivHouseholderQR, typename MatrixType::IdentityReturnType>\n    inverse() const\n    {\n      eigen_assert(m_isInitialized && \"FullPivHouseholderQR is not initialized.\");\n      return internal::solve_retval<FullPivHouseholderQR,typename MatrixType::IdentityReturnType>\n               (*this, MatrixType::Identity(m_qr.rows(), m_qr.cols()));\n    }\n\n    inline Index rows() const { return m_qr.rows(); }\n    inline Index cols() const { return m_qr.cols(); }\n    \n    /** \\returns a const reference to the vector of Householder coefficients used to represent the factor \\c Q.\n      * \n      * For advanced uses only.\n      */\n    const HCoeffsType& hCoeffs() const { return m_hCoeffs; }\n\n    /** Allows to prescribe a threshold to be used by certain methods, such as rank(),\n      * who need to determine when pivots are to be considered nonzero. This is not used for the\n      * QR decomposition itself.\n      *\n      * When it needs to get the threshold value, Eigen calls threshold(). By default, this\n      * uses a formula to automatically determine a reasonable threshold.\n      * Once you have called the present method setThreshold(const RealScalar&),\n      * your value is used instead.\n      *\n      * \\param threshold The new value to use as the threshold.\n      *\n      * A pivot will be considered nonzero if its absolute value is strictly greater than\n      *  \\f$ \\vert pivot \\vert \\leqslant threshold \\times \\vert maxpivot \\vert \\f$\n      * where maxpivot is the biggest pivot.\n      *\n      * If you want to come back to the default behavior, call setThreshold(Default_t)\n      */\n    FullPivHouseholderQR& setThreshold(const RealScalar& threshold)\n    {\n      m_usePrescribedThreshold = true;\n      m_prescribedThreshold = threshold;\n      return *this;\n    }\n\n    /** Allows to come back to the default behavior, letting Eigen use its default formula for\n      * determining the threshold.\n      *\n      * You should pass the special object Eigen::Default as parameter here.\n      * \\code qr.setThreshold(Eigen::Default); \\endcode\n      *\n      * See the documentation of setThreshold(const RealScalar&).\n      */\n    FullPivHouseholderQR& setThreshold(Default_t)\n    {\n      m_usePrescribedThreshold = false;\n      return *this;\n    }\n\n    /** Returns the threshold that will be used by certain methods such as rank().\n      *\n      * See the documentation of setThreshold(const RealScalar&).\n      */\n    RealScalar threshold() const\n    {\n      eigen_assert(m_isInitialized || m_usePrescribedThreshold);\n      return m_usePrescribedThreshold ? m_prescribedThreshold\n      // this formula comes from experimenting (see \"LU precision tuning\" thread on the list)\n      // and turns out to be identical to Higham's formula used already in LDLt.\n                                      : NumTraits<Scalar>::epsilon() * RealScalar(m_qr.diagonalSize());\n    }\n\n    /** \\returns the number of nonzero pivots in the QR decomposition.\n      * Here nonzero is meant in the exact sense, not in a fuzzy sense.\n      * So that notion isn't really intrinsically interesting, but it is\n      * still useful when implementing algorithms.\n      *\n      * \\sa rank()\n      */\n    inline Index nonzeroPivots() const\n    {\n      eigen_assert(m_isInitialized && \"LU is not initialized.\");\n      return m_nonzero_pivots;\n    }\n\n    /** \\returns the absolute value of the biggest pivot, i.e. the biggest\n      *          diagonal coefficient of U.\n      */\n    RealScalar maxPivot() const { return m_maxpivot; }\n\n  protected:\n    \n    static void check_template_parameters()\n    {\n      EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar);\n    }\n    \n    MatrixType m_qr;\n    HCoeffsType m_hCoeffs;\n    IntDiagSizeVectorType m_rows_transpositions;\n    IntDiagSizeVectorType m_cols_transpositions;\n    PermutationType m_cols_permutation;\n    RowVectorType m_temp;\n    bool m_isInitialized, m_usePrescribedThreshold;\n    RealScalar m_prescribedThreshold, m_maxpivot;\n    Index m_nonzero_pivots;\n    RealScalar m_precision;\n    Index m_det_pq;\n};\n\ntemplate<typename MatrixType>\ntypename MatrixType::RealScalar FullPivHouseholderQR<MatrixType>::absDeterminant() const\n{\n  using std::abs;\n  eigen_assert(m_isInitialized && \"FullPivHouseholderQR is not initialized.\");\n  eigen_assert(m_qr.rows() == m_qr.cols() && \"You can't take the determinant of a non-square matrix!\");\n  return abs(m_qr.diagonal().prod());\n}\n\ntemplate<typename MatrixType>\ntypename MatrixType::RealScalar FullPivHouseholderQR<MatrixType>::logAbsDeterminant() const\n{\n  eigen_assert(m_isInitialized && \"FullPivHouseholderQR is not initialized.\");\n  eigen_assert(m_qr.rows() == m_qr.cols() && \"You can't take the determinant of a non-square matrix!\");\n  return m_qr.diagonal().cwiseAbs().array().log().sum();\n}\n\n/** Performs the QR factorization of the given matrix \\a matrix. The result of\n  * the factorization is stored into \\c *this, and a reference to \\c *this\n  * is returned.\n  *\n  * \\sa class FullPivHouseholderQR, FullPivHouseholderQR(const MatrixType&)\n  */\ntemplate<typename MatrixType>\nFullPivHouseholderQR<MatrixType>& FullPivHouseholderQR<MatrixType>::compute(const MatrixType& matrix)\n{\n  check_template_parameters();\n  \n  using std::abs;\n  Index rows = matrix.rows();\n  Index cols = matrix.cols();\n  Index size = (std::min)(rows,cols);\n\n  m_qr = matrix;\n  m_hCoeffs.resize(size);\n\n  m_temp.resize(cols);\n\n  m_precision = NumTraits<Scalar>::epsilon() * RealScalar(size);\n\n  m_rows_transpositions.resize(size);\n  m_cols_transpositions.resize(size);\n  Index number_of_transpositions = 0;\n\n  RealScalar biggest(0);\n\n  m_nonzero_pivots = size; // the generic case is that in which all pivots are nonzero (invertible case)\n  m_maxpivot = RealScalar(0);\n\n  for (Index k = 0; k < size; ++k)\n  {\n    Index row_of_biggest_in_corner, col_of_biggest_in_corner;\n    RealScalar biggest_in_corner;\n\n    biggest_in_corner = m_qr.bottomRightCorner(rows-k, cols-k)\n                            .cwiseAbs()\n                            .maxCoeff(&row_of_biggest_in_corner, &col_of_biggest_in_corner);\n    row_of_biggest_in_corner += k;\n    col_of_biggest_in_corner += k;\n    if(k==0) biggest = biggest_in_corner;\n\n    // if the corner is negligible, then we have less than full rank, and we can finish early\n    if(internal::isMuchSmallerThan(biggest_in_corner, biggest, m_precision))\n    {\n      m_nonzero_pivots = k;\n      for(Index i = k; i < size; i++)\n      {\n        m_rows_transpositions.coeffRef(i) = i;\n        m_cols_transpositions.coeffRef(i) = i;\n        m_hCoeffs.coeffRef(i) = Scalar(0);\n      }\n      break;\n    }\n\n    m_rows_transpositions.coeffRef(k) = row_of_biggest_in_corner;\n    m_cols_transpositions.coeffRef(k) = col_of_biggest_in_corner;\n    if(k != row_of_biggest_in_corner) {\n      m_qr.row(k).tail(cols-k).swap(m_qr.row(row_of_biggest_in_corner).tail(cols-k));\n      ++number_of_transpositions;\n    }\n    if(k != col_of_biggest_in_corner) {\n      m_qr.col(k).swap(m_qr.col(col_of_biggest_in_corner));\n      ++number_of_transpositions;\n    }\n\n    RealScalar beta;\n    m_qr.col(k).tail(rows-k).makeHouseholderInPlace(m_hCoeffs.coeffRef(k), beta);\n    m_qr.coeffRef(k,k) = beta;\n\n    // remember the maximum absolute value of diagonal coefficients\n    if(abs(beta) > m_maxpivot) m_maxpivot = abs(beta);\n\n    m_qr.bottomRightCorner(rows-k, cols-k-1)\n        .applyHouseholderOnTheLeft(m_qr.col(k).tail(rows-k-1), m_hCoeffs.coeffRef(k), &m_temp.coeffRef(k+1));\n  }\n\n  m_cols_permutation.setIdentity(cols);\n  for(Index k = 0; k < size; ++k)\n    m_cols_permutation.applyTranspositionOnTheRight(k, m_cols_transpositions.coeff(k));\n\n  m_det_pq = (number_of_transpositions%2) ? -1 : 1;\n  m_isInitialized = true;\n\n  return *this;\n}\n\nnamespace internal {\n\ntemplate<typename _MatrixType, typename Rhs>\nstruct solve_retval<FullPivHouseholderQR<_MatrixType>, Rhs>\n  : solve_retval_base<FullPivHouseholderQR<_MatrixType>, Rhs>\n{\n  EIGEN_MAKE_SOLVE_HELPERS(FullPivHouseholderQR<_MatrixType>,Rhs)\n\n  template<typename Dest> void evalTo(Dest& dst) const\n  {\n    const Index rows = dec().rows(), cols = dec().cols();\n    eigen_assert(rhs().rows() == rows);\n\n    // FIXME introduce nonzeroPivots() and use it here. and more generally,\n    // make the same improvements in this dec as in FullPivLU.\n    if(dec().rank()==0)\n    {\n      dst.setZero();\n      return;\n    }\n\n    typename Rhs::PlainObject c(rhs());\n\n    Matrix<Scalar,1,Rhs::ColsAtCompileTime> temp(rhs().cols());\n    for (Index k = 0; k < dec().rank(); ++k)\n    {\n      Index remainingSize = rows-k;\n      c.row(k).swap(c.row(dec().rowsTranspositions().coeff(k)));\n      c.bottomRightCorner(remainingSize, rhs().cols())\n       .applyHouseholderOnTheLeft(dec().matrixQR().col(k).tail(remainingSize-1),\n                                  dec().hCoeffs().coeff(k), &temp.coeffRef(0));\n    }\n\n    dec().matrixQR()\n       .topLeftCorner(dec().rank(), dec().rank())\n       .template triangularView<Upper>()\n       .solveInPlace(c.topRows(dec().rank()));\n\n    for(Index i = 0; i < dec().rank(); ++i) dst.row(dec().colsPermutation().indices().coeff(i)) = c.row(i);\n    for(Index i = dec().rank(); i < cols; ++i) dst.row(dec().colsPermutation().indices().coeff(i)).setZero();\n  }\n};\n\n/** \\ingroup QR_Module\n  *\n  * \\brief Expression type for return value of FullPivHouseholderQR::matrixQ()\n  *\n  * \\tparam MatrixType type of underlying dense matrix\n  */\ntemplate<typename MatrixType> struct FullPivHouseholderQRMatrixQReturnType\n  : public ReturnByValue<FullPivHouseholderQRMatrixQReturnType<MatrixType> >\n{\npublic:\n  typedef typename MatrixType::Index Index;\n  typedef typename FullPivHouseholderQR<MatrixType>::IntDiagSizeVectorType IntDiagSizeVectorType;\n  typedef typename internal::plain_diag_type<MatrixType>::type HCoeffsType;\n  typedef Matrix<typename MatrixType::Scalar, 1, MatrixType::RowsAtCompileTime, RowMajor, 1,\n                 MatrixType::MaxRowsAtCompileTime> WorkVectorType;\n\n  FullPivHouseholderQRMatrixQReturnType(const MatrixType&       qr,\n                                        const HCoeffsType&      hCoeffs,\n                                        const IntDiagSizeVectorType& rowsTranspositions)\n    : m_qr(qr),\n      m_hCoeffs(hCoeffs),\n      m_rowsTranspositions(rowsTranspositions)\n      {}\n\n  template <typename ResultType>\n  void evalTo(ResultType& result) const\n  {\n    const Index rows = m_qr.rows();\n    WorkVectorType workspace(rows);\n    evalTo(result, workspace);\n  }\n\n  template <typename ResultType>\n  void evalTo(ResultType& result, WorkVectorType& workspace) const\n  {\n    using numext::conj;\n    // compute the product H'_0 H'_1 ... H'_n-1,\n    // where H_k is the k-th Householder transformation I - h_k v_k v_k'\n    // and v_k is the k-th Householder vector [1,m_qr(k+1,k), m_qr(k+2,k), ...]\n    const Index rows = m_qr.rows();\n    const Index cols = m_qr.cols();\n    const Index size = (std::min)(rows, cols);\n    workspace.resize(rows);\n    result.setIdentity(rows, rows);\n    for (Index k = size-1; k >= 0; k--)\n    {\n      result.block(k, k, rows-k, rows-k)\n            .applyHouseholderOnTheLeft(m_qr.col(k).tail(rows-k-1), conj(m_hCoeffs.coeff(k)), &workspace.coeffRef(k));\n      result.row(k).swap(result.row(m_rowsTranspositions.coeff(k)));\n    }\n  }\n\n    Index rows() const { return m_qr.rows(); }\n    Index cols() const { return m_qr.rows(); }\n\nprotected:\n  typename MatrixType::Nested m_qr;\n  typename HCoeffsType::Nested m_hCoeffs;\n  typename IntDiagSizeVectorType::Nested m_rowsTranspositions;\n};\n\n} // end namespace internal\n\ntemplate<typename MatrixType>\ninline typename FullPivHouseholderQR<MatrixType>::MatrixQReturnType FullPivHouseholderQR<MatrixType>::matrixQ() const\n{\n  eigen_assert(m_isInitialized && \"FullPivHouseholderQR is not initialized.\");\n  return MatrixQReturnType(m_qr, m_hCoeffs, m_rows_transpositions);\n}\n\n/** \\return the full-pivoting Householder QR decomposition of \\c *this.\n  *\n  * \\sa class FullPivHouseholderQR\n  */\ntemplate<typename Derived>\nconst FullPivHouseholderQR<typename MatrixBase<Derived>::PlainObject>\nMatrixBase<Derived>::fullPivHouseholderQr() const\n{\n  return FullPivHouseholderQR<PlainObject>(eval());\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_FULLPIVOTINGHOUSEHOLDERQR_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/QR/HouseholderQR.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n// Copyright (C) 2010 Vincent Lejeune\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_QR_H\n#define EIGEN_QR_H\n\nnamespace Eigen { \n\n/** \\ingroup QR_Module\n  *\n  *\n  * \\class HouseholderQR\n  *\n  * \\brief Householder QR decomposition of a matrix\n  *\n  * \\param MatrixType the type of the matrix of which we are computing the QR decomposition\n  *\n  * This class performs a QR decomposition of a matrix \\b A into matrices \\b Q and \\b R\n  * such that \n  * \\f[\n  *  \\mathbf{A} = \\mathbf{Q} \\, \\mathbf{R}\n  * \\f]\n  * by using Householder transformations. Here, \\b Q a unitary matrix and \\b R an upper triangular matrix.\n  * The result is stored in a compact way compatible with LAPACK.\n  *\n  * Note that no pivoting is performed. This is \\b not a rank-revealing decomposition.\n  * If you want that feature, use FullPivHouseholderQR or ColPivHouseholderQR instead.\n  *\n  * This Householder QR decomposition is faster, but less numerically stable and less feature-full than\n  * FullPivHouseholderQR or ColPivHouseholderQR.\n  *\n  * \\sa MatrixBase::householderQr()\n  */\ntemplate<typename _MatrixType> class HouseholderQR\n{\n  public:\n\n    typedef _MatrixType MatrixType;\n    enum {\n      RowsAtCompileTime = MatrixType::RowsAtCompileTime,\n      ColsAtCompileTime = MatrixType::ColsAtCompileTime,\n      Options = MatrixType::Options,\n      MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,\n      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime\n    };\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename MatrixType::RealScalar RealScalar;\n    typedef typename MatrixType::Index Index;\n    typedef Matrix<Scalar, RowsAtCompileTime, RowsAtCompileTime, (MatrixType::Flags&RowMajorBit) ? RowMajor : ColMajor, MaxRowsAtCompileTime, MaxRowsAtCompileTime> MatrixQType;\n    typedef typename internal::plain_diag_type<MatrixType>::type HCoeffsType;\n    typedef typename internal::plain_row_type<MatrixType>::type RowVectorType;\n    typedef HouseholderSequence<MatrixType,typename internal::remove_all<typename HCoeffsType::ConjugateReturnType>::type> HouseholderSequenceType;\n\n    /**\n      * \\brief Default Constructor.\n      *\n      * The default constructor is useful in cases in which the user intends to\n      * perform decompositions via HouseholderQR::compute(const MatrixType&).\n      */\n    HouseholderQR() : m_qr(), m_hCoeffs(), m_temp(), m_isInitialized(false) {}\n\n    /** \\brief Default Constructor with memory preallocation\n      *\n      * Like the default constructor but with preallocation of the internal data\n      * according to the specified problem \\a size.\n      * \\sa HouseholderQR()\n      */\n    HouseholderQR(Index rows, Index cols)\n      : m_qr(rows, cols),\n        m_hCoeffs((std::min)(rows,cols)),\n        m_temp(cols),\n        m_isInitialized(false) {}\n\n    /** \\brief Constructs a QR factorization from a given matrix\n      *\n      * This constructor computes the QR factorization of the matrix \\a matrix by calling\n      * the method compute(). It is a short cut for:\n      * \n      * \\code\n      * HouseholderQR<MatrixType> qr(matrix.rows(), matrix.cols());\n      * qr.compute(matrix);\n      * \\endcode\n      * \n      * \\sa compute()\n      */\n    HouseholderQR(const MatrixType& matrix)\n      : m_qr(matrix.rows(), matrix.cols()),\n        m_hCoeffs((std::min)(matrix.rows(),matrix.cols())),\n        m_temp(matrix.cols()),\n        m_isInitialized(false)\n    {\n      compute(matrix);\n    }\n\n    /** This method finds a solution x to the equation Ax=b, where A is the matrix of which\n      * *this is the QR decomposition, if any exists.\n      *\n      * \\param b the right-hand-side of the equation to solve.\n      *\n      * \\returns a solution.\n      *\n      * \\note The case where b is a matrix is not yet implemented. Also, this\n      *       code is space inefficient.\n      *\n      * \\note_about_checking_solutions\n      *\n      * \\note_about_arbitrary_choice_of_solution\n      *\n      * Example: \\include HouseholderQR_solve.cpp\n      * Output: \\verbinclude HouseholderQR_solve.out\n      */\n    template<typename Rhs>\n    inline const internal::solve_retval<HouseholderQR, Rhs>\n    solve(const MatrixBase<Rhs>& b) const\n    {\n      eigen_assert(m_isInitialized && \"HouseholderQR is not initialized.\");\n      return internal::solve_retval<HouseholderQR, Rhs>(*this, b.derived());\n    }\n\n    /** This method returns an expression of the unitary matrix Q as a sequence of Householder transformations.\n      *\n      * The returned expression can directly be used to perform matrix products. It can also be assigned to a dense Matrix object.\n      * Here is an example showing how to recover the full or thin matrix Q, as well as how to perform matrix products using operator*:\n      *\n      * Example: \\include HouseholderQR_householderQ.cpp\n      * Output: \\verbinclude HouseholderQR_householderQ.out\n      */\n    HouseholderSequenceType householderQ() const\n    {\n      eigen_assert(m_isInitialized && \"HouseholderQR is not initialized.\");\n      return HouseholderSequenceType(m_qr, m_hCoeffs.conjugate());\n    }\n\n    /** \\returns a reference to the matrix where the Householder QR decomposition is stored\n      * in a LAPACK-compatible way.\n      */\n    const MatrixType& matrixQR() const\n    {\n        eigen_assert(m_isInitialized && \"HouseholderQR is not initialized.\");\n        return m_qr;\n    }\n\n    HouseholderQR& compute(const MatrixType& matrix);\n\n    /** \\returns the absolute value of the determinant of the matrix of which\n      * *this is the QR decomposition. It has only linear complexity\n      * (that is, O(n) where n is the dimension of the square matrix)\n      * as the QR decomposition has already been computed.\n      *\n      * \\note This is only for square matrices.\n      *\n      * \\warning a determinant can be very big or small, so for matrices\n      * of large enough dimension, there is a risk of overflow/underflow.\n      * One way to work around that is to use logAbsDeterminant() instead.\n      *\n      * \\sa logAbsDeterminant(), MatrixBase::determinant()\n      */\n    typename MatrixType::RealScalar absDeterminant() const;\n\n    /** \\returns the natural log of the absolute value of the determinant of the matrix of which\n      * *this is the QR decomposition. It has only linear complexity\n      * (that is, O(n) where n is the dimension of the square matrix)\n      * as the QR decomposition has already been computed.\n      *\n      * \\note This is only for square matrices.\n      *\n      * \\note This method is useful to work around the risk of overflow/underflow that's inherent\n      * to determinant computation.\n      *\n      * \\sa absDeterminant(), MatrixBase::determinant()\n      */\n    typename MatrixType::RealScalar logAbsDeterminant() const;\n\n    inline Index rows() const { return m_qr.rows(); }\n    inline Index cols() const { return m_qr.cols(); }\n    \n    /** \\returns a const reference to the vector of Householder coefficients used to represent the factor \\c Q.\n      * \n      * For advanced uses only.\n      */\n    const HCoeffsType& hCoeffs() const { return m_hCoeffs; }\n\n  protected:\n    \n    static void check_template_parameters()\n    {\n      EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar);\n    }\n    \n    MatrixType m_qr;\n    HCoeffsType m_hCoeffs;\n    RowVectorType m_temp;\n    bool m_isInitialized;\n};\n\ntemplate<typename MatrixType>\ntypename MatrixType::RealScalar HouseholderQR<MatrixType>::absDeterminant() const\n{\n  using std::abs;\n  eigen_assert(m_isInitialized && \"HouseholderQR is not initialized.\");\n  eigen_assert(m_qr.rows() == m_qr.cols() && \"You can't take the determinant of a non-square matrix!\");\n  return abs(m_qr.diagonal().prod());\n}\n\ntemplate<typename MatrixType>\ntypename MatrixType::RealScalar HouseholderQR<MatrixType>::logAbsDeterminant() const\n{\n  eigen_assert(m_isInitialized && \"HouseholderQR is not initialized.\");\n  eigen_assert(m_qr.rows() == m_qr.cols() && \"You can't take the determinant of a non-square matrix!\");\n  return m_qr.diagonal().cwiseAbs().array().log().sum();\n}\n\nnamespace internal {\n\n/** \\internal */\ntemplate<typename MatrixQR, typename HCoeffs>\nvoid householder_qr_inplace_unblocked(MatrixQR& mat, HCoeffs& hCoeffs, typename MatrixQR::Scalar* tempData = 0)\n{\n  typedef typename MatrixQR::Index Index;\n  typedef typename MatrixQR::Scalar Scalar;\n  typedef typename MatrixQR::RealScalar RealScalar;\n  Index rows = mat.rows();\n  Index cols = mat.cols();\n  Index size = (std::min)(rows,cols);\n\n  eigen_assert(hCoeffs.size() == size);\n\n  typedef Matrix<Scalar,MatrixQR::ColsAtCompileTime,1> TempType;\n  TempType tempVector;\n  if(tempData==0)\n  {\n    tempVector.resize(cols);\n    tempData = tempVector.data();\n  }\n\n  for(Index k = 0; k < size; ++k)\n  {\n    Index remainingRows = rows - k;\n    Index remainingCols = cols - k - 1;\n\n    RealScalar beta;\n    mat.col(k).tail(remainingRows).makeHouseholderInPlace(hCoeffs.coeffRef(k), beta);\n    mat.coeffRef(k,k) = beta;\n\n    // apply H to remaining part of m_qr from the left\n    mat.bottomRightCorner(remainingRows, remainingCols)\n        .applyHouseholderOnTheLeft(mat.col(k).tail(remainingRows-1), hCoeffs.coeffRef(k), tempData+k+1);\n  }\n}\n\n/** \\internal */\ntemplate<typename MatrixQR, typename HCoeffs,\n  typename MatrixQRScalar = typename MatrixQR::Scalar,\n  bool InnerStrideIsOne = (MatrixQR::InnerStrideAtCompileTime == 1 && HCoeffs::InnerStrideAtCompileTime == 1)>\nstruct householder_qr_inplace_blocked\n{\n  // This is specialized for MKL-supported Scalar types in HouseholderQR_MKL.h\n  static void run(MatrixQR& mat, HCoeffs& hCoeffs,\n      typename MatrixQR::Index maxBlockSize=32,\n      typename MatrixQR::Scalar* tempData = 0)\n  {\n    typedef typename MatrixQR::Index Index;\n    typedef typename MatrixQR::Scalar Scalar;\n    typedef Block<MatrixQR,Dynamic,Dynamic> BlockType;\n\n    Index rows = mat.rows();\n    Index cols = mat.cols();\n    Index size = (std::min)(rows, cols);\n\n    typedef Matrix<Scalar,Dynamic,1,ColMajor,MatrixQR::MaxColsAtCompileTime,1> TempType;\n    TempType tempVector;\n    if(tempData==0)\n    {\n      tempVector.resize(cols);\n      tempData = tempVector.data();\n    }\n\n    Index blockSize = (std::min)(maxBlockSize,size);\n\n    Index k = 0;\n    for (k = 0; k < size; k += blockSize)\n    {\n      Index bs = (std::min)(size-k,blockSize);  // actual size of the block\n      Index tcols = cols - k - bs;            // trailing columns\n      Index brows = rows-k;                   // rows of the block\n\n      // partition the matrix:\n      //        A00 | A01 | A02\n      // mat  = A10 | A11 | A12\n      //        A20 | A21 | A22\n      // and performs the qr dec of [A11^T A12^T]^T\n      // and update [A21^T A22^T]^T using level 3 operations.\n      // Finally, the algorithm continue on A22\n\n      BlockType A11_21 = mat.block(k,k,brows,bs);\n      Block<HCoeffs,Dynamic,1> hCoeffsSegment = hCoeffs.segment(k,bs);\n\n      householder_qr_inplace_unblocked(A11_21, hCoeffsSegment, tempData);\n\n      if(tcols)\n      {\n        BlockType A21_22 = mat.block(k,k+bs,brows,tcols);\n        apply_block_householder_on_the_left(A21_22,A11_21,hCoeffsSegment.adjoint());\n      }\n    }\n  }\n};\n\ntemplate<typename _MatrixType, typename Rhs>\nstruct solve_retval<HouseholderQR<_MatrixType>, Rhs>\n  : solve_retval_base<HouseholderQR<_MatrixType>, Rhs>\n{\n  EIGEN_MAKE_SOLVE_HELPERS(HouseholderQR<_MatrixType>,Rhs)\n\n  template<typename Dest> void evalTo(Dest& dst) const\n  {\n    const Index rows = dec().rows(), cols = dec().cols();\n    const Index rank = (std::min)(rows, cols);\n    eigen_assert(rhs().rows() == rows);\n\n    typename Rhs::PlainObject c(rhs());\n\n    // Note that the matrix Q = H_0^* H_1^*... so its inverse is Q^* = (H_0 H_1 ...)^T\n    c.applyOnTheLeft(householderSequence(\n      dec().matrixQR().leftCols(rank),\n      dec().hCoeffs().head(rank)).transpose()\n    );\n\n    dec().matrixQR()\n       .topLeftCorner(rank, rank)\n       .template triangularView<Upper>()\n       .solveInPlace(c.topRows(rank));\n\n    dst.topRows(rank) = c.topRows(rank);\n    dst.bottomRows(cols-rank).setZero();\n  }\n};\n\n} // end namespace internal\n\n/** Performs the QR factorization of the given matrix \\a matrix. The result of\n  * the factorization is stored into \\c *this, and a reference to \\c *this\n  * is returned.\n  *\n  * \\sa class HouseholderQR, HouseholderQR(const MatrixType&)\n  */\ntemplate<typename MatrixType>\nHouseholderQR<MatrixType>& HouseholderQR<MatrixType>::compute(const MatrixType& matrix)\n{\n  check_template_parameters();\n  \n  Index rows = matrix.rows();\n  Index cols = matrix.cols();\n  Index size = (std::min)(rows,cols);\n\n  m_qr = matrix;\n  m_hCoeffs.resize(size);\n\n  m_temp.resize(cols);\n\n  internal::householder_qr_inplace_blocked<MatrixType, HCoeffsType>::run(m_qr, m_hCoeffs, 48, m_temp.data());\n\n  m_isInitialized = true;\n  return *this;\n}\n\n/** \\return the Householder QR decomposition of \\c *this.\n  *\n  * \\sa class HouseholderQR\n  */\ntemplate<typename Derived>\nconst HouseholderQR<typename MatrixBase<Derived>::PlainObject>\nMatrixBase<Derived>::householderQr() const\n{\n  return HouseholderQR<PlainObject>(eval());\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_QR_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/QR/HouseholderQR_MKL.h",
    "content": "/*\n Copyright (c) 2011, Intel Corporation. All rights reserved.\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n * Neither the name of Intel Corporation nor the names of its contributors may\n   be used to endorse or promote products derived from this software without\n   specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\n ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n ********************************************************************************\n *   Content : Eigen bindings to Intel(R) MKL\n *    Householder QR decomposition of a matrix w/o pivoting based on\n *    LAPACKE_?geqrf function.\n ********************************************************************************\n*/\n\n#ifndef EIGEN_QR_MKL_H\n#define EIGEN_QR_MKL_H\n\n#include \"../Core/util/MKL_support.h\"\n\nnamespace Eigen { \n\n  namespace internal {\n\n    /** \\internal Specialization for the data types supported by MKL */\n\n#define EIGEN_MKL_QR_NOPIV(EIGTYPE, MKLTYPE, MKLPREFIX) \\\ntemplate<typename MatrixQR, typename HCoeffs> \\\nstruct householder_qr_inplace_blocked<MatrixQR, HCoeffs, EIGTYPE, true> \\\n{ \\\n  static void run(MatrixQR& mat, HCoeffs& hCoeffs, \\\n      typename MatrixQR::Index = 32, \\\n      typename MatrixQR::Scalar* = 0) \\\n  { \\\n    lapack_int m = (lapack_int) mat.rows(); \\\n    lapack_int n = (lapack_int) mat.cols(); \\\n    lapack_int lda = (lapack_int) mat.outerStride(); \\\n    lapack_int matrix_order = (MatrixQR::IsRowMajor) ? LAPACK_ROW_MAJOR : LAPACK_COL_MAJOR; \\\n    LAPACKE_##MKLPREFIX##geqrf( matrix_order, m, n, (MKLTYPE*)mat.data(), lda, (MKLTYPE*)hCoeffs.data()); \\\n    hCoeffs.adjointInPlace(); \\\n  } \\\n};\n\nEIGEN_MKL_QR_NOPIV(double, double, d)\nEIGEN_MKL_QR_NOPIV(float, float, s)\nEIGEN_MKL_QR_NOPIV(dcomplex, MKL_Complex16, z)\nEIGEN_MKL_QR_NOPIV(scomplex, MKL_Complex8, c)\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_QR_MKL_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SPQRSupport/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_SPQRSupport_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_SPQRSupport_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/SPQRSupport/ COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Desire Nuentsa <desire.nuentsa_wakam@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SUITESPARSEQRSUPPORT_H\n#define EIGEN_SUITESPARSEQRSUPPORT_H\n\nnamespace Eigen {\n  \n  template<typename MatrixType> class SPQR; \n  template<typename SPQRType> struct SPQRMatrixQReturnType; \n  template<typename SPQRType> struct SPQRMatrixQTransposeReturnType; \n  template <typename SPQRType, typename Derived> struct SPQR_QProduct;\n  namespace internal {\n    template <typename SPQRType> struct traits<SPQRMatrixQReturnType<SPQRType> >\n    {\n      typedef typename SPQRType::MatrixType ReturnType;\n    };\n    template <typename SPQRType> struct traits<SPQRMatrixQTransposeReturnType<SPQRType> >\n    {\n      typedef typename SPQRType::MatrixType ReturnType;\n    };\n    template <typename SPQRType, typename Derived> struct traits<SPQR_QProduct<SPQRType, Derived> >\n    {\n      typedef typename Derived::PlainObject ReturnType;\n    };\n  } // End namespace internal\n  \n/**\n * \\ingroup SPQRSupport_Module\n * \\class SPQR\n * \\brief Sparse QR factorization based on SuiteSparseQR library\n * \n * This class is used to perform a multithreaded and multifrontal rank-revealing QR decomposition \n * of sparse matrices. The result is then used to solve linear leasts_square systems.\n * Clearly, a QR factorization is returned such that A*P = Q*R where :\n * \n * P is the column permutation. Use colsPermutation() to get it.\n * \n * Q is the orthogonal matrix represented as Householder reflectors. \n * Use matrixQ() to get an expression and matrixQ().transpose() to get the transpose.\n * You can then apply it to a vector.\n * \n * R is the sparse triangular factor. Use matrixQR() to get it as SparseMatrix.\n * NOTE : The Index type of R is always SuiteSparse_long. You can get it with SPQR::Index\n * \n * \\tparam _MatrixType The type of the sparse matrix A, must be a column-major SparseMatrix<>\n * NOTE \n * \n */\ntemplate<typename _MatrixType>\nclass SPQR\n{\n  public:\n    typedef typename _MatrixType::Scalar Scalar;\n    typedef typename _MatrixType::RealScalar RealScalar;\n    typedef SuiteSparse_long Index ;\n    typedef SparseMatrix<Scalar, ColMajor, Index> MatrixType;\n    typedef PermutationMatrix<Dynamic, Dynamic> PermutationType;\n  public:\n    SPQR() \n      : m_isInitialized(false), m_ordering(SPQR_ORDERING_DEFAULT), m_allow_tol(SPQR_DEFAULT_TOL), m_tolerance (NumTraits<Scalar>::epsilon()), m_useDefaultThreshold(true)\n    { \n      cholmod_l_start(&m_cc);\n    }\n    \n    SPQR(const _MatrixType& matrix)\n    : m_isInitialized(false), m_ordering(SPQR_ORDERING_DEFAULT), m_allow_tol(SPQR_DEFAULT_TOL), m_tolerance (NumTraits<Scalar>::epsilon()), m_useDefaultThreshold(true)\n    {\n      cholmod_l_start(&m_cc);\n      compute(matrix);\n    }\n    \n    ~SPQR()\n    {\n      SPQR_free();\n      cholmod_l_finish(&m_cc);\n    }\n    void SPQR_free()\n    {\n      cholmod_l_free_sparse(&m_H, &m_cc);\n      cholmod_l_free_sparse(&m_cR, &m_cc);\n      cholmod_l_free_dense(&m_HTau, &m_cc);\n      std::free(m_E);\n      std::free(m_HPinv);\n    }\n\n    void compute(const _MatrixType& matrix)\n    {\n      if(m_isInitialized) SPQR_free();\n\n      MatrixType mat(matrix);\n      \n      /* Compute the default threshold as in MatLab, see:\n       * Tim Davis, \"Algorithm 915, SuiteSparseQR: Multifrontal Multithreaded Rank-Revealing\n       * Sparse QR Factorization, ACM Trans. on Math. Soft. 38(1), 2011, Page 8:3 \n       */\n      RealScalar pivotThreshold = m_tolerance;\n      if(m_useDefaultThreshold) \n      {\n        using std::max;\n        RealScalar max2Norm = 0.0;\n        for (int j = 0; j < mat.cols(); j++) max2Norm = (max)(max2Norm, mat.col(j).norm());\n        if(max2Norm==RealScalar(0))\n          max2Norm = RealScalar(1);\n        pivotThreshold = 20 * (mat.rows() + mat.cols()) * max2Norm * NumTraits<RealScalar>::epsilon();\n      }\n      \n      cholmod_sparse A; \n      A = viewAsCholmod(mat);\n      Index col = matrix.cols();\n      m_rank = SuiteSparseQR<Scalar>(m_ordering, pivotThreshold, col, &A, \n                             &m_cR, &m_E, &m_H, &m_HPinv, &m_HTau, &m_cc);\n\n      if (!m_cR)\n      {\n        m_info = NumericalIssue; \n        m_isInitialized = false;\n        return;\n      }\n      m_info = Success;\n      m_isInitialized = true;\n      m_isRUpToDate = false;\n    }\n    /** \n     * Get the number of rows of the input matrix and the Q matrix\n     */\n    inline Index rows() const {return m_cR->nrow; }\n    \n    /** \n     * Get the number of columns of the input matrix. \n     */\n    inline Index cols() const { return m_cR->ncol; }\n   \n      /** \\returns the solution X of \\f$ A X = B \\f$ using the current decomposition of A.\n      *\n      * \\sa compute()\n      */\n    template<typename Rhs>\n    inline const internal::solve_retval<SPQR, Rhs> solve(const MatrixBase<Rhs>& B) const \n    {\n      eigen_assert(m_isInitialized && \" The QR factorization should be computed first, call compute()\");\n      eigen_assert(this->rows()==B.rows()\n                    && \"SPQR::solve(): invalid number of rows of the right hand side matrix B\");\n          return internal::solve_retval<SPQR, Rhs>(*this, B.derived());\n    }\n    \n    template<typename Rhs, typename Dest>\n    void _solve(const MatrixBase<Rhs> &b, MatrixBase<Dest> &dest) const\n    {\n      eigen_assert(m_isInitialized && \" The QR factorization should be computed first, call compute()\");\n      eigen_assert(b.cols()==1 && \"This method is for vectors only\");\n\n      //Compute Q^T * b\n      typename Dest::PlainObject y, y2;\n      y = matrixQ().transpose() * b;\n      \n      // Solves with the triangular matrix R\n      Index rk = this->rank();\n      y2 = y;\n      y.resize((std::max)(cols(),Index(y.rows())),y.cols());\n      y.topRows(rk) = this->matrixR().topLeftCorner(rk, rk).template triangularView<Upper>().solve(y2.topRows(rk));\n\n      // Apply the column permutation \n      // colsPermutation() performs a copy of the permutation,\n      // so let's apply it manually:\n      for(Index i = 0; i < rk; ++i) dest.row(m_E[i]) = y.row(i);\n      for(Index i = rk; i < cols(); ++i) dest.row(m_E[i]).setZero();\n      \n//       y.bottomRows(y.rows()-rk).setZero();\n//       dest = colsPermutation() * y.topRows(cols());\n      \n      m_info = Success;\n    }\n    \n    /** \\returns the sparse triangular factor R. It is a sparse matrix\n     */\n    const MatrixType matrixR() const\n    {\n      eigen_assert(m_isInitialized && \" The QR factorization should be computed first, call compute()\");\n      if(!m_isRUpToDate) {\n        m_R = viewAsEigen<Scalar,ColMajor, typename MatrixType::Index>(*m_cR);\n        m_isRUpToDate = true;\n      }\n      return m_R;\n    }\n    /// Get an expression of the matrix Q\n    SPQRMatrixQReturnType<SPQR> matrixQ() const\n    {\n      return SPQRMatrixQReturnType<SPQR>(*this);\n    }\n    /// Get the permutation that was applied to columns of A\n    PermutationType colsPermutation() const\n    { \n      eigen_assert(m_isInitialized && \"Decomposition is not initialized.\");\n      Index n = m_cR->ncol;\n      PermutationType colsPerm(n);\n      for(Index j = 0; j <n; j++) colsPerm.indices()(j) = m_E[j];\n      return colsPerm; \n      \n    }\n    /**\n     * Gets the rank of the matrix. \n     * It should be equal to matrixQR().cols if the matrix is full-rank\n     */\n    Index rank() const\n    {\n      eigen_assert(m_isInitialized && \"Decomposition is not initialized.\");\n      return m_cc.SPQR_istat[4];\n    }\n    /// Set the fill-reducing ordering method to be used\n    void setSPQROrdering(int ord) { m_ordering = ord;}\n    /// Set the tolerance tol to treat columns with 2-norm < =tol as zero\n    void setPivotThreshold(const RealScalar& tol)\n    {\n      m_useDefaultThreshold = false;\n      m_tolerance = tol;\n    }\n    \n    /** \\returns a pointer to the SPQR workspace */\n    cholmod_common *cholmodCommon() const { return &m_cc; }\n    \n    \n    /** \\brief Reports whether previous computation was successful.\n      *\n      * \\returns \\c Success if computation was succesful,\n      *          \\c NumericalIssue if the sparse QR can not be computed\n      */\n    ComputationInfo info() const\n    {\n      eigen_assert(m_isInitialized && \"Decomposition is not initialized.\");\n      return m_info;\n    }\n  protected:\n    bool m_isInitialized;\n    bool m_analysisIsOk;\n    bool m_factorizationIsOk;\n    mutable bool m_isRUpToDate;\n    mutable ComputationInfo m_info;\n    int m_ordering; // Ordering method to use, see SPQR's manual\n    int m_allow_tol; // Allow to use some tolerance during numerical factorization.\n    RealScalar m_tolerance; // treat columns with 2-norm below this tolerance as zero\n    mutable cholmod_sparse *m_cR; // The sparse R factor in cholmod format\n    mutable MatrixType m_R; // The sparse matrix R in Eigen format\n    mutable Index *m_E; // The permutation applied to columns\n    mutable cholmod_sparse *m_H;  //The householder vectors\n    mutable Index *m_HPinv; // The row permutation of H\n    mutable cholmod_dense *m_HTau; // The Householder coefficients\n    mutable Index m_rank; // The rank of the matrix\n    mutable cholmod_common m_cc; // Workspace and parameters\n    bool m_useDefaultThreshold;     // Use default threshold\n    template<typename ,typename > friend struct SPQR_QProduct;\n};\n\ntemplate <typename SPQRType, typename Derived>\nstruct SPQR_QProduct : ReturnByValue<SPQR_QProduct<SPQRType,Derived> >\n{\n  typedef typename SPQRType::Scalar Scalar;\n  typedef typename SPQRType::Index Index;\n  //Define the constructor to get reference to argument types\n  SPQR_QProduct(const SPQRType& spqr, const Derived& other, bool transpose) : m_spqr(spqr),m_other(other),m_transpose(transpose) {}\n  \n  inline Index rows() const { return m_transpose ? m_spqr.rows() : m_spqr.cols(); }\n  inline Index cols() const { return m_other.cols(); }\n  // Assign to a vector\n  template<typename ResType>\n  void evalTo(ResType& res) const\n  {\n    cholmod_dense y_cd;\n    cholmod_dense *x_cd; \n    int method = m_transpose ? SPQR_QTX : SPQR_QX; \n    cholmod_common *cc = m_spqr.cholmodCommon();\n    y_cd = viewAsCholmod(m_other.const_cast_derived());\n    x_cd = SuiteSparseQR_qmult<Scalar>(method, m_spqr.m_H, m_spqr.m_HTau, m_spqr.m_HPinv, &y_cd, cc);\n    res = Matrix<Scalar,ResType::RowsAtCompileTime,ResType::ColsAtCompileTime>::Map(reinterpret_cast<Scalar*>(x_cd->x), x_cd->nrow, x_cd->ncol);\n    cholmod_l_free_dense(&x_cd, cc);\n  }\n  const SPQRType& m_spqr; \n  const Derived& m_other; \n  bool m_transpose; \n  \n};\ntemplate<typename SPQRType>\nstruct SPQRMatrixQReturnType{\n  \n  SPQRMatrixQReturnType(const SPQRType& spqr) : m_spqr(spqr) {}\n  template<typename Derived>\n  SPQR_QProduct<SPQRType, Derived> operator*(const MatrixBase<Derived>& other)\n  {\n    return SPQR_QProduct<SPQRType,Derived>(m_spqr,other.derived(),false);\n  }\n  SPQRMatrixQTransposeReturnType<SPQRType> adjoint() const\n  {\n    return SPQRMatrixQTransposeReturnType<SPQRType>(m_spqr);\n  }\n  // To use for operations with the transpose of Q\n  SPQRMatrixQTransposeReturnType<SPQRType> transpose() const\n  {\n    return SPQRMatrixQTransposeReturnType<SPQRType>(m_spqr);\n  }\n  const SPQRType& m_spqr;\n};\n\ntemplate<typename SPQRType>\nstruct SPQRMatrixQTransposeReturnType{\n  SPQRMatrixQTransposeReturnType(const SPQRType& spqr) : m_spqr(spqr) {}\n  template<typename Derived>\n  SPQR_QProduct<SPQRType,Derived> operator*(const MatrixBase<Derived>& other)\n  {\n    return SPQR_QProduct<SPQRType,Derived>(m_spqr,other.derived(), true);\n  }\n  const SPQRType& m_spqr;\n};\n\nnamespace internal {\n  \ntemplate<typename _MatrixType, typename Rhs>\nstruct solve_retval<SPQR<_MatrixType>, Rhs>\n  : solve_retval_base<SPQR<_MatrixType>, Rhs>\n{\n  typedef SPQR<_MatrixType> Dec;\n  EIGEN_MAKE_SOLVE_HELPERS(Dec,Rhs)\n\n  template<typename Dest> void evalTo(Dest& dst) const\n  {\n    dec()._solve(rhs(),dst);\n  }\n};\n\n} // end namespace internal\n\n}// End namespace Eigen\n#endif\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SVD/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_SVD_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_SVD_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/SVD COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SVD/JacobiSVD.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009-2010 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_JACOBISVD_H\n#define EIGEN_JACOBISVD_H\n\nnamespace Eigen { \n\nnamespace internal {\n// forward declaration (needed by ICC)\n// the empty body is required by MSVC\ntemplate<typename MatrixType, int QRPreconditioner,\n         bool IsComplex = NumTraits<typename MatrixType::Scalar>::IsComplex>\nstruct svd_precondition_2x2_block_to_be_real {};\n\n/*** QR preconditioners (R-SVD)\n ***\n *** Their role is to reduce the problem of computing the SVD to the case of a square matrix.\n *** This approach, known as R-SVD, is an optimization for rectangular-enough matrices, and is a requirement for\n *** JacobiSVD which by itself is only able to work on square matrices.\n ***/\n\nenum { PreconditionIfMoreColsThanRows, PreconditionIfMoreRowsThanCols };\n\ntemplate<typename MatrixType, int QRPreconditioner, int Case>\nstruct qr_preconditioner_should_do_anything\n{\n  enum { a = MatrixType::RowsAtCompileTime != Dynamic &&\n             MatrixType::ColsAtCompileTime != Dynamic &&\n             MatrixType::ColsAtCompileTime <= MatrixType::RowsAtCompileTime,\n         b = MatrixType::RowsAtCompileTime != Dynamic &&\n             MatrixType::ColsAtCompileTime != Dynamic &&\n             MatrixType::RowsAtCompileTime <= MatrixType::ColsAtCompileTime,\n         ret = !( (QRPreconditioner == NoQRPreconditioner) ||\n                  (Case == PreconditionIfMoreColsThanRows && bool(a)) ||\n                  (Case == PreconditionIfMoreRowsThanCols && bool(b)) )\n  };\n};\n\ntemplate<typename MatrixType, int QRPreconditioner, int Case,\n         bool DoAnything = qr_preconditioner_should_do_anything<MatrixType, QRPreconditioner, Case>::ret\n> struct qr_preconditioner_impl {};\n\ntemplate<typename MatrixType, int QRPreconditioner, int Case>\nclass qr_preconditioner_impl<MatrixType, QRPreconditioner, Case, false>\n{\npublic:\n  typedef typename MatrixType::Index Index;\n  void allocate(const JacobiSVD<MatrixType, QRPreconditioner>&) {}\n  bool run(JacobiSVD<MatrixType, QRPreconditioner>&, const MatrixType&)\n  {\n    return false;\n  }\n};\n\n/*** preconditioner using FullPivHouseholderQR ***/\n\ntemplate<typename MatrixType>\nclass qr_preconditioner_impl<MatrixType, FullPivHouseholderQRPreconditioner, PreconditionIfMoreRowsThanCols, true>\n{\npublic:\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n  enum\n  {\n    RowsAtCompileTime = MatrixType::RowsAtCompileTime,\n    MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime\n  };\n  typedef Matrix<Scalar, 1, RowsAtCompileTime, RowMajor, 1, MaxRowsAtCompileTime> WorkspaceType;\n\n  void allocate(const JacobiSVD<MatrixType, FullPivHouseholderQRPreconditioner>& svd)\n  {\n    if (svd.rows() != m_qr.rows() || svd.cols() != m_qr.cols())\n    {\n      m_qr.~QRType();\n      ::new (&m_qr) QRType(svd.rows(), svd.cols());\n    }\n    if (svd.m_computeFullU) m_workspace.resize(svd.rows());\n  }\n\n  bool run(JacobiSVD<MatrixType, FullPivHouseholderQRPreconditioner>& svd, const MatrixType& matrix)\n  {\n    if(matrix.rows() > matrix.cols())\n    {\n      m_qr.compute(matrix);\n      svd.m_workMatrix = m_qr.matrixQR().block(0,0,matrix.cols(),matrix.cols()).template triangularView<Upper>();\n      if(svd.m_computeFullU) m_qr.matrixQ().evalTo(svd.m_matrixU, m_workspace);\n      if(svd.computeV()) svd.m_matrixV = m_qr.colsPermutation();\n      return true;\n    }\n    return false;\n  }\nprivate:\n  typedef FullPivHouseholderQR<MatrixType> QRType;\n  QRType m_qr;\n  WorkspaceType m_workspace;\n};\n\ntemplate<typename MatrixType>\nclass qr_preconditioner_impl<MatrixType, FullPivHouseholderQRPreconditioner, PreconditionIfMoreColsThanRows, true>\n{\npublic:\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n  enum\n  {\n    RowsAtCompileTime = MatrixType::RowsAtCompileTime,\n    ColsAtCompileTime = MatrixType::ColsAtCompileTime,\n    MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,\n    MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime,\n    Options = MatrixType::Options\n  };\n  typedef Matrix<Scalar, ColsAtCompileTime, RowsAtCompileTime, Options, MaxColsAtCompileTime, MaxRowsAtCompileTime>\n          TransposeTypeWithSameStorageOrder;\n\n  void allocate(const JacobiSVD<MatrixType, FullPivHouseholderQRPreconditioner>& svd)\n  {\n    if (svd.cols() != m_qr.rows() || svd.rows() != m_qr.cols())\n    {\n      m_qr.~QRType();\n      ::new (&m_qr) QRType(svd.cols(), svd.rows());\n    }\n    m_adjoint.resize(svd.cols(), svd.rows());\n    if (svd.m_computeFullV) m_workspace.resize(svd.cols());\n  }\n\n  bool run(JacobiSVD<MatrixType, FullPivHouseholderQRPreconditioner>& svd, const MatrixType& matrix)\n  {\n    if(matrix.cols() > matrix.rows())\n    {\n      m_adjoint = matrix.adjoint();\n      m_qr.compute(m_adjoint);\n      svd.m_workMatrix = m_qr.matrixQR().block(0,0,matrix.rows(),matrix.rows()).template triangularView<Upper>().adjoint();\n      if(svd.m_computeFullV) m_qr.matrixQ().evalTo(svd.m_matrixV, m_workspace);\n      if(svd.computeU()) svd.m_matrixU = m_qr.colsPermutation();\n      return true;\n    }\n    else return false;\n  }\nprivate:\n  typedef FullPivHouseholderQR<TransposeTypeWithSameStorageOrder> QRType;\n  QRType m_qr;\n  TransposeTypeWithSameStorageOrder m_adjoint;\n  typename internal::plain_row_type<MatrixType>::type m_workspace;\n};\n\n/*** preconditioner using ColPivHouseholderQR ***/\n\ntemplate<typename MatrixType>\nclass qr_preconditioner_impl<MatrixType, ColPivHouseholderQRPreconditioner, PreconditionIfMoreRowsThanCols, true>\n{\npublic:\n  typedef typename MatrixType::Index Index;\n\n  void allocate(const JacobiSVD<MatrixType, ColPivHouseholderQRPreconditioner>& svd)\n  {\n    if (svd.rows() != m_qr.rows() || svd.cols() != m_qr.cols())\n    {\n      m_qr.~QRType();\n      ::new (&m_qr) QRType(svd.rows(), svd.cols());\n    }\n    if (svd.m_computeFullU) m_workspace.resize(svd.rows());\n    else if (svd.m_computeThinU) m_workspace.resize(svd.cols());\n  }\n\n  bool run(JacobiSVD<MatrixType, ColPivHouseholderQRPreconditioner>& svd, const MatrixType& matrix)\n  {\n    if(matrix.rows() > matrix.cols())\n    {\n      m_qr.compute(matrix);\n      svd.m_workMatrix = m_qr.matrixQR().block(0,0,matrix.cols(),matrix.cols()).template triangularView<Upper>();\n      if(svd.m_computeFullU) m_qr.householderQ().evalTo(svd.m_matrixU, m_workspace);\n      else if(svd.m_computeThinU)\n      {\n        svd.m_matrixU.setIdentity(matrix.rows(), matrix.cols());\n        m_qr.householderQ().applyThisOnTheLeft(svd.m_matrixU, m_workspace);\n      }\n      if(svd.computeV()) svd.m_matrixV = m_qr.colsPermutation();\n      return true;\n    }\n    return false;\n  }\n\nprivate:\n  typedef ColPivHouseholderQR<MatrixType> QRType;\n  QRType m_qr;\n  typename internal::plain_col_type<MatrixType>::type m_workspace;\n};\n\ntemplate<typename MatrixType>\nclass qr_preconditioner_impl<MatrixType, ColPivHouseholderQRPreconditioner, PreconditionIfMoreColsThanRows, true>\n{\npublic:\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n  enum\n  {\n    RowsAtCompileTime = MatrixType::RowsAtCompileTime,\n    ColsAtCompileTime = MatrixType::ColsAtCompileTime,\n    MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,\n    MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime,\n    Options = MatrixType::Options\n  };\n\n  typedef Matrix<Scalar, ColsAtCompileTime, RowsAtCompileTime, Options, MaxColsAtCompileTime, MaxRowsAtCompileTime>\n          TransposeTypeWithSameStorageOrder;\n\n  void allocate(const JacobiSVD<MatrixType, ColPivHouseholderQRPreconditioner>& svd)\n  {\n    if (svd.cols() != m_qr.rows() || svd.rows() != m_qr.cols())\n    {\n      m_qr.~QRType();\n      ::new (&m_qr) QRType(svd.cols(), svd.rows());\n    }\n    if (svd.m_computeFullV) m_workspace.resize(svd.cols());\n    else if (svd.m_computeThinV) m_workspace.resize(svd.rows());\n    m_adjoint.resize(svd.cols(), svd.rows());\n  }\n\n  bool run(JacobiSVD<MatrixType, ColPivHouseholderQRPreconditioner>& svd, const MatrixType& matrix)\n  {\n    if(matrix.cols() > matrix.rows())\n    {\n      m_adjoint = matrix.adjoint();\n      m_qr.compute(m_adjoint);\n\n      svd.m_workMatrix = m_qr.matrixQR().block(0,0,matrix.rows(),matrix.rows()).template triangularView<Upper>().adjoint();\n      if(svd.m_computeFullV) m_qr.householderQ().evalTo(svd.m_matrixV, m_workspace);\n      else if(svd.m_computeThinV)\n      {\n        svd.m_matrixV.setIdentity(matrix.cols(), matrix.rows());\n        m_qr.householderQ().applyThisOnTheLeft(svd.m_matrixV, m_workspace);\n      }\n      if(svd.computeU()) svd.m_matrixU = m_qr.colsPermutation();\n      return true;\n    }\n    else return false;\n  }\n\nprivate:\n  typedef ColPivHouseholderQR<TransposeTypeWithSameStorageOrder> QRType;\n  QRType m_qr;\n  TransposeTypeWithSameStorageOrder m_adjoint;\n  typename internal::plain_row_type<MatrixType>::type m_workspace;\n};\n\n/*** preconditioner using HouseholderQR ***/\n\ntemplate<typename MatrixType>\nclass qr_preconditioner_impl<MatrixType, HouseholderQRPreconditioner, PreconditionIfMoreRowsThanCols, true>\n{\npublic:\n  typedef typename MatrixType::Index Index;\n\n  void allocate(const JacobiSVD<MatrixType, HouseholderQRPreconditioner>& svd)\n  {\n    if (svd.rows() != m_qr.rows() || svd.cols() != m_qr.cols())\n    {\n      m_qr.~QRType();\n      ::new (&m_qr) QRType(svd.rows(), svd.cols());\n    }\n    if (svd.m_computeFullU) m_workspace.resize(svd.rows());\n    else if (svd.m_computeThinU) m_workspace.resize(svd.cols());\n  }\n\n  bool run(JacobiSVD<MatrixType, HouseholderQRPreconditioner>& svd, const MatrixType& matrix)\n  {\n    if(matrix.rows() > matrix.cols())\n    {\n      m_qr.compute(matrix);\n      svd.m_workMatrix = m_qr.matrixQR().block(0,0,matrix.cols(),matrix.cols()).template triangularView<Upper>();\n      if(svd.m_computeFullU) m_qr.householderQ().evalTo(svd.m_matrixU, m_workspace);\n      else if(svd.m_computeThinU)\n      {\n        svd.m_matrixU.setIdentity(matrix.rows(), matrix.cols());\n        m_qr.householderQ().applyThisOnTheLeft(svd.m_matrixU, m_workspace);\n      }\n      if(svd.computeV()) svd.m_matrixV.setIdentity(matrix.cols(), matrix.cols());\n      return true;\n    }\n    return false;\n  }\nprivate:\n  typedef HouseholderQR<MatrixType> QRType;\n  QRType m_qr;\n  typename internal::plain_col_type<MatrixType>::type m_workspace;\n};\n\ntemplate<typename MatrixType>\nclass qr_preconditioner_impl<MatrixType, HouseholderQRPreconditioner, PreconditionIfMoreColsThanRows, true>\n{\npublic:\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n  enum\n  {\n    RowsAtCompileTime = MatrixType::RowsAtCompileTime,\n    ColsAtCompileTime = MatrixType::ColsAtCompileTime,\n    MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,\n    MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime,\n    Options = MatrixType::Options\n  };\n\n  typedef Matrix<Scalar, ColsAtCompileTime, RowsAtCompileTime, Options, MaxColsAtCompileTime, MaxRowsAtCompileTime>\n          TransposeTypeWithSameStorageOrder;\n\n  void allocate(const JacobiSVD<MatrixType, HouseholderQRPreconditioner>& svd)\n  {\n    if (svd.cols() != m_qr.rows() || svd.rows() != m_qr.cols())\n    {\n      m_qr.~QRType();\n      ::new (&m_qr) QRType(svd.cols(), svd.rows());\n    }\n    if (svd.m_computeFullV) m_workspace.resize(svd.cols());\n    else if (svd.m_computeThinV) m_workspace.resize(svd.rows());\n    m_adjoint.resize(svd.cols(), svd.rows());\n  }\n\n  bool run(JacobiSVD<MatrixType, HouseholderQRPreconditioner>& svd, const MatrixType& matrix)\n  {\n    if(matrix.cols() > matrix.rows())\n    {\n      m_adjoint = matrix.adjoint();\n      m_qr.compute(m_adjoint);\n\n      svd.m_workMatrix = m_qr.matrixQR().block(0,0,matrix.rows(),matrix.rows()).template triangularView<Upper>().adjoint();\n      if(svd.m_computeFullV) m_qr.householderQ().evalTo(svd.m_matrixV, m_workspace);\n      else if(svd.m_computeThinV)\n      {\n        svd.m_matrixV.setIdentity(matrix.cols(), matrix.rows());\n        m_qr.householderQ().applyThisOnTheLeft(svd.m_matrixV, m_workspace);\n      }\n      if(svd.computeU()) svd.m_matrixU.setIdentity(matrix.rows(), matrix.rows());\n      return true;\n    }\n    else return false;\n  }\n\nprivate:\n  typedef HouseholderQR<TransposeTypeWithSameStorageOrder> QRType;\n  QRType m_qr;\n  TransposeTypeWithSameStorageOrder m_adjoint;\n  typename internal::plain_row_type<MatrixType>::type m_workspace;\n};\n\n/*** 2x2 SVD implementation\n ***\n *** JacobiSVD consists in performing a series of 2x2 SVD subproblems\n ***/\n\ntemplate<typename MatrixType, int QRPreconditioner>\nstruct svd_precondition_2x2_block_to_be_real<MatrixType, QRPreconditioner, false>\n{\n  typedef JacobiSVD<MatrixType, QRPreconditioner> SVD;\n  typedef typename SVD::Index Index;\n  typedef typename MatrixType::RealScalar RealScalar;\n  static bool run(typename SVD::WorkMatrixType&, SVD&, Index, Index, RealScalar&) { return true; }\n};\n\ntemplate<typename MatrixType, int QRPreconditioner>\nstruct svd_precondition_2x2_block_to_be_real<MatrixType, QRPreconditioner, true>\n{\n  typedef JacobiSVD<MatrixType, QRPreconditioner> SVD;\n  typedef typename SVD::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename MatrixType::RealScalar RealScalar;\n  static bool run(typename SVD::WorkMatrixType& work_matrix, SVD& svd, Index p, Index q, RealScalar& maxDiagEntry)\n  {\n    using std::sqrt;\n    using std::abs;\n    using std::max;\n    Scalar z;\n    JacobiRotation<Scalar> rot;\n    RealScalar n = sqrt(numext::abs2(work_matrix.coeff(p,p)) + numext::abs2(work_matrix.coeff(q,p)));\n\n    const RealScalar considerAsZero = (std::numeric_limits<RealScalar>::min)();\n    const RealScalar precision = NumTraits<Scalar>::epsilon();\n\n    if(n==0)\n    {\n      // make sure first column is zero\n      work_matrix.coeffRef(p,p) = work_matrix.coeffRef(q,p) = Scalar(0);\n\n      if(abs(numext::imag(work_matrix.coeff(p,q)))>considerAsZero)\n      {\n        // work_matrix.coeff(p,q) can be zero if work_matrix.coeff(q,p) is not zero but small enough to underflow when computing n\n        z = abs(work_matrix.coeff(p,q)) / work_matrix.coeff(p,q);\n        work_matrix.row(p) *= z;\n        if(svd.computeU()) svd.m_matrixU.col(p) *= conj(z);\n      }\n      if(abs(numext::imag(work_matrix.coeff(q,q)))>considerAsZero)\n      {\n        z = abs(work_matrix.coeff(q,q)) / work_matrix.coeff(q,q);\n        work_matrix.row(q) *= z;\n        if(svd.computeU()) svd.m_matrixU.col(q) *= conj(z);\n      }\n      // otherwise the second row is already zero, so we have nothing to do.\n    }\n    else\n    {\n      rot.c() = conj(work_matrix.coeff(p,p)) / n;\n      rot.s() = work_matrix.coeff(q,p) / n;\n      work_matrix.applyOnTheLeft(p,q,rot);\n      if(svd.computeU()) svd.m_matrixU.applyOnTheRight(p,q,rot.adjoint());\n      if(abs(numext::imag(work_matrix.coeff(p,q)))>considerAsZero)\n      {\n        z = abs(work_matrix.coeff(p,q)) / work_matrix.coeff(p,q);\n        work_matrix.col(q) *= z;\n        if(svd.computeV()) svd.m_matrixV.col(q) *= z;\n      }\n      if(abs(numext::imag(work_matrix.coeff(q,q)))>considerAsZero)\n      {\n        z = abs(work_matrix.coeff(q,q)) / work_matrix.coeff(q,q);\n        work_matrix.row(q) *= z;\n        if(svd.computeU()) svd.m_matrixU.col(q) *= conj(z);\n      }\n    }\n\n    // update largest diagonal entry\n    maxDiagEntry = max EIGEN_EMPTY (maxDiagEntry,max EIGEN_EMPTY (abs(work_matrix.coeff(p,p)), abs(work_matrix.coeff(q,q))));\n    // and check whether the 2x2 block is already diagonal\n    RealScalar threshold = max EIGEN_EMPTY (considerAsZero, precision * maxDiagEntry);\n    return abs(work_matrix.coeff(p,q))>threshold || abs(work_matrix.coeff(q,p)) > threshold;\n  }\n};\n\ntemplate<typename MatrixType, typename RealScalar, typename Index>\nvoid real_2x2_jacobi_svd(const MatrixType& matrix, Index p, Index q,\n                            JacobiRotation<RealScalar> *j_left,\n                            JacobiRotation<RealScalar> *j_right)\n{\n  using std::sqrt;\n  using std::abs;\n  Matrix<RealScalar,2,2> m;\n  m << numext::real(matrix.coeff(p,p)), numext::real(matrix.coeff(p,q)),\n       numext::real(matrix.coeff(q,p)), numext::real(matrix.coeff(q,q));\n  JacobiRotation<RealScalar> rot1;\n  RealScalar t = m.coeff(0,0) + m.coeff(1,1);\n  RealScalar d = m.coeff(1,0) - m.coeff(0,1);\n  if(d == RealScalar(0))\n  {\n    rot1.s() = RealScalar(0);\n    rot1.c() = RealScalar(1);\n  }\n  else\n  {\n    // If d!=0, then t/d cannot overflow because the magnitude of the\n    // entries forming d are not too small compared to the ones forming t.\n    RealScalar u = t / d;\n    RealScalar tmp = sqrt(RealScalar(1) + numext::abs2(u));\n    rot1.s() = RealScalar(1) / tmp;\n    rot1.c() = u / tmp;\n  }\n  m.applyOnTheLeft(0,1,rot1);\n  j_right->makeJacobi(m,0,1);\n  *j_left = rot1 * j_right->transpose();\n}\n\n} // end namespace internal\n\n/** \\ingroup SVD_Module\n  *\n  *\n  * \\class JacobiSVD\n  *\n  * \\brief Two-sided Jacobi SVD decomposition of a rectangular matrix\n  *\n  * \\param MatrixType the type of the matrix of which we are computing the SVD decomposition\n  * \\param QRPreconditioner this optional parameter allows to specify the type of QR decomposition that will be used internally\n  *                        for the R-SVD step for non-square matrices. See discussion of possible values below.\n  *\n  * SVD decomposition consists in decomposing any n-by-p matrix \\a A as a product\n  *   \\f[ A = U S V^* \\f]\n  * where \\a U is a n-by-n unitary, \\a V is a p-by-p unitary, and \\a S is a n-by-p real positive matrix which is zero outside of its main diagonal;\n  * the diagonal entries of S are known as the \\em singular \\em values of \\a A and the columns of \\a U and \\a V are known as the left\n  * and right \\em singular \\em vectors of \\a A respectively.\n  *\n  * Singular values are always sorted in decreasing order.\n  *\n  * This JacobiSVD decomposition computes only the singular values by default. If you want \\a U or \\a V, you need to ask for them explicitly.\n  *\n  * You can ask for only \\em thin \\a U or \\a V to be computed, meaning the following. In case of a rectangular n-by-p matrix, letting \\a m be the\n  * smaller value among \\a n and \\a p, there are only \\a m singular vectors; the remaining columns of \\a U and \\a V do not correspond to actual\n  * singular vectors. Asking for \\em thin \\a U or \\a V means asking for only their \\a m first columns to be formed. So \\a U is then a n-by-m matrix,\n  * and \\a V is then a p-by-m matrix. Notice that thin \\a U and \\a V are all you need for (least squares) solving.\n  *\n  * Here's an example demonstrating basic usage:\n  * \\include JacobiSVD_basic.cpp\n  * Output: \\verbinclude JacobiSVD_basic.out\n  *\n  * This JacobiSVD class is a two-sided Jacobi R-SVD decomposition, ensuring optimal reliability and accuracy. The downside is that it's slower than\n  * bidiagonalizing SVD algorithms for large square matrices; however its complexity is still \\f$ O(n^2p) \\f$ where \\a n is the smaller dimension and\n  * \\a p is the greater dimension, meaning that it is still of the same order of complexity as the faster bidiagonalizing R-SVD algorithms.\n  * In particular, like any R-SVD, it takes advantage of non-squareness in that its complexity is only linear in the greater dimension.\n  *\n  * If the input matrix has inf or nan coefficients, the result of the computation is undefined, but the computation is guaranteed to\n  * terminate in finite (and reasonable) time.\n  *\n  * The possible values for QRPreconditioner are:\n  * \\li ColPivHouseholderQRPreconditioner is the default. In practice it's very safe. It uses column-pivoting QR.\n  * \\li FullPivHouseholderQRPreconditioner, is the safest and slowest. It uses full-pivoting QR.\n  *     Contrary to other QRs, it doesn't allow computing thin unitaries.\n  * \\li HouseholderQRPreconditioner is the fastest, and less safe and accurate than the pivoting variants. It uses non-pivoting QR.\n  *     This is very similar in safety and accuracy to the bidiagonalization process used by bidiagonalizing SVD algorithms (since bidiagonalization\n  *     is inherently non-pivoting). However the resulting SVD is still more reliable than bidiagonalizing SVDs because the Jacobi-based iterarive\n  *     process is more reliable than the optimized bidiagonal SVD iterations.\n  * \\li NoQRPreconditioner allows not to use a QR preconditioner at all. This is useful if you know that you will only be computing\n  *     JacobiSVD decompositions of square matrices. Non-square matrices require a QR preconditioner. Using this option will result in\n  *     faster compilation and smaller executable code. It won't significantly speed up computation, since JacobiSVD is always checking\n  *     if QR preconditioning is needed before applying it anyway.\n  *\n  * \\sa MatrixBase::jacobiSvd()\n  */\ntemplate<typename _MatrixType, int QRPreconditioner> class JacobiSVD\n{\n  public:\n\n    typedef _MatrixType MatrixType;\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename NumTraits<typename MatrixType::Scalar>::Real RealScalar;\n    typedef typename MatrixType::Index Index;\n    enum {\n      RowsAtCompileTime = MatrixType::RowsAtCompileTime,\n      ColsAtCompileTime = MatrixType::ColsAtCompileTime,\n      DiagSizeAtCompileTime = EIGEN_SIZE_MIN_PREFER_DYNAMIC(RowsAtCompileTime,ColsAtCompileTime),\n      MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,\n      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime,\n      MaxDiagSizeAtCompileTime = EIGEN_SIZE_MIN_PREFER_FIXED(MaxRowsAtCompileTime,MaxColsAtCompileTime),\n      MatrixOptions = MatrixType::Options\n    };\n\n    typedef Matrix<Scalar, RowsAtCompileTime, RowsAtCompileTime,\n                   MatrixOptions, MaxRowsAtCompileTime, MaxRowsAtCompileTime>\n            MatrixUType;\n    typedef Matrix<Scalar, ColsAtCompileTime, ColsAtCompileTime,\n                   MatrixOptions, MaxColsAtCompileTime, MaxColsAtCompileTime>\n            MatrixVType;\n    typedef typename internal::plain_diag_type<MatrixType, RealScalar>::type SingularValuesType;\n    typedef typename internal::plain_row_type<MatrixType>::type RowType;\n    typedef typename internal::plain_col_type<MatrixType>::type ColType;\n    typedef Matrix<Scalar, DiagSizeAtCompileTime, DiagSizeAtCompileTime,\n                   MatrixOptions, MaxDiagSizeAtCompileTime, MaxDiagSizeAtCompileTime>\n            WorkMatrixType;\n\n    /** \\brief Default Constructor.\n      *\n      * The default constructor is useful in cases in which the user intends to\n      * perform decompositions via JacobiSVD::compute(const MatrixType&).\n      */\n    JacobiSVD()\n      : m_isInitialized(false),\n        m_isAllocated(false),\n        m_usePrescribedThreshold(false),\n        m_computationOptions(0),\n        m_rows(-1), m_cols(-1), m_diagSize(0)\n    {}\n\n\n    /** \\brief Default Constructor with memory preallocation\n      *\n      * Like the default constructor but with preallocation of the internal data\n      * according to the specified problem size.\n      * \\sa JacobiSVD()\n      */\n    JacobiSVD(Index rows, Index cols, unsigned int computationOptions = 0)\n      : m_isInitialized(false),\n        m_isAllocated(false),\n        m_usePrescribedThreshold(false),\n        m_computationOptions(0),\n        m_rows(-1), m_cols(-1)\n    {\n      allocate(rows, cols, computationOptions);\n    }\n\n    /** \\brief Constructor performing the decomposition of given matrix.\n     *\n     * \\param matrix the matrix to decompose\n     * \\param computationOptions optional parameter allowing to specify if you want full or thin U or V unitaries to be computed.\n     *                           By default, none is computed. This is a bit-field, the possible bits are #ComputeFullU, #ComputeThinU,\n     *                           #ComputeFullV, #ComputeThinV.\n     *\n     * Thin unitaries are only available if your matrix type has a Dynamic number of columns (for example MatrixXf). They also are not\n     * available with the (non-default) FullPivHouseholderQR preconditioner.\n     */\n    JacobiSVD(const MatrixType& matrix, unsigned int computationOptions = 0)\n      : m_isInitialized(false),\n        m_isAllocated(false),\n        m_usePrescribedThreshold(false),\n        m_computationOptions(0),\n        m_rows(-1), m_cols(-1)\n    {\n      compute(matrix, computationOptions);\n    }\n\n    /** \\brief Method performing the decomposition of given matrix using custom options.\n     *\n     * \\param matrix the matrix to decompose\n     * \\param computationOptions optional parameter allowing to specify if you want full or thin U or V unitaries to be computed.\n     *                           By default, none is computed. This is a bit-field, the possible bits are #ComputeFullU, #ComputeThinU,\n     *                           #ComputeFullV, #ComputeThinV.\n     *\n     * Thin unitaries are only available if your matrix type has a Dynamic number of columns (for example MatrixXf). They also are not\n     * available with the (non-default) FullPivHouseholderQR preconditioner.\n     */\n    JacobiSVD& compute(const MatrixType& matrix, unsigned int computationOptions);\n\n    /** \\brief Method performing the decomposition of given matrix using current options.\n     *\n     * \\param matrix the matrix to decompose\n     *\n     * This method uses the current \\a computationOptions, as already passed to the constructor or to compute(const MatrixType&, unsigned int).\n     */\n    JacobiSVD& compute(const MatrixType& matrix)\n    {\n      return compute(matrix, m_computationOptions);\n    }\n\n    /** \\returns the \\a U matrix.\n     *\n     * For the SVD decomposition of a n-by-p matrix, letting \\a m be the minimum of \\a n and \\a p,\n     * the U matrix is n-by-n if you asked for #ComputeFullU, and is n-by-m if you asked for #ComputeThinU.\n     *\n     * The \\a m first columns of \\a U are the left singular vectors of the matrix being decomposed.\n     *\n     * This method asserts that you asked for \\a U to be computed.\n     */\n    const MatrixUType& matrixU() const\n    {\n      eigen_assert(m_isInitialized && \"JacobiSVD is not initialized.\");\n      eigen_assert(computeU() && \"This JacobiSVD decomposition didn't compute U. Did you ask for it?\");\n      return m_matrixU;\n    }\n\n    /** \\returns the \\a V matrix.\n     *\n     * For the SVD decomposition of a n-by-p matrix, letting \\a m be the minimum of \\a n and \\a p,\n     * the V matrix is p-by-p if you asked for #ComputeFullV, and is p-by-m if you asked for ComputeThinV.\n     *\n     * The \\a m first columns of \\a V are the right singular vectors of the matrix being decomposed.\n     *\n     * This method asserts that you asked for \\a V to be computed.\n     */\n    const MatrixVType& matrixV() const\n    {\n      eigen_assert(m_isInitialized && \"JacobiSVD is not initialized.\");\n      eigen_assert(computeV() && \"This JacobiSVD decomposition didn't compute V. Did you ask for it?\");\n      return m_matrixV;\n    }\n\n    /** \\returns the vector of singular values.\n     *\n     * For the SVD decomposition of a n-by-p matrix, letting \\a m be the minimum of \\a n and \\a p, the\n     * returned vector has size \\a m.  Singular values are always sorted in decreasing order.\n     */\n    const SingularValuesType& singularValues() const\n    {\n      eigen_assert(m_isInitialized && \"JacobiSVD is not initialized.\");\n      return m_singularValues;\n    }\n\n    /** \\returns true if \\a U (full or thin) is asked for in this SVD decomposition */\n    inline bool computeU() const { return m_computeFullU || m_computeThinU; }\n    /** \\returns true if \\a V (full or thin) is asked for in this SVD decomposition */\n    inline bool computeV() const { return m_computeFullV || m_computeThinV; }\n\n    /** \\returns a (least squares) solution of \\f$ A x = b \\f$ using the current SVD decomposition of A.\n      *\n      * \\param b the right-hand-side of the equation to solve.\n      *\n      * \\note Solving requires both U and V to be computed. Thin U and V are enough, there is no need for full U or V.\n      *\n      * \\note SVD solving is implicitly least-squares. Thus, this method serves both purposes of exact solving and least-squares solving.\n      * In other words, the returned solution is guaranteed to minimize the Euclidean norm \\f$ \\Vert A x - b \\Vert \\f$.\n      */\n    template<typename Rhs>\n    inline const internal::solve_retval<JacobiSVD, Rhs>\n    solve(const MatrixBase<Rhs>& b) const\n    {\n      eigen_assert(m_isInitialized && \"JacobiSVD is not initialized.\");\n      eigen_assert(computeU() && computeV() && \"JacobiSVD::solve() requires both unitaries U and V to be computed (thin unitaries suffice).\");\n      return internal::solve_retval<JacobiSVD, Rhs>(*this, b.derived());\n    }\n\n    /** \\returns the number of singular values that are not exactly 0 */\n    Index nonzeroSingularValues() const\n    {\n      eigen_assert(m_isInitialized && \"JacobiSVD is not initialized.\");\n      return m_nonzeroSingularValues;\n    }\n    \n    /** \\returns the rank of the matrix of which \\c *this is the SVD.\n      *\n      * \\note This method has to determine which singular values should be considered nonzero.\n      *       For that, it uses the threshold value that you can control by calling\n      *       setThreshold(const RealScalar&).\n      */\n    inline Index rank() const\n    {\n      using std::abs;\n      eigen_assert(m_isInitialized && \"JacobiSVD is not initialized.\");\n      if(m_singularValues.size()==0) return 0;\n      RealScalar premultiplied_threshold = m_singularValues.coeff(0) * threshold();\n      Index i = m_nonzeroSingularValues-1;\n      while(i>=0 && m_singularValues.coeff(i) < premultiplied_threshold) --i;\n      return i+1;\n    }\n    \n    /** Allows to prescribe a threshold to be used by certain methods, such as rank() and solve(),\n      * which need to determine when singular values are to be considered nonzero.\n      * This is not used for the SVD decomposition itself.\n      *\n      * When it needs to get the threshold value, Eigen calls threshold().\n      * The default is \\c NumTraits<Scalar>::epsilon()\n      *\n      * \\param threshold The new value to use as the threshold.\n      *\n      * A singular value will be considered nonzero if its value is strictly greater than\n      *  \\f$ \\vert singular value \\vert \\leqslant threshold \\times \\vert max singular value \\vert \\f$.\n      *\n      * If you want to come back to the default behavior, call setThreshold(Default_t)\n      */\n    JacobiSVD& setThreshold(const RealScalar& threshold)\n    {\n      m_usePrescribedThreshold = true;\n      m_prescribedThreshold = threshold;\n      return *this;\n    }\n\n    /** Allows to come back to the default behavior, letting Eigen use its default formula for\n      * determining the threshold.\n      *\n      * You should pass the special object Eigen::Default as parameter here.\n      * \\code svd.setThreshold(Eigen::Default); \\endcode\n      *\n      * See the documentation of setThreshold(const RealScalar&).\n      */\n    JacobiSVD& setThreshold(Default_t)\n    {\n      m_usePrescribedThreshold = false;\n      return *this;\n    }\n\n    /** Returns the threshold that will be used by certain methods such as rank().\n      *\n      * See the documentation of setThreshold(const RealScalar&).\n      */\n    RealScalar threshold() const\n    {\n      eigen_assert(m_isInitialized || m_usePrescribedThreshold);\n      return m_usePrescribedThreshold ? m_prescribedThreshold\n                                      : (std::max<Index>)(1,m_diagSize)*NumTraits<Scalar>::epsilon();\n    }\n\n    inline Index rows() const { return m_rows; }\n    inline Index cols() const { return m_cols; }\n\n  private:\n    void allocate(Index rows, Index cols, unsigned int computationOptions);\n    \n    static void check_template_parameters()\n    {\n      EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar);\n    }\n\n  protected:\n    MatrixUType m_matrixU;\n    MatrixVType m_matrixV;\n    SingularValuesType m_singularValues;\n    WorkMatrixType m_workMatrix;\n    bool m_isInitialized, m_isAllocated, m_usePrescribedThreshold;\n    bool m_computeFullU, m_computeThinU;\n    bool m_computeFullV, m_computeThinV;\n    unsigned int m_computationOptions;\n    Index m_nonzeroSingularValues, m_rows, m_cols, m_diagSize;\n    RealScalar m_prescribedThreshold;\n\n    template<typename __MatrixType, int _QRPreconditioner, bool _IsComplex>\n    friend struct internal::svd_precondition_2x2_block_to_be_real;\n    template<typename __MatrixType, int _QRPreconditioner, int _Case, bool _DoAnything>\n    friend struct internal::qr_preconditioner_impl;\n\n    internal::qr_preconditioner_impl<MatrixType, QRPreconditioner, internal::PreconditionIfMoreColsThanRows> m_qr_precond_morecols;\n    internal::qr_preconditioner_impl<MatrixType, QRPreconditioner, internal::PreconditionIfMoreRowsThanCols> m_qr_precond_morerows;\n    MatrixType m_scaledMatrix;\n};\n\ntemplate<typename MatrixType, int QRPreconditioner>\nvoid JacobiSVD<MatrixType, QRPreconditioner>::allocate(Index rows, Index cols, unsigned int computationOptions)\n{\n  eigen_assert(rows >= 0 && cols >= 0);\n\n  if (m_isAllocated &&\n      rows == m_rows &&\n      cols == m_cols &&\n      computationOptions == m_computationOptions)\n  {\n    return;\n  }\n\n  m_rows = rows;\n  m_cols = cols;\n  m_isInitialized = false;\n  m_isAllocated = true;\n  m_computationOptions = computationOptions;\n  m_computeFullU = (computationOptions & ComputeFullU) != 0;\n  m_computeThinU = (computationOptions & ComputeThinU) != 0;\n  m_computeFullV = (computationOptions & ComputeFullV) != 0;\n  m_computeThinV = (computationOptions & ComputeThinV) != 0;\n  eigen_assert(!(m_computeFullU && m_computeThinU) && \"JacobiSVD: you can't ask for both full and thin U\");\n  eigen_assert(!(m_computeFullV && m_computeThinV) && \"JacobiSVD: you can't ask for both full and thin V\");\n  eigen_assert(EIGEN_IMPLIES(m_computeThinU || m_computeThinV, MatrixType::ColsAtCompileTime==Dynamic) &&\n              \"JacobiSVD: thin U and V are only available when your matrix has a dynamic number of columns.\");\n  if (QRPreconditioner == FullPivHouseholderQRPreconditioner)\n  {\n      eigen_assert(!(m_computeThinU || m_computeThinV) &&\n              \"JacobiSVD: can't compute thin U or thin V with the FullPivHouseholderQR preconditioner. \"\n              \"Use the ColPivHouseholderQR preconditioner instead.\");\n  }\n  m_diagSize = (std::min)(m_rows, m_cols);\n  m_singularValues.resize(m_diagSize);\n  if(RowsAtCompileTime==Dynamic)\n    m_matrixU.resize(m_rows, m_computeFullU ? m_rows\n                            : m_computeThinU ? m_diagSize\n                            : 0);\n  if(ColsAtCompileTime==Dynamic)\n    m_matrixV.resize(m_cols, m_computeFullV ? m_cols\n                            : m_computeThinV ? m_diagSize\n                            : 0);\n  m_workMatrix.resize(m_diagSize, m_diagSize);\n  \n  if(m_cols>m_rows)   m_qr_precond_morecols.allocate(*this);\n  if(m_rows>m_cols)   m_qr_precond_morerows.allocate(*this);\n  if(m_rows!=m_cols)  m_scaledMatrix.resize(rows,cols);\n}\n\ntemplate<typename MatrixType, int QRPreconditioner>\nJacobiSVD<MatrixType, QRPreconditioner>&\nJacobiSVD<MatrixType, QRPreconditioner>::compute(const MatrixType& matrix, unsigned int computationOptions)\n{\n  check_template_parameters();\n  \n  using std::abs;\n  using std::max;\n  allocate(matrix.rows(), matrix.cols(), computationOptions);\n\n  // currently we stop when we reach precision 2*epsilon as the last bit of precision can require an unreasonable number of iterations,\n  // only worsening the precision of U and V as we accumulate more rotations\n  const RealScalar precision = RealScalar(2) * NumTraits<Scalar>::epsilon();\n\n  // limit for very small denormal numbers to be considered zero in order to avoid infinite loops (see bug 286)\n  const RealScalar considerAsZero = RealScalar(2) * std::numeric_limits<RealScalar>::denorm_min();\n\n  // Scaling factor to reduce over/under-flows\n  RealScalar scale = matrix.cwiseAbs().maxCoeff();\n  if(scale==RealScalar(0)) scale = RealScalar(1);\n  \n  /*** step 1. The R-SVD step: we use a QR decomposition to reduce to the case of a square matrix */\n\n  if(m_rows!=m_cols)\n  {\n    m_scaledMatrix = matrix / scale;\n    m_qr_precond_morecols.run(*this, m_scaledMatrix);\n    m_qr_precond_morerows.run(*this, m_scaledMatrix);\n  }\n  else\n  {\n    m_workMatrix = matrix.block(0,0,m_diagSize,m_diagSize) / scale;\n    if(m_computeFullU) m_matrixU.setIdentity(m_rows,m_rows);\n    if(m_computeThinU) m_matrixU.setIdentity(m_rows,m_diagSize);\n    if(m_computeFullV) m_matrixV.setIdentity(m_cols,m_cols);\n    if(m_computeThinV) m_matrixV.setIdentity(m_cols, m_diagSize);\n  }\n\n  /*** step 2. The main Jacobi SVD iteration. ***/\n  RealScalar maxDiagEntry = m_workMatrix.cwiseAbs().diagonal().maxCoeff();\n\n  bool finished = false;\n  while(!finished)\n  {\n    finished = true;\n\n    // do a sweep: for all index pairs (p,q), perform SVD of the corresponding 2x2 sub-matrix\n\n    for(Index p = 1; p < m_diagSize; ++p)\n    {\n      for(Index q = 0; q < p; ++q)\n      {\n        // if this 2x2 sub-matrix is not diagonal already...\n        // notice that this comparison will evaluate to false if any NaN is involved, ensuring that NaN's don't\n        // keep us iterating forever. Similarly, small denormal numbers are considered zero.\n        RealScalar threshold = max EIGEN_EMPTY (considerAsZero, precision * maxDiagEntry);\n        if(abs(m_workMatrix.coeff(p,q))>threshold || abs(m_workMatrix.coeff(q,p)) > threshold)\n        {\n          finished = false;\n          // perform SVD decomposition of 2x2 sub-matrix corresponding to indices p,q to make it diagonal\n          // the complex to real operation returns true is the updated 2x2 block is not already diagonal\n          if(internal::svd_precondition_2x2_block_to_be_real<MatrixType, QRPreconditioner>::run(m_workMatrix, *this, p, q, maxDiagEntry))\n          {\n            JacobiRotation<RealScalar> j_left, j_right;\n            internal::real_2x2_jacobi_svd(m_workMatrix, p, q, &j_left, &j_right);\n\n            // accumulate resulting Jacobi rotations\n            m_workMatrix.applyOnTheLeft(p,q,j_left);\n            if(computeU()) m_matrixU.applyOnTheRight(p,q,j_left.transpose());\n\n            m_workMatrix.applyOnTheRight(p,q,j_right);\n            if(computeV()) m_matrixV.applyOnTheRight(p,q,j_right);\n\n            // keep track of the largest diagonal coefficient\n            maxDiagEntry = max EIGEN_EMPTY (maxDiagEntry,max EIGEN_EMPTY (abs(m_workMatrix.coeff(p,p)), abs(m_workMatrix.coeff(q,q))));\n          }\n        }\n      }\n    }\n  }\n\n  /*** step 3. The work matrix is now diagonal, so ensure it's positive so its diagonal entries are the singular values ***/\n\n  for(Index i = 0; i < m_diagSize; ++i)\n  {\n    RealScalar a = abs(m_workMatrix.coeff(i,i));\n    m_singularValues.coeffRef(i) = a;\n    if(computeU() && (a!=RealScalar(0))) m_matrixU.col(i) *= m_workMatrix.coeff(i,i)/a;\n  }\n\n  /*** step 4. Sort singular values in descending order and compute the number of nonzero singular values ***/\n\n  m_nonzeroSingularValues = m_diagSize;\n  for(Index i = 0; i < m_diagSize; i++)\n  {\n    Index pos;\n    RealScalar maxRemainingSingularValue = m_singularValues.tail(m_diagSize-i).maxCoeff(&pos);\n    if(maxRemainingSingularValue == RealScalar(0))\n    {\n      m_nonzeroSingularValues = i;\n      break;\n    }\n    if(pos)\n    {\n      pos += i;\n      std::swap(m_singularValues.coeffRef(i), m_singularValues.coeffRef(pos));\n      if(computeU()) m_matrixU.col(pos).swap(m_matrixU.col(i));\n      if(computeV()) m_matrixV.col(pos).swap(m_matrixV.col(i));\n    }\n  }\n  \n  m_singularValues *= scale;\n\n  m_isInitialized = true;\n  return *this;\n}\n\nnamespace internal {\ntemplate<typename _MatrixType, int QRPreconditioner, typename Rhs>\nstruct solve_retval<JacobiSVD<_MatrixType, QRPreconditioner>, Rhs>\n  : solve_retval_base<JacobiSVD<_MatrixType, QRPreconditioner>, Rhs>\n{\n  typedef JacobiSVD<_MatrixType, QRPreconditioner> JacobiSVDType;\n  EIGEN_MAKE_SOLVE_HELPERS(JacobiSVDType,Rhs)\n\n  template<typename Dest> void evalTo(Dest& dst) const\n  {\n    eigen_assert(rhs().rows() == dec().rows());\n\n    // A = U S V^*\n    // So A^{-1} = V S^{-1} U^*\n\n    Matrix<Scalar, Dynamic, Rhs::ColsAtCompileTime, 0, _MatrixType::MaxRowsAtCompileTime, Rhs::MaxColsAtCompileTime> tmp;\n    Index rank = dec().rank();\n    \n    tmp.noalias() = dec().matrixU().leftCols(rank).adjoint() * rhs();\n    tmp = dec().singularValues().head(rank).asDiagonal().inverse() * tmp;\n    dst = dec().matrixV().leftCols(rank) * tmp;\n  }\n};\n} // end namespace internal\n\n/** \\svd_module\n  *\n  * \\return the singular value decomposition of \\c *this computed by two-sided\n  * Jacobi transformations.\n  *\n  * \\sa class JacobiSVD\n  */\ntemplate<typename Derived>\nJacobiSVD<typename MatrixBase<Derived>::PlainObject>\nMatrixBase<Derived>::jacobiSvd(unsigned int computationOptions) const\n{\n  return JacobiSVD<PlainObject>(*this, computationOptions);\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_JACOBISVD_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SVD/JacobiSVD_MKL.h",
    "content": "/*\n Copyright (c) 2011, Intel Corporation. All rights reserved.\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n * Neither the name of Intel Corporation nor the names of its contributors may\n   be used to endorse or promote products derived from this software without\n   specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\n ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n ********************************************************************************\n *   Content : Eigen bindings to Intel(R) MKL\n *    Singular Value Decomposition - SVD.\n ********************************************************************************\n*/\n\n#ifndef EIGEN_JACOBISVD_MKL_H\n#define EIGEN_JACOBISVD_MKL_H\n\n#include \"Eigen/src/Core/util/MKL_support.h\"\n\nnamespace Eigen { \n\n/** \\internal Specialization for the data types supported by MKL */\n\n#define EIGEN_MKL_SVD(EIGTYPE, MKLTYPE, MKLRTYPE, MKLPREFIX, EIGCOLROW, MKLCOLROW) \\\ntemplate<> inline \\\nJacobiSVD<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW, Dynamic, Dynamic>, ColPivHouseholderQRPreconditioner>& \\\nJacobiSVD<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW, Dynamic, Dynamic>, ColPivHouseholderQRPreconditioner>::compute(const Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW, Dynamic, Dynamic>& matrix, unsigned int computationOptions) \\\n{ \\\n  typedef Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW, Dynamic, Dynamic> MatrixType; \\\n  /*typedef MatrixType::Scalar Scalar;*/ \\\n  /*typedef MatrixType::RealScalar RealScalar;*/ \\\n  allocate(matrix.rows(), matrix.cols(), computationOptions); \\\n\\\n  /*const RealScalar precision = RealScalar(2) * NumTraits<Scalar>::epsilon();*/ \\\n  m_nonzeroSingularValues = m_diagSize; \\\n\\\n  lapack_int lda = matrix.outerStride(), ldu, ldvt; \\\n  lapack_int matrix_order = MKLCOLROW; \\\n  char jobu, jobvt; \\\n  MKLTYPE *u, *vt, dummy; \\\n  jobu  = (m_computeFullU) ? 'A' : (m_computeThinU) ? 'S' : 'N'; \\\n  jobvt = (m_computeFullV) ? 'A' : (m_computeThinV) ? 'S' : 'N'; \\\n  if (computeU()) { \\\n    ldu  = m_matrixU.outerStride(); \\\n    u    = (MKLTYPE*)m_matrixU.data(); \\\n  } else { ldu=1; u=&dummy; }\\\n  MatrixType localV; \\\n  ldvt = (m_computeFullV) ? m_cols : (m_computeThinV) ? m_diagSize : 1; \\\n  if (computeV()) { \\\n    localV.resize(ldvt, m_cols); \\\n    vt   = (MKLTYPE*)localV.data(); \\\n  } else { ldvt=1; vt=&dummy; }\\\n  Matrix<MKLRTYPE, Dynamic, Dynamic> superb; superb.resize(m_diagSize, 1); \\\n  MatrixType m_temp; m_temp = matrix; \\\n  LAPACKE_##MKLPREFIX##gesvd( matrix_order, jobu, jobvt, m_rows, m_cols, (MKLTYPE*)m_temp.data(), lda, (MKLRTYPE*)m_singularValues.data(), u, ldu, vt, ldvt, superb.data()); \\\n  if (computeV()) m_matrixV = localV.adjoint(); \\\n /* for(int i=0;i<m_diagSize;i++) if (m_singularValues.coeffRef(i) < precision) { m_nonzeroSingularValues--; m_singularValues.coeffRef(i)=RealScalar(0);}*/ \\\n  m_isInitialized = true; \\\n  return *this; \\\n}\n\nEIGEN_MKL_SVD(double,   double,        double, d, ColMajor, LAPACK_COL_MAJOR)\nEIGEN_MKL_SVD(float,    float,         float , s, ColMajor, LAPACK_COL_MAJOR)\nEIGEN_MKL_SVD(dcomplex, MKL_Complex16, double, z, ColMajor, LAPACK_COL_MAJOR)\nEIGEN_MKL_SVD(scomplex, MKL_Complex8,  float , c, ColMajor, LAPACK_COL_MAJOR)\n\nEIGEN_MKL_SVD(double,   double,        double, d, RowMajor, LAPACK_ROW_MAJOR)\nEIGEN_MKL_SVD(float,    float,         float , s, RowMajor, LAPACK_ROW_MAJOR)\nEIGEN_MKL_SVD(dcomplex, MKL_Complex16, double, z, RowMajor, LAPACK_ROW_MAJOR)\nEIGEN_MKL_SVD(scomplex, MKL_Complex8,  float , c, RowMajor, LAPACK_ROW_MAJOR)\n\n} // end namespace Eigen\n\n#endif // EIGEN_JACOBISVD_MKL_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SVD/UpperBidiagonalization.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2010 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_BIDIAGONALIZATION_H\n#define EIGEN_BIDIAGONALIZATION_H\n\nnamespace Eigen { \n\nnamespace internal {\n// UpperBidiagonalization will probably be replaced by a Bidiagonalization class, don't want to make it stable API.\n// At the same time, it's useful to keep for now as it's about the only thing that is testing the BandMatrix class.\n\ntemplate<typename _MatrixType> class UpperBidiagonalization\n{\n  public:\n\n    typedef _MatrixType MatrixType;\n    enum {\n      RowsAtCompileTime = MatrixType::RowsAtCompileTime,\n      ColsAtCompileTime = MatrixType::ColsAtCompileTime,\n      ColsAtCompileTimeMinusOne = internal::decrement_size<ColsAtCompileTime>::ret\n    };\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename MatrixType::RealScalar RealScalar;\n    typedef typename MatrixType::Index Index;\n    typedef Matrix<Scalar, 1, ColsAtCompileTime> RowVectorType;\n    typedef Matrix<Scalar, RowsAtCompileTime, 1> ColVectorType;\n    typedef BandMatrix<RealScalar, ColsAtCompileTime, ColsAtCompileTime, 1, 0> BidiagonalType;\n    typedef Matrix<Scalar, ColsAtCompileTime, 1> DiagVectorType;\n    typedef Matrix<Scalar, ColsAtCompileTimeMinusOne, 1> SuperDiagVectorType;\n    typedef HouseholderSequence<\n              const MatrixType,\n              CwiseUnaryOp<internal::scalar_conjugate_op<Scalar>, const Diagonal<const MatrixType,0> >\n            > HouseholderUSequenceType;\n    typedef HouseholderSequence<\n              const typename internal::remove_all<typename MatrixType::ConjugateReturnType>::type,\n              Diagonal<const MatrixType,1>,\n              OnTheRight\n            > HouseholderVSequenceType;\n    \n    /**\n    * \\brief Default Constructor.\n    *\n    * The default constructor is useful in cases in which the user intends to\n    * perform decompositions via Bidiagonalization::compute(const MatrixType&).\n    */\n    UpperBidiagonalization() : m_householder(), m_bidiagonal(), m_isInitialized(false) {}\n\n    UpperBidiagonalization(const MatrixType& matrix)\n      : m_householder(matrix.rows(), matrix.cols()),\n        m_bidiagonal(matrix.cols(), matrix.cols()),\n        m_isInitialized(false)\n    {\n      compute(matrix);\n    }\n    \n    UpperBidiagonalization& compute(const MatrixType& matrix);\n    \n    const MatrixType& householder() const { return m_householder; }\n    const BidiagonalType& bidiagonal() const { return m_bidiagonal; }\n    \n    const HouseholderUSequenceType householderU() const\n    {\n      eigen_assert(m_isInitialized && \"UpperBidiagonalization is not initialized.\");\n      return HouseholderUSequenceType(m_householder, m_householder.diagonal().conjugate());\n    }\n\n    const HouseholderVSequenceType householderV() // const here gives nasty errors and i'm lazy\n    {\n      eigen_assert(m_isInitialized && \"UpperBidiagonalization is not initialized.\");\n      return HouseholderVSequenceType(m_householder.conjugate(), m_householder.const_derived().template diagonal<1>())\n             .setLength(m_householder.cols()-1)\n             .setShift(1);\n    }\n    \n  protected:\n    MatrixType m_householder;\n    BidiagonalType m_bidiagonal;\n    bool m_isInitialized;\n};\n\ntemplate<typename _MatrixType>\nUpperBidiagonalization<_MatrixType>& UpperBidiagonalization<_MatrixType>::compute(const _MatrixType& matrix)\n{\n  Index rows = matrix.rows();\n  Index cols = matrix.cols();\n  \n  eigen_assert(rows >= cols && \"UpperBidiagonalization is only for matrices satisfying rows>=cols.\");\n  \n  m_householder = matrix;\n\n  ColVectorType temp(rows);\n\n  for (Index k = 0; /* breaks at k==cols-1 below */ ; ++k)\n  {\n    Index remainingRows = rows - k;\n    Index remainingCols = cols - k - 1;\n\n    // construct left householder transform in-place in m_householder\n    m_householder.col(k).tail(remainingRows)\n                 .makeHouseholderInPlace(m_householder.coeffRef(k,k),\n                                         m_bidiagonal.template diagonal<0>().coeffRef(k));\n    // apply householder transform to remaining part of m_householder on the left\n    m_householder.bottomRightCorner(remainingRows, remainingCols)\n                 .applyHouseholderOnTheLeft(m_householder.col(k).tail(remainingRows-1),\n                                            m_householder.coeff(k,k),\n                                            temp.data());\n\n    if(k == cols-1) break;\n    \n    // construct right householder transform in-place in m_householder\n    m_householder.row(k).tail(remainingCols)\n                 .makeHouseholderInPlace(m_householder.coeffRef(k,k+1),\n                                         m_bidiagonal.template diagonal<1>().coeffRef(k));\n    // apply householder transform to remaining part of m_householder on the left\n    m_householder.bottomRightCorner(remainingRows-1, remainingCols)\n                 .applyHouseholderOnTheRight(m_householder.row(k).tail(remainingCols-1).transpose(),\n                                             m_householder.coeff(k,k+1),\n                                             temp.data());\n  }\n  m_isInitialized = true;\n  return *this;\n}\n\n#if 0\n/** \\return the Householder QR decomposition of \\c *this.\n  *\n  * \\sa class Bidiagonalization\n  */\ntemplate<typename Derived>\nconst UpperBidiagonalization<typename MatrixBase<Derived>::PlainObject>\nMatrixBase<Derived>::bidiagonalization() const\n{\n  return UpperBidiagonalization<PlainObject>(eval());\n}\n#endif\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_BIDIAGONALIZATION_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseCholesky/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_SparseCholesky_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_SparseCholesky_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/SparseCholesky COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseCholesky/SimplicialCholesky.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2012 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SIMPLICIAL_CHOLESKY_H\n#define EIGEN_SIMPLICIAL_CHOLESKY_H\n\nnamespace Eigen { \n\nenum SimplicialCholeskyMode {\n  SimplicialCholeskyLLT,\n  SimplicialCholeskyLDLT\n};\n\n/** \\ingroup SparseCholesky_Module\n  * \\brief A direct sparse Cholesky factorizations\n  *\n  * These classes provide LL^T and LDL^T Cholesky factorizations of sparse matrices that are\n  * selfadjoint and positive definite. The factorization allows for solving A.X = B where\n  * X and B can be either dense or sparse.\n  * \n  * In order to reduce the fill-in, a symmetric permutation P is applied prior to the factorization\n  * such that the factorized matrix is P A P^-1.\n  *\n  * \\tparam _MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>\n  * \\tparam _UpLo the triangular part that will be used for the computations. It can be Lower\n  *               or Upper. Default is Lower.\n  *\n  */\ntemplate<typename Derived>\nclass SimplicialCholeskyBase : internal::noncopyable\n{\n  public:\n    typedef typename internal::traits<Derived>::MatrixType MatrixType;\n    typedef typename internal::traits<Derived>::OrderingType OrderingType;\n    enum { UpLo = internal::traits<Derived>::UpLo };\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename MatrixType::RealScalar RealScalar;\n    typedef typename MatrixType::Index Index;\n    typedef SparseMatrix<Scalar,ColMajor,Index> CholMatrixType;\n    typedef Matrix<Scalar,Dynamic,1> VectorType;\n\n  public:\n\n    /** Default constructor */\n    SimplicialCholeskyBase()\n      : m_info(Success), m_isInitialized(false), m_shiftOffset(0), m_shiftScale(1)\n    {}\n\n    SimplicialCholeskyBase(const MatrixType& matrix)\n      : m_info(Success), m_isInitialized(false), m_shiftOffset(0), m_shiftScale(1)\n    {\n      derived().compute(matrix);\n    }\n\n    ~SimplicialCholeskyBase()\n    {\n    }\n\n    Derived& derived() { return *static_cast<Derived*>(this); }\n    const Derived& derived() const { return *static_cast<const Derived*>(this); }\n    \n    inline Index cols() const { return m_matrix.cols(); }\n    inline Index rows() const { return m_matrix.rows(); }\n    \n    /** \\brief Reports whether previous computation was successful.\n      *\n      * \\returns \\c Success if computation was succesful,\n      *          \\c NumericalIssue if the matrix.appears to be negative.\n      */\n    ComputationInfo info() const\n    {\n      eigen_assert(m_isInitialized && \"Decomposition is not initialized.\");\n      return m_info;\n    }\n    \n    /** \\returns the solution x of \\f$ A x = b \\f$ using the current decomposition of A.\n      *\n      * \\sa compute()\n      */\n    template<typename Rhs>\n    inline const internal::solve_retval<SimplicialCholeskyBase, Rhs>\n    solve(const MatrixBase<Rhs>& b) const\n    {\n      eigen_assert(m_isInitialized && \"Simplicial LLT or LDLT is not initialized.\");\n      eigen_assert(rows()==b.rows()\n                && \"SimplicialCholeskyBase::solve(): invalid number of rows of the right hand side matrix b\");\n      return internal::solve_retval<SimplicialCholeskyBase, Rhs>(*this, b.derived());\n    }\n    \n    /** \\returns the solution x of \\f$ A x = b \\f$ using the current decomposition of A.\n      *\n      * \\sa compute()\n      */\n    template<typename Rhs>\n    inline const internal::sparse_solve_retval<SimplicialCholeskyBase, Rhs>\n    solve(const SparseMatrixBase<Rhs>& b) const\n    {\n      eigen_assert(m_isInitialized && \"Simplicial LLT or LDLT is not initialized.\");\n      eigen_assert(rows()==b.rows()\n                && \"SimplicialCholesky::solve(): invalid number of rows of the right hand side matrix b\");\n      return internal::sparse_solve_retval<SimplicialCholeskyBase, Rhs>(*this, b.derived());\n    }\n    \n    /** \\returns the permutation P\n      * \\sa permutationPinv() */\n    const PermutationMatrix<Dynamic,Dynamic,Index>& permutationP() const\n    { return m_P; }\n    \n    /** \\returns the inverse P^-1 of the permutation P\n      * \\sa permutationP() */\n    const PermutationMatrix<Dynamic,Dynamic,Index>& permutationPinv() const\n    { return m_Pinv; }\n\n    /** Sets the shift parameters that will be used to adjust the diagonal coefficients during the numerical factorization.\n      *\n      * During the numerical factorization, the diagonal coefficients are transformed by the following linear model:\\n\n      * \\c d_ii = \\a offset + \\a scale * \\c d_ii\n      *\n      * The default is the identity transformation with \\a offset=0, and \\a scale=1.\n      *\n      * \\returns a reference to \\c *this.\n      */\n    Derived& setShift(const RealScalar& offset, const RealScalar& scale = 1)\n    {\n      m_shiftOffset = offset;\n      m_shiftScale = scale;\n      return derived();\n    }\n\n#ifndef EIGEN_PARSED_BY_DOXYGEN\n    /** \\internal */\n    template<typename Stream>\n    void dumpMemory(Stream& s)\n    {\n      int total = 0;\n      s << \"  L:        \" << ((total+=(m_matrix.cols()+1) * sizeof(int) + m_matrix.nonZeros()*(sizeof(int)+sizeof(Scalar))) >> 20) << \"Mb\" << \"\\n\";\n      s << \"  diag:     \" << ((total+=m_diag.size() * sizeof(Scalar)) >> 20) << \"Mb\" << \"\\n\";\n      s << \"  tree:     \" << ((total+=m_parent.size() * sizeof(int)) >> 20) << \"Mb\" << \"\\n\";\n      s << \"  nonzeros: \" << ((total+=m_nonZerosPerCol.size() * sizeof(int)) >> 20) << \"Mb\" << \"\\n\";\n      s << \"  perm:     \" << ((total+=m_P.size() * sizeof(int)) >> 20) << \"Mb\" << \"\\n\";\n      s << \"  perm^-1:  \" << ((total+=m_Pinv.size() * sizeof(int)) >> 20) << \"Mb\" << \"\\n\";\n      s << \"  TOTAL:    \" << (total>> 20) << \"Mb\" << \"\\n\";\n    }\n\n    /** \\internal */\n    template<typename Rhs,typename Dest>\n    void _solve(const MatrixBase<Rhs> &b, MatrixBase<Dest> &dest) const\n    {\n      eigen_assert(m_factorizationIsOk && \"The decomposition is not in a valid state for solving, you must first call either compute() or symbolic()/numeric()\");\n      eigen_assert(m_matrix.rows()==b.rows());\n\n      if(m_info!=Success)\n        return;\n\n      if(m_P.size()>0)\n        dest = m_P * b;\n      else\n        dest = b;\n\n      if(m_matrix.nonZeros()>0) // otherwise L==I\n        derived().matrixL().solveInPlace(dest);\n\n      if(m_diag.size()>0)\n        dest = m_diag.asDiagonal().inverse() * dest;\n\n      if (m_matrix.nonZeros()>0) // otherwise U==I\n        derived().matrixU().solveInPlace(dest);\n\n      if(m_P.size()>0)\n        dest = m_Pinv * dest;\n    }\n\n#endif // EIGEN_PARSED_BY_DOXYGEN\n\n  protected:\n    \n    /** Computes the sparse Cholesky decomposition of \\a matrix */\n    template<bool DoLDLT>\n    void compute(const MatrixType& matrix)\n    {\n      eigen_assert(matrix.rows()==matrix.cols());\n      Index size = matrix.cols();\n      CholMatrixType ap(size,size);\n      ordering(matrix, ap);\n      analyzePattern_preordered(ap, DoLDLT);\n      factorize_preordered<DoLDLT>(ap);\n    }\n    \n    template<bool DoLDLT>\n    void factorize(const MatrixType& a)\n    {\n      eigen_assert(a.rows()==a.cols());\n      int size = a.cols();\n      CholMatrixType ap(size,size);\n      ap.template selfadjointView<Upper>() = a.template selfadjointView<UpLo>().twistedBy(m_P);\n      factorize_preordered<DoLDLT>(ap);\n    }\n\n    template<bool DoLDLT>\n    void factorize_preordered(const CholMatrixType& a);\n\n    void analyzePattern(const MatrixType& a, bool doLDLT)\n    {\n      eigen_assert(a.rows()==a.cols());\n      int size = a.cols();\n      CholMatrixType ap(size,size);\n      ordering(a, ap);\n      analyzePattern_preordered(ap,doLDLT);\n    }\n    void analyzePattern_preordered(const CholMatrixType& a, bool doLDLT);\n    \n    void ordering(const MatrixType& a, CholMatrixType& ap);\n\n    /** keeps off-diagonal entries; drops diagonal entries */\n    struct keep_diag {\n      inline bool operator() (const Index& row, const Index& col, const Scalar&) const\n      {\n        return row!=col;\n      }\n    };\n\n    mutable ComputationInfo m_info;\n    bool m_isInitialized;\n    bool m_factorizationIsOk;\n    bool m_analysisIsOk;\n    \n    CholMatrixType m_matrix;\n    VectorType m_diag;                                // the diagonal coefficients (LDLT mode)\n    VectorXi m_parent;                                // elimination tree\n    VectorXi m_nonZerosPerCol;\n    PermutationMatrix<Dynamic,Dynamic,Index> m_P;     // the permutation\n    PermutationMatrix<Dynamic,Dynamic,Index> m_Pinv;  // the inverse permutation\n\n    RealScalar m_shiftOffset;\n    RealScalar m_shiftScale;\n};\n\ntemplate<typename _MatrixType, int _UpLo = Lower, typename _Ordering = AMDOrdering<typename _MatrixType::Index> > class SimplicialLLT;\ntemplate<typename _MatrixType, int _UpLo = Lower, typename _Ordering = AMDOrdering<typename _MatrixType::Index> > class SimplicialLDLT;\ntemplate<typename _MatrixType, int _UpLo = Lower, typename _Ordering = AMDOrdering<typename _MatrixType::Index> > class SimplicialCholesky;\n\nnamespace internal {\n\ntemplate<typename _MatrixType, int _UpLo, typename _Ordering> struct traits<SimplicialLLT<_MatrixType,_UpLo,_Ordering> >\n{\n  typedef _MatrixType MatrixType;\n  typedef _Ordering OrderingType;\n  enum { UpLo = _UpLo };\n  typedef typename MatrixType::Scalar                         Scalar;\n  typedef typename MatrixType::Index                          Index;\n  typedef SparseMatrix<Scalar, ColMajor, Index>               CholMatrixType;\n  typedef SparseTriangularView<CholMatrixType, Eigen::Lower>  MatrixL;\n  typedef SparseTriangularView<typename CholMatrixType::AdjointReturnType, Eigen::Upper>   MatrixU;\n  static inline MatrixL getL(const MatrixType& m) { return m; }\n  static inline MatrixU getU(const MatrixType& m) { return m.adjoint(); }\n};\n\ntemplate<typename _MatrixType,int _UpLo, typename _Ordering> struct traits<SimplicialLDLT<_MatrixType,_UpLo,_Ordering> >\n{\n  typedef _MatrixType MatrixType;\n  typedef _Ordering OrderingType;\n  enum { UpLo = _UpLo };\n  typedef typename MatrixType::Scalar                             Scalar;\n  typedef typename MatrixType::Index                              Index;\n  typedef SparseMatrix<Scalar, ColMajor, Index>                   CholMatrixType;\n  typedef SparseTriangularView<CholMatrixType, Eigen::UnitLower>  MatrixL;\n  typedef SparseTriangularView<typename CholMatrixType::AdjointReturnType, Eigen::UnitUpper> MatrixU;\n  static inline MatrixL getL(const MatrixType& m) { return m; }\n  static inline MatrixU getU(const MatrixType& m) { return m.adjoint(); }\n};\n\ntemplate<typename _MatrixType, int _UpLo, typename _Ordering> struct traits<SimplicialCholesky<_MatrixType,_UpLo,_Ordering> >\n{\n  typedef _MatrixType MatrixType;\n  typedef _Ordering OrderingType;\n  enum { UpLo = _UpLo };\n};\n\n}\n\n/** \\ingroup SparseCholesky_Module\n  * \\class SimplicialLLT\n  * \\brief A direct sparse LLT Cholesky factorizations\n  *\n  * This class provides a LL^T Cholesky factorizations of sparse matrices that are\n  * selfadjoint and positive definite. The factorization allows for solving A.X = B where\n  * X and B can be either dense or sparse.\n  * \n  * In order to reduce the fill-in, a symmetric permutation P is applied prior to the factorization\n  * such that the factorized matrix is P A P^-1.\n  *\n  * \\tparam _MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>\n  * \\tparam _UpLo the triangular part that will be used for the computations. It can be Lower\n  *               or Upper. Default is Lower.\n  * \\tparam _Ordering The ordering method to use, either AMDOrdering<> or NaturalOrdering<>. Default is AMDOrdering<>\n  *\n  * \\sa class SimplicialLDLT, class AMDOrdering, class NaturalOrdering\n  */\ntemplate<typename _MatrixType, int _UpLo, typename _Ordering>\n    class SimplicialLLT : public SimplicialCholeskyBase<SimplicialLLT<_MatrixType,_UpLo,_Ordering> >\n{\npublic:\n    typedef _MatrixType MatrixType;\n    enum { UpLo = _UpLo };\n    typedef SimplicialCholeskyBase<SimplicialLLT> Base;\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename MatrixType::RealScalar RealScalar;\n    typedef typename MatrixType::Index Index;\n    typedef SparseMatrix<Scalar,ColMajor,Index> CholMatrixType;\n    typedef Matrix<Scalar,Dynamic,1> VectorType;\n    typedef internal::traits<SimplicialLLT> Traits;\n    typedef typename Traits::MatrixL  MatrixL;\n    typedef typename Traits::MatrixU  MatrixU;\npublic:\n    /** Default constructor */\n    SimplicialLLT() : Base() {}\n    /** Constructs and performs the LLT factorization of \\a matrix */\n    SimplicialLLT(const MatrixType& matrix)\n        : Base(matrix) {}\n\n    /** \\returns an expression of the factor L */\n    inline const MatrixL matrixL() const {\n        eigen_assert(Base::m_factorizationIsOk && \"Simplicial LLT not factorized\");\n        return Traits::getL(Base::m_matrix);\n    }\n\n    /** \\returns an expression of the factor U (= L^*) */\n    inline const MatrixU matrixU() const {\n        eigen_assert(Base::m_factorizationIsOk && \"Simplicial LLT not factorized\");\n        return Traits::getU(Base::m_matrix);\n    }\n    \n    /** Computes the sparse Cholesky decomposition of \\a matrix */\n    SimplicialLLT& compute(const MatrixType& matrix)\n    {\n      Base::template compute<false>(matrix);\n      return *this;\n    }\n\n    /** Performs a symbolic decomposition on the sparcity of \\a matrix.\n      *\n      * This function is particularly useful when solving for several problems having the same structure.\n      *\n      * \\sa factorize()\n      */\n    void analyzePattern(const MatrixType& a)\n    {\n      Base::analyzePattern(a, false);\n    }\n\n    /** Performs a numeric decomposition of \\a matrix\n      *\n      * The given matrix must has the same sparcity than the matrix on which the symbolic decomposition has been performed.\n      *\n      * \\sa analyzePattern()\n      */\n    void factorize(const MatrixType& a)\n    {\n      Base::template factorize<false>(a);\n    }\n\n    /** \\returns the determinant of the underlying matrix from the current factorization */\n    Scalar determinant() const\n    {\n      Scalar detL = Base::m_matrix.diagonal().prod();\n      return numext::abs2(detL);\n    }\n};\n\n/** \\ingroup SparseCholesky_Module\n  * \\class SimplicialLDLT\n  * \\brief A direct sparse LDLT Cholesky factorizations without square root.\n  *\n  * This class provides a LDL^T Cholesky factorizations without square root of sparse matrices that are\n  * selfadjoint and positive definite. The factorization allows for solving A.X = B where\n  * X and B can be either dense or sparse.\n  * \n  * In order to reduce the fill-in, a symmetric permutation P is applied prior to the factorization\n  * such that the factorized matrix is P A P^-1.\n  *\n  * \\tparam _MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>\n  * \\tparam _UpLo the triangular part that will be used for the computations. It can be Lower\n  *               or Upper. Default is Lower.\n  * \\tparam _Ordering The ordering method to use, either AMDOrdering<> or NaturalOrdering<>. Default is AMDOrdering<>\n  *\n  * \\sa class SimplicialLLT, class AMDOrdering, class NaturalOrdering\n  */\ntemplate<typename _MatrixType, int _UpLo, typename _Ordering>\n    class SimplicialLDLT : public SimplicialCholeskyBase<SimplicialLDLT<_MatrixType,_UpLo,_Ordering> >\n{\npublic:\n    typedef _MatrixType MatrixType;\n    enum { UpLo = _UpLo };\n    typedef SimplicialCholeskyBase<SimplicialLDLT> Base;\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename MatrixType::RealScalar RealScalar;\n    typedef typename MatrixType::Index Index;\n    typedef SparseMatrix<Scalar,ColMajor,Index> CholMatrixType;\n    typedef Matrix<Scalar,Dynamic,1> VectorType;\n    typedef internal::traits<SimplicialLDLT> Traits;\n    typedef typename Traits::MatrixL  MatrixL;\n    typedef typename Traits::MatrixU  MatrixU;\npublic:\n    /** Default constructor */\n    SimplicialLDLT() : Base() {}\n\n    /** Constructs and performs the LLT factorization of \\a matrix */\n    SimplicialLDLT(const MatrixType& matrix)\n        : Base(matrix) {}\n\n    /** \\returns a vector expression of the diagonal D */\n    inline const VectorType vectorD() const {\n        eigen_assert(Base::m_factorizationIsOk && \"Simplicial LDLT not factorized\");\n        return Base::m_diag;\n    }\n    /** \\returns an expression of the factor L */\n    inline const MatrixL matrixL() const {\n        eigen_assert(Base::m_factorizationIsOk && \"Simplicial LDLT not factorized\");\n        return Traits::getL(Base::m_matrix);\n    }\n\n    /** \\returns an expression of the factor U (= L^*) */\n    inline const MatrixU matrixU() const {\n        eigen_assert(Base::m_factorizationIsOk && \"Simplicial LDLT not factorized\");\n        return Traits::getU(Base::m_matrix);\n    }\n\n    /** Computes the sparse Cholesky decomposition of \\a matrix */\n    SimplicialLDLT& compute(const MatrixType& matrix)\n    {\n      Base::template compute<true>(matrix);\n      return *this;\n    }\n    \n    /** Performs a symbolic decomposition on the sparcity of \\a matrix.\n      *\n      * This function is particularly useful when solving for several problems having the same structure.\n      *\n      * \\sa factorize()\n      */\n    void analyzePattern(const MatrixType& a)\n    {\n      Base::analyzePattern(a, true);\n    }\n\n    /** Performs a numeric decomposition of \\a matrix\n      *\n      * The given matrix must has the same sparcity than the matrix on which the symbolic decomposition has been performed.\n      *\n      * \\sa analyzePattern()\n      */\n    void factorize(const MatrixType& a)\n    {\n      Base::template factorize<true>(a);\n    }\n\n    /** \\returns the determinant of the underlying matrix from the current factorization */\n    Scalar determinant() const\n    {\n      return Base::m_diag.prod();\n    }\n};\n\n/** \\deprecated use SimplicialLDLT or class SimplicialLLT\n  * \\ingroup SparseCholesky_Module\n  * \\class SimplicialCholesky\n  *\n  * \\sa class SimplicialLDLT, class SimplicialLLT\n  */\ntemplate<typename _MatrixType, int _UpLo, typename _Ordering>\n    class SimplicialCholesky : public SimplicialCholeskyBase<SimplicialCholesky<_MatrixType,_UpLo,_Ordering> >\n{\npublic:\n    typedef _MatrixType MatrixType;\n    enum { UpLo = _UpLo };\n    typedef SimplicialCholeskyBase<SimplicialCholesky> Base;\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename MatrixType::RealScalar RealScalar;\n    typedef typename MatrixType::Index Index;\n    typedef SparseMatrix<Scalar,ColMajor,Index> CholMatrixType;\n    typedef Matrix<Scalar,Dynamic,1> VectorType;\n    typedef internal::traits<SimplicialCholesky> Traits;\n    typedef internal::traits<SimplicialLDLT<MatrixType,UpLo> > LDLTTraits;\n    typedef internal::traits<SimplicialLLT<MatrixType,UpLo>  > LLTTraits;\n  public:\n    SimplicialCholesky() : Base(), m_LDLT(true) {}\n\n    SimplicialCholesky(const MatrixType& matrix)\n      : Base(), m_LDLT(true)\n    {\n      compute(matrix);\n    }\n\n    SimplicialCholesky& setMode(SimplicialCholeskyMode mode)\n    {\n      switch(mode)\n      {\n      case SimplicialCholeskyLLT:\n        m_LDLT = false;\n        break;\n      case SimplicialCholeskyLDLT:\n        m_LDLT = true;\n        break;\n      default:\n        break;\n      }\n\n      return *this;\n    }\n\n    inline const VectorType vectorD() const {\n        eigen_assert(Base::m_factorizationIsOk && \"Simplicial Cholesky not factorized\");\n        return Base::m_diag;\n    }\n    inline const CholMatrixType rawMatrix() const {\n        eigen_assert(Base::m_factorizationIsOk && \"Simplicial Cholesky not factorized\");\n        return Base::m_matrix;\n    }\n    \n    /** Computes the sparse Cholesky decomposition of \\a matrix */\n    SimplicialCholesky& compute(const MatrixType& matrix)\n    {\n      if(m_LDLT)\n        Base::template compute<true>(matrix);\n      else\n        Base::template compute<false>(matrix);\n      return *this;\n    }\n\n    /** Performs a symbolic decomposition on the sparcity of \\a matrix.\n      *\n      * This function is particularly useful when solving for several problems having the same structure.\n      *\n      * \\sa factorize()\n      */\n    void analyzePattern(const MatrixType& a)\n    {\n      Base::analyzePattern(a, m_LDLT);\n    }\n\n    /** Performs a numeric decomposition of \\a matrix\n      *\n      * The given matrix must has the same sparcity than the matrix on which the symbolic decomposition has been performed.\n      *\n      * \\sa analyzePattern()\n      */\n    void factorize(const MatrixType& a)\n    {\n      if(m_LDLT)\n        Base::template factorize<true>(a);\n      else\n        Base::template factorize<false>(a);\n    }\n\n    /** \\internal */\n    template<typename Rhs,typename Dest>\n    void _solve(const MatrixBase<Rhs> &b, MatrixBase<Dest> &dest) const\n    {\n      eigen_assert(Base::m_factorizationIsOk && \"The decomposition is not in a valid state for solving, you must first call either compute() or symbolic()/numeric()\");\n      eigen_assert(Base::m_matrix.rows()==b.rows());\n\n      if(Base::m_info!=Success)\n        return;\n\n      if(Base::m_P.size()>0)\n        dest = Base::m_P * b;\n      else\n        dest = b;\n\n      if(Base::m_matrix.nonZeros()>0) // otherwise L==I\n      {\n        if(m_LDLT)\n          LDLTTraits::getL(Base::m_matrix).solveInPlace(dest);\n        else\n          LLTTraits::getL(Base::m_matrix).solveInPlace(dest);\n      }\n\n      if(Base::m_diag.size()>0)\n        dest = Base::m_diag.asDiagonal().inverse() * dest;\n\n      if (Base::m_matrix.nonZeros()>0) // otherwise I==I\n      {\n        if(m_LDLT)\n          LDLTTraits::getU(Base::m_matrix).solveInPlace(dest);\n        else\n          LLTTraits::getU(Base::m_matrix).solveInPlace(dest);\n      }\n\n      if(Base::m_P.size()>0)\n        dest = Base::m_Pinv * dest;\n    }\n    \n    Scalar determinant() const\n    {\n      if(m_LDLT)\n      {\n        return Base::m_diag.prod();\n      }\n      else\n      {\n        Scalar detL = Diagonal<const CholMatrixType>(Base::m_matrix).prod();\n        return numext::abs2(detL);\n      }\n    }\n    \n  protected:\n    bool m_LDLT;\n};\n\ntemplate<typename Derived>\nvoid SimplicialCholeskyBase<Derived>::ordering(const MatrixType& a, CholMatrixType& ap)\n{\n  eigen_assert(a.rows()==a.cols());\n  const Index size = a.rows();\n  // Note that amd compute the inverse permutation\n  {\n    CholMatrixType C;\n    C = a.template selfadjointView<UpLo>();\n    \n    OrderingType ordering;\n    ordering(C,m_Pinv);\n  }\n\n  if(m_Pinv.size()>0)\n    m_P = m_Pinv.inverse();\n  else\n    m_P.resize(0);\n\n  ap.resize(size,size);\n  ap.template selfadjointView<Upper>() = a.template selfadjointView<UpLo>().twistedBy(m_P);\n}\n\nnamespace internal {\n  \ntemplate<typename Derived, typename Rhs>\nstruct solve_retval<SimplicialCholeskyBase<Derived>, Rhs>\n  : solve_retval_base<SimplicialCholeskyBase<Derived>, Rhs>\n{\n  typedef SimplicialCholeskyBase<Derived> Dec;\n  EIGEN_MAKE_SOLVE_HELPERS(Dec,Rhs)\n\n  template<typename Dest> void evalTo(Dest& dst) const\n  {\n    dec().derived()._solve(rhs(),dst);\n  }\n};\n\ntemplate<typename Derived, typename Rhs>\nstruct sparse_solve_retval<SimplicialCholeskyBase<Derived>, Rhs>\n  : sparse_solve_retval_base<SimplicialCholeskyBase<Derived>, Rhs>\n{\n  typedef SimplicialCholeskyBase<Derived> Dec;\n  EIGEN_MAKE_SPARSE_SOLVE_HELPERS(Dec,Rhs)\n\n  template<typename Dest> void evalTo(Dest& dst) const\n  {\n    this->defaultEvalTo(dst);\n  }\n};\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_SIMPLICIAL_CHOLESKY_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2012 Gael Guennebaud <gael.guennebaud@inria.fr>\n\n/*\n\nNOTE: thes functions vave been adapted from the LDL library:\n\nLDL Copyright (c) 2005 by Timothy A. Davis.  All Rights Reserved.\n\nLDL License:\n\n    Your use or distribution of LDL or any modified version of\n    LDL implies that you agree to this License.\n\n    This library is free software; you can redistribute it and/or\n    modify it under the terms of the GNU Lesser General Public\n    License as published by the Free Software Foundation; either\n    version 2.1 of the License, or (at your option) any later version.\n\n    This library 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 GNU\n    Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public\n    License along with this library; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301\n    USA\n\n    Permission is hereby granted to use or copy this program under the\n    terms of the GNU LGPL, provided that the Copyright, this License,\n    and the Availability of the original version is retained on all copies.\n    User documentation of any code that uses this code or any modified\n    version of this code must cite the Copyright, this License, the\n    Availability note, and \"Used by permission.\" Permission to modify\n    the code and to distribute modified code is granted, provided the\n    Copyright, this License, and the Availability note are retained,\n    and a notice that the code was modified is included.\n */\n\n#include \"../Core/util/NonMPL2.h\"\n\n#ifndef EIGEN_SIMPLICIAL_CHOLESKY_IMPL_H\n#define EIGEN_SIMPLICIAL_CHOLESKY_IMPL_H\n\nnamespace Eigen {\n\ntemplate<typename Derived>\nvoid SimplicialCholeskyBase<Derived>::analyzePattern_preordered(const CholMatrixType& ap, bool doLDLT)\n{\n  const Index size = ap.rows();\n  m_matrix.resize(size, size);\n  m_parent.resize(size);\n  m_nonZerosPerCol.resize(size);\n\n  ei_declare_aligned_stack_constructed_variable(Index, tags, size, 0);\n\n  for(Index k = 0; k < size; ++k)\n  {\n    /* L(k,:) pattern: all nodes reachable in etree from nz in A(0:k-1,k) */\n    m_parent[k] = -1;             /* parent of k is not yet known */\n    tags[k] = k;                  /* mark node k as visited */\n    m_nonZerosPerCol[k] = 0;      /* count of nonzeros in column k of L */\n    for(typename CholMatrixType::InnerIterator it(ap,k); it; ++it)\n    {\n      Index i = it.index();\n      if(i < k)\n      {\n        /* follow path from i to root of etree, stop at flagged node */\n        for(; tags[i] != k; i = m_parent[i])\n        {\n          /* find parent of i if not yet determined */\n          if (m_parent[i] == -1)\n            m_parent[i] = k;\n          m_nonZerosPerCol[i]++;        /* L (k,i) is nonzero */\n          tags[i] = k;                  /* mark i as visited */\n        }\n      }\n    }\n  }\n\n  /* construct Lp index array from m_nonZerosPerCol column counts */\n  Index* Lp = m_matrix.outerIndexPtr();\n  Lp[0] = 0;\n  for(Index k = 0; k < size; ++k)\n    Lp[k+1] = Lp[k] + m_nonZerosPerCol[k] + (doLDLT ? 0 : 1);\n\n  m_matrix.resizeNonZeros(Lp[size]);\n\n  m_isInitialized     = true;\n  m_info              = Success;\n  m_analysisIsOk      = true;\n  m_factorizationIsOk = false;\n}\n\n\ntemplate<typename Derived>\ntemplate<bool DoLDLT>\nvoid SimplicialCholeskyBase<Derived>::factorize_preordered(const CholMatrixType& ap)\n{\n  using std::sqrt;\n\n  eigen_assert(m_analysisIsOk && \"You must first call analyzePattern()\");\n  eigen_assert(ap.rows()==ap.cols());\n  const Index size = ap.rows();\n  eigen_assert(m_parent.size()==size);\n  eigen_assert(m_nonZerosPerCol.size()==size);\n\n  const Index* Lp = m_matrix.outerIndexPtr();\n  Index* Li = m_matrix.innerIndexPtr();\n  Scalar* Lx = m_matrix.valuePtr();\n\n  ei_declare_aligned_stack_constructed_variable(Scalar, y, size, 0);\n  ei_declare_aligned_stack_constructed_variable(Index,  pattern, size, 0);\n  ei_declare_aligned_stack_constructed_variable(Index,  tags, size, 0);\n\n  bool ok = true;\n  m_diag.resize(DoLDLT ? size : 0);\n\n  for(Index k = 0; k < size; ++k)\n  {\n    // compute nonzero pattern of kth row of L, in topological order\n    y[k] = 0.0;                     // Y(0:k) is now all zero\n    Index top = size;               // stack for pattern is empty\n    tags[k] = k;                    // mark node k as visited\n    m_nonZerosPerCol[k] = 0;        // count of nonzeros in column k of L\n    for(typename MatrixType::InnerIterator it(ap,k); it; ++it)\n    {\n      Index i = it.index();\n      if(i <= k)\n      {\n        y[i] += numext::conj(it.value());            /* scatter A(i,k) into Y (sum duplicates) */\n        Index len;\n        for(len = 0; tags[i] != k; i = m_parent[i])\n        {\n          pattern[len++] = i;     /* L(k,i) is nonzero */\n          tags[i] = k;            /* mark i as visited */\n        }\n        while(len > 0)\n          pattern[--top] = pattern[--len];\n      }\n    }\n\n    /* compute numerical values kth row of L (a sparse triangular solve) */\n\n    RealScalar d = numext::real(y[k]) * m_shiftScale + m_shiftOffset;    // get D(k,k), apply the shift function, and clear Y(k)\n    y[k] = 0.0;\n    for(; top < size; ++top)\n    {\n      Index i = pattern[top];       /* pattern[top:n-1] is pattern of L(:,k) */\n      Scalar yi = y[i];             /* get and clear Y(i) */\n      y[i] = 0.0;\n\n      /* the nonzero entry L(k,i) */\n      Scalar l_ki;\n      if(DoLDLT)\n        l_ki = yi / m_diag[i];\n      else\n        yi = l_ki = yi / Lx[Lp[i]];\n\n      Index p2 = Lp[i] + m_nonZerosPerCol[i];\n      Index p;\n      for(p = Lp[i] + (DoLDLT ? 0 : 1); p < p2; ++p)\n        y[Li[p]] -= numext::conj(Lx[p]) * yi;\n      d -= numext::real(l_ki * numext::conj(yi));\n      Li[p] = k;                          /* store L(k,i) in column form of L */\n      Lx[p] = l_ki;\n      ++m_nonZerosPerCol[i];              /* increment count of nonzeros in col i */\n    }\n    if(DoLDLT)\n    {\n      m_diag[k] = d;\n      if(d == RealScalar(0))\n      {\n        ok = false;                         /* failure, D(k,k) is zero */\n        break;\n      }\n    }\n    else\n    {\n      Index p = Lp[k] + m_nonZerosPerCol[k]++;\n      Li[p] = k ;                /* store L(k,k) = sqrt (d) in column k */\n      if(d <= RealScalar(0)) {\n        ok = false;              /* failure, matrix is not positive definite */\n        break;\n      }\n      Lx[p] = sqrt(d) ;\n    }\n  }\n\n  m_info = ok ? Success : NumericalIssue;\n  m_factorizationIsOk = true;\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_SIMPLICIAL_CHOLESKY_IMPL_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseCore/AmbiVector.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_AMBIVECTOR_H\n#define EIGEN_AMBIVECTOR_H\n\nnamespace Eigen { \n\nnamespace internal {\n\n/** \\internal\n  * Hybrid sparse/dense vector class designed for intensive read-write operations.\n  *\n  * See BasicSparseLLT and SparseProduct for usage examples.\n  */\ntemplate<typename _Scalar, typename _Index>\nclass AmbiVector\n{\n  public:\n    typedef _Scalar Scalar;\n    typedef _Index Index;\n    typedef typename NumTraits<Scalar>::Real RealScalar;\n\n    AmbiVector(Index size)\n      : m_buffer(0), m_zero(0), m_size(0), m_allocatedSize(0), m_allocatedElements(0), m_mode(-1)\n    {\n      resize(size);\n    }\n\n    void init(double estimatedDensity);\n    void init(int mode);\n\n    Index nonZeros() const;\n\n    /** Specifies a sub-vector to work on */\n    void setBounds(Index start, Index end) { m_start = start; m_end = end; }\n\n    void setZero();\n\n    void restart();\n    Scalar& coeffRef(Index i);\n    Scalar& coeff(Index i);\n\n    class Iterator;\n\n    ~AmbiVector() { delete[] m_buffer; }\n\n    void resize(Index size)\n    {\n      if (m_allocatedSize < size)\n        reallocate(size);\n      m_size = size;\n    }\n\n    Index size() const { return m_size; }\n\n  protected:\n\n    void reallocate(Index size)\n    {\n      // if the size of the matrix is not too large, let's allocate a bit more than needed such\n      // that we can handle dense vector even in sparse mode.\n      delete[] m_buffer;\n      if (size<1000)\n      {\n        Index allocSize = (size * sizeof(ListEl) + sizeof(Scalar) - 1)/sizeof(Scalar);\n        m_allocatedElements = (allocSize*sizeof(Scalar))/sizeof(ListEl);\n        m_buffer = new Scalar[allocSize];\n      }\n      else\n      {\n        m_allocatedElements = (size*sizeof(Scalar))/sizeof(ListEl);\n        m_buffer = new Scalar[size];\n      }\n      m_size = size;\n      m_start = 0;\n      m_end = m_size;\n    }\n\n    void reallocateSparse()\n    {\n      Index copyElements = m_allocatedElements;\n      m_allocatedElements = (std::min)(Index(m_allocatedElements*1.5),m_size);\n      Index allocSize = m_allocatedElements * sizeof(ListEl);\n      allocSize = (allocSize + sizeof(Scalar) - 1)/sizeof(Scalar);\n      Scalar* newBuffer = new Scalar[allocSize];\n      memcpy(newBuffer,  m_buffer,  copyElements * sizeof(ListEl));\n      delete[] m_buffer;\n      m_buffer = newBuffer;\n    }\n\n  protected:\n    // element type of the linked list\n    struct ListEl\n    {\n      Index next;\n      Index index;\n      Scalar value;\n    };\n\n    // used to store data in both mode\n    Scalar* m_buffer;\n    Scalar m_zero;\n    Index m_size;\n    Index m_start;\n    Index m_end;\n    Index m_allocatedSize;\n    Index m_allocatedElements;\n    Index m_mode;\n\n    // linked list mode\n    Index m_llStart;\n    Index m_llCurrent;\n    Index m_llSize;\n};\n\n/** \\returns the number of non zeros in the current sub vector */\ntemplate<typename _Scalar,typename _Index>\n_Index AmbiVector<_Scalar,_Index>::nonZeros() const\n{\n  if (m_mode==IsSparse)\n    return m_llSize;\n  else\n    return m_end - m_start;\n}\n\ntemplate<typename _Scalar,typename _Index>\nvoid AmbiVector<_Scalar,_Index>::init(double estimatedDensity)\n{\n  if (estimatedDensity>0.1)\n    init(IsDense);\n  else\n    init(IsSparse);\n}\n\ntemplate<typename _Scalar,typename _Index>\nvoid AmbiVector<_Scalar,_Index>::init(int mode)\n{\n  m_mode = mode;\n  if (m_mode==IsSparse)\n  {\n    m_llSize = 0;\n    m_llStart = -1;\n  }\n}\n\n/** Must be called whenever we might perform a write access\n  * with an index smaller than the previous one.\n  *\n  * Don't worry, this function is extremely cheap.\n  */\ntemplate<typename _Scalar,typename _Index>\nvoid AmbiVector<_Scalar,_Index>::restart()\n{\n  m_llCurrent = m_llStart;\n}\n\n/** Set all coefficients of current subvector to zero */\ntemplate<typename _Scalar,typename _Index>\nvoid AmbiVector<_Scalar,_Index>::setZero()\n{\n  if (m_mode==IsDense)\n  {\n    for (Index i=m_start; i<m_end; ++i)\n      m_buffer[i] = Scalar(0);\n  }\n  else\n  {\n    eigen_assert(m_mode==IsSparse);\n    m_llSize = 0;\n    m_llStart = -1;\n  }\n}\n\ntemplate<typename _Scalar,typename _Index>\n_Scalar& AmbiVector<_Scalar,_Index>::coeffRef(_Index i)\n{\n  if (m_mode==IsDense)\n    return m_buffer[i];\n  else\n  {\n    ListEl* EIGEN_RESTRICT llElements = reinterpret_cast<ListEl*>(m_buffer);\n    // TODO factorize the following code to reduce code generation\n    eigen_assert(m_mode==IsSparse);\n    if (m_llSize==0)\n    {\n      // this is the first element\n      m_llStart = 0;\n      m_llCurrent = 0;\n      ++m_llSize;\n      llElements[0].value = Scalar(0);\n      llElements[0].index = i;\n      llElements[0].next = -1;\n      return llElements[0].value;\n    }\n    else if (i<llElements[m_llStart].index)\n    {\n      // this is going to be the new first element of the list\n      ListEl& el = llElements[m_llSize];\n      el.value = Scalar(0);\n      el.index = i;\n      el.next = m_llStart;\n      m_llStart = m_llSize;\n      ++m_llSize;\n      m_llCurrent = m_llStart;\n      return el.value;\n    }\n    else\n    {\n      Index nextel = llElements[m_llCurrent].next;\n      eigen_assert(i>=llElements[m_llCurrent].index && \"you must call restart() before inserting an element with lower or equal index\");\n      while (nextel >= 0 && llElements[nextel].index<=i)\n      {\n        m_llCurrent = nextel;\n        nextel = llElements[nextel].next;\n      }\n\n      if (llElements[m_llCurrent].index==i)\n      {\n        // the coefficient already exists and we found it !\n        return llElements[m_llCurrent].value;\n      }\n      else\n      {\n        if (m_llSize>=m_allocatedElements)\n        {\n          reallocateSparse();\n          llElements = reinterpret_cast<ListEl*>(m_buffer);\n        }\n        eigen_internal_assert(m_llSize<m_allocatedElements && \"internal error: overflow in sparse mode\");\n        // let's insert a new coefficient\n        ListEl& el = llElements[m_llSize];\n        el.value = Scalar(0);\n        el.index = i;\n        el.next = llElements[m_llCurrent].next;\n        llElements[m_llCurrent].next = m_llSize;\n        ++m_llSize;\n        return el.value;\n      }\n    }\n  }\n}\n\ntemplate<typename _Scalar,typename _Index>\n_Scalar& AmbiVector<_Scalar,_Index>::coeff(_Index i)\n{\n  if (m_mode==IsDense)\n    return m_buffer[i];\n  else\n  {\n    ListEl* EIGEN_RESTRICT llElements = reinterpret_cast<ListEl*>(m_buffer);\n    eigen_assert(m_mode==IsSparse);\n    if ((m_llSize==0) || (i<llElements[m_llStart].index))\n    {\n      return m_zero;\n    }\n    else\n    {\n      Index elid = m_llStart;\n      while (elid >= 0 && llElements[elid].index<i)\n        elid = llElements[elid].next;\n\n      if (llElements[elid].index==i)\n        return llElements[m_llCurrent].value;\n      else\n        return m_zero;\n    }\n  }\n}\n\n/** Iterator over the nonzero coefficients */\ntemplate<typename _Scalar,typename _Index>\nclass AmbiVector<_Scalar,_Index>::Iterator\n{\n  public:\n    typedef _Scalar Scalar;\n    typedef typename NumTraits<Scalar>::Real RealScalar;\n\n    /** Default constructor\n      * \\param vec the vector on which we iterate\n      * \\param epsilon the minimal value used to prune zero coefficients.\n      * In practice, all coefficients having a magnitude smaller than \\a epsilon\n      * are skipped.\n      */\n    Iterator(const AmbiVector& vec, const RealScalar& epsilon = 0)\n      : m_vector(vec)\n    {\n      using std::abs;\n      m_epsilon = epsilon;\n      m_isDense = m_vector.m_mode==IsDense;\n      if (m_isDense)\n      {\n        m_currentEl = 0;   // this is to avoid a compilation warning\n        m_cachedValue = 0; // this is to avoid a compilation warning\n        m_cachedIndex = m_vector.m_start-1;\n        ++(*this);\n      }\n      else\n      {\n        ListEl* EIGEN_RESTRICT llElements = reinterpret_cast<ListEl*>(m_vector.m_buffer);\n        m_currentEl = m_vector.m_llStart;\n        while (m_currentEl>=0 && abs(llElements[m_currentEl].value)<=m_epsilon)\n          m_currentEl = llElements[m_currentEl].next;\n        if (m_currentEl<0)\n        {\n          m_cachedValue = 0; // this is to avoid a compilation warning\n          m_cachedIndex = -1;\n        }\n        else\n        {\n          m_cachedIndex = llElements[m_currentEl].index;\n          m_cachedValue = llElements[m_currentEl].value;\n        }\n      }\n    }\n\n    Index index() const { return m_cachedIndex; }\n    Scalar value() const { return m_cachedValue; }\n\n    operator bool() const { return m_cachedIndex>=0; }\n\n    Iterator& operator++()\n    {\n      using std::abs;\n      if (m_isDense)\n      {\n        do {\n          ++m_cachedIndex;\n        } while (m_cachedIndex<m_vector.m_end && abs(m_vector.m_buffer[m_cachedIndex])<m_epsilon);\n        if (m_cachedIndex<m_vector.m_end)\n          m_cachedValue = m_vector.m_buffer[m_cachedIndex];\n        else\n          m_cachedIndex=-1;\n      }\n      else\n      {\n        ListEl* EIGEN_RESTRICT llElements = reinterpret_cast<ListEl*>(m_vector.m_buffer);\n        do {\n          m_currentEl = llElements[m_currentEl].next;\n        } while (m_currentEl>=0 && abs(llElements[m_currentEl].value)<m_epsilon);\n        if (m_currentEl<0)\n        {\n          m_cachedIndex = -1;\n        }\n        else\n        {\n          m_cachedIndex = llElements[m_currentEl].index;\n          m_cachedValue = llElements[m_currentEl].value;\n        }\n      }\n      return *this;\n    }\n\n  protected:\n    const AmbiVector& m_vector; // the target vector\n    Index m_currentEl;            // the current element in sparse/linked-list mode\n    RealScalar m_epsilon;       // epsilon used to prune zero coefficients\n    Index m_cachedIndex;          // current coordinate\n    Scalar m_cachedValue;       // current value\n    bool m_isDense;             // mode of the vector\n};\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_AMBIVECTOR_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseCore/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_SparseCore_SRCS \"*.h\")\n\nINSTALL(FILES \n  ${Eigen_SparseCore_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/SparseCore COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseCore/CompressedStorage.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_COMPRESSED_STORAGE_H\n#define EIGEN_COMPRESSED_STORAGE_H\n\nnamespace Eigen { \n\nnamespace internal {\n\n/** \\internal\n  * Stores a sparse set of values as a list of values and a list of indices.\n  *\n  */\ntemplate<typename _Scalar,typename _Index>\nclass CompressedStorage\n{\n  public:\n\n    typedef _Scalar Scalar;\n    typedef _Index Index;\n\n  protected:\n\n    typedef typename NumTraits<Scalar>::Real RealScalar;\n\n  public:\n\n    CompressedStorage()\n      : m_values(0), m_indices(0), m_size(0), m_allocatedSize(0)\n    {}\n\n    CompressedStorage(size_t size)\n      : m_values(0), m_indices(0), m_size(0), m_allocatedSize(0)\n    {\n      resize(size);\n    }\n\n    CompressedStorage(const CompressedStorage& other)\n      : m_values(0), m_indices(0), m_size(0), m_allocatedSize(0)\n    {\n      *this = other;\n    }\n\n    CompressedStorage& operator=(const CompressedStorage& other)\n    {\n      resize(other.size());\n      internal::smart_copy(other.m_values,  other.m_values  + m_size, m_values);\n      internal::smart_copy(other.m_indices, other.m_indices + m_size, m_indices);\n      return *this;\n    }\n\n    void swap(CompressedStorage& other)\n    {\n      std::swap(m_values, other.m_values);\n      std::swap(m_indices, other.m_indices);\n      std::swap(m_size, other.m_size);\n      std::swap(m_allocatedSize, other.m_allocatedSize);\n    }\n\n    ~CompressedStorage()\n    {\n      delete[] m_values;\n      delete[] m_indices;\n    }\n\n    void reserve(size_t size)\n    {\n      size_t newAllocatedSize = m_size + size;\n      if (newAllocatedSize > m_allocatedSize)\n        reallocate(newAllocatedSize);\n    }\n\n    void squeeze()\n    {\n      if (m_allocatedSize>m_size)\n        reallocate(m_size);\n    }\n\n    void resize(size_t size, double reserveSizeFactor = 0)\n    {\n      if (m_allocatedSize<size)\n        reallocate(size + size_t(reserveSizeFactor*double(size)));\n      m_size = size;\n    }\n\n    void append(const Scalar& v, Index i)\n    {\n      Index id = static_cast<Index>(m_size);\n      resize(m_size+1, 1);\n      m_values[id] = v;\n      m_indices[id] = i;\n    }\n\n    inline size_t size() const { return m_size; }\n    inline size_t allocatedSize() const { return m_allocatedSize; }\n    inline void clear() { m_size = 0; }\n\n    const Scalar* valuePtr() const { return m_values; }\n    Scalar* valuePtr() { return m_values; }\n    const Index* indexPtr() const { return m_indices; }\n    Index* indexPtr() { return m_indices; }\n\n    inline Scalar& value(size_t i) { return m_values[i]; }\n    inline const Scalar& value(size_t i) const { return m_values[i]; }\n\n    inline Index& index(size_t i) { return m_indices[i]; }\n    inline const Index& index(size_t i) const { return m_indices[i]; }\n\n    static CompressedStorage Map(Index* indices, Scalar* values, size_t size)\n    {\n      CompressedStorage res;\n      res.m_indices = indices;\n      res.m_values = values;\n      res.m_allocatedSize = res.m_size = size;\n      return res;\n    }\n\n    /** \\returns the largest \\c k such that for all \\c j in [0,k) index[\\c j]\\<\\a key */\n    inline Index searchLowerIndex(Index key) const\n    {\n      return searchLowerIndex(0, m_size, key);\n    }\n\n    /** \\returns the largest \\c k in [start,end) such that for all \\c j in [start,k) index[\\c j]\\<\\a key */\n    inline Index searchLowerIndex(size_t start, size_t end, Index key) const\n    {\n      while(end>start)\n      {\n        size_t mid = (end+start)>>1;\n        if (m_indices[mid]<key)\n          start = mid+1;\n        else\n          end = mid;\n      }\n      return static_cast<Index>(start);\n    }\n\n    /** \\returns the stored value at index \\a key\n      * If the value does not exist, then the value \\a defaultValue is returned without any insertion. */\n    inline Scalar at(Index key, const Scalar& defaultValue = Scalar(0)) const\n    {\n      if (m_size==0)\n        return defaultValue;\n      else if (key==m_indices[m_size-1])\n        return m_values[m_size-1];\n      // ^^  optimization: let's first check if it is the last coefficient\n      // (very common in high level algorithms)\n      const size_t id = searchLowerIndex(0,m_size-1,key);\n      return ((id<m_size) && (m_indices[id]==key)) ? m_values[id] : defaultValue;\n    }\n\n    /** Like at(), but the search is performed in the range [start,end) */\n    inline Scalar atInRange(size_t start, size_t end, Index key, const Scalar& defaultValue = Scalar(0)) const\n    {\n      if (start>=end)\n        return Scalar(0);\n      else if (end>start && key==m_indices[end-1])\n        return m_values[end-1];\n      // ^^  optimization: let's first check if it is the last coefficient\n      // (very common in high level algorithms)\n      const size_t id = searchLowerIndex(start,end-1,key);\n      return ((id<end) && (m_indices[id]==key)) ? m_values[id] : defaultValue;\n    }\n\n    /** \\returns a reference to the value at index \\a key\n      * If the value does not exist, then the value \\a defaultValue is inserted\n      * such that the keys are sorted. */\n    inline Scalar& atWithInsertion(Index key, const Scalar& defaultValue = Scalar(0))\n    {\n      size_t id = searchLowerIndex(0,m_size,key);\n      if (id>=m_size || m_indices[id]!=key)\n      {\n        resize(m_size+1,1);\n        for (size_t j=m_size-1; j>id; --j)\n        {\n          m_indices[j] = m_indices[j-1];\n          m_values[j] = m_values[j-1];\n        }\n        m_indices[id] = key;\n        m_values[id] = defaultValue;\n      }\n      return m_values[id];\n    }\n\n    void prune(const Scalar& reference, const RealScalar& epsilon = NumTraits<RealScalar>::dummy_precision())\n    {\n      size_t k = 0;\n      size_t n = size();\n      for (size_t i=0; i<n; ++i)\n      {\n        if (!internal::isMuchSmallerThan(value(i), reference, epsilon))\n        {\n          value(k) = value(i);\n          index(k) = index(i);\n          ++k;\n        }\n      }\n      resize(k,0);\n    }\n\n  protected:\n\n    inline void reallocate(size_t size)\n    {\n      Scalar* newValues  = new Scalar[size];\n      Index* newIndices = new Index[size];\n      size_t copySize = (std::min)(size, m_size);\n      // copy\n      if (copySize>0) {\n        internal::smart_copy(m_values, m_values+copySize, newValues);\n        internal::smart_copy(m_indices, m_indices+copySize, newIndices);\n      }\n      // delete old stuff\n      delete[] m_values;\n      delete[] m_indices;\n      m_values = newValues;\n      m_indices = newIndices;\n      m_allocatedSize = size;\n    }\n\n  protected:\n    Scalar* m_values;\n    Index* m_indices;\n    size_t m_size;\n    size_t m_allocatedSize;\n\n};\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_COMPRESSED_STORAGE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2011 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_CONSERVATIVESPARSESPARSEPRODUCT_H\n#define EIGEN_CONSERVATIVESPARSESPARSEPRODUCT_H\n\nnamespace Eigen { \n\nnamespace internal {\n\ntemplate<typename Lhs, typename Rhs, typename ResultType>\nstatic void conservative_sparse_sparse_product_impl(const Lhs& lhs, const Rhs& rhs, ResultType& res)\n{\n  typedef typename remove_all<Lhs>::type::Scalar Scalar;\n  typedef typename remove_all<Lhs>::type::Index Index;\n\n  // make sure to call innerSize/outerSize since we fake the storage order.\n  Index rows = lhs.innerSize();\n  Index cols = rhs.outerSize();\n  eigen_assert(lhs.outerSize() == rhs.innerSize());\n\n  std::vector<bool> mask(rows,false);\n  Matrix<Scalar,Dynamic,1> values(rows);\n  Matrix<Index,Dynamic,1>  indices(rows);\n\n  // estimate the number of non zero entries\n  // given a rhs column containing Y non zeros, we assume that the respective Y columns\n  // of the lhs differs in average of one non zeros, thus the number of non zeros for\n  // the product of a rhs column with the lhs is X+Y where X is the average number of non zero\n  // per column of the lhs.\n  // Therefore, we have nnz(lhs*rhs) = nnz(lhs) + nnz(rhs)\n  Index estimated_nnz_prod = lhs.nonZeros() + rhs.nonZeros();\n\n  res.setZero();\n  res.reserve(Index(estimated_nnz_prod));\n  // we compute each column of the result, one after the other\n  for (Index j=0; j<cols; ++j)\n  {\n\n    res.startVec(j);\n    Index nnz = 0;\n    for (typename Rhs::InnerIterator rhsIt(rhs, j); rhsIt; ++rhsIt)\n    {\n      Scalar y = rhsIt.value();\n      Index k = rhsIt.index();\n      for (typename Lhs::InnerIterator lhsIt(lhs, k); lhsIt; ++lhsIt)\n      {\n        Index i = lhsIt.index();\n        Scalar x = lhsIt.value();\n        if(!mask[i])\n        {\n          mask[i] = true;\n          values[i] = x * y;\n          indices[nnz] = i;\n          ++nnz;\n        }\n        else\n          values[i] += x * y;\n      }\n    }\n\n    // unordered insertion\n    for(Index k=0; k<nnz; ++k)\n    {\n      Index i = indices[k];\n      res.insertBackByOuterInnerUnordered(j,i) = values[i];\n      mask[i] = false;\n    }\n\n#if 0\n    // alternative ordered insertion code:\n\n    Index t200 = rows/(log2(200)*1.39);\n    Index t = (rows*100)/139;\n\n    // FIXME reserve nnz non zeros\n    // FIXME implement fast sort algorithms for very small nnz\n    // if the result is sparse enough => use a quick sort\n    // otherwise => loop through the entire vector\n    // In order to avoid to perform an expensive log2 when the\n    // result is clearly very sparse we use a linear bound up to 200.\n    //if((nnz<200 && nnz<t200) || nnz * log2(nnz) < t)\n    //res.startVec(j);\n    if(true)\n    {\n      if(nnz>1) std::sort(indices.data(),indices.data()+nnz);\n      for(Index k=0; k<nnz; ++k)\n      {\n        Index i = indices[k];\n        res.insertBackByOuterInner(j,i) = values[i];\n        mask[i] = false;\n      }\n    }\n    else\n    {\n      // dense path\n      for(Index i=0; i<rows; ++i)\n      {\n        if(mask[i])\n        {\n          mask[i] = false;\n          res.insertBackByOuterInner(j,i) = values[i];\n        }\n      }\n    }\n#endif\n\n  }\n  res.finalize();\n}\n\n\n} // end namespace internal\n\nnamespace internal {\n\ntemplate<typename Lhs, typename Rhs, typename ResultType,\n  int LhsStorageOrder = (traits<Lhs>::Flags&RowMajorBit) ? RowMajor : ColMajor,\n  int RhsStorageOrder = (traits<Rhs>::Flags&RowMajorBit) ? RowMajor : ColMajor,\n  int ResStorageOrder = (traits<ResultType>::Flags&RowMajorBit) ? RowMajor : ColMajor>\nstruct conservative_sparse_sparse_product_selector;\n\ntemplate<typename Lhs, typename Rhs, typename ResultType>\nstruct conservative_sparse_sparse_product_selector<Lhs,Rhs,ResultType,ColMajor,ColMajor,ColMajor>\n{\n  typedef typename remove_all<Lhs>::type LhsCleaned;\n  typedef typename LhsCleaned::Scalar Scalar;\n\n  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res)\n  {\n    typedef SparseMatrix<typename ResultType::Scalar,RowMajor,typename ResultType::Index> RowMajorMatrix;\n    typedef SparseMatrix<typename ResultType::Scalar,ColMajor,typename ResultType::Index> ColMajorMatrix;\n    ColMajorMatrix resCol(lhs.rows(),rhs.cols());\n    internal::conservative_sparse_sparse_product_impl<Lhs,Rhs,ColMajorMatrix>(lhs, rhs, resCol);\n    // sort the non zeros:\n    RowMajorMatrix resRow(resCol);\n    res = resRow;\n  }\n};\n\ntemplate<typename Lhs, typename Rhs, typename ResultType>\nstruct conservative_sparse_sparse_product_selector<Lhs,Rhs,ResultType,RowMajor,ColMajor,ColMajor>\n{\n  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res)\n  {\n     typedef SparseMatrix<typename ResultType::Scalar,RowMajor,typename ResultType::Index> RowMajorMatrix;\n     RowMajorMatrix rhsRow = rhs;\n     RowMajorMatrix resRow(lhs.rows(), rhs.cols());\n     internal::conservative_sparse_sparse_product_impl<RowMajorMatrix,Lhs,RowMajorMatrix>(rhsRow, lhs, resRow);\n     res = resRow;\n  }\n};\n\ntemplate<typename Lhs, typename Rhs, typename ResultType>\nstruct conservative_sparse_sparse_product_selector<Lhs,Rhs,ResultType,ColMajor,RowMajor,ColMajor>\n{\n  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res)\n  {\n    typedef SparseMatrix<typename ResultType::Scalar,RowMajor,typename ResultType::Index> RowMajorMatrix;\n    RowMajorMatrix lhsRow = lhs;\n    RowMajorMatrix resRow(lhs.rows(), rhs.cols());\n    internal::conservative_sparse_sparse_product_impl<Rhs,RowMajorMatrix,RowMajorMatrix>(rhs, lhsRow, resRow);\n    res = resRow;\n  }\n};\n\ntemplate<typename Lhs, typename Rhs, typename ResultType>\nstruct conservative_sparse_sparse_product_selector<Lhs,Rhs,ResultType,RowMajor,RowMajor,ColMajor>\n{\n  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res)\n  {\n    typedef SparseMatrix<typename ResultType::Scalar,RowMajor,typename ResultType::Index> RowMajorMatrix;\n    RowMajorMatrix resRow(lhs.rows(), rhs.cols());\n    internal::conservative_sparse_sparse_product_impl<Rhs,Lhs,RowMajorMatrix>(rhs, lhs, resRow);\n    res = resRow;\n  }\n};\n\n\ntemplate<typename Lhs, typename Rhs, typename ResultType>\nstruct conservative_sparse_sparse_product_selector<Lhs,Rhs,ResultType,ColMajor,ColMajor,RowMajor>\n{\n  typedef typename traits<typename remove_all<Lhs>::type>::Scalar Scalar;\n\n  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res)\n  {\n    typedef SparseMatrix<typename ResultType::Scalar,ColMajor,typename ResultType::Index> ColMajorMatrix;\n    ColMajorMatrix resCol(lhs.rows(), rhs.cols());\n    internal::conservative_sparse_sparse_product_impl<Lhs,Rhs,ColMajorMatrix>(lhs, rhs, resCol);\n    res = resCol;\n  }\n};\n\ntemplate<typename Lhs, typename Rhs, typename ResultType>\nstruct conservative_sparse_sparse_product_selector<Lhs,Rhs,ResultType,RowMajor,ColMajor,RowMajor>\n{\n  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res)\n  {\n    typedef SparseMatrix<typename ResultType::Scalar,ColMajor,typename ResultType::Index> ColMajorMatrix;\n    ColMajorMatrix lhsCol = lhs;\n    ColMajorMatrix resCol(lhs.rows(), rhs.cols());\n    internal::conservative_sparse_sparse_product_impl<ColMajorMatrix,Rhs,ColMajorMatrix>(lhsCol, rhs, resCol);\n    res = resCol;\n  }\n};\n\ntemplate<typename Lhs, typename Rhs, typename ResultType>\nstruct conservative_sparse_sparse_product_selector<Lhs,Rhs,ResultType,ColMajor,RowMajor,RowMajor>\n{\n  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res)\n  {\n    typedef SparseMatrix<typename ResultType::Scalar,ColMajor,typename ResultType::Index> ColMajorMatrix;\n    ColMajorMatrix rhsCol = rhs;\n    ColMajorMatrix resCol(lhs.rows(), rhs.cols());\n    internal::conservative_sparse_sparse_product_impl<Lhs,ColMajorMatrix,ColMajorMatrix>(lhs, rhsCol, resCol);\n    res = resCol;\n  }\n};\n\ntemplate<typename Lhs, typename Rhs, typename ResultType>\nstruct conservative_sparse_sparse_product_selector<Lhs,Rhs,ResultType,RowMajor,RowMajor,RowMajor>\n{\n  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res)\n  {\n    typedef SparseMatrix<typename ResultType::Scalar,RowMajor,typename ResultType::Index> RowMajorMatrix;\n    typedef SparseMatrix<typename ResultType::Scalar,ColMajor,typename ResultType::Index> ColMajorMatrix;\n    RowMajorMatrix resRow(lhs.rows(),rhs.cols());\n    internal::conservative_sparse_sparse_product_impl<Rhs,Lhs,RowMajorMatrix>(rhs, lhs, resRow);\n    // sort the non zeros:\n    ColMajorMatrix resCol(resRow);\n    res = resCol;\n  }\n};\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_CONSERVATIVESPARSESPARSEPRODUCT_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseCore/MappedSparseMatrix.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_MAPPED_SPARSEMATRIX_H\n#define EIGEN_MAPPED_SPARSEMATRIX_H\n\nnamespace Eigen { \n\n/** \\class MappedSparseMatrix\n  *\n  * \\brief Sparse matrix\n  *\n  * \\param _Scalar the scalar type, i.e. the type of the coefficients\n  *\n  * See http://www.netlib.org/linalg/html_templates/node91.html for details on the storage scheme.\n  *\n  */\nnamespace internal {\ntemplate<typename _Scalar, int _Flags, typename _Index>\nstruct traits<MappedSparseMatrix<_Scalar, _Flags, _Index> > : traits<SparseMatrix<_Scalar, _Flags, _Index> >\n{};\n}\n\ntemplate<typename _Scalar, int _Flags, typename _Index>\nclass MappedSparseMatrix\n  : public SparseMatrixBase<MappedSparseMatrix<_Scalar, _Flags, _Index> >\n{\n  public:\n    EIGEN_SPARSE_PUBLIC_INTERFACE(MappedSparseMatrix)\n    enum { IsRowMajor = Base::IsRowMajor };\n\n  protected:\n\n    Index   m_outerSize;\n    Index   m_innerSize;\n    Index   m_nnz;\n    Index*  m_outerIndex;\n    Index*  m_innerIndices;\n    Scalar* m_values;\n\n  public:\n\n    inline Index rows() const { return IsRowMajor ? m_outerSize : m_innerSize; }\n    inline Index cols() const { return IsRowMajor ? m_innerSize : m_outerSize; }\n    inline Index innerSize() const { return m_innerSize; }\n    inline Index outerSize() const { return m_outerSize; }\n    \n    bool isCompressed() const { return true; }\n\n    //----------------------------------------\n    // direct access interface\n    inline const Scalar* valuePtr() const { return m_values; }\n    inline Scalar* valuePtr() { return m_values; }\n\n    inline const Index* innerIndexPtr() const { return m_innerIndices; }\n    inline Index* innerIndexPtr() { return m_innerIndices; }\n\n    inline const Index* outerIndexPtr() const { return m_outerIndex; }\n    inline Index* outerIndexPtr() { return m_outerIndex; }\n    //----------------------------------------\n\n    inline Scalar coeff(Index row, Index col) const\n    {\n      const Index outer = IsRowMajor ? row : col;\n      const Index inner = IsRowMajor ? col : row;\n\n      Index start = m_outerIndex[outer];\n      Index end = m_outerIndex[outer+1];\n      if (start==end)\n        return Scalar(0);\n      else if (end>0 && inner==m_innerIndices[end-1])\n        return m_values[end-1];\n      // ^^  optimization: let's first check if it is the last coefficient\n      // (very common in high level algorithms)\n\n      const Index* r = std::lower_bound(&m_innerIndices[start],&m_innerIndices[end-1],inner);\n      const Index id = r-&m_innerIndices[0];\n      return ((*r==inner) && (id<end)) ? m_values[id] : Scalar(0);\n    }\n\n    inline Scalar& coeffRef(Index row, Index col)\n    {\n      const Index outer = IsRowMajor ? row : col;\n      const Index inner = IsRowMajor ? col : row;\n\n      Index start = m_outerIndex[outer];\n      Index end = m_outerIndex[outer+1];\n      eigen_assert(end>=start && \"you probably called coeffRef on a non finalized matrix\");\n      eigen_assert(end>start && \"coeffRef cannot be called on a zero coefficient\");\n      Index* r = std::lower_bound(&m_innerIndices[start],&m_innerIndices[end],inner);\n      const Index id = r-&m_innerIndices[0];\n      eigen_assert((*r==inner) && (id<end) && \"coeffRef cannot be called on a zero coefficient\");\n      return m_values[id];\n    }\n\n    class InnerIterator;\n    class ReverseInnerIterator;\n\n    /** \\returns the number of non zero coefficients */\n    inline Index nonZeros() const  { return m_nnz; }\n\n    inline MappedSparseMatrix(Index rows, Index cols, Index nnz, Index* outerIndexPtr, Index* innerIndexPtr, Scalar* valuePtr)\n      : m_outerSize(IsRowMajor?rows:cols), m_innerSize(IsRowMajor?cols:rows), m_nnz(nnz), m_outerIndex(outerIndexPtr),\n        m_innerIndices(innerIndexPtr), m_values(valuePtr)\n    {}\n\n    /** Empty destructor */\n    inline ~MappedSparseMatrix() {}\n};\n\ntemplate<typename Scalar, int _Flags, typename _Index>\nclass MappedSparseMatrix<Scalar,_Flags,_Index>::InnerIterator\n{\n  public:\n    InnerIterator(const MappedSparseMatrix& mat, Index outer)\n      : m_matrix(mat),\n        m_outer(outer),\n        m_id(mat.outerIndexPtr()[outer]),\n        m_start(m_id),\n        m_end(mat.outerIndexPtr()[outer+1])\n    {}\n\n    inline InnerIterator& operator++() { m_id++; return *this; }\n\n    inline Scalar value() const { return m_matrix.valuePtr()[m_id]; }\n    inline Scalar& valueRef() { return const_cast<Scalar&>(m_matrix.valuePtr()[m_id]); }\n\n    inline Index index() const { return m_matrix.innerIndexPtr()[m_id]; }\n    inline Index row() const { return IsRowMajor ? m_outer : index(); }\n    inline Index col() const { return IsRowMajor ? index() : m_outer; }\n\n    inline operator bool() const { return (m_id < m_end) && (m_id>=m_start); }\n\n  protected:\n    const MappedSparseMatrix& m_matrix;\n    const Index m_outer;\n    Index m_id;\n    const Index m_start;\n    const Index m_end;\n};\n\ntemplate<typename Scalar, int _Flags, typename _Index>\nclass MappedSparseMatrix<Scalar,_Flags,_Index>::ReverseInnerIterator\n{\n  public:\n    ReverseInnerIterator(const MappedSparseMatrix& mat, Index outer)\n      : m_matrix(mat),\n        m_outer(outer),\n        m_id(mat.outerIndexPtr()[outer+1]),\n        m_start(mat.outerIndexPtr()[outer]),\n        m_end(m_id)\n    {}\n\n    inline ReverseInnerIterator& operator--() { m_id--; return *this; }\n\n    inline Scalar value() const { return m_matrix.valuePtr()[m_id-1]; }\n    inline Scalar& valueRef() { return const_cast<Scalar&>(m_matrix.valuePtr()[m_id-1]); }\n\n    inline Index index() const { return m_matrix.innerIndexPtr()[m_id-1]; }\n    inline Index row() const { return IsRowMajor ? m_outer : index(); }\n    inline Index col() const { return IsRowMajor ? index() : m_outer; }\n\n    inline operator bool() const { return (m_id <= m_end) && (m_id>m_start); }\n\n  protected:\n    const MappedSparseMatrix& m_matrix;\n    const Index m_outer;\n    Index m_id;\n    const Index m_start;\n    const Index m_end;\n};\n\n} // end namespace Eigen\n\n#endif // EIGEN_MAPPED_SPARSEMATRIX_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseCore/SparseBlock.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SPARSE_BLOCK_H\n#define EIGEN_SPARSE_BLOCK_H\n\nnamespace Eigen { \n\ntemplate<typename XprType, int BlockRows, int BlockCols>\nclass BlockImpl<XprType,BlockRows,BlockCols,true,Sparse>\n  : public SparseMatrixBase<Block<XprType,BlockRows,BlockCols,true> >\n{\n    typedef typename internal::remove_all<typename XprType::Nested>::type _MatrixTypeNested;\n    typedef Block<XprType, BlockRows, BlockCols, true> BlockType;\npublic:\n    enum { IsRowMajor = internal::traits<BlockType>::IsRowMajor };\nprotected:\n    enum { OuterSize = IsRowMajor ? BlockRows : BlockCols };\npublic:\n    EIGEN_SPARSE_PUBLIC_INTERFACE(BlockType)\n    \n    class InnerIterator: public XprType::InnerIterator\n    {\n        typedef typename BlockImpl::Index Index;\n      public:\n        inline InnerIterator(const BlockType& xpr, Index outer)\n          : XprType::InnerIterator(xpr.m_matrix, xpr.m_outerStart + outer), m_outer(outer)\n        {}\n        inline Index row() const { return IsRowMajor ? m_outer : this->index(); }\n        inline Index col() const { return IsRowMajor ? this->index() : m_outer; }\n      protected:\n        Index m_outer;\n    };\n    class ReverseInnerIterator: public XprType::ReverseInnerIterator\n    {\n        typedef typename BlockImpl::Index Index;\n      public:\n        inline ReverseInnerIterator(const BlockType& xpr, Index outer)\n          : XprType::ReverseInnerIterator(xpr.m_matrix, xpr.m_outerStart + outer), m_outer(outer)\n        {}\n        inline Index row() const { return IsRowMajor ? m_outer : this->index(); }\n        inline Index col() const { return IsRowMajor ? this->index() : m_outer; }\n      protected:\n        Index m_outer;\n    };\n\n    inline BlockImpl(const XprType& xpr, int i)\n      : m_matrix(xpr), m_outerStart(i), m_outerSize(OuterSize)\n    {}\n\n    inline BlockImpl(const XprType& xpr, int startRow, int startCol, int blockRows, int blockCols)\n      : m_matrix(xpr), m_outerStart(IsRowMajor ? startRow : startCol), m_outerSize(IsRowMajor ? blockRows : blockCols)\n    {}\n    \n    inline const Scalar coeff(int row, int col) const\n    {\n      return m_matrix.coeff(row + IsRowMajor ? m_outerStart : 0, col +IsRowMajor ? 0 :  m_outerStart);\n    }\n    \n    inline const Scalar coeff(int index) const\n    {\n      return m_matrix.coeff(IsRowMajor ? m_outerStart : index, IsRowMajor ? index :  m_outerStart);\n    }\n\n    EIGEN_STRONG_INLINE Index rows() const { return IsRowMajor ? m_outerSize.value() : m_matrix.rows(); }\n    EIGEN_STRONG_INLINE Index cols() const { return IsRowMajor ? m_matrix.cols() : m_outerSize.value(); }\n\n  protected:\n\n    typename XprType::Nested m_matrix;\n    Index m_outerStart;\n    const internal::variable_if_dynamic<Index, OuterSize> m_outerSize;\n\n    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(BlockImpl)\n  private:\n    Index nonZeros() const;\n};\n\n\n/***************************************************************************\n* specialisation for SparseMatrix\n***************************************************************************/\n\ntemplate<typename _Scalar, int _Options, typename _Index, int BlockRows, int BlockCols>\nclass BlockImpl<SparseMatrix<_Scalar, _Options, _Index>,BlockRows,BlockCols,true,Sparse>\n  : public SparseMatrixBase<Block<SparseMatrix<_Scalar, _Options, _Index>,BlockRows,BlockCols,true> >\n{\n    typedef SparseMatrix<_Scalar, _Options, _Index> SparseMatrixType;\n    typedef typename internal::remove_all<typename SparseMatrixType::Nested>::type _MatrixTypeNested;\n    typedef Block<SparseMatrixType, BlockRows, BlockCols, true> BlockType;\n    typedef Block<const SparseMatrixType, BlockRows, BlockCols, true> ConstBlockType;\npublic:\n    enum { IsRowMajor = internal::traits<BlockType>::IsRowMajor };\n    EIGEN_SPARSE_PUBLIC_INTERFACE(BlockType)\nprotected:\n    enum { OuterSize = IsRowMajor ? BlockRows : BlockCols };\npublic:\n    \n    class InnerIterator: public SparseMatrixType::InnerIterator\n    {\n      public:\n        inline InnerIterator(const BlockType& xpr, Index outer)\n          : SparseMatrixType::InnerIterator(xpr.m_matrix, xpr.m_outerStart + outer), m_outer(outer)\n        {}\n        inline Index row() const { return IsRowMajor ? m_outer : this->index(); }\n        inline Index col() const { return IsRowMajor ? this->index() : m_outer; }\n      protected:\n        Index m_outer;\n    };\n    class ReverseInnerIterator: public SparseMatrixType::ReverseInnerIterator\n    {\n      public:\n        inline ReverseInnerIterator(const BlockType& xpr, Index outer)\n          : SparseMatrixType::ReverseInnerIterator(xpr.m_matrix, xpr.m_outerStart + outer), m_outer(outer)\n        {}\n        inline Index row() const { return IsRowMajor ? m_outer : this->index(); }\n        inline Index col() const { return IsRowMajor ? this->index() : m_outer; }\n      protected:\n        Index m_outer;\n    };\n\n    inline BlockImpl(const SparseMatrixType& xpr, int i)\n      : m_matrix(xpr), m_outerStart(i), m_outerSize(OuterSize)\n    {}\n\n    inline BlockImpl(const SparseMatrixType& xpr, int startRow, int startCol, int blockRows, int blockCols)\n      : m_matrix(xpr), m_outerStart(IsRowMajor ? startRow : startCol), m_outerSize(IsRowMajor ? blockRows : blockCols)\n    {}\n\n    template<typename OtherDerived>\n    inline BlockType& operator=(const SparseMatrixBase<OtherDerived>& other)\n    {\n      typedef typename internal::remove_all<typename SparseMatrixType::Nested>::type _NestedMatrixType;\n      _NestedMatrixType& matrix = const_cast<_NestedMatrixType&>(m_matrix);;\n      // This assignement is slow if this vector set is not empty\n      // and/or it is not at the end of the nonzeros of the underlying matrix.\n\n      // 1 - eval to a temporary to avoid transposition and/or aliasing issues\n      SparseMatrix<Scalar, IsRowMajor ? RowMajor : ColMajor, Index> tmp(other);\n\n      // 2 - let's check whether there is enough allocated memory\n      Index nnz           = tmp.nonZeros();\n      Index start         = m_outerStart==0 ? 0 : matrix.outerIndexPtr()[m_outerStart]; // starting position of the current block\n      Index end           = m_matrix.outerIndexPtr()[m_outerStart+m_outerSize.value()]; // ending posiiton of the current block\n      Index block_size    = end - start;                                                // available room in the current block\n      Index tail_size     = m_matrix.outerIndexPtr()[m_matrix.outerSize()] - end;\n      \n      Index free_size     = m_matrix.isCompressed()\n                          ? Index(matrix.data().allocatedSize()) + block_size\n                          : block_size;\n\n      if(nnz>free_size) \n      {\n        // realloc manually to reduce copies\n        typename SparseMatrixType::Storage newdata(m_matrix.data().allocatedSize() - block_size + nnz);\n\n        std::memcpy(newdata.valuePtr(), m_matrix.data().valuePtr(), start*sizeof(Scalar));\n        std::memcpy(newdata.indexPtr(), m_matrix.data().indexPtr(), start*sizeof(Index));\n\n        std::memcpy(newdata.valuePtr() + start, tmp.data().valuePtr(), nnz*sizeof(Scalar));\n        std::memcpy(newdata.indexPtr() + start, tmp.data().indexPtr(), nnz*sizeof(Index));\n\n        std::memcpy(newdata.valuePtr()+start+nnz, matrix.data().valuePtr()+end, tail_size*sizeof(Scalar));\n        std::memcpy(newdata.indexPtr()+start+nnz, matrix.data().indexPtr()+end, tail_size*sizeof(Index));\n        \n        newdata.resize(m_matrix.outerIndexPtr()[m_matrix.outerSize()] - block_size + nnz);\n\n        matrix.data().swap(newdata);\n      }\n      else\n      {\n        // no need to realloc, simply copy the tail at its respective position and insert tmp\n        matrix.data().resize(start + nnz + tail_size);\n\n        std::memmove(matrix.data().valuePtr()+start+nnz, matrix.data().valuePtr()+end, tail_size*sizeof(Scalar));\n        std::memmove(matrix.data().indexPtr()+start+nnz, matrix.data().indexPtr()+end, tail_size*sizeof(Index));\n\n        std::memcpy(matrix.data().valuePtr()+start, tmp.data().valuePtr(), nnz*sizeof(Scalar));\n        std::memcpy(matrix.data().indexPtr()+start, tmp.data().indexPtr(), nnz*sizeof(Index));\n      }\n      \n      // update innerNonZeros\n      if(!m_matrix.isCompressed())\n        for(Index j=0; j<m_outerSize.value(); ++j)\n          matrix.innerNonZeroPtr()[m_outerStart+j] = tmp.innerVector(j).nonZeros();\n\n      // update outer index pointers\n      Index p = start;\n      for(Index k=0; k<m_outerSize.value(); ++k)\n      {\n        matrix.outerIndexPtr()[m_outerStart+k] = p;\n        p += tmp.innerVector(k).nonZeros();\n      }\n      std::ptrdiff_t offset = nnz - block_size;\n      for(Index k = m_outerStart + m_outerSize.value(); k<=matrix.outerSize(); ++k)\n      {\n        matrix.outerIndexPtr()[k] += offset;\n      }\n\n      return derived();\n    }\n\n    inline BlockType& operator=(const BlockType& other)\n    {\n      return operator=<BlockType>(other);\n    }\n\n    inline const Scalar* valuePtr() const\n    { return m_matrix.valuePtr() + m_matrix.outerIndexPtr()[m_outerStart]; }\n    inline Scalar* valuePtr()\n    { return m_matrix.const_cast_derived().valuePtr() + m_matrix.outerIndexPtr()[m_outerStart]; }\n\n    inline const Index* innerIndexPtr() const\n    { return m_matrix.innerIndexPtr() + m_matrix.outerIndexPtr()[m_outerStart]; }\n    inline Index* innerIndexPtr()\n    { return m_matrix.const_cast_derived().innerIndexPtr() + m_matrix.outerIndexPtr()[m_outerStart]; }\n\n    inline const Index* outerIndexPtr() const\n    { return m_matrix.outerIndexPtr() + m_outerStart; }\n    inline Index* outerIndexPtr()\n    { return m_matrix.const_cast_derived().outerIndexPtr() + m_outerStart; }\n\n    Index nonZeros() const\n    {\n      if(m_matrix.isCompressed())\n        return  std::size_t(m_matrix.outerIndexPtr()[m_outerStart+m_outerSize.value()])\n              - std::size_t(m_matrix.outerIndexPtr()[m_outerStart]);\n      else if(m_outerSize.value()==0)\n        return 0;\n      else\n        return Map<const Matrix<Index,OuterSize,1> >(m_matrix.innerNonZeroPtr()+m_outerStart, m_outerSize.value()).sum();\n    }\n    \n    inline Scalar& coeffRef(int row, int col)\n    {\n      return m_matrix.const_cast_derived().coeffRef(row + (IsRowMajor ? m_outerStart : 0), col + (IsRowMajor ? 0 :  m_outerStart));\n    }\n    \n    inline const Scalar coeff(int row, int col) const\n    {\n      return m_matrix.coeff(row + (IsRowMajor ? m_outerStart : 0), col + (IsRowMajor ? 0 :  m_outerStart));\n    }\n    \n    inline const Scalar coeff(int index) const\n    {\n      return m_matrix.coeff(IsRowMajor ? m_outerStart : index, IsRowMajor ? index :  m_outerStart);\n    }\n\n    const Scalar& lastCoeff() const\n    {\n      EIGEN_STATIC_ASSERT_VECTOR_ONLY(BlockImpl);\n      eigen_assert(nonZeros()>0);\n      if(m_matrix.isCompressed())\n        return m_matrix.valuePtr()[m_matrix.outerIndexPtr()[m_outerStart+1]-1];\n      else\n        return m_matrix.valuePtr()[m_matrix.outerIndexPtr()[m_outerStart]+m_matrix.innerNonZeroPtr()[m_outerStart]-1];\n    }\n\n    EIGEN_STRONG_INLINE Index rows() const { return IsRowMajor ? m_outerSize.value() : m_matrix.rows(); }\n    EIGEN_STRONG_INLINE Index cols() const { return IsRowMajor ? m_matrix.cols() : m_outerSize.value(); }\n\n  protected:\n\n    typename SparseMatrixType::Nested m_matrix;\n    Index m_outerStart;\n    const internal::variable_if_dynamic<Index, OuterSize> m_outerSize;\n\n};\n\n\ntemplate<typename _Scalar, int _Options, typename _Index, int BlockRows, int BlockCols>\nclass BlockImpl<const SparseMatrix<_Scalar, _Options, _Index>,BlockRows,BlockCols,true,Sparse>\n  : public SparseMatrixBase<Block<const SparseMatrix<_Scalar, _Options, _Index>,BlockRows,BlockCols,true> >\n{\n    typedef SparseMatrix<_Scalar, _Options, _Index> SparseMatrixType;\n    typedef typename internal::remove_all<typename SparseMatrixType::Nested>::type _MatrixTypeNested;\n    typedef Block<const SparseMatrixType, BlockRows, BlockCols, true> BlockType;\npublic:\n    enum { IsRowMajor = internal::traits<BlockType>::IsRowMajor };\n    EIGEN_SPARSE_PUBLIC_INTERFACE(BlockType)\nprotected:\n    enum { OuterSize = IsRowMajor ? BlockRows : BlockCols };\npublic:\n    \n    class InnerIterator: public SparseMatrixType::InnerIterator\n    {\n      public:\n        inline InnerIterator(const BlockType& xpr, Index outer)\n          : SparseMatrixType::InnerIterator(xpr.m_matrix, xpr.m_outerStart + outer), m_outer(outer)\n        {}\n        inline Index row() const { return IsRowMajor ? m_outer : this->index(); }\n        inline Index col() const { return IsRowMajor ? this->index() : m_outer; }\n      protected:\n        Index m_outer;\n    };\n    class ReverseInnerIterator: public SparseMatrixType::ReverseInnerIterator\n    {\n      public:\n        inline ReverseInnerIterator(const BlockType& xpr, Index outer)\n          : SparseMatrixType::ReverseInnerIterator(xpr.m_matrix, xpr.m_outerStart + outer), m_outer(outer)\n        {}\n        inline Index row() const { return IsRowMajor ? m_outer : this->index(); }\n        inline Index col() const { return IsRowMajor ? this->index() : m_outer; }\n      protected:\n        Index m_outer;\n    };\n\n    inline BlockImpl(const SparseMatrixType& xpr, int i)\n      : m_matrix(xpr), m_outerStart(i), m_outerSize(OuterSize)\n    {}\n\n    inline BlockImpl(const SparseMatrixType& xpr, int startRow, int startCol, int blockRows, int blockCols)\n      : m_matrix(xpr), m_outerStart(IsRowMajor ? startRow : startCol), m_outerSize(IsRowMajor ? blockRows : blockCols)\n    {}\n\n    inline const Scalar* valuePtr() const\n    { return m_matrix.valuePtr() + m_matrix.outerIndexPtr()[m_outerStart]; }\n\n    inline const Index* innerIndexPtr() const\n    { return m_matrix.innerIndexPtr() + m_matrix.outerIndexPtr()[m_outerStart]; }\n\n    inline const Index* outerIndexPtr() const\n    { return m_matrix.outerIndexPtr() + m_outerStart; }\n\n    Index nonZeros() const\n    {\n      if(m_matrix.isCompressed())\n        return  std::size_t(m_matrix.outerIndexPtr()[m_outerStart+m_outerSize.value()])\n              - std::size_t(m_matrix.outerIndexPtr()[m_outerStart]);\n      else if(m_outerSize.value()==0)\n        return 0;\n      else\n        return Map<const Matrix<Index,OuterSize,1> >(m_matrix.innerNonZeroPtr()+m_outerStart, m_outerSize.value()).sum();\n    }\n    \n    inline const Scalar coeff(int row, int col) const\n    {\n      return m_matrix.coeff(row + (IsRowMajor ? m_outerStart : 0), col + (IsRowMajor ? 0 :  m_outerStart));\n    }\n    \n    inline const Scalar coeff(int index) const\n    {\n      return m_matrix.coeff(IsRowMajor ? m_outerStart : index, IsRowMajor ? index :  m_outerStart);\n    }\n\n    const Scalar& lastCoeff() const\n    {\n      EIGEN_STATIC_ASSERT_VECTOR_ONLY(BlockImpl);\n      eigen_assert(nonZeros()>0);\n      if(m_matrix.isCompressed())\n        return m_matrix.valuePtr()[m_matrix.outerIndexPtr()[m_outerStart+1]-1];\n      else\n        return m_matrix.valuePtr()[m_matrix.outerIndexPtr()[m_outerStart]+m_matrix.innerNonZeroPtr()[m_outerStart]-1];\n    }\n\n    EIGEN_STRONG_INLINE Index rows() const { return IsRowMajor ? m_outerSize.value() : m_matrix.rows(); }\n    EIGEN_STRONG_INLINE Index cols() const { return IsRowMajor ? m_matrix.cols() : m_outerSize.value(); }\n\n  protected:\n\n    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(BlockImpl)\n\n    typename SparseMatrixType::Nested m_matrix;\n    Index m_outerStart;\n    const internal::variable_if_dynamic<Index, OuterSize> m_outerSize;\n};\n\n//----------\n\n/** \\returns the \\a outer -th column (resp. row) of the matrix \\c *this if \\c *this\n  * is col-major (resp. row-major).\n  */\ntemplate<typename Derived>\ntypename SparseMatrixBase<Derived>::InnerVectorReturnType SparseMatrixBase<Derived>::innerVector(Index outer)\n{ return InnerVectorReturnType(derived(), outer); }\n\n/** \\returns the \\a outer -th column (resp. row) of the matrix \\c *this if \\c *this\n  * is col-major (resp. row-major). Read-only.\n  */\ntemplate<typename Derived>\nconst typename SparseMatrixBase<Derived>::ConstInnerVectorReturnType SparseMatrixBase<Derived>::innerVector(Index outer) const\n{ return ConstInnerVectorReturnType(derived(), outer); }\n\n/** \\returns the \\a outer -th column (resp. row) of the matrix \\c *this if \\c *this\n  * is col-major (resp. row-major).\n  */\ntemplate<typename Derived>\ntypename SparseMatrixBase<Derived>::InnerVectorsReturnType\nSparseMatrixBase<Derived>::innerVectors(Index outerStart, Index outerSize)\n{\n  return Block<Derived,Dynamic,Dynamic,true>(derived(),\n                                             IsRowMajor ? outerStart : 0, IsRowMajor ? 0 : outerStart,\n                                             IsRowMajor ? outerSize : rows(), IsRowMajor ? cols() : outerSize);\n  \n}\n\n/** \\returns the \\a outer -th column (resp. row) of the matrix \\c *this if \\c *this\n  * is col-major (resp. row-major). Read-only.\n  */\ntemplate<typename Derived>\nconst typename SparseMatrixBase<Derived>::ConstInnerVectorsReturnType\nSparseMatrixBase<Derived>::innerVectors(Index outerStart, Index outerSize) const\n{\n  return Block<const Derived,Dynamic,Dynamic,true>(derived(),\n                                                  IsRowMajor ? outerStart : 0, IsRowMajor ? 0 : outerStart,\n                                                  IsRowMajor ? outerSize : rows(), IsRowMajor ? cols() : outerSize);\n  \n}\n\n/** Generic implementation of sparse Block expression.\n  * Real-only. \n  */\ntemplate<typename XprType, int BlockRows, int BlockCols, bool InnerPanel>\nclass BlockImpl<XprType,BlockRows,BlockCols,InnerPanel,Sparse>\n  : public SparseMatrixBase<Block<XprType,BlockRows,BlockCols,InnerPanel> >, internal::no_assignment_operator\n{\n  typedef typename internal::remove_all<typename XprType::Nested>::type _MatrixTypeNested;\n  typedef Block<XprType, BlockRows, BlockCols, InnerPanel> BlockType;\npublic:\n    enum { IsRowMajor = internal::traits<BlockType>::IsRowMajor };\n    EIGEN_SPARSE_PUBLIC_INTERFACE(BlockType)\n\n    /** Column or Row constructor\n      */\n    inline BlockImpl(const XprType& xpr, int i)\n      : m_matrix(xpr),\n        m_startRow( (BlockRows==1) && (BlockCols==XprType::ColsAtCompileTime) ? i : 0),\n        m_startCol( (BlockRows==XprType::RowsAtCompileTime) && (BlockCols==1) ? i : 0),\n        m_blockRows(BlockRows==1 ? 1 : xpr.rows()),\n        m_blockCols(BlockCols==1 ? 1 : xpr.cols())\n    {}\n\n    /** Dynamic-size constructor\n      */\n    inline BlockImpl(const XprType& xpr, int startRow, int startCol, int blockRows, int blockCols)\n      : m_matrix(xpr), m_startRow(startRow), m_startCol(startCol), m_blockRows(blockRows), m_blockCols(blockCols)\n    {}\n\n    inline int rows() const { return m_blockRows.value(); }\n    inline int cols() const { return m_blockCols.value(); }\n\n    inline Scalar& coeffRef(int row, int col)\n    {\n      return m_matrix.const_cast_derived()\n               .coeffRef(row + m_startRow.value(), col + m_startCol.value());\n    }\n\n    inline const Scalar coeff(int row, int col) const\n    {\n      return m_matrix.coeff(row + m_startRow.value(), col + m_startCol.value());\n    }\n\n    inline Scalar& coeffRef(int index)\n    {\n      return m_matrix.const_cast_derived()\n             .coeffRef(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),\n                       m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0));\n    }\n\n    inline const Scalar coeff(int index) const\n    {\n      return m_matrix\n             .coeff(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),\n                    m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0));\n    }\n    \n    inline const _MatrixTypeNested& nestedExpression() const { return m_matrix; }\n    \n    class InnerIterator : public _MatrixTypeNested::InnerIterator\n    {\n      typedef typename _MatrixTypeNested::InnerIterator Base;\n      const BlockType& m_block;\n      Index m_end;\n    public:\n\n      EIGEN_STRONG_INLINE InnerIterator(const BlockType& block, Index outer)\n        : Base(block.derived().nestedExpression(), outer + (IsRowMajor ? block.m_startRow.value() : block.m_startCol.value())),\n          m_block(block),\n          m_end(IsRowMajor ? block.m_startCol.value()+block.m_blockCols.value() : block.m_startRow.value()+block.m_blockRows.value())\n      {\n        while( (Base::operator bool()) && (Base::index() < (IsRowMajor ? m_block.m_startCol.value() : m_block.m_startRow.value())) )\n          Base::operator++();\n      }\n\n      inline Index index()  const { return Base::index() - (IsRowMajor ? m_block.m_startCol.value() : m_block.m_startRow.value()); }\n      inline Index outer()  const { return Base::outer() - (IsRowMajor ? m_block.m_startRow.value() : m_block.m_startCol.value()); }\n      inline Index row()    const { return Base::row()   - m_block.m_startRow.value(); }\n      inline Index col()    const { return Base::col()   - m_block.m_startCol.value(); }\n      \n      inline operator bool() const { return Base::operator bool() && Base::index() < m_end; }\n    };\n    class ReverseInnerIterator : public _MatrixTypeNested::ReverseInnerIterator\n    {\n      typedef typename _MatrixTypeNested::ReverseInnerIterator Base;\n      const BlockType& m_block;\n      Index m_begin;\n    public:\n\n      EIGEN_STRONG_INLINE ReverseInnerIterator(const BlockType& block, Index outer)\n        : Base(block.derived().nestedExpression(), outer + (IsRowMajor ? block.m_startRow.value() : block.m_startCol.value())),\n          m_block(block),\n          m_begin(IsRowMajor ? block.m_startCol.value() : block.m_startRow.value())\n      {\n        while( (Base::operator bool()) && (Base::index() >= (IsRowMajor ? m_block.m_startCol.value()+block.m_blockCols.value() : m_block.m_startRow.value()+block.m_blockRows.value())) )\n          Base::operator--();\n      }\n\n      inline Index index()  const { return Base::index() - (IsRowMajor ? m_block.m_startCol.value() : m_block.m_startRow.value()); }\n      inline Index outer()  const { return Base::outer() - (IsRowMajor ? m_block.m_startRow.value() : m_block.m_startCol.value()); }\n      inline Index row()    const { return Base::row()   - m_block.m_startRow.value(); }\n      inline Index col()    const { return Base::col()   - m_block.m_startCol.value(); }\n      \n      inline operator bool() const { return Base::operator bool() && Base::index() >= m_begin; }\n    };\n  protected:\n    friend class InnerIterator;\n    friend class ReverseInnerIterator;\n    \n    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(BlockImpl)\n\n    typename XprType::Nested m_matrix;\n    const internal::variable_if_dynamic<Index, XprType::RowsAtCompileTime == 1 ? 0 : Dynamic> m_startRow;\n    const internal::variable_if_dynamic<Index, XprType::ColsAtCompileTime == 1 ? 0 : Dynamic> m_startCol;\n    const internal::variable_if_dynamic<Index, RowsAtCompileTime> m_blockRows;\n    const internal::variable_if_dynamic<Index, ColsAtCompileTime> m_blockCols;\n  private:\n    Index nonZeros() const;\n};\n\n} // end namespace Eigen\n\n#endif // EIGEN_SPARSE_BLOCK_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseCore/SparseColEtree.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n/* \n \n * NOTE: This file is the modified version of sp_coletree.c file in SuperLU \n \n * -- SuperLU routine (version 3.1) --\n * Univ. of California Berkeley, Xerox Palo Alto Research Center,\n * and Lawrence Berkeley National Lab.\n * August 1, 2008\n *\n * Copyright (c) 1994 by Xerox Corporation.  All rights reserved.\n *\n * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY\n * EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.\n *\n * Permission is hereby granted to use or copy this program for any\n * purpose, provided the above notices are retained on all copies.\n * Permission to modify the code and to distribute modified code is\n * granted, provided the above notices are retained, and a notice that\n * the code was modified is included with the above copyright notice.\n */\n#ifndef SPARSE_COLETREE_H\n#define SPARSE_COLETREE_H\n\nnamespace Eigen {\n\nnamespace internal {\n\n/** Find the root of the tree/set containing the vertex i : Use Path halving */ \ntemplate<typename Index, typename IndexVector>\nIndex etree_find (Index i, IndexVector& pp)\n{\n  Index p = pp(i); // Parent \n  Index gp = pp(p); // Grand parent \n  while (gp != p) \n  {\n    pp(i) = gp; // Parent pointer on find path is changed to former grand parent\n    i = gp; \n    p = pp(i);\n    gp = pp(p);\n  }\n  return p; \n}\n\n/** Compute the column elimination tree of a sparse matrix\n  * \\param mat The matrix in column-major format. \n  * \\param parent The elimination tree\n  * \\param firstRowElt The column index of the first element in each row\n  * \\param perm The permutation to apply to the column of \\b mat\n  */\ntemplate <typename MatrixType, typename IndexVector>\nint coletree(const MatrixType& mat, IndexVector& parent, IndexVector& firstRowElt, typename MatrixType::Index *perm=0)\n{\n  typedef typename MatrixType::Index Index;\n  Index nc = mat.cols(); // Number of columns \n  Index m = mat.rows();\n  Index diagSize = (std::min)(nc,m);\n  IndexVector root(nc); // root of subtree of etree \n  root.setZero();\n  IndexVector pp(nc); // disjoint sets \n  pp.setZero(); // Initialize disjoint sets \n  parent.resize(mat.cols());\n  //Compute first nonzero column in each row \n  Index row,col; \n  firstRowElt.resize(m);\n  firstRowElt.setConstant(nc);\n  firstRowElt.segment(0, diagSize).setLinSpaced(diagSize, 0, diagSize-1);\n  bool found_diag;\n  for (col = 0; col < nc; col++)\n  {\n    Index pcol = col;\n    if(perm) pcol  = perm[col];\n    for (typename MatrixType::InnerIterator it(mat, pcol); it; ++it)\n    { \n      row = it.row();\n      firstRowElt(row) = (std::min)(firstRowElt(row), col);\n    }\n  }\n  /* Compute etree by Liu's algorithm for symmetric matrices,\n          except use (firstRowElt[r],c) in place of an edge (r,c) of A.\n    Thus each row clique in A'*A is replaced by a star\n    centered at its first vertex, which has the same fill. */\n  Index rset, cset, rroot; \n  for (col = 0; col < nc; col++) \n  {\n    found_diag = col>=m;\n    pp(col) = col; \n    cset = col; \n    root(cset) = col; \n    parent(col) = nc; \n    /* The diagonal element is treated here even if it does not exist in the matrix\n     * hence the loop is executed once more */ \n    Index pcol = col;\n    if(perm) pcol  = perm[col];\n    for (typename MatrixType::InnerIterator it(mat, pcol); it||!found_diag; ++it)\n    { //  A sequence of interleaved find and union is performed \n      Index i = col;\n      if(it) i = it.index();\n      if (i == col) found_diag = true;\n      \n      row = firstRowElt(i);\n      if (row >= col) continue; \n      rset = internal::etree_find(row, pp); // Find the name of the set containing row\n      rroot = root(rset);\n      if (rroot != col) \n      {\n        parent(rroot) = col; \n        pp(cset) = rset; \n        cset = rset; \n        root(cset) = col; \n      }\n    }\n  }\n  return 0;  \n}\n\n/** \n  * Depth-first search from vertex n.  No recursion.\n  * This routine was contributed by Cédric Doucet, CEDRAT Group, Meylan, France.\n*/\ntemplate <typename Index, typename IndexVector>\nvoid nr_etdfs (Index n, IndexVector& parent, IndexVector& first_kid, IndexVector& next_kid, IndexVector& post, Index postnum)\n{\n  Index current = n, first, next;\n  while (postnum != n) \n  {\n    // No kid for the current node\n    first = first_kid(current);\n    \n    // no kid for the current node\n    if (first == -1) \n    {\n      // Numbering this node because it has no kid \n      post(current) = postnum++;\n      \n      // looking for the next kid \n      next = next_kid(current); \n      while (next == -1) \n      {\n        // No more kids : back to the parent node\n        current = parent(current); \n        // numbering the parent node \n        post(current) = postnum++;\n        \n        // Get the next kid \n        next = next_kid(current); \n      }\n      // stopping criterion \n      if (postnum == n+1) return; \n      \n      // Updating current node \n      current = next; \n    }\n    else \n    {\n      current = first; \n    }\n  }\n}\n\n\n/**\n  * \\brief Post order a tree \n  * \\param n the number of nodes\n  * \\param parent Input tree\n  * \\param post postordered tree\n  */\ntemplate <typename Index, typename IndexVector>\nvoid treePostorder(Index n, IndexVector& parent, IndexVector& post)\n{\n  IndexVector first_kid, next_kid; // Linked list of children \n  Index postnum; \n  // Allocate storage for working arrays and results \n  first_kid.resize(n+1); \n  next_kid.setZero(n+1);\n  post.setZero(n+1);\n  \n  // Set up structure describing children\n  Index v, dad; \n  first_kid.setConstant(-1); \n  for (v = n-1; v >= 0; v--) \n  {\n    dad = parent(v);\n    next_kid(v) = first_kid(dad); \n    first_kid(dad) = v; \n  }\n  \n  // Depth-first search from dummy root vertex #n\n  postnum = 0; \n  internal::nr_etdfs(n, parent, first_kid, next_kid, post, postnum);\n}\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // SPARSE_COLETREE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseCore/SparseCwiseBinaryOp.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SPARSE_CWISE_BINARY_OP_H\n#define EIGEN_SPARSE_CWISE_BINARY_OP_H\n\nnamespace Eigen { \n\n// Here we have to handle 3 cases:\n//  1 - sparse op dense\n//  2 - dense op sparse\n//  3 - sparse op sparse\n// We also need to implement a 4th iterator for:\n//  4 - dense op dense\n// Finally, we also need to distinguish between the product and other operations :\n//                configuration      returned mode\n//  1 - sparse op dense    product      sparse\n//                         generic      dense\n//  2 - dense op sparse    product      sparse\n//                         generic      dense\n//  3 - sparse op sparse   product      sparse\n//                         generic      sparse\n//  4 - dense op dense     product      dense\n//                         generic      dense\n\nnamespace internal {\n\ntemplate<> struct promote_storage_type<Dense,Sparse>\n{ typedef Sparse ret; };\n\ntemplate<> struct promote_storage_type<Sparse,Dense>\n{ typedef Sparse ret; };\n\ntemplate<typename BinaryOp, typename Lhs, typename Rhs, typename Derived,\n  typename _LhsStorageMode = typename traits<Lhs>::StorageKind,\n  typename _RhsStorageMode = typename traits<Rhs>::StorageKind>\nclass sparse_cwise_binary_op_inner_iterator_selector;\n\n} // end namespace internal\n\ntemplate<typename BinaryOp, typename Lhs, typename Rhs>\nclass CwiseBinaryOpImpl<BinaryOp, Lhs, Rhs, Sparse>\n  : public SparseMatrixBase<CwiseBinaryOp<BinaryOp, Lhs, Rhs> >\n{\n  public:\n    class InnerIterator;\n    class ReverseInnerIterator;\n    typedef CwiseBinaryOp<BinaryOp, Lhs, Rhs> Derived;\n    EIGEN_SPARSE_PUBLIC_INTERFACE(Derived)\n    CwiseBinaryOpImpl()\n    {\n      EIGEN_STATIC_ASSERT((\n                (!internal::is_same<typename internal::traits<Lhs>::StorageKind,\n                                    typename internal::traits<Rhs>::StorageKind>::value)\n            ||  ((Lhs::Flags&RowMajorBit) == (Rhs::Flags&RowMajorBit))),\n            THE_STORAGE_ORDER_OF_BOTH_SIDES_MUST_MATCH);\n    }\n};\n\ntemplate<typename BinaryOp, typename Lhs, typename Rhs>\nclass CwiseBinaryOpImpl<BinaryOp,Lhs,Rhs,Sparse>::InnerIterator\n  : public internal::sparse_cwise_binary_op_inner_iterator_selector<BinaryOp,Lhs,Rhs,typename CwiseBinaryOpImpl<BinaryOp,Lhs,Rhs,Sparse>::InnerIterator>\n{\n  public:\n    typedef typename Lhs::Index Index;\n    typedef internal::sparse_cwise_binary_op_inner_iterator_selector<\n      BinaryOp,Lhs,Rhs, InnerIterator> Base;\n\n    // NOTE: we have to prefix Index by \"typename Lhs::\" to avoid an ICE with VC11\n    EIGEN_STRONG_INLINE InnerIterator(const CwiseBinaryOpImpl& binOp, typename Lhs::Index outer)\n      : Base(binOp.derived(),outer)\n    {}\n};\n\n/***************************************************************************\n* Implementation of inner-iterators\n***************************************************************************/\n\n// template<typename T> struct internal::func_is_conjunction { enum { ret = false }; };\n// template<typename T> struct internal::func_is_conjunction<internal::scalar_product_op<T> > { enum { ret = true }; };\n\n// TODO generalize the internal::scalar_product_op specialization to all conjunctions if any !\n\nnamespace internal {\n\n// sparse - sparse  (generic)\ntemplate<typename BinaryOp, typename Lhs, typename Rhs, typename Derived>\nclass sparse_cwise_binary_op_inner_iterator_selector<BinaryOp, Lhs, Rhs, Derived, Sparse, Sparse>\n{\n    typedef CwiseBinaryOp<BinaryOp, Lhs, Rhs> CwiseBinaryXpr;\n    typedef typename traits<CwiseBinaryXpr>::Scalar Scalar;\n    typedef typename traits<CwiseBinaryXpr>::_LhsNested _LhsNested;\n    typedef typename traits<CwiseBinaryXpr>::_RhsNested _RhsNested;\n    typedef typename _LhsNested::InnerIterator LhsIterator;\n    typedef typename _RhsNested::InnerIterator RhsIterator;\n    typedef typename Lhs::Index Index;\n\n  public:\n\n    EIGEN_STRONG_INLINE sparse_cwise_binary_op_inner_iterator_selector(const CwiseBinaryXpr& xpr, Index outer)\n      : m_lhsIter(xpr.lhs(),outer), m_rhsIter(xpr.rhs(),outer), m_functor(xpr.functor())\n    {\n      this->operator++();\n    }\n\n    EIGEN_STRONG_INLINE Derived& operator++()\n    {\n      if (m_lhsIter && m_rhsIter && (m_lhsIter.index() == m_rhsIter.index()))\n      {\n        m_id = m_lhsIter.index();\n        m_value = m_functor(m_lhsIter.value(), m_rhsIter.value());\n        ++m_lhsIter;\n        ++m_rhsIter;\n      }\n      else if (m_lhsIter && (!m_rhsIter || (m_lhsIter.index() < m_rhsIter.index())))\n      {\n        m_id = m_lhsIter.index();\n        m_value = m_functor(m_lhsIter.value(), Scalar(0));\n        ++m_lhsIter;\n      }\n      else if (m_rhsIter && (!m_lhsIter || (m_lhsIter.index() > m_rhsIter.index())))\n      {\n        m_id = m_rhsIter.index();\n        m_value = m_functor(Scalar(0), m_rhsIter.value());\n        ++m_rhsIter;\n      }\n      else\n      {\n        m_value = 0; // this is to avoid a compilation warning\n        m_id = -1;\n      }\n      return *static_cast<Derived*>(this);\n    }\n\n    EIGEN_STRONG_INLINE Scalar value() const { return m_value; }\n\n    EIGEN_STRONG_INLINE Index index() const { return m_id; }\n    EIGEN_STRONG_INLINE Index row() const { return Lhs::IsRowMajor ? m_lhsIter.row() : index(); }\n    EIGEN_STRONG_INLINE Index col() const { return Lhs::IsRowMajor ? index() : m_lhsIter.col(); }\n\n    EIGEN_STRONG_INLINE operator bool() const { return m_id>=0; }\n\n  protected:\n    LhsIterator m_lhsIter;\n    RhsIterator m_rhsIter;\n    const BinaryOp& m_functor;\n    Scalar m_value;\n    Index m_id;\n};\n\n// sparse - sparse  (product)\ntemplate<typename T, typename Lhs, typename Rhs, typename Derived>\nclass sparse_cwise_binary_op_inner_iterator_selector<scalar_product_op<T>, Lhs, Rhs, Derived, Sparse, Sparse>\n{\n    typedef scalar_product_op<T> BinaryFunc;\n    typedef CwiseBinaryOp<BinaryFunc, Lhs, Rhs> CwiseBinaryXpr;\n    typedef typename CwiseBinaryXpr::Scalar Scalar;\n    typedef typename traits<CwiseBinaryXpr>::_LhsNested _LhsNested;\n    typedef typename _LhsNested::InnerIterator LhsIterator;\n    typedef typename traits<CwiseBinaryXpr>::_RhsNested _RhsNested;\n    typedef typename _RhsNested::InnerIterator RhsIterator;\n    typedef typename Lhs::Index Index;\n  public:\n\n    EIGEN_STRONG_INLINE sparse_cwise_binary_op_inner_iterator_selector(const CwiseBinaryXpr& xpr, Index outer)\n      : m_lhsIter(xpr.lhs(),outer), m_rhsIter(xpr.rhs(),outer), m_functor(xpr.functor())\n    {\n      while (m_lhsIter && m_rhsIter && (m_lhsIter.index() != m_rhsIter.index()))\n      {\n        if (m_lhsIter.index() < m_rhsIter.index())\n          ++m_lhsIter;\n        else\n          ++m_rhsIter;\n      }\n    }\n\n    EIGEN_STRONG_INLINE Derived& operator++()\n    {\n      ++m_lhsIter;\n      ++m_rhsIter;\n      while (m_lhsIter && m_rhsIter && (m_lhsIter.index() != m_rhsIter.index()))\n      {\n        if (m_lhsIter.index() < m_rhsIter.index())\n          ++m_lhsIter;\n        else\n          ++m_rhsIter;\n      }\n      return *static_cast<Derived*>(this);\n    }\n\n    EIGEN_STRONG_INLINE Scalar value() const { return m_functor(m_lhsIter.value(), m_rhsIter.value()); }\n\n    EIGEN_STRONG_INLINE Index index() const { return m_lhsIter.index(); }\n    EIGEN_STRONG_INLINE Index row() const { return m_lhsIter.row(); }\n    EIGEN_STRONG_INLINE Index col() const { return m_lhsIter.col(); }\n\n    EIGEN_STRONG_INLINE operator bool() const { return (m_lhsIter && m_rhsIter); }\n\n  protected:\n    LhsIterator m_lhsIter;\n    RhsIterator m_rhsIter;\n    const BinaryFunc& m_functor;\n};\n\n// sparse - dense  (product)\ntemplate<typename T, typename Lhs, typename Rhs, typename Derived>\nclass sparse_cwise_binary_op_inner_iterator_selector<scalar_product_op<T>, Lhs, Rhs, Derived, Sparse, Dense>\n{\n    typedef scalar_product_op<T> BinaryFunc;\n    typedef CwiseBinaryOp<BinaryFunc, Lhs, Rhs> CwiseBinaryXpr;\n    typedef typename CwiseBinaryXpr::Scalar Scalar;\n    typedef typename traits<CwiseBinaryXpr>::_LhsNested _LhsNested;\n    typedef typename traits<CwiseBinaryXpr>::RhsNested RhsNested;\n    typedef typename _LhsNested::InnerIterator LhsIterator;\n    typedef typename Lhs::Index Index;\n    enum { IsRowMajor = (int(Lhs::Flags)&RowMajorBit)==RowMajorBit };\n  public:\n\n    EIGEN_STRONG_INLINE sparse_cwise_binary_op_inner_iterator_selector(const CwiseBinaryXpr& xpr, Index outer)\n      : m_rhs(xpr.rhs()), m_lhsIter(xpr.lhs(),outer), m_functor(xpr.functor()), m_outer(outer)\n    {}\n\n    EIGEN_STRONG_INLINE Derived& operator++()\n    {\n      ++m_lhsIter;\n      return *static_cast<Derived*>(this);\n    }\n\n    EIGEN_STRONG_INLINE Scalar value() const\n    { return m_functor(m_lhsIter.value(),\n                       m_rhs.coeff(IsRowMajor?m_outer:m_lhsIter.index(),IsRowMajor?m_lhsIter.index():m_outer)); }\n\n    EIGEN_STRONG_INLINE Index index() const { return m_lhsIter.index(); }\n    EIGEN_STRONG_INLINE Index row() const { return m_lhsIter.row(); }\n    EIGEN_STRONG_INLINE Index col() const { return m_lhsIter.col(); }\n\n    EIGEN_STRONG_INLINE operator bool() const { return m_lhsIter; }\n\n  protected:\n    RhsNested m_rhs;\n    LhsIterator m_lhsIter;\n    const BinaryFunc m_functor;\n    const Index m_outer;\n};\n\n// sparse - dense  (product)\ntemplate<typename T, typename Lhs, typename Rhs, typename Derived>\nclass sparse_cwise_binary_op_inner_iterator_selector<scalar_product_op<T>, Lhs, Rhs, Derived, Dense, Sparse>\n{\n    typedef scalar_product_op<T> BinaryFunc;\n    typedef CwiseBinaryOp<BinaryFunc, Lhs, Rhs> CwiseBinaryXpr;\n    typedef typename CwiseBinaryXpr::Scalar Scalar;\n    typedef typename traits<CwiseBinaryXpr>::_RhsNested _RhsNested;\n    typedef typename _RhsNested::InnerIterator RhsIterator;\n    typedef typename Lhs::Index Index;\n\n    enum { IsRowMajor = (int(Rhs::Flags)&RowMajorBit)==RowMajorBit };\n  public:\n\n    EIGEN_STRONG_INLINE sparse_cwise_binary_op_inner_iterator_selector(const CwiseBinaryXpr& xpr, Index outer)\n      : m_xpr(xpr), m_rhsIter(xpr.rhs(),outer), m_functor(xpr.functor()), m_outer(outer)\n    {}\n\n    EIGEN_STRONG_INLINE Derived& operator++()\n    {\n      ++m_rhsIter;\n      return *static_cast<Derived*>(this);\n    }\n\n    EIGEN_STRONG_INLINE Scalar value() const\n    { return m_functor(m_xpr.lhs().coeff(IsRowMajor?m_outer:m_rhsIter.index(),IsRowMajor?m_rhsIter.index():m_outer), m_rhsIter.value()); }\n\n    EIGEN_STRONG_INLINE Index index() const { return m_rhsIter.index(); }\n    EIGEN_STRONG_INLINE Index row() const { return m_rhsIter.row(); }\n    EIGEN_STRONG_INLINE Index col() const { return m_rhsIter.col(); }\n\n    EIGEN_STRONG_INLINE operator bool() const { return m_rhsIter; }\n\n  protected:\n    const CwiseBinaryXpr& m_xpr;\n    RhsIterator m_rhsIter;\n    const BinaryFunc& m_functor;\n    const Index m_outer;\n};\n\n} // end namespace internal\n\n/***************************************************************************\n* Implementation of SparseMatrixBase and SparseCwise functions/operators\n***************************************************************************/\n\ntemplate<typename Derived>\ntemplate<typename OtherDerived>\nEIGEN_STRONG_INLINE Derived &\nSparseMatrixBase<Derived>::operator-=(const SparseMatrixBase<OtherDerived> &other)\n{\n  return derived() = derived() - other.derived();\n}\n\ntemplate<typename Derived>\ntemplate<typename OtherDerived>\nEIGEN_STRONG_INLINE Derived &\nSparseMatrixBase<Derived>::operator+=(const SparseMatrixBase<OtherDerived>& other)\n{\n  return derived() = derived() + other.derived();\n}\n\ntemplate<typename Derived>\ntemplate<typename OtherDerived>\nEIGEN_STRONG_INLINE const typename SparseMatrixBase<Derived>::template CwiseProductDenseReturnType<OtherDerived>::Type\nSparseMatrixBase<Derived>::cwiseProduct(const MatrixBase<OtherDerived> &other) const\n{\n  return typename CwiseProductDenseReturnType<OtherDerived>::Type(derived(), other.derived());\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_SPARSE_CWISE_BINARY_OP_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseCore/SparseCwiseUnaryOp.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SPARSE_CWISE_UNARY_OP_H\n#define EIGEN_SPARSE_CWISE_UNARY_OP_H\n\nnamespace Eigen { \n\ntemplate<typename UnaryOp, typename MatrixType>\nclass CwiseUnaryOpImpl<UnaryOp,MatrixType,Sparse>\n  : public SparseMatrixBase<CwiseUnaryOp<UnaryOp, MatrixType> >\n{\n  public:\n\n    class InnerIterator;\n    class ReverseInnerIterator;\n\n    typedef CwiseUnaryOp<UnaryOp, MatrixType> Derived;\n    EIGEN_SPARSE_PUBLIC_INTERFACE(Derived)\n\n  protected:\n    typedef typename internal::traits<Derived>::_XprTypeNested _MatrixTypeNested;\n    typedef typename _MatrixTypeNested::InnerIterator MatrixTypeIterator;\n    typedef typename _MatrixTypeNested::ReverseInnerIterator MatrixTypeReverseIterator;\n};\n\ntemplate<typename UnaryOp, typename MatrixType>\nclass CwiseUnaryOpImpl<UnaryOp,MatrixType,Sparse>::InnerIterator\n    : public CwiseUnaryOpImpl<UnaryOp,MatrixType,Sparse>::MatrixTypeIterator\n{\n    typedef typename CwiseUnaryOpImpl::Scalar Scalar;\n    typedef typename CwiseUnaryOpImpl<UnaryOp,MatrixType,Sparse>::MatrixTypeIterator Base;\n  public:\n\n    EIGEN_STRONG_INLINE InnerIterator(const CwiseUnaryOpImpl& unaryOp, typename CwiseUnaryOpImpl::Index outer)\n      : Base(unaryOp.derived().nestedExpression(),outer), m_functor(unaryOp.derived().functor())\n    {}\n\n    EIGEN_STRONG_INLINE InnerIterator& operator++()\n    { Base::operator++(); return *this; }\n\n    EIGEN_STRONG_INLINE typename CwiseUnaryOpImpl::Scalar value() const { return m_functor(Base::value()); }\n\n  protected:\n    const UnaryOp m_functor;\n  private:\n    typename CwiseUnaryOpImpl::Scalar& valueRef();\n};\n\ntemplate<typename UnaryOp, typename MatrixType>\nclass CwiseUnaryOpImpl<UnaryOp,MatrixType,Sparse>::ReverseInnerIterator\n    : public CwiseUnaryOpImpl<UnaryOp,MatrixType,Sparse>::MatrixTypeReverseIterator\n{\n    typedef typename CwiseUnaryOpImpl::Scalar Scalar;\n    typedef typename CwiseUnaryOpImpl<UnaryOp,MatrixType,Sparse>::MatrixTypeReverseIterator Base;\n  public:\n\n    EIGEN_STRONG_INLINE ReverseInnerIterator(const CwiseUnaryOpImpl& unaryOp, typename CwiseUnaryOpImpl::Index outer)\n      : Base(unaryOp.derived().nestedExpression(),outer), m_functor(unaryOp.derived().functor())\n    {}\n\n    EIGEN_STRONG_INLINE ReverseInnerIterator& operator--()\n    { Base::operator--(); return *this; }\n\n    EIGEN_STRONG_INLINE typename CwiseUnaryOpImpl::Scalar value() const { return m_functor(Base::value()); }\n\n  protected:\n    const UnaryOp m_functor;\n  private:\n    typename CwiseUnaryOpImpl::Scalar& valueRef();\n};\n\ntemplate<typename ViewOp, typename MatrixType>\nclass CwiseUnaryViewImpl<ViewOp,MatrixType,Sparse>\n  : public SparseMatrixBase<CwiseUnaryView<ViewOp, MatrixType> >\n{\n  public:\n\n    class InnerIterator;\n    class ReverseInnerIterator;\n\n    typedef CwiseUnaryView<ViewOp, MatrixType> Derived;\n    EIGEN_SPARSE_PUBLIC_INTERFACE(Derived)\n\n  protected:\n    typedef typename internal::traits<Derived>::_MatrixTypeNested _MatrixTypeNested;\n    typedef typename _MatrixTypeNested::InnerIterator MatrixTypeIterator;\n    typedef typename _MatrixTypeNested::ReverseInnerIterator MatrixTypeReverseIterator;\n};\n\ntemplate<typename ViewOp, typename MatrixType>\nclass CwiseUnaryViewImpl<ViewOp,MatrixType,Sparse>::InnerIterator\n    : public CwiseUnaryViewImpl<ViewOp,MatrixType,Sparse>::MatrixTypeIterator\n{\n    typedef typename CwiseUnaryViewImpl::Scalar Scalar;\n    typedef typename CwiseUnaryViewImpl<ViewOp,MatrixType,Sparse>::MatrixTypeIterator Base;\n  public:\n\n    EIGEN_STRONG_INLINE InnerIterator(const CwiseUnaryViewImpl& unaryOp, typename CwiseUnaryViewImpl::Index outer)\n      : Base(unaryOp.derived().nestedExpression(),outer), m_functor(unaryOp.derived().functor())\n    {}\n\n    EIGEN_STRONG_INLINE InnerIterator& operator++()\n    { Base::operator++(); return *this; }\n\n    EIGEN_STRONG_INLINE typename CwiseUnaryViewImpl::Scalar value() const { return m_functor(Base::value()); }\n    EIGEN_STRONG_INLINE typename CwiseUnaryViewImpl::Scalar& valueRef() { return m_functor(Base::valueRef()); }\n\n  protected:\n    const ViewOp m_functor;\n};\n\ntemplate<typename ViewOp, typename MatrixType>\nclass CwiseUnaryViewImpl<ViewOp,MatrixType,Sparse>::ReverseInnerIterator\n    : public CwiseUnaryViewImpl<ViewOp,MatrixType,Sparse>::MatrixTypeReverseIterator\n{\n    typedef typename CwiseUnaryViewImpl::Scalar Scalar;\n    typedef typename CwiseUnaryViewImpl<ViewOp,MatrixType,Sparse>::MatrixTypeReverseIterator Base;\n  public:\n\n    EIGEN_STRONG_INLINE ReverseInnerIterator(const CwiseUnaryViewImpl& unaryOp, typename CwiseUnaryViewImpl::Index outer)\n      : Base(unaryOp.derived().nestedExpression(),outer), m_functor(unaryOp.derived().functor())\n    {}\n\n    EIGEN_STRONG_INLINE ReverseInnerIterator& operator--()\n    { Base::operator--(); return *this; }\n\n    EIGEN_STRONG_INLINE typename CwiseUnaryViewImpl::Scalar value() const { return m_functor(Base::value()); }\n    EIGEN_STRONG_INLINE typename CwiseUnaryViewImpl::Scalar& valueRef() { return m_functor(Base::valueRef()); }\n\n  protected:\n    const ViewOp m_functor;\n};\n\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE Derived&\nSparseMatrixBase<Derived>::operator*=(const Scalar& other)\n{\n  for (Index j=0; j<outerSize(); ++j)\n    for (typename Derived::InnerIterator i(derived(),j); i; ++i)\n      i.valueRef() *= other;\n  return derived();\n}\n\ntemplate<typename Derived>\nEIGEN_STRONG_INLINE Derived&\nSparseMatrixBase<Derived>::operator/=(const Scalar& other)\n{\n  for (Index j=0; j<outerSize(); ++j)\n    for (typename Derived::InnerIterator i(derived(),j); i; ++i)\n      i.valueRef() /= other;\n  return derived();\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_SPARSE_CWISE_UNARY_OP_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseCore/SparseDenseProduct.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SPARSEDENSEPRODUCT_H\n#define EIGEN_SPARSEDENSEPRODUCT_H\n\nnamespace Eigen { \n\ntemplate<typename Lhs, typename Rhs, int InnerSize> struct SparseDenseProductReturnType\n{\n  typedef SparseTimeDenseProduct<Lhs,Rhs> Type;\n};\n\ntemplate<typename Lhs, typename Rhs> struct SparseDenseProductReturnType<Lhs,Rhs,1>\n{\n  typedef typename internal::conditional<\n    Lhs::IsRowMajor,\n    SparseDenseOuterProduct<Rhs,Lhs,true>,\n    SparseDenseOuterProduct<Lhs,Rhs,false> >::type Type;\n};\n\ntemplate<typename Lhs, typename Rhs, int InnerSize> struct DenseSparseProductReturnType\n{\n  typedef DenseTimeSparseProduct<Lhs,Rhs> Type;\n};\n\ntemplate<typename Lhs, typename Rhs> struct DenseSparseProductReturnType<Lhs,Rhs,1>\n{\n  typedef typename internal::conditional<\n    Rhs::IsRowMajor,\n    SparseDenseOuterProduct<Rhs,Lhs,true>,\n    SparseDenseOuterProduct<Lhs,Rhs,false> >::type Type;\n};\n\nnamespace internal {\n\ntemplate<typename Lhs, typename Rhs, bool Tr>\nstruct traits<SparseDenseOuterProduct<Lhs,Rhs,Tr> >\n{\n  typedef Sparse StorageKind;\n  typedef typename scalar_product_traits<typename traits<Lhs>::Scalar,\n                                         typename traits<Rhs>::Scalar>::ReturnType Scalar;\n  typedef typename Lhs::Index Index;\n  typedef typename Lhs::Nested LhsNested;\n  typedef typename Rhs::Nested RhsNested;\n  typedef typename remove_all<LhsNested>::type _LhsNested;\n  typedef typename remove_all<RhsNested>::type _RhsNested;\n\n  enum {\n    LhsCoeffReadCost = traits<_LhsNested>::CoeffReadCost,\n    RhsCoeffReadCost = traits<_RhsNested>::CoeffReadCost,\n\n    RowsAtCompileTime    = Tr ? int(traits<Rhs>::RowsAtCompileTime)     : int(traits<Lhs>::RowsAtCompileTime),\n    ColsAtCompileTime    = Tr ? int(traits<Lhs>::ColsAtCompileTime)     : int(traits<Rhs>::ColsAtCompileTime),\n    MaxRowsAtCompileTime = Tr ? int(traits<Rhs>::MaxRowsAtCompileTime)  : int(traits<Lhs>::MaxRowsAtCompileTime),\n    MaxColsAtCompileTime = Tr ? int(traits<Lhs>::MaxColsAtCompileTime)  : int(traits<Rhs>::MaxColsAtCompileTime),\n\n    Flags = Tr ? RowMajorBit : 0,\n\n    CoeffReadCost = LhsCoeffReadCost + RhsCoeffReadCost + NumTraits<Scalar>::MulCost\n  };\n};\n\n} // end namespace internal\n\ntemplate<typename Lhs, typename Rhs, bool Tr>\nclass SparseDenseOuterProduct\n : public SparseMatrixBase<SparseDenseOuterProduct<Lhs,Rhs,Tr> >\n{\n  public:\n\n    typedef SparseMatrixBase<SparseDenseOuterProduct> Base;\n    EIGEN_DENSE_PUBLIC_INTERFACE(SparseDenseOuterProduct)\n    typedef internal::traits<SparseDenseOuterProduct> Traits;\n\n  private:\n\n    typedef typename Traits::LhsNested LhsNested;\n    typedef typename Traits::RhsNested RhsNested;\n    typedef typename Traits::_LhsNested _LhsNested;\n    typedef typename Traits::_RhsNested _RhsNested;\n\n  public:\n\n    class InnerIterator;\n\n    EIGEN_STRONG_INLINE SparseDenseOuterProduct(const Lhs& lhs, const Rhs& rhs)\n      : m_lhs(lhs), m_rhs(rhs)\n    {\n      EIGEN_STATIC_ASSERT(!Tr,YOU_MADE_A_PROGRAMMING_MISTAKE);\n    }\n\n    EIGEN_STRONG_INLINE SparseDenseOuterProduct(const Rhs& rhs, const Lhs& lhs)\n      : m_lhs(lhs), m_rhs(rhs)\n    {\n      EIGEN_STATIC_ASSERT(Tr,YOU_MADE_A_PROGRAMMING_MISTAKE);\n    }\n\n    EIGEN_STRONG_INLINE Index rows() const { return Tr ? m_rhs.rows() : m_lhs.rows(); }\n    EIGEN_STRONG_INLINE Index cols() const { return Tr ? m_lhs.cols() : m_rhs.cols(); }\n\n    EIGEN_STRONG_INLINE const _LhsNested& lhs() const { return m_lhs; }\n    EIGEN_STRONG_INLINE const _RhsNested& rhs() const { return m_rhs; }\n\n  protected:\n    LhsNested m_lhs;\n    RhsNested m_rhs;\n};\n\ntemplate<typename Lhs, typename Rhs, bool Transpose>\nclass SparseDenseOuterProduct<Lhs,Rhs,Transpose>::InnerIterator : public _LhsNested::InnerIterator\n{\n    typedef typename _LhsNested::InnerIterator Base;\n    typedef typename SparseDenseOuterProduct::Index Index;\n  public:\n    EIGEN_STRONG_INLINE InnerIterator(const SparseDenseOuterProduct& prod, Index outer)\n      : Base(prod.lhs(), 0), m_outer(outer), m_factor(get(prod.rhs(), outer, typename internal::traits<Rhs>::StorageKind() ))\n    { }\n\n    inline Index outer() const { return m_outer; }\n    inline Index row() const { return Transpose ? m_outer : Base::index(); }\n    inline Index col() const { return Transpose ? Base::index() : m_outer; }\n\n    inline Scalar value() const { return Base::value() * m_factor; }\n\n  protected:\n    static Scalar get(const _RhsNested &rhs, Index outer, Dense = Dense())\n    {\n      return rhs.coeff(outer);\n    }\n    \n    static Scalar get(const _RhsNested &rhs, Index outer, Sparse = Sparse())\n    {\n      typename Traits::_RhsNested::InnerIterator it(rhs, outer);\n      if (it && it.index()==0)\n        return it.value();\n      \n      return Scalar(0);\n    }\n    \n    Index m_outer;\n    Scalar m_factor;\n};\n\nnamespace internal {\ntemplate<typename Lhs, typename Rhs>\nstruct traits<SparseTimeDenseProduct<Lhs,Rhs> >\n : traits<ProductBase<SparseTimeDenseProduct<Lhs,Rhs>, Lhs, Rhs> >\n{\n  typedef Dense StorageKind;\n  typedef MatrixXpr XprKind;\n};\n\ntemplate<typename SparseLhsType, typename DenseRhsType, typename DenseResType,\n         int LhsStorageOrder = ((SparseLhsType::Flags&RowMajorBit)==RowMajorBit) ? RowMajor : ColMajor,\n         bool ColPerCol = ((DenseRhsType::Flags&RowMajorBit)==0) || DenseRhsType::ColsAtCompileTime==1>\nstruct sparse_time_dense_product_impl;\n\ntemplate<typename SparseLhsType, typename DenseRhsType, typename DenseResType>\nstruct sparse_time_dense_product_impl<SparseLhsType,DenseRhsType,DenseResType, RowMajor, true>\n{\n  typedef typename internal::remove_all<SparseLhsType>::type Lhs;\n  typedef typename internal::remove_all<DenseRhsType>::type Rhs;\n  typedef typename internal::remove_all<DenseResType>::type Res;\n  typedef typename Lhs::Index Index;\n  typedef typename Lhs::InnerIterator LhsInnerIterator;\n  static void run(const SparseLhsType& lhs, const DenseRhsType& rhs, DenseResType& res, const typename Res::Scalar& alpha)\n  {\n    for(Index c=0; c<rhs.cols(); ++c)\n    {\n      Index n = lhs.outerSize();\n      for(Index j=0; j<n; ++j)\n      {\n        typename Res::Scalar tmp(0);\n        for(LhsInnerIterator it(lhs,j); it ;++it)\n          tmp += it.value() * rhs.coeff(it.index(),c);\n        res.coeffRef(j,c) += alpha * tmp;\n      }\n    }\n  }\n};\n\ntemplate<typename SparseLhsType, typename DenseRhsType, typename DenseResType>\nstruct sparse_time_dense_product_impl<SparseLhsType,DenseRhsType,DenseResType, ColMajor, true>\n{\n  typedef typename internal::remove_all<SparseLhsType>::type Lhs;\n  typedef typename internal::remove_all<DenseRhsType>::type Rhs;\n  typedef typename internal::remove_all<DenseResType>::type Res;\n  typedef typename Lhs::InnerIterator LhsInnerIterator;\n  typedef typename Lhs::Index Index;\n  static void run(const SparseLhsType& lhs, const DenseRhsType& rhs, DenseResType& res, const typename Res::Scalar& alpha)\n  {\n    for(Index c=0; c<rhs.cols(); ++c)\n    {\n      for(Index j=0; j<lhs.outerSize(); ++j)\n      {\n        typename Res::Scalar rhs_j = alpha * rhs.coeff(j,c);\n        for(LhsInnerIterator it(lhs,j); it ;++it)\n          res.coeffRef(it.index(),c) += it.value() * rhs_j;\n      }\n    }\n  }\n};\n\ntemplate<typename SparseLhsType, typename DenseRhsType, typename DenseResType>\nstruct sparse_time_dense_product_impl<SparseLhsType,DenseRhsType,DenseResType, RowMajor, false>\n{\n  typedef typename internal::remove_all<SparseLhsType>::type Lhs;\n  typedef typename internal::remove_all<DenseRhsType>::type Rhs;\n  typedef typename internal::remove_all<DenseResType>::type Res;\n  typedef typename Lhs::InnerIterator LhsInnerIterator;\n  typedef typename Lhs::Index Index;\n  static void run(const SparseLhsType& lhs, const DenseRhsType& rhs, DenseResType& res, const typename Res::Scalar& alpha)\n  {\n    for(Index j=0; j<lhs.outerSize(); ++j)\n    {\n      typename Res::RowXpr res_j(res.row(j));\n      for(LhsInnerIterator it(lhs,j); it ;++it)\n        res_j += (alpha*it.value()) * rhs.row(it.index());\n    }\n  }\n};\n\ntemplate<typename SparseLhsType, typename DenseRhsType, typename DenseResType>\nstruct sparse_time_dense_product_impl<SparseLhsType,DenseRhsType,DenseResType, ColMajor, false>\n{\n  typedef typename internal::remove_all<SparseLhsType>::type Lhs;\n  typedef typename internal::remove_all<DenseRhsType>::type Rhs;\n  typedef typename internal::remove_all<DenseResType>::type Res;\n  typedef typename Lhs::InnerIterator LhsInnerIterator;\n  typedef typename Lhs::Index Index;\n  static void run(const SparseLhsType& lhs, const DenseRhsType& rhs, DenseResType& res, const typename Res::Scalar& alpha)\n  {\n    for(Index j=0; j<lhs.outerSize(); ++j)\n    {\n      typename Rhs::ConstRowXpr rhs_j(rhs.row(j));\n      for(LhsInnerIterator it(lhs,j); it ;++it)\n        res.row(it.index()) += (alpha*it.value()) * rhs_j;\n    }\n  }\n};\n\ntemplate<typename SparseLhsType, typename DenseRhsType, typename DenseResType,typename AlphaType>\ninline void sparse_time_dense_product(const SparseLhsType& lhs, const DenseRhsType& rhs, DenseResType& res, const AlphaType& alpha)\n{\n  sparse_time_dense_product_impl<SparseLhsType,DenseRhsType,DenseResType>::run(lhs, rhs, res, alpha);\n}\n\n} // end namespace internal\n\ntemplate<typename Lhs, typename Rhs>\nclass SparseTimeDenseProduct\n  : public ProductBase<SparseTimeDenseProduct<Lhs,Rhs>, Lhs, Rhs>\n{\n  public:\n    EIGEN_PRODUCT_PUBLIC_INTERFACE(SparseTimeDenseProduct)\n\n    SparseTimeDenseProduct(const Lhs& lhs, const Rhs& rhs) : Base(lhs,rhs)\n    {}\n\n    template<typename Dest> void scaleAndAddTo(Dest& dest, const Scalar& alpha) const\n    {\n      internal::sparse_time_dense_product(m_lhs, m_rhs, dest, alpha);\n    }\n\n  private:\n    SparseTimeDenseProduct& operator=(const SparseTimeDenseProduct&);\n};\n\n\n// dense = dense * sparse\nnamespace internal {\ntemplate<typename Lhs, typename Rhs>\nstruct traits<DenseTimeSparseProduct<Lhs,Rhs> >\n : traits<ProductBase<DenseTimeSparseProduct<Lhs,Rhs>, Lhs, Rhs> >\n{\n  typedef Dense StorageKind;\n};\n} // end namespace internal\n\ntemplate<typename Lhs, typename Rhs>\nclass DenseTimeSparseProduct\n  : public ProductBase<DenseTimeSparseProduct<Lhs,Rhs>, Lhs, Rhs>\n{\n  public:\n    EIGEN_PRODUCT_PUBLIC_INTERFACE(DenseTimeSparseProduct)\n\n    DenseTimeSparseProduct(const Lhs& lhs, const Rhs& rhs) : Base(lhs,rhs)\n    {}\n\n    template<typename Dest> void scaleAndAddTo(Dest& dest, const Scalar& alpha) const\n    {\n      Transpose<const _LhsNested> lhs_t(m_lhs);\n      Transpose<const _RhsNested> rhs_t(m_rhs);\n      Transpose<Dest> dest_t(dest);\n      internal::sparse_time_dense_product(rhs_t, lhs_t, dest_t, alpha);\n    }\n\n  private:\n    DenseTimeSparseProduct& operator=(const DenseTimeSparseProduct&);\n};\n\n} // end namespace Eigen\n\n#endif // EIGEN_SPARSEDENSEPRODUCT_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseCore/SparseDiagonalProduct.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SPARSE_DIAGONAL_PRODUCT_H\n#define EIGEN_SPARSE_DIAGONAL_PRODUCT_H\n\nnamespace Eigen { \n\n// The product of a diagonal matrix with a sparse matrix can be easily\n// implemented using expression template.\n// We have two consider very different cases:\n// 1 - diag * row-major sparse\n//     => each inner vector <=> scalar * sparse vector product\n//     => so we can reuse CwiseUnaryOp::InnerIterator\n// 2 - diag * col-major sparse\n//     => each inner vector <=> densevector * sparse vector cwise product\n//     => again, we can reuse specialization of CwiseBinaryOp::InnerIterator\n//        for that particular case\n// The two other cases are symmetric.\n\nnamespace internal {\n\ntemplate<typename Lhs, typename Rhs>\nstruct traits<SparseDiagonalProduct<Lhs, Rhs> >\n{\n  typedef typename remove_all<Lhs>::type _Lhs;\n  typedef typename remove_all<Rhs>::type _Rhs;\n  typedef typename _Lhs::Scalar Scalar;\n  typedef typename promote_index_type<typename traits<Lhs>::Index,\n                                         typename traits<Rhs>::Index>::type Index;\n  typedef Sparse StorageKind;\n  typedef MatrixXpr XprKind;\n  enum {\n    RowsAtCompileTime = _Lhs::RowsAtCompileTime,\n    ColsAtCompileTime = _Rhs::ColsAtCompileTime,\n\n    MaxRowsAtCompileTime = _Lhs::MaxRowsAtCompileTime,\n    MaxColsAtCompileTime = _Rhs::MaxColsAtCompileTime,\n\n    SparseFlags = is_diagonal<_Lhs>::ret ? int(_Rhs::Flags) : int(_Lhs::Flags),\n    Flags = (SparseFlags&RowMajorBit),\n    CoeffReadCost = Dynamic\n  };\n};\n\nenum {SDP_IsDiagonal, SDP_IsSparseRowMajor, SDP_IsSparseColMajor};\ntemplate<typename Lhs, typename Rhs, typename SparseDiagonalProductType, int RhsMode, int LhsMode>\nclass sparse_diagonal_product_inner_iterator_selector;\n\n} // end namespace internal\n\ntemplate<typename Lhs, typename Rhs>\nclass SparseDiagonalProduct\n  : public SparseMatrixBase<SparseDiagonalProduct<Lhs,Rhs> >,\n    internal::no_assignment_operator\n{\n    typedef typename Lhs::Nested LhsNested;\n    typedef typename Rhs::Nested RhsNested;\n\n    typedef typename internal::remove_all<LhsNested>::type _LhsNested;\n    typedef typename internal::remove_all<RhsNested>::type _RhsNested;\n\n    enum {\n      LhsMode = internal::is_diagonal<_LhsNested>::ret ? internal::SDP_IsDiagonal\n              : (_LhsNested::Flags&RowMajorBit) ? internal::SDP_IsSparseRowMajor : internal::SDP_IsSparseColMajor,\n      RhsMode = internal::is_diagonal<_RhsNested>::ret ? internal::SDP_IsDiagonal\n              : (_RhsNested::Flags&RowMajorBit) ? internal::SDP_IsSparseRowMajor : internal::SDP_IsSparseColMajor\n    };\n\n  public:\n\n    EIGEN_SPARSE_PUBLIC_INTERFACE(SparseDiagonalProduct)\n\n    typedef internal::sparse_diagonal_product_inner_iterator_selector\n                      <_LhsNested,_RhsNested,SparseDiagonalProduct,LhsMode,RhsMode> InnerIterator;\n    \n    // We do not want ReverseInnerIterator for diagonal-sparse products,\n    // but this dummy declaration is needed to make diag * sparse * diag compile.\n    class ReverseInnerIterator;\n\n    EIGEN_STRONG_INLINE SparseDiagonalProduct(const Lhs& lhs, const Rhs& rhs)\n      : m_lhs(lhs), m_rhs(rhs)\n    {\n      eigen_assert(lhs.cols() == rhs.rows() && \"invalid sparse matrix * diagonal matrix product\");\n    }\n\n    EIGEN_STRONG_INLINE Index rows() const { return m_lhs.rows(); }\n    EIGEN_STRONG_INLINE Index cols() const { return m_rhs.cols(); }\n\n    EIGEN_STRONG_INLINE const _LhsNested& lhs() const { return m_lhs; }\n    EIGEN_STRONG_INLINE const _RhsNested& rhs() const { return m_rhs; }\n\n  protected:\n    LhsNested m_lhs;\n    RhsNested m_rhs;\n};\n\nnamespace internal {\n\ntemplate<typename Lhs, typename Rhs, typename SparseDiagonalProductType>\nclass sparse_diagonal_product_inner_iterator_selector\n<Lhs,Rhs,SparseDiagonalProductType,SDP_IsDiagonal,SDP_IsSparseRowMajor>\n  : public CwiseUnaryOp<scalar_multiple_op<typename Lhs::Scalar>,const Rhs>::InnerIterator\n{\n    typedef typename CwiseUnaryOp<scalar_multiple_op<typename Lhs::Scalar>,const Rhs>::InnerIterator Base;\n    typedef typename Lhs::Index Index;\n  public:\n    inline sparse_diagonal_product_inner_iterator_selector(\n              const SparseDiagonalProductType& expr, Index outer)\n      : Base(expr.rhs()*(expr.lhs().diagonal().coeff(outer)), outer)\n    {}\n};\n\ntemplate<typename Lhs, typename Rhs, typename SparseDiagonalProductType>\nclass sparse_diagonal_product_inner_iterator_selector\n<Lhs,Rhs,SparseDiagonalProductType,SDP_IsDiagonal,SDP_IsSparseColMajor>\n  : public CwiseBinaryOp<\n      scalar_product_op<typename Lhs::Scalar>,\n      const typename Rhs::ConstInnerVectorReturnType,\n      const typename Lhs::DiagonalVectorType>::InnerIterator\n{\n    typedef typename CwiseBinaryOp<\n      scalar_product_op<typename Lhs::Scalar>,\n      const typename Rhs::ConstInnerVectorReturnType,\n      const typename Lhs::DiagonalVectorType>::InnerIterator Base;\n    typedef typename Lhs::Index Index;\n    Index m_outer;\n  public:\n    inline sparse_diagonal_product_inner_iterator_selector(\n              const SparseDiagonalProductType& expr, Index outer)\n      : Base(expr.rhs().innerVector(outer) .cwiseProduct(expr.lhs().diagonal()), 0), m_outer(outer)\n    {}\n    \n    inline Index outer() const { return m_outer; }\n    inline Index col() const { return m_outer; }\n};\n\ntemplate<typename Lhs, typename Rhs, typename SparseDiagonalProductType>\nclass sparse_diagonal_product_inner_iterator_selector\n<Lhs,Rhs,SparseDiagonalProductType,SDP_IsSparseColMajor,SDP_IsDiagonal>\n  : public CwiseUnaryOp<scalar_multiple_op<typename Rhs::Scalar>,const Lhs>::InnerIterator\n{\n    typedef typename CwiseUnaryOp<scalar_multiple_op<typename Rhs::Scalar>,const Lhs>::InnerIterator Base;\n    typedef typename Lhs::Index Index;\n  public:\n    inline sparse_diagonal_product_inner_iterator_selector(\n              const SparseDiagonalProductType& expr, Index outer)\n      : Base(expr.lhs()*expr.rhs().diagonal().coeff(outer), outer)\n    {}\n};\n\ntemplate<typename Lhs, typename Rhs, typename SparseDiagonalProductType>\nclass sparse_diagonal_product_inner_iterator_selector\n<Lhs,Rhs,SparseDiagonalProductType,SDP_IsSparseRowMajor,SDP_IsDiagonal>\n  : public CwiseBinaryOp<\n      scalar_product_op<typename Rhs::Scalar>,\n      const typename Lhs::ConstInnerVectorReturnType,\n      const Transpose<const typename Rhs::DiagonalVectorType> >::InnerIterator\n{\n    typedef typename CwiseBinaryOp<\n      scalar_product_op<typename Rhs::Scalar>,\n      const typename Lhs::ConstInnerVectorReturnType,\n      const Transpose<const typename Rhs::DiagonalVectorType> >::InnerIterator Base;\n    typedef typename Lhs::Index Index;\n    Index m_outer;\n  public:\n    inline sparse_diagonal_product_inner_iterator_selector(\n              const SparseDiagonalProductType& expr, Index outer)\n      : Base(expr.lhs().innerVector(outer) .cwiseProduct(expr.rhs().diagonal().transpose()), 0), m_outer(outer)\n    {}\n    \n    inline Index outer() const { return m_outer; }\n    inline Index row() const { return m_outer; }\n};\n\n} // end namespace internal\n\n// SparseMatrixBase functions\n\ntemplate<typename Derived>\ntemplate<typename OtherDerived>\nconst SparseDiagonalProduct<Derived,OtherDerived>\nSparseMatrixBase<Derived>::operator*(const DiagonalBase<OtherDerived> &other) const\n{\n  return SparseDiagonalProduct<Derived,OtherDerived>(this->derived(), other.derived());\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_SPARSE_DIAGONAL_PRODUCT_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseCore/SparseDot.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SPARSE_DOT_H\n#define EIGEN_SPARSE_DOT_H\n\nnamespace Eigen { \n\ntemplate<typename Derived>\ntemplate<typename OtherDerived>\ntypename internal::traits<Derived>::Scalar\nSparseMatrixBase<Derived>::dot(const MatrixBase<OtherDerived>& other) const\n{\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)\n  EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Derived,OtherDerived)\n  EIGEN_STATIC_ASSERT((internal::is_same<Scalar, typename OtherDerived::Scalar>::value),\n    YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)\n\n  eigen_assert(size() == other.size());\n  eigen_assert(other.size()>0 && \"you are using a non initialized vector\");\n\n  typename Derived::InnerIterator i(derived(),0);\n  Scalar res(0);\n  while (i)\n  {\n    res += numext::conj(i.value()) * other.coeff(i.index());\n    ++i;\n  }\n  return res;\n}\n\ntemplate<typename Derived>\ntemplate<typename OtherDerived>\ntypename internal::traits<Derived>::Scalar\nSparseMatrixBase<Derived>::dot(const SparseMatrixBase<OtherDerived>& other) const\n{\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)\n  EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Derived,OtherDerived)\n  EIGEN_STATIC_ASSERT((internal::is_same<Scalar, typename OtherDerived::Scalar>::value),\n    YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)\n\n  eigen_assert(size() == other.size());\n\n  typedef typename Derived::Nested  Nested;\n  typedef typename OtherDerived::Nested  OtherNested;\n  typedef typename internal::remove_all<Nested>::type  NestedCleaned;\n  typedef typename internal::remove_all<OtherNested>::type  OtherNestedCleaned;\n\n  Nested nthis(derived());\n  OtherNested nother(other.derived());\n\n  typename NestedCleaned::InnerIterator i(nthis,0);\n  typename OtherNestedCleaned::InnerIterator j(nother,0);\n  Scalar res(0);\n  while (i && j)\n  {\n    if (i.index()==j.index())\n    {\n      res += numext::conj(i.value()) * j.value();\n      ++i; ++j;\n    }\n    else if (i.index()<j.index())\n      ++i;\n    else\n      ++j;\n  }\n  return res;\n}\n\ntemplate<typename Derived>\ninline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real\nSparseMatrixBase<Derived>::squaredNorm() const\n{\n  return numext::real((*this).cwiseAbs2().sum());\n}\n\ntemplate<typename Derived>\ninline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real\nSparseMatrixBase<Derived>::norm() const\n{\n  using std::sqrt;\n  return sqrt(squaredNorm());\n}\n\ntemplate<typename Derived>\ninline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real\nSparseMatrixBase<Derived>::blueNorm() const\n{\n  return internal::blueNorm_impl(*this);\n}\n} // end namespace Eigen\n\n#endif // EIGEN_SPARSE_DOT_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseCore/SparseFuzzy.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SPARSE_FUZZY_H\n#define EIGEN_SPARSE_FUZZY_H\n\n// template<typename Derived>\n// template<typename OtherDerived>\n// bool SparseMatrixBase<Derived>::isApprox(\n//   const OtherDerived& other,\n//   typename NumTraits<Scalar>::Real prec\n// ) const\n// {\n//   const typename internal::nested<Derived,2>::type nested(derived());\n//   const typename internal::nested<OtherDerived,2>::type otherNested(other.derived());\n//   return    (nested - otherNested).cwise().abs2().sum()\n//          <= prec * prec * (std::min)(nested.cwise().abs2().sum(), otherNested.cwise().abs2().sum());\n// }\n\n#endif // EIGEN_SPARSE_FUZZY_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseCore/SparseMatrix.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SPARSEMATRIX_H\n#define EIGEN_SPARSEMATRIX_H\n\nnamespace Eigen { \n\n/** \\ingroup SparseCore_Module\n  *\n  * \\class SparseMatrix\n  *\n  * \\brief A versatible sparse matrix representation\n  *\n  * This class implements a more versatile variants of the common \\em compressed row/column storage format.\n  * Each colmun's (resp. row) non zeros are stored as a pair of value with associated row (resp. colmiun) index.\n  * All the non zeros are stored in a single large buffer. Unlike the \\em compressed format, there might be extra\n  * space inbetween the nonzeros of two successive colmuns (resp. rows) such that insertion of new non-zero\n  * can be done with limited memory reallocation and copies.\n  *\n  * A call to the function makeCompressed() turns the matrix into the standard \\em compressed format\n  * compatible with many library.\n  *\n  * More details on this storage sceheme are given in the \\ref TutorialSparse \"manual pages\".\n  *\n  * \\tparam _Scalar the scalar type, i.e. the type of the coefficients\n  * \\tparam _Options Union of bit flags controlling the storage scheme. Currently the only possibility\n  *                 is ColMajor or RowMajor. The default is 0 which means column-major.\n  * \\tparam _Index the type of the indices. It has to be a \\b signed type (e.g., short, int, std::ptrdiff_t). Default is \\c int.\n  *\n  * This class can be extended with the help of the plugin mechanism described on the page\n  * \\ref TopicCustomizingEigen by defining the preprocessor symbol \\c EIGEN_SPARSEMATRIX_PLUGIN.\n  */\n\nnamespace internal {\ntemplate<typename _Scalar, int _Options, typename _Index>\nstruct traits<SparseMatrix<_Scalar, _Options, _Index> >\n{\n  typedef _Scalar Scalar;\n  typedef _Index Index;\n  typedef Sparse StorageKind;\n  typedef MatrixXpr XprKind;\n  enum {\n    RowsAtCompileTime = Dynamic,\n    ColsAtCompileTime = Dynamic,\n    MaxRowsAtCompileTime = Dynamic,\n    MaxColsAtCompileTime = Dynamic,\n    Flags = _Options | NestByRefBit | LvalueBit,\n    CoeffReadCost = NumTraits<Scalar>::ReadCost,\n    SupportedAccessPatterns = InnerRandomAccessPattern\n  };\n};\n\ntemplate<typename _Scalar, int _Options, typename _Index, int DiagIndex>\nstruct traits<Diagonal<const SparseMatrix<_Scalar, _Options, _Index>, DiagIndex> >\n{\n  typedef SparseMatrix<_Scalar, _Options, _Index> MatrixType;\n  typedef typename nested<MatrixType>::type MatrixTypeNested;\n  typedef typename remove_reference<MatrixTypeNested>::type _MatrixTypeNested;\n\n  typedef _Scalar Scalar;\n  typedef Dense StorageKind;\n  typedef _Index Index;\n  typedef MatrixXpr XprKind;\n\n  enum {\n    RowsAtCompileTime = Dynamic,\n    ColsAtCompileTime = 1,\n    MaxRowsAtCompileTime = Dynamic,\n    MaxColsAtCompileTime = 1,\n    Flags = 0,\n    CoeffReadCost = _MatrixTypeNested::CoeffReadCost*10\n  };\n};\n\n} // end namespace internal\n\ntemplate<typename _Scalar, int _Options, typename _Index>\nclass SparseMatrix\n  : public SparseMatrixBase<SparseMatrix<_Scalar, _Options, _Index> >\n{\n  public:\n    EIGEN_SPARSE_PUBLIC_INTERFACE(SparseMatrix)\n    EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(SparseMatrix, +=)\n    EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(SparseMatrix, -=)\n\n    typedef MappedSparseMatrix<Scalar,Flags> Map;\n    using Base::IsRowMajor;\n    typedef internal::CompressedStorage<Scalar,Index> Storage;\n    enum {\n      Options = _Options\n    };\n\n  protected:\n\n    typedef SparseMatrix<Scalar,(Flags&~RowMajorBit)|(IsRowMajor?RowMajorBit:0)> TransposedSparseMatrix;\n\n    Index m_outerSize;\n    Index m_innerSize;\n    Index* m_outerIndex;\n    Index* m_innerNonZeros;     // optional, if null then the data is compressed\n    Storage m_data;\n    \n    Eigen::Map<Matrix<Index,Dynamic,1> > innerNonZeros() { return Eigen::Map<Matrix<Index,Dynamic,1> >(m_innerNonZeros, m_innerNonZeros?m_outerSize:0); }\n    const  Eigen::Map<const Matrix<Index,Dynamic,1> > innerNonZeros() const { return Eigen::Map<const Matrix<Index,Dynamic,1> >(m_innerNonZeros, m_innerNonZeros?m_outerSize:0); }\n\n  public:\n    \n    /** \\returns whether \\c *this is in compressed form. */\n    inline bool isCompressed() const { return m_innerNonZeros==0; }\n\n    /** \\returns the number of rows of the matrix */\n    inline Index rows() const { return IsRowMajor ? m_outerSize : m_innerSize; }\n    /** \\returns the number of columns of the matrix */\n    inline Index cols() const { return IsRowMajor ? m_innerSize : m_outerSize; }\n\n    /** \\returns the number of rows (resp. columns) of the matrix if the storage order column major (resp. row major) */\n    inline Index innerSize() const { return m_innerSize; }\n    /** \\returns the number of columns (resp. rows) of the matrix if the storage order column major (resp. row major) */\n    inline Index outerSize() const { return m_outerSize; }\n    \n    /** \\returns a const pointer to the array of values.\n      * This function is aimed at interoperability with other libraries.\n      * \\sa innerIndexPtr(), outerIndexPtr() */\n    inline const Scalar* valuePtr() const { return m_data.valuePtr(); }\n    /** \\returns a non-const pointer to the array of values.\n      * This function is aimed at interoperability with other libraries.\n      * \\sa innerIndexPtr(), outerIndexPtr() */\n    inline Scalar* valuePtr() { return m_data.valuePtr(); }\n\n    /** \\returns a const pointer to the array of inner indices.\n      * This function is aimed at interoperability with other libraries.\n      * \\sa valuePtr(), outerIndexPtr() */\n    inline const Index* innerIndexPtr() const { return m_data.indexPtr(); }\n    /** \\returns a non-const pointer to the array of inner indices.\n      * This function is aimed at interoperability with other libraries.\n      * \\sa valuePtr(), outerIndexPtr() */\n    inline Index* innerIndexPtr() { return m_data.indexPtr(); }\n\n    /** \\returns a const pointer to the array of the starting positions of the inner vectors.\n      * This function is aimed at interoperability with other libraries.\n      * \\sa valuePtr(), innerIndexPtr() */\n    inline const Index* outerIndexPtr() const { return m_outerIndex; }\n    /** \\returns a non-const pointer to the array of the starting positions of the inner vectors.\n      * This function is aimed at interoperability with other libraries.\n      * \\sa valuePtr(), innerIndexPtr() */\n    inline Index* outerIndexPtr() { return m_outerIndex; }\n\n    /** \\returns a const pointer to the array of the number of non zeros of the inner vectors.\n      * This function is aimed at interoperability with other libraries.\n      * \\warning it returns the null pointer 0 in compressed mode */\n    inline const Index* innerNonZeroPtr() const { return m_innerNonZeros; }\n    /** \\returns a non-const pointer to the array of the number of non zeros of the inner vectors.\n      * This function is aimed at interoperability with other libraries.\n      * \\warning it returns the null pointer 0 in compressed mode */\n    inline Index* innerNonZeroPtr() { return m_innerNonZeros; }\n\n    /** \\internal */\n    inline Storage& data() { return m_data; }\n    /** \\internal */\n    inline const Storage& data() const { return m_data; }\n\n    /** \\returns the value of the matrix at position \\a i, \\a j\n      * This function returns Scalar(0) if the element is an explicit \\em zero */\n    inline Scalar coeff(Index row, Index col) const\n    {\n      eigen_assert(row>=0 && row<rows() && col>=0 && col<cols());\n      \n      const Index outer = IsRowMajor ? row : col;\n      const Index inner = IsRowMajor ? col : row;\n      Index end = m_innerNonZeros ? m_outerIndex[outer] + m_innerNonZeros[outer] : m_outerIndex[outer+1];\n      return m_data.atInRange(m_outerIndex[outer], end, inner);\n    }\n\n    /** \\returns a non-const reference to the value of the matrix at position \\a i, \\a j\n      *\n      * If the element does not exist then it is inserted via the insert(Index,Index) function\n      * which itself turns the matrix into a non compressed form if that was not the case.\n      *\n      * This is a O(log(nnz_j)) operation (binary search) plus the cost of insert(Index,Index)\n      * function if the element does not already exist.\n      */\n    inline Scalar& coeffRef(Index row, Index col)\n    {\n      eigen_assert(row>=0 && row<rows() && col>=0 && col<cols());\n      \n      const Index outer = IsRowMajor ? row : col;\n      const Index inner = IsRowMajor ? col : row;\n\n      Index start = m_outerIndex[outer];\n      Index end = m_innerNonZeros ? m_outerIndex[outer] + m_innerNonZeros[outer] : m_outerIndex[outer+1];\n      eigen_assert(end>=start && \"you probably called coeffRef on a non finalized matrix\");\n      if(end<=start)\n        return insert(row,col);\n      const Index p = m_data.searchLowerIndex(start,end-1,inner);\n      if((p<end) && (m_data.index(p)==inner))\n        return m_data.value(p);\n      else\n        return insert(row,col);\n    }\n\n    /** \\returns a reference to a novel non zero coefficient with coordinates \\a row x \\a col.\n      * The non zero coefficient must \\b not already exist.\n      *\n      * If the matrix \\c *this is in compressed mode, then \\c *this is turned into uncompressed\n      * mode while reserving room for 2 non zeros per inner vector. It is strongly recommended to first\n      * call reserve(const SizesType &) to reserve a more appropriate number of elements per\n      * inner vector that better match your scenario.\n      *\n      * This function performs a sorted insertion in O(1) if the elements of each inner vector are\n      * inserted in increasing inner index order, and in O(nnz_j) for a random insertion.\n      *\n      */\n    Scalar& insert(Index row, Index col)\n    {\n      eigen_assert(row>=0 && row<rows() && col>=0 && col<cols());\n      \n      if(isCompressed())\n      {\n        reserve(Matrix<Index,Dynamic,1>::Constant(outerSize(), 2));\n      }\n      return insertUncompressed(row,col);\n    }\n\n  public:\n\n    class InnerIterator;\n    class ReverseInnerIterator;\n\n    /** Removes all non zeros but keep allocated memory */\n    inline void setZero()\n    {\n      m_data.clear();\n      memset(m_outerIndex, 0, (m_outerSize+1)*sizeof(Index));\n      if(m_innerNonZeros)\n        memset(m_innerNonZeros, 0, (m_outerSize)*sizeof(Index));\n    }\n\n    /** \\returns the number of non zero coefficients */\n    inline Index nonZeros() const\n    {\n      if(m_innerNonZeros)\n        return innerNonZeros().sum();\n      return static_cast<Index>(m_data.size());\n    }\n\n    /** Preallocates \\a reserveSize non zeros.\n      *\n      * Precondition: the matrix must be in compressed mode. */\n    inline void reserve(Index reserveSize)\n    {\n      eigen_assert(isCompressed() && \"This function does not make sense in non compressed mode.\");\n      m_data.reserve(reserveSize);\n    }\n    \n    #ifdef EIGEN_PARSED_BY_DOXYGEN\n    /** Preallocates \\a reserveSize[\\c j] non zeros for each column (resp. row) \\c j.\n      *\n      * This function turns the matrix in non-compressed mode */\n    template<class SizesType>\n    inline void reserve(const SizesType& reserveSizes);\n    #else\n    template<class SizesType>\n    inline void reserve(const SizesType& reserveSizes, const typename SizesType::value_type& enableif = typename SizesType::value_type())\n    {\n      EIGEN_UNUSED_VARIABLE(enableif);\n      reserveInnerVectors(reserveSizes);\n    }\n    template<class SizesType>\n    inline void reserve(const SizesType& reserveSizes, const typename SizesType::Scalar& enableif =\n    #if (!defined(_MSC_VER)) || (_MSC_VER>=1500) // MSVC 2005 fails to compile with this typename\n        typename\n    #endif\n        SizesType::Scalar())\n    {\n      EIGEN_UNUSED_VARIABLE(enableif);\n      reserveInnerVectors(reserveSizes);\n    }\n    #endif // EIGEN_PARSED_BY_DOXYGEN\n  protected:\n    template<class SizesType>\n    inline void reserveInnerVectors(const SizesType& reserveSizes)\n    {\n      if(isCompressed())\n      {\n        std::size_t totalReserveSize = 0;\n        // turn the matrix into non-compressed mode\n        m_innerNonZeros = static_cast<Index*>(std::malloc(m_outerSize * sizeof(Index)));\n        if (!m_innerNonZeros) internal::throw_std_bad_alloc();\n        \n        // temporarily use m_innerSizes to hold the new starting points.\n        Index* newOuterIndex = m_innerNonZeros;\n        \n        Index count = 0;\n        for(Index j=0; j<m_outerSize; ++j)\n        {\n          newOuterIndex[j] = count;\n          count += reserveSizes[j] + (m_outerIndex[j+1]-m_outerIndex[j]);\n          totalReserveSize += reserveSizes[j];\n        }\n        m_data.reserve(totalReserveSize);\n        Index previousOuterIndex = m_outerIndex[m_outerSize];\n        for(Index j=m_outerSize-1; j>=0; --j)\n        {\n          Index innerNNZ = previousOuterIndex - m_outerIndex[j];\n          for(Index i=innerNNZ-1; i>=0; --i)\n          {\n            m_data.index(newOuterIndex[j]+i) = m_data.index(m_outerIndex[j]+i);\n            m_data.value(newOuterIndex[j]+i) = m_data.value(m_outerIndex[j]+i);\n          }\n          previousOuterIndex = m_outerIndex[j];\n          m_outerIndex[j] = newOuterIndex[j];\n          m_innerNonZeros[j] = innerNNZ;\n        }\n        m_outerIndex[m_outerSize] = m_outerIndex[m_outerSize-1] + m_innerNonZeros[m_outerSize-1] + reserveSizes[m_outerSize-1];\n        \n        m_data.resize(m_outerIndex[m_outerSize]);\n      }\n      else\n      {\n        Index* newOuterIndex = static_cast<Index*>(std::malloc((m_outerSize+1)*sizeof(Index)));\n        if (!newOuterIndex) internal::throw_std_bad_alloc();\n        \n        Index count = 0;\n        for(Index j=0; j<m_outerSize; ++j)\n        {\n          newOuterIndex[j] = count;\n          Index alreadyReserved = (m_outerIndex[j+1]-m_outerIndex[j]) - m_innerNonZeros[j];\n          Index toReserve = std::max<Index>(reserveSizes[j], alreadyReserved);\n          count += toReserve + m_innerNonZeros[j];\n        }\n        newOuterIndex[m_outerSize] = count;\n        \n        m_data.resize(count);\n        for(Index j=m_outerSize-1; j>=0; --j)\n        {\n          Index offset = newOuterIndex[j] - m_outerIndex[j];\n          if(offset>0)\n          {\n            Index innerNNZ = m_innerNonZeros[j];\n            for(Index i=innerNNZ-1; i>=0; --i)\n            {\n              m_data.index(newOuterIndex[j]+i) = m_data.index(m_outerIndex[j]+i);\n              m_data.value(newOuterIndex[j]+i) = m_data.value(m_outerIndex[j]+i);\n            }\n          }\n        }\n        \n        std::swap(m_outerIndex, newOuterIndex);\n        std::free(newOuterIndex);\n      }\n      \n    }\n  public:\n\n    //--- low level purely coherent filling ---\n\n    /** \\internal\n      * \\returns a reference to the non zero coefficient at position \\a row, \\a col assuming that:\n      * - the nonzero does not already exist\n      * - the new coefficient is the last one according to the storage order\n      *\n      * Before filling a given inner vector you must call the statVec(Index) function.\n      *\n      * After an insertion session, you should call the finalize() function.\n      *\n      * \\sa insert, insertBackByOuterInner, startVec */\n    inline Scalar& insertBack(Index row, Index col)\n    {\n      return insertBackByOuterInner(IsRowMajor?row:col, IsRowMajor?col:row);\n    }\n\n    /** \\internal\n      * \\sa insertBack, startVec */\n    inline Scalar& insertBackByOuterInner(Index outer, Index inner)\n    {\n      eigen_assert(size_t(m_outerIndex[outer+1]) == m_data.size() && \"Invalid ordered insertion (invalid outer index)\");\n      eigen_assert( (m_outerIndex[outer+1]-m_outerIndex[outer]==0 || m_data.index(m_data.size()-1)<inner) && \"Invalid ordered insertion (invalid inner index)\");\n      Index p = m_outerIndex[outer+1];\n      ++m_outerIndex[outer+1];\n      m_data.append(0, inner);\n      return m_data.value(p);\n    }\n\n    /** \\internal\n      * \\warning use it only if you know what you are doing */\n    inline Scalar& insertBackByOuterInnerUnordered(Index outer, Index inner)\n    {\n      Index p = m_outerIndex[outer+1];\n      ++m_outerIndex[outer+1];\n      m_data.append(0, inner);\n      return m_data.value(p);\n    }\n\n    /** \\internal\n      * \\sa insertBack, insertBackByOuterInner */\n    inline void startVec(Index outer)\n    {\n      eigen_assert(m_outerIndex[outer]==Index(m_data.size()) && \"You must call startVec for each inner vector sequentially\");\n      eigen_assert(m_outerIndex[outer+1]==0 && \"You must call startVec for each inner vector sequentially\");\n      m_outerIndex[outer+1] = m_outerIndex[outer];\n    }\n\n    /** \\internal\n      * Must be called after inserting a set of non zero entries using the low level compressed API.\n      */\n    inline void finalize()\n    {\n      if(isCompressed())\n      {\n        Index size = static_cast<Index>(m_data.size());\n        Index i = m_outerSize;\n        // find the last filled column\n        while (i>=0 && m_outerIndex[i]==0)\n          --i;\n        ++i;\n        while (i<=m_outerSize)\n        {\n          m_outerIndex[i] = size;\n          ++i;\n        }\n      }\n    }\n\n    //---\n\n    template<typename InputIterators>\n    void setFromTriplets(const InputIterators& begin, const InputIterators& end);\n\n    void sumupDuplicates();\n\n    //---\n    \n    /** \\internal\n      * same as insert(Index,Index) except that the indices are given relative to the storage order */\n    Scalar& insertByOuterInner(Index j, Index i)\n    {\n      return insert(IsRowMajor ? j : i, IsRowMajor ? i : j);\n    }\n\n    /** Turns the matrix into the \\em compressed format.\n      */\n    void makeCompressed()\n    {\n      if(isCompressed())\n        return;\n      \n      Index oldStart = m_outerIndex[1];\n      m_outerIndex[1] = m_innerNonZeros[0];\n      for(Index j=1; j<m_outerSize; ++j)\n      {\n        Index nextOldStart = m_outerIndex[j+1];\n        Index offset = oldStart - m_outerIndex[j];\n        if(offset>0)\n        {\n          for(Index k=0; k<m_innerNonZeros[j]; ++k)\n          {\n            m_data.index(m_outerIndex[j]+k) = m_data.index(oldStart+k);\n            m_data.value(m_outerIndex[j]+k) = m_data.value(oldStart+k);\n          }\n        }\n        m_outerIndex[j+1] = m_outerIndex[j] + m_innerNonZeros[j];\n        oldStart = nextOldStart;\n      }\n      std::free(m_innerNonZeros);\n      m_innerNonZeros = 0;\n      m_data.resize(m_outerIndex[m_outerSize]);\n      m_data.squeeze();\n    }\n\n    /** Turns the matrix into the uncompressed mode */\n    void uncompress()\n    {\n      if(m_innerNonZeros != 0)\n        return; \n      m_innerNonZeros = static_cast<Index*>(std::malloc(m_outerSize * sizeof(Index)));\n      for (Index i = 0; i < m_outerSize; i++)\n      {\n        m_innerNonZeros[i] = m_outerIndex[i+1] - m_outerIndex[i]; \n      }\n    }\n    \n    /** Suppresses all nonzeros which are \\b much \\b smaller \\b than \\a reference under the tolerence \\a epsilon */\n    void prune(const Scalar& reference, const RealScalar& epsilon = NumTraits<RealScalar>::dummy_precision())\n    {\n      prune(default_prunning_func(reference,epsilon));\n    }\n    \n    /** Turns the matrix into compressed format, and suppresses all nonzeros which do not satisfy the predicate \\a keep.\n      * The functor type \\a KeepFunc must implement the following function:\n      * \\code\n      * bool operator() (const Index& row, const Index& col, const Scalar& value) const;\n      * \\endcode\n      * \\sa prune(Scalar,RealScalar)\n      */\n    template<typename KeepFunc>\n    void prune(const KeepFunc& keep = KeepFunc())\n    {\n      // TODO optimize the uncompressed mode to avoid moving and allocating the data twice\n      // TODO also implement a unit test\n      makeCompressed();\n\n      Index k = 0;\n      for(Index j=0; j<m_outerSize; ++j)\n      {\n        Index previousStart = m_outerIndex[j];\n        m_outerIndex[j] = k;\n        Index end = m_outerIndex[j+1];\n        for(Index i=previousStart; i<end; ++i)\n        {\n          if(keep(IsRowMajor?j:m_data.index(i), IsRowMajor?m_data.index(i):j, m_data.value(i)))\n          {\n            m_data.value(k) = m_data.value(i);\n            m_data.index(k) = m_data.index(i);\n            ++k;\n          }\n        }\n      }\n      m_outerIndex[m_outerSize] = k;\n      m_data.resize(k,0);\n    }\n\n    /** Resizes the matrix to a \\a rows x \\a cols matrix leaving old values untouched.\n      * \\sa resizeNonZeros(Index), reserve(), setZero()\n      */\n    void conservativeResize(Index rows, Index cols) \n    {\n      // No change\n      if (this->rows() == rows && this->cols() == cols) return;\n      \n      // If one dimension is null, then there is nothing to be preserved\n      if(rows==0 || cols==0) return resize(rows,cols);\n\n      Index innerChange = IsRowMajor ? cols - this->cols() : rows - this->rows();\n      Index outerChange = IsRowMajor ? rows - this->rows() : cols - this->cols();\n      Index newInnerSize = IsRowMajor ? cols : rows;\n\n      // Deals with inner non zeros\n      if (m_innerNonZeros)\n      {\n        // Resize m_innerNonZeros\n        Index *newInnerNonZeros = static_cast<Index*>(std::realloc(m_innerNonZeros, (m_outerSize + outerChange) * sizeof(Index)));\n        if (!newInnerNonZeros) internal::throw_std_bad_alloc();\n        m_innerNonZeros = newInnerNonZeros;\n        \n        for(Index i=m_outerSize; i<m_outerSize+outerChange; i++)          \n          m_innerNonZeros[i] = 0;\n      } \n      else if (innerChange < 0) \n      {\n        // Inner size decreased: allocate a new m_innerNonZeros\n        m_innerNonZeros = static_cast<Index*>(std::malloc((m_outerSize+outerChange+1) * sizeof(Index)));\n        if (!m_innerNonZeros) internal::throw_std_bad_alloc();\n        for(Index i = 0; i < m_outerSize; i++)\n          m_innerNonZeros[i] = m_outerIndex[i+1] - m_outerIndex[i];\n      }\n      \n      // Change the m_innerNonZeros in case of a decrease of inner size\n      if (m_innerNonZeros && innerChange < 0)\n      {\n        for(Index i = 0; i < m_outerSize + (std::min)(outerChange, Index(0)); i++)\n        {\n          Index &n = m_innerNonZeros[i];\n          Index start = m_outerIndex[i];\n          while (n > 0 && m_data.index(start+n-1) >= newInnerSize) --n; \n        }\n      }\n      \n      m_innerSize = newInnerSize;\n\n      // Re-allocate outer index structure if necessary\n      if (outerChange == 0)\n        return;\n          \n      Index *newOuterIndex = static_cast<Index*>(std::realloc(m_outerIndex, (m_outerSize + outerChange + 1) * sizeof(Index)));\n      if (!newOuterIndex) internal::throw_std_bad_alloc();\n      m_outerIndex = newOuterIndex;\n      if (outerChange > 0)\n      {\n        Index last = m_outerSize == 0 ? 0 : m_outerIndex[m_outerSize];\n        for(Index i=m_outerSize; i<m_outerSize+outerChange+1; i++)          \n          m_outerIndex[i] = last; \n      }\n      m_outerSize += outerChange;\n    }\n    \n    /** Resizes the matrix to a \\a rows x \\a cols matrix and initializes it to zero.\n      * \\sa resizeNonZeros(Index), reserve(), setZero()\n      */\n    void resize(Index rows, Index cols)\n    {\n      const Index outerSize = IsRowMajor ? rows : cols;\n      m_innerSize = IsRowMajor ? cols : rows;\n      m_data.clear();\n      if (m_outerSize != outerSize || m_outerSize==0)\n      {\n        std::free(m_outerIndex);\n        m_outerIndex = static_cast<Index*>(std::malloc((outerSize + 1) * sizeof(Index)));\n        if (!m_outerIndex) internal::throw_std_bad_alloc();\n        \n        m_outerSize = outerSize;\n      }\n      if(m_innerNonZeros)\n      {\n        std::free(m_innerNonZeros);\n        m_innerNonZeros = 0;\n      }\n      memset(m_outerIndex, 0, (m_outerSize+1)*sizeof(Index));\n    }\n\n    /** \\internal\n      * Resize the nonzero vector to \\a size */\n    void resizeNonZeros(Index size)\n    {\n      // TODO remove this function\n      m_data.resize(size);\n    }\n\n    /** \\returns a const expression of the diagonal coefficients */\n    const Diagonal<const SparseMatrix> diagonal() const { return *this; }\n\n    /** Default constructor yielding an empty \\c 0 \\c x \\c 0 matrix */\n    inline SparseMatrix()\n      : m_outerSize(-1), m_innerSize(0), m_outerIndex(0), m_innerNonZeros(0)\n    {\n      check_template_parameters();\n      resize(0, 0);\n    }\n\n    /** Constructs a \\a rows \\c x \\a cols empty matrix */\n    inline SparseMatrix(Index rows, Index cols)\n      : m_outerSize(0), m_innerSize(0), m_outerIndex(0), m_innerNonZeros(0)\n    {\n      check_template_parameters();\n      resize(rows, cols);\n    }\n\n    /** Constructs a sparse matrix from the sparse expression \\a other */\n    template<typename OtherDerived>\n    inline SparseMatrix(const SparseMatrixBase<OtherDerived>& other)\n      : m_outerSize(0), m_innerSize(0), m_outerIndex(0), m_innerNonZeros(0)\n    {\n      EIGEN_STATIC_ASSERT((internal::is_same<Scalar, typename OtherDerived::Scalar>::value),\n        YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)\n      check_template_parameters();\n      *this = other.derived();\n    }\n    \n    /** Constructs a sparse matrix from the sparse selfadjoint view \\a other */\n    template<typename OtherDerived, unsigned int UpLo>\n    inline SparseMatrix(const SparseSelfAdjointView<OtherDerived, UpLo>& other)\n      : m_outerSize(0), m_innerSize(0), m_outerIndex(0), m_innerNonZeros(0)\n    {\n      check_template_parameters();\n      *this = other;\n    }\n\n    /** Copy constructor (it performs a deep copy) */\n    inline SparseMatrix(const SparseMatrix& other)\n      : Base(), m_outerSize(0), m_innerSize(0), m_outerIndex(0), m_innerNonZeros(0)\n    {\n      check_template_parameters();\n      *this = other.derived();\n    }\n\n    /** \\brief Copy constructor with in-place evaluation */\n    template<typename OtherDerived>\n    SparseMatrix(const ReturnByValue<OtherDerived>& other)\n      : Base(), m_outerSize(0), m_innerSize(0), m_outerIndex(0), m_innerNonZeros(0)\n    {\n      check_template_parameters();\n      initAssignment(other);\n      other.evalTo(*this);\n    }\n\n    /** Swaps the content of two sparse matrices of the same type.\n      * This is a fast operation that simply swaps the underlying pointers and parameters. */\n    inline void swap(SparseMatrix& other)\n    {\n      //EIGEN_DBG_SPARSE(std::cout << \"SparseMatrix:: swap\\n\");\n      std::swap(m_outerIndex, other.m_outerIndex);\n      std::swap(m_innerSize, other.m_innerSize);\n      std::swap(m_outerSize, other.m_outerSize);\n      std::swap(m_innerNonZeros, other.m_innerNonZeros);\n      m_data.swap(other.m_data);\n    }\n\n    /** Sets *this to the identity matrix.\n      * This function also turns the matrix into compressed mode, and drop any reserved memory. */\n    inline void setIdentity()\n    {\n      eigen_assert(rows() == cols() && \"ONLY FOR SQUARED MATRICES\");\n      this->m_data.resize(rows());\n      Eigen::Map<Matrix<Index, Dynamic, 1> >(this->m_data.indexPtr(), rows()).setLinSpaced(0, rows()-1);\n      Eigen::Map<Matrix<Scalar, Dynamic, 1> >(this->m_data.valuePtr(), rows()).setOnes();\n      Eigen::Map<Matrix<Index, Dynamic, 1> >(this->m_outerIndex, rows()+1).setLinSpaced(0, rows());\n      std::free(m_innerNonZeros);\n      m_innerNonZeros = 0;\n    }\n    inline SparseMatrix& operator=(const SparseMatrix& other)\n    {\n      if (other.isRValue())\n      {\n        swap(other.const_cast_derived());\n      }\n      else if(this!=&other)\n      {\n        initAssignment(other);\n        if(other.isCompressed())\n        {\n          memcpy(m_outerIndex, other.m_outerIndex, (m_outerSize+1)*sizeof(Index));\n          m_data = other.m_data;\n        }\n        else\n        {\n          Base::operator=(other);\n        }\n      }\n      return *this;\n    }\n\n    #ifndef EIGEN_PARSED_BY_DOXYGEN\n    template<typename Lhs, typename Rhs>\n    inline SparseMatrix& operator=(const SparseSparseProduct<Lhs,Rhs>& product)\n    { return Base::operator=(product); }\n    \n    template<typename OtherDerived>\n    inline SparseMatrix& operator=(const ReturnByValue<OtherDerived>& other)\n    {\n      initAssignment(other);\n      return Base::operator=(other.derived());\n    }\n    \n    template<typename OtherDerived>\n    inline SparseMatrix& operator=(const EigenBase<OtherDerived>& other)\n    { return Base::operator=(other.derived()); }\n    #endif\n\n    template<typename OtherDerived>\n    EIGEN_DONT_INLINE SparseMatrix& operator=(const SparseMatrixBase<OtherDerived>& other);\n\n    friend std::ostream & operator << (std::ostream & s, const SparseMatrix& m)\n    {\n      EIGEN_DBG_SPARSE(\n        s << \"Nonzero entries:\\n\";\n        if(m.isCompressed())\n          for (Index i=0; i<m.nonZeros(); ++i)\n            s << \"(\" << m.m_data.value(i) << \",\" << m.m_data.index(i) << \") \";\n        else\n          for (Index i=0; i<m.outerSize(); ++i)\n          {\n            Index p = m.m_outerIndex[i];\n            Index pe = m.m_outerIndex[i]+m.m_innerNonZeros[i];\n            Index k=p;\n            for (; k<pe; ++k)\n              s << \"(\" << m.m_data.value(k) << \",\" << m.m_data.index(k) << \") \";\n            for (; k<m.m_outerIndex[i+1]; ++k)\n              s << \"(_,_) \";\n          }\n        s << std::endl;\n        s << std::endl;\n        s << \"Outer pointers:\\n\";\n        for (Index i=0; i<m.outerSize(); ++i)\n          s << m.m_outerIndex[i] << \" \";\n        s << \" $\" << std::endl;\n        if(!m.isCompressed())\n        {\n          s << \"Inner non zeros:\\n\";\n          for (Index i=0; i<m.outerSize(); ++i)\n            s << m.m_innerNonZeros[i] << \" \";\n          s << \" $\" << std::endl;\n        }\n        s << std::endl;\n      );\n      s << static_cast<const SparseMatrixBase<SparseMatrix>&>(m);\n      return s;\n    }\n\n    /** Destructor */\n    inline ~SparseMatrix()\n    {\n      std::free(m_outerIndex);\n      std::free(m_innerNonZeros);\n    }\n\n#ifndef EIGEN_PARSED_BY_DOXYGEN\n    /** Overloaded for performance */\n    Scalar sum() const;\n#endif\n    \n#   ifdef EIGEN_SPARSEMATRIX_PLUGIN\n#     include EIGEN_SPARSEMATRIX_PLUGIN\n#   endif\n\nprotected:\n\n    template<typename Other>\n    void initAssignment(const Other& other)\n    {\n      resize(other.rows(), other.cols());\n      if(m_innerNonZeros)\n      {\n        std::free(m_innerNonZeros);\n        m_innerNonZeros = 0;\n      }\n    }\n\n    /** \\internal\n      * \\sa insert(Index,Index) */\n    EIGEN_DONT_INLINE Scalar& insertCompressed(Index row, Index col);\n\n    /** \\internal\n      * A vector object that is equal to 0 everywhere but v at the position i */\n    class SingletonVector\n    {\n        Index m_index;\n        Index m_value;\n      public:\n        typedef Index value_type;\n        SingletonVector(Index i, Index v)\n          : m_index(i), m_value(v)\n        {}\n\n        Index operator[](Index i) const { return i==m_index ? m_value : 0; }\n    };\n\n    /** \\internal\n      * \\sa insert(Index,Index) */\n    EIGEN_DONT_INLINE Scalar& insertUncompressed(Index row, Index col);\n\npublic:\n    /** \\internal\n      * \\sa insert(Index,Index) */\n    EIGEN_STRONG_INLINE Scalar& insertBackUncompressed(Index row, Index col)\n    {\n      const Index outer = IsRowMajor ? row : col;\n      const Index inner = IsRowMajor ? col : row;\n\n      eigen_assert(!isCompressed());\n      eigen_assert(m_innerNonZeros[outer]<=(m_outerIndex[outer+1] - m_outerIndex[outer]));\n\n      Index p = m_outerIndex[outer] + m_innerNonZeros[outer]++;\n      m_data.index(p) = inner;\n      return (m_data.value(p) = 0);\n    }\n\nprivate:\n  static void check_template_parameters()\n  {\n    EIGEN_STATIC_ASSERT(NumTraits<Index>::IsSigned,THE_INDEX_TYPE_MUST_BE_A_SIGNED_TYPE);\n    EIGEN_STATIC_ASSERT((Options&(ColMajor|RowMajor))==Options,INVALID_MATRIX_TEMPLATE_PARAMETERS);\n  }\n\n  struct default_prunning_func {\n    default_prunning_func(const Scalar& ref, const RealScalar& eps) : reference(ref), epsilon(eps) {}\n    inline bool operator() (const Index&, const Index&, const Scalar& value) const\n    {\n      return !internal::isMuchSmallerThan(value, reference, epsilon);\n    }\n    Scalar reference;\n    RealScalar epsilon;\n  };\n};\n\ntemplate<typename Scalar, int _Options, typename _Index>\nclass SparseMatrix<Scalar,_Options,_Index>::InnerIterator\n{\n  public:\n    InnerIterator(const SparseMatrix& mat, Index outer)\n      : m_values(mat.valuePtr()), m_indices(mat.innerIndexPtr()), m_outer(outer), m_id(mat.m_outerIndex[outer])\n    {\n      if(mat.isCompressed())\n        m_end = mat.m_outerIndex[outer+1];\n      else\n        m_end = m_id + mat.m_innerNonZeros[outer];\n    }\n\n    inline InnerIterator& operator++() { m_id++; return *this; }\n\n    inline const Scalar& value() const { return m_values[m_id]; }\n    inline Scalar& valueRef() { return const_cast<Scalar&>(m_values[m_id]); }\n\n    inline Index index() const { return m_indices[m_id]; }\n    inline Index outer() const { return m_outer; }\n    inline Index row() const { return IsRowMajor ? m_outer : index(); }\n    inline Index col() const { return IsRowMajor ? index() : m_outer; }\n\n    inline operator bool() const { return (m_id < m_end); }\n\n  protected:\n    const Scalar* m_values;\n    const Index* m_indices;\n    const Index m_outer;\n    Index m_id;\n    Index m_end;\n};\n\ntemplate<typename Scalar, int _Options, typename _Index>\nclass SparseMatrix<Scalar,_Options,_Index>::ReverseInnerIterator\n{\n  public:\n    ReverseInnerIterator(const SparseMatrix& mat, Index outer)\n      : m_values(mat.valuePtr()), m_indices(mat.innerIndexPtr()), m_outer(outer), m_start(mat.m_outerIndex[outer])\n    {\n      if(mat.isCompressed())\n        m_id = mat.m_outerIndex[outer+1];\n      else\n        m_id = m_start + mat.m_innerNonZeros[outer];\n    }\n\n    inline ReverseInnerIterator& operator--() { --m_id; return *this; }\n\n    inline const Scalar& value() const { return m_values[m_id-1]; }\n    inline Scalar& valueRef() { return const_cast<Scalar&>(m_values[m_id-1]); }\n\n    inline Index index() const { return m_indices[m_id-1]; }\n    inline Index outer() const { return m_outer; }\n    inline Index row() const { return IsRowMajor ? m_outer : index(); }\n    inline Index col() const { return IsRowMajor ? index() : m_outer; }\n\n    inline operator bool() const { return (m_id > m_start); }\n\n  protected:\n    const Scalar* m_values;\n    const Index* m_indices;\n    const Index m_outer;\n    Index m_id;\n    const Index m_start;\n};\n\nnamespace internal {\n\ntemplate<typename InputIterator, typename SparseMatrixType>\nvoid set_from_triplets(const InputIterator& begin, const InputIterator& end, SparseMatrixType& mat, int Options = 0)\n{\n  EIGEN_UNUSED_VARIABLE(Options);\n  enum { IsRowMajor = SparseMatrixType::IsRowMajor };\n  typedef typename SparseMatrixType::Scalar Scalar;\n  typedef typename SparseMatrixType::Index Index;\n  SparseMatrix<Scalar,IsRowMajor?ColMajor:RowMajor,Index> trMat(mat.rows(),mat.cols());\n\n  if(begin!=end)\n  {\n    // pass 1: count the nnz per inner-vector\n    Matrix<Index,Dynamic,1> wi(trMat.outerSize());\n    wi.setZero();\n    for(InputIterator it(begin); it!=end; ++it)\n    {\n      eigen_assert(it->row()>=0 && it->row()<mat.rows() && it->col()>=0 && it->col()<mat.cols());\n      wi(IsRowMajor ? it->col() : it->row())++;\n    }\n\n    // pass 2: insert all the elements into trMat\n    trMat.reserve(wi);\n    for(InputIterator it(begin); it!=end; ++it)\n      trMat.insertBackUncompressed(it->row(),it->col()) = it->value();\n\n    // pass 3:\n    trMat.sumupDuplicates();\n  }\n\n  // pass 4: transposed copy -> implicit sorting\n  mat = trMat;\n}\n\n}\n\n\n/** Fill the matrix \\c *this with the list of \\em triplets defined by the iterator range \\a begin - \\a end.\n  *\n  * A \\em triplet is a tuple (i,j,value) defining a non-zero element.\n  * The input list of triplets does not have to be sorted, and can contains duplicated elements.\n  * In any case, the result is a \\b sorted and \\b compressed sparse matrix where the duplicates have been summed up.\n  * This is a \\em O(n) operation, with \\em n the number of triplet elements.\n  * The initial contents of \\c *this is destroyed.\n  * The matrix \\c *this must be properly resized beforehand using the SparseMatrix(Index,Index) constructor,\n  * or the resize(Index,Index) method. The sizes are not extracted from the triplet list.\n  *\n  * The \\a InputIterators value_type must provide the following interface:\n  * \\code\n  * Scalar value() const; // the value\n  * Scalar row() const;   // the row index i\n  * Scalar col() const;   // the column index j\n  * \\endcode\n  * See for instance the Eigen::Triplet template class.\n  *\n  * Here is a typical usage example:\n  * \\code\n    typedef Triplet<double> T;\n    std::vector<T> tripletList;\n    triplets.reserve(estimation_of_entries);\n    for(...)\n    {\n      // ...\n      tripletList.push_back(T(i,j,v_ij));\n    }\n    SparseMatrixType m(rows,cols);\n    m.setFromTriplets(tripletList.begin(), tripletList.end());\n    // m is ready to go!\n  * \\endcode\n  *\n  * \\warning The list of triplets is read multiple times (at least twice). Therefore, it is not recommended to define\n  * an abstract iterator over a complex data-structure that would be expensive to evaluate. The triplets should rather\n  * be explicitely stored into a std::vector for instance.\n  */\ntemplate<typename Scalar, int _Options, typename _Index>\ntemplate<typename InputIterators>\nvoid SparseMatrix<Scalar,_Options,_Index>::setFromTriplets(const InputIterators& begin, const InputIterators& end)\n{\n  internal::set_from_triplets(begin, end, *this);\n}\n\n/** \\internal */\ntemplate<typename Scalar, int _Options, typename _Index>\nvoid SparseMatrix<Scalar,_Options,_Index>::sumupDuplicates()\n{\n  eigen_assert(!isCompressed());\n  // TODO, in practice we should be able to use m_innerNonZeros for that task\n  Matrix<Index,Dynamic,1> wi(innerSize());\n  wi.fill(-1);\n  Index count = 0;\n  // for each inner-vector, wi[inner_index] will hold the position of first element into the index/value buffers\n  for(Index j=0; j<outerSize(); ++j)\n  {\n    Index start   = count;\n    Index oldEnd  = m_outerIndex[j]+m_innerNonZeros[j];\n    for(Index k=m_outerIndex[j]; k<oldEnd; ++k)\n    {\n      Index i = m_data.index(k);\n      if(wi(i)>=start)\n      {\n        // we already meet this entry => accumulate it\n        m_data.value(wi(i)) += m_data.value(k);\n      }\n      else\n      {\n        m_data.value(count) = m_data.value(k);\n        m_data.index(count) = m_data.index(k);\n        wi(i) = count;\n        ++count;\n      }\n    }\n    m_outerIndex[j] = start;\n  }\n  m_outerIndex[m_outerSize] = count;\n\n  // turn the matrix into compressed form\n  std::free(m_innerNonZeros);\n  m_innerNonZeros = 0;\n  m_data.resize(m_outerIndex[m_outerSize]);\n}\n\ntemplate<typename Scalar, int _Options, typename _Index>\ntemplate<typename OtherDerived>\nEIGEN_DONT_INLINE SparseMatrix<Scalar,_Options,_Index>& SparseMatrix<Scalar,_Options,_Index>::operator=(const SparseMatrixBase<OtherDerived>& other)\n{\n  EIGEN_STATIC_ASSERT((internal::is_same<Scalar, typename OtherDerived::Scalar>::value),\n        YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)\n  \n  const bool needToTranspose = (Flags & RowMajorBit) != (OtherDerived::Flags & RowMajorBit);\n  if (needToTranspose)\n  {\n    // two passes algorithm:\n    //  1 - compute the number of coeffs per dest inner vector\n    //  2 - do the actual copy/eval\n    // Since each coeff of the rhs has to be evaluated twice, let's evaluate it if needed\n    typedef typename internal::nested<OtherDerived,2>::type OtherCopy;\n    typedef typename internal::remove_all<OtherCopy>::type _OtherCopy;\n    OtherCopy otherCopy(other.derived());\n\n    SparseMatrix dest(other.rows(),other.cols());\n    Eigen::Map<Matrix<Index, Dynamic, 1> > (dest.m_outerIndex,dest.outerSize()).setZero();\n\n    // pass 1\n    // FIXME the above copy could be merged with that pass\n    for (Index j=0; j<otherCopy.outerSize(); ++j)\n      for (typename _OtherCopy::InnerIterator it(otherCopy, j); it; ++it)\n        ++dest.m_outerIndex[it.index()];\n\n    // prefix sum\n    Index count = 0;\n    Matrix<Index,Dynamic,1> positions(dest.outerSize());\n    for (Index j=0; j<dest.outerSize(); ++j)\n    {\n      Index tmp = dest.m_outerIndex[j];\n      dest.m_outerIndex[j] = count;\n      positions[j] = count;\n      count += tmp;\n    }\n    dest.m_outerIndex[dest.outerSize()] = count;\n    // alloc\n    dest.m_data.resize(count);\n    // pass 2\n    for (Index j=0; j<otherCopy.outerSize(); ++j)\n    {\n      for (typename _OtherCopy::InnerIterator it(otherCopy, j); it; ++it)\n      {\n        Index pos = positions[it.index()]++;\n        dest.m_data.index(pos) = j;\n        dest.m_data.value(pos) = it.value();\n      }\n    }\n    this->swap(dest);\n    return *this;\n  }\n  else\n  {\n    if(other.isRValue())\n      initAssignment(other.derived());\n    // there is no special optimization\n    return Base::operator=(other.derived());\n  }\n}\n\ntemplate<typename _Scalar, int _Options, typename _Index>\nEIGEN_DONT_INLINE typename SparseMatrix<_Scalar,_Options,_Index>::Scalar& SparseMatrix<_Scalar,_Options,_Index>::insertUncompressed(Index row, Index col)\n{\n  eigen_assert(!isCompressed());\n\n  const Index outer = IsRowMajor ? row : col;\n  const Index inner = IsRowMajor ? col : row;\n\n  Index room = m_outerIndex[outer+1] - m_outerIndex[outer];\n  Index innerNNZ = m_innerNonZeros[outer];\n  if(innerNNZ>=room)\n  {\n    // this inner vector is full, we need to reallocate the whole buffer :(\n    reserve(SingletonVector(outer,std::max<Index>(2,innerNNZ)));\n  }\n\n  Index startId = m_outerIndex[outer];\n  Index p = startId + m_innerNonZeros[outer];\n  while ( (p > startId) && (m_data.index(p-1) > inner) )\n  {\n    m_data.index(p) = m_data.index(p-1);\n    m_data.value(p) = m_data.value(p-1);\n    --p;\n  }\n  eigen_assert((p<=startId || m_data.index(p-1)!=inner) && \"you cannot insert an element that already exist, you must call coeffRef to this end\");\n\n  m_innerNonZeros[outer]++;\n\n  m_data.index(p) = inner;\n  return (m_data.value(p) = 0);\n}\n\ntemplate<typename _Scalar, int _Options, typename _Index>\nEIGEN_DONT_INLINE typename SparseMatrix<_Scalar,_Options,_Index>::Scalar& SparseMatrix<_Scalar,_Options,_Index>::insertCompressed(Index row, Index col)\n{\n  eigen_assert(isCompressed());\n\n  const Index outer = IsRowMajor ? row : col;\n  const Index inner = IsRowMajor ? col : row;\n\n  Index previousOuter = outer;\n  if (m_outerIndex[outer+1]==0)\n  {\n    // we start a new inner vector\n    while (previousOuter>=0 && m_outerIndex[previousOuter]==0)\n    {\n      m_outerIndex[previousOuter] = static_cast<Index>(m_data.size());\n      --previousOuter;\n    }\n    m_outerIndex[outer+1] = m_outerIndex[outer];\n  }\n\n  // here we have to handle the tricky case where the outerIndex array\n  // starts with: [ 0 0 0 0 0 1 ...] and we are inserted in, e.g.,\n  // the 2nd inner vector...\n  bool isLastVec = (!(previousOuter==-1 && m_data.size()!=0))\n                && (size_t(m_outerIndex[outer+1]) == m_data.size());\n\n  size_t startId = m_outerIndex[outer];\n  // FIXME let's make sure sizeof(long int) == sizeof(size_t)\n  size_t p = m_outerIndex[outer+1];\n  ++m_outerIndex[outer+1];\n\n  double reallocRatio = 1;\n  if (m_data.allocatedSize()<=m_data.size())\n  {\n    // if there is no preallocated memory, let's reserve a minimum of 32 elements\n    if (m_data.size()==0)\n    {\n      m_data.reserve(32);\n    }\n    else\n    {\n      // we need to reallocate the data, to reduce multiple reallocations\n      // we use a smart resize algorithm based on the current filling ratio\n      // in addition, we use double to avoid integers overflows\n      double nnzEstimate = double(m_outerIndex[outer])*double(m_outerSize)/double(outer+1);\n      reallocRatio = (nnzEstimate-double(m_data.size()))/double(m_data.size());\n      // furthermore we bound the realloc ratio to:\n      //   1) reduce multiple minor realloc when the matrix is almost filled\n      //   2) avoid to allocate too much memory when the matrix is almost empty\n      reallocRatio = (std::min)((std::max)(reallocRatio,1.5),8.);\n    }\n  }\n  m_data.resize(m_data.size()+1,reallocRatio);\n\n  if (!isLastVec)\n  {\n    if (previousOuter==-1)\n    {\n      // oops wrong guess.\n      // let's correct the outer offsets\n      for (Index k=0; k<=(outer+1); ++k)\n        m_outerIndex[k] = 0;\n      Index k=outer+1;\n      while(m_outerIndex[k]==0)\n        m_outerIndex[k++] = 1;\n      while (k<=m_outerSize && m_outerIndex[k]!=0)\n        m_outerIndex[k++]++;\n      p = 0;\n      --k;\n      k = m_outerIndex[k]-1;\n      while (k>0)\n      {\n        m_data.index(k) = m_data.index(k-1);\n        m_data.value(k) = m_data.value(k-1);\n        k--;\n      }\n    }\n    else\n    {\n      // we are not inserting into the last inner vec\n      // update outer indices:\n      Index j = outer+2;\n      while (j<=m_outerSize && m_outerIndex[j]!=0)\n        m_outerIndex[j++]++;\n      --j;\n      // shift data of last vecs:\n      Index k = m_outerIndex[j]-1;\n      while (k>=Index(p))\n      {\n        m_data.index(k) = m_data.index(k-1);\n        m_data.value(k) = m_data.value(k-1);\n        k--;\n      }\n    }\n  }\n\n  while ( (p > startId) && (m_data.index(p-1) > inner) )\n  {\n    m_data.index(p) = m_data.index(p-1);\n    m_data.value(p) = m_data.value(p-1);\n    --p;\n  }\n\n  m_data.index(p) = inner;\n  return (m_data.value(p) = 0);\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_SPARSEMATRIX_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseCore/SparseMatrixBase.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2011 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SPARSEMATRIXBASE_H\n#define EIGEN_SPARSEMATRIXBASE_H\n\nnamespace Eigen { \n\n/** \\ingroup SparseCore_Module\n  *\n  * \\class SparseMatrixBase\n  *\n  * \\brief Base class of any sparse matrices or sparse expressions\n  *\n  * \\tparam Derived\n  *\n  * This class can be extended with the help of the plugin mechanism described on the page\n  * \\ref TopicCustomizingEigen by defining the preprocessor symbol \\c EIGEN_SPARSEMATRIXBASE_PLUGIN.\n  */\ntemplate<typename Derived> class SparseMatrixBase\n#ifndef EIGEN_PARSED_BY_DOXYGEN\n  : public internal::special_scalar_op_base<Derived,typename internal::traits<Derived>::Scalar,\n                                            typename NumTraits<typename internal::traits<Derived>::Scalar>::Real,\n                                            EigenBase<Derived> >\n#else\n  : public EigenBase<Derived>\n#endif // not EIGEN_PARSED_BY_DOXYGEN\n{\n  public:\n\n    typedef typename internal::traits<Derived>::Scalar Scalar;\n    typedef typename internal::packet_traits<Scalar>::type PacketScalar;\n    typedef typename internal::traits<Derived>::StorageKind StorageKind;\n    typedef typename internal::traits<Derived>::Index Index;\n    typedef typename internal::traits<Derived>::Index StorageIndex;\n    typedef typename internal::add_const_on_value_type_if_arithmetic<\n                         typename internal::packet_traits<Scalar>::type\n                     >::type PacketReturnType;\n\n    typedef SparseMatrixBase StorageBaseType;\n    \n    template<typename OtherDerived>\n    Derived& operator=(const EigenBase<OtherDerived> &other)\n    {\n      other.derived().evalTo(derived());\n      return derived();\n    }\n\n    enum {\n\n      RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,\n        /**< The number of rows at compile-time. This is just a copy of the value provided\n          * by the \\a Derived type. If a value is not known at compile-time,\n          * it is set to the \\a Dynamic constant.\n          * \\sa MatrixBase::rows(), MatrixBase::cols(), ColsAtCompileTime, SizeAtCompileTime */\n\n      ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,\n        /**< The number of columns at compile-time. This is just a copy of the value provided\n          * by the \\a Derived type. If a value is not known at compile-time,\n          * it is set to the \\a Dynamic constant.\n          * \\sa MatrixBase::rows(), MatrixBase::cols(), RowsAtCompileTime, SizeAtCompileTime */\n\n\n      SizeAtCompileTime = (internal::size_at_compile_time<internal::traits<Derived>::RowsAtCompileTime,\n                                                   internal::traits<Derived>::ColsAtCompileTime>::ret),\n        /**< This is equal to the number of coefficients, i.e. the number of\n          * rows times the number of columns, or to \\a Dynamic if this is not\n          * known at compile-time. \\sa RowsAtCompileTime, ColsAtCompileTime */\n\n      MaxRowsAtCompileTime = RowsAtCompileTime,\n      MaxColsAtCompileTime = ColsAtCompileTime,\n\n      MaxSizeAtCompileTime = (internal::size_at_compile_time<MaxRowsAtCompileTime,\n                                                      MaxColsAtCompileTime>::ret),\n\n      IsVectorAtCompileTime = RowsAtCompileTime == 1 || ColsAtCompileTime == 1,\n        /**< This is set to true if either the number of rows or the number of\n          * columns is known at compile-time to be equal to 1. Indeed, in that case,\n          * we are dealing with a column-vector (if there is only one column) or with\n          * a row-vector (if there is only one row). */\n\n      Flags = internal::traits<Derived>::Flags,\n        /**< This stores expression \\ref flags flags which may or may not be inherited by new expressions\n          * constructed from this one. See the \\ref flags \"list of flags\".\n          */\n\n      CoeffReadCost = internal::traits<Derived>::CoeffReadCost,\n        /**< This is a rough measure of how expensive it is to read one coefficient from\n          * this expression.\n          */\n\n      IsRowMajor = Flags&RowMajorBit ? 1 : 0,\n      \n      InnerSizeAtCompileTime = int(IsVectorAtCompileTime) ? int(SizeAtCompileTime)\n                             : int(IsRowMajor) ? int(ColsAtCompileTime) : int(RowsAtCompileTime),\n\n      #ifndef EIGEN_PARSED_BY_DOXYGEN\n      _HasDirectAccess = (int(Flags)&DirectAccessBit) ? 1 : 0 // workaround sunCC\n      #endif\n    };\n\n    /** \\internal the return type of MatrixBase::adjoint() */\n    typedef typename internal::conditional<NumTraits<Scalar>::IsComplex,\n                        CwiseUnaryOp<internal::scalar_conjugate_op<Scalar>, Eigen::Transpose<const Derived> >,\n                        Transpose<const Derived>\n                     >::type AdjointReturnType;\n\n\n    typedef SparseMatrix<Scalar, Flags&RowMajorBit ? RowMajor : ColMajor, Index> PlainObject;\n\n\n#ifndef EIGEN_PARSED_BY_DOXYGEN\n    /** This is the \"real scalar\" type; if the \\a Scalar type is already real numbers\n      * (e.g. int, float or double) then \\a RealScalar is just the same as \\a Scalar. If\n      * \\a Scalar is \\a std::complex<T> then RealScalar is \\a T.\n      *\n      * \\sa class NumTraits\n      */\n    typedef typename NumTraits<Scalar>::Real RealScalar;\n\n    /** \\internal the return type of coeff()\n      */\n    typedef typename internal::conditional<_HasDirectAccess, const Scalar&, Scalar>::type CoeffReturnType;\n\n    /** \\internal Represents a matrix with all coefficients equal to one another*/\n    typedef CwiseNullaryOp<internal::scalar_constant_op<Scalar>,Matrix<Scalar,Dynamic,Dynamic> > ConstantReturnType;\n\n    /** type of the equivalent square matrix */\n    typedef Matrix<Scalar,EIGEN_SIZE_MAX(RowsAtCompileTime,ColsAtCompileTime),\n                          EIGEN_SIZE_MAX(RowsAtCompileTime,ColsAtCompileTime)> SquareMatrixType;\n\n    inline const Derived& derived() const { return *static_cast<const Derived*>(this); }\n    inline Derived& derived() { return *static_cast<Derived*>(this); }\n    inline Derived& const_cast_derived() const\n    { return *static_cast<Derived*>(const_cast<SparseMatrixBase*>(this)); }\n\n    typedef internal::special_scalar_op_base<Derived, Scalar, RealScalar, EigenBase<Derived> > Base;\n    using Base::operator*;\n#endif // not EIGEN_PARSED_BY_DOXYGEN\n\n#define EIGEN_CURRENT_STORAGE_BASE_CLASS Eigen::SparseMatrixBase\n#   include \"../plugins/CommonCwiseUnaryOps.h\"\n#   include \"../plugins/CommonCwiseBinaryOps.h\"\n#   include \"../plugins/MatrixCwiseUnaryOps.h\"\n#   include \"../plugins/MatrixCwiseBinaryOps.h\"\n#   include \"../plugins/BlockMethods.h\"\n#   ifdef EIGEN_SPARSEMATRIXBASE_PLUGIN\n#     include EIGEN_SPARSEMATRIXBASE_PLUGIN\n#   endif\n#   undef EIGEN_CURRENT_STORAGE_BASE_CLASS\n#undef EIGEN_CURRENT_STORAGE_BASE_CLASS\n\n    /** \\returns the number of rows. \\sa cols() */\n    inline Index rows() const { return derived().rows(); }\n    /** \\returns the number of columns. \\sa rows() */\n    inline Index cols() const { return derived().cols(); }\n    /** \\returns the number of coefficients, which is \\a rows()*cols().\n      * \\sa rows(), cols(). */\n    inline Index size() const { return rows() * cols(); }\n    /** \\returns the number of nonzero coefficients which is in practice the number\n      * of stored coefficients. */\n    inline Index nonZeros() const { return derived().nonZeros(); }\n    /** \\returns true if either the number of rows or the number of columns is equal to 1.\n      * In other words, this function returns\n      * \\code rows()==1 || cols()==1 \\endcode\n      * \\sa rows(), cols(), IsVectorAtCompileTime. */\n    inline bool isVector() const { return rows()==1 || cols()==1; }\n    /** \\returns the size of the storage major dimension,\n      * i.e., the number of columns for a columns major matrix, and the number of rows otherwise */\n    Index outerSize() const { return (int(Flags)&RowMajorBit) ? this->rows() : this->cols(); }\n    /** \\returns the size of the inner dimension according to the storage order,\n      * i.e., the number of rows for a columns major matrix, and the number of cols otherwise */\n    Index innerSize() const { return (int(Flags)&RowMajorBit) ? this->cols() : this->rows(); }\n\n    bool isRValue() const { return m_isRValue; }\n    Derived& markAsRValue() { m_isRValue = true; return derived(); }\n\n    SparseMatrixBase() : m_isRValue(false) { /* TODO check flags */ }\n\n    \n    template<typename OtherDerived>\n    Derived& operator=(const ReturnByValue<OtherDerived>& other)\n    {\n      other.evalTo(derived());\n      return derived();\n    }\n\n\n    template<typename OtherDerived>\n    inline Derived& operator=(const SparseMatrixBase<OtherDerived>& other)\n    {\n      return assign(other.derived());\n    }\n\n    inline Derived& operator=(const Derived& other)\n    {\n//       if (other.isRValue())\n//         derived().swap(other.const_cast_derived());\n//       else\n      return assign(other.derived());\n    }\n\n  protected:\n\n    template<typename OtherDerived>\n    inline Derived& assign(const OtherDerived& other)\n    {\n      const bool transpose = (Flags & RowMajorBit) != (OtherDerived::Flags & RowMajorBit);\n      const Index outerSize = (int(OtherDerived::Flags) & RowMajorBit) ? other.rows() : other.cols();\n      if ((!transpose) && other.isRValue())\n      {\n        // eval without temporary\n        derived().resize(other.rows(), other.cols());\n        derived().setZero();\n        derived().reserve((std::max)(this->rows(),this->cols())*2);\n        for (Index j=0; j<outerSize; ++j)\n        {\n          derived().startVec(j);\n          for (typename OtherDerived::InnerIterator it(other, j); it; ++it)\n          {\n            Scalar v = it.value();\n            derived().insertBackByOuterInner(j,it.index()) = v;\n          }\n        }\n        derived().finalize();\n      }\n      else\n      {\n        assignGeneric(other);\n      }\n      return derived();\n    }\n\n    template<typename OtherDerived>\n    inline void assignGeneric(const OtherDerived& other)\n    {\n      //const bool transpose = (Flags & RowMajorBit) != (OtherDerived::Flags & RowMajorBit);\n      eigen_assert(( ((internal::traits<Derived>::SupportedAccessPatterns&OuterRandomAccessPattern)==OuterRandomAccessPattern) ||\n                  (!((Flags & RowMajorBit) != (OtherDerived::Flags & RowMajorBit)))) &&\n                  \"the transpose operation is supposed to be handled in SparseMatrix::operator=\");\n\n      enum { Flip = (Flags & RowMajorBit) != (OtherDerived::Flags & RowMajorBit) };\n\n      const Index outerSize = other.outerSize();\n      //typedef typename internal::conditional<transpose, LinkedVectorMatrix<Scalar,Flags&RowMajorBit>, Derived>::type TempType;\n      // thanks to shallow copies, we always eval to a tempary\n      Derived temp(other.rows(), other.cols());\n\n      temp.reserve((std::max)(this->rows(),this->cols())*2);\n      for (Index j=0; j<outerSize; ++j)\n      {\n        temp.startVec(j);\n        for (typename OtherDerived::InnerIterator it(other.derived(), j); it; ++it)\n        {\n          Scalar v = it.value();\n          temp.insertBackByOuterInner(Flip?it.index():j,Flip?j:it.index()) = v;\n        }\n      }\n      temp.finalize();\n\n      derived() = temp.markAsRValue();\n    }\n\n  public:\n\n    template<typename Lhs, typename Rhs>\n    inline Derived& operator=(const SparseSparseProduct<Lhs,Rhs>& product);\n\n    friend std::ostream & operator << (std::ostream & s, const SparseMatrixBase& m)\n    {\n      typedef typename Derived::Nested Nested;\n      typedef typename internal::remove_all<Nested>::type NestedCleaned;\n\n      if (Flags&RowMajorBit)\n      {\n        const Nested nm(m.derived());\n        for (Index row=0; row<nm.outerSize(); ++row)\n        {\n          Index col = 0;\n          for (typename NestedCleaned::InnerIterator it(nm.derived(), row); it; ++it)\n          {\n            for ( ; col<it.index(); ++col)\n              s << \"0 \";\n            s << it.value() << \" \";\n            ++col;\n          }\n          for ( ; col<m.cols(); ++col)\n            s << \"0 \";\n          s << std::endl;\n        }\n      }\n      else\n      {\n        const Nested nm(m.derived());\n        if (m.cols() == 1) {\n          Index row = 0;\n          for (typename NestedCleaned::InnerIterator it(nm.derived(), 0); it; ++it)\n          {\n            for ( ; row<it.index(); ++row)\n              s << \"0\" << std::endl;\n            s << it.value() << std::endl;\n            ++row;\n          }\n          for ( ; row<m.rows(); ++row)\n            s << \"0\" << std::endl;\n        }\n        else\n        {\n          SparseMatrix<Scalar, RowMajorBit, Index> trans = m;\n          s << static_cast<const SparseMatrixBase<SparseMatrix<Scalar, RowMajorBit, Index> >&>(trans);\n        }\n      }\n      return s;\n    }\n\n    template<typename OtherDerived>\n    Derived& operator+=(const SparseMatrixBase<OtherDerived>& other);\n    template<typename OtherDerived>\n    Derived& operator-=(const SparseMatrixBase<OtherDerived>& other);\n\n    Derived& operator*=(const Scalar& other);\n    Derived& operator/=(const Scalar& other);\n\n    template<typename OtherDerived> struct CwiseProductDenseReturnType {\n      typedef CwiseBinaryOp<internal::scalar_product_op<typename internal::scalar_product_traits<\n                                                          typename internal::traits<Derived>::Scalar,\n                                                          typename internal::traits<OtherDerived>::Scalar\n                                                        >::ReturnType>,\n                            const Derived,\n                            const OtherDerived\n                          > Type;\n    };\n\n    template<typename OtherDerived>\n    EIGEN_STRONG_INLINE const typename CwiseProductDenseReturnType<OtherDerived>::Type\n    cwiseProduct(const MatrixBase<OtherDerived> &other) const;\n\n    // sparse * sparse\n    template<typename OtherDerived>\n    const typename SparseSparseProductReturnType<Derived,OtherDerived>::Type\n    operator*(const SparseMatrixBase<OtherDerived> &other) const;\n\n    // sparse * diagonal\n    template<typename OtherDerived>\n    const SparseDiagonalProduct<Derived,OtherDerived>\n    operator*(const DiagonalBase<OtherDerived> &other) const;\n\n    // diagonal * sparse\n    template<typename OtherDerived> friend\n    const SparseDiagonalProduct<OtherDerived,Derived>\n    operator*(const DiagonalBase<OtherDerived> &lhs, const SparseMatrixBase& rhs)\n    { return SparseDiagonalProduct<OtherDerived,Derived>(lhs.derived(), rhs.derived()); }\n\n    /** dense * sparse (return a dense object unless it is an outer product) */\n    template<typename OtherDerived> friend\n    const typename DenseSparseProductReturnType<OtherDerived,Derived>::Type\n    operator*(const MatrixBase<OtherDerived>& lhs, const Derived& rhs)\n    { return typename DenseSparseProductReturnType<OtherDerived,Derived>::Type(lhs.derived(),rhs); }\n\n    /** sparse * dense (returns a dense object unless it is an outer product) */\n    template<typename OtherDerived>\n    const typename SparseDenseProductReturnType<Derived,OtherDerived>::Type\n    operator*(const MatrixBase<OtherDerived> &other) const\n    { return typename SparseDenseProductReturnType<Derived,OtherDerived>::Type(derived(), other.derived()); }\n    \n     /** \\returns an expression of P H P^-1 where H is the matrix represented by \\c *this */\n    SparseSymmetricPermutationProduct<Derived,Upper|Lower> twistedBy(const PermutationMatrix<Dynamic,Dynamic,Index>& perm) const\n    {\n      return SparseSymmetricPermutationProduct<Derived,Upper|Lower>(derived(), perm);\n    }\n\n    template<typename OtherDerived>\n    Derived& operator*=(const SparseMatrixBase<OtherDerived>& other);\n\n    #ifdef EIGEN2_SUPPORT\n    // deprecated\n    template<typename OtherDerived>\n    typename internal::plain_matrix_type_column_major<OtherDerived>::type\n    solveTriangular(const MatrixBase<OtherDerived>& other) const;\n\n    // deprecated\n    template<typename OtherDerived>\n    void solveTriangularInPlace(MatrixBase<OtherDerived>& other) const;\n    #endif // EIGEN2_SUPPORT\n\n    template<int Mode>\n    inline const SparseTriangularView<Derived, Mode> triangularView() const;\n\n    template<unsigned int UpLo> inline const SparseSelfAdjointView<Derived, UpLo> selfadjointView() const;\n    template<unsigned int UpLo> inline SparseSelfAdjointView<Derived, UpLo> selfadjointView();\n\n    template<typename OtherDerived> Scalar dot(const MatrixBase<OtherDerived>& other) const;\n    template<typename OtherDerived> Scalar dot(const SparseMatrixBase<OtherDerived>& other) const;\n    RealScalar squaredNorm() const;\n    RealScalar norm()  const;\n    RealScalar blueNorm() const;\n\n    Transpose<Derived> transpose() { return derived(); }\n    const Transpose<const Derived> transpose() const { return derived(); }\n    const AdjointReturnType adjoint() const { return transpose(); }\n\n    // inner-vector\n    typedef Block<Derived,IsRowMajor?1:Dynamic,IsRowMajor?Dynamic:1,true>       InnerVectorReturnType;\n    typedef Block<const Derived,IsRowMajor?1:Dynamic,IsRowMajor?Dynamic:1,true> ConstInnerVectorReturnType;\n    InnerVectorReturnType innerVector(Index outer);\n    const ConstInnerVectorReturnType innerVector(Index outer) const;\n\n    // set of inner-vectors\n    typedef Block<Derived,Dynamic,Dynamic,true> InnerVectorsReturnType;\n    typedef Block<const Derived,Dynamic,Dynamic,true> ConstInnerVectorsReturnType;\n    InnerVectorsReturnType innerVectors(Index outerStart, Index outerSize);\n    const ConstInnerVectorsReturnType innerVectors(Index outerStart, Index outerSize) const;\n\n    /** \\internal use operator= */\n    template<typename DenseDerived>\n    void evalTo(MatrixBase<DenseDerived>& dst) const\n    {\n      dst.setZero();\n      for (Index j=0; j<outerSize(); ++j)\n        for (typename Derived::InnerIterator i(derived(),j); i; ++i)\n          dst.coeffRef(i.row(),i.col()) = i.value();\n    }\n\n    Matrix<Scalar,RowsAtCompileTime,ColsAtCompileTime> toDense() const\n    {\n      return derived();\n    }\n\n    template<typename OtherDerived>\n    bool isApprox(const SparseMatrixBase<OtherDerived>& other,\n                  const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const\n    { return toDense().isApprox(other.toDense(),prec); }\n\n    template<typename OtherDerived>\n    bool isApprox(const MatrixBase<OtherDerived>& other,\n                  const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const\n    { return toDense().isApprox(other,prec); }\n\n    /** \\returns the matrix or vector obtained by evaluating this expression.\n      *\n      * Notice that in the case of a plain matrix or vector (not an expression) this function just returns\n      * a const reference, in order to avoid a useless copy.\n      */\n    inline const typename internal::eval<Derived>::type eval() const\n    { return typename internal::eval<Derived>::type(derived()); }\n\n    Scalar sum() const;\n\n  protected:\n\n    bool m_isRValue;\n};\n\n} // end namespace Eigen\n\n#endif // EIGEN_SPARSEMATRIXBASE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseCore/SparsePermutation.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SPARSE_PERMUTATION_H\n#define EIGEN_SPARSE_PERMUTATION_H\n\n// This file implements sparse * permutation products\n\nnamespace Eigen { \n\nnamespace internal {\n\ntemplate<typename PermutationType, typename MatrixType, int Side, bool Transposed>\nstruct traits<permut_sparsematrix_product_retval<PermutationType, MatrixType, Side, Transposed> >\n{\n  typedef typename remove_all<typename MatrixType::Nested>::type MatrixTypeNestedCleaned;\n  typedef typename MatrixTypeNestedCleaned::Scalar Scalar;\n  typedef typename MatrixTypeNestedCleaned::Index Index;\n  enum {\n    SrcStorageOrder = MatrixTypeNestedCleaned::Flags&RowMajorBit ? RowMajor : ColMajor,\n    MoveOuter = SrcStorageOrder==RowMajor ? Side==OnTheLeft : Side==OnTheRight\n  };\n\n  typedef typename internal::conditional<MoveOuter,\n        SparseMatrix<Scalar,SrcStorageOrder,Index>,\n        SparseMatrix<Scalar,int(SrcStorageOrder)==RowMajor?ColMajor:RowMajor,Index> >::type ReturnType;\n};\n\ntemplate<typename PermutationType, typename MatrixType, int Side, bool Transposed>\nstruct permut_sparsematrix_product_retval\n : public ReturnByValue<permut_sparsematrix_product_retval<PermutationType, MatrixType, Side, Transposed> >\n{\n    typedef typename remove_all<typename MatrixType::Nested>::type MatrixTypeNestedCleaned;\n    typedef typename MatrixTypeNestedCleaned::Scalar Scalar;\n    typedef typename MatrixTypeNestedCleaned::Index Index;\n\n    enum {\n      SrcStorageOrder = MatrixTypeNestedCleaned::Flags&RowMajorBit ? RowMajor : ColMajor,\n      MoveOuter = SrcStorageOrder==RowMajor ? Side==OnTheLeft : Side==OnTheRight\n    };\n\n    permut_sparsematrix_product_retval(const PermutationType& perm, const MatrixType& matrix)\n      : m_permutation(perm), m_matrix(matrix)\n    {}\n\n    inline int rows() const { return m_matrix.rows(); }\n    inline int cols() const { return m_matrix.cols(); }\n\n    template<typename Dest> inline void evalTo(Dest& dst) const\n    {\n      if(MoveOuter)\n      {\n        SparseMatrix<Scalar,SrcStorageOrder,Index> tmp(m_matrix.rows(), m_matrix.cols());\n        Matrix<Index,Dynamic,1> sizes(m_matrix.outerSize());\n        for(Index j=0; j<m_matrix.outerSize(); ++j)\n        {\n          Index jp = m_permutation.indices().coeff(j);\n          sizes[((Side==OnTheLeft) ^ Transposed) ? jp : j] = m_matrix.innerVector(((Side==OnTheRight) ^ Transposed) ? jp : j).nonZeros();\n        }\n        tmp.reserve(sizes);\n        for(Index j=0; j<m_matrix.outerSize(); ++j)\n        {\n          Index jp = m_permutation.indices().coeff(j);\n          Index jsrc = ((Side==OnTheRight) ^ Transposed) ? jp : j;\n          Index jdst = ((Side==OnTheLeft) ^ Transposed) ? jp : j;\n          for(typename MatrixTypeNestedCleaned::InnerIterator it(m_matrix,jsrc); it; ++it)\n            tmp.insertByOuterInner(jdst,it.index()) = it.value();\n        }\n        dst = tmp;\n      }\n      else\n      {\n        SparseMatrix<Scalar,int(SrcStorageOrder)==RowMajor?ColMajor:RowMajor,Index> tmp(m_matrix.rows(), m_matrix.cols());\n        Matrix<Index,Dynamic,1> sizes(tmp.outerSize());\n        sizes.setZero();\n        PermutationMatrix<Dynamic,Dynamic,Index> perm;\n        if((Side==OnTheLeft) ^ Transposed)\n          perm = m_permutation;\n        else\n          perm = m_permutation.transpose();\n\n        for(Index j=0; j<m_matrix.outerSize(); ++j)\n          for(typename MatrixTypeNestedCleaned::InnerIterator it(m_matrix,j); it; ++it)\n            sizes[perm.indices().coeff(it.index())]++;\n        tmp.reserve(sizes);\n        for(Index j=0; j<m_matrix.outerSize(); ++j)\n          for(typename MatrixTypeNestedCleaned::InnerIterator it(m_matrix,j); it; ++it)\n            tmp.insertByOuterInner(perm.indices().coeff(it.index()),j) = it.value();\n        dst = tmp;\n      }\n    }\n\n  protected:\n    const PermutationType& m_permutation;\n    typename MatrixType::Nested m_matrix;\n};\n\n}\n\n\n\n/** \\returns the matrix with the permutation applied to the columns\n  */\ntemplate<typename SparseDerived, typename PermDerived>\ninline const internal::permut_sparsematrix_product_retval<PermutationBase<PermDerived>, SparseDerived, OnTheRight, false>\noperator*(const SparseMatrixBase<SparseDerived>& matrix, const PermutationBase<PermDerived>& perm)\n{\n  return internal::permut_sparsematrix_product_retval<PermutationBase<PermDerived>, SparseDerived, OnTheRight, false>(perm, matrix.derived());\n}\n\n/** \\returns the matrix with the permutation applied to the rows\n  */\ntemplate<typename SparseDerived, typename PermDerived>\ninline const internal::permut_sparsematrix_product_retval<PermutationBase<PermDerived>, SparseDerived, OnTheLeft, false>\noperator*( const PermutationBase<PermDerived>& perm, const SparseMatrixBase<SparseDerived>& matrix)\n{\n  return internal::permut_sparsematrix_product_retval<PermutationBase<PermDerived>, SparseDerived, OnTheLeft, false>(perm, matrix.derived());\n}\n\n\n\n/** \\returns the matrix with the inverse permutation applied to the columns.\n  */\ntemplate<typename SparseDerived, typename PermDerived>\ninline const internal::permut_sparsematrix_product_retval<PermutationBase<PermDerived>, SparseDerived, OnTheRight, true>\noperator*(const SparseMatrixBase<SparseDerived>& matrix, const Transpose<PermutationBase<PermDerived> >& tperm)\n{\n  return internal::permut_sparsematrix_product_retval<PermutationBase<PermDerived>, SparseDerived, OnTheRight, true>(tperm.nestedPermutation(), matrix.derived());\n}\n\n/** \\returns the matrix with the inverse permutation applied to the rows.\n  */\ntemplate<typename SparseDerived, typename PermDerived>\ninline const internal::permut_sparsematrix_product_retval<PermutationBase<PermDerived>, SparseDerived, OnTheLeft, true>\noperator*(const Transpose<PermutationBase<PermDerived> >& tperm, const SparseMatrixBase<SparseDerived>& matrix)\n{\n  return internal::permut_sparsematrix_product_retval<PermutationBase<PermDerived>, SparseDerived, OnTheLeft, true>(tperm.nestedPermutation(), matrix.derived());\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_SPARSE_SELFADJOINTVIEW_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseCore/SparseProduct.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SPARSEPRODUCT_H\n#define EIGEN_SPARSEPRODUCT_H\n\nnamespace Eigen { \n\ntemplate<typename Lhs, typename Rhs>\nstruct SparseSparseProductReturnType\n{\n  typedef typename internal::traits<Lhs>::Scalar Scalar;\n  typedef typename internal::traits<Lhs>::Index Index;\n  enum {\n    LhsRowMajor = internal::traits<Lhs>::Flags & RowMajorBit,\n    RhsRowMajor = internal::traits<Rhs>::Flags & RowMajorBit,\n    TransposeRhs = (!LhsRowMajor) && RhsRowMajor,\n    TransposeLhs = LhsRowMajor && (!RhsRowMajor)\n  };\n\n  typedef typename internal::conditional<TransposeLhs,\n    SparseMatrix<Scalar,0,Index>,\n    typename internal::nested<Lhs,Rhs::RowsAtCompileTime>::type>::type LhsNested;\n\n  typedef typename internal::conditional<TransposeRhs,\n    SparseMatrix<Scalar,0,Index>,\n    typename internal::nested<Rhs,Lhs::RowsAtCompileTime>::type>::type RhsNested;\n\n  typedef SparseSparseProduct<LhsNested, RhsNested> Type;\n};\n\nnamespace internal {\ntemplate<typename LhsNested, typename RhsNested>\nstruct traits<SparseSparseProduct<LhsNested, RhsNested> >\n{\n  typedef MatrixXpr XprKind;\n  // clean the nested types:\n  typedef typename remove_all<LhsNested>::type _LhsNested;\n  typedef typename remove_all<RhsNested>::type _RhsNested;\n  typedef typename _LhsNested::Scalar Scalar;\n  typedef typename promote_index_type<typename traits<_LhsNested>::Index,\n                                         typename traits<_RhsNested>::Index>::type Index;\n\n  enum {\n    LhsCoeffReadCost = _LhsNested::CoeffReadCost,\n    RhsCoeffReadCost = _RhsNested::CoeffReadCost,\n    LhsFlags = _LhsNested::Flags,\n    RhsFlags = _RhsNested::Flags,\n\n    RowsAtCompileTime    = _LhsNested::RowsAtCompileTime,\n    ColsAtCompileTime    = _RhsNested::ColsAtCompileTime,\n    MaxRowsAtCompileTime = _LhsNested::MaxRowsAtCompileTime,\n    MaxColsAtCompileTime = _RhsNested::MaxColsAtCompileTime,\n\n    InnerSize = EIGEN_SIZE_MIN_PREFER_FIXED(_LhsNested::ColsAtCompileTime, _RhsNested::RowsAtCompileTime),\n\n    EvalToRowMajor = (RhsFlags & LhsFlags & RowMajorBit),\n\n    RemovedBits = ~(EvalToRowMajor ? 0 : RowMajorBit),\n\n    Flags = (int(LhsFlags | RhsFlags) & HereditaryBits & RemovedBits)\n          | EvalBeforeAssigningBit\n          | EvalBeforeNestingBit,\n\n    CoeffReadCost = Dynamic\n  };\n\n  typedef Sparse StorageKind;\n};\n\n} // end namespace internal\n\ntemplate<typename LhsNested, typename RhsNested>\nclass SparseSparseProduct : internal::no_assignment_operator,\n  public SparseMatrixBase<SparseSparseProduct<LhsNested, RhsNested> >\n{\n  public:\n\n    typedef SparseMatrixBase<SparseSparseProduct> Base;\n    EIGEN_DENSE_PUBLIC_INTERFACE(SparseSparseProduct)\n\n  private:\n\n    typedef typename internal::traits<SparseSparseProduct>::_LhsNested _LhsNested;\n    typedef typename internal::traits<SparseSparseProduct>::_RhsNested _RhsNested;\n\n  public:\n\n    template<typename Lhs, typename Rhs>\n    EIGEN_STRONG_INLINE SparseSparseProduct(const Lhs& lhs, const Rhs& rhs)\n      : m_lhs(lhs), m_rhs(rhs), m_tolerance(0), m_conservative(true)\n    {\n      init();\n    }\n\n    template<typename Lhs, typename Rhs>\n    EIGEN_STRONG_INLINE SparseSparseProduct(const Lhs& lhs, const Rhs& rhs, const RealScalar& tolerance)\n      : m_lhs(lhs), m_rhs(rhs), m_tolerance(tolerance), m_conservative(false)\n    {\n      init();\n    }\n\n    SparseSparseProduct pruned(const Scalar& reference = 0, const RealScalar& epsilon = NumTraits<RealScalar>::dummy_precision()) const\n    {\n      using std::abs;\n      return SparseSparseProduct(m_lhs,m_rhs,abs(reference)*epsilon);\n    }\n\n    template<typename Dest>\n    void evalTo(Dest& result) const\n    {\n      if(m_conservative)\n        internal::conservative_sparse_sparse_product_selector<_LhsNested, _RhsNested, Dest>::run(lhs(),rhs(),result);\n      else\n        internal::sparse_sparse_product_with_pruning_selector<_LhsNested, _RhsNested, Dest>::run(lhs(),rhs(),result,m_tolerance);\n    }\n\n    EIGEN_STRONG_INLINE Index rows() const { return m_lhs.rows(); }\n    EIGEN_STRONG_INLINE Index cols() const { return m_rhs.cols(); }\n\n    EIGEN_STRONG_INLINE const _LhsNested& lhs() const { return m_lhs; }\n    EIGEN_STRONG_INLINE const _RhsNested& rhs() const { return m_rhs; }\n\n  protected:\n    void init()\n    {\n      eigen_assert(m_lhs.cols() == m_rhs.rows());\n\n      enum {\n        ProductIsValid = _LhsNested::ColsAtCompileTime==Dynamic\n                      || _RhsNested::RowsAtCompileTime==Dynamic\n                      || int(_LhsNested::ColsAtCompileTime)==int(_RhsNested::RowsAtCompileTime),\n        AreVectors = _LhsNested::IsVectorAtCompileTime && _RhsNested::IsVectorAtCompileTime,\n        SameSizes = EIGEN_PREDICATE_SAME_MATRIX_SIZE(_LhsNested,_RhsNested)\n      };\n      // note to the lost user:\n      //    * for a dot product use: v1.dot(v2)\n      //    * for a coeff-wise product use: v1.cwise()*v2\n      EIGEN_STATIC_ASSERT(ProductIsValid || !(AreVectors && SameSizes),\n        INVALID_VECTOR_VECTOR_PRODUCT__IF_YOU_WANTED_A_DOT_OR_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTIONS)\n      EIGEN_STATIC_ASSERT(ProductIsValid || !(SameSizes && !AreVectors),\n        INVALID_MATRIX_PRODUCT__IF_YOU_WANTED_A_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTION)\n      EIGEN_STATIC_ASSERT(ProductIsValid || SameSizes, INVALID_MATRIX_PRODUCT)\n    }\n\n    LhsNested m_lhs;\n    RhsNested m_rhs;\n    RealScalar m_tolerance;\n    bool m_conservative;\n};\n\n// sparse = sparse * sparse\ntemplate<typename Derived>\ntemplate<typename Lhs, typename Rhs>\ninline Derived& SparseMatrixBase<Derived>::operator=(const SparseSparseProduct<Lhs,Rhs>& product)\n{\n  product.evalTo(derived());\n  return derived();\n}\n\n/** \\returns an expression of the product of two sparse matrices.\n  * By default a conservative product preserving the symbolic non zeros is performed.\n  * The automatic pruning of the small values can be achieved by calling the pruned() function\n  * in which case a totally different product algorithm is employed:\n  * \\code\n  * C = (A*B).pruned();             // supress numerical zeros (exact)\n  * C = (A*B).pruned(ref);\n  * C = (A*B).pruned(ref,epsilon);\n  * \\endcode\n  * where \\c ref is a meaningful non zero reference value.\n  * */\ntemplate<typename Derived>\ntemplate<typename OtherDerived>\ninline const typename SparseSparseProductReturnType<Derived,OtherDerived>::Type\nSparseMatrixBase<Derived>::operator*(const SparseMatrixBase<OtherDerived> &other) const\n{\n  return typename SparseSparseProductReturnType<Derived,OtherDerived>::Type(derived(), other.derived());\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_SPARSEPRODUCT_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseCore/SparseRedux.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SPARSEREDUX_H\n#define EIGEN_SPARSEREDUX_H\n\nnamespace Eigen { \n\ntemplate<typename Derived>\ntypename internal::traits<Derived>::Scalar\nSparseMatrixBase<Derived>::sum() const\n{\n  eigen_assert(rows()>0 && cols()>0 && \"you are using a non initialized matrix\");\n  Scalar res(0);\n  for (Index j=0; j<outerSize(); ++j)\n    for (typename Derived::InnerIterator iter(derived(),j); iter; ++iter)\n      res += iter.value();\n  return res;\n}\n\ntemplate<typename _Scalar, int _Options, typename _Index>\ntypename internal::traits<SparseMatrix<_Scalar,_Options,_Index> >::Scalar\nSparseMatrix<_Scalar,_Options,_Index>::sum() const\n{\n  eigen_assert(rows()>0 && cols()>0 && \"you are using a non initialized matrix\");\n  if(this->isCompressed())\n    return Matrix<Scalar,1,Dynamic>::Map(m_data.valuePtr(), m_data.size()).sum();\n  else\n    return Base::sum();\n}\n\ntemplate<typename _Scalar, int _Options, typename _Index>\ntypename internal::traits<SparseVector<_Scalar,_Options, _Index> >::Scalar\nSparseVector<_Scalar,_Options,_Index>::sum() const\n{\n  eigen_assert(rows()>0 && cols()>0 && \"you are using a non initialized matrix\");\n  return Matrix<Scalar,1,Dynamic>::Map(m_data.valuePtr(), m_data.size()).sum();\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_SPARSEREDUX_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseCore/SparseSelfAdjointView.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SPARSE_SELFADJOINTVIEW_H\n#define EIGEN_SPARSE_SELFADJOINTVIEW_H\n\nnamespace Eigen { \n\n/** \\ingroup SparseCore_Module\n  * \\class SparseSelfAdjointView\n  *\n  * \\brief Pseudo expression to manipulate a triangular sparse matrix as a selfadjoint matrix.\n  *\n  * \\param MatrixType the type of the dense matrix storing the coefficients\n  * \\param UpLo can be either \\c #Lower or \\c #Upper\n  *\n  * This class is an expression of a sefladjoint matrix from a triangular part of a matrix\n  * with given dense storage of the coefficients. It is the return type of MatrixBase::selfadjointView()\n  * and most of the time this is the only way that it is used.\n  *\n  * \\sa SparseMatrixBase::selfadjointView()\n  */\ntemplate<typename Lhs, typename Rhs, int UpLo>\nclass SparseSelfAdjointTimeDenseProduct;\n\ntemplate<typename Lhs, typename Rhs, int UpLo>\nclass DenseTimeSparseSelfAdjointProduct;\n\nnamespace internal {\n  \ntemplate<typename MatrixType, unsigned int UpLo>\nstruct traits<SparseSelfAdjointView<MatrixType,UpLo> > : traits<MatrixType> {\n};\n\ntemplate<int SrcUpLo,int DstUpLo,typename MatrixType,int DestOrder>\nvoid permute_symm_to_symm(const MatrixType& mat, SparseMatrix<typename MatrixType::Scalar,DestOrder,typename MatrixType::Index>& _dest, const typename MatrixType::Index* perm = 0);\n\ntemplate<int UpLo,typename MatrixType,int DestOrder>\nvoid permute_symm_to_fullsymm(const MatrixType& mat, SparseMatrix<typename MatrixType::Scalar,DestOrder,typename MatrixType::Index>& _dest, const typename MatrixType::Index* perm = 0);\n\n}\n\ntemplate<typename MatrixType, unsigned int UpLo> class SparseSelfAdjointView\n  : public EigenBase<SparseSelfAdjointView<MatrixType,UpLo> >\n{\n  public:\n\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename MatrixType::Index Index;\n    typedef Matrix<Index,Dynamic,1> VectorI;\n    typedef typename MatrixType::Nested MatrixTypeNested;\n    typedef typename internal::remove_all<MatrixTypeNested>::type _MatrixTypeNested;\n\n    inline SparseSelfAdjointView(const MatrixType& matrix) : m_matrix(matrix)\n    {\n      eigen_assert(rows()==cols() && \"SelfAdjointView is only for squared matrices\");\n    }\n\n    inline Index rows() const { return m_matrix.rows(); }\n    inline Index cols() const { return m_matrix.cols(); }\n\n    /** \\internal \\returns a reference to the nested matrix */\n    const _MatrixTypeNested& matrix() const { return m_matrix; }\n    _MatrixTypeNested& matrix() { return m_matrix.const_cast_derived(); }\n\n    /** \\returns an expression of the matrix product between a sparse self-adjoint matrix \\c *this and a sparse matrix \\a rhs.\n      *\n      * Note that there is no algorithmic advantage of performing such a product compared to a general sparse-sparse matrix product.\n      * Indeed, the SparseSelfadjointView operand is first copied into a temporary SparseMatrix before computing the product.\n      */\n    template<typename OtherDerived>\n    SparseSparseProduct<typename OtherDerived::PlainObject, OtherDerived>\n    operator*(const SparseMatrixBase<OtherDerived>& rhs) const\n    {\n      return SparseSparseProduct<typename OtherDerived::PlainObject, OtherDerived>(*this, rhs.derived());\n    }\n\n    /** \\returns an expression of the matrix product between a sparse matrix \\a lhs and a sparse self-adjoint matrix \\a rhs.\n      *\n      * Note that there is no algorithmic advantage of performing such a product compared to a general sparse-sparse matrix product.\n      * Indeed, the SparseSelfadjointView operand is first copied into a temporary SparseMatrix before computing the product.\n      */\n    template<typename OtherDerived> friend\n    SparseSparseProduct<OtherDerived, typename OtherDerived::PlainObject >\n    operator*(const SparseMatrixBase<OtherDerived>& lhs, const SparseSelfAdjointView& rhs)\n    {\n      return SparseSparseProduct<OtherDerived, typename OtherDerived::PlainObject>(lhs.derived(), rhs);\n    }\n    \n    /** Efficient sparse self-adjoint matrix times dense vector/matrix product */\n    template<typename OtherDerived>\n    SparseSelfAdjointTimeDenseProduct<MatrixType,OtherDerived,UpLo>\n    operator*(const MatrixBase<OtherDerived>& rhs) const\n    {\n      return SparseSelfAdjointTimeDenseProduct<MatrixType,OtherDerived,UpLo>(m_matrix, rhs.derived());\n    }\n\n    /** Efficient dense vector/matrix times sparse self-adjoint matrix product */\n    template<typename OtherDerived> friend\n    DenseTimeSparseSelfAdjointProduct<OtherDerived,MatrixType,UpLo>\n    operator*(const MatrixBase<OtherDerived>& lhs, const SparseSelfAdjointView& rhs)\n    {\n      return DenseTimeSparseSelfAdjointProduct<OtherDerived,_MatrixTypeNested,UpLo>(lhs.derived(), rhs.m_matrix);\n    }\n\n    /** Perform a symmetric rank K update of the selfadjoint matrix \\c *this:\n      * \\f$ this = this + \\alpha ( u u^* ) \\f$ where \\a u is a vector or matrix.\n      *\n      * \\returns a reference to \\c *this\n      *\n      * To perform \\f$ this = this + \\alpha ( u^* u ) \\f$ you can simply\n      * call this function with u.adjoint().\n      */\n    template<typename DerivedU>\n    SparseSelfAdjointView& rankUpdate(const SparseMatrixBase<DerivedU>& u, const Scalar& alpha = Scalar(1));\n    \n    /** \\internal triggered by sparse_matrix = SparseSelfadjointView; */\n    template<typename DestScalar,int StorageOrder> void evalTo(SparseMatrix<DestScalar,StorageOrder,Index>& _dest) const\n    {\n      internal::permute_symm_to_fullsymm<UpLo>(m_matrix, _dest);\n    }\n    \n    template<typename DestScalar> void evalTo(DynamicSparseMatrix<DestScalar,ColMajor,Index>& _dest) const\n    {\n      // TODO directly evaluate into _dest;\n      SparseMatrix<DestScalar,ColMajor,Index> tmp(_dest.rows(),_dest.cols());\n      internal::permute_symm_to_fullsymm<UpLo>(m_matrix, tmp);\n      _dest = tmp;\n    }\n    \n    /** \\returns an expression of P H P^-1 */\n    SparseSymmetricPermutationProduct<_MatrixTypeNested,UpLo> twistedBy(const PermutationMatrix<Dynamic,Dynamic,Index>& perm) const\n    {\n      return SparseSymmetricPermutationProduct<_MatrixTypeNested,UpLo>(m_matrix, perm);\n    }\n    \n    template<typename SrcMatrixType,int SrcUpLo>\n    SparseSelfAdjointView& operator=(const SparseSymmetricPermutationProduct<SrcMatrixType,SrcUpLo>& permutedMatrix)\n    {\n      permutedMatrix.evalTo(*this);\n      return *this;\n    }\n\n\n    SparseSelfAdjointView& operator=(const SparseSelfAdjointView& src)\n    {\n      PermutationMatrix<Dynamic> pnull;\n      return *this = src.twistedBy(pnull);\n    }\n\n    template<typename SrcMatrixType,unsigned int SrcUpLo>\n    SparseSelfAdjointView& operator=(const SparseSelfAdjointView<SrcMatrixType,SrcUpLo>& src)\n    {\n      PermutationMatrix<Dynamic> pnull;\n      return *this = src.twistedBy(pnull);\n    }\n    \n\n    // const SparseLLT<PlainObject, UpLo> llt() const;\n    // const SparseLDLT<PlainObject, UpLo> ldlt() const;\n\n  protected:\n\n    typename MatrixType::Nested m_matrix;\n    mutable VectorI m_countPerRow;\n    mutable VectorI m_countPerCol;\n};\n\n/***************************************************************************\n* Implementation of SparseMatrixBase methods\n***************************************************************************/\n\ntemplate<typename Derived>\ntemplate<unsigned int UpLo>\nconst SparseSelfAdjointView<Derived, UpLo> SparseMatrixBase<Derived>::selfadjointView() const\n{\n  return derived();\n}\n\ntemplate<typename Derived>\ntemplate<unsigned int UpLo>\nSparseSelfAdjointView<Derived, UpLo> SparseMatrixBase<Derived>::selfadjointView()\n{\n  return derived();\n}\n\n/***************************************************************************\n* Implementation of SparseSelfAdjointView methods\n***************************************************************************/\n\ntemplate<typename MatrixType, unsigned int UpLo>\ntemplate<typename DerivedU>\nSparseSelfAdjointView<MatrixType,UpLo>&\nSparseSelfAdjointView<MatrixType,UpLo>::rankUpdate(const SparseMatrixBase<DerivedU>& u, const Scalar& alpha)\n{\n  SparseMatrix<Scalar,MatrixType::Flags&RowMajorBit?RowMajor:ColMajor> tmp = u * u.adjoint();\n  if(alpha==Scalar(0))\n    m_matrix.const_cast_derived() = tmp.template triangularView<UpLo>();\n  else\n    m_matrix.const_cast_derived() += alpha * tmp.template triangularView<UpLo>();\n\n  return *this;\n}\n\n/***************************************************************************\n* Implementation of sparse self-adjoint time dense matrix\n***************************************************************************/\n\nnamespace internal {\ntemplate<typename Lhs, typename Rhs, int UpLo>\nstruct traits<SparseSelfAdjointTimeDenseProduct<Lhs,Rhs,UpLo> >\n : traits<ProductBase<SparseSelfAdjointTimeDenseProduct<Lhs,Rhs,UpLo>, Lhs, Rhs> >\n{\n  typedef Dense StorageKind;\n};\n}\n\ntemplate<typename Lhs, typename Rhs, int UpLo>\nclass SparseSelfAdjointTimeDenseProduct\n  : public ProductBase<SparseSelfAdjointTimeDenseProduct<Lhs,Rhs,UpLo>, Lhs, Rhs>\n{\n  public:\n    EIGEN_PRODUCT_PUBLIC_INTERFACE(SparseSelfAdjointTimeDenseProduct)\n\n    SparseSelfAdjointTimeDenseProduct(const Lhs& lhs, const Rhs& rhs) : Base(lhs,rhs)\n    {}\n\n    template<typename Dest> void scaleAndAddTo(Dest& dest, const Scalar& alpha) const\n    {\n      EIGEN_ONLY_USED_FOR_DEBUG(alpha);\n      // TODO use alpha\n      eigen_assert(alpha==Scalar(1) && \"alpha != 1 is not implemented yet, sorry\");\n      typedef typename internal::remove_all<Lhs>::type _Lhs;\n      typedef typename _Lhs::InnerIterator LhsInnerIterator;\n      enum {\n        LhsIsRowMajor = (_Lhs::Flags&RowMajorBit)==RowMajorBit,\n        ProcessFirstHalf =\n                 ((UpLo&(Upper|Lower))==(Upper|Lower))\n              || ( (UpLo&Upper) && !LhsIsRowMajor)\n              || ( (UpLo&Lower) && LhsIsRowMajor),\n        ProcessSecondHalf = !ProcessFirstHalf\n      };\n      for (Index j=0; j<m_lhs.outerSize(); ++j)\n      {\n        LhsInnerIterator i(m_lhs,j);\n        if (ProcessSecondHalf)\n        {\n          while (i && i.index()<j) ++i;\n          if(i && i.index()==j)\n          {\n            dest.row(j) += i.value() * m_rhs.row(j);\n            ++i;\n          }\n        }\n        for(; (ProcessFirstHalf ? i && i.index() < j : i) ; ++i)\n        {\n          Index a = LhsIsRowMajor ? j : i.index();\n          Index b = LhsIsRowMajor ? i.index() : j;\n          typename Lhs::Scalar v = i.value();\n          dest.row(a) += (v) * m_rhs.row(b);\n          dest.row(b) += numext::conj(v) * m_rhs.row(a);\n        }\n        if (ProcessFirstHalf && i && (i.index()==j))\n          dest.row(j) += i.value() * m_rhs.row(j);\n      }\n    }\n\n  private:\n    SparseSelfAdjointTimeDenseProduct& operator=(const SparseSelfAdjointTimeDenseProduct&);\n};\n\nnamespace internal {\ntemplate<typename Lhs, typename Rhs, int UpLo>\nstruct traits<DenseTimeSparseSelfAdjointProduct<Lhs,Rhs,UpLo> >\n : traits<ProductBase<DenseTimeSparseSelfAdjointProduct<Lhs,Rhs,UpLo>, Lhs, Rhs> >\n{};\n}\n\ntemplate<typename Lhs, typename Rhs, int UpLo>\nclass DenseTimeSparseSelfAdjointProduct\n  : public ProductBase<DenseTimeSparseSelfAdjointProduct<Lhs,Rhs,UpLo>, Lhs, Rhs>\n{\n  public:\n    EIGEN_PRODUCT_PUBLIC_INTERFACE(DenseTimeSparseSelfAdjointProduct)\n\n    DenseTimeSparseSelfAdjointProduct(const Lhs& lhs, const Rhs& rhs) : Base(lhs,rhs)\n    {}\n\n    template<typename Dest> void scaleAndAddTo(Dest& /*dest*/, const Scalar& /*alpha*/) const\n    {\n      // TODO\n    }\n\n  private:\n    DenseTimeSparseSelfAdjointProduct& operator=(const DenseTimeSparseSelfAdjointProduct&);\n};\n\n/***************************************************************************\n* Implementation of symmetric copies and permutations\n***************************************************************************/\nnamespace internal {\n  \ntemplate<typename MatrixType, int UpLo>\nstruct traits<SparseSymmetricPermutationProduct<MatrixType,UpLo> > : traits<MatrixType> {\n};\n\ntemplate<int UpLo,typename MatrixType,int DestOrder>\nvoid permute_symm_to_fullsymm(const MatrixType& mat, SparseMatrix<typename MatrixType::Scalar,DestOrder,typename MatrixType::Index>& _dest, const typename MatrixType::Index* perm)\n{\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n  typedef SparseMatrix<Scalar,DestOrder,Index> Dest;\n  typedef Matrix<Index,Dynamic,1> VectorI;\n  \n  Dest& dest(_dest.derived());\n  enum {\n    StorageOrderMatch = int(Dest::IsRowMajor) == int(MatrixType::IsRowMajor)\n  };\n  \n  Index size = mat.rows();\n  VectorI count;\n  count.resize(size);\n  count.setZero();\n  dest.resize(size,size);\n  for(Index j = 0; j<size; ++j)\n  {\n    Index jp = perm ? perm[j] : j;\n    for(typename MatrixType::InnerIterator it(mat,j); it; ++it)\n    {\n      Index i = it.index();\n      Index r = it.row();\n      Index c = it.col();\n      Index ip = perm ? perm[i] : i;\n      if(UpLo==(Upper|Lower))\n        count[StorageOrderMatch ? jp : ip]++;\n      else if(r==c)\n        count[ip]++;\n      else if(( UpLo==Lower && r>c) || ( UpLo==Upper && r<c))\n      {\n        count[ip]++;\n        count[jp]++;\n      }\n    }\n  }\n  Index nnz = count.sum();\n  \n  // reserve space\n  dest.resizeNonZeros(nnz);\n  dest.outerIndexPtr()[0] = 0;\n  for(Index j=0; j<size; ++j)\n    dest.outerIndexPtr()[j+1] = dest.outerIndexPtr()[j] + count[j];\n  for(Index j=0; j<size; ++j)\n    count[j] = dest.outerIndexPtr()[j];\n  \n  // copy data\n  for(Index j = 0; j<size; ++j)\n  {\n    for(typename MatrixType::InnerIterator it(mat,j); it; ++it)\n    {\n      Index i = it.index();\n      Index r = it.row();\n      Index c = it.col();\n      \n      Index jp = perm ? perm[j] : j;\n      Index ip = perm ? perm[i] : i;\n      \n      if(UpLo==(Upper|Lower))\n      {\n        Index k = count[StorageOrderMatch ? jp : ip]++;\n        dest.innerIndexPtr()[k] = StorageOrderMatch ? ip : jp;\n        dest.valuePtr()[k] = it.value();\n      }\n      else if(r==c)\n      {\n        Index k = count[ip]++;\n        dest.innerIndexPtr()[k] = ip;\n        dest.valuePtr()[k] = it.value();\n      }\n      else if(( (UpLo&Lower)==Lower && r>c) || ( (UpLo&Upper)==Upper && r<c))\n      {\n        if(!StorageOrderMatch)\n          std::swap(ip,jp);\n        Index k = count[jp]++;\n        dest.innerIndexPtr()[k] = ip;\n        dest.valuePtr()[k] = it.value();\n        k = count[ip]++;\n        dest.innerIndexPtr()[k] = jp;\n        dest.valuePtr()[k] = numext::conj(it.value());\n      }\n    }\n  }\n}\n\ntemplate<int _SrcUpLo,int _DstUpLo,typename MatrixType,int DstOrder>\nvoid permute_symm_to_symm(const MatrixType& mat, SparseMatrix<typename MatrixType::Scalar,DstOrder,typename MatrixType::Index>& _dest, const typename MatrixType::Index* perm)\n{\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n  SparseMatrix<Scalar,DstOrder,Index>& dest(_dest.derived());\n  typedef Matrix<Index,Dynamic,1> VectorI;\n  enum {\n    SrcOrder = MatrixType::IsRowMajor ? RowMajor : ColMajor,\n    StorageOrderMatch = int(SrcOrder) == int(DstOrder),\n    DstUpLo = DstOrder==RowMajor ? (_DstUpLo==Upper ? Lower : Upper) : _DstUpLo,\n    SrcUpLo = SrcOrder==RowMajor ? (_SrcUpLo==Upper ? Lower : Upper) : _SrcUpLo\n  };\n  \n  Index size = mat.rows();\n  VectorI count(size);\n  count.setZero();\n  dest.resize(size,size);\n  for(Index j = 0; j<size; ++j)\n  {\n    Index jp = perm ? perm[j] : j;\n    for(typename MatrixType::InnerIterator it(mat,j); it; ++it)\n    {\n      Index i = it.index();\n      if((int(SrcUpLo)==int(Lower) && i<j) || (int(SrcUpLo)==int(Upper) && i>j))\n        continue;\n                  \n      Index ip = perm ? perm[i] : i;\n      count[int(DstUpLo)==int(Lower) ? (std::min)(ip,jp) : (std::max)(ip,jp)]++;\n    }\n  }\n  dest.outerIndexPtr()[0] = 0;\n  for(Index j=0; j<size; ++j)\n    dest.outerIndexPtr()[j+1] = dest.outerIndexPtr()[j] + count[j];\n  dest.resizeNonZeros(dest.outerIndexPtr()[size]);\n  for(Index j=0; j<size; ++j)\n    count[j] = dest.outerIndexPtr()[j];\n  \n  for(Index j = 0; j<size; ++j)\n  {\n    \n    for(typename MatrixType::InnerIterator it(mat,j); it; ++it)\n    {\n      Index i = it.index();\n      if((int(SrcUpLo)==int(Lower) && i<j) || (int(SrcUpLo)==int(Upper) && i>j))\n        continue;\n                  \n      Index jp = perm ? perm[j] : j;\n      Index ip = perm? perm[i] : i;\n      \n      Index k = count[int(DstUpLo)==int(Lower) ? (std::min)(ip,jp) : (std::max)(ip,jp)]++;\n      dest.innerIndexPtr()[k] = int(DstUpLo)==int(Lower) ? (std::max)(ip,jp) : (std::min)(ip,jp);\n      \n      if(!StorageOrderMatch) std::swap(ip,jp);\n      if( ((int(DstUpLo)==int(Lower) && ip<jp) || (int(DstUpLo)==int(Upper) && ip>jp)))\n        dest.valuePtr()[k] = numext::conj(it.value());\n      else\n        dest.valuePtr()[k] = it.value();\n    }\n  }\n}\n\n}\n\ntemplate<typename MatrixType,int UpLo>\nclass SparseSymmetricPermutationProduct\n  : public EigenBase<SparseSymmetricPermutationProduct<MatrixType,UpLo> >\n{\n  public:\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename MatrixType::Index Index;\n  protected:\n    typedef PermutationMatrix<Dynamic,Dynamic,Index> Perm;\n  public:\n    typedef Matrix<Index,Dynamic,1> VectorI;\n    typedef typename MatrixType::Nested MatrixTypeNested;\n    typedef typename internal::remove_all<MatrixTypeNested>::type _MatrixTypeNested;\n    \n    SparseSymmetricPermutationProduct(const MatrixType& mat, const Perm& perm)\n      : m_matrix(mat), m_perm(perm)\n    {}\n    \n    inline Index rows() const { return m_matrix.rows(); }\n    inline Index cols() const { return m_matrix.cols(); }\n    \n    template<typename DestScalar, int Options, typename DstIndex>\n    void evalTo(SparseMatrix<DestScalar,Options,DstIndex>& _dest) const\n    {\n//       internal::permute_symm_to_fullsymm<UpLo>(m_matrix,_dest,m_perm.indices().data());\n      SparseMatrix<DestScalar,(Options&RowMajor)==RowMajor ? ColMajor : RowMajor, DstIndex> tmp;\n      internal::permute_symm_to_fullsymm<UpLo>(m_matrix,tmp,m_perm.indices().data());\n      _dest = tmp;\n    }\n    \n    template<typename DestType,unsigned int DestUpLo> void evalTo(SparseSelfAdjointView<DestType,DestUpLo>& dest) const\n    {\n      internal::permute_symm_to_symm<UpLo,DestUpLo>(m_matrix,dest.matrix(),m_perm.indices().data());\n    }\n    \n  protected:\n    MatrixTypeNested m_matrix;\n    const Perm& m_perm;\n\n};\n\n} // end namespace Eigen\n\n#endif // EIGEN_SPARSE_SELFADJOINTVIEW_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseCore/SparseSparseProductWithPruning.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2011 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SPARSESPARSEPRODUCTWITHPRUNING_H\n#define EIGEN_SPARSESPARSEPRODUCTWITHPRUNING_H\n\nnamespace Eigen { \n\nnamespace internal {\n\n\n// perform a pseudo in-place sparse * sparse product assuming all matrices are col major\ntemplate<typename Lhs, typename Rhs, typename ResultType>\nstatic void sparse_sparse_product_with_pruning_impl(const Lhs& lhs, const Rhs& rhs, ResultType& res, const typename ResultType::RealScalar& tolerance)\n{\n  // return sparse_sparse_product_with_pruning_impl2(lhs,rhs,res);\n\n  typedef typename remove_all<Lhs>::type::Scalar Scalar;\n  typedef typename remove_all<Lhs>::type::Index Index;\n\n  // make sure to call innerSize/outerSize since we fake the storage order.\n  Index rows = lhs.innerSize();\n  Index cols = rhs.outerSize();\n  //Index size = lhs.outerSize();\n  eigen_assert(lhs.outerSize() == rhs.innerSize());\n\n  // allocate a temporary buffer\n  AmbiVector<Scalar,Index> tempVector(rows);\n\n  // estimate the number of non zero entries\n  // given a rhs column containing Y non zeros, we assume that the respective Y columns\n  // of the lhs differs in average of one non zeros, thus the number of non zeros for\n  // the product of a rhs column with the lhs is X+Y where X is the average number of non zero\n  // per column of the lhs.\n  // Therefore, we have nnz(lhs*rhs) = nnz(lhs) + nnz(rhs)\n  Index estimated_nnz_prod = lhs.nonZeros() + rhs.nonZeros();\n\n  // mimics a resizeByInnerOuter:\n  if(ResultType::IsRowMajor)\n    res.resize(cols, rows);\n  else\n    res.resize(rows, cols);\n\n  res.reserve(estimated_nnz_prod);\n  double ratioColRes = double(estimated_nnz_prod)/(double(lhs.rows())*double(rhs.cols()));\n  for (Index j=0; j<cols; ++j)\n  {\n    // FIXME:\n    //double ratioColRes = (double(rhs.innerVector(j).nonZeros()) + double(lhs.nonZeros())/double(lhs.cols()))/double(lhs.rows());\n    // let's do a more accurate determination of the nnz ratio for the current column j of res\n    tempVector.init(ratioColRes);\n    tempVector.setZero();\n    for (typename Rhs::InnerIterator rhsIt(rhs, j); rhsIt; ++rhsIt)\n    {\n      // FIXME should be written like this: tmp += rhsIt.value() * lhs.col(rhsIt.index())\n      tempVector.restart();\n      Scalar x = rhsIt.value();\n      for (typename Lhs::InnerIterator lhsIt(lhs, rhsIt.index()); lhsIt; ++lhsIt)\n      {\n        tempVector.coeffRef(lhsIt.index()) += lhsIt.value() * x;\n      }\n    }\n    res.startVec(j);\n    for (typename AmbiVector<Scalar,Index>::Iterator it(tempVector,tolerance); it; ++it)\n      res.insertBackByOuterInner(j,it.index()) = it.value();\n  }\n  res.finalize();\n}\n\ntemplate<typename Lhs, typename Rhs, typename ResultType,\n  int LhsStorageOrder = traits<Lhs>::Flags&RowMajorBit,\n  int RhsStorageOrder = traits<Rhs>::Flags&RowMajorBit,\n  int ResStorageOrder = traits<ResultType>::Flags&RowMajorBit>\nstruct sparse_sparse_product_with_pruning_selector;\n\ntemplate<typename Lhs, typename Rhs, typename ResultType>\nstruct sparse_sparse_product_with_pruning_selector<Lhs,Rhs,ResultType,ColMajor,ColMajor,ColMajor>\n{\n  typedef typename traits<typename remove_all<Lhs>::type>::Scalar Scalar;\n  typedef typename ResultType::RealScalar RealScalar;\n\n  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res, const RealScalar& tolerance)\n  {\n    typename remove_all<ResultType>::type _res(res.rows(), res.cols());\n    internal::sparse_sparse_product_with_pruning_impl<Lhs,Rhs,ResultType>(lhs, rhs, _res, tolerance);\n    res.swap(_res);\n  }\n};\n\ntemplate<typename Lhs, typename Rhs, typename ResultType>\nstruct sparse_sparse_product_with_pruning_selector<Lhs,Rhs,ResultType,ColMajor,ColMajor,RowMajor>\n{\n  typedef typename ResultType::RealScalar RealScalar;\n  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res, const RealScalar& tolerance)\n  {\n    // we need a col-major matrix to hold the result\n    typedef SparseMatrix<typename ResultType::Scalar,ColMajor,typename ResultType::Index> SparseTemporaryType;\n    SparseTemporaryType _res(res.rows(), res.cols());\n    internal::sparse_sparse_product_with_pruning_impl<Lhs,Rhs,SparseTemporaryType>(lhs, rhs, _res, tolerance);\n    res = _res;\n  }\n};\n\ntemplate<typename Lhs, typename Rhs, typename ResultType>\nstruct sparse_sparse_product_with_pruning_selector<Lhs,Rhs,ResultType,RowMajor,RowMajor,RowMajor>\n{\n  typedef typename ResultType::RealScalar RealScalar;\n  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res, const RealScalar& tolerance)\n  {\n    // let's transpose the product to get a column x column product\n    typename remove_all<ResultType>::type _res(res.rows(), res.cols());\n    internal::sparse_sparse_product_with_pruning_impl<Rhs,Lhs,ResultType>(rhs, lhs, _res, tolerance);\n    res.swap(_res);\n  }\n};\n\ntemplate<typename Lhs, typename Rhs, typename ResultType>\nstruct sparse_sparse_product_with_pruning_selector<Lhs,Rhs,ResultType,RowMajor,RowMajor,ColMajor>\n{\n  typedef typename ResultType::RealScalar RealScalar;\n  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res, const RealScalar& tolerance)\n  {\n    typedef SparseMatrix<typename ResultType::Scalar,ColMajor,typename Lhs::Index> ColMajorMatrixLhs;\n    typedef SparseMatrix<typename ResultType::Scalar,ColMajor,typename Lhs::Index> ColMajorMatrixRhs;\n    ColMajorMatrixLhs colLhs(lhs);\n    ColMajorMatrixRhs colRhs(rhs);\n    internal::sparse_sparse_product_with_pruning_impl<ColMajorMatrixLhs,ColMajorMatrixRhs,ResultType>(colLhs, colRhs, res, tolerance);\n\n    // let's transpose the product to get a column x column product\n//     typedef SparseMatrix<typename ResultType::Scalar> SparseTemporaryType;\n//     SparseTemporaryType _res(res.cols(), res.rows());\n//     sparse_sparse_product_with_pruning_impl<Rhs,Lhs,SparseTemporaryType>(rhs, lhs, _res);\n//     res = _res.transpose();\n  }\n};\n\n// NOTE the 2 others cases (col row *) must never occur since they are caught\n// by ProductReturnType which transforms it to (col col *) by evaluating rhs.\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_SPARSESPARSEPRODUCTWITHPRUNING_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseCore/SparseTranspose.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SPARSETRANSPOSE_H\n#define EIGEN_SPARSETRANSPOSE_H\n\nnamespace Eigen { \n\ntemplate<typename MatrixType> class TransposeImpl<MatrixType,Sparse>\n  : public SparseMatrixBase<Transpose<MatrixType> >\n{\n    typedef typename internal::remove_all<typename MatrixType::Nested>::type _MatrixTypeNested;\n  public:\n\n    EIGEN_SPARSE_PUBLIC_INTERFACE(Transpose<MatrixType> )\n\n    class InnerIterator;\n    class ReverseInnerIterator;\n\n    inline Index nonZeros() const { return derived().nestedExpression().nonZeros(); }\n};\n\n// NOTE: VC10 and VC11 trigger an ICE if don't put typename TransposeImpl<MatrixType,Sparse>:: in front of Index,\n// a typedef typename TransposeImpl<MatrixType,Sparse>::Index Index;\n// does not fix the issue.\n// An alternative is to define the nested class in the parent class itself.\ntemplate<typename MatrixType> class TransposeImpl<MatrixType,Sparse>::InnerIterator\n  : public _MatrixTypeNested::InnerIterator\n{\n    typedef typename _MatrixTypeNested::InnerIterator Base;\n    typedef typename TransposeImpl::Index Index;\n  public:\n\n    EIGEN_STRONG_INLINE InnerIterator(const TransposeImpl& trans, typename TransposeImpl<MatrixType,Sparse>::Index outer)\n      : Base(trans.derived().nestedExpression(), outer)\n    {}\n    typename TransposeImpl<MatrixType,Sparse>::Index row() const { return Base::col(); }\n    typename TransposeImpl<MatrixType,Sparse>::Index col() const { return Base::row(); }\n};\n\ntemplate<typename MatrixType> class TransposeImpl<MatrixType,Sparse>::ReverseInnerIterator\n  : public _MatrixTypeNested::ReverseInnerIterator\n{\n    typedef typename _MatrixTypeNested::ReverseInnerIterator Base;\n    typedef typename TransposeImpl::Index Index;\n  public:\n\n    EIGEN_STRONG_INLINE ReverseInnerIterator(const TransposeImpl& xpr, typename TransposeImpl<MatrixType,Sparse>::Index outer)\n      : Base(xpr.derived().nestedExpression(), outer)\n    {}\n    typename TransposeImpl<MatrixType,Sparse>::Index row() const { return Base::col(); }\n    typename TransposeImpl<MatrixType,Sparse>::Index col() const { return Base::row(); }\n};\n\n} // end namespace Eigen\n\n#endif // EIGEN_SPARSETRANSPOSE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseCore/SparseTriangularView.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SPARSE_TRIANGULARVIEW_H\n#define EIGEN_SPARSE_TRIANGULARVIEW_H\n\nnamespace Eigen { \n\nnamespace internal {\n  \ntemplate<typename MatrixType, int Mode>\nstruct traits<SparseTriangularView<MatrixType,Mode> >\n: public traits<MatrixType>\n{};\n\n} // namespace internal\n\ntemplate<typename MatrixType, int Mode> class SparseTriangularView\n  : public SparseMatrixBase<SparseTriangularView<MatrixType,Mode> >\n{\n    enum { SkipFirst = ((Mode&Lower) && !(MatrixType::Flags&RowMajorBit))\n                    || ((Mode&Upper) &&  (MatrixType::Flags&RowMajorBit)),\n           SkipLast = !SkipFirst,\n           SkipDiag = (Mode&ZeroDiag) ? 1 : 0,\n           HasUnitDiag = (Mode&UnitDiag) ? 1 : 0\n    };\n\n  public:\n    \n    EIGEN_SPARSE_PUBLIC_INTERFACE(SparseTriangularView)\n\n    class InnerIterator;\n    class ReverseInnerIterator;\n\n    inline Index rows() const { return m_matrix.rows(); }\n    inline Index cols() const { return m_matrix.cols(); }\n\n    typedef typename MatrixType::Nested MatrixTypeNested;\n    typedef typename internal::remove_reference<MatrixTypeNested>::type MatrixTypeNestedNonRef;\n    typedef typename internal::remove_all<MatrixTypeNested>::type MatrixTypeNestedCleaned;\n\n    inline SparseTriangularView(const MatrixType& matrix) : m_matrix(matrix) {}\n\n    /** \\internal */\n    inline const MatrixTypeNestedCleaned& nestedExpression() const { return m_matrix; }\n\n    template<typename OtherDerived>\n    typename internal::plain_matrix_type_column_major<OtherDerived>::type\n    solve(const MatrixBase<OtherDerived>& other) const;\n\n    template<typename OtherDerived> void solveInPlace(MatrixBase<OtherDerived>& other) const;\n    template<typename OtherDerived> void solveInPlace(SparseMatrixBase<OtherDerived>& other) const;\n\n  protected:\n    MatrixTypeNested m_matrix;\n};\n\ntemplate<typename MatrixType, int Mode>\nclass SparseTriangularView<MatrixType,Mode>::InnerIterator : public MatrixTypeNestedCleaned::InnerIterator\n{\n    typedef typename MatrixTypeNestedCleaned::InnerIterator Base;\n    typedef typename SparseTriangularView::Index Index;\n  public:\n\n    EIGEN_STRONG_INLINE InnerIterator(const SparseTriangularView& view, Index outer)\n      : Base(view.nestedExpression(), outer), m_returnOne(false)\n    {\n      if(SkipFirst)\n      {\n        while((*this) && ((HasUnitDiag||SkipDiag)  ? this->index()<=outer : this->index()<outer))\n          Base::operator++();\n        if(HasUnitDiag)\n          m_returnOne = true;\n      }\n      else if(HasUnitDiag && ((!Base::operator bool()) || Base::index()>=Base::outer()))\n      {\n        if((!SkipFirst) && Base::operator bool())\n          Base::operator++();\n        m_returnOne = true;\n      }\n    }\n\n    EIGEN_STRONG_INLINE InnerIterator& operator++()\n    {\n      if(HasUnitDiag && m_returnOne)\n        m_returnOne = false;\n      else\n      {\n        Base::operator++();\n        if(HasUnitDiag && (!SkipFirst) && ((!Base::operator bool()) || Base::index()>=Base::outer()))\n        {\n          if((!SkipFirst) && Base::operator bool())\n            Base::operator++();\n          m_returnOne = true;\n        }\n      }\n      return *this;\n    }\n\n    inline Index row() const { return (MatrixType::Flags&RowMajorBit ? Base::outer() : this->index()); }\n    inline Index col() const { return (MatrixType::Flags&RowMajorBit ? this->index() : Base::outer()); }\n    inline Index index() const\n    {\n      if(HasUnitDiag && m_returnOne)  return Base::outer();\n      else                            return Base::index();\n    }\n    inline Scalar value() const\n    {\n      if(HasUnitDiag && m_returnOne)  return Scalar(1);\n      else                            return Base::value();\n    }\n\n    EIGEN_STRONG_INLINE operator bool() const\n    {\n      if(HasUnitDiag && m_returnOne)\n        return true;\n      if(SkipFirst) return  Base::operator bool();\n      else\n      {\n        if (SkipDiag) return (Base::operator bool() && this->index() < this->outer());\n        else return (Base::operator bool() && this->index() <= this->outer());\n      }\n    }\n  protected:\n    bool m_returnOne;\n};\n\ntemplate<typename MatrixType, int Mode>\nclass SparseTriangularView<MatrixType,Mode>::ReverseInnerIterator : public MatrixTypeNestedCleaned::ReverseInnerIterator\n{\n    typedef typename MatrixTypeNestedCleaned::ReverseInnerIterator Base;\n    typedef typename SparseTriangularView::Index Index;\n  public:\n\n    EIGEN_STRONG_INLINE ReverseInnerIterator(const SparseTriangularView& view, Index outer)\n      : Base(view.nestedExpression(), outer)\n    {\n      eigen_assert((!HasUnitDiag) && \"ReverseInnerIterator does not support yet triangular views with a unit diagonal\");\n      if(SkipLast) {\n        while((*this) && (SkipDiag ? this->index()>=outer : this->index()>outer))\n          --(*this);\n      }\n    }\n\n    EIGEN_STRONG_INLINE ReverseInnerIterator& operator--()\n    { Base::operator--(); return *this; }\n\n    inline Index row() const { return Base::row(); }\n    inline Index col() const { return Base::col(); }\n\n    EIGEN_STRONG_INLINE operator bool() const\n    {\n      if (SkipLast) return Base::operator bool() ;\n      else\n      {\n        if(SkipDiag) return (Base::operator bool() && this->index() > this->outer());\n        else return (Base::operator bool() && this->index() >= this->outer());\n      }\n    }\n};\n\ntemplate<typename Derived>\ntemplate<int Mode>\ninline const SparseTriangularView<Derived, Mode>\nSparseMatrixBase<Derived>::triangularView() const\n{\n  return derived();\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_SPARSE_TRIANGULARVIEW_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseCore/SparseUtil.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SPARSEUTIL_H\n#define EIGEN_SPARSEUTIL_H\n\nnamespace Eigen { \n\n#ifdef NDEBUG\n#define EIGEN_DBG_SPARSE(X)\n#else\n#define EIGEN_DBG_SPARSE(X) X\n#endif\n\n#define EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(Derived, Op) \\\ntemplate<typename OtherDerived> \\\nEIGEN_STRONG_INLINE Derived& operator Op(const Eigen::SparseMatrixBase<OtherDerived>& other) \\\n{ \\\n  return Base::operator Op(other.derived()); \\\n} \\\nEIGEN_STRONG_INLINE Derived& operator Op(const Derived& other) \\\n{ \\\n  return Base::operator Op(other); \\\n}\n\n#define EIGEN_SPARSE_INHERIT_SCALAR_ASSIGNMENT_OPERATOR(Derived, Op) \\\ntemplate<typename Other> \\\nEIGEN_STRONG_INLINE Derived& operator Op(const Other& scalar) \\\n{ \\\n  return Base::operator Op(scalar); \\\n}\n\n#define EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATORS(Derived) \\\nEIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(Derived, =) \\\nEIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(Derived, +=) \\\nEIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(Derived, -=) \\\nEIGEN_SPARSE_INHERIT_SCALAR_ASSIGNMENT_OPERATOR(Derived, *=) \\\nEIGEN_SPARSE_INHERIT_SCALAR_ASSIGNMENT_OPERATOR(Derived, /=)\n\n#define _EIGEN_SPARSE_PUBLIC_INTERFACE(Derived, BaseClass) \\\n  typedef BaseClass Base; \\\n  typedef typename Eigen::internal::traits<Derived >::Scalar Scalar; \\\n  typedef typename Eigen::NumTraits<Scalar>::Real RealScalar; \\\n  typedef typename Eigen::internal::nested<Derived >::type Nested; \\\n  typedef typename Eigen::internal::traits<Derived >::StorageKind StorageKind; \\\n  typedef typename Eigen::internal::traits<Derived >::Index Index; \\\n  enum { RowsAtCompileTime = Eigen::internal::traits<Derived >::RowsAtCompileTime, \\\n        ColsAtCompileTime = Eigen::internal::traits<Derived >::ColsAtCompileTime, \\\n        Flags = Eigen::internal::traits<Derived >::Flags, \\\n        CoeffReadCost = Eigen::internal::traits<Derived >::CoeffReadCost, \\\n        SizeAtCompileTime = Base::SizeAtCompileTime, \\\n        IsVectorAtCompileTime = Base::IsVectorAtCompileTime }; \\\n  using Base::derived; \\\n  using Base::const_cast_derived;\n\n#define EIGEN_SPARSE_PUBLIC_INTERFACE(Derived) \\\n  _EIGEN_SPARSE_PUBLIC_INTERFACE(Derived, Eigen::SparseMatrixBase<Derived >)\n\nconst int CoherentAccessPattern     = 0x1;\nconst int InnerRandomAccessPattern  = 0x2 | CoherentAccessPattern;\nconst int OuterRandomAccessPattern  = 0x4 | CoherentAccessPattern;\nconst int RandomAccessPattern       = 0x8 | OuterRandomAccessPattern | InnerRandomAccessPattern;\n\ntemplate<typename _Scalar, int _Flags = 0, typename _Index = int>  class SparseMatrix;\ntemplate<typename _Scalar, int _Flags = 0, typename _Index = int>  class DynamicSparseMatrix;\ntemplate<typename _Scalar, int _Flags = 0, typename _Index = int>  class SparseVector;\ntemplate<typename _Scalar, int _Flags = 0, typename _Index = int>  class MappedSparseMatrix;\n\ntemplate<typename MatrixType, int Mode>           class SparseTriangularView;\ntemplate<typename MatrixType, unsigned int UpLo>  class SparseSelfAdjointView;\ntemplate<typename Lhs, typename Rhs>              class SparseDiagonalProduct;\ntemplate<typename MatrixType> class SparseView;\n\ntemplate<typename Lhs, typename Rhs>        class SparseSparseProduct;\ntemplate<typename Lhs, typename Rhs>        class SparseTimeDenseProduct;\ntemplate<typename Lhs, typename Rhs>        class DenseTimeSparseProduct;\ntemplate<typename Lhs, typename Rhs, bool Transpose> class SparseDenseOuterProduct;\n\ntemplate<typename Lhs, typename Rhs> struct SparseSparseProductReturnType;\ntemplate<typename Lhs, typename Rhs,\n         int InnerSize = EIGEN_SIZE_MIN_PREFER_FIXED(internal::traits<Lhs>::ColsAtCompileTime,internal::traits<Rhs>::RowsAtCompileTime)> struct DenseSparseProductReturnType;         \ntemplate<typename Lhs, typename Rhs,\n         int InnerSize = EIGEN_SIZE_MIN_PREFER_FIXED(internal::traits<Lhs>::ColsAtCompileTime,internal::traits<Rhs>::RowsAtCompileTime)> struct SparseDenseProductReturnType;\ntemplate<typename MatrixType,int UpLo> class SparseSymmetricPermutationProduct;\n\nnamespace internal {\n\ntemplate<typename T,int Rows,int Cols> struct sparse_eval;\n\ntemplate<typename T> struct eval<T,Sparse>\n  : public sparse_eval<T, traits<T>::RowsAtCompileTime,traits<T>::ColsAtCompileTime>\n{};\n\ntemplate<typename T,int Cols> struct sparse_eval<T,1,Cols> {\n    typedef typename traits<T>::Scalar _Scalar;\n    typedef typename traits<T>::Index _Index;\n  public:\n    typedef SparseVector<_Scalar, RowMajor, _Index> type;\n};\n\ntemplate<typename T,int Rows> struct sparse_eval<T,Rows,1> {\n    typedef typename traits<T>::Scalar _Scalar;\n    typedef typename traits<T>::Index _Index;\n  public:\n    typedef SparseVector<_Scalar, ColMajor, _Index> type;\n};\n\ntemplate<typename T,int Rows,int Cols> struct sparse_eval {\n    typedef typename traits<T>::Scalar _Scalar;\n    typedef typename traits<T>::Index _Index;\n    enum { _Options = ((traits<T>::Flags&RowMajorBit)==RowMajorBit) ? RowMajor : ColMajor };\n  public:\n    typedef SparseMatrix<_Scalar, _Options, _Index> type;\n};\n\ntemplate<typename T> struct sparse_eval<T,1,1> {\n    typedef typename traits<T>::Scalar _Scalar;\n  public:\n    typedef Matrix<_Scalar, 1, 1> type;\n};\n\ntemplate<typename T> struct plain_matrix_type<T,Sparse>\n{\n  typedef typename traits<T>::Scalar _Scalar;\n  typedef typename traits<T>::Index _Index;\n  enum { _Options = ((traits<T>::Flags&RowMajorBit)==RowMajorBit) ? RowMajor : ColMajor };\n  public:\n    typedef SparseMatrix<_Scalar, _Options, _Index> type;\n};\n\n} // end namespace internal\n\n/** \\ingroup SparseCore_Module\n  *\n  * \\class Triplet\n  *\n  * \\brief A small structure to hold a non zero as a triplet (i,j,value).\n  *\n  * \\sa SparseMatrix::setFromTriplets()\n  */\ntemplate<typename Scalar, typename Index=typename SparseMatrix<Scalar>::Index >\nclass Triplet\n{\npublic:\n  Triplet() : m_row(0), m_col(0), m_value(0) {}\n\n  Triplet(const Index& i, const Index& j, const Scalar& v = Scalar(0))\n    : m_row(i), m_col(j), m_value(v)\n  {}\n\n  /** \\returns the row index of the element */\n  const Index& row() const { return m_row; }\n\n  /** \\returns the column index of the element */\n  const Index& col() const { return m_col; }\n\n  /** \\returns the value of the element */\n  const Scalar& value() const { return m_value; }\nprotected:\n  Index m_row, m_col;\n  Scalar m_value;\n};\n\n} // end namespace Eigen\n\n#endif // EIGEN_SPARSEUTIL_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseCore/SparseVector.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SPARSEVECTOR_H\n#define EIGEN_SPARSEVECTOR_H\n\nnamespace Eigen { \n\n/** \\ingroup SparseCore_Module\n  * \\class SparseVector\n  *\n  * \\brief a sparse vector class\n  *\n  * \\tparam _Scalar the scalar type, i.e. the type of the coefficients\n  *\n  * See http://www.netlib.org/linalg/html_templates/node91.html for details on the storage scheme.\n  *\n  * This class can be extended with the help of the plugin mechanism described on the page\n  * \\ref TopicCustomizingEigen by defining the preprocessor symbol \\c EIGEN_SPARSEVECTOR_PLUGIN.\n  */\n\nnamespace internal {\ntemplate<typename _Scalar, int _Options, typename _Index>\nstruct traits<SparseVector<_Scalar, _Options, _Index> >\n{\n  typedef _Scalar Scalar;\n  typedef _Index Index;\n  typedef Sparse StorageKind;\n  typedef MatrixXpr XprKind;\n  enum {\n    IsColVector = (_Options & RowMajorBit) ? 0 : 1,\n\n    RowsAtCompileTime = IsColVector ? Dynamic : 1,\n    ColsAtCompileTime = IsColVector ? 1 : Dynamic,\n    MaxRowsAtCompileTime = RowsAtCompileTime,\n    MaxColsAtCompileTime = ColsAtCompileTime,\n    Flags = _Options | NestByRefBit | LvalueBit | (IsColVector ? 0 : RowMajorBit),\n    CoeffReadCost = NumTraits<Scalar>::ReadCost,\n    SupportedAccessPatterns = InnerRandomAccessPattern\n  };\n};\n\n// Sparse-Vector-Assignment kinds:\nenum {\n  SVA_RuntimeSwitch,\n  SVA_Inner,\n  SVA_Outer\n};\n\ntemplate< typename Dest, typename Src,\n          int AssignmentKind = !bool(Src::IsVectorAtCompileTime) ? SVA_RuntimeSwitch\n                             : Src::InnerSizeAtCompileTime==1 ? SVA_Outer\n                             : SVA_Inner>\nstruct sparse_vector_assign_selector;\n\n}\n\ntemplate<typename _Scalar, int _Options, typename _Index>\nclass SparseVector\n  : public SparseMatrixBase<SparseVector<_Scalar, _Options, _Index> >\n{\n    typedef SparseMatrixBase<SparseVector> SparseBase;\n    \n  public:\n    EIGEN_SPARSE_PUBLIC_INTERFACE(SparseVector)\n    EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(SparseVector, +=)\n    EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(SparseVector, -=)\n    \n    typedef internal::CompressedStorage<Scalar,Index> Storage;\n    enum { IsColVector = internal::traits<SparseVector>::IsColVector };\n    \n    enum {\n      Options = _Options\n    };\n    \n    EIGEN_STRONG_INLINE Index rows() const { return IsColVector ? m_size : 1; }\n    EIGEN_STRONG_INLINE Index cols() const { return IsColVector ? 1 : m_size; }\n    EIGEN_STRONG_INLINE Index innerSize() const { return m_size; }\n    EIGEN_STRONG_INLINE Index outerSize() const { return 1; }\n\n    EIGEN_STRONG_INLINE const Scalar* valuePtr() const { return m_data.valuePtr(); }\n    EIGEN_STRONG_INLINE Scalar* valuePtr() { return m_data.valuePtr(); }\n\n    EIGEN_STRONG_INLINE const Index* innerIndexPtr() const { return m_data.indexPtr(); }\n    EIGEN_STRONG_INLINE Index* innerIndexPtr() { return m_data.indexPtr(); }\n\n    /** \\internal */\n    inline Storage& data() { return m_data; }\n    /** \\internal */\n    inline const Storage& data() const { return m_data; }\n\n    inline Scalar coeff(Index row, Index col) const\n    {\n      eigen_assert(IsColVector ? (col==0 && row>=0 && row<m_size) : (row==0 && col>=0 && col<m_size));\n      return coeff(IsColVector ? row : col);\n    }\n    inline Scalar coeff(Index i) const\n    {\n      eigen_assert(i>=0 && i<m_size);\n      return m_data.at(i);\n    }\n\n    inline Scalar& coeffRef(Index row, Index col)\n    {\n      eigen_assert(IsColVector ? (col==0 && row>=0 && row<m_size) : (row==0 && col>=0 && col<m_size));\n      return coeff(IsColVector ? row : col);\n    }\n\n    /** \\returns a reference to the coefficient value at given index \\a i\n      * This operation involes a log(rho*size) binary search. If the coefficient does not\n      * exist yet, then a sorted insertion into a sequential buffer is performed.\n      *\n      * This insertion might be very costly if the number of nonzeros above \\a i is large.\n      */\n    inline Scalar& coeffRef(Index i)\n    {\n      eigen_assert(i>=0 && i<m_size);\n      return m_data.atWithInsertion(i);\n    }\n\n  public:\n\n    class InnerIterator;\n    class ReverseInnerIterator;\n\n    inline void setZero() { m_data.clear(); }\n\n    /** \\returns the number of non zero coefficients */\n    inline Index nonZeros() const  { return static_cast<Index>(m_data.size()); }\n\n    inline void startVec(Index outer)\n    {\n      EIGEN_UNUSED_VARIABLE(outer);\n      eigen_assert(outer==0);\n    }\n\n    inline Scalar& insertBackByOuterInner(Index outer, Index inner)\n    {\n      EIGEN_UNUSED_VARIABLE(outer);\n      eigen_assert(outer==0);\n      return insertBack(inner);\n    }\n    inline Scalar& insertBack(Index i)\n    {\n      m_data.append(0, i);\n      return m_data.value(m_data.size()-1);\n    }\n\n    inline Scalar& insert(Index row, Index col)\n    {\n      eigen_assert(IsColVector ? (col==0 && row>=0 && row<m_size) : (row==0 && col>=0 && col<m_size));\n      \n      Index inner = IsColVector ? row : col;\n      Index outer = IsColVector ? col : row;\n      EIGEN_ONLY_USED_FOR_DEBUG(outer);\n      eigen_assert(outer==0);\n      return insert(inner);\n    }\n    Scalar& insert(Index i)\n    {\n      eigen_assert(i>=0 && i<m_size);\n      \n      Index startId = 0;\n      Index p = Index(m_data.size()) - 1;\n      // TODO smart realloc\n      m_data.resize(p+2,1);\n\n      while ( (p >= startId) && (m_data.index(p) > i) )\n      {\n        m_data.index(p+1) = m_data.index(p);\n        m_data.value(p+1) = m_data.value(p);\n        --p;\n      }\n      m_data.index(p+1) = i;\n      m_data.value(p+1) = 0;\n      return m_data.value(p+1);\n    }\n\n    /**\n      */\n    inline void reserve(Index reserveSize) { m_data.reserve(reserveSize); }\n\n\n    inline void finalize() {}\n\n    void prune(const Scalar& reference, const RealScalar& epsilon = NumTraits<RealScalar>::dummy_precision())\n    {\n      m_data.prune(reference,epsilon);\n    }\n\n    void resize(Index rows, Index cols)\n    {\n      eigen_assert(rows==1 || cols==1);\n      resize(IsColVector ? rows : cols);\n    }\n\n    void resize(Index newSize)\n    {\n      m_size = newSize;\n      m_data.clear();\n    }\n\n    void resizeNonZeros(Index size) { m_data.resize(size); }\n\n    inline SparseVector() : m_size(0) { check_template_parameters(); resize(0); }\n\n    inline SparseVector(Index size) : m_size(0) { check_template_parameters(); resize(size); }\n\n    inline SparseVector(Index rows, Index cols) : m_size(0) { check_template_parameters(); resize(rows,cols); }\n\n    template<typename OtherDerived>\n    inline SparseVector(const SparseMatrixBase<OtherDerived>& other)\n      : m_size(0)\n    {\n      check_template_parameters();\n      *this = other.derived();\n    }\n\n    inline SparseVector(const SparseVector& other)\n      : SparseBase(other), m_size(0)\n    {\n      check_template_parameters();\n      *this = other.derived();\n    }\n\n    /** Swaps the values of \\c *this and \\a other.\n      * Overloaded for performance: this version performs a \\em shallow swap by swaping pointers and attributes only.\n      * \\sa SparseMatrixBase::swap()\n      */\n    inline void swap(SparseVector& other)\n    {\n      std::swap(m_size, other.m_size);\n      m_data.swap(other.m_data);\n    }\n\n    inline SparseVector& operator=(const SparseVector& other)\n    {\n      if (other.isRValue())\n      {\n        swap(other.const_cast_derived());\n      }\n      else\n      {\n        resize(other.size());\n        m_data = other.m_data;\n      }\n      return *this;\n    }\n\n    template<typename OtherDerived>\n    inline SparseVector& operator=(const SparseMatrixBase<OtherDerived>& other)\n    {\n      SparseVector tmp(other.size());\n      internal::sparse_vector_assign_selector<SparseVector,OtherDerived>::run(tmp,other.derived());\n      this->swap(tmp);\n      return *this;\n    }\n\n    #ifndef EIGEN_PARSED_BY_DOXYGEN\n    template<typename Lhs, typename Rhs>\n    inline SparseVector& operator=(const SparseSparseProduct<Lhs,Rhs>& product)\n    {\n      return Base::operator=(product);\n    }\n    #endif\n\n    friend std::ostream & operator << (std::ostream & s, const SparseVector& m)\n    {\n      for (Index i=0; i<m.nonZeros(); ++i)\n        s << \"(\" << m.m_data.value(i) << \",\" << m.m_data.index(i) << \") \";\n      s << std::endl;\n      return s;\n    }\n\n    /** Destructor */\n    inline ~SparseVector() {}\n\n    /** Overloaded for performance */\n    Scalar sum() const;\n\n  public:\n\n    /** \\internal \\deprecated use setZero() and reserve() */\n    EIGEN_DEPRECATED void startFill(Index reserve)\n    {\n      setZero();\n      m_data.reserve(reserve);\n    }\n\n    /** \\internal \\deprecated use insertBack(Index,Index) */\n    EIGEN_DEPRECATED Scalar& fill(Index r, Index c)\n    {\n      eigen_assert(r==0 || c==0);\n      return fill(IsColVector ? r : c);\n    }\n\n    /** \\internal \\deprecated use insertBack(Index) */\n    EIGEN_DEPRECATED Scalar& fill(Index i)\n    {\n      m_data.append(0, i);\n      return m_data.value(m_data.size()-1);\n    }\n\n    /** \\internal \\deprecated use insert(Index,Index) */\n    EIGEN_DEPRECATED Scalar& fillrand(Index r, Index c)\n    {\n      eigen_assert(r==0 || c==0);\n      return fillrand(IsColVector ? r : c);\n    }\n\n    /** \\internal \\deprecated use insert(Index) */\n    EIGEN_DEPRECATED Scalar& fillrand(Index i)\n    {\n      return insert(i);\n    }\n\n    /** \\internal \\deprecated use finalize() */\n    EIGEN_DEPRECATED void endFill() {}\n    \n    // These two functions were here in the 3.1 release, so let's keep them in case some code rely on them.\n    /** \\internal \\deprecated use data() */\n    EIGEN_DEPRECATED Storage& _data() { return m_data; }\n    /** \\internal \\deprecated use data() */\n    EIGEN_DEPRECATED const Storage& _data() const { return m_data; }\n    \n#   ifdef EIGEN_SPARSEVECTOR_PLUGIN\n#     include EIGEN_SPARSEVECTOR_PLUGIN\n#   endif\n\nprotected:\n  \n    static void check_template_parameters()\n    {\n      EIGEN_STATIC_ASSERT(NumTraits<Index>::IsSigned,THE_INDEX_TYPE_MUST_BE_A_SIGNED_TYPE);\n      EIGEN_STATIC_ASSERT((_Options&(ColMajor|RowMajor))==Options,INVALID_MATRIX_TEMPLATE_PARAMETERS);\n    }\n    \n    Storage m_data;\n    Index m_size;\n};\n\ntemplate<typename Scalar, int _Options, typename _Index>\nclass SparseVector<Scalar,_Options,_Index>::InnerIterator\n{\n  public:\n    InnerIterator(const SparseVector& vec, Index outer=0)\n      : m_data(vec.m_data), m_id(0), m_end(static_cast<Index>(m_data.size()))\n    {\n      EIGEN_UNUSED_VARIABLE(outer);\n      eigen_assert(outer==0);\n    }\n\n    InnerIterator(const internal::CompressedStorage<Scalar,Index>& data)\n      : m_data(data), m_id(0), m_end(static_cast<Index>(m_data.size()))\n    {}\n\n    inline InnerIterator& operator++() { m_id++; return *this; }\n\n    inline Scalar value() const { return m_data.value(m_id); }\n    inline Scalar& valueRef() { return const_cast<Scalar&>(m_data.value(m_id)); }\n\n    inline Index index() const { return m_data.index(m_id); }\n    inline Index row() const { return IsColVector ? index() : 0; }\n    inline Index col() const { return IsColVector ? 0 : index(); }\n\n    inline operator bool() const { return (m_id < m_end); }\n\n  protected:\n    const internal::CompressedStorage<Scalar,Index>& m_data;\n    Index m_id;\n    const Index m_end;\n};\n\ntemplate<typename Scalar, int _Options, typename _Index>\nclass SparseVector<Scalar,_Options,_Index>::ReverseInnerIterator\n{\n  public:\n    ReverseInnerIterator(const SparseVector& vec, Index outer=0)\n      : m_data(vec.m_data), m_id(static_cast<Index>(m_data.size())), m_start(0)\n    {\n      EIGEN_UNUSED_VARIABLE(outer);\n      eigen_assert(outer==0);\n    }\n\n    ReverseInnerIterator(const internal::CompressedStorage<Scalar,Index>& data)\n      : m_data(data), m_id(static_cast<Index>(m_data.size())), m_start(0)\n    {}\n\n    inline ReverseInnerIterator& operator--() { m_id--; return *this; }\n\n    inline Scalar value() const { return m_data.value(m_id-1); }\n    inline Scalar& valueRef() { return const_cast<Scalar&>(m_data.value(m_id-1)); }\n\n    inline Index index() const { return m_data.index(m_id-1); }\n    inline Index row() const { return IsColVector ? index() : 0; }\n    inline Index col() const { return IsColVector ? 0 : index(); }\n\n    inline operator bool() const { return (m_id > m_start); }\n\n  protected:\n    const internal::CompressedStorage<Scalar,Index>& m_data;\n    Index m_id;\n    const Index m_start;\n};\n\nnamespace internal {\n\ntemplate< typename Dest, typename Src>\nstruct sparse_vector_assign_selector<Dest,Src,SVA_Inner> {\n  static void run(Dest& dst, const Src& src) {\n    eigen_internal_assert(src.innerSize()==src.size());\n    for(typename Src::InnerIterator it(src, 0); it; ++it)\n      dst.insert(it.index()) = it.value();\n  }\n};\n\ntemplate< typename Dest, typename Src>\nstruct sparse_vector_assign_selector<Dest,Src,SVA_Outer> {\n  static void run(Dest& dst, const Src& src) {\n    eigen_internal_assert(src.outerSize()==src.size());\n    for(typename Dest::Index i=0; i<src.size(); ++i)\n    {\n      typename Src::InnerIterator it(src, i);\n      if(it)\n        dst.insert(i) = it.value();\n    }\n  }\n};\n\ntemplate< typename Dest, typename Src>\nstruct sparse_vector_assign_selector<Dest,Src,SVA_RuntimeSwitch> {\n  static void run(Dest& dst, const Src& src) {\n    if(src.outerSize()==1)  sparse_vector_assign_selector<Dest,Src,SVA_Inner>::run(dst, src);\n    else                    sparse_vector_assign_selector<Dest,Src,SVA_Outer>::run(dst, src);\n  }\n};\n\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_SPARSEVECTOR_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseCore/SparseView.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2011 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2010 Daniel Lowengrub <lowdanie@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SPARSEVIEW_H\n#define EIGEN_SPARSEVIEW_H\n\nnamespace Eigen { \n\nnamespace internal {\n\ntemplate<typename MatrixType>\nstruct traits<SparseView<MatrixType> > : traits<MatrixType>\n{\n  typedef typename MatrixType::Index Index;\n  typedef Sparse StorageKind;\n  enum {\n    Flags = int(traits<MatrixType>::Flags) & (RowMajorBit)\n  };\n};\n\n} // end namespace internal\n\ntemplate<typename MatrixType>\nclass SparseView : public SparseMatrixBase<SparseView<MatrixType> >\n{\n  typedef typename MatrixType::Nested MatrixTypeNested;\n  typedef typename internal::remove_all<MatrixTypeNested>::type _MatrixTypeNested;\npublic:\n  EIGEN_SPARSE_PUBLIC_INTERFACE(SparseView)\n\n  explicit SparseView(const MatrixType& mat, const Scalar& reference = Scalar(0),\n                      const RealScalar &epsilon = NumTraits<Scalar>::dummy_precision())\n    : m_matrix(mat), m_reference(reference), m_epsilon(epsilon) {}\n\n  class InnerIterator;\n\n  inline Index rows() const { return m_matrix.rows(); }\n  inline Index cols() const { return m_matrix.cols(); }\n\n  inline Index innerSize() const { return m_matrix.innerSize(); }\n  inline Index outerSize() const { return m_matrix.outerSize(); }\n\nprotected:\n  MatrixTypeNested m_matrix;\n  Scalar m_reference;\n  typename NumTraits<Scalar>::Real m_epsilon;\n};\n\ntemplate<typename MatrixType>\nclass SparseView<MatrixType>::InnerIterator : public _MatrixTypeNested::InnerIterator\n{\n  typedef typename SparseView::Index Index;\npublic:\n  typedef typename _MatrixTypeNested::InnerIterator IterBase;\n  InnerIterator(const SparseView& view, Index outer) :\n  IterBase(view.m_matrix, outer), m_view(view)\n  {\n    incrementToNonZero();\n  }\n\n  EIGEN_STRONG_INLINE InnerIterator& operator++()\n  {\n    IterBase::operator++();\n    incrementToNonZero();\n    return *this;\n  }\n\n  using IterBase::value;\n\nprotected:\n  const SparseView& m_view;\n\nprivate:\n  void incrementToNonZero()\n  {\n    while((bool(*this)) && internal::isMuchSmallerThan(value(), m_view.m_reference, m_view.m_epsilon))\n    {\n      IterBase::operator++();\n    }\n  }\n};\n\ntemplate<typename Derived>\nconst SparseView<Derived> MatrixBase<Derived>::sparseView(const Scalar& m_reference,\n                                                          const typename NumTraits<Scalar>::Real& m_epsilon) const\n{\n  return SparseView<Derived>(derived(), m_reference, m_epsilon);\n}\n\n} // end namespace Eigen\n\n#endif\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseCore/TriangularSolver.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SPARSETRIANGULARSOLVER_H\n#define EIGEN_SPARSETRIANGULARSOLVER_H\n\nnamespace Eigen { \n\nnamespace internal {\n\ntemplate<typename Lhs, typename Rhs, int Mode,\n  int UpLo = (Mode & Lower)\n           ? Lower\n           : (Mode & Upper)\n           ? Upper\n           : -1,\n  int StorageOrder = int(traits<Lhs>::Flags) & RowMajorBit>\nstruct sparse_solve_triangular_selector;\n\n// forward substitution, row-major\ntemplate<typename Lhs, typename Rhs, int Mode>\nstruct sparse_solve_triangular_selector<Lhs,Rhs,Mode,Lower,RowMajor>\n{\n  typedef typename Rhs::Scalar Scalar;\n  static void run(const Lhs& lhs, Rhs& other)\n  {\n    for(int col=0 ; col<other.cols() ; ++col)\n    {\n      for(int i=0; i<lhs.rows(); ++i)\n      {\n        Scalar tmp = other.coeff(i,col);\n        Scalar lastVal(0);\n        int lastIndex = 0;\n        for(typename Lhs::InnerIterator it(lhs, i); it; ++it)\n        {\n          lastVal = it.value();\n          lastIndex = it.index();\n          if(lastIndex==i)\n            break;\n          tmp -= lastVal * other.coeff(lastIndex,col);\n        }\n        if (Mode & UnitDiag)\n          other.coeffRef(i,col) = tmp;\n        else\n        {\n          eigen_assert(lastIndex==i);\n          other.coeffRef(i,col) = tmp/lastVal;\n        }\n      }\n    }\n  }\n};\n\n// backward substitution, row-major\ntemplate<typename Lhs, typename Rhs, int Mode>\nstruct sparse_solve_triangular_selector<Lhs,Rhs,Mode,Upper,RowMajor>\n{\n  typedef typename Rhs::Scalar Scalar;\n  static void run(const Lhs& lhs, Rhs& other)\n  {\n    for(int col=0 ; col<other.cols() ; ++col)\n    {\n      for(int i=lhs.rows()-1 ; i>=0 ; --i)\n      {\n        Scalar tmp = other.coeff(i,col);\n        Scalar l_ii(0);\n        typename Lhs::InnerIterator it(lhs, i);\n        while(it && it.index()<i)\n          ++it;\n        if(!(Mode & UnitDiag))\n        {\n          eigen_assert(it && it.index()==i);\n          l_ii = it.value();\n          ++it;\n        }\n        else if (it && it.index() == i)\n          ++it;\n        for(; it; ++it)\n        {\n          tmp -= it.value() * other.coeff(it.index(),col);\n        }\n\n        if (Mode & UnitDiag)\n          other.coeffRef(i,col) = tmp;\n        else\n          other.coeffRef(i,col) = tmp/l_ii;\n      }\n    }\n  }\n};\n\n// forward substitution, col-major\ntemplate<typename Lhs, typename Rhs, int Mode>\nstruct sparse_solve_triangular_selector<Lhs,Rhs,Mode,Lower,ColMajor>\n{\n  typedef typename Rhs::Scalar Scalar;\n  static void run(const Lhs& lhs, Rhs& other)\n  {\n    for(int col=0 ; col<other.cols() ; ++col)\n    {\n      for(int i=0; i<lhs.cols(); ++i)\n      {\n        Scalar& tmp = other.coeffRef(i,col);\n        if (tmp!=Scalar(0)) // optimization when other is actually sparse\n        {\n          typename Lhs::InnerIterator it(lhs, i);\n          while(it && it.index()<i)\n            ++it;\n          if(!(Mode & UnitDiag))\n          {\n            eigen_assert(it && it.index()==i);\n            tmp /= it.value();\n          }\n          if (it && it.index()==i)\n            ++it;\n          for(; it; ++it)\n            other.coeffRef(it.index(), col) -= tmp * it.value();\n        }\n      }\n    }\n  }\n};\n\n// backward substitution, col-major\ntemplate<typename Lhs, typename Rhs, int Mode>\nstruct sparse_solve_triangular_selector<Lhs,Rhs,Mode,Upper,ColMajor>\n{\n  typedef typename Rhs::Scalar Scalar;\n  static void run(const Lhs& lhs, Rhs& other)\n  {\n    for(int col=0 ; col<other.cols() ; ++col)\n    {\n      for(int i=lhs.cols()-1; i>=0; --i)\n      {\n        Scalar& tmp = other.coeffRef(i,col);\n        if (tmp!=Scalar(0)) // optimization when other is actually sparse\n        {\n          if(!(Mode & UnitDiag))\n          {\n            // TODO replace this by a binary search. make sure the binary search is safe for partially sorted elements\n            typename Lhs::ReverseInnerIterator it(lhs, i);\n            while(it && it.index()!=i)\n              --it;\n            eigen_assert(it && it.index()==i);\n            other.coeffRef(i,col) /= it.value();\n          }\n          typename Lhs::InnerIterator it(lhs, i);\n          for(; it && it.index()<i; ++it)\n            other.coeffRef(it.index(), col) -= tmp * it.value();\n        }\n      }\n    }\n  }\n};\n\n} // end namespace internal\n\ntemplate<typename ExpressionType,int Mode>\ntemplate<typename OtherDerived>\nvoid SparseTriangularView<ExpressionType,Mode>::solveInPlace(MatrixBase<OtherDerived>& other) const\n{\n  eigen_assert(m_matrix.cols() == m_matrix.rows() && m_matrix.cols() == other.rows());\n  eigen_assert((!(Mode & ZeroDiag)) && bool(Mode & (Upper|Lower)));\n\n  enum { copy = internal::traits<OtherDerived>::Flags & RowMajorBit };\n\n  typedef typename internal::conditional<copy,\n    typename internal::plain_matrix_type_column_major<OtherDerived>::type, OtherDerived&>::type OtherCopy;\n  OtherCopy otherCopy(other.derived());\n\n  internal::sparse_solve_triangular_selector<ExpressionType, typename internal::remove_reference<OtherCopy>::type, Mode>::run(m_matrix, otherCopy);\n\n  if (copy)\n    other = otherCopy;\n}\n\ntemplate<typename ExpressionType,int Mode>\ntemplate<typename OtherDerived>\ntypename internal::plain_matrix_type_column_major<OtherDerived>::type\nSparseTriangularView<ExpressionType,Mode>::solve(const MatrixBase<OtherDerived>& other) const\n{\n  typename internal::plain_matrix_type_column_major<OtherDerived>::type res(other);\n  solveInPlace(res);\n  return res;\n}\n\n// pure sparse path\n\nnamespace internal {\n\ntemplate<typename Lhs, typename Rhs, int Mode,\n  int UpLo = (Mode & Lower)\n           ? Lower\n           : (Mode & Upper)\n           ? Upper\n           : -1,\n  int StorageOrder = int(Lhs::Flags) & (RowMajorBit)>\nstruct sparse_solve_triangular_sparse_selector;\n\n// forward substitution, col-major\ntemplate<typename Lhs, typename Rhs, int Mode, int UpLo>\nstruct sparse_solve_triangular_sparse_selector<Lhs,Rhs,Mode,UpLo,ColMajor>\n{\n  typedef typename Rhs::Scalar Scalar;\n  typedef typename promote_index_type<typename traits<Lhs>::Index,\n                                         typename traits<Rhs>::Index>::type Index;\n  static void run(const Lhs& lhs, Rhs& other)\n  {\n    const bool IsLower = (UpLo==Lower);\n    AmbiVector<Scalar,Index> tempVector(other.rows()*2);\n    tempVector.setBounds(0,other.rows());\n\n    Rhs res(other.rows(), other.cols());\n    res.reserve(other.nonZeros());\n\n    for(int col=0 ; col<other.cols() ; ++col)\n    {\n      // FIXME estimate number of non zeros\n      tempVector.init(.99/*float(other.col(col).nonZeros())/float(other.rows())*/);\n      tempVector.setZero();\n      tempVector.restart();\n      for (typename Rhs::InnerIterator rhsIt(other, col); rhsIt; ++rhsIt)\n      {\n        tempVector.coeffRef(rhsIt.index()) = rhsIt.value();\n      }\n\n      for(int i=IsLower?0:lhs.cols()-1;\n          IsLower?i<lhs.cols():i>=0;\n          i+=IsLower?1:-1)\n      {\n        tempVector.restart();\n        Scalar& ci = tempVector.coeffRef(i);\n        if (ci!=Scalar(0))\n        {\n          // find\n          typename Lhs::InnerIterator it(lhs, i);\n          if(!(Mode & UnitDiag))\n          {\n            if (IsLower)\n            {\n              eigen_assert(it.index()==i);\n              ci /= it.value();\n            }\n            else\n              ci /= lhs.coeff(i,i);\n          }\n          tempVector.restart();\n          if (IsLower)\n          {\n            if (it.index()==i)\n              ++it;\n            for(; it; ++it)\n              tempVector.coeffRef(it.index()) -= ci * it.value();\n          }\n          else\n          {\n            for(; it && it.index()<i; ++it)\n              tempVector.coeffRef(it.index()) -= ci * it.value();\n          }\n        }\n      }\n\n\n      int count = 0;\n      // FIXME compute a reference value to filter zeros\n      for (typename AmbiVector<Scalar,Index>::Iterator it(tempVector/*,1e-12*/); it; ++it)\n      {\n        ++ count;\n//         std::cerr << \"fill \" << it.index() << \", \" << col << \"\\n\";\n//         std::cout << it.value() << \"  \";\n        // FIXME use insertBack\n        res.insert(it.index(), col) = it.value();\n      }\n//       std::cout << \"tempVector.nonZeros() == \" << int(count) << \" / \" << (other.rows()) << \"\\n\";\n    }\n    res.finalize();\n    other = res.markAsRValue();\n  }\n};\n\n} // end namespace internal\n\ntemplate<typename ExpressionType,int Mode>\ntemplate<typename OtherDerived>\nvoid SparseTriangularView<ExpressionType,Mode>::solveInPlace(SparseMatrixBase<OtherDerived>& other) const\n{\n  eigen_assert(m_matrix.cols() == m_matrix.rows() && m_matrix.cols() == other.rows());\n  eigen_assert( (!(Mode & ZeroDiag)) && bool(Mode & (Upper|Lower)));\n\n//   enum { copy = internal::traits<OtherDerived>::Flags & RowMajorBit };\n\n//   typedef typename internal::conditional<copy,\n//     typename internal::plain_matrix_type_column_major<OtherDerived>::type, OtherDerived&>::type OtherCopy;\n//   OtherCopy otherCopy(other.derived());\n\n  internal::sparse_solve_triangular_sparse_selector<ExpressionType, OtherDerived, Mode>::run(m_matrix, other.derived());\n\n//   if (copy)\n//     other = otherCopy;\n}\n\n#ifdef EIGEN2_SUPPORT\n\n// deprecated stuff:\n\n/** \\deprecated */\ntemplate<typename Derived>\ntemplate<typename OtherDerived>\nvoid SparseMatrixBase<Derived>::solveTriangularInPlace(MatrixBase<OtherDerived>& other) const\n{\n  this->template triangular<Flags&(Upper|Lower)>().solveInPlace(other);\n}\n\n/** \\deprecated */\ntemplate<typename Derived>\ntemplate<typename OtherDerived>\ntypename internal::plain_matrix_type_column_major<OtherDerived>::type\nSparseMatrixBase<Derived>::solveTriangular(const MatrixBase<OtherDerived>& other) const\n{\n  typename internal::plain_matrix_type_column_major<OtherDerived>::type res(other);\n  derived().solveTriangularInPlace(res);\n  return res;\n}\n#endif // EIGEN2_SUPPORT\n\n} // end namespace Eigen\n\n#endif // EIGEN_SPARSETRIANGULARSOLVER_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseLU/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_SparseLU_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_SparseLU_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/SparseLU COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseLU/SparseLU.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam@inria.fr>\n// Copyright (C) 2012 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n#ifndef EIGEN_SPARSE_LU_H\n#define EIGEN_SPARSE_LU_H\n\nnamespace Eigen {\n\ntemplate <typename _MatrixType, typename _OrderingType = COLAMDOrdering<typename _MatrixType::Index> > class SparseLU;\ntemplate <typename MappedSparseMatrixType> struct SparseLUMatrixLReturnType;\ntemplate <typename MatrixLType, typename MatrixUType> struct SparseLUMatrixUReturnType;\n\n/** \\ingroup SparseLU_Module\n  * \\class SparseLU\n  * \n  * \\brief Sparse supernodal LU factorization for general matrices\n  * \n  * This class implements the supernodal LU factorization for general matrices.\n  * It uses the main techniques from the sequential SuperLU package \n  * (http://crd-legacy.lbl.gov/~xiaoye/SuperLU/). It handles transparently real \n  * and complex arithmetics with single and double precision, depending on the \n  * scalar type of your input matrix. \n  * The code has been optimized to provide BLAS-3 operations during supernode-panel updates. \n  * It benefits directly from the built-in high-performant Eigen BLAS routines. \n  * Moreover, when the size of a supernode is very small, the BLAS calls are avoided to \n  * enable a better optimization from the compiler. For best performance, \n  * you should compile it with NDEBUG flag to avoid the numerous bounds checking on vectors. \n  * \n  * An important parameter of this class is the ordering method. It is used to reorder the columns \n  * (and eventually the rows) of the matrix to reduce the number of new elements that are created during \n  * numerical factorization. The cheapest method available is COLAMD. \n  * See  \\link OrderingMethods_Module the OrderingMethods module \\endlink for the list of \n  * built-in and external ordering methods. \n  *\n  * Simple example with key steps \n  * \\code\n  * VectorXd x(n), b(n);\n  * SparseMatrix<double, ColMajor> A;\n  * SparseLU<SparseMatrix<scalar, ColMajor>, COLAMDOrdering<Index> >   solver;\n  * // fill A and b;\n  * // Compute the ordering permutation vector from the structural pattern of A\n  * solver.analyzePattern(A); \n  * // Compute the numerical factorization \n  * solver.factorize(A); \n  * //Use the factors to solve the linear system \n  * x = solver.solve(b); \n  * \\endcode\n  * \n  * \\warning The input matrix A should be in a \\b compressed and \\b column-major form.\n  * Otherwise an expensive copy will be made. You can call the inexpensive makeCompressed() to get a compressed matrix.\n  * \n  * \\note Unlike the initial SuperLU implementation, there is no step to equilibrate the matrix. \n  * For badly scaled matrices, this step can be useful to reduce the pivoting during factorization. \n  * If this is the case for your matrices, you can try the basic scaling method at\n  *  \"unsupported/Eigen/src/IterativeSolvers/Scaling.h\"\n  * \n  * \\tparam _MatrixType The type of the sparse matrix. It must be a column-major SparseMatrix<>\n  * \\tparam _OrderingType The ordering method to use, either AMD, COLAMD or METIS. Default is COLMAD\n  * \n  * \n  * \\sa \\ref TutorialSparseDirectSolvers\n  * \\sa \\ref OrderingMethods_Module\n  */\ntemplate <typename _MatrixType, typename _OrderingType>\nclass SparseLU : public internal::SparseLUImpl<typename _MatrixType::Scalar, typename _MatrixType::Index>\n{\n  public:\n    typedef _MatrixType MatrixType; \n    typedef _OrderingType OrderingType;\n    typedef typename MatrixType::Scalar Scalar; \n    typedef typename MatrixType::RealScalar RealScalar; \n    typedef typename MatrixType::Index Index; \n    typedef SparseMatrix<Scalar,ColMajor,Index> NCMatrix;\n    typedef internal::MappedSuperNodalMatrix<Scalar, Index> SCMatrix; \n    typedef Matrix<Scalar,Dynamic,1> ScalarVector;\n    typedef Matrix<Index,Dynamic,1> IndexVector;\n    typedef PermutationMatrix<Dynamic, Dynamic, Index> PermutationType;\n    typedef internal::SparseLUImpl<Scalar, Index> Base;\n    \n  public:\n    SparseLU():m_isInitialized(true),m_lastError(\"\"),m_Ustore(0,0,0,0,0,0),m_symmetricmode(false),m_diagpivotthresh(1.0),m_detPermR(1)\n    {\n      initperfvalues(); \n    }\n    SparseLU(const MatrixType& matrix):m_isInitialized(true),m_lastError(\"\"),m_Ustore(0,0,0,0,0,0),m_symmetricmode(false),m_diagpivotthresh(1.0),m_detPermR(1)\n    {\n      initperfvalues(); \n      compute(matrix);\n    }\n    \n    ~SparseLU()\n    {\n      // Free all explicit dynamic pointers \n    }\n    \n    void analyzePattern (const MatrixType& matrix);\n    void factorize (const MatrixType& matrix);\n    void simplicialfactorize(const MatrixType& matrix);\n    \n    /**\n      * Compute the symbolic and numeric factorization of the input sparse matrix.\n      * The input matrix should be in column-major storage. \n      */\n    void compute (const MatrixType& matrix)\n    {\n      // Analyze \n      analyzePattern(matrix); \n      //Factorize\n      factorize(matrix);\n    } \n    \n    inline Index rows() const { return m_mat.rows(); }\n    inline Index cols() const { return m_mat.cols(); }\n    /** Indicate that the pattern of the input matrix is symmetric */\n    void isSymmetric(bool sym)\n    {\n      m_symmetricmode = sym;\n    }\n    \n    /** \\returns an expression of the matrix L, internally stored as supernodes\n      * The only operation available with this expression is the triangular solve\n      * \\code\n      * y = b; matrixL().solveInPlace(y);\n      * \\endcode\n      */\n    SparseLUMatrixLReturnType<SCMatrix> matrixL() const\n    {\n      return SparseLUMatrixLReturnType<SCMatrix>(m_Lstore);\n    }\n    /** \\returns an expression of the matrix U,\n      * The only operation available with this expression is the triangular solve\n      * \\code\n      * y = b; matrixU().solveInPlace(y);\n      * \\endcode\n      */\n    SparseLUMatrixUReturnType<SCMatrix,MappedSparseMatrix<Scalar,ColMajor,Index> > matrixU() const\n    {\n      return SparseLUMatrixUReturnType<SCMatrix, MappedSparseMatrix<Scalar,ColMajor,Index> >(m_Lstore, m_Ustore);\n    }\n\n    /**\n      * \\returns a reference to the row matrix permutation \\f$ P_r \\f$ such that \\f$P_r A P_c^T = L U\\f$\n      * \\sa colsPermutation()\n      */\n    inline const PermutationType& rowsPermutation() const\n    {\n      return m_perm_r;\n    }\n    /**\n      * \\returns a reference to the column matrix permutation\\f$ P_c^T \\f$ such that \\f$P_r A P_c^T = L U\\f$\n      * \\sa rowsPermutation()\n      */\n    inline const PermutationType& colsPermutation() const\n    {\n      return m_perm_c;\n    }\n    /** Set the threshold used for a diagonal entry to be an acceptable pivot. */\n    void setPivotThreshold(const RealScalar& thresh)\n    {\n      m_diagpivotthresh = thresh; \n    }\n\n    /** \\returns the solution X of \\f$ A X = B \\f$ using the current decomposition of A.\n      *\n      * \\warning the destination matrix X in X = this->solve(B) must be colmun-major.\n      *\n      * \\sa compute()\n      */\n    template<typename Rhs>\n    inline const internal::solve_retval<SparseLU, Rhs> solve(const MatrixBase<Rhs>& B) const \n    {\n      eigen_assert(m_factorizationIsOk && \"SparseLU is not initialized.\"); \n      eigen_assert(rows()==B.rows()\n                    && \"SparseLU::solve(): invalid number of rows of the right hand side matrix B\");\n          return internal::solve_retval<SparseLU, Rhs>(*this, B.derived());\n    }\n\n    /** \\returns the solution X of \\f$ A X = B \\f$ using the current decomposition of A.\n      *\n      * \\sa compute()\n      */\n    template<typename Rhs>\n    inline const internal::sparse_solve_retval<SparseLU, Rhs> solve(const SparseMatrixBase<Rhs>& B) const \n    {\n      eigen_assert(m_factorizationIsOk && \"SparseLU is not initialized.\"); \n      eigen_assert(rows()==B.rows()\n                    && \"SparseLU::solve(): invalid number of rows of the right hand side matrix B\");\n          return internal::sparse_solve_retval<SparseLU, Rhs>(*this, B.derived());\n    }\n    \n    /** \\brief Reports whether previous computation was successful.\n      *\n      * \\returns \\c Success if computation was succesful,\n      *          \\c NumericalIssue if the LU factorization reports a problem, zero diagonal for instance\n      *          \\c InvalidInput if the input matrix is invalid\n      *\n      * \\sa iparm()          \n      */\n    ComputationInfo info() const\n    {\n      eigen_assert(m_isInitialized && \"Decomposition is not initialized.\");\n      return m_info;\n    }\n    \n    /**\n      * \\returns A string describing the type of error\n      */\n    std::string lastErrorMessage() const\n    {\n      return m_lastError; \n    }\n\n    template<typename Rhs, typename Dest>\n    bool _solve(const MatrixBase<Rhs> &B, MatrixBase<Dest> &X_base) const\n    {\n      Dest& X(X_base.derived());\n      eigen_assert(m_factorizationIsOk && \"The matrix should be factorized first\");\n      EIGEN_STATIC_ASSERT((Dest::Flags&RowMajorBit)==0,\n                        THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES);\n      \n      // Permute the right hand side to form X = Pr*B\n      // on return, X is overwritten by the computed solution\n      X.resize(B.rows(),B.cols());\n\n      // this ugly const_cast_derived() helps to detect aliasing when applying the permutations\n      for(Index j = 0; j < B.cols(); ++j)\n        X.col(j) = rowsPermutation() * B.const_cast_derived().col(j);\n      \n      //Forward substitution with L\n      this->matrixL().solveInPlace(X);\n      this->matrixU().solveInPlace(X);\n      \n      // Permute back the solution \n      for (Index j = 0; j < B.cols(); ++j)\n        X.col(j) = colsPermutation().inverse() * X.col(j);\n      \n      return true; \n    }\n    \n    /**\n      * \\returns the absolute value of the determinant of the matrix of which\n      * *this is the QR decomposition.\n      *\n      * \\warning a determinant can be very big or small, so for matrices\n      * of large enough dimension, there is a risk of overflow/underflow.\n      * One way to work around that is to use logAbsDeterminant() instead.\n      *\n      * \\sa logAbsDeterminant(), signDeterminant()\n      */\n     Scalar absDeterminant()\n    {\n      eigen_assert(m_factorizationIsOk && \"The matrix should be factorized first.\");\n      // Initialize with the determinant of the row matrix\n      Scalar det = Scalar(1.);\n      // Note that the diagonal blocks of U are stored in supernodes,\n      // which are available in the  L part :)\n      for (Index j = 0; j < this->cols(); ++j)\n      {\n        for (typename SCMatrix::InnerIterator it(m_Lstore, j); it; ++it)\n        {\n          if(it.index() == j)\n          {\n            using std::abs;\n            det *= abs(it.value());\n            break;\n          }\n        }\n       }\n       return det;\n     }\n\n     /** \\returns the natural log of the absolute value of the determinant of the matrix\n       * of which **this is the QR decomposition\n       *\n       * \\note This method is useful to work around the risk of overflow/underflow that's\n       * inherent to the determinant computation.\n       *\n       * \\sa absDeterminant(), signDeterminant()\n       */\n     Scalar logAbsDeterminant() const\n     {\n       eigen_assert(m_factorizationIsOk && \"The matrix should be factorized first.\");\n       Scalar det = Scalar(0.);\n       for (Index j = 0; j < this->cols(); ++j)\n       {\n         for (typename SCMatrix::InnerIterator it(m_Lstore, j); it; ++it)\n         {\n           if(it.row() < j) continue;\n           if(it.row() == j)\n           {\n             using std::log; using std::abs;\n             det += log(abs(it.value()));\n             break;\n           }\n         }\n       }\n       return det;\n     }\n\n    /** \\returns A number representing the sign of the determinant\n      *\n      * \\sa absDeterminant(), logAbsDeterminant()\n      */\n    Scalar signDeterminant()\n    {\n      eigen_assert(m_factorizationIsOk && \"The matrix should be factorized first.\");\n      // Initialize with the determinant of the row matrix\n      Index det = 1;\n      // Note that the diagonal blocks of U are stored in supernodes,\n      // which are available in the  L part :)\n      for (Index j = 0; j < this->cols(); ++j)\n      {\n        for (typename SCMatrix::InnerIterator it(m_Lstore, j); it; ++it)\n        {\n          if(it.index() == j)\n          {\n            if(it.value()<0)\n              det = -det;\n            else if(it.value()==0)\n              return 0;\n            break;\n          }\n        }\n      }\n      return det * m_detPermR * m_detPermC;\n    }\n    \n    /** \\returns The determinant of the matrix.\n      *\n      * \\sa absDeterminant(), logAbsDeterminant()\n      */\n    Scalar determinant()\n    {\n      eigen_assert(m_factorizationIsOk && \"The matrix should be factorized first.\");\n      // Initialize with the determinant of the row matrix\n      Scalar det = Scalar(1.);\n      // Note that the diagonal blocks of U are stored in supernodes,\n      // which are available in the  L part :)\n      for (Index j = 0; j < this->cols(); ++j)\n      {\n        for (typename SCMatrix::InnerIterator it(m_Lstore, j); it; ++it)\n        {\n          if(it.index() == j)\n          {\n            det *= it.value();\n            break;\n          }\n        }\n      }\n      return det * Scalar(m_detPermR * m_detPermC);\n    }\n\n  protected:\n    // Functions \n    void initperfvalues()\n    {\n      m_perfv.panel_size = 16;\n      m_perfv.relax = 1; \n      m_perfv.maxsuper = 128; \n      m_perfv.rowblk = 16; \n      m_perfv.colblk = 8; \n      m_perfv.fillfactor = 20;  \n    }\n      \n    // Variables \n    mutable ComputationInfo m_info;\n    bool m_isInitialized;\n    bool m_factorizationIsOk;\n    bool m_analysisIsOk;\n    std::string m_lastError;\n    NCMatrix m_mat; // The input (permuted ) matrix \n    SCMatrix m_Lstore; // The lower triangular matrix (supernodal)\n    MappedSparseMatrix<Scalar,ColMajor,Index> m_Ustore; // The upper triangular matrix\n    PermutationType m_perm_c; // Column permutation \n    PermutationType m_perm_r ; // Row permutation\n    IndexVector m_etree; // Column elimination tree \n    \n    typename Base::GlobalLU_t m_glu; \n                               \n    // SparseLU options \n    bool m_symmetricmode;\n    // values for performance \n    internal::perfvalues<Index> m_perfv; \n    RealScalar m_diagpivotthresh; // Specifies the threshold used for a diagonal entry to be an acceptable pivot\n    Index m_nnzL, m_nnzU; // Nonzeros in L and U factors\n    Index m_detPermR, m_detPermC; // Determinants of the permutation matrices\n  private:\n    // Disable copy constructor \n    SparseLU (const SparseLU& );\n  \n}; // End class SparseLU\n\n\n\n// Functions needed by the anaysis phase\n/** \n  * Compute the column permutation to minimize the fill-in\n  * \n  *  - Apply this permutation to the input matrix - \n  * \n  *  - Compute the column elimination tree on the permuted matrix \n  * \n  *  - Postorder the elimination tree and the column permutation\n  * \n  */\ntemplate <typename MatrixType, typename OrderingType>\nvoid SparseLU<MatrixType, OrderingType>::analyzePattern(const MatrixType& mat)\n{\n  \n  //TODO  It is possible as in SuperLU to compute row and columns scaling vectors to equilibrate the matrix mat.\n  \n  OrderingType ord; \n  ord(mat,m_perm_c);\n  \n  // Apply the permutation to the column of the input  matrix\n  //First copy the whole input matrix. \n  m_mat = mat;\n  if (m_perm_c.size()) {\n    m_mat.uncompress(); //NOTE: The effect of this command is only to create the InnerNonzeros pointers. FIXME : This vector is filled but not subsequently used.  \n    //Then, permute only the column pointers\n    const Index * outerIndexPtr;\n    if (mat.isCompressed()) outerIndexPtr = mat.outerIndexPtr();\n    else\n    {\n      Index *outerIndexPtr_t = new Index[mat.cols()+1];\n      for(Index i = 0; i <= mat.cols(); i++) outerIndexPtr_t[i] = m_mat.outerIndexPtr()[i];\n      outerIndexPtr = outerIndexPtr_t;\n    }\n    for (Index i = 0; i < mat.cols(); i++)\n    {\n      m_mat.outerIndexPtr()[m_perm_c.indices()(i)] = outerIndexPtr[i];\n      m_mat.innerNonZeroPtr()[m_perm_c.indices()(i)] = outerIndexPtr[i+1] - outerIndexPtr[i];\n    }\n    if(!mat.isCompressed()) delete[] outerIndexPtr;\n  }\n  // Compute the column elimination tree of the permuted matrix \n  IndexVector firstRowElt;\n  internal::coletree(m_mat, m_etree,firstRowElt); \n     \n  // In symmetric mode, do not do postorder here\n  if (!m_symmetricmode) {\n    IndexVector post, iwork; \n    // Post order etree\n    internal::treePostorder(m_mat.cols(), m_etree, post); \n      \n   \n    // Renumber etree in postorder \n    Index m = m_mat.cols(); \n    iwork.resize(m+1);\n    for (Index i = 0; i < m; ++i) iwork(post(i)) = post(m_etree(i));\n    m_etree = iwork;\n    \n    // Postmultiply A*Pc by post, i.e reorder the matrix according to the postorder of the etree\n    PermutationType post_perm(m); \n    for (Index i = 0; i < m; i++) \n      post_perm.indices()(i) = post(i); \n        \n    // Combine the two permutations : postorder the permutation for future use\n    if(m_perm_c.size()) {\n      m_perm_c = post_perm * m_perm_c;\n    }\n    \n  } // end postordering \n  \n  m_analysisIsOk = true; \n}\n\n// Functions needed by the numerical factorization phase\n\n\n/** \n  *  - Numerical factorization \n  *  - Interleaved with the symbolic factorization \n  * On exit,  info is \n  * \n  *    = 0: successful factorization\n  * \n  *    > 0: if info = i, and i is\n  * \n  *       <= A->ncol: U(i,i) is exactly zero. The factorization has\n  *          been completed, but the factor U is exactly singular,\n  *          and division by zero will occur if it is used to solve a\n  *          system of equations.\n  * \n  *       > A->ncol: number of bytes allocated when memory allocation\n  *         failure occurred, plus A->ncol. If lwork = -1, it is\n  *         the estimated amount of space needed, plus A->ncol.  \n  */\ntemplate <typename MatrixType, typename OrderingType>\nvoid SparseLU<MatrixType, OrderingType>::factorize(const MatrixType& matrix)\n{\n  using internal::emptyIdxLU;\n  eigen_assert(m_analysisIsOk && \"analyzePattern() should be called first\"); \n  eigen_assert((matrix.rows() == matrix.cols()) && \"Only for squared matrices\");\n  \n  typedef typename IndexVector::Scalar Index; \n  \n  \n  // Apply the column permutation computed in analyzepattern()\n  //   m_mat = matrix * m_perm_c.inverse(); \n  m_mat = matrix;\n  if (m_perm_c.size()) \n  {\n    m_mat.uncompress(); //NOTE: The effect of this command is only to create the InnerNonzeros pointers.\n    //Then, permute only the column pointers\n    const Index * outerIndexPtr;\n    if (matrix.isCompressed()) outerIndexPtr = matrix.outerIndexPtr();\n    else\n    {\n      Index* outerIndexPtr_t = new Index[matrix.cols()+1];\n      for(Index i = 0; i <= matrix.cols(); i++) outerIndexPtr_t[i] = m_mat.outerIndexPtr()[i];\n      outerIndexPtr = outerIndexPtr_t;\n    }\n    for (Index i = 0; i < matrix.cols(); i++)\n    {\n      m_mat.outerIndexPtr()[m_perm_c.indices()(i)] = outerIndexPtr[i];\n      m_mat.innerNonZeroPtr()[m_perm_c.indices()(i)] = outerIndexPtr[i+1] - outerIndexPtr[i];\n    }\n    if(!matrix.isCompressed()) delete[] outerIndexPtr;\n  } \n  else \n  { //FIXME This should not be needed if the empty permutation is handled transparently\n    m_perm_c.resize(matrix.cols());\n    for(Index i = 0; i < matrix.cols(); ++i) m_perm_c.indices()(i) = i;\n  }\n  \n  Index m = m_mat.rows();\n  Index n = m_mat.cols();\n  Index nnz = m_mat.nonZeros();\n  Index maxpanel = m_perfv.panel_size * m;\n  // Allocate working storage common to the factor routines\n  Index lwork = 0;\n  Index info = Base::memInit(m, n, nnz, lwork, m_perfv.fillfactor, m_perfv.panel_size, m_glu); \n  if (info) \n  {\n    m_lastError = \"UNABLE TO ALLOCATE WORKING MEMORY\\n\\n\" ;\n    m_factorizationIsOk = false;\n    return ; \n  }\n  \n  // Set up pointers for integer working arrays \n  IndexVector segrep(m); segrep.setZero();\n  IndexVector parent(m); parent.setZero();\n  IndexVector xplore(m); xplore.setZero();\n  IndexVector repfnz(maxpanel);\n  IndexVector panel_lsub(maxpanel);\n  IndexVector xprune(n); xprune.setZero();\n  IndexVector marker(m*internal::LUNoMarker); marker.setZero();\n  \n  repfnz.setConstant(-1); \n  panel_lsub.setConstant(-1);\n  \n  // Set up pointers for scalar working arrays \n  ScalarVector dense; \n  dense.setZero(maxpanel);\n  ScalarVector tempv; \n  tempv.setZero(internal::LUnumTempV(m, m_perfv.panel_size, m_perfv.maxsuper, /*m_perfv.rowblk*/m) );\n  \n  // Compute the inverse of perm_c\n  PermutationType iperm_c(m_perm_c.inverse()); \n  \n  // Identify initial relaxed snodes\n  IndexVector relax_end(n);\n  if ( m_symmetricmode == true ) \n    Base::heap_relax_snode(n, m_etree, m_perfv.relax, marker, relax_end);\n  else\n    Base::relax_snode(n, m_etree, m_perfv.relax, marker, relax_end);\n  \n  \n  m_perm_r.resize(m); \n  m_perm_r.indices().setConstant(-1);\n  marker.setConstant(-1);\n  m_detPermR = 1; // Record the determinant of the row permutation\n  \n  m_glu.supno(0) = emptyIdxLU; m_glu.xsup.setConstant(0);\n  m_glu.xsup(0) = m_glu.xlsub(0) = m_glu.xusub(0) = m_glu.xlusup(0) = Index(0);\n  \n  // Work on one 'panel' at a time. A panel is one of the following :\n  //  (a) a relaxed supernode at the bottom of the etree, or\n  //  (b) panel_size contiguous columns, <panel_size> defined by the user\n  Index jcol; \n  IndexVector panel_histo(n);\n  Index pivrow; // Pivotal row number in the original row matrix\n  Index nseg1; // Number of segments in U-column above panel row jcol\n  Index nseg; // Number of segments in each U-column \n  Index irep; \n  Index i, k, jj; \n  for (jcol = 0; jcol < n; )\n  {\n    // Adjust panel size so that a panel won't overlap with the next relaxed snode. \n    Index panel_size = m_perfv.panel_size; // upper bound on panel width\n    for (k = jcol + 1; k < (std::min)(jcol+panel_size, n); k++)\n    {\n      if (relax_end(k) != emptyIdxLU) \n      {\n        panel_size = k - jcol; \n        break; \n      }\n    }\n    if (k == n) \n      panel_size = n - jcol; \n      \n    // Symbolic outer factorization on a panel of columns \n    Base::panel_dfs(m, panel_size, jcol, m_mat, m_perm_r.indices(), nseg1, dense, panel_lsub, segrep, repfnz, xprune, marker, parent, xplore, m_glu); \n    \n    // Numeric sup-panel updates in topological order \n    Base::panel_bmod(m, panel_size, jcol, nseg1, dense, tempv, segrep, repfnz, m_glu); \n    \n    // Sparse LU within the panel, and below the panel diagonal \n    for ( jj = jcol; jj< jcol + panel_size; jj++) \n    {\n      k = (jj - jcol) * m; // Column index for w-wide arrays \n      \n      nseg = nseg1; // begin after all the panel segments\n      //Depth-first-search for the current column\n      VectorBlock<IndexVector> panel_lsubk(panel_lsub, k, m);\n      VectorBlock<IndexVector> repfnz_k(repfnz, k, m); \n      info = Base::column_dfs(m, jj, m_perm_r.indices(), m_perfv.maxsuper, nseg, panel_lsubk, segrep, repfnz_k, xprune, marker, parent, xplore, m_glu); \n      if ( info ) \n      {\n        m_lastError =  \"UNABLE TO EXPAND MEMORY IN COLUMN_DFS() \";\n        m_info = NumericalIssue; \n        m_factorizationIsOk = false; \n        return; \n      }\n      // Numeric updates to this column \n      VectorBlock<ScalarVector> dense_k(dense, k, m); \n      VectorBlock<IndexVector> segrep_k(segrep, nseg1, m-nseg1); \n      info = Base::column_bmod(jj, (nseg - nseg1), dense_k, tempv, segrep_k, repfnz_k, jcol, m_glu); \n      if ( info ) \n      {\n        m_lastError = \"UNABLE TO EXPAND MEMORY IN COLUMN_BMOD() \";\n        m_info = NumericalIssue; \n        m_factorizationIsOk = false; \n        return; \n      }\n      \n      // Copy the U-segments to ucol(*)\n      info = Base::copy_to_ucol(jj, nseg, segrep, repfnz_k ,m_perm_r.indices(), dense_k, m_glu); \n      if ( info ) \n      {\n        m_lastError = \"UNABLE TO EXPAND MEMORY IN COPY_TO_UCOL() \";\n        m_info = NumericalIssue; \n        m_factorizationIsOk = false; \n        return; \n      }\n      \n      // Form the L-segment \n      info = Base::pivotL(jj, m_diagpivotthresh, m_perm_r.indices(), iperm_c.indices(), pivrow, m_glu);\n      if ( info ) \n      {\n        m_lastError = \"THE MATRIX IS STRUCTURALLY SINGULAR ... ZERO COLUMN AT \";\n        std::ostringstream returnInfo;\n        returnInfo << info; \n        m_lastError += returnInfo.str();\n        m_info = NumericalIssue; \n        m_factorizationIsOk = false; \n        return; \n      }\n      \n      // Update the determinant of the row permutation matrix\n      // FIXME: the following test is not correct, we should probably take iperm_c into account and pivrow is not directly the row pivot.\n      if (pivrow != jj) m_detPermR = -m_detPermR;\n\n      // Prune columns (0:jj-1) using column jj\n      Base::pruneL(jj, m_perm_r.indices(), pivrow, nseg, segrep, repfnz_k, xprune, m_glu); \n      \n      // Reset repfnz for this column \n      for (i = 0; i < nseg; i++)\n      {\n        irep = segrep(i); \n        repfnz_k(irep) = emptyIdxLU; \n      }\n    } // end SparseLU within the panel  \n    jcol += panel_size;  // Move to the next panel\n  } // end for -- end elimination \n  \n  m_detPermR = m_perm_r.determinant();\n  m_detPermC = m_perm_c.determinant();\n  \n  // Count the number of nonzeros in factors \n  Base::countnz(n, m_nnzL, m_nnzU, m_glu); \n  // Apply permutation  to the L subscripts \n  Base::fixupL(n, m_perm_r.indices(), m_glu);\n  \n  // Create supernode matrix L \n  m_Lstore.setInfos(m, n, m_glu.lusup, m_glu.xlusup, m_glu.lsub, m_glu.xlsub, m_glu.supno, m_glu.xsup); \n  // Create the column major upper sparse matrix  U; \n  new (&m_Ustore) MappedSparseMatrix<Scalar, ColMajor, Index> ( m, n, m_nnzU, m_glu.xusub.data(), m_glu.usub.data(), m_glu.ucol.data() ); \n  \n  m_info = Success;\n  m_factorizationIsOk = true;\n}\n\ntemplate<typename MappedSupernodalType>\nstruct SparseLUMatrixLReturnType : internal::no_assignment_operator\n{\n  typedef typename MappedSupernodalType::Index Index;\n  typedef typename MappedSupernodalType::Scalar Scalar;\n  SparseLUMatrixLReturnType(const MappedSupernodalType& mapL) : m_mapL(mapL)\n  { }\n  Index rows() { return m_mapL.rows(); }\n  Index cols() { return m_mapL.cols(); }\n  template<typename Dest>\n  void solveInPlace( MatrixBase<Dest> &X) const\n  {\n    m_mapL.solveInPlace(X);\n  }\n  const MappedSupernodalType& m_mapL;\n};\n\ntemplate<typename MatrixLType, typename MatrixUType>\nstruct SparseLUMatrixUReturnType : internal::no_assignment_operator\n{\n  typedef typename MatrixLType::Index Index;\n  typedef typename MatrixLType::Scalar Scalar;\n  SparseLUMatrixUReturnType(const MatrixLType& mapL, const MatrixUType& mapU)\n  : m_mapL(mapL),m_mapU(mapU)\n  { }\n  Index rows() { return m_mapL.rows(); }\n  Index cols() { return m_mapL.cols(); }\n\n  template<typename Dest>   void solveInPlace(MatrixBase<Dest> &X) const\n  {\n    Index nrhs = X.cols();\n    Index n = X.rows();\n    // Backward solve with U\n    for (Index k = m_mapL.nsuper(); k >= 0; k--)\n    {\n      Index fsupc = m_mapL.supToCol()[k];\n      Index lda = m_mapL.colIndexPtr()[fsupc+1] - m_mapL.colIndexPtr()[fsupc]; // leading dimension\n      Index nsupc = m_mapL.supToCol()[k+1] - fsupc;\n      Index luptr = m_mapL.colIndexPtr()[fsupc];\n\n      if (nsupc == 1)\n      {\n        for (Index j = 0; j < nrhs; j++)\n        {\n          X(fsupc, j) /= m_mapL.valuePtr()[luptr];\n        }\n      }\n      else\n      {\n        Map<const Matrix<Scalar,Dynamic,Dynamic, ColMajor>, 0, OuterStride<> > A( &(m_mapL.valuePtr()[luptr]), nsupc, nsupc, OuterStride<>(lda) );\n        Map< Matrix<Scalar,Dynamic,Dynamic, ColMajor>, 0, OuterStride<> > U (&(X(fsupc,0)), nsupc, nrhs, OuterStride<>(n) );\n        U = A.template triangularView<Upper>().solve(U);\n      }\n\n      for (Index j = 0; j < nrhs; ++j)\n      {\n        for (Index jcol = fsupc; jcol < fsupc + nsupc; jcol++)\n        {\n          typename MatrixUType::InnerIterator it(m_mapU, jcol);\n          for ( ; it; ++it)\n          {\n            Index irow = it.index();\n            X(irow, j) -= X(jcol, j) * it.value();\n          }\n        }\n      }\n    } // End For U-solve\n  }\n  const MatrixLType& m_mapL;\n  const MatrixUType& m_mapU;\n};\n\nnamespace internal {\n  \ntemplate<typename _MatrixType, typename Derived, typename Rhs>\nstruct solve_retval<SparseLU<_MatrixType,Derived>, Rhs>\n  : solve_retval_base<SparseLU<_MatrixType,Derived>, Rhs>\n{\n  typedef SparseLU<_MatrixType,Derived> Dec;\n  EIGEN_MAKE_SOLVE_HELPERS(Dec,Rhs)\n\n  template<typename Dest> void evalTo(Dest& dst) const\n  {\n    dec()._solve(rhs(),dst);\n  }\n};\n\ntemplate<typename _MatrixType, typename Derived, typename Rhs>\nstruct sparse_solve_retval<SparseLU<_MatrixType,Derived>, Rhs>\n  : sparse_solve_retval_base<SparseLU<_MatrixType,Derived>, Rhs>\n{\n  typedef SparseLU<_MatrixType,Derived> Dec;\n  EIGEN_MAKE_SPARSE_SOLVE_HELPERS(Dec,Rhs)\n\n  template<typename Dest> void evalTo(Dest& dst) const\n  {\n    this->defaultEvalTo(dst);\n  }\n};\n} // end namespace internal\n\n} // End namespace Eigen \n\n#endif\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseLU/SparseLUImpl.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef SPARSELU_IMPL_H\n#define SPARSELU_IMPL_H\n\nnamespace Eigen {\nnamespace internal {\n  \n/** \\ingroup SparseLU_Module\n  * \\class SparseLUImpl\n  * Base class for sparseLU\n  */\ntemplate <typename Scalar, typename Index>\nclass SparseLUImpl\n{\n  public:\n    typedef Matrix<Scalar,Dynamic,1> ScalarVector;\n    typedef Matrix<Scalar,Dynamic,Dynamic,ColMajor> ScalarMatrix;\n    typedef Map<ScalarMatrix, 0,  OuterStride<> > MappedMatrixBlock;\n    typedef Matrix<Index,Dynamic,1> IndexVector; \n    typedef typename ScalarVector::RealScalar RealScalar; \n    typedef Ref<Matrix<Scalar,Dynamic,1> > BlockScalarVector;\n    typedef Ref<Matrix<Index,Dynamic,1> > BlockIndexVector;\n    typedef LU_GlobalLU_t<IndexVector, ScalarVector> GlobalLU_t; \n    typedef SparseMatrix<Scalar,ColMajor,Index> MatrixType; \n    \n  protected:\n     template <typename VectorType>\n     Index expand(VectorType& vec, Index& length, Index nbElts, Index keep_prev, Index& num_expansions);\n     Index memInit(Index m, Index n, Index annz, Index lwork, Index fillratio, Index panel_size,  GlobalLU_t& glu); \n     template <typename VectorType>\n     Index memXpand(VectorType& vec, Index& maxlen, Index nbElts, MemType memtype, Index& num_expansions);\n     void heap_relax_snode (const Index n, IndexVector& et, const Index relax_columns, IndexVector& descendants, IndexVector& relax_end); \n     void relax_snode (const Index n, IndexVector& et, const Index relax_columns, IndexVector& descendants, IndexVector& relax_end); \n     Index snode_dfs(const Index jcol, const Index kcol,const MatrixType& mat,  IndexVector& xprune, IndexVector& marker, GlobalLU_t& glu); \n     Index snode_bmod (const Index jcol, const Index fsupc, ScalarVector& dense, GlobalLU_t& glu);\n     Index pivotL(const Index jcol, const RealScalar& diagpivotthresh, IndexVector& perm_r, IndexVector& iperm_c, Index& pivrow, GlobalLU_t& glu);\n     template <typename Traits>\n     void dfs_kernel(const Index jj, IndexVector& perm_r,\n                    Index& nseg, IndexVector& panel_lsub, IndexVector& segrep,\n                    Ref<IndexVector> repfnz_col, IndexVector& xprune, Ref<IndexVector> marker, IndexVector& parent,\n                    IndexVector& xplore, GlobalLU_t& glu, Index& nextl_col, Index krow, Traits& traits);\n     void panel_dfs(const Index m, const Index w, const Index jcol, MatrixType& A, IndexVector& perm_r, Index& nseg, ScalarVector& dense, IndexVector& panel_lsub, IndexVector& segrep, IndexVector& repfnz, IndexVector& xprune, IndexVector& marker, IndexVector& parent, IndexVector& xplore, GlobalLU_t& glu);\n    \n     void panel_bmod(const Index m, const Index w, const Index jcol, const Index nseg, ScalarVector& dense, ScalarVector& tempv, IndexVector& segrep, IndexVector& repfnz, GlobalLU_t& glu);\n     Index column_dfs(const Index m, const Index jcol, IndexVector& perm_r, Index maxsuper, Index& nseg,  BlockIndexVector lsub_col, IndexVector& segrep, BlockIndexVector repfnz, IndexVector& xprune, IndexVector& marker, IndexVector& parent, IndexVector& xplore, GlobalLU_t& glu);\n     Index column_bmod(const Index jcol, const Index nseg, BlockScalarVector dense, ScalarVector& tempv, BlockIndexVector segrep, BlockIndexVector repfnz, Index fpanelc, GlobalLU_t& glu); \n     Index copy_to_ucol(const Index jcol, const Index nseg, IndexVector& segrep, BlockIndexVector repfnz ,IndexVector& perm_r, BlockScalarVector dense, GlobalLU_t& glu); \n     void pruneL(const Index jcol, const IndexVector& perm_r, const Index pivrow, const Index nseg, const IndexVector& segrep, BlockIndexVector repfnz, IndexVector& xprune, GlobalLU_t& glu);\n     void countnz(const Index n, Index& nnzL, Index& nnzU, GlobalLU_t& glu); \n     void fixupL(const Index n, const IndexVector& perm_r, GlobalLU_t& glu); \n     \n     template<typename , typename >\n     friend struct column_dfs_traits;\n}; \n\n} // end namespace internal\n} // namespace Eigen\n\n#endif\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseLU/SparseLU_Memory.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n/* \n \n * NOTE: This file is the modified version of [s,d,c,z]memory.c files in SuperLU \n \n * -- SuperLU routine (version 3.1) --\n * Univ. of California Berkeley, Xerox Palo Alto Research Center,\n * and Lawrence Berkeley National Lab.\n * August 1, 2008\n *\n * Copyright (c) 1994 by Xerox Corporation.  All rights reserved.\n *\n * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY\n * EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.\n *\n * Permission is hereby granted to use or copy this program for any\n * purpose, provided the above notices are retained on all copies.\n * Permission to modify the code and to distribute modified code is\n * granted, provided the above notices are retained, and a notice that\n * the code was modified is included with the above copyright notice.\n */\n\n#ifndef EIGEN_SPARSELU_MEMORY\n#define EIGEN_SPARSELU_MEMORY\n\nnamespace Eigen {\nnamespace internal {\n  \nenum { LUNoMarker = 3 };\nenum {emptyIdxLU = -1};\ntemplate<typename Index>\ninline Index LUnumTempV(Index& m, Index& w, Index& t, Index& b)\n{\n  return (std::max)(m, (t+b)*w);\n}\n\ntemplate< typename Scalar, typename Index>\ninline Index LUTempSpace(Index&m, Index& w)\n{\n  return (2*w + 4 + LUNoMarker) * m * sizeof(Index) + (w + 1) * m * sizeof(Scalar);\n}\n\n\n\n\n/** \n  * Expand the existing storage to accomodate more fill-ins\n  * \\param vec Valid pointer to the vector to allocate or expand\n  * \\param[in,out] length  At input, contain the current length of the vector that is to be increased. At output, length of the newly allocated vector\n  * \\param[in] nbElts Current number of elements in the factors\n  * \\param keep_prev  1: use length  and do not expand the vector; 0: compute new_len and expand\n  * \\param[in,out] num_expansions Number of times the memory has been expanded\n  */\ntemplate <typename Scalar, typename Index>\ntemplate <typename VectorType>\nIndex  SparseLUImpl<Scalar,Index>::expand(VectorType& vec, Index& length, Index nbElts, Index keep_prev, Index& num_expansions) \n{\n  \n  float alpha = 1.5; // Ratio of the memory increase \n  Index new_len; // New size of the allocated memory\n  \n  if(num_expansions == 0 || keep_prev) \n    new_len = length ; // First time allocate requested\n  else \n    new_len = (std::max)(length+1,Index(alpha * length));\n  \n  VectorType old_vec; // Temporary vector to hold the previous values   \n  if (nbElts > 0 )\n    old_vec = vec.segment(0,nbElts); \n  \n  //Allocate or expand the current vector\n#ifdef EIGEN_EXCEPTIONS\n  try\n#endif\n  {\n    vec.resize(new_len); \n  }\n#ifdef EIGEN_EXCEPTIONS\n  catch(std::bad_alloc& )\n#else\n  if(!vec.size())\n#endif\n  {\n    if (!num_expansions)\n    {\n      // First time to allocate from LUMemInit()\n      // Let LUMemInit() deals with it.\n      return -1;\n    }\n    if (keep_prev)\n    {\n      // In this case, the memory length should not not be reduced\n      return new_len;\n    }\n    else \n    {\n      // Reduce the size and increase again \n      Index tries = 0; // Number of attempts\n      do \n      {\n        alpha = (alpha + 1)/2;\n        new_len = (std::max)(length+1,Index(alpha * length));\n#ifdef EIGEN_EXCEPTIONS\n        try\n#endif\n        {\n          vec.resize(new_len); \n        }\n#ifdef EIGEN_EXCEPTIONS\n        catch(std::bad_alloc& )\n#else\n        if (!vec.size())\n#endif\n        {\n          tries += 1; \n          if ( tries > 10) return new_len; \n        }\n      } while (!vec.size());\n    }\n  }\n  //Copy the previous values to the newly allocated space \n  if (nbElts > 0)\n    vec.segment(0, nbElts) = old_vec;   \n   \n  \n  length  = new_len;\n  if(num_expansions) ++num_expansions;\n  return 0; \n}\n\n/**\n * \\brief  Allocate various working space for the numerical factorization phase.\n * \\param m number of rows of the input matrix \n * \\param n number of columns \n * \\param annz number of initial nonzeros in the matrix \n * \\param lwork  if lwork=-1, this routine returns an estimated size of the required memory\n * \\param glu persistent data to facilitate multiple factors : will be deleted later ??\n * \\param fillratio estimated ratio of fill in the factors\n * \\param panel_size Size of a panel\n * \\return an estimated size of the required memory if lwork = -1; otherwise, return the size of actually allocated memory when allocation failed, and 0 on success\n * \\note Unlike SuperLU, this routine does not support successive factorization with the same pattern and the same row permutation\n */\ntemplate <typename Scalar, typename Index>\nIndex SparseLUImpl<Scalar,Index>::memInit(Index m, Index n, Index annz, Index lwork, Index fillratio, Index panel_size,  GlobalLU_t& glu)\n{\n  Index& num_expansions = glu.num_expansions; //No memory expansions so far\n  num_expansions = 0;\n  glu.nzumax = glu.nzlumax = (std::min)(fillratio * (annz+1) / n, m) * n; // estimated number of nonzeros in U \n  glu.nzlmax = (std::max)(Index(4), fillratio) * (annz+1) / 4; // estimated  nnz in L factor\n  // Return the estimated size to the user if necessary\n  Index tempSpace;\n  tempSpace = (2*panel_size + 4 + LUNoMarker) * m * sizeof(Index) + (panel_size + 1) * m * sizeof(Scalar);\n  if (lwork == emptyIdxLU) \n  {\n    Index estimated_size;\n    estimated_size = (5 * n + 5) * sizeof(Index)  + tempSpace\n                    + (glu.nzlmax + glu.nzumax) * sizeof(Index) + (glu.nzlumax+glu.nzumax) *  sizeof(Scalar) + n; \n    return estimated_size;\n  }\n  \n  // Setup the required space \n  \n  // First allocate Integer pointers for L\\U factors\n  glu.xsup.resize(n+1);\n  glu.supno.resize(n+1);\n  glu.xlsub.resize(n+1);\n  glu.xlusup.resize(n+1);\n  glu.xusub.resize(n+1);\n\n  // Reserve memory for L/U factors\n  do \n  {\n    if(     (expand<ScalarVector>(glu.lusup, glu.nzlumax, 0, 0, num_expansions)<0)\n        ||  (expand<ScalarVector>(glu.ucol,  glu.nzumax,  0, 0, num_expansions)<0)\n        ||  (expand<IndexVector> (glu.lsub,  glu.nzlmax,  0, 0, num_expansions)<0)\n        ||  (expand<IndexVector> (glu.usub,  glu.nzumax,  0, 1, num_expansions)<0) )\n    {\n      //Reduce the estimated size and retry\n      glu.nzlumax /= 2;\n      glu.nzumax /= 2;\n      glu.nzlmax /= 2;\n      if (glu.nzlumax < annz ) return glu.nzlumax; \n    }\n  } while (!glu.lusup.size() || !glu.ucol.size() || !glu.lsub.size() || !glu.usub.size());\n  \n  ++num_expansions;\n  return 0;\n  \n} // end LuMemInit\n\n/** \n * \\brief Expand the existing storage \n * \\param vec vector to expand \n * \\param[in,out] maxlen On input, previous size of vec (Number of elements to copy ). on output, new size\n * \\param nbElts current number of elements in the vector.\n * \\param memtype Type of the element to expand\n * \\param num_expansions Number of expansions \n * \\return 0 on success, > 0 size of the memory allocated so far\n */\ntemplate <typename Scalar, typename Index>\ntemplate <typename VectorType>\nIndex SparseLUImpl<Scalar,Index>::memXpand(VectorType& vec, Index& maxlen, Index nbElts, MemType memtype, Index& num_expansions)\n{\n  Index failed_size; \n  if (memtype == USUB)\n     failed_size = this->expand<VectorType>(vec, maxlen, nbElts, 1, num_expansions);\n  else\n    failed_size = this->expand<VectorType>(vec, maxlen, nbElts, 0, num_expansions);\n\n  if (failed_size)\n    return failed_size; \n  \n  return 0 ;  \n}\n\n} // end namespace internal\n\n} // end namespace Eigen\n#endif // EIGEN_SPARSELU_MEMORY\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseLU/SparseLU_Structs.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n/* \n * NOTE: This file comes from a partly modified version of files slu_[s,d,c,z]defs.h\n * -- SuperLU routine (version 4.1) --\n * Univ. of California Berkeley, Xerox Palo Alto Research Center,\n * and Lawrence Berkeley National Lab.\n * November, 2010\n * \n * Global data structures used in LU factorization -\n * \n *   nsuper: #supernodes = nsuper + 1, numbered [0, nsuper].\n *   (xsup,supno): supno[i] is the supernode no to which i belongs;\n *  xsup(s) points to the beginning of the s-th supernode.\n *  e.g.   supno 0 1 2 2 3 3 3 4 4 4 4 4   (n=12)\n *          xsup 0 1 2 4 7 12\n *  Note: dfs will be performed on supernode rep. relative to the new \n *        row pivoting ordering\n *\n *   (xlsub,lsub): lsub[*] contains the compressed subscript of\n *  rectangular supernodes; xlsub[j] points to the starting\n *  location of the j-th column in lsub[*]. Note that xlsub \n *  is indexed by column.\n *  Storage: original row subscripts\n *\n *      During the course of sparse LU factorization, we also use\n *  (xlsub,lsub) for the purpose of symmetric pruning. For each\n *  supernode {s,s+1,...,t=s+r} with first column s and last\n *  column t, the subscript set\n *    lsub[j], j=xlsub[s], .., xlsub[s+1]-1\n *  is the structure of column s (i.e. structure of this supernode).\n *  It is used for the storage of numerical values.\n *  Furthermore,\n *    lsub[j], j=xlsub[t], .., xlsub[t+1]-1\n *  is the structure of the last column t of this supernode.\n *  It is for the purpose of symmetric pruning. Therefore, the\n *  structural subscripts can be rearranged without making physical\n *  interchanges among the numerical values.\n *\n *  However, if the supernode has only one column, then we\n *  only keep one set of subscripts. For any subscript interchange\n *  performed, similar interchange must be done on the numerical\n *  values.\n *\n *  The last column structures (for pruning) will be removed\n *  after the numercial LU factorization phase.\n *\n *   (xlusup,lusup): lusup[*] contains the numerical values of the\n *  rectangular supernodes; xlusup[j] points to the starting\n *  location of the j-th column in storage vector lusup[*]\n *  Note: xlusup is indexed by column.\n *  Each rectangular supernode is stored by column-major\n *  scheme, consistent with Fortran 2-dim array storage.\n *\n *   (xusub,ucol,usub): ucol[*] stores the numerical values of\n *  U-columns outside the rectangular supernodes. The row\n *  subscript of nonzero ucol[k] is stored in usub[k].\n *  xusub[i] points to the starting location of column i in ucol.\n *  Storage: new row subscripts; that is subscripts of PA.\n */\n\n#ifndef EIGEN_LU_STRUCTS\n#define EIGEN_LU_STRUCTS\nnamespace Eigen {\nnamespace internal {\n  \ntypedef enum {LUSUP, UCOL, LSUB, USUB, LLVL, ULVL} MemType; \n\ntemplate <typename IndexVector, typename ScalarVector>\nstruct LU_GlobalLU_t {\n  typedef typename IndexVector::Scalar Index; \n  IndexVector xsup; //First supernode column ... xsup(s) points to the beginning of the s-th supernode\n  IndexVector supno; // Supernode number corresponding to this column (column to supernode mapping)\n  ScalarVector  lusup; // nonzero values of L ordered by columns \n  IndexVector lsub; // Compressed row indices of L rectangular supernodes. \n  IndexVector xlusup; // pointers to the beginning of each column in lusup\n  IndexVector xlsub; // pointers to the beginning of each column in lsub\n  Index   nzlmax; // Current max size of lsub\n  Index   nzlumax; // Current max size of lusup\n  ScalarVector  ucol; // nonzero values of U ordered by columns \n  IndexVector usub; // row indices of U columns in ucol\n  IndexVector xusub; // Pointers to the beginning of each column of U in ucol \n  Index   nzumax; // Current max size of ucol\n  Index   n; // Number of columns in the matrix  \n  Index   num_expansions; \n};\n\n// Values to set for performance\ntemplate <typename Index>\nstruct perfvalues {\n  Index panel_size; // a panel consists of at most <panel_size> consecutive columns\n  Index relax; // To control degree of relaxing supernodes. If the number of nodes (columns) \n                // in a subtree of the elimination tree is less than relax, this subtree is considered \n                // as one supernode regardless of the row structures of those columns\n  Index maxsuper; // The maximum size for a supernode in complete LU\n  Index rowblk; // The minimum row dimension for 2-D blocking to be used;\n  Index colblk; // The minimum column dimension for 2-D blocking to be used;\n  Index fillfactor; // The estimated fills factors for L and U, compared with A\n}; \n\n} // end namespace internal\n\n} // end namespace Eigen\n#endif // EIGEN_LU_STRUCTS\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam@inria.fr>\n// Copyright (C) 2012 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SPARSELU_SUPERNODAL_MATRIX_H\n#define EIGEN_SPARSELU_SUPERNODAL_MATRIX_H\n\nnamespace Eigen {\nnamespace internal {\n\n/** \\ingroup SparseLU_Module\n * \\brief a class to manipulate the L supernodal factor from the SparseLU factorization\n * \n * This class  contain the data to easily store \n * and manipulate the supernodes during the factorization and solution phase of Sparse LU. \n * Only the lower triangular matrix has supernodes.\n * \n * NOTE : This class corresponds to the SCformat structure in SuperLU\n * \n */\n/* TODO\n * InnerIterator as for sparsematrix \n * SuperInnerIterator to iterate through all supernodes \n * Function for triangular solve\n */\ntemplate <typename _Scalar, typename _Index>\nclass MappedSuperNodalMatrix\n{\n  public:\n    typedef _Scalar Scalar; \n    typedef _Index Index;\n    typedef Matrix<Index,Dynamic,1> IndexVector; \n    typedef Matrix<Scalar,Dynamic,1> ScalarVector;\n  public:\n    MappedSuperNodalMatrix()\n    {\n      \n    }\n    MappedSuperNodalMatrix(Index m, Index n,  ScalarVector& nzval, IndexVector& nzval_colptr, IndexVector& rowind, \n             IndexVector& rowind_colptr, IndexVector& col_to_sup, IndexVector& sup_to_col )\n    {\n      setInfos(m, n, nzval, nzval_colptr, rowind, rowind_colptr, col_to_sup, sup_to_col);\n    }\n    \n    ~MappedSuperNodalMatrix()\n    {\n      \n    }\n    /**\n     * Set appropriate pointers for the lower triangular supernodal matrix\n     * These infos are available at the end of the numerical factorization\n     * FIXME This class will be modified such that it can be use in the course \n     * of the factorization.\n     */\n    void setInfos(Index m, Index n, ScalarVector& nzval, IndexVector& nzval_colptr, IndexVector& rowind, \n             IndexVector& rowind_colptr, IndexVector& col_to_sup, IndexVector& sup_to_col )\n    {\n      m_row = m;\n      m_col = n; \n      m_nzval = nzval.data(); \n      m_nzval_colptr = nzval_colptr.data(); \n      m_rowind = rowind.data(); \n      m_rowind_colptr = rowind_colptr.data(); \n      m_nsuper = col_to_sup(n); \n      m_col_to_sup = col_to_sup.data(); \n      m_sup_to_col = sup_to_col.data(); \n    }\n    \n    /**\n     * Number of rows\n     */\n    Index rows() { return m_row; }\n    \n    /**\n     * Number of columns\n     */\n    Index cols() { return m_col; }\n    \n    /**\n     * Return the array of nonzero values packed by column\n     * \n     * The size is nnz\n     */\n    Scalar* valuePtr() {  return m_nzval; }\n    \n    const Scalar* valuePtr() const \n    {\n      return m_nzval; \n    }\n    /**\n     * Return the pointers to the beginning of each column in \\ref valuePtr()\n     */\n    Index* colIndexPtr()\n    {\n      return m_nzval_colptr; \n    }\n    \n    const Index* colIndexPtr() const\n    {\n      return m_nzval_colptr; \n    }\n    \n    /**\n     * Return the array of compressed row indices of all supernodes\n     */\n    Index* rowIndex()  { return m_rowind; }\n    \n    const Index* rowIndex() const\n    {\n      return m_rowind; \n    }\n    \n    /**\n     * Return the location in \\em rowvaluePtr() which starts each column\n     */\n    Index* rowIndexPtr() { return m_rowind_colptr; }\n    \n    const Index* rowIndexPtr() const \n    {\n      return m_rowind_colptr; \n    }\n    \n    /** \n     * Return the array of column-to-supernode mapping \n     */\n    Index* colToSup()  { return m_col_to_sup; }\n    \n    const Index* colToSup() const\n    {\n      return m_col_to_sup;       \n    }\n    /**\n     * Return the array of supernode-to-column mapping\n     */\n    Index* supToCol() { return m_sup_to_col; }\n    \n    const Index* supToCol() const \n    {\n      return m_sup_to_col;\n    }\n    \n    /**\n     * Return the number of supernodes\n     */\n    Index nsuper() const \n    {\n      return m_nsuper; \n    }\n    \n    class InnerIterator; \n    template<typename Dest>\n    void solveInPlace( MatrixBase<Dest>&X) const;\n    \n      \n      \n    \n  protected:\n    Index m_row; // Number of rows\n    Index m_col; // Number of columns \n    Index m_nsuper; // Number of supernodes \n    Scalar* m_nzval; //array of nonzero values packed by column\n    Index* m_nzval_colptr; //nzval_colptr[j] Stores the location in nzval[] which starts column j \n    Index* m_rowind; // Array of compressed row indices of rectangular supernodes\n    Index* m_rowind_colptr; //rowind_colptr[j] stores the location in rowind[] which starts column j\n    Index* m_col_to_sup; // col_to_sup[j] is the supernode number to which column j belongs\n    Index* m_sup_to_col; //sup_to_col[s] points to the starting column of the s-th supernode\n    \n  private :\n};\n\n/**\n  * \\brief InnerIterator class to iterate over nonzero values of the current column in the supernodal matrix L\n  * \n  */\ntemplate<typename Scalar, typename Index>\nclass MappedSuperNodalMatrix<Scalar,Index>::InnerIterator\n{\n  public:\n     InnerIterator(const MappedSuperNodalMatrix& mat, Index outer)\n      : m_matrix(mat),\n        m_outer(outer), \n        m_supno(mat.colToSup()[outer]),\n        m_idval(mat.colIndexPtr()[outer]),\n        m_startidval(m_idval),\n        m_endidval(mat.colIndexPtr()[outer+1]),\n        m_idrow(mat.rowIndexPtr()[mat.supToCol()[mat.colToSup()[outer]]]),\n        m_endidrow(mat.rowIndexPtr()[mat.supToCol()[mat.colToSup()[outer]]+1])\n    {}\n    inline InnerIterator& operator++()\n    { \n      m_idval++; \n      m_idrow++;\n      return *this;\n    }\n    inline Scalar value() const { return m_matrix.valuePtr()[m_idval]; }\n    \n    inline Scalar& valueRef() { return const_cast<Scalar&>(m_matrix.valuePtr()[m_idval]); }\n    \n    inline Index index() const { return m_matrix.rowIndex()[m_idrow]; }\n    inline Index row() const { return index(); }\n    inline Index col() const { return m_outer; }\n    \n    inline Index supIndex() const { return m_supno; }\n    \n    inline operator bool() const \n    { \n      return ( (m_idval < m_endidval) && (m_idval >= m_startidval)\n                && (m_idrow < m_endidrow) );\n    }\n    \n  protected:\n    const MappedSuperNodalMatrix& m_matrix; // Supernodal lower triangular matrix \n    const Index m_outer;                    // Current column \n    const Index m_supno;                    // Current SuperNode number\n    Index m_idval;                          // Index to browse the values in the current column\n    const Index m_startidval;               // Start of the column value\n    const Index m_endidval;                 // End of the column value\n    Index m_idrow;                          // Index to browse the row indices \n    Index m_endidrow;                       // End index of row indices of the current column\n};\n\n/**\n * \\brief Solve with the supernode triangular matrix\n * \n */\ntemplate<typename Scalar, typename Index>\ntemplate<typename Dest>\nvoid MappedSuperNodalMatrix<Scalar,Index>::solveInPlace( MatrixBase<Dest>&X) const\n{\n    Index n = X.rows(); \n    Index nrhs = X.cols(); \n    const Scalar * Lval = valuePtr();                 // Nonzero values \n    Matrix<Scalar,Dynamic,Dynamic, ColMajor> work(n, nrhs);     // working vector\n    work.setZero();\n    for (Index k = 0; k <= nsuper(); k ++)\n    {\n      Index fsupc = supToCol()[k];                    // First column of the current supernode \n      Index istart = rowIndexPtr()[fsupc];            // Pointer index to the subscript of the current column\n      Index nsupr = rowIndexPtr()[fsupc+1] - istart;  // Number of rows in the current supernode\n      Index nsupc = supToCol()[k+1] - fsupc;          // Number of columns in the current supernode\n      Index nrow = nsupr - nsupc;                     // Number of rows in the non-diagonal part of the supernode\n      Index irow;                                     //Current index row\n      \n      if (nsupc == 1 )\n      {\n        for (Index j = 0; j < nrhs; j++)\n        {\n          InnerIterator it(*this, fsupc);\n          ++it; // Skip the diagonal element\n          for (; it; ++it)\n          {\n            irow = it.row();\n            X(irow, j) -= X(fsupc, j) * it.value();\n          }\n        }\n      }\n      else\n      {\n        // The supernode has more than one column \n        Index luptr = colIndexPtr()[fsupc]; \n        Index lda = colIndexPtr()[fsupc+1] - luptr;\n        \n        // Triangular solve \n        Map<const Matrix<Scalar,Dynamic,Dynamic, ColMajor>, 0, OuterStride<> > A( &(Lval[luptr]), nsupc, nsupc, OuterStride<>(lda) );\n        Map< Matrix<Scalar,Dynamic,Dynamic, ColMajor>, 0, OuterStride<> > U (&(X(fsupc,0)), nsupc, nrhs, OuterStride<>(n) ); \n        U = A.template triangularView<UnitLower>().solve(U); \n        \n        // Matrix-vector product \n        new (&A) Map<const Matrix<Scalar,Dynamic,Dynamic, ColMajor>, 0, OuterStride<> > ( &(Lval[luptr+nsupc]), nrow, nsupc, OuterStride<>(lda) );\n        work.block(0, 0, nrow, nrhs) = A * U; \n        \n        //Begin Scatter \n        for (Index j = 0; j < nrhs; j++)\n        {\n          Index iptr = istart + nsupc; \n          for (Index i = 0; i < nrow; i++)\n          {\n            irow = rowIndex()[iptr]; \n            X(irow, j) -= work(i, j); // Scatter operation\n            work(i, j) = Scalar(0); \n            iptr++;\n          }\n        }\n      }\n    } \n}\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_SPARSELU_MATRIX_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseLU/SparseLU_Utils.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n#ifndef EIGEN_SPARSELU_UTILS_H\n#define EIGEN_SPARSELU_UTILS_H\n\nnamespace Eigen {\nnamespace internal {\n\n/**\n * \\brief Count Nonzero elements in the factors\n */\ntemplate <typename Scalar, typename Index>\nvoid SparseLUImpl<Scalar,Index>::countnz(const Index n, Index& nnzL, Index& nnzU, GlobalLU_t& glu)\n{\n nnzL = 0; \n nnzU = (glu.xusub)(n); \n Index nsuper = (glu.supno)(n); \n Index jlen; \n Index i, j, fsupc;\n if (n <= 0 ) return; \n // For each supernode\n for (i = 0; i <= nsuper; i++)\n {\n   fsupc = glu.xsup(i); \n   jlen = glu.xlsub(fsupc+1) - glu.xlsub(fsupc); \n   \n   for (j = fsupc; j < glu.xsup(i+1); j++)\n   {\n     nnzL += jlen; \n     nnzU += j - fsupc + 1; \n     jlen--; \n   }\n }\n}\n\n/**\n * \\brief Fix up the data storage lsub for L-subscripts. \n * \n * It removes the subscripts sets for structural pruning, \n * and applies permutation to the remaining subscripts\n * \n */\ntemplate <typename Scalar, typename Index>\nvoid SparseLUImpl<Scalar,Index>::fixupL(const Index n, const IndexVector& perm_r, GlobalLU_t& glu)\n{\n  Index fsupc, i, j, k, jstart; \n  \n  Index nextl = 0; \n  Index nsuper = (glu.supno)(n); \n  \n  // For each supernode \n  for (i = 0; i <= nsuper; i++)\n  {\n    fsupc = glu.xsup(i); \n    jstart = glu.xlsub(fsupc); \n    glu.xlsub(fsupc) = nextl; \n    for (j = jstart; j < glu.xlsub(fsupc + 1); j++)\n    {\n      glu.lsub(nextl) = perm_r(glu.lsub(j)); // Now indexed into P*A\n      nextl++;\n    }\n    for (k = fsupc+1; k < glu.xsup(i+1); k++)\n      glu.xlsub(k) = nextl; // other columns in supernode i\n  }\n  \n  glu.xlsub(n) = nextl; \n}\n\n} // end namespace internal\n\n} // end namespace Eigen\n#endif // EIGEN_SPARSELU_UTILS_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseLU/SparseLU_column_bmod.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam@inria.fr>\n// Copyright (C) 2012 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n/* \n \n * NOTE: This file is the modified version of xcolumn_bmod.c file in SuperLU \n \n * -- SuperLU routine (version 3.0) --\n * Univ. of California Berkeley, Xerox Palo Alto Research Center,\n * and Lawrence Berkeley National Lab.\n * October 15, 2003\n *\n * Copyright (c) 1994 by Xerox Corporation.  All rights reserved.\n *\n * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY\n * EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.\n *\n * Permission is hereby granted to use or copy this program for any\n * purpose, provided the above notices are retained on all copies.\n * Permission to modify the code and to distribute modified code is\n * granted, provided the above notices are retained, and a notice that\n * the code was modified is included with the above copyright notice.\n */\n#ifndef SPARSELU_COLUMN_BMOD_H\n#define SPARSELU_COLUMN_BMOD_H\n\nnamespace Eigen {\n\nnamespace internal {\n/**\n * \\brief Performs numeric block updates (sup-col) in topological order\n * \n * \\param jcol current column to update\n * \\param nseg Number of segments in the U part\n * \\param dense Store the full representation of the column\n * \\param tempv working array \n * \\param segrep segment representative ...\n * \\param repfnz ??? First nonzero column in each row ???  ...\n * \\param fpanelc First column in the current panel\n * \\param glu Global LU data. \n * \\return 0 - successful return \n *         > 0 - number of bytes allocated when run out of space\n * \n */\ntemplate <typename Scalar, typename Index>\nIndex SparseLUImpl<Scalar,Index>::column_bmod(const Index jcol, const Index nseg, BlockScalarVector dense, ScalarVector& tempv, BlockIndexVector segrep, BlockIndexVector repfnz, Index fpanelc, GlobalLU_t& glu)\n{\n  Index  jsupno, k, ksub, krep, ksupno; \n  Index lptr, nrow, isub, irow, nextlu, new_next, ufirst; \n  Index fsupc, nsupc, nsupr, luptr, kfnz, no_zeros; \n  /* krep = representative of current k-th supernode\n    * fsupc =  first supernodal column\n    * nsupc = number of columns in a supernode\n    * nsupr = number of rows in a supernode\n    * luptr = location of supernodal LU-block in storage\n    * kfnz = first nonz in the k-th supernodal segment\n    * no_zeros = no lf leading zeros in a supernodal U-segment\n    */\n  \n  jsupno = glu.supno(jcol);\n  // For each nonzero supernode segment of U[*,j] in topological order \n  k = nseg - 1; \n  Index d_fsupc; // distance between the first column of the current panel and the \n               // first column of the current snode\n  Index fst_col; // First column within small LU update\n  Index segsize; \n  for (ksub = 0; ksub < nseg; ksub++)\n  {\n    krep = segrep(k); k--; \n    ksupno = glu.supno(krep); \n    if (jsupno != ksupno )\n    {\n      // outside the rectangular supernode \n      fsupc = glu.xsup(ksupno); \n      fst_col = (std::max)(fsupc, fpanelc); \n      \n      // Distance from the current supernode to the current panel; \n      // d_fsupc = 0 if fsupc > fpanelc\n      d_fsupc = fst_col - fsupc; \n      \n      luptr = glu.xlusup(fst_col) + d_fsupc; \n      lptr = glu.xlsub(fsupc) + d_fsupc; \n      \n      kfnz = repfnz(krep); \n      kfnz = (std::max)(kfnz, fpanelc); \n      \n      segsize = krep - kfnz + 1; \n      nsupc = krep - fst_col + 1; \n      nsupr = glu.xlsub(fsupc+1) - glu.xlsub(fsupc); \n      nrow = nsupr - d_fsupc - nsupc;\n      Index lda = glu.xlusup(fst_col+1) - glu.xlusup(fst_col);\n      \n      \n      // Perform a triangular solver and block update, \n      // then scatter the result of sup-col update to dense\n      no_zeros = kfnz - fst_col; \n      if(segsize==1)\n        LU_kernel_bmod<1>::run(segsize, dense, tempv, glu.lusup, luptr, lda, nrow, glu.lsub, lptr, no_zeros);\n      else\n        LU_kernel_bmod<Dynamic>::run(segsize, dense, tempv, glu.lusup, luptr, lda, nrow, glu.lsub, lptr, no_zeros);\n    } // end if jsupno \n  } // end for each segment\n  \n  // Process the supernodal portion of  L\\U[*,j]\n  nextlu = glu.xlusup(jcol); \n  fsupc = glu.xsup(jsupno);\n  \n  // copy the SPA dense into L\\U[*,j]\n  Index mem; \n  new_next = nextlu + glu.xlsub(fsupc + 1) - glu.xlsub(fsupc); \n  Index offset = internal::first_multiple<Index>(new_next, internal::packet_traits<Scalar>::size) - new_next;\n  if(offset)\n    new_next += offset;\n  while (new_next > glu.nzlumax )\n  {\n    mem = memXpand<ScalarVector>(glu.lusup, glu.nzlumax, nextlu, LUSUP, glu.num_expansions);  \n    if (mem) return mem; \n  }\n  \n  for (isub = glu.xlsub(fsupc); isub < glu.xlsub(fsupc+1); isub++)\n  {\n    irow = glu.lsub(isub);\n    glu.lusup(nextlu) = dense(irow);\n    dense(irow) = Scalar(0.0); \n    ++nextlu; \n  }\n  \n  if(offset)\n  {\n    glu.lusup.segment(nextlu,offset).setZero();\n    nextlu += offset;\n  }\n  glu.xlusup(jcol + 1) = nextlu;  // close L\\U(*,jcol); \n  \n  /* For more updates within the panel (also within the current supernode),\n   * should start from the first column of the panel, or the first column\n   * of the supernode, whichever is bigger. There are two cases:\n   *  1) fsupc < fpanelc, then fst_col <-- fpanelc\n   *  2) fsupc >= fpanelc, then fst_col <-- fsupc\n   */\n  fst_col = (std::max)(fsupc, fpanelc); \n  \n  if (fst_col  < jcol)\n  {\n    // Distance between the current supernode and the current panel\n    // d_fsupc = 0 if fsupc >= fpanelc\n    d_fsupc = fst_col - fsupc; \n    \n    lptr = glu.xlsub(fsupc) + d_fsupc; \n    luptr = glu.xlusup(fst_col) + d_fsupc; \n    nsupr = glu.xlsub(fsupc+1) - glu.xlsub(fsupc); // leading dimension\n    nsupc = jcol - fst_col; // excluding jcol \n    nrow = nsupr - d_fsupc - nsupc; \n    \n    // points to the beginning of jcol in snode L\\U(jsupno) \n    ufirst = glu.xlusup(jcol) + d_fsupc; \n    Index lda = glu.xlusup(jcol+1) - glu.xlusup(jcol);\n    MappedMatrixBlock A( &(glu.lusup.data()[luptr]), nsupc, nsupc, OuterStride<>(lda) );\n    VectorBlock<ScalarVector> u(glu.lusup, ufirst, nsupc); \n    u = A.template triangularView<UnitLower>().solve(u); \n    \n    new (&A) MappedMatrixBlock ( &(glu.lusup.data()[luptr+nsupc]), nrow, nsupc, OuterStride<>(lda) );\n    VectorBlock<ScalarVector> l(glu.lusup, ufirst+nsupc, nrow); \n    l.noalias() -= A * u;\n    \n  } // End if fst_col\n  return 0; \n}\n\n} // end namespace internal\n} // end namespace Eigen\n\n#endif // SPARSELU_COLUMN_BMOD_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseLU/SparseLU_column_dfs.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n/* \n \n * NOTE: This file is the modified version of [s,d,c,z]column_dfs.c file in SuperLU \n \n * -- SuperLU routine (version 2.0) --\n * Univ. of California Berkeley, Xerox Palo Alto Research Center,\n * and Lawrence Berkeley National Lab.\n * November 15, 1997\n *\n * Copyright (c) 1994 by Xerox Corporation.  All rights reserved.\n *\n * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY\n * EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.\n *\n * Permission is hereby granted to use or copy this program for any\n * purpose, provided the above notices are retained on all copies.\n * Permission to modify the code and to distribute modified code is\n * granted, provided the above notices are retained, and a notice that\n * the code was modified is included with the above copyright notice.\n */\n#ifndef SPARSELU_COLUMN_DFS_H\n#define SPARSELU_COLUMN_DFS_H\n\ntemplate <typename Scalar, typename Index> class SparseLUImpl;\nnamespace Eigen {\n\nnamespace internal {\n\ntemplate<typename IndexVector, typename ScalarVector>\nstruct column_dfs_traits : no_assignment_operator\n{\n  typedef typename ScalarVector::Scalar Scalar;\n  typedef typename IndexVector::Scalar Index;\n  column_dfs_traits(Index jcol, Index& jsuper, typename SparseLUImpl<Scalar, Index>::GlobalLU_t& glu, SparseLUImpl<Scalar, Index>& luImpl)\n   : m_jcol(jcol), m_jsuper_ref(jsuper), m_glu(glu), m_luImpl(luImpl)\n {}\n  bool update_segrep(Index /*krep*/, Index /*jj*/)\n  {\n    return true;\n  }\n  void mem_expand(IndexVector& lsub, Index& nextl, Index chmark)\n  {\n    if (nextl >= m_glu.nzlmax)\n      m_luImpl.memXpand(lsub, m_glu.nzlmax, nextl, LSUB, m_glu.num_expansions); \n    if (chmark != (m_jcol-1)) m_jsuper_ref = emptyIdxLU;\n  }\n  enum { ExpandMem = true };\n  \n  Index m_jcol;\n  Index& m_jsuper_ref;\n  typename SparseLUImpl<Scalar, Index>::GlobalLU_t& m_glu;\n  SparseLUImpl<Scalar, Index>& m_luImpl;\n};\n\n\n/**\n * \\brief Performs a symbolic factorization on column jcol and decide the supernode boundary\n * \n * A supernode representative is the last column of a supernode.\n * The nonzeros in U[*,j] are segments that end at supernodes representatives. \n * The routine returns a list of the supernodal representatives \n * in topological order of the dfs that generates them. \n * The location of the first nonzero in each supernodal segment \n * (supernodal entry location) is also returned. \n * \n * \\param m number of rows in the matrix\n * \\param jcol Current column \n * \\param perm_r Row permutation\n * \\param maxsuper  Maximum number of column allowed in a supernode\n * \\param [in,out] nseg Number of segments in current U[*,j] - new segments appended\n * \\param lsub_col defines the rhs vector to start the dfs\n * \\param [in,out] segrep Segment representatives - new segments appended \n * \\param repfnz  First nonzero location in each row\n * \\param xprune \n * \\param marker  marker[i] == jj, if i was visited during dfs of current column jj;\n * \\param parent\n * \\param xplore working array\n * \\param glu global LU data \n * \\return 0 success\n *         > 0 number of bytes allocated when run out of space\n * \n */\ntemplate <typename Scalar, typename Index>\nIndex SparseLUImpl<Scalar,Index>::column_dfs(const Index m, const Index jcol, IndexVector& perm_r, Index maxsuper, Index& nseg,  BlockIndexVector lsub_col, IndexVector& segrep, BlockIndexVector repfnz, IndexVector& xprune, IndexVector& marker, IndexVector& parent, IndexVector& xplore, GlobalLU_t& glu)\n{\n  \n  Index jsuper = glu.supno(jcol); \n  Index nextl = glu.xlsub(jcol); \n  VectorBlock<IndexVector> marker2(marker, 2*m, m); \n  \n  \n  column_dfs_traits<IndexVector, ScalarVector> traits(jcol, jsuper, glu, *this);\n  \n  // For each nonzero in A(*,jcol) do dfs \n  for (Index k = 0; ((k < m) ? lsub_col[k] != emptyIdxLU : false) ; k++)\n  {\n    Index krow = lsub_col(k); \n    lsub_col(k) = emptyIdxLU; \n    Index kmark = marker2(krow); \n    \n    // krow was visited before, go to the next nonz; \n    if (kmark == jcol) continue;\n    \n    dfs_kernel(jcol, perm_r, nseg, glu.lsub, segrep, repfnz, xprune, marker2, parent,\n                   xplore, glu, nextl, krow, traits);\n  } // for each nonzero ... \n  \n  Index fsupc, jptr, jm1ptr, ito, ifrom, istop;\n  Index nsuper = glu.supno(jcol);\n  Index jcolp1 = jcol + 1;\n  Index jcolm1 = jcol - 1;\n  \n  // check to see if j belongs in the same supernode as j-1\n  if ( jcol == 0 )\n  { // Do nothing for column 0 \n    nsuper = glu.supno(0) = 0 ;\n  }\n  else \n  {\n    fsupc = glu.xsup(nsuper); \n    jptr = glu.xlsub(jcol); // Not yet compressed\n    jm1ptr = glu.xlsub(jcolm1); \n    \n    // Use supernodes of type T2 : see SuperLU paper\n    if ( (nextl-jptr != jptr-jm1ptr-1) ) jsuper = emptyIdxLU;\n    \n    // Make sure the number of columns in a supernode doesn't\n    // exceed threshold\n    if ( (jcol - fsupc) >= maxsuper) jsuper = emptyIdxLU; \n    \n    /* If jcol starts a new supernode, reclaim storage space in\n     * glu.lsub from previous supernode. Note we only store \n     * the subscript set of the first and last columns of \n     * a supernode. (first for num values, last for pruning)\n     */\n    if (jsuper == emptyIdxLU)\n    { // starts a new supernode \n      if ( (fsupc < jcolm1-1) ) \n      { // >= 3 columns in nsuper\n        ito = glu.xlsub(fsupc+1);\n        glu.xlsub(jcolm1) = ito; \n        istop = ito + jptr - jm1ptr; \n        xprune(jcolm1) = istop; // intialize xprune(jcol-1)\n        glu.xlsub(jcol) = istop; \n        \n        for (ifrom = jm1ptr; ifrom < nextl; ++ifrom, ++ito)\n          glu.lsub(ito) = glu.lsub(ifrom); \n        nextl = ito;  // = istop + length(jcol)\n      }\n      nsuper++; \n      glu.supno(jcol) = nsuper; \n    } // if a new supernode \n  } // end else:  jcol > 0\n  \n  // Tidy up the pointers before exit\n  glu.xsup(nsuper+1) = jcolp1; \n  glu.supno(jcolp1) = nsuper; \n  xprune(jcol) = nextl;  // Intialize upper bound for pruning\n  glu.xlsub(jcolp1) = nextl; \n  \n  return 0; \n}\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n/* \n \n * NOTE: This file is the modified version of [s,d,c,z]copy_to_ucol.c file in SuperLU \n \n * -- SuperLU routine (version 2.0) --\n * Univ. of California Berkeley, Xerox Palo Alto Research Center,\n * and Lawrence Berkeley National Lab.\n * November 15, 1997\n *\n * Copyright (c) 1994 by Xerox Corporation.  All rights reserved.\n *\n * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY\n * EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.\n *\n * Permission is hereby granted to use or copy this program for any\n * purpose, provided the above notices are retained on all copies.\n * Permission to modify the code and to distribute modified code is\n * granted, provided the above notices are retained, and a notice that\n * the code was modified is included with the above copyright notice.\n */\n#ifndef SPARSELU_COPY_TO_UCOL_H\n#define SPARSELU_COPY_TO_UCOL_H\n\nnamespace Eigen {\nnamespace internal {\n\n/**\n * \\brief Performs numeric block updates (sup-col) in topological order\n * \n * \\param jcol current column to update\n * \\param nseg Number of segments in the U part\n * \\param segrep segment representative ...\n * \\param repfnz First nonzero column in each row  ...\n * \\param perm_r Row permutation \n * \\param dense Store the full representation of the column\n * \\param glu Global LU data. \n * \\return 0 - successful return \n *         > 0 - number of bytes allocated when run out of space\n * \n */\ntemplate <typename Scalar, typename Index>\nIndex SparseLUImpl<Scalar,Index>::copy_to_ucol(const Index jcol, const Index nseg, IndexVector& segrep, BlockIndexVector repfnz ,IndexVector& perm_r, BlockScalarVector dense, GlobalLU_t& glu)\n{  \n  Index ksub, krep, ksupno; \n    \n  Index jsupno = glu.supno(jcol);\n  \n  // For each nonzero supernode segment of U[*,j] in topological order \n  Index k = nseg - 1, i; \n  Index nextu = glu.xusub(jcol); \n  Index kfnz, isub, segsize; \n  Index new_next,irow; \n  Index fsupc, mem; \n  for (ksub = 0; ksub < nseg; ksub++)\n  {\n    krep = segrep(k); k--; \n    ksupno = glu.supno(krep); \n    if (jsupno != ksupno ) // should go into ucol(); \n    {\n      kfnz = repfnz(krep); \n      if (kfnz != emptyIdxLU)\n      { // Nonzero U-segment \n        fsupc = glu.xsup(ksupno); \n        isub = glu.xlsub(fsupc) + kfnz - fsupc; \n        segsize = krep - kfnz + 1; \n        new_next = nextu + segsize; \n        while (new_next > glu.nzumax) \n        {\n          mem = memXpand<ScalarVector>(glu.ucol, glu.nzumax, nextu, UCOL, glu.num_expansions); \n          if (mem) return mem; \n          mem = memXpand<IndexVector>(glu.usub, glu.nzumax, nextu, USUB, glu.num_expansions); \n          if (mem) return mem; \n          \n        }\n        \n        for (i = 0; i < segsize; i++)\n        {\n          irow = glu.lsub(isub); \n          glu.usub(nextu) = perm_r(irow); // Unlike the L part, the U part is stored in its final order\n          glu.ucol(nextu) = dense(irow); \n          dense(irow) = Scalar(0.0); \n          nextu++;\n          isub++;\n        }\n        \n      } // end nonzero U-segment \n      \n    } // end if jsupno \n    \n  } // end for each segment\n  glu.xusub(jcol + 1) = nextu; // close U(*,jcol)\n  return 0; \n}\n\n} // namespace internal\n} // end namespace Eigen\n\n#endif // SPARSELU_COPY_TO_UCOL_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseLU/SparseLU_gemm_kernel.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SPARSELU_GEMM_KERNEL_H\n#define EIGEN_SPARSELU_GEMM_KERNEL_H\n\nnamespace Eigen {\n\nnamespace internal {\n\n\n/** \\internal\n  * A general matrix-matrix product kernel optimized for the SparseLU factorization.\n  *  - A, B, and C must be column major\n  *  - lda and ldc must be multiples of the respective packet size\n  *  - C must have the same alignment as A\n  */\ntemplate<typename Scalar,typename Index>\nEIGEN_DONT_INLINE\nvoid sparselu_gemm(Index m, Index n, Index d, const Scalar* A, Index lda, const Scalar* B, Index ldb, Scalar* C, Index ldc)\n{\n  using namespace Eigen::internal;\n  \n  typedef typename packet_traits<Scalar>::type Packet;\n  enum {\n    NumberOfRegisters = EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS,\n    PacketSize = packet_traits<Scalar>::size,\n    PM = 8,                             // peeling in M\n    RN = 2,                             // register blocking\n    RK = NumberOfRegisters>=16 ? 4 : 2, // register blocking\n    BM = 4096/sizeof(Scalar),           // number of rows of A-C per chunk\n    SM = PM*PacketSize                  // step along M\n  };\n  Index d_end = (d/RK)*RK;    // number of columns of A (rows of B) suitable for full register blocking\n  Index n_end = (n/RN)*RN;    // number of columns of B-C suitable for processing RN columns at once\n  Index i0 = internal::first_aligned(A,m);\n  \n  eigen_internal_assert(((lda%PacketSize)==0) && ((ldc%PacketSize)==0) && (i0==internal::first_aligned(C,m)));\n  \n  // handle the non aligned rows of A and C without any optimization:\n  for(Index i=0; i<i0; ++i)\n  {\n    for(Index j=0; j<n; ++j)\n    {\n      Scalar c = C[i+j*ldc];\n      for(Index k=0; k<d; ++k)\n        c += B[k+j*ldb] * A[i+k*lda];\n      C[i+j*ldc] = c;\n    }\n  }\n  // process the remaining rows per chunk of BM rows\n  for(Index ib=i0; ib<m; ib+=BM)\n  {\n    Index actual_b = std::min<Index>(BM, m-ib);                 // actual number of rows\n    Index actual_b_end1 = (actual_b/SM)*SM;                   // actual number of rows suitable for peeling\n    Index actual_b_end2 = (actual_b/PacketSize)*PacketSize;   // actual number of rows suitable for vectorization\n    \n    // Let's process two columns of B-C at once\n    for(Index j=0; j<n_end; j+=RN)\n    {\n      const Scalar* Bc0 = B+(j+0)*ldb;\n      const Scalar* Bc1 = B+(j+1)*ldb;\n      \n      for(Index k=0; k<d_end; k+=RK)\n      {\n        \n        // load and expand a RN x RK block of B\n        Packet b00, b10, b20, b30, b01, b11, b21, b31;\n                  b00 = pset1<Packet>(Bc0[0]);\n                  b10 = pset1<Packet>(Bc0[1]);\n        if(RK==4) b20 = pset1<Packet>(Bc0[2]);\n        if(RK==4) b30 = pset1<Packet>(Bc0[3]);\n                  b01 = pset1<Packet>(Bc1[0]);\n                  b11 = pset1<Packet>(Bc1[1]);\n        if(RK==4) b21 = pset1<Packet>(Bc1[2]);\n        if(RK==4) b31 = pset1<Packet>(Bc1[3]);\n        \n        Packet a0, a1, a2, a3, c0, c1, t0, t1;\n        \n        const Scalar* A0 = A+ib+(k+0)*lda;\n        const Scalar* A1 = A+ib+(k+1)*lda;\n        const Scalar* A2 = A+ib+(k+2)*lda;\n        const Scalar* A3 = A+ib+(k+3)*lda;\n        \n        Scalar* C0 = C+ib+(j+0)*ldc;\n        Scalar* C1 = C+ib+(j+1)*ldc;\n        \n                  a0 = pload<Packet>(A0);\n                  a1 = pload<Packet>(A1);\n        if(RK==4)\n        {\n          a2 = pload<Packet>(A2);\n          a3 = pload<Packet>(A3);\n        }\n        else\n        {\n          // workaround \"may be used uninitialized in this function\" warning\n          a2 = a3 = a0;\n        }\n        \n#define KMADD(c, a, b, tmp) {tmp = b; tmp = pmul(a,tmp); c = padd(c,tmp);}\n#define WORK(I)  \\\n                    c0 = pload<Packet>(C0+i+(I)*PacketSize);   \\\n                    c1 = pload<Packet>(C1+i+(I)*PacketSize);   \\\n                    KMADD(c0, a0, b00, t0)      \\\n                    KMADD(c1, a0, b01, t1)      \\\n                    a0 = pload<Packet>(A0+i+(I+1)*PacketSize); \\\n                    KMADD(c0, a1, b10, t0)      \\\n                    KMADD(c1, a1, b11, t1)       \\\n                    a1 = pload<Packet>(A1+i+(I+1)*PacketSize); \\\n          if(RK==4) KMADD(c0, a2, b20, t0)       \\\n          if(RK==4) KMADD(c1, a2, b21, t1)       \\\n          if(RK==4) a2 = pload<Packet>(A2+i+(I+1)*PacketSize); \\\n          if(RK==4) KMADD(c0, a3, b30, t0)       \\\n          if(RK==4) KMADD(c1, a3, b31, t1)       \\\n          if(RK==4) a3 = pload<Packet>(A3+i+(I+1)*PacketSize); \\\n                    pstore(C0+i+(I)*PacketSize, c0);           \\\n                    pstore(C1+i+(I)*PacketSize, c1)\n        \n        // process rows of A' - C' with aggressive vectorization and peeling \n        for(Index i=0; i<actual_b_end1; i+=PacketSize*8)\n        {\n          EIGEN_ASM_COMMENT(\"SPARSELU_GEMML_KERNEL1\");\n                    prefetch((A0+i+(5)*PacketSize));\n                    prefetch((A1+i+(5)*PacketSize));\n          if(RK==4) prefetch((A2+i+(5)*PacketSize));\n          if(RK==4) prefetch((A3+i+(5)*PacketSize));\n                    WORK(0);\n                    WORK(1);\n                    WORK(2);\n                    WORK(3);\n                    WORK(4);\n                    WORK(5);\n                    WORK(6);\n                    WORK(7);\n        }\n        // process the remaining rows with vectorization only\n        for(Index i=actual_b_end1; i<actual_b_end2; i+=PacketSize)\n        {\n          WORK(0);\n        }\n#undef WORK\n        // process the remaining rows without vectorization\n        for(Index i=actual_b_end2; i<actual_b; ++i)\n        {\n          if(RK==4)\n          {\n            C0[i] += A0[i]*Bc0[0]+A1[i]*Bc0[1]+A2[i]*Bc0[2]+A3[i]*Bc0[3];\n            C1[i] += A0[i]*Bc1[0]+A1[i]*Bc1[1]+A2[i]*Bc1[2]+A3[i]*Bc1[3];\n          }\n          else\n          {\n            C0[i] += A0[i]*Bc0[0]+A1[i]*Bc0[1];\n            C1[i] += A0[i]*Bc1[0]+A1[i]*Bc1[1];\n          }\n        }\n        \n        Bc0 += RK;\n        Bc1 += RK;\n      } // peeled loop on k\n    } // peeled loop on the columns j\n    // process the last column (we now perform a matrux-vector product)\n    if((n-n_end)>0)\n    {\n      const Scalar* Bc0 = B+(n-1)*ldb;\n      \n      for(Index k=0; k<d_end; k+=RK)\n      {\n        \n        // load and expand a 1 x RK block of B\n        Packet b00, b10, b20, b30;\n                  b00 = pset1<Packet>(Bc0[0]);\n                  b10 = pset1<Packet>(Bc0[1]);\n        if(RK==4) b20 = pset1<Packet>(Bc0[2]);\n        if(RK==4) b30 = pset1<Packet>(Bc0[3]);\n        \n        Packet a0, a1, a2, a3, c0, t0/*, t1*/;\n        \n        const Scalar* A0 = A+ib+(k+0)*lda;\n        const Scalar* A1 = A+ib+(k+1)*lda;\n        const Scalar* A2 = A+ib+(k+2)*lda;\n        const Scalar* A3 = A+ib+(k+3)*lda;\n        \n        Scalar* C0 = C+ib+(n_end)*ldc;\n        \n                  a0 = pload<Packet>(A0);\n                  a1 = pload<Packet>(A1);\n        if(RK==4)\n        {\n          a2 = pload<Packet>(A2);\n          a3 = pload<Packet>(A3);\n        }\n        else\n        {\n          // workaround \"may be used uninitialized in this function\" warning\n          a2 = a3 = a0;\n        }\n        \n#define WORK(I) \\\n                  c0 = pload<Packet>(C0+i+(I)*PacketSize);   \\\n                  KMADD(c0, a0, b00, t0)       \\\n                  a0 = pload<Packet>(A0+i+(I+1)*PacketSize); \\\n                  KMADD(c0, a1, b10, t0)       \\\n                  a1 = pload<Packet>(A1+i+(I+1)*PacketSize); \\\n        if(RK==4) KMADD(c0, a2, b20, t0)       \\\n        if(RK==4) a2 = pload<Packet>(A2+i+(I+1)*PacketSize); \\\n        if(RK==4) KMADD(c0, a3, b30, t0)       \\\n        if(RK==4) a3 = pload<Packet>(A3+i+(I+1)*PacketSize); \\\n                  pstore(C0+i+(I)*PacketSize, c0);\n        \n        // agressive vectorization and peeling\n        for(Index i=0; i<actual_b_end1; i+=PacketSize*8)\n        {\n          EIGEN_ASM_COMMENT(\"SPARSELU_GEMML_KERNEL2\");\n          WORK(0);\n          WORK(1);\n          WORK(2);\n          WORK(3);\n          WORK(4);\n          WORK(5);\n          WORK(6);\n          WORK(7);\n        }\n        // vectorization only\n        for(Index i=actual_b_end1; i<actual_b_end2; i+=PacketSize)\n        {\n          WORK(0);\n        }\n        // remaining scalars\n        for(Index i=actual_b_end2; i<actual_b; ++i)\n        {\n          if(RK==4) \n            C0[i] += A0[i]*Bc0[0]+A1[i]*Bc0[1]+A2[i]*Bc0[2]+A3[i]*Bc0[3];\n          else\n            C0[i] += A0[i]*Bc0[0]+A1[i]*Bc0[1];\n        }\n        \n        Bc0 += RK;\n#undef WORK\n      }\n    }\n    \n    // process the last columns of A, corresponding to the last rows of B\n    Index rd = d-d_end;\n    if(rd>0)\n    {\n      for(Index j=0; j<n; ++j)\n      {\n        enum {\n          Alignment = PacketSize>1 ? Aligned : 0\n        };\n        typedef Map<Matrix<Scalar,Dynamic,1>, Alignment > MapVector;\n        typedef Map<const Matrix<Scalar,Dynamic,1>, Alignment > ConstMapVector;\n        if(rd==1)       MapVector(C+j*ldc+ib,actual_b) += B[0+d_end+j*ldb] * ConstMapVector(A+(d_end+0)*lda+ib, actual_b);\n        \n        else if(rd==2)  MapVector(C+j*ldc+ib,actual_b) += B[0+d_end+j*ldb] * ConstMapVector(A+(d_end+0)*lda+ib, actual_b)\n                                                        + B[1+d_end+j*ldb] * ConstMapVector(A+(d_end+1)*lda+ib, actual_b);\n        \n        else            MapVector(C+j*ldc+ib,actual_b) += B[0+d_end+j*ldb] * ConstMapVector(A+(d_end+0)*lda+ib, actual_b)\n                                                        + B[1+d_end+j*ldb] * ConstMapVector(A+(d_end+1)*lda+ib, actual_b)\n                                                        + B[2+d_end+j*ldb] * ConstMapVector(A+(d_end+2)*lda+ib, actual_b);\n      }\n    }\n  \n  } // blocking on the rows of A and C\n}\n#undef KMADD\n\n} // namespace internal\n\n} // namespace Eigen\n\n#endif // EIGEN_SPARSELU_GEMM_KERNEL_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n/* This file is a modified version of heap_relax_snode.c file in SuperLU\n * -- SuperLU routine (version 3.0) --\n * Univ. of California Berkeley, Xerox Palo Alto Research Center,\n * and Lawrence Berkeley National Lab.\n * October 15, 2003\n *\n * Copyright (c) 1994 by Xerox Corporation.  All rights reserved.\n *\n * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY\n * EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.\n *\n * Permission is hereby granted to use or copy this program for any\n * purpose, provided the above notices are retained on all copies.\n * Permission to modify the code and to distribute modified code is\n * granted, provided the above notices are retained, and a notice that\n * the code was modified is included with the above copyright notice.\n */\n\n#ifndef SPARSELU_HEAP_RELAX_SNODE_H\n#define SPARSELU_HEAP_RELAX_SNODE_H\n\nnamespace Eigen {\nnamespace internal {\n\n/** \n * \\brief Identify the initial relaxed supernodes\n * \n * This routine applied to a symmetric elimination tree. \n * It assumes that the matrix has been reordered according to the postorder of the etree\n * \\param n The number of columns\n * \\param et elimination tree \n * \\param relax_columns Maximum number of columns allowed in a relaxed snode \n * \\param descendants Number of descendants of each node in the etree\n * \\param relax_end last column in a supernode\n */\ntemplate <typename Scalar, typename Index>\nvoid SparseLUImpl<Scalar,Index>::heap_relax_snode (const Index n, IndexVector& et, const Index relax_columns, IndexVector& descendants, IndexVector& relax_end)\n{\n  \n  // The etree may not be postordered, but its heap ordered  \n  IndexVector post;\n  internal::treePostorder(n, et, post); // Post order etree\n  IndexVector inv_post(n+1); \n  Index i;\n  for (i = 0; i < n+1; ++i) inv_post(post(i)) = i; // inv_post = post.inverse()???\n  \n  // Renumber etree in postorder \n  IndexVector iwork(n);\n  IndexVector et_save(n+1);\n  for (i = 0; i < n; ++i)\n  {\n    iwork(post(i)) = post(et(i));\n  }\n  et_save = et; // Save the original etree\n  et = iwork; \n  \n  // compute the number of descendants of each node in the etree\n  relax_end.setConstant(emptyIdxLU);\n  Index j, parent; \n  descendants.setZero();\n  for (j = 0; j < n; j++) \n  {\n    parent = et(j);\n    if (parent != n) // not the dummy root\n      descendants(parent) += descendants(j) + 1;\n  }\n  // Identify the relaxed supernodes by postorder traversal of the etree\n  Index snode_start; // beginning of a snode \n  Index k;\n  Index nsuper_et_post = 0; // Number of relaxed snodes in postordered etree \n  Index nsuper_et = 0; // Number of relaxed snodes in the original etree \n  Index l; \n  for (j = 0; j < n; )\n  {\n    parent = et(j);\n    snode_start = j; \n    while ( parent != n && descendants(parent) < relax_columns ) \n    {\n      j = parent; \n      parent = et(j);\n    }\n    // Found a supernode in postordered etree, j is the last column \n    ++nsuper_et_post;\n    k = n;\n    for (i = snode_start; i <= j; ++i)\n      k = (std::min)(k, inv_post(i));\n    l = inv_post(j);\n    if ( (l - k) == (j - snode_start) )  // Same number of columns in the snode\n    {\n      // This is also a supernode in the original etree\n      relax_end(k) = l; // Record last column \n      ++nsuper_et; \n    }\n    else \n    {\n      for (i = snode_start; i <= j; ++i) \n      {\n        l = inv_post(i);\n        if (descendants(i) == 0) \n        {\n          relax_end(l) = l;\n          ++nsuper_et;\n        }\n      }\n    }\n    j++;\n    // Search for a new leaf\n    while (descendants(j) != 0 && j < n) j++;\n  } // End postorder traversal of the etree\n  \n  // Recover the original etree\n  et = et_save; \n}\n\n} // end namespace internal\n\n} // end namespace Eigen\n#endif // SPARSELU_HEAP_RELAX_SNODE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseLU/SparseLU_kernel_bmod.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam@inria.fr>\n// Copyright (C) 2012 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef SPARSELU_KERNEL_BMOD_H\n#define SPARSELU_KERNEL_BMOD_H\n\nnamespace Eigen {\nnamespace internal {\n  \n/**\n * \\brief Performs numeric block updates from a given supernode to a single column\n * \n * \\param segsize Size of the segment (and blocks ) to use for updates\n * \\param[in,out] dense Packed values of the original matrix\n * \\param tempv temporary vector to use for updates\n * \\param lusup array containing the supernodes\n * \\param lda Leading dimension in the supernode\n * \\param nrow Number of rows in the rectangular part of the supernode\n * \\param lsub compressed row subscripts of supernodes\n * \\param lptr pointer to the first column of the current supernode in lsub\n * \\param no_zeros Number of nonzeros elements before the diagonal part of the supernode\n * \\return 0 on success\n */\ntemplate <int SegSizeAtCompileTime> struct LU_kernel_bmod\n{\n  template <typename BlockScalarVector, typename ScalarVector, typename IndexVector, typename Index>\n  static EIGEN_DONT_INLINE void run(const int segsize, BlockScalarVector& dense, ScalarVector& tempv, ScalarVector& lusup, Index& luptr, const Index lda,\n                                    const Index nrow, IndexVector& lsub, const Index lptr, const Index no_zeros);\n};\n\ntemplate <int SegSizeAtCompileTime>\ntemplate <typename BlockScalarVector, typename ScalarVector, typename IndexVector, typename Index>\nEIGEN_DONT_INLINE void LU_kernel_bmod<SegSizeAtCompileTime>::run(const int segsize, BlockScalarVector& dense, ScalarVector& tempv, ScalarVector& lusup, Index& luptr, const Index lda,\n                                                                  const Index nrow, IndexVector& lsub, const Index lptr, const Index no_zeros)\n{\n  typedef typename ScalarVector::Scalar Scalar;\n  // First, copy U[*,j] segment from dense(*) to tempv(*)\n  // The result of triangular solve is in tempv[*]; \n    // The result of matric-vector update is in dense[*]\n  Index isub = lptr + no_zeros; \n  int i;\n  Index irow;\n  for (i = 0; i < ((SegSizeAtCompileTime==Dynamic)?segsize:SegSizeAtCompileTime); i++)\n  {\n    irow = lsub(isub); \n    tempv(i) = dense(irow); \n    ++isub; \n  }\n  // Dense triangular solve -- start effective triangle\n  luptr += lda * no_zeros + no_zeros; \n  // Form Eigen matrix and vector \n  Map<Matrix<Scalar,SegSizeAtCompileTime,SegSizeAtCompileTime, ColMajor>, 0, OuterStride<> > A( &(lusup.data()[luptr]), segsize, segsize, OuterStride<>(lda) );\n  Map<Matrix<Scalar,SegSizeAtCompileTime,1> > u(tempv.data(), segsize);\n  \n  u = A.template triangularView<UnitLower>().solve(u); \n  \n  // Dense matrix-vector product y <-- B*x \n  luptr += segsize;\n  const Index PacketSize = internal::packet_traits<Scalar>::size;\n  Index ldl = internal::first_multiple(nrow, PacketSize);\n  Map<Matrix<Scalar,Dynamic,SegSizeAtCompileTime, ColMajor>, 0, OuterStride<> > B( &(lusup.data()[luptr]), nrow, segsize, OuterStride<>(lda) );\n  Index aligned_offset = internal::first_aligned(tempv.data()+segsize, PacketSize);\n  Index aligned_with_B_offset = (PacketSize-internal::first_aligned(B.data(), PacketSize))%PacketSize;\n  Map<Matrix<Scalar,Dynamic,1>, 0, OuterStride<> > l(tempv.data()+segsize+aligned_offset+aligned_with_B_offset, nrow, OuterStride<>(ldl) );\n  \n  l.setZero();\n  internal::sparselu_gemm<Scalar>(l.rows(), l.cols(), B.cols(), B.data(), B.outerStride(), u.data(), u.outerStride(), l.data(), l.outerStride());\n  \n  // Scatter tempv[] into SPA dense[] as a temporary storage \n  isub = lptr + no_zeros;\n  for (i = 0; i < ((SegSizeAtCompileTime==Dynamic)?segsize:SegSizeAtCompileTime); i++)\n  {\n    irow = lsub(isub++); \n    dense(irow) = tempv(i);\n  }\n  \n  // Scatter l into SPA dense[]\n  for (i = 0; i < nrow; i++)\n  {\n    irow = lsub(isub++); \n    dense(irow) -= l(i);\n  } \n}\n\ntemplate <> struct LU_kernel_bmod<1>\n{\n  template <typename BlockScalarVector, typename ScalarVector, typename IndexVector, typename Index>\n  static EIGEN_DONT_INLINE void run(const int /*segsize*/, BlockScalarVector& dense, ScalarVector& /*tempv*/, ScalarVector& lusup, Index& luptr,\n                                    const Index lda, const Index nrow, IndexVector& lsub, const Index lptr, const Index no_zeros);\n};\n\n\ntemplate <typename BlockScalarVector, typename ScalarVector, typename IndexVector, typename Index>\nEIGEN_DONT_INLINE void LU_kernel_bmod<1>::run(const int /*segsize*/, BlockScalarVector& dense, ScalarVector& /*tempv*/, ScalarVector& lusup, Index& luptr,\n                                              const Index lda, const Index nrow, IndexVector& lsub, const Index lptr, const Index no_zeros)\n{\n  typedef typename ScalarVector::Scalar Scalar;\n  Scalar f = dense(lsub(lptr + no_zeros));\n  luptr += lda * no_zeros + no_zeros + 1;\n  const Scalar* a(lusup.data() + luptr);\n  const /*typename IndexVector::Scalar*/Index*  irow(lsub.data()+lptr + no_zeros + 1);\n  Index i = 0;\n  for (; i+1 < nrow; i+=2)\n  {\n    Index i0 = *(irow++);\n    Index i1 = *(irow++);\n    Scalar a0 = *(a++);\n    Scalar a1 = *(a++);\n    Scalar d0 = dense.coeff(i0);\n    Scalar d1 = dense.coeff(i1);\n    d0 -= f*a0;\n    d1 -= f*a1;\n    dense.coeffRef(i0) = d0;\n    dense.coeffRef(i1) = d1;\n  }\n  if(i<nrow)\n    dense.coeffRef(*(irow++)) -= f * *(a++);\n}\n\n} // end namespace internal\n\n} // end namespace Eigen\n#endif // SPARSELU_KERNEL_BMOD_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseLU/SparseLU_panel_bmod.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam@inria.fr>\n// Copyright (C) 2012 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n/* \n \n * NOTE: This file is the modified version of [s,d,c,z]panel_bmod.c file in SuperLU \n \n * -- SuperLU routine (version 3.0) --\n * Univ. of California Berkeley, Xerox Palo Alto Research Center,\n * and Lawrence Berkeley National Lab.\n * October 15, 2003\n *\n * Copyright (c) 1994 by Xerox Corporation.  All rights reserved.\n *\n * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY\n * EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.\n *\n * Permission is hereby granted to use or copy this program for any\n * purpose, provided the above notices are retained on all copies.\n * Permission to modify the code and to distribute modified code is\n * granted, provided the above notices are retained, and a notice that\n * the code was modified is included with the above copyright notice.\n */\n#ifndef SPARSELU_PANEL_BMOD_H\n#define SPARSELU_PANEL_BMOD_H\n\nnamespace Eigen {\nnamespace internal {\n\n/**\n * \\brief Performs numeric block updates (sup-panel) in topological order.\n * \n * Before entering this routine, the original nonzeros in the panel\n * were already copied i nto the spa[m,w]\n * \n * \\param m number of rows in the matrix\n * \\param w Panel size\n * \\param jcol Starting  column of the panel\n * \\param nseg Number of segments in the U part\n * \\param dense Store the full representation of the panel \n * \\param tempv working array \n * \\param segrep segment representative... first row in the segment\n * \\param repfnz First nonzero rows\n * \\param glu Global LU data. \n * \n * \n */\ntemplate <typename Scalar, typename Index>\nvoid SparseLUImpl<Scalar,Index>::panel_bmod(const Index m, const Index w, const Index jcol, \n                                            const Index nseg, ScalarVector& dense, ScalarVector& tempv,\n                                            IndexVector& segrep, IndexVector& repfnz, GlobalLU_t& glu)\n{\n  \n  Index ksub,jj,nextl_col; \n  Index fsupc, nsupc, nsupr, nrow; \n  Index krep, kfnz; \n  Index lptr; // points to the row subscripts of a supernode \n  Index luptr; // ...\n  Index segsize,no_zeros ; \n  // For each nonz supernode segment of U[*,j] in topological order\n  Index k = nseg - 1; \n  const Index PacketSize = internal::packet_traits<Scalar>::size;\n  \n  for (ksub = 0; ksub < nseg; ksub++)\n  { // For each updating supernode\n    /* krep = representative of current k-th supernode\n     * fsupc =  first supernodal column\n     * nsupc = number of columns in a supernode\n     * nsupr = number of rows in a supernode\n     */\n    krep = segrep(k); k--; \n    fsupc = glu.xsup(glu.supno(krep)); \n    nsupc = krep - fsupc + 1; \n    nsupr = glu.xlsub(fsupc+1) - glu.xlsub(fsupc); \n    nrow = nsupr - nsupc; \n    lptr = glu.xlsub(fsupc); \n    \n    // loop over the panel columns to detect the actual number of columns and rows\n    Index u_rows = 0;\n    Index u_cols = 0;\n    for (jj = jcol; jj < jcol + w; jj++)\n    {\n      nextl_col = (jj-jcol) * m; \n      VectorBlock<IndexVector> repfnz_col(repfnz, nextl_col, m); // First nonzero column index for each row\n      \n      kfnz = repfnz_col(krep); \n      if ( kfnz == emptyIdxLU ) \n        continue; // skip any zero segment\n      \n      segsize = krep - kfnz + 1;\n      u_cols++;\n      u_rows = (std::max)(segsize,u_rows);\n    }\n    \n    if(nsupc >= 2)\n    { \n      Index ldu = internal::first_multiple<Index>(u_rows, PacketSize);\n      Map<ScalarMatrix, Aligned,  OuterStride<> > U(tempv.data(), u_rows, u_cols, OuterStride<>(ldu));\n      \n      // gather U\n      Index u_col = 0;\n      for (jj = jcol; jj < jcol + w; jj++)\n      {\n        nextl_col = (jj-jcol) * m; \n        VectorBlock<IndexVector> repfnz_col(repfnz, nextl_col, m); // First nonzero column index for each row\n        VectorBlock<ScalarVector> dense_col(dense, nextl_col, m); // Scatter/gather entire matrix column from/to here\n        \n        kfnz = repfnz_col(krep); \n        if ( kfnz == emptyIdxLU ) \n          continue; // skip any zero segment\n        \n        segsize = krep - kfnz + 1;\n        luptr = glu.xlusup(fsupc);    \n        no_zeros = kfnz - fsupc; \n        \n        Index isub = lptr + no_zeros;\n        Index off = u_rows-segsize;\n        for (Index i = 0; i < off; i++) U(i,u_col) = 0;\n        for (Index i = 0; i < segsize; i++)\n        {\n          Index irow = glu.lsub(isub); \n          U(i+off,u_col) = dense_col(irow); \n          ++isub; \n        }\n        u_col++;\n      }\n      // solve U = A^-1 U\n      luptr = glu.xlusup(fsupc);\n      Index lda = glu.xlusup(fsupc+1) - glu.xlusup(fsupc);\n      no_zeros = (krep - u_rows + 1) - fsupc;\n      luptr += lda * no_zeros + no_zeros;\n      MappedMatrixBlock A(glu.lusup.data()+luptr, u_rows, u_rows, OuterStride<>(lda) );\n      U = A.template triangularView<UnitLower>().solve(U);\n      \n      // update\n      luptr += u_rows;\n      MappedMatrixBlock B(glu.lusup.data()+luptr, nrow, u_rows, OuterStride<>(lda) );\n      eigen_assert(tempv.size()>w*ldu + nrow*w + 1);\n      \n      Index ldl = internal::first_multiple<Index>(nrow, PacketSize);\n      Index offset = (PacketSize-internal::first_aligned(B.data(), PacketSize)) % PacketSize;\n      MappedMatrixBlock L(tempv.data()+w*ldu+offset, nrow, u_cols, OuterStride<>(ldl));\n      \n      L.setZero();\n      internal::sparselu_gemm<Scalar>(L.rows(), L.cols(), B.cols(), B.data(), B.outerStride(), U.data(), U.outerStride(), L.data(), L.outerStride());\n      \n      // scatter U and L\n      u_col = 0;\n      for (jj = jcol; jj < jcol + w; jj++)\n      {\n        nextl_col = (jj-jcol) * m; \n        VectorBlock<IndexVector> repfnz_col(repfnz, nextl_col, m); // First nonzero column index for each row\n        VectorBlock<ScalarVector> dense_col(dense, nextl_col, m); // Scatter/gather entire matrix column from/to here\n        \n        kfnz = repfnz_col(krep); \n        if ( kfnz == emptyIdxLU ) \n          continue; // skip any zero segment\n        \n        segsize = krep - kfnz + 1;\n        no_zeros = kfnz - fsupc; \n        Index isub = lptr + no_zeros;\n        \n        Index off = u_rows-segsize;\n        for (Index i = 0; i < segsize; i++)\n        {\n          Index irow = glu.lsub(isub++); \n          dense_col(irow) = U.coeff(i+off,u_col);\n          U.coeffRef(i+off,u_col) = 0;\n        }\n        \n        // Scatter l into SPA dense[]\n        for (Index i = 0; i < nrow; i++)\n        {\n          Index irow = glu.lsub(isub++); \n          dense_col(irow) -= L.coeff(i,u_col);\n          L.coeffRef(i,u_col) = 0;\n        }\n        u_col++;\n      }\n    }\n    else // level 2 only\n    {\n      // Sequence through each column in the panel\n      for (jj = jcol; jj < jcol + w; jj++)\n      {\n        nextl_col = (jj-jcol) * m; \n        VectorBlock<IndexVector> repfnz_col(repfnz, nextl_col, m); // First nonzero column index for each row\n        VectorBlock<ScalarVector> dense_col(dense, nextl_col, m); // Scatter/gather entire matrix column from/to here\n        \n        kfnz = repfnz_col(krep); \n        if ( kfnz == emptyIdxLU ) \n          continue; // skip any zero segment\n        \n        segsize = krep - kfnz + 1;\n        luptr = glu.xlusup(fsupc);\n        \n        Index lda = glu.xlusup(fsupc+1)-glu.xlusup(fsupc);// nsupr\n        \n        // Perform a trianglar solve and block update, \n        // then scatter the result of sup-col update to dense[]\n        no_zeros = kfnz - fsupc; \n              if(segsize==1)  LU_kernel_bmod<1>::run(segsize, dense_col, tempv, glu.lusup, luptr, lda, nrow, glu.lsub, lptr, no_zeros);\n        else  if(segsize==2)  LU_kernel_bmod<2>::run(segsize, dense_col, tempv, glu.lusup, luptr, lda, nrow, glu.lsub, lptr, no_zeros);\n        else  if(segsize==3)  LU_kernel_bmod<3>::run(segsize, dense_col, tempv, glu.lusup, luptr, lda, nrow, glu.lsub, lptr, no_zeros);\n        else                  LU_kernel_bmod<Dynamic>::run(segsize, dense_col, tempv, glu.lusup, luptr, lda, nrow, glu.lsub, lptr, no_zeros); \n      } // End for each column in the panel \n    }\n    \n  } // End for each updating supernode\n} // end panel bmod\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // SPARSELU_PANEL_BMOD_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseLU/SparseLU_panel_dfs.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n/* \n \n * NOTE: This file is the modified version of [s,d,c,z]panel_dfs.c file in SuperLU \n \n * -- SuperLU routine (version 2.0) --\n * Univ. of California Berkeley, Xerox Palo Alto Research Center,\n * and Lawrence Berkeley National Lab.\n * November 15, 1997\n *\n * Copyright (c) 1994 by Xerox Corporation.  All rights reserved.\n *\n * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY\n * EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.\n *\n * Permission is hereby granted to use or copy this program for any\n * purpose, provided the above notices are retained on all copies.\n * Permission to modify the code and to distribute modified code is\n * granted, provided the above notices are retained, and a notice that\n * the code was modified is included with the above copyright notice.\n */\n#ifndef SPARSELU_PANEL_DFS_H\n#define SPARSELU_PANEL_DFS_H\n\nnamespace Eigen {\n\nnamespace internal {\n  \ntemplate<typename IndexVector>\nstruct panel_dfs_traits\n{\n  typedef typename IndexVector::Scalar Index;\n  panel_dfs_traits(Index jcol, Index* marker)\n    : m_jcol(jcol), m_marker(marker)\n  {}\n  bool update_segrep(Index krep, Index jj)\n  {\n    if(m_marker[krep]<m_jcol)\n    {\n      m_marker[krep] = jj; \n      return true;\n    }\n    return false;\n  }\n  void mem_expand(IndexVector& /*glu.lsub*/, Index /*nextl*/, Index /*chmark*/) {}\n  enum { ExpandMem = false };\n  Index m_jcol;\n  Index* m_marker;\n};\n\n\ntemplate <typename Scalar, typename Index>\ntemplate <typename Traits>\nvoid SparseLUImpl<Scalar,Index>::dfs_kernel(const Index jj, IndexVector& perm_r,\n                   Index& nseg, IndexVector& panel_lsub, IndexVector& segrep,\n                   Ref<IndexVector> repfnz_col, IndexVector& xprune, Ref<IndexVector> marker, IndexVector& parent,\n                   IndexVector& xplore, GlobalLU_t& glu,\n                   Index& nextl_col, Index krow, Traits& traits\n                  )\n{\n  \n  Index kmark = marker(krow);\n      \n  // For each unmarked krow of jj\n  marker(krow) = jj; \n  Index kperm = perm_r(krow); \n  if (kperm == emptyIdxLU ) {\n    // krow is in L : place it in structure of L(*, jj)\n    panel_lsub(nextl_col++) = krow;  // krow is indexed into A\n    \n    traits.mem_expand(panel_lsub, nextl_col, kmark);\n  }\n  else \n  {\n    // krow is in U : if its supernode-representative krep\n    // has been explored, update repfnz(*)\n    // krep = supernode representative of the current row\n    Index krep = glu.xsup(glu.supno(kperm)+1) - 1; \n    // First nonzero element in the current column:\n    Index myfnz = repfnz_col(krep); \n    \n    if (myfnz != emptyIdxLU )\n    {\n      // Representative visited before\n      if (myfnz > kperm ) repfnz_col(krep) = kperm; \n      \n    }\n    else \n    {\n      // Otherwise, perform dfs starting at krep\n      Index oldrep = emptyIdxLU; \n      parent(krep) = oldrep; \n      repfnz_col(krep) = kperm; \n      Index xdfs =  glu.xlsub(krep); \n      Index maxdfs = xprune(krep); \n      \n      Index kpar;\n      do \n      {\n        // For each unmarked kchild of krep\n        while (xdfs < maxdfs) \n        {\n          Index kchild = glu.lsub(xdfs); \n          xdfs++; \n          Index chmark = marker(kchild); \n          \n          if (chmark != jj ) \n          {\n            marker(kchild) = jj; \n            Index chperm = perm_r(kchild); \n            \n            if (chperm == emptyIdxLU) \n            {\n              // case kchild is in L: place it in L(*, j)\n              panel_lsub(nextl_col++) = kchild;\n              traits.mem_expand(panel_lsub, nextl_col, chmark);\n            }\n            else\n            {\n              // case kchild is in U :\n              // chrep = its supernode-rep. If its rep has been explored, \n              // update its repfnz(*)\n              Index chrep = glu.xsup(glu.supno(chperm)+1) - 1; \n              myfnz = repfnz_col(chrep); \n              \n              if (myfnz != emptyIdxLU) \n              { // Visited before \n                if (myfnz > chperm) \n                  repfnz_col(chrep) = chperm; \n              }\n              else \n              { // Cont. dfs at snode-rep of kchild\n                xplore(krep) = xdfs; \n                oldrep = krep; \n                krep = chrep; // Go deeper down G(L)\n                parent(krep) = oldrep; \n                repfnz_col(krep) = chperm; \n                xdfs = glu.xlsub(krep); \n                maxdfs = xprune(krep); \n                \n              } // end if myfnz != -1\n            } // end if chperm == -1 \n                \n          } // end if chmark !=jj\n        } // end while xdfs < maxdfs\n        \n        // krow has no more unexplored nbrs :\n        //    Place snode-rep krep in postorder DFS, if this \n        //    segment is seen for the first time. (Note that \n        //    \"repfnz(krep)\" may change later.)\n        //    Baktrack dfs to its parent\n        if(traits.update_segrep(krep,jj))\n        //if (marker1(krep) < jcol )\n        {\n          segrep(nseg) = krep; \n          ++nseg; \n          //marker1(krep) = jj; \n        }\n        \n        kpar = parent(krep); // Pop recursion, mimic recursion \n        if (kpar == emptyIdxLU) \n          break; // dfs done \n        krep = kpar; \n        xdfs = xplore(krep); \n        maxdfs = xprune(krep); \n\n      } while (kpar != emptyIdxLU); // Do until empty stack \n      \n    } // end if (myfnz = -1)\n\n  } // end if (kperm == -1)   \n}\n\n/**\n * \\brief Performs a symbolic factorization on a panel of columns [jcol, jcol+w)\n * \n * A supernode representative is the last column of a supernode.\n * The nonzeros in U[*,j] are segments that end at supernodes representatives\n * \n * The routine returns a list of the supernodal representatives \n * in topological order of the dfs that generates them. This list is \n * a superset of the topological order of each individual column within \n * the panel.\n * The location of the first nonzero in each supernodal segment \n * (supernodal entry location) is also returned. Each column has \n * a separate list for this purpose. \n * \n * Two markers arrays are used for dfs :\n *    marker[i] == jj, if i was visited during dfs of current column jj;\n *    marker1[i] >= jcol, if i was visited by earlier columns in this panel; \n * \n * \\param[in] m number of rows in the matrix\n * \\param[in] w Panel size\n * \\param[in] jcol Starting  column of the panel\n * \\param[in] A Input matrix in column-major storage\n * \\param[in] perm_r Row permutation\n * \\param[out] nseg Number of U segments\n * \\param[out] dense Accumulate the column vectors of the panel\n * \\param[out] panel_lsub Subscripts of the row in the panel \n * \\param[out] segrep Segment representative i.e first nonzero row of each segment\n * \\param[out] repfnz First nonzero location in each row\n * \\param[out] xprune The pruned elimination tree\n * \\param[out] marker work vector\n * \\param  parent The elimination tree\n * \\param xplore work vector\n * \\param glu The global data structure\n * \n */\n\ntemplate <typename Scalar, typename Index>\nvoid SparseLUImpl<Scalar,Index>::panel_dfs(const Index m, const Index w, const Index jcol, MatrixType& A, IndexVector& perm_r, Index& nseg, ScalarVector& dense, IndexVector& panel_lsub, IndexVector& segrep, IndexVector& repfnz, IndexVector& xprune, IndexVector& marker, IndexVector& parent, IndexVector& xplore, GlobalLU_t& glu)\n{\n  Index nextl_col; // Next available position in panel_lsub[*,jj] \n  \n  // Initialize pointers \n  VectorBlock<IndexVector> marker1(marker, m, m); \n  nseg = 0; \n  \n  panel_dfs_traits<IndexVector> traits(jcol, marker1.data());\n  \n  // For each column in the panel \n  for (Index jj = jcol; jj < jcol + w; jj++) \n  {\n    nextl_col = (jj - jcol) * m; \n    \n    VectorBlock<IndexVector> repfnz_col(repfnz, nextl_col, m); // First nonzero location in each row\n    VectorBlock<ScalarVector> dense_col(dense,nextl_col, m); // Accumulate a column vector here\n    \n    \n    // For each nnz in A[*, jj] do depth first search\n    for (typename MatrixType::InnerIterator it(A, jj); it; ++it)\n    {\n      Index krow = it.row(); \n      dense_col(krow) = it.value();\n      \n      Index kmark = marker(krow); \n      if (kmark == jj) \n        continue; // krow visited before, go to the next nonzero\n      \n      dfs_kernel(jj, perm_r, nseg, panel_lsub, segrep, repfnz_col, xprune, marker, parent,\n                   xplore, glu, nextl_col, krow, traits);\n    }// end for nonzeros in column jj\n    \n  } // end for column jj\n}\n\n} // end namespace internal\n} // end namespace Eigen\n\n#endif // SPARSELU_PANEL_DFS_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseLU/SparseLU_pivotL.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n/* \n \n * NOTE: This file is the modified version of xpivotL.c file in SuperLU \n \n * -- SuperLU routine (version 3.0) --\n * Univ. of California Berkeley, Xerox Palo Alto Research Center,\n * and Lawrence Berkeley National Lab.\n * October 15, 2003\n *\n * Copyright (c) 1994 by Xerox Corporation.  All rights reserved.\n *\n * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY\n * EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.\n *\n * Permission is hereby granted to use or copy this program for any\n * purpose, provided the above notices are retained on all copies.\n * Permission to modify the code and to distribute modified code is\n * granted, provided the above notices are retained, and a notice that\n * the code was modified is included with the above copyright notice.\n */\n#ifndef SPARSELU_PIVOTL_H\n#define SPARSELU_PIVOTL_H\n\nnamespace Eigen {\nnamespace internal {\n  \n/**\n * \\brief Performs the numerical pivotin on the current column of L, and the CDIV operation.\n * \n * Pivot policy :\n * (1) Compute thresh = u * max_(i>=j) abs(A_ij);\n * (2) IF user specifies pivot row k and abs(A_kj) >= thresh THEN\n *           pivot row = k;\n *       ELSE IF abs(A_jj) >= thresh THEN\n *           pivot row = j;\n *       ELSE\n *           pivot row = m;\n * \n *   Note: If you absolutely want to use a given pivot order, then set u=0.0.\n * \n * \\param jcol The current column of L\n * \\param diagpivotthresh diagonal pivoting threshold\n * \\param[in,out] perm_r Row permutation (threshold pivoting)\n * \\param[in] iperm_c column permutation - used to finf diagonal of Pc*A*Pc'\n * \\param[out] pivrow  The pivot row\n * \\param glu Global LU data\n * \\return 0 if success, i > 0 if U(i,i) is exactly zero \n * \n */\ntemplate <typename Scalar, typename Index>\nIndex SparseLUImpl<Scalar,Index>::pivotL(const Index jcol, const RealScalar& diagpivotthresh, IndexVector& perm_r, IndexVector& iperm_c, Index& pivrow, GlobalLU_t& glu)\n{\n  \n  Index fsupc = (glu.xsup)((glu.supno)(jcol)); // First column in the supernode containing the column jcol\n  Index nsupc = jcol - fsupc; // Number of columns in the supernode portion, excluding jcol; nsupc >=0\n  Index lptr = glu.xlsub(fsupc); // pointer to the starting location of the row subscripts for this supernode portion\n  Index nsupr = glu.xlsub(fsupc+1) - lptr; // Number of rows in the supernode\n  Index lda = glu.xlusup(fsupc+1) - glu.xlusup(fsupc); // leading dimension\n  Scalar* lu_sup_ptr = &(glu.lusup.data()[glu.xlusup(fsupc)]); // Start of the current supernode\n  Scalar* lu_col_ptr = &(glu.lusup.data()[glu.xlusup(jcol)]); // Start of jcol in the supernode\n  Index* lsub_ptr = &(glu.lsub.data()[lptr]); // Start of row indices of the supernode\n  \n  // Determine the largest abs numerical value for partial pivoting \n  Index diagind = iperm_c(jcol); // diagonal index \n  RealScalar pivmax(-1.0);\n  Index pivptr = nsupc; \n  Index diag = emptyIdxLU; \n  RealScalar rtemp;\n  Index isub, icol, itemp, k; \n  for (isub = nsupc; isub < nsupr; ++isub) {\n    using std::abs;\n    rtemp = abs(lu_col_ptr[isub]);\n    if (rtemp > pivmax) {\n      pivmax = rtemp; \n      pivptr = isub;\n    } \n    if (lsub_ptr[isub] == diagind) diag = isub;\n  }\n  \n  // Test for singularity\n  if ( pivmax <= RealScalar(0.0) ) {\n    // if pivmax == -1, the column is structurally empty, otherwise it is only numerically zero\n    pivrow = pivmax < RealScalar(0.0) ? diagind : lsub_ptr[pivptr];\n    perm_r(pivrow) = jcol;\n    return (jcol+1);\n  }\n  \n  RealScalar thresh = diagpivotthresh * pivmax; \n  \n  // Choose appropriate pivotal element \n  \n  {\n    // Test if the diagonal element can be used as a pivot (given the threshold value)\n    if (diag >= 0 ) \n    {\n      // Diagonal element exists\n      using std::abs;\n      rtemp = abs(lu_col_ptr[diag]);\n      if (rtemp != 0.0 && rtemp >= thresh) pivptr = diag;\n    }\n    pivrow = lsub_ptr[pivptr];\n  }\n  \n  // Record pivot row\n  perm_r(pivrow) = jcol; \n  // Interchange row subscripts\n  if (pivptr != nsupc )\n  {\n    std::swap( lsub_ptr[pivptr], lsub_ptr[nsupc] );\n    // Interchange numerical values as well, for the two rows in the whole snode\n    // such that L is indexed the same way as A\n    for (icol = 0; icol <= nsupc; icol++)\n    {\n      itemp = pivptr + icol * lda; \n      std::swap(lu_sup_ptr[itemp], lu_sup_ptr[nsupc + icol * lda]);\n    }\n  }\n  // cdiv operations\n  Scalar temp = Scalar(1.0) / lu_col_ptr[nsupc];\n  for (k = nsupc+1; k < nsupr; k++)\n    lu_col_ptr[k] *= temp; \n  return 0;\n}\n\n} // end namespace internal\n} // end namespace Eigen\n\n#endif // SPARSELU_PIVOTL_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseLU/SparseLU_pruneL.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n/* \n \n * NOTE: This file is the modified version of [s,d,c,z]pruneL.c file in SuperLU \n \n * -- SuperLU routine (version 2.0) --\n * Univ. of California Berkeley, Xerox Palo Alto Research Center,\n * and Lawrence Berkeley National Lab.\n * November 15, 1997\n *\n * Copyright (c) 1994 by Xerox Corporation.  All rights reserved.\n *\n * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY\n * EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.\n *\n * Permission is hereby granted to use or copy this program for any\n * purpose, provided the above notices are retained on all copies.\n * Permission to modify the code and to distribute modified code is\n * granted, provided the above notices are retained, and a notice that\n * the code was modified is included with the above copyright notice.\n */\n#ifndef SPARSELU_PRUNEL_H\n#define SPARSELU_PRUNEL_H\n\nnamespace Eigen {\nnamespace internal {\n\n/**\n * \\brief Prunes the L-structure.\n *\n * It prunes the L-structure  of supernodes whose L-structure contains the current pivot row \"pivrow\"\n * \n * \n * \\param jcol The current column of L\n * \\param[in] perm_r Row permutation\n * \\param[out] pivrow  The pivot row\n * \\param nseg Number of segments\n * \\param segrep \n * \\param repfnz\n * \\param[out] xprune \n * \\param glu Global LU data\n * \n */\ntemplate <typename Scalar, typename Index>\nvoid SparseLUImpl<Scalar,Index>::pruneL(const Index jcol, const IndexVector& perm_r, const Index pivrow, const Index nseg, const IndexVector& segrep, BlockIndexVector repfnz, IndexVector& xprune, GlobalLU_t& glu)\n{\n  // For each supernode-rep irep in U(*,j]\n  Index jsupno = glu.supno(jcol); \n  Index i,irep,irep1; \n  bool movnum, do_prune = false; \n  Index kmin = 0, kmax = 0, minloc, maxloc,krow; \n  for (i = 0; i < nseg; i++)\n  {\n    irep = segrep(i); \n    irep1 = irep + 1; \n    do_prune = false; \n    \n    // Don't prune with a zero U-segment \n    if (repfnz(irep) == emptyIdxLU) continue; \n    \n    // If a snode overlaps with the next panel, then the U-segment\n    // is fragmented into two parts -- irep and irep1. We should let \n    // pruning occur at the rep-column in irep1s snode. \n    if (glu.supno(irep) == glu.supno(irep1) ) continue; // don't prune \n    \n    // If it has not been pruned & it has a nonz in row L(pivrow,i)\n    if (glu.supno(irep) != jsupno )\n    {\n      if ( xprune (irep) >= glu.xlsub(irep1) )\n      {\n        kmin = glu.xlsub(irep);\n        kmax = glu.xlsub(irep1) - 1; \n        for (krow = kmin; krow <= kmax; krow++)\n        {\n          if (glu.lsub(krow) == pivrow) \n          {\n            do_prune = true; \n            break; \n          }\n        }\n      }\n      \n      if (do_prune) \n      {\n        // do a quicksort-type partition\n        // movnum=true means that the num values have to be exchanged\n        movnum = false; \n        if (irep == glu.xsup(glu.supno(irep)) ) // Snode of size 1 \n          movnum = true; \n        \n        while (kmin <= kmax)\n        {\n          if (perm_r(glu.lsub(kmax)) == emptyIdxLU)\n            kmax--; \n          else if ( perm_r(glu.lsub(kmin)) != emptyIdxLU)\n            kmin++;\n          else \n          {\n            // kmin below pivrow (not yet pivoted), and kmax\n            // above pivrow: interchange the two suscripts\n            std::swap(glu.lsub(kmin), glu.lsub(kmax)); \n            \n            // If the supernode has only one column, then we \n            // only keep one set of subscripts. For any subscript\n            // intercnahge performed, similar interchange must be \n            // done on the numerical values. \n            if (movnum) \n            {\n              minloc = glu.xlusup(irep) + ( kmin - glu.xlsub(irep) ); \n              maxloc = glu.xlusup(irep) + ( kmax - glu.xlsub(irep) ); \n              std::swap(glu.lusup(minloc), glu.lusup(maxloc)); \n            }\n            kmin++;\n            kmax--;\n          }\n        } // end while \n        \n        xprune(irep) = kmin;  //Pruning \n      } // end if do_prune \n    } // end pruning \n  } // End for each U-segment\n}\n\n} // end namespace internal\n} // end namespace Eigen\n\n#endif // SPARSELU_PRUNEL_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseLU/SparseLU_relax_snode.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n/* This file is a modified version of heap_relax_snode.c file in SuperLU\n * -- SuperLU routine (version 3.0) --\n * Univ. of California Berkeley, Xerox Palo Alto Research Center,\n * and Lawrence Berkeley National Lab.\n * October 15, 2003\n *\n * Copyright (c) 1994 by Xerox Corporation.  All rights reserved.\n *\n * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY\n * EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.\n *\n * Permission is hereby granted to use or copy this program for any\n * purpose, provided the above notices are retained on all copies.\n * Permission to modify the code and to distribute modified code is\n * granted, provided the above notices are retained, and a notice that\n * the code was modified is included with the above copyright notice.\n */\n\n#ifndef SPARSELU_RELAX_SNODE_H\n#define SPARSELU_RELAX_SNODE_H\n\nnamespace Eigen {\n\nnamespace internal {\n \n/** \n * \\brief Identify the initial relaxed supernodes\n * \n * This routine is applied to a column elimination tree. \n * It assumes that the matrix has been reordered according to the postorder of the etree\n * \\param n  the number of columns\n * \\param et elimination tree \n * \\param relax_columns Maximum number of columns allowed in a relaxed snode \n * \\param descendants Number of descendants of each node in the etree\n * \\param relax_end last column in a supernode\n */\ntemplate <typename Scalar, typename Index>\nvoid SparseLUImpl<Scalar,Index>::relax_snode (const Index n, IndexVector& et, const Index relax_columns, IndexVector& descendants, IndexVector& relax_end)\n{\n  \n  // compute the number of descendants of each node in the etree\n  Index j, parent; \n  relax_end.setConstant(emptyIdxLU);\n  descendants.setZero();\n  for (j = 0; j < n; j++) \n  {\n    parent = et(j);\n    if (parent != n) // not the dummy root\n      descendants(parent) += descendants(j) + 1;\n  }\n  // Identify the relaxed supernodes by postorder traversal of the etree\n  Index snode_start; // beginning of a snode \n  for (j = 0; j < n; )\n  {\n    parent = et(j);\n    snode_start = j; \n    while ( parent != n && descendants(parent) < relax_columns ) \n    {\n      j = parent; \n      parent = et(j);\n    }\n    // Found a supernode in postordered etree, j is the last column \n    relax_end(snode_start) = j; // Record last column\n    j++;\n    // Search for a new leaf\n    while (descendants(j) != 0 && j < n) j++;\n  } // End postorder traversal of the etree\n  \n}\n\n} // end namespace internal\n\n} // end namespace Eigen\n#endif\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseQR/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_SparseQR_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_SparseQR_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/SparseQR/ COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SparseQR/SparseQR.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012-2013 Desire Nuentsa <desire.nuentsa_wakam@inria.fr>\n// Copyright (C) 2012-2014 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SPARSE_QR_H\n#define EIGEN_SPARSE_QR_H\n\nnamespace Eigen {\n\ntemplate<typename MatrixType, typename OrderingType> class SparseQR;\ntemplate<typename SparseQRType> struct SparseQRMatrixQReturnType;\ntemplate<typename SparseQRType> struct SparseQRMatrixQTransposeReturnType;\ntemplate<typename SparseQRType, typename Derived> struct SparseQR_QProduct;\nnamespace internal {\n  template <typename SparseQRType> struct traits<SparseQRMatrixQReturnType<SparseQRType> >\n  {\n    typedef typename SparseQRType::MatrixType ReturnType;\n    typedef typename ReturnType::Index Index;\n    typedef typename ReturnType::StorageKind StorageKind;\n  };\n  template <typename SparseQRType> struct traits<SparseQRMatrixQTransposeReturnType<SparseQRType> >\n  {\n    typedef typename SparseQRType::MatrixType ReturnType;\n  };\n  template <typename SparseQRType, typename Derived> struct traits<SparseQR_QProduct<SparseQRType, Derived> >\n  {\n    typedef typename Derived::PlainObject ReturnType;\n  };\n} // End namespace internal\n\n/**\n  * \\ingroup SparseQR_Module\n  * \\class SparseQR\n  * \\brief Sparse left-looking rank-revealing QR factorization\n  * \n  * This class implements a left-looking rank-revealing QR decomposition \n  * of sparse matrices. When a column has a norm less than a given tolerance\n  * it is implicitly permuted to the end. The QR factorization thus obtained is \n  * given by A*P = Q*R where R is upper triangular or trapezoidal. \n  * \n  * P is the column permutation which is the product of the fill-reducing and the\n  * rank-revealing permutations. Use colsPermutation() to get it.\n  * \n  * Q is the orthogonal matrix represented as products of Householder reflectors. \n  * Use matrixQ() to get an expression and matrixQ().transpose() to get the transpose.\n  * You can then apply it to a vector.\n  * \n  * R is the sparse triangular or trapezoidal matrix. The later occurs when A is rank-deficient.\n  * matrixR().topLeftCorner(rank(), rank()) always returns a triangular factor of full rank.\n  * \n  * \\tparam _MatrixType The type of the sparse matrix A, must be a column-major SparseMatrix<>\n  * \\tparam _OrderingType The fill-reducing ordering method. See the \\link OrderingMethods_Module \n  *  OrderingMethods \\endlink module for the list of built-in and external ordering methods.\n  * \n  * \\warning The input sparse matrix A must be in compressed mode (see SparseMatrix::makeCompressed()).\n  * \n  */\ntemplate<typename _MatrixType, typename _OrderingType>\nclass SparseQR\n{\n  public:\n    typedef _MatrixType MatrixType;\n    typedef _OrderingType OrderingType;\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename MatrixType::RealScalar RealScalar;\n    typedef typename MatrixType::Index Index;\n    typedef SparseMatrix<Scalar,ColMajor,Index> QRMatrixType;\n    typedef Matrix<Index, Dynamic, 1> IndexVector;\n    typedef Matrix<Scalar, Dynamic, 1> ScalarVector;\n    typedef PermutationMatrix<Dynamic, Dynamic, Index> PermutationType;\n  public:\n    SparseQR () : m_isInitialized(false), m_analysisIsok(false), m_lastError(\"\"), m_useDefaultThreshold(true),m_isQSorted(false),m_isEtreeOk(false)\n    { }\n    \n    /** Construct a QR factorization of the matrix \\a mat.\n      * \n      * \\warning The matrix \\a mat must be in compressed mode (see SparseMatrix::makeCompressed()).\n      * \n      * \\sa compute()\n      */\n    SparseQR(const MatrixType& mat) : m_isInitialized(false), m_analysisIsok(false), m_lastError(\"\"), m_useDefaultThreshold(true),m_isQSorted(false),m_isEtreeOk(false)\n    {\n      compute(mat);\n    }\n    \n    /** Computes the QR factorization of the sparse matrix \\a mat.\n      * \n      * \\warning The matrix \\a mat must be in compressed mode (see SparseMatrix::makeCompressed()).\n      * \n      * \\sa analyzePattern(), factorize()\n      */\n    void compute(const MatrixType& mat)\n    {\n      analyzePattern(mat);\n      factorize(mat);\n    }\n    void analyzePattern(const MatrixType& mat);\n    void factorize(const MatrixType& mat);\n    \n    /** \\returns the number of rows of the represented matrix. \n      */\n    inline Index rows() const { return m_pmat.rows(); }\n    \n    /** \\returns the number of columns of the represented matrix. \n      */\n    inline Index cols() const { return m_pmat.cols();}\n    \n    /** \\returns a const reference to the \\b sparse upper triangular matrix R of the QR factorization.\n      */\n    const QRMatrixType& matrixR() const { return m_R; }\n    \n    /** \\returns the number of non linearly dependent columns as determined by the pivoting threshold.\n      *\n      * \\sa setPivotThreshold()\n      */\n    Index rank() const \n    {\n      eigen_assert(m_isInitialized && \"The factorization should be called first, use compute()\");\n      return m_nonzeropivots; \n    }\n    \n    /** \\returns an expression of the matrix Q as products of sparse Householder reflectors.\n    * The common usage of this function is to apply it to a dense matrix or vector\n    * \\code\n    * VectorXd B1, B2;\n    * // Initialize B1\n    * B2 = matrixQ() * B1;\n    * \\endcode\n    *\n    * To get a plain SparseMatrix representation of Q:\n    * \\code\n    * SparseMatrix<double> Q;\n    * Q = SparseQR<SparseMatrix<double> >(A).matrixQ();\n    * \\endcode\n    * Internally, this call simply performs a sparse product between the matrix Q\n    * and a sparse identity matrix. However, due to the fact that the sparse\n    * reflectors are stored unsorted, two transpositions are needed to sort\n    * them before performing the product.\n    */\n    SparseQRMatrixQReturnType<SparseQR> matrixQ() const \n    { return SparseQRMatrixQReturnType<SparseQR>(*this); }\n    \n    /** \\returns a const reference to the column permutation P that was applied to A such that A*P = Q*R\n      * It is the combination of the fill-in reducing permutation and numerical column pivoting.\n      */\n    const PermutationType& colsPermutation() const\n    { \n      eigen_assert(m_isInitialized && \"Decomposition is not initialized.\");\n      return m_outputPerm_c;\n    }\n    \n    /** \\returns A string describing the type of error.\n      * This method is provided to ease debugging, not to handle errors.\n      */\n    std::string lastErrorMessage() const { return m_lastError; }\n    \n    /** \\internal */\n    template<typename Rhs, typename Dest>\n    bool _solve(const MatrixBase<Rhs> &B, MatrixBase<Dest> &dest) const\n    {\n      eigen_assert(m_isInitialized && \"The factorization should be called first, use compute()\");\n      eigen_assert(this->rows() == B.rows() && \"SparseQR::solve() : invalid number of rows in the right hand side matrix\");\n\n      Index rank = this->rank();\n      \n      // Compute Q^T * b;\n      typename Dest::PlainObject y, b;\n      y = this->matrixQ().transpose() * B; \n      b = y;\n      \n      // Solve with the triangular matrix R\n      y.resize((std::max)(cols(),Index(y.rows())),y.cols());\n      y.topRows(rank) = this->matrixR().topLeftCorner(rank, rank).template triangularView<Upper>().solve(b.topRows(rank));\n      y.bottomRows(y.rows()-rank).setZero();\n\n      // Apply the column permutation\n      if (m_perm_c.size())  dest = colsPermutation() * y.topRows(cols());\n      else                  dest = y.topRows(cols());\n      \n      m_info = Success;\n      return true;\n    }\n    \n\n    /** Sets the threshold that is used to determine linearly dependent columns during the factorization.\n      *\n      * In practice, if during the factorization the norm of the column that has to be eliminated is below\n      * this threshold, then the entire column is treated as zero, and it is moved at the end.\n      */\n    void setPivotThreshold(const RealScalar& threshold)\n    {\n      m_useDefaultThreshold = false;\n      m_threshold = threshold;\n    }\n    \n    /** \\returns the solution X of \\f$ A X = B \\f$ using the current decomposition of A.\n      *\n      * \\sa compute()\n      */\n    template<typename Rhs>\n    inline const internal::solve_retval<SparseQR, Rhs> solve(const MatrixBase<Rhs>& B) const \n    {\n      eigen_assert(m_isInitialized && \"The factorization should be called first, use compute()\");\n      eigen_assert(this->rows() == B.rows() && \"SparseQR::solve() : invalid number of rows in the right hand side matrix\");\n      return internal::solve_retval<SparseQR, Rhs>(*this, B.derived());\n    }\n    template<typename Rhs>\n    inline const internal::sparse_solve_retval<SparseQR, Rhs> solve(const SparseMatrixBase<Rhs>& B) const\n    {\n          eigen_assert(m_isInitialized && \"The factorization should be called first, use compute()\");\n          eigen_assert(this->rows() == B.rows() && \"SparseQR::solve() : invalid number of rows in the right hand side matrix\");\n          return internal::sparse_solve_retval<SparseQR, Rhs>(*this, B.derived());\n    }\n    \n    /** \\brief Reports whether previous computation was successful.\n      *\n      * \\returns \\c Success if computation was successful,\n      *          \\c NumericalIssue if the QR factorization reports a numerical problem\n      *          \\c InvalidInput if the input matrix is invalid\n      *\n      * \\sa iparm()          \n      */\n    ComputationInfo info() const\n    {\n      eigen_assert(m_isInitialized && \"Decomposition is not initialized.\");\n      return m_info;\n    }\n\n  protected:\n    inline void sort_matrix_Q()\n    {\n      if(this->m_isQSorted) return;\n      // The matrix Q is sorted during the transposition\n      SparseMatrix<Scalar, RowMajor, Index> mQrm(this->m_Q);\n      this->m_Q = mQrm;\n      this->m_isQSorted = true;\n    }\n\n    \n  protected:\n    bool m_isInitialized;\n    bool m_analysisIsok;\n    bool m_factorizationIsok;\n    mutable ComputationInfo m_info;\n    std::string m_lastError;\n    QRMatrixType m_pmat;            // Temporary matrix\n    QRMatrixType m_R;               // The triangular factor matrix\n    QRMatrixType m_Q;               // The orthogonal reflectors\n    ScalarVector m_hcoeffs;         // The Householder coefficients\n    PermutationType m_perm_c;       // Fill-reducing  Column  permutation\n    PermutationType m_pivotperm;    // The permutation for rank revealing\n    PermutationType m_outputPerm_c; // The final column permutation\n    RealScalar m_threshold;         // Threshold to determine null Householder reflections\n    bool m_useDefaultThreshold;     // Use default threshold\n    Index m_nonzeropivots;          // Number of non zero pivots found \n    IndexVector m_etree;            // Column elimination tree\n    IndexVector m_firstRowElt;      // First element in each row\n    bool m_isQSorted;               // whether Q is sorted or not\n    bool m_isEtreeOk;               // whether the elimination tree match the initial input matrix\n    \n    template <typename, typename > friend struct SparseQR_QProduct;\n    template <typename > friend struct SparseQRMatrixQReturnType;\n    \n};\n\n/** \\brief Preprocessing step of a QR factorization \n  * \n  * \\warning The matrix \\a mat must be in compressed mode (see SparseMatrix::makeCompressed()).\n  * \n  * In this step, the fill-reducing permutation is computed and applied to the columns of A\n  * and the column elimination tree is computed as well. Only the sparsity pattern of \\a mat is exploited.\n  * \n  * \\note In this step it is assumed that there is no empty row in the matrix \\a mat.\n  */\ntemplate <typename MatrixType, typename OrderingType>\nvoid SparseQR<MatrixType,OrderingType>::analyzePattern(const MatrixType& mat)\n{\n  eigen_assert(mat.isCompressed() && \"SparseQR requires a sparse matrix in compressed mode. Call .makeCompressed() before passing it to SparseQR\");\n  // Copy to a column major matrix if the input is rowmajor\n  typename internal::conditional<MatrixType::IsRowMajor,QRMatrixType,const MatrixType&>::type matCpy(mat);\n  // Compute the column fill reducing ordering\n  OrderingType ord; \n  ord(matCpy, m_perm_c); \n  Index n = mat.cols();\n  Index m = mat.rows();\n  Index diagSize = (std::min)(m,n);\n  \n  if (!m_perm_c.size())\n  {\n    m_perm_c.resize(n);\n    m_perm_c.indices().setLinSpaced(n, 0,n-1);\n  }\n  \n  // Compute the column elimination tree of the permuted matrix\n  m_outputPerm_c = m_perm_c.inverse();\n  internal::coletree(matCpy, m_etree, m_firstRowElt, m_outputPerm_c.indices().data());\n  m_isEtreeOk = true;\n  \n  m_R.resize(m, n);\n  m_Q.resize(m, diagSize);\n  \n  // Allocate space for nonzero elements : rough estimation\n  m_R.reserve(2*mat.nonZeros()); //FIXME Get a more accurate estimation through symbolic factorization with the etree\n  m_Q.reserve(2*mat.nonZeros());\n  m_hcoeffs.resize(diagSize);\n  m_analysisIsok = true;\n}\n\n/** \\brief Performs the numerical QR factorization of the input matrix\n  * \n  * The function SparseQR::analyzePattern(const MatrixType&) must have been called beforehand with\n  * a matrix having the same sparsity pattern than \\a mat.\n  * \n  * \\param mat The sparse column-major matrix\n  */\ntemplate <typename MatrixType, typename OrderingType>\nvoid SparseQR<MatrixType,OrderingType>::factorize(const MatrixType& mat)\n{\n  using std::abs;\n  using std::max;\n  \n  eigen_assert(m_analysisIsok && \"analyzePattern() should be called before this step\");\n  Index m = mat.rows();\n  Index n = mat.cols();\n  Index diagSize = (std::min)(m,n);\n  IndexVector mark((std::max)(m,n)); mark.setConstant(-1);  // Record the visited nodes\n  IndexVector Ridx(n), Qidx(m);                             // Store temporarily the row indexes for the current column of R and Q\n  Index nzcolR, nzcolQ;                                     // Number of nonzero for the current column of R and Q\n  ScalarVector tval(m);                                     // The dense vector used to compute the current column\n  RealScalar pivotThreshold = m_threshold;\n  \n  m_R.setZero();\n  m_Q.setZero();\n  m_pmat = mat;\n  if(!m_isEtreeOk)\n  {\n    m_outputPerm_c = m_perm_c.inverse();\n    internal::coletree(m_pmat, m_etree, m_firstRowElt, m_outputPerm_c.indices().data());\n    m_isEtreeOk = true;\n  }\n\n  m_pmat.uncompress(); // To have the innerNonZeroPtr allocated\n  \n  // Apply the fill-in reducing permutation lazily:\n  {\n    // If the input is row major, copy the original column indices,\n    // otherwise directly use the input matrix\n    // \n    IndexVector originalOuterIndicesCpy;\n    const Index *originalOuterIndices = mat.outerIndexPtr();\n    if(MatrixType::IsRowMajor)\n    {\n      originalOuterIndicesCpy = IndexVector::Map(m_pmat.outerIndexPtr(),n+1);\n      originalOuterIndices = originalOuterIndicesCpy.data();\n    }\n    \n    for (int i = 0; i < n; i++)\n    {\n      Index p = m_perm_c.size() ? m_perm_c.indices()(i) : i;\n      m_pmat.outerIndexPtr()[p] = originalOuterIndices[i]; \n      m_pmat.innerNonZeroPtr()[p] = originalOuterIndices[i+1] - originalOuterIndices[i]; \n    }\n  }\n  \n  /* Compute the default threshold as in MatLab, see:\n   * Tim Davis, \"Algorithm 915, SuiteSparseQR: Multifrontal Multithreaded Rank-Revealing\n   * Sparse QR Factorization, ACM Trans. on Math. Soft. 38(1), 2011, Page 8:3 \n   */\n  if(m_useDefaultThreshold) \n  {\n    RealScalar max2Norm = 0.0;\n    for (int j = 0; j < n; j++) max2Norm = (max)(max2Norm, m_pmat.col(j).norm());\n    if(max2Norm==RealScalar(0))\n      max2Norm = RealScalar(1);\n    pivotThreshold = 20 * (m + n) * max2Norm * NumTraits<RealScalar>::epsilon();\n  }\n  \n  // Initialize the numerical permutation\n  m_pivotperm.setIdentity(n);\n  \n  Index nonzeroCol = 0; // Record the number of valid pivots\n  m_Q.startVec(0);\n\n  // Left looking rank-revealing QR factorization: compute a column of R and Q at a time\n  for (Index col = 0; col < n; ++col)\n  {\n    mark.setConstant(-1);\n    m_R.startVec(col);\n    mark(nonzeroCol) = col;\n    Qidx(0) = nonzeroCol;\n    nzcolR = 0; nzcolQ = 1;\n    bool found_diag = nonzeroCol>=m;\n    tval.setZero(); \n    \n    // Symbolic factorization: find the nonzero locations of the column k of the factors R and Q, i.e.,\n    // all the nodes (with indexes lower than rank) reachable through the column elimination tree (etree) rooted at node k.\n    // Note: if the diagonal entry does not exist, then its contribution must be explicitly added,\n    // thus the trick with found_diag that permits to do one more iteration on the diagonal element if this one has not been found.\n    for (typename QRMatrixType::InnerIterator itp(m_pmat, col); itp || !found_diag; ++itp)\n    {\n      Index curIdx = nonzeroCol;\n      if(itp) curIdx = itp.row();\n      if(curIdx == nonzeroCol) found_diag = true;\n      \n      // Get the nonzeros indexes of the current column of R\n      Index st = m_firstRowElt(curIdx); // The traversal of the etree starts here \n      if (st < 0 )\n      {\n        m_lastError = \"Empty row found during numerical factorization\";\n        m_info = InvalidInput;\n        return;\n      }\n\n      // Traverse the etree \n      Index bi = nzcolR;\n      for (; mark(st) != col; st = m_etree(st))\n      {\n        Ridx(nzcolR) = st;  // Add this row to the list,\n        mark(st) = col;     // and mark this row as visited\n        nzcolR++;\n      }\n\n      // Reverse the list to get the topological ordering\n      Index nt = nzcolR-bi;\n      for(Index i = 0; i < nt/2; i++) std::swap(Ridx(bi+i), Ridx(nzcolR-i-1));\n       \n      // Copy the current (curIdx,pcol) value of the input matrix\n      if(itp) tval(curIdx) = itp.value();\n      else    tval(curIdx) = Scalar(0);\n      \n      // Compute the pattern of Q(:,k)\n      if(curIdx > nonzeroCol && mark(curIdx) != col ) \n      {\n        Qidx(nzcolQ) = curIdx;  // Add this row to the pattern of Q,\n        mark(curIdx) = col;     // and mark it as visited\n        nzcolQ++;\n      }\n    }\n\n    // Browse all the indexes of R(:,col) in reverse order\n    for (Index i = nzcolR-1; i >= 0; i--)\n    {\n      Index curIdx = Ridx(i);\n      \n      // Apply the curIdx-th householder vector to the current column (temporarily stored into tval)\n      Scalar tdot(0);\n      \n      // First compute q' * tval\n      tdot = m_Q.col(curIdx).dot(tval);\n\n      tdot *= m_hcoeffs(curIdx);\n      \n      // Then update tval = tval - q * tau\n      // FIXME: tval -= tdot * m_Q.col(curIdx) should amount to the same (need to check/add support for efficient \"dense ?= sparse\")\n      for (typename QRMatrixType::InnerIterator itq(m_Q, curIdx); itq; ++itq)\n        tval(itq.row()) -= itq.value() * tdot;\n\n      // Detect fill-in for the current column of Q\n      if(m_etree(Ridx(i)) == nonzeroCol)\n      {\n        for (typename QRMatrixType::InnerIterator itq(m_Q, curIdx); itq; ++itq)\n        {\n          Index iQ = itq.row();\n          if (mark(iQ) != col)\n          {\n            Qidx(nzcolQ++) = iQ;  // Add this row to the pattern of Q,\n            mark(iQ) = col;       // and mark it as visited\n          }\n        }\n      }\n    } // End update current column\n    \n    Scalar tau = 0;\n    RealScalar beta = 0;\n    \n    if(nonzeroCol < diagSize)\n    {\n      // Compute the Householder reflection that eliminate the current column\n      // FIXME this step should call the Householder module.\n      Scalar c0 = nzcolQ ? tval(Qidx(0)) : Scalar(0);\n      \n      // First, the squared norm of Q((col+1):m, col)\n      RealScalar sqrNorm = 0.;\n      for (Index itq = 1; itq < nzcolQ; ++itq) sqrNorm += numext::abs2(tval(Qidx(itq)));\n      if(sqrNorm == RealScalar(0) && numext::imag(c0) == RealScalar(0))\n      {\n        beta = numext::real(c0);\n        tval(Qidx(0)) = 1;\n      }\n      else\n      {\n        using std::sqrt;\n        beta = sqrt(numext::abs2(c0) + sqrNorm);\n        if(numext::real(c0) >= RealScalar(0))\n          beta = -beta;\n        tval(Qidx(0)) = 1;\n        for (Index itq = 1; itq < nzcolQ; ++itq)\n          tval(Qidx(itq)) /= (c0 - beta);\n        tau = numext::conj((beta-c0) / beta);\n          \n      }\n    }\n\n    // Insert values in R\n    for (Index  i = nzcolR-1; i >= 0; i--)\n    {\n      Index curIdx = Ridx(i);\n      if(curIdx < nonzeroCol) \n      {\n        m_R.insertBackByOuterInnerUnordered(col, curIdx) = tval(curIdx);\n        tval(curIdx) = Scalar(0.);\n      }\n    }\n\n    if(nonzeroCol < diagSize && abs(beta) >= pivotThreshold)\n    {\n      m_R.insertBackByOuterInner(col, nonzeroCol) = beta;\n      // The householder coefficient\n      m_hcoeffs(nonzeroCol) = tau;\n      // Record the householder reflections\n      for (Index itq = 0; itq < nzcolQ; ++itq)\n      {\n        Index iQ = Qidx(itq);\n        m_Q.insertBackByOuterInnerUnordered(nonzeroCol,iQ) = tval(iQ);\n        tval(iQ) = Scalar(0.);\n      }\n      nonzeroCol++;\n      if(nonzeroCol<diagSize)\n        m_Q.startVec(nonzeroCol);\n    }\n    else\n    {\n      // Zero pivot found: move implicitly this column to the end\n      for (Index j = nonzeroCol; j < n-1; j++) \n        std::swap(m_pivotperm.indices()(j), m_pivotperm.indices()[j+1]);\n      \n      // Recompute the column elimination tree\n      internal::coletree(m_pmat, m_etree, m_firstRowElt, m_pivotperm.indices().data());\n      m_isEtreeOk = false;\n    }\n  }\n  \n  m_hcoeffs.tail(diagSize-nonzeroCol).setZero();\n  \n  // Finalize the column pointers of the sparse matrices R and Q\n  m_Q.finalize();\n  m_Q.makeCompressed();\n  m_R.finalize();\n  m_R.makeCompressed();\n  m_isQSorted = false;\n\n  m_nonzeropivots = nonzeroCol;\n  \n  if(nonzeroCol<n)\n  {\n    // Permute the triangular factor to put the 'dead' columns to the end\n    QRMatrixType tempR(m_R);\n    m_R = tempR * m_pivotperm;\n    \n    // Update the column permutation\n    m_outputPerm_c = m_outputPerm_c * m_pivotperm;\n  }\n  \n  m_isInitialized = true; \n  m_factorizationIsok = true;\n  m_info = Success;\n}\n\nnamespace internal {\n  \ntemplate<typename _MatrixType, typename OrderingType, typename Rhs>\nstruct solve_retval<SparseQR<_MatrixType,OrderingType>, Rhs>\n  : solve_retval_base<SparseQR<_MatrixType,OrderingType>, Rhs>\n{\n  typedef SparseQR<_MatrixType,OrderingType> Dec;\n  EIGEN_MAKE_SOLVE_HELPERS(Dec,Rhs)\n\n  template<typename Dest> void evalTo(Dest& dst) const\n  {\n    dec()._solve(rhs(),dst);\n  }\n};\ntemplate<typename _MatrixType, typename OrderingType, typename Rhs>\nstruct sparse_solve_retval<SparseQR<_MatrixType, OrderingType>, Rhs>\n : sparse_solve_retval_base<SparseQR<_MatrixType, OrderingType>, Rhs>\n{\n  typedef SparseQR<_MatrixType, OrderingType> Dec;\n  EIGEN_MAKE_SPARSE_SOLVE_HELPERS(Dec, Rhs)\n\n  template<typename Dest> void evalTo(Dest& dst) const\n  {\n    this->defaultEvalTo(dst);\n  }\n};\n} // end namespace internal\n\ntemplate <typename SparseQRType, typename Derived>\nstruct SparseQR_QProduct : ReturnByValue<SparseQR_QProduct<SparseQRType, Derived> >\n{\n  typedef typename SparseQRType::QRMatrixType MatrixType;\n  typedef typename SparseQRType::Scalar Scalar;\n  typedef typename SparseQRType::Index Index;\n  // Get the references \n  SparseQR_QProduct(const SparseQRType& qr, const Derived& other, bool transpose) : \n  m_qr(qr),m_other(other),m_transpose(transpose) {}\n  inline Index rows() const { return m_transpose ? m_qr.rows() : m_qr.cols(); }\n  inline Index cols() const { return m_other.cols(); }\n  \n  // Assign to a vector\n  template<typename DesType>\n  void evalTo(DesType& res) const\n  {\n    Index m = m_qr.rows();\n    Index n = m_qr.cols();\n    Index diagSize = (std::min)(m,n);\n    res = m_other;\n    if (m_transpose)\n    {\n      eigen_assert(m_qr.m_Q.rows() == m_other.rows() && \"Non conforming object sizes\");\n      //Compute res = Q' * other column by column\n      for(Index j = 0; j < res.cols(); j++){\n        for (Index k = 0; k < diagSize; k++)\n        {\n          Scalar tau = Scalar(0);\n          tau = m_qr.m_Q.col(k).dot(res.col(j));\n          if(tau==Scalar(0)) continue;\n          tau = tau * m_qr.m_hcoeffs(k);\n          res.col(j) -= tau * m_qr.m_Q.col(k);\n        }\n      }\n    }\n    else\n    {\n      eigen_assert(m_qr.m_Q.rows() == m_other.rows() && \"Non conforming object sizes\");\n      // Compute res = Q * other column by column\n      for(Index j = 0; j < res.cols(); j++)\n      {\n        for (Index k = diagSize-1; k >=0; k--)\n        {\n          Scalar tau = Scalar(0);\n          tau = m_qr.m_Q.col(k).dot(res.col(j));\n          if(tau==Scalar(0)) continue;\n          tau = tau * m_qr.m_hcoeffs(k);\n          res.col(j) -= tau * m_qr.m_Q.col(k);\n        }\n      }\n    }\n  }\n  \n  const SparseQRType& m_qr;\n  const Derived& m_other;\n  bool m_transpose;\n};\n\ntemplate<typename SparseQRType>\nstruct SparseQRMatrixQReturnType : public EigenBase<SparseQRMatrixQReturnType<SparseQRType> >\n{  \n  typedef typename SparseQRType::Index Index;\n  typedef typename SparseQRType::Scalar Scalar;\n  typedef Matrix<Scalar,Dynamic,Dynamic> DenseMatrix;\n  SparseQRMatrixQReturnType(const SparseQRType& qr) : m_qr(qr) {}\n  template<typename Derived>\n  SparseQR_QProduct<SparseQRType, Derived> operator*(const MatrixBase<Derived>& other)\n  {\n    return SparseQR_QProduct<SparseQRType,Derived>(m_qr,other.derived(),false);\n  }\n  SparseQRMatrixQTransposeReturnType<SparseQRType> adjoint() const\n  {\n    return SparseQRMatrixQTransposeReturnType<SparseQRType>(m_qr);\n  }\n  inline Index rows() const { return m_qr.rows(); }\n  inline Index cols() const { return (std::min)(m_qr.rows(),m_qr.cols()); }\n  // To use for operations with the transpose of Q\n  SparseQRMatrixQTransposeReturnType<SparseQRType> transpose() const\n  {\n    return SparseQRMatrixQTransposeReturnType<SparseQRType>(m_qr);\n  }\n  template<typename Dest> void evalTo(MatrixBase<Dest>& dest) const\n  {\n    dest.derived() = m_qr.matrixQ() * Dest::Identity(m_qr.rows(), m_qr.rows());\n  }\n  template<typename Dest> void evalTo(SparseMatrixBase<Dest>& dest) const\n  {\n    Dest idMat(m_qr.rows(), m_qr.rows());\n    idMat.setIdentity();\n    // Sort the sparse householder reflectors if needed\n    const_cast<SparseQRType *>(&m_qr)->sort_matrix_Q();\n    dest.derived() = SparseQR_QProduct<SparseQRType, Dest>(m_qr, idMat, false);\n  }\n\n  const SparseQRType& m_qr;\n};\n\ntemplate<typename SparseQRType>\nstruct SparseQRMatrixQTransposeReturnType\n{\n  SparseQRMatrixQTransposeReturnType(const SparseQRType& qr) : m_qr(qr) {}\n  template<typename Derived>\n  SparseQR_QProduct<SparseQRType,Derived> operator*(const MatrixBase<Derived>& other)\n  {\n    return SparseQR_QProduct<SparseQRType,Derived>(m_qr,other.derived(), true);\n  }\n  const SparseQRType& m_qr;\n};\n\n} // end namespace Eigen\n\n#endif\n"
  },
  {
    "path": "libs/eigen/Eigen/src/StlSupport/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_StlSupport_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_StlSupport_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/StlSupport COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/Eigen/src/StlSupport/StdDeque.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2009 Hauke Heibel <hauke.heibel@googlemail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_STDDEQUE_H\n#define EIGEN_STDDEQUE_H\n\n#include \"details.h\"\n\n/**\n * This section contains a convenience MACRO which allows an easy specialization of\n * std::deque such that for data types with alignment issues the correct allocator\n * is used automatically.\n */\n#define EIGEN_DEFINE_STL_DEQUE_SPECIALIZATION(...) \\\nnamespace std \\\n{ \\\n  template<> \\\n  class deque<__VA_ARGS__, std::allocator<__VA_ARGS__> >           \\\n    : public deque<__VA_ARGS__, EIGEN_ALIGNED_ALLOCATOR<__VA_ARGS__> > \\\n  { \\\n    typedef deque<__VA_ARGS__, EIGEN_ALIGNED_ALLOCATOR<__VA_ARGS__> > deque_base; \\\n  public: \\\n    typedef __VA_ARGS__ value_type; \\\n    typedef deque_base::allocator_type allocator_type; \\\n    typedef deque_base::size_type size_type;  \\\n    typedef deque_base::iterator iterator;  \\\n    explicit deque(const allocator_type& a = allocator_type()) : deque_base(a) {}  \\\n    template<typename InputIterator> \\\n    deque(InputIterator first, InputIterator last, const allocator_type& a = allocator_type()) : deque_base(first, last, a) {} \\\n    deque(const deque& c) : deque_base(c) {}  \\\n    explicit deque(size_type num, const value_type& val = value_type()) : deque_base(num, val) {} \\\n    deque(iterator start, iterator end) : deque_base(start, end) {}  \\\n    deque& operator=(const deque& x) {  \\\n      deque_base::operator=(x);  \\\n      return *this;  \\\n    } \\\n  }; \\\n}\n\n// check whether we really need the std::deque specialization\n#if !(defined(_GLIBCXX_DEQUE) && (!EIGEN_GNUC_AT_LEAST(4,1))) /* Note that before gcc-4.1 we already have: std::deque::resize(size_type,const T&). */\n\nnamespace std {\n\n#define EIGEN_STD_DEQUE_SPECIALIZATION_BODY \\\n  public:  \\\n    typedef T value_type; \\\n    typedef typename deque_base::allocator_type allocator_type; \\\n    typedef typename deque_base::size_type size_type;  \\\n    typedef typename deque_base::iterator iterator;  \\\n    typedef typename deque_base::const_iterator const_iterator;  \\\n    explicit deque(const allocator_type& a = allocator_type()) : deque_base(a) {}  \\\n    template<typename InputIterator> \\\n    deque(InputIterator first, InputIterator last, const allocator_type& a = allocator_type()) \\\n    : deque_base(first, last, a) {} \\\n    deque(const deque& c) : deque_base(c) {}  \\\n    explicit deque(size_type num, const value_type& val = value_type()) : deque_base(num, val) {} \\\n    deque(iterator start, iterator end) : deque_base(start, end) {}  \\\n    deque& operator=(const deque& x) {  \\\n      deque_base::operator=(x);  \\\n      return *this;  \\\n    }\n\n  template<typename T>\n  class deque<T,EIGEN_ALIGNED_ALLOCATOR<T> >\n    : public deque<EIGEN_WORKAROUND_MSVC_STL_SUPPORT(T),\n                   Eigen::aligned_allocator_indirection<EIGEN_WORKAROUND_MSVC_STL_SUPPORT(T)> >\n{\n  typedef deque<EIGEN_WORKAROUND_MSVC_STL_SUPPORT(T),\n                Eigen::aligned_allocator_indirection<EIGEN_WORKAROUND_MSVC_STL_SUPPORT(T)> > deque_base;\n  EIGEN_STD_DEQUE_SPECIALIZATION_BODY\n\n  void resize(size_type new_size)\n  { resize(new_size, T()); }\n\n#if defined(_DEQUE_)\n  // workaround MSVC std::deque implementation\n  void resize(size_type new_size, const value_type& x)\n  {\n    if (deque_base::size() < new_size)\n      deque_base::_Insert_n(deque_base::end(), new_size - deque_base::size(), x);\n    else if (new_size < deque_base::size())\n      deque_base::erase(deque_base::begin() + new_size, deque_base::end());\n  }\n  void push_back(const value_type& x)\n  { deque_base::push_back(x); } \n  void push_front(const value_type& x)\n  { deque_base::push_front(x); }\n  using deque_base::insert;  \n  iterator insert(const_iterator position, const value_type& x)\n  { return deque_base::insert(position,x); }\n  void insert(const_iterator position, size_type new_size, const value_type& x)\n  { deque_base::insert(position, new_size, x); }\n#elif defined(_GLIBCXX_DEQUE) && EIGEN_GNUC_AT_LEAST(4,2)\n  // workaround GCC std::deque implementation\n  void resize(size_type new_size, const value_type& x)\n  {\n    if (new_size < deque_base::size())\n      deque_base::_M_erase_at_end(this->_M_impl._M_start + new_size);\n    else\n      deque_base::insert(deque_base::end(), new_size - deque_base::size(), x);\n  }\n#else\n  // either GCC 4.1 or non-GCC\n  // default implementation which should always work.\n  void resize(size_type new_size, const value_type& x)\n  {\n    if (new_size < deque_base::size())\n      deque_base::erase(deque_base::begin() + new_size, deque_base::end());\n    else if (new_size > deque_base::size())\n      deque_base::insert(deque_base::end(), new_size - deque_base::size(), x);\n  }\n#endif\n  };\n}\n\n#endif // check whether specialization is actually required\n\n#endif // EIGEN_STDDEQUE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/StlSupport/StdList.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Hauke Heibel <hauke.heibel@googlemail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_STDLIST_H\n#define EIGEN_STDLIST_H\n\n#include \"details.h\"\n\n/**\n * This section contains a convenience MACRO which allows an easy specialization of\n * std::list such that for data types with alignment issues the correct allocator\n * is used automatically.\n */\n#define EIGEN_DEFINE_STL_LIST_SPECIALIZATION(...) \\\nnamespace std \\\n{ \\\n  template<> \\\n  class list<__VA_ARGS__, std::allocator<__VA_ARGS__> >           \\\n    : public list<__VA_ARGS__, EIGEN_ALIGNED_ALLOCATOR<__VA_ARGS__> > \\\n  { \\\n    typedef list<__VA_ARGS__, EIGEN_ALIGNED_ALLOCATOR<__VA_ARGS__> > list_base; \\\n  public: \\\n    typedef __VA_ARGS__ value_type; \\\n    typedef list_base::allocator_type allocator_type; \\\n    typedef list_base::size_type size_type;  \\\n    typedef list_base::iterator iterator;  \\\n    explicit list(const allocator_type& a = allocator_type()) : list_base(a) {}  \\\n    template<typename InputIterator> \\\n    list(InputIterator first, InputIterator last, const allocator_type& a = allocator_type()) : list_base(first, last, a) {} \\\n    list(const list& c) : list_base(c) {}  \\\n    explicit list(size_type num, const value_type& val = value_type()) : list_base(num, val) {} \\\n    list(iterator start, iterator end) : list_base(start, end) {}  \\\n    list& operator=(const list& x) {  \\\n      list_base::operator=(x);  \\\n      return *this;  \\\n    } \\\n  }; \\\n}\n\n// check whether we really need the std::vector specialization\n#if !(defined(_GLIBCXX_VECTOR) && (!EIGEN_GNUC_AT_LEAST(4,1))) /* Note that before gcc-4.1 we already have: std::list::resize(size_type,const T&). */\n\nnamespace std\n{\n\n#define EIGEN_STD_LIST_SPECIALIZATION_BODY \\\n  public:  \\\n    typedef T value_type; \\\n    typedef typename list_base::allocator_type allocator_type; \\\n    typedef typename list_base::size_type size_type;  \\\n    typedef typename list_base::iterator iterator;  \\\n    typedef typename list_base::const_iterator const_iterator;  \\\n    explicit list(const allocator_type& a = allocator_type()) : list_base(a) {}  \\\n    template<typename InputIterator> \\\n    list(InputIterator first, InputIterator last, const allocator_type& a = allocator_type()) \\\n    : list_base(first, last, a) {} \\\n    list(const list& c) : list_base(c) {}  \\\n    explicit list(size_type num, const value_type& val = value_type()) : list_base(num, val) {} \\\n    list(iterator start, iterator end) : list_base(start, end) {}  \\\n    list& operator=(const list& x) {  \\\n    list_base::operator=(x);  \\\n    return *this; \\\n  }\n\n  template<typename T>\n  class list<T,EIGEN_ALIGNED_ALLOCATOR<T> >\n    : public list<EIGEN_WORKAROUND_MSVC_STL_SUPPORT(T),\n                  Eigen::aligned_allocator_indirection<EIGEN_WORKAROUND_MSVC_STL_SUPPORT(T)> >\n  {\n    typedef list<EIGEN_WORKAROUND_MSVC_STL_SUPPORT(T),\n                 Eigen::aligned_allocator_indirection<EIGEN_WORKAROUND_MSVC_STL_SUPPORT(T)> > list_base;\n    EIGEN_STD_LIST_SPECIALIZATION_BODY\n\n    void resize(size_type new_size)\n    { resize(new_size, T()); }\n\n    void resize(size_type new_size, const value_type& x)\n    {\n      if (list_base::size() < new_size)\n        list_base::insert(list_base::end(), new_size - list_base::size(), x);\n      else\n        while (new_size < list_base::size()) list_base::pop_back();\n    }\n\n#if defined(_LIST_)\n    // workaround MSVC std::list implementation\n    void push_back(const value_type& x)\n    { list_base::push_back(x); } \n    using list_base::insert;  \n    iterator insert(const_iterator position, const value_type& x)\n    { return list_base::insert(position,x); }\n    void insert(const_iterator position, size_type new_size, const value_type& x)\n    { list_base::insert(position, new_size, x); }\n#endif\n  };\n}\n\n#endif // check whether specialization is actually required\n\n#endif // EIGEN_STDLIST_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/StlSupport/StdVector.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2009 Hauke Heibel <hauke.heibel@googlemail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_STDVECTOR_H\n#define EIGEN_STDVECTOR_H\n\n#include \"details.h\"\n\n/**\n * This section contains a convenience MACRO which allows an easy specialization of\n * std::vector such that for data types with alignment issues the correct allocator\n * is used automatically.\n */\n#define EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(...) \\\nnamespace std \\\n{ \\\n  template<> \\\n  class vector<__VA_ARGS__, std::allocator<__VA_ARGS__> >  \\\n    : public vector<__VA_ARGS__, EIGEN_ALIGNED_ALLOCATOR<__VA_ARGS__> > \\\n  { \\\n    typedef vector<__VA_ARGS__, EIGEN_ALIGNED_ALLOCATOR<__VA_ARGS__> > vector_base; \\\n  public: \\\n    typedef __VA_ARGS__ value_type; \\\n    typedef vector_base::allocator_type allocator_type; \\\n    typedef vector_base::size_type size_type;  \\\n    typedef vector_base::iterator iterator;  \\\n    explicit vector(const allocator_type& a = allocator_type()) : vector_base(a) {}  \\\n    template<typename InputIterator> \\\n    vector(InputIterator first, InputIterator last, const allocator_type& a = allocator_type()) : vector_base(first, last, a) {} \\\n    vector(const vector& c) : vector_base(c) {}  \\\n    explicit vector(size_type num, const value_type& val = value_type()) : vector_base(num, val) {} \\\n    vector(iterator start, iterator end) : vector_base(start, end) {}  \\\n    vector& operator=(const vector& x) {  \\\n      vector_base::operator=(x);  \\\n      return *this;  \\\n    } \\\n  }; \\\n}\n\nnamespace std {\n\n#define EIGEN_STD_VECTOR_SPECIALIZATION_BODY \\\n  public:  \\\n    typedef T value_type; \\\n    typedef typename vector_base::allocator_type allocator_type; \\\n    typedef typename vector_base::size_type size_type;  \\\n    typedef typename vector_base::iterator iterator;  \\\n    typedef typename vector_base::const_iterator const_iterator;  \\\n    explicit vector(const allocator_type& a = allocator_type()) : vector_base(a) {}  \\\n    template<typename InputIterator> \\\n    vector(InputIterator first, InputIterator last, const allocator_type& a = allocator_type()) \\\n    : vector_base(first, last, a) {} \\\n    vector(const vector& c) : vector_base(c) {}  \\\n    explicit vector(size_type num, const value_type& val = value_type()) : vector_base(num, val) {} \\\n    vector(iterator start, iterator end) : vector_base(start, end) {}  \\\n    vector& operator=(const vector& x) {  \\\n      vector_base::operator=(x);  \\\n      return *this;  \\\n    }\n\n  template<typename T>\n  class vector<T,EIGEN_ALIGNED_ALLOCATOR<T> >\n    : public vector<EIGEN_WORKAROUND_MSVC_STL_SUPPORT(T),\n                    Eigen::aligned_allocator_indirection<EIGEN_WORKAROUND_MSVC_STL_SUPPORT(T)> >\n{\n  typedef vector<EIGEN_WORKAROUND_MSVC_STL_SUPPORT(T),\n                 Eigen::aligned_allocator_indirection<EIGEN_WORKAROUND_MSVC_STL_SUPPORT(T)> > vector_base;\n  EIGEN_STD_VECTOR_SPECIALIZATION_BODY\n\n  void resize(size_type new_size)\n  { resize(new_size, T()); }\n\n#if defined(_VECTOR_)\n  // workaround MSVC std::vector implementation\n  void resize(size_type new_size, const value_type& x)\n  {\n    if (vector_base::size() < new_size)\n      vector_base::_Insert_n(vector_base::end(), new_size - vector_base::size(), x);\n    else if (new_size < vector_base::size())\n      vector_base::erase(vector_base::begin() + new_size, vector_base::end());\n  }\n  void push_back(const value_type& x)\n  { vector_base::push_back(x); } \n  using vector_base::insert;  \n  iterator insert(const_iterator position, const value_type& x)\n  { return vector_base::insert(position,x); }\n  void insert(const_iterator position, size_type new_size, const value_type& x)\n  { vector_base::insert(position, new_size, x); }\n#elif defined(_GLIBCXX_VECTOR) && (!(EIGEN_GNUC_AT_LEAST(4,1)))\n  /* Note that before gcc-4.1 we already have: std::vector::resize(size_type,const T&).\n   * However, this specialization is still needed to make the above EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION trick to work. */\n  void resize(size_type new_size, const value_type& x)\n  {\n    vector_base::resize(new_size,x);\n  }\n#elif defined(_GLIBCXX_VECTOR) && EIGEN_GNUC_AT_LEAST(4,2)\n  // workaround GCC std::vector implementation\n  void resize(size_type new_size, const value_type& x)\n  {\n    if (new_size < vector_base::size())\n      vector_base::_M_erase_at_end(this->_M_impl._M_start + new_size);\n    else\n      vector_base::insert(vector_base::end(), new_size - vector_base::size(), x);\n  }\n#else\n  // either GCC 4.1 or non-GCC\n  // default implementation which should always work.\n  void resize(size_type new_size, const value_type& x)\n  {\n    if (new_size < vector_base::size())\n      vector_base::erase(vector_base::begin() + new_size, vector_base::end());\n    else if (new_size > vector_base::size())\n      vector_base::insert(vector_base::end(), new_size - vector_base::size(), x);\n  }\n#endif\n  };\n}\n\n#endif // EIGEN_STDVECTOR_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/StlSupport/details.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2009 Hauke Heibel <hauke.heibel@googlemail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_STL_DETAILS_H\n#define EIGEN_STL_DETAILS_H\n\n#ifndef EIGEN_ALIGNED_ALLOCATOR\n  #define EIGEN_ALIGNED_ALLOCATOR Eigen::aligned_allocator\n#endif\n\nnamespace Eigen {\n\n  // This one is needed to prevent reimplementing the whole std::vector.\n  template <class T>\n  class aligned_allocator_indirection : public EIGEN_ALIGNED_ALLOCATOR<T>\n  {\n  public:\n    typedef size_t    size_type;\n    typedef ptrdiff_t difference_type;\n    typedef T*        pointer;\n    typedef const T*  const_pointer;\n    typedef T&        reference;\n    typedef const T&  const_reference;\n    typedef T         value_type;\n\n    template<class U>\n    struct rebind\n    {\n      typedef aligned_allocator_indirection<U> other;\n    };\n\n    aligned_allocator_indirection() {}\n    aligned_allocator_indirection(const aligned_allocator_indirection& ) : EIGEN_ALIGNED_ALLOCATOR<T>() {}\n    aligned_allocator_indirection(const EIGEN_ALIGNED_ALLOCATOR<T>& ) {}\n    template<class U>\n    aligned_allocator_indirection(const aligned_allocator_indirection<U>& ) {}\n    template<class U>\n    aligned_allocator_indirection(const EIGEN_ALIGNED_ALLOCATOR<U>& ) {}\n    ~aligned_allocator_indirection() {}\n  };\n\n#ifdef _MSC_VER\n\n  // sometimes, MSVC detects, at compile time, that the argument x\n  // in std::vector::resize(size_t s,T x) won't be aligned and generate an error\n  // even if this function is never called. Whence this little wrapper.\n#define EIGEN_WORKAROUND_MSVC_STL_SUPPORT(T) \\\n  typename Eigen::internal::conditional< \\\n    Eigen::internal::is_arithmetic<T>::value, \\\n    T, \\\n    Eigen::internal::workaround_msvc_stl_support<T> \\\n  >::type\n\n  namespace internal {\n  template<typename T> struct workaround_msvc_stl_support : public T\n  {\n    inline workaround_msvc_stl_support() : T() {}\n    inline workaround_msvc_stl_support(const T& other) : T(other) {}\n    inline operator T& () { return *static_cast<T*>(this); }\n    inline operator const T& () const { return *static_cast<const T*>(this); }\n    template<typename OtherT>\n    inline T& operator=(const OtherT& other)\n    { T::operator=(other); return *this; }\n    inline workaround_msvc_stl_support& operator=(const workaround_msvc_stl_support& other)\n    { T::operator=(other); return *this; }\n  };\n  }\n\n#else\n\n#define EIGEN_WORKAROUND_MSVC_STL_SUPPORT(T) T\n\n#endif\n\n}\n\n#endif // EIGEN_STL_DETAILS_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SuperLUSupport/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_SuperLUSupport_SRCS \"*.h\")\n\nINSTALL(FILES \n  ${Eigen_SuperLUSupport_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/SuperLUSupport COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/Eigen/src/SuperLUSupport/SuperLUSupport.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2011 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SUPERLUSUPPORT_H\n#define EIGEN_SUPERLUSUPPORT_H\n\nnamespace Eigen { \n\n#define DECL_GSSVX(PREFIX,FLOATTYPE,KEYTYPE)\t\t\\\n    extern \"C\" {                                                                                          \\\n      typedef struct { FLOATTYPE for_lu; FLOATTYPE total_needed; int expansions; } PREFIX##mem_usage_t;   \\\n      extern void PREFIX##gssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *,                  \\\n                                char *, FLOATTYPE *, FLOATTYPE *, SuperMatrix *, SuperMatrix *,           \\\n                                void *, int, SuperMatrix *, SuperMatrix *,                                \\\n                                FLOATTYPE *, FLOATTYPE *, FLOATTYPE *, FLOATTYPE *,                       \\\n                                PREFIX##mem_usage_t *, SuperLUStat_t *, int *);                           \\\n    }                                                                                                     \\\n    inline float SuperLU_gssvx(superlu_options_t *options, SuperMatrix *A,                                \\\n         int *perm_c, int *perm_r, int *etree, char *equed,                                               \\\n         FLOATTYPE *R, FLOATTYPE *C, SuperMatrix *L,                                                      \\\n         SuperMatrix *U, void *work, int lwork,                                                           \\\n         SuperMatrix *B, SuperMatrix *X,                                                                  \\\n         FLOATTYPE *recip_pivot_growth,                                                                   \\\n         FLOATTYPE *rcond, FLOATTYPE *ferr, FLOATTYPE *berr,                                              \\\n         SuperLUStat_t *stats, int *info, KEYTYPE) {                                                      \\\n    PREFIX##mem_usage_t mem_usage;                                                                        \\\n    PREFIX##gssvx(options, A, perm_c, perm_r, etree, equed, R, C, L,                                      \\\n         U, work, lwork, B, X, recip_pivot_growth, rcond,                                                 \\\n         ferr, berr, &mem_usage, stats, info);                                                            \\\n    return mem_usage.for_lu; /* bytes used by the factor storage */                                       \\\n  }\n\nDECL_GSSVX(s,float,float)\nDECL_GSSVX(c,float,std::complex<float>)\nDECL_GSSVX(d,double,double)\nDECL_GSSVX(z,double,std::complex<double>)\n\n#ifdef MILU_ALPHA\n#define EIGEN_SUPERLU_HAS_ILU\n#endif\n\n#ifdef EIGEN_SUPERLU_HAS_ILU\n\n// similarly for the incomplete factorization using gsisx\n#define DECL_GSISX(PREFIX,FLOATTYPE,KEYTYPE)                                                    \\\n    extern \"C\" {                                                                                \\\n      extern void PREFIX##gsisx(superlu_options_t *, SuperMatrix *, int *, int *, int *,        \\\n                         char *, FLOATTYPE *, FLOATTYPE *, SuperMatrix *, SuperMatrix *,        \\\n                         void *, int, SuperMatrix *, SuperMatrix *, FLOATTYPE *, FLOATTYPE *,   \\\n                         PREFIX##mem_usage_t *, SuperLUStat_t *, int *);                        \\\n    }                                                                                           \\\n    inline float SuperLU_gsisx(superlu_options_t *options, SuperMatrix *A,                      \\\n         int *perm_c, int *perm_r, int *etree, char *equed,                                     \\\n         FLOATTYPE *R, FLOATTYPE *C, SuperMatrix *L,                                            \\\n         SuperMatrix *U, void *work, int lwork,                                                 \\\n         SuperMatrix *B, SuperMatrix *X,                                                        \\\n         FLOATTYPE *recip_pivot_growth,                                                         \\\n         FLOATTYPE *rcond,                                                                      \\\n         SuperLUStat_t *stats, int *info, KEYTYPE) {                                            \\\n    PREFIX##mem_usage_t mem_usage;                                                              \\\n    PREFIX##gsisx(options, A, perm_c, perm_r, etree, equed, R, C, L,                            \\\n         U, work, lwork, B, X, recip_pivot_growth, rcond,                                       \\\n         &mem_usage, stats, info);                                                              \\\n    return mem_usage.for_lu; /* bytes used by the factor storage */                             \\\n  }\n\nDECL_GSISX(s,float,float)\nDECL_GSISX(c,float,std::complex<float>)\nDECL_GSISX(d,double,double)\nDECL_GSISX(z,double,std::complex<double>)\n\n#endif\n\ntemplate<typename MatrixType>\nstruct SluMatrixMapHelper;\n\n/** \\internal\n  *\n  * A wrapper class for SuperLU matrices. It supports only compressed sparse matrices\n  * and dense matrices. Supernodal and other fancy format are not supported by this wrapper.\n  *\n  * This wrapper class mainly aims to avoids the need of dynamic allocation of the storage structure.\n  */\nstruct SluMatrix : SuperMatrix\n{\n  SluMatrix()\n  {\n    Store = &storage;\n  }\n\n  SluMatrix(const SluMatrix& other)\n    : SuperMatrix(other)\n  {\n    Store = &storage;\n    storage = other.storage;\n  }\n\n  SluMatrix& operator=(const SluMatrix& other)\n  {\n    SuperMatrix::operator=(static_cast<const SuperMatrix&>(other));\n    Store = &storage;\n    storage = other.storage;\n    return *this;\n  }\n\n  struct\n  {\n    union {int nnz;int lda;};\n    void *values;\n    int *innerInd;\n    int *outerInd;\n  } storage;\n\n  void setStorageType(Stype_t t)\n  {\n    Stype = t;\n    if (t==SLU_NC || t==SLU_NR || t==SLU_DN)\n      Store = &storage;\n    else\n    {\n      eigen_assert(false && \"storage type not supported\");\n      Store = 0;\n    }\n  }\n\n  template<typename Scalar>\n  void setScalarType()\n  {\n    if (internal::is_same<Scalar,float>::value)\n      Dtype = SLU_S;\n    else if (internal::is_same<Scalar,double>::value)\n      Dtype = SLU_D;\n    else if (internal::is_same<Scalar,std::complex<float> >::value)\n      Dtype = SLU_C;\n    else if (internal::is_same<Scalar,std::complex<double> >::value)\n      Dtype = SLU_Z;\n    else\n    {\n      eigen_assert(false && \"Scalar type not supported by SuperLU\");\n    }\n  }\n\n  template<typename MatrixType>\n  static SluMatrix Map(MatrixBase<MatrixType>& _mat)\n  {\n    MatrixType& mat(_mat.derived());\n    eigen_assert( ((MatrixType::Flags&RowMajorBit)!=RowMajorBit) && \"row-major dense matrices are not supported by SuperLU\");\n    SluMatrix res;\n    res.setStorageType(SLU_DN);\n    res.setScalarType<typename MatrixType::Scalar>();\n    res.Mtype     = SLU_GE;\n\n    res.nrow      = mat.rows();\n    res.ncol      = mat.cols();\n\n    res.storage.lda       = MatrixType::IsVectorAtCompileTime ? mat.size() : mat.outerStride();\n    res.storage.values    = (void*)(mat.data());\n    return res;\n  }\n\n  template<typename MatrixType>\n  static SluMatrix Map(SparseMatrixBase<MatrixType>& mat)\n  {\n    SluMatrix res;\n    if ((MatrixType::Flags&RowMajorBit)==RowMajorBit)\n    {\n      res.setStorageType(SLU_NR);\n      res.nrow      = mat.cols();\n      res.ncol      = mat.rows();\n    }\n    else\n    {\n      res.setStorageType(SLU_NC);\n      res.nrow      = mat.rows();\n      res.ncol      = mat.cols();\n    }\n\n    res.Mtype       = SLU_GE;\n\n    res.storage.nnz       = mat.nonZeros();\n    res.storage.values    = mat.derived().valuePtr();\n    res.storage.innerInd  = mat.derived().innerIndexPtr();\n    res.storage.outerInd  = mat.derived().outerIndexPtr();\n\n    res.setScalarType<typename MatrixType::Scalar>();\n\n    // FIXME the following is not very accurate\n    if (MatrixType::Flags & Upper)\n      res.Mtype = SLU_TRU;\n    if (MatrixType::Flags & Lower)\n      res.Mtype = SLU_TRL;\n\n    eigen_assert(((MatrixType::Flags & SelfAdjoint)==0) && \"SelfAdjoint matrix shape not supported by SuperLU\");\n\n    return res;\n  }\n};\n\ntemplate<typename Scalar, int Rows, int Cols, int Options, int MRows, int MCols>\nstruct SluMatrixMapHelper<Matrix<Scalar,Rows,Cols,Options,MRows,MCols> >\n{\n  typedef Matrix<Scalar,Rows,Cols,Options,MRows,MCols> MatrixType;\n  static void run(MatrixType& mat, SluMatrix& res)\n  {\n    eigen_assert( ((Options&RowMajor)!=RowMajor) && \"row-major dense matrices is not supported by SuperLU\");\n    res.setStorageType(SLU_DN);\n    res.setScalarType<Scalar>();\n    res.Mtype     = SLU_GE;\n\n    res.nrow      = mat.rows();\n    res.ncol      = mat.cols();\n\n    res.storage.lda       = mat.outerStride();\n    res.storage.values    = mat.data();\n  }\n};\n\ntemplate<typename Derived>\nstruct SluMatrixMapHelper<SparseMatrixBase<Derived> >\n{\n  typedef Derived MatrixType;\n  static void run(MatrixType& mat, SluMatrix& res)\n  {\n    if ((MatrixType::Flags&RowMajorBit)==RowMajorBit)\n    {\n      res.setStorageType(SLU_NR);\n      res.nrow      = mat.cols();\n      res.ncol      = mat.rows();\n    }\n    else\n    {\n      res.setStorageType(SLU_NC);\n      res.nrow      = mat.rows();\n      res.ncol      = mat.cols();\n    }\n\n    res.Mtype       = SLU_GE;\n\n    res.storage.nnz       = mat.nonZeros();\n    res.storage.values    = mat.valuePtr();\n    res.storage.innerInd  = mat.innerIndexPtr();\n    res.storage.outerInd  = mat.outerIndexPtr();\n\n    res.setScalarType<typename MatrixType::Scalar>();\n\n    // FIXME the following is not very accurate\n    if (MatrixType::Flags & Upper)\n      res.Mtype = SLU_TRU;\n    if (MatrixType::Flags & Lower)\n      res.Mtype = SLU_TRL;\n\n    eigen_assert(((MatrixType::Flags & SelfAdjoint)==0) && \"SelfAdjoint matrix shape not supported by SuperLU\");\n  }\n};\n\nnamespace internal {\n\ntemplate<typename MatrixType>\nSluMatrix asSluMatrix(MatrixType& mat)\n{\n  return SluMatrix::Map(mat);\n}\n\n/** View a Super LU matrix as an Eigen expression */\ntemplate<typename Scalar, int Flags, typename Index>\nMappedSparseMatrix<Scalar,Flags,Index> map_superlu(SluMatrix& sluMat)\n{\n  eigen_assert((Flags&RowMajor)==RowMajor && sluMat.Stype == SLU_NR\n         || (Flags&ColMajor)==ColMajor && sluMat.Stype == SLU_NC);\n\n  Index outerSize = (Flags&RowMajor)==RowMajor ? sluMat.ncol : sluMat.nrow;\n\n  return MappedSparseMatrix<Scalar,Flags,Index>(\n    sluMat.nrow, sluMat.ncol, sluMat.storage.outerInd[outerSize],\n    sluMat.storage.outerInd, sluMat.storage.innerInd, reinterpret_cast<Scalar*>(sluMat.storage.values) );\n}\n\n} // end namespace internal\n\n/** \\ingroup SuperLUSupport_Module\n  * \\class SuperLUBase\n  * \\brief The base class for the direct and incomplete LU factorization of SuperLU\n  */\ntemplate<typename _MatrixType, typename Derived>\nclass SuperLUBase : internal::noncopyable\n{\n  public:\n    typedef _MatrixType MatrixType;\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename MatrixType::RealScalar RealScalar;\n    typedef typename MatrixType::Index Index;\n    typedef Matrix<Scalar,Dynamic,1> Vector;\n    typedef Matrix<int, 1, MatrixType::ColsAtCompileTime> IntRowVectorType;\n    typedef Matrix<int, MatrixType::RowsAtCompileTime, 1> IntColVectorType;    \n    typedef SparseMatrix<Scalar> LUMatrixType;\n\n  public:\n\n    SuperLUBase() {}\n\n    ~SuperLUBase()\n    {\n      clearFactors();\n    }\n    \n    Derived& derived() { return *static_cast<Derived*>(this); }\n    const Derived& derived() const { return *static_cast<const Derived*>(this); }\n    \n    inline Index rows() const { return m_matrix.rows(); }\n    inline Index cols() const { return m_matrix.cols(); }\n    \n    /** \\returns a reference to the Super LU option object to configure the  Super LU algorithms. */\n    inline superlu_options_t& options() { return m_sluOptions; }\n    \n    /** \\brief Reports whether previous computation was successful.\n      *\n      * \\returns \\c Success if computation was succesful,\n      *          \\c NumericalIssue if the matrix.appears to be negative.\n      */\n    ComputationInfo info() const\n    {\n      eigen_assert(m_isInitialized && \"Decomposition is not initialized.\");\n      return m_info;\n    }\n\n    /** Computes the sparse Cholesky decomposition of \\a matrix */\n    void compute(const MatrixType& matrix)\n    {\n      derived().analyzePattern(matrix);\n      derived().factorize(matrix);\n    }\n    \n    /** \\returns the solution x of \\f$ A x = b \\f$ using the current decomposition of A.\n      *\n      * \\sa compute()\n      */\n    template<typename Rhs>\n    inline const internal::solve_retval<SuperLUBase, Rhs> solve(const MatrixBase<Rhs>& b) const\n    {\n      eigen_assert(m_isInitialized && \"SuperLU is not initialized.\");\n      eigen_assert(rows()==b.rows()\n                && \"SuperLU::solve(): invalid number of rows of the right hand side matrix b\");\n      return internal::solve_retval<SuperLUBase, Rhs>(*this, b.derived());\n    }\n    \n    /** \\returns the solution x of \\f$ A x = b \\f$ using the current decomposition of A.\n      *\n      * \\sa compute()\n      */\n    template<typename Rhs>\n    inline const internal::sparse_solve_retval<SuperLUBase, Rhs> solve(const SparseMatrixBase<Rhs>& b) const\n    {\n      eigen_assert(m_isInitialized && \"SuperLU is not initialized.\");\n      eigen_assert(rows()==b.rows()\n                && \"SuperLU::solve(): invalid number of rows of the right hand side matrix b\");\n      return internal::sparse_solve_retval<SuperLUBase, Rhs>(*this, b.derived());\n    }\n    \n    /** Performs a symbolic decomposition on the sparcity of \\a matrix.\n      *\n      * This function is particularly useful when solving for several problems having the same structure.\n      * \n      * \\sa factorize()\n      */\n    void analyzePattern(const MatrixType& /*matrix*/)\n    {\n      m_isInitialized = true;\n      m_info = Success;\n      m_analysisIsOk = true;\n      m_factorizationIsOk = false;\n    }\n    \n    template<typename Stream>\n    void dumpMemory(Stream& /*s*/)\n    {}\n    \n  protected:\n    \n    void initFactorization(const MatrixType& a)\n    {\n      set_default_options(&this->m_sluOptions);\n      \n      const int size = a.rows();\n      m_matrix = a;\n\n      m_sluA = internal::asSluMatrix(m_matrix);\n      clearFactors();\n\n      m_p.resize(size);\n      m_q.resize(size);\n      m_sluRscale.resize(size);\n      m_sluCscale.resize(size);\n      m_sluEtree.resize(size);\n\n      // set empty B and X\n      m_sluB.setStorageType(SLU_DN);\n      m_sluB.setScalarType<Scalar>();\n      m_sluB.Mtype          = SLU_GE;\n      m_sluB.storage.values = 0;\n      m_sluB.nrow           = 0;\n      m_sluB.ncol           = 0;\n      m_sluB.storage.lda    = size;\n      m_sluX                = m_sluB;\n      \n      m_extractedDataAreDirty = true;\n    }\n    \n    void init()\n    {\n      m_info = InvalidInput;\n      m_isInitialized = false;\n      m_sluL.Store = 0;\n      m_sluU.Store = 0;\n    }\n    \n    void extractData() const;\n\n    void clearFactors()\n    {\n      if(m_sluL.Store)\n        Destroy_SuperNode_Matrix(&m_sluL);\n      if(m_sluU.Store)\n        Destroy_CompCol_Matrix(&m_sluU);\n\n      m_sluL.Store = 0;\n      m_sluU.Store = 0;\n\n      memset(&m_sluL,0,sizeof m_sluL);\n      memset(&m_sluU,0,sizeof m_sluU);\n    }\n\n    // cached data to reduce reallocation, etc.\n    mutable LUMatrixType m_l;\n    mutable LUMatrixType m_u;\n    mutable IntColVectorType m_p;\n    mutable IntRowVectorType m_q;\n\n    mutable LUMatrixType m_matrix;  // copy of the factorized matrix\n    mutable SluMatrix m_sluA;\n    mutable SuperMatrix m_sluL, m_sluU;\n    mutable SluMatrix m_sluB, m_sluX;\n    mutable SuperLUStat_t m_sluStat;\n    mutable superlu_options_t m_sluOptions;\n    mutable std::vector<int> m_sluEtree;\n    mutable Matrix<RealScalar,Dynamic,1> m_sluRscale, m_sluCscale;\n    mutable Matrix<RealScalar,Dynamic,1> m_sluFerr, m_sluBerr;\n    mutable char m_sluEqued;\n\n    mutable ComputationInfo m_info;\n    bool m_isInitialized;\n    int m_factorizationIsOk;\n    int m_analysisIsOk;\n    mutable bool m_extractedDataAreDirty;\n    \n  private:\n    SuperLUBase(SuperLUBase& ) { }\n};\n\n\n/** \\ingroup SuperLUSupport_Module\n  * \\class SuperLU\n  * \\brief A sparse direct LU factorization and solver based on the SuperLU library\n  *\n  * This class allows to solve for A.X = B sparse linear problems via a direct LU factorization\n  * using the SuperLU library. The sparse matrix A must be squared and invertible. The vectors or matrices\n  * X and B can be either dense or sparse.\n  *\n  * \\tparam _MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>\n  *\n  * \\sa \\ref TutorialSparseDirectSolvers\n  */\ntemplate<typename _MatrixType>\nclass SuperLU : public SuperLUBase<_MatrixType,SuperLU<_MatrixType> >\n{\n  public:\n    typedef SuperLUBase<_MatrixType,SuperLU> Base;\n    typedef _MatrixType MatrixType;\n    typedef typename Base::Scalar Scalar;\n    typedef typename Base::RealScalar RealScalar;\n    typedef typename Base::Index Index;\n    typedef typename Base::IntRowVectorType IntRowVectorType;\n    typedef typename Base::IntColVectorType IntColVectorType;    \n    typedef typename Base::LUMatrixType LUMatrixType;\n    typedef TriangularView<LUMatrixType, Lower|UnitDiag>  LMatrixType;\n    typedef TriangularView<LUMatrixType,  Upper>           UMatrixType;\n\n  public:\n\n    SuperLU() : Base() { init(); }\n\n    SuperLU(const MatrixType& matrix) : Base()\n    {\n      init();\n      Base::compute(matrix);\n    }\n\n    ~SuperLU()\n    {\n    }\n    \n    /** Performs a symbolic decomposition on the sparcity of \\a matrix.\n      *\n      * This function is particularly useful when solving for several problems having the same structure.\n      * \n      * \\sa factorize()\n      */\n    void analyzePattern(const MatrixType& matrix)\n    {\n      m_info = InvalidInput;\n      m_isInitialized = false;\n      Base::analyzePattern(matrix);\n    }\n    \n    /** Performs a numeric decomposition of \\a matrix\n      *\n      * The given matrix must has the same sparcity than the matrix on which the symbolic decomposition has been performed.\n      *\n      * \\sa analyzePattern()\n      */\n    void factorize(const MatrixType& matrix);\n    \n    #ifndef EIGEN_PARSED_BY_DOXYGEN\n    /** \\internal */\n    template<typename Rhs,typename Dest>\n    void _solve(const MatrixBase<Rhs> &b, MatrixBase<Dest> &dest) const;\n    #endif // EIGEN_PARSED_BY_DOXYGEN\n    \n    inline const LMatrixType& matrixL() const\n    {\n      if (m_extractedDataAreDirty) this->extractData();\n      return m_l;\n    }\n\n    inline const UMatrixType& matrixU() const\n    {\n      if (m_extractedDataAreDirty) this->extractData();\n      return m_u;\n    }\n\n    inline const IntColVectorType& permutationP() const\n    {\n      if (m_extractedDataAreDirty) this->extractData();\n      return m_p;\n    }\n\n    inline const IntRowVectorType& permutationQ() const\n    {\n      if (m_extractedDataAreDirty) this->extractData();\n      return m_q;\n    }\n    \n    Scalar determinant() const;\n    \n  protected:\n    \n    using Base::m_matrix;\n    using Base::m_sluOptions;\n    using Base::m_sluA;\n    using Base::m_sluB;\n    using Base::m_sluX;\n    using Base::m_p;\n    using Base::m_q;\n    using Base::m_sluEtree;\n    using Base::m_sluEqued;\n    using Base::m_sluRscale;\n    using Base::m_sluCscale;\n    using Base::m_sluL;\n    using Base::m_sluU;\n    using Base::m_sluStat;\n    using Base::m_sluFerr;\n    using Base::m_sluBerr;\n    using Base::m_l;\n    using Base::m_u;\n    \n    using Base::m_analysisIsOk;\n    using Base::m_factorizationIsOk;\n    using Base::m_extractedDataAreDirty;\n    using Base::m_isInitialized;\n    using Base::m_info;\n    \n    void init()\n    {\n      Base::init();\n      \n      set_default_options(&this->m_sluOptions);\n      m_sluOptions.PrintStat        = NO;\n      m_sluOptions.ConditionNumber  = NO;\n      m_sluOptions.Trans            = NOTRANS;\n      m_sluOptions.ColPerm          = COLAMD;\n    }\n    \n    \n  private:\n    SuperLU(SuperLU& ) { }\n};\n\ntemplate<typename MatrixType>\nvoid SuperLU<MatrixType>::factorize(const MatrixType& a)\n{\n  eigen_assert(m_analysisIsOk && \"You must first call analyzePattern()\");\n  if(!m_analysisIsOk)\n  {\n    m_info = InvalidInput;\n    return;\n  }\n  \n  this->initFactorization(a);\n  \n  m_sluOptions.ColPerm = COLAMD;\n  int info = 0;\n  RealScalar recip_pivot_growth, rcond;\n  RealScalar ferr, berr;\n\n  StatInit(&m_sluStat);\n  SuperLU_gssvx(&m_sluOptions, &m_sluA, m_q.data(), m_p.data(), &m_sluEtree[0],\n                &m_sluEqued, &m_sluRscale[0], &m_sluCscale[0],\n                &m_sluL, &m_sluU,\n                NULL, 0,\n                &m_sluB, &m_sluX,\n                &recip_pivot_growth, &rcond,\n                &ferr, &berr,\n                &m_sluStat, &info, Scalar());\n  StatFree(&m_sluStat);\n\n  m_extractedDataAreDirty = true;\n\n  // FIXME how to better check for errors ???\n  m_info = info == 0 ? Success : NumericalIssue;\n  m_factorizationIsOk = true;\n}\n\ntemplate<typename MatrixType>\ntemplate<typename Rhs,typename Dest>\nvoid SuperLU<MatrixType>::_solve(const MatrixBase<Rhs> &b, MatrixBase<Dest>& x) const\n{\n  eigen_assert(m_factorizationIsOk && \"The decomposition is not in a valid state for solving, you must first call either compute() or analyzePattern()/factorize()\");\n\n  const int size = m_matrix.rows();\n  const int rhsCols = b.cols();\n  eigen_assert(size==b.rows());\n\n  m_sluOptions.Trans = NOTRANS;\n  m_sluOptions.Fact = FACTORED;\n  m_sluOptions.IterRefine = NOREFINE;\n  \n\n  m_sluFerr.resize(rhsCols);\n  m_sluBerr.resize(rhsCols);\n  m_sluB = SluMatrix::Map(b.const_cast_derived());\n  m_sluX = SluMatrix::Map(x.derived());\n  \n  typename Rhs::PlainObject b_cpy;\n  if(m_sluEqued!='N')\n  {\n    b_cpy = b;\n    m_sluB = SluMatrix::Map(b_cpy.const_cast_derived());  \n  }\n\n  StatInit(&m_sluStat);\n  int info = 0;\n  RealScalar recip_pivot_growth, rcond;\n  SuperLU_gssvx(&m_sluOptions, &m_sluA,\n                m_q.data(), m_p.data(),\n                &m_sluEtree[0], &m_sluEqued,\n                &m_sluRscale[0], &m_sluCscale[0],\n                &m_sluL, &m_sluU,\n                NULL, 0,\n                &m_sluB, &m_sluX,\n                &recip_pivot_growth, &rcond,\n                &m_sluFerr[0], &m_sluBerr[0],\n                &m_sluStat, &info, Scalar());\n  StatFree(&m_sluStat);\n  m_info = info==0 ? Success : NumericalIssue;\n}\n\n// the code of this extractData() function has been adapted from the SuperLU's Matlab support code,\n//\n//  Copyright (c) 1994 by Xerox Corporation.  All rights reserved.\n//\n//  THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY\n//  EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.\n//\ntemplate<typename MatrixType, typename Derived>\nvoid SuperLUBase<MatrixType,Derived>::extractData() const\n{\n  eigen_assert(m_factorizationIsOk && \"The decomposition is not in a valid state for extracting factors, you must first call either compute() or analyzePattern()/factorize()\");\n  if (m_extractedDataAreDirty)\n  {\n    int         upper;\n    int         fsupc, istart, nsupr;\n    int         lastl = 0, lastu = 0;\n    SCformat    *Lstore = static_cast<SCformat*>(m_sluL.Store);\n    NCformat    *Ustore = static_cast<NCformat*>(m_sluU.Store);\n    Scalar      *SNptr;\n\n    const int size = m_matrix.rows();\n    m_l.resize(size,size);\n    m_l.resizeNonZeros(Lstore->nnz);\n    m_u.resize(size,size);\n    m_u.resizeNonZeros(Ustore->nnz);\n\n    int* Lcol = m_l.outerIndexPtr();\n    int* Lrow = m_l.innerIndexPtr();\n    Scalar* Lval = m_l.valuePtr();\n\n    int* Ucol = m_u.outerIndexPtr();\n    int* Urow = m_u.innerIndexPtr();\n    Scalar* Uval = m_u.valuePtr();\n\n    Ucol[0] = 0;\n    Ucol[0] = 0;\n\n    /* for each supernode */\n    for (int k = 0; k <= Lstore->nsuper; ++k)\n    {\n      fsupc   = L_FST_SUPC(k);\n      istart  = L_SUB_START(fsupc);\n      nsupr   = L_SUB_START(fsupc+1) - istart;\n      upper   = 1;\n\n      /* for each column in the supernode */\n      for (int j = fsupc; j < L_FST_SUPC(k+1); ++j)\n      {\n        SNptr = &((Scalar*)Lstore->nzval)[L_NZ_START(j)];\n\n        /* Extract U */\n        for (int i = U_NZ_START(j); i < U_NZ_START(j+1); ++i)\n        {\n          Uval[lastu] = ((Scalar*)Ustore->nzval)[i];\n          /* Matlab doesn't like explicit zero. */\n          if (Uval[lastu] != 0.0)\n            Urow[lastu++] = U_SUB(i);\n        }\n        for (int i = 0; i < upper; ++i)\n        {\n          /* upper triangle in the supernode */\n          Uval[lastu] = SNptr[i];\n          /* Matlab doesn't like explicit zero. */\n          if (Uval[lastu] != 0.0)\n            Urow[lastu++] = L_SUB(istart+i);\n        }\n        Ucol[j+1] = lastu;\n\n        /* Extract L */\n        Lval[lastl] = 1.0; /* unit diagonal */\n        Lrow[lastl++] = L_SUB(istart + upper - 1);\n        for (int i = upper; i < nsupr; ++i)\n        {\n          Lval[lastl] = SNptr[i];\n          /* Matlab doesn't like explicit zero. */\n          if (Lval[lastl] != 0.0)\n            Lrow[lastl++] = L_SUB(istart+i);\n        }\n        Lcol[j+1] = lastl;\n\n        ++upper;\n      } /* for j ... */\n\n    } /* for k ... */\n\n    // squeeze the matrices :\n    m_l.resizeNonZeros(lastl);\n    m_u.resizeNonZeros(lastu);\n\n    m_extractedDataAreDirty = false;\n  }\n}\n\ntemplate<typename MatrixType>\ntypename SuperLU<MatrixType>::Scalar SuperLU<MatrixType>::determinant() const\n{\n  eigen_assert(m_factorizationIsOk && \"The decomposition is not in a valid state for computing the determinant, you must first call either compute() or analyzePattern()/factorize()\");\n  \n  if (m_extractedDataAreDirty)\n    this->extractData();\n\n  Scalar det = Scalar(1);\n  for (int j=0; j<m_u.cols(); ++j)\n  {\n    if (m_u.outerIndexPtr()[j+1]-m_u.outerIndexPtr()[j] > 0)\n    {\n      int lastId = m_u.outerIndexPtr()[j+1]-1;\n      eigen_assert(m_u.innerIndexPtr()[lastId]<=j);\n      if (m_u.innerIndexPtr()[lastId]==j)\n        det *= m_u.valuePtr()[lastId];\n    }\n  }\n  if(m_sluEqued!='N')\n    return det/m_sluRscale.prod()/m_sluCscale.prod();\n  else\n    return det;\n}\n\n#ifdef EIGEN_PARSED_BY_DOXYGEN\n#define EIGEN_SUPERLU_HAS_ILU\n#endif\n\n#ifdef EIGEN_SUPERLU_HAS_ILU\n\n/** \\ingroup SuperLUSupport_Module\n  * \\class SuperILU\n  * \\brief A sparse direct \\b incomplete LU factorization and solver based on the SuperLU library\n  *\n  * This class allows to solve for an approximate solution of A.X = B sparse linear problems via an incomplete LU factorization\n  * using the SuperLU library. This class is aimed to be used as a preconditioner of the iterative linear solvers.\n  *\n  * \\warning This class requires SuperLU 4 or later.\n  *\n  * \\tparam _MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>\n  *\n  * \\sa \\ref TutorialSparseDirectSolvers, class ConjugateGradient, class BiCGSTAB\n  */\n\ntemplate<typename _MatrixType>\nclass SuperILU : public SuperLUBase<_MatrixType,SuperILU<_MatrixType> >\n{\n  public:\n    typedef SuperLUBase<_MatrixType,SuperILU> Base;\n    typedef _MatrixType MatrixType;\n    typedef typename Base::Scalar Scalar;\n    typedef typename Base::RealScalar RealScalar;\n    typedef typename Base::Index Index;\n\n  public:\n\n    SuperILU() : Base() { init(); }\n\n    SuperILU(const MatrixType& matrix) : Base()\n    {\n      init();\n      Base::compute(matrix);\n    }\n\n    ~SuperILU()\n    {\n    }\n    \n    /** Performs a symbolic decomposition on the sparcity of \\a matrix.\n      *\n      * This function is particularly useful when solving for several problems having the same structure.\n      * \n      * \\sa factorize()\n      */\n    void analyzePattern(const MatrixType& matrix)\n    {\n      Base::analyzePattern(matrix);\n    }\n    \n    /** Performs a numeric decomposition of \\a matrix\n      *\n      * The given matrix must has the same sparcity than the matrix on which the symbolic decomposition has been performed.\n      *\n      * \\sa analyzePattern()\n      */\n    void factorize(const MatrixType& matrix);\n    \n    #ifndef EIGEN_PARSED_BY_DOXYGEN\n    /** \\internal */\n    template<typename Rhs,typename Dest>\n    void _solve(const MatrixBase<Rhs> &b, MatrixBase<Dest> &dest) const;\n    #endif // EIGEN_PARSED_BY_DOXYGEN\n    \n  protected:\n    \n    using Base::m_matrix;\n    using Base::m_sluOptions;\n    using Base::m_sluA;\n    using Base::m_sluB;\n    using Base::m_sluX;\n    using Base::m_p;\n    using Base::m_q;\n    using Base::m_sluEtree;\n    using Base::m_sluEqued;\n    using Base::m_sluRscale;\n    using Base::m_sluCscale;\n    using Base::m_sluL;\n    using Base::m_sluU;\n    using Base::m_sluStat;\n    using Base::m_sluFerr;\n    using Base::m_sluBerr;\n    using Base::m_l;\n    using Base::m_u;\n    \n    using Base::m_analysisIsOk;\n    using Base::m_factorizationIsOk;\n    using Base::m_extractedDataAreDirty;\n    using Base::m_isInitialized;\n    using Base::m_info;\n\n    void init()\n    {\n      Base::init();\n      \n      ilu_set_default_options(&m_sluOptions);\n      m_sluOptions.PrintStat        = NO;\n      m_sluOptions.ConditionNumber  = NO;\n      m_sluOptions.Trans            = NOTRANS;\n      m_sluOptions.ColPerm          = MMD_AT_PLUS_A;\n      \n      // no attempt to preserve column sum\n      m_sluOptions.ILU_MILU = SILU;\n      // only basic ILU(k) support -- no direct control over memory consumption\n      // better to use ILU_DropRule = DROP_BASIC | DROP_AREA\n      // and set ILU_FillFactor to max memory growth\n      m_sluOptions.ILU_DropRule = DROP_BASIC;\n      m_sluOptions.ILU_DropTol = NumTraits<Scalar>::dummy_precision()*10;\n    }\n    \n  private:\n    SuperILU(SuperILU& ) { }\n};\n\ntemplate<typename MatrixType>\nvoid SuperILU<MatrixType>::factorize(const MatrixType& a)\n{\n  eigen_assert(m_analysisIsOk && \"You must first call analyzePattern()\");\n  if(!m_analysisIsOk)\n  {\n    m_info = InvalidInput;\n    return;\n  }\n  \n  this->initFactorization(a);\n\n  int info = 0;\n  RealScalar recip_pivot_growth, rcond;\n\n  StatInit(&m_sluStat);\n  SuperLU_gsisx(&m_sluOptions, &m_sluA, m_q.data(), m_p.data(), &m_sluEtree[0],\n                &m_sluEqued, &m_sluRscale[0], &m_sluCscale[0],\n                &m_sluL, &m_sluU,\n                NULL, 0,\n                &m_sluB, &m_sluX,\n                &recip_pivot_growth, &rcond,\n                &m_sluStat, &info, Scalar());\n  StatFree(&m_sluStat);\n\n  // FIXME how to better check for errors ???\n  m_info = info == 0 ? Success : NumericalIssue;\n  m_factorizationIsOk = true;\n}\n\ntemplate<typename MatrixType>\ntemplate<typename Rhs,typename Dest>\nvoid SuperILU<MatrixType>::_solve(const MatrixBase<Rhs> &b, MatrixBase<Dest>& x) const\n{\n  eigen_assert(m_factorizationIsOk && \"The decomposition is not in a valid state for solving, you must first call either compute() or analyzePattern()/factorize()\");\n\n  const int size = m_matrix.rows();\n  const int rhsCols = b.cols();\n  eigen_assert(size==b.rows());\n\n  m_sluOptions.Trans = NOTRANS;\n  m_sluOptions.Fact = FACTORED;\n  m_sluOptions.IterRefine = NOREFINE;\n\n  m_sluFerr.resize(rhsCols);\n  m_sluBerr.resize(rhsCols);\n  m_sluB = SluMatrix::Map(b.const_cast_derived());\n  m_sluX = SluMatrix::Map(x.derived());\n\n  typename Rhs::PlainObject b_cpy;\n  if(m_sluEqued!='N')\n  {\n    b_cpy = b;\n    m_sluB = SluMatrix::Map(b_cpy.const_cast_derived());  \n  }\n  \n  int info = 0;\n  RealScalar recip_pivot_growth, rcond;\n\n  StatInit(&m_sluStat);\n  SuperLU_gsisx(&m_sluOptions, &m_sluA,\n                m_q.data(), m_p.data(),\n                &m_sluEtree[0], &m_sluEqued,\n                &m_sluRscale[0], &m_sluCscale[0],\n                &m_sluL, &m_sluU,\n                NULL, 0,\n                &m_sluB, &m_sluX,\n                &recip_pivot_growth, &rcond,\n                &m_sluStat, &info, Scalar());\n  StatFree(&m_sluStat);\n\n  m_info = info==0 ? Success : NumericalIssue;\n}\n#endif\n\nnamespace internal {\n  \ntemplate<typename _MatrixType, typename Derived, typename Rhs>\nstruct solve_retval<SuperLUBase<_MatrixType,Derived>, Rhs>\n  : solve_retval_base<SuperLUBase<_MatrixType,Derived>, Rhs>\n{\n  typedef SuperLUBase<_MatrixType,Derived> Dec;\n  EIGEN_MAKE_SOLVE_HELPERS(Dec,Rhs)\n\n  template<typename Dest> void evalTo(Dest& dst) const\n  {\n    dec().derived()._solve(rhs(),dst);\n  }\n};\n\ntemplate<typename _MatrixType, typename Derived, typename Rhs>\nstruct sparse_solve_retval<SuperLUBase<_MatrixType,Derived>, Rhs>\n  : sparse_solve_retval_base<SuperLUBase<_MatrixType,Derived>, Rhs>\n{\n  typedef SuperLUBase<_MatrixType,Derived> Dec;\n  EIGEN_MAKE_SPARSE_SOLVE_HELPERS(Dec,Rhs)\n\n  template<typename Dest> void evalTo(Dest& dst) const\n  {\n    this->defaultEvalTo(dst);\n  }\n};\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_SUPERLUSUPPORT_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/UmfPackSupport/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_UmfPackSupport_SRCS \"*.h\")\n\nINSTALL(FILES \n  ${Eigen_UmfPackSupport_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/UmfPackSupport COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/Eigen/src/UmfPackSupport/UmfPackSupport.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2011 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_UMFPACKSUPPORT_H\n#define EIGEN_UMFPACKSUPPORT_H\n\nnamespace Eigen { \n\n/* TODO extract L, extract U, compute det, etc... */\n\n// generic double/complex<double> wrapper functions:\n\ninline void umfpack_free_numeric(void **Numeric, double)\n{ umfpack_di_free_numeric(Numeric); *Numeric = 0; }\n\ninline void umfpack_free_numeric(void **Numeric, std::complex<double>)\n{ umfpack_zi_free_numeric(Numeric); *Numeric = 0; }\n\ninline void umfpack_free_symbolic(void **Symbolic, double)\n{ umfpack_di_free_symbolic(Symbolic); *Symbolic = 0; }\n\ninline void umfpack_free_symbolic(void **Symbolic, std::complex<double>)\n{ umfpack_zi_free_symbolic(Symbolic); *Symbolic = 0; }\n\ninline int umfpack_symbolic(int n_row,int n_col,\n                            const int Ap[], const int Ai[], const double Ax[], void **Symbolic,\n                            const double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO])\n{\n  return umfpack_di_symbolic(n_row,n_col,Ap,Ai,Ax,Symbolic,Control,Info);\n}\n\ninline int umfpack_symbolic(int n_row,int n_col,\n                            const int Ap[], const int Ai[], const std::complex<double> Ax[], void **Symbolic,\n                            const double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO])\n{\n  return umfpack_zi_symbolic(n_row,n_col,Ap,Ai,&numext::real_ref(Ax[0]),0,Symbolic,Control,Info);\n}\n\ninline int umfpack_numeric( const int Ap[], const int Ai[], const double Ax[],\n                            void *Symbolic, void **Numeric,\n                            const double Control[UMFPACK_CONTROL],double Info [UMFPACK_INFO])\n{\n  return umfpack_di_numeric(Ap,Ai,Ax,Symbolic,Numeric,Control,Info);\n}\n\ninline int umfpack_numeric( const int Ap[], const int Ai[], const std::complex<double> Ax[],\n                            void *Symbolic, void **Numeric,\n                            const double Control[UMFPACK_CONTROL],double Info [UMFPACK_INFO])\n{\n  return umfpack_zi_numeric(Ap,Ai,&numext::real_ref(Ax[0]),0,Symbolic,Numeric,Control,Info);\n}\n\ninline int umfpack_solve( int sys, const int Ap[], const int Ai[], const double Ax[],\n                          double X[], const double B[], void *Numeric,\n                          const double Control[UMFPACK_CONTROL], double Info[UMFPACK_INFO])\n{\n  return umfpack_di_solve(sys,Ap,Ai,Ax,X,B,Numeric,Control,Info);\n}\n\ninline int umfpack_solve( int sys, const int Ap[], const int Ai[], const std::complex<double> Ax[],\n                          std::complex<double> X[], const std::complex<double> B[], void *Numeric,\n                          const double Control[UMFPACK_CONTROL], double Info[UMFPACK_INFO])\n{\n  return umfpack_zi_solve(sys,Ap,Ai,&numext::real_ref(Ax[0]),0,&numext::real_ref(X[0]),0,&numext::real_ref(B[0]),0,Numeric,Control,Info);\n}\n\ninline int umfpack_get_lunz(int *lnz, int *unz, int *n_row, int *n_col, int *nz_udiag, void *Numeric, double)\n{\n  return umfpack_di_get_lunz(lnz,unz,n_row,n_col,nz_udiag,Numeric);\n}\n\ninline int umfpack_get_lunz(int *lnz, int *unz, int *n_row, int *n_col, int *nz_udiag, void *Numeric, std::complex<double>)\n{\n  return umfpack_zi_get_lunz(lnz,unz,n_row,n_col,nz_udiag,Numeric);\n}\n\ninline int umfpack_get_numeric(int Lp[], int Lj[], double Lx[], int Up[], int Ui[], double Ux[],\n                               int P[], int Q[], double Dx[], int *do_recip, double Rs[], void *Numeric)\n{\n  return umfpack_di_get_numeric(Lp,Lj,Lx,Up,Ui,Ux,P,Q,Dx,do_recip,Rs,Numeric);\n}\n\ninline int umfpack_get_numeric(int Lp[], int Lj[], std::complex<double> Lx[], int Up[], int Ui[], std::complex<double> Ux[],\n                               int P[], int Q[], std::complex<double> Dx[], int *do_recip, double Rs[], void *Numeric)\n{\n  double& lx0_real = numext::real_ref(Lx[0]);\n  double& ux0_real = numext::real_ref(Ux[0]);\n  double& dx0_real = numext::real_ref(Dx[0]);\n  return umfpack_zi_get_numeric(Lp,Lj,Lx?&lx0_real:0,0,Up,Ui,Ux?&ux0_real:0,0,P,Q,\n                                Dx?&dx0_real:0,0,do_recip,Rs,Numeric);\n}\n\ninline int umfpack_get_determinant(double *Mx, double *Ex, void *NumericHandle, double User_Info [UMFPACK_INFO])\n{\n  return umfpack_di_get_determinant(Mx,Ex,NumericHandle,User_Info);\n}\n\ninline int umfpack_get_determinant(std::complex<double> *Mx, double *Ex, void *NumericHandle, double User_Info [UMFPACK_INFO])\n{\n  double& mx_real = numext::real_ref(*Mx);\n  return umfpack_zi_get_determinant(&mx_real,0,Ex,NumericHandle,User_Info);\n}\n\nnamespace internal {\n  template<typename T> struct umfpack_helper_is_sparse_plain : false_type {};\n  template<typename Scalar, int Options, typename StorageIndex>\n  struct umfpack_helper_is_sparse_plain<SparseMatrix<Scalar,Options,StorageIndex> >\n    : true_type {};\n  template<typename Scalar, int Options, typename StorageIndex>\n  struct umfpack_helper_is_sparse_plain<MappedSparseMatrix<Scalar,Options,StorageIndex> >\n    : true_type {};\n}\n\n/** \\ingroup UmfPackSupport_Module\n  * \\brief A sparse LU factorization and solver based on UmfPack\n  *\n  * This class allows to solve for A.X = B sparse linear problems via a LU factorization\n  * using the UmfPack library. The sparse matrix A must be squared and full rank.\n  * The vectors or matrices X and B can be either dense or sparse.\n  *\n  * \\warning The input matrix A should be in a \\b compressed and \\b column-major form.\n  * Otherwise an expensive copy will be made. You can call the inexpensive makeCompressed() to get a compressed matrix.\n  * \\tparam _MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>\n  *\n  * \\sa \\ref TutorialSparseDirectSolvers\n  */\ntemplate<typename _MatrixType>\nclass UmfPackLU : internal::noncopyable\n{\n  public:\n    typedef _MatrixType MatrixType;\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename MatrixType::RealScalar RealScalar;\n    typedef typename MatrixType::Index Index;\n    typedef Matrix<Scalar,Dynamic,1> Vector;\n    typedef Matrix<int, 1, MatrixType::ColsAtCompileTime> IntRowVectorType;\n    typedef Matrix<int, MatrixType::RowsAtCompileTime, 1> IntColVectorType;\n    typedef SparseMatrix<Scalar> LUMatrixType;\n    typedef SparseMatrix<Scalar,ColMajor,int> UmfpackMatrixType;\n\n  public:\n\n    UmfPackLU() { init(); }\n\n    UmfPackLU(const MatrixType& matrix)\n    {\n      init();\n      compute(matrix);\n    }\n\n    ~UmfPackLU()\n    {\n      if(m_symbolic) umfpack_free_symbolic(&m_symbolic,Scalar());\n      if(m_numeric)  umfpack_free_numeric(&m_numeric,Scalar());\n    }\n\n    inline Index rows() const { return m_copyMatrix.rows(); }\n    inline Index cols() const { return m_copyMatrix.cols(); }\n\n    /** \\brief Reports whether previous computation was successful.\n      *\n      * \\returns \\c Success if computation was succesful,\n      *          \\c NumericalIssue if the matrix.appears to be negative.\n      */\n    ComputationInfo info() const\n    {\n      eigen_assert(m_isInitialized && \"Decomposition is not initialized.\");\n      return m_info;\n    }\n\n    inline const LUMatrixType& matrixL() const\n    {\n      if (m_extractedDataAreDirty) extractData();\n      return m_l;\n    }\n\n    inline const LUMatrixType& matrixU() const\n    {\n      if (m_extractedDataAreDirty) extractData();\n      return m_u;\n    }\n\n    inline const IntColVectorType& permutationP() const\n    {\n      if (m_extractedDataAreDirty) extractData();\n      return m_p;\n    }\n\n    inline const IntRowVectorType& permutationQ() const\n    {\n      if (m_extractedDataAreDirty) extractData();\n      return m_q;\n    }\n\n    /** Computes the sparse Cholesky decomposition of \\a matrix \n     *  Note that the matrix should be column-major, and in compressed format for best performance.\n     *  \\sa SparseMatrix::makeCompressed().\n     */\n    template<typename InputMatrixType>\n    void compute(const InputMatrixType& matrix)\n    {\n      if(m_symbolic) umfpack_free_symbolic(&m_symbolic,Scalar());\n      if(m_numeric)  umfpack_free_numeric(&m_numeric,Scalar());\n      grapInput(matrix.derived());\n      analyzePattern_impl();\n      factorize_impl();\n    }\n\n    /** \\returns the solution x of \\f$ A x = b \\f$ using the current decomposition of A.\n      *\n      * \\sa compute()\n      */\n    template<typename Rhs>\n    inline const internal::solve_retval<UmfPackLU, Rhs> solve(const MatrixBase<Rhs>& b) const\n    {\n      eigen_assert(m_isInitialized && \"UmfPackLU is not initialized.\");\n      eigen_assert(rows()==b.rows()\n                && \"UmfPackLU::solve(): invalid number of rows of the right hand side matrix b\");\n      return internal::solve_retval<UmfPackLU, Rhs>(*this, b.derived());\n    }\n\n    /** \\returns the solution x of \\f$ A x = b \\f$ using the current decomposition of A.\n      *\n      * \\sa compute()\n      */\n    template<typename Rhs>\n    inline const internal::sparse_solve_retval<UmfPackLU, Rhs> solve(const SparseMatrixBase<Rhs>& b) const\n    {\n      eigen_assert(m_isInitialized && \"UmfPackLU is not initialized.\");\n      eigen_assert(rows()==b.rows()\n                && \"UmfPackLU::solve(): invalid number of rows of the right hand side matrix b\");\n      return internal::sparse_solve_retval<UmfPackLU, Rhs>(*this, b.derived());\n    }\n\n    /** Performs a symbolic decomposition on the sparcity of \\a matrix.\n      *\n      * This function is particularly useful when solving for several problems having the same structure.\n      *\n      * \\sa factorize(), compute()\n      */\n    template<typename InputMatrixType>\n    void analyzePattern(const InputMatrixType& matrix)\n    {\n      if(m_symbolic) umfpack_free_symbolic(&m_symbolic,Scalar());\n      if(m_numeric)  umfpack_free_numeric(&m_numeric,Scalar());\n      \n      grapInput(matrix.derived());\n\n      analyzePattern_impl();\n    }\n\n    /** Performs a numeric decomposition of \\a matrix\n      *\n      * The given matrix must has the same sparcity than the matrix on which the pattern anylysis has been performed.\n      *\n      * \\sa analyzePattern(), compute()\n      */\n    template<typename InputMatrixType>\n    void factorize(const InputMatrixType& matrix)\n    {\n      eigen_assert(m_analysisIsOk && \"UmfPackLU: you must first call analyzePattern()\");\n      if(m_numeric)\n        umfpack_free_numeric(&m_numeric,Scalar());\n\n      grapInput(matrix.derived());\n      \n      factorize_impl();\n    }\n\n    #ifndef EIGEN_PARSED_BY_DOXYGEN\n    /** \\internal */\n    template<typename BDerived,typename XDerived>\n    bool _solve(const MatrixBase<BDerived> &b, MatrixBase<XDerived> &x) const;\n    #endif\n\n    Scalar determinant() const;\n\n    void extractData() const;\n\n  protected:\n\n    void init()\n    {\n      m_info                  = InvalidInput;\n      m_isInitialized         = false;\n      m_numeric               = 0;\n      m_symbolic              = 0;\n      m_outerIndexPtr         = 0;\n      m_innerIndexPtr         = 0;\n      m_valuePtr              = 0;\n      m_extractedDataAreDirty = true;\n    }\n    \n    template<typename InputMatrixType>\n    void grapInput_impl(const InputMatrixType& mat, internal::true_type)\n    {\n      m_copyMatrix.resize(mat.rows(), mat.cols());\n      if( ((MatrixType::Flags&RowMajorBit)==RowMajorBit) || sizeof(typename MatrixType::Index)!=sizeof(int) || !mat.isCompressed() )\n      {\n        // non supported input -> copy\n        m_copyMatrix = mat;\n        m_outerIndexPtr = m_copyMatrix.outerIndexPtr();\n        m_innerIndexPtr = m_copyMatrix.innerIndexPtr();\n        m_valuePtr      = m_copyMatrix.valuePtr();\n      }\n      else\n      {\n        m_outerIndexPtr = mat.outerIndexPtr();\n        m_innerIndexPtr = mat.innerIndexPtr();\n        m_valuePtr      = mat.valuePtr();\n      }\n    }\n    \n    template<typename InputMatrixType>\n    void grapInput_impl(const InputMatrixType& mat, internal::false_type)\n    {\n      m_copyMatrix = mat;\n      m_outerIndexPtr = m_copyMatrix.outerIndexPtr();\n      m_innerIndexPtr = m_copyMatrix.innerIndexPtr();\n      m_valuePtr      = m_copyMatrix.valuePtr();\n    }\n    \n    template<typename InputMatrixType>\n    void grapInput(const InputMatrixType& mat)\n    {\n      grapInput_impl(mat, internal::umfpack_helper_is_sparse_plain<InputMatrixType>());\n    }\n    \n    void analyzePattern_impl()\n    {\n      int errorCode = 0;\n      errorCode = umfpack_symbolic(m_copyMatrix.rows(), m_copyMatrix.cols(), m_outerIndexPtr, m_innerIndexPtr, m_valuePtr,\n                                   &m_symbolic, 0, 0);\n\n      m_isInitialized = true;\n      m_info = errorCode ? InvalidInput : Success;\n      m_analysisIsOk = true;\n      m_factorizationIsOk = false;\n      m_extractedDataAreDirty = true;\n    }\n    \n    void factorize_impl()\n    {\n      int errorCode;\n      errorCode = umfpack_numeric(m_outerIndexPtr, m_innerIndexPtr, m_valuePtr,\n                                  m_symbolic, &m_numeric, 0, 0);\n\n      m_info = errorCode ? NumericalIssue : Success;\n      m_factorizationIsOk = true;\n      m_extractedDataAreDirty = true;\n    }\n\n    // cached data to reduce reallocation, etc.\n    mutable LUMatrixType m_l;\n    mutable LUMatrixType m_u;\n    mutable IntColVectorType m_p;\n    mutable IntRowVectorType m_q;\n\n    UmfpackMatrixType m_copyMatrix;\n    const Scalar* m_valuePtr;\n    const int* m_outerIndexPtr;\n    const int* m_innerIndexPtr;\n    void* m_numeric;\n    void* m_symbolic;\n\n    mutable ComputationInfo m_info;\n    bool m_isInitialized;\n    int m_factorizationIsOk;\n    int m_analysisIsOk;\n    mutable bool m_extractedDataAreDirty;\n    \n  private:\n    UmfPackLU(UmfPackLU& ) { }\n};\n\n\ntemplate<typename MatrixType>\nvoid UmfPackLU<MatrixType>::extractData() const\n{\n  if (m_extractedDataAreDirty)\n  {\n    // get size of the data\n    int lnz, unz, rows, cols, nz_udiag;\n    umfpack_get_lunz(&lnz, &unz, &rows, &cols, &nz_udiag, m_numeric, Scalar());\n\n    // allocate data\n    m_l.resize(rows,(std::min)(rows,cols));\n    m_l.resizeNonZeros(lnz);\n\n    m_u.resize((std::min)(rows,cols),cols);\n    m_u.resizeNonZeros(unz);\n\n    m_p.resize(rows);\n    m_q.resize(cols);\n\n    // extract\n    umfpack_get_numeric(m_l.outerIndexPtr(), m_l.innerIndexPtr(), m_l.valuePtr(),\n                        m_u.outerIndexPtr(), m_u.innerIndexPtr(), m_u.valuePtr(),\n                        m_p.data(), m_q.data(), 0, 0, 0, m_numeric);\n\n    m_extractedDataAreDirty = false;\n  }\n}\n\ntemplate<typename MatrixType>\ntypename UmfPackLU<MatrixType>::Scalar UmfPackLU<MatrixType>::determinant() const\n{\n  Scalar det;\n  umfpack_get_determinant(&det, 0, m_numeric, 0);\n  return det;\n}\n\ntemplate<typename MatrixType>\ntemplate<typename BDerived,typename XDerived>\nbool UmfPackLU<MatrixType>::_solve(const MatrixBase<BDerived> &b, MatrixBase<XDerived> &x) const\n{\n  const int rhsCols = b.cols();\n  eigen_assert((BDerived::Flags&RowMajorBit)==0 && \"UmfPackLU backend does not support non col-major rhs yet\");\n  eigen_assert((XDerived::Flags&RowMajorBit)==0 && \"UmfPackLU backend does not support non col-major result yet\");\n  eigen_assert(b.derived().data() != x.derived().data() && \" Umfpack does not support inplace solve\");\n  \n  int errorCode;\n  for (int j=0; j<rhsCols; ++j)\n  {\n    errorCode = umfpack_solve(UMFPACK_A,\n        m_outerIndexPtr, m_innerIndexPtr, m_valuePtr,\n        &x.col(j).coeffRef(0), &b.const_cast_derived().col(j).coeffRef(0), m_numeric, 0, 0);\n    if (errorCode!=0)\n      return false;\n  }\n\n  return true;\n}\n\n\nnamespace internal {\n\ntemplate<typename _MatrixType, typename Rhs>\nstruct solve_retval<UmfPackLU<_MatrixType>, Rhs>\n  : solve_retval_base<UmfPackLU<_MatrixType>, Rhs>\n{\n  typedef UmfPackLU<_MatrixType> Dec;\n  EIGEN_MAKE_SOLVE_HELPERS(Dec,Rhs)\n\n  template<typename Dest> void evalTo(Dest& dst) const\n  {\n    dec()._solve(rhs(),dst);\n  }\n};\n\ntemplate<typename _MatrixType, typename Rhs>\nstruct sparse_solve_retval<UmfPackLU<_MatrixType>, Rhs>\n  : sparse_solve_retval_base<UmfPackLU<_MatrixType>, Rhs>\n{\n  typedef UmfPackLU<_MatrixType> Dec;\n  EIGEN_MAKE_SPARSE_SOLVE_HELPERS(Dec,Rhs)\n\n  template<typename Dest> void evalTo(Dest& dst) const\n  {\n    this->defaultEvalTo(dst);\n  }\n};\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_UMFPACKSUPPORT_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/misc/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_misc_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_misc_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/misc COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/Eigen/src/misc/Image.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_MISC_IMAGE_H\n#define EIGEN_MISC_IMAGE_H\n\nnamespace Eigen { \n\nnamespace internal {\n\n/** \\class image_retval_base\n  *\n  */\ntemplate<typename DecompositionType>\nstruct traits<image_retval_base<DecompositionType> >\n{\n  typedef typename DecompositionType::MatrixType MatrixType;\n  typedef Matrix<\n    typename MatrixType::Scalar,\n    MatrixType::RowsAtCompileTime, // the image is a subspace of the destination space, whose\n                                   // dimension is the number of rows of the original matrix\n    Dynamic,                       // we don't know at compile time the dimension of the image (the rank)\n    MatrixType::Options,\n    MatrixType::MaxRowsAtCompileTime, // the image matrix will consist of columns from the original matrix,\n    MatrixType::MaxColsAtCompileTime  // so it has the same number of rows and at most as many columns.\n  > ReturnType;\n};\n\ntemplate<typename _DecompositionType> struct image_retval_base\n : public ReturnByValue<image_retval_base<_DecompositionType> >\n{\n  typedef _DecompositionType DecompositionType;\n  typedef typename DecompositionType::MatrixType MatrixType;\n  typedef ReturnByValue<image_retval_base> Base;\n  typedef typename Base::Index Index;\n\n  image_retval_base(const DecompositionType& dec, const MatrixType& originalMatrix)\n    : m_dec(dec), m_rank(dec.rank()),\n      m_cols(m_rank == 0 ? 1 : m_rank),\n      m_originalMatrix(originalMatrix)\n  {}\n\n  inline Index rows() const { return m_dec.rows(); }\n  inline Index cols() const { return m_cols; }\n  inline Index rank() const { return m_rank; }\n  inline const DecompositionType& dec() const { return m_dec; }\n  inline const MatrixType& originalMatrix() const { return m_originalMatrix; }\n\n  template<typename Dest> inline void evalTo(Dest& dst) const\n  {\n    static_cast<const image_retval<DecompositionType>*>(this)->evalTo(dst);\n  }\n\n  protected:\n    const DecompositionType& m_dec;\n    Index m_rank, m_cols;\n    const MatrixType& m_originalMatrix;\n};\n\n} // end namespace internal\n\n#define EIGEN_MAKE_IMAGE_HELPERS(DecompositionType) \\\n  typedef typename DecompositionType::MatrixType MatrixType; \\\n  typedef typename MatrixType::Scalar Scalar; \\\n  typedef typename MatrixType::RealScalar RealScalar; \\\n  typedef typename MatrixType::Index Index; \\\n  typedef Eigen::internal::image_retval_base<DecompositionType> Base; \\\n  using Base::dec; \\\n  using Base::originalMatrix; \\\n  using Base::rank; \\\n  using Base::rows; \\\n  using Base::cols; \\\n  image_retval(const DecompositionType& dec, const MatrixType& originalMatrix) \\\n    : Base(dec, originalMatrix) {}\n\n} // end namespace Eigen\n\n#endif // EIGEN_MISC_IMAGE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/misc/Kernel.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_MISC_KERNEL_H\n#define EIGEN_MISC_KERNEL_H\n\nnamespace Eigen { \n\nnamespace internal {\n\n/** \\class kernel_retval_base\n  *\n  */\ntemplate<typename DecompositionType>\nstruct traits<kernel_retval_base<DecompositionType> >\n{\n  typedef typename DecompositionType::MatrixType MatrixType;\n  typedef Matrix<\n    typename MatrixType::Scalar,\n    MatrixType::ColsAtCompileTime, // the number of rows in the \"kernel matrix\"\n                                   // is the number of cols of the original matrix\n                                   // so that the product \"matrix * kernel = zero\" makes sense\n    Dynamic,                       // we don't know at compile-time the dimension of the kernel\n    MatrixType::Options,\n    MatrixType::MaxColsAtCompileTime, // see explanation for 2nd template parameter\n    MatrixType::MaxColsAtCompileTime // the kernel is a subspace of the domain space,\n                                     // whose dimension is the number of columns of the original matrix\n  > ReturnType;\n};\n\ntemplate<typename _DecompositionType> struct kernel_retval_base\n : public ReturnByValue<kernel_retval_base<_DecompositionType> >\n{\n  typedef _DecompositionType DecompositionType;\n  typedef ReturnByValue<kernel_retval_base> Base;\n  typedef typename Base::Index Index;\n\n  kernel_retval_base(const DecompositionType& dec)\n    : m_dec(dec),\n      m_rank(dec.rank()),\n      m_cols(m_rank==dec.cols() ? 1 : dec.cols() - m_rank)\n  {}\n\n  inline Index rows() const { return m_dec.cols(); }\n  inline Index cols() const { return m_cols; }\n  inline Index rank() const { return m_rank; }\n  inline const DecompositionType& dec() const { return m_dec; }\n\n  template<typename Dest> inline void evalTo(Dest& dst) const\n  {\n    static_cast<const kernel_retval<DecompositionType>*>(this)->evalTo(dst);\n  }\n\n  protected:\n    const DecompositionType& m_dec;\n    Index m_rank, m_cols;\n};\n\n} // end namespace internal\n\n#define EIGEN_MAKE_KERNEL_HELPERS(DecompositionType) \\\n  typedef typename DecompositionType::MatrixType MatrixType; \\\n  typedef typename MatrixType::Scalar Scalar; \\\n  typedef typename MatrixType::RealScalar RealScalar; \\\n  typedef typename MatrixType::Index Index; \\\n  typedef Eigen::internal::kernel_retval_base<DecompositionType> Base; \\\n  using Base::dec; \\\n  using Base::rank; \\\n  using Base::rows; \\\n  using Base::cols; \\\n  kernel_retval(const DecompositionType& dec) : Base(dec) {}\n\n} // end namespace Eigen\n\n#endif // EIGEN_MISC_KERNEL_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/misc/Solve.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_MISC_SOLVE_H\n#define EIGEN_MISC_SOLVE_H\n\nnamespace Eigen { \n\nnamespace internal {\n\n/** \\class solve_retval_base\n  *\n  */\ntemplate<typename DecompositionType, typename Rhs>\nstruct traits<solve_retval_base<DecompositionType, Rhs> >\n{\n  typedef typename DecompositionType::MatrixType MatrixType;\n  typedef Matrix<typename Rhs::Scalar,\n                 MatrixType::ColsAtCompileTime,\n                 Rhs::ColsAtCompileTime,\n                 Rhs::PlainObject::Options,\n                 MatrixType::MaxColsAtCompileTime,\n                 Rhs::MaxColsAtCompileTime> ReturnType;\n};\n\ntemplate<typename _DecompositionType, typename Rhs> struct solve_retval_base\n : public ReturnByValue<solve_retval_base<_DecompositionType, Rhs> >\n{\n  typedef typename remove_all<typename Rhs::Nested>::type RhsNestedCleaned;\n  typedef _DecompositionType DecompositionType;\n  typedef ReturnByValue<solve_retval_base> Base;\n  typedef typename Base::Index Index;\n\n  solve_retval_base(const DecompositionType& dec, const Rhs& rhs)\n    : m_dec(dec), m_rhs(rhs)\n  {}\n\n  inline Index rows() const { return m_dec.cols(); }\n  inline Index cols() const { return m_rhs.cols(); }\n  inline const DecompositionType& dec() const { return m_dec; }\n  inline const RhsNestedCleaned& rhs() const { return m_rhs; }\n\n  template<typename Dest> inline void evalTo(Dest& dst) const\n  {\n    static_cast<const solve_retval<DecompositionType,Rhs>*>(this)->evalTo(dst);\n  }\n\n  protected:\n    const DecompositionType& m_dec;\n    typename Rhs::Nested m_rhs;\n};\n\n} // end namespace internal\n\n#define EIGEN_MAKE_SOLVE_HELPERS(DecompositionType,Rhs) \\\n  typedef typename DecompositionType::MatrixType MatrixType; \\\n  typedef typename MatrixType::Scalar Scalar; \\\n  typedef typename MatrixType::RealScalar RealScalar; \\\n  typedef typename MatrixType::Index Index; \\\n  typedef Eigen::internal::solve_retval_base<DecompositionType,Rhs> Base; \\\n  using Base::dec; \\\n  using Base::rhs; \\\n  using Base::rows; \\\n  using Base::cols; \\\n  solve_retval(const DecompositionType& dec, const Rhs& rhs) \\\n    : Base(dec, rhs) {}\n\n} // end namespace Eigen\n\n#endif // EIGEN_MISC_SOLVE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/misc/SparseSolve.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SPARSE_SOLVE_H\n#define EIGEN_SPARSE_SOLVE_H\n\nnamespace Eigen { \n\nnamespace internal {\n\ntemplate<typename _DecompositionType, typename Rhs> struct sparse_solve_retval_base;\ntemplate<typename _DecompositionType, typename Rhs> struct sparse_solve_retval;\n  \ntemplate<typename DecompositionType, typename Rhs>\nstruct traits<sparse_solve_retval_base<DecompositionType, Rhs> >\n{\n  typedef typename DecompositionType::MatrixType MatrixType;\n  typedef SparseMatrix<typename Rhs::Scalar, Rhs::Options, typename Rhs::Index> ReturnType;\n};\n\ntemplate<typename _DecompositionType, typename Rhs> struct sparse_solve_retval_base\n : public ReturnByValue<sparse_solve_retval_base<_DecompositionType, Rhs> >\n{\n  typedef typename remove_all<typename Rhs::Nested>::type RhsNestedCleaned;\n  typedef _DecompositionType DecompositionType;\n  typedef ReturnByValue<sparse_solve_retval_base> Base;\n  typedef typename Base::Index Index;\n\n  sparse_solve_retval_base(const DecompositionType& dec, const Rhs& rhs)\n    : m_dec(dec), m_rhs(rhs)\n  {}\n\n  inline Index rows() const { return m_dec.cols(); }\n  inline Index cols() const { return m_rhs.cols(); }\n  inline const DecompositionType& dec() const { return m_dec; }\n  inline const RhsNestedCleaned& rhs() const { return m_rhs; }\n\n  template<typename Dest> inline void evalTo(Dest& dst) const\n  {\n    static_cast<const sparse_solve_retval<DecompositionType,Rhs>*>(this)->evalTo(dst);\n  }\n\n  protected:\n    template<typename DestScalar, int DestOptions, typename DestIndex>\n    inline void defaultEvalTo(SparseMatrix<DestScalar,DestOptions,DestIndex>& dst) const\n    {\n      // we process the sparse rhs per block of NbColsAtOnce columns temporarily stored into a dense matrix.\n      static const int NbColsAtOnce = 4;\n      int rhsCols = m_rhs.cols();\n      int size = m_rhs.rows();\n      Eigen::Matrix<DestScalar,Dynamic,Dynamic> tmp(size,rhsCols);\n      Eigen::Matrix<DestScalar,Dynamic,Dynamic> tmpX(size,rhsCols);\n      for(int k=0; k<rhsCols; k+=NbColsAtOnce)\n      {\n        int actualCols = std::min<int>(rhsCols-k, NbColsAtOnce);\n        tmp.leftCols(actualCols) = m_rhs.middleCols(k,actualCols);\n        tmpX.leftCols(actualCols) = m_dec.solve(tmp.leftCols(actualCols));\n        dst.middleCols(k,actualCols) = tmpX.leftCols(actualCols).sparseView();\n      }\n    }\n    const DecompositionType& m_dec;\n    typename Rhs::Nested m_rhs;\n};\n\n#define EIGEN_MAKE_SPARSE_SOLVE_HELPERS(DecompositionType,Rhs) \\\n  typedef typename DecompositionType::MatrixType MatrixType; \\\n  typedef typename MatrixType::Scalar Scalar; \\\n  typedef typename MatrixType::RealScalar RealScalar; \\\n  typedef typename MatrixType::Index Index; \\\n  typedef Eigen::internal::sparse_solve_retval_base<DecompositionType,Rhs> Base; \\\n  using Base::dec; \\\n  using Base::rhs; \\\n  using Base::rows; \\\n  using Base::cols; \\\n  sparse_solve_retval(const DecompositionType& dec, const Rhs& rhs) \\\n    : Base(dec, rhs) {}\n\n\n\ntemplate<typename DecompositionType, typename Rhs, typename Guess> struct solve_retval_with_guess;\n\ntemplate<typename DecompositionType, typename Rhs, typename Guess>\nstruct traits<solve_retval_with_guess<DecompositionType, Rhs, Guess> >\n{\n  typedef typename DecompositionType::MatrixType MatrixType;\n  typedef Matrix<typename Rhs::Scalar,\n                 MatrixType::ColsAtCompileTime,\n                 Rhs::ColsAtCompileTime,\n                 Rhs::PlainObject::Options,\n                 MatrixType::MaxColsAtCompileTime,\n                 Rhs::MaxColsAtCompileTime> ReturnType;\n};\n\ntemplate<typename DecompositionType, typename Rhs, typename Guess> struct solve_retval_with_guess\n : public ReturnByValue<solve_retval_with_guess<DecompositionType, Rhs, Guess> >\n{\n  typedef typename DecompositionType::Index Index;\n\n  solve_retval_with_guess(const DecompositionType& dec, const Rhs& rhs, const Guess& guess)\n    : m_dec(dec), m_rhs(rhs), m_guess(guess)\n  {}\n\n  inline Index rows() const { return m_dec.cols(); }\n  inline Index cols() const { return m_rhs.cols(); }\n\n  template<typename Dest> inline void evalTo(Dest& dst) const\n  {\n    dst = m_guess;\n    m_dec._solveWithGuess(m_rhs,dst);\n  }\n\n  protected:\n    const DecompositionType& m_dec;\n    const typename Rhs::Nested m_rhs;\n    const typename Guess::Nested m_guess;\n};\n\n} // namepsace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_SPARSE_SOLVE_H\n"
  },
  {
    "path": "libs/eigen/Eigen/src/misc/blas.h",
    "content": "#ifndef BLAS_H\n#define BLAS_H\n\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n\n#define BLASFUNC(FUNC) FUNC##_\n\n#ifdef __WIN64__\ntypedef long long BLASLONG;\ntypedef unsigned long long BLASULONG;\n#else\ntypedef long BLASLONG;\ntypedef unsigned long BLASULONG;\n#endif\n\nint    BLASFUNC(xerbla)(const char *, int *info, int);\n\nfloat  BLASFUNC(sdot)  (int *, float  *, int *, float  *, int *);\nfloat  BLASFUNC(sdsdot)(int *, float  *,        float  *, int *, float  *, int *);\n\ndouble BLASFUNC(dsdot) (int *, float  *, int *, float  *, int *);\ndouble BLASFUNC(ddot)  (int *, double *, int *, double *, int *);\ndouble BLASFUNC(qdot)  (int *, double *, int *, double *, int *);\n\nint  BLASFUNC(cdotuw)  (int *, float  *, int *, float  *, int *, float*);\nint  BLASFUNC(cdotcw)  (int *, float  *, int *, float  *, int *, float*);\nint  BLASFUNC(zdotuw)  (int *, double  *, int *, double  *, int *, double*);\nint  BLASFUNC(zdotcw)  (int *, double  *, int *, double  *, int *, double*);\n\nint    BLASFUNC(saxpy) (int *, float  *, float  *, int *, float  *, int *);\nint    BLASFUNC(daxpy) (int *, double *, double *, int *, double *, int *);\nint    BLASFUNC(qaxpy) (int *, double *, double *, int *, double *, int *);\nint    BLASFUNC(caxpy) (int *, float  *, float  *, int *, float  *, int *);\nint    BLASFUNC(zaxpy) (int *, double *, double *, int *, double *, int *);\nint    BLASFUNC(xaxpy) (int *, double *, double *, int *, double *, int *);\nint    BLASFUNC(caxpyc)(int *, float  *, float  *, int *, float  *, int *);\nint    BLASFUNC(zaxpyc)(int *, double *, double *, int *, double *, int *);\nint    BLASFUNC(xaxpyc)(int *, double *, double *, int *, double *, int *);\n\nint    BLASFUNC(scopy) (int *, float  *, int *, float  *, int *);\nint    BLASFUNC(dcopy) (int *, double *, int *, double *, int *);\nint    BLASFUNC(qcopy) (int *, double *, int *, double *, int *);\nint    BLASFUNC(ccopy) (int *, float  *, int *, float  *, int *);\nint    BLASFUNC(zcopy) (int *, double *, int *, double *, int *);\nint    BLASFUNC(xcopy) (int *, double *, int *, double *, int *);\n\nint    BLASFUNC(sswap) (int *, float  *, int *, float  *, int *);\nint    BLASFUNC(dswap) (int *, double *, int *, double *, int *);\nint    BLASFUNC(qswap) (int *, double *, int *, double *, int *);\nint    BLASFUNC(cswap) (int *, float  *, int *, float  *, int *);\nint    BLASFUNC(zswap) (int *, double *, int *, double *, int *);\nint    BLASFUNC(xswap) (int *, double *, int *, double *, int *);\n\nfloat  BLASFUNC(sasum) (int *, float  *, int *);\nfloat  BLASFUNC(scasum)(int *, float  *, int *);\ndouble BLASFUNC(dasum) (int *, double *, int *);\ndouble BLASFUNC(qasum) (int *, double *, int *);\ndouble BLASFUNC(dzasum)(int *, double *, int *);\ndouble BLASFUNC(qxasum)(int *, double *, int *);\n\nint    BLASFUNC(isamax)(int *, float  *, int *);\nint    BLASFUNC(idamax)(int *, double *, int *);\nint    BLASFUNC(iqamax)(int *, double *, int *);\nint    BLASFUNC(icamax)(int *, float  *, int *);\nint    BLASFUNC(izamax)(int *, double *, int *);\nint    BLASFUNC(ixamax)(int *, double *, int *);\n\nint    BLASFUNC(ismax) (int *, float  *, int *);\nint    BLASFUNC(idmax) (int *, double *, int *);\nint    BLASFUNC(iqmax) (int *, double *, int *);\nint    BLASFUNC(icmax) (int *, float  *, int *);\nint    BLASFUNC(izmax) (int *, double *, int *);\nint    BLASFUNC(ixmax) (int *, double *, int *);\n\nint    BLASFUNC(isamin)(int *, float  *, int *);\nint    BLASFUNC(idamin)(int *, double *, int *);\nint    BLASFUNC(iqamin)(int *, double *, int *);\nint    BLASFUNC(icamin)(int *, float  *, int *);\nint    BLASFUNC(izamin)(int *, double *, int *);\nint    BLASFUNC(ixamin)(int *, double *, int *);\n\nint    BLASFUNC(ismin)(int *, float  *, int *);\nint    BLASFUNC(idmin)(int *, double *, int *);\nint    BLASFUNC(iqmin)(int *, double *, int *);\nint    BLASFUNC(icmin)(int *, float  *, int *);\nint    BLASFUNC(izmin)(int *, double *, int *);\nint    BLASFUNC(ixmin)(int *, double *, int *);\n\nfloat  BLASFUNC(samax) (int *, float  *, int *);\ndouble BLASFUNC(damax) (int *, double *, int *);\ndouble BLASFUNC(qamax) (int *, double *, int *);\nfloat  BLASFUNC(scamax)(int *, float  *, int *);\ndouble BLASFUNC(dzamax)(int *, double *, int *);\ndouble BLASFUNC(qxamax)(int *, double *, int *);\n\nfloat  BLASFUNC(samin) (int *, float  *, int *);\ndouble BLASFUNC(damin) (int *, double *, int *);\ndouble BLASFUNC(qamin) (int *, double *, int *);\nfloat  BLASFUNC(scamin)(int *, float  *, int *);\ndouble BLASFUNC(dzamin)(int *, double *, int *);\ndouble BLASFUNC(qxamin)(int *, double *, int *);\n\nfloat  BLASFUNC(smax)  (int *, float  *, int *);\ndouble BLASFUNC(dmax)  (int *, double *, int *);\ndouble BLASFUNC(qmax)  (int *, double *, int *);\nfloat  BLASFUNC(scmax) (int *, float  *, int *);\ndouble BLASFUNC(dzmax) (int *, double *, int *);\ndouble BLASFUNC(qxmax) (int *, double *, int *);\n\nfloat  BLASFUNC(smin)  (int *, float  *, int *);\ndouble BLASFUNC(dmin)  (int *, double *, int *);\ndouble BLASFUNC(qmin)  (int *, double *, int *);\nfloat  BLASFUNC(scmin) (int *, float  *, int *);\ndouble BLASFUNC(dzmin) (int *, double *, int *);\ndouble BLASFUNC(qxmin) (int *, double *, int *);\n\nint    BLASFUNC(sscal) (int *,  float  *, float  *, int *);\nint    BLASFUNC(dscal) (int *,  double *, double *, int *);\nint    BLASFUNC(qscal) (int *,  double *, double *, int *);\nint    BLASFUNC(cscal) (int *,  float  *, float  *, int *);\nint    BLASFUNC(zscal) (int *,  double *, double *, int *);\nint    BLASFUNC(xscal) (int *,  double *, double *, int *);\nint    BLASFUNC(csscal)(int *,  float  *, float  *, int *);\nint    BLASFUNC(zdscal)(int *,  double *, double *, int *);\nint    BLASFUNC(xqscal)(int *,  double *, double *, int *);\n\nfloat  BLASFUNC(snrm2) (int *, float  *, int *);\nfloat  BLASFUNC(scnrm2)(int *, float  *, int *);\n\ndouble BLASFUNC(dnrm2) (int *, double *, int *);\ndouble BLASFUNC(qnrm2) (int *, double *, int *);\ndouble BLASFUNC(dznrm2)(int *, double *, int *);\ndouble BLASFUNC(qxnrm2)(int *, double *, int *);\n\nint    BLASFUNC(srot)  (int *, float  *, int *, float  *, int *, float  *, float  *);\nint    BLASFUNC(drot)  (int *, double *, int *, double *, int *, double *, double *);\nint    BLASFUNC(qrot)  (int *, double *, int *, double *, int *, double *, double *);\nint    BLASFUNC(csrot) (int *, float  *, int *, float  *, int *, float  *, float  *);\nint    BLASFUNC(zdrot) (int *, double *, int *, double *, int *, double *, double *);\nint    BLASFUNC(xqrot) (int *, double *, int *, double *, int *, double *, double *);\n\nint    BLASFUNC(srotg) (float  *, float  *, float  *, float  *);\nint    BLASFUNC(drotg) (double *, double *, double *, double *);\nint    BLASFUNC(qrotg) (double *, double *, double *, double *);\nint    BLASFUNC(crotg) (float  *, float  *, float  *, float  *);\nint    BLASFUNC(zrotg) (double *, double *, double *, double *);\nint    BLASFUNC(xrotg) (double *, double *, double *, double *);\n\nint    BLASFUNC(srotmg)(float  *, float  *, float  *, float  *, float  *);\nint    BLASFUNC(drotmg)(double *, double *, double *, double *, double *);\n\nint    BLASFUNC(srotm) (int *, float  *, int *, float  *, int *, float  *);\nint    BLASFUNC(drotm) (int *, double *, int *, double *, int *, double *);\nint    BLASFUNC(qrotm) (int *, double *, int *, double *, int *, double *);\n\n/* Level 2 routines */\n\nint BLASFUNC(sger)(int *,    int *, float *,  float *, int *,\n\t\t   float *,  int *, float *,  int *);\nint BLASFUNC(dger)(int *,    int *, double *, double *, int *,\n\t\t   double *, int *, double *, int *);\nint BLASFUNC(qger)(int *,    int *, double *, double *, int *,\n\t\t   double *, int *, double *, int *);\nint BLASFUNC(cgeru)(int *,    int *, float *,  float *, int *,\n\t\t    float *,  int *, float *,  int *);\nint BLASFUNC(cgerc)(int *,    int *, float *,  float *, int *,\n\t\t    float *,  int *, float *,  int *);\nint BLASFUNC(zgeru)(int *,    int *, double *, double *, int *,\n\t\t    double *, int *, double *, int *);\nint BLASFUNC(zgerc)(int *,    int *, double *, double *, int *,\n\t\t    double *, int *, double *, int *);\nint BLASFUNC(xgeru)(int *,    int *, double *, double *, int *,\n\t\t    double *, int *, double *, int *);\nint BLASFUNC(xgerc)(int *,    int *, double *, double *, int *,\n\t\t    double *, int *, double *, int *);\n\nint BLASFUNC(sgemv)(char *, int *, int *, float  *, float  *, int *,\n\t\t    float  *, int *, float  *, float  *, int *);\nint BLASFUNC(dgemv)(char *, int *, int *, double *, double *, int *,\n\t\t    double *, int *, double *, double *, int *);\nint BLASFUNC(qgemv)(char *, int *, int *, double *, double *, int *,\n\t\t    double *, int *, double *, double *, int *);\nint BLASFUNC(cgemv)(char *, int *, int *, float  *, float  *, int *,\n\t\t    float  *, int *, float  *, float  *, int *);\nint BLASFUNC(zgemv)(char *, int *, int *, double *, double *, int *,\n\t\t    double *, int *, double *, double *, int *);\nint BLASFUNC(xgemv)(char *, int *, int *, double *, double *, int *,\n\t\t    double *, int *, double *, double *, int *);\n\nint BLASFUNC(strsv) (char *, char *, char *, int *, float  *, int *,\n\t\t     float  *, int *);\nint BLASFUNC(dtrsv) (char *, char *, char *, int *, double *, int *,\n\t\t     double *, int *);\nint BLASFUNC(qtrsv) (char *, char *, char *, int *, double *, int *,\n\t\t     double *, int *);\nint BLASFUNC(ctrsv) (char *, char *, char *, int *, float  *, int *,\n\t\t     float  *, int *);\nint BLASFUNC(ztrsv) (char *, char *, char *, int *, double *, int *,\n\t\t     double *, int *);\nint BLASFUNC(xtrsv) (char *, char *, char *, int *, double *, int *,\n\t\t     double *, int *);\n\nint BLASFUNC(stpsv) (char *, char *, char *, int *, float  *, float  *, int *);\nint BLASFUNC(dtpsv) (char *, char *, char *, int *, double *, double *, int *);\nint BLASFUNC(qtpsv) (char *, char *, char *, int *, double *, double *, int *);\nint BLASFUNC(ctpsv) (char *, char *, char *, int *, float  *, float  *, int *);\nint BLASFUNC(ztpsv) (char *, char *, char *, int *, double *, double *, int *);\nint BLASFUNC(xtpsv) (char *, char *, char *, int *, double *, double *, int *);\n\nint BLASFUNC(strmv) (char *, char *, char *, int *, float  *, int *,\n\t\t     float  *, int *);\nint BLASFUNC(dtrmv) (char *, char *, char *, int *, double *, int *,\n\t\t     double *, int *);\nint BLASFUNC(qtrmv) (char *, char *, char *, int *, double *, int *,\n\t\t     double *, int *);\nint BLASFUNC(ctrmv) (char *, char *, char *, int *, float  *, int *,\n\t\t     float  *, int *);\nint BLASFUNC(ztrmv) (char *, char *, char *, int *, double *, int *,\n\t\t     double *, int *);\nint BLASFUNC(xtrmv) (char *, char *, char *, int *, double *, int *,\n\t\t     double *, int *);\n\nint BLASFUNC(stpmv) (char *, char *, char *, int *, float  *, float  *, int *);\nint BLASFUNC(dtpmv) (char *, char *, char *, int *, double *, double *, int *);\nint BLASFUNC(qtpmv) (char *, char *, char *, int *, double *, double *, int *);\nint BLASFUNC(ctpmv) (char *, char *, char *, int *, float  *, float  *, int *);\nint BLASFUNC(ztpmv) (char *, char *, char *, int *, double *, double *, int *);\nint BLASFUNC(xtpmv) (char *, char *, char *, int *, double *, double *, int *);\n\nint BLASFUNC(stbmv) (char *, char *, char *, int *, int *, float  *, int *, float  *, int *);\nint BLASFUNC(dtbmv) (char *, char *, char *, int *, int *, double *, int *, double *, int *);\nint BLASFUNC(qtbmv) (char *, char *, char *, int *, int *, double *, int *, double *, int *);\nint BLASFUNC(ctbmv) (char *, char *, char *, int *, int *, float  *, int *, float  *, int *);\nint BLASFUNC(ztbmv) (char *, char *, char *, int *, int *, double *, int *, double *, int *);\nint BLASFUNC(xtbmv) (char *, char *, char *, int *, int *, double *, int *, double *, int *);\n\nint BLASFUNC(stbsv) (char *, char *, char *, int *, int *, float  *, int *, float  *, int *);\nint BLASFUNC(dtbsv) (char *, char *, char *, int *, int *, double *, int *, double *, int *);\nint BLASFUNC(qtbsv) (char *, char *, char *, int *, int *, double *, int *, double *, int *);\nint BLASFUNC(ctbsv) (char *, char *, char *, int *, int *, float  *, int *, float  *, int *);\nint BLASFUNC(ztbsv) (char *, char *, char *, int *, int *, double *, int *, double *, int *);\nint BLASFUNC(xtbsv) (char *, char *, char *, int *, int *, double *, int *, double *, int *);\n\nint BLASFUNC(ssymv) (char *, int *, float  *, float *, int *,\n\t\t     float  *, int *, float *, float *, int *);\nint BLASFUNC(dsymv) (char *, int *, double  *, double *, int *,\n\t\t     double  *, int *, double *, double *, int *);\nint BLASFUNC(qsymv) (char *, int *, double  *, double *, int *,\n\t\t     double  *, int *, double *, double *, int *);\nint BLASFUNC(csymv) (char *, int *, float  *, float *, int *,\n\t\t     float  *, int *, float *, float *, int *);\nint BLASFUNC(zsymv) (char *, int *, double  *, double *, int *,\n\t\t     double  *, int *, double *, double *, int *);\nint BLASFUNC(xsymv) (char *, int *, double  *, double *, int *,\n\t\t     double  *, int *, double *, double *, int *);\n\nint BLASFUNC(sspmv) (char *, int *, float  *, float *,\n\t\t     float  *, int *, float *, float *, int *);\nint BLASFUNC(dspmv) (char *, int *, double  *, double *,\n\t\t     double  *, int *, double *, double *, int *);\nint BLASFUNC(qspmv) (char *, int *, double  *, double *,\n\t\t     double  *, int *, double *, double *, int *);\nint BLASFUNC(cspmv) (char *, int *, float  *, float *,\n\t\t     float  *, int *, float *, float *, int *);\nint BLASFUNC(zspmv) (char *, int *, double  *, double *,\n\t\t     double  *, int *, double *, double *, int *);\nint BLASFUNC(xspmv) (char *, int *, double  *, double *,\n\t\t     double  *, int *, double *, double *, int *);\n\nint BLASFUNC(ssyr) (char *, int *, float   *, float  *, int *,\n\t\t    float  *, int *);\nint BLASFUNC(dsyr) (char *, int *, double  *, double *, int *,\n\t\t    double *, int *);\nint BLASFUNC(qsyr) (char *, int *, double  *, double *, int *,\n\t\t    double *, int *);\nint BLASFUNC(csyr) (char *, int *, float   *, float  *, int *,\n\t\t    float  *, int *);\nint BLASFUNC(zsyr) (char *, int *, double  *, double *, int *,\n\t\t    double *, int *);\nint BLASFUNC(xsyr) (char *, int *, double  *, double *, int *,\n\t\t    double *, int *);\n\nint BLASFUNC(ssyr2) (char *, int *, float   *,\n\t\t     float  *, int *, float  *, int *, float  *, int *);\nint BLASFUNC(dsyr2) (char *, int *, double  *,\n\t\t     double *, int *, double *, int *, double *, int *);\nint BLASFUNC(qsyr2) (char *, int *, double  *,\n\t\t     double *, int *, double *, int *, double *, int *);\nint BLASFUNC(csyr2) (char *, int *, float   *,\n\t\t     float  *, int *, float  *, int *, float  *, int *);\nint BLASFUNC(zsyr2) (char *, int *, double  *,\n\t\t     double *, int *, double *, int *, double *, int *);\nint BLASFUNC(xsyr2) (char *, int *, double  *,\n\t\t     double *, int *, double *, int *, double *, int *);\n\nint BLASFUNC(sspr) (char *, int *, float   *, float  *, int *,\n\t\t    float  *);\nint BLASFUNC(dspr) (char *, int *, double  *, double *, int *,\n\t\t    double *);\nint BLASFUNC(qspr) (char *, int *, double  *, double *, int *,\n\t\t    double *);\nint BLASFUNC(cspr) (char *, int *, float   *, float  *, int *,\n\t\t    float  *);\nint BLASFUNC(zspr) (char *, int *, double  *, double *, int *,\n\t\t    double *);\nint BLASFUNC(xspr) (char *, int *, double  *, double *, int *,\n\t\t    double *);\n\nint BLASFUNC(sspr2) (char *, int *, float   *,\n\t\t     float  *, int *, float  *, int *, float  *);\nint BLASFUNC(dspr2) (char *, int *, double  *,\n\t\t     double *, int *, double *, int *, double *);\nint BLASFUNC(qspr2) (char *, int *, double  *,\n\t\t     double *, int *, double *, int *, double *);\nint BLASFUNC(cspr2) (char *, int *, float   *,\n\t\t     float  *, int *, float  *, int *, float  *);\nint BLASFUNC(zspr2) (char *, int *, double  *,\n\t\t     double *, int *, double *, int *, double *);\nint BLASFUNC(xspr2) (char *, int *, double  *,\n\t\t     double *, int *, double *, int *, double *);\n\nint BLASFUNC(cher) (char *, int *, float   *, float  *, int *,\n\t\t    float  *, int *);\nint BLASFUNC(zher) (char *, int *, double  *, double *, int *,\n\t\t    double *, int *);\nint BLASFUNC(xher) (char *, int *, double  *, double *, int *,\n\t\t    double *, int *);\n\nint BLASFUNC(chpr) (char *, int *, float   *, float  *, int *, float  *);\nint BLASFUNC(zhpr) (char *, int *, double  *, double *, int *, double *);\nint BLASFUNC(xhpr) (char *, int *, double  *, double *, int *, double *);\n\nint BLASFUNC(cher2) (char *, int *, float   *,\n\t\t     float  *, int *, float  *, int *, float  *, int *);\nint BLASFUNC(zher2) (char *, int *, double  *,\n\t\t     double *, int *, double *, int *, double *, int *);\nint BLASFUNC(xher2) (char *, int *, double  *,\n\t\t     double *, int *, double *, int *, double *, int *);\n\nint BLASFUNC(chpr2) (char *, int *, float   *,\n\t\t     float  *, int *, float  *, int *, float  *);\nint BLASFUNC(zhpr2) (char *, int *, double  *,\n\t\t     double *, int *, double *, int *, double *);\nint BLASFUNC(xhpr2) (char *, int *, double  *,\n\t\t     double *, int *, double *, int *, double *);\n\nint BLASFUNC(chemv) (char *, int *, float  *, float *, int *,\n\t\t     float  *, int *, float *, float *, int *);\nint BLASFUNC(zhemv) (char *, int *, double  *, double *, int *,\n\t\t     double  *, int *, double *, double *, int *);\nint BLASFUNC(xhemv) (char *, int *, double  *, double *, int *,\n\t\t     double  *, int *, double *, double *, int *);\n\nint BLASFUNC(chpmv) (char *, int *, float  *, float *,\n\t\t     float  *, int *, float *, float *, int *);\nint BLASFUNC(zhpmv) (char *, int *, double  *, double *,\n\t\t     double  *, int *, double *, double *, int *);\nint BLASFUNC(xhpmv) (char *, int *, double  *, double *,\n\t\t     double  *, int *, double *, double *, int *);\n\nint BLASFUNC(snorm)(char *, int *, int *, float  *, int *);\nint BLASFUNC(dnorm)(char *, int *, int *, double *, int *);\nint BLASFUNC(cnorm)(char *, int *, int *, float  *, int *);\nint BLASFUNC(znorm)(char *, int *, int *, double *, int *);\n\nint BLASFUNC(sgbmv)(char *, int *, int *, int *, int *, float  *, float  *, int *,\n\t\t    float  *, int *, float  *, float  *, int *);\nint BLASFUNC(dgbmv)(char *, int *, int *, int *, int *, double *, double *, int *,\n\t\t    double *, int *, double *, double *, int *);\nint BLASFUNC(qgbmv)(char *, int *, int *, int *, int *, double *, double *, int *,\n\t\t    double *, int *, double *, double *, int *);\nint BLASFUNC(cgbmv)(char *, int *, int *, int *, int *, float  *, float  *, int *,\n\t\t    float  *, int *, float  *, float  *, int *);\nint BLASFUNC(zgbmv)(char *, int *, int *, int *, int *, double *, double *, int *,\n\t\t    double *, int *, double *, double *, int *);\nint BLASFUNC(xgbmv)(char *, int *, int *, int *, int *, double *, double *, int *,\n\t\t    double *, int *, double *, double *, int *);\n\nint BLASFUNC(ssbmv)(char *, int *, int *, float  *, float  *, int *,\n\t\t    float  *, int *, float  *, float  *, int *);\nint BLASFUNC(dsbmv)(char *, int *, int *, double *, double *, int *,\n\t\t    double *, int *, double *, double *, int *);\nint BLASFUNC(qsbmv)(char *, int *, int *, double *, double *, int *,\n\t\t    double *, int *, double *, double *, int *);\nint BLASFUNC(csbmv)(char *, int *, int *, float  *, float  *, int *,\n\t\t    float  *, int *, float  *, float  *, int *);\nint BLASFUNC(zsbmv)(char *, int *, int *, double *, double *, int *,\n\t\t    double *, int *, double *, double *, int *);\nint BLASFUNC(xsbmv)(char *, int *, int *, double *, double *, int *,\n\t\t    double *, int *, double *, double *, int *);\n\nint BLASFUNC(chbmv)(char *, int *, int *, float  *, float  *, int *,\n\t\t    float  *, int *, float  *, float  *, int *);\nint BLASFUNC(zhbmv)(char *, int *, int *, double *, double *, int *,\n\t\t    double *, int *, double *, double *, int *);\nint BLASFUNC(xhbmv)(char *, int *, int *, double *, double *, int *,\n\t\t    double *, int *, double *, double *, int *);\n\n/* Level 3 routines */\n\nint BLASFUNC(sgemm)(char *, char *, int *, int *, int *, float *,\n\t   float  *, int *, float  *, int *, float  *, float  *, int *);\nint BLASFUNC(dgemm)(char *, char *, int *, int *, int *, double *,\n\t   double *, int *, double *, int *, double *, double *, int *);\nint BLASFUNC(qgemm)(char *, char *, int *, int *, int *, double *,\n\t   double *, int *, double *, int *, double *, double *, int *);\nint BLASFUNC(cgemm)(char *, char *, int *, int *, int *, float *,\n\t   float  *, int *, float  *, int *, float  *, float  *, int *);\nint BLASFUNC(zgemm)(char *, char *, int *, int *, int *, double *,\n\t   double *, int *, double *, int *, double *, double *, int *);\nint BLASFUNC(xgemm)(char *, char *, int *, int *, int *, double *,\n\t   double *, int *, double *, int *, double *, double *, int *);\n\nint BLASFUNC(cgemm3m)(char *, char *, int *, int *, int *, float *,\n\t   float  *, int *, float  *, int *, float  *, float  *, int *);\nint BLASFUNC(zgemm3m)(char *, char *, int *, int *, int *, double *,\n\t   double *, int *, double *, int *, double *, double *, int *);\nint BLASFUNC(xgemm3m)(char *, char *, int *, int *, int *, double *,\n\t   double *, int *, double *, int *, double *, double *, int *);\n\nint BLASFUNC(sge2mm)(char *, char *, char *, int *, int *,\n\t\t     float *, float  *, int *, float  *, int *,\n\t\t     float *, float  *, int *);\nint BLASFUNC(dge2mm)(char *, char *, char *, int *, int *,\n\t\t     double *, double  *, int *, double  *, int *,\n\t\t     double *, double  *, int *);\nint BLASFUNC(cge2mm)(char *, char *, char *, int *, int *,\n\t\t     float *, float  *, int *, float  *, int *,\n\t\t     float *, float  *, int *);\nint BLASFUNC(zge2mm)(char *, char *, char *, int *, int *,\n\t\t     double *, double  *, int *, double  *, int *,\n\t\t     double *, double  *, int *);\n\nint BLASFUNC(strsm)(char *, char *, char *, char *, int *, int *,\n\t   float *,  float *, int *, float *, int *);\nint BLASFUNC(dtrsm)(char *, char *, char *, char *, int *, int *,\n\t   double *,  double *, int *, double *, int *);\nint BLASFUNC(qtrsm)(char *, char *, char *, char *, int *, int *,\n\t   double *,  double *, int *, double *, int *);\nint BLASFUNC(ctrsm)(char *, char *, char *, char *, int *, int *,\n\t   float *,  float *, int *, float *, int *);\nint BLASFUNC(ztrsm)(char *, char *, char *, char *, int *, int *,\n\t   double *,  double *, int *, double *, int *);\nint BLASFUNC(xtrsm)(char *, char *, char *, char *, int *, int *,\n\t   double *,  double *, int *, double *, int *);\n\nint BLASFUNC(strmm)(char *, char *, char *, char *, int *, int *,\n\t   float *,  float *, int *, float *, int *);\nint BLASFUNC(dtrmm)(char *, char *, char *, char *, int *, int *,\n\t   double *,  double *, int *, double *, int *);\nint BLASFUNC(qtrmm)(char *, char *, char *, char *, int *, int *,\n\t   double *,  double *, int *, double *, int *);\nint BLASFUNC(ctrmm)(char *, char *, char *, char *, int *, int *,\n\t   float *,  float *, int *, float *, int *);\nint BLASFUNC(ztrmm)(char *, char *, char *, char *, int *, int *,\n\t   double *,  double *, int *, double *, int *);\nint BLASFUNC(xtrmm)(char *, char *, char *, char *, int *, int *,\n\t   double *,  double *, int *, double *, int *);\n\nint BLASFUNC(ssymm)(char *, char *, int *, int *, float  *, float  *, int *,\n\t   float  *, int *, float  *, float  *, int *);\nint BLASFUNC(dsymm)(char *, char *, int *, int *, double *, double *, int *,\n\t   double *, int *, double *, double *, int *);\nint BLASFUNC(qsymm)(char *, char *, int *, int *, double *, double *, int *,\n\t   double *, int *, double *, double *, int *);\nint BLASFUNC(csymm)(char *, char *, int *, int *, float  *, float  *, int *,\n\t   float  *, int *, float  *, float  *, int *);\nint BLASFUNC(zsymm)(char *, char *, int *, int *, double *, double *, int *,\n\t   double *, int *, double *, double *, int *);\nint BLASFUNC(xsymm)(char *, char *, int *, int *, double *, double *, int *,\n\t   double *, int *, double *, double *, int *);\n\nint BLASFUNC(csymm3m)(char *, char *, int *, int *, float  *, float  *, int *,\n\t   float  *, int *, float  *, float  *, int *);\nint BLASFUNC(zsymm3m)(char *, char *, int *, int *, double *, double *, int *,\n\t   double *, int *, double *, double *, int *);\nint BLASFUNC(xsymm3m)(char *, char *, int *, int *, double *, double *, int *,\n\t   double *, int *, double *, double *, int *);\n\nint BLASFUNC(ssyrk)(char *, char *, int *, int *, float  *, float  *, int *,\n\t   float  *, float  *, int *);\nint BLASFUNC(dsyrk)(char *, char *, int *, int *, double *, double *, int *,\n\t   double *, double *, int *);\nint BLASFUNC(qsyrk)(char *, char *, int *, int *, double *, double *, int *,\n\t   double *, double *, int *);\nint BLASFUNC(csyrk)(char *, char *, int *, int *, float  *, float  *, int *,\n\t   float  *, float  *, int *);\nint BLASFUNC(zsyrk)(char *, char *, int *, int *, double *, double *, int *,\n\t   double *, double *, int *);\nint BLASFUNC(xsyrk)(char *, char *, int *, int *, double *, double *, int *,\n\t   double *, double *, int *);\n\nint BLASFUNC(ssyr2k)(char *, char *, int *, int *, float  *, float  *, int *,\n\t   float *, int *, float  *, float  *, int *);\nint BLASFUNC(dsyr2k)(char *, char *, int *, int *, double *, double *, int *,\n\t   double*, int *, double *, double *, int *);\nint BLASFUNC(qsyr2k)(char *, char *, int *, int *, double *, double *, int *,\n\t   double*, int *, double *, double *, int *);\nint BLASFUNC(csyr2k)(char *, char *, int *, int *, float  *, float  *, int *,\n\t   float *, int *, float  *, float  *, int *);\nint BLASFUNC(zsyr2k)(char *, char *, int *, int *, double *, double *, int *,\n\t   double*, int *, double *, double *, int *);\nint BLASFUNC(xsyr2k)(char *, char *, int *, int *, double *, double *, int *,\n\t   double*, int *, double *, double *, int *);\n\nint BLASFUNC(chemm)(char *, char *, int *, int *, float  *, float  *, int *,\n\t   float  *, int *, float  *, float  *, int *);\nint BLASFUNC(zhemm)(char *, char *, int *, int *, double *, double *, int *,\n\t   double *, int *, double *, double *, int *);\nint BLASFUNC(xhemm)(char *, char *, int *, int *, double *, double *, int *,\n\t   double *, int *, double *, double *, int *);\n\nint BLASFUNC(chemm3m)(char *, char *, int *, int *, float  *, float  *, int *,\n\t   float  *, int *, float  *, float  *, int *);\nint BLASFUNC(zhemm3m)(char *, char *, int *, int *, double *, double *, int *,\n\t   double *, int *, double *, double *, int *);\nint BLASFUNC(xhemm3m)(char *, char *, int *, int *, double *, double *, int *,\n\t   double *, int *, double *, double *, int *);\n\nint BLASFUNC(cherk)(char *, char *, int *, int *, float  *, float  *, int *,\n\t   float  *, float  *, int *);\nint BLASFUNC(zherk)(char *, char *, int *, int *, double *, double *, int *,\n\t   double *, double *, int *);\nint BLASFUNC(xherk)(char *, char *, int *, int *, double *, double *, int *,\n\t   double *, double *, int *);\n\nint BLASFUNC(cher2k)(char *, char *, int *, int *, float  *, float  *, int *,\n\t   float *, int *, float  *, float  *, int *);\nint BLASFUNC(zher2k)(char *, char *, int *, int *, double *, double *, int *,\n\t   double*, int *, double *, double *, int *);\nint BLASFUNC(xher2k)(char *, char *, int *, int *, double *, double *, int *,\n\t   double*, int *, double *, double *, int *);\nint BLASFUNC(cher2m)(char *, char *, char *, int *, int *, float  *, float  *, int *,\n\t   float *, int *, float  *, float  *, int *);\nint BLASFUNC(zher2m)(char *, char *, char *, int *, int *, double *, double *, int *,\n\t   double*, int *, double *, double *, int *);\nint BLASFUNC(xher2m)(char *, char *, char *, int *, int *, double *, double *, int *,\n\t   double*, int *, double *, double *, int *);\n\nint BLASFUNC(sgemt)(char *, int *, int *, float  *, float  *, int *,\n\t\t    float  *, int *);\nint BLASFUNC(dgemt)(char *, int *, int *, double *, double *, int *,\n\t\t    double *, int *);\nint BLASFUNC(cgemt)(char *, int *, int *, float  *, float  *, int *,\n\t\t    float  *, int *);\nint BLASFUNC(zgemt)(char *, int *, int *, double *, double *, int *,\n\t\t    double *, int *);\n\nint BLASFUNC(sgema)(char *, char *, int *, int *, float  *,\n\t\t    float  *, int *, float *, float  *, int *, float *, int *);\nint BLASFUNC(dgema)(char *, char *, int *, int *, double *,\n\t\t    double *, int *, double*, double *, int *, double*, int *);\nint BLASFUNC(cgema)(char *, char *, int *, int *, float  *,\n\t\t    float  *, int *, float *, float  *, int *, float *, int *);\nint BLASFUNC(zgema)(char *, char *, int *, int *, double *,\n\t\t    double *, int *, double*, double *, int *, double*, int *);\n\nint BLASFUNC(sgems)(char *, char *, int *, int *, float  *,\n\t\t    float  *, int *, float *, float  *, int *, float *, int *);\nint BLASFUNC(dgems)(char *, char *, int *, int *, double *,\n\t\t    double *, int *, double*, double *, int *, double*, int *);\nint BLASFUNC(cgems)(char *, char *, int *, int *, float  *,\n\t\t    float  *, int *, float *, float  *, int *, float *, int *);\nint BLASFUNC(zgems)(char *, char *, int *, int *, double *,\n\t\t    double *, int *, double*, double *, int *, double*, int *);\n\nint BLASFUNC(sgetf2)(int *, int *, float  *, int *, int *, int *);\nint BLASFUNC(dgetf2)(int *, int *, double *, int *, int *, int *);\nint BLASFUNC(qgetf2)(int *, int *, double *, int *, int *, int *);\nint BLASFUNC(cgetf2)(int *, int *, float  *, int *, int *, int *);\nint BLASFUNC(zgetf2)(int *, int *, double *, int *, int *, int *);\nint BLASFUNC(xgetf2)(int *, int *, double *, int *, int *, int *);\n\nint BLASFUNC(sgetrf)(int *, int *, float  *, int *, int *, int *);\nint BLASFUNC(dgetrf)(int *, int *, double *, int *, int *, int *);\nint BLASFUNC(qgetrf)(int *, int *, double *, int *, int *, int *);\nint BLASFUNC(cgetrf)(int *, int *, float  *, int *, int *, int *);\nint BLASFUNC(zgetrf)(int *, int *, double *, int *, int *, int *);\nint BLASFUNC(xgetrf)(int *, int *, double *, int *, int *, int *);\n\nint BLASFUNC(slaswp)(int *, float  *, int *, int *, int *, int *, int *);\nint BLASFUNC(dlaswp)(int *, double *, int *, int *, int *, int *, int *);\nint BLASFUNC(qlaswp)(int *, double *, int *, int *, int *, int *, int *);\nint BLASFUNC(claswp)(int *, float  *, int *, int *, int *, int *, int *);\nint BLASFUNC(zlaswp)(int *, double *, int *, int *, int *, int *, int *);\nint BLASFUNC(xlaswp)(int *, double *, int *, int *, int *, int *, int *);\n\nint BLASFUNC(sgetrs)(char *, int *, int *, float  *, int *, int *, float  *, int *, int *);\nint BLASFUNC(dgetrs)(char *, int *, int *, double *, int *, int *, double *, int *, int *);\nint BLASFUNC(qgetrs)(char *, int *, int *, double *, int *, int *, double *, int *, int *);\nint BLASFUNC(cgetrs)(char *, int *, int *, float  *, int *, int *, float  *, int *, int *);\nint BLASFUNC(zgetrs)(char *, int *, int *, double *, int *, int *, double *, int *, int *);\nint BLASFUNC(xgetrs)(char *, int *, int *, double *, int *, int *, double *, int *, int *);\n\nint BLASFUNC(sgesv)(int *, int *, float  *, int *, int *, float *, int *, int *);\nint BLASFUNC(dgesv)(int *, int *, double *, int *, int *, double*, int *, int *);\nint BLASFUNC(qgesv)(int *, int *, double *, int *, int *, double*, int *, int *);\nint BLASFUNC(cgesv)(int *, int *, float  *, int *, int *, float *, int *, int *);\nint BLASFUNC(zgesv)(int *, int *, double *, int *, int *, double*, int *, int *);\nint BLASFUNC(xgesv)(int *, int *, double *, int *, int *, double*, int *, int *);\n\nint BLASFUNC(spotf2)(char *, int *, float  *, int *, int *);\nint BLASFUNC(dpotf2)(char *, int *, double *, int *, int *);\nint BLASFUNC(qpotf2)(char *, int *, double *, int *, int *);\nint BLASFUNC(cpotf2)(char *, int *, float  *, int *, int *);\nint BLASFUNC(zpotf2)(char *, int *, double *, int *, int *);\nint BLASFUNC(xpotf2)(char *, int *, double *, int *, int *);\n\nint BLASFUNC(spotrf)(char *, int *, float  *, int *, int *);\nint BLASFUNC(dpotrf)(char *, int *, double *, int *, int *);\nint BLASFUNC(qpotrf)(char *, int *, double *, int *, int *);\nint BLASFUNC(cpotrf)(char *, int *, float  *, int *, int *);\nint BLASFUNC(zpotrf)(char *, int *, double *, int *, int *);\nint BLASFUNC(xpotrf)(char *, int *, double *, int *, int *);\n\nint BLASFUNC(slauu2)(char *, int *, float  *, int *, int *);\nint BLASFUNC(dlauu2)(char *, int *, double *, int *, int *);\nint BLASFUNC(qlauu2)(char *, int *, double *, int *, int *);\nint BLASFUNC(clauu2)(char *, int *, float  *, int *, int *);\nint BLASFUNC(zlauu2)(char *, int *, double *, int *, int *);\nint BLASFUNC(xlauu2)(char *, int *, double *, int *, int *);\n\nint BLASFUNC(slauum)(char *, int *, float  *, int *, int *);\nint BLASFUNC(dlauum)(char *, int *, double *, int *, int *);\nint BLASFUNC(qlauum)(char *, int *, double *, int *, int *);\nint BLASFUNC(clauum)(char *, int *, float  *, int *, int *);\nint BLASFUNC(zlauum)(char *, int *, double *, int *, int *);\nint BLASFUNC(xlauum)(char *, int *, double *, int *, int *);\n\nint BLASFUNC(strti2)(char *, char *, int *, float  *, int *, int *);\nint BLASFUNC(dtrti2)(char *, char *, int *, double *, int *, int *);\nint BLASFUNC(qtrti2)(char *, char *, int *, double *, int *, int *);\nint BLASFUNC(ctrti2)(char *, char *, int *, float  *, int *, int *);\nint BLASFUNC(ztrti2)(char *, char *, int *, double *, int *, int *);\nint BLASFUNC(xtrti2)(char *, char *, int *, double *, int *, int *);\n\nint BLASFUNC(strtri)(char *, char *, int *, float  *, int *, int *);\nint BLASFUNC(dtrtri)(char *, char *, int *, double *, int *, int *);\nint BLASFUNC(qtrtri)(char *, char *, int *, double *, int *, int *);\nint BLASFUNC(ctrtri)(char *, char *, int *, float  *, int *, int *);\nint BLASFUNC(ztrtri)(char *, char *, int *, double *, int *, int *);\nint BLASFUNC(xtrtri)(char *, char *, int *, double *, int *, int *);\n\nint BLASFUNC(spotri)(char *, int *, float  *, int *, int *);\nint BLASFUNC(dpotri)(char *, int *, double *, int *, int *);\nint BLASFUNC(qpotri)(char *, int *, double *, int *, int *);\nint BLASFUNC(cpotri)(char *, int *, float  *, int *, int *);\nint BLASFUNC(zpotri)(char *, int *, double *, int *, int *);\nint BLASFUNC(xpotri)(char *, int *, double *, int *, int *);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/eigen/Eigen/src/plugins/ArrayCwiseBinaryOps.h",
    "content": "/** \\returns an expression of the coefficient wise product of \\c *this and \\a other\n  *\n  * \\sa MatrixBase::cwiseProduct\n  */\ntemplate<typename OtherDerived>\nEIGEN_STRONG_INLINE const EIGEN_CWISE_PRODUCT_RETURN_TYPE(Derived,OtherDerived)\noperator*(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const\n{\n  return EIGEN_CWISE_PRODUCT_RETURN_TYPE(Derived,OtherDerived)(derived(), other.derived());\n}\n\n/** \\returns an expression of the coefficient wise quotient of \\c *this and \\a other\n  *\n  * \\sa MatrixBase::cwiseQuotient\n  */\ntemplate<typename OtherDerived>\nEIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_quotient_op<Scalar>, const Derived, const OtherDerived>\noperator/(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const\n{\n  return CwiseBinaryOp<internal::scalar_quotient_op<Scalar>, const Derived, const OtherDerived>(derived(), other.derived());\n}\n\n/** \\returns an expression of the coefficient-wise min of \\c *this and \\a other\n  *\n  * Example: \\include Cwise_min.cpp\n  * Output: \\verbinclude Cwise_min.out\n  *\n  * \\sa max()\n  */\nEIGEN_MAKE_CWISE_BINARY_OP(min,internal::scalar_min_op)\n\n/** \\returns an expression of the coefficient-wise min of \\c *this and scalar \\a other\n  *\n  * \\sa max()\n  */\nEIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_min_op<Scalar>, const Derived,\n                                        const CwiseNullaryOp<internal::scalar_constant_op<Scalar>, PlainObject> >\n#ifdef EIGEN_PARSED_BY_DOXYGEN\nmin\n#else\n(min)\n#endif\n(const Scalar &other) const\n{\n  return (min)(Derived::PlainObject::Constant(rows(), cols(), other));\n}\n\n/** \\returns an expression of the coefficient-wise max of \\c *this and \\a other\n  *\n  * Example: \\include Cwise_max.cpp\n  * Output: \\verbinclude Cwise_max.out\n  *\n  * \\sa min()\n  */\nEIGEN_MAKE_CWISE_BINARY_OP(max,internal::scalar_max_op)\n\n/** \\returns an expression of the coefficient-wise max of \\c *this and scalar \\a other\n  *\n  * \\sa min()\n  */\nEIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_max_op<Scalar>, const Derived,\n                                        const CwiseNullaryOp<internal::scalar_constant_op<Scalar>, PlainObject> >\n#ifdef EIGEN_PARSED_BY_DOXYGEN\nmax\n#else\n(max)\n#endif\n(const Scalar &other) const\n{\n  return (max)(Derived::PlainObject::Constant(rows(), cols(), other));\n}\n\n\n#define EIGEN_MAKE_CWISE_COMP_OP(OP, COMPARATOR) \\\ntemplate<typename OtherDerived> \\\nEIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_cmp_op<Scalar, internal::cmp_ ## COMPARATOR>, const Derived, const OtherDerived> \\\nOP(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const \\\n{ \\\n  return CwiseBinaryOp<internal::scalar_cmp_op<Scalar, internal::cmp_ ## COMPARATOR>, const Derived, const OtherDerived>(derived(), other.derived()); \\\n}\\\ntypedef CwiseBinaryOp<internal::scalar_cmp_op<Scalar, internal::cmp_ ## COMPARATOR>, const Derived, const CwiseNullaryOp<internal::scalar_constant_op<Scalar>, PlainObject> > Cmp ## COMPARATOR ## ReturnType; \\\ntypedef CwiseBinaryOp<internal::scalar_cmp_op<Scalar, internal::cmp_ ## COMPARATOR>, const CwiseNullaryOp<internal::scalar_constant_op<Scalar>, PlainObject>, const Derived > RCmp ## COMPARATOR ## ReturnType; \\\nEIGEN_STRONG_INLINE const Cmp ## COMPARATOR ## ReturnType \\\nOP(const Scalar& s) const { \\\n  return this->OP(Derived::PlainObject::Constant(rows(), cols(), s)); \\\n} \\\nfriend EIGEN_STRONG_INLINE const RCmp ## COMPARATOR ## ReturnType \\\nOP(const Scalar& s, const Derived& d) { \\\n  return Derived::PlainObject::Constant(d.rows(), d.cols(), s).OP(d); \\\n}\n\n#define EIGEN_MAKE_CWISE_COMP_R_OP(OP, R_OP, RCOMPARATOR) \\\ntemplate<typename OtherDerived> \\\nEIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_cmp_op<Scalar, internal::cmp_##RCOMPARATOR>, const OtherDerived, const Derived> \\\nOP(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const \\\n{ \\\n  return CwiseBinaryOp<internal::scalar_cmp_op<Scalar, internal::cmp_##RCOMPARATOR>, const OtherDerived, const Derived>(other.derived(), derived()); \\\n} \\\n\\\ninline const RCmp ## RCOMPARATOR ## ReturnType \\\nOP(const Scalar& s) const { \\\n  return Derived::PlainObject::Constant(rows(), cols(), s).R_OP(*this); \\\n} \\\nfriend inline const Cmp ## RCOMPARATOR ## ReturnType \\\nOP(const Scalar& s, const Derived& d) { \\\n  return d.R_OP(Derived::PlainObject::Constant(d.rows(), d.cols(), s)); \\\n}\n\n\n/** \\returns an expression of the coefficient-wise \\< operator of *this and \\a other\n  *\n  * Example: \\include Cwise_less.cpp\n  * Output: \\verbinclude Cwise_less.out\n  *\n  * \\sa all(), any(), operator>(), operator<=()\n  */\nEIGEN_MAKE_CWISE_COMP_OP(operator<, LT)\n\n/** \\returns an expression of the coefficient-wise \\<= operator of *this and \\a other\n  *\n  * Example: \\include Cwise_less_equal.cpp\n  * Output: \\verbinclude Cwise_less_equal.out\n  *\n  * \\sa all(), any(), operator>=(), operator<()\n  */\nEIGEN_MAKE_CWISE_COMP_OP(operator<=, LE)\n\n/** \\returns an expression of the coefficient-wise \\> operator of *this and \\a other\n  *\n  * Example: \\include Cwise_greater.cpp\n  * Output: \\verbinclude Cwise_greater.out\n  *\n  * \\sa all(), any(), operator>=(), operator<()\n  */\nEIGEN_MAKE_CWISE_COMP_R_OP(operator>, operator<, LT)\n\n/** \\returns an expression of the coefficient-wise \\>= operator of *this and \\a other\n  *\n  * Example: \\include Cwise_greater_equal.cpp\n  * Output: \\verbinclude Cwise_greater_equal.out\n  *\n  * \\sa all(), any(), operator>(), operator<=()\n  */\nEIGEN_MAKE_CWISE_COMP_R_OP(operator>=, operator<=, LE)\n\n/** \\returns an expression of the coefficient-wise == operator of *this and \\a other\n  *\n  * \\warning this performs an exact comparison, which is generally a bad idea with floating-point types.\n  * In order to check for equality between two vectors or matrices with floating-point coefficients, it is\n  * generally a far better idea to use a fuzzy comparison as provided by isApprox() and\n  * isMuchSmallerThan().\n  *\n  * Example: \\include Cwise_equal_equal.cpp\n  * Output: \\verbinclude Cwise_equal_equal.out\n  *\n  * \\sa all(), any(), isApprox(), isMuchSmallerThan()\n  */\nEIGEN_MAKE_CWISE_COMP_OP(operator==, EQ)\n\n/** \\returns an expression of the coefficient-wise != operator of *this and \\a other\n  *\n  * \\warning this performs an exact comparison, which is generally a bad idea with floating-point types.\n  * In order to check for equality between two vectors or matrices with floating-point coefficients, it is\n  * generally a far better idea to use a fuzzy comparison as provided by isApprox() and\n  * isMuchSmallerThan().\n  *\n  * Example: \\include Cwise_not_equal.cpp\n  * Output: \\verbinclude Cwise_not_equal.out\n  *\n  * \\sa all(), any(), isApprox(), isMuchSmallerThan()\n  */\nEIGEN_MAKE_CWISE_COMP_OP(operator!=, NEQ)\n\n#undef EIGEN_MAKE_CWISE_COMP_OP\n#undef EIGEN_MAKE_CWISE_COMP_R_OP\n\n// scalar addition\n\n/** \\returns an expression of \\c *this with each coeff incremented by the constant \\a scalar\n  *\n  * Example: \\include Cwise_plus.cpp\n  * Output: \\verbinclude Cwise_plus.out\n  *\n  * \\sa operator+=(), operator-()\n  */\ninline const CwiseUnaryOp<internal::scalar_add_op<Scalar>, const Derived>\noperator+(const Scalar& scalar) const\n{\n  return CwiseUnaryOp<internal::scalar_add_op<Scalar>, const Derived>(derived(), internal::scalar_add_op<Scalar>(scalar));\n}\n\nfriend inline const CwiseUnaryOp<internal::scalar_add_op<Scalar>, const Derived>\noperator+(const Scalar& scalar,const EIGEN_CURRENT_STORAGE_BASE_CLASS<Derived>& other)\n{\n  return other + scalar;\n}\n\n/** \\returns an expression of \\c *this with each coeff decremented by the constant \\a scalar\n  *\n  * Example: \\include Cwise_minus.cpp\n  * Output: \\verbinclude Cwise_minus.out\n  *\n  * \\sa operator+(), operator-=()\n  */\ninline const CwiseUnaryOp<internal::scalar_add_op<Scalar>, const Derived>\noperator-(const Scalar& scalar) const\n{\n  return *this + (-scalar);\n}\n\nfriend inline const CwiseUnaryOp<internal::scalar_add_op<Scalar>, const CwiseUnaryOp<internal::scalar_opposite_op<Scalar>, const Derived> >\noperator-(const Scalar& scalar,const EIGEN_CURRENT_STORAGE_BASE_CLASS<Derived>& other)\n{\n  return (-other) + scalar;\n}\n\n/** \\returns an expression of the coefficient-wise && operator of *this and \\a other\n  *\n  * \\warning this operator is for expression of bool only.\n  *\n  * Example: \\include Cwise_boolean_and.cpp\n  * Output: \\verbinclude Cwise_boolean_and.out\n  *\n  * \\sa operator||(), select()\n  */\ntemplate<typename OtherDerived>\ninline const CwiseBinaryOp<internal::scalar_boolean_and_op, const Derived, const OtherDerived>\noperator&&(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const\n{\n  EIGEN_STATIC_ASSERT((internal::is_same<bool,Scalar>::value && internal::is_same<bool,typename OtherDerived::Scalar>::value),\n                      THIS_METHOD_IS_ONLY_FOR_EXPRESSIONS_OF_BOOL);\n  return CwiseBinaryOp<internal::scalar_boolean_and_op, const Derived, const OtherDerived>(derived(),other.derived());\n}\n\n/** \\returns an expression of the coefficient-wise || operator of *this and \\a other\n  *\n  * \\warning this operator is for expression of bool only.\n  *\n  * Example: \\include Cwise_boolean_or.cpp\n  * Output: \\verbinclude Cwise_boolean_or.out\n  *\n  * \\sa operator&&(), select()\n  */\ntemplate<typename OtherDerived>\ninline const CwiseBinaryOp<internal::scalar_boolean_or_op, const Derived, const OtherDerived>\noperator||(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const\n{\n  EIGEN_STATIC_ASSERT((internal::is_same<bool,Scalar>::value && internal::is_same<bool,typename OtherDerived::Scalar>::value),\n                      THIS_METHOD_IS_ONLY_FOR_EXPRESSIONS_OF_BOOL);\n  return CwiseBinaryOp<internal::scalar_boolean_or_op, const Derived, const OtherDerived>(derived(),other.derived());\n}\n\n\n"
  },
  {
    "path": "libs/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.h",
    "content": "\n\n/** \\returns an expression of the coefficient-wise absolute value of \\c *this\n  *\n  * Example: \\include Cwise_abs.cpp\n  * Output: \\verbinclude Cwise_abs.out\n  *\n  * \\sa abs2()\n  */\nEIGEN_STRONG_INLINE const CwiseUnaryOp<internal::scalar_abs_op<Scalar>, const Derived>\nabs() const\n{\n  return derived();\n}\n\n/** \\returns an expression of the coefficient-wise squared absolute value of \\c *this\n  *\n  * Example: \\include Cwise_abs2.cpp\n  * Output: \\verbinclude Cwise_abs2.out\n  *\n  * \\sa abs(), square()\n  */\nEIGEN_STRONG_INLINE const CwiseUnaryOp<internal::scalar_abs2_op<Scalar>, const Derived>\nabs2() const\n{\n  return derived();\n}\n\n/** \\returns an expression of the coefficient-wise exponential of *this.\n  *\n  * Example: \\include Cwise_exp.cpp\n  * Output: \\verbinclude Cwise_exp.out\n  *\n  * \\sa pow(), log(), sin(), cos()\n  */\ninline const CwiseUnaryOp<internal::scalar_exp_op<Scalar>, const Derived>\nexp() const\n{\n  return derived();\n}\n\n/** \\returns an expression of the coefficient-wise logarithm of *this.\n  *\n  * Example: \\include Cwise_log.cpp\n  * Output: \\verbinclude Cwise_log.out\n  *\n  * \\sa exp()\n  */\ninline const CwiseUnaryOp<internal::scalar_log_op<Scalar>, const Derived>\nlog() const\n{\n  return derived();\n}\n\n/** \\returns an expression of the coefficient-wise square root of *this.\n  *\n  * Example: \\include Cwise_sqrt.cpp\n  * Output: \\verbinclude Cwise_sqrt.out\n  *\n  * \\sa pow(), square()\n  */\ninline const CwiseUnaryOp<internal::scalar_sqrt_op<Scalar>, const Derived>\nsqrt() const\n{\n  return derived();\n}\n\n/** \\returns an expression of the coefficient-wise cosine of *this.\n  *\n  * Example: \\include Cwise_cos.cpp\n  * Output: \\verbinclude Cwise_cos.out\n  *\n  * \\sa sin(), acos()\n  */\ninline const CwiseUnaryOp<internal::scalar_cos_op<Scalar>, const Derived>\ncos() const\n{\n  return derived();\n}\n\n\n/** \\returns an expression of the coefficient-wise sine of *this.\n  *\n  * Example: \\include Cwise_sin.cpp\n  * Output: \\verbinclude Cwise_sin.out\n  *\n  * \\sa cos(), asin()\n  */\ninline const CwiseUnaryOp<internal::scalar_sin_op<Scalar>, const Derived>\nsin() const\n{\n  return derived();\n}\n\n/** \\returns an expression of the coefficient-wise arc cosine of *this.\n  *\n  * Example: \\include Cwise_acos.cpp\n  * Output: \\verbinclude Cwise_acos.out\n  *\n  * \\sa cos(), asin()\n  */\ninline const CwiseUnaryOp<internal::scalar_acos_op<Scalar>, const Derived>\nacos() const\n{\n  return derived();\n}\n\n/** \\returns an expression of the coefficient-wise arc sine of *this.\n  *\n  * Example: \\include Cwise_asin.cpp\n  * Output: \\verbinclude Cwise_asin.out\n  *\n  * \\sa sin(), acos()\n  */\ninline const CwiseUnaryOp<internal::scalar_asin_op<Scalar>, const Derived>\nasin() const\n{\n  return derived();\n}\n\n/** \\returns an expression of the coefficient-wise tan of *this.\n  *\n  * Example: \\include Cwise_tan.cpp\n  * Output: \\verbinclude Cwise_tan.out\n  *\n  * \\sa cos(), sin()\n  */\ninline const CwiseUnaryOp<internal::scalar_tan_op<Scalar>, Derived>\ntan() const\n{\n  return derived();\n}\n\n\n/** \\returns an expression of the coefficient-wise power of *this to the given exponent.\n  *\n  * Example: \\include Cwise_pow.cpp\n  * Output: \\verbinclude Cwise_pow.out\n  *\n  * \\sa exp(), log()\n  */\ninline const CwiseUnaryOp<internal::scalar_pow_op<Scalar>, const Derived>\npow(const Scalar& exponent) const\n{\n  return CwiseUnaryOp<internal::scalar_pow_op<Scalar>, const Derived>\n          (derived(), internal::scalar_pow_op<Scalar>(exponent));\n}\n\n\n/** \\returns an expression of the coefficient-wise inverse of *this.\n  *\n  * Example: \\include Cwise_inverse.cpp\n  * Output: \\verbinclude Cwise_inverse.out\n  *\n  * \\sa operator/(), operator*()\n  */\ninline const CwiseUnaryOp<internal::scalar_inverse_op<Scalar>, const Derived>\ninverse() const\n{\n  return derived();\n}\n\n/** \\returns an expression of the coefficient-wise square of *this.\n  *\n  * Example: \\include Cwise_square.cpp\n  * Output: \\verbinclude Cwise_square.out\n  *\n  * \\sa operator/(), operator*(), abs2()\n  */\ninline const CwiseUnaryOp<internal::scalar_square_op<Scalar>, const Derived>\nsquare() const\n{\n  return derived();\n}\n\n/** \\returns an expression of the coefficient-wise cube of *this.\n  *\n  * Example: \\include Cwise_cube.cpp\n  * Output: \\verbinclude Cwise_cube.out\n  *\n  * \\sa square(), pow()\n  */\ninline const CwiseUnaryOp<internal::scalar_cube_op<Scalar>, const Derived>\ncube() const\n{\n  return derived();\n}\n"
  },
  {
    "path": "libs/eigen/Eigen/src/plugins/BlockMethods.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2006-2010 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n#ifndef EIGEN_PARSED_BY_DOXYGEN\n\n/** \\internal expression type of a column */\ntypedef Block<Derived, internal::traits<Derived>::RowsAtCompileTime, 1, !IsRowMajor> ColXpr;\ntypedef const Block<const Derived, internal::traits<Derived>::RowsAtCompileTime, 1, !IsRowMajor> ConstColXpr;\n/** \\internal expression type of a row */\ntypedef Block<Derived, 1, internal::traits<Derived>::ColsAtCompileTime, IsRowMajor> RowXpr;\ntypedef const Block<const Derived, 1, internal::traits<Derived>::ColsAtCompileTime, IsRowMajor> ConstRowXpr;\n/** \\internal expression type of a block of whole columns */\ntypedef Block<Derived, internal::traits<Derived>::RowsAtCompileTime, Dynamic, !IsRowMajor> ColsBlockXpr;\ntypedef const Block<const Derived, internal::traits<Derived>::RowsAtCompileTime, Dynamic, !IsRowMajor> ConstColsBlockXpr;\n/** \\internal expression type of a block of whole rows */\ntypedef Block<Derived, Dynamic, internal::traits<Derived>::ColsAtCompileTime, IsRowMajor> RowsBlockXpr;\ntypedef const Block<const Derived, Dynamic, internal::traits<Derived>::ColsAtCompileTime, IsRowMajor> ConstRowsBlockXpr;\n/** \\internal expression type of a block of whole columns */\ntemplate<int N> struct NColsBlockXpr { typedef Block<Derived, internal::traits<Derived>::RowsAtCompileTime, N, !IsRowMajor> Type; };\ntemplate<int N> struct ConstNColsBlockXpr { typedef const Block<const Derived, internal::traits<Derived>::RowsAtCompileTime, N, !IsRowMajor> Type; };\n/** \\internal expression type of a block of whole rows */\ntemplate<int N> struct NRowsBlockXpr { typedef Block<Derived, N, internal::traits<Derived>::ColsAtCompileTime, IsRowMajor> Type; };\ntemplate<int N> struct ConstNRowsBlockXpr { typedef const Block<const Derived, N, internal::traits<Derived>::ColsAtCompileTime, IsRowMajor> Type; };\n\ntypedef VectorBlock<Derived> SegmentReturnType;\ntypedef const VectorBlock<const Derived> ConstSegmentReturnType;\ntemplate<int Size> struct FixedSegmentReturnType { typedef VectorBlock<Derived, Size> Type; };\ntemplate<int Size> struct ConstFixedSegmentReturnType { typedef const VectorBlock<const Derived, Size> Type; };\n\n#endif // not EIGEN_PARSED_BY_DOXYGEN\n\n/** \\returns a dynamic-size expression of a block in *this.\n  *\n  * \\param startRow the first row in the block\n  * \\param startCol the first column in the block\n  * \\param blockRows the number of rows in the block\n  * \\param blockCols the number of columns in the block\n  *\n  * Example: \\include MatrixBase_block_int_int_int_int.cpp\n  * Output: \\verbinclude MatrixBase_block_int_int_int_int.out\n  *\n  * \\note Even though the returned expression has dynamic size, in the case\n  * when it is applied to a fixed-size matrix, it inherits a fixed maximal size,\n  * which means that evaluating it does not cause a dynamic memory allocation.\n  *\n  * \\sa class Block, block(Index,Index)\n  */\ninline Block<Derived> block(Index startRow, Index startCol, Index blockRows, Index blockCols)\n{\n  return Block<Derived>(derived(), startRow, startCol, blockRows, blockCols);\n}\n\n/** This is the const version of block(Index,Index,Index,Index). */\ninline const Block<const Derived> block(Index startRow, Index startCol, Index blockRows, Index blockCols) const\n{\n  return Block<const Derived>(derived(), startRow, startCol, blockRows, blockCols);\n}\n\n\n\n\n/** \\returns a dynamic-size expression of a top-right corner of *this.\n  *\n  * \\param cRows the number of rows in the corner\n  * \\param cCols the number of columns in the corner\n  *\n  * Example: \\include MatrixBase_topRightCorner_int_int.cpp\n  * Output: \\verbinclude MatrixBase_topRightCorner_int_int.out\n  *\n  * \\sa class Block, block(Index,Index,Index,Index)\n  */\ninline Block<Derived> topRightCorner(Index cRows, Index cCols)\n{\n  return Block<Derived>(derived(), 0, cols() - cCols, cRows, cCols);\n}\n\n/** This is the const version of topRightCorner(Index, Index).*/\ninline const Block<const Derived> topRightCorner(Index cRows, Index cCols) const\n{\n  return Block<const Derived>(derived(), 0, cols() - cCols, cRows, cCols);\n}\n\n/** \\returns an expression of a fixed-size top-right corner of *this.\n  *\n  * \\tparam CRows the number of rows in the corner\n  * \\tparam CCols the number of columns in the corner\n  *\n  * Example: \\include MatrixBase_template_int_int_topRightCorner.cpp\n  * Output: \\verbinclude MatrixBase_template_int_int_topRightCorner.out\n  *\n  * \\sa class Block, block<int,int>(Index,Index)\n  */\ntemplate<int CRows, int CCols>\ninline Block<Derived, CRows, CCols> topRightCorner()\n{\n  return Block<Derived, CRows, CCols>(derived(), 0, cols() - CCols);\n}\n\n/** This is the const version of topRightCorner<int, int>().*/\ntemplate<int CRows, int CCols>\ninline const Block<const Derived, CRows, CCols> topRightCorner() const\n{\n  return Block<const Derived, CRows, CCols>(derived(), 0, cols() - CCols);\n}\n\n/** \\returns an expression of a top-right corner of *this.\n  *\n  * \\tparam CRows number of rows in corner as specified at compile-time\n  * \\tparam CCols number of columns in corner as specified at compile-time\n  * \\param  cRows number of rows in corner as specified at run-time\n  * \\param  cCols number of columns in corner as specified at run-time\n  *\n  * This function is mainly useful for corners where the number of rows is specified at compile-time\n  * and the number of columns is specified at run-time, or vice versa. The compile-time and run-time\n  * information should not contradict. In other words, \\a cRows should equal \\a CRows unless\n  * \\a CRows is \\a Dynamic, and the same for the number of columns.\n  *\n  * Example: \\include MatrixBase_template_int_int_topRightCorner_int_int.cpp\n  * Output: \\verbinclude MatrixBase_template_int_int_topRightCorner_int_int.out\n  *\n  * \\sa class Block\n  */\ntemplate<int CRows, int CCols>\ninline Block<Derived, CRows, CCols> topRightCorner(Index cRows, Index cCols)\n{\n  return Block<Derived, CRows, CCols>(derived(), 0, cols() - cCols, cRows, cCols);\n}\n\n/** This is the const version of topRightCorner<int, int>(Index, Index).*/\ntemplate<int CRows, int CCols>\ninline const Block<const Derived, CRows, CCols> topRightCorner(Index cRows, Index cCols) const\n{\n  return Block<const Derived, CRows, CCols>(derived(), 0, cols() - cCols, cRows, cCols);\n}\n\n\n\n/** \\returns a dynamic-size expression of a top-left corner of *this.\n  *\n  * \\param cRows the number of rows in the corner\n  * \\param cCols the number of columns in the corner\n  *\n  * Example: \\include MatrixBase_topLeftCorner_int_int.cpp\n  * Output: \\verbinclude MatrixBase_topLeftCorner_int_int.out\n  *\n  * \\sa class Block, block(Index,Index,Index,Index)\n  */\ninline Block<Derived> topLeftCorner(Index cRows, Index cCols)\n{\n  return Block<Derived>(derived(), 0, 0, cRows, cCols);\n}\n\n/** This is the const version of topLeftCorner(Index, Index).*/\ninline const Block<const Derived> topLeftCorner(Index cRows, Index cCols) const\n{\n  return Block<const Derived>(derived(), 0, 0, cRows, cCols);\n}\n\n/** \\returns an expression of a fixed-size top-left corner of *this.\n  *\n  * The template parameters CRows and CCols are the number of rows and columns in the corner.\n  *\n  * Example: \\include MatrixBase_template_int_int_topLeftCorner.cpp\n  * Output: \\verbinclude MatrixBase_template_int_int_topLeftCorner.out\n  *\n  * \\sa class Block, block(Index,Index,Index,Index)\n  */\ntemplate<int CRows, int CCols>\ninline Block<Derived, CRows, CCols> topLeftCorner()\n{\n  return Block<Derived, CRows, CCols>(derived(), 0, 0);\n}\n\n/** This is the const version of topLeftCorner<int, int>().*/\ntemplate<int CRows, int CCols>\ninline const Block<const Derived, CRows, CCols> topLeftCorner() const\n{\n  return Block<const Derived, CRows, CCols>(derived(), 0, 0);\n}\n\n/** \\returns an expression of a top-left corner of *this.\n  *\n  * \\tparam CRows number of rows in corner as specified at compile-time\n  * \\tparam CCols number of columns in corner as specified at compile-time\n  * \\param  cRows number of rows in corner as specified at run-time\n  * \\param  cCols number of columns in corner as specified at run-time\n  *\n  * This function is mainly useful for corners where the number of rows is specified at compile-time\n  * and the number of columns is specified at run-time, or vice versa. The compile-time and run-time\n  * information should not contradict. In other words, \\a cRows should equal \\a CRows unless\n  * \\a CRows is \\a Dynamic, and the same for the number of columns.\n  *\n  * Example: \\include MatrixBase_template_int_int_topLeftCorner_int_int.cpp\n  * Output: \\verbinclude MatrixBase_template_int_int_topLeftCorner_int_int.out\n  *\n  * \\sa class Block\n  */\ntemplate<int CRows, int CCols>\ninline Block<Derived, CRows, CCols> topLeftCorner(Index cRows, Index cCols)\n{\n  return Block<Derived, CRows, CCols>(derived(), 0, 0, cRows, cCols);\n}\n\n/** This is the const version of topLeftCorner<int, int>(Index, Index).*/\ntemplate<int CRows, int CCols>\ninline const Block<const Derived, CRows, CCols> topLeftCorner(Index cRows, Index cCols) const\n{\n  return Block<const Derived, CRows, CCols>(derived(), 0, 0, cRows, cCols);\n}\n\n\n\n/** \\returns a dynamic-size expression of a bottom-right corner of *this.\n  *\n  * \\param cRows the number of rows in the corner\n  * \\param cCols the number of columns in the corner\n  *\n  * Example: \\include MatrixBase_bottomRightCorner_int_int.cpp\n  * Output: \\verbinclude MatrixBase_bottomRightCorner_int_int.out\n  *\n  * \\sa class Block, block(Index,Index,Index,Index)\n  */\ninline Block<Derived> bottomRightCorner(Index cRows, Index cCols)\n{\n  return Block<Derived>(derived(), rows() - cRows, cols() - cCols, cRows, cCols);\n}\n\n/** This is the const version of bottomRightCorner(Index, Index).*/\ninline const Block<const Derived> bottomRightCorner(Index cRows, Index cCols) const\n{\n  return Block<const Derived>(derived(), rows() - cRows, cols() - cCols, cRows, cCols);\n}\n\n/** \\returns an expression of a fixed-size bottom-right corner of *this.\n  *\n  * The template parameters CRows and CCols are the number of rows and columns in the corner.\n  *\n  * Example: \\include MatrixBase_template_int_int_bottomRightCorner.cpp\n  * Output: \\verbinclude MatrixBase_template_int_int_bottomRightCorner.out\n  *\n  * \\sa class Block, block(Index,Index,Index,Index)\n  */\ntemplate<int CRows, int CCols>\ninline Block<Derived, CRows, CCols> bottomRightCorner()\n{\n  return Block<Derived, CRows, CCols>(derived(), rows() - CRows, cols() - CCols);\n}\n\n/** This is the const version of bottomRightCorner<int, int>().*/\ntemplate<int CRows, int CCols>\ninline const Block<const Derived, CRows, CCols> bottomRightCorner() const\n{\n  return Block<const Derived, CRows, CCols>(derived(), rows() - CRows, cols() - CCols);\n}\n\n/** \\returns an expression of a bottom-right corner of *this.\n  *\n  * \\tparam CRows number of rows in corner as specified at compile-time\n  * \\tparam CCols number of columns in corner as specified at compile-time\n  * \\param  cRows number of rows in corner as specified at run-time\n  * \\param  cCols number of columns in corner as specified at run-time\n  *\n  * This function is mainly useful for corners where the number of rows is specified at compile-time\n  * and the number of columns is specified at run-time, or vice versa. The compile-time and run-time\n  * information should not contradict. In other words, \\a cRows should equal \\a CRows unless\n  * \\a CRows is \\a Dynamic, and the same for the number of columns.\n  *\n  * Example: \\include MatrixBase_template_int_int_bottomRightCorner_int_int.cpp\n  * Output: \\verbinclude MatrixBase_template_int_int_bottomRightCorner_int_int.out\n  *\n  * \\sa class Block\n  */\ntemplate<int CRows, int CCols>\ninline Block<Derived, CRows, CCols> bottomRightCorner(Index cRows, Index cCols)\n{\n  return Block<Derived, CRows, CCols>(derived(), rows() - cRows, cols() - cCols, cRows, cCols);\n}\n\n/** This is the const version of bottomRightCorner<int, int>(Index, Index).*/\ntemplate<int CRows, int CCols>\ninline const Block<const Derived, CRows, CCols> bottomRightCorner(Index cRows, Index cCols) const\n{\n  return Block<const Derived, CRows, CCols>(derived(), rows() - cRows, cols() - cCols, cRows, cCols);\n}\n\n\n\n/** \\returns a dynamic-size expression of a bottom-left corner of *this.\n  *\n  * \\param cRows the number of rows in the corner\n  * \\param cCols the number of columns in the corner\n  *\n  * Example: \\include MatrixBase_bottomLeftCorner_int_int.cpp\n  * Output: \\verbinclude MatrixBase_bottomLeftCorner_int_int.out\n  *\n  * \\sa class Block, block(Index,Index,Index,Index)\n  */\ninline Block<Derived> bottomLeftCorner(Index cRows, Index cCols)\n{\n  return Block<Derived>(derived(), rows() - cRows, 0, cRows, cCols);\n}\n\n/** This is the const version of bottomLeftCorner(Index, Index).*/\ninline const Block<const Derived> bottomLeftCorner(Index cRows, Index cCols) const\n{\n  return Block<const Derived>(derived(), rows() - cRows, 0, cRows, cCols);\n}\n\n/** \\returns an expression of a fixed-size bottom-left corner of *this.\n  *\n  * The template parameters CRows and CCols are the number of rows and columns in the corner.\n  *\n  * Example: \\include MatrixBase_template_int_int_bottomLeftCorner.cpp\n  * Output: \\verbinclude MatrixBase_template_int_int_bottomLeftCorner.out\n  *\n  * \\sa class Block, block(Index,Index,Index,Index)\n  */\ntemplate<int CRows, int CCols>\ninline Block<Derived, CRows, CCols> bottomLeftCorner()\n{\n  return Block<Derived, CRows, CCols>(derived(), rows() - CRows, 0);\n}\n\n/** This is the const version of bottomLeftCorner<int, int>().*/\ntemplate<int CRows, int CCols>\ninline const Block<const Derived, CRows, CCols> bottomLeftCorner() const\n{\n  return Block<const Derived, CRows, CCols>(derived(), rows() - CRows, 0);\n}\n\n/** \\returns an expression of a bottom-left corner of *this.\n  *\n  * \\tparam CRows number of rows in corner as specified at compile-time\n  * \\tparam CCols number of columns in corner as specified at compile-time\n  * \\param  cRows number of rows in corner as specified at run-time\n  * \\param  cCols number of columns in corner as specified at run-time\n  *\n  * This function is mainly useful for corners where the number of rows is specified at compile-time\n  * and the number of columns is specified at run-time, or vice versa. The compile-time and run-time\n  * information should not contradict. In other words, \\a cRows should equal \\a CRows unless\n  * \\a CRows is \\a Dynamic, and the same for the number of columns.\n  *\n  * Example: \\include MatrixBase_template_int_int_bottomLeftCorner_int_int.cpp\n  * Output: \\verbinclude MatrixBase_template_int_int_bottomLeftCorner_int_int.out\n  *\n  * \\sa class Block\n  */\ntemplate<int CRows, int CCols>\ninline Block<Derived, CRows, CCols> bottomLeftCorner(Index cRows, Index cCols)\n{\n  return Block<Derived, CRows, CCols>(derived(), rows() - cRows, 0, cRows, cCols);\n}\n\n/** This is the const version of bottomLeftCorner<int, int>(Index, Index).*/\ntemplate<int CRows, int CCols>\ninline const Block<const Derived, CRows, CCols> bottomLeftCorner(Index cRows, Index cCols) const\n{\n  return Block<const Derived, CRows, CCols>(derived(), rows() - cRows, 0, cRows, cCols);\n}\n\n\n\n/** \\returns a block consisting of the top rows of *this.\n  *\n  * \\param n the number of rows in the block\n  *\n  * Example: \\include MatrixBase_topRows_int.cpp\n  * Output: \\verbinclude MatrixBase_topRows_int.out\n  *\n  * \\sa class Block, block(Index,Index,Index,Index)\n  */\ninline RowsBlockXpr topRows(Index n)\n{\n  return RowsBlockXpr(derived(), 0, 0, n, cols());\n}\n\n/** This is the const version of topRows(Index).*/\ninline ConstRowsBlockXpr topRows(Index n) const\n{\n  return ConstRowsBlockXpr(derived(), 0, 0, n, cols());\n}\n\n/** \\returns a block consisting of the top rows of *this.\n  *\n  * \\tparam N the number of rows in the block as specified at compile-time\n  * \\param n the number of rows in the block as specified at run-time\n  *\n  * The compile-time and run-time information should not contradict. In other words,\n  * \\a n should equal \\a N unless \\a N is \\a Dynamic.\n  *\n  * Example: \\include MatrixBase_template_int_topRows.cpp\n  * Output: \\verbinclude MatrixBase_template_int_topRows.out\n  *\n  * \\sa class Block, block(Index,Index,Index,Index)\n  */\ntemplate<int N>\ninline typename NRowsBlockXpr<N>::Type topRows(Index n = N)\n{\n  return typename NRowsBlockXpr<N>::Type(derived(), 0, 0, n, cols());\n}\n\n/** This is the const version of topRows<int>().*/\ntemplate<int N>\ninline typename ConstNRowsBlockXpr<N>::Type topRows(Index n = N) const\n{\n  return typename ConstNRowsBlockXpr<N>::Type(derived(), 0, 0, n, cols());\n}\n\n\n\n/** \\returns a block consisting of the bottom rows of *this.\n  *\n  * \\param n the number of rows in the block\n  *\n  * Example: \\include MatrixBase_bottomRows_int.cpp\n  * Output: \\verbinclude MatrixBase_bottomRows_int.out\n  *\n  * \\sa class Block, block(Index,Index,Index,Index)\n  */\ninline RowsBlockXpr bottomRows(Index n)\n{\n  return RowsBlockXpr(derived(), rows() - n, 0, n, cols());\n}\n\n/** This is the const version of bottomRows(Index).*/\ninline ConstRowsBlockXpr bottomRows(Index n) const\n{\n  return ConstRowsBlockXpr(derived(), rows() - n, 0, n, cols());\n}\n\n/** \\returns a block consisting of the bottom rows of *this.\n  *\n  * \\tparam N the number of rows in the block as specified at compile-time\n  * \\param n the number of rows in the block as specified at run-time\n  *\n  * The compile-time and run-time information should not contradict. In other words,\n  * \\a n should equal \\a N unless \\a N is \\a Dynamic.\n  *\n  * Example: \\include MatrixBase_template_int_bottomRows.cpp\n  * Output: \\verbinclude MatrixBase_template_int_bottomRows.out\n  *\n  * \\sa class Block, block(Index,Index,Index,Index)\n  */\ntemplate<int N>\ninline typename NRowsBlockXpr<N>::Type bottomRows(Index n = N)\n{\n  return typename NRowsBlockXpr<N>::Type(derived(), rows() - n, 0, n, cols());\n}\n\n/** This is the const version of bottomRows<int>().*/\ntemplate<int N>\ninline typename ConstNRowsBlockXpr<N>::Type bottomRows(Index n = N) const\n{\n  return typename ConstNRowsBlockXpr<N>::Type(derived(), rows() - n, 0, n, cols());\n}\n\n\n\n/** \\returns a block consisting of a range of rows of *this.\n  *\n  * \\param startRow the index of the first row in the block\n  * \\param n the number of rows in the block\n  *\n  * Example: \\include DenseBase_middleRows_int.cpp\n  * Output: \\verbinclude DenseBase_middleRows_int.out\n  *\n  * \\sa class Block, block(Index,Index,Index,Index)\n  */\ninline RowsBlockXpr middleRows(Index startRow, Index n)\n{\n  return RowsBlockXpr(derived(), startRow, 0, n, cols());\n}\n\n/** This is the const version of middleRows(Index,Index).*/\ninline ConstRowsBlockXpr middleRows(Index startRow, Index n) const\n{\n  return ConstRowsBlockXpr(derived(), startRow, 0, n, cols());\n}\n\n/** \\returns a block consisting of a range of rows of *this.\n  *\n  * \\tparam N the number of rows in the block as specified at compile-time\n  * \\param startRow the index of the first row in the block\n  * \\param n the number of rows in the block as specified at run-time\n  *\n  * The compile-time and run-time information should not contradict. In other words,\n  * \\a n should equal \\a N unless \\a N is \\a Dynamic.\n  *\n  * Example: \\include DenseBase_template_int_middleRows.cpp\n  * Output: \\verbinclude DenseBase_template_int_middleRows.out\n  *\n  * \\sa class Block, block(Index,Index,Index,Index)\n  */\ntemplate<int N>\ninline typename NRowsBlockXpr<N>::Type middleRows(Index startRow, Index n = N)\n{\n  return typename NRowsBlockXpr<N>::Type(derived(), startRow, 0, n, cols());\n}\n\n/** This is the const version of middleRows<int>().*/\ntemplate<int N>\ninline typename ConstNRowsBlockXpr<N>::Type middleRows(Index startRow, Index n = N) const\n{\n  return typename ConstNRowsBlockXpr<N>::Type(derived(), startRow, 0, n, cols());\n}\n\n\n\n/** \\returns a block consisting of the left columns of *this.\n  *\n  * \\param n the number of columns in the block\n  *\n  * Example: \\include MatrixBase_leftCols_int.cpp\n  * Output: \\verbinclude MatrixBase_leftCols_int.out\n  *\n  * \\sa class Block, block(Index,Index,Index,Index)\n  */\ninline ColsBlockXpr leftCols(Index n)\n{\n  return ColsBlockXpr(derived(), 0, 0, rows(), n);\n}\n\n/** This is the const version of leftCols(Index).*/\ninline ConstColsBlockXpr leftCols(Index n) const\n{\n  return ConstColsBlockXpr(derived(), 0, 0, rows(), n);\n}\n\n/** \\returns a block consisting of the left columns of *this.\n  *\n  * \\tparam N the number of columns in the block as specified at compile-time\n  * \\param n the number of columns in the block as specified at run-time\n  *\n  * The compile-time and run-time information should not contradict. In other words,\n  * \\a n should equal \\a N unless \\a N is \\a Dynamic.\n  *\n  * Example: \\include MatrixBase_template_int_leftCols.cpp\n  * Output: \\verbinclude MatrixBase_template_int_leftCols.out\n  *\n  * \\sa class Block, block(Index,Index,Index,Index)\n  */\ntemplate<int N>\ninline typename NColsBlockXpr<N>::Type leftCols(Index n = N)\n{\n  return typename NColsBlockXpr<N>::Type(derived(), 0, 0, rows(), n);\n}\n\n/** This is the const version of leftCols<int>().*/\ntemplate<int N>\ninline typename ConstNColsBlockXpr<N>::Type leftCols(Index n = N) const\n{\n  return typename ConstNColsBlockXpr<N>::Type(derived(), 0, 0, rows(), n);\n}\n\n\n\n/** \\returns a block consisting of the right columns of *this.\n  *\n  * \\param n the number of columns in the block\n  *\n  * Example: \\include MatrixBase_rightCols_int.cpp\n  * Output: \\verbinclude MatrixBase_rightCols_int.out\n  *\n  * \\sa class Block, block(Index,Index,Index,Index)\n  */\ninline ColsBlockXpr rightCols(Index n)\n{\n  return ColsBlockXpr(derived(), 0, cols() - n, rows(), n);\n}\n\n/** This is the const version of rightCols(Index).*/\ninline ConstColsBlockXpr rightCols(Index n) const\n{\n  return ConstColsBlockXpr(derived(), 0, cols() - n, rows(), n);\n}\n\n/** \\returns a block consisting of the right columns of *this.\n  *\n  * \\tparam N the number of columns in the block as specified at compile-time\n  * \\param n the number of columns in the block as specified at run-time\n  *\n  * The compile-time and run-time information should not contradict. In other words,\n  * \\a n should equal \\a N unless \\a N is \\a Dynamic.\n  *\n  * Example: \\include MatrixBase_template_int_rightCols.cpp\n  * Output: \\verbinclude MatrixBase_template_int_rightCols.out\n  *\n  * \\sa class Block, block(Index,Index,Index,Index)\n  */\ntemplate<int N>\ninline typename NColsBlockXpr<N>::Type rightCols(Index n = N)\n{\n  return typename NColsBlockXpr<N>::Type(derived(), 0, cols() - n, rows(), n);\n}\n\n/** This is the const version of rightCols<int>().*/\ntemplate<int N>\ninline typename ConstNColsBlockXpr<N>::Type rightCols(Index n = N) const\n{\n  return typename ConstNColsBlockXpr<N>::Type(derived(), 0, cols() - n, rows(), n);\n}\n\n\n\n/** \\returns a block consisting of a range of columns of *this.\n  *\n  * \\param startCol the index of the first column in the block\n  * \\param numCols the number of columns in the block\n  *\n  * Example: \\include DenseBase_middleCols_int.cpp\n  * Output: \\verbinclude DenseBase_middleCols_int.out\n  *\n  * \\sa class Block, block(Index,Index,Index,Index)\n  */\ninline ColsBlockXpr middleCols(Index startCol, Index numCols)\n{\n  return ColsBlockXpr(derived(), 0, startCol, rows(), numCols);\n}\n\n/** This is the const version of middleCols(Index,Index).*/\ninline ConstColsBlockXpr middleCols(Index startCol, Index numCols) const\n{\n  return ConstColsBlockXpr(derived(), 0, startCol, rows(), numCols);\n}\n\n/** \\returns a block consisting of a range of columns of *this.\n  *\n  * \\tparam N the number of columns in the block as specified at compile-time\n  * \\param startCol the index of the first column in the block\n  * \\param n the number of columns in the block as specified at run-time\n  *\n  * The compile-time and run-time information should not contradict. In other words,\n  * \\a n should equal \\a N unless \\a N is \\a Dynamic.\n  *\n  * Example: \\include DenseBase_template_int_middleCols.cpp\n  * Output: \\verbinclude DenseBase_template_int_middleCols.out\n  *\n  * \\sa class Block, block(Index,Index,Index,Index)\n  */\ntemplate<int N>\ninline typename NColsBlockXpr<N>::Type middleCols(Index startCol, Index n = N)\n{\n  return typename NColsBlockXpr<N>::Type(derived(), 0, startCol, rows(), n);\n}\n\n/** This is the const version of middleCols<int>().*/\ntemplate<int N>\ninline typename ConstNColsBlockXpr<N>::Type middleCols(Index startCol, Index n = N) const\n{\n  return typename ConstNColsBlockXpr<N>::Type(derived(), 0, startCol, rows(), n);\n}\n\n\n\n/** \\returns a fixed-size expression of a block in *this.\n  *\n  * The template parameters \\a BlockRows and \\a BlockCols are the number of\n  * rows and columns in the block.\n  *\n  * \\param startRow the first row in the block\n  * \\param startCol the first column in the block\n  *\n  * Example: \\include MatrixBase_block_int_int.cpp\n  * Output: \\verbinclude MatrixBase_block_int_int.out\n  *\n  * \\note since block is a templated member, the keyword template has to be used\n  * if the matrix type is also a template parameter: \\code m.template block<3,3>(1,1); \\endcode\n  *\n  * \\sa class Block, block(Index,Index,Index,Index)\n  */\ntemplate<int BlockRows, int BlockCols>\ninline Block<Derived, BlockRows, BlockCols> block(Index startRow, Index startCol)\n{\n  return Block<Derived, BlockRows, BlockCols>(derived(), startRow, startCol);\n}\n\n/** This is the const version of block<>(Index, Index). */\ntemplate<int BlockRows, int BlockCols>\ninline const Block<const Derived, BlockRows, BlockCols> block(Index startRow, Index startCol) const\n{\n  return Block<const Derived, BlockRows, BlockCols>(derived(), startRow, startCol);\n}\n\n/** \\returns an expression of a block in *this.\n  *\n  * \\tparam BlockRows number of rows in block as specified at compile-time\n  * \\tparam BlockCols number of columns in block as specified at compile-time\n  * \\param  startRow  the first row in the block\n  * \\param  startCol  the first column in the block\n  * \\param  blockRows number of rows in block as specified at run-time\n  * \\param  blockCols number of columns in block as specified at run-time\n  *\n  * This function is mainly useful for blocks where the number of rows is specified at compile-time\n  * and the number of columns is specified at run-time, or vice versa. The compile-time and run-time\n  * information should not contradict. In other words, \\a blockRows should equal \\a BlockRows unless\n  * \\a BlockRows is \\a Dynamic, and the same for the number of columns.\n  *\n  * Example: \\include MatrixBase_template_int_int_block_int_int_int_int.cpp\n  * Output: \\verbinclude MatrixBase_template_int_int_block_int_int_int_int.cpp\n  *\n  * \\sa class Block, block(Index,Index,Index,Index)\n  */\ntemplate<int BlockRows, int BlockCols>\ninline Block<Derived, BlockRows, BlockCols> block(Index startRow, Index startCol, \n                                                  Index blockRows, Index blockCols)\n{\n  return Block<Derived, BlockRows, BlockCols>(derived(), startRow, startCol, blockRows, blockCols);\n}\n\n/** This is the const version of block<>(Index, Index, Index, Index). */\ntemplate<int BlockRows, int BlockCols>\ninline const Block<const Derived, BlockRows, BlockCols> block(Index startRow, Index startCol,\n                                                              Index blockRows, Index blockCols) const\n{\n  return Block<const Derived, BlockRows, BlockCols>(derived(), startRow, startCol, blockRows, blockCols);\n}\n\n/** \\returns an expression of the \\a i-th column of *this. Note that the numbering starts at 0.\n  *\n  * Example: \\include MatrixBase_col.cpp\n  * Output: \\verbinclude MatrixBase_col.out\n  *\n  * \\sa row(), class Block */\ninline ColXpr col(Index i)\n{\n  return ColXpr(derived(), i);\n}\n\n/** This is the const version of col(). */\ninline ConstColXpr col(Index i) const\n{\n  return ConstColXpr(derived(), i);\n}\n\n/** \\returns an expression of the \\a i-th row of *this. Note that the numbering starts at 0.\n  *\n  * Example: \\include MatrixBase_row.cpp\n  * Output: \\verbinclude MatrixBase_row.out\n  *\n  * \\sa col(), class Block */\ninline RowXpr row(Index i)\n{\n  return RowXpr(derived(), i);\n}\n\n/** This is the const version of row(). */\ninline ConstRowXpr row(Index i) const\n{\n  return ConstRowXpr(derived(), i);\n}\n\n/** \\returns a dynamic-size expression of a segment (i.e. a vector block) in *this.\n  *\n  * \\only_for_vectors\n  *\n  * \\param start the first coefficient in the segment\n  * \\param n the number of coefficients in the segment\n  *\n  * Example: \\include MatrixBase_segment_int_int.cpp\n  * Output: \\verbinclude MatrixBase_segment_int_int.out\n  *\n  * \\note Even though the returned expression has dynamic size, in the case\n  * when it is applied to a fixed-size vector, it inherits a fixed maximal size,\n  * which means that evaluating it does not cause a dynamic memory allocation.\n  *\n  * \\sa class Block, segment(Index)\n  */\ninline SegmentReturnType segment(Index start, Index n)\n{\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)\n  return SegmentReturnType(derived(), start, n);\n}\n\n\n/** This is the const version of segment(Index,Index).*/\ninline ConstSegmentReturnType segment(Index start, Index n) const\n{\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)\n  return ConstSegmentReturnType(derived(), start, n);\n}\n\n/** \\returns a dynamic-size expression of the first coefficients of *this.\n  *\n  * \\only_for_vectors\n  *\n  * \\param n the number of coefficients in the segment\n  *\n  * Example: \\include MatrixBase_start_int.cpp\n  * Output: \\verbinclude MatrixBase_start_int.out\n  *\n  * \\note Even though the returned expression has dynamic size, in the case\n  * when it is applied to a fixed-size vector, it inherits a fixed maximal size,\n  * which means that evaluating it does not cause a dynamic memory allocation.\n  *\n  * \\sa class Block, block(Index,Index)\n  */\ninline SegmentReturnType head(Index n)\n{\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)\n  return SegmentReturnType(derived(), 0, n);\n}\n\n/** This is the const version of head(Index).*/\ninline ConstSegmentReturnType head(Index n) const\n{\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)\n  return ConstSegmentReturnType(derived(), 0, n);\n}\n\n/** \\returns a dynamic-size expression of the last coefficients of *this.\n  *\n  * \\only_for_vectors\n  *\n  * \\param n the number of coefficients in the segment\n  *\n  * Example: \\include MatrixBase_end_int.cpp\n  * Output: \\verbinclude MatrixBase_end_int.out\n  *\n  * \\note Even though the returned expression has dynamic size, in the case\n  * when it is applied to a fixed-size vector, it inherits a fixed maximal size,\n  * which means that evaluating it does not cause a dynamic memory allocation.\n  *\n  * \\sa class Block, block(Index,Index)\n  */\ninline SegmentReturnType tail(Index n)\n{\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)\n  return SegmentReturnType(derived(), this->size() - n, n);\n}\n\n/** This is the const version of tail(Index).*/\ninline ConstSegmentReturnType tail(Index n) const\n{\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)\n  return ConstSegmentReturnType(derived(), this->size() - n, n);\n}\n\n/** \\returns a fixed-size expression of a segment (i.e. a vector block) in \\c *this\n  *\n  * \\only_for_vectors\n  *\n  * \\tparam N the number of coefficients in the segment as specified at compile-time\n  * \\param start the index of the first element in the segment\n  * \\param n the number of coefficients in the segment as specified at compile-time\n  *\n  * The compile-time and run-time information should not contradict. In other words,\n  * \\a n should equal \\a N unless \\a N is \\a Dynamic.\n  *\n  * Example: \\include MatrixBase_template_int_segment.cpp\n  * Output: \\verbinclude MatrixBase_template_int_segment.out\n  *\n  * \\sa class Block\n  */\ntemplate<int N>\ninline typename FixedSegmentReturnType<N>::Type segment(Index start, Index n = N)\n{\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)\n  return typename FixedSegmentReturnType<N>::Type(derived(), start, n);\n}\n\n/** This is the const version of segment<int>(Index).*/\ntemplate<int N>\ninline typename ConstFixedSegmentReturnType<N>::Type segment(Index start, Index n = N) const\n{\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)\n  return typename ConstFixedSegmentReturnType<N>::Type(derived(), start, n);\n}\n\n/** \\returns a fixed-size expression of the first coefficients of *this.\n  *\n  * \\only_for_vectors\n  *\n  * \\tparam N the number of coefficients in the segment as specified at compile-time\n  * \\param  n the number of coefficients in the segment as specified at run-time\n  *\n  * The compile-time and run-time information should not contradict. In other words,\n  * \\a n should equal \\a N unless \\a N is \\a Dynamic.\n  *\n  * Example: \\include MatrixBase_template_int_start.cpp\n  * Output: \\verbinclude MatrixBase_template_int_start.out\n  *\n  * \\sa class Block\n  */\ntemplate<int N>\ninline typename FixedSegmentReturnType<N>::Type head(Index n = N)\n{\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)\n  return typename FixedSegmentReturnType<N>::Type(derived(), 0, n);\n}\n\n/** This is the const version of head<int>().*/\ntemplate<int N>\ninline typename ConstFixedSegmentReturnType<N>::Type head(Index n = N) const\n{\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)\n  return typename ConstFixedSegmentReturnType<N>::Type(derived(), 0, n);\n}\n\n/** \\returns a fixed-size expression of the last coefficients of *this.\n  *\n  * \\only_for_vectors\n  *\n  * \\tparam N the number of coefficients in the segment as specified at compile-time\n  * \\param  n the number of coefficients in the segment as specified at run-time\n  *\n  * The compile-time and run-time information should not contradict. In other words,\n  * \\a n should equal \\a N unless \\a N is \\a Dynamic.\n  *\n  * Example: \\include MatrixBase_template_int_end.cpp\n  * Output: \\verbinclude MatrixBase_template_int_end.out\n  *\n  * \\sa class Block\n  */\ntemplate<int N>\ninline typename FixedSegmentReturnType<N>::Type tail(Index n = N)\n{\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)\n  return typename FixedSegmentReturnType<N>::Type(derived(), size() - n);\n}\n\n/** This is the const version of tail<int>.*/\ntemplate<int N>\ninline typename ConstFixedSegmentReturnType<N>::Type tail(Index n = N) const\n{\n  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)\n  return typename ConstFixedSegmentReturnType<N>::Type(derived(), size() - n);\n}\n"
  },
  {
    "path": "libs/eigen/Eigen/src/plugins/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_plugins_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_plugins_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/plugins COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/Eigen/src/plugins/CommonCwiseBinaryOps.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n// This file is a base class plugin containing common coefficient wise functions.\n\n/** \\returns an expression of the difference of \\c *this and \\a other\n  *\n  * \\note If you want to substract a given scalar from all coefficients, see Cwise::operator-().\n  *\n  * \\sa class CwiseBinaryOp, operator-=()\n  */\nEIGEN_MAKE_CWISE_BINARY_OP(operator-,internal::scalar_difference_op)\n\n/** \\returns an expression of the sum of \\c *this and \\a other\n  *\n  * \\note If you want to add a given scalar to all coefficients, see Cwise::operator+().\n  *\n  * \\sa class CwiseBinaryOp, operator+=()\n  */\nEIGEN_MAKE_CWISE_BINARY_OP(operator+,internal::scalar_sum_op)\n\n/** \\returns an expression of a custom coefficient-wise operator \\a func of *this and \\a other\n  *\n  * The template parameter \\a CustomBinaryOp is the type of the functor\n  * of the custom operator (see class CwiseBinaryOp for an example)\n  *\n  * Here is an example illustrating the use of custom functors:\n  * \\include class_CwiseBinaryOp.cpp\n  * Output: \\verbinclude class_CwiseBinaryOp.out\n  *\n  * \\sa class CwiseBinaryOp, operator+(), operator-(), cwiseProduct()\n  */\ntemplate<typename CustomBinaryOp, typename OtherDerived>\nEIGEN_STRONG_INLINE const CwiseBinaryOp<CustomBinaryOp, const Derived, const OtherDerived>\nbinaryExpr(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other, const CustomBinaryOp& func = CustomBinaryOp()) const\n{\n  return CwiseBinaryOp<CustomBinaryOp, const Derived, const OtherDerived>(derived(), other.derived(), func);\n}\n\n"
  },
  {
    "path": "libs/eigen/Eigen/src/plugins/CommonCwiseUnaryOps.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n// This file is a base class plugin containing common coefficient wise functions.\n\n#ifndef EIGEN_PARSED_BY_DOXYGEN\n\n/** \\internal Represents a scalar multiple of an expression */\ntypedef CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const Derived> ScalarMultipleReturnType;\n/** \\internal Represents a quotient of an expression by a scalar*/\ntypedef CwiseUnaryOp<internal::scalar_quotient1_op<Scalar>, const Derived> ScalarQuotient1ReturnType;\n/** \\internal the return type of conjugate() */\ntypedef typename internal::conditional<NumTraits<Scalar>::IsComplex,\n                    const CwiseUnaryOp<internal::scalar_conjugate_op<Scalar>, const Derived>,\n                    const Derived&\n                  >::type ConjugateReturnType;\n/** \\internal the return type of real() const */\ntypedef typename internal::conditional<NumTraits<Scalar>::IsComplex,\n                    const CwiseUnaryOp<internal::scalar_real_op<Scalar>, const Derived>,\n                    const Derived&\n                  >::type RealReturnType;\n/** \\internal the return type of real() */\ntypedef typename internal::conditional<NumTraits<Scalar>::IsComplex,\n                    CwiseUnaryView<internal::scalar_real_ref_op<Scalar>, Derived>,\n                    Derived&\n                  >::type NonConstRealReturnType;\n/** \\internal the return type of imag() const */\ntypedef CwiseUnaryOp<internal::scalar_imag_op<Scalar>, const Derived> ImagReturnType;\n/** \\internal the return type of imag() */\ntypedef CwiseUnaryView<internal::scalar_imag_ref_op<Scalar>, Derived> NonConstImagReturnType;\n\n#endif // not EIGEN_PARSED_BY_DOXYGEN\n\n/** \\returns an expression of the opposite of \\c *this\n  */\ninline const CwiseUnaryOp<internal::scalar_opposite_op<typename internal::traits<Derived>::Scalar>, const Derived>\noperator-() const { return derived(); }\n\n\n/** \\returns an expression of \\c *this scaled by the scalar factor \\a scalar */\ninline const ScalarMultipleReturnType\noperator*(const Scalar& scalar) const\n{\n  return CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const Derived>\n    (derived(), internal::scalar_multiple_op<Scalar>(scalar));\n}\n\n#ifdef EIGEN_PARSED_BY_DOXYGEN\nconst ScalarMultipleReturnType operator*(const RealScalar& scalar) const;\n#endif\n\n/** \\returns an expression of \\c *this divided by the scalar value \\a scalar */\ninline const CwiseUnaryOp<internal::scalar_quotient1_op<typename internal::traits<Derived>::Scalar>, const Derived>\noperator/(const Scalar& scalar) const\n{\n  return CwiseUnaryOp<internal::scalar_quotient1_op<Scalar>, const Derived>\n    (derived(), internal::scalar_quotient1_op<Scalar>(scalar));\n}\n\n/** Overloaded for efficient real matrix times complex scalar value */\ninline const CwiseUnaryOp<internal::scalar_multiple2_op<Scalar,std::complex<Scalar> >, const Derived>\noperator*(const std::complex<Scalar>& scalar) const\n{\n  return CwiseUnaryOp<internal::scalar_multiple2_op<Scalar,std::complex<Scalar> >, const Derived>\n    (*static_cast<const Derived*>(this), internal::scalar_multiple2_op<Scalar,std::complex<Scalar> >(scalar));\n}\n\ninline friend const ScalarMultipleReturnType\noperator*(const Scalar& scalar, const StorageBaseType& matrix)\n{ return matrix*scalar; }\n\ninline friend const CwiseUnaryOp<internal::scalar_multiple2_op<Scalar,std::complex<Scalar> >, const Derived>\noperator*(const std::complex<Scalar>& scalar, const StorageBaseType& matrix)\n{ return matrix*scalar; }\n\n/** \\returns an expression of *this with the \\a Scalar type casted to\n  * \\a NewScalar.\n  *\n  * The template parameter \\a NewScalar is the type we are casting the scalars to.\n  *\n  * \\sa class CwiseUnaryOp\n  */\ntemplate<typename NewType>\ntypename internal::cast_return_type<Derived,const CwiseUnaryOp<internal::scalar_cast_op<typename internal::traits<Derived>::Scalar, NewType>, const Derived> >::type\ncast() const\n{\n  return derived();\n}\n\n/** \\returns an expression of the complex conjugate of \\c *this.\n  *\n  * \\sa adjoint() */\ninline ConjugateReturnType\nconjugate() const\n{\n  return ConjugateReturnType(derived());\n}\n\n/** \\returns a read-only expression of the real part of \\c *this.\n  *\n  * \\sa imag() */\ninline RealReturnType\nreal() const { return derived(); }\n\n/** \\returns an read-only expression of the imaginary part of \\c *this.\n  *\n  * \\sa real() */\ninline const ImagReturnType\nimag() const { return derived(); }\n\n/** \\brief Apply a unary operator coefficient-wise\n  * \\param[in]  func  Functor implementing the unary operator\n  * \\tparam  CustomUnaryOp Type of \\a func  \n  * \\returns An expression of a custom coefficient-wise unary operator \\a func of *this\n  *\n  * The function \\c ptr_fun() from the C++ standard library can be used to make functors out of normal functions.\n  *\n  * Example:\n  * \\include class_CwiseUnaryOp_ptrfun.cpp\n  * Output: \\verbinclude class_CwiseUnaryOp_ptrfun.out\n  *\n  * Genuine functors allow for more possibilities, for instance it may contain a state.\n  *\n  * Example:\n  * \\include class_CwiseUnaryOp.cpp\n  * Output: \\verbinclude class_CwiseUnaryOp.out\n  *\n  * \\sa class CwiseUnaryOp, class CwiseBinaryOp\n  */\ntemplate<typename CustomUnaryOp>\ninline const CwiseUnaryOp<CustomUnaryOp, const Derived>\nunaryExpr(const CustomUnaryOp& func = CustomUnaryOp()) const\n{\n  return CwiseUnaryOp<CustomUnaryOp, const Derived>(derived(), func);\n}\n\n/** \\returns an expression of a custom coefficient-wise unary operator \\a func of *this\n  *\n  * The template parameter \\a CustomUnaryOp is the type of the functor\n  * of the custom unary operator.\n  *\n  * Example:\n  * \\include class_CwiseUnaryOp.cpp\n  * Output: \\verbinclude class_CwiseUnaryOp.out\n  *\n  * \\sa class CwiseUnaryOp, class CwiseBinaryOp\n  */\ntemplate<typename CustomViewOp>\ninline const CwiseUnaryView<CustomViewOp, const Derived>\nunaryViewExpr(const CustomViewOp& func = CustomViewOp()) const\n{\n  return CwiseUnaryView<CustomViewOp, const Derived>(derived(), func);\n}\n\n/** \\returns a non const expression of the real part of \\c *this.\n  *\n  * \\sa imag() */\ninline NonConstRealReturnType\nreal() { return derived(); }\n\n/** \\returns a non const expression of the imaginary part of \\c *this.\n  *\n  * \\sa real() */\ninline NonConstImagReturnType\nimag() { return derived(); }\n"
  },
  {
    "path": "libs/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n// This file is a base class plugin containing matrix specifics coefficient wise functions.\n\n/** \\returns an expression of the Schur product (coefficient wise product) of *this and \\a other\n  *\n  * Example: \\include MatrixBase_cwiseProduct.cpp\n  * Output: \\verbinclude MatrixBase_cwiseProduct.out\n  *\n  * \\sa class CwiseBinaryOp, cwiseAbs2\n  */\ntemplate<typename OtherDerived>\nEIGEN_STRONG_INLINE const EIGEN_CWISE_PRODUCT_RETURN_TYPE(Derived,OtherDerived)\ncwiseProduct(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const\n{\n  return EIGEN_CWISE_PRODUCT_RETURN_TYPE(Derived,OtherDerived)(derived(), other.derived());\n}\n\n/** \\returns an expression of the coefficient-wise == operator of *this and \\a other\n  *\n  * \\warning this performs an exact comparison, which is generally a bad idea with floating-point types.\n  * In order to check for equality between two vectors or matrices with floating-point coefficients, it is\n  * generally a far better idea to use a fuzzy comparison as provided by isApprox() and\n  * isMuchSmallerThan().\n  *\n  * Example: \\include MatrixBase_cwiseEqual.cpp\n  * Output: \\verbinclude MatrixBase_cwiseEqual.out\n  *\n  * \\sa cwiseNotEqual(), isApprox(), isMuchSmallerThan()\n  */\ntemplate<typename OtherDerived>\ninline const CwiseBinaryOp<std::equal_to<Scalar>, const Derived, const OtherDerived>\ncwiseEqual(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const\n{\n  return CwiseBinaryOp<std::equal_to<Scalar>, const Derived, const OtherDerived>(derived(), other.derived());\n}\n\n/** \\returns an expression of the coefficient-wise != operator of *this and \\a other\n  *\n  * \\warning this performs an exact comparison, which is generally a bad idea with floating-point types.\n  * In order to check for equality between two vectors or matrices with floating-point coefficients, it is\n  * generally a far better idea to use a fuzzy comparison as provided by isApprox() and\n  * isMuchSmallerThan().\n  *\n  * Example: \\include MatrixBase_cwiseNotEqual.cpp\n  * Output: \\verbinclude MatrixBase_cwiseNotEqual.out\n  *\n  * \\sa cwiseEqual(), isApprox(), isMuchSmallerThan()\n  */\ntemplate<typename OtherDerived>\ninline const CwiseBinaryOp<std::not_equal_to<Scalar>, const Derived, const OtherDerived>\ncwiseNotEqual(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const\n{\n  return CwiseBinaryOp<std::not_equal_to<Scalar>, const Derived, const OtherDerived>(derived(), other.derived());\n}\n\n/** \\returns an expression of the coefficient-wise min of *this and \\a other\n  *\n  * Example: \\include MatrixBase_cwiseMin.cpp\n  * Output: \\verbinclude MatrixBase_cwiseMin.out\n  *\n  * \\sa class CwiseBinaryOp, max()\n  */\ntemplate<typename OtherDerived>\nEIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_min_op<Scalar>, const Derived, const OtherDerived>\ncwiseMin(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const\n{\n  return CwiseBinaryOp<internal::scalar_min_op<Scalar>, const Derived, const OtherDerived>(derived(), other.derived());\n}\n\n/** \\returns an expression of the coefficient-wise min of *this and scalar \\a other\n  *\n  * \\sa class CwiseBinaryOp, min()\n  */\nEIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_min_op<Scalar>, const Derived, const ConstantReturnType>\ncwiseMin(const Scalar &other) const\n{\n  return cwiseMin(Derived::Constant(rows(), cols(), other));\n}\n\n/** \\returns an expression of the coefficient-wise max of *this and \\a other\n  *\n  * Example: \\include MatrixBase_cwiseMax.cpp\n  * Output: \\verbinclude MatrixBase_cwiseMax.out\n  *\n  * \\sa class CwiseBinaryOp, min()\n  */\ntemplate<typename OtherDerived>\nEIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_max_op<Scalar>, const Derived, const OtherDerived>\ncwiseMax(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const\n{\n  return CwiseBinaryOp<internal::scalar_max_op<Scalar>, const Derived, const OtherDerived>(derived(), other.derived());\n}\n\n/** \\returns an expression of the coefficient-wise max of *this and scalar \\a other\n  *\n  * \\sa class CwiseBinaryOp, min()\n  */\nEIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_max_op<Scalar>, const Derived, const ConstantReturnType>\ncwiseMax(const Scalar &other) const\n{\n  return cwiseMax(Derived::Constant(rows(), cols(), other));\n}\n\n\n/** \\returns an expression of the coefficient-wise quotient of *this and \\a other\n  *\n  * Example: \\include MatrixBase_cwiseQuotient.cpp\n  * Output: \\verbinclude MatrixBase_cwiseQuotient.out\n  *\n  * \\sa class CwiseBinaryOp, cwiseProduct(), cwiseInverse()\n  */\ntemplate<typename OtherDerived>\nEIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_quotient_op<Scalar>, const Derived, const OtherDerived>\ncwiseQuotient(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const\n{\n  return CwiseBinaryOp<internal::scalar_quotient_op<Scalar>, const Derived, const OtherDerived>(derived(), other.derived());\n}\n\ntypedef CwiseBinaryOp<internal::scalar_cmp_op<Scalar,internal::cmp_EQ>, const Derived, const ConstantReturnType> CwiseScalarEqualReturnType;\n\n/** \\returns an expression of the coefficient-wise == operator of \\c *this and a scalar \\a s\n  *\n  * \\warning this performs an exact comparison, which is generally a bad idea with floating-point types.\n  * In order to check for equality between two vectors or matrices with floating-point coefficients, it is\n  * generally a far better idea to use a fuzzy comparison as provided by isApprox() and\n  * isMuchSmallerThan().\n  *\n  * \\sa cwiseEqual(const MatrixBase<OtherDerived> &) const\n  */\ninline const CwiseScalarEqualReturnType\ncwiseEqual(const Scalar& s) const\n{\n  return CwiseScalarEqualReturnType(derived(), Derived::Constant(rows(), cols(), s), internal::scalar_cmp_op<Scalar,internal::cmp_EQ>());\n}\n"
  },
  {
    "path": "libs/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n// This file is a base class plugin containing matrix specifics coefficient wise functions.\n\n/** \\returns an expression of the coefficient-wise absolute value of \\c *this\n  *\n  * Example: \\include MatrixBase_cwiseAbs.cpp\n  * Output: \\verbinclude MatrixBase_cwiseAbs.out\n  *\n  * \\sa cwiseAbs2()\n  */\nEIGEN_STRONG_INLINE const CwiseUnaryOp<internal::scalar_abs_op<Scalar>, const Derived>\ncwiseAbs() const { return derived(); }\n\n/** \\returns an expression of the coefficient-wise squared absolute value of \\c *this\n  *\n  * Example: \\include MatrixBase_cwiseAbs2.cpp\n  * Output: \\verbinclude MatrixBase_cwiseAbs2.out\n  *\n  * \\sa cwiseAbs()\n  */\nEIGEN_STRONG_INLINE const CwiseUnaryOp<internal::scalar_abs2_op<Scalar>, const Derived>\ncwiseAbs2() const { return derived(); }\n\n/** \\returns an expression of the coefficient-wise square root of *this.\n  *\n  * Example: \\include MatrixBase_cwiseSqrt.cpp\n  * Output: \\verbinclude MatrixBase_cwiseSqrt.out\n  *\n  * \\sa cwisePow(), cwiseSquare()\n  */\ninline const CwiseUnaryOp<internal::scalar_sqrt_op<Scalar>, const Derived>\ncwiseSqrt() const { return derived(); }\n\n/** \\returns an expression of the coefficient-wise inverse of *this.\n  *\n  * Example: \\include MatrixBase_cwiseInverse.cpp\n  * Output: \\verbinclude MatrixBase_cwiseInverse.out\n  *\n  * \\sa cwiseProduct()\n  */\ninline const CwiseUnaryOp<internal::scalar_inverse_op<Scalar>, const Derived>\ncwiseInverse() const { return derived(); }\n\n"
  },
  {
    "path": "libs/eigen/INSTALL",
    "content": "Installation instructions for Eigen\n***********************************\n\nExplanation before starting\n***************************\n\nEigen consists only of header files, hence there is nothing to compile\nbefore you can use it. Moreover, these header files do not depend on your\nplatform, they are the same for everybody.\n\nMethod 1. Installing without using CMake\n****************************************\n\nYou can use right away the headers in the Eigen/ subdirectory. In order\nto install, just copy this Eigen/ subdirectory to your favorite location.\nIf you also want the unsupported features, copy the unsupported/\nsubdirectory too.\n\nMethod 2. Installing using CMake\n********************************\n\nLet's call this directory 'source_dir' (where this INSTALL file is).\nBefore starting, create another directory which we will call 'build_dir'.\n\nDo:\n\n  cd build_dir\n  cmake source_dir\n  make install\n\nThe \"make install\" step may require administrator privileges.\n\nYou can adjust the installation destination (the \"prefix\")\nby passing the -DCMAKE_INSTALL_PREFIX=myprefix option to cmake, as is\nexplained in the message that cmake prints at the end.\n"
  },
  {
    "path": "libs/eigen/bench/BenchSparseUtil.h",
    "content": "\n#include <Eigen/Sparse>\n#include <bench/BenchTimer.h>\n#include <set>\n\nusing namespace std;\nusing namespace Eigen;\nusing namespace Eigen;\n\n#ifndef SIZE\n#define SIZE 1024\n#endif\n\n#ifndef DENSITY\n#define DENSITY 0.01\n#endif\n\n#ifndef SCALAR\n#define SCALAR double\n#endif\n\ntypedef SCALAR Scalar;\ntypedef Matrix<Scalar,Dynamic,Dynamic> DenseMatrix;\ntypedef Matrix<Scalar,Dynamic,1> DenseVector;\ntypedef SparseMatrix<Scalar> EigenSparseMatrix;\n\nvoid fillMatrix(float density, int rows, int cols,  EigenSparseMatrix& dst)\n{\n  dst.reserve(double(rows)*cols*density);\n  for(int j = 0; j < cols; j++)\n  {\n    for(int i = 0; i < rows; i++)\n    {\n      Scalar v = (internal::random<float>(0,1) < density) ? internal::random<Scalar>() : 0;\n      if (v!=0)\n        dst.insert(i,j) = v;\n    }\n  }\n  dst.finalize();\n}\n\nvoid fillMatrix2(int nnzPerCol, int rows, int cols,  EigenSparseMatrix& dst)\n{\n//   std::cout << \"alloc \" << nnzPerCol*cols << \"\\n\";\n  dst.reserve(nnzPerCol*cols);\n  for(int j = 0; j < cols; j++)\n  {\n    std::set<int> aux;\n    for(int i = 0; i < nnzPerCol; i++)\n    {\n      int k = internal::random<int>(0,rows-1);\n      while (aux.find(k)!=aux.end())\n        k = internal::random<int>(0,rows-1);\n      aux.insert(k);\n\n      dst.insert(k,j) = internal::random<Scalar>();\n    }\n  }\n  dst.finalize();\n}\n\nvoid eiToDense(const EigenSparseMatrix& src, DenseMatrix& dst)\n{\n  dst.setZero();\n  for (int j=0; j<src.cols(); ++j)\n    for (EigenSparseMatrix::InnerIterator it(src.derived(), j); it; ++it)\n      dst(it.index(),j) = it.value();\n}\n\n#ifndef NOGMM\n#include \"gmm/gmm.h\"\ntypedef gmm::csc_matrix<Scalar> GmmSparse;\ntypedef gmm::col_matrix< gmm::wsvector<Scalar> > GmmDynSparse;\nvoid eiToGmm(const EigenSparseMatrix& src, GmmSparse& dst)\n{\n  GmmDynSparse tmp(src.rows(), src.cols());\n  for (int j=0; j<src.cols(); ++j)\n    for (EigenSparseMatrix::InnerIterator it(src.derived(), j); it; ++it)\n      tmp(it.index(),j) = it.value();\n  gmm::copy(tmp, dst);\n}\n#endif\n\n#ifndef NOMTL\n#include <boost/numeric/mtl/mtl.hpp>\ntypedef mtl::compressed2D<Scalar, mtl::matrix::parameters<mtl::tag::col_major> > MtlSparse;\ntypedef mtl::compressed2D<Scalar, mtl::matrix::parameters<mtl::tag::row_major> > MtlSparseRowMajor;\nvoid eiToMtl(const EigenSparseMatrix& src, MtlSparse& dst)\n{\n  mtl::matrix::inserter<MtlSparse> ins(dst);\n  for (int j=0; j<src.cols(); ++j)\n    for (EigenSparseMatrix::InnerIterator it(src.derived(), j); it; ++it)\n      ins[it.index()][j] = it.value();\n}\n#endif\n\n#ifdef CSPARSE\nextern \"C\" {\n#include \"cs.h\"\n}\nvoid eiToCSparse(const EigenSparseMatrix& src, cs* &dst)\n{\n  cs* aux = cs_spalloc (0, 0, 1, 1, 1);\n  for (int j=0; j<src.cols(); ++j)\n    for (EigenSparseMatrix::InnerIterator it(src.derived(), j); it; ++it)\n      if (!cs_entry(aux, it.index(), j, it.value()))\n      {\n        std::cout << \"cs_entry error\\n\";\n        exit(2);\n      }\n   dst = cs_compress(aux);\n//    cs_spfree(aux);\n}\n#endif // CSPARSE\n\n#ifndef NOUBLAS\n#include <boost/numeric/ublas/vector.hpp>\n#include <boost/numeric/ublas/matrix.hpp>\n#include <boost/numeric/ublas/io.hpp>\n#include <boost/numeric/ublas/triangular.hpp>\n#include <boost/numeric/ublas/vector_sparse.hpp>\n#include <boost/numeric/ublas/matrix_sparse.hpp>\n#include <boost/numeric/ublas/vector_of_vector.hpp>\n#include <boost/numeric/ublas/operation.hpp>\n\ntypedef boost::numeric::ublas::compressed_matrix<Scalar,boost::numeric::ublas::column_major> UBlasSparse;\n\nvoid eiToUblas(const EigenSparseMatrix& src, UBlasSparse& dst)\n{\n  dst.resize(src.rows(), src.cols(), false);\n  for (int j=0; j<src.cols(); ++j)\n    for (EigenSparseMatrix::InnerIterator it(src.derived(), j); it; ++it)\n      dst(it.index(),j) = it.value();\n}\n\ntemplate <typename EigenType, typename UblasType>\nvoid eiToUblasVec(const EigenType& src, UblasType& dst)\n{\n  dst.resize(src.size());\n  for (int j=0; j<src.size(); ++j)\n      dst[j] = src.coeff(j);\n}\n#endif\n\n#ifdef OSKI\nextern \"C\" {\n#include <oski/oski.h>\n}\n#endif\n"
  },
  {
    "path": "libs/eigen/bench/BenchTimer.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_BENCH_TIMERR_H\n#define EIGEN_BENCH_TIMERR_H\n\n#if defined(_WIN32) || defined(__CYGWIN__)\n# ifndef NOMINMAX\n#   define NOMINMAX\n#   define EIGEN_BT_UNDEF_NOMINMAX\n# endif\n# ifndef WIN32_LEAN_AND_MEAN\n#   define WIN32_LEAN_AND_MEAN\n#   define EIGEN_BT_UNDEF_WIN32_LEAN_AND_MEAN\n# endif\n# include <windows.h>\n#elif defined(__APPLE__)\n#include <CoreServices/CoreServices.h>\n#include <mach/mach_time.h>\n#else\n# include <unistd.h>\n#endif\n\n#include <Eigen/Core>\n\nnamespace Eigen\n{\n\nenum {\n  CPU_TIMER = 0,\n  REAL_TIMER = 1\n};\n\n/** Elapsed time timer keeping the best try.\n  *\n  * On POSIX platforms we use clock_gettime with CLOCK_PROCESS_CPUTIME_ID.\n  * On Windows we use QueryPerformanceCounter\n  *\n  * Important: on linux, you must link with -lrt\n  */\nclass BenchTimer\n{\npublic:\n\n  BenchTimer()\n  {\n#if defined(_WIN32) || defined(__CYGWIN__)\n    LARGE_INTEGER freq;\n    QueryPerformanceFrequency(&freq);\n    m_frequency = (double)freq.QuadPart;\n#endif\n    reset();\n  }\n\n  ~BenchTimer() {}\n\n  inline void reset()\n  {\n    m_bests.fill(1e9);\n    m_worsts.fill(0);\n    m_totals.setZero();\n  }\n  inline void start()\n  {\n    m_starts[CPU_TIMER]  = getCpuTime();\n    m_starts[REAL_TIMER] = getRealTime();\n  }\n  inline void stop()\n  {\n    m_times[CPU_TIMER] = getCpuTime() - m_starts[CPU_TIMER];\n    m_times[REAL_TIMER] = getRealTime() - m_starts[REAL_TIMER];\n    #if EIGEN_VERSION_AT_LEAST(2,90,0)\n    m_bests = m_bests.cwiseMin(m_times);\n    m_worsts = m_worsts.cwiseMax(m_times);\n    #else\n    m_bests(0) = std::min(m_bests(0),m_times(0));\n    m_bests(1) = std::min(m_bests(1),m_times(1));\n    m_worsts(0) = std::max(m_worsts(0),m_times(0));\n    m_worsts(1) = std::max(m_worsts(1),m_times(1));\n    #endif\n    m_totals += m_times;\n  }\n\n  /** Return the elapsed time in seconds between the last start/stop pair\n    */\n  inline double value(int TIMER = CPU_TIMER) const\n  {\n    return m_times[TIMER];\n  }\n\n  /** Return the best elapsed time in seconds\n    */\n  inline double best(int TIMER = CPU_TIMER) const\n  {\n    return m_bests[TIMER];\n  }\n\n  /** Return the worst elapsed time in seconds\n    */\n  inline double worst(int TIMER = CPU_TIMER) const\n  {\n    return m_worsts[TIMER];\n  }\n\n  /** Return the total elapsed time in seconds.\n    */\n  inline double total(int TIMER = CPU_TIMER) const\n  {\n    return m_totals[TIMER];\n  }\n\n  inline double getCpuTime() const\n  {\n#ifdef _WIN32\n    LARGE_INTEGER query_ticks;\n    QueryPerformanceCounter(&query_ticks);\n    return query_ticks.QuadPart/m_frequency;\n#elif __APPLE__\n    return double(mach_absolute_time())*1e-9;\n#else\n    timespec ts;\n    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts);\n    return double(ts.tv_sec) + 1e-9 * double(ts.tv_nsec);\n#endif\n  }\n\n  inline double getRealTime() const\n  {\n#ifdef _WIN32\n    SYSTEMTIME st;\n    GetSystemTime(&st);\n    return (double)st.wSecond + 1.e-3 * (double)st.wMilliseconds;\n#elif __APPLE__\n    return double(mach_absolute_time())*1e-9;\n#else\n    timespec ts;\n    clock_gettime(CLOCK_REALTIME, &ts);\n    return double(ts.tv_sec) + 1e-9 * double(ts.tv_nsec);\n#endif\n  }\n\nprotected:\n#if defined(_WIN32) || defined(__CYGWIN__)\n  double m_frequency;\n#endif\n  Vector2d m_starts;\n  Vector2d m_times;\n  Vector2d m_bests;\n  Vector2d m_worsts;\n  Vector2d m_totals;\n\npublic:\n  EIGEN_MAKE_ALIGNED_OPERATOR_NEW\n};\n\n#define BENCH(TIMER,TRIES,REP,CODE) { \\\n    TIMER.reset(); \\\n    for(int uglyvarname1=0; uglyvarname1<TRIES; ++uglyvarname1){ \\\n      TIMER.start(); \\\n      for(int uglyvarname2=0; uglyvarname2<REP; ++uglyvarname2){ \\\n        CODE; \\\n      } \\\n      TIMER.stop(); \\\n    } \\\n  }\n\n}\n\n// clean #defined tokens\n#ifdef EIGEN_BT_UNDEF_NOMINMAX\n# undef EIGEN_BT_UNDEF_NOMINMAX\n# undef NOMINMAX\n#endif\n\n#ifdef EIGEN_BT_UNDEF_WIN32_LEAN_AND_MEAN\n# undef EIGEN_BT_UNDEF_WIN32_LEAN_AND_MEAN\n# undef WIN32_LEAN_AND_MEAN\n#endif\n\n#endif // EIGEN_BENCH_TIMERR_H\n"
  },
  {
    "path": "libs/eigen/bench/BenchUtil.h",
    "content": "\n#ifndef EIGEN_BENCH_UTIL_H\n#define EIGEN_BENCH_UTIL_H\n\n#include <Eigen/Core>\n#include \"BenchTimer.h\"\n\nusing namespace std;\nusing namespace Eigen;\n\n#include <boost/preprocessor/repetition/enum_params.hpp>\n#include <boost/preprocessor/repetition.hpp>\n#include <boost/preprocessor/seq.hpp>\n#include <boost/preprocessor/array.hpp>\n#include <boost/preprocessor/arithmetic.hpp>\n#include <boost/preprocessor/comparison.hpp>\n#include <boost/preprocessor/punctuation.hpp>\n#include <boost/preprocessor/punctuation/comma.hpp>\n#include <boost/preprocessor/stringize.hpp>\n\ntemplate<typename MatrixType> void initMatrix_random(MatrixType& mat) __attribute__((noinline));\ntemplate<typename MatrixType> void initMatrix_random(MatrixType& mat)\n{\n  mat.setRandom();// = MatrixType::random(mat.rows(), mat.cols());\n}\n\ntemplate<typename MatrixType> void initMatrix_identity(MatrixType& mat) __attribute__((noinline));\ntemplate<typename MatrixType> void initMatrix_identity(MatrixType& mat)\n{\n  mat.setIdentity();\n}\n\n#ifndef __INTEL_COMPILER\n#define DISABLE_SSE_EXCEPTIONS()  { \\\n  int aux; \\\n  asm( \\\n  \"stmxcsr   %[aux]           \\n\\t\" \\\n  \"orl       $32832, %[aux]   \\n\\t\" \\\n  \"ldmxcsr   %[aux]           \\n\\t\" \\\n  : : [aux] \"m\" (aux)); \\\n}\n#else\n#define DISABLE_SSE_EXCEPTIONS()  \n#endif\n\n#ifdef BENCH_GMM\n#include <gmm/gmm.h>\ntemplate <typename EigenMatrixType, typename GmmMatrixType>\nvoid eiToGmm(const EigenMatrixType& src, GmmMatrixType& dst)\n{\n  dst.resize(src.rows(),src.cols());\n  for (int j=0; j<src.cols(); ++j)\n    for (int i=0; i<src.rows(); ++i)\n      dst(i,j) = src.coeff(i,j);\n}\n#endif\n\n\n#ifdef BENCH_GSL\n#include <gsl/gsl_matrix.h>\n#include <gsl/gsl_linalg.h>\n#include <gsl/gsl_eigen.h>\ntemplate <typename EigenMatrixType>\nvoid eiToGsl(const EigenMatrixType& src, gsl_matrix** dst)\n{\n  for (int j=0; j<src.cols(); ++j)\n    for (int i=0; i<src.rows(); ++i)\n      gsl_matrix_set(*dst, i, j, src.coeff(i,j));\n}\n#endif\n\n#ifdef BENCH_UBLAS\n#include <boost/numeric/ublas/matrix.hpp>\n#include <boost/numeric/ublas/vector.hpp>\ntemplate <typename EigenMatrixType, typename UblasMatrixType>\nvoid eiToUblas(const EigenMatrixType& src, UblasMatrixType& dst)\n{\n  dst.resize(src.rows(),src.cols());\n  for (int j=0; j<src.cols(); ++j)\n    for (int i=0; i<src.rows(); ++i)\n      dst(i,j) = src.coeff(i,j);\n}\ntemplate <typename EigenType, typename UblasType>\nvoid eiToUblasVec(const EigenType& src, UblasType& dst)\n{\n  dst.resize(src.size());\n  for (int j=0; j<src.size(); ++j)\n      dst[j] = src.coeff(j);\n}\n#endif\n\n#endif // EIGEN_BENCH_UTIL_H\n"
  },
  {
    "path": "libs/eigen/bench/README.txt",
    "content": "\nThis folder contains a couple of benchmark utities and Eigen benchmarks.\n\n****************************\n* bench_multi_compilers.sh *\n****************************\n\nThis script allows to run a benchmark on a set of different compilers/compiler options.\nIt takes two arguments:\n - a file defining the list of the compilers with their options\n - the .cpp file of the benchmark\n\nExamples:\n\n$ ./bench_multi_compilers.sh basicbench.cxxlist basicbenchmark.cpp\n\n    g++-4.1 -O3 -DNDEBUG -finline-limit=10000\n    3d-3x3   /   4d-4x4   /   Xd-4x4   /   Xd-20x20   /\n    0.271102   0.131416   0.422322   0.198633\n    0.201658   0.102436   0.397566   0.207282\n\n    g++-4.2 -O3 -DNDEBUG -finline-limit=10000\n    3d-3x3   /   4d-4x4   /   Xd-4x4   /   Xd-20x20   /\n    0.107805   0.0890579   0.30265   0.161843\n    0.127157   0.0712581   0.278341   0.191029\n\n    g++-4.3 -O3 -DNDEBUG -finline-limit=10000\n    3d-3x3   /   4d-4x4   /   Xd-4x4   /   Xd-20x20   /\n    0.134318   0.105291   0.3704   0.180966\n    0.137703   0.0732472   0.31225   0.202204\n\n    icpc -fast -DNDEBUG -fno-exceptions -no-inline-max-size\n    3d-3x3   /   4d-4x4   /   Xd-4x4   /   Xd-20x20   /\n    0.226145   0.0941319   0.371873   0.159433\n    0.109302   0.0837538   0.328102   0.173891\n\n\n$ ./bench_multi_compilers.sh ompbench.cxxlist ompbenchmark.cpp\n\n    g++-4.2 -O3 -DNDEBUG -finline-limit=10000 -fopenmp\n    double, fixed-size 4x4: 0.00165105s  0.0778739s\n    double, 32x32: 0.0654769s 0.075289s  => x0.869674 (2)\n    double, 128x128: 0.054148s 0.0419669s  => x1.29025 (2)\n    double, 512x512: 0.913799s 0.428533s  => x2.13239 (2)\n    double, 1024x1024: 14.5972s 9.3542s  => x1.5605 (2)\n\n    icpc -fast -DNDEBUG -fno-exceptions -no-inline-max-size -openmp\n    double, fixed-size 4x4: 0.000589848s  0.019949s\n    double, 32x32: 0.0682781s 0.0449722s  => x1.51823 (2)\n    double, 128x128: 0.0547509s 0.0435519s  => x1.25714 (2)\n    double, 512x512: 0.829436s 0.424438s  => x1.9542 (2)\n    double, 1024x1024: 14.5243s 10.7735s  => x1.34815 (2)\n\n\n\n"
  },
  {
    "path": "libs/eigen/bench/basicbench.cxxlist",
    "content": "#!/bin/bash\n\n# CLIST[((g++))]=\"g++-3.4 -O3 -DNDEBUG\"\n# CLIST[((g++))]=\"g++-3.4 -O3 -DNDEBUG -finline-limit=20000\"\n\n# CLIST[((g++))]=\"g++-4.1 -O3 -DNDEBUG\"\n#CLIST[((g++))]=\"g++-4.1 -O3 -DNDEBUG -finline-limit=20000\"\n\n# CLIST[((g++))]=\"g++-4.2 -O3 -DNDEBUG\"\n#CLIST[((g++))]=\"g++-4.2 -O3 -DNDEBUG -finline-limit=20000\"\n# CLIST[((g++))]=\"g++-4.2 -O3 -DNDEBUG -finline-limit=20000 -fprofile-generate\"\n# CLIST[((g++))]=\"g++-4.2 -O3 -DNDEBUG -finline-limit=20000 -fprofile-use\"\n\n# CLIST[((g++))]=\"g++-4.3 -O3 -DNDEBUG\"\n#CLIST[((g++))]=\"g++-4.3 -O3 -DNDEBUG -finline-limit=20000\"\n# CLIST[((g++))]=\"g++-4.3 -O3 -DNDEBUG -finline-limit=20000 -fprofile-generate\"\n# CLIST[((g++))]=\"g++-4.3 -O3 -DNDEBUG -finline-limit=20000 -fprofile-use\"\n\n# CLIST[((g++))]=\"icpc -fast -DNDEBUG -fno-exceptions -no-inline-max-size -prof-genx\"\n# CLIST[((g++))]=\"icpc -fast -DNDEBUG -fno-exceptions -no-inline-max-size -prof-use\"\n\n#CLIST[((g++))]=\"/opt/intel/Compiler/11.1/072/bin/intel64/icpc -fast -DNDEBUG -fno-exceptions -no-inline-max-size -lrt\"\nCLIST[((g++))]=\"/home/orzel/svn/llvm/Release/bin/clang++ -O3 -DNDEBUG -DEIGEN_DONT_VECTORIZE -lrt\"\nCLIST[((g++))]=\"/home/orzel/svn/llvm/Release/bin/clang++ -O3 -DNDEBUG -lrt\"\nCLIST[((g++))]=\"g++-4.4.4 -O3 -DNDEBUG -DEIGEN_DONT_VECTORIZE -lrt\"\nCLIST[((g++))]=\"g++-4.4.4 -O3 -DNDEBUG -lrt\"\nCLIST[((g++))]=\"g++-4.5.0 -O3 -DNDEBUG -DEIGEN_DONT_VECTORIZE -lrt\"\nCLIST[((g++))]=\"g++-4.5.0 -O3 -DNDEBUG -lrt\"\n"
  },
  {
    "path": "libs/eigen/bench/basicbenchmark.cpp",
    "content": "\n#include <iostream>\n#include \"BenchUtil.h\"\n#include \"basicbenchmark.h\"\n\nint main(int argc, char *argv[])\n{\n  DISABLE_SSE_EXCEPTIONS();\n\n  // this is the list of matrix type and size we want to bench:\n  // ((suffix) (matrix size) (number of iterations))\n  #define MODES ((3d)(3)(4000000)) ((4d)(4)(1000000)) ((Xd)(4)(1000000)) ((Xd)(20)(10000))\n//   #define MODES ((Xd)(20)(10000))\n\n  #define _GENERATE_HEADER(R,ARG,EL) << BOOST_PP_STRINGIZE(BOOST_PP_SEQ_HEAD(EL)) << \"-\" \\\n    << BOOST_PP_STRINGIZE(BOOST_PP_SEQ_ELEM(1,EL)) << \"x\" \\\n    << BOOST_PP_STRINGIZE(BOOST_PP_SEQ_ELEM(1,EL)) << \"   /   \"\n\n  std::cout BOOST_PP_SEQ_FOR_EACH(_GENERATE_HEADER, ~, MODES ) << endl;\n\n  const int tries = 10;\n\n  #define _RUN_BENCH(R,ARG,EL) \\\n    std::cout << ARG( \\\n      BOOST_PP_CAT(Matrix, BOOST_PP_SEQ_HEAD(EL)) (\\\n         BOOST_PP_SEQ_ELEM(1,EL),BOOST_PP_SEQ_ELEM(1,EL)), BOOST_PP_SEQ_ELEM(2,EL), tries) \\\n    << \"   \";\n\n  BOOST_PP_SEQ_FOR_EACH(_RUN_BENCH, benchBasic<LazyEval>, MODES );\n  std::cout << endl;\n  BOOST_PP_SEQ_FOR_EACH(_RUN_BENCH, benchBasic<EarlyEval>, MODES );\n  std::cout << endl;\n\n  return 0;\n}\n"
  },
  {
    "path": "libs/eigen/bench/basicbenchmark.h",
    "content": "\n#ifndef EIGEN_BENCH_BASICBENCH_H\n#define EIGEN_BENCH_BASICBENCH_H\n\nenum {LazyEval, EarlyEval, OmpEval};\n\ntemplate<int Mode, typename MatrixType>\nvoid benchBasic_loop(const MatrixType& I, MatrixType& m, int iterations) __attribute__((noinline));\n\ntemplate<int Mode, typename MatrixType>\nvoid benchBasic_loop(const MatrixType& I, MatrixType& m, int iterations)\n{\n  for(int a = 0; a < iterations; a++)\n  {\n    if (Mode==LazyEval)\n    {\n      asm(\"#begin_bench_loop LazyEval\");\n      if (MatrixType::SizeAtCompileTime!=Eigen::Dynamic) asm(\"#fixedsize\");\n      m = (I + 0.00005 * (m + m.lazy() * m)).eval();\n    }\n    else if (Mode==OmpEval)\n    {\n      asm(\"#begin_bench_loop OmpEval\");\n      if (MatrixType::SizeAtCompileTime!=Eigen::Dynamic) asm(\"#fixedsize\");\n      m = (I + 0.00005 * (m + m.lazy() * m)).evalOMP();\n    }\n    else\n    {\n      asm(\"#begin_bench_loop EarlyEval\");\n      if (MatrixType::SizeAtCompileTime!=Eigen::Dynamic) asm(\"#fixedsize\");\n      m = I + 0.00005 * (m + m * m);\n    }\n    asm(\"#end_bench_loop\");\n  }\n}\n\ntemplate<int Mode, typename MatrixType>\ndouble benchBasic(const MatrixType& mat, int size, int tries) __attribute__((noinline));\n\ntemplate<int Mode, typename MatrixType>\ndouble benchBasic(const MatrixType& mat, int iterations, int tries)\n{\n  const int rows = mat.rows();\n  const int cols = mat.cols();\n\n  MatrixType I(rows,cols);\n  MatrixType m(rows,cols);\n\n  initMatrix_identity(I);\n\n  Eigen::BenchTimer timer;\n  for(uint t=0; t<tries; ++t)\n  {\n    initMatrix_random(m);\n    timer.start();\n    benchBasic_loop<Mode>(I, m, iterations);\n    timer.stop();\n    cerr << m;\n  }\n  return timer.value();\n};\n\n#endif // EIGEN_BENCH_BASICBENCH_H\n"
  },
  {
    "path": "libs/eigen/bench/benchBlasGemm.cpp",
    "content": "// g++ -O3 -DNDEBUG -I.. -L /usr/lib64/atlas/ benchBlasGemm.cpp -o benchBlasGemm -lrt -lcblas\n// possible options:\n//    -DEIGEN_DONT_VECTORIZE\n//    -msse2\n\n// #define EIGEN_DEFAULT_TO_ROW_MAJOR\n#define _FLOAT\n\n#include <iostream>\n\n#include <Eigen/Core>\n#include \"BenchTimer.h\"\n\n// include the BLAS headers\nextern \"C\" {\n#include <cblas.h>\n}\n#include <string>\n\n#ifdef _FLOAT\ntypedef float Scalar;\n#define CBLAS_GEMM cblas_sgemm\n#else\ntypedef double Scalar;\n#define CBLAS_GEMM cblas_dgemm\n#endif\n\n\ntypedef Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic> MyMatrix;\nvoid bench_eigengemm(MyMatrix& mc, const MyMatrix& ma, const MyMatrix& mb, int nbloops);\nvoid check_product(int M, int N, int K);\nvoid check_product(void);\n\nint main(int argc, char *argv[])\n{\n  // disable SSE exceptions\n  #ifdef __GNUC__\n  {\n    int aux;\n    asm(\n    \"stmxcsr   %[aux]           \\n\\t\"\n    \"orl       $32832, %[aux]   \\n\\t\"\n    \"ldmxcsr   %[aux]           \\n\\t\"\n    : : [aux] \"m\" (aux));\n  }\n  #endif\n\n  int nbtries=1, nbloops=1, M, N, K;\n\n  if (argc==2)\n  {\n    if (std::string(argv[1])==\"check\")\n      check_product();\n    else\n      M = N = K = atoi(argv[1]);\n  }\n  else if ((argc==3) && (std::string(argv[1])==\"auto\"))\n  {\n    M = N = K = atoi(argv[2]);\n    nbloops = 1000000000/(M*M*M);\n    if (nbloops<1)\n      nbloops = 1;\n    nbtries = 6;\n  }\n  else if (argc==4)\n  {\n    M = N = K = atoi(argv[1]);\n    nbloops = atoi(argv[2]);\n    nbtries = atoi(argv[3]);\n  }\n  else if (argc==6)\n  {\n    M = atoi(argv[1]);\n    N = atoi(argv[2]);\n    K = atoi(argv[3]);\n    nbloops = atoi(argv[4]);\n    nbtries = atoi(argv[5]);\n  }\n  else\n  {\n    std::cout << \"Usage: \" << argv[0] << \" size  \\n\";\n    std::cout << \"Usage: \" << argv[0] << \" auto size\\n\";\n    std::cout << \"Usage: \" << argv[0] << \" size nbloops nbtries\\n\";\n    std::cout << \"Usage: \" << argv[0] << \" M N K nbloops nbtries\\n\";\n    std::cout << \"Usage: \" << argv[0] << \" check\\n\";\n    std::cout << \"Options:\\n\";\n    std::cout << \"    size       unique size of the 2 matrices (integer)\\n\";\n    std::cout << \"    auto       automatically set the number of repetitions and tries\\n\";\n    std::cout << \"    nbloops    number of times the GEMM routines is executed\\n\";\n    std::cout << \"    nbtries    number of times the loop is benched (return the best try)\\n\";\n    std::cout << \"    M N K      sizes of the matrices: MxN  =  MxK * KxN (integers)\\n\";\n    std::cout << \"    check      check eigen product using cblas as a reference\\n\";\n    exit(1);\n  }\n\n  double nbmad = double(M) * double(N) * double(K) * double(nbloops);\n\n  if (!(std::string(argv[1])==\"auto\"))\n    std::cout << M << \" x \" << N << \" x \" << K << \"\\n\";\n\n  Scalar alpha, beta;\n  MyMatrix ma(M,K), mb(K,N), mc(M,N);\n  ma = MyMatrix::Random(M,K);\n  mb = MyMatrix::Random(K,N);\n  mc = MyMatrix::Random(M,N);\n\n  Eigen::BenchTimer timer;\n\n  // we simply compute c += a*b, so:\n  alpha = 1;\n  beta = 1;\n\n  // bench cblas\n  // ROWS_A, COLS_B, COLS_A, 1.0,  A, COLS_A, B, COLS_B, 0.0, C, COLS_B);\n  if (!(std::string(argv[1])==\"auto\"))\n  {\n    timer.reset();\n    for (uint k=0 ; k<nbtries ; ++k)\n    {\n        timer.start();\n        for (uint j=0 ; j<nbloops ; ++j)\n              #ifdef EIGEN_DEFAULT_TO_ROW_MAJOR\n              CBLAS_GEMM(CblasRowMajor, CblasNoTrans, CblasNoTrans, M, N, K, alpha, ma.data(), K, mb.data(), N, beta, mc.data(), N);\n              #else\n              CBLAS_GEMM(CblasColMajor, CblasNoTrans, CblasNoTrans, M, N, K, alpha, ma.data(), M, mb.data(), K, beta, mc.data(), M);\n              #endif\n        timer.stop();\n    }\n    if (!(std::string(argv[1])==\"auto\"))\n      std::cout << \"cblas: \" << timer.value() << \" (\" << 1e-3*floor(1e-6*nbmad/timer.value()) << \" GFlops/s)\\n\";\n    else\n        std::cout << M << \" : \" << timer.value() << \" ; \" << 1e-3*floor(1e-6*nbmad/timer.value()) << \"\\n\";\n  }\n\n  // clear\n  ma = MyMatrix::Random(M,K);\n  mb = MyMatrix::Random(K,N);\n  mc = MyMatrix::Random(M,N);\n\n  // eigen\n//   if (!(std::string(argv[1])==\"auto\"))\n  {\n      timer.reset();\n      for (uint k=0 ; k<nbtries ; ++k)\n      {\n          timer.start();\n          bench_eigengemm(mc, ma, mb, nbloops);\n          timer.stop();\n      }\n      if (!(std::string(argv[1])==\"auto\"))\n        std::cout << \"eigen : \" << timer.value() << \" (\" << 1e-3*floor(1e-6*nbmad/timer.value()) << \" GFlops/s)\\n\";\n      else\n        std::cout << M << \" : \" << timer.value() << \" ; \" << 1e-3*floor(1e-6*nbmad/timer.value()) << \"\\n\";\n  }\n\n  std::cout << \"l1: \" << Eigen::l1CacheSize() << std::endl;\n  std::cout << \"l2: \" << Eigen::l2CacheSize() << std::endl;\n  \n\n  return 0;\n}\n\nusing namespace Eigen;\n\nvoid bench_eigengemm(MyMatrix& mc, const MyMatrix& ma, const MyMatrix& mb, int nbloops)\n{\n  for (uint j=0 ; j<nbloops ; ++j)\n      mc.noalias() += ma * mb;\n}\n\n#define MYVERIFY(A,M) if (!(A)) { \\\n    std::cout << \"FAIL: \" << M << \"\\n\"; \\\n  }\nvoid check_product(int M, int N, int K)\n{\n  MyMatrix ma(M,K), mb(K,N), mc(M,N), maT(K,M), mbT(N,K), meigen(M,N), mref(M,N);\n  ma = MyMatrix::Random(M,K);\n  mb = MyMatrix::Random(K,N);\n  maT = ma.transpose();\n  mbT = mb.transpose();\n  mc = MyMatrix::Random(M,N);\n\n  MyMatrix::Scalar eps = 1e-4;\n\n  meigen = mref = mc;\n  CBLAS_GEMM(CblasColMajor, CblasNoTrans, CblasNoTrans, M, N, K, 1, ma.data(), M, mb.data(), K, 1, mref.data(), M);\n  meigen += ma * mb;\n  MYVERIFY(meigen.isApprox(mref, eps),\". * .\");\n\n  meigen = mref = mc;\n  CBLAS_GEMM(CblasColMajor, CblasTrans, CblasNoTrans, M, N, K, 1, maT.data(), K, mb.data(), K, 1, mref.data(), M);\n  meigen += maT.transpose() * mb;\n  MYVERIFY(meigen.isApprox(mref, eps),\"T * .\");\n\n  meigen = mref = mc;\n  CBLAS_GEMM(CblasColMajor, CblasTrans, CblasTrans, M, N, K, 1, maT.data(), K, mbT.data(), N, 1, mref.data(), M);\n  meigen += (maT.transpose()) * (mbT.transpose());\n  MYVERIFY(meigen.isApprox(mref, eps),\"T * T\");\n\n  meigen = mref = mc;\n  CBLAS_GEMM(CblasColMajor, CblasNoTrans, CblasTrans, M, N, K, 1, ma.data(), M, mbT.data(), N, 1, mref.data(), M);\n  meigen += ma * mbT.transpose();\n  MYVERIFY(meigen.isApprox(mref, eps),\". * T\");\n}\n\nvoid check_product(void)\n{\n  int M, N, K;\n  for (uint i=0; i<1000; ++i)\n  {\n    M = internal::random<int>(1,64);\n    N = internal::random<int>(1,768);\n    K = internal::random<int>(1,768);\n    M = (0 + M) * 1;\n    std::cout << M << \" x \" << N << \" x \" << K << \"\\n\";\n    check_product(M, N, K);\n  }\n}\n\n"
  },
  {
    "path": "libs/eigen/bench/benchCholesky.cpp",
    "content": "\n// g++ -DNDEBUG -O3 -I.. benchLLT.cpp  -o benchLLT && ./benchLLT\n// options:\n//  -DBENCH_GSL -lgsl /usr/lib/libcblas.so.3\n//  -DEIGEN_DONT_VECTORIZE\n//  -msse2\n//  -DREPEAT=100\n//  -DTRIES=10\n//  -DSCALAR=double\n\n#include <iostream>\n\n#include <Eigen/Core>\n#include <Eigen/Cholesky>\n#include <bench/BenchUtil.h>\nusing namespace Eigen;\n\n#ifndef REPEAT\n#define REPEAT 10000\n#endif\n\n#ifndef TRIES\n#define TRIES 10\n#endif\n\ntypedef float Scalar;\n\ntemplate <typename MatrixType>\n__attribute__ ((noinline)) void benchLLT(const MatrixType& m)\n{\n  int rows = m.rows();\n  int cols = m.cols();\n\n  int cost = 0;\n  for (int j=0; j<rows; ++j)\n  {\n    int r = std::max(rows - j -1,0);\n    cost += 2*(r*j+r+j);\n  }\n\n  int repeats = (REPEAT*1000)/(rows*rows);\n\n  typedef typename MatrixType::Scalar Scalar;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, MatrixType::RowsAtCompileTime> SquareMatrixType;\n\n  MatrixType a = MatrixType::Random(rows,cols);\n  SquareMatrixType covMat =  a * a.adjoint();\n\n  BenchTimer timerNoSqrt, timerSqrt;\n\n  Scalar acc = 0;\n  int r = internal::random<int>(0,covMat.rows()-1);\n  int c = internal::random<int>(0,covMat.cols()-1);\n  for (int t=0; t<TRIES; ++t)\n  {\n    timerNoSqrt.start();\n    for (int k=0; k<repeats; ++k)\n    {\n      LDLT<SquareMatrixType> cholnosqrt(covMat);\n      acc += cholnosqrt.matrixL().coeff(r,c);\n    }\n    timerNoSqrt.stop();\n  }\n\n  for (int t=0; t<TRIES; ++t)\n  {\n    timerSqrt.start();\n    for (int k=0; k<repeats; ++k)\n    {\n      LLT<SquareMatrixType> chol(covMat);\n      acc += chol.matrixL().coeff(r,c);\n    }\n    timerSqrt.stop();\n  }\n\n  if (MatrixType::RowsAtCompileTime==Dynamic)\n    std::cout << \"dyn   \";\n  else\n    std::cout << \"fixed \";\n  std::cout << covMat.rows() << \" \\t\"\n            << (timerNoSqrt.value() * REPEAT) / repeats << \"s \"\n            << \"(\" << 1e-6 * cost*repeats/timerNoSqrt.value() << \" MFLOPS)\\t\"\n            << (timerSqrt.value() * REPEAT) / repeats << \"s \"\n            << \"(\" << 1e-6 * cost*repeats/timerSqrt.value() << \" MFLOPS)\\n\";\n\n\n  #ifdef BENCH_GSL\n  if (MatrixType::RowsAtCompileTime==Dynamic)\n  {\n    timerSqrt.reset();\n\n    gsl_matrix* gslCovMat = gsl_matrix_alloc(covMat.rows(),covMat.cols());\n    gsl_matrix* gslCopy = gsl_matrix_alloc(covMat.rows(),covMat.cols());\n\n    eiToGsl(covMat, &gslCovMat);\n    for (int t=0; t<TRIES; ++t)\n    {\n      timerSqrt.start();\n      for (int k=0; k<repeats; ++k)\n      {\n        gsl_matrix_memcpy(gslCopy,gslCovMat);\n        gsl_linalg_cholesky_decomp(gslCopy);\n        acc += gsl_matrix_get(gslCopy,r,c);\n      }\n      timerSqrt.stop();\n    }\n\n    std::cout << \" | \\t\"\n              << timerSqrt.value() * REPEAT / repeats << \"s\";\n\n    gsl_matrix_free(gslCovMat);\n  }\n  #endif\n  std::cout << \"\\n\";\n  // make sure the compiler does not optimize too much\n  if (acc==123)\n    std::cout << acc;\n}\n\nint main(int argc, char* argv[])\n{\n  const int dynsizes[] = {4,6,8,16,24,32,49,64,128,256,512,900,0};\n  std::cout << \"size            no sqrt                           standard\";\n//   #ifdef BENCH_GSL\n//   std::cout << \"       GSL (standard + double + ATLAS)  \";\n//   #endif\n  std::cout << \"\\n\";\n  for (uint i=0; dynsizes[i]>0; ++i)\n    benchLLT(Matrix<Scalar,Dynamic,Dynamic>(dynsizes[i],dynsizes[i]));\n\n  benchLLT(Matrix<Scalar,2,2>());\n  benchLLT(Matrix<Scalar,3,3>());\n  benchLLT(Matrix<Scalar,4,4>());\n  benchLLT(Matrix<Scalar,5,5>());\n  benchLLT(Matrix<Scalar,6,6>());\n  benchLLT(Matrix<Scalar,7,7>());\n  benchLLT(Matrix<Scalar,8,8>());\n  benchLLT(Matrix<Scalar,12,12>());\n  benchLLT(Matrix<Scalar,16,16>());\n  return 0;\n}\n\n"
  },
  {
    "path": "libs/eigen/bench/benchEigenSolver.cpp",
    "content": "\n// g++ -DNDEBUG -O3 -I.. benchEigenSolver.cpp  -o benchEigenSolver && ./benchEigenSolver\n// options:\n//  -DBENCH_GMM\n//  -DBENCH_GSL -lgsl /usr/lib/libcblas.so.3\n//  -DEIGEN_DONT_VECTORIZE\n//  -msse2\n//  -DREPEAT=100\n//  -DTRIES=10\n//  -DSCALAR=double\n\n#include <iostream>\n\n#include <Eigen/Core>\n#include <Eigen/QR>\n#include <bench/BenchUtil.h>\nusing namespace Eigen;\n\n#ifndef REPEAT\n#define REPEAT 1000\n#endif\n\n#ifndef TRIES\n#define TRIES 4\n#endif\n\n#ifndef SCALAR\n#define SCALAR float\n#endif\n\ntypedef SCALAR Scalar;\n\ntemplate <typename MatrixType>\n__attribute__ ((noinline)) void benchEigenSolver(const MatrixType& m)\n{\n  int rows = m.rows();\n  int cols = m.cols();\n\n  int stdRepeats = std::max(1,int((REPEAT*1000)/(rows*rows*sqrt(rows))));\n  int saRepeats = stdRepeats * 4;\n\n  typedef typename MatrixType::Scalar Scalar;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, MatrixType::RowsAtCompileTime> SquareMatrixType;\n\n  MatrixType a = MatrixType::Random(rows,cols);\n  SquareMatrixType covMat =  a * a.adjoint();\n\n  BenchTimer timerSa, timerStd;\n\n  Scalar acc = 0;\n  int r = internal::random<int>(0,covMat.rows()-1);\n  int c = internal::random<int>(0,covMat.cols()-1);\n  {\n    SelfAdjointEigenSolver<SquareMatrixType> ei(covMat);\n    for (int t=0; t<TRIES; ++t)\n    {\n      timerSa.start();\n      for (int k=0; k<saRepeats; ++k)\n      {\n        ei.compute(covMat);\n        acc += ei.eigenvectors().coeff(r,c);\n      }\n      timerSa.stop();\n    }\n  }\n\n  {\n    EigenSolver<SquareMatrixType> ei(covMat);\n    for (int t=0; t<TRIES; ++t)\n    {\n      timerStd.start();\n      for (int k=0; k<stdRepeats; ++k)\n      {\n        ei.compute(covMat);\n        acc += ei.eigenvectors().coeff(r,c);\n      }\n      timerStd.stop();\n    }\n  }\n\n  if (MatrixType::RowsAtCompileTime==Dynamic)\n    std::cout << \"dyn   \";\n  else\n    std::cout << \"fixed \";\n  std::cout << covMat.rows() << \" \\t\"\n            << timerSa.value() * REPEAT / saRepeats << \"s \\t\"\n            << timerStd.value() * REPEAT / stdRepeats << \"s\";\n\n  #ifdef BENCH_GMM\n  if (MatrixType::RowsAtCompileTime==Dynamic)\n  {\n    timerSa.reset();\n    timerStd.reset();\n\n    gmm::dense_matrix<Scalar> gmmCovMat(covMat.rows(),covMat.cols());\n    gmm::dense_matrix<Scalar> eigvect(covMat.rows(),covMat.cols());\n    std::vector<Scalar> eigval(covMat.rows());\n    eiToGmm(covMat, gmmCovMat);\n    for (int t=0; t<TRIES; ++t)\n    {\n      timerSa.start();\n      for (int k=0; k<saRepeats; ++k)\n      {\n        gmm::symmetric_qr_algorithm(gmmCovMat, eigval, eigvect);\n        acc += eigvect(r,c);\n      }\n      timerSa.stop();\n    }\n    // the non-selfadjoint solver does not compute the eigen vectors\n//     for (int t=0; t<TRIES; ++t)\n//     {\n//       timerStd.start();\n//       for (int k=0; k<stdRepeats; ++k)\n//       {\n//         gmm::implicit_qr_algorithm(gmmCovMat, eigval, eigvect);\n//         acc += eigvect(r,c);\n//       }\n//       timerStd.stop();\n//     }\n\n    std::cout << \" | \\t\"\n              << timerSa.value() * REPEAT / saRepeats << \"s\"\n              << /*timerStd.value() * REPEAT / stdRepeats << \"s\"*/ \"   na   \";\n  }\n  #endif\n\n  #ifdef BENCH_GSL\n  if (MatrixType::RowsAtCompileTime==Dynamic)\n  {\n    timerSa.reset();\n    timerStd.reset();\n\n    gsl_matrix* gslCovMat = gsl_matrix_alloc(covMat.rows(),covMat.cols());\n    gsl_matrix* gslCopy = gsl_matrix_alloc(covMat.rows(),covMat.cols());\n    gsl_matrix* eigvect = gsl_matrix_alloc(covMat.rows(),covMat.cols());\n    gsl_vector* eigval  = gsl_vector_alloc(covMat.rows());\n    gsl_eigen_symmv_workspace* eisymm = gsl_eigen_symmv_alloc(covMat.rows());\n    \n    gsl_matrix_complex* eigvectz = gsl_matrix_complex_alloc(covMat.rows(),covMat.cols());\n    gsl_vector_complex* eigvalz  = gsl_vector_complex_alloc(covMat.rows());\n    gsl_eigen_nonsymmv_workspace* einonsymm = gsl_eigen_nonsymmv_alloc(covMat.rows());\n    \n    eiToGsl(covMat, &gslCovMat);\n    for (int t=0; t<TRIES; ++t)\n    {\n      timerSa.start();\n      for (int k=0; k<saRepeats; ++k)\n      {\n        gsl_matrix_memcpy(gslCopy,gslCovMat);\n        gsl_eigen_symmv(gslCopy, eigval, eigvect, eisymm);\n        acc += gsl_matrix_get(eigvect,r,c);\n      }\n      timerSa.stop();\n    }\n    for (int t=0; t<TRIES; ++t)\n    {\n      timerStd.start();\n      for (int k=0; k<stdRepeats; ++k)\n      {\n        gsl_matrix_memcpy(gslCopy,gslCovMat);\n        gsl_eigen_nonsymmv(gslCopy, eigvalz, eigvectz, einonsymm);\n        acc += GSL_REAL(gsl_matrix_complex_get(eigvectz,r,c));\n      }\n      timerStd.stop();\n    }\n\n    std::cout << \" | \\t\"\n              << timerSa.value() * REPEAT / saRepeats << \"s \\t\"\n              << timerStd.value() * REPEAT / stdRepeats << \"s\";\n\n    gsl_matrix_free(gslCovMat);\n    gsl_vector_free(gslCopy);\n    gsl_matrix_free(eigvect);\n    gsl_vector_free(eigval);\n    gsl_matrix_complex_free(eigvectz);\n    gsl_vector_complex_free(eigvalz);\n    gsl_eigen_symmv_free(eisymm);\n    gsl_eigen_nonsymmv_free(einonsymm);\n  }\n  #endif\n\n  std::cout << \"\\n\";\n  \n  // make sure the compiler does not optimize too much\n  if (acc==123)\n    std::cout << acc;\n}\n\nint main(int argc, char* argv[])\n{\n  const int dynsizes[] = {4,6,8,12,16,24,32,64,128,256,512,0};\n  std::cout << \"size            selfadjoint       generic\";\n  #ifdef BENCH_GMM\n  std::cout << \"        GMM++          \";\n  #endif\n  #ifdef BENCH_GSL\n  std::cout << \"       GSL (double + ATLAS)  \";\n  #endif\n  std::cout << \"\\n\";\n  for (uint i=0; dynsizes[i]>0; ++i)\n    benchEigenSolver(Matrix<Scalar,Dynamic,Dynamic>(dynsizes[i],dynsizes[i]));\n\n  benchEigenSolver(Matrix<Scalar,2,2>());\n  benchEigenSolver(Matrix<Scalar,3,3>());\n  benchEigenSolver(Matrix<Scalar,4,4>());\n  benchEigenSolver(Matrix<Scalar,6,6>());\n  benchEigenSolver(Matrix<Scalar,8,8>());\n  benchEigenSolver(Matrix<Scalar,12,12>());\n  benchEigenSolver(Matrix<Scalar,16,16>());\n  return 0;\n}\n\n"
  },
  {
    "path": "libs/eigen/bench/benchFFT.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Mark Borgerding mark a borgerding net\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include <iostream>\n\n#include <bench/BenchUtil.h>\n#include <complex>\n#include <vector>\n#include <Eigen/Core>\n\n#include <unsupported/Eigen/FFT>\n\nusing namespace Eigen;\nusing namespace std;\n\n\ntemplate <typename T>\nstring nameof();\n\ntemplate <> string nameof<float>() {return \"float\";}\ntemplate <> string nameof<double>() {return \"double\";}\ntemplate <> string nameof<long double>() {return \"long double\";}\n\n#ifndef TYPE\n#define TYPE float\n#endif\n\n#ifndef NFFT\n#define NFFT 1024\n#endif\n#ifndef NDATA\n#define NDATA 1000000\n#endif\n\nusing namespace Eigen;\n\ntemplate <typename T>\nvoid bench(int nfft,bool fwd,bool unscaled=false, bool halfspec=false)\n{\n    typedef typename NumTraits<T>::Real Scalar;\n    typedef typename std::complex<Scalar> Complex;\n    int nits = NDATA/nfft;\n    vector<T> inbuf(nfft);\n    vector<Complex > outbuf(nfft);\n    FFT< Scalar > fft;\n\n    if (unscaled) {\n        fft.SetFlag(fft.Unscaled);\n        cout << \"unscaled \";\n    }\n    if (halfspec) {\n        fft.SetFlag(fft.HalfSpectrum);\n        cout << \"halfspec \";\n    }\n\n\n    std::fill(inbuf.begin(),inbuf.end(),0);\n    fft.fwd( outbuf , inbuf);\n\n    BenchTimer timer;\n    timer.reset();\n    for (int k=0;k<8;++k) {\n        timer.start();\n        if (fwd)\n            for(int i = 0; i < nits; i++)\n                fft.fwd( outbuf , inbuf);\n        else\n            for(int i = 0; i < nits; i++)\n                fft.inv(inbuf,outbuf);\n        timer.stop();\n    }\n\n    cout << nameof<Scalar>() << \" \";\n    double mflops = 5.*nfft*log2((double)nfft) / (1e6 * timer.value() / (double)nits );\n    if ( NumTraits<T>::IsComplex ) {\n        cout << \"complex\";\n    }else{\n        cout << \"real   \";\n        mflops /= 2;\n    }\n\n\n    if (fwd)\n        cout << \" fwd\";\n    else\n        cout << \" inv\";\n\n    cout << \" NFFT=\" << nfft << \"  \" << (double(1e-6*nfft*nits)/timer.value()) << \" MS/s  \" << mflops << \"MFLOPS\\n\";\n}\n\nint main(int argc,char ** argv)\n{\n    bench<complex<float> >(NFFT,true);\n    bench<complex<float> >(NFFT,false);\n    bench<float>(NFFT,true);\n    bench<float>(NFFT,false);\n    bench<float>(NFFT,false,true);\n    bench<float>(NFFT,false,true,true);\n\n    bench<complex<double> >(NFFT,true);\n    bench<complex<double> >(NFFT,false);\n    bench<double>(NFFT,true);\n    bench<double>(NFFT,false);\n    bench<complex<long double> >(NFFT,true);\n    bench<complex<long double> >(NFFT,false);\n    bench<long double>(NFFT,true);\n    bench<long double>(NFFT,false);\n    return 0;\n}\n"
  },
  {
    "path": "libs/eigen/bench/benchGeometry.cpp",
    "content": "#include <iostream>\n#include <iomanip>\n#include <Eigen/Core>\n#include <Eigen/Geometry>\n#include <bench/BenchTimer.h>\n\nusing namespace Eigen;\nusing namespace std;\n\n#ifndef REPEAT\n#define REPEAT 1000000\n#endif\n\nenum func_opt\n{\n    TV,\n    TMATV,\n    TMATVMAT,\n};\n\n\ntemplate <class res, class arg1, class arg2, int opt>\nstruct func;\n\ntemplate <class res, class arg1, class arg2>\nstruct func<res, arg1, arg2, TV>\n{\n    static EIGEN_DONT_INLINE res run( arg1& a1, arg2& a2 )\n    {\n\tasm (\"\");\n\treturn a1 * a2;\n    }\n};\n\ntemplate <class res, class arg1, class arg2>\nstruct func<res, arg1, arg2, TMATV>\n{\n    static EIGEN_DONT_INLINE res run( arg1& a1, arg2& a2 )\n    {\n\tasm (\"\");\n\treturn a1.matrix() * a2;\n    }\n};\n\ntemplate <class res, class arg1, class arg2>\nstruct func<res, arg1, arg2, TMATVMAT>\n{\n    static EIGEN_DONT_INLINE res run( arg1& a1, arg2& a2 )\n    {\n\tasm (\"\");\n\treturn res(a1.matrix() * a2.matrix());\n    }\n};\n\ntemplate <class func, class arg1, class arg2>\nstruct test_transform\n{\n    static void run()\n    {\n\targ1 a1;\n\ta1.setIdentity();\n\targ2 a2;\n\ta2.setIdentity();\n\n\tBenchTimer timer;\n\ttimer.reset();\n\tfor (int k=0; k<10; ++k)\n\t{\n\t    timer.start();\n\t    for (int k=0; k<REPEAT; ++k)\n\t\ta2 = func::run( a1, a2 );\n\t    timer.stop();\n\t}\n\tcout << setprecision(4) << fixed << timer.value() << \"s  \" << endl;;\n    }\n};\n\n\n#define run_vec( op, scalar, mode, option, vsize ) \\\n    std::cout << #scalar << \"\\t \" << #mode << \"\\t \" << #option << \" \" << #vsize \" \"; \\\n    {\\\n\ttypedef Transform<scalar, 3, mode, option> Trans;\\\n\ttypedef Matrix<scalar, vsize, 1, option> Vec;\\\n\ttypedef func<Vec,Trans,Vec,op> Func;\\\n\ttest_transform< Func, Trans, Vec >::run();\\\n    }\n\n#define run_trans( op, scalar, mode, option ) \\\n    std::cout << #scalar << \"\\t \" << #mode << \"\\t \" << #option << \"   \"; \\\n    {\\\n\ttypedef Transform<scalar, 3, mode, option> Trans;\\\n\ttypedef func<Trans,Trans,Trans,op> Func;\\\n\ttest_transform< Func, Trans, Trans >::run();\\\n    }\n\nint main(int argc, char* argv[])\n{\n    cout << \"vec = trans * vec\" << endl;\n    run_vec(TV, float,  Isometry, AutoAlign, 3);\n    run_vec(TV, float,  Isometry, DontAlign, 3);\n    run_vec(TV, float,  Isometry, AutoAlign, 4);\n    run_vec(TV, float,  Isometry, DontAlign, 4);\n    run_vec(TV, float,  Projective, AutoAlign, 4);\n    run_vec(TV, float,  Projective, DontAlign, 4);\n    run_vec(TV, double, Isometry, AutoAlign, 3);\n    run_vec(TV, double, Isometry, DontAlign, 3);\n    run_vec(TV, double, Isometry, AutoAlign, 4);\n    run_vec(TV, double, Isometry, DontAlign, 4);\n    run_vec(TV, double, Projective, AutoAlign, 4);\n    run_vec(TV, double, Projective, DontAlign, 4);\n\n    cout << \"vec = trans.matrix() * vec\" << endl;\n    run_vec(TMATV, float,  Isometry, AutoAlign, 4);\n    run_vec(TMATV, float,  Isometry, DontAlign, 4);\n    run_vec(TMATV, double, Isometry, AutoAlign, 4);\n    run_vec(TMATV, double, Isometry, DontAlign, 4);\n\n    cout << \"trans = trans1 * trans\" << endl;\n    run_trans(TV, float,  Isometry, AutoAlign);\n    run_trans(TV, float,  Isometry, DontAlign);\n    run_trans(TV, double, Isometry, AutoAlign);\n    run_trans(TV, double, Isometry, DontAlign);\n    run_trans(TV, float,  Projective, AutoAlign);\n    run_trans(TV, float,  Projective, DontAlign);\n    run_trans(TV, double, Projective, AutoAlign);\n    run_trans(TV, double, Projective, DontAlign);\n\n    cout << \"trans = trans1.matrix() * trans.matrix()\" << endl;\n    run_trans(TMATVMAT, float,  Isometry, AutoAlign);\n    run_trans(TMATVMAT, float,  Isometry, DontAlign);\n    run_trans(TMATVMAT, double, Isometry, AutoAlign);\n    run_trans(TMATVMAT, double, Isometry, DontAlign);\n}\n\n"
  },
  {
    "path": "libs/eigen/bench/benchVecAdd.cpp",
    "content": "\n#include <iostream>\n#include <Eigen/Core>\n#include <bench/BenchTimer.h>\nusing namespace Eigen;\n\n#ifndef SIZE\n#define SIZE 50\n#endif\n\n#ifndef REPEAT\n#define REPEAT 10000\n#endif\n\ntypedef float Scalar;\n\n__attribute__ ((noinline)) void benchVec(Scalar* a, Scalar* b, Scalar* c, int size);\n__attribute__ ((noinline)) void benchVec(MatrixXf& a, MatrixXf& b, MatrixXf& c);\n__attribute__ ((noinline)) void benchVec(VectorXf& a, VectorXf& b, VectorXf& c);\n\nint main(int argc, char* argv[])\n{\n    int size = SIZE * 8;\n    int size2 = size * size;\n    Scalar* a = internal::aligned_new<Scalar>(size2);\n    Scalar* b = internal::aligned_new<Scalar>(size2+4)+1;\n    Scalar* c = internal::aligned_new<Scalar>(size2); \n    \n    for (int i=0; i<size; ++i)\n    {\n        a[i] = b[i] = c[i] = 0;\n    }\n    \n    BenchTimer timer;\n    \n    timer.reset();\n    for (int k=0; k<10; ++k)\n    {\n        timer.start();\n        benchVec(a, b, c, size2);\n        timer.stop();\n    }\n    std::cout << timer.value() << \"s  \" << (double(size2*REPEAT)/timer.value())/(1024.*1024.*1024.) << \" GFlops\\n\";\n    return 0;\n    for (int innersize = size; innersize>2 ; --innersize)\n    {\n        if (size2%innersize==0)\n        {\n            int outersize = size2/innersize;\n            MatrixXf ma = Map<MatrixXf>(a, innersize, outersize );\n            MatrixXf mb = Map<MatrixXf>(b, innersize, outersize );\n            MatrixXf mc = Map<MatrixXf>(c, innersize, outersize );\n            timer.reset();\n            for (int k=0; k<3; ++k)\n            {\n                timer.start();\n                benchVec(ma, mb, mc);\n                timer.stop();\n            }\n            std::cout << innersize << \" x \" << outersize << \"  \" << timer.value() << \"s   \" << (double(size2*REPEAT)/timer.value())/(1024.*1024.*1024.) << \" GFlops\\n\";\n        }\n    }\n    \n    VectorXf va = Map<VectorXf>(a, size2);\n    VectorXf vb = Map<VectorXf>(b, size2);\n    VectorXf vc = Map<VectorXf>(c, size2);\n    timer.reset();\n    for (int k=0; k<3; ++k)\n    {\n        timer.start();\n        benchVec(va, vb, vc);\n        timer.stop();\n    }\n    std::cout << timer.value() << \"s   \" << (double(size2*REPEAT)/timer.value())/(1024.*1024.*1024.) << \" GFlops\\n\";\n\n    return 0;\n}\n\nvoid benchVec(MatrixXf& a, MatrixXf& b, MatrixXf& c)\n{\n    for (int k=0; k<REPEAT; ++k)\n        a = a + b;\n}\n\nvoid benchVec(VectorXf& a, VectorXf& b, VectorXf& c)\n{\n    for (int k=0; k<REPEAT; ++k)\n        a = a + b;\n}\n\nvoid benchVec(Scalar* a, Scalar* b, Scalar* c, int size)\n{\n    typedef internal::packet_traits<Scalar>::type PacketScalar;\n    const int PacketSize = internal::packet_traits<Scalar>::size;\n    PacketScalar a0, a1, a2, a3, b0, b1, b2, b3;\n    for (int k=0; k<REPEAT; ++k)\n        for (int i=0; i<size; i+=PacketSize*8)\n        {\n//             a0 = internal::pload(&a[i]);\n//             b0 = internal::pload(&b[i]);\n//             a1 = internal::pload(&a[i+1*PacketSize]);\n//             b1 = internal::pload(&b[i+1*PacketSize]);\n//             a2 = internal::pload(&a[i+2*PacketSize]);\n//             b2 = internal::pload(&b[i+2*PacketSize]);\n//             a3 = internal::pload(&a[i+3*PacketSize]);\n//             b3 = internal::pload(&b[i+3*PacketSize]);\n//             internal::pstore(&a[i], internal::padd(a0, b0));\n//             a0 = internal::pload(&a[i+4*PacketSize]);\n//             b0 = internal::pload(&b[i+4*PacketSize]);\n//             \n//             internal::pstore(&a[i+1*PacketSize], internal::padd(a1, b1));\n//             a1 = internal::pload(&a[i+5*PacketSize]);\n//             b1 = internal::pload(&b[i+5*PacketSize]);\n//             \n//             internal::pstore(&a[i+2*PacketSize], internal::padd(a2, b2));\n//             a2 = internal::pload(&a[i+6*PacketSize]);\n//             b2 = internal::pload(&b[i+6*PacketSize]);\n//             \n//             internal::pstore(&a[i+3*PacketSize], internal::padd(a3, b3));\n//             a3 = internal::pload(&a[i+7*PacketSize]);\n//             b3 = internal::pload(&b[i+7*PacketSize]);\n//             \n//             internal::pstore(&a[i+4*PacketSize], internal::padd(a0, b0));\n//             internal::pstore(&a[i+5*PacketSize], internal::padd(a1, b1));\n//             internal::pstore(&a[i+6*PacketSize], internal::padd(a2, b2));\n//             internal::pstore(&a[i+7*PacketSize], internal::padd(a3, b3));\n            \n            internal::pstore(&a[i+2*PacketSize], internal::padd(internal::ploadu(&a[i+2*PacketSize]), internal::ploadu(&b[i+2*PacketSize])));\n            internal::pstore(&a[i+3*PacketSize], internal::padd(internal::ploadu(&a[i+3*PacketSize]), internal::ploadu(&b[i+3*PacketSize])));\n            internal::pstore(&a[i+4*PacketSize], internal::padd(internal::ploadu(&a[i+4*PacketSize]), internal::ploadu(&b[i+4*PacketSize])));\n            internal::pstore(&a[i+5*PacketSize], internal::padd(internal::ploadu(&a[i+5*PacketSize]), internal::ploadu(&b[i+5*PacketSize])));\n            internal::pstore(&a[i+6*PacketSize], internal::padd(internal::ploadu(&a[i+6*PacketSize]), internal::ploadu(&b[i+6*PacketSize])));\n            internal::pstore(&a[i+7*PacketSize], internal::padd(internal::ploadu(&a[i+7*PacketSize]), internal::ploadu(&b[i+7*PacketSize])));\n        }\n}\n"
  },
  {
    "path": "libs/eigen/bench/bench_gemm.cpp",
    "content": "\n// g++-4.4 bench_gemm.cpp -I .. -O2 -DNDEBUG -lrt -fopenmp && OMP_NUM_THREADS=2  ./a.out\n// icpc bench_gemm.cpp -I .. -O3 -DNDEBUG -lrt -openmp  && OMP_NUM_THREADS=2  ./a.out\n\n#include <iostream>\n#include <Eigen/Core>\n#include <bench/BenchTimer.h>\n\nusing namespace std;\nusing namespace Eigen;\n\n#ifndef SCALAR\n// #define SCALAR std::complex<float>\n#define SCALAR float\n#endif\n\ntypedef SCALAR Scalar;\ntypedef NumTraits<Scalar>::Real RealScalar;\ntypedef Matrix<RealScalar,Dynamic,Dynamic> A;\ntypedef Matrix</*Real*/Scalar,Dynamic,Dynamic> B;\ntypedef Matrix<Scalar,Dynamic,Dynamic> C;\ntypedef Matrix<RealScalar,Dynamic,Dynamic> M;\n\n#ifdef HAVE_BLAS\n\nextern \"C\" {\n  #include <Eigen/src/misc/blas.h>\n}\n\nstatic float fone = 1;\nstatic float fzero = 0;\nstatic double done = 1;\nstatic double szero = 0;\nstatic std::complex<float> cfone = 1;\nstatic std::complex<float> cfzero = 0;\nstatic std::complex<double> cdone = 1;\nstatic std::complex<double> cdzero = 0;\nstatic char notrans = 'N';\nstatic char trans = 'T';  \nstatic char nonunit = 'N';\nstatic char lower = 'L';\nstatic char right = 'R';\nstatic int intone = 1;\n\nvoid blas_gemm(const MatrixXf& a, const MatrixXf& b, MatrixXf& c)\n{\n  int M = c.rows(); int N = c.cols(); int K = a.cols();\n  int lda = a.rows(); int ldb = b.rows(); int ldc = c.rows();\n\n  sgemm_(&notrans,&notrans,&M,&N,&K,&fone,\n         const_cast<float*>(a.data()),&lda,\n         const_cast<float*>(b.data()),&ldb,&fone,\n         c.data(),&ldc);\n}\n\nEIGEN_DONT_INLINE void blas_gemm(const MatrixXd& a, const MatrixXd& b, MatrixXd& c)\n{\n  int M = c.rows(); int N = c.cols(); int K = a.cols();\n  int lda = a.rows(); int ldb = b.rows(); int ldc = c.rows();\n\n  dgemm_(&notrans,&notrans,&M,&N,&K,&done,\n         const_cast<double*>(a.data()),&lda,\n         const_cast<double*>(b.data()),&ldb,&done,\n         c.data(),&ldc);\n}\n\nvoid blas_gemm(const MatrixXcf& a, const MatrixXcf& b, MatrixXcf& c)\n{\n  int M = c.rows(); int N = c.cols(); int K = a.cols();\n  int lda = a.rows(); int ldb = b.rows(); int ldc = c.rows();\n\n  cgemm_(&notrans,&notrans,&M,&N,&K,(float*)&cfone,\n         const_cast<float*>((const float*)a.data()),&lda,\n         const_cast<float*>((const float*)b.data()),&ldb,(float*)&cfone,\n         (float*)c.data(),&ldc);\n}\n\nvoid blas_gemm(const MatrixXcd& a, const MatrixXcd& b, MatrixXcd& c)\n{\n  int M = c.rows(); int N = c.cols(); int K = a.cols();\n  int lda = a.rows(); int ldb = b.rows(); int ldc = c.rows();\n\n  zgemm_(&notrans,&notrans,&M,&N,&K,(double*)&cdone,\n         const_cast<double*>((const double*)a.data()),&lda,\n         const_cast<double*>((const double*)b.data()),&ldb,(double*)&cdone,\n         (double*)c.data(),&ldc);\n}\n\n\n\n#endif\n\nvoid matlab_cplx_cplx(const M& ar, const M& ai, const M& br, const M& bi, M& cr, M& ci)\n{\n  cr.noalias() += ar * br;\n  cr.noalias() -= ai * bi;\n  ci.noalias() += ar * bi;\n  ci.noalias() += ai * br;\n}\n\nvoid matlab_real_cplx(const M& a, const M& br, const M& bi, M& cr, M& ci)\n{\n  cr.noalias() += a * br;\n  ci.noalias() += a * bi;\n}\n\nvoid matlab_cplx_real(const M& ar, const M& ai, const M& b, M& cr, M& ci)\n{\n  cr.noalias() += ar * b;\n  ci.noalias() += ai * b;\n}\n\ntemplate<typename A, typename B, typename C>\nEIGEN_DONT_INLINE void gemm(const A& a, const B& b, C& c)\n{\n c.noalias() += a * b;\n}\n\nint main(int argc, char ** argv)\n{\n  std::ptrdiff_t l1 = internal::queryL1CacheSize();\n  std::ptrdiff_t l2 = internal::queryTopLevelCacheSize();\n  std::cout << \"L1 cache size     = \" << (l1>0 ? l1/1024 : -1) << \" KB\\n\";\n  std::cout << \"L2/L3 cache size  = \" << (l2>0 ? l2/1024 : -1) << \" KB\\n\";\n  typedef internal::gebp_traits<Scalar,Scalar> Traits;\n  std::cout << \"Register blocking = \" << Traits::mr << \" x \" << Traits::nr << \"\\n\";\n\n  int rep = 1;    // number of repetitions per try\n  int tries = 2;  // number of tries, we keep the best\n\n  int s = 2048;\n  int cache_size = -1;\n\n  bool need_help = false;\n  for (int i=1; i<argc; ++i)\n  {\n    if(argv[i][0]=='s')\n      s = atoi(argv[i]+1);\n    else if(argv[i][0]=='c')\n      cache_size = atoi(argv[i]+1);\n    else if(argv[i][0]=='t')\n      tries = atoi(argv[i]+1);\n    else if(argv[i][0]=='p')\n      rep = atoi(argv[i]+1);\n    else\n      need_help = true;\n  }\n\n  if(need_help)\n  {\n    std::cout << argv[0] << \" s<matrix size> c<cache size> t<nb tries> p<nb repeats>\\n\";\n    return 1;\n  }\n\n  if(cache_size>0)\n    setCpuCacheSizes(cache_size,96*cache_size);\n\n  int m = s;\n  int n = s;\n  int p = s;\n  A a(m,p); a.setRandom();\n  B b(p,n); b.setRandom();\n  C c(m,n); c.setOnes();\n  C rc = c;\n\n  std::cout << \"Matrix sizes = \" << m << \"x\" << p << \" * \" << p << \"x\" << n << \"\\n\";\n  std::ptrdiff_t mc(m), nc(n), kc(p);\n  internal::computeProductBlockingSizes<Scalar,Scalar>(kc, mc, nc);\n  std::cout << \"blocking size (mc x kc) = \" << mc << \" x \" << kc << \"\\n\";\n\n  C r = c;\n\n  // check the parallel product is correct\n  #if defined EIGEN_HAS_OPENMP\n  int procs = omp_get_max_threads();\n  if(procs>1)\n  {\n    #ifdef HAVE_BLAS\n    blas_gemm(a,b,r);\n    #else\n    omp_set_num_threads(1);\n    r.noalias() += a * b;\n    omp_set_num_threads(procs);\n    #endif\n    c.noalias() += a * b;\n    if(!r.isApprox(c)) std::cerr << \"Warning, your parallel product is crap!\\n\\n\";\n  }\n  #elif defined HAVE_BLAS\n    blas_gemm(a,b,r);\n    c.noalias() += a * b;\n    if(!r.isApprox(c)) std::cerr << \"Warning, your product is crap!\\n\\n\";\n  #else\n    gemm(a,b,c);\n    r.noalias() += a.cast<Scalar>() * b.cast<Scalar>();\n    if(!r.isApprox(c)) std::cerr << \"Warning, your product is crap!\\n\\n\";\n  #endif\n\n  #ifdef HAVE_BLAS\n  BenchTimer tblas;\n  c = rc;\n  BENCH(tblas, tries, rep, blas_gemm(a,b,c));\n  std::cout << \"blas  cpu         \" << tblas.best(CPU_TIMER)/rep  << \"s  \\t\" << (double(m)*n*p*rep*2/tblas.best(CPU_TIMER))*1e-9  <<  \" GFLOPS \\t(\" << tblas.total(CPU_TIMER)  << \"s)\\n\";\n  std::cout << \"blas  real        \" << tblas.best(REAL_TIMER)/rep << \"s  \\t\" << (double(m)*n*p*rep*2/tblas.best(REAL_TIMER))*1e-9 <<  \" GFLOPS \\t(\" << tblas.total(REAL_TIMER) << \"s)\\n\";\n  #endif\n\n  BenchTimer tmt;\n  c = rc;\n  BENCH(tmt, tries, rep, gemm(a,b,c));\n  std::cout << \"eigen cpu         \" << tmt.best(CPU_TIMER)/rep  << \"s  \\t\" << (double(m)*n*p*rep*2/tmt.best(CPU_TIMER))*1e-9  <<  \" GFLOPS \\t(\" << tmt.total(CPU_TIMER)  << \"s)\\n\";\n  std::cout << \"eigen real        \" << tmt.best(REAL_TIMER)/rep << \"s  \\t\" << (double(m)*n*p*rep*2/tmt.best(REAL_TIMER))*1e-9 <<  \" GFLOPS \\t(\" << tmt.total(REAL_TIMER) << \"s)\\n\";\n\n  #ifdef EIGEN_HAS_OPENMP\n  if(procs>1)\n  {\n    BenchTimer tmono;\n    omp_set_num_threads(1);\n    Eigen::internal::setNbThreads(1);\n    c = rc;\n    BENCH(tmono, tries, rep, gemm(a,b,c));\n    std::cout << \"eigen mono cpu    \" << tmono.best(CPU_TIMER)/rep  << \"s  \\t\" << (double(m)*n*p*rep*2/tmono.best(CPU_TIMER))*1e-9  <<  \" GFLOPS \\t(\" << tmono.total(CPU_TIMER)  << \"s)\\n\";\n    std::cout << \"eigen mono real   \" << tmono.best(REAL_TIMER)/rep << \"s  \\t\" << (double(m)*n*p*rep*2/tmono.best(REAL_TIMER))*1e-9 <<  \" GFLOPS \\t(\" << tmono.total(REAL_TIMER) << \"s)\\n\";\n    std::cout << \"mt speed up x\" << tmono.best(CPU_TIMER) / tmt.best(REAL_TIMER)  << \" => \" << (100.0*tmono.best(CPU_TIMER) / tmt.best(REAL_TIMER))/procs << \"%\\n\";\n  }\n  #endif\n  \n  #ifdef DECOUPLED\n  if((NumTraits<A::Scalar>::IsComplex) && (NumTraits<B::Scalar>::IsComplex))\n  {\n    M ar(m,p); ar.setRandom();\n    M ai(m,p); ai.setRandom();\n    M br(p,n); br.setRandom();\n    M bi(p,n); bi.setRandom();\n    M cr(m,n); cr.setRandom();\n    M ci(m,n); ci.setRandom();\n    \n    BenchTimer t;\n    BENCH(t, tries, rep, matlab_cplx_cplx(ar,ai,br,bi,cr,ci));\n    std::cout << \"\\\"matlab\\\" cpu    \" << t.best(CPU_TIMER)/rep  << \"s  \\t\" << (double(m)*n*p*rep*2/t.best(CPU_TIMER))*1e-9  <<  \" GFLOPS \\t(\" << t.total(CPU_TIMER)  << \"s)\\n\";\n    std::cout << \"\\\"matlab\\\" real   \" << t.best(REAL_TIMER)/rep << \"s  \\t\" << (double(m)*n*p*rep*2/t.best(REAL_TIMER))*1e-9 <<  \" GFLOPS \\t(\" << t.total(REAL_TIMER) << \"s)\\n\";\n  }\n  if((!NumTraits<A::Scalar>::IsComplex) && (NumTraits<B::Scalar>::IsComplex))\n  {\n    M a(m,p);  a.setRandom();\n    M br(p,n); br.setRandom();\n    M bi(p,n); bi.setRandom();\n    M cr(m,n); cr.setRandom();\n    M ci(m,n); ci.setRandom();\n    \n    BenchTimer t;\n    BENCH(t, tries, rep, matlab_real_cplx(a,br,bi,cr,ci));\n    std::cout << \"\\\"matlab\\\" cpu    \" << t.best(CPU_TIMER)/rep  << \"s  \\t\" << (double(m)*n*p*rep*2/t.best(CPU_TIMER))*1e-9  <<  \" GFLOPS \\t(\" << t.total(CPU_TIMER)  << \"s)\\n\";\n    std::cout << \"\\\"matlab\\\" real   \" << t.best(REAL_TIMER)/rep << \"s  \\t\" << (double(m)*n*p*rep*2/t.best(REAL_TIMER))*1e-9 <<  \" GFLOPS \\t(\" << t.total(REAL_TIMER) << \"s)\\n\";\n  }\n  if((NumTraits<A::Scalar>::IsComplex) && (!NumTraits<B::Scalar>::IsComplex))\n  {\n    M ar(m,p); ar.setRandom();\n    M ai(m,p); ai.setRandom();\n    M b(p,n);  b.setRandom();\n    M cr(m,n); cr.setRandom();\n    M ci(m,n); ci.setRandom();\n    \n    BenchTimer t;\n    BENCH(t, tries, rep, matlab_cplx_real(ar,ai,b,cr,ci));\n    std::cout << \"\\\"matlab\\\" cpu    \" << t.best(CPU_TIMER)/rep  << \"s  \\t\" << (double(m)*n*p*rep*2/t.best(CPU_TIMER))*1e-9  <<  \" GFLOPS \\t(\" << t.total(CPU_TIMER)  << \"s)\\n\";\n    std::cout << \"\\\"matlab\\\" real   \" << t.best(REAL_TIMER)/rep << \"s  \\t\" << (double(m)*n*p*rep*2/t.best(REAL_TIMER))*1e-9 <<  \" GFLOPS \\t(\" << t.total(REAL_TIMER) << \"s)\\n\";\n  }\n  #endif\n\n  return 0;\n}\n\n"
  },
  {
    "path": "libs/eigen/bench/bench_multi_compilers.sh",
    "content": "#!/bin/bash\n\nif (($# < 2)); then\n    echo \"Usage: $0 compilerlist.txt benchfile.cpp\"\nelse\n\ncompilerlist=$1\nbenchfile=$2\n\ng=0\nsource $compilerlist\n\n# for each compiler, compile benchfile and run the benchmark\nfor (( i=0 ; i<g ; ++i )) ; do\n  # check the compiler exists\n  compiler=`echo ${CLIST[$i]} | cut -d \" \" -f 1`\n  if [ -e `which $compiler` ]; then\n    echo \"${CLIST[$i]}\"\n#     echo \"${CLIST[$i]} $benchfile -I.. -o bench~\"\n#     if [ -e ./.bench ] ; then rm .bench; fi\n    ${CLIST[$i]} $benchfile -I.. -o .bench && ./.bench 2> /dev/null\n    echo \"\"\n  else\n    echo \"compiler not found: $compiler\"\n  fi\ndone\n\nfi\n"
  },
  {
    "path": "libs/eigen/bench/bench_norm.cpp",
    "content": "#include <typeinfo>\n#include <iostream>\n#include <Eigen/Core>\n#include \"BenchTimer.h\"\nusing namespace Eigen;\nusing namespace std;\n\ntemplate<typename T>\nEIGEN_DONT_INLINE typename T::Scalar sqsumNorm(const T& v)\n{\n  return v.norm();\n}\n\ntemplate<typename T>\nEIGEN_DONT_INLINE typename T::Scalar hypotNorm(const T& v)\n{\n  return v.hypotNorm();\n}\n\ntemplate<typename T>\nEIGEN_DONT_INLINE typename T::Scalar blueNorm(const T& v)\n{\n  return v.blueNorm();\n}\n\ntemplate<typename T>\nEIGEN_DONT_INLINE typename T::Scalar lapackNorm(T& v)\n{\n  typedef typename T::Scalar Scalar;\n  int n = v.size();\n  Scalar scale = 0;\n  Scalar ssq = 1;\n  for (int i=0;i<n;++i)\n  {\n    Scalar ax = internal::abs(v.coeff(i));\n    if (scale >= ax)\n    {\n      ssq += internal::abs2(ax/scale);\n    }\n    else\n    {\n      ssq = Scalar(1) + ssq * internal::abs2(scale/ax);\n      scale = ax;\n    }\n  }\n  return scale * internal::sqrt(ssq);\n}\n\ntemplate<typename T>\nEIGEN_DONT_INLINE typename T::Scalar twopassNorm(T& v)\n{\n  typedef typename T::Scalar Scalar;\n  Scalar s = v.cwise().abs().maxCoeff();\n  return s*(v/s).norm();\n}\n\ntemplate<typename T>\nEIGEN_DONT_INLINE typename T::Scalar bl2passNorm(T& v)\n{\n  return v.stableNorm();\n}\n\ntemplate<typename T>\nEIGEN_DONT_INLINE typename T::Scalar divacNorm(T& v)\n{\n  int n =v.size() / 2;\n  for (int i=0;i<n;++i)\n    v(i) = v(2*i)*v(2*i) + v(2*i+1)*v(2*i+1);\n  n = n/2;\n  while (n>0)\n  {\n    for (int i=0;i<n;++i)\n      v(i) = v(2*i) + v(2*i+1);\n    n = n/2;\n  }\n  return internal::sqrt(v(0));\n}\n\n#ifdef EIGEN_VECTORIZE\nPacket4f internal::plt(const Packet4f& a, Packet4f& b) { return _mm_cmplt_ps(a,b); }\nPacket2d internal::plt(const Packet2d& a, Packet2d& b) { return _mm_cmplt_pd(a,b); }\n\nPacket4f internal::pandnot(const Packet4f& a, Packet4f& b) { return _mm_andnot_ps(a,b); }\nPacket2d internal::pandnot(const Packet2d& a, Packet2d& b) { return _mm_andnot_pd(a,b); }\n#endif\n\ntemplate<typename T>\nEIGEN_DONT_INLINE typename T::Scalar pblueNorm(const T& v)\n{\n  #ifndef EIGEN_VECTORIZE\n  return v.blueNorm();\n  #else\n  typedef typename T::Scalar Scalar;\n\n  static int nmax = 0;\n  static Scalar b1, b2, s1m, s2m, overfl, rbig, relerr;\n  int n;\n\n  if(nmax <= 0)\n  {\n    int nbig, ibeta, it, iemin, iemax, iexp;\n    Scalar abig, eps;\n\n    nbig  = std::numeric_limits<int>::max();            // largest integer\n    ibeta = std::numeric_limits<Scalar>::radix; //NumTraits<Scalar>::Base;                    // base for floating-point numbers\n    it    = std::numeric_limits<Scalar>::digits; //NumTraits<Scalar>::Mantissa;                // number of base-beta digits in mantissa\n    iemin = std::numeric_limits<Scalar>::min_exponent;  // minimum exponent\n    iemax = std::numeric_limits<Scalar>::max_exponent;  // maximum exponent\n    rbig  = std::numeric_limits<Scalar>::max();         // largest floating-point number\n\n    // Check the basic machine-dependent constants.\n    if(iemin > 1 - 2*it || 1+it>iemax || (it==2 && ibeta<5)\n      || (it<=4 && ibeta <= 3 ) || it<2)\n    {\n      eigen_assert(false && \"the algorithm cannot be guaranteed on this computer\");\n    }\n    iexp  = -((1-iemin)/2);\n    b1    = std::pow(ibeta, iexp);  // lower boundary of midrange\n    iexp  = (iemax + 1 - it)/2;\n    b2    = std::pow(ibeta,iexp);   // upper boundary of midrange\n\n    iexp  = (2-iemin)/2;\n    s1m   = std::pow(ibeta,iexp);   // scaling factor for lower range\n    iexp  = - ((iemax+it)/2);\n    s2m   = std::pow(ibeta,iexp);   // scaling factor for upper range\n\n    overfl  = rbig*s2m;          // overfow boundary for abig\n    eps     = std::pow(ibeta, 1-it);\n    relerr  = internal::sqrt(eps);      // tolerance for neglecting asml\n    abig    = 1.0/eps - 1.0;\n    if (Scalar(nbig)>abig)  nmax = abig;  // largest safe n\n    else                    nmax = nbig;\n  }\n\n  typedef typename internal::packet_traits<Scalar>::type Packet;\n  const int ps = internal::packet_traits<Scalar>::size;\n  Packet pasml = internal::pset1(Scalar(0));\n  Packet pamed = internal::pset1(Scalar(0));\n  Packet pabig = internal::pset1(Scalar(0));\n  Packet ps2m = internal::pset1(s2m);\n  Packet ps1m = internal::pset1(s1m);\n  Packet pb2  = internal::pset1(b2);\n  Packet pb1  = internal::pset1(b1);\n  for(int j=0; j<v.size(); j+=ps)\n  {\n    Packet ax = internal::pabs(v.template packet<Aligned>(j));\n    Packet ax_s2m = internal::pmul(ax,ps2m);\n    Packet ax_s1m = internal::pmul(ax,ps1m);\n    Packet maskBig = internal::plt(pb2,ax);\n    Packet maskSml = internal::plt(ax,pb1);\n\n//     Packet maskMed = internal::pand(maskSml,maskBig);\n//     Packet scale = internal::pset1(Scalar(0));\n//     scale = internal::por(scale, internal::pand(maskBig,ps2m));\n//     scale = internal::por(scale, internal::pand(maskSml,ps1m));\n//     scale = internal::por(scale, internal::pandnot(internal::pset1(Scalar(1)),maskMed));\n//     ax = internal::pmul(ax,scale);\n//     ax = internal::pmul(ax,ax);\n//     pabig = internal::padd(pabig, internal::pand(maskBig, ax));\n//     pasml = internal::padd(pasml, internal::pand(maskSml, ax));\n//     pamed = internal::padd(pamed, internal::pandnot(ax,maskMed));\n\n\n    pabig = internal::padd(pabig, internal::pand(maskBig, internal::pmul(ax_s2m,ax_s2m)));\n    pasml = internal::padd(pasml, internal::pand(maskSml, internal::pmul(ax_s1m,ax_s1m)));\n    pamed = internal::padd(pamed, internal::pandnot(internal::pmul(ax,ax),internal::pand(maskSml,maskBig)));\n  }\n  Scalar abig = internal::predux(pabig);\n  Scalar asml = internal::predux(pasml);\n  Scalar amed = internal::predux(pamed);\n  if(abig > Scalar(0))\n  {\n    abig = internal::sqrt(abig);\n    if(abig > overfl)\n    {\n      eigen_assert(false && \"overflow\");\n      return rbig;\n    }\n    if(amed > Scalar(0))\n    {\n      abig = abig/s2m;\n      amed = internal::sqrt(amed);\n    }\n    else\n    {\n      return abig/s2m;\n    }\n\n  }\n  else if(asml > Scalar(0))\n  {\n    if (amed > Scalar(0))\n    {\n      abig = internal::sqrt(amed);\n      amed = internal::sqrt(asml) / s1m;\n    }\n    else\n    {\n      return internal::sqrt(asml)/s1m;\n    }\n  }\n  else\n  {\n    return internal::sqrt(amed);\n  }\n  asml = std::min(abig, amed);\n  abig = std::max(abig, amed);\n  if(asml <= abig*relerr)\n    return abig;\n  else\n    return abig * internal::sqrt(Scalar(1) + internal::abs2(asml/abig));\n  #endif\n}\n\n#define BENCH_PERF(NRM) { \\\n  Eigen::BenchTimer tf, td, tcf; tf.reset(); td.reset(); tcf.reset();\\\n  for (int k=0; k<tries; ++k) { \\\n    tf.start(); \\\n    for (int i=0; i<iters; ++i) NRM(vf); \\\n    tf.stop(); \\\n  } \\\n  for (int k=0; k<tries; ++k) { \\\n    td.start(); \\\n    for (int i=0; i<iters; ++i) NRM(vd); \\\n    td.stop(); \\\n  } \\\n  for (int k=0; k<std::max(1,tries/3); ++k) { \\\n    tcf.start(); \\\n    for (int i=0; i<iters; ++i) NRM(vcf); \\\n    tcf.stop(); \\\n  } \\\n  std::cout << #NRM << \"\\t\" << tf.value() << \"   \" << td.value() <<  \"    \" << tcf.value() << \"\\n\"; \\\n}\n\nvoid check_accuracy(double basef, double based, int s)\n{\n  double yf = basef * internal::abs(internal::random<double>());\n  double yd = based * internal::abs(internal::random<double>());\n  VectorXf vf = VectorXf::Ones(s) * yf;\n  VectorXd vd = VectorXd::Ones(s) * yd;\n\n  std::cout << \"reference\\t\" << internal::sqrt(double(s))*yf << \"\\t\" << internal::sqrt(double(s))*yd << \"\\n\";\n  std::cout << \"sqsumNorm\\t\" << sqsumNorm(vf) << \"\\t\" << sqsumNorm(vd) << \"\\n\";\n  std::cout << \"hypotNorm\\t\" << hypotNorm(vf) << \"\\t\" << hypotNorm(vd) << \"\\n\";\n  std::cout << \"blueNorm\\t\" << blueNorm(vf) << \"\\t\" << blueNorm(vd) << \"\\n\";\n  std::cout << \"pblueNorm\\t\" << pblueNorm(vf) << \"\\t\" << pblueNorm(vd) << \"\\n\";\n  std::cout << \"lapackNorm\\t\" << lapackNorm(vf) << \"\\t\" << lapackNorm(vd) << \"\\n\";\n  std::cout << \"twopassNorm\\t\" << twopassNorm(vf) << \"\\t\" << twopassNorm(vd) << \"\\n\";\n  std::cout << \"bl2passNorm\\t\" << bl2passNorm(vf) << \"\\t\" << bl2passNorm(vd) << \"\\n\";\n}\n\nvoid check_accuracy_var(int ef0, int ef1, int ed0, int ed1, int s)\n{\n  VectorXf vf(s);\n  VectorXd vd(s);\n  for (int i=0; i<s; ++i)\n  {\n    vf[i] = internal::abs(internal::random<double>()) * std::pow(double(10), internal::random<int>(ef0,ef1));\n    vd[i] = internal::abs(internal::random<double>()) * std::pow(double(10), internal::random<int>(ed0,ed1));\n  }\n\n  //std::cout << \"reference\\t\" << internal::sqrt(double(s))*yf << \"\\t\" << internal::sqrt(double(s))*yd << \"\\n\";\n  std::cout << \"sqsumNorm\\t\"  << sqsumNorm(vf)  << \"\\t\" << sqsumNorm(vd)  << \"\\t\" << sqsumNorm(vf.cast<long double>()) << \"\\t\" << sqsumNorm(vd.cast<long double>()) << \"\\n\";\n  std::cout << \"hypotNorm\\t\"  << hypotNorm(vf)  << \"\\t\" << hypotNorm(vd)  << \"\\t\" << hypotNorm(vf.cast<long double>()) << \"\\t\" << hypotNorm(vd.cast<long double>()) << \"\\n\";\n  std::cout << \"blueNorm\\t\"   << blueNorm(vf)   << \"\\t\" << blueNorm(vd)   << \"\\t\" << blueNorm(vf.cast<long double>()) << \"\\t\" << blueNorm(vd.cast<long double>()) << \"\\n\";\n  std::cout << \"pblueNorm\\t\"  << pblueNorm(vf)  << \"\\t\" << pblueNorm(vd)  << \"\\t\" << blueNorm(vf.cast<long double>()) << \"\\t\" << blueNorm(vd.cast<long double>()) << \"\\n\";\n  std::cout << \"lapackNorm\\t\" << lapackNorm(vf) << \"\\t\" << lapackNorm(vd) << \"\\t\" << lapackNorm(vf.cast<long double>()) << \"\\t\" << lapackNorm(vd.cast<long double>()) << \"\\n\";\n  std::cout << \"twopassNorm\\t\" << twopassNorm(vf) << \"\\t\" << twopassNorm(vd) << \"\\t\" << twopassNorm(vf.cast<long double>()) << \"\\t\" << twopassNorm(vd.cast<long double>()) << \"\\n\";\n//   std::cout << \"bl2passNorm\\t\" << bl2passNorm(vf) << \"\\t\" << bl2passNorm(vd) << \"\\t\" << bl2passNorm(vf.cast<long double>()) << \"\\t\" << bl2passNorm(vd.cast<long double>()) << \"\\n\";\n}\n\nint main(int argc, char** argv)\n{\n  int tries = 10;\n  int iters = 100000;\n  double y = 1.1345743233455785456788e12 * internal::random<double>();\n  VectorXf v = VectorXf::Ones(1024) * y;\n\n// return 0;\n  int s = 10000;\n  double basef_ok = 1.1345743233455785456788e15;\n  double based_ok = 1.1345743233455785456788e95;\n\n  double basef_under = 1.1345743233455785456788e-27;\n  double based_under = 1.1345743233455785456788e-303;\n\n  double basef_over = 1.1345743233455785456788e+27;\n  double based_over = 1.1345743233455785456788e+302;\n\n  std::cout.precision(20);\n\n  std::cerr << \"\\nNo under/overflow:\\n\";\n  check_accuracy(basef_ok, based_ok, s);\n\n  std::cerr << \"\\nUnderflow:\\n\";\n  check_accuracy(basef_under, based_under, s);\n\n  std::cerr << \"\\nOverflow:\\n\";\n  check_accuracy(basef_over, based_over, s);\n\n  std::cerr << \"\\nVarying (over):\\n\";\n  for (int k=0; k<1; ++k)\n  {\n    check_accuracy_var(20,27,190,302,s);\n    std::cout << \"\\n\";\n  }\n\n  std::cerr << \"\\nVarying (under):\\n\";\n  for (int k=0; k<1; ++k)\n  {\n    check_accuracy_var(-27,20,-302,-190,s);\n    std::cout << \"\\n\";\n  }\n\n  std::cout.precision(4);\n  std::cerr << \"Performance (out of cache):\\n\";\n  {\n    int iters = 1;\n    VectorXf vf = VectorXf::Random(1024*1024*32) * y;\n    VectorXd vd = VectorXd::Random(1024*1024*32) * y;\n    VectorXcf vcf = VectorXcf::Random(1024*1024*32) * y;\n    BENCH_PERF(sqsumNorm);\n    BENCH_PERF(blueNorm);\n//     BENCH_PERF(pblueNorm);\n//     BENCH_PERF(lapackNorm);\n//     BENCH_PERF(hypotNorm);\n//     BENCH_PERF(twopassNorm);\n    BENCH_PERF(bl2passNorm);\n  }\n\n  std::cerr << \"\\nPerformance (in cache):\\n\";\n  {\n    int iters = 100000;\n    VectorXf vf = VectorXf::Random(512) * y;\n    VectorXd vd = VectorXd::Random(512) * y;\n    VectorXcf vcf = VectorXcf::Random(512) * y;\n    BENCH_PERF(sqsumNorm);\n    BENCH_PERF(blueNorm);\n//     BENCH_PERF(pblueNorm);\n//     BENCH_PERF(lapackNorm);\n//     BENCH_PERF(hypotNorm);\n//     BENCH_PERF(twopassNorm);\n    BENCH_PERF(bl2passNorm);\n  }\n}\n"
  },
  {
    "path": "libs/eigen/bench/bench_reverse.cpp",
    "content": "\n#include <iostream>\n#include <Eigen/Core>\n#include <bench/BenchUtil.h>\nusing namespace Eigen;\n\n#ifndef REPEAT\n#define REPEAT 100000\n#endif\n\n#ifndef TRIES\n#define TRIES 20\n#endif\n\ntypedef double Scalar;\n\ntemplate <typename MatrixType>\n__attribute__ ((noinline)) void bench_reverse(const MatrixType& m)\n{\n  int rows = m.rows();\n  int cols = m.cols();\n  int size = m.size();\n\n  int repeats = (REPEAT*1000)/size;\n  MatrixType a = MatrixType::Random(rows,cols);\n  MatrixType b = MatrixType::Random(rows,cols);\n\n  BenchTimer timerB, timerH, timerV;\n\n  Scalar acc = 0;\n  int r = internal::random<int>(0,rows-1);\n  int c = internal::random<int>(0,cols-1);\n  for (int t=0; t<TRIES; ++t)\n  {\n    timerB.start();\n    for (int k=0; k<repeats; ++k)\n    {\n      asm(\"#begin foo\");\n      b = a.reverse();\n      asm(\"#end foo\");\n      acc += b.coeff(r,c);\n    }\n    timerB.stop();\n  }\n\n  if (MatrixType::RowsAtCompileTime==Dynamic)\n    std::cout << \"dyn   \";\n  else\n    std::cout << \"fixed \";\n  std::cout << rows << \" x \" << cols << \" \\t\"\n            << (timerB.value() * REPEAT) / repeats << \"s \"\n            << \"(\" << 1e-6 * size*repeats/timerB.value() << \" MFLOPS)\\t\";\n\n  std::cout << \"\\n\";\n  // make sure the compiler does not optimize too much\n  if (acc==123)\n    std::cout << acc;\n}\n\nint main(int argc, char* argv[])\n{\n  const int dynsizes[] = {4,6,8,16,24,32,49,64,128,256,512,900,0};\n  std::cout << \"size            no sqrt                           standard\";\n//   #ifdef BENCH_GSL\n//   std::cout << \"       GSL (standard + double + ATLAS)  \";\n//   #endif\n  std::cout << \"\\n\";\n  for (uint i=0; dynsizes[i]>0; ++i)\n  {\n    bench_reverse(Matrix<Scalar,Dynamic,Dynamic>(dynsizes[i],dynsizes[i]));\n    bench_reverse(Matrix<Scalar,Dynamic,1>(dynsizes[i]*dynsizes[i]));\n  }\n//   bench_reverse(Matrix<Scalar,2,2>());\n//   bench_reverse(Matrix<Scalar,3,3>());\n//   bench_reverse(Matrix<Scalar,4,4>());\n//   bench_reverse(Matrix<Scalar,5,5>());\n//   bench_reverse(Matrix<Scalar,6,6>());\n//   bench_reverse(Matrix<Scalar,7,7>());\n//   bench_reverse(Matrix<Scalar,8,8>());\n//   bench_reverse(Matrix<Scalar,12,12>());\n//   bench_reverse(Matrix<Scalar,16,16>());\n  return 0;\n}\n\n"
  },
  {
    "path": "libs/eigen/bench/bench_sum.cpp",
    "content": "#include <iostream>\n#include <Eigen/Core>\nusing namespace Eigen;\nusing namespace std;\n\nint main() \n{\n  typedef Matrix<SCALAR,Eigen::Dynamic,1> Vec;\n  Vec v(SIZE);\n  v.setZero();\n  v[0] = 1;\n  v[1] = 2;\n  for(int i = 0; i < 1000000; i++)\n  {\n    v.coeffRef(0) += v.sum() * SCALAR(1e-20);\n  }\n  cout << v.sum() << endl;\n}\n"
  },
  {
    "path": "libs/eigen/bench/bench_unrolling",
    "content": "#!/bin/bash\n\n# gcc : CXX=\"g++  -finline-limit=10000 -ftemplate-depth-2000 --param max-inline-recursive-depth=2000\"\n# icc : CXX=\"icpc -fast -no-inline-max-size -fno-exceptions\"\nCXX=${CXX-g++  -finline-limit=10000 -ftemplate-depth-2000 --param max-inline-recursive-depth=2000} # default value\n\nfor ((i=1; i<16; ++i)); do\n    echo \"Matrix size: $i x $i :\"\n    $CXX -O3 -I.. -DNDEBUG  benchmark.cpp -DMATSIZE=$i -DEIGEN_UNROLLING_LIMIT=400 -o benchmark && time ./benchmark >/dev/null\n    $CXX -O3 -I.. -DNDEBUG -finline-limit=10000 benchmark.cpp -DMATSIZE=$i -DEIGEN_DONT_USE_UNROLLED_LOOPS=1 -o benchmark && time ./benchmark >/dev/null\n    echo \" \"\ndone\n"
  },
  {
    "path": "libs/eigen/bench/benchmark.cpp",
    "content": "// g++ -O3 -DNDEBUG -DMATSIZE=<x> benchmark.cpp -o benchmark && time ./benchmark\n\n#include <iostream>\n\n#include <Eigen/Core>\n\n#ifndef MATSIZE\n#define MATSIZE 3\n#endif\n\nusing namespace std;\nusing namespace Eigen;\n\n#ifndef REPEAT\n#define REPEAT 40000000\n#endif\n\n#ifndef SCALAR\n#define SCALAR double\n#endif\n\nint main(int argc, char *argv[])\n{\n    Matrix<SCALAR,MATSIZE,MATSIZE> I = Matrix<SCALAR,MATSIZE,MATSIZE>::Ones();\n    Matrix<SCALAR,MATSIZE,MATSIZE> m;\n    for(int i = 0; i < MATSIZE; i++)\n        for(int j = 0; j < MATSIZE; j++)\n        {\n            m(i,j) = (i+MATSIZE*j);\n        }\n    asm(\"#begin\");\n    for(int a = 0; a < REPEAT; a++)\n    {\n        m = Matrix<SCALAR,MATSIZE,MATSIZE>::Ones() + 0.00005 * (m + (m*m));\n    }\n    asm(\"#end\");\n    cout << m << endl;\n    return 0;\n}\n"
  },
  {
    "path": "libs/eigen/bench/benchmarkSlice.cpp",
    "content": "// g++ -O3 -DNDEBUG benchmarkX.cpp -o benchmarkX && time ./benchmarkX\n\n#include <iostream>\n\n#include <Eigen/Core>\n\nusing namespace std;\nusing namespace Eigen;\n\n#ifndef REPEAT\n#define REPEAT 10000\n#endif\n\n#ifndef SCALAR\n#define SCALAR float\n#endif\n\nint main(int argc, char *argv[])\n{\n  typedef Matrix<SCALAR, Eigen::Dynamic, Eigen::Dynamic> Mat;\n  Mat m(100, 100);\n  m.setRandom();\n\n  for(int a = 0; a < REPEAT; a++)\n  {\n    int r, c, nr, nc;\n    r = Eigen::internal::random<int>(0,10);\n    c = Eigen::internal::random<int>(0,10);\n    nr = Eigen::internal::random<int>(50,80);\n    nc = Eigen::internal::random<int>(50,80);\n    m.block(r,c,nr,nc) += Mat::Ones(nr,nc);\n    m.block(r,c,nr,nc) *= SCALAR(10);\n    m.block(r,c,nr,nc) -= Mat::constant(nr,nc,10);\n    m.block(r,c,nr,nc) /= SCALAR(10);\n  }\n  cout << m[0] << endl;\n  return 0;\n}\n"
  },
  {
    "path": "libs/eigen/bench/benchmarkX.cpp",
    "content": "// g++ -fopenmp -I .. -O3 -DNDEBUG -finline-limit=1000 benchmarkX.cpp -o b && time ./b\n\n#include <iostream>\n\n#include <Eigen/Core>\n\nusing namespace std;\nusing namespace Eigen;\n\n#ifndef MATTYPE\n#define MATTYPE MatrixXLd\n#endif\n\n#ifndef MATSIZE\n#define MATSIZE 400\n#endif\n\n#ifndef REPEAT\n#define REPEAT 100\n#endif\n\nint main(int argc, char *argv[])\n{\n\tMATTYPE I = MATTYPE::Ones(MATSIZE,MATSIZE);\n\tMATTYPE m(MATSIZE,MATSIZE);\n\tfor(int i = 0; i < MATSIZE; i++) for(int j = 0; j < MATSIZE; j++)\n\t{\n\t\tm(i,j) = (i+j+1)/(MATSIZE*MATSIZE);\n\t}\n\tfor(int a = 0; a < REPEAT; a++)\n\t{\n\t\tm = I + 0.0001 * (m + m*m);\n\t}\n\tcout << m(0,0) << endl;\n\treturn 0;\n}\n"
  },
  {
    "path": "libs/eigen/bench/benchmarkXcwise.cpp",
    "content": "// g++ -O3 -DNDEBUG benchmarkX.cpp -o benchmarkX && time ./benchmarkX\n\n#include <iostream>\n#include <Eigen/Core>\n\nusing namespace std;\nusing namespace Eigen;\n\n#ifndef VECTYPE\n#define VECTYPE VectorXLd\n#endif\n\n#ifndef VECSIZE\n#define VECSIZE 1000000\n#endif\n\n#ifndef REPEAT\n#define REPEAT 1000\n#endif\n\nint main(int argc, char *argv[])\n{\n\tVECTYPE I = VECTYPE::Ones(VECSIZE);\n\tVECTYPE m(VECSIZE,1);\n\tfor(int i = 0; i < VECSIZE; i++)\n\t{\n\t\tm[i] = 0.1 * i/VECSIZE;\n\t}\n\tfor(int a = 0; a < REPEAT; a++)\n\t{\n\t\tm = VECTYPE::Ones(VECSIZE) + 0.00005 * (m.cwise().square() + m/4);\n\t}\n\tcout << m[0] << endl;\n\treturn 0;\n}\n"
  },
  {
    "path": "libs/eigen/bench/benchmark_suite",
    "content": "#!/bin/bash\nCXX=${CXX-g++} # default value unless caller has defined CXX\necho \"Fixed size 3x3, column-major, -DNDEBUG\"\n$CXX -O3 -I .. -DNDEBUG benchmark.cpp -o benchmark && time ./benchmark >/dev/null\necho \"Fixed size 3x3, column-major, with asserts\"\n$CXX -O3 -I .. benchmark.cpp -o benchmark && time ./benchmark >/dev/null\necho \"Fixed size 3x3, row-major, -DNDEBUG\"\n$CXX -O3 -I .. -DEIGEN_DEFAULT_TO_ROW_MAJOR -DNDEBUG benchmark.cpp -o benchmark && time ./benchmark >/dev/null\necho \"Fixed size 3x3, row-major, with asserts\"\n$CXX -O3 -I .. -DEIGEN_DEFAULT_TO_ROW_MAJOR benchmark.cpp -o benchmark && time ./benchmark >/dev/null\necho \"Dynamic size 20x20, column-major, -DNDEBUG\"\n$CXX -O3 -I .. -DNDEBUG benchmarkX.cpp -o benchmarkX && time ./benchmarkX >/dev/null\necho \"Dynamic size 20x20, column-major, with asserts\"\n$CXX -O3 -I .. benchmarkX.cpp -o benchmarkX && time ./benchmarkX >/dev/null\necho \"Dynamic size 20x20, row-major, -DNDEBUG\"\n$CXX -O3 -I .. -DEIGEN_DEFAULT_TO_ROW_MAJOR -DNDEBUG benchmarkX.cpp -o benchmarkX && time ./benchmarkX >/dev/null\necho \"Dynamic size 20x20, row-major, with asserts\"\n$CXX -O3 -I .. -DEIGEN_DEFAULT_TO_ROW_MAJOR benchmarkX.cpp -o benchmarkX && time ./benchmarkX >/dev/null\n"
  },
  {
    "path": "libs/eigen/bench/btl/CMakeLists.txt",
    "content": "PROJECT(BTL)\n\nCMAKE_MINIMUM_REQUIRED(VERSION 2.6.2)\n\nset(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake ${Eigen_SOURCE_DIR}/cmake)\ninclude(MacroOptionalAddSubdirectory)\n\nOPTION(BTL_NOVEC \"Disable SSE/Altivec optimizations when possible\" OFF)\n\nSET(CMAKE_INCLUDE_CURRENT_DIR ON)\n\nstring(REGEX MATCH icpc IS_ICPC ${CMAKE_CXX_COMPILER})\nIF(CMAKE_COMPILER_IS_GNUCXX OR IS_ICPC)\n  SET(CMAKE_CXX_FLAGS \"-g0 -O3 -DNDEBUG\")\n  SET(CMAKE_Fortran_FLAGS \"-g0 -O3 -DNDEBUG\")\n  IF(NOT BTL_NOVEC)\n    SET(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -msse2\")\n    SET(CMAKE_Fortran_FLAGS \"${CMAKE_Fortran_FLAGS} -msse2\")\n  ELSE(NOT BTL_NOVEC)\n    SET(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -DEIGEN_DONT_VECTORIZE\")\n  ENDIF(NOT BTL_NOVEC)\nENDIF(CMAKE_COMPILER_IS_GNUCXX OR IS_ICPC)\n\nIF(MSVC)\n  SET(CMAKE_CXX_FLAGS \" /O2 /Ot /GL /fp:fast -DNDEBUG\")\n#   SET(CMAKE_Fortran_FLAGS \"-g0 -O3 -DNDEBUG\")\n  IF(NOT BTL_NOVEC)\n    SET(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} /arch:SSE2\")\n  ELSE(NOT BTL_NOVEC)\n    SET(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -DEIGEN_DONT_VECTORIZE\")\n  ENDIF(NOT BTL_NOVEC)\nENDIF(MSVC)\n\nif(IS_ICPC)\n  set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -fast\")\n  set(CMAKE_Fortran_FLAGS \"${CMAKE_Fortran_FLAGS} -fast\")\nendif(IS_ICPC)\n\ninclude_directories(\n  ${PROJECT_SOURCE_DIR}/actions\n  ${PROJECT_SOURCE_DIR}/generic_bench\n  ${PROJECT_SOURCE_DIR}/generic_bench/utils\n  ${PROJECT_SOURCE_DIR}/libs/STL)\n\n# find_package(MKL)\n# if (MKL_FOUND)\n#   add_definitions(-DHAVE_MKL)\n#   set(DEFAULT_LIBRARIES ${MKL_LIBRARIES})\n# endif (MKL_FOUND)\n\nMACRO(BTL_ADD_BENCH targetname)\n\n  foreach(_current_var ${ARGN})\n    set(_last_var ${_current_var})\n  endforeach(_current_var)\n\n  set(_sources ${ARGN})\n  list(LENGTH _sources _argn_length)\n\n  list(REMOVE_ITEM _sources ON OFF TRUE FALSE)\n\n  list(LENGTH _sources _src_length)\n\n  if (${_argn_length} EQUAL ${_src_length})\n    set(_last_var ON)\n  endif (${_argn_length} EQUAL ${_src_length})\n\n  OPTION(BUILD_${targetname} \"Build benchmark ${targetname}\" ${_last_var})\n\n  IF(BUILD_${targetname})\n    ADD_EXECUTABLE(${targetname} ${_sources})\n    ADD_TEST(${targetname} \"${targetname}\")\n    target_link_libraries(${targetname} ${DEFAULT_LIBRARIES} rt)\n  ENDIF(BUILD_${targetname})\n\nENDMACRO(BTL_ADD_BENCH)\n\nmacro(btl_add_target_property target prop value)\n\n  if(BUILD_${target})\n    get_target_property(previous ${target} ${prop})\n    if(NOT previous)\n      set(previous \"\")\n    endif()\n    set_target_properties(${target} PROPERTIES ${prop} \"${previous} ${value}\")\n  endif()\n\nendmacro(btl_add_target_property)\n\nENABLE_TESTING()\n\nadd_subdirectory(libs/eigen3)\nadd_subdirectory(libs/eigen2)\nadd_subdirectory(libs/BLAS)\nadd_subdirectory(libs/ublas)\nadd_subdirectory(libs/gmm)\nadd_subdirectory(libs/mtl4)\nadd_subdirectory(libs/blitz)\nadd_subdirectory(libs/tvmet)\nadd_subdirectory(libs/STL)\n\nadd_subdirectory(data)\n\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/COPYING",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundation, Inc.\n                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\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 licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicense is intended to guarantee your freedom to share and change free\nsoftware--to make sure the software is free for all its users.  This\nGeneral Public License applies to most of the Free Software\nFoundation's software and to any other program whose authors commit to\nusing it.  (Some other Free Software Foundation software is covered by\nthe GNU Library General Public License instead.)  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\nthis service if you wish), that you receive source code or can get it\nif you want it, that you can change the software or use pieces of it\nin new free programs; and that you know you can do these things.\n\n  To protect your rights, we need to make restrictions that forbid\nanyone to deny you these rights or to ask you to surrender the rights.\nThese restrictions translate to certain responsibilities for you if you\ndistribute copies of the software, or if you modify it.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must give the recipients all the rights that\nyou have.  You must make sure that they, too, receive or can get the\nsource code.  And you must show them these terms so they know their\nrights.\n\n  We protect your rights with two steps: (1) copyright the software, and\n(2) offer you this license which gives you legal permission to copy,\ndistribute and/or modify the software.\n\n  Also, for each author's protection and ours, we want to make certain\nthat everyone understands that there is no warranty for this free\nsoftware.  If the software is modified by someone else and passed on, we\nwant its recipients to know that what they have is not the original, so\nthat any problems introduced by others will not reflect on the original\nauthors' reputations.\n\n  Finally, any free program is threatened constantly by software\npatents.  We wish to avoid the danger that redistributors of a free\nprogram will individually obtain patent licenses, in effect making the\nprogram proprietary.  To prevent this, we have made it clear that any\npatent must be licensed for everyone's free use or not licensed at all.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                    GNU GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License applies to any program or other work which contains\na notice placed by the copyright holder saying it may be distributed\nunder the terms of this General Public License.  The \"Program\", below,\nrefers to any such program or work, and a \"work based on the Program\"\nmeans either the Program or any derivative work under copyright law:\nthat is to say, a work containing the Program or a portion of it,\neither verbatim or with modifications and/or translated into another\nlanguage.  (Hereinafter, translation is included without limitation in\nthe term \"modification\".)  Each licensee is addressed as \"you\".\n\nActivities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning the Program is not restricted, and the output from the Program\nis covered only if its contents constitute a work based on the\nProgram (independent of having been made by running the Program).\nWhether that is true depends on what the Program does.\n\n  1. You may copy and distribute verbatim copies of the Program's\nsource code as you receive it, in any medium, provided that you\nconspicuously and appropriately publish on each copy an appropriate\ncopyright notice and disclaimer of warranty; keep intact all the\nnotices that refer to this License and to the absence of any warranty;\nand give any other recipients of the Program a copy of this License\nalong with the Program.\n\nYou may charge a fee for the physical act of transferring a copy, and\nyou may at your option offer warranty protection in exchange for a fee.\n\n  2. You may modify your copy or copies of the Program or any portion\nof it, thus forming a work based on the Program, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) You must cause the modified files to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    b) You must cause any work that you distribute or publish, that in\n    whole or in part contains or is derived from the Program or any\n    part thereof, to be licensed as a whole at no charge to all third\n    parties under the terms of this License.\n\n    c) If the modified program normally reads commands interactively\n    when run, you must cause it, when started running for such\n    interactive use in the most ordinary way, to print or display an\n    announcement including an appropriate copyright notice and a\n    notice that there is no warranty (or else, saying that you provide\n    a warranty) and that users may redistribute the program under\n    these conditions, and telling the user how to view a copy of this\n    License.  (Exception: if the Program itself is interactive but\n    does not normally print such an announcement, your work based on\n    the Program is not required to print an announcement.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Program,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Program, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote it.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Program.\n\nIn addition, mere aggregation of another work not based on the Program\nwith the Program (or with a work based on the Program) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may copy and distribute the Program (or a work based on it,\nunder Section 2) in object code or executable form under the terms of\nSections 1 and 2 above provided that you also do one of the following:\n\n    a) Accompany it with the complete corresponding machine-readable\n    source code, which must be distributed under the terms of Sections\n    1 and 2 above on a medium customarily used for software interchange; or,\n\n    b) Accompany it with a written offer, valid for at least three\n    years, to give any third party, for a charge no more than your\n    cost of physically performing source distribution, a complete\n    machine-readable copy of the corresponding source code, to be\n    distributed under the terms of Sections 1 and 2 above on a medium\n    customarily used for software interchange; or,\n\n    c) Accompany it with the information you received as to the offer\n    to distribute corresponding source code.  (This alternative is\n    allowed only for noncommercial distribution and only if you\n    received the program in object code or executable form with such\n    an offer, in accord with Subsection b above.)\n\nThe source code for a work means the preferred form of the work for\nmaking modifications to it.  For an executable work, complete source\ncode means all the source code for all modules it contains, plus any\nassociated interface definition files, plus the scripts used to\ncontrol compilation and installation of the executable.  However, as a\nspecial exception, the source code distributed need not include\nanything that is normally distributed (in either source or binary\nform) with the major components (compiler, kernel, and so on) of the\noperating system on which the executable runs, unless that component\nitself accompanies the executable.\n\nIf distribution of executable or object code is made by offering\naccess to copy from a designated place, then offering equivalent\naccess to copy the source code from the same place counts as\ndistribution of the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  4. You may not copy, modify, sublicense, or distribute the Program\nexcept as expressly provided under this License.  Any attempt\notherwise to copy, modify, sublicense or distribute the Program is\nvoid, and will automatically terminate your rights under this License.\nHowever, parties who have received copies, or rights, from you under\nthis License will not have their licenses terminated so long as such\nparties remain in full compliance.\n\n  5. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Program or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Program (or any work based on the\nProgram), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Program or works based on it.\n\n  6. Each time you redistribute the Program (or any work based on the\nProgram), the recipient automatically receives a license from the\noriginal licensor to copy, distribute or modify the Program subject to\nthese terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties to\nthis License.\n\n  7. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions 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\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Program at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Program by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Program.\n\nIf any portion of this section is held invalid or unenforceable under\nany particular circumstance, the balance of the section is intended to\napply and the section as a whole is intended to apply in other\ncircumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system, which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  8. If the distribution and/or use of the Program is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Program under this License\nmay add an explicit geographical distribution limitation excluding\nthose countries, so that distribution is permitted only in or among\ncountries not thus excluded.  In such case, this License incorporates\nthe limitation as if written in the body of this License.\n\n  9. The Free Software Foundation may publish revised and/or new versions\nof the 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\nEach version is given a distinguishing version number.  If the Program\nspecifies a version number of this License which applies to it and \"any\nlater version\", you have the option of following the terms and conditions\neither of that version or of any later version published by the Free\nSoftware Foundation.  If the Program does not specify a version number of\nthis License, you may choose any version ever published by the Free Software\nFoundation.\n\n  10. If you wish to incorporate parts of the Program into other free\nprograms whose distribution conditions are different, write to the author\nto ask for permission.  For software which is copyrighted by the Free\nSoftware Foundation, write to the Free Software Foundation; we sometimes\nmake exceptions for this.  Our decision will be guided by the two goals\nof preserving the free status of all derivatives of our free software and\nof promoting the sharing and reuse of software generally.\n\n                            NO WARRANTY\n\n  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\nFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\nOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\nPROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\nOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\nTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\nPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\nREPAIR OR CORRECTION.\n\n  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\nREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\nINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\nOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\nTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\nYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\nPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGES.\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\nconvey 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 2 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, write to the Free Software\n    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n\nAlso add information on how to contact you by electronic and paper mail.\n\nIf the program is interactive, make it output a short notice like this\nwhen it starts in an interactive mode:\n\n    Gnomovision version 69, Copyright (C) year name of author\n    Gnomovision 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, the commands you use may\nbe called something other than `show w' and `show c'; they could even be\nmouse-clicks or menu items--whatever suits your program.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the program, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n  `Gnomovision' (which makes passes at compilers) written by James Hacker.\n\n  <signature of Ty Coon>, 1 April 1989\n  Ty Coon, President of Vice\n\nThis General Public License does not permit incorporating your program into\nproprietary programs.  If your program is a subroutine library, you may\nconsider it more useful to permit linking proprietary applications with the\nlibrary.  If this is what you want to do, use the GNU Library General\nPublic License instead of this License.\n"
  },
  {
    "path": "libs/eigen/bench/btl/README",
    "content": "Bench Template Library\n\n****************************************\nIntroduction :\n\nThe aim of this project is to compare the performance\nof available numerical libraries. The code is designed\nas generic and modular as possible. Thus, adding new\nnumerical libraries or new numerical tests should\nrequire minimal effort.\n\n\n*****************************************\n\nInstallation :\n\nBTL uses cmake / ctest:\n\n1 - create a build directory:\n\n  $ mkdir build\n  $ cd build\n\n2 - configure:\n\n  $ ccmake ..\n\n3 - run the bench using ctest:\n\n  $ ctest -V\n\nYou can run the benchmarks only on libraries matching a given regular expression:\n  ctest -V -R <regexp>\nFor instance:\n  ctest -V -R eigen2\n\nYou can also select a given set of actions defining the environment variable BTL_CONFIG this way:\n  BTL_CONFIG=\"-a action1{:action2}*\" ctest -V\nAn exemple:\n  BTL_CONFIG=\"-a axpy:vector_matrix:trisolve:ata\" ctest -V -R eigen2\n\nFinally, if bench results already exist (the bench*.dat files) then they merges by keeping the best for each matrix size. If you want to overwrite the previous ones you can simply add the \"--overwrite\" option:\n  BTL_CONFIG=\"-a axpy:vector_matrix:trisolve:ata --overwrite\" ctest -V -R eigen2\n\n4 : Analyze the result. different data files (.dat) are produced in each libs directories.\n If gnuplot is available, choose a directory name in the data directory to store the results and type:\n        $ cd data\n        $ mkdir my_directory\n        $ cp ../libs/*/*.dat my_directory\n Build the data utilities in this (data) directory\n        make\n Then you can look the raw data,\n        go_mean my_directory\n or smooth the data first :\n\tsmooth_all.sh my_directory\n\tgo_mean my_directory_smooth\n\n\n*************************************************\n\nFiles and directories :\n\n generic_bench : all the bench sources common to all libraries\n\n actions : sources for different action wrappers (axpy, matrix-matrix product) to be tested.\n\n libs/* : bench sources specific to each tested libraries.\n\n machine_dep : directory used to store machine specific Makefile.in\n\n data : directory used to store gnuplot scripts and data analysis utilities\n\n**************************************************\n\nPrinciples : the code modularity is achieved by defining two concepts :\n\n ****** Action concept : This is a class defining which kind\n  of test must be performed (e.g. a matrix_vector_product).\n\tAn Action should define the following methods :\n\n        *** Ctor using the size of the problem (matrix or vector size) as an argument\n\t    Action action(size);\n        *** initialize : this method initialize the calculation (e.g. initialize the matrices and vectors arguments)\n\t    action.initialize();\n\t*** calculate : this method actually launch the calculation to be benchmarked\n\t    action.calculate;\n\t*** nb_op_base() : this method returns the complexity of the calculate method (allowing the mflops evaluation)\n        *** name() : this method returns the name of the action (std::string)\n\n ****** Interface concept : This is a class or namespace defining how to use a given library and\n  its specific containers (matrix and vector). Up to now an interface should following types\n\n\t*** real_type : kind of float to be used (float or double)\n\t*** stl_vector : must correspond to std::vector<real_type>\n\t*** stl_matrix : must correspond to std::vector<stl_vector>\n\t*** gene_vector : the vector type for this interface        --> e.g. (real_type *) for the C_interface\n\t*** gene_matrix : the matrix type for this interface        --> e.g. (gene_vector *) for the C_interface\n\n\t+ the following common methods\n\n        *** free_matrix(gene_matrix & A, int N)  dealocation of a N sized gene_matrix A\n        *** free_vector(gene_vector & B)  dealocation of a N sized gene_vector B\n        *** matrix_from_stl(gene_matrix & A, stl_matrix & A_stl) copy the content of an stl_matrix A_stl into a gene_matrix A.\n\t     The allocation of A is done in this function.\n\t*** vector_to_stl(gene_vector & B, stl_vector & B_stl)  copy the content of an stl_vector B_stl into a gene_vector B.\n\t     The allocation of B is done in this function.\n        *** matrix_to_stl(gene_matrix & A, stl_matrix & A_stl) copy the content of an gene_matrix A into an stl_matrix A_stl.\n             The size of A_STL must corresponds to the size of A.\n        *** vector_to_stl(gene_vector & A, stl_vector & A_stl) copy the content of an gene_vector A into an stl_vector A_stl.\n             The size of B_STL must corresponds to the size of B.\n\t*** copy_matrix(gene_matrix & source, gene_matrix & cible, int N) : copy the content of source in cible. Both source\n\t\tand cible must be sized NxN.\n\t*** copy_vector(gene_vector & source, gene_vector & cible, int N) : copy the content of source in cible. Both source\n \t\tand cible must be sized N.\n\n\tand the following method corresponding to the action one wants to be benchmarked :\n\n\t***  matrix_vector_product(const gene_matrix & A, const gene_vector & B, gene_vector & X, int N)\n\t***  matrix_matrix_product(const gene_matrix & A, const gene_matrix & B, gene_matrix & X, int N)\n        ***  ata_product(const gene_matrix & A, gene_matrix & X, int N)\n\t***  aat_product(const gene_matrix & A, gene_matrix & X, int N)\n        ***  axpy(real coef, const gene_vector & X, gene_vector & Y, int N)\n\n The bench algorithm (generic_bench/bench.hh) is templated with an action itself templated with\n an interface. A typical main.cpp source stored in a given library directory libs/A_LIB\n looks like :\n\n bench< AN_ACTION < AN_INTERFACE > >( 10 , 1000 , 50 ) ;\n\n this function will produce XY data file containing measured  mflops as a function of the size for 50\n sizes between 10 and 10000.\n\n This algorithm can be adapted by providing a given Perf_Analyzer object which determines how the time\n measurements must be done. For example, the X86_Perf_Analyzer use the asm rdtsc function and provides\n a very fast and accurate (but less portable) timing method. The default is the Portable_Perf_Analyzer\n so\n\n bench< AN_ACTION < AN_INTERFACE > >( 10 , 1000 , 50 ) ;\n\n is equivalent to\n\n bench< Portable_Perf_Analyzer,AN_ACTION < AN_INTERFACE > >( 10 , 1000 , 50 ) ;\n\n If your system supports it we suggest to use a mixed implementation (X86_perf_Analyzer+Portable_Perf_Analyzer).\n replace\n     bench<Portable_Perf_Analyzer,Action>(size_min,size_max,nb_point);\n with\n     bench<Mixed_Perf_Analyzer,Action>(size_min,size_max,nb_point);\n in generic/bench.hh\n\n.\n\n\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/actions/action_aat_product.hh",
    "content": "//=====================================================\n// File   :  action_aat_product.hh\n// Author :  L. Plagne <laurent.plagne@edf.fr)>\n// Copyright (C) EDF R&D,  lun sep 30 14:23:19 CEST 2002\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#ifndef ACTION_AAT_PRODUCT\n#define ACTION_AAT_PRODUCT\n#include \"utilities.h\"\n#include \"STL_interface.hh\"\n#include <string>\n#include \"init/init_function.hh\"\n#include \"init/init_vector.hh\"\n#include \"init/init_matrix.hh\"\n\nusing namespace std;\n\ntemplate<class Interface>\nclass Action_aat_product {\n\npublic :\n\n  // Ctor\n\n  Action_aat_product( int size ):_size(size)\n  {\n    MESSAGE(\"Action_aat_product Ctor\");\n\n    // STL matrix and vector initialization\n\n    init_matrix<pseudo_random>(A_stl,_size);\n    init_matrix<null_function>(X_stl,_size);\n    init_matrix<null_function>(resu_stl,_size);\n\n    // generic matrix and vector initialization\n\n    Interface::matrix_from_stl(A_ref,A_stl);\n    Interface::matrix_from_stl(X_ref,X_stl);\n\n    Interface::matrix_from_stl(A,A_stl);\n    Interface::matrix_from_stl(X,X_stl);\n\n  }\n\n  // invalidate copy ctor\n\n  Action_aat_product( const  Action_aat_product & )\n  {\n    INFOS(\"illegal call to Action_aat_product Copy Ctor\");\n    exit(0);\n  }\n\n  // Dtor\n\n  ~Action_aat_product( void ){\n\n    MESSAGE(\"Action_aat_product Dtor\");\n\n    // deallocation\n\n    Interface::free_matrix(A,_size);\n    Interface::free_matrix(X,_size);\n\n    Interface::free_matrix(A_ref,_size);\n    Interface::free_matrix(X_ref,_size);\n\n  }\n\n  // action name\n\n  static inline std::string name( void )\n  {\n    return \"aat_\"+Interface::name();\n  }\n\n  double nb_op_base( void ){\n    return double(_size)*double(_size)*double(_size);\n  }\n\n  inline void initialize( void ){\n\n    Interface::copy_matrix(A_ref,A,_size);\n    Interface::copy_matrix(X_ref,X,_size);\n\n  }\n\n  inline void calculate( void ) {\n\n      Interface::aat_product(A,X,_size);\n\n  }\n\n  void check_result( void ){\n    if (_size>128) return;\n    // calculation check\n\n    Interface::matrix_to_stl(X,resu_stl);\n\n    STL_interface<typename Interface::real_type>::aat_product(A_stl,X_stl,_size);\n\n    typename Interface::real_type error=\n      STL_interface<typename Interface::real_type>::norm_diff(X_stl,resu_stl);\n\n    if (error>1.e-6){\n      INFOS(\"WRONG CALCULATION...residual=\" << error);\n      exit(1);\n    }\n\n  }\n\nprivate :\n\n  typename Interface::stl_matrix A_stl;\n  typename Interface::stl_matrix X_stl;\n  typename Interface::stl_matrix resu_stl;\n\n  typename Interface::gene_matrix A_ref;\n  typename Interface::gene_matrix X_ref;\n\n  typename Interface::gene_matrix A;\n  typename Interface::gene_matrix X;\n\n\n  int _size;\n\n};\n\n\n#endif\n\n\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/actions/action_ata_product.hh",
    "content": "//=====================================================\n// File   :  action_ata_product.hh\n// Author :  L. Plagne <laurent.plagne@edf.fr)>\n// Copyright (C) EDF R&D,  lun sep 30 14:23:19 CEST 2002\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#ifndef ACTION_ATA_PRODUCT\n#define ACTION_ATA_PRODUCT\n#include \"utilities.h\"\n#include \"STL_interface.hh\"\n#include <string>\n#include \"init/init_function.hh\"\n#include \"init/init_vector.hh\"\n#include \"init/init_matrix.hh\"\n\nusing namespace std;\n\ntemplate<class Interface>\nclass Action_ata_product {\n\npublic :\n\n  // Ctor\n\n  Action_ata_product( int size ):_size(size)\n  {\n    MESSAGE(\"Action_ata_product Ctor\");\n\n    // STL matrix and vector initialization\n\n    init_matrix<pseudo_random>(A_stl,_size);\n    init_matrix<null_function>(X_stl,_size);\n    init_matrix<null_function>(resu_stl,_size);\n\n    // generic matrix and vector initialization\n\n    Interface::matrix_from_stl(A_ref,A_stl);\n    Interface::matrix_from_stl(X_ref,X_stl);\n\n    Interface::matrix_from_stl(A,A_stl);\n    Interface::matrix_from_stl(X,X_stl);\n\n  }\n\n  // invalidate copy ctor\n\n  Action_ata_product( const  Action_ata_product & )\n  {\n    INFOS(\"illegal call to Action_ata_product Copy Ctor\");\n    exit(0);\n  }\n\n  // Dtor\n\n  ~Action_ata_product( void ){\n\n    MESSAGE(\"Action_ata_product Dtor\");\n\n    // deallocation\n\n    Interface::free_matrix(A,_size);\n    Interface::free_matrix(X,_size);\n\n    Interface::free_matrix(A_ref,_size);\n    Interface::free_matrix(X_ref,_size);\n\n  }\n\n  // action name\n\n  static inline std::string name( void )\n  {\n    return \"ata_\"+Interface::name();\n  }\n\n  double nb_op_base( void ){\n    return 2.0*_size*_size*_size;\n  }\n\n  inline void initialize( void ){\n\n    Interface::copy_matrix(A_ref,A,_size);\n    Interface::copy_matrix(X_ref,X,_size);\n\n  }\n\n  inline void calculate( void ) {\n\n      Interface::ata_product(A,X,_size);\n\n  }\n\n  void check_result( void ){\n    if (_size>128) return;\n    // calculation check\n\n    Interface::matrix_to_stl(X,resu_stl);\n\n    STL_interface<typename Interface::real_type>::ata_product(A_stl,X_stl,_size);\n\n    typename Interface::real_type error=\n      STL_interface<typename Interface::real_type>::norm_diff(X_stl,resu_stl);\n\n    if (error>1.e-6){\n      INFOS(\"WRONG CALCULATION...residual=\" << error);\n      exit(1);\n    }\n\n  }\n\nprivate :\n\n  typename Interface::stl_matrix A_stl;\n  typename Interface::stl_matrix X_stl;\n  typename Interface::stl_matrix resu_stl;\n\n  typename Interface::gene_matrix A_ref;\n  typename Interface::gene_matrix X_ref;\n\n  typename Interface::gene_matrix A;\n  typename Interface::gene_matrix X;\n\n\n  int _size;\n\n};\n\n\n#endif\n\n\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/actions/action_atv_product.hh",
    "content": "//=====================================================\n// File   :  action_atv_product.hh\n// Author :  L. Plagne <laurent.plagne@edf.fr)>\n// Copyright (C) EDF R&D,  lun sep 30 14:23:19 CEST 2002\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#ifndef ACTION_ATV_PRODUCT\n#define ACTION_ATV_PRODUCT\n#include \"utilities.h\"\n#include \"STL_interface.hh\"\n#include <string>\n#include \"init/init_function.hh\"\n#include \"init/init_vector.hh\"\n#include \"init/init_matrix.hh\"\n\nusing namespace std;\n\ntemplate<class Interface>\nclass Action_atv_product {\n\npublic :\n\n  Action_atv_product( int size ) : _size(size)\n  {\n    MESSAGE(\"Action_atv_product Ctor\");\n\n    // STL matrix and vector initialization\n\n    init_matrix<pseudo_random>(A_stl,_size);\n    init_vector<pseudo_random>(B_stl,_size);\n    init_vector<null_function>(X_stl,_size);\n    init_vector<null_function>(resu_stl,_size);\n\n    // generic matrix and vector initialization\n\n    Interface::matrix_from_stl(A_ref,A_stl);\n    Interface::vector_from_stl(B_ref,B_stl);\n    Interface::vector_from_stl(X_ref,X_stl);\n\n    Interface::matrix_from_stl(A,A_stl);\n    Interface::vector_from_stl(B,B_stl);\n    Interface::vector_from_stl(X,X_stl);\n  }\n\n  // invalidate copy ctor\n  Action_atv_product( const  Action_atv_product & )\n  {\n    INFOS(\"illegal call to Action_atv_product Copy Ctor\");\n    exit(1);\n  }\n\n  ~Action_atv_product( void )\n  {\n    MESSAGE(\"Action_atv_product Dtor\");\n\n    Interface::free_matrix(A,_size);\n    Interface::free_vector(B);\n    Interface::free_vector(X);\n\n    Interface::free_matrix(A_ref,_size);\n    Interface::free_vector(B_ref);\n    Interface::free_vector(X_ref);\n  }\n\n  static inline std::string name() { return \"atv_\" + Interface::name(); }\n\n  double nb_op_base( void ) { return 2.0*_size*_size; }\n\n  inline void initialize( void ){\n    Interface::copy_matrix(A_ref,A,_size);\n    Interface::copy_vector(B_ref,B,_size);\n    Interface::copy_vector(X_ref,X,_size);\n  }\n\n  BTL_DONT_INLINE void calculate( void ) {\n    BTL_ASM_COMMENT(\"begin atv\");\n    Interface::atv_product(A,B,X,_size);\n    BTL_ASM_COMMENT(\"end atv\");\n  }\n\n  void check_result( void )\n  {\n    if (_size>128) return;\n    Interface::vector_to_stl(X,resu_stl);\n\n    STL_interface<typename Interface::real_type>::atv_product(A_stl,B_stl,X_stl,_size);\n\n    typename Interface::real_type error=\n      STL_interface<typename Interface::real_type>::norm_diff(X_stl,resu_stl);\n\n    if (error>1.e-6){\n      INFOS(\"WRONG CALCULATION...residual=\" << error);\n      exit(1);\n    }\n  }\n\nprivate :\n\n  typename Interface::stl_matrix A_stl;\n  typename Interface::stl_vector B_stl;\n  typename Interface::stl_vector X_stl;\n  typename Interface::stl_vector resu_stl;\n\n  typename Interface::gene_matrix A_ref;\n  typename Interface::gene_vector B_ref;\n  typename Interface::gene_vector X_ref;\n\n  typename Interface::gene_matrix A;\n  typename Interface::gene_vector B;\n  typename Interface::gene_vector X;\n\n\n  int _size;\n\n};\n\n\n#endif\n\n\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/actions/action_axpby.hh",
    "content": "//=====================================================\n// File   :  action_axpby.hh\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#ifndef ACTION_AXPBY\n#define ACTION_AXPBY\n#include \"utilities.h\"\n#include \"STL_interface.hh\"\n#include <string>\n#include \"init/init_function.hh\"\n#include \"init/init_vector.hh\"\n#include \"init/init_matrix.hh\"\n\nusing namespace std;\n\ntemplate<class Interface>\nclass Action_axpby {\n\npublic :\n\n  // Ctor\n  Action_axpby( int size ):_size(size),_alpha(0.5),_beta(0.95)\n  {\n    MESSAGE(\"Action_axpby Ctor\");\n\n    // STL vector initialization\n    init_vector<pseudo_random>(X_stl,_size);\n    init_vector<pseudo_random>(Y_stl,_size);\n    init_vector<null_function>(resu_stl,_size);\n\n    // generic matrix and vector initialization\n    Interface::vector_from_stl(X_ref,X_stl);\n    Interface::vector_from_stl(Y_ref,Y_stl);\n\n    Interface::vector_from_stl(X,X_stl);\n    Interface::vector_from_stl(Y,Y_stl);\n  }\n\n  // invalidate copy ctor\n  Action_axpby( const  Action_axpby & )\n  {\n    INFOS(\"illegal call to Action_axpby Copy Ctor\");\n    exit(1);\n  }\n\n  // Dtor\n  ~Action_axpby( void ){\n    MESSAGE(\"Action_axpby Dtor\");\n\n    // deallocation\n    Interface::free_vector(X_ref);\n    Interface::free_vector(Y_ref);\n\n    Interface::free_vector(X);\n    Interface::free_vector(Y);\n  }\n\n  // action name\n  static inline std::string name( void )\n  {\n    return \"axpby_\"+Interface::name();\n  }\n\n  double nb_op_base( void ){\n    return 3.0*_size;\n  }\n\n  inline void initialize( void ){\n    Interface::copy_vector(X_ref,X,_size);\n    Interface::copy_vector(Y_ref,Y,_size);\n  }\n\n  inline void calculate( void ) {\n    BTL_ASM_COMMENT(\"mybegin axpby\");\n    Interface::axpby(_alpha,X,_beta,Y,_size);\n    BTL_ASM_COMMENT(\"myend axpby\");\n  }\n\n  void check_result( void ){\n    if (_size>128) return;\n    // calculation check\n    Interface::vector_to_stl(Y,resu_stl);\n\n    STL_interface<typename Interface::real_type>::axpby(_alpha,X_stl,_beta,Y_stl,_size);\n\n    typename Interface::real_type error=\n      STL_interface<typename Interface::real_type>::norm_diff(Y_stl,resu_stl);\n\n    if (error>1.e-6){\n      INFOS(\"WRONG CALCULATION...residual=\" << error);\n      exit(2);\n    }\n  }\n\nprivate :\n\n  typename Interface::stl_vector X_stl;\n  typename Interface::stl_vector Y_stl;\n  typename Interface::stl_vector resu_stl;\n\n  typename Interface::gene_vector X_ref;\n  typename Interface::gene_vector Y_ref;\n\n  typename Interface::gene_vector X;\n  typename Interface::gene_vector Y;\n\n  typename Interface::real_type _alpha;\n  typename Interface::real_type _beta;\n\n  int _size;\n};\n\n#endif\n"
  },
  {
    "path": "libs/eigen/bench/btl/actions/action_axpy.hh",
    "content": "//=====================================================\n// File   :  action_axpy.hh\n// Author :  L. Plagne <laurent.plagne@edf.fr)>\n// Copyright (C) EDF R&D,  lun sep 30 14:23:19 CEST 2002\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#ifndef ACTION_AXPY\n#define ACTION_AXPY\n#include \"utilities.h\"\n#include \"STL_interface.hh\"\n#include <string>\n#include \"init/init_function.hh\"\n#include \"init/init_vector.hh\"\n#include \"init/init_matrix.hh\"\n\nusing namespace std;\n\ntemplate<class Interface>\nclass Action_axpy {\n\npublic :\n\n  // Ctor\n\n  Action_axpy( int size ):_size(size),_coef(1.0)\n  {\n    MESSAGE(\"Action_axpy Ctor\");\n\n    // STL vector initialization\n\n    init_vector<pseudo_random>(X_stl,_size);\n    init_vector<pseudo_random>(Y_stl,_size);\n    init_vector<null_function>(resu_stl,_size);\n\n    // generic matrix and vector initialization\n\n    Interface::vector_from_stl(X_ref,X_stl);\n    Interface::vector_from_stl(Y_ref,Y_stl);\n\n    Interface::vector_from_stl(X,X_stl);\n    Interface::vector_from_stl(Y,Y_stl);\n\n\n  }\n\n  // invalidate copy ctor\n\n  Action_axpy( const  Action_axpy & )\n  {\n    INFOS(\"illegal call to Action_axpy Copy Ctor\");\n    exit(1);\n  }\n\n  // Dtor\n\n  ~Action_axpy( void ){\n\n    MESSAGE(\"Action_axpy Dtor\");\n\n    // deallocation\n\n    Interface::free_vector(X_ref);\n    Interface::free_vector(Y_ref);\n\n    Interface::free_vector(X);\n    Interface::free_vector(Y);\n  }\n\n  // action name\n\n  static inline std::string name( void )\n  {\n    return \"axpy_\"+Interface::name();\n  }\n\n  double nb_op_base( void ){\n    return 2.0*_size;\n  }\n\n  inline void initialize( void ){\n    Interface::copy_vector(X_ref,X,_size);\n    Interface::copy_vector(Y_ref,Y,_size);\n  }\n\n  inline void calculate( void ) {\n    BTL_ASM_COMMENT(\"mybegin axpy\");\n    Interface::axpy(_coef,X,Y,_size);\n    BTL_ASM_COMMENT(\"myend axpy\");\n  }\n\n  void check_result( void ){\n    if (_size>128) return;\n    // calculation check\n\n    Interface::vector_to_stl(Y,resu_stl);\n\n    STL_interface<typename Interface::real_type>::axpy(_coef,X_stl,Y_stl,_size);\n\n    typename Interface::real_type error=\n      STL_interface<typename Interface::real_type>::norm_diff(Y_stl,resu_stl);\n\n    if (error>1.e-6){\n      INFOS(\"WRONG CALCULATION...residual=\" << error);\n      exit(0);\n    }\n\n  }\n\nprivate :\n\n  typename Interface::stl_vector X_stl;\n  typename Interface::stl_vector Y_stl;\n  typename Interface::stl_vector resu_stl;\n\n  typename Interface::gene_vector X_ref;\n  typename Interface::gene_vector Y_ref;\n\n  typename Interface::gene_vector X;\n  typename Interface::gene_vector Y;\n\n  typename Interface::real_type _coef;\n\n  int _size;\n};\n\n#endif\n"
  },
  {
    "path": "libs/eigen/bench/btl/actions/action_cholesky.hh",
    "content": "//=====================================================\n// File   :  action_cholesky.hh\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#ifndef ACTION_CHOLESKY\n#define ACTION_CHOLESKY\n#include \"utilities.h\"\n#include \"STL_interface.hh\"\n#include <string>\n#include \"init/init_function.hh\"\n#include \"init/init_vector.hh\"\n#include \"init/init_matrix.hh\"\n\nusing namespace std;\n\ntemplate<class Interface>\nclass Action_cholesky {\n\npublic :\n\n  // Ctor\n\n  Action_cholesky( int size ):_size(size)\n  {\n    MESSAGE(\"Action_cholesky Ctor\");\n\n    // STL mat/vec initialization\n    init_matrix_symm<pseudo_random>(X_stl,_size);\n    init_matrix<null_function>(C_stl,_size);\n\n    // make sure X is invertible\n    for (int i=0; i<_size; ++i)\n      X_stl[i][i] = std::abs(X_stl[i][i]) * 1e2 + 100;\n\n    // generic matrix and vector initialization\n    Interface::matrix_from_stl(X_ref,X_stl);\n    Interface::matrix_from_stl(X,X_stl);\n    Interface::matrix_from_stl(C,C_stl);\n\n    _cost = 0;\n    for (int j=0; j<_size; ++j)\n    {\n      double r = std::max(_size - j -1,0);\n      _cost += 2*(r*j+r+j);\n    }\n  }\n\n  // invalidate copy ctor\n\n  Action_cholesky( const  Action_cholesky & )\n  {\n    INFOS(\"illegal call to Action_cholesky Copy Ctor\");\n    exit(1);\n  }\n\n  // Dtor\n\n  ~Action_cholesky( void ){\n\n    MESSAGE(\"Action_cholesky Dtor\");\n\n    // deallocation\n    Interface::free_matrix(X_ref,_size);\n    Interface::free_matrix(X,_size);\n    Interface::free_matrix(C,_size);\n  }\n\n  // action name\n\n  static inline std::string name( void )\n  {\n    return \"cholesky_\"+Interface::name();\n  }\n\n  double nb_op_base( void ){\n    return _cost;\n  }\n\n  inline void initialize( void ){\n    Interface::copy_matrix(X_ref,X,_size);\n  }\n\n  inline void calculate( void ) {\n      Interface::cholesky(X,C,_size);\n  }\n\n  void check_result( void ){\n    // calculation check\n//     STL_interface<typename Interface::real_type>::cholesky(X_stl,C_stl,_size);\n//\n//     typename Interface::real_type error=\n//       STL_interface<typename Interface::real_type>::norm_diff(C_stl,resu_stl);\n//\n//     if (error>1.e-6){\n//       INFOS(\"WRONG CALCULATION...residual=\" << error);\n//       exit(0);\n//     }\n\n  }\n\nprivate :\n\n  typename Interface::stl_matrix X_stl;\n  typename Interface::stl_matrix C_stl;\n\n  typename Interface::gene_matrix X_ref;\n  typename Interface::gene_matrix X;\n  typename Interface::gene_matrix C;\n\n  int _size;\n  double _cost;\n};\n\n#endif\n"
  },
  {
    "path": "libs/eigen/bench/btl/actions/action_ger.hh",
    "content": "\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#ifndef ACTION_GER\n#define ACTION_GER\n#include \"utilities.h\"\n#include \"STL_interface.hh\"\n#include <string>\n#include \"init/init_function.hh\"\n#include \"init/init_vector.hh\"\n#include \"init/init_matrix.hh\"\n\nusing namespace std;\n\ntemplate<class Interface>\nclass Action_ger {\n\npublic :\n\n  // Ctor\n  BTL_DONT_INLINE Action_ger( int size ):_size(size)\n  {\n    MESSAGE(\"Action_ger Ctor\");\n\n    // STL matrix and vector initialization\n    typename Interface::stl_matrix tmp;\n    init_matrix<pseudo_random>(A_stl,_size);\n    init_vector<pseudo_random>(B_stl,_size);\n    init_vector<pseudo_random>(X_stl,_size);\n    init_vector<null_function>(resu_stl,_size);\n\n    // generic matrix and vector initialization\n    Interface::matrix_from_stl(A_ref,A_stl);\n    Interface::matrix_from_stl(A,A_stl);\n    Interface::vector_from_stl(B_ref,B_stl);\n    Interface::vector_from_stl(B,B_stl);\n    Interface::vector_from_stl(X_ref,X_stl);\n    Interface::vector_from_stl(X,X_stl);\n  }\n\n  // invalidate copy ctor\n  Action_ger( const  Action_ger & )\n  {\n    INFOS(\"illegal call to Action_ger Copy Ctor\");\n    exit(1);\n  }\n\n  // Dtor\n  BTL_DONT_INLINE ~Action_ger( void ){\n    MESSAGE(\"Action_ger Dtor\");\n    Interface::free_matrix(A,_size);\n    Interface::free_vector(B);\n    Interface::free_vector(X);\n    Interface::free_matrix(A_ref,_size);\n    Interface::free_vector(B_ref);\n    Interface::free_vector(X_ref);\n\n  }\n\n  // action name\n  static inline std::string name( void )\n  {\n    return \"ger_\" + Interface::name();\n  }\n\n  double nb_op_base( void ){\n    return 2.0*_size*_size;\n  }\n\n  BTL_DONT_INLINE  void initialize( void ){\n    Interface::copy_matrix(A_ref,A,_size);\n    Interface::copy_vector(B_ref,B,_size);\n    Interface::copy_vector(X_ref,X,_size);\n  }\n\n  BTL_DONT_INLINE void calculate( void ) {\n    BTL_ASM_COMMENT(\"#begin ger\");\n    Interface::ger(A,B,X,_size);\n    BTL_ASM_COMMENT(\"end ger\");\n  }\n\n  BTL_DONT_INLINE void check_result( void ){\n    // calculation check\n    Interface::vector_to_stl(X,resu_stl);\n\n    STL_interface<typename Interface::real_type>::ger(A_stl,B_stl,X_stl,_size);\n\n    typename Interface::real_type error=\n      STL_interface<typename Interface::real_type>::norm_diff(X_stl,resu_stl);\n\n    if (error>1.e-3){\n      INFOS(\"WRONG CALCULATION...residual=\" << error);\n//       exit(0);\n    }\n\n  }\n\nprivate :\n\n  typename Interface::stl_matrix A_stl;\n  typename Interface::stl_vector B_stl;\n  typename Interface::stl_vector X_stl;\n  typename Interface::stl_vector resu_stl;\n\n  typename Interface::gene_matrix A_ref;\n  typename Interface::gene_vector B_ref;\n  typename Interface::gene_vector X_ref;\n\n  typename Interface::gene_matrix A;\n  typename Interface::gene_vector B;\n  typename Interface::gene_vector X;\n\n  int _size;\n};\n\n\n#endif\n"
  },
  {
    "path": "libs/eigen/bench/btl/actions/action_hessenberg.hh",
    "content": "//=====================================================\n// File   :  action_hessenberg.hh\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#ifndef ACTION_HESSENBERG\n#define ACTION_HESSENBERG\n#include \"utilities.h\"\n#include \"STL_interface.hh\"\n#include <string>\n#include \"init/init_function.hh\"\n#include \"init/init_vector.hh\"\n#include \"init/init_matrix.hh\"\n\nusing namespace std;\n\ntemplate<class Interface>\nclass Action_hessenberg {\n\npublic :\n\n  // Ctor\n\n  Action_hessenberg( int size ):_size(size)\n  {\n    MESSAGE(\"Action_hessenberg Ctor\");\n\n    // STL vector initialization\n    init_matrix<pseudo_random>(X_stl,_size);\n\n    init_matrix<null_function>(C_stl,_size);\n    init_matrix<null_function>(resu_stl,_size);\n\n    // generic matrix and vector initialization\n    Interface::matrix_from_stl(X_ref,X_stl);\n    Interface::matrix_from_stl(X,X_stl);\n    Interface::matrix_from_stl(C,C_stl);\n\n    _cost = 0;\n    for (int j=0; j<_size-2; ++j)\n    {\n      double r = std::max(0,_size-j-1);\n      double b = std::max(0,_size-j-2);\n      _cost += 6 + 3*b + r*r*4 + r*_size*4;\n    }\n  }\n\n  // invalidate copy ctor\n\n  Action_hessenberg( const  Action_hessenberg & )\n  {\n    INFOS(\"illegal call to Action_hessenberg Copy Ctor\");\n    exit(1);\n  }\n\n  // Dtor\n\n  ~Action_hessenberg( void ){\n\n    MESSAGE(\"Action_hessenberg Dtor\");\n\n    // deallocation\n    Interface::free_matrix(X_ref,_size);\n    Interface::free_matrix(X,_size);\n    Interface::free_matrix(C,_size);\n  }\n\n  // action name\n\n  static inline std::string name( void )\n  {\n    return \"hessenberg_\"+Interface::name();\n  }\n\n  double nb_op_base( void ){\n    return _cost;\n  }\n\n  inline void initialize( void ){\n    Interface::copy_matrix(X_ref,X,_size);\n  }\n\n  inline void calculate( void ) {\n      Interface::hessenberg(X,C,_size);\n  }\n\n  void check_result( void ){\n    // calculation check\n    Interface::matrix_to_stl(C,resu_stl);\n\n//     STL_interface<typename Interface::real_type>::hessenberg(X_stl,C_stl,_size);\n//\n//     typename Interface::real_type error=\n//       STL_interface<typename Interface::real_type>::norm_diff(C_stl,resu_stl);\n//\n//     if (error>1.e-6){\n//       INFOS(\"WRONG CALCULATION...residual=\" << error);\n//       exit(0);\n//     }\n\n  }\n\nprivate :\n\n  typename Interface::stl_matrix X_stl;\n  typename Interface::stl_matrix C_stl;\n  typename Interface::stl_matrix resu_stl;\n\n  typename Interface::gene_matrix X_ref;\n  typename Interface::gene_matrix X;\n  typename Interface::gene_matrix C;\n\n  int _size;\n  double _cost;\n};\n\ntemplate<class Interface>\nclass Action_tridiagonalization {\n\npublic :\n\n  // Ctor\n\n  Action_tridiagonalization( int size ):_size(size)\n  {\n    MESSAGE(\"Action_tridiagonalization Ctor\");\n\n    // STL vector initialization\n    init_matrix<pseudo_random>(X_stl,_size);\n    \n    for(int i=0; i<_size; ++i)\n    {\n      for(int j=0; j<i; ++j)\n        X_stl[i][j] = X_stl[j][i];\n    }\n    \n    init_matrix<null_function>(C_stl,_size);\n    init_matrix<null_function>(resu_stl,_size);\n\n    // generic matrix and vector initialization\n    Interface::matrix_from_stl(X_ref,X_stl);\n    Interface::matrix_from_stl(X,X_stl);\n    Interface::matrix_from_stl(C,C_stl);\n\n    _cost = 0;\n    for (int j=0; j<_size-2; ++j)\n    {\n      double r = std::max(0,_size-j-1);\n      double b = std::max(0,_size-j-2);\n      _cost += 6. + 3.*b + r*r*8.;\n    }\n  }\n\n  // invalidate copy ctor\n\n  Action_tridiagonalization( const  Action_tridiagonalization & )\n  {\n    INFOS(\"illegal call to Action_tridiagonalization Copy Ctor\");\n    exit(1);\n  }\n\n  // Dtor\n\n  ~Action_tridiagonalization( void ){\n\n    MESSAGE(\"Action_tridiagonalization Dtor\");\n\n    // deallocation\n    Interface::free_matrix(X_ref,_size);\n    Interface::free_matrix(X,_size);\n    Interface::free_matrix(C,_size);\n  }\n\n  // action name\n\n  static inline std::string name( void ) { return \"tridiagonalization_\"+Interface::name(); }\n\n  double nb_op_base( void ){\n    return _cost;\n  }\n\n  inline void initialize( void ){\n    Interface::copy_matrix(X_ref,X,_size);\n  }\n\n  inline void calculate( void ) {\n      Interface::tridiagonalization(X,C,_size);\n  }\n\n  void check_result( void ){\n    // calculation check\n    Interface::matrix_to_stl(C,resu_stl);\n\n//     STL_interface<typename Interface::real_type>::tridiagonalization(X_stl,C_stl,_size);\n//\n//     typename Interface::real_type error=\n//       STL_interface<typename Interface::real_type>::norm_diff(C_stl,resu_stl);\n//\n//     if (error>1.e-6){\n//       INFOS(\"WRONG CALCULATION...residual=\" << error);\n//       exit(0);\n//     }\n\n  }\n\nprivate :\n\n  typename Interface::stl_matrix X_stl;\n  typename Interface::stl_matrix C_stl;\n  typename Interface::stl_matrix resu_stl;\n\n  typename Interface::gene_matrix X_ref;\n  typename Interface::gene_matrix X;\n  typename Interface::gene_matrix C;\n\n  int _size;\n  double _cost;\n};\n\n#endif\n"
  },
  {
    "path": "libs/eigen/bench/btl/actions/action_lu_decomp.hh",
    "content": "//=====================================================\n// File   :  action_lu_decomp.hh\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#ifndef ACTION_LU_DECOMP\n#define ACTION_LU_DECOMP\n#include \"utilities.h\"\n#include \"STL_interface.hh\"\n#include <string>\n#include \"init/init_function.hh\"\n#include \"init/init_vector.hh\"\n#include \"init/init_matrix.hh\"\n\nusing namespace std;\n\ntemplate<class Interface>\nclass Action_lu_decomp {\n\npublic :\n\n  // Ctor\n\n  Action_lu_decomp( int size ):_size(size)\n  {\n    MESSAGE(\"Action_lu_decomp Ctor\");\n\n    // STL vector initialization\n    init_matrix<pseudo_random>(X_stl,_size);\n\n    init_matrix<null_function>(C_stl,_size);\n    init_matrix<null_function>(resu_stl,_size);\n\n    // generic matrix and vector initialization\n    Interface::matrix_from_stl(X_ref,X_stl);\n    Interface::matrix_from_stl(X,X_stl);\n    Interface::matrix_from_stl(C,C_stl);\n\n    _cost = 2.0*size*size*size/3.0 + size*size;\n  }\n\n  // invalidate copy ctor\n\n  Action_lu_decomp( const  Action_lu_decomp & )\n  {\n    INFOS(\"illegal call to Action_lu_decomp Copy Ctor\");\n    exit(1);\n  }\n\n  // Dtor\n\n  ~Action_lu_decomp( void ){\n\n    MESSAGE(\"Action_lu_decomp Dtor\");\n\n    // deallocation\n    Interface::free_matrix(X_ref,_size);\n    Interface::free_matrix(X,_size);\n    Interface::free_matrix(C,_size);\n  }\n\n  // action name\n\n  static inline std::string name( void )\n  {\n    return \"complete_lu_decomp_\"+Interface::name();\n  }\n\n  double nb_op_base( void ){\n    return _cost;\n  }\n\n  inline void initialize( void ){\n    Interface::copy_matrix(X_ref,X,_size);\n  }\n\n  inline void calculate( void ) {\n      Interface::lu_decomp(X,C,_size);\n  }\n\n  void check_result( void ){\n    // calculation check\n    Interface::matrix_to_stl(C,resu_stl);\n\n//     STL_interface<typename Interface::real_type>::lu_decomp(X_stl,C_stl,_size);\n//\n//     typename Interface::real_type error=\n//       STL_interface<typename Interface::real_type>::norm_diff(C_stl,resu_stl);\n//\n//     if (error>1.e-6){\n//       INFOS(\"WRONG CALCULATION...residual=\" << error);\n//       exit(0);\n//     }\n\n  }\n\nprivate :\n\n  typename Interface::stl_matrix X_stl;\n  typename Interface::stl_matrix C_stl;\n  typename Interface::stl_matrix resu_stl;\n\n  typename Interface::gene_matrix X_ref;\n  typename Interface::gene_matrix X;\n  typename Interface::gene_matrix C;\n\n  int _size;\n  double _cost;\n};\n\n#endif\n"
  },
  {
    "path": "libs/eigen/bench/btl/actions/action_lu_solve.hh",
    "content": "//=====================================================\n// File   :  action_lu_solve.hh\n// Author :  L. Plagne <laurent.plagne@edf.fr)>        \n// Copyright (C) EDF R&D,  lun sep 30 14:23:19 CEST 2002\n//=====================================================\n// \n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n// \n#ifndef ACTION_LU_SOLVE\n#define ACTION_LU_SOLVE\n#include \"utilities.h\"\n#include \"STL_interface.hh\"\n#include <string>\n#include \"init/init_function.hh\"\n#include \"init/init_vector.hh\"\n#include \"init/init_matrix.hh\"\n\nusing namespace std;\n\ntemplate<class Interface>\nclass Action_lu_solve \n{\n\npublic :\n\n  static inline std::string name( void )\n  {\n    return \"lu_solve_\"+Interface::name();\n  }\n  \n  static double nb_op_base(int size){\n    return 2.0*size*size*size/3.0;  // questionable but not really important\n  }\n\n\n  static double calculate( int nb_calc, int size ) {\n\n    // STL matrix and vector initialization\n    \n    typename Interface::stl_matrix A_stl;\n    typename Interface::stl_vector B_stl;\n    typename Interface::stl_vector X_stl;\n\n    init_matrix<pseudo_random>(A_stl,size);\n    init_vector<pseudo_random>(B_stl,size);\n    init_vector<null_function>(X_stl,size);\n\n    // generic matrix and vector initialization\n\n    typename Interface::gene_matrix A;\n    typename Interface::gene_vector B;\n    typename Interface::gene_vector X;\n\n    typename Interface::gene_matrix LU; \n\n    Interface::matrix_from_stl(A,A_stl);\n    Interface::vector_from_stl(B,B_stl);\n    Interface::vector_from_stl(X,X_stl);\n    Interface::matrix_from_stl(LU,A_stl);\n  \n    // local variable :\n\n    typename Interface::Pivot_Vector pivot; // pivot vector\n    Interface::new_Pivot_Vector(pivot,size);\n    \n    // timer utilities\n\n    Portable_Timer chronos;\n\n    // time measurement\n\n    chronos.start();\n    \n    for (int ii=0;ii<nb_calc;ii++){\n\n      // LU factorization\n      Interface::copy_matrix(A,LU,size);\n      Interface::LU_factor(LU,pivot,size);\n      \n      // LU solve\n\n      Interface::LU_solve(LU,pivot,B,X,size);\n\n    }\n\n    // Time stop\n\n    chronos.stop();\n\n    double time=chronos.user_time();\n  \n    // check result :\n\n    typename Interface::stl_vector B_new_stl(size);\n    Interface::vector_to_stl(X,X_stl);\n\n    STL_interface<typename Interface::real_type>::matrix_vector_product(A_stl,X_stl,B_new_stl,size); \n  \n    typename Interface::real_type error=\n      STL_interface<typename Interface::real_type>::norm_diff(B_stl,B_new_stl);\n    \n    if (error>1.e-5){\n      INFOS(\"WRONG CALCULATION...residual=\" << error);\n      STL_interface<typename Interface::real_type>::display_vector(B_stl);\n      STL_interface<typename Interface::real_type>::display_vector(B_new_stl);\n      exit(0);\n    }\n    \n    // deallocation and return time\n    \n    Interface::free_matrix(A,size);\n    Interface::free_vector(B);\n    Interface::free_vector(X);\n    Interface::free_Pivot_Vector(pivot);\n\n    return time;\n  }\n\n};\n  \n\n#endif\n\n\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/actions/action_matrix_matrix_product.hh",
    "content": "//=====================================================\n// File   :  action_matrix_matrix_product.hh\n// Author :  L. Plagne <laurent.plagne@edf.fr)>\n// Copyright (C) EDF R&D,  lun sep 30 14:23:19 CEST 2002\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#ifndef ACTION_MATRIX_MATRIX_PRODUCT\n#define ACTION_MATRIX_MATRIX_PRODUCT\n#include \"utilities.h\"\n#include \"STL_interface.hh\"\n#include <string>\n#include \"init/init_function.hh\"\n#include \"init/init_vector.hh\"\n#include \"init/init_matrix.hh\"\n\nusing namespace std;\n\ntemplate<class Interface>\nclass Action_matrix_matrix_product {\n\npublic :\n\n  // Ctor\n\n  Action_matrix_matrix_product( int size ):_size(size)\n  {\n    MESSAGE(\"Action_matrix_matrix_product Ctor\");\n\n    // STL matrix and vector initialization\n\n    init_matrix<pseudo_random>(A_stl,_size);\n    init_matrix<pseudo_random>(B_stl,_size);\n    init_matrix<null_function>(X_stl,_size);\n    init_matrix<null_function>(resu_stl,_size);\n\n    // generic matrix and vector initialization\n\n    Interface::matrix_from_stl(A_ref,A_stl);\n    Interface::matrix_from_stl(B_ref,B_stl);\n    Interface::matrix_from_stl(X_ref,X_stl);\n\n    Interface::matrix_from_stl(A,A_stl);\n    Interface::matrix_from_stl(B,B_stl);\n    Interface::matrix_from_stl(X,X_stl);\n\n  }\n\n  // invalidate copy ctor\n\n  Action_matrix_matrix_product( const  Action_matrix_matrix_product & )\n  {\n    INFOS(\"illegal call to Action_matrix_matrix_product Copy Ctor\");\n    exit(0);\n  }\n\n  // Dtor\n\n  ~Action_matrix_matrix_product( void ){\n\n    MESSAGE(\"Action_matrix_matrix_product Dtor\");\n\n    // deallocation\n\n    Interface::free_matrix(A,_size);\n    Interface::free_matrix(B,_size);\n    Interface::free_matrix(X,_size);\n\n    Interface::free_matrix(A_ref,_size);\n    Interface::free_matrix(B_ref,_size);\n    Interface::free_matrix(X_ref,_size);\n\n  }\n\n  // action name\n\n  static inline std::string name( void )\n  {\n    return \"matrix_matrix_\"+Interface::name();\n  }\n\n  double nb_op_base( void ){\n    return 2.0*_size*_size*_size;\n  }\n\n  inline void initialize( void ){\n\n    Interface::copy_matrix(A_ref,A,_size);\n    Interface::copy_matrix(B_ref,B,_size);\n    Interface::copy_matrix(X_ref,X,_size);\n\n  }\n\n  inline void calculate( void ) {\n      Interface::matrix_matrix_product(A,B,X,_size);\n  }\n\n  void check_result( void ){\n\n    // calculation check\n    if (_size<200)\n    {\n      Interface::matrix_to_stl(X,resu_stl);\n      STL_interface<typename Interface::real_type>::matrix_matrix_product(A_stl,B_stl,X_stl,_size);\n      typename Interface::real_type error=\n        STL_interface<typename Interface::real_type>::norm_diff(X_stl,resu_stl);\n      if (error>1.e-6){\n        INFOS(\"WRONG CALCULATION...residual=\" << error);\n        exit(1);\n      }\n    }\n  }\n\nprivate :\n\n  typename Interface::stl_matrix A_stl;\n  typename Interface::stl_matrix B_stl;\n  typename Interface::stl_matrix X_stl;\n  typename Interface::stl_matrix resu_stl;\n\n  typename Interface::gene_matrix A_ref;\n  typename Interface::gene_matrix B_ref;\n  typename Interface::gene_matrix X_ref;\n\n  typename Interface::gene_matrix A;\n  typename Interface::gene_matrix B;\n  typename Interface::gene_matrix X;\n\n\n  int _size;\n\n};\n\n\n#endif\n\n\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/actions/action_matrix_matrix_product_bis.hh",
    "content": "//=====================================================\n// File   :  action_matrix_matrix_product_bis.hh\n// Author :  L. Plagne <laurent.plagne@edf.fr)>\n// Copyright (C) EDF R&D,  lun sep 30 14:23:19 CEST 2002\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#ifndef ACTION_MATRIX_MATRIX_PRODUCT_BIS\n#define ACTION_MATRIX_MATRIX_PRODUCT_BIS\n#include \"utilities.h\"\n#include \"STL_interface.hh\"\n#include \"STL_timer.hh\"\n#include <string>\n#include \"init_function.hh\"\n#include \"init_vector.hh\"\n#include \"init_matrix.hh\"\n\nusing namespace std;\n\ntemplate<class Interface>\nclass Action_matrix_matrix_product_bis {\n\npublic :\n\n  static inline std::string name( void )\n  {\n    return \"matrix_matrix_\"+Interface::name();\n  }\n\n  static double nb_op_base(int size){\n    return 2.0*size*size*size;\n  }\n\n  static double calculate( int nb_calc, int size ) {\n\n    // STL matrix and vector initialization\n\n    typename Interface::stl_matrix A_stl;\n    typename Interface::stl_matrix B_stl;\n    typename Interface::stl_matrix X_stl;\n\n    init_matrix<pseudo_random>(A_stl,size);\n    init_matrix<pseudo_random>(B_stl,size);\n    init_matrix<null_function>(X_stl,size);\n\n    // generic matrix and vector initialization\n\n    typename Interface::gene_matrix A_ref;\n    typename Interface::gene_matrix B_ref;\n    typename Interface::gene_matrix X_ref;\n\n    typename Interface::gene_matrix A;\n    typename Interface::gene_matrix B;\n    typename Interface::gene_matrix X;\n\n\n    Interface::matrix_from_stl(A_ref,A_stl);\n    Interface::matrix_from_stl(B_ref,B_stl);\n    Interface::matrix_from_stl(X_ref,X_stl);\n\n    Interface::matrix_from_stl(A,A_stl);\n    Interface::matrix_from_stl(B,B_stl);\n    Interface::matrix_from_stl(X,X_stl);\n\n\n    // STL_timer utilities\n\n    STL_timer chronos;\n\n    // Baseline evaluation\n\n    chronos.start_baseline(nb_calc);\n\n    do {\n\n      Interface::copy_matrix(A_ref,A,size);\n      Interface::copy_matrix(B_ref,B,size);\n      Interface::copy_matrix(X_ref,X,size);\n\n\n      //      Interface::matrix_matrix_product(A,B,X,size); This line must be commented !!!!\n    }\n    while(chronos.check());\n\n    chronos.report(true);\n\n    // Time measurement\n\n    chronos.start(nb_calc);\n\n    do {\n\n      Interface::copy_matrix(A_ref,A,size);\n      Interface::copy_matrix(B_ref,B,size);\n      Interface::copy_matrix(X_ref,X,size);\n\n      Interface::matrix_matrix_product(A,B,X,size); // here it is not commented !!!!\n    }\n    while(chronos.check());\n\n    chronos.report(true);\n\n    double time=chronos.calculated_time/2000.0;\n\n    // calculation check\n\n    typename Interface::stl_matrix resu_stl(size);\n\n    Interface::matrix_to_stl(X,resu_stl);\n\n    STL_interface<typename Interface::real_type>::matrix_matrix_product(A_stl,B_stl,X_stl,size);\n\n    typename Interface::real_type error=\n      STL_interface<typename Interface::real_type>::norm_diff(X_stl,resu_stl);\n\n    if (error>1.e-6){\n      INFOS(\"WRONG CALCULATION...residual=\" << error);\n      exit(1);\n    }\n\n    // deallocation and return time\n\n    Interface::free_matrix(A,size);\n    Interface::free_matrix(B,size);\n    Interface::free_matrix(X,size);\n\n    Interface::free_matrix(A_ref,size);\n    Interface::free_matrix(B_ref,size);\n    Interface::free_matrix(X_ref,size);\n\n    return time;\n  }\n\n};\n\n\n#endif\n\n\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/actions/action_matrix_vector_product.hh",
    "content": "//=====================================================\n// File   :  action_matrix_vector_product.hh\n// Author :  L. Plagne <laurent.plagne@edf.fr)>\n// Copyright (C) EDF R&D,  lun sep 30 14:23:19 CEST 2002\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#ifndef ACTION_MATRIX_VECTOR_PRODUCT\n#define ACTION_MATRIX_VECTOR_PRODUCT\n#include \"utilities.h\"\n#include \"STL_interface.hh\"\n#include <string>\n#include \"init/init_function.hh\"\n#include \"init/init_vector.hh\"\n#include \"init/init_matrix.hh\"\n\nusing namespace std;\n\ntemplate<class Interface>\nclass Action_matrix_vector_product {\n\npublic :\n\n  // Ctor\n\n  BTL_DONT_INLINE Action_matrix_vector_product( int size ):_size(size)\n  {\n    MESSAGE(\"Action_matrix_vector_product Ctor\");\n\n    // STL matrix and vector initialization\n\n    init_matrix<pseudo_random>(A_stl,_size);\n    init_vector<pseudo_random>(B_stl,_size);\n    init_vector<null_function>(X_stl,_size);\n    init_vector<null_function>(resu_stl,_size);\n\n    // generic matrix and vector initialization\n\n    Interface::matrix_from_stl(A_ref,A_stl);\n    Interface::matrix_from_stl(A,A_stl);\n    Interface::vector_from_stl(B_ref,B_stl);\n    Interface::vector_from_stl(B,B_stl);\n    Interface::vector_from_stl(X_ref,X_stl);\n    Interface::vector_from_stl(X,X_stl);\n\n  }\n\n  // invalidate copy ctor\n\n  Action_matrix_vector_product( const  Action_matrix_vector_product & )\n  {\n    INFOS(\"illegal call to Action_matrix_vector_product Copy Ctor\");\n    exit(1);\n  }\n\n  // Dtor\n\n  BTL_DONT_INLINE ~Action_matrix_vector_product( void ){\n\n    MESSAGE(\"Action_matrix_vector_product Dtor\");\n\n    // deallocation\n\n    Interface::free_matrix(A,_size);\n    Interface::free_vector(B);\n    Interface::free_vector(X);\n\n    Interface::free_matrix(A_ref,_size);\n    Interface::free_vector(B_ref);\n    Interface::free_vector(X_ref);\n\n  }\n\n  // action name\n\n  static inline std::string name( void )\n  {\n    return \"matrix_vector_\" + Interface::name();\n  }\n\n  double nb_op_base( void ){\n    return 2.0*_size*_size;\n  }\n\n  BTL_DONT_INLINE  void initialize( void ){\n\n    Interface::copy_matrix(A_ref,A,_size);\n    Interface::copy_vector(B_ref,B,_size);\n    Interface::copy_vector(X_ref,X,_size);\n\n  }\n\n  BTL_DONT_INLINE void calculate( void ) {\n      BTL_ASM_COMMENT(\"#begin matrix_vector_product\");\n      Interface::matrix_vector_product(A,B,X,_size);\n      BTL_ASM_COMMENT(\"end matrix_vector_product\");\n  }\n\n  BTL_DONT_INLINE void check_result( void ){\n\n    // calculation check\n\n    Interface::vector_to_stl(X,resu_stl);\n\n    STL_interface<typename Interface::real_type>::matrix_vector_product(A_stl,B_stl,X_stl,_size);\n\n    typename Interface::real_type error=\n      STL_interface<typename Interface::real_type>::norm_diff(X_stl,resu_stl);\n\n    if (error>1.e-5){\n      INFOS(\"WRONG CALCULATION...residual=\" << error);\n      exit(0);\n    }\n\n  }\n\nprivate :\n\n  typename Interface::stl_matrix A_stl;\n  typename Interface::stl_vector B_stl;\n  typename Interface::stl_vector X_stl;\n  typename Interface::stl_vector resu_stl;\n\n  typename Interface::gene_matrix A_ref;\n  typename Interface::gene_vector B_ref;\n  typename Interface::gene_vector X_ref;\n\n  typename Interface::gene_matrix A;\n  typename Interface::gene_vector B;\n  typename Interface::gene_vector X;\n\n\n  int _size;\n\n};\n\n\n#endif\n\n\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/actions/action_partial_lu.hh",
    "content": "//=====================================================\n// File   :  action_lu_decomp.hh\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#ifndef ACTION_PARTIAL_LU\n#define ACTION_PARTIAL_LU\n#include \"utilities.h\"\n#include \"STL_interface.hh\"\n#include <string>\n#include \"init/init_function.hh\"\n#include \"init/init_vector.hh\"\n#include \"init/init_matrix.hh\"\n\nusing namespace std;\n\ntemplate<class Interface>\nclass Action_partial_lu {\n\npublic :\n\n  // Ctor\n\n  Action_partial_lu( int size ):_size(size)\n  {\n    MESSAGE(\"Action_partial_lu Ctor\");\n\n    // STL vector initialization\n    init_matrix<pseudo_random>(X_stl,_size);\n    init_matrix<null_function>(C_stl,_size);\n\n    // make sure X is invertible\n    for (int i=0; i<_size; ++i)\n      X_stl[i][i] = X_stl[i][i] * 1e2 + 1;\n\n    // generic matrix and vector initialization\n    Interface::matrix_from_stl(X_ref,X_stl);\n    Interface::matrix_from_stl(X,X_stl);\n    Interface::matrix_from_stl(C,C_stl);\n\n    _cost = 2.0*size*size*size/3.0 + size*size;\n  }\n\n  // invalidate copy ctor\n\n  Action_partial_lu( const  Action_partial_lu & )\n  {\n    INFOS(\"illegal call to Action_partial_lu Copy Ctor\");\n    exit(1);\n  }\n\n  // Dtor\n\n  ~Action_partial_lu( void ){\n\n    MESSAGE(\"Action_partial_lu Dtor\");\n\n    // deallocation\n    Interface::free_matrix(X_ref,_size);\n    Interface::free_matrix(X,_size);\n    Interface::free_matrix(C,_size);\n  }\n\n  // action name\n\n  static inline std::string name( void )\n  {\n    return \"partial_lu_decomp_\"+Interface::name();\n  }\n\n  double nb_op_base( void ){\n    return _cost;\n  }\n\n  inline void initialize( void ){\n    Interface::copy_matrix(X_ref,X,_size);\n  }\n\n  inline void calculate( void ) {\n      Interface::partial_lu_decomp(X,C,_size);\n  }\n\n  void check_result( void ){\n    // calculation check\n//     Interface::matrix_to_stl(C,resu_stl);\n\n//     STL_interface<typename Interface::real_type>::lu_decomp(X_stl,C_stl,_size);\n//\n//     typename Interface::real_type error=\n//       STL_interface<typename Interface::real_type>::norm_diff(C_stl,resu_stl);\n//\n//     if (error>1.e-6){\n//       INFOS(\"WRONG CALCULATION...residual=\" << error);\n//       exit(0);\n//     }\n\n  }\n\nprivate :\n\n  typename Interface::stl_matrix X_stl;\n  typename Interface::stl_matrix C_stl;\n\n  typename Interface::gene_matrix X_ref;\n  typename Interface::gene_matrix X;\n  typename Interface::gene_matrix C;\n\n  int _size;\n  double _cost;\n};\n\n#endif\n"
  },
  {
    "path": "libs/eigen/bench/btl/actions/action_rot.hh",
    "content": "\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#ifndef ACTION_ROT\n#define ACTION_ROT\n#include \"utilities.h\"\n#include \"STL_interface.hh\"\n#include <string>\n#include \"init/init_function.hh\"\n#include \"init/init_vector.hh\"\n#include \"init/init_matrix.hh\"\n\nusing namespace std;\n\ntemplate<class Interface>\nclass Action_rot {\n\npublic :\n\n  // Ctor\n  BTL_DONT_INLINE Action_rot( int size ):_size(size)\n  {\n    MESSAGE(\"Action_rot Ctor\");\n\n    // STL matrix and vector initialization\n    typename Interface::stl_matrix tmp;\n    init_vector<pseudo_random>(A_stl,_size);\n    init_vector<pseudo_random>(B_stl,_size);\n\n    // generic matrix and vector initialization\n    Interface::vector_from_stl(A_ref,A_stl);\n    Interface::vector_from_stl(A,A_stl);\n    Interface::vector_from_stl(B_ref,B_stl);\n    Interface::vector_from_stl(B,B_stl);\n  }\n\n  // invalidate copy ctor\n  Action_rot( const  Action_rot & )\n  {\n    INFOS(\"illegal call to Action_rot Copy Ctor\");\n    exit(1);\n  }\n\n  // Dtor\n  BTL_DONT_INLINE ~Action_rot( void ){\n    MESSAGE(\"Action_rot Dtor\");\n    Interface::free_vector(A);\n    Interface::free_vector(B);\n    Interface::free_vector(A_ref);\n    Interface::free_vector(B_ref);\n  }\n\n  // action name\n  static inline std::string name( void )\n  {\n    return \"rot_\" + Interface::name();\n  }\n\n  double nb_op_base( void ){\n    return 6.0*_size;\n  }\n\n  BTL_DONT_INLINE  void initialize( void ){\n    Interface::copy_vector(A_ref,A,_size);\n    Interface::copy_vector(B_ref,B,_size);\n  }\n\n  BTL_DONT_INLINE void calculate( void ) {\n    BTL_ASM_COMMENT(\"#begin rot\");\n    Interface::rot(A,B,0.5,0.6,_size);\n    BTL_ASM_COMMENT(\"end rot\");\n  }\n\n  BTL_DONT_INLINE void check_result( void ){\n    // calculation check\n//     Interface::vector_to_stl(X,resu_stl);\n\n//     STL_interface<typename Interface::real_type>::rot(A_stl,B_stl,X_stl,_size);\n\n//     typename Interface::real_type error=\n//       STL_interface<typename Interface::real_type>::norm_diff(X_stl,resu_stl);\n\n//     if (error>1.e-3){\n//       INFOS(\"WRONG CALCULATION...residual=\" << error);\n//       exit(0);\n//     }\n\n  }\n\nprivate :\n\n  typename Interface::stl_vector A_stl;\n  typename Interface::stl_vector B_stl;\n\n  typename Interface::gene_vector A_ref;\n  typename Interface::gene_vector B_ref;\n\n  typename Interface::gene_vector A;\n  typename Interface::gene_vector B;\n\n  int _size;\n};\n\n\n#endif\n"
  },
  {
    "path": "libs/eigen/bench/btl/actions/action_symv.hh",
    "content": "//=====================================================\n// File   :  action_symv.hh\n// Author :  L. Plagne <laurent.plagne@edf.fr)>\n// Copyright (C) EDF R&D,  lun sep 30 14:23:19 CEST 2002\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#ifndef ACTION_SYMV\n#define ACTION_SYMV\n#include \"utilities.h\"\n#include \"STL_interface.hh\"\n#include <string>\n#include \"init/init_function.hh\"\n#include \"init/init_vector.hh\"\n#include \"init/init_matrix.hh\"\n\nusing namespace std;\n\ntemplate<class Interface>\nclass Action_symv {\n\npublic :\n\n  // Ctor\n\n  BTL_DONT_INLINE Action_symv( int size ):_size(size)\n  {\n    MESSAGE(\"Action_symv Ctor\");\n\n    // STL matrix and vector initialization\n    init_matrix_symm<pseudo_random>(A_stl,_size);\n    init_vector<pseudo_random>(B_stl,_size);\n    init_vector<null_function>(X_stl,_size);\n    init_vector<null_function>(resu_stl,_size);\n\n    // generic matrix and vector initialization\n    Interface::matrix_from_stl(A_ref,A_stl);\n    Interface::matrix_from_stl(A,A_stl);\n    Interface::vector_from_stl(B_ref,B_stl);\n    Interface::vector_from_stl(B,B_stl);\n    Interface::vector_from_stl(X_ref,X_stl);\n    Interface::vector_from_stl(X,X_stl);\n\n  }\n\n  // invalidate copy ctor\n\n  Action_symv( const  Action_symv & )\n  {\n    INFOS(\"illegal call to Action_symv Copy Ctor\");\n    exit(1);\n  }\n\n  // Dtor\n  BTL_DONT_INLINE ~Action_symv( void ){\n    Interface::free_matrix(A,_size);\n    Interface::free_vector(B);\n    Interface::free_vector(X);\n    Interface::free_matrix(A_ref,_size);\n    Interface::free_vector(B_ref);\n    Interface::free_vector(X_ref);\n  }\n\n  // action name\n\n  static inline std::string name( void )\n  {\n    return \"symv_\" + Interface::name();\n  }\n\n  double nb_op_base( void ){\n    return 2.0*_size*_size;\n  }\n\n  BTL_DONT_INLINE  void initialize( void ){\n\n    Interface::copy_matrix(A_ref,A,_size);\n    Interface::copy_vector(B_ref,B,_size);\n    Interface::copy_vector(X_ref,X,_size);\n\n  }\n\n  BTL_DONT_INLINE void calculate( void ) {\n      BTL_ASM_COMMENT(\"#begin symv\");\n      Interface::symv(A,B,X,_size);\n      BTL_ASM_COMMENT(\"end symv\");\n  }\n\n  BTL_DONT_INLINE void check_result( void ){\n    if (_size>128) return;\n    // calculation check\n    Interface::vector_to_stl(X,resu_stl);\n\n    STL_interface<typename Interface::real_type>::symv(A_stl,B_stl,X_stl,_size);\n\n    typename Interface::real_type error=\n      STL_interface<typename Interface::real_type>::norm_diff(X_stl,resu_stl);\n\n    if (error>1.e-5){\n      INFOS(\"WRONG CALCULATION...residual=\" << error);\n      exit(0);\n    }\n\n  }\n\nprivate :\n\n  typename Interface::stl_matrix A_stl;\n  typename Interface::stl_vector B_stl;\n  typename Interface::stl_vector X_stl;\n  typename Interface::stl_vector resu_stl;\n\n  typename Interface::gene_matrix A_ref;\n  typename Interface::gene_vector B_ref;\n  typename Interface::gene_vector X_ref;\n\n  typename Interface::gene_matrix A;\n  typename Interface::gene_vector B;\n  typename Interface::gene_vector X;\n\n\n  int _size;\n\n};\n\n\n#endif\n"
  },
  {
    "path": "libs/eigen/bench/btl/actions/action_syr2.hh",
    "content": "//=====================================================\n// File   :  action_syr2.hh\n// Author :  L. Plagne <laurent.plagne@edf.fr)>\n// Copyright (C) EDF R&D,  lun sep 30 14:23:19 CEST 2002\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#ifndef ACTION_SYR2\n#define ACTION_SYR2\n#include \"utilities.h\"\n#include \"STL_interface.hh\"\n#include <string>\n#include \"init/init_function.hh\"\n#include \"init/init_vector.hh\"\n#include \"init/init_matrix.hh\"\n\nusing namespace std;\n\ntemplate<class Interface>\nclass Action_syr2 {\n\npublic :\n\n  // Ctor\n\n  BTL_DONT_INLINE Action_syr2( int size ):_size(size)\n  {\n    // STL matrix and vector initialization\n    typename Interface::stl_matrix tmp;\n    init_matrix<pseudo_random>(A_stl,_size);\n    init_vector<pseudo_random>(B_stl,_size);\n    init_vector<pseudo_random>(X_stl,_size);\n    init_vector<null_function>(resu_stl,_size);\n\n    // generic matrix and vector initialization\n    Interface::matrix_from_stl(A_ref,A_stl);\n    Interface::matrix_from_stl(A,A_stl);\n    Interface::vector_from_stl(B_ref,B_stl);\n    Interface::vector_from_stl(B,B_stl);\n    Interface::vector_from_stl(X_ref,X_stl);\n    Interface::vector_from_stl(X,X_stl);\n  }\n\n  // invalidate copy ctor\n  Action_syr2( const  Action_syr2 & )\n  {\n    INFOS(\"illegal call to Action_syr2 Copy Ctor\");\n    exit(1);\n  }\n\n  // Dtor\n  BTL_DONT_INLINE ~Action_syr2( void ){\n    Interface::free_matrix(A,_size);\n    Interface::free_vector(B);\n    Interface::free_vector(X);\n    Interface::free_matrix(A_ref,_size);\n    Interface::free_vector(B_ref);\n    Interface::free_vector(X_ref);\n  }\n\n  // action name\n\n  static inline std::string name( void )\n  {\n    return \"syr2_\" + Interface::name();\n  }\n\n  double nb_op_base( void ){\n    return 2.0*_size*_size;\n  }\n\n  BTL_DONT_INLINE  void initialize( void ){\n    Interface::copy_matrix(A_ref,A,_size);\n    Interface::copy_vector(B_ref,B,_size);\n    Interface::copy_vector(X_ref,X,_size);\n  }\n\n  BTL_DONT_INLINE void calculate( void ) {\n      BTL_ASM_COMMENT(\"#begin syr2\");\n      Interface::syr2(A,B,X,_size);\n      BTL_ASM_COMMENT(\"end syr2\");\n  }\n\n  BTL_DONT_INLINE void check_result( void ){\n    // calculation check\n    Interface::vector_to_stl(X,resu_stl);\n\n    STL_interface<typename Interface::real_type>::syr2(A_stl,B_stl,X_stl,_size);\n\n    typename Interface::real_type error=\n      STL_interface<typename Interface::real_type>::norm_diff(X_stl,resu_stl);\n\n    if (error>1.e-3){\n      INFOS(\"WRONG CALCULATION...residual=\" << error);\n//       exit(0);\n    }\n\n  }\n\nprivate :\n\n  typename Interface::stl_matrix A_stl;\n  typename Interface::stl_vector B_stl;\n  typename Interface::stl_vector X_stl;\n  typename Interface::stl_vector resu_stl;\n\n  typename Interface::gene_matrix A_ref;\n  typename Interface::gene_vector B_ref;\n  typename Interface::gene_vector X_ref;\n\n  typename Interface::gene_matrix A;\n  typename Interface::gene_vector B;\n  typename Interface::gene_vector X;\n\n\n  int _size;\n\n};\n\n\n#endif\n"
  },
  {
    "path": "libs/eigen/bench/btl/actions/action_trisolve.hh",
    "content": "//=====================================================\n// File   :  action_trisolve.hh\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#ifndef ACTION_TRISOLVE\n#define ACTION_TRISOLVE\n#include \"utilities.h\"\n#include \"STL_interface.hh\"\n#include <string>\n#include \"init/init_function.hh\"\n#include \"init/init_vector.hh\"\n#include \"init/init_matrix.hh\"\n\nusing namespace std;\n\ntemplate<class Interface>\nclass Action_trisolve {\n\npublic :\n\n  // Ctor\n\n  Action_trisolve( int size ):_size(size)\n  {\n    MESSAGE(\"Action_trisolve Ctor\");\n\n    // STL vector initialization\n    init_matrix<pseudo_random>(L_stl,_size);\n    init_vector<pseudo_random>(B_stl,_size);\n    init_vector<null_function>(X_stl,_size);\n    for (int j=0; j<_size; ++j)\n    {\n      for (int i=0; i<j; ++i)\n        L_stl[j][i] = 0;\n      L_stl[j][j] += 3;\n    }\n\n    init_vector<null_function>(resu_stl,_size);\n\n    // generic matrix and vector initialization\n    Interface::matrix_from_stl(L,L_stl);\n    Interface::vector_from_stl(X,X_stl);\n    Interface::vector_from_stl(B,B_stl);\n\n    _cost = 0;\n    for (int j=0; j<_size; ++j)\n    {\n      _cost += 2*j + 1;\n    }\n  }\n\n  // invalidate copy ctor\n\n  Action_trisolve( const  Action_trisolve & )\n  {\n    INFOS(\"illegal call to Action_trisolve Copy Ctor\");\n    exit(1);\n  }\n\n  // Dtor\n\n  ~Action_trisolve( void ){\n\n    MESSAGE(\"Action_trisolve Dtor\");\n\n    // deallocation\n    Interface::free_matrix(L,_size);\n    Interface::free_vector(B);\n    Interface::free_vector(X);\n  }\n\n  // action name\n\n  static inline std::string name( void )\n  {\n    return \"trisolve_vector_\"+Interface::name();\n  }\n\n  double nb_op_base( void ){\n    return _cost;\n  }\n\n  inline void initialize( void ){\n    //Interface::copy_vector(X_ref,X,_size);\n  }\n\n  inline void calculate( void ) {\n      Interface::trisolve_lower(L,B,X,_size);\n  }\n\n  void check_result(){\n    if (_size>128) return;\n    // calculation check\n    Interface::vector_to_stl(X,resu_stl);\n\n    STL_interface<typename Interface::real_type>::trisolve_lower(L_stl,B_stl,X_stl,_size);\n\n    typename Interface::real_type error=\n      STL_interface<typename Interface::real_type>::norm_diff(X_stl,resu_stl);\n\n    if (error>1.e-4){\n      INFOS(\"WRONG CALCULATION...residual=\" << error);\n      exit(2);\n    } //else INFOS(\"CALCULATION OK...residual=\" << error);\n\n  }\n\nprivate :\n\n  typename Interface::stl_matrix L_stl;\n  typename Interface::stl_vector X_stl;\n  typename Interface::stl_vector B_stl;\n  typename Interface::stl_vector resu_stl;\n\n  typename Interface::gene_matrix L;\n  typename Interface::gene_vector X;\n  typename Interface::gene_vector B;\n\n  int _size;\n  double _cost;\n};\n\n#endif\n"
  },
  {
    "path": "libs/eigen/bench/btl/actions/action_trisolve_matrix.hh",
    "content": "//=====================================================\n// File   :  action_matrix_matrix_product.hh\n// Author :  L. Plagne <laurent.plagne@edf.fr)>\n// Copyright (C) EDF R&D,  lun sep 30 14:23:19 CEST 2002\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#ifndef ACTION_TRISOLVE_MATRIX_PRODUCT\n#define ACTION_TRISOLVE_MATRIX_PRODUCT\n#include \"utilities.h\"\n#include \"STL_interface.hh\"\n#include <string>\n#include \"init/init_function.hh\"\n#include \"init/init_vector.hh\"\n#include \"init/init_matrix.hh\"\n\nusing namespace std;\n\ntemplate<class Interface>\nclass Action_trisolve_matrix {\n\npublic :\n\n  // Ctor\n\n  Action_trisolve_matrix( int size ):_size(size)\n  {\n    MESSAGE(\"Action_trisolve_matrix Ctor\");\n\n    // STL matrix and vector initialization\n\n    init_matrix<pseudo_random>(A_stl,_size);\n    init_matrix<pseudo_random>(B_stl,_size);\n    init_matrix<null_function>(X_stl,_size);\n    init_matrix<null_function>(resu_stl,_size);\n\n    for (int j=0; j<_size; ++j)\n    {\n      for (int i=0; i<j; ++i)\n        A_stl[j][i] = 0;\n      A_stl[j][j] += 3;\n    }\n\n    // generic matrix and vector initialization\n\n    Interface::matrix_from_stl(A_ref,A_stl);\n    Interface::matrix_from_stl(B_ref,B_stl);\n    Interface::matrix_from_stl(X_ref,X_stl);\n\n    Interface::matrix_from_stl(A,A_stl);\n    Interface::matrix_from_stl(B,B_stl);\n    Interface::matrix_from_stl(X,X_stl);\n\n    _cost = 0;\n    for (int j=0; j<_size; ++j)\n    {\n      _cost += 2*j + 1;\n    }\n    _cost *= _size;\n  }\n\n  // invalidate copy ctor\n\n  Action_trisolve_matrix( const  Action_trisolve_matrix & )\n  {\n    INFOS(\"illegal call to Action_trisolve_matrix Copy Ctor\");\n    exit(0);\n  }\n\n  // Dtor\n\n  ~Action_trisolve_matrix( void ){\n\n    MESSAGE(\"Action_trisolve_matrix Dtor\");\n\n    // deallocation\n\n    Interface::free_matrix(A,_size);\n    Interface::free_matrix(B,_size);\n    Interface::free_matrix(X,_size);\n\n    Interface::free_matrix(A_ref,_size);\n    Interface::free_matrix(B_ref,_size);\n    Interface::free_matrix(X_ref,_size);\n\n  }\n\n  // action name\n\n  static inline std::string name( void )\n  {\n    return \"trisolve_matrix_\"+Interface::name();\n  }\n\n  double nb_op_base( void ){\n    return _cost;\n  }\n\n  inline void initialize( void ){\n\n    Interface::copy_matrix(A_ref,A,_size);\n    Interface::copy_matrix(B_ref,B,_size);\n    Interface::copy_matrix(X_ref,X,_size);\n\n  }\n\n  inline void calculate( void ) {\n      Interface::trisolve_lower_matrix(A,B,X,_size);\n  }\n\n  void check_result( void ){\n\n    // calculation check\n\n//     Interface::matrix_to_stl(X,resu_stl);\n//\n//     STL_interface<typename Interface::real_type>::matrix_matrix_product(A_stl,B_stl,X_stl,_size);\n//\n//     typename Interface::real_type error=\n//       STL_interface<typename Interface::real_type>::norm_diff(X_stl,resu_stl);\n//\n//     if (error>1.e-6){\n//       INFOS(\"WRONG CALCULATION...residual=\" << error);\n// //       exit(1);\n//     }\n\n  }\n\nprivate :\n\n  typename Interface::stl_matrix A_stl;\n  typename Interface::stl_matrix B_stl;\n  typename Interface::stl_matrix X_stl;\n  typename Interface::stl_matrix resu_stl;\n\n  typename Interface::gene_matrix A_ref;\n  typename Interface::gene_matrix B_ref;\n  typename Interface::gene_matrix X_ref;\n\n  typename Interface::gene_matrix A;\n  typename Interface::gene_matrix B;\n  typename Interface::gene_matrix X;\n\n  int _size;\n  double _cost;\n\n};\n\n\n#endif\n\n\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/actions/action_trmm.hh",
    "content": "//=====================================================\n// File   :  action_matrix_matrix_product.hh\n// Author :  L. Plagne <laurent.plagne@edf.fr)>\n// Copyright (C) EDF R&D,  lun sep 30 14:23:19 CEST 2002\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#ifndef ACTION_TRMM\n#define ACTION_TRMM\n#include \"utilities.h\"\n#include \"STL_interface.hh\"\n#include <string>\n#include \"init/init_function.hh\"\n#include \"init/init_vector.hh\"\n#include \"init/init_matrix.hh\"\n\nusing namespace std;\n\ntemplate<class Interface>\nclass Action_trmm {\n\npublic :\n\n  // Ctor\n\n  Action_trmm( int size ):_size(size)\n  {\n    MESSAGE(\"Action_trmm Ctor\");\n\n    // STL matrix and vector initialization\n\n    init_matrix<pseudo_random>(A_stl,_size);\n    init_matrix<pseudo_random>(B_stl,_size);\n    init_matrix<null_function>(X_stl,_size);\n    init_matrix<null_function>(resu_stl,_size);\n\n    for (int j=0; j<_size; ++j)\n    {\n      for (int i=0; i<j; ++i)\n        A_stl[j][i] = 0;\n      A_stl[j][j] += 3;\n    }\n\n    // generic matrix and vector initialization\n\n    Interface::matrix_from_stl(A_ref,A_stl);\n    Interface::matrix_from_stl(B_ref,B_stl);\n    Interface::matrix_from_stl(X_ref,X_stl);\n\n    Interface::matrix_from_stl(A,A_stl);\n    Interface::matrix_from_stl(B,B_stl);\n    Interface::matrix_from_stl(X,X_stl);\n\n    _cost = 0;\n    for (int j=0; j<_size; ++j)\n    {\n      _cost += 2*j + 1;\n    }\n    _cost *= _size;\n  }\n\n  // invalidate copy ctor\n\n  Action_trmm( const  Action_trmm & )\n  {\n    INFOS(\"illegal call to Action_trmm Copy Ctor\");\n    exit(0);\n  }\n\n  // Dtor\n\n  ~Action_trmm( void ){\n\n    MESSAGE(\"Action_trmm Dtor\");\n\n    // deallocation\n\n    Interface::free_matrix(A,_size);\n    Interface::free_matrix(B,_size);\n    Interface::free_matrix(X,_size);\n\n    Interface::free_matrix(A_ref,_size);\n    Interface::free_matrix(B_ref,_size);\n    Interface::free_matrix(X_ref,_size);\n\n  }\n\n  // action name\n\n  static inline std::string name( void )\n  {\n    return \"trmm_\"+Interface::name();\n  }\n\n  double nb_op_base( void ){\n    return _cost;\n  }\n\n  inline void initialize( void ){\n\n    Interface::copy_matrix(A_ref,A,_size);\n    Interface::copy_matrix(B_ref,B,_size);\n    Interface::copy_matrix(X_ref,X,_size);\n\n  }\n\n  inline void calculate( void ) {\n      Interface::trmm(A,B,X,_size);\n  }\n\n  void check_result( void ){\n\n    // calculation check\n\n//     Interface::matrix_to_stl(X,resu_stl);\n//\n//     STL_interface<typename Interface::real_type>::matrix_matrix_product(A_stl,B_stl,X_stl,_size);\n//\n//     typename Interface::real_type error=\n//       STL_interface<typename Interface::real_type>::norm_diff(X_stl,resu_stl);\n//\n//     if (error>1.e-6){\n//       INFOS(\"WRONG CALCULATION...residual=\" << error);\n// //       exit(1);\n//     }\n\n  }\n\nprivate :\n\n  typename Interface::stl_matrix A_stl;\n  typename Interface::stl_matrix B_stl;\n  typename Interface::stl_matrix X_stl;\n  typename Interface::stl_matrix resu_stl;\n\n  typename Interface::gene_matrix A_ref;\n  typename Interface::gene_matrix B_ref;\n  typename Interface::gene_matrix X_ref;\n\n  typename Interface::gene_matrix A;\n  typename Interface::gene_matrix B;\n  typename Interface::gene_matrix X;\n\n  int _size;\n  double _cost;\n\n};\n\n\n#endif\n\n\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/actions/basic_actions.hh",
    "content": "\n#include \"action_axpy.hh\"\n#include \"action_axpby.hh\"\n\n#include \"action_matrix_vector_product.hh\"\n#include \"action_atv_product.hh\"\n\n#include \"action_matrix_matrix_product.hh\"\n// #include \"action_ata_product.hh\"\n#include \"action_aat_product.hh\"\n\n#include \"action_trisolve.hh\"\n#include \"action_trmm.hh\"\n#include \"action_symv.hh\"\n// #include \"action_symm.hh\"\n#include \"action_syr2.hh\"\n#include \"action_ger.hh\"\n#include \"action_rot.hh\"\n\n// #include \"action_lu_solve.hh\"\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/cmake/FindACML.cmake",
    "content": "\nif (ACML_LIBRARIES)\n  set(ACML_FIND_QUIETLY TRUE)\nendif (ACML_LIBRARIES)\n\nfind_library(ACML_LIBRARIES\n  NAMES\n  acml_mp acml_mv\n  PATHS\n  $ENV{ACMLDIR}/lib\n  $ENV{ACML_DIR}/lib\n  ${LIB_INSTALL_DIR}\n)\n\nfind_file(ACML_LIBRARIES\n  NAMES\n  libacml_mp.so\n  PATHS\n  /usr/lib\n  $ENV{ACMLDIR}/lib\n  ${LIB_INSTALL_DIR}\n)\n\nif(NOT ACML_LIBRARIES)\n    message(STATUS \"Multi-threaded library not found, looking for single-threaded\")\n    find_library(ACML_LIBRARIES\n        NAMES\n        acml acml_mv\n        PATHS\n        $ENV{ACMLDIR}/lib\n        $ENV{ACML_DIR}/lib\n        ${LIB_INSTALL_DIR}\n        )\n    find_file(ACML_LIBRARIES\n        libacml.so libacml_mv.so\n        PATHS\n        /usr/lib\n        $ENV{ACMLDIR}/lib\n        ${LIB_INSTALL_DIR}\n        )\nendif()\n\n\n\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(ACML DEFAULT_MSG ACML_LIBRARIES)\n\nmark_as_advanced(ACML_LIBRARIES)\n"
  },
  {
    "path": "libs/eigen/bench/btl/cmake/FindATLAS.cmake",
    "content": "\nif (ATLAS_LIBRARIES)\n  set(ATLAS_FIND_QUIETLY TRUE)\nendif (ATLAS_LIBRARIES)\n\nfind_file(ATLAS_LIB libatlas.so.3 PATHS /usr/lib $ENV{ATLASDIR} ${LIB_INSTALL_DIR})\nfind_library(ATLAS_LIB atlas PATHS $ENV{ATLASDIR} ${LIB_INSTALL_DIR})\n\nfind_file(ATLAS_CBLAS libcblas.so.3 PATHS /usr/lib $ENV{ATLASDIR} ${LIB_INSTALL_DIR})\nfind_library(ATLAS_CBLAS cblas PATHS $ENV{ATLASDIR} ${LIB_INSTALL_DIR})\n\nfind_file(ATLAS_LAPACK liblapack_atlas.so.3 PATHS /usr/lib $ENV{ATLASDIR} ${LIB_INSTALL_DIR})\nfind_library(ATLAS_LAPACK lapack_atlas PATHS $ENV{ATLASDIR} ${LIB_INSTALL_DIR})\n\nif(NOT ATLAS_LAPACK)\n  find_file(ATLAS_LAPACK liblapack.so.3 PATHS /usr/lib/atlas $ENV{ATLASDIR} ${LIB_INSTALL_DIR})\n  find_library(ATLAS_LAPACK lapack PATHS $ENV{ATLASDIR} ${LIB_INSTALL_DIR})\nendif(NOT ATLAS_LAPACK)\n\nfind_file(ATLAS_F77BLAS libf77blas.so.3 PATHS /usr/lib $ENV{ATLASDIR} ${LIB_INSTALL_DIR})\nfind_library(ATLAS_F77BLAS f77blas PATHS $ENV{ATLASDIR} ${LIB_INSTALL_DIR})\n\nif(ATLAS_LIB AND ATLAS_CBLAS AND ATLAS_LAPACK AND ATLAS_F77BLAS)\n\n  set(ATLAS_LIBRARIES ${ATLAS_LAPACK} ${ATLAS_CBLAS}  ${ATLAS_F77BLAS} ${ATLAS_LIB})\n  \n  # search the default lapack lib link to it\n  find_file(ATLAS_REFERENCE_LAPACK liblapack.so.3 PATHS /usr/lib /usr/lib64)\n  find_library(ATLAS_REFERENCE_LAPACK NAMES lapack)\n  if(ATLAS_REFERENCE_LAPACK)\n    set(ATLAS_LIBRARIES ${ATLAS_LIBRARIES} ${ATLAS_REFERENCE_LAPACK})\n  endif()\n  \nendif(ATLAS_LIB AND ATLAS_CBLAS AND ATLAS_LAPACK AND ATLAS_F77BLAS)\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(ATLAS DEFAULT_MSG ATLAS_LIBRARIES)\n\nmark_as_advanced(ATLAS_LIBRARIES)\n"
  },
  {
    "path": "libs/eigen/bench/btl/cmake/FindBlitz.cmake",
    "content": "# - Try to find blitz lib\n# Once done this will define\n#\n#  BLITZ_FOUND - system has blitz lib\n#  BLITZ_INCLUDES - the blitz include directory\n#  BLITZ_LIBRARIES - The libraries needed to use blitz\n\n# Copyright (c) 2006, Montel Laurent, <montel@kde.org>\n# Copyright (c) 2007, Allen Winter, <winter@kde.org>\n# Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n# Redistribution and use is allowed according to the terms of the BSD license.\n# For details see the accompanying COPYING-CMAKE-SCRIPTS file.\n\n# include(FindLibraryWithDebug)\n\nif (BLITZ_INCLUDES AND BLITZ_LIBRARIES)\n  set(Blitz_FIND_QUIETLY TRUE)\nendif (BLITZ_INCLUDES AND BLITZ_LIBRARIES)\n\nfind_path(BLITZ_INCLUDES\n  NAMES\n  blitz/array.h\n  PATH_SUFFIXES blitz*\n  PATHS\n  $ENV{BLITZDIR}/include\n  ${INCLUDE_INSTALL_DIR}\n)\n\nfind_library(BLITZ_LIBRARIES\n  blitz\n  PATHS\n  $ENV{BLITZDIR}/lib\n  ${LIB_INSTALL_DIR}\n)\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(Blitz DEFAULT_MSG\n                                  BLITZ_INCLUDES BLITZ_LIBRARIES)\n\nmark_as_advanced(BLITZ_INCLUDES BLITZ_LIBRARIES)\n"
  },
  {
    "path": "libs/eigen/bench/btl/cmake/FindCBLAS.cmake",
    "content": "# include(FindLibraryWithDebug)\n\nif (CBLAS_INCLUDES AND CBLAS_LIBRARIES)\n  set(CBLAS_FIND_QUIETLY TRUE)\nendif (CBLAS_INCLUDES AND CBLAS_LIBRARIES)\n\nfind_path(CBLAS_INCLUDES\n  NAMES\n  cblas.h\n  PATHS\n  $ENV{CBLASDIR}/include\n  ${INCLUDE_INSTALL_DIR}\n)\n\nfind_library(CBLAS_LIBRARIES\n  cblas\n  PATHS\n  $ENV{CBLASDIR}/lib\n  ${LIB_INSTALL_DIR}\n)\n\nfind_file(CBLAS_LIBRARIES\n  libcblas.so.3\n  PATHS\n  /usr/lib\n  $ENV{CBLASDIR}/lib\n  ${LIB_INSTALL_DIR}\n)\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(CBLAS DEFAULT_MSG\n                                  CBLAS_INCLUDES CBLAS_LIBRARIES)\n\nmark_as_advanced(CBLAS_INCLUDES CBLAS_LIBRARIES)\n"
  },
  {
    "path": "libs/eigen/bench/btl/cmake/FindGMM.cmake",
    "content": "if (GMM_INCLUDE_DIR)\n  # in cache already\n  set(GMM_FOUND TRUE)\nelse (GMM_INCLUDE_DIR)\n\nfind_path(GMM_INCLUDE_DIR NAMES gmm/gmm.h\n     PATHS\n     ${INCLUDE_INSTALL_DIR}\n     ${GMM_INCLUDE_PATH}\n   )\n\ninclude(FindPackageHandleStandardArgs)\nFIND_PACKAGE_HANDLE_STANDARD_ARGS(GMM DEFAULT_MSG GMM_INCLUDE_DIR )\n\nmark_as_advanced(GMM_INCLUDE_DIR)\n\nendif(GMM_INCLUDE_DIR)\n"
  },
  {
    "path": "libs/eigen/bench/btl/cmake/FindGOTO.cmake",
    "content": "\nif (GOTO_LIBRARIES)\n  set(GOTO_FIND_QUIETLY TRUE)\nendif (GOTO_LIBRARIES)\n\nfind_library(GOTO_LIBRARIES goto PATHS $ENV{GOTODIR} ${LIB_INSTALL_DIR})\n\nif(GOTO_LIBRARIES AND CMAKE_COMPILER_IS_GNUCXX)\n  set(GOTO_LIBRARIES ${GOTO_LIBRARIES} \"-lpthread -lgfortran\")\nendif()\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(GOTO DEFAULT_MSG GOTO_LIBRARIES)\n\nmark_as_advanced(GOTO_LIBRARIES)\n"
  },
  {
    "path": "libs/eigen/bench/btl/cmake/FindGOTO2.cmake",
    "content": "\nif (GOTO2_LIBRARIES)\n  set(GOTO2_FIND_QUIETLY TRUE)\nendif (GOTO2_LIBRARIES)\n# \n# find_path(GOTO_INCLUDES\n#   NAMES\n#   cblas.h\n#   PATHS\n#   $ENV{GOTODIR}/include\n#   ${INCLUDE_INSTALL_DIR}\n# )\n\nfind_file(GOTO2_LIBRARIES libgoto2.so PATHS /usr/lib $ENV{GOTO2DIR} ${LIB_INSTALL_DIR})\nfind_library(GOTO2_LIBRARIES goto2 PATHS $ENV{GOTO2DIR} ${LIB_INSTALL_DIR})\n\nif(GOTO2_LIBRARIES AND CMAKE_COMPILER_IS_GNUCXX)\n  set(GOTO2_LIBRARIES ${GOTO2_LIBRARIES} \"-lpthread -lgfortran\")\nendif()\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(GOTO2 DEFAULT_MSG\n                                  GOTO2_LIBRARIES)\n\nmark_as_advanced(GOTO2_LIBRARIES)\n"
  },
  {
    "path": "libs/eigen/bench/btl/cmake/FindMKL.cmake",
    "content": "\nif (MKL_LIBRARIES)\n  set(MKL_FIND_QUIETLY TRUE)\nendif (MKL_LIBRARIES)\n\nif(CMAKE_MINOR_VERSION GREATER 4)\n\nif(${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL \"x86_64\")\n\nfind_library(MKL_LIBRARIES\n  mkl_core\n  PATHS\n  $ENV{MKLLIB}\n  /opt/intel/mkl/*/lib/em64t\n  /opt/intel/Compiler/*/*/mkl/lib/em64t\n  ${LIB_INSTALL_DIR}\n)\n\nfind_library(MKL_GUIDE\n  guide\n  PATHS\n  $ENV{MKLLIB}\n  /opt/intel/mkl/*/lib/em64t\n  /opt/intel/Compiler/*/*/mkl/lib/em64t\n  /opt/intel/Compiler/*/*/lib/intel64\n  ${LIB_INSTALL_DIR}\n)\n\nif(MKL_LIBRARIES AND MKL_GUIDE)\n  set(MKL_LIBRARIES ${MKL_LIBRARIES} mkl_intel_lp64 mkl_sequential ${MKL_GUIDE} pthread)\nendif()\n\nelse(${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL \"x86_64\")\n\nfind_library(MKL_LIBRARIES\n  mkl_core\n  PATHS\n  $ENV{MKLLIB}\n  /opt/intel/mkl/*/lib/32\n  /opt/intel/Compiler/*/*/mkl/lib/32\n  ${LIB_INSTALL_DIR}\n)\n\nfind_library(MKL_GUIDE\n  guide\n  PATHS\n  $ENV{MKLLIB}\n  /opt/intel/mkl/*/lib/32\n  /opt/intel/Compiler/*/*/mkl/lib/32\n  /opt/intel/Compiler/*/*/lib/intel32\n  ${LIB_INSTALL_DIR}\n)\n\nif(MKL_LIBRARIES AND MKL_GUIDE)\n  set(MKL_LIBRARIES ${MKL_LIBRARIES} mkl_intel mkl_sequential ${MKL_GUIDE} pthread)\nendif()\n\nendif(${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL \"x86_64\")\n\nendif(CMAKE_MINOR_VERSION GREATER 4)\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(MKL DEFAULT_MSG MKL_LIBRARIES)\n\nmark_as_advanced(MKL_LIBRARIES)\n"
  },
  {
    "path": "libs/eigen/bench/btl/cmake/FindMTL4.cmake",
    "content": "# - Try to find eigen2 headers\n# Once done this will define\n#\n#  MTL4_FOUND - system has eigen2 lib\n#  MTL4_INCLUDE_DIR - the eigen2 include directory\n#\n# Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n# Adapted from FindEigen.cmake:\n# Copyright (c) 2006, 2007 Montel Laurent, <montel@kde.org>\n# Redistribution and use is allowed according to the terms of the BSD license.\n# For details see the accompanying COPYING-CMAKE-SCRIPTS file.\n\nif (MTL4_INCLUDE_DIR)\n\n  # in cache already\n  set(MTL4_FOUND TRUE)\n\nelse (MTL4_INCLUDE_DIR)\n\nfind_path(MTL4_INCLUDE_DIR NAMES boost/numeric/mtl/mtl.hpp\n     PATHS\n     ${INCLUDE_INSTALL_DIR}\n   )\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(MTL4 DEFAULT_MSG MTL4_INCLUDE_DIR)\n\nmark_as_advanced(MTL4_INCLUDE_DIR)\n\nendif(MTL4_INCLUDE_DIR)\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/cmake/FindPackageHandleStandardArgs.cmake",
    "content": "# FIND_PACKAGE_HANDLE_STANDARD_ARGS(NAME (DEFAULT_MSG|\"Custom failure message\") VAR1 ... )\n#\n# This macro is intended to be used in FindXXX.cmake modules files.\n# It handles the REQUIRED and QUIET argument to FIND_PACKAGE() and\n# it also sets the <UPPERCASED_NAME>_FOUND variable.\n# The package is found if all variables listed are TRUE.\n# Example:\n#\n#    FIND_PACKAGE_HANDLE_STANDARD_ARGS(LibXml2 DEFAULT_MSG LIBXML2_LIBRARIES LIBXML2_INCLUDE_DIR)\n#\n# LibXml2 is considered to be found, if both LIBXML2_LIBRARIES and \n# LIBXML2_INCLUDE_DIR are valid. Then also LIBXML2_FOUND is set to TRUE.\n# If it is not found and REQUIRED was used, it fails with FATAL_ERROR, \n# independent whether QUIET was used or not.\n#\n# If it is found, the location is reported using the VAR1 argument, so \n# here a message \"Found LibXml2: /usr/lib/libxml2.so\" will be printed out.\n# If the second argument is DEFAULT_MSG, the message in the failure case will \n# be \"Could NOT find LibXml2\", if you don't like this message you can specify\n# your own custom failure message there.\n\nMACRO(FIND_PACKAGE_HANDLE_STANDARD_ARGS _NAME _FAIL_MSG _VAR1 )\n\n  IF(\"${_FAIL_MSG}\" STREQUAL \"DEFAULT_MSG\")\n    IF (${_NAME}_FIND_REQUIRED)\n      SET(_FAIL_MESSAGE \"Could not find REQUIRED package ${_NAME}\")\n    ELSE (${_NAME}_FIND_REQUIRED)\n      SET(_FAIL_MESSAGE \"Could not find OPTIONAL package ${_NAME}\")\n    ENDIF (${_NAME}_FIND_REQUIRED)\n  ELSE(\"${_FAIL_MSG}\" STREQUAL \"DEFAULT_MSG\")\n    SET(_FAIL_MESSAGE \"${_FAIL_MSG}\")\n  ENDIF(\"${_FAIL_MSG}\" STREQUAL \"DEFAULT_MSG\")\n\n  STRING(TOUPPER ${_NAME} _NAME_UPPER)\n\n  SET(${_NAME_UPPER}_FOUND TRUE)\n  IF(NOT ${_VAR1})\n    SET(${_NAME_UPPER}_FOUND FALSE)\n  ENDIF(NOT ${_VAR1})\n\n  FOREACH(_CURRENT_VAR ${ARGN})\n    IF(NOT ${_CURRENT_VAR})\n      SET(${_NAME_UPPER}_FOUND FALSE)\n    ENDIF(NOT ${_CURRENT_VAR})\n  ENDFOREACH(_CURRENT_VAR)\n\n  IF (${_NAME_UPPER}_FOUND)\n    IF (NOT ${_NAME}_FIND_QUIETLY)\n        MESSAGE(STATUS \"Found ${_NAME}: ${${_VAR1}}\")\n    ENDIF (NOT ${_NAME}_FIND_QUIETLY)\n  ELSE (${_NAME_UPPER}_FOUND)\n    IF (${_NAME}_FIND_REQUIRED)\n        MESSAGE(FATAL_ERROR \"${_FAIL_MESSAGE}\")\n    ELSE (${_NAME}_FIND_REQUIRED)\n      IF (NOT ${_NAME}_FIND_QUIETLY)\n        MESSAGE(STATUS \"${_FAIL_MESSAGE}\")\n      ENDIF (NOT ${_NAME}_FIND_QUIETLY)\n    ENDIF (${_NAME}_FIND_REQUIRED)\n  ENDIF (${_NAME_UPPER}_FOUND)\nENDMACRO(FIND_PACKAGE_HANDLE_STANDARD_ARGS)\n"
  },
  {
    "path": "libs/eigen/bench/btl/cmake/FindTvmet.cmake",
    "content": "# - Try to find tvmet headers\n# Once done this will define\n#\n#  TVMET_FOUND - system has tvmet lib\n#  TVMET_INCLUDE_DIR - the tvmet include directory\n#\n# Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n# Adapted from FindEigen.cmake:\n# Copyright (c) 2006, 2007 Montel Laurent, <montel@kde.org>\n# Redistribution and use is allowed according to the terms of the BSD license.\n# For details see the accompanying COPYING-CMAKE-SCRIPTS file.\n\nif (TVMET_INCLUDE_DIR)\n\n  # in cache already\n  set(TVMET_FOUND TRUE)\n\nelse (TVMET_INCLUDE_DIR)\n\nfind_path(TVMET_INCLUDE_DIR NAMES tvmet/tvmet.h\n     PATHS\n     ${TVMETDIR}/\n     ${INCLUDE_INSTALL_DIR}\n   )\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(Tvmet DEFAULT_MSG TVMET_INCLUDE_DIR)\n\nmark_as_advanced(TVMET_INCLUDE_DIR)\n\nendif(TVMET_INCLUDE_DIR)\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/cmake/MacroOptionalAddSubdirectory.cmake",
    "content": "# - MACRO_OPTIONAL_ADD_SUBDIRECTORY() combines ADD_SUBDIRECTORY() with an OPTION()\n# MACRO_OPTIONAL_ADD_SUBDIRECTORY( <dir> )\n# If you use MACRO_OPTIONAL_ADD_SUBDIRECTORY() instead of ADD_SUBDIRECTORY(),\n# this will have two effects\n# 1 - CMake will not complain if the directory doesn't exist\n#     This makes sense if you want to distribute just one of the subdirs\n#     in a source package, e.g. just one of the subdirs in kdeextragear.\n# 2 - If the directory exists, it will offer an option to skip the \n#     subdirectory.\n#     This is useful if you want to compile only a subset of all\n#     directories.\n\n# Copyright (c) 2007, Alexander Neundorf, <neundorf@kde.org>\n#\n# Redistribution and use is allowed according to the terms of the BSD license.\n# For details see the accompanying COPYING-CMAKE-SCRIPTS file.\n\n\nMACRO (MACRO_OPTIONAL_ADD_SUBDIRECTORY _dir )\n   GET_FILENAME_COMPONENT(_fullPath ${_dir} ABSOLUTE)\n   IF(EXISTS ${_fullPath})\n      IF(${ARGC} EQUAL 2)\n        OPTION(BUILD_${_dir} \"Build directory ${_dir}\" ${ARGV1})\n      ELSE(${ARGC} EQUAL 2)\n        OPTION(BUILD_${_dir} \"Build directory ${_dir}\" TRUE)\n      ENDIF(${ARGC} EQUAL 2)\n      IF(BUILD_${_dir})\n         ADD_SUBDIRECTORY(${_dir})\n      ENDIF(BUILD_${_dir})\n   ENDIF(EXISTS ${_fullPath})\nENDMACRO (MACRO_OPTIONAL_ADD_SUBDIRECTORY)\n"
  },
  {
    "path": "libs/eigen/bench/btl/data/CMakeLists.txt",
    "content": "\nADD_CUSTOM_TARGET(copy_scripts)\n\nSET(script_files go_mean mk_mean_script.sh mk_new_gnuplot.sh\n    perlib_plot_settings.txt action_settings.txt gnuplot_common_settings.hh )\n\nFOREACH(script_file ${script_files})\nADD_CUSTOM_COMMAND(\n  TARGET copy_scripts\n  POST_BUILD\n  COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/${script_file} ${CMAKE_CURRENT_BINARY_DIR}/\n  ARGS\n)\nENDFOREACH(script_file)\n\nADD_CUSTOM_COMMAND(\n  TARGET copy_scripts\n  POST_BUILD\n  COMMAND ${CMAKE_CXX_COMPILER} --version | head -n 1 > ${CMAKE_CURRENT_BINARY_DIR}/compiler_version.txt\n  ARGS\n)\nADD_CUSTOM_COMMAND(\n  TARGET copy_scripts\n  POST_BUILD\n  COMMAND echo \"${Eigen_SOURCE_DIR}\" > ${CMAKE_CURRENT_BINARY_DIR}/eigen_root_dir.txt\n  ARGS\n)\n\nadd_executable(smooth smooth.cxx)\nadd_executable(regularize regularize.cxx)\nadd_executable(main mean.cxx)\nadd_dependencies(main copy_scripts)\n"
  },
  {
    "path": "libs/eigen/bench/btl/data/action_settings.txt",
    "content": "aat ; \"{/*1.5 A x A^T}\" ; \"matrix size\" ; 4:3000\nata ; \"{/*1.5 A^T x A}\" ; \"matrix size\" ; 4:3000\natv ; \"{/*1.5 matrix^T x vector}\" ; \"matrix size\" ; 4:3000\naxpby ; \"{/*1.5 Y = alpha X + beta Y}\" ; \"vector size\" ; 5:1000000\naxpy ; \"{/*1.5 Y += alpha X}\" ; \"vector size\" ; 5:1000000\nmatrix_matrix ; \"{/*1.5 matrix matrix product}\" ; \"matrix size\" ; 4:3000\nmatrix_vector ; \"{/*1.5 matrix vector product}\" ; \"matrix size\" ; 4:3000\ntrmm ; \"{/*1.5 triangular matrix matrix product}\" ; \"matrix size\" ; 4:3000\ntrisolve_vector ; \"{/*1.5 triangular solver - vector (X = inv(L) X)}\" ; \"size\" ; 4:3000\ntrisolve_matrix ; \"{/*1.5 triangular solver - matrix (M = inv(L) M)}\" ; \"size\" ; 4:3000\ncholesky ; \"{/*1.5 Cholesky decomposition}\" ; \"matrix size\" ; 4:3000\ncomplete_lu_decomp ; \"{/*1.5 Complete LU decomposition}\" ; \"matrix size\" ; 4:3000\npartial_lu_decomp ; \"{/*1.5 Partial LU decomposition}\" ; \"matrix size\" ; 4:3000\ntridiagonalization ; \"{/*1.5 Tridiagonalization}\" ; \"matrix size\" ; 4:3000\nhessenberg ; \"{/*1.5 Hessenberg decomposition}\" ; \"matrix size\" ; 4:3000\nsymv ; \"{/*1.5 symmetric matrix vector product}\" ; \"matrix size\" ; 4:3000\nsyr2 ; \"{/*1.5 symmretric rank-2 update (A += u^T v + u v^T)}\" ; \"matrix size\" ; 4:3000\nger ; \"{/*1.5 general rank-1 update (A += u v^T)}\" ; \"matrix size\" ; 4:3000\nrot ; \"{/*1.5 apply rotation in the plane}\" ; \"vector size\" ; 4:1000000"
  },
  {
    "path": "libs/eigen/bench/btl/data/gnuplot_common_settings.hh",
    "content": "set noclip points\nset clip one\nset noclip two\nset bar 1.000000\nset border 31 lt -1 lw 1.000\nset xdata\nset ydata\nset zdata\nset x2data\nset y2data\nset boxwidth\nset dummy x,y\nset format x \"%g\"\nset format y \"%g\"\nset format x2 \"%g\"\nset format y2 \"%g\"\nset format z \"%g\"\nset angles radians\nset nogrid\nset key title \"\"\nset key left top Right noreverse box linetype -2 linewidth 1.000 samplen 4 spacing 1 width 0\nset nolabel\nset noarrow\n# set nolinestyle # deprecated\nset nologscale\nset logscale x 10\nset offsets 0, 0, 0, 0\nset pointsize 1\nset encoding default\nset nopolar\nset noparametric\nset view 60, 30, 1, 1\nset samples 100, 100\nset isosamples 10, 10\nset surface\nset nocontour\nset clabel '%8.3g'\nset mapping cartesian\nset nohidden3d\nset cntrparam order 4\nset cntrparam linear\nset cntrparam levels auto 5\nset cntrparam points 5\nset size ratio 0 1,1\nset origin 0,0\n# set data style lines\n# set function style lines\nset xzeroaxis lt -2 lw 1.000\nset x2zeroaxis lt -2 lw 1.000\nset yzeroaxis lt -2 lw 1.000\nset y2zeroaxis lt -2 lw 1.000\nset tics in\nset ticslevel 0.5\nset tics scale 1, 0.5\nset mxtics default\nset mytics default\nset mx2tics default\nset my2tics default\nset xtics border mirror norotate autofreq\nset ytics border mirror norotate autofreq\nset ztics border nomirror norotate autofreq\nset nox2tics\nset noy2tics\nset timestamp \"\" bottom norotate offset 0,0\nset rrange [ * : * ] noreverse nowriteback  # (currently [-0:10] )\nset trange [ * : * ] noreverse nowriteback  # (currently [-5:5] )\nset urange [ * : * ] noreverse nowriteback  # (currently [-5:5] )\nset vrange [ * : * ] noreverse nowriteback  # (currently [-5:5] )\nset xlabel \"matrix size\" offset 0,0\nset x2label \"\" offset 0,0\nset timefmt \"%d/%m/%y\\n%H:%M\"\nset xrange [ 10 : 1000 ] noreverse nowriteback\nset x2range [ * : * ] noreverse nowriteback  # (currently [-10:10] )\nset ylabel \"MFLOPS\" offset 0,0\nset y2label \"\" offset 0,0\nset yrange [ * : * ] noreverse nowriteback  # (currently [-10:10] )\nset y2range [ * : * ] noreverse nowriteback  # (currently [-10:10] )\nset zlabel \"\" offset 0,0\nset zrange [ * : * ] noreverse nowriteback  # (currently [-10:10] )\nset zero 1e-08\nset lmargin -1\nset bmargin -1\nset rmargin -1\nset tmargin -1\nset locale \"C\"\nset xrange [4:1024]\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/data/go_mean",
    "content": "#!/bin/bash\n\nif [ $# < 1 ]; then\n  echo \"Usage: $0 working_directory [tiny|large [prefix]]\"\nelse\n\nmkdir -p $1\n##cp ../libs/*/*.dat $1\n\nmode=large\nif [ $# > 2 ]; then\n  mode=$2\nfi\nif [ $# > 3 ]; then\n  prefix=$3\nfi\n\nEIGENDIR=`cat eigen_root_dir.txt`\n\nwebpagefilename=$1/index.html\nmeanstatsfilename=$1/mean.html\n\necho ''  > $meanstatsfilename\necho ''  > $webpagefilename\necho '<p><strong>Configuration</strong>'  >> $webpagefilename\necho '<ul>'\\\n  '<li>' `cat /proc/cpuinfo | grep \"model name\" | head -n 1`\\\n  '  (' `uname -m` ')</li>'\\\n  '<li> compiler: ' `cat compiler_version.txt` '</li>'\\\n  '<li> eigen3: ' `hg identify -i $EIGENDIR` '</li>'\\\n  '</ul>' \\\n  '</p>'  >> $webpagefilename\n\nsource mk_mean_script.sh axpy $1 11 2500 100000 250000  $mode $prefix\nsource mk_mean_script.sh axpby $1 11 2500 100000 250000 $mode $prefix\nsource mk_mean_script.sh matrix_vector $1 11 50 300 1000 $mode $prefix\nsource mk_mean_script.sh atv $1 11 50 300 1000 $mode $prefix\nsource mk_mean_script.sh matrix_matrix $1 11 100 300 1000 $mode $prefix\nsource mk_mean_script.sh aat $1 11 100 300 1000 $mode $prefix\n# source mk_mean_script.sh ata $1 11 100 300 1000 $mode $prefix\nsource mk_mean_script.sh trmm $1 11 100 300 1000 $mode $prefix\nsource mk_mean_script.sh trisolve_vector $1 11 100 300 1000 $mode $prefix\nsource mk_mean_script.sh trisolve_matrix $1 11 100 300 1000 $mode $prefix\nsource mk_mean_script.sh cholesky $1 11 100 300 1000 $mode $prefix\nsource mk_mean_script.sh partial_lu_decomp $1 11 100 300 1000 $mode $prefix\nsource mk_mean_script.sh tridiagonalization $1 11 100 300 1000 $mode $prefix\nsource mk_mean_script.sh hessenberg $1 11 100 300 1000 $mode $prefix\nsource mk_mean_script.sh symv $1 11 50 300 1000 $mode $prefix\nsource mk_mean_script.sh syr2 $1 11 50 300 1000 $mode $prefix\nsource mk_mean_script.sh ger $1 11 50 300 1000 $mode $prefix\nsource mk_mean_script.sh rot $1 11 2500 100000 250000 $mode $prefix\nsource mk_mean_script.sh complete_lu_decomp $1 11 100 300 1000 $mode $prefix\n\nfi\n\n## compile the web page ##\n\n#echo `cat footer.html` >> $webpagefilename"
  },
  {
    "path": "libs/eigen/bench/btl/data/mean.cxx",
    "content": "//=====================================================\n// File   :  mean.cxx\n// Author :  L. Plagne <laurent.plagne@edf.fr)>        \n// Copyright (C) EDF R&D,  lun sep 30 14:23:15 CEST 2002\n//=====================================================\n// \n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n// \n#include \"utilities.h\"\n#include <vector>\n#include <string>\n#include <iostream>\n#include <fstream>\n#include \"bench_parameter.hh\"\n#include \"utils/xy_file.hh\"\n#include <set>\n\nusing namespace std;\n\ndouble mean_calc(const vector<int> & tab_sizes, const vector<double> & tab_mflops, const int size_min, const int size_max);\n\nclass Lib_Mean{\n\npublic:\n  Lib_Mean( void ):_lib_name(),_mean_in_cache(),_mean_out_of_cache(){\n    MESSAGE(\"Lib_mean Default Ctor\");\n    MESSAGE(\"!!! should not be used\");\n    exit(0);\n  }\n  Lib_Mean(const string & name, const double & mic, const double & moc):_lib_name(name),_mean_in_cache(mic),_mean_out_of_cache(moc){\n    MESSAGE(\"Lib_mean Ctor\");\n  }\n  Lib_Mean(const Lib_Mean & lm):_lib_name(lm._lib_name),_mean_in_cache(lm._mean_in_cache),_mean_out_of_cache(lm._mean_out_of_cache){\n    MESSAGE(\"Lib_mean Copy Ctor\");\n  }\n  ~Lib_Mean( void ){\n    MESSAGE(\"Lib_mean Dtor\");\n  }\n    \n  double _mean_in_cache;\n  double _mean_out_of_cache;\n  string _lib_name;\n\n  bool operator < ( const Lib_Mean &right) const \n  {\n    //return ( this->_mean_out_of_cache > right._mean_out_of_cache) ;\n    return ( this->_mean_in_cache > right._mean_in_cache) ;\n  }\n\n}; \n\n\nint main( int argc , char *argv[] )\n{\n\n  if (argc<6){\n    INFOS(\"!!! Error ... usage : main what mic Mic moc Moc filename1 finename2...\");\n    exit(0);\n  }\n  INFOS(argc);\n\n  int min_in_cache=atoi(argv[2]);\n  int max_in_cache=atoi(argv[3]);\n  int min_out_of_cache=atoi(argv[4]);\n  int max_out_of_cache=atoi(argv[5]);\n\n\n  multiset<Lib_Mean> s_lib_mean ;\n\n  for (int i=6;i<argc;i++){\n    \n    string filename=argv[i];\n    \n    INFOS(filename);\n\n    double mic=0;\n    double moc=0;\n\n    {\n      \n      vector<int> tab_sizes;\n      vector<double> tab_mflops;\n\n      read_xy_file(filename,tab_sizes,tab_mflops);\n\n      mic=mean_calc(tab_sizes,tab_mflops,min_in_cache,max_in_cache);\n      moc=mean_calc(tab_sizes,tab_mflops,min_out_of_cache,max_out_of_cache);\n\n      Lib_Mean cur_lib_mean(filename,mic,moc);\n      \n      s_lib_mean.insert(cur_lib_mean);\t\n\n    }   \n           \n  }\n\n\n  cout << \"<TABLE BORDER CELLPADDING=2>\" << endl ;\n  cout << \"  <TR>\" << endl ;\n  cout << \"    <TH ALIGN=CENTER> \" << argv[1] << \" </TH>\" << endl ;\n  cout << \"    <TH ALIGN=CENTER> <a href=\"\"#mean_marker\"\"> in cache <BR> mean perf <BR> Mflops </a></TH>\" << endl ;\n  cout << \"    <TH ALIGN=CENTER> in cache <BR> % best </TH>\" << endl ;\n  cout << \"    <TH ALIGN=CENTER> <a href=\"\"#mean_marker\"\"> out of cache <BR> mean perf <BR> Mflops </a></TH>\" << endl ;\n  cout << \"    <TH ALIGN=CENTER> out of cache <BR> % best </TH>\" << endl ;\n  cout << \"    <TH ALIGN=CENTER> details </TH>\" << endl ;\n  cout << \"    <TH ALIGN=CENTER> comments </TH>\" << endl ;\n  cout << \"  </TR>\" << endl ;\n\n  multiset<Lib_Mean>::iterator is = s_lib_mean.begin();\n  Lib_Mean best(*is);  \n  \n\n  for (is=s_lib_mean.begin(); is!=s_lib_mean.end() ; is++){\n\n    cout << \"  <TR>\" << endl ;\n    cout << \"     <TD> \" << is->_lib_name << \" </TD>\" << endl ;\n    cout << \"     <TD> \" << is->_mean_in_cache << \" </TD>\" << endl ;\n    cout << \"     <TD> \" << 100*(is->_mean_in_cache/best._mean_in_cache) << \" </TD>\" << endl ;\n    cout << \"     <TD> \" << is->_mean_out_of_cache << \" </TD>\" << endl ;\n    cout << \"     <TD> \" << 100*(is->_mean_out_of_cache/best._mean_out_of_cache) << \" </TD>\" << endl ;\n    cout << \"     <TD> \" << \n      \"<a href=\\\"#\"<<is->_lib_name<<\"_\"<<argv[1]<<\"\\\">snippet</a>/\" \n      \"<a href=\\\"#\"<<is->_lib_name<<\"_flags\\\">flags</a>  </TD>\" << endl ;\n    cout << \"     <TD> \" << \n      \"<a href=\\\"#\"<<is->_lib_name<<\"_comments\\\">click here</a>  </TD>\" << endl ;\n    cout << \"  </TR>\" << endl ;\n  \n  }\n\n  cout << \"</TABLE>\" << endl ;\n\n  ofstream output_file (\"../order_lib\",ios::out) ;\n  \n  for (is=s_lib_mean.begin(); is!=s_lib_mean.end() ; is++){\n    output_file << is->_lib_name << endl ;\n  }\n\n  output_file.close();\n\n}\n\ndouble mean_calc(const vector<int> & tab_sizes, const vector<double> & tab_mflops, const int size_min, const int size_max){\n  \n  int size=tab_sizes.size();\n  int nb_sample=0;\n  double mean=0.0;\n\n  for (int i=0;i<size;i++){\n    \n    \n    if ((tab_sizes[i]>=size_min)&&(tab_sizes[i]<=size_max)){\n      \n      nb_sample++;\n      mean+=tab_mflops[i];\n\n    }\n\n    \n  }\n\n  if (nb_sample==0){\n    INFOS(\"no data for mean calculation\");\n    return 0.0;\n  }\n\n  return mean/nb_sample;\n}\n\n  \n\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/data/mk_gnuplot_script.sh",
    "content": "#! /bin/bash\nWHAT=$1\nDIR=$2\necho $WHAT script generation\ncat $WHAT.hh > $WHAT.gnuplot\n\nDATA_FILE=`find $DIR -name \"*.dat\" | grep $WHAT`\n\necho plot \\\\ >> $WHAT.gnuplot\n\nfor FILE in $DATA_FILE\ndo\n    LAST=$FILE\ndone\n\necho LAST=$LAST\n\nfor FILE in $DATA_FILE\ndo\n     if [ $FILE != $LAST ]\n     then\n\tBASE=${FILE##*/} ; BASE=${FILE##*/} ; AVANT=bench_${WHAT}_ ; REDUC=${BASE##*$AVANT} ; TITLE=${REDUC%.dat}\n\techo \"'\"$FILE\"'\" title \"'\"$TITLE\"'\" \",\\\\\" >>  $WHAT.gnuplot\n     fi\ndone\nBASE=${LAST##*/} ; BASE=${FILE##*/} ; AVANT=bench_${WHAT}_ ; REDUC=${BASE##*$AVANT} ; TITLE=${REDUC%.dat}\necho \"'\"$LAST\"'\" title \"'\"$TITLE\"'\" >>  $WHAT.gnuplot\n\n#echo set term postscript color >> $WHAT.gnuplot\n#echo set output \"'\"$WHAT.ps\"'\" >> $WHAT.gnuplot\necho set term pbm small color >> $WHAT.gnuplot\necho set output \"'\"$WHAT.ppm\"'\" >> $WHAT.gnuplot\necho plot \\\\ >> $WHAT.gnuplot\n\nfor FILE in $DATA_FILE\ndo\n     if [ $FILE != $LAST ]\n     then\n\tBASE=${FILE##*/} ; BASE=${FILE##*/} ; AVANT=bench_${WHAT}_ ; REDUC=${BASE##*$AVANT} ; TITLE=${REDUC%.dat}\n\techo \"'\"$FILE\"'\" title \"'\"$TITLE\"'\" \",\\\\\" >>  $WHAT.gnuplot\n     fi\ndone\nBASE=${LAST##*/} ; BASE=${FILE##*/} ; AVANT=bench_${WHAT}_ ; REDUC=${BASE##*$AVANT} ; TITLE=${REDUC%.dat}\necho \"'\"$LAST\"'\" title \"'\"$TITLE\"'\" >>  $WHAT.gnuplot\n\necho set term jpeg large >> $WHAT.gnuplot\necho set output \"'\"$WHAT.jpg\"'\" >> $WHAT.gnuplot\necho plot \\\\ >> $WHAT.gnuplot\n\nfor FILE in $DATA_FILE\ndo\n     if [ $FILE != $LAST ]\n     then\n\tBASE=${FILE##*/} ; BASE=${FILE##*/} ; AVANT=bench_${WHAT}_ ; REDUC=${BASE##*$AVANT} ; TITLE=${REDUC%.dat}\n\techo \"'\"$FILE\"'\" title \"'\"$TITLE\"'\" \",\\\\\" >>  $WHAT.gnuplot\n     fi\ndone\nBASE=${LAST##*/} ; BASE=${FILE##*/} ; AVANT=bench_${WHAT}_ ; REDUC=${BASE##*$AVANT} ; TITLE=${REDUC%.dat}\necho \"'\"$LAST\"'\" title \"'\"$TITLE\"'\" >>  $WHAT.gnuplot\n\n\ngnuplot -persist < $WHAT.gnuplot\n\nrm $WHAT.gnuplot\n\n\n\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/data/mk_mean_script.sh",
    "content": "#! /bin/bash\nWHAT=$1\nDIR=$2\nMINIC=$3\nMAXIC=$4\nMINOC=$5\nMAXOC=$6\nprefix=$8\n\nmeanstatsfilename=$2/mean.html\n\nWORK_DIR=tmp\nmkdir $WORK_DIR\n\nDATA_FILE=`find $DIR -name \"*.dat\" | grep _${WHAT}`\n\nif [ -n \"$DATA_FILE\" ]; then\n\n  echo \"\"\n  echo \"$1...\"\n  for FILE in $DATA_FILE\n  do\n          ##echo hello world\n          ##echo \"mk_mean_script1\" ${FILE}\n    BASE=${FILE##*/} ; BASE=${FILE##*/} ; AVANT=bench_${WHAT}_ ; REDUC=${BASE##*$AVANT} ; TITLE=${REDUC%.dat}\n\n    ##echo \"mk_mean_script1\" ${TITLE}\n    cp $FILE ${WORK_DIR}/${TITLE}\n\n  done\n\n  cd $WORK_DIR\n  ../main $1 $3 $4 $5 $6 * >> ../$meanstatsfilename\n  ../mk_new_gnuplot.sh $1 $2 $7\n  rm -f *.gnuplot\n  cd ..\n\n  echo '<br/>' >> $meanstatsfilename\n\n  webpagefilename=$2/index.html\n  # echo '<h3>'${WHAT}'</h3>'  >> $webpagefilename\n  echo '<hr/><a href=\"'$prefix$1'.pdf\"><img src=\"'$prefix$1'.png\" alt=\"'${WHAT}'\" /></a><br/>'  >> $webpagefilename\n\nfi\n\nrm -R $WORK_DIR\n\n\n\n\n\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/data/mk_new_gnuplot.sh",
    "content": "#!/bin/bash\nWHAT=$1\nDIR=$2\n\ncat ../gnuplot_common_settings.hh > ${WHAT}.gnuplot\n\necho \"set title \" `grep ${WHAT} ../action_settings.txt | head -n 1 | cut -d \";\" -f 2` >> $WHAT.gnuplot\necho \"set xlabel \" `grep ${WHAT} ../action_settings.txt | head -n 1 | cut -d \";\" -f 3` \" offset 0,0\" >> $WHAT.gnuplot\necho \"set xrange [\" `grep ${WHAT} ../action_settings.txt | head -n 1 | cut -d \";\" -f 4` \"]\" >> $WHAT.gnuplot\n\nif [ $# > 3 ]; then\n  if [ \"$3\" == \"tiny\" ]; then\n    echo \"set xrange [2:16]\" >> $WHAT.gnuplot\n    echo \"set nologscale\" >> $WHAT.gnuplot\n  fi\nfi\n\n\n\nDATA_FILE=`cat ../order_lib`\necho set term postscript color rounded enhanced >> $WHAT.gnuplot\necho set output \"'\"../${DIR}/$WHAT.ps\"'\" >> $WHAT.gnuplot\n\n# echo set term svg color rounded enhanced >> $WHAT.gnuplot\n# echo \"set terminal svg enhanced size 1000 1000 fname \\\"Times\\\" fsize 36\" >> $WHAT.gnuplot\n# echo set output \"'\"../${DIR}/$WHAT.svg\"'\" >> $WHAT.gnuplot\n\necho plot \\\\ >> $WHAT.gnuplot\n\nfor FILE in $DATA_FILE\ndo\n    LAST=$FILE\ndone\n\nfor FILE in $DATA_FILE\ndo\n    BASE=${FILE##*/} ; BASE=${FILE##*/} ; AVANT=bench_${WHAT}_ ; REDUC=${BASE##*$AVANT} ; TITLE=${REDUC%.dat}\n\n    echo \"'\"$FILE\"'\" `grep $TITLE ../perlib_plot_settings.txt | head -n 1 | cut -d \";\" -f 2` \"\\\\\" >>  $WHAT.gnuplot\n    if [ $FILE != $LAST ]\n    then\n      echo \", \\\\\" >>  $WHAT.gnuplot\n    fi\ndone\necho \" \" >>  $WHAT.gnuplot\n\ngnuplot -persist < $WHAT.gnuplot\n\nrm $WHAT.gnuplot\n\nps2pdf ../${DIR}/$WHAT.ps ../${DIR}/$WHAT.pdf\nconvert -background white -density 120 -rotate 90 -resize 800 +dither -colors 256 -quality 0 ../${DIR}/$WHAT.ps -background white -flatten  ../${DIR}/$WHAT.png\n\n# pstoedit -rotate -90 -xscale 0.8 -yscale 0.8 -centered -yshift -50 -xshift -100  -f plot-svg aat.ps  aat2.svg\n"
  },
  {
    "path": "libs/eigen/bench/btl/data/perlib_plot_settings.txt",
    "content": "eigen3 ;          with lines lw 4 lt 1 lc rgbcolor \"black\"\neigen2 ;          with lines lw 3 lt 1 lc rgbcolor \"#999999\"\nEigenBLAS ;       with lines lw 3 lt 3 lc rgbcolor \"#999999\"\neigen3_novec ;    with lines lw 2 lt 1 lc rgbcolor \"#999999\"\neigen3_nogccvec ; with lines lw 2 lt 2 lc rgbcolor \"#991010\"\nINTEL_MKL ;       with lines lw 3 lt 1 lc rgbcolor \"#ff0000\"\nATLAS ;           with lines lw 3 lt 1 lc rgbcolor \"#008000\"\ngmm ;             with lines lw 3 lt 1 lc rgbcolor \"#0000ff\"\nublas ;           with lines lw 3 lt 1 lc rgbcolor \"#00b7ff\"\nmtl4 ;            with lines lw 3 lt 1 lc rgbcolor \"#d18847\"\nblitz ;           with lines lw 3 lt 1 lc rgbcolor \"#ff00ff\"\nF77 ;             with lines lw 3 lt 3 lc rgbcolor \"#e6e64c\"\nGOTO ;            with lines lw 3 lt 3 lc rgbcolor \"#C05600\"\nGOTO2 ;           with lines lw 3 lt 1 lc rgbcolor \"#C05600\"\nC ;               with lines lw 3 lt 3 lc rgbcolor \"#e6bd96\"\nACML ;            with lines lw 2 lt 3 lc rgbcolor \"#e6e64c\"\n"
  },
  {
    "path": "libs/eigen/bench/btl/data/regularize.cxx",
    "content": "//=====================================================\n// File   :  regularize.cxx\n// Author :  L. Plagne <laurent.plagne@edf.fr)>        \n// Copyright (C) EDF R&D,  lun sep 30 14:23:15 CEST 2002\n//=====================================================\n// \n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n// \n#include \"utilities.h\"\n#include <vector>\n#include <string>\n#include <iostream>\n#include <fstream>\n#include \"bench_parameter.hh\"\n#include <set>\n\nusing namespace std;\n\nvoid read_xy_file(const string & filename, vector<int> & tab_sizes, vector<double> & tab_mflops);\nvoid regularize_curve(const string & filename,\n\t\t      const vector<double> & tab_mflops, \n\t\t      const vector<int> & tab_sizes, \n\t\t      int start_cut_size, int stop_cut_size);\n/////////////////////////////////////////////////////////////////////////////////////////////////\n\nint main( int argc , char *argv[] )\n{\n\n  // input data\n\n  if (argc<4){\n    INFOS(\"!!! Error ... usage : main filename start_cut_size stop_cut_size regularize_filename\");\n    exit(0);\n  }\n  INFOS(argc);\n\n  int start_cut_size=atoi(argv[2]);\n  int stop_cut_size=atoi(argv[3]);\n\n  string filename=argv[1];\n  string regularize_filename=argv[4];\n  \n  INFOS(filename);\n  INFOS(\"start_cut_size=\"<<start_cut_size);\n\n  vector<int> tab_sizes;\n  vector<double> tab_mflops;\n\n  read_xy_file(filename,tab_sizes,tab_mflops);\n\n  // regularizeing\n\n  regularize_curve(regularize_filename,tab_mflops,tab_sizes,start_cut_size,stop_cut_size);\n  \n\n}\n\n//////////////////////////////////////////////////////////////////////////////////////\n\nvoid regularize_curve(const string & filename,\n\t\t      const vector<double> & tab_mflops, \n\t\t      const vector<int> & tab_sizes, \n\t\t      int start_cut_size, int stop_cut_size)\n{\n  int size=tab_mflops.size();\n  ofstream output_file (filename.c_str(),ios::out) ;\n\n  int i=0;\n\n  while(tab_sizes[i]<start_cut_size){\n    \n    output_file << tab_sizes[i] << \" \" <<  tab_mflops[i] << endl ;\n    i++;\n\n  }\n    \n  output_file << endl ;\n\n  while(tab_sizes[i]<stop_cut_size){\n    \n    i++;\n\n  }\n\n  while(i<size){\n    \n    output_file << tab_sizes[i] << \" \" <<  tab_mflops[i] << endl ;\n    i++;\n\n  }\n\n  output_file.close();\n\n}\n\n///////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\nvoid read_xy_file(const string & filename, vector<int> & tab_sizes, vector<double> & tab_mflops){\n\n  ifstream input_file (filename.c_str(),ios::in) ;\n\n  if (!input_file){\n    INFOS(\"!!! Error opening \"<<filename);\n    exit(0);\n  }\n  \n  int nb_point=0;\n  int size=0;\n  double mflops=0;\n\n  while (input_file >> size >> mflops ){\n    nb_point++;\n    tab_sizes.push_back(size);\n    tab_mflops.push_back(mflops);\n  }\n  SCRUTE(nb_point);\n\n  input_file.close();\n}\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/data/smooth.cxx",
    "content": "//=====================================================\n// File   :  smooth.cxx\n// Author :  L. Plagne <laurent.plagne@edf.fr)>        \n// Copyright (C) EDF R&D,  lun sep 30 14:23:15 CEST 2002\n//=====================================================\n// \n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n// \n#include \"utilities.h\"\n#include <vector>\n#include <deque>\n#include <string>\n#include <iostream>\n#include <fstream>\n#include \"bench_parameter.hh\"\n#include <set>\n\nusing namespace std;\n\nvoid read_xy_file(const string & filename, vector<int> & tab_sizes, vector<double> & tab_mflops);\nvoid write_xy_file(const string & filename, vector<int> & tab_sizes, vector<double> & tab_mflops);\nvoid smooth_curve(const vector<double> & tab_mflops, vector<double> & smooth_tab_mflops,int window_half_width);\nvoid centered_smooth_curve(const vector<double> & tab_mflops, vector<double> & smooth_tab_mflops,int window_half_width);\n\n/////////////////////////////////////////////////////////////////////////////////////////////////\n\nint main( int argc , char *argv[] )\n{\n\n  // input data\n\n  if (argc<3){\n    INFOS(\"!!! Error ... usage : main filename window_half_width smooth_filename\");\n    exit(0);\n  }\n  INFOS(argc);\n\n  int window_half_width=atoi(argv[2]);\n\n  string filename=argv[1];\n  string smooth_filename=argv[3];\n  \n  INFOS(filename);\n  INFOS(\"window_half_width=\"<<window_half_width);\n\n  vector<int> tab_sizes;\n  vector<double> tab_mflops;\n\n  read_xy_file(filename,tab_sizes,tab_mflops);\n\n  // smoothing\n\n  vector<double> smooth_tab_mflops;\n\n  //smooth_curve(tab_mflops,smooth_tab_mflops,window_half_width);\n  centered_smooth_curve(tab_mflops,smooth_tab_mflops,window_half_width);\n\n  // output result\n\n  write_xy_file(smooth_filename,tab_sizes,smooth_tab_mflops);\n  \n\n}\n\n///////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\ntemplate<class VECTOR>\ndouble weighted_mean(const VECTOR & data)\n{\n\n  double mean=0.0;\n  \n  for (int i=0 ; i<data.size() ; i++){\n\n    mean+=data[i];\n\n  }\n\n  return mean/double(data.size()) ;\n\n}    \n\n\n\n\n///////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n\nvoid smooth_curve(const vector<double> & tab_mflops, vector<double> & smooth_tab_mflops,int window_half_width){\n  \n  int window_width=2*window_half_width+1;\n\n  int size=tab_mflops.size();\n\n  vector<double> sample(window_width);\n  \n  for (int i=0 ; i < size ; i++){\n    \n    for ( int j=0 ; j < window_width ; j++ ){\n      \n      int shifted_index=i+j-window_half_width;\n      if (shifted_index<0) shifted_index=0;\n      if (shifted_index>size-1) shifted_index=size-1;\n      sample[j]=tab_mflops[shifted_index];\n      \n    }\n\n    smooth_tab_mflops.push_back(weighted_mean(sample));\n\n  }\n\n}\n\nvoid centered_smooth_curve(const vector<double> & tab_mflops, vector<double> & smooth_tab_mflops,int window_half_width){\n  \n  int max_window_width=2*window_half_width+1;\n\n  int size=tab_mflops.size();\n\n  \n  for (int i=0 ; i < size ; i++){\n\n    deque<double> sample;\n\n    \n    sample.push_back(tab_mflops[i]);\n\n    for ( int j=1 ; j <= window_half_width ; j++ ){\n      \n      int before=i-j;\n      int after=i+j;\n      \n      if ((before>=0)&&(after<size)) // inside of the vector\n\t{ \n\t  sample.push_front(tab_mflops[before]);\n\t  sample.push_back(tab_mflops[after]);\n\t}\n    }\n    \n    smooth_tab_mflops.push_back(weighted_mean(sample));\n    \n  }\n\n}\n\n\n///////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\nvoid write_xy_file(const string & filename, vector<int> & tab_sizes, vector<double> & tab_mflops){\n\n  ofstream output_file (filename.c_str(),ios::out) ;\n  \n  for (int i=0 ; i < tab_sizes.size() ; i++)\n    {\n      output_file << tab_sizes[i] << \" \" <<  tab_mflops[i] << endl ;\n    }\n  \n  output_file.close();\n\n}\n\n\n///////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\nvoid read_xy_file(const string & filename, vector<int> & tab_sizes, vector<double> & tab_mflops){\n\n  ifstream input_file (filename.c_str(),ios::in) ;\n\n  if (!input_file){\n    INFOS(\"!!! Error opening \"<<filename);\n    exit(0);\n  }\n  \n  int nb_point=0;\n  int size=0;\n  double mflops=0;\n\n  while (input_file >> size >> mflops ){\n    nb_point++;\n    tab_sizes.push_back(size);\n    tab_mflops.push_back(mflops);\n  }\n  SCRUTE(nb_point);\n\n  input_file.close();\n}\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/data/smooth_all.sh",
    "content": "#! /bin/bash\nORIG_DIR=$1\nSMOOTH_DIR=${ORIG_DIR}_smooth\nmkdir ${SMOOTH_DIR}\n\nAXPY_FILE=`find ${ORIG_DIR} -name \"*.dat\" | grep axpy`\nfor FILE in ${AXPY_FILE}\ndo\n    echo $FILE\n    BASE=${FILE##*/}\n    ./smooth ${ORIG_DIR}/${BASE} 4 ${SMOOTH_DIR}/${BASE}_tmp\n    ./regularize ${SMOOTH_DIR}/${BASE}_tmp 2500 15000 ${SMOOTH_DIR}/${BASE}\n    rm -f  ${SMOOTH_DIR}/${BASE}_tmp\ndone\n\n\nMATRIX_VECTOR_FILE=`find ${ORIG_DIR} -name \"*.dat\" | grep matrix_vector`\nfor FILE in ${MATRIX_VECTOR_FILE}\ndo\n    echo $FILE\n    BASE=${FILE##*/}\n    ./smooth ${ORIG_DIR}/${BASE} 4 ${SMOOTH_DIR}/${BASE}_tmp\n    ./regularize ${SMOOTH_DIR}/${BASE}_tmp 50 180 ${SMOOTH_DIR}/${BASE}\n    rm -f  ${SMOOTH_DIR}/${BASE}_tmp\ndone\n\nMATRIX_MATRIX_FILE=`find ${ORIG_DIR} -name \"*.dat\" | grep matrix_matrix`\nfor FILE in ${MATRIX_MATRIX_FILE}\ndo\n    echo $FILE\n    BASE=${FILE##*/}\n    ./smooth ${ORIG_DIR}/${BASE} 4 ${SMOOTH_DIR}/${BASE}\ndone\n\nAAT_FILE=`find ${ORIG_DIR} -name \"*.dat\" | grep _aat`\nfor FILE in ${AAT_FILE}\ndo\n    echo $FILE\n    BASE=${FILE##*/}\n    ./smooth ${ORIG_DIR}/${BASE} 4 ${SMOOTH_DIR}/${BASE}\ndone\n\n\nATA_FILE=`find ${ORIG_DIR} -name \"*.dat\" | grep _ata`\nfor FILE in ${ATA_FILE}\ndo\n    echo $FILE\n    BASE=${FILE##*/}\n    ./smooth ${ORIG_DIR}/${BASE} 4 ${SMOOTH_DIR}/${BASE}\ndone\n\n### no smoothing for tinyvector and matrices libs\n\nTINY_BLITZ_FILE=`find ${ORIG_DIR} -name \"*.dat\" | grep tiny_blitz`\nfor FILE in ${TINY_BLITZ_FILE}\ndo\n    echo $FILE\n    BASE=${FILE##*/}\n    cp ${ORIG_DIR}/${BASE} ${SMOOTH_DIR}/${BASE}\ndone\n\nTVMET_FILE=`find ${ORIG_DIR} -name \"*.dat\" | grep tvmet`\nfor FILE in ${TVMET_FILE}\ndo\n    echo $FILE\n    BASE=${FILE##*/}\n    cp ${ORIG_DIR}/${BASE} ${SMOOTH_DIR}/${BASE}\ndone\n"
  },
  {
    "path": "libs/eigen/bench/btl/generic_bench/bench.hh",
    "content": "//=====================================================\n// File   :  bench.hh\n// Author :  L. Plagne <laurent.plagne@edf.fr)>\n// Copyright (C) EDF R&D,  lun sep 30 14:23:16 CEST 2002\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#ifndef BENCH_HH\n#define BENCH_HH\n\n#include \"btl.hh\"\n#include \"bench_parameter.hh\"\n#include <iostream>\n#include \"utilities.h\"\n#include \"size_lin_log.hh\"\n#include \"xy_file.hh\"\n#include <vector>\n#include <string>\n#include \"timers/portable_perf_analyzer.hh\"\n// #include \"timers/mixed_perf_analyzer.hh\"\n// #include \"timers/x86_perf_analyzer.hh\"\n// #include \"timers/STL_perf_analyzer.hh\"\n#ifdef HAVE_MKL\nextern \"C\" void cblas_saxpy(const int, const float, const float*, const int, float *, const int);\n#endif\nusing namespace std;\n\ntemplate <template<class> class Perf_Analyzer, class Action>\nBTL_DONT_INLINE void bench( int size_min, int size_max, int nb_point )\n{\n  if (BtlConfig::skipAction(Action::name()))\n    return;\n\n  string filename=\"bench_\"+Action::name()+\".dat\";\n\n  INFOS(\"starting \" <<filename);\n\n  // utilities\n\n  std::vector<double> tab_mflops(nb_point);\n  std::vector<int> tab_sizes(nb_point);\n\n  // matrices and vector size calculations\n  size_lin_log(nb_point,size_min,size_max,tab_sizes);\n\n  std::vector<int> oldSizes;\n  std::vector<double> oldFlops;\n  bool hasOldResults = read_xy_file(filename, oldSizes, oldFlops, true);\n  int oldi = oldSizes.size() - 1;\n\n  // loop on matrix size\n  Perf_Analyzer<Action> perf_action;\n  for (int i=nb_point-1;i>=0;i--)\n  {\n    //INFOS(\"size=\" <<tab_sizes[i]<<\"   (\"<<nb_point-i<<\"/\"<<nb_point<<\")\");\n    std::cout << \" \" << \"size = \" << tab_sizes[i] << \"  \" << std::flush;\n\n    BTL_DISABLE_SSE_EXCEPTIONS();\n    #ifdef HAVE_MKL\n    {\n      float dummy;\n      cblas_saxpy(1,0,&dummy,1,&dummy,1);\n    }\n    #endif\n\n    tab_mflops[i] = perf_action.eval_mflops(tab_sizes[i]);\n    std::cout << tab_mflops[i];\n    \n    if (hasOldResults)\n    {\n      while (oldi>=0 && oldSizes[oldi]>tab_sizes[i])\n        --oldi;\n      if (oldi>=0 && oldSizes[oldi]==tab_sizes[i])\n      {\n        if (oldFlops[oldi]<tab_mflops[i])\n          std::cout << \"\\t > \";\n        else\n          std::cout << \"\\t < \";\n        std::cout << oldFlops[oldi];\n      }\n      --oldi;\n    }\n    std::cout << \" MFlops    (\" << nb_point-i << \"/\" << nb_point << \")\" << std::endl;\n  }\n\n  if (!BtlConfig::Instance.overwriteResults)\n  {\n    if (hasOldResults)\n    {\n      // merge the two data\n      std::vector<int> newSizes;\n      std::vector<double> newFlops;\n      int i=0;\n      int j=0;\n      while (i<tab_sizes.size() && j<oldSizes.size())\n      {\n        if (tab_sizes[i] == oldSizes[j])\n        {\n          newSizes.push_back(tab_sizes[i]);\n          newFlops.push_back(std::max(tab_mflops[i], oldFlops[j]));\n          ++i;\n          ++j;\n        }\n        else if (tab_sizes[i] < oldSizes[j])\n        {\n          newSizes.push_back(tab_sizes[i]);\n          newFlops.push_back(tab_mflops[i]);\n          ++i;\n        }\n        else\n        {\n          newSizes.push_back(oldSizes[j]);\n          newFlops.push_back(oldFlops[j]);\n          ++j;\n        }\n      }\n      while (i<tab_sizes.size())\n      {\n        newSizes.push_back(tab_sizes[i]);\n        newFlops.push_back(tab_mflops[i]);\n        ++i;\n      }\n      while (j<oldSizes.size())\n      {\n        newSizes.push_back(oldSizes[j]);\n        newFlops.push_back(oldFlops[j]);\n        ++j;\n      }\n      tab_mflops = newFlops;\n      tab_sizes = newSizes;\n    }\n  }\n\n  // dump the result in a file  :\n  dump_xy_file(tab_sizes,tab_mflops,filename);\n\n}\n\n// default Perf Analyzer\n\ntemplate <class Action>\nBTL_DONT_INLINE void bench( int size_min, int size_max, int nb_point ){\n\n  // if the rdtsc is not available :\n  bench<Portable_Perf_Analyzer,Action>(size_min,size_max,nb_point);\n  // if the rdtsc is available :\n//    bench<Mixed_Perf_Analyzer,Action>(size_min,size_max,nb_point);\n\n\n  // Only for small problem size. Otherwize it will be too long\n//   bench<X86_Perf_Analyzer,Action>(size_min,size_max,nb_point);\n//   bench<STL_Perf_Analyzer,Action>(size_min,size_max,nb_point);\n\n}\n\n#endif\n"
  },
  {
    "path": "libs/eigen/bench/btl/generic_bench/bench_parameter.hh",
    "content": "//=====================================================\n// File   :  bench_parameter.hh\n// Author :  L. Plagne <laurent.plagne@edf.fr)>\n// Copyright (C) EDF R&D,  lun sep 30 14:23:16 CEST 2002\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#ifndef BENCH_PARAMETER_HH\n#define BENCH_PARAMETER_HH\n\n// minimal time for each measurement\n#define REAL_TYPE float\n// minimal time for each measurement\n#define MIN_TIME 0.2\n// nb of point on bench curves\n#define NB_POINT 100\n// min vector size for axpy bench\n#define MIN_AXPY 5\n// max vector size for axpy bench\n#define MAX_AXPY 1000000\n// min matrix size for matrix vector product bench\n#define MIN_MV 5\n// max matrix size for matrix vector product bench\n#define MAX_MV 3000\n// min matrix size for matrix matrix product bench\n#define MIN_MM 5\n// max matrix size for matrix matrix product bench\n#define MAX_MM MAX_MV\n// min matrix size for LU bench\n#define MIN_LU 5\n// max matrix size for LU bench\n#define MAX_LU 3000\n// max size for tiny vector and matrix\n#define TINY_MV_MAX_SIZE 16\n// default nb_sample for x86 timer\n#define DEFAULT_NB_SAMPLE 1000\n\n// how many times we run a single bench (keep the best perf)\n#define DEFAULT_NB_TRIES 3\n\n#endif\n"
  },
  {
    "path": "libs/eigen/bench/btl/generic_bench/btl.hh",
    "content": "//=====================================================\n// File   :  btl.hh\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#ifndef BTL_HH\n#define BTL_HH\n\n#include \"bench_parameter.hh\"\n#include <iostream>\n#include <algorithm>\n#include <vector>\n#include <string>\n#include \"utilities.h\"\n\n#if (defined __GNUC__)\n#define BTL_ALWAYS_INLINE __attribute__((always_inline)) inline\n#else\n#define BTL_ALWAYS_INLINE inline\n#endif\n\n#if (defined __GNUC__)\n#define BTL_DONT_INLINE __attribute__((noinline))\n#else\n#define BTL_DONT_INLINE\n#endif\n\n#if (defined __GNUC__)\n#define BTL_ASM_COMMENT(X)  asm(\"#\" X)\n#else\n#define BTL_ASM_COMMENT(X)\n#endif\n\n#ifdef __SSE__\n#include \"xmmintrin.h\"\n// This enables flush to zero (FTZ) and denormals are zero (DAZ) modes:\n#define BTL_DISABLE_SSE_EXCEPTIONS()  { _mm_setcsr(_mm_getcsr() | 0x8040); }\n#else\n#define BTL_DISABLE_SSE_EXCEPTIONS()\n#endif\n\n/** Enhanced std::string\n*/\nclass BtlString : public std::string\n{\npublic:\n    BtlString() : std::string() {}\n    BtlString(const BtlString& str) : std::string(static_cast<const std::string&>(str)) {}\n    BtlString(const std::string& str) : std::string(str) {}\n    BtlString(const char* str) : std::string(str) {}\n\n    operator const char* () const { return c_str(); }\n\n    void trim( bool left = true, bool right = true )\n    {\n        int lspaces, rspaces, len = length(), i;\n        lspaces = rspaces = 0;\n\n        if ( left )\n            for (i=0; i<len && (at(i)==' '||at(i)=='\\t'||at(i)=='\\r'||at(i)=='\\n'); ++lspaces,++i);\n\n        if ( right && lspaces < len )\n            for(i=len-1; i>=0 && (at(i)==' '||at(i)=='\\t'||at(i)=='\\r'||at(i)=='\\n'); rspaces++,i--);\n\n        *this = substr(lspaces, len-lspaces-rspaces);\n    }\n\n    std::vector<BtlString> split( const BtlString& delims = \"\\t\\n \") const\n    {\n        std::vector<BtlString> ret;\n        unsigned int numSplits = 0;\n        size_t start, pos;\n        start = 0;\n        do\n        {\n            pos = find_first_of(delims, start);\n            if (pos == start)\n            {\n                ret.push_back(\"\");\n                start = pos + 1;\n            }\n            else if (pos == npos)\n                ret.push_back( substr(start) );\n            else\n            {\n                ret.push_back( substr(start, pos - start) );\n                start = pos + 1;\n            }\n            //start = find_first_not_of(delims, start);\n            ++numSplits;\n        } while (pos != npos);\n        return ret;\n    }\n\n    bool endsWith(const BtlString& str) const\n    {\n        if(str.size()>this->size())\n            return false;\n        return this->substr(this->size()-str.size(),str.size()) == str;\n    }\n    bool contains(const BtlString& str) const\n    {\n        return this->find(str)<this->size();\n    }\n    bool beginsWith(const BtlString& str) const\n    {\n        if(str.size()>this->size())\n            return false;\n        return this->substr(0,str.size()) == str;\n    }\n\n    BtlString toLowerCase( void )\n    {\n        std::transform(begin(), end(), begin(), static_cast<int(*)(int)>(::tolower) );\n        return *this;\n    }\n    BtlString toUpperCase( void )\n    {\n        std::transform(begin(), end(), begin(), static_cast<int(*)(int)>(::toupper) );\n        return *this;\n    }\n\n    /** Case insensitive comparison.\n    */\n    bool isEquiv(const BtlString& str) const\n    {\n        BtlString str0 = *this;\n        str0.toLowerCase();\n        BtlString str1 = str;\n        str1.toLowerCase();\n        return str0 == str1;\n    }\n\n    /** Decompose the current string as a path and a file.\n        For instance: \"dir1/dir2/file.ext\" leads to path=\"dir1/dir2/\" and filename=\"file.ext\"\n    */\n    void decomposePathAndFile(BtlString& path, BtlString& filename) const\n    {\n        std::vector<BtlString> elements = this->split(\"/\\\\\");\n        path = \"\";\n        filename = elements.back();\n        elements.pop_back();\n        if (this->at(0)=='/')\n            path = \"/\";\n        for (unsigned int i=0 ; i<elements.size() ; ++i)\n            path += elements[i] + \"/\";\n    }\n};\n\nclass BtlConfig\n{\npublic:\n  BtlConfig()\n    : overwriteResults(false), checkResults(true), realclock(false), tries(DEFAULT_NB_TRIES)\n  {\n    char * _config;\n    _config = getenv (\"BTL_CONFIG\");\n    if (_config!=NULL)\n    {\n      std::vector<BtlString> config = BtlString(_config).split(\" \\t\\n\");\n      for (int i = 0; i<config.size(); i++)\n      {\n        if (config[i].beginsWith(\"-a\"))\n        {\n          if (i+1==config.size())\n          {\n            std::cerr << \"error processing option: \" << config[i] << \"\\n\";\n            exit(2);\n          }\n          Instance.m_selectedActionNames = config[i+1].split(\":\");\n\n          i += 1;\n        }\n        else if (config[i].beginsWith(\"-t\"))\n        {\n          if (i+1==config.size())\n          {\n            std::cerr << \"error processing option: \" << config[i] << \"\\n\";\n            exit(2);\n          }\n          Instance.tries = atoi(config[i+1].c_str());\n\n          i += 1;\n        }\n        else if (config[i].beginsWith(\"--overwrite\"))\n        {\n          Instance.overwriteResults = true;\n        }\n        else if (config[i].beginsWith(\"--nocheck\"))\n        {\n          Instance.checkResults = false;\n        }\n        else if (config[i].beginsWith(\"--real\"))\n        {\n          Instance.realclock = true;\n        }\n      }\n    }\n\n    BTL_DISABLE_SSE_EXCEPTIONS();\n  }\n\n  BTL_DONT_INLINE static bool skipAction(const std::string& _name)\n  {\n    if (Instance.m_selectedActionNames.empty())\n      return false;\n\n    BtlString name(_name);\n    for (int i=0; i<Instance.m_selectedActionNames.size(); ++i)\n      if (name.contains(Instance.m_selectedActionNames[i]))\n        return false;\n\n    return true;\n  }\n\n  static BtlConfig Instance;\n  bool overwriteResults;\n  bool checkResults;\n  bool realclock;\n  int tries;\n\nprotected:\n  std::vector<BtlString> m_selectedActionNames;\n};\n\n#define BTL_MAIN \\\n  BtlConfig BtlConfig::Instance\n\n#endif // BTL_HH\n"
  },
  {
    "path": "libs/eigen/bench/btl/generic_bench/init/init_function.hh",
    "content": "//=====================================================\n// File   :  init_function.hh\n// Author :  L. Plagne <laurent.plagne@edf.fr)>        \n// Copyright (C) EDF R&D,  lun sep 30 14:23:18 CEST 2002\n//=====================================================\n// \n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n// \n#ifndef INIT_FUNCTION_HH\n#define INIT_FUNCTION_HH\n\ndouble simple_function(int index)\n{\n  return index;\n}\n\ndouble simple_function(int index_i, int index_j)\n{\n  return index_i+index_j;\n}\n\ndouble pseudo_random(int index)\n{\n  return std::rand()/double(RAND_MAX);\n}\n\ndouble pseudo_random(int index_i, int index_j)\n{\n  return std::rand()/double(RAND_MAX);\n}\n\n\ndouble null_function(int index)\n{\n  return 0.0;\n}\n\ndouble null_function(int index_i, int index_j)\n{\n  return 0.0;\n}\n\n#endif\n"
  },
  {
    "path": "libs/eigen/bench/btl/generic_bench/init/init_matrix.hh",
    "content": "//=====================================================\n// File   :  init_matrix.hh\n// Author :  L. Plagne <laurent.plagne@edf.fr)>\n// Copyright (C) EDF R&D,  lun sep 30 14:23:19 CEST 2002\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#ifndef INIT_MATRIX_HH\n#define INIT_MATRIX_HH\n\n// The Vector class must satisfy the following part of STL vector concept :\n//            resize() method\n//            [] operator for setting element\n//            value_type defined\ntemplate<double init_function(int,int), class Vector>\nBTL_DONT_INLINE void init_row(Vector & X, int size, int row){\n\n  X.resize(size);\n\n  for (int j=0;j<X.size();j++){\n    X[j]=typename Vector::value_type(init_function(row,j));\n  }\n}\n\n\n// Matrix is a Vector of Vector\n// The Matrix class must satisfy the following part of STL vector concept :\n//            resize() method\n//            [] operator for setting rows\ntemplate<double init_function(int,int),class Vector>\nBTL_DONT_INLINE void init_matrix(Vector &  A, int size){\n  A.resize(size);\n  for (int row=0; row<A.size() ; row++){\n    init_row<init_function>(A[row],size,row);\n  }\n}\n\ntemplate<double init_function(int,int),class Matrix>\nBTL_DONT_INLINE void init_matrix_symm(Matrix&  A, int size){\n  A.resize(size);\n  for (int row=0; row<A.size() ; row++)\n    A[row].resize(size);\n  for (int row=0; row<A.size() ; row++){\n    A[row][row] = init_function(row,row);\n    for (int col=0; col<row ; col++){\n      double x = init_function(row,col);\n      A[row][col] = A[col][row] = x;\n    }\n  }\n}\n\n#endif\n"
  },
  {
    "path": "libs/eigen/bench/btl/generic_bench/init/init_vector.hh",
    "content": "//=====================================================\n// File   :  init_vector.hh\n// Author :  L. Plagne <laurent.plagne@edf.fr)>\n// Copyright (C) EDF R&D,  lun sep 30 14:23:18 CEST 2002\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#ifndef INIT_VECTOR_HH\n#define INIT_VECTOR_HH\n\n// The Vector class must satisfy the following part of STL vector concept :\n//            resize() method\n//            [] operator for setting element\n//            value_type defined\ntemplate<double init_function(int), class Vector>\nvoid init_vector(Vector & X, int size){\n\n  X.resize(size);\n\n  for (int i=0;i<X.size();i++){\n    X[i]=typename Vector::value_type(init_function(i));\n  }\n}\n\n#endif\n"
  },
  {
    "path": "libs/eigen/bench/btl/generic_bench/static/bench_static.hh",
    "content": "//=====================================================\n// File   :  bench_static.hh\n// Author :  L. Plagne <laurent.plagne@edf.fr)>\n// Copyright (C) EDF R&D,  lun sep 30 14:23:16 CEST 2002\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#ifndef BENCH_STATIC_HH\n#define BENCH_STATIC_HH\n\n#include \"btl.hh\"\n#include \"bench_parameter.hh\"\n#include <iostream>\n#include \"utilities.h\"\n#include \"xy_file.hh\"\n#include \"static/static_size_generator.hh\"\n#include \"timers/portable_perf_analyzer.hh\"\n// #include \"timers/mixed_perf_analyzer.hh\"\n// #include \"timers/x86_perf_analyzer.hh\"\n\nusing namespace std;\n\n\ntemplate <template<class> class Perf_Analyzer, template<class> class Action, template<class,int> class Interface>\nBTL_DONT_INLINE  void bench_static(void)\n{\n  if (BtlConfig::skipAction(Action<Interface<REAL_TYPE,10> >::name()))\n    return;\n\n  string filename = \"bench_\" + Action<Interface<REAL_TYPE,10> >::name() + \".dat\";\n\n  INFOS(\"starting \" << filename);\n\n  const int max_size = TINY_MV_MAX_SIZE;\n\n  std::vector<double> tab_mflops;\n  std::vector<double> tab_sizes;\n\n  static_size_generator<max_size,Perf_Analyzer,Action,Interface>::go(tab_sizes,tab_mflops);\n\n  dump_xy_file(tab_sizes,tab_mflops,filename);\n}\n\n// default Perf Analyzer\ntemplate <template<class> class Action, template<class,int> class Interface>\nBTL_DONT_INLINE  void bench_static(void)\n{\n  bench_static<Portable_Perf_Analyzer,Action,Interface>();\n  //bench_static<Mixed_Perf_Analyzer,Action,Interface>();\n  //bench_static<X86_Perf_Analyzer,Action,Interface>();\n}\n\n#endif\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/generic_bench/static/intel_bench_fixed_size.hh",
    "content": "//=====================================================\n// File   :  intel_bench_fixed_size.hh\n// Author :  L. Plagne <laurent.plagne@edf.fr)>        \n// Copyright (C) EDF R&D,  mar dc 3 18:59:37 CET 2002\n//=====================================================\n// \n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n// \n#ifndef _BENCH_FIXED_SIZE_HH_\n#define _BENCH_FIXED_SIZE_HH_\n\n#include \"utilities.h\"\n#include \"function_time.hh\"\n\ntemplate <class Action>\ndouble bench_fixed_size(int size, unsigned long long  & nb_calc,unsigned long long & nb_init)\n{\n  \n  Action action(size);\n  \n  double time_baseline=time_init(nb_init,action);\n\n  while (time_baseline < MIN_TIME) {\n\n    //INFOS(\"nb_init=\"<<nb_init);\n    //INFOS(\"time_baseline=\"<<time_baseline);\n    nb_init*=2;\n    time_baseline=time_init(nb_init,action);\n  }\n  \n  time_baseline=time_baseline/(double(nb_init));\n  \n  double time_action=time_calculate(nb_calc,action);\n  \n  while (time_action < MIN_TIME) {\n    \n    nb_calc*=2;\n    time_action=time_calculate(nb_calc,action);\n  }\n\n  INFOS(\"nb_init=\"<<nb_init);\n  INFOS(\"nb_calc=\"<<nb_calc);\n  \n  \n  time_action=time_action/(double(nb_calc));\n  \n  action.check_result();\n  \n  time_action=time_action-time_baseline;\n\n  return action.nb_op_base()/(time_action*1000000.0);\n\n}\n\n#endif\n"
  },
  {
    "path": "libs/eigen/bench/btl/generic_bench/static/static_size_generator.hh",
    "content": "//=====================================================\n// File   :  static_size_generator.hh\n// Author :  L. Plagne <laurent.plagne@edf.fr)>        \n// Copyright (C) EDF R&D,  mar dc 3 18:59:36 CET 2002\n//=====================================================\n// \n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n// \n#ifndef _STATIC_SIZE_GENERATOR_HH\n#define _STATIC_SIZE_GENERATOR_HH\n#include <vector>\n\nusing namespace std;\n\n//recursive generation of statically defined matrix and vector sizes\n\ntemplate <int SIZE,template<class> class Perf_Analyzer, template<class> class Action, template<class,int> class Interface> \nstruct static_size_generator{\n  static void go(vector<double> & tab_sizes, vector<double> & tab_mflops)\n  {\n    tab_sizes.push_back(SIZE);\n    std::cout << tab_sizes.back() << \" \\t\" << std::flush;\n    Perf_Analyzer<Action<Interface<REAL_TYPE,SIZE> > > perf_action;\n    tab_mflops.push_back(perf_action.eval_mflops(SIZE));\n    std::cout << tab_mflops.back() << \" MFlops\" << std::endl;\n    static_size_generator<SIZE-1,Perf_Analyzer,Action,Interface>::go(tab_sizes,tab_mflops);\n  };\n};\n\n//recursion end\n\ntemplate <template<class> class Perf_Analyzer, template<class> class Action, template<class,int> class Interface> \nstruct static_size_generator<1,Perf_Analyzer,Action,Interface>{  \n  static  void go(vector<double> & tab_sizes, vector<double> & tab_mflops)\n  {\n    tab_sizes.push_back(1);\n    Perf_Analyzer<Action<Interface<REAL_TYPE,1> > > perf_action;\n    tab_mflops.push_back(perf_action.eval_mflops(1));\n  };\n};\n\n#endif\n  \n  \n  \n  \n"
  },
  {
    "path": "libs/eigen/bench/btl/generic_bench/timers/STL_perf_analyzer.hh",
    "content": "//=====================================================\n// File   :  STL_perf_analyzer.hh\n// Author :  L. Plagne <laurent.plagne@edf.fr)>        \n// Copyright (C) EDF R&D,  mar dc 3 18:59:35 CET 2002\n//=====================================================\n// \n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n// \n#ifndef _STL_PERF_ANALYSER_HH\n#define _STL_PERF_ANALYSER_HH\n\n#include \"STL_timer.hh\"\n#include \"bench_parameter.hh\"\n\ntemplate<class ACTION>\nclass STL_Perf_Analyzer{\npublic:  \n  STL_Perf_Analyzer(unsigned long long nb_sample=DEFAULT_NB_SAMPLE):_nb_sample(nb_sample),_chronos()\n  {\n    MESSAGE(\"STL_Perf_Analyzer Ctor\");\n  }; \n  STL_Perf_Analyzer( const STL_Perf_Analyzer & ){\n    INFOS(\"Copy Ctor not implemented\");\n    exit(0);\n  };\n  ~STL_Perf_Analyzer( void ){\n    MESSAGE(\"STL_Perf_Analyzer Dtor\");\n  };\n  \n  \n  inline double eval_mflops(int size)\n  {\n\n    ACTION action(size);\n\n    _chronos.start_baseline(_nb_sample);\n      \n    do {\n\n      action.initialize();\n    } while (_chronos.check());\n\n    double baseline_time=_chronos.get_time();\n\n    _chronos.start(_nb_sample);\n    do {\n      action.initialize();\n      action.calculate();\n    } while (_chronos.check());\n\n    double calculate_time=_chronos.get_time();\n\n    double corrected_time=calculate_time-baseline_time;\n    \n    //    cout << size <<\" \"<<baseline_time<<\" \"<<calculate_time<<\" \"<<corrected_time<<\" \"<<action.nb_op_base() << endl;    \n    \n    return action.nb_op_base()/(corrected_time*1000000.0);\n    //return action.nb_op_base()/(calculate_time*1000000.0);\n    \n  }\nprivate:\n\n  STL_Timer _chronos;\n  unsigned long long _nb_sample;\n\n  \n};\n\n  \n  \n#endif\n"
  },
  {
    "path": "libs/eigen/bench/btl/generic_bench/timers/STL_timer.hh",
    "content": "//=====================================================\n// File   :  STL_Timer.hh\n// Author :  L. Plagne <laurent.plagne@edf.fr)>        \n// Copyright (C) EDF R&D,  mar dc 3 18:59:35 CET 2002\n//=====================================================\n// \n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n// \n// STL Timer Class. Adapted (L.P.) from the timer class by Musser et Al\n// described int the Book : STL Tutorial and reference guide.\n// Define a timer class for analyzing algorithm performance.\n#include <iostream>\n#include <iomanip>\n#include <vector>\n#include <map>\n#include <algorithm>\nusing namespace std;\n\nclass STL_Timer {\npublic:\n  STL_Timer(){ baseline = false; };  // Default constructor\n  // Start a series of r trials:\n  void start(unsigned int r){\n    reps = r;\n    count = 0;\n    iterations.clear();\n    iterations.reserve(reps);\n    initial = time(0);\n  };\n  // Start a series of r trials to determine baseline time:\n  void start_baseline(unsigned int r)\n  {\n    baseline = true;\n    start(r);\n  }\n  // Returns true if the trials have been completed, else false\n  bool check()\n  {\n    ++count;\n    final = time(0);\n    if (initial < final) {\n      iterations.push_back(count);  \n      initial = final;\n      count = 0;\n    }\n    return (iterations.size() < reps);\n  };\n  // Returns the results for external use\n  double get_time( void )\n  {\n    sort(iterations.begin(), iterations.end());\n    return 1.0/iterations[reps/2];\n  };\nprivate:\n  unsigned int reps;  // Number of trials\n  // For storing loop iterations of a trial\n  vector<long> iterations;\n  // For saving initial and final times of a trial\n  time_t initial, final;\n  // For counting loop iterations of a trial\n  unsigned long count;\n  // true if this is a baseline computation, false otherwise\n  bool baseline;\n  // For recording the baseline time \n  double baseline_time;\n};\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/generic_bench/timers/mixed_perf_analyzer.hh",
    "content": "//=====================================================\n// File   :  mixed_perf_analyzer.hh\n// Author :  L. Plagne <laurent.plagne@edf.fr)>        \n// Copyright (C) EDF R&D,  mar dc 3 18:59:36 CET 2002\n//=====================================================\n// \n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n// \n#ifndef _MIXED_PERF_ANALYSER_HH\n#define _MIXED_PERF_ANALYSER_HH\n\n#include \"x86_perf_analyzer.hh\"\n#include \"portable_perf_analyzer.hh\"\n\n// choose portable perf analyzer for long calculations and x86 analyser for short ones\n\n\ntemplate<class Action>\nclass Mixed_Perf_Analyzer{\n  \npublic:  \n  Mixed_Perf_Analyzer( void ):_x86pa(),_ppa(),_use_ppa(true)\n  {\n    MESSAGE(\"Mixed_Perf_Analyzer Ctor\");\n  }; \n  Mixed_Perf_Analyzer( const Mixed_Perf_Analyzer & ){\n    INFOS(\"Copy Ctor not implemented\");\n    exit(0);\n  };\n  ~Mixed_Perf_Analyzer( void ){\n    MESSAGE(\"Mixed_Perf_Analyzer Dtor\");\n  };\n    \n  \n  inline double eval_mflops(int size)\n  {\n\n    double result=0.0;\n    if (_use_ppa){      \n      result=_ppa.eval_mflops(size);\n      if (_ppa.get_nb_calc()>DEFAULT_NB_SAMPLE){_use_ppa=false;}      \n    }\n    else{      \n      result=_x86pa.eval_mflops(size);\n    }\n\n    return result;\n  }\n\nprivate:\n\n  Portable_Perf_Analyzer<Action> _ppa;\n  X86_Perf_Analyzer<Action> _x86pa;\n  bool _use_ppa;\n\n};\n\n#endif\n\n  \n    \n  \n"
  },
  {
    "path": "libs/eigen/bench/btl/generic_bench/timers/portable_perf_analyzer.hh",
    "content": "//=====================================================\n// File   :  portable_perf_analyzer.hh\n// Author :  L. Plagne <laurent.plagne@edf.fr)>\n// Copyright (C) EDF R&D,  mar d�c 3 18:59:35 CET 2002\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#ifndef _PORTABLE_PERF_ANALYZER_HH\n#define _PORTABLE_PERF_ANALYZER_HH\n\n#include \"utilities.h\"\n#include \"timers/portable_timer.hh\"\n\ntemplate <class Action>\nclass Portable_Perf_Analyzer{\npublic:\n  Portable_Perf_Analyzer( ):_nb_calc(0), m_time_action(0), _chronos(){\n    MESSAGE(\"Portable_Perf_Analyzer Ctor\");\n  };\n  Portable_Perf_Analyzer( const Portable_Perf_Analyzer & ){\n    INFOS(\"Copy Ctor not implemented\");\n    exit(0);\n  };\n  ~Portable_Perf_Analyzer(){\n    MESSAGE(\"Portable_Perf_Analyzer Dtor\");\n  };\n\n  BTL_DONT_INLINE double eval_mflops(int size)\n  {\n    Action action(size);\n\n//     action.initialize();\n//     time_action = time_calculate(action);\n    while (m_time_action < MIN_TIME)\n    {\n      if(_nb_calc==0) _nb_calc = 1;\n      else            _nb_calc *= 2;\n      action.initialize();\n      m_time_action = time_calculate(action);\n    }\n\n    // optimize\n    for (int i=1; i<BtlConfig::Instance.tries; ++i)\n    {\n      Action _action(size);\n      std::cout << \" \" << _action.nb_op_base()*_nb_calc/(m_time_action*1e6) << \" \";\n      _action.initialize();\n      m_time_action = std::min(m_time_action, time_calculate(_action));\n    }\n\n    double time_action = m_time_action / (double(_nb_calc));\n\n    // check\n    if (BtlConfig::Instance.checkResults && size<128)\n    {\n      action.initialize();\n      action.calculate();\n      action.check_result();\n    }\n    return action.nb_op_base()/(time_action*1e6);\n  }\n\n  BTL_DONT_INLINE double time_calculate(Action & action)\n  {\n    // time measurement\n    action.calculate();\n    _chronos.start();\n    for (int ii=0;ii<_nb_calc;ii++)\n    {\n      action.calculate();\n    }\n    _chronos.stop();\n    return _chronos.user_time();\n  }\n\n  unsigned long long get_nb_calc()\n  {\n    return _nb_calc;\n  }\n\n\nprivate:\n  unsigned long long _nb_calc;\n  double m_time_action;\n  Portable_Timer _chronos;\n\n};\n\n#endif //_PORTABLE_PERF_ANALYZER_HH\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/generic_bench/timers/portable_perf_analyzer_old.hh",
    "content": "//=====================================================\n// File   :  portable_perf_analyzer.hh\n// Author :  L. Plagne <laurent.plagne@edf.fr)>\n// Copyright (C) EDF R&D,  mar d�c 3 18:59:35 CET 2002\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#ifndef _PORTABLE_PERF_ANALYZER_HH\n#define _PORTABLE_PERF_ANALYZER_HH\n\n#include \"utilities.h\"\n#include \"timers/portable_timer.hh\"\n\ntemplate <class Action>\nclass Portable_Perf_Analyzer{\npublic:\n  Portable_Perf_Analyzer( void ):_nb_calc(1),_nb_init(1),_chronos(){\n    MESSAGE(\"Portable_Perf_Analyzer Ctor\");\n  };\n  Portable_Perf_Analyzer( const Portable_Perf_Analyzer & ){\n    INFOS(\"Copy Ctor not implemented\");\n    exit(0);\n  };\n  ~Portable_Perf_Analyzer( void ){\n    MESSAGE(\"Portable_Perf_Analyzer Dtor\");\n  };\n\n\n\n  inline double eval_mflops(int size)\n  {\n\n    Action action(size);\n\n//     double time_baseline = time_init(action);\n//     while (time_baseline < MIN_TIME_INIT)\n//     {\n//       _nb_init *= 2;\n//       time_baseline = time_init(action);\n//     }\n//\n//     // optimize\n//     for (int i=1; i<NB_TRIES; ++i)\n//       time_baseline = std::min(time_baseline, time_init(action));\n//\n//     time_baseline = time_baseline/(double(_nb_init));\n\n    double time_action = time_calculate(action);\n    while (time_action < MIN_TIME)\n    {\n      _nb_calc *= 2;\n      time_action = time_calculate(action);\n    }\n\n    // optimize\n    for (int i=1; i<NB_TRIES; ++i)\n      time_action = std::min(time_action, time_calculate(action));\n\n//     INFOS(\"size=\"<<size);\n//     INFOS(\"_nb_init=\"<<_nb_init);\n//     INFOS(\"_nb_calc=\"<<_nb_calc);\n\n    time_action = time_action / (double(_nb_calc));\n\n    action.check_result();\n\n\n    double time_baseline = time_init(action);\n    for (int i=1; i<NB_TRIES; ++i)\n      time_baseline = std::min(time_baseline, time_init(action));\n    time_baseline = time_baseline/(double(_nb_init));\n\n\n\n//     INFOS(\"time_baseline=\"<<time_baseline);\n//     INFOS(\"time_action=\"<<time_action);\n\n    time_action = time_action - time_baseline;\n\n//     INFOS(\"time_corrected=\"<<time_action);\n\n    return action.nb_op_base()/(time_action*1000000.0);\n  }\n\n  inline double time_init(Action & action)\n  {\n    // time measurement\n    _chronos.start();\n    for (int ii=0; ii<_nb_init; ii++)\n      action.initialize();\n    _chronos.stop();\n    return _chronos.user_time();\n  }\n\n\n  inline double time_calculate(Action & action)\n  {\n    // time measurement\n    _chronos.start();\n    for (int ii=0;ii<_nb_calc;ii++)\n    {\n      action.initialize();\n      action.calculate();\n    }\n    _chronos.stop();\n    return _chronos.user_time();\n  }\n\n  unsigned long long get_nb_calc( void )\n  {\n    return _nb_calc;\n  }\n\n\nprivate:\n  unsigned long long _nb_calc;\n  unsigned long long _nb_init;\n  Portable_Timer _chronos;\n\n};\n\n#endif //_PORTABLE_PERF_ANALYZER_HH\n"
  },
  {
    "path": "libs/eigen/bench/btl/generic_bench/timers/portable_timer.hh",
    "content": "//=====================================================\n// File   :  portable_timer.hh\n// Author :  L. Plagne <laurent.plagne@edf.fr)> from boost lib\n// Copyright (C) EDF R&D,  lun sep 30 14:23:17 CEST 2002\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n//  simple_time extracted from the boost library\n//\n#ifndef _PORTABLE_TIMER_HH\n#define _PORTABLE_TIMER_HH\n\n#include <ctime>\n#include <cstdlib>\n\n#include <time.h>\n\n\n#define USEC_IN_SEC 1000000\n\n\n//  timer  -------------------------------------------------------------------//\n\n//  A timer object measures CPU time.\n#ifdef _MSC_VER\n\n#define NOMINMAX\n#include <windows.h>\n\n/*#ifndef hr_timer\n#include \"hr_time.h\"\n#define hr_timer\n#endif*/\n\n class Portable_Timer\n {\n  public:\n\n   typedef struct {\n    LARGE_INTEGER start;\n    LARGE_INTEGER stop;\n   } stopWatch;\n\n\n   Portable_Timer()\n   {\n\t startVal.QuadPart = 0;\n\t stopVal.QuadPart = 0;\n\t QueryPerformanceFrequency(&frequency);\n   }\n\n   void start() { QueryPerformanceCounter(&startVal); }\n\n   void stop() { QueryPerformanceCounter(&stopVal); }\n\n   double elapsed() {\n\t LARGE_INTEGER time;\n     time.QuadPart = stopVal.QuadPart - startVal.QuadPart;\n     return LIToSecs(time);\n   }\n\n   double user_time() { return elapsed(); }\n\n\n private:\n\n   double LIToSecs(LARGE_INTEGER& L) {\n     return ((double)L.QuadPart /(double)frequency.QuadPart) ;\n   }\n\n   LARGE_INTEGER startVal;\n   LARGE_INTEGER stopVal;\n   LARGE_INTEGER frequency;\n\n\n }; // Portable_Timer\n\n#else\n\n#include <sys/time.h>\n#include <sys/resource.h>\n#include <unistd.h>\n#include <sys/times.h>\n\nclass Portable_Timer\n{\n public:\n\n  Portable_Timer()\n  {\n    m_clkid = BtlConfig::Instance.realclock ? CLOCK_REALTIME : CLOCK_PROCESS_CPUTIME_ID;\n  }\n\n  Portable_Timer(int clkid) : m_clkid(clkid)\n  {}\n\n  void start()\n  {\n    timespec ts;\n    clock_gettime(m_clkid, &ts);\n    m_start_time = double(ts.tv_sec) + 1e-9 * double(ts.tv_nsec);\n\n  }\n\n  void stop()\n  {\n    timespec ts;\n    clock_gettime(m_clkid, &ts);\n    m_stop_time = double(ts.tv_sec) + 1e-9 * double(ts.tv_nsec);\n\n  }\n\n  double elapsed()\n  {\n    return  user_time();\n  }\n\n  double user_time()\n  {\n    return m_stop_time - m_start_time;\n  }\n\n\nprivate:\n\n  int m_clkid;\n  double m_stop_time, m_start_time;\n\n}; // Portable_Timer\n\n#endif\n\n#endif  // PORTABLE_TIMER_HPP\n"
  },
  {
    "path": "libs/eigen/bench/btl/generic_bench/timers/x86_perf_analyzer.hh",
    "content": "//=====================================================\n// File   :  x86_perf_analyzer.hh\n// Author :  L. Plagne <laurent.plagne@edf.fr)>\n// Copyright (C) EDF R&D,  mar d�c 3 18:59:35 CET 2002\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#ifndef _X86_PERF_ANALYSER_HH\n#define _X86_PERF_ANALYSER_HH\n\n#include \"x86_timer.hh\"\n#include \"bench_parameter.hh\"\n\ntemplate<class ACTION>\nclass X86_Perf_Analyzer{\npublic:\n  X86_Perf_Analyzer( unsigned long long nb_sample=DEFAULT_NB_SAMPLE):_nb_sample(nb_sample),_chronos()\n  {\n    MESSAGE(\"X86_Perf_Analyzer Ctor\");\n    _chronos.find_frequency();\n  };\n  X86_Perf_Analyzer( const X86_Perf_Analyzer & ){\n    INFOS(\"Copy Ctor not implemented\");\n    exit(0);\n  };\n  ~X86_Perf_Analyzer( void ){\n    MESSAGE(\"X86_Perf_Analyzer Dtor\");\n  };\n\n\n  inline double eval_mflops(int size)\n  {\n\n    ACTION action(size);\n\n    int nb_loop=5;\n    double calculate_time=0.0;\n    double baseline_time=0.0;\n\n    for (int j=0 ; j < nb_loop ; j++){\n\n      _chronos.clear();\n\n      for(int i=0 ; i < _nb_sample  ; i++)\n      {\n        _chronos.start();\n        action.initialize();\n        action.calculate();\n        _chronos.stop();\n        _chronos.add_get_click();\n      }\n\n      calculate_time += double(_chronos.get_shortest_clicks())/_chronos.frequency();\n\n      if (j==0) action.check_result();\n\n      _chronos.clear();\n\n      for(int i=0 ; i < _nb_sample  ; i++)\n      {\n        _chronos.start();\n        action.initialize();\n        _chronos.stop();\n        _chronos.add_get_click();\n\n      }\n\n      baseline_time+=double(_chronos.get_shortest_clicks())/_chronos.frequency();\n\n    }\n\n    double corrected_time = (calculate_time-baseline_time)/double(nb_loop);\n\n\n//     INFOS(\"_nb_sample=\"<<_nb_sample);\n//     INFOS(\"baseline_time=\"<<baseline_time);\n//     INFOS(\"calculate_time=\"<<calculate_time);\n//     INFOS(\"corrected_time=\"<<corrected_time);\n\n//    cout << size <<\" \"<<baseline_time<<\" \"<<calculate_time<<\" \"<<corrected_time<<\" \"<<action.nb_op_base() << endl;\n\n    return action.nb_op_base()/(corrected_time*1000000.0);\n    //return action.nb_op_base()/(calculate_time*1000000.0);\n  }\n\nprivate:\n\n  X86_Timer _chronos;\n  unsigned long long _nb_sample;\n\n\n};\n\n\n\n#endif\n"
  },
  {
    "path": "libs/eigen/bench/btl/generic_bench/timers/x86_timer.hh",
    "content": "//=====================================================\n// File   :  x86_timer.hh\n// Author :  L. Plagne <laurent.plagne@edf.fr)>        \n// Copyright (C) EDF R&D,  mar d�c 3 18:59:35 CET 2002\n//=====================================================\n// \n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n// \n#ifndef _X86_TIMER_HH\n#define _X86_TIMER_HH\n\n#include <sys/time.h>\n#include <sys/resource.h>\n#include <unistd.h>\n#include <sys/times.h>\n//#include \"system_time.h\"\n#define u32 unsigned int\n#include <asm/msr.h>\n#include \"utilities.h\"\n#include <map>\n#include <fstream>\n#include <string>\n#include <iostream>\n\n// frequence de la becanne en Hz\n//#define FREQUENCY 648000000\n//#define FREQUENCY 1400000000\n#define FREQUENCY 1695000000\n\nusing namespace std;\n\n\nclass X86_Timer {\n\npublic :\n\n  X86_Timer( void ):_frequency(FREQUENCY),_nb_sample(0)\n  {\n    MESSAGE(\"X86_Timer Default Ctor\");    \n  }\n\n  inline void start( void ){\n\n    rdtsc(_click_start.n32[0],_click_start.n32[1]);\n\n  }\n\n\n  inline void stop( void ){\n\n    rdtsc(_click_stop.n32[0],_click_stop.n32[1]);\n\n  }\n  \n\n  inline double frequency( void ){\n    return _frequency;\n  }\n\n  double get_elapsed_time_in_second( void ){\n\n    return (_click_stop.n64-_click_start.n64)/double(FREQUENCY);\n\n\n  }    \n\n  unsigned long long  get_click( void ){\n    \n    return (_click_stop.n64-_click_start.n64);\n\n  }    \n\n  inline void find_frequency( void ){\n\n    time_t initial, final;\n    int dummy=2;\n\n    initial = time(0);\n    start();\n    do {\n      dummy+=2;\n    }\n    while(time(0)==initial);\n    // On est au debut d'un cycle d'une seconde !!!\n    initial = time(0);\n    start();\n    do {\n      dummy+=2;\n    }\n    while(time(0)==initial);\n    final=time(0);\n    stop();\n    //    INFOS(\"fine grained time : \"<<  get_elapsed_time_in_second());\n    //  INFOS(\"coarse grained time : \"<<  final-initial);\n    _frequency=_frequency*get_elapsed_time_in_second()/double(final-initial);\n    ///  INFOS(\"CPU frequency : \"<<  _frequency);        \n\n  }\n\n  void  add_get_click( void ){\n       \n    _nb_sample++;\n    _counted_clicks[get_click()]++;\n    fill_history_clicks();\n\n  }    \n\n  void dump_statistics(string filemane){\n    \n    ofstream outfile (filemane.c_str(),ios::out) ;\n\n    std::map<unsigned long long , unsigned long long>::iterator itr;\n    for(itr=_counted_clicks.begin() ; itr!=_counted_clicks.end()  ; itr++)\n      {      \n      outfile  << (*itr).first << \"  \" << (*itr).second << endl ;       \n      }      \n    \n    outfile.close();\n\n  }\n\n  void dump_history(string filemane){\n    \n    ofstream outfile (filemane.c_str(),ios::out) ;\n\n\n\n    for(int i=0 ; i<_history_mean_clicks.size() ; i++)\n      {      \n\toutfile  << i << \" \" \n\t\t << _history_mean_clicks[i] << \" \" \n\t\t << _history_shortest_clicks[i] << \" \" \n\t\t << _history_most_occured_clicks[i] << endl ;\n      }      \n    \n    outfile.close();\n\n  }\n     \n\n\n  double get_mean_clicks( void ){\n    \n    std::map<unsigned long long,unsigned long long>::iterator itr;\n    \n    unsigned long long mean_clicks=0;\n\n    for(itr=_counted_clicks.begin() ; itr!=_counted_clicks.end()  ; itr++)\n      {      \n\t\n\tmean_clicks+=(*itr).second*(*itr).first;\n      }      \n\n    return mean_clicks/double(_nb_sample);\n\n  }\n\n  double get_shortest_clicks( void ){\n    \n    return double((*_counted_clicks.begin()).first);\n\n  }\n\n  void fill_history_clicks( void ){\n\n    _history_mean_clicks.push_back(get_mean_clicks());\n    _history_shortest_clicks.push_back(get_shortest_clicks());\n    _history_most_occured_clicks.push_back(get_most_occured_clicks());\n\n  }\n\n\n  double get_most_occured_clicks( void ){\n\n    unsigned long long moc=0;\n    unsigned long long max_occurence=0;\n\n    std::map<unsigned long long,unsigned long long>::iterator itr;\n\n    for(itr=_counted_clicks.begin() ; itr!=_counted_clicks.end()  ; itr++)\n      {      \n\t\n\tif (max_occurence<=(*itr).second){\n\t  max_occurence=(*itr).second;\n\t  moc=(*itr).first;\n\t}\n      }      \n    \n    return double(moc);    \n\n  }\n  \n  void clear( void )\n  {\n    _counted_clicks.clear();\n\n    _history_mean_clicks.clear();\n    _history_shortest_clicks.clear();\n    _history_most_occured_clicks.clear();\n\n    _nb_sample=0;\n  }\n\n\n    \nprivate :\n  \n  union\n  {\n    unsigned long int n32[2] ;\n    unsigned long long n64 ;\n  } _click_start;\n\n  union\n  {\n    unsigned long int n32[2] ;\n    unsigned long long n64 ;\n  } _click_stop;\n\n  double _frequency ;\n\n  map<unsigned long long,unsigned long long> _counted_clicks;\n\n  vector<double> _history_mean_clicks;\n  vector<double> _history_shortest_clicks;\n  vector<double> _history_most_occured_clicks;\n\n  unsigned long long _nb_sample;\n\n  \n\n};\n\n\n#endif\n"
  },
  {
    "path": "libs/eigen/bench/btl/generic_bench/utils/size_lin_log.hh",
    "content": "//=====================================================\n// File   :  size_lin_log.hh\n// Author :  L. Plagne <laurent.plagne@edf.fr)>        \n// Copyright (C) EDF R&D,  mar dc 3 18:59:37 CET 2002\n//=====================================================\n// \n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n// \n#ifndef SIZE_LIN_LOG\n#define SIZE_LIN_LOG\n\n#include \"size_log.hh\"\n\ntemplate<class Vector>\nvoid size_lin_log(const int nb_point, const int size_min, const int size_max, Vector & X)\n{\n  int ten=10;\n  int nine=9;\n\n  X.resize(nb_point);\n\n  if (nb_point>ten){\n\n    for (int i=0;i<nine;i++){\n      \n      X[i]=i+1;\n\n    }\n\n    Vector log_size;\n    size_log(nb_point-nine,ten,size_max,log_size);\n\n    for (int i=0;i<nb_point-nine;i++){\n      \n      X[i+nine]=log_size[i];\n\n    }\n  }\n  else{\n\n    for (int i=0;i<nb_point;i++){\n      \n      X[i]=i+1;\n\n    }\n  }\n\n //  for (int i=0;i<nb_point;i++){\n    \n//        INFOS(\"computed sizes : X[\"<<i<<\"]=\"<<X[i]);\n    \n//   }\n\n}\n  \n#endif\n    \n\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/generic_bench/utils/size_log.hh",
    "content": "//=====================================================\n// File   :  size_log.hh\n// Author :  L. Plagne <laurent.plagne@edf.fr)>        \n// Copyright (C) EDF R&D,  lun sep 30 14:23:17 CEST 2002\n//=====================================================\n// \n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n// \n#ifndef SIZE_LOG\n#define SIZE_LOG\n\n#include \"math.h\"\n// The Vector class must satisfy the following part of STL vector concept :\n//            resize() method\n//            [] operator for seting element\n// the vector element are int compatible.\ntemplate<class Vector>\nvoid size_log(const int nb_point, const int size_min, const int size_max, Vector & X)\n{\n  X.resize(nb_point);\n\n  float ls_min=log(float(size_min));\n  float ls_max=log(float(size_max));\n\n  float ls=0.0;\n\n  float delta_ls=(ls_max-ls_min)/(float(nb_point-1));\n\n  int size=0;\n\n  for (int i=0;i<nb_point;i++){\n\n    ls = ls_min + float(i)*delta_ls ;\n    \n    size=int(exp(ls)); \n\n    X[i]=size;\n  }\n\n}\n\n\n#endif\n"
  },
  {
    "path": "libs/eigen/bench/btl/generic_bench/utils/utilities.h",
    "content": "//=============================================================================\n// File      : utilities.h\n// Created   : mar jun 19 13:18:14 CEST 2001\n// Author    : Antoine YESSAYAN, Paul RASCLE, EDF\n// Project   : SALOME\n// Copyright : EDF 2001\n// $Header$\n//=============================================================================\n\n/* ---  Definition macros file to print information if _DEBUG_ is defined --- */\n\n# ifndef UTILITIES_H\n# define UTILITIES_H\n\n# include <stdlib.h>\n//# include <iostream> ok for gcc3.01\n# include <iostream>\n\n/* ---  INFOS is always defined (without _DEBUG_): to be used for warnings, with release version --- */\n\n# define HEREWEARE cout<<flush ; cerr << __FILE__ << \" [\" << __LINE__ << \"] : \" << flush ;\n# define INFOS(chain) {HEREWEARE ; cerr << chain << endl ;}\n# define PYSCRIPT(chain) {cout<<flush ; cerr << \"---PYSCRIPT--- \" << chain << endl ;}\n\n/* --- To print date and time of compilation of current source on stdout --- */\n\n# if defined ( __GNUC__ )\n# define COMPILER\t\t\"g++\" ;\n# elif defined ( __sun )\n# define COMPILER\t\t\"CC\" ;\n# elif defined ( __KCC )\n# define COMPILER\t\t\"KCC\" ;\n# elif defined ( __PGI )\n# define COMPILER\t\t\"pgCC\" ;\n# else\n# define COMPILER\t\t\"undefined\" ;\n# endif\n\n# ifdef INFOS_COMPILATION\n# error INFOS_COMPILATION already defined\n# endif\n# define INFOS_COMPILATION\t{\\\n\t\t\t\t\tcerr << flush;\\\n\t\t\t\t\tcout << __FILE__ ;\\\n\t\t\t\t\tcout << \" [\" << __LINE__ << \"] : \" ;\\\n\t\t\t\t\tcout << \"COMPILED with \" << COMPILER ;\\\n\t\t\t\t\tcout << \", \" << __DATE__ ; \\\n\t\t\t\t\tcout << \" at \" << __TIME__ << endl ;\\\n\t\t\t\t\tcout << \"\\n\\n\" ;\\\n\t\t\t\t\tcout << flush ;\\\n\t\t\t\t}\n\n# ifdef _DEBUG_\n\n/* --- the following MACROS are useful at debug time --- */\n\n# define HERE cout<<flush ; cerr << \"- Trace \" << __FILE__ << \" [\" << __LINE__ << \"] : \" << flush ;\n# define SCRUTE(var) HERE ; cerr << #var << \"=\" << var << endl ;\n# define MESSAGE(chain) {HERE ; cerr << chain << endl ;}\n# define INTERRUPTION(code) HERE ; cerr << \"INTERRUPTION return code= \" << code << endl ; exit(code) ;\n\n# ifndef ASSERT\n# define ASSERT(condition) if (!(condition)){ HERE ; cerr << \"CONDITION \" << #condition << \" NOT VERIFIED\"<< endl ; INTERRUPTION(1) ;}\n# endif /* ASSERT */\n\n#define REPERE cout<<flush ; cerr << \"   --------------\" << endl << flush ;\n#define BEGIN_OF(chain) {REPERE ; HERE ; cerr << \"Begin of: \" << chain << endl ; REPERE ; }\n#define END_OF(chain) {REPERE ; HERE ; cerr << \"Normal end of: \" << chain << endl ; REPERE ; }\n\n\n\n# else /* ifdef _DEBUG_*/\n\n# define HERE\n# define SCRUTE(var)\n# define MESSAGE(chain)\n# define INTERRUPTION(code)\n\n# ifndef ASSERT\n# define ASSERT(condition)\n# endif /* ASSERT */\n\n#define REPERE\n#define BEGIN_OF(chain)\n#define END_OF(chain)\n\n\n# endif /* ifdef _DEBUG_*/\n\n# endif /* ifndef UTILITIES_H */\n"
  },
  {
    "path": "libs/eigen/bench/btl/generic_bench/utils/xy_file.hh",
    "content": "//=====================================================\n// File   :  dump_file_x_y.hh\n// Author :  L. Plagne <laurent.plagne@edf.fr)>        \n// Copyright (C) EDF R&D,  lun sep 30 14:23:20 CEST 2002\n//=====================================================\n// \n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n// \n#ifndef XY_FILE_HH\n#define XY_FILE_HH\n#include <fstream>\n#include <iostream>\n#include <string>\n#include <vector>\nusing namespace std;\n\nbool read_xy_file(const std::string & filename, std::vector<int> & tab_sizes,\n                  std::vector<double> & tab_mflops, bool quiet = false)\n{\n\n  std::ifstream input_file (filename.c_str(),std::ios::in);\n\n  if (!input_file){\n    if (!quiet) {\n      INFOS(\"!!! Error opening \"<<filename);\n    }\n    return false;\n  }\n\n  int nb_point=0;\n  int size=0;\n  double mflops=0;\n\n  while (input_file >> size >> mflops ){\n    nb_point++;\n    tab_sizes.push_back(size);\n    tab_mflops.push_back(mflops);\n  }\n  SCRUTE(nb_point);\n\n  input_file.close();\n  return true;\n}\n\n// The Vector class must satisfy the following part of STL vector concept :\n//            resize() method\n//            [] operator for seting element\n// the vector element must have the << operator define\n\nusing namespace std;\n\ntemplate<class Vector_A, class Vector_B>\nvoid dump_xy_file(const Vector_A & X, const Vector_B & Y, const std::string & filename){\n  \n  ofstream outfile (filename.c_str(),ios::out) ;\n  int size=X.size();\n  \n  for (int i=0;i<size;i++)\n    outfile << X[i] << \" \" << Y[i] << endl;\n\n  outfile.close();\n} \n\n#endif\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/BLAS/CMakeLists.txt",
    "content": "\nfind_package(ATLAS)\nif (ATLAS_FOUND)\n  btl_add_bench(btl_atlas main.cpp)\n  if(BUILD_btl_atlas)\n    target_link_libraries(btl_atlas ${ATLAS_LIBRARIES})\n    set_target_properties(btl_atlas PROPERTIES COMPILE_FLAGS \"-DCBLASNAME=ATLAS -DHAS_LAPACK=1\")\n  endif(BUILD_btl_atlas)\nendif (ATLAS_FOUND)\n\nfind_package(MKL)\nif (MKL_FOUND)\n  btl_add_bench(btl_mkl main.cpp)\n  if(BUILD_btl_mkl)\n    target_link_libraries(btl_mkl ${MKL_LIBRARIES})\n    set_target_properties(btl_mkl PROPERTIES COMPILE_FLAGS \"-DCBLASNAME=INTEL_MKL -DHAS_LAPACK=1\")\n  endif(BUILD_btl_mkl)\nendif (MKL_FOUND)\n\n\nfind_package(GOTO2)\nif (GOTO2_FOUND)\n  btl_add_bench(btl_goto2 main.cpp)\n  if(BUILD_btl_goto2)\n    target_link_libraries(btl_goto2 ${GOTO_LIBRARIES} )\n    set_target_properties(btl_goto2 PROPERTIES COMPILE_FLAGS \"-DCBLASNAME=GOTO2\")\n  endif(BUILD_btl_goto2)\nendif (GOTO2_FOUND)\n\nfind_package(GOTO)\nif (GOTO_FOUND)\n  if(GOTO2_FOUND)\n    btl_add_bench(btl_goto main.cpp OFF)\n  else()\n    btl_add_bench(btl_goto main.cpp)\n  endif()\n  if(BUILD_btl_goto)\n    target_link_libraries(btl_goto ${GOTO_LIBRARIES} )\n    set_target_properties(btl_goto PROPERTIES COMPILE_FLAGS \"-DCBLASNAME=GOTO\")\n  endif(BUILD_btl_goto)\nendif (GOTO_FOUND)\n\nfind_package(ACML)\nif (ACML_FOUND)\n  btl_add_bench(btl_acml main.cpp)\n  if(BUILD_btl_acml)\n    target_link_libraries(btl_acml ${ACML_LIBRARIES} )\n    set_target_properties(btl_acml PROPERTIES COMPILE_FLAGS \"-DCBLASNAME=ACML -DHAS_LAPACK=1\")\n  endif(BUILD_btl_acml)\nendif (ACML_FOUND)\n\nif(Eigen_SOURCE_DIR AND CMAKE_Fortran_COMPILER_WORKS)\n  # we are inside Eigen and blas/lapack interface is compilable\n  include_directories(${Eigen_SOURCE_DIR})\n  btl_add_bench(btl_eigenblas main.cpp)\n  if(BUILD_btl_eigenblas)\n    target_link_libraries(btl_eigenblas eigen_blas eigen_lapack )\n    set_target_properties(btl_eigenblas PROPERTIES COMPILE_FLAGS \"-DCBLASNAME=EigenBLAS\")\n  endif()\nendif()\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/BLAS/blas.h",
    "content": "#ifndef BLAS_H\n#define BLAS_H\n\n#define BLASFUNC(FUNC) FUNC##_\n\n#ifdef __WIN64__\ntypedef long long BLASLONG;\ntypedef unsigned long long BLASULONG;\n#else\ntypedef long BLASLONG;\ntypedef unsigned long BLASULONG;\n#endif\n\nint    BLASFUNC(xerbla)(const char *, int *info, int);\n\nfloat  BLASFUNC(sdot)  (int *, float  *, int *, float  *, int *);\nfloat  BLASFUNC(sdsdot)(int *, float  *,        float  *, int *, float  *, int *);\n\ndouble BLASFUNC(dsdot) (int *, float  *, int *, float  *, int *);\ndouble BLASFUNC(ddot)  (int *, double *, int *, double *, int *);\ndouble BLASFUNC(qdot)  (int *, double *, int *, double *, int *);\n\n#if defined(F_INTERFACE_GFORT) && !defined(__64BIT__)\nint   BLASFUNC(cdotu)  (int *, float  * , int *, float  *,  int *);\nint   BLASFUNC(cdotc)  (int *, float  *,  int *, float  *,  int *);\nvoid  BLASFUNC(zdotu)  (double *, int *, double  *, int *, double  *, int *);\nvoid  BLASFUNC(zdotc)  (double *, int *, double  *, int *, double  *, int *);\nvoid  BLASFUNC(xdotu)  (double *, int *, double  *, int *, double  *, int *);\nvoid  BLASFUNC(xdotc)  (double *, int *, double  *, int *, double  *, int *);\n#elif  defined(F_INTERFACE_F2C) || \\\n     defined(F_INTERFACE_PGI) || \\\n     defined(F_INTERFACE_GFORT) || \\\n    (defined(F_INTERFACE_PATHSCALE) && defined(__64BIT__))\nvoid  BLASFUNC(cdotu)  (float *,  int *, float  * , int *, float  *,  int *);\nvoid  BLASFUNC(cdotc)  (float *,  int *, float  *,  int *, float  *,  int *);\nvoid  BLASFUNC(zdotu)  (double *, int *, double  *, int *, double  *, int *);\nvoid  BLASFUNC(zdotc)  (double *, int *, double  *, int *, double  *, int *);\nvoid  BLASFUNC(xdotu)  (double *, int *, double  *, int *, double  *, int *);\nvoid  BLASFUNC(xdotc)  (double *, int *, double  *, int *, double  *, int *);\n#else\nstd::complex<float>   BLASFUNC(cdotu)  (int *, float  *, int *, float  *, int *);\nstd::complex<float>   BLASFUNC(cdotc)  (int *, float  *, int *, float  *, int *);\nstd::complex<double>  BLASFUNC(zdotu)  (int *, double  *, int *, double  *, int *);\nstd::complex<double>  BLASFUNC(zdotc)  (int *, double  *, int *, double  *, int *);\ndouble  BLASFUNC(xdotu)  (int *, double  *, int *, double  *, int *);\ndouble  BLASFUNC(xdotc)  (int *, double  *, int *, double  *, int *);\n#endif\n\nint  BLASFUNC(cdotuw)  (int *, float  *, int *, float  *, int *, float*);\nint  BLASFUNC(cdotcw)  (int *, float  *, int *, float  *, int *, float*);\nint  BLASFUNC(zdotuw)  (int *, double  *, int *, double  *, int *, double*);\nint  BLASFUNC(zdotcw)  (int *, double  *, int *, double  *, int *, double*);\n\nint    BLASFUNC(saxpy) (int *, float  *, float  *, int *, float  *, int *);\nint    BLASFUNC(daxpy) (int *, double *, double *, int *, double *, int *);\nint    BLASFUNC(qaxpy) (int *, double *, double *, int *, double *, int *);\nint    BLASFUNC(caxpy) (int *, float  *, float  *, int *, float  *, int *);\nint    BLASFUNC(zaxpy) (int *, double *, double *, int *, double *, int *);\nint    BLASFUNC(xaxpy) (int *, double *, double *, int *, double *, int *);\nint    BLASFUNC(caxpyc)(int *, float  *, float  *, int *, float  *, int *);\nint    BLASFUNC(zaxpyc)(int *, double *, double *, int *, double *, int *);\nint    BLASFUNC(xaxpyc)(int *, double *, double *, int *, double *, int *);\n\nint    BLASFUNC(scopy) (int *, float  *, int *, float  *, int *);\nint    BLASFUNC(dcopy) (int *, double *, int *, double *, int *);\nint    BLASFUNC(qcopy) (int *, double *, int *, double *, int *);\nint    BLASFUNC(ccopy) (int *, float  *, int *, float  *, int *);\nint    BLASFUNC(zcopy) (int *, double *, int *, double *, int *);\nint    BLASFUNC(xcopy) (int *, double *, int *, double *, int *);\n\nint    BLASFUNC(sswap) (int *, float  *, int *, float  *, int *);\nint    BLASFUNC(dswap) (int *, double *, int *, double *, int *);\nint    BLASFUNC(qswap) (int *, double *, int *, double *, int *);\nint    BLASFUNC(cswap) (int *, float  *, int *, float  *, int *);\nint    BLASFUNC(zswap) (int *, double *, int *, double *, int *);\nint    BLASFUNC(xswap) (int *, double *, int *, double *, int *);\n\nfloat  BLASFUNC(sasum) (int *, float  *, int *);\nfloat  BLASFUNC(scasum)(int *, float  *, int *);\ndouble BLASFUNC(dasum) (int *, double *, int *);\ndouble BLASFUNC(qasum) (int *, double *, int *);\ndouble BLASFUNC(dzasum)(int *, double *, int *);\ndouble BLASFUNC(qxasum)(int *, double *, int *);\n\nint    BLASFUNC(isamax)(int *, float  *, int *);\nint    BLASFUNC(idamax)(int *, double *, int *);\nint    BLASFUNC(iqamax)(int *, double *, int *);\nint    BLASFUNC(icamax)(int *, float  *, int *);\nint    BLASFUNC(izamax)(int *, double *, int *);\nint    BLASFUNC(ixamax)(int *, double *, int *);\n\nint    BLASFUNC(ismax) (int *, float  *, int *);\nint    BLASFUNC(idmax) (int *, double *, int *);\nint    BLASFUNC(iqmax) (int *, double *, int *);\nint    BLASFUNC(icmax) (int *, float  *, int *);\nint    BLASFUNC(izmax) (int *, double *, int *);\nint    BLASFUNC(ixmax) (int *, double *, int *);\n\nint    BLASFUNC(isamin)(int *, float  *, int *);\nint    BLASFUNC(idamin)(int *, double *, int *);\nint    BLASFUNC(iqamin)(int *, double *, int *);\nint    BLASFUNC(icamin)(int *, float  *, int *);\nint    BLASFUNC(izamin)(int *, double *, int *);\nint    BLASFUNC(ixamin)(int *, double *, int *);\n\nint    BLASFUNC(ismin)(int *, float  *, int *);\nint    BLASFUNC(idmin)(int *, double *, int *);\nint    BLASFUNC(iqmin)(int *, double *, int *);\nint    BLASFUNC(icmin)(int *, float  *, int *);\nint    BLASFUNC(izmin)(int *, double *, int *);\nint    BLASFUNC(ixmin)(int *, double *, int *);\n\nfloat  BLASFUNC(samax) (int *, float  *, int *);\ndouble BLASFUNC(damax) (int *, double *, int *);\ndouble BLASFUNC(qamax) (int *, double *, int *);\nfloat  BLASFUNC(scamax)(int *, float  *, int *);\ndouble BLASFUNC(dzamax)(int *, double *, int *);\ndouble BLASFUNC(qxamax)(int *, double *, int *);\n\nfloat  BLASFUNC(samin) (int *, float  *, int *);\ndouble BLASFUNC(damin) (int *, double *, int *);\ndouble BLASFUNC(qamin) (int *, double *, int *);\nfloat  BLASFUNC(scamin)(int *, float  *, int *);\ndouble BLASFUNC(dzamin)(int *, double *, int *);\ndouble BLASFUNC(qxamin)(int *, double *, int *);\n\nfloat  BLASFUNC(smax)  (int *, float  *, int *);\ndouble BLASFUNC(dmax)  (int *, double *, int *);\ndouble BLASFUNC(qmax)  (int *, double *, int *);\nfloat  BLASFUNC(scmax) (int *, float  *, int *);\ndouble BLASFUNC(dzmax) (int *, double *, int *);\ndouble BLASFUNC(qxmax) (int *, double *, int *);\n\nfloat  BLASFUNC(smin)  (int *, float  *, int *);\ndouble BLASFUNC(dmin)  (int *, double *, int *);\ndouble BLASFUNC(qmin)  (int *, double *, int *);\nfloat  BLASFUNC(scmin) (int *, float  *, int *);\ndouble BLASFUNC(dzmin) (int *, double *, int *);\ndouble BLASFUNC(qxmin) (int *, double *, int *);\n\nint    BLASFUNC(sscal) (int *,  float  *, float  *, int *);\nint    BLASFUNC(dscal) (int *,  double *, double *, int *);\nint    BLASFUNC(qscal) (int *,  double *, double *, int *);\nint    BLASFUNC(cscal) (int *,  float  *, float  *, int *);\nint    BLASFUNC(zscal) (int *,  double *, double *, int *);\nint    BLASFUNC(xscal) (int *,  double *, double *, int *);\nint    BLASFUNC(csscal)(int *,  float  *, float  *, int *);\nint    BLASFUNC(zdscal)(int *,  double *, double *, int *);\nint    BLASFUNC(xqscal)(int *,  double *, double *, int *);\n\nfloat  BLASFUNC(snrm2) (int *, float  *, int *);\nfloat  BLASFUNC(scnrm2)(int *, float  *, int *);\n\ndouble BLASFUNC(dnrm2) (int *, double *, int *);\ndouble BLASFUNC(qnrm2) (int *, double *, int *);\ndouble BLASFUNC(dznrm2)(int *, double *, int *);\ndouble BLASFUNC(qxnrm2)(int *, double *, int *);\n\nint    BLASFUNC(srot)  (int *, float  *, int *, float  *, int *, float  *, float  *);\nint    BLASFUNC(drot)  (int *, double *, int *, double *, int *, double *, double *);\nint    BLASFUNC(qrot)  (int *, double *, int *, double *, int *, double *, double *);\nint    BLASFUNC(csrot) (int *, float  *, int *, float  *, int *, float  *, float  *);\nint    BLASFUNC(zdrot) (int *, double *, int *, double *, int *, double *, double *);\nint    BLASFUNC(xqrot) (int *, double *, int *, double *, int *, double *, double *);\n\nint    BLASFUNC(srotg) (float  *, float  *, float  *, float  *);\nint    BLASFUNC(drotg) (double *, double *, double *, double *);\nint    BLASFUNC(qrotg) (double *, double *, double *, double *);\nint    BLASFUNC(crotg) (float  *, float  *, float  *, float  *);\nint    BLASFUNC(zrotg) (double *, double *, double *, double *);\nint    BLASFUNC(xrotg) (double *, double *, double *, double *);\n\nint    BLASFUNC(srotmg)(float  *, float  *, float  *, float  *, float  *);\nint    BLASFUNC(drotmg)(double *, double *, double *, double *, double *);\n\nint    BLASFUNC(srotm) (int *, float  *, int *, float  *, int *, float  *);\nint    BLASFUNC(drotm) (int *, double *, int *, double *, int *, double *);\nint    BLASFUNC(qrotm) (int *, double *, int *, double *, int *, double *);\n\n/* Level 2 routines */\n\nint BLASFUNC(sger)(int *,    int *, float *,  float *, int *,\n\t\t   float *,  int *, float *,  int *);\nint BLASFUNC(dger)(int *,    int *, double *, double *, int *,\n\t\t   double *, int *, double *, int *);\nint BLASFUNC(qger)(int *,    int *, double *, double *, int *,\n\t\t   double *, int *, double *, int *);\nint BLASFUNC(cgeru)(int *,    int *, float *,  float *, int *,\n\t\t    float *,  int *, float *,  int *);\nint BLASFUNC(cgerc)(int *,    int *, float *,  float *, int *,\n\t\t    float *,  int *, float *,  int *);\nint BLASFUNC(zgeru)(int *,    int *, double *, double *, int *,\n\t\t    double *, int *, double *, int *);\nint BLASFUNC(zgerc)(int *,    int *, double *, double *, int *,\n\t\t    double *, int *, double *, int *);\nint BLASFUNC(xgeru)(int *,    int *, double *, double *, int *,\n\t\t    double *, int *, double *, int *);\nint BLASFUNC(xgerc)(int *,    int *, double *, double *, int *,\n\t\t    double *, int *, double *, int *);\n\nint BLASFUNC(sgemv)(char *, int *, int *, float  *, float  *, int *,\n\t\t    float  *, int *, float  *, float  *, int *);\nint BLASFUNC(dgemv)(char *, int *, int *, double *, double *, int *,\n\t\t    double *, int *, double *, double *, int *);\nint BLASFUNC(qgemv)(char *, int *, int *, double *, double *, int *,\n\t\t    double *, int *, double *, double *, int *);\nint BLASFUNC(cgemv)(char *, int *, int *, float  *, float  *, int *,\n\t\t    float  *, int *, float  *, float  *, int *);\nint BLASFUNC(zgemv)(char *, int *, int *, double *, double *, int *,\n\t\t    double *, int *, double *, double *, int *);\nint BLASFUNC(xgemv)(char *, int *, int *, double *, double *, int *,\n\t\t    double *, int *, double *, double *, int *);\n\nint BLASFUNC(strsv) (char *, char *, char *, int *, float  *, int *,\n\t\t     float  *, int *);\nint BLASFUNC(dtrsv) (char *, char *, char *, int *, double *, int *,\n\t\t     double *, int *);\nint BLASFUNC(qtrsv) (char *, char *, char *, int *, double *, int *,\n\t\t     double *, int *);\nint BLASFUNC(ctrsv) (char *, char *, char *, int *, float  *, int *,\n\t\t     float  *, int *);\nint BLASFUNC(ztrsv) (char *, char *, char *, int *, double *, int *,\n\t\t     double *, int *);\nint BLASFUNC(xtrsv) (char *, char *, char *, int *, double *, int *,\n\t\t     double *, int *);\n\nint BLASFUNC(stpsv) (char *, char *, char *, int *, float  *, float  *, int *);\nint BLASFUNC(dtpsv) (char *, char *, char *, int *, double *, double *, int *);\nint BLASFUNC(qtpsv) (char *, char *, char *, int *, double *, double *, int *);\nint BLASFUNC(ctpsv) (char *, char *, char *, int *, float  *, float  *, int *);\nint BLASFUNC(ztpsv) (char *, char *, char *, int *, double *, double *, int *);\nint BLASFUNC(xtpsv) (char *, char *, char *, int *, double *, double *, int *);\n\nint BLASFUNC(strmv) (char *, char *, char *, int *, float  *, int *,\n\t\t     float  *, int *);\nint BLASFUNC(dtrmv) (char *, char *, char *, int *, double *, int *,\n\t\t     double *, int *);\nint BLASFUNC(qtrmv) (char *, char *, char *, int *, double *, int *,\n\t\t     double *, int *);\nint BLASFUNC(ctrmv) (char *, char *, char *, int *, float  *, int *,\n\t\t     float  *, int *);\nint BLASFUNC(ztrmv) (char *, char *, char *, int *, double *, int *,\n\t\t     double *, int *);\nint BLASFUNC(xtrmv) (char *, char *, char *, int *, double *, int *,\n\t\t     double *, int *);\n\nint BLASFUNC(stpmv) (char *, char *, char *, int *, float  *, float  *, int *);\nint BLASFUNC(dtpmv) (char *, char *, char *, int *, double *, double *, int *);\nint BLASFUNC(qtpmv) (char *, char *, char *, int *, double *, double *, int *);\nint BLASFUNC(ctpmv) (char *, char *, char *, int *, float  *, float  *, int *);\nint BLASFUNC(ztpmv) (char *, char *, char *, int *, double *, double *, int *);\nint BLASFUNC(xtpmv) (char *, char *, char *, int *, double *, double *, int *);\n\nint BLASFUNC(stbmv) (char *, char *, char *, int *, int *, float  *, int *, float  *, int *);\nint BLASFUNC(dtbmv) (char *, char *, char *, int *, int *, double *, int *, double *, int *);\nint BLASFUNC(qtbmv) (char *, char *, char *, int *, int *, double *, int *, double *, int *);\nint BLASFUNC(ctbmv) (char *, char *, char *, int *, int *, float  *, int *, float  *, int *);\nint BLASFUNC(ztbmv) (char *, char *, char *, int *, int *, double *, int *, double *, int *);\nint BLASFUNC(xtbmv) (char *, char *, char *, int *, int *, double *, int *, double *, int *);\n\nint BLASFUNC(stbsv) (char *, char *, char *, int *, int *, float  *, int *, float  *, int *);\nint BLASFUNC(dtbsv) (char *, char *, char *, int *, int *, double *, int *, double *, int *);\nint BLASFUNC(qtbsv) (char *, char *, char *, int *, int *, double *, int *, double *, int *);\nint BLASFUNC(ctbsv) (char *, char *, char *, int *, int *, float  *, int *, float  *, int *);\nint BLASFUNC(ztbsv) (char *, char *, char *, int *, int *, double *, int *, double *, int *);\nint BLASFUNC(xtbsv) (char *, char *, char *, int *, int *, double *, int *, double *, int *);\n\nint BLASFUNC(ssymv) (char *, int *, float  *, float *, int *,\n\t\t     float  *, int *, float *, float *, int *);\nint BLASFUNC(dsymv) (char *, int *, double  *, double *, int *,\n\t\t     double  *, int *, double *, double *, int *);\nint BLASFUNC(qsymv) (char *, int *, double  *, double *, int *,\n\t\t     double  *, int *, double *, double *, int *);\nint BLASFUNC(csymv) (char *, int *, float  *, float *, int *,\n\t\t     float  *, int *, float *, float *, int *);\nint BLASFUNC(zsymv) (char *, int *, double  *, double *, int *,\n\t\t     double  *, int *, double *, double *, int *);\nint BLASFUNC(xsymv) (char *, int *, double  *, double *, int *,\n\t\t     double  *, int *, double *, double *, int *);\n\nint BLASFUNC(sspmv) (char *, int *, float  *, float *,\n\t\t     float  *, int *, float *, float *, int *);\nint BLASFUNC(dspmv) (char *, int *, double  *, double *,\n\t\t     double  *, int *, double *, double *, int *);\nint BLASFUNC(qspmv) (char *, int *, double  *, double *,\n\t\t     double  *, int *, double *, double *, int *);\nint BLASFUNC(cspmv) (char *, int *, float  *, float *,\n\t\t     float  *, int *, float *, float *, int *);\nint BLASFUNC(zspmv) (char *, int *, double  *, double *,\n\t\t     double  *, int *, double *, double *, int *);\nint BLASFUNC(xspmv) (char *, int *, double  *, double *,\n\t\t     double  *, int *, double *, double *, int *);\n\nint BLASFUNC(ssyr) (char *, int *, float   *, float  *, int *,\n\t\t    float  *, int *);\nint BLASFUNC(dsyr) (char *, int *, double  *, double *, int *,\n\t\t    double *, int *);\nint BLASFUNC(qsyr) (char *, int *, double  *, double *, int *,\n\t\t    double *, int *);\nint BLASFUNC(csyr) (char *, int *, float   *, float  *, int *,\n\t\t    float  *, int *);\nint BLASFUNC(zsyr) (char *, int *, double  *, double *, int *,\n\t\t    double *, int *);\nint BLASFUNC(xsyr) (char *, int *, double  *, double *, int *,\n\t\t    double *, int *);\n\nint BLASFUNC(ssyr2) (char *, int *, float   *,\n\t\t     float  *, int *, float  *, int *, float  *, int *);\nint BLASFUNC(dsyr2) (char *, int *, double  *,\n\t\t     double *, int *, double *, int *, double *, int *);\nint BLASFUNC(qsyr2) (char *, int *, double  *,\n\t\t     double *, int *, double *, int *, double *, int *);\nint BLASFUNC(csyr2) (char *, int *, float   *,\n\t\t     float  *, int *, float  *, int *, float  *, int *);\nint BLASFUNC(zsyr2) (char *, int *, double  *,\n\t\t     double *, int *, double *, int *, double *, int *);\nint BLASFUNC(xsyr2) (char *, int *, double  *,\n\t\t     double *, int *, double *, int *, double *, int *);\n\nint BLASFUNC(sspr) (char *, int *, float   *, float  *, int *,\n\t\t    float  *);\nint BLASFUNC(dspr) (char *, int *, double  *, double *, int *,\n\t\t    double *);\nint BLASFUNC(qspr) (char *, int *, double  *, double *, int *,\n\t\t    double *);\nint BLASFUNC(cspr) (char *, int *, float   *, float  *, int *,\n\t\t    float  *);\nint BLASFUNC(zspr) (char *, int *, double  *, double *, int *,\n\t\t    double *);\nint BLASFUNC(xspr) (char *, int *, double  *, double *, int *,\n\t\t    double *);\n\nint BLASFUNC(sspr2) (char *, int *, float   *,\n\t\t     float  *, int *, float  *, int *, float  *);\nint BLASFUNC(dspr2) (char *, int *, double  *,\n\t\t     double *, int *, double *, int *, double *);\nint BLASFUNC(qspr2) (char *, int *, double  *,\n\t\t     double *, int *, double *, int *, double *);\nint BLASFUNC(cspr2) (char *, int *, float   *,\n\t\t     float  *, int *, float  *, int *, float  *);\nint BLASFUNC(zspr2) (char *, int *, double  *,\n\t\t     double *, int *, double *, int *, double *);\nint BLASFUNC(xspr2) (char *, int *, double  *,\n\t\t     double *, int *, double *, int *, double *);\n\nint BLASFUNC(cher) (char *, int *, float   *, float  *, int *,\n\t\t    float  *, int *);\nint BLASFUNC(zher) (char *, int *, double  *, double *, int *,\n\t\t    double *, int *);\nint BLASFUNC(xher) (char *, int *, double  *, double *, int *,\n\t\t    double *, int *);\n\nint BLASFUNC(chpr) (char *, int *, float   *, float  *, int *, float  *);\nint BLASFUNC(zhpr) (char *, int *, double  *, double *, int *, double *);\nint BLASFUNC(xhpr) (char *, int *, double  *, double *, int *, double *);\n\nint BLASFUNC(cher2) (char *, int *, float   *,\n\t\t     float  *, int *, float  *, int *, float  *, int *);\nint BLASFUNC(zher2) (char *, int *, double  *,\n\t\t     double *, int *, double *, int *, double *, int *);\nint BLASFUNC(xher2) (char *, int *, double  *,\n\t\t     double *, int *, double *, int *, double *, int *);\n\nint BLASFUNC(chpr2) (char *, int *, float   *,\n\t\t     float  *, int *, float  *, int *, float  *);\nint BLASFUNC(zhpr2) (char *, int *, double  *,\n\t\t     double *, int *, double *, int *, double *);\nint BLASFUNC(xhpr2) (char *, int *, double  *,\n\t\t     double *, int *, double *, int *, double *);\n\nint BLASFUNC(chemv) (char *, int *, float  *, float *, int *,\n\t\t     float  *, int *, float *, float *, int *);\nint BLASFUNC(zhemv) (char *, int *, double  *, double *, int *,\n\t\t     double  *, int *, double *, double *, int *);\nint BLASFUNC(xhemv) (char *, int *, double  *, double *, int *,\n\t\t     double  *, int *, double *, double *, int *);\n\nint BLASFUNC(chpmv) (char *, int *, float  *, float *,\n\t\t     float  *, int *, float *, float *, int *);\nint BLASFUNC(zhpmv) (char *, int *, double  *, double *,\n\t\t     double  *, int *, double *, double *, int *);\nint BLASFUNC(xhpmv) (char *, int *, double  *, double *,\n\t\t     double  *, int *, double *, double *, int *);\n\nint BLASFUNC(snorm)(char *, int *, int *, float  *, int *);\nint BLASFUNC(dnorm)(char *, int *, int *, double *, int *);\nint BLASFUNC(cnorm)(char *, int *, int *, float  *, int *);\nint BLASFUNC(znorm)(char *, int *, int *, double *, int *);\n\nint BLASFUNC(sgbmv)(char *, int *, int *, int *, int *, float  *, float  *, int *,\n\t\t    float  *, int *, float  *, float  *, int *);\nint BLASFUNC(dgbmv)(char *, int *, int *, int *, int *, double *, double *, int *,\n\t\t    double *, int *, double *, double *, int *);\nint BLASFUNC(qgbmv)(char *, int *, int *, int *, int *, double *, double *, int *,\n\t\t    double *, int *, double *, double *, int *);\nint BLASFUNC(cgbmv)(char *, int *, int *, int *, int *, float  *, float  *, int *,\n\t\t    float  *, int *, float  *, float  *, int *);\nint BLASFUNC(zgbmv)(char *, int *, int *, int *, int *, double *, double *, int *,\n\t\t    double *, int *, double *, double *, int *);\nint BLASFUNC(xgbmv)(char *, int *, int *, int *, int *, double *, double *, int *,\n\t\t    double *, int *, double *, double *, int *);\n\nint BLASFUNC(ssbmv)(char *, int *, int *, float  *, float  *, int *,\n\t\t    float  *, int *, float  *, float  *, int *);\nint BLASFUNC(dsbmv)(char *, int *, int *, double *, double *, int *,\n\t\t    double *, int *, double *, double *, int *);\nint BLASFUNC(qsbmv)(char *, int *, int *, double *, double *, int *,\n\t\t    double *, int *, double *, double *, int *);\nint BLASFUNC(csbmv)(char *, int *, int *, float  *, float  *, int *,\n\t\t    float  *, int *, float  *, float  *, int *);\nint BLASFUNC(zsbmv)(char *, int *, int *, double *, double *, int *,\n\t\t    double *, int *, double *, double *, int *);\nint BLASFUNC(xsbmv)(char *, int *, int *, double *, double *, int *,\n\t\t    double *, int *, double *, double *, int *);\n\nint BLASFUNC(chbmv)(char *, int *, int *, float  *, float  *, int *,\n\t\t    float  *, int *, float  *, float  *, int *);\nint BLASFUNC(zhbmv)(char *, int *, int *, double *, double *, int *,\n\t\t    double *, int *, double *, double *, int *);\nint BLASFUNC(xhbmv)(char *, int *, int *, double *, double *, int *,\n\t\t    double *, int *, double *, double *, int *);\n\n/* Level 3 routines */\n\nint BLASFUNC(sgemm)(char *, char *, int *, int *, int *, float *,\n\t   float  *, int *, float  *, int *, float  *, float  *, int *);\nint BLASFUNC(dgemm)(char *, char *, int *, int *, int *, double *,\n\t   double *, int *, double *, int *, double *, double *, int *);\nint BLASFUNC(qgemm)(char *, char *, int *, int *, int *, double *,\n\t   double *, int *, double *, int *, double *, double *, int *);\nint BLASFUNC(cgemm)(char *, char *, int *, int *, int *, float *,\n\t   float  *, int *, float  *, int *, float  *, float  *, int *);\nint BLASFUNC(zgemm)(char *, char *, int *, int *, int *, double *,\n\t   double *, int *, double *, int *, double *, double *, int *);\nint BLASFUNC(xgemm)(char *, char *, int *, int *, int *, double *,\n\t   double *, int *, double *, int *, double *, double *, int *);\n\nint BLASFUNC(cgemm3m)(char *, char *, int *, int *, int *, float *,\n\t   float  *, int *, float  *, int *, float  *, float  *, int *);\nint BLASFUNC(zgemm3m)(char *, char *, int *, int *, int *, double *,\n\t   double *, int *, double *, int *, double *, double *, int *);\nint BLASFUNC(xgemm3m)(char *, char *, int *, int *, int *, double *,\n\t   double *, int *, double *, int *, double *, double *, int *);\n\nint BLASFUNC(sge2mm)(char *, char *, char *, int *, int *,\n\t\t     float *, float  *, int *, float  *, int *,\n\t\t     float *, float  *, int *);\nint BLASFUNC(dge2mm)(char *, char *, char *, int *, int *,\n\t\t     double *, double  *, int *, double  *, int *,\n\t\t     double *, double  *, int *);\nint BLASFUNC(cge2mm)(char *, char *, char *, int *, int *,\n\t\t     float *, float  *, int *, float  *, int *,\n\t\t     float *, float  *, int *);\nint BLASFUNC(zge2mm)(char *, char *, char *, int *, int *,\n\t\t     double *, double  *, int *, double  *, int *,\n\t\t     double *, double  *, int *);\n\nint BLASFUNC(strsm)(char *, char *, char *, char *, int *, int *,\n\t   float *,  float *, int *, float *, int *);\nint BLASFUNC(dtrsm)(char *, char *, char *, char *, int *, int *,\n\t   double *,  double *, int *, double *, int *);\nint BLASFUNC(qtrsm)(char *, char *, char *, char *, int *, int *,\n\t   double *,  double *, int *, double *, int *);\nint BLASFUNC(ctrsm)(char *, char *, char *, char *, int *, int *,\n\t   float *,  float *, int *, float *, int *);\nint BLASFUNC(ztrsm)(char *, char *, char *, char *, int *, int *,\n\t   double *,  double *, int *, double *, int *);\nint BLASFUNC(xtrsm)(char *, char *, char *, char *, int *, int *,\n\t   double *,  double *, int *, double *, int *);\n\nint BLASFUNC(strmm)(char *, char *, char *, char *, int *, int *,\n\t   float *,  float *, int *, float *, int *);\nint BLASFUNC(dtrmm)(char *, char *, char *, char *, int *, int *,\n\t   double *,  double *, int *, double *, int *);\nint BLASFUNC(qtrmm)(char *, char *, char *, char *, int *, int *,\n\t   double *,  double *, int *, double *, int *);\nint BLASFUNC(ctrmm)(char *, char *, char *, char *, int *, int *,\n\t   float *,  float *, int *, float *, int *);\nint BLASFUNC(ztrmm)(char *, char *, char *, char *, int *, int *,\n\t   double *,  double *, int *, double *, int *);\nint BLASFUNC(xtrmm)(char *, char *, char *, char *, int *, int *,\n\t   double *,  double *, int *, double *, int *);\n\nint BLASFUNC(ssymm)(char *, char *, int *, int *, float  *, float  *, int *,\n\t   float  *, int *, float  *, float  *, int *);\nint BLASFUNC(dsymm)(char *, char *, int *, int *, double *, double *, int *,\n\t   double *, int *, double *, double *, int *);\nint BLASFUNC(qsymm)(char *, char *, int *, int *, double *, double *, int *,\n\t   double *, int *, double *, double *, int *);\nint BLASFUNC(csymm)(char *, char *, int *, int *, float  *, float  *, int *,\n\t   float  *, int *, float  *, float  *, int *);\nint BLASFUNC(zsymm)(char *, char *, int *, int *, double *, double *, int *,\n\t   double *, int *, double *, double *, int *);\nint BLASFUNC(xsymm)(char *, char *, int *, int *, double *, double *, int *,\n\t   double *, int *, double *, double *, int *);\n\nint BLASFUNC(csymm3m)(char *, char *, int *, int *, float  *, float  *, int *,\n\t   float  *, int *, float  *, float  *, int *);\nint BLASFUNC(zsymm3m)(char *, char *, int *, int *, double *, double *, int *,\n\t   double *, int *, double *, double *, int *);\nint BLASFUNC(xsymm3m)(char *, char *, int *, int *, double *, double *, int *,\n\t   double *, int *, double *, double *, int *);\n\nint BLASFUNC(ssyrk)(char *, char *, int *, int *, float  *, float  *, int *,\n\t   float  *, float  *, int *);\nint BLASFUNC(dsyrk)(char *, char *, int *, int *, double *, double *, int *,\n\t   double *, double *, int *);\nint BLASFUNC(qsyrk)(char *, char *, int *, int *, double *, double *, int *,\n\t   double *, double *, int *);\nint BLASFUNC(csyrk)(char *, char *, int *, int *, float  *, float  *, int *,\n\t   float  *, float  *, int *);\nint BLASFUNC(zsyrk)(char *, char *, int *, int *, double *, double *, int *,\n\t   double *, double *, int *);\nint BLASFUNC(xsyrk)(char *, char *, int *, int *, double *, double *, int *,\n\t   double *, double *, int *);\n\nint BLASFUNC(ssyr2k)(char *, char *, int *, int *, float  *, float  *, int *,\n\t   float *, int *, float  *, float  *, int *);\nint BLASFUNC(dsyr2k)(char *, char *, int *, int *, double *, double *, int *,\n\t   double*, int *, double *, double *, int *);\nint BLASFUNC(qsyr2k)(char *, char *, int *, int *, double *, double *, int *,\n\t   double*, int *, double *, double *, int *);\nint BLASFUNC(csyr2k)(char *, char *, int *, int *, float  *, float  *, int *,\n\t   float *, int *, float  *, float  *, int *);\nint BLASFUNC(zsyr2k)(char *, char *, int *, int *, double *, double *, int *,\n\t   double*, int *, double *, double *, int *);\nint BLASFUNC(xsyr2k)(char *, char *, int *, int *, double *, double *, int *,\n\t   double*, int *, double *, double *, int *);\n\nint BLASFUNC(chemm)(char *, char *, int *, int *, float  *, float  *, int *,\n\t   float  *, int *, float  *, float  *, int *);\nint BLASFUNC(zhemm)(char *, char *, int *, int *, double *, double *, int *,\n\t   double *, int *, double *, double *, int *);\nint BLASFUNC(xhemm)(char *, char *, int *, int *, double *, double *, int *,\n\t   double *, int *, double *, double *, int *);\n\nint BLASFUNC(chemm3m)(char *, char *, int *, int *, float  *, float  *, int *,\n\t   float  *, int *, float  *, float  *, int *);\nint BLASFUNC(zhemm3m)(char *, char *, int *, int *, double *, double *, int *,\n\t   double *, int *, double *, double *, int *);\nint BLASFUNC(xhemm3m)(char *, char *, int *, int *, double *, double *, int *,\n\t   double *, int *, double *, double *, int *);\n\nint BLASFUNC(cherk)(char *, char *, int *, int *, float  *, float  *, int *,\n\t   float  *, float  *, int *);\nint BLASFUNC(zherk)(char *, char *, int *, int *, double *, double *, int *,\n\t   double *, double *, int *);\nint BLASFUNC(xherk)(char *, char *, int *, int *, double *, double *, int *,\n\t   double *, double *, int *);\n\nint BLASFUNC(cher2k)(char *, char *, int *, int *, float  *, float  *, int *,\n\t   float *, int *, float  *, float  *, int *);\nint BLASFUNC(zher2k)(char *, char *, int *, int *, double *, double *, int *,\n\t   double*, int *, double *, double *, int *);\nint BLASFUNC(xher2k)(char *, char *, int *, int *, double *, double *, int *,\n\t   double*, int *, double *, double *, int *);\nint BLASFUNC(cher2m)(char *, char *, char *, int *, int *, float  *, float  *, int *,\n\t   float *, int *, float  *, float  *, int *);\nint BLASFUNC(zher2m)(char *, char *, char *, int *, int *, double *, double *, int *,\n\t   double*, int *, double *, double *, int *);\nint BLASFUNC(xher2m)(char *, char *, char *, int *, int *, double *, double *, int *,\n\t   double*, int *, double *, double *, int *);\n\nint BLASFUNC(sgemt)(char *, int *, int *, float  *, float  *, int *,\n\t\t    float  *, int *);\nint BLASFUNC(dgemt)(char *, int *, int *, double *, double *, int *,\n\t\t    double *, int *);\nint BLASFUNC(cgemt)(char *, int *, int *, float  *, float  *, int *,\n\t\t    float  *, int *);\nint BLASFUNC(zgemt)(char *, int *, int *, double *, double *, int *,\n\t\t    double *, int *);\n\nint BLASFUNC(sgema)(char *, char *, int *, int *, float  *,\n\t\t    float  *, int *, float *, float  *, int *, float *, int *);\nint BLASFUNC(dgema)(char *, char *, int *, int *, double *,\n\t\t    double *, int *, double*, double *, int *, double*, int *);\nint BLASFUNC(cgema)(char *, char *, int *, int *, float  *,\n\t\t    float  *, int *, float *, float  *, int *, float *, int *);\nint BLASFUNC(zgema)(char *, char *, int *, int *, double *,\n\t\t    double *, int *, double*, double *, int *, double*, int *);\n\nint BLASFUNC(sgems)(char *, char *, int *, int *, float  *,\n\t\t    float  *, int *, float *, float  *, int *, float *, int *);\nint BLASFUNC(dgems)(char *, char *, int *, int *, double *,\n\t\t    double *, int *, double*, double *, int *, double*, int *);\nint BLASFUNC(cgems)(char *, char *, int *, int *, float  *,\n\t\t    float  *, int *, float *, float  *, int *, float *, int *);\nint BLASFUNC(zgems)(char *, char *, int *, int *, double *,\n\t\t    double *, int *, double*, double *, int *, double*, int *);\n\nint BLASFUNC(sgetf2)(int *, int *, float  *, int *, int *, int *);\nint BLASFUNC(dgetf2)(int *, int *, double *, int *, int *, int *);\nint BLASFUNC(qgetf2)(int *, int *, double *, int *, int *, int *);\nint BLASFUNC(cgetf2)(int *, int *, float  *, int *, int *, int *);\nint BLASFUNC(zgetf2)(int *, int *, double *, int *, int *, int *);\nint BLASFUNC(xgetf2)(int *, int *, double *, int *, int *, int *);\n\nint BLASFUNC(sgetrf)(int *, int *, float  *, int *, int *, int *);\nint BLASFUNC(dgetrf)(int *, int *, double *, int *, int *, int *);\nint BLASFUNC(qgetrf)(int *, int *, double *, int *, int *, int *);\nint BLASFUNC(cgetrf)(int *, int *, float  *, int *, int *, int *);\nint BLASFUNC(zgetrf)(int *, int *, double *, int *, int *, int *);\nint BLASFUNC(xgetrf)(int *, int *, double *, int *, int *, int *);\n\nint BLASFUNC(slaswp)(int *, float  *, int *, int *, int *, int *, int *);\nint BLASFUNC(dlaswp)(int *, double *, int *, int *, int *, int *, int *);\nint BLASFUNC(qlaswp)(int *, double *, int *, int *, int *, int *, int *);\nint BLASFUNC(claswp)(int *, float  *, int *, int *, int *, int *, int *);\nint BLASFUNC(zlaswp)(int *, double *, int *, int *, int *, int *, int *);\nint BLASFUNC(xlaswp)(int *, double *, int *, int *, int *, int *, int *);\n\nint BLASFUNC(sgetrs)(char *, int *, int *, float  *, int *, int *, float  *, int *, int *);\nint BLASFUNC(dgetrs)(char *, int *, int *, double *, int *, int *, double *, int *, int *);\nint BLASFUNC(qgetrs)(char *, int *, int *, double *, int *, int *, double *, int *, int *);\nint BLASFUNC(cgetrs)(char *, int *, int *, float  *, int *, int *, float  *, int *, int *);\nint BLASFUNC(zgetrs)(char *, int *, int *, double *, int *, int *, double *, int *, int *);\nint BLASFUNC(xgetrs)(char *, int *, int *, double *, int *, int *, double *, int *, int *);\n\nint BLASFUNC(sgesv)(int *, int *, float  *, int *, int *, float *, int *, int *);\nint BLASFUNC(dgesv)(int *, int *, double *, int *, int *, double*, int *, int *);\nint BLASFUNC(qgesv)(int *, int *, double *, int *, int *, double*, int *, int *);\nint BLASFUNC(cgesv)(int *, int *, float  *, int *, int *, float *, int *, int *);\nint BLASFUNC(zgesv)(int *, int *, double *, int *, int *, double*, int *, int *);\nint BLASFUNC(xgesv)(int *, int *, double *, int *, int *, double*, int *, int *);\n\nint BLASFUNC(spotf2)(char *, int *, float  *, int *, int *);\nint BLASFUNC(dpotf2)(char *, int *, double *, int *, int *);\nint BLASFUNC(qpotf2)(char *, int *, double *, int *, int *);\nint BLASFUNC(cpotf2)(char *, int *, float  *, int *, int *);\nint BLASFUNC(zpotf2)(char *, int *, double *, int *, int *);\nint BLASFUNC(xpotf2)(char *, int *, double *, int *, int *);\n\nint BLASFUNC(spotrf)(char *, int *, float  *, int *, int *);\nint BLASFUNC(dpotrf)(char *, int *, double *, int *, int *);\nint BLASFUNC(qpotrf)(char *, int *, double *, int *, int *);\nint BLASFUNC(cpotrf)(char *, int *, float  *, int *, int *);\nint BLASFUNC(zpotrf)(char *, int *, double *, int *, int *);\nint BLASFUNC(xpotrf)(char *, int *, double *, int *, int *);\n\nint BLASFUNC(slauu2)(char *, int *, float  *, int *, int *);\nint BLASFUNC(dlauu2)(char *, int *, double *, int *, int *);\nint BLASFUNC(qlauu2)(char *, int *, double *, int *, int *);\nint BLASFUNC(clauu2)(char *, int *, float  *, int *, int *);\nint BLASFUNC(zlauu2)(char *, int *, double *, int *, int *);\nint BLASFUNC(xlauu2)(char *, int *, double *, int *, int *);\n\nint BLASFUNC(slauum)(char *, int *, float  *, int *, int *);\nint BLASFUNC(dlauum)(char *, int *, double *, int *, int *);\nint BLASFUNC(qlauum)(char *, int *, double *, int *, int *);\nint BLASFUNC(clauum)(char *, int *, float  *, int *, int *);\nint BLASFUNC(zlauum)(char *, int *, double *, int *, int *);\nint BLASFUNC(xlauum)(char *, int *, double *, int *, int *);\n\nint BLASFUNC(strti2)(char *, char *, int *, float  *, int *, int *);\nint BLASFUNC(dtrti2)(char *, char *, int *, double *, int *, int *);\nint BLASFUNC(qtrti2)(char *, char *, int *, double *, int *, int *);\nint BLASFUNC(ctrti2)(char *, char *, int *, float  *, int *, int *);\nint BLASFUNC(ztrti2)(char *, char *, int *, double *, int *, int *);\nint BLASFUNC(xtrti2)(char *, char *, int *, double *, int *, int *);\n\nint BLASFUNC(strtri)(char *, char *, int *, float  *, int *, int *);\nint BLASFUNC(dtrtri)(char *, char *, int *, double *, int *, int *);\nint BLASFUNC(qtrtri)(char *, char *, int *, double *, int *, int *);\nint BLASFUNC(ctrtri)(char *, char *, int *, float  *, int *, int *);\nint BLASFUNC(ztrtri)(char *, char *, int *, double *, int *, int *);\nint BLASFUNC(xtrtri)(char *, char *, int *, double *, int *, int *);\n\nint BLASFUNC(spotri)(char *, int *, float  *, int *, int *);\nint BLASFUNC(dpotri)(char *, int *, double *, int *, int *);\nint BLASFUNC(qpotri)(char *, int *, double *, int *, int *);\nint BLASFUNC(cpotri)(char *, int *, float  *, int *, int *);\nint BLASFUNC(zpotri)(char *, int *, double *, int *, int *);\nint BLASFUNC(xpotri)(char *, int *, double *, int *, int *);\n\n#endif\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/BLAS/blas_interface.hh",
    "content": "//=====================================================\n// File   :  blas_interface.hh\n// Author :  L. Plagne <laurent.plagne@edf.fr)>\n// Copyright (C) EDF R&D,  lun sep 30 14:23:28 CEST 2002\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#ifndef blas_PRODUIT_MATRICE_VECTEUR_HH\n#define blas_PRODUIT_MATRICE_VECTEUR_HH\n\n#include <c_interface_base.h>\n#include <complex>\nextern \"C\"\n{\n#include \"blas.h\"\n\n  // Cholesky Factorization\n//   void spotrf_(const char* uplo, const int* n, float *a, const int* ld, int* info);\n//   void dpotrf_(const char* uplo, const int* n, double *a, const int* ld, int* info);\n  void ssytrd_(char *uplo, const int *n, float *a, const int *lda, float *d, float *e, float *tau, float *work, int *lwork, int *info );\n  void dsytrd_(char *uplo, const int *n, double *a, const int *lda, double *d, double *e, double *tau, double *work, int *lwork, int *info );\n  void sgehrd_( const int *n, int *ilo, int *ihi, float *a, const int *lda, float *tau, float *work, int *lwork, int *info );\n  void dgehrd_( const int *n, int *ilo, int *ihi, double *a, const int *lda, double *tau, double *work, int *lwork, int *info );\n\n  // LU row pivoting\n//   void dgetrf_( int *m, int *n, double *a, int *lda, int *ipiv, int *info );\n//   void sgetrf_(const int* m, const int* n, float *a, const int* ld, int* ipivot, int* info);\n  // LU full pivoting\n  void sgetc2_(const int* n, float *a, const int *lda, int *ipiv, int *jpiv, int*info );\n  void dgetc2_(const int* n, double *a, const int *lda, int *ipiv, int *jpiv, int*info );\n#ifdef HAS_LAPACK\n#endif\n}\n\n#define MAKE_STRING2(S) #S\n#define MAKE_STRING(S) MAKE_STRING2(S)\n\n#define CAT2(A,B) A##B\n#define CAT(A,B) CAT2(A,B)\n\n\ntemplate<class real> class blas_interface;\n\n\nstatic char notrans = 'N';\nstatic char trans = 'T';\nstatic char nonunit = 'N';\nstatic char lower = 'L';\nstatic char right = 'R';\nstatic char left = 'L';\nstatic int intone = 1;\n\n\n\n#define SCALAR        float\n#define SCALAR_PREFIX s\n#include \"blas_interface_impl.hh\"\n#undef SCALAR\n#undef SCALAR_PREFIX\n\n\n#define SCALAR        double\n#define SCALAR_PREFIX d\n#include \"blas_interface_impl.hh\"\n#undef SCALAR\n#undef SCALAR_PREFIX\n\n#endif\n\n\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/BLAS/blas_interface_impl.hh",
    "content": "\n#define BLAS_FUNC(NAME) CAT(CAT(SCALAR_PREFIX,NAME),_)\n\ntemplate<> class blas_interface<SCALAR> : public c_interface_base<SCALAR>\n{\n\npublic :\n  \n  static SCALAR fone;\n  static SCALAR fzero;\n\n  static inline std::string name()\n  {\n    return MAKE_STRING(CBLASNAME);\n  }\n\n  static inline void matrix_vector_product(gene_matrix & A, gene_vector & B, gene_vector & X, int N){\n    BLAS_FUNC(gemv)(&notrans,&N,&N,&fone,A,&N,B,&intone,&fzero,X,&intone);\n  }\n\n  static inline void symv(gene_matrix & A, gene_vector & B, gene_vector & X, int N){\n    BLAS_FUNC(symv)(&lower, &N,&fone,A,&N,B,&intone,&fzero,X,&intone);\n  }\n\n  static inline void syr2(gene_matrix & A, gene_vector & B, gene_vector & X, int N){\n    BLAS_FUNC(syr2)(&lower,&N,&fone,B,&intone,X,&intone,A,&N);\n  }\n\n  static inline void ger(gene_matrix & A, gene_vector & X, gene_vector & Y, int N){\n    BLAS_FUNC(ger)(&N,&N,&fone,X,&intone,Y,&intone,A,&N);\n  }\n\n  static inline void rot(gene_vector & A,  gene_vector & B, SCALAR c, SCALAR s, int N){\n    BLAS_FUNC(rot)(&N,A,&intone,B,&intone,&c,&s);\n  }\n\n  static inline void atv_product(gene_matrix & A, gene_vector & B, gene_vector & X, int N){\n    BLAS_FUNC(gemv)(&trans,&N,&N,&fone,A,&N,B,&intone,&fzero,X,&intone);\n  }\n\n  static inline void matrix_matrix_product(gene_matrix & A, gene_matrix & B, gene_matrix & X, int N){\n    BLAS_FUNC(gemm)(&notrans,&notrans,&N,&N,&N,&fone,A,&N,B,&N,&fzero,X,&N);\n  }\n\n  static inline void transposed_matrix_matrix_product(gene_matrix & A, gene_matrix & B, gene_matrix & X, int N){\n    BLAS_FUNC(gemm)(&notrans,&notrans,&N,&N,&N,&fone,A,&N,B,&N,&fzero,X,&N);\n  }\n\n//   static inline void ata_product(gene_matrix & A, gene_matrix & X, int N){\n//     ssyrk_(&lower,&trans,&N,&N,&fone,A,&N,&fzero,X,&N);\n//   }\n\n  static inline void aat_product(gene_matrix & A, gene_matrix & X, int N){\n    BLAS_FUNC(syrk)(&lower,&notrans,&N,&N,&fone,A,&N,&fzero,X,&N);\n  }\n\n  static inline void axpy(SCALAR coef, const gene_vector & X, gene_vector & Y, int N){\n    BLAS_FUNC(axpy)(&N,&coef,X,&intone,Y,&intone);\n  }\n\n  static inline void axpby(SCALAR a, const gene_vector & X, SCALAR b, gene_vector & Y, int N){\n    BLAS_FUNC(scal)(&N,&b,Y,&intone);\n    BLAS_FUNC(axpy)(&N,&a,X,&intone,Y,&intone);\n  }\n\n  static inline void cholesky(const gene_matrix & X, gene_matrix & C, int N){\n    int N2 = N*N;\n    BLAS_FUNC(copy)(&N2, X, &intone, C, &intone);\n    char uplo = 'L';\n    int info = 0;\n    BLAS_FUNC(potrf)(&uplo, &N, C, &N, &info);\n    if(info!=0) std::cerr << \"potrf_ error \" << info << \"\\n\";\n  }\n\n  static inline void partial_lu_decomp(const gene_matrix & X, gene_matrix & C, int N){\n    int N2 = N*N;\n    BLAS_FUNC(copy)(&N2, X, &intone, C, &intone);\n    char uplo = 'L';\n    int info = 0;\n    int * ipiv = (int*)alloca(sizeof(int)*N);\n    BLAS_FUNC(getrf)(&N, &N, C, &N, ipiv, &info);\n    if(info!=0) std::cerr << \"getrf_ error \" << info << \"\\n\";\n  }\n  \n  static inline void trisolve_lower(const gene_matrix & L, const gene_vector& B, gene_vector & X, int N){\n    BLAS_FUNC(copy)(&N, B, &intone, X, &intone);\n    BLAS_FUNC(trsv)(&lower, &notrans, &nonunit, &N, L, &N, X, &intone);\n  }\n\n  static inline void trisolve_lower_matrix(const gene_matrix & L, const gene_matrix& B, gene_matrix & X, int N){\n    BLAS_FUNC(copy)(&N, B, &intone, X, &intone);\n    BLAS_FUNC(trsm)(&right, &lower, &notrans, &nonunit, &N, &N, &fone, L, &N, X, &N);\n  }\n\n  static inline void trmm(gene_matrix & A, gene_matrix & B, gene_matrix & X, int N){\n    BLAS_FUNC(trmm)(&left, &lower, &notrans,&nonunit, &N,&N,&fone,A,&N,B,&N);\n  }\n\n  #ifdef HAS_LAPACK\n\n  static inline void lu_decomp(const gene_matrix & X, gene_matrix & C, int N){\n    int N2 = N*N;\n    BLAS_FUNC(copy)(&N2, X, &intone, C, &intone);\n    char uplo = 'L';\n    int info = 0;\n    int * ipiv = (int*)alloca(sizeof(int)*N);\n    int * jpiv = (int*)alloca(sizeof(int)*N);\n    BLAS_FUNC(getc2)(&N, C, &N, ipiv, jpiv, &info);\n  }\n\n\n\n  static inline void hessenberg(const gene_matrix & X, gene_matrix & C, int N){\n    {\n      int N2 = N*N;\n      int inc = 1;\n      BLAS_FUNC(copy)(&N2, X, &inc, C, &inc);\n    }\n    int info = 0;\n    int ilo = 1;\n    int ihi = N;\n    int bsize = 64;\n    int worksize = N*bsize;\n    SCALAR* d = new SCALAR[N+worksize];\n    BLAS_FUNC(gehrd)(&N, &ilo, &ihi, C, &N, d, d+N, &worksize, &info);\n    delete[] d;\n  }\n\n  static inline void tridiagonalization(const gene_matrix & X, gene_matrix & C, int N){\n    {\n      int N2 = N*N;\n      int inc = 1;\n      BLAS_FUNC(copy)(&N2, X, &inc, C, &inc);\n    }\n    char uplo = 'U';\n    int info = 0;\n    int ilo = 1;\n    int ihi = N;\n    int bsize = 64;\n    int worksize = N*bsize;\n    SCALAR* d = new SCALAR[3*N+worksize];\n    BLAS_FUNC(sytrd)(&uplo, &N, C, &N, d, d+N, d+2*N, d+3*N, &worksize, &info);\n    delete[] d;\n  }\n  \n  #endif // HAS_LAPACK\n\n};\n\nSCALAR blas_interface<SCALAR>::fone = SCALAR(1);\nSCALAR blas_interface<SCALAR>::fzero = SCALAR(0);\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/BLAS/c_interface_base.h",
    "content": "\n#ifndef BTL_C_INTERFACE_BASE_H\n#define BTL_C_INTERFACE_BASE_H\n\n#include \"utilities.h\"\n#include <vector>\n\ntemplate<class real> class c_interface_base\n{\n\npublic:\n\n  typedef real                      real_type;\n  typedef std::vector<real>         stl_vector;\n  typedef std::vector<stl_vector >  stl_matrix;\n\n  typedef real* gene_matrix;\n  typedef real* gene_vector;\n\n  static void free_matrix(gene_matrix & A, int N){\n    delete A;\n  }\n\n  static void free_vector(gene_vector & B){\n    delete B;\n  }\n\n  static inline void matrix_from_stl(gene_matrix & A, stl_matrix & A_stl){\n    int N = A_stl.size();\n    A = new real[N*N];\n    for (int j=0;j<N;j++)\n      for (int i=0;i<N;i++)\n        A[i+N*j] = A_stl[j][i];\n  }\n\n  static inline void vector_from_stl(gene_vector & B, stl_vector & B_stl){\n    int N = B_stl.size();\n    B = new real[N];\n    for (int i=0;i<N;i++)\n      B[i] = B_stl[i];\n  }\n\n  static inline void vector_to_stl(gene_vector & B, stl_vector & B_stl){\n    int N = B_stl.size();\n    for (int i=0;i<N;i++)\n      B_stl[i] = B[i];\n  }\n\n  static inline void matrix_to_stl(gene_matrix & A, stl_matrix & A_stl){\n    int N = A_stl.size();\n    for (int j=0;j<N;j++){\n      A_stl[j].resize(N);\n      for (int i=0;i<N;i++)\n        A_stl[j][i] = A[i+N*j];\n    }\n  }\n\n  static inline void copy_vector(const gene_vector & source, gene_vector & cible, int N){\n    for (int i=0;i<N;i++)\n      cible[i]=source[i];\n  }\n\n  static inline void copy_matrix(const gene_matrix & source, gene_matrix & cible, int N){\n    for (int j=0;j<N;j++){\n      for (int i=0;i<N;i++){\n        cible[i+N*j] = source[i+N*j];\n      }\n    }\n  }\n\n};\n\n#endif\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/BLAS/main.cpp",
    "content": "//=====================================================\n// File   :  main.cpp\n// Author :  L. Plagne <laurent.plagne@edf.fr)>\n// Copyright (C) EDF R&D,  lun sep 30 14:23:28 CEST 2002\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#include \"utilities.h\"\n#include \"blas_interface.hh\"\n#include \"bench.hh\"\n#include \"basic_actions.hh\"\n\n#include \"action_cholesky.hh\"\n#include \"action_lu_decomp.hh\"\n#include \"action_partial_lu.hh\"\n#include \"action_trisolve_matrix.hh\"\n\n#ifdef HAS_LAPACK\n#include \"action_hessenberg.hh\"\n#endif\n\nBTL_MAIN;\n\nint main()\n{\n\n  bench<Action_axpy<blas_interface<REAL_TYPE> > >(MIN_AXPY,MAX_AXPY,NB_POINT);\n  bench<Action_axpby<blas_interface<REAL_TYPE> > >(MIN_AXPY,MAX_AXPY,NB_POINT);\n\n  bench<Action_matrix_vector_product<blas_interface<REAL_TYPE> > >(MIN_MV,MAX_MV,NB_POINT);\n  bench<Action_atv_product<blas_interface<REAL_TYPE> > >(MIN_MV,MAX_MV,NB_POINT);\n  bench<Action_symv<blas_interface<REAL_TYPE> > >(MIN_MV,MAX_MV,NB_POINT);\n  bench<Action_syr2<blas_interface<REAL_TYPE> > >(MIN_MV,MAX_MV,NB_POINT);\n\n  bench<Action_ger<blas_interface<REAL_TYPE> > >(MIN_MV,MAX_MV,NB_POINT);\n  bench<Action_rot<blas_interface<REAL_TYPE> > >(MIN_AXPY,MAX_AXPY,NB_POINT);\n\n  bench<Action_matrix_matrix_product<blas_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n//   bench<Action_ata_product<blas_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n  bench<Action_aat_product<blas_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n\n  bench<Action_trisolve<blas_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n  bench<Action_trisolve_matrix<blas_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n\n  bench<Action_trmm<blas_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n\n  bench<Action_cholesky<blas_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n  bench<Action_partial_lu<blas_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n\n  #ifdef HAS_LAPACK\n  bench<Action_lu_decomp<blas_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n  bench<Action_hessenberg<blas_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n  bench<Action_tridiagonalization<blas_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n  #endif\n\n  //bench<Action_lu_solve<blas_LU_solve_interface<REAL_TYPE> > >(MIN_LU,MAX_LU,NB_POINT);\n\n  return 0;\n}\n\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/STL/CMakeLists.txt",
    "content": "\nbtl_add_bench(btl_STL main.cpp OFF)\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/STL/STL_interface.hh",
    "content": "//=====================================================\n// File   :  STL_interface.hh\n// Author :  L. Plagne <laurent.plagne@edf.fr)>\n// Copyright (C) EDF R&D,  lun sep 30 14:23:24 CEST 2002\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#ifndef STL_INTERFACE_HH\n#define STL_INTERFACE_HH\n#include <string>\n#include <vector>\n#include \"utilities.h\"\n\nusing namespace std;\n\ntemplate<class real>\nclass STL_interface{\n\npublic :\n\n  typedef real real_type ;\n\n  typedef std::vector<real>  stl_vector;\n  typedef std::vector<stl_vector > stl_matrix;\n\n  typedef stl_matrix gene_matrix;\n\n  typedef stl_vector gene_vector;\n\n  static inline std::string name( void )\n  {\n    return \"STL\";\n  }\n\n  static void free_matrix(gene_matrix & A, int N){}\n\n  static void free_vector(gene_vector & B){}\n\n  static inline void matrix_from_stl(gene_matrix & A, stl_matrix & A_stl){\n    A = A_stl;\n  }\n\n  static inline void vector_from_stl(gene_vector & B, stl_vector & B_stl){\n    B = B_stl;\n  }\n\n  static inline void vector_to_stl(gene_vector & B, stl_vector & B_stl){\n    B_stl = B ;\n  }\n\n\n  static inline void matrix_to_stl(gene_matrix & A, stl_matrix & A_stl){\n    A_stl = A ;\n  }\n\n  static inline void copy_vector(const gene_vector & source, gene_vector & cible, int N){\n    for (int i=0;i<N;i++){\n      cible[i]=source[i];\n    }\n  }\n\n\n  static inline void copy_matrix(const gene_matrix & source, gene_matrix & cible, int N){\n    for (int i=0;i<N;i++)\n      for (int j=0;j<N;j++)\n        cible[i][j]=source[i][j];\n  }\n\n//   static inline void ata_product(const gene_matrix & A, gene_matrix & X, int N)\n//   {\n//     real somme;\n//     for (int j=0;j<N;j++){\n//       for (int i=0;i<N;i++){\n//         somme=0.0;\n//         for (int k=0;k<N;k++)\n//           somme += A[i][k]*A[j][k];\n//         X[j][i]=somme;\n//       }\n//     }\n//   }\n\n  static inline void aat_product(const gene_matrix & A, gene_matrix & X, int N)\n  {\n    real somme;\n    for (int j=0;j<N;j++){\n      for (int i=0;i<N;i++){\n        somme=0.0;\n        if(i>=j)\n        {\n          for (int k=0;k<N;k++){\n            somme+=A[k][i]*A[k][j];\n          }\n          X[j][i]=somme;\n        }\n      }\n    }\n  }\n\n\n  static inline void matrix_matrix_product(const gene_matrix & A, const gene_matrix & B, gene_matrix & X, int N)\n  {\n    real somme;\n    for (int j=0;j<N;j++){\n      for (int i=0;i<N;i++){\n        somme=0.0;\n        for (int k=0;k<N;k++)\n          somme+=A[k][i]*B[j][k];\n        X[j][i]=somme;\n      }\n    }\n  }\n\n  static inline void matrix_vector_product(gene_matrix & A, gene_vector & B, gene_vector & X, int N)\n  {\n    real somme;\n    for (int i=0;i<N;i++){\n      somme=0.0;\n      for (int j=0;j<N;j++)\n        somme+=A[j][i]*B[j];\n      X[i]=somme;\n    }\n  }\n\n  static inline void symv(gene_matrix & A, gene_vector & B, gene_vector & X, int N)\n  {\n    for (int j=0; j<N; ++j)\n      X[j] = 0;\n    for (int j=0; j<N; ++j)\n    {\n      real t1 = B[j];\n      real t2 = 0;\n      X[j] += t1 * A[j][j];\n      for (int i=j+1; i<N; ++i) {\n        X[i] += t1 * A[j][i];\n        t2 += A[j][i] * B[i];\n      }\n      X[j] += t2;\n    }\n  }\n  \n  static inline void syr2(gene_matrix & A, gene_vector & B, gene_vector & X, int N)\n  {\n    for (int j=0; j<N; ++j)\n    {\n      for (int i=j; i<N; ++i)\n        A[j][i] += B[i]*X[j] + B[j]*X[i];\n    }\n  }\n\n  static inline void ger(gene_matrix & A, gene_vector & X, gene_vector & Y, int N)\n  {\n    for (int j=0; j<N; ++j)\n    {\n      for (int i=j; i<N; ++i)\n        A[j][i] += X[i]*Y[j];\n    }\n  }\n\n  static inline void atv_product(gene_matrix & A, gene_vector & B, gene_vector & X, int N)\n  {\n    real somme;\n    for (int i=0;i<N;i++){\n      somme = 0.0;\n      for (int j=0;j<N;j++)\n        somme += A[i][j]*B[j];\n      X[i] = somme;\n    }\n  }\n\n  static inline void axpy(real coef, const gene_vector & X, gene_vector & Y, int N){\n    for (int i=0;i<N;i++)\n      Y[i]+=coef*X[i];\n  }\n\n  static inline void axpby(real a, const gene_vector & X, real b, gene_vector & Y, int N){\n    for (int i=0;i<N;i++)\n      Y[i] = a*X[i] + b*Y[i];\n  }\n\n  static inline void trisolve_lower(const gene_matrix & L, const gene_vector & B, gene_vector & X, int N){\n    copy_vector(B,X,N);\n    for(int i=0; i<N; ++i)\n    {\n      X[i] /= L[i][i];\n      real tmp = X[i];\n      for (int j=i+1; j<N; ++j)\n        X[j] -= tmp * L[i][j];\n    }\n  }\n\n  static inline real norm_diff(const stl_vector & A, const stl_vector & B)\n  {\n    int N=A.size();\n    real somme=0.0;\n    real somme2=0.0;\n\n    for (int i=0;i<N;i++){\n      real diff=A[i]-B[i];\n      somme+=diff*diff;\n      somme2+=A[i]*A[i];\n    }\n    return somme/somme2;\n  }\n\n  static inline real norm_diff(const stl_matrix & A, const stl_matrix & B)\n  {\n    int N=A[0].size();\n    real somme=0.0;\n    real somme2=0.0;\n\n    for (int i=0;i<N;i++){\n      for (int j=0;j<N;j++){\n        real diff=A[i][j] - B[i][j];\n        somme += diff*diff;\n        somme2 += A[i][j]*A[i][j];\n      }\n    }\n\n    return somme/somme2;\n  }\n\n  static inline void display_vector(const stl_vector & A)\n  {\n    int N=A.size();\n    for (int i=0;i<N;i++){\n      INFOS(\"A[\"<<i<<\"]=\"<<A[i]<<endl);\n    }\n  }\n\n};\n\n#endif\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/STL/main.cpp",
    "content": "//=====================================================\n// File   :  main.cpp\n// Author :  L. Plagne <laurent.plagne@edf.fr)>\n// Copyright (C) EDF R&D,  lun sep 30 14:23:23 CEST 2002\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#include \"utilities.h\"\n#include \"STL_interface.hh\"\n#include \"bench.hh\"\n#include \"basic_actions.hh\"\n\nBTL_MAIN;\n\nint main()\n{\n  bench<Action_axpy<STL_interface<REAL_TYPE> > >(MIN_AXPY,MAX_AXPY,NB_POINT);\n  bench<Action_axpby<STL_interface<REAL_TYPE> > >(MIN_AXPY,MAX_AXPY,NB_POINT);\n  bench<Action_matrix_vector_product<STL_interface<REAL_TYPE> > >(MIN_MV,MAX_MV,NB_POINT);\n  bench<Action_atv_product<STL_interface<REAL_TYPE> > >(MIN_MV,MAX_MV,NB_POINT);\n  bench<Action_symv<STL_interface<REAL_TYPE> > >(MIN_MV,MAX_MV,NB_POINT);\n  bench<Action_syr2<STL_interface<REAL_TYPE> > >(MIN_MV,MAX_MV,NB_POINT);\n  bench<Action_matrix_matrix_product<STL_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n  bench<Action_ata_product<STL_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n  bench<Action_aat_product<STL_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n\n  return 0;\n}\n\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/blitz/CMakeLists.txt",
    "content": "\nfind_package(Blitz)\n\nif (BLITZ_FOUND)\n  include_directories(${BLITZ_INCLUDES})\n\n  btl_add_bench(btl_blitz btl_blitz.cpp)\n  if (BUILD_btl_blitz)\n    target_link_libraries(btl_blitz ${BLITZ_LIBRARIES})\n  endif (BUILD_btl_blitz)\n\n  btl_add_bench(btl_tiny_blitz btl_tiny_blitz.cpp OFF)\n  if (BUILD_btl_tiny_blitz)\n    target_link_libraries(btl_tiny_blitz ${BLITZ_LIBRARIES})\n  endif (BUILD_btl_tiny_blitz)\n\nendif (BLITZ_FOUND)\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/blitz/blitz_LU_solve_interface.hh",
    "content": "//=====================================================\n// File   :  blitz_LU_solve_interface.hh\n// Author :  L. Plagne <laurent.plagne@edf.fr)>        \n// Copyright (C) EDF R&D,  lun sep 30 14:23:31 CEST 2002\n//=====================================================\n// \n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n// \n#ifndef BLITZ_LU_SOLVE_INTERFACE_HH\n#define BLITZ_LU_SOLVE_INTERFACE_HH\n\n#include \"blitz/array.h\"\n#include <vector>\n\nBZ_USING_NAMESPACE(blitz)\n\ntemplate<class real>\nclass blitz_LU_solve_interface : public blitz_interface<real>\n{\n\npublic :\n\n  typedef typename blitz_interface<real>::gene_matrix gene_matrix;\n  typedef typename blitz_interface<real>::gene_vector gene_vector;\n\n  typedef blitz::Array<int,1> Pivot_Vector;\n\n  inline static void new_Pivot_Vector(Pivot_Vector & pivot,int N)\n  {\n\n    pivot.resize(N);\n\n  }\n\n  inline static void free_Pivot_Vector(Pivot_Vector & pivot)\n  {\n    \n    return;\n\n  }\n\n\n  static inline real matrix_vector_product_sliced(const gene_matrix & A, gene_vector B, int row, int col_start, int col_end)\n  {\n    \n    real somme=0.;\n    \n    for (int j=col_start ; j<col_end+1 ; j++){\n\t\n\tsomme+=A(row,j)*B(j);\n\t\n    }\n\n    return somme;\n\n  }\n\n\n\n\n  static inline real matrix_matrix_product_sliced(gene_matrix & A, int row, int col_start, int col_end, gene_matrix & B, int row_shift, int col )\n  {\n    \n    real somme=0.;\n    \n    for (int j=col_start ; j<col_end+1 ; j++){\n\t\n\tsomme+=A(row,j)*B(j+row_shift,col);\n\t\n    }\n\n    return somme;\n\n  }\n\n  inline static void LU_factor(gene_matrix & LU, Pivot_Vector & pivot, int N)\n  {\n\n    ASSERT( LU.rows()==LU.cols() ) ;\n    int index_max = 0 ;\n    real big = 0. ;\n    real theSum = 0. ;\n    real dum = 0. ;\n    // Get the implicit scaling information :\n    gene_vector ImplicitScaling( N ) ;\n    for( int i=0; i<N; i++ ) {\n      big = 0. ;\n      for( int j=0; j<N; j++ ) {\n\tif( abs( LU( i, j ) )>=big ) big = abs( LU( i, j ) ) ;\n      }\n      if( big==0. ) {\n\tINFOS( \"blitz_LU_factor::Singular matrix\" ) ;\n\texit( 0 ) ;\n      }\n      ImplicitScaling( i ) = 1./big ;\n    }\n    // Loop over columns of Crout's method :\n    for( int j=0; j<N; j++ ) {\n      for( int i=0; i<j; i++ ) {\n\ttheSum = LU( i, j ) ;\n\ttheSum -= matrix_matrix_product_sliced(LU, i, 0, i-1, LU, 0, j) ;\n\t//\ttheSum -= sum( LU( i, Range( fromStart, i-1 ) )*LU( Range( fromStart, i-1 ), j ) ) ;\n\tLU( i, j ) = theSum ;\n      }\n      \n      // Search for the largest pivot element :\n      big = 0. ;\n      for( int i=j; i<N; i++ ) {\n\ttheSum = LU( i, j ) ;\n\ttheSum -= matrix_matrix_product_sliced(LU, i, 0, j-1, LU, 0, j) ;\n\t//\ttheSum -= sum( LU( i, Range( fromStart, j-1 ) )*LU( Range( fromStart, j-1 ), j ) ) ;\n\tLU( i, j ) = theSum ;\n\tif( (ImplicitScaling( i )*abs( theSum ))>=big ) {\n\t  dum = ImplicitScaling( i )*abs( theSum ) ;\n\t  big = dum ;\n\t  index_max = i ;\n\t}\n      }\n      // Interchanging rows and the scale factor :\n      if( j!=index_max ) {\n\tfor( int k=0; k<N; k++ ) {\n\t  dum = LU( index_max, k ) ;\n\t  LU( index_max, k ) = LU( j, k ) ;\n\t  LU( j, k ) = dum ;\n\t}\n\tImplicitScaling( index_max ) = ImplicitScaling( j ) ;\n      }\n      pivot( j ) = index_max ;\n      if ( LU( j, j )==0. ) LU( j, j ) = 1.e-20 ;\n      // Divide by the pivot element :\n      if( j<N ) {\n\tdum = 1./LU( j, j ) ;\n\tfor( int i=j+1; i<N; i++ ) LU( i, j ) *= dum ;\n      }\n    }\n\n  }\n\n  inline static void LU_solve(const gene_matrix & LU, const Pivot_Vector pivot, gene_vector &B, gene_vector X, int N)\n  {\n\n    // Pour conserver le meme header, on travaille sur X, copie du second-membre B\n    X = B.copy() ;\n    ASSERT( LU.rows()==LU.cols() ) ;\n    firstIndex indI ;\n    // Forward substitution :\n    int ii = 0 ;\n    real theSum = 0. ;\n    for( int i=0; i<N; i++ ) {\n      int ip = pivot( i ) ;\n      theSum = X( ip ) ;\n      //      theSum = B( ip ) ;\n      X( ip ) = X( i ) ;\n      //      B( ip ) = B( i ) ;\n      if( ii ) {\n\ttheSum -= matrix_vector_product_sliced(LU, X, i, ii-1, i-1) ;\n\t//\ttheSum -= sum( LU( i, Range( ii-1, i-1 ) )*X( Range( ii-1, i-1 ) ) ) ;\n\t//\ttheSum -= sum( LU( i, Range( ii-1, i-1 ) )*B( Range( ii-1, i-1 ) ) ) ;\n      } else if( theSum ) {\n\tii = i+1 ;\n      }\n      X( i ) = theSum ;\n      //      B( i ) = theSum ;\n    }\n    // Backsubstitution :\n    for( int i=N-1; i>=0; i-- ) {\n      theSum = X( i ) ;\n      //      theSum = B( i ) ;\n      theSum -= matrix_vector_product_sliced(LU, X, i, i+1, N) ;\n      //      theSum -= sum( LU( i, Range( i+1, toEnd ) )*X( Range( i+1, toEnd ) ) ) ;\n      //      theSum -= sum( LU( i, Range( i+1, toEnd ) )*B( Range( i+1, toEnd ) ) ) ;\n      // Store a component of the solution vector :\n      X( i ) = theSum/LU( i, i ) ;\n      //      B( i ) = theSum/LU( i, i ) ;\n    }\n\n  }\n\n};\n\n#endif\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/blitz/blitz_interface.hh",
    "content": "//=====================================================\n// File   :  blitz_interface.hh\n// Author :  L. Plagne <laurent.plagne@edf.fr)>\n// Copyright (C) EDF R&D,  lun sep 30 14:23:30 CEST 2002\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#ifndef BLITZ_INTERFACE_HH\n#define BLITZ_INTERFACE_HH\n\n#include <blitz/blitz.h>\n#include <blitz/array.h>\n#include <blitz/vector-et.h>\n#include <blitz/vecwhere.h>\n#include <blitz/matrix.h>\n#include <vector>\n\nBZ_USING_NAMESPACE(blitz)\n\ntemplate<class real>\nclass blitz_interface{\n\npublic :\n\n  typedef real real_type ;\n\n  typedef std::vector<real>  stl_vector;\n  typedef std::vector<stl_vector > stl_matrix;\n\n  typedef blitz::Array<real, 2>  gene_matrix;\n  typedef blitz::Array<real, 1>  gene_vector;\n//   typedef blitz::Matrix<real, blitz::ColumnMajor>  gene_matrix;\n//   typedef blitz::Vector<real> gene_vector;\n\n  static inline std::string name() { return \"blitz\"; }\n\n  static void free_matrix(gene_matrix & A, int N){}\n\n  static void free_vector(gene_vector & B){}\n\n  static inline void matrix_from_stl(gene_matrix & A, stl_matrix & A_stl){\n    A.resize(A_stl[0].size(),A_stl.size());\n    for (int j=0; j<A_stl.size() ; j++){\n      for (int i=0; i<A_stl[j].size() ; i++){\n        A(i,j)=A_stl[j][i];\n      }\n    }\n  }\n\n  static inline void vector_from_stl(gene_vector & B, stl_vector & B_stl){\n    B.resize(B_stl.size());\n    for (int i=0; i<B_stl.size() ; i++){\n      B(i)=B_stl[i];\n    }\n  }\n\n  static inline void vector_to_stl(gene_vector & B, stl_vector & B_stl){\n    for (int i=0; i<B_stl.size() ; i++){\n      B_stl[i]=B(i);\n    }\n  }\n\n  static inline void matrix_to_stl(gene_matrix & A, stl_matrix & A_stl){\n    int N=A_stl.size();\n    for (int j=0;j<N;j++){\n      A_stl[j].resize(N);\n      for (int i=0;i<N;i++)\n        A_stl[j][i] = A(i,j);\n    }\n  }\n\n  static inline void matrix_matrix_product(const gene_matrix & A, const gene_matrix & B, gene_matrix & X, int N)\n  {\n    firstIndex i;\n    secondIndex j;\n    thirdIndex k;\n    X = sum(A(i,k) * B(k,j), k);\n  }\n\n  static inline void ata_product(const gene_matrix & A, gene_matrix & X, int N)\n  {\n    firstIndex i;\n    secondIndex j;\n    thirdIndex k;\n    X = sum(A(k,i) * A(k,j), k);\n  }\n\n  static inline void aat_product(const gene_matrix & A, gene_matrix & X, int N)\n  {\n    firstIndex i;\n    secondIndex j;\n    thirdIndex k;\n    X = sum(A(i,k) * A(j,k), k);\n  }\n\n  static inline void matrix_vector_product(gene_matrix & A, gene_vector & B, gene_vector & X, int N)\n  {\n    firstIndex i;\n    secondIndex j;\n    X = sum(A(i,j)*B(j),j);\n  }\n\n  static inline void atv_product(gene_matrix & A, gene_vector & B, gene_vector & X, int N)\n  {\n    firstIndex i;\n    secondIndex j;\n    X = sum(A(j,i) * B(j),j);\n  }\n\n  static inline void axpy(const real coef, const gene_vector & X, gene_vector & Y, int N)\n  {\n    firstIndex i;\n    Y = Y(i) + coef * X(i);\n    //Y += coef * X;\n  }\n\n  static inline void copy_matrix(const gene_matrix & source, gene_matrix & cible, int N){\n    cible = source;\n    //cible.template operator=<gene_matrix>(source);\n//     for (int i=0;i<N;i++){\n//       for (int j=0;j<N;j++){\n//         cible(i,j)=source(i,j);\n//       }\n//     }\n  }\n\n  static inline void copy_vector(const gene_vector & source, gene_vector & cible, int N){\n    //cible.template operator=<gene_vector>(source);\n    cible = source;\n  }\n\n};\n\n#endif\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/blitz/btl_blitz.cpp",
    "content": "//=====================================================\n// File   :  main.cpp\n// Author :  L. Plagne <laurent.plagne@edf.fr)>\n// Copyright (C) EDF R&D,  lun sep 30 14:23:30 CEST 2002\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#include \"utilities.h\"\n#include \"blitz_interface.hh\"\n#include \"blitz_LU_solve_interface.hh\"\n#include \"bench.hh\"\n#include \"action_matrix_vector_product.hh\"\n#include \"action_matrix_matrix_product.hh\"\n#include \"action_axpy.hh\"\n#include \"action_lu_solve.hh\"\n#include \"action_ata_product.hh\"\n#include \"action_aat_product.hh\"\n#include \"action_atv_product.hh\"\n\nBTL_MAIN;\n\nint main()\n{\n\n  bench<Action_matrix_vector_product<blitz_interface<REAL_TYPE> > >(MIN_MV,MAX_MV,NB_POINT);\n  bench<Action_atv_product<blitz_interface<REAL_TYPE> > >(MIN_MV,MAX_MV,NB_POINT);\n\n  bench<Action_matrix_matrix_product<blitz_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n  bench<Action_ata_product<blitz_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n  bench<Action_aat_product<blitz_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n\n  bench<Action_axpy<blitz_interface<REAL_TYPE> > >(MIN_AXPY,MAX_AXPY,NB_POINT);\n\n  //bench<Action_lu_solve<blitz_LU_solve_interface<REAL_TYPE> > >(MIN_LU,MAX_LU,NB_POINT);\n\n  return 0;\n}\n\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/blitz/btl_tiny_blitz.cpp",
    "content": "//=====================================================\n// File   :  main.cpp\n// Author :  L. Plagne <laurent.plagne@edf.fr)>\n// Copyright (C) EDF R&D,  lun sep 30 14:23:30 CEST 2002\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#include \"utilities.h\"\n#include \"tiny_blitz_interface.hh\"\n#include \"static/bench_static.hh\"\n#include \"action_matrix_vector_product.hh\"\n#include \"action_matrix_matrix_product.hh\"\n#include \"action_axpy.hh\"\n\nBTL_MAIN;\n\nint main()\n{\n  bench_static<Action_axpy,tiny_blitz_interface>();\n  bench_static<Action_matrix_matrix_product,tiny_blitz_interface>();\n  bench_static<Action_matrix_vector_product,tiny_blitz_interface>();\n\n  return 0;\n}\n\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/blitz/tiny_blitz_interface.hh",
    "content": "//=====================================================\n// File   :  tiny_blitz_interface.hh\n// Author :  L. Plagne <laurent.plagne@edf.fr)>\n// Copyright (C) EDF R&D,  lun sep 30 14:23:30 CEST 2002\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#ifndef TINY_BLITZ_INTERFACE_HH\n#define TINY_BLITZ_INTERFACE_HH\n\n#include \"blitz/array.h\"\n#include \"blitz/tiny.h\"\n#include \"blitz/tinymat.h\"\n#include \"blitz/tinyvec.h\"\n#include <blitz/tinyvec-et.h>\n\n#include <vector>\n\nBZ_USING_NAMESPACE(blitz)\n\ntemplate<class real, int SIZE>\nclass tiny_blitz_interface\n{\n\npublic :\n\n  typedef real real_type ;\n\n  typedef std::vector<real>  stl_vector;\n  typedef std::vector<stl_vector > stl_matrix;\n\n  typedef TinyVector<real,SIZE> gene_vector;\n  typedef TinyMatrix<real,SIZE,SIZE> gene_matrix;\n\n  static inline std::string name() { return \"tiny_blitz\"; }\n\n  static void free_matrix(gene_matrix & A, int N){}\n\n  static void free_vector(gene_vector & B){}\n\n  static inline void matrix_from_stl(gene_matrix & A, stl_matrix & A_stl){\n    for (int j=0; j<A_stl.size() ; j++)\n      for (int i=0; i<A_stl[j].size() ; i++)\n        A(i,j)=A_stl[j][i];\n  }\n\n  static inline void vector_from_stl(gene_vector & B, stl_vector & B_stl){\n    for (int i=0; i<B_stl.size() ; i++)\n      B(i) = B_stl[i];\n  }\n\n  static inline void vector_to_stl(gene_vector & B, stl_vector & B_stl){\n    for (int i=0; i<B_stl.size() ; i++)\n      B_stl[i] = B(i);\n  }\n\n  static inline void matrix_to_stl(gene_matrix & A, stl_matrix & A_stl){\n    int N = A_stl.size();\n    for (int j=0;j<N;j++)\n    {\n      A_stl[j].resize(N);\n      for (int i=0;i<N;i++)\n        A_stl[j][i] = A(i,j);\n    }\n  }\n\n  static inline void copy_matrix(const gene_matrix & source, gene_matrix & cible, int N){\n    for (int j=0;j<N;j++)\n      for (int i=0;i<N;i++)\n        cible(i,j) = source(i,j);\n  }\n\n  static inline void copy_vector(const gene_vector & source, gene_vector & cible, int N){\n    for (int i=0;i<N;i++){\n      cible(i) = source(i);\n    }\n  }\n\n  static inline void matrix_matrix_product(const gene_matrix & A, const gene_matrix & B, gene_matrix & X, int N){\n    X = product(A,B);\n  }\n\n  static inline void matrix_vector_product(gene_matrix & A, gene_vector & B, gene_vector & X, int N){\n    X = product(A,B);\n  }\n\n  static inline void axpy(const real coef, const gene_vector & X, gene_vector & Y, int N){\n    Y += coef * X;\n  }\n\n};\n\n\n#endif\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/eigen2/CMakeLists.txt",
    "content": "\nfind_package(Eigen2)\n\nif(EIGEN2_FOUND)\n\n  include_directories(BEFORE ${EIGEN2_INCLUDE_DIR})\n  btl_add_bench(btl_eigen2_linear main_linear.cpp)\n  btl_add_bench(btl_eigen2_vecmat main_vecmat.cpp)\n  btl_add_bench(btl_eigen2_matmat main_matmat.cpp)\n  btl_add_bench(btl_eigen2_adv main_adv.cpp      )\n\n  btl_add_target_property(btl_eigen2_linear COMPILE_FLAGS \"-fno-exceptions -DBTL_PREFIX=eigen2\")\n  btl_add_target_property(btl_eigen2_vecmat COMPILE_FLAGS \"-fno-exceptions -DBTL_PREFIX=eigen2\")\n  btl_add_target_property(btl_eigen2_matmat COMPILE_FLAGS \"-fno-exceptions -DBTL_PREFIX=eigen2\")\n  btl_add_target_property(btl_eigen2_adv    COMPILE_FLAGS \"-fno-exceptions -DBTL_PREFIX=eigen2\")\n\n  btl_add_bench(btl_tiny_eigen2 btl_tiny_eigen2.cpp OFF)\n\nendif() # EIGEN2_FOUND\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/eigen2/btl_tiny_eigen2.cpp",
    "content": "//=====================================================\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#include \"utilities.h\"\n#include \"eigen3_interface.hh\"\n#include \"static/bench_static.hh\"\n#include \"action_matrix_vector_product.hh\"\n#include \"action_matrix_matrix_product.hh\"\n#include \"action_axpy.hh\"\n#include \"action_lu_solve.hh\"\n#include \"action_ata_product.hh\"\n#include \"action_aat_product.hh\"\n#include \"action_atv_product.hh\"\n#include \"action_cholesky.hh\"\n#include \"action_trisolve.hh\"\n\nBTL_MAIN;\n\nint main()\n{\n\n  bench_static<Action_axpy,eigen2_interface>();\n  bench_static<Action_matrix_matrix_product,eigen2_interface>();\n  bench_static<Action_matrix_vector_product,eigen2_interface>();\n  bench_static<Action_atv_product,eigen2_interface>();\n  bench_static<Action_cholesky,eigen2_interface>();\n  bench_static<Action_trisolve,eigen2_interface>();\n\n  return 0;\n}\n\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/eigen2/eigen2_interface.hh",
    "content": "//=====================================================\n// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#ifndef EIGEN2_INTERFACE_HH\n#define EIGEN2_INTERFACE_HH\n// #include <cblas.h>\n#include <Eigen/Core>\n#include <Eigen/Cholesky>\n#include <Eigen/LU>\n#include <Eigen/QR>\n#include <vector>\n#include \"btl.hh\"\n\nusing namespace Eigen;\n\ntemplate<class real, int SIZE=Dynamic>\nclass eigen2_interface\n{\n\npublic :\n\n  enum {IsFixedSize = (SIZE!=Dynamic)};\n\n  typedef real real_type;\n\n  typedef std::vector<real> stl_vector;\n  typedef std::vector<stl_vector> stl_matrix;\n\n  typedef Eigen::Matrix<real,SIZE,SIZE> gene_matrix;\n  typedef Eigen::Matrix<real,SIZE,1> gene_vector;\n\n  static inline std::string name( void )\n  {\n    #if defined(EIGEN_VECTORIZE_SSE)\n    if (SIZE==Dynamic) return \"eigen2\"; else return \"tiny_eigen2\";\n    #elif defined(EIGEN_VECTORIZE_ALTIVEC)\n    if (SIZE==Dynamic) return \"eigen2\"; else return \"tiny_eigen2\";\n    #else\n    if (SIZE==Dynamic) return \"eigen2_novec\"; else return \"tiny_eigen2_novec\";\n    #endif\n  }\n\n  static void free_matrix(gene_matrix & A, int N) {}\n\n  static void free_vector(gene_vector & B) {}\n\n  static BTL_DONT_INLINE void matrix_from_stl(gene_matrix & A, stl_matrix & A_stl){\n    A.resize(A_stl[0].size(), A_stl.size());\n\n    for (int j=0; j<A_stl.size() ; j++){\n      for (int i=0; i<A_stl[j].size() ; i++){\n        A.coeffRef(i,j) = A_stl[j][i];\n      }\n    }\n  }\n\n  static BTL_DONT_INLINE  void vector_from_stl(gene_vector & B, stl_vector & B_stl){\n    B.resize(B_stl.size(),1);\n\n    for (int i=0; i<B_stl.size() ; i++){\n      B.coeffRef(i) = B_stl[i];\n    }\n  }\n\n  static BTL_DONT_INLINE  void vector_to_stl(gene_vector & B, stl_vector & B_stl){\n    for (int i=0; i<B_stl.size() ; i++){\n      B_stl[i] = B.coeff(i);\n    }\n  }\n\n  static BTL_DONT_INLINE  void matrix_to_stl(gene_matrix & A, stl_matrix & A_stl){\n    int N=A_stl.size();\n\n    for (int j=0;j<N;j++){\n      A_stl[j].resize(N);\n      for (int i=0;i<N;i++){\n        A_stl[j][i] = A.coeff(i,j);\n      }\n    }\n  }\n\n  static inline void matrix_matrix_product(const gene_matrix & A, const gene_matrix & B, gene_matrix & X, int N){\n    X = (A*B).lazy();\n  }\n\n  static inline void transposed_matrix_matrix_product(const gene_matrix & A, const gene_matrix & B, gene_matrix & X, int N){\n    X = (A.transpose()*B.transpose()).lazy();\n  }\n\n  static inline void ata_product(const gene_matrix & A, gene_matrix & X, int N){\n    X = (A.transpose()*A).lazy();\n  }\n\n  static inline void aat_product(const gene_matrix & A, gene_matrix & X, int N){\n    X = (A*A.transpose()).lazy();\n  }\n\n  static inline void matrix_vector_product(const gene_matrix & A, const gene_vector & B, gene_vector & X, int N){\n    X = (A*B)/*.lazy()*/;\n  }\n\n  static inline void atv_product(gene_matrix & A, gene_vector & B, gene_vector & X, int N){\n    X = (A.transpose()*B)/*.lazy()*/;\n  }\n\n  static inline void axpy(real coef, const gene_vector & X, gene_vector & Y, int N){\n    Y += coef * X;\n  }\n\n  static inline void axpby(real a, const gene_vector & X, real b, gene_vector & Y, int N){\n    Y = a*X + b*Y;\n  }\n\n  static inline void copy_matrix(const gene_matrix & source, gene_matrix & cible, int N){\n    cible = source;\n  }\n\n  static inline void copy_vector(const gene_vector & source, gene_vector & cible, int N){\n    cible = source;\n  }\n\n  static inline void trisolve_lower(const gene_matrix & L, const gene_vector& B, gene_vector& X, int N){\n    X = L.template marked<LowerTriangular>().solveTriangular(B);\n  }\n\n  static inline void trisolve_lower_matrix(const gene_matrix & L, const gene_matrix& B, gene_matrix& X, int N){\n    X = L.template marked<LowerTriangular>().solveTriangular(B);\n  }\n\n  static inline void cholesky(const gene_matrix & X, gene_matrix & C, int N){\n    C = X.llt().matrixL();\n//     C = X;\n//     Cholesky<gene_matrix>::computeInPlace(C);\n//     Cholesky<gene_matrix>::computeInPlaceBlock(C);\n  }\n\n  static inline void lu_decomp(const gene_matrix & X, gene_matrix & C, int N){\n    C = X.lu().matrixLU();\n//     C = X.inverse();\n  }\n\n  static inline void tridiagonalization(const gene_matrix & X, gene_matrix & C, int N){\n    C = Tridiagonalization<gene_matrix>(X).packedMatrix();\n  }\n\n  static inline void hessenberg(const gene_matrix & X, gene_matrix & C, int N){\n    C = HessenbergDecomposition<gene_matrix>(X).packedMatrix();\n  }\n\n\n\n};\n\n#endif\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/eigen2/main_adv.cpp",
    "content": "//=====================================================\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#include \"utilities.h\"\n#include \"eigen2_interface.hh\"\n#include \"bench.hh\"\n#include \"action_trisolve.hh\"\n#include \"action_trisolve_matrix.hh\"\n#include \"action_cholesky.hh\"\n#include \"action_hessenberg.hh\"\n#include \"action_lu_decomp.hh\"\n// #include \"action_partial_lu.hh\"\n\nBTL_MAIN;\n\nint main()\n{\n  bench<Action_trisolve<eigen2_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n  bench<Action_trisolve_matrix<eigen2_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n  bench<Action_cholesky<eigen2_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n  bench<Action_lu_decomp<eigen2_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n//   bench<Action_partial_lu<eigen2_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n\n  bench<Action_hessenberg<eigen2_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n  bench<Action_tridiagonalization<eigen2_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n\n  return 0;\n}\n\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/eigen2/main_linear.cpp",
    "content": "//=====================================================\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#include \"utilities.h\"\n#include \"eigen2_interface.hh\"\n#include \"bench.hh\"\n#include \"basic_actions.hh\"\n\nBTL_MAIN;\n\nint main()\n{\n\n  bench<Action_axpy<eigen2_interface<REAL_TYPE> > >(MIN_AXPY,MAX_AXPY,NB_POINT);\n  bench<Action_axpby<eigen2_interface<REAL_TYPE> > >(MIN_AXPY,MAX_AXPY,NB_POINT);\n  \n  return 0;\n}\n\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/eigen2/main_matmat.cpp",
    "content": "//=====================================================\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#include \"utilities.h\"\n#include \"eigen2_interface.hh\"\n#include \"bench.hh\"\n#include \"basic_actions.hh\"\n\nBTL_MAIN;\n\nint main()\n{\n  bench<Action_matrix_matrix_product<eigen2_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n//   bench<Action_ata_product<eigen2_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n  bench<Action_aat_product<eigen2_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n//   bench<Action_trmm<eigen2_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n\n  return 0;\n}\n\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/eigen2/main_vecmat.cpp",
    "content": "//=====================================================\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#include \"utilities.h\"\n#include \"eigen2_interface.hh\"\n#include \"bench.hh\"\n#include \"basic_actions.hh\"\n\nBTL_MAIN;\n\nint main()\n{\n  bench<Action_matrix_vector_product<eigen2_interface<REAL_TYPE> > >(MIN_MV,MAX_MV,NB_POINT);\n  bench<Action_atv_product<eigen2_interface<REAL_TYPE> > >(MIN_MV,MAX_MV,NB_POINT);\n//   bench<Action_symv<eigen2_interface<REAL_TYPE> > >(MIN_MV,MAX_MV,NB_POINT);\n//   bench<Action_syr2<eigen2_interface<REAL_TYPE> > >(MIN_MV,MAX_MV,NB_POINT);\n//   bench<Action_ger<eigen2_interface<REAL_TYPE> > >(MIN_MV,MAX_MV,NB_POINT);\n\n  return 0;\n}\n\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/eigen3/CMakeLists.txt",
    "content": "\n\nif((NOT EIGEN3_INCLUDE_DIR) AND Eigen_SOURCE_DIR)\n  # unless EIGEN3_INCLUDE_DIR is defined, let's use current Eigen version\n  set(EIGEN3_INCLUDE_DIR ${Eigen_SOURCE_DIR})\n  set(EIGEN3_FOUND TRUE)\nelse()\n  find_package(Eigen3)\nendif()\n\nif (EIGEN3_FOUND)\n\n  include_directories(${EIGEN3_INCLUDE_DIR})\n  btl_add_bench(btl_eigen3_linear main_linear.cpp)\n  btl_add_bench(btl_eigen3_vecmat main_vecmat.cpp)\n  btl_add_bench(btl_eigen3_matmat main_matmat.cpp)\n  btl_add_bench(btl_eigen3_adv main_adv.cpp      )\n\n  btl_add_target_property(btl_eigen3_linear COMPILE_FLAGS \"-fno-exceptions -DBTL_PREFIX=eigen3\")\n  btl_add_target_property(btl_eigen3_vecmat COMPILE_FLAGS \"-fno-exceptions -DBTL_PREFIX=eigen3\")\n  btl_add_target_property(btl_eigen3_matmat COMPILE_FLAGS \"-fno-exceptions -DBTL_PREFIX=eigen3\")\n  btl_add_target_property(btl_eigen3_adv    COMPILE_FLAGS \"-fno-exceptions -DBTL_PREFIX=eigen3\")\n\n  option(BTL_BENCH_NOGCCVEC \"also bench Eigen explicit vec without GCC's auto vec\" OFF)\n  if(CMAKE_COMPILER_IS_GNUCXX AND BTL_BENCH_NOGCCVEC)\n    btl_add_bench(btl_eigen3_nogccvec_linear main_linear.cpp)\n    btl_add_bench(btl_eigen3_nogccvec_vecmat main_vecmat.cpp)\n    btl_add_bench(btl_eigen3_nogccvec_matmat main_matmat.cpp)\n    btl_add_bench(btl_eigen3_nogccvec_adv    main_adv.cpp   )\n\n    btl_add_target_property(btl_eigen3_nogccvec_linear COMPILE_FLAGS \"-fno-exceptions -fno-tree-vectorize -DBTL_PREFIX=eigen3_nogccvec\")\n    btl_add_target_property(btl_eigen3_nogccvec_vecmat COMPILE_FLAGS \"-fno-exceptions -fno-tree-vectorize -DBTL_PREFIX=eigen3_nogccvec\")\n    btl_add_target_property(btl_eigen3_nogccvec_matmat COMPILE_FLAGS \"-fno-exceptions -fno-tree-vectorize -DBTL_PREFIX=eigen3_nogccvec\")\n    btl_add_target_property(btl_eigen3_nogccvec_adv    COMPILE_FLAGS \"-fno-exceptions -fno-tree-vectorize -DBTL_PREFIX=eigen3_nogccvec\")\n  endif()\n\n\n  if(NOT BTL_NOVEC)\n    btl_add_bench(btl_eigen3_novec_linear main_linear.cpp OFF)\n    btl_add_bench(btl_eigen3_novec_vecmat main_vecmat.cpp OFF)\n    btl_add_bench(btl_eigen3_novec_matmat main_matmat.cpp OFF)\n    btl_add_bench(btl_eigen3_novec_adv main_adv.cpp       OFF)\n    btl_add_target_property(btl_eigen3_novec_linear COMPILE_FLAGS \"-fno-exceptions -DEIGEN_DONT_VECTORIZE -DBTL_PREFIX=eigen3_novec\")\n    btl_add_target_property(btl_eigen3_novec_vecmat COMPILE_FLAGS \"-fno-exceptions -DEIGEN_DONT_VECTORIZE -DBTL_PREFIX=eigen3_novec\")\n    btl_add_target_property(btl_eigen3_novec_matmat COMPILE_FLAGS \"-fno-exceptions -DEIGEN_DONT_VECTORIZE -DBTL_PREFIX=eigen3_novec\")\n    btl_add_target_property(btl_eigen3_novec_adv    COMPILE_FLAGS \"-fno-exceptions -DEIGEN_DONT_VECTORIZE -DBTL_PREFIX=eigen3_novec\")\n\n#     if(BUILD_btl_eigen3_adv)\n#       target_link_libraries(btl_eigen3_adv ${MKL_LIBRARIES})\n#     endif(BUILD_btl_eigen3_adv)\n\n  endif(NOT BTL_NOVEC)\n\n  btl_add_bench(btl_tiny_eigen3 btl_tiny_eigen3.cpp OFF)\n\n  if(NOT BTL_NOVEC)\n    btl_add_bench(btl_tiny_eigen3_novec btl_tiny_eigen3.cpp OFF)\n    btl_add_target_property(btl_tiny_eigen3_novec    COMPILE_FLAGS \"-DBTL_PREFIX=eigen3_tiny\")\n\n    if(BUILD_btl_tiny_eigen3_novec)\n      btl_add_target_property(btl_tiny_eigen3_novec    COMPILE_FLAGS \"-DEIGEN_DONT_VECTORIZE -DBTL_PREFIX=eigen3_tiny_novec\")\n    endif(BUILD_btl_tiny_eigen3_novec)\n  endif(NOT BTL_NOVEC)\n\nendif (EIGEN3_FOUND)\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/eigen3/btl_tiny_eigen3.cpp",
    "content": "//=====================================================\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#include \"utilities.h\"\n#include \"eigen3_interface.hh\"\n#include \"static/bench_static.hh\"\n#include \"action_matrix_vector_product.hh\"\n#include \"action_matrix_matrix_product.hh\"\n#include \"action_axpy.hh\"\n#include \"action_lu_solve.hh\"\n#include \"action_ata_product.hh\"\n#include \"action_aat_product.hh\"\n#include \"action_atv_product.hh\"\n#include \"action_cholesky.hh\"\n#include \"action_trisolve.hh\"\n\nBTL_MAIN;\n\nint main()\n{\n\n  bench_static<Action_axpy,eigen2_interface>();\n  bench_static<Action_matrix_matrix_product,eigen2_interface>();\n  bench_static<Action_matrix_vector_product,eigen2_interface>();\n  bench_static<Action_atv_product,eigen2_interface>();\n  bench_static<Action_cholesky,eigen2_interface>();\n  bench_static<Action_trisolve,eigen2_interface>();\n\n  return 0;\n}\n\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/eigen3/eigen3_interface.hh",
    "content": "//=====================================================\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#ifndef EIGEN3_INTERFACE_HH\n#define EIGEN3_INTERFACE_HH\n\n#include <Eigen/Eigen>\n#include <vector>\n#include \"btl.hh\"\n\nusing namespace Eigen;\n\ntemplate<class real, int SIZE=Dynamic>\nclass eigen3_interface\n{\n\npublic :\n\n  enum {IsFixedSize = (SIZE!=Dynamic)};\n\n  typedef real real_type;\n\n  typedef std::vector<real> stl_vector;\n  typedef std::vector<stl_vector> stl_matrix;\n\n  typedef Eigen::Matrix<real,SIZE,SIZE> gene_matrix;\n  typedef Eigen::Matrix<real,SIZE,1> gene_vector;\n\n  static inline std::string name( void )\n  {\n    return EIGEN_MAKESTRING(BTL_PREFIX);\n  }\n\n  static void free_matrix(gene_matrix & A, int N) {}\n\n  static void free_vector(gene_vector & B) {}\n\n  static BTL_DONT_INLINE void matrix_from_stl(gene_matrix & A, stl_matrix & A_stl){\n    A.resize(A_stl[0].size(), A_stl.size());\n\n    for (int j=0; j<A_stl.size() ; j++){\n      for (int i=0; i<A_stl[j].size() ; i++){\n        A.coeffRef(i,j) = A_stl[j][i];\n      }\n    }\n  }\n\n  static BTL_DONT_INLINE  void vector_from_stl(gene_vector & B, stl_vector & B_stl){\n    B.resize(B_stl.size(),1);\n\n    for (int i=0; i<B_stl.size() ; i++){\n      B.coeffRef(i) = B_stl[i];\n    }\n  }\n\n  static BTL_DONT_INLINE  void vector_to_stl(gene_vector & B, stl_vector & B_stl){\n    for (int i=0; i<B_stl.size() ; i++){\n      B_stl[i] = B.coeff(i);\n    }\n  }\n\n  static BTL_DONT_INLINE  void matrix_to_stl(gene_matrix & A, stl_matrix & A_stl){\n    int N=A_stl.size();\n\n    for (int j=0;j<N;j++){\n      A_stl[j].resize(N);\n      for (int i=0;i<N;i++){\n        A_stl[j][i] = A.coeff(i,j);\n      }\n    }\n  }\n\n  static inline void matrix_matrix_product(const gene_matrix & A, const gene_matrix & B, gene_matrix & X, int N){\n    X.noalias() = A*B;\n  }\n\n  static inline void transposed_matrix_matrix_product(const gene_matrix & A, const gene_matrix & B, gene_matrix & X, int N){\n    X.noalias() = A.transpose()*B.transpose();\n  }\n\n//   static inline void ata_product(const gene_matrix & A, gene_matrix & X, int N){\n//     X.noalias() = A.transpose()*A;\n//   }\n\n  static inline void aat_product(const gene_matrix & A, gene_matrix & X, int N){\n    X.template triangularView<Lower>().setZero();\n    X.template selfadjointView<Lower>().rankUpdate(A);\n  }\n\n  static inline void matrix_vector_product(const gene_matrix & A, const gene_vector & B, gene_vector & X, int N){\n    X.noalias() = A*B;\n  }\n\n  static inline void symv(const gene_matrix & A, const gene_vector & B, gene_vector & X, int N){\n    X.noalias() = (A.template selfadjointView<Lower>() * B);\n//     internal::product_selfadjoint_vector<real,0,LowerTriangularBit,false,false>(N,A.data(),N, B.data(), 1, X.data(), 1);\n  }\n\n  template<typename Dest, typename Src> static void triassign(Dest& dst, const Src& src)\n  {\n    typedef typename Dest::Scalar Scalar;\n    typedef typename internal::packet_traits<Scalar>::type Packet;\n    const int PacketSize = sizeof(Packet)/sizeof(Scalar);\n    int size = dst.cols();\n    for(int j=0; j<size; j+=1)\n    {\n//       const int alignedEnd = alignedStart + ((innerSize-alignedStart) & ~packetAlignedMask);\n      Scalar* A0 = dst.data() + j*dst.stride();\n      int starti = j;\n      int alignedEnd = starti;\n      int alignedStart = (starti) + internal::first_aligned(&A0[starti], size-starti);\n      alignedEnd = alignedStart + ((size-alignedStart)/(2*PacketSize))*(PacketSize*2);\n\n      // do the non-vectorizable part of the assignment\n      for (int index = starti; index<alignedStart ; ++index)\n      {\n        if(Dest::Flags&RowMajorBit)\n          dst.copyCoeff(j, index, src);\n        else\n          dst.copyCoeff(index, j, src);\n      }\n\n      // do the vectorizable part of the assignment\n      for (int index = alignedStart; index<alignedEnd; index+=PacketSize)\n      {\n        if(Dest::Flags&RowMajorBit)\n          dst.template copyPacket<Src, Aligned, Unaligned>(j, index, src);\n        else\n          dst.template copyPacket<Src, Aligned, Unaligned>(index, j, src);\n      }\n\n      // do the non-vectorizable part of the assignment\n      for (int index = alignedEnd; index<size; ++index)\n      {\n        if(Dest::Flags&RowMajorBit)\n          dst.copyCoeff(j, index, src);\n        else\n          dst.copyCoeff(index, j, src);\n      }\n      //dst.col(j).tail(N-j) = src.col(j).tail(N-j);\n    }\n  }\n\n  static EIGEN_DONT_INLINE void syr2(gene_matrix & A,  gene_vector & X, gene_vector & Y, int N){\n    // internal::product_selfadjoint_rank2_update<real,0,LowerTriangularBit>(N,A.data(),N, X.data(), 1, Y.data(), 1, -1);\n    for(int j=0; j<N; ++j)\n      A.col(j).tail(N-j) += X[j] * Y.tail(N-j) + Y[j] * X.tail(N-j);\n  }\n\n  static EIGEN_DONT_INLINE void ger(gene_matrix & A,  gene_vector & X, gene_vector & Y, int N){\n    for(int j=0; j<N; ++j)\n      A.col(j) += X * Y[j];\n  }\n\n  static EIGEN_DONT_INLINE void rot(gene_vector & A,  gene_vector & B, real c, real s, int N){\n    internal::apply_rotation_in_the_plane(A, B, JacobiRotation<real>(c,s));\n  }\n\n  static inline void atv_product(gene_matrix & A, gene_vector & B, gene_vector & X, int N){\n    X.noalias() = (A.transpose()*B);\n  }\n\n  static inline void axpy(real coef, const gene_vector & X, gene_vector & Y, int N){\n    Y += coef * X;\n  }\n\n  static inline void axpby(real a, const gene_vector & X, real b, gene_vector & Y, int N){\n    Y = a*X + b*Y;\n  }\n\n  static EIGEN_DONT_INLINE void copy_matrix(const gene_matrix & source, gene_matrix & cible, int N){\n    cible = source;\n  }\n\n  static EIGEN_DONT_INLINE void copy_vector(const gene_vector & source, gene_vector & cible, int N){\n    cible = source;\n  }\n\n  static inline void trisolve_lower(const gene_matrix & L, const gene_vector& B, gene_vector& X, int N){\n    X = L.template triangularView<Lower>().solve(B);\n  }\n\n  static inline void trisolve_lower_matrix(const gene_matrix & L, const gene_matrix& B, gene_matrix& X, int N){\n    X = L.template triangularView<Upper>().solve(B);\n  }\n\n  static inline void trmm(const gene_matrix & L, const gene_matrix& B, gene_matrix& X, int N){\n    X.noalias() = L.template triangularView<Lower>() * B;\n  }\n\n  static inline void cholesky(const gene_matrix & X, gene_matrix & C, int N){\n    C = X;\n    internal::llt_inplace<real,Lower>::blocked(C);\n    //C = X.llt().matrixL();\n//     C = X;\n//     Cholesky<gene_matrix>::computeInPlace(C);\n//     Cholesky<gene_matrix>::computeInPlaceBlock(C);\n  }\n\n  static inline void lu_decomp(const gene_matrix & X, gene_matrix & C, int N){\n    C = X.fullPivLu().matrixLU();\n  }\n\n  static inline void partial_lu_decomp(const gene_matrix & X, gene_matrix & C, int N){\n    Matrix<DenseIndex,1,Dynamic> piv(N);\n    DenseIndex nb;\n    C = X;\n    internal::partial_lu_inplace(C,piv,nb);\n//     C = X.partialPivLu().matrixLU();\n  }\n\n  static inline void tridiagonalization(const gene_matrix & X, gene_matrix & C, int N){\n    typename Tridiagonalization<gene_matrix>::CoeffVectorType aux(N-1);\n    C = X;\n    internal::tridiagonalization_inplace(C, aux);\n  }\n\n  static inline void hessenberg(const gene_matrix & X, gene_matrix & C, int N){\n    C = HessenbergDecomposition<gene_matrix>(X).packedMatrix();\n  }\n\n\n\n};\n\n#endif\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/eigen3/main_adv.cpp",
    "content": "//=====================================================\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#include \"utilities.h\"\n#include \"eigen3_interface.hh\"\n#include \"bench.hh\"\n#include \"action_trisolve.hh\"\n#include \"action_trisolve_matrix.hh\"\n#include \"action_cholesky.hh\"\n#include \"action_hessenberg.hh\"\n#include \"action_lu_decomp.hh\"\n#include \"action_partial_lu.hh\"\n\nBTL_MAIN;\n\nint main()\n{\n  bench<Action_trisolve<eigen3_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n  bench<Action_trisolve_matrix<eigen3_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n  bench<Action_cholesky<eigen3_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n  bench<Action_lu_decomp<eigen3_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n  bench<Action_partial_lu<eigen3_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n\n  bench<Action_hessenberg<eigen3_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n  bench<Action_tridiagonalization<eigen3_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n\n  return 0;\n}\n\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/eigen3/main_linear.cpp",
    "content": "//=====================================================\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#include \"utilities.h\"\n#include \"eigen3_interface.hh\"\n#include \"bench.hh\"\n#include \"basic_actions.hh\"\n\nBTL_MAIN;\n\nint main()\n{\n\n  bench<Action_axpy<eigen3_interface<REAL_TYPE> > >(MIN_AXPY,MAX_AXPY,NB_POINT);\n  bench<Action_axpby<eigen3_interface<REAL_TYPE> > >(MIN_AXPY,MAX_AXPY,NB_POINT);\n  bench<Action_rot<eigen3_interface<REAL_TYPE> > >(MIN_AXPY,MAX_AXPY,NB_POINT);\n  \n  return 0;\n}\n\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/eigen3/main_matmat.cpp",
    "content": "//=====================================================\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#include \"utilities.h\"\n#include \"eigen3_interface.hh\"\n#include \"bench.hh\"\n#include \"basic_actions.hh\"\n\nBTL_MAIN;\n\nint main()\n{\n  bench<Action_matrix_matrix_product<eigen3_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n//   bench<Action_ata_product<eigen3_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n  bench<Action_aat_product<eigen3_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n  bench<Action_trmm<eigen3_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n\n  return 0;\n}\n\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/eigen3/main_vecmat.cpp",
    "content": "//=====================================================\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#include \"utilities.h\"\n#include \"eigen3_interface.hh\"\n#include \"bench.hh\"\n#include \"basic_actions.hh\"\n\nBTL_MAIN;\n\nint main()\n{\n  bench<Action_matrix_vector_product<eigen3_interface<REAL_TYPE> > >(MIN_MV,MAX_MV,NB_POINT);\n  bench<Action_atv_product<eigen3_interface<REAL_TYPE> > >(MIN_MV,MAX_MV,NB_POINT);\n  bench<Action_symv<eigen3_interface<REAL_TYPE> > >(MIN_MV,MAX_MV,NB_POINT);\n  bench<Action_syr2<eigen3_interface<REAL_TYPE> > >(MIN_MV,MAX_MV,NB_POINT);\n  bench<Action_ger<eigen3_interface<REAL_TYPE> > >(MIN_MV,MAX_MV,NB_POINT);\n\n  return 0;\n}\n\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/gmm/CMakeLists.txt",
    "content": "\nfind_package(GMM)\nif (GMM_FOUND)\n  include_directories(${GMM_INCLUDES})\n  btl_add_bench(btl_gmm main.cpp)\nendif (GMM_FOUND)\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/gmm/gmm_LU_solve_interface.hh",
    "content": "//=====================================================\n// File   :  blitz_LU_solve_interface.hh\n// Author :  L. Plagne <laurent.plagne@edf.fr)>        \n// Copyright (C) EDF R&D,  lun sep 30 14:23:31 CEST 2002\n//=====================================================\n// \n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n// \n#ifndef BLITZ_LU_SOLVE_INTERFACE_HH\n#define BLITZ_LU_SOLVE_INTERFACE_HH\n\n#include \"blitz/array.h\"\n#include <vector>\n\nBZ_USING_NAMESPACE(blitz)\n\ntemplate<class real>\nclass blitz_LU_solve_interface : public blitz_interface<real>\n{\n\npublic :\n\n  typedef typename blitz_interface<real>::gene_matrix gene_matrix;\n  typedef typename blitz_interface<real>::gene_vector gene_vector;\n\n  typedef blitz::Array<int,1> Pivot_Vector;\n\n  inline static void new_Pivot_Vector(Pivot_Vector & pivot,int N)\n  {\n\n    pivot.resize(N);\n\n  }\n\n  inline static void free_Pivot_Vector(Pivot_Vector & pivot)\n  {\n    \n    return;\n\n  }\n\n\n  static inline real matrix_vector_product_sliced(const gene_matrix & A, gene_vector B, int row, int col_start, int col_end)\n  {\n    \n    real somme=0.;\n    \n    for (int j=col_start ; j<col_end+1 ; j++){\n\t\n\tsomme+=A(row,j)*B(j);\n\t\n    }\n\n    return somme;\n\n  }\n\n\n\n\n  static inline real matrix_matrix_product_sliced(gene_matrix & A, int row, int col_start, int col_end, gene_matrix & B, int row_shift, int col )\n  {\n    \n    real somme=0.;\n    \n    for (int j=col_start ; j<col_end+1 ; j++){\n\t\n\tsomme+=A(row,j)*B(j+row_shift,col);\n\t\n    }\n\n    return somme;\n\n  }\n\n  inline static void LU_factor(gene_matrix & LU, Pivot_Vector & pivot, int N)\n  {\n\n    ASSERT( LU.rows()==LU.cols() ) ;\n    int index_max = 0 ;\n    real big = 0. ;\n    real theSum = 0. ;\n    real dum = 0. ;\n    // Get the implicit scaling information :\n    gene_vector ImplicitScaling( N ) ;\n    for( int i=0; i<N; i++ ) {\n      big = 0. ;\n      for( int j=0; j<N; j++ ) {\n\tif( abs( LU( i, j ) )>=big ) big = abs( LU( i, j ) ) ;\n      }\n      if( big==0. ) {\n\tINFOS( \"blitz_LU_factor::Singular matrix\" ) ;\n\texit( 0 ) ;\n      }\n      ImplicitScaling( i ) = 1./big ;\n    }\n    // Loop over columns of Crout's method :\n    for( int j=0; j<N; j++ ) {\n      for( int i=0; i<j; i++ ) {\n\ttheSum = LU( i, j ) ;\n\ttheSum -= matrix_matrix_product_sliced(LU, i, 0, i-1, LU, 0, j) ;\n\t//\ttheSum -= sum( LU( i, Range( fromStart, i-1 ) )*LU( Range( fromStart, i-1 ), j ) ) ;\n\tLU( i, j ) = theSum ;\n      }\n      \n      // Search for the largest pivot element :\n      big = 0. ;\n      for( int i=j; i<N; i++ ) {\n\ttheSum = LU( i, j ) ;\n\ttheSum -= matrix_matrix_product_sliced(LU, i, 0, j-1, LU, 0, j) ;\n\t//\ttheSum -= sum( LU( i, Range( fromStart, j-1 ) )*LU( Range( fromStart, j-1 ), j ) ) ;\n\tLU( i, j ) = theSum ;\n\tif( (ImplicitScaling( i )*abs( theSum ))>=big ) {\n\t  dum = ImplicitScaling( i )*abs( theSum ) ;\n\t  big = dum ;\n\t  index_max = i ;\n\t}\n      }\n      // Interchanging rows and the scale factor :\n      if( j!=index_max ) {\n\tfor( int k=0; k<N; k++ ) {\n\t  dum = LU( index_max, k ) ;\n\t  LU( index_max, k ) = LU( j, k ) ;\n\t  LU( j, k ) = dum ;\n\t}\n\tImplicitScaling( index_max ) = ImplicitScaling( j ) ;\n      }\n      pivot( j ) = index_max ;\n      if ( LU( j, j )==0. ) LU( j, j ) = 1.e-20 ;\n      // Divide by the pivot element :\n      if( j<N ) {\n\tdum = 1./LU( j, j ) ;\n\tfor( int i=j+1; i<N; i++ ) LU( i, j ) *= dum ;\n      }\n    }\n\n  }\n\n  inline static void LU_solve(const gene_matrix & LU, const Pivot_Vector pivot, gene_vector &B, gene_vector X, int N)\n  {\n\n    // Pour conserver le meme header, on travaille sur X, copie du second-membre B\n    X = B.copy() ;\n    ASSERT( LU.rows()==LU.cols() ) ;\n    firstIndex indI ;\n    // Forward substitution :\n    int ii = 0 ;\n    real theSum = 0. ;\n    for( int i=0; i<N; i++ ) {\n      int ip = pivot( i ) ;\n      theSum = X( ip ) ;\n      //      theSum = B( ip ) ;\n      X( ip ) = X( i ) ;\n      //      B( ip ) = B( i ) ;\n      if( ii ) {\n\ttheSum -= matrix_vector_product_sliced(LU, X, i, ii-1, i-1) ;\n\t//\ttheSum -= sum( LU( i, Range( ii-1, i-1 ) )*X( Range( ii-1, i-1 ) ) ) ;\n\t//\ttheSum -= sum( LU( i, Range( ii-1, i-1 ) )*B( Range( ii-1, i-1 ) ) ) ;\n      } else if( theSum ) {\n\tii = i+1 ;\n      }\n      X( i ) = theSum ;\n      //      B( i ) = theSum ;\n    }\n    // Backsubstitution :\n    for( int i=N-1; i>=0; i-- ) {\n      theSum = X( i ) ;\n      //      theSum = B( i ) ;\n      theSum -= matrix_vector_product_sliced(LU, X, i, i+1, N) ;\n      //      theSum -= sum( LU( i, Range( i+1, toEnd ) )*X( Range( i+1, toEnd ) ) ) ;\n      //      theSum -= sum( LU( i, Range( i+1, toEnd ) )*B( Range( i+1, toEnd ) ) ) ;\n      // Store a component of the solution vector :\n      X( i ) = theSum/LU( i, i ) ;\n      //      B( i ) = theSum/LU( i, i ) ;\n    }\n\n  }\n\n};\n\n#endif\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/gmm/gmm_interface.hh",
    "content": "//=====================================================\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#ifndef GMM_INTERFACE_HH\n#define GMM_INTERFACE_HH\n\n#include <gmm/gmm.h>\n#include <vector>\n\nusing namespace gmm;\n\ntemplate<class real>\nclass gmm_interface {\n\npublic :\n\n  typedef real real_type ;\n\n  typedef std::vector<real>  stl_vector;\n  typedef std::vector<stl_vector > stl_matrix;\n\n  typedef gmm::dense_matrix<real> gene_matrix;\n  typedef stl_vector gene_vector;\n\n  static inline std::string name( void )\n  {\n    return \"gmm\";\n  }\n\n  static void free_matrix(gene_matrix & A, int N){\n    return ;\n  }\n\n  static void free_vector(gene_vector & B){\n    return ;\n  }\n\n  static inline void matrix_from_stl(gene_matrix & A, stl_matrix & A_stl){\n    A.resize(A_stl[0].size(),A_stl.size());\n\n    for (int j=0; j<A_stl.size() ; j++){\n      for (int i=0; i<A_stl[j].size() ; i++){\n        A(i,j) = A_stl[j][i];\n      }\n    }\n  }\n\n  static inline void vector_from_stl(gene_vector & B, stl_vector & B_stl){\n    B = B_stl;\n  }\n\n  static inline void vector_to_stl(gene_vector & B, stl_vector & B_stl){\n    B_stl = B;\n  }\n\n  static inline void matrix_to_stl(gene_matrix & A, stl_matrix & A_stl){\n    int N=A_stl.size();\n\n    for (int j=0;j<N;j++){\n      A_stl[j].resize(N);\n      for (int i=0;i<N;i++){\n        A_stl[j][i] = A(i,j);\n      }\n    }\n  }\n\n  static inline void matrix_matrix_product(const gene_matrix & A, const gene_matrix & B, gene_matrix & X, int N){\n    gmm::mult(A,B, X);\n  }\n\n  static inline void transposed_matrix_matrix_product(const gene_matrix & A, const gene_matrix & B, gene_matrix & X, int N){\n    gmm::mult(gmm::transposed(A),gmm::transposed(B), X);\n  }\n\n  static inline void ata_product(const gene_matrix & A, gene_matrix & X, int N){\n    gmm::mult(gmm::transposed(A),A, X);\n  }\n\n  static inline void aat_product(const gene_matrix & A, gene_matrix & X, int N){\n    gmm::mult(A,gmm::transposed(A), X);\n  }\n\n  static inline void matrix_vector_product(gene_matrix & A, gene_vector & B, gene_vector & X, int N){\n    gmm::mult(A,B,X);\n  }\n\n  static inline void atv_product(gene_matrix & A, gene_vector & B, gene_vector & X, int N){\n    gmm::mult(gmm::transposed(A),B,X);\n  }\n\n  static inline void axpy(const real coef, const gene_vector & X, gene_vector & Y, int N){\n    gmm::add(gmm::scaled(X,coef), Y);\n  }\n\n  static inline void axpby(real a, const gene_vector & X, real b, gene_vector & Y, int N){\n    gmm::add(gmm::scaled(X,a), gmm::scaled(Y,b), Y);\n  }\n\n  static inline void copy_matrix(const gene_matrix & source, gene_matrix & cible, int N){\n    gmm::copy(source,cible);\n  }\n\n  static inline void copy_vector(const gene_vector & source, gene_vector & cible, int N){\n    gmm::copy(source,cible);\n  }\n\n  static inline void trisolve_lower(const gene_matrix & L, const gene_vector& B, gene_vector & X, int N){\n    gmm::copy(B,X);\n    gmm::lower_tri_solve(L, X, false);\n  }\n\n  static inline void partial_lu_decomp(const gene_matrix & X, gene_matrix & R, int N){\n    gmm::copy(X,R);\n    std::vector<int> ipvt(N);\n    gmm::lu_factor(R, ipvt);\n  }\n\n  static inline void hessenberg(const gene_matrix & X, gene_matrix & R, int N){\n    gmm::copy(X,R);\n    gmm::Hessenberg_reduction(R,X,false);\n  }\n\n  static inline void tridiagonalization(const gene_matrix & X, gene_matrix & R, int N){\n    gmm::copy(X,R);\n    gmm::Householder_tridiagonalization(R,X,false);\n  }\n\n};\n\n#endif\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/gmm/main.cpp",
    "content": "//=====================================================\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#include \"utilities.h\"\n#include \"gmm_interface.hh\"\n#include \"bench.hh\"\n#include \"basic_actions.hh\"\n#include \"action_hessenberg.hh\"\n#include \"action_partial_lu.hh\"\n\nBTL_MAIN;\n\nint main()\n{\n\n  bench<Action_axpy<gmm_interface<REAL_TYPE> > >(MIN_AXPY,MAX_AXPY,NB_POINT);\n  bench<Action_axpby<gmm_interface<REAL_TYPE> > >(MIN_AXPY,MAX_AXPY,NB_POINT);\n\n  bench<Action_matrix_vector_product<gmm_interface<REAL_TYPE> > >(MIN_MV,MAX_MV,NB_POINT);\n  bench<Action_atv_product<gmm_interface<REAL_TYPE> > >(MIN_MV,MAX_MV,NB_POINT);\n\n  bench<Action_matrix_matrix_product<gmm_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n//   bench<Action_ata_product<gmm_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n//   bench<Action_aat_product<gmm_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n\n  bench<Action_trisolve<gmm_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n  //bench<Action_lu_solve<blitz_LU_solve_interface<REAL_TYPE> > >(MIN_LU,MAX_LU,NB_POINT);\n\n  bench<Action_partial_lu<gmm_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n  \n  bench<Action_hessenberg<gmm_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n  bench<Action_tridiagonalization<gmm_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n\n  return 0;\n}\n\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/mtl4/.kdbgrc.main",
    "content": "[General]\nDebuggerCmdStr=\nDriverName=GDB\nFileVersion=1\nOptionsSelected=\nProgramArgs=\nTTYLevel=7\nWorkingDirectory=\n\n[Memory]\nColumnWidths=80,0\nNumExprs=0\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/mtl4/CMakeLists.txt",
    "content": "\nfind_package(MTL4)\nif (MTL4_FOUND)\n  include_directories(${MTL4_INCLUDE_DIR})\n  btl_add_bench(btl_mtl4 main.cpp)\nendif (MTL4_FOUND)\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/mtl4/main.cpp",
    "content": "//=====================================================\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#include \"utilities.h\"\n#include \"mtl4_interface.hh\"\n#include \"bench.hh\"\n#include \"basic_actions.hh\"\n#include \"action_cholesky.hh\"\n// #include \"action_lu_decomp.hh\"\n\nBTL_MAIN;\n\nint main()\n{\n\n  bench<Action_axpy<mtl4_interface<REAL_TYPE> > >(MIN_AXPY,MAX_AXPY,NB_POINT);\n  bench<Action_axpby<mtl4_interface<REAL_TYPE> > >(MIN_AXPY,MAX_AXPY,NB_POINT);\n\n  bench<Action_matrix_vector_product<mtl4_interface<REAL_TYPE> > >(MIN_MV,MAX_MV,NB_POINT);\n  bench<Action_atv_product<mtl4_interface<REAL_TYPE> > >(MIN_MV,MAX_MV,NB_POINT);\n  bench<Action_matrix_matrix_product<mtl4_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n//   bench<Action_ata_product<mtl4_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n//   bench<Action_aat_product<mtl4_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n\n  bench<Action_trisolve<mtl4_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n//   bench<Action_cholesky<mtl4_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n//   bench<Action_lu_decomp<mtl4_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n\n  return 0;\n}\n\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/mtl4/mtl4_LU_solve_interface.hh",
    "content": "//=====================================================\n// File   :  blitz_LU_solve_interface.hh\n// Author :  L. Plagne <laurent.plagne@edf.fr)>        \n// Copyright (C) EDF R&D,  lun sep 30 14:23:31 CEST 2002\n//=====================================================\n// \n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n// \n#ifndef BLITZ_LU_SOLVE_INTERFACE_HH\n#define BLITZ_LU_SOLVE_INTERFACE_HH\n\n#include \"blitz/array.h\"\n#include <vector>\n\nBZ_USING_NAMESPACE(blitz)\n\ntemplate<class real>\nclass blitz_LU_solve_interface : public blitz_interface<real>\n{\n\npublic :\n\n  typedef typename blitz_interface<real>::gene_matrix gene_matrix;\n  typedef typename blitz_interface<real>::gene_vector gene_vector;\n\n  typedef blitz::Array<int,1> Pivot_Vector;\n\n  inline static void new_Pivot_Vector(Pivot_Vector & pivot,int N)\n  {\n\n    pivot.resize(N);\n\n  }\n\n  inline static void free_Pivot_Vector(Pivot_Vector & pivot)\n  {\n    \n    return;\n\n  }\n\n\n  static inline real matrix_vector_product_sliced(const gene_matrix & A, gene_vector B, int row, int col_start, int col_end)\n  {\n    \n    real somme=0.;\n    \n    for (int j=col_start ; j<col_end+1 ; j++){\n\t\n\tsomme+=A(row,j)*B(j);\n\t\n    }\n\n    return somme;\n\n  }\n\n\n\n\n  static inline real matrix_matrix_product_sliced(gene_matrix & A, int row, int col_start, int col_end, gene_matrix & B, int row_shift, int col )\n  {\n    \n    real somme=0.;\n    \n    for (int j=col_start ; j<col_end+1 ; j++){\n\t\n\tsomme+=A(row,j)*B(j+row_shift,col);\n\t\n    }\n\n    return somme;\n\n  }\n\n  inline static void LU_factor(gene_matrix & LU, Pivot_Vector & pivot, int N)\n  {\n\n    ASSERT( LU.rows()==LU.cols() ) ;\n    int index_max = 0 ;\n    real big = 0. ;\n    real theSum = 0. ;\n    real dum = 0. ;\n    // Get the implicit scaling information :\n    gene_vector ImplicitScaling( N ) ;\n    for( int i=0; i<N; i++ ) {\n      big = 0. ;\n      for( int j=0; j<N; j++ ) {\n\tif( abs( LU( i, j ) )>=big ) big = abs( LU( i, j ) ) ;\n      }\n      if( big==0. ) {\n\tINFOS( \"blitz_LU_factor::Singular matrix\" ) ;\n\texit( 0 ) ;\n      }\n      ImplicitScaling( i ) = 1./big ;\n    }\n    // Loop over columns of Crout's method :\n    for( int j=0; j<N; j++ ) {\n      for( int i=0; i<j; i++ ) {\n\ttheSum = LU( i, j ) ;\n\ttheSum -= matrix_matrix_product_sliced(LU, i, 0, i-1, LU, 0, j) ;\n\t//\ttheSum -= sum( LU( i, Range( fromStart, i-1 ) )*LU( Range( fromStart, i-1 ), j ) ) ;\n\tLU( i, j ) = theSum ;\n      }\n      \n      // Search for the largest pivot element :\n      big = 0. ;\n      for( int i=j; i<N; i++ ) {\n\ttheSum = LU( i, j ) ;\n\ttheSum -= matrix_matrix_product_sliced(LU, i, 0, j-1, LU, 0, j) ;\n\t//\ttheSum -= sum( LU( i, Range( fromStart, j-1 ) )*LU( Range( fromStart, j-1 ), j ) ) ;\n\tLU( i, j ) = theSum ;\n\tif( (ImplicitScaling( i )*abs( theSum ))>=big ) {\n\t  dum = ImplicitScaling( i )*abs( theSum ) ;\n\t  big = dum ;\n\t  index_max = i ;\n\t}\n      }\n      // Interchanging rows and the scale factor :\n      if( j!=index_max ) {\n\tfor( int k=0; k<N; k++ ) {\n\t  dum = LU( index_max, k ) ;\n\t  LU( index_max, k ) = LU( j, k ) ;\n\t  LU( j, k ) = dum ;\n\t}\n\tImplicitScaling( index_max ) = ImplicitScaling( j ) ;\n      }\n      pivot( j ) = index_max ;\n      if ( LU( j, j )==0. ) LU( j, j ) = 1.e-20 ;\n      // Divide by the pivot element :\n      if( j<N ) {\n\tdum = 1./LU( j, j ) ;\n\tfor( int i=j+1; i<N; i++ ) LU( i, j ) *= dum ;\n      }\n    }\n\n  }\n\n  inline static void LU_solve(const gene_matrix & LU, const Pivot_Vector pivot, gene_vector &B, gene_vector X, int N)\n  {\n\n    // Pour conserver le meme header, on travaille sur X, copie du second-membre B\n    X = B.copy() ;\n    ASSERT( LU.rows()==LU.cols() ) ;\n    firstIndex indI ;\n    // Forward substitution :\n    int ii = 0 ;\n    real theSum = 0. ;\n    for( int i=0; i<N; i++ ) {\n      int ip = pivot( i ) ;\n      theSum = X( ip ) ;\n      //      theSum = B( ip ) ;\n      X( ip ) = X( i ) ;\n      //      B( ip ) = B( i ) ;\n      if( ii ) {\n\ttheSum -= matrix_vector_product_sliced(LU, X, i, ii-1, i-1) ;\n\t//\ttheSum -= sum( LU( i, Range( ii-1, i-1 ) )*X( Range( ii-1, i-1 ) ) ) ;\n\t//\ttheSum -= sum( LU( i, Range( ii-1, i-1 ) )*B( Range( ii-1, i-1 ) ) ) ;\n      } else if( theSum ) {\n\tii = i+1 ;\n      }\n      X( i ) = theSum ;\n      //      B( i ) = theSum ;\n    }\n    // Backsubstitution :\n    for( int i=N-1; i>=0; i-- ) {\n      theSum = X( i ) ;\n      //      theSum = B( i ) ;\n      theSum -= matrix_vector_product_sliced(LU, X, i, i+1, N) ;\n      //      theSum -= sum( LU( i, Range( i+1, toEnd ) )*X( Range( i+1, toEnd ) ) ) ;\n      //      theSum -= sum( LU( i, Range( i+1, toEnd ) )*B( Range( i+1, toEnd ) ) ) ;\n      // Store a component of the solution vector :\n      X( i ) = theSum/LU( i, i ) ;\n      //      B( i ) = theSum/LU( i, i ) ;\n    }\n\n  }\n\n};\n\n#endif\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/mtl4/mtl4_interface.hh",
    "content": "//=====================================================\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#ifndef MTL4_INTERFACE_HH\n#define MTL4_INTERFACE_HH\n\n#include <boost/numeric/mtl/mtl.hpp>\n#include <boost/numeric/mtl/utility/range_generator.hpp>\n// #include <boost/numeric/mtl/operation/cholesky.hpp>\n#include <vector>\n\nusing namespace mtl;\n\ntemplate<class real>\nclass mtl4_interface {\n\npublic :\n\n  typedef real real_type ;\n\n  typedef std::vector<real>  stl_vector;\n  typedef std::vector<stl_vector > stl_matrix;\n\n  typedef mtl::dense2D<real, mtl::matrix::parameters<mtl::tag::col_major> > gene_matrix;\n  typedef mtl::dense_vector<real>  gene_vector;\n\n  static inline std::string name() { return \"mtl4\"; }\n\n  static void free_matrix(gene_matrix & A, int N){\n    return ;\n  }\n\n  static void free_vector(gene_vector & B){\n    return ;\n  }\n\n  static inline void matrix_from_stl(gene_matrix & A, stl_matrix & A_stl){\n    A.change_dim(A_stl[0].size(), A_stl.size());\n\n    for (int j=0; j<A_stl.size() ; j++){\n      for (int i=0; i<A_stl[j].size() ; i++){\n        A(i,j) = A_stl[j][i];\n      }\n    }\n  }\n\n  static inline void vector_from_stl(gene_vector & B, stl_vector & B_stl){\n    B.change_dim(B_stl.size());\n    for (int i=0; i<B_stl.size() ; i++){\n      B[i] = B_stl[i];\n    }\n  }\n\n  static inline void vector_to_stl(gene_vector & B, stl_vector & B_stl){\n    for (int i=0; i<B_stl.size() ; i++){\n      B_stl[i] = B[i];\n    }\n  }\n\n  static inline void matrix_to_stl(gene_matrix & A, stl_matrix & A_stl){\n    int N=A_stl.size();\n    for (int j=0;j<N;j++){\n      A_stl[j].resize(N);\n      for (int i=0;i<N;i++){\n        A_stl[j][i] = A(i,j);\n      }\n    }\n  }\n\n  static inline void matrix_matrix_product(const gene_matrix & A, const gene_matrix & B, gene_matrix & X, int N){\n    X = (A*B);\n//     morton_dense<double, doppled_64_row_mask> C(N,N);\n//     C = B;\n//     X = (A*C);\n  }\n\n  static inline void transposed_matrix_matrix_product(const gene_matrix & A, const gene_matrix & B, gene_matrix & X, int N){\n    X = (trans(A)*trans(B));\n  }\n\n//   static inline void ata_product(const gene_matrix & A, gene_matrix & X, int N){\n//     X = (trans(A)*A);\n//   }\n\n  static inline void aat_product(const gene_matrix & A, gene_matrix & X, int N){\n    X = (A*trans(A));\n  }\n\n  static inline void matrix_vector_product(gene_matrix & A, gene_vector & B, gene_vector & X, int N){\n    X = (A*B);\n  }\n\n  static inline void atv_product(gene_matrix & A, gene_vector & B, gene_vector & X, int N){\n    X = (trans(A)*B);\n  }\n\n  static inline void axpy(const real coef, const gene_vector & X, gene_vector & Y, int N){\n    Y += coef * X;\n  }\n\n  static inline void axpby(real a, const gene_vector & X, real b, gene_vector & Y, int N){\n    Y = a*X + b*Y;\n  }\n\n//   static inline void cholesky(const gene_matrix & X, gene_matrix & C, int N){\n//     C = X;\n//     recursive_cholesky(C);\n//   }\n\n//   static inline void lu_decomp(const gene_matrix & X, gene_matrix & R, int N){\n//     R = X;\n//     std::vector<int> ipvt(N);\n//     lu_factor(R, ipvt);\n//   }\n\n  static inline void trisolve_lower(const gene_matrix & L, const gene_vector& B, gene_vector & X, int N){\n    X = lower_trisolve(L, B);\n  }\n\n  static inline void copy_matrix(const gene_matrix & source, gene_matrix & cible, int N){\n    cible = source;\n  }\n\n  static inline void copy_vector(const gene_vector & source, gene_vector & cible, int N){\n    cible = source;\n  }\n\n};\n\n#endif\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/tvmet/CMakeLists.txt",
    "content": "\nfind_package(Tvmet)\nif (TVMET_FOUND)\n  include_directories(${TVMET_INCLUDE_DIR})\n  btl_add_bench(btl_tvmet main.cpp OFF)\nendif (TVMET_FOUND)\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/tvmet/main.cpp",
    "content": "//=====================================================\n// File   :  main.cpp\n// Author :  L. Plagne <laurent.plagne@edf.fr)>\n// Copyright (C) EDF R&D,  lun sep 30 14:23:30 CEST 2002\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#include \"utilities.h\"\n#include \"tvmet_interface.hh\"\n#include \"static/bench_static.hh\"\n#include \"action_matrix_vector_product.hh\"\n#include \"action_matrix_matrix_product.hh\"\n#include \"action_atv_product.hh\"\n#include \"action_axpy.hh\"\n\nBTL_MAIN;\n\nint main()\n{\n  bench_static<Action_axpy,tvmet_interface>();\n  bench_static<Action_matrix_matrix_product,tvmet_interface>();\n  bench_static<Action_matrix_vector_product,tvmet_interface>();\n  bench_static<Action_atv_product,tvmet_interface>();\n\n  return 0;\n}\n\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/tvmet/tvmet_interface.hh",
    "content": "//=====================================================\n// File   :  tvmet_interface.hh\n// Author :  L. Plagne <laurent.plagne@edf.fr)>\n// Copyright (C) EDF R&D,  lun sep 30 14:23:30 CEST 2002\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#ifndef TVMET_INTERFACE_HH\n#define TVMET_INTERFACE_HH\n\n#include <tvmet/tvmet.h>\n#include <tvmet/Vector.h>\n#include <tvmet/Matrix.h>\n\n#include <vector>\n\nusing namespace tvmet;\n\ntemplate<class real, int SIZE>\nclass tvmet_interface{\n\npublic :\n\n  typedef real real_type ;\n\n  typedef std::vector<real>  stl_vector;\n  typedef std::vector<stl_vector > stl_matrix;\n\n  typedef Vector<real,SIZE> gene_vector;\n  typedef Matrix<real,SIZE,SIZE> gene_matrix;\n\n  static inline std::string name() { return \"tiny_tvmet\"; }\n\n  static void free_matrix(gene_matrix & A, int N){}\n\n  static void free_vector(gene_vector & B){}\n\n  static inline void matrix_from_stl(gene_matrix & A, stl_matrix & A_stl){\n    for (int j=0; j<A_stl.size() ; j++)\n      for (int i=0; i<A_stl[j].size() ; i++)\n        A(i,j) = A_stl[j][i];\n  }\n\n  static inline void vector_from_stl(gene_vector & B, stl_vector & B_stl){\n    for (int i=0; i<B_stl.size() ; i++)\n      B[i]=B_stl[i];\n  }\n\n  static inline void vector_to_stl(gene_vector & B, stl_vector & B_stl){\n    for (int i=0; i<B_stl.size() ; i++){\n      B_stl[i]=B[i];\n    }\n  }\n\n  static inline void matrix_to_stl(gene_matrix & A, stl_matrix & A_stl){\n    int N = A_stl.size();\n    for (int j=0;j<N;j++){\n      A_stl[j].resize(N);\n      for (int i=0;i<N;i++)\n        A_stl[j][i] = A(i,j);\n    }\n  }\n\n\n  static inline void copy_matrix(const gene_matrix & source, gene_matrix & cible, int N){\n    cible = source;\n  }\n\n  static inline void copy_vector(const gene_vector & source, gene_vector & cible, int N){\n    cible = source;\n  }\n\n  static inline void matrix_matrix_product(const gene_matrix & A, const gene_matrix & B, gene_matrix & X, int N){\n    X = prod(A,B);\n  }\n\n  static inline void matrix_vector_product(gene_matrix & A, gene_vector & B, gene_vector & X, int N){\n    X = prod(A,B);\n  }\n\n  static inline void atv_product(gene_matrix & A, gene_vector & B, gene_vector & X, int N){\n    X = prod(trans(A),B);\n  }\n\n  static inline void axpy(const real coef, const gene_vector & X, gene_vector & Y, int N){\n    Y+=coef*X;\n  }\n\n};\n\n\n#endif\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/ublas/CMakeLists.txt",
    "content": "\nfind_package(Boost)\nif (Boost_FOUND)\n  include_directories(${Boost_INCLUDE_DIRS})\n  include_directories(${Boost_INCLUDES})\n  btl_add_bench(btl_ublas main.cpp)\nendif (Boost_FOUND)\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/ublas/main.cpp",
    "content": "//=====================================================\n// File   :  main.cpp\n// Author :  L. Plagne <laurent.plagne@edf.fr)>\n// Copyright (C) EDF R&D,  lun sep 30 14:23:27 CEST 2002\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#include \"utilities.h\"\n#include \"ublas_interface.hh\"\n#include \"bench.hh\"\n#include \"basic_actions.hh\"\n\nBTL_MAIN;\n\nint main()\n{\n  bench<Action_axpy<ublas_interface<REAL_TYPE> > >(MIN_AXPY,MAX_AXPY,NB_POINT);\n  bench<Action_axpby<ublas_interface<REAL_TYPE> > >(MIN_AXPY,MAX_AXPY,NB_POINT);\n\n  bench<Action_matrix_vector_product<ublas_interface<REAL_TYPE> > >(MIN_MV,MAX_MV,NB_POINT);\n  bench<Action_atv_product<ublas_interface<REAL_TYPE> > >(MIN_MV,MAX_MV,NB_POINT);\n\n  bench<Action_matrix_matrix_product<ublas_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n//   bench<Action_ata_product<ublas_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n//   bench<Action_aat_product<ublas_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n\n  bench<Action_trisolve<ublas_interface<REAL_TYPE> > >(MIN_MM,MAX_MM,NB_POINT);\n\n  return 0;\n}\n\n\n"
  },
  {
    "path": "libs/eigen/bench/btl/libs/ublas/ublas_interface.hh",
    "content": "//=====================================================\n// File   :  ublas_interface.hh\n// Author :  L. Plagne <laurent.plagne@edf.fr)>\n// Copyright (C) EDF R&D,  lun sep 30 14:23:27 CEST 2002\n//=====================================================\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (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// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n//\n#ifndef UBLAS_INTERFACE_HH\n#define UBLAS_INTERFACE_HH\n\n#include <boost/numeric/ublas/vector.hpp>\n#include <boost/numeric/ublas/matrix.hpp>\n#include <boost/numeric/ublas/io.hpp>\n#include <boost/numeric/ublas/triangular.hpp>\n\nusing namespace boost::numeric;\n\ntemplate <class real>\nclass ublas_interface{\n\npublic :\n\n  typedef real real_type ;\n\n  typedef std::vector<real> stl_vector;\n  typedef std::vector<stl_vector> stl_matrix;\n\n  typedef typename boost::numeric::ublas::matrix<real,boost::numeric::ublas::column_major> gene_matrix;\n  typedef typename boost::numeric::ublas::vector<real> gene_vector;\n\n  static inline std::string name( void ) { return \"ublas\"; }\n\n  static void free_matrix(gene_matrix & A, int N) {}\n\n  static void free_vector(gene_vector & B) {}\n\n  static inline void matrix_from_stl(gene_matrix & A, stl_matrix & A_stl){\n    A.resize(A_stl.size(),A_stl[0].size());\n    for (int j=0; j<A_stl.size() ; j++)\n      for (int i=0; i<A_stl[j].size() ; i++)\n        A(i,j)=A_stl[j][i];\n  }\n\n  static inline void vector_from_stl(gene_vector & B, stl_vector & B_stl){\n    B.resize(B_stl.size());\n    for (int i=0; i<B_stl.size() ; i++)\n      B(i)=B_stl[i];\n  }\n\n  static inline void vector_to_stl(gene_vector & B, stl_vector & B_stl){\n    for (int i=0; i<B_stl.size() ; i++)\n      B_stl[i]=B(i);\n  }\n\n  static inline void matrix_to_stl(gene_matrix & A, stl_matrix & A_stl){\n    int N=A_stl.size();\n    for (int j=0;j<N;j++)\n    {\n      A_stl[j].resize(N);\n      for (int i=0;i<N;i++)\n        A_stl[j][i]=A(i,j);\n    }\n  }\n\n  static inline void copy_vector(const gene_vector & source, gene_vector & cible, int N){\n    for (int i=0;i<N;i++){\n      cible(i) = source(i);\n    }\n  }\n\n  static inline void copy_matrix(const gene_matrix & source, gene_matrix & cible, int N){\n    for (int i=0;i<N;i++){\n      for (int j=0;j<N;j++){\n        cible(i,j) = source(i,j);\n      }\n    }\n  }\n\n  static inline void matrix_vector_product_slow(gene_matrix & A, gene_vector & B, gene_vector & X, int N){\n    X =  prod(A,B);\n  }\n\n  static inline void matrix_matrix_product_slow(gene_matrix & A, gene_matrix & B, gene_matrix & X, int N){\n    X =  prod(A,B);\n  }\n\n  static inline void axpy_slow(const real coef, const gene_vector & X, gene_vector & Y, int N){\n    Y+=coef*X;\n  }\n\n  // alias free assignements\n\n  static inline void matrix_vector_product(gene_matrix & A, gene_vector & B, gene_vector & X, int N){\n    X.assign(prod(A,B));\n  }\n\n  static inline void atv_product(gene_matrix & A, gene_vector & B, gene_vector & X, int N){\n    X.assign(prod(trans(A),B));\n  }\n\n  static inline void matrix_matrix_product(gene_matrix & A, gene_matrix & B, gene_matrix & X, int N){\n    X.assign(prod(A,B));\n  }\n\n  static inline void axpy(const real coef, const gene_vector & X, gene_vector & Y, int N){\n    Y.plus_assign(coef*X);\n  }\n\n  static inline void axpby(real a, const gene_vector & X, real b, gene_vector & Y, int N){\n    Y = a*X + b*Y;\n  }\n\n  static inline void ata_product(gene_matrix & A, gene_matrix & X, int N){\n    // X =  prod(trans(A),A);\n    X.assign(prod(trans(A),A));\n  }\n\n  static inline void aat_product(gene_matrix & A, gene_matrix & X, int N){\n    // X =  prod(A,trans(A));\n    X.assign(prod(A,trans(A)));\n  }\n\n  static inline void trisolve_lower(const gene_matrix & L, const gene_vector& B, gene_vector & X, int N){\n    X = solve(L, B, ublas::lower_tag ());\n  }\n\n};\n\n#endif\n"
  },
  {
    "path": "libs/eigen/bench/check_cache_queries.cpp",
    "content": "\n#define EIGEN_INTERNAL_DEBUG_CACHE_QUERY\n#include <iostream>\n#include \"../Eigen/Core\"\n\nusing namespace Eigen;\nusing namespace std;\n\n#define DUMP_CPUID(CODE) {\\\n  int abcd[4]; \\\n  abcd[0] = abcd[1] = abcd[2] = abcd[3] = 0;\\\n  EIGEN_CPUID(abcd, CODE, 0); \\\n  std::cout << \"The code \" << CODE << \" gives \" \\\n              << (int*)(abcd[0]) << \" \" << (int*)(abcd[1]) << \" \" \\\n              << (int*)(abcd[2]) << \" \" << (int*)(abcd[3]) << \" \" << std::endl; \\\n  }\n  \nint main()\n{\n  cout << \"Eigen's L1    = \" << internal::queryL1CacheSize() << endl;\n  cout << \"Eigen's L2/L3 = \" << internal::queryTopLevelCacheSize() << endl;\n  int l1, l2, l3;\n  internal::queryCacheSizes(l1, l2, l3);\n  cout << \"Eigen's L1, L2, L3       = \" << l1 << \" \" << l2 << \" \" << l3 << endl;\n  \n  #ifdef EIGEN_CPUID\n\n  int abcd[4];\n  int string[8];\n  char* string_char = (char*)(string);\n\n  // vendor ID\n  EIGEN_CPUID(abcd,0x0,0);\n  string[0] = abcd[1];\n  string[1] = abcd[3];\n  string[2] = abcd[2];\n  string[3] = 0;\n  cout << endl;\n  cout << \"vendor id = \" << string_char << endl;\n  cout << endl;\n  int max_funcs = abcd[0];\n\n  internal::queryCacheSizes_intel_codes(l1, l2, l3);\n  cout << \"Eigen's intel codes L1, L2, L3 = \" << l1 << \" \" << l2 << \" \" << l3 << endl;\n  if(max_funcs>=4)\n  {\n    internal::queryCacheSizes_intel_direct(l1, l2, l3);\n    cout << \"Eigen's intel direct L1, L2, L3 = \" << l1 << \" \" << l2 << \" \" << l3 << endl;\n  }\n  internal::queryCacheSizes_amd(l1, l2, l3);\n  cout << \"Eigen's amd L1, L2, L3         = \" << l1 << \" \" << l2 << \" \" << l3 << endl;\n  cout << endl;\n  \n  // dump Intel direct method\n  if(max_funcs>=4)\n  {\n    l1 = l2 = l3 = 0;\n    int cache_id = 0;\n    int cache_type = 0;\n    do {\n      abcd[0] = abcd[1] = abcd[2] = abcd[3] = 0;\n      EIGEN_CPUID(abcd,0x4,cache_id);\n      cache_type  = (abcd[0] & 0x0F) >> 0;\n      int cache_level = (abcd[0] & 0xE0) >> 5;  // A[7:5]\n      int ways        = (abcd[1] & 0xFFC00000) >> 22; // B[31:22]\n      int partitions  = (abcd[1] & 0x003FF000) >> 12; // B[21:12]\n      int line_size   = (abcd[1] & 0x00000FFF) >>  0; // B[11:0]\n      int sets        = (abcd[2]);                    // C[31:0]\n      int cache_size = (ways+1) * (partitions+1) * (line_size+1) * (sets+1);\n      \n      cout << \"cache[\" << cache_id << \"].type       = \" << cache_type << \"\\n\";\n      cout << \"cache[\" << cache_id << \"].level      = \" << cache_level << \"\\n\";\n      cout << \"cache[\" << cache_id << \"].ways       = \" << ways << \"\\n\";\n      cout << \"cache[\" << cache_id << \"].partitions = \" << partitions << \"\\n\";\n      cout << \"cache[\" << cache_id << \"].line_size  = \" << line_size << \"\\n\";\n      cout << \"cache[\" << cache_id << \"].sets       = \" << sets << \"\\n\";\n      cout << \"cache[\" << cache_id << \"].size       = \" << cache_size << \"\\n\";\n      \n      cache_id++;\n    } while(cache_type>0 && cache_id<16);\n  }\n  \n  // dump everything\n  std::cout << endl <<\"Raw dump:\" << endl;\n  for(int i=0; i<max_funcs; ++i)\n    DUMP_CPUID(i);\n\n  DUMP_CPUID(0x80000000);\n  DUMP_CPUID(0x80000001);\n  DUMP_CPUID(0x80000002);\n  DUMP_CPUID(0x80000003);\n  DUMP_CPUID(0x80000004);\n  DUMP_CPUID(0x80000005);\n  DUMP_CPUID(0x80000006);\n  DUMP_CPUID(0x80000007);\n  DUMP_CPUID(0x80000008);\n  #else\n  cout << \"EIGEN_CPUID is not defined\" << endl;\n  #endif\n  return 0;\n}\n"
  },
  {
    "path": "libs/eigen/bench/eig33.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n// The computeRoots function included in this is based on materials\n// covered by the following copyright and license:\n// \n// Geometric Tools, LLC\n// Copyright (c) 1998-2010\n// Distributed under the Boost Software License, Version 1.0.\n// \n// Permission is hereby granted, free of charge, to any person or organization\n// obtaining a copy of the software and accompanying documentation covered by\n// this license (the \"Software\") to use, reproduce, display, distribute,\n// execute, and transmit the Software, and to prepare derivative works of the\n// Software, and to permit third-parties to whom the Software is furnished to\n// do so, all subject to the following:\n// \n// The copyright notices in the Software and this entire statement, including\n// the above license grant, this restriction and the following disclaimer,\n// must be included in all copies of the Software, in whole or in part, and\n// all derivative works of the Software, unless such copies or derivative\n// works are solely in the form of machine-executable object code generated by\n// a source language processor.\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, TITLE AND NON-INFRINGEMENT. IN NO EVENT\n// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE\n// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,\n// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n// DEALINGS IN THE SOFTWARE.\n\n#include <iostream>\n#include <Eigen/Core>\n#include <Eigen/Eigenvalues>\n#include <Eigen/Geometry>\n#include <bench/BenchTimer.h>\n\nusing namespace Eigen;\nusing namespace std;\n\ntemplate<typename Matrix, typename Roots>\ninline void computeRoots(const Matrix& m, Roots& roots)\n{\n  typedef typename Matrix::Scalar Scalar;\n  const Scalar s_inv3 = 1.0/3.0;\n  const Scalar s_sqrt3 = internal::sqrt(Scalar(3.0));\n\n  // The characteristic equation is x^3 - c2*x^2 + c1*x - c0 = 0.  The\n  // eigenvalues are the roots to this equation, all guaranteed to be\n  // real-valued, because the matrix is symmetric.\n  Scalar c0 = m(0,0)*m(1,1)*m(2,2) + Scalar(2)*m(0,1)*m(0,2)*m(1,2) - m(0,0)*m(1,2)*m(1,2) - m(1,1)*m(0,2)*m(0,2) - m(2,2)*m(0,1)*m(0,1);\n  Scalar c1 = m(0,0)*m(1,1) - m(0,1)*m(0,1) + m(0,0)*m(2,2) - m(0,2)*m(0,2) + m(1,1)*m(2,2) - m(1,2)*m(1,2);\n  Scalar c2 = m(0,0) + m(1,1) + m(2,2);\n\n  // Construct the parameters used in classifying the roots of the equation\n  // and in solving the equation for the roots in closed form.\n  Scalar c2_over_3 = c2*s_inv3;\n  Scalar a_over_3 = (c1 - c2*c2_over_3)*s_inv3;\n  if (a_over_3 > Scalar(0))\n    a_over_3 = Scalar(0);\n\n  Scalar half_b = Scalar(0.5)*(c0 + c2_over_3*(Scalar(2)*c2_over_3*c2_over_3 - c1));\n\n  Scalar q = half_b*half_b + a_over_3*a_over_3*a_over_3;\n  if (q > Scalar(0))\n    q = Scalar(0);\n\n  // Compute the eigenvalues by solving for the roots of the polynomial.\n  Scalar rho = internal::sqrt(-a_over_3);\n  Scalar theta = std::atan2(internal::sqrt(-q),half_b)*s_inv3;\n  Scalar cos_theta = internal::cos(theta);\n  Scalar sin_theta = internal::sin(theta);\n  roots(0) = c2_over_3 + Scalar(2)*rho*cos_theta;\n  roots(1) = c2_over_3 - rho*(cos_theta + s_sqrt3*sin_theta);\n  roots(2) = c2_over_3 - rho*(cos_theta - s_sqrt3*sin_theta);\n\n  // Sort in increasing order.\n  if (roots(0) >= roots(1))\n    std::swap(roots(0),roots(1));\n  if (roots(1) >= roots(2))\n  {\n    std::swap(roots(1),roots(2));\n    if (roots(0) >= roots(1))\n      std::swap(roots(0),roots(1));\n  }\n}\n\ntemplate<typename Matrix, typename Vector>\nvoid eigen33(const Matrix& mat, Matrix& evecs, Vector& evals)\n{\n  typedef typename Matrix::Scalar Scalar;\n  // Scale the matrix so its entries are in [-1,1].  The scaling is applied\n  // only when at least one matrix entry has magnitude larger than 1.\n\n  Scalar scale = mat.cwiseAbs()/*.template triangularView<Lower>()*/.maxCoeff();\n  scale = std::max(scale,Scalar(1));\n  Matrix scaledMat = mat / scale;\n\n  // Compute the eigenvalues\n//   scaledMat.setZero();\n  computeRoots(scaledMat,evals);\n\n  // compute the eigen vectors\n  // **here we assume 3 differents eigenvalues**\n\n  // \"optimized version\" which appears to be slower with gcc!\n//     Vector base;\n//     Scalar alpha, beta;\n//     base <<   scaledMat(1,0) * scaledMat(2,1),\n//               scaledMat(1,0) * scaledMat(2,0),\n//              -scaledMat(1,0) * scaledMat(1,0);\n//     for(int k=0; k<2; ++k)\n//     {\n//       alpha = scaledMat(0,0) - evals(k);\n//       beta  = scaledMat(1,1) - evals(k);\n//       evecs.col(k) = (base + Vector(-beta*scaledMat(2,0), -alpha*scaledMat(2,1), alpha*beta)).normalized();\n//     }\n//     evecs.col(2) = evecs.col(0).cross(evecs.col(1)).normalized();\n\n//   // naive version\n//   Matrix tmp;\n//   tmp = scaledMat;\n//   tmp.diagonal().array() -= evals(0);\n//   evecs.col(0) = tmp.row(0).cross(tmp.row(1)).normalized();\n// \n//   tmp = scaledMat;\n//   tmp.diagonal().array() -= evals(1);\n//   evecs.col(1) = tmp.row(0).cross(tmp.row(1)).normalized();\n// \n//   tmp = scaledMat;\n//   tmp.diagonal().array() -= evals(2);\n//   evecs.col(2) = tmp.row(0).cross(tmp.row(1)).normalized();\n  \n  // a more stable version:\n  if((evals(2)-evals(0))<=Eigen::NumTraits<Scalar>::epsilon())\n  {\n    evecs.setIdentity();\n  }\n  else\n  {\n    Matrix tmp;\n    tmp = scaledMat;\n    tmp.diagonal ().array () -= evals (2);\n    evecs.col (2) = tmp.row (0).cross (tmp.row (1)).normalized ();\n    \n    tmp = scaledMat;\n    tmp.diagonal ().array () -= evals (1);\n    evecs.col(1) = tmp.row (0).cross(tmp.row (1));\n    Scalar n1 = evecs.col(1).norm();\n    if(n1<=Eigen::NumTraits<Scalar>::epsilon())\n      evecs.col(1) = evecs.col(2).unitOrthogonal();\n    else\n      evecs.col(1) /= n1;\n    \n    // make sure that evecs[1] is orthogonal to evecs[2]\n    evecs.col(1) = evecs.col(2).cross(evecs.col(1).cross(evecs.col(2))).normalized();\n    evecs.col(0) = evecs.col(2).cross(evecs.col(1));\n  }\n  \n  // Rescale back to the original size.\n  evals *= scale;\n}\n\nint main()\n{\n  BenchTimer t;\n  int tries = 10;\n  int rep = 400000;\n  typedef Matrix3f Mat;\n  typedef Vector3f Vec;\n  Mat A = Mat::Random(3,3);\n  A = A.adjoint() * A;\n\n  SelfAdjointEigenSolver<Mat> eig(A);\n  BENCH(t, tries, rep, eig.compute(A));\n  std::cout << \"Eigen:  \" << t.best() << \"s\\n\";\n\n  Mat evecs;\n  Vec evals;\n  BENCH(t, tries, rep, eigen33(A,evecs,evals));\n  std::cout << \"Direct: \" << t.best() << \"s\\n\\n\";\n\n  std::cerr << \"Eigenvalue/eigenvector diffs:\\n\";\n  std::cerr << (evals - eig.eigenvalues()).transpose() << \"\\n\";\n  for(int k=0;k<3;++k)\n    if(evecs.col(k).dot(eig.eigenvectors().col(k))<0)\n      evecs.col(k) = -evecs.col(k);\n  std::cerr << evecs - eig.eigenvectors() << \"\\n\\n\";\n}\n"
  },
  {
    "path": "libs/eigen/bench/geometry.cpp",
    "content": "\n#include <iostream>\n#include <Eigen/Geometry>\n#include <bench/BenchTimer.h>\n\nusing namespace std;\nusing namespace Eigen;\n\n#ifndef SCALAR\n#define SCALAR float\n#endif\n\n#ifndef SIZE\n#define SIZE 8\n#endif\n\ntypedef SCALAR Scalar;\ntypedef NumTraits<Scalar>::Real RealScalar;\ntypedef Matrix<RealScalar,Dynamic,Dynamic> A;\ntypedef Matrix</*Real*/Scalar,Dynamic,Dynamic> B;\ntypedef Matrix<Scalar,Dynamic,Dynamic> C;\ntypedef Matrix<RealScalar,Dynamic,Dynamic> M;\n\ntemplate<typename Transformation, typename Data>\nEIGEN_DONT_INLINE void transform(const Transformation& t, Data& data)\n{\n  EIGEN_ASM_COMMENT(\"begin\");\n  data = t * data;\n  EIGEN_ASM_COMMENT(\"end\");\n}\n\ntemplate<typename Scalar, typename Data>\nEIGEN_DONT_INLINE void transform(const Quaternion<Scalar>& t, Data& data)\n{\n  EIGEN_ASM_COMMENT(\"begin quat\");\n  for(int i=0;i<data.cols();++i)\n    data.col(i) = t * data.col(i);\n  EIGEN_ASM_COMMENT(\"end quat\");\n}\n\ntemplate<typename T> struct ToRotationMatrixWrapper\n{\n  enum {Dim = T::Dim};\n  typedef typename T::Scalar Scalar;\n  ToRotationMatrixWrapper(const T& o) : object(o) {}\n  T object;\n};\n\ntemplate<typename QType, typename Data>\nEIGEN_DONT_INLINE void transform(const ToRotationMatrixWrapper<QType>& t, Data& data)\n{\n  EIGEN_ASM_COMMENT(\"begin quat via mat\");\n  data = t.object.toRotationMatrix() * data;\n  EIGEN_ASM_COMMENT(\"end quat via mat\");\n}\n\ntemplate<typename Scalar, int Dim, typename Data>\nEIGEN_DONT_INLINE void transform(const Transform<Scalar,Dim,Projective>& t, Data& data)\n{\n  data = (t * data.colwise().homogeneous()).template block<Dim,Data::ColsAtCompileTime>(0,0);\n}\n\ntemplate<typename T> struct get_dim { enum { Dim = T::Dim }; };\ntemplate<typename S, int R, int C, int O, int MR, int MC>\nstruct get_dim<Matrix<S,R,C,O,MR,MC> > { enum { Dim = R }; };\n\ntemplate<typename Transformation, int N>\nstruct bench_impl\n{\n  static EIGEN_DONT_INLINE void run(const Transformation& t)\n  {\n    Matrix<typename Transformation::Scalar,get_dim<Transformation>::Dim,N> data;\n    data.setRandom();\n    bench_impl<Transformation,N-1>::run(t);\n    BenchTimer timer;\n    BENCH(timer,10,100000,transform(t,data));\n    cout.width(9);\n    cout << timer.best() << \" \";\n  }\n};\n\n\ntemplate<typename Transformation>\nstruct bench_impl<Transformation,0>\n{\n  static EIGEN_DONT_INLINE void run(const Transformation&) {}\n};\n\ntemplate<typename Transformation>\nEIGEN_DONT_INLINE void bench(const std::string& msg, const Transformation& t)\n{\n  cout << msg << \" \";\n  bench_impl<Transformation,SIZE>::run(t);\n  std::cout << \"\\n\";\n}\n\nint main(int argc, char ** argv)\n{\n  Matrix<Scalar,3,4> mat34; mat34.setRandom();\n  Transform<Scalar,3,Isometry> iso3(mat34);\n  Transform<Scalar,3,Affine> aff3(mat34);\n  Transform<Scalar,3,AffineCompact> caff3(mat34);\n  Transform<Scalar,3,Projective> proj3(mat34);\n  Quaternion<Scalar> quat;quat.setIdentity();\n  ToRotationMatrixWrapper<Quaternion<Scalar> > quatmat(quat);\n  Matrix<Scalar,3,3> mat33; mat33.setRandom();\n  \n  cout.precision(4);\n  std::cout\n     << \"N          \";\n  for(int i=0;i<SIZE;++i)\n  {\n    cout.width(9);\n    cout << i+1 << \" \";\n  }\n  cout << \"\\n\";\n  \n  bench(\"matrix 3x3\", mat33);\n  bench(\"quaternion\", quat);\n  bench(\"quat-mat  \", quatmat);\n  bench(\"isometry3 \", iso3);\n  bench(\"affine3   \", aff3);\n  bench(\"c affine3 \", caff3);\n  bench(\"proj3     \", proj3);\n}\n\n"
  },
  {
    "path": "libs/eigen/bench/product_threshold.cpp",
    "content": "\n#include <iostream>\n#include <Eigen/Core>\n#include <bench/BenchTimer.h>\n\nusing namespace Eigen;\nusing namespace std;\n\n#define END 9\n\ntemplate<int S> struct map_size { enum { ret = S }; };\ntemplate<>  struct map_size<10> { enum { ret = 20 }; };\ntemplate<>  struct map_size<11> { enum { ret = 50 }; };\ntemplate<>  struct map_size<12> { enum { ret = 100 }; };\ntemplate<>  struct map_size<13> { enum { ret = 300 }; };\n\ntemplate<int M, int N,int K> struct alt_prod\n{\n  enum {\n    ret = M==1 && N==1 ? InnerProduct\n        : K==1 ? OuterProduct\n        : M==1 ? GemvProduct\n        : N==1 ? GemvProduct\n        : GemmProduct\n  };\n};\n        \nvoid print_mode(int mode)\n{\n  if(mode==InnerProduct) std::cout << \"i\";\n  if(mode==OuterProduct) std::cout << \"o\";\n  if(mode==CoeffBasedProductMode) std::cout << \"c\";\n  if(mode==LazyCoeffBasedProductMode) std::cout << \"l\";\n  if(mode==GemvProduct) std::cout << \"v\";\n  if(mode==GemmProduct) std::cout << \"m\";\n}\n\ntemplate<int Mode, typename Lhs, typename Rhs, typename Res>\nEIGEN_DONT_INLINE void prod(const Lhs& a, const Rhs& b, Res& c)\n{\n  c.noalias() += typename ProductReturnType<Lhs,Rhs,Mode>::Type(a,b);\n}\n\ntemplate<int M, int N, int K, typename Scalar, int Mode>\nEIGEN_DONT_INLINE void bench_prod()\n{\n  typedef Matrix<Scalar,M,K> Lhs; Lhs a; a.setRandom();\n  typedef Matrix<Scalar,K,N> Rhs; Rhs b; b.setRandom();\n  typedef Matrix<Scalar,M,N> Res; Res c; c.setRandom();\n\n  BenchTimer t;\n  double n = 2.*double(M)*double(N)*double(K);\n  int rep = 100000./n;\n  rep /= 2;\n  if(rep<1) rep = 1;\n  do {\n    rep *= 2;\n    t.reset();\n    BENCH(t,1,rep,prod<CoeffBasedProductMode>(a,b,c));\n  } while(t.best()<0.1);\n  \n  t.reset();\n  BENCH(t,5,rep,prod<Mode>(a,b,c));\n\n  print_mode(Mode);\n  std::cout << int(1e-6*n*rep/t.best()) << \"\\t\";\n}\n\ntemplate<int N> struct print_n;\ntemplate<int M, int N, int K> struct loop_on_m;\ntemplate<int M, int N, int K, typename Scalar, int Mode> struct loop_on_n;\n\ntemplate<int M, int N, int K>\nstruct loop_on_k\n{\n  static void run()\n  {\n    std::cout << \"K=\" << K << \"\\t\";\n    print_n<N>::run();\n    std::cout << \"\\n\";\n\n    loop_on_m<M,N,K>::run();\n    std::cout << \"\\n\\n\";\n\n    loop_on_k<M,N,K+1>::run();\n  }\n};\n\ntemplate<int M, int N>\nstruct loop_on_k<M,N,END> { static void run(){} };\n\n\ntemplate<int M, int N, int K>\nstruct loop_on_m\n{\n  static void run()\n  {\n    std::cout << M << \"f\\t\";\n    loop_on_n<M,N,K,float,CoeffBasedProductMode>::run();\n    std::cout << \"\\n\";\n    \n    std::cout << M << \"f\\t\";\n    loop_on_n<M,N,K,float,-1>::run();\n    std::cout << \"\\n\";\n\n    loop_on_m<M+1,N,K>::run();\n  }\n};\n\ntemplate<int N, int K>\nstruct loop_on_m<END,N,K> { static void run(){} };\n\ntemplate<int M, int N, int K, typename Scalar, int Mode>\nstruct loop_on_n\n{\n  static void run()\n  {\n    bench_prod<M,N,K,Scalar,Mode==-1? alt_prod<M,N,K>::ret : Mode>();\n    \n    loop_on_n<M,N+1,K,Scalar,Mode>::run();\n  }\n};\n\ntemplate<int M, int K, typename Scalar, int Mode>\nstruct loop_on_n<M,END,K,Scalar,Mode> { static void run(){} };\n\ntemplate<int N> struct print_n\n{\n  static void run()\n  {\n    std::cout << map_size<N>::ret << \"\\t\";\n    print_n<N+1>::run();\n  }\n};\n\ntemplate<> struct print_n<END> { static void run(){} };\n\nint main()\n{\n  loop_on_k<1,1,1>::run();\n  \n  return 0; \n}\n"
  },
  {
    "path": "libs/eigen/bench/quat_slerp.cpp",
    "content": "\n#include <iostream>\n#include <Eigen/Geometry>\n#include <bench/BenchTimer.h>\nusing namespace Eigen;\nusing namespace std;\n\n\n\ntemplate<typename Q>\nEIGEN_DONT_INLINE Q nlerp(const Q& a, const Q& b, typename Q::Scalar t)\n{\n  return Q((a.coeffs() * (1.0-t) + b.coeffs() * t).normalized());\n}\n\ntemplate<typename Q>\nEIGEN_DONT_INLINE Q slerp_eigen(const Q& a, const Q& b, typename Q::Scalar t)\n{\n  return a.slerp(t,b);\n}\n\ntemplate<typename Q>\nEIGEN_DONT_INLINE Q slerp_legacy(const Q& a, const Q& b, typename Q::Scalar t)\n{\n  typedef typename Q::Scalar Scalar;\n  static const Scalar one = Scalar(1) - dummy_precision<Scalar>();\n  Scalar d = a.dot(b);\n  Scalar absD = internal::abs(d);\n  if (absD>=one)\n    return a;\n\n  // theta is the angle between the 2 quaternions\n  Scalar theta = std::acos(absD);\n  Scalar sinTheta = internal::sin(theta);\n\n  Scalar scale0 = internal::sin( ( Scalar(1) - t ) * theta) / sinTheta;\n  Scalar scale1 = internal::sin( ( t * theta) ) / sinTheta;\n  if (d<0)\n    scale1 = -scale1;\n\n  return Q(scale0 * a.coeffs() + scale1 * b.coeffs());\n}\n\ntemplate<typename Q>\nEIGEN_DONT_INLINE Q slerp_legacy_nlerp(const Q& a, const Q& b, typename Q::Scalar t)\n{\n  typedef typename Q::Scalar Scalar;\n  static const Scalar one = Scalar(1) - epsilon<Scalar>();\n  Scalar d = a.dot(b);\n  Scalar absD = internal::abs(d);\n  \n  Scalar scale0;\n  Scalar scale1;\n  \n  if (absD>=one)\n  {\n    scale0 = Scalar(1) - t;\n    scale1 = t;\n  }\n  else\n  {\n    // theta is the angle between the 2 quaternions\n    Scalar theta = std::acos(absD);\n    Scalar sinTheta = internal::sin(theta);\n\n    scale0 = internal::sin( ( Scalar(1) - t ) * theta) / sinTheta;\n    scale1 = internal::sin( ( t * theta) ) / sinTheta;\n    if (d<0)\n      scale1 = -scale1;\n  }\n\n  return Q(scale0 * a.coeffs() + scale1 * b.coeffs());\n}\n\ntemplate<typename T>\ninline T sin_over_x(T x)\n{\n  if (T(1) + x*x == T(1))\n    return T(1);\n  else\n    return std::sin(x)/x;\n}\n\ntemplate<typename Q>\nEIGEN_DONT_INLINE Q slerp_rw(const Q& a, const Q& b, typename Q::Scalar t)\n{\n  typedef typename Q::Scalar Scalar;\n  \n  Scalar d = a.dot(b);\n  Scalar theta;\n  if (d<0.0)\n    theta = /*M_PI -*/ Scalar(2)*std::asin( (a.coeffs()+b.coeffs()).norm()/2 );\n  else\n    theta = Scalar(2)*std::asin( (a.coeffs()-b.coeffs()).norm()/2 );\n  \n  // theta is the angle between the 2 quaternions\n//   Scalar theta = std::acos(absD);\n  Scalar sinOverTheta = sin_over_x(theta);\n\n  Scalar scale0 = (Scalar(1)-t)*sin_over_x( ( Scalar(1) - t ) * theta) / sinOverTheta;\n  Scalar scale1 = t * sin_over_x( ( t * theta) ) / sinOverTheta;\n  if (d<0)\n    scale1 = -scale1;\n\n  return Quaternion<Scalar>(scale0 * a.coeffs() + scale1 * b.coeffs());\n}\n\ntemplate<typename Q>\nEIGEN_DONT_INLINE Q slerp_gael(const Q& a, const Q& b, typename Q::Scalar t)\n{\n  typedef typename Q::Scalar Scalar;\n  \n  Scalar d = a.dot(b);\n  Scalar theta;\n//   theta = Scalar(2) * atan2((a.coeffs()-b.coeffs()).norm(),(a.coeffs()+b.coeffs()).norm());\n//   if (d<0.0)\n//     theta = M_PI-theta;\n  \n  if (d<0.0)\n    theta = /*M_PI -*/ Scalar(2)*std::asin( (-a.coeffs()-b.coeffs()).norm()/2 );\n  else\n    theta = Scalar(2)*std::asin( (a.coeffs()-b.coeffs()).norm()/2 );\n  \n  \n  Scalar scale0;\n  Scalar scale1;\n  if(theta*theta-Scalar(6)==-Scalar(6))\n  {\n    scale0 = Scalar(1) - t;\n    scale1 = t;\n  }\n  else\n  {\n    Scalar sinTheta = std::sin(theta);\n    scale0 = internal::sin( ( Scalar(1) - t ) * theta) / sinTheta;\n    scale1 = internal::sin( ( t * theta) ) / sinTheta;\n    if (d<0)\n      scale1 = -scale1;\n  }\n\n  return Quaternion<Scalar>(scale0 * a.coeffs() + scale1 * b.coeffs());\n}\n\nint main()\n{\n  typedef double RefScalar;\n  typedef float TestScalar;\n  \n  typedef Quaternion<RefScalar>  Qd;\n  typedef Quaternion<TestScalar> Qf;\n  \n  unsigned int g_seed = (unsigned int) time(NULL);\n  std::cout << g_seed << \"\\n\";\n//   g_seed = 1259932496;\n  srand(g_seed);\n  \n  Matrix<RefScalar,Dynamic,1> maxerr(7);\n  maxerr.setZero();\n  \n  Matrix<RefScalar,Dynamic,1> avgerr(7);\n  avgerr.setZero();\n  \n  cout << \"double=>float=>double       nlerp        eigen        legacy(snap)         legacy(nlerp)        rightway         gael's criteria\\n\";\n  \n  int rep = 100;\n  int iters = 40;\n  for (int w=0; w<rep; ++w)\n  {\n    Qf a, b;\n    a.coeffs().setRandom();\n    a.normalize();\n    b.coeffs().setRandom();\n    b.normalize();\n    \n    Qf c[6];\n    \n    Qd ar(a.cast<RefScalar>());\n    Qd br(b.cast<RefScalar>());\n    Qd cr;\n    \n    \n    \n    cout.precision(8);\n    cout << std::scientific;\n    for (int i=0; i<iters; ++i)\n    {\n      RefScalar t = 0.65;\n      cr = slerp_rw(ar,br,t);\n      \n      Qf refc = cr.cast<TestScalar>();\n      c[0] = nlerp(a,b,t);\n      c[1] = slerp_eigen(a,b,t);\n      c[2] = slerp_legacy(a,b,t);\n      c[3] = slerp_legacy_nlerp(a,b,t);\n      c[4] = slerp_rw(a,b,t);\n      c[5] = slerp_gael(a,b,t);\n      \n      VectorXd err(7);\n      err[0] = (cr.coeffs()-refc.cast<RefScalar>().coeffs()).norm();\n//       std::cout << err[0] << \"    \";\n      for (int k=0; k<6; ++k)\n      {\n        err[k+1] = (c[k].coeffs()-refc.coeffs()).norm();\n//         std::cout << err[k+1] << \"    \";\n      }\n      maxerr = maxerr.cwise().max(err);\n      avgerr += err;\n//       std::cout << \"\\n\";\n      b = cr.cast<TestScalar>();\n      br = cr;\n    }\n//     std::cout << \"\\n\";\n  }\n  avgerr /= RefScalar(rep*iters);\n  cout << \"\\n\\nAccuracy:\\n\"\n       << \"  max: \" << maxerr.transpose() << \"\\n\";\n  cout << \"  avg: \" << avgerr.transpose() << \"\\n\";\n  \n  // perf bench\n  Quaternionf a,b;\n  a.coeffs().setRandom();\n  a.normalize();\n  b.coeffs().setRandom();\n  b.normalize();\n  //b = a;\n  float s = 0.65;\n    \n  #define BENCH(FUNC) {\\\n    BenchTimer t; \\\n    for(int k=0; k<2; ++k) {\\\n      t.start(); \\\n      for(int i=0; i<1000000; ++i) \\\n        FUNC(a,b,s); \\\n      t.stop(); \\\n    } \\\n    cout << \"  \" << #FUNC << \" => \\t \" << t.value() << \"s\\n\"; \\\n  }\n  \n  cout << \"\\nSpeed:\\n\" << std::fixed;\n  BENCH(nlerp);\n  BENCH(slerp_eigen);\n  BENCH(slerp_legacy);\n  BENCH(slerp_legacy_nlerp);\n  BENCH(slerp_rw);\n  BENCH(slerp_gael);\n}\n\n"
  },
  {
    "path": "libs/eigen/bench/quatmul.cpp",
    "content": "#include <iostream>\n#include <Eigen/Core>\n#include <Eigen/Geometry>\n#include <bench/BenchTimer.h>\n\nusing namespace Eigen; \n\ntemplate<typename Quat>\nEIGEN_DONT_INLINE void quatmul_default(const Quat& a, const Quat& b, Quat& c)\n{\n  c = a * b;\n}\n\ntemplate<typename Quat>\nEIGEN_DONT_INLINE void quatmul_novec(const Quat& a, const Quat& b, Quat& c)\n{\n  c = internal::quat_product<0, Quat, Quat, typename Quat::Scalar, Aligned>::run(a,b);\n}\n\ntemplate<typename Quat> void bench(const std::string& label)\n{\n  int tries = 10;\n  int rep = 1000000;\n  BenchTimer t;\n  \n  Quat a(4, 1, 2, 3);\n  Quat b(2, 3, 4, 5);\n  Quat c;\n  \n  std::cout.precision(3);\n  \n  BENCH(t, tries, rep, quatmul_default(a,b,c));\n  std::cout << label << \" default \" << 1e3*t.best(CPU_TIMER) << \"ms  \\t\" << 1e-6*double(rep)/(t.best(CPU_TIMER)) << \" M mul/s\\n\";\n  \n  BENCH(t, tries, rep, quatmul_novec(a,b,c));\n  std::cout << label << \" novec   \" << 1e3*t.best(CPU_TIMER) << \"ms  \\t\" << 1e-6*double(rep)/(t.best(CPU_TIMER)) << \" M mul/s\\n\";\n}\n\nint main()\n{\n  bench<Quaternionf>(\"float \");\n  bench<Quaterniond>(\"double\");\n\n  return 0;\n\n}\n\n"
  },
  {
    "path": "libs/eigen/bench/sparse_cholesky.cpp",
    "content": "// #define EIGEN_TAUCS_SUPPORT\n// #define EIGEN_CHOLMOD_SUPPORT\n#include <iostream>\n#include <Eigen/Sparse>\n\n// g++ -DSIZE=10000 -DDENSITY=0.001  sparse_cholesky.cpp -I.. -DDENSEMATRI -O3 -g0 -DNDEBUG   -DNBTRIES=1 -I /home/gael/Coding/LinearAlgebra/taucs_full/src/ -I/home/gael/Coding/LinearAlgebra/taucs_full/build/linux/  -L/home/gael/Coding/LinearAlgebra/taucs_full/lib/linux/ -ltaucs /home/gael/Coding/LinearAlgebra/GotoBLAS/libgoto.a -lpthread -I /home/gael/Coding/LinearAlgebra/SuiteSparse/CHOLMOD/Include/ $CHOLLIB -I /home/gael/Coding/LinearAlgebra/SuiteSparse/UFconfig/ /home/gael/Coding/LinearAlgebra/SuiteSparse/CCOLAMD/Lib/libccolamd.a   /home/gael/Coding/LinearAlgebra/SuiteSparse/CHOLMOD/Lib/libcholmod.a -lmetis /home/gael/Coding/LinearAlgebra/SuiteSparse/AMD/Lib/libamd.a  /home/gael/Coding/LinearAlgebra/SuiteSparse/CAMD/Lib/libcamd.a   /home/gael/Coding/LinearAlgebra/SuiteSparse/CCOLAMD/Lib/libccolamd.a  /home/gael/Coding/LinearAlgebra/SuiteSparse/COLAMD/Lib/libcolamd.a -llapack && ./a.out\n\n#define NOGMM\n#define NOMTL\n\n#ifndef SIZE\n#define SIZE 10\n#endif\n\n#ifndef DENSITY\n#define DENSITY 0.01\n#endif\n\n#ifndef REPEAT\n#define REPEAT 1\n#endif\n\n#include \"BenchSparseUtil.h\"\n\n#ifndef MINDENSITY\n#define MINDENSITY 0.0004\n#endif\n\n#ifndef NBTRIES\n#define NBTRIES 10\n#endif\n\n#define BENCH(X) \\\n  timer.reset(); \\\n  for (int _j=0; _j<NBTRIES; ++_j) { \\\n    timer.start(); \\\n    for (int _k=0; _k<REPEAT; ++_k) { \\\n        X  \\\n  } timer.stop(); }\n\n// typedef SparseMatrix<Scalar,UpperTriangular> EigenSparseTriMatrix;\ntypedef SparseMatrix<Scalar,SelfAdjoint|LowerTriangular> EigenSparseSelfAdjointMatrix;\n\nvoid fillSpdMatrix(float density, int rows, int cols,  EigenSparseSelfAdjointMatrix& dst)\n{\n  dst.startFill(rows*cols*density);\n  for(int j = 0; j < cols; j++)\n  {\n    dst.fill(j,j) = internal::random<Scalar>(10,20);\n    for(int i = j+1; i < rows; i++)\n    {\n      Scalar v = (internal::random<float>(0,1) < density) ? internal::random<Scalar>() : 0;\n      if (v!=0)\n        dst.fill(i,j) = v;\n    }\n\n  }\n  dst.endFill();\n}\n\n#include <Eigen/Cholesky>\n\ntemplate<int Backend>\nvoid doEigen(const char* name, const EigenSparseSelfAdjointMatrix& sm1, int flags = 0)\n{\n  std::cout << name << \"...\" << std::flush;\n  BenchTimer timer;\n  timer.start();\n  SparseLLT<EigenSparseSelfAdjointMatrix,Backend> chol(sm1, flags);\n  timer.stop();\n  std::cout << \":\\t\" << timer.value() << endl;\n\n  std::cout << \"  nnz: \" << sm1.nonZeros() << \" => \" << chol.matrixL().nonZeros() << \"\\n\";\n//   std::cout << \"sparse\\n\" << chol.matrixL() << \"%\\n\";\n}\n\nint main(int argc, char *argv[])\n{\n  int rows = SIZE;\n  int cols = SIZE;\n  float density = DENSITY;\n  BenchTimer timer;\n\n  VectorXf b = VectorXf::Random(cols);\n  VectorXf x = VectorXf::Random(cols);\n\n  bool densedone = false;\n\n  //for (float density = DENSITY; density>=MINDENSITY; density*=0.5)\n//   float density = 0.5;\n  {\n    EigenSparseSelfAdjointMatrix sm1(rows, cols);\n    std::cout << \"Generate sparse matrix (might take a while)...\\n\";\n    fillSpdMatrix(density, rows, cols, sm1);\n    std::cout << \"DONE\\n\\n\";\n\n    // dense matrices\n    #ifdef DENSEMATRIX\n    if (!densedone)\n    {\n      densedone = true;\n      std::cout << \"Eigen Dense\\t\" << density*100 << \"%\\n\";\n      DenseMatrix m1(rows,cols);\n      eiToDense(sm1, m1);\n      m1 = (m1 + m1.transpose()).eval();\n      m1.diagonal() *= 0.5;\n\n//       BENCH(LLT<DenseMatrix> chol(m1);)\n//       std::cout << \"dense:\\t\" << timer.value() << endl;\n\n      BenchTimer timer;\n      timer.start();\n      LLT<DenseMatrix> chol(m1);\n      timer.stop();\n      std::cout << \"dense:\\t\" << timer.value() << endl;\n      int count = 0;\n      for (int j=0; j<cols; ++j)\n        for (int i=j; i<rows; ++i)\n          if (!internal::isMuchSmallerThan(internal::abs(chol.matrixL()(i,j)), 0.1))\n            count++;\n      std::cout << \"dense: \" << \"nnz = \" << count << \"\\n\";\n//       std::cout << \"dense:\\n\" << m1 << \"\\n\\n\" << chol.matrixL() << endl;\n    }\n    #endif\n\n    // eigen sparse matrices\n    doEigen<Eigen::DefaultBackend>(\"Eigen/Sparse\", sm1, Eigen::IncompleteFactorization);\n\n    #ifdef EIGEN_CHOLMOD_SUPPORT\n    doEigen<Eigen::Cholmod>(\"Eigen/Cholmod\", sm1, Eigen::IncompleteFactorization);\n    #endif\n\n    #ifdef EIGEN_TAUCS_SUPPORT\n    doEigen<Eigen::Taucs>(\"Eigen/Taucs\", sm1, Eigen::IncompleteFactorization);\n    #endif\n\n    #if 0\n    // TAUCS\n    {\n      taucs_ccs_matrix A = sm1.asTaucsMatrix();\n\n      //BENCH(taucs_ccs_matrix* chol = taucs_ccs_factor_llt(&A, 0, 0);)\n//       BENCH(taucs_supernodal_factor_to_ccs(taucs_ccs_factor_llt_ll(&A));)\n//       std::cout << \"taucs:\\t\" << timer.value() << endl;\n\n      taucs_ccs_matrix* chol = taucs_ccs_factor_llt(&A, 0, 0);\n\n      for (int j=0; j<cols; ++j)\n      {\n        for (int i=chol->colptr[j]; i<chol->colptr[j+1]; ++i)\n          std::cout << chol->values.d[i] << \" \";\n      }\n    }\n\n    // CHOLMOD\n    #ifdef EIGEN_CHOLMOD_SUPPORT\n    {\n      cholmod_common c;\n      cholmod_start (&c);\n      cholmod_sparse A;\n      cholmod_factor *L;\n\n      A = sm1.asCholmodMatrix();\n      BenchTimer timer;\n//       timer.reset();\n      timer.start();\n      std::vector<int> perm(cols);\n//       std::vector<int> set(ncols);\n      for (int i=0; i<cols; ++i)\n        perm[i] = i;\n//       c.nmethods = 1;\n//       c.method[0] = 1;\n\n      c.nmethods = 1;\n      c.method [0].ordering = CHOLMOD_NATURAL;\n      c.postorder = 0;\n      c.final_ll = 1;\n\n      L = cholmod_analyze_p(&A, &perm[0], &perm[0], cols, &c);\n      timer.stop();\n      std::cout << \"cholmod/analyze:\\t\" << timer.value() << endl;\n      timer.reset();\n      timer.start();\n      cholmod_factorize(&A, L, &c);\n      timer.stop();\n      std::cout << \"cholmod/factorize:\\t\" << timer.value() << endl;\n\n      cholmod_sparse* cholmat = cholmod_factor_to_sparse(L, &c);\n\n      cholmod_print_factor(L, \"Factors\", &c);\n\n      cholmod_print_sparse(cholmat, \"Chol\", &c);\n      cholmod_write_sparse(stdout, cholmat, 0, 0, &c);\n//\n//       cholmod_print_sparse(&A, \"A\", &c);\n//       cholmod_write_sparse(stdout, &A, 0, 0, &c);\n\n\n//       for (int j=0; j<cols; ++j)\n//       {\n//           for (int i=chol->colptr[j]; i<chol->colptr[j+1]; ++i)\n//             std::cout << chol->values.s[i] << \" \";\n//       }\n    }\n    #endif\n\n    #endif\n\n\n\n  }\n\n\n  return 0;\n}\n\n"
  },
  {
    "path": "libs/eigen/bench/sparse_dense_product.cpp",
    "content": "\n//g++ -O3 -g0 -DNDEBUG  sparse_product.cpp -I.. -I/home/gael/Coding/LinearAlgebra/mtl4/ -DDENSITY=0.005 -DSIZE=10000 && ./a.out\n//g++ -O3 -g0 -DNDEBUG  sparse_product.cpp -I.. -I/home/gael/Coding/LinearAlgebra/mtl4/ -DDENSITY=0.05 -DSIZE=2000 && ./a.out\n// -DNOGMM -DNOMTL -DCSPARSE\n// -I /home/gael/Coding/LinearAlgebra/CSparse/Include/ /home/gael/Coding/LinearAlgebra/CSparse/Lib/libcsparse.a\n#ifndef SIZE\n#define SIZE 650000\n#endif\n\n#ifndef DENSITY\n#define DENSITY 0.01\n#endif\n\n#ifndef REPEAT\n#define REPEAT 1\n#endif\n\n#include \"BenchSparseUtil.h\"\n\n#ifndef MINDENSITY\n#define MINDENSITY 0.0004\n#endif\n\n#ifndef NBTRIES\n#define NBTRIES 10\n#endif\n\n#define BENCH(X) \\\n  timer.reset(); \\\n  for (int _j=0; _j<NBTRIES; ++_j) { \\\n    timer.start(); \\\n    for (int _k=0; _k<REPEAT; ++_k) { \\\n        X  \\\n  } timer.stop(); }\n\n\n#ifdef CSPARSE\ncs* cs_sorted_multiply(const cs* a, const cs* b)\n{\n  cs* A = cs_transpose (a, 1) ;\n  cs* B = cs_transpose (b, 1) ;\n  cs* D = cs_multiply (B,A) ;   /* D = B'*A' */\n  cs_spfree (A) ;\n  cs_spfree (B) ;\n  cs_dropzeros (D) ;      /* drop zeros from D */\n  cs* C = cs_transpose (D, 1) ;   /* C = D', so that C is sorted */\n  cs_spfree (D) ;\n  return C;\n}\n#endif\n\nint main(int argc, char *argv[])\n{\n  int rows = SIZE;\n  int cols = SIZE;\n  float density = DENSITY;\n\n  EigenSparseMatrix sm1(rows,cols);\n  DenseVector v1(cols), v2(cols);\n  v1.setRandom();\n\n  BenchTimer timer;\n  for (float density = DENSITY; density>=MINDENSITY; density*=0.5)\n  {\n    //fillMatrix(density, rows, cols, sm1);\n    fillMatrix2(7, rows, cols, sm1);\n\n    // dense matrices\n    #ifdef DENSEMATRIX\n    {\n      std::cout << \"Eigen Dense\\t\" << density*100 << \"%\\n\";\n      DenseMatrix m1(rows,cols);\n      eiToDense(sm1, m1);\n\n      timer.reset();\n      timer.start();\n      for (int k=0; k<REPEAT; ++k)\n        v2 = m1 * v1;\n      timer.stop();\n      std::cout << \"   a * v:\\t\" << timer.best() << \"  \" << double(REPEAT)/timer.best() << \" * / sec \" << endl;\n\n      timer.reset();\n      timer.start();\n      for (int k=0; k<REPEAT; ++k)\n        v2 = m1.transpose() * v1;\n      timer.stop();\n      std::cout << \"   a' * v:\\t\" << timer.best() << endl;\n    }\n    #endif\n\n    // eigen sparse matrices\n    {\n      std::cout << \"Eigen sparse\\t\" << sm1.nonZeros()/float(sm1.rows()*sm1.cols())*100 << \"%\\n\";\n\n      BENCH(asm(\"#myc\"); v2 = sm1 * v1; asm(\"#myd\");)\n      std::cout << \"   a * v:\\t\" << timer.best()/REPEAT << \"  \" << double(REPEAT)/timer.best(REAL_TIMER) << \" * / sec \" << endl;\n\n\n      BENCH( { asm(\"#mya\"); v2 = sm1.transpose() * v1; asm(\"#myb\"); })\n\n      std::cout << \"   a' * v:\\t\" << timer.best()/REPEAT << endl;\n    }\n\n//     {\n//       DynamicSparseMatrix<Scalar> m1(sm1);\n//       std::cout << \"Eigen dyn-sparse\\t\" << m1.nonZeros()/float(m1.rows()*m1.cols())*100 << \"%\\n\";\n//\n//       BENCH(for (int k=0; k<REPEAT; ++k) v2 = m1 * v1;)\n//       std::cout << \"   a * v:\\t\" << timer.value() << endl;\n//\n//       BENCH(for (int k=0; k<REPEAT; ++k) v2 = m1.transpose() * v1;)\n//       std::cout << \"   a' * v:\\t\" << timer.value() << endl;\n//     }\n\n    // GMM++\n    #ifndef NOGMM\n    {\n      std::cout << \"GMM++ sparse\\t\" << density*100 << \"%\\n\";\n      //GmmDynSparse  gmmT3(rows,cols);\n      GmmSparse m1(rows,cols);\n      eiToGmm(sm1, m1);\n\n      std::vector<Scalar> gmmV1(cols), gmmV2(cols);\n      Map<Matrix<Scalar,Dynamic,1> >(&gmmV1[0], cols) = v1;\n      Map<Matrix<Scalar,Dynamic,1> >(&gmmV2[0], cols) = v2;\n\n      BENCH( asm(\"#myx\"); gmm::mult(m1, gmmV1, gmmV2); asm(\"#myy\"); )\n      std::cout << \"   a * v:\\t\" << timer.value() << endl;\n\n      BENCH( gmm::mult(gmm::transposed(m1), gmmV1, gmmV2); )\n      std::cout << \"   a' * v:\\t\" << timer.value() << endl;\n    }\n    #endif\n    \n    #ifndef NOUBLAS\n    {\n      std::cout << \"ublas sparse\\t\" << density*100 << \"%\\n\";\n      UBlasSparse m1(rows,cols);\n      eiToUblas(sm1, m1);\n      \n      boost::numeric::ublas::vector<Scalar> uv1, uv2;\n      eiToUblasVec(v1,uv1);\n      eiToUblasVec(v2,uv2);\n\n//       std::vector<Scalar> gmmV1(cols), gmmV2(cols);\n//       Map<Matrix<Scalar,Dynamic,1> >(&gmmV1[0], cols) = v1;\n//       Map<Matrix<Scalar,Dynamic,1> >(&gmmV2[0], cols) = v2;\n\n      BENCH( uv2 = boost::numeric::ublas::prod(m1, uv1); )\n      std::cout << \"   a * v:\\t\" << timer.value() << endl;\n\n//       BENCH( boost::ublas::prod(gmm::transposed(m1), gmmV1, gmmV2); )\n//       std::cout << \"   a' * v:\\t\" << timer.value() << endl;\n    }\n    #endif\n\n    // MTL4\n    #ifndef NOMTL\n    {\n      std::cout << \"MTL4\\t\" << density*100 << \"%\\n\";\n      MtlSparse m1(rows,cols);\n      eiToMtl(sm1, m1);\n      mtl::dense_vector<Scalar> mtlV1(cols, 1.0);\n      mtl::dense_vector<Scalar> mtlV2(cols, 1.0);\n\n      timer.reset();\n      timer.start();\n      for (int k=0; k<REPEAT; ++k)\n        mtlV2 = m1 * mtlV1;\n      timer.stop();\n      std::cout << \"   a * v:\\t\" << timer.value() << endl;\n\n      timer.reset();\n      timer.start();\n      for (int k=0; k<REPEAT; ++k)\n        mtlV2 = trans(m1) * mtlV1;\n      timer.stop();\n      std::cout << \"   a' * v:\\t\" << timer.value() << endl;\n    }\n    #endif\n\n    std::cout << \"\\n\\n\";\n  }\n\n  return 0;\n}\n\n"
  },
  {
    "path": "libs/eigen/bench/sparse_lu.cpp",
    "content": "\n// g++ -I.. sparse_lu.cpp -O3 -g0 -I /usr/include/superlu/ -lsuperlu -lgfortran -DSIZE=1000 -DDENSITY=.05 && ./a.out\n\n#define EIGEN_SUPERLU_SUPPORT\n#define EIGEN_UMFPACK_SUPPORT\n#include <Eigen/Sparse>\n\n#define NOGMM\n#define NOMTL\n\n#ifndef SIZE\n#define SIZE 10\n#endif\n\n#ifndef DENSITY\n#define DENSITY 0.01\n#endif\n\n#ifndef REPEAT\n#define REPEAT 1\n#endif\n\n#include \"BenchSparseUtil.h\"\n\n#ifndef MINDENSITY\n#define MINDENSITY 0.0004\n#endif\n\n#ifndef NBTRIES\n#define NBTRIES 10\n#endif\n\n#define BENCH(X) \\\n  timer.reset(); \\\n  for (int _j=0; _j<NBTRIES; ++_j) { \\\n    timer.start(); \\\n    for (int _k=0; _k<REPEAT; ++_k) { \\\n        X  \\\n  } timer.stop(); }\n\ntypedef Matrix<Scalar,Dynamic,1> VectorX;\n\n#include <Eigen/LU>\n\ntemplate<int Backend>\nvoid doEigen(const char* name, const EigenSparseMatrix& sm1, const VectorX& b, VectorX& x, int flags = 0)\n{\n  std::cout << name << \"...\" << std::flush;\n  BenchTimer timer; timer.start();\n  SparseLU<EigenSparseMatrix,Backend> lu(sm1, flags);\n  timer.stop();\n  if (lu.succeeded())\n    std::cout << \":\\t\" << timer.value() << endl;\n  else\n  {\n    std::cout << \":\\t FAILED\" << endl;\n    return;\n  }\n\n  bool ok;\n  timer.reset(); timer.start();\n  ok = lu.solve(b,&x);\n  timer.stop();\n  if (ok)\n    std::cout << \"  solve:\\t\" << timer.value() << endl;\n  else\n    std::cout << \"  solve:\\t\" << \" FAILED\" << endl;\n\n  //std::cout << x.transpose() << \"\\n\";\n}\n\nint main(int argc, char *argv[])\n{\n  int rows = SIZE;\n  int cols = SIZE;\n  float density = DENSITY;\n  BenchTimer timer;\n\n  VectorX b = VectorX::Random(cols);\n  VectorX x = VectorX::Random(cols);\n\n  bool densedone = false;\n\n  //for (float density = DENSITY; density>=MINDENSITY; density*=0.5)\n//   float density = 0.5;\n  {\n    EigenSparseMatrix sm1(rows, cols);\n    fillMatrix(density, rows, cols, sm1);\n\n    // dense matrices\n    #ifdef DENSEMATRIX\n    if (!densedone)\n    {\n      densedone = true;\n      std::cout << \"Eigen Dense\\t\" << density*100 << \"%\\n\";\n      DenseMatrix m1(rows,cols);\n      eiToDense(sm1, m1);\n\n      BenchTimer timer;\n      timer.start();\n      FullPivLU<DenseMatrix> lu(m1);\n      timer.stop();\n      std::cout << \"Eigen/dense:\\t\" << timer.value() << endl;\n\n      timer.reset();\n      timer.start();\n      lu.solve(b,&x);\n      timer.stop();\n      std::cout << \"  solve:\\t\" << timer.value() << endl;\n//       std::cout << b.transpose() << \"\\n\";\n//       std::cout << x.transpose() << \"\\n\";\n    }\n    #endif\n\n    #ifdef EIGEN_UMFPACK_SUPPORT\n    x.setZero();\n    doEigen<Eigen::UmfPack>(\"Eigen/UmfPack (auto)\", sm1, b, x, 0);\n    #endif\n\n    #ifdef EIGEN_SUPERLU_SUPPORT\n    x.setZero();\n    doEigen<Eigen::SuperLU>(\"Eigen/SuperLU (nat)\", sm1, b, x, Eigen::NaturalOrdering);\n//     doEigen<Eigen::SuperLU>(\"Eigen/SuperLU (MD AT+A)\", sm1, b, x, Eigen::MinimumDegree_AT_PLUS_A);\n//     doEigen<Eigen::SuperLU>(\"Eigen/SuperLU (MD ATA)\", sm1, b, x, Eigen::MinimumDegree_ATA);\n    doEigen<Eigen::SuperLU>(\"Eigen/SuperLU (COLAMD)\", sm1, b, x, Eigen::ColApproxMinimumDegree);\n    #endif\n\n  }\n\n  return 0;\n}\n\n"
  },
  {
    "path": "libs/eigen/bench/sparse_product.cpp",
    "content": "\n//g++ -O3 -g0 -DNDEBUG  sparse_product.cpp -I.. -I/home/gael/Coding/LinearAlgebra/mtl4/ -DDENSITY=0.005 -DSIZE=10000 && ./a.out\n//g++ -O3 -g0 -DNDEBUG  sparse_product.cpp -I.. -I/home/gael/Coding/LinearAlgebra/mtl4/ -DDENSITY=0.05 -DSIZE=2000 && ./a.out\n// -DNOGMM -DNOMTL -DCSPARSE\n// -I /home/gael/Coding/LinearAlgebra/CSparse/Include/ /home/gael/Coding/LinearAlgebra/CSparse/Lib/libcsparse.a\n\n#include <typeinfo>\n\n#ifndef SIZE\n#define SIZE 1000000\n#endif\n\n#ifndef NNZPERCOL\n#define NNZPERCOL 6\n#endif\n\n#ifndef REPEAT\n#define REPEAT 1\n#endif\n\n#include <algorithm>\n#include \"BenchTimer.h\"\n#include \"BenchUtil.h\"\n#include \"BenchSparseUtil.h\"\n\n#ifndef NBTRIES\n#define NBTRIES 1\n#endif\n\n#define BENCH(X) \\\n  timer.reset(); \\\n  for (int _j=0; _j<NBTRIES; ++_j) { \\\n    timer.start(); \\\n    for (int _k=0; _k<REPEAT; ++_k) { \\\n        X  \\\n  } timer.stop(); }\n\n// #ifdef MKL\n//\n// #include \"mkl_types.h\"\n// #include \"mkl_spblas.h\"\n//\n// template<typename Lhs,typename Rhs,typename Res>\n// void mkl_multiply(const Lhs& lhs, const Rhs& rhs, Res& res)\n// {\n//   char n = 'N';\n//   float alpha = 1;\n//   char matdescra[6];\n//   matdescra[0] = 'G';\n//   matdescra[1] = 0;\n//   matdescra[2] = 0;\n//   matdescra[3] = 'C';\n//   mkl_scscmm(&n, lhs.rows(), rhs.cols(), lhs.cols(), &alpha, matdescra,\n//              lhs._valuePtr(), lhs._innerIndexPtr(), lhs.outerIndexPtr(),\n//              pntre, b, &ldb, &beta, c, &ldc);\n// //   mkl_somatcopy('C', 'T', lhs.rows(), lhs.cols(), 1,\n// //                 lhs._valuePtr(), lhs.rows(), DST, dst_stride);\n// }\n//\n// #endif\n\n\n#ifdef CSPARSE\ncs* cs_sorted_multiply(const cs* a, const cs* b)\n{\n//   return cs_multiply(a,b);\n\n  cs* A = cs_transpose(a, 1);\n  cs* B = cs_transpose(b, 1);\n  cs* D = cs_multiply(B,A);   /* D = B'*A' */\n  cs_spfree (A) ;\n  cs_spfree (B) ;\n  cs_dropzeros (D) ;      /* drop zeros from D */\n  cs* C = cs_transpose (D, 1) ;   /* C = D', so that C is sorted */\n  cs_spfree (D) ;\n  return C;\n\n//   cs* A = cs_transpose(a, 1);\n//   cs* C = cs_transpose(A, 1);\n//   return C;\n}\n\ncs* cs_sorted_multiply2(const cs* a, const cs* b)\n{\n  cs* D = cs_multiply(a,b);\n  cs* E = cs_transpose(D,1);\n  cs_spfree(D);\n  cs* C = cs_transpose(E,1);\n  cs_spfree(E);\n  return C;\n}\n#endif\n\nvoid bench_sort();\n\nint main(int argc, char *argv[])\n{\n//   bench_sort();\n\n  int rows = SIZE;\n  int cols = SIZE;\n  float density = DENSITY;\n\n  EigenSparseMatrix sm1(rows,cols), sm2(rows,cols), sm3(rows,cols), sm4(rows,cols);\n\n  BenchTimer timer;\n  for (int nnzPerCol = NNZPERCOL; nnzPerCol>1; nnzPerCol/=1.1)\n  {\n    sm1.setZero();\n    sm2.setZero();\n    fillMatrix2(nnzPerCol, rows, cols, sm1);\n    fillMatrix2(nnzPerCol, rows, cols, sm2);\n//     std::cerr << \"filling OK\\n\";\n\n    // dense matrices\n    #ifdef DENSEMATRIX\n    {\n      std::cout << \"Eigen Dense\\t\" << nnzPerCol << \"%\\n\";\n      DenseMatrix m1(rows,cols), m2(rows,cols), m3(rows,cols);\n      eiToDense(sm1, m1);\n      eiToDense(sm2, m2);\n\n      timer.reset();\n      timer.start();\n      for (int k=0; k<REPEAT; ++k)\n        m3 = m1 * m2;\n      timer.stop();\n      std::cout << \"   a * b:\\t\" << timer.value() << endl;\n\n      timer.reset();\n      timer.start();\n      for (int k=0; k<REPEAT; ++k)\n        m3 = m1.transpose() * m2;\n      timer.stop();\n      std::cout << \"   a' * b:\\t\" << timer.value() << endl;\n\n      timer.reset();\n      timer.start();\n      for (int k=0; k<REPEAT; ++k)\n        m3 = m1.transpose() * m2.transpose();\n      timer.stop();\n      std::cout << \"   a' * b':\\t\" << timer.value() << endl;\n\n      timer.reset();\n      timer.start();\n      for (int k=0; k<REPEAT; ++k)\n        m3 = m1 * m2.transpose();\n      timer.stop();\n      std::cout << \"   a * b':\\t\" << timer.value() << endl;\n    }\n    #endif\n\n    // eigen sparse matrices\n    {\n      std::cout << \"Eigen sparse\\t\" << sm1.nonZeros()/(float(sm1.rows())*float(sm1.cols()))*100 << \"% * \"\n                << sm2.nonZeros()/(float(sm2.rows())*float(sm2.cols()))*100 << \"%\\n\";\n\n      BENCH(sm3 = sm1 * sm2; )\n      std::cout << \"   a * b:\\t\" << timer.value() << endl;\n\n//       BENCH(sm3 = sm1.transpose() * sm2; )\n//       std::cout << \"   a' * b:\\t\" << timer.value() << endl;\n// //\n//       BENCH(sm3 = sm1.transpose() * sm2.transpose(); )\n//       std::cout << \"   a' * b':\\t\" << timer.value() << endl;\n// //\n//       BENCH(sm3 = sm1 * sm2.transpose(); )\n//       std::cout << \"   a * b' :\\t\" << timer.value() << endl;\n\n\n//       std::cout << \"\\n\";\n//\n//       BENCH( sm3._experimentalNewProduct(sm1, sm2); )\n//       std::cout << \"   a * b:\\t\" << timer.value() << endl;\n//\n//       BENCH(sm3._experimentalNewProduct(sm1.transpose(),sm2); )\n//       std::cout << \"   a' * b:\\t\" << timer.value() << endl;\n// //\n//       BENCH(sm3._experimentalNewProduct(sm1.transpose(),sm2.transpose()); )\n//       std::cout << \"   a' * b':\\t\" << timer.value() << endl;\n// //\n//       BENCH(sm3._experimentalNewProduct(sm1, sm2.transpose());)\n//       std::cout << \"   a * b' :\\t\" << timer.value() << endl;\n    }\n\n    // eigen dyn-sparse matrices\n    /*{\n      DynamicSparseMatrix<Scalar> m1(sm1), m2(sm2), m3(sm3);\n      std::cout << \"Eigen dyn-sparse\\t\" << m1.nonZeros()/(float(m1.rows())*float(m1.cols()))*100 << \"% * \"\n                << m2.nonZeros()/(float(m2.rows())*float(m2.cols()))*100 << \"%\\n\";\n\n//       timer.reset();\n//       timer.start();\n      BENCH(for (int k=0; k<REPEAT; ++k) m3 = m1 * m2;)\n//       timer.stop();\n      std::cout << \"   a * b:\\t\" << timer.value() << endl;\n//       std::cout << sm3 << \"\\n\";\n\n      timer.reset();\n      timer.start();\n//       std::cerr << \"transpose...\\n\";\n//       EigenSparseMatrix sm4 = sm1.transpose();\n//       std::cout << sm4.nonZeros() << \" == \" << sm1.nonZeros() << \"\\n\";\n//       exit(1);\n//       std::cerr << \"transpose OK\\n\";\n//       std::cout << sm1 << \"\\n\\n\" << sm1.transpose() << \"\\n\\n\" << sm4.transpose() << \"\\n\\n\";\n      BENCH(for (int k=0; k<REPEAT; ++k) m3 = m1.transpose() * m2;)\n//       timer.stop();\n      std::cout << \"   a' * b:\\t\" << timer.value() << endl;\n\n//       timer.reset();\n//       timer.start();\n      BENCH( for (int k=0; k<REPEAT; ++k) m3 = m1.transpose() * m2.transpose(); )\n//       timer.stop();\n      std::cout << \"   a' * b':\\t\" << timer.value() << endl;\n\n//       timer.reset();\n//       timer.start();\n      BENCH( for (int k=0; k<REPEAT; ++k) m3 = m1 * m2.transpose(); )\n//       timer.stop();\n      std::cout << \"   a * b' :\\t\" << timer.value() << endl;\n    }*/\n\n    // CSparse\n    #ifdef CSPARSE\n    {\n      std::cout << \"CSparse \\t\" << nnzPerCol << \"%\\n\";\n      cs *m1, *m2, *m3;\n      eiToCSparse(sm1, m1);\n      eiToCSparse(sm2, m2);\n\n      BENCH(\n      {\n        m3 = cs_sorted_multiply(m1, m2);\n        if (!m3)\n        {\n          std::cerr << \"cs_multiply failed\\n\";\n        }\n//         cs_print(m3, 0);\n        cs_spfree(m3);\n      }\n      );\n//       timer.stop();\n      std::cout << \"   a * b:\\t\" << timer.value() << endl;\n\n//       BENCH( { m3 = cs_sorted_multiply2(m1, m2); cs_spfree(m3); } );\n//       std::cout << \"   a * b:\\t\" << timer.value() << endl;\n    }\n    #endif\n\n    #ifndef NOUBLAS\n    {\n      std::cout << \"ublas\\t\" << nnzPerCol << \"%\\n\";\n      UBlasSparse m1(rows,cols), m2(rows,cols), m3(rows,cols);\n      eiToUblas(sm1, m1);\n      eiToUblas(sm2, m2);\n\n      BENCH(boost::numeric::ublas::prod(m1, m2, m3););\n      std::cout << \"   a * b:\\t\" << timer.value() << endl;\n    }\n    #endif\n\n    // GMM++\n    #ifndef NOGMM\n    {\n      std::cout << \"GMM++ sparse\\t\" << nnzPerCol << \"%\\n\";\n      GmmDynSparse  gmmT3(rows,cols);\n      GmmSparse m1(rows,cols), m2(rows,cols), m3(rows,cols);\n      eiToGmm(sm1, m1);\n      eiToGmm(sm2, m2);\n\n      BENCH(gmm::mult(m1, m2, gmmT3););\n      std::cout << \"   a * b:\\t\" << timer.value() << endl;\n\n//       BENCH(gmm::mult(gmm::transposed(m1), m2, gmmT3););\n//       std::cout << \"   a' * b:\\t\" << timer.value() << endl;\n//\n//       if (rows<500)\n//       {\n//         BENCH(gmm::mult(gmm::transposed(m1), gmm::transposed(m2), gmmT3););\n//         std::cout << \"   a' * b':\\t\" << timer.value() << endl;\n//\n//         BENCH(gmm::mult(m1, gmm::transposed(m2), gmmT3););\n//         std::cout << \"   a * b':\\t\" << timer.value() << endl;\n//       }\n//       else\n//       {\n//         std::cout << \"   a' * b':\\t\" << \"forever\" << endl;\n//         std::cout << \"   a * b':\\t\" << \"forever\" << endl;\n//       }\n    }\n    #endif\n\n    // MTL4\n    #ifndef NOMTL\n    {\n      std::cout << \"MTL4\\t\" << nnzPerCol << \"%\\n\";\n      MtlSparse m1(rows,cols), m2(rows,cols), m3(rows,cols);\n      eiToMtl(sm1, m1);\n      eiToMtl(sm2, m2);\n\n      BENCH(m3 = m1 * m2;);\n      std::cout << \"   a * b:\\t\" << timer.value() << endl;\n\n//       BENCH(m3 = trans(m1) * m2;);\n//       std::cout << \"   a' * b:\\t\" << timer.value() << endl;\n//\n//       BENCH(m3 = trans(m1) * trans(m2););\n//       std::cout << \"  a' * b':\\t\" << timer.value() << endl;\n//\n//       BENCH(m3 = m1 * trans(m2););\n//       std::cout << \"   a * b' :\\t\" << timer.value() << endl;\n    }\n    #endif\n\n    std::cout << \"\\n\\n\";\n  }\n\n  return 0;\n}\n\n\n\n"
  },
  {
    "path": "libs/eigen/bench/sparse_randomsetter.cpp",
    "content": "\n#define NOGMM\n#define NOMTL\n\n#include <map>\n#include <ext/hash_map>\n#include <google/dense_hash_map>\n#include <google/sparse_hash_map>\n\n#ifndef SIZE\n#define SIZE 10000\n#endif\n\n#ifndef DENSITY\n#define DENSITY 0.01\n#endif\n\n#ifndef REPEAT\n#define REPEAT 1\n#endif\n\n#include \"BenchSparseUtil.h\"\n\n#ifndef MINDENSITY\n#define MINDENSITY 0.0004\n#endif\n\n#ifndef NBTRIES\n#define NBTRIES 10\n#endif\n\n#define BENCH(X) \\\n  timer.reset(); \\\n  for (int _j=0; _j<NBTRIES; ++_j) { \\\n    timer.start(); \\\n    for (int _k=0; _k<REPEAT; ++_k) { \\\n        X  \\\n  } timer.stop(); }\n\n\nstatic double rtime;\nstatic double nentries;\n\ntemplate<typename SetterType>\nvoid dostuff(const char* name, EigenSparseMatrix& sm1)\n{\n  int rows = sm1.rows();\n  int cols = sm1.cols();\n  sm1.setZero();\n  BenchTimer t;\n  SetterType* set1 = new SetterType(sm1);\n  t.reset(); t.start();\n  for (int k=0; k<nentries; ++k)\n    (*set1)(internal::random<int>(0,rows-1),internal::random<int>(0,cols-1)) += 1;\n  t.stop();\n  std::cout << \"std::map =>      \\t\" << t.value()-rtime\n            << \" nnz=\" << set1->nonZeros() << std::flush;\n\n  // getchar();\n\n  t.reset(); t.start(); delete set1; t.stop();\n  std::cout << \"  back: \\t\" << t.value() << \"\\n\";\n}\n    \nint main(int argc, char *argv[])\n{\n  int rows = SIZE;\n  int cols = SIZE;\n  float density = DENSITY;\n\n  EigenSparseMatrix sm1(rows,cols), sm2(rows,cols);\n\n\n  nentries = rows*cols*density;\n  std::cout << \"n = \" << nentries << \"\\n\";\n  int dummy;\n  BenchTimer t;\n\n  t.reset(); t.start();\n  for (int k=0; k<nentries; ++k)\n    dummy = internal::random<int>(0,rows-1) + internal::random<int>(0,cols-1);\n  t.stop();\n  rtime = t.value();\n  std::cout << \"rtime = \" << rtime << \" (\" << dummy << \")\\n\\n\";\n  const int Bits = 6;\n  for (;;)\n  {\n    dostuff<RandomSetter<EigenSparseMatrix,StdMapTraits,Bits> >(\"std::map     \", sm1);\n    dostuff<RandomSetter<EigenSparseMatrix,GnuHashMapTraits,Bits> >(\"gnu::hash_map\", sm1);\n    dostuff<RandomSetter<EigenSparseMatrix,GoogleDenseHashMapTraits,Bits> >(\"google::dense\", sm1);\n    dostuff<RandomSetter<EigenSparseMatrix,GoogleSparseHashMapTraits,Bits> >(\"google::sparse\", sm1);\n\n//     {\n//       RandomSetter<EigenSparseMatrix,GnuHashMapTraits,Bits> set1(sm1);\n//       t.reset(); t.start();\n//       for (int k=0; k<n; ++k)\n//         set1(internal::random<int>(0,rows-1),internal::random<int>(0,cols-1)) += 1;\n//       t.stop();\n//       std::cout << \"gnu::hash_map => \\t\" << t.value()-rtime\n//                 << \" nnz=\" << set1.nonZeros() << \"\\n\";getchar();\n//     }\n//     {\n//       RandomSetter<EigenSparseMatrix,GoogleDenseHashMapTraits,Bits> set1(sm1);\n//       t.reset(); t.start();\n//       for (int k=0; k<n; ++k)\n//         set1(internal::random<int>(0,rows-1),internal::random<int>(0,cols-1)) += 1;\n//       t.stop();\n//       std::cout << \"google::dense => \\t\" << t.value()-rtime\n//                 << \" nnz=\" << set1.nonZeros() << \"\\n\";getchar();\n//     }\n//     {\n//       RandomSetter<EigenSparseMatrix,GoogleSparseHashMapTraits,Bits> set1(sm1);\n//       t.reset(); t.start();\n//       for (int k=0; k<n; ++k)\n//         set1(internal::random<int>(0,rows-1),internal::random<int>(0,cols-1)) += 1;\n//       t.stop();\n//       std::cout << \"google::sparse => \\t\" << t.value()-rtime\n//                 << \" nnz=\" << set1.nonZeros() << \"\\n\";getchar();\n//     }\n    std::cout << \"\\n\\n\";\n  }\n\n  return 0;\n}\n\n"
  },
  {
    "path": "libs/eigen/bench/sparse_setter.cpp",
    "content": "\n//g++ -O3 -g0 -DNDEBUG  sparse_product.cpp -I.. -I/home/gael/Coding/LinearAlgebra/mtl4/ -DDENSITY=0.005 -DSIZE=10000 && ./a.out\n//g++ -O3 -g0 -DNDEBUG  sparse_product.cpp -I.. -I/home/gael/Coding/LinearAlgebra/mtl4/ -DDENSITY=0.05 -DSIZE=2000 && ./a.out\n// -DNOGMM -DNOMTL -DCSPARSE\n// -I /home/gael/Coding/LinearAlgebra/CSparse/Include/ /home/gael/Coding/LinearAlgebra/CSparse/Lib/libcsparse.a\n#ifndef SIZE\n#define SIZE 100000\n#endif\n\n#ifndef NBPERROW\n#define NBPERROW 24\n#endif\n\n#ifndef REPEAT\n#define REPEAT 2\n#endif\n\n#ifndef NBTRIES\n#define NBTRIES 2\n#endif\n\n#ifndef KK\n#define KK 10\n#endif\n\n#ifndef NOGOOGLE\n#define EIGEN_GOOGLEHASH_SUPPORT\n#include <google/sparse_hash_map>\n#endif\n\n#include \"BenchSparseUtil.h\"\n\n#define CHECK_MEM\n// #define CHECK_MEM  std/**/::cout << \"check mem\\n\"; getchar();\n\n#define BENCH(X) \\\n  timer.reset(); \\\n  for (int _j=0; _j<NBTRIES; ++_j) { \\\n    timer.start(); \\\n    for (int _k=0; _k<REPEAT; ++_k) { \\\n        X  \\\n  } timer.stop(); }\n\ntypedef std::vector<Vector2i> Coordinates;\ntypedef std::vector<float> Values;\n\nEIGEN_DONT_INLINE Scalar* setinnerrand_eigen(const Coordinates& coords, const Values& vals);\nEIGEN_DONT_INLINE Scalar* setrand_eigen_dynamic(const Coordinates& coords, const Values& vals);\nEIGEN_DONT_INLINE Scalar* setrand_eigen_compact(const Coordinates& coords, const Values& vals);\nEIGEN_DONT_INLINE Scalar* setrand_eigen_sumeq(const Coordinates& coords, const Values& vals);\nEIGEN_DONT_INLINE Scalar* setrand_eigen_gnu_hash(const Coordinates& coords, const Values& vals);\nEIGEN_DONT_INLINE Scalar* setrand_eigen_google_dense(const Coordinates& coords, const Values& vals);\nEIGEN_DONT_INLINE Scalar* setrand_eigen_google_sparse(const Coordinates& coords, const Values& vals);\nEIGEN_DONT_INLINE Scalar* setrand_scipy(const Coordinates& coords, const Values& vals);\nEIGEN_DONT_INLINE Scalar* setrand_ublas_mapped(const Coordinates& coords, const Values& vals);\nEIGEN_DONT_INLINE Scalar* setrand_ublas_coord(const Coordinates& coords, const Values& vals);\nEIGEN_DONT_INLINE Scalar* setrand_ublas_compressed(const Coordinates& coords, const Values& vals);\nEIGEN_DONT_INLINE Scalar* setrand_ublas_genvec(const Coordinates& coords, const Values& vals);\nEIGEN_DONT_INLINE Scalar* setrand_mtl(const Coordinates& coords, const Values& vals);\n\nint main(int argc, char *argv[])\n{\n  int rows = SIZE;\n  int cols = SIZE;\n  bool fullyrand = true;\n\n  BenchTimer timer;\n  Coordinates coords;\n  Values values;\n  if(fullyrand)\n  {\n    Coordinates pool;\n    pool.reserve(cols*NBPERROW);\n    std::cerr << \"fill pool\" << \"\\n\";\n    for (int i=0; i<cols*NBPERROW; )\n    {\n//       DynamicSparseMatrix<int> stencil(SIZE,SIZE);\n      Vector2i ij(internal::random<int>(0,rows-1),internal::random<int>(0,cols-1));\n//       if(stencil.coeffRef(ij.x(), ij.y())==0)\n      {\n//         stencil.coeffRef(ij.x(), ij.y()) = 1;\n        pool.push_back(ij);\n\n      }\n      ++i;\n    }\n    std::cerr << \"pool ok\" << \"\\n\";\n    int n = cols*NBPERROW*KK;\n    coords.reserve(n);\n    values.reserve(n);\n    for (int i=0; i<n; ++i)\n    {\n      int i = internal::random<int>(0,pool.size());\n      coords.push_back(pool[i]);\n      values.push_back(internal::random<Scalar>());\n    }\n  }\n  else\n  {\n    for (int j=0; j<cols; ++j)\n    for (int i=0; i<NBPERROW; ++i)\n    {\n      coords.push_back(Vector2i(internal::random<int>(0,rows-1),j));\n      values.push_back(internal::random<Scalar>());\n    }\n  }\n  std::cout << \"nnz = \" << coords.size()  << \"\\n\";\n  CHECK_MEM\n\n    // dense matrices\n    #ifdef DENSEMATRIX\n    {\n      BENCH(setrand_eigen_dense(coords,values);)\n      std::cout << \"Eigen Dense\\t\" << timer.value() << \"\\n\";\n    }\n    #endif\n\n    // eigen sparse matrices\n//     if (!fullyrand)\n//     {\n//       BENCH(setinnerrand_eigen(coords,values);)\n//       std::cout << \"Eigen fillrand\\t\" << timer.value() << \"\\n\";\n//     }\n    {\n      BENCH(setrand_eigen_dynamic(coords,values);)\n      std::cout << \"Eigen dynamic\\t\" << timer.value() << \"\\n\";\n    }\n//     {\n//       BENCH(setrand_eigen_compact(coords,values);)\n//       std::cout << \"Eigen compact\\t\" << timer.value() << \"\\n\";\n//     }\n    {\n      BENCH(setrand_eigen_sumeq(coords,values);)\n      std::cout << \"Eigen sumeq\\t\" << timer.value() << \"\\n\";\n    }\n    {\n//       BENCH(setrand_eigen_gnu_hash(coords,values);)\n//       std::cout << \"Eigen std::map\\t\" << timer.value() << \"\\n\";\n    }\n    {\n      BENCH(setrand_scipy(coords,values);)\n      std::cout << \"scipy\\t\" << timer.value() << \"\\n\";\n    }\n    #ifndef NOGOOGLE\n    {\n      BENCH(setrand_eigen_google_dense(coords,values);)\n      std::cout << \"Eigen google dense\\t\" << timer.value() << \"\\n\";\n    }\n    {\n      BENCH(setrand_eigen_google_sparse(coords,values);)\n      std::cout << \"Eigen google sparse\\t\" << timer.value() << \"\\n\";\n    }\n    #endif\n\n    #ifndef NOUBLAS\n    {\n//       BENCH(setrand_ublas_mapped(coords,values);)\n//       std::cout << \"ublas mapped\\t\" << timer.value() << \"\\n\";\n    }\n    {\n      BENCH(setrand_ublas_genvec(coords,values);)\n      std::cout << \"ublas vecofvec\\t\" << timer.value() << \"\\n\";\n    }\n    /*{\n      timer.reset();\n      timer.start();\n      for (int k=0; k<REPEAT; ++k)\n        setrand_ublas_compressed(coords,values);\n      timer.stop();\n      std::cout << \"ublas comp\\t\" << timer.value() << \"\\n\";\n    }\n    {\n      timer.reset();\n      timer.start();\n      for (int k=0; k<REPEAT; ++k)\n        setrand_ublas_coord(coords,values);\n      timer.stop();\n      std::cout << \"ublas coord\\t\" << timer.value() << \"\\n\";\n    }*/\n    #endif\n\n\n    // MTL4\n    #ifndef NOMTL\n    {\n      BENCH(setrand_mtl(coords,values));\n      std::cout << \"MTL\\t\" << timer.value() << \"\\n\";\n    }\n    #endif\n\n  return 0;\n}\n\nEIGEN_DONT_INLINE Scalar* setinnerrand_eigen(const Coordinates& coords, const Values& vals)\n{\n  using namespace Eigen;\n  SparseMatrix<Scalar> mat(SIZE,SIZE);\n  //mat.startFill(2000000/*coords.size()*/);\n  for (int i=0; i<coords.size(); ++i)\n  {\n    mat.insert(coords[i].x(), coords[i].y()) = vals[i];\n  }\n  mat.finalize();\n  CHECK_MEM;\n  return 0;\n}\n\nEIGEN_DONT_INLINE Scalar* setrand_eigen_dynamic(const Coordinates& coords, const Values& vals)\n{\n  using namespace Eigen;\n  DynamicSparseMatrix<Scalar> mat(SIZE,SIZE);\n  mat.reserve(coords.size()/10);\n  for (int i=0; i<coords.size(); ++i)\n  {\n    mat.coeffRef(coords[i].x(), coords[i].y()) += vals[i];\n  }\n  mat.finalize();\n  CHECK_MEM;\n  return &mat.coeffRef(coords[0].x(), coords[0].y());\n}\n\nEIGEN_DONT_INLINE Scalar* setrand_eigen_sumeq(const Coordinates& coords, const Values& vals)\n{\n  using namespace Eigen;\n  int n = coords.size()/KK;\n  DynamicSparseMatrix<Scalar> mat(SIZE,SIZE);\n  for (int j=0; j<KK; ++j)\n  {\n    DynamicSparseMatrix<Scalar> aux(SIZE,SIZE);\n    mat.reserve(n);\n    for (int i=j*n; i<(j+1)*n; ++i)\n    {\n      aux.insert(coords[i].x(), coords[i].y()) += vals[i];\n    }\n    aux.finalize();\n    mat += aux;\n  }\n  return &mat.coeffRef(coords[0].x(), coords[0].y());\n}\n\nEIGEN_DONT_INLINE Scalar* setrand_eigen_compact(const Coordinates& coords, const Values& vals)\n{\n  using namespace Eigen;\n  DynamicSparseMatrix<Scalar> setter(SIZE,SIZE);\n  setter.reserve(coords.size()/10);\n  for (int i=0; i<coords.size(); ++i)\n  {\n    setter.coeffRef(coords[i].x(), coords[i].y()) += vals[i];\n  }\n  SparseMatrix<Scalar> mat = setter;\n  CHECK_MEM;\n  return &mat.coeffRef(coords[0].x(), coords[0].y());\n}\n\nEIGEN_DONT_INLINE Scalar* setrand_eigen_gnu_hash(const Coordinates& coords, const Values& vals)\n{\n  using namespace Eigen;\n  SparseMatrix<Scalar> mat(SIZE,SIZE);\n  {\n    RandomSetter<SparseMatrix<Scalar>, StdMapTraits > setter(mat);\n    for (int i=0; i<coords.size(); ++i)\n    {\n      setter(coords[i].x(), coords[i].y()) += vals[i];\n    }\n    CHECK_MEM;\n  }\n  return &mat.coeffRef(coords[0].x(), coords[0].y());\n}\n\n#ifndef NOGOOGLE\nEIGEN_DONT_INLINE Scalar* setrand_eigen_google_dense(const Coordinates& coords, const Values& vals)\n{\n  using namespace Eigen;\n  SparseMatrix<Scalar> mat(SIZE,SIZE);\n  {\n    RandomSetter<SparseMatrix<Scalar>, GoogleDenseHashMapTraits> setter(mat);\n    for (int i=0; i<coords.size(); ++i)\n      setter(coords[i].x(), coords[i].y()) += vals[i];\n    CHECK_MEM;\n  }\n  return &mat.coeffRef(coords[0].x(), coords[0].y());\n}\n\nEIGEN_DONT_INLINE Scalar* setrand_eigen_google_sparse(const Coordinates& coords, const Values& vals)\n{\n  using namespace Eigen;\n  SparseMatrix<Scalar> mat(SIZE,SIZE);\n  {\n    RandomSetter<SparseMatrix<Scalar>, GoogleSparseHashMapTraits> setter(mat);\n    for (int i=0; i<coords.size(); ++i)\n      setter(coords[i].x(), coords[i].y()) += vals[i];\n    CHECK_MEM;\n  }\n  return &mat.coeffRef(coords[0].x(), coords[0].y());\n}\n#endif\n\n\ntemplate <class T>\nvoid coo_tocsr(const int n_row,\n               const int n_col,\n               const int nnz,\n               const Coordinates Aij,\n               const Values Ax,\n                     int Bp[],\n                     int Bj[],\n                     T Bx[])\n{\n    //compute number of non-zero entries per row of A coo_tocsr\n    std::fill(Bp, Bp + n_row, 0);\n\n    for (int n = 0; n < nnz; n++){\n        Bp[Aij[n].x()]++;\n    }\n\n    //cumsum the nnz per row to get Bp[]\n    for(int i = 0, cumsum = 0; i < n_row; i++){\n        int temp = Bp[i];\n        Bp[i] = cumsum;\n        cumsum += temp;\n    }\n    Bp[n_row] = nnz;\n\n    //write Aj,Ax into Bj,Bx\n    for(int n = 0; n < nnz; n++){\n        int row  = Aij[n].x();\n        int dest = Bp[row];\n\n        Bj[dest] = Aij[n].y();\n        Bx[dest] = Ax[n];\n\n        Bp[row]++;\n    }\n\n    for(int i = 0, last = 0; i <= n_row; i++){\n        int temp = Bp[i];\n        Bp[i]  = last;\n        last   = temp;\n    }\n\n    //now Bp,Bj,Bx form a CSR representation (with possible duplicates)\n}\n\ntemplate< class T1, class T2 >\nbool kv_pair_less(const std::pair<T1,T2>& x, const std::pair<T1,T2>& y){\n    return x.first < y.first;\n}\n\n\ntemplate<class I, class T>\nvoid csr_sort_indices(const I n_row,\n                      const I Ap[],\n                            I Aj[],\n                            T Ax[])\n{\n    std::vector< std::pair<I,T> > temp;\n\n    for(I i = 0; i < n_row; i++){\n        I row_start = Ap[i];\n        I row_end   = Ap[i+1];\n\n        temp.clear();\n\n        for(I jj = row_start; jj < row_end; jj++){\n            temp.push_back(std::make_pair(Aj[jj],Ax[jj]));\n        }\n\n        std::sort(temp.begin(),temp.end(),kv_pair_less<I,T>);\n\n        for(I jj = row_start, n = 0; jj < row_end; jj++, n++){\n            Aj[jj] = temp[n].first;\n            Ax[jj] = temp[n].second;\n        }\n    }\n}\n\ntemplate <class I, class T>\nvoid csr_sum_duplicates(const I n_row,\n                        const I n_col,\n                              I Ap[],\n                              I Aj[],\n                              T Ax[])\n{\n    I nnz = 0;\n    I row_end = 0;\n    for(I i = 0; i < n_row; i++){\n        I jj = row_end;\n        row_end = Ap[i+1];\n        while( jj < row_end ){\n            I j = Aj[jj];\n            T x = Ax[jj];\n            jj++;\n            while( jj < row_end && Aj[jj] == j ){\n                x += Ax[jj];\n                jj++;\n            }\n            Aj[nnz] = j;\n            Ax[nnz] = x;\n            nnz++;\n        }\n        Ap[i+1] = nnz;\n    }\n}\n\nEIGEN_DONT_INLINE Scalar* setrand_scipy(const Coordinates& coords, const Values& vals)\n{\n  using namespace Eigen;\n  SparseMatrix<Scalar> mat(SIZE,SIZE);\n  mat.resizeNonZeros(coords.size());\n//   std::cerr << \"setrand_scipy...\\n\";\n  coo_tocsr<Scalar>(SIZE,SIZE, coords.size(), coords, vals, mat._outerIndexPtr(), mat._innerIndexPtr(), mat._valuePtr());\n//   std::cerr << \"coo_tocsr ok\\n\";\n\n  csr_sort_indices(SIZE, mat._outerIndexPtr(), mat._innerIndexPtr(), mat._valuePtr());\n\n  csr_sum_duplicates(SIZE, SIZE, mat._outerIndexPtr(), mat._innerIndexPtr(), mat._valuePtr());\n\n  mat.resizeNonZeros(mat._outerIndexPtr()[SIZE]);\n\n  return &mat.coeffRef(coords[0].x(), coords[0].y());\n}\n\n\n#ifndef NOUBLAS\nEIGEN_DONT_INLINE Scalar* setrand_ublas_mapped(const Coordinates& coords, const Values& vals)\n{\n  using namespace boost;\n  using namespace boost::numeric;\n  using namespace boost::numeric::ublas;\n  mapped_matrix<Scalar> aux(SIZE,SIZE);\n  for (int i=0; i<coords.size(); ++i)\n  {\n    aux(coords[i].x(), coords[i].y()) += vals[i];\n  }\n  CHECK_MEM;\n  compressed_matrix<Scalar> mat(aux);\n  return 0;// &mat(coords[0].x(), coords[0].y());\n}\n/*EIGEN_DONT_INLINE Scalar* setrand_ublas_coord(const Coordinates& coords, const Values& vals)\n{\n  using namespace boost;\n  using namespace boost::numeric;\n  using namespace boost::numeric::ublas;\n  coordinate_matrix<Scalar> aux(SIZE,SIZE);\n  for (int i=0; i<coords.size(); ++i)\n  {\n    aux(coords[i].x(), coords[i].y()) = vals[i];\n  }\n  compressed_matrix<Scalar> mat(aux);\n  return 0;//&mat(coords[0].x(), coords[0].y());\n}\nEIGEN_DONT_INLINE Scalar* setrand_ublas_compressed(const Coordinates& coords, const Values& vals)\n{\n  using namespace boost;\n  using namespace boost::numeric;\n  using namespace boost::numeric::ublas;\n  compressed_matrix<Scalar> mat(SIZE,SIZE);\n  for (int i=0; i<coords.size(); ++i)\n  {\n    mat(coords[i].x(), coords[i].y()) = vals[i];\n  }\n  return 0;//&mat(coords[0].x(), coords[0].y());\n}*/\nEIGEN_DONT_INLINE Scalar* setrand_ublas_genvec(const Coordinates& coords, const Values& vals)\n{\n  using namespace boost;\n  using namespace boost::numeric;\n  using namespace boost::numeric::ublas;\n\n//   ublas::vector<coordinate_vector<Scalar> > foo;\n  generalized_vector_of_vector<Scalar, row_major, ublas::vector<coordinate_vector<Scalar> > > aux(SIZE,SIZE);\n  for (int i=0; i<coords.size(); ++i)\n  {\n    aux(coords[i].x(), coords[i].y()) += vals[i];\n  }\n  CHECK_MEM;\n  compressed_matrix<Scalar,row_major> mat(aux);\n  return 0;//&mat(coords[0].x(), coords[0].y());\n}\n#endif\n\n#ifndef NOMTL\nEIGEN_DONT_INLINE void setrand_mtl(const Coordinates& coords, const Values& vals);\n#endif\n\n"
  },
  {
    "path": "libs/eigen/bench/sparse_transpose.cpp",
    "content": "\n//g++ -O3 -g0 -DNDEBUG  sparse_transpose.cpp -I.. -I/home/gael/Coding/LinearAlgebra/mtl4/ -DDENSITY=0.005 -DSIZE=10000 && ./a.out\n// -DNOGMM -DNOMTL\n// -DCSPARSE -I /home/gael/Coding/LinearAlgebra/CSparse/Include/ /home/gael/Coding/LinearAlgebra/CSparse/Lib/libcsparse.a\n\n#ifndef SIZE\n#define SIZE 10000\n#endif\n\n#ifndef DENSITY\n#define DENSITY 0.01\n#endif\n\n#ifndef REPEAT\n#define REPEAT 1\n#endif\n\n#include \"BenchSparseUtil.h\"\n\n#ifndef MINDENSITY\n#define MINDENSITY 0.0004\n#endif\n\n#ifndef NBTRIES\n#define NBTRIES 10\n#endif\n\n#define BENCH(X) \\\n  timer.reset(); \\\n  for (int _j=0; _j<NBTRIES; ++_j) { \\\n    timer.start(); \\\n    for (int _k=0; _k<REPEAT; ++_k) { \\\n        X  \\\n  } timer.stop(); }\n\nint main(int argc, char *argv[])\n{\n  int rows = SIZE;\n  int cols = SIZE;\n  float density = DENSITY;\n\n  EigenSparseMatrix sm1(rows,cols), sm3(rows,cols);\n\n  BenchTimer timer;\n  for (float density = DENSITY; density>=MINDENSITY; density*=0.5)\n  {\n    fillMatrix(density, rows, cols, sm1);\n\n    // dense matrices\n    #ifdef DENSEMATRIX\n    {\n      DenseMatrix m1(rows,cols), m3(rows,cols);\n      eiToDense(sm1, m1);\n      BENCH(for (int k=0; k<REPEAT; ++k) m3 = m1.transpose();)\n      std::cout << \"  Eigen dense:\\t\" << timer.value() << endl;\n    }\n    #endif\n\n    std::cout << \"Non zeros: \" << sm1.nonZeros()/float(sm1.rows()*sm1.cols())*100 << \"%\\n\";\n\n    // eigen sparse matrices\n    {\n      BENCH(for (int k=0; k<REPEAT; ++k) sm3 = sm1.transpose();)\n      std::cout << \"  Eigen:\\t\" << timer.value() << endl;\n    }\n\n    // CSparse\n    #ifdef CSPARSE\n    {\n      cs *m1, *m3;\n      eiToCSparse(sm1, m1);\n\n      BENCH(for (int k=0; k<REPEAT; ++k) { m3 = cs_transpose(m1,1); cs_spfree(m3);})\n      std::cout << \"  CSparse:\\t\" << timer.value() << endl;\n    }\n    #endif\n\n    // GMM++\n    #ifndef NOGMM\n    {\n      GmmDynSparse  gmmT3(rows,cols);\n      GmmSparse m1(rows,cols), m3(rows,cols);\n      eiToGmm(sm1, m1);\n      BENCH(for (int k=0; k<REPEAT; ++k) gmm::copy(gmm::transposed(m1),m3);)\n      std::cout << \"  GMM:\\t\\t\" << timer.value() << endl;\n    }\n    #endif\n\n    // MTL4\n    #ifndef NOMTL\n    {\n      MtlSparse m1(rows,cols), m3(rows,cols);\n      eiToMtl(sm1, m1);\n      BENCH(for (int k=0; k<REPEAT; ++k) m3 = trans(m1);)\n      std::cout << \"  MTL4:\\t\\t\" << timer.value() << endl;\n    }\n    #endif\n\n    std::cout << \"\\n\\n\";\n  }\n\n  return 0;\n}\n\n"
  },
  {
    "path": "libs/eigen/bench/sparse_trisolver.cpp",
    "content": "\n//g++ -O3 -g0 -DNDEBUG  sparse_product.cpp -I.. -I/home/gael/Coding/LinearAlgebra/mtl4/ -DDENSITY=0.005 -DSIZE=10000 && ./a.out\n//g++ -O3 -g0 -DNDEBUG  sparse_product.cpp -I.. -I/home/gael/Coding/LinearAlgebra/mtl4/ -DDENSITY=0.05 -DSIZE=2000 && ./a.out\n// -DNOGMM -DNOMTL\n// -I /home/gael/Coding/LinearAlgebra/CSparse/Include/ /home/gael/Coding/LinearAlgebra/CSparse/Lib/libcsparse.a\n\n#ifndef SIZE\n#define SIZE 10000\n#endif\n\n#ifndef DENSITY\n#define DENSITY 0.01\n#endif\n\n#ifndef REPEAT\n#define REPEAT 1\n#endif\n\n#include \"BenchSparseUtil.h\"\n\n#ifndef MINDENSITY\n#define MINDENSITY 0.0004\n#endif\n\n#ifndef NBTRIES\n#define NBTRIES 10\n#endif\n\n#define BENCH(X) \\\n  timer.reset(); \\\n  for (int _j=0; _j<NBTRIES; ++_j) { \\\n    timer.start(); \\\n    for (int _k=0; _k<REPEAT; ++_k) { \\\n        X  \\\n  } timer.stop(); }\n\ntypedef SparseMatrix<Scalar,UpperTriangular> EigenSparseTriMatrix;\ntypedef SparseMatrix<Scalar,RowMajorBit|UpperTriangular> EigenSparseTriMatrixRow;\n\nvoid fillMatrix(float density, int rows, int cols,  EigenSparseTriMatrix& dst)\n{\n  dst.startFill(rows*cols*density);\n  for(int j = 0; j < cols; j++)\n  {\n    for(int i = 0; i < j; i++)\n    {\n      Scalar v = (internal::random<float>(0,1) < density) ? internal::random<Scalar>() : 0;\n      if (v!=0)\n        dst.fill(i,j) = v;\n    }\n    dst.fill(j,j) = internal::random<Scalar>();\n  }\n  dst.endFill();\n}\n\nint main(int argc, char *argv[])\n{\n  int rows = SIZE;\n  int cols = SIZE;\n  float density = DENSITY;\n  BenchTimer timer;\n  #if 1\n  EigenSparseTriMatrix sm1(rows,cols);\n  typedef Matrix<Scalar,Dynamic,1> DenseVector;\n  DenseVector b = DenseVector::Random(cols);\n  DenseVector x = DenseVector::Random(cols);\n\n  bool densedone = false;\n\n  for (float density = DENSITY; density>=MINDENSITY; density*=0.5)\n  {\n    EigenSparseTriMatrix sm1(rows, cols);\n    fillMatrix(density, rows, cols, sm1);\n\n    // dense matrices\n    #ifdef DENSEMATRIX\n    if (!densedone)\n    {\n      densedone = true;\n      std::cout << \"Eigen Dense\\t\" << density*100 << \"%\\n\";\n      DenseMatrix m1(rows,cols);\n      Matrix<Scalar,Dynamic,Dynamic,Dynamic,Dynamic,RowMajorBit> m2(rows,cols);\n      eiToDense(sm1, m1);\n      m2 = m1;\n\n      BENCH(x = m1.marked<UpperTriangular>().solveTriangular(b);)\n      std::cout << \"   colmajor^-1 * b:\\t\" << timer.value() << endl;\n//       std::cerr << x.transpose() << \"\\n\";\n\n      BENCH(x = m2.marked<UpperTriangular>().solveTriangular(b);)\n      std::cout << \"   rowmajor^-1 * b:\\t\" << timer.value() << endl;\n//       std::cerr << x.transpose() << \"\\n\";\n    }\n    #endif\n\n    // eigen sparse matrices\n    {\n      std::cout << \"Eigen sparse\\t\" << density*100 << \"%\\n\";\n      EigenSparseTriMatrixRow sm2 = sm1;\n\n      BENCH(x = sm1.solveTriangular(b);)\n      std::cout << \"   colmajor^-1 * b:\\t\" << timer.value() << endl;\n//       std::cerr << x.transpose() << \"\\n\";\n\n      BENCH(x = sm2.solveTriangular(b);)\n      std::cout << \"   rowmajor^-1 * b:\\t\" << timer.value() << endl;\n//       std::cerr << x.transpose() << \"\\n\";\n\n//       x = b;\n//       BENCH(sm1.inverseProductInPlace(x);)\n//       std::cout << \"   colmajor^-1 * b:\\t\" << timer.value() << \" (inplace)\" << endl;\n//       std::cerr << x.transpose() << \"\\n\";\n//\n//       x = b;\n//       BENCH(sm2.inverseProductInPlace(x);)\n//       std::cout << \"   rowmajor^-1 * b:\\t\" << timer.value() << \" (inplace)\" << endl;\n//       std::cerr << x.transpose() << \"\\n\";\n    }\n\n\n\n    // CSparse\n    #ifdef CSPARSE\n    {\n      std::cout << \"CSparse \\t\" << density*100 << \"%\\n\";\n      cs *m1;\n      eiToCSparse(sm1, m1);\n\n      BENCH(x = b; if (!cs_lsolve (m1, x.data())){std::cerr << \"cs_lsolve failed\\n\"; break;}; )\n      std::cout << \"   colmajor^-1 * b:\\t\" << timer.value() << endl;\n    }\n    #endif\n\n    // GMM++\n    #ifndef NOGMM\n    {\n      std::cout << \"GMM++ sparse\\t\" << density*100 << \"%\\n\";\n      GmmSparse m1(rows,cols);\n      gmm::csr_matrix<Scalar> m2;\n      eiToGmm(sm1, m1);\n      gmm::copy(m1,m2);\n      std::vector<Scalar> gmmX(cols), gmmB(cols);\n      Map<Matrix<Scalar,Dynamic,1> >(&gmmX[0], cols) = x;\n      Map<Matrix<Scalar,Dynamic,1> >(&gmmB[0], cols) = b;\n\n      gmmX = gmmB;\n      BENCH(gmm::upper_tri_solve(m1, gmmX, false);)\n      std::cout << \"   colmajor^-1 * b:\\t\" << timer.value() << endl;\n//       std::cerr << Map<Matrix<Scalar,Dynamic,1> >(&gmmX[0], cols).transpose() << \"\\n\";\n\n      gmmX = gmmB;\n      BENCH(gmm::upper_tri_solve(m2, gmmX, false);)\n      timer.stop();\n      std::cout << \"   rowmajor^-1 * b:\\t\" << timer.value() << endl;\n//       std::cerr << Map<Matrix<Scalar,Dynamic,1> >(&gmmX[0], cols).transpose() << \"\\n\";\n    }\n    #endif\n\n    // MTL4\n    #ifndef NOMTL\n    {\n      std::cout << \"MTL4\\t\" << density*100 << \"%\\n\";\n      MtlSparse m1(rows,cols);\n      MtlSparseRowMajor m2(rows,cols);\n      eiToMtl(sm1, m1);\n      m2 = m1;\n      mtl::dense_vector<Scalar> x(rows, 1.0);\n      mtl::dense_vector<Scalar> b(rows, 1.0);\n\n      BENCH(x = mtl::upper_trisolve(m1,b);)\n      std::cout << \"   colmajor^-1 * b:\\t\" << timer.value() << endl;\n//       std::cerr << x << \"\\n\";\n\n      BENCH(x = mtl::upper_trisolve(m2,b);)\n      std::cout << \"   rowmajor^-1 * b:\\t\" << timer.value() << endl;\n//       std::cerr << x << \"\\n\";\n    }\n    #endif\n\n\n    std::cout << \"\\n\\n\";\n  }\n  #endif\n\n  #if 0\n    // bench small matrices (in-place versus return bye value)\n    {\n      timer.reset();\n      for (int _j=0; _j<10; ++_j) {\n        Matrix4f m = Matrix4f::Random();\n        Vector4f b = Vector4f::Random();\n        Vector4f x = Vector4f::Random();\n        timer.start();\n        for (int _k=0; _k<1000000; ++_k) {\n          b = m.inverseProduct(b);\n        }\n        timer.stop();\n      }\n      std::cout << \"4x4 :\\t\" << timer.value() << endl;\n    }\n\n    {\n      timer.reset();\n      for (int _j=0; _j<10; ++_j) {\n        Matrix4f m = Matrix4f::Random();\n        Vector4f b = Vector4f::Random();\n        Vector4f x = Vector4f::Random();\n        timer.start();\n        for (int _k=0; _k<1000000; ++_k) {\n          m.inverseProductInPlace(x);\n        }\n        timer.stop();\n      }\n      std::cout << \"4x4 IP :\\t\" << timer.value() << endl;\n    }\n  #endif\n\n  return 0;\n}\n\n"
  },
  {
    "path": "libs/eigen/bench/spbench/CMakeLists.txt",
    "content": "\n\nset(BLAS_FOUND TRUE)\nset(LAPACK_FOUND TRUE)\nset(BLAS_LIBRARIES eigen_blas_static)\nset(LAPACK_LIBRARIES eigen_lapack_static)\n\nset(SPARSE_LIBS \"\")\n\n# find_library(PARDISO_LIBRARIES pardiso412-GNU450-X86-64)\n# if(PARDISO_LIBRARIES)\n#   add_definitions(\"-DEIGEN_PARDISO_SUPPORT\")\n#   set(SPARSE_LIBS ${SPARSE_LIBS} ${PARDISO_LIBRARIES})\n# endif(PARDISO_LIBRARIES)\n\nfind_package(Cholmod)\nif(CHOLMOD_FOUND AND BLAS_FOUND AND LAPACK_FOUND)\n  add_definitions(\"-DEIGEN_CHOLMOD_SUPPORT\")\n  include_directories(${CHOLMOD_INCLUDES})\n  set(SPARSE_LIBS ${SPARSE_LIBS} ${CHOLMOD_LIBRARIES} ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES})\n  set(CHOLMOD_ALL_LIBS  ${CHOLMOD_LIBRARIES} ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES})\nendif()\n\nfind_package(Umfpack)\nif(UMFPACK_FOUND AND BLAS_FOUND)\n  add_definitions(\"-DEIGEN_UMFPACK_SUPPORT\")\n  include_directories(${UMFPACK_INCLUDES})\n  set(SPARSE_LIBS ${SPARSE_LIBS} ${UMFPACK_LIBRARIES} ${BLAS_LIBRARIES})\n  set(UMFPACK_ALL_LIBS ${UMFPACK_LIBRARIES} ${BLAS_LIBRARIES})\nendif()\n\nfind_package(SuperLU)\nif(SUPERLU_FOUND AND BLAS_FOUND)\n  add_definitions(\"-DEIGEN_SUPERLU_SUPPORT\")\n  include_directories(${SUPERLU_INCLUDES})\n  set(SPARSE_LIBS ${SPARSE_LIBS} ${SUPERLU_LIBRARIES} ${BLAS_LIBRARIES})\n  set(SUPERLU_ALL_LIBS ${SUPERLU_LIBRARIES} ${BLAS_LIBRARIES})\nendif()\n\n\nfind_package(Pastix)\nfind_package(Scotch)\nfind_package(Metis)\nif(PASTIX_FOUND AND BLAS_FOUND)\n  add_definitions(\"-DEIGEN_PASTIX_SUPPORT\")\n  include_directories(${PASTIX_INCLUDES})\n  if(SCOTCH_FOUND)\n    include_directories(${SCOTCH_INCLUDES})\n    set(PASTIX_LIBRARIES ${PASTIX_LIBRARIES} ${SCOTCH_LIBRARIES})\n  elseif(METIS_FOUND)\n    include_directories(${METIS_INCLUDES})\n    set(PASTIX_LIBRARIES ${PASTIX_LIBRARIES} ${METIS_LIBRARIES})  \n  endif(SCOTCH_FOUND)\n  set(SPARSE_LIBS ${SPARSE_LIBS} ${PASTIX_LIBRARIES} ${ORDERING_LIBRARIES} ${BLAS_LIBRARIES})\n  set(PASTIX_ALL_LIBS ${PASTIX_LIBRARIES} ${BLAS_LIBRARIES})\nendif(PASTIX_FOUND AND BLAS_FOUND)\n\nif(METIS_FOUND)\n  include_directories(${METIS_INCLUDES})\n  set (SPARSE_LIBS ${SPARSE_LIBS} ${METIS_LIBRARIES})\n  add_definitions(\"-DEIGEN_METIS_SUPPORT\")\nendif(METIS_FOUND)\n\nfind_library(RT_LIBRARY rt)\nif(RT_LIBRARY)\n  set(SPARSE_LIBS ${SPARSE_LIBS} ${RT_LIBRARY})\nendif(RT_LIBRARY)\n\nadd_executable(spbenchsolver spbenchsolver.cpp)\ntarget_link_libraries (spbenchsolver ${SPARSE_LIBS})\n\nadd_executable(spsolver sp_solver.cpp)\ntarget_link_libraries (spsolver ${SPARSE_LIBS})\n\n\nadd_executable(test_sparseLU test_sparseLU.cpp)\ntarget_link_libraries (test_sparseLU ${SPARSE_LIBS})\n\n"
  },
  {
    "path": "libs/eigen/bench/spbench/sp_solver.cpp",
    "content": "// Small bench routine for Eigen available in Eigen\n// (C) Desire NUENTSA WAKAM, INRIA\n\n#include <iostream>\n#include <fstream>\n#include <iomanip>\n#include <Eigen/Jacobi>\n#include <Eigen/Householder>\n#include <Eigen/IterativeLinearSolvers>\n#include <Eigen/LU>\n#include <unsupported/Eigen/SparseExtra>\n//#include <Eigen/SparseLU>\n#include <Eigen/SuperLUSupport>\n// #include <unsupported/Eigen/src/IterativeSolvers/Scaling.h>\n#include <bench/BenchTimer.h>\n#include <unsupported/Eigen/IterativeSolvers>\nusing namespace std;\nusing namespace Eigen;\n\nint main(int argc, char **args)\n{\n  SparseMatrix<double, ColMajor> A; \n  typedef SparseMatrix<double, ColMajor>::Index Index;\n  typedef Matrix<double, Dynamic, Dynamic> DenseMatrix;\n  typedef Matrix<double, Dynamic, 1> DenseRhs;\n  VectorXd b, x, tmp;\n  BenchTimer timer,totaltime; \n  //SparseLU<SparseMatrix<double, ColMajor> >   solver;\n//   SuperLU<SparseMatrix<double, ColMajor> >   solver;\n  ConjugateGradient<SparseMatrix<double, ColMajor>, Lower,IncompleteCholesky<double,Lower> > solver; \n  ifstream matrix_file; \n  string line;\n  int  n;\n  // Set parameters\n//   solver.iparm(IPARM_THREAD_NBR) = 4;\n  /* Fill the matrix with sparse matrix stored in Matrix-Market coordinate column-oriented format */\n  if (argc < 2) assert(false && \"please, give the matrix market file \");\n  \n  timer.start();\n  totaltime.start();\n  loadMarket(A, args[1]);\n  cout << \"End charging matrix \" << endl;\n  bool iscomplex=false, isvector=false;\n  int sym;\n  getMarketHeader(args[1], sym, iscomplex, isvector);\n  if (iscomplex) { cout<< \" Not for complex matrices \\n\"; return -1; }\n  if (isvector) { cout << \"The provided file is not a matrix file\\n\"; return -1;}\n  if (sym != 0) { // symmetric matrices, only the lower part is stored\n    SparseMatrix<double, ColMajor> temp; \n    temp = A;\n    A = temp.selfadjointView<Lower>();\n  }\n  timer.stop();\n  \n  n = A.cols();\n  // ====== TESTS FOR SPARSE TUTORIAL ======\n//   cout<< \"OuterSize \" << A.outerSize() << \" inner \" << A.innerSize() << endl; \n//   SparseMatrix<double, RowMajor> mat1(A); \n//   SparseMatrix<double, RowMajor> mat2;\n//   cout << \" norm of A \" << mat1.norm() << endl; ;\n//   PermutationMatrix<Dynamic, Dynamic, int> perm(n);\n//   perm.resize(n,1);\n//   perm.indices().setLinSpaced(n, 0, n-1);\n//   mat2 = perm * mat1;\n//   mat.subrows();\n//   mat2.resize(n,n); \n//   mat2.reserve(10);\n//   mat2.setConstant();\n//   std::cout<< \"NORM \" << mat1.squaredNorm()<< endl;  \n\n  cout<< \"Time to load the matrix \" << timer.value() <<endl;\n  /* Fill the right hand side */\n\n//   solver.set_restart(374);\n  if (argc > 2)\n    loadMarketVector(b, args[2]);\n  else \n  {\n    b.resize(n);\n    tmp.resize(n);\n//       tmp.setRandom();\n    for (int i = 0; i < n; i++) tmp(i) = i; \n    b = A * tmp ;\n  }\n//   Scaling<SparseMatrix<double> > scal; \n//   scal.computeRef(A);\n//   b = scal.LeftScaling().cwiseProduct(b);\n\n  /* Compute the factorization */\n  cout<< \"Starting the factorization \"<< endl; \n  timer.reset();\n  timer.start(); \n  cout<< \"Size of Input Matrix \"<< b.size()<<\"\\n\\n\";\n  cout<< \"Rows and columns \"<< A.rows() <<\" \" <<A.cols() <<\"\\n\";\n  solver.compute(A);\n//   solver.analyzePattern(A);\n//   solver.factorize(A);\n  if (solver.info() != Success) {\n    std::cout<< \"The solver failed \\n\";\n    return -1; \n  }\n  timer.stop(); \n  float time_comp = timer.value(); \n  cout <<\" Compute Time \" << time_comp<< endl; \n  \n  timer.reset();\n  timer.start();\n  x = solver.solve(b);\n//   x = scal.RightScaling().cwiseProduct(x);\n  timer.stop();\n  float time_solve = timer.value(); \n  cout<< \" Time to solve \" << time_solve << endl; \n \n  /* Check the accuracy */\n  VectorXd tmp2 = b - A*x;\n  double tempNorm = tmp2.norm()/b.norm();\n  cout << \"Relative norm of the computed solution : \" << tempNorm <<\"\\n\";\n//   cout << \"Iterations : \" << solver.iterations() << \"\\n\"; \n  \n  totaltime.stop();\n  cout << \"Total time \" << totaltime.value() << \"\\n\";\n//  std::cout<<x.transpose()<<\"\\n\";\n  \n  return 0;\n}"
  },
  {
    "path": "libs/eigen/bench/spbench/spbench.dtd",
    "content": "<!ELEMENT BENCH (AVAILSOLVER+,LINEARSYSTEM+)>\n  <!ELEMENT AVAILSOLVER (SOLVER+)>\n    <!ELEMENT SOLVER (TYPE,PACKAGE)>\n      <!ELEMENT TYPE (#PCDATA)>  <!-- One of LU, LLT, LDLT, ITER -->\n      <!ELEMENT PACKAGE (#PCDATA)>  <!-- Derived from a library -->\n  <!ELEMENT LINEARSYSTEM (MATRIX,SOLVER_STAT+,BEST_SOLVER,GLOBAL_PARAMS*)>\n    <!ELEMENT MATRIX (NAME,SIZE,ENTRIES,PATTERN?,SYMMETRY,POSDEF?,ARITHMETIC,RHS*)>\n      <!ELEMENT NAME (#PCDATA)>\n      <!ELEMENT SIZE (#PCDATA)>\n      <!ELEMENT ENTRIES (#PCDATA)> <!-- The number of nonzeros elements -->\n      <!ELEMENT PATTERN (#PCDATA)>  <!-- Is structural pattern symmetric or not -->\n      <!ELEMENT SYMMETRY (#PCDATA)> <!-- symmmetry with numerical values -->\n      <!ELEMENT POSDEF (#PCDATA)> <!-- Is the matrix positive definite or not -->\n      <!ELEMENT ARITHMETIC (#PCDATA)> \n      <!ELEMENT RHS (SOURCE)>  <!-- A matrix can have one or more right hand side associated. -->\n        <!ELEMENT SOURCE (#PCDATA)> <!-- Source of the right hand side, either generated or provided -->\n    <!ELEMENT SOLVER_STAT (PARAMS*,TIME,ERROR,ITER?)>\n      <!ELEMENT PARAMS (#PCDATA)>\n      <!ELEMENT TIME (COMPUTE,SOLVE,TOTAL)>\n        <!ELEMENT COMPUTE (#PCDATA)> <!-- Time to analyze,to factorize, or to setup the preconditioner-->\n        <!ELEMENT SOLVE (#PCDATA)> <!-- Time to solve with all the available rhs -->\n        <!ELEMENT TOTAL (#PCDATA)>\n      <!ELEMENT ERROR (#PCDATA)> <!-- Either the relative error or the relative residual norm -->\n      <!ELEMENT ITER (#PCDATA)> <!-- Number of iterations -->\n    <!ELEMENT BEST_SOLVER CDATA> <!-- Id of the best solver -->\n    <!ELEMENT GLOBAL_PARAMS (#PCDATA)> <!-- Parameters shared by all solvers -->\n\n<!ATTLIST SOLVER ID CDATA #REQUIRED>\n<!ATTLIST SOLVER_STAT ID CDATA #REQUIRED>\n<!ATTLIST BEST_SOLVER ID CDATA #REQUIRED>\n<!ATTLIST RHS ID CDATA #IMPLIED>"
  },
  {
    "path": "libs/eigen/bench/spbench/spbenchsolver.cpp",
    "content": "#include <bench/spbench/spbenchsolver.h>\n\nvoid bench_printhelp()\n{\n    cout<< \" \\nbenchsolver : performs a benchmark of all the solvers available in Eigen \\n\\n\";\n    cout<< \" MATRIX FOLDER : \\n\";\n    cout<< \" The matrices for the benchmark should be collected in a folder specified with an environment variable EIGEN_MATRIXDIR \\n\";\n    cout<< \" The matrices are stored using the matrix market coordinate format \\n\";\n    cout<< \" The matrix and associated right-hand side (rhs) files are named respectively \\n\";\n    cout<< \" as MatrixName.mtx and MatrixName_b.mtx. If the rhs does not exist, a random one is generated. \\n\";\n    cout<< \" If a matrix is SPD, the matrix should be named as MatrixName_SPD.mtx \\n\";\n    cout<< \" If a true solution exists, it should be named as MatrixName_x.mtx; \\n\"     ;\n    cout<< \" it will be used to compute the norm of the error relative to the computed solutions\\n\\n\";\n    cout<< \" OPTIONS : \\n\"; \n    cout<< \" -h or --help \\n    print this help and return\\n\\n\";\n    cout<< \" -d matrixdir \\n    Use matrixdir as the matrix folder instead of the one specified in the environment variable EIGEN_MATRIXDIR\\n\\n\"; \n    cout<< \" -o outputfile.xml \\n    Output the statistics to a xml file \\n\\n\";\n    cout<< \" --eps <RelErr> Sets the relative tolerance for iterative solvers (default 1e-08) \\n\\n\";\n    cout<< \" --maxits <MaxIts> Sets the maximum number of iterations (default 1000) \\n\\n\";\n    \n}\nint main(int argc, char ** args)\n{\n  \n  bool help = ( get_options(argc, args, \"-h\") || get_options(argc, args, \"--help\") );\n  if(help) {\n    bench_printhelp();\n    return 0;\n  }\n\n  // Get the location of the test matrices\n  string matrix_dir;\n  if (!get_options(argc, args, \"-d\", &matrix_dir))\n  {\n    if(getenv(\"EIGEN_MATRIXDIR\") == NULL){\n      std::cerr << \"Please, specify the location of the matrices with -d mat_folder or the environment variable EIGEN_MATRIXDIR \\n\";\n      std::cerr << \" Run with --help to see the list of all the available options \\n\";\n      return -1;\n    }\n    matrix_dir = getenv(\"EIGEN_MATRIXDIR\");\n  }\n     \n  std::ofstream statbuf;\n  string statFile ;\n  \n  // Get the file to write the statistics\n  bool statFileExists = get_options(argc, args, \"-o\", &statFile);\n  if(statFileExists)\n  {\n    statbuf.open(statFile.c_str(), std::ios::out);\n    if(statbuf.good()){\n      statFileExists = true; \n      printStatheader(statbuf);\n      statbuf.close();\n    }\n    else\n      std::cerr << \"Unable to open the provided file for writting... \\n\";\n  }       \n  \n  // Get the maximum number of iterations and the tolerance\n  int maxiters = 1000; \n  double tol = 1e-08; \n  string inval; \n  if (get_options(argc, args, \"--eps\", &inval))\n    tol = atof(inval.c_str()); \n  if(get_options(argc, args, \"--maxits\", &inval))\n    maxiters = atoi(inval.c_str()); \n  \n  string current_dir; \n  // Test the real-arithmetics matrices\n  Browse_Matrices<double>(matrix_dir, statFileExists, statFile,maxiters, tol);\n  \n  // Test the complex-arithmetics matrices\n  Browse_Matrices<std::complex<double> >(matrix_dir, statFileExists, statFile, maxiters, tol); \n  \n  if(statFileExists)\n  {\n    statbuf.open(statFile.c_str(), std::ios::app); \n    statbuf << \"</BENCH> \\n\";\n    cout << \"\\n Output written in \" << statFile << \" ...\\n\";\n    statbuf.close();\n  }\n\n  return 0;\n}\n\n      \n"
  },
  {
    "path": "libs/eigen/bench/spbench/spbenchsolver.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n#include <iostream>\n#include <fstream>\n#include <Eigen/SparseCore>\n#include <bench/BenchTimer.h>\n#include <cstdlib>\n#include <string>\n#include <Eigen/Cholesky>\n#include <Eigen/Jacobi>\n#include <Eigen/Householder>\n#include <Eigen/IterativeLinearSolvers>\n#include <unsupported/Eigen/IterativeSolvers>\n#include <Eigen/LU>\n#include <unsupported/Eigen/SparseExtra>\n#include <Eigen/SparseLU>\n\n#include \"spbenchstyle.h\"\n\n#ifdef EIGEN_METIS_SUPPORT\n#include <Eigen/MetisSupport>\n#endif\n\n#ifdef EIGEN_CHOLMOD_SUPPORT\n#include <Eigen/CholmodSupport>\n#endif\n\n#ifdef EIGEN_UMFPACK_SUPPORT\n#include <Eigen/UmfPackSupport>\n#endif\n\n#ifdef EIGEN_PARDISO_SUPPORT\n#include <Eigen/PardisoSupport>\n#endif\n\n#ifdef EIGEN_SUPERLU_SUPPORT\n#include <Eigen/SuperLUSupport>\n#endif\n\n#ifdef EIGEN_PASTIX_SUPPORT\n#include <Eigen/PaStiXSupport>\n#endif\n\n// CONSTANTS\n#define EIGEN_UMFPACK  10\n#define EIGEN_SUPERLU  20\n#define EIGEN_PASTIX  30\n#define EIGEN_PARDISO  40\n#define EIGEN_SPARSELU_COLAMD 50\n#define EIGEN_SPARSELU_METIS 51\n#define EIGEN_BICGSTAB  60\n#define EIGEN_BICGSTAB_ILUT  61\n#define EIGEN_GMRES 70\n#define EIGEN_GMRES_ILUT 71\n#define EIGEN_SIMPLICIAL_LDLT  80\n#define EIGEN_CHOLMOD_LDLT  90\n#define EIGEN_PASTIX_LDLT  100\n#define EIGEN_PARDISO_LDLT  110\n#define EIGEN_SIMPLICIAL_LLT  120\n#define EIGEN_CHOLMOD_SUPERNODAL_LLT  130\n#define EIGEN_CHOLMOD_SIMPLICIAL_LLT  140\n#define EIGEN_PASTIX_LLT  150\n#define EIGEN_PARDISO_LLT  160\n#define EIGEN_CG  170\n#define EIGEN_CG_PRECOND  180\n\nusing namespace Eigen;\nusing namespace std; \n\n\n// Global variables for input parameters\nint MaximumIters; // Maximum number of iterations\ndouble RelErr; // Relative error of the computed solution\ndouble best_time_val; // Current best time overall solvers \nint best_time_id; //  id of the best solver for the current system \n\ntemplate<typename T> inline typename NumTraits<T>::Real test_precision() { return NumTraits<T>::dummy_precision(); }\ntemplate<> inline float test_precision<float>() { return 1e-3f; }                                                             \ntemplate<> inline double test_precision<double>() { return 1e-6; }                                                            \ntemplate<> inline float test_precision<std::complex<float> >() { return test_precision<float>(); }\ntemplate<> inline double test_precision<std::complex<double> >() { return test_precision<double>(); }\n\nvoid printStatheader(std::ofstream& out)\n{\n  // Print XML header\n  // NOTE It would have been much easier to write these XML documents using external libraries like tinyXML or Xerces-C++.\n  \n  out << \"<?xml version='1.0' encoding='UTF-8'?> \\n\";\n  out << \"<?xml-stylesheet type='text/xsl' href='#stylesheet' ?> \\n\"; \n  out << \"<!DOCTYPE BENCH  [\\n<!ATTLIST xsl:stylesheet\\n id\\t ID  #REQUIRED>\\n]>\";\n  out << \"\\n\\n<!-- Generated by the Eigen library -->\\n\"; \n  \n  out << \"\\n<BENCH> \\n\" ; //root XML element \n  // Print the xsl style section\n  printBenchStyle(out); \n  // List all available solvers \n  out << \" <AVAILSOLVER> \\n\";\n#ifdef EIGEN_UMFPACK_SUPPORT\n  out <<\"  <SOLVER ID='\" << EIGEN_UMFPACK << \"'>\\n\"; \n  out << \"   <TYPE> LU </TYPE> \\n\";\n  out << \"   <PACKAGE> UMFPACK </PACKAGE> \\n\"; \n  out << \"  </SOLVER> \\n\"; \n#endif\n#ifdef EIGEN_SUPERLU_SUPPORT\n  out <<\"  <SOLVER ID='\" << EIGEN_SUPERLU << \"'>\\n\"; \n  out << \"   <TYPE> LU </TYPE> \\n\";\n  out << \"   <PACKAGE> SUPERLU </PACKAGE> \\n\"; \n  out << \"  </SOLVER> \\n\"; \n#endif\n#ifdef EIGEN_CHOLMOD_SUPPORT\n  out <<\"  <SOLVER ID='\" << EIGEN_CHOLMOD_SIMPLICIAL_LLT << \"'>\\n\"; \n  out << \"   <TYPE> LLT SP</TYPE> \\n\";\n  out << \"   <PACKAGE> CHOLMOD </PACKAGE> \\n\";\n  out << \"  </SOLVER> \\n\"; \n  \n  out <<\"  <SOLVER ID='\" << EIGEN_CHOLMOD_SUPERNODAL_LLT << \"'>\\n\"; \n  out << \"   <TYPE> LLT</TYPE> \\n\";\n  out << \"   <PACKAGE> CHOLMOD </PACKAGE> \\n\";\n  out << \"  </SOLVER> \\n\";\n  \n  out <<\"  <SOLVER ID='\" << EIGEN_CHOLMOD_LDLT << \"'>\\n\"; \n  out << \"   <TYPE> LDLT </TYPE> \\n\";\n  out << \"   <PACKAGE> CHOLMOD </PACKAGE> \\n\";  \n  out << \"  </SOLVER> \\n\"; \n#endif\n#ifdef EIGEN_PARDISO_SUPPORT\n  out <<\"  <SOLVER ID='\" << EIGEN_PARDISO << \"'>\\n\"; \n  out << \"   <TYPE> LU </TYPE> \\n\";\n  out << \"   <PACKAGE> PARDISO </PACKAGE> \\n\"; \n  out << \"  </SOLVER> \\n\"; \n  \n  out <<\"  <SOLVER ID='\" << EIGEN_PARDISO_LLT << \"'>\\n\"; \n  out << \"   <TYPE> LLT </TYPE> \\n\";\n  out << \"   <PACKAGE> PARDISO </PACKAGE> \\n\"; \n  out << \"  </SOLVER> \\n\"; \n  \n  out <<\"  <SOLVER ID='\" << EIGEN_PARDISO_LDLT << \"'>\\n\"; \n  out << \"   <TYPE> LDLT </TYPE> \\n\";\n  out << \"   <PACKAGE> PARDISO </PACKAGE> \\n\"; \n  out << \"  </SOLVER> \\n\"; \n#endif\n#ifdef EIGEN_PASTIX_SUPPORT\n  out <<\"  <SOLVER ID='\" << EIGEN_PASTIX << \"'>\\n\"; \n  out << \"   <TYPE> LU </TYPE> \\n\";\n  out << \"   <PACKAGE> PASTIX </PACKAGE> \\n\"; \n  out << \"  </SOLVER> \\n\"; \n  \n  out <<\"  <SOLVER ID='\" << EIGEN_PASTIX_LLT << \"'>\\n\"; \n  out << \"   <TYPE> LLT </TYPE> \\n\";\n  out << \"   <PACKAGE> PASTIX </PACKAGE> \\n\"; \n  out << \"  </SOLVER> \\n\"; \n  \n  out <<\"  <SOLVER ID='\" << EIGEN_PASTIX_LDLT << \"'>\\n\"; \n  out << \"   <TYPE> LDLT </TYPE> \\n\";\n  out << \"   <PACKAGE> PASTIX </PACKAGE> \\n\"; \n  out << \"  </SOLVER> \\n\"; \n#endif\n  \n  out <<\"  <SOLVER ID='\" << EIGEN_BICGSTAB << \"'>\\n\"; \n  out << \"   <TYPE> BICGSTAB </TYPE> \\n\";\n  out << \"   <PACKAGE> EIGEN </PACKAGE> \\n\"; \n  out << \"  </SOLVER> \\n\"; \n  \n  out <<\"  <SOLVER ID='\" << EIGEN_BICGSTAB_ILUT << \"'>\\n\"; \n  out << \"   <TYPE> BICGSTAB_ILUT </TYPE> \\n\";\n  out << \"   <PACKAGE> EIGEN </PACKAGE> \\n\"; \n  out << \"  </SOLVER> \\n\"; \n  \n  out <<\"  <SOLVER ID='\" << EIGEN_GMRES_ILUT << \"'>\\n\"; \n  out << \"   <TYPE> GMRES_ILUT </TYPE> \\n\";\n  out << \"   <PACKAGE> EIGEN </PACKAGE> \\n\"; \n  out << \"  </SOLVER> \\n\"; \n  \n  out <<\"  <SOLVER ID='\" << EIGEN_SIMPLICIAL_LDLT << \"'>\\n\"; \n  out << \"   <TYPE> LDLT </TYPE> \\n\";\n  out << \"   <PACKAGE> EIGEN </PACKAGE> \\n\"; \n  out << \"  </SOLVER> \\n\"; \n  \n  out <<\"  <SOLVER ID='\" << EIGEN_SIMPLICIAL_LLT << \"'>\\n\"; \n  out << \"   <TYPE> LLT </TYPE> \\n\";\n  out << \"   <PACKAGE> EIGEN </PACKAGE> \\n\"; \n  out << \"  </SOLVER> \\n\"; \n  \n  out <<\"  <SOLVER ID='\" << EIGEN_CG << \"'>\\n\"; \n  out << \"   <TYPE> CG </TYPE> \\n\";\n  out << \"   <PACKAGE> EIGEN </PACKAGE> \\n\"; \n  out << \"  </SOLVER> \\n\"; \n  \n  out <<\"  <SOLVER ID='\" << EIGEN_SPARSELU_COLAMD << \"'>\\n\"; \n  out << \"   <TYPE> LU_COLAMD </TYPE> \\n\";\n  out << \"   <PACKAGE> EIGEN </PACKAGE> \\n\"; \n  out << \"  </SOLVER> \\n\"; \n  \n#ifdef EIGEN_METIS_SUPPORT\n  out <<\"  <SOLVER ID='\" << EIGEN_SPARSELU_METIS << \"'>\\n\"; \n  out << \"   <TYPE> LU_METIS </TYPE> \\n\";\n  out << \"   <PACKAGE> EIGEN </PACKAGE> \\n\"; \n  out << \"  </SOLVER> \\n\"; \n#endif\n  out << \" </AVAILSOLVER> \\n\"; \n  \n}\n\n\ntemplate<typename Solver, typename Scalar>\nvoid call_solver(Solver &solver, const int solver_id, const typename Solver::MatrixType& A, const Matrix<Scalar, Dynamic, 1>& b, const Matrix<Scalar, Dynamic, 1>& refX,std::ofstream& statbuf)\n{\n  \n  double total_time;\n  double compute_time;\n  double solve_time; \n  double rel_error;\n  Matrix<Scalar, Dynamic, 1> x; \n  BenchTimer timer; \n  timer.reset();\n  timer.start();\n  solver.compute(A); \n  if (solver.info() != Success)\n  {\n    std::cerr << \"Solver failed ... \\n\";\n    return;\n  }\n  timer.stop();\n  compute_time = timer.value();\n  statbuf << \"    <TIME>\\n\"; \n  statbuf << \"     <COMPUTE> \" << timer.value() << \"</COMPUTE>\\n\";\n  std::cout<< \"COMPUTE TIME : \" << timer.value() <<std::endl; \n    \n  timer.reset();\n  timer.start();\n  x = solver.solve(b); \n  if (solver.info() == NumericalIssue)\n  {\n    std::cerr << \"Solver failed ... \\n\";\n    return;\n  }\n  timer.stop();\n  solve_time = timer.value();\n  statbuf << \"     <SOLVE> \" << timer.value() << \"</SOLVE>\\n\"; \n  std::cout<< \"SOLVE TIME : \" << timer.value() <<std::endl; \n  \n  total_time = solve_time + compute_time;\n  statbuf << \"     <TOTAL> \" << total_time << \"</TOTAL>\\n\"; \n  std::cout<< \"TOTAL TIME : \" << total_time <<std::endl; \n  statbuf << \"    </TIME>\\n\"; \n  \n  // Verify the relative error\n  if(refX.size() != 0)\n    rel_error = (refX - x).norm()/refX.norm();\n  else \n  {\n    // Compute the relative residual norm\n    Matrix<Scalar, Dynamic, 1> temp; \n    temp = A * x; \n    rel_error = (b-temp).norm()/b.norm();\n  }\n  statbuf << \"    <ERROR> \" << rel_error << \"</ERROR>\\n\"; \n  std::cout<< \"REL. ERROR : \" << rel_error << \"\\n\\n\" ;\n  if ( rel_error <= RelErr )\n  {\n    // check the best time if convergence\n    if(!best_time_val || (best_time_val > total_time))\n    {\n      best_time_val = total_time;\n      best_time_id = solver_id;\n    }\n  }\n}\n\ntemplate<typename Solver, typename Scalar>\nvoid call_directsolver(Solver& solver, const int solver_id, const typename Solver::MatrixType& A, const Matrix<Scalar, Dynamic, 1>& b, const Matrix<Scalar, Dynamic, 1>& refX, std::string& statFile)\n{\n    std::ofstream statbuf(statFile.c_str(), std::ios::app);\n    statbuf << \"   <SOLVER_STAT ID='\" << solver_id <<\"'>\\n\"; \n    call_solver(solver, solver_id, A, b, refX,statbuf);\n    statbuf << \"   </SOLVER_STAT>\\n\";\n    statbuf.close();\n}\n\ntemplate<typename Solver, typename Scalar>\nvoid call_itersolver(Solver &solver, const int solver_id, const typename Solver::MatrixType& A, const Matrix<Scalar, Dynamic, 1>& b, const Matrix<Scalar, Dynamic, 1>& refX, std::string& statFile)\n{\n  solver.setTolerance(RelErr); \n  solver.setMaxIterations(MaximumIters);\n  \n  std::ofstream statbuf(statFile.c_str(), std::ios::app);\n  statbuf << \" <SOLVER_STAT ID='\" << solver_id <<\"'>\\n\"; \n  call_solver(solver, solver_id, A, b, refX,statbuf); \n  statbuf << \"   <ITER> \"<< solver.iterations() << \"</ITER>\\n\";\n  statbuf << \" </SOLVER_STAT>\\n\";\n  std::cout << \"ITERATIONS : \" << solver.iterations() <<\"\\n\\n\\n\"; \n  \n}\n\n\ntemplate <typename Scalar>\nvoid SelectSolvers(const SparseMatrix<Scalar>&A, unsigned int sym, Matrix<Scalar, Dynamic, 1>& b, const Matrix<Scalar, Dynamic, 1>& refX, std::string& statFile)\n{\n  typedef SparseMatrix<Scalar, ColMajor> SpMat; \n  // First, deal with Nonsymmetric and symmetric matrices\n  best_time_id = 0; \n  best_time_val = 0.0;\n  //UMFPACK\n  #ifdef EIGEN_UMFPACK_SUPPORT\n  {\n    cout << \"Solving with UMFPACK LU ... \\n\"; \n    UmfPackLU<SpMat> solver; \n    call_directsolver(solver, EIGEN_UMFPACK, A, b, refX,statFile); \n  }\n  #endif\n    //SuperLU\n  #ifdef EIGEN_SUPERLU_SUPPORT\n  {\n    cout << \"\\nSolving with SUPERLU ... \\n\"; \n    SuperLU<SpMat> solver;\n    call_directsolver(solver, EIGEN_SUPERLU, A, b, refX,statFile); \n  }\n  #endif\n    \n   // PaStix LU\n  #ifdef EIGEN_PASTIX_SUPPORT\n  {\n    cout << \"\\nSolving with PASTIX LU ... \\n\"; \n    PastixLU<SpMat> solver; \n    call_directsolver(solver, EIGEN_PASTIX, A, b, refX,statFile) ;\n  }\n  #endif\n\n   //PARDISO LU\n  #ifdef EIGEN_PARDISO_SUPPORT\n  {\n    cout << \"\\nSolving with PARDISO LU ... \\n\"; \n    PardisoLU<SpMat>  solver; \n    call_directsolver(solver, EIGEN_PARDISO, A, b, refX,statFile);\n  }\n  #endif\n  \n  // Eigen SparseLU METIS\n  cout << \"\\n Solving with Sparse LU AND COLAMD ... \\n\";\n  SparseLU<SpMat, COLAMDOrdering<int> >   solver;\n  call_directsolver(solver, EIGEN_SPARSELU_COLAMD, A, b, refX, statFile); \n  // Eigen SparseLU METIS\n  #ifdef EIGEN_METIS_SUPPORT\n  {\n    cout << \"\\n Solving with Sparse LU AND METIS ... \\n\";\n    SparseLU<SpMat, MetisOrdering<int> >   solver;\n    call_directsolver(solver, EIGEN_SPARSELU_METIS, A, b, refX, statFile); \n  }\n  #endif\n  \n  //BiCGSTAB\n  {\n    cout << \"\\nSolving with BiCGSTAB ... \\n\"; \n    BiCGSTAB<SpMat> solver; \n    call_itersolver(solver, EIGEN_BICGSTAB, A, b, refX,statFile);\n  }\n  //BiCGSTAB+ILUT\n  {\n    cout << \"\\nSolving with BiCGSTAB and ILUT ... \\n\"; \n    BiCGSTAB<SpMat, IncompleteLUT<Scalar> > solver; \n    call_itersolver(solver, EIGEN_BICGSTAB_ILUT, A, b, refX,statFile); \n  }\n  \n   \n  //GMRES\n//   {\n//     cout << \"\\nSolving with GMRES ... \\n\"; \n//     GMRES<SpMat> solver; \n//     call_itersolver(solver, EIGEN_GMRES, A, b, refX,statFile); \n//   }\n  //GMRES+ILUT\n  {\n    cout << \"\\nSolving with GMRES and ILUT ... \\n\"; \n    GMRES<SpMat, IncompleteLUT<Scalar> > solver; \n    call_itersolver(solver, EIGEN_GMRES_ILUT, A, b, refX,statFile);\n  }\n  \n  // Hermitian and not necessarily positive-definites\n  if (sym != NonSymmetric)\n  {\n    // Internal Cholesky\n    {\n      cout << \"\\nSolving with Simplicial LDLT ... \\n\"; \n      SimplicialLDLT<SpMat, Lower> solver;\n      call_directsolver(solver, EIGEN_SIMPLICIAL_LDLT, A, b, refX,statFile); \n    }\n    \n    // CHOLMOD\n    #ifdef EIGEN_CHOLMOD_SUPPORT\n    {\n      cout << \"\\nSolving with CHOLMOD LDLT ... \\n\"; \n      CholmodDecomposition<SpMat, Lower> solver;\n      solver.setMode(CholmodLDLt);\n       call_directsolver(solver,EIGEN_CHOLMOD_LDLT, A, b, refX,statFile);\n    }\n    #endif\n    \n    //PASTIX LLT\n    #ifdef EIGEN_PASTIX_SUPPORT\n    {\n      cout << \"\\nSolving with PASTIX LDLT ... \\n\"; \n      PastixLDLT<SpMat, Lower> solver; \n      call_directsolver(solver,EIGEN_PASTIX_LDLT, A, b, refX,statFile); \n    }\n    #endif\n    \n    //PARDISO LLT\n    #ifdef EIGEN_PARDISO_SUPPORT\n    {\n      cout << \"\\nSolving with PARDISO LDLT ... \\n\"; \n      PardisoLDLT<SpMat, Lower> solver; \n      call_directsolver(solver,EIGEN_PARDISO_LDLT, A, b, refX,statFile); \n    }\n    #endif\n  }\n\n   // Now, symmetric POSITIVE DEFINITE matrices\n  if (sym == SPD)\n  {\n    \n    //Internal Sparse Cholesky\n    {\n      cout << \"\\nSolving with SIMPLICIAL LLT ... \\n\"; \n      SimplicialLLT<SpMat, Lower> solver; \n      call_directsolver(solver,EIGEN_SIMPLICIAL_LLT, A, b, refX,statFile); \n    }\n    \n    // CHOLMOD\n    #ifdef EIGEN_CHOLMOD_SUPPORT\n    {\n      // CholMOD SuperNodal LLT\n      cout << \"\\nSolving with CHOLMOD LLT (Supernodal)... \\n\"; \n      CholmodDecomposition<SpMat, Lower> solver;\n      solver.setMode(CholmodSupernodalLLt);\n       call_directsolver(solver,EIGEN_CHOLMOD_SUPERNODAL_LLT, A, b, refX,statFile);\n      // CholMod Simplicial LLT\n      cout << \"\\nSolving with CHOLMOD LLT (Simplicial) ... \\n\"; \n      solver.setMode(CholmodSimplicialLLt);\n      call_directsolver(solver,EIGEN_CHOLMOD_SIMPLICIAL_LLT, A, b, refX,statFile);\n    }\n    #endif\n    \n    //PASTIX LLT\n    #ifdef EIGEN_PASTIX_SUPPORT\n    {\n      cout << \"\\nSolving with PASTIX LLT ... \\n\"; \n      PastixLLT<SpMat, Lower> solver; \n      call_directsolver(solver,EIGEN_PASTIX_LLT, A, b, refX,statFile);\n    }\n    #endif\n    \n    //PARDISO LLT\n    #ifdef EIGEN_PARDISO_SUPPORT\n    {\n      cout << \"\\nSolving with PARDISO LLT ... \\n\"; \n      PardisoLLT<SpMat, Lower> solver; \n      call_directsolver(solver,EIGEN_PARDISO_LLT, A, b, refX,statFile); \n    }\n    #endif\n    \n    // Internal CG\n    {\n      cout << \"\\nSolving with CG ... \\n\"; \n      ConjugateGradient<SpMat, Lower> solver; \n      call_itersolver(solver,EIGEN_CG, A, b, refX,statFile);\n    }\n    //CG+IdentityPreconditioner\n//     {\n//       cout << \"\\nSolving with CG and IdentityPreconditioner ... \\n\"; \n//       ConjugateGradient<SpMat, Lower, IdentityPreconditioner> solver; \n//       call_itersolver(solver,EIGEN_CG_PRECOND, A, b, refX,statFile);\n//     }\n  } // End SPD matrices \n}\n\n/* Browse all the matrices available in the specified folder \n * and solve the associated linear system.\n * The results of each solve are printed in the standard output\n * and optionally in the provided html file\n */\ntemplate <typename Scalar>\nvoid Browse_Matrices(const string folder, bool statFileExists, std::string& statFile, int maxiters, double tol)\n{\n  MaximumIters = maxiters; // Maximum number of iterations, global variable \n  RelErr = tol;  //Relative residual error  as stopping criterion for iterative solvers\n  MatrixMarketIterator<Scalar> it(folder);\n  for ( ; it; ++it)\n  {\n    //print the infos for this linear system \n    if(statFileExists)\n    {\n      std::ofstream statbuf(statFile.c_str(), std::ios::app);\n      statbuf << \"<LINEARSYSTEM> \\n\";\n      statbuf << \"   <MATRIX> \\n\";\n      statbuf << \"     <NAME> \" << it.matname() << \" </NAME>\\n\"; \n      statbuf << \"     <SIZE> \" << it.matrix().rows() << \" </SIZE>\\n\"; \n      statbuf << \"     <ENTRIES> \" << it.matrix().nonZeros() << \"</ENTRIES>\\n\";\n      if (it.sym()!=NonSymmetric)\n      {\n        statbuf << \"     <SYMMETRY> Symmetric </SYMMETRY>\\n\" ; \n        if (it.sym() == SPD) \n          statbuf << \"     <POSDEF> YES </POSDEF>\\n\"; \n        else \n          statbuf << \"     <POSDEF> NO </POSDEF>\\n\"; \n          \n      }\n      else\n      {\n        statbuf << \"     <SYMMETRY> NonSymmetric </SYMMETRY>\\n\" ; \n        statbuf << \"     <POSDEF> NO </POSDEF>\\n\"; \n      }\n      statbuf << \"   </MATRIX> \\n\";\n      statbuf.close();\n    }\n    \n    cout<< \"\\n\\n===================================================== \\n\";\n    cout<< \" ======  SOLVING WITH MATRIX \" << it.matname() << \" ====\\n\";\n    cout<< \" =================================================== \\n\\n\";\n    Matrix<Scalar, Dynamic, 1> refX;\n    if(it.hasrefX()) refX = it.refX();\n    // Call all suitable solvers for this linear system \n    SelectSolvers<Scalar>(it.matrix(), it.sym(), it.rhs(), refX, statFile);\n    \n    if(statFileExists)\n    {\n      std::ofstream statbuf(statFile.c_str(), std::ios::app);\n      statbuf << \"  <BEST_SOLVER ID='\"<< best_time_id\n              << \"'></BEST_SOLVER>\\n\"; \n      statbuf << \" </LINEARSYSTEM> \\n\"; \n      statbuf.close();\n    }\n  } \n} \n\nbool get_options(int argc, char **args, string option, string* value=0)\n{\n  int idx = 1, found=false; \n  while (idx<argc && !found){\n    if (option.compare(args[idx]) == 0){\n      found = true; \n      if(value) *value = args[idx+1];\n    }\n    idx+=2;\n  }\n  return found; \n}\n"
  },
  {
    "path": "libs/eigen/bench/spbench/spbenchstyle.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef SPBENCHSTYLE_H\n#define SPBENCHSTYLE_H\n\nvoid printBenchStyle(std::ofstream& out)\n{\n  out << \"<xsl:stylesheet id='stylesheet' version='1.0' \\\n      xmlns:xsl='http://www.w3.org/1999/XSL/Transform' >\\n \\\n      <xsl:template match='xsl:stylesheet' />\\n \\\n      <xsl:template match='/'> <!-- Root of the document -->\\n \\\n      <html>\\n \\\n        <head> \\n \\\n          <style type='text/css'> \\n \\\n            td { white-space: nowrap;}\\n \\\n          </style>\\n \\\n        </head>\\n \\\n        <body>\";\n  out<<\"<table border='1' width='100%' height='100%'>\\n \\\n        <TR> <!-- Write the table header -->\\n \\\n        <TH>Matrix</TH> <TH>N</TH> <TH> NNZ</TH>  <TH> Sym</TH>  <TH> SPD</TH> <TH> </TH>\\n \\\n          <xsl:for-each select='BENCH/AVAILSOLVER/SOLVER'>\\n \\\n            <xsl:sort select='@ID' data-type='number'/>\\n \\\n            <TH>\\n \\\n              <xsl:value-of select='TYPE' />\\n \\\n              <xsl:text></xsl:text>\\n \\\n              <xsl:value-of select='PACKAGE' />\\n \\\n              <xsl:text></xsl:text>\\n \\\n            </TH>\\n \\\n          </xsl:for-each>\\n \\\n        </TR>\";\n        \n  out<<\"  <xsl:for-each select='BENCH/LINEARSYSTEM'>\\n \\\n          <TR> <!-- print statistics for one linear system-->\\n \\\n            <TH rowspan='4'> <xsl:value-of select='MATRIX/NAME' /> </TH>\\n \\\n            <TD rowspan='4'> <xsl:value-of select='MATRIX/SIZE' /> </TD>\\n \\\n            <TD rowspan='4'> <xsl:value-of select='MATRIX/ENTRIES' /> </TD>\\n \\\n            <TD rowspan='4'> <xsl:value-of select='MATRIX/SYMMETRY' /> </TD>\\n \\\n            <TD rowspan='4'> <xsl:value-of select='MATRIX/POSDEF' /> </TD>\\n \\\n            <TH> Compute Time </TH>\\n \\\n            <xsl:for-each select='SOLVER_STAT'>\\n \\\n              <xsl:sort select='@ID' data-type='number'/>\\n \\\n              <TD> <xsl:value-of select='TIME/COMPUTE' /> </TD>\\n \\\n            </xsl:for-each>\\n \\\n          </TR>\";\n  out<<\"  <TR>\\n \\\n            <TH> Solve Time </TH>\\n \\\n            <xsl:for-each select='SOLVER_STAT'>\\n \\\n              <xsl:sort select='@ID' data-type='number'/>\\n \\\n              <TD> <xsl:value-of select='TIME/SOLVE' /> </TD>\\n \\\n            </xsl:for-each>\\n \\\n          </TR>\\n \\\n          <TR>\\n \\\n            <TH> Total Time </TH>\\n \\\n            <xsl:for-each select='SOLVER_STAT'>\\n \\\n              <xsl:sort select='@ID' data-type='number'/>\\n \\\n              <xsl:choose>\\n \\\n                <xsl:when test='@ID=../BEST_SOLVER/@ID'>\\n \\\n                  <TD style='background-color:red'> <xsl:value-of select='TIME/TOTAL' />  </TD>\\n \\\n                </xsl:when>\\n \\\n                <xsl:otherwise>\\n \\\n                  <TD>  <xsl:value-of select='TIME/TOTAL' /></TD>\\n \\\n                </xsl:otherwise>\\n \\\n              </xsl:choose>\\n \\\n            </xsl:for-each>\\n \\\n          </TR>\";\n  out<<\"  <TR>\\n \\\n              <TH> Error </TH>\\n \\\n              <xsl:for-each select='SOLVER_STAT'>\\n \\\n                <xsl:sort select='@ID' data-type='number'/>\\n \\\n                <TD> <xsl:value-of select='ERROR' />\\n \\\n                <xsl:if test='ITER'>\\n \\\n                  <xsl:text>(</xsl:text>\\n \\\n                  <xsl:value-of select='ITER' />\\n \\\n                  <xsl:text>)</xsl:text>\\n \\\n                </xsl:if> </TD>\\n \\\n              </xsl:for-each>\\n \\\n            </TR>\\n \\\n          </xsl:for-each>\\n \\\n      </table>\\n \\\n    </body>\\n \\\n    </html>\\n \\\n  </xsl:template>\\n \\\n  </xsl:stylesheet>\\n\\n\";\n  \n}\n#endif"
  },
  {
    "path": "libs/eigen/bench/spbench/test_sparseLU.cpp",
    "content": "// Small bench routine for Eigen available in Eigen\n// (C) Desire NUENTSA WAKAM, INRIA\n\n#include <iostream>\n#include <fstream>\n#include <iomanip>\n#include <unsupported/Eigen/SparseExtra>\n#include <Eigen/SparseLU>\n#include <bench/BenchTimer.h>\n#ifdef EIGEN_METIS_SUPPORT\n#include <Eigen/MetisSupport>\n#endif\n\nusing namespace std;\nusing namespace Eigen;\n\nint main(int argc, char **args)\n{\n//   typedef complex<double> scalar; \n  typedef double scalar; \n  SparseMatrix<scalar, ColMajor> A; \n  typedef SparseMatrix<scalar, ColMajor>::Index Index;\n  typedef Matrix<scalar, Dynamic, Dynamic> DenseMatrix;\n  typedef Matrix<scalar, Dynamic, 1> DenseRhs;\n  Matrix<scalar, Dynamic, 1> b, x, tmp;\n//   SparseLU<SparseMatrix<scalar, ColMajor>, AMDOrdering<int> >   solver;\n// #ifdef EIGEN_METIS_SUPPORT\n//   SparseLU<SparseMatrix<scalar, ColMajor>, MetisOrdering<int> > solver; \n//   std::cout<< \"ORDERING : METIS\\n\"; \n// #else\n  SparseLU<SparseMatrix<scalar, ColMajor>, COLAMDOrdering<int> >  solver;\n  std::cout<< \"ORDERING : COLAMD\\n\"; \n// #endif\n  \n  ifstream matrix_file; \n  string line;\n  int  n;\n  BenchTimer timer; \n  \n  // Set parameters\n  /* Fill the matrix with sparse matrix stored in Matrix-Market coordinate column-oriented format */\n  if (argc < 2) assert(false && \"please, give the matrix market file \");\n  loadMarket(A, args[1]);\n  cout << \"End charging matrix \" << endl;\n  bool iscomplex=false, isvector=false;\n  int sym;\n  getMarketHeader(args[1], sym, iscomplex, isvector);\n//   if (iscomplex) { cout<< \" Not for complex matrices \\n\"; return -1; }\n  if (isvector) { cout << \"The provided file is not a matrix file\\n\"; return -1;}\n  if (sym != 0) { // symmetric matrices, only the lower part is stored\n    SparseMatrix<scalar, ColMajor> temp; \n    temp = A;\n    A = temp.selfadjointView<Lower>();\n  }\n  n = A.cols();\n  /* Fill the right hand side */\n\n  if (argc > 2)\n    loadMarketVector(b, args[2]);\n  else \n  {\n    b.resize(n);\n    tmp.resize(n);\n//       tmp.setRandom();\n    for (int i = 0; i < n; i++) tmp(i) = i; \n    b = A * tmp ;\n  }\n\n  /* Compute the factorization */\n//   solver.isSymmetric(true);\n  timer.start(); \n//   solver.compute(A);\n  solver.analyzePattern(A); \n  timer.stop(); \n  cout << \"Time to analyze \" << timer.value() << std::endl;\n  timer.reset(); \n  timer.start(); \n  solver.factorize(A); \n  timer.stop(); \n  cout << \"Factorize Time \" << timer.value() << std::endl;\n  timer.reset(); \n  timer.start(); \n  x = solver.solve(b);\n  timer.stop();\n  cout << \"solve time \" << timer.value() << std::endl; \n  /* Check the accuracy */\n  Matrix<scalar, Dynamic, 1> tmp2 = b - A*x;\n  scalar tempNorm = tmp2.norm()/b.norm();\n  cout << \"Relative norm of the computed solution : \" << tempNorm <<\"\\n\";\n  cout << \"Number of nonzeros in the factor : \" << solver.nnzL() + solver.nnzU() << std::endl; \n  \n  return 0;\n}"
  },
  {
    "path": "libs/eigen/bench/spmv.cpp",
    "content": "\n//g++-4.4 -DNOMTL  -Wl,-rpath /usr/local/lib/oski -L /usr/local/lib/oski/ -l oski -l oski_util -l oski_util_Tid  -DOSKI -I ~/Coding/LinearAlgebra/mtl4/  spmv.cpp  -I .. -O2 -DNDEBUG -lrt  -lm -l oski_mat_CSC_Tid  -loskilt && ./a.out r200000 c200000 n100 t1 p1\n\n#define SCALAR double\n\n#include <iostream>\n#include <algorithm>\n#include \"BenchTimer.h\"\n#include \"BenchSparseUtil.h\"\n\n#define SPMV_BENCH(CODE) BENCH(t,tries,repeats,CODE);\n\n// #ifdef MKL\n//\n// #include \"mkl_types.h\"\n// #include \"mkl_spblas.h\"\n//\n// template<typename Lhs,typename Rhs,typename Res>\n// void mkl_multiply(const Lhs& lhs, const Rhs& rhs, Res& res)\n// {\n//   char n = 'N';\n//   float alpha = 1;\n//   char matdescra[6];\n//   matdescra[0] = 'G';\n//   matdescra[1] = 0;\n//   matdescra[2] = 0;\n//   matdescra[3] = 'C';\n//   mkl_scscmm(&n, lhs.rows(), rhs.cols(), lhs.cols(), &alpha, matdescra,\n//              lhs._valuePtr(), lhs._innerIndexPtr(), lhs.outerIndexPtr(),\n//              pntre, b, &ldb, &beta, c, &ldc);\n// //   mkl_somatcopy('C', 'T', lhs.rows(), lhs.cols(), 1,\n// //                 lhs._valuePtr(), lhs.rows(), DST, dst_stride);\n// }\n//\n// #endif\n\nint main(int argc, char *argv[])\n{\n  int size = 10000;\n  int rows = size;\n  int cols = size;\n  int nnzPerCol = 40;\n  int tries = 2;\n  int repeats = 2;\n\n  bool need_help = false;\n  for(int i = 1; i < argc; i++)\n  {\n    if(argv[i][0] == 'r')\n    {\n      rows = atoi(argv[i]+1);\n    }\n    else if(argv[i][0] == 'c')\n    {\n      cols = atoi(argv[i]+1);\n    }\n    else if(argv[i][0] == 'n')\n    {\n      nnzPerCol = atoi(argv[i]+1);\n    }\n    else if(argv[i][0] == 't')\n    {\n      tries = atoi(argv[i]+1);\n    }\n    else if(argv[i][0] == 'p')\n    {\n      repeats = atoi(argv[i]+1);\n    }\n    else\n    {\n      need_help = true;\n    }\n  }\n  if(need_help)\n  {\n    std::cout << argv[0] << \" r<nb rows> c<nb columns> n<non zeros per column> t<nb tries> p<nb repeats>\\n\";\n    return 1;\n  }\n\n  std::cout << \"SpMV \" << rows << \" x \" << cols << \" with \" << nnzPerCol << \" non zeros per column. (\" << repeats << \" repeats, and \" << tries << \" tries)\\n\\n\";\n\n  EigenSparseMatrix sm(rows,cols);\n  DenseVector dv(cols), res(rows);\n  dv.setRandom();\n\n  BenchTimer t;\n  while (nnzPerCol>=4)\n  {\n    std::cout << \"nnz: \" << nnzPerCol << \"\\n\";\n    sm.setZero();\n    fillMatrix2(nnzPerCol, rows, cols, sm);\n\n    // dense matrices\n    #ifdef DENSEMATRIX\n    {\n      DenseMatrix dm(rows,cols), (rows,cols);\n      eiToDense(sm, dm);\n\n      SPMV_BENCH(res = dm * sm);\n      std::cout << \"Dense       \" << t.value()/repeats << \"\\t\";\n\n      SPMV_BENCH(res = dm.transpose() * sm);\n      std::cout << t.value()/repeats << endl;\n    }\n    #endif\n\n    // eigen sparse matrices\n    {\n      SPMV_BENCH(res.noalias() += sm * dv; )\n      std::cout << \"Eigen       \" << t.value()/repeats << \"\\t\";\n\n      SPMV_BENCH(res.noalias() += sm.transpose() * dv; )\n      std::cout << t.value()/repeats << endl;\n    }\n\n    // CSparse\n    #ifdef CSPARSE\n    {\n      std::cout << \"CSparse \\n\";\n      cs *csm;\n      eiToCSparse(sm, csm);\n\n//       BENCH();\n//       timer.stop();\n//       std::cout << \"   a * b:\\t\" << timer.value() << endl;\n\n//       BENCH( { m3 = cs_sorted_multiply2(m1, m2); cs_spfree(m3); } );\n//       std::cout << \"   a * b:\\t\" << timer.value() << endl;\n    }\n    #endif\n\n    #ifdef OSKI\n    {\n      oski_matrix_t om;\n      oski_vecview_t ov, ores;\n      oski_Init();\n      om = oski_CreateMatCSC(sm._outerIndexPtr(), sm._innerIndexPtr(), sm._valuePtr(), rows, cols,\n                             SHARE_INPUTMAT, 1, INDEX_ZERO_BASED);\n      ov = oski_CreateVecView(dv.data(), cols, STRIDE_UNIT);\n      ores = oski_CreateVecView(res.data(), rows, STRIDE_UNIT);\n\n      SPMV_BENCH( oski_MatMult(om, OP_NORMAL, 1, ov, 0, ores) );\n      std::cout << \"OSKI        \" << t.value()/repeats << \"\\t\";\n\n      SPMV_BENCH( oski_MatMult(om, OP_TRANS, 1, ov, 0, ores) );\n      std::cout << t.value()/repeats << \"\\n\";\n\n      // tune\n      t.reset();\n      t.start();\n      oski_SetHintMatMult(om, OP_NORMAL, 1.0, SYMBOLIC_VEC, 0.0, SYMBOLIC_VEC, ALWAYS_TUNE_AGGRESSIVELY);\n      oski_TuneMat(om);\n      t.stop();\n      double tuning = t.value();\n\n      SPMV_BENCH( oski_MatMult(om, OP_NORMAL, 1, ov, 0, ores) );\n      std::cout << \"OSKI tuned  \" << t.value()/repeats << \"\\t\";\n\n      SPMV_BENCH( oski_MatMult(om, OP_TRANS, 1, ov, 0, ores) );\n      std::cout << t.value()/repeats << \"\\t(\" << tuning <<  \")\\n\";\n\n\n      oski_DestroyMat(om);\n      oski_DestroyVecView(ov);\n      oski_DestroyVecView(ores);\n      oski_Close();\n    }\n    #endif\n\n    #ifndef NOUBLAS\n    {\n      using namespace boost::numeric;\n      UblasMatrix um(rows,cols);\n      eiToUblas(sm, um);\n\n      boost::numeric::ublas::vector<Scalar> uv(cols), ures(rows);\n      Map<Matrix<Scalar,Dynamic,1> >(&uv[0], cols) = dv;\n      Map<Matrix<Scalar,Dynamic,1> >(&ures[0], rows) = res;\n\n      SPMV_BENCH(ublas::axpy_prod(um, uv, ures, true));\n      std::cout << \"ublas       \" << t.value()/repeats << \"\\t\";\n\n      SPMV_BENCH(ublas::axpy_prod(boost::numeric::ublas::trans(um), uv, ures, true));\n      std::cout << t.value()/repeats << endl;\n    }\n    #endif\n\n    // GMM++\n    #ifndef NOGMM\n    {\n      GmmSparse gm(rows,cols);\n      eiToGmm(sm, gm);\n\n      std::vector<Scalar> gv(cols), gres(rows);\n      Map<Matrix<Scalar,Dynamic,1> >(&gv[0], cols) = dv;\n      Map<Matrix<Scalar,Dynamic,1> >(&gres[0], rows) = res;\n\n      SPMV_BENCH(gmm::mult(gm, gv, gres));\n      std::cout << \"GMM++       \" << t.value()/repeats << \"\\t\";\n\n      SPMV_BENCH(gmm::mult(gmm::transposed(gm), gv, gres));\n      std::cout << t.value()/repeats << endl;\n    }\n    #endif\n\n    // MTL4\n    #ifndef NOMTL\n    {\n      MtlSparse mm(rows,cols);\n      eiToMtl(sm, mm);\n      mtl::dense_vector<Scalar> mv(cols, 1.0);\n      mtl::dense_vector<Scalar> mres(rows, 1.0);\n\n      SPMV_BENCH(mres = mm * mv);\n      std::cout << \"MTL4        \" << t.value()/repeats << \"\\t\";\n\n      SPMV_BENCH(mres = trans(mm) * mv);\n      std::cout << t.value()/repeats << endl;\n    }\n    #endif\n\n    std::cout << \"\\n\";\n\n    if(nnzPerCol==1)\n      break;\n    nnzPerCol -= nnzPerCol/2;\n  }\n\n  return 0;\n}\n\n\n\n"
  },
  {
    "path": "libs/eigen/bench/vdw_new.cpp",
    "content": "#include <iostream>\n#include <Eigen/Core>\n\nusing namespace Eigen;\n\n#ifndef SCALAR\n#define SCALAR float\n#endif\n\n#ifndef SIZE\n#define SIZE 10000\n#endif\n\n#ifndef REPEAT\n#define REPEAT 10000\n#endif\n\ntypedef Matrix<SCALAR, Eigen::Dynamic, 1> Vec;\n\nusing namespace std;\n\nSCALAR E_VDW(const Vec &interactions1, const Vec &interactions2)\n{\n  return (interactions2.cwise()/interactions1)\n         .cwise().cube()\n         .cwise().square()\n         .cwise().square()\n         .sum();\n}\n\nint main() \n{\n  //\n  //          1   2   3   4  ... (interactions)\n  // ka       .   .   .   .  ...\n  // rab      .   .   .   .  ...\n  // energy   .   .   .   .  ...\n  // ...     ... ... ... ... ...\n  // (variables\n  //    for\n  // interaction)\n  //\n  Vec interactions1(SIZE), interactions2(SIZE); // SIZE is the number of vdw interactions in our system\n  // SetupCalculations()\n  SCALAR rab = 1.0;  \n  interactions1.setConstant(2.4);\n  interactions2.setConstant(rab);\n  \n  // Energy()\n  SCALAR energy = 0.0;\n  for (unsigned int i = 0; i<REPEAT; ++i) {\n    energy += E_VDW(interactions1, interactions2);\n    energy *= 1 + 1e-20 * i; // prevent compiler from optimizing the loop\n  }\n  cout << \"energy = \" << energy << endl;\n}\n"
  },
  {
    "path": "libs/eigen/blas/BandTriangularSolver.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2011 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_BAND_TRIANGULARSOLVER_H\n#define EIGEN_BAND_TRIANGULARSOLVER_H\n\nnamespace internal {\n\n /* \\internal\n  * Solve Ax=b with A a band triangular matrix\n  * TODO: extend it to matrices for x abd b */\ntemplate<typename Index, int Mode, typename LhsScalar, bool ConjLhs, typename RhsScalar, int StorageOrder>\nstruct band_solve_triangular_selector;\n\n\ntemplate<typename Index, int Mode, typename LhsScalar, bool ConjLhs, typename RhsScalar>\nstruct band_solve_triangular_selector<Index,Mode,LhsScalar,ConjLhs,RhsScalar,RowMajor>\n{\n  typedef Map<const Matrix<LhsScalar,Dynamic,Dynamic,RowMajor>, 0, OuterStride<> > LhsMap;\n  typedef Map<Matrix<RhsScalar,Dynamic,1> > RhsMap;\n  enum { IsLower = (Mode&Lower) ? 1 : 0 };\n  static void run(Index size, Index k, const LhsScalar* _lhs, Index lhsStride, RhsScalar* _other)\n  {\n    const LhsMap lhs(_lhs,size,k+1,OuterStride<>(lhsStride));\n    RhsMap other(_other,size,1);\n    typename internal::conditional<\n                          ConjLhs,\n                          const CwiseUnaryOp<typename internal::scalar_conjugate_op<LhsScalar>,LhsMap>,\n                          const LhsMap&>\n                        ::type cjLhs(lhs);\n                        \n    for(int col=0 ; col<other.cols() ; ++col)\n    {\n      for(int ii=0; ii<size; ++ii)\n      {\n        int i = IsLower ? ii : size-ii-1;\n        int actual_k = (std::min)(k,ii);\n        int actual_start = IsLower ? k-actual_k : 1;\n        \n        if(actual_k>0)\n          other.coeffRef(i,col) -= cjLhs.row(i).segment(actual_start,actual_k).transpose()\n                                  .cwiseProduct(other.col(col).segment(IsLower ? i-actual_k : i+1,actual_k)).sum();\n\n        if((Mode&UnitDiag)==0)\n          other.coeffRef(i,col) /= cjLhs(i,IsLower ? k : 0);\n      }\n    }\n  }\n  \n};\n\ntemplate<typename Index, int Mode, typename LhsScalar, bool ConjLhs, typename RhsScalar>\nstruct band_solve_triangular_selector<Index,Mode,LhsScalar,ConjLhs,RhsScalar,ColMajor>\n{\n  typedef Map<const Matrix<LhsScalar,Dynamic,Dynamic,ColMajor>, 0, OuterStride<> > LhsMap;\n  typedef Map<Matrix<RhsScalar,Dynamic,1> > RhsMap;\n  enum { IsLower = (Mode&Lower) ? 1 : 0 };\n  static void run(Index size, Index k, const LhsScalar* _lhs, Index lhsStride, RhsScalar* _other)\n  {\n    const LhsMap lhs(_lhs,k+1,size,OuterStride<>(lhsStride));\n    RhsMap other(_other,size,1);\n    typename internal::conditional<\n                          ConjLhs,\n                          const CwiseUnaryOp<typename internal::scalar_conjugate_op<LhsScalar>,LhsMap>,\n                          const LhsMap&>\n                        ::type cjLhs(lhs);\n                        \n    for(int col=0 ; col<other.cols() ; ++col)\n    {\n      for(int ii=0; ii<size; ++ii)\n      {\n        int i = IsLower ? ii : size-ii-1;\n        int actual_k = (std::min)(k,size-ii-1);\n        int actual_start = IsLower ? 1 : k-actual_k;\n        \n        if((Mode&UnitDiag)==0)\n          other.coeffRef(i,col) /= cjLhs(IsLower ? 0 : k, i);\n\n        if(actual_k>0)\n          other.col(col).segment(IsLower ? i+1 : i-actual_k, actual_k)\n              -= other.coeff(i,col) * cjLhs.col(i).segment(actual_start,actual_k);\n        \n      }\n    }\n  }\n};\n\n\n} // end namespace internal\n\n#endif // EIGEN_BAND_TRIANGULARSOLVER_H\n"
  },
  {
    "path": "libs/eigen/blas/CMakeLists.txt",
    "content": "\nproject(EigenBlas CXX)\n\ninclude(\"../cmake/language_support.cmake\")\n\nworkaround_9220(Fortran EIGEN_Fortran_COMPILER_WORKS)\n\nif(EIGEN_Fortran_COMPILER_WORKS)\n  enable_language(Fortran OPTIONAL)\n  if(NOT CMAKE_Fortran_COMPILER)\n    set(EIGEN_Fortran_COMPILER_WORKS OFF)\n  endif()\nendif()\n\nadd_custom_target(blas)\n\nset(EigenBlas_SRCS single.cpp double.cpp complex_single.cpp complex_double.cpp xerbla.cpp)\n\nif(EIGEN_Fortran_COMPILER_WORKS)\n\nset(EigenBlas_SRCS ${EigenBlas_SRCS}\n    complexdots.f\n    srotm.f srotmg.f drotm.f drotmg.f\n    lsame.f  dspmv.f ssbmv.f\n    chbmv.f  sspmv.f\n    zhbmv.f  chpmv.f dsbmv.f\n    zhpmv.f\n    dtbmv.f stbmv.f ctbmv.f ztbmv.f\n)\nelse()\n\nmessage(WARNING \" No fortran compiler has been detected, the blas build will be incomplete.\")\n\nendif()\n\nadd_library(eigen_blas_static ${EigenBlas_SRCS})\nadd_library(eigen_blas SHARED ${EigenBlas_SRCS})\n\nif(EIGEN_STANDARD_LIBRARIES_TO_LINK_TO)\n  target_link_libraries(eigen_blas_static ${EIGEN_STANDARD_LIBRARIES_TO_LINK_TO})\n  target_link_libraries(eigen_blas        ${EIGEN_STANDARD_LIBRARIES_TO_LINK_TO})\nendif()\n\nadd_dependencies(blas eigen_blas eigen_blas_static)\n\ninstall(TARGETS eigen_blas eigen_blas_static\n        RUNTIME DESTINATION bin\n        LIBRARY DESTINATION lib\n        ARCHIVE DESTINATION lib)\n\nif(EIGEN_Fortran_COMPILER_WORKS)\n\nif(EIGEN_LEAVE_TEST_IN_ALL_TARGET)\n  add_subdirectory(testing) # can't do EXCLUDE_FROM_ALL here, breaks CTest\nelse()\n  add_subdirectory(testing EXCLUDE_FROM_ALL)\nendif()\n\nendif()\n\n"
  },
  {
    "path": "libs/eigen/blas/GeneralRank1Update.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Chen-Pang He <jdh8@ms63.hinet.net>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_GENERAL_RANK1UPDATE_H\n#define EIGEN_GENERAL_RANK1UPDATE_H\n\nnamespace internal {\n\n/* Optimized matrix += alpha * uv' */\ntemplate<typename Scalar, typename Index, int StorageOrder, bool ConjLhs, bool ConjRhs>\nstruct general_rank1_update;\n\ntemplate<typename Scalar, typename Index, bool ConjLhs, bool ConjRhs>\nstruct general_rank1_update<Scalar,Index,ColMajor,ConjLhs,ConjRhs>\n{\n  static void run(Index rows, Index cols, Scalar* mat, Index stride, const Scalar* u, const Scalar* v, Scalar alpha)\n  {\n    typedef Map<const Matrix<Scalar,Dynamic,1> > OtherMap;\n    typedef typename conj_expr_if<ConjLhs,OtherMap>::type ConjRhsType;\n    conj_if<ConjRhs> cj;\n\n    for (Index i=0; i<cols; ++i)\n      Map<Matrix<Scalar,Dynamic,1> >(mat+stride*i,rows) += alpha * cj(v[i]) * ConjRhsType(OtherMap(u,rows));\n  }\n};\n\ntemplate<typename Scalar, typename Index, bool ConjLhs, bool ConjRhs>\nstruct general_rank1_update<Scalar,Index,RowMajor,ConjLhs,ConjRhs>\n{\n  static void run(Index rows, Index cols, Scalar* mat, Index stride, const Scalar* u, const Scalar* v, Scalar alpha)\n  {\n    general_rank1_update<Scalar,Index,ColMajor,ConjRhs,ConjRhs>::run(rows,cols,mat,stride,u,v,alpha);\n  }\n};\n\n} // end namespace internal\n\n#endif // EIGEN_GENERAL_RANK1UPDATE_H\n"
  },
  {
    "path": "libs/eigen/blas/PackedSelfadjointProduct.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Chen-Pang He <jdh8@ms63.hinet.net>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SELFADJOINT_PACKED_PRODUCT_H\n#define EIGEN_SELFADJOINT_PACKED_PRODUCT_H\n\nnamespace internal {\n\n/* Optimized matrix += alpha * uv'\n * The matrix is in packed form.\n */\ntemplate<typename Scalar, typename Index, int StorageOrder, int UpLo, bool ConjLhs, bool ConjRhs>\nstruct selfadjoint_packed_rank1_update;\n\ntemplate<typename Scalar, typename Index, int UpLo, bool ConjLhs, bool ConjRhs>\nstruct selfadjoint_packed_rank1_update<Scalar,Index,ColMajor,UpLo,ConjLhs,ConjRhs>\n{\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  static void run(Index size, Scalar* mat, const Scalar* vec, RealScalar alpha)\n  {\n    typedef Map<const Matrix<Scalar,Dynamic,1> > OtherMap;\n    typedef typename conj_expr_if<ConjLhs,OtherMap>::type ConjRhsType;\n    conj_if<ConjRhs> cj;\n\n    for (Index i=0; i<size; ++i)\n    {\n      Map<Matrix<Scalar,Dynamic,1> >(mat, UpLo==Lower ? size-i : (i+1)) += alpha * cj(vec[i]) * ConjRhsType(OtherMap(vec+(UpLo==Lower ? i : 0), UpLo==Lower ? size-i : (i+1)));\n      //FIXME This should be handled outside.\n      mat[UpLo==Lower ? 0 : i] = numext::real(mat[UpLo==Lower ? 0 : i]);\n      mat += UpLo==Lower ? size-i : (i+1);\n    }\n  }\n};\n\ntemplate<typename Scalar, typename Index, int UpLo, bool ConjLhs, bool ConjRhs>\nstruct selfadjoint_packed_rank1_update<Scalar,Index,RowMajor,UpLo,ConjLhs,ConjRhs>\n{\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  static void run(Index size, Scalar* mat, const Scalar* vec, RealScalar alpha)\n  {\n    selfadjoint_packed_rank1_update<Scalar,Index,ColMajor,UpLo==Lower?Upper:Lower,ConjRhs,ConjLhs>::run(size,mat,vec,alpha);\n  }\n};\n\n} // end namespace internal\n\n#endif // EIGEN_SELFADJOINT_PACKED_PRODUCT_H\n"
  },
  {
    "path": "libs/eigen/blas/PackedTriangularMatrixVector.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Chen-Pang He <jdh8@ms63.hinet.net>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_PACKED_TRIANGULAR_MATRIX_VECTOR_H\n#define EIGEN_PACKED_TRIANGULAR_MATRIX_VECTOR_H\n\nnamespace internal {\n\ntemplate<typename Index, int Mode, typename LhsScalar, bool ConjLhs, typename RhsScalar, bool ConjRhs, int StorageOrder>\nstruct packed_triangular_matrix_vector_product;\n\ntemplate<typename Index, int Mode, typename LhsScalar, bool ConjLhs, typename RhsScalar, bool ConjRhs>\nstruct packed_triangular_matrix_vector_product<Index,Mode,LhsScalar,ConjLhs,RhsScalar,ConjRhs,ColMajor>\n{\n  typedef typename scalar_product_traits<LhsScalar, RhsScalar>::ReturnType ResScalar;\n  enum {\n    IsLower     = (Mode & Lower)   ==Lower,\n    HasUnitDiag = (Mode & UnitDiag)==UnitDiag,\n    HasZeroDiag = (Mode & ZeroDiag)==ZeroDiag\n  };\n  static void run(Index size, const LhsScalar* lhs, const RhsScalar* rhs, ResScalar* res, ResScalar alpha)\n  {\n    internal::conj_if<ConjRhs> cj;\n    typedef Map<const Matrix<LhsScalar,Dynamic,1> > LhsMap;\n    typedef typename conj_expr_if<ConjLhs,LhsMap>::type ConjLhsType;\n    typedef Map<Matrix<ResScalar,Dynamic,1> > ResMap;\n\n    for (Index i=0; i<size; ++i)\n    {\n      Index s = IsLower&&(HasUnitDiag||HasZeroDiag) ? 1 : 0;\n      Index r = IsLower ? size-i: i+1;\n      if (EIGEN_IMPLIES(HasUnitDiag||HasZeroDiag, (--r)>0))\n\tResMap(res+(IsLower ? s+i : 0),r) += alpha * cj(rhs[i]) * ConjLhsType(LhsMap(lhs+s,r));\n      if (HasUnitDiag)\n\tres[i] += alpha * cj(rhs[i]);\n      lhs += IsLower ? size-i: i+1;\n    }\n  };\n};\n\ntemplate<typename Index, int Mode, typename LhsScalar, bool ConjLhs, typename RhsScalar, bool ConjRhs>\nstruct packed_triangular_matrix_vector_product<Index,Mode,LhsScalar,ConjLhs,RhsScalar,ConjRhs,RowMajor>\n{\n  typedef typename scalar_product_traits<LhsScalar, RhsScalar>::ReturnType ResScalar;\n  enum {\n    IsLower     = (Mode & Lower)   ==Lower,\n    HasUnitDiag = (Mode & UnitDiag)==UnitDiag,\n    HasZeroDiag = (Mode & ZeroDiag)==ZeroDiag\n  };\n  static void run(Index size, const LhsScalar* lhs, const RhsScalar* rhs, ResScalar* res, ResScalar alpha)\n  {\n    internal::conj_if<ConjRhs> cj;\n    typedef Map<const Matrix<LhsScalar,Dynamic,1> > LhsMap;\n    typedef typename conj_expr_if<ConjLhs,LhsMap>::type ConjLhsType;\n    typedef Map<const Matrix<RhsScalar,Dynamic,1> > RhsMap;\n    typedef typename conj_expr_if<ConjRhs,RhsMap>::type ConjRhsType;\n\n    for (Index i=0; i<size; ++i)\n    {\n      Index s = !IsLower&&(HasUnitDiag||HasZeroDiag) ? 1 : 0;\n      Index r = IsLower ? i+1 : size-i;\n      if (EIGEN_IMPLIES(HasUnitDiag||HasZeroDiag, (--r)>0))\n\tres[i] += alpha * (ConjLhsType(LhsMap(lhs+s,r)).cwiseProduct(ConjRhsType(RhsMap(rhs+(IsLower ? 0 : s+i),r)))).sum();\n      if (HasUnitDiag)\n\tres[i] += alpha * cj(rhs[i]);\n      lhs += IsLower ? i+1 : size-i;\n    }\n  };\n};\n\n} // end namespace internal\n\n#endif // EIGEN_PACKED_TRIANGULAR_MATRIX_VECTOR_H\n"
  },
  {
    "path": "libs/eigen/blas/PackedTriangularSolverVector.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Chen-Pang He <jdh8@ms63.hinet.net>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_PACKED_TRIANGULAR_SOLVER_VECTOR_H\n#define EIGEN_PACKED_TRIANGULAR_SOLVER_VECTOR_H\n\nnamespace internal {\n\ntemplate<typename LhsScalar, typename RhsScalar, typename Index, int Side, int Mode, bool Conjugate, int StorageOrder>\nstruct packed_triangular_solve_vector;\n\n// forward and backward substitution, row-major, rhs is a vector\ntemplate<typename LhsScalar, typename RhsScalar, typename Index, int Mode, bool Conjugate>\nstruct packed_triangular_solve_vector<LhsScalar, RhsScalar, Index, OnTheLeft, Mode, Conjugate, RowMajor>\n{\n  enum {\n    IsLower = (Mode&Lower)==Lower\n  };\n  static void run(Index size, const LhsScalar* lhs, RhsScalar* rhs)\n  {\n    internal::conj_if<Conjugate> cj;\n    typedef Map<const Matrix<LhsScalar,Dynamic,1> > LhsMap;\n    typedef typename conj_expr_if<Conjugate,LhsMap>::type ConjLhsType;\n\n    lhs += IsLower ? 0 : (size*(size+1)>>1)-1;\n    for(Index pi=0; pi<size; ++pi)\n    {\n      Index i = IsLower ? pi : size-pi-1;\n      Index s = IsLower ? 0 : 1;\n      if (pi>0)\n\trhs[i] -= (ConjLhsType(LhsMap(lhs+s,pi))\n\t    .cwiseProduct(Map<const Matrix<RhsScalar,Dynamic,1> >(rhs+(IsLower ? 0 : i+1),pi))).sum();\n      if (!(Mode & UnitDiag))\n\trhs[i] /= cj(lhs[IsLower ? i : 0]);\n      IsLower ? lhs += pi+1 : lhs -= pi+2;\n    }\n  }\n};\n\n// forward and backward substitution, column-major, rhs is a vector\ntemplate<typename LhsScalar, typename RhsScalar, typename Index, int Mode, bool Conjugate>\nstruct packed_triangular_solve_vector<LhsScalar, RhsScalar, Index, OnTheLeft, Mode, Conjugate, ColMajor>\n{\n  enum {\n    IsLower = (Mode&Lower)==Lower\n  };\n  static void run(Index size, const LhsScalar* lhs, RhsScalar* rhs)\n  {\n    internal::conj_if<Conjugate> cj;\n    typedef Map<const Matrix<LhsScalar,Dynamic,1> > LhsMap;\n    typedef typename conj_expr_if<Conjugate,LhsMap>::type ConjLhsType;\n\n    lhs += IsLower ? 0 : size*(size-1)>>1;\n    for(Index pi=0; pi<size; ++pi)\n    {\n      Index i = IsLower ? pi : size-pi-1;\n      Index r = size - pi - 1;\n      if (!(Mode & UnitDiag))\n\trhs[i] /= cj(lhs[IsLower ? 0 : i]);\n      if (r>0)\n\tMap<Matrix<RhsScalar,Dynamic,1> >(rhs+(IsLower? i+1 : 0),r) -=\n\t    rhs[i] * ConjLhsType(LhsMap(lhs+(IsLower? 1 : 0),r));\n      IsLower ? lhs += size-pi : lhs -= r;\n    }\n  }\n};\n\ntemplate<typename LhsScalar, typename RhsScalar, typename Index, int Mode, bool Conjugate, int StorageOrder>\nstruct packed_triangular_solve_vector<LhsScalar, RhsScalar, Index, OnTheRight, Mode, Conjugate, StorageOrder>\n{\n  static void run(Index size, const LhsScalar* lhs, RhsScalar* rhs)\n  {\n    packed_triangular_solve_vector<LhsScalar,RhsScalar,Index,OnTheLeft,\n\t((Mode&Upper)==Upper ? Lower : Upper) | (Mode&UnitDiag),\n\tConjugate,StorageOrder==RowMajor?ColMajor:RowMajor\n      >::run(size, lhs, rhs);\n  }\n};\n\n} // end namespace internal\n\n#endif // EIGEN_PACKED_TRIANGULAR_SOLVER_VECTOR_H\n"
  },
  {
    "path": "libs/eigen/blas/README.txt",
    "content": "\nThis directory contains a BLAS library built on top of Eigen.\n\nThis module is not built by default. In order to compile it, you need to\ntype 'make blas' from within your build dir.\n\n"
  },
  {
    "path": "libs/eigen/blas/Rank2Update.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Chen-Pang He <jdh8@ms63.hinet.net>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_RANK2UPDATE_H\n#define EIGEN_RANK2UPDATE_H\n\nnamespace internal {\n\n/* Optimized selfadjoint matrix += alpha * uv' + conj(alpha)*vu'\n * This is the low-level version of SelfadjointRank2Update.h\n */\ntemplate<typename Scalar, typename Index, int UpLo>\nstruct rank2_update_selector\n{\n  static void run(Index size, Scalar* mat, Index stride, const Scalar* u, const Scalar* v, Scalar alpha)\n  {\n    typedef Map<const Matrix<Scalar,Dynamic,1> > OtherMap;\n    for (Index i=0; i<size; ++i)\n    {\n      Map<Matrix<Scalar,Dynamic,1> >(mat+stride*i+(UpLo==Lower ? i : 0), UpLo==Lower ? size-i : (i+1)) +=\n      numext::conj(alpha) * numext::conj(u[i]) * OtherMap(v+(UpLo==Lower ? i : 0), UpLo==Lower ? size-i : (i+1))\n                + alpha * numext::conj(v[i]) * OtherMap(u+(UpLo==Lower ? i : 0), UpLo==Lower ? size-i : (i+1));\n    }\n  }\n};\n\n/* Optimized selfadjoint matrix += alpha * uv' + conj(alpha)*vu'\n * The matrix is in packed form.\n */\ntemplate<typename Scalar, typename Index, int UpLo>\nstruct packed_rank2_update_selector\n{\n  static void run(Index size, Scalar* mat, const Scalar* u, const Scalar* v, Scalar alpha)\n  {\n    typedef Map<const Matrix<Scalar,Dynamic,1> > OtherMap;\n    Index offset = 0;\n    for (Index i=0; i<size; ++i)\n    {\n      Map<Matrix<Scalar,Dynamic,1> >(mat+offset, UpLo==Lower ? size-i : (i+1)) +=\n      numext::conj(alpha) * numext::conj(u[i]) * OtherMap(v+(UpLo==Lower ? i : 0), UpLo==Lower ? size-i : (i+1))\n                + alpha * numext::conj(v[i]) * OtherMap(u+(UpLo==Lower ? i : 0), UpLo==Lower ? size-i : (i+1));\n      //FIXME This should be handled outside.\n      mat[offset+(UpLo==Lower ? 0 : i)] = numext::real(mat[offset+(UpLo==Lower ? 0 : i)]);\n      offset += UpLo==Lower ? size-i : (i+1);\n    }\n  }\n};\n\n} // end namespace internal\n\n#endif // EIGEN_RANK2UPDATE_H\n"
  },
  {
    "path": "libs/eigen/blas/chbmv.f",
    "content": "      SUBROUTINE CHBMV(UPLO,N,K,ALPHA,A,LDA,X,INCX,BETA,Y,INCY)\n*     .. Scalar Arguments ..\n      COMPLEX ALPHA,BETA\n      INTEGER INCX,INCY,K,LDA,N\n      CHARACTER UPLO\n*     ..\n*     .. Array Arguments ..\n      COMPLEX A(LDA,*),X(*),Y(*)\n*     ..\n*\n*  Purpose\n*  =======\n*\n*  CHBMV  performs the matrix-vector  operation\n*\n*     y := alpha*A*x + beta*y,\n*\n*  where alpha and beta are scalars, x and y are n element vectors and\n*  A is an n by n hermitian band matrix, with k super-diagonals.\n*\n*  Arguments\n*  ==========\n*\n*  UPLO   - CHARACTER*1.\n*           On entry, UPLO specifies whether the upper or lower\n*           triangular part of the band matrix A is being supplied as\n*           follows:\n*\n*              UPLO = 'U' or 'u'   The upper triangular part of A is\n*                                  being supplied.\n*\n*              UPLO = 'L' or 'l'   The lower triangular part of A is\n*                                  being supplied.\n*\n*           Unchanged on exit.\n*\n*  N      - INTEGER.\n*           On entry, N specifies the order of the matrix A.\n*           N must be at least zero.\n*           Unchanged on exit.\n*\n*  K      - INTEGER.\n*           On entry, K specifies the number of super-diagonals of the\n*           matrix A. K must satisfy  0 .le. K.\n*           Unchanged on exit.\n*\n*  ALPHA  - COMPLEX         .\n*           On entry, ALPHA specifies the scalar alpha.\n*           Unchanged on exit.\n*\n*  A      - COMPLEX          array of DIMENSION ( LDA, n ).\n*           Before entry with UPLO = 'U' or 'u', the leading ( k + 1 )\n*           by n part of the array A must contain the upper triangular\n*           band part of the hermitian matrix, supplied column by\n*           column, with the leading diagonal of the matrix in row\n*           ( k + 1 ) of the array, the first super-diagonal starting at\n*           position 2 in row k, and so on. The top left k by k triangle\n*           of the array A is not referenced.\n*           The following program segment will transfer the upper\n*           triangular part of a hermitian band matrix from conventional\n*           full matrix storage to band storage:\n*\n*                 DO 20, J = 1, N\n*                    M = K + 1 - J\n*                    DO 10, I = MAX( 1, J - K ), J\n*                       A( M + I, J ) = matrix( I, J )\n*              10    CONTINUE\n*              20 CONTINUE\n*\n*           Before entry with UPLO = 'L' or 'l', the leading ( k + 1 )\n*           by n part of the array A must contain the lower triangular\n*           band part of the hermitian matrix, supplied column by\n*           column, with the leading diagonal of the matrix in row 1 of\n*           the array, the first sub-diagonal starting at position 1 in\n*           row 2, and so on. The bottom right k by k triangle of the\n*           array A is not referenced.\n*           The following program segment will transfer the lower\n*           triangular part of a hermitian band matrix from conventional\n*           full matrix storage to band storage:\n*\n*                 DO 20, J = 1, N\n*                    M = 1 - J\n*                    DO 10, I = J, MIN( N, J + K )\n*                       A( M + I, J ) = matrix( I, J )\n*              10    CONTINUE\n*              20 CONTINUE\n*\n*           Note that the imaginary parts of the diagonal elements need\n*           not be set and are assumed to be zero.\n*           Unchanged on exit.\n*\n*  LDA    - INTEGER.\n*           On entry, LDA specifies the first dimension of A as declared\n*           in the calling (sub) program. LDA must be at least\n*           ( k + 1 ).\n*           Unchanged on exit.\n*\n*  X      - COMPLEX          array of DIMENSION at least\n*           ( 1 + ( n - 1 )*abs( INCX ) ).\n*           Before entry, the incremented array X must contain the\n*           vector x.\n*           Unchanged on exit.\n*\n*  INCX   - INTEGER.\n*           On entry, INCX specifies the increment for the elements of\n*           X. INCX must not be zero.\n*           Unchanged on exit.\n*\n*  BETA   - COMPLEX         .\n*           On entry, BETA specifies the scalar beta.\n*           Unchanged on exit.\n*\n*  Y      - COMPLEX          array of DIMENSION at least\n*           ( 1 + ( n - 1 )*abs( INCY ) ).\n*           Before entry, the incremented array Y must contain the\n*           vector y. On exit, Y is overwritten by the updated vector y.\n*\n*  INCY   - INTEGER.\n*           On entry, INCY specifies the increment for the elements of\n*           Y. INCY must not be zero.\n*           Unchanged on exit.\n*\n*  Further Details\n*  ===============\n*\n*  Level 2 Blas routine.\n*\n*  -- Written on 22-October-1986.\n*     Jack Dongarra, Argonne National Lab.\n*     Jeremy Du Croz, Nag Central Office.\n*     Sven Hammarling, Nag Central Office.\n*     Richard Hanson, Sandia National Labs.\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      COMPLEX ONE\n      PARAMETER (ONE= (1.0E+0,0.0E+0))\n      COMPLEX ZERO\n      PARAMETER (ZERO= (0.0E+0,0.0E+0))\n*     ..\n*     .. Local Scalars ..\n      COMPLEX TEMP1,TEMP2\n      INTEGER I,INFO,IX,IY,J,JX,JY,KPLUS1,KX,KY,L\n*     ..\n*     .. External Functions ..\n      LOGICAL LSAME\n      EXTERNAL LSAME\n*     ..\n*     .. External Subroutines ..\n      EXTERNAL XERBLA\n*     ..\n*     .. Intrinsic Functions ..\n      INTRINSIC CONJG,MAX,MIN,REAL\n*     ..\n*\n*     Test the input parameters.\n*\n      INFO = 0\n      IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN\n          INFO = 1\n      ELSE IF (N.LT.0) THEN\n          INFO = 2\n      ELSE IF (K.LT.0) THEN\n          INFO = 3\n      ELSE IF (LDA.LT. (K+1)) THEN\n          INFO = 6\n      ELSE IF (INCX.EQ.0) THEN\n          INFO = 8\n      ELSE IF (INCY.EQ.0) THEN\n          INFO = 11\n      END IF\n      IF (INFO.NE.0) THEN\n          CALL XERBLA('CHBMV ',INFO)\n          RETURN\n      END IF\n*\n*     Quick return if possible.\n*\n      IF ((N.EQ.0) .OR. ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN\n*\n*     Set up the start points in  X  and  Y.\n*\n      IF (INCX.GT.0) THEN\n          KX = 1\n      ELSE\n          KX = 1 - (N-1)*INCX\n      END IF\n      IF (INCY.GT.0) THEN\n          KY = 1\n      ELSE\n          KY = 1 - (N-1)*INCY\n      END IF\n*\n*     Start the operations. In this version the elements of the array A\n*     are accessed sequentially with one pass through A.\n*\n*     First form  y := beta*y.\n*\n      IF (BETA.NE.ONE) THEN\n          IF (INCY.EQ.1) THEN\n              IF (BETA.EQ.ZERO) THEN\n                  DO 10 I = 1,N\n                      Y(I) = ZERO\n   10             CONTINUE\n              ELSE\n                  DO 20 I = 1,N\n                      Y(I) = BETA*Y(I)\n   20             CONTINUE\n              END IF\n          ELSE\n              IY = KY\n              IF (BETA.EQ.ZERO) THEN\n                  DO 30 I = 1,N\n                      Y(IY) = ZERO\n                      IY = IY + INCY\n   30             CONTINUE\n              ELSE\n                  DO 40 I = 1,N\n                      Y(IY) = BETA*Y(IY)\n                      IY = IY + INCY\n   40             CONTINUE\n              END IF\n          END IF\n      END IF\n      IF (ALPHA.EQ.ZERO) RETURN\n      IF (LSAME(UPLO,'U')) THEN\n*\n*        Form  y  when upper triangle of A is stored.\n*\n          KPLUS1 = K + 1\n          IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THEN\n              DO 60 J = 1,N\n                  TEMP1 = ALPHA*X(J)\n                  TEMP2 = ZERO\n                  L = KPLUS1 - J\n                  DO 50 I = MAX(1,J-K),J - 1\n                      Y(I) = Y(I) + TEMP1*A(L+I,J)\n                      TEMP2 = TEMP2 + CONJG(A(L+I,J))*X(I)\n   50             CONTINUE\n                  Y(J) = Y(J) + TEMP1*REAL(A(KPLUS1,J)) + ALPHA*TEMP2\n   60         CONTINUE\n          ELSE\n              JX = KX\n              JY = KY\n              DO 80 J = 1,N\n                  TEMP1 = ALPHA*X(JX)\n                  TEMP2 = ZERO\n                  IX = KX\n                  IY = KY\n                  L = KPLUS1 - J\n                  DO 70 I = MAX(1,J-K),J - 1\n                      Y(IY) = Y(IY) + TEMP1*A(L+I,J)\n                      TEMP2 = TEMP2 + CONJG(A(L+I,J))*X(IX)\n                      IX = IX + INCX\n                      IY = IY + INCY\n   70             CONTINUE\n                  Y(JY) = Y(JY) + TEMP1*REAL(A(KPLUS1,J)) + ALPHA*TEMP2\n                  JX = JX + INCX\n                  JY = JY + INCY\n                  IF (J.GT.K) THEN\n                      KX = KX + INCX\n                      KY = KY + INCY\n                  END IF\n   80         CONTINUE\n          END IF\n      ELSE\n*\n*        Form  y  when lower triangle of A is stored.\n*\n          IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THEN\n              DO 100 J = 1,N\n                  TEMP1 = ALPHA*X(J)\n                  TEMP2 = ZERO\n                  Y(J) = Y(J) + TEMP1*REAL(A(1,J))\n                  L = 1 - J\n                  DO 90 I = J + 1,MIN(N,J+K)\n                      Y(I) = Y(I) + TEMP1*A(L+I,J)\n                      TEMP2 = TEMP2 + CONJG(A(L+I,J))*X(I)\n   90             CONTINUE\n                  Y(J) = Y(J) + ALPHA*TEMP2\n  100         CONTINUE\n          ELSE\n              JX = KX\n              JY = KY\n              DO 120 J = 1,N\n                  TEMP1 = ALPHA*X(JX)\n                  TEMP2 = ZERO\n                  Y(JY) = Y(JY) + TEMP1*REAL(A(1,J))\n                  L = 1 - J\n                  IX = JX\n                  IY = JY\n                  DO 110 I = J + 1,MIN(N,J+K)\n                      IX = IX + INCX\n                      IY = IY + INCY\n                      Y(IY) = Y(IY) + TEMP1*A(L+I,J)\n                      TEMP2 = TEMP2 + CONJG(A(L+I,J))*X(IX)\n  110             CONTINUE\n                  Y(JY) = Y(JY) + ALPHA*TEMP2\n                  JX = JX + INCX\n                  JY = JY + INCY\n  120         CONTINUE\n          END IF\n      END IF\n*\n      RETURN\n*\n*     End of CHBMV .\n*\n      END\n"
  },
  {
    "path": "libs/eigen/blas/chpmv.f",
    "content": "      SUBROUTINE CHPMV(UPLO,N,ALPHA,AP,X,INCX,BETA,Y,INCY)\n*     .. Scalar Arguments ..\n      COMPLEX ALPHA,BETA\n      INTEGER INCX,INCY,N\n      CHARACTER UPLO\n*     ..\n*     .. Array Arguments ..\n      COMPLEX AP(*),X(*),Y(*)\n*     ..\n*\n*  Purpose\n*  =======\n*\n*  CHPMV  performs the matrix-vector operation\n*\n*     y := alpha*A*x + beta*y,\n*\n*  where alpha and beta are scalars, x and y are n element vectors and\n*  A is an n by n hermitian matrix, supplied in packed form.\n*\n*  Arguments\n*  ==========\n*\n*  UPLO   - CHARACTER*1.\n*           On entry, UPLO specifies whether the upper or lower\n*           triangular part of the matrix A is supplied in the packed\n*           array AP as follows:\n*\n*              UPLO = 'U' or 'u'   The upper triangular part of A is\n*                                  supplied in AP.\n*\n*              UPLO = 'L' or 'l'   The lower triangular part of A is\n*                                  supplied in AP.\n*\n*           Unchanged on exit.\n*\n*  N      - INTEGER.\n*           On entry, N specifies the order of the matrix A.\n*           N must be at least zero.\n*           Unchanged on exit.\n*\n*  ALPHA  - COMPLEX         .\n*           On entry, ALPHA specifies the scalar alpha.\n*           Unchanged on exit.\n*\n*  AP     - COMPLEX          array of DIMENSION at least\n*           ( ( n*( n + 1 ) )/2 ).\n*           Before entry with UPLO = 'U' or 'u', the array AP must\n*           contain the upper triangular part of the hermitian matrix\n*           packed sequentially, column by column, so that AP( 1 )\n*           contains a( 1, 1 ), AP( 2 ) and AP( 3 ) contain a( 1, 2 )\n*           and a( 2, 2 ) respectively, and so on.\n*           Before entry with UPLO = 'L' or 'l', the array AP must\n*           contain the lower triangular part of the hermitian matrix\n*           packed sequentially, column by column, so that AP( 1 )\n*           contains a( 1, 1 ), AP( 2 ) and AP( 3 ) contain a( 2, 1 )\n*           and a( 3, 1 ) respectively, and so on.\n*           Note that the imaginary parts of the diagonal elements need\n*           not be set and are assumed to be zero.\n*           Unchanged on exit.\n*\n*  X      - COMPLEX          array of dimension at least\n*           ( 1 + ( n - 1 )*abs( INCX ) ).\n*           Before entry, the incremented array X must contain the n\n*           element vector x.\n*           Unchanged on exit.\n*\n*  INCX   - INTEGER.\n*           On entry, INCX specifies the increment for the elements of\n*           X. INCX must not be zero.\n*           Unchanged on exit.\n*\n*  BETA   - COMPLEX         .\n*           On entry, BETA specifies the scalar beta. When BETA is\n*           supplied as zero then Y need not be set on input.\n*           Unchanged on exit.\n*\n*  Y      - COMPLEX          array of dimension at least\n*           ( 1 + ( n - 1 )*abs( INCY ) ).\n*           Before entry, the incremented array Y must contain the n\n*           element vector y. On exit, Y is overwritten by the updated\n*           vector y.\n*\n*  INCY   - INTEGER.\n*           On entry, INCY specifies the increment for the elements of\n*           Y. INCY must not be zero.\n*           Unchanged on exit.\n*\n*  Further Details\n*  ===============\n*\n*  Level 2 Blas routine.\n*\n*  -- Written on 22-October-1986.\n*     Jack Dongarra, Argonne National Lab.\n*     Jeremy Du Croz, Nag Central Office.\n*     Sven Hammarling, Nag Central Office.\n*     Richard Hanson, Sandia National Labs.\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      COMPLEX ONE\n      PARAMETER (ONE= (1.0E+0,0.0E+0))\n      COMPLEX ZERO\n      PARAMETER (ZERO= (0.0E+0,0.0E+0))\n*     ..\n*     .. Local Scalars ..\n      COMPLEX TEMP1,TEMP2\n      INTEGER I,INFO,IX,IY,J,JX,JY,K,KK,KX,KY\n*     ..\n*     .. External Functions ..\n      LOGICAL LSAME\n      EXTERNAL LSAME\n*     ..\n*     .. External Subroutines ..\n      EXTERNAL XERBLA\n*     ..\n*     .. Intrinsic Functions ..\n      INTRINSIC CONJG,REAL\n*     ..\n*\n*     Test the input parameters.\n*\n      INFO = 0\n      IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN\n          INFO = 1\n      ELSE IF (N.LT.0) THEN\n          INFO = 2\n      ELSE IF (INCX.EQ.0) THEN\n          INFO = 6\n      ELSE IF (INCY.EQ.0) THEN\n          INFO = 9\n      END IF\n      IF (INFO.NE.0) THEN\n          CALL XERBLA('CHPMV ',INFO)\n          RETURN\n      END IF\n*\n*     Quick return if possible.\n*\n      IF ((N.EQ.0) .OR. ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN\n*\n*     Set up the start points in  X  and  Y.\n*\n      IF (INCX.GT.0) THEN\n          KX = 1\n      ELSE\n          KX = 1 - (N-1)*INCX\n      END IF\n      IF (INCY.GT.0) THEN\n          KY = 1\n      ELSE\n          KY = 1 - (N-1)*INCY\n      END IF\n*\n*     Start the operations. In this version the elements of the array AP\n*     are accessed sequentially with one pass through AP.\n*\n*     First form  y := beta*y.\n*\n      IF (BETA.NE.ONE) THEN\n          IF (INCY.EQ.1) THEN\n              IF (BETA.EQ.ZERO) THEN\n                  DO 10 I = 1,N\n                      Y(I) = ZERO\n   10             CONTINUE\n              ELSE\n                  DO 20 I = 1,N\n                      Y(I) = BETA*Y(I)\n   20             CONTINUE\n              END IF\n          ELSE\n              IY = KY\n              IF (BETA.EQ.ZERO) THEN\n                  DO 30 I = 1,N\n                      Y(IY) = ZERO\n                      IY = IY + INCY\n   30             CONTINUE\n              ELSE\n                  DO 40 I = 1,N\n                      Y(IY) = BETA*Y(IY)\n                      IY = IY + INCY\n   40             CONTINUE\n              END IF\n          END IF\n      END IF\n      IF (ALPHA.EQ.ZERO) RETURN\n      KK = 1\n      IF (LSAME(UPLO,'U')) THEN\n*\n*        Form  y  when AP contains the upper triangle.\n*\n          IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THEN\n              DO 60 J = 1,N\n                  TEMP1 = ALPHA*X(J)\n                  TEMP2 = ZERO\n                  K = KK\n                  DO 50 I = 1,J - 1\n                      Y(I) = Y(I) + TEMP1*AP(K)\n                      TEMP2 = TEMP2 + CONJG(AP(K))*X(I)\n                      K = K + 1\n   50             CONTINUE\n                  Y(J) = Y(J) + TEMP1*REAL(AP(KK+J-1)) + ALPHA*TEMP2\n                  KK = KK + J\n   60         CONTINUE\n          ELSE\n              JX = KX\n              JY = KY\n              DO 80 J = 1,N\n                  TEMP1 = ALPHA*X(JX)\n                  TEMP2 = ZERO\n                  IX = KX\n                  IY = KY\n                  DO 70 K = KK,KK + J - 2\n                      Y(IY) = Y(IY) + TEMP1*AP(K)\n                      TEMP2 = TEMP2 + CONJG(AP(K))*X(IX)\n                      IX = IX + INCX\n                      IY = IY + INCY\n   70             CONTINUE\n                  Y(JY) = Y(JY) + TEMP1*REAL(AP(KK+J-1)) + ALPHA*TEMP2\n                  JX = JX + INCX\n                  JY = JY + INCY\n                  KK = KK + J\n   80         CONTINUE\n          END IF\n      ELSE\n*\n*        Form  y  when AP contains the lower triangle.\n*\n          IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THEN\n              DO 100 J = 1,N\n                  TEMP1 = ALPHA*X(J)\n                  TEMP2 = ZERO\n                  Y(J) = Y(J) + TEMP1*REAL(AP(KK))\n                  K = KK + 1\n                  DO 90 I = J + 1,N\n                      Y(I) = Y(I) + TEMP1*AP(K)\n                      TEMP2 = TEMP2 + CONJG(AP(K))*X(I)\n                      K = K + 1\n   90             CONTINUE\n                  Y(J) = Y(J) + ALPHA*TEMP2\n                  KK = KK + (N-J+1)\n  100         CONTINUE\n          ELSE\n              JX = KX\n              JY = KY\n              DO 120 J = 1,N\n                  TEMP1 = ALPHA*X(JX)\n                  TEMP2 = ZERO\n                  Y(JY) = Y(JY) + TEMP1*REAL(AP(KK))\n                  IX = JX\n                  IY = JY\n                  DO 110 K = KK + 1,KK + N - J\n                      IX = IX + INCX\n                      IY = IY + INCY\n                      Y(IY) = Y(IY) + TEMP1*AP(K)\n                      TEMP2 = TEMP2 + CONJG(AP(K))*X(IX)\n  110             CONTINUE\n                  Y(JY) = Y(JY) + ALPHA*TEMP2\n                  JX = JX + INCX\n                  JY = JY + INCY\n                  KK = KK + (N-J+1)\n  120         CONTINUE\n          END IF\n      END IF\n*\n      RETURN\n*\n*     End of CHPMV .\n*\n      END\n"
  },
  {
    "path": "libs/eigen/blas/common.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_BLAS_COMMON_H\n#define EIGEN_BLAS_COMMON_H\n\n#include <Eigen/Core>\n#include <Eigen/Jacobi>\n\n#include <iostream>\n#include <complex>\n\n#ifndef SCALAR\n#error the token SCALAR must be defined to compile this file\n#endif\n\n#include <Eigen/src/misc/blas.h>\n\n\n#define NOTR    0\n#define TR      1\n#define ADJ     2\n\n#define LEFT    0\n#define RIGHT   1\n\n#define UP      0\n#define LO      1\n\n#define NUNIT   0\n#define UNIT    1\n\n#define INVALID 0xff\n\n#define OP(X)   (   ((X)=='N' || (X)=='n') ? NOTR   \\\n                  : ((X)=='T' || (X)=='t') ? TR     \\\n                  : ((X)=='C' || (X)=='c') ? ADJ    \\\n                  : INVALID)\n\n#define SIDE(X) (   ((X)=='L' || (X)=='l') ? LEFT   \\\n                  : ((X)=='R' || (X)=='r') ? RIGHT  \\\n                  : INVALID)\n\n#define UPLO(X) (   ((X)=='U' || (X)=='u') ? UP     \\\n                  : ((X)=='L' || (X)=='l') ? LO     \\\n                  : INVALID)\n\n#define DIAG(X) (   ((X)=='N' || (X)=='n') ? NUNIT  \\\n                  : ((X)=='U' || (X)=='u') ? UNIT   \\\n                  : INVALID)\n\n\ninline bool check_op(const char* op)\n{\n  return OP(*op)!=0xff;\n}\n\ninline bool check_side(const char* side)\n{\n  return SIDE(*side)!=0xff;\n}\n\ninline bool check_uplo(const char* uplo)\n{\n  return UPLO(*uplo)!=0xff;\n}\n\n\nnamespace Eigen {\n#include \"BandTriangularSolver.h\"\n#include \"GeneralRank1Update.h\"\n#include \"PackedSelfadjointProduct.h\"\n#include \"PackedTriangularMatrixVector.h\"\n#include \"PackedTriangularSolverVector.h\"\n#include \"Rank2Update.h\"\n}\n\nusing namespace Eigen;\n\ntypedef SCALAR Scalar;\ntypedef NumTraits<Scalar>::Real RealScalar;\ntypedef std::complex<RealScalar> Complex;\n\nenum\n{\n  IsComplex = Eigen::NumTraits<SCALAR>::IsComplex,\n  Conj = IsComplex\n};\n\ntypedef Matrix<Scalar,Dynamic,Dynamic,ColMajor> PlainMatrixType;\ntypedef Map<Matrix<Scalar,Dynamic,Dynamic,ColMajor>, 0, OuterStride<> > MatrixType;\ntypedef Map<Matrix<Scalar,Dynamic,1>, 0, InnerStride<Dynamic> > StridedVectorType;\ntypedef Map<Matrix<Scalar,Dynamic,1> > CompactVectorType;\n\ntemplate<typename T>\nMap<Matrix<T,Dynamic,Dynamic,ColMajor>, 0, OuterStride<> >\nmatrix(T* data, int rows, int cols, int stride)\n{\n  return Map<Matrix<T,Dynamic,Dynamic,ColMajor>, 0, OuterStride<> >(data, rows, cols, OuterStride<>(stride));\n}\n\ntemplate<typename T>\nMap<Matrix<T,Dynamic,1>, 0, InnerStride<Dynamic> > vector(T* data, int size, int incr)\n{\n  return Map<Matrix<T,Dynamic,1>, 0, InnerStride<Dynamic> >(data, size, InnerStride<Dynamic>(incr));\n}\n\ntemplate<typename T>\nMap<Matrix<T,Dynamic,1> > vector(T* data, int size)\n{\n  return Map<Matrix<T,Dynamic,1> >(data, size);\n}\n\ntemplate<typename T>\nT* get_compact_vector(T* x, int n, int incx)\n{\n  if(incx==1)\n    return x;\n\n  T* ret = new Scalar[n];\n  if(incx<0) vector(ret,n) = vector(x,n,-incx).reverse();\n  else       vector(ret,n) = vector(x,n, incx);\n  return ret;\n}\n\ntemplate<typename T>\nT* copy_back(T* x_cpy, T* x, int n, int incx)\n{\n  if(x_cpy==x)\n    return 0;\n\n  if(incx<0) vector(x,n,-incx).reverse() = vector(x_cpy,n);\n  else       vector(x,n, incx)           = vector(x_cpy,n);\n  return x_cpy;\n}\n\n#define EIGEN_BLAS_FUNC(X) EIGEN_CAT(SCALAR_SUFFIX,X##_)\n\n#endif // EIGEN_BLAS_COMMON_H\n"
  },
  {
    "path": "libs/eigen/blas/complex_double.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#define SCALAR        std::complex<double>\n#define SCALAR_SUFFIX z\n#define SCALAR_SUFFIX_UP \"Z\"\n#define REAL_SCALAR_SUFFIX d\n#define ISCOMPLEX     1\n\n#include \"level1_impl.h\"\n#include \"level1_cplx_impl.h\"\n#include \"level2_impl.h\"\n#include \"level2_cplx_impl.h\"\n#include \"level3_impl.h\"\n"
  },
  {
    "path": "libs/eigen/blas/complex_single.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#define SCALAR        std::complex<float>\n#define SCALAR_SUFFIX c\n#define SCALAR_SUFFIX_UP \"C\"\n#define REAL_SCALAR_SUFFIX s\n#define ISCOMPLEX     1\n\n#include \"level1_impl.h\"\n#include \"level1_cplx_impl.h\"\n#include \"level2_impl.h\"\n#include \"level2_cplx_impl.h\"\n#include \"level3_impl.h\"\n"
  },
  {
    "path": "libs/eigen/blas/complexdots.f",
    "content": "      COMPLEX FUNCTION CDOTC(N,CX,INCX,CY,INCY)\n      INTEGER INCX,INCY,N\n      COMPLEX CX(*),CY(*)\n      COMPLEX RES\n      EXTERNAL CDOTCW\n      \n      CALL CDOTCW(N,CX,INCX,CY,INCY,RES)\n      CDOTC = RES\n      RETURN\n      END\n      \n      COMPLEX FUNCTION CDOTU(N,CX,INCX,CY,INCY)\n      INTEGER INCX,INCY,N\n      COMPLEX CX(*),CY(*)\n      COMPLEX RES\n      EXTERNAL CDOTUW\n      \n      CALL CDOTUW(N,CX,INCX,CY,INCY,RES)\n      CDOTU = RES\n      RETURN\n      END\n      \n      DOUBLE COMPLEX FUNCTION ZDOTC(N,CX,INCX,CY,INCY)\n      INTEGER INCX,INCY,N\n      DOUBLE COMPLEX CX(*),CY(*)\n      DOUBLE COMPLEX RES\n      EXTERNAL ZDOTCW\n      \n      CALL ZDOTCW(N,CX,INCX,CY,INCY,RES)\n      ZDOTC = RES\n      RETURN\n      END\n      \n      DOUBLE COMPLEX FUNCTION ZDOTU(N,CX,INCX,CY,INCY)\n      INTEGER INCX,INCY,N\n      DOUBLE COMPLEX CX(*),CY(*)\n      DOUBLE COMPLEX RES\n      EXTERNAL ZDOTUW\n      \n      CALL ZDOTUW(N,CX,INCX,CY,INCY,RES)\n      ZDOTU = RES\n      RETURN\n      END\n"
  },
  {
    "path": "libs/eigen/blas/ctbmv.f",
    "content": "      SUBROUTINE CTBMV(UPLO,TRANS,DIAG,N,K,A,LDA,X,INCX)\n*     .. Scalar Arguments ..\n      INTEGER INCX,K,LDA,N\n      CHARACTER DIAG,TRANS,UPLO\n*     ..\n*     .. Array Arguments ..\n      COMPLEX A(LDA,*),X(*)\n*     ..\n*\n*  Purpose\n*  =======\n*\n*  CTBMV  performs one of the matrix-vector operations\n*\n*     x := A*x,   or   x := A'*x,   or   x := conjg( A' )*x,\n*\n*  where x is an n element vector and  A is an n by n unit, or non-unit,\n*  upper or lower triangular band matrix, with ( k + 1 ) diagonals.\n*\n*  Arguments\n*  ==========\n*\n*  UPLO   - CHARACTER*1.\n*           On entry, UPLO specifies whether the matrix is an upper or\n*           lower triangular matrix as follows:\n*\n*              UPLO = 'U' or 'u'   A is an upper triangular matrix.\n*\n*              UPLO = 'L' or 'l'   A is a lower triangular matrix.\n*\n*           Unchanged on exit.\n*\n*  TRANS  - CHARACTER*1.\n*           On entry, TRANS specifies the operation to be performed as\n*           follows:\n*\n*              TRANS = 'N' or 'n'   x := A*x.\n*\n*              TRANS = 'T' or 't'   x := A'*x.\n*\n*              TRANS = 'C' or 'c'   x := conjg( A' )*x.\n*\n*           Unchanged on exit.\n*\n*  DIAG   - CHARACTER*1.\n*           On entry, DIAG specifies whether or not A is unit\n*           triangular as follows:\n*\n*              DIAG = 'U' or 'u'   A is assumed to be unit triangular.\n*\n*              DIAG = 'N' or 'n'   A is not assumed to be unit\n*                                  triangular.\n*\n*           Unchanged on exit.\n*\n*  N      - INTEGER.\n*           On entry, N specifies the order of the matrix A.\n*           N must be at least zero.\n*           Unchanged on exit.\n*\n*  K      - INTEGER.\n*           On entry with UPLO = 'U' or 'u', K specifies the number of\n*           super-diagonals of the matrix A.\n*           On entry with UPLO = 'L' or 'l', K specifies the number of\n*           sub-diagonals of the matrix A.\n*           K must satisfy  0 .le. K.\n*           Unchanged on exit.\n*\n*  A      - COMPLEX          array of DIMENSION ( LDA, n ).\n*           Before entry with UPLO = 'U' or 'u', the leading ( k + 1 )\n*           by n part of the array A must contain the upper triangular\n*           band part of the matrix of coefficients, supplied column by\n*           column, with the leading diagonal of the matrix in row\n*           ( k + 1 ) of the array, the first super-diagonal starting at\n*           position 2 in row k, and so on. The top left k by k triangle\n*           of the array A is not referenced.\n*           The following program segment will transfer an upper\n*           triangular band matrix from conventional full matrix storage\n*           to band storage:\n*\n*                 DO 20, J = 1, N\n*                    M = K + 1 - J\n*                    DO 10, I = MAX( 1, J - K ), J\n*                       A( M + I, J ) = matrix( I, J )\n*              10    CONTINUE\n*              20 CONTINUE\n*\n*           Before entry with UPLO = 'L' or 'l', the leading ( k + 1 )\n*           by n part of the array A must contain the lower triangular\n*           band part of the matrix of coefficients, supplied column by\n*           column, with the leading diagonal of the matrix in row 1 of\n*           the array, the first sub-diagonal starting at position 1 in\n*           row 2, and so on. The bottom right k by k triangle of the\n*           array A is not referenced.\n*           The following program segment will transfer a lower\n*           triangular band matrix from conventional full matrix storage\n*           to band storage:\n*\n*                 DO 20, J = 1, N\n*                    M = 1 - J\n*                    DO 10, I = J, MIN( N, J + K )\n*                       A( M + I, J ) = matrix( I, J )\n*              10    CONTINUE\n*              20 CONTINUE\n*\n*           Note that when DIAG = 'U' or 'u' the elements of the array A\n*           corresponding to the diagonal elements of the matrix are not\n*           referenced, but are assumed to be unity.\n*           Unchanged on exit.\n*\n*  LDA    - INTEGER.\n*           On entry, LDA specifies the first dimension of A as declared\n*           in the calling (sub) program. LDA must be at least\n*           ( k + 1 ).\n*           Unchanged on exit.\n*\n*  X      - COMPLEX          array of dimension at least\n*           ( 1 + ( n - 1 )*abs( INCX ) ).\n*           Before entry, the incremented array X must contain the n\n*           element vector x. On exit, X is overwritten with the\n*           tranformed vector x.\n*\n*  INCX   - INTEGER.\n*           On entry, INCX specifies the increment for the elements of\n*           X. INCX must not be zero.\n*           Unchanged on exit.\n*\n*  Further Details\n*  ===============\n*\n*  Level 2 Blas routine.\n*\n*  -- Written on 22-October-1986.\n*     Jack Dongarra, Argonne National Lab.\n*     Jeremy Du Croz, Nag Central Office.\n*     Sven Hammarling, Nag Central Office.\n*     Richard Hanson, Sandia National Labs.\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      COMPLEX ZERO\n      PARAMETER (ZERO= (0.0E+0,0.0E+0))\n*     ..\n*     .. Local Scalars ..\n      COMPLEX TEMP\n      INTEGER I,INFO,IX,J,JX,KPLUS1,KX,L\n      LOGICAL NOCONJ,NOUNIT\n*     ..\n*     .. External Functions ..\n      LOGICAL LSAME\n      EXTERNAL LSAME\n*     ..\n*     .. External Subroutines ..\n      EXTERNAL XERBLA\n*     ..\n*     .. Intrinsic Functions ..\n      INTRINSIC CONJG,MAX,MIN\n*     ..\n*\n*     Test the input parameters.\n*\n      INFO = 0\n      IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN\n          INFO = 1\n      ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND.\n     +         .NOT.LSAME(TRANS,'C')) THEN\n          INFO = 2\n      ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN\n          INFO = 3\n      ELSE IF (N.LT.0) THEN\n          INFO = 4\n      ELSE IF (K.LT.0) THEN\n          INFO = 5\n      ELSE IF (LDA.LT. (K+1)) THEN\n          INFO = 7\n      ELSE IF (INCX.EQ.0) THEN\n          INFO = 9\n      END IF\n      IF (INFO.NE.0) THEN\n          CALL XERBLA('CTBMV ',INFO)\n          RETURN\n      END IF\n*\n*     Quick return if possible.\n*\n      IF (N.EQ.0) RETURN\n*\n      NOCONJ = LSAME(TRANS,'T')\n      NOUNIT = LSAME(DIAG,'N')\n*\n*     Set up the start point in X if the increment is not unity. This\n*     will be  ( N - 1 )*INCX   too small for descending loops.\n*\n      IF (INCX.LE.0) THEN\n          KX = 1 - (N-1)*INCX\n      ELSE IF (INCX.NE.1) THEN\n          KX = 1\n      END IF\n*\n*     Start the operations. In this version the elements of A are\n*     accessed sequentially with one pass through A.\n*\n      IF (LSAME(TRANS,'N')) THEN\n*\n*         Form  x := A*x.\n*\n          IF (LSAME(UPLO,'U')) THEN\n              KPLUS1 = K + 1\n              IF (INCX.EQ.1) THEN\n                  DO 20 J = 1,N\n                      IF (X(J).NE.ZERO) THEN\n                          TEMP = X(J)\n                          L = KPLUS1 - J\n                          DO 10 I = MAX(1,J-K),J - 1\n                              X(I) = X(I) + TEMP*A(L+I,J)\n   10                     CONTINUE\n                          IF (NOUNIT) X(J) = X(J)*A(KPLUS1,J)\n                      END IF\n   20             CONTINUE\n              ELSE\n                  JX = KX\n                  DO 40 J = 1,N\n                      IF (X(JX).NE.ZERO) THEN\n                          TEMP = X(JX)\n                          IX = KX\n                          L = KPLUS1 - J\n                          DO 30 I = MAX(1,J-K),J - 1\n                              X(IX) = X(IX) + TEMP*A(L+I,J)\n                              IX = IX + INCX\n   30                     CONTINUE\n                          IF (NOUNIT) X(JX) = X(JX)*A(KPLUS1,J)\n                      END IF\n                      JX = JX + INCX\n                      IF (J.GT.K) KX = KX + INCX\n   40             CONTINUE\n              END IF\n          ELSE\n              IF (INCX.EQ.1) THEN\n                  DO 60 J = N,1,-1\n                      IF (X(J).NE.ZERO) THEN\n                          TEMP = X(J)\n                          L = 1 - J\n                          DO 50 I = MIN(N,J+K),J + 1,-1\n                              X(I) = X(I) + TEMP*A(L+I,J)\n   50                     CONTINUE\n                          IF (NOUNIT) X(J) = X(J)*A(1,J)\n                      END IF\n   60             CONTINUE\n              ELSE\n                  KX = KX + (N-1)*INCX\n                  JX = KX\n                  DO 80 J = N,1,-1\n                      IF (X(JX).NE.ZERO) THEN\n                          TEMP = X(JX)\n                          IX = KX\n                          L = 1 - J\n                          DO 70 I = MIN(N,J+K),J + 1,-1\n                              X(IX) = X(IX) + TEMP*A(L+I,J)\n                              IX = IX - INCX\n   70                     CONTINUE\n                          IF (NOUNIT) X(JX) = X(JX)*A(1,J)\n                      END IF\n                      JX = JX - INCX\n                      IF ((N-J).GE.K) KX = KX - INCX\n   80             CONTINUE\n              END IF\n          END IF\n      ELSE\n*\n*        Form  x := A'*x  or  x := conjg( A' )*x.\n*\n          IF (LSAME(UPLO,'U')) THEN\n              KPLUS1 = K + 1\n              IF (INCX.EQ.1) THEN\n                  DO 110 J = N,1,-1\n                      TEMP = X(J)\n                      L = KPLUS1 - J\n                      IF (NOCONJ) THEN\n                          IF (NOUNIT) TEMP = TEMP*A(KPLUS1,J)\n                          DO 90 I = J - 1,MAX(1,J-K),-1\n                              TEMP = TEMP + A(L+I,J)*X(I)\n   90                     CONTINUE\n                      ELSE\n                          IF (NOUNIT) TEMP = TEMP*CONJG(A(KPLUS1,J))\n                          DO 100 I = J - 1,MAX(1,J-K),-1\n                              TEMP = TEMP + CONJG(A(L+I,J))*X(I)\n  100                     CONTINUE\n                      END IF\n                      X(J) = TEMP\n  110             CONTINUE\n              ELSE\n                  KX = KX + (N-1)*INCX\n                  JX = KX\n                  DO 140 J = N,1,-1\n                      TEMP = X(JX)\n                      KX = KX - INCX\n                      IX = KX\n                      L = KPLUS1 - J\n                      IF (NOCONJ) THEN\n                          IF (NOUNIT) TEMP = TEMP*A(KPLUS1,J)\n                          DO 120 I = J - 1,MAX(1,J-K),-1\n                              TEMP = TEMP + A(L+I,J)*X(IX)\n                              IX = IX - INCX\n  120                     CONTINUE\n                      ELSE\n                          IF (NOUNIT) TEMP = TEMP*CONJG(A(KPLUS1,J))\n                          DO 130 I = J - 1,MAX(1,J-K),-1\n                              TEMP = TEMP + CONJG(A(L+I,J))*X(IX)\n                              IX = IX - INCX\n  130                     CONTINUE\n                      END IF\n                      X(JX) = TEMP\n                      JX = JX - INCX\n  140             CONTINUE\n              END IF\n          ELSE\n              IF (INCX.EQ.1) THEN\n                  DO 170 J = 1,N\n                      TEMP = X(J)\n                      L = 1 - J\n                      IF (NOCONJ) THEN\n                          IF (NOUNIT) TEMP = TEMP*A(1,J)\n                          DO 150 I = J + 1,MIN(N,J+K)\n                              TEMP = TEMP + A(L+I,J)*X(I)\n  150                     CONTINUE\n                      ELSE\n                          IF (NOUNIT) TEMP = TEMP*CONJG(A(1,J))\n                          DO 160 I = J + 1,MIN(N,J+K)\n                              TEMP = TEMP + CONJG(A(L+I,J))*X(I)\n  160                     CONTINUE\n                      END IF\n                      X(J) = TEMP\n  170             CONTINUE\n              ELSE\n                  JX = KX\n                  DO 200 J = 1,N\n                      TEMP = X(JX)\n                      KX = KX + INCX\n                      IX = KX\n                      L = 1 - J\n                      IF (NOCONJ) THEN\n                          IF (NOUNIT) TEMP = TEMP*A(1,J)\n                          DO 180 I = J + 1,MIN(N,J+K)\n                              TEMP = TEMP + A(L+I,J)*X(IX)\n                              IX = IX + INCX\n  180                     CONTINUE\n                      ELSE\n                          IF (NOUNIT) TEMP = TEMP*CONJG(A(1,J))\n                          DO 190 I = J + 1,MIN(N,J+K)\n                              TEMP = TEMP + CONJG(A(L+I,J))*X(IX)\n                              IX = IX + INCX\n  190                     CONTINUE\n                      END IF\n                      X(JX) = TEMP\n                      JX = JX + INCX\n  200             CONTINUE\n              END IF\n          END IF\n      END IF\n*\n      RETURN\n*\n*     End of CTBMV .\n*\n      END\n"
  },
  {
    "path": "libs/eigen/blas/double.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2012 Chen-Pang He <jdh8@ms63.hinet.net>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#define SCALAR        double\n#define SCALAR_SUFFIX d\n#define SCALAR_SUFFIX_UP \"D\"\n#define ISCOMPLEX     0\n\n#include \"level1_impl.h\"\n#include \"level1_real_impl.h\"\n#include \"level2_impl.h\"\n#include \"level2_real_impl.h\"\n#include \"level3_impl.h\"\n\ndouble BLASFUNC(dsdot)(int* n, float* x, int* incx, float* y, int* incy)\n{\n  if(*n<=0) return 0;\n\n  if(*incx==1 && *incy==1)    return (vector(x,*n).cast<double>().cwiseProduct(vector(y,*n).cast<double>())).sum();\n  else if(*incx>0 && *incy>0) return (vector(x,*n,*incx).cast<double>().cwiseProduct(vector(y,*n,*incy).cast<double>())).sum();\n  else if(*incx<0 && *incy>0) return (vector(x,*n,-*incx).reverse().cast<double>().cwiseProduct(vector(y,*n,*incy).cast<double>())).sum();\n  else if(*incx>0 && *incy<0) return (vector(x,*n,*incx).cast<double>().cwiseProduct(vector(y,*n,-*incy).reverse().cast<double>())).sum();\n  else if(*incx<0 && *incy<0) return (vector(x,*n,-*incx).reverse().cast<double>().cwiseProduct(vector(y,*n,-*incy).reverse().cast<double>())).sum();\n  else return 0;\n}\n\n"
  },
  {
    "path": "libs/eigen/blas/drotm.f",
    "content": "      SUBROUTINE DROTM(N,DX,INCX,DY,INCY,DPARAM)\n*     .. Scalar Arguments ..\n      INTEGER INCX,INCY,N\n*     ..\n*     .. Array Arguments ..\n      DOUBLE PRECISION DPARAM(5),DX(*),DY(*)\n*     ..\n*\n*  Purpose\n*  =======\n*\n*     APPLY THE MODIFIED GIVENS TRANSFORMATION, H, TO THE 2 BY N MATRIX\n*\n*     (DX**T) , WHERE **T INDICATES TRANSPOSE. THE ELEMENTS OF DX ARE IN\n*     (DY**T)\n*\n*     DX(LX+I*INCX), I = 0 TO N-1, WHERE LX = 1 IF INCX .GE. 0, ELSE\n*     LX = (-INCX)*N, AND SIMILARLY FOR SY USING LY AND INCY.\n*     WITH DPARAM(1)=DFLAG, H HAS ONE OF THE FOLLOWING FORMS..\n*\n*     DFLAG=-1.D0     DFLAG=0.D0        DFLAG=1.D0     DFLAG=-2.D0\n*\n*       (DH11  DH12)    (1.D0  DH12)    (DH11  1.D0)    (1.D0  0.D0)\n*     H=(          )    (          )    (          )    (          )\n*       (DH21  DH22),   (DH21  1.D0),   (-1.D0 DH22),   (0.D0  1.D0).\n*     SEE DROTMG FOR A DESCRIPTION OF DATA STORAGE IN DPARAM.\n*\n*  Arguments\n*  =========\n*\n*  N      (input) INTEGER\n*         number of elements in input vector(s)\n*\n*  DX     (input/output) DOUBLE PRECISION array, dimension N\n*         double precision vector with N elements\n*\n*  INCX   (input) INTEGER\n*         storage spacing between elements of DX\n*\n*  DY     (input/output) DOUBLE PRECISION array, dimension N\n*         double precision vector with N elements\n*\n*  INCY   (input) INTEGER\n*         storage spacing between elements of DY\n*\n*  DPARAM (input/output)  DOUBLE PRECISION array, dimension 5 \n*     DPARAM(1)=DFLAG\n*     DPARAM(2)=DH11\n*     DPARAM(3)=DH21\n*     DPARAM(4)=DH12\n*     DPARAM(5)=DH22\n*\n*  =====================================================================\n*\n*     .. Local Scalars ..\n      DOUBLE PRECISION DFLAG,DH11,DH12,DH21,DH22,TWO,W,Z,ZERO\n      INTEGER I,KX,KY,NSTEPS\n*     ..\n*     .. Data statements ..\n      DATA ZERO,TWO/0.D0,2.D0/\n*     ..\n*\n      DFLAG = DPARAM(1)\n      IF (N.LE.0 .OR. (DFLAG+TWO.EQ.ZERO)) GO TO 140\n      IF (.NOT. (INCX.EQ.INCY.AND.INCX.GT.0)) GO TO 70\n*\n      NSTEPS = N*INCX\n      IF (DFLAG) 50,10,30\n   10 CONTINUE\n      DH12 = DPARAM(4)\n      DH21 = DPARAM(3)\n      DO 20 I = 1,NSTEPS,INCX\n          W = DX(I)\n          Z = DY(I)\n          DX(I) = W + Z*DH12\n          DY(I) = W*DH21 + Z\n   20 CONTINUE\n      GO TO 140\n   30 CONTINUE\n      DH11 = DPARAM(2)\n      DH22 = DPARAM(5)\n      DO 40 I = 1,NSTEPS,INCX\n          W = DX(I)\n          Z = DY(I)\n          DX(I) = W*DH11 + Z\n          DY(I) = -W + DH22*Z\n   40 CONTINUE\n      GO TO 140\n   50 CONTINUE\n      DH11 = DPARAM(2)\n      DH12 = DPARAM(4)\n      DH21 = DPARAM(3)\n      DH22 = DPARAM(5)\n      DO 60 I = 1,NSTEPS,INCX\n          W = DX(I)\n          Z = DY(I)\n          DX(I) = W*DH11 + Z*DH12\n          DY(I) = W*DH21 + Z*DH22\n   60 CONTINUE\n      GO TO 140\n   70 CONTINUE\n      KX = 1\n      KY = 1\n      IF (INCX.LT.0) KX = 1 + (1-N)*INCX\n      IF (INCY.LT.0) KY = 1 + (1-N)*INCY\n*\n      IF (DFLAG) 120,80,100\n   80 CONTINUE\n      DH12 = DPARAM(4)\n      DH21 = DPARAM(3)\n      DO 90 I = 1,N\n          W = DX(KX)\n          Z = DY(KY)\n          DX(KX) = W + Z*DH12\n          DY(KY) = W*DH21 + Z\n          KX = KX + INCX\n          KY = KY + INCY\n   90 CONTINUE\n      GO TO 140\n  100 CONTINUE\n      DH11 = DPARAM(2)\n      DH22 = DPARAM(5)\n      DO 110 I = 1,N\n          W = DX(KX)\n          Z = DY(KY)\n          DX(KX) = W*DH11 + Z\n          DY(KY) = -W + DH22*Z\n          KX = KX + INCX\n          KY = KY + INCY\n  110 CONTINUE\n      GO TO 140\n  120 CONTINUE\n      DH11 = DPARAM(2)\n      DH12 = DPARAM(4)\n      DH21 = DPARAM(3)\n      DH22 = DPARAM(5)\n      DO 130 I = 1,N\n          W = DX(KX)\n          Z = DY(KY)\n          DX(KX) = W*DH11 + Z*DH12\n          DY(KY) = W*DH21 + Z*DH22\n          KX = KX + INCX\n          KY = KY + INCY\n  130 CONTINUE\n  140 CONTINUE\n      RETURN\n      END\n"
  },
  {
    "path": "libs/eigen/blas/drotmg.f",
    "content": "      SUBROUTINE DROTMG(DD1,DD2,DX1,DY1,DPARAM)\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION DD1,DD2,DX1,DY1\n*     ..\n*     .. Array Arguments ..\n      DOUBLE PRECISION DPARAM(5)\n*     ..\n*\n*  Purpose\n*  =======\n*\n*     CONSTRUCT THE MODIFIED GIVENS TRANSFORMATION MATRIX H WHICH ZEROS\n*     THE SECOND COMPONENT OF THE 2-VECTOR  (DSQRT(DD1)*DX1,DSQRT(DD2)*\n*     DY2)**T.\n*     WITH DPARAM(1)=DFLAG, H HAS ONE OF THE FOLLOWING FORMS..\n*\n*     DFLAG=-1.D0     DFLAG=0.D0        DFLAG=1.D0     DFLAG=-2.D0\n*\n*       (DH11  DH12)    (1.D0  DH12)    (DH11  1.D0)    (1.D0  0.D0)\n*     H=(          )    (          )    (          )    (          )\n*       (DH21  DH22),   (DH21  1.D0),   (-1.D0 DH22),   (0.D0  1.D0).\n*     LOCATIONS 2-4 OF DPARAM CONTAIN DH11, DH21, DH12, AND DH22\n*     RESPECTIVELY. (VALUES OF 1.D0, -1.D0, OR 0.D0 IMPLIED BY THE\n*     VALUE OF DPARAM(1) ARE NOT STORED IN DPARAM.)\n*\n*     THE VALUES OF GAMSQ AND RGAMSQ SET IN THE DATA STATEMENT MAY BE\n*     INEXACT.  THIS IS OK AS THEY ARE ONLY USED FOR TESTING THE SIZE\n*     OF DD1 AND DD2.  ALL ACTUAL SCALING OF DATA IS DONE USING GAM.\n*\n*\n*  Arguments\n*  =========\n*\n*  DD1    (input/output) DOUBLE PRECISION\n*\n*  DD2    (input/output) DOUBLE PRECISION \n*\n*  DX1    (input/output) DOUBLE PRECISION \n*\n*  DY1    (input) DOUBLE PRECISION\n*\n*  DPARAM (input/output)  DOUBLE PRECISION array, dimension 5\n*     DPARAM(1)=DFLAG\n*     DPARAM(2)=DH11\n*     DPARAM(3)=DH21\n*     DPARAM(4)=DH12\n*     DPARAM(5)=DH22\n*\n*  =====================================================================\n*\n*     .. Local Scalars ..\n      DOUBLE PRECISION DFLAG,DH11,DH12,DH21,DH22,DP1,DP2,DQ1,DQ2,DTEMP,\n     +                 DU,GAM,GAMSQ,ONE,RGAMSQ,TWO,ZERO\n      INTEGER IGO\n*     ..\n*     .. Intrinsic Functions ..\n      INTRINSIC DABS\n*     ..\n*     .. Data statements ..\n*\n      DATA ZERO,ONE,TWO/0.D0,1.D0,2.D0/\n      DATA GAM,GAMSQ,RGAMSQ/4096.D0,16777216.D0,5.9604645D-8/\n*     ..\n\n      IF (.NOT.DD1.LT.ZERO) GO TO 10\n*       GO ZERO-H-D-AND-DX1..\n      GO TO 60\n   10 CONTINUE\n*     CASE-DD1-NONNEGATIVE\n      DP2 = DD2*DY1\n      IF (.NOT.DP2.EQ.ZERO) GO TO 20\n      DFLAG = -TWO\n      GO TO 260\n*     REGULAR-CASE..\n   20 CONTINUE\n      DP1 = DD1*DX1\n      DQ2 = DP2*DY1\n      DQ1 = DP1*DX1\n*\n      IF (.NOT.DABS(DQ1).GT.DABS(DQ2)) GO TO 40\n      DH21 = -DY1/DX1\n      DH12 = DP2/DP1\n*\n      DU = ONE - DH12*DH21\n*\n      IF (.NOT.DU.LE.ZERO) GO TO 30\n*         GO ZERO-H-D-AND-DX1..\n      GO TO 60\n   30 CONTINUE\n      DFLAG = ZERO\n      DD1 = DD1/DU\n      DD2 = DD2/DU\n      DX1 = DX1*DU\n*         GO SCALE-CHECK..\n      GO TO 100\n   40 CONTINUE\n      IF (.NOT.DQ2.LT.ZERO) GO TO 50\n*         GO ZERO-H-D-AND-DX1..\n      GO TO 60\n   50 CONTINUE\n      DFLAG = ONE\n      DH11 = DP1/DP2\n      DH22 = DX1/DY1\n      DU = ONE + DH11*DH22\n      DTEMP = DD2/DU\n      DD2 = DD1/DU\n      DD1 = DTEMP\n      DX1 = DY1*DU\n*         GO SCALE-CHECK\n      GO TO 100\n*     PROCEDURE..ZERO-H-D-AND-DX1..\n   60 CONTINUE\n      DFLAG = -ONE\n      DH11 = ZERO\n      DH12 = ZERO\n      DH21 = ZERO\n      DH22 = ZERO\n*\n      DD1 = ZERO\n      DD2 = ZERO\n      DX1 = ZERO\n*         RETURN..\n      GO TO 220\n*     PROCEDURE..FIX-H..\n   70 CONTINUE\n      IF (.NOT.DFLAG.GE.ZERO) GO TO 90\n*\n      IF (.NOT.DFLAG.EQ.ZERO) GO TO 80\n      DH11 = ONE\n      DH22 = ONE\n      DFLAG = -ONE\n      GO TO 90\n   80 CONTINUE\n      DH21 = -ONE\n      DH12 = ONE\n      DFLAG = -ONE\n   90 CONTINUE\n      GO TO IGO(120,150,180,210)\n*     PROCEDURE..SCALE-CHECK\n  100 CONTINUE\n  110 CONTINUE\n      IF (.NOT.DD1.LE.RGAMSQ) GO TO 130\n      IF (DD1.EQ.ZERO) GO TO 160\n      ASSIGN 120 TO IGO\n*              FIX-H..\n      GO TO 70\n  120 CONTINUE\n      DD1 = DD1*GAM**2\n      DX1 = DX1/GAM\n      DH11 = DH11/GAM\n      DH12 = DH12/GAM\n      GO TO 110\n  130 CONTINUE\n  140 CONTINUE\n      IF (.NOT.DD1.GE.GAMSQ) GO TO 160\n      ASSIGN 150 TO IGO\n*              FIX-H..\n      GO TO 70\n  150 CONTINUE\n      DD1 = DD1/GAM**2\n      DX1 = DX1*GAM\n      DH11 = DH11*GAM\n      DH12 = DH12*GAM\n      GO TO 140\n  160 CONTINUE\n  170 CONTINUE\n      IF (.NOT.DABS(DD2).LE.RGAMSQ) GO TO 190\n      IF (DD2.EQ.ZERO) GO TO 220\n      ASSIGN 180 TO IGO\n*              FIX-H..\n      GO TO 70\n  180 CONTINUE\n      DD2 = DD2*GAM**2\n      DH21 = DH21/GAM\n      DH22 = DH22/GAM\n      GO TO 170\n  190 CONTINUE\n  200 CONTINUE\n      IF (.NOT.DABS(DD2).GE.GAMSQ) GO TO 220\n      ASSIGN 210 TO IGO\n*              FIX-H..\n      GO TO 70\n  210 CONTINUE\n      DD2 = DD2/GAM**2\n      DH21 = DH21*GAM\n      DH22 = DH22*GAM\n      GO TO 200\n  220 CONTINUE\n      IF (DFLAG) 250,230,240\n  230 CONTINUE\n      DPARAM(3) = DH21\n      DPARAM(4) = DH12\n      GO TO 260\n  240 CONTINUE\n      DPARAM(2) = DH11\n      DPARAM(5) = DH22\n      GO TO 260\n  250 CONTINUE\n      DPARAM(2) = DH11\n      DPARAM(3) = DH21\n      DPARAM(4) = DH12\n      DPARAM(5) = DH22\n  260 CONTINUE\n      DPARAM(1) = DFLAG\n      RETURN\n      END\n"
  },
  {
    "path": "libs/eigen/blas/dsbmv.f",
    "content": "      SUBROUTINE DSBMV(UPLO,N,K,ALPHA,A,LDA,X,INCX,BETA,Y,INCY)\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION ALPHA,BETA\n      INTEGER INCX,INCY,K,LDA,N\n      CHARACTER UPLO\n*     ..\n*     .. Array Arguments ..\n      DOUBLE PRECISION A(LDA,*),X(*),Y(*)\n*     ..\n*\n*  Purpose\n*  =======\n*\n*  DSBMV  performs the matrix-vector  operation\n*\n*     y := alpha*A*x + beta*y,\n*\n*  where alpha and beta are scalars, x and y are n element vectors and\n*  A is an n by n symmetric band matrix, with k super-diagonals.\n*\n*  Arguments\n*  ==========\n*\n*  UPLO   - CHARACTER*1.\n*           On entry, UPLO specifies whether the upper or lower\n*           triangular part of the band matrix A is being supplied as\n*           follows:\n*\n*              UPLO = 'U' or 'u'   The upper triangular part of A is\n*                                  being supplied.\n*\n*              UPLO = 'L' or 'l'   The lower triangular part of A is\n*                                  being supplied.\n*\n*           Unchanged on exit.\n*\n*  N      - INTEGER.\n*           On entry, N specifies the order of the matrix A.\n*           N must be at least zero.\n*           Unchanged on exit.\n*\n*  K      - INTEGER.\n*           On entry, K specifies the number of super-diagonals of the\n*           matrix A. K must satisfy  0 .le. K.\n*           Unchanged on exit.\n*\n*  ALPHA  - DOUBLE PRECISION.\n*           On entry, ALPHA specifies the scalar alpha.\n*           Unchanged on exit.\n*\n*  A      - DOUBLE PRECISION array of DIMENSION ( LDA, n ).\n*           Before entry with UPLO = 'U' or 'u', the leading ( k + 1 )\n*           by n part of the array A must contain the upper triangular\n*           band part of the symmetric matrix, supplied column by\n*           column, with the leading diagonal of the matrix in row\n*           ( k + 1 ) of the array, the first super-diagonal starting at\n*           position 2 in row k, and so on. The top left k by k triangle\n*           of the array A is not referenced.\n*           The following program segment will transfer the upper\n*           triangular part of a symmetric band matrix from conventional\n*           full matrix storage to band storage:\n*\n*                 DO 20, J = 1, N\n*                    M = K + 1 - J\n*                    DO 10, I = MAX( 1, J - K ), J\n*                       A( M + I, J ) = matrix( I, J )\n*              10    CONTINUE\n*              20 CONTINUE\n*\n*           Before entry with UPLO = 'L' or 'l', the leading ( k + 1 )\n*           by n part of the array A must contain the lower triangular\n*           band part of the symmetric matrix, supplied column by\n*           column, with the leading diagonal of the matrix in row 1 of\n*           the array, the first sub-diagonal starting at position 1 in\n*           row 2, and so on. The bottom right k by k triangle of the\n*           array A is not referenced.\n*           The following program segment will transfer the lower\n*           triangular part of a symmetric band matrix from conventional\n*           full matrix storage to band storage:\n*\n*                 DO 20, J = 1, N\n*                    M = 1 - J\n*                    DO 10, I = J, MIN( N, J + K )\n*                       A( M + I, J ) = matrix( I, J )\n*              10    CONTINUE\n*              20 CONTINUE\n*\n*           Unchanged on exit.\n*\n*  LDA    - INTEGER.\n*           On entry, LDA specifies the first dimension of A as declared\n*           in the calling (sub) program. LDA must be at least\n*           ( k + 1 ).\n*           Unchanged on exit.\n*\n*  X      - DOUBLE PRECISION array of DIMENSION at least\n*           ( 1 + ( n - 1 )*abs( INCX ) ).\n*           Before entry, the incremented array X must contain the\n*           vector x.\n*           Unchanged on exit.\n*\n*  INCX   - INTEGER.\n*           On entry, INCX specifies the increment for the elements of\n*           X. INCX must not be zero.\n*           Unchanged on exit.\n*\n*  BETA   - DOUBLE PRECISION.\n*           On entry, BETA specifies the scalar beta.\n*           Unchanged on exit.\n*\n*  Y      - DOUBLE PRECISION array of DIMENSION at least\n*           ( 1 + ( n - 1 )*abs( INCY ) ).\n*           Before entry, the incremented array Y must contain the\n*           vector y. On exit, Y is overwritten by the updated vector y.\n*\n*  INCY   - INTEGER.\n*           On entry, INCY specifies the increment for the elements of\n*           Y. INCY must not be zero.\n*           Unchanged on exit.\n*\n*\n*  Level 2 Blas routine.\n*\n*  -- Written on 22-October-1986.\n*     Jack Dongarra, Argonne National Lab.\n*     Jeremy Du Croz, Nag Central Office.\n*     Sven Hammarling, Nag Central Office.\n*     Richard Hanson, Sandia National Labs.\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      DOUBLE PRECISION ONE,ZERO\n      PARAMETER (ONE=1.0D+0,ZERO=0.0D+0)\n*     ..\n*     .. Local Scalars ..\n      DOUBLE PRECISION TEMP1,TEMP2\n      INTEGER I,INFO,IX,IY,J,JX,JY,KPLUS1,KX,KY,L\n*     ..\n*     .. External Functions ..\n      LOGICAL LSAME\n      EXTERNAL LSAME\n*     ..\n*     .. External Subroutines ..\n      EXTERNAL XERBLA\n*     ..\n*     .. Intrinsic Functions ..\n      INTRINSIC MAX,MIN\n*     ..\n*\n*     Test the input parameters.\n*\n      INFO = 0\n      IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN\n          INFO = 1\n      ELSE IF (N.LT.0) THEN\n          INFO = 2\n      ELSE IF (K.LT.0) THEN\n          INFO = 3\n      ELSE IF (LDA.LT. (K+1)) THEN\n          INFO = 6\n      ELSE IF (INCX.EQ.0) THEN\n          INFO = 8\n      ELSE IF (INCY.EQ.0) THEN\n          INFO = 11\n      END IF\n      IF (INFO.NE.0) THEN\n          CALL XERBLA('DSBMV ',INFO)\n          RETURN\n      END IF\n*\n*     Quick return if possible.\n*\n      IF ((N.EQ.0) .OR. ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN\n*\n*     Set up the start points in  X  and  Y.\n*\n      IF (INCX.GT.0) THEN\n          KX = 1\n      ELSE\n          KX = 1 - (N-1)*INCX\n      END IF\n      IF (INCY.GT.0) THEN\n          KY = 1\n      ELSE\n          KY = 1 - (N-1)*INCY\n      END IF\n*\n*     Start the operations. In this version the elements of the array A\n*     are accessed sequentially with one pass through A.\n*\n*     First form  y := beta*y.\n*\n      IF (BETA.NE.ONE) THEN\n          IF (INCY.EQ.1) THEN\n              IF (BETA.EQ.ZERO) THEN\n                  DO 10 I = 1,N\n                      Y(I) = ZERO\n   10             CONTINUE\n              ELSE\n                  DO 20 I = 1,N\n                      Y(I) = BETA*Y(I)\n   20             CONTINUE\n              END IF\n          ELSE\n              IY = KY\n              IF (BETA.EQ.ZERO) THEN\n                  DO 30 I = 1,N\n                      Y(IY) = ZERO\n                      IY = IY + INCY\n   30             CONTINUE\n              ELSE\n                  DO 40 I = 1,N\n                      Y(IY) = BETA*Y(IY)\n                      IY = IY + INCY\n   40             CONTINUE\n              END IF\n          END IF\n      END IF\n      IF (ALPHA.EQ.ZERO) RETURN\n      IF (LSAME(UPLO,'U')) THEN\n*\n*        Form  y  when upper triangle of A is stored.\n*\n          KPLUS1 = K + 1\n          IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THEN\n              DO 60 J = 1,N\n                  TEMP1 = ALPHA*X(J)\n                  TEMP2 = ZERO\n                  L = KPLUS1 - J\n                  DO 50 I = MAX(1,J-K),J - 1\n                      Y(I) = Y(I) + TEMP1*A(L+I,J)\n                      TEMP2 = TEMP2 + A(L+I,J)*X(I)\n   50             CONTINUE\n                  Y(J) = Y(J) + TEMP1*A(KPLUS1,J) + ALPHA*TEMP2\n   60         CONTINUE\n          ELSE\n              JX = KX\n              JY = KY\n              DO 80 J = 1,N\n                  TEMP1 = ALPHA*X(JX)\n                  TEMP2 = ZERO\n                  IX = KX\n                  IY = KY\n                  L = KPLUS1 - J\n                  DO 70 I = MAX(1,J-K),J - 1\n                      Y(IY) = Y(IY) + TEMP1*A(L+I,J)\n                      TEMP2 = TEMP2 + A(L+I,J)*X(IX)\n                      IX = IX + INCX\n                      IY = IY + INCY\n   70             CONTINUE\n                  Y(JY) = Y(JY) + TEMP1*A(KPLUS1,J) + ALPHA*TEMP2\n                  JX = JX + INCX\n                  JY = JY + INCY\n                  IF (J.GT.K) THEN\n                      KX = KX + INCX\n                      KY = KY + INCY\n                  END IF\n   80         CONTINUE\n          END IF\n      ELSE\n*\n*        Form  y  when lower triangle of A is stored.\n*\n          IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THEN\n              DO 100 J = 1,N\n                  TEMP1 = ALPHA*X(J)\n                  TEMP2 = ZERO\n                  Y(J) = Y(J) + TEMP1*A(1,J)\n                  L = 1 - J\n                  DO 90 I = J + 1,MIN(N,J+K)\n                      Y(I) = Y(I) + TEMP1*A(L+I,J)\n                      TEMP2 = TEMP2 + A(L+I,J)*X(I)\n   90             CONTINUE\n                  Y(J) = Y(J) + ALPHA*TEMP2\n  100         CONTINUE\n          ELSE\n              JX = KX\n              JY = KY\n              DO 120 J = 1,N\n                  TEMP1 = ALPHA*X(JX)\n                  TEMP2 = ZERO\n                  Y(JY) = Y(JY) + TEMP1*A(1,J)\n                  L = 1 - J\n                  IX = JX\n                  IY = JY\n                  DO 110 I = J + 1,MIN(N,J+K)\n                      IX = IX + INCX\n                      IY = IY + INCY\n                      Y(IY) = Y(IY) + TEMP1*A(L+I,J)\n                      TEMP2 = TEMP2 + A(L+I,J)*X(IX)\n  110             CONTINUE\n                  Y(JY) = Y(JY) + ALPHA*TEMP2\n                  JX = JX + INCX\n                  JY = JY + INCY\n  120         CONTINUE\n          END IF\n      END IF\n*\n      RETURN\n*\n*     End of DSBMV .\n*\n      END\n"
  },
  {
    "path": "libs/eigen/blas/dspmv.f",
    "content": "      SUBROUTINE DSPMV(UPLO,N,ALPHA,AP,X,INCX,BETA,Y,INCY)\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION ALPHA,BETA\n      INTEGER INCX,INCY,N\n      CHARACTER UPLO\n*     ..\n*     .. Array Arguments ..\n      DOUBLE PRECISION AP(*),X(*),Y(*)\n*     ..\n*\n*  Purpose\n*  =======\n*\n*  DSPMV  performs the matrix-vector operation\n*\n*     y := alpha*A*x + beta*y,\n*\n*  where alpha and beta are scalars, x and y are n element vectors and\n*  A is an n by n symmetric matrix, supplied in packed form.\n*\n*  Arguments\n*  ==========\n*\n*  UPLO   - CHARACTER*1.\n*           On entry, UPLO specifies whether the upper or lower\n*           triangular part of the matrix A is supplied in the packed\n*           array AP as follows:\n*\n*              UPLO = 'U' or 'u'   The upper triangular part of A is\n*                                  supplied in AP.\n*\n*              UPLO = 'L' or 'l'   The lower triangular part of A is\n*                                  supplied in AP.\n*\n*           Unchanged on exit.\n*\n*  N      - INTEGER.\n*           On entry, N specifies the order of the matrix A.\n*           N must be at least zero.\n*           Unchanged on exit.\n*\n*  ALPHA  - DOUBLE PRECISION.\n*           On entry, ALPHA specifies the scalar alpha.\n*           Unchanged on exit.\n*\n*  AP     - DOUBLE PRECISION array of DIMENSION at least\n*           ( ( n*( n + 1 ) )/2 ).\n*           Before entry with UPLO = 'U' or 'u', the array AP must\n*           contain the upper triangular part of the symmetric matrix\n*           packed sequentially, column by column, so that AP( 1 )\n*           contains a( 1, 1 ), AP( 2 ) and AP( 3 ) contain a( 1, 2 )\n*           and a( 2, 2 ) respectively, and so on.\n*           Before entry with UPLO = 'L' or 'l', the array AP must\n*           contain the lower triangular part of the symmetric matrix\n*           packed sequentially, column by column, so that AP( 1 )\n*           contains a( 1, 1 ), AP( 2 ) and AP( 3 ) contain a( 2, 1 )\n*           and a( 3, 1 ) respectively, and so on.\n*           Unchanged on exit.\n*\n*  X      - DOUBLE PRECISION array of dimension at least\n*           ( 1 + ( n - 1 )*abs( INCX ) ).\n*           Before entry, the incremented array X must contain the n\n*           element vector x.\n*           Unchanged on exit.\n*\n*  INCX   - INTEGER.\n*           On entry, INCX specifies the increment for the elements of\n*           X. INCX must not be zero.\n*           Unchanged on exit.\n*\n*  BETA   - DOUBLE PRECISION.\n*           On entry, BETA specifies the scalar beta. When BETA is\n*           supplied as zero then Y need not be set on input.\n*           Unchanged on exit.\n*\n*  Y      - DOUBLE PRECISION array of dimension at least\n*           ( 1 + ( n - 1 )*abs( INCY ) ).\n*           Before entry, the incremented array Y must contain the n\n*           element vector y. On exit, Y is overwritten by the updated\n*           vector y.\n*\n*  INCY   - INTEGER.\n*           On entry, INCY specifies the increment for the elements of\n*           Y. INCY must not be zero.\n*           Unchanged on exit.\n*\n*  Further Details\n*  ===============\n*\n*  Level 2 Blas routine.\n*\n*  -- Written on 22-October-1986.\n*     Jack Dongarra, Argonne National Lab.\n*     Jeremy Du Croz, Nag Central Office.\n*     Sven Hammarling, Nag Central Office.\n*     Richard Hanson, Sandia National Labs.\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      DOUBLE PRECISION ONE,ZERO\n      PARAMETER (ONE=1.0D+0,ZERO=0.0D+0)\n*     ..\n*     .. Local Scalars ..\n      DOUBLE PRECISION TEMP1,TEMP2\n      INTEGER I,INFO,IX,IY,J,JX,JY,K,KK,KX,KY\n*     ..\n*     .. External Functions ..\n      LOGICAL LSAME\n      EXTERNAL LSAME\n*     ..\n*     .. External Subroutines ..\n      EXTERNAL XERBLA\n*     ..\n*\n*     Test the input parameters.\n*\n      INFO = 0\n      IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN\n          INFO = 1\n      ELSE IF (N.LT.0) THEN\n          INFO = 2\n      ELSE IF (INCX.EQ.0) THEN\n          INFO = 6\n      ELSE IF (INCY.EQ.0) THEN\n          INFO = 9\n      END IF\n      IF (INFO.NE.0) THEN\n          CALL XERBLA('DSPMV ',INFO)\n          RETURN\n      END IF\n*\n*     Quick return if possible.\n*\n      IF ((N.EQ.0) .OR. ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN\n*\n*     Set up the start points in  X  and  Y.\n*\n      IF (INCX.GT.0) THEN\n          KX = 1\n      ELSE\n          KX = 1 - (N-1)*INCX\n      END IF\n      IF (INCY.GT.0) THEN\n          KY = 1\n      ELSE\n          KY = 1 - (N-1)*INCY\n      END IF\n*\n*     Start the operations. In this version the elements of the array AP\n*     are accessed sequentially with one pass through AP.\n*\n*     First form  y := beta*y.\n*\n      IF (BETA.NE.ONE) THEN\n          IF (INCY.EQ.1) THEN\n              IF (BETA.EQ.ZERO) THEN\n                  DO 10 I = 1,N\n                      Y(I) = ZERO\n   10             CONTINUE\n              ELSE\n                  DO 20 I = 1,N\n                      Y(I) = BETA*Y(I)\n   20             CONTINUE\n              END IF\n          ELSE\n              IY = KY\n              IF (BETA.EQ.ZERO) THEN\n                  DO 30 I = 1,N\n                      Y(IY) = ZERO\n                      IY = IY + INCY\n   30             CONTINUE\n              ELSE\n                  DO 40 I = 1,N\n                      Y(IY) = BETA*Y(IY)\n                      IY = IY + INCY\n   40             CONTINUE\n              END IF\n          END IF\n      END IF\n      IF (ALPHA.EQ.ZERO) RETURN\n      KK = 1\n      IF (LSAME(UPLO,'U')) THEN\n*\n*        Form  y  when AP contains the upper triangle.\n*\n          IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THEN\n              DO 60 J = 1,N\n                  TEMP1 = ALPHA*X(J)\n                  TEMP2 = ZERO\n                  K = KK\n                  DO 50 I = 1,J - 1\n                      Y(I) = Y(I) + TEMP1*AP(K)\n                      TEMP2 = TEMP2 + AP(K)*X(I)\n                      K = K + 1\n   50             CONTINUE\n                  Y(J) = Y(J) + TEMP1*AP(KK+J-1) + ALPHA*TEMP2\n                  KK = KK + J\n   60         CONTINUE\n          ELSE\n              JX = KX\n              JY = KY\n              DO 80 J = 1,N\n                  TEMP1 = ALPHA*X(JX)\n                  TEMP2 = ZERO\n                  IX = KX\n                  IY = KY\n                  DO 70 K = KK,KK + J - 2\n                      Y(IY) = Y(IY) + TEMP1*AP(K)\n                      TEMP2 = TEMP2 + AP(K)*X(IX)\n                      IX = IX + INCX\n                      IY = IY + INCY\n   70             CONTINUE\n                  Y(JY) = Y(JY) + TEMP1*AP(KK+J-1) + ALPHA*TEMP2\n                  JX = JX + INCX\n                  JY = JY + INCY\n                  KK = KK + J\n   80         CONTINUE\n          END IF\n      ELSE\n*\n*        Form  y  when AP contains the lower triangle.\n*\n          IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THEN\n              DO 100 J = 1,N\n                  TEMP1 = ALPHA*X(J)\n                  TEMP2 = ZERO\n                  Y(J) = Y(J) + TEMP1*AP(KK)\n                  K = KK + 1\n                  DO 90 I = J + 1,N\n                      Y(I) = Y(I) + TEMP1*AP(K)\n                      TEMP2 = TEMP2 + AP(K)*X(I)\n                      K = K + 1\n   90             CONTINUE\n                  Y(J) = Y(J) + ALPHA*TEMP2\n                  KK = KK + (N-J+1)\n  100         CONTINUE\n          ELSE\n              JX = KX\n              JY = KY\n              DO 120 J = 1,N\n                  TEMP1 = ALPHA*X(JX)\n                  TEMP2 = ZERO\n                  Y(JY) = Y(JY) + TEMP1*AP(KK)\n                  IX = JX\n                  IY = JY\n                  DO 110 K = KK + 1,KK + N - J\n                      IX = IX + INCX\n                      IY = IY + INCY\n                      Y(IY) = Y(IY) + TEMP1*AP(K)\n                      TEMP2 = TEMP2 + AP(K)*X(IX)\n  110             CONTINUE\n                  Y(JY) = Y(JY) + ALPHA*TEMP2\n                  JX = JX + INCX\n                  JY = JY + INCY\n                  KK = KK + (N-J+1)\n  120         CONTINUE\n          END IF\n      END IF\n*\n      RETURN\n*\n*     End of DSPMV .\n*\n      END\n"
  },
  {
    "path": "libs/eigen/blas/dtbmv.f",
    "content": "      SUBROUTINE DTBMV(UPLO,TRANS,DIAG,N,K,A,LDA,X,INCX)\n*     .. Scalar Arguments ..\n      INTEGER INCX,K,LDA,N\n      CHARACTER DIAG,TRANS,UPLO\n*     ..\n*     .. Array Arguments ..\n      DOUBLE PRECISION A(LDA,*),X(*)\n*     ..\n*\n*  Purpose\n*  =======\n*\n*  DTBMV  performs one of the matrix-vector operations\n*\n*     x := A*x,   or   x := A'*x,\n*\n*  where x is an n element vector and  A is an n by n unit, or non-unit,\n*  upper or lower triangular band matrix, with ( k + 1 ) diagonals.\n*\n*  Arguments\n*  ==========\n*\n*  UPLO   - CHARACTER*1.\n*           On entry, UPLO specifies whether the matrix is an upper or\n*           lower triangular matrix as follows:\n*\n*              UPLO = 'U' or 'u'   A is an upper triangular matrix.\n*\n*              UPLO = 'L' or 'l'   A is a lower triangular matrix.\n*\n*           Unchanged on exit.\n*\n*  TRANS  - CHARACTER*1.\n*           On entry, TRANS specifies the operation to be performed as\n*           follows:\n*\n*              TRANS = 'N' or 'n'   x := A*x.\n*\n*              TRANS = 'T' or 't'   x := A'*x.\n*\n*              TRANS = 'C' or 'c'   x := A'*x.\n*\n*           Unchanged on exit.\n*\n*  DIAG   - CHARACTER*1.\n*           On entry, DIAG specifies whether or not A is unit\n*           triangular as follows:\n*\n*              DIAG = 'U' or 'u'   A is assumed to be unit triangular.\n*\n*              DIAG = 'N' or 'n'   A is not assumed to be unit\n*                                  triangular.\n*\n*           Unchanged on exit.\n*\n*  N      - INTEGER.\n*           On entry, N specifies the order of the matrix A.\n*           N must be at least zero.\n*           Unchanged on exit.\n*\n*  K      - INTEGER.\n*           On entry with UPLO = 'U' or 'u', K specifies the number of\n*           super-diagonals of the matrix A.\n*           On entry with UPLO = 'L' or 'l', K specifies the number of\n*           sub-diagonals of the matrix A.\n*           K must satisfy  0 .le. K.\n*           Unchanged on exit.\n*\n*  A      - DOUBLE PRECISION array of DIMENSION ( LDA, n ).\n*           Before entry with UPLO = 'U' or 'u', the leading ( k + 1 )\n*           by n part of the array A must contain the upper triangular\n*           band part of the matrix of coefficients, supplied column by\n*           column, with the leading diagonal of the matrix in row\n*           ( k + 1 ) of the array, the first super-diagonal starting at\n*           position 2 in row k, and so on. The top left k by k triangle\n*           of the array A is not referenced.\n*           The following program segment will transfer an upper\n*           triangular band matrix from conventional full matrix storage\n*           to band storage:\n*\n*                 DO 20, J = 1, N\n*                    M = K + 1 - J\n*                    DO 10, I = MAX( 1, J - K ), J\n*                       A( M + I, J ) = matrix( I, J )\n*              10    CONTINUE\n*              20 CONTINUE\n*\n*           Before entry with UPLO = 'L' or 'l', the leading ( k + 1 )\n*           by n part of the array A must contain the lower triangular\n*           band part of the matrix of coefficients, supplied column by\n*           column, with the leading diagonal of the matrix in row 1 of\n*           the array, the first sub-diagonal starting at position 1 in\n*           row 2, and so on. The bottom right k by k triangle of the\n*           array A is not referenced.\n*           The following program segment will transfer a lower\n*           triangular band matrix from conventional full matrix storage\n*           to band storage:\n*\n*                 DO 20, J = 1, N\n*                    M = 1 - J\n*                    DO 10, I = J, MIN( N, J + K )\n*                       A( M + I, J ) = matrix( I, J )\n*              10    CONTINUE\n*              20 CONTINUE\n*\n*           Note that when DIAG = 'U' or 'u' the elements of the array A\n*           corresponding to the diagonal elements of the matrix are not\n*           referenced, but are assumed to be unity.\n*           Unchanged on exit.\n*\n*  LDA    - INTEGER.\n*           On entry, LDA specifies the first dimension of A as declared\n*           in the calling (sub) program. LDA must be at least\n*           ( k + 1 ).\n*           Unchanged on exit.\n*\n*  X      - DOUBLE PRECISION array of dimension at least\n*           ( 1 + ( n - 1 )*abs( INCX ) ).\n*           Before entry, the incremented array X must contain the n\n*           element vector x. On exit, X is overwritten with the\n*           tranformed vector x.\n*\n*  INCX   - INTEGER.\n*           On entry, INCX specifies the increment for the elements of\n*           X. INCX must not be zero.\n*           Unchanged on exit.\n*\n*  Further Details\n*  ===============\n*\n*  Level 2 Blas routine.\n*\n*  -- Written on 22-October-1986.\n*     Jack Dongarra, Argonne National Lab.\n*     Jeremy Du Croz, Nag Central Office.\n*     Sven Hammarling, Nag Central Office.\n*     Richard Hanson, Sandia National Labs.\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      DOUBLE PRECISION ZERO\n      PARAMETER (ZERO=0.0D+0)\n*     ..\n*     .. Local Scalars ..\n      DOUBLE PRECISION TEMP\n      INTEGER I,INFO,IX,J,JX,KPLUS1,KX,L\n      LOGICAL NOUNIT\n*     ..\n*     .. External Functions ..\n      LOGICAL LSAME\n      EXTERNAL LSAME\n*     ..\n*     .. External Subroutines ..\n      EXTERNAL XERBLA\n*     ..\n*     .. Intrinsic Functions ..\n      INTRINSIC MAX,MIN\n*     ..\n*\n*     Test the input parameters.\n*\n      INFO = 0\n      IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN\n          INFO = 1\n      ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND.\n     +         .NOT.LSAME(TRANS,'C')) THEN\n          INFO = 2\n      ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN\n          INFO = 3\n      ELSE IF (N.LT.0) THEN\n          INFO = 4\n      ELSE IF (K.LT.0) THEN\n          INFO = 5\n      ELSE IF (LDA.LT. (K+1)) THEN\n          INFO = 7\n      ELSE IF (INCX.EQ.0) THEN\n          INFO = 9\n      END IF\n      IF (INFO.NE.0) THEN\n          CALL XERBLA('DTBMV ',INFO)\n          RETURN\n      END IF\n*\n*     Quick return if possible.\n*\n      IF (N.EQ.0) RETURN\n*\n      NOUNIT = LSAME(DIAG,'N')\n*\n*     Set up the start point in X if the increment is not unity. This\n*     will be  ( N - 1 )*INCX   too small for descending loops.\n*\n      IF (INCX.LE.0) THEN\n          KX = 1 - (N-1)*INCX\n      ELSE IF (INCX.NE.1) THEN\n          KX = 1\n      END IF\n*\n*     Start the operations. In this version the elements of A are\n*     accessed sequentially with one pass through A.\n*\n      IF (LSAME(TRANS,'N')) THEN\n*\n*         Form  x := A*x.\n*\n          IF (LSAME(UPLO,'U')) THEN\n              KPLUS1 = K + 1\n              IF (INCX.EQ.1) THEN\n                  DO 20 J = 1,N\n                      IF (X(J).NE.ZERO) THEN\n                          TEMP = X(J)\n                          L = KPLUS1 - J\n                          DO 10 I = MAX(1,J-K),J - 1\n                              X(I) = X(I) + TEMP*A(L+I,J)\n   10                     CONTINUE\n                          IF (NOUNIT) X(J) = X(J)*A(KPLUS1,J)\n                      END IF\n   20             CONTINUE\n              ELSE\n                  JX = KX\n                  DO 40 J = 1,N\n                      IF (X(JX).NE.ZERO) THEN\n                          TEMP = X(JX)\n                          IX = KX\n                          L = KPLUS1 - J\n                          DO 30 I = MAX(1,J-K),J - 1\n                              X(IX) = X(IX) + TEMP*A(L+I,J)\n                              IX = IX + INCX\n   30                     CONTINUE\n                          IF (NOUNIT) X(JX) = X(JX)*A(KPLUS1,J)\n                      END IF\n                      JX = JX + INCX\n                      IF (J.GT.K) KX = KX + INCX\n   40             CONTINUE\n              END IF\n          ELSE\n              IF (INCX.EQ.1) THEN\n                  DO 60 J = N,1,-1\n                      IF (X(J).NE.ZERO) THEN\n                          TEMP = X(J)\n                          L = 1 - J\n                          DO 50 I = MIN(N,J+K),J + 1,-1\n                              X(I) = X(I) + TEMP*A(L+I,J)\n   50                     CONTINUE\n                          IF (NOUNIT) X(J) = X(J)*A(1,J)\n                      END IF\n   60             CONTINUE\n              ELSE\n                  KX = KX + (N-1)*INCX\n                  JX = KX\n                  DO 80 J = N,1,-1\n                      IF (X(JX).NE.ZERO) THEN\n                          TEMP = X(JX)\n                          IX = KX\n                          L = 1 - J\n                          DO 70 I = MIN(N,J+K),J + 1,-1\n                              X(IX) = X(IX) + TEMP*A(L+I,J)\n                              IX = IX - INCX\n   70                     CONTINUE\n                          IF (NOUNIT) X(JX) = X(JX)*A(1,J)\n                      END IF\n                      JX = JX - INCX\n                      IF ((N-J).GE.K) KX = KX - INCX\n   80             CONTINUE\n              END IF\n          END IF\n      ELSE\n*\n*        Form  x := A'*x.\n*\n          IF (LSAME(UPLO,'U')) THEN\n              KPLUS1 = K + 1\n              IF (INCX.EQ.1) THEN\n                  DO 100 J = N,1,-1\n                      TEMP = X(J)\n                      L = KPLUS1 - J\n                      IF (NOUNIT) TEMP = TEMP*A(KPLUS1,J)\n                      DO 90 I = J - 1,MAX(1,J-K),-1\n                          TEMP = TEMP + A(L+I,J)*X(I)\n   90                 CONTINUE\n                      X(J) = TEMP\n  100             CONTINUE\n              ELSE\n                  KX = KX + (N-1)*INCX\n                  JX = KX\n                  DO 120 J = N,1,-1\n                      TEMP = X(JX)\n                      KX = KX - INCX\n                      IX = KX\n                      L = KPLUS1 - J\n                      IF (NOUNIT) TEMP = TEMP*A(KPLUS1,J)\n                      DO 110 I = J - 1,MAX(1,J-K),-1\n                          TEMP = TEMP + A(L+I,J)*X(IX)\n                          IX = IX - INCX\n  110                 CONTINUE\n                      X(JX) = TEMP\n                      JX = JX - INCX\n  120             CONTINUE\n              END IF\n          ELSE\n              IF (INCX.EQ.1) THEN\n                  DO 140 J = 1,N\n                      TEMP = X(J)\n                      L = 1 - J\n                      IF (NOUNIT) TEMP = TEMP*A(1,J)\n                      DO 130 I = J + 1,MIN(N,J+K)\n                          TEMP = TEMP + A(L+I,J)*X(I)\n  130                 CONTINUE\n                      X(J) = TEMP\n  140             CONTINUE\n              ELSE\n                  JX = KX\n                  DO 160 J = 1,N\n                      TEMP = X(JX)\n                      KX = KX + INCX\n                      IX = KX\n                      L = 1 - J\n                      IF (NOUNIT) TEMP = TEMP*A(1,J)\n                      DO 150 I = J + 1,MIN(N,J+K)\n                          TEMP = TEMP + A(L+I,J)*X(IX)\n                          IX = IX + INCX\n  150                 CONTINUE\n                      X(JX) = TEMP\n                      JX = JX + INCX\n  160             CONTINUE\n              END IF\n          END IF\n      END IF\n*\n      RETURN\n*\n*     End of DTBMV .\n*\n      END\n"
  },
  {
    "path": "libs/eigen/blas/level1_cplx_impl.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"common.h\"\n\nstruct scalar_norm1_op {\n  typedef RealScalar result_type;\n  EIGEN_EMPTY_STRUCT_CTOR(scalar_norm1_op)\n  inline RealScalar operator() (const Scalar& a) const { return numext::norm1(a); }\n};\nnamespace Eigen {\n  namespace internal {\n    template<> struct functor_traits<scalar_norm1_op >\n    {\n      enum { Cost = 3 * NumTraits<Scalar>::AddCost, PacketAccess = 0 };\n    };\n  }\n}\n\n// computes the sum of magnitudes of all vector elements or, for a complex vector x, the sum\n// res = |Rex1| + |Imx1| + |Rex2| + |Imx2| + ... + |Rexn| + |Imxn|, where x is a vector of order n\nRealScalar EIGEN_CAT(EIGEN_CAT(REAL_SCALAR_SUFFIX,SCALAR_SUFFIX),asum_)(int *n, RealScalar *px, int *incx)\n{\n//   std::cerr << \"__asum \" << *n << \" \" << *incx << \"\\n\";\n  Complex* x = reinterpret_cast<Complex*>(px);\n\n  if(*n<=0) return 0;\n\n  if(*incx==1)  return vector(x,*n).unaryExpr<scalar_norm1_op>().sum();\n  else          return vector(x,*n,std::abs(*incx)).unaryExpr<scalar_norm1_op>().sum();\n}\n\n// computes a dot product of a conjugated vector with another vector.\nint EIGEN_BLAS_FUNC(dotcw)(int *n, RealScalar *px, int *incx, RealScalar *py, int *incy, RealScalar* pres)\n{\n//   std::cerr << \"_dotc \" << *n << \" \" << *incx << \" \" << *incy << \"\\n\";\n\n  if(*n<=0) return 0;\n\n  Scalar* x = reinterpret_cast<Scalar*>(px);\n  Scalar* y = reinterpret_cast<Scalar*>(py);\n  Scalar* res = reinterpret_cast<Scalar*>(pres);\n\n  if(*incx==1 && *incy==1)    *res = (vector(x,*n).dot(vector(y,*n)));\n  else if(*incx>0 && *incy>0) *res = (vector(x,*n,*incx).dot(vector(y,*n,*incy)));\n  else if(*incx<0 && *incy>0) *res = (vector(x,*n,-*incx).reverse().dot(vector(y,*n,*incy)));\n  else if(*incx>0 && *incy<0) *res = (vector(x,*n,*incx).dot(vector(y,*n,-*incy).reverse()));\n  else if(*incx<0 && *incy<0) *res = (vector(x,*n,-*incx).reverse().dot(vector(y,*n,-*incy).reverse()));\n  return 0;\n}\n\n// computes a vector-vector dot product without complex conjugation.\nint EIGEN_BLAS_FUNC(dotuw)(int *n, RealScalar *px, int *incx, RealScalar *py, int *incy, RealScalar* pres)\n{\n//   std::cerr << \"_dotu \" << *n << \" \" << *incx << \" \" << *incy << \"\\n\";\n\n  if(*n<=0) return 0;\n\n  Scalar* x = reinterpret_cast<Scalar*>(px);\n  Scalar* y = reinterpret_cast<Scalar*>(py);\n  Scalar* res = reinterpret_cast<Scalar*>(pres);\n\n  if(*incx==1 && *incy==1)    *res = (vector(x,*n).cwiseProduct(vector(y,*n))).sum();\n  else if(*incx>0 && *incy>0) *res = (vector(x,*n,*incx).cwiseProduct(vector(y,*n,*incy))).sum();\n  else if(*incx<0 && *incy>0) *res = (vector(x,*n,-*incx).reverse().cwiseProduct(vector(y,*n,*incy))).sum();\n  else if(*incx>0 && *incy<0) *res = (vector(x,*n,*incx).cwiseProduct(vector(y,*n,-*incy).reverse())).sum();\n  else if(*incx<0 && *incy<0) *res = (vector(x,*n,-*incx).reverse().cwiseProduct(vector(y,*n,-*incy).reverse())).sum();\n  return 0;\n}\n\nRealScalar EIGEN_CAT(EIGEN_CAT(REAL_SCALAR_SUFFIX,SCALAR_SUFFIX),nrm2_)(int *n, RealScalar *px, int *incx)\n{\n//   std::cerr << \"__nrm2 \" << *n << \" \" << *incx << \"\\n\";\n  if(*n<=0) return 0;\n\n  Scalar* x = reinterpret_cast<Scalar*>(px);\n\n  if(*incx==1)\n    return vector(x,*n).stableNorm();\n\n  return vector(x,*n,*incx).stableNorm();\n}\n\nint EIGEN_CAT(EIGEN_CAT(SCALAR_SUFFIX,REAL_SCALAR_SUFFIX),rot_)(int *n, RealScalar *px, int *incx, RealScalar *py, int *incy, RealScalar *pc, RealScalar *ps)\n{\n  if(*n<=0) return 0;\n\n  Scalar* x = reinterpret_cast<Scalar*>(px);\n  Scalar* y = reinterpret_cast<Scalar*>(py);\n  RealScalar c = *pc;\n  RealScalar s = *ps;\n\n  StridedVectorType vx(vector(x,*n,std::abs(*incx)));\n  StridedVectorType vy(vector(y,*n,std::abs(*incy)));\n\n  Reverse<StridedVectorType> rvx(vx);\n  Reverse<StridedVectorType> rvy(vy);\n\n  // TODO implement mixed real-scalar rotations\n       if(*incx<0 && *incy>0) internal::apply_rotation_in_the_plane(rvx, vy, JacobiRotation<Scalar>(c,s));\n  else if(*incx>0 && *incy<0) internal::apply_rotation_in_the_plane(vx, rvy, JacobiRotation<Scalar>(c,s));\n  else                        internal::apply_rotation_in_the_plane(vx, vy,  JacobiRotation<Scalar>(c,s));\n\n  return 0;\n}\n\nint EIGEN_CAT(EIGEN_CAT(SCALAR_SUFFIX,REAL_SCALAR_SUFFIX),scal_)(int *n, RealScalar *palpha, RealScalar *px, int *incx)\n{\n  if(*n<=0) return 0;\n\n  Scalar* x = reinterpret_cast<Scalar*>(px);\n  RealScalar alpha = *palpha;\n\n//   std::cerr << \"__scal \" << *n << \" \" << alpha << \" \" << *incx << \"\\n\";\n\n  if(*incx==1)  vector(x,*n) *= alpha;\n  else          vector(x,*n,std::abs(*incx)) *= alpha;\n\n  return 0;\n}\n\n"
  },
  {
    "path": "libs/eigen/blas/level1_impl.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"common.h\"\n\nint EIGEN_BLAS_FUNC(axpy)(int *n, RealScalar *palpha, RealScalar *px, int *incx, RealScalar *py, int *incy)\n{\n  Scalar* x = reinterpret_cast<Scalar*>(px);\n  Scalar* y = reinterpret_cast<Scalar*>(py);\n  Scalar alpha  = *reinterpret_cast<Scalar*>(palpha);\n\n  if(*n<=0) return 0;\n\n  if(*incx==1 && *incy==1)    vector(y,*n) += alpha * vector(x,*n);\n  else if(*incx>0 && *incy>0) vector(y,*n,*incy) += alpha * vector(x,*n,*incx);\n  else if(*incx>0 && *incy<0) vector(y,*n,-*incy).reverse() += alpha * vector(x,*n,*incx);\n  else if(*incx<0 && *incy>0) vector(y,*n,*incy) += alpha * vector(x,*n,-*incx).reverse();\n  else if(*incx<0 && *incy<0) vector(y,*n,-*incy).reverse() += alpha * vector(x,*n,-*incx).reverse();\n\n  return 0;\n}\n\nint EIGEN_BLAS_FUNC(copy)(int *n, RealScalar *px, int *incx, RealScalar *py, int *incy)\n{\n  if(*n<=0) return 0;\n\n  Scalar* x = reinterpret_cast<Scalar*>(px);\n  Scalar* y = reinterpret_cast<Scalar*>(py);\n\n  // be carefull, *incx==0 is allowed !!\n  if(*incx==1 && *incy==1)\n    vector(y,*n) = vector(x,*n);\n  else\n  {\n    if(*incx<0) x = x - (*n-1)*(*incx);\n    if(*incy<0) y = y - (*n-1)*(*incy);\n    for(int i=0;i<*n;++i)\n    {\n      *y = *x;\n      x += *incx;\n      y += *incy;\n    }\n  }\n\n  return 0;\n}\n\nint EIGEN_CAT(EIGEN_CAT(i,SCALAR_SUFFIX),amax_)(int *n, RealScalar *px, int *incx)\n{\n  if(*n<=0) return 0;\n  Scalar* x = reinterpret_cast<Scalar*>(px);\n\n  DenseIndex ret;\n  if(*incx==1)  vector(x,*n).cwiseAbs().maxCoeff(&ret);\n  else          vector(x,*n,std::abs(*incx)).cwiseAbs().maxCoeff(&ret);\n  return ret+1;\n}\n\nint EIGEN_CAT(EIGEN_CAT(i,SCALAR_SUFFIX),amin_)(int *n, RealScalar *px, int *incx)\n{\n  if(*n<=0) return 0;\n  Scalar* x = reinterpret_cast<Scalar*>(px);\n  \n  DenseIndex ret;\n  if(*incx==1)  vector(x,*n).cwiseAbs().minCoeff(&ret);\n  else          vector(x,*n,std::abs(*incx)).cwiseAbs().minCoeff(&ret);\n  return ret+1;\n}\n\nint EIGEN_BLAS_FUNC(rotg)(RealScalar *pa, RealScalar *pb, RealScalar *pc, RealScalar *ps)\n{\n  using std::sqrt;\n  using std::abs;\n  \n  Scalar& a = *reinterpret_cast<Scalar*>(pa);\n  Scalar& b = *reinterpret_cast<Scalar*>(pb);\n  RealScalar* c = pc;\n  Scalar* s = reinterpret_cast<Scalar*>(ps);\n\n  #if !ISCOMPLEX\n  Scalar r,z;\n  Scalar aa = abs(a);\n  Scalar ab = abs(b);\n  if((aa+ab)==Scalar(0))\n  {\n    *c = 1;\n    *s = 0;\n    r = 0;\n    z = 0;\n  }\n  else\n  {\n    r = sqrt(a*a + b*b);\n    Scalar amax = aa>ab ? a : b;\n    r = amax>0 ? r : -r;\n    *c = a/r;\n    *s = b/r;\n    z = 1;\n    if (aa > ab) z = *s;\n    if (ab > aa && *c!=RealScalar(0))\n      z = Scalar(1)/ *c;\n  }\n  *pa = r;\n  *pb = z;\n  #else\n  Scalar alpha;\n  RealScalar norm,scale;\n  if(abs(a)==RealScalar(0))\n  {\n    *c = RealScalar(0);\n    *s = Scalar(1);\n    a = b;\n  }\n  else\n  {\n    scale = abs(a) + abs(b);\n    norm = scale*sqrt((numext::abs2(a/scale)) + (numext::abs2(b/scale)));\n    alpha = a/abs(a);\n    *c = abs(a)/norm;\n    *s = alpha*numext::conj(b)/norm;\n    a = alpha*norm;\n  }\n  #endif\n\n//   JacobiRotation<Scalar> r;\n//   r.makeGivens(a,b);\n//   *c = r.c();\n//   *s = r.s();\n\n  return 0;\n}\n\nint EIGEN_BLAS_FUNC(scal)(int *n, RealScalar *palpha, RealScalar *px, int *incx)\n{\n  if(*n<=0) return 0;\n\n  Scalar* x = reinterpret_cast<Scalar*>(px);\n  Scalar alpha = *reinterpret_cast<Scalar*>(palpha);\n\n  if(*incx==1)  vector(x,*n) *= alpha;\n  else          vector(x,*n,std::abs(*incx)) *= alpha;\n\n  return 0;\n}\n\nint EIGEN_BLAS_FUNC(swap)(int *n, RealScalar *px, int *incx, RealScalar *py, int *incy)\n{\n  if(*n<=0) return 0;\n\n  Scalar* x = reinterpret_cast<Scalar*>(px);\n  Scalar* y = reinterpret_cast<Scalar*>(py);\n\n  if(*incx==1 && *incy==1)    vector(y,*n).swap(vector(x,*n));\n  else if(*incx>0 && *incy>0) vector(y,*n,*incy).swap(vector(x,*n,*incx));\n  else if(*incx>0 && *incy<0) vector(y,*n,-*incy).reverse().swap(vector(x,*n,*incx));\n  else if(*incx<0 && *incy>0) vector(y,*n,*incy).swap(vector(x,*n,-*incx).reverse());\n  else if(*incx<0 && *incy<0) vector(y,*n,-*incy).reverse().swap(vector(x,*n,-*incx).reverse());\n\n  return 1;\n}\n\n"
  },
  {
    "path": "libs/eigen/blas/level1_real_impl.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"common.h\"\n\n// computes the sum of magnitudes of all vector elements or, for a complex vector x, the sum\n// res = |Rex1| + |Imx1| + |Rex2| + |Imx2| + ... + |Rexn| + |Imxn|, where x is a vector of order n\nRealScalar EIGEN_BLAS_FUNC(asum)(int *n, RealScalar *px, int *incx)\n{\n//   std::cerr << \"_asum \" << *n << \" \" << *incx << \"\\n\";\n\n  Scalar* x = reinterpret_cast<Scalar*>(px);\n\n  if(*n<=0) return 0;\n\n  if(*incx==1)  return vector(x,*n).cwiseAbs().sum();\n  else          return vector(x,*n,std::abs(*incx)).cwiseAbs().sum();\n}\n\n// computes a vector-vector dot product.\nScalar EIGEN_BLAS_FUNC(dot)(int *n, RealScalar *px, int *incx, RealScalar *py, int *incy)\n{\n//   std::cerr << \"_dot \" << *n << \" \" << *incx << \" \" << *incy << \"\\n\";\n\n  if(*n<=0) return 0;\n\n  Scalar* x = reinterpret_cast<Scalar*>(px);\n  Scalar* y = reinterpret_cast<Scalar*>(py);\n\n  if(*incx==1 && *incy==1)    return (vector(x,*n).cwiseProduct(vector(y,*n))).sum();\n  else if(*incx>0 && *incy>0) return (vector(x,*n,*incx).cwiseProduct(vector(y,*n,*incy))).sum();\n  else if(*incx<0 && *incy>0) return (vector(x,*n,-*incx).reverse().cwiseProduct(vector(y,*n,*incy))).sum();\n  else if(*incx>0 && *incy<0) return (vector(x,*n,*incx).cwiseProduct(vector(y,*n,-*incy).reverse())).sum();\n  else if(*incx<0 && *incy<0) return (vector(x,*n,-*incx).reverse().cwiseProduct(vector(y,*n,-*incy).reverse())).sum();\n  else return 0;\n}\n\n// computes the Euclidean norm of a vector.\n// FIXME\nScalar EIGEN_BLAS_FUNC(nrm2)(int *n, RealScalar *px, int *incx)\n{\n//   std::cerr << \"_nrm2 \" << *n << \" \" << *incx << \"\\n\";\n  if(*n<=0) return 0;\n\n  Scalar* x = reinterpret_cast<Scalar*>(px);\n\n  if(*incx==1)  return vector(x,*n).stableNorm();\n  else          return vector(x,*n,std::abs(*incx)).stableNorm();\n}\n\nint EIGEN_BLAS_FUNC(rot)(int *n, RealScalar *px, int *incx, RealScalar *py, int *incy, RealScalar *pc, RealScalar *ps)\n{\n//   std::cerr << \"_rot \" << *n << \" \" << *incx << \" \" << *incy << \"\\n\";\n  if(*n<=0) return 0;\n\n  Scalar* x = reinterpret_cast<Scalar*>(px);\n  Scalar* y = reinterpret_cast<Scalar*>(py);\n  Scalar c = *reinterpret_cast<Scalar*>(pc);\n  Scalar s = *reinterpret_cast<Scalar*>(ps);\n\n  StridedVectorType vx(vector(x,*n,std::abs(*incx)));\n  StridedVectorType vy(vector(y,*n,std::abs(*incy)));\n\n  Reverse<StridedVectorType> rvx(vx);\n  Reverse<StridedVectorType> rvy(vy);\n\n       if(*incx<0 && *incy>0) internal::apply_rotation_in_the_plane(rvx, vy, JacobiRotation<Scalar>(c,s));\n  else if(*incx>0 && *incy<0) internal::apply_rotation_in_the_plane(vx, rvy, JacobiRotation<Scalar>(c,s));\n  else                        internal::apply_rotation_in_the_plane(vx, vy,  JacobiRotation<Scalar>(c,s));\n\n\n  return 0;\n}\n\n/*\n// performs rotation of points in the modified plane.\nint EIGEN_BLAS_FUNC(rotm)(int *n, RealScalar *px, int *incx, RealScalar *py, int *incy, RealScalar *param)\n{\n  Scalar* x = reinterpret_cast<Scalar*>(px);\n  Scalar* y = reinterpret_cast<Scalar*>(py);\n\n  // TODO\n\n  return 0;\n}\n\n// computes the modified parameters for a Givens rotation.\nint EIGEN_BLAS_FUNC(rotmg)(RealScalar *d1, RealScalar *d2, RealScalar *x1, RealScalar *x2, RealScalar *param)\n{\n  // TODO\n\n  return 0;\n}\n*/\n"
  },
  {
    "path": "libs/eigen/blas/level2_cplx_impl.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"common.h\"\n\n/**  ZHEMV  performs the matrix-vector  operation\n  *\n  *     y := alpha*A*x + beta*y,\n  *\n  *  where alpha and beta are scalars, x and y are n element vectors and\n  *  A is an n by n hermitian matrix.\n  */\nint EIGEN_BLAS_FUNC(hemv)(char *uplo, int *n, RealScalar *palpha, RealScalar *pa, int *lda, RealScalar *px, int *incx, RealScalar *pbeta, RealScalar *py, int *incy)\n{\n  typedef void (*functype)(int, const Scalar*, int, const Scalar*, int, Scalar*, Scalar);\n  static functype func[2];\n\n  static bool init = false;\n  if(!init)\n  {\n    for(int k=0; k<2; ++k)\n      func[k] = 0;\n\n    func[UP] = (internal::selfadjoint_matrix_vector_product<Scalar,int,ColMajor,Upper,false,false>::run);\n    func[LO] = (internal::selfadjoint_matrix_vector_product<Scalar,int,ColMajor,Lower,false,false>::run);\n\n    init = true;\n  }\n\n  Scalar* a = reinterpret_cast<Scalar*>(pa);\n  Scalar* x = reinterpret_cast<Scalar*>(px);\n  Scalar* y = reinterpret_cast<Scalar*>(py);\n  Scalar alpha  = *reinterpret_cast<Scalar*>(palpha);\n  Scalar beta   = *reinterpret_cast<Scalar*>(pbeta);\n\n  // check arguments\n  int info = 0;\n  if(UPLO(*uplo)==INVALID)        info = 1;\n  else if(*n<0)                   info = 2;\n  else if(*lda<std::max(1,*n))    info = 5;\n  else if(*incx==0)               info = 7;\n  else if(*incy==0)               info = 10;\n  if(info)\n    return xerbla_(SCALAR_SUFFIX_UP\"HEMV \",&info,6);\n\n  if(*n==0)\n    return 1;\n\n  Scalar* actual_x = get_compact_vector(x,*n,*incx);\n  Scalar* actual_y = get_compact_vector(y,*n,*incy);\n\n  if(beta!=Scalar(1))\n  {\n    if(beta==Scalar(0)) vector(actual_y, *n).setZero();\n    else                vector(actual_y, *n) *= beta;\n  }\n\n  if(alpha!=Scalar(0))\n  {\n    int code = UPLO(*uplo);\n    if(code>=2 || func[code]==0)\n      return 0;\n\n    func[code](*n, a, *lda, actual_x, 1, actual_y, alpha);\n  }\n\n  if(actual_x!=x) delete[] actual_x;\n  if(actual_y!=y) delete[] copy_back(actual_y,y,*n,*incy);\n\n  return 1;\n}\n\n/**  ZHBMV  performs the matrix-vector  operation\n  *\n  *     y := alpha*A*x + beta*y,\n  *\n  *  where alpha and beta are scalars, x and y are n element vectors and\n  *  A is an n by n hermitian band matrix, with k super-diagonals.\n  */\n// int EIGEN_BLAS_FUNC(hbmv)(char *uplo, int *n, int *k, RealScalar *alpha, RealScalar *a, int *lda,\n//                           RealScalar *x, int *incx, RealScalar *beta, RealScalar *y, int *incy)\n// {\n//   return 1;\n// }\n\n/**  ZHPMV  performs the matrix-vector operation\n  *\n  *     y := alpha*A*x + beta*y,\n  *\n  *  where alpha and beta are scalars, x and y are n element vectors and\n  *  A is an n by n hermitian matrix, supplied in packed form.\n  */\n// int EIGEN_BLAS_FUNC(hpmv)(char *uplo, int *n, RealScalar *alpha, RealScalar *ap, RealScalar *x, int *incx, RealScalar *beta, RealScalar *y, int *incy)\n// {\n//   return 1;\n// }\n\n/**  ZHPR    performs the hermitian rank 1 operation\n  *\n  *     A := alpha*x*conjg( x' ) + A,\n  *\n  *  where alpha is a real scalar, x is an n element vector and A is an\n  *  n by n hermitian matrix, supplied in packed form.\n  */\nint EIGEN_BLAS_FUNC(hpr)(char *uplo, int *n, RealScalar *palpha, RealScalar *px, int *incx, RealScalar *pap)\n{\n  typedef void (*functype)(int, Scalar*, const Scalar*, RealScalar);\n  static functype func[2];\n\n  static bool init = false;\n  if(!init)\n  {\n    for(int k=0; k<2; ++k)\n      func[k] = 0;\n\n    func[UP] = (internal::selfadjoint_packed_rank1_update<Scalar,int,ColMajor,Upper,false,Conj>::run);\n    func[LO] = (internal::selfadjoint_packed_rank1_update<Scalar,int,ColMajor,Lower,false,Conj>::run);\n\n    init = true;\n  }\n\n  Scalar* x = reinterpret_cast<Scalar*>(px);\n  Scalar* ap = reinterpret_cast<Scalar*>(pap);\n  RealScalar alpha = *palpha;\n\n  int info = 0;\n  if(UPLO(*uplo)==INVALID)                                            info = 1;\n  else if(*n<0)                                                       info = 2;\n  else if(*incx==0)                                                   info = 5;\n  if(info)\n    return xerbla_(SCALAR_SUFFIX_UP\"HPR  \",&info,6);\n\n  if(alpha==Scalar(0))\n    return 1;\n\n  Scalar* x_cpy = get_compact_vector(x, *n, *incx);\n\n  int code = UPLO(*uplo);\n  if(code>=2 || func[code]==0)\n    return 0;\n\n  func[code](*n, ap, x_cpy, alpha);\n\n  if(x_cpy!=x)  delete[] x_cpy;\n\n  return 1;\n}\n\n/**  ZHPR2  performs the hermitian rank 2 operation\n  *\n  *     A := alpha*x*conjg( y' ) + conjg( alpha )*y*conjg( x' ) + A,\n  *\n  *  where alpha is a scalar, x and y are n element vectors and A is an\n  *  n by n hermitian matrix, supplied in packed form.\n  */\nint EIGEN_BLAS_FUNC(hpr2)(char *uplo, int *n, RealScalar *palpha, RealScalar *px, int *incx, RealScalar *py, int *incy, RealScalar *pap)\n{\n  typedef void (*functype)(int, Scalar*, const Scalar*, const Scalar*, Scalar);\n  static functype func[2];\n\n  static bool init = false;\n  if(!init)\n  {\n    for(int k=0; k<2; ++k)\n      func[k] = 0;\n\n    func[UP] = (internal::packed_rank2_update_selector<Scalar,int,Upper>::run);\n    func[LO] = (internal::packed_rank2_update_selector<Scalar,int,Lower>::run);\n\n    init = true;\n  }\n\n  Scalar* x = reinterpret_cast<Scalar*>(px);\n  Scalar* y = reinterpret_cast<Scalar*>(py);\n  Scalar* ap = reinterpret_cast<Scalar*>(pap);\n  Scalar alpha = *reinterpret_cast<Scalar*>(palpha);\n\n  int info = 0;\n  if(UPLO(*uplo)==INVALID)                                            info = 1;\n  else if(*n<0)                                                       info = 2;\n  else if(*incx==0)                                                   info = 5;\n  else if(*incy==0)                                                   info = 7;\n  if(info)\n    return xerbla_(SCALAR_SUFFIX_UP\"HPR2 \",&info,6);\n\n  if(alpha==Scalar(0))\n    return 1;\n\n  Scalar* x_cpy = get_compact_vector(x, *n, *incx);\n  Scalar* y_cpy = get_compact_vector(y, *n, *incy);\n\n  int code = UPLO(*uplo);\n  if(code>=2 || func[code]==0)\n    return 0;\n\n  func[code](*n, ap, x_cpy, y_cpy, alpha);\n\n  if(x_cpy!=x)  delete[] x_cpy;\n  if(y_cpy!=y)  delete[] y_cpy;\n\n  return 1;\n}\n\n/**  ZHER   performs the hermitian rank 1 operation\n  *\n  *     A := alpha*x*conjg( x' ) + A,\n  *\n  *  where alpha is a real scalar, x is an n element vector and A is an\n  *  n by n hermitian matrix.\n  */\nint EIGEN_BLAS_FUNC(her)(char *uplo, int *n, RealScalar *palpha, RealScalar *px, int *incx, RealScalar *pa, int *lda)\n{\n  typedef void (*functype)(int, Scalar*, int, const Scalar*, const Scalar*, const Scalar&);\n  static functype func[2];\n\n  static bool init = false;\n  if(!init)\n  {\n    for(int k=0; k<2; ++k)\n      func[k] = 0;\n\n    func[UP] = (selfadjoint_rank1_update<Scalar,int,ColMajor,Upper,false,Conj>::run);\n    func[LO] = (selfadjoint_rank1_update<Scalar,int,ColMajor,Lower,false,Conj>::run);\n\n    init = true;\n  }\n\n  Scalar* x = reinterpret_cast<Scalar*>(px);\n  Scalar* a = reinterpret_cast<Scalar*>(pa);\n  RealScalar alpha = *reinterpret_cast<RealScalar*>(palpha);\n\n  int info = 0;\n  if(UPLO(*uplo)==INVALID)                                            info = 1;\n  else if(*n<0)                                                       info = 2;\n  else if(*incx==0)                                                   info = 5;\n  else if(*lda<std::max(1,*n))                                        info = 7;\n  if(info)\n    return xerbla_(SCALAR_SUFFIX_UP\"HER  \",&info,6);\n\n  if(alpha==RealScalar(0))\n    return 1;\n\n  Scalar* x_cpy = get_compact_vector(x, *n, *incx);\n\n  int code = UPLO(*uplo);\n  if(code>=2 || func[code]==0)\n    return 0;\n\n  func[code](*n, a, *lda, x_cpy, x_cpy, alpha);\n\n  matrix(a,*n,*n,*lda).diagonal().imag().setZero();\n\n  if(x_cpy!=x)  delete[] x_cpy;\n\n  return 1;\n}\n\n/**  ZHER2  performs the hermitian rank 2 operation\n  *\n  *     A := alpha*x*conjg( y' ) + conjg( alpha )*y*conjg( x' ) + A,\n  *\n  *  where alpha is a scalar, x and y are n element vectors and A is an n\n  *  by n hermitian matrix.\n  */\nint EIGEN_BLAS_FUNC(her2)(char *uplo, int *n, RealScalar *palpha, RealScalar *px, int *incx, RealScalar *py, int *incy, RealScalar *pa, int *lda)\n{\n  typedef void (*functype)(int, Scalar*, int, const Scalar*, const Scalar*, Scalar);\n  static functype func[2];\n\n  static bool init = false;\n  if(!init)\n  {\n    for(int k=0; k<2; ++k)\n      func[k] = 0;\n\n    func[UP] = (internal::rank2_update_selector<Scalar,int,Upper>::run);\n    func[LO] = (internal::rank2_update_selector<Scalar,int,Lower>::run);\n\n    init = true;\n  }\n\n  Scalar* x = reinterpret_cast<Scalar*>(px);\n  Scalar* y = reinterpret_cast<Scalar*>(py);\n  Scalar* a = reinterpret_cast<Scalar*>(pa);\n  Scalar alpha = *reinterpret_cast<Scalar*>(palpha);\n\n  int info = 0;\n  if(UPLO(*uplo)==INVALID)                                            info = 1;\n  else if(*n<0)                                                       info = 2;\n  else if(*incx==0)                                                   info = 5;\n  else if(*incy==0)                                                   info = 7;\n  else if(*lda<std::max(1,*n))                                        info = 9;\n  if(info)\n    return xerbla_(SCALAR_SUFFIX_UP\"HER2 \",&info,6);\n\n  if(alpha==Scalar(0))\n    return 1;\n\n  Scalar* x_cpy = get_compact_vector(x, *n, *incx);\n  Scalar* y_cpy = get_compact_vector(y, *n, *incy);\n\n  int code = UPLO(*uplo);\n  if(code>=2 || func[code]==0)\n    return 0;\n\n  func[code](*n, a, *lda, x_cpy, y_cpy, alpha);\n\n  matrix(a,*n,*n,*lda).diagonal().imag().setZero();\n\n  if(x_cpy!=x)  delete[] x_cpy;\n  if(y_cpy!=y)  delete[] y_cpy;\n\n  return 1;\n}\n\n/**  ZGERU  performs the rank 1 operation\n  *\n  *     A := alpha*x*y' + A,\n  *\n  *  where alpha is a scalar, x is an m element vector, y is an n element\n  *  vector and A is an m by n matrix.\n  */\nint EIGEN_BLAS_FUNC(geru)(int *m, int *n, RealScalar *palpha, RealScalar *px, int *incx, RealScalar *py, int *incy, RealScalar *pa, int *lda)\n{\n  Scalar* x = reinterpret_cast<Scalar*>(px);\n  Scalar* y = reinterpret_cast<Scalar*>(py);\n  Scalar* a = reinterpret_cast<Scalar*>(pa);\n  Scalar alpha = *reinterpret_cast<Scalar*>(palpha);\n\n  int info = 0;\n       if(*m<0)                                                       info = 1;\n  else if(*n<0)                                                       info = 2;\n  else if(*incx==0)                                                   info = 5;\n  else if(*incy==0)                                                   info = 7;\n  else if(*lda<std::max(1,*m))                                        info = 9;\n  if(info)\n    return xerbla_(SCALAR_SUFFIX_UP\"GERU \",&info,6);\n\n  if(alpha==Scalar(0))\n    return 1;\n\n  Scalar* x_cpy = get_compact_vector(x,*m,*incx);\n  Scalar* y_cpy = get_compact_vector(y,*n,*incy);\n\n  internal::general_rank1_update<Scalar,int,ColMajor,false,false>::run(*m, *n, a, *lda, x_cpy, y_cpy, alpha);\n\n  if(x_cpy!=x)  delete[] x_cpy;\n  if(y_cpy!=y)  delete[] y_cpy;\n\n  return 1;\n}\n\n/**  ZGERC  performs the rank 1 operation\n  *\n  *     A := alpha*x*conjg( y' ) + A,\n  *\n  *  where alpha is a scalar, x is an m element vector, y is an n element\n  *  vector and A is an m by n matrix.\n  */\nint EIGEN_BLAS_FUNC(gerc)(int *m, int *n, RealScalar *palpha, RealScalar *px, int *incx, RealScalar *py, int *incy, RealScalar *pa, int *lda)\n{\n  Scalar* x = reinterpret_cast<Scalar*>(px);\n  Scalar* y = reinterpret_cast<Scalar*>(py);\n  Scalar* a = reinterpret_cast<Scalar*>(pa);\n  Scalar alpha = *reinterpret_cast<Scalar*>(palpha);\n\n  int info = 0;\n       if(*m<0)                                                       info = 1;\n  else if(*n<0)                                                       info = 2;\n  else if(*incx==0)                                                   info = 5;\n  else if(*incy==0)                                                   info = 7;\n  else if(*lda<std::max(1,*m))                                        info = 9;\n  if(info)\n    return xerbla_(SCALAR_SUFFIX_UP\"GERC \",&info,6);\n\n  if(alpha==Scalar(0))\n    return 1;\n\n  Scalar* x_cpy = get_compact_vector(x,*m,*incx);\n  Scalar* y_cpy = get_compact_vector(y,*n,*incy);\n\n  internal::general_rank1_update<Scalar,int,ColMajor,false,Conj>::run(*m, *n, a, *lda, x_cpy, y_cpy, alpha);\n\n  if(x_cpy!=x)  delete[] x_cpy;\n  if(y_cpy!=y)  delete[] y_cpy;\n\n  return 1;\n}\n"
  },
  {
    "path": "libs/eigen/blas/level2_impl.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"common.h\"\n\nint EIGEN_BLAS_FUNC(gemv)(char *opa, int *m, int *n, RealScalar *palpha, RealScalar *pa, int *lda, RealScalar *pb, int *incb, RealScalar *pbeta, RealScalar *pc, int *incc)\n{\n  typedef void (*functype)(int, int, const Scalar *, int, const Scalar *, int , Scalar *, int, Scalar);\n  static functype func[4];\n\n  static bool init = false;\n  if(!init)\n  {\n    for(int k=0; k<4; ++k)\n      func[k] = 0;\n\n    func[NOTR] = (internal::general_matrix_vector_product<int,Scalar,ColMajor,false,Scalar,false>::run);\n    func[TR  ] = (internal::general_matrix_vector_product<int,Scalar,RowMajor,false,Scalar,false>::run);\n    func[ADJ ] = (internal::general_matrix_vector_product<int,Scalar,RowMajor,Conj, Scalar,false>::run);\n\n    init = true;\n  }\n\n  Scalar* a = reinterpret_cast<Scalar*>(pa);\n  Scalar* b = reinterpret_cast<Scalar*>(pb);\n  Scalar* c = reinterpret_cast<Scalar*>(pc);\n  Scalar alpha  = *reinterpret_cast<Scalar*>(palpha);\n  Scalar beta   = *reinterpret_cast<Scalar*>(pbeta);\n\n  // check arguments\n  int info = 0;\n  if(OP(*opa)==INVALID)           info = 1;\n  else if(*m<0)                   info = 2;\n  else if(*n<0)                   info = 3;\n  else if(*lda<std::max(1,*m))    info = 6;\n  else if(*incb==0)               info = 8;\n  else if(*incc==0)               info = 11;\n  if(info)\n    return xerbla_(SCALAR_SUFFIX_UP\"GEMV \",&info,6);\n\n  if(*m==0 || *n==0 || (alpha==Scalar(0) && beta==Scalar(1)))\n    return 0;\n\n  int actual_m = *m;\n  int actual_n = *n;\n  int code = OP(*opa);\n  if(code!=NOTR)\n    std::swap(actual_m,actual_n);\n\n  Scalar* actual_b = get_compact_vector(b,actual_n,*incb);\n  Scalar* actual_c = get_compact_vector(c,actual_m,*incc);\n\n  if(beta!=Scalar(1))\n  {\n    if(beta==Scalar(0)) vector(actual_c, actual_m).setZero();\n    else                vector(actual_c, actual_m) *= beta;\n  }\n\n  if(code>=4 || func[code]==0)\n    return 0;\n\n  func[code](actual_m, actual_n, a, *lda, actual_b, 1, actual_c, 1, alpha);\n\n  if(actual_b!=b) delete[] actual_b;\n  if(actual_c!=c) delete[] copy_back(actual_c,c,actual_m,*incc);\n\n  return 1;\n}\n\nint EIGEN_BLAS_FUNC(trsv)(char *uplo, char *opa, char *diag, int *n, RealScalar *pa, int *lda, RealScalar *pb, int *incb)\n{\n  typedef void (*functype)(int, const Scalar *, int, Scalar *);\n  static functype func[16];\n\n  static bool init = false;\n  if(!init)\n  {\n    for(int k=0; k<16; ++k)\n      func[k] = 0;\n\n    func[NOTR  | (UP << 2) | (NUNIT << 3)] = (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|0,       false,ColMajor>::run);\n    func[TR    | (UP << 2) | (NUNIT << 3)] = (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|0,       false,RowMajor>::run);\n    func[ADJ   | (UP << 2) | (NUNIT << 3)] = (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|0,       Conj, RowMajor>::run);\n\n    func[NOTR  | (LO << 2) | (NUNIT << 3)] = (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|0,       false,ColMajor>::run);\n    func[TR    | (LO << 2) | (NUNIT << 3)] = (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|0,       false,RowMajor>::run);\n    func[ADJ   | (LO << 2) | (NUNIT << 3)] = (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|0,       Conj, RowMajor>::run);\n\n    func[NOTR  | (UP << 2) | (UNIT  << 3)] = (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|UnitDiag,false,ColMajor>::run);\n    func[TR    | (UP << 2) | (UNIT  << 3)] = (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|UnitDiag,false,RowMajor>::run);\n    func[ADJ   | (UP << 2) | (UNIT  << 3)] = (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|UnitDiag,Conj, RowMajor>::run);\n\n    func[NOTR  | (LO << 2) | (UNIT  << 3)] = (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|UnitDiag,false,ColMajor>::run);\n    func[TR    | (LO << 2) | (UNIT  << 3)] = (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|UnitDiag,false,RowMajor>::run);\n    func[ADJ   | (LO << 2) | (UNIT  << 3)] = (internal::triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|UnitDiag,Conj, RowMajor>::run);\n\n    init = true;\n  }\n\n  Scalar* a = reinterpret_cast<Scalar*>(pa);\n  Scalar* b = reinterpret_cast<Scalar*>(pb);\n\n  int info = 0;\n  if(UPLO(*uplo)==INVALID)                                            info = 1;\n  else if(OP(*opa)==INVALID)                                          info = 2;\n  else if(DIAG(*diag)==INVALID)                                       info = 3;\n  else if(*n<0)                                                       info = 4;\n  else if(*lda<std::max(1,*n))                                        info = 6;\n  else if(*incb==0)                                                   info = 8;\n  if(info)\n    return xerbla_(SCALAR_SUFFIX_UP\"TRSV \",&info,6);\n\n  Scalar* actual_b = get_compact_vector(b,*n,*incb);\n\n  int code = OP(*opa) | (UPLO(*uplo) << 2) | (DIAG(*diag) << 3);\n  func[code](*n, a, *lda, actual_b);\n\n  if(actual_b!=b) delete[] copy_back(actual_b,b,*n,*incb);\n\n  return 0;\n}\n\n\n\nint EIGEN_BLAS_FUNC(trmv)(char *uplo, char *opa, char *diag, int *n, RealScalar *pa, int *lda, RealScalar *pb, int *incb)\n{\n  typedef void (*functype)(int, int, const Scalar *, int, const Scalar *, int, Scalar *, int, const Scalar&);\n  static functype func[16];\n\n  static bool init = false;\n  if(!init)\n  {\n    for(int k=0; k<16; ++k)\n      func[k] = 0;\n\n    func[NOTR  | (UP << 2) | (NUNIT << 3)] = (internal::triangular_matrix_vector_product<int,Upper|0,       Scalar,false,Scalar,false,ColMajor>::run);\n    func[TR    | (UP << 2) | (NUNIT << 3)] = (internal::triangular_matrix_vector_product<int,Lower|0,       Scalar,false,Scalar,false,RowMajor>::run);\n    func[ADJ   | (UP << 2) | (NUNIT << 3)] = (internal::triangular_matrix_vector_product<int,Lower|0,       Scalar,Conj, Scalar,false,RowMajor>::run);\n\n    func[NOTR  | (LO << 2) | (NUNIT << 3)] = (internal::triangular_matrix_vector_product<int,Lower|0,       Scalar,false,Scalar,false,ColMajor>::run);\n    func[TR    | (LO << 2) | (NUNIT << 3)] = (internal::triangular_matrix_vector_product<int,Upper|0,       Scalar,false,Scalar,false,RowMajor>::run);\n    func[ADJ   | (LO << 2) | (NUNIT << 3)] = (internal::triangular_matrix_vector_product<int,Upper|0,       Scalar,Conj, Scalar,false,RowMajor>::run);\n\n    func[NOTR  | (UP << 2) | (UNIT  << 3)] = (internal::triangular_matrix_vector_product<int,Upper|UnitDiag,Scalar,false,Scalar,false,ColMajor>::run);\n    func[TR    | (UP << 2) | (UNIT  << 3)] = (internal::triangular_matrix_vector_product<int,Lower|UnitDiag,Scalar,false,Scalar,false,RowMajor>::run);\n    func[ADJ   | (UP << 2) | (UNIT  << 3)] = (internal::triangular_matrix_vector_product<int,Lower|UnitDiag,Scalar,Conj, Scalar,false,RowMajor>::run);\n\n    func[NOTR  | (LO << 2) | (UNIT  << 3)] = (internal::triangular_matrix_vector_product<int,Lower|UnitDiag,Scalar,false,Scalar,false,ColMajor>::run);\n    func[TR    | (LO << 2) | (UNIT  << 3)] = (internal::triangular_matrix_vector_product<int,Upper|UnitDiag,Scalar,false,Scalar,false,RowMajor>::run);\n    func[ADJ   | (LO << 2) | (UNIT  << 3)] = (internal::triangular_matrix_vector_product<int,Upper|UnitDiag,Scalar,Conj, Scalar,false,RowMajor>::run);\n\n    init = true;\n  }\n\n  Scalar* a = reinterpret_cast<Scalar*>(pa);\n  Scalar* b = reinterpret_cast<Scalar*>(pb);\n\n  int info = 0;\n  if(UPLO(*uplo)==INVALID)                                            info = 1;\n  else if(OP(*opa)==INVALID)                                          info = 2;\n  else if(DIAG(*diag)==INVALID)                                       info = 3;\n  else if(*n<0)                                                       info = 4;\n  else if(*lda<std::max(1,*n))                                        info = 6;\n  else if(*incb==0)                                                   info = 8;\n  if(info)\n    return xerbla_(SCALAR_SUFFIX_UP\"TRMV \",&info,6);\n\n  if(*n==0)\n    return 1;\n\n  Scalar* actual_b = get_compact_vector(b,*n,*incb);\n  Matrix<Scalar,Dynamic,1> res(*n);\n  res.setZero();\n\n  int code = OP(*opa) | (UPLO(*uplo) << 2) | (DIAG(*diag) << 3);\n  if(code>=16 || func[code]==0)\n    return 0;\n\n  func[code](*n, *n, a, *lda, actual_b, 1, res.data(), 1, Scalar(1));\n\n  copy_back(res.data(),b,*n,*incb);\n  if(actual_b!=b) delete[] actual_b;\n\n  return 1;\n}\n\n/**  GBMV  performs one of the matrix-vector operations\n  *\n  *     y := alpha*A*x + beta*y,   or   y := alpha*A'*x + beta*y,\n  *\n  *  where alpha and beta are scalars, x and y are vectors and A is an\n  *  m by n band matrix, with kl sub-diagonals and ku super-diagonals.\n  */\nint EIGEN_BLAS_FUNC(gbmv)(char *trans, int *m, int *n, int *kl, int *ku, RealScalar *palpha, RealScalar *pa, int *lda,\n                          RealScalar *px, int *incx, RealScalar *pbeta, RealScalar *py, int *incy)\n{\n  Scalar* a = reinterpret_cast<Scalar*>(pa);\n  Scalar* x = reinterpret_cast<Scalar*>(px);\n  Scalar* y = reinterpret_cast<Scalar*>(py);\n  Scalar alpha = *reinterpret_cast<Scalar*>(palpha);\n  Scalar beta = *reinterpret_cast<Scalar*>(pbeta);\n  int coeff_rows = *kl+*ku+1;\n  \n  int info = 0;\n       if(OP(*trans)==INVALID)                                        info = 1;\n  else if(*m<0)                                                       info = 2;\n  else if(*n<0)                                                       info = 3;\n  else if(*kl<0)                                                      info = 4;\n  else if(*ku<0)                                                      info = 5;\n  else if(*lda<coeff_rows)                                            info = 8;\n  else if(*incx==0)                                                   info = 10;\n  else if(*incy==0)                                                   info = 13;\n  if(info)\n    return xerbla_(SCALAR_SUFFIX_UP\"GBMV \",&info,6);\n  \n  if(*m==0 || *n==0 || (alpha==Scalar(0) && beta==Scalar(1)))\n    return 0;\n  \n  int actual_m = *m;\n  int actual_n = *n;\n  if(OP(*trans)!=NOTR)\n    std::swap(actual_m,actual_n);\n  \n  Scalar* actual_x = get_compact_vector(x,actual_n,*incx);\n  Scalar* actual_y = get_compact_vector(y,actual_m,*incy);\n  \n  if(beta!=Scalar(1))\n  {\n    if(beta==Scalar(0)) vector(actual_y, actual_m).setZero();\n    else                vector(actual_y, actual_m) *= beta;\n  }\n  \n  MatrixType mat_coeffs(a,coeff_rows,*n,*lda);\n  \n  int nb = std::min(*n,(*m)+(*ku));\n  for(int j=0; j<nb; ++j)\n  {\n    int start = std::max(0,j - *ku);\n    int end = std::min((*m)-1,j + *kl);\n    int len = end - start + 1;\n    int offset = (*ku) - j + start;\n    if(OP(*trans)==NOTR)\n      vector(actual_y+start,len) += (alpha*actual_x[j]) * mat_coeffs.col(j).segment(offset,len);\n    else if(OP(*trans)==TR)\n      actual_y[j] += alpha * ( mat_coeffs.col(j).segment(offset,len).transpose() * vector(actual_x+start,len) ).value();\n    else\n      actual_y[j] += alpha * ( mat_coeffs.col(j).segment(offset,len).adjoint()   * vector(actual_x+start,len) ).value();\n  }    \n  \n  if(actual_x!=x) delete[] actual_x;\n  if(actual_y!=y) delete[] copy_back(actual_y,y,actual_m,*incy);\n  \n  return 0;\n}\n\n#if 0\n/**  TBMV  performs one of the matrix-vector operations\n  *\n  *     x := A*x,   or   x := A'*x,\n  *\n  *  where x is an n element vector and  A is an n by n unit, or non-unit,\n  *  upper or lower triangular band matrix, with ( k + 1 ) diagonals.\n  */\nint EIGEN_BLAS_FUNC(tbmv)(char *uplo, char *opa, char *diag, int *n, int *k, RealScalar *pa, int *lda, RealScalar *px, int *incx)\n{\n  Scalar* a = reinterpret_cast<Scalar*>(pa);\n  Scalar* x = reinterpret_cast<Scalar*>(px);\n  int coeff_rows = *k + 1;\n  \n  int info = 0;\n       if(UPLO(*uplo)==INVALID)                                       info = 1;\n  else if(OP(*opa)==INVALID)                                          info = 2;\n  else if(DIAG(*diag)==INVALID)                                       info = 3;\n  else if(*n<0)                                                       info = 4;\n  else if(*k<0)                                                       info = 5;\n  else if(*lda<coeff_rows)                                            info = 7;\n  else if(*incx==0)                                                   info = 9;\n  if(info)\n    return xerbla_(SCALAR_SUFFIX_UP\"TBMV \",&info,6);\n  \n  if(*n==0)\n    return 0;\n  \n  int actual_n = *n;\n  \n  Scalar* actual_x = get_compact_vector(x,actual_n,*incx);\n  \n  MatrixType mat_coeffs(a,coeff_rows,*n,*lda);\n  \n  int ku = UPLO(*uplo)==UPPER ? *k : 0;\n  int kl = UPLO(*uplo)==LOWER ? *k : 0;\n  \n  for(int j=0; j<*n; ++j)\n  {\n    int start = std::max(0,j - ku);\n    int end = std::min((*m)-1,j + kl);\n    int len = end - start + 1;\n    int offset = (ku) - j + start;\n    \n    if(OP(*trans)==NOTR)\n      vector(actual_y+start,len) += (alpha*actual_x[j]) * mat_coeffs.col(j).segment(offset,len);\n    else if(OP(*trans)==TR)\n      actual_y[j] += alpha * ( mat_coeffs.col(j).segment(offset,len).transpose() * vector(actual_x+start,len) ).value();\n    else\n      actual_y[j] += alpha * ( mat_coeffs.col(j).segment(offset,len).adjoint()   * vector(actual_x+start,len) ).value();\n  }    \n  \n  if(actual_x!=x) delete[] actual_x;\n  if(actual_y!=y) delete[] copy_back(actual_y,y,actual_m,*incy);\n  \n  return 0;\n}\n#endif\n\n/**  DTBSV  solves one of the systems of equations\n  *\n  *     A*x = b,   or   A'*x = b,\n  *\n  *  where b and x are n element vectors and A is an n by n unit, or\n  *  non-unit, upper or lower triangular band matrix, with ( k + 1 )\n  *  diagonals.\n  *\n  *  No test for singularity or near-singularity is included in this\n  *  routine. Such tests must be performed before calling this routine.\n  */\nint EIGEN_BLAS_FUNC(tbsv)(char *uplo, char *op, char *diag, int *n, int *k, RealScalar *pa, int *lda, RealScalar *px, int *incx)\n{\n  typedef void (*functype)(int, int, const Scalar *, int, Scalar *);\n  static functype func[16];\n\n  static bool init = false;\n  if(!init)\n  {\n    for(int k=0; k<16; ++k)\n      func[k] = 0;\n\n    func[NOTR  | (UP << 2) | (NUNIT << 3)] = (internal::band_solve_triangular_selector<int,Upper|0,       Scalar,false,Scalar,ColMajor>::run);\n    func[TR    | (UP << 2) | (NUNIT << 3)] = (internal::band_solve_triangular_selector<int,Lower|0,       Scalar,false,Scalar,RowMajor>::run);\n    func[ADJ   | (UP << 2) | (NUNIT << 3)] = (internal::band_solve_triangular_selector<int,Lower|0,       Scalar,Conj, Scalar,RowMajor>::run);\n\n    func[NOTR  | (LO << 2) | (NUNIT << 3)] = (internal::band_solve_triangular_selector<int,Lower|0,       Scalar,false,Scalar,ColMajor>::run);\n    func[TR    | (LO << 2) | (NUNIT << 3)] = (internal::band_solve_triangular_selector<int,Upper|0,       Scalar,false,Scalar,RowMajor>::run);\n    func[ADJ   | (LO << 2) | (NUNIT << 3)] = (internal::band_solve_triangular_selector<int,Upper|0,       Scalar,Conj, Scalar,RowMajor>::run);\n\n    func[NOTR  | (UP << 2) | (UNIT  << 3)] = (internal::band_solve_triangular_selector<int,Upper|UnitDiag,Scalar,false,Scalar,ColMajor>::run);\n    func[TR    | (UP << 2) | (UNIT  << 3)] = (internal::band_solve_triangular_selector<int,Lower|UnitDiag,Scalar,false,Scalar,RowMajor>::run);\n    func[ADJ   | (UP << 2) | (UNIT  << 3)] = (internal::band_solve_triangular_selector<int,Lower|UnitDiag,Scalar,Conj, Scalar,RowMajor>::run);\n\n    func[NOTR  | (LO << 2) | (UNIT  << 3)] = (internal::band_solve_triangular_selector<int,Lower|UnitDiag,Scalar,false,Scalar,ColMajor>::run);\n    func[TR    | (LO << 2) | (UNIT  << 3)] = (internal::band_solve_triangular_selector<int,Upper|UnitDiag,Scalar,false,Scalar,RowMajor>::run);\n    func[ADJ   | (LO << 2) | (UNIT  << 3)] = (internal::band_solve_triangular_selector<int,Upper|UnitDiag,Scalar,Conj, Scalar,RowMajor>::run);\n\n    init = true;\n  }\n\n  Scalar* a = reinterpret_cast<Scalar*>(pa);\n  Scalar* x = reinterpret_cast<Scalar*>(px);\n  int coeff_rows = *k+1;\n  \n  int info = 0;\n       if(UPLO(*uplo)==INVALID)                                       info = 1;\n  else if(OP(*op)==INVALID)                                           info = 2;\n  else if(DIAG(*diag)==INVALID)                                       info = 3;\n  else if(*n<0)                                                       info = 4;\n  else if(*k<0)                                                       info = 5;\n  else if(*lda<coeff_rows)                                            info = 7;\n  else if(*incx==0)                                                   info = 9;\n  if(info)\n    return xerbla_(SCALAR_SUFFIX_UP\"TBSV \",&info,6);\n  \n  if(*n==0 || (*k==0 && DIAG(*diag)==UNIT))\n    return 0;\n  \n  int actual_n = *n;\n \n  Scalar* actual_x = get_compact_vector(x,actual_n,*incx);\n  \n  int code = OP(*op) | (UPLO(*uplo) << 2) | (DIAG(*diag) << 3);\n  if(code>=16 || func[code]==0)\n    return 0;\n\n  func[code](*n, *k, a, *lda, actual_x);\n  \n  if(actual_x!=x) delete[] copy_back(actual_x,x,actual_n,*incx);\n  \n  return 0;\n}\n\n/**  DTPMV  performs one of the matrix-vector operations\n  *\n  *     x := A*x,   or   x := A'*x,\n  *\n  *  where x is an n element vector and  A is an n by n unit, or non-unit,\n  *  upper or lower triangular matrix, supplied in packed form.\n  */\nint EIGEN_BLAS_FUNC(tpmv)(char *uplo, char *opa, char *diag, int *n, RealScalar *pap, RealScalar *px, int *incx)\n{\n  typedef void (*functype)(int, const Scalar*, const Scalar*, Scalar*, Scalar);\n  static functype func[16];\n\n  static bool init = false;\n  if(!init)\n  {\n    for(int k=0; k<16; ++k)\n      func[k] = 0;\n\n    func[NOTR  | (UP << 2) | (NUNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Upper|0,       Scalar,false,Scalar,false,ColMajor>::run);\n    func[TR    | (UP << 2) | (NUNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Lower|0,       Scalar,false,Scalar,false,RowMajor>::run);\n    func[ADJ   | (UP << 2) | (NUNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Lower|0,       Scalar,Conj, Scalar,false,RowMajor>::run);\n\n    func[NOTR  | (LO << 2) | (NUNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Lower|0,       Scalar,false,Scalar,false,ColMajor>::run);\n    func[TR    | (LO << 2) | (NUNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Upper|0,       Scalar,false,Scalar,false,RowMajor>::run);\n    func[ADJ   | (LO << 2) | (NUNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Upper|0,       Scalar,Conj, Scalar,false,RowMajor>::run);\n\n    func[NOTR  | (UP << 2) | (UNIT  << 3)] = (internal::packed_triangular_matrix_vector_product<int,Upper|UnitDiag,Scalar,false,Scalar,false,ColMajor>::run);\n    func[TR    | (UP << 2) | (UNIT  << 3)] = (internal::packed_triangular_matrix_vector_product<int,Lower|UnitDiag,Scalar,false,Scalar,false,RowMajor>::run);\n    func[ADJ   | (UP << 2) | (UNIT  << 3)] = (internal::packed_triangular_matrix_vector_product<int,Lower|UnitDiag,Scalar,Conj, Scalar,false,RowMajor>::run);\n\n    func[NOTR  | (LO << 2) | (UNIT  << 3)] = (internal::packed_triangular_matrix_vector_product<int,Lower|UnitDiag,Scalar,false,Scalar,false,ColMajor>::run);\n    func[TR    | (LO << 2) | (UNIT  << 3)] = (internal::packed_triangular_matrix_vector_product<int,Upper|UnitDiag,Scalar,false,Scalar,false,RowMajor>::run);\n    func[ADJ   | (LO << 2) | (UNIT  << 3)] = (internal::packed_triangular_matrix_vector_product<int,Upper|UnitDiag,Scalar,Conj, Scalar,false,RowMajor>::run);\n\n    init = true;\n  }\n\n  Scalar* ap = reinterpret_cast<Scalar*>(pap);\n  Scalar* x = reinterpret_cast<Scalar*>(px);\n\n  int info = 0;\n  if(UPLO(*uplo)==INVALID)                                            info = 1;\n  else if(OP(*opa)==INVALID)                                          info = 2;\n  else if(DIAG(*diag)==INVALID)                                       info = 3;\n  else if(*n<0)                                                       info = 4;\n  else if(*incx==0)                                                   info = 7;\n  if(info)\n    return xerbla_(SCALAR_SUFFIX_UP\"TPMV \",&info,6);\n\n  if(*n==0)\n    return 1;\n\n  Scalar* actual_x = get_compact_vector(x,*n,*incx);\n  Matrix<Scalar,Dynamic,1> res(*n);\n  res.setZero();\n\n  int code = OP(*opa) | (UPLO(*uplo) << 2) | (DIAG(*diag) << 3);\n  if(code>=16 || func[code]==0)\n    return 0;\n\n  func[code](*n, ap, actual_x, res.data(), Scalar(1));\n\n  copy_back(res.data(),x,*n,*incx);\n  if(actual_x!=x) delete[] actual_x;\n\n  return 1;\n}\n\n/**  DTPSV  solves one of the systems of equations\n  *\n  *     A*x = b,   or   A'*x = b,\n  *\n  *  where b and x are n element vectors and A is an n by n unit, or\n  *  non-unit, upper or lower triangular matrix, supplied in packed form.\n  *\n  *  No test for singularity or near-singularity is included in this\n  *  routine. Such tests must be performed before calling this routine.\n  */\nint EIGEN_BLAS_FUNC(tpsv)(char *uplo, char *opa, char *diag, int *n, RealScalar *pap, RealScalar *px, int *incx)\n{\n  typedef void (*functype)(int, const Scalar*, Scalar*);\n  static functype func[16];\n\n  static bool init = false;\n  if(!init)\n  {\n    for(int k=0; k<16; ++k)\n      func[k] = 0;\n\n    func[NOTR  | (UP << 2) | (NUNIT << 3)] = (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|0,       false,ColMajor>::run);\n    func[TR    | (UP << 2) | (NUNIT << 3)] = (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|0,       false,RowMajor>::run);\n    func[ADJ   | (UP << 2) | (NUNIT << 3)] = (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|0,       Conj, RowMajor>::run);\n\n    func[NOTR  | (LO << 2) | (NUNIT << 3)] = (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|0,       false,ColMajor>::run);\n    func[TR    | (LO << 2) | (NUNIT << 3)] = (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|0,       false,RowMajor>::run);\n    func[ADJ   | (LO << 2) | (NUNIT << 3)] = (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|0,       Conj, RowMajor>::run);\n\n    func[NOTR  | (UP << 2) | (UNIT  << 3)] = (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|UnitDiag,false,ColMajor>::run);\n    func[TR    | (UP << 2) | (UNIT  << 3)] = (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|UnitDiag,false,RowMajor>::run);\n    func[ADJ   | (UP << 2) | (UNIT  << 3)] = (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|UnitDiag,Conj, RowMajor>::run);\n\n    func[NOTR  | (LO << 2) | (UNIT  << 3)] = (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Lower|UnitDiag,false,ColMajor>::run);\n    func[TR    | (LO << 2) | (UNIT  << 3)] = (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|UnitDiag,false,RowMajor>::run);\n    func[ADJ   | (LO << 2) | (UNIT  << 3)] = (internal::packed_triangular_solve_vector<Scalar,Scalar,int,OnTheLeft, Upper|UnitDiag,Conj, RowMajor>::run);\n\n    init = true;\n  }\n\n  Scalar* ap = reinterpret_cast<Scalar*>(pap);\n  Scalar* x = reinterpret_cast<Scalar*>(px);\n\n  int info = 0;\n  if(UPLO(*uplo)==INVALID)                                            info = 1;\n  else if(OP(*opa)==INVALID)                                          info = 2;\n  else if(DIAG(*diag)==INVALID)                                       info = 3;\n  else if(*n<0)                                                       info = 4;\n  else if(*incx==0)                                                   info = 7;\n  if(info)\n    return xerbla_(SCALAR_SUFFIX_UP\"TPSV \",&info,6);\n\n  Scalar* actual_x = get_compact_vector(x,*n,*incx);\n\n  int code = OP(*opa) | (UPLO(*uplo) << 2) | (DIAG(*diag) << 3);\n  func[code](*n, ap, actual_x);\n\n  if(actual_x!=x) delete[] copy_back(actual_x,x,*n,*incx);\n\n  return 1;\n}\n\n"
  },
  {
    "path": "libs/eigen/blas/level2_real_impl.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"common.h\"\n\n// y = alpha*A*x + beta*y\nint EIGEN_BLAS_FUNC(symv) (char *uplo, int *n, RealScalar *palpha, RealScalar *pa, int *lda, RealScalar *px, int *incx, RealScalar *pbeta, RealScalar *py, int *incy)\n{\n  typedef void (*functype)(int, const Scalar*, int, const Scalar*, int, Scalar*, Scalar);\n  static functype func[2];\n\n  static bool init = false;\n  if(!init)\n  {\n    for(int k=0; k<2; ++k)\n      func[k] = 0;\n\n    func[UP] = (internal::selfadjoint_matrix_vector_product<Scalar,int,ColMajor,Upper,false,false>::run);\n    func[LO] = (internal::selfadjoint_matrix_vector_product<Scalar,int,ColMajor,Lower,false,false>::run);\n\n    init = true;\n  }\n\n  Scalar* a = reinterpret_cast<Scalar*>(pa);\n  Scalar* x = reinterpret_cast<Scalar*>(px);\n  Scalar* y = reinterpret_cast<Scalar*>(py);\n  Scalar alpha  = *reinterpret_cast<Scalar*>(palpha);\n  Scalar beta   = *reinterpret_cast<Scalar*>(pbeta);\n\n  // check arguments\n  int info = 0;\n  if(UPLO(*uplo)==INVALID)        info = 1;\n  else if(*n<0)                   info = 2;\n  else if(*lda<std::max(1,*n))    info = 5;\n  else if(*incx==0)               info = 7;\n  else if(*incy==0)               info = 10;\n  if(info)\n    return xerbla_(SCALAR_SUFFIX_UP\"SYMV \",&info,6);\n\n  if(*n==0)\n    return 0;\n\n  Scalar* actual_x = get_compact_vector(x,*n,*incx);\n  Scalar* actual_y = get_compact_vector(y,*n,*incy);\n\n  if(beta!=Scalar(1))\n  {\n    if(beta==Scalar(0)) vector(actual_y, *n).setZero();\n    else                vector(actual_y, *n) *= beta;\n  }\n\n  int code = UPLO(*uplo);\n  if(code>=2 || func[code]==0)\n    return 0;\n\n  func[code](*n, a, *lda, actual_x, 1, actual_y, alpha);\n\n  if(actual_x!=x) delete[] actual_x;\n  if(actual_y!=y) delete[] copy_back(actual_y,y,*n,*incy);\n\n  return 1;\n}\n\n// C := alpha*x*x' + C\nint EIGEN_BLAS_FUNC(syr)(char *uplo, int *n, RealScalar *palpha, RealScalar *px, int *incx, RealScalar *pc, int *ldc)\n{\n\n//   typedef void (*functype)(int, const Scalar *, int, Scalar *, int, Scalar);\n//   static functype func[2];\n\n//   static bool init = false;\n//   if(!init)\n//   {\n//     for(int k=0; k<2; ++k)\n//       func[k] = 0;\n//\n//     func[UP] = (internal::selfadjoint_product<Scalar,ColMajor,ColMajor,false,UpperTriangular>::run);\n//     func[LO] = (internal::selfadjoint_product<Scalar,ColMajor,ColMajor,false,LowerTriangular>::run);\n\n//     init = true;\n//   }\n  typedef void (*functype)(int, Scalar*, int, const Scalar*, const Scalar*, const Scalar&);\n  static functype func[2];\n\n  static bool init = false;\n  if(!init)\n  {\n    for(int k=0; k<2; ++k)\n      func[k] = 0;\n\n    func[UP] = (selfadjoint_rank1_update<Scalar,int,ColMajor,Upper,false,Conj>::run);\n    func[LO] = (selfadjoint_rank1_update<Scalar,int,ColMajor,Lower,false,Conj>::run);\n\n    init = true;\n  }\n\n  Scalar* x = reinterpret_cast<Scalar*>(px);\n  Scalar* c = reinterpret_cast<Scalar*>(pc);\n  Scalar alpha = *reinterpret_cast<Scalar*>(palpha);\n\n  int info = 0;\n  if(UPLO(*uplo)==INVALID)                                            info = 1;\n  else if(*n<0)                                                       info = 2;\n  else if(*incx==0)                                                   info = 5;\n  else if(*ldc<std::max(1,*n))                                        info = 7;\n  if(info)\n    return xerbla_(SCALAR_SUFFIX_UP\"SYR  \",&info,6);\n\n  if(*n==0 || alpha==Scalar(0)) return 1;\n\n  // if the increment is not 1, let's copy it to a temporary vector to enable vectorization\n  Scalar* x_cpy = get_compact_vector(x,*n,*incx);\n\n  int code = UPLO(*uplo);\n  if(code>=2 || func[code]==0)\n    return 0;\n\n  func[code](*n, c, *ldc, x_cpy, x_cpy, alpha);\n\n  if(x_cpy!=x)  delete[] x_cpy;\n\n  return 1;\n}\n\n// C := alpha*x*y' + alpha*y*x' + C\nint EIGEN_BLAS_FUNC(syr2)(char *uplo, int *n, RealScalar *palpha, RealScalar *px, int *incx, RealScalar *py, int *incy, RealScalar *pc, int *ldc)\n{\n//   typedef void (*functype)(int, const Scalar *, int, const Scalar *, int, Scalar *, int, Scalar);\n//   static functype func[2];\n//\n//   static bool init = false;\n//   if(!init)\n//   {\n//     for(int k=0; k<2; ++k)\n//       func[k] = 0;\n//\n//     func[UP] = (internal::selfadjoint_product<Scalar,ColMajor,ColMajor,false,UpperTriangular>::run);\n//     func[LO] = (internal::selfadjoint_product<Scalar,ColMajor,ColMajor,false,LowerTriangular>::run);\n//\n//     init = true;\n//   }\n  typedef void (*functype)(int, Scalar*, int, const Scalar*, const Scalar*, Scalar);\n  static functype func[2];\n\n  static bool init = false;\n  if(!init)\n  {\n    for(int k=0; k<2; ++k)\n      func[k] = 0;\n\n    func[UP] = (internal::rank2_update_selector<Scalar,int,Upper>::run);\n    func[LO] = (internal::rank2_update_selector<Scalar,int,Lower>::run);\n\n    init = true;\n  }\n\n  Scalar* x = reinterpret_cast<Scalar*>(px);\n  Scalar* y = reinterpret_cast<Scalar*>(py);\n  Scalar* c = reinterpret_cast<Scalar*>(pc);\n  Scalar alpha = *reinterpret_cast<Scalar*>(palpha);\n\n  int info = 0;\n  if(UPLO(*uplo)==INVALID)                                            info = 1;\n  else if(*n<0)                                                       info = 2;\n  else if(*incx==0)                                                   info = 5;\n  else if(*incy==0)                                                   info = 7;\n  else if(*ldc<std::max(1,*n))                                        info = 9;\n  if(info)\n    return xerbla_(SCALAR_SUFFIX_UP\"SYR2 \",&info,6);\n\n  if(alpha==Scalar(0))\n    return 1;\n\n  Scalar* x_cpy = get_compact_vector(x,*n,*incx);\n  Scalar* y_cpy = get_compact_vector(y,*n,*incy);\n  \n  int code = UPLO(*uplo);\n  if(code>=2 || func[code]==0)\n    return 0;\n\n  func[code](*n, c, *ldc, x_cpy, y_cpy, alpha);\n\n  if(x_cpy!=x)  delete[] x_cpy;\n  if(y_cpy!=y)  delete[] y_cpy;\n\n//   int code = UPLO(*uplo);\n//   if(code>=2 || func[code]==0)\n//     return 0;\n\n//   func[code](*n, a, *inca, b, *incb, c, *ldc, alpha);\n  return 1;\n}\n\n/**  DSBMV  performs the matrix-vector  operation\n  *\n  *     y := alpha*A*x + beta*y,\n  *\n  *  where alpha and beta are scalars, x and y are n element vectors and\n  *  A is an n by n symmetric band matrix, with k super-diagonals.\n  */\n// int EIGEN_BLAS_FUNC(sbmv)( char *uplo, int *n, int *k, RealScalar *alpha, RealScalar *a, int *lda,\n//                            RealScalar *x, int *incx, RealScalar *beta, RealScalar *y, int *incy)\n// {\n//   return 1;\n// }\n\n\n/**  DSPMV  performs the matrix-vector operation\n  *\n  *     y := alpha*A*x + beta*y,\n  *\n  *  where alpha and beta are scalars, x and y are n element vectors and\n  *  A is an n by n symmetric matrix, supplied in packed form.\n  *\n  */\n// int EIGEN_BLAS_FUNC(spmv)(char *uplo, int *n, RealScalar *alpha, RealScalar *ap, RealScalar *x, int *incx, RealScalar *beta, RealScalar *y, int *incy)\n// {\n//   return 1;\n// }\n\n/**  DSPR    performs the symmetric rank 1 operation\n  *\n  *     A := alpha*x*x' + A,\n  *\n  *  where alpha is a real scalar, x is an n element vector and A is an\n  *  n by n symmetric matrix, supplied in packed form.\n  */\nint EIGEN_BLAS_FUNC(spr)(char *uplo, int *n, Scalar *palpha, Scalar *px, int *incx, Scalar *pap)\n{\n  typedef void (*functype)(int, Scalar*, const Scalar*, Scalar);\n  static functype func[2];\n\n  static bool init = false;\n  if(!init)\n  {\n    for(int k=0; k<2; ++k)\n      func[k] = 0;\n\n    func[UP] = (internal::selfadjoint_packed_rank1_update<Scalar,int,ColMajor,Upper,false,false>::run);\n    func[LO] = (internal::selfadjoint_packed_rank1_update<Scalar,int,ColMajor,Lower,false,false>::run);\n\n    init = true;\n  }\n\n  Scalar* x = reinterpret_cast<Scalar*>(px);\n  Scalar* ap = reinterpret_cast<Scalar*>(pap);\n  Scalar alpha = *reinterpret_cast<Scalar*>(palpha);\n\n  int info = 0;\n  if(UPLO(*uplo)==INVALID)                                            info = 1;\n  else if(*n<0)                                                       info = 2;\n  else if(*incx==0)                                                   info = 5;\n  if(info)\n    return xerbla_(SCALAR_SUFFIX_UP\"SPR  \",&info,6);\n\n  if(alpha==Scalar(0))\n    return 1;\n\n  Scalar* x_cpy = get_compact_vector(x, *n, *incx);\n\n  int code = UPLO(*uplo);\n  if(code>=2 || func[code]==0)\n    return 0;\n\n  func[code](*n, ap, x_cpy, alpha);\n\n  if(x_cpy!=x)  delete[] x_cpy;\n\n  return 1;\n}\n\n/**  DSPR2  performs the symmetric rank 2 operation\n  *\n  *     A := alpha*x*y' + alpha*y*x' + A,\n  *\n  *  where alpha is a scalar, x and y are n element vectors and A is an\n  *  n by n symmetric matrix, supplied in packed form.\n  */\nint EIGEN_BLAS_FUNC(spr2)(char *uplo, int *n, RealScalar *palpha, RealScalar *px, int *incx, RealScalar *py, int *incy, RealScalar *pap)\n{\n  typedef void (*functype)(int, Scalar*, const Scalar*, const Scalar*, Scalar);\n  static functype func[2];\n\n  static bool init = false;\n  if(!init)\n  {\n    for(int k=0; k<2; ++k)\n      func[k] = 0;\n\n    func[UP] = (internal::packed_rank2_update_selector<Scalar,int,Upper>::run);\n    func[LO] = (internal::packed_rank2_update_selector<Scalar,int,Lower>::run);\n\n    init = true;\n  }\n\n  Scalar* x = reinterpret_cast<Scalar*>(px);\n  Scalar* y = reinterpret_cast<Scalar*>(py);\n  Scalar* ap = reinterpret_cast<Scalar*>(pap);\n  Scalar alpha = *reinterpret_cast<Scalar*>(palpha);\n\n  int info = 0;\n  if(UPLO(*uplo)==INVALID)                                            info = 1;\n  else if(*n<0)                                                       info = 2;\n  else if(*incx==0)                                                   info = 5;\n  else if(*incy==0)                                                   info = 7;\n  if(info)\n    return xerbla_(SCALAR_SUFFIX_UP\"SPR2 \",&info,6);\n\n  if(alpha==Scalar(0))\n    return 1;\n\n  Scalar* x_cpy = get_compact_vector(x, *n, *incx);\n  Scalar* y_cpy = get_compact_vector(y, *n, *incy);\n\n  int code = UPLO(*uplo);\n  if(code>=2 || func[code]==0)\n    return 0;\n\n  func[code](*n, ap, x_cpy, y_cpy, alpha);\n\n  if(x_cpy!=x)  delete[] x_cpy;\n  if(y_cpy!=y)  delete[] y_cpy;\n\n  return 1;\n}\n\n/**  DGER   performs the rank 1 operation\n  *\n  *     A := alpha*x*y' + A,\n  *\n  *  where alpha is a scalar, x is an m element vector, y is an n element\n  *  vector and A is an m by n matrix.\n  */\nint EIGEN_BLAS_FUNC(ger)(int *m, int *n, Scalar *palpha, Scalar *px, int *incx, Scalar *py, int *incy, Scalar *pa, int *lda)\n{\n  Scalar* x = reinterpret_cast<Scalar*>(px);\n  Scalar* y = reinterpret_cast<Scalar*>(py);\n  Scalar* a = reinterpret_cast<Scalar*>(pa);\n  Scalar alpha = *reinterpret_cast<Scalar*>(palpha);\n\n  int info = 0;\n       if(*m<0)                                                       info = 1;\n  else if(*n<0)                                                       info = 2;\n  else if(*incx==0)                                                   info = 5;\n  else if(*incy==0)                                                   info = 7;\n  else if(*lda<std::max(1,*m))                                        info = 9;\n  if(info)\n    return xerbla_(SCALAR_SUFFIX_UP\"GER  \",&info,6);\n\n  if(alpha==Scalar(0))\n    return 1;\n\n  Scalar* x_cpy = get_compact_vector(x,*m,*incx);\n  Scalar* y_cpy = get_compact_vector(y,*n,*incy);\n\n  internal::general_rank1_update<Scalar,int,ColMajor,false,false>::run(*m, *n, a, *lda, x_cpy, y_cpy, alpha);\n\n  if(x_cpy!=x)  delete[] x_cpy;\n  if(y_cpy!=y)  delete[] y_cpy;\n\n  return 1;\n}\n\n\n"
  },
  {
    "path": "libs/eigen/blas/level3_impl.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"common.h\"\n\nint EIGEN_BLAS_FUNC(gemm)(char *opa, char *opb, int *m, int *n, int *k, RealScalar *palpha, RealScalar *pa, int *lda, RealScalar *pb, int *ldb, RealScalar *pbeta, RealScalar *pc, int *ldc)\n{\n//   std::cerr << \"in gemm \" << *opa << \" \" << *opb << \" \" << *m << \" \" << *n << \" \" << *k << \" \" << *lda << \" \" << *ldb << \" \" << *ldc << \" \" << *palpha << \" \" << *pbeta << \"\\n\";\n  typedef void (*functype)(DenseIndex, DenseIndex, DenseIndex, const Scalar *, DenseIndex, const Scalar *, DenseIndex, Scalar *, DenseIndex, Scalar, internal::level3_blocking<Scalar,Scalar>&, Eigen::internal::GemmParallelInfo<DenseIndex>*);\n  static functype func[12];\n\n  static bool init = false;\n  if(!init)\n  {\n    for(int k=0; k<12; ++k)\n      func[k] = 0;\n    func[NOTR  | (NOTR << 2)] = (internal::general_matrix_matrix_product<DenseIndex,Scalar,ColMajor,false,Scalar,ColMajor,false,ColMajor>::run);\n    func[TR    | (NOTR << 2)] = (internal::general_matrix_matrix_product<DenseIndex,Scalar,RowMajor,false,Scalar,ColMajor,false,ColMajor>::run);\n    func[ADJ   | (NOTR << 2)] = (internal::general_matrix_matrix_product<DenseIndex,Scalar,RowMajor,Conj, Scalar,ColMajor,false,ColMajor>::run);\n    func[NOTR  | (TR   << 2)] = (internal::general_matrix_matrix_product<DenseIndex,Scalar,ColMajor,false,Scalar,RowMajor,false,ColMajor>::run);\n    func[TR    | (TR   << 2)] = (internal::general_matrix_matrix_product<DenseIndex,Scalar,RowMajor,false,Scalar,RowMajor,false,ColMajor>::run);\n    func[ADJ   | (TR   << 2)] = (internal::general_matrix_matrix_product<DenseIndex,Scalar,RowMajor,Conj, Scalar,RowMajor,false,ColMajor>::run);\n    func[NOTR  | (ADJ  << 2)] = (internal::general_matrix_matrix_product<DenseIndex,Scalar,ColMajor,false,Scalar,RowMajor,Conj, ColMajor>::run);\n    func[TR    | (ADJ  << 2)] = (internal::general_matrix_matrix_product<DenseIndex,Scalar,RowMajor,false,Scalar,RowMajor,Conj, ColMajor>::run);\n    func[ADJ   | (ADJ  << 2)] = (internal::general_matrix_matrix_product<DenseIndex,Scalar,RowMajor,Conj, Scalar,RowMajor,Conj, ColMajor>::run);\n    init = true;\n  }\n\n  Scalar* a = reinterpret_cast<Scalar*>(pa);\n  Scalar* b = reinterpret_cast<Scalar*>(pb);\n  Scalar* c = reinterpret_cast<Scalar*>(pc);\n  Scalar alpha  = *reinterpret_cast<Scalar*>(palpha);\n  Scalar beta   = *reinterpret_cast<Scalar*>(pbeta);\n\n  int info = 0;\n  if(OP(*opa)==INVALID)                                               info = 1;\n  else if(OP(*opb)==INVALID)                                          info = 2;\n  else if(*m<0)                                                       info = 3;\n  else if(*n<0)                                                       info = 4;\n  else if(*k<0)                                                       info = 5;\n  else if(*lda<std::max(1,(OP(*opa)==NOTR)?*m:*k))                    info = 8;\n  else if(*ldb<std::max(1,(OP(*opb)==NOTR)?*k:*n))                    info = 10;\n  else if(*ldc<std::max(1,*m))                                        info = 13;\n  if(info)\n    return xerbla_(SCALAR_SUFFIX_UP\"GEMM \",&info,6);\n\n  if(beta!=Scalar(1))\n  {\n    if(beta==Scalar(0)) matrix(c, *m, *n, *ldc).setZero();\n    else                matrix(c, *m, *n, *ldc) *= beta;\n  }\n\n  internal::gemm_blocking_space<ColMajor,Scalar,Scalar,Dynamic,Dynamic,Dynamic> blocking(*m,*n,*k);\n\n  int code = OP(*opa) | (OP(*opb) << 2);\n  func[code](*m, *n, *k, a, *lda, b, *ldb, c, *ldc, alpha, blocking, 0);\n  return 0;\n}\n\nint EIGEN_BLAS_FUNC(trsm)(char *side, char *uplo, char *opa, char *diag, int *m, int *n, RealScalar *palpha,  RealScalar *pa, int *lda, RealScalar *pb, int *ldb)\n{\n//   std::cerr << \"in trsm \" << *side << \" \" << *uplo << \" \" << *opa << \" \" << *diag << \" \" << *m << \",\" << *n << \" \" << *palpha << \" \" << *lda << \" \" << *ldb<< \"\\n\";\n  typedef void (*functype)(DenseIndex, DenseIndex, const Scalar *, DenseIndex, Scalar *, DenseIndex, internal::level3_blocking<Scalar,Scalar>&);\n  static functype func[32];\n\n  static bool init = false;\n  if(!init)\n  {\n    for(int k=0; k<32; ++k)\n      func[k] = 0;\n\n    func[NOTR  | (LEFT  << 2) | (UP << 3) | (NUNIT << 4)] = (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheLeft, Upper|0,          false,ColMajor,ColMajor>::run);\n    func[TR    | (LEFT  << 2) | (UP << 3) | (NUNIT << 4)] = (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheLeft, Lower|0,          false,RowMajor,ColMajor>::run);\n    func[ADJ   | (LEFT  << 2) | (UP << 3) | (NUNIT << 4)] = (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheLeft, Lower|0,          Conj, RowMajor,ColMajor>::run);\n\n    func[NOTR  | (RIGHT << 2) | (UP << 3) | (NUNIT << 4)] = (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheRight,Upper|0,          false,ColMajor,ColMajor>::run);\n    func[TR    | (RIGHT << 2) | (UP << 3) | (NUNIT << 4)] = (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheRight,Lower|0,          false,RowMajor,ColMajor>::run);\n    func[ADJ   | (RIGHT << 2) | (UP << 3) | (NUNIT << 4)] = (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheRight,Lower|0,          Conj, RowMajor,ColMajor>::run);\n\n    func[NOTR  | (LEFT  << 2) | (LO << 3) | (NUNIT << 4)] = (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheLeft, Lower|0,          false,ColMajor,ColMajor>::run);\n    func[TR    | (LEFT  << 2) | (LO << 3) | (NUNIT << 4)] = (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheLeft, Upper|0,          false,RowMajor,ColMajor>::run);\n    func[ADJ   | (LEFT  << 2) | (LO << 3) | (NUNIT << 4)] = (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheLeft, Upper|0,          Conj, RowMajor,ColMajor>::run);\n\n    func[NOTR  | (RIGHT << 2) | (LO << 3) | (NUNIT << 4)] = (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheRight,Lower|0,          false,ColMajor,ColMajor>::run);\n    func[TR    | (RIGHT << 2) | (LO << 3) | (NUNIT << 4)] = (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheRight,Upper|0,          false,RowMajor,ColMajor>::run);\n    func[ADJ   | (RIGHT << 2) | (LO << 3) | (NUNIT << 4)] = (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheRight,Upper|0,          Conj, RowMajor,ColMajor>::run);\n\n\n    func[NOTR  | (LEFT  << 2) | (UP << 3) | (UNIT  << 4)] = (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheLeft, Upper|UnitDiag,false,ColMajor,ColMajor>::run);\n    func[TR    | (LEFT  << 2) | (UP << 3) | (UNIT  << 4)] = (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheLeft, Lower|UnitDiag,false,RowMajor,ColMajor>::run);\n    func[ADJ   | (LEFT  << 2) | (UP << 3) | (UNIT  << 4)] = (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheLeft, Lower|UnitDiag,Conj, RowMajor,ColMajor>::run);\n\n    func[NOTR  | (RIGHT << 2) | (UP << 3) | (UNIT  << 4)] = (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheRight,Upper|UnitDiag,false,ColMajor,ColMajor>::run);\n    func[TR    | (RIGHT << 2) | (UP << 3) | (UNIT  << 4)] = (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheRight,Lower|UnitDiag,false,RowMajor,ColMajor>::run);\n    func[ADJ   | (RIGHT << 2) | (UP << 3) | (UNIT  << 4)] = (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheRight,Lower|UnitDiag,Conj, RowMajor,ColMajor>::run);\n\n    func[NOTR  | (LEFT  << 2) | (LO << 3) | (UNIT  << 4)] = (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheLeft, Lower|UnitDiag,false,ColMajor,ColMajor>::run);\n    func[TR    | (LEFT  << 2) | (LO << 3) | (UNIT  << 4)] = (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheLeft, Upper|UnitDiag,false,RowMajor,ColMajor>::run);\n    func[ADJ   | (LEFT  << 2) | (LO << 3) | (UNIT  << 4)] = (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheLeft, Upper|UnitDiag,Conj, RowMajor,ColMajor>::run);\n\n    func[NOTR  | (RIGHT << 2) | (LO << 3) | (UNIT  << 4)] = (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheRight,Lower|UnitDiag,false,ColMajor,ColMajor>::run);\n    func[TR    | (RIGHT << 2) | (LO << 3) | (UNIT  << 4)] = (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheRight,Upper|UnitDiag,false,RowMajor,ColMajor>::run);\n    func[ADJ   | (RIGHT << 2) | (LO << 3) | (UNIT  << 4)] = (internal::triangular_solve_matrix<Scalar,DenseIndex,OnTheRight,Upper|UnitDiag,Conj, RowMajor,ColMajor>::run);\n\n    init = true;\n  }\n\n  Scalar* a = reinterpret_cast<Scalar*>(pa);\n  Scalar* b = reinterpret_cast<Scalar*>(pb);\n  Scalar  alpha = *reinterpret_cast<Scalar*>(palpha);\n\n  int info = 0;\n  if(SIDE(*side)==INVALID)                                            info = 1;\n  else if(UPLO(*uplo)==INVALID)                                       info = 2;\n  else if(OP(*opa)==INVALID)                                          info = 3;\n  else if(DIAG(*diag)==INVALID)                                       info = 4;\n  else if(*m<0)                                                       info = 5;\n  else if(*n<0)                                                       info = 6;\n  else if(*lda<std::max(1,(SIDE(*side)==LEFT)?*m:*n))                 info = 9;\n  else if(*ldb<std::max(1,*m))                                        info = 11;\n  if(info)\n    return xerbla_(SCALAR_SUFFIX_UP\"TRSM \",&info,6);\n\n  int code = OP(*opa) | (SIDE(*side) << 2) | (UPLO(*uplo) << 3) | (DIAG(*diag) << 4);\n  \n  if(SIDE(*side)==LEFT)\n  {\n    internal::gemm_blocking_space<ColMajor,Scalar,Scalar,Dynamic,Dynamic,Dynamic,4> blocking(*m,*n,*m);\n    func[code](*m, *n, a, *lda, b, *ldb, blocking);\n  }\n  else\n  {\n    internal::gemm_blocking_space<ColMajor,Scalar,Scalar,Dynamic,Dynamic,Dynamic,4> blocking(*m,*n,*n);\n    func[code](*n, *m, a, *lda, b, *ldb, blocking);\n  }\n\n  if(alpha!=Scalar(1))\n    matrix(b,*m,*n,*ldb) *= alpha;\n\n  return 0;\n}\n\n\n// b = alpha*op(a)*b  for side = 'L'or'l'\n// b = alpha*b*op(a)  for side = 'R'or'r'\nint EIGEN_BLAS_FUNC(trmm)(char *side, char *uplo, char *opa, char *diag, int *m, int *n, RealScalar *palpha,  RealScalar *pa, int *lda, RealScalar *pb, int *ldb)\n{\n//   std::cerr << \"in trmm \" << *side << \" \" << *uplo << \" \" << *opa << \" \" << *diag << \" \" << *m << \" \" << *n << \" \" << *lda << \" \" << *ldb << \" \" << *palpha << \"\\n\";\n  typedef void (*functype)(DenseIndex, DenseIndex, DenseIndex, const Scalar *, DenseIndex, const Scalar *, DenseIndex, Scalar *, DenseIndex, const Scalar&, internal::level3_blocking<Scalar,Scalar>&);\n  static functype func[32];\n  static bool init = false;\n  if(!init)\n  {\n    for(int k=0; k<32; ++k)\n      func[k] = 0;\n\n    func[NOTR  | (LEFT  << 2) | (UP << 3) | (NUNIT << 4)] = (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Upper|0,          true, ColMajor,false,ColMajor,false,ColMajor>::run);\n    func[TR    | (LEFT  << 2) | (UP << 3) | (NUNIT << 4)] = (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Lower|0,          true, RowMajor,false,ColMajor,false,ColMajor>::run);\n    func[ADJ   | (LEFT  << 2) | (UP << 3) | (NUNIT << 4)] = (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Lower|0,          true, RowMajor,Conj, ColMajor,false,ColMajor>::run);\n\n    func[NOTR  | (RIGHT << 2) | (UP << 3) | (NUNIT << 4)] = (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Upper|0,          false,ColMajor,false,ColMajor,false,ColMajor>::run);\n    func[TR    | (RIGHT << 2) | (UP << 3) | (NUNIT << 4)] = (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Lower|0,          false,ColMajor,false,RowMajor,false,ColMajor>::run);\n    func[ADJ   | (RIGHT << 2) | (UP << 3) | (NUNIT << 4)] = (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Lower|0,          false,ColMajor,false,RowMajor,Conj, ColMajor>::run);\n\n    func[NOTR  | (LEFT  << 2) | (LO << 3) | (NUNIT << 4)] = (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Lower|0,          true, ColMajor,false,ColMajor,false,ColMajor>::run);\n    func[TR    | (LEFT  << 2) | (LO << 3) | (NUNIT << 4)] = (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Upper|0,          true, RowMajor,false,ColMajor,false,ColMajor>::run);\n    func[ADJ   | (LEFT  << 2) | (LO << 3) | (NUNIT << 4)] = (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Upper|0,          true, RowMajor,Conj, ColMajor,false,ColMajor>::run);\n\n    func[NOTR  | (RIGHT << 2) | (LO << 3) | (NUNIT << 4)] = (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Lower|0,          false,ColMajor,false,ColMajor,false,ColMajor>::run);\n    func[TR    | (RIGHT << 2) | (LO << 3) | (NUNIT << 4)] = (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Upper|0,          false,ColMajor,false,RowMajor,false,ColMajor>::run);\n    func[ADJ   | (RIGHT << 2) | (LO << 3) | (NUNIT << 4)] = (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Upper|0,          false,ColMajor,false,RowMajor,Conj, ColMajor>::run);\n\n    func[NOTR  | (LEFT  << 2) | (UP << 3) | (UNIT  << 4)] = (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Upper|UnitDiag,true, ColMajor,false,ColMajor,false,ColMajor>::run);\n    func[TR    | (LEFT  << 2) | (UP << 3) | (UNIT  << 4)] = (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Lower|UnitDiag,true, RowMajor,false,ColMajor,false,ColMajor>::run);\n    func[ADJ   | (LEFT  << 2) | (UP << 3) | (UNIT  << 4)] = (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Lower|UnitDiag,true, RowMajor,Conj, ColMajor,false,ColMajor>::run);\n\n    func[NOTR  | (RIGHT << 2) | (UP << 3) | (UNIT  << 4)] = (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Upper|UnitDiag,false,ColMajor,false,ColMajor,false,ColMajor>::run);\n    func[TR    | (RIGHT << 2) | (UP << 3) | (UNIT  << 4)] = (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Lower|UnitDiag,false,ColMajor,false,RowMajor,false,ColMajor>::run);\n    func[ADJ   | (RIGHT << 2) | (UP << 3) | (UNIT  << 4)] = (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Lower|UnitDiag,false,ColMajor,false,RowMajor,Conj, ColMajor>::run);\n\n    func[NOTR  | (LEFT  << 2) | (LO << 3) | (UNIT  << 4)] = (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Lower|UnitDiag,true, ColMajor,false,ColMajor,false,ColMajor>::run);\n    func[TR    | (LEFT  << 2) | (LO << 3) | (UNIT  << 4)] = (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Upper|UnitDiag,true, RowMajor,false,ColMajor,false,ColMajor>::run);\n    func[ADJ   | (LEFT  << 2) | (LO << 3) | (UNIT  << 4)] = (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Upper|UnitDiag,true, RowMajor,Conj, ColMajor,false,ColMajor>::run);\n\n    func[NOTR  | (RIGHT << 2) | (LO << 3) | (UNIT  << 4)] = (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Lower|UnitDiag,false,ColMajor,false,ColMajor,false,ColMajor>::run);\n    func[TR    | (RIGHT << 2) | (LO << 3) | (UNIT  << 4)] = (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Upper|UnitDiag,false,ColMajor,false,RowMajor,false,ColMajor>::run);\n    func[ADJ   | (RIGHT << 2) | (LO << 3) | (UNIT  << 4)] = (internal::product_triangular_matrix_matrix<Scalar,DenseIndex,Upper|UnitDiag,false,ColMajor,false,RowMajor,Conj, ColMajor>::run);\n\n    init = true;\n  }\n\n  Scalar* a = reinterpret_cast<Scalar*>(pa);\n  Scalar* b = reinterpret_cast<Scalar*>(pb);\n  Scalar  alpha = *reinterpret_cast<Scalar*>(palpha);\n\n  int info = 0;\n  if(SIDE(*side)==INVALID)                                            info = 1;\n  else if(UPLO(*uplo)==INVALID)                                       info = 2;\n  else if(OP(*opa)==INVALID)                                          info = 3;\n  else if(DIAG(*diag)==INVALID)                                       info = 4;\n  else if(*m<0)                                                       info = 5;\n  else if(*n<0)                                                       info = 6;\n  else if(*lda<std::max(1,(SIDE(*side)==LEFT)?*m:*n))                 info = 9;\n  else if(*ldb<std::max(1,*m))                                        info = 11;\n  if(info)\n    return xerbla_(SCALAR_SUFFIX_UP\"TRMM \",&info,6);\n\n  int code = OP(*opa) | (SIDE(*side) << 2) | (UPLO(*uplo) << 3) | (DIAG(*diag) << 4);\n\n  if(*m==0 || *n==0)\n    return 1;\n\n  // FIXME find a way to avoid this copy\n  Matrix<Scalar,Dynamic,Dynamic,ColMajor> tmp = matrix(b,*m,*n,*ldb);\n  matrix(b,*m,*n,*ldb).setZero();\n\n  if(SIDE(*side)==LEFT)\n  {\n    internal::gemm_blocking_space<ColMajor,Scalar,Scalar,Dynamic,Dynamic,Dynamic,4> blocking(*m,*n,*m);\n    func[code](*m, *n, *m, a, *lda, tmp.data(), tmp.outerStride(), b, *ldb, alpha, blocking);\n  }\n  else\n  {\n    internal::gemm_blocking_space<ColMajor,Scalar,Scalar,Dynamic,Dynamic,Dynamic,4> blocking(*m,*n,*n);\n    func[code](*m, *n, *n, tmp.data(), tmp.outerStride(), a, *lda, b, *ldb, alpha, blocking);\n  }\n  return 1;\n}\n\n// c = alpha*a*b + beta*c  for side = 'L'or'l'\n// c = alpha*b*a + beta*c  for side = 'R'or'r\nint EIGEN_BLAS_FUNC(symm)(char *side, char *uplo, int *m, int *n, RealScalar *palpha, RealScalar *pa, int *lda, RealScalar *pb, int *ldb, RealScalar *pbeta, RealScalar *pc, int *ldc)\n{\n//   std::cerr << \"in symm \" << *side << \" \" << *uplo << \" \" << *m << \"x\" << *n << \" lda:\" << *lda << \" ldb:\" << *ldb << \" ldc:\" << *ldc << \" alpha:\" << *palpha << \" beta:\" << *pbeta << \"\\n\";\n  Scalar* a = reinterpret_cast<Scalar*>(pa);\n  Scalar* b = reinterpret_cast<Scalar*>(pb);\n  Scalar* c = reinterpret_cast<Scalar*>(pc);\n  Scalar alpha = *reinterpret_cast<Scalar*>(palpha);\n  Scalar beta  = *reinterpret_cast<Scalar*>(pbeta);\n\n  int info = 0;\n  if(SIDE(*side)==INVALID)                                            info = 1;\n  else if(UPLO(*uplo)==INVALID)                                       info = 2;\n  else if(*m<0)                                                       info = 3;\n  else if(*n<0)                                                       info = 4;\n  else if(*lda<std::max(1,(SIDE(*side)==LEFT)?*m:*n))                 info = 7;\n  else if(*ldb<std::max(1,*m))                                        info = 9;\n  else if(*ldc<std::max(1,*m))                                        info = 12;\n  if(info)\n    return xerbla_(SCALAR_SUFFIX_UP\"SYMM \",&info,6);\n\n  if(beta!=Scalar(1))\n  {\n    if(beta==Scalar(0)) matrix(c, *m, *n, *ldc).setZero();\n    else                matrix(c, *m, *n, *ldc) *= beta;\n  }\n\n  if(*m==0 || *n==0)\n  {\n    return 1;\n  }\n\n  #if ISCOMPLEX\n  // FIXME add support for symmetric complex matrix\n  int size = (SIDE(*side)==LEFT) ? (*m) : (*n);\n  Matrix<Scalar,Dynamic,Dynamic,ColMajor> matA(size,size);\n  if(UPLO(*uplo)==UP)\n  {\n    matA.triangularView<Upper>() = matrix(a,size,size,*lda);\n    matA.triangularView<Lower>() = matrix(a,size,size,*lda).transpose();\n  }\n  else if(UPLO(*uplo)==LO)\n  {\n    matA.triangularView<Lower>() = matrix(a,size,size,*lda);\n    matA.triangularView<Upper>() = matrix(a,size,size,*lda).transpose();\n  }\n  if(SIDE(*side)==LEFT)\n    matrix(c, *m, *n, *ldc) += alpha * matA * matrix(b, *m, *n, *ldb);\n  else if(SIDE(*side)==RIGHT)\n    matrix(c, *m, *n, *ldc) += alpha * matrix(b, *m, *n, *ldb) * matA;\n  #else\n  if(SIDE(*side)==LEFT)\n    if(UPLO(*uplo)==UP)       internal::product_selfadjoint_matrix<Scalar, DenseIndex, RowMajor,true,false, ColMajor,false,false, ColMajor>::run(*m, *n, a, *lda, b, *ldb, c, *ldc, alpha);\n    else if(UPLO(*uplo)==LO)  internal::product_selfadjoint_matrix<Scalar, DenseIndex, ColMajor,true,false, ColMajor,false,false, ColMajor>::run(*m, *n, a, *lda, b, *ldb, c, *ldc, alpha);\n    else                      return 0;\n  else if(SIDE(*side)==RIGHT)\n    if(UPLO(*uplo)==UP)       internal::product_selfadjoint_matrix<Scalar, DenseIndex, ColMajor,false,false, RowMajor,true,false, ColMajor>::run(*m, *n, b, *ldb, a, *lda, c, *ldc, alpha);\n    else if(UPLO(*uplo)==LO)  internal::product_selfadjoint_matrix<Scalar, DenseIndex, ColMajor,false,false, ColMajor,true,false, ColMajor>::run(*m, *n, b, *ldb, a, *lda, c, *ldc, alpha);\n    else                      return 0;\n  else\n    return 0;\n  #endif\n\n  return 0;\n}\n\n// c = alpha*a*a' + beta*c  for op = 'N'or'n'\n// c = alpha*a'*a + beta*c  for op = 'T'or't','C'or'c'\nint EIGEN_BLAS_FUNC(syrk)(char *uplo, char *op, int *n, int *k, RealScalar *palpha, RealScalar *pa, int *lda, RealScalar *pbeta, RealScalar *pc, int *ldc)\n{\n//   std::cerr << \"in syrk \" << *uplo << \" \" << *op << \" \" << *n << \" \" << *k << \" \" << *palpha << \" \" << *lda << \" \" << *pbeta << \" \" << *ldc << \"\\n\";\n  #if !ISCOMPLEX\n  typedef void (*functype)(DenseIndex, DenseIndex, const Scalar *, DenseIndex, const Scalar *, DenseIndex, Scalar *, DenseIndex, const Scalar&);\n  static functype func[8];\n\n  static bool init = false;\n  if(!init)\n  {\n    for(int k=0; k<8; ++k)\n      func[k] = 0;\n\n    func[NOTR  | (UP << 2)] = (internal::general_matrix_matrix_triangular_product<DenseIndex,Scalar,ColMajor,false,Scalar,RowMajor,ColMajor,Conj, Upper>::run);\n    func[TR    | (UP << 2)] = (internal::general_matrix_matrix_triangular_product<DenseIndex,Scalar,RowMajor,false,Scalar,ColMajor,ColMajor,Conj, Upper>::run);\n    func[ADJ   | (UP << 2)] = (internal::general_matrix_matrix_triangular_product<DenseIndex,Scalar,RowMajor,Conj, Scalar,ColMajor,ColMajor,false,Upper>::run);\n\n    func[NOTR  | (LO << 2)] = (internal::general_matrix_matrix_triangular_product<DenseIndex,Scalar,ColMajor,false,Scalar,RowMajor,ColMajor,Conj, Lower>::run);\n    func[TR    | (LO << 2)] = (internal::general_matrix_matrix_triangular_product<DenseIndex,Scalar,RowMajor,false,Scalar,ColMajor,ColMajor,Conj, Lower>::run);\n    func[ADJ   | (LO << 2)] = (internal::general_matrix_matrix_triangular_product<DenseIndex,Scalar,RowMajor,Conj, Scalar,ColMajor,ColMajor,false,Lower>::run);\n\n    init = true;\n  }\n  #endif\n\n  Scalar* a = reinterpret_cast<Scalar*>(pa);\n  Scalar* c = reinterpret_cast<Scalar*>(pc);\n  Scalar alpha = *reinterpret_cast<Scalar*>(palpha);\n  Scalar beta  = *reinterpret_cast<Scalar*>(pbeta);\n\n  int info = 0;\n  if(UPLO(*uplo)==INVALID)                                            info = 1;\n  else if(OP(*op)==INVALID)                                           info = 2;\n  else if(*n<0)                                                       info = 3;\n  else if(*k<0)                                                       info = 4;\n  else if(*lda<std::max(1,(OP(*op)==NOTR)?*n:*k))                     info = 7;\n  else if(*ldc<std::max(1,*n))                                        info = 10;\n  if(info)\n    return xerbla_(SCALAR_SUFFIX_UP\"SYRK \",&info,6);\n\n  if(beta!=Scalar(1))\n  {\n    if(UPLO(*uplo)==UP)\n      if(beta==Scalar(0)) matrix(c, *n, *n, *ldc).triangularView<Upper>().setZero();\n      else                matrix(c, *n, *n, *ldc).triangularView<Upper>() *= beta;\n    else\n      if(beta==Scalar(0)) matrix(c, *n, *n, *ldc).triangularView<Lower>().setZero();\n      else                matrix(c, *n, *n, *ldc).triangularView<Lower>() *= beta;\n  }\n\n  #if ISCOMPLEX\n  // FIXME add support for symmetric complex matrix\n  if(UPLO(*uplo)==UP)\n  {\n    if(OP(*op)==NOTR)\n      matrix(c, *n, *n, *ldc).triangularView<Upper>() += alpha * matrix(a,*n,*k,*lda) * matrix(a,*n,*k,*lda).transpose();\n    else\n      matrix(c, *n, *n, *ldc).triangularView<Upper>() += alpha * matrix(a,*k,*n,*lda).transpose() * matrix(a,*k,*n,*lda);\n  }\n  else\n  {\n    if(OP(*op)==NOTR)\n      matrix(c, *n, *n, *ldc).triangularView<Lower>() += alpha * matrix(a,*n,*k,*lda) * matrix(a,*n,*k,*lda).transpose();\n    else\n      matrix(c, *n, *n, *ldc).triangularView<Lower>() += alpha * matrix(a,*k,*n,*lda).transpose() * matrix(a,*k,*n,*lda);\n  }\n  #else\n  int code = OP(*op) | (UPLO(*uplo) << 2);\n  func[code](*n, *k, a, *lda, a, *lda, c, *ldc, alpha);\n  #endif\n\n  return 0;\n}\n\n// c = alpha*a*b' + alpha*b*a' + beta*c  for op = 'N'or'n'\n// c = alpha*a'*b + alpha*b'*a + beta*c  for op = 'T'or't'\nint EIGEN_BLAS_FUNC(syr2k)(char *uplo, char *op, int *n, int *k, RealScalar *palpha, RealScalar *pa, int *lda, RealScalar *pb, int *ldb, RealScalar *pbeta, RealScalar *pc, int *ldc)\n{\n  Scalar* a = reinterpret_cast<Scalar*>(pa);\n  Scalar* b = reinterpret_cast<Scalar*>(pb);\n  Scalar* c = reinterpret_cast<Scalar*>(pc);\n  Scalar alpha = *reinterpret_cast<Scalar*>(palpha);\n  Scalar beta  = *reinterpret_cast<Scalar*>(pbeta);\n\n  int info = 0;\n  if(UPLO(*uplo)==INVALID)                                            info = 1;\n  else if(OP(*op)==INVALID)                                           info = 2;\n  else if(*n<0)                                                       info = 3;\n  else if(*k<0)                                                       info = 4;\n  else if(*lda<std::max(1,(OP(*op)==NOTR)?*n:*k))                     info = 7;\n  else if(*ldb<std::max(1,(OP(*op)==NOTR)?*n:*k))                     info = 9;\n  else if(*ldc<std::max(1,*n))                                        info = 12;\n  if(info)\n    return xerbla_(SCALAR_SUFFIX_UP\"SYR2K\",&info,6);\n\n  if(beta!=Scalar(1))\n  {\n    if(UPLO(*uplo)==UP)\n      if(beta==Scalar(0)) matrix(c, *n, *n, *ldc).triangularView<Upper>().setZero();\n      else                matrix(c, *n, *n, *ldc).triangularView<Upper>() *= beta;\n    else\n      if(beta==Scalar(0)) matrix(c, *n, *n, *ldc).triangularView<Lower>().setZero();\n      else                matrix(c, *n, *n, *ldc).triangularView<Lower>() *= beta;\n  }\n\n  if(*k==0)\n    return 1;\n\n  if(OP(*op)==NOTR)\n  {\n    if(UPLO(*uplo)==UP)\n    {\n      matrix(c, *n, *n, *ldc).triangularView<Upper>()\n        += alpha *matrix(a, *n, *k, *lda)*matrix(b, *n, *k, *ldb).transpose()\n        +  alpha*matrix(b, *n, *k, *ldb)*matrix(a, *n, *k, *lda).transpose();\n    }\n    else if(UPLO(*uplo)==LO)\n      matrix(c, *n, *n, *ldc).triangularView<Lower>()\n        += alpha*matrix(a, *n, *k, *lda)*matrix(b, *n, *k, *ldb).transpose()\n        +  alpha*matrix(b, *n, *k, *ldb)*matrix(a, *n, *k, *lda).transpose();\n  }\n  else if(OP(*op)==TR || OP(*op)==ADJ)\n  {\n    if(UPLO(*uplo)==UP)\n      matrix(c, *n, *n, *ldc).triangularView<Upper>()\n        += alpha*matrix(a, *k, *n, *lda).transpose()*matrix(b, *k, *n, *ldb)\n        +  alpha*matrix(b, *k, *n, *ldb).transpose()*matrix(a, *k, *n, *lda);\n    else if(UPLO(*uplo)==LO)\n      matrix(c, *n, *n, *ldc).triangularView<Lower>()\n        += alpha*matrix(a, *k, *n, *lda).transpose()*matrix(b, *k, *n, *ldb)\n        +  alpha*matrix(b, *k, *n, *ldb).transpose()*matrix(a, *k, *n, *lda);\n  }\n\n  return 0;\n}\n\n\n#if ISCOMPLEX\n\n// c = alpha*a*b + beta*c  for side = 'L'or'l'\n// c = alpha*b*a + beta*c  for side = 'R'or'r\nint EIGEN_BLAS_FUNC(hemm)(char *side, char *uplo, int *m, int *n, RealScalar *palpha, RealScalar *pa, int *lda, RealScalar *pb, int *ldb, RealScalar *pbeta, RealScalar *pc, int *ldc)\n{\n  Scalar* a = reinterpret_cast<Scalar*>(pa);\n  Scalar* b = reinterpret_cast<Scalar*>(pb);\n  Scalar* c = reinterpret_cast<Scalar*>(pc);\n  Scalar alpha = *reinterpret_cast<Scalar*>(palpha);\n  Scalar beta  = *reinterpret_cast<Scalar*>(pbeta);\n\n//   std::cerr << \"in hemm \" << *side << \" \" << *uplo << \" \" << *m << \" \" << *n << \" \" << alpha << \" \" << *lda << \" \" << beta << \" \" << *ldc << \"\\n\";\n\n  int info = 0;\n  if(SIDE(*side)==INVALID)                                            info = 1;\n  else if(UPLO(*uplo)==INVALID)                                       info = 2;\n  else if(*m<0)                                                       info = 3;\n  else if(*n<0)                                                       info = 4;\n  else if(*lda<std::max(1,(SIDE(*side)==LEFT)?*m:*n))                 info = 7;\n  else if(*ldb<std::max(1,*m))                                        info = 9;\n  else if(*ldc<std::max(1,*m))                                        info = 12;\n  if(info)\n    return xerbla_(SCALAR_SUFFIX_UP\"HEMM \",&info,6);\n\n  if(beta==Scalar(0))       matrix(c, *m, *n, *ldc).setZero();\n  else if(beta!=Scalar(1))  matrix(c, *m, *n, *ldc) *= beta;\n\n  if(*m==0 || *n==0)\n  {\n    return 1;\n  }\n\n  if(SIDE(*side)==LEFT)\n  {\n    if(UPLO(*uplo)==UP)       internal::product_selfadjoint_matrix<Scalar,DenseIndex,RowMajor,true,Conj,  ColMajor,false,false, ColMajor>\n                                ::run(*m, *n, a, *lda, b, *ldb, c, *ldc, alpha);\n    else if(UPLO(*uplo)==LO)  internal::product_selfadjoint_matrix<Scalar,DenseIndex,ColMajor,true,false, ColMajor,false,false, ColMajor>\n                                ::run(*m, *n, a, *lda, b, *ldb, c, *ldc, alpha);\n    else                      return 0;\n  }\n  else if(SIDE(*side)==RIGHT)\n  {\n    if(UPLO(*uplo)==UP)       matrix(c,*m,*n,*ldc) += alpha * matrix(b,*m,*n,*ldb) * matrix(a,*n,*n,*lda).selfadjointView<Upper>();/*internal::product_selfadjoint_matrix<Scalar,DenseIndex,ColMajor,false,false, RowMajor,true,Conj,  ColMajor>\n                                ::run(*m, *n, b, *ldb, a, *lda, c, *ldc, alpha);*/\n    else if(UPLO(*uplo)==LO)  internal::product_selfadjoint_matrix<Scalar,DenseIndex,ColMajor,false,false, ColMajor,true,false, ColMajor>\n                                ::run(*m, *n, b, *ldb, a, *lda, c, *ldc, alpha);\n    else                      return 0;\n  }\n  else\n  {\n    return 0;\n  }\n\n  return 0;\n}\n\n// c = alpha*a*conj(a') + beta*c  for op = 'N'or'n'\n// c = alpha*conj(a')*a + beta*c  for op  = 'C'or'c'\nint EIGEN_BLAS_FUNC(herk)(char *uplo, char *op, int *n, int *k, RealScalar *palpha, RealScalar *pa, int *lda, RealScalar *pbeta, RealScalar *pc, int *ldc)\n{\n  typedef void (*functype)(DenseIndex, DenseIndex, const Scalar *, DenseIndex, const Scalar *, DenseIndex, Scalar *, DenseIndex, const Scalar&);\n  static functype func[8];\n\n  static bool init = false;\n  if(!init)\n  {\n    for(int k=0; k<8; ++k)\n      func[k] = 0;\n\n    func[NOTR  | (UP << 2)] = (internal::general_matrix_matrix_triangular_product<DenseIndex,Scalar,ColMajor,false,Scalar,RowMajor,Conj, ColMajor,Upper>::run);\n    func[ADJ   | (UP << 2)] = (internal::general_matrix_matrix_triangular_product<DenseIndex,Scalar,RowMajor,Conj, Scalar,ColMajor,false,ColMajor,Upper>::run);\n\n    func[NOTR  | (LO << 2)] = (internal::general_matrix_matrix_triangular_product<DenseIndex,Scalar,ColMajor,false,Scalar,RowMajor,Conj, ColMajor,Lower>::run);\n    func[ADJ   | (LO << 2)] = (internal::general_matrix_matrix_triangular_product<DenseIndex,Scalar,RowMajor,Conj, Scalar,ColMajor,false,ColMajor,Lower>::run);\n\n    init = true;\n  }\n\n  Scalar* a = reinterpret_cast<Scalar*>(pa);\n  Scalar* c = reinterpret_cast<Scalar*>(pc);\n  RealScalar alpha = *palpha;\n  RealScalar beta  = *pbeta;\n\n//   std::cerr << \"in herk \" << *uplo << \" \" << *op << \" \" << *n << \" \" << *k << \" \" << alpha << \" \" << *lda << \" \" << beta << \" \" << *ldc << \"\\n\";\n\n  int info = 0;\n  if(UPLO(*uplo)==INVALID)                                            info = 1;\n  else if((OP(*op)==INVALID) || (OP(*op)==TR))                        info = 2;\n  else if(*n<0)                                                       info = 3;\n  else if(*k<0)                                                       info = 4;\n  else if(*lda<std::max(1,(OP(*op)==NOTR)?*n:*k))                     info = 7;\n  else if(*ldc<std::max(1,*n))                                        info = 10;\n  if(info)\n    return xerbla_(SCALAR_SUFFIX_UP\"HERK \",&info,6);\n\n  int code = OP(*op) | (UPLO(*uplo) << 2);\n\n  if(beta!=RealScalar(1))\n  {\n    if(UPLO(*uplo)==UP)\n      if(beta==Scalar(0)) matrix(c, *n, *n, *ldc).triangularView<Upper>().setZero();\n      else                matrix(c, *n, *n, *ldc).triangularView<StrictlyUpper>() *= beta;\n    else\n      if(beta==Scalar(0)) matrix(c, *n, *n, *ldc).triangularView<Lower>().setZero();\n      else                matrix(c, *n, *n, *ldc).triangularView<StrictlyLower>() *= beta;\n  \n    if(beta!=Scalar(0))\n    {\n      matrix(c, *n, *n, *ldc).diagonal().real() *= beta;\n      matrix(c, *n, *n, *ldc).diagonal().imag().setZero();\n    }\n  }\n\n  if(*k>0 && alpha!=RealScalar(0))\n  {\n    func[code](*n, *k, a, *lda, a, *lda, c, *ldc, alpha);\n    matrix(c, *n, *n, *ldc).diagonal().imag().setZero();\n  }\n  return 0;\n}\n\n// c = alpha*a*conj(b') + conj(alpha)*b*conj(a') + beta*c,  for op = 'N'or'n'\n// c = alpha*conj(a')*b + conj(alpha)*conj(b')*a + beta*c,  for op = 'C'or'c'\nint EIGEN_BLAS_FUNC(her2k)(char *uplo, char *op, int *n, int *k, RealScalar *palpha, RealScalar *pa, int *lda, RealScalar *pb, int *ldb, RealScalar *pbeta, RealScalar *pc, int *ldc)\n{\n  Scalar* a = reinterpret_cast<Scalar*>(pa);\n  Scalar* b = reinterpret_cast<Scalar*>(pb);\n  Scalar* c = reinterpret_cast<Scalar*>(pc);\n  Scalar alpha = *reinterpret_cast<Scalar*>(palpha);\n  RealScalar beta  = *pbeta;\n\n  int info = 0;\n  if(UPLO(*uplo)==INVALID)                                            info = 1;\n  else if((OP(*op)==INVALID) || (OP(*op)==TR))                        info = 2;\n  else if(*n<0)                                                       info = 3;\n  else if(*k<0)                                                       info = 4;\n  else if(*lda<std::max(1,(OP(*op)==NOTR)?*n:*k))                     info = 7;\n  else if(*lda<std::max(1,(OP(*op)==NOTR)?*n:*k))                     info = 9;\n  else if(*ldc<std::max(1,*n))                                        info = 12;\n  if(info)\n    return xerbla_(SCALAR_SUFFIX_UP\"HER2K\",&info,6);\n\n  if(beta!=RealScalar(1))\n  {\n    if(UPLO(*uplo)==UP)\n      if(beta==Scalar(0)) matrix(c, *n, *n, *ldc).triangularView<Upper>().setZero();\n      else                matrix(c, *n, *n, *ldc).triangularView<StrictlyUpper>() *= beta;\n    else\n      if(beta==Scalar(0)) matrix(c, *n, *n, *ldc).triangularView<Lower>().setZero();\n      else                matrix(c, *n, *n, *ldc).triangularView<StrictlyLower>() *= beta;\n\n    if(beta!=Scalar(0))\n    {\n      matrix(c, *n, *n, *ldc).diagonal().real() *= beta;\n      matrix(c, *n, *n, *ldc).diagonal().imag().setZero();\n    }\n  }\n  else if(*k>0 && alpha!=Scalar(0))\n    matrix(c, *n, *n, *ldc).diagonal().imag().setZero();\n\n  if(*k==0)\n    return 1;\n\n  if(OP(*op)==NOTR)\n  {\n    if(UPLO(*uplo)==UP)\n    {\n      matrix(c, *n, *n, *ldc).triangularView<Upper>()\n        +=            alpha *matrix(a, *n, *k, *lda)*matrix(b, *n, *k, *ldb).adjoint()\n        +  numext::conj(alpha)*matrix(b, *n, *k, *ldb)*matrix(a, *n, *k, *lda).adjoint();\n    }\n    else if(UPLO(*uplo)==LO)\n      matrix(c, *n, *n, *ldc).triangularView<Lower>()\n        += alpha*matrix(a, *n, *k, *lda)*matrix(b, *n, *k, *ldb).adjoint()\n        +  numext::conj(alpha)*matrix(b, *n, *k, *ldb)*matrix(a, *n, *k, *lda).adjoint();\n  }\n  else if(OP(*op)==ADJ)\n  {\n    if(UPLO(*uplo)==UP)\n      matrix(c, *n, *n, *ldc).triangularView<Upper>()\n        +=             alpha*matrix(a, *k, *n, *lda).adjoint()*matrix(b, *k, *n, *ldb)\n        +  numext::conj(alpha)*matrix(b, *k, *n, *ldb).adjoint()*matrix(a, *k, *n, *lda);\n    else if(UPLO(*uplo)==LO)\n      matrix(c, *n, *n, *ldc).triangularView<Lower>()\n        +=             alpha*matrix(a, *k, *n, *lda).adjoint()*matrix(b, *k, *n, *ldb)\n        +  numext::conj(alpha)*matrix(b, *k, *n, *ldb).adjoint()*matrix(a, *k, *n, *lda);\n  }\n\n  return 1;\n}\n\n#endif // ISCOMPLEX\n"
  },
  {
    "path": "libs/eigen/blas/lsame.f",
    "content": "      LOGICAL FUNCTION LSAME(CA,CB)\n*\n*  -- LAPACK auxiliary routine (version 3.1) --\n*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..\n*     November 2006\n*\n*     .. Scalar Arguments ..\n      CHARACTER CA,CB\n*     ..\n*\n*  Purpose\n*  =======\n*\n*  LSAME returns .TRUE. if CA is the same letter as CB regardless of\n*  case.\n*\n*  Arguments\n*  =========\n*\n*  CA      (input) CHARACTER*1\n*\n*  CB      (input) CHARACTER*1\n*          CA and CB specify the single characters to be compared.\n*\n* =====================================================================\n*\n*     .. Intrinsic Functions ..\n      INTRINSIC ICHAR\n*     ..\n*     .. Local Scalars ..\n      INTEGER INTA,INTB,ZCODE\n*     ..\n*\n*     Test if the characters are equal\n*\n      LSAME = CA .EQ. CB\n      IF (LSAME) RETURN\n*\n*     Now test for equivalence if both characters are alphabetic.\n*\n      ZCODE = ICHAR('Z')\n*\n*     Use 'Z' rather than 'A' so that ASCII can be detected on Prime\n*     machines, on which ICHAR returns a value with bit 8 set.\n*     ICHAR('A') on Prime machines returns 193 which is the same as\n*     ICHAR('A') on an EBCDIC machine.\n*\n      INTA = ICHAR(CA)\n      INTB = ICHAR(CB)\n*\n      IF (ZCODE.EQ.90 .OR. ZCODE.EQ.122) THEN\n*\n*        ASCII is assumed - ZCODE is the ASCII code of either lower or\n*        upper case 'Z'.\n*\n          IF (INTA.GE.97 .AND. INTA.LE.122) INTA = INTA - 32\n          IF (INTB.GE.97 .AND. INTB.LE.122) INTB = INTB - 32\n*\n      ELSE IF (ZCODE.EQ.233 .OR. ZCODE.EQ.169) THEN\n*\n*        EBCDIC is assumed - ZCODE is the EBCDIC code of either lower or\n*        upper case 'Z'.\n*\n          IF (INTA.GE.129 .AND. INTA.LE.137 .OR.\n     +        INTA.GE.145 .AND. INTA.LE.153 .OR.\n     +        INTA.GE.162 .AND. INTA.LE.169) INTA = INTA + 64\n          IF (INTB.GE.129 .AND. INTB.LE.137 .OR.\n     +        INTB.GE.145 .AND. INTB.LE.153 .OR.\n     +        INTB.GE.162 .AND. INTB.LE.169) INTB = INTB + 64\n*\n      ELSE IF (ZCODE.EQ.218 .OR. ZCODE.EQ.250) THEN\n*\n*        ASCII is assumed, on Prime machines - ZCODE is the ASCII code\n*        plus 128 of either lower or upper case 'Z'.\n*\n          IF (INTA.GE.225 .AND. INTA.LE.250) INTA = INTA - 32\n          IF (INTB.GE.225 .AND. INTB.LE.250) INTB = INTB - 32\n      END IF\n      LSAME = INTA .EQ. INTB\n*\n*     RETURN\n*\n*     End of LSAME\n*\n      END\n"
  },
  {
    "path": "libs/eigen/blas/single.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#define SCALAR        float\n#define SCALAR_SUFFIX s\n#define SCALAR_SUFFIX_UP \"S\"\n#define ISCOMPLEX     0\n\n#include \"level1_impl.h\"\n#include \"level1_real_impl.h\"\n#include \"level2_impl.h\"\n#include \"level2_real_impl.h\"\n#include \"level3_impl.h\"\n\nfloat BLASFUNC(sdsdot)(int* n, float* alpha, float* x, int* incx, float* y, int* incy)\n{ return *alpha + BLASFUNC(dsdot)(n, x, incx, y, incy); }\n"
  },
  {
    "path": "libs/eigen/blas/srotm.f",
    "content": "      SUBROUTINE SROTM(N,SX,INCX,SY,INCY,SPARAM)\n*     .. Scalar Arguments ..\n      INTEGER INCX,INCY,N\n*     ..\n*     .. Array Arguments ..\n      REAL SPARAM(5),SX(*),SY(*)\n*     ..\n*\n*  Purpose\n*  =======\n*\n*     APPLY THE MODIFIED GIVENS TRANSFORMATION, H, TO THE 2 BY N MATRIX\n*\n*     (SX**T) , WHERE **T INDICATES TRANSPOSE. THE ELEMENTS OF SX ARE IN\n*     (DX**T)\n*\n*     SX(LX+I*INCX), I = 0 TO N-1, WHERE LX = 1 IF INCX .GE. 0, ELSE\n*     LX = (-INCX)*N, AND SIMILARLY FOR SY USING USING LY AND INCY.\n*     WITH SPARAM(1)=SFLAG, H HAS ONE OF THE FOLLOWING FORMS..\n*\n*     SFLAG=-1.E0     SFLAG=0.E0        SFLAG=1.E0     SFLAG=-2.E0\n*\n*       (SH11  SH12)    (1.E0  SH12)    (SH11  1.E0)    (1.E0  0.E0)\n*     H=(          )    (          )    (          )    (          )\n*       (SH21  SH22),   (SH21  1.E0),   (-1.E0 SH22),   (0.E0  1.E0).\n*     SEE  SROTMG FOR A DESCRIPTION OF DATA STORAGE IN SPARAM.\n*\n*\n*  Arguments\n*  =========\n*\n*  N      (input) INTEGER\n*         number of elements in input vector(s)\n*\n*  SX     (input/output) REAL array, dimension N\n*         double precision vector with N elements\n*\n*  INCX   (input) INTEGER\n*         storage spacing between elements of SX\n*\n*  SY     (input/output) REAL array, dimension N\n*         double precision vector with N elements\n*\n*  INCY   (input) INTEGER\n*         storage spacing between elements of SY\n*\n*  SPARAM (input/output)  REAL array, dimension 5\n*     SPARAM(1)=SFLAG\n*     SPARAM(2)=SH11\n*     SPARAM(3)=SH21\n*     SPARAM(4)=SH12\n*     SPARAM(5)=SH22\n*\n*  =====================================================================\n*\n*     .. Local Scalars ..\n      REAL SFLAG,SH11,SH12,SH21,SH22,TWO,W,Z,ZERO\n      INTEGER I,KX,KY,NSTEPS\n*     ..\n*     .. Data statements ..\n      DATA ZERO,TWO/0.E0,2.E0/\n*     ..\n*\n      SFLAG = SPARAM(1)\n      IF (N.LE.0 .OR. (SFLAG+TWO.EQ.ZERO)) GO TO 140\n      IF (.NOT. (INCX.EQ.INCY.AND.INCX.GT.0)) GO TO 70\n*\n      NSTEPS = N*INCX\n      IF (SFLAG) 50,10,30\n   10 CONTINUE\n      SH12 = SPARAM(4)\n      SH21 = SPARAM(3)\n      DO 20 I = 1,NSTEPS,INCX\n          W = SX(I)\n          Z = SY(I)\n          SX(I) = W + Z*SH12\n          SY(I) = W*SH21 + Z\n   20 CONTINUE\n      GO TO 140\n   30 CONTINUE\n      SH11 = SPARAM(2)\n      SH22 = SPARAM(5)\n      DO 40 I = 1,NSTEPS,INCX\n          W = SX(I)\n          Z = SY(I)\n          SX(I) = W*SH11 + Z\n          SY(I) = -W + SH22*Z\n   40 CONTINUE\n      GO TO 140\n   50 CONTINUE\n      SH11 = SPARAM(2)\n      SH12 = SPARAM(4)\n      SH21 = SPARAM(3)\n      SH22 = SPARAM(5)\n      DO 60 I = 1,NSTEPS,INCX\n          W = SX(I)\n          Z = SY(I)\n          SX(I) = W*SH11 + Z*SH12\n          SY(I) = W*SH21 + Z*SH22\n   60 CONTINUE\n      GO TO 140\n   70 CONTINUE\n      KX = 1\n      KY = 1\n      IF (INCX.LT.0) KX = 1 + (1-N)*INCX\n      IF (INCY.LT.0) KY = 1 + (1-N)*INCY\n*\n      IF (SFLAG) 120,80,100\n   80 CONTINUE\n      SH12 = SPARAM(4)\n      SH21 = SPARAM(3)\n      DO 90 I = 1,N\n          W = SX(KX)\n          Z = SY(KY)\n          SX(KX) = W + Z*SH12\n          SY(KY) = W*SH21 + Z\n          KX = KX + INCX\n          KY = KY + INCY\n   90 CONTINUE\n      GO TO 140\n  100 CONTINUE\n      SH11 = SPARAM(2)\n      SH22 = SPARAM(5)\n      DO 110 I = 1,N\n          W = SX(KX)\n          Z = SY(KY)\n          SX(KX) = W*SH11 + Z\n          SY(KY) = -W + SH22*Z\n          KX = KX + INCX\n          KY = KY + INCY\n  110 CONTINUE\n      GO TO 140\n  120 CONTINUE\n      SH11 = SPARAM(2)\n      SH12 = SPARAM(4)\n      SH21 = SPARAM(3)\n      SH22 = SPARAM(5)\n      DO 130 I = 1,N\n          W = SX(KX)\n          Z = SY(KY)\n          SX(KX) = W*SH11 + Z*SH12\n          SY(KY) = W*SH21 + Z*SH22\n          KX = KX + INCX\n          KY = KY + INCY\n  130 CONTINUE\n  140 CONTINUE\n      RETURN\n      END\n"
  },
  {
    "path": "libs/eigen/blas/srotmg.f",
    "content": "      SUBROUTINE SROTMG(SD1,SD2,SX1,SY1,SPARAM)\n*     .. Scalar Arguments ..\n      REAL SD1,SD2,SX1,SY1\n*     ..\n*     .. Array Arguments ..\n      REAL SPARAM(5)\n*     ..\n*\n*  Purpose\n*  =======\n*\n*     CONSTRUCT THE MODIFIED GIVENS TRANSFORMATION MATRIX H WHICH ZEROS\n*     THE SECOND COMPONENT OF THE 2-VECTOR  (SQRT(SD1)*SX1,SQRT(SD2)*\n*     SY2)**T.\n*     WITH SPARAM(1)=SFLAG, H HAS ONE OF THE FOLLOWING FORMS..\n*\n*     SFLAG=-1.E0     SFLAG=0.E0        SFLAG=1.E0     SFLAG=-2.E0\n*\n*       (SH11  SH12)    (1.E0  SH12)    (SH11  1.E0)    (1.E0  0.E0)\n*     H=(          )    (          )    (          )    (          )\n*       (SH21  SH22),   (SH21  1.E0),   (-1.E0 SH22),   (0.E0  1.E0).\n*     LOCATIONS 2-4 OF SPARAM CONTAIN SH11,SH21,SH12, AND SH22\n*     RESPECTIVELY. (VALUES OF 1.E0, -1.E0, OR 0.E0 IMPLIED BY THE\n*     VALUE OF SPARAM(1) ARE NOT STORED IN SPARAM.)\n*\n*     THE VALUES OF GAMSQ AND RGAMSQ SET IN THE DATA STATEMENT MAY BE\n*     INEXACT.  THIS IS OK AS THEY ARE ONLY USED FOR TESTING THE SIZE\n*     OF SD1 AND SD2.  ALL ACTUAL SCALING OF DATA IS DONE USING GAM.\n*\n*\n*  Arguments\n*  =========\n*\n*\n*  SD1    (input/output) REAL\n*\n*  SD2    (input/output) REAL\n*\n*  SX1    (input/output) REAL\n*\n*  SY1    (input) REAL\n*\n*\n*  SPARAM (input/output)  REAL array, dimension 5\n*     SPARAM(1)=SFLAG\n*     SPARAM(2)=SH11\n*     SPARAM(3)=SH21\n*     SPARAM(4)=SH12\n*     SPARAM(5)=SH22\n*\n*  =====================================================================\n*\n*     .. Local Scalars ..\n      REAL GAM,GAMSQ,ONE,RGAMSQ,SFLAG,SH11,SH12,SH21,SH22,SP1,SP2,SQ1,\n     +     SQ2,STEMP,SU,TWO,ZERO\n      INTEGER IGO\n*     ..\n*     .. Intrinsic Functions ..\n      INTRINSIC ABS\n*     ..\n*     .. Data statements ..\n*\n      DATA ZERO,ONE,TWO/0.E0,1.E0,2.E0/\n      DATA GAM,GAMSQ,RGAMSQ/4096.E0,1.67772E7,5.96046E-8/\n*     ..\n\n      IF (.NOT.SD1.LT.ZERO) GO TO 10\n*       GO ZERO-H-D-AND-SX1..\n      GO TO 60\n   10 CONTINUE\n*     CASE-SD1-NONNEGATIVE\n      SP2 = SD2*SY1\n      IF (.NOT.SP2.EQ.ZERO) GO TO 20\n      SFLAG = -TWO\n      GO TO 260\n*     REGULAR-CASE..\n   20 CONTINUE\n      SP1 = SD1*SX1\n      SQ2 = SP2*SY1\n      SQ1 = SP1*SX1\n*\n      IF (.NOT.ABS(SQ1).GT.ABS(SQ2)) GO TO 40\n      SH21 = -SY1/SX1\n      SH12 = SP2/SP1\n*\n      SU = ONE - SH12*SH21\n*\n      IF (.NOT.SU.LE.ZERO) GO TO 30\n*         GO ZERO-H-D-AND-SX1..\n      GO TO 60\n   30 CONTINUE\n      SFLAG = ZERO\n      SD1 = SD1/SU\n      SD2 = SD2/SU\n      SX1 = SX1*SU\n*         GO SCALE-CHECK..\n      GO TO 100\n   40 CONTINUE\n      IF (.NOT.SQ2.LT.ZERO) GO TO 50\n*         GO ZERO-H-D-AND-SX1..\n      GO TO 60\n   50 CONTINUE\n      SFLAG = ONE\n      SH11 = SP1/SP2\n      SH22 = SX1/SY1\n      SU = ONE + SH11*SH22\n      STEMP = SD2/SU\n      SD2 = SD1/SU\n      SD1 = STEMP\n      SX1 = SY1*SU\n*         GO SCALE-CHECK\n      GO TO 100\n*     PROCEDURE..ZERO-H-D-AND-SX1..\n   60 CONTINUE\n      SFLAG = -ONE\n      SH11 = ZERO\n      SH12 = ZERO\n      SH21 = ZERO\n      SH22 = ZERO\n*\n      SD1 = ZERO\n      SD2 = ZERO\n      SX1 = ZERO\n*         RETURN..\n      GO TO 220\n*     PROCEDURE..FIX-H..\n   70 CONTINUE\n      IF (.NOT.SFLAG.GE.ZERO) GO TO 90\n*\n      IF (.NOT.SFLAG.EQ.ZERO) GO TO 80\n      SH11 = ONE\n      SH22 = ONE\n      SFLAG = -ONE\n      GO TO 90\n   80 CONTINUE\n      SH21 = -ONE\n      SH12 = ONE\n      SFLAG = -ONE\n   90 CONTINUE\n      GO TO IGO(120,150,180,210)\n*     PROCEDURE..SCALE-CHECK\n  100 CONTINUE\n  110 CONTINUE\n      IF (.NOT.SD1.LE.RGAMSQ) GO TO 130\n      IF (SD1.EQ.ZERO) GO TO 160\n      ASSIGN 120 TO IGO\n*              FIX-H..\n      GO TO 70\n  120 CONTINUE\n      SD1 = SD1*GAM**2\n      SX1 = SX1/GAM\n      SH11 = SH11/GAM\n      SH12 = SH12/GAM\n      GO TO 110\n  130 CONTINUE\n  140 CONTINUE\n      IF (.NOT.SD1.GE.GAMSQ) GO TO 160\n      ASSIGN 150 TO IGO\n*              FIX-H..\n      GO TO 70\n  150 CONTINUE\n      SD1 = SD1/GAM**2\n      SX1 = SX1*GAM\n      SH11 = SH11*GAM\n      SH12 = SH12*GAM\n      GO TO 140\n  160 CONTINUE\n  170 CONTINUE\n      IF (.NOT.ABS(SD2).LE.RGAMSQ) GO TO 190\n      IF (SD2.EQ.ZERO) GO TO 220\n      ASSIGN 180 TO IGO\n*              FIX-H..\n      GO TO 70\n  180 CONTINUE\n      SD2 = SD2*GAM**2\n      SH21 = SH21/GAM\n      SH22 = SH22/GAM\n      GO TO 170\n  190 CONTINUE\n  200 CONTINUE\n      IF (.NOT.ABS(SD2).GE.GAMSQ) GO TO 220\n      ASSIGN 210 TO IGO\n*              FIX-H..\n      GO TO 70\n  210 CONTINUE\n      SD2 = SD2/GAM**2\n      SH21 = SH21*GAM\n      SH22 = SH22*GAM\n      GO TO 200\n  220 CONTINUE\n      IF (SFLAG) 250,230,240\n  230 CONTINUE\n      SPARAM(3) = SH21\n      SPARAM(4) = SH12\n      GO TO 260\n  240 CONTINUE\n      SPARAM(2) = SH11\n      SPARAM(5) = SH22\n      GO TO 260\n  250 CONTINUE\n      SPARAM(2) = SH11\n      SPARAM(3) = SH21\n      SPARAM(4) = SH12\n      SPARAM(5) = SH22\n  260 CONTINUE\n      SPARAM(1) = SFLAG\n      RETURN\n      END\n"
  },
  {
    "path": "libs/eigen/blas/ssbmv.f",
    "content": "      SUBROUTINE SSBMV(UPLO,N,K,ALPHA,A,LDA,X,INCX,BETA,Y,INCY)\n*     .. Scalar Arguments ..\n      REAL ALPHA,BETA\n      INTEGER INCX,INCY,K,LDA,N\n      CHARACTER UPLO\n*     ..\n*     .. Array Arguments ..\n      REAL A(LDA,*),X(*),Y(*)\n*     ..\n*\n*  Purpose\n*  =======\n*\n*  SSBMV  performs the matrix-vector  operation\n*\n*     y := alpha*A*x + beta*y,\n*\n*  where alpha and beta are scalars, x and y are n element vectors and\n*  A is an n by n symmetric band matrix, with k super-diagonals.\n*\n*  Arguments\n*  ==========\n*\n*  UPLO   - CHARACTER*1.\n*           On entry, UPLO specifies whether the upper or lower\n*           triangular part of the band matrix A is being supplied as\n*           follows:\n*\n*              UPLO = 'U' or 'u'   The upper triangular part of A is\n*                                  being supplied.\n*\n*              UPLO = 'L' or 'l'   The lower triangular part of A is\n*                                  being supplied.\n*\n*           Unchanged on exit.\n*\n*  N      - INTEGER.\n*           On entry, N specifies the order of the matrix A.\n*           N must be at least zero.\n*           Unchanged on exit.\n*\n*  K      - INTEGER.\n*           On entry, K specifies the number of super-diagonals of the\n*           matrix A. K must satisfy  0 .le. K.\n*           Unchanged on exit.\n*\n*  ALPHA  - REAL            .\n*           On entry, ALPHA specifies the scalar alpha.\n*           Unchanged on exit.\n*\n*  A      - REAL             array of DIMENSION ( LDA, n ).\n*           Before entry with UPLO = 'U' or 'u', the leading ( k + 1 )\n*           by n part of the array A must contain the upper triangular\n*           band part of the symmetric matrix, supplied column by\n*           column, with the leading diagonal of the matrix in row\n*           ( k + 1 ) of the array, the first super-diagonal starting at\n*           position 2 in row k, and so on. The top left k by k triangle\n*           of the array A is not referenced.\n*           The following program segment will transfer the upper\n*           triangular part of a symmetric band matrix from conventional\n*           full matrix storage to band storage:\n*\n*                 DO 20, J = 1, N\n*                    M = K + 1 - J\n*                    DO 10, I = MAX( 1, J - K ), J\n*                       A( M + I, J ) = matrix( I, J )\n*              10    CONTINUE\n*              20 CONTINUE\n*\n*           Before entry with UPLO = 'L' or 'l', the leading ( k + 1 )\n*           by n part of the array A must contain the lower triangular\n*           band part of the symmetric matrix, supplied column by\n*           column, with the leading diagonal of the matrix in row 1 of\n*           the array, the first sub-diagonal starting at position 1 in\n*           row 2, and so on. The bottom right k by k triangle of the\n*           array A is not referenced.\n*           The following program segment will transfer the lower\n*           triangular part of a symmetric band matrix from conventional\n*           full matrix storage to band storage:\n*\n*                 DO 20, J = 1, N\n*                    M = 1 - J\n*                    DO 10, I = J, MIN( N, J + K )\n*                       A( M + I, J ) = matrix( I, J )\n*              10    CONTINUE\n*              20 CONTINUE\n*\n*           Unchanged on exit.\n*\n*  LDA    - INTEGER.\n*           On entry, LDA specifies the first dimension of A as declared\n*           in the calling (sub) program. LDA must be at least\n*           ( k + 1 ).\n*           Unchanged on exit.\n*\n*  X      - REAL             array of DIMENSION at least\n*           ( 1 + ( n - 1 )*abs( INCX ) ).\n*           Before entry, the incremented array X must contain the\n*           vector x.\n*           Unchanged on exit.\n*\n*  INCX   - INTEGER.\n*           On entry, INCX specifies the increment for the elements of\n*           X. INCX must not be zero.\n*           Unchanged on exit.\n*\n*  BETA   - REAL            .\n*           On entry, BETA specifies the scalar beta.\n*           Unchanged on exit.\n*\n*  Y      - REAL             array of DIMENSION at least\n*           ( 1 + ( n - 1 )*abs( INCY ) ).\n*           Before entry, the incremented array Y must contain the\n*           vector y. On exit, Y is overwritten by the updated vector y.\n*\n*  INCY   - INTEGER.\n*           On entry, INCY specifies the increment for the elements of\n*           Y. INCY must not be zero.\n*           Unchanged on exit.\n*\n*  Further Details\n*  ===============\n*\n*  Level 2 Blas routine.\n*\n*  -- Written on 22-October-1986.\n*     Jack Dongarra, Argonne National Lab.\n*     Jeremy Du Croz, Nag Central Office.\n*     Sven Hammarling, Nag Central Office.\n*     Richard Hanson, Sandia National Labs.\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      REAL ONE,ZERO\n      PARAMETER (ONE=1.0E+0,ZERO=0.0E+0)\n*     ..\n*     .. Local Scalars ..\n      REAL TEMP1,TEMP2\n      INTEGER I,INFO,IX,IY,J,JX,JY,KPLUS1,KX,KY,L\n*     ..\n*     .. External Functions ..\n      LOGICAL LSAME\n      EXTERNAL LSAME\n*     ..\n*     .. External Subroutines ..\n      EXTERNAL XERBLA\n*     ..\n*     .. Intrinsic Functions ..\n      INTRINSIC MAX,MIN\n*     ..\n*\n*     Test the input parameters.\n*\n      INFO = 0\n      IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN\n          INFO = 1\n      ELSE IF (N.LT.0) THEN\n          INFO = 2\n      ELSE IF (K.LT.0) THEN\n          INFO = 3\n      ELSE IF (LDA.LT. (K+1)) THEN\n          INFO = 6\n      ELSE IF (INCX.EQ.0) THEN\n          INFO = 8\n      ELSE IF (INCY.EQ.0) THEN\n          INFO = 11\n      END IF\n      IF (INFO.NE.0) THEN\n          CALL XERBLA('SSBMV ',INFO)\n          RETURN\n      END IF\n*\n*     Quick return if possible.\n*\n      IF ((N.EQ.0) .OR. ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN\n*\n*     Set up the start points in  X  and  Y.\n*\n      IF (INCX.GT.0) THEN\n          KX = 1\n      ELSE\n          KX = 1 - (N-1)*INCX\n      END IF\n      IF (INCY.GT.0) THEN\n          KY = 1\n      ELSE\n          KY = 1 - (N-1)*INCY\n      END IF\n*\n*     Start the operations. In this version the elements of the array A\n*     are accessed sequentially with one pass through A.\n*\n*     First form  y := beta*y.\n*\n      IF (BETA.NE.ONE) THEN\n          IF (INCY.EQ.1) THEN\n              IF (BETA.EQ.ZERO) THEN\n                  DO 10 I = 1,N\n                      Y(I) = ZERO\n   10             CONTINUE\n              ELSE\n                  DO 20 I = 1,N\n                      Y(I) = BETA*Y(I)\n   20             CONTINUE\n              END IF\n          ELSE\n              IY = KY\n              IF (BETA.EQ.ZERO) THEN\n                  DO 30 I = 1,N\n                      Y(IY) = ZERO\n                      IY = IY + INCY\n   30             CONTINUE\n              ELSE\n                  DO 40 I = 1,N\n                      Y(IY) = BETA*Y(IY)\n                      IY = IY + INCY\n   40             CONTINUE\n              END IF\n          END IF\n      END IF\n      IF (ALPHA.EQ.ZERO) RETURN\n      IF (LSAME(UPLO,'U')) THEN\n*\n*        Form  y  when upper triangle of A is stored.\n*\n          KPLUS1 = K + 1\n          IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THEN\n              DO 60 J = 1,N\n                  TEMP1 = ALPHA*X(J)\n                  TEMP2 = ZERO\n                  L = KPLUS1 - J\n                  DO 50 I = MAX(1,J-K),J - 1\n                      Y(I) = Y(I) + TEMP1*A(L+I,J)\n                      TEMP2 = TEMP2 + A(L+I,J)*X(I)\n   50             CONTINUE\n                  Y(J) = Y(J) + TEMP1*A(KPLUS1,J) + ALPHA*TEMP2\n   60         CONTINUE\n          ELSE\n              JX = KX\n              JY = KY\n              DO 80 J = 1,N\n                  TEMP1 = ALPHA*X(JX)\n                  TEMP2 = ZERO\n                  IX = KX\n                  IY = KY\n                  L = KPLUS1 - J\n                  DO 70 I = MAX(1,J-K),J - 1\n                      Y(IY) = Y(IY) + TEMP1*A(L+I,J)\n                      TEMP2 = TEMP2 + A(L+I,J)*X(IX)\n                      IX = IX + INCX\n                      IY = IY + INCY\n   70             CONTINUE\n                  Y(JY) = Y(JY) + TEMP1*A(KPLUS1,J) + ALPHA*TEMP2\n                  JX = JX + INCX\n                  JY = JY + INCY\n                  IF (J.GT.K) THEN\n                      KX = KX + INCX\n                      KY = KY + INCY\n                  END IF\n   80         CONTINUE\n          END IF\n      ELSE\n*\n*        Form  y  when lower triangle of A is stored.\n*\n          IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THEN\n              DO 100 J = 1,N\n                  TEMP1 = ALPHA*X(J)\n                  TEMP2 = ZERO\n                  Y(J) = Y(J) + TEMP1*A(1,J)\n                  L = 1 - J\n                  DO 90 I = J + 1,MIN(N,J+K)\n                      Y(I) = Y(I) + TEMP1*A(L+I,J)\n                      TEMP2 = TEMP2 + A(L+I,J)*X(I)\n   90             CONTINUE\n                  Y(J) = Y(J) + ALPHA*TEMP2\n  100         CONTINUE\n          ELSE\n              JX = KX\n              JY = KY\n              DO 120 J = 1,N\n                  TEMP1 = ALPHA*X(JX)\n                  TEMP2 = ZERO\n                  Y(JY) = Y(JY) + TEMP1*A(1,J)\n                  L = 1 - J\n                  IX = JX\n                  IY = JY\n                  DO 110 I = J + 1,MIN(N,J+K)\n                      IX = IX + INCX\n                      IY = IY + INCY\n                      Y(IY) = Y(IY) + TEMP1*A(L+I,J)\n                      TEMP2 = TEMP2 + A(L+I,J)*X(IX)\n  110             CONTINUE\n                  Y(JY) = Y(JY) + ALPHA*TEMP2\n                  JX = JX + INCX\n                  JY = JY + INCY\n  120         CONTINUE\n          END IF\n      END IF\n*\n      RETURN\n*\n*     End of SSBMV .\n*\n      END\n"
  },
  {
    "path": "libs/eigen/blas/sspmv.f",
    "content": "      SUBROUTINE SSPMV(UPLO,N,ALPHA,AP,X,INCX,BETA,Y,INCY)\n*     .. Scalar Arguments ..\n      REAL ALPHA,BETA\n      INTEGER INCX,INCY,N\n      CHARACTER UPLO\n*     ..\n*     .. Array Arguments ..\n      REAL AP(*),X(*),Y(*)\n*     ..\n*\n*  Purpose\n*  =======\n*\n*  SSPMV  performs the matrix-vector operation\n*\n*     y := alpha*A*x + beta*y,\n*\n*  where alpha and beta are scalars, x and y are n element vectors and\n*  A is an n by n symmetric matrix, supplied in packed form.\n*\n*  Arguments\n*  ==========\n*\n*  UPLO   - CHARACTER*1.\n*           On entry, UPLO specifies whether the upper or lower\n*           triangular part of the matrix A is supplied in the packed\n*           array AP as follows:\n*\n*              UPLO = 'U' or 'u'   The upper triangular part of A is\n*                                  supplied in AP.\n*\n*              UPLO = 'L' or 'l'   The lower triangular part of A is\n*                                  supplied in AP.\n*\n*           Unchanged on exit.\n*\n*  N      - INTEGER.\n*           On entry, N specifies the order of the matrix A.\n*           N must be at least zero.\n*           Unchanged on exit.\n*\n*  ALPHA  - REAL            .\n*           On entry, ALPHA specifies the scalar alpha.\n*           Unchanged on exit.\n*\n*  AP     - REAL             array of DIMENSION at least\n*           ( ( n*( n + 1 ) )/2 ).\n*           Before entry with UPLO = 'U' or 'u', the array AP must\n*           contain the upper triangular part of the symmetric matrix\n*           packed sequentially, column by column, so that AP( 1 )\n*           contains a( 1, 1 ), AP( 2 ) and AP( 3 ) contain a( 1, 2 )\n*           and a( 2, 2 ) respectively, and so on.\n*           Before entry with UPLO = 'L' or 'l', the array AP must\n*           contain the lower triangular part of the symmetric matrix\n*           packed sequentially, column by column, so that AP( 1 )\n*           contains a( 1, 1 ), AP( 2 ) and AP( 3 ) contain a( 2, 1 )\n*           and a( 3, 1 ) respectively, and so on.\n*           Unchanged on exit.\n*\n*  X      - REAL             array of dimension at least\n*           ( 1 + ( n - 1 )*abs( INCX ) ).\n*           Before entry, the incremented array X must contain the n\n*           element vector x.\n*           Unchanged on exit.\n*\n*  INCX   - INTEGER.\n*           On entry, INCX specifies the increment for the elements of\n*           X. INCX must not be zero.\n*           Unchanged on exit.\n*\n*  BETA   - REAL            .\n*           On entry, BETA specifies the scalar beta. When BETA is\n*           supplied as zero then Y need not be set on input.\n*           Unchanged on exit.\n*\n*  Y      - REAL             array of dimension at least\n*           ( 1 + ( n - 1 )*abs( INCY ) ).\n*           Before entry, the incremented array Y must contain the n\n*           element vector y. On exit, Y is overwritten by the updated\n*           vector y.\n*\n*  INCY   - INTEGER.\n*           On entry, INCY specifies the increment for the elements of\n*           Y. INCY must not be zero.\n*           Unchanged on exit.\n*\n*  Further Details\n*  ===============\n*\n*  Level 2 Blas routine.\n*\n*  -- Written on 22-October-1986.\n*     Jack Dongarra, Argonne National Lab.\n*     Jeremy Du Croz, Nag Central Office.\n*     Sven Hammarling, Nag Central Office.\n*     Richard Hanson, Sandia National Labs.\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      REAL ONE,ZERO\n      PARAMETER (ONE=1.0E+0,ZERO=0.0E+0)\n*     ..\n*     .. Local Scalars ..\n      REAL TEMP1,TEMP2\n      INTEGER I,INFO,IX,IY,J,JX,JY,K,KK,KX,KY\n*     ..\n*     .. External Functions ..\n      LOGICAL LSAME\n      EXTERNAL LSAME\n*     ..\n*     .. External Subroutines ..\n      EXTERNAL XERBLA\n*     ..\n*\n*     Test the input parameters.\n*\n      INFO = 0\n      IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN\n          INFO = 1\n      ELSE IF (N.LT.0) THEN\n          INFO = 2\n      ELSE IF (INCX.EQ.0) THEN\n          INFO = 6\n      ELSE IF (INCY.EQ.0) THEN\n          INFO = 9\n      END IF\n      IF (INFO.NE.0) THEN\n          CALL XERBLA('SSPMV ',INFO)\n          RETURN\n      END IF\n*\n*     Quick return if possible.\n*\n      IF ((N.EQ.0) .OR. ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN\n*\n*     Set up the start points in  X  and  Y.\n*\n      IF (INCX.GT.0) THEN\n          KX = 1\n      ELSE\n          KX = 1 - (N-1)*INCX\n      END IF\n      IF (INCY.GT.0) THEN\n          KY = 1\n      ELSE\n          KY = 1 - (N-1)*INCY\n      END IF\n*\n*     Start the operations. In this version the elements of the array AP\n*     are accessed sequentially with one pass through AP.\n*\n*     First form  y := beta*y.\n*\n      IF (BETA.NE.ONE) THEN\n          IF (INCY.EQ.1) THEN\n              IF (BETA.EQ.ZERO) THEN\n                  DO 10 I = 1,N\n                      Y(I) = ZERO\n   10             CONTINUE\n              ELSE\n                  DO 20 I = 1,N\n                      Y(I) = BETA*Y(I)\n   20             CONTINUE\n              END IF\n          ELSE\n              IY = KY\n              IF (BETA.EQ.ZERO) THEN\n                  DO 30 I = 1,N\n                      Y(IY) = ZERO\n                      IY = IY + INCY\n   30             CONTINUE\n              ELSE\n                  DO 40 I = 1,N\n                      Y(IY) = BETA*Y(IY)\n                      IY = IY + INCY\n   40             CONTINUE\n              END IF\n          END IF\n      END IF\n      IF (ALPHA.EQ.ZERO) RETURN\n      KK = 1\n      IF (LSAME(UPLO,'U')) THEN\n*\n*        Form  y  when AP contains the upper triangle.\n*\n          IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THEN\n              DO 60 J = 1,N\n                  TEMP1 = ALPHA*X(J)\n                  TEMP2 = ZERO\n                  K = KK\n                  DO 50 I = 1,J - 1\n                      Y(I) = Y(I) + TEMP1*AP(K)\n                      TEMP2 = TEMP2 + AP(K)*X(I)\n                      K = K + 1\n   50             CONTINUE\n                  Y(J) = Y(J) + TEMP1*AP(KK+J-1) + ALPHA*TEMP2\n                  KK = KK + J\n   60         CONTINUE\n          ELSE\n              JX = KX\n              JY = KY\n              DO 80 J = 1,N\n                  TEMP1 = ALPHA*X(JX)\n                  TEMP2 = ZERO\n                  IX = KX\n                  IY = KY\n                  DO 70 K = KK,KK + J - 2\n                      Y(IY) = Y(IY) + TEMP1*AP(K)\n                      TEMP2 = TEMP2 + AP(K)*X(IX)\n                      IX = IX + INCX\n                      IY = IY + INCY\n   70             CONTINUE\n                  Y(JY) = Y(JY) + TEMP1*AP(KK+J-1) + ALPHA*TEMP2\n                  JX = JX + INCX\n                  JY = JY + INCY\n                  KK = KK + J\n   80         CONTINUE\n          END IF\n      ELSE\n*\n*        Form  y  when AP contains the lower triangle.\n*\n          IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THEN\n              DO 100 J = 1,N\n                  TEMP1 = ALPHA*X(J)\n                  TEMP2 = ZERO\n                  Y(J) = Y(J) + TEMP1*AP(KK)\n                  K = KK + 1\n                  DO 90 I = J + 1,N\n                      Y(I) = Y(I) + TEMP1*AP(K)\n                      TEMP2 = TEMP2 + AP(K)*X(I)\n                      K = K + 1\n   90             CONTINUE\n                  Y(J) = Y(J) + ALPHA*TEMP2\n                  KK = KK + (N-J+1)\n  100         CONTINUE\n          ELSE\n              JX = KX\n              JY = KY\n              DO 120 J = 1,N\n                  TEMP1 = ALPHA*X(JX)\n                  TEMP2 = ZERO\n                  Y(JY) = Y(JY) + TEMP1*AP(KK)\n                  IX = JX\n                  IY = JY\n                  DO 110 K = KK + 1,KK + N - J\n                      IX = IX + INCX\n                      IY = IY + INCY\n                      Y(IY) = Y(IY) + TEMP1*AP(K)\n                      TEMP2 = TEMP2 + AP(K)*X(IX)\n  110             CONTINUE\n                  Y(JY) = Y(JY) + ALPHA*TEMP2\n                  JX = JX + INCX\n                  JY = JY + INCY\n                  KK = KK + (N-J+1)\n  120         CONTINUE\n          END IF\n      END IF\n*\n      RETURN\n*\n*     End of SSPMV .\n*\n      END\n"
  },
  {
    "path": "libs/eigen/blas/stbmv.f",
    "content": "      SUBROUTINE STBMV(UPLO,TRANS,DIAG,N,K,A,LDA,X,INCX)\n*     .. Scalar Arguments ..\n      INTEGER INCX,K,LDA,N\n      CHARACTER DIAG,TRANS,UPLO\n*     ..\n*     .. Array Arguments ..\n      REAL A(LDA,*),X(*)\n*     ..\n*\n*  Purpose\n*  =======\n*\n*  STBMV  performs one of the matrix-vector operations\n*\n*     x := A*x,   or   x := A'*x,\n*\n*  where x is an n element vector and  A is an n by n unit, or non-unit,\n*  upper or lower triangular band matrix, with ( k + 1 ) diagonals.\n*\n*  Arguments\n*  ==========\n*\n*  UPLO   - CHARACTER*1.\n*           On entry, UPLO specifies whether the matrix is an upper or\n*           lower triangular matrix as follows:\n*\n*              UPLO = 'U' or 'u'   A is an upper triangular matrix.\n*\n*              UPLO = 'L' or 'l'   A is a lower triangular matrix.\n*\n*           Unchanged on exit.\n*\n*  TRANS  - CHARACTER*1.\n*           On entry, TRANS specifies the operation to be performed as\n*           follows:\n*\n*              TRANS = 'N' or 'n'   x := A*x.\n*\n*              TRANS = 'T' or 't'   x := A'*x.\n*\n*              TRANS = 'C' or 'c'   x := A'*x.\n*\n*           Unchanged on exit.\n*\n*  DIAG   - CHARACTER*1.\n*           On entry, DIAG specifies whether or not A is unit\n*           triangular as follows:\n*\n*              DIAG = 'U' or 'u'   A is assumed to be unit triangular.\n*\n*              DIAG = 'N' or 'n'   A is not assumed to be unit\n*                                  triangular.\n*\n*           Unchanged on exit.\n*\n*  N      - INTEGER.\n*           On entry, N specifies the order of the matrix A.\n*           N must be at least zero.\n*           Unchanged on exit.\n*\n*  K      - INTEGER.\n*           On entry with UPLO = 'U' or 'u', K specifies the number of\n*           super-diagonals of the matrix A.\n*           On entry with UPLO = 'L' or 'l', K specifies the number of\n*           sub-diagonals of the matrix A.\n*           K must satisfy  0 .le. K.\n*           Unchanged on exit.\n*\n*  A      - REAL             array of DIMENSION ( LDA, n ).\n*           Before entry with UPLO = 'U' or 'u', the leading ( k + 1 )\n*           by n part of the array A must contain the upper triangular\n*           band part of the matrix of coefficients, supplied column by\n*           column, with the leading diagonal of the matrix in row\n*           ( k + 1 ) of the array, the first super-diagonal starting at\n*           position 2 in row k, and so on. The top left k by k triangle\n*           of the array A is not referenced.\n*           The following program segment will transfer an upper\n*           triangular band matrix from conventional full matrix storage\n*           to band storage:\n*\n*                 DO 20, J = 1, N\n*                    M = K + 1 - J\n*                    DO 10, I = MAX( 1, J - K ), J\n*                       A( M + I, J ) = matrix( I, J )\n*              10    CONTINUE\n*              20 CONTINUE\n*\n*           Before entry with UPLO = 'L' or 'l', the leading ( k + 1 )\n*           by n part of the array A must contain the lower triangular\n*           band part of the matrix of coefficients, supplied column by\n*           column, with the leading diagonal of the matrix in row 1 of\n*           the array, the first sub-diagonal starting at position 1 in\n*           row 2, and so on. The bottom right k by k triangle of the\n*           array A is not referenced.\n*           The following program segment will transfer a lower\n*           triangular band matrix from conventional full matrix storage\n*           to band storage:\n*\n*                 DO 20, J = 1, N\n*                    M = 1 - J\n*                    DO 10, I = J, MIN( N, J + K )\n*                       A( M + I, J ) = matrix( I, J )\n*              10    CONTINUE\n*              20 CONTINUE\n*\n*           Note that when DIAG = 'U' or 'u' the elements of the array A\n*           corresponding to the diagonal elements of the matrix are not\n*           referenced, but are assumed to be unity.\n*           Unchanged on exit.\n*\n*  LDA    - INTEGER.\n*           On entry, LDA specifies the first dimension of A as declared\n*           in the calling (sub) program. LDA must be at least\n*           ( k + 1 ).\n*           Unchanged on exit.\n*\n*  X      - REAL             array of dimension at least\n*           ( 1 + ( n - 1 )*abs( INCX ) ).\n*           Before entry, the incremented array X must contain the n\n*           element vector x. On exit, X is overwritten with the\n*           tranformed vector x.\n*\n*  INCX   - INTEGER.\n*           On entry, INCX specifies the increment for the elements of\n*           X. INCX must not be zero.\n*           Unchanged on exit.\n*\n*  Further Details\n*  ===============\n*\n*  Level 2 Blas routine.\n*\n*  -- Written on 22-October-1986.\n*     Jack Dongarra, Argonne National Lab.\n*     Jeremy Du Croz, Nag Central Office.\n*     Sven Hammarling, Nag Central Office.\n*     Richard Hanson, Sandia National Labs.\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      REAL ZERO\n      PARAMETER (ZERO=0.0E+0)\n*     ..\n*     .. Local Scalars ..\n      REAL TEMP\n      INTEGER I,INFO,IX,J,JX,KPLUS1,KX,L\n      LOGICAL NOUNIT\n*     ..\n*     .. External Functions ..\n      LOGICAL LSAME\n      EXTERNAL LSAME\n*     ..\n*     .. External Subroutines ..\n      EXTERNAL XERBLA\n*     ..\n*     .. Intrinsic Functions ..\n      INTRINSIC MAX,MIN\n*     ..\n*\n*     Test the input parameters.\n*\n      INFO = 0\n      IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN\n          INFO = 1\n      ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND.\n     +         .NOT.LSAME(TRANS,'C')) THEN\n          INFO = 2\n      ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN\n          INFO = 3\n      ELSE IF (N.LT.0) THEN\n          INFO = 4\n      ELSE IF (K.LT.0) THEN\n          INFO = 5\n      ELSE IF (LDA.LT. (K+1)) THEN\n          INFO = 7\n      ELSE IF (INCX.EQ.0) THEN\n          INFO = 9\n      END IF\n      IF (INFO.NE.0) THEN\n          CALL XERBLA('STBMV ',INFO)\n          RETURN\n      END IF\n*\n*     Quick return if possible.\n*\n      IF (N.EQ.0) RETURN\n*\n      NOUNIT = LSAME(DIAG,'N')\n*\n*     Set up the start point in X if the increment is not unity. This\n*     will be  ( N - 1 )*INCX   too small for descending loops.\n*\n      IF (INCX.LE.0) THEN\n          KX = 1 - (N-1)*INCX\n      ELSE IF (INCX.NE.1) THEN\n          KX = 1\n      END IF\n*\n*     Start the operations. In this version the elements of A are\n*     accessed sequentially with one pass through A.\n*\n      IF (LSAME(TRANS,'N')) THEN\n*\n*         Form  x := A*x.\n*\n          IF (LSAME(UPLO,'U')) THEN\n              KPLUS1 = K + 1\n              IF (INCX.EQ.1) THEN\n                  DO 20 J = 1,N\n                      IF (X(J).NE.ZERO) THEN\n                          TEMP = X(J)\n                          L = KPLUS1 - J\n                          DO 10 I = MAX(1,J-K),J - 1\n                              X(I) = X(I) + TEMP*A(L+I,J)\n   10                     CONTINUE\n                          IF (NOUNIT) X(J) = X(J)*A(KPLUS1,J)\n                      END IF\n   20             CONTINUE\n              ELSE\n                  JX = KX\n                  DO 40 J = 1,N\n                      IF (X(JX).NE.ZERO) THEN\n                          TEMP = X(JX)\n                          IX = KX\n                          L = KPLUS1 - J\n                          DO 30 I = MAX(1,J-K),J - 1\n                              X(IX) = X(IX) + TEMP*A(L+I,J)\n                              IX = IX + INCX\n   30                     CONTINUE\n                          IF (NOUNIT) X(JX) = X(JX)*A(KPLUS1,J)\n                      END IF\n                      JX = JX + INCX\n                      IF (J.GT.K) KX = KX + INCX\n   40             CONTINUE\n              END IF\n          ELSE\n              IF (INCX.EQ.1) THEN\n                  DO 60 J = N,1,-1\n                      IF (X(J).NE.ZERO) THEN\n                          TEMP = X(J)\n                          L = 1 - J\n                          DO 50 I = MIN(N,J+K),J + 1,-1\n                              X(I) = X(I) + TEMP*A(L+I,J)\n   50                     CONTINUE\n                          IF (NOUNIT) X(J) = X(J)*A(1,J)\n                      END IF\n   60             CONTINUE\n              ELSE\n                  KX = KX + (N-1)*INCX\n                  JX = KX\n                  DO 80 J = N,1,-1\n                      IF (X(JX).NE.ZERO) THEN\n                          TEMP = X(JX)\n                          IX = KX\n                          L = 1 - J\n                          DO 70 I = MIN(N,J+K),J + 1,-1\n                              X(IX) = X(IX) + TEMP*A(L+I,J)\n                              IX = IX - INCX\n   70                     CONTINUE\n                          IF (NOUNIT) X(JX) = X(JX)*A(1,J)\n                      END IF\n                      JX = JX - INCX\n                      IF ((N-J).GE.K) KX = KX - INCX\n   80             CONTINUE\n              END IF\n          END IF\n      ELSE\n*\n*        Form  x := A'*x.\n*\n          IF (LSAME(UPLO,'U')) THEN\n              KPLUS1 = K + 1\n              IF (INCX.EQ.1) THEN\n                  DO 100 J = N,1,-1\n                      TEMP = X(J)\n                      L = KPLUS1 - J\n                      IF (NOUNIT) TEMP = TEMP*A(KPLUS1,J)\n                      DO 90 I = J - 1,MAX(1,J-K),-1\n                          TEMP = TEMP + A(L+I,J)*X(I)\n   90                 CONTINUE\n                      X(J) = TEMP\n  100             CONTINUE\n              ELSE\n                  KX = KX + (N-1)*INCX\n                  JX = KX\n                  DO 120 J = N,1,-1\n                      TEMP = X(JX)\n                      KX = KX - INCX\n                      IX = KX\n                      L = KPLUS1 - J\n                      IF (NOUNIT) TEMP = TEMP*A(KPLUS1,J)\n                      DO 110 I = J - 1,MAX(1,J-K),-1\n                          TEMP = TEMP + A(L+I,J)*X(IX)\n                          IX = IX - INCX\n  110                 CONTINUE\n                      X(JX) = TEMP\n                      JX = JX - INCX\n  120             CONTINUE\n              END IF\n          ELSE\n              IF (INCX.EQ.1) THEN\n                  DO 140 J = 1,N\n                      TEMP = X(J)\n                      L = 1 - J\n                      IF (NOUNIT) TEMP = TEMP*A(1,J)\n                      DO 130 I = J + 1,MIN(N,J+K)\n                          TEMP = TEMP + A(L+I,J)*X(I)\n  130                 CONTINUE\n                      X(J) = TEMP\n  140             CONTINUE\n              ELSE\n                  JX = KX\n                  DO 160 J = 1,N\n                      TEMP = X(JX)\n                      KX = KX + INCX\n                      IX = KX\n                      L = 1 - J\n                      IF (NOUNIT) TEMP = TEMP*A(1,J)\n                      DO 150 I = J + 1,MIN(N,J+K)\n                          TEMP = TEMP + A(L+I,J)*X(IX)\n                          IX = IX + INCX\n  150                 CONTINUE\n                      X(JX) = TEMP\n                      JX = JX + INCX\n  160             CONTINUE\n              END IF\n          END IF\n      END IF\n*\n      RETURN\n*\n*     End of STBMV .\n*\n      END\n"
  },
  {
    "path": "libs/eigen/blas/testing/CMakeLists.txt",
    "content": "\nmacro(ei_add_blas_test testname)\n\n  set(targetname ${testname})\n\n  set(filename ${testname}.f)\n  add_executable(${targetname} ${filename})\n\n  target_link_libraries(${targetname} eigen_blas)\n\n  if(EIGEN_STANDARD_LIBRARIES_TO_LINK_TO)\n    target_link_libraries(${targetname} ${EIGEN_STANDARD_LIBRARIES_TO_LINK_TO})\n  endif()\n\n  target_link_libraries(${targetname} ${EXTERNAL_LIBS})\n\n  add_test(${testname} \"${Eigen_SOURCE_DIR}/blas/testing/runblastest.sh\" \"${testname}\" \"${Eigen_SOURCE_DIR}/blas/testing/${testname}.dat\")\n  add_dependencies(buildtests ${targetname})\n  \nendmacro(ei_add_blas_test)\n\nei_add_blas_test(sblat1)\nei_add_blas_test(sblat2)\nei_add_blas_test(sblat3)\n\nei_add_blas_test(dblat1)\nei_add_blas_test(dblat2)\nei_add_blas_test(dblat3)\n\nei_add_blas_test(cblat1)\nei_add_blas_test(cblat2)\nei_add_blas_test(cblat3)\n\nei_add_blas_test(zblat1)\nei_add_blas_test(zblat2)\nei_add_blas_test(zblat3)\n\n# add_custom_target(level1)\n# add_dependencies(level1 sblat1)\n\n"
  },
  {
    "path": "libs/eigen/blas/testing/cblat1.f",
    "content": "      PROGRAM CBLAT1\n*     Test program for the COMPLEX    Level 1 BLAS.\n*     Based upon the original BLAS test routine together with:\n*     F06GAF Example Program Text\n*     .. Parameters ..\n      INTEGER          NOUT\n      PARAMETER        (NOUT=6)\n*     .. Scalars in Common ..\n      INTEGER          ICASE, INCX, INCY, MODE, N\n      LOGICAL          PASS\n*     .. Local Scalars ..\n      REAL             SFAC\n      INTEGER          IC\n*     .. External Subroutines ..\n      EXTERNAL         CHECK1, CHECK2, HEADER\n*     .. Common blocks ..\n      COMMON           /COMBLA/ICASE, N, INCX, INCY, MODE, PASS\n*     .. Data statements ..\n      DATA             SFAC/9.765625E-4/\n*     .. Executable Statements ..\n      WRITE (NOUT,99999)\n      DO 20 IC = 1, 10\n         ICASE = IC\n         CALL HEADER\n*\n*        Initialize PASS, INCX, INCY, and MODE for a new case.\n*        The value 9999 for INCX, INCY or MODE will appear in the\n*        detailed  output, if any, for cases that do not involve\n*        these parameters.\n*\n         PASS = .TRUE.\n         INCX = 9999\n         INCY = 9999\n         MODE = 9999\n         IF (ICASE.LE.5) THEN\n            CALL CHECK2(SFAC)\n         ELSE IF (ICASE.GE.6) THEN\n            CALL CHECK1(SFAC)\n         END IF\n*        -- Print\n         IF (PASS) WRITE (NOUT,99998)\n   20 CONTINUE\n      STOP\n*\n99999 FORMAT (' Complex BLAS Test Program Results',/1X)\n99998 FORMAT ('                                    ----- PASS -----')\n      END\n      SUBROUTINE HEADER\n*     .. Parameters ..\n      INTEGER          NOUT\n      PARAMETER        (NOUT=6)\n*     .. Scalars in Common ..\n      INTEGER          ICASE, INCX, INCY, MODE, N\n      LOGICAL          PASS\n*     .. Local Arrays ..\n      CHARACTER*6      L(10)\n*     .. Common blocks ..\n      COMMON           /COMBLA/ICASE, N, INCX, INCY, MODE, PASS\n*     .. Data statements ..\n      DATA             L(1)/'CDOTC '/\n      DATA             L(2)/'CDOTU '/\n      DATA             L(3)/'CAXPY '/\n      DATA             L(4)/'CCOPY '/\n      DATA             L(5)/'CSWAP '/\n      DATA             L(6)/'SCNRM2'/\n      DATA             L(7)/'SCASUM'/\n      DATA             L(8)/'CSCAL '/\n      DATA             L(9)/'CSSCAL'/\n      DATA             L(10)/'ICAMAX'/\n*     .. Executable Statements ..\n      WRITE (NOUT,99999) ICASE, L(ICASE)\n      RETURN\n*\n99999 FORMAT (/' Test of subprogram number',I3,12X,A6)\n      END\n      SUBROUTINE CHECK1(SFAC)\n*     .. Parameters ..\n      INTEGER           NOUT\n      PARAMETER         (NOUT=6)\n*     .. Scalar Arguments ..\n      REAL              SFAC\n*     .. Scalars in Common ..\n      INTEGER           ICASE, INCX, INCY, MODE, N\n      LOGICAL           PASS\n*     .. Local Scalars ..\n      COMPLEX           CA\n      REAL              SA\n      INTEGER           I, J, LEN, NP1\n*     .. Local Arrays ..\n      COMPLEX           CTRUE5(8,5,2), CTRUE6(8,5,2), CV(8,5,2), CX(8),\n     +                  MWPCS(5), MWPCT(5)\n      REAL              STRUE2(5), STRUE4(5)\n      INTEGER           ITRUE3(5)\n*     .. External Functions ..\n      REAL              SCASUM, SCNRM2\n      INTEGER           ICAMAX\n      EXTERNAL          SCASUM, SCNRM2, ICAMAX\n*     .. External Subroutines ..\n      EXTERNAL          CSCAL, CSSCAL, CTEST, ITEST1, STEST1\n*     .. Intrinsic Functions ..\n      INTRINSIC         MAX\n*     .. Common blocks ..\n      COMMON            /COMBLA/ICASE, N, INCX, INCY, MODE, PASS\n*     .. Data statements ..\n      DATA              SA, CA/0.3E0, (0.4E0,-0.7E0)/\n      DATA              ((CV(I,J,1),I=1,8),J=1,5)/(0.1E0,0.1E0),\n     +                  (1.0E0,2.0E0), (1.0E0,2.0E0), (1.0E0,2.0E0),\n     +                  (1.0E0,2.0E0), (1.0E0,2.0E0), (1.0E0,2.0E0),\n     +                  (1.0E0,2.0E0), (0.3E0,-0.4E0), (3.0E0,4.0E0),\n     +                  (3.0E0,4.0E0), (3.0E0,4.0E0), (3.0E0,4.0E0),\n     +                  (3.0E0,4.0E0), (3.0E0,4.0E0), (3.0E0,4.0E0),\n     +                  (0.1E0,-0.3E0), (0.5E0,-0.1E0), (5.0E0,6.0E0),\n     +                  (5.0E0,6.0E0), (5.0E0,6.0E0), (5.0E0,6.0E0),\n     +                  (5.0E0,6.0E0), (5.0E0,6.0E0), (0.1E0,0.1E0),\n     +                  (-0.6E0,0.1E0), (0.1E0,-0.3E0), (7.0E0,8.0E0),\n     +                  (7.0E0,8.0E0), (7.0E0,8.0E0), (7.0E0,8.0E0),\n     +                  (7.0E0,8.0E0), (0.3E0,0.1E0), (0.1E0,0.4E0),\n     +                  (0.4E0,0.1E0), (0.1E0,0.2E0), (2.0E0,3.0E0),\n     +                  (2.0E0,3.0E0), (2.0E0,3.0E0), (2.0E0,3.0E0)/\n      DATA              ((CV(I,J,2),I=1,8),J=1,5)/(0.1E0,0.1E0),\n     +                  (4.0E0,5.0E0), (4.0E0,5.0E0), (4.0E0,5.0E0),\n     +                  (4.0E0,5.0E0), (4.0E0,5.0E0), (4.0E0,5.0E0),\n     +                  (4.0E0,5.0E0), (0.3E0,-0.4E0), (6.0E0,7.0E0),\n     +                  (6.0E0,7.0E0), (6.0E0,7.0E0), (6.0E0,7.0E0),\n     +                  (6.0E0,7.0E0), (6.0E0,7.0E0), (6.0E0,7.0E0),\n     +                  (0.1E0,-0.3E0), (8.0E0,9.0E0), (0.5E0,-0.1E0),\n     +                  (2.0E0,5.0E0), (2.0E0,5.0E0), (2.0E0,5.0E0),\n     +                  (2.0E0,5.0E0), (2.0E0,5.0E0), (0.1E0,0.1E0),\n     +                  (3.0E0,6.0E0), (-0.6E0,0.1E0), (4.0E0,7.0E0),\n     +                  (0.1E0,-0.3E0), (7.0E0,2.0E0), (7.0E0,2.0E0),\n     +                  (7.0E0,2.0E0), (0.3E0,0.1E0), (5.0E0,8.0E0),\n     +                  (0.1E0,0.4E0), (6.0E0,9.0E0), (0.4E0,0.1E0),\n     +                  (8.0E0,3.0E0), (0.1E0,0.2E0), (9.0E0,4.0E0)/\n      DATA              STRUE2/0.0E0, 0.5E0, 0.6E0, 0.7E0, 0.7E0/\n      DATA              STRUE4/0.0E0, 0.7E0, 1.0E0, 1.3E0, 1.7E0/\n      DATA              ((CTRUE5(I,J,1),I=1,8),J=1,5)/(0.1E0,0.1E0),\n     +                  (1.0E0,2.0E0), (1.0E0,2.0E0), (1.0E0,2.0E0),\n     +                  (1.0E0,2.0E0), (1.0E0,2.0E0), (1.0E0,2.0E0),\n     +                  (1.0E0,2.0E0), (-0.16E0,-0.37E0), (3.0E0,4.0E0),\n     +                  (3.0E0,4.0E0), (3.0E0,4.0E0), (3.0E0,4.0E0),\n     +                  (3.0E0,4.0E0), (3.0E0,4.0E0), (3.0E0,4.0E0),\n     +                  (-0.17E0,-0.19E0), (0.13E0,-0.39E0),\n     +                  (5.0E0,6.0E0), (5.0E0,6.0E0), (5.0E0,6.0E0),\n     +                  (5.0E0,6.0E0), (5.0E0,6.0E0), (5.0E0,6.0E0),\n     +                  (0.11E0,-0.03E0), (-0.17E0,0.46E0),\n     +                  (-0.17E0,-0.19E0), (7.0E0,8.0E0), (7.0E0,8.0E0),\n     +                  (7.0E0,8.0E0), (7.0E0,8.0E0), (7.0E0,8.0E0),\n     +                  (0.19E0,-0.17E0), (0.32E0,0.09E0),\n     +                  (0.23E0,-0.24E0), (0.18E0,0.01E0),\n     +                  (2.0E0,3.0E0), (2.0E0,3.0E0), (2.0E0,3.0E0),\n     +                  (2.0E0,3.0E0)/\n      DATA              ((CTRUE5(I,J,2),I=1,8),J=1,5)/(0.1E0,0.1E0),\n     +                  (4.0E0,5.0E0), (4.0E0,5.0E0), (4.0E0,5.0E0),\n     +                  (4.0E0,5.0E0), (4.0E0,5.0E0), (4.0E0,5.0E0),\n     +                  (4.0E0,5.0E0), (-0.16E0,-0.37E0), (6.0E0,7.0E0),\n     +                  (6.0E0,7.0E0), (6.0E0,7.0E0), (6.0E0,7.0E0),\n     +                  (6.0E0,7.0E0), (6.0E0,7.0E0), (6.0E0,7.0E0),\n     +                  (-0.17E0,-0.19E0), (8.0E0,9.0E0),\n     +                  (0.13E0,-0.39E0), (2.0E0,5.0E0), (2.0E0,5.0E0),\n     +                  (2.0E0,5.0E0), (2.0E0,5.0E0), (2.0E0,5.0E0),\n     +                  (0.11E0,-0.03E0), (3.0E0,6.0E0),\n     +                  (-0.17E0,0.46E0), (4.0E0,7.0E0),\n     +                  (-0.17E0,-0.19E0), (7.0E0,2.0E0), (7.0E0,2.0E0),\n     +                  (7.0E0,2.0E0), (0.19E0,-0.17E0), (5.0E0,8.0E0),\n     +                  (0.32E0,0.09E0), (6.0E0,9.0E0),\n     +                  (0.23E0,-0.24E0), (8.0E0,3.0E0),\n     +                  (0.18E0,0.01E0), (9.0E0,4.0E0)/\n      DATA              ((CTRUE6(I,J,1),I=1,8),J=1,5)/(0.1E0,0.1E0),\n     +                  (1.0E0,2.0E0), (1.0E0,2.0E0), (1.0E0,2.0E0),\n     +                  (1.0E0,2.0E0), (1.0E0,2.0E0), (1.0E0,2.0E0),\n     +                  (1.0E0,2.0E0), (0.09E0,-0.12E0), (3.0E0,4.0E0),\n     +                  (3.0E0,4.0E0), (3.0E0,4.0E0), (3.0E0,4.0E0),\n     +                  (3.0E0,4.0E0), (3.0E0,4.0E0), (3.0E0,4.0E0),\n     +                  (0.03E0,-0.09E0), (0.15E0,-0.03E0),\n     +                  (5.0E0,6.0E0), (5.0E0,6.0E0), (5.0E0,6.0E0),\n     +                  (5.0E0,6.0E0), (5.0E0,6.0E0), (5.0E0,6.0E0),\n     +                  (0.03E0,0.03E0), (-0.18E0,0.03E0),\n     +                  (0.03E0,-0.09E0), (7.0E0,8.0E0), (7.0E0,8.0E0),\n     +                  (7.0E0,8.0E0), (7.0E0,8.0E0), (7.0E0,8.0E0),\n     +                  (0.09E0,0.03E0), (0.03E0,0.12E0),\n     +                  (0.12E0,0.03E0), (0.03E0,0.06E0), (2.0E0,3.0E0),\n     +                  (2.0E0,3.0E0), (2.0E0,3.0E0), (2.0E0,3.0E0)/\n      DATA              ((CTRUE6(I,J,2),I=1,8),J=1,5)/(0.1E0,0.1E0),\n     +                  (4.0E0,5.0E0), (4.0E0,5.0E0), (4.0E0,5.0E0),\n     +                  (4.0E0,5.0E0), (4.0E0,5.0E0), (4.0E0,5.0E0),\n     +                  (4.0E0,5.0E0), (0.09E0,-0.12E0), (6.0E0,7.0E0),\n     +                  (6.0E0,7.0E0), (6.0E0,7.0E0), (6.0E0,7.0E0),\n     +                  (6.0E0,7.0E0), (6.0E0,7.0E0), (6.0E0,7.0E0),\n     +                  (0.03E0,-0.09E0), (8.0E0,9.0E0),\n     +                  (0.15E0,-0.03E0), (2.0E0,5.0E0), (2.0E0,5.0E0),\n     +                  (2.0E0,5.0E0), (2.0E0,5.0E0), (2.0E0,5.0E0),\n     +                  (0.03E0,0.03E0), (3.0E0,6.0E0),\n     +                  (-0.18E0,0.03E0), (4.0E0,7.0E0),\n     +                  (0.03E0,-0.09E0), (7.0E0,2.0E0), (7.0E0,2.0E0),\n     +                  (7.0E0,2.0E0), (0.09E0,0.03E0), (5.0E0,8.0E0),\n     +                  (0.03E0,0.12E0), (6.0E0,9.0E0), (0.12E0,0.03E0),\n     +                  (8.0E0,3.0E0), (0.03E0,0.06E0), (9.0E0,4.0E0)/\n      DATA              ITRUE3/0, 1, 2, 2, 2/\n*     .. Executable Statements ..\n      DO 60 INCX = 1, 2\n         DO 40 NP1 = 1, 5\n            N = NP1 - 1\n            LEN = 2*MAX(N,1)\n*           .. Set vector arguments ..\n            DO 20 I = 1, LEN\n               CX(I) = CV(I,NP1,INCX)\n   20       CONTINUE\n            IF (ICASE.EQ.6) THEN\n*              .. SCNRM2 ..\n               CALL STEST1(SCNRM2(N,CX,INCX),STRUE2(NP1),STRUE2(NP1),\n     +                     SFAC)\n            ELSE IF (ICASE.EQ.7) THEN\n*              .. SCASUM ..\n               CALL STEST1(SCASUM(N,CX,INCX),STRUE4(NP1),STRUE4(NP1),\n     +                     SFAC)\n            ELSE IF (ICASE.EQ.8) THEN\n*              .. CSCAL ..\n               CALL CSCAL(N,CA,CX,INCX)\n               CALL CTEST(LEN,CX,CTRUE5(1,NP1,INCX),CTRUE5(1,NP1,INCX),\n     +                    SFAC)\n            ELSE IF (ICASE.EQ.9) THEN\n*              .. CSSCAL ..\n               CALL CSSCAL(N,SA,CX,INCX)\n               CALL CTEST(LEN,CX,CTRUE6(1,NP1,INCX),CTRUE6(1,NP1,INCX),\n     +                    SFAC)\n            ELSE IF (ICASE.EQ.10) THEN\n*              .. ICAMAX ..\n               CALL ITEST1(ICAMAX(N,CX,INCX),ITRUE3(NP1))\n            ELSE\n               WRITE (NOUT,*) ' Shouldn''t be here in CHECK1'\n               STOP\n            END IF\n*\n   40    CONTINUE\n   60 CONTINUE\n*\n      INCX = 1\n      IF (ICASE.EQ.8) THEN\n*        CSCAL\n*        Add a test for alpha equal to zero.\n         CA = (0.0E0,0.0E0)\n         DO 80 I = 1, 5\n            MWPCT(I) = (0.0E0,0.0E0)\n            MWPCS(I) = (1.0E0,1.0E0)\n   80    CONTINUE\n         CALL CSCAL(5,CA,CX,INCX)\n         CALL CTEST(5,CX,MWPCT,MWPCS,SFAC)\n      ELSE IF (ICASE.EQ.9) THEN\n*        CSSCAL\n*        Add a test for alpha equal to zero.\n         SA = 0.0E0\n         DO 100 I = 1, 5\n            MWPCT(I) = (0.0E0,0.0E0)\n            MWPCS(I) = (1.0E0,1.0E0)\n  100    CONTINUE\n         CALL CSSCAL(5,SA,CX,INCX)\n         CALL CTEST(5,CX,MWPCT,MWPCS,SFAC)\n*        Add a test for alpha equal to one.\n         SA = 1.0E0\n         DO 120 I = 1, 5\n            MWPCT(I) = CX(I)\n            MWPCS(I) = CX(I)\n  120    CONTINUE\n         CALL CSSCAL(5,SA,CX,INCX)\n         CALL CTEST(5,CX,MWPCT,MWPCS,SFAC)\n*        Add a test for alpha equal to minus one.\n         SA = -1.0E0\n         DO 140 I = 1, 5\n            MWPCT(I) = -CX(I)\n            MWPCS(I) = -CX(I)\n  140    CONTINUE\n         CALL CSSCAL(5,SA,CX,INCX)\n         CALL CTEST(5,CX,MWPCT,MWPCS,SFAC)\n      END IF\n      RETURN\n      END\n      SUBROUTINE CHECK2(SFAC)\n*     .. Parameters ..\n      INTEGER           NOUT\n      PARAMETER         (NOUT=6)\n*     .. Scalar Arguments ..\n      REAL              SFAC\n*     .. Scalars in Common ..\n      INTEGER           ICASE, INCX, INCY, MODE, N\n      LOGICAL           PASS\n*     .. Local Scalars ..\n      COMPLEX           CA\n      INTEGER           I, J, KI, KN, KSIZE, LENX, LENY, MX, MY\n*     .. Local Arrays ..\n      COMPLEX           CDOT(1), CSIZE1(4), CSIZE2(7,2), CSIZE3(14),\n     +                  CT10X(7,4,4), CT10Y(7,4,4), CT6(4,4), CT7(4,4),\n     +                  CT8(7,4,4), CX(7), CX1(7), CY(7), CY1(7)\n      INTEGER           INCXS(4), INCYS(4), LENS(4,2), NS(4)\n*     .. External Functions ..\n      COMPLEX           CDOTC, CDOTU\n      EXTERNAL          CDOTC, CDOTU\n*     .. External Subroutines ..\n      EXTERNAL          CAXPY, CCOPY, CSWAP, CTEST\n*     .. Intrinsic Functions ..\n      INTRINSIC         ABS, MIN\n*     .. Common blocks ..\n      COMMON            /COMBLA/ICASE, N, INCX, INCY, MODE, PASS\n*     .. Data statements ..\n      DATA              CA/(0.4E0,-0.7E0)/\n      DATA              INCXS/1, 2, -2, -1/\n      DATA              INCYS/1, -2, 1, -2/\n      DATA              LENS/1, 1, 2, 4, 1, 1, 3, 7/\n      DATA              NS/0, 1, 2, 4/\n      DATA              CX1/(0.7E0,-0.8E0), (-0.4E0,-0.7E0),\n     +                  (-0.1E0,-0.9E0), (0.2E0,-0.8E0),\n     +                  (-0.9E0,-0.4E0), (0.1E0,0.4E0), (-0.6E0,0.6E0)/\n      DATA              CY1/(0.6E0,-0.6E0), (-0.9E0,0.5E0),\n     +                  (0.7E0,-0.6E0), (0.1E0,-0.5E0), (-0.1E0,-0.2E0),\n     +                  (-0.5E0,-0.3E0), (0.8E0,-0.7E0)/\n      DATA              ((CT8(I,J,1),I=1,7),J=1,4)/(0.6E0,-0.6E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.32E0,-1.41E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.32E0,-1.41E0),\n     +                  (-1.55E0,0.5E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.32E0,-1.41E0), (-1.55E0,0.5E0),\n     +                  (0.03E0,-0.89E0), (-0.38E0,-0.96E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0)/\n      DATA              ((CT8(I,J,2),I=1,7),J=1,4)/(0.6E0,-0.6E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.32E0,-1.41E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (-0.07E0,-0.89E0),\n     +                  (-0.9E0,0.5E0), (0.42E0,-1.41E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.78E0,0.06E0), (-0.9E0,0.5E0),\n     +                  (0.06E0,-0.13E0), (0.1E0,-0.5E0),\n     +                  (-0.77E0,-0.49E0), (-0.5E0,-0.3E0),\n     +                  (0.52E0,-1.51E0)/\n      DATA              ((CT8(I,J,3),I=1,7),J=1,4)/(0.6E0,-0.6E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.32E0,-1.41E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (-0.07E0,-0.89E0),\n     +                  (-1.18E0,-0.31E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.78E0,0.06E0), (-1.54E0,0.97E0),\n     +                  (0.03E0,-0.89E0), (-0.18E0,-1.31E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0)/\n      DATA              ((CT8(I,J,4),I=1,7),J=1,4)/(0.6E0,-0.6E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.32E0,-1.41E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.32E0,-1.41E0), (-0.9E0,0.5E0),\n     +                  (0.05E0,-0.6E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.32E0,-1.41E0),\n     +                  (-0.9E0,0.5E0), (0.05E0,-0.6E0), (0.1E0,-0.5E0),\n     +                  (-0.77E0,-0.49E0), (-0.5E0,-0.3E0),\n     +                  (0.32E0,-1.16E0)/\n      DATA              CT7/(0.0E0,0.0E0), (-0.06E0,-0.90E0),\n     +                  (0.65E0,-0.47E0), (-0.34E0,-1.22E0),\n     +                  (0.0E0,0.0E0), (-0.06E0,-0.90E0),\n     +                  (-0.59E0,-1.46E0), (-1.04E0,-0.04E0),\n     +                  (0.0E0,0.0E0), (-0.06E0,-0.90E0),\n     +                  (-0.83E0,0.59E0), (0.07E0,-0.37E0),\n     +                  (0.0E0,0.0E0), (-0.06E0,-0.90E0),\n     +                  (-0.76E0,-1.15E0), (-1.33E0,-1.82E0)/\n      DATA              CT6/(0.0E0,0.0E0), (0.90E0,0.06E0),\n     +                  (0.91E0,-0.77E0), (1.80E0,-0.10E0),\n     +                  (0.0E0,0.0E0), (0.90E0,0.06E0), (1.45E0,0.74E0),\n     +                  (0.20E0,0.90E0), (0.0E0,0.0E0), (0.90E0,0.06E0),\n     +                  (-0.55E0,0.23E0), (0.83E0,-0.39E0),\n     +                  (0.0E0,0.0E0), (0.90E0,0.06E0), (1.04E0,0.79E0),\n     +                  (1.95E0,1.22E0)/\n      DATA              ((CT10X(I,J,1),I=1,7),J=1,4)/(0.7E0,-0.8E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.6E0,-0.6E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.6E0,-0.6E0), (-0.9E0,0.5E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.6E0,-0.6E0),\n     +                  (-0.9E0,0.5E0), (0.7E0,-0.6E0), (0.1E0,-0.5E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0)/\n      DATA              ((CT10X(I,J,2),I=1,7),J=1,4)/(0.7E0,-0.8E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.6E0,-0.6E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.7E0,-0.6E0), (-0.4E0,-0.7E0),\n     +                  (0.6E0,-0.6E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.8E0,-0.7E0),\n     +                  (-0.4E0,-0.7E0), (-0.1E0,-0.2E0),\n     +                  (0.2E0,-0.8E0), (0.7E0,-0.6E0), (0.1E0,0.4E0),\n     +                  (0.6E0,-0.6E0)/\n      DATA              ((CT10X(I,J,3),I=1,7),J=1,4)/(0.7E0,-0.8E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.6E0,-0.6E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (-0.9E0,0.5E0), (-0.4E0,-0.7E0),\n     +                  (0.6E0,-0.6E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.1E0,-0.5E0),\n     +                  (-0.4E0,-0.7E0), (0.7E0,-0.6E0), (0.2E0,-0.8E0),\n     +                  (-0.9E0,0.5E0), (0.1E0,0.4E0), (0.6E0,-0.6E0)/\n      DATA              ((CT10X(I,J,4),I=1,7),J=1,4)/(0.7E0,-0.8E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.6E0,-0.6E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.6E0,-0.6E0), (0.7E0,-0.6E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.6E0,-0.6E0),\n     +                  (0.7E0,-0.6E0), (-0.1E0,-0.2E0), (0.8E0,-0.7E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0)/\n      DATA              ((CT10Y(I,J,1),I=1,7),J=1,4)/(0.6E0,-0.6E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.7E0,-0.8E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.7E0,-0.8E0), (-0.4E0,-0.7E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.7E0,-0.8E0),\n     +                  (-0.4E0,-0.7E0), (-0.1E0,-0.9E0),\n     +                  (0.2E0,-0.8E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0)/\n      DATA              ((CT10Y(I,J,2),I=1,7),J=1,4)/(0.6E0,-0.6E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.7E0,-0.8E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (-0.1E0,-0.9E0), (-0.9E0,0.5E0),\n     +                  (0.7E0,-0.8E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (-0.6E0,0.6E0),\n     +                  (-0.9E0,0.5E0), (-0.9E0,-0.4E0), (0.1E0,-0.5E0),\n     +                  (-0.1E0,-0.9E0), (-0.5E0,-0.3E0),\n     +                  (0.7E0,-0.8E0)/\n      DATA              ((CT10Y(I,J,3),I=1,7),J=1,4)/(0.6E0,-0.6E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.7E0,-0.8E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (-0.1E0,-0.9E0), (0.7E0,-0.8E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (-0.6E0,0.6E0),\n     +                  (-0.9E0,-0.4E0), (-0.1E0,-0.9E0),\n     +                  (0.7E0,-0.8E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0)/\n      DATA              ((CT10Y(I,J,4),I=1,7),J=1,4)/(0.6E0,-0.6E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.7E0,-0.8E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.7E0,-0.8E0), (-0.9E0,0.5E0),\n     +                  (-0.4E0,-0.7E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.7E0,-0.8E0),\n     +                  (-0.9E0,0.5E0), (-0.4E0,-0.7E0), (0.1E0,-0.5E0),\n     +                  (-0.1E0,-0.9E0), (-0.5E0,-0.3E0),\n     +                  (0.2E0,-0.8E0)/\n      DATA              CSIZE1/(0.0E0,0.0E0), (0.9E0,0.9E0),\n     +                  (1.63E0,1.73E0), (2.90E0,2.78E0)/\n      DATA              CSIZE3/(0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (1.17E0,1.17E0),\n     +                  (1.17E0,1.17E0), (1.17E0,1.17E0),\n     +                  (1.17E0,1.17E0), (1.17E0,1.17E0),\n     +                  (1.17E0,1.17E0), (1.17E0,1.17E0)/\n      DATA              CSIZE2/(0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (0.0E0,0.0E0),\n     +                  (0.0E0,0.0E0), (0.0E0,0.0E0), (1.54E0,1.54E0),\n     +                  (1.54E0,1.54E0), (1.54E0,1.54E0),\n     +                  (1.54E0,1.54E0), (1.54E0,1.54E0),\n     +                  (1.54E0,1.54E0), (1.54E0,1.54E0)/\n*     .. Executable Statements ..\n      DO 60 KI = 1, 4\n         INCX = INCXS(KI)\n         INCY = INCYS(KI)\n         MX = ABS(INCX)\n         MY = ABS(INCY)\n*\n         DO 40 KN = 1, 4\n            N = NS(KN)\n            KSIZE = MIN(2,KN)\n            LENX = LENS(KN,MX)\n            LENY = LENS(KN,MY)\n*           .. initialize all argument arrays ..\n            DO 20 I = 1, 7\n               CX(I) = CX1(I)\n               CY(I) = CY1(I)\n   20       CONTINUE\n            IF (ICASE.EQ.1) THEN\n*              .. CDOTC ..\n               CDOT(1) = CDOTC(N,CX,INCX,CY,INCY)\n               CALL CTEST(1,CDOT,CT6(KN,KI),CSIZE1(KN),SFAC)\n            ELSE IF (ICASE.EQ.2) THEN\n*              .. CDOTU ..\n               CDOT(1) = CDOTU(N,CX,INCX,CY,INCY)\n               CALL CTEST(1,CDOT,CT7(KN,KI),CSIZE1(KN),SFAC)\n            ELSE IF (ICASE.EQ.3) THEN\n*              .. CAXPY ..\n               CALL CAXPY(N,CA,CX,INCX,CY,INCY)\n               CALL CTEST(LENY,CY,CT8(1,KN,KI),CSIZE2(1,KSIZE),SFAC)\n            ELSE IF (ICASE.EQ.4) THEN\n*              .. CCOPY ..\n               CALL CCOPY(N,CX,INCX,CY,INCY)\n               CALL CTEST(LENY,CY,CT10Y(1,KN,KI),CSIZE3,1.0E0)\n            ELSE IF (ICASE.EQ.5) THEN\n*              .. CSWAP ..\n               CALL CSWAP(N,CX,INCX,CY,INCY)\n               CALL CTEST(LENX,CX,CT10X(1,KN,KI),CSIZE3,1.0E0)\n               CALL CTEST(LENY,CY,CT10Y(1,KN,KI),CSIZE3,1.0E0)\n            ELSE\n               WRITE (NOUT,*) ' Shouldn''t be here in CHECK2'\n               STOP\n            END IF\n*\n   40    CONTINUE\n   60 CONTINUE\n      RETURN\n      END\n      SUBROUTINE STEST(LEN,SCOMP,STRUE,SSIZE,SFAC)\n*     ********************************* STEST **************************\n*\n*     THIS SUBR COMPARES ARRAYS  SCOMP() AND STRUE() OF LENGTH LEN TO\n*     SEE IF THE TERM BY TERM DIFFERENCES, MULTIPLIED BY SFAC, ARE\n*     NEGLIGIBLE.\n*\n*     C. L. LAWSON, JPL, 1974 DEC 10\n*\n*     .. Parameters ..\n      INTEGER          NOUT\n      PARAMETER        (NOUT=6)\n*     .. Scalar Arguments ..\n      REAL             SFAC\n      INTEGER          LEN\n*     .. Array Arguments ..\n      REAL             SCOMP(LEN), SSIZE(LEN), STRUE(LEN)\n*     .. Scalars in Common ..\n      INTEGER          ICASE, INCX, INCY, MODE, N\n      LOGICAL          PASS\n*     .. Local Scalars ..\n      REAL             SD\n      INTEGER          I\n*     .. External Functions ..\n      REAL             SDIFF\n      EXTERNAL         SDIFF\n*     .. Intrinsic Functions ..\n      INTRINSIC        ABS\n*     .. Common blocks ..\n      COMMON           /COMBLA/ICASE, N, INCX, INCY, MODE, PASS\n*     .. Executable Statements ..\n*\n      DO 40 I = 1, LEN\n         SD = SCOMP(I) - STRUE(I)\n         IF (SDIFF(ABS(SSIZE(I))+ABS(SFAC*SD),ABS(SSIZE(I))).EQ.0.0E0)\n     +       GO TO 40\n*\n*                             HERE    SCOMP(I) IS NOT CLOSE TO STRUE(I).\n*\n         IF ( .NOT. PASS) GO TO 20\n*                             PRINT FAIL MESSAGE AND HEADER.\n         PASS = .FALSE.\n         WRITE (NOUT,99999)\n         WRITE (NOUT,99998)\n   20    WRITE (NOUT,99997) ICASE, N, INCX, INCY, MODE, I, SCOMP(I),\n     +     STRUE(I), SD, SSIZE(I)\n   40 CONTINUE\n      RETURN\n*\n99999 FORMAT ('                                       FAIL')\n99998 FORMAT (/' CASE  N INCX INCY MODE  I                            ',\n     +       ' COMP(I)                             TRUE(I)  DIFFERENCE',\n     +       '     SIZE(I)',/1X)\n99997 FORMAT (1X,I4,I3,3I5,I3,2E36.8,2E12.4)\n      END\n      SUBROUTINE STEST1(SCOMP1,STRUE1,SSIZE,SFAC)\n*     ************************* STEST1 *****************************\n*\n*     THIS IS AN INTERFACE SUBROUTINE TO ACCOMODATE THE FORTRAN\n*     REQUIREMENT THAT WHEN A DUMMY ARGUMENT IS AN ARRAY, THE\n*     ACTUAL ARGUMENT MUST ALSO BE AN ARRAY OR AN ARRAY ELEMENT.\n*\n*     C.L. LAWSON, JPL, 1978 DEC 6\n*\n*     .. Scalar Arguments ..\n      REAL              SCOMP1, SFAC, STRUE1\n*     .. Array Arguments ..\n      REAL              SSIZE(*)\n*     .. Local Arrays ..\n      REAL              SCOMP(1), STRUE(1)\n*     .. External Subroutines ..\n      EXTERNAL          STEST\n*     .. Executable Statements ..\n*\n      SCOMP(1) = SCOMP1\n      STRUE(1) = STRUE1\n      CALL STEST(1,SCOMP,STRUE,SSIZE,SFAC)\n*\n      RETURN\n      END\n      REAL             FUNCTION SDIFF(SA,SB)\n*     ********************************* SDIFF **************************\n*     COMPUTES DIFFERENCE OF TWO NUMBERS.  C. L. LAWSON, JPL 1974 FEB 15\n*\n*     .. Scalar Arguments ..\n      REAL                            SA, SB\n*     .. Executable Statements ..\n      SDIFF = SA - SB\n      RETURN\n      END\n      SUBROUTINE CTEST(LEN,CCOMP,CTRUE,CSIZE,SFAC)\n*     **************************** CTEST *****************************\n*\n*     C.L. LAWSON, JPL, 1978 DEC 6\n*\n*     .. Scalar Arguments ..\n      REAL             SFAC\n      INTEGER          LEN\n*     .. Array Arguments ..\n      COMPLEX          CCOMP(LEN), CSIZE(LEN), CTRUE(LEN)\n*     .. Local Scalars ..\n      INTEGER          I\n*     .. Local Arrays ..\n      REAL             SCOMP(20), SSIZE(20), STRUE(20)\n*     .. External Subroutines ..\n      EXTERNAL         STEST\n*     .. Intrinsic Functions ..\n      INTRINSIC        AIMAG, REAL\n*     .. Executable Statements ..\n      DO 20 I = 1, LEN\n         SCOMP(2*I-1) = REAL(CCOMP(I))\n         SCOMP(2*I) = AIMAG(CCOMP(I))\n         STRUE(2*I-1) = REAL(CTRUE(I))\n         STRUE(2*I) = AIMAG(CTRUE(I))\n         SSIZE(2*I-1) = REAL(CSIZE(I))\n         SSIZE(2*I) = AIMAG(CSIZE(I))\n   20 CONTINUE\n*\n      CALL STEST(2*LEN,SCOMP,STRUE,SSIZE,SFAC)\n      RETURN\n      END\n      SUBROUTINE ITEST1(ICOMP,ITRUE)\n*     ********************************* ITEST1 *************************\n*\n*     THIS SUBROUTINE COMPARES THE VARIABLES ICOMP AND ITRUE FOR\n*     EQUALITY.\n*     C. L. LAWSON, JPL, 1974 DEC 10\n*\n*     .. Parameters ..\n      INTEGER           NOUT\n      PARAMETER         (NOUT=6)\n*     .. Scalar Arguments ..\n      INTEGER           ICOMP, ITRUE\n*     .. Scalars in Common ..\n      INTEGER           ICASE, INCX, INCY, MODE, N\n      LOGICAL           PASS\n*     .. Local Scalars ..\n      INTEGER           ID\n*     .. Common blocks ..\n      COMMON            /COMBLA/ICASE, N, INCX, INCY, MODE, PASS\n*     .. Executable Statements ..\n      IF (ICOMP.EQ.ITRUE) GO TO 40\n*\n*                            HERE ICOMP IS NOT EQUAL TO ITRUE.\n*\n      IF ( .NOT. PASS) GO TO 20\n*                             PRINT FAIL MESSAGE AND HEADER.\n      PASS = .FALSE.\n      WRITE (NOUT,99999)\n      WRITE (NOUT,99998)\n   20 ID = ICOMP - ITRUE\n      WRITE (NOUT,99997) ICASE, N, INCX, INCY, MODE, ICOMP, ITRUE, ID\n   40 CONTINUE\n      RETURN\n*\n99999 FORMAT ('                                       FAIL')\n99998 FORMAT (/' CASE  N INCX INCY MODE                               ',\n     +       ' COMP                                TRUE     DIFFERENCE',\n     +       /1X)\n99997 FORMAT (1X,I4,I3,3I5,2I36,I12)\n      END\n"
  },
  {
    "path": "libs/eigen/blas/testing/cblat2.f",
    "content": "      PROGRAM CBLAT2\n*\n*  Test program for the COMPLEX          Level 2 Blas.\n*\n*  The program must be driven by a short data file. The first 18 records\n*  of the file are read using list-directed input, the last 17 records\n*  are read using the format ( A6, L2 ). An annotated example of a data\n*  file can be obtained by deleting the first 3 characters from the\n*  following 35 lines:\n*  'CBLAT2.SUMM'     NAME OF SUMMARY OUTPUT FILE\n*  6                 UNIT NUMBER OF SUMMARY FILE\n*  'CBLA2T.SNAP'     NAME OF SNAPSHOT OUTPUT FILE\n*  -1                UNIT NUMBER OF SNAPSHOT FILE (NOT USED IF .LT. 0)\n*  F        LOGICAL FLAG, T TO REWIND SNAPSHOT FILE AFTER EACH RECORD.\n*  F        LOGICAL FLAG, T TO STOP ON FAILURES.\n*  T        LOGICAL FLAG, T TO TEST ERROR EXITS.\n*  16.0     THRESHOLD VALUE OF TEST RATIO\n*  6                 NUMBER OF VALUES OF N\n*  0 1 2 3 5 9       VALUES OF N\n*  4                 NUMBER OF VALUES OF K\n*  0 1 2 4           VALUES OF K\n*  4                 NUMBER OF VALUES OF INCX AND INCY\n*  1 2 -1 -2         VALUES OF INCX AND INCY\n*  3                 NUMBER OF VALUES OF ALPHA\n*  (0.0,0.0) (1.0,0.0) (0.7,-0.9)       VALUES OF ALPHA\n*  3                 NUMBER OF VALUES OF BETA\n*  (0.0,0.0) (1.0,0.0) (1.3,-1.1)       VALUES OF BETA\n*  CGEMV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  CGBMV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  CHEMV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  CHBMV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  CHPMV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  CTRMV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  CTBMV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  CTPMV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  CTRSV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  CTBSV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  CTPSV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  CGERC  T PUT F FOR NO TEST. SAME COLUMNS.\n*  CGERU  T PUT F FOR NO TEST. SAME COLUMNS.\n*  CHER   T PUT F FOR NO TEST. SAME COLUMNS.\n*  CHPR   T PUT F FOR NO TEST. SAME COLUMNS.\n*  CHER2  T PUT F FOR NO TEST. SAME COLUMNS.\n*  CHPR2  T PUT F FOR NO TEST. SAME COLUMNS.\n*\n*     See:\n*\n*        Dongarra J. J., Du Croz J. J., Hammarling S.  and Hanson R. J..\n*        An  extended  set of Fortran  Basic Linear Algebra Subprograms.\n*\n*        Technical  Memoranda  Nos. 41 (revision 3) and 81,  Mathematics\n*        and  Computer Science  Division,  Argonne  National Laboratory,\n*        9700 South Cass Avenue, Argonne, Illinois 60439, US.\n*\n*        Or\n*\n*        NAG  Technical Reports TR3/87 and TR4/87,  Numerical Algorithms\n*        Group  Ltd.,  NAG  Central  Office,  256  Banbury  Road, Oxford\n*        OX2 7DE, UK,  and  Numerical Algorithms Group Inc.,  1101  31st\n*        Street,  Suite 100,  Downers Grove,  Illinois 60515-1263,  USA.\n*\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Parameters ..\n      INTEGER            NIN\n      PARAMETER          ( NIN = 5 )\n      INTEGER            NSUBS\n      PARAMETER          ( NSUBS = 17 )\n      COMPLEX            ZERO, ONE\n      PARAMETER          ( ZERO = ( 0.0, 0.0 ), ONE = ( 1.0, 0.0 ) )\n      REAL               RZERO, RHALF, RONE\n      PARAMETER          ( RZERO = 0.0, RHALF = 0.5, RONE = 1.0 )\n      INTEGER            NMAX, INCMAX\n      PARAMETER          ( NMAX = 65, INCMAX = 2 )\n      INTEGER            NINMAX, NIDMAX, NKBMAX, NALMAX, NBEMAX\n      PARAMETER          ( NINMAX = 7, NIDMAX = 9, NKBMAX = 7,\n     $                   NALMAX = 7, NBEMAX = 7 )\n*     .. Local Scalars ..\n      REAL               EPS, ERR, THRESH\n      INTEGER            I, ISNUM, J, N, NALF, NBET, NIDIM, NINC, NKB,\n     $                   NOUT, NTRA\n      LOGICAL            FATAL, LTESTT, REWI, SAME, SFATAL, TRACE,\n     $                   TSTERR\n      CHARACTER*1        TRANS\n      CHARACTER*6        SNAMET\n      CHARACTER*32       SNAPS, SUMMRY\n*     .. Local Arrays ..\n      COMPLEX            A( NMAX, NMAX ), AA( NMAX*NMAX ),\n     $                   ALF( NALMAX ), AS( NMAX*NMAX ), BET( NBEMAX ),\n     $                   X( NMAX ), XS( NMAX*INCMAX ),\n     $                   XX( NMAX*INCMAX ), Y( NMAX ),\n     $                   YS( NMAX*INCMAX ), YT( NMAX ),\n     $                   YY( NMAX*INCMAX ), Z( 2*NMAX )\n      REAL               G( NMAX )\n      INTEGER            IDIM( NIDMAX ), INC( NINMAX ), KB( NKBMAX )\n      LOGICAL            LTEST( NSUBS )\n      CHARACTER*6        SNAMES( NSUBS )\n*     .. External Functions ..\n      REAL               SDIFF\n      LOGICAL            LCE\n      EXTERNAL           SDIFF, LCE\n*     .. External Subroutines ..\n      EXTERNAL           CCHK1, CCHK2, CCHK3, CCHK4, CCHK5, CCHK6,\n     $                   CCHKE, CMVCH\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, MAX, MIN\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n      CHARACTER*6        SRNAMT\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n      COMMON             /SRNAMC/SRNAMT\n*     .. Data statements ..\n      DATA               SNAMES/'CGEMV ', 'CGBMV ', 'CHEMV ', 'CHBMV ',\n     $                   'CHPMV ', 'CTRMV ', 'CTBMV ', 'CTPMV ',\n     $                   'CTRSV ', 'CTBSV ', 'CTPSV ', 'CGERC ',\n     $                   'CGERU ', 'CHER  ', 'CHPR  ', 'CHER2 ',\n     $                   'CHPR2 '/\n*     .. Executable Statements ..\n*\n*     Read name and unit number for summary output file and open file.\n*\n      READ( NIN, FMT = * )SUMMRY\n      READ( NIN, FMT = * )NOUT\n      OPEN( NOUT, FILE = SUMMRY, STATUS = 'NEW' )\n      NOUTC = NOUT\n*\n*     Read name and unit number for snapshot output file and open file.\n*\n      READ( NIN, FMT = * )SNAPS\n      READ( NIN, FMT = * )NTRA\n      TRACE = NTRA.GE.0\n      IF( TRACE )THEN\n         OPEN( NTRA, FILE = SNAPS, STATUS = 'NEW' )\n      END IF\n*     Read the flag that directs rewinding of the snapshot file.\n      READ( NIN, FMT = * )REWI\n      REWI = REWI.AND.TRACE\n*     Read the flag that directs stopping on any failure.\n      READ( NIN, FMT = * )SFATAL\n*     Read the flag that indicates whether error exits are to be tested.\n      READ( NIN, FMT = * )TSTERR\n*     Read the threshold value of the test ratio\n      READ( NIN, FMT = * )THRESH\n*\n*     Read and check the parameter values for the tests.\n*\n*     Values of N\n      READ( NIN, FMT = * )NIDIM\n      IF( NIDIM.LT.1.OR.NIDIM.GT.NIDMAX )THEN\n         WRITE( NOUT, FMT = 9997 )'N', NIDMAX\n         GO TO 230\n      END IF\n      READ( NIN, FMT = * )( IDIM( I ), I = 1, NIDIM )\n      DO 10 I = 1, NIDIM\n         IF( IDIM( I ).LT.0.OR.IDIM( I ).GT.NMAX )THEN\n            WRITE( NOUT, FMT = 9996 )NMAX\n            GO TO 230\n         END IF\n   10 CONTINUE\n*     Values of K\n      READ( NIN, FMT = * )NKB\n      IF( NKB.LT.1.OR.NKB.GT.NKBMAX )THEN\n         WRITE( NOUT, FMT = 9997 )'K', NKBMAX\n         GO TO 230\n      END IF\n      READ( NIN, FMT = * )( KB( I ), I = 1, NKB )\n      DO 20 I = 1, NKB\n         IF( KB( I ).LT.0 )THEN\n            WRITE( NOUT, FMT = 9995 )\n            GO TO 230\n         END IF\n   20 CONTINUE\n*     Values of INCX and INCY\n      READ( NIN, FMT = * )NINC\n      IF( NINC.LT.1.OR.NINC.GT.NINMAX )THEN\n         WRITE( NOUT, FMT = 9997 )'INCX AND INCY', NINMAX\n         GO TO 230\n      END IF\n      READ( NIN, FMT = * )( INC( I ), I = 1, NINC )\n      DO 30 I = 1, NINC\n         IF( INC( I ).EQ.0.OR.ABS( INC( I ) ).GT.INCMAX )THEN\n            WRITE( NOUT, FMT = 9994 )INCMAX\n            GO TO 230\n         END IF\n   30 CONTINUE\n*     Values of ALPHA\n      READ( NIN, FMT = * )NALF\n      IF( NALF.LT.1.OR.NALF.GT.NALMAX )THEN\n         WRITE( NOUT, FMT = 9997 )'ALPHA', NALMAX\n         GO TO 230\n      END IF\n      READ( NIN, FMT = * )( ALF( I ), I = 1, NALF )\n*     Values of BETA\n      READ( NIN, FMT = * )NBET\n      IF( NBET.LT.1.OR.NBET.GT.NBEMAX )THEN\n         WRITE( NOUT, FMT = 9997 )'BETA', NBEMAX\n         GO TO 230\n      END IF\n      READ( NIN, FMT = * )( BET( I ), I = 1, NBET )\n*\n*     Report values of parameters.\n*\n      WRITE( NOUT, FMT = 9993 )\n      WRITE( NOUT, FMT = 9992 )( IDIM( I ), I = 1, NIDIM )\n      WRITE( NOUT, FMT = 9991 )( KB( I ), I = 1, NKB )\n      WRITE( NOUT, FMT = 9990 )( INC( I ), I = 1, NINC )\n      WRITE( NOUT, FMT = 9989 )( ALF( I ), I = 1, NALF )\n      WRITE( NOUT, FMT = 9988 )( BET( I ), I = 1, NBET )\n      IF( .NOT.TSTERR )THEN\n         WRITE( NOUT, FMT = * )\n         WRITE( NOUT, FMT = 9980 )\n      END IF\n      WRITE( NOUT, FMT = * )\n      WRITE( NOUT, FMT = 9999 )THRESH\n      WRITE( NOUT, FMT = * )\n*\n*     Read names of subroutines and flags which indicate\n*     whether they are to be tested.\n*\n      DO 40 I = 1, NSUBS\n         LTEST( I ) = .FALSE.\n   40 CONTINUE\n   50 READ( NIN, FMT = 9984, END = 80 )SNAMET, LTESTT\n      DO 60 I = 1, NSUBS\n         IF( SNAMET.EQ.SNAMES( I ) )\n     $      GO TO 70\n   60 CONTINUE\n      WRITE( NOUT, FMT = 9986 )SNAMET\n      STOP\n   70 LTEST( I ) = LTESTT\n      GO TO 50\n*\n   80 CONTINUE\n      CLOSE ( NIN )\n*\n*     Compute EPS (the machine precision).\n*\n      EPS = RONE\n   90 CONTINUE\n      IF( SDIFF( RONE + EPS, RONE ).EQ.RZERO )\n     $   GO TO 100\n      EPS = RHALF*EPS\n      GO TO 90\n  100 CONTINUE\n      EPS = EPS + EPS\n      WRITE( NOUT, FMT = 9998 )EPS\n*\n*     Check the reliability of CMVCH using exact data.\n*\n      N = MIN( 32, NMAX )\n      DO 120 J = 1, N\n         DO 110 I = 1, N\n            A( I, J ) = MAX( I - J + 1, 0 )\n  110    CONTINUE\n         X( J ) = J\n         Y( J ) = ZERO\n  120 CONTINUE\n      DO 130 J = 1, N\n         YY( J ) = J*( ( J + 1 )*J )/2 - ( ( J + 1 )*J*( J - 1 ) )/3\n  130 CONTINUE\n*     YY holds the exact result. On exit from CMVCH YT holds\n*     the result computed by CMVCH.\n      TRANS = 'N'\n      CALL CMVCH( TRANS, N, N, ONE, A, NMAX, X, 1, ZERO, Y, 1, YT, G,\n     $            YY, EPS, ERR, FATAL, NOUT, .TRUE. )\n      SAME = LCE( YY, YT, N )\n      IF( .NOT.SAME.OR.ERR.NE.RZERO )THEN\n         WRITE( NOUT, FMT = 9985 )TRANS, SAME, ERR\n         STOP\n      END IF\n      TRANS = 'T'\n      CALL CMVCH( TRANS, N, N, ONE, A, NMAX, X, -1, ZERO, Y, -1, YT, G,\n     $            YY, EPS, ERR, FATAL, NOUT, .TRUE. )\n      SAME = LCE( YY, YT, N )\n      IF( .NOT.SAME.OR.ERR.NE.RZERO )THEN\n         WRITE( NOUT, FMT = 9985 )TRANS, SAME, ERR\n         STOP\n      END IF\n*\n*     Test each subroutine in turn.\n*\n      DO 210 ISNUM = 1, NSUBS\n         WRITE( NOUT, FMT = * )\n         IF( .NOT.LTEST( ISNUM ) )THEN\n*           Subprogram is not to be tested.\n            WRITE( NOUT, FMT = 9983 )SNAMES( ISNUM )\n         ELSE\n            SRNAMT = SNAMES( ISNUM )\n*           Test error exits.\n            IF( TSTERR )THEN\n               CALL CCHKE( ISNUM, SNAMES( ISNUM ), NOUT )\n               WRITE( NOUT, FMT = * )\n            END IF\n*           Test computations.\n            INFOT = 0\n            OK = .TRUE.\n            FATAL = .FALSE.\n            GO TO ( 140, 140, 150, 150, 150, 160, 160,\n     $              160, 160, 160, 160, 170, 170, 180,\n     $              180, 190, 190 )ISNUM\n*           Test CGEMV, 01, and CGBMV, 02.\n  140       CALL CCHK1( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF,\n     $                  NBET, BET, NINC, INC, NMAX, INCMAX, A, AA, AS,\n     $                  X, XX, XS, Y, YY, YS, YT, G )\n            GO TO 200\n*           Test CHEMV, 03, CHBMV, 04, and CHPMV, 05.\n  150       CALL CCHK2( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF,\n     $                  NBET, BET, NINC, INC, NMAX, INCMAX, A, AA, AS,\n     $                  X, XX, XS, Y, YY, YS, YT, G )\n            GO TO 200\n*           Test CTRMV, 06, CTBMV, 07, CTPMV, 08,\n*           CTRSV, 09, CTBSV, 10, and CTPSV, 11.\n  160       CALL CCHK3( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NKB, KB, NINC, INC,\n     $                  NMAX, INCMAX, A, AA, AS, Y, YY, YS, YT, G, Z )\n            GO TO 200\n*           Test CGERC, 12, CGERU, 13.\n  170       CALL CCHK4( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC,\n     $                  NMAX, INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS,\n     $                  YT, G, Z )\n            GO TO 200\n*           Test CHER, 14, and CHPR, 15.\n  180       CALL CCHK5( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC,\n     $                  NMAX, INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS,\n     $                  YT, G, Z )\n            GO TO 200\n*           Test CHER2, 16, and CHPR2, 17.\n  190       CALL CCHK6( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC,\n     $                  NMAX, INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS,\n     $                  YT, G, Z )\n*\n  200       IF( FATAL.AND.SFATAL )\n     $         GO TO 220\n         END IF\n  210 CONTINUE\n      WRITE( NOUT, FMT = 9982 )\n      GO TO 240\n*\n  220 CONTINUE\n      WRITE( NOUT, FMT = 9981 )\n      GO TO 240\n*\n  230 CONTINUE\n      WRITE( NOUT, FMT = 9987 )\n*\n  240 CONTINUE\n      IF( TRACE )\n     $   CLOSE ( NTRA )\n      CLOSE ( NOUT )\n      STOP\n*\n 9999 FORMAT( ' ROUTINES PASS COMPUTATIONAL TESTS IF TEST RATIO IS LES',\n     $      'S THAN', F8.2 )\n 9998 FORMAT( ' RELATIVE MACHINE PRECISION IS TAKEN TO BE', 1P, E9.1 )\n 9997 FORMAT( ' NUMBER OF VALUES OF ', A, ' IS LESS THAN 1 OR GREATER ',\n     $      'THAN ', I2 )\n 9996 FORMAT( ' VALUE OF N IS LESS THAN 0 OR GREATER THAN ', I2 )\n 9995 FORMAT( ' VALUE OF K IS LESS THAN 0' )\n 9994 FORMAT( ' ABSOLUTE VALUE OF INCX OR INCY IS 0 OR GREATER THAN ',\n     $      I2 )\n 9993 FORMAT( ' TESTS OF THE COMPLEX          LEVEL 2 BLAS', //' THE F',\n     $      'OLLOWING PARAMETER VALUES WILL BE USED:' )\n 9992 FORMAT( '   FOR N              ', 9I6 )\n 9991 FORMAT( '   FOR K              ', 7I6 )\n 9990 FORMAT( '   FOR INCX AND INCY  ', 7I6 )\n 9989 FORMAT( '   FOR ALPHA          ',\n     $      7( '(', F4.1, ',', F4.1, ')  ', : ) )\n 9988 FORMAT( '   FOR BETA           ',\n     $      7( '(', F4.1, ',', F4.1, ')  ', : ) )\n 9987 FORMAT( ' AMEND DATA FILE OR INCREASE ARRAY SIZES IN PROGRAM',\n     $      /' ******* TESTS ABANDONED *******' )\n 9986 FORMAT( ' SUBPROGRAM NAME ', A6, ' NOT RECOGNIZED', /' ******* T',\n     $      'ESTS ABANDONED *******' )\n 9985 FORMAT( ' ERROR IN CMVCH -  IN-LINE DOT PRODUCTS ARE BEING EVALU',\n     $      'ATED WRONGLY.', /' CMVCH WAS CALLED WITH TRANS = ', A1,\n     $      ' AND RETURNED SAME = ', L1, ' AND ERR = ', F12.3, '.', /\n     $   ' THIS MAY BE DUE TO FAULTS IN THE ARITHMETIC OR THE COMPILER.'\n     $      , /' ******* TESTS ABANDONED *******' )\n 9984 FORMAT( A6, L2 )\n 9983 FORMAT( 1X, A6, ' WAS NOT TESTED' )\n 9982 FORMAT( /' END OF TESTS' )\n 9981 FORMAT( /' ******* FATAL ERROR - TESTS ABANDONED *******' )\n 9980 FORMAT( ' ERROR-EXITS WILL NOT BE TESTED' )\n*\n*     End of CBLAT2.\n*\n      END\n      SUBROUTINE CCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF, NBET,\n     $                  BET, NINC, INC, NMAX, INCMAX, A, AA, AS, X, XX,\n     $                  XS, Y, YY, YS, YT, G )\n*\n*  Tests CGEMV and CGBMV.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Parameters ..\n      COMPLEX            ZERO, HALF\n      PARAMETER          ( ZERO = ( 0.0, 0.0 ), HALF = ( 0.5, 0.0 ) )\n      REAL               RZERO\n      PARAMETER          ( RZERO = 0.0 )\n*     .. Scalar Arguments ..\n      REAL               EPS, THRESH\n      INTEGER            INCMAX, NALF, NBET, NIDIM, NINC, NKB, NMAX,\n     $                   NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      COMPLEX            A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),\n     $                   AS( NMAX*NMAX ), BET( NBET ), X( NMAX ),\n     $                   XS( NMAX*INCMAX ), XX( NMAX*INCMAX ),\n     $                   Y( NMAX ), YS( NMAX*INCMAX ), YT( NMAX ),\n     $                   YY( NMAX*INCMAX )\n      REAL               G( NMAX )\n      INTEGER            IDIM( NIDIM ), INC( NINC ), KB( NKB )\n*     .. Local Scalars ..\n      COMPLEX            ALPHA, ALS, BETA, BLS, TRANSL\n      REAL               ERR, ERRMAX\n      INTEGER            I, IA, IB, IC, IKU, IM, IN, INCX, INCXS, INCY,\n     $                   INCYS, IX, IY, KL, KLS, KU, KUS, LAA, LDA,\n     $                   LDAS, LX, LY, M, ML, MS, N, NARGS, NC, ND, NK,\n     $                   NL, NS\n      LOGICAL            BANDED, FULL, NULL, RESET, SAME, TRAN\n      CHARACTER*1        TRANS, TRANSS\n      CHARACTER*3        ICH\n*     .. Local Arrays ..\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LCE, LCERES\n      EXTERNAL           LCE, LCERES\n*     .. External Subroutines ..\n      EXTERNAL           CGBMV, CGEMV, CMAKE, CMVCH\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, MAX, MIN\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Data statements ..\n      DATA               ICH/'NTC'/\n*     .. Executable Statements ..\n      FULL = SNAME( 3: 3 ).EQ.'E'\n      BANDED = SNAME( 3: 3 ).EQ.'B'\n*     Define the number of arguments.\n      IF( FULL )THEN\n         NARGS = 11\n      ELSE IF( BANDED )THEN\n         NARGS = 13\n      END IF\n*\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = RZERO\n*\n      DO 120 IN = 1, NIDIM\n         N = IDIM( IN )\n         ND = N/2 + 1\n*\n         DO 110 IM = 1, 2\n            IF( IM.EQ.1 )\n     $         M = MAX( N - ND, 0 )\n            IF( IM.EQ.2 )\n     $         M = MIN( N + ND, NMAX )\n*\n            IF( BANDED )THEN\n               NK = NKB\n            ELSE\n               NK = 1\n            END IF\n            DO 100 IKU = 1, NK\n               IF( BANDED )THEN\n                  KU = KB( IKU )\n                  KL = MAX( KU - 1, 0 )\n               ELSE\n                  KU = N - 1\n                  KL = M - 1\n               END IF\n*              Set LDA to 1 more than minimum value if room.\n               IF( BANDED )THEN\n                  LDA = KL + KU + 1\n               ELSE\n                  LDA = M\n               END IF\n               IF( LDA.LT.NMAX )\n     $            LDA = LDA + 1\n*              Skip tests if not enough room.\n               IF( LDA.GT.NMAX )\n     $            GO TO 100\n               LAA = LDA*N\n               NULL = N.LE.0.OR.M.LE.0\n*\n*              Generate the matrix A.\n*\n               TRANSL = ZERO\n               CALL CMAKE( SNAME( 2: 3 ), ' ', ' ', M, N, A, NMAX, AA,\n     $                     LDA, KL, KU, RESET, TRANSL )\n*\n               DO 90 IC = 1, 3\n                  TRANS = ICH( IC: IC )\n                  TRAN = TRANS.EQ.'T'.OR.TRANS.EQ.'C'\n*\n                  IF( TRAN )THEN\n                     ML = N\n                     NL = M\n                  ELSE\n                     ML = M\n                     NL = N\n                  END IF\n*\n                  DO 80 IX = 1, NINC\n                     INCX = INC( IX )\n                     LX = ABS( INCX )*NL\n*\n*                    Generate the vector X.\n*\n                     TRANSL = HALF\n                     CALL CMAKE( 'GE', ' ', ' ', 1, NL, X, 1, XX,\n     $                           ABS( INCX ), 0, NL - 1, RESET, TRANSL )\n                     IF( NL.GT.1 )THEN\n                        X( NL/2 ) = ZERO\n                        XX( 1 + ABS( INCX )*( NL/2 - 1 ) ) = ZERO\n                     END IF\n*\n                     DO 70 IY = 1, NINC\n                        INCY = INC( IY )\n                        LY = ABS( INCY )*ML\n*\n                        DO 60 IA = 1, NALF\n                           ALPHA = ALF( IA )\n*\n                           DO 50 IB = 1, NBET\n                              BETA = BET( IB )\n*\n*                             Generate the vector Y.\n*\n                              TRANSL = ZERO\n                              CALL CMAKE( 'GE', ' ', ' ', 1, ML, Y, 1,\n     $                                    YY, ABS( INCY ), 0, ML - 1,\n     $                                    RESET, TRANSL )\n*\n                              NC = NC + 1\n*\n*                             Save every datum before calling the\n*                             subroutine.\n*\n                              TRANSS = TRANS\n                              MS = M\n                              NS = N\n                              KLS = KL\n                              KUS = KU\n                              ALS = ALPHA\n                              DO 10 I = 1, LAA\n                                 AS( I ) = AA( I )\n   10                         CONTINUE\n                              LDAS = LDA\n                              DO 20 I = 1, LX\n                                 XS( I ) = XX( I )\n   20                         CONTINUE\n                              INCXS = INCX\n                              BLS = BETA\n                              DO 30 I = 1, LY\n                                 YS( I ) = YY( I )\n   30                         CONTINUE\n                              INCYS = INCY\n*\n*                             Call the subroutine.\n*\n                              IF( FULL )THEN\n                                 IF( TRACE )\n     $                              WRITE( NTRA, FMT = 9994 )NC, SNAME,\n     $                              TRANS, M, N, ALPHA, LDA, INCX, BETA,\n     $                              INCY\n                                 IF( REWI )\n     $                              REWIND NTRA\n                                 CALL CGEMV( TRANS, M, N, ALPHA, AA,\n     $                                       LDA, XX, INCX, BETA, YY,\n     $                                       INCY )\n                              ELSE IF( BANDED )THEN\n                                 IF( TRACE )\n     $                              WRITE( NTRA, FMT = 9995 )NC, SNAME,\n     $                              TRANS, M, N, KL, KU, ALPHA, LDA,\n     $                              INCX, BETA, INCY\n                                 IF( REWI )\n     $                              REWIND NTRA\n                                 CALL CGBMV( TRANS, M, N, KL, KU, ALPHA,\n     $                                       AA, LDA, XX, INCX, BETA,\n     $                                       YY, INCY )\n                              END IF\n*\n*                             Check if error-exit was taken incorrectly.\n*\n                              IF( .NOT.OK )THEN\n                                 WRITE( NOUT, FMT = 9993 )\n                                 FATAL = .TRUE.\n                                 GO TO 130\n                              END IF\n*\n*                             See what data changed inside subroutines.\n*\n                              ISAME( 1 ) = TRANS.EQ.TRANSS\n                              ISAME( 2 ) = MS.EQ.M\n                              ISAME( 3 ) = NS.EQ.N\n                              IF( FULL )THEN\n                                 ISAME( 4 ) = ALS.EQ.ALPHA\n                                 ISAME( 5 ) = LCE( AS, AA, LAA )\n                                 ISAME( 6 ) = LDAS.EQ.LDA\n                                 ISAME( 7 ) = LCE( XS, XX, LX )\n                                 ISAME( 8 ) = INCXS.EQ.INCX\n                                 ISAME( 9 ) = BLS.EQ.BETA\n                                 IF( NULL )THEN\n                                    ISAME( 10 ) = LCE( YS, YY, LY )\n                                 ELSE\n                                    ISAME( 10 ) = LCERES( 'GE', ' ', 1,\n     $                                            ML, YS, YY,\n     $                                            ABS( INCY ) )\n                                 END IF\n                                 ISAME( 11 ) = INCYS.EQ.INCY\n                              ELSE IF( BANDED )THEN\n                                 ISAME( 4 ) = KLS.EQ.KL\n                                 ISAME( 5 ) = KUS.EQ.KU\n                                 ISAME( 6 ) = ALS.EQ.ALPHA\n                                 ISAME( 7 ) = LCE( AS, AA, LAA )\n                                 ISAME( 8 ) = LDAS.EQ.LDA\n                                 ISAME( 9 ) = LCE( XS, XX, LX )\n                                 ISAME( 10 ) = INCXS.EQ.INCX\n                                 ISAME( 11 ) = BLS.EQ.BETA\n                                 IF( NULL )THEN\n                                    ISAME( 12 ) = LCE( YS, YY, LY )\n                                 ELSE\n                                    ISAME( 12 ) = LCERES( 'GE', ' ', 1,\n     $                                            ML, YS, YY,\n     $                                            ABS( INCY ) )\n                                 END IF\n                                 ISAME( 13 ) = INCYS.EQ.INCY\n                              END IF\n*\n*                             If data was incorrectly changed, report\n*                             and return.\n*\n                              SAME = .TRUE.\n                              DO 40 I = 1, NARGS\n                                 SAME = SAME.AND.ISAME( I )\n                                 IF( .NOT.ISAME( I ) )\n     $                              WRITE( NOUT, FMT = 9998 )I\n   40                         CONTINUE\n                              IF( .NOT.SAME )THEN\n                                 FATAL = .TRUE.\n                                 GO TO 130\n                              END IF\n*\n                              IF( .NOT.NULL )THEN\n*\n*                                Check the result.\n*\n                                 CALL CMVCH( TRANS, M, N, ALPHA, A,\n     $                                       NMAX, X, INCX, BETA, Y,\n     $                                       INCY, YT, G, YY, EPS, ERR,\n     $                                       FATAL, NOUT, .TRUE. )\n                                 ERRMAX = MAX( ERRMAX, ERR )\n*                                If got really bad answer, report and\n*                                return.\n                                 IF( FATAL )\n     $                              GO TO 130\n                              ELSE\n*                                Avoid repeating tests with M.le.0 or\n*                                N.le.0.\n                                 GO TO 110\n                              END IF\n*\n   50                      CONTINUE\n*\n   60                   CONTINUE\n*\n   70                CONTINUE\n*\n   80             CONTINUE\n*\n   90          CONTINUE\n*\n  100       CONTINUE\n*\n  110    CONTINUE\n*\n  120 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 140\n*\n  130 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      IF( FULL )THEN\n         WRITE( NOUT, FMT = 9994 )NC, SNAME, TRANS, M, N, ALPHA, LDA,\n     $      INCX, BETA, INCY\n      ELSE IF( BANDED )THEN\n         WRITE( NOUT, FMT = 9995 )NC, SNAME, TRANS, M, N, KL, KU,\n     $      ALPHA, LDA, INCX, BETA, INCY\n      END IF\n*\n  140 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', 4( I3, ',' ), '(',\n     $      F4.1, ',', F4.1, '), A,', I3, ', X,', I2, ',(', F4.1, ',',\n     $      F4.1, '), Y,', I2, ') .' )\n 9994 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', 2( I3, ',' ), '(',\n     $      F4.1, ',', F4.1, '), A,', I3, ', X,', I2, ',(', F4.1, ',',\n     $      F4.1, '), Y,', I2, ')         .' )\n 9993 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of CCHK1.\n*\n      END\n      SUBROUTINE CCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF, NBET,\n     $                  BET, NINC, INC, NMAX, INCMAX, A, AA, AS, X, XX,\n     $                  XS, Y, YY, YS, YT, G )\n*\n*  Tests CHEMV, CHBMV and CHPMV.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Parameters ..\n      COMPLEX            ZERO, HALF\n      PARAMETER          ( ZERO = ( 0.0, 0.0 ), HALF = ( 0.5, 0.0 ) )\n      REAL               RZERO\n      PARAMETER          ( RZERO = 0.0 )\n*     .. Scalar Arguments ..\n      REAL               EPS, THRESH\n      INTEGER            INCMAX, NALF, NBET, NIDIM, NINC, NKB, NMAX,\n     $                   NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      COMPLEX            A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),\n     $                   AS( NMAX*NMAX ), BET( NBET ), X( NMAX ),\n     $                   XS( NMAX*INCMAX ), XX( NMAX*INCMAX ),\n     $                   Y( NMAX ), YS( NMAX*INCMAX ), YT( NMAX ),\n     $                   YY( NMAX*INCMAX )\n      REAL               G( NMAX )\n      INTEGER            IDIM( NIDIM ), INC( NINC ), KB( NKB )\n*     .. Local Scalars ..\n      COMPLEX            ALPHA, ALS, BETA, BLS, TRANSL\n      REAL               ERR, ERRMAX\n      INTEGER            I, IA, IB, IC, IK, IN, INCX, INCXS, INCY,\n     $                   INCYS, IX, IY, K, KS, LAA, LDA, LDAS, LX, LY,\n     $                   N, NARGS, NC, NK, NS\n      LOGICAL            BANDED, FULL, NULL, PACKED, RESET, SAME\n      CHARACTER*1        UPLO, UPLOS\n      CHARACTER*2        ICH\n*     .. Local Arrays ..\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LCE, LCERES\n      EXTERNAL           LCE, LCERES\n*     .. External Subroutines ..\n      EXTERNAL           CHBMV, CHEMV, CHPMV, CMAKE, CMVCH\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, MAX\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Data statements ..\n      DATA               ICH/'UL'/\n*     .. Executable Statements ..\n      FULL = SNAME( 3: 3 ).EQ.'E'\n      BANDED = SNAME( 3: 3 ).EQ.'B'\n      PACKED = SNAME( 3: 3 ).EQ.'P'\n*     Define the number of arguments.\n      IF( FULL )THEN\n         NARGS = 10\n      ELSE IF( BANDED )THEN\n         NARGS = 11\n      ELSE IF( PACKED )THEN\n         NARGS = 9\n      END IF\n*\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = RZERO\n*\n      DO 110 IN = 1, NIDIM\n         N = IDIM( IN )\n*\n         IF( BANDED )THEN\n            NK = NKB\n         ELSE\n            NK = 1\n         END IF\n         DO 100 IK = 1, NK\n            IF( BANDED )THEN\n               K = KB( IK )\n            ELSE\n               K = N - 1\n            END IF\n*           Set LDA to 1 more than minimum value if room.\n            IF( BANDED )THEN\n               LDA = K + 1\n            ELSE\n               LDA = N\n            END IF\n            IF( LDA.LT.NMAX )\n     $         LDA = LDA + 1\n*           Skip tests if not enough room.\n            IF( LDA.GT.NMAX )\n     $         GO TO 100\n            IF( PACKED )THEN\n               LAA = ( N*( N + 1 ) )/2\n            ELSE\n               LAA = LDA*N\n            END IF\n            NULL = N.LE.0\n*\n            DO 90 IC = 1, 2\n               UPLO = ICH( IC: IC )\n*\n*              Generate the matrix A.\n*\n               TRANSL = ZERO\n               CALL CMAKE( SNAME( 2: 3 ), UPLO, ' ', N, N, A, NMAX, AA,\n     $                     LDA, K, K, RESET, TRANSL )\n*\n               DO 80 IX = 1, NINC\n                  INCX = INC( IX )\n                  LX = ABS( INCX )*N\n*\n*                 Generate the vector X.\n*\n                  TRANSL = HALF\n                  CALL CMAKE( 'GE', ' ', ' ', 1, N, X, 1, XX,\n     $                        ABS( INCX ), 0, N - 1, RESET, TRANSL )\n                  IF( N.GT.1 )THEN\n                     X( N/2 ) = ZERO\n                     XX( 1 + ABS( INCX )*( N/2 - 1 ) ) = ZERO\n                  END IF\n*\n                  DO 70 IY = 1, NINC\n                     INCY = INC( IY )\n                     LY = ABS( INCY )*N\n*\n                     DO 60 IA = 1, NALF\n                        ALPHA = ALF( IA )\n*\n                        DO 50 IB = 1, NBET\n                           BETA = BET( IB )\n*\n*                          Generate the vector Y.\n*\n                           TRANSL = ZERO\n                           CALL CMAKE( 'GE', ' ', ' ', 1, N, Y, 1, YY,\n     $                                 ABS( INCY ), 0, N - 1, RESET,\n     $                                 TRANSL )\n*\n                           NC = NC + 1\n*\n*                          Save every datum before calling the\n*                          subroutine.\n*\n                           UPLOS = UPLO\n                           NS = N\n                           KS = K\n                           ALS = ALPHA\n                           DO 10 I = 1, LAA\n                              AS( I ) = AA( I )\n   10                      CONTINUE\n                           LDAS = LDA\n                           DO 20 I = 1, LX\n                              XS( I ) = XX( I )\n   20                      CONTINUE\n                           INCXS = INCX\n                           BLS = BETA\n                           DO 30 I = 1, LY\n                              YS( I ) = YY( I )\n   30                      CONTINUE\n                           INCYS = INCY\n*\n*                          Call the subroutine.\n*\n                           IF( FULL )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9993 )NC, SNAME,\n     $                           UPLO, N, ALPHA, LDA, INCX, BETA, INCY\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL CHEMV( UPLO, N, ALPHA, AA, LDA, XX,\n     $                                    INCX, BETA, YY, INCY )\n                           ELSE IF( BANDED )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9994 )NC, SNAME,\n     $                           UPLO, N, K, ALPHA, LDA, INCX, BETA,\n     $                           INCY\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL CHBMV( UPLO, N, K, ALPHA, AA, LDA,\n     $                                    XX, INCX, BETA, YY, INCY )\n                           ELSE IF( PACKED )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9995 )NC, SNAME,\n     $                           UPLO, N, ALPHA, INCX, BETA, INCY\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL CHPMV( UPLO, N, ALPHA, AA, XX, INCX,\n     $                                    BETA, YY, INCY )\n                           END IF\n*\n*                          Check if error-exit was taken incorrectly.\n*\n                           IF( .NOT.OK )THEN\n                              WRITE( NOUT, FMT = 9992 )\n                              FATAL = .TRUE.\n                              GO TO 120\n                           END IF\n*\n*                          See what data changed inside subroutines.\n*\n                           ISAME( 1 ) = UPLO.EQ.UPLOS\n                           ISAME( 2 ) = NS.EQ.N\n                           IF( FULL )THEN\n                              ISAME( 3 ) = ALS.EQ.ALPHA\n                              ISAME( 4 ) = LCE( AS, AA, LAA )\n                              ISAME( 5 ) = LDAS.EQ.LDA\n                              ISAME( 6 ) = LCE( XS, XX, LX )\n                              ISAME( 7 ) = INCXS.EQ.INCX\n                              ISAME( 8 ) = BLS.EQ.BETA\n                              IF( NULL )THEN\n                                 ISAME( 9 ) = LCE( YS, YY, LY )\n                              ELSE\n                                 ISAME( 9 ) = LCERES( 'GE', ' ', 1, N,\n     $                                        YS, YY, ABS( INCY ) )\n                              END IF\n                              ISAME( 10 ) = INCYS.EQ.INCY\n                           ELSE IF( BANDED )THEN\n                              ISAME( 3 ) = KS.EQ.K\n                              ISAME( 4 ) = ALS.EQ.ALPHA\n                              ISAME( 5 ) = LCE( AS, AA, LAA )\n                              ISAME( 6 ) = LDAS.EQ.LDA\n                              ISAME( 7 ) = LCE( XS, XX, LX )\n                              ISAME( 8 ) = INCXS.EQ.INCX\n                              ISAME( 9 ) = BLS.EQ.BETA\n                              IF( NULL )THEN\n                                 ISAME( 10 ) = LCE( YS, YY, LY )\n                              ELSE\n                                 ISAME( 10 ) = LCERES( 'GE', ' ', 1, N,\n     $                                         YS, YY, ABS( INCY ) )\n                              END IF\n                              ISAME( 11 ) = INCYS.EQ.INCY\n                           ELSE IF( PACKED )THEN\n                              ISAME( 3 ) = ALS.EQ.ALPHA\n                              ISAME( 4 ) = LCE( AS, AA, LAA )\n                              ISAME( 5 ) = LCE( XS, XX, LX )\n                              ISAME( 6 ) = INCXS.EQ.INCX\n                              ISAME( 7 ) = BLS.EQ.BETA\n                              IF( NULL )THEN\n                                 ISAME( 8 ) = LCE( YS, YY, LY )\n                              ELSE\n                                 ISAME( 8 ) = LCERES( 'GE', ' ', 1, N,\n     $                                        YS, YY, ABS( INCY ) )\n                              END IF\n                              ISAME( 9 ) = INCYS.EQ.INCY\n                           END IF\n*\n*                          If data was incorrectly changed, report and\n*                          return.\n*\n                           SAME = .TRUE.\n                           DO 40 I = 1, NARGS\n                              SAME = SAME.AND.ISAME( I )\n                              IF( .NOT.ISAME( I ) )\n     $                           WRITE( NOUT, FMT = 9998 )I\n   40                      CONTINUE\n                           IF( .NOT.SAME )THEN\n                              FATAL = .TRUE.\n                              GO TO 120\n                           END IF\n*\n                           IF( .NOT.NULL )THEN\n*\n*                             Check the result.\n*\n                              CALL CMVCH( 'N', N, N, ALPHA, A, NMAX, X,\n     $                                    INCX, BETA, Y, INCY, YT, G,\n     $                                    YY, EPS, ERR, FATAL, NOUT,\n     $                                    .TRUE. )\n                              ERRMAX = MAX( ERRMAX, ERR )\n*                             If got really bad answer, report and\n*                             return.\n                              IF( FATAL )\n     $                           GO TO 120\n                           ELSE\n*                             Avoid repeating tests with N.le.0\n                              GO TO 110\n                           END IF\n*\n   50                   CONTINUE\n*\n   60                CONTINUE\n*\n   70             CONTINUE\n*\n   80          CONTINUE\n*\n   90       CONTINUE\n*\n  100    CONTINUE\n*\n  110 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 130\n*\n  120 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      IF( FULL )THEN\n         WRITE( NOUT, FMT = 9993 )NC, SNAME, UPLO, N, ALPHA, LDA, INCX,\n     $      BETA, INCY\n      ELSE IF( BANDED )THEN\n         WRITE( NOUT, FMT = 9994 )NC, SNAME, UPLO, N, K, ALPHA, LDA,\n     $      INCX, BETA, INCY\n      ELSE IF( PACKED )THEN\n         WRITE( NOUT, FMT = 9995 )NC, SNAME, UPLO, N, ALPHA, INCX,\n     $      BETA, INCY\n      END IF\n*\n  130 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', I3, ',(', F4.1, ',',\n     $      F4.1, '), AP, X,', I2, ',(', F4.1, ',', F4.1, '), Y,', I2,\n     $      ')                .' )\n 9994 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', 2( I3, ',' ), '(',\n     $      F4.1, ',', F4.1, '), A,', I3, ', X,', I2, ',(', F4.1, ',',\n     $      F4.1, '), Y,', I2, ')         .' )\n 9993 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', I3, ',(', F4.1, ',',\n     $      F4.1, '), A,', I3, ', X,', I2, ',(', F4.1, ',', F4.1, '), ',\n     $      'Y,', I2, ')             .' )\n 9992 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of CCHK2.\n*\n      END\n      SUBROUTINE CCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NKB, KB, NINC, INC, NMAX,\n     $                  INCMAX, A, AA, AS, X, XX, XS, XT, G, Z )\n*\n*  Tests CTRMV, CTBMV, CTPMV, CTRSV, CTBSV and CTPSV.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Parameters ..\n      COMPLEX            ZERO, HALF, ONE\n      PARAMETER          ( ZERO = ( 0.0, 0.0 ), HALF = ( 0.5, 0.0 ),\n     $                   ONE = ( 1.0, 0.0 ) )\n      REAL               RZERO\n      PARAMETER          ( RZERO = 0.0 )\n*     .. Scalar Arguments ..\n      REAL               EPS, THRESH\n      INTEGER            INCMAX, NIDIM, NINC, NKB, NMAX, NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      COMPLEX            A( NMAX, NMAX ), AA( NMAX*NMAX ),\n     $                   AS( NMAX*NMAX ), X( NMAX ), XS( NMAX*INCMAX ),\n     $                   XT( NMAX ), XX( NMAX*INCMAX ), Z( NMAX )\n      REAL               G( NMAX )\n      INTEGER            IDIM( NIDIM ), INC( NINC ), KB( NKB )\n*     .. Local Scalars ..\n      COMPLEX            TRANSL\n      REAL               ERR, ERRMAX\n      INTEGER            I, ICD, ICT, ICU, IK, IN, INCX, INCXS, IX, K,\n     $                   KS, LAA, LDA, LDAS, LX, N, NARGS, NC, NK, NS\n      LOGICAL            BANDED, FULL, NULL, PACKED, RESET, SAME\n      CHARACTER*1        DIAG, DIAGS, TRANS, TRANSS, UPLO, UPLOS\n      CHARACTER*2        ICHD, ICHU\n      CHARACTER*3        ICHT\n*     .. Local Arrays ..\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LCE, LCERES\n      EXTERNAL           LCE, LCERES\n*     .. External Subroutines ..\n      EXTERNAL           CMAKE, CMVCH, CTBMV, CTBSV, CTPMV, CTPSV,\n     $                   CTRMV, CTRSV\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, MAX\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Data statements ..\n      DATA               ICHU/'UL'/, ICHT/'NTC'/, ICHD/'UN'/\n*     .. Executable Statements ..\n      FULL = SNAME( 3: 3 ).EQ.'R'\n      BANDED = SNAME( 3: 3 ).EQ.'B'\n      PACKED = SNAME( 3: 3 ).EQ.'P'\n*     Define the number of arguments.\n      IF( FULL )THEN\n         NARGS = 8\n      ELSE IF( BANDED )THEN\n         NARGS = 9\n      ELSE IF( PACKED )THEN\n         NARGS = 7\n      END IF\n*\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = RZERO\n*     Set up zero vector for CMVCH.\n      DO 10 I = 1, NMAX\n         Z( I ) = ZERO\n   10 CONTINUE\n*\n      DO 110 IN = 1, NIDIM\n         N = IDIM( IN )\n*\n         IF( BANDED )THEN\n            NK = NKB\n         ELSE\n            NK = 1\n         END IF\n         DO 100 IK = 1, NK\n            IF( BANDED )THEN\n               K = KB( IK )\n            ELSE\n               K = N - 1\n            END IF\n*           Set LDA to 1 more than minimum value if room.\n            IF( BANDED )THEN\n               LDA = K + 1\n            ELSE\n               LDA = N\n            END IF\n            IF( LDA.LT.NMAX )\n     $         LDA = LDA + 1\n*           Skip tests if not enough room.\n            IF( LDA.GT.NMAX )\n     $         GO TO 100\n            IF( PACKED )THEN\n               LAA = ( N*( N + 1 ) )/2\n            ELSE\n               LAA = LDA*N\n            END IF\n            NULL = N.LE.0\n*\n            DO 90 ICU = 1, 2\n               UPLO = ICHU( ICU: ICU )\n*\n               DO 80 ICT = 1, 3\n                  TRANS = ICHT( ICT: ICT )\n*\n                  DO 70 ICD = 1, 2\n                     DIAG = ICHD( ICD: ICD )\n*\n*                    Generate the matrix A.\n*\n                     TRANSL = ZERO\n                     CALL CMAKE( SNAME( 2: 3 ), UPLO, DIAG, N, N, A,\n     $                           NMAX, AA, LDA, K, K, RESET, TRANSL )\n*\n                     DO 60 IX = 1, NINC\n                        INCX = INC( IX )\n                        LX = ABS( INCX )*N\n*\n*                       Generate the vector X.\n*\n                        TRANSL = HALF\n                        CALL CMAKE( 'GE', ' ', ' ', 1, N, X, 1, XX,\n     $                              ABS( INCX ), 0, N - 1, RESET,\n     $                              TRANSL )\n                        IF( N.GT.1 )THEN\n                           X( N/2 ) = ZERO\n                           XX( 1 + ABS( INCX )*( N/2 - 1 ) ) = ZERO\n                        END IF\n*\n                        NC = NC + 1\n*\n*                       Save every datum before calling the subroutine.\n*\n                        UPLOS = UPLO\n                        TRANSS = TRANS\n                        DIAGS = DIAG\n                        NS = N\n                        KS = K\n                        DO 20 I = 1, LAA\n                           AS( I ) = AA( I )\n   20                   CONTINUE\n                        LDAS = LDA\n                        DO 30 I = 1, LX\n                           XS( I ) = XX( I )\n   30                   CONTINUE\n                        INCXS = INCX\n*\n*                       Call the subroutine.\n*\n                        IF( SNAME( 4: 5 ).EQ.'MV' )THEN\n                           IF( FULL )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9993 )NC, SNAME,\n     $                           UPLO, TRANS, DIAG, N, LDA, INCX\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL CTRMV( UPLO, TRANS, DIAG, N, AA, LDA,\n     $                                    XX, INCX )\n                           ELSE IF( BANDED )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9994 )NC, SNAME,\n     $                           UPLO, TRANS, DIAG, N, K, LDA, INCX\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL CTBMV( UPLO, TRANS, DIAG, N, K, AA,\n     $                                    LDA, XX, INCX )\n                           ELSE IF( PACKED )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9995 )NC, SNAME,\n     $                           UPLO, TRANS, DIAG, N, INCX\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL CTPMV( UPLO, TRANS, DIAG, N, AA, XX,\n     $                                    INCX )\n                           END IF\n                        ELSE IF( SNAME( 4: 5 ).EQ.'SV' )THEN\n                           IF( FULL )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9993 )NC, SNAME,\n     $                           UPLO, TRANS, DIAG, N, LDA, INCX\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL CTRSV( UPLO, TRANS, DIAG, N, AA, LDA,\n     $                                    XX, INCX )\n                           ELSE IF( BANDED )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9994 )NC, SNAME,\n     $                           UPLO, TRANS, DIAG, N, K, LDA, INCX\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL CTBSV( UPLO, TRANS, DIAG, N, K, AA,\n     $                                    LDA, XX, INCX )\n                           ELSE IF( PACKED )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9995 )NC, SNAME,\n     $                           UPLO, TRANS, DIAG, N, INCX\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL CTPSV( UPLO, TRANS, DIAG, N, AA, XX,\n     $                                    INCX )\n                           END IF\n                        END IF\n*\n*                       Check if error-exit was taken incorrectly.\n*\n                        IF( .NOT.OK )THEN\n                           WRITE( NOUT, FMT = 9992 )\n                           FATAL = .TRUE.\n                           GO TO 120\n                        END IF\n*\n*                       See what data changed inside subroutines.\n*\n                        ISAME( 1 ) = UPLO.EQ.UPLOS\n                        ISAME( 2 ) = TRANS.EQ.TRANSS\n                        ISAME( 3 ) = DIAG.EQ.DIAGS\n                        ISAME( 4 ) = NS.EQ.N\n                        IF( FULL )THEN\n                           ISAME( 5 ) = LCE( AS, AA, LAA )\n                           ISAME( 6 ) = LDAS.EQ.LDA\n                           IF( NULL )THEN\n                              ISAME( 7 ) = LCE( XS, XX, LX )\n                           ELSE\n                              ISAME( 7 ) = LCERES( 'GE', ' ', 1, N, XS,\n     $                                     XX, ABS( INCX ) )\n                           END IF\n                           ISAME( 8 ) = INCXS.EQ.INCX\n                        ELSE IF( BANDED )THEN\n                           ISAME( 5 ) = KS.EQ.K\n                           ISAME( 6 ) = LCE( AS, AA, LAA )\n                           ISAME( 7 ) = LDAS.EQ.LDA\n                           IF( NULL )THEN\n                              ISAME( 8 ) = LCE( XS, XX, LX )\n                           ELSE\n                              ISAME( 8 ) = LCERES( 'GE', ' ', 1, N, XS,\n     $                                     XX, ABS( INCX ) )\n                           END IF\n                           ISAME( 9 ) = INCXS.EQ.INCX\n                        ELSE IF( PACKED )THEN\n                           ISAME( 5 ) = LCE( AS, AA, LAA )\n                           IF( NULL )THEN\n                              ISAME( 6 ) = LCE( XS, XX, LX )\n                           ELSE\n                              ISAME( 6 ) = LCERES( 'GE', ' ', 1, N, XS,\n     $                                     XX, ABS( INCX ) )\n                           END IF\n                           ISAME( 7 ) = INCXS.EQ.INCX\n                        END IF\n*\n*                       If data was incorrectly changed, report and\n*                       return.\n*\n                        SAME = .TRUE.\n                        DO 40 I = 1, NARGS\n                           SAME = SAME.AND.ISAME( I )\n                           IF( .NOT.ISAME( I ) )\n     $                        WRITE( NOUT, FMT = 9998 )I\n   40                   CONTINUE\n                        IF( .NOT.SAME )THEN\n                           FATAL = .TRUE.\n                           GO TO 120\n                        END IF\n*\n                        IF( .NOT.NULL )THEN\n                           IF( SNAME( 4: 5 ).EQ.'MV' )THEN\n*\n*                             Check the result.\n*\n                              CALL CMVCH( TRANS, N, N, ONE, A, NMAX, X,\n     $                                    INCX, ZERO, Z, INCX, XT, G,\n     $                                    XX, EPS, ERR, FATAL, NOUT,\n     $                                    .TRUE. )\n                           ELSE IF( SNAME( 4: 5 ).EQ.'SV' )THEN\n*\n*                             Compute approximation to original vector.\n*\n                              DO 50 I = 1, N\n                                 Z( I ) = XX( 1 + ( I - 1 )*\n     $                                    ABS( INCX ) )\n                                 XX( 1 + ( I - 1 )*ABS( INCX ) )\n     $                              = X( I )\n   50                         CONTINUE\n                              CALL CMVCH( TRANS, N, N, ONE, A, NMAX, Z,\n     $                                    INCX, ZERO, X, INCX, XT, G,\n     $                                    XX, EPS, ERR, FATAL, NOUT,\n     $                                    .FALSE. )\n                           END IF\n                           ERRMAX = MAX( ERRMAX, ERR )\n*                          If got really bad answer, report and return.\n                           IF( FATAL )\n     $                        GO TO 120\n                        ELSE\n*                          Avoid repeating tests with N.le.0.\n                           GO TO 110\n                        END IF\n*\n   60                CONTINUE\n*\n   70             CONTINUE\n*\n   80          CONTINUE\n*\n   90       CONTINUE\n*\n  100    CONTINUE\n*\n  110 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 130\n*\n  120 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      IF( FULL )THEN\n         WRITE( NOUT, FMT = 9993 )NC, SNAME, UPLO, TRANS, DIAG, N, LDA,\n     $      INCX\n      ELSE IF( BANDED )THEN\n         WRITE( NOUT, FMT = 9994 )NC, SNAME, UPLO, TRANS, DIAG, N, K,\n     $      LDA, INCX\n      ELSE IF( PACKED )THEN\n         WRITE( NOUT, FMT = 9995 )NC, SNAME, UPLO, TRANS, DIAG, N, INCX\n      END IF\n*\n  130 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( 1X, I6, ': ', A6, '(', 3( '''', A1, ''',' ), I3, ', AP, ',\n     $      'X,', I2, ')                                      .' )\n 9994 FORMAT( 1X, I6, ': ', A6, '(', 3( '''', A1, ''',' ), 2( I3, ',' ),\n     $      ' A,', I3, ', X,', I2, ')                               .' )\n 9993 FORMAT( 1X, I6, ': ', A6, '(', 3( '''', A1, ''',' ), I3, ', A,',\n     $      I3, ', X,', I2, ')                                   .' )\n 9992 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of CCHK3.\n*\n      END\n      SUBROUTINE CCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX,\n     $                  INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G,\n     $                  Z )\n*\n*  Tests CGERC and CGERU.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Parameters ..\n      COMPLEX            ZERO, HALF, ONE\n      PARAMETER          ( ZERO = ( 0.0, 0.0 ), HALF = ( 0.5, 0.0 ),\n     $                   ONE = ( 1.0, 0.0 ) )\n      REAL               RZERO\n      PARAMETER          ( RZERO = 0.0 )\n*     .. Scalar Arguments ..\n      REAL               EPS, THRESH\n      INTEGER            INCMAX, NALF, NIDIM, NINC, NMAX, NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      COMPLEX            A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),\n     $                   AS( NMAX*NMAX ), X( NMAX ), XS( NMAX*INCMAX ),\n     $                   XX( NMAX*INCMAX ), Y( NMAX ),\n     $                   YS( NMAX*INCMAX ), YT( NMAX ),\n     $                   YY( NMAX*INCMAX ), Z( NMAX )\n      REAL               G( NMAX )\n      INTEGER            IDIM( NIDIM ), INC( NINC )\n*     .. Local Scalars ..\n      COMPLEX            ALPHA, ALS, TRANSL\n      REAL               ERR, ERRMAX\n      INTEGER            I, IA, IM, IN, INCX, INCXS, INCY, INCYS, IX,\n     $                   IY, J, LAA, LDA, LDAS, LX, LY, M, MS, N, NARGS,\n     $                   NC, ND, NS\n      LOGICAL            CONJ, NULL, RESET, SAME\n*     .. Local Arrays ..\n      COMPLEX            W( 1 )\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LCE, LCERES\n      EXTERNAL           LCE, LCERES\n*     .. External Subroutines ..\n      EXTERNAL           CGERC, CGERU, CMAKE, CMVCH\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, CONJG, MAX, MIN\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Executable Statements ..\n      CONJ = SNAME( 5: 5 ).EQ.'C'\n*     Define the number of arguments.\n      NARGS = 9\n*\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = RZERO\n*\n      DO 120 IN = 1, NIDIM\n         N = IDIM( IN )\n         ND = N/2 + 1\n*\n         DO 110 IM = 1, 2\n            IF( IM.EQ.1 )\n     $         M = MAX( N - ND, 0 )\n            IF( IM.EQ.2 )\n     $         M = MIN( N + ND, NMAX )\n*\n*           Set LDA to 1 more than minimum value if room.\n            LDA = M\n            IF( LDA.LT.NMAX )\n     $         LDA = LDA + 1\n*           Skip tests if not enough room.\n            IF( LDA.GT.NMAX )\n     $         GO TO 110\n            LAA = LDA*N\n            NULL = N.LE.0.OR.M.LE.0\n*\n            DO 100 IX = 1, NINC\n               INCX = INC( IX )\n               LX = ABS( INCX )*M\n*\n*              Generate the vector X.\n*\n               TRANSL = HALF\n               CALL CMAKE( 'GE', ' ', ' ', 1, M, X, 1, XX, ABS( INCX ),\n     $                     0, M - 1, RESET, TRANSL )\n               IF( M.GT.1 )THEN\n                  X( M/2 ) = ZERO\n                  XX( 1 + ABS( INCX )*( M/2 - 1 ) ) = ZERO\n               END IF\n*\n               DO 90 IY = 1, NINC\n                  INCY = INC( IY )\n                  LY = ABS( INCY )*N\n*\n*                 Generate the vector Y.\n*\n                  TRANSL = ZERO\n                  CALL CMAKE( 'GE', ' ', ' ', 1, N, Y, 1, YY,\n     $                        ABS( INCY ), 0, N - 1, RESET, TRANSL )\n                  IF( N.GT.1 )THEN\n                     Y( N/2 ) = ZERO\n                     YY( 1 + ABS( INCY )*( N/2 - 1 ) ) = ZERO\n                  END IF\n*\n                  DO 80 IA = 1, NALF\n                     ALPHA = ALF( IA )\n*\n*                    Generate the matrix A.\n*\n                     TRANSL = ZERO\n                     CALL CMAKE( SNAME( 2: 3 ), ' ', ' ', M, N, A, NMAX,\n     $                           AA, LDA, M - 1, N - 1, RESET, TRANSL )\n*\n                     NC = NC + 1\n*\n*                    Save every datum before calling the subroutine.\n*\n                     MS = M\n                     NS = N\n                     ALS = ALPHA\n                     DO 10 I = 1, LAA\n                        AS( I ) = AA( I )\n   10                CONTINUE\n                     LDAS = LDA\n                     DO 20 I = 1, LX\n                        XS( I ) = XX( I )\n   20                CONTINUE\n                     INCXS = INCX\n                     DO 30 I = 1, LY\n                        YS( I ) = YY( I )\n   30                CONTINUE\n                     INCYS = INCY\n*\n*                    Call the subroutine.\n*\n                     IF( TRACE )\n     $                  WRITE( NTRA, FMT = 9994 )NC, SNAME, M, N,\n     $                  ALPHA, INCX, INCY, LDA\n                     IF( CONJ )THEN\n                        IF( REWI )\n     $                     REWIND NTRA\n                        CALL CGERC( M, N, ALPHA, XX, INCX, YY, INCY, AA,\n     $                              LDA )\n                     ELSE\n                        IF( REWI )\n     $                     REWIND NTRA\n                        CALL CGERU( M, N, ALPHA, XX, INCX, YY, INCY, AA,\n     $                              LDA )\n                     END IF\n*\n*                    Check if error-exit was taken incorrectly.\n*\n                     IF( .NOT.OK )THEN\n                        WRITE( NOUT, FMT = 9993 )\n                        FATAL = .TRUE.\n                        GO TO 140\n                     END IF\n*\n*                    See what data changed inside subroutine.\n*\n                     ISAME( 1 ) = MS.EQ.M\n                     ISAME( 2 ) = NS.EQ.N\n                     ISAME( 3 ) = ALS.EQ.ALPHA\n                     ISAME( 4 ) = LCE( XS, XX, LX )\n                     ISAME( 5 ) = INCXS.EQ.INCX\n                     ISAME( 6 ) = LCE( YS, YY, LY )\n                     ISAME( 7 ) = INCYS.EQ.INCY\n                     IF( NULL )THEN\n                        ISAME( 8 ) = LCE( AS, AA, LAA )\n                     ELSE\n                        ISAME( 8 ) = LCERES( 'GE', ' ', M, N, AS, AA,\n     $                               LDA )\n                     END IF\n                     ISAME( 9 ) = LDAS.EQ.LDA\n*\n*                    If data was incorrectly changed, report and return.\n*\n                     SAME = .TRUE.\n                     DO 40 I = 1, NARGS\n                        SAME = SAME.AND.ISAME( I )\n                        IF( .NOT.ISAME( I ) )\n     $                     WRITE( NOUT, FMT = 9998 )I\n   40                CONTINUE\n                     IF( .NOT.SAME )THEN\n                        FATAL = .TRUE.\n                        GO TO 140\n                     END IF\n*\n                     IF( .NOT.NULL )THEN\n*\n*                       Check the result column by column.\n*\n                        IF( INCX.GT.0 )THEN\n                           DO 50 I = 1, M\n                              Z( I ) = X( I )\n   50                      CONTINUE\n                        ELSE\n                           DO 60 I = 1, M\n                              Z( I ) = X( M - I + 1 )\n   60                      CONTINUE\n                        END IF\n                        DO 70 J = 1, N\n                           IF( INCY.GT.0 )THEN\n                              W( 1 ) = Y( J )\n                           ELSE\n                              W( 1 ) = Y( N - J + 1 )\n                           END IF\n                           IF( CONJ )\n     $                        W( 1 ) = CONJG( W( 1 ) )\n                           CALL CMVCH( 'N', M, 1, ALPHA, Z, NMAX, W, 1,\n     $                                 ONE, A( 1, J ), 1, YT, G,\n     $                                 AA( 1 + ( J - 1 )*LDA ), EPS,\n     $                                 ERR, FATAL, NOUT, .TRUE. )\n                           ERRMAX = MAX( ERRMAX, ERR )\n*                          If got really bad answer, report and return.\n                           IF( FATAL )\n     $                        GO TO 130\n   70                   CONTINUE\n                     ELSE\n*                       Avoid repeating tests with M.le.0 or N.le.0.\n                        GO TO 110\n                     END IF\n*\n   80             CONTINUE\n*\n   90          CONTINUE\n*\n  100       CONTINUE\n*\n  110    CONTINUE\n*\n  120 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 150\n*\n  130 CONTINUE\n      WRITE( NOUT, FMT = 9995 )J\n*\n  140 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      WRITE( NOUT, FMT = 9994 )NC, SNAME, M, N, ALPHA, INCX, INCY, LDA\n*\n  150 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( '      THESE ARE THE RESULTS FOR COLUMN ', I3 )\n 9994 FORMAT( 1X, I6, ': ', A6, '(', 2( I3, ',' ), '(', F4.1, ',', F4.1,\n     $      '), X,', I2, ', Y,', I2, ', A,', I3, ')                   ',\n     $      '      .' )\n 9993 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of CCHK4.\n*\n      END\n      SUBROUTINE CCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX,\n     $                  INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G,\n     $                  Z )\n*\n*  Tests CHER and CHPR.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Parameters ..\n      COMPLEX            ZERO, HALF, ONE\n      PARAMETER          ( ZERO = ( 0.0, 0.0 ), HALF = ( 0.5, 0.0 ),\n     $                   ONE = ( 1.0, 0.0 ) )\n      REAL               RZERO\n      PARAMETER          ( RZERO = 0.0 )\n*     .. Scalar Arguments ..\n      REAL               EPS, THRESH\n      INTEGER            INCMAX, NALF, NIDIM, NINC, NMAX, NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      COMPLEX            A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),\n     $                   AS( NMAX*NMAX ), X( NMAX ), XS( NMAX*INCMAX ),\n     $                   XX( NMAX*INCMAX ), Y( NMAX ),\n     $                   YS( NMAX*INCMAX ), YT( NMAX ),\n     $                   YY( NMAX*INCMAX ), Z( NMAX )\n      REAL               G( NMAX )\n      INTEGER            IDIM( NIDIM ), INC( NINC )\n*     .. Local Scalars ..\n      COMPLEX            ALPHA, TRANSL\n      REAL               ERR, ERRMAX, RALPHA, RALS\n      INTEGER            I, IA, IC, IN, INCX, INCXS, IX, J, JA, JJ, LAA,\n     $                   LDA, LDAS, LJ, LX, N, NARGS, NC, NS\n      LOGICAL            FULL, NULL, PACKED, RESET, SAME, UPPER\n      CHARACTER*1        UPLO, UPLOS\n      CHARACTER*2        ICH\n*     .. Local Arrays ..\n      COMPLEX            W( 1 )\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LCE, LCERES\n      EXTERNAL           LCE, LCERES\n*     .. External Subroutines ..\n      EXTERNAL           CHER, CHPR, CMAKE, CMVCH\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, CMPLX, CONJG, MAX, REAL\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Data statements ..\n      DATA               ICH/'UL'/\n*     .. Executable Statements ..\n      FULL = SNAME( 3: 3 ).EQ.'E'\n      PACKED = SNAME( 3: 3 ).EQ.'P'\n*     Define the number of arguments.\n      IF( FULL )THEN\n         NARGS = 7\n      ELSE IF( PACKED )THEN\n         NARGS = 6\n      END IF\n*\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = RZERO\n*\n      DO 100 IN = 1, NIDIM\n         N = IDIM( IN )\n*        Set LDA to 1 more than minimum value if room.\n         LDA = N\n         IF( LDA.LT.NMAX )\n     $      LDA = LDA + 1\n*        Skip tests if not enough room.\n         IF( LDA.GT.NMAX )\n     $      GO TO 100\n         IF( PACKED )THEN\n            LAA = ( N*( N + 1 ) )/2\n         ELSE\n            LAA = LDA*N\n         END IF\n*\n         DO 90 IC = 1, 2\n            UPLO = ICH( IC: IC )\n            UPPER = UPLO.EQ.'U'\n*\n            DO 80 IX = 1, NINC\n               INCX = INC( IX )\n               LX = ABS( INCX )*N\n*\n*              Generate the vector X.\n*\n               TRANSL = HALF\n               CALL CMAKE( 'GE', ' ', ' ', 1, N, X, 1, XX, ABS( INCX ),\n     $                     0, N - 1, RESET, TRANSL )\n               IF( N.GT.1 )THEN\n                  X( N/2 ) = ZERO\n                  XX( 1 + ABS( INCX )*( N/2 - 1 ) ) = ZERO\n               END IF\n*\n               DO 70 IA = 1, NALF\n                  RALPHA = REAL( ALF( IA ) )\n                  ALPHA = CMPLX( RALPHA, RZERO )\n                  NULL = N.LE.0.OR.RALPHA.EQ.RZERO\n*\n*                 Generate the matrix A.\n*\n                  TRANSL = ZERO\n                  CALL CMAKE( SNAME( 2: 3 ), UPLO, ' ', N, N, A, NMAX,\n     $                        AA, LDA, N - 1, N - 1, RESET, TRANSL )\n*\n                  NC = NC + 1\n*\n*                 Save every datum before calling the subroutine.\n*\n                  UPLOS = UPLO\n                  NS = N\n                  RALS = RALPHA\n                  DO 10 I = 1, LAA\n                     AS( I ) = AA( I )\n   10             CONTINUE\n                  LDAS = LDA\n                  DO 20 I = 1, LX\n                     XS( I ) = XX( I )\n   20             CONTINUE\n                  INCXS = INCX\n*\n*                 Call the subroutine.\n*\n                  IF( FULL )THEN\n                     IF( TRACE )\n     $                  WRITE( NTRA, FMT = 9993 )NC, SNAME, UPLO, N,\n     $                  RALPHA, INCX, LDA\n                     IF( REWI )\n     $                  REWIND NTRA\n                     CALL CHER( UPLO, N, RALPHA, XX, INCX, AA, LDA )\n                  ELSE IF( PACKED )THEN\n                     IF( TRACE )\n     $                  WRITE( NTRA, FMT = 9994 )NC, SNAME, UPLO, N,\n     $                  RALPHA, INCX\n                     IF( REWI )\n     $                  REWIND NTRA\n                     CALL CHPR( UPLO, N, RALPHA, XX, INCX, AA )\n                  END IF\n*\n*                 Check if error-exit was taken incorrectly.\n*\n                  IF( .NOT.OK )THEN\n                     WRITE( NOUT, FMT = 9992 )\n                     FATAL = .TRUE.\n                     GO TO 120\n                  END IF\n*\n*                 See what data changed inside subroutines.\n*\n                  ISAME( 1 ) = UPLO.EQ.UPLOS\n                  ISAME( 2 ) = NS.EQ.N\n                  ISAME( 3 ) = RALS.EQ.RALPHA\n                  ISAME( 4 ) = LCE( XS, XX, LX )\n                  ISAME( 5 ) = INCXS.EQ.INCX\n                  IF( NULL )THEN\n                     ISAME( 6 ) = LCE( AS, AA, LAA )\n                  ELSE\n                     ISAME( 6 ) = LCERES( SNAME( 2: 3 ), UPLO, N, N, AS,\n     $                            AA, LDA )\n                  END IF\n                  IF( .NOT.PACKED )THEN\n                     ISAME( 7 ) = LDAS.EQ.LDA\n                  END IF\n*\n*                 If data was incorrectly changed, report and return.\n*\n                  SAME = .TRUE.\n                  DO 30 I = 1, NARGS\n                     SAME = SAME.AND.ISAME( I )\n                     IF( .NOT.ISAME( I ) )\n     $                  WRITE( NOUT, FMT = 9998 )I\n   30             CONTINUE\n                  IF( .NOT.SAME )THEN\n                     FATAL = .TRUE.\n                     GO TO 120\n                  END IF\n*\n                  IF( .NOT.NULL )THEN\n*\n*                    Check the result column by column.\n*\n                     IF( INCX.GT.0 )THEN\n                        DO 40 I = 1, N\n                           Z( I ) = X( I )\n   40                   CONTINUE\n                     ELSE\n                        DO 50 I = 1, N\n                           Z( I ) = X( N - I + 1 )\n   50                   CONTINUE\n                     END IF\n                     JA = 1\n                     DO 60 J = 1, N\n                        W( 1 ) = CONJG( Z( J ) )\n                        IF( UPPER )THEN\n                           JJ = 1\n                           LJ = J\n                        ELSE\n                           JJ = J\n                           LJ = N - J + 1\n                        END IF\n                        CALL CMVCH( 'N', LJ, 1, ALPHA, Z( JJ ), LJ, W,\n     $                              1, ONE, A( JJ, J ), 1, YT, G,\n     $                              AA( JA ), EPS, ERR, FATAL, NOUT,\n     $                              .TRUE. )\n                        IF( FULL )THEN\n                           IF( UPPER )THEN\n                              JA = JA + LDA\n                           ELSE\n                              JA = JA + LDA + 1\n                           END IF\n                        ELSE\n                           JA = JA + LJ\n                        END IF\n                        ERRMAX = MAX( ERRMAX, ERR )\n*                       If got really bad answer, report and return.\n                        IF( FATAL )\n     $                     GO TO 110\n   60                CONTINUE\n                  ELSE\n*                    Avoid repeating tests if N.le.0.\n                     IF( N.LE.0 )\n     $                  GO TO 100\n                  END IF\n*\n   70          CONTINUE\n*\n   80       CONTINUE\n*\n   90    CONTINUE\n*\n  100 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 130\n*\n  110 CONTINUE\n      WRITE( NOUT, FMT = 9995 )J\n*\n  120 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      IF( FULL )THEN\n         WRITE( NOUT, FMT = 9993 )NC, SNAME, UPLO, N, RALPHA, INCX, LDA\n      ELSE IF( PACKED )THEN\n         WRITE( NOUT, FMT = 9994 )NC, SNAME, UPLO, N, RALPHA, INCX\n      END IF\n*\n  130 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( '      THESE ARE THE RESULTS FOR COLUMN ', I3 )\n 9994 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', I3, ',', F4.1, ', X,',\n     $      I2, ', AP)                                         .' )\n 9993 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', I3, ',', F4.1, ', X,',\n     $      I2, ', A,', I3, ')                                      .' )\n 9992 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of CCHK5.\n*\n      END\n      SUBROUTINE CCHK6( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX,\n     $                  INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G,\n     $                  Z )\n*\n*  Tests CHER2 and CHPR2.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Parameters ..\n      COMPLEX            ZERO, HALF, ONE\n      PARAMETER          ( ZERO = ( 0.0, 0.0 ), HALF = ( 0.5, 0.0 ),\n     $                   ONE = ( 1.0, 0.0 ) )\n      REAL               RZERO\n      PARAMETER          ( RZERO = 0.0 )\n*     .. Scalar Arguments ..\n      REAL               EPS, THRESH\n      INTEGER            INCMAX, NALF, NIDIM, NINC, NMAX, NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      COMPLEX            A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),\n     $                   AS( NMAX*NMAX ), X( NMAX ), XS( NMAX*INCMAX ),\n     $                   XX( NMAX*INCMAX ), Y( NMAX ),\n     $                   YS( NMAX*INCMAX ), YT( NMAX ),\n     $                   YY( NMAX*INCMAX ), Z( NMAX, 2 )\n      REAL               G( NMAX )\n      INTEGER            IDIM( NIDIM ), INC( NINC )\n*     .. Local Scalars ..\n      COMPLEX            ALPHA, ALS, TRANSL\n      REAL               ERR, ERRMAX\n      INTEGER            I, IA, IC, IN, INCX, INCXS, INCY, INCYS, IX,\n     $                   IY, J, JA, JJ, LAA, LDA, LDAS, LJ, LX, LY, N,\n     $                   NARGS, NC, NS\n      LOGICAL            FULL, NULL, PACKED, RESET, SAME, UPPER\n      CHARACTER*1        UPLO, UPLOS\n      CHARACTER*2        ICH\n*     .. Local Arrays ..\n      COMPLEX            W( 2 )\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LCE, LCERES\n      EXTERNAL           LCE, LCERES\n*     .. External Subroutines ..\n      EXTERNAL           CHER2, CHPR2, CMAKE, CMVCH\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, CONJG, MAX\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Data statements ..\n      DATA               ICH/'UL'/\n*     .. Executable Statements ..\n      FULL = SNAME( 3: 3 ).EQ.'E'\n      PACKED = SNAME( 3: 3 ).EQ.'P'\n*     Define the number of arguments.\n      IF( FULL )THEN\n         NARGS = 9\n      ELSE IF( PACKED )THEN\n         NARGS = 8\n      END IF\n*\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = RZERO\n*\n      DO 140 IN = 1, NIDIM\n         N = IDIM( IN )\n*        Set LDA to 1 more than minimum value if room.\n         LDA = N\n         IF( LDA.LT.NMAX )\n     $      LDA = LDA + 1\n*        Skip tests if not enough room.\n         IF( LDA.GT.NMAX )\n     $      GO TO 140\n         IF( PACKED )THEN\n            LAA = ( N*( N + 1 ) )/2\n         ELSE\n            LAA = LDA*N\n         END IF\n*\n         DO 130 IC = 1, 2\n            UPLO = ICH( IC: IC )\n            UPPER = UPLO.EQ.'U'\n*\n            DO 120 IX = 1, NINC\n               INCX = INC( IX )\n               LX = ABS( INCX )*N\n*\n*              Generate the vector X.\n*\n               TRANSL = HALF\n               CALL CMAKE( 'GE', ' ', ' ', 1, N, X, 1, XX, ABS( INCX ),\n     $                     0, N - 1, RESET, TRANSL )\n               IF( N.GT.1 )THEN\n                  X( N/2 ) = ZERO\n                  XX( 1 + ABS( INCX )*( N/2 - 1 ) ) = ZERO\n               END IF\n*\n               DO 110 IY = 1, NINC\n                  INCY = INC( IY )\n                  LY = ABS( INCY )*N\n*\n*                 Generate the vector Y.\n*\n                  TRANSL = ZERO\n                  CALL CMAKE( 'GE', ' ', ' ', 1, N, Y, 1, YY,\n     $                        ABS( INCY ), 0, N - 1, RESET, TRANSL )\n                  IF( N.GT.1 )THEN\n                     Y( N/2 ) = ZERO\n                     YY( 1 + ABS( INCY )*( N/2 - 1 ) ) = ZERO\n                  END IF\n*\n                  DO 100 IA = 1, NALF\n                     ALPHA = ALF( IA )\n                     NULL = N.LE.0.OR.ALPHA.EQ.ZERO\n*\n*                    Generate the matrix A.\n*\n                     TRANSL = ZERO\n                     CALL CMAKE( SNAME( 2: 3 ), UPLO, ' ', N, N, A,\n     $                           NMAX, AA, LDA, N - 1, N - 1, RESET,\n     $                           TRANSL )\n*\n                     NC = NC + 1\n*\n*                    Save every datum before calling the subroutine.\n*\n                     UPLOS = UPLO\n                     NS = N\n                     ALS = ALPHA\n                     DO 10 I = 1, LAA\n                        AS( I ) = AA( I )\n   10                CONTINUE\n                     LDAS = LDA\n                     DO 20 I = 1, LX\n                        XS( I ) = XX( I )\n   20                CONTINUE\n                     INCXS = INCX\n                     DO 30 I = 1, LY\n                        YS( I ) = YY( I )\n   30                CONTINUE\n                     INCYS = INCY\n*\n*                    Call the subroutine.\n*\n                     IF( FULL )THEN\n                        IF( TRACE )\n     $                     WRITE( NTRA, FMT = 9993 )NC, SNAME, UPLO, N,\n     $                     ALPHA, INCX, INCY, LDA\n                        IF( REWI )\n     $                     REWIND NTRA\n                        CALL CHER2( UPLO, N, ALPHA, XX, INCX, YY, INCY,\n     $                              AA, LDA )\n                     ELSE IF( PACKED )THEN\n                        IF( TRACE )\n     $                     WRITE( NTRA, FMT = 9994 )NC, SNAME, UPLO, N,\n     $                     ALPHA, INCX, INCY\n                        IF( REWI )\n     $                     REWIND NTRA\n                        CALL CHPR2( UPLO, N, ALPHA, XX, INCX, YY, INCY,\n     $                              AA )\n                     END IF\n*\n*                    Check if error-exit was taken incorrectly.\n*\n                     IF( .NOT.OK )THEN\n                        WRITE( NOUT, FMT = 9992 )\n                        FATAL = .TRUE.\n                        GO TO 160\n                     END IF\n*\n*                    See what data changed inside subroutines.\n*\n                     ISAME( 1 ) = UPLO.EQ.UPLOS\n                     ISAME( 2 ) = NS.EQ.N\n                     ISAME( 3 ) = ALS.EQ.ALPHA\n                     ISAME( 4 ) = LCE( XS, XX, LX )\n                     ISAME( 5 ) = INCXS.EQ.INCX\n                     ISAME( 6 ) = LCE( YS, YY, LY )\n                     ISAME( 7 ) = INCYS.EQ.INCY\n                     IF( NULL )THEN\n                        ISAME( 8 ) = LCE( AS, AA, LAA )\n                     ELSE\n                        ISAME( 8 ) = LCERES( SNAME( 2: 3 ), UPLO, N, N,\n     $                               AS, AA, LDA )\n                     END IF\n                     IF( .NOT.PACKED )THEN\n                        ISAME( 9 ) = LDAS.EQ.LDA\n                     END IF\n*\n*                    If data was incorrectly changed, report and return.\n*\n                     SAME = .TRUE.\n                     DO 40 I = 1, NARGS\n                        SAME = SAME.AND.ISAME( I )\n                        IF( .NOT.ISAME( I ) )\n     $                     WRITE( NOUT, FMT = 9998 )I\n   40                CONTINUE\n                     IF( .NOT.SAME )THEN\n                        FATAL = .TRUE.\n                        GO TO 160\n                     END IF\n*\n                     IF( .NOT.NULL )THEN\n*\n*                       Check the result column by column.\n*\n                        IF( INCX.GT.0 )THEN\n                           DO 50 I = 1, N\n                              Z( I, 1 ) = X( I )\n   50                      CONTINUE\n                        ELSE\n                           DO 60 I = 1, N\n                              Z( I, 1 ) = X( N - I + 1 )\n   60                      CONTINUE\n                        END IF\n                        IF( INCY.GT.0 )THEN\n                           DO 70 I = 1, N\n                              Z( I, 2 ) = Y( I )\n   70                      CONTINUE\n                        ELSE\n                           DO 80 I = 1, N\n                              Z( I, 2 ) = Y( N - I + 1 )\n   80                      CONTINUE\n                        END IF\n                        JA = 1\n                        DO 90 J = 1, N\n                           W( 1 ) = ALPHA*CONJG( Z( J, 2 ) )\n                           W( 2 ) = CONJG( ALPHA )*CONJG( Z( J, 1 ) )\n                           IF( UPPER )THEN\n                              JJ = 1\n                              LJ = J\n                           ELSE\n                              JJ = J\n                              LJ = N - J + 1\n                           END IF\n                           CALL CMVCH( 'N', LJ, 2, ONE, Z( JJ, 1 ),\n     $                                 NMAX, W, 1, ONE, A( JJ, J ), 1,\n     $                                 YT, G, AA( JA ), EPS, ERR, FATAL,\n     $                                 NOUT, .TRUE. )\n                           IF( FULL )THEN\n                              IF( UPPER )THEN\n                                 JA = JA + LDA\n                              ELSE\n                                 JA = JA + LDA + 1\n                              END IF\n                           ELSE\n                              JA = JA + LJ\n                           END IF\n                           ERRMAX = MAX( ERRMAX, ERR )\n*                          If got really bad answer, report and return.\n                           IF( FATAL )\n     $                        GO TO 150\n   90                   CONTINUE\n                     ELSE\n*                       Avoid repeating tests with N.le.0.\n                        IF( N.LE.0 )\n     $                     GO TO 140\n                     END IF\n*\n  100             CONTINUE\n*\n  110          CONTINUE\n*\n  120       CONTINUE\n*\n  130    CONTINUE\n*\n  140 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 170\n*\n  150 CONTINUE\n      WRITE( NOUT, FMT = 9995 )J\n*\n  160 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      IF( FULL )THEN\n         WRITE( NOUT, FMT = 9993 )NC, SNAME, UPLO, N, ALPHA, INCX,\n     $      INCY, LDA\n      ELSE IF( PACKED )THEN\n         WRITE( NOUT, FMT = 9994 )NC, SNAME, UPLO, N, ALPHA, INCX, INCY\n      END IF\n*\n  170 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( '      THESE ARE THE RESULTS FOR COLUMN ', I3 )\n 9994 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', I3, ',(', F4.1, ',',\n     $      F4.1, '), X,', I2, ', Y,', I2, ', AP)                     ',\n     $      '       .' )\n 9993 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', I3, ',(', F4.1, ',',\n     $      F4.1, '), X,', I2, ', Y,', I2, ', A,', I3, ')             ',\n     $      '            .' )\n 9992 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of CCHK6.\n*\n      END\n      SUBROUTINE CCHKE( ISNUM, SRNAMT, NOUT )\n*\n*  Tests the error exits from the Level 2 Blas.\n*  Requires a special version of the error-handling routine XERBLA.\n*  ALPHA, RALPHA, BETA, A, X and Y should not need to be defined.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Scalar Arguments ..\n      INTEGER            ISNUM, NOUT\n      CHARACTER*6        SRNAMT\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Local Scalars ..\n      COMPLEX            ALPHA, BETA\n      REAL               RALPHA\n*     .. Local Arrays ..\n      COMPLEX            A( 1, 1 ), X( 1 ), Y( 1 )\n*     .. External Subroutines ..\n      EXTERNAL           CGBMV, CGEMV, CGERC, CGERU, CHBMV, CHEMV, CHER,\n     $                   CHER2, CHKXER, CHPMV, CHPR, CHPR2, CTBMV,\n     $                   CTBSV, CTPMV, CTPSV, CTRMV, CTRSV\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Executable Statements ..\n*     OK is set to .FALSE. by the special version of XERBLA or by CHKXER\n*     if anything is wrong.\n      OK = .TRUE.\n*     LERR is set to .TRUE. by the special version of XERBLA each time\n*     it is called, and is then tested and re-set by CHKXER.\n      LERR = .FALSE.\n      GO TO ( 10, 20, 30, 40, 50, 60, 70, 80,\n     $        90, 100, 110, 120, 130, 140, 150, 160,\n     $        170 )ISNUM\n   10 INFOT = 1\n      CALL CGEMV( '/', 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL CGEMV( 'N', -1, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CGEMV( 'N', 0, -1, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL CGEMV( 'N', 2, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL CGEMV( 'N', 0, 0, ALPHA, A, 1, X, 0, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL CGEMV( 'N', 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 180\n   20 INFOT = 1\n      CALL CGBMV( '/', 0, 0, 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL CGBMV( 'N', -1, 0, 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CGBMV( 'N', 0, -1, 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CGBMV( 'N', 0, 0, -1, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CGBMV( 'N', 2, 0, 0, -1, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL CGBMV( 'N', 0, 0, 1, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL CGBMV( 'N', 0, 0, 0, 0, ALPHA, A, 1, X, 0, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 13\n      CALL CGBMV( 'N', 0, 0, 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 180\n   30 INFOT = 1\n      CALL CHEMV( '/', 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL CHEMV( 'U', -1, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CHEMV( 'U', 2, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL CHEMV( 'U', 0, ALPHA, A, 1, X, 0, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL CHEMV( 'U', 0, ALPHA, A, 1, X, 1, BETA, Y, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 180\n   40 INFOT = 1\n      CALL CHBMV( '/', 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL CHBMV( 'U', -1, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CHBMV( 'U', 0, -1, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL CHBMV( 'U', 0, 1, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL CHBMV( 'U', 0, 0, ALPHA, A, 1, X, 0, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL CHBMV( 'U', 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 180\n   50 INFOT = 1\n      CALL CHPMV( '/', 0, ALPHA, A, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL CHPMV( 'U', -1, ALPHA, A, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL CHPMV( 'U', 0, ALPHA, A, X, 0, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CHPMV( 'U', 0, ALPHA, A, X, 1, BETA, Y, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 180\n   60 INFOT = 1\n      CALL CTRMV( '/', 'N', 'N', 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL CTRMV( 'U', '/', 'N', 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CTRMV( 'U', 'N', '/', 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CTRMV( 'U', 'N', 'N', -1, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL CTRMV( 'U', 'N', 'N', 2, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL CTRMV( 'U', 'N', 'N', 0, A, 1, X, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 180\n   70 INFOT = 1\n      CALL CTBMV( '/', 'N', 'N', 0, 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL CTBMV( 'U', '/', 'N', 0, 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CTBMV( 'U', 'N', '/', 0, 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CTBMV( 'U', 'N', 'N', -1, 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CTBMV( 'U', 'N', 'N', 0, -1, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL CTBMV( 'U', 'N', 'N', 0, 1, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CTBMV( 'U', 'N', 'N', 0, 0, A, 1, X, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 180\n   80 INFOT = 1\n      CALL CTPMV( '/', 'N', 'N', 0, A, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL CTPMV( 'U', '/', 'N', 0, A, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CTPMV( 'U', 'N', '/', 0, A, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CTPMV( 'U', 'N', 'N', -1, A, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL CTPMV( 'U', 'N', 'N', 0, A, X, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 180\n   90 INFOT = 1\n      CALL CTRSV( '/', 'N', 'N', 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL CTRSV( 'U', '/', 'N', 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CTRSV( 'U', 'N', '/', 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CTRSV( 'U', 'N', 'N', -1, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL CTRSV( 'U', 'N', 'N', 2, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL CTRSV( 'U', 'N', 'N', 0, A, 1, X, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 180\n  100 INFOT = 1\n      CALL CTBSV( '/', 'N', 'N', 0, 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL CTBSV( 'U', '/', 'N', 0, 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CTBSV( 'U', 'N', '/', 0, 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CTBSV( 'U', 'N', 'N', -1, 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CTBSV( 'U', 'N', 'N', 0, -1, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL CTBSV( 'U', 'N', 'N', 0, 1, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CTBSV( 'U', 'N', 'N', 0, 0, A, 1, X, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 180\n  110 INFOT = 1\n      CALL CTPSV( '/', 'N', 'N', 0, A, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL CTPSV( 'U', '/', 'N', 0, A, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CTPSV( 'U', 'N', '/', 0, A, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CTPSV( 'U', 'N', 'N', -1, A, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL CTPSV( 'U', 'N', 'N', 0, A, X, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 180\n  120 INFOT = 1\n      CALL CGERC( -1, 0, ALPHA, X, 1, Y, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL CGERC( 0, -1, ALPHA, X, 1, Y, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CGERC( 0, 0, ALPHA, X, 0, Y, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL CGERC( 0, 0, ALPHA, X, 1, Y, 0, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CGERC( 2, 0, ALPHA, X, 1, Y, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 180\n  130 INFOT = 1\n      CALL CGERU( -1, 0, ALPHA, X, 1, Y, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL CGERU( 0, -1, ALPHA, X, 1, Y, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CGERU( 0, 0, ALPHA, X, 0, Y, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL CGERU( 0, 0, ALPHA, X, 1, Y, 0, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CGERU( 2, 0, ALPHA, X, 1, Y, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 180\n  140 INFOT = 1\n      CALL CHER( '/', 0, RALPHA, X, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL CHER( 'U', -1, RALPHA, X, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CHER( 'U', 0, RALPHA, X, 0, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL CHER( 'U', 2, RALPHA, X, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 180\n  150 INFOT = 1\n      CALL CHPR( '/', 0, RALPHA, X, 1, A )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL CHPR( 'U', -1, RALPHA, X, 1, A )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CHPR( 'U', 0, RALPHA, X, 0, A )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 180\n  160 INFOT = 1\n      CALL CHER2( '/', 0, ALPHA, X, 1, Y, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL CHER2( 'U', -1, ALPHA, X, 1, Y, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CHER2( 'U', 0, ALPHA, X, 0, Y, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL CHER2( 'U', 0, ALPHA, X, 1, Y, 0, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CHER2( 'U', 2, ALPHA, X, 1, Y, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 180\n  170 INFOT = 1\n      CALL CHPR2( '/', 0, ALPHA, X, 1, Y, 1, A )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL CHPR2( 'U', -1, ALPHA, X, 1, Y, 1, A )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CHPR2( 'U', 0, ALPHA, X, 0, Y, 1, A )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL CHPR2( 'U', 0, ALPHA, X, 1, Y, 0, A )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n*\n  180 IF( OK )THEN\n         WRITE( NOUT, FMT = 9999 )SRNAMT\n      ELSE\n         WRITE( NOUT, FMT = 9998 )SRNAMT\n      END IF\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE TESTS OF ERROR-EXITS' )\n 9998 FORMAT( ' ******* ', A6, ' FAILED THE TESTS OF ERROR-EXITS *****',\n     $      '**' )\n*\n*     End of CCHKE.\n*\n      END\n      SUBROUTINE CMAKE( TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, KL,\n     $                  KU, RESET, TRANSL )\n*\n*  Generates values for an M by N matrix A within the bandwidth\n*  defined by KL and KU.\n*  Stores the values in the array AA in the data structure required\n*  by the routine, with unwanted elements set to rogue value.\n*\n*  TYPE is 'GE', 'GB', 'HE', 'HB', 'HP', 'TR', 'TB' OR 'TP'.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Parameters ..\n      COMPLEX            ZERO, ONE\n      PARAMETER          ( ZERO = ( 0.0, 0.0 ), ONE = ( 1.0, 0.0 ) )\n      COMPLEX            ROGUE\n      PARAMETER          ( ROGUE = ( -1.0E10, 1.0E10 ) )\n      REAL               RZERO\n      PARAMETER          ( RZERO = 0.0 )\n      REAL               RROGUE\n      PARAMETER          ( RROGUE = -1.0E10 )\n*     .. Scalar Arguments ..\n      COMPLEX            TRANSL\n      INTEGER            KL, KU, LDA, M, N, NMAX\n      LOGICAL            RESET\n      CHARACTER*1        DIAG, UPLO\n      CHARACTER*2        TYPE\n*     .. Array Arguments ..\n      COMPLEX            A( NMAX, * ), AA( * )\n*     .. Local Scalars ..\n      INTEGER            I, I1, I2, I3, IBEG, IEND, IOFF, J, JJ, KK\n      LOGICAL            GEN, LOWER, SYM, TRI, UNIT, UPPER\n*     .. External Functions ..\n      COMPLEX            CBEG\n      EXTERNAL           CBEG\n*     .. Intrinsic Functions ..\n      INTRINSIC          CMPLX, CONJG, MAX, MIN, REAL\n*     .. Executable Statements ..\n      GEN = TYPE( 1: 1 ).EQ.'G'\n      SYM = TYPE( 1: 1 ).EQ.'H'\n      TRI = TYPE( 1: 1 ).EQ.'T'\n      UPPER = ( SYM.OR.TRI ).AND.UPLO.EQ.'U'\n      LOWER = ( SYM.OR.TRI ).AND.UPLO.EQ.'L'\n      UNIT = TRI.AND.DIAG.EQ.'U'\n*\n*     Generate data in array A.\n*\n      DO 20 J = 1, N\n         DO 10 I = 1, M\n            IF( GEN.OR.( UPPER.AND.I.LE.J ).OR.( LOWER.AND.I.GE.J ) )\n     $          THEN\n               IF( ( I.LE.J.AND.J - I.LE.KU ).OR.\n     $             ( I.GE.J.AND.I - J.LE.KL ) )THEN\n                  A( I, J ) = CBEG( RESET ) + TRANSL\n               ELSE\n                  A( I, J ) = ZERO\n               END IF\n               IF( I.NE.J )THEN\n                  IF( SYM )THEN\n                     A( J, I ) = CONJG( A( I, J ) )\n                  ELSE IF( TRI )THEN\n                     A( J, I ) = ZERO\n                  END IF\n               END IF\n            END IF\n   10    CONTINUE\n         IF( SYM )\n     $      A( J, J ) = CMPLX( REAL( A( J, J ) ), RZERO )\n         IF( TRI )\n     $      A( J, J ) = A( J, J ) + ONE\n         IF( UNIT )\n     $      A( J, J ) = ONE\n   20 CONTINUE\n*\n*     Store elements in array AS in data structure required by routine.\n*\n      IF( TYPE.EQ.'GE' )THEN\n         DO 50 J = 1, N\n            DO 30 I = 1, M\n               AA( I + ( J - 1 )*LDA ) = A( I, J )\n   30       CONTINUE\n            DO 40 I = M + 1, LDA\n               AA( I + ( J - 1 )*LDA ) = ROGUE\n   40       CONTINUE\n   50    CONTINUE\n      ELSE IF( TYPE.EQ.'GB' )THEN\n         DO 90 J = 1, N\n            DO 60 I1 = 1, KU + 1 - J\n               AA( I1 + ( J - 1 )*LDA ) = ROGUE\n   60       CONTINUE\n            DO 70 I2 = I1, MIN( KL + KU + 1, KU + 1 + M - J )\n               AA( I2 + ( J - 1 )*LDA ) = A( I2 + J - KU - 1, J )\n   70       CONTINUE\n            DO 80 I3 = I2, LDA\n               AA( I3 + ( J - 1 )*LDA ) = ROGUE\n   80       CONTINUE\n   90    CONTINUE\n      ELSE IF( TYPE.EQ.'HE'.OR.TYPE.EQ.'TR' )THEN\n         DO 130 J = 1, N\n            IF( UPPER )THEN\n               IBEG = 1\n               IF( UNIT )THEN\n                  IEND = J - 1\n               ELSE\n                  IEND = J\n               END IF\n            ELSE\n               IF( UNIT )THEN\n                  IBEG = J + 1\n               ELSE\n                  IBEG = J\n               END IF\n               IEND = N\n            END IF\n            DO 100 I = 1, IBEG - 1\n               AA( I + ( J - 1 )*LDA ) = ROGUE\n  100       CONTINUE\n            DO 110 I = IBEG, IEND\n               AA( I + ( J - 1 )*LDA ) = A( I, J )\n  110       CONTINUE\n            DO 120 I = IEND + 1, LDA\n               AA( I + ( J - 1 )*LDA ) = ROGUE\n  120       CONTINUE\n            IF( SYM )THEN\n               JJ = J + ( J - 1 )*LDA\n               AA( JJ ) = CMPLX( REAL( AA( JJ ) ), RROGUE )\n            END IF\n  130    CONTINUE\n      ELSE IF( TYPE.EQ.'HB'.OR.TYPE.EQ.'TB' )THEN\n         DO 170 J = 1, N\n            IF( UPPER )THEN\n               KK = KL + 1\n               IBEG = MAX( 1, KL + 2 - J )\n               IF( UNIT )THEN\n                  IEND = KL\n               ELSE\n                  IEND = KL + 1\n               END IF\n            ELSE\n               KK = 1\n               IF( UNIT )THEN\n                  IBEG = 2\n               ELSE\n                  IBEG = 1\n               END IF\n               IEND = MIN( KL + 1, 1 + M - J )\n            END IF\n            DO 140 I = 1, IBEG - 1\n               AA( I + ( J - 1 )*LDA ) = ROGUE\n  140       CONTINUE\n            DO 150 I = IBEG, IEND\n               AA( I + ( J - 1 )*LDA ) = A( I + J - KK, J )\n  150       CONTINUE\n            DO 160 I = IEND + 1, LDA\n               AA( I + ( J - 1 )*LDA ) = ROGUE\n  160       CONTINUE\n            IF( SYM )THEN\n               JJ = KK + ( J - 1 )*LDA\n               AA( JJ ) = CMPLX( REAL( AA( JJ ) ), RROGUE )\n            END IF\n  170    CONTINUE\n      ELSE IF( TYPE.EQ.'HP'.OR.TYPE.EQ.'TP' )THEN\n         IOFF = 0\n         DO 190 J = 1, N\n            IF( UPPER )THEN\n               IBEG = 1\n               IEND = J\n            ELSE\n               IBEG = J\n               IEND = N\n            END IF\n            DO 180 I = IBEG, IEND\n               IOFF = IOFF + 1\n               AA( IOFF ) = A( I, J )\n               IF( I.EQ.J )THEN\n                  IF( UNIT )\n     $               AA( IOFF ) = ROGUE\n                  IF( SYM )\n     $               AA( IOFF ) = CMPLX( REAL( AA( IOFF ) ), RROGUE )\n               END IF\n  180       CONTINUE\n  190    CONTINUE\n      END IF\n      RETURN\n*\n*     End of CMAKE.\n*\n      END\n      SUBROUTINE CMVCH( TRANS, M, N, ALPHA, A, NMAX, X, INCX, BETA, Y,\n     $                  INCY, YT, G, YY, EPS, ERR, FATAL, NOUT, MV )\n*\n*  Checks the results of the computational tests.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Parameters ..\n      COMPLEX            ZERO\n      PARAMETER          ( ZERO = ( 0.0, 0.0 ) )\n      REAL               RZERO, RONE\n      PARAMETER          ( RZERO = 0.0, RONE = 1.0 )\n*     .. Scalar Arguments ..\n      COMPLEX            ALPHA, BETA\n      REAL               EPS, ERR\n      INTEGER            INCX, INCY, M, N, NMAX, NOUT\n      LOGICAL            FATAL, MV\n      CHARACTER*1        TRANS\n*     .. Array Arguments ..\n      COMPLEX            A( NMAX, * ), X( * ), Y( * ), YT( * ), YY( * )\n      REAL               G( * )\n*     .. Local Scalars ..\n      COMPLEX            C\n      REAL               ERRI\n      INTEGER            I, INCXL, INCYL, IY, J, JX, KX, KY, ML, NL\n      LOGICAL            CTRAN, TRAN\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, AIMAG, CONJG, MAX, REAL, SQRT\n*     .. Statement Functions ..\n      REAL               ABS1\n*     .. Statement Function definitions ..\n      ABS1( C ) = ABS( REAL( C ) ) + ABS( AIMAG( C ) )\n*     .. Executable Statements ..\n      TRAN = TRANS.EQ.'T'\n      CTRAN = TRANS.EQ.'C'\n      IF( TRAN.OR.CTRAN )THEN\n         ML = N\n         NL = M\n      ELSE\n         ML = M\n         NL = N\n      END IF\n      IF( INCX.LT.0 )THEN\n         KX = NL\n         INCXL = -1\n      ELSE\n         KX = 1\n         INCXL = 1\n      END IF\n      IF( INCY.LT.0 )THEN\n         KY = ML\n         INCYL = -1\n      ELSE\n         KY = 1\n         INCYL = 1\n      END IF\n*\n*     Compute expected result in YT using data in A, X and Y.\n*     Compute gauges in G.\n*\n      IY = KY\n      DO 40 I = 1, ML\n         YT( IY ) = ZERO\n         G( IY ) = RZERO\n         JX = KX\n         IF( TRAN )THEN\n            DO 10 J = 1, NL\n               YT( IY ) = YT( IY ) + A( J, I )*X( JX )\n               G( IY ) = G( IY ) + ABS1( A( J, I ) )*ABS1( X( JX ) )\n               JX = JX + INCXL\n   10       CONTINUE\n         ELSE IF( CTRAN )THEN\n            DO 20 J = 1, NL\n               YT( IY ) = YT( IY ) + CONJG( A( J, I ) )*X( JX )\n               G( IY ) = G( IY ) + ABS1( A( J, I ) )*ABS1( X( JX ) )\n               JX = JX + INCXL\n   20       CONTINUE\n         ELSE\n            DO 30 J = 1, NL\n               YT( IY ) = YT( IY ) + A( I, J )*X( JX )\n               G( IY ) = G( IY ) + ABS1( A( I, J ) )*ABS1( X( JX ) )\n               JX = JX + INCXL\n   30       CONTINUE\n         END IF\n         YT( IY ) = ALPHA*YT( IY ) + BETA*Y( IY )\n         G( IY ) = ABS1( ALPHA )*G( IY ) + ABS1( BETA )*ABS1( Y( IY ) )\n         IY = IY + INCYL\n   40 CONTINUE\n*\n*     Compute the error ratio for this result.\n*\n      ERR = ZERO\n      DO 50 I = 1, ML\n         ERRI = ABS( YT( I ) - YY( 1 + ( I - 1 )*ABS( INCY ) ) )/EPS\n         IF( G( I ).NE.RZERO )\n     $      ERRI = ERRI/G( I )\n         ERR = MAX( ERR, ERRI )\n         IF( ERR*SQRT( EPS ).GE.RONE )\n     $      GO TO 60\n   50 CONTINUE\n*     If the loop completes, all results are at least half accurate.\n      GO TO 80\n*\n*     Report fatal error.\n*\n   60 FATAL = .TRUE.\n      WRITE( NOUT, FMT = 9999 )\n      DO 70 I = 1, ML\n         IF( MV )THEN\n            WRITE( NOUT, FMT = 9998 )I, YT( I ),\n     $         YY( 1 + ( I - 1 )*ABS( INCY ) )\n         ELSE\n            WRITE( NOUT, FMT = 9998 )I,\n     $         YY( 1 + ( I - 1 )*ABS( INCY ) ), YT( I )\n         END IF\n   70 CONTINUE\n*\n   80 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ******* FATAL ERROR - COMPUTED RESULT IS LESS THAN HAL',\n     $      'F ACCURATE *******', /'                       EXPECTED RE',\n     $      'SULT                    COMPUTED RESULT' )\n 9998 FORMAT( 1X, I7, 2( '  (', G15.6, ',', G15.6, ')' ) )\n*\n*     End of CMVCH.\n*\n      END\n      LOGICAL FUNCTION LCE( RI, RJ, LR )\n*\n*  Tests if two arrays are identical.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Scalar Arguments ..\n      INTEGER            LR\n*     .. Array Arguments ..\n      COMPLEX            RI( * ), RJ( * )\n*     .. Local Scalars ..\n      INTEGER            I\n*     .. Executable Statements ..\n      DO 10 I = 1, LR\n         IF( RI( I ).NE.RJ( I ) )\n     $      GO TO 20\n   10 CONTINUE\n      LCE = .TRUE.\n      GO TO 30\n   20 CONTINUE\n      LCE = .FALSE.\n   30 RETURN\n*\n*     End of LCE.\n*\n      END\n      LOGICAL FUNCTION LCERES( TYPE, UPLO, M, N, AA, AS, LDA )\n*\n*  Tests if selected elements in two arrays are equal.\n*\n*  TYPE is 'GE', 'HE' or 'HP'.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Scalar Arguments ..\n      INTEGER            LDA, M, N\n      CHARACTER*1        UPLO\n      CHARACTER*2        TYPE\n*     .. Array Arguments ..\n      COMPLEX            AA( LDA, * ), AS( LDA, * )\n*     .. Local Scalars ..\n      INTEGER            I, IBEG, IEND, J\n      LOGICAL            UPPER\n*     .. Executable Statements ..\n      UPPER = UPLO.EQ.'U'\n      IF( TYPE.EQ.'GE' )THEN\n         DO 20 J = 1, N\n            DO 10 I = M + 1, LDA\n               IF( AA( I, J ).NE.AS( I, J ) )\n     $            GO TO 70\n   10       CONTINUE\n   20    CONTINUE\n      ELSE IF( TYPE.EQ.'HE' )THEN\n         DO 50 J = 1, N\n            IF( UPPER )THEN\n               IBEG = 1\n               IEND = J\n            ELSE\n               IBEG = J\n               IEND = N\n            END IF\n            DO 30 I = 1, IBEG - 1\n               IF( AA( I, J ).NE.AS( I, J ) )\n     $            GO TO 70\n   30       CONTINUE\n            DO 40 I = IEND + 1, LDA\n               IF( AA( I, J ).NE.AS( I, J ) )\n     $            GO TO 70\n   40       CONTINUE\n   50    CONTINUE\n      END IF\n*\n   60 CONTINUE\n      LCERES = .TRUE.\n      GO TO 80\n   70 CONTINUE\n      LCERES = .FALSE.\n   80 RETURN\n*\n*     End of LCERES.\n*\n      END\n      COMPLEX FUNCTION CBEG( RESET )\n*\n*  Generates complex numbers as pairs of random numbers uniformly\n*  distributed between -0.5 and 0.5.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Scalar Arguments ..\n      LOGICAL            RESET\n*     .. Local Scalars ..\n      INTEGER            I, IC, J, MI, MJ\n*     .. Save statement ..\n      SAVE               I, IC, J, MI, MJ\n*     .. Intrinsic Functions ..\n      INTRINSIC          CMPLX\n*     .. Executable Statements ..\n      IF( RESET )THEN\n*        Initialize local variables.\n         MI = 891\n         MJ = 457\n         I = 7\n         J = 7\n         IC = 0\n         RESET = .FALSE.\n      END IF\n*\n*     The sequence of values of I or J is bounded between 1 and 999.\n*     If initial I or J = 1,2,3,6,7 or 9, the period will be 50.\n*     If initial I or J = 4 or 8, the period will be 25.\n*     If initial I or J = 5, the period will be 10.\n*     IC is used to break up the period by skipping 1 value of I or J\n*     in 6.\n*\n      IC = IC + 1\n   10 I = I*MI\n      J = J*MJ\n      I = I - 1000*( I/1000 )\n      J = J - 1000*( J/1000 )\n      IF( IC.GE.5 )THEN\n         IC = 0\n         GO TO 10\n      END IF\n      CBEG = CMPLX( ( I - 500 )/1001.0, ( J - 500 )/1001.0 )\n      RETURN\n*\n*     End of CBEG.\n*\n      END\n      REAL FUNCTION SDIFF( X, Y )\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*\n*     .. Scalar Arguments ..\n      REAL               X, Y\n*     .. Executable Statements ..\n      SDIFF = X - Y\n      RETURN\n*\n*     End of SDIFF.\n*\n      END\n      SUBROUTINE CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n*\n*  Tests whether XERBLA has detected an error when it should.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Scalar Arguments ..\n      INTEGER            INFOT, NOUT\n      LOGICAL            LERR, OK\n      CHARACTER*6        SRNAMT\n*     .. Executable Statements ..\n      IF( .NOT.LERR )THEN\n         WRITE( NOUT, FMT = 9999 )INFOT, SRNAMT\n         OK = .FALSE.\n      END IF\n      LERR = .FALSE.\n      RETURN\n*\n 9999 FORMAT( ' ***** ILLEGAL VALUE OF PARAMETER NUMBER ', I2, ' NOT D',\n     $      'ETECTED BY ', A6, ' *****' )\n*\n*     End of CHKXER.\n*\n      END\n      SUBROUTINE XERBLA( SRNAME, INFO )\n*\n*  This is a special version of XERBLA to be used only as part of\n*  the test program for testing error exits from the Level 2 BLAS\n*  routines.\n*\n*  XERBLA  is an error handler for the Level 2 BLAS routines.\n*\n*  It is called by the Level 2 BLAS routines if an input parameter is\n*  invalid.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Scalar Arguments ..\n      INTEGER            INFO\n      CHARACTER*6        SRNAME\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUT\n      LOGICAL            LERR, OK\n      CHARACTER*6        SRNAMT\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUT, OK, LERR\n      COMMON             /SRNAMC/SRNAMT\n*     .. Executable Statements ..\n      LERR = .TRUE.\n      IF( INFO.NE.INFOT )THEN\n         IF( INFOT.NE.0 )THEN\n            WRITE( NOUT, FMT = 9999 )INFO, INFOT\n         ELSE\n            WRITE( NOUT, FMT = 9997 )INFO\n         END IF\n         OK = .FALSE.\n      END IF\n      IF( SRNAME.NE.SRNAMT )THEN\n         WRITE( NOUT, FMT = 9998 )SRNAME, SRNAMT\n         OK = .FALSE.\n      END IF\n      RETURN\n*\n 9999 FORMAT( ' ******* XERBLA WAS CALLED WITH INFO = ', I6, ' INSTEAD',\n     $      ' OF ', I2, ' *******' )\n 9998 FORMAT( ' ******* XERBLA WAS CALLED WITH SRNAME = ', A6, ' INSTE',\n     $      'AD OF ', A6, ' *******' )\n 9997 FORMAT( ' ******* XERBLA WAS CALLED WITH INFO = ', I6,\n     $      ' *******' )\n*\n*     End of XERBLA\n*\n      END\n\n"
  },
  {
    "path": "libs/eigen/blas/testing/cblat3.f",
    "content": "      PROGRAM CBLAT3\n*\n*  Test program for the COMPLEX          Level 3 Blas.\n*\n*  The program must be driven by a short data file. The first 14 records\n*  of the file are read using list-directed input, the last 9 records\n*  are read using the format ( A6, L2 ). An annotated example of a data\n*  file can be obtained by deleting the first 3 characters from the\n*  following 23 lines:\n*  'CBLAT3.SUMM'     NAME OF SUMMARY OUTPUT FILE\n*  6                 UNIT NUMBER OF SUMMARY FILE\n*  'CBLAT3.SNAP'     NAME OF SNAPSHOT OUTPUT FILE\n*  -1                UNIT NUMBER OF SNAPSHOT FILE (NOT USED IF .LT. 0)\n*  F        LOGICAL FLAG, T TO REWIND SNAPSHOT FILE AFTER EACH RECORD.\n*  F        LOGICAL FLAG, T TO STOP ON FAILURES.\n*  T        LOGICAL FLAG, T TO TEST ERROR EXITS.\n*  16.0     THRESHOLD VALUE OF TEST RATIO\n*  6                 NUMBER OF VALUES OF N\n*  0 1 2 3 5 9       VALUES OF N\n*  3                 NUMBER OF VALUES OF ALPHA\n*  (0.0,0.0) (1.0,0.0) (0.7,-0.9)       VALUES OF ALPHA\n*  3                 NUMBER OF VALUES OF BETA\n*  (0.0,0.0) (1.0,0.0) (1.3,-1.1)       VALUES OF BETA\n*  CGEMM  T PUT F FOR NO TEST. SAME COLUMNS.\n*  CHEMM  T PUT F FOR NO TEST. SAME COLUMNS.\n*  CSYMM  T PUT F FOR NO TEST. SAME COLUMNS.\n*  CTRMM  T PUT F FOR NO TEST. SAME COLUMNS.\n*  CTRSM  T PUT F FOR NO TEST. SAME COLUMNS.\n*  CHERK  T PUT F FOR NO TEST. SAME COLUMNS.\n*  CSYRK  T PUT F FOR NO TEST. SAME COLUMNS.\n*  CHER2K T PUT F FOR NO TEST. SAME COLUMNS.\n*  CSYR2K T PUT F FOR NO TEST. SAME COLUMNS.\n*\n*  See:\n*\n*     Dongarra J. J., Du Croz J. J., Duff I. S. and Hammarling S.\n*     A Set of Level 3 Basic Linear Algebra Subprograms.\n*\n*     Technical Memorandum No.88 (Revision 1), Mathematics and\n*     Computer Science Division, Argonne National Laboratory, 9700\n*     South Cass Avenue, Argonne, Illinois 60439, US.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Parameters ..\n      INTEGER            NIN\n      PARAMETER          ( NIN = 5 )\n      INTEGER            NSUBS\n      PARAMETER          ( NSUBS = 9 )\n      COMPLEX            ZERO, ONE\n      PARAMETER          ( ZERO = ( 0.0, 0.0 ), ONE = ( 1.0, 0.0 ) )\n      REAL               RZERO, RHALF, RONE\n      PARAMETER          ( RZERO = 0.0, RHALF = 0.5, RONE = 1.0 )\n      INTEGER            NMAX\n      PARAMETER          ( NMAX = 65 )\n      INTEGER            NIDMAX, NALMAX, NBEMAX\n      PARAMETER          ( NIDMAX = 9, NALMAX = 7, NBEMAX = 7 )\n*     .. Local Scalars ..\n      REAL               EPS, ERR, THRESH\n      INTEGER            I, ISNUM, J, N, NALF, NBET, NIDIM, NOUT, NTRA\n      LOGICAL            FATAL, LTESTT, REWI, SAME, SFATAL, TRACE,\n     $                   TSTERR\n      CHARACTER*1        TRANSA, TRANSB\n      CHARACTER*6        SNAMET\n      CHARACTER*32       SNAPS, SUMMRY\n*     .. Local Arrays ..\n      COMPLEX            AA( NMAX*NMAX ), AB( NMAX, 2*NMAX ),\n     $                   ALF( NALMAX ), AS( NMAX*NMAX ),\n     $                   BB( NMAX*NMAX ), BET( NBEMAX ),\n     $                   BS( NMAX*NMAX ), C( NMAX, NMAX ),\n     $                   CC( NMAX*NMAX ), CS( NMAX*NMAX ), CT( NMAX ),\n     $                   W( 2*NMAX )\n      REAL               G( NMAX )\n      INTEGER            IDIM( NIDMAX )\n      LOGICAL            LTEST( NSUBS )\n      CHARACTER*6        SNAMES( NSUBS )\n*     .. External Functions ..\n      REAL               SDIFF\n      LOGICAL            LCE\n      EXTERNAL           SDIFF, LCE\n*     .. External Subroutines ..\n      EXTERNAL           CCHK1, CCHK2, CCHK3, CCHK4, CCHK5, CCHKE, CMMCH\n*     .. Intrinsic Functions ..\n      INTRINSIC          MAX, MIN\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n      CHARACTER*6        SRNAMT\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n      COMMON             /SRNAMC/SRNAMT\n*     .. Data statements ..\n      DATA               SNAMES/'CGEMM ', 'CHEMM ', 'CSYMM ', 'CTRMM ',\n     $                   'CTRSM ', 'CHERK ', 'CSYRK ', 'CHER2K',\n     $                   'CSYR2K'/\n*     .. Executable Statements ..\n*\n*     Read name and unit number for summary output file and open file.\n*\n      READ( NIN, FMT = * )SUMMRY\n      READ( NIN, FMT = * )NOUT\n      OPEN( NOUT, FILE = SUMMRY, STATUS = 'NEW' )\n      NOUTC = NOUT\n*\n*     Read name and unit number for snapshot output file and open file.\n*\n      READ( NIN, FMT = * )SNAPS\n      READ( NIN, FMT = * )NTRA\n      TRACE = NTRA.GE.0\n      IF( TRACE )THEN\n         OPEN( NTRA, FILE = SNAPS, STATUS = 'NEW' )\n      END IF\n*     Read the flag that directs rewinding of the snapshot file.\n      READ( NIN, FMT = * )REWI\n      REWI = REWI.AND.TRACE\n*     Read the flag that directs stopping on any failure.\n      READ( NIN, FMT = * )SFATAL\n*     Read the flag that indicates whether error exits are to be tested.\n      READ( NIN, FMT = * )TSTERR\n*     Read the threshold value of the test ratio\n      READ( NIN, FMT = * )THRESH\n*\n*     Read and check the parameter values for the tests.\n*\n*     Values of N\n      READ( NIN, FMT = * )NIDIM\n      IF( NIDIM.LT.1.OR.NIDIM.GT.NIDMAX )THEN\n         WRITE( NOUT, FMT = 9997 )'N', NIDMAX\n         GO TO 220\n      END IF\n      READ( NIN, FMT = * )( IDIM( I ), I = 1, NIDIM )\n      DO 10 I = 1, NIDIM\n         IF( IDIM( I ).LT.0.OR.IDIM( I ).GT.NMAX )THEN\n            WRITE( NOUT, FMT = 9996 )NMAX\n            GO TO 220\n         END IF\n   10 CONTINUE\n*     Values of ALPHA\n      READ( NIN, FMT = * )NALF\n      IF( NALF.LT.1.OR.NALF.GT.NALMAX )THEN\n         WRITE( NOUT, FMT = 9997 )'ALPHA', NALMAX\n         GO TO 220\n      END IF\n      READ( NIN, FMT = * )( ALF( I ), I = 1, NALF )\n*     Values of BETA\n      READ( NIN, FMT = * )NBET\n      IF( NBET.LT.1.OR.NBET.GT.NBEMAX )THEN\n         WRITE( NOUT, FMT = 9997 )'BETA', NBEMAX\n         GO TO 220\n      END IF\n      READ( NIN, FMT = * )( BET( I ), I = 1, NBET )\n*\n*     Report values of parameters.\n*\n      WRITE( NOUT, FMT = 9995 )\n      WRITE( NOUT, FMT = 9994 )( IDIM( I ), I = 1, NIDIM )\n      WRITE( NOUT, FMT = 9993 )( ALF( I ), I = 1, NALF )\n      WRITE( NOUT, FMT = 9992 )( BET( I ), I = 1, NBET )\n      IF( .NOT.TSTERR )THEN\n         WRITE( NOUT, FMT = * )\n         WRITE( NOUT, FMT = 9984 )\n      END IF\n      WRITE( NOUT, FMT = * )\n      WRITE( NOUT, FMT = 9999 )THRESH\n      WRITE( NOUT, FMT = * )\n*\n*     Read names of subroutines and flags which indicate\n*     whether they are to be tested.\n*\n      DO 20 I = 1, NSUBS\n         LTEST( I ) = .FALSE.\n   20 CONTINUE\n   30 READ( NIN, FMT = 9988, END = 60 )SNAMET, LTESTT\n      DO 40 I = 1, NSUBS\n         IF( SNAMET.EQ.SNAMES( I ) )\n     $      GO TO 50\n   40 CONTINUE\n      WRITE( NOUT, FMT = 9990 )SNAMET\n      STOP\n   50 LTEST( I ) = LTESTT\n      GO TO 30\n*\n   60 CONTINUE\n      CLOSE ( NIN )\n*\n*     Compute EPS (the machine precision).\n*\n      EPS = RONE\n   70 CONTINUE\n      IF( SDIFF( RONE + EPS, RONE ).EQ.RZERO )\n     $   GO TO 80\n      EPS = RHALF*EPS\n      GO TO 70\n   80 CONTINUE\n      EPS = EPS + EPS\n      WRITE( NOUT, FMT = 9998 )EPS\n*\n*     Check the reliability of CMMCH using exact data.\n*\n      N = MIN( 32, NMAX )\n      DO 100 J = 1, N\n         DO 90 I = 1, N\n            AB( I, J ) = MAX( I - J + 1, 0 )\n   90    CONTINUE\n         AB( J, NMAX + 1 ) = J\n         AB( 1, NMAX + J ) = J\n         C( J, 1 ) = ZERO\n  100 CONTINUE\n      DO 110 J = 1, N\n         CC( J ) = J*( ( J + 1 )*J )/2 - ( ( J + 1 )*J*( J - 1 ) )/3\n  110 CONTINUE\n*     CC holds the exact result. On exit from CMMCH CT holds\n*     the result computed by CMMCH.\n      TRANSA = 'N'\n      TRANSB = 'N'\n      CALL CMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX,\n     $            AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC,\n     $            NMAX, EPS, ERR, FATAL, NOUT, .TRUE. )\n      SAME = LCE( CC, CT, N )\n      IF( .NOT.SAME.OR.ERR.NE.RZERO )THEN\n         WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR\n         STOP\n      END IF\n      TRANSB = 'C'\n      CALL CMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX,\n     $            AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC,\n     $            NMAX, EPS, ERR, FATAL, NOUT, .TRUE. )\n      SAME = LCE( CC, CT, N )\n      IF( .NOT.SAME.OR.ERR.NE.RZERO )THEN\n         WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR\n         STOP\n      END IF\n      DO 120 J = 1, N\n         AB( J, NMAX + 1 ) = N - J + 1\n         AB( 1, NMAX + J ) = N - J + 1\n  120 CONTINUE\n      DO 130 J = 1, N\n         CC( N - J + 1 ) = J*( ( J + 1 )*J )/2 -\n     $                     ( ( J + 1 )*J*( J - 1 ) )/3\n  130 CONTINUE\n      TRANSA = 'C'\n      TRANSB = 'N'\n      CALL CMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX,\n     $            AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC,\n     $            NMAX, EPS, ERR, FATAL, NOUT, .TRUE. )\n      SAME = LCE( CC, CT, N )\n      IF( .NOT.SAME.OR.ERR.NE.RZERO )THEN\n         WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR\n         STOP\n      END IF\n      TRANSB = 'C'\n      CALL CMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX,\n     $            AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC,\n     $            NMAX, EPS, ERR, FATAL, NOUT, .TRUE. )\n      SAME = LCE( CC, CT, N )\n      IF( .NOT.SAME.OR.ERR.NE.RZERO )THEN\n         WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR\n         STOP\n      END IF\n*\n*     Test each subroutine in turn.\n*\n      DO 200 ISNUM = 1, NSUBS\n         WRITE( NOUT, FMT = * )\n         IF( .NOT.LTEST( ISNUM ) )THEN\n*           Subprogram is not to be tested.\n            WRITE( NOUT, FMT = 9987 )SNAMES( ISNUM )\n         ELSE\n            SRNAMT = SNAMES( ISNUM )\n*           Test error exits.\n            IF( TSTERR )THEN\n               CALL CCHKE( ISNUM, SNAMES( ISNUM ), NOUT )\n               WRITE( NOUT, FMT = * )\n            END IF\n*           Test computations.\n            INFOT = 0\n            OK = .TRUE.\n            FATAL = .FALSE.\n            GO TO ( 140, 150, 150, 160, 160, 170, 170,\n     $              180, 180 )ISNUM\n*           Test CGEMM, 01.\n  140       CALL CCHK1( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,\n     $                  NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C,\n     $                  CC, CS, CT, G )\n            GO TO 190\n*           Test CHEMM, 02, CSYMM, 03.\n  150       CALL CCHK2( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,\n     $                  NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C,\n     $                  CC, CS, CT, G )\n            GO TO 190\n*           Test CTRMM, 04, CTRSM, 05.\n  160       CALL CCHK3( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NMAX, AB,\n     $                  AA, AS, AB( 1, NMAX + 1 ), BB, BS, CT, G, C )\n            GO TO 190\n*           Test CHERK, 06, CSYRK, 07.\n  170       CALL CCHK4( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,\n     $                  NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C,\n     $                  CC, CS, CT, G )\n            GO TO 190\n*           Test CHER2K, 08, CSYR2K, 09.\n  180       CALL CCHK5( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,\n     $                  NMAX, AB, AA, AS, BB, BS, C, CC, CS, CT, G, W )\n            GO TO 190\n*\n  190       IF( FATAL.AND.SFATAL )\n     $         GO TO 210\n         END IF\n  200 CONTINUE\n      WRITE( NOUT, FMT = 9986 )\n      GO TO 230\n*\n  210 CONTINUE\n      WRITE( NOUT, FMT = 9985 )\n      GO TO 230\n*\n  220 CONTINUE\n      WRITE( NOUT, FMT = 9991 )\n*\n  230 CONTINUE\n      IF( TRACE )\n     $   CLOSE ( NTRA )\n      CLOSE ( NOUT )\n      STOP\n*\n 9999 FORMAT( ' ROUTINES PASS COMPUTATIONAL TESTS IF TEST RATIO IS LES',\n     $      'S THAN', F8.2 )\n 9998 FORMAT( ' RELATIVE MACHINE PRECISION IS TAKEN TO BE', 1P, E9.1 )\n 9997 FORMAT( ' NUMBER OF VALUES OF ', A, ' IS LESS THAN 1 OR GREATER ',\n     $      'THAN ', I2 )\n 9996 FORMAT( ' VALUE OF N IS LESS THAN 0 OR GREATER THAN ', I2 )\n 9995 FORMAT( ' TESTS OF THE COMPLEX          LEVEL 3 BLAS', //' THE F',\n     $      'OLLOWING PARAMETER VALUES WILL BE USED:' )\n 9994 FORMAT( '   FOR N              ', 9I6 )\n 9993 FORMAT( '   FOR ALPHA          ',\n     $      7( '(', F4.1, ',', F4.1, ')  ', : ) )\n 9992 FORMAT( '   FOR BETA           ',\n     $      7( '(', F4.1, ',', F4.1, ')  ', : ) )\n 9991 FORMAT( ' AMEND DATA FILE OR INCREASE ARRAY SIZES IN PROGRAM',\n     $      /' ******* TESTS ABANDONED *******' )\n 9990 FORMAT( ' SUBPROGRAM NAME ', A6, ' NOT RECOGNIZED', /' ******* T',\n     $      'ESTS ABANDONED *******' )\n 9989 FORMAT( ' ERROR IN CMMCH -  IN-LINE DOT PRODUCTS ARE BEING EVALU',\n     $      'ATED WRONGLY.', /' CMMCH WAS CALLED WITH TRANSA = ', A1,\n     $      ' AND TRANSB = ', A1, /' AND RETURNED SAME = ', L1, ' AND ',\n     $      'ERR = ', F12.3, '.', /' THIS MAY BE DUE TO FAULTS IN THE ',\n     $      'ARITHMETIC OR THE COMPILER.', /' ******* TESTS ABANDONED ',\n     $      '*******' )\n 9988 FORMAT( A6, L2 )\n 9987 FORMAT( 1X, A6, ' WAS NOT TESTED' )\n 9986 FORMAT( /' END OF TESTS' )\n 9985 FORMAT( /' ******* FATAL ERROR - TESTS ABANDONED *******' )\n 9984 FORMAT( ' ERROR-EXITS WILL NOT BE TESTED' )\n*\n*     End of CBLAT3.\n*\n      END\n      SUBROUTINE CCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX,\n     $                  A, AA, AS, B, BB, BS, C, CC, CS, CT, G )\n*\n*  Tests CGEMM.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Parameters ..\n      COMPLEX            ZERO\n      PARAMETER          ( ZERO = ( 0.0, 0.0 ) )\n      REAL               RZERO\n      PARAMETER          ( RZERO = 0.0 )\n*     .. Scalar Arguments ..\n      REAL               EPS, THRESH\n      INTEGER            NALF, NBET, NIDIM, NMAX, NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      COMPLEX            A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),\n     $                   AS( NMAX*NMAX ), B( NMAX, NMAX ),\n     $                   BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ),\n     $                   C( NMAX, NMAX ), CC( NMAX*NMAX ),\n     $                   CS( NMAX*NMAX ), CT( NMAX )\n      REAL               G( NMAX )\n      INTEGER            IDIM( NIDIM )\n*     .. Local Scalars ..\n      COMPLEX            ALPHA, ALS, BETA, BLS\n      REAL               ERR, ERRMAX\n      INTEGER            I, IA, IB, ICA, ICB, IK, IM, IN, K, KS, LAA,\n     $                   LBB, LCC, LDA, LDAS, LDB, LDBS, LDC, LDCS, M,\n     $                   MA, MB, MS, N, NA, NARGS, NB, NC, NS\n      LOGICAL            NULL, RESET, SAME, TRANA, TRANB\n      CHARACTER*1        TRANAS, TRANBS, TRANSA, TRANSB\n      CHARACTER*3        ICH\n*     .. Local Arrays ..\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LCE, LCERES\n      EXTERNAL           LCE, LCERES\n*     .. External Subroutines ..\n      EXTERNAL           CGEMM, CMAKE, CMMCH\n*     .. Intrinsic Functions ..\n      INTRINSIC          MAX\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Data statements ..\n      DATA               ICH/'NTC'/\n*     .. Executable Statements ..\n*\n      NARGS = 13\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = RZERO\n*\n      DO 110 IM = 1, NIDIM\n         M = IDIM( IM )\n*\n         DO 100 IN = 1, NIDIM\n            N = IDIM( IN )\n*           Set LDC to 1 more than minimum value if room.\n            LDC = M\n            IF( LDC.LT.NMAX )\n     $         LDC = LDC + 1\n*           Skip tests if not enough room.\n            IF( LDC.GT.NMAX )\n     $         GO TO 100\n            LCC = LDC*N\n            NULL = N.LE.0.OR.M.LE.0\n*\n            DO 90 IK = 1, NIDIM\n               K = IDIM( IK )\n*\n               DO 80 ICA = 1, 3\n                  TRANSA = ICH( ICA: ICA )\n                  TRANA = TRANSA.EQ.'T'.OR.TRANSA.EQ.'C'\n*\n                  IF( TRANA )THEN\n                     MA = K\n                     NA = M\n                  ELSE\n                     MA = M\n                     NA = K\n                  END IF\n*                 Set LDA to 1 more than minimum value if room.\n                  LDA = MA\n                  IF( LDA.LT.NMAX )\n     $               LDA = LDA + 1\n*                 Skip tests if not enough room.\n                  IF( LDA.GT.NMAX )\n     $               GO TO 80\n                  LAA = LDA*NA\n*\n*                 Generate the matrix A.\n*\n                  CALL CMAKE( 'GE', ' ', ' ', MA, NA, A, NMAX, AA, LDA,\n     $                        RESET, ZERO )\n*\n                  DO 70 ICB = 1, 3\n                     TRANSB = ICH( ICB: ICB )\n                     TRANB = TRANSB.EQ.'T'.OR.TRANSB.EQ.'C'\n*\n                     IF( TRANB )THEN\n                        MB = N\n                        NB = K\n                     ELSE\n                        MB = K\n                        NB = N\n                     END IF\n*                    Set LDB to 1 more than minimum value if room.\n                     LDB = MB\n                     IF( LDB.LT.NMAX )\n     $                  LDB = LDB + 1\n*                    Skip tests if not enough room.\n                     IF( LDB.GT.NMAX )\n     $                  GO TO 70\n                     LBB = LDB*NB\n*\n*                    Generate the matrix B.\n*\n                     CALL CMAKE( 'GE', ' ', ' ', MB, NB, B, NMAX, BB,\n     $                           LDB, RESET, ZERO )\n*\n                     DO 60 IA = 1, NALF\n                        ALPHA = ALF( IA )\n*\n                        DO 50 IB = 1, NBET\n                           BETA = BET( IB )\n*\n*                          Generate the matrix C.\n*\n                           CALL CMAKE( 'GE', ' ', ' ', M, N, C, NMAX,\n     $                                 CC, LDC, RESET, ZERO )\n*\n                           NC = NC + 1\n*\n*                          Save every datum before calling the\n*                          subroutine.\n*\n                           TRANAS = TRANSA\n                           TRANBS = TRANSB\n                           MS = M\n                           NS = N\n                           KS = K\n                           ALS = ALPHA\n                           DO 10 I = 1, LAA\n                              AS( I ) = AA( I )\n   10                      CONTINUE\n                           LDAS = LDA\n                           DO 20 I = 1, LBB\n                              BS( I ) = BB( I )\n   20                      CONTINUE\n                           LDBS = LDB\n                           BLS = BETA\n                           DO 30 I = 1, LCC\n                              CS( I ) = CC( I )\n   30                      CONTINUE\n                           LDCS = LDC\n*\n*                          Call the subroutine.\n*\n                           IF( TRACE )\n     $                        WRITE( NTRA, FMT = 9995 )NC, SNAME,\n     $                        TRANSA, TRANSB, M, N, K, ALPHA, LDA, LDB,\n     $                        BETA, LDC\n                           IF( REWI )\n     $                        REWIND NTRA\n                           CALL CGEMM( TRANSA, TRANSB, M, N, K, ALPHA,\n     $                                 AA, LDA, BB, LDB, BETA, CC, LDC )\n*\n*                          Check if error-exit was taken incorrectly.\n*\n                           IF( .NOT.OK )THEN\n                              WRITE( NOUT, FMT = 9994 )\n                              FATAL = .TRUE.\n                              GO TO 120\n                           END IF\n*\n*                          See what data changed inside subroutines.\n*\n                           ISAME( 1 ) = TRANSA.EQ.TRANAS\n                           ISAME( 2 ) = TRANSB.EQ.TRANBS\n                           ISAME( 3 ) = MS.EQ.M\n                           ISAME( 4 ) = NS.EQ.N\n                           ISAME( 5 ) = KS.EQ.K\n                           ISAME( 6 ) = ALS.EQ.ALPHA\n                           ISAME( 7 ) = LCE( AS, AA, LAA )\n                           ISAME( 8 ) = LDAS.EQ.LDA\n                           ISAME( 9 ) = LCE( BS, BB, LBB )\n                           ISAME( 10 ) = LDBS.EQ.LDB\n                           ISAME( 11 ) = BLS.EQ.BETA\n                           IF( NULL )THEN\n                              ISAME( 12 ) = LCE( CS, CC, LCC )\n                           ELSE\n                              ISAME( 12 ) = LCERES( 'GE', ' ', M, N, CS,\n     $                                      CC, LDC )\n                           END IF\n                           ISAME( 13 ) = LDCS.EQ.LDC\n*\n*                          If data was incorrectly changed, report\n*                          and return.\n*\n                           SAME = .TRUE.\n                           DO 40 I = 1, NARGS\n                              SAME = SAME.AND.ISAME( I )\n                              IF( .NOT.ISAME( I ) )\n     $                           WRITE( NOUT, FMT = 9998 )I\n   40                      CONTINUE\n                           IF( .NOT.SAME )THEN\n                              FATAL = .TRUE.\n                              GO TO 120\n                           END IF\n*\n                           IF( .NOT.NULL )THEN\n*\n*                             Check the result.\n*\n                              CALL CMMCH( TRANSA, TRANSB, M, N, K,\n     $                                    ALPHA, A, NMAX, B, NMAX, BETA,\n     $                                    C, NMAX, CT, G, CC, LDC, EPS,\n     $                                    ERR, FATAL, NOUT, .TRUE. )\n                              ERRMAX = MAX( ERRMAX, ERR )\n*                             If got really bad answer, report and\n*                             return.\n                              IF( FATAL )\n     $                           GO TO 120\n                           END IF\n*\n   50                   CONTINUE\n*\n   60                CONTINUE\n*\n   70             CONTINUE\n*\n   80          CONTINUE\n*\n   90       CONTINUE\n*\n  100    CONTINUE\n*\n  110 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 130\n*\n  120 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      WRITE( NOUT, FMT = 9995 )NC, SNAME, TRANSA, TRANSB, M, N, K,\n     $   ALPHA, LDA, LDB, BETA, LDC\n*\n  130 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',''', A1, ''',',\n     $      3( I3, ',' ), '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3,\n     $      ',(', F4.1, ',', F4.1, '), C,', I3, ').' )\n 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of CCHK1.\n*\n      END\n      SUBROUTINE CCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX,\n     $                  A, AA, AS, B, BB, BS, C, CC, CS, CT, G )\n*\n*  Tests CHEMM and CSYMM.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Parameters ..\n      COMPLEX            ZERO\n      PARAMETER          ( ZERO = ( 0.0, 0.0 ) )\n      REAL               RZERO\n      PARAMETER          ( RZERO = 0.0 )\n*     .. Scalar Arguments ..\n      REAL               EPS, THRESH\n      INTEGER            NALF, NBET, NIDIM, NMAX, NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      COMPLEX            A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),\n     $                   AS( NMAX*NMAX ), B( NMAX, NMAX ),\n     $                   BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ),\n     $                   C( NMAX, NMAX ), CC( NMAX*NMAX ),\n     $                   CS( NMAX*NMAX ), CT( NMAX )\n      REAL               G( NMAX )\n      INTEGER            IDIM( NIDIM )\n*     .. Local Scalars ..\n      COMPLEX            ALPHA, ALS, BETA, BLS\n      REAL               ERR, ERRMAX\n      INTEGER            I, IA, IB, ICS, ICU, IM, IN, LAA, LBB, LCC,\n     $                   LDA, LDAS, LDB, LDBS, LDC, LDCS, M, MS, N, NA,\n     $                   NARGS, NC, NS\n      LOGICAL            CONJ, LEFT, NULL, RESET, SAME\n      CHARACTER*1        SIDE, SIDES, UPLO, UPLOS\n      CHARACTER*2        ICHS, ICHU\n*     .. Local Arrays ..\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LCE, LCERES\n      EXTERNAL           LCE, LCERES\n*     .. External Subroutines ..\n      EXTERNAL           CHEMM, CMAKE, CMMCH, CSYMM\n*     .. Intrinsic Functions ..\n      INTRINSIC          MAX\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Data statements ..\n      DATA               ICHS/'LR'/, ICHU/'UL'/\n*     .. Executable Statements ..\n      CONJ = SNAME( 2: 3 ).EQ.'HE'\n*\n      NARGS = 12\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = RZERO\n*\n      DO 100 IM = 1, NIDIM\n         M = IDIM( IM )\n*\n         DO 90 IN = 1, NIDIM\n            N = IDIM( IN )\n*           Set LDC to 1 more than minimum value if room.\n            LDC = M\n            IF( LDC.LT.NMAX )\n     $         LDC = LDC + 1\n*           Skip tests if not enough room.\n            IF( LDC.GT.NMAX )\n     $         GO TO 90\n            LCC = LDC*N\n            NULL = N.LE.0.OR.M.LE.0\n*           Set LDB to 1 more than minimum value if room.\n            LDB = M\n            IF( LDB.LT.NMAX )\n     $         LDB = LDB + 1\n*           Skip tests if not enough room.\n            IF( LDB.GT.NMAX )\n     $         GO TO 90\n            LBB = LDB*N\n*\n*           Generate the matrix B.\n*\n            CALL CMAKE( 'GE', ' ', ' ', M, N, B, NMAX, BB, LDB, RESET,\n     $                  ZERO )\n*\n            DO 80 ICS = 1, 2\n               SIDE = ICHS( ICS: ICS )\n               LEFT = SIDE.EQ.'L'\n*\n               IF( LEFT )THEN\n                  NA = M\n               ELSE\n                  NA = N\n               END IF\n*              Set LDA to 1 more than minimum value if room.\n               LDA = NA\n               IF( LDA.LT.NMAX )\n     $            LDA = LDA + 1\n*              Skip tests if not enough room.\n               IF( LDA.GT.NMAX )\n     $            GO TO 80\n               LAA = LDA*NA\n*\n               DO 70 ICU = 1, 2\n                  UPLO = ICHU( ICU: ICU )\n*\n*                 Generate the hermitian or symmetric matrix A.\n*\n                  CALL CMAKE( SNAME( 2: 3 ), UPLO, ' ', NA, NA, A, NMAX,\n     $                        AA, LDA, RESET, ZERO )\n*\n                  DO 60 IA = 1, NALF\n                     ALPHA = ALF( IA )\n*\n                     DO 50 IB = 1, NBET\n                        BETA = BET( IB )\n*\n*                       Generate the matrix C.\n*\n                        CALL CMAKE( 'GE', ' ', ' ', M, N, C, NMAX, CC,\n     $                              LDC, RESET, ZERO )\n*\n                        NC = NC + 1\n*\n*                       Save every datum before calling the\n*                       subroutine.\n*\n                        SIDES = SIDE\n                        UPLOS = UPLO\n                        MS = M\n                        NS = N\n                        ALS = ALPHA\n                        DO 10 I = 1, LAA\n                           AS( I ) = AA( I )\n   10                   CONTINUE\n                        LDAS = LDA\n                        DO 20 I = 1, LBB\n                           BS( I ) = BB( I )\n   20                   CONTINUE\n                        LDBS = LDB\n                        BLS = BETA\n                        DO 30 I = 1, LCC\n                           CS( I ) = CC( I )\n   30                   CONTINUE\n                        LDCS = LDC\n*\n*                       Call the subroutine.\n*\n                        IF( TRACE )\n     $                     WRITE( NTRA, FMT = 9995 )NC, SNAME, SIDE,\n     $                     UPLO, M, N, ALPHA, LDA, LDB, BETA, LDC\n                        IF( REWI )\n     $                     REWIND NTRA\n                        IF( CONJ )THEN\n                           CALL CHEMM( SIDE, UPLO, M, N, ALPHA, AA, LDA,\n     $                                 BB, LDB, BETA, CC, LDC )\n                        ELSE\n                           CALL CSYMM( SIDE, UPLO, M, N, ALPHA, AA, LDA,\n     $                                 BB, LDB, BETA, CC, LDC )\n                        END IF\n*\n*                       Check if error-exit was taken incorrectly.\n*\n                        IF( .NOT.OK )THEN\n                           WRITE( NOUT, FMT = 9994 )\n                           FATAL = .TRUE.\n                           GO TO 110\n                        END IF\n*\n*                       See what data changed inside subroutines.\n*\n                        ISAME( 1 ) = SIDES.EQ.SIDE\n                        ISAME( 2 ) = UPLOS.EQ.UPLO\n                        ISAME( 3 ) = MS.EQ.M\n                        ISAME( 4 ) = NS.EQ.N\n                        ISAME( 5 ) = ALS.EQ.ALPHA\n                        ISAME( 6 ) = LCE( AS, AA, LAA )\n                        ISAME( 7 ) = LDAS.EQ.LDA\n                        ISAME( 8 ) = LCE( BS, BB, LBB )\n                        ISAME( 9 ) = LDBS.EQ.LDB\n                        ISAME( 10 ) = BLS.EQ.BETA\n                        IF( NULL )THEN\n                           ISAME( 11 ) = LCE( CS, CC, LCC )\n                        ELSE\n                           ISAME( 11 ) = LCERES( 'GE', ' ', M, N, CS,\n     $                                   CC, LDC )\n                        END IF\n                        ISAME( 12 ) = LDCS.EQ.LDC\n*\n*                       If data was incorrectly changed, report and\n*                       return.\n*\n                        SAME = .TRUE.\n                        DO 40 I = 1, NARGS\n                           SAME = SAME.AND.ISAME( I )\n                           IF( .NOT.ISAME( I ) )\n     $                        WRITE( NOUT, FMT = 9998 )I\n   40                   CONTINUE\n                        IF( .NOT.SAME )THEN\n                           FATAL = .TRUE.\n                           GO TO 110\n                        END IF\n*\n                        IF( .NOT.NULL )THEN\n*\n*                          Check the result.\n*\n                           IF( LEFT )THEN\n                              CALL CMMCH( 'N', 'N', M, N, M, ALPHA, A,\n     $                                    NMAX, B, NMAX, BETA, C, NMAX,\n     $                                    CT, G, CC, LDC, EPS, ERR,\n     $                                    FATAL, NOUT, .TRUE. )\n                           ELSE\n                              CALL CMMCH( 'N', 'N', M, N, N, ALPHA, B,\n     $                                    NMAX, A, NMAX, BETA, C, NMAX,\n     $                                    CT, G, CC, LDC, EPS, ERR,\n     $                                    FATAL, NOUT, .TRUE. )\n                           END IF\n                           ERRMAX = MAX( ERRMAX, ERR )\n*                          If got really bad answer, report and\n*                          return.\n                           IF( FATAL )\n     $                        GO TO 110\n                        END IF\n*\n   50                CONTINUE\n*\n   60             CONTINUE\n*\n   70          CONTINUE\n*\n   80       CONTINUE\n*\n   90    CONTINUE\n*\n  100 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 120\n*\n  110 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      WRITE( NOUT, FMT = 9995 )NC, SNAME, SIDE, UPLO, M, N, ALPHA, LDA,\n     $   LDB, BETA, LDC\n*\n  120 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ),\n     $      '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ',(', F4.1,\n     $      ',', F4.1, '), C,', I3, ')    .' )\n 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of CCHK2.\n*\n      END\n      SUBROUTINE CCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NALF, ALF, NMAX, A, AA, AS,\n     $                  B, BB, BS, CT, G, C )\n*\n*  Tests CTRMM and CTRSM.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Parameters ..\n      COMPLEX            ZERO, ONE\n      PARAMETER          ( ZERO = ( 0.0, 0.0 ), ONE = ( 1.0, 0.0 ) )\n      REAL               RZERO\n      PARAMETER          ( RZERO = 0.0 )\n*     .. Scalar Arguments ..\n      REAL               EPS, THRESH\n      INTEGER            NALF, NIDIM, NMAX, NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      COMPLEX            A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),\n     $                   AS( NMAX*NMAX ), B( NMAX, NMAX ),\n     $                   BB( NMAX*NMAX ), BS( NMAX*NMAX ),\n     $                   C( NMAX, NMAX ), CT( NMAX )\n      REAL               G( NMAX )\n      INTEGER            IDIM( NIDIM )\n*     .. Local Scalars ..\n      COMPLEX            ALPHA, ALS\n      REAL               ERR, ERRMAX\n      INTEGER            I, IA, ICD, ICS, ICT, ICU, IM, IN, J, LAA, LBB,\n     $                   LDA, LDAS, LDB, LDBS, M, MS, N, NA, NARGS, NC,\n     $                   NS\n      LOGICAL            LEFT, NULL, RESET, SAME\n      CHARACTER*1        DIAG, DIAGS, SIDE, SIDES, TRANAS, TRANSA, UPLO,\n     $                   UPLOS\n      CHARACTER*2        ICHD, ICHS, ICHU\n      CHARACTER*3        ICHT\n*     .. Local Arrays ..\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LCE, LCERES\n      EXTERNAL           LCE, LCERES\n*     .. External Subroutines ..\n      EXTERNAL           CMAKE, CMMCH, CTRMM, CTRSM\n*     .. Intrinsic Functions ..\n      INTRINSIC          MAX\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Data statements ..\n      DATA               ICHU/'UL'/, ICHT/'NTC'/, ICHD/'UN'/, ICHS/'LR'/\n*     .. Executable Statements ..\n*\n      NARGS = 11\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = RZERO\n*     Set up zero matrix for CMMCH.\n      DO 20 J = 1, NMAX\n         DO 10 I = 1, NMAX\n            C( I, J ) = ZERO\n   10    CONTINUE\n   20 CONTINUE\n*\n      DO 140 IM = 1, NIDIM\n         M = IDIM( IM )\n*\n         DO 130 IN = 1, NIDIM\n            N = IDIM( IN )\n*           Set LDB to 1 more than minimum value if room.\n            LDB = M\n            IF( LDB.LT.NMAX )\n     $         LDB = LDB + 1\n*           Skip tests if not enough room.\n            IF( LDB.GT.NMAX )\n     $         GO TO 130\n            LBB = LDB*N\n            NULL = M.LE.0.OR.N.LE.0\n*\n            DO 120 ICS = 1, 2\n               SIDE = ICHS( ICS: ICS )\n               LEFT = SIDE.EQ.'L'\n               IF( LEFT )THEN\n                  NA = M\n               ELSE\n                  NA = N\n               END IF\n*              Set LDA to 1 more than minimum value if room.\n               LDA = NA\n               IF( LDA.LT.NMAX )\n     $            LDA = LDA + 1\n*              Skip tests if not enough room.\n               IF( LDA.GT.NMAX )\n     $            GO TO 130\n               LAA = LDA*NA\n*\n               DO 110 ICU = 1, 2\n                  UPLO = ICHU( ICU: ICU )\n*\n                  DO 100 ICT = 1, 3\n                     TRANSA = ICHT( ICT: ICT )\n*\n                     DO 90 ICD = 1, 2\n                        DIAG = ICHD( ICD: ICD )\n*\n                        DO 80 IA = 1, NALF\n                           ALPHA = ALF( IA )\n*\n*                          Generate the matrix A.\n*\n                           CALL CMAKE( 'TR', UPLO, DIAG, NA, NA, A,\n     $                                 NMAX, AA, LDA, RESET, ZERO )\n*\n*                          Generate the matrix B.\n*\n                           CALL CMAKE( 'GE', ' ', ' ', M, N, B, NMAX,\n     $                                 BB, LDB, RESET, ZERO )\n*\n                           NC = NC + 1\n*\n*                          Save every datum before calling the\n*                          subroutine.\n*\n                           SIDES = SIDE\n                           UPLOS = UPLO\n                           TRANAS = TRANSA\n                           DIAGS = DIAG\n                           MS = M\n                           NS = N\n                           ALS = ALPHA\n                           DO 30 I = 1, LAA\n                              AS( I ) = AA( I )\n   30                      CONTINUE\n                           LDAS = LDA\n                           DO 40 I = 1, LBB\n                              BS( I ) = BB( I )\n   40                      CONTINUE\n                           LDBS = LDB\n*\n*                          Call the subroutine.\n*\n                           IF( SNAME( 4: 5 ).EQ.'MM' )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9995 )NC, SNAME,\n     $                           SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA,\n     $                           LDA, LDB\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL CTRMM( SIDE, UPLO, TRANSA, DIAG, M,\n     $                                    N, ALPHA, AA, LDA, BB, LDB )\n                           ELSE IF( SNAME( 4: 5 ).EQ.'SM' )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9995 )NC, SNAME,\n     $                           SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA,\n     $                           LDA, LDB\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL CTRSM( SIDE, UPLO, TRANSA, DIAG, M,\n     $                                    N, ALPHA, AA, LDA, BB, LDB )\n                           END IF\n*\n*                          Check if error-exit was taken incorrectly.\n*\n                           IF( .NOT.OK )THEN\n                              WRITE( NOUT, FMT = 9994 )\n                              FATAL = .TRUE.\n                              GO TO 150\n                           END IF\n*\n*                          See what data changed inside subroutines.\n*\n                           ISAME( 1 ) = SIDES.EQ.SIDE\n                           ISAME( 2 ) = UPLOS.EQ.UPLO\n                           ISAME( 3 ) = TRANAS.EQ.TRANSA\n                           ISAME( 4 ) = DIAGS.EQ.DIAG\n                           ISAME( 5 ) = MS.EQ.M\n                           ISAME( 6 ) = NS.EQ.N\n                           ISAME( 7 ) = ALS.EQ.ALPHA\n                           ISAME( 8 ) = LCE( AS, AA, LAA )\n                           ISAME( 9 ) = LDAS.EQ.LDA\n                           IF( NULL )THEN\n                              ISAME( 10 ) = LCE( BS, BB, LBB )\n                           ELSE\n                              ISAME( 10 ) = LCERES( 'GE', ' ', M, N, BS,\n     $                                      BB, LDB )\n                           END IF\n                           ISAME( 11 ) = LDBS.EQ.LDB\n*\n*                          If data was incorrectly changed, report and\n*                          return.\n*\n                           SAME = .TRUE.\n                           DO 50 I = 1, NARGS\n                              SAME = SAME.AND.ISAME( I )\n                              IF( .NOT.ISAME( I ) )\n     $                           WRITE( NOUT, FMT = 9998 )I\n   50                      CONTINUE\n                           IF( .NOT.SAME )THEN\n                              FATAL = .TRUE.\n                              GO TO 150\n                           END IF\n*\n                           IF( .NOT.NULL )THEN\n                              IF( SNAME( 4: 5 ).EQ.'MM' )THEN\n*\n*                                Check the result.\n*\n                                 IF( LEFT )THEN\n                                    CALL CMMCH( TRANSA, 'N', M, N, M,\n     $                                          ALPHA, A, NMAX, B, NMAX,\n     $                                          ZERO, C, NMAX, CT, G,\n     $                                          BB, LDB, EPS, ERR,\n     $                                          FATAL, NOUT, .TRUE. )\n                                 ELSE\n                                    CALL CMMCH( 'N', TRANSA, M, N, N,\n     $                                          ALPHA, B, NMAX, A, NMAX,\n     $                                          ZERO, C, NMAX, CT, G,\n     $                                          BB, LDB, EPS, ERR,\n     $                                          FATAL, NOUT, .TRUE. )\n                                 END IF\n                              ELSE IF( SNAME( 4: 5 ).EQ.'SM' )THEN\n*\n*                                Compute approximation to original\n*                                matrix.\n*\n                                 DO 70 J = 1, N\n                                    DO 60 I = 1, M\n                                       C( I, J ) = BB( I + ( J - 1 )*\n     $                                             LDB )\n                                       BB( I + ( J - 1 )*LDB ) = ALPHA*\n     $                                    B( I, J )\n   60                               CONTINUE\n   70                            CONTINUE\n*\n                                 IF( LEFT )THEN\n                                    CALL CMMCH( TRANSA, 'N', M, N, M,\n     $                                          ONE, A, NMAX, C, NMAX,\n     $                                          ZERO, B, NMAX, CT, G,\n     $                                          BB, LDB, EPS, ERR,\n     $                                          FATAL, NOUT, .FALSE. )\n                                 ELSE\n                                    CALL CMMCH( 'N', TRANSA, M, N, N,\n     $                                          ONE, C, NMAX, A, NMAX,\n     $                                          ZERO, B, NMAX, CT, G,\n     $                                          BB, LDB, EPS, ERR,\n     $                                          FATAL, NOUT, .FALSE. )\n                                 END IF\n                              END IF\n                              ERRMAX = MAX( ERRMAX, ERR )\n*                             If got really bad answer, report and\n*                             return.\n                              IF( FATAL )\n     $                           GO TO 150\n                           END IF\n*\n   80                   CONTINUE\n*\n   90                CONTINUE\n*\n  100             CONTINUE\n*\n  110          CONTINUE\n*\n  120       CONTINUE\n*\n  130    CONTINUE\n*\n  140 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 160\n*\n  150 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      WRITE( NOUT, FMT = 9995 )NC, SNAME, SIDE, UPLO, TRANSA, DIAG, M,\n     $   N, ALPHA, LDA, LDB\n*\n  160 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( 1X, I6, ': ', A6, '(', 4( '''', A1, ''',' ), 2( I3, ',' ),\n     $      '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ')         ',\n     $      '      .' )\n 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of CCHK3.\n*\n      END\n      SUBROUTINE CCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX,\n     $                  A, AA, AS, B, BB, BS, C, CC, CS, CT, G )\n*\n*  Tests CHERK and CSYRK.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Parameters ..\n      COMPLEX            ZERO\n      PARAMETER          ( ZERO = ( 0.0, 0.0 ) )\n      REAL               RONE, RZERO\n      PARAMETER          ( RONE = 1.0, RZERO = 0.0 )\n*     .. Scalar Arguments ..\n      REAL               EPS, THRESH\n      INTEGER            NALF, NBET, NIDIM, NMAX, NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      COMPLEX            A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),\n     $                   AS( NMAX*NMAX ), B( NMAX, NMAX ),\n     $                   BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ),\n     $                   C( NMAX, NMAX ), CC( NMAX*NMAX ),\n     $                   CS( NMAX*NMAX ), CT( NMAX )\n      REAL               G( NMAX )\n      INTEGER            IDIM( NIDIM )\n*     .. Local Scalars ..\n      COMPLEX            ALPHA, ALS, BETA, BETS\n      REAL               ERR, ERRMAX, RALPHA, RALS, RBETA, RBETS\n      INTEGER            I, IA, IB, ICT, ICU, IK, IN, J, JC, JJ, K, KS,\n     $                   LAA, LCC, LDA, LDAS, LDC, LDCS, LJ, MA, N, NA,\n     $                   NARGS, NC, NS\n      LOGICAL            CONJ, NULL, RESET, SAME, TRAN, UPPER\n      CHARACTER*1        TRANS, TRANSS, TRANST, UPLO, UPLOS\n      CHARACTER*2        ICHT, ICHU\n*     .. Local Arrays ..\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LCE, LCERES\n      EXTERNAL           LCE, LCERES\n*     .. External Subroutines ..\n      EXTERNAL           CHERK, CMAKE, CMMCH, CSYRK\n*     .. Intrinsic Functions ..\n      INTRINSIC          CMPLX, MAX, REAL\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Data statements ..\n      DATA               ICHT/'NC'/, ICHU/'UL'/\n*     .. Executable Statements ..\n      CONJ = SNAME( 2: 3 ).EQ.'HE'\n*\n      NARGS = 10\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = RZERO\n*\n      DO 100 IN = 1, NIDIM\n         N = IDIM( IN )\n*        Set LDC to 1 more than minimum value if room.\n         LDC = N\n         IF( LDC.LT.NMAX )\n     $      LDC = LDC + 1\n*        Skip tests if not enough room.\n         IF( LDC.GT.NMAX )\n     $      GO TO 100\n         LCC = LDC*N\n*\n         DO 90 IK = 1, NIDIM\n            K = IDIM( IK )\n*\n            DO 80 ICT = 1, 2\n               TRANS = ICHT( ICT: ICT )\n               TRAN = TRANS.EQ.'C'\n               IF( TRAN.AND..NOT.CONJ )\n     $            TRANS = 'T'\n               IF( TRAN )THEN\n                  MA = K\n                  NA = N\n               ELSE\n                  MA = N\n                  NA = K\n               END IF\n*              Set LDA to 1 more than minimum value if room.\n               LDA = MA\n               IF( LDA.LT.NMAX )\n     $            LDA = LDA + 1\n*              Skip tests if not enough room.\n               IF( LDA.GT.NMAX )\n     $            GO TO 80\n               LAA = LDA*NA\n*\n*              Generate the matrix A.\n*\n               CALL CMAKE( 'GE', ' ', ' ', MA, NA, A, NMAX, AA, LDA,\n     $                     RESET, ZERO )\n*\n               DO 70 ICU = 1, 2\n                  UPLO = ICHU( ICU: ICU )\n                  UPPER = UPLO.EQ.'U'\n*\n                  DO 60 IA = 1, NALF\n                     ALPHA = ALF( IA )\n                     IF( CONJ )THEN\n                        RALPHA = REAL( ALPHA )\n                        ALPHA = CMPLX( RALPHA, RZERO )\n                     END IF\n*\n                     DO 50 IB = 1, NBET\n                        BETA = BET( IB )\n                        IF( CONJ )THEN\n                           RBETA = REAL( BETA )\n                           BETA = CMPLX( RBETA, RZERO )\n                        END IF\n                        NULL = N.LE.0\n                        IF( CONJ )\n     $                     NULL = NULL.OR.( ( K.LE.0.OR.RALPHA.EQ.\n     $                            RZERO ).AND.RBETA.EQ.RONE )\n*\n*                       Generate the matrix C.\n*\n                        CALL CMAKE( SNAME( 2: 3 ), UPLO, ' ', N, N, C,\n     $                              NMAX, CC, LDC, RESET, ZERO )\n*\n                        NC = NC + 1\n*\n*                       Save every datum before calling the subroutine.\n*\n                        UPLOS = UPLO\n                        TRANSS = TRANS\n                        NS = N\n                        KS = K\n                        IF( CONJ )THEN\n                           RALS = RALPHA\n                        ELSE\n                           ALS = ALPHA\n                        END IF\n                        DO 10 I = 1, LAA\n                           AS( I ) = AA( I )\n   10                   CONTINUE\n                        LDAS = LDA\n                        IF( CONJ )THEN\n                           RBETS = RBETA\n                        ELSE\n                           BETS = BETA\n                        END IF\n                        DO 20 I = 1, LCC\n                           CS( I ) = CC( I )\n   20                   CONTINUE\n                        LDCS = LDC\n*\n*                       Call the subroutine.\n*\n                        IF( CONJ )THEN\n                           IF( TRACE )\n     $                        WRITE( NTRA, FMT = 9994 )NC, SNAME, UPLO,\n     $                        TRANS, N, K, RALPHA, LDA, RBETA, LDC\n                           IF( REWI )\n     $                        REWIND NTRA\n                           CALL CHERK( UPLO, TRANS, N, K, RALPHA, AA,\n     $                                 LDA, RBETA, CC, LDC )\n                        ELSE\n                           IF( TRACE )\n     $                        WRITE( NTRA, FMT = 9993 )NC, SNAME, UPLO,\n     $                        TRANS, N, K, ALPHA, LDA, BETA, LDC\n                           IF( REWI )\n     $                        REWIND NTRA\n                           CALL CSYRK( UPLO, TRANS, N, K, ALPHA, AA,\n     $                                 LDA, BETA, CC, LDC )\n                        END IF\n*\n*                       Check if error-exit was taken incorrectly.\n*\n                        IF( .NOT.OK )THEN\n                           WRITE( NOUT, FMT = 9992 )\n                           FATAL = .TRUE.\n                           GO TO 120\n                        END IF\n*\n*                       See what data changed inside subroutines.\n*\n                        ISAME( 1 ) = UPLOS.EQ.UPLO\n                        ISAME( 2 ) = TRANSS.EQ.TRANS\n                        ISAME( 3 ) = NS.EQ.N\n                        ISAME( 4 ) = KS.EQ.K\n                        IF( CONJ )THEN\n                           ISAME( 5 ) = RALS.EQ.RALPHA\n                        ELSE\n                           ISAME( 5 ) = ALS.EQ.ALPHA\n                        END IF\n                        ISAME( 6 ) = LCE( AS, AA, LAA )\n                        ISAME( 7 ) = LDAS.EQ.LDA\n                        IF( CONJ )THEN\n                           ISAME( 8 ) = RBETS.EQ.RBETA\n                        ELSE\n                           ISAME( 8 ) = BETS.EQ.BETA\n                        END IF\n                        IF( NULL )THEN\n                           ISAME( 9 ) = LCE( CS, CC, LCC )\n                        ELSE\n                           ISAME( 9 ) = LCERES( SNAME( 2: 3 ), UPLO, N,\n     $                                  N, CS, CC, LDC )\n                        END IF\n                        ISAME( 10 ) = LDCS.EQ.LDC\n*\n*                       If data was incorrectly changed, report and\n*                       return.\n*\n                        SAME = .TRUE.\n                        DO 30 I = 1, NARGS\n                           SAME = SAME.AND.ISAME( I )\n                           IF( .NOT.ISAME( I ) )\n     $                        WRITE( NOUT, FMT = 9998 )I\n   30                   CONTINUE\n                        IF( .NOT.SAME )THEN\n                           FATAL = .TRUE.\n                           GO TO 120\n                        END IF\n*\n                        IF( .NOT.NULL )THEN\n*\n*                          Check the result column by column.\n*\n                           IF( CONJ )THEN\n                              TRANST = 'C'\n                           ELSE\n                              TRANST = 'T'\n                           END IF\n                           JC = 1\n                           DO 40 J = 1, N\n                              IF( UPPER )THEN\n                                 JJ = 1\n                                 LJ = J\n                              ELSE\n                                 JJ = J\n                                 LJ = N - J + 1\n                              END IF\n                              IF( TRAN )THEN\n                                 CALL CMMCH( TRANST, 'N', LJ, 1, K,\n     $                                       ALPHA, A( 1, JJ ), NMAX,\n     $                                       A( 1, J ), NMAX, BETA,\n     $                                       C( JJ, J ), NMAX, CT, G,\n     $                                       CC( JC ), LDC, EPS, ERR,\n     $                                       FATAL, NOUT, .TRUE. )\n                              ELSE\n                                 CALL CMMCH( 'N', TRANST, LJ, 1, K,\n     $                                       ALPHA, A( JJ, 1 ), NMAX,\n     $                                       A( J, 1 ), NMAX, BETA,\n     $                                       C( JJ, J ), NMAX, CT, G,\n     $                                       CC( JC ), LDC, EPS, ERR,\n     $                                       FATAL, NOUT, .TRUE. )\n                              END IF\n                              IF( UPPER )THEN\n                                 JC = JC + LDC\n                              ELSE\n                                 JC = JC + LDC + 1\n                              END IF\n                              ERRMAX = MAX( ERRMAX, ERR )\n*                             If got really bad answer, report and\n*                             return.\n                              IF( FATAL )\n     $                           GO TO 110\n   40                      CONTINUE\n                        END IF\n*\n   50                CONTINUE\n*\n   60             CONTINUE\n*\n   70          CONTINUE\n*\n   80       CONTINUE\n*\n   90    CONTINUE\n*\n  100 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 130\n*\n  110 CONTINUE\n      IF( N.GT.1 )\n     $   WRITE( NOUT, FMT = 9995 )J\n*\n  120 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      IF( CONJ )THEN\n         WRITE( NOUT, FMT = 9994 )NC, SNAME, UPLO, TRANS, N, K, RALPHA,\n     $      LDA, RBETA, LDC\n      ELSE\n         WRITE( NOUT, FMT = 9993 )NC, SNAME, UPLO, TRANS, N, K, ALPHA,\n     $      LDA, BETA, LDC\n      END IF\n*\n  130 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( '      THESE ARE THE RESULTS FOR COLUMN ', I3 )\n 9994 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ),\n     $      F4.1, ', A,', I3, ',', F4.1, ', C,', I3, ')               ',\n     $      '          .' )\n 9993 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ),\n     $      '(', F4.1, ',', F4.1, ') , A,', I3, ',(', F4.1, ',', F4.1,\n     $      '), C,', I3, ')          .' )\n 9992 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of CCHK4.\n*\n      END\n      SUBROUTINE CCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX,\n     $                  AB, AA, AS, BB, BS, C, CC, CS, CT, G, W )\n*\n*  Tests CHER2K and CSYR2K.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Parameters ..\n      COMPLEX            ZERO, ONE\n      PARAMETER          ( ZERO = ( 0.0, 0.0 ), ONE = ( 1.0, 0.0 ) )\n      REAL               RONE, RZERO\n      PARAMETER          ( RONE = 1.0, RZERO = 0.0 )\n*     .. Scalar Arguments ..\n      REAL               EPS, THRESH\n      INTEGER            NALF, NBET, NIDIM, NMAX, NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      COMPLEX            AA( NMAX*NMAX ), AB( 2*NMAX*NMAX ),\n     $                   ALF( NALF ), AS( NMAX*NMAX ), BB( NMAX*NMAX ),\n     $                   BET( NBET ), BS( NMAX*NMAX ), C( NMAX, NMAX ),\n     $                   CC( NMAX*NMAX ), CS( NMAX*NMAX ), CT( NMAX ),\n     $                   W( 2*NMAX )\n      REAL               G( NMAX )\n      INTEGER            IDIM( NIDIM )\n*     .. Local Scalars ..\n      COMPLEX            ALPHA, ALS, BETA, BETS\n      REAL               ERR, ERRMAX, RBETA, RBETS\n      INTEGER            I, IA, IB, ICT, ICU, IK, IN, J, JC, JJ, JJAB,\n     $                   K, KS, LAA, LBB, LCC, LDA, LDAS, LDB, LDBS,\n     $                   LDC, LDCS, LJ, MA, N, NA, NARGS, NC, NS\n      LOGICAL            CONJ, NULL, RESET, SAME, TRAN, UPPER\n      CHARACTER*1        TRANS, TRANSS, TRANST, UPLO, UPLOS\n      CHARACTER*2        ICHT, ICHU\n*     .. Local Arrays ..\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LCE, LCERES\n      EXTERNAL           LCE, LCERES\n*     .. External Subroutines ..\n      EXTERNAL           CHER2K, CMAKE, CMMCH, CSYR2K\n*     .. Intrinsic Functions ..\n      INTRINSIC          CMPLX, CONJG, MAX, REAL\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Data statements ..\n      DATA               ICHT/'NC'/, ICHU/'UL'/\n*     .. Executable Statements ..\n      CONJ = SNAME( 2: 3 ).EQ.'HE'\n*\n      NARGS = 12\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = RZERO\n*\n      DO 130 IN = 1, NIDIM\n         N = IDIM( IN )\n*        Set LDC to 1 more than minimum value if room.\n         LDC = N\n         IF( LDC.LT.NMAX )\n     $      LDC = LDC + 1\n*        Skip tests if not enough room.\n         IF( LDC.GT.NMAX )\n     $      GO TO 130\n         LCC = LDC*N\n*\n         DO 120 IK = 1, NIDIM\n            K = IDIM( IK )\n*\n            DO 110 ICT = 1, 2\n               TRANS = ICHT( ICT: ICT )\n               TRAN = TRANS.EQ.'C'\n               IF( TRAN.AND..NOT.CONJ )\n     $            TRANS = 'T'\n               IF( TRAN )THEN\n                  MA = K\n                  NA = N\n               ELSE\n                  MA = N\n                  NA = K\n               END IF\n*              Set LDA to 1 more than minimum value if room.\n               LDA = MA\n               IF( LDA.LT.NMAX )\n     $            LDA = LDA + 1\n*              Skip tests if not enough room.\n               IF( LDA.GT.NMAX )\n     $            GO TO 110\n               LAA = LDA*NA\n*\n*              Generate the matrix A.\n*\n               IF( TRAN )THEN\n                  CALL CMAKE( 'GE', ' ', ' ', MA, NA, AB, 2*NMAX, AA,\n     $                        LDA, RESET, ZERO )\n               ELSE\n                  CALL CMAKE( 'GE', ' ', ' ', MA, NA, AB, NMAX, AA, LDA,\n     $                        RESET, ZERO )\n               END IF\n*\n*              Generate the matrix B.\n*\n               LDB = LDA\n               LBB = LAA\n               IF( TRAN )THEN\n                  CALL CMAKE( 'GE', ' ', ' ', MA, NA, AB( K + 1 ),\n     $                        2*NMAX, BB, LDB, RESET, ZERO )\n               ELSE\n                  CALL CMAKE( 'GE', ' ', ' ', MA, NA, AB( K*NMAX + 1 ),\n     $                        NMAX, BB, LDB, RESET, ZERO )\n               END IF\n*\n               DO 100 ICU = 1, 2\n                  UPLO = ICHU( ICU: ICU )\n                  UPPER = UPLO.EQ.'U'\n*\n                  DO 90 IA = 1, NALF\n                     ALPHA = ALF( IA )\n*\n                     DO 80 IB = 1, NBET\n                        BETA = BET( IB )\n                        IF( CONJ )THEN\n                           RBETA = REAL( BETA )\n                           BETA = CMPLX( RBETA, RZERO )\n                        END IF\n                        NULL = N.LE.0\n                        IF( CONJ )\n     $                     NULL = NULL.OR.( ( K.LE.0.OR.ALPHA.EQ.\n     $                            ZERO ).AND.RBETA.EQ.RONE )\n*\n*                       Generate the matrix C.\n*\n                        CALL CMAKE( SNAME( 2: 3 ), UPLO, ' ', N, N, C,\n     $                              NMAX, CC, LDC, RESET, ZERO )\n*\n                        NC = NC + 1\n*\n*                       Save every datum before calling the subroutine.\n*\n                        UPLOS = UPLO\n                        TRANSS = TRANS\n                        NS = N\n                        KS = K\n                        ALS = ALPHA\n                        DO 10 I = 1, LAA\n                           AS( I ) = AA( I )\n   10                   CONTINUE\n                        LDAS = LDA\n                        DO 20 I = 1, LBB\n                           BS( I ) = BB( I )\n   20                   CONTINUE\n                        LDBS = LDB\n                        IF( CONJ )THEN\n                           RBETS = RBETA\n                        ELSE\n                           BETS = BETA\n                        END IF\n                        DO 30 I = 1, LCC\n                           CS( I ) = CC( I )\n   30                   CONTINUE\n                        LDCS = LDC\n*\n*                       Call the subroutine.\n*\n                        IF( CONJ )THEN\n                           IF( TRACE )\n     $                        WRITE( NTRA, FMT = 9994 )NC, SNAME, UPLO,\n     $                        TRANS, N, K, ALPHA, LDA, LDB, RBETA, LDC\n                           IF( REWI )\n     $                        REWIND NTRA\n                           CALL CHER2K( UPLO, TRANS, N, K, ALPHA, AA,\n     $                                  LDA, BB, LDB, RBETA, CC, LDC )\n                        ELSE\n                           IF( TRACE )\n     $                        WRITE( NTRA, FMT = 9993 )NC, SNAME, UPLO,\n     $                        TRANS, N, K, ALPHA, LDA, LDB, BETA, LDC\n                           IF( REWI )\n     $                        REWIND NTRA\n                           CALL CSYR2K( UPLO, TRANS, N, K, ALPHA, AA,\n     $                                  LDA, BB, LDB, BETA, CC, LDC )\n                        END IF\n*\n*                       Check if error-exit was taken incorrectly.\n*\n                        IF( .NOT.OK )THEN\n                           WRITE( NOUT, FMT = 9992 )\n                           FATAL = .TRUE.\n                           GO TO 150\n                        END IF\n*\n*                       See what data changed inside subroutines.\n*\n                        ISAME( 1 ) = UPLOS.EQ.UPLO\n                        ISAME( 2 ) = TRANSS.EQ.TRANS\n                        ISAME( 3 ) = NS.EQ.N\n                        ISAME( 4 ) = KS.EQ.K\n                        ISAME( 5 ) = ALS.EQ.ALPHA\n                        ISAME( 6 ) = LCE( AS, AA, LAA )\n                        ISAME( 7 ) = LDAS.EQ.LDA\n                        ISAME( 8 ) = LCE( BS, BB, LBB )\n                        ISAME( 9 ) = LDBS.EQ.LDB\n                        IF( CONJ )THEN\n                           ISAME( 10 ) = RBETS.EQ.RBETA\n                        ELSE\n                           ISAME( 10 ) = BETS.EQ.BETA\n                        END IF\n                        IF( NULL )THEN\n                           ISAME( 11 ) = LCE( CS, CC, LCC )\n                        ELSE\n                           ISAME( 11 ) = LCERES( 'HE', UPLO, N, N, CS,\n     $                                   CC, LDC )\n                        END IF\n                        ISAME( 12 ) = LDCS.EQ.LDC\n*\n*                       If data was incorrectly changed, report and\n*                       return.\n*\n                        SAME = .TRUE.\n                        DO 40 I = 1, NARGS\n                           SAME = SAME.AND.ISAME( I )\n                           IF( .NOT.ISAME( I ) )\n     $                        WRITE( NOUT, FMT = 9998 )I\n   40                   CONTINUE\n                        IF( .NOT.SAME )THEN\n                           FATAL = .TRUE.\n                           GO TO 150\n                        END IF\n*\n                        IF( .NOT.NULL )THEN\n*\n*                          Check the result column by column.\n*\n                           IF( CONJ )THEN\n                              TRANST = 'C'\n                           ELSE\n                              TRANST = 'T'\n                           END IF\n                           JJAB = 1\n                           JC = 1\n                           DO 70 J = 1, N\n                              IF( UPPER )THEN\n                                 JJ = 1\n                                 LJ = J\n                              ELSE\n                                 JJ = J\n                                 LJ = N - J + 1\n                              END IF\n                              IF( TRAN )THEN\n                                 DO 50 I = 1, K\n                                    W( I ) = ALPHA*AB( ( J - 1 )*2*\n     $                                       NMAX + K + I )\n                                    IF( CONJ )THEN\n                                       W( K + I ) = CONJG( ALPHA )*\n     $                                              AB( ( J - 1 )*2*\n     $                                              NMAX + I )\n                                    ELSE\n                                       W( K + I ) = ALPHA*\n     $                                              AB( ( J - 1 )*2*\n     $                                              NMAX + I )\n                                    END IF\n   50                            CONTINUE\n                                 CALL CMMCH( TRANST, 'N', LJ, 1, 2*K,\n     $                                       ONE, AB( JJAB ), 2*NMAX, W,\n     $                                       2*NMAX, BETA, C( JJ, J ),\n     $                                       NMAX, CT, G, CC( JC ), LDC,\n     $                                       EPS, ERR, FATAL, NOUT,\n     $                                       .TRUE. )\n                              ELSE\n                                 DO 60 I = 1, K\n                                    IF( CONJ )THEN\n                                       W( I ) = ALPHA*CONJG( AB( ( K +\n     $                                          I - 1 )*NMAX + J ) )\n                                       W( K + I ) = CONJG( ALPHA*\n     $                                              AB( ( I - 1 )*NMAX +\n     $                                              J ) )\n                                    ELSE\n                                       W( I ) = ALPHA*AB( ( K + I - 1 )*\n     $                                          NMAX + J )\n                                       W( K + I ) = ALPHA*\n     $                                              AB( ( I - 1 )*NMAX +\n     $                                              J )\n                                    END IF\n   60                            CONTINUE\n                                 CALL CMMCH( 'N', 'N', LJ, 1, 2*K, ONE,\n     $                                       AB( JJ ), NMAX, W, 2*NMAX,\n     $                                       BETA, C( JJ, J ), NMAX, CT,\n     $                                       G, CC( JC ), LDC, EPS, ERR,\n     $                                       FATAL, NOUT, .TRUE. )\n                              END IF\n                              IF( UPPER )THEN\n                                 JC = JC + LDC\n                              ELSE\n                                 JC = JC + LDC + 1\n                                 IF( TRAN )\n     $                              JJAB = JJAB + 2*NMAX\n                              END IF\n                              ERRMAX = MAX( ERRMAX, ERR )\n*                             If got really bad answer, report and\n*                             return.\n                              IF( FATAL )\n     $                           GO TO 140\n   70                      CONTINUE\n                        END IF\n*\n   80                CONTINUE\n*\n   90             CONTINUE\n*\n  100          CONTINUE\n*\n  110       CONTINUE\n*\n  120    CONTINUE\n*\n  130 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 160\n*\n  140 CONTINUE\n      IF( N.GT.1 )\n     $   WRITE( NOUT, FMT = 9995 )J\n*\n  150 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      IF( CONJ )THEN\n         WRITE( NOUT, FMT = 9994 )NC, SNAME, UPLO, TRANS, N, K, ALPHA,\n     $      LDA, LDB, RBETA, LDC\n      ELSE\n         WRITE( NOUT, FMT = 9993 )NC, SNAME, UPLO, TRANS, N, K, ALPHA,\n     $      LDA, LDB, BETA, LDC\n      END IF\n*\n  160 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( '      THESE ARE THE RESULTS FOR COLUMN ', I3 )\n 9994 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ),\n     $      '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ',', F4.1,\n     $      ', C,', I3, ')           .' )\n 9993 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ),\n     $      '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ',(', F4.1,\n     $      ',', F4.1, '), C,', I3, ')    .' )\n 9992 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of CCHK5.\n*\n      END\n      SUBROUTINE CCHKE( ISNUM, SRNAMT, NOUT )\n*\n*  Tests the error exits from the Level 3 Blas.\n*  Requires a special version of the error-handling routine XERBLA.\n*  ALPHA, RALPHA, BETA, RBETA, A, B and C should not need to be defined.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Scalar Arguments ..\n      INTEGER            ISNUM, NOUT\n      CHARACTER*6        SRNAMT\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Local Scalars ..\n      COMPLEX            ALPHA, BETA\n      REAL               RALPHA, RBETA\n*     .. Local Arrays ..\n      COMPLEX            A( 2, 1 ), B( 2, 1 ), C( 2, 1 )\n*     .. External Subroutines ..\n      EXTERNAL           CGEMM, CHEMM, CHER2K, CHERK, CHKXER, CSYMM,\n     $                   CSYR2K, CSYRK, CTRMM, CTRSM\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Executable Statements ..\n*     OK is set to .FALSE. by the special version of XERBLA or by CHKXER\n*     if anything is wrong.\n      OK = .TRUE.\n*     LERR is set to .TRUE. by the special version of XERBLA each time\n*     it is called, and is then tested and re-set by CHKXER.\n      LERR = .FALSE.\n      GO TO ( 10, 20, 30, 40, 50, 60, 70, 80,\n     $        90 )ISNUM\n   10 INFOT = 1\n      CALL CGEMM( '/', 'N', 0, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 1\n      CALL CGEMM( '/', 'C', 0, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 1\n      CALL CGEMM( '/', 'T', 0, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL CGEMM( 'N', '/', 0, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL CGEMM( 'C', '/', 0, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL CGEMM( 'T', '/', 0, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CGEMM( 'N', 'N', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CGEMM( 'N', 'C', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CGEMM( 'N', 'T', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CGEMM( 'C', 'N', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CGEMM( 'C', 'C', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CGEMM( 'C', 'T', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CGEMM( 'T', 'N', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CGEMM( 'T', 'C', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CGEMM( 'T', 'T', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CGEMM( 'N', 'N', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CGEMM( 'N', 'C', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CGEMM( 'N', 'T', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CGEMM( 'C', 'N', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CGEMM( 'C', 'C', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CGEMM( 'C', 'T', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CGEMM( 'T', 'N', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CGEMM( 'T', 'C', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CGEMM( 'T', 'T', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CGEMM( 'N', 'N', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CGEMM( 'N', 'C', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CGEMM( 'N', 'T', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CGEMM( 'C', 'N', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CGEMM( 'C', 'C', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CGEMM( 'C', 'T', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CGEMM( 'T', 'N', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CGEMM( 'T', 'C', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CGEMM( 'T', 'T', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL CGEMM( 'N', 'N', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL CGEMM( 'N', 'C', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL CGEMM( 'N', 'T', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL CGEMM( 'C', 'N', 0, 0, 2, ALPHA, A, 1, B, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL CGEMM( 'C', 'C', 0, 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL CGEMM( 'C', 'T', 0, 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL CGEMM( 'T', 'N', 0, 0, 2, ALPHA, A, 1, B, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL CGEMM( 'T', 'C', 0, 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL CGEMM( 'T', 'T', 0, 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL CGEMM( 'N', 'N', 0, 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL CGEMM( 'C', 'N', 0, 0, 2, ALPHA, A, 2, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL CGEMM( 'T', 'N', 0, 0, 2, ALPHA, A, 2, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL CGEMM( 'N', 'C', 0, 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL CGEMM( 'C', 'C', 0, 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL CGEMM( 'T', 'C', 0, 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL CGEMM( 'N', 'T', 0, 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL CGEMM( 'C', 'T', 0, 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL CGEMM( 'T', 'T', 0, 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 13\n      CALL CGEMM( 'N', 'N', 2, 0, 0, ALPHA, A, 2, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 13\n      CALL CGEMM( 'N', 'C', 2, 0, 0, ALPHA, A, 2, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 13\n      CALL CGEMM( 'N', 'T', 2, 0, 0, ALPHA, A, 2, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 13\n      CALL CGEMM( 'C', 'N', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 13\n      CALL CGEMM( 'C', 'C', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 13\n      CALL CGEMM( 'C', 'T', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 13\n      CALL CGEMM( 'T', 'N', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 13\n      CALL CGEMM( 'T', 'C', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 13\n      CALL CGEMM( 'T', 'T', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 100\n   20 INFOT = 1\n      CALL CHEMM( '/', 'U', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL CHEMM( 'L', '/', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CHEMM( 'L', 'U', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CHEMM( 'R', 'U', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CHEMM( 'L', 'L', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CHEMM( 'R', 'L', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CHEMM( 'L', 'U', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CHEMM( 'R', 'U', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CHEMM( 'L', 'L', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CHEMM( 'R', 'L', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL CHEMM( 'L', 'U', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL CHEMM( 'R', 'U', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL CHEMM( 'L', 'L', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL CHEMM( 'R', 'L', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CHEMM( 'L', 'U', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CHEMM( 'R', 'U', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CHEMM( 'L', 'L', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CHEMM( 'R', 'L', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL CHEMM( 'L', 'U', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL CHEMM( 'R', 'U', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL CHEMM( 'L', 'L', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL CHEMM( 'R', 'L', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 100\n   30 INFOT = 1\n      CALL CSYMM( '/', 'U', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL CSYMM( 'L', '/', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CSYMM( 'L', 'U', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CSYMM( 'R', 'U', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CSYMM( 'L', 'L', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CSYMM( 'R', 'L', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CSYMM( 'L', 'U', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CSYMM( 'R', 'U', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CSYMM( 'L', 'L', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CSYMM( 'R', 'L', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL CSYMM( 'L', 'U', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL CSYMM( 'R', 'U', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL CSYMM( 'L', 'L', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL CSYMM( 'R', 'L', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CSYMM( 'L', 'U', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CSYMM( 'R', 'U', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CSYMM( 'L', 'L', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CSYMM( 'R', 'L', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL CSYMM( 'L', 'U', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL CSYMM( 'R', 'U', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL CSYMM( 'L', 'L', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL CSYMM( 'R', 'L', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 100\n   40 INFOT = 1\n      CALL CTRMM( '/', 'U', 'N', 'N', 0, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL CTRMM( 'L', '/', 'N', 'N', 0, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CTRMM( 'L', 'U', '/', 'N', 0, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CTRMM( 'L', 'U', 'N', '/', 0, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CTRMM( 'L', 'U', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CTRMM( 'L', 'U', 'C', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CTRMM( 'L', 'U', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CTRMM( 'R', 'U', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CTRMM( 'R', 'U', 'C', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CTRMM( 'R', 'U', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CTRMM( 'L', 'L', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CTRMM( 'L', 'L', 'C', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CTRMM( 'L', 'L', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CTRMM( 'R', 'L', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CTRMM( 'R', 'L', 'C', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CTRMM( 'R', 'L', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL CTRMM( 'L', 'U', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL CTRMM( 'L', 'U', 'C', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL CTRMM( 'L', 'U', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL CTRMM( 'R', 'U', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL CTRMM( 'R', 'U', 'C', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL CTRMM( 'R', 'U', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL CTRMM( 'L', 'L', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL CTRMM( 'L', 'L', 'C', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL CTRMM( 'L', 'L', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL CTRMM( 'R', 'L', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL CTRMM( 'R', 'L', 'C', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL CTRMM( 'R', 'L', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CTRMM( 'L', 'U', 'N', 'N', 2, 0, ALPHA, A, 1, B, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CTRMM( 'L', 'U', 'C', 'N', 2, 0, ALPHA, A, 1, B, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CTRMM( 'L', 'U', 'T', 'N', 2, 0, ALPHA, A, 1, B, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CTRMM( 'R', 'U', 'N', 'N', 0, 2, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CTRMM( 'R', 'U', 'C', 'N', 0, 2, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CTRMM( 'R', 'U', 'T', 'N', 0, 2, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CTRMM( 'L', 'L', 'N', 'N', 2, 0, ALPHA, A, 1, B, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CTRMM( 'L', 'L', 'C', 'N', 2, 0, ALPHA, A, 1, B, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CTRMM( 'L', 'L', 'T', 'N', 2, 0, ALPHA, A, 1, B, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CTRMM( 'R', 'L', 'N', 'N', 0, 2, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CTRMM( 'R', 'L', 'C', 'N', 0, 2, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CTRMM( 'R', 'L', 'T', 'N', 0, 2, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL CTRMM( 'L', 'U', 'N', 'N', 2, 0, ALPHA, A, 2, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL CTRMM( 'L', 'U', 'C', 'N', 2, 0, ALPHA, A, 2, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL CTRMM( 'L', 'U', 'T', 'N', 2, 0, ALPHA, A, 2, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL CTRMM( 'R', 'U', 'N', 'N', 2, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL CTRMM( 'R', 'U', 'C', 'N', 2, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL CTRMM( 'R', 'U', 'T', 'N', 2, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL CTRMM( 'L', 'L', 'N', 'N', 2, 0, ALPHA, A, 2, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL CTRMM( 'L', 'L', 'C', 'N', 2, 0, ALPHA, A, 2, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL CTRMM( 'L', 'L', 'T', 'N', 2, 0, ALPHA, A, 2, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL CTRMM( 'R', 'L', 'N', 'N', 2, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL CTRMM( 'R', 'L', 'C', 'N', 2, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL CTRMM( 'R', 'L', 'T', 'N', 2, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 100\n   50 INFOT = 1\n      CALL CTRSM( '/', 'U', 'N', 'N', 0, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL CTRSM( 'L', '/', 'N', 'N', 0, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CTRSM( 'L', 'U', '/', 'N', 0, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CTRSM( 'L', 'U', 'N', '/', 0, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CTRSM( 'L', 'U', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CTRSM( 'L', 'U', 'C', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CTRSM( 'L', 'U', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CTRSM( 'R', 'U', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CTRSM( 'R', 'U', 'C', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CTRSM( 'R', 'U', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CTRSM( 'L', 'L', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CTRSM( 'L', 'L', 'C', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CTRSM( 'L', 'L', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CTRSM( 'R', 'L', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CTRSM( 'R', 'L', 'C', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL CTRSM( 'R', 'L', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL CTRSM( 'L', 'U', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL CTRSM( 'L', 'U', 'C', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL CTRSM( 'L', 'U', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL CTRSM( 'R', 'U', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL CTRSM( 'R', 'U', 'C', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL CTRSM( 'R', 'U', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL CTRSM( 'L', 'L', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL CTRSM( 'L', 'L', 'C', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL CTRSM( 'L', 'L', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL CTRSM( 'R', 'L', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL CTRSM( 'R', 'L', 'C', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL CTRSM( 'R', 'L', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CTRSM( 'L', 'U', 'N', 'N', 2, 0, ALPHA, A, 1, B, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CTRSM( 'L', 'U', 'C', 'N', 2, 0, ALPHA, A, 1, B, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CTRSM( 'L', 'U', 'T', 'N', 2, 0, ALPHA, A, 1, B, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CTRSM( 'R', 'U', 'N', 'N', 0, 2, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CTRSM( 'R', 'U', 'C', 'N', 0, 2, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CTRSM( 'R', 'U', 'T', 'N', 0, 2, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CTRSM( 'L', 'L', 'N', 'N', 2, 0, ALPHA, A, 1, B, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CTRSM( 'L', 'L', 'C', 'N', 2, 0, ALPHA, A, 1, B, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CTRSM( 'L', 'L', 'T', 'N', 2, 0, ALPHA, A, 1, B, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CTRSM( 'R', 'L', 'N', 'N', 0, 2, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CTRSM( 'R', 'L', 'C', 'N', 0, 2, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CTRSM( 'R', 'L', 'T', 'N', 0, 2, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL CTRSM( 'L', 'U', 'N', 'N', 2, 0, ALPHA, A, 2, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL CTRSM( 'L', 'U', 'C', 'N', 2, 0, ALPHA, A, 2, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL CTRSM( 'L', 'U', 'T', 'N', 2, 0, ALPHA, A, 2, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL CTRSM( 'R', 'U', 'N', 'N', 2, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL CTRSM( 'R', 'U', 'C', 'N', 2, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL CTRSM( 'R', 'U', 'T', 'N', 2, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL CTRSM( 'L', 'L', 'N', 'N', 2, 0, ALPHA, A, 2, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL CTRSM( 'L', 'L', 'C', 'N', 2, 0, ALPHA, A, 2, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL CTRSM( 'L', 'L', 'T', 'N', 2, 0, ALPHA, A, 2, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL CTRSM( 'R', 'L', 'N', 'N', 2, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL CTRSM( 'R', 'L', 'C', 'N', 2, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL CTRSM( 'R', 'L', 'T', 'N', 2, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 100\n   60 INFOT = 1\n      CALL CHERK( '/', 'N', 0, 0, RALPHA, A, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL CHERK( 'U', 'T', 0, 0, RALPHA, A, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CHERK( 'U', 'N', -1, 0, RALPHA, A, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CHERK( 'U', 'C', -1, 0, RALPHA, A, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CHERK( 'L', 'N', -1, 0, RALPHA, A, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CHERK( 'L', 'C', -1, 0, RALPHA, A, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CHERK( 'U', 'N', 0, -1, RALPHA, A, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CHERK( 'U', 'C', 0, -1, RALPHA, A, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CHERK( 'L', 'N', 0, -1, RALPHA, A, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CHERK( 'L', 'C', 0, -1, RALPHA, A, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL CHERK( 'U', 'N', 2, 0, RALPHA, A, 1, RBETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL CHERK( 'U', 'C', 0, 2, RALPHA, A, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL CHERK( 'L', 'N', 2, 0, RALPHA, A, 1, RBETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL CHERK( 'L', 'C', 0, 2, RALPHA, A, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL CHERK( 'U', 'N', 2, 0, RALPHA, A, 2, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL CHERK( 'U', 'C', 2, 0, RALPHA, A, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL CHERK( 'L', 'N', 2, 0, RALPHA, A, 2, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL CHERK( 'L', 'C', 2, 0, RALPHA, A, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 100\n   70 INFOT = 1\n      CALL CSYRK( '/', 'N', 0, 0, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL CSYRK( 'U', 'C', 0, 0, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CSYRK( 'U', 'N', -1, 0, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CSYRK( 'U', 'T', -1, 0, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CSYRK( 'L', 'N', -1, 0, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CSYRK( 'L', 'T', -1, 0, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CSYRK( 'U', 'N', 0, -1, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CSYRK( 'U', 'T', 0, -1, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CSYRK( 'L', 'N', 0, -1, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CSYRK( 'L', 'T', 0, -1, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL CSYRK( 'U', 'N', 2, 0, ALPHA, A, 1, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL CSYRK( 'U', 'T', 0, 2, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL CSYRK( 'L', 'N', 2, 0, ALPHA, A, 1, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL CSYRK( 'L', 'T', 0, 2, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL CSYRK( 'U', 'N', 2, 0, ALPHA, A, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL CSYRK( 'U', 'T', 2, 0, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL CSYRK( 'L', 'N', 2, 0, ALPHA, A, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL CSYRK( 'L', 'T', 2, 0, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 100\n   80 INFOT = 1\n      CALL CHER2K( '/', 'N', 0, 0, ALPHA, A, 1, B, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL CHER2K( 'U', 'T', 0, 0, ALPHA, A, 1, B, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CHER2K( 'U', 'N', -1, 0, ALPHA, A, 1, B, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CHER2K( 'U', 'C', -1, 0, ALPHA, A, 1, B, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CHER2K( 'L', 'N', -1, 0, ALPHA, A, 1, B, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CHER2K( 'L', 'C', -1, 0, ALPHA, A, 1, B, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CHER2K( 'U', 'N', 0, -1, ALPHA, A, 1, B, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CHER2K( 'U', 'C', 0, -1, ALPHA, A, 1, B, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CHER2K( 'L', 'N', 0, -1, ALPHA, A, 1, B, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CHER2K( 'L', 'C', 0, -1, ALPHA, A, 1, B, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL CHER2K( 'U', 'N', 2, 0, ALPHA, A, 1, B, 1, RBETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL CHER2K( 'U', 'C', 0, 2, ALPHA, A, 1, B, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL CHER2K( 'L', 'N', 2, 0, ALPHA, A, 1, B, 1, RBETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL CHER2K( 'L', 'C', 0, 2, ALPHA, A, 1, B, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CHER2K( 'U', 'N', 2, 0, ALPHA, A, 2, B, 1, RBETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CHER2K( 'U', 'C', 0, 2, ALPHA, A, 2, B, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CHER2K( 'L', 'N', 2, 0, ALPHA, A, 2, B, 1, RBETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CHER2K( 'L', 'C', 0, 2, ALPHA, A, 2, B, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL CHER2K( 'U', 'N', 2, 0, ALPHA, A, 2, B, 2, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL CHER2K( 'U', 'C', 2, 0, ALPHA, A, 1, B, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL CHER2K( 'L', 'N', 2, 0, ALPHA, A, 2, B, 2, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL CHER2K( 'L', 'C', 2, 0, ALPHA, A, 1, B, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 100\n   90 INFOT = 1\n      CALL CSYR2K( '/', 'N', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL CSYR2K( 'U', 'C', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CSYR2K( 'U', 'N', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CSYR2K( 'U', 'T', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CSYR2K( 'L', 'N', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL CSYR2K( 'L', 'T', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CSYR2K( 'U', 'N', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CSYR2K( 'U', 'T', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CSYR2K( 'L', 'N', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL CSYR2K( 'L', 'T', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL CSYR2K( 'U', 'N', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL CSYR2K( 'U', 'T', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL CSYR2K( 'L', 'N', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL CSYR2K( 'L', 'T', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CSYR2K( 'U', 'N', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CSYR2K( 'U', 'T', 0, 2, ALPHA, A, 2, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CSYR2K( 'L', 'N', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL CSYR2K( 'L', 'T', 0, 2, ALPHA, A, 2, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL CSYR2K( 'U', 'N', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL CSYR2K( 'U', 'T', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL CSYR2K( 'L', 'N', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL CSYR2K( 'L', 'T', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n*\n  100 IF( OK )THEN\n         WRITE( NOUT, FMT = 9999 )SRNAMT\n      ELSE\n         WRITE( NOUT, FMT = 9998 )SRNAMT\n      END IF\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE TESTS OF ERROR-EXITS' )\n 9998 FORMAT( ' ******* ', A6, ' FAILED THE TESTS OF ERROR-EXITS *****',\n     $      '**' )\n*\n*     End of CCHKE.\n*\n      END\n      SUBROUTINE CMAKE( TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, RESET,\n     $                  TRANSL )\n*\n*  Generates values for an M by N matrix A.\n*  Stores the values in the array AA in the data structure required\n*  by the routine, with unwanted elements set to rogue value.\n*\n*  TYPE is 'GE', 'HE', 'SY' or 'TR'.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Parameters ..\n      COMPLEX            ZERO, ONE\n      PARAMETER          ( ZERO = ( 0.0, 0.0 ), ONE = ( 1.0, 0.0 ) )\n      COMPLEX            ROGUE\n      PARAMETER          ( ROGUE = ( -1.0E10, 1.0E10 ) )\n      REAL               RZERO\n      PARAMETER          ( RZERO = 0.0 )\n      REAL               RROGUE\n      PARAMETER          ( RROGUE = -1.0E10 )\n*     .. Scalar Arguments ..\n      COMPLEX            TRANSL\n      INTEGER            LDA, M, N, NMAX\n      LOGICAL            RESET\n      CHARACTER*1        DIAG, UPLO\n      CHARACTER*2        TYPE\n*     .. Array Arguments ..\n      COMPLEX            A( NMAX, * ), AA( * )\n*     .. Local Scalars ..\n      INTEGER            I, IBEG, IEND, J, JJ\n      LOGICAL            GEN, HER, LOWER, SYM, TRI, UNIT, UPPER\n*     .. External Functions ..\n      COMPLEX            CBEG\n      EXTERNAL           CBEG\n*     .. Intrinsic Functions ..\n      INTRINSIC          CMPLX, CONJG, REAL\n*     .. Executable Statements ..\n      GEN = TYPE.EQ.'GE'\n      HER = TYPE.EQ.'HE'\n      SYM = TYPE.EQ.'SY'\n      TRI = TYPE.EQ.'TR'\n      UPPER = ( HER.OR.SYM.OR.TRI ).AND.UPLO.EQ.'U'\n      LOWER = ( HER.OR.SYM.OR.TRI ).AND.UPLO.EQ.'L'\n      UNIT = TRI.AND.DIAG.EQ.'U'\n*\n*     Generate data in array A.\n*\n      DO 20 J = 1, N\n         DO 10 I = 1, M\n            IF( GEN.OR.( UPPER.AND.I.LE.J ).OR.( LOWER.AND.I.GE.J ) )\n     $          THEN\n               A( I, J ) = CBEG( RESET ) + TRANSL\n               IF( I.NE.J )THEN\n*                 Set some elements to zero\n                  IF( N.GT.3.AND.J.EQ.N/2 )\n     $               A( I, J ) = ZERO\n                  IF( HER )THEN\n                     A( J, I ) = CONJG( A( I, J ) )\n                  ELSE IF( SYM )THEN\n                     A( J, I ) = A( I, J )\n                  ELSE IF( TRI )THEN\n                     A( J, I ) = ZERO\n                  END IF\n               END IF\n            END IF\n   10    CONTINUE\n         IF( HER )\n     $      A( J, J ) = CMPLX( REAL( A( J, J ) ), RZERO )\n         IF( TRI )\n     $      A( J, J ) = A( J, J ) + ONE\n         IF( UNIT )\n     $      A( J, J ) = ONE\n   20 CONTINUE\n*\n*     Store elements in array AS in data structure required by routine.\n*\n      IF( TYPE.EQ.'GE' )THEN\n         DO 50 J = 1, N\n            DO 30 I = 1, M\n               AA( I + ( J - 1 )*LDA ) = A( I, J )\n   30       CONTINUE\n            DO 40 I = M + 1, LDA\n               AA( I + ( J - 1 )*LDA ) = ROGUE\n   40       CONTINUE\n   50    CONTINUE\n      ELSE IF( TYPE.EQ.'HE'.OR.TYPE.EQ.'SY'.OR.TYPE.EQ.'TR' )THEN\n         DO 90 J = 1, N\n            IF( UPPER )THEN\n               IBEG = 1\n               IF( UNIT )THEN\n                  IEND = J - 1\n               ELSE\n                  IEND = J\n               END IF\n            ELSE\n               IF( UNIT )THEN\n                  IBEG = J + 1\n               ELSE\n                  IBEG = J\n               END IF\n               IEND = N\n            END IF\n            DO 60 I = 1, IBEG - 1\n               AA( I + ( J - 1 )*LDA ) = ROGUE\n   60       CONTINUE\n            DO 70 I = IBEG, IEND\n               AA( I + ( J - 1 )*LDA ) = A( I, J )\n   70       CONTINUE\n            DO 80 I = IEND + 1, LDA\n               AA( I + ( J - 1 )*LDA ) = ROGUE\n   80       CONTINUE\n            IF( HER )THEN\n               JJ = J + ( J - 1 )*LDA\n               AA( JJ ) = CMPLX( REAL( AA( JJ ) ), RROGUE )\n            END IF\n   90    CONTINUE\n      END IF\n      RETURN\n*\n*     End of CMAKE.\n*\n      END\n      SUBROUTINE CMMCH( TRANSA, TRANSB, M, N, KK, ALPHA, A, LDA, B, LDB,\n     $                  BETA, C, LDC, CT, G, CC, LDCC, EPS, ERR, FATAL,\n     $                  NOUT, MV )\n*\n*  Checks the results of the computational tests.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Parameters ..\n      COMPLEX            ZERO\n      PARAMETER          ( ZERO = ( 0.0, 0.0 ) )\n      REAL               RZERO, RONE\n      PARAMETER          ( RZERO = 0.0, RONE = 1.0 )\n*     .. Scalar Arguments ..\n      COMPLEX            ALPHA, BETA\n      REAL               EPS, ERR\n      INTEGER            KK, LDA, LDB, LDC, LDCC, M, N, NOUT\n      LOGICAL            FATAL, MV\n      CHARACTER*1        TRANSA, TRANSB\n*     .. Array Arguments ..\n      COMPLEX            A( LDA, * ), B( LDB, * ), C( LDC, * ),\n     $                   CC( LDCC, * ), CT( * )\n      REAL               G( * )\n*     .. Local Scalars ..\n      COMPLEX            CL\n      REAL               ERRI\n      INTEGER            I, J, K\n      LOGICAL            CTRANA, CTRANB, TRANA, TRANB\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, AIMAG, CONJG, MAX, REAL, SQRT\n*     .. Statement Functions ..\n      REAL               ABS1\n*     .. Statement Function definitions ..\n      ABS1( CL ) = ABS( REAL( CL ) ) + ABS( AIMAG( CL ) )\n*     .. Executable Statements ..\n      TRANA = TRANSA.EQ.'T'.OR.TRANSA.EQ.'C'\n      TRANB = TRANSB.EQ.'T'.OR.TRANSB.EQ.'C'\n      CTRANA = TRANSA.EQ.'C'\n      CTRANB = TRANSB.EQ.'C'\n*\n*     Compute expected result, one column at a time, in CT using data\n*     in A, B and C.\n*     Compute gauges in G.\n*\n      DO 220 J = 1, N\n*\n         DO 10 I = 1, M\n            CT( I ) = ZERO\n            G( I ) = RZERO\n   10    CONTINUE\n         IF( .NOT.TRANA.AND..NOT.TRANB )THEN\n            DO 30 K = 1, KK\n               DO 20 I = 1, M\n                  CT( I ) = CT( I ) + A( I, K )*B( K, J )\n                  G( I ) = G( I ) + ABS1( A( I, K ) )*ABS1( B( K, J ) )\n   20          CONTINUE\n   30       CONTINUE\n         ELSE IF( TRANA.AND..NOT.TRANB )THEN\n            IF( CTRANA )THEN\n               DO 50 K = 1, KK\n                  DO 40 I = 1, M\n                     CT( I ) = CT( I ) + CONJG( A( K, I ) )*B( K, J )\n                     G( I ) = G( I ) + ABS1( A( K, I ) )*\n     $                        ABS1( B( K, J ) )\n   40             CONTINUE\n   50          CONTINUE\n            ELSE\n               DO 70 K = 1, KK\n                  DO 60 I = 1, M\n                     CT( I ) = CT( I ) + A( K, I )*B( K, J )\n                     G( I ) = G( I ) + ABS1( A( K, I ) )*\n     $                        ABS1( B( K, J ) )\n   60             CONTINUE\n   70          CONTINUE\n            END IF\n         ELSE IF( .NOT.TRANA.AND.TRANB )THEN\n            IF( CTRANB )THEN\n               DO 90 K = 1, KK\n                  DO 80 I = 1, M\n                     CT( I ) = CT( I ) + A( I, K )*CONJG( B( J, K ) )\n                     G( I ) = G( I ) + ABS1( A( I, K ) )*\n     $                        ABS1( B( J, K ) )\n   80             CONTINUE\n   90          CONTINUE\n            ELSE\n               DO 110 K = 1, KK\n                  DO 100 I = 1, M\n                     CT( I ) = CT( I ) + A( I, K )*B( J, K )\n                     G( I ) = G( I ) + ABS1( A( I, K ) )*\n     $                        ABS1( B( J, K ) )\n  100             CONTINUE\n  110          CONTINUE\n            END IF\n         ELSE IF( TRANA.AND.TRANB )THEN\n            IF( CTRANA )THEN\n               IF( CTRANB )THEN\n                  DO 130 K = 1, KK\n                     DO 120 I = 1, M\n                        CT( I ) = CT( I ) + CONJG( A( K, I ) )*\n     $                            CONJG( B( J, K ) )\n                        G( I ) = G( I ) + ABS1( A( K, I ) )*\n     $                           ABS1( B( J, K ) )\n  120                CONTINUE\n  130             CONTINUE\n               ELSE\n                  DO 150 K = 1, KK\n                     DO 140 I = 1, M\n                        CT( I ) = CT( I ) + CONJG( A( K, I ) )*B( J, K )\n                        G( I ) = G( I ) + ABS1( A( K, I ) )*\n     $                           ABS1( B( J, K ) )\n  140                CONTINUE\n  150             CONTINUE\n               END IF\n            ELSE\n               IF( CTRANB )THEN\n                  DO 170 K = 1, KK\n                     DO 160 I = 1, M\n                        CT( I ) = CT( I ) + A( K, I )*CONJG( B( J, K ) )\n                        G( I ) = G( I ) + ABS1( A( K, I ) )*\n     $                           ABS1( B( J, K ) )\n  160                CONTINUE\n  170             CONTINUE\n               ELSE\n                  DO 190 K = 1, KK\n                     DO 180 I = 1, M\n                        CT( I ) = CT( I ) + A( K, I )*B( J, K )\n                        G( I ) = G( I ) + ABS1( A( K, I ) )*\n     $                           ABS1( B( J, K ) )\n  180                CONTINUE\n  190             CONTINUE\n               END IF\n            END IF\n         END IF\n         DO 200 I = 1, M\n            CT( I ) = ALPHA*CT( I ) + BETA*C( I, J )\n            G( I ) = ABS1( ALPHA )*G( I ) +\n     $               ABS1( BETA )*ABS1( C( I, J ) )\n  200    CONTINUE\n*\n*        Compute the error ratio for this result.\n*\n         ERR = ZERO\n         DO 210 I = 1, M\n            ERRI = ABS1( CT( I ) - CC( I, J ) )/EPS\n            IF( G( I ).NE.RZERO )\n     $         ERRI = ERRI/G( I )\n            ERR = MAX( ERR, ERRI )\n            IF( ERR*SQRT( EPS ).GE.RONE )\n     $         GO TO 230\n  210    CONTINUE\n*\n  220 CONTINUE\n*\n*     If the loop completes, all results are at least half accurate.\n      GO TO 250\n*\n*     Report fatal error.\n*\n  230 FATAL = .TRUE.\n      WRITE( NOUT, FMT = 9999 )\n      DO 240 I = 1, M\n         IF( MV )THEN\n            WRITE( NOUT, FMT = 9998 )I, CT( I ), CC( I, J )\n         ELSE\n            WRITE( NOUT, FMT = 9998 )I, CC( I, J ), CT( I )\n         END IF\n  240 CONTINUE\n      IF( N.GT.1 )\n     $   WRITE( NOUT, FMT = 9997 )J\n*\n  250 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ******* FATAL ERROR - COMPUTED RESULT IS LESS THAN HAL',\n     $      'F ACCURATE *******', /'                       EXPECTED RE',\n     $      'SULT                    COMPUTED RESULT' )\n 9998 FORMAT( 1X, I7, 2( '  (', G15.6, ',', G15.6, ')' ) )\n 9997 FORMAT( '      THESE ARE THE RESULTS FOR COLUMN ', I3 )\n*\n*     End of CMMCH.\n*\n      END\n      LOGICAL FUNCTION LCE( RI, RJ, LR )\n*\n*  Tests if two arrays are identical.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Scalar Arguments ..\n      INTEGER            LR\n*     .. Array Arguments ..\n      COMPLEX            RI( * ), RJ( * )\n*     .. Local Scalars ..\n      INTEGER            I\n*     .. Executable Statements ..\n      DO 10 I = 1, LR\n         IF( RI( I ).NE.RJ( I ) )\n     $      GO TO 20\n   10 CONTINUE\n      LCE = .TRUE.\n      GO TO 30\n   20 CONTINUE\n      LCE = .FALSE.\n   30 RETURN\n*\n*     End of LCE.\n*\n      END\n      LOGICAL FUNCTION LCERES( TYPE, UPLO, M, N, AA, AS, LDA )\n*\n*  Tests if selected elements in two arrays are equal.\n*\n*  TYPE is 'GE' or 'HE' or 'SY'.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Scalar Arguments ..\n      INTEGER            LDA, M, N\n      CHARACTER*1        UPLO\n      CHARACTER*2        TYPE\n*     .. Array Arguments ..\n      COMPLEX            AA( LDA, * ), AS( LDA, * )\n*     .. Local Scalars ..\n      INTEGER            I, IBEG, IEND, J\n      LOGICAL            UPPER\n*     .. Executable Statements ..\n      UPPER = UPLO.EQ.'U'\n      IF( TYPE.EQ.'GE' )THEN\n         DO 20 J = 1, N\n            DO 10 I = M + 1, LDA\n               IF( AA( I, J ).NE.AS( I, J ) )\n     $            GO TO 70\n   10       CONTINUE\n   20    CONTINUE\n      ELSE IF( TYPE.EQ.'HE'.OR.TYPE.EQ.'SY' )THEN\n         DO 50 J = 1, N\n            IF( UPPER )THEN\n               IBEG = 1\n               IEND = J\n            ELSE\n               IBEG = J\n               IEND = N\n            END IF\n            DO 30 I = 1, IBEG - 1\n               IF( AA( I, J ).NE.AS( I, J ) )\n     $            GO TO 70\n   30       CONTINUE\n            DO 40 I = IEND + 1, LDA\n               IF( AA( I, J ).NE.AS( I, J ) )\n     $            GO TO 70\n   40       CONTINUE\n   50    CONTINUE\n      END IF\n*\n   60 CONTINUE\n      LCERES = .TRUE.\n      GO TO 80\n   70 CONTINUE\n      LCERES = .FALSE.\n   80 RETURN\n*\n*     End of LCERES.\n*\n      END\n      COMPLEX FUNCTION CBEG( RESET )\n*\n*  Generates complex numbers as pairs of random numbers uniformly\n*  distributed between -0.5 and 0.5.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Scalar Arguments ..\n      LOGICAL            RESET\n*     .. Local Scalars ..\n      INTEGER            I, IC, J, MI, MJ\n*     .. Save statement ..\n      SAVE               I, IC, J, MI, MJ\n*     .. Intrinsic Functions ..\n      INTRINSIC          CMPLX\n*     .. Executable Statements ..\n      IF( RESET )THEN\n*        Initialize local variables.\n         MI = 891\n         MJ = 457\n         I = 7\n         J = 7\n         IC = 0\n         RESET = .FALSE.\n      END IF\n*\n*     The sequence of values of I or J is bounded between 1 and 999.\n*     If initial I or J = 1,2,3,6,7 or 9, the period will be 50.\n*     If initial I or J = 4 or 8, the period will be 25.\n*     If initial I or J = 5, the period will be 10.\n*     IC is used to break up the period by skipping 1 value of I or J\n*     in 6.\n*\n      IC = IC + 1\n   10 I = I*MI\n      J = J*MJ\n      I = I - 1000*( I/1000 )\n      J = J - 1000*( J/1000 )\n      IF( IC.GE.5 )THEN\n         IC = 0\n         GO TO 10\n      END IF\n      CBEG = CMPLX( ( I - 500 )/1001.0, ( J - 500 )/1001.0 )\n      RETURN\n*\n*     End of CBEG.\n*\n      END\n      REAL FUNCTION SDIFF( X, Y )\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Scalar Arguments ..\n      REAL               X, Y\n*     .. Executable Statements ..\n      SDIFF = X - Y\n      RETURN\n*\n*     End of SDIFF.\n*\n      END\n      SUBROUTINE CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n*\n*  Tests whether XERBLA has detected an error when it should.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Scalar Arguments ..\n      INTEGER            INFOT, NOUT\n      LOGICAL            LERR, OK\n      CHARACTER*6        SRNAMT\n*     .. Executable Statements ..\n      IF( .NOT.LERR )THEN\n         WRITE( NOUT, FMT = 9999 )INFOT, SRNAMT\n         OK = .FALSE.\n      END IF\n      LERR = .FALSE.\n      RETURN\n*\n 9999 FORMAT( ' ***** ILLEGAL VALUE OF PARAMETER NUMBER ', I2, ' NOT D',\n     $      'ETECTED BY ', A6, ' *****' )\n*\n*     End of CHKXER.\n*\n      END\n      SUBROUTINE XERBLA( SRNAME, INFO )\n*\n*  This is a special version of XERBLA to be used only as part of\n*  the test program for testing error exits from the Level 3 BLAS\n*  routines.\n*\n*  XERBLA  is an error handler for the Level 3 BLAS routines.\n*\n*  It is called by the Level 3 BLAS routines if an input parameter is\n*  invalid.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Scalar Arguments ..\n      INTEGER            INFO\n      CHARACTER*6        SRNAME\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUT\n      LOGICAL            LERR, OK\n      CHARACTER*6        SRNAMT\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUT, OK, LERR\n      COMMON             /SRNAMC/SRNAMT\n*     .. Executable Statements ..\n      LERR = .TRUE.\n      IF( INFO.NE.INFOT )THEN\n         IF( INFOT.NE.0 )THEN\n            WRITE( NOUT, FMT = 9999 )INFO, INFOT\n         ELSE\n            WRITE( NOUT, FMT = 9997 )INFO\n         END IF\n         OK = .FALSE.\n      END IF\n      IF( SRNAME.NE.SRNAMT )THEN\n         WRITE( NOUT, FMT = 9998 )SRNAME, SRNAMT\n         OK = .FALSE.\n      END IF\n      RETURN\n*\n 9999 FORMAT( ' ******* XERBLA WAS CALLED WITH INFO = ', I6, ' INSTEAD',\n     $      ' OF ', I2, ' *******' )\n 9998 FORMAT( ' ******* XERBLA WAS CALLED WITH SRNAME = ', A6, ' INSTE',\n     $      'AD OF ', A6, ' *******' )\n 9997 FORMAT( ' ******* XERBLA WAS CALLED WITH INFO = ', I6,\n     $      ' *******' )\n*\n*     End of XERBLA\n*\n      END\n\n"
  },
  {
    "path": "libs/eigen/blas/testing/dblat1.f",
    "content": "*> \\brief \\b DBLAT1\n*\n*  =========== DOCUMENTATION ===========\n*\n* Online html documentation available at \n*            http://www.netlib.org/lapack/explore-html/ \n*\n*  Definition:\n*  ===========\n*\n*       PROGRAM DBLAT1\n* \n*\n*> \\par Purpose:\n*  =============\n*>\n*> \\verbatim\n*>\n*>    Test program for the DOUBLE PRECISION Level 1 BLAS.\n*>\n*>    Based upon the original BLAS test routine together with:\n*>    F06EAF Example Program Text\n*> \\endverbatim\n*\n*  Authors:\n*  ========\n*\n*> \\author Univ. of Tennessee \n*> \\author Univ. of California Berkeley \n*> \\author Univ. of Colorado Denver \n*> \\author NAG Ltd. \n*\n*> \\date April 2012\n*\n*> \\ingroup double_blas_testing\n*\n*  =====================================================================\n      PROGRAM DBLAT1\n*\n*  -- Reference BLAS test routine (version 3.4.1) --\n*  -- Reference BLAS is a software package provided by Univ. of Tennessee,    --\n*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--\n*     April 2012\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      INTEGER          NOUT\n      PARAMETER        (NOUT=6)\n*     .. Scalars in Common ..\n      INTEGER          ICASE, INCX, INCY, N\n      LOGICAL          PASS\n*     .. Local Scalars ..\n      DOUBLE PRECISION SFAC\n      INTEGER          IC\n*     .. External Subroutines ..\n      EXTERNAL         CHECK0, CHECK1, CHECK2, CHECK3, HEADER\n*     .. Common blocks ..\n      COMMON           /COMBLA/ICASE, N, INCX, INCY, PASS\n*     .. Data statements ..\n      DATA             SFAC/9.765625D-4/\n*     .. Executable Statements ..\n      WRITE (NOUT,99999)\n      DO 20 IC = 1, 13\n         ICASE = IC\n         CALL HEADER\n*\n*        .. Initialize  PASS,  INCX,  and INCY for a new case. ..\n*        .. the value 9999 for INCX or INCY will appear in the ..\n*        .. detailed  output, if any, for cases  that do not involve ..\n*        .. these parameters ..\n*\n         PASS = .TRUE.\n         INCX = 9999\n         INCY = 9999\n         IF (ICASE.EQ.3 .OR. ICASE.EQ.11) THEN\n            CALL CHECK0(SFAC)\n         ELSE IF (ICASE.EQ.7 .OR. ICASE.EQ.8 .OR. ICASE.EQ.9 .OR.\n     +            ICASE.EQ.10) THEN\n            CALL CHECK1(SFAC)\n         ELSE IF (ICASE.EQ.1 .OR. ICASE.EQ.2 .OR. ICASE.EQ.5 .OR.\n     +            ICASE.EQ.6 .OR. ICASE.EQ.12 .OR. ICASE.EQ.13) THEN\n            CALL CHECK2(SFAC)\n         ELSE IF (ICASE.EQ.4) THEN\n            CALL CHECK3(SFAC)\n         END IF\n*        -- Print\n         IF (PASS) WRITE (NOUT,99998)\n   20 CONTINUE\n      STOP\n*\n99999 FORMAT (' Real BLAS Test Program Results',/1X)\n99998 FORMAT ('                                    ----- PASS -----')\n      END\n      SUBROUTINE HEADER\n*     .. Parameters ..\n      INTEGER          NOUT\n      PARAMETER        (NOUT=6)\n*     .. Scalars in Common ..\n      INTEGER          ICASE, INCX, INCY, N\n      LOGICAL          PASS\n*     .. Local Arrays ..\n      CHARACTER*6      L(13)\n*     .. Common blocks ..\n      COMMON           /COMBLA/ICASE, N, INCX, INCY, PASS\n*     .. Data statements ..\n      DATA             L(1)/' DDOT '/\n      DATA             L(2)/'DAXPY '/\n      DATA             L(3)/'DROTG '/\n      DATA             L(4)/' DROT '/\n      DATA             L(5)/'DCOPY '/\n      DATA             L(6)/'DSWAP '/\n      DATA             L(7)/'DNRM2 '/\n      DATA             L(8)/'DASUM '/\n      DATA             L(9)/'DSCAL '/\n      DATA             L(10)/'IDAMAX'/\n      DATA             L(11)/'DROTMG'/\n      DATA             L(12)/'DROTM '/\n      DATA             L(13)/'DSDOT '/\n*     .. Executable Statements ..\n      WRITE (NOUT,99999) ICASE, L(ICASE)\n      RETURN\n*\n99999 FORMAT (/' Test of subprogram number',I3,12X,A6)\n      END\n      SUBROUTINE CHECK0(SFAC)\n*     .. Parameters ..\n      INTEGER           NOUT\n      PARAMETER         (NOUT=6)\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION  SFAC\n*     .. Scalars in Common ..\n      INTEGER           ICASE, INCX, INCY, N\n      LOGICAL           PASS\n*     .. Local Scalars ..\n      DOUBLE PRECISION  SA, SB, SC, SS, D12\n      INTEGER           I, K\n*     .. Local Arrays ..\n      DOUBLE PRECISION  DA1(8), DATRUE(8), DB1(8), DBTRUE(8), DC1(8),\n     $                  DS1(8), DAB(4,9), DTEMP(9), DTRUE(9,9)\n*     .. External Subroutines ..\n      EXTERNAL          DROTG, DROTMG, STEST1\n*     .. Common blocks ..\n      COMMON            /COMBLA/ICASE, N, INCX, INCY, PASS\n*     .. Data statements ..\n      DATA              DA1/0.3D0, 0.4D0, -0.3D0, -0.4D0, -0.3D0, 0.0D0,\n     +                  0.0D0, 1.0D0/\n      DATA              DB1/0.4D0, 0.3D0, 0.4D0, 0.3D0, -0.4D0, 0.0D0,\n     +                  1.0D0, 0.0D0/\n      DATA              DC1/0.6D0, 0.8D0, -0.6D0, 0.8D0, 0.6D0, 1.0D0,\n     +                  0.0D0, 1.0D0/\n      DATA              DS1/0.8D0, 0.6D0, 0.8D0, -0.6D0, 0.8D0, 0.0D0,\n     +                  1.0D0, 0.0D0/\n      DATA              DATRUE/0.5D0, 0.5D0, 0.5D0, -0.5D0, -0.5D0,\n     +                  0.0D0, 1.0D0, 1.0D0/\n      DATA              DBTRUE/0.0D0, 0.6D0, 0.0D0, -0.6D0, 0.0D0,\n     +                  0.0D0, 1.0D0, 0.0D0/\n*     INPUT FOR MODIFIED GIVENS\n      DATA DAB/ .1D0,.3D0,1.2D0,.2D0,\n     A          .7D0, .2D0, .6D0, 4.2D0,\n     B          0.D0,0.D0,0.D0,0.D0,\n     C          4.D0, -1.D0, 2.D0, 4.D0,\n     D          6.D-10, 2.D-2, 1.D5, 10.D0,\n     E          4.D10, 2.D-2, 1.D-5, 10.D0,\n     F          2.D-10, 4.D-2, 1.D5, 10.D0,\n     G          2.D10, 4.D-2, 1.D-5, 10.D0,\n     H          4.D0, -2.D0, 8.D0, 4.D0    /\n*    TRUE RESULTS FOR MODIFIED GIVENS\n      DATA DTRUE/0.D0,0.D0, 1.3D0, .2D0, 0.D0,0.D0,0.D0, .5D0, 0.D0,\n     A           0.D0,0.D0, 4.5D0, 4.2D0, 1.D0, .5D0, 0.D0,0.D0,0.D0,\n     B           0.D0,0.D0,0.D0,0.D0, -2.D0, 0.D0,0.D0,0.D0,0.D0,\n     C           0.D0,0.D0,0.D0, 4.D0, -1.D0, 0.D0,0.D0,0.D0,0.D0,\n     D           0.D0, 15.D-3, 0.D0, 10.D0, -1.D0, 0.D0, -1.D-4,\n     E           0.D0, 1.D0,\n     F           0.D0,0.D0, 6144.D-5, 10.D0, -1.D0, 4096.D0, -1.D6,\n     G           0.D0, 1.D0,\n     H           0.D0,0.D0,15.D0,10.D0,-1.D0, 5.D-5, 0.D0,1.D0,0.D0,\n     I           0.D0,0.D0, 15.D0, 10.D0, -1. D0, 5.D5, -4096.D0,\n     J           1.D0, 4096.D-6,\n     K           0.D0,0.D0, 7.D0, 4.D0, 0.D0,0.D0, -.5D0, -.25D0, 0.D0/\n*                   4096 = 2 ** 12\n      DATA D12  /4096.D0/\n      DTRUE(1,1) = 12.D0 / 130.D0\n      DTRUE(2,1) = 36.D0 / 130.D0\n      DTRUE(7,1) = -1.D0 / 6.D0\n      DTRUE(1,2) = 14.D0 / 75.D0\n      DTRUE(2,2) = 49.D0 / 75.D0\n      DTRUE(9,2) = 1.D0 / 7.D0\n      DTRUE(1,5) = 45.D-11 * (D12 * D12)\n      DTRUE(3,5) = 4.D5 / (3.D0 * D12)\n      DTRUE(6,5) = 1.D0 / D12\n      DTRUE(8,5) = 1.D4 / (3.D0 * D12)\n      DTRUE(1,6) = 4.D10 / (1.5D0 * D12 * D12)\n      DTRUE(2,6) = 2.D-2 / 1.5D0\n      DTRUE(8,6) = 5.D-7 * D12\n      DTRUE(1,7) = 4.D0 / 150.D0\n      DTRUE(2,7) = (2.D-10 / 1.5D0) * (D12 * D12)\n      DTRUE(7,7) = -DTRUE(6,5)\n      DTRUE(9,7) = 1.D4 / D12\n      DTRUE(1,8) = DTRUE(1,7)\n      DTRUE(2,8) = 2.D10 / (1.5D0 * D12 * D12)\n      DTRUE(1,9) = 32.D0 / 7.D0\n      DTRUE(2,9) = -16.D0 / 7.D0\n*     .. Executable Statements ..\n*\n*     Compute true values which cannot be prestored\n*     in decimal notation\n*\n      DBTRUE(1) = 1.0D0/0.6D0\n      DBTRUE(3) = -1.0D0/0.6D0\n      DBTRUE(5) = 1.0D0/0.6D0\n*\n      DO 20 K = 1, 8\n*        .. Set N=K for identification in output if any ..\n         N = K\n         IF (ICASE.EQ.3) THEN\n*           .. DROTG ..\n            IF (K.GT.8) GO TO 40\n            SA = DA1(K)\n            SB = DB1(K)\n            CALL DROTG(SA,SB,SC,SS)\n            CALL STEST1(SA,DATRUE(K),DATRUE(K),SFAC)\n            CALL STEST1(SB,DBTRUE(K),DBTRUE(K),SFAC)\n            CALL STEST1(SC,DC1(K),DC1(K),SFAC)\n            CALL STEST1(SS,DS1(K),DS1(K),SFAC)\n         ELSEIF (ICASE.EQ.11) THEN\n*           .. DROTMG ..\n            DO I=1,4\n               DTEMP(I)= DAB(I,K)\n               DTEMP(I+4) = 0.0\n            END DO\n            DTEMP(9) = 0.0\n            CALL DROTMG(DTEMP(1),DTEMP(2),DTEMP(3),DTEMP(4),DTEMP(5))\n            CALL STEST(9,DTEMP,DTRUE(1,K),DTRUE(1,K),SFAC)\n         ELSE\n            WRITE (NOUT,*) ' Shouldn''t be here in CHECK0'\n            STOP\n         END IF\n   20 CONTINUE\n   40 RETURN\n      END\n      SUBROUTINE CHECK1(SFAC)\n*     .. Parameters ..\n      INTEGER           NOUT\n      PARAMETER         (NOUT=6)\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION  SFAC\n*     .. Scalars in Common ..\n      INTEGER           ICASE, INCX, INCY, N\n      LOGICAL           PASS\n*     .. Local Scalars ..\n      INTEGER           I, LEN, NP1\n*     .. Local Arrays ..\n      DOUBLE PRECISION  DTRUE1(5), DTRUE3(5), DTRUE5(8,5,2), DV(8,5,2),\n     +                  SA(10), STEMP(1), STRUE(8), SX(8)\n      INTEGER           ITRUE2(5)\n*     .. External Functions ..\n      DOUBLE PRECISION  DASUM, DNRM2\n      INTEGER           IDAMAX\n      EXTERNAL          DASUM, DNRM2, IDAMAX\n*     .. External Subroutines ..\n      EXTERNAL          ITEST1, DSCAL, STEST, STEST1\n*     .. Intrinsic Functions ..\n      INTRINSIC         MAX\n*     .. Common blocks ..\n      COMMON            /COMBLA/ICASE, N, INCX, INCY, PASS\n*     .. Data statements ..\n      DATA              SA/0.3D0, -1.0D0, 0.0D0, 1.0D0, 0.3D0, 0.3D0,\n     +                  0.3D0, 0.3D0, 0.3D0, 0.3D0/\n      DATA              DV/0.1D0, 2.0D0, 2.0D0, 2.0D0, 2.0D0, 2.0D0,\n     +                  2.0D0, 2.0D0, 0.3D0, 3.0D0, 3.0D0, 3.0D0, 3.0D0,\n     +                  3.0D0, 3.0D0, 3.0D0, 0.3D0, -0.4D0, 4.0D0,\n     +                  4.0D0, 4.0D0, 4.0D0, 4.0D0, 4.0D0, 0.2D0,\n     +                  -0.6D0, 0.3D0, 5.0D0, 5.0D0, 5.0D0, 5.0D0,\n     +                  5.0D0, 0.1D0, -0.3D0, 0.5D0, -0.1D0, 6.0D0,\n     +                  6.0D0, 6.0D0, 6.0D0, 0.1D0, 8.0D0, 8.0D0, 8.0D0,\n     +                  8.0D0, 8.0D0, 8.0D0, 8.0D0, 0.3D0, 9.0D0, 9.0D0,\n     +                  9.0D0, 9.0D0, 9.0D0, 9.0D0, 9.0D0, 0.3D0, 2.0D0,\n     +                  -0.4D0, 2.0D0, 2.0D0, 2.0D0, 2.0D0, 2.0D0,\n     +                  0.2D0, 3.0D0, -0.6D0, 5.0D0, 0.3D0, 2.0D0,\n     +                  2.0D0, 2.0D0, 0.1D0, 4.0D0, -0.3D0, 6.0D0,\n     +                  -0.5D0, 7.0D0, -0.1D0, 3.0D0/\n      DATA              DTRUE1/0.0D0, 0.3D0, 0.5D0, 0.7D0, 0.6D0/\n      DATA              DTRUE3/0.0D0, 0.3D0, 0.7D0, 1.1D0, 1.0D0/\n      DATA              DTRUE5/0.10D0, 2.0D0, 2.0D0, 2.0D0, 2.0D0,\n     +                  2.0D0, 2.0D0, 2.0D0, -0.3D0, 3.0D0, 3.0D0,\n     +                  3.0D0, 3.0D0, 3.0D0, 3.0D0, 3.0D0, 0.0D0, 0.0D0,\n     +                  4.0D0, 4.0D0, 4.0D0, 4.0D0, 4.0D0, 4.0D0,\n     +                  0.20D0, -0.60D0, 0.30D0, 5.0D0, 5.0D0, 5.0D0,\n     +                  5.0D0, 5.0D0, 0.03D0, -0.09D0, 0.15D0, -0.03D0,\n     +                  6.0D0, 6.0D0, 6.0D0, 6.0D0, 0.10D0, 8.0D0,\n     +                  8.0D0, 8.0D0, 8.0D0, 8.0D0, 8.0D0, 8.0D0,\n     +                  0.09D0, 9.0D0, 9.0D0, 9.0D0, 9.0D0, 9.0D0,\n     +                  9.0D0, 9.0D0, 0.09D0, 2.0D0, -0.12D0, 2.0D0,\n     +                  2.0D0, 2.0D0, 2.0D0, 2.0D0, 0.06D0, 3.0D0,\n     +                  -0.18D0, 5.0D0, 0.09D0, 2.0D0, 2.0D0, 2.0D0,\n     +                  0.03D0, 4.0D0, -0.09D0, 6.0D0, -0.15D0, 7.0D0,\n     +                  -0.03D0, 3.0D0/\n      DATA              ITRUE2/0, 1, 2, 2, 3/\n*     .. Executable Statements ..\n      DO 80 INCX = 1, 2\n         DO 60 NP1 = 1, 5\n            N = NP1 - 1\n            LEN = 2*MAX(N,1)\n*           .. Set vector arguments ..\n            DO 20 I = 1, LEN\n               SX(I) = DV(I,NP1,INCX)\n   20       CONTINUE\n*\n            IF (ICASE.EQ.7) THEN\n*              .. DNRM2 ..\n               STEMP(1) = DTRUE1(NP1)\n               CALL STEST1(DNRM2(N,SX,INCX),STEMP(1),STEMP,SFAC)\n            ELSE IF (ICASE.EQ.8) THEN\n*              .. DASUM ..\n               STEMP(1) = DTRUE3(NP1)\n               CALL STEST1(DASUM(N,SX,INCX),STEMP(1),STEMP,SFAC)\n            ELSE IF (ICASE.EQ.9) THEN\n*              .. DSCAL ..\n               CALL DSCAL(N,SA((INCX-1)*5+NP1),SX,INCX)\n               DO 40 I = 1, LEN\n                  STRUE(I) = DTRUE5(I,NP1,INCX)\n   40          CONTINUE\n               CALL STEST(LEN,SX,STRUE,STRUE,SFAC)\n            ELSE IF (ICASE.EQ.10) THEN\n*              .. IDAMAX ..\n               CALL ITEST1(IDAMAX(N,SX,INCX),ITRUE2(NP1))\n            ELSE\n               WRITE (NOUT,*) ' Shouldn''t be here in CHECK1'\n               STOP\n            END IF\n   60    CONTINUE\n   80 CONTINUE\n      RETURN\n      END\n      SUBROUTINE CHECK2(SFAC)\n*     .. Parameters ..\n      INTEGER           NOUT\n      PARAMETER         (NOUT=6)\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION  SFAC\n*     .. Scalars in Common ..\n      INTEGER           ICASE, INCX, INCY, N\n      LOGICAL           PASS\n*     .. Local Scalars ..\n      DOUBLE PRECISION  SA\n      INTEGER           I, J, KI, KN, KNI, KPAR, KSIZE, LENX, LENY,\n     $                  MX, MY \n*     .. Local Arrays ..\n      DOUBLE PRECISION  DT10X(7,4,4), DT10Y(7,4,4), DT7(4,4),\n     $                  DT8(7,4,4), DX1(7),\n     $                  DY1(7), SSIZE1(4), SSIZE2(14,2), SSIZE(7),\n     $                  STX(7), STY(7), SX(7), SY(7),\n     $                  DPAR(5,4), DT19X(7,4,16),DT19XA(7,4,4),\n     $                  DT19XB(7,4,4), DT19XC(7,4,4),DT19XD(7,4,4),\n     $                  DT19Y(7,4,16), DT19YA(7,4,4),DT19YB(7,4,4),\n     $                  DT19YC(7,4,4), DT19YD(7,4,4), DTEMP(5)\n      INTEGER           INCXS(4), INCYS(4), LENS(4,2), NS(4)\n*     .. External Functions ..\n      DOUBLE PRECISION  DDOT, DSDOT\n      EXTERNAL          DDOT, DSDOT\n*     .. External Subroutines ..\n      EXTERNAL          DAXPY, DCOPY, DROTM, DSWAP, STEST, STEST1\n*     .. Intrinsic Functions ..\n      INTRINSIC         ABS, MIN\n*     .. Common blocks ..\n      COMMON            /COMBLA/ICASE, N, INCX, INCY, PASS\n*     .. Data statements ..\n      EQUIVALENCE (DT19X(1,1,1),DT19XA(1,1,1)),(DT19X(1,1,5),\n     A   DT19XB(1,1,1)),(DT19X(1,1,9),DT19XC(1,1,1)),\n     B   (DT19X(1,1,13),DT19XD(1,1,1))\n      EQUIVALENCE (DT19Y(1,1,1),DT19YA(1,1,1)),(DT19Y(1,1,5),\n     A   DT19YB(1,1,1)),(DT19Y(1,1,9),DT19YC(1,1,1)),\n     B   (DT19Y(1,1,13),DT19YD(1,1,1))\n\n      DATA              SA/0.3D0/\n      DATA              INCXS/1, 2, -2, -1/\n      DATA              INCYS/1, -2, 1, -2/\n      DATA              LENS/1, 1, 2, 4, 1, 1, 3, 7/\n      DATA              NS/0, 1, 2, 4/\n      DATA              DX1/0.6D0, 0.1D0, -0.5D0, 0.8D0, 0.9D0, -0.3D0,\n     +                  -0.4D0/\n      DATA              DY1/0.5D0, -0.9D0, 0.3D0, 0.7D0, -0.6D0, 0.2D0,\n     +                  0.8D0/\n      DATA              DT7/0.0D0, 0.30D0, 0.21D0, 0.62D0, 0.0D0,\n     +                  0.30D0, -0.07D0, 0.85D0, 0.0D0, 0.30D0, -0.79D0,\n     +                  -0.74D0, 0.0D0, 0.30D0, 0.33D0, 1.27D0/\n      DATA              DT8/0.5D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.0D0, 0.68D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.0D0, 0.0D0, 0.68D0, -0.87D0, 0.0D0, 0.0D0,\n     +                  0.0D0, 0.0D0, 0.0D0, 0.68D0, -0.87D0, 0.15D0,\n     +                  0.94D0, 0.0D0, 0.0D0, 0.0D0, 0.5D0, 0.0D0,\n     +                  0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.68D0,\n     +                  0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.35D0, -0.9D0, 0.48D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.0D0, 0.38D0, -0.9D0, 0.57D0, 0.7D0, -0.75D0,\n     +                  0.2D0, 0.98D0, 0.5D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.0D0, 0.0D0, 0.0D0, 0.68D0, 0.0D0, 0.0D0,\n     +                  0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.35D0, -0.72D0,\n     +                  0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.38D0,\n     +                  -0.63D0, 0.15D0, 0.88D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.5D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.68D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.0D0, 0.68D0, -0.9D0, 0.33D0, 0.0D0, 0.0D0,\n     +                  0.0D0, 0.0D0, 0.68D0, -0.9D0, 0.33D0, 0.7D0,\n     +                  -0.75D0, 0.2D0, 1.04D0/\n      DATA              DT10X/0.6D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.0D0, 0.5D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.0D0, 0.5D0, -0.9D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.0D0, 0.0D0, 0.5D0, -0.9D0, 0.3D0, 0.7D0,\n     +                  0.0D0, 0.0D0, 0.0D0, 0.6D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.0D0, 0.0D0, 0.0D0, 0.5D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.0D0, 0.0D0, 0.0D0, 0.3D0, 0.1D0, 0.5D0, 0.0D0,\n     +                  0.0D0, 0.0D0, 0.0D0, 0.8D0, 0.1D0, -0.6D0,\n     +                  0.8D0, 0.3D0, -0.3D0, 0.5D0, 0.6D0, 0.0D0,\n     +                  0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.5D0, 0.0D0,\n     +                  0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, -0.9D0,\n     +                  0.1D0, 0.5D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.7D0,\n     +                  0.1D0, 0.3D0, 0.8D0, -0.9D0, -0.3D0, 0.5D0,\n     +                  0.6D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.5D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.5D0, 0.3D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.5D0, 0.3D0, -0.6D0, 0.8D0, 0.0D0, 0.0D0,\n     +                  0.0D0/\n      DATA              DT10Y/0.5D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.0D0, 0.6D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.0D0, 0.6D0, 0.1D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.0D0, 0.6D0, 0.1D0, -0.5D0, 0.8D0, 0.0D0,\n     +                  0.0D0, 0.0D0, 0.5D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.0D0, 0.0D0, 0.6D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.0D0, 0.0D0, -0.5D0, -0.9D0, 0.6D0, 0.0D0,\n     +                  0.0D0, 0.0D0, 0.0D0, -0.4D0, -0.9D0, 0.9D0,\n     +                  0.7D0, -0.5D0, 0.2D0, 0.6D0, 0.5D0, 0.0D0,\n     +                  0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.6D0, 0.0D0,\n     +                  0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, -0.5D0,\n     +                  0.6D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  -0.4D0, 0.9D0, -0.5D0, 0.6D0, 0.0D0, 0.0D0,\n     +                  0.0D0, 0.5D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.0D0, 0.6D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.0D0, 0.6D0, -0.9D0, 0.1D0, 0.0D0, 0.0D0,\n     +                  0.0D0, 0.0D0, 0.6D0, -0.9D0, 0.1D0, 0.7D0,\n     +                  -0.5D0, 0.2D0, 0.8D0/\n      DATA              SSIZE1/0.0D0, 0.3D0, 1.6D0, 3.2D0/\n      DATA              SSIZE2/0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.0D0, 1.17D0, 1.17D0, 1.17D0, 1.17D0, 1.17D0,\n     +                  1.17D0, 1.17D0, 1.17D0, 1.17D0, 1.17D0, 1.17D0,\n     +                  1.17D0, 1.17D0, 1.17D0/\n*\n*                         FOR DROTM\n*\n      DATA DPAR/-2.D0,  0.D0,0.D0,0.D0,0.D0,\n     A          -1.D0,  2.D0, -3.D0, -4.D0,  5.D0,\n     B           0.D0,  0.D0,  2.D0, -3.D0,  0.D0,\n     C           1.D0,  5.D0,  2.D0,  0.D0, -4.D0/\n*                        TRUE X RESULTS F0R ROTATIONS DROTM\n      DATA DT19XA/.6D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     A            .6D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     B            .6D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     C            .6D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     D            .6D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     E           -.8D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     F           -.9D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     G           3.5D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     H            .6D0,   .1D0,             0.D0,0.D0,0.D0,0.D0,0.D0,\n     I           -.8D0,  3.8D0,             0.D0,0.D0,0.D0,0.D0,0.D0,\n     J           -.9D0,  2.8D0,             0.D0,0.D0,0.D0,0.D0,0.D0,\n     K           3.5D0,  -.4D0,             0.D0,0.D0,0.D0,0.D0,0.D0,\n     L            .6D0,   .1D0,  -.5D0,   .8D0,          0.D0,0.D0,0.D0,\n     M           -.8D0,  3.8D0, -2.2D0, -1.2D0,          0.D0,0.D0,0.D0,\n     N           -.9D0,  2.8D0, -1.4D0, -1.3D0,          0.D0,0.D0,0.D0,\n     O           3.5D0,  -.4D0, -2.2D0,  4.7D0,          0.D0,0.D0,0.D0/\n*\n      DATA DT19XB/.6D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     A            .6D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     B            .6D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     C            .6D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     D            .6D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     E           -.8D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     F           -.9D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     G           3.5D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     H            .6D0,   .1D0,  -.5D0,             0.D0,0.D0,0.D0,0.D0,\n     I           0.D0,    .1D0, -3.0D0,             0.D0,0.D0,0.D0,0.D0,\n     J           -.3D0,   .1D0, -2.0D0,             0.D0,0.D0,0.D0,0.D0,\n     K           3.3D0,   .1D0, -2.0D0,             0.D0,0.D0,0.D0,0.D0,\n     L            .6D0,   .1D0,  -.5D0,   .8D0,   .9D0,  -.3D0,  -.4D0,\n     M          -2.0D0,   .1D0,  1.4D0,   .8D0,   .6D0,  -.3D0, -2.8D0,\n     N          -1.8D0,   .1D0,  1.3D0,   .8D0,  0.D0,   -.3D0, -1.9D0,\n     O           3.8D0,   .1D0, -3.1D0,   .8D0,  4.8D0,  -.3D0, -1.5D0 /\n*\n      DATA DT19XC/.6D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     A            .6D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     B            .6D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     C            .6D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     D            .6D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     E           -.8D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     F           -.9D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     G           3.5D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     H            .6D0,   .1D0,  -.5D0,             0.D0,0.D0,0.D0,0.D0,\n     I           4.8D0,   .1D0, -3.0D0,             0.D0,0.D0,0.D0,0.D0,\n     J           3.3D0,   .1D0, -2.0D0,             0.D0,0.D0,0.D0,0.D0,\n     K           2.1D0,   .1D0, -2.0D0,             0.D0,0.D0,0.D0,0.D0,\n     L            .6D0,   .1D0,  -.5D0,   .8D0,   .9D0,  -.3D0,  -.4D0,\n     M          -1.6D0,   .1D0, -2.2D0,   .8D0,  5.4D0,  -.3D0, -2.8D0,\n     N          -1.5D0,   .1D0, -1.4D0,   .8D0,  3.6D0,  -.3D0, -1.9D0,\n     O           3.7D0,   .1D0, -2.2D0,   .8D0,  3.6D0,  -.3D0, -1.5D0 /\n*\n      DATA DT19XD/.6D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     A            .6D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     B            .6D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     C            .6D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     D            .6D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     E           -.8D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     F           -.9D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     G           3.5D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     H            .6D0,   .1D0,             0.D0,0.D0,0.D0,0.D0,0.D0,\n     I           -.8D0, -1.0D0,             0.D0,0.D0,0.D0,0.D0,0.D0,\n     J           -.9D0,  -.8D0,             0.D0,0.D0,0.D0,0.D0,0.D0,\n     K           3.5D0,   .8D0,             0.D0,0.D0,0.D0,0.D0,0.D0,\n     L            .6D0,   .1D0,  -.5D0,   .8D0,          0.D0,0.D0,0.D0,\n     M           -.8D0, -1.0D0,  1.4D0, -1.6D0,          0.D0,0.D0,0.D0,\n     N           -.9D0,  -.8D0,  1.3D0, -1.6D0,          0.D0,0.D0,0.D0,\n     O           3.5D0,   .8D0, -3.1D0,  4.8D0,          0.D0,0.D0,0.D0/\n*                        TRUE Y RESULTS FOR ROTATIONS DROTM\n      DATA DT19YA/.5D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     A            .5D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     B            .5D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     C            .5D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     D            .5D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     E            .7D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     F           1.7D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     G          -2.6D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     H            .5D0,  -.9D0,             0.D0,0.D0,0.D0,0.D0,0.D0,\n     I            .7D0, -4.8D0,             0.D0,0.D0,0.D0,0.D0,0.D0,\n     J           1.7D0,  -.7D0,             0.D0,0.D0,0.D0,0.D0,0.D0,\n     K          -2.6D0,  3.5D0,             0.D0,0.D0,0.D0,0.D0,0.D0,\n     L            .5D0,  -.9D0,   .3D0,   .7D0,          0.D0,0.D0,0.D0,\n     M            .7D0, -4.8D0,  3.0D0,  1.1D0,          0.D0,0.D0,0.D0,\n     N           1.7D0,  -.7D0,  -.7D0,  2.3D0,          0.D0,0.D0,0.D0,\n     O          -2.6D0,  3.5D0,  -.7D0, -3.6D0,          0.D0,0.D0,0.D0/\n*\n      DATA DT19YB/.5D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     A            .5D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     B            .5D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     C            .5D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     D            .5D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     E            .7D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     F           1.7D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     G          -2.6D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     H            .5D0,  -.9D0,   .3D0,             0.D0,0.D0,0.D0,0.D0,\n     I           4.0D0,  -.9D0,  -.3D0,             0.D0,0.D0,0.D0,0.D0,\n     J           -.5D0,  -.9D0,  1.5D0,             0.D0,0.D0,0.D0,0.D0,\n     K          -1.5D0,  -.9D0, -1.8D0,             0.D0,0.D0,0.D0,0.D0,\n     L            .5D0,  -.9D0,   .3D0,   .7D0,  -.6D0,   .2D0,   .8D0,\n     M           3.7D0,  -.9D0, -1.2D0,   .7D0, -1.5D0,   .2D0,  2.2D0,\n     N           -.3D0,  -.9D0,  2.1D0,   .7D0, -1.6D0,   .2D0,  2.0D0,\n     O          -1.6D0,  -.9D0, -2.1D0,   .7D0,  2.9D0,   .2D0, -3.8D0 /\n*\n      DATA DT19YC/.5D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     A            .5D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     B            .5D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     C            .5D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     D            .5D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     E            .7D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     F           1.7D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     G          -2.6D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     H            .5D0,  -.9D0,             0.D0,0.D0,0.D0,0.D0,0.D0,\n     I           4.0D0, -6.3D0,             0.D0,0.D0,0.D0,0.D0,0.D0,\n     J           -.5D0,   .3D0,             0.D0,0.D0,0.D0,0.D0,0.D0,\n     K          -1.5D0,  3.0D0,             0.D0,0.D0,0.D0,0.D0,0.D0,\n     L            .5D0,  -.9D0,   .3D0,   .7D0,          0.D0,0.D0,0.D0,\n     M           3.7D0, -7.2D0,  3.0D0,  1.7D0,          0.D0,0.D0,0.D0,\n     N           -.3D0,   .9D0,  -.7D0,  1.9D0,          0.D0,0.D0,0.D0,\n     O          -1.6D0,  2.7D0,  -.7D0, -3.4D0,          0.D0,0.D0,0.D0/\n*\n      DATA DT19YD/.5D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     A            .5D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     B            .5D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     C            .5D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     D            .5D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     E            .7D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     F           1.7D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     G          -2.6D0,                  0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,\n     H            .5D0,  -.9D0,   .3D0,             0.D0,0.D0,0.D0,0.D0,\n     I            .7D0,  -.9D0,  1.2D0,             0.D0,0.D0,0.D0,0.D0,\n     J           1.7D0,  -.9D0,   .5D0,             0.D0,0.D0,0.D0,0.D0,\n     K          -2.6D0,  -.9D0, -1.3D0,             0.D0,0.D0,0.D0,0.D0,\n     L            .5D0,  -.9D0,   .3D0,   .7D0,  -.6D0,   .2D0,   .8D0,\n     M            .7D0,  -.9D0,  1.2D0,   .7D0, -1.5D0,   .2D0,  1.6D0,\n     N           1.7D0,  -.9D0,   .5D0,   .7D0, -1.6D0,   .2D0,  2.4D0,\n     O          -2.6D0,  -.9D0, -1.3D0,   .7D0,  2.9D0,   .2D0, -4.0D0 /\n*    \n*     .. Executable Statements ..\n*\n      DO 120 KI = 1, 4\n         INCX = INCXS(KI)\n         INCY = INCYS(KI)\n         MX = ABS(INCX)\n         MY = ABS(INCY)\n*\n         DO 100 KN = 1, 4\n            N = NS(KN)\n            KSIZE = MIN(2,KN)\n            LENX = LENS(KN,MX)\n            LENY = LENS(KN,MY)\n*           .. Initialize all argument arrays ..\n            DO 20 I = 1, 7\n               SX(I) = DX1(I)\n               SY(I) = DY1(I)\n   20       CONTINUE\n*\n            IF (ICASE.EQ.1) THEN\n*              .. DDOT ..\n               CALL STEST1(DDOT(N,SX,INCX,SY,INCY),DT7(KN,KI),SSIZE1(KN)\n     +                     ,SFAC)\n            ELSE IF (ICASE.EQ.2) THEN\n*              .. DAXPY ..\n               CALL DAXPY(N,SA,SX,INCX,SY,INCY)\n               DO 40 J = 1, LENY\n                  STY(J) = DT8(J,KN,KI)\n   40          CONTINUE\n               CALL STEST(LENY,SY,STY,SSIZE2(1,KSIZE),SFAC)\n            ELSE IF (ICASE.EQ.5) THEN\n*              .. DCOPY ..\n               DO 60 I = 1, 7\n                  STY(I) = DT10Y(I,KN,KI)\n   60          CONTINUE\n               CALL DCOPY(N,SX,INCX,SY,INCY)\n               CALL STEST(LENY,SY,STY,SSIZE2(1,1),1.0D0)\n            ELSE IF (ICASE.EQ.6) THEN\n*              .. DSWAP ..\n               CALL DSWAP(N,SX,INCX,SY,INCY)\n               DO 80 I = 1, 7\n                  STX(I) = DT10X(I,KN,KI)\n                  STY(I) = DT10Y(I,KN,KI)\n   80          CONTINUE\n               CALL STEST(LENX,SX,STX,SSIZE2(1,1),1.0D0)\n               CALL STEST(LENY,SY,STY,SSIZE2(1,1),1.0D0)\n            ELSE IF (ICASE.EQ.12) THEN\n*              .. DROTM ..\n               KNI=KN+4*(KI-1)\n               DO KPAR=1,4\n                  DO I=1,7\n                     SX(I) = DX1(I)\n                     SY(I) = DY1(I)\n                     STX(I)= DT19X(I,KPAR,KNI)\n                     STY(I)= DT19Y(I,KPAR,KNI)\n                  END DO\n*\n                  DO I=1,5\n                     DTEMP(I) = DPAR(I,KPAR)\n                  END DO\n*\n                  DO  I=1,LENX\n                     SSIZE(I)=STX(I)\n                  END DO\n*                   SEE REMARK ABOVE ABOUT DT11X(1,2,7)\n*                       AND DT11X(5,3,8).\n                  IF ((KPAR .EQ. 2) .AND. (KNI .EQ. 7))\n     $               SSIZE(1) = 2.4D0\n                  IF ((KPAR .EQ. 3) .AND. (KNI .EQ. 8))\n     $               SSIZE(5) = 1.8D0\n*\n                  CALL   DROTM(N,SX,INCX,SY,INCY,DTEMP)\n                  CALL   STEST(LENX,SX,STX,SSIZE,SFAC)\n                  CALL   STEST(LENY,SY,STY,STY,SFAC)\n               END DO\n            ELSE IF (ICASE.EQ.13) THEN\n*              .. DSDOT ..\n            CALL TESTDSDOT(REAL(DSDOT(N,REAL(SX),INCX,REAL(SY),INCY)),\n     $                 REAL(DT7(KN,KI)),REAL(SSIZE1(KN)), .3125E-1)\n            ELSE\n               WRITE (NOUT,*) ' Shouldn''t be here in CHECK2'\n               STOP\n            END IF\n  100    CONTINUE\n  120 CONTINUE\n      RETURN\n      END\n      SUBROUTINE CHECK3(SFAC)\n*     .. Parameters ..\n      INTEGER           NOUT\n      PARAMETER         (NOUT=6)\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION  SFAC\n*     .. Scalars in Common ..\n      INTEGER           ICASE, INCX, INCY, N\n      LOGICAL           PASS\n*     .. Local Scalars ..\n      DOUBLE PRECISION  SC, SS\n      INTEGER           I, K, KI, KN, KSIZE, LENX, LENY, MX, MY\n*     .. Local Arrays ..\n      DOUBLE PRECISION  COPYX(5), COPYY(5), DT9X(7,4,4), DT9Y(7,4,4),\n     +                  DX1(7), DY1(7), MWPC(11), MWPS(11), MWPSTX(5),\n     +                  MWPSTY(5), MWPTX(11,5), MWPTY(11,5), MWPX(5),\n     +                  MWPY(5), SSIZE2(14,2), STX(7), STY(7), SX(7),\n     +                  SY(7)\n      INTEGER           INCXS(4), INCYS(4), LENS(4,2), MWPINX(11),\n     +                  MWPINY(11), MWPN(11), NS(4)\n*     .. External Subroutines ..\n      EXTERNAL          DROT, STEST\n*     .. Intrinsic Functions ..\n      INTRINSIC         ABS, MIN\n*     .. Common blocks ..\n      COMMON            /COMBLA/ICASE, N, INCX, INCY, PASS\n*     .. Data statements ..\n      DATA              INCXS/1, 2, -2, -1/\n      DATA              INCYS/1, -2, 1, -2/\n      DATA              LENS/1, 1, 2, 4, 1, 1, 3, 7/\n      DATA              NS/0, 1, 2, 4/\n      DATA              DX1/0.6D0, 0.1D0, -0.5D0, 0.8D0, 0.9D0, -0.3D0,\n     +                  -0.4D0/\n      DATA              DY1/0.5D0, -0.9D0, 0.3D0, 0.7D0, -0.6D0, 0.2D0,\n     +                  0.8D0/\n      DATA              SC, SS/0.8D0, 0.6D0/\n      DATA              DT9X/0.6D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.0D0, 0.78D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.0D0, 0.0D0, 0.78D0, -0.46D0, 0.0D0, 0.0D0,\n     +                  0.0D0, 0.0D0, 0.0D0, 0.78D0, -0.46D0, -0.22D0,\n     +                  1.06D0, 0.0D0, 0.0D0, 0.0D0, 0.6D0, 0.0D0,\n     +                  0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.78D0,\n     +                  0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.66D0, 0.1D0, -0.1D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.0D0, 0.96D0, 0.1D0, -0.76D0, 0.8D0, 0.90D0,\n     +                  -0.3D0, -0.02D0, 0.6D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.0D0, 0.0D0, 0.0D0, 0.78D0, 0.0D0, 0.0D0,\n     +                  0.0D0, 0.0D0, 0.0D0, 0.0D0, -0.06D0, 0.1D0,\n     +                  -0.1D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.90D0,\n     +                  0.1D0, -0.22D0, 0.8D0, 0.18D0, -0.3D0, -0.02D0,\n     +                  0.6D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.78D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.0D0, 0.78D0, 0.26D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.0D0, 0.0D0, 0.78D0, 0.26D0, -0.76D0, 1.12D0,\n     +                  0.0D0, 0.0D0, 0.0D0/\n      DATA              DT9Y/0.5D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.0D0, 0.04D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.0D0, 0.0D0, 0.04D0, -0.78D0, 0.0D0, 0.0D0,\n     +                  0.0D0, 0.0D0, 0.0D0, 0.04D0, -0.78D0, 0.54D0,\n     +                  0.08D0, 0.0D0, 0.0D0, 0.0D0, 0.5D0, 0.0D0,\n     +                  0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.04D0,\n     +                  0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.7D0,\n     +                  -0.9D0, -0.12D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.64D0, -0.9D0, -0.30D0, 0.7D0, -0.18D0, 0.2D0,\n     +                  0.28D0, 0.5D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.0D0, 0.0D0, 0.04D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.0D0, 0.0D0, 0.0D0, 0.7D0, -1.08D0, 0.0D0,\n     +                  0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.64D0, -1.26D0,\n     +                  0.54D0, 0.20D0, 0.0D0, 0.0D0, 0.0D0, 0.5D0,\n     +                  0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.04D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.0D0, 0.04D0, -0.9D0, 0.18D0, 0.0D0, 0.0D0,\n     +                  0.0D0, 0.0D0, 0.04D0, -0.9D0, 0.18D0, 0.7D0,\n     +                  -0.18D0, 0.2D0, 0.16D0/\n      DATA              SSIZE2/0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0, 0.0D0,\n     +                  0.0D0, 1.17D0, 1.17D0, 1.17D0, 1.17D0, 1.17D0,\n     +                  1.17D0, 1.17D0, 1.17D0, 1.17D0, 1.17D0, 1.17D0,\n     +                  1.17D0, 1.17D0, 1.17D0/\n*     .. Executable Statements ..\n*\n      DO 60 KI = 1, 4\n         INCX = INCXS(KI)\n         INCY = INCYS(KI)\n         MX = ABS(INCX)\n         MY = ABS(INCY)\n*\n         DO 40 KN = 1, 4\n            N = NS(KN)\n            KSIZE = MIN(2,KN)\n            LENX = LENS(KN,MX)\n            LENY = LENS(KN,MY)\n*\n            IF (ICASE.EQ.4) THEN\n*              .. DROT ..\n               DO 20 I = 1, 7\n                  SX(I) = DX1(I)\n                  SY(I) = DY1(I)\n                  STX(I) = DT9X(I,KN,KI)\n                  STY(I) = DT9Y(I,KN,KI)\n   20          CONTINUE\n               CALL DROT(N,SX,INCX,SY,INCY,SC,SS)\n               CALL STEST(LENX,SX,STX,SSIZE2(1,KSIZE),SFAC)\n               CALL STEST(LENY,SY,STY,SSIZE2(1,KSIZE),SFAC)\n            ELSE\n               WRITE (NOUT,*) ' Shouldn''t be here in CHECK3'\n               STOP\n            END IF\n   40    CONTINUE\n   60 CONTINUE\n*\n      MWPC(1) = 1\n      DO 80 I = 2, 11\n         MWPC(I) = 0\n   80 CONTINUE\n      MWPS(1) = 0\n      DO 100 I = 2, 6\n         MWPS(I) = 1\n  100 CONTINUE\n      DO 120 I = 7, 11\n         MWPS(I) = -1\n  120 CONTINUE\n      MWPINX(1) = 1\n      MWPINX(2) = 1\n      MWPINX(3) = 1\n      MWPINX(4) = -1\n      MWPINX(5) = 1\n      MWPINX(6) = -1\n      MWPINX(7) = 1\n      MWPINX(8) = 1\n      MWPINX(9) = -1\n      MWPINX(10) = 1\n      MWPINX(11) = -1\n      MWPINY(1) = 1\n      MWPINY(2) = 1\n      MWPINY(3) = -1\n      MWPINY(4) = -1\n      MWPINY(5) = 2\n      MWPINY(6) = 1\n      MWPINY(7) = 1\n      MWPINY(8) = -1\n      MWPINY(9) = -1\n      MWPINY(10) = 2\n      MWPINY(11) = 1\n      DO 140 I = 1, 11\n         MWPN(I) = 5\n  140 CONTINUE\n      MWPN(5) = 3\n      MWPN(10) = 3\n      DO 160 I = 1, 5\n         MWPX(I) = I\n         MWPY(I) = I\n         MWPTX(1,I) = I\n         MWPTY(1,I) = I\n         MWPTX(2,I) = I\n         MWPTY(2,I) = -I\n         MWPTX(3,I) = 6 - I\n         MWPTY(3,I) = I - 6\n         MWPTX(4,I) = I\n         MWPTY(4,I) = -I\n         MWPTX(6,I) = 6 - I\n         MWPTY(6,I) = I - 6\n         MWPTX(7,I) = -I\n         MWPTY(7,I) = I\n         MWPTX(8,I) = I - 6\n         MWPTY(8,I) = 6 - I\n         MWPTX(9,I) = -I\n         MWPTY(9,I) = I\n         MWPTX(11,I) = I - 6\n         MWPTY(11,I) = 6 - I\n  160 CONTINUE\n      MWPTX(5,1) = 1\n      MWPTX(5,2) = 3\n      MWPTX(5,3) = 5\n      MWPTX(5,4) = 4\n      MWPTX(5,5) = 5\n      MWPTY(5,1) = -1\n      MWPTY(5,2) = 2\n      MWPTY(5,3) = -2\n      MWPTY(5,4) = 4\n      MWPTY(5,5) = -3\n      MWPTX(10,1) = -1\n      MWPTX(10,2) = -3\n      MWPTX(10,3) = -5\n      MWPTX(10,4) = 4\n      MWPTX(10,5) = 5\n      MWPTY(10,1) = 1\n      MWPTY(10,2) = 2\n      MWPTY(10,3) = 2\n      MWPTY(10,4) = 4\n      MWPTY(10,5) = 3\n      DO 200 I = 1, 11\n         INCX = MWPINX(I)\n         INCY = MWPINY(I)\n         DO 180 K = 1, 5\n            COPYX(K) = MWPX(K)\n            COPYY(K) = MWPY(K)\n            MWPSTX(K) = MWPTX(I,K)\n            MWPSTY(K) = MWPTY(I,K)\n  180    CONTINUE\n         CALL DROT(MWPN(I),COPYX,INCX,COPYY,INCY,MWPC(I),MWPS(I))\n         CALL STEST(5,COPYX,MWPSTX,MWPSTX,SFAC)\n         CALL STEST(5,COPYY,MWPSTY,MWPSTY,SFAC)\n  200 CONTINUE\n      RETURN\n      END\n      SUBROUTINE STEST(LEN,SCOMP,STRUE,SSIZE,SFAC)\n*     ********************************* STEST **************************\n*\n*     THIS SUBR COMPARES ARRAYS  SCOMP() AND STRUE() OF LENGTH LEN TO\n*     SEE IF THE TERM BY TERM DIFFERENCES, MULTIPLIED BY SFAC, ARE\n*     NEGLIGIBLE.\n*\n*     C. L. LAWSON, JPL, 1974 DEC 10\n*\n*     .. Parameters ..\n      INTEGER          NOUT\n      DOUBLE PRECISION ZERO\n      PARAMETER        (NOUT=6, ZERO=0.0D0)\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION SFAC\n      INTEGER          LEN\n*     .. Array Arguments ..\n      DOUBLE PRECISION SCOMP(LEN), SSIZE(LEN), STRUE(LEN)\n*     .. Scalars in Common ..\n      INTEGER          ICASE, INCX, INCY, N\n      LOGICAL          PASS\n*     .. Local Scalars ..\n      DOUBLE PRECISION SD\n      INTEGER          I\n*     .. External Functions ..\n      DOUBLE PRECISION SDIFF\n      EXTERNAL         SDIFF\n*     .. Intrinsic Functions ..\n      INTRINSIC        ABS\n*     .. Common blocks ..\n      COMMON           /COMBLA/ICASE, N, INCX, INCY, PASS\n*     .. Executable Statements ..\n*\n      DO 40 I = 1, LEN\n         SD = SCOMP(I) - STRUE(I)\n         IF (ABS(SFAC*SD) .LE. ABS(SSIZE(I))*EPSILON(ZERO))\n     +       GO TO 40\n*\n*                             HERE    SCOMP(I) IS NOT CLOSE TO STRUE(I).\n*\n         IF ( .NOT. PASS) GO TO 20\n*                             PRINT FAIL MESSAGE AND HEADER.\n         PASS = .FALSE.\n         WRITE (NOUT,99999)\n         WRITE (NOUT,99998)\n   20    WRITE (NOUT,99997) ICASE, N, INCX, INCY, I, SCOMP(I),\n     +     STRUE(I), SD, SSIZE(I)\n   40 CONTINUE\n      RETURN\n*\n99999 FORMAT ('                                       FAIL')\n99998 FORMAT (/' CASE  N INCX INCY  I                            ',\n     +       ' COMP(I)                             TRUE(I)  DIFFERENCE',\n     +       '     SIZE(I)',/1X)\n99997 FORMAT (1X,I4,I3,2I5,I3,2D36.8,2D12.4)\n      END\n      SUBROUTINE TESTDSDOT(SCOMP,STRUE,SSIZE,SFAC)\n*     ********************************* STEST **************************\n*\n*     THIS SUBR COMPARES ARRAYS  SCOMP() AND STRUE() OF LENGTH LEN TO\n*     SEE IF THE TERM BY TERM DIFFERENCES, MULTIPLIED BY SFAC, ARE\n*     NEGLIGIBLE.\n*\n*     C. L. LAWSON, JPL, 1974 DEC 10\n*\n*     .. Parameters ..\n      INTEGER          NOUT\n      REAL             ZERO\n      PARAMETER        (NOUT=6, ZERO=0.0E0)\n*     .. Scalar Arguments ..\n      REAL             SFAC, SCOMP, SSIZE, STRUE\n*     .. Scalars in Common ..\n      INTEGER          ICASE, INCX, INCY, N\n      LOGICAL          PASS\n*     .. Local Scalars ..\n      REAL             SD\n*     .. Intrinsic Functions ..\n      INTRINSIC        ABS\n*     .. Common blocks ..\n      COMMON           /COMBLA/ICASE, N, INCX, INCY, PASS\n*     .. Executable Statements ..\n*\n         SD = SCOMP - STRUE\n         IF (ABS(SFAC*SD) .LE. ABS(SSIZE) * EPSILON(ZERO))\n     +       GO TO 40\n*\n*                             HERE    SCOMP(I) IS NOT CLOSE TO STRUE(I).\n*\n         IF ( .NOT. PASS) GO TO 20\n*                             PRINT FAIL MESSAGE AND HEADER.\n         PASS = .FALSE.\n         WRITE (NOUT,99999)\n         WRITE (NOUT,99998)\n   20    WRITE (NOUT,99997) ICASE, N, INCX, INCY, SCOMP,\n     +     STRUE, SD, SSIZE\n   40 CONTINUE\n      RETURN\n*\n99999 FORMAT ('                                       FAIL')\n99998 FORMAT (/' CASE  N INCX INCY                           ',\n     +       ' COMP(I)                             TRUE(I)  DIFFERENCE',\n     +       '     SIZE(I)',/1X)\n99997 FORMAT (1X,I4,I3,1I5,I3,2E36.8,2E12.4)\n      END\n      SUBROUTINE STEST1(SCOMP1,STRUE1,SSIZE,SFAC)\n*     ************************* STEST1 *****************************\n*\n*     THIS IS AN INTERFACE SUBROUTINE TO ACCOMODATE THE FORTRAN\n*     REQUIREMENT THAT WHEN A DUMMY ARGUMENT IS AN ARRAY, THE\n*     ACTUAL ARGUMENT MUST ALSO BE AN ARRAY OR AN ARRAY ELEMENT.\n*\n*     C.L. LAWSON, JPL, 1978 DEC 6\n*\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION  SCOMP1, SFAC, STRUE1\n*     .. Array Arguments ..\n      DOUBLE PRECISION  SSIZE(*)\n*     .. Local Arrays ..\n      DOUBLE PRECISION  SCOMP(1), STRUE(1)\n*     .. External Subroutines ..\n      EXTERNAL          STEST\n*     .. Executable Statements ..\n*\n      SCOMP(1) = SCOMP1\n      STRUE(1) = STRUE1\n      CALL STEST(1,SCOMP,STRUE,SSIZE,SFAC)\n*\n      RETURN\n      END\n      DOUBLE PRECISION FUNCTION SDIFF(SA,SB)\n*     ********************************* SDIFF **************************\n*     COMPUTES DIFFERENCE OF TWO NUMBERS.  C. L. LAWSON, JPL 1974 FEB 15\n*\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION                SA, SB\n*     .. Executable Statements ..\n      SDIFF = SA - SB\n      RETURN\n      END\n      SUBROUTINE ITEST1(ICOMP,ITRUE)\n*     ********************************* ITEST1 *************************\n*\n*     THIS SUBROUTINE COMPARES THE VARIABLES ICOMP AND ITRUE FOR\n*     EQUALITY.\n*     C. L. LAWSON, JPL, 1974 DEC 10\n*\n*     .. Parameters ..\n      INTEGER           NOUT\n      PARAMETER         (NOUT=6)\n*     .. Scalar Arguments ..\n      INTEGER           ICOMP, ITRUE\n*     .. Scalars in Common ..\n      INTEGER           ICASE, INCX, INCY, N\n      LOGICAL           PASS\n*     .. Local Scalars ..\n      INTEGER           ID\n*     .. Common blocks ..\n      COMMON            /COMBLA/ICASE, N, INCX, INCY, PASS\n*     .. Executable Statements ..\n*\n      IF (ICOMP.EQ.ITRUE) GO TO 40\n*\n*                            HERE ICOMP IS NOT EQUAL TO ITRUE.\n*\n      IF ( .NOT. PASS) GO TO 20\n*                             PRINT FAIL MESSAGE AND HEADER.\n      PASS = .FALSE.\n      WRITE (NOUT,99999)\n      WRITE (NOUT,99998)\n   20 ID = ICOMP - ITRUE\n      WRITE (NOUT,99997) ICASE, N, INCX, INCY, ICOMP, ITRUE, ID\n   40 CONTINUE\n      RETURN\n*\n99999 FORMAT ('                                       FAIL')\n99998 FORMAT (/' CASE  N INCX INCY                               ',\n     +       ' COMP                                TRUE     DIFFERENCE',\n     +       /1X)\n99997 FORMAT (1X,I4,I3,2I5,2I36,I12)\n      END\n"
  },
  {
    "path": "libs/eigen/blas/testing/dblat2.f",
    "content": "      PROGRAM DBLAT2\n*\n*  Test program for the DOUBLE PRECISION Level 2 Blas.\n*\n*  The program must be driven by a short data file. The first 18 records\n*  of the file are read using list-directed input, the last 16 records\n*  are read using the format ( A6, L2 ). An annotated example of a data\n*  file can be obtained by deleting the first 3 characters from the\n*  following 34 lines:\n*  'DBLAT2.SUMM'     NAME OF SUMMARY OUTPUT FILE\n*  6                 UNIT NUMBER OF SUMMARY FILE\n*  'DBLAT2.SNAP'     NAME OF SNAPSHOT OUTPUT FILE\n*  -1                UNIT NUMBER OF SNAPSHOT FILE (NOT USED IF .LT. 0)\n*  F        LOGICAL FLAG, T TO REWIND SNAPSHOT FILE AFTER EACH RECORD.\n*  F        LOGICAL FLAG, T TO STOP ON FAILURES.\n*  T        LOGICAL FLAG, T TO TEST ERROR EXITS.\n*  16.0     THRESHOLD VALUE OF TEST RATIO\n*  6                 NUMBER OF VALUES OF N\n*  0 1 2 3 5 9       VALUES OF N\n*  4                 NUMBER OF VALUES OF K\n*  0 1 2 4           VALUES OF K\n*  4                 NUMBER OF VALUES OF INCX AND INCY\n*  1 2 -1 -2         VALUES OF INCX AND INCY\n*  3                 NUMBER OF VALUES OF ALPHA\n*  0.0 1.0 0.7       VALUES OF ALPHA\n*  3                 NUMBER OF VALUES OF BETA\n*  0.0 1.0 0.9       VALUES OF BETA\n*  DGEMV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  DGBMV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  DSYMV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  DSBMV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  DSPMV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  DTRMV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  DTBMV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  DTPMV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  DTRSV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  DTBSV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  DTPSV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  DGER   T PUT F FOR NO TEST. SAME COLUMNS.\n*  DSYR   T PUT F FOR NO TEST. SAME COLUMNS.\n*  DSPR   T PUT F FOR NO TEST. SAME COLUMNS.\n*  DSYR2  T PUT F FOR NO TEST. SAME COLUMNS.\n*  DSPR2  T PUT F FOR NO TEST. SAME COLUMNS.\n*\n*     See:\n*\n*        Dongarra J. J., Du Croz J. J., Hammarling S.  and Hanson R. J..\n*        An  extended  set of Fortran  Basic Linear Algebra Subprograms.\n*\n*        Technical  Memoranda  Nos. 41 (revision 3) and 81,  Mathematics\n*        and  Computer Science  Division,  Argonne  National Laboratory,\n*        9700 South Cass Avenue, Argonne, Illinois 60439, US.\n*\n*        Or\n*\n*        NAG  Technical Reports TR3/87 and TR4/87,  Numerical Algorithms\n*        Group  Ltd.,  NAG  Central  Office,  256  Banbury  Road, Oxford\n*        OX2 7DE, UK,  and  Numerical Algorithms Group Inc.,  1101  31st\n*        Street,  Suite 100,  Downers Grove,  Illinois 60515-1263,  USA.\n*\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Parameters ..\n      INTEGER            NIN\n      PARAMETER          ( NIN = 5 )\n      INTEGER            NSUBS\n      PARAMETER          ( NSUBS = 16 )\n      DOUBLE PRECISION   ZERO, HALF, ONE\n      PARAMETER          ( ZERO = 0.0D0, HALF = 0.5D0, ONE = 1.0D0 )\n      INTEGER            NMAX, INCMAX\n      PARAMETER          ( NMAX = 65, INCMAX = 2 )\n      INTEGER            NINMAX, NIDMAX, NKBMAX, NALMAX, NBEMAX\n      PARAMETER          ( NINMAX = 7, NIDMAX = 9, NKBMAX = 7,\n     $                   NALMAX = 7, NBEMAX = 7 )\n*     .. Local Scalars ..\n      DOUBLE PRECISION   EPS, ERR, THRESH\n      INTEGER            I, ISNUM, J, N, NALF, NBET, NIDIM, NINC, NKB,\n     $                   NOUT, NTRA\n      LOGICAL            FATAL, LTESTT, REWI, SAME, SFATAL, TRACE,\n     $                   TSTERR\n      CHARACTER*1        TRANS\n      CHARACTER*6        SNAMET\n      CHARACTER*32       SNAPS, SUMMRY\n*     .. Local Arrays ..\n      DOUBLE PRECISION   A( NMAX, NMAX ), AA( NMAX*NMAX ),\n     $                   ALF( NALMAX ), AS( NMAX*NMAX ), BET( NBEMAX ),\n     $                   G( NMAX ), X( NMAX ), XS( NMAX*INCMAX ),\n     $                   XX( NMAX*INCMAX ), Y( NMAX ),\n     $                   YS( NMAX*INCMAX ), YT( NMAX ),\n     $                   YY( NMAX*INCMAX ), Z( 2*NMAX )\n      INTEGER            IDIM( NIDMAX ), INC( NINMAX ), KB( NKBMAX )\n      LOGICAL            LTEST( NSUBS )\n      CHARACTER*6        SNAMES( NSUBS )\n*     .. External Functions ..\n      DOUBLE PRECISION   DDIFF\n      LOGICAL            LDE\n      EXTERNAL           DDIFF, LDE\n*     .. External Subroutines ..\n      EXTERNAL           DCHK1, DCHK2, DCHK3, DCHK4, DCHK5, DCHK6,\n     $                   DCHKE, DMVCH\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, MAX, MIN\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n      CHARACTER*6        SRNAMT\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n      COMMON             /SRNAMC/SRNAMT\n*     .. Data statements ..\n      DATA               SNAMES/'DGEMV ', 'DGBMV ', 'DSYMV ', 'DSBMV ',\n     $                   'DSPMV ', 'DTRMV ', 'DTBMV ', 'DTPMV ',\n     $                   'DTRSV ', 'DTBSV ', 'DTPSV ', 'DGER  ',\n     $                   'DSYR  ', 'DSPR  ', 'DSYR2 ', 'DSPR2 '/\n*     .. Executable Statements ..\n*\n*     Read name and unit number for summary output file and open file.\n*\n      READ( NIN, FMT = * )SUMMRY\n      READ( NIN, FMT = * )NOUT\n      OPEN( NOUT, FILE = SUMMRY, STATUS = 'NEW' )\n      NOUTC = NOUT\n*\n*     Read name and unit number for snapshot output file and open file.\n*\n      READ( NIN, FMT = * )SNAPS\n      READ( NIN, FMT = * )NTRA\n      TRACE = NTRA.GE.0\n      IF( TRACE )THEN\n         OPEN( NTRA, FILE = SNAPS, STATUS = 'NEW' )\n      END IF\n*     Read the flag that directs rewinding of the snapshot file.\n      READ( NIN, FMT = * )REWI\n      REWI = REWI.AND.TRACE\n*     Read the flag that directs stopping on any failure.\n      READ( NIN, FMT = * )SFATAL\n*     Read the flag that indicates whether error exits are to be tested.\n      READ( NIN, FMT = * )TSTERR\n*     Read the threshold value of the test ratio\n      READ( NIN, FMT = * )THRESH\n*\n*     Read and check the parameter values for the tests.\n*\n*     Values of N\n      READ( NIN, FMT = * )NIDIM\n      IF( NIDIM.LT.1.OR.NIDIM.GT.NIDMAX )THEN\n         WRITE( NOUT, FMT = 9997 )'N', NIDMAX\n         GO TO 230\n      END IF\n      READ( NIN, FMT = * )( IDIM( I ), I = 1, NIDIM )\n      DO 10 I = 1, NIDIM\n         IF( IDIM( I ).LT.0.OR.IDIM( I ).GT.NMAX )THEN\n            WRITE( NOUT, FMT = 9996 )NMAX\n            GO TO 230\n         END IF\n   10 CONTINUE\n*     Values of K\n      READ( NIN, FMT = * )NKB\n      IF( NKB.LT.1.OR.NKB.GT.NKBMAX )THEN\n         WRITE( NOUT, FMT = 9997 )'K', NKBMAX\n         GO TO 230\n      END IF\n      READ( NIN, FMT = * )( KB( I ), I = 1, NKB )\n      DO 20 I = 1, NKB\n         IF( KB( I ).LT.0 )THEN\n            WRITE( NOUT, FMT = 9995 )\n            GO TO 230\n         END IF\n   20 CONTINUE\n*     Values of INCX and INCY\n      READ( NIN, FMT = * )NINC\n      IF( NINC.LT.1.OR.NINC.GT.NINMAX )THEN\n         WRITE( NOUT, FMT = 9997 )'INCX AND INCY', NINMAX\n         GO TO 230\n      END IF\n      READ( NIN, FMT = * )( INC( I ), I = 1, NINC )\n      DO 30 I = 1, NINC\n         IF( INC( I ).EQ.0.OR.ABS( INC( I ) ).GT.INCMAX )THEN\n            WRITE( NOUT, FMT = 9994 )INCMAX\n            GO TO 230\n         END IF\n   30 CONTINUE\n*     Values of ALPHA\n      READ( NIN, FMT = * )NALF\n      IF( NALF.LT.1.OR.NALF.GT.NALMAX )THEN\n         WRITE( NOUT, FMT = 9997 )'ALPHA', NALMAX\n         GO TO 230\n      END IF\n      READ( NIN, FMT = * )( ALF( I ), I = 1, NALF )\n*     Values of BETA\n      READ( NIN, FMT = * )NBET\n      IF( NBET.LT.1.OR.NBET.GT.NBEMAX )THEN\n         WRITE( NOUT, FMT = 9997 )'BETA', NBEMAX\n         GO TO 230\n      END IF\n      READ( NIN, FMT = * )( BET( I ), I = 1, NBET )\n*\n*     Report values of parameters.\n*\n      WRITE( NOUT, FMT = 9993 )\n      WRITE( NOUT, FMT = 9992 )( IDIM( I ), I = 1, NIDIM )\n      WRITE( NOUT, FMT = 9991 )( KB( I ), I = 1, NKB )\n      WRITE( NOUT, FMT = 9990 )( INC( I ), I = 1, NINC )\n      WRITE( NOUT, FMT = 9989 )( ALF( I ), I = 1, NALF )\n      WRITE( NOUT, FMT = 9988 )( BET( I ), I = 1, NBET )\n      IF( .NOT.TSTERR )THEN\n         WRITE( NOUT, FMT = * )\n         WRITE( NOUT, FMT = 9980 )\n      END IF\n      WRITE( NOUT, FMT = * )\n      WRITE( NOUT, FMT = 9999 )THRESH\n      WRITE( NOUT, FMT = * )\n*\n*     Read names of subroutines and flags which indicate\n*     whether they are to be tested.\n*\n      DO 40 I = 1, NSUBS\n         LTEST( I ) = .FALSE.\n   40 CONTINUE\n   50 READ( NIN, FMT = 9984, END = 80 )SNAMET, LTESTT\n      DO 60 I = 1, NSUBS\n         IF( SNAMET.EQ.SNAMES( I ) )\n     $      GO TO 70\n   60 CONTINUE\n      WRITE( NOUT, FMT = 9986 )SNAMET\n      STOP\n   70 LTEST( I ) = LTESTT\n      GO TO 50\n*\n   80 CONTINUE\n      CLOSE ( NIN )\n*\n*     Compute EPS (the machine precision).\n*\n      EPS = ONE\n   90 CONTINUE\n      IF( DDIFF( ONE + EPS, ONE ).EQ.ZERO )\n     $   GO TO 100\n      EPS = HALF*EPS\n      GO TO 90\n  100 CONTINUE\n      EPS = EPS + EPS\n      WRITE( NOUT, FMT = 9998 )EPS\n*\n*     Check the reliability of DMVCH using exact data.\n*\n      N = MIN( 32, NMAX )\n      DO 120 J = 1, N\n         DO 110 I = 1, N\n            A( I, J ) = MAX( I - J + 1, 0 )\n  110    CONTINUE\n         X( J ) = J\n         Y( J ) = ZERO\n  120 CONTINUE\n      DO 130 J = 1, N\n         YY( J ) = J*( ( J + 1 )*J )/2 - ( ( J + 1 )*J*( J - 1 ) )/3\n  130 CONTINUE\n*     YY holds the exact result. On exit from DMVCH YT holds\n*     the result computed by DMVCH.\n      TRANS = 'N'\n      CALL DMVCH( TRANS, N, N, ONE, A, NMAX, X, 1, ZERO, Y, 1, YT, G,\n     $            YY, EPS, ERR, FATAL, NOUT, .TRUE. )\n      SAME = LDE( YY, YT, N )\n      IF( .NOT.SAME.OR.ERR.NE.ZERO )THEN\n         WRITE( NOUT, FMT = 9985 )TRANS, SAME, ERR\n         STOP\n      END IF\n      TRANS = 'T'\n      CALL DMVCH( TRANS, N, N, ONE, A, NMAX, X, -1, ZERO, Y, -1, YT, G,\n     $            YY, EPS, ERR, FATAL, NOUT, .TRUE. )\n      SAME = LDE( YY, YT, N )\n      IF( .NOT.SAME.OR.ERR.NE.ZERO )THEN\n         WRITE( NOUT, FMT = 9985 )TRANS, SAME, ERR\n         STOP\n      END IF\n*\n*     Test each subroutine in turn.\n*\n      DO 210 ISNUM = 1, NSUBS\n         WRITE( NOUT, FMT = * )\n         IF( .NOT.LTEST( ISNUM ) )THEN\n*           Subprogram is not to be tested.\n            WRITE( NOUT, FMT = 9983 )SNAMES( ISNUM )\n         ELSE\n            SRNAMT = SNAMES( ISNUM )\n*           Test error exits.\n            IF( TSTERR )THEN\n               CALL DCHKE( ISNUM, SNAMES( ISNUM ), NOUT )\n               WRITE( NOUT, FMT = * )\n            END IF\n*           Test computations.\n            INFOT = 0\n            OK = .TRUE.\n            FATAL = .FALSE.\n            GO TO ( 140, 140, 150, 150, 150, 160, 160,\n     $              160, 160, 160, 160, 170, 180, 180,\n     $              190, 190 )ISNUM\n*           Test DGEMV, 01, and DGBMV, 02.\n  140       CALL DCHK1( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF,\n     $                  NBET, BET, NINC, INC, NMAX, INCMAX, A, AA, AS,\n     $                  X, XX, XS, Y, YY, YS, YT, G )\n            GO TO 200\n*           Test DSYMV, 03, DSBMV, 04, and DSPMV, 05.\n  150       CALL DCHK2( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF,\n     $                  NBET, BET, NINC, INC, NMAX, INCMAX, A, AA, AS,\n     $                  X, XX, XS, Y, YY, YS, YT, G )\n            GO TO 200\n*           Test DTRMV, 06, DTBMV, 07, DTPMV, 08,\n*           DTRSV, 09, DTBSV, 10, and DTPSV, 11.\n  160       CALL DCHK3( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NKB, KB, NINC, INC,\n     $                  NMAX, INCMAX, A, AA, AS, Y, YY, YS, YT, G, Z )\n            GO TO 200\n*           Test DGER, 12.\n  170       CALL DCHK4( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC,\n     $                  NMAX, INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS,\n     $                  YT, G, Z )\n            GO TO 200\n*           Test DSYR, 13, and DSPR, 14.\n  180       CALL DCHK5( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC,\n     $                  NMAX, INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS,\n     $                  YT, G, Z )\n            GO TO 200\n*           Test DSYR2, 15, and DSPR2, 16.\n  190       CALL DCHK6( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC,\n     $                  NMAX, INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS,\n     $                  YT, G, Z )\n*\n  200       IF( FATAL.AND.SFATAL )\n     $         GO TO 220\n         END IF\n  210 CONTINUE\n      WRITE( NOUT, FMT = 9982 )\n      GO TO 240\n*\n  220 CONTINUE\n      WRITE( NOUT, FMT = 9981 )\n      GO TO 240\n*\n  230 CONTINUE\n      WRITE( NOUT, FMT = 9987 )\n*\n  240 CONTINUE\n      IF( TRACE )\n     $   CLOSE ( NTRA )\n      CLOSE ( NOUT )\n      STOP\n*\n 9999 FORMAT( ' ROUTINES PASS COMPUTATIONAL TESTS IF TEST RATIO IS LES',\n     $      'S THAN', F8.2 )\n 9998 FORMAT( ' RELATIVE MACHINE PRECISION IS TAKEN TO BE', 1P, D9.1 )\n 9997 FORMAT( ' NUMBER OF VALUES OF ', A, ' IS LESS THAN 1 OR GREATER ',\n     $      'THAN ', I2 )\n 9996 FORMAT( ' VALUE OF N IS LESS THAN 0 OR GREATER THAN ', I2 )\n 9995 FORMAT( ' VALUE OF K IS LESS THAN 0' )\n 9994 FORMAT( ' ABSOLUTE VALUE OF INCX OR INCY IS 0 OR GREATER THAN ',\n     $      I2 )\n 9993 FORMAT( ' TESTS OF THE DOUBLE PRECISION LEVEL 2 BLAS', //' THE F',\n     $      'OLLOWING PARAMETER VALUES WILL BE USED:' )\n 9992 FORMAT( '   FOR N              ', 9I6 )\n 9991 FORMAT( '   FOR K              ', 7I6 )\n 9990 FORMAT( '   FOR INCX AND INCY  ', 7I6 )\n 9989 FORMAT( '   FOR ALPHA          ', 7F6.1 )\n 9988 FORMAT( '   FOR BETA           ', 7F6.1 )\n 9987 FORMAT( ' AMEND DATA FILE OR INCREASE ARRAY SIZES IN PROGRAM',\n     $      /' ******* TESTS ABANDONED *******' )\n 9986 FORMAT( ' SUBPROGRAM NAME ', A6, ' NOT RECOGNIZED', /' ******* T',\n     $      'ESTS ABANDONED *******' )\n 9985 FORMAT( ' ERROR IN DMVCH -  IN-LINE DOT PRODUCTS ARE BEING EVALU',\n     $      'ATED WRONGLY.', /' DMVCH WAS CALLED WITH TRANS = ', A1,\n     $      ' AND RETURNED SAME = ', L1, ' AND ERR = ', F12.3, '.', /\n     $   ' THIS MAY BE DUE TO FAULTS IN THE ARITHMETIC OR THE COMPILER.'\n     $      , /' ******* TESTS ABANDONED *******' )\n 9984 FORMAT( A6, L2 )\n 9983 FORMAT( 1X, A6, ' WAS NOT TESTED' )\n 9982 FORMAT( /' END OF TESTS' )\n 9981 FORMAT( /' ******* FATAL ERROR - TESTS ABANDONED *******' )\n 9980 FORMAT( ' ERROR-EXITS WILL NOT BE TESTED' )\n*\n*     End of DBLAT2.\n*\n      END\n      SUBROUTINE DCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF, NBET,\n     $                  BET, NINC, INC, NMAX, INCMAX, A, AA, AS, X, XX,\n     $                  XS, Y, YY, YS, YT, G )\n*\n*  Tests DGEMV and DGBMV.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Parameters ..\n      DOUBLE PRECISION   ZERO, HALF\n      PARAMETER          ( ZERO = 0.0D0, HALF = 0.5D0 )\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION   EPS, THRESH\n      INTEGER            INCMAX, NALF, NBET, NIDIM, NINC, NKB, NMAX,\n     $                   NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      DOUBLE PRECISION   A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),\n     $                   AS( NMAX*NMAX ), BET( NBET ), G( NMAX ),\n     $                   X( NMAX ), XS( NMAX*INCMAX ),\n     $                   XX( NMAX*INCMAX ), Y( NMAX ),\n     $                   YS( NMAX*INCMAX ), YT( NMAX ),\n     $                   YY( NMAX*INCMAX )\n      INTEGER            IDIM( NIDIM ), INC( NINC ), KB( NKB )\n*     .. Local Scalars ..\n      DOUBLE PRECISION   ALPHA, ALS, BETA, BLS, ERR, ERRMAX, TRANSL\n      INTEGER            I, IA, IB, IC, IKU, IM, IN, INCX, INCXS, INCY,\n     $                   INCYS, IX, IY, KL, KLS, KU, KUS, LAA, LDA,\n     $                   LDAS, LX, LY, M, ML, MS, N, NARGS, NC, ND, NK,\n     $                   NL, NS\n      LOGICAL            BANDED, FULL, NULL, RESET, SAME, TRAN\n      CHARACTER*1        TRANS, TRANSS\n      CHARACTER*3        ICH\n*     .. Local Arrays ..\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LDE, LDERES\n      EXTERNAL           LDE, LDERES\n*     .. External Subroutines ..\n      EXTERNAL           DGBMV, DGEMV, DMAKE, DMVCH\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, MAX, MIN\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Data statements ..\n      DATA               ICH/'NTC'/\n*     .. Executable Statements ..\n      FULL = SNAME( 3: 3 ).EQ.'E'\n      BANDED = SNAME( 3: 3 ).EQ.'B'\n*     Define the number of arguments.\n      IF( FULL )THEN\n         NARGS = 11\n      ELSE IF( BANDED )THEN\n         NARGS = 13\n      END IF\n*\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = ZERO\n*\n      DO 120 IN = 1, NIDIM\n         N = IDIM( IN )\n         ND = N/2 + 1\n*\n         DO 110 IM = 1, 2\n            IF( IM.EQ.1 )\n     $         M = MAX( N - ND, 0 )\n            IF( IM.EQ.2 )\n     $         M = MIN( N + ND, NMAX )\n*\n            IF( BANDED )THEN\n               NK = NKB\n            ELSE\n               NK = 1\n            END IF\n            DO 100 IKU = 1, NK\n               IF( BANDED )THEN\n                  KU = KB( IKU )\n                  KL = MAX( KU - 1, 0 )\n               ELSE\n                  KU = N - 1\n                  KL = M - 1\n               END IF\n*              Set LDA to 1 more than minimum value if room.\n               IF( BANDED )THEN\n                  LDA = KL + KU + 1\n               ELSE\n                  LDA = M\n               END IF\n               IF( LDA.LT.NMAX )\n     $            LDA = LDA + 1\n*              Skip tests if not enough room.\n               IF( LDA.GT.NMAX )\n     $            GO TO 100\n               LAA = LDA*N\n               NULL = N.LE.0.OR.M.LE.0\n*\n*              Generate the matrix A.\n*\n               TRANSL = ZERO\n               CALL DMAKE( SNAME( 2: 3 ), ' ', ' ', M, N, A, NMAX, AA,\n     $                     LDA, KL, KU, RESET, TRANSL )\n*\n               DO 90 IC = 1, 3\n                  TRANS = ICH( IC: IC )\n                  TRAN = TRANS.EQ.'T'.OR.TRANS.EQ.'C'\n*\n                  IF( TRAN )THEN\n                     ML = N\n                     NL = M\n                  ELSE\n                     ML = M\n                     NL = N\n                  END IF\n*\n                  DO 80 IX = 1, NINC\n                     INCX = INC( IX )\n                     LX = ABS( INCX )*NL\n*\n*                    Generate the vector X.\n*\n                     TRANSL = HALF\n                     CALL DMAKE( 'GE', ' ', ' ', 1, NL, X, 1, XX,\n     $                           ABS( INCX ), 0, NL - 1, RESET, TRANSL )\n                     IF( NL.GT.1 )THEN\n                        X( NL/2 ) = ZERO\n                        XX( 1 + ABS( INCX )*( NL/2 - 1 ) ) = ZERO\n                     END IF\n*\n                     DO 70 IY = 1, NINC\n                        INCY = INC( IY )\n                        LY = ABS( INCY )*ML\n*\n                        DO 60 IA = 1, NALF\n                           ALPHA = ALF( IA )\n*\n                           DO 50 IB = 1, NBET\n                              BETA = BET( IB )\n*\n*                             Generate the vector Y.\n*\n                              TRANSL = ZERO\n                              CALL DMAKE( 'GE', ' ', ' ', 1, ML, Y, 1,\n     $                                    YY, ABS( INCY ), 0, ML - 1,\n     $                                    RESET, TRANSL )\n*\n                              NC = NC + 1\n*\n*                             Save every datum before calling the\n*                             subroutine.\n*\n                              TRANSS = TRANS\n                              MS = M\n                              NS = N\n                              KLS = KL\n                              KUS = KU\n                              ALS = ALPHA\n                              DO 10 I = 1, LAA\n                                 AS( I ) = AA( I )\n   10                         CONTINUE\n                              LDAS = LDA\n                              DO 20 I = 1, LX\n                                 XS( I ) = XX( I )\n   20                         CONTINUE\n                              INCXS = INCX\n                              BLS = BETA\n                              DO 30 I = 1, LY\n                                 YS( I ) = YY( I )\n   30                         CONTINUE\n                              INCYS = INCY\n*\n*                             Call the subroutine.\n*\n                              IF( FULL )THEN\n                                 IF( TRACE )\n     $                              WRITE( NTRA, FMT = 9994 )NC, SNAME,\n     $                              TRANS, M, N, ALPHA, LDA, INCX, BETA,\n     $                              INCY\n                                 IF( REWI )\n     $                              REWIND NTRA\n                                 CALL DGEMV( TRANS, M, N, ALPHA, AA,\n     $                                       LDA, XX, INCX, BETA, YY,\n     $                                       INCY )\n                              ELSE IF( BANDED )THEN\n                                 IF( TRACE )\n     $                              WRITE( NTRA, FMT = 9995 )NC, SNAME,\n     $                              TRANS, M, N, KL, KU, ALPHA, LDA,\n     $                              INCX, BETA, INCY\n                                 IF( REWI )\n     $                              REWIND NTRA\n                                 CALL DGBMV( TRANS, M, N, KL, KU, ALPHA,\n     $                                       AA, LDA, XX, INCX, BETA,\n     $                                       YY, INCY )\n                              END IF\n*\n*                             Check if error-exit was taken incorrectly.\n*\n                              IF( .NOT.OK )THEN\n                                 WRITE( NOUT, FMT = 9993 )\n                                 FATAL = .TRUE.\n                                 GO TO 130\n                              END IF\n*\n*                             See what data changed inside subroutines.\n*\n                              ISAME( 1 ) = TRANS.EQ.TRANSS\n                              ISAME( 2 ) = MS.EQ.M\n                              ISAME( 3 ) = NS.EQ.N\n                              IF( FULL )THEN\n                                 ISAME( 4 ) = ALS.EQ.ALPHA\n                                 ISAME( 5 ) = LDE( AS, AA, LAA )\n                                 ISAME( 6 ) = LDAS.EQ.LDA\n                                 ISAME( 7 ) = LDE( XS, XX, LX )\n                                 ISAME( 8 ) = INCXS.EQ.INCX\n                                 ISAME( 9 ) = BLS.EQ.BETA\n                                 IF( NULL )THEN\n                                    ISAME( 10 ) = LDE( YS, YY, LY )\n                                 ELSE\n                                    ISAME( 10 ) = LDERES( 'GE', ' ', 1,\n     $                                            ML, YS, YY,\n     $                                            ABS( INCY ) )\n                                 END IF\n                                 ISAME( 11 ) = INCYS.EQ.INCY\n                              ELSE IF( BANDED )THEN\n                                 ISAME( 4 ) = KLS.EQ.KL\n                                 ISAME( 5 ) = KUS.EQ.KU\n                                 ISAME( 6 ) = ALS.EQ.ALPHA\n                                 ISAME( 7 ) = LDE( AS, AA, LAA )\n                                 ISAME( 8 ) = LDAS.EQ.LDA\n                                 ISAME( 9 ) = LDE( XS, XX, LX )\n                                 ISAME( 10 ) = INCXS.EQ.INCX\n                                 ISAME( 11 ) = BLS.EQ.BETA\n                                 IF( NULL )THEN\n                                    ISAME( 12 ) = LDE( YS, YY, LY )\n                                 ELSE\n                                    ISAME( 12 ) = LDERES( 'GE', ' ', 1,\n     $                                            ML, YS, YY,\n     $                                            ABS( INCY ) )\n                                 END IF\n                                 ISAME( 13 ) = INCYS.EQ.INCY\n                              END IF\n*\n*                             If data was incorrectly changed, report\n*                             and return.\n*\n                              SAME = .TRUE.\n                              DO 40 I = 1, NARGS\n                                 SAME = SAME.AND.ISAME( I )\n                                 IF( .NOT.ISAME( I ) )\n     $                              WRITE( NOUT, FMT = 9998 )I\n   40                         CONTINUE\n                              IF( .NOT.SAME )THEN\n                                 FATAL = .TRUE.\n                                 GO TO 130\n                              END IF\n*\n                              IF( .NOT.NULL )THEN\n*\n*                                Check the result.\n*\n                                 CALL DMVCH( TRANS, M, N, ALPHA, A,\n     $                                       NMAX, X, INCX, BETA, Y,\n     $                                       INCY, YT, G, YY, EPS, ERR,\n     $                                       FATAL, NOUT, .TRUE. )\n                                 ERRMAX = MAX( ERRMAX, ERR )\n*                                If got really bad answer, report and\n*                                return.\n                                 IF( FATAL )\n     $                              GO TO 130\n                              ELSE\n*                                Avoid repeating tests with M.le.0 or\n*                                N.le.0.\n                                 GO TO 110\n                              END IF\n*\n   50                      CONTINUE\n*\n   60                   CONTINUE\n*\n   70                CONTINUE\n*\n   80             CONTINUE\n*\n   90          CONTINUE\n*\n  100       CONTINUE\n*\n  110    CONTINUE\n*\n  120 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 140\n*\n  130 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      IF( FULL )THEN\n         WRITE( NOUT, FMT = 9994 )NC, SNAME, TRANS, M, N, ALPHA, LDA,\n     $      INCX, BETA, INCY\n      ELSE IF( BANDED )THEN\n         WRITE( NOUT, FMT = 9995 )NC, SNAME, TRANS, M, N, KL, KU,\n     $      ALPHA, LDA, INCX, BETA, INCY\n      END IF\n*\n  140 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', 4( I3, ',' ), F4.1,\n     $      ', A,', I3, ', X,', I2, ',', F4.1, ', Y,', I2, ') .' )\n 9994 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', 2( I3, ',' ), F4.1,\n     $      ', A,', I3, ', X,', I2, ',', F4.1, ', Y,', I2,\n     $      ')         .' )\n 9993 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of DCHK1.\n*\n      END\n      SUBROUTINE DCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF, NBET,\n     $                  BET, NINC, INC, NMAX, INCMAX, A, AA, AS, X, XX,\n     $                  XS, Y, YY, YS, YT, G )\n*\n*  Tests DSYMV, DSBMV and DSPMV.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Parameters ..\n      DOUBLE PRECISION   ZERO, HALF\n      PARAMETER          ( ZERO = 0.0D0, HALF = 0.5D0 )\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION   EPS, THRESH\n      INTEGER            INCMAX, NALF, NBET, NIDIM, NINC, NKB, NMAX,\n     $                   NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      DOUBLE PRECISION   A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),\n     $                   AS( NMAX*NMAX ), BET( NBET ), G( NMAX ),\n     $                   X( NMAX ), XS( NMAX*INCMAX ),\n     $                   XX( NMAX*INCMAX ), Y( NMAX ),\n     $                   YS( NMAX*INCMAX ), YT( NMAX ),\n     $                   YY( NMAX*INCMAX )\n      INTEGER            IDIM( NIDIM ), INC( NINC ), KB( NKB )\n*     .. Local Scalars ..\n      DOUBLE PRECISION   ALPHA, ALS, BETA, BLS, ERR, ERRMAX, TRANSL\n      INTEGER            I, IA, IB, IC, IK, IN, INCX, INCXS, INCY,\n     $                   INCYS, IX, IY, K, KS, LAA, LDA, LDAS, LX, LY,\n     $                   N, NARGS, NC, NK, NS\n      LOGICAL            BANDED, FULL, NULL, PACKED, RESET, SAME\n      CHARACTER*1        UPLO, UPLOS\n      CHARACTER*2        ICH\n*     .. Local Arrays ..\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LDE, LDERES\n      EXTERNAL           LDE, LDERES\n*     .. External Subroutines ..\n      EXTERNAL           DMAKE, DMVCH, DSBMV, DSPMV, DSYMV\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, MAX\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Data statements ..\n      DATA               ICH/'UL'/\n*     .. Executable Statements ..\n      FULL = SNAME( 3: 3 ).EQ.'Y'\n      BANDED = SNAME( 3: 3 ).EQ.'B'\n      PACKED = SNAME( 3: 3 ).EQ.'P'\n*     Define the number of arguments.\n      IF( FULL )THEN\n         NARGS = 10\n      ELSE IF( BANDED )THEN\n         NARGS = 11\n      ELSE IF( PACKED )THEN\n         NARGS = 9\n      END IF\n*\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = ZERO\n*\n      DO 110 IN = 1, NIDIM\n         N = IDIM( IN )\n*\n         IF( BANDED )THEN\n            NK = NKB\n         ELSE\n            NK = 1\n         END IF\n         DO 100 IK = 1, NK\n            IF( BANDED )THEN\n               K = KB( IK )\n            ELSE\n               K = N - 1\n            END IF\n*           Set LDA to 1 more than minimum value if room.\n            IF( BANDED )THEN\n               LDA = K + 1\n            ELSE\n               LDA = N\n            END IF\n            IF( LDA.LT.NMAX )\n     $         LDA = LDA + 1\n*           Skip tests if not enough room.\n            IF( LDA.GT.NMAX )\n     $         GO TO 100\n            IF( PACKED )THEN\n               LAA = ( N*( N + 1 ) )/2\n            ELSE\n               LAA = LDA*N\n            END IF\n            NULL = N.LE.0\n*\n            DO 90 IC = 1, 2\n               UPLO = ICH( IC: IC )\n*\n*              Generate the matrix A.\n*\n               TRANSL = ZERO\n               CALL DMAKE( SNAME( 2: 3 ), UPLO, ' ', N, N, A, NMAX, AA,\n     $                     LDA, K, K, RESET, TRANSL )\n*\n               DO 80 IX = 1, NINC\n                  INCX = INC( IX )\n                  LX = ABS( INCX )*N\n*\n*                 Generate the vector X.\n*\n                  TRANSL = HALF\n                  CALL DMAKE( 'GE', ' ', ' ', 1, N, X, 1, XX,\n     $                        ABS( INCX ), 0, N - 1, RESET, TRANSL )\n                  IF( N.GT.1 )THEN\n                     X( N/2 ) = ZERO\n                     XX( 1 + ABS( INCX )*( N/2 - 1 ) ) = ZERO\n                  END IF\n*\n                  DO 70 IY = 1, NINC\n                     INCY = INC( IY )\n                     LY = ABS( INCY )*N\n*\n                     DO 60 IA = 1, NALF\n                        ALPHA = ALF( IA )\n*\n                        DO 50 IB = 1, NBET\n                           BETA = BET( IB )\n*\n*                          Generate the vector Y.\n*\n                           TRANSL = ZERO\n                           CALL DMAKE( 'GE', ' ', ' ', 1, N, Y, 1, YY,\n     $                                 ABS( INCY ), 0, N - 1, RESET,\n     $                                 TRANSL )\n*\n                           NC = NC + 1\n*\n*                          Save every datum before calling the\n*                          subroutine.\n*\n                           UPLOS = UPLO\n                           NS = N\n                           KS = K\n                           ALS = ALPHA\n                           DO 10 I = 1, LAA\n                              AS( I ) = AA( I )\n   10                      CONTINUE\n                           LDAS = LDA\n                           DO 20 I = 1, LX\n                              XS( I ) = XX( I )\n   20                      CONTINUE\n                           INCXS = INCX\n                           BLS = BETA\n                           DO 30 I = 1, LY\n                              YS( I ) = YY( I )\n   30                      CONTINUE\n                           INCYS = INCY\n*\n*                          Call the subroutine.\n*\n                           IF( FULL )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9993 )NC, SNAME,\n     $                           UPLO, N, ALPHA, LDA, INCX, BETA, INCY\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL DSYMV( UPLO, N, ALPHA, AA, LDA, XX,\n     $                                    INCX, BETA, YY, INCY )\n                           ELSE IF( BANDED )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9994 )NC, SNAME,\n     $                           UPLO, N, K, ALPHA, LDA, INCX, BETA,\n     $                           INCY\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL DSBMV( UPLO, N, K, ALPHA, AA, LDA,\n     $                                    XX, INCX, BETA, YY, INCY )\n                           ELSE IF( PACKED )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9995 )NC, SNAME,\n     $                           UPLO, N, ALPHA, INCX, BETA, INCY\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL DSPMV( UPLO, N, ALPHA, AA, XX, INCX,\n     $                                    BETA, YY, INCY )\n                           END IF\n*\n*                          Check if error-exit was taken incorrectly.\n*\n                           IF( .NOT.OK )THEN\n                              WRITE( NOUT, FMT = 9992 )\n                              FATAL = .TRUE.\n                              GO TO 120\n                           END IF\n*\n*                          See what data changed inside subroutines.\n*\n                           ISAME( 1 ) = UPLO.EQ.UPLOS\n                           ISAME( 2 ) = NS.EQ.N\n                           IF( FULL )THEN\n                              ISAME( 3 ) = ALS.EQ.ALPHA\n                              ISAME( 4 ) = LDE( AS, AA, LAA )\n                              ISAME( 5 ) = LDAS.EQ.LDA\n                              ISAME( 6 ) = LDE( XS, XX, LX )\n                              ISAME( 7 ) = INCXS.EQ.INCX\n                              ISAME( 8 ) = BLS.EQ.BETA\n                              IF( NULL )THEN\n                                 ISAME( 9 ) = LDE( YS, YY, LY )\n                              ELSE\n                                 ISAME( 9 ) = LDERES( 'GE', ' ', 1, N,\n     $                                        YS, YY, ABS( INCY ) )\n                              END IF\n                              ISAME( 10 ) = INCYS.EQ.INCY\n                           ELSE IF( BANDED )THEN\n                              ISAME( 3 ) = KS.EQ.K\n                              ISAME( 4 ) = ALS.EQ.ALPHA\n                              ISAME( 5 ) = LDE( AS, AA, LAA )\n                              ISAME( 6 ) = LDAS.EQ.LDA\n                              ISAME( 7 ) = LDE( XS, XX, LX )\n                              ISAME( 8 ) = INCXS.EQ.INCX\n                              ISAME( 9 ) = BLS.EQ.BETA\n                              IF( NULL )THEN\n                                 ISAME( 10 ) = LDE( YS, YY, LY )\n                              ELSE\n                                 ISAME( 10 ) = LDERES( 'GE', ' ', 1, N,\n     $                                         YS, YY, ABS( INCY ) )\n                              END IF\n                              ISAME( 11 ) = INCYS.EQ.INCY\n                           ELSE IF( PACKED )THEN\n                              ISAME( 3 ) = ALS.EQ.ALPHA\n                              ISAME( 4 ) = LDE( AS, AA, LAA )\n                              ISAME( 5 ) = LDE( XS, XX, LX )\n                              ISAME( 6 ) = INCXS.EQ.INCX\n                              ISAME( 7 ) = BLS.EQ.BETA\n                              IF( NULL )THEN\n                                 ISAME( 8 ) = LDE( YS, YY, LY )\n                              ELSE\n                                 ISAME( 8 ) = LDERES( 'GE', ' ', 1, N,\n     $                                        YS, YY, ABS( INCY ) )\n                              END IF\n                              ISAME( 9 ) = INCYS.EQ.INCY\n                           END IF\n*\n*                          If data was incorrectly changed, report and\n*                          return.\n*\n                           SAME = .TRUE.\n                           DO 40 I = 1, NARGS\n                              SAME = SAME.AND.ISAME( I )\n                              IF( .NOT.ISAME( I ) )\n     $                           WRITE( NOUT, FMT = 9998 )I\n   40                      CONTINUE\n                           IF( .NOT.SAME )THEN\n                              FATAL = .TRUE.\n                              GO TO 120\n                           END IF\n*\n                           IF( .NOT.NULL )THEN\n*\n*                             Check the result.\n*\n                              CALL DMVCH( 'N', N, N, ALPHA, A, NMAX, X,\n     $                                    INCX, BETA, Y, INCY, YT, G,\n     $                                    YY, EPS, ERR, FATAL, NOUT,\n     $                                    .TRUE. )\n                              ERRMAX = MAX( ERRMAX, ERR )\n*                             If got really bad answer, report and\n*                             return.\n                              IF( FATAL )\n     $                           GO TO 120\n                           ELSE\n*                             Avoid repeating tests with N.le.0\n                              GO TO 110\n                           END IF\n*\n   50                   CONTINUE\n*\n   60                CONTINUE\n*\n   70             CONTINUE\n*\n   80          CONTINUE\n*\n   90       CONTINUE\n*\n  100    CONTINUE\n*\n  110 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 130\n*\n  120 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      IF( FULL )THEN\n         WRITE( NOUT, FMT = 9993 )NC, SNAME, UPLO, N, ALPHA, LDA, INCX,\n     $      BETA, INCY\n      ELSE IF( BANDED )THEN\n         WRITE( NOUT, FMT = 9994 )NC, SNAME, UPLO, N, K, ALPHA, LDA,\n     $      INCX, BETA, INCY\n      ELSE IF( PACKED )THEN\n         WRITE( NOUT, FMT = 9995 )NC, SNAME, UPLO, N, ALPHA, INCX,\n     $      BETA, INCY\n      END IF\n*\n  130 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', I3, ',', F4.1, ', AP',\n     $      ', X,', I2, ',', F4.1, ', Y,', I2, ')                .' )\n 9994 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', 2( I3, ',' ), F4.1,\n     $      ', A,', I3, ', X,', I2, ',', F4.1, ', Y,', I2,\n     $      ')         .' )\n 9993 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', I3, ',', F4.1, ', A,',\n     $      I3, ', X,', I2, ',', F4.1, ', Y,', I2, ')             .' )\n 9992 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of DCHK2.\n*\n      END\n      SUBROUTINE DCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NKB, KB, NINC, INC, NMAX,\n     $                  INCMAX, A, AA, AS, X, XX, XS, XT, G, Z )\n*\n*  Tests DTRMV, DTBMV, DTPMV, DTRSV, DTBSV and DTPSV.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Parameters ..\n      DOUBLE PRECISION   ZERO, HALF, ONE\n      PARAMETER          ( ZERO = 0.0D0, HALF = 0.5D0, ONE = 1.0D0 )\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION   EPS, THRESH\n      INTEGER            INCMAX, NIDIM, NINC, NKB, NMAX, NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      DOUBLE PRECISION   A( NMAX, NMAX ), AA( NMAX*NMAX ),\n     $                   AS( NMAX*NMAX ), G( NMAX ), X( NMAX ),\n     $                   XS( NMAX*INCMAX ), XT( NMAX ),\n     $                   XX( NMAX*INCMAX ), Z( NMAX )\n      INTEGER            IDIM( NIDIM ), INC( NINC ), KB( NKB )\n*     .. Local Scalars ..\n      DOUBLE PRECISION   ERR, ERRMAX, TRANSL\n      INTEGER            I, ICD, ICT, ICU, IK, IN, INCX, INCXS, IX, K,\n     $                   KS, LAA, LDA, LDAS, LX, N, NARGS, NC, NK, NS\n      LOGICAL            BANDED, FULL, NULL, PACKED, RESET, SAME\n      CHARACTER*1        DIAG, DIAGS, TRANS, TRANSS, UPLO, UPLOS\n      CHARACTER*2        ICHD, ICHU\n      CHARACTER*3        ICHT\n*     .. Local Arrays ..\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LDE, LDERES\n      EXTERNAL           LDE, LDERES\n*     .. External Subroutines ..\n      EXTERNAL           DMAKE, DMVCH, DTBMV, DTBSV, DTPMV, DTPSV,\n     $                   DTRMV, DTRSV\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, MAX\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Data statements ..\n      DATA               ICHU/'UL'/, ICHT/'NTC'/, ICHD/'UN'/\n*     .. Executable Statements ..\n      FULL = SNAME( 3: 3 ).EQ.'R'\n      BANDED = SNAME( 3: 3 ).EQ.'B'\n      PACKED = SNAME( 3: 3 ).EQ.'P'\n*     Define the number of arguments.\n      IF( FULL )THEN\n         NARGS = 8\n      ELSE IF( BANDED )THEN\n         NARGS = 9\n      ELSE IF( PACKED )THEN\n         NARGS = 7\n      END IF\n*\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = ZERO\n*     Set up zero vector for DMVCH.\n      DO 10 I = 1, NMAX\n         Z( I ) = ZERO\n   10 CONTINUE\n*\n      DO 110 IN = 1, NIDIM\n         N = IDIM( IN )\n*\n         IF( BANDED )THEN\n            NK = NKB\n         ELSE\n            NK = 1\n         END IF\n         DO 100 IK = 1, NK\n            IF( BANDED )THEN\n               K = KB( IK )\n            ELSE\n               K = N - 1\n            END IF\n*           Set LDA to 1 more than minimum value if room.\n            IF( BANDED )THEN\n               LDA = K + 1\n            ELSE\n               LDA = N\n            END IF\n            IF( LDA.LT.NMAX )\n     $         LDA = LDA + 1\n*           Skip tests if not enough room.\n            IF( LDA.GT.NMAX )\n     $         GO TO 100\n            IF( PACKED )THEN\n               LAA = ( N*( N + 1 ) )/2\n            ELSE\n               LAA = LDA*N\n            END IF\n            NULL = N.LE.0\n*\n            DO 90 ICU = 1, 2\n               UPLO = ICHU( ICU: ICU )\n*\n               DO 80 ICT = 1, 3\n                  TRANS = ICHT( ICT: ICT )\n*\n                  DO 70 ICD = 1, 2\n                     DIAG = ICHD( ICD: ICD )\n*\n*                    Generate the matrix A.\n*\n                     TRANSL = ZERO\n                     CALL DMAKE( SNAME( 2: 3 ), UPLO, DIAG, N, N, A,\n     $                           NMAX, AA, LDA, K, K, RESET, TRANSL )\n*\n                     DO 60 IX = 1, NINC\n                        INCX = INC( IX )\n                        LX = ABS( INCX )*N\n*\n*                       Generate the vector X.\n*\n                        TRANSL = HALF\n                        CALL DMAKE( 'GE', ' ', ' ', 1, N, X, 1, XX,\n     $                              ABS( INCX ), 0, N - 1, RESET,\n     $                              TRANSL )\n                        IF( N.GT.1 )THEN\n                           X( N/2 ) = ZERO\n                           XX( 1 + ABS( INCX )*( N/2 - 1 ) ) = ZERO\n                        END IF\n*\n                        NC = NC + 1\n*\n*                       Save every datum before calling the subroutine.\n*\n                        UPLOS = UPLO\n                        TRANSS = TRANS\n                        DIAGS = DIAG\n                        NS = N\n                        KS = K\n                        DO 20 I = 1, LAA\n                           AS( I ) = AA( I )\n   20                   CONTINUE\n                        LDAS = LDA\n                        DO 30 I = 1, LX\n                           XS( I ) = XX( I )\n   30                   CONTINUE\n                        INCXS = INCX\n*\n*                       Call the subroutine.\n*\n                        IF( SNAME( 4: 5 ).EQ.'MV' )THEN\n                           IF( FULL )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9993 )NC, SNAME,\n     $                           UPLO, TRANS, DIAG, N, LDA, INCX\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL DTRMV( UPLO, TRANS, DIAG, N, AA, LDA,\n     $                                    XX, INCX )\n                           ELSE IF( BANDED )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9994 )NC, SNAME,\n     $                           UPLO, TRANS, DIAG, N, K, LDA, INCX\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL DTBMV( UPLO, TRANS, DIAG, N, K, AA,\n     $                                    LDA, XX, INCX )\n                           ELSE IF( PACKED )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9995 )NC, SNAME,\n     $                           UPLO, TRANS, DIAG, N, INCX\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL DTPMV( UPLO, TRANS, DIAG, N, AA, XX,\n     $                                    INCX )\n                           END IF\n                        ELSE IF( SNAME( 4: 5 ).EQ.'SV' )THEN\n                           IF( FULL )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9993 )NC, SNAME,\n     $                           UPLO, TRANS, DIAG, N, LDA, INCX\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL DTRSV( UPLO, TRANS, DIAG, N, AA, LDA,\n     $                                    XX, INCX )\n                           ELSE IF( BANDED )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9994 )NC, SNAME,\n     $                           UPLO, TRANS, DIAG, N, K, LDA, INCX\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL DTBSV( UPLO, TRANS, DIAG, N, K, AA,\n     $                                    LDA, XX, INCX )\n                           ELSE IF( PACKED )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9995 )NC, SNAME,\n     $                           UPLO, TRANS, DIAG, N, INCX\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL DTPSV( UPLO, TRANS, DIAG, N, AA, XX,\n     $                                    INCX )\n                           END IF\n                        END IF\n*\n*                       Check if error-exit was taken incorrectly.\n*\n                        IF( .NOT.OK )THEN\n                           WRITE( NOUT, FMT = 9992 )\n                           FATAL = .TRUE.\n                           GO TO 120\n                        END IF\n*\n*                       See what data changed inside subroutines.\n*\n                        ISAME( 1 ) = UPLO.EQ.UPLOS\n                        ISAME( 2 ) = TRANS.EQ.TRANSS\n                        ISAME( 3 ) = DIAG.EQ.DIAGS\n                        ISAME( 4 ) = NS.EQ.N\n                        IF( FULL )THEN\n                           ISAME( 5 ) = LDE( AS, AA, LAA )\n                           ISAME( 6 ) = LDAS.EQ.LDA\n                           IF( NULL )THEN\n                              ISAME( 7 ) = LDE( XS, XX, LX )\n                           ELSE\n                              ISAME( 7 ) = LDERES( 'GE', ' ', 1, N, XS,\n     $                                     XX, ABS( INCX ) )\n                           END IF\n                           ISAME( 8 ) = INCXS.EQ.INCX\n                        ELSE IF( BANDED )THEN\n                           ISAME( 5 ) = KS.EQ.K\n                           ISAME( 6 ) = LDE( AS, AA, LAA )\n                           ISAME( 7 ) = LDAS.EQ.LDA\n                           IF( NULL )THEN\n                              ISAME( 8 ) = LDE( XS, XX, LX )\n                           ELSE\n                              ISAME( 8 ) = LDERES( 'GE', ' ', 1, N, XS,\n     $                                     XX, ABS( INCX ) )\n                           END IF\n                           ISAME( 9 ) = INCXS.EQ.INCX\n                        ELSE IF( PACKED )THEN\n                           ISAME( 5 ) = LDE( AS, AA, LAA )\n                           IF( NULL )THEN\n                              ISAME( 6 ) = LDE( XS, XX, LX )\n                           ELSE\n                              ISAME( 6 ) = LDERES( 'GE', ' ', 1, N, XS,\n     $                                     XX, ABS( INCX ) )\n                           END IF\n                           ISAME( 7 ) = INCXS.EQ.INCX\n                        END IF\n*\n*                       If data was incorrectly changed, report and\n*                       return.\n*\n                        SAME = .TRUE.\n                        DO 40 I = 1, NARGS\n                           SAME = SAME.AND.ISAME( I )\n                           IF( .NOT.ISAME( I ) )\n     $                        WRITE( NOUT, FMT = 9998 )I\n   40                   CONTINUE\n                        IF( .NOT.SAME )THEN\n                           FATAL = .TRUE.\n                           GO TO 120\n                        END IF\n*\n                        IF( .NOT.NULL )THEN\n                           IF( SNAME( 4: 5 ).EQ.'MV' )THEN\n*\n*                             Check the result.\n*\n                              CALL DMVCH( TRANS, N, N, ONE, A, NMAX, X,\n     $                                    INCX, ZERO, Z, INCX, XT, G,\n     $                                    XX, EPS, ERR, FATAL, NOUT,\n     $                                    .TRUE. )\n                           ELSE IF( SNAME( 4: 5 ).EQ.'SV' )THEN\n*\n*                             Compute approximation to original vector.\n*\n                              DO 50 I = 1, N\n                                 Z( I ) = XX( 1 + ( I - 1 )*\n     $                                    ABS( INCX ) )\n                                 XX( 1 + ( I - 1 )*ABS( INCX ) )\n     $                              = X( I )\n   50                         CONTINUE\n                              CALL DMVCH( TRANS, N, N, ONE, A, NMAX, Z,\n     $                                    INCX, ZERO, X, INCX, XT, G,\n     $                                    XX, EPS, ERR, FATAL, NOUT,\n     $                                    .FALSE. )\n                           END IF\n                           ERRMAX = MAX( ERRMAX, ERR )\n*                          If got really bad answer, report and return.\n                           IF( FATAL )\n     $                        GO TO 120\n                        ELSE\n*                          Avoid repeating tests with N.le.0.\n                           GO TO 110\n                        END IF\n*\n   60                CONTINUE\n*\n   70             CONTINUE\n*\n   80          CONTINUE\n*\n   90       CONTINUE\n*\n  100    CONTINUE\n*\n  110 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 130\n*\n  120 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      IF( FULL )THEN\n         WRITE( NOUT, FMT = 9993 )NC, SNAME, UPLO, TRANS, DIAG, N, LDA,\n     $      INCX\n      ELSE IF( BANDED )THEN\n         WRITE( NOUT, FMT = 9994 )NC, SNAME, UPLO, TRANS, DIAG, N, K,\n     $      LDA, INCX\n      ELSE IF( PACKED )THEN\n         WRITE( NOUT, FMT = 9995 )NC, SNAME, UPLO, TRANS, DIAG, N, INCX\n      END IF\n*\n  130 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( 1X, I6, ': ', A6, '(', 3( '''', A1, ''',' ), I3, ', AP, ',\n     $      'X,', I2, ')                        .' )\n 9994 FORMAT( 1X, I6, ': ', A6, '(', 3( '''', A1, ''',' ), 2( I3, ',' ),\n     $      ' A,', I3, ', X,', I2, ')                 .' )\n 9993 FORMAT( 1X, I6, ': ', A6, '(', 3( '''', A1, ''',' ), I3, ', A,',\n     $      I3, ', X,', I2, ')                     .' )\n 9992 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of DCHK3.\n*\n      END\n      SUBROUTINE DCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX,\n     $                  INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G,\n     $                  Z )\n*\n*  Tests DGER.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Parameters ..\n      DOUBLE PRECISION   ZERO, HALF, ONE\n      PARAMETER          ( ZERO = 0.0D0, HALF = 0.5D0, ONE = 1.0D0 )\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION   EPS, THRESH\n      INTEGER            INCMAX, NALF, NIDIM, NINC, NMAX, NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      DOUBLE PRECISION   A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),\n     $                   AS( NMAX*NMAX ), G( NMAX ), X( NMAX ),\n     $                   XS( NMAX*INCMAX ), XX( NMAX*INCMAX ),\n     $                   Y( NMAX ), YS( NMAX*INCMAX ), YT( NMAX ),\n     $                   YY( NMAX*INCMAX ), Z( NMAX )\n      INTEGER            IDIM( NIDIM ), INC( NINC )\n*     .. Local Scalars ..\n      DOUBLE PRECISION   ALPHA, ALS, ERR, ERRMAX, TRANSL\n      INTEGER            I, IA, IM, IN, INCX, INCXS, INCY, INCYS, IX,\n     $                   IY, J, LAA, LDA, LDAS, LX, LY, M, MS, N, NARGS,\n     $                   NC, ND, NS\n      LOGICAL            NULL, RESET, SAME\n*     .. Local Arrays ..\n      DOUBLE PRECISION   W( 1 )\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LDE, LDERES\n      EXTERNAL           LDE, LDERES\n*     .. External Subroutines ..\n      EXTERNAL           DGER, DMAKE, DMVCH\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, MAX, MIN\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Executable Statements ..\n*     Define the number of arguments.\n      NARGS = 9\n*\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = ZERO\n*\n      DO 120 IN = 1, NIDIM\n         N = IDIM( IN )\n         ND = N/2 + 1\n*\n         DO 110 IM = 1, 2\n            IF( IM.EQ.1 )\n     $         M = MAX( N - ND, 0 )\n            IF( IM.EQ.2 )\n     $         M = MIN( N + ND, NMAX )\n*\n*           Set LDA to 1 more than minimum value if room.\n            LDA = M\n            IF( LDA.LT.NMAX )\n     $         LDA = LDA + 1\n*           Skip tests if not enough room.\n            IF( LDA.GT.NMAX )\n     $         GO TO 110\n            LAA = LDA*N\n            NULL = N.LE.0.OR.M.LE.0\n*\n            DO 100 IX = 1, NINC\n               INCX = INC( IX )\n               LX = ABS( INCX )*M\n*\n*              Generate the vector X.\n*\n               TRANSL = HALF\n               CALL DMAKE( 'GE', ' ', ' ', 1, M, X, 1, XX, ABS( INCX ),\n     $                     0, M - 1, RESET, TRANSL )\n               IF( M.GT.1 )THEN\n                  X( M/2 ) = ZERO\n                  XX( 1 + ABS( INCX )*( M/2 - 1 ) ) = ZERO\n               END IF\n*\n               DO 90 IY = 1, NINC\n                  INCY = INC( IY )\n                  LY = ABS( INCY )*N\n*\n*                 Generate the vector Y.\n*\n                  TRANSL = ZERO\n                  CALL DMAKE( 'GE', ' ', ' ', 1, N, Y, 1, YY,\n     $                        ABS( INCY ), 0, N - 1, RESET, TRANSL )\n                  IF( N.GT.1 )THEN\n                     Y( N/2 ) = ZERO\n                     YY( 1 + ABS( INCY )*( N/2 - 1 ) ) = ZERO\n                  END IF\n*\n                  DO 80 IA = 1, NALF\n                     ALPHA = ALF( IA )\n*\n*                    Generate the matrix A.\n*\n                     TRANSL = ZERO\n                     CALL DMAKE( SNAME( 2: 3 ), ' ', ' ', M, N, A, NMAX,\n     $                           AA, LDA, M - 1, N - 1, RESET, TRANSL )\n*\n                     NC = NC + 1\n*\n*                    Save every datum before calling the subroutine.\n*\n                     MS = M\n                     NS = N\n                     ALS = ALPHA\n                     DO 10 I = 1, LAA\n                        AS( I ) = AA( I )\n   10                CONTINUE\n                     LDAS = LDA\n                     DO 20 I = 1, LX\n                        XS( I ) = XX( I )\n   20                CONTINUE\n                     INCXS = INCX\n                     DO 30 I = 1, LY\n                        YS( I ) = YY( I )\n   30                CONTINUE\n                     INCYS = INCY\n*\n*                    Call the subroutine.\n*\n                     IF( TRACE )\n     $                  WRITE( NTRA, FMT = 9994 )NC, SNAME, M, N,\n     $                  ALPHA, INCX, INCY, LDA\n                     IF( REWI )\n     $                  REWIND NTRA\n                     CALL DGER( M, N, ALPHA, XX, INCX, YY, INCY, AA,\n     $                          LDA )\n*\n*                    Check if error-exit was taken incorrectly.\n*\n                     IF( .NOT.OK )THEN\n                        WRITE( NOUT, FMT = 9993 )\n                        FATAL = .TRUE.\n                        GO TO 140\n                     END IF\n*\n*                    See what data changed inside subroutine.\n*\n                     ISAME( 1 ) = MS.EQ.M\n                     ISAME( 2 ) = NS.EQ.N\n                     ISAME( 3 ) = ALS.EQ.ALPHA\n                     ISAME( 4 ) = LDE( XS, XX, LX )\n                     ISAME( 5 ) = INCXS.EQ.INCX\n                     ISAME( 6 ) = LDE( YS, YY, LY )\n                     ISAME( 7 ) = INCYS.EQ.INCY\n                     IF( NULL )THEN\n                        ISAME( 8 ) = LDE( AS, AA, LAA )\n                     ELSE\n                        ISAME( 8 ) = LDERES( 'GE', ' ', M, N, AS, AA,\n     $                               LDA )\n                     END IF\n                     ISAME( 9 ) = LDAS.EQ.LDA\n*\n*                    If data was incorrectly changed, report and return.\n*\n                     SAME = .TRUE.\n                     DO 40 I = 1, NARGS\n                        SAME = SAME.AND.ISAME( I )\n                        IF( .NOT.ISAME( I ) )\n     $                     WRITE( NOUT, FMT = 9998 )I\n   40                CONTINUE\n                     IF( .NOT.SAME )THEN\n                        FATAL = .TRUE.\n                        GO TO 140\n                     END IF\n*\n                     IF( .NOT.NULL )THEN\n*\n*                       Check the result column by column.\n*\n                        IF( INCX.GT.0 )THEN\n                           DO 50 I = 1, M\n                              Z( I ) = X( I )\n   50                      CONTINUE\n                        ELSE\n                           DO 60 I = 1, M\n                              Z( I ) = X( M - I + 1 )\n   60                      CONTINUE\n                        END IF\n                        DO 70 J = 1, N\n                           IF( INCY.GT.0 )THEN\n                              W( 1 ) = Y( J )\n                           ELSE\n                              W( 1 ) = Y( N - J + 1 )\n                           END IF\n                           CALL DMVCH( 'N', M, 1, ALPHA, Z, NMAX, W, 1,\n     $                                 ONE, A( 1, J ), 1, YT, G,\n     $                                 AA( 1 + ( J - 1 )*LDA ), EPS,\n     $                                 ERR, FATAL, NOUT, .TRUE. )\n                           ERRMAX = MAX( ERRMAX, ERR )\n*                          If got really bad answer, report and return.\n                           IF( FATAL )\n     $                        GO TO 130\n   70                   CONTINUE\n                     ELSE\n*                       Avoid repeating tests with M.le.0 or N.le.0.\n                        GO TO 110\n                     END IF\n*\n   80             CONTINUE\n*\n   90          CONTINUE\n*\n  100       CONTINUE\n*\n  110    CONTINUE\n*\n  120 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 150\n*\n  130 CONTINUE\n      WRITE( NOUT, FMT = 9995 )J\n*\n  140 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      WRITE( NOUT, FMT = 9994 )NC, SNAME, M, N, ALPHA, INCX, INCY, LDA\n*\n  150 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( '      THESE ARE THE RESULTS FOR COLUMN ', I3 )\n 9994 FORMAT( 1X, I6, ': ', A6, '(', 2( I3, ',' ), F4.1, ', X,', I2,\n     $      ', Y,', I2, ', A,', I3, ')                  .' )\n 9993 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of DCHK4.\n*\n      END\n      SUBROUTINE DCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX,\n     $                  INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G,\n     $                  Z )\n*\n*  Tests DSYR and DSPR.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Parameters ..\n      DOUBLE PRECISION   ZERO, HALF, ONE\n      PARAMETER          ( ZERO = 0.0D0, HALF = 0.5D0, ONE = 1.0D0 )\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION   EPS, THRESH\n      INTEGER            INCMAX, NALF, NIDIM, NINC, NMAX, NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      DOUBLE PRECISION   A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),\n     $                   AS( NMAX*NMAX ), G( NMAX ), X( NMAX ),\n     $                   XS( NMAX*INCMAX ), XX( NMAX*INCMAX ),\n     $                   Y( NMAX ), YS( NMAX*INCMAX ), YT( NMAX ),\n     $                   YY( NMAX*INCMAX ), Z( NMAX )\n      INTEGER            IDIM( NIDIM ), INC( NINC )\n*     .. Local Scalars ..\n      DOUBLE PRECISION   ALPHA, ALS, ERR, ERRMAX, TRANSL\n      INTEGER            I, IA, IC, IN, INCX, INCXS, IX, J, JA, JJ, LAA,\n     $                   LDA, LDAS, LJ, LX, N, NARGS, NC, NS\n      LOGICAL            FULL, NULL, PACKED, RESET, SAME, UPPER\n      CHARACTER*1        UPLO, UPLOS\n      CHARACTER*2        ICH\n*     .. Local Arrays ..\n      DOUBLE PRECISION   W( 1 )\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LDE, LDERES\n      EXTERNAL           LDE, LDERES\n*     .. External Subroutines ..\n      EXTERNAL           DMAKE, DMVCH, DSPR, DSYR\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, MAX\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Data statements ..\n      DATA               ICH/'UL'/\n*     .. Executable Statements ..\n      FULL = SNAME( 3: 3 ).EQ.'Y'\n      PACKED = SNAME( 3: 3 ).EQ.'P'\n*     Define the number of arguments.\n      IF( FULL )THEN\n         NARGS = 7\n      ELSE IF( PACKED )THEN\n         NARGS = 6\n      END IF\n*\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = ZERO\n*\n      DO 100 IN = 1, NIDIM\n         N = IDIM( IN )\n*        Set LDA to 1 more than minimum value if room.\n         LDA = N\n         IF( LDA.LT.NMAX )\n     $      LDA = LDA + 1\n*        Skip tests if not enough room.\n         IF( LDA.GT.NMAX )\n     $      GO TO 100\n         IF( PACKED )THEN\n            LAA = ( N*( N + 1 ) )/2\n         ELSE\n            LAA = LDA*N\n         END IF\n*\n         DO 90 IC = 1, 2\n            UPLO = ICH( IC: IC )\n            UPPER = UPLO.EQ.'U'\n*\n            DO 80 IX = 1, NINC\n               INCX = INC( IX )\n               LX = ABS( INCX )*N\n*\n*              Generate the vector X.\n*\n               TRANSL = HALF\n               CALL DMAKE( 'GE', ' ', ' ', 1, N, X, 1, XX, ABS( INCX ),\n     $                     0, N - 1, RESET, TRANSL )\n               IF( N.GT.1 )THEN\n                  X( N/2 ) = ZERO\n                  XX( 1 + ABS( INCX )*( N/2 - 1 ) ) = ZERO\n               END IF\n*\n               DO 70 IA = 1, NALF\n                  ALPHA = ALF( IA )\n                  NULL = N.LE.0.OR.ALPHA.EQ.ZERO\n*\n*                 Generate the matrix A.\n*\n                  TRANSL = ZERO\n                  CALL DMAKE( SNAME( 2: 3 ), UPLO, ' ', N, N, A, NMAX,\n     $                        AA, LDA, N - 1, N - 1, RESET, TRANSL )\n*\n                  NC = NC + 1\n*\n*                 Save every datum before calling the subroutine.\n*\n                  UPLOS = UPLO\n                  NS = N\n                  ALS = ALPHA\n                  DO 10 I = 1, LAA\n                     AS( I ) = AA( I )\n   10             CONTINUE\n                  LDAS = LDA\n                  DO 20 I = 1, LX\n                     XS( I ) = XX( I )\n   20             CONTINUE\n                  INCXS = INCX\n*\n*                 Call the subroutine.\n*\n                  IF( FULL )THEN\n                     IF( TRACE )\n     $                  WRITE( NTRA, FMT = 9993 )NC, SNAME, UPLO, N,\n     $                  ALPHA, INCX, LDA\n                     IF( REWI )\n     $                  REWIND NTRA\n                     CALL DSYR( UPLO, N, ALPHA, XX, INCX, AA, LDA )\n                  ELSE IF( PACKED )THEN\n                     IF( TRACE )\n     $                  WRITE( NTRA, FMT = 9994 )NC, SNAME, UPLO, N,\n     $                  ALPHA, INCX\n                     IF( REWI )\n     $                  REWIND NTRA\n                     CALL DSPR( UPLO, N, ALPHA, XX, INCX, AA )\n                  END IF\n*\n*                 Check if error-exit was taken incorrectly.\n*\n                  IF( .NOT.OK )THEN\n                     WRITE( NOUT, FMT = 9992 )\n                     FATAL = .TRUE.\n                     GO TO 120\n                  END IF\n*\n*                 See what data changed inside subroutines.\n*\n                  ISAME( 1 ) = UPLO.EQ.UPLOS\n                  ISAME( 2 ) = NS.EQ.N\n                  ISAME( 3 ) = ALS.EQ.ALPHA\n                  ISAME( 4 ) = LDE( XS, XX, LX )\n                  ISAME( 5 ) = INCXS.EQ.INCX\n                  IF( NULL )THEN\n                     ISAME( 6 ) = LDE( AS, AA, LAA )\n                  ELSE\n                     ISAME( 6 ) = LDERES( SNAME( 2: 3 ), UPLO, N, N, AS,\n     $                            AA, LDA )\n                  END IF\n                  IF( .NOT.PACKED )THEN\n                     ISAME( 7 ) = LDAS.EQ.LDA\n                  END IF\n*\n*                 If data was incorrectly changed, report and return.\n*\n                  SAME = .TRUE.\n                  DO 30 I = 1, NARGS\n                     SAME = SAME.AND.ISAME( I )\n                     IF( .NOT.ISAME( I ) )\n     $                  WRITE( NOUT, FMT = 9998 )I\n   30             CONTINUE\n                  IF( .NOT.SAME )THEN\n                     FATAL = .TRUE.\n                     GO TO 120\n                  END IF\n*\n                  IF( .NOT.NULL )THEN\n*\n*                    Check the result column by column.\n*\n                     IF( INCX.GT.0 )THEN\n                        DO 40 I = 1, N\n                           Z( I ) = X( I )\n   40                   CONTINUE\n                     ELSE\n                        DO 50 I = 1, N\n                           Z( I ) = X( N - I + 1 )\n   50                   CONTINUE\n                     END IF\n                     JA = 1\n                     DO 60 J = 1, N\n                        W( 1 ) = Z( J )\n                        IF( UPPER )THEN\n                           JJ = 1\n                           LJ = J\n                        ELSE\n                           JJ = J\n                           LJ = N - J + 1\n                        END IF\n                        CALL DMVCH( 'N', LJ, 1, ALPHA, Z( JJ ), LJ, W,\n     $                              1, ONE, A( JJ, J ), 1, YT, G,\n     $                              AA( JA ), EPS, ERR, FATAL, NOUT,\n     $                              .TRUE. )\n                        IF( FULL )THEN\n                           IF( UPPER )THEN\n                              JA = JA + LDA\n                           ELSE\n                              JA = JA + LDA + 1\n                           END IF\n                        ELSE\n                           JA = JA + LJ\n                        END IF\n                        ERRMAX = MAX( ERRMAX, ERR )\n*                       If got really bad answer, report and return.\n                        IF( FATAL )\n     $                     GO TO 110\n   60                CONTINUE\n                  ELSE\n*                    Avoid repeating tests if N.le.0.\n                     IF( N.LE.0 )\n     $                  GO TO 100\n                  END IF\n*\n   70          CONTINUE\n*\n   80       CONTINUE\n*\n   90    CONTINUE\n*\n  100 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 130\n*\n  110 CONTINUE\n      WRITE( NOUT, FMT = 9995 )J\n*\n  120 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      IF( FULL )THEN\n         WRITE( NOUT, FMT = 9993 )NC, SNAME, UPLO, N, ALPHA, INCX, LDA\n      ELSE IF( PACKED )THEN\n         WRITE( NOUT, FMT = 9994 )NC, SNAME, UPLO, N, ALPHA, INCX\n      END IF\n*\n  130 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( '      THESE ARE THE RESULTS FOR COLUMN ', I3 )\n 9994 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', I3, ',', F4.1, ', X,',\n     $      I2, ', AP)                           .' )\n 9993 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', I3, ',', F4.1, ', X,',\n     $      I2, ', A,', I3, ')                        .' )\n 9992 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of DCHK5.\n*\n      END\n      SUBROUTINE DCHK6( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX,\n     $                  INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G,\n     $                  Z )\n*\n*  Tests DSYR2 and DSPR2.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Parameters ..\n      DOUBLE PRECISION   ZERO, HALF, ONE\n      PARAMETER          ( ZERO = 0.0D0, HALF = 0.5D0, ONE = 1.0D0 )\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION   EPS, THRESH\n      INTEGER            INCMAX, NALF, NIDIM, NINC, NMAX, NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      DOUBLE PRECISION   A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),\n     $                   AS( NMAX*NMAX ), G( NMAX ), X( NMAX ),\n     $                   XS( NMAX*INCMAX ), XX( NMAX*INCMAX ),\n     $                   Y( NMAX ), YS( NMAX*INCMAX ), YT( NMAX ),\n     $                   YY( NMAX*INCMAX ), Z( NMAX, 2 )\n      INTEGER            IDIM( NIDIM ), INC( NINC )\n*     .. Local Scalars ..\n      DOUBLE PRECISION   ALPHA, ALS, ERR, ERRMAX, TRANSL\n      INTEGER            I, IA, IC, IN, INCX, INCXS, INCY, INCYS, IX,\n     $                   IY, J, JA, JJ, LAA, LDA, LDAS, LJ, LX, LY, N,\n     $                   NARGS, NC, NS\n      LOGICAL            FULL, NULL, PACKED, RESET, SAME, UPPER\n      CHARACTER*1        UPLO, UPLOS\n      CHARACTER*2        ICH\n*     .. Local Arrays ..\n      DOUBLE PRECISION   W( 2 )\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LDE, LDERES\n      EXTERNAL           LDE, LDERES\n*     .. External Subroutines ..\n      EXTERNAL           DMAKE, DMVCH, DSPR2, DSYR2\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, MAX\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Data statements ..\n      DATA               ICH/'UL'/\n*     .. Executable Statements ..\n      FULL = SNAME( 3: 3 ).EQ.'Y'\n      PACKED = SNAME( 3: 3 ).EQ.'P'\n*     Define the number of arguments.\n      IF( FULL )THEN\n         NARGS = 9\n      ELSE IF( PACKED )THEN\n         NARGS = 8\n      END IF\n*\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = ZERO\n*\n      DO 140 IN = 1, NIDIM\n         N = IDIM( IN )\n*        Set LDA to 1 more than minimum value if room.\n         LDA = N\n         IF( LDA.LT.NMAX )\n     $      LDA = LDA + 1\n*        Skip tests if not enough room.\n         IF( LDA.GT.NMAX )\n     $      GO TO 140\n         IF( PACKED )THEN\n            LAA = ( N*( N + 1 ) )/2\n         ELSE\n            LAA = LDA*N\n         END IF\n*\n         DO 130 IC = 1, 2\n            UPLO = ICH( IC: IC )\n            UPPER = UPLO.EQ.'U'\n*\n            DO 120 IX = 1, NINC\n               INCX = INC( IX )\n               LX = ABS( INCX )*N\n*\n*              Generate the vector X.\n*\n               TRANSL = HALF\n               CALL DMAKE( 'GE', ' ', ' ', 1, N, X, 1, XX, ABS( INCX ),\n     $                     0, N - 1, RESET, TRANSL )\n               IF( N.GT.1 )THEN\n                  X( N/2 ) = ZERO\n                  XX( 1 + ABS( INCX )*( N/2 - 1 ) ) = ZERO\n               END IF\n*\n               DO 110 IY = 1, NINC\n                  INCY = INC( IY )\n                  LY = ABS( INCY )*N\n*\n*                 Generate the vector Y.\n*\n                  TRANSL = ZERO\n                  CALL DMAKE( 'GE', ' ', ' ', 1, N, Y, 1, YY,\n     $                        ABS( INCY ), 0, N - 1, RESET, TRANSL )\n                  IF( N.GT.1 )THEN\n                     Y( N/2 ) = ZERO\n                     YY( 1 + ABS( INCY )*( N/2 - 1 ) ) = ZERO\n                  END IF\n*\n                  DO 100 IA = 1, NALF\n                     ALPHA = ALF( IA )\n                     NULL = N.LE.0.OR.ALPHA.EQ.ZERO\n*\n*                    Generate the matrix A.\n*\n                     TRANSL = ZERO\n                     CALL DMAKE( SNAME( 2: 3 ), UPLO, ' ', N, N, A,\n     $                           NMAX, AA, LDA, N - 1, N - 1, RESET,\n     $                           TRANSL )\n*\n                     NC = NC + 1\n*\n*                    Save every datum before calling the subroutine.\n*\n                     UPLOS = UPLO\n                     NS = N\n                     ALS = ALPHA\n                     DO 10 I = 1, LAA\n                        AS( I ) = AA( I )\n   10                CONTINUE\n                     LDAS = LDA\n                     DO 20 I = 1, LX\n                        XS( I ) = XX( I )\n   20                CONTINUE\n                     INCXS = INCX\n                     DO 30 I = 1, LY\n                        YS( I ) = YY( I )\n   30                CONTINUE\n                     INCYS = INCY\n*\n*                    Call the subroutine.\n*\n                     IF( FULL )THEN\n                        IF( TRACE )\n     $                     WRITE( NTRA, FMT = 9993 )NC, SNAME, UPLO, N,\n     $                     ALPHA, INCX, INCY, LDA\n                        IF( REWI )\n     $                     REWIND NTRA\n                        CALL DSYR2( UPLO, N, ALPHA, XX, INCX, YY, INCY,\n     $                              AA, LDA )\n                     ELSE IF( PACKED )THEN\n                        IF( TRACE )\n     $                     WRITE( NTRA, FMT = 9994 )NC, SNAME, UPLO, N,\n     $                     ALPHA, INCX, INCY\n                        IF( REWI )\n     $                     REWIND NTRA\n                        CALL DSPR2( UPLO, N, ALPHA, XX, INCX, YY, INCY,\n     $                              AA )\n                     END IF\n*\n*                    Check if error-exit was taken incorrectly.\n*\n                     IF( .NOT.OK )THEN\n                        WRITE( NOUT, FMT = 9992 )\n                        FATAL = .TRUE.\n                        GO TO 160\n                     END IF\n*\n*                    See what data changed inside subroutines.\n*\n                     ISAME( 1 ) = UPLO.EQ.UPLOS\n                     ISAME( 2 ) = NS.EQ.N\n                     ISAME( 3 ) = ALS.EQ.ALPHA\n                     ISAME( 4 ) = LDE( XS, XX, LX )\n                     ISAME( 5 ) = INCXS.EQ.INCX\n                     ISAME( 6 ) = LDE( YS, YY, LY )\n                     ISAME( 7 ) = INCYS.EQ.INCY\n                     IF( NULL )THEN\n                        ISAME( 8 ) = LDE( AS, AA, LAA )\n                     ELSE\n                        ISAME( 8 ) = LDERES( SNAME( 2: 3 ), UPLO, N, N,\n     $                               AS, AA, LDA )\n                     END IF\n                     IF( .NOT.PACKED )THEN\n                        ISAME( 9 ) = LDAS.EQ.LDA\n                     END IF\n*\n*                    If data was incorrectly changed, report and return.\n*\n                     SAME = .TRUE.\n                     DO 40 I = 1, NARGS\n                        SAME = SAME.AND.ISAME( I )\n                        IF( .NOT.ISAME( I ) )\n     $                     WRITE( NOUT, FMT = 9998 )I\n   40                CONTINUE\n                     IF( .NOT.SAME )THEN\n                        FATAL = .TRUE.\n                        GO TO 160\n                     END IF\n*\n                     IF( .NOT.NULL )THEN\n*\n*                       Check the result column by column.\n*\n                        IF( INCX.GT.0 )THEN\n                           DO 50 I = 1, N\n                              Z( I, 1 ) = X( I )\n   50                      CONTINUE\n                        ELSE\n                           DO 60 I = 1, N\n                              Z( I, 1 ) = X( N - I + 1 )\n   60                      CONTINUE\n                        END IF\n                        IF( INCY.GT.0 )THEN\n                           DO 70 I = 1, N\n                              Z( I, 2 ) = Y( I )\n   70                      CONTINUE\n                        ELSE\n                           DO 80 I = 1, N\n                              Z( I, 2 ) = Y( N - I + 1 )\n   80                      CONTINUE\n                        END IF\n                        JA = 1\n                        DO 90 J = 1, N\n                           W( 1 ) = Z( J, 2 )\n                           W( 2 ) = Z( J, 1 )\n                           IF( UPPER )THEN\n                              JJ = 1\n                              LJ = J\n                           ELSE\n                              JJ = J\n                              LJ = N - J + 1\n                           END IF\n                           CALL DMVCH( 'N', LJ, 2, ALPHA, Z( JJ, 1 ),\n     $                                 NMAX, W, 1, ONE, A( JJ, J ), 1,\n     $                                 YT, G, AA( JA ), EPS, ERR, FATAL,\n     $                                 NOUT, .TRUE. )\n                           IF( FULL )THEN\n                              IF( UPPER )THEN\n                                 JA = JA + LDA\n                              ELSE\n                                 JA = JA + LDA + 1\n                              END IF\n                           ELSE\n                              JA = JA + LJ\n                           END IF\n                           ERRMAX = MAX( ERRMAX, ERR )\n*                          If got really bad answer, report and return.\n                           IF( FATAL )\n     $                        GO TO 150\n   90                   CONTINUE\n                     ELSE\n*                       Avoid repeating tests with N.le.0.\n                        IF( N.LE.0 )\n     $                     GO TO 140\n                     END IF\n*\n  100             CONTINUE\n*\n  110          CONTINUE\n*\n  120       CONTINUE\n*\n  130    CONTINUE\n*\n  140 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 170\n*\n  150 CONTINUE\n      WRITE( NOUT, FMT = 9995 )J\n*\n  160 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      IF( FULL )THEN\n         WRITE( NOUT, FMT = 9993 )NC, SNAME, UPLO, N, ALPHA, INCX,\n     $      INCY, LDA\n      ELSE IF( PACKED )THEN\n         WRITE( NOUT, FMT = 9994 )NC, SNAME, UPLO, N, ALPHA, INCX, INCY\n      END IF\n*\n  170 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( '      THESE ARE THE RESULTS FOR COLUMN ', I3 )\n 9994 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', I3, ',', F4.1, ', X,',\n     $      I2, ', Y,', I2, ', AP)                     .' )\n 9993 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', I3, ',', F4.1, ', X,',\n     $      I2, ', Y,', I2, ', A,', I3, ')                  .' )\n 9992 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of DCHK6.\n*\n      END\n      SUBROUTINE DCHKE( ISNUM, SRNAMT, NOUT )\n*\n*  Tests the error exits from the Level 2 Blas.\n*  Requires a special version of the error-handling routine XERBLA.\n*  ALPHA, BETA, A, X and Y should not need to be defined.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Scalar Arguments ..\n      INTEGER            ISNUM, NOUT\n      CHARACTER*6        SRNAMT\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Local Scalars ..\n      DOUBLE PRECISION   ALPHA, BETA\n*     .. Local Arrays ..\n      DOUBLE PRECISION   A( 1, 1 ), X( 1 ), Y( 1 )\n*     .. External Subroutines ..\n      EXTERNAL           CHKXER, DGBMV, DGEMV, DGER, DSBMV, DSPMV, DSPR,\n     $                   DSPR2, DSYMV, DSYR, DSYR2, DTBMV, DTBSV, DTPMV,\n     $                   DTPSV, DTRMV, DTRSV\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Executable Statements ..\n*     OK is set to .FALSE. by the special version of XERBLA or by CHKXER\n*     if anything is wrong.\n      OK = .TRUE.\n*     LERR is set to .TRUE. by the special version of XERBLA each time\n*     it is called, and is then tested and re-set by CHKXER.\n      LERR = .FALSE.\n      GO TO ( 10, 20, 30, 40, 50, 60, 70, 80,\n     $        90, 100, 110, 120, 130, 140, 150,\n     $        160 )ISNUM\n   10 INFOT = 1\n      CALL DGEMV( '/', 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL DGEMV( 'N', -1, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL DGEMV( 'N', 0, -1, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL DGEMV( 'N', 2, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL DGEMV( 'N', 0, 0, ALPHA, A, 1, X, 0, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL DGEMV( 'N', 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 170\n   20 INFOT = 1\n      CALL DGBMV( '/', 0, 0, 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL DGBMV( 'N', -1, 0, 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL DGBMV( 'N', 0, -1, 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL DGBMV( 'N', 0, 0, -1, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL DGBMV( 'N', 2, 0, 0, -1, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL DGBMV( 'N', 0, 0, 1, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL DGBMV( 'N', 0, 0, 0, 0, ALPHA, A, 1, X, 0, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 13\n      CALL DGBMV( 'N', 0, 0, 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 170\n   30 INFOT = 1\n      CALL DSYMV( '/', 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL DSYMV( 'U', -1, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL DSYMV( 'U', 2, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL DSYMV( 'U', 0, ALPHA, A, 1, X, 0, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL DSYMV( 'U', 0, ALPHA, A, 1, X, 1, BETA, Y, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 170\n   40 INFOT = 1\n      CALL DSBMV( '/', 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL DSBMV( 'U', -1, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL DSBMV( 'U', 0, -1, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL DSBMV( 'U', 0, 1, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL DSBMV( 'U', 0, 0, ALPHA, A, 1, X, 0, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL DSBMV( 'U', 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 170\n   50 INFOT = 1\n      CALL DSPMV( '/', 0, ALPHA, A, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL DSPMV( 'U', -1, ALPHA, A, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL DSPMV( 'U', 0, ALPHA, A, X, 0, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL DSPMV( 'U', 0, ALPHA, A, X, 1, BETA, Y, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 170\n   60 INFOT = 1\n      CALL DTRMV( '/', 'N', 'N', 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL DTRMV( 'U', '/', 'N', 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL DTRMV( 'U', 'N', '/', 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL DTRMV( 'U', 'N', 'N', -1, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL DTRMV( 'U', 'N', 'N', 2, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL DTRMV( 'U', 'N', 'N', 0, A, 1, X, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 170\n   70 INFOT = 1\n      CALL DTBMV( '/', 'N', 'N', 0, 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL DTBMV( 'U', '/', 'N', 0, 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL DTBMV( 'U', 'N', '/', 0, 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL DTBMV( 'U', 'N', 'N', -1, 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL DTBMV( 'U', 'N', 'N', 0, -1, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL DTBMV( 'U', 'N', 'N', 0, 1, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL DTBMV( 'U', 'N', 'N', 0, 0, A, 1, X, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 170\n   80 INFOT = 1\n      CALL DTPMV( '/', 'N', 'N', 0, A, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL DTPMV( 'U', '/', 'N', 0, A, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL DTPMV( 'U', 'N', '/', 0, A, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL DTPMV( 'U', 'N', 'N', -1, A, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL DTPMV( 'U', 'N', 'N', 0, A, X, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 170\n   90 INFOT = 1\n      CALL DTRSV( '/', 'N', 'N', 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL DTRSV( 'U', '/', 'N', 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL DTRSV( 'U', 'N', '/', 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL DTRSV( 'U', 'N', 'N', -1, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL DTRSV( 'U', 'N', 'N', 2, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL DTRSV( 'U', 'N', 'N', 0, A, 1, X, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 170\n  100 INFOT = 1\n      CALL DTBSV( '/', 'N', 'N', 0, 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL DTBSV( 'U', '/', 'N', 0, 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL DTBSV( 'U', 'N', '/', 0, 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL DTBSV( 'U', 'N', 'N', -1, 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL DTBSV( 'U', 'N', 'N', 0, -1, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL DTBSV( 'U', 'N', 'N', 0, 1, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL DTBSV( 'U', 'N', 'N', 0, 0, A, 1, X, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 170\n  110 INFOT = 1\n      CALL DTPSV( '/', 'N', 'N', 0, A, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL DTPSV( 'U', '/', 'N', 0, A, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL DTPSV( 'U', 'N', '/', 0, A, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL DTPSV( 'U', 'N', 'N', -1, A, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL DTPSV( 'U', 'N', 'N', 0, A, X, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 170\n  120 INFOT = 1\n      CALL DGER( -1, 0, ALPHA, X, 1, Y, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL DGER( 0, -1, ALPHA, X, 1, Y, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL DGER( 0, 0, ALPHA, X, 0, Y, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL DGER( 0, 0, ALPHA, X, 1, Y, 0, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL DGER( 2, 0, ALPHA, X, 1, Y, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 170\n  130 INFOT = 1\n      CALL DSYR( '/', 0, ALPHA, X, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL DSYR( 'U', -1, ALPHA, X, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL DSYR( 'U', 0, ALPHA, X, 0, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL DSYR( 'U', 2, ALPHA, X, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 170\n  140 INFOT = 1\n      CALL DSPR( '/', 0, ALPHA, X, 1, A )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL DSPR( 'U', -1, ALPHA, X, 1, A )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL DSPR( 'U', 0, ALPHA, X, 0, A )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 170\n  150 INFOT = 1\n      CALL DSYR2( '/', 0, ALPHA, X, 1, Y, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL DSYR2( 'U', -1, ALPHA, X, 1, Y, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL DSYR2( 'U', 0, ALPHA, X, 0, Y, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL DSYR2( 'U', 0, ALPHA, X, 1, Y, 0, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL DSYR2( 'U', 2, ALPHA, X, 1, Y, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 170\n  160 INFOT = 1\n      CALL DSPR2( '/', 0, ALPHA, X, 1, Y, 1, A )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL DSPR2( 'U', -1, ALPHA, X, 1, Y, 1, A )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL DSPR2( 'U', 0, ALPHA, X, 0, Y, 1, A )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL DSPR2( 'U', 0, ALPHA, X, 1, Y, 0, A )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n*\n  170 IF( OK )THEN\n         WRITE( NOUT, FMT = 9999 )SRNAMT\n      ELSE\n         WRITE( NOUT, FMT = 9998 )SRNAMT\n      END IF\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE TESTS OF ERROR-EXITS' )\n 9998 FORMAT( ' ******* ', A6, ' FAILED THE TESTS OF ERROR-EXITS *****',\n     $      '**' )\n*\n*     End of DCHKE.\n*\n      END\n      SUBROUTINE DMAKE( TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, KL,\n     $                  KU, RESET, TRANSL )\n*\n*  Generates values for an M by N matrix A within the bandwidth\n*  defined by KL and KU.\n*  Stores the values in the array AA in the data structure required\n*  by the routine, with unwanted elements set to rogue value.\n*\n*  TYPE is 'GE', 'GB', 'SY', 'SB', 'SP', 'TR', 'TB' OR 'TP'.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Parameters ..\n      DOUBLE PRECISION   ZERO, ONE\n      PARAMETER          ( ZERO = 0.0D0, ONE = 1.0D0 )\n      DOUBLE PRECISION   ROGUE\n      PARAMETER          ( ROGUE = -1.0D10 )\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION   TRANSL\n      INTEGER            KL, KU, LDA, M, N, NMAX\n      LOGICAL            RESET\n      CHARACTER*1        DIAG, UPLO\n      CHARACTER*2        TYPE\n*     .. Array Arguments ..\n      DOUBLE PRECISION   A( NMAX, * ), AA( * )\n*     .. Local Scalars ..\n      INTEGER            I, I1, I2, I3, IBEG, IEND, IOFF, J, KK\n      LOGICAL            GEN, LOWER, SYM, TRI, UNIT, UPPER\n*     .. External Functions ..\n      DOUBLE PRECISION   DBEG\n      EXTERNAL           DBEG\n*     .. Intrinsic Functions ..\n      INTRINSIC          MAX, MIN\n*     .. Executable Statements ..\n      GEN = TYPE( 1: 1 ).EQ.'G'\n      SYM = TYPE( 1: 1 ).EQ.'S'\n      TRI = TYPE( 1: 1 ).EQ.'T'\n      UPPER = ( SYM.OR.TRI ).AND.UPLO.EQ.'U'\n      LOWER = ( SYM.OR.TRI ).AND.UPLO.EQ.'L'\n      UNIT = TRI.AND.DIAG.EQ.'U'\n*\n*     Generate data in array A.\n*\n      DO 20 J = 1, N\n         DO 10 I = 1, M\n            IF( GEN.OR.( UPPER.AND.I.LE.J ).OR.( LOWER.AND.I.GE.J ) )\n     $          THEN\n               IF( ( I.LE.J.AND.J - I.LE.KU ).OR.\n     $             ( I.GE.J.AND.I - J.LE.KL ) )THEN\n                  A( I, J ) = DBEG( RESET ) + TRANSL\n               ELSE\n                  A( I, J ) = ZERO\n               END IF\n               IF( I.NE.J )THEN\n                  IF( SYM )THEN\n                     A( J, I ) = A( I, J )\n                  ELSE IF( TRI )THEN\n                     A( J, I ) = ZERO\n                  END IF\n               END IF\n            END IF\n   10    CONTINUE\n         IF( TRI )\n     $      A( J, J ) = A( J, J ) + ONE\n         IF( UNIT )\n     $      A( J, J ) = ONE\n   20 CONTINUE\n*\n*     Store elements in array AS in data structure required by routine.\n*\n      IF( TYPE.EQ.'GE' )THEN\n         DO 50 J = 1, N\n            DO 30 I = 1, M\n               AA( I + ( J - 1 )*LDA ) = A( I, J )\n   30       CONTINUE\n            DO 40 I = M + 1, LDA\n               AA( I + ( J - 1 )*LDA ) = ROGUE\n   40       CONTINUE\n   50    CONTINUE\n      ELSE IF( TYPE.EQ.'GB' )THEN\n         DO 90 J = 1, N\n            DO 60 I1 = 1, KU + 1 - J\n               AA( I1 + ( J - 1 )*LDA ) = ROGUE\n   60       CONTINUE\n            DO 70 I2 = I1, MIN( KL + KU + 1, KU + 1 + M - J )\n               AA( I2 + ( J - 1 )*LDA ) = A( I2 + J - KU - 1, J )\n   70       CONTINUE\n            DO 80 I3 = I2, LDA\n               AA( I3 + ( J - 1 )*LDA ) = ROGUE\n   80       CONTINUE\n   90    CONTINUE\n      ELSE IF( TYPE.EQ.'SY'.OR.TYPE.EQ.'TR' )THEN\n         DO 130 J = 1, N\n            IF( UPPER )THEN\n               IBEG = 1\n               IF( UNIT )THEN\n                  IEND = J - 1\n               ELSE\n                  IEND = J\n               END IF\n            ELSE\n               IF( UNIT )THEN\n                  IBEG = J + 1\n               ELSE\n                  IBEG = J\n               END IF\n               IEND = N\n            END IF\n            DO 100 I = 1, IBEG - 1\n               AA( I + ( J - 1 )*LDA ) = ROGUE\n  100       CONTINUE\n            DO 110 I = IBEG, IEND\n               AA( I + ( J - 1 )*LDA ) = A( I, J )\n  110       CONTINUE\n            DO 120 I = IEND + 1, LDA\n               AA( I + ( J - 1 )*LDA ) = ROGUE\n  120       CONTINUE\n  130    CONTINUE\n      ELSE IF( TYPE.EQ.'SB'.OR.TYPE.EQ.'TB' )THEN\n         DO 170 J = 1, N\n            IF( UPPER )THEN\n               KK = KL + 1\n               IBEG = MAX( 1, KL + 2 - J )\n               IF( UNIT )THEN\n                  IEND = KL\n               ELSE\n                  IEND = KL + 1\n               END IF\n            ELSE\n               KK = 1\n               IF( UNIT )THEN\n                  IBEG = 2\n               ELSE\n                  IBEG = 1\n               END IF\n               IEND = MIN( KL + 1, 1 + M - J )\n            END IF\n            DO 140 I = 1, IBEG - 1\n               AA( I + ( J - 1 )*LDA ) = ROGUE\n  140       CONTINUE\n            DO 150 I = IBEG, IEND\n               AA( I + ( J - 1 )*LDA ) = A( I + J - KK, J )\n  150       CONTINUE\n            DO 160 I = IEND + 1, LDA\n               AA( I + ( J - 1 )*LDA ) = ROGUE\n  160       CONTINUE\n  170    CONTINUE\n      ELSE IF( TYPE.EQ.'SP'.OR.TYPE.EQ.'TP' )THEN\n         IOFF = 0\n         DO 190 J = 1, N\n            IF( UPPER )THEN\n               IBEG = 1\n               IEND = J\n            ELSE\n               IBEG = J\n               IEND = N\n            END IF\n            DO 180 I = IBEG, IEND\n               IOFF = IOFF + 1\n               AA( IOFF ) = A( I, J )\n               IF( I.EQ.J )THEN\n                  IF( UNIT )\n     $               AA( IOFF ) = ROGUE\n               END IF\n  180       CONTINUE\n  190    CONTINUE\n      END IF\n      RETURN\n*\n*     End of DMAKE.\n*\n      END\n      SUBROUTINE DMVCH( TRANS, M, N, ALPHA, A, NMAX, X, INCX, BETA, Y,\n     $                  INCY, YT, G, YY, EPS, ERR, FATAL, NOUT, MV )\n*\n*  Checks the results of the computational tests.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Parameters ..\n      DOUBLE PRECISION   ZERO, ONE\n      PARAMETER          ( ZERO = 0.0D0, ONE = 1.0D0 )\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION   ALPHA, BETA, EPS, ERR\n      INTEGER            INCX, INCY, M, N, NMAX, NOUT\n      LOGICAL            FATAL, MV\n      CHARACTER*1        TRANS\n*     .. Array Arguments ..\n      DOUBLE PRECISION   A( NMAX, * ), G( * ), X( * ), Y( * ), YT( * ),\n     $                   YY( * )\n*     .. Local Scalars ..\n      DOUBLE PRECISION   ERRI\n      INTEGER            I, INCXL, INCYL, IY, J, JX, KX, KY, ML, NL\n      LOGICAL            TRAN\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, MAX, SQRT\n*     .. Executable Statements ..\n      TRAN = TRANS.EQ.'T'.OR.TRANS.EQ.'C'\n      IF( TRAN )THEN\n         ML = N\n         NL = M\n      ELSE\n         ML = M\n         NL = N\n      END IF\n      IF( INCX.LT.0 )THEN\n         KX = NL\n         INCXL = -1\n      ELSE\n         KX = 1\n         INCXL = 1\n      END IF\n      IF( INCY.LT.0 )THEN\n         KY = ML\n         INCYL = -1\n      ELSE\n         KY = 1\n         INCYL = 1\n      END IF\n*\n*     Compute expected result in YT using data in A, X and Y.\n*     Compute gauges in G.\n*\n      IY = KY\n      DO 30 I = 1, ML\n         YT( IY ) = ZERO\n         G( IY ) = ZERO\n         JX = KX\n         IF( TRAN )THEN\n            DO 10 J = 1, NL\n               YT( IY ) = YT( IY ) + A( J, I )*X( JX )\n               G( IY ) = G( IY ) + ABS( A( J, I )*X( JX ) )\n               JX = JX + INCXL\n   10       CONTINUE\n         ELSE\n            DO 20 J = 1, NL\n               YT( IY ) = YT( IY ) + A( I, J )*X( JX )\n               G( IY ) = G( IY ) + ABS( A( I, J )*X( JX ) )\n               JX = JX + INCXL\n   20       CONTINUE\n         END IF\n         YT( IY ) = ALPHA*YT( IY ) + BETA*Y( IY )\n         G( IY ) = ABS( ALPHA )*G( IY ) + ABS( BETA*Y( IY ) )\n         IY = IY + INCYL\n   30 CONTINUE\n*\n*     Compute the error ratio for this result.\n*\n      ERR = ZERO\n      DO 40 I = 1, ML\n         ERRI = ABS( YT( I ) - YY( 1 + ( I - 1 )*ABS( INCY ) ) )/EPS\n         IF( G( I ).NE.ZERO )\n     $      ERRI = ERRI/G( I )\n         ERR = MAX( ERR, ERRI )\n         IF( ERR*SQRT( EPS ).GE.ONE )\n     $      GO TO 50\n   40 CONTINUE\n*     If the loop completes, all results are at least half accurate.\n      GO TO 70\n*\n*     Report fatal error.\n*\n   50 FATAL = .TRUE.\n      WRITE( NOUT, FMT = 9999 )\n      DO 60 I = 1, ML\n         IF( MV )THEN\n            WRITE( NOUT, FMT = 9998 )I, YT( I ),\n     $         YY( 1 + ( I - 1 )*ABS( INCY ) )\n         ELSE\n            WRITE( NOUT, FMT = 9998 )I,\n     $         YY( 1 + ( I - 1 )*ABS( INCY ) ), YT( I )\n         END IF\n   60 CONTINUE\n*\n   70 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ******* FATAL ERROR - COMPUTED RESULT IS LESS THAN HAL',\n     $      'F ACCURATE *******', /'           EXPECTED RESULT   COMPU',\n     $      'TED RESULT' )\n 9998 FORMAT( 1X, I7, 2G18.6 )\n*\n*     End of DMVCH.\n*\n      END\n      LOGICAL FUNCTION LDE( RI, RJ, LR )\n*\n*  Tests if two arrays are identical.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Scalar Arguments ..\n      INTEGER            LR\n*     .. Array Arguments ..\n      DOUBLE PRECISION   RI( * ), RJ( * )\n*     .. Local Scalars ..\n      INTEGER            I\n*     .. Executable Statements ..\n      DO 10 I = 1, LR\n         IF( RI( I ).NE.RJ( I ) )\n     $      GO TO 20\n   10 CONTINUE\n      LDE = .TRUE.\n      GO TO 30\n   20 CONTINUE\n      LDE = .FALSE.\n   30 RETURN\n*\n*     End of LDE.\n*\n      END\n      LOGICAL FUNCTION LDERES( TYPE, UPLO, M, N, AA, AS, LDA )\n*\n*  Tests if selected elements in two arrays are equal.\n*\n*  TYPE is 'GE', 'SY' or 'SP'.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Scalar Arguments ..\n      INTEGER            LDA, M, N\n      CHARACTER*1        UPLO\n      CHARACTER*2        TYPE\n*     .. Array Arguments ..\n      DOUBLE PRECISION   AA( LDA, * ), AS( LDA, * )\n*     .. Local Scalars ..\n      INTEGER            I, IBEG, IEND, J\n      LOGICAL            UPPER\n*     .. Executable Statements ..\n      UPPER = UPLO.EQ.'U'\n      IF( TYPE.EQ.'GE' )THEN\n         DO 20 J = 1, N\n            DO 10 I = M + 1, LDA\n               IF( AA( I, J ).NE.AS( I, J ) )\n     $            GO TO 70\n   10       CONTINUE\n   20    CONTINUE\n      ELSE IF( TYPE.EQ.'SY' )THEN\n         DO 50 J = 1, N\n            IF( UPPER )THEN\n               IBEG = 1\n               IEND = J\n            ELSE\n               IBEG = J\n               IEND = N\n            END IF\n            DO 30 I = 1, IBEG - 1\n               IF( AA( I, J ).NE.AS( I, J ) )\n     $            GO TO 70\n   30       CONTINUE\n            DO 40 I = IEND + 1, LDA\n               IF( AA( I, J ).NE.AS( I, J ) )\n     $            GO TO 70\n   40       CONTINUE\n   50    CONTINUE\n      END IF\n*\n   60 CONTINUE\n      LDERES = .TRUE.\n      GO TO 80\n   70 CONTINUE\n      LDERES = .FALSE.\n   80 RETURN\n*\n*     End of LDERES.\n*\n      END\n      DOUBLE PRECISION FUNCTION DBEG( RESET )\n*\n*  Generates random numbers uniformly distributed between -0.5 and 0.5.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Scalar Arguments ..\n      LOGICAL            RESET\n*     .. Local Scalars ..\n      INTEGER            I, IC, MI\n*     .. Save statement ..\n      SAVE               I, IC, MI\n*     .. Intrinsic Functions ..\n      INTRINSIC          DBLE\n*     .. Executable Statements ..\n      IF( RESET )THEN\n*        Initialize local variables.\n         MI = 891\n         I = 7\n         IC = 0\n         RESET = .FALSE.\n      END IF\n*\n*     The sequence of values of I is bounded between 1 and 999.\n*     If initial I = 1,2,3,6,7 or 9, the period will be 50.\n*     If initial I = 4 or 8, the period will be 25.\n*     If initial I = 5, the period will be 10.\n*     IC is used to break up the period by skipping 1 value of I in 6.\n*\n      IC = IC + 1\n   10 I = I*MI\n      I = I - 1000*( I/1000 )\n      IF( IC.GE.5 )THEN\n         IC = 0\n         GO TO 10\n      END IF\n      DBEG = DBLE( I - 500 )/1001.0D0\n      RETURN\n*\n*     End of DBEG.\n*\n      END\n      DOUBLE PRECISION FUNCTION DDIFF( X, Y )\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION   X, Y\n*     .. Executable Statements ..\n      DDIFF = X - Y\n      RETURN\n*\n*     End of DDIFF.\n*\n      END\n      SUBROUTINE CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n*\n*  Tests whether XERBLA has detected an error when it should.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Scalar Arguments ..\n      INTEGER            INFOT, NOUT\n      LOGICAL            LERR, OK\n      CHARACTER*6        SRNAMT\n*     .. Executable Statements ..\n      IF( .NOT.LERR )THEN\n         WRITE( NOUT, FMT = 9999 )INFOT, SRNAMT\n         OK = .FALSE.\n      END IF\n      LERR = .FALSE.\n      RETURN\n*\n 9999 FORMAT( ' ***** ILLEGAL VALUE OF PARAMETER NUMBER ', I2, ' NOT D',\n     $      'ETECTED BY ', A6, ' *****' )\n*\n*     End of CHKXER.\n*\n      END\n      SUBROUTINE XERBLA( SRNAME, INFO )\n*\n*  This is a special version of XERBLA to be used only as part of\n*  the test program for testing error exits from the Level 2 BLAS\n*  routines.\n*\n*  XERBLA  is an error handler for the Level 2 BLAS routines.\n*\n*  It is called by the Level 2 BLAS routines if an input parameter is\n*  invalid.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Scalar Arguments ..\n      INTEGER            INFO\n      CHARACTER*6        SRNAME\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUT\n      LOGICAL            LERR, OK\n      CHARACTER*6        SRNAMT\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUT, OK, LERR\n      COMMON             /SRNAMC/SRNAMT\n*     .. Executable Statements ..\n      LERR = .TRUE.\n      IF( INFO.NE.INFOT )THEN\n         IF( INFOT.NE.0 )THEN\n            WRITE( NOUT, FMT = 9999 )INFO, INFOT\n         ELSE\n            WRITE( NOUT, FMT = 9997 )INFO\n         END IF\n         OK = .FALSE.\n      END IF\n      IF( SRNAME.NE.SRNAMT )THEN\n         WRITE( NOUT, FMT = 9998 )SRNAME, SRNAMT\n         OK = .FALSE.\n      END IF\n      RETURN\n*\n 9999 FORMAT( ' ******* XERBLA WAS CALLED WITH INFO = ', I6, ' INSTEAD',\n     $      ' OF ', I2, ' *******' )\n 9998 FORMAT( ' ******* XERBLA WAS CALLED WITH SRNAME = ', A6, ' INSTE',\n     $      'AD OF ', A6, ' *******' )\n 9997 FORMAT( ' ******* XERBLA WAS CALLED WITH INFO = ', I6,\n     $      ' *******' )\n*\n*     End of XERBLA\n*\n      END\n\n"
  },
  {
    "path": "libs/eigen/blas/testing/dblat3.f",
    "content": "      PROGRAM DBLAT3\n*\n*  Test program for the DOUBLE PRECISION Level 3 Blas.\n*\n*  The program must be driven by a short data file. The first 14 records\n*  of the file are read using list-directed input, the last 6 records\n*  are read using the format ( A6, L2 ). An annotated example of a data\n*  file can be obtained by deleting the first 3 characters from the\n*  following 20 lines:\n*  'DBLAT3.SUMM'     NAME OF SUMMARY OUTPUT FILE\n*  6                 UNIT NUMBER OF SUMMARY FILE\n*  'DBLAT3.SNAP'     NAME OF SNAPSHOT OUTPUT FILE\n*  -1                UNIT NUMBER OF SNAPSHOT FILE (NOT USED IF .LT. 0)\n*  F        LOGICAL FLAG, T TO REWIND SNAPSHOT FILE AFTER EACH RECORD.\n*  F        LOGICAL FLAG, T TO STOP ON FAILURES.\n*  T        LOGICAL FLAG, T TO TEST ERROR EXITS.\n*  16.0     THRESHOLD VALUE OF TEST RATIO\n*  6                 NUMBER OF VALUES OF N\n*  0 1 2 3 5 9       VALUES OF N\n*  3                 NUMBER OF VALUES OF ALPHA\n*  0.0 1.0 0.7       VALUES OF ALPHA\n*  3                 NUMBER OF VALUES OF BETA\n*  0.0 1.0 1.3       VALUES OF BETA\n*  DGEMM  T PUT F FOR NO TEST. SAME COLUMNS.\n*  DSYMM  T PUT F FOR NO TEST. SAME COLUMNS.\n*  DTRMM  T PUT F FOR NO TEST. SAME COLUMNS.\n*  DTRSM  T PUT F FOR NO TEST. SAME COLUMNS.\n*  DSYRK  T PUT F FOR NO TEST. SAME COLUMNS.\n*  DSYR2K T PUT F FOR NO TEST. SAME COLUMNS.\n*\n*  See:\n*\n*     Dongarra J. J., Du Croz J. J., Duff I. S. and Hammarling S.\n*     A Set of Level 3 Basic Linear Algebra Subprograms.\n*\n*     Technical Memorandum No.88 (Revision 1), Mathematics and\n*     Computer Science Division, Argonne National Laboratory, 9700\n*     South Cass Avenue, Argonne, Illinois 60439, US.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Parameters ..\n      INTEGER            NIN\n      PARAMETER          ( NIN = 5 )\n      INTEGER            NSUBS\n      PARAMETER          ( NSUBS = 6 )\n      DOUBLE PRECISION   ZERO, HALF, ONE\n      PARAMETER          ( ZERO = 0.0D0, HALF = 0.5D0, ONE = 1.0D0 )\n      INTEGER            NMAX\n      PARAMETER          ( NMAX = 65 )\n      INTEGER            NIDMAX, NALMAX, NBEMAX\n      PARAMETER          ( NIDMAX = 9, NALMAX = 7, NBEMAX = 7 )\n*     .. Local Scalars ..\n      DOUBLE PRECISION   EPS, ERR, THRESH\n      INTEGER            I, ISNUM, J, N, NALF, NBET, NIDIM, NOUT, NTRA\n      LOGICAL            FATAL, LTESTT, REWI, SAME, SFATAL, TRACE,\n     $                   TSTERR\n      CHARACTER*1        TRANSA, TRANSB\n      CHARACTER*6        SNAMET\n      CHARACTER*32       SNAPS, SUMMRY\n*     .. Local Arrays ..\n      DOUBLE PRECISION   AA( NMAX*NMAX ), AB( NMAX, 2*NMAX ),\n     $                   ALF( NALMAX ), AS( NMAX*NMAX ),\n     $                   BB( NMAX*NMAX ), BET( NBEMAX ),\n     $                   BS( NMAX*NMAX ), C( NMAX, NMAX ),\n     $                   CC( NMAX*NMAX ), CS( NMAX*NMAX ), CT( NMAX ),\n     $                   G( NMAX ), W( 2*NMAX )\n      INTEGER            IDIM( NIDMAX )\n      LOGICAL            LTEST( NSUBS )\n      CHARACTER*6        SNAMES( NSUBS )\n*     .. External Functions ..\n      DOUBLE PRECISION   DDIFF\n      LOGICAL            LDE\n      EXTERNAL           DDIFF, LDE\n*     .. External Subroutines ..\n      EXTERNAL           DCHK1, DCHK2, DCHK3, DCHK4, DCHK5, DCHKE, DMMCH\n*     .. Intrinsic Functions ..\n      INTRINSIC          MAX, MIN\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n      CHARACTER*6        SRNAMT\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n      COMMON             /SRNAMC/SRNAMT\n*     .. Data statements ..\n      DATA               SNAMES/'DGEMM ', 'DSYMM ', 'DTRMM ', 'DTRSM ',\n     $                   'DSYRK ', 'DSYR2K'/\n*     .. Executable Statements ..\n*\n*     Read name and unit number for summary output file and open file.\n*\n      READ( NIN, FMT = * )SUMMRY\n      READ( NIN, FMT = * )NOUT\n      OPEN( NOUT, FILE = SUMMRY, STATUS = 'NEW' )\n      NOUTC = NOUT\n*\n*     Read name and unit number for snapshot output file and open file.\n*\n      READ( NIN, FMT = * )SNAPS\n      READ( NIN, FMT = * )NTRA\n      TRACE = NTRA.GE.0\n      IF( TRACE )THEN\n         OPEN( NTRA, FILE = SNAPS, STATUS = 'NEW' )\n      END IF\n*     Read the flag that directs rewinding of the snapshot file.\n      READ( NIN, FMT = * )REWI\n      REWI = REWI.AND.TRACE\n*     Read the flag that directs stopping on any failure.\n      READ( NIN, FMT = * )SFATAL\n*     Read the flag that indicates whether error exits are to be tested.\n      READ( NIN, FMT = * )TSTERR\n*     Read the threshold value of the test ratio\n      READ( NIN, FMT = * )THRESH\n*\n*     Read and check the parameter values for the tests.\n*\n*     Values of N\n      READ( NIN, FMT = * )NIDIM\n      IF( NIDIM.LT.1.OR.NIDIM.GT.NIDMAX )THEN\n         WRITE( NOUT, FMT = 9997 )'N', NIDMAX\n         GO TO 220\n      END IF\n      READ( NIN, FMT = * )( IDIM( I ), I = 1, NIDIM )\n      DO 10 I = 1, NIDIM\n         IF( IDIM( I ).LT.0.OR.IDIM( I ).GT.NMAX )THEN\n            WRITE( NOUT, FMT = 9996 )NMAX\n            GO TO 220\n         END IF\n   10 CONTINUE\n*     Values of ALPHA\n      READ( NIN, FMT = * )NALF\n      IF( NALF.LT.1.OR.NALF.GT.NALMAX )THEN\n         WRITE( NOUT, FMT = 9997 )'ALPHA', NALMAX\n         GO TO 220\n      END IF\n      READ( NIN, FMT = * )( ALF( I ), I = 1, NALF )\n*     Values of BETA\n      READ( NIN, FMT = * )NBET\n      IF( NBET.LT.1.OR.NBET.GT.NBEMAX )THEN\n         WRITE( NOUT, FMT = 9997 )'BETA', NBEMAX\n         GO TO 220\n      END IF\n      READ( NIN, FMT = * )( BET( I ), I = 1, NBET )\n*\n*     Report values of parameters.\n*\n      WRITE( NOUT, FMT = 9995 )\n      WRITE( NOUT, FMT = 9994 )( IDIM( I ), I = 1, NIDIM )\n      WRITE( NOUT, FMT = 9993 )( ALF( I ), I = 1, NALF )\n      WRITE( NOUT, FMT = 9992 )( BET( I ), I = 1, NBET )\n      IF( .NOT.TSTERR )THEN\n         WRITE( NOUT, FMT = * )\n         WRITE( NOUT, FMT = 9984 )\n      END IF\n      WRITE( NOUT, FMT = * )\n      WRITE( NOUT, FMT = 9999 )THRESH\n      WRITE( NOUT, FMT = * )\n*\n*     Read names of subroutines and flags which indicate\n*     whether they are to be tested.\n*\n      DO 20 I = 1, NSUBS\n         LTEST( I ) = .FALSE.\n   20 CONTINUE\n   30 READ( NIN, FMT = 9988, END = 60 )SNAMET, LTESTT\n      DO 40 I = 1, NSUBS\n         IF( SNAMET.EQ.SNAMES( I ) )\n     $      GO TO 50\n   40 CONTINUE\n      WRITE( NOUT, FMT = 9990 )SNAMET\n      STOP\n   50 LTEST( I ) = LTESTT\n      GO TO 30\n*\n   60 CONTINUE\n      CLOSE ( NIN )\n*\n*     Compute EPS (the machine precision).\n*\n      EPS = ONE\n   70 CONTINUE\n      IF( DDIFF( ONE + EPS, ONE ).EQ.ZERO )\n     $   GO TO 80\n      EPS = HALF*EPS\n      GO TO 70\n   80 CONTINUE\n      EPS = EPS + EPS\n      WRITE( NOUT, FMT = 9998 )EPS\n*\n*     Check the reliability of DMMCH using exact data.\n*\n      N = MIN( 32, NMAX )\n      DO 100 J = 1, N\n         DO 90 I = 1, N\n            AB( I, J ) = MAX( I - J + 1, 0 )\n   90    CONTINUE\n         AB( J, NMAX + 1 ) = J\n         AB( 1, NMAX + J ) = J\n         C( J, 1 ) = ZERO\n  100 CONTINUE\n      DO 110 J = 1, N\n         CC( J ) = J*( ( J + 1 )*J )/2 - ( ( J + 1 )*J*( J - 1 ) )/3\n  110 CONTINUE\n*     CC holds the exact result. On exit from DMMCH CT holds\n*     the result computed by DMMCH.\n      TRANSA = 'N'\n      TRANSB = 'N'\n      CALL DMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX,\n     $            AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC,\n     $            NMAX, EPS, ERR, FATAL, NOUT, .TRUE. )\n      SAME = LDE( CC, CT, N )\n      IF( .NOT.SAME.OR.ERR.NE.ZERO )THEN\n         WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR\n         STOP\n      END IF\n      TRANSB = 'T'\n      CALL DMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX,\n     $            AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC,\n     $            NMAX, EPS, ERR, FATAL, NOUT, .TRUE. )\n      SAME = LDE( CC, CT, N )\n      IF( .NOT.SAME.OR.ERR.NE.ZERO )THEN\n         WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR\n         STOP\n      END IF\n      DO 120 J = 1, N\n         AB( J, NMAX + 1 ) = N - J + 1\n         AB( 1, NMAX + J ) = N - J + 1\n  120 CONTINUE\n      DO 130 J = 1, N\n         CC( N - J + 1 ) = J*( ( J + 1 )*J )/2 -\n     $                     ( ( J + 1 )*J*( J - 1 ) )/3\n  130 CONTINUE\n      TRANSA = 'T'\n      TRANSB = 'N'\n      CALL DMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX,\n     $            AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC,\n     $            NMAX, EPS, ERR, FATAL, NOUT, .TRUE. )\n      SAME = LDE( CC, CT, N )\n      IF( .NOT.SAME.OR.ERR.NE.ZERO )THEN\n         WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR\n         STOP\n      END IF\n      TRANSB = 'T'\n      CALL DMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX,\n     $            AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC,\n     $            NMAX, EPS, ERR, FATAL, NOUT, .TRUE. )\n      SAME = LDE( CC, CT, N )\n      IF( .NOT.SAME.OR.ERR.NE.ZERO )THEN\n         WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR\n         STOP\n      END IF\n*\n*     Test each subroutine in turn.\n*\n      DO 200 ISNUM = 1, NSUBS\n         WRITE( NOUT, FMT = * )\n         IF( .NOT.LTEST( ISNUM ) )THEN\n*           Subprogram is not to be tested.\n            WRITE( NOUT, FMT = 9987 )SNAMES( ISNUM )\n         ELSE\n            SRNAMT = SNAMES( ISNUM )\n*           Test error exits.\n            IF( TSTERR )THEN\n               CALL DCHKE( ISNUM, SNAMES( ISNUM ), NOUT )\n               WRITE( NOUT, FMT = * )\n            END IF\n*           Test computations.\n            INFOT = 0\n            OK = .TRUE.\n            FATAL = .FALSE.\n            GO TO ( 140, 150, 160, 160, 170, 180 )ISNUM\n*           Test DGEMM, 01.\n  140       CALL DCHK1( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,\n     $                  NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C,\n     $                  CC, CS, CT, G )\n            GO TO 190\n*           Test DSYMM, 02.\n  150       CALL DCHK2( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,\n     $                  NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C,\n     $                  CC, CS, CT, G )\n            GO TO 190\n*           Test DTRMM, 03, DTRSM, 04.\n  160       CALL DCHK3( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NMAX, AB,\n     $                  AA, AS, AB( 1, NMAX + 1 ), BB, BS, CT, G, C )\n            GO TO 190\n*           Test DSYRK, 05.\n  170       CALL DCHK4( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,\n     $                  NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C,\n     $                  CC, CS, CT, G )\n            GO TO 190\n*           Test DSYR2K, 06.\n  180       CALL DCHK5( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,\n     $                  NMAX, AB, AA, AS, BB, BS, C, CC, CS, CT, G, W )\n            GO TO 190\n*\n  190       IF( FATAL.AND.SFATAL )\n     $         GO TO 210\n         END IF\n  200 CONTINUE\n      WRITE( NOUT, FMT = 9986 )\n      GO TO 230\n*\n  210 CONTINUE\n      WRITE( NOUT, FMT = 9985 )\n      GO TO 230\n*\n  220 CONTINUE\n      WRITE( NOUT, FMT = 9991 )\n*\n  230 CONTINUE\n      IF( TRACE )\n     $   CLOSE ( NTRA )\n      CLOSE ( NOUT )\n      STOP\n*\n 9999 FORMAT( ' ROUTINES PASS COMPUTATIONAL TESTS IF TEST RATIO IS LES',\n     $      'S THAN', F8.2 )\n 9998 FORMAT( ' RELATIVE MACHINE PRECISION IS TAKEN TO BE', 1P, D9.1 )\n 9997 FORMAT( ' NUMBER OF VALUES OF ', A, ' IS LESS THAN 1 OR GREATER ',\n     $      'THAN ', I2 )\n 9996 FORMAT( ' VALUE OF N IS LESS THAN 0 OR GREATER THAN ', I2 )\n 9995 FORMAT( ' TESTS OF THE DOUBLE PRECISION LEVEL 3 BLAS', //' THE F',\n     $      'OLLOWING PARAMETER VALUES WILL BE USED:' )\n 9994 FORMAT( '   FOR N              ', 9I6 )\n 9993 FORMAT( '   FOR ALPHA          ', 7F6.1 )\n 9992 FORMAT( '   FOR BETA           ', 7F6.1 )\n 9991 FORMAT( ' AMEND DATA FILE OR INCREASE ARRAY SIZES IN PROGRAM',\n     $      /' ******* TESTS ABANDONED *******' )\n 9990 FORMAT( ' SUBPROGRAM NAME ', A6, ' NOT RECOGNIZED', /' ******* T',\n     $      'ESTS ABANDONED *******' )\n 9989 FORMAT( ' ERROR IN DMMCH -  IN-LINE DOT PRODUCTS ARE BEING EVALU',\n     $      'ATED WRONGLY.', /' DMMCH WAS CALLED WITH TRANSA = ', A1,\n     $      ' AND TRANSB = ', A1, /' AND RETURNED SAME = ', L1, ' AND ',\n     $      'ERR = ', F12.3, '.', /' THIS MAY BE DUE TO FAULTS IN THE ',\n     $      'ARITHMETIC OR THE COMPILER.', /' ******* TESTS ABANDONED ',\n     $      '*******' )\n 9988 FORMAT( A6, L2 )\n 9987 FORMAT( 1X, A6, ' WAS NOT TESTED' )\n 9986 FORMAT( /' END OF TESTS' )\n 9985 FORMAT( /' ******* FATAL ERROR - TESTS ABANDONED *******' )\n 9984 FORMAT( ' ERROR-EXITS WILL NOT BE TESTED' )\n*\n*     End of DBLAT3.\n*\n      END\n      SUBROUTINE DCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX,\n     $                  A, AA, AS, B, BB, BS, C, CC, CS, CT, G )\n*\n*  Tests DGEMM.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Parameters ..\n      DOUBLE PRECISION   ZERO\n      PARAMETER          ( ZERO = 0.0D0 )\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION   EPS, THRESH\n      INTEGER            NALF, NBET, NIDIM, NMAX, NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      DOUBLE PRECISION   A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),\n     $                   AS( NMAX*NMAX ), B( NMAX, NMAX ),\n     $                   BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ),\n     $                   C( NMAX, NMAX ), CC( NMAX*NMAX ),\n     $                   CS( NMAX*NMAX ), CT( NMAX ), G( NMAX )\n      INTEGER            IDIM( NIDIM )\n*     .. Local Scalars ..\n      DOUBLE PRECISION   ALPHA, ALS, BETA, BLS, ERR, ERRMAX\n      INTEGER            I, IA, IB, ICA, ICB, IK, IM, IN, K, KS, LAA,\n     $                   LBB, LCC, LDA, LDAS, LDB, LDBS, LDC, LDCS, M,\n     $                   MA, MB, MS, N, NA, NARGS, NB, NC, NS\n      LOGICAL            NULL, RESET, SAME, TRANA, TRANB\n      CHARACTER*1        TRANAS, TRANBS, TRANSA, TRANSB\n      CHARACTER*3        ICH\n*     .. Local Arrays ..\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LDE, LDERES\n      EXTERNAL           LDE, LDERES\n*     .. External Subroutines ..\n      EXTERNAL           DGEMM, DMAKE, DMMCH\n*     .. Intrinsic Functions ..\n      INTRINSIC          MAX\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Data statements ..\n      DATA               ICH/'NTC'/\n*     .. Executable Statements ..\n*\n      NARGS = 13\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = ZERO\n*\n      DO 110 IM = 1, NIDIM\n         M = IDIM( IM )\n*\n         DO 100 IN = 1, NIDIM\n            N = IDIM( IN )\n*           Set LDC to 1 more than minimum value if room.\n            LDC = M\n            IF( LDC.LT.NMAX )\n     $         LDC = LDC + 1\n*           Skip tests if not enough room.\n            IF( LDC.GT.NMAX )\n     $         GO TO 100\n            LCC = LDC*N\n            NULL = N.LE.0.OR.M.LE.0\n*\n            DO 90 IK = 1, NIDIM\n               K = IDIM( IK )\n*\n               DO 80 ICA = 1, 3\n                  TRANSA = ICH( ICA: ICA )\n                  TRANA = TRANSA.EQ.'T'.OR.TRANSA.EQ.'C'\n*\n                  IF( TRANA )THEN\n                     MA = K\n                     NA = M\n                  ELSE\n                     MA = M\n                     NA = K\n                  END IF\n*                 Set LDA to 1 more than minimum value if room.\n                  LDA = MA\n                  IF( LDA.LT.NMAX )\n     $               LDA = LDA + 1\n*                 Skip tests if not enough room.\n                  IF( LDA.GT.NMAX )\n     $               GO TO 80\n                  LAA = LDA*NA\n*\n*                 Generate the matrix A.\n*\n                  CALL DMAKE( 'GE', ' ', ' ', MA, NA, A, NMAX, AA, LDA,\n     $                        RESET, ZERO )\n*\n                  DO 70 ICB = 1, 3\n                     TRANSB = ICH( ICB: ICB )\n                     TRANB = TRANSB.EQ.'T'.OR.TRANSB.EQ.'C'\n*\n                     IF( TRANB )THEN\n                        MB = N\n                        NB = K\n                     ELSE\n                        MB = K\n                        NB = N\n                     END IF\n*                    Set LDB to 1 more than minimum value if room.\n                     LDB = MB\n                     IF( LDB.LT.NMAX )\n     $                  LDB = LDB + 1\n*                    Skip tests if not enough room.\n                     IF( LDB.GT.NMAX )\n     $                  GO TO 70\n                     LBB = LDB*NB\n*\n*                    Generate the matrix B.\n*\n                     CALL DMAKE( 'GE', ' ', ' ', MB, NB, B, NMAX, BB,\n     $                           LDB, RESET, ZERO )\n*\n                     DO 60 IA = 1, NALF\n                        ALPHA = ALF( IA )\n*\n                        DO 50 IB = 1, NBET\n                           BETA = BET( IB )\n*\n*                          Generate the matrix C.\n*\n                           CALL DMAKE( 'GE', ' ', ' ', M, N, C, NMAX,\n     $                                 CC, LDC, RESET, ZERO )\n*\n                           NC = NC + 1\n*\n*                          Save every datum before calling the\n*                          subroutine.\n*\n                           TRANAS = TRANSA\n                           TRANBS = TRANSB\n                           MS = M\n                           NS = N\n                           KS = K\n                           ALS = ALPHA\n                           DO 10 I = 1, LAA\n                              AS( I ) = AA( I )\n   10                      CONTINUE\n                           LDAS = LDA\n                           DO 20 I = 1, LBB\n                              BS( I ) = BB( I )\n   20                      CONTINUE\n                           LDBS = LDB\n                           BLS = BETA\n                           DO 30 I = 1, LCC\n                              CS( I ) = CC( I )\n   30                      CONTINUE\n                           LDCS = LDC\n*\n*                          Call the subroutine.\n*\n                           IF( TRACE )\n     $                        WRITE( NTRA, FMT = 9995 )NC, SNAME,\n     $                        TRANSA, TRANSB, M, N, K, ALPHA, LDA, LDB,\n     $                        BETA, LDC\n                           IF( REWI )\n     $                        REWIND NTRA\n                           CALL DGEMM( TRANSA, TRANSB, M, N, K, ALPHA,\n     $                                 AA, LDA, BB, LDB, BETA, CC, LDC )\n*\n*                          Check if error-exit was taken incorrectly.\n*\n                           IF( .NOT.OK )THEN\n                              WRITE( NOUT, FMT = 9994 )\n                              FATAL = .TRUE.\n                              GO TO 120\n                           END IF\n*\n*                          See what data changed inside subroutines.\n*\n                           ISAME( 1 ) = TRANSA.EQ.TRANAS\n                           ISAME( 2 ) = TRANSB.EQ.TRANBS\n                           ISAME( 3 ) = MS.EQ.M\n                           ISAME( 4 ) = NS.EQ.N\n                           ISAME( 5 ) = KS.EQ.K\n                           ISAME( 6 ) = ALS.EQ.ALPHA\n                           ISAME( 7 ) = LDE( AS, AA, LAA )\n                           ISAME( 8 ) = LDAS.EQ.LDA\n                           ISAME( 9 ) = LDE( BS, BB, LBB )\n                           ISAME( 10 ) = LDBS.EQ.LDB\n                           ISAME( 11 ) = BLS.EQ.BETA\n                           IF( NULL )THEN\n                              ISAME( 12 ) = LDE( CS, CC, LCC )\n                           ELSE\n                              ISAME( 12 ) = LDERES( 'GE', ' ', M, N, CS,\n     $                                      CC, LDC )\n                           END IF\n                           ISAME( 13 ) = LDCS.EQ.LDC\n*\n*                          If data was incorrectly changed, report\n*                          and return.\n*\n                           SAME = .TRUE.\n                           DO 40 I = 1, NARGS\n                              SAME = SAME.AND.ISAME( I )\n                              IF( .NOT.ISAME( I ) )\n     $                           WRITE( NOUT, FMT = 9998 )I\n   40                      CONTINUE\n                           IF( .NOT.SAME )THEN\n                              FATAL = .TRUE.\n                              GO TO 120\n                           END IF\n*\n                           IF( .NOT.NULL )THEN\n*\n*                             Check the result.\n*\n                              CALL DMMCH( TRANSA, TRANSB, M, N, K,\n     $                                    ALPHA, A, NMAX, B, NMAX, BETA,\n     $                                    C, NMAX, CT, G, CC, LDC, EPS,\n     $                                    ERR, FATAL, NOUT, .TRUE. )\n                              ERRMAX = MAX( ERRMAX, ERR )\n*                             If got really bad answer, report and\n*                             return.\n                              IF( FATAL )\n     $                           GO TO 120\n                           END IF\n*\n   50                   CONTINUE\n*\n   60                CONTINUE\n*\n   70             CONTINUE\n*\n   80          CONTINUE\n*\n   90       CONTINUE\n*\n  100    CONTINUE\n*\n  110 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 130\n*\n  120 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      WRITE( NOUT, FMT = 9995 )NC, SNAME, TRANSA, TRANSB, M, N, K,\n     $   ALPHA, LDA, LDB, BETA, LDC\n*\n  130 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',''', A1, ''',',\n     $      3( I3, ',' ), F4.1, ', A,', I3, ', B,', I3, ',', F4.1, ', ',\n     $      'C,', I3, ').' )\n 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of DCHK1.\n*\n      END\n      SUBROUTINE DCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX,\n     $                  A, AA, AS, B, BB, BS, C, CC, CS, CT, G )\n*\n*  Tests DSYMM.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Parameters ..\n      DOUBLE PRECISION   ZERO\n      PARAMETER          ( ZERO = 0.0D0 )\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION   EPS, THRESH\n      INTEGER            NALF, NBET, NIDIM, NMAX, NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      DOUBLE PRECISION   A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),\n     $                   AS( NMAX*NMAX ), B( NMAX, NMAX ),\n     $                   BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ),\n     $                   C( NMAX, NMAX ), CC( NMAX*NMAX ),\n     $                   CS( NMAX*NMAX ), CT( NMAX ), G( NMAX )\n      INTEGER            IDIM( NIDIM )\n*     .. Local Scalars ..\n      DOUBLE PRECISION   ALPHA, ALS, BETA, BLS, ERR, ERRMAX\n      INTEGER            I, IA, IB, ICS, ICU, IM, IN, LAA, LBB, LCC,\n     $                   LDA, LDAS, LDB, LDBS, LDC, LDCS, M, MS, N, NA,\n     $                   NARGS, NC, NS\n      LOGICAL            LEFT, NULL, RESET, SAME\n      CHARACTER*1        SIDE, SIDES, UPLO, UPLOS\n      CHARACTER*2        ICHS, ICHU\n*     .. Local Arrays ..\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LDE, LDERES\n      EXTERNAL           LDE, LDERES\n*     .. External Subroutines ..\n      EXTERNAL           DMAKE, DMMCH, DSYMM\n*     .. Intrinsic Functions ..\n      INTRINSIC          MAX\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Data statements ..\n      DATA               ICHS/'LR'/, ICHU/'UL'/\n*     .. Executable Statements ..\n*\n      NARGS = 12\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = ZERO\n*\n      DO 100 IM = 1, NIDIM\n         M = IDIM( IM )\n*\n         DO 90 IN = 1, NIDIM\n            N = IDIM( IN )\n*           Set LDC to 1 more than minimum value if room.\n            LDC = M\n            IF( LDC.LT.NMAX )\n     $         LDC = LDC + 1\n*           Skip tests if not enough room.\n            IF( LDC.GT.NMAX )\n     $         GO TO 90\n            LCC = LDC*N\n            NULL = N.LE.0.OR.M.LE.0\n*\n*           Set LDB to 1 more than minimum value if room.\n            LDB = M\n            IF( LDB.LT.NMAX )\n     $         LDB = LDB + 1\n*           Skip tests if not enough room.\n            IF( LDB.GT.NMAX )\n     $         GO TO 90\n            LBB = LDB*N\n*\n*           Generate the matrix B.\n*\n            CALL DMAKE( 'GE', ' ', ' ', M, N, B, NMAX, BB, LDB, RESET,\n     $                  ZERO )\n*\n            DO 80 ICS = 1, 2\n               SIDE = ICHS( ICS: ICS )\n               LEFT = SIDE.EQ.'L'\n*\n               IF( LEFT )THEN\n                  NA = M\n               ELSE\n                  NA = N\n               END IF\n*              Set LDA to 1 more than minimum value if room.\n               LDA = NA\n               IF( LDA.LT.NMAX )\n     $            LDA = LDA + 1\n*              Skip tests if not enough room.\n               IF( LDA.GT.NMAX )\n     $            GO TO 80\n               LAA = LDA*NA\n*\n               DO 70 ICU = 1, 2\n                  UPLO = ICHU( ICU: ICU )\n*\n*                 Generate the symmetric matrix A.\n*\n                  CALL DMAKE( 'SY', UPLO, ' ', NA, NA, A, NMAX, AA, LDA,\n     $                        RESET, ZERO )\n*\n                  DO 60 IA = 1, NALF\n                     ALPHA = ALF( IA )\n*\n                     DO 50 IB = 1, NBET\n                        BETA = BET( IB )\n*\n*                       Generate the matrix C.\n*\n                        CALL DMAKE( 'GE', ' ', ' ', M, N, C, NMAX, CC,\n     $                              LDC, RESET, ZERO )\n*\n                        NC = NC + 1\n*\n*                       Save every datum before calling the\n*                       subroutine.\n*\n                        SIDES = SIDE\n                        UPLOS = UPLO\n                        MS = M\n                        NS = N\n                        ALS = ALPHA\n                        DO 10 I = 1, LAA\n                           AS( I ) = AA( I )\n   10                   CONTINUE\n                        LDAS = LDA\n                        DO 20 I = 1, LBB\n                           BS( I ) = BB( I )\n   20                   CONTINUE\n                        LDBS = LDB\n                        BLS = BETA\n                        DO 30 I = 1, LCC\n                           CS( I ) = CC( I )\n   30                   CONTINUE\n                        LDCS = LDC\n*\n*                       Call the subroutine.\n*\n                        IF( TRACE )\n     $                     WRITE( NTRA, FMT = 9995 )NC, SNAME, SIDE,\n     $                     UPLO, M, N, ALPHA, LDA, LDB, BETA, LDC\n                        IF( REWI )\n     $                     REWIND NTRA\n                        CALL DSYMM( SIDE, UPLO, M, N, ALPHA, AA, LDA,\n     $                              BB, LDB, BETA, CC, LDC )\n*\n*                       Check if error-exit was taken incorrectly.\n*\n                        IF( .NOT.OK )THEN\n                           WRITE( NOUT, FMT = 9994 )\n                           FATAL = .TRUE.\n                           GO TO 110\n                        END IF\n*\n*                       See what data changed inside subroutines.\n*\n                        ISAME( 1 ) = SIDES.EQ.SIDE\n                        ISAME( 2 ) = UPLOS.EQ.UPLO\n                        ISAME( 3 ) = MS.EQ.M\n                        ISAME( 4 ) = NS.EQ.N\n                        ISAME( 5 ) = ALS.EQ.ALPHA\n                        ISAME( 6 ) = LDE( AS, AA, LAA )\n                        ISAME( 7 ) = LDAS.EQ.LDA\n                        ISAME( 8 ) = LDE( BS, BB, LBB )\n                        ISAME( 9 ) = LDBS.EQ.LDB\n                        ISAME( 10 ) = BLS.EQ.BETA\n                        IF( NULL )THEN\n                           ISAME( 11 ) = LDE( CS, CC, LCC )\n                        ELSE\n                           ISAME( 11 ) = LDERES( 'GE', ' ', M, N, CS,\n     $                                   CC, LDC )\n                        END IF\n                        ISAME( 12 ) = LDCS.EQ.LDC\n*\n*                       If data was incorrectly changed, report and\n*                       return.\n*\n                        SAME = .TRUE.\n                        DO 40 I = 1, NARGS\n                           SAME = SAME.AND.ISAME( I )\n                           IF( .NOT.ISAME( I ) )\n     $                        WRITE( NOUT, FMT = 9998 )I\n   40                   CONTINUE\n                        IF( .NOT.SAME )THEN\n                           FATAL = .TRUE.\n                           GO TO 110\n                        END IF\n*\n                        IF( .NOT.NULL )THEN\n*\n*                          Check the result.\n*\n                           IF( LEFT )THEN\n                              CALL DMMCH( 'N', 'N', M, N, M, ALPHA, A,\n     $                                    NMAX, B, NMAX, BETA, C, NMAX,\n     $                                    CT, G, CC, LDC, EPS, ERR,\n     $                                    FATAL, NOUT, .TRUE. )\n                           ELSE\n                              CALL DMMCH( 'N', 'N', M, N, N, ALPHA, B,\n     $                                    NMAX, A, NMAX, BETA, C, NMAX,\n     $                                    CT, G, CC, LDC, EPS, ERR,\n     $                                    FATAL, NOUT, .TRUE. )\n                           END IF\n                           ERRMAX = MAX( ERRMAX, ERR )\n*                          If got really bad answer, report and\n*                          return.\n                           IF( FATAL )\n     $                        GO TO 110\n                        END IF\n*\n   50                CONTINUE\n*\n   60             CONTINUE\n*\n   70          CONTINUE\n*\n   80       CONTINUE\n*\n   90    CONTINUE\n*\n  100 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 120\n*\n  110 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      WRITE( NOUT, FMT = 9995 )NC, SNAME, SIDE, UPLO, M, N, ALPHA, LDA,\n     $   LDB, BETA, LDC\n*\n  120 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ),\n     $      F4.1, ', A,', I3, ', B,', I3, ',', F4.1, ', C,', I3, ')   ',\n     $      ' .' )\n 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of DCHK2.\n*\n      END\n      SUBROUTINE DCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NALF, ALF, NMAX, A, AA, AS,\n     $                  B, BB, BS, CT, G, C )\n*\n*  Tests DTRMM and DTRSM.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Parameters ..\n      DOUBLE PRECISION   ZERO, ONE\n      PARAMETER          ( ZERO = 0.0D0, ONE = 1.0D0 )\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION   EPS, THRESH\n      INTEGER            NALF, NIDIM, NMAX, NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      DOUBLE PRECISION   A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),\n     $                   AS( NMAX*NMAX ), B( NMAX, NMAX ),\n     $                   BB( NMAX*NMAX ), BS( NMAX*NMAX ),\n     $                   C( NMAX, NMAX ), CT( NMAX ), G( NMAX )\n      INTEGER            IDIM( NIDIM )\n*     .. Local Scalars ..\n      DOUBLE PRECISION   ALPHA, ALS, ERR, ERRMAX\n      INTEGER            I, IA, ICD, ICS, ICT, ICU, IM, IN, J, LAA, LBB,\n     $                   LDA, LDAS, LDB, LDBS, M, MS, N, NA, NARGS, NC,\n     $                   NS\n      LOGICAL            LEFT, NULL, RESET, SAME\n      CHARACTER*1        DIAG, DIAGS, SIDE, SIDES, TRANAS, TRANSA, UPLO,\n     $                   UPLOS\n      CHARACTER*2        ICHD, ICHS, ICHU\n      CHARACTER*3        ICHT\n*     .. Local Arrays ..\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LDE, LDERES\n      EXTERNAL           LDE, LDERES\n*     .. External Subroutines ..\n      EXTERNAL           DMAKE, DMMCH, DTRMM, DTRSM\n*     .. Intrinsic Functions ..\n      INTRINSIC          MAX\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Data statements ..\n      DATA               ICHU/'UL'/, ICHT/'NTC'/, ICHD/'UN'/, ICHS/'LR'/\n*     .. Executable Statements ..\n*\n      NARGS = 11\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = ZERO\n*     Set up zero matrix for DMMCH.\n      DO 20 J = 1, NMAX\n         DO 10 I = 1, NMAX\n            C( I, J ) = ZERO\n   10    CONTINUE\n   20 CONTINUE\n*\n      DO 140 IM = 1, NIDIM\n         M = IDIM( IM )\n*\n         DO 130 IN = 1, NIDIM\n            N = IDIM( IN )\n*           Set LDB to 1 more than minimum value if room.\n            LDB = M\n            IF( LDB.LT.NMAX )\n     $         LDB = LDB + 1\n*           Skip tests if not enough room.\n            IF( LDB.GT.NMAX )\n     $         GO TO 130\n            LBB = LDB*N\n            NULL = M.LE.0.OR.N.LE.0\n*\n            DO 120 ICS = 1, 2\n               SIDE = ICHS( ICS: ICS )\n               LEFT = SIDE.EQ.'L'\n               IF( LEFT )THEN\n                  NA = M\n               ELSE\n                  NA = N\n               END IF\n*              Set LDA to 1 more than minimum value if room.\n               LDA = NA\n               IF( LDA.LT.NMAX )\n     $            LDA = LDA + 1\n*              Skip tests if not enough room.\n               IF( LDA.GT.NMAX )\n     $            GO TO 130\n               LAA = LDA*NA\n*\n               DO 110 ICU = 1, 2\n                  UPLO = ICHU( ICU: ICU )\n*\n                  DO 100 ICT = 1, 3\n                     TRANSA = ICHT( ICT: ICT )\n*\n                     DO 90 ICD = 1, 2\n                        DIAG = ICHD( ICD: ICD )\n*\n                        DO 80 IA = 1, NALF\n                           ALPHA = ALF( IA )\n*\n*                          Generate the matrix A.\n*\n                           CALL DMAKE( 'TR', UPLO, DIAG, NA, NA, A,\n     $                                 NMAX, AA, LDA, RESET, ZERO )\n*\n*                          Generate the matrix B.\n*\n                           CALL DMAKE( 'GE', ' ', ' ', M, N, B, NMAX,\n     $                                 BB, LDB, RESET, ZERO )\n*\n                           NC = NC + 1\n*\n*                          Save every datum before calling the\n*                          subroutine.\n*\n                           SIDES = SIDE\n                           UPLOS = UPLO\n                           TRANAS = TRANSA\n                           DIAGS = DIAG\n                           MS = M\n                           NS = N\n                           ALS = ALPHA\n                           DO 30 I = 1, LAA\n                              AS( I ) = AA( I )\n   30                      CONTINUE\n                           LDAS = LDA\n                           DO 40 I = 1, LBB\n                              BS( I ) = BB( I )\n   40                      CONTINUE\n                           LDBS = LDB\n*\n*                          Call the subroutine.\n*\n                           IF( SNAME( 4: 5 ).EQ.'MM' )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9995 )NC, SNAME,\n     $                           SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA,\n     $                           LDA, LDB\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL DTRMM( SIDE, UPLO, TRANSA, DIAG, M,\n     $                                    N, ALPHA, AA, LDA, BB, LDB )\n                           ELSE IF( SNAME( 4: 5 ).EQ.'SM' )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9995 )NC, SNAME,\n     $                           SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA,\n     $                           LDA, LDB\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL DTRSM( SIDE, UPLO, TRANSA, DIAG, M,\n     $                                    N, ALPHA, AA, LDA, BB, LDB )\n                           END IF\n*\n*                          Check if error-exit was taken incorrectly.\n*\n                           IF( .NOT.OK )THEN\n                              WRITE( NOUT, FMT = 9994 )\n                              FATAL = .TRUE.\n                              GO TO 150\n                           END IF\n*\n*                          See what data changed inside subroutines.\n*\n                           ISAME( 1 ) = SIDES.EQ.SIDE\n                           ISAME( 2 ) = UPLOS.EQ.UPLO\n                           ISAME( 3 ) = TRANAS.EQ.TRANSA\n                           ISAME( 4 ) = DIAGS.EQ.DIAG\n                           ISAME( 5 ) = MS.EQ.M\n                           ISAME( 6 ) = NS.EQ.N\n                           ISAME( 7 ) = ALS.EQ.ALPHA\n                           ISAME( 8 ) = LDE( AS, AA, LAA )\n                           ISAME( 9 ) = LDAS.EQ.LDA\n                           IF( NULL )THEN\n                              ISAME( 10 ) = LDE( BS, BB, LBB )\n                           ELSE\n                              ISAME( 10 ) = LDERES( 'GE', ' ', M, N, BS,\n     $                                      BB, LDB )\n                           END IF\n                           ISAME( 11 ) = LDBS.EQ.LDB\n*\n*                          If data was incorrectly changed, report and\n*                          return.\n*\n                           SAME = .TRUE.\n                           DO 50 I = 1, NARGS\n                              SAME = SAME.AND.ISAME( I )\n                              IF( .NOT.ISAME( I ) )\n     $                           WRITE( NOUT, FMT = 9998 )I\n   50                      CONTINUE\n                           IF( .NOT.SAME )THEN\n                              FATAL = .TRUE.\n                              GO TO 150\n                           END IF\n*\n                           IF( .NOT.NULL )THEN\n                              IF( SNAME( 4: 5 ).EQ.'MM' )THEN\n*\n*                                Check the result.\n*\n                                 IF( LEFT )THEN\n                                    CALL DMMCH( TRANSA, 'N', M, N, M,\n     $                                          ALPHA, A, NMAX, B, NMAX,\n     $                                          ZERO, C, NMAX, CT, G,\n     $                                          BB, LDB, EPS, ERR,\n     $                                          FATAL, NOUT, .TRUE. )\n                                 ELSE\n                                    CALL DMMCH( 'N', TRANSA, M, N, N,\n     $                                          ALPHA, B, NMAX, A, NMAX,\n     $                                          ZERO, C, NMAX, CT, G,\n     $                                          BB, LDB, EPS, ERR,\n     $                                          FATAL, NOUT, .TRUE. )\n                                 END IF\n                              ELSE IF( SNAME( 4: 5 ).EQ.'SM' )THEN\n*\n*                                Compute approximation to original\n*                                matrix.\n*\n                                 DO 70 J = 1, N\n                                    DO 60 I = 1, M\n                                       C( I, J ) = BB( I + ( J - 1 )*\n     $                                             LDB )\n                                       BB( I + ( J - 1 )*LDB ) = ALPHA*\n     $                                    B( I, J )\n   60                               CONTINUE\n   70                            CONTINUE\n*\n                                 IF( LEFT )THEN\n                                    CALL DMMCH( TRANSA, 'N', M, N, M,\n     $                                          ONE, A, NMAX, C, NMAX,\n     $                                          ZERO, B, NMAX, CT, G,\n     $                                          BB, LDB, EPS, ERR,\n     $                                          FATAL, NOUT, .FALSE. )\n                                 ELSE\n                                    CALL DMMCH( 'N', TRANSA, M, N, N,\n     $                                          ONE, C, NMAX, A, NMAX,\n     $                                          ZERO, B, NMAX, CT, G,\n     $                                          BB, LDB, EPS, ERR,\n     $                                          FATAL, NOUT, .FALSE. )\n                                 END IF\n                              END IF\n                              ERRMAX = MAX( ERRMAX, ERR )\n*                             If got really bad answer, report and\n*                             return.\n                              IF( FATAL )\n     $                           GO TO 150\n                           END IF\n*\n   80                   CONTINUE\n*\n   90                CONTINUE\n*\n  100             CONTINUE\n*\n  110          CONTINUE\n*\n  120       CONTINUE\n*\n  130    CONTINUE\n*\n  140 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 160\n*\n  150 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      WRITE( NOUT, FMT = 9995 )NC, SNAME, SIDE, UPLO, TRANSA, DIAG, M,\n     $   N, ALPHA, LDA, LDB\n*\n  160 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( 1X, I6, ': ', A6, '(', 4( '''', A1, ''',' ), 2( I3, ',' ),\n     $      F4.1, ', A,', I3, ', B,', I3, ')        .' )\n 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of DCHK3.\n*\n      END\n      SUBROUTINE DCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX,\n     $                  A, AA, AS, B, BB, BS, C, CC, CS, CT, G )\n*\n*  Tests DSYRK.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Parameters ..\n      DOUBLE PRECISION   ZERO\n      PARAMETER          ( ZERO = 0.0D0 )\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION   EPS, THRESH\n      INTEGER            NALF, NBET, NIDIM, NMAX, NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      DOUBLE PRECISION   A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),\n     $                   AS( NMAX*NMAX ), B( NMAX, NMAX ),\n     $                   BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ),\n     $                   C( NMAX, NMAX ), CC( NMAX*NMAX ),\n     $                   CS( NMAX*NMAX ), CT( NMAX ), G( NMAX )\n      INTEGER            IDIM( NIDIM )\n*     .. Local Scalars ..\n      DOUBLE PRECISION   ALPHA, ALS, BETA, BETS, ERR, ERRMAX\n      INTEGER            I, IA, IB, ICT, ICU, IK, IN, J, JC, JJ, K, KS,\n     $                   LAA, LCC, LDA, LDAS, LDC, LDCS, LJ, MA, N, NA,\n     $                   NARGS, NC, NS\n      LOGICAL            NULL, RESET, SAME, TRAN, UPPER\n      CHARACTER*1        TRANS, TRANSS, UPLO, UPLOS\n      CHARACTER*2        ICHU\n      CHARACTER*3        ICHT\n*     .. Local Arrays ..\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LDE, LDERES\n      EXTERNAL           LDE, LDERES\n*     .. External Subroutines ..\n      EXTERNAL           DMAKE, DMMCH, DSYRK\n*     .. Intrinsic Functions ..\n      INTRINSIC          MAX\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Data statements ..\n      DATA               ICHT/'NTC'/, ICHU/'UL'/\n*     .. Executable Statements ..\n*\n      NARGS = 10\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = ZERO\n*\n      DO 100 IN = 1, NIDIM\n         N = IDIM( IN )\n*        Set LDC to 1 more than minimum value if room.\n         LDC = N\n         IF( LDC.LT.NMAX )\n     $      LDC = LDC + 1\n*        Skip tests if not enough room.\n         IF( LDC.GT.NMAX )\n     $      GO TO 100\n         LCC = LDC*N\n         NULL = N.LE.0\n*\n         DO 90 IK = 1, NIDIM\n            K = IDIM( IK )\n*\n            DO 80 ICT = 1, 3\n               TRANS = ICHT( ICT: ICT )\n               TRAN = TRANS.EQ.'T'.OR.TRANS.EQ.'C'\n               IF( TRAN )THEN\n                  MA = K\n                  NA = N\n               ELSE\n                  MA = N\n                  NA = K\n               END IF\n*              Set LDA to 1 more than minimum value if room.\n               LDA = MA\n               IF( LDA.LT.NMAX )\n     $            LDA = LDA + 1\n*              Skip tests if not enough room.\n               IF( LDA.GT.NMAX )\n     $            GO TO 80\n               LAA = LDA*NA\n*\n*              Generate the matrix A.\n*\n               CALL DMAKE( 'GE', ' ', ' ', MA, NA, A, NMAX, AA, LDA,\n     $                     RESET, ZERO )\n*\n               DO 70 ICU = 1, 2\n                  UPLO = ICHU( ICU: ICU )\n                  UPPER = UPLO.EQ.'U'\n*\n                  DO 60 IA = 1, NALF\n                     ALPHA = ALF( IA )\n*\n                     DO 50 IB = 1, NBET\n                        BETA = BET( IB )\n*\n*                       Generate the matrix C.\n*\n                        CALL DMAKE( 'SY', UPLO, ' ', N, N, C, NMAX, CC,\n     $                              LDC, RESET, ZERO )\n*\n                        NC = NC + 1\n*\n*                       Save every datum before calling the subroutine.\n*\n                        UPLOS = UPLO\n                        TRANSS = TRANS\n                        NS = N\n                        KS = K\n                        ALS = ALPHA\n                        DO 10 I = 1, LAA\n                           AS( I ) = AA( I )\n   10                   CONTINUE\n                        LDAS = LDA\n                        BETS = BETA\n                        DO 20 I = 1, LCC\n                           CS( I ) = CC( I )\n   20                   CONTINUE\n                        LDCS = LDC\n*\n*                       Call the subroutine.\n*\n                        IF( TRACE )\n     $                     WRITE( NTRA, FMT = 9994 )NC, SNAME, UPLO,\n     $                     TRANS, N, K, ALPHA, LDA, BETA, LDC\n                        IF( REWI )\n     $                     REWIND NTRA\n                        CALL DSYRK( UPLO, TRANS, N, K, ALPHA, AA, LDA,\n     $                              BETA, CC, LDC )\n*\n*                       Check if error-exit was taken incorrectly.\n*\n                        IF( .NOT.OK )THEN\n                           WRITE( NOUT, FMT = 9993 )\n                           FATAL = .TRUE.\n                           GO TO 120\n                        END IF\n*\n*                       See what data changed inside subroutines.\n*\n                        ISAME( 1 ) = UPLOS.EQ.UPLO\n                        ISAME( 2 ) = TRANSS.EQ.TRANS\n                        ISAME( 3 ) = NS.EQ.N\n                        ISAME( 4 ) = KS.EQ.K\n                        ISAME( 5 ) = ALS.EQ.ALPHA\n                        ISAME( 6 ) = LDE( AS, AA, LAA )\n                        ISAME( 7 ) = LDAS.EQ.LDA\n                        ISAME( 8 ) = BETS.EQ.BETA\n                        IF( NULL )THEN\n                           ISAME( 9 ) = LDE( CS, CC, LCC )\n                        ELSE\n                           ISAME( 9 ) = LDERES( 'SY', UPLO, N, N, CS,\n     $                                  CC, LDC )\n                        END IF\n                        ISAME( 10 ) = LDCS.EQ.LDC\n*\n*                       If data was incorrectly changed, report and\n*                       return.\n*\n                        SAME = .TRUE.\n                        DO 30 I = 1, NARGS\n                           SAME = SAME.AND.ISAME( I )\n                           IF( .NOT.ISAME( I ) )\n     $                        WRITE( NOUT, FMT = 9998 )I\n   30                   CONTINUE\n                        IF( .NOT.SAME )THEN\n                           FATAL = .TRUE.\n                           GO TO 120\n                        END IF\n*\n                        IF( .NOT.NULL )THEN\n*\n*                          Check the result column by column.\n*\n                           JC = 1\n                           DO 40 J = 1, N\n                              IF( UPPER )THEN\n                                 JJ = 1\n                                 LJ = J\n                              ELSE\n                                 JJ = J\n                                 LJ = N - J + 1\n                              END IF\n                              IF( TRAN )THEN\n                                 CALL DMMCH( 'T', 'N', LJ, 1, K, ALPHA,\n     $                                       A( 1, JJ ), NMAX,\n     $                                       A( 1, J ), NMAX, BETA,\n     $                                       C( JJ, J ), NMAX, CT, G,\n     $                                       CC( JC ), LDC, EPS, ERR,\n     $                                       FATAL, NOUT, .TRUE. )\n                              ELSE\n                                 CALL DMMCH( 'N', 'T', LJ, 1, K, ALPHA,\n     $                                       A( JJ, 1 ), NMAX,\n     $                                       A( J, 1 ), NMAX, BETA,\n     $                                       C( JJ, J ), NMAX, CT, G,\n     $                                       CC( JC ), LDC, EPS, ERR,\n     $                                       FATAL, NOUT, .TRUE. )\n                              END IF\n                              IF( UPPER )THEN\n                                 JC = JC + LDC\n                              ELSE\n                                 JC = JC + LDC + 1\n                              END IF\n                              ERRMAX = MAX( ERRMAX, ERR )\n*                             If got really bad answer, report and\n*                             return.\n                              IF( FATAL )\n     $                           GO TO 110\n   40                      CONTINUE\n                        END IF\n*\n   50                CONTINUE\n*\n   60             CONTINUE\n*\n   70          CONTINUE\n*\n   80       CONTINUE\n*\n   90    CONTINUE\n*\n  100 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 130\n*\n  110 CONTINUE\n      IF( N.GT.1 )\n     $   WRITE( NOUT, FMT = 9995 )J\n*\n  120 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      WRITE( NOUT, FMT = 9994 )NC, SNAME, UPLO, TRANS, N, K, ALPHA,\n     $   LDA, BETA, LDC\n*\n  130 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( '      THESE ARE THE RESULTS FOR COLUMN ', I3 )\n 9994 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ),\n     $      F4.1, ', A,', I3, ',', F4.1, ', C,', I3, ')           .' )\n 9993 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of DCHK4.\n*\n      END\n      SUBROUTINE DCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX,\n     $                  AB, AA, AS, BB, BS, C, CC, CS, CT, G, W )\n*\n*  Tests DSYR2K.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Parameters ..\n      DOUBLE PRECISION   ZERO\n      PARAMETER          ( ZERO = 0.0D0 )\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION   EPS, THRESH\n      INTEGER            NALF, NBET, NIDIM, NMAX, NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      DOUBLE PRECISION   AA( NMAX*NMAX ), AB( 2*NMAX*NMAX ),\n     $                   ALF( NALF ), AS( NMAX*NMAX ), BB( NMAX*NMAX ),\n     $                   BET( NBET ), BS( NMAX*NMAX ), C( NMAX, NMAX ),\n     $                   CC( NMAX*NMAX ), CS( NMAX*NMAX ), CT( NMAX ),\n     $                   G( NMAX ), W( 2*NMAX )\n      INTEGER            IDIM( NIDIM )\n*     .. Local Scalars ..\n      DOUBLE PRECISION   ALPHA, ALS, BETA, BETS, ERR, ERRMAX\n      INTEGER            I, IA, IB, ICT, ICU, IK, IN, J, JC, JJ, JJAB,\n     $                   K, KS, LAA, LBB, LCC, LDA, LDAS, LDB, LDBS,\n     $                   LDC, LDCS, LJ, MA, N, NA, NARGS, NC, NS\n      LOGICAL            NULL, RESET, SAME, TRAN, UPPER\n      CHARACTER*1        TRANS, TRANSS, UPLO, UPLOS\n      CHARACTER*2        ICHU\n      CHARACTER*3        ICHT\n*     .. Local Arrays ..\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LDE, LDERES\n      EXTERNAL           LDE, LDERES\n*     .. External Subroutines ..\n      EXTERNAL           DMAKE, DMMCH, DSYR2K\n*     .. Intrinsic Functions ..\n      INTRINSIC          MAX\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Data statements ..\n      DATA               ICHT/'NTC'/, ICHU/'UL'/\n*     .. Executable Statements ..\n*\n      NARGS = 12\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = ZERO\n*\n      DO 130 IN = 1, NIDIM\n         N = IDIM( IN )\n*        Set LDC to 1 more than minimum value if room.\n         LDC = N\n         IF( LDC.LT.NMAX )\n     $      LDC = LDC + 1\n*        Skip tests if not enough room.\n         IF( LDC.GT.NMAX )\n     $      GO TO 130\n         LCC = LDC*N\n         NULL = N.LE.0\n*\n         DO 120 IK = 1, NIDIM\n            K = IDIM( IK )\n*\n            DO 110 ICT = 1, 3\n               TRANS = ICHT( ICT: ICT )\n               TRAN = TRANS.EQ.'T'.OR.TRANS.EQ.'C'\n               IF( TRAN )THEN\n                  MA = K\n                  NA = N\n               ELSE\n                  MA = N\n                  NA = K\n               END IF\n*              Set LDA to 1 more than minimum value if room.\n               LDA = MA\n               IF( LDA.LT.NMAX )\n     $            LDA = LDA + 1\n*              Skip tests if not enough room.\n               IF( LDA.GT.NMAX )\n     $            GO TO 110\n               LAA = LDA*NA\n*\n*              Generate the matrix A.\n*\n               IF( TRAN )THEN\n                  CALL DMAKE( 'GE', ' ', ' ', MA, NA, AB, 2*NMAX, AA,\n     $                        LDA, RESET, ZERO )\n               ELSE\n                  CALL DMAKE( 'GE', ' ', ' ', MA, NA, AB, NMAX, AA, LDA,\n     $                        RESET, ZERO )\n               END IF\n*\n*              Generate the matrix B.\n*\n               LDB = LDA\n               LBB = LAA\n               IF( TRAN )THEN\n                  CALL DMAKE( 'GE', ' ', ' ', MA, NA, AB( K + 1 ),\n     $                        2*NMAX, BB, LDB, RESET, ZERO )\n               ELSE\n                  CALL DMAKE( 'GE', ' ', ' ', MA, NA, AB( K*NMAX + 1 ),\n     $                        NMAX, BB, LDB, RESET, ZERO )\n               END IF\n*\n               DO 100 ICU = 1, 2\n                  UPLO = ICHU( ICU: ICU )\n                  UPPER = UPLO.EQ.'U'\n*\n                  DO 90 IA = 1, NALF\n                     ALPHA = ALF( IA )\n*\n                     DO 80 IB = 1, NBET\n                        BETA = BET( IB )\n*\n*                       Generate the matrix C.\n*\n                        CALL DMAKE( 'SY', UPLO, ' ', N, N, C, NMAX, CC,\n     $                              LDC, RESET, ZERO )\n*\n                        NC = NC + 1\n*\n*                       Save every datum before calling the subroutine.\n*\n                        UPLOS = UPLO\n                        TRANSS = TRANS\n                        NS = N\n                        KS = K\n                        ALS = ALPHA\n                        DO 10 I = 1, LAA\n                           AS( I ) = AA( I )\n   10                   CONTINUE\n                        LDAS = LDA\n                        DO 20 I = 1, LBB\n                           BS( I ) = BB( I )\n   20                   CONTINUE\n                        LDBS = LDB\n                        BETS = BETA\n                        DO 30 I = 1, LCC\n                           CS( I ) = CC( I )\n   30                   CONTINUE\n                        LDCS = LDC\n*\n*                       Call the subroutine.\n*\n                        IF( TRACE )\n     $                     WRITE( NTRA, FMT = 9994 )NC, SNAME, UPLO,\n     $                     TRANS, N, K, ALPHA, LDA, LDB, BETA, LDC\n                        IF( REWI )\n     $                     REWIND NTRA\n                        CALL DSYR2K( UPLO, TRANS, N, K, ALPHA, AA, LDA,\n     $                               BB, LDB, BETA, CC, LDC )\n*\n*                       Check if error-exit was taken incorrectly.\n*\n                        IF( .NOT.OK )THEN\n                           WRITE( NOUT, FMT = 9993 )\n                           FATAL = .TRUE.\n                           GO TO 150\n                        END IF\n*\n*                       See what data changed inside subroutines.\n*\n                        ISAME( 1 ) = UPLOS.EQ.UPLO\n                        ISAME( 2 ) = TRANSS.EQ.TRANS\n                        ISAME( 3 ) = NS.EQ.N\n                        ISAME( 4 ) = KS.EQ.K\n                        ISAME( 5 ) = ALS.EQ.ALPHA\n                        ISAME( 6 ) = LDE( AS, AA, LAA )\n                        ISAME( 7 ) = LDAS.EQ.LDA\n                        ISAME( 8 ) = LDE( BS, BB, LBB )\n                        ISAME( 9 ) = LDBS.EQ.LDB\n                        ISAME( 10 ) = BETS.EQ.BETA\n                        IF( NULL )THEN\n                           ISAME( 11 ) = LDE( CS, CC, LCC )\n                        ELSE\n                           ISAME( 11 ) = LDERES( 'SY', UPLO, N, N, CS,\n     $                                   CC, LDC )\n                        END IF\n                        ISAME( 12 ) = LDCS.EQ.LDC\n*\n*                       If data was incorrectly changed, report and\n*                       return.\n*\n                        SAME = .TRUE.\n                        DO 40 I = 1, NARGS\n                           SAME = SAME.AND.ISAME( I )\n                           IF( .NOT.ISAME( I ) )\n     $                        WRITE( NOUT, FMT = 9998 )I\n   40                   CONTINUE\n                        IF( .NOT.SAME )THEN\n                           FATAL = .TRUE.\n                           GO TO 150\n                        END IF\n*\n                        IF( .NOT.NULL )THEN\n*\n*                          Check the result column by column.\n*\n                           JJAB = 1\n                           JC = 1\n                           DO 70 J = 1, N\n                              IF( UPPER )THEN\n                                 JJ = 1\n                                 LJ = J\n                              ELSE\n                                 JJ = J\n                                 LJ = N - J + 1\n                              END IF\n                              IF( TRAN )THEN\n                                 DO 50 I = 1, K\n                                    W( I ) = AB( ( J - 1 )*2*NMAX + K +\n     $                                       I )\n                                    W( K + I ) = AB( ( J - 1 )*2*NMAX +\n     $                                           I )\n   50                            CONTINUE\n                                 CALL DMMCH( 'T', 'N', LJ, 1, 2*K,\n     $                                       ALPHA, AB( JJAB ), 2*NMAX,\n     $                                       W, 2*NMAX, BETA,\n     $                                       C( JJ, J ), NMAX, CT, G,\n     $                                       CC( JC ), LDC, EPS, ERR,\n     $                                       FATAL, NOUT, .TRUE. )\n                              ELSE\n                                 DO 60 I = 1, K\n                                    W( I ) = AB( ( K + I - 1 )*NMAX +\n     $                                       J )\n                                    W( K + I ) = AB( ( I - 1 )*NMAX +\n     $                                           J )\n   60                            CONTINUE\n                                 CALL DMMCH( 'N', 'N', LJ, 1, 2*K,\n     $                                       ALPHA, AB( JJ ), NMAX, W,\n     $                                       2*NMAX, BETA, C( JJ, J ),\n     $                                       NMAX, CT, G, CC( JC ), LDC,\n     $                                       EPS, ERR, FATAL, NOUT,\n     $                                       .TRUE. )\n                              END IF\n                              IF( UPPER )THEN\n                                 JC = JC + LDC\n                              ELSE\n                                 JC = JC + LDC + 1\n                                 IF( TRAN )\n     $                              JJAB = JJAB + 2*NMAX\n                              END IF\n                              ERRMAX = MAX( ERRMAX, ERR )\n*                             If got really bad answer, report and\n*                             return.\n                              IF( FATAL )\n     $                           GO TO 140\n   70                      CONTINUE\n                        END IF\n*\n   80                CONTINUE\n*\n   90             CONTINUE\n*\n  100          CONTINUE\n*\n  110       CONTINUE\n*\n  120    CONTINUE\n*\n  130 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 160\n*\n  140 CONTINUE\n      IF( N.GT.1 )\n     $   WRITE( NOUT, FMT = 9995 )J\n*\n  150 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      WRITE( NOUT, FMT = 9994 )NC, SNAME, UPLO, TRANS, N, K, ALPHA,\n     $   LDA, LDB, BETA, LDC\n*\n  160 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( '      THESE ARE THE RESULTS FOR COLUMN ', I3 )\n 9994 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ),\n     $      F4.1, ', A,', I3, ', B,', I3, ',', F4.1, ', C,', I3, ')   ',\n     $      ' .' )\n 9993 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of DCHK5.\n*\n      END\n      SUBROUTINE DCHKE( ISNUM, SRNAMT, NOUT )\n*\n*  Tests the error exits from the Level 3 Blas.\n*  Requires a special version of the error-handling routine XERBLA.\n*  ALPHA, BETA, A, B and C should not need to be defined.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Scalar Arguments ..\n      INTEGER            ISNUM, NOUT\n      CHARACTER*6        SRNAMT\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Local Scalars ..\n      DOUBLE PRECISION   ALPHA, BETA\n*     .. Local Arrays ..\n      DOUBLE PRECISION   A( 2, 1 ), B( 2, 1 ), C( 2, 1 )\n*     .. External Subroutines ..\n      EXTERNAL           CHKXER, DGEMM, DSYMM, DSYR2K, DSYRK, DTRMM,\n     $                   DTRSM\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Executable Statements ..\n*     OK is set to .FALSE. by the special version of XERBLA or by CHKXER\n*     if anything is wrong.\n      OK = .TRUE.\n*     LERR is set to .TRUE. by the special version of XERBLA each time\n*     it is called, and is then tested and re-set by CHKXER.\n      LERR = .FALSE.\n      GO TO ( 10, 20, 30, 40, 50, 60 )ISNUM\n   10 INFOT = 1\n      CALL DGEMM( '/', 'N', 0, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 1\n      CALL DGEMM( '/', 'T', 0, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL DGEMM( 'N', '/', 0, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL DGEMM( 'T', '/', 0, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL DGEMM( 'N', 'N', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL DGEMM( 'N', 'T', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL DGEMM( 'T', 'N', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL DGEMM( 'T', 'T', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL DGEMM( 'N', 'N', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL DGEMM( 'N', 'T', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL DGEMM( 'T', 'N', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL DGEMM( 'T', 'T', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL DGEMM( 'N', 'N', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL DGEMM( 'N', 'T', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL DGEMM( 'T', 'N', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL DGEMM( 'T', 'T', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL DGEMM( 'N', 'N', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL DGEMM( 'N', 'T', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL DGEMM( 'T', 'N', 0, 0, 2, ALPHA, A, 1, B, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL DGEMM( 'T', 'T', 0, 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL DGEMM( 'N', 'N', 0, 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL DGEMM( 'T', 'N', 0, 0, 2, ALPHA, A, 2, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL DGEMM( 'N', 'T', 0, 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL DGEMM( 'T', 'T', 0, 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 13\n      CALL DGEMM( 'N', 'N', 2, 0, 0, ALPHA, A, 2, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 13\n      CALL DGEMM( 'N', 'T', 2, 0, 0, ALPHA, A, 2, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 13\n      CALL DGEMM( 'T', 'N', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 13\n      CALL DGEMM( 'T', 'T', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 70\n   20 INFOT = 1\n      CALL DSYMM( '/', 'U', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL DSYMM( 'L', '/', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL DSYMM( 'L', 'U', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL DSYMM( 'R', 'U', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL DSYMM( 'L', 'L', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL DSYMM( 'R', 'L', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL DSYMM( 'L', 'U', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL DSYMM( 'R', 'U', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL DSYMM( 'L', 'L', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL DSYMM( 'R', 'L', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL DSYMM( 'L', 'U', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL DSYMM( 'R', 'U', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL DSYMM( 'L', 'L', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL DSYMM( 'R', 'L', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL DSYMM( 'L', 'U', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL DSYMM( 'R', 'U', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL DSYMM( 'L', 'L', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL DSYMM( 'R', 'L', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL DSYMM( 'L', 'U', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL DSYMM( 'R', 'U', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL DSYMM( 'L', 'L', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL DSYMM( 'R', 'L', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 70\n   30 INFOT = 1\n      CALL DTRMM( '/', 'U', 'N', 'N', 0, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL DTRMM( 'L', '/', 'N', 'N', 0, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL DTRMM( 'L', 'U', '/', 'N', 0, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL DTRMM( 'L', 'U', 'N', '/', 0, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL DTRMM( 'L', 'U', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL DTRMM( 'L', 'U', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL DTRMM( 'R', 'U', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL DTRMM( 'R', 'U', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL DTRMM( 'L', 'L', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL DTRMM( 'L', 'L', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL DTRMM( 'R', 'L', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL DTRMM( 'R', 'L', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL DTRMM( 'L', 'U', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL DTRMM( 'L', 'U', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL DTRMM( 'R', 'U', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL DTRMM( 'R', 'U', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL DTRMM( 'L', 'L', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL DTRMM( 'L', 'L', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL DTRMM( 'R', 'L', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL DTRMM( 'R', 'L', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL DTRMM( 'L', 'U', 'N', 'N', 2, 0, ALPHA, A, 1, B, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL DTRMM( 'L', 'U', 'T', 'N', 2, 0, ALPHA, A, 1, B, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL DTRMM( 'R', 'U', 'N', 'N', 0, 2, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL DTRMM( 'R', 'U', 'T', 'N', 0, 2, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL DTRMM( 'L', 'L', 'N', 'N', 2, 0, ALPHA, A, 1, B, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL DTRMM( 'L', 'L', 'T', 'N', 2, 0, ALPHA, A, 1, B, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL DTRMM( 'R', 'L', 'N', 'N', 0, 2, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL DTRMM( 'R', 'L', 'T', 'N', 0, 2, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL DTRMM( 'L', 'U', 'N', 'N', 2, 0, ALPHA, A, 2, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL DTRMM( 'L', 'U', 'T', 'N', 2, 0, ALPHA, A, 2, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL DTRMM( 'R', 'U', 'N', 'N', 2, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL DTRMM( 'R', 'U', 'T', 'N', 2, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL DTRMM( 'L', 'L', 'N', 'N', 2, 0, ALPHA, A, 2, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL DTRMM( 'L', 'L', 'T', 'N', 2, 0, ALPHA, A, 2, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL DTRMM( 'R', 'L', 'N', 'N', 2, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL DTRMM( 'R', 'L', 'T', 'N', 2, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 70\n   40 INFOT = 1\n      CALL DTRSM( '/', 'U', 'N', 'N', 0, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL DTRSM( 'L', '/', 'N', 'N', 0, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL DTRSM( 'L', 'U', '/', 'N', 0, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL DTRSM( 'L', 'U', 'N', '/', 0, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL DTRSM( 'L', 'U', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL DTRSM( 'L', 'U', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL DTRSM( 'R', 'U', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL DTRSM( 'R', 'U', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL DTRSM( 'L', 'L', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL DTRSM( 'L', 'L', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL DTRSM( 'R', 'L', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL DTRSM( 'R', 'L', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL DTRSM( 'L', 'U', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL DTRSM( 'L', 'U', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL DTRSM( 'R', 'U', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL DTRSM( 'R', 'U', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL DTRSM( 'L', 'L', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL DTRSM( 'L', 'L', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL DTRSM( 'R', 'L', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL DTRSM( 'R', 'L', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL DTRSM( 'L', 'U', 'N', 'N', 2, 0, ALPHA, A, 1, B, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL DTRSM( 'L', 'U', 'T', 'N', 2, 0, ALPHA, A, 1, B, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL DTRSM( 'R', 'U', 'N', 'N', 0, 2, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL DTRSM( 'R', 'U', 'T', 'N', 0, 2, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL DTRSM( 'L', 'L', 'N', 'N', 2, 0, ALPHA, A, 1, B, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL DTRSM( 'L', 'L', 'T', 'N', 2, 0, ALPHA, A, 1, B, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL DTRSM( 'R', 'L', 'N', 'N', 0, 2, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL DTRSM( 'R', 'L', 'T', 'N', 0, 2, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL DTRSM( 'L', 'U', 'N', 'N', 2, 0, ALPHA, A, 2, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL DTRSM( 'L', 'U', 'T', 'N', 2, 0, ALPHA, A, 2, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL DTRSM( 'R', 'U', 'N', 'N', 2, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL DTRSM( 'R', 'U', 'T', 'N', 2, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL DTRSM( 'L', 'L', 'N', 'N', 2, 0, ALPHA, A, 2, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL DTRSM( 'L', 'L', 'T', 'N', 2, 0, ALPHA, A, 2, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL DTRSM( 'R', 'L', 'N', 'N', 2, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL DTRSM( 'R', 'L', 'T', 'N', 2, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 70\n   50 INFOT = 1\n      CALL DSYRK( '/', 'N', 0, 0, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL DSYRK( 'U', '/', 0, 0, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL DSYRK( 'U', 'N', -1, 0, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL DSYRK( 'U', 'T', -1, 0, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL DSYRK( 'L', 'N', -1, 0, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL DSYRK( 'L', 'T', -1, 0, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL DSYRK( 'U', 'N', 0, -1, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL DSYRK( 'U', 'T', 0, -1, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL DSYRK( 'L', 'N', 0, -1, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL DSYRK( 'L', 'T', 0, -1, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL DSYRK( 'U', 'N', 2, 0, ALPHA, A, 1, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL DSYRK( 'U', 'T', 0, 2, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL DSYRK( 'L', 'N', 2, 0, ALPHA, A, 1, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL DSYRK( 'L', 'T', 0, 2, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL DSYRK( 'U', 'N', 2, 0, ALPHA, A, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL DSYRK( 'U', 'T', 2, 0, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL DSYRK( 'L', 'N', 2, 0, ALPHA, A, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL DSYRK( 'L', 'T', 2, 0, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 70\n   60 INFOT = 1\n      CALL DSYR2K( '/', 'N', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL DSYR2K( 'U', '/', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL DSYR2K( 'U', 'N', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL DSYR2K( 'U', 'T', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL DSYR2K( 'L', 'N', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL DSYR2K( 'L', 'T', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL DSYR2K( 'U', 'N', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL DSYR2K( 'U', 'T', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL DSYR2K( 'L', 'N', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL DSYR2K( 'L', 'T', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL DSYR2K( 'U', 'N', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL DSYR2K( 'U', 'T', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL DSYR2K( 'L', 'N', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL DSYR2K( 'L', 'T', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL DSYR2K( 'U', 'N', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL DSYR2K( 'U', 'T', 0, 2, ALPHA, A, 2, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL DSYR2K( 'L', 'N', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL DSYR2K( 'L', 'T', 0, 2, ALPHA, A, 2, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL DSYR2K( 'U', 'N', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL DSYR2K( 'U', 'T', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL DSYR2K( 'L', 'N', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL DSYR2K( 'L', 'T', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n*\n   70 IF( OK )THEN\n         WRITE( NOUT, FMT = 9999 )SRNAMT\n      ELSE\n         WRITE( NOUT, FMT = 9998 )SRNAMT\n      END IF\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE TESTS OF ERROR-EXITS' )\n 9998 FORMAT( ' ******* ', A6, ' FAILED THE TESTS OF ERROR-EXITS *****',\n     $      '**' )\n*\n*     End of DCHKE.\n*\n      END\n      SUBROUTINE DMAKE( TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, RESET,\n     $                  TRANSL )\n*\n*  Generates values for an M by N matrix A.\n*  Stores the values in the array AA in the data structure required\n*  by the routine, with unwanted elements set to rogue value.\n*\n*  TYPE is 'GE', 'SY' or 'TR'.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Parameters ..\n      DOUBLE PRECISION   ZERO, ONE\n      PARAMETER          ( ZERO = 0.0D0, ONE = 1.0D0 )\n      DOUBLE PRECISION   ROGUE\n      PARAMETER          ( ROGUE = -1.0D10 )\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION   TRANSL\n      INTEGER            LDA, M, N, NMAX\n      LOGICAL            RESET\n      CHARACTER*1        DIAG, UPLO\n      CHARACTER*2        TYPE\n*     .. Array Arguments ..\n      DOUBLE PRECISION   A( NMAX, * ), AA( * )\n*     .. Local Scalars ..\n      INTEGER            I, IBEG, IEND, J\n      LOGICAL            GEN, LOWER, SYM, TRI, UNIT, UPPER\n*     .. External Functions ..\n      DOUBLE PRECISION   DBEG\n      EXTERNAL           DBEG\n*     .. Executable Statements ..\n      GEN = TYPE.EQ.'GE'\n      SYM = TYPE.EQ.'SY'\n      TRI = TYPE.EQ.'TR'\n      UPPER = ( SYM.OR.TRI ).AND.UPLO.EQ.'U'\n      LOWER = ( SYM.OR.TRI ).AND.UPLO.EQ.'L'\n      UNIT = TRI.AND.DIAG.EQ.'U'\n*\n*     Generate data in array A.\n*\n      DO 20 J = 1, N\n         DO 10 I = 1, M\n            IF( GEN.OR.( UPPER.AND.I.LE.J ).OR.( LOWER.AND.I.GE.J ) )\n     $          THEN\n               A( I, J ) = DBEG( RESET ) + TRANSL\n               IF( I.NE.J )THEN\n*                 Set some elements to zero\n                  IF( N.GT.3.AND.J.EQ.N/2 )\n     $               A( I, J ) = ZERO\n                  IF( SYM )THEN\n                     A( J, I ) = A( I, J )\n                  ELSE IF( TRI )THEN\n                     A( J, I ) = ZERO\n                  END IF\n               END IF\n            END IF\n   10    CONTINUE\n         IF( TRI )\n     $      A( J, J ) = A( J, J ) + ONE\n         IF( UNIT )\n     $      A( J, J ) = ONE\n   20 CONTINUE\n*\n*     Store elements in array AS in data structure required by routine.\n*\n      IF( TYPE.EQ.'GE' )THEN\n         DO 50 J = 1, N\n            DO 30 I = 1, M\n               AA( I + ( J - 1 )*LDA ) = A( I, J )\n   30       CONTINUE\n            DO 40 I = M + 1, LDA\n               AA( I + ( J - 1 )*LDA ) = ROGUE\n   40       CONTINUE\n   50    CONTINUE\n      ELSE IF( TYPE.EQ.'SY'.OR.TYPE.EQ.'TR' )THEN\n         DO 90 J = 1, N\n            IF( UPPER )THEN\n               IBEG = 1\n               IF( UNIT )THEN\n                  IEND = J - 1\n               ELSE\n                  IEND = J\n               END IF\n            ELSE\n               IF( UNIT )THEN\n                  IBEG = J + 1\n               ELSE\n                  IBEG = J\n               END IF\n               IEND = N\n            END IF\n            DO 60 I = 1, IBEG - 1\n               AA( I + ( J - 1 )*LDA ) = ROGUE\n   60       CONTINUE\n            DO 70 I = IBEG, IEND\n               AA( I + ( J - 1 )*LDA ) = A( I, J )\n   70       CONTINUE\n            DO 80 I = IEND + 1, LDA\n               AA( I + ( J - 1 )*LDA ) = ROGUE\n   80       CONTINUE\n   90    CONTINUE\n      END IF\n      RETURN\n*\n*     End of DMAKE.\n*\n      END\n      SUBROUTINE DMMCH( TRANSA, TRANSB, M, N, KK, ALPHA, A, LDA, B, LDB,\n     $                  BETA, C, LDC, CT, G, CC, LDCC, EPS, ERR, FATAL,\n     $                  NOUT, MV )\n*\n*  Checks the results of the computational tests.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Parameters ..\n      DOUBLE PRECISION   ZERO, ONE\n      PARAMETER          ( ZERO = 0.0D0, ONE = 1.0D0 )\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION   ALPHA, BETA, EPS, ERR\n      INTEGER            KK, LDA, LDB, LDC, LDCC, M, N, NOUT\n      LOGICAL            FATAL, MV\n      CHARACTER*1        TRANSA, TRANSB\n*     .. Array Arguments ..\n      DOUBLE PRECISION   A( LDA, * ), B( LDB, * ), C( LDC, * ),\n     $                   CC( LDCC, * ), CT( * ), G( * )\n*     .. Local Scalars ..\n      DOUBLE PRECISION   ERRI\n      INTEGER            I, J, K\n      LOGICAL            TRANA, TRANB\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, MAX, SQRT\n*     .. Executable Statements ..\n      TRANA = TRANSA.EQ.'T'.OR.TRANSA.EQ.'C'\n      TRANB = TRANSB.EQ.'T'.OR.TRANSB.EQ.'C'\n*\n*     Compute expected result, one column at a time, in CT using data\n*     in A, B and C.\n*     Compute gauges in G.\n*\n      DO 120 J = 1, N\n*\n         DO 10 I = 1, M\n            CT( I ) = ZERO\n            G( I ) = ZERO\n   10    CONTINUE\n         IF( .NOT.TRANA.AND..NOT.TRANB )THEN\n            DO 30 K = 1, KK\n               DO 20 I = 1, M\n                  CT( I ) = CT( I ) + A( I, K )*B( K, J )\n                  G( I ) = G( I ) + ABS( A( I, K ) )*ABS( B( K, J ) )\n   20          CONTINUE\n   30       CONTINUE\n         ELSE IF( TRANA.AND..NOT.TRANB )THEN\n            DO 50 K = 1, KK\n               DO 40 I = 1, M\n                  CT( I ) = CT( I ) + A( K, I )*B( K, J )\n                  G( I ) = G( I ) + ABS( A( K, I ) )*ABS( B( K, J ) )\n   40          CONTINUE\n   50       CONTINUE\n         ELSE IF( .NOT.TRANA.AND.TRANB )THEN\n            DO 70 K = 1, KK\n               DO 60 I = 1, M\n                  CT( I ) = CT( I ) + A( I, K )*B( J, K )\n                  G( I ) = G( I ) + ABS( A( I, K ) )*ABS( B( J, K ) )\n   60          CONTINUE\n   70       CONTINUE\n         ELSE IF( TRANA.AND.TRANB )THEN\n            DO 90 K = 1, KK\n               DO 80 I = 1, M\n                  CT( I ) = CT( I ) + A( K, I )*B( J, K )\n                  G( I ) = G( I ) + ABS( A( K, I ) )*ABS( B( J, K ) )\n   80          CONTINUE\n   90       CONTINUE\n         END IF\n         DO 100 I = 1, M\n            CT( I ) = ALPHA*CT( I ) + BETA*C( I, J )\n            G( I ) = ABS( ALPHA )*G( I ) + ABS( BETA )*ABS( C( I, J ) )\n  100    CONTINUE\n*\n*        Compute the error ratio for this result.\n*\n         ERR = ZERO\n         DO 110 I = 1, M\n            ERRI = ABS( CT( I ) - CC( I, J ) )/EPS\n            IF( G( I ).NE.ZERO )\n     $         ERRI = ERRI/G( I )\n            ERR = MAX( ERR, ERRI )\n            IF( ERR*SQRT( EPS ).GE.ONE )\n     $         GO TO 130\n  110    CONTINUE\n*\n  120 CONTINUE\n*\n*     If the loop completes, all results are at least half accurate.\n      GO TO 150\n*\n*     Report fatal error.\n*\n  130 FATAL = .TRUE.\n      WRITE( NOUT, FMT = 9999 )\n      DO 140 I = 1, M\n         IF( MV )THEN\n            WRITE( NOUT, FMT = 9998 )I, CT( I ), CC( I, J )\n         ELSE\n            WRITE( NOUT, FMT = 9998 )I, CC( I, J ), CT( I )\n         END IF\n  140 CONTINUE\n      IF( N.GT.1 )\n     $   WRITE( NOUT, FMT = 9997 )J\n*\n  150 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ******* FATAL ERROR - COMPUTED RESULT IS LESS THAN HAL',\n     $      'F ACCURATE *******', /'           EXPECTED RESULT   COMPU',\n     $      'TED RESULT' )\n 9998 FORMAT( 1X, I7, 2G18.6 )\n 9997 FORMAT( '      THESE ARE THE RESULTS FOR COLUMN ', I3 )\n*\n*     End of DMMCH.\n*\n      END\n      LOGICAL FUNCTION LDE( RI, RJ, LR )\n*\n*  Tests if two arrays are identical.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Scalar Arguments ..\n      INTEGER            LR\n*     .. Array Arguments ..\n      DOUBLE PRECISION   RI( * ), RJ( * )\n*     .. Local Scalars ..\n      INTEGER            I\n*     .. Executable Statements ..\n      DO 10 I = 1, LR\n         IF( RI( I ).NE.RJ( I ) )\n     $      GO TO 20\n   10 CONTINUE\n      LDE = .TRUE.\n      GO TO 30\n   20 CONTINUE\n      LDE = .FALSE.\n   30 RETURN\n*\n*     End of LDE.\n*\n      END\n      LOGICAL FUNCTION LDERES( TYPE, UPLO, M, N, AA, AS, LDA )\n*\n*  Tests if selected elements in two arrays are equal.\n*\n*  TYPE is 'GE' or 'SY'.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Scalar Arguments ..\n      INTEGER            LDA, M, N\n      CHARACTER*1        UPLO\n      CHARACTER*2        TYPE\n*     .. Array Arguments ..\n      DOUBLE PRECISION   AA( LDA, * ), AS( LDA, * )\n*     .. Local Scalars ..\n      INTEGER            I, IBEG, IEND, J\n      LOGICAL            UPPER\n*     .. Executable Statements ..\n      UPPER = UPLO.EQ.'U'\n      IF( TYPE.EQ.'GE' )THEN\n         DO 20 J = 1, N\n            DO 10 I = M + 1, LDA\n               IF( AA( I, J ).NE.AS( I, J ) )\n     $            GO TO 70\n   10       CONTINUE\n   20    CONTINUE\n      ELSE IF( TYPE.EQ.'SY' )THEN\n         DO 50 J = 1, N\n            IF( UPPER )THEN\n               IBEG = 1\n               IEND = J\n            ELSE\n               IBEG = J\n               IEND = N\n            END IF\n            DO 30 I = 1, IBEG - 1\n               IF( AA( I, J ).NE.AS( I, J ) )\n     $            GO TO 70\n   30       CONTINUE\n            DO 40 I = IEND + 1, LDA\n               IF( AA( I, J ).NE.AS( I, J ) )\n     $            GO TO 70\n   40       CONTINUE\n   50    CONTINUE\n      END IF\n*\n   60 CONTINUE\n      LDERES = .TRUE.\n      GO TO 80\n   70 CONTINUE\n      LDERES = .FALSE.\n   80 RETURN\n*\n*     End of LDERES.\n*\n      END\n      DOUBLE PRECISION FUNCTION DBEG( RESET )\n*\n*  Generates random numbers uniformly distributed between -0.5 and 0.5.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Scalar Arguments ..\n      LOGICAL            RESET\n*     .. Local Scalars ..\n      INTEGER            I, IC, MI\n*     .. Save statement ..\n      SAVE               I, IC, MI\n*     .. Executable Statements ..\n      IF( RESET )THEN\n*        Initialize local variables.\n         MI = 891\n         I = 7\n         IC = 0\n         RESET = .FALSE.\n      END IF\n*\n*     The sequence of values of I is bounded between 1 and 999.\n*     If initial I = 1,2,3,6,7 or 9, the period will be 50.\n*     If initial I = 4 or 8, the period will be 25.\n*     If initial I = 5, the period will be 10.\n*     IC is used to break up the period by skipping 1 value of I in 6.\n*\n      IC = IC + 1\n   10 I = I*MI\n      I = I - 1000*( I/1000 )\n      IF( IC.GE.5 )THEN\n         IC = 0\n         GO TO 10\n      END IF\n      DBEG = ( I - 500 )/1001.0D0\n      RETURN\n*\n*     End of DBEG.\n*\n      END\n      DOUBLE PRECISION FUNCTION DDIFF( X, Y )\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION   X, Y\n*     .. Executable Statements ..\n      DDIFF = X - Y\n      RETURN\n*\n*     End of DDIFF.\n*\n      END\n      SUBROUTINE CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n*\n*  Tests whether XERBLA has detected an error when it should.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Scalar Arguments ..\n      INTEGER            INFOT, NOUT\n      LOGICAL            LERR, OK\n      CHARACTER*6        SRNAMT\n*     .. Executable Statements ..\n      IF( .NOT.LERR )THEN\n         WRITE( NOUT, FMT = 9999 )INFOT, SRNAMT\n         OK = .FALSE.\n      END IF\n      LERR = .FALSE.\n      RETURN\n*\n 9999 FORMAT( ' ***** ILLEGAL VALUE OF PARAMETER NUMBER ', I2, ' NOT D',\n     $      'ETECTED BY ', A6, ' *****' )\n*\n*     End of CHKXER.\n*\n      END\n      SUBROUTINE XERBLA( SRNAME, INFO )\n*\n*  This is a special version of XERBLA to be used only as part of\n*  the test program for testing error exits from the Level 3 BLAS\n*  routines.\n*\n*  XERBLA  is an error handler for the Level 3 BLAS routines.\n*\n*  It is called by the Level 3 BLAS routines if an input parameter is\n*  invalid.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Scalar Arguments ..\n      INTEGER            INFO\n      CHARACTER*6        SRNAME\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUT\n      LOGICAL            LERR, OK\n      CHARACTER*6        SRNAMT\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUT, OK, LERR\n      COMMON             /SRNAMC/SRNAMT\n*     .. Executable Statements ..\n      LERR = .TRUE.\n      IF( INFO.NE.INFOT )THEN\n         IF( INFOT.NE.0 )THEN\n            WRITE( NOUT, FMT = 9999 )INFO, INFOT\n         ELSE\n            WRITE( NOUT, FMT = 9997 )INFO\n         END IF\n         OK = .FALSE.\n      END IF\n      IF( SRNAME.NE.SRNAMT )THEN\n         WRITE( NOUT, FMT = 9998 )SRNAME, SRNAMT\n         OK = .FALSE.\n      END IF\n      RETURN\n*\n 9999 FORMAT( ' ******* XERBLA WAS CALLED WITH INFO = ', I6, ' INSTEAD',\n     $      ' OF ', I2, ' *******' )\n 9998 FORMAT( ' ******* XERBLA WAS CALLED WITH SRNAME = ', A6, ' INSTE',\n     $      'AD OF ', A6, ' *******' )\n 9997 FORMAT( ' ******* XERBLA WAS CALLED WITH INFO = ', I6,\n     $      ' *******' )\n*\n*     End of XERBLA\n*\n      END\n\n"
  },
  {
    "path": "libs/eigen/blas/testing/runblastest.sh",
    "content": "#!/bin/bash\n\nblack='\\E[30m'\nred='\\E[31m'\ngreen='\\E[32m'\nyellow='\\E[33m'\nblue='\\E[34m'\nmagenta='\\E[35m'\ncyan='\\E[36m'\nwhite='\\E[37m'\n\nif [ -f $2 ]; then\n  data=$2\n  if [ -f $1.summ ]; then rm $1.summ; fi\n  if [ -f $1.snap ]; then rm $1.snap; fi\nelse\n  data=$1\nfi\n\nif ! ./$1 < $data > /dev/null 2> .runtest.log ; then\n  echo -e  $red Test $1 failed: $black\n  echo -e $blue\n  cat .runtest.log\n  echo -e $black\n  exit 1\nelse\n  if [ -f $1.summ ]; then\n    if [ `grep \"FATAL ERROR\" $1.summ | wc -l` -gt 0 ]; then\n      echo -e  $red \"Test $1 failed (FATAL ERROR, read the file $1.summ for details)\" $black\n      echo -e $blue\n      cat .runtest.log\n      echo -e $black\n      exit 1;\n    fi\n\n    if [ `grep \"FAILED THE TESTS OF ERROR-EXITS\" $1.summ | wc -l` -gt 0 ]; then\n      echo -e  $red \"Test $1 failed (FAILED THE TESTS OF ERROR-EXITS, read the file $1.summ for details)\" $black\n      echo -e $blue\n      cat .runtest.log\n      echo -e $black\n      exit 1;\n    fi      \n  fi\n  echo -e $green Test $1 passed$black\nfi\n"
  },
  {
    "path": "libs/eigen/blas/testing/sblat1.f",
    "content": "*> \\brief \\b SBLAT1\n*\n*  =========== DOCUMENTATION ===========\n*\n* Online html documentation available at \n*            http://www.netlib.org/lapack/explore-html/ \n*\n*  Definition:\n*  ===========\n*\n*       PROGRAM SBLAT1\n* \n*\n*> \\par Purpose:\n*  =============\n*>\n*> \\verbatim\n*>\n*>    Test program for the REAL Level 1 BLAS.\n*>\n*>    Based upon the original BLAS test routine together with:\n*>    F06EAF Example Program Text\n*> \\endverbatim\n*\n*  Authors:\n*  ========\n*\n*> \\author Univ. of Tennessee \n*> \\author Univ. of California Berkeley \n*> \\author Univ. of Colorado Denver \n*> \\author NAG Ltd. \n*\n*> \\date April 2012\n*\n*> \\ingroup single_blas_testing\n*\n*  =====================================================================\n      PROGRAM SBLAT1\n*\n*  -- Reference BLAS test routine (version 3.4.1) --\n*  -- Reference BLAS is a software package provided by Univ. of Tennessee,    --\n*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--\n*     April 2012\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      INTEGER          NOUT\n      PARAMETER        (NOUT=6)\n*     .. Scalars in Common ..\n      INTEGER          ICASE, INCX, INCY, N\n      LOGICAL          PASS\n*     .. Local Scalars ..\n      REAL             SFAC\n      INTEGER          IC\n*     .. External Subroutines ..\n      EXTERNAL         CHECK0, CHECK1, CHECK2, CHECK3, HEADER\n*     .. Common blocks ..\n      COMMON           /COMBLA/ICASE, N, INCX, INCY, PASS\n*     .. Data statements ..\n      DATA             SFAC/9.765625E-4/\n*     .. Executable Statements ..\n      WRITE (NOUT,99999)\n      DO 20 IC = 1, 13\n         ICASE = IC\n         CALL HEADER\n*\n*        .. Initialize  PASS,  INCX,  and INCY for a new case. ..\n*        .. the value 9999 for INCX or INCY will appear in the ..\n*        .. detailed  output, if any, for cases  that do not involve ..\n*        .. these parameters ..\n*\n         PASS = .TRUE.\n         INCX = 9999\n         INCY = 9999\n         IF (ICASE.EQ.3 .OR. ICASE.EQ.11) THEN\n            CALL CHECK0(SFAC)\n         ELSE IF (ICASE.EQ.7 .OR. ICASE.EQ.8 .OR. ICASE.EQ.9 .OR.\n     +            ICASE.EQ.10) THEN\n            CALL CHECK1(SFAC)\n         ELSE IF (ICASE.EQ.1 .OR. ICASE.EQ.2 .OR. ICASE.EQ.5 .OR.\n     +            ICASE.EQ.6 .OR. ICASE.EQ.12 .OR. ICASE.EQ.13) THEN\n            CALL CHECK2(SFAC)\n         ELSE IF (ICASE.EQ.4) THEN\n            CALL CHECK3(SFAC)\n         END IF\n*        -- Print\n         IF (PASS) WRITE (NOUT,99998)\n   20 CONTINUE\n      STOP\n*\n99999 FORMAT (' Real BLAS Test Program Results',/1X)\n99998 FORMAT ('                                    ----- PASS -----')\n      END\n      SUBROUTINE HEADER\n*     .. Parameters ..\n      INTEGER          NOUT\n      PARAMETER        (NOUT=6)\n*     .. Scalars in Common ..\n      INTEGER          ICASE, INCX, INCY, N\n      LOGICAL          PASS\n*     .. Local Arrays ..\n      CHARACTER*6      L(13)\n*     .. Common blocks ..\n      COMMON           /COMBLA/ICASE, N, INCX, INCY, PASS\n*     .. Data statements ..\n      DATA             L(1)/' SDOT '/\n      DATA             L(2)/'SAXPY '/\n      DATA             L(3)/'SROTG '/\n      DATA             L(4)/' SROT '/\n      DATA             L(5)/'SCOPY '/\n      DATA             L(6)/'SSWAP '/\n      DATA             L(7)/'SNRM2 '/\n      DATA             L(8)/'SASUM '/\n      DATA             L(9)/'SSCAL '/\n      DATA             L(10)/'ISAMAX'/\n      DATA             L(11)/'SROTMG'/\n      DATA             L(12)/'SROTM '/\n      DATA             L(13)/'SDSDOT'/\n*     .. Executable Statements ..\n      WRITE (NOUT,99999) ICASE, L(ICASE)\n      RETURN\n*\n99999 FORMAT (/' Test of subprogram number',I3,12X,A6)\n      END\n      SUBROUTINE CHECK0(SFAC)\n*     .. Parameters ..\n      INTEGER           NOUT\n      PARAMETER         (NOUT=6)\n*     .. Scalar Arguments ..\n      REAL              SFAC\n*     .. Scalars in Common ..\n      INTEGER           ICASE, INCX, INCY, N\n      LOGICAL           PASS\n*     .. Local Scalars ..\n      REAL              D12, SA, SB, SC, SS\n      INTEGER           I, K\n*     .. Local Arrays ..\n      REAL              DA1(8), DATRUE(8), DB1(8), DBTRUE(8), DC1(8),\n     +                  DS1(8), DAB(4,9), DTEMP(9), DTRUE(9,9)\n*     .. External Subroutines ..\n      EXTERNAL          SROTG, SROTMG, STEST1\n*     .. Common blocks ..\n      COMMON            /COMBLA/ICASE, N, INCX, INCY, PASS\n*     .. Data statements ..\n      DATA              DA1/0.3E0, 0.4E0, -0.3E0, -0.4E0, -0.3E0, 0.0E0,\n     +                  0.0E0, 1.0E0/\n      DATA              DB1/0.4E0, 0.3E0, 0.4E0, 0.3E0, -0.4E0, 0.0E0,\n     +                  1.0E0, 0.0E0/\n      DATA              DC1/0.6E0, 0.8E0, -0.6E0, 0.8E0, 0.6E0, 1.0E0,\n     +                  0.0E0, 1.0E0/\n      DATA              DS1/0.8E0, 0.6E0, 0.8E0, -0.6E0, 0.8E0, 0.0E0,\n     +                  1.0E0, 0.0E0/\n      DATA              DATRUE/0.5E0, 0.5E0, 0.5E0, -0.5E0, -0.5E0,\n     +                  0.0E0, 1.0E0, 1.0E0/\n      DATA              DBTRUE/0.0E0, 0.6E0, 0.0E0, -0.6E0, 0.0E0,\n     +                  0.0E0, 1.0E0, 0.0E0/\n*     INPUT FOR MODIFIED GIVENS\n      DATA DAB/ .1E0,.3E0,1.2E0,.2E0,\n     A          .7E0, .2E0, .6E0, 4.2E0,\n     B          0.E0,0.E0,0.E0,0.E0,\n     C          4.E0, -1.E0, 2.E0, 4.E0,\n     D          6.E-10, 2.E-2, 1.E5, 10.E0,\n     E          4.E10, 2.E-2, 1.E-5, 10.E0,\n     F          2.E-10, 4.E-2, 1.E5, 10.E0,\n     G          2.E10, 4.E-2, 1.E-5, 10.E0,\n     H          4.E0, -2.E0, 8.E0, 4.E0    /\n*    TRUE RESULTS FOR MODIFIED GIVENS\n      DATA DTRUE/0.E0,0.E0, 1.3E0, .2E0, 0.E0,0.E0,0.E0, .5E0, 0.E0,\n     A           0.E0,0.E0, 4.5E0, 4.2E0, 1.E0, .5E0, 0.E0,0.E0,0.E0,\n     B           0.E0,0.E0,0.E0,0.E0, -2.E0, 0.E0,0.E0,0.E0,0.E0,\n     C           0.E0,0.E0,0.E0, 4.E0, -1.E0, 0.E0,0.E0,0.E0,0.E0,\n     D           0.E0, 15.E-3, 0.E0, 10.E0, -1.E0, 0.E0, -1.E-4,\n     E           0.E0, 1.E0,\n     F           0.E0,0.E0, 6144.E-5, 10.E0, -1.E0, 4096.E0, -1.E6,\n     G           0.E0, 1.E0,\n     H           0.E0,0.E0,15.E0,10.E0,-1.E0, 5.E-5, 0.E0,1.E0,0.E0,\n     I           0.E0,0.E0, 15.E0, 10.E0, -1. E0, 5.E5, -4096.E0,\n     J           1.E0, 4096.E-6,\n     K           0.E0,0.E0, 7.E0, 4.E0, 0.E0,0.E0, -.5E0, -.25E0, 0.E0/\n*                   4096 = 2 ** 12\n      DATA D12  /4096.E0/\n      DTRUE(1,1) = 12.E0 / 130.E0\n      DTRUE(2,1) = 36.E0 / 130.E0\n      DTRUE(7,1) = -1.E0 / 6.E0\n      DTRUE(1,2) = 14.E0 / 75.E0\n      DTRUE(2,2) = 49.E0 / 75.E0\n      DTRUE(9,2) = 1.E0 / 7.E0\n      DTRUE(1,5) = 45.E-11 * (D12 * D12)\n      DTRUE(3,5) = 4.E5 / (3.E0 * D12)\n      DTRUE(6,5) = 1.E0 / D12\n      DTRUE(8,5) = 1.E4 / (3.E0 * D12)\n      DTRUE(1,6) = 4.E10 / (1.5E0 * D12 * D12)\n      DTRUE(2,6) = 2.E-2 / 1.5E0\n      DTRUE(8,6) = 5.E-7 * D12\n      DTRUE(1,7) = 4.E0 / 150.E0\n      DTRUE(2,7) = (2.E-10 / 1.5E0) * (D12 * D12)\n      DTRUE(7,7) = -DTRUE(6,5)\n      DTRUE(9,7) = 1.E4 / D12\n      DTRUE(1,8) = DTRUE(1,7)\n      DTRUE(2,8) = 2.E10 / (1.5E0 * D12 * D12)\n      DTRUE(1,9) = 32.E0 / 7.E0\n      DTRUE(2,9) = -16.E0 / 7.E0\n*     .. Executable Statements ..\n*\n*     Compute true values which cannot be prestored\n*     in decimal notation\n*\n      DBTRUE(1) = 1.0E0/0.6E0\n      DBTRUE(3) = -1.0E0/0.6E0\n      DBTRUE(5) = 1.0E0/0.6E0\n*\n      DO 20 K = 1, 8\n*        .. Set N=K for identification in output if any ..\n         N = K\n         IF (ICASE.EQ.3) THEN\n*           .. SROTG ..\n            IF (K.GT.8) GO TO 40\n            SA = DA1(K)\n            SB = DB1(K)\n            CALL SROTG(SA,SB,SC,SS)\n            CALL STEST1(SA,DATRUE(K),DATRUE(K),SFAC)\n            CALL STEST1(SB,DBTRUE(K),DBTRUE(K),SFAC)\n            CALL STEST1(SC,DC1(K),DC1(K),SFAC)\n            CALL STEST1(SS,DS1(K),DS1(K),SFAC)\n         ELSEIF (ICASE.EQ.11) THEN\n*           .. SROTMG ..\n            DO I=1,4\n               DTEMP(I)= DAB(I,K)\n               DTEMP(I+4) = 0.0\n            END DO\n            DTEMP(9) = 0.0\n            CALL SROTMG(DTEMP(1),DTEMP(2),DTEMP(3),DTEMP(4),DTEMP(5))\n            CALL STEST(9,DTEMP,DTRUE(1,K),DTRUE(1,K),SFAC)\n         ELSE\n            WRITE (NOUT,*) ' Shouldn''t be here in CHECK0'\n            STOP\n         END IF\n   20 CONTINUE\n   40 RETURN\n      END\n      SUBROUTINE CHECK1(SFAC)\n*     .. Parameters ..\n      INTEGER           NOUT\n      PARAMETER         (NOUT=6)\n*     .. Scalar Arguments ..\n      REAL              SFAC\n*     .. Scalars in Common ..\n      INTEGER           ICASE, INCX, INCY, N\n      LOGICAL           PASS\n*     .. Local Scalars ..\n      INTEGER           I, LEN, NP1\n*     .. Local Arrays ..\n      REAL              DTRUE1(5), DTRUE3(5), DTRUE5(8,5,2), DV(8,5,2),\n     +                  SA(10), STEMP(1), STRUE(8), SX(8)\n      INTEGER           ITRUE2(5)\n*     .. External Functions ..\n      REAL              SASUM, SNRM2\n      INTEGER           ISAMAX\n      EXTERNAL          SASUM, SNRM2, ISAMAX\n*     .. External Subroutines ..\n      EXTERNAL          ITEST1, SSCAL, STEST, STEST1\n*     .. Intrinsic Functions ..\n      INTRINSIC         MAX\n*     .. Common blocks ..\n      COMMON            /COMBLA/ICASE, N, INCX, INCY, PASS\n*     .. Data statements ..\n      DATA              SA/0.3E0, -1.0E0, 0.0E0, 1.0E0, 0.3E0, 0.3E0,\n     +                  0.3E0, 0.3E0, 0.3E0, 0.3E0/\n      DATA              DV/0.1E0, 2.0E0, 2.0E0, 2.0E0, 2.0E0, 2.0E0,\n     +                  2.0E0, 2.0E0, 0.3E0, 3.0E0, 3.0E0, 3.0E0, 3.0E0,\n     +                  3.0E0, 3.0E0, 3.0E0, 0.3E0, -0.4E0, 4.0E0,\n     +                  4.0E0, 4.0E0, 4.0E0, 4.0E0, 4.0E0, 0.2E0,\n     +                  -0.6E0, 0.3E0, 5.0E0, 5.0E0, 5.0E0, 5.0E0,\n     +                  5.0E0, 0.1E0, -0.3E0, 0.5E0, -0.1E0, 6.0E0,\n     +                  6.0E0, 6.0E0, 6.0E0, 0.1E0, 8.0E0, 8.0E0, 8.0E0,\n     +                  8.0E0, 8.0E0, 8.0E0, 8.0E0, 0.3E0, 9.0E0, 9.0E0,\n     +                  9.0E0, 9.0E0, 9.0E0, 9.0E0, 9.0E0, 0.3E0, 2.0E0,\n     +                  -0.4E0, 2.0E0, 2.0E0, 2.0E0, 2.0E0, 2.0E0,\n     +                  0.2E0, 3.0E0, -0.6E0, 5.0E0, 0.3E0, 2.0E0,\n     +                  2.0E0, 2.0E0, 0.1E0, 4.0E0, -0.3E0, 6.0E0,\n     +                  -0.5E0, 7.0E0, -0.1E0, 3.0E0/\n      DATA              DTRUE1/0.0E0, 0.3E0, 0.5E0, 0.7E0, 0.6E0/\n      DATA              DTRUE3/0.0E0, 0.3E0, 0.7E0, 1.1E0, 1.0E0/\n      DATA              DTRUE5/0.10E0, 2.0E0, 2.0E0, 2.0E0, 2.0E0,\n     +                  2.0E0, 2.0E0, 2.0E0, -0.3E0, 3.0E0, 3.0E0,\n     +                  3.0E0, 3.0E0, 3.0E0, 3.0E0, 3.0E0, 0.0E0, 0.0E0,\n     +                  4.0E0, 4.0E0, 4.0E0, 4.0E0, 4.0E0, 4.0E0,\n     +                  0.20E0, -0.60E0, 0.30E0, 5.0E0, 5.0E0, 5.0E0,\n     +                  5.0E0, 5.0E0, 0.03E0, -0.09E0, 0.15E0, -0.03E0,\n     +                  6.0E0, 6.0E0, 6.0E0, 6.0E0, 0.10E0, 8.0E0,\n     +                  8.0E0, 8.0E0, 8.0E0, 8.0E0, 8.0E0, 8.0E0,\n     +                  0.09E0, 9.0E0, 9.0E0, 9.0E0, 9.0E0, 9.0E0,\n     +                  9.0E0, 9.0E0, 0.09E0, 2.0E0, -0.12E0, 2.0E0,\n     +                  2.0E0, 2.0E0, 2.0E0, 2.0E0, 0.06E0, 3.0E0,\n     +                  -0.18E0, 5.0E0, 0.09E0, 2.0E0, 2.0E0, 2.0E0,\n     +                  0.03E0, 4.0E0, -0.09E0, 6.0E0, -0.15E0, 7.0E0,\n     +                  -0.03E0, 3.0E0/\n      DATA              ITRUE2/0, 1, 2, 2, 3/\n*     .. Executable Statements ..\n      DO 80 INCX = 1, 2\n         DO 60 NP1 = 1, 5\n            N = NP1 - 1\n            LEN = 2*MAX(N,1)\n*           .. Set vector arguments ..\n            DO 20 I = 1, LEN\n               SX(I) = DV(I,NP1,INCX)\n   20       CONTINUE\n*\n            IF (ICASE.EQ.7) THEN\n*              .. SNRM2 ..\n               STEMP(1) = DTRUE1(NP1)\n               CALL STEST1(SNRM2(N,SX,INCX),STEMP(1),STEMP,SFAC)\n            ELSE IF (ICASE.EQ.8) THEN\n*              .. SASUM ..\n               STEMP(1) = DTRUE3(NP1)\n               CALL STEST1(SASUM(N,SX,INCX),STEMP(1),STEMP,SFAC)\n            ELSE IF (ICASE.EQ.9) THEN\n*              .. SSCAL ..\n               CALL SSCAL(N,SA((INCX-1)*5+NP1),SX,INCX)\n               DO 40 I = 1, LEN\n                  STRUE(I) = DTRUE5(I,NP1,INCX)\n   40          CONTINUE\n               CALL STEST(LEN,SX,STRUE,STRUE,SFAC)\n            ELSE IF (ICASE.EQ.10) THEN\n*              .. ISAMAX ..\n               CALL ITEST1(ISAMAX(N,SX,INCX),ITRUE2(NP1))\n            ELSE\n               WRITE (NOUT,*) ' Shouldn''t be here in CHECK1'\n               STOP\n            END IF\n   60    CONTINUE\n   80 CONTINUE\n      RETURN\n      END\n      SUBROUTINE CHECK2(SFAC)\n*     .. Parameters ..\n      INTEGER           NOUT\n      PARAMETER         (NOUT=6)\n*     .. Scalar Arguments ..\n      REAL              SFAC\n*     .. Scalars in Common ..\n      INTEGER           ICASE, INCX, INCY, N\n      LOGICAL           PASS\n*     .. Local Scalars ..\n      REAL              SA\n      INTEGER           I, J, KI, KN, KNI, KPAR, KSIZE, LENX, LENY,\n     $                  MX, MY \n*     .. Local Arrays ..\n      REAL              DT10X(7,4,4), DT10Y(7,4,4), DT7(4,4),\n     $                  DT8(7,4,4), DX1(7),\n     $                  DY1(7), SSIZE1(4), SSIZE2(14,2), SSIZE3(4),\n     $                  SSIZE(7), STX(7), STY(7), SX(7), SY(7),\n     $                  DPAR(5,4), DT19X(7,4,16),DT19XA(7,4,4),\n     $                  DT19XB(7,4,4), DT19XC(7,4,4),DT19XD(7,4,4),\n     $                  DT19Y(7,4,16), DT19YA(7,4,4),DT19YB(7,4,4),\n     $                  DT19YC(7,4,4), DT19YD(7,4,4), DTEMP(5),\n     $                  ST7B(4,4)\n      INTEGER           INCXS(4), INCYS(4), LENS(4,2), NS(4)\n*     .. External Functions ..\n      REAL              SDOT, SDSDOT\n      EXTERNAL          SDOT, SDSDOT\n*     .. External Subroutines ..\n      EXTERNAL          SAXPY, SCOPY, SROTM, SSWAP, STEST, STEST1\n*     .. Intrinsic Functions ..\n      INTRINSIC         ABS, MIN\n*     .. Common blocks ..\n      COMMON            /COMBLA/ICASE, N, INCX, INCY, PASS\n*     .. Data statements ..\n      EQUIVALENCE (DT19X(1,1,1),DT19XA(1,1,1)),(DT19X(1,1,5),\n     A   DT19XB(1,1,1)),(DT19X(1,1,9),DT19XC(1,1,1)),\n     B   (DT19X(1,1,13),DT19XD(1,1,1))\n      EQUIVALENCE (DT19Y(1,1,1),DT19YA(1,1,1)),(DT19Y(1,1,5),\n     A   DT19YB(1,1,1)),(DT19Y(1,1,9),DT19YC(1,1,1)),\n     B   (DT19Y(1,1,13),DT19YD(1,1,1))\n\n      DATA              SA/0.3E0/\n      DATA              INCXS/1, 2, -2, -1/\n      DATA              INCYS/1, -2, 1, -2/\n      DATA              LENS/1, 1, 2, 4, 1, 1, 3, 7/\n      DATA              NS/0, 1, 2, 4/\n      DATA              DX1/0.6E0, 0.1E0, -0.5E0, 0.8E0, 0.9E0, -0.3E0,\n     +                  -0.4E0/\n      DATA              DY1/0.5E0, -0.9E0, 0.3E0, 0.7E0, -0.6E0, 0.2E0,\n     +                  0.8E0/\n      DATA              DT7/0.0E0, 0.30E0, 0.21E0, 0.62E0, 0.0E0,\n     +                  0.30E0, -0.07E0, 0.85E0, 0.0E0, 0.30E0, -0.79E0,\n     +                  -0.74E0, 0.0E0, 0.30E0, 0.33E0, 1.27E0/\n      DATA              ST7B/ .1, .4, .31, .72,     .1, .4, .03, .95,\n     +                  .1, .4, -.69, -.64,   .1, .4, .43, 1.37/\n      DATA              DT8/0.5E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.0E0, 0.68E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.0E0, 0.0E0, 0.68E0, -0.87E0, 0.0E0, 0.0E0,\n     +                  0.0E0, 0.0E0, 0.0E0, 0.68E0, -0.87E0, 0.15E0,\n     +                  0.94E0, 0.0E0, 0.0E0, 0.0E0, 0.5E0, 0.0E0,\n     +                  0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.68E0,\n     +                  0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.35E0, -0.9E0, 0.48E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.0E0, 0.38E0, -0.9E0, 0.57E0, 0.7E0, -0.75E0,\n     +                  0.2E0, 0.98E0, 0.5E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.0E0, 0.0E0, 0.0E0, 0.68E0, 0.0E0, 0.0E0,\n     +                  0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.35E0, -0.72E0,\n     +                  0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.38E0,\n     +                  -0.63E0, 0.15E0, 0.88E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.5E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.68E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.0E0, 0.68E0, -0.9E0, 0.33E0, 0.0E0, 0.0E0,\n     +                  0.0E0, 0.0E0, 0.68E0, -0.9E0, 0.33E0, 0.7E0,\n     +                  -0.75E0, 0.2E0, 1.04E0/\n      DATA              DT10X/0.6E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.0E0, 0.5E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.0E0, 0.5E0, -0.9E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.0E0, 0.0E0, 0.5E0, -0.9E0, 0.3E0, 0.7E0,\n     +                  0.0E0, 0.0E0, 0.0E0, 0.6E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.0E0, 0.0E0, 0.0E0, 0.5E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.0E0, 0.0E0, 0.0E0, 0.3E0, 0.1E0, 0.5E0, 0.0E0,\n     +                  0.0E0, 0.0E0, 0.0E0, 0.8E0, 0.1E0, -0.6E0,\n     +                  0.8E0, 0.3E0, -0.3E0, 0.5E0, 0.6E0, 0.0E0,\n     +                  0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.5E0, 0.0E0,\n     +                  0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, -0.9E0,\n     +                  0.1E0, 0.5E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.7E0,\n     +                  0.1E0, 0.3E0, 0.8E0, -0.9E0, -0.3E0, 0.5E0,\n     +                  0.6E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.5E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.5E0, 0.3E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.5E0, 0.3E0, -0.6E0, 0.8E0, 0.0E0, 0.0E0,\n     +                  0.0E0/\n      DATA              DT10Y/0.5E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.0E0, 0.6E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.0E0, 0.6E0, 0.1E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.0E0, 0.6E0, 0.1E0, -0.5E0, 0.8E0, 0.0E0,\n     +                  0.0E0, 0.0E0, 0.5E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.0E0, 0.0E0, 0.6E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.0E0, 0.0E0, -0.5E0, -0.9E0, 0.6E0, 0.0E0,\n     +                  0.0E0, 0.0E0, 0.0E0, -0.4E0, -0.9E0, 0.9E0,\n     +                  0.7E0, -0.5E0, 0.2E0, 0.6E0, 0.5E0, 0.0E0,\n     +                  0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.6E0, 0.0E0,\n     +                  0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, -0.5E0,\n     +                  0.6E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  -0.4E0, 0.9E0, -0.5E0, 0.6E0, 0.0E0, 0.0E0,\n     +                  0.0E0, 0.5E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.0E0, 0.6E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.0E0, 0.6E0, -0.9E0, 0.1E0, 0.0E0, 0.0E0,\n     +                  0.0E0, 0.0E0, 0.6E0, -0.9E0, 0.1E0, 0.7E0,\n     +                  -0.5E0, 0.2E0, 0.8E0/\n      DATA              SSIZE1/0.0E0, 0.3E0, 1.6E0, 3.2E0/\n      DATA              SSIZE2/0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.0E0, 1.17E0, 1.17E0, 1.17E0, 1.17E0, 1.17E0,\n     +                  1.17E0, 1.17E0, 1.17E0, 1.17E0, 1.17E0, 1.17E0,\n     +                  1.17E0, 1.17E0, 1.17E0/\n      DATA              SSIZE3/ .1, .4, 1.7, 3.3 /\n*\n*                         FOR DROTM\n*\n      DATA DPAR/-2.E0,  0.E0,0.E0,0.E0,0.E0,\n     A          -1.E0,  2.E0, -3.E0, -4.E0,  5.E0,\n     B           0.E0,  0.E0,  2.E0, -3.E0,  0.E0,\n     C           1.E0,  5.E0,  2.E0,  0.E0, -4.E0/\n*                        TRUE X RESULTS F0R ROTATIONS DROTM\n      DATA DT19XA/.6E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     A            .6E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     B            .6E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     C            .6E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     D            .6E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     E           -.8E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     F           -.9E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     G           3.5E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     H            .6E0,   .1E0,             0.E0,0.E0,0.E0,0.E0,0.E0,\n     I           -.8E0,  3.8E0,             0.E0,0.E0,0.E0,0.E0,0.E0,\n     J           -.9E0,  2.8E0,             0.E0,0.E0,0.E0,0.E0,0.E0,\n     K           3.5E0,  -.4E0,             0.E0,0.E0,0.E0,0.E0,0.E0,\n     L            .6E0,   .1E0,  -.5E0,   .8E0,          0.E0,0.E0,0.E0,\n     M           -.8E0,  3.8E0, -2.2E0, -1.2E0,          0.E0,0.E0,0.E0,\n     N           -.9E0,  2.8E0, -1.4E0, -1.3E0,          0.E0,0.E0,0.E0,\n     O           3.5E0,  -.4E0, -2.2E0,  4.7E0,          0.E0,0.E0,0.E0/\n*\n      DATA DT19XB/.6E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     A            .6E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     B            .6E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     C            .6E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     D            .6E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     E           -.8E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     F           -.9E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     G           3.5E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     H            .6E0,   .1E0,  -.5E0,             0.E0,0.E0,0.E0,0.E0,\n     I           0.E0,    .1E0, -3.0E0,             0.E0,0.E0,0.E0,0.E0,\n     J           -.3E0,   .1E0, -2.0E0,             0.E0,0.E0,0.E0,0.E0,\n     K           3.3E0,   .1E0, -2.0E0,             0.E0,0.E0,0.E0,0.E0,\n     L            .6E0,   .1E0,  -.5E0,   .8E0,   .9E0,  -.3E0,  -.4E0,\n     M          -2.0E0,   .1E0,  1.4E0,   .8E0,   .6E0,  -.3E0, -2.8E0,\n     N          -1.8E0,   .1E0,  1.3E0,   .8E0,  0.E0,   -.3E0, -1.9E0,\n     O           3.8E0,   .1E0, -3.1E0,   .8E0,  4.8E0,  -.3E0, -1.5E0 /\n*\n      DATA DT19XC/.6E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     A            .6E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     B            .6E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     C            .6E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     D            .6E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     E           -.8E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     F           -.9E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     G           3.5E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     H            .6E0,   .1E0,  -.5E0,             0.E0,0.E0,0.E0,0.E0,\n     I           4.8E0,   .1E0, -3.0E0,             0.E0,0.E0,0.E0,0.E0,\n     J           3.3E0,   .1E0, -2.0E0,             0.E0,0.E0,0.E0,0.E0,\n     K           2.1E0,   .1E0, -2.0E0,             0.E0,0.E0,0.E0,0.E0,\n     L            .6E0,   .1E0,  -.5E0,   .8E0,   .9E0,  -.3E0,  -.4E0,\n     M          -1.6E0,   .1E0, -2.2E0,   .8E0,  5.4E0,  -.3E0, -2.8E0,\n     N          -1.5E0,   .1E0, -1.4E0,   .8E0,  3.6E0,  -.3E0, -1.9E0,\n     O           3.7E0,   .1E0, -2.2E0,   .8E0,  3.6E0,  -.3E0, -1.5E0 /\n*\n      DATA DT19XD/.6E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     A            .6E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     B            .6E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     C            .6E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     D            .6E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     E           -.8E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     F           -.9E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     G           3.5E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     H            .6E0,   .1E0,             0.E0,0.E0,0.E0,0.E0,0.E0,\n     I           -.8E0, -1.0E0,             0.E0,0.E0,0.E0,0.E0,0.E0,\n     J           -.9E0,  -.8E0,             0.E0,0.E0,0.E0,0.E0,0.E0,\n     K           3.5E0,   .8E0,             0.E0,0.E0,0.E0,0.E0,0.E0,\n     L            .6E0,   .1E0,  -.5E0,   .8E0,          0.E0,0.E0,0.E0,\n     M           -.8E0, -1.0E0,  1.4E0, -1.6E0,          0.E0,0.E0,0.E0,\n     N           -.9E0,  -.8E0,  1.3E0, -1.6E0,          0.E0,0.E0,0.E0,\n     O           3.5E0,   .8E0, -3.1E0,  4.8E0,          0.E0,0.E0,0.E0/\n*                        TRUE Y RESULTS FOR ROTATIONS DROTM\n      DATA DT19YA/.5E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     A            .5E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     B            .5E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     C            .5E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     D            .5E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     E            .7E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     F           1.7E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     G          -2.6E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     H            .5E0,  -.9E0,             0.E0,0.E0,0.E0,0.E0,0.E0,\n     I            .7E0, -4.8E0,             0.E0,0.E0,0.E0,0.E0,0.E0,\n     J           1.7E0,  -.7E0,             0.E0,0.E0,0.E0,0.E0,0.E0,\n     K          -2.6E0,  3.5E0,             0.E0,0.E0,0.E0,0.E0,0.E0,\n     L            .5E0,  -.9E0,   .3E0,   .7E0,          0.E0,0.E0,0.E0,\n     M            .7E0, -4.8E0,  3.0E0,  1.1E0,          0.E0,0.E0,0.E0,\n     N           1.7E0,  -.7E0,  -.7E0,  2.3E0,          0.E0,0.E0,0.E0,\n     O          -2.6E0,  3.5E0,  -.7E0, -3.6E0,          0.E0,0.E0,0.E0/\n*\n      DATA DT19YB/.5E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     A            .5E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     B            .5E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     C            .5E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     D            .5E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     E            .7E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     F           1.7E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     G          -2.6E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     H            .5E0,  -.9E0,   .3E0,             0.E0,0.E0,0.E0,0.E0,\n     I           4.0E0,  -.9E0,  -.3E0,             0.E0,0.E0,0.E0,0.E0,\n     J           -.5E0,  -.9E0,  1.5E0,             0.E0,0.E0,0.E0,0.E0,\n     K          -1.5E0,  -.9E0, -1.8E0,             0.E0,0.E0,0.E0,0.E0,\n     L            .5E0,  -.9E0,   .3E0,   .7E0,  -.6E0,   .2E0,   .8E0,\n     M           3.7E0,  -.9E0, -1.2E0,   .7E0, -1.5E0,   .2E0,  2.2E0,\n     N           -.3E0,  -.9E0,  2.1E0,   .7E0, -1.6E0,   .2E0,  2.0E0,\n     O          -1.6E0,  -.9E0, -2.1E0,   .7E0,  2.9E0,   .2E0, -3.8E0 /\n*\n      DATA DT19YC/.5E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     A            .5E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     B            .5E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     C            .5E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     D            .5E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     E            .7E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     F           1.7E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     G          -2.6E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     H            .5E0,  -.9E0,             0.E0,0.E0,0.E0,0.E0,0.E0,\n     I           4.0E0, -6.3E0,             0.E0,0.E0,0.E0,0.E0,0.E0,\n     J           -.5E0,   .3E0,             0.E0,0.E0,0.E0,0.E0,0.E0,\n     K          -1.5E0,  3.0E0,             0.E0,0.E0,0.E0,0.E0,0.E0,\n     L            .5E0,  -.9E0,   .3E0,   .7E0,          0.E0,0.E0,0.E0,\n     M           3.7E0, -7.2E0,  3.0E0,  1.7E0,          0.E0,0.E0,0.E0,\n     N           -.3E0,   .9E0,  -.7E0,  1.9E0,          0.E0,0.E0,0.E0,\n     O          -1.6E0,  2.7E0,  -.7E0, -3.4E0,          0.E0,0.E0,0.E0/\n*\n      DATA DT19YD/.5E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     A            .5E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     B            .5E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     C            .5E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     D            .5E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     E            .7E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     F           1.7E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     G          -2.6E0,                  0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,\n     H            .5E0,  -.9E0,   .3E0,             0.E0,0.E0,0.E0,0.E0,\n     I            .7E0,  -.9E0,  1.2E0,             0.E0,0.E0,0.E0,0.E0,\n     J           1.7E0,  -.9E0,   .5E0,             0.E0,0.E0,0.E0,0.E0,\n     K          -2.6E0,  -.9E0, -1.3E0,             0.E0,0.E0,0.E0,0.E0,\n     L            .5E0,  -.9E0,   .3E0,   .7E0,  -.6E0,   .2E0,   .8E0,\n     M            .7E0,  -.9E0,  1.2E0,   .7E0, -1.5E0,   .2E0,  1.6E0,\n     N           1.7E0,  -.9E0,   .5E0,   .7E0, -1.6E0,   .2E0,  2.4E0,\n     O          -2.6E0,  -.9E0, -1.3E0,   .7E0,  2.9E0,   .2E0, -4.0E0 /\n*\n*     .. Executable Statements ..\n*\n      DO 120 KI = 1, 4\n         INCX = INCXS(KI)\n         INCY = INCYS(KI)\n         MX = ABS(INCX)\n         MY = ABS(INCY)\n*\n         DO 100 KN = 1, 4\n            N = NS(KN)\n            KSIZE = MIN(2,KN)\n            LENX = LENS(KN,MX)\n            LENY = LENS(KN,MY)\n*           .. Initialize all argument arrays ..\n            DO 20 I = 1, 7\n               SX(I) = DX1(I)\n               SY(I) = DY1(I)\n   20       CONTINUE\n*\n            IF (ICASE.EQ.1) THEN\n*              .. SDOT ..\n               CALL STEST1(SDOT(N,SX,INCX,SY,INCY),DT7(KN,KI),SSIZE1(KN)\n     +                     ,SFAC)\n            ELSE IF (ICASE.EQ.2) THEN\n*              .. SAXPY ..\n               CALL SAXPY(N,SA,SX,INCX,SY,INCY)\n               DO 40 J = 1, LENY\n                  STY(J) = DT8(J,KN,KI)\n   40          CONTINUE\n               CALL STEST(LENY,SY,STY,SSIZE2(1,KSIZE),SFAC)\n            ELSE IF (ICASE.EQ.5) THEN\n*              .. SCOPY ..\n               DO 60 I = 1, 7\n                  STY(I) = DT10Y(I,KN,KI)\n   60          CONTINUE\n               CALL SCOPY(N,SX,INCX,SY,INCY)\n               CALL STEST(LENY,SY,STY,SSIZE2(1,1),1.0E0)\n            ELSE IF (ICASE.EQ.6) THEN\n*              .. SSWAP ..\n               CALL SSWAP(N,SX,INCX,SY,INCY)\n               DO 80 I = 1, 7\n                  STX(I) = DT10X(I,KN,KI)\n                  STY(I) = DT10Y(I,KN,KI)\n   80          CONTINUE\n               CALL STEST(LENX,SX,STX,SSIZE2(1,1),1.0E0)\n               CALL STEST(LENY,SY,STY,SSIZE2(1,1),1.0E0)\n            ELSEIF (ICASE.EQ.12) THEN\n*              .. SROTM ..\n               KNI=KN+4*(KI-1)\n               DO KPAR=1,4\n                  DO I=1,7\n                     SX(I) = DX1(I)\n                     SY(I) = DY1(I)\n                     STX(I)= DT19X(I,KPAR,KNI)\n                     STY(I)= DT19Y(I,KPAR,KNI)\n                  END DO\n*\n                  DO I=1,5\n                     DTEMP(I) = DPAR(I,KPAR)\n                  END DO\n*\n                  DO  I=1,LENX\n                     SSIZE(I)=STX(I)\n                  END DO\n*                   SEE REMARK ABOVE ABOUT DT11X(1,2,7)\n*                       AND DT11X(5,3,8).\n                  IF ((KPAR .EQ. 2) .AND. (KNI .EQ. 7))\n     $               SSIZE(1) = 2.4E0\n                  IF ((KPAR .EQ. 3) .AND. (KNI .EQ. 8))\n     $               SSIZE(5) = 1.8E0\n*\n                  CALL   SROTM(N,SX,INCX,SY,INCY,DTEMP)\n                  CALL   STEST(LENX,SX,STX,SSIZE,SFAC)\n                  CALL   STEST(LENY,SY,STY,STY,SFAC)\n               END DO\n            ELSEIF (ICASE.EQ.13) THEN\n*              .. SDSROT ..\n               CALL STEST1 (SDSDOT(N,.1,SX,INCX,SY,INCY),\n     $                 ST7B(KN,KI),SSIZE3(KN),SFAC)\n            ELSE\n               WRITE (NOUT,*) ' Shouldn''t be here in CHECK2'\n               STOP\n            END IF\n  100    CONTINUE\n  120 CONTINUE\n      RETURN\n      END\n      SUBROUTINE CHECK3(SFAC)\n*     .. Parameters ..\n      INTEGER           NOUT\n      PARAMETER         (NOUT=6)\n*     .. Scalar Arguments ..\n      REAL              SFAC\n*     .. Scalars in Common ..\n      INTEGER           ICASE, INCX, INCY, N\n      LOGICAL           PASS\n*     .. Local Scalars ..\n      REAL              SC, SS\n      INTEGER           I, K, KI, KN, KSIZE, LENX, LENY, MX, MY\n*     .. Local Arrays ..\n      REAL              COPYX(5), COPYY(5), DT9X(7,4,4), DT9Y(7,4,4),\n     +                  DX1(7), DY1(7), MWPC(11), MWPS(11), MWPSTX(5),\n     +                  MWPSTY(5), MWPTX(11,5), MWPTY(11,5), MWPX(5),\n     +                  MWPY(5), SSIZE2(14,2), STX(7), STY(7), SX(7),\n     +                  SY(7)\n      INTEGER           INCXS(4), INCYS(4), LENS(4,2), MWPINX(11),\n     +                  MWPINY(11), MWPN(11), NS(4)\n*     .. External Subroutines ..\n      EXTERNAL          SROT, STEST\n*     .. Intrinsic Functions ..\n      INTRINSIC         ABS, MIN\n*     .. Common blocks ..\n      COMMON            /COMBLA/ICASE, N, INCX, INCY, PASS\n*     .. Data statements ..\n      DATA              INCXS/1, 2, -2, -1/\n      DATA              INCYS/1, -2, 1, -2/\n      DATA              LENS/1, 1, 2, 4, 1, 1, 3, 7/\n      DATA              NS/0, 1, 2, 4/\n      DATA              DX1/0.6E0, 0.1E0, -0.5E0, 0.8E0, 0.9E0, -0.3E0,\n     +                  -0.4E0/\n      DATA              DY1/0.5E0, -0.9E0, 0.3E0, 0.7E0, -0.6E0, 0.2E0,\n     +                  0.8E0/\n      DATA              SC, SS/0.8E0, 0.6E0/\n      DATA              DT9X/0.6E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.0E0, 0.78E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.0E0, 0.0E0, 0.78E0, -0.46E0, 0.0E0, 0.0E0,\n     +                  0.0E0, 0.0E0, 0.0E0, 0.78E0, -0.46E0, -0.22E0,\n     +                  1.06E0, 0.0E0, 0.0E0, 0.0E0, 0.6E0, 0.0E0,\n     +                  0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.78E0,\n     +                  0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.66E0, 0.1E0, -0.1E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.0E0, 0.96E0, 0.1E0, -0.76E0, 0.8E0, 0.90E0,\n     +                  -0.3E0, -0.02E0, 0.6E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.0E0, 0.0E0, 0.0E0, 0.78E0, 0.0E0, 0.0E0,\n     +                  0.0E0, 0.0E0, 0.0E0, 0.0E0, -0.06E0, 0.1E0,\n     +                  -0.1E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.90E0,\n     +                  0.1E0, -0.22E0, 0.8E0, 0.18E0, -0.3E0, -0.02E0,\n     +                  0.6E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.78E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.0E0, 0.78E0, 0.26E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.0E0, 0.0E0, 0.78E0, 0.26E0, -0.76E0, 1.12E0,\n     +                  0.0E0, 0.0E0, 0.0E0/\n      DATA              DT9Y/0.5E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.0E0, 0.04E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.0E0, 0.0E0, 0.04E0, -0.78E0, 0.0E0, 0.0E0,\n     +                  0.0E0, 0.0E0, 0.0E0, 0.04E0, -0.78E0, 0.54E0,\n     +                  0.08E0, 0.0E0, 0.0E0, 0.0E0, 0.5E0, 0.0E0,\n     +                  0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.04E0,\n     +                  0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.7E0,\n     +                  -0.9E0, -0.12E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.64E0, -0.9E0, -0.30E0, 0.7E0, -0.18E0, 0.2E0,\n     +                  0.28E0, 0.5E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.0E0, 0.0E0, 0.04E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.0E0, 0.0E0, 0.0E0, 0.7E0, -1.08E0, 0.0E0,\n     +                  0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.64E0, -1.26E0,\n     +                  0.54E0, 0.20E0, 0.0E0, 0.0E0, 0.0E0, 0.5E0,\n     +                  0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.04E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.0E0, 0.04E0, -0.9E0, 0.18E0, 0.0E0, 0.0E0,\n     +                  0.0E0, 0.0E0, 0.04E0, -0.9E0, 0.18E0, 0.7E0,\n     +                  -0.18E0, 0.2E0, 0.16E0/\n      DATA              SSIZE2/0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0, 0.0E0,\n     +                  0.0E0, 1.17E0, 1.17E0, 1.17E0, 1.17E0, 1.17E0,\n     +                  1.17E0, 1.17E0, 1.17E0, 1.17E0, 1.17E0, 1.17E0,\n     +                  1.17E0, 1.17E0, 1.17E0/\n*     .. Executable Statements ..\n*\n      DO 60 KI = 1, 4\n         INCX = INCXS(KI)\n         INCY = INCYS(KI)\n         MX = ABS(INCX)\n         MY = ABS(INCY)\n*\n         DO 40 KN = 1, 4\n            N = NS(KN)\n            KSIZE = MIN(2,KN)\n            LENX = LENS(KN,MX)\n            LENY = LENS(KN,MY)\n*\n            IF (ICASE.EQ.4) THEN\n*              .. SROT ..\n               DO 20 I = 1, 7\n                  SX(I) = DX1(I)\n                  SY(I) = DY1(I)\n                  STX(I) = DT9X(I,KN,KI)\n                  STY(I) = DT9Y(I,KN,KI)\n   20          CONTINUE\n               CALL SROT(N,SX,INCX,SY,INCY,SC,SS)\n               CALL STEST(LENX,SX,STX,SSIZE2(1,KSIZE),SFAC)\n               CALL STEST(LENY,SY,STY,SSIZE2(1,KSIZE),SFAC)\n            ELSE\n               WRITE (NOUT,*) ' Shouldn''t be here in CHECK3'\n               STOP\n            END IF\n   40    CONTINUE\n   60 CONTINUE\n*\n      MWPC(1) = 1\n      DO 80 I = 2, 11\n         MWPC(I) = 0\n   80 CONTINUE\n      MWPS(1) = 0\n      DO 100 I = 2, 6\n         MWPS(I) = 1\n  100 CONTINUE\n      DO 120 I = 7, 11\n         MWPS(I) = -1\n  120 CONTINUE\n      MWPINX(1) = 1\n      MWPINX(2) = 1\n      MWPINX(3) = 1\n      MWPINX(4) = -1\n      MWPINX(5) = 1\n      MWPINX(6) = -1\n      MWPINX(7) = 1\n      MWPINX(8) = 1\n      MWPINX(9) = -1\n      MWPINX(10) = 1\n      MWPINX(11) = -1\n      MWPINY(1) = 1\n      MWPINY(2) = 1\n      MWPINY(3) = -1\n      MWPINY(4) = -1\n      MWPINY(5) = 2\n      MWPINY(6) = 1\n      MWPINY(7) = 1\n      MWPINY(8) = -1\n      MWPINY(9) = -1\n      MWPINY(10) = 2\n      MWPINY(11) = 1\n      DO 140 I = 1, 11\n         MWPN(I) = 5\n  140 CONTINUE\n      MWPN(5) = 3\n      MWPN(10) = 3\n      DO 160 I = 1, 5\n         MWPX(I) = I\n         MWPY(I) = I\n         MWPTX(1,I) = I\n         MWPTY(1,I) = I\n         MWPTX(2,I) = I\n         MWPTY(2,I) = -I\n         MWPTX(3,I) = 6 - I\n         MWPTY(3,I) = I - 6\n         MWPTX(4,I) = I\n         MWPTY(4,I) = -I\n         MWPTX(6,I) = 6 - I\n         MWPTY(6,I) = I - 6\n         MWPTX(7,I) = -I\n         MWPTY(7,I) = I\n         MWPTX(8,I) = I - 6\n         MWPTY(8,I) = 6 - I\n         MWPTX(9,I) = -I\n         MWPTY(9,I) = I\n         MWPTX(11,I) = I - 6\n         MWPTY(11,I) = 6 - I\n  160 CONTINUE\n      MWPTX(5,1) = 1\n      MWPTX(5,2) = 3\n      MWPTX(5,3) = 5\n      MWPTX(5,4) = 4\n      MWPTX(5,5) = 5\n      MWPTY(5,1) = -1\n      MWPTY(5,2) = 2\n      MWPTY(5,3) = -2\n      MWPTY(5,4) = 4\n      MWPTY(5,5) = -3\n      MWPTX(10,1) = -1\n      MWPTX(10,2) = -3\n      MWPTX(10,3) = -5\n      MWPTX(10,4) = 4\n      MWPTX(10,5) = 5\n      MWPTY(10,1) = 1\n      MWPTY(10,2) = 2\n      MWPTY(10,3) = 2\n      MWPTY(10,4) = 4\n      MWPTY(10,5) = 3\n      DO 200 I = 1, 11\n         INCX = MWPINX(I)\n         INCY = MWPINY(I)\n         DO 180 K = 1, 5\n            COPYX(K) = MWPX(K)\n            COPYY(K) = MWPY(K)\n            MWPSTX(K) = MWPTX(I,K)\n            MWPSTY(K) = MWPTY(I,K)\n  180    CONTINUE\n         CALL SROT(MWPN(I),COPYX,INCX,COPYY,INCY,MWPC(I),MWPS(I))\n         CALL STEST(5,COPYX,MWPSTX,MWPSTX,SFAC)\n         CALL STEST(5,COPYY,MWPSTY,MWPSTY,SFAC)\n  200 CONTINUE\n      RETURN\n      END\n      SUBROUTINE STEST(LEN,SCOMP,STRUE,SSIZE,SFAC)\n*     ********************************* STEST **************************\n*\n*     THIS SUBR COMPARES ARRAYS  SCOMP() AND STRUE() OF LENGTH LEN TO\n*     SEE IF THE TERM BY TERM DIFFERENCES, MULTIPLIED BY SFAC, ARE\n*     NEGLIGIBLE.\n*\n*     C. L. LAWSON, JPL, 1974 DEC 10\n*\n*     .. Parameters ..\n      INTEGER          NOUT\n      REAL             ZERO\n      PARAMETER        (NOUT=6, ZERO=0.0E0)\n*     .. Scalar Arguments ..\n      REAL             SFAC\n      INTEGER          LEN\n*     .. Array Arguments ..\n      REAL             SCOMP(LEN), SSIZE(LEN), STRUE(LEN)\n*     .. Scalars in Common ..\n      INTEGER          ICASE, INCX, INCY, N\n      LOGICAL          PASS\n*     .. Local Scalars ..\n      REAL             SD\n      INTEGER          I\n*     .. External Functions ..\n      REAL             SDIFF\n      EXTERNAL         SDIFF\n*     .. Intrinsic Functions ..\n      INTRINSIC        ABS\n*     .. Common blocks ..\n      COMMON           /COMBLA/ICASE, N, INCX, INCY, PASS\n*     .. Executable Statements ..\n*\n      DO 40 I = 1, LEN\n         SD = SCOMP(I) - STRUE(I)\n         IF (ABS(SFAC*SD) .LE. ABS(SSIZE(I))*EPSILON(ZERO))\n     +       GO TO 40\n*\n*                             HERE    SCOMP(I) IS NOT CLOSE TO STRUE(I).\n*\n         IF ( .NOT. PASS) GO TO 20\n*                             PRINT FAIL MESSAGE AND HEADER.\n         PASS = .FALSE.\n         WRITE (NOUT,99999)\n         WRITE (NOUT,99998)\n   20    WRITE (NOUT,99997) ICASE, N, INCX, INCY, I, SCOMP(I),\n     +     STRUE(I), SD, SSIZE(I)\n   40 CONTINUE\n      RETURN\n*\n99999 FORMAT ('                                       FAIL')\n99998 FORMAT (/' CASE  N INCX INCY  I                            ',\n     +       ' COMP(I)                             TRUE(I)  DIFFERENCE',\n     +       '     SIZE(I)',/1X)\n99997 FORMAT (1X,I4,I3,2I5,I3,2E36.8,2E12.4)\n      END\n      SUBROUTINE STEST1(SCOMP1,STRUE1,SSIZE,SFAC)\n*     ************************* STEST1 *****************************\n*\n*     THIS IS AN INTERFACE SUBROUTINE TO ACCOMODATE THE FORTRAN\n*     REQUIREMENT THAT WHEN A DUMMY ARGUMENT IS AN ARRAY, THE\n*     ACTUAL ARGUMENT MUST ALSO BE AN ARRAY OR AN ARRAY ELEMENT.\n*\n*     C.L. LAWSON, JPL, 1978 DEC 6\n*\n*     .. Scalar Arguments ..\n      REAL              SCOMP1, SFAC, STRUE1\n*     .. Array Arguments ..\n      REAL              SSIZE(*)\n*     .. Local Arrays ..\n      REAL              SCOMP(1), STRUE(1)\n*     .. External Subroutines ..\n      EXTERNAL          STEST\n*     .. Executable Statements ..\n*\n      SCOMP(1) = SCOMP1\n      STRUE(1) = STRUE1\n      CALL STEST(1,SCOMP,STRUE,SSIZE,SFAC)\n*\n      RETURN\n      END\n      REAL             FUNCTION SDIFF(SA,SB)\n*     ********************************* SDIFF **************************\n*     COMPUTES DIFFERENCE OF TWO NUMBERS.  C. L. LAWSON, JPL 1974 FEB 15\n*\n*     .. Scalar Arguments ..\n      REAL                            SA, SB\n*     .. Executable Statements ..\n      SDIFF = SA - SB\n      RETURN\n      END\n      SUBROUTINE ITEST1(ICOMP,ITRUE)\n*     ********************************* ITEST1 *************************\n*\n*     THIS SUBROUTINE COMPARES THE VARIABLES ICOMP AND ITRUE FOR\n*     EQUALITY.\n*     C. L. LAWSON, JPL, 1974 DEC 10\n*\n*     .. Parameters ..\n      INTEGER           NOUT\n      PARAMETER         (NOUT=6)\n*     .. Scalar Arguments ..\n      INTEGER           ICOMP, ITRUE\n*     .. Scalars in Common ..\n      INTEGER           ICASE, INCX, INCY, N\n      LOGICAL           PASS\n*     .. Local Scalars ..\n      INTEGER           ID\n*     .. Common blocks ..\n      COMMON            /COMBLA/ICASE, N, INCX, INCY, PASS\n*     .. Executable Statements ..\n*\n      IF (ICOMP.EQ.ITRUE) GO TO 40\n*\n*                            HERE ICOMP IS NOT EQUAL TO ITRUE.\n*\n      IF ( .NOT. PASS) GO TO 20\n*                             PRINT FAIL MESSAGE AND HEADER.\n      PASS = .FALSE.\n      WRITE (NOUT,99999)\n      WRITE (NOUT,99998)\n   20 ID = ICOMP - ITRUE\n      WRITE (NOUT,99997) ICASE, N, INCX, INCY, ICOMP, ITRUE, ID\n   40 CONTINUE\n      RETURN\n*\n99999 FORMAT ('                                       FAIL')\n99998 FORMAT (/' CASE  N INCX INCY                               ',\n     +       ' COMP                                TRUE     DIFFERENCE',\n     +       /1X)\n99997 FORMAT (1X,I4,I3,2I5,2I36,I12)\n      END\n"
  },
  {
    "path": "libs/eigen/blas/testing/sblat2.f",
    "content": "      PROGRAM SBLAT2\n*\n*  Test program for the REAL             Level 2 Blas.\n*\n*  The program must be driven by a short data file. The first 18 records\n*  of the file are read using list-directed input, the last 16 records\n*  are read using the format ( A6, L2 ). An annotated example of a data\n*  file can be obtained by deleting the first 3 characters from the\n*  following 34 lines:\n*  'SBLAT2.SUMM'     NAME OF SUMMARY OUTPUT FILE\n*  6                 UNIT NUMBER OF SUMMARY FILE\n*  'SBLAT2.SNAP'     NAME OF SNAPSHOT OUTPUT FILE\n*  -1                UNIT NUMBER OF SNAPSHOT FILE (NOT USED IF .LT. 0)\n*  F        LOGICAL FLAG, T TO REWIND SNAPSHOT FILE AFTER EACH RECORD.\n*  F        LOGICAL FLAG, T TO STOP ON FAILURES.\n*  T        LOGICAL FLAG, T TO TEST ERROR EXITS.\n*  16.0     THRESHOLD VALUE OF TEST RATIO\n*  6                 NUMBER OF VALUES OF N\n*  0 1 2 3 5 9       VALUES OF N\n*  4                 NUMBER OF VALUES OF K\n*  0 1 2 4           VALUES OF K\n*  4                 NUMBER OF VALUES OF INCX AND INCY\n*  1 2 -1 -2         VALUES OF INCX AND INCY\n*  3                 NUMBER OF VALUES OF ALPHA\n*  0.0 1.0 0.7       VALUES OF ALPHA\n*  3                 NUMBER OF VALUES OF BETA\n*  0.0 1.0 0.9       VALUES OF BETA\n*  SGEMV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  SGBMV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  SSYMV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  SSBMV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  SSPMV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  STRMV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  STBMV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  STPMV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  STRSV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  STBSV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  STPSV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  SGER   T PUT F FOR NO TEST. SAME COLUMNS.\n*  SSYR   T PUT F FOR NO TEST. SAME COLUMNS.\n*  SSPR   T PUT F FOR NO TEST. SAME COLUMNS.\n*  SSYR2  T PUT F FOR NO TEST. SAME COLUMNS.\n*  SSPR2  T PUT F FOR NO TEST. SAME COLUMNS.\n*\n*     See:\n*\n*        Dongarra J. J., Du Croz J. J., Hammarling S.  and Hanson R. J..\n*        An  extended  set of Fortran  Basic Linear Algebra Subprograms.\n*\n*        Technical  Memoranda  Nos. 41 (revision 3) and 81,  Mathematics\n*        and  Computer Science  Division,  Argonne  National Laboratory,\n*        9700 South Cass Avenue, Argonne, Illinois 60439, US.\n*\n*        Or\n*\n*        NAG  Technical Reports TR3/87 and TR4/87,  Numerical Algorithms\n*        Group  Ltd.,  NAG  Central  Office,  256  Banbury  Road, Oxford\n*        OX2 7DE, UK,  and  Numerical Algorithms Group Inc.,  1101  31st\n*        Street,  Suite 100,  Downers Grove,  Illinois 60515-1263,  USA.\n*\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Parameters ..\n      INTEGER            NIN\n      PARAMETER          ( NIN = 5 )\n      INTEGER            NSUBS\n      PARAMETER          ( NSUBS = 16 )\n      REAL               ZERO, HALF, ONE\n      PARAMETER          ( ZERO = 0.0, HALF = 0.5, ONE = 1.0 )\n      INTEGER            NMAX, INCMAX\n      PARAMETER          ( NMAX = 65, INCMAX = 2 )\n      INTEGER            NINMAX, NIDMAX, NKBMAX, NALMAX, NBEMAX\n      PARAMETER          ( NINMAX = 7, NIDMAX = 9, NKBMAX = 7,\n     $                   NALMAX = 7, NBEMAX = 7 )\n*     .. Local Scalars ..\n      REAL               EPS, ERR, THRESH\n      INTEGER            I, ISNUM, J, N, NALF, NBET, NIDIM, NINC, NKB,\n     $                   NOUT, NTRA\n      LOGICAL            FATAL, LTESTT, REWI, SAME, SFATAL, TRACE,\n     $                   TSTERR\n      CHARACTER*1        TRANS\n      CHARACTER*6        SNAMET\n      CHARACTER*32       SNAPS, SUMMRY\n*     .. Local Arrays ..\n      REAL               A( NMAX, NMAX ), AA( NMAX*NMAX ),\n     $                   ALF( NALMAX ), AS( NMAX*NMAX ), BET( NBEMAX ),\n     $                   G( NMAX ), X( NMAX ), XS( NMAX*INCMAX ),\n     $                   XX( NMAX*INCMAX ), Y( NMAX ),\n     $                   YS( NMAX*INCMAX ), YT( NMAX ),\n     $                   YY( NMAX*INCMAX ), Z( 2*NMAX )\n      INTEGER            IDIM( NIDMAX ), INC( NINMAX ), KB( NKBMAX )\n      LOGICAL            LTEST( NSUBS )\n      CHARACTER*6        SNAMES( NSUBS )\n*     .. External Functions ..\n      REAL               SDIFF\n      LOGICAL            LSE\n      EXTERNAL           SDIFF, LSE\n*     .. External Subroutines ..\n      EXTERNAL           SCHK1, SCHK2, SCHK3, SCHK4, SCHK5, SCHK6,\n     $                   SCHKE, SMVCH\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, MAX, MIN\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n      CHARACTER*6        SRNAMT\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n      COMMON             /SRNAMC/SRNAMT\n*     .. Data statements ..\n      DATA               SNAMES/'SGEMV ', 'SGBMV ', 'SSYMV ', 'SSBMV ',\n     $                   'SSPMV ', 'STRMV ', 'STBMV ', 'STPMV ',\n     $                   'STRSV ', 'STBSV ', 'STPSV ', 'SGER  ',\n     $                   'SSYR  ', 'SSPR  ', 'SSYR2 ', 'SSPR2 '/\n*     .. Executable Statements ..\n*\n*     Read name and unit number for summary output file and open file.\n*\n      READ( NIN, FMT = * )SUMMRY\n      READ( NIN, FMT = * )NOUT\n      OPEN( NOUT, FILE = SUMMRY, STATUS = 'NEW' )\n      NOUTC = NOUT\n*\n*     Read name and unit number for snapshot output file and open file.\n*\n      READ( NIN, FMT = * )SNAPS\n      READ( NIN, FMT = * )NTRA\n      TRACE = NTRA.GE.0\n      IF( TRACE )THEN\n         OPEN( NTRA, FILE = SNAPS, STATUS = 'NEW' )\n      END IF\n*     Read the flag that directs rewinding of the snapshot file.\n      READ( NIN, FMT = * )REWI\n      REWI = REWI.AND.TRACE\n*     Read the flag that directs stopping on any failure.\n      READ( NIN, FMT = * )SFATAL\n*     Read the flag that indicates whether error exits are to be tested.\n      READ( NIN, FMT = * )TSTERR\n*     Read the threshold value of the test ratio\n      READ( NIN, FMT = * )THRESH\n*\n*     Read and check the parameter values for the tests.\n*\n*     Values of N\n      READ( NIN, FMT = * )NIDIM\n      IF( NIDIM.LT.1.OR.NIDIM.GT.NIDMAX )THEN\n         WRITE( NOUT, FMT = 9997 )'N', NIDMAX\n         GO TO 230\n      END IF\n      READ( NIN, FMT = * )( IDIM( I ), I = 1, NIDIM )\n      DO 10 I = 1, NIDIM\n         IF( IDIM( I ).LT.0.OR.IDIM( I ).GT.NMAX )THEN\n            WRITE( NOUT, FMT = 9996 )NMAX\n            GO TO 230\n         END IF\n   10 CONTINUE\n*     Values of K\n      READ( NIN, FMT = * )NKB\n      IF( NKB.LT.1.OR.NKB.GT.NKBMAX )THEN\n         WRITE( NOUT, FMT = 9997 )'K', NKBMAX\n         GO TO 230\n      END IF\n      READ( NIN, FMT = * )( KB( I ), I = 1, NKB )\n      DO 20 I = 1, NKB\n         IF( KB( I ).LT.0 )THEN\n            WRITE( NOUT, FMT = 9995 )\n            GO TO 230\n         END IF\n   20 CONTINUE\n*     Values of INCX and INCY\n      READ( NIN, FMT = * )NINC\n      IF( NINC.LT.1.OR.NINC.GT.NINMAX )THEN\n         WRITE( NOUT, FMT = 9997 )'INCX AND INCY', NINMAX\n         GO TO 230\n      END IF\n      READ( NIN, FMT = * )( INC( I ), I = 1, NINC )\n      DO 30 I = 1, NINC\n         IF( INC( I ).EQ.0.OR.ABS( INC( I ) ).GT.INCMAX )THEN\n            WRITE( NOUT, FMT = 9994 )INCMAX\n            GO TO 230\n         END IF\n   30 CONTINUE\n*     Values of ALPHA\n      READ( NIN, FMT = * )NALF\n      IF( NALF.LT.1.OR.NALF.GT.NALMAX )THEN\n         WRITE( NOUT, FMT = 9997 )'ALPHA', NALMAX\n         GO TO 230\n      END IF\n      READ( NIN, FMT = * )( ALF( I ), I = 1, NALF )\n*     Values of BETA\n      READ( NIN, FMT = * )NBET\n      IF( NBET.LT.1.OR.NBET.GT.NBEMAX )THEN\n         WRITE( NOUT, FMT = 9997 )'BETA', NBEMAX\n         GO TO 230\n      END IF\n      READ( NIN, FMT = * )( BET( I ), I = 1, NBET )\n*\n*     Report values of parameters.\n*\n      WRITE( NOUT, FMT = 9993 )\n      WRITE( NOUT, FMT = 9992 )( IDIM( I ), I = 1, NIDIM )\n      WRITE( NOUT, FMT = 9991 )( KB( I ), I = 1, NKB )\n      WRITE( NOUT, FMT = 9990 )( INC( I ), I = 1, NINC )\n      WRITE( NOUT, FMT = 9989 )( ALF( I ), I = 1, NALF )\n      WRITE( NOUT, FMT = 9988 )( BET( I ), I = 1, NBET )\n      IF( .NOT.TSTERR )THEN\n         WRITE( NOUT, FMT = * )\n         WRITE( NOUT, FMT = 9980 )\n      END IF\n      WRITE( NOUT, FMT = * )\n      WRITE( NOUT, FMT = 9999 )THRESH\n      WRITE( NOUT, FMT = * )\n*\n*     Read names of subroutines and flags which indicate\n*     whether they are to be tested.\n*\n      DO 40 I = 1, NSUBS\n         LTEST( I ) = .FALSE.\n   40 CONTINUE\n   50 READ( NIN, FMT = 9984, END = 80 )SNAMET, LTESTT\n      DO 60 I = 1, NSUBS\n         IF( SNAMET.EQ.SNAMES( I ) )\n     $      GO TO 70\n   60 CONTINUE\n      WRITE( NOUT, FMT = 9986 )SNAMET\n      STOP\n   70 LTEST( I ) = LTESTT\n      GO TO 50\n*\n   80 CONTINUE\n      CLOSE ( NIN )\n*\n*     Compute EPS (the machine precision).\n*\n      EPS = ONE\n   90 CONTINUE\n      IF( SDIFF( ONE + EPS, ONE ).EQ.ZERO )\n     $   GO TO 100\n      EPS = HALF*EPS\n      GO TO 90\n  100 CONTINUE\n      EPS = EPS + EPS\n      WRITE( NOUT, FMT = 9998 )EPS\n*\n*     Check the reliability of SMVCH using exact data.\n*\n      N = MIN( 32, NMAX )\n      DO 120 J = 1, N\n         DO 110 I = 1, N\n            A( I, J ) = MAX( I - J + 1, 0 )\n  110    CONTINUE\n         X( J ) = J\n         Y( J ) = ZERO\n  120 CONTINUE\n      DO 130 J = 1, N\n         YY( J ) = J*( ( J + 1 )*J )/2 - ( ( J + 1 )*J*( J - 1 ) )/3\n  130 CONTINUE\n*     YY holds the exact result. On exit from SMVCH YT holds\n*     the result computed by SMVCH.\n      TRANS = 'N'\n      CALL SMVCH( TRANS, N, N, ONE, A, NMAX, X, 1, ZERO, Y, 1, YT, G,\n     $            YY, EPS, ERR, FATAL, NOUT, .TRUE. )\n      SAME = LSE( YY, YT, N )\n      IF( .NOT.SAME.OR.ERR.NE.ZERO )THEN\n         WRITE( NOUT, FMT = 9985 )TRANS, SAME, ERR\n         STOP\n      END IF\n      TRANS = 'T'\n      CALL SMVCH( TRANS, N, N, ONE, A, NMAX, X, -1, ZERO, Y, -1, YT, G,\n     $            YY, EPS, ERR, FATAL, NOUT, .TRUE. )\n      SAME = LSE( YY, YT, N )\n      IF( .NOT.SAME.OR.ERR.NE.ZERO )THEN\n         WRITE( NOUT, FMT = 9985 )TRANS, SAME, ERR\n         STOP\n      END IF\n*\n*     Test each subroutine in turn.\n*\n      DO 210 ISNUM = 1, NSUBS\n         WRITE( NOUT, FMT = * )\n         IF( .NOT.LTEST( ISNUM ) )THEN\n*           Subprogram is not to be tested.\n            WRITE( NOUT, FMT = 9983 )SNAMES( ISNUM )\n         ELSE\n            SRNAMT = SNAMES( ISNUM )\n*           Test error exits.\n            IF( TSTERR )THEN\n               CALL SCHKE( ISNUM, SNAMES( ISNUM ), NOUT )\n               WRITE( NOUT, FMT = * )\n            END IF\n*           Test computations.\n            INFOT = 0\n            OK = .TRUE.\n            FATAL = .FALSE.\n            GO TO ( 140, 140, 150, 150, 150, 160, 160,\n     $              160, 160, 160, 160, 170, 180, 180,\n     $              190, 190 )ISNUM\n*           Test SGEMV, 01, and SGBMV, 02.\n  140       CALL SCHK1( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF,\n     $                  NBET, BET, NINC, INC, NMAX, INCMAX, A, AA, AS,\n     $                  X, XX, XS, Y, YY, YS, YT, G )\n            GO TO 200\n*           Test SSYMV, 03, SSBMV, 04, and SSPMV, 05.\n  150       CALL SCHK2( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF,\n     $                  NBET, BET, NINC, INC, NMAX, INCMAX, A, AA, AS,\n     $                  X, XX, XS, Y, YY, YS, YT, G )\n            GO TO 200\n*           Test STRMV, 06, STBMV, 07, STPMV, 08,\n*           STRSV, 09, STBSV, 10, and STPSV, 11.\n  160       CALL SCHK3( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NKB, KB, NINC, INC,\n     $                  NMAX, INCMAX, A, AA, AS, Y, YY, YS, YT, G, Z )\n            GO TO 200\n*           Test SGER, 12.\n  170       CALL SCHK4( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC,\n     $                  NMAX, INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS,\n     $                  YT, G, Z )\n            GO TO 200\n*           Test SSYR, 13, and SSPR, 14.\n  180       CALL SCHK5( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC,\n     $                  NMAX, INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS,\n     $                  YT, G, Z )\n            GO TO 200\n*           Test SSYR2, 15, and SSPR2, 16.\n  190       CALL SCHK6( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC,\n     $                  NMAX, INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS,\n     $                  YT, G, Z )\n*\n  200       IF( FATAL.AND.SFATAL )\n     $         GO TO 220\n         END IF\n  210 CONTINUE\n      WRITE( NOUT, FMT = 9982 )\n      GO TO 240\n*\n  220 CONTINUE\n      WRITE( NOUT, FMT = 9981 )\n      GO TO 240\n*\n  230 CONTINUE\n      WRITE( NOUT, FMT = 9987 )\n*\n  240 CONTINUE\n      IF( TRACE )\n     $   CLOSE ( NTRA )\n      CLOSE ( NOUT )\n      STOP\n*\n 9999 FORMAT( ' ROUTINES PASS COMPUTATIONAL TESTS IF TEST RATIO IS LES',\n     $      'S THAN', F8.2 )\n 9998 FORMAT( ' RELATIVE MACHINE PRECISION IS TAKEN TO BE', 1P, E9.1 )\n 9997 FORMAT( ' NUMBER OF VALUES OF ', A, ' IS LESS THAN 1 OR GREATER ',\n     $      'THAN ', I2 )\n 9996 FORMAT( ' VALUE OF N IS LESS THAN 0 OR GREATER THAN ', I2 )\n 9995 FORMAT( ' VALUE OF K IS LESS THAN 0' )\n 9994 FORMAT( ' ABSOLUTE VALUE OF INCX OR INCY IS 0 OR GREATER THAN ',\n     $      I2 )\n 9993 FORMAT( ' TESTS OF THE REAL             LEVEL 2 BLAS', //' THE F',\n     $      'OLLOWING PARAMETER VALUES WILL BE USED:' )\n 9992 FORMAT( '   FOR N              ', 9I6 )\n 9991 FORMAT( '   FOR K              ', 7I6 )\n 9990 FORMAT( '   FOR INCX AND INCY  ', 7I6 )\n 9989 FORMAT( '   FOR ALPHA          ', 7F6.1 )\n 9988 FORMAT( '   FOR BETA           ', 7F6.1 )\n 9987 FORMAT( ' AMEND DATA FILE OR INCREASE ARRAY SIZES IN PROGRAM',\n     $      /' ******* TESTS ABANDONED *******' )\n 9986 FORMAT( ' SUBPROGRAM NAME ', A6, ' NOT RECOGNIZED', /' ******* T',\n     $      'ESTS ABANDONED *******' )\n 9985 FORMAT( ' ERROR IN SMVCH -  IN-LINE DOT PRODUCTS ARE BEING EVALU',\n     $      'ATED WRONGLY.', /' SMVCH WAS CALLED WITH TRANS = ', A1,\n     $      ' AND RETURNED SAME = ', L1, ' AND ERR = ', F12.3, '.', /\n     $   ' THIS MAY BE DUE TO FAULTS IN THE ARITHMETIC OR THE COMPILER.'\n     $      , /' ******* TESTS ABANDONED *******' )\n 9984 FORMAT( A6, L2 )\n 9983 FORMAT( 1X, A6, ' WAS NOT TESTED' )\n 9982 FORMAT( /' END OF TESTS' )\n 9981 FORMAT( /' ******* FATAL ERROR - TESTS ABANDONED *******' )\n 9980 FORMAT( ' ERROR-EXITS WILL NOT BE TESTED' )\n*\n*     End of SBLAT2.\n*\n      END\n      SUBROUTINE SCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF, NBET,\n     $                  BET, NINC, INC, NMAX, INCMAX, A, AA, AS, X, XX,\n     $                  XS, Y, YY, YS, YT, G )\n*\n*  Tests SGEMV and SGBMV.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Parameters ..\n      REAL               ZERO, HALF\n      PARAMETER          ( ZERO = 0.0, HALF = 0.5 )\n*     .. Scalar Arguments ..\n      REAL               EPS, THRESH\n      INTEGER            INCMAX, NALF, NBET, NIDIM, NINC, NKB, NMAX,\n     $                   NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      REAL               A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),\n     $                   AS( NMAX*NMAX ), BET( NBET ), G( NMAX ),\n     $                   X( NMAX ), XS( NMAX*INCMAX ),\n     $                   XX( NMAX*INCMAX ), Y( NMAX ),\n     $                   YS( NMAX*INCMAX ), YT( NMAX ),\n     $                   YY( NMAX*INCMAX )\n      INTEGER            IDIM( NIDIM ), INC( NINC ), KB( NKB )\n*     .. Local Scalars ..\n      REAL               ALPHA, ALS, BETA, BLS, ERR, ERRMAX, TRANSL\n      INTEGER            I, IA, IB, IC, IKU, IM, IN, INCX, INCXS, INCY,\n     $                   INCYS, IX, IY, KL, KLS, KU, KUS, LAA, LDA,\n     $                   LDAS, LX, LY, M, ML, MS, N, NARGS, NC, ND, NK,\n     $                   NL, NS\n      LOGICAL            BANDED, FULL, NULL, RESET, SAME, TRAN\n      CHARACTER*1        TRANS, TRANSS\n      CHARACTER*3        ICH\n*     .. Local Arrays ..\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LSE, LSERES\n      EXTERNAL           LSE, LSERES\n*     .. External Subroutines ..\n      EXTERNAL           SGBMV, SGEMV, SMAKE, SMVCH\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, MAX, MIN\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Data statements ..\n      DATA               ICH/'NTC'/\n*     .. Executable Statements ..\n      FULL = SNAME( 3: 3 ).EQ.'E'\n      BANDED = SNAME( 3: 3 ).EQ.'B'\n*     Define the number of arguments.\n      IF( FULL )THEN\n         NARGS = 11\n      ELSE IF( BANDED )THEN\n         NARGS = 13\n      END IF\n*\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = ZERO\n*\n      DO 120 IN = 1, NIDIM\n         N = IDIM( IN )\n         ND = N/2 + 1\n*\n         DO 110 IM = 1, 2\n            IF( IM.EQ.1 )\n     $         M = MAX( N - ND, 0 )\n            IF( IM.EQ.2 )\n     $         M = MIN( N + ND, NMAX )\n*\n            IF( BANDED )THEN\n               NK = NKB\n            ELSE\n               NK = 1\n            END IF\n            DO 100 IKU = 1, NK\n               IF( BANDED )THEN\n                  KU = KB( IKU )\n                  KL = MAX( KU - 1, 0 )\n               ELSE\n                  KU = N - 1\n                  KL = M - 1\n               END IF\n*              Set LDA to 1 more than minimum value if room.\n               IF( BANDED )THEN\n                  LDA = KL + KU + 1\n               ELSE\n                  LDA = M\n               END IF\n               IF( LDA.LT.NMAX )\n     $            LDA = LDA + 1\n*              Skip tests if not enough room.\n               IF( LDA.GT.NMAX )\n     $            GO TO 100\n               LAA = LDA*N\n               NULL = N.LE.0.OR.M.LE.0\n*\n*              Generate the matrix A.\n*\n               TRANSL = ZERO\n               CALL SMAKE( SNAME( 2: 3 ), ' ', ' ', M, N, A, NMAX, AA,\n     $                     LDA, KL, KU, RESET, TRANSL )\n*\n               DO 90 IC = 1, 3\n                  TRANS = ICH( IC: IC )\n                  TRAN = TRANS.EQ.'T'.OR.TRANS.EQ.'C'\n*\n                  IF( TRAN )THEN\n                     ML = N\n                     NL = M\n                  ELSE\n                     ML = M\n                     NL = N\n                  END IF\n*\n                  DO 80 IX = 1, NINC\n                     INCX = INC( IX )\n                     LX = ABS( INCX )*NL\n*\n*                    Generate the vector X.\n*\n                     TRANSL = HALF\n                     CALL SMAKE( 'GE', ' ', ' ', 1, NL, X, 1, XX,\n     $                           ABS( INCX ), 0, NL - 1, RESET, TRANSL )\n                     IF( NL.GT.1 )THEN\n                        X( NL/2 ) = ZERO\n                        XX( 1 + ABS( INCX )*( NL/2 - 1 ) ) = ZERO\n                     END IF\n*\n                     DO 70 IY = 1, NINC\n                        INCY = INC( IY )\n                        LY = ABS( INCY )*ML\n*\n                        DO 60 IA = 1, NALF\n                           ALPHA = ALF( IA )\n*\n                           DO 50 IB = 1, NBET\n                              BETA = BET( IB )\n*\n*                             Generate the vector Y.\n*\n                              TRANSL = ZERO\n                              CALL SMAKE( 'GE', ' ', ' ', 1, ML, Y, 1,\n     $                                    YY, ABS( INCY ), 0, ML - 1,\n     $                                    RESET, TRANSL )\n*\n                              NC = NC + 1\n*\n*                             Save every datum before calling the\n*                             subroutine.\n*\n                              TRANSS = TRANS\n                              MS = M\n                              NS = N\n                              KLS = KL\n                              KUS = KU\n                              ALS = ALPHA\n                              DO 10 I = 1, LAA\n                                 AS( I ) = AA( I )\n   10                         CONTINUE\n                              LDAS = LDA\n                              DO 20 I = 1, LX\n                                 XS( I ) = XX( I )\n   20                         CONTINUE\n                              INCXS = INCX\n                              BLS = BETA\n                              DO 30 I = 1, LY\n                                 YS( I ) = YY( I )\n   30                         CONTINUE\n                              INCYS = INCY\n*\n*                             Call the subroutine.\n*\n                              IF( FULL )THEN\n                                 IF( TRACE )\n     $                              WRITE( NTRA, FMT = 9994 )NC, SNAME,\n     $                              TRANS, M, N, ALPHA, LDA, INCX, BETA,\n     $                              INCY\n                                 IF( REWI )\n     $                              REWIND NTRA\n                                 CALL SGEMV( TRANS, M, N, ALPHA, AA,\n     $                                       LDA, XX, INCX, BETA, YY,\n     $                                       INCY )\n                              ELSE IF( BANDED )THEN\n                                 IF( TRACE )\n     $                              WRITE( NTRA, FMT = 9995 )NC, SNAME,\n     $                              TRANS, M, N, KL, KU, ALPHA, LDA,\n     $                              INCX, BETA, INCY\n                                 IF( REWI )\n     $                              REWIND NTRA\n                                 CALL SGBMV( TRANS, M, N, KL, KU, ALPHA,\n     $                                       AA, LDA, XX, INCX, BETA,\n     $                                       YY, INCY )\n                              END IF\n*\n*                             Check if error-exit was taken incorrectly.\n*\n                              IF( .NOT.OK )THEN\n                                 WRITE( NOUT, FMT = 9993 )\n                                 FATAL = .TRUE.\n                                 GO TO 130\n                              END IF\n*\n*                             See what data changed inside subroutines.\n*\n                              ISAME( 1 ) = TRANS.EQ.TRANSS\n                              ISAME( 2 ) = MS.EQ.M\n                              ISAME( 3 ) = NS.EQ.N\n                              IF( FULL )THEN\n                                 ISAME( 4 ) = ALS.EQ.ALPHA\n                                 ISAME( 5 ) = LSE( AS, AA, LAA )\n                                 ISAME( 6 ) = LDAS.EQ.LDA\n                                 ISAME( 7 ) = LSE( XS, XX, LX )\n                                 ISAME( 8 ) = INCXS.EQ.INCX\n                                 ISAME( 9 ) = BLS.EQ.BETA\n                                 IF( NULL )THEN\n                                    ISAME( 10 ) = LSE( YS, YY, LY )\n                                 ELSE\n                                    ISAME( 10 ) = LSERES( 'GE', ' ', 1,\n     $                                            ML, YS, YY,\n     $                                            ABS( INCY ) )\n                                 END IF\n                                 ISAME( 11 ) = INCYS.EQ.INCY\n                              ELSE IF( BANDED )THEN\n                                 ISAME( 4 ) = KLS.EQ.KL\n                                 ISAME( 5 ) = KUS.EQ.KU\n                                 ISAME( 6 ) = ALS.EQ.ALPHA\n                                 ISAME( 7 ) = LSE( AS, AA, LAA )\n                                 ISAME( 8 ) = LDAS.EQ.LDA\n                                 ISAME( 9 ) = LSE( XS, XX, LX )\n                                 ISAME( 10 ) = INCXS.EQ.INCX\n                                 ISAME( 11 ) = BLS.EQ.BETA\n                                 IF( NULL )THEN\n                                    ISAME( 12 ) = LSE( YS, YY, LY )\n                                 ELSE\n                                    ISAME( 12 ) = LSERES( 'GE', ' ', 1,\n     $                                            ML, YS, YY,\n     $                                            ABS( INCY ) )\n                                 END IF\n                                 ISAME( 13 ) = INCYS.EQ.INCY\n                              END IF\n*\n*                             If data was incorrectly changed, report\n*                             and return.\n*\n                              SAME = .TRUE.\n                              DO 40 I = 1, NARGS\n                                 SAME = SAME.AND.ISAME( I )\n                                 IF( .NOT.ISAME( I ) )\n     $                              WRITE( NOUT, FMT = 9998 )I\n   40                         CONTINUE\n                              IF( .NOT.SAME )THEN\n                                 FATAL = .TRUE.\n                                 GO TO 130\n                              END IF\n*\n                              IF( .NOT.NULL )THEN\n*\n*                                Check the result.\n*\n                                 CALL SMVCH( TRANS, M, N, ALPHA, A,\n     $                                       NMAX, X, INCX, BETA, Y,\n     $                                       INCY, YT, G, YY, EPS, ERR,\n     $                                       FATAL, NOUT, .TRUE. )\n                                 ERRMAX = MAX( ERRMAX, ERR )\n*                                If got really bad answer, report and\n*                                return.\n                                 IF( FATAL )\n     $                              GO TO 130\n                              ELSE\n*                                Avoid repeating tests with M.le.0 or\n*                                N.le.0.\n                                 GO TO 110\n                              END IF\n*\n   50                      CONTINUE\n*\n   60                   CONTINUE\n*\n   70                CONTINUE\n*\n   80             CONTINUE\n*\n   90          CONTINUE\n*\n  100       CONTINUE\n*\n  110    CONTINUE\n*\n  120 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 140\n*\n  130 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      IF( FULL )THEN\n         WRITE( NOUT, FMT = 9994 )NC, SNAME, TRANS, M, N, ALPHA, LDA,\n     $      INCX, BETA, INCY\n      ELSE IF( BANDED )THEN\n         WRITE( NOUT, FMT = 9995 )NC, SNAME, TRANS, M, N, KL, KU,\n     $      ALPHA, LDA, INCX, BETA, INCY\n      END IF\n*\n  140 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', 4( I3, ',' ), F4.1,\n     $      ', A,', I3, ', X,', I2, ',', F4.1, ', Y,', I2, ') .' )\n 9994 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', 2( I3, ',' ), F4.1,\n     $      ', A,', I3, ', X,', I2, ',', F4.1, ', Y,', I2,\n     $      ')         .' )\n 9993 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of SCHK1.\n*\n      END\n      SUBROUTINE SCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF, NBET,\n     $                  BET, NINC, INC, NMAX, INCMAX, A, AA, AS, X, XX,\n     $                  XS, Y, YY, YS, YT, G )\n*\n*  Tests SSYMV, SSBMV and SSPMV.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Parameters ..\n      REAL               ZERO, HALF\n      PARAMETER          ( ZERO = 0.0, HALF = 0.5 )\n*     .. Scalar Arguments ..\n      REAL               EPS, THRESH\n      INTEGER            INCMAX, NALF, NBET, NIDIM, NINC, NKB, NMAX,\n     $                   NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      REAL               A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),\n     $                   AS( NMAX*NMAX ), BET( NBET ), G( NMAX ),\n     $                   X( NMAX ), XS( NMAX*INCMAX ),\n     $                   XX( NMAX*INCMAX ), Y( NMAX ),\n     $                   YS( NMAX*INCMAX ), YT( NMAX ),\n     $                   YY( NMAX*INCMAX )\n      INTEGER            IDIM( NIDIM ), INC( NINC ), KB( NKB )\n*     .. Local Scalars ..\n      REAL               ALPHA, ALS, BETA, BLS, ERR, ERRMAX, TRANSL\n      INTEGER            I, IA, IB, IC, IK, IN, INCX, INCXS, INCY,\n     $                   INCYS, IX, IY, K, KS, LAA, LDA, LDAS, LX, LY,\n     $                   N, NARGS, NC, NK, NS\n      LOGICAL            BANDED, FULL, NULL, PACKED, RESET, SAME\n      CHARACTER*1        UPLO, UPLOS\n      CHARACTER*2        ICH\n*     .. Local Arrays ..\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LSE, LSERES\n      EXTERNAL           LSE, LSERES\n*     .. External Subroutines ..\n      EXTERNAL           SMAKE, SMVCH, SSBMV, SSPMV, SSYMV\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, MAX\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Data statements ..\n      DATA               ICH/'UL'/\n*     .. Executable Statements ..\n      FULL = SNAME( 3: 3 ).EQ.'Y'\n      BANDED = SNAME( 3: 3 ).EQ.'B'\n      PACKED = SNAME( 3: 3 ).EQ.'P'\n*     Define the number of arguments.\n      IF( FULL )THEN\n         NARGS = 10\n      ELSE IF( BANDED )THEN\n         NARGS = 11\n      ELSE IF( PACKED )THEN\n         NARGS = 9\n      END IF\n*\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = ZERO\n*\n      DO 110 IN = 1, NIDIM\n         N = IDIM( IN )\n*\n         IF( BANDED )THEN\n            NK = NKB\n         ELSE\n            NK = 1\n         END IF\n         DO 100 IK = 1, NK\n            IF( BANDED )THEN\n               K = KB( IK )\n            ELSE\n               K = N - 1\n            END IF\n*           Set LDA to 1 more than minimum value if room.\n            IF( BANDED )THEN\n               LDA = K + 1\n            ELSE\n               LDA = N\n            END IF\n            IF( LDA.LT.NMAX )\n     $         LDA = LDA + 1\n*           Skip tests if not enough room.\n            IF( LDA.GT.NMAX )\n     $         GO TO 100\n            IF( PACKED )THEN\n               LAA = ( N*( N + 1 ) )/2\n            ELSE\n               LAA = LDA*N\n            END IF\n            NULL = N.LE.0\n*\n            DO 90 IC = 1, 2\n               UPLO = ICH( IC: IC )\n*\n*              Generate the matrix A.\n*\n               TRANSL = ZERO\n               CALL SMAKE( SNAME( 2: 3 ), UPLO, ' ', N, N, A, NMAX, AA,\n     $                     LDA, K, K, RESET, TRANSL )\n*\n               DO 80 IX = 1, NINC\n                  INCX = INC( IX )\n                  LX = ABS( INCX )*N\n*\n*                 Generate the vector X.\n*\n                  TRANSL = HALF\n                  CALL SMAKE( 'GE', ' ', ' ', 1, N, X, 1, XX,\n     $                        ABS( INCX ), 0, N - 1, RESET, TRANSL )\n                  IF( N.GT.1 )THEN\n                     X( N/2 ) = ZERO\n                     XX( 1 + ABS( INCX )*( N/2 - 1 ) ) = ZERO\n                  END IF\n*\n                  DO 70 IY = 1, NINC\n                     INCY = INC( IY )\n                     LY = ABS( INCY )*N\n*\n                     DO 60 IA = 1, NALF\n                        ALPHA = ALF( IA )\n*\n                        DO 50 IB = 1, NBET\n                           BETA = BET( IB )\n*\n*                          Generate the vector Y.\n*\n                           TRANSL = ZERO\n                           CALL SMAKE( 'GE', ' ', ' ', 1, N, Y, 1, YY,\n     $                                 ABS( INCY ), 0, N - 1, RESET,\n     $                                 TRANSL )\n*\n                           NC = NC + 1\n*\n*                          Save every datum before calling the\n*                          subroutine.\n*\n                           UPLOS = UPLO\n                           NS = N\n                           KS = K\n                           ALS = ALPHA\n                           DO 10 I = 1, LAA\n                              AS( I ) = AA( I )\n   10                      CONTINUE\n                           LDAS = LDA\n                           DO 20 I = 1, LX\n                              XS( I ) = XX( I )\n   20                      CONTINUE\n                           INCXS = INCX\n                           BLS = BETA\n                           DO 30 I = 1, LY\n                              YS( I ) = YY( I )\n   30                      CONTINUE\n                           INCYS = INCY\n*\n*                          Call the subroutine.\n*\n                           IF( FULL )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9993 )NC, SNAME,\n     $                           UPLO, N, ALPHA, LDA, INCX, BETA, INCY\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL SSYMV( UPLO, N, ALPHA, AA, LDA, XX,\n     $                                    INCX, BETA, YY, INCY )\n                           ELSE IF( BANDED )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9994 )NC, SNAME,\n     $                           UPLO, N, K, ALPHA, LDA, INCX, BETA,\n     $                           INCY\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL SSBMV( UPLO, N, K, ALPHA, AA, LDA,\n     $                                    XX, INCX, BETA, YY, INCY )\n                           ELSE IF( PACKED )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9995 )NC, SNAME,\n     $                           UPLO, N, ALPHA, INCX, BETA, INCY\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL SSPMV( UPLO, N, ALPHA, AA, XX, INCX,\n     $                                    BETA, YY, INCY )\n                           END IF\n*\n*                          Check if error-exit was taken incorrectly.\n*\n                           IF( .NOT.OK )THEN\n                              WRITE( NOUT, FMT = 9992 )\n                              FATAL = .TRUE.\n                              GO TO 120\n                           END IF\n*\n*                          See what data changed inside subroutines.\n*\n                           ISAME( 1 ) = UPLO.EQ.UPLOS\n                           ISAME( 2 ) = NS.EQ.N\n                           IF( FULL )THEN\n                              ISAME( 3 ) = ALS.EQ.ALPHA\n                              ISAME( 4 ) = LSE( AS, AA, LAA )\n                              ISAME( 5 ) = LDAS.EQ.LDA\n                              ISAME( 6 ) = LSE( XS, XX, LX )\n                              ISAME( 7 ) = INCXS.EQ.INCX\n                              ISAME( 8 ) = BLS.EQ.BETA\n                              IF( NULL )THEN\n                                 ISAME( 9 ) = LSE( YS, YY, LY )\n                              ELSE\n                                 ISAME( 9 ) = LSERES( 'GE', ' ', 1, N,\n     $                                        YS, YY, ABS( INCY ) )\n                              END IF\n                              ISAME( 10 ) = INCYS.EQ.INCY\n                           ELSE IF( BANDED )THEN\n                              ISAME( 3 ) = KS.EQ.K\n                              ISAME( 4 ) = ALS.EQ.ALPHA\n                              ISAME( 5 ) = LSE( AS, AA, LAA )\n                              ISAME( 6 ) = LDAS.EQ.LDA\n                              ISAME( 7 ) = LSE( XS, XX, LX )\n                              ISAME( 8 ) = INCXS.EQ.INCX\n                              ISAME( 9 ) = BLS.EQ.BETA\n                              IF( NULL )THEN\n                                 ISAME( 10 ) = LSE( YS, YY, LY )\n                              ELSE\n                                 ISAME( 10 ) = LSERES( 'GE', ' ', 1, N,\n     $                                         YS, YY, ABS( INCY ) )\n                              END IF\n                              ISAME( 11 ) = INCYS.EQ.INCY\n                           ELSE IF( PACKED )THEN\n                              ISAME( 3 ) = ALS.EQ.ALPHA\n                              ISAME( 4 ) = LSE( AS, AA, LAA )\n                              ISAME( 5 ) = LSE( XS, XX, LX )\n                              ISAME( 6 ) = INCXS.EQ.INCX\n                              ISAME( 7 ) = BLS.EQ.BETA\n                              IF( NULL )THEN\n                                 ISAME( 8 ) = LSE( YS, YY, LY )\n                              ELSE\n                                 ISAME( 8 ) = LSERES( 'GE', ' ', 1, N,\n     $                                        YS, YY, ABS( INCY ) )\n                              END IF\n                              ISAME( 9 ) = INCYS.EQ.INCY\n                           END IF\n*\n*                          If data was incorrectly changed, report and\n*                          return.\n*\n                           SAME = .TRUE.\n                           DO 40 I = 1, NARGS\n                              SAME = SAME.AND.ISAME( I )\n                              IF( .NOT.ISAME( I ) )\n     $                           WRITE( NOUT, FMT = 9998 )I\n   40                      CONTINUE\n                           IF( .NOT.SAME )THEN\n                              FATAL = .TRUE.\n                              GO TO 120\n                           END IF\n*\n                           IF( .NOT.NULL )THEN\n*\n*                             Check the result.\n*\n                              CALL SMVCH( 'N', N, N, ALPHA, A, NMAX, X,\n     $                                    INCX, BETA, Y, INCY, YT, G,\n     $                                    YY, EPS, ERR, FATAL, NOUT,\n     $                                    .TRUE. )\n                              ERRMAX = MAX( ERRMAX, ERR )\n*                             If got really bad answer, report and\n*                             return.\n                              IF( FATAL )\n     $                           GO TO 120\n                           ELSE\n*                             Avoid repeating tests with N.le.0\n                              GO TO 110\n                           END IF\n*\n   50                   CONTINUE\n*\n   60                CONTINUE\n*\n   70             CONTINUE\n*\n   80          CONTINUE\n*\n   90       CONTINUE\n*\n  100    CONTINUE\n*\n  110 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 130\n*\n  120 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      IF( FULL )THEN\n         WRITE( NOUT, FMT = 9993 )NC, SNAME, UPLO, N, ALPHA, LDA, INCX,\n     $      BETA, INCY\n      ELSE IF( BANDED )THEN\n         WRITE( NOUT, FMT = 9994 )NC, SNAME, UPLO, N, K, ALPHA, LDA,\n     $      INCX, BETA, INCY\n      ELSE IF( PACKED )THEN\n         WRITE( NOUT, FMT = 9995 )NC, SNAME, UPLO, N, ALPHA, INCX,\n     $      BETA, INCY\n      END IF\n*\n  130 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', I3, ',', F4.1, ', AP',\n     $      ', X,', I2, ',', F4.1, ', Y,', I2, ')                .' )\n 9994 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', 2( I3, ',' ), F4.1,\n     $      ', A,', I3, ', X,', I2, ',', F4.1, ', Y,', I2,\n     $      ')         .' )\n 9993 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', I3, ',', F4.1, ', A,',\n     $      I3, ', X,', I2, ',', F4.1, ', Y,', I2, ')             .' )\n 9992 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of SCHK2.\n*\n      END\n      SUBROUTINE SCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NKB, KB, NINC, INC, NMAX,\n     $                  INCMAX, A, AA, AS, X, XX, XS, XT, G, Z )\n*\n*  Tests STRMV, STBMV, STPMV, STRSV, STBSV and STPSV.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Parameters ..\n      REAL               ZERO, HALF, ONE\n      PARAMETER          ( ZERO = 0.0, HALF = 0.5, ONE = 1.0 )\n*     .. Scalar Arguments ..\n      REAL               EPS, THRESH\n      INTEGER            INCMAX, NIDIM, NINC, NKB, NMAX, NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      REAL               A( NMAX, NMAX ), AA( NMAX*NMAX ),\n     $                   AS( NMAX*NMAX ), G( NMAX ), X( NMAX ),\n     $                   XS( NMAX*INCMAX ), XT( NMAX ),\n     $                   XX( NMAX*INCMAX ), Z( NMAX )\n      INTEGER            IDIM( NIDIM ), INC( NINC ), KB( NKB )\n*     .. Local Scalars ..\n      REAL               ERR, ERRMAX, TRANSL\n      INTEGER            I, ICD, ICT, ICU, IK, IN, INCX, INCXS, IX, K,\n     $                   KS, LAA, LDA, LDAS, LX, N, NARGS, NC, NK, NS\n      LOGICAL            BANDED, FULL, NULL, PACKED, RESET, SAME\n      CHARACTER*1        DIAG, DIAGS, TRANS, TRANSS, UPLO, UPLOS\n      CHARACTER*2        ICHD, ICHU\n      CHARACTER*3        ICHT\n*     .. Local Arrays ..\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LSE, LSERES\n      EXTERNAL           LSE, LSERES\n*     .. External Subroutines ..\n      EXTERNAL           SMAKE, SMVCH, STBMV, STBSV, STPMV, STPSV,\n     $                   STRMV, STRSV\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, MAX\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Data statements ..\n      DATA               ICHU/'UL'/, ICHT/'NTC'/, ICHD/'UN'/\n*     .. Executable Statements ..\n      FULL = SNAME( 3: 3 ).EQ.'R'\n      BANDED = SNAME( 3: 3 ).EQ.'B'\n      PACKED = SNAME( 3: 3 ).EQ.'P'\n*     Define the number of arguments.\n      IF( FULL )THEN\n         NARGS = 8\n      ELSE IF( BANDED )THEN\n         NARGS = 9\n      ELSE IF( PACKED )THEN\n         NARGS = 7\n      END IF\n*\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = ZERO\n*     Set up zero vector for SMVCH.\n      DO 10 I = 1, NMAX\n         Z( I ) = ZERO\n   10 CONTINUE\n*\n      DO 110 IN = 1, NIDIM\n         N = IDIM( IN )\n*\n         IF( BANDED )THEN\n            NK = NKB\n         ELSE\n            NK = 1\n         END IF\n         DO 100 IK = 1, NK\n            IF( BANDED )THEN\n               K = KB( IK )\n            ELSE\n               K = N - 1\n            END IF\n*           Set LDA to 1 more than minimum value if room.\n            IF( BANDED )THEN\n               LDA = K + 1\n            ELSE\n               LDA = N\n            END IF\n            IF( LDA.LT.NMAX )\n     $         LDA = LDA + 1\n*           Skip tests if not enough room.\n            IF( LDA.GT.NMAX )\n     $         GO TO 100\n            IF( PACKED )THEN\n               LAA = ( N*( N + 1 ) )/2\n            ELSE\n               LAA = LDA*N\n            END IF\n            NULL = N.LE.0\n*\n            DO 90 ICU = 1, 2\n               UPLO = ICHU( ICU: ICU )\n*\n               DO 80 ICT = 1, 3\n                  TRANS = ICHT( ICT: ICT )\n*\n                  DO 70 ICD = 1, 2\n                     DIAG = ICHD( ICD: ICD )\n*\n*                    Generate the matrix A.\n*\n                     TRANSL = ZERO\n                     CALL SMAKE( SNAME( 2: 3 ), UPLO, DIAG, N, N, A,\n     $                           NMAX, AA, LDA, K, K, RESET, TRANSL )\n*\n                     DO 60 IX = 1, NINC\n                        INCX = INC( IX )\n                        LX = ABS( INCX )*N\n*\n*                       Generate the vector X.\n*\n                        TRANSL = HALF\n                        CALL SMAKE( 'GE', ' ', ' ', 1, N, X, 1, XX,\n     $                              ABS( INCX ), 0, N - 1, RESET,\n     $                              TRANSL )\n                        IF( N.GT.1 )THEN\n                           X( N/2 ) = ZERO\n                           XX( 1 + ABS( INCX )*( N/2 - 1 ) ) = ZERO\n                        END IF\n*\n                        NC = NC + 1\n*\n*                       Save every datum before calling the subroutine.\n*\n                        UPLOS = UPLO\n                        TRANSS = TRANS\n                        DIAGS = DIAG\n                        NS = N\n                        KS = K\n                        DO 20 I = 1, LAA\n                           AS( I ) = AA( I )\n   20                   CONTINUE\n                        LDAS = LDA\n                        DO 30 I = 1, LX\n                           XS( I ) = XX( I )\n   30                   CONTINUE\n                        INCXS = INCX\n*\n*                       Call the subroutine.\n*\n                        IF( SNAME( 4: 5 ).EQ.'MV' )THEN\n                           IF( FULL )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9993 )NC, SNAME,\n     $                           UPLO, TRANS, DIAG, N, LDA, INCX\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL STRMV( UPLO, TRANS, DIAG, N, AA, LDA,\n     $                                    XX, INCX )\n                           ELSE IF( BANDED )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9994 )NC, SNAME,\n     $                           UPLO, TRANS, DIAG, N, K, LDA, INCX\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL STBMV( UPLO, TRANS, DIAG, N, K, AA,\n     $                                    LDA, XX, INCX )\n                           ELSE IF( PACKED )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9995 )NC, SNAME,\n     $                           UPLO, TRANS, DIAG, N, INCX\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL STPMV( UPLO, TRANS, DIAG, N, AA, XX,\n     $                                    INCX )\n                           END IF\n                        ELSE IF( SNAME( 4: 5 ).EQ.'SV' )THEN\n                           IF( FULL )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9993 )NC, SNAME,\n     $                           UPLO, TRANS, DIAG, N, LDA, INCX\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL STRSV( UPLO, TRANS, DIAG, N, AA, LDA,\n     $                                    XX, INCX )\n                           ELSE IF( BANDED )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9994 )NC, SNAME,\n     $                           UPLO, TRANS, DIAG, N, K, LDA, INCX\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL STBSV( UPLO, TRANS, DIAG, N, K, AA,\n     $                                    LDA, XX, INCX )\n                           ELSE IF( PACKED )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9995 )NC, SNAME,\n     $                           UPLO, TRANS, DIAG, N, INCX\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL STPSV( UPLO, TRANS, DIAG, N, AA, XX,\n     $                                    INCX )\n                           END IF\n                        END IF\n*\n*                       Check if error-exit was taken incorrectly.\n*\n                        IF( .NOT.OK )THEN\n                           WRITE( NOUT, FMT = 9992 )\n                           FATAL = .TRUE.\n                           GO TO 120\n                        END IF\n*\n*                       See what data changed inside subroutines.\n*\n                        ISAME( 1 ) = UPLO.EQ.UPLOS\n                        ISAME( 2 ) = TRANS.EQ.TRANSS\n                        ISAME( 3 ) = DIAG.EQ.DIAGS\n                        ISAME( 4 ) = NS.EQ.N\n                        IF( FULL )THEN\n                           ISAME( 5 ) = LSE( AS, AA, LAA )\n                           ISAME( 6 ) = LDAS.EQ.LDA\n                           IF( NULL )THEN\n                              ISAME( 7 ) = LSE( XS, XX, LX )\n                           ELSE\n                              ISAME( 7 ) = LSERES( 'GE', ' ', 1, N, XS,\n     $                                     XX, ABS( INCX ) )\n                           END IF\n                           ISAME( 8 ) = INCXS.EQ.INCX\n                        ELSE IF( BANDED )THEN\n                           ISAME( 5 ) = KS.EQ.K\n                           ISAME( 6 ) = LSE( AS, AA, LAA )\n                           ISAME( 7 ) = LDAS.EQ.LDA\n                           IF( NULL )THEN\n                              ISAME( 8 ) = LSE( XS, XX, LX )\n                           ELSE\n                              ISAME( 8 ) = LSERES( 'GE', ' ', 1, N, XS,\n     $                                     XX, ABS( INCX ) )\n                           END IF\n                           ISAME( 9 ) = INCXS.EQ.INCX\n                        ELSE IF( PACKED )THEN\n                           ISAME( 5 ) = LSE( AS, AA, LAA )\n                           IF( NULL )THEN\n                              ISAME( 6 ) = LSE( XS, XX, LX )\n                           ELSE\n                              ISAME( 6 ) = LSERES( 'GE', ' ', 1, N, XS,\n     $                                     XX, ABS( INCX ) )\n                           END IF\n                           ISAME( 7 ) = INCXS.EQ.INCX\n                        END IF\n*\n*                       If data was incorrectly changed, report and\n*                       return.\n*\n                        SAME = .TRUE.\n                        DO 40 I = 1, NARGS\n                           SAME = SAME.AND.ISAME( I )\n                           IF( .NOT.ISAME( I ) )\n     $                        WRITE( NOUT, FMT = 9998 )I\n   40                   CONTINUE\n                        IF( .NOT.SAME )THEN\n                           FATAL = .TRUE.\n                           GO TO 120\n                        END IF\n*\n                        IF( .NOT.NULL )THEN\n                           IF( SNAME( 4: 5 ).EQ.'MV' )THEN\n*\n*                             Check the result.\n*\n                              CALL SMVCH( TRANS, N, N, ONE, A, NMAX, X,\n     $                                    INCX, ZERO, Z, INCX, XT, G,\n     $                                    XX, EPS, ERR, FATAL, NOUT,\n     $                                    .TRUE. )\n                           ELSE IF( SNAME( 4: 5 ).EQ.'SV' )THEN\n*\n*                             Compute approximation to original vector.\n*\n                              DO 50 I = 1, N\n                                 Z( I ) = XX( 1 + ( I - 1 )*\n     $                                    ABS( INCX ) )\n                                 XX( 1 + ( I - 1 )*ABS( INCX ) )\n     $                              = X( I )\n   50                         CONTINUE\n                              CALL SMVCH( TRANS, N, N, ONE, A, NMAX, Z,\n     $                                    INCX, ZERO, X, INCX, XT, G,\n     $                                    XX, EPS, ERR, FATAL, NOUT,\n     $                                    .FALSE. )\n                           END IF\n                           ERRMAX = MAX( ERRMAX, ERR )\n*                          If got really bad answer, report and return.\n                           IF( FATAL )\n     $                        GO TO 120\n                        ELSE\n*                          Avoid repeating tests with N.le.0.\n                           GO TO 110\n                        END IF\n*\n   60                CONTINUE\n*\n   70             CONTINUE\n*\n   80          CONTINUE\n*\n   90       CONTINUE\n*\n  100    CONTINUE\n*\n  110 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 130\n*\n  120 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      IF( FULL )THEN\n         WRITE( NOUT, FMT = 9993 )NC, SNAME, UPLO, TRANS, DIAG, N, LDA,\n     $      INCX\n      ELSE IF( BANDED )THEN\n         WRITE( NOUT, FMT = 9994 )NC, SNAME, UPLO, TRANS, DIAG, N, K,\n     $      LDA, INCX\n      ELSE IF( PACKED )THEN\n         WRITE( NOUT, FMT = 9995 )NC, SNAME, UPLO, TRANS, DIAG, N, INCX\n      END IF\n*\n  130 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( 1X, I6, ': ', A6, '(', 3( '''', A1, ''',' ), I3, ', AP, ',\n     $      'X,', I2, ')                        .' )\n 9994 FORMAT( 1X, I6, ': ', A6, '(', 3( '''', A1, ''',' ), 2( I3, ',' ),\n     $      ' A,', I3, ', X,', I2, ')                 .' )\n 9993 FORMAT( 1X, I6, ': ', A6, '(', 3( '''', A1, ''',' ), I3, ', A,',\n     $      I3, ', X,', I2, ')                     .' )\n 9992 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of SCHK3.\n*\n      END\n      SUBROUTINE SCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX,\n     $                  INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G,\n     $                  Z )\n*\n*  Tests SGER.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Parameters ..\n      REAL               ZERO, HALF, ONE\n      PARAMETER          ( ZERO = 0.0, HALF = 0.5, ONE = 1.0 )\n*     .. Scalar Arguments ..\n      REAL               EPS, THRESH\n      INTEGER            INCMAX, NALF, NIDIM, NINC, NMAX, NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      REAL               A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),\n     $                   AS( NMAX*NMAX ), G( NMAX ), X( NMAX ),\n     $                   XS( NMAX*INCMAX ), XX( NMAX*INCMAX ),\n     $                   Y( NMAX ), YS( NMAX*INCMAX ), YT( NMAX ),\n     $                   YY( NMAX*INCMAX ), Z( NMAX )\n      INTEGER            IDIM( NIDIM ), INC( NINC )\n*     .. Local Scalars ..\n      REAL               ALPHA, ALS, ERR, ERRMAX, TRANSL\n      INTEGER            I, IA, IM, IN, INCX, INCXS, INCY, INCYS, IX,\n     $                   IY, J, LAA, LDA, LDAS, LX, LY, M, MS, N, NARGS,\n     $                   NC, ND, NS\n      LOGICAL            NULL, RESET, SAME\n*     .. Local Arrays ..\n      REAL               W( 1 )\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LSE, LSERES\n      EXTERNAL           LSE, LSERES\n*     .. External Subroutines ..\n      EXTERNAL           SGER, SMAKE, SMVCH\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, MAX, MIN\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Executable Statements ..\n*     Define the number of arguments.\n      NARGS = 9\n*\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = ZERO\n*\n      DO 120 IN = 1, NIDIM\n         N = IDIM( IN )\n         ND = N/2 + 1\n*\n         DO 110 IM = 1, 2\n            IF( IM.EQ.1 )\n     $         M = MAX( N - ND, 0 )\n            IF( IM.EQ.2 )\n     $         M = MIN( N + ND, NMAX )\n*\n*           Set LDA to 1 more than minimum value if room.\n            LDA = M\n            IF( LDA.LT.NMAX )\n     $         LDA = LDA + 1\n*           Skip tests if not enough room.\n            IF( LDA.GT.NMAX )\n     $         GO TO 110\n            LAA = LDA*N\n            NULL = N.LE.0.OR.M.LE.0\n*\n            DO 100 IX = 1, NINC\n               INCX = INC( IX )\n               LX = ABS( INCX )*M\n*\n*              Generate the vector X.\n*\n               TRANSL = HALF\n               CALL SMAKE( 'GE', ' ', ' ', 1, M, X, 1, XX, ABS( INCX ),\n     $                     0, M - 1, RESET, TRANSL )\n               IF( M.GT.1 )THEN\n                  X( M/2 ) = ZERO\n                  XX( 1 + ABS( INCX )*( M/2 - 1 ) ) = ZERO\n               END IF\n*\n               DO 90 IY = 1, NINC\n                  INCY = INC( IY )\n                  LY = ABS( INCY )*N\n*\n*                 Generate the vector Y.\n*\n                  TRANSL = ZERO\n                  CALL SMAKE( 'GE', ' ', ' ', 1, N, Y, 1, YY,\n     $                        ABS( INCY ), 0, N - 1, RESET, TRANSL )\n                  IF( N.GT.1 )THEN\n                     Y( N/2 ) = ZERO\n                     YY( 1 + ABS( INCY )*( N/2 - 1 ) ) = ZERO\n                  END IF\n*\n                  DO 80 IA = 1, NALF\n                     ALPHA = ALF( IA )\n*\n*                    Generate the matrix A.\n*\n                     TRANSL = ZERO\n                     CALL SMAKE( SNAME( 2: 3 ), ' ', ' ', M, N, A, NMAX,\n     $                           AA, LDA, M - 1, N - 1, RESET, TRANSL )\n*\n                     NC = NC + 1\n*\n*                    Save every datum before calling the subroutine.\n*\n                     MS = M\n                     NS = N\n                     ALS = ALPHA\n                     DO 10 I = 1, LAA\n                        AS( I ) = AA( I )\n   10                CONTINUE\n                     LDAS = LDA\n                     DO 20 I = 1, LX\n                        XS( I ) = XX( I )\n   20                CONTINUE\n                     INCXS = INCX\n                     DO 30 I = 1, LY\n                        YS( I ) = YY( I )\n   30                CONTINUE\n                     INCYS = INCY\n*\n*                    Call the subroutine.\n*\n                     IF( TRACE )\n     $                  WRITE( NTRA, FMT = 9994 )NC, SNAME, M, N,\n     $                  ALPHA, INCX, INCY, LDA\n                     IF( REWI )\n     $                  REWIND NTRA\n                     CALL SGER( M, N, ALPHA, XX, INCX, YY, INCY, AA,\n     $                          LDA )\n*\n*                    Check if error-exit was taken incorrectly.\n*\n                     IF( .NOT.OK )THEN\n                        WRITE( NOUT, FMT = 9993 )\n                        FATAL = .TRUE.\n                        GO TO 140\n                     END IF\n*\n*                    See what data changed inside subroutine.\n*\n                     ISAME( 1 ) = MS.EQ.M\n                     ISAME( 2 ) = NS.EQ.N\n                     ISAME( 3 ) = ALS.EQ.ALPHA\n                     ISAME( 4 ) = LSE( XS, XX, LX )\n                     ISAME( 5 ) = INCXS.EQ.INCX\n                     ISAME( 6 ) = LSE( YS, YY, LY )\n                     ISAME( 7 ) = INCYS.EQ.INCY\n                     IF( NULL )THEN\n                        ISAME( 8 ) = LSE( AS, AA, LAA )\n                     ELSE\n                        ISAME( 8 ) = LSERES( 'GE', ' ', M, N, AS, AA,\n     $                               LDA )\n                     END IF\n                     ISAME( 9 ) = LDAS.EQ.LDA\n*\n*                    If data was incorrectly changed, report and return.\n*\n                     SAME = .TRUE.\n                     DO 40 I = 1, NARGS\n                        SAME = SAME.AND.ISAME( I )\n                        IF( .NOT.ISAME( I ) )\n     $                     WRITE( NOUT, FMT = 9998 )I\n   40                CONTINUE\n                     IF( .NOT.SAME )THEN\n                        FATAL = .TRUE.\n                        GO TO 140\n                     END IF\n*\n                     IF( .NOT.NULL )THEN\n*\n*                       Check the result column by column.\n*\n                        IF( INCX.GT.0 )THEN\n                           DO 50 I = 1, M\n                              Z( I ) = X( I )\n   50                      CONTINUE\n                        ELSE\n                           DO 60 I = 1, M\n                              Z( I ) = X( M - I + 1 )\n   60                      CONTINUE\n                        END IF\n                        DO 70 J = 1, N\n                           IF( INCY.GT.0 )THEN\n                              W( 1 ) = Y( J )\n                           ELSE\n                              W( 1 ) = Y( N - J + 1 )\n                           END IF\n                           CALL SMVCH( 'N', M, 1, ALPHA, Z, NMAX, W, 1,\n     $                                 ONE, A( 1, J ), 1, YT, G,\n     $                                 AA( 1 + ( J - 1 )*LDA ), EPS,\n     $                                 ERR, FATAL, NOUT, .TRUE. )\n                           ERRMAX = MAX( ERRMAX, ERR )\n*                          If got really bad answer, report and return.\n                           IF( FATAL )\n     $                        GO TO 130\n   70                   CONTINUE\n                     ELSE\n*                       Avoid repeating tests with M.le.0 or N.le.0.\n                        GO TO 110\n                     END IF\n*\n   80             CONTINUE\n*\n   90          CONTINUE\n*\n  100       CONTINUE\n*\n  110    CONTINUE\n*\n  120 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 150\n*\n  130 CONTINUE\n      WRITE( NOUT, FMT = 9995 )J\n*\n  140 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      WRITE( NOUT, FMT = 9994 )NC, SNAME, M, N, ALPHA, INCX, INCY, LDA\n*\n  150 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( '      THESE ARE THE RESULTS FOR COLUMN ', I3 )\n 9994 FORMAT( 1X, I6, ': ', A6, '(', 2( I3, ',' ), F4.1, ', X,', I2,\n     $      ', Y,', I2, ', A,', I3, ')                  .' )\n 9993 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of SCHK4.\n*\n      END\n      SUBROUTINE SCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX,\n     $                  INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G,\n     $                  Z )\n*\n*  Tests SSYR and SSPR.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Parameters ..\n      REAL               ZERO, HALF, ONE\n      PARAMETER          ( ZERO = 0.0, HALF = 0.5, ONE = 1.0 )\n*     .. Scalar Arguments ..\n      REAL               EPS, THRESH\n      INTEGER            INCMAX, NALF, NIDIM, NINC, NMAX, NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      REAL               A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),\n     $                   AS( NMAX*NMAX ), G( NMAX ), X( NMAX ),\n     $                   XS( NMAX*INCMAX ), XX( NMAX*INCMAX ),\n     $                   Y( NMAX ), YS( NMAX*INCMAX ), YT( NMAX ),\n     $                   YY( NMAX*INCMAX ), Z( NMAX )\n      INTEGER            IDIM( NIDIM ), INC( NINC )\n*     .. Local Scalars ..\n      REAL               ALPHA, ALS, ERR, ERRMAX, TRANSL\n      INTEGER            I, IA, IC, IN, INCX, INCXS, IX, J, JA, JJ, LAA,\n     $                   LDA, LDAS, LJ, LX, N, NARGS, NC, NS\n      LOGICAL            FULL, NULL, PACKED, RESET, SAME, UPPER\n      CHARACTER*1        UPLO, UPLOS\n      CHARACTER*2        ICH\n*     .. Local Arrays ..\n      REAL               W( 1 )\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LSE, LSERES\n      EXTERNAL           LSE, LSERES\n*     .. External Subroutines ..\n      EXTERNAL           SMAKE, SMVCH, SSPR, SSYR\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, MAX\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Data statements ..\n      DATA               ICH/'UL'/\n*     .. Executable Statements ..\n      FULL = SNAME( 3: 3 ).EQ.'Y'\n      PACKED = SNAME( 3: 3 ).EQ.'P'\n*     Define the number of arguments.\n      IF( FULL )THEN\n         NARGS = 7\n      ELSE IF( PACKED )THEN\n         NARGS = 6\n      END IF\n*\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = ZERO\n*\n      DO 100 IN = 1, NIDIM\n         N = IDIM( IN )\n*        Set LDA to 1 more than minimum value if room.\n         LDA = N\n         IF( LDA.LT.NMAX )\n     $      LDA = LDA + 1\n*        Skip tests if not enough room.\n         IF( LDA.GT.NMAX )\n     $      GO TO 100\n         IF( PACKED )THEN\n            LAA = ( N*( N + 1 ) )/2\n         ELSE\n            LAA = LDA*N\n         END IF\n*\n         DO 90 IC = 1, 2\n            UPLO = ICH( IC: IC )\n            UPPER = UPLO.EQ.'U'\n*\n            DO 80 IX = 1, NINC\n               INCX = INC( IX )\n               LX = ABS( INCX )*N\n*\n*              Generate the vector X.\n*\n               TRANSL = HALF\n               CALL SMAKE( 'GE', ' ', ' ', 1, N, X, 1, XX, ABS( INCX ),\n     $                     0, N - 1, RESET, TRANSL )\n               IF( N.GT.1 )THEN\n                  X( N/2 ) = ZERO\n                  XX( 1 + ABS( INCX )*( N/2 - 1 ) ) = ZERO\n               END IF\n*\n               DO 70 IA = 1, NALF\n                  ALPHA = ALF( IA )\n                  NULL = N.LE.0.OR.ALPHA.EQ.ZERO\n*\n*                 Generate the matrix A.\n*\n                  TRANSL = ZERO\n                  CALL SMAKE( SNAME( 2: 3 ), UPLO, ' ', N, N, A, NMAX,\n     $                        AA, LDA, N - 1, N - 1, RESET, TRANSL )\n*\n                  NC = NC + 1\n*\n*                 Save every datum before calling the subroutine.\n*\n                  UPLOS = UPLO\n                  NS = N\n                  ALS = ALPHA\n                  DO 10 I = 1, LAA\n                     AS( I ) = AA( I )\n   10             CONTINUE\n                  LDAS = LDA\n                  DO 20 I = 1, LX\n                     XS( I ) = XX( I )\n   20             CONTINUE\n                  INCXS = INCX\n*\n*                 Call the subroutine.\n*\n                  IF( FULL )THEN\n                     IF( TRACE )\n     $                  WRITE( NTRA, FMT = 9993 )NC, SNAME, UPLO, N,\n     $                  ALPHA, INCX, LDA\n                     IF( REWI )\n     $                  REWIND NTRA\n                     CALL SSYR( UPLO, N, ALPHA, XX, INCX, AA, LDA )\n                  ELSE IF( PACKED )THEN\n                     IF( TRACE )\n     $                  WRITE( NTRA, FMT = 9994 )NC, SNAME, UPLO, N,\n     $                  ALPHA, INCX\n                     IF( REWI )\n     $                  REWIND NTRA\n                     CALL SSPR( UPLO, N, ALPHA, XX, INCX, AA )\n                  END IF\n*\n*                 Check if error-exit was taken incorrectly.\n*\n                  IF( .NOT.OK )THEN\n                     WRITE( NOUT, FMT = 9992 )\n                     FATAL = .TRUE.\n                     GO TO 120\n                  END IF\n*\n*                 See what data changed inside subroutines.\n*\n                  ISAME( 1 ) = UPLO.EQ.UPLOS\n                  ISAME( 2 ) = NS.EQ.N\n                  ISAME( 3 ) = ALS.EQ.ALPHA\n                  ISAME( 4 ) = LSE( XS, XX, LX )\n                  ISAME( 5 ) = INCXS.EQ.INCX\n                  IF( NULL )THEN\n                     ISAME( 6 ) = LSE( AS, AA, LAA )\n                  ELSE\n                     ISAME( 6 ) = LSERES( SNAME( 2: 3 ), UPLO, N, N, AS,\n     $                            AA, LDA )\n                  END IF\n                  IF( .NOT.PACKED )THEN\n                     ISAME( 7 ) = LDAS.EQ.LDA\n                  END IF\n*\n*                 If data was incorrectly changed, report and return.\n*\n                  SAME = .TRUE.\n                  DO 30 I = 1, NARGS\n                     SAME = SAME.AND.ISAME( I )\n                     IF( .NOT.ISAME( I ) )\n     $                  WRITE( NOUT, FMT = 9998 )I\n   30             CONTINUE\n                  IF( .NOT.SAME )THEN\n                     FATAL = .TRUE.\n                     GO TO 120\n                  END IF\n*\n                  IF( .NOT.NULL )THEN\n*\n*                    Check the result column by column.\n*\n                     IF( INCX.GT.0 )THEN\n                        DO 40 I = 1, N\n                           Z( I ) = X( I )\n   40                   CONTINUE\n                     ELSE\n                        DO 50 I = 1, N\n                           Z( I ) = X( N - I + 1 )\n   50                   CONTINUE\n                     END IF\n                     JA = 1\n                     DO 60 J = 1, N\n                        W( 1 ) = Z( J )\n                        IF( UPPER )THEN\n                           JJ = 1\n                           LJ = J\n                        ELSE\n                           JJ = J\n                           LJ = N - J + 1\n                        END IF\n                        CALL SMVCH( 'N', LJ, 1, ALPHA, Z( JJ ), LJ, W,\n     $                              1, ONE, A( JJ, J ), 1, YT, G,\n     $                              AA( JA ), EPS, ERR, FATAL, NOUT,\n     $                              .TRUE. )\n                        IF( FULL )THEN\n                           IF( UPPER )THEN\n                              JA = JA + LDA\n                           ELSE\n                              JA = JA + LDA + 1\n                           END IF\n                        ELSE\n                           JA = JA + LJ\n                        END IF\n                        ERRMAX = MAX( ERRMAX, ERR )\n*                       If got really bad answer, report and return.\n                        IF( FATAL )\n     $                     GO TO 110\n   60                CONTINUE\n                  ELSE\n*                    Avoid repeating tests if N.le.0.\n                     IF( N.LE.0 )\n     $                  GO TO 100\n                  END IF\n*\n   70          CONTINUE\n*\n   80       CONTINUE\n*\n   90    CONTINUE\n*\n  100 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 130\n*\n  110 CONTINUE\n      WRITE( NOUT, FMT = 9995 )J\n*\n  120 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      IF( FULL )THEN\n         WRITE( NOUT, FMT = 9993 )NC, SNAME, UPLO, N, ALPHA, INCX, LDA\n      ELSE IF( PACKED )THEN\n         WRITE( NOUT, FMT = 9994 )NC, SNAME, UPLO, N, ALPHA, INCX\n      END IF\n*\n  130 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( '      THESE ARE THE RESULTS FOR COLUMN ', I3 )\n 9994 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', I3, ',', F4.1, ', X,',\n     $      I2, ', AP)                           .' )\n 9993 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', I3, ',', F4.1, ', X,',\n     $      I2, ', A,', I3, ')                        .' )\n 9992 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of SCHK5.\n*\n      END\n      SUBROUTINE SCHK6( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX,\n     $                  INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G,\n     $                  Z )\n*\n*  Tests SSYR2 and SSPR2.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Parameters ..\n      REAL               ZERO, HALF, ONE\n      PARAMETER          ( ZERO = 0.0, HALF = 0.5, ONE = 1.0 )\n*     .. Scalar Arguments ..\n      REAL               EPS, THRESH\n      INTEGER            INCMAX, NALF, NIDIM, NINC, NMAX, NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      REAL               A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),\n     $                   AS( NMAX*NMAX ), G( NMAX ), X( NMAX ),\n     $                   XS( NMAX*INCMAX ), XX( NMAX*INCMAX ),\n     $                   Y( NMAX ), YS( NMAX*INCMAX ), YT( NMAX ),\n     $                   YY( NMAX*INCMAX ), Z( NMAX, 2 )\n      INTEGER            IDIM( NIDIM ), INC( NINC )\n*     .. Local Scalars ..\n      REAL               ALPHA, ALS, ERR, ERRMAX, TRANSL\n      INTEGER            I, IA, IC, IN, INCX, INCXS, INCY, INCYS, IX,\n     $                   IY, J, JA, JJ, LAA, LDA, LDAS, LJ, LX, LY, N,\n     $                   NARGS, NC, NS\n      LOGICAL            FULL, NULL, PACKED, RESET, SAME, UPPER\n      CHARACTER*1        UPLO, UPLOS\n      CHARACTER*2        ICH\n*     .. Local Arrays ..\n      REAL               W( 2 )\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LSE, LSERES\n      EXTERNAL           LSE, LSERES\n*     .. External Subroutines ..\n      EXTERNAL           SMAKE, SMVCH, SSPR2, SSYR2\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, MAX\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Data statements ..\n      DATA               ICH/'UL'/\n*     .. Executable Statements ..\n      FULL = SNAME( 3: 3 ).EQ.'Y'\n      PACKED = SNAME( 3: 3 ).EQ.'P'\n*     Define the number of arguments.\n      IF( FULL )THEN\n         NARGS = 9\n      ELSE IF( PACKED )THEN\n         NARGS = 8\n      END IF\n*\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = ZERO\n*\n      DO 140 IN = 1, NIDIM\n         N = IDIM( IN )\n*        Set LDA to 1 more than minimum value if room.\n         LDA = N\n         IF( LDA.LT.NMAX )\n     $      LDA = LDA + 1\n*        Skip tests if not enough room.\n         IF( LDA.GT.NMAX )\n     $      GO TO 140\n         IF( PACKED )THEN\n            LAA = ( N*( N + 1 ) )/2\n         ELSE\n            LAA = LDA*N\n         END IF\n*\n         DO 130 IC = 1, 2\n            UPLO = ICH( IC: IC )\n            UPPER = UPLO.EQ.'U'\n*\n            DO 120 IX = 1, NINC\n               INCX = INC( IX )\n               LX = ABS( INCX )*N\n*\n*              Generate the vector X.\n*\n               TRANSL = HALF\n               CALL SMAKE( 'GE', ' ', ' ', 1, N, X, 1, XX, ABS( INCX ),\n     $                     0, N - 1, RESET, TRANSL )\n               IF( N.GT.1 )THEN\n                  X( N/2 ) = ZERO\n                  XX( 1 + ABS( INCX )*( N/2 - 1 ) ) = ZERO\n               END IF\n*\n               DO 110 IY = 1, NINC\n                  INCY = INC( IY )\n                  LY = ABS( INCY )*N\n*\n*                 Generate the vector Y.\n*\n                  TRANSL = ZERO\n                  CALL SMAKE( 'GE', ' ', ' ', 1, N, Y, 1, YY,\n     $                        ABS( INCY ), 0, N - 1, RESET, TRANSL )\n                  IF( N.GT.1 )THEN\n                     Y( N/2 ) = ZERO\n                     YY( 1 + ABS( INCY )*( N/2 - 1 ) ) = ZERO\n                  END IF\n*\n                  DO 100 IA = 1, NALF\n                     ALPHA = ALF( IA )\n                     NULL = N.LE.0.OR.ALPHA.EQ.ZERO\n*\n*                    Generate the matrix A.\n*\n                     TRANSL = ZERO\n                     CALL SMAKE( SNAME( 2: 3 ), UPLO, ' ', N, N, A,\n     $                           NMAX, AA, LDA, N - 1, N - 1, RESET,\n     $                           TRANSL )\n*\n                     NC = NC + 1\n*\n*                    Save every datum before calling the subroutine.\n*\n                     UPLOS = UPLO\n                     NS = N\n                     ALS = ALPHA\n                     DO 10 I = 1, LAA\n                        AS( I ) = AA( I )\n   10                CONTINUE\n                     LDAS = LDA\n                     DO 20 I = 1, LX\n                        XS( I ) = XX( I )\n   20                CONTINUE\n                     INCXS = INCX\n                     DO 30 I = 1, LY\n                        YS( I ) = YY( I )\n   30                CONTINUE\n                     INCYS = INCY\n*\n*                    Call the subroutine.\n*\n                     IF( FULL )THEN\n                        IF( TRACE )\n     $                     WRITE( NTRA, FMT = 9993 )NC, SNAME, UPLO, N,\n     $                     ALPHA, INCX, INCY, LDA\n                        IF( REWI )\n     $                     REWIND NTRA\n                        CALL SSYR2( UPLO, N, ALPHA, XX, INCX, YY, INCY,\n     $                              AA, LDA )\n                     ELSE IF( PACKED )THEN\n                        IF( TRACE )\n     $                     WRITE( NTRA, FMT = 9994 )NC, SNAME, UPLO, N,\n     $                     ALPHA, INCX, INCY\n                        IF( REWI )\n     $                     REWIND NTRA\n                        CALL SSPR2( UPLO, N, ALPHA, XX, INCX, YY, INCY,\n     $                              AA )\n                     END IF\n*\n*                    Check if error-exit was taken incorrectly.\n*\n                     IF( .NOT.OK )THEN\n                        WRITE( NOUT, FMT = 9992 )\n                        FATAL = .TRUE.\n                        GO TO 160\n                     END IF\n*\n*                    See what data changed inside subroutines.\n*\n                     ISAME( 1 ) = UPLO.EQ.UPLOS\n                     ISAME( 2 ) = NS.EQ.N\n                     ISAME( 3 ) = ALS.EQ.ALPHA\n                     ISAME( 4 ) = LSE( XS, XX, LX )\n                     ISAME( 5 ) = INCXS.EQ.INCX\n                     ISAME( 6 ) = LSE( YS, YY, LY )\n                     ISAME( 7 ) = INCYS.EQ.INCY\n                     IF( NULL )THEN\n                        ISAME( 8 ) = LSE( AS, AA, LAA )\n                     ELSE\n                        ISAME( 8 ) = LSERES( SNAME( 2: 3 ), UPLO, N, N,\n     $                               AS, AA, LDA )\n                     END IF\n                     IF( .NOT.PACKED )THEN\n                        ISAME( 9 ) = LDAS.EQ.LDA\n                     END IF\n*\n*                    If data was incorrectly changed, report and return.\n*\n                     SAME = .TRUE.\n                     DO 40 I = 1, NARGS\n                        SAME = SAME.AND.ISAME( I )\n                        IF( .NOT.ISAME( I ) )\n     $                     WRITE( NOUT, FMT = 9998 )I\n   40                CONTINUE\n                     IF( .NOT.SAME )THEN\n                        FATAL = .TRUE.\n                        GO TO 160\n                     END IF\n*\n                     IF( .NOT.NULL )THEN\n*\n*                       Check the result column by column.\n*\n                        IF( INCX.GT.0 )THEN\n                           DO 50 I = 1, N\n                              Z( I, 1 ) = X( I )\n   50                      CONTINUE\n                        ELSE\n                           DO 60 I = 1, N\n                              Z( I, 1 ) = X( N - I + 1 )\n   60                      CONTINUE\n                        END IF\n                        IF( INCY.GT.0 )THEN\n                           DO 70 I = 1, N\n                              Z( I, 2 ) = Y( I )\n   70                      CONTINUE\n                        ELSE\n                           DO 80 I = 1, N\n                              Z( I, 2 ) = Y( N - I + 1 )\n   80                      CONTINUE\n                        END IF\n                        JA = 1\n                        DO 90 J = 1, N\n                           W( 1 ) = Z( J, 2 )\n                           W( 2 ) = Z( J, 1 )\n                           IF( UPPER )THEN\n                              JJ = 1\n                              LJ = J\n                           ELSE\n                              JJ = J\n                              LJ = N - J + 1\n                           END IF\n                           CALL SMVCH( 'N', LJ, 2, ALPHA, Z( JJ, 1 ),\n     $                                 NMAX, W, 1, ONE, A( JJ, J ), 1,\n     $                                 YT, G, AA( JA ), EPS, ERR, FATAL,\n     $                                 NOUT, .TRUE. )\n                           IF( FULL )THEN\n                              IF( UPPER )THEN\n                                 JA = JA + LDA\n                              ELSE\n                                 JA = JA + LDA + 1\n                              END IF\n                           ELSE\n                              JA = JA + LJ\n                           END IF\n                           ERRMAX = MAX( ERRMAX, ERR )\n*                          If got really bad answer, report and return.\n                           IF( FATAL )\n     $                        GO TO 150\n   90                   CONTINUE\n                     ELSE\n*                       Avoid repeating tests with N.le.0.\n                        IF( N.LE.0 )\n     $                     GO TO 140\n                     END IF\n*\n  100             CONTINUE\n*\n  110          CONTINUE\n*\n  120       CONTINUE\n*\n  130    CONTINUE\n*\n  140 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 170\n*\n  150 CONTINUE\n      WRITE( NOUT, FMT = 9995 )J\n*\n  160 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      IF( FULL )THEN\n         WRITE( NOUT, FMT = 9993 )NC, SNAME, UPLO, N, ALPHA, INCX,\n     $      INCY, LDA\n      ELSE IF( PACKED )THEN\n         WRITE( NOUT, FMT = 9994 )NC, SNAME, UPLO, N, ALPHA, INCX, INCY\n      END IF\n*\n  170 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( '      THESE ARE THE RESULTS FOR COLUMN ', I3 )\n 9994 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', I3, ',', F4.1, ', X,',\n     $      I2, ', Y,', I2, ', AP)                     .' )\n 9993 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', I3, ',', F4.1, ', X,',\n     $      I2, ', Y,', I2, ', A,', I3, ')                  .' )\n 9992 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of SCHK6.\n*\n      END\n      SUBROUTINE SCHKE( ISNUM, SRNAMT, NOUT )\n*\n*  Tests the error exits from the Level 2 Blas.\n*  Requires a special version of the error-handling routine XERBLA.\n*  ALPHA, BETA, A, X and Y should not need to be defined.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Scalar Arguments ..\n      INTEGER            ISNUM, NOUT\n      CHARACTER*6        SRNAMT\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Local Scalars ..\n      REAL               ALPHA, BETA\n*     .. Local Arrays ..\n      REAL               A( 1, 1 ), X( 1 ), Y( 1 )\n*     .. External Subroutines ..\n      EXTERNAL           CHKXER, SGBMV, SGEMV, SGER, SSBMV, SSPMV, SSPR,\n     $                   SSPR2, SSYMV, SSYR, SSYR2, STBMV, STBSV, STPMV,\n     $                   STPSV, STRMV, STRSV\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Executable Statements ..\n*     OK is set to .FALSE. by the special version of XERBLA or by CHKXER\n*     if anything is wrong.\n      OK = .TRUE.\n*     LERR is set to .TRUE. by the special version of XERBLA each time\n*     it is called, and is then tested and re-set by CHKXER.\n      LERR = .FALSE.\n      GO TO ( 10, 20, 30, 40, 50, 60, 70, 80,\n     $        90, 100, 110, 120, 130, 140, 150,\n     $        160 )ISNUM\n   10 INFOT = 1\n      CALL SGEMV( '/', 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL SGEMV( 'N', -1, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL SGEMV( 'N', 0, -1, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL SGEMV( 'N', 2, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL SGEMV( 'N', 0, 0, ALPHA, A, 1, X, 0, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL SGEMV( 'N', 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 170\n   20 INFOT = 1\n      CALL SGBMV( '/', 0, 0, 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL SGBMV( 'N', -1, 0, 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL SGBMV( 'N', 0, -1, 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL SGBMV( 'N', 0, 0, -1, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL SGBMV( 'N', 2, 0, 0, -1, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL SGBMV( 'N', 0, 0, 1, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL SGBMV( 'N', 0, 0, 0, 0, ALPHA, A, 1, X, 0, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 13\n      CALL SGBMV( 'N', 0, 0, 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 170\n   30 INFOT = 1\n      CALL SSYMV( '/', 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL SSYMV( 'U', -1, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL SSYMV( 'U', 2, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL SSYMV( 'U', 0, ALPHA, A, 1, X, 0, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL SSYMV( 'U', 0, ALPHA, A, 1, X, 1, BETA, Y, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 170\n   40 INFOT = 1\n      CALL SSBMV( '/', 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL SSBMV( 'U', -1, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL SSBMV( 'U', 0, -1, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL SSBMV( 'U', 0, 1, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL SSBMV( 'U', 0, 0, ALPHA, A, 1, X, 0, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL SSBMV( 'U', 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 170\n   50 INFOT = 1\n      CALL SSPMV( '/', 0, ALPHA, A, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL SSPMV( 'U', -1, ALPHA, A, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL SSPMV( 'U', 0, ALPHA, A, X, 0, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL SSPMV( 'U', 0, ALPHA, A, X, 1, BETA, Y, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 170\n   60 INFOT = 1\n      CALL STRMV( '/', 'N', 'N', 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL STRMV( 'U', '/', 'N', 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL STRMV( 'U', 'N', '/', 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL STRMV( 'U', 'N', 'N', -1, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL STRMV( 'U', 'N', 'N', 2, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL STRMV( 'U', 'N', 'N', 0, A, 1, X, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 170\n   70 INFOT = 1\n      CALL STBMV( '/', 'N', 'N', 0, 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL STBMV( 'U', '/', 'N', 0, 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL STBMV( 'U', 'N', '/', 0, 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL STBMV( 'U', 'N', 'N', -1, 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL STBMV( 'U', 'N', 'N', 0, -1, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL STBMV( 'U', 'N', 'N', 0, 1, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL STBMV( 'U', 'N', 'N', 0, 0, A, 1, X, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 170\n   80 INFOT = 1\n      CALL STPMV( '/', 'N', 'N', 0, A, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL STPMV( 'U', '/', 'N', 0, A, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL STPMV( 'U', 'N', '/', 0, A, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL STPMV( 'U', 'N', 'N', -1, A, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL STPMV( 'U', 'N', 'N', 0, A, X, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 170\n   90 INFOT = 1\n      CALL STRSV( '/', 'N', 'N', 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL STRSV( 'U', '/', 'N', 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL STRSV( 'U', 'N', '/', 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL STRSV( 'U', 'N', 'N', -1, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL STRSV( 'U', 'N', 'N', 2, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL STRSV( 'U', 'N', 'N', 0, A, 1, X, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 170\n  100 INFOT = 1\n      CALL STBSV( '/', 'N', 'N', 0, 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL STBSV( 'U', '/', 'N', 0, 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL STBSV( 'U', 'N', '/', 0, 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL STBSV( 'U', 'N', 'N', -1, 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL STBSV( 'U', 'N', 'N', 0, -1, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL STBSV( 'U', 'N', 'N', 0, 1, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL STBSV( 'U', 'N', 'N', 0, 0, A, 1, X, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 170\n  110 INFOT = 1\n      CALL STPSV( '/', 'N', 'N', 0, A, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL STPSV( 'U', '/', 'N', 0, A, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL STPSV( 'U', 'N', '/', 0, A, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL STPSV( 'U', 'N', 'N', -1, A, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL STPSV( 'U', 'N', 'N', 0, A, X, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 170\n  120 INFOT = 1\n      CALL SGER( -1, 0, ALPHA, X, 1, Y, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL SGER( 0, -1, ALPHA, X, 1, Y, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL SGER( 0, 0, ALPHA, X, 0, Y, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL SGER( 0, 0, ALPHA, X, 1, Y, 0, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL SGER( 2, 0, ALPHA, X, 1, Y, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 170\n  130 INFOT = 1\n      CALL SSYR( '/', 0, ALPHA, X, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL SSYR( 'U', -1, ALPHA, X, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL SSYR( 'U', 0, ALPHA, X, 0, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL SSYR( 'U', 2, ALPHA, X, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 170\n  140 INFOT = 1\n      CALL SSPR( '/', 0, ALPHA, X, 1, A )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL SSPR( 'U', -1, ALPHA, X, 1, A )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL SSPR( 'U', 0, ALPHA, X, 0, A )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 170\n  150 INFOT = 1\n      CALL SSYR2( '/', 0, ALPHA, X, 1, Y, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL SSYR2( 'U', -1, ALPHA, X, 1, Y, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL SSYR2( 'U', 0, ALPHA, X, 0, Y, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL SSYR2( 'U', 0, ALPHA, X, 1, Y, 0, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL SSYR2( 'U', 2, ALPHA, X, 1, Y, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 170\n  160 INFOT = 1\n      CALL SSPR2( '/', 0, ALPHA, X, 1, Y, 1, A )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL SSPR2( 'U', -1, ALPHA, X, 1, Y, 1, A )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL SSPR2( 'U', 0, ALPHA, X, 0, Y, 1, A )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL SSPR2( 'U', 0, ALPHA, X, 1, Y, 0, A )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n*\n  170 IF( OK )THEN\n         WRITE( NOUT, FMT = 9999 )SRNAMT\n      ELSE\n         WRITE( NOUT, FMT = 9998 )SRNAMT\n      END IF\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE TESTS OF ERROR-EXITS' )\n 9998 FORMAT( ' ******* ', A6, ' FAILED THE TESTS OF ERROR-EXITS *****',\n     $      '**' )\n*\n*     End of SCHKE.\n*\n      END\n      SUBROUTINE SMAKE( TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, KL,\n     $                  KU, RESET, TRANSL )\n*\n*  Generates values for an M by N matrix A within the bandwidth\n*  defined by KL and KU.\n*  Stores the values in the array AA in the data structure required\n*  by the routine, with unwanted elements set to rogue value.\n*\n*  TYPE is 'GE', 'GB', 'SY', 'SB', 'SP', 'TR', 'TB' OR 'TP'.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Parameters ..\n      REAL               ZERO, ONE\n      PARAMETER          ( ZERO = 0.0, ONE = 1.0 )\n      REAL               ROGUE\n      PARAMETER          ( ROGUE = -1.0E10 )\n*     .. Scalar Arguments ..\n      REAL               TRANSL\n      INTEGER            KL, KU, LDA, M, N, NMAX\n      LOGICAL            RESET\n      CHARACTER*1        DIAG, UPLO\n      CHARACTER*2        TYPE\n*     .. Array Arguments ..\n      REAL               A( NMAX, * ), AA( * )\n*     .. Local Scalars ..\n      INTEGER            I, I1, I2, I3, IBEG, IEND, IOFF, J, KK\n      LOGICAL            GEN, LOWER, SYM, TRI, UNIT, UPPER\n*     .. External Functions ..\n      REAL               SBEG\n      EXTERNAL           SBEG\n*     .. Intrinsic Functions ..\n      INTRINSIC          MAX, MIN\n*     .. Executable Statements ..\n      GEN = TYPE( 1: 1 ).EQ.'G'\n      SYM = TYPE( 1: 1 ).EQ.'S'\n      TRI = TYPE( 1: 1 ).EQ.'T'\n      UPPER = ( SYM.OR.TRI ).AND.UPLO.EQ.'U'\n      LOWER = ( SYM.OR.TRI ).AND.UPLO.EQ.'L'\n      UNIT = TRI.AND.DIAG.EQ.'U'\n*\n*     Generate data in array A.\n*\n      DO 20 J = 1, N\n         DO 10 I = 1, M\n            IF( GEN.OR.( UPPER.AND.I.LE.J ).OR.( LOWER.AND.I.GE.J ) )\n     $          THEN\n               IF( ( I.LE.J.AND.J - I.LE.KU ).OR.\n     $             ( I.GE.J.AND.I - J.LE.KL ) )THEN\n                  A( I, J ) = SBEG( RESET ) + TRANSL\n               ELSE\n                  A( I, J ) = ZERO\n               END IF\n               IF( I.NE.J )THEN\n                  IF( SYM )THEN\n                     A( J, I ) = A( I, J )\n                  ELSE IF( TRI )THEN\n                     A( J, I ) = ZERO\n                  END IF\n               END IF\n            END IF\n   10    CONTINUE\n         IF( TRI )\n     $      A( J, J ) = A( J, J ) + ONE\n         IF( UNIT )\n     $      A( J, J ) = ONE\n   20 CONTINUE\n*\n*     Store elements in array AS in data structure required by routine.\n*\n      IF( TYPE.EQ.'GE' )THEN\n         DO 50 J = 1, N\n            DO 30 I = 1, M\n               AA( I + ( J - 1 )*LDA ) = A( I, J )\n   30       CONTINUE\n            DO 40 I = M + 1, LDA\n               AA( I + ( J - 1 )*LDA ) = ROGUE\n   40       CONTINUE\n   50    CONTINUE\n      ELSE IF( TYPE.EQ.'GB' )THEN\n         DO 90 J = 1, N\n            DO 60 I1 = 1, KU + 1 - J\n               AA( I1 + ( J - 1 )*LDA ) = ROGUE\n   60       CONTINUE\n            DO 70 I2 = I1, MIN( KL + KU + 1, KU + 1 + M - J )\n               AA( I2 + ( J - 1 )*LDA ) = A( I2 + J - KU - 1, J )\n   70       CONTINUE\n            DO 80 I3 = I2, LDA\n               AA( I3 + ( J - 1 )*LDA ) = ROGUE\n   80       CONTINUE\n   90    CONTINUE\n      ELSE IF( TYPE.EQ.'SY'.OR.TYPE.EQ.'TR' )THEN\n         DO 130 J = 1, N\n            IF( UPPER )THEN\n               IBEG = 1\n               IF( UNIT )THEN\n                  IEND = J - 1\n               ELSE\n                  IEND = J\n               END IF\n            ELSE\n               IF( UNIT )THEN\n                  IBEG = J + 1\n               ELSE\n                  IBEG = J\n               END IF\n               IEND = N\n            END IF\n            DO 100 I = 1, IBEG - 1\n               AA( I + ( J - 1 )*LDA ) = ROGUE\n  100       CONTINUE\n            DO 110 I = IBEG, IEND\n               AA( I + ( J - 1 )*LDA ) = A( I, J )\n  110       CONTINUE\n            DO 120 I = IEND + 1, LDA\n               AA( I + ( J - 1 )*LDA ) = ROGUE\n  120       CONTINUE\n  130    CONTINUE\n      ELSE IF( TYPE.EQ.'SB'.OR.TYPE.EQ.'TB' )THEN\n         DO 170 J = 1, N\n            IF( UPPER )THEN\n               KK = KL + 1\n               IBEG = MAX( 1, KL + 2 - J )\n               IF( UNIT )THEN\n                  IEND = KL\n               ELSE\n                  IEND = KL + 1\n               END IF\n            ELSE\n               KK = 1\n               IF( UNIT )THEN\n                  IBEG = 2\n               ELSE\n                  IBEG = 1\n               END IF\n               IEND = MIN( KL + 1, 1 + M - J )\n            END IF\n            DO 140 I = 1, IBEG - 1\n               AA( I + ( J - 1 )*LDA ) = ROGUE\n  140       CONTINUE\n            DO 150 I = IBEG, IEND\n               AA( I + ( J - 1 )*LDA ) = A( I + J - KK, J )\n  150       CONTINUE\n            DO 160 I = IEND + 1, LDA\n               AA( I + ( J - 1 )*LDA ) = ROGUE\n  160       CONTINUE\n  170    CONTINUE\n      ELSE IF( TYPE.EQ.'SP'.OR.TYPE.EQ.'TP' )THEN\n         IOFF = 0\n         DO 190 J = 1, N\n            IF( UPPER )THEN\n               IBEG = 1\n               IEND = J\n            ELSE\n               IBEG = J\n               IEND = N\n            END IF\n            DO 180 I = IBEG, IEND\n               IOFF = IOFF + 1\n               AA( IOFF ) = A( I, J )\n               IF( I.EQ.J )THEN\n                  IF( UNIT )\n     $               AA( IOFF ) = ROGUE\n               END IF\n  180       CONTINUE\n  190    CONTINUE\n      END IF\n      RETURN\n*\n*     End of SMAKE.\n*\n      END\n      SUBROUTINE SMVCH( TRANS, M, N, ALPHA, A, NMAX, X, INCX, BETA, Y,\n     $                  INCY, YT, G, YY, EPS, ERR, FATAL, NOUT, MV )\n*\n*  Checks the results of the computational tests.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Parameters ..\n      REAL               ZERO, ONE\n      PARAMETER          ( ZERO = 0.0, ONE = 1.0 )\n*     .. Scalar Arguments ..\n      REAL               ALPHA, BETA, EPS, ERR\n      INTEGER            INCX, INCY, M, N, NMAX, NOUT\n      LOGICAL            FATAL, MV\n      CHARACTER*1        TRANS\n*     .. Array Arguments ..\n      REAL               A( NMAX, * ), G( * ), X( * ), Y( * ), YT( * ),\n     $                   YY( * )\n*     .. Local Scalars ..\n      REAL               ERRI\n      INTEGER            I, INCXL, INCYL, IY, J, JX, KX, KY, ML, NL\n      LOGICAL            TRAN\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, MAX, SQRT\n*     .. Executable Statements ..\n      TRAN = TRANS.EQ.'T'.OR.TRANS.EQ.'C'\n      IF( TRAN )THEN\n         ML = N\n         NL = M\n      ELSE\n         ML = M\n         NL = N\n      END IF\n      IF( INCX.LT.0 )THEN\n         KX = NL\n         INCXL = -1\n      ELSE\n         KX = 1\n         INCXL = 1\n      END IF\n      IF( INCY.LT.0 )THEN\n         KY = ML\n         INCYL = -1\n      ELSE\n         KY = 1\n         INCYL = 1\n      END IF\n*\n*     Compute expected result in YT using data in A, X and Y.\n*     Compute gauges in G.\n*\n      IY = KY\n      DO 30 I = 1, ML\n         YT( IY ) = ZERO\n         G( IY ) = ZERO\n         JX = KX\n         IF( TRAN )THEN\n            DO 10 J = 1, NL\n               YT( IY ) = YT( IY ) + A( J, I )*X( JX )\n               G( IY ) = G( IY ) + ABS( A( J, I )*X( JX ) )\n               JX = JX + INCXL\n   10       CONTINUE\n         ELSE\n            DO 20 J = 1, NL\n               YT( IY ) = YT( IY ) + A( I, J )*X( JX )\n               G( IY ) = G( IY ) + ABS( A( I, J )*X( JX ) )\n               JX = JX + INCXL\n   20       CONTINUE\n         END IF\n         YT( IY ) = ALPHA*YT( IY ) + BETA*Y( IY )\n         G( IY ) = ABS( ALPHA )*G( IY ) + ABS( BETA*Y( IY ) )\n         IY = IY + INCYL\n   30 CONTINUE\n*\n*     Compute the error ratio for this result.\n*\n      ERR = ZERO\n      DO 40 I = 1, ML\n         ERRI = ABS( YT( I ) - YY( 1 + ( I - 1 )*ABS( INCY ) ) )/EPS\n         IF( G( I ).NE.ZERO )\n     $      ERRI = ERRI/G( I )\n         ERR = MAX( ERR, ERRI )\n         IF( ERR*SQRT( EPS ).GE.ONE )\n     $      GO TO 50\n   40 CONTINUE\n*     If the loop completes, all results are at least half accurate.\n      GO TO 70\n*\n*     Report fatal error.\n*\n   50 FATAL = .TRUE.\n      WRITE( NOUT, FMT = 9999 )\n      DO 60 I = 1, ML\n         IF( MV )THEN\n            WRITE( NOUT, FMT = 9998 )I, YT( I ),\n     $         YY( 1 + ( I - 1 )*ABS( INCY ) )\n         ELSE\n            WRITE( NOUT, FMT = 9998 )I, \n     $         YY( 1 + ( I - 1 )*ABS( INCY ) ), YT(I)\n         END IF\n   60 CONTINUE\n*\n   70 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ******* FATAL ERROR - COMPUTED RESULT IS LESS THAN HAL',\n     $      'F ACCURATE *******', /'           EXPECTED RESULT   COMPU',\n     $      'TED RESULT' )\n 9998 FORMAT( 1X, I7, 2G18.6 )\n*\n*     End of SMVCH.\n*\n      END\n      LOGICAL FUNCTION LSE( RI, RJ, LR )\n*\n*  Tests if two arrays are identical.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Scalar Arguments ..\n      INTEGER            LR\n*     .. Array Arguments ..\n      REAL               RI( * ), RJ( * )\n*     .. Local Scalars ..\n      INTEGER            I\n*     .. Executable Statements ..\n      DO 10 I = 1, LR\n         IF( RI( I ).NE.RJ( I ) )\n     $      GO TO 20\n   10 CONTINUE\n      LSE = .TRUE.\n      GO TO 30\n   20 CONTINUE\n      LSE = .FALSE.\n   30 RETURN\n*\n*     End of LSE.\n*\n      END\n      LOGICAL FUNCTION LSERES( TYPE, UPLO, M, N, AA, AS, LDA )\n*\n*  Tests if selected elements in two arrays are equal.\n*\n*  TYPE is 'GE', 'SY' or 'SP'.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Scalar Arguments ..\n      INTEGER            LDA, M, N\n      CHARACTER*1        UPLO\n      CHARACTER*2        TYPE\n*     .. Array Arguments ..\n      REAL               AA( LDA, * ), AS( LDA, * )\n*     .. Local Scalars ..\n      INTEGER            I, IBEG, IEND, J\n      LOGICAL            UPPER\n*     .. Executable Statements ..\n      UPPER = UPLO.EQ.'U'\n      IF( TYPE.EQ.'GE' )THEN\n         DO 20 J = 1, N\n            DO 10 I = M + 1, LDA\n               IF( AA( I, J ).NE.AS( I, J ) )\n     $            GO TO 70\n   10       CONTINUE\n   20    CONTINUE\n      ELSE IF( TYPE.EQ.'SY' )THEN\n         DO 50 J = 1, N\n            IF( UPPER )THEN\n               IBEG = 1\n               IEND = J\n            ELSE\n               IBEG = J\n               IEND = N\n            END IF\n            DO 30 I = 1, IBEG - 1\n               IF( AA( I, J ).NE.AS( I, J ) )\n     $            GO TO 70\n   30       CONTINUE\n            DO 40 I = IEND + 1, LDA\n               IF( AA( I, J ).NE.AS( I, J ) )\n     $            GO TO 70\n   40       CONTINUE\n   50    CONTINUE\n      END IF\n*\n   60 CONTINUE\n      LSERES = .TRUE.\n      GO TO 80\n   70 CONTINUE\n      LSERES = .FALSE.\n   80 RETURN\n*\n*     End of LSERES.\n*\n      END\n      REAL FUNCTION SBEG( RESET )\n*\n*  Generates random numbers uniformly distributed between -0.5 and 0.5.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Scalar Arguments ..\n      LOGICAL            RESET\n*     .. Local Scalars ..\n      INTEGER            I, IC, MI\n*     .. Save statement ..\n      SAVE               I, IC, MI\n*     .. Intrinsic Functions ..\n      INTRINSIC          REAL\n*     .. Executable Statements ..\n      IF( RESET )THEN\n*        Initialize local variables.\n         MI = 891\n         I = 7\n         IC = 0\n         RESET = .FALSE.\n      END IF\n*\n*     The sequence of values of I is bounded between 1 and 999.\n*     If initial I = 1,2,3,6,7 or 9, the period will be 50.\n*     If initial I = 4 or 8, the period will be 25.\n*     If initial I = 5, the period will be 10.\n*     IC is used to break up the period by skipping 1 value of I in 6.\n*\n      IC = IC + 1\n   10 I = I*MI\n      I = I - 1000*( I/1000 )\n      IF( IC.GE.5 )THEN\n         IC = 0\n         GO TO 10\n      END IF\n      SBEG = REAL( I - 500 )/1001.0\n      RETURN\n*\n*     End of SBEG.\n*\n      END\n      REAL FUNCTION SDIFF( X, Y )\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*\n*     .. Scalar Arguments ..\n      REAL               X, Y\n*     .. Executable Statements ..\n      SDIFF = X - Y\n      RETURN\n*\n*     End of SDIFF.\n*\n      END\n      SUBROUTINE CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n*\n*  Tests whether XERBLA has detected an error when it should.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Scalar Arguments ..\n      INTEGER            INFOT, NOUT\n      LOGICAL            LERR, OK\n      CHARACTER*6        SRNAMT\n*     .. Executable Statements ..\n      IF( .NOT.LERR )THEN\n         WRITE( NOUT, FMT = 9999 )INFOT, SRNAMT\n         OK = .FALSE.\n      END IF\n      LERR = .FALSE.\n      RETURN\n*\n 9999 FORMAT( ' ***** ILLEGAL VALUE OF PARAMETER NUMBER ', I2, ' NOT D',\n     $      'ETECTED BY ', A6, ' *****' )\n*\n*     End of CHKXER.\n*\n      END\n      SUBROUTINE XERBLA( SRNAME, INFO )\n*\n*  This is a special version of XERBLA to be used only as part of\n*  the test program for testing error exits from the Level 2 BLAS\n*  routines.\n*\n*  XERBLA  is an error handler for the Level 2 BLAS routines.\n*\n*  It is called by the Level 2 BLAS routines if an input parameter is\n*  invalid.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Scalar Arguments ..\n      INTEGER            INFO\n      CHARACTER*6        SRNAME\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUT\n      LOGICAL            LERR, OK\n      CHARACTER*6        SRNAMT\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUT, OK, LERR\n      COMMON             /SRNAMC/SRNAMT\n*     .. Executable Statements ..\n      LERR = .TRUE.\n      IF( INFO.NE.INFOT )THEN\n         IF( INFOT.NE.0 )THEN\n            WRITE( NOUT, FMT = 9999 )INFO, INFOT\n         ELSE\n            WRITE( NOUT, FMT = 9997 )INFO\n         END IF\n         OK = .FALSE.\n      END IF\n      IF( SRNAME.NE.SRNAMT )THEN\n         WRITE( NOUT, FMT = 9998 )SRNAME, SRNAMT\n         OK = .FALSE.\n      END IF\n      RETURN\n*\n 9999 FORMAT( ' ******* XERBLA WAS CALLED WITH INFO = ', I6, ' INSTEAD',\n     $      ' OF ', I2, ' *******' )\n 9998 FORMAT( ' ******* XERBLA WAS CALLED WITH SRNAME = ', A6, ' INSTE',\n     $      'AD OF ', A6, ' *******' )\n 9997 FORMAT( ' ******* XERBLA WAS CALLED WITH INFO = ', I6,\n     $      ' *******' )\n*\n*     End of XERBLA\n*\n      END\n\n"
  },
  {
    "path": "libs/eigen/blas/testing/sblat3.f",
    "content": "      PROGRAM SBLAT3\n*\n*  Test program for the REAL             Level 3 Blas.\n*\n*  The program must be driven by a short data file. The first 14 records\n*  of the file are read using list-directed input, the last 6 records\n*  are read using the format ( A6, L2 ). An annotated example of a data\n*  file can be obtained by deleting the first 3 characters from the\n*  following 20 lines:\n*  'SBLAT3.SUMM'     NAME OF SUMMARY OUTPUT FILE\n*  6                 UNIT NUMBER OF SUMMARY FILE\n*  'SBLAT3.SNAP'     NAME OF SNAPSHOT OUTPUT FILE\n*  -1                UNIT NUMBER OF SNAPSHOT FILE (NOT USED IF .LT. 0)\n*  F        LOGICAL FLAG, T TO REWIND SNAPSHOT FILE AFTER EACH RECORD.\n*  F        LOGICAL FLAG, T TO STOP ON FAILURES.\n*  T        LOGICAL FLAG, T TO TEST ERROR EXITS.\n*  16.0     THRESHOLD VALUE OF TEST RATIO\n*  6                 NUMBER OF VALUES OF N\n*  0 1 2 3 5 9       VALUES OF N\n*  3                 NUMBER OF VALUES OF ALPHA\n*  0.0 1.0 0.7       VALUES OF ALPHA\n*  3                 NUMBER OF VALUES OF BETA\n*  0.0 1.0 1.3       VALUES OF BETA\n*  SGEMM  T PUT F FOR NO TEST. SAME COLUMNS.\n*  SSYMM  T PUT F FOR NO TEST. SAME COLUMNS.\n*  STRMM  T PUT F FOR NO TEST. SAME COLUMNS.\n*  STRSM  T PUT F FOR NO TEST. SAME COLUMNS.\n*  SSYRK  T PUT F FOR NO TEST. SAME COLUMNS.\n*  SSYR2K T PUT F FOR NO TEST. SAME COLUMNS.\n*\n*  See:\n*\n*     Dongarra J. J., Du Croz J. J., Duff I. S. and Hammarling S.\n*     A Set of Level 3 Basic Linear Algebra Subprograms.\n*\n*     Technical Memorandum No.88 (Revision 1), Mathematics and\n*     Computer Science Division, Argonne National Laboratory, 9700\n*     South Cass Avenue, Argonne, Illinois 60439, US.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Parameters ..\n      INTEGER            NIN\n      PARAMETER          ( NIN = 5 )\n      INTEGER            NSUBS\n      PARAMETER          ( NSUBS = 6 )\n      REAL               ZERO, HALF, ONE\n      PARAMETER          ( ZERO = 0.0, HALF = 0.5, ONE = 1.0 )\n      INTEGER            NMAX\n      PARAMETER          ( NMAX = 65 )\n      INTEGER            NIDMAX, NALMAX, NBEMAX\n      PARAMETER          ( NIDMAX = 9, NALMAX = 7, NBEMAX = 7 )\n*     .. Local Scalars ..\n      REAL               EPS, ERR, THRESH\n      INTEGER            I, ISNUM, J, N, NALF, NBET, NIDIM, NOUT, NTRA\n      LOGICAL            FATAL, LTESTT, REWI, SAME, SFATAL, TRACE,\n     $                   TSTERR\n      CHARACTER*1        TRANSA, TRANSB\n      CHARACTER*6        SNAMET\n      CHARACTER*32       SNAPS, SUMMRY\n*     .. Local Arrays ..\n      REAL               AA( NMAX*NMAX ), AB( NMAX, 2*NMAX ),\n     $                   ALF( NALMAX ), AS( NMAX*NMAX ),\n     $                   BB( NMAX*NMAX ), BET( NBEMAX ),\n     $                   BS( NMAX*NMAX ), C( NMAX, NMAX ),\n     $                   CC( NMAX*NMAX ), CS( NMAX*NMAX ), CT( NMAX ),\n     $                   G( NMAX ), W( 2*NMAX )\n      INTEGER            IDIM( NIDMAX )\n      LOGICAL            LTEST( NSUBS )\n      CHARACTER*6        SNAMES( NSUBS )\n*     .. External Functions ..\n      REAL               SDIFF\n      LOGICAL            LSE\n      EXTERNAL           SDIFF, LSE\n*     .. External Subroutines ..\n      EXTERNAL           SCHK1, SCHK2, SCHK3, SCHK4, SCHK5, SCHKE, SMMCH\n*     .. Intrinsic Functions ..\n      INTRINSIC          MAX, MIN\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n      CHARACTER*6        SRNAMT\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n      COMMON             /SRNAMC/SRNAMT\n*     .. Data statements ..\n      DATA               SNAMES/'SGEMM ', 'SSYMM ', 'STRMM ', 'STRSM ',\n     $                   'SSYRK ', 'SSYR2K'/\n*     .. Executable Statements ..\n*\n*     Read name and unit number for summary output file and open file.\n*\n      READ( NIN, FMT = * )SUMMRY\n      READ( NIN, FMT = * )NOUT\n      OPEN( NOUT, FILE = SUMMRY, STATUS = 'NEW' )\n      NOUTC = NOUT\n*\n*     Read name and unit number for snapshot output file and open file.\n*\n      READ( NIN, FMT = * )SNAPS\n      READ( NIN, FMT = * )NTRA\n      TRACE = NTRA.GE.0\n      IF( TRACE )THEN\n         OPEN( NTRA, FILE = SNAPS, STATUS = 'NEW' )\n      END IF\n*     Read the flag that directs rewinding of the snapshot file.\n      READ( NIN, FMT = * )REWI\n      REWI = REWI.AND.TRACE\n*     Read the flag that directs stopping on any failure.\n      READ( NIN, FMT = * )SFATAL\n*     Read the flag that indicates whether error exits are to be tested.\n      READ( NIN, FMT = * )TSTERR\n*     Read the threshold value of the test ratio\n      READ( NIN, FMT = * )THRESH\n*\n*     Read and check the parameter values for the tests.\n*\n*     Values of N\n      READ( NIN, FMT = * )NIDIM\n      IF( NIDIM.LT.1.OR.NIDIM.GT.NIDMAX )THEN\n         WRITE( NOUT, FMT = 9997 )'N', NIDMAX\n         GO TO 220\n      END IF\n      READ( NIN, FMT = * )( IDIM( I ), I = 1, NIDIM )\n      DO 10 I = 1, NIDIM\n         IF( IDIM( I ).LT.0.OR.IDIM( I ).GT.NMAX )THEN\n            WRITE( NOUT, FMT = 9996 )NMAX\n            GO TO 220\n         END IF\n   10 CONTINUE\n*     Values of ALPHA\n      READ( NIN, FMT = * )NALF\n      IF( NALF.LT.1.OR.NALF.GT.NALMAX )THEN\n         WRITE( NOUT, FMT = 9997 )'ALPHA', NALMAX\n         GO TO 220\n      END IF\n      READ( NIN, FMT = * )( ALF( I ), I = 1, NALF )\n*     Values of BETA\n      READ( NIN, FMT = * )NBET\n      IF( NBET.LT.1.OR.NBET.GT.NBEMAX )THEN\n         WRITE( NOUT, FMT = 9997 )'BETA', NBEMAX\n         GO TO 220\n      END IF\n      READ( NIN, FMT = * )( BET( I ), I = 1, NBET )\n*\n*     Report values of parameters.\n*\n      WRITE( NOUT, FMT = 9995 )\n      WRITE( NOUT, FMT = 9994 )( IDIM( I ), I = 1, NIDIM )\n      WRITE( NOUT, FMT = 9993 )( ALF( I ), I = 1, NALF )\n      WRITE( NOUT, FMT = 9992 )( BET( I ), I = 1, NBET )\n      IF( .NOT.TSTERR )THEN\n         WRITE( NOUT, FMT = * )\n         WRITE( NOUT, FMT = 9984 )\n      END IF\n      WRITE( NOUT, FMT = * )\n      WRITE( NOUT, FMT = 9999 )THRESH\n      WRITE( NOUT, FMT = * )\n*\n*     Read names of subroutines and flags which indicate\n*     whether they are to be tested.\n*\n      DO 20 I = 1, NSUBS\n         LTEST( I ) = .FALSE.\n   20 CONTINUE\n   30 READ( NIN, FMT = 9988, END = 60 )SNAMET, LTESTT\n      DO 40 I = 1, NSUBS\n         IF( SNAMET.EQ.SNAMES( I ) )\n     $      GO TO 50\n   40 CONTINUE\n      WRITE( NOUT, FMT = 9990 )SNAMET\n      STOP\n   50 LTEST( I ) = LTESTT\n      GO TO 30\n*\n   60 CONTINUE\n      CLOSE ( NIN )\n*\n*     Compute EPS (the machine precision).\n*\n      EPS = ONE\n   70 CONTINUE\n      IF( SDIFF( ONE + EPS, ONE ).EQ.ZERO )\n     $   GO TO 80\n      EPS = HALF*EPS\n      GO TO 70\n   80 CONTINUE\n      EPS = EPS + EPS\n      WRITE( NOUT, FMT = 9998 )EPS\n*\n*     Check the reliability of SMMCH using exact data.\n*\n      N = MIN( 32, NMAX )\n      DO 100 J = 1, N\n         DO 90 I = 1, N\n            AB( I, J ) = MAX( I - J + 1, 0 )\n   90    CONTINUE\n         AB( J, NMAX + 1 ) = J\n         AB( 1, NMAX + J ) = J\n         C( J, 1 ) = ZERO\n  100 CONTINUE\n      DO 110 J = 1, N\n         CC( J ) = J*( ( J + 1 )*J )/2 - ( ( J + 1 )*J*( J - 1 ) )/3\n  110 CONTINUE\n*     CC holds the exact result. On exit from SMMCH CT holds\n*     the result computed by SMMCH.\n      TRANSA = 'N'\n      TRANSB = 'N'\n      CALL SMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX,\n     $            AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC,\n     $            NMAX, EPS, ERR, FATAL, NOUT, .TRUE. )\n      SAME = LSE( CC, CT, N )\n      IF( .NOT.SAME.OR.ERR.NE.ZERO )THEN\n         WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR\n         STOP\n      END IF\n      TRANSB = 'T'\n      CALL SMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX,\n     $            AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC,\n     $            NMAX, EPS, ERR, FATAL, NOUT, .TRUE. )\n      SAME = LSE( CC, CT, N )\n      IF( .NOT.SAME.OR.ERR.NE.ZERO )THEN\n         WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR\n         STOP\n      END IF\n      DO 120 J = 1, N\n         AB( J, NMAX + 1 ) = N - J + 1\n         AB( 1, NMAX + J ) = N - J + 1\n  120 CONTINUE\n      DO 130 J = 1, N\n         CC( N - J + 1 ) = J*( ( J + 1 )*J )/2 -\n     $                     ( ( J + 1 )*J*( J - 1 ) )/3\n  130 CONTINUE\n      TRANSA = 'T'\n      TRANSB = 'N'\n      CALL SMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX,\n     $            AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC,\n     $            NMAX, EPS, ERR, FATAL, NOUT, .TRUE. )\n      SAME = LSE( CC, CT, N )\n      IF( .NOT.SAME.OR.ERR.NE.ZERO )THEN\n         WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR\n         STOP\n      END IF\n      TRANSB = 'T'\n      CALL SMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX,\n     $            AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC,\n     $            NMAX, EPS, ERR, FATAL, NOUT, .TRUE. )\n      SAME = LSE( CC, CT, N )\n      IF( .NOT.SAME.OR.ERR.NE.ZERO )THEN\n         WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR\n         STOP\n      END IF\n*\n*     Test each subroutine in turn.\n*\n      DO 200 ISNUM = 1, NSUBS\n         WRITE( NOUT, FMT = * )\n         IF( .NOT.LTEST( ISNUM ) )THEN\n*           Subprogram is not to be tested.\n            WRITE( NOUT, FMT = 9987 )SNAMES( ISNUM )\n         ELSE\n            SRNAMT = SNAMES( ISNUM )\n*           Test error exits.\n            IF( TSTERR )THEN\n               CALL SCHKE( ISNUM, SNAMES( ISNUM ), NOUT )\n               WRITE( NOUT, FMT = * )\n            END IF\n*           Test computations.\n            INFOT = 0\n            OK = .TRUE.\n            FATAL = .FALSE.\n            GO TO ( 140, 150, 160, 160, 170, 180 )ISNUM\n*           Test SGEMM, 01.\n  140       CALL SCHK1( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,\n     $                  NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C,\n     $                  CC, CS, CT, G )\n            GO TO 190\n*           Test SSYMM, 02.\n  150       CALL SCHK2( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,\n     $                  NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C,\n     $                  CC, CS, CT, G )\n            GO TO 190\n*           Test STRMM, 03, STRSM, 04.\n  160       CALL SCHK3( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NMAX, AB,\n     $                  AA, AS, AB( 1, NMAX + 1 ), BB, BS, CT, G, C )\n            GO TO 190\n*           Test SSYRK, 05.\n  170       CALL SCHK4( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,\n     $                  NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C,\n     $                  CC, CS, CT, G )\n            GO TO 190\n*           Test SSYR2K, 06.\n  180       CALL SCHK5( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,\n     $                  NMAX, AB, AA, AS, BB, BS, C, CC, CS, CT, G, W )\n            GO TO 190\n*\n  190       IF( FATAL.AND.SFATAL )\n     $         GO TO 210\n         END IF\n  200 CONTINUE\n      WRITE( NOUT, FMT = 9986 )\n      GO TO 230\n*\n  210 CONTINUE\n      WRITE( NOUT, FMT = 9985 )\n      GO TO 230\n*\n  220 CONTINUE\n      WRITE( NOUT, FMT = 9991 )\n*\n  230 CONTINUE\n      IF( TRACE )\n     $   CLOSE ( NTRA )\n      CLOSE ( NOUT )\n      STOP\n*\n 9999 FORMAT( ' ROUTINES PASS COMPUTATIONAL TESTS IF TEST RATIO IS LES',\n     $      'S THAN', F8.2 )\n 9998 FORMAT( ' RELATIVE MACHINE PRECISION IS TAKEN TO BE', 1P, E9.1 )\n 9997 FORMAT( ' NUMBER OF VALUES OF ', A, ' IS LESS THAN 1 OR GREATER ',\n     $      'THAN ', I2 )\n 9996 FORMAT( ' VALUE OF N IS LESS THAN 0 OR GREATER THAN ', I2 )\n 9995 FORMAT( ' TESTS OF THE REAL             LEVEL 3 BLAS', //' THE F',\n     $      'OLLOWING PARAMETER VALUES WILL BE USED:' )\n 9994 FORMAT( '   FOR N              ', 9I6 )\n 9993 FORMAT( '   FOR ALPHA          ', 7F6.1 )\n 9992 FORMAT( '   FOR BETA           ', 7F6.1 )\n 9991 FORMAT( ' AMEND DATA FILE OR INCREASE ARRAY SIZES IN PROGRAM',\n     $      /' ******* TESTS ABANDONED *******' )\n 9990 FORMAT( ' SUBPROGRAM NAME ', A6, ' NOT RECOGNIZED', /' ******* T',\n     $      'ESTS ABANDONED *******' )\n 9989 FORMAT( ' ERROR IN SMMCH -  IN-LINE DOT PRODUCTS ARE BEING EVALU',\n     $      'ATED WRONGLY.', /' SMMCH WAS CALLED WITH TRANSA = ', A1,\n     $      ' AND TRANSB = ', A1, /' AND RETURNED SAME = ', L1, ' AND ',\n     $      'ERR = ', F12.3, '.', /' THIS MAY BE DUE TO FAULTS IN THE ',\n     $      'ARITHMETIC OR THE COMPILER.', /' ******* TESTS ABANDONED ',\n     $      '*******' )\n 9988 FORMAT( A6, L2 )\n 9987 FORMAT( 1X, A6, ' WAS NOT TESTED' )\n 9986 FORMAT( /' END OF TESTS' )\n 9985 FORMAT( /' ******* FATAL ERROR - TESTS ABANDONED *******' )\n 9984 FORMAT( ' ERROR-EXITS WILL NOT BE TESTED' )\n*\n*     End of SBLAT3.\n*\n      END\n      SUBROUTINE SCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX,\n     $                  A, AA, AS, B, BB, BS, C, CC, CS, CT, G )\n*\n*  Tests SGEMM.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Parameters ..\n      REAL               ZERO\n      PARAMETER          ( ZERO = 0.0 )\n*     .. Scalar Arguments ..\n      REAL               EPS, THRESH\n      INTEGER            NALF, NBET, NIDIM, NMAX, NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      REAL               A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),\n     $                   AS( NMAX*NMAX ), B( NMAX, NMAX ),\n     $                   BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ),\n     $                   C( NMAX, NMAX ), CC( NMAX*NMAX ),\n     $                   CS( NMAX*NMAX ), CT( NMAX ), G( NMAX )\n      INTEGER            IDIM( NIDIM )\n*     .. Local Scalars ..\n      REAL               ALPHA, ALS, BETA, BLS, ERR, ERRMAX\n      INTEGER            I, IA, IB, ICA, ICB, IK, IM, IN, K, KS, LAA,\n     $                   LBB, LCC, LDA, LDAS, LDB, LDBS, LDC, LDCS, M,\n     $                   MA, MB, MS, N, NA, NARGS, NB, NC, NS\n      LOGICAL            NULL, RESET, SAME, TRANA, TRANB\n      CHARACTER*1        TRANAS, TRANBS, TRANSA, TRANSB\n      CHARACTER*3        ICH\n*     .. Local Arrays ..\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LSE, LSERES\n      EXTERNAL           LSE, LSERES\n*     .. External Subroutines ..\n      EXTERNAL           SGEMM, SMAKE, SMMCH\n*     .. Intrinsic Functions ..\n      INTRINSIC          MAX\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Data statements ..\n      DATA               ICH/'NTC'/\n*     .. Executable Statements ..\n*\n      NARGS = 13\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = ZERO\n*\n      DO 110 IM = 1, NIDIM\n         M = IDIM( IM )\n*\n         DO 100 IN = 1, NIDIM\n            N = IDIM( IN )\n*           Set LDC to 1 more than minimum value if room.\n            LDC = M\n            IF( LDC.LT.NMAX )\n     $         LDC = LDC + 1\n*           Skip tests if not enough room.\n            IF( LDC.GT.NMAX )\n     $         GO TO 100\n            LCC = LDC*N\n            NULL = N.LE.0.OR.M.LE.0\n*\n            DO 90 IK = 1, NIDIM\n               K = IDIM( IK )\n*\n               DO 80 ICA = 1, 3\n                  TRANSA = ICH( ICA: ICA )\n                  TRANA = TRANSA.EQ.'T'.OR.TRANSA.EQ.'C'\n*\n                  IF( TRANA )THEN\n                     MA = K\n                     NA = M\n                  ELSE\n                     MA = M\n                     NA = K\n                  END IF\n*                 Set LDA to 1 more than minimum value if room.\n                  LDA = MA\n                  IF( LDA.LT.NMAX )\n     $               LDA = LDA + 1\n*                 Skip tests if not enough room.\n                  IF( LDA.GT.NMAX )\n     $               GO TO 80\n                  LAA = LDA*NA\n*\n*                 Generate the matrix A.\n*\n                  CALL SMAKE( 'GE', ' ', ' ', MA, NA, A, NMAX, AA, LDA,\n     $                        RESET, ZERO )\n*\n                  DO 70 ICB = 1, 3\n                     TRANSB = ICH( ICB: ICB )\n                     TRANB = TRANSB.EQ.'T'.OR.TRANSB.EQ.'C'\n*\n                     IF( TRANB )THEN\n                        MB = N\n                        NB = K\n                     ELSE\n                        MB = K\n                        NB = N\n                     END IF\n*                    Set LDB to 1 more than minimum value if room.\n                     LDB = MB\n                     IF( LDB.LT.NMAX )\n     $                  LDB = LDB + 1\n*                    Skip tests if not enough room.\n                     IF( LDB.GT.NMAX )\n     $                  GO TO 70\n                     LBB = LDB*NB\n*\n*                    Generate the matrix B.\n*\n                     CALL SMAKE( 'GE', ' ', ' ', MB, NB, B, NMAX, BB,\n     $                           LDB, RESET, ZERO )\n*\n                     DO 60 IA = 1, NALF\n                        ALPHA = ALF( IA )\n*\n                        DO 50 IB = 1, NBET\n                           BETA = BET( IB )\n*\n*                          Generate the matrix C.\n*\n                           CALL SMAKE( 'GE', ' ', ' ', M, N, C, NMAX,\n     $                                 CC, LDC, RESET, ZERO )\n*\n                           NC = NC + 1\n*\n*                          Save every datum before calling the\n*                          subroutine.\n*\n                           TRANAS = TRANSA\n                           TRANBS = TRANSB\n                           MS = M\n                           NS = N\n                           KS = K\n                           ALS = ALPHA\n                           DO 10 I = 1, LAA\n                              AS( I ) = AA( I )\n   10                      CONTINUE\n                           LDAS = LDA\n                           DO 20 I = 1, LBB\n                              BS( I ) = BB( I )\n   20                      CONTINUE\n                           LDBS = LDB\n                           BLS = BETA\n                           DO 30 I = 1, LCC\n                              CS( I ) = CC( I )\n   30                      CONTINUE\n                           LDCS = LDC\n*\n*                          Call the subroutine.\n*\n                           IF( TRACE )\n     $                        WRITE( NTRA, FMT = 9995 )NC, SNAME,\n     $                        TRANSA, TRANSB, M, N, K, ALPHA, LDA, LDB,\n     $                        BETA, LDC\n                           IF( REWI )\n     $                        REWIND NTRA\n                           CALL SGEMM( TRANSA, TRANSB, M, N, K, ALPHA,\n     $                                 AA, LDA, BB, LDB, BETA, CC, LDC )\n*\n*                          Check if error-exit was taken incorrectly.\n*\n                           IF( .NOT.OK )THEN\n                              WRITE( NOUT, FMT = 9994 )\n                              FATAL = .TRUE.\n                              GO TO 120\n                           END IF\n*\n*                          See what data changed inside subroutines.\n*\n                           ISAME( 1 ) = TRANSA.EQ.TRANAS\n                           ISAME( 2 ) = TRANSB.EQ.TRANBS\n                           ISAME( 3 ) = MS.EQ.M\n                           ISAME( 4 ) = NS.EQ.N\n                           ISAME( 5 ) = KS.EQ.K\n                           ISAME( 6 ) = ALS.EQ.ALPHA\n                           ISAME( 7 ) = LSE( AS, AA, LAA )\n                           ISAME( 8 ) = LDAS.EQ.LDA\n                           ISAME( 9 ) = LSE( BS, BB, LBB )\n                           ISAME( 10 ) = LDBS.EQ.LDB\n                           ISAME( 11 ) = BLS.EQ.BETA\n                           IF( NULL )THEN\n                              ISAME( 12 ) = LSE( CS, CC, LCC )\n                           ELSE\n                              ISAME( 12 ) = LSERES( 'GE', ' ', M, N, CS,\n     $                                      CC, LDC )\n                           END IF\n                           ISAME( 13 ) = LDCS.EQ.LDC\n*\n*                          If data was incorrectly changed, report\n*                          and return.\n*\n                           SAME = .TRUE.\n                           DO 40 I = 1, NARGS\n                              SAME = SAME.AND.ISAME( I )\n                              IF( .NOT.ISAME( I ) )\n     $                           WRITE( NOUT, FMT = 9998 )I\n   40                      CONTINUE\n                           IF( .NOT.SAME )THEN\n                              FATAL = .TRUE.\n                              GO TO 120\n                           END IF\n*\n                           IF( .NOT.NULL )THEN\n*\n*                             Check the result.\n*\n                              CALL SMMCH( TRANSA, TRANSB, M, N, K,\n     $                                    ALPHA, A, NMAX, B, NMAX, BETA,\n     $                                    C, NMAX, CT, G, CC, LDC, EPS,\n     $                                    ERR, FATAL, NOUT, .TRUE. )\n                              ERRMAX = MAX( ERRMAX, ERR )\n*                             If got really bad answer, report and\n*                             return.\n                              IF( FATAL )\n     $                           GO TO 120\n                           END IF\n*\n   50                   CONTINUE\n*\n   60                CONTINUE\n*\n   70             CONTINUE\n*\n   80          CONTINUE\n*\n   90       CONTINUE\n*\n  100    CONTINUE\n*\n  110 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 130\n*\n  120 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      WRITE( NOUT, FMT = 9995 )NC, SNAME, TRANSA, TRANSB, M, N, K,\n     $   ALPHA, LDA, LDB, BETA, LDC\n*\n  130 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',''', A1, ''',',\n     $      3( I3, ',' ), F4.1, ', A,', I3, ', B,', I3, ',', F4.1, ', ',\n     $      'C,', I3, ').' )\n 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of SCHK1.\n*\n      END\n      SUBROUTINE SCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX,\n     $                  A, AA, AS, B, BB, BS, C, CC, CS, CT, G )\n*\n*  Tests SSYMM.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Parameters ..\n      REAL               ZERO\n      PARAMETER          ( ZERO = 0.0 )\n*     .. Scalar Arguments ..\n      REAL               EPS, THRESH\n      INTEGER            NALF, NBET, NIDIM, NMAX, NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      REAL               A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),\n     $                   AS( NMAX*NMAX ), B( NMAX, NMAX ),\n     $                   BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ),\n     $                   C( NMAX, NMAX ), CC( NMAX*NMAX ),\n     $                   CS( NMAX*NMAX ), CT( NMAX ), G( NMAX )\n      INTEGER            IDIM( NIDIM )\n*     .. Local Scalars ..\n      REAL               ALPHA, ALS, BETA, BLS, ERR, ERRMAX\n      INTEGER            I, IA, IB, ICS, ICU, IM, IN, LAA, LBB, LCC,\n     $                   LDA, LDAS, LDB, LDBS, LDC, LDCS, M, MS, N, NA,\n     $                   NARGS, NC, NS\n      LOGICAL            LEFT, NULL, RESET, SAME\n      CHARACTER*1        SIDE, SIDES, UPLO, UPLOS\n      CHARACTER*2        ICHS, ICHU\n*     .. Local Arrays ..\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LSE, LSERES\n      EXTERNAL           LSE, LSERES\n*     .. External Subroutines ..\n      EXTERNAL           SMAKE, SMMCH, SSYMM\n*     .. Intrinsic Functions ..\n      INTRINSIC          MAX\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Data statements ..\n      DATA               ICHS/'LR'/, ICHU/'UL'/\n*     .. Executable Statements ..\n*\n      NARGS = 12\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = ZERO\n*\n      DO 100 IM = 1, NIDIM\n         M = IDIM( IM )\n*\n         DO 90 IN = 1, NIDIM\n            N = IDIM( IN )\n*           Set LDC to 1 more than minimum value if room.\n            LDC = M\n            IF( LDC.LT.NMAX )\n     $         LDC = LDC + 1\n*           Skip tests if not enough room.\n            IF( LDC.GT.NMAX )\n     $         GO TO 90\n            LCC = LDC*N\n            NULL = N.LE.0.OR.M.LE.0\n*\n*           Set LDB to 1 more than minimum value if room.\n            LDB = M\n            IF( LDB.LT.NMAX )\n     $         LDB = LDB + 1\n*           Skip tests if not enough room.\n            IF( LDB.GT.NMAX )\n     $         GO TO 90\n            LBB = LDB*N\n*\n*           Generate the matrix B.\n*\n            CALL SMAKE( 'GE', ' ', ' ', M, N, B, NMAX, BB, LDB, RESET,\n     $                  ZERO )\n*\n            DO 80 ICS = 1, 2\n               SIDE = ICHS( ICS: ICS )\n               LEFT = SIDE.EQ.'L'\n*\n               IF( LEFT )THEN\n                  NA = M\n               ELSE\n                  NA = N\n               END IF\n*              Set LDA to 1 more than minimum value if room.\n               LDA = NA\n               IF( LDA.LT.NMAX )\n     $            LDA = LDA + 1\n*              Skip tests if not enough room.\n               IF( LDA.GT.NMAX )\n     $            GO TO 80\n               LAA = LDA*NA\n*\n               DO 70 ICU = 1, 2\n                  UPLO = ICHU( ICU: ICU )\n*\n*                 Generate the symmetric matrix A.\n*\n                  CALL SMAKE( 'SY', UPLO, ' ', NA, NA, A, NMAX, AA, LDA,\n     $                        RESET, ZERO )\n*\n                  DO 60 IA = 1, NALF\n                     ALPHA = ALF( IA )\n*\n                     DO 50 IB = 1, NBET\n                        BETA = BET( IB )\n*\n*                       Generate the matrix C.\n*\n                        CALL SMAKE( 'GE', ' ', ' ', M, N, C, NMAX, CC,\n     $                              LDC, RESET, ZERO )\n*\n                        NC = NC + 1\n*\n*                       Save every datum before calling the\n*                       subroutine.\n*\n                        SIDES = SIDE\n                        UPLOS = UPLO\n                        MS = M\n                        NS = N\n                        ALS = ALPHA\n                        DO 10 I = 1, LAA\n                           AS( I ) = AA( I )\n   10                   CONTINUE\n                        LDAS = LDA\n                        DO 20 I = 1, LBB\n                           BS( I ) = BB( I )\n   20                   CONTINUE\n                        LDBS = LDB\n                        BLS = BETA\n                        DO 30 I = 1, LCC\n                           CS( I ) = CC( I )\n   30                   CONTINUE\n                        LDCS = LDC\n*\n*                       Call the subroutine.\n*\n                        IF( TRACE )\n     $                     WRITE( NTRA, FMT = 9995 )NC, SNAME, SIDE,\n     $                     UPLO, M, N, ALPHA, LDA, LDB, BETA, LDC\n                        IF( REWI )\n     $                     REWIND NTRA\n                        CALL SSYMM( SIDE, UPLO, M, N, ALPHA, AA, LDA,\n     $                              BB, LDB, BETA, CC, LDC )\n*\n*                       Check if error-exit was taken incorrectly.\n*\n                        IF( .NOT.OK )THEN\n                           WRITE( NOUT, FMT = 9994 )\n                           FATAL = .TRUE.\n                           GO TO 110\n                        END IF\n*\n*                       See what data changed inside subroutines.\n*\n                        ISAME( 1 ) = SIDES.EQ.SIDE\n                        ISAME( 2 ) = UPLOS.EQ.UPLO\n                        ISAME( 3 ) = MS.EQ.M\n                        ISAME( 4 ) = NS.EQ.N\n                        ISAME( 5 ) = ALS.EQ.ALPHA\n                        ISAME( 6 ) = LSE( AS, AA, LAA )\n                        ISAME( 7 ) = LDAS.EQ.LDA\n                        ISAME( 8 ) = LSE( BS, BB, LBB )\n                        ISAME( 9 ) = LDBS.EQ.LDB\n                        ISAME( 10 ) = BLS.EQ.BETA\n                        IF( NULL )THEN\n                           ISAME( 11 ) = LSE( CS, CC, LCC )\n                        ELSE\n                           ISAME( 11 ) = LSERES( 'GE', ' ', M, N, CS,\n     $                                   CC, LDC )\n                        END IF\n                        ISAME( 12 ) = LDCS.EQ.LDC\n*\n*                       If data was incorrectly changed, report and\n*                       return.\n*\n                        SAME = .TRUE.\n                        DO 40 I = 1, NARGS\n                           SAME = SAME.AND.ISAME( I )\n                           IF( .NOT.ISAME( I ) )\n     $                        WRITE( NOUT, FMT = 9998 )I\n   40                   CONTINUE\n                        IF( .NOT.SAME )THEN\n                           FATAL = .TRUE.\n                           GO TO 110\n                        END IF\n*\n                        IF( .NOT.NULL )THEN\n*\n*                          Check the result.\n*\n                           IF( LEFT )THEN\n                              CALL SMMCH( 'N', 'N', M, N, M, ALPHA, A,\n     $                                    NMAX, B, NMAX, BETA, C, NMAX,\n     $                                    CT, G, CC, LDC, EPS, ERR,\n     $                                    FATAL, NOUT, .TRUE. )\n                           ELSE\n                              CALL SMMCH( 'N', 'N', M, N, N, ALPHA, B,\n     $                                    NMAX, A, NMAX, BETA, C, NMAX,\n     $                                    CT, G, CC, LDC, EPS, ERR,\n     $                                    FATAL, NOUT, .TRUE. )\n                           END IF\n                           ERRMAX = MAX( ERRMAX, ERR )\n*                          If got really bad answer, report and\n*                          return.\n                           IF( FATAL )\n     $                        GO TO 110\n                        END IF\n*\n   50                CONTINUE\n*\n   60             CONTINUE\n*\n   70          CONTINUE\n*\n   80       CONTINUE\n*\n   90    CONTINUE\n*\n  100 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 120\n*\n  110 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      WRITE( NOUT, FMT = 9995 )NC, SNAME, SIDE, UPLO, M, N, ALPHA, LDA,\n     $   LDB, BETA, LDC\n*\n  120 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ),\n     $      F4.1, ', A,', I3, ', B,', I3, ',', F4.1, ', C,', I3, ')   ',\n     $      ' .' )\n 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of SCHK2.\n*\n      END\n      SUBROUTINE SCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NALF, ALF, NMAX, A, AA, AS,\n     $                  B, BB, BS, CT, G, C )\n*\n*  Tests STRMM and STRSM.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Parameters ..\n      REAL               ZERO, ONE\n      PARAMETER          ( ZERO = 0.0, ONE = 1.0 )\n*     .. Scalar Arguments ..\n      REAL               EPS, THRESH\n      INTEGER            NALF, NIDIM, NMAX, NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      REAL               A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),\n     $                   AS( NMAX*NMAX ), B( NMAX, NMAX ),\n     $                   BB( NMAX*NMAX ), BS( NMAX*NMAX ),\n     $                   C( NMAX, NMAX ), CT( NMAX ), G( NMAX )\n      INTEGER            IDIM( NIDIM )\n*     .. Local Scalars ..\n      REAL               ALPHA, ALS, ERR, ERRMAX\n      INTEGER            I, IA, ICD, ICS, ICT, ICU, IM, IN, J, LAA, LBB,\n     $                   LDA, LDAS, LDB, LDBS, M, MS, N, NA, NARGS, NC,\n     $                   NS\n      LOGICAL            LEFT, NULL, RESET, SAME\n      CHARACTER*1        DIAG, DIAGS, SIDE, SIDES, TRANAS, TRANSA, UPLO,\n     $                   UPLOS\n      CHARACTER*2        ICHD, ICHS, ICHU\n      CHARACTER*3        ICHT\n*     .. Local Arrays ..\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LSE, LSERES\n      EXTERNAL           LSE, LSERES\n*     .. External Subroutines ..\n      EXTERNAL           SMAKE, SMMCH, STRMM, STRSM\n*     .. Intrinsic Functions ..\n      INTRINSIC          MAX\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Data statements ..\n      DATA               ICHU/'UL'/, ICHT/'NTC'/, ICHD/'UN'/, ICHS/'LR'/\n*     .. Executable Statements ..\n*\n      NARGS = 11\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = ZERO\n*     Set up zero matrix for SMMCH.\n      DO 20 J = 1, NMAX\n         DO 10 I = 1, NMAX\n            C( I, J ) = ZERO\n   10    CONTINUE\n   20 CONTINUE\n*\n      DO 140 IM = 1, NIDIM\n         M = IDIM( IM )\n*\n         DO 130 IN = 1, NIDIM\n            N = IDIM( IN )\n*           Set LDB to 1 more than minimum value if room.\n            LDB = M\n            IF( LDB.LT.NMAX )\n     $         LDB = LDB + 1\n*           Skip tests if not enough room.\n            IF( LDB.GT.NMAX )\n     $         GO TO 130\n            LBB = LDB*N\n            NULL = M.LE.0.OR.N.LE.0\n*\n            DO 120 ICS = 1, 2\n               SIDE = ICHS( ICS: ICS )\n               LEFT = SIDE.EQ.'L'\n               IF( LEFT )THEN\n                  NA = M\n               ELSE\n                  NA = N\n               END IF\n*              Set LDA to 1 more than minimum value if room.\n               LDA = NA\n               IF( LDA.LT.NMAX )\n     $            LDA = LDA + 1\n*              Skip tests if not enough room.\n               IF( LDA.GT.NMAX )\n     $            GO TO 130\n               LAA = LDA*NA\n*\n               DO 110 ICU = 1, 2\n                  UPLO = ICHU( ICU: ICU )\n*\n                  DO 100 ICT = 1, 3\n                     TRANSA = ICHT( ICT: ICT )\n*\n                     DO 90 ICD = 1, 2\n                        DIAG = ICHD( ICD: ICD )\n*\n                        DO 80 IA = 1, NALF\n                           ALPHA = ALF( IA )\n*\n*                          Generate the matrix A.\n*\n                           CALL SMAKE( 'TR', UPLO, DIAG, NA, NA, A,\n     $                                 NMAX, AA, LDA, RESET, ZERO )\n*\n*                          Generate the matrix B.\n*\n                           CALL SMAKE( 'GE', ' ', ' ', M, N, B, NMAX,\n     $                                 BB, LDB, RESET, ZERO )\n*\n                           NC = NC + 1\n*\n*                          Save every datum before calling the\n*                          subroutine.\n*\n                           SIDES = SIDE\n                           UPLOS = UPLO\n                           TRANAS = TRANSA\n                           DIAGS = DIAG\n                           MS = M\n                           NS = N\n                           ALS = ALPHA\n                           DO 30 I = 1, LAA\n                              AS( I ) = AA( I )\n   30                      CONTINUE\n                           LDAS = LDA\n                           DO 40 I = 1, LBB\n                              BS( I ) = BB( I )\n   40                      CONTINUE\n                           LDBS = LDB\n*\n*                          Call the subroutine.\n*\n                           IF( SNAME( 4: 5 ).EQ.'MM' )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9995 )NC, SNAME,\n     $                           SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA,\n     $                           LDA, LDB\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL STRMM( SIDE, UPLO, TRANSA, DIAG, M,\n     $                                    N, ALPHA, AA, LDA, BB, LDB )\n                           ELSE IF( SNAME( 4: 5 ).EQ.'SM' )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9995 )NC, SNAME,\n     $                           SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA,\n     $                           LDA, LDB\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL STRSM( SIDE, UPLO, TRANSA, DIAG, M,\n     $                                    N, ALPHA, AA, LDA, BB, LDB )\n                           END IF\n*\n*                          Check if error-exit was taken incorrectly.\n*\n                           IF( .NOT.OK )THEN\n                              WRITE( NOUT, FMT = 9994 )\n                              FATAL = .TRUE.\n                              GO TO 150\n                           END IF\n*\n*                          See what data changed inside subroutines.\n*\n                           ISAME( 1 ) = SIDES.EQ.SIDE\n                           ISAME( 2 ) = UPLOS.EQ.UPLO\n                           ISAME( 3 ) = TRANAS.EQ.TRANSA\n                           ISAME( 4 ) = DIAGS.EQ.DIAG\n                           ISAME( 5 ) = MS.EQ.M\n                           ISAME( 6 ) = NS.EQ.N\n                           ISAME( 7 ) = ALS.EQ.ALPHA\n                           ISAME( 8 ) = LSE( AS, AA, LAA )\n                           ISAME( 9 ) = LDAS.EQ.LDA\n                           IF( NULL )THEN\n                              ISAME( 10 ) = LSE( BS, BB, LBB )\n                           ELSE\n                              ISAME( 10 ) = LSERES( 'GE', ' ', M, N, BS,\n     $                                      BB, LDB )\n                           END IF\n                           ISAME( 11 ) = LDBS.EQ.LDB\n*\n*                          If data was incorrectly changed, report and\n*                          return.\n*\n                           SAME = .TRUE.\n                           DO 50 I = 1, NARGS\n                              SAME = SAME.AND.ISAME( I )\n                              IF( .NOT.ISAME( I ) )\n     $                           WRITE( NOUT, FMT = 9998 )I\n   50                      CONTINUE\n                           IF( .NOT.SAME )THEN\n                              FATAL = .TRUE.\n                              GO TO 150\n                           END IF\n*\n                           IF( .NOT.NULL )THEN\n                              IF( SNAME( 4: 5 ).EQ.'MM' )THEN\n*\n*                                Check the result.\n*\n                                 IF( LEFT )THEN\n                                    CALL SMMCH( TRANSA, 'N', M, N, M,\n     $                                          ALPHA, A, NMAX, B, NMAX,\n     $                                          ZERO, C, NMAX, CT, G,\n     $                                          BB, LDB, EPS, ERR,\n     $                                          FATAL, NOUT, .TRUE. )\n                                 ELSE\n                                    CALL SMMCH( 'N', TRANSA, M, N, N,\n     $                                          ALPHA, B, NMAX, A, NMAX,\n     $                                          ZERO, C, NMAX, CT, G,\n     $                                          BB, LDB, EPS, ERR,\n     $                                          FATAL, NOUT, .TRUE. )\n                                 END IF\n                              ELSE IF( SNAME( 4: 5 ).EQ.'SM' )THEN\n*\n*                                Compute approximation to original\n*                                matrix.\n*\n                                 DO 70 J = 1, N\n                                    DO 60 I = 1, M\n                                       C( I, J ) = BB( I + ( J - 1 )*\n     $                                             LDB )\n                                       BB( I + ( J - 1 )*LDB ) = ALPHA*\n     $                                    B( I, J )\n   60                               CONTINUE\n   70                            CONTINUE\n*\n                                 IF( LEFT )THEN\n                                    CALL SMMCH( TRANSA, 'N', M, N, M,\n     $                                          ONE, A, NMAX, C, NMAX,\n     $                                          ZERO, B, NMAX, CT, G,\n     $                                          BB, LDB, EPS, ERR,\n     $                                          FATAL, NOUT, .FALSE. )\n                                 ELSE\n                                    CALL SMMCH( 'N', TRANSA, M, N, N,\n     $                                          ONE, C, NMAX, A, NMAX,\n     $                                          ZERO, B, NMAX, CT, G,\n     $                                          BB, LDB, EPS, ERR,\n     $                                          FATAL, NOUT, .FALSE. )\n                                 END IF\n                              END IF\n                              ERRMAX = MAX( ERRMAX, ERR )\n*                             If got really bad answer, report and\n*                             return.\n                              IF( FATAL )\n     $                           GO TO 150\n                           END IF\n*\n   80                   CONTINUE\n*\n   90                CONTINUE\n*\n  100             CONTINUE\n*\n  110          CONTINUE\n*\n  120       CONTINUE\n*\n  130    CONTINUE\n*\n  140 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 160\n*\n  150 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      WRITE( NOUT, FMT = 9995 )NC, SNAME, SIDE, UPLO, TRANSA, DIAG, M,\n     $   N, ALPHA, LDA, LDB\n*\n  160 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( 1X, I6, ': ', A6, '(', 4( '''', A1, ''',' ), 2( I3, ',' ),\n     $      F4.1, ', A,', I3, ', B,', I3, ')        .' )\n 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of SCHK3.\n*\n      END\n      SUBROUTINE SCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX,\n     $                  A, AA, AS, B, BB, BS, C, CC, CS, CT, G )\n*\n*  Tests SSYRK.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Parameters ..\n      REAL               ZERO\n      PARAMETER          ( ZERO = 0.0 )\n*     .. Scalar Arguments ..\n      REAL               EPS, THRESH\n      INTEGER            NALF, NBET, NIDIM, NMAX, NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      REAL               A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),\n     $                   AS( NMAX*NMAX ), B( NMAX, NMAX ),\n     $                   BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ),\n     $                   C( NMAX, NMAX ), CC( NMAX*NMAX ),\n     $                   CS( NMAX*NMAX ), CT( NMAX ), G( NMAX )\n      INTEGER            IDIM( NIDIM )\n*     .. Local Scalars ..\n      REAL               ALPHA, ALS, BETA, BETS, ERR, ERRMAX\n      INTEGER            I, IA, IB, ICT, ICU, IK, IN, J, JC, JJ, K, KS,\n     $                   LAA, LCC, LDA, LDAS, LDC, LDCS, LJ, MA, N, NA,\n     $                   NARGS, NC, NS\n      LOGICAL            NULL, RESET, SAME, TRAN, UPPER\n      CHARACTER*1        TRANS, TRANSS, UPLO, UPLOS\n      CHARACTER*2        ICHU\n      CHARACTER*3        ICHT\n*     .. Local Arrays ..\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LSE, LSERES\n      EXTERNAL           LSE, LSERES\n*     .. External Subroutines ..\n      EXTERNAL           SMAKE, SMMCH, SSYRK\n*     .. Intrinsic Functions ..\n      INTRINSIC          MAX\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Data statements ..\n      DATA               ICHT/'NTC'/, ICHU/'UL'/\n*     .. Executable Statements ..\n*\n      NARGS = 10\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = ZERO\n*\n      DO 100 IN = 1, NIDIM\n         N = IDIM( IN )\n*        Set LDC to 1 more than minimum value if room.\n         LDC = N\n         IF( LDC.LT.NMAX )\n     $      LDC = LDC + 1\n*        Skip tests if not enough room.\n         IF( LDC.GT.NMAX )\n     $      GO TO 100\n         LCC = LDC*N\n         NULL = N.LE.0\n*\n         DO 90 IK = 1, NIDIM\n            K = IDIM( IK )\n*\n            DO 80 ICT = 1, 3\n               TRANS = ICHT( ICT: ICT )\n               TRAN = TRANS.EQ.'T'.OR.TRANS.EQ.'C'\n               IF( TRAN )THEN\n                  MA = K\n                  NA = N\n               ELSE\n                  MA = N\n                  NA = K\n               END IF\n*              Set LDA to 1 more than minimum value if room.\n               LDA = MA\n               IF( LDA.LT.NMAX )\n     $            LDA = LDA + 1\n*              Skip tests if not enough room.\n               IF( LDA.GT.NMAX )\n     $            GO TO 80\n               LAA = LDA*NA\n*\n*              Generate the matrix A.\n*\n               CALL SMAKE( 'GE', ' ', ' ', MA, NA, A, NMAX, AA, LDA,\n     $                     RESET, ZERO )\n*\n               DO 70 ICU = 1, 2\n                  UPLO = ICHU( ICU: ICU )\n                  UPPER = UPLO.EQ.'U'\n*\n                  DO 60 IA = 1, NALF\n                     ALPHA = ALF( IA )\n*\n                     DO 50 IB = 1, NBET\n                        BETA = BET( IB )\n*\n*                       Generate the matrix C.\n*\n                        CALL SMAKE( 'SY', UPLO, ' ', N, N, C, NMAX, CC,\n     $                              LDC, RESET, ZERO )\n*\n                        NC = NC + 1\n*\n*                       Save every datum before calling the subroutine.\n*\n                        UPLOS = UPLO\n                        TRANSS = TRANS\n                        NS = N\n                        KS = K\n                        ALS = ALPHA\n                        DO 10 I = 1, LAA\n                           AS( I ) = AA( I )\n   10                   CONTINUE\n                        LDAS = LDA\n                        BETS = BETA\n                        DO 20 I = 1, LCC\n                           CS( I ) = CC( I )\n   20                   CONTINUE\n                        LDCS = LDC\n*\n*                       Call the subroutine.\n*\n                        IF( TRACE )\n     $                     WRITE( NTRA, FMT = 9994 )NC, SNAME, UPLO,\n     $                     TRANS, N, K, ALPHA, LDA, BETA, LDC\n                        IF( REWI )\n     $                     REWIND NTRA\n                        CALL SSYRK( UPLO, TRANS, N, K, ALPHA, AA, LDA,\n     $                              BETA, CC, LDC )\n*\n*                       Check if error-exit was taken incorrectly.\n*\n                        IF( .NOT.OK )THEN\n                           WRITE( NOUT, FMT = 9993 )\n                           FATAL = .TRUE.\n                           GO TO 120\n                        END IF\n*\n*                       See what data changed inside subroutines.\n*\n                        ISAME( 1 ) = UPLOS.EQ.UPLO\n                        ISAME( 2 ) = TRANSS.EQ.TRANS\n                        ISAME( 3 ) = NS.EQ.N\n                        ISAME( 4 ) = KS.EQ.K\n                        ISAME( 5 ) = ALS.EQ.ALPHA\n                        ISAME( 6 ) = LSE( AS, AA, LAA )\n                        ISAME( 7 ) = LDAS.EQ.LDA\n                        ISAME( 8 ) = BETS.EQ.BETA\n                        IF( NULL )THEN\n                           ISAME( 9 ) = LSE( CS, CC, LCC )\n                        ELSE\n                           ISAME( 9 ) = LSERES( 'SY', UPLO, N, N, CS,\n     $                                  CC, LDC )\n                        END IF\n                        ISAME( 10 ) = LDCS.EQ.LDC\n*\n*                       If data was incorrectly changed, report and\n*                       return.\n*\n                        SAME = .TRUE.\n                        DO 30 I = 1, NARGS\n                           SAME = SAME.AND.ISAME( I )\n                           IF( .NOT.ISAME( I ) )\n     $                        WRITE( NOUT, FMT = 9998 )I\n   30                   CONTINUE\n                        IF( .NOT.SAME )THEN\n                           FATAL = .TRUE.\n                           GO TO 120\n                        END IF\n*\n                        IF( .NOT.NULL )THEN\n*\n*                          Check the result column by column.\n*\n                           JC = 1\n                           DO 40 J = 1, N\n                              IF( UPPER )THEN\n                                 JJ = 1\n                                 LJ = J\n                              ELSE\n                                 JJ = J\n                                 LJ = N - J + 1\n                              END IF\n                              IF( TRAN )THEN\n                                 CALL SMMCH( 'T', 'N', LJ, 1, K, ALPHA,\n     $                                       A( 1, JJ ), NMAX,\n     $                                       A( 1, J ), NMAX, BETA,\n     $                                       C( JJ, J ), NMAX, CT, G,\n     $                                       CC( JC ), LDC, EPS, ERR,\n     $                                       FATAL, NOUT, .TRUE. )\n                              ELSE\n                                 CALL SMMCH( 'N', 'T', LJ, 1, K, ALPHA,\n     $                                       A( JJ, 1 ), NMAX,\n     $                                       A( J, 1 ), NMAX, BETA,\n     $                                       C( JJ, J ), NMAX, CT, G,\n     $                                       CC( JC ), LDC, EPS, ERR,\n     $                                       FATAL, NOUT, .TRUE. )\n                              END IF\n                              IF( UPPER )THEN\n                                 JC = JC + LDC\n                              ELSE\n                                 JC = JC + LDC + 1\n                              END IF\n                              ERRMAX = MAX( ERRMAX, ERR )\n*                             If got really bad answer, report and\n*                             return.\n                              IF( FATAL )\n     $                           GO TO 110\n   40                      CONTINUE\n                        END IF\n*\n   50                CONTINUE\n*\n   60             CONTINUE\n*\n   70          CONTINUE\n*\n   80       CONTINUE\n*\n   90    CONTINUE\n*\n  100 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 130\n*\n  110 CONTINUE\n      IF( N.GT.1 )\n     $   WRITE( NOUT, FMT = 9995 )J\n*\n  120 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      WRITE( NOUT, FMT = 9994 )NC, SNAME, UPLO, TRANS, N, K, ALPHA,\n     $   LDA, BETA, LDC\n*\n  130 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( '      THESE ARE THE RESULTS FOR COLUMN ', I3 )\n 9994 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ),\n     $      F4.1, ', A,', I3, ',', F4.1, ', C,', I3, ')           .' )\n 9993 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of SCHK4.\n*\n      END\n      SUBROUTINE SCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX,\n     $                  AB, AA, AS, BB, BS, C, CC, CS, CT, G, W )\n*\n*  Tests SSYR2K.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Parameters ..\n      REAL               ZERO\n      PARAMETER          ( ZERO = 0.0 )\n*     .. Scalar Arguments ..\n      REAL               EPS, THRESH\n      INTEGER            NALF, NBET, NIDIM, NMAX, NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      REAL               AA( NMAX*NMAX ), AB( 2*NMAX*NMAX ),\n     $                   ALF( NALF ), AS( NMAX*NMAX ), BB( NMAX*NMAX ),\n     $                   BET( NBET ), BS( NMAX*NMAX ), C( NMAX, NMAX ),\n     $                   CC( NMAX*NMAX ), CS( NMAX*NMAX ), CT( NMAX ),\n     $                   G( NMAX ), W( 2*NMAX )\n      INTEGER            IDIM( NIDIM )\n*     .. Local Scalars ..\n      REAL               ALPHA, ALS, BETA, BETS, ERR, ERRMAX\n      INTEGER            I, IA, IB, ICT, ICU, IK, IN, J, JC, JJ, JJAB,\n     $                   K, KS, LAA, LBB, LCC, LDA, LDAS, LDB, LDBS,\n     $                   LDC, LDCS, LJ, MA, N, NA, NARGS, NC, NS\n      LOGICAL            NULL, RESET, SAME, TRAN, UPPER\n      CHARACTER*1        TRANS, TRANSS, UPLO, UPLOS\n      CHARACTER*2        ICHU\n      CHARACTER*3        ICHT\n*     .. Local Arrays ..\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LSE, LSERES\n      EXTERNAL           LSE, LSERES\n*     .. External Subroutines ..\n      EXTERNAL           SMAKE, SMMCH, SSYR2K\n*     .. Intrinsic Functions ..\n      INTRINSIC          MAX\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Data statements ..\n      DATA               ICHT/'NTC'/, ICHU/'UL'/\n*     .. Executable Statements ..\n*\n      NARGS = 12\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = ZERO\n*\n      DO 130 IN = 1, NIDIM\n         N = IDIM( IN )\n*        Set LDC to 1 more than minimum value if room.\n         LDC = N\n         IF( LDC.LT.NMAX )\n     $      LDC = LDC + 1\n*        Skip tests if not enough room.\n         IF( LDC.GT.NMAX )\n     $      GO TO 130\n         LCC = LDC*N\n         NULL = N.LE.0\n*\n         DO 120 IK = 1, NIDIM\n            K = IDIM( IK )\n*\n            DO 110 ICT = 1, 3\n               TRANS = ICHT( ICT: ICT )\n               TRAN = TRANS.EQ.'T'.OR.TRANS.EQ.'C'\n               IF( TRAN )THEN\n                  MA = K\n                  NA = N\n               ELSE\n                  MA = N\n                  NA = K\n               END IF\n*              Set LDA to 1 more than minimum value if room.\n               LDA = MA\n               IF( LDA.LT.NMAX )\n     $            LDA = LDA + 1\n*              Skip tests if not enough room.\n               IF( LDA.GT.NMAX )\n     $            GO TO 110\n               LAA = LDA*NA\n*\n*              Generate the matrix A.\n*\n               IF( TRAN )THEN\n                  CALL SMAKE( 'GE', ' ', ' ', MA, NA, AB, 2*NMAX, AA,\n     $                        LDA, RESET, ZERO )\n               ELSE\n                  CALL SMAKE( 'GE', ' ', ' ', MA, NA, AB, NMAX, AA, LDA,\n     $                        RESET, ZERO )\n               END IF\n*\n*              Generate the matrix B.\n*\n               LDB = LDA\n               LBB = LAA\n               IF( TRAN )THEN\n                  CALL SMAKE( 'GE', ' ', ' ', MA, NA, AB( K + 1 ),\n     $                        2*NMAX, BB, LDB, RESET, ZERO )\n               ELSE\n                  CALL SMAKE( 'GE', ' ', ' ', MA, NA, AB( K*NMAX + 1 ),\n     $                        NMAX, BB, LDB, RESET, ZERO )\n               END IF\n*\n               DO 100 ICU = 1, 2\n                  UPLO = ICHU( ICU: ICU )\n                  UPPER = UPLO.EQ.'U'\n*\n                  DO 90 IA = 1, NALF\n                     ALPHA = ALF( IA )\n*\n                     DO 80 IB = 1, NBET\n                        BETA = BET( IB )\n*\n*                       Generate the matrix C.\n*\n                        CALL SMAKE( 'SY', UPLO, ' ', N, N, C, NMAX, CC,\n     $                              LDC, RESET, ZERO )\n*\n                        NC = NC + 1\n*\n*                       Save every datum before calling the subroutine.\n*\n                        UPLOS = UPLO\n                        TRANSS = TRANS\n                        NS = N\n                        KS = K\n                        ALS = ALPHA\n                        DO 10 I = 1, LAA\n                           AS( I ) = AA( I )\n   10                   CONTINUE\n                        LDAS = LDA\n                        DO 20 I = 1, LBB\n                           BS( I ) = BB( I )\n   20                   CONTINUE\n                        LDBS = LDB\n                        BETS = BETA\n                        DO 30 I = 1, LCC\n                           CS( I ) = CC( I )\n   30                   CONTINUE\n                        LDCS = LDC\n*\n*                       Call the subroutine.\n*\n                        IF( TRACE )\n     $                     WRITE( NTRA, FMT = 9994 )NC, SNAME, UPLO,\n     $                     TRANS, N, K, ALPHA, LDA, LDB, BETA, LDC\n                        IF( REWI )\n     $                     REWIND NTRA\n                        CALL SSYR2K( UPLO, TRANS, N, K, ALPHA, AA, LDA,\n     $                               BB, LDB, BETA, CC, LDC )\n*\n*                       Check if error-exit was taken incorrectly.\n*\n                        IF( .NOT.OK )THEN\n                           WRITE( NOUT, FMT = 9993 )\n                           FATAL = .TRUE.\n                           GO TO 150\n                        END IF\n*\n*                       See what data changed inside subroutines.\n*\n                        ISAME( 1 ) = UPLOS.EQ.UPLO\n                        ISAME( 2 ) = TRANSS.EQ.TRANS\n                        ISAME( 3 ) = NS.EQ.N\n                        ISAME( 4 ) = KS.EQ.K\n                        ISAME( 5 ) = ALS.EQ.ALPHA\n                        ISAME( 6 ) = LSE( AS, AA, LAA )\n                        ISAME( 7 ) = LDAS.EQ.LDA\n                        ISAME( 8 ) = LSE( BS, BB, LBB )\n                        ISAME( 9 ) = LDBS.EQ.LDB\n                        ISAME( 10 ) = BETS.EQ.BETA\n                        IF( NULL )THEN\n                           ISAME( 11 ) = LSE( CS, CC, LCC )\n                        ELSE\n                           ISAME( 11 ) = LSERES( 'SY', UPLO, N, N, CS,\n     $                                   CC, LDC )\n                        END IF\n                        ISAME( 12 ) = LDCS.EQ.LDC\n*\n*                       If data was incorrectly changed, report and\n*                       return.\n*\n                        SAME = .TRUE.\n                        DO 40 I = 1, NARGS\n                           SAME = SAME.AND.ISAME( I )\n                           IF( .NOT.ISAME( I ) )\n     $                        WRITE( NOUT, FMT = 9998 )I\n   40                   CONTINUE\n                        IF( .NOT.SAME )THEN\n                           FATAL = .TRUE.\n                           GO TO 150\n                        END IF\n*\n                        IF( .NOT.NULL )THEN\n*\n*                          Check the result column by column.\n*\n                           JJAB = 1\n                           JC = 1\n                           DO 70 J = 1, N\n                              IF( UPPER )THEN\n                                 JJ = 1\n                                 LJ = J\n                              ELSE\n                                 JJ = J\n                                 LJ = N - J + 1\n                              END IF\n                              IF( TRAN )THEN\n                                 DO 50 I = 1, K\n                                    W( I ) = AB( ( J - 1 )*2*NMAX + K +\n     $                                       I )\n                                    W( K + I ) = AB( ( J - 1 )*2*NMAX +\n     $                                           I )\n   50                            CONTINUE\n                                 CALL SMMCH( 'T', 'N', LJ, 1, 2*K,\n     $                                       ALPHA, AB( JJAB ), 2*NMAX,\n     $                                       W, 2*NMAX, BETA,\n     $                                       C( JJ, J ), NMAX, CT, G,\n     $                                       CC( JC ), LDC, EPS, ERR,\n     $                                       FATAL, NOUT, .TRUE. )\n                              ELSE\n                                 DO 60 I = 1, K\n                                    W( I ) = AB( ( K + I - 1 )*NMAX +\n     $                                       J )\n                                    W( K + I ) = AB( ( I - 1 )*NMAX +\n     $                                           J )\n   60                            CONTINUE\n                                 CALL SMMCH( 'N', 'N', LJ, 1, 2*K,\n     $                                       ALPHA, AB( JJ ), NMAX, W,\n     $                                       2*NMAX, BETA, C( JJ, J ),\n     $                                       NMAX, CT, G, CC( JC ), LDC,\n     $                                       EPS, ERR, FATAL, NOUT,\n     $                                       .TRUE. )\n                              END IF\n                              IF( UPPER )THEN\n                                 JC = JC + LDC\n                              ELSE\n                                 JC = JC + LDC + 1\n                                 IF( TRAN )\n     $                              JJAB = JJAB + 2*NMAX\n                              END IF\n                              ERRMAX = MAX( ERRMAX, ERR )\n*                             If got really bad answer, report and\n*                             return.\n                              IF( FATAL )\n     $                           GO TO 140\n   70                      CONTINUE\n                        END IF\n*\n   80                CONTINUE\n*\n   90             CONTINUE\n*\n  100          CONTINUE\n*\n  110       CONTINUE\n*\n  120    CONTINUE\n*\n  130 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 160\n*\n  140 CONTINUE\n      IF( N.GT.1 )\n     $   WRITE( NOUT, FMT = 9995 )J\n*\n  150 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      WRITE( NOUT, FMT = 9994 )NC, SNAME, UPLO, TRANS, N, K, ALPHA,\n     $   LDA, LDB, BETA, LDC\n*\n  160 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( '      THESE ARE THE RESULTS FOR COLUMN ', I3 )\n 9994 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ),\n     $      F4.1, ', A,', I3, ', B,', I3, ',', F4.1, ', C,', I3, ')   ',\n     $      ' .' )\n 9993 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of SCHK5.\n*\n      END\n      SUBROUTINE SCHKE( ISNUM, SRNAMT, NOUT )\n*\n*  Tests the error exits from the Level 3 Blas.\n*  Requires a special version of the error-handling routine XERBLA.\n*  ALPHA, BETA, A, B and C should not need to be defined.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Scalar Arguments ..\n      INTEGER            ISNUM, NOUT\n      CHARACTER*6        SRNAMT\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Local Scalars ..\n      REAL               ALPHA, BETA\n*     .. Local Arrays ..\n      REAL               A( 2, 1 ), B( 2, 1 ), C( 2, 1 )\n*     .. External Subroutines ..\n      EXTERNAL           CHKXER, SGEMM, SSYMM, SSYR2K, SSYRK, STRMM,\n     $                   STRSM\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Executable Statements ..\n*     OK is set to .FALSE. by the special version of XERBLA or by CHKXER\n*     if anything is wrong.\n      OK = .TRUE.\n*     LERR is set to .TRUE. by the special version of XERBLA each time\n*     it is called, and is then tested and re-set by CHKXER.\n      LERR = .FALSE.\n      GO TO ( 10, 20, 30, 40, 50, 60 )ISNUM\n   10 INFOT = 1\n      CALL SGEMM( '/', 'N', 0, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 1\n      CALL SGEMM( '/', 'T', 0, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL SGEMM( 'N', '/', 0, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL SGEMM( 'T', '/', 0, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL SGEMM( 'N', 'N', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL SGEMM( 'N', 'T', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL SGEMM( 'T', 'N', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL SGEMM( 'T', 'T', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL SGEMM( 'N', 'N', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL SGEMM( 'N', 'T', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL SGEMM( 'T', 'N', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL SGEMM( 'T', 'T', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL SGEMM( 'N', 'N', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL SGEMM( 'N', 'T', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL SGEMM( 'T', 'N', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL SGEMM( 'T', 'T', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL SGEMM( 'N', 'N', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL SGEMM( 'N', 'T', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL SGEMM( 'T', 'N', 0, 0, 2, ALPHA, A, 1, B, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL SGEMM( 'T', 'T', 0, 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL SGEMM( 'N', 'N', 0, 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL SGEMM( 'T', 'N', 0, 0, 2, ALPHA, A, 2, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL SGEMM( 'N', 'T', 0, 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL SGEMM( 'T', 'T', 0, 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 13\n      CALL SGEMM( 'N', 'N', 2, 0, 0, ALPHA, A, 2, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 13\n      CALL SGEMM( 'N', 'T', 2, 0, 0, ALPHA, A, 2, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 13\n      CALL SGEMM( 'T', 'N', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 13\n      CALL SGEMM( 'T', 'T', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 70\n   20 INFOT = 1\n      CALL SSYMM( '/', 'U', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL SSYMM( 'L', '/', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL SSYMM( 'L', 'U', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL SSYMM( 'R', 'U', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL SSYMM( 'L', 'L', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL SSYMM( 'R', 'L', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL SSYMM( 'L', 'U', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL SSYMM( 'R', 'U', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL SSYMM( 'L', 'L', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL SSYMM( 'R', 'L', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL SSYMM( 'L', 'U', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL SSYMM( 'R', 'U', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL SSYMM( 'L', 'L', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL SSYMM( 'R', 'L', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL SSYMM( 'L', 'U', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL SSYMM( 'R', 'U', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL SSYMM( 'L', 'L', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL SSYMM( 'R', 'L', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL SSYMM( 'L', 'U', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL SSYMM( 'R', 'U', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL SSYMM( 'L', 'L', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL SSYMM( 'R', 'L', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 70\n   30 INFOT = 1\n      CALL STRMM( '/', 'U', 'N', 'N', 0, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL STRMM( 'L', '/', 'N', 'N', 0, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL STRMM( 'L', 'U', '/', 'N', 0, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL STRMM( 'L', 'U', 'N', '/', 0, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL STRMM( 'L', 'U', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL STRMM( 'L', 'U', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL STRMM( 'R', 'U', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL STRMM( 'R', 'U', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL STRMM( 'L', 'L', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL STRMM( 'L', 'L', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL STRMM( 'R', 'L', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL STRMM( 'R', 'L', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL STRMM( 'L', 'U', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL STRMM( 'L', 'U', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL STRMM( 'R', 'U', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL STRMM( 'R', 'U', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL STRMM( 'L', 'L', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL STRMM( 'L', 'L', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL STRMM( 'R', 'L', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL STRMM( 'R', 'L', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL STRMM( 'L', 'U', 'N', 'N', 2, 0, ALPHA, A, 1, B, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL STRMM( 'L', 'U', 'T', 'N', 2, 0, ALPHA, A, 1, B, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL STRMM( 'R', 'U', 'N', 'N', 0, 2, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL STRMM( 'R', 'U', 'T', 'N', 0, 2, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL STRMM( 'L', 'L', 'N', 'N', 2, 0, ALPHA, A, 1, B, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL STRMM( 'L', 'L', 'T', 'N', 2, 0, ALPHA, A, 1, B, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL STRMM( 'R', 'L', 'N', 'N', 0, 2, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL STRMM( 'R', 'L', 'T', 'N', 0, 2, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL STRMM( 'L', 'U', 'N', 'N', 2, 0, ALPHA, A, 2, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL STRMM( 'L', 'U', 'T', 'N', 2, 0, ALPHA, A, 2, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL STRMM( 'R', 'U', 'N', 'N', 2, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL STRMM( 'R', 'U', 'T', 'N', 2, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL STRMM( 'L', 'L', 'N', 'N', 2, 0, ALPHA, A, 2, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL STRMM( 'L', 'L', 'T', 'N', 2, 0, ALPHA, A, 2, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL STRMM( 'R', 'L', 'N', 'N', 2, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL STRMM( 'R', 'L', 'T', 'N', 2, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 70\n   40 INFOT = 1\n      CALL STRSM( '/', 'U', 'N', 'N', 0, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL STRSM( 'L', '/', 'N', 'N', 0, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL STRSM( 'L', 'U', '/', 'N', 0, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL STRSM( 'L', 'U', 'N', '/', 0, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL STRSM( 'L', 'U', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL STRSM( 'L', 'U', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL STRSM( 'R', 'U', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL STRSM( 'R', 'U', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL STRSM( 'L', 'L', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL STRSM( 'L', 'L', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL STRSM( 'R', 'L', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL STRSM( 'R', 'L', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL STRSM( 'L', 'U', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL STRSM( 'L', 'U', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL STRSM( 'R', 'U', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL STRSM( 'R', 'U', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL STRSM( 'L', 'L', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL STRSM( 'L', 'L', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL STRSM( 'R', 'L', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL STRSM( 'R', 'L', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL STRSM( 'L', 'U', 'N', 'N', 2, 0, ALPHA, A, 1, B, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL STRSM( 'L', 'U', 'T', 'N', 2, 0, ALPHA, A, 1, B, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL STRSM( 'R', 'U', 'N', 'N', 0, 2, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL STRSM( 'R', 'U', 'T', 'N', 0, 2, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL STRSM( 'L', 'L', 'N', 'N', 2, 0, ALPHA, A, 1, B, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL STRSM( 'L', 'L', 'T', 'N', 2, 0, ALPHA, A, 1, B, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL STRSM( 'R', 'L', 'N', 'N', 0, 2, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL STRSM( 'R', 'L', 'T', 'N', 0, 2, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL STRSM( 'L', 'U', 'N', 'N', 2, 0, ALPHA, A, 2, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL STRSM( 'L', 'U', 'T', 'N', 2, 0, ALPHA, A, 2, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL STRSM( 'R', 'U', 'N', 'N', 2, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL STRSM( 'R', 'U', 'T', 'N', 2, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL STRSM( 'L', 'L', 'N', 'N', 2, 0, ALPHA, A, 2, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL STRSM( 'L', 'L', 'T', 'N', 2, 0, ALPHA, A, 2, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL STRSM( 'R', 'L', 'N', 'N', 2, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL STRSM( 'R', 'L', 'T', 'N', 2, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 70\n   50 INFOT = 1\n      CALL SSYRK( '/', 'N', 0, 0, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL SSYRK( 'U', '/', 0, 0, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL SSYRK( 'U', 'N', -1, 0, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL SSYRK( 'U', 'T', -1, 0, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL SSYRK( 'L', 'N', -1, 0, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL SSYRK( 'L', 'T', -1, 0, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL SSYRK( 'U', 'N', 0, -1, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL SSYRK( 'U', 'T', 0, -1, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL SSYRK( 'L', 'N', 0, -1, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL SSYRK( 'L', 'T', 0, -1, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL SSYRK( 'U', 'N', 2, 0, ALPHA, A, 1, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL SSYRK( 'U', 'T', 0, 2, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL SSYRK( 'L', 'N', 2, 0, ALPHA, A, 1, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL SSYRK( 'L', 'T', 0, 2, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL SSYRK( 'U', 'N', 2, 0, ALPHA, A, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL SSYRK( 'U', 'T', 2, 0, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL SSYRK( 'L', 'N', 2, 0, ALPHA, A, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL SSYRK( 'L', 'T', 2, 0, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 70\n   60 INFOT = 1\n      CALL SSYR2K( '/', 'N', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL SSYR2K( 'U', '/', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL SSYR2K( 'U', 'N', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL SSYR2K( 'U', 'T', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL SSYR2K( 'L', 'N', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL SSYR2K( 'L', 'T', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL SSYR2K( 'U', 'N', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL SSYR2K( 'U', 'T', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL SSYR2K( 'L', 'N', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL SSYR2K( 'L', 'T', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL SSYR2K( 'U', 'N', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL SSYR2K( 'U', 'T', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL SSYR2K( 'L', 'N', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL SSYR2K( 'L', 'T', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL SSYR2K( 'U', 'N', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL SSYR2K( 'U', 'T', 0, 2, ALPHA, A, 2, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL SSYR2K( 'L', 'N', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL SSYR2K( 'L', 'T', 0, 2, ALPHA, A, 2, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL SSYR2K( 'U', 'N', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL SSYR2K( 'U', 'T', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL SSYR2K( 'L', 'N', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL SSYR2K( 'L', 'T', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n*\n   70 IF( OK )THEN\n         WRITE( NOUT, FMT = 9999 )SRNAMT\n      ELSE\n         WRITE( NOUT, FMT = 9998 )SRNAMT\n      END IF\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE TESTS OF ERROR-EXITS' )\n 9998 FORMAT( ' ******* ', A6, ' FAILED THE TESTS OF ERROR-EXITS *****',\n     $      '**' )\n*\n*     End of SCHKE.\n*\n      END\n      SUBROUTINE SMAKE( TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, RESET,\n     $                  TRANSL )\n*\n*  Generates values for an M by N matrix A.\n*  Stores the values in the array AA in the data structure required\n*  by the routine, with unwanted elements set to rogue value.\n*\n*  TYPE is 'GE', 'SY' or 'TR'.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Parameters ..\n      REAL               ZERO, ONE\n      PARAMETER          ( ZERO = 0.0, ONE = 1.0 )\n      REAL               ROGUE\n      PARAMETER          ( ROGUE = -1.0E10 )\n*     .. Scalar Arguments ..\n      REAL               TRANSL\n      INTEGER            LDA, M, N, NMAX\n      LOGICAL            RESET\n      CHARACTER*1        DIAG, UPLO\n      CHARACTER*2        TYPE\n*     .. Array Arguments ..\n      REAL               A( NMAX, * ), AA( * )\n*     .. Local Scalars ..\n      INTEGER            I, IBEG, IEND, J\n      LOGICAL            GEN, LOWER, SYM, TRI, UNIT, UPPER\n*     .. External Functions ..\n      REAL               SBEG\n      EXTERNAL           SBEG\n*     .. Executable Statements ..\n      GEN = TYPE.EQ.'GE'\n      SYM = TYPE.EQ.'SY'\n      TRI = TYPE.EQ.'TR'\n      UPPER = ( SYM.OR.TRI ).AND.UPLO.EQ.'U'\n      LOWER = ( SYM.OR.TRI ).AND.UPLO.EQ.'L'\n      UNIT = TRI.AND.DIAG.EQ.'U'\n*\n*     Generate data in array A.\n*\n      DO 20 J = 1, N\n         DO 10 I = 1, M\n            IF( GEN.OR.( UPPER.AND.I.LE.J ).OR.( LOWER.AND.I.GE.J ) )\n     $          THEN\n               A( I, J ) = SBEG( RESET ) + TRANSL\n               IF( I.NE.J )THEN\n*                 Set some elements to zero\n                  IF( N.GT.3.AND.J.EQ.N/2 )\n     $               A( I, J ) = ZERO\n                  IF( SYM )THEN\n                     A( J, I ) = A( I, J )\n                  ELSE IF( TRI )THEN\n                     A( J, I ) = ZERO\n                  END IF\n               END IF\n            END IF\n   10    CONTINUE\n         IF( TRI )\n     $      A( J, J ) = A( J, J ) + ONE\n         IF( UNIT )\n     $      A( J, J ) = ONE\n   20 CONTINUE\n*\n*     Store elements in array AS in data structure required by routine.\n*\n      IF( TYPE.EQ.'GE' )THEN\n         DO 50 J = 1, N\n            DO 30 I = 1, M\n               AA( I + ( J - 1 )*LDA ) = A( I, J )\n   30       CONTINUE\n            DO 40 I = M + 1, LDA\n               AA( I + ( J - 1 )*LDA ) = ROGUE\n   40       CONTINUE\n   50    CONTINUE\n      ELSE IF( TYPE.EQ.'SY'.OR.TYPE.EQ.'TR' )THEN\n         DO 90 J = 1, N\n            IF( UPPER )THEN\n               IBEG = 1\n               IF( UNIT )THEN\n                  IEND = J - 1\n               ELSE\n                  IEND = J\n               END IF\n            ELSE\n               IF( UNIT )THEN\n                  IBEG = J + 1\n               ELSE\n                  IBEG = J\n               END IF\n               IEND = N\n            END IF\n            DO 60 I = 1, IBEG - 1\n               AA( I + ( J - 1 )*LDA ) = ROGUE\n   60       CONTINUE\n            DO 70 I = IBEG, IEND\n               AA( I + ( J - 1 )*LDA ) = A( I, J )\n   70       CONTINUE\n            DO 80 I = IEND + 1, LDA\n               AA( I + ( J - 1 )*LDA ) = ROGUE\n   80       CONTINUE\n   90    CONTINUE\n      END IF\n      RETURN\n*\n*     End of SMAKE.\n*\n      END\n      SUBROUTINE SMMCH( TRANSA, TRANSB, M, N, KK, ALPHA, A, LDA, B, LDB,\n     $                  BETA, C, LDC, CT, G, CC, LDCC, EPS, ERR, FATAL,\n     $                  NOUT, MV )\n*\n*  Checks the results of the computational tests.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Parameters ..\n      REAL               ZERO, ONE\n      PARAMETER          ( ZERO = 0.0, ONE = 1.0 )\n*     .. Scalar Arguments ..\n      REAL               ALPHA, BETA, EPS, ERR\n      INTEGER            KK, LDA, LDB, LDC, LDCC, M, N, NOUT\n      LOGICAL            FATAL, MV\n      CHARACTER*1        TRANSA, TRANSB\n*     .. Array Arguments ..\n      REAL               A( LDA, * ), B( LDB, * ), C( LDC, * ),\n     $                   CC( LDCC, * ), CT( * ), G( * )\n*     .. Local Scalars ..\n      REAL               ERRI\n      INTEGER            I, J, K\n      LOGICAL            TRANA, TRANB\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, MAX, SQRT\n*     .. Executable Statements ..\n      TRANA = TRANSA.EQ.'T'.OR.TRANSA.EQ.'C'\n      TRANB = TRANSB.EQ.'T'.OR.TRANSB.EQ.'C'\n*\n*     Compute expected result, one column at a time, in CT using data\n*     in A, B and C.\n*     Compute gauges in G.\n*\n      DO 120 J = 1, N\n*\n         DO 10 I = 1, M\n            CT( I ) = ZERO\n            G( I ) = ZERO\n   10    CONTINUE\n         IF( .NOT.TRANA.AND..NOT.TRANB )THEN\n            DO 30 K = 1, KK\n               DO 20 I = 1, M\n                  CT( I ) = CT( I ) + A( I, K )*B( K, J )\n                  G( I ) = G( I ) + ABS( A( I, K ) )*ABS( B( K, J ) )\n   20          CONTINUE\n   30       CONTINUE\n         ELSE IF( TRANA.AND..NOT.TRANB )THEN\n            DO 50 K = 1, KK\n               DO 40 I = 1, M\n                  CT( I ) = CT( I ) + A( K, I )*B( K, J )\n                  G( I ) = G( I ) + ABS( A( K, I ) )*ABS( B( K, J ) )\n   40          CONTINUE\n   50       CONTINUE\n         ELSE IF( .NOT.TRANA.AND.TRANB )THEN\n            DO 70 K = 1, KK\n               DO 60 I = 1, M\n                  CT( I ) = CT( I ) + A( I, K )*B( J, K )\n                  G( I ) = G( I ) + ABS( A( I, K ) )*ABS( B( J, K ) )\n   60          CONTINUE\n   70       CONTINUE\n         ELSE IF( TRANA.AND.TRANB )THEN\n            DO 90 K = 1, KK\n               DO 80 I = 1, M\n                  CT( I ) = CT( I ) + A( K, I )*B( J, K )\n                  G( I ) = G( I ) + ABS( A( K, I ) )*ABS( B( J, K ) )\n   80          CONTINUE\n   90       CONTINUE\n         END IF\n         DO 100 I = 1, M\n            CT( I ) = ALPHA*CT( I ) + BETA*C( I, J )\n            G( I ) = ABS( ALPHA )*G( I ) + ABS( BETA )*ABS( C( I, J ) )\n  100    CONTINUE\n*\n*        Compute the error ratio for this result.\n*\n         ERR = ZERO\n         DO 110 I = 1, M\n            ERRI = ABS( CT( I ) - CC( I, J ) )/EPS\n            IF( G( I ).NE.ZERO )\n     $         ERRI = ERRI/G( I )\n            ERR = MAX( ERR, ERRI )\n            IF( ERR*SQRT( EPS ).GE.ONE )\n     $         GO TO 130\n  110    CONTINUE\n*\n  120 CONTINUE\n*\n*     If the loop completes, all results are at least half accurate.\n      GO TO 150\n*\n*     Report fatal error.\n*\n  130 FATAL = .TRUE.\n      WRITE( NOUT, FMT = 9999 )\n      DO 140 I = 1, M\n         IF( MV )THEN\n            WRITE( NOUT, FMT = 9998 )I, CT( I ), CC( I, J )\n         ELSE\n            WRITE( NOUT, FMT = 9998 )I, CC( I, J ), CT( I )\n         END IF\n  140 CONTINUE\n      IF( N.GT.1 )\n     $   WRITE( NOUT, FMT = 9997 )J\n*\n  150 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ******* FATAL ERROR - COMPUTED RESULT IS LESS THAN HAL',\n     $      'F ACCURATE *******', /'           EXPECTED RESULT   COMPU',\n     $      'TED RESULT' )\n 9998 FORMAT( 1X, I7, 2G18.6 )\n 9997 FORMAT( '      THESE ARE THE RESULTS FOR COLUMN ', I3 )\n*\n*     End of SMMCH.\n*\n      END\n      LOGICAL FUNCTION LSE( RI, RJ, LR )\n*\n*  Tests if two arrays are identical.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Scalar Arguments ..\n      INTEGER            LR\n*     .. Array Arguments ..\n      REAL               RI( * ), RJ( * )\n*     .. Local Scalars ..\n      INTEGER            I\n*     .. Executable Statements ..\n      DO 10 I = 1, LR\n         IF( RI( I ).NE.RJ( I ) )\n     $      GO TO 20\n   10 CONTINUE\n      LSE = .TRUE.\n      GO TO 30\n   20 CONTINUE\n      LSE = .FALSE.\n   30 RETURN\n*\n*     End of LSE.\n*\n      END\n      LOGICAL FUNCTION LSERES( TYPE, UPLO, M, N, AA, AS, LDA )\n*\n*  Tests if selected elements in two arrays are equal.\n*\n*  TYPE is 'GE' or 'SY'.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Scalar Arguments ..\n      INTEGER            LDA, M, N\n      CHARACTER*1        UPLO\n      CHARACTER*2        TYPE\n*     .. Array Arguments ..\n      REAL               AA( LDA, * ), AS( LDA, * )\n*     .. Local Scalars ..\n      INTEGER            I, IBEG, IEND, J\n      LOGICAL            UPPER\n*     .. Executable Statements ..\n      UPPER = UPLO.EQ.'U'\n      IF( TYPE.EQ.'GE' )THEN\n         DO 20 J = 1, N\n            DO 10 I = M + 1, LDA\n               IF( AA( I, J ).NE.AS( I, J ) )\n     $            GO TO 70\n   10       CONTINUE\n   20    CONTINUE\n      ELSE IF( TYPE.EQ.'SY' )THEN\n         DO 50 J = 1, N\n            IF( UPPER )THEN\n               IBEG = 1\n               IEND = J\n            ELSE\n               IBEG = J\n               IEND = N\n            END IF\n            DO 30 I = 1, IBEG - 1\n               IF( AA( I, J ).NE.AS( I, J ) )\n     $            GO TO 70\n   30       CONTINUE\n            DO 40 I = IEND + 1, LDA\n               IF( AA( I, J ).NE.AS( I, J ) )\n     $            GO TO 70\n   40       CONTINUE\n   50    CONTINUE\n      END IF\n*\n   60 CONTINUE\n      LSERES = .TRUE.\n      GO TO 80\n   70 CONTINUE\n      LSERES = .FALSE.\n   80 RETURN\n*\n*     End of LSERES.\n*\n      END\n      REAL FUNCTION SBEG( RESET )\n*\n*  Generates random numbers uniformly distributed between -0.5 and 0.5.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Scalar Arguments ..\n      LOGICAL            RESET\n*     .. Local Scalars ..\n      INTEGER            I, IC, MI\n*     .. Save statement ..\n      SAVE               I, IC, MI\n*     .. Executable Statements ..\n      IF( RESET )THEN\n*        Initialize local variables.\n         MI = 891\n         I = 7\n         IC = 0\n         RESET = .FALSE.\n      END IF\n*\n*     The sequence of values of I is bounded between 1 and 999.\n*     If initial I = 1,2,3,6,7 or 9, the period will be 50.\n*     If initial I = 4 or 8, the period will be 25.\n*     If initial I = 5, the period will be 10.\n*     IC is used to break up the period by skipping 1 value of I in 6.\n*\n      IC = IC + 1\n   10 I = I*MI\n      I = I - 1000*( I/1000 )\n      IF( IC.GE.5 )THEN\n         IC = 0\n         GO TO 10\n      END IF\n      SBEG = ( I - 500 )/1001.0\n      RETURN\n*\n*     End of SBEG.\n*\n      END\n      REAL FUNCTION SDIFF( X, Y )\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Scalar Arguments ..\n      REAL               X, Y\n*     .. Executable Statements ..\n      SDIFF = X - Y\n      RETURN\n*\n*     End of SDIFF.\n*\n      END\n      SUBROUTINE CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n*\n*  Tests whether XERBLA has detected an error when it should.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Scalar Arguments ..\n      INTEGER            INFOT, NOUT\n      LOGICAL            LERR, OK\n      CHARACTER*6        SRNAMT\n*     .. Executable Statements ..\n      IF( .NOT.LERR )THEN\n         WRITE( NOUT, FMT = 9999 )INFOT, SRNAMT\n         OK = .FALSE.\n      END IF\n      LERR = .FALSE.\n      RETURN\n*\n 9999 FORMAT( ' ***** ILLEGAL VALUE OF PARAMETER NUMBER ', I2, ' NOT D',\n     $      'ETECTED BY ', A6, ' *****' )\n*\n*     End of CHKXER.\n*\n      END\n      SUBROUTINE XERBLA( SRNAME, INFO )\n*\n*  This is a special version of XERBLA to be used only as part of\n*  the test program for testing error exits from the Level 3 BLAS\n*  routines.\n*\n*  XERBLA  is an error handler for the Level 3 BLAS routines.\n*\n*  It is called by the Level 3 BLAS routines if an input parameter is\n*  invalid.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Scalar Arguments ..\n      INTEGER            INFO\n      CHARACTER*6        SRNAME\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUT\n      LOGICAL            LERR, OK\n      CHARACTER*6        SRNAMT\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUT, OK, LERR\n      COMMON             /SRNAMC/SRNAMT\n*     .. Executable Statements ..\n      LERR = .TRUE.\n      IF( INFO.NE.INFOT )THEN\n         IF( INFOT.NE.0 )THEN\n            WRITE( NOUT, FMT = 9999 )INFO, INFOT\n         ELSE\n            WRITE( NOUT, FMT = 9997 )INFO\n         END IF\n         OK = .FALSE.\n      END IF\n      IF( SRNAME.NE.SRNAMT )THEN\n         WRITE( NOUT, FMT = 9998 )SRNAME, SRNAMT\n         OK = .FALSE.\n      END IF\n      RETURN\n*\n 9999 FORMAT( ' ******* XERBLA WAS CALLED WITH INFO = ', I6, ' INSTEAD',\n     $      ' OF ', I2, ' *******' )\n 9998 FORMAT( ' ******* XERBLA WAS CALLED WITH SRNAME = ', A6, ' INSTE',\n     $      'AD OF ', A6, ' *******' )\n 9997 FORMAT( ' ******* XERBLA WAS CALLED WITH INFO = ', I6,\n     $      ' *******' )\n*\n*     End of XERBLA\n*\n      END\n\n"
  },
  {
    "path": "libs/eigen/blas/testing/zblat1.f",
    "content": "      PROGRAM ZBLAT1\n*     Test program for the COMPLEX*16 Level 1 BLAS.\n*     Based upon the original BLAS test routine together with:\n*     F06GAF Example Program Text\n*     .. Parameters ..\n      INTEGER          NOUT\n      PARAMETER        (NOUT=6)\n*     .. Scalars in Common ..\n      INTEGER          ICASE, INCX, INCY, MODE, N\n      LOGICAL          PASS\n*     .. Local Scalars ..\n      DOUBLE PRECISION SFAC\n      INTEGER          IC\n*     .. External Subroutines ..\n      EXTERNAL         CHECK1, CHECK2, HEADER\n*     .. Common blocks ..\n      COMMON           /COMBLA/ICASE, N, INCX, INCY, MODE, PASS\n*     .. Data statements ..\n      DATA             SFAC/9.765625D-4/\n*     .. Executable Statements ..\n      WRITE (NOUT,99999)\n      DO 20 IC = 1, 10\n         ICASE = IC\n         CALL HEADER\n*\n*        Initialize PASS, INCX, INCY, and MODE for a new case.\n*        The value 9999 for INCX, INCY or MODE will appear in the\n*        detailed  output, if any, for cases that do not involve\n*        these parameters.\n*\n         PASS = .TRUE.\n         INCX = 9999\n         INCY = 9999\n         MODE = 9999\n         IF (ICASE.LE.5) THEN\n            CALL CHECK2(SFAC)\n         ELSE IF (ICASE.GE.6) THEN\n            CALL CHECK1(SFAC)\n         END IF\n*        -- Print\n         IF (PASS) WRITE (NOUT,99998)\n   20 CONTINUE\n      STOP\n*\n99999 FORMAT (' Complex BLAS Test Program Results',/1X)\n99998 FORMAT ('                                    ----- PASS -----')\n      END\n      SUBROUTINE HEADER\n*     .. Parameters ..\n      INTEGER          NOUT\n      PARAMETER        (NOUT=6)\n*     .. Scalars in Common ..\n      INTEGER          ICASE, INCX, INCY, MODE, N\n      LOGICAL          PASS\n*     .. Local Arrays ..\n      CHARACTER*6      L(10)\n*     .. Common blocks ..\n      COMMON           /COMBLA/ICASE, N, INCX, INCY, MODE, PASS\n*     .. Data statements ..\n      DATA             L(1)/'ZDOTC '/\n      DATA             L(2)/'ZDOTU '/\n      DATA             L(3)/'ZAXPY '/\n      DATA             L(4)/'ZCOPY '/\n      DATA             L(5)/'ZSWAP '/\n      DATA             L(6)/'DZNRM2'/\n      DATA             L(7)/'DZASUM'/\n      DATA             L(8)/'ZSCAL '/\n      DATA             L(9)/'ZDSCAL'/\n      DATA             L(10)/'IZAMAX'/\n*     .. Executable Statements ..\n      WRITE (NOUT,99999) ICASE, L(ICASE)\n      RETURN\n*\n99999 FORMAT (/' Test of subprogram number',I3,12X,A6)\n      END\n      SUBROUTINE CHECK1(SFAC)\n*     .. Parameters ..\n      INTEGER           NOUT\n      PARAMETER         (NOUT=6)\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION  SFAC\n*     .. Scalars in Common ..\n      INTEGER           ICASE, INCX, INCY, MODE, N\n      LOGICAL           PASS\n*     .. Local Scalars ..\n      COMPLEX*16        CA\n      DOUBLE PRECISION  SA\n      INTEGER           I, J, LEN, NP1\n*     .. Local Arrays ..\n      COMPLEX*16        CTRUE5(8,5,2), CTRUE6(8,5,2), CV(8,5,2), CX(8),\n     +                  MWPCS(5), MWPCT(5)\n      DOUBLE PRECISION  STRUE2(5), STRUE4(5)\n      INTEGER           ITRUE3(5)\n*     .. External Functions ..\n      DOUBLE PRECISION  DZASUM, DZNRM2\n      INTEGER           IZAMAX\n      EXTERNAL          DZASUM, DZNRM2, IZAMAX\n*     .. External Subroutines ..\n      EXTERNAL          ZSCAL, ZDSCAL, CTEST, ITEST1, STEST1\n*     .. Intrinsic Functions ..\n      INTRINSIC         MAX\n*     .. Common blocks ..\n      COMMON            /COMBLA/ICASE, N, INCX, INCY, MODE, PASS\n*     .. Data statements ..\n      DATA              SA, CA/0.3D0, (0.4D0,-0.7D0)/\n      DATA              ((CV(I,J,1),I=1,8),J=1,5)/(0.1D0,0.1D0),\n     +                  (1.0D0,2.0D0), (1.0D0,2.0D0), (1.0D0,2.0D0),\n     +                  (1.0D0,2.0D0), (1.0D0,2.0D0), (1.0D0,2.0D0),\n     +                  (1.0D0,2.0D0), (0.3D0,-0.4D0), (3.0D0,4.0D0),\n     +                  (3.0D0,4.0D0), (3.0D0,4.0D0), (3.0D0,4.0D0),\n     +                  (3.0D0,4.0D0), (3.0D0,4.0D0), (3.0D0,4.0D0),\n     +                  (0.1D0,-0.3D0), (0.5D0,-0.1D0), (5.0D0,6.0D0),\n     +                  (5.0D0,6.0D0), (5.0D0,6.0D0), (5.0D0,6.0D0),\n     +                  (5.0D0,6.0D0), (5.0D0,6.0D0), (0.1D0,0.1D0),\n     +                  (-0.6D0,0.1D0), (0.1D0,-0.3D0), (7.0D0,8.0D0),\n     +                  (7.0D0,8.0D0), (7.0D0,8.0D0), (7.0D0,8.0D0),\n     +                  (7.0D0,8.0D0), (0.3D0,0.1D0), (0.1D0,0.4D0),\n     +                  (0.4D0,0.1D0), (0.1D0,0.2D0), (2.0D0,3.0D0),\n     +                  (2.0D0,3.0D0), (2.0D0,3.0D0), (2.0D0,3.0D0)/\n      DATA              ((CV(I,J,2),I=1,8),J=1,5)/(0.1D0,0.1D0),\n     +                  (4.0D0,5.0D0), (4.0D0,5.0D0), (4.0D0,5.0D0),\n     +                  (4.0D0,5.0D0), (4.0D0,5.0D0), (4.0D0,5.0D0),\n     +                  (4.0D0,5.0D0), (0.3D0,-0.4D0), (6.0D0,7.0D0),\n     +                  (6.0D0,7.0D0), (6.0D0,7.0D0), (6.0D0,7.0D0),\n     +                  (6.0D0,7.0D0), (6.0D0,7.0D0), (6.0D0,7.0D0),\n     +                  (0.1D0,-0.3D0), (8.0D0,9.0D0), (0.5D0,-0.1D0),\n     +                  (2.0D0,5.0D0), (2.0D0,5.0D0), (2.0D0,5.0D0),\n     +                  (2.0D0,5.0D0), (2.0D0,5.0D0), (0.1D0,0.1D0),\n     +                  (3.0D0,6.0D0), (-0.6D0,0.1D0), (4.0D0,7.0D0),\n     +                  (0.1D0,-0.3D0), (7.0D0,2.0D0), (7.0D0,2.0D0),\n     +                  (7.0D0,2.0D0), (0.3D0,0.1D0), (5.0D0,8.0D0),\n     +                  (0.1D0,0.4D0), (6.0D0,9.0D0), (0.4D0,0.1D0),\n     +                  (8.0D0,3.0D0), (0.1D0,0.2D0), (9.0D0,4.0D0)/\n      DATA              STRUE2/0.0D0, 0.5D0, 0.6D0, 0.7D0, 0.7D0/\n      DATA              STRUE4/0.0D0, 0.7D0, 1.0D0, 1.3D0, 1.7D0/\n      DATA              ((CTRUE5(I,J,1),I=1,8),J=1,5)/(0.1D0,0.1D0),\n     +                  (1.0D0,2.0D0), (1.0D0,2.0D0), (1.0D0,2.0D0),\n     +                  (1.0D0,2.0D0), (1.0D0,2.0D0), (1.0D0,2.0D0),\n     +                  (1.0D0,2.0D0), (-0.16D0,-0.37D0), (3.0D0,4.0D0),\n     +                  (3.0D0,4.0D0), (3.0D0,4.0D0), (3.0D0,4.0D0),\n     +                  (3.0D0,4.0D0), (3.0D0,4.0D0), (3.0D0,4.0D0),\n     +                  (-0.17D0,-0.19D0), (0.13D0,-0.39D0),\n     +                  (5.0D0,6.0D0), (5.0D0,6.0D0), (5.0D0,6.0D0),\n     +                  (5.0D0,6.0D0), (5.0D0,6.0D0), (5.0D0,6.0D0),\n     +                  (0.11D0,-0.03D0), (-0.17D0,0.46D0),\n     +                  (-0.17D0,-0.19D0), (7.0D0,8.0D0), (7.0D0,8.0D0),\n     +                  (7.0D0,8.0D0), (7.0D0,8.0D0), (7.0D0,8.0D0),\n     +                  (0.19D0,-0.17D0), (0.32D0,0.09D0),\n     +                  (0.23D0,-0.24D0), (0.18D0,0.01D0),\n     +                  (2.0D0,3.0D0), (2.0D0,3.0D0), (2.0D0,3.0D0),\n     +                  (2.0D0,3.0D0)/\n      DATA              ((CTRUE5(I,J,2),I=1,8),J=1,5)/(0.1D0,0.1D0),\n     +                  (4.0D0,5.0D0), (4.0D0,5.0D0), (4.0D0,5.0D0),\n     +                  (4.0D0,5.0D0), (4.0D0,5.0D0), (4.0D0,5.0D0),\n     +                  (4.0D0,5.0D0), (-0.16D0,-0.37D0), (6.0D0,7.0D0),\n     +                  (6.0D0,7.0D0), (6.0D0,7.0D0), (6.0D0,7.0D0),\n     +                  (6.0D0,7.0D0), (6.0D0,7.0D0), (6.0D0,7.0D0),\n     +                  (-0.17D0,-0.19D0), (8.0D0,9.0D0),\n     +                  (0.13D0,-0.39D0), (2.0D0,5.0D0), (2.0D0,5.0D0),\n     +                  (2.0D0,5.0D0), (2.0D0,5.0D0), (2.0D0,5.0D0),\n     +                  (0.11D0,-0.03D0), (3.0D0,6.0D0),\n     +                  (-0.17D0,0.46D0), (4.0D0,7.0D0),\n     +                  (-0.17D0,-0.19D0), (7.0D0,2.0D0), (7.0D0,2.0D0),\n     +                  (7.0D0,2.0D0), (0.19D0,-0.17D0), (5.0D0,8.0D0),\n     +                  (0.32D0,0.09D0), (6.0D0,9.0D0),\n     +                  (0.23D0,-0.24D0), (8.0D0,3.0D0),\n     +                  (0.18D0,0.01D0), (9.0D0,4.0D0)/\n      DATA              ((CTRUE6(I,J,1),I=1,8),J=1,5)/(0.1D0,0.1D0),\n     +                  (1.0D0,2.0D0), (1.0D0,2.0D0), (1.0D0,2.0D0),\n     +                  (1.0D0,2.0D0), (1.0D0,2.0D0), (1.0D0,2.0D0),\n     +                  (1.0D0,2.0D0), (0.09D0,-0.12D0), (3.0D0,4.0D0),\n     +                  (3.0D0,4.0D0), (3.0D0,4.0D0), (3.0D0,4.0D0),\n     +                  (3.0D0,4.0D0), (3.0D0,4.0D0), (3.0D0,4.0D0),\n     +                  (0.03D0,-0.09D0), (0.15D0,-0.03D0),\n     +                  (5.0D0,6.0D0), (5.0D0,6.0D0), (5.0D0,6.0D0),\n     +                  (5.0D0,6.0D0), (5.0D0,6.0D0), (5.0D0,6.0D0),\n     +                  (0.03D0,0.03D0), (-0.18D0,0.03D0),\n     +                  (0.03D0,-0.09D0), (7.0D0,8.0D0), (7.0D0,8.0D0),\n     +                  (7.0D0,8.0D0), (7.0D0,8.0D0), (7.0D0,8.0D0),\n     +                  (0.09D0,0.03D0), (0.03D0,0.12D0),\n     +                  (0.12D0,0.03D0), (0.03D0,0.06D0), (2.0D0,3.0D0),\n     +                  (2.0D0,3.0D0), (2.0D0,3.0D0), (2.0D0,3.0D0)/\n      DATA              ((CTRUE6(I,J,2),I=1,8),J=1,5)/(0.1D0,0.1D0),\n     +                  (4.0D0,5.0D0), (4.0D0,5.0D0), (4.0D0,5.0D0),\n     +                  (4.0D0,5.0D0), (4.0D0,5.0D0), (4.0D0,5.0D0),\n     +                  (4.0D0,5.0D0), (0.09D0,-0.12D0), (6.0D0,7.0D0),\n     +                  (6.0D0,7.0D0), (6.0D0,7.0D0), (6.0D0,7.0D0),\n     +                  (6.0D0,7.0D0), (6.0D0,7.0D0), (6.0D0,7.0D0),\n     +                  (0.03D0,-0.09D0), (8.0D0,9.0D0),\n     +                  (0.15D0,-0.03D0), (2.0D0,5.0D0), (2.0D0,5.0D0),\n     +                  (2.0D0,5.0D0), (2.0D0,5.0D0), (2.0D0,5.0D0),\n     +                  (0.03D0,0.03D0), (3.0D0,6.0D0),\n     +                  (-0.18D0,0.03D0), (4.0D0,7.0D0),\n     +                  (0.03D0,-0.09D0), (7.0D0,2.0D0), (7.0D0,2.0D0),\n     +                  (7.0D0,2.0D0), (0.09D0,0.03D0), (5.0D0,8.0D0),\n     +                  (0.03D0,0.12D0), (6.0D0,9.0D0), (0.12D0,0.03D0),\n     +                  (8.0D0,3.0D0), (0.03D0,0.06D0), (9.0D0,4.0D0)/\n      DATA              ITRUE3/0, 1, 2, 2, 2/\n*     .. Executable Statements ..\n      DO 60 INCX = 1, 2\n         DO 40 NP1 = 1, 5\n            N = NP1 - 1\n            LEN = 2*MAX(N,1)\n*           .. Set vector arguments ..\n            DO 20 I = 1, LEN\n               CX(I) = CV(I,NP1,INCX)\n   20       CONTINUE\n            IF (ICASE.EQ.6) THEN\n*              .. DZNRM2 ..\n               CALL STEST1(DZNRM2(N,CX,INCX),STRUE2(NP1),STRUE2(NP1),\n     +                     SFAC)\n            ELSE IF (ICASE.EQ.7) THEN\n*              .. DZASUM ..\n               CALL STEST1(DZASUM(N,CX,INCX),STRUE4(NP1),STRUE4(NP1),\n     +                     SFAC)\n            ELSE IF (ICASE.EQ.8) THEN\n*              .. ZSCAL ..\n               CALL ZSCAL(N,CA,CX,INCX)\n               CALL CTEST(LEN,CX,CTRUE5(1,NP1,INCX),CTRUE5(1,NP1,INCX),\n     +                    SFAC)\n            ELSE IF (ICASE.EQ.9) THEN\n*              .. ZDSCAL ..\n               CALL ZDSCAL(N,SA,CX,INCX)\n               CALL CTEST(LEN,CX,CTRUE6(1,NP1,INCX),CTRUE6(1,NP1,INCX),\n     +                    SFAC)\n            ELSE IF (ICASE.EQ.10) THEN\n*              .. IZAMAX ..\n               CALL ITEST1(IZAMAX(N,CX,INCX),ITRUE3(NP1))\n            ELSE\n               WRITE (NOUT,*) ' Shouldn''t be here in CHECK1'\n               STOP\n            END IF\n*\n   40    CONTINUE\n   60 CONTINUE\n*\n      INCX = 1\n      IF (ICASE.EQ.8) THEN\n*        ZSCAL\n*        Add a test for alpha equal to zero.\n         CA = (0.0D0,0.0D0)\n         DO 80 I = 1, 5\n            MWPCT(I) = (0.0D0,0.0D0)\n            MWPCS(I) = (1.0D0,1.0D0)\n   80    CONTINUE\n         CALL ZSCAL(5,CA,CX,INCX)\n         CALL CTEST(5,CX,MWPCT,MWPCS,SFAC)\n      ELSE IF (ICASE.EQ.9) THEN\n*        ZDSCAL\n*        Add a test for alpha equal to zero.\n         SA = 0.0D0\n         DO 100 I = 1, 5\n            MWPCT(I) = (0.0D0,0.0D0)\n            MWPCS(I) = (1.0D0,1.0D0)\n  100    CONTINUE\n         CALL ZDSCAL(5,SA,CX,INCX)\n         CALL CTEST(5,CX,MWPCT,MWPCS,SFAC)\n*        Add a test for alpha equal to one.\n         SA = 1.0D0\n         DO 120 I = 1, 5\n            MWPCT(I) = CX(I)\n            MWPCS(I) = CX(I)\n  120    CONTINUE\n         CALL ZDSCAL(5,SA,CX,INCX)\n         CALL CTEST(5,CX,MWPCT,MWPCS,SFAC)\n*        Add a test for alpha equal to minus one.\n         SA = -1.0D0\n         DO 140 I = 1, 5\n            MWPCT(I) = -CX(I)\n            MWPCS(I) = -CX(I)\n  140    CONTINUE\n         CALL ZDSCAL(5,SA,CX,INCX)\n         CALL CTEST(5,CX,MWPCT,MWPCS,SFAC)\n      END IF\n      RETURN\n      END\n      SUBROUTINE CHECK2(SFAC)\n*     .. Parameters ..\n      INTEGER           NOUT\n      PARAMETER         (NOUT=6)\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION  SFAC\n*     .. Scalars in Common ..\n      INTEGER           ICASE, INCX, INCY, MODE, N\n      LOGICAL           PASS\n*     .. Local Scalars ..\n      COMPLEX*16        CA\n      INTEGER           I, J, KI, KN, KSIZE, LENX, LENY, MX, MY\n*     .. Local Arrays ..\n      COMPLEX*16        CDOT(1), CSIZE1(4), CSIZE2(7,2), CSIZE3(14),\n     +                  CT10X(7,4,4), CT10Y(7,4,4), CT6(4,4), CT7(4,4),\n     +                  CT8(7,4,4), CX(7), CX1(7), CY(7), CY1(7)\n      INTEGER           INCXS(4), INCYS(4), LENS(4,2), NS(4)\n*     .. External Functions ..\n      COMPLEX*16        ZDOTC, ZDOTU\n      EXTERNAL          ZDOTC, ZDOTU\n*     .. External Subroutines ..\n      EXTERNAL          ZAXPY, ZCOPY, ZSWAP, CTEST\n*     .. Intrinsic Functions ..\n      INTRINSIC         ABS, MIN\n*     .. Common blocks ..\n      COMMON            /COMBLA/ICASE, N, INCX, INCY, MODE, PASS\n*     .. Data statements ..\n      DATA              CA/(0.4D0,-0.7D0)/\n      DATA              INCXS/1, 2, -2, -1/\n      DATA              INCYS/1, -2, 1, -2/\n      DATA              LENS/1, 1, 2, 4, 1, 1, 3, 7/\n      DATA              NS/0, 1, 2, 4/\n      DATA              CX1/(0.7D0,-0.8D0), (-0.4D0,-0.7D0),\n     +                  (-0.1D0,-0.9D0), (0.2D0,-0.8D0),\n     +                  (-0.9D0,-0.4D0), (0.1D0,0.4D0), (-0.6D0,0.6D0)/\n      DATA              CY1/(0.6D0,-0.6D0), (-0.9D0,0.5D0),\n     +                  (0.7D0,-0.6D0), (0.1D0,-0.5D0), (-0.1D0,-0.2D0),\n     +                  (-0.5D0,-0.3D0), (0.8D0,-0.7D0)/\n      DATA              ((CT8(I,J,1),I=1,7),J=1,4)/(0.6D0,-0.6D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.32D0,-1.41D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.32D0,-1.41D0),\n     +                  (-1.55D0,0.5D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.32D0,-1.41D0), (-1.55D0,0.5D0),\n     +                  (0.03D0,-0.89D0), (-0.38D0,-0.96D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0)/\n      DATA              ((CT8(I,J,2),I=1,7),J=1,4)/(0.6D0,-0.6D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.32D0,-1.41D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (-0.07D0,-0.89D0),\n     +                  (-0.9D0,0.5D0), (0.42D0,-1.41D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.78D0,0.06D0), (-0.9D0,0.5D0),\n     +                  (0.06D0,-0.13D0), (0.1D0,-0.5D0),\n     +                  (-0.77D0,-0.49D0), (-0.5D0,-0.3D0),\n     +                  (0.52D0,-1.51D0)/\n      DATA              ((CT8(I,J,3),I=1,7),J=1,4)/(0.6D0,-0.6D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.32D0,-1.41D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (-0.07D0,-0.89D0),\n     +                  (-1.18D0,-0.31D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.78D0,0.06D0), (-1.54D0,0.97D0),\n     +                  (0.03D0,-0.89D0), (-0.18D0,-1.31D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0)/\n      DATA              ((CT8(I,J,4),I=1,7),J=1,4)/(0.6D0,-0.6D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.32D0,-1.41D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.32D0,-1.41D0), (-0.9D0,0.5D0),\n     +                  (0.05D0,-0.6D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.32D0,-1.41D0),\n     +                  (-0.9D0,0.5D0), (0.05D0,-0.6D0), (0.1D0,-0.5D0),\n     +                  (-0.77D0,-0.49D0), (-0.5D0,-0.3D0),\n     +                  (0.32D0,-1.16D0)/\n      DATA              CT7/(0.0D0,0.0D0), (-0.06D0,-0.90D0),\n     +                  (0.65D0,-0.47D0), (-0.34D0,-1.22D0),\n     +                  (0.0D0,0.0D0), (-0.06D0,-0.90D0),\n     +                  (-0.59D0,-1.46D0), (-1.04D0,-0.04D0),\n     +                  (0.0D0,0.0D0), (-0.06D0,-0.90D0),\n     +                  (-0.83D0,0.59D0), (0.07D0,-0.37D0),\n     +                  (0.0D0,0.0D0), (-0.06D0,-0.90D0),\n     +                  (-0.76D0,-1.15D0), (-1.33D0,-1.82D0)/\n      DATA              CT6/(0.0D0,0.0D0), (0.90D0,0.06D0),\n     +                  (0.91D0,-0.77D0), (1.80D0,-0.10D0),\n     +                  (0.0D0,0.0D0), (0.90D0,0.06D0), (1.45D0,0.74D0),\n     +                  (0.20D0,0.90D0), (0.0D0,0.0D0), (0.90D0,0.06D0),\n     +                  (-0.55D0,0.23D0), (0.83D0,-0.39D0),\n     +                  (0.0D0,0.0D0), (0.90D0,0.06D0), (1.04D0,0.79D0),\n     +                  (1.95D0,1.22D0)/\n      DATA              ((CT10X(I,J,1),I=1,7),J=1,4)/(0.7D0,-0.8D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.6D0,-0.6D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.6D0,-0.6D0), (-0.9D0,0.5D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.6D0,-0.6D0),\n     +                  (-0.9D0,0.5D0), (0.7D0,-0.6D0), (0.1D0,-0.5D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0)/\n      DATA              ((CT10X(I,J,2),I=1,7),J=1,4)/(0.7D0,-0.8D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.6D0,-0.6D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.7D0,-0.6D0), (-0.4D0,-0.7D0),\n     +                  (0.6D0,-0.6D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.8D0,-0.7D0),\n     +                  (-0.4D0,-0.7D0), (-0.1D0,-0.2D0),\n     +                  (0.2D0,-0.8D0), (0.7D0,-0.6D0), (0.1D0,0.4D0),\n     +                  (0.6D0,-0.6D0)/\n      DATA              ((CT10X(I,J,3),I=1,7),J=1,4)/(0.7D0,-0.8D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.6D0,-0.6D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (-0.9D0,0.5D0), (-0.4D0,-0.7D0),\n     +                  (0.6D0,-0.6D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.1D0,-0.5D0),\n     +                  (-0.4D0,-0.7D0), (0.7D0,-0.6D0), (0.2D0,-0.8D0),\n     +                  (-0.9D0,0.5D0), (0.1D0,0.4D0), (0.6D0,-0.6D0)/\n      DATA              ((CT10X(I,J,4),I=1,7),J=1,4)/(0.7D0,-0.8D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.6D0,-0.6D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.6D0,-0.6D0), (0.7D0,-0.6D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.6D0,-0.6D0),\n     +                  (0.7D0,-0.6D0), (-0.1D0,-0.2D0), (0.8D0,-0.7D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0)/\n      DATA              ((CT10Y(I,J,1),I=1,7),J=1,4)/(0.6D0,-0.6D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.7D0,-0.8D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.7D0,-0.8D0), (-0.4D0,-0.7D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.7D0,-0.8D0),\n     +                  (-0.4D0,-0.7D0), (-0.1D0,-0.9D0),\n     +                  (0.2D0,-0.8D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0)/\n      DATA              ((CT10Y(I,J,2),I=1,7),J=1,4)/(0.6D0,-0.6D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.7D0,-0.8D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (-0.1D0,-0.9D0), (-0.9D0,0.5D0),\n     +                  (0.7D0,-0.8D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (-0.6D0,0.6D0),\n     +                  (-0.9D0,0.5D0), (-0.9D0,-0.4D0), (0.1D0,-0.5D0),\n     +                  (-0.1D0,-0.9D0), (-0.5D0,-0.3D0),\n     +                  (0.7D0,-0.8D0)/\n      DATA              ((CT10Y(I,J,3),I=1,7),J=1,4)/(0.6D0,-0.6D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.7D0,-0.8D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (-0.1D0,-0.9D0), (0.7D0,-0.8D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (-0.6D0,0.6D0),\n     +                  (-0.9D0,-0.4D0), (-0.1D0,-0.9D0),\n     +                  (0.7D0,-0.8D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0)/\n      DATA              ((CT10Y(I,J,4),I=1,7),J=1,4)/(0.6D0,-0.6D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.7D0,-0.8D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.7D0,-0.8D0), (-0.9D0,0.5D0),\n     +                  (-0.4D0,-0.7D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.7D0,-0.8D0),\n     +                  (-0.9D0,0.5D0), (-0.4D0,-0.7D0), (0.1D0,-0.5D0),\n     +                  (-0.1D0,-0.9D0), (-0.5D0,-0.3D0),\n     +                  (0.2D0,-0.8D0)/\n      DATA              CSIZE1/(0.0D0,0.0D0), (0.9D0,0.9D0),\n     +                  (1.63D0,1.73D0), (2.90D0,2.78D0)/\n      DATA              CSIZE3/(0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (1.17D0,1.17D0),\n     +                  (1.17D0,1.17D0), (1.17D0,1.17D0),\n     +                  (1.17D0,1.17D0), (1.17D0,1.17D0),\n     +                  (1.17D0,1.17D0), (1.17D0,1.17D0)/\n      DATA              CSIZE2/(0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (0.0D0,0.0D0),\n     +                  (0.0D0,0.0D0), (0.0D0,0.0D0), (1.54D0,1.54D0),\n     +                  (1.54D0,1.54D0), (1.54D0,1.54D0),\n     +                  (1.54D0,1.54D0), (1.54D0,1.54D0),\n     +                  (1.54D0,1.54D0), (1.54D0,1.54D0)/\n*     .. Executable Statements ..\n      DO 60 KI = 1, 4\n         INCX = INCXS(KI)\n         INCY = INCYS(KI)\n         MX = ABS(INCX)\n         MY = ABS(INCY)\n*\n         DO 40 KN = 1, 4\n            N = NS(KN)\n            KSIZE = MIN(2,KN)\n            LENX = LENS(KN,MX)\n            LENY = LENS(KN,MY)\n*           .. initialize all argument arrays ..\n            DO 20 I = 1, 7\n               CX(I) = CX1(I)\n               CY(I) = CY1(I)\n   20       CONTINUE\n            IF (ICASE.EQ.1) THEN\n*              .. ZDOTC ..\n               CDOT(1) = ZDOTC(N,CX,INCX,CY,INCY)\n               CALL CTEST(1,CDOT,CT6(KN,KI),CSIZE1(KN),SFAC)\n            ELSE IF (ICASE.EQ.2) THEN\n*              .. ZDOTU ..\n               CDOT(1) = ZDOTU(N,CX,INCX,CY,INCY)\n               CALL CTEST(1,CDOT,CT7(KN,KI),CSIZE1(KN),SFAC)\n            ELSE IF (ICASE.EQ.3) THEN\n*              .. ZAXPY ..\n               CALL ZAXPY(N,CA,CX,INCX,CY,INCY)\n               CALL CTEST(LENY,CY,CT8(1,KN,KI),CSIZE2(1,KSIZE),SFAC)\n            ELSE IF (ICASE.EQ.4) THEN\n*              .. ZCOPY ..\n               CALL ZCOPY(N,CX,INCX,CY,INCY)\n               CALL CTEST(LENY,CY,CT10Y(1,KN,KI),CSIZE3,1.0D0)\n            ELSE IF (ICASE.EQ.5) THEN\n*              .. ZSWAP ..\n               CALL ZSWAP(N,CX,INCX,CY,INCY)\n               CALL CTEST(LENX,CX,CT10X(1,KN,KI),CSIZE3,1.0D0)\n               CALL CTEST(LENY,CY,CT10Y(1,KN,KI),CSIZE3,1.0D0)\n            ELSE\n               WRITE (NOUT,*) ' Shouldn''t be here in CHECK2'\n               STOP\n            END IF\n*\n   40    CONTINUE\n   60 CONTINUE\n      RETURN\n      END\n      SUBROUTINE STEST(LEN,SCOMP,STRUE,SSIZE,SFAC)\n*     ********************************* STEST **************************\n*\n*     THIS SUBR COMPARES ARRAYS  SCOMP() AND STRUE() OF LENGTH LEN TO\n*     SEE IF THE TERM BY TERM DIFFERENCES, MULTIPLIED BY SFAC, ARE\n*     NEGLIGIBLE.\n*\n*     C. L. LAWSON, JPL, 1974 DEC 10\n*\n*     .. Parameters ..\n      INTEGER          NOUT\n      PARAMETER        (NOUT=6)\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION SFAC\n      INTEGER          LEN\n*     .. Array Arguments ..\n      DOUBLE PRECISION SCOMP(LEN), SSIZE(LEN), STRUE(LEN)\n*     .. Scalars in Common ..\n      INTEGER          ICASE, INCX, INCY, MODE, N\n      LOGICAL          PASS\n*     .. Local Scalars ..\n      DOUBLE PRECISION SD\n      INTEGER          I\n*     .. External Functions ..\n      DOUBLE PRECISION SDIFF\n      EXTERNAL         SDIFF\n*     .. Intrinsic Functions ..\n      INTRINSIC        ABS\n*     .. Common blocks ..\n      COMMON           /COMBLA/ICASE, N, INCX, INCY, MODE, PASS\n*     .. Executable Statements ..\n*\n      DO 40 I = 1, LEN\n         SD = SCOMP(I) - STRUE(I)\n         IF (SDIFF(ABS(SSIZE(I))+ABS(SFAC*SD),ABS(SSIZE(I))).EQ.0.0D0)\n     +       GO TO 40\n*\n*                             HERE    SCOMP(I) IS NOT CLOSE TO STRUE(I).\n*\n         IF ( .NOT. PASS) GO TO 20\n*                             PRINT FAIL MESSAGE AND HEADER.\n         PASS = .FALSE.\n         WRITE (NOUT,99999)\n         WRITE (NOUT,99998)\n   20    WRITE (NOUT,99997) ICASE, N, INCX, INCY, MODE, I, SCOMP(I),\n     +     STRUE(I), SD, SSIZE(I)\n   40 CONTINUE\n      RETURN\n*\n99999 FORMAT ('                                       FAIL')\n99998 FORMAT (/' CASE  N INCX INCY MODE  I                            ',\n     +       ' COMP(I)                             TRUE(I)  DIFFERENCE',\n     +       '     SIZE(I)',/1X)\n99997 FORMAT (1X,I4,I3,3I5,I3,2D36.8,2D12.4)\n      END\n      SUBROUTINE STEST1(SCOMP1,STRUE1,SSIZE,SFAC)\n*     ************************* STEST1 *****************************\n*\n*     THIS IS AN INTERFACE SUBROUTINE TO ACCOMODATE THE FORTRAN\n*     REQUIREMENT THAT WHEN A DUMMY ARGUMENT IS AN ARRAY, THE\n*     ACTUAL ARGUMENT MUST ALSO BE AN ARRAY OR AN ARRAY ELEMENT.\n*\n*     C.L. LAWSON, JPL, 1978 DEC 6\n*\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION  SCOMP1, SFAC, STRUE1\n*     .. Array Arguments ..\n      DOUBLE PRECISION  SSIZE(*)\n*     .. Local Arrays ..\n      DOUBLE PRECISION  SCOMP(1), STRUE(1)\n*     .. External Subroutines ..\n      EXTERNAL          STEST\n*     .. Executable Statements ..\n*\n      SCOMP(1) = SCOMP1\n      STRUE(1) = STRUE1\n      CALL STEST(1,SCOMP,STRUE,SSIZE,SFAC)\n*\n      RETURN\n      END\n      DOUBLE PRECISION FUNCTION SDIFF(SA,SB)\n*     ********************************* SDIFF **************************\n*     COMPUTES DIFFERENCE OF TWO NUMBERS.  C. L. LAWSON, JPL 1974 FEB 15\n*\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION                SA, SB\n*     .. Executable Statements ..\n      SDIFF = SA - SB\n      RETURN\n      END\n      SUBROUTINE CTEST(LEN,CCOMP,CTRUE,CSIZE,SFAC)\n*     **************************** CTEST *****************************\n*\n*     C.L. LAWSON, JPL, 1978 DEC 6\n*\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION SFAC\n      INTEGER          LEN\n*     .. Array Arguments ..\n      COMPLEX*16       CCOMP(LEN), CSIZE(LEN), CTRUE(LEN)\n*     .. Local Scalars ..\n      INTEGER          I\n*     .. Local Arrays ..\n      DOUBLE PRECISION SCOMP(20), SSIZE(20), STRUE(20)\n*     .. External Subroutines ..\n      EXTERNAL         STEST\n*     .. Intrinsic Functions ..\n      INTRINSIC        DIMAG, DBLE\n*     .. Executable Statements ..\n      DO 20 I = 1, LEN\n         SCOMP(2*I-1) = DBLE(CCOMP(I))\n         SCOMP(2*I) = DIMAG(CCOMP(I))\n         STRUE(2*I-1) = DBLE(CTRUE(I))\n         STRUE(2*I) = DIMAG(CTRUE(I))\n         SSIZE(2*I-1) = DBLE(CSIZE(I))\n         SSIZE(2*I) = DIMAG(CSIZE(I))\n   20 CONTINUE\n*\n      CALL STEST(2*LEN,SCOMP,STRUE,SSIZE,SFAC)\n      RETURN\n      END\n      SUBROUTINE ITEST1(ICOMP,ITRUE)\n*     ********************************* ITEST1 *************************\n*\n*     THIS SUBROUTINE COMPARES THE VARIABLES ICOMP AND ITRUE FOR\n*     EQUALITY.\n*     C. L. LAWSON, JPL, 1974 DEC 10\n*\n*     .. Parameters ..\n      INTEGER           NOUT\n      PARAMETER         (NOUT=6)\n*     .. Scalar Arguments ..\n      INTEGER           ICOMP, ITRUE\n*     .. Scalars in Common ..\n      INTEGER           ICASE, INCX, INCY, MODE, N\n      LOGICAL           PASS\n*     .. Local Scalars ..\n      INTEGER           ID\n*     .. Common blocks ..\n      COMMON            /COMBLA/ICASE, N, INCX, INCY, MODE, PASS\n*     .. Executable Statements ..\n      IF (ICOMP.EQ.ITRUE) GO TO 40\n*\n*                            HERE ICOMP IS NOT EQUAL TO ITRUE.\n*\n      IF ( .NOT. PASS) GO TO 20\n*                             PRINT FAIL MESSAGE AND HEADER.\n      PASS = .FALSE.\n      WRITE (NOUT,99999)\n      WRITE (NOUT,99998)\n   20 ID = ICOMP - ITRUE\n      WRITE (NOUT,99997) ICASE, N, INCX, INCY, MODE, ICOMP, ITRUE, ID\n   40 CONTINUE\n      RETURN\n*\n99999 FORMAT ('                                       FAIL')\n99998 FORMAT (/' CASE  N INCX INCY MODE                               ',\n     +       ' COMP                                TRUE     DIFFERENCE',\n     +       /1X)\n99997 FORMAT (1X,I4,I3,3I5,2I36,I12)\n      END\n"
  },
  {
    "path": "libs/eigen/blas/testing/zblat2.f",
    "content": "      PROGRAM ZBLAT2\n*\n*  Test program for the COMPLEX*16       Level 2 Blas.\n*\n*  The program must be driven by a short data file. The first 18 records\n*  of the file are read using list-directed input, the last 17 records\n*  are read using the format ( A6, L2 ). An annotated example of a data\n*  file can be obtained by deleting the first 3 characters from the\n*  following 35 lines:\n*  'ZBLAT2.SUMM'     NAME OF SUMMARY OUTPUT FILE\n*  6                 UNIT NUMBER OF SUMMARY FILE\n*  'CBLA2T.SNAP'     NAME OF SNAPSHOT OUTPUT FILE\n*  -1                UNIT NUMBER OF SNAPSHOT FILE (NOT USED IF .LT. 0)\n*  F        LOGICAL FLAG, T TO REWIND SNAPSHOT FILE AFTER EACH RECORD.\n*  F        LOGICAL FLAG, T TO STOP ON FAILURES.\n*  T        LOGICAL FLAG, T TO TEST ERROR EXITS.\n*  16.0     THRESHOLD VALUE OF TEST RATIO\n*  6                 NUMBER OF VALUES OF N\n*  0 1 2 3 5 9       VALUES OF N\n*  4                 NUMBER OF VALUES OF K\n*  0 1 2 4           VALUES OF K\n*  4                 NUMBER OF VALUES OF INCX AND INCY\n*  1 2 -1 -2         VALUES OF INCX AND INCY\n*  3                 NUMBER OF VALUES OF ALPHA\n*  (0.0,0.0) (1.0,0.0) (0.7,-0.9)       VALUES OF ALPHA\n*  3                 NUMBER OF VALUES OF BETA\n*  (0.0,0.0) (1.0,0.0) (1.3,-1.1)       VALUES OF BETA\n*  ZGEMV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  ZGBMV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  ZHEMV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  ZHBMV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  ZHPMV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  ZTRMV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  ZTBMV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  ZTPMV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  ZTRSV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  ZTBSV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  ZTPSV  T PUT F FOR NO TEST. SAME COLUMNS.\n*  ZGERC  T PUT F FOR NO TEST. SAME COLUMNS.\n*  ZGERU  T PUT F FOR NO TEST. SAME COLUMNS.\n*  ZHER   T PUT F FOR NO TEST. SAME COLUMNS.\n*  ZHPR   T PUT F FOR NO TEST. SAME COLUMNS.\n*  ZHER2  T PUT F FOR NO TEST. SAME COLUMNS.\n*  ZHPR2  T PUT F FOR NO TEST. SAME COLUMNS.\n*\n*     See:\n*\n*        Dongarra J. J., Du Croz J. J., Hammarling S.  and Hanson R. J..\n*        An  extended  set of Fortran  Basic Linear Algebra Subprograms.\n*\n*        Technical  Memoranda  Nos. 41 (revision 3) and 81,  Mathematics\n*        and  Computer Science  Division,  Argonne  National Laboratory,\n*        9700 South Cass Avenue, Argonne, Illinois 60439, US.\n*\n*        Or\n*\n*        NAG  Technical Reports TR3/87 and TR4/87,  Numerical Algorithms\n*        Group  Ltd.,  NAG  Central  Office,  256  Banbury  Road, Oxford\n*        OX2 7DE, UK,  and  Numerical Algorithms Group Inc.,  1101  31st\n*        Street,  Suite 100,  Downers Grove,  Illinois 60515-1263,  USA.\n*\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Parameters ..\n      INTEGER            NIN\n      PARAMETER          ( NIN = 5 )\n      INTEGER            NSUBS\n      PARAMETER          ( NSUBS = 17 )\n      COMPLEX*16         ZERO, ONE\n      PARAMETER          ( ZERO = ( 0.0D0, 0.0D0 ),\n     $                   ONE = ( 1.0D0, 0.0D0 ) )\n      DOUBLE PRECISION   RZERO, RHALF, RONE\n      PARAMETER          ( RZERO = 0.0D0, RHALF = 0.5D0, RONE = 1.0D0 )\n      INTEGER            NMAX, INCMAX\n      PARAMETER          ( NMAX = 65, INCMAX = 2 )\n      INTEGER            NINMAX, NIDMAX, NKBMAX, NALMAX, NBEMAX\n      PARAMETER          ( NINMAX = 7, NIDMAX = 9, NKBMAX = 7,\n     $                   NALMAX = 7, NBEMAX = 7 )\n*     .. Local Scalars ..\n      DOUBLE PRECISION   EPS, ERR, THRESH\n      INTEGER            I, ISNUM, J, N, NALF, NBET, NIDIM, NINC, NKB,\n     $                   NOUT, NTRA\n      LOGICAL            FATAL, LTESTT, REWI, SAME, SFATAL, TRACE,\n     $                   TSTERR\n      CHARACTER*1        TRANS\n      CHARACTER*6        SNAMET\n      CHARACTER*32       SNAPS, SUMMRY\n*     .. Local Arrays ..\n      COMPLEX*16         A( NMAX, NMAX ), AA( NMAX*NMAX ),\n     $                   ALF( NALMAX ), AS( NMAX*NMAX ), BET( NBEMAX ),\n     $                   X( NMAX ), XS( NMAX*INCMAX ),\n     $                   XX( NMAX*INCMAX ), Y( NMAX ),\n     $                   YS( NMAX*INCMAX ), YT( NMAX ),\n     $                   YY( NMAX*INCMAX ), Z( 2*NMAX )\n      DOUBLE PRECISION   G( NMAX )\n      INTEGER            IDIM( NIDMAX ), INC( NINMAX ), KB( NKBMAX )\n      LOGICAL            LTEST( NSUBS )\n      CHARACTER*6        SNAMES( NSUBS )\n*     .. External Functions ..\n      DOUBLE PRECISION   DDIFF\n      LOGICAL            LZE\n      EXTERNAL           DDIFF, LZE\n*     .. External Subroutines ..\n      EXTERNAL           ZCHK1, ZCHK2, ZCHK3, ZCHK4, ZCHK5, ZCHK6,\n     $                   ZCHKE, ZMVCH\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, MAX, MIN\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n      CHARACTER*6        SRNAMT\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n      COMMON             /SRNAMC/SRNAMT\n*     .. Data statements ..\n      DATA               SNAMES/'ZGEMV ', 'ZGBMV ', 'ZHEMV ', 'ZHBMV ',\n     $                   'ZHPMV ', 'ZTRMV ', 'ZTBMV ', 'ZTPMV ',\n     $                   'ZTRSV ', 'ZTBSV ', 'ZTPSV ', 'ZGERC ',\n     $                   'ZGERU ', 'ZHER  ', 'ZHPR  ', 'ZHER2 ',\n     $                   'ZHPR2 '/\n*     .. Executable Statements ..\n*\n*     Read name and unit number for summary output file and open file.\n*\n      READ( NIN, FMT = * )SUMMRY\n      READ( NIN, FMT = * )NOUT\n      OPEN( NOUT, FILE = SUMMRY, STATUS = 'NEW' )\n      NOUTC = NOUT\n*\n*     Read name and unit number for snapshot output file and open file.\n*\n      READ( NIN, FMT = * )SNAPS\n      READ( NIN, FMT = * )NTRA\n      TRACE = NTRA.GE.0\n      IF( TRACE )THEN\n         OPEN( NTRA, FILE = SNAPS, STATUS = 'NEW' )\n      END IF\n*     Read the flag that directs rewinding of the snapshot file.\n      READ( NIN, FMT = * )REWI\n      REWI = REWI.AND.TRACE\n*     Read the flag that directs stopping on any failure.\n      READ( NIN, FMT = * )SFATAL\n*     Read the flag that indicates whether error exits are to be tested.\n      READ( NIN, FMT = * )TSTERR\n*     Read the threshold value of the test ratio\n      READ( NIN, FMT = * )THRESH\n*\n*     Read and check the parameter values for the tests.\n*\n*     Values of N\n      READ( NIN, FMT = * )NIDIM\n      IF( NIDIM.LT.1.OR.NIDIM.GT.NIDMAX )THEN\n         WRITE( NOUT, FMT = 9997 )'N', NIDMAX\n         GO TO 230\n      END IF\n      READ( NIN, FMT = * )( IDIM( I ), I = 1, NIDIM )\n      DO 10 I = 1, NIDIM\n         IF( IDIM( I ).LT.0.OR.IDIM( I ).GT.NMAX )THEN\n            WRITE( NOUT, FMT = 9996 )NMAX\n            GO TO 230\n         END IF\n   10 CONTINUE\n*     Values of K\n      READ( NIN, FMT = * )NKB\n      IF( NKB.LT.1.OR.NKB.GT.NKBMAX )THEN\n         WRITE( NOUT, FMT = 9997 )'K', NKBMAX\n         GO TO 230\n      END IF\n      READ( NIN, FMT = * )( KB( I ), I = 1, NKB )\n      DO 20 I = 1, NKB\n         IF( KB( I ).LT.0 )THEN\n            WRITE( NOUT, FMT = 9995 )\n            GO TO 230\n         END IF\n   20 CONTINUE\n*     Values of INCX and INCY\n      READ( NIN, FMT = * )NINC\n      IF( NINC.LT.1.OR.NINC.GT.NINMAX )THEN\n         WRITE( NOUT, FMT = 9997 )'INCX AND INCY', NINMAX\n         GO TO 230\n      END IF\n      READ( NIN, FMT = * )( INC( I ), I = 1, NINC )\n      DO 30 I = 1, NINC\n         IF( INC( I ).EQ.0.OR.ABS( INC( I ) ).GT.INCMAX )THEN\n            WRITE( NOUT, FMT = 9994 )INCMAX\n            GO TO 230\n         END IF\n   30 CONTINUE\n*     Values of ALPHA\n      READ( NIN, FMT = * )NALF\n      IF( NALF.LT.1.OR.NALF.GT.NALMAX )THEN\n         WRITE( NOUT, FMT = 9997 )'ALPHA', NALMAX\n         GO TO 230\n      END IF\n      READ( NIN, FMT = * )( ALF( I ), I = 1, NALF )\n*     Values of BETA\n      READ( NIN, FMT = * )NBET\n      IF( NBET.LT.1.OR.NBET.GT.NBEMAX )THEN\n         WRITE( NOUT, FMT = 9997 )'BETA', NBEMAX\n         GO TO 230\n      END IF\n      READ( NIN, FMT = * )( BET( I ), I = 1, NBET )\n*\n*     Report values of parameters.\n*\n      WRITE( NOUT, FMT = 9993 )\n      WRITE( NOUT, FMT = 9992 )( IDIM( I ), I = 1, NIDIM )\n      WRITE( NOUT, FMT = 9991 )( KB( I ), I = 1, NKB )\n      WRITE( NOUT, FMT = 9990 )( INC( I ), I = 1, NINC )\n      WRITE( NOUT, FMT = 9989 )( ALF( I ), I = 1, NALF )\n      WRITE( NOUT, FMT = 9988 )( BET( I ), I = 1, NBET )\n      IF( .NOT.TSTERR )THEN\n         WRITE( NOUT, FMT = * )\n         WRITE( NOUT, FMT = 9980 )\n      END IF\n      WRITE( NOUT, FMT = * )\n      WRITE( NOUT, FMT = 9999 )THRESH\n      WRITE( NOUT, FMT = * )\n*\n*     Read names of subroutines and flags which indicate\n*     whether they are to be tested.\n*\n      DO 40 I = 1, NSUBS\n         LTEST( I ) = .FALSE.\n   40 CONTINUE\n   50 READ( NIN, FMT = 9984, END = 80 )SNAMET, LTESTT\n      DO 60 I = 1, NSUBS\n         IF( SNAMET.EQ.SNAMES( I ) )\n     $      GO TO 70\n   60 CONTINUE\n      WRITE( NOUT, FMT = 9986 )SNAMET\n      STOP\n   70 LTEST( I ) = LTESTT\n      GO TO 50\n*\n   80 CONTINUE\n      CLOSE ( NIN )\n*\n*     Compute EPS (the machine precision).\n*\n      EPS = RONE\n   90 CONTINUE\n      IF( DDIFF( RONE + EPS, RONE ).EQ.RZERO )\n     $   GO TO 100\n      EPS = RHALF*EPS\n      GO TO 90\n  100 CONTINUE\n      EPS = EPS + EPS\n      WRITE( NOUT, FMT = 9998 )EPS\n*\n*     Check the reliability of ZMVCH using exact data.\n*\n      N = MIN( 32, NMAX )\n      DO 120 J = 1, N\n         DO 110 I = 1, N\n            A( I, J ) = MAX( I - J + 1, 0 )\n  110    CONTINUE\n         X( J ) = J\n         Y( J ) = ZERO\n  120 CONTINUE\n      DO 130 J = 1, N\n         YY( J ) = J*( ( J + 1 )*J )/2 - ( ( J + 1 )*J*( J - 1 ) )/3\n  130 CONTINUE\n*     YY holds the exact result. On exit from ZMVCH YT holds\n*     the result computed by ZMVCH.\n      TRANS = 'N'\n      CALL ZMVCH( TRANS, N, N, ONE, A, NMAX, X, 1, ZERO, Y, 1, YT, G,\n     $            YY, EPS, ERR, FATAL, NOUT, .TRUE. )\n      SAME = LZE( YY, YT, N )\n      IF( .NOT.SAME.OR.ERR.NE.RZERO )THEN\n         WRITE( NOUT, FMT = 9985 )TRANS, SAME, ERR\n         STOP\n      END IF\n      TRANS = 'T'\n      CALL ZMVCH( TRANS, N, N, ONE, A, NMAX, X, -1, ZERO, Y, -1, YT, G,\n     $            YY, EPS, ERR, FATAL, NOUT, .TRUE. )\n      SAME = LZE( YY, YT, N )\n      IF( .NOT.SAME.OR.ERR.NE.RZERO )THEN\n         WRITE( NOUT, FMT = 9985 )TRANS, SAME, ERR\n         STOP\n      END IF\n*\n*     Test each subroutine in turn.\n*\n      DO 210 ISNUM = 1, NSUBS\n         WRITE( NOUT, FMT = * )\n         IF( .NOT.LTEST( ISNUM ) )THEN\n*           Subprogram is not to be tested.\n            WRITE( NOUT, FMT = 9983 )SNAMES( ISNUM )\n         ELSE\n            SRNAMT = SNAMES( ISNUM )\n*           Test error exits.\n            IF( TSTERR )THEN\n               CALL ZCHKE( ISNUM, SNAMES( ISNUM ), NOUT )\n               WRITE( NOUT, FMT = * )\n            END IF\n*           Test computations.\n            INFOT = 0\n            OK = .TRUE.\n            FATAL = .FALSE.\n            GO TO ( 140, 140, 150, 150, 150, 160, 160,\n     $              160, 160, 160, 160, 170, 170, 180,\n     $              180, 190, 190 )ISNUM\n*           Test ZGEMV, 01, and ZGBMV, 02.\n  140       CALL ZCHK1( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF,\n     $                  NBET, BET, NINC, INC, NMAX, INCMAX, A, AA, AS,\n     $                  X, XX, XS, Y, YY, YS, YT, G )\n            GO TO 200\n*           Test ZHEMV, 03, ZHBMV, 04, and ZHPMV, 05.\n  150       CALL ZCHK2( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF,\n     $                  NBET, BET, NINC, INC, NMAX, INCMAX, A, AA, AS,\n     $                  X, XX, XS, Y, YY, YS, YT, G )\n            GO TO 200\n*           Test ZTRMV, 06, ZTBMV, 07, ZTPMV, 08,\n*           ZTRSV, 09, ZTBSV, 10, and ZTPSV, 11.\n  160       CALL ZCHK3( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NKB, KB, NINC, INC,\n     $                  NMAX, INCMAX, A, AA, AS, Y, YY, YS, YT, G, Z )\n            GO TO 200\n*           Test ZGERC, 12, ZGERU, 13.\n  170       CALL ZCHK4( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC,\n     $                  NMAX, INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS,\n     $                  YT, G, Z )\n            GO TO 200\n*           Test ZHER, 14, and ZHPR, 15.\n  180       CALL ZCHK5( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC,\n     $                  NMAX, INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS,\n     $                  YT, G, Z )\n            GO TO 200\n*           Test ZHER2, 16, and ZHPR2, 17.\n  190       CALL ZCHK6( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC,\n     $                  NMAX, INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS,\n     $                  YT, G, Z )\n*\n  200       IF( FATAL.AND.SFATAL )\n     $         GO TO 220\n         END IF\n  210 CONTINUE\n      WRITE( NOUT, FMT = 9982 )\n      GO TO 240\n*\n  220 CONTINUE\n      WRITE( NOUT, FMT = 9981 )\n      GO TO 240\n*\n  230 CONTINUE\n      WRITE( NOUT, FMT = 9987 )\n*\n  240 CONTINUE\n      IF( TRACE )\n     $   CLOSE ( NTRA )\n      CLOSE ( NOUT )\n      STOP\n*\n 9999 FORMAT( ' ROUTINES PASS COMPUTATIONAL TESTS IF TEST RATIO IS LES',\n     $      'S THAN', F8.2 )\n 9998 FORMAT( ' RELATIVE MACHINE PRECISION IS TAKEN TO BE', 1P, D9.1 )\n 9997 FORMAT( ' NUMBER OF VALUES OF ', A, ' IS LESS THAN 1 OR GREATER ',\n     $      'THAN ', I2 )\n 9996 FORMAT( ' VALUE OF N IS LESS THAN 0 OR GREATER THAN ', I2 )\n 9995 FORMAT( ' VALUE OF K IS LESS THAN 0' )\n 9994 FORMAT( ' ABSOLUTE VALUE OF INCX OR INCY IS 0 OR GREATER THAN ',\n     $      I2 )\n 9993 FORMAT( ' TESTS OF THE COMPLEX*16       LEVEL 2 BLAS', //' THE F',\n     $      'OLLOWING PARAMETER VALUES WILL BE USED:' )\n 9992 FORMAT( '   FOR N              ', 9I6 )\n 9991 FORMAT( '   FOR K              ', 7I6 )\n 9990 FORMAT( '   FOR INCX AND INCY  ', 7I6 )\n 9989 FORMAT( '   FOR ALPHA          ',\n     $      7( '(', F4.1, ',', F4.1, ')  ', : ) )\n 9988 FORMAT( '   FOR BETA           ',\n     $      7( '(', F4.1, ',', F4.1, ')  ', : ) )\n 9987 FORMAT( ' AMEND DATA FILE OR INCREASE ARRAY SIZES IN PROGRAM',\n     $      /' ******* TESTS ABANDONED *******' )\n 9986 FORMAT( ' SUBPROGRAM NAME ', A6, ' NOT RECOGNIZED', /' ******* T',\n     $      'ESTS ABANDONED *******' )\n 9985 FORMAT( ' ERROR IN ZMVCH -  IN-LINE DOT PRODUCTS ARE BEING EVALU',\n     $      'ATED WRONGLY.', /' ZMVCH WAS CALLED WITH TRANS = ', A1,\n     $      ' AND RETURNED SAME = ', L1, ' AND ERR = ', F12.3, '.', /\n     $   ' THIS MAY BE DUE TO FAULTS IN THE ARITHMETIC OR THE COMPILER.'\n     $      , /' ******* TESTS ABANDONED *******' )\n 9984 FORMAT( A6, L2 )\n 9983 FORMAT( 1X, A6, ' WAS NOT TESTED' )\n 9982 FORMAT( /' END OF TESTS' )\n 9981 FORMAT( /' ******* FATAL ERROR - TESTS ABANDONED *******' )\n 9980 FORMAT( ' ERROR-EXITS WILL NOT BE TESTED' )\n*\n*     End of ZBLAT2.\n*\n      END\n      SUBROUTINE ZCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF, NBET,\n     $                  BET, NINC, INC, NMAX, INCMAX, A, AA, AS, X, XX,\n     $                  XS, Y, YY, YS, YT, G )\n*\n*  Tests ZGEMV and ZGBMV.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Parameters ..\n      COMPLEX*16         ZERO, HALF\n      PARAMETER          ( ZERO = ( 0.0D0, 0.0D0 ),\n     $                   HALF = ( 0.5D0, 0.0D0 ) )\n      DOUBLE PRECISION   RZERO\n      PARAMETER          ( RZERO = 0.0D0 )\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION   EPS, THRESH\n      INTEGER            INCMAX, NALF, NBET, NIDIM, NINC, NKB, NMAX,\n     $                   NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      COMPLEX*16         A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),\n     $                   AS( NMAX*NMAX ), BET( NBET ), X( NMAX ),\n     $                   XS( NMAX*INCMAX ), XX( NMAX*INCMAX ),\n     $                   Y( NMAX ), YS( NMAX*INCMAX ), YT( NMAX ),\n     $                   YY( NMAX*INCMAX )\n      DOUBLE PRECISION   G( NMAX )\n      INTEGER            IDIM( NIDIM ), INC( NINC ), KB( NKB )\n*     .. Local Scalars ..\n      COMPLEX*16         ALPHA, ALS, BETA, BLS, TRANSL\n      DOUBLE PRECISION   ERR, ERRMAX\n      INTEGER            I, IA, IB, IC, IKU, IM, IN, INCX, INCXS, INCY,\n     $                   INCYS, IX, IY, KL, KLS, KU, KUS, LAA, LDA,\n     $                   LDAS, LX, LY, M, ML, MS, N, NARGS, NC, ND, NK,\n     $                   NL, NS\n      LOGICAL            BANDED, FULL, NULL, RESET, SAME, TRAN\n      CHARACTER*1        TRANS, TRANSS\n      CHARACTER*3        ICH\n*     .. Local Arrays ..\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LZE, LZERES\n      EXTERNAL           LZE, LZERES\n*     .. External Subroutines ..\n      EXTERNAL           ZGBMV, ZGEMV, ZMAKE, ZMVCH\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, MAX, MIN\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Data statements ..\n      DATA               ICH/'NTC'/\n*     .. Executable Statements ..\n      FULL = SNAME( 3: 3 ).EQ.'E'\n      BANDED = SNAME( 3: 3 ).EQ.'B'\n*     Define the number of arguments.\n      IF( FULL )THEN\n         NARGS = 11\n      ELSE IF( BANDED )THEN\n         NARGS = 13\n      END IF\n*\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = RZERO\n*\n      DO 120 IN = 1, NIDIM\n         N = IDIM( IN )\n         ND = N/2 + 1\n*\n         DO 110 IM = 1, 2\n            IF( IM.EQ.1 )\n     $         M = MAX( N - ND, 0 )\n            IF( IM.EQ.2 )\n     $         M = MIN( N + ND, NMAX )\n*\n            IF( BANDED )THEN\n               NK = NKB\n            ELSE\n               NK = 1\n            END IF\n            DO 100 IKU = 1, NK\n               IF( BANDED )THEN\n                  KU = KB( IKU )\n                  KL = MAX( KU - 1, 0 )\n               ELSE\n                  KU = N - 1\n                  KL = M - 1\n               END IF\n*              Set LDA to 1 more than minimum value if room.\n               IF( BANDED )THEN\n                  LDA = KL + KU + 1\n               ELSE\n                  LDA = M\n               END IF\n               IF( LDA.LT.NMAX )\n     $            LDA = LDA + 1\n*              Skip tests if not enough room.\n               IF( LDA.GT.NMAX )\n     $            GO TO 100\n               LAA = LDA*N\n               NULL = N.LE.0.OR.M.LE.0\n*\n*              Generate the matrix A.\n*\n               TRANSL = ZERO\n               CALL ZMAKE( SNAME( 2: 3 ), ' ', ' ', M, N, A, NMAX, AA,\n     $                     LDA, KL, KU, RESET, TRANSL )\n*\n               DO 90 IC = 1, 3\n                  TRANS = ICH( IC: IC )\n                  TRAN = TRANS.EQ.'T'.OR.TRANS.EQ.'C'\n*\n                  IF( TRAN )THEN\n                     ML = N\n                     NL = M\n                  ELSE\n                     ML = M\n                     NL = N\n                  END IF\n*\n                  DO 80 IX = 1, NINC\n                     INCX = INC( IX )\n                     LX = ABS( INCX )*NL\n*\n*                    Generate the vector X.\n*\n                     TRANSL = HALF\n                     CALL ZMAKE( 'GE', ' ', ' ', 1, NL, X, 1, XX,\n     $                           ABS( INCX ), 0, NL - 1, RESET, TRANSL )\n                     IF( NL.GT.1 )THEN\n                        X( NL/2 ) = ZERO\n                        XX( 1 + ABS( INCX )*( NL/2 - 1 ) ) = ZERO\n                     END IF\n*\n                     DO 70 IY = 1, NINC\n                        INCY = INC( IY )\n                        LY = ABS( INCY )*ML\n*\n                        DO 60 IA = 1, NALF\n                           ALPHA = ALF( IA )\n*\n                           DO 50 IB = 1, NBET\n                              BETA = BET( IB )\n*\n*                             Generate the vector Y.\n*\n                              TRANSL = ZERO\n                              CALL ZMAKE( 'GE', ' ', ' ', 1, ML, Y, 1,\n     $                                    YY, ABS( INCY ), 0, ML - 1,\n     $                                    RESET, TRANSL )\n*\n                              NC = NC + 1\n*\n*                             Save every datum before calling the\n*                             subroutine.\n*\n                              TRANSS = TRANS\n                              MS = M\n                              NS = N\n                              KLS = KL\n                              KUS = KU\n                              ALS = ALPHA\n                              DO 10 I = 1, LAA\n                                 AS( I ) = AA( I )\n   10                         CONTINUE\n                              LDAS = LDA\n                              DO 20 I = 1, LX\n                                 XS( I ) = XX( I )\n   20                         CONTINUE\n                              INCXS = INCX\n                              BLS = BETA\n                              DO 30 I = 1, LY\n                                 YS( I ) = YY( I )\n   30                         CONTINUE\n                              INCYS = INCY\n*\n*                             Call the subroutine.\n*\n                              IF( FULL )THEN\n                                 IF( TRACE )\n     $                              WRITE( NTRA, FMT = 9994 )NC, SNAME,\n     $                              TRANS, M, N, ALPHA, LDA, INCX, BETA,\n     $                              INCY\n                                 IF( REWI )\n     $                              REWIND NTRA\n                                 CALL ZGEMV( TRANS, M, N, ALPHA, AA,\n     $                                       LDA, XX, INCX, BETA, YY,\n     $                                       INCY )\n                              ELSE IF( BANDED )THEN\n                                 IF( TRACE )\n     $                              WRITE( NTRA, FMT = 9995 )NC, SNAME,\n     $                              TRANS, M, N, KL, KU, ALPHA, LDA,\n     $                              INCX, BETA, INCY\n                                 IF( REWI )\n     $                              REWIND NTRA\n                                 CALL ZGBMV( TRANS, M, N, KL, KU, ALPHA,\n     $                                       AA, LDA, XX, INCX, BETA,\n     $                                       YY, INCY )\n                              END IF\n*\n*                             Check if error-exit was taken incorrectly.\n*\n                              IF( .NOT.OK )THEN\n                                 WRITE( NOUT, FMT = 9993 )\n                                 FATAL = .TRUE.\n                                 GO TO 130\n                              END IF\n*\n*                             See what data changed inside subroutines.\n*\n                              ISAME( 1 ) = TRANS.EQ.TRANSS\n                              ISAME( 2 ) = MS.EQ.M\n                              ISAME( 3 ) = NS.EQ.N\n                              IF( FULL )THEN\n                                 ISAME( 4 ) = ALS.EQ.ALPHA\n                                 ISAME( 5 ) = LZE( AS, AA, LAA )\n                                 ISAME( 6 ) = LDAS.EQ.LDA\n                                 ISAME( 7 ) = LZE( XS, XX, LX )\n                                 ISAME( 8 ) = INCXS.EQ.INCX\n                                 ISAME( 9 ) = BLS.EQ.BETA\n                                 IF( NULL )THEN\n                                    ISAME( 10 ) = LZE( YS, YY, LY )\n                                 ELSE\n                                    ISAME( 10 ) = LZERES( 'GE', ' ', 1,\n     $                                            ML, YS, YY,\n     $                                            ABS( INCY ) )\n                                 END IF\n                                 ISAME( 11 ) = INCYS.EQ.INCY\n                              ELSE IF( BANDED )THEN\n                                 ISAME( 4 ) = KLS.EQ.KL\n                                 ISAME( 5 ) = KUS.EQ.KU\n                                 ISAME( 6 ) = ALS.EQ.ALPHA\n                                 ISAME( 7 ) = LZE( AS, AA, LAA )\n                                 ISAME( 8 ) = LDAS.EQ.LDA\n                                 ISAME( 9 ) = LZE( XS, XX, LX )\n                                 ISAME( 10 ) = INCXS.EQ.INCX\n                                 ISAME( 11 ) = BLS.EQ.BETA\n                                 IF( NULL )THEN\n                                    ISAME( 12 ) = LZE( YS, YY, LY )\n                                 ELSE\n                                    ISAME( 12 ) = LZERES( 'GE', ' ', 1,\n     $                                            ML, YS, YY,\n     $                                            ABS( INCY ) )\n                                 END IF\n                                 ISAME( 13 ) = INCYS.EQ.INCY\n                              END IF\n*\n*                             If data was incorrectly changed, report\n*                             and return.\n*\n                              SAME = .TRUE.\n                              DO 40 I = 1, NARGS\n                                 SAME = SAME.AND.ISAME( I )\n                                 IF( .NOT.ISAME( I ) )\n     $                              WRITE( NOUT, FMT = 9998 )I\n   40                         CONTINUE\n                              IF( .NOT.SAME )THEN\n                                 FATAL = .TRUE.\n                                 GO TO 130\n                              END IF\n*\n                              IF( .NOT.NULL )THEN\n*\n*                                Check the result.\n*\n                                 CALL ZMVCH( TRANS, M, N, ALPHA, A,\n     $                                       NMAX, X, INCX, BETA, Y,\n     $                                       INCY, YT, G, YY, EPS, ERR,\n     $                                       FATAL, NOUT, .TRUE. )\n                                 ERRMAX = MAX( ERRMAX, ERR )\n*                                If got really bad answer, report and\n*                                return.\n                                 IF( FATAL )\n     $                              GO TO 130\n                              ELSE\n*                                Avoid repeating tests with M.le.0 or\n*                                N.le.0.\n                                 GO TO 110\n                              END IF\n*\n   50                      CONTINUE\n*\n   60                   CONTINUE\n*\n   70                CONTINUE\n*\n   80             CONTINUE\n*\n   90          CONTINUE\n*\n  100       CONTINUE\n*\n  110    CONTINUE\n*\n  120 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 140\n*\n  130 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      IF( FULL )THEN\n         WRITE( NOUT, FMT = 9994 )NC, SNAME, TRANS, M, N, ALPHA, LDA,\n     $      INCX, BETA, INCY\n      ELSE IF( BANDED )THEN\n         WRITE( NOUT, FMT = 9995 )NC, SNAME, TRANS, M, N, KL, KU,\n     $      ALPHA, LDA, INCX, BETA, INCY\n      END IF\n*\n  140 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', 4( I3, ',' ), '(',\n     $      F4.1, ',', F4.1, '), A,', I3, ', X,', I2, ',(', F4.1, ',',\n     $      F4.1, '), Y,', I2, ') .' )\n 9994 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', 2( I3, ',' ), '(',\n     $      F4.1, ',', F4.1, '), A,', I3, ', X,', I2, ',(', F4.1, ',',\n     $      F4.1, '), Y,', I2, ')         .' )\n 9993 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of ZCHK1.\n*\n      END\n      SUBROUTINE ZCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF, NBET,\n     $                  BET, NINC, INC, NMAX, INCMAX, A, AA, AS, X, XX,\n     $                  XS, Y, YY, YS, YT, G )\n*\n*  Tests ZHEMV, ZHBMV and ZHPMV.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Parameters ..\n      COMPLEX*16         ZERO, HALF\n      PARAMETER          ( ZERO = ( 0.0D0, 0.0D0 ),\n     $                   HALF = ( 0.5D0, 0.0D0 ) )\n      DOUBLE PRECISION   RZERO\n      PARAMETER          ( RZERO = 0.0D0 )\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION   EPS, THRESH\n      INTEGER            INCMAX, NALF, NBET, NIDIM, NINC, NKB, NMAX,\n     $                   NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      COMPLEX*16         A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),\n     $                   AS( NMAX*NMAX ), BET( NBET ), X( NMAX ),\n     $                   XS( NMAX*INCMAX ), XX( NMAX*INCMAX ),\n     $                   Y( NMAX ), YS( NMAX*INCMAX ), YT( NMAX ),\n     $                   YY( NMAX*INCMAX )\n      DOUBLE PRECISION   G( NMAX )\n      INTEGER            IDIM( NIDIM ), INC( NINC ), KB( NKB )\n*     .. Local Scalars ..\n      COMPLEX*16         ALPHA, ALS, BETA, BLS, TRANSL\n      DOUBLE PRECISION   ERR, ERRMAX\n      INTEGER            I, IA, IB, IC, IK, IN, INCX, INCXS, INCY,\n     $                   INCYS, IX, IY, K, KS, LAA, LDA, LDAS, LX, LY,\n     $                   N, NARGS, NC, NK, NS\n      LOGICAL            BANDED, FULL, NULL, PACKED, RESET, SAME\n      CHARACTER*1        UPLO, UPLOS\n      CHARACTER*2        ICH\n*     .. Local Arrays ..\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LZE, LZERES\n      EXTERNAL           LZE, LZERES\n*     .. External Subroutines ..\n      EXTERNAL           ZHBMV, ZHEMV, ZHPMV, ZMAKE, ZMVCH\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, MAX\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Data statements ..\n      DATA               ICH/'UL'/\n*     .. Executable Statements ..\n      FULL = SNAME( 3: 3 ).EQ.'E'\n      BANDED = SNAME( 3: 3 ).EQ.'B'\n      PACKED = SNAME( 3: 3 ).EQ.'P'\n*     Define the number of arguments.\n      IF( FULL )THEN\n         NARGS = 10\n      ELSE IF( BANDED )THEN\n         NARGS = 11\n      ELSE IF( PACKED )THEN\n         NARGS = 9\n      END IF\n*\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = RZERO\n*\n      DO 110 IN = 1, NIDIM\n         N = IDIM( IN )\n*\n         IF( BANDED )THEN\n            NK = NKB\n         ELSE\n            NK = 1\n         END IF\n         DO 100 IK = 1, NK\n            IF( BANDED )THEN\n               K = KB( IK )\n            ELSE\n               K = N - 1\n            END IF\n*           Set LDA to 1 more than minimum value if room.\n            IF( BANDED )THEN\n               LDA = K + 1\n            ELSE\n               LDA = N\n            END IF\n            IF( LDA.LT.NMAX )\n     $         LDA = LDA + 1\n*           Skip tests if not enough room.\n            IF( LDA.GT.NMAX )\n     $         GO TO 100\n            IF( PACKED )THEN\n               LAA = ( N*( N + 1 ) )/2\n            ELSE\n               LAA = LDA*N\n            END IF\n            NULL = N.LE.0\n*\n            DO 90 IC = 1, 2\n               UPLO = ICH( IC: IC )\n*\n*              Generate the matrix A.\n*\n               TRANSL = ZERO\n               CALL ZMAKE( SNAME( 2: 3 ), UPLO, ' ', N, N, A, NMAX, AA,\n     $                     LDA, K, K, RESET, TRANSL )\n*\n               DO 80 IX = 1, NINC\n                  INCX = INC( IX )\n                  LX = ABS( INCX )*N\n*\n*                 Generate the vector X.\n*\n                  TRANSL = HALF\n                  CALL ZMAKE( 'GE', ' ', ' ', 1, N, X, 1, XX,\n     $                        ABS( INCX ), 0, N - 1, RESET, TRANSL )\n                  IF( N.GT.1 )THEN\n                     X( N/2 ) = ZERO\n                     XX( 1 + ABS( INCX )*( N/2 - 1 ) ) = ZERO\n                  END IF\n*\n                  DO 70 IY = 1, NINC\n                     INCY = INC( IY )\n                     LY = ABS( INCY )*N\n*\n                     DO 60 IA = 1, NALF\n                        ALPHA = ALF( IA )\n*\n                        DO 50 IB = 1, NBET\n                           BETA = BET( IB )\n*\n*                          Generate the vector Y.\n*\n                           TRANSL = ZERO\n                           CALL ZMAKE( 'GE', ' ', ' ', 1, N, Y, 1, YY,\n     $                                 ABS( INCY ), 0, N - 1, RESET,\n     $                                 TRANSL )\n*\n                           NC = NC + 1\n*\n*                          Save every datum before calling the\n*                          subroutine.\n*\n                           UPLOS = UPLO\n                           NS = N\n                           KS = K\n                           ALS = ALPHA\n                           DO 10 I = 1, LAA\n                              AS( I ) = AA( I )\n   10                      CONTINUE\n                           LDAS = LDA\n                           DO 20 I = 1, LX\n                              XS( I ) = XX( I )\n   20                      CONTINUE\n                           INCXS = INCX\n                           BLS = BETA\n                           DO 30 I = 1, LY\n                              YS( I ) = YY( I )\n   30                      CONTINUE\n                           INCYS = INCY\n*\n*                          Call the subroutine.\n*\n                           IF( FULL )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9993 )NC, SNAME,\n     $                           UPLO, N, ALPHA, LDA, INCX, BETA, INCY\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL ZHEMV( UPLO, N, ALPHA, AA, LDA, XX,\n     $                                    INCX, BETA, YY, INCY )\n                           ELSE IF( BANDED )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9994 )NC, SNAME,\n     $                           UPLO, N, K, ALPHA, LDA, INCX, BETA,\n     $                           INCY\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL ZHBMV( UPLO, N, K, ALPHA, AA, LDA,\n     $                                    XX, INCX, BETA, YY, INCY )\n                           ELSE IF( PACKED )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9995 )NC, SNAME,\n     $                           UPLO, N, ALPHA, INCX, BETA, INCY\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL ZHPMV( UPLO, N, ALPHA, AA, XX, INCX,\n     $                                    BETA, YY, INCY )\n                           END IF\n*\n*                          Check if error-exit was taken incorrectly.\n*\n                           IF( .NOT.OK )THEN\n                              WRITE( NOUT, FMT = 9992 )\n                              FATAL = .TRUE.\n                              GO TO 120\n                           END IF\n*\n*                          See what data changed inside subroutines.\n*\n                           ISAME( 1 ) = UPLO.EQ.UPLOS\n                           ISAME( 2 ) = NS.EQ.N\n                           IF( FULL )THEN\n                              ISAME( 3 ) = ALS.EQ.ALPHA\n                              ISAME( 4 ) = LZE( AS, AA, LAA )\n                              ISAME( 5 ) = LDAS.EQ.LDA\n                              ISAME( 6 ) = LZE( XS, XX, LX )\n                              ISAME( 7 ) = INCXS.EQ.INCX\n                              ISAME( 8 ) = BLS.EQ.BETA\n                              IF( NULL )THEN\n                                 ISAME( 9 ) = LZE( YS, YY, LY )\n                              ELSE\n                                 ISAME( 9 ) = LZERES( 'GE', ' ', 1, N,\n     $                                        YS, YY, ABS( INCY ) )\n                              END IF\n                              ISAME( 10 ) = INCYS.EQ.INCY\n                           ELSE IF( BANDED )THEN\n                              ISAME( 3 ) = KS.EQ.K\n                              ISAME( 4 ) = ALS.EQ.ALPHA\n                              ISAME( 5 ) = LZE( AS, AA, LAA )\n                              ISAME( 6 ) = LDAS.EQ.LDA\n                              ISAME( 7 ) = LZE( XS, XX, LX )\n                              ISAME( 8 ) = INCXS.EQ.INCX\n                              ISAME( 9 ) = BLS.EQ.BETA\n                              IF( NULL )THEN\n                                 ISAME( 10 ) = LZE( YS, YY, LY )\n                              ELSE\n                                 ISAME( 10 ) = LZERES( 'GE', ' ', 1, N,\n     $                                         YS, YY, ABS( INCY ) )\n                              END IF\n                              ISAME( 11 ) = INCYS.EQ.INCY\n                           ELSE IF( PACKED )THEN\n                              ISAME( 3 ) = ALS.EQ.ALPHA\n                              ISAME( 4 ) = LZE( AS, AA, LAA )\n                              ISAME( 5 ) = LZE( XS, XX, LX )\n                              ISAME( 6 ) = INCXS.EQ.INCX\n                              ISAME( 7 ) = BLS.EQ.BETA\n                              IF( NULL )THEN\n                                 ISAME( 8 ) = LZE( YS, YY, LY )\n                              ELSE\n                                 ISAME( 8 ) = LZERES( 'GE', ' ', 1, N,\n     $                                        YS, YY, ABS( INCY ) )\n                              END IF\n                              ISAME( 9 ) = INCYS.EQ.INCY\n                           END IF\n*\n*                          If data was incorrectly changed, report and\n*                          return.\n*\n                           SAME = .TRUE.\n                           DO 40 I = 1, NARGS\n                              SAME = SAME.AND.ISAME( I )\n                              IF( .NOT.ISAME( I ) )\n     $                           WRITE( NOUT, FMT = 9998 )I\n   40                      CONTINUE\n                           IF( .NOT.SAME )THEN\n                              FATAL = .TRUE.\n                              GO TO 120\n                           END IF\n*\n                           IF( .NOT.NULL )THEN\n*\n*                             Check the result.\n*\n                              CALL ZMVCH( 'N', N, N, ALPHA, A, NMAX, X,\n     $                                    INCX, BETA, Y, INCY, YT, G,\n     $                                    YY, EPS, ERR, FATAL, NOUT,\n     $                                    .TRUE. )\n                              ERRMAX = MAX( ERRMAX, ERR )\n*                             If got really bad answer, report and\n*                             return.\n                              IF( FATAL )\n     $                           GO TO 120\n                           ELSE\n*                             Avoid repeating tests with N.le.0\n                              GO TO 110\n                           END IF\n*\n   50                   CONTINUE\n*\n   60                CONTINUE\n*\n   70             CONTINUE\n*\n   80          CONTINUE\n*\n   90       CONTINUE\n*\n  100    CONTINUE\n*\n  110 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 130\n*\n  120 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      IF( FULL )THEN\n         WRITE( NOUT, FMT = 9993 )NC, SNAME, UPLO, N, ALPHA, LDA, INCX,\n     $      BETA, INCY\n      ELSE IF( BANDED )THEN\n         WRITE( NOUT, FMT = 9994 )NC, SNAME, UPLO, N, K, ALPHA, LDA,\n     $      INCX, BETA, INCY\n      ELSE IF( PACKED )THEN\n         WRITE( NOUT, FMT = 9995 )NC, SNAME, UPLO, N, ALPHA, INCX,\n     $      BETA, INCY\n      END IF\n*\n  130 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', I3, ',(', F4.1, ',',\n     $      F4.1, '), AP, X,', I2, ',(', F4.1, ',', F4.1, '), Y,', I2,\n     $      ')                .' )\n 9994 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', 2( I3, ',' ), '(',\n     $      F4.1, ',', F4.1, '), A,', I3, ', X,', I2, ',(', F4.1, ',',\n     $      F4.1, '), Y,', I2, ')         .' )\n 9993 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', I3, ',(', F4.1, ',',\n     $      F4.1, '), A,', I3, ', X,', I2, ',(', F4.1, ',', F4.1, '), ',\n     $      'Y,', I2, ')             .' )\n 9992 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of ZCHK2.\n*\n      END\n      SUBROUTINE ZCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NKB, KB, NINC, INC, NMAX,\n     $                  INCMAX, A, AA, AS, X, XX, XS, XT, G, Z )\n*\n*  Tests ZTRMV, ZTBMV, ZTPMV, ZTRSV, ZTBSV and ZTPSV.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Parameters ..\n      COMPLEX*16         ZERO, HALF, ONE\n      PARAMETER          ( ZERO = ( 0.0D0, 0.0D0 ),\n     $                   HALF = ( 0.5D0, 0.0D0 ),\n     $                   ONE = ( 1.0D0, 0.0D0 ) )\n      DOUBLE PRECISION   RZERO\n      PARAMETER          ( RZERO = 0.0D0 )\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION   EPS, THRESH\n      INTEGER            INCMAX, NIDIM, NINC, NKB, NMAX, NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      COMPLEX*16         A( NMAX, NMAX ), AA( NMAX*NMAX ),\n     $                   AS( NMAX*NMAX ), X( NMAX ), XS( NMAX*INCMAX ),\n     $                   XT( NMAX ), XX( NMAX*INCMAX ), Z( NMAX )\n      DOUBLE PRECISION   G( NMAX )\n      INTEGER            IDIM( NIDIM ), INC( NINC ), KB( NKB )\n*     .. Local Scalars ..\n      COMPLEX*16         TRANSL\n      DOUBLE PRECISION   ERR, ERRMAX\n      INTEGER            I, ICD, ICT, ICU, IK, IN, INCX, INCXS, IX, K,\n     $                   KS, LAA, LDA, LDAS, LX, N, NARGS, NC, NK, NS\n      LOGICAL            BANDED, FULL, NULL, PACKED, RESET, SAME\n      CHARACTER*1        DIAG, DIAGS, TRANS, TRANSS, UPLO, UPLOS\n      CHARACTER*2        ICHD, ICHU\n      CHARACTER*3        ICHT\n*     .. Local Arrays ..\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LZE, LZERES\n      EXTERNAL           LZE, LZERES\n*     .. External Subroutines ..\n      EXTERNAL           ZMAKE, ZMVCH, ZTBMV, ZTBSV, ZTPMV, ZTPSV,\n     $                   ZTRMV, ZTRSV\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, MAX\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Data statements ..\n      DATA               ICHU/'UL'/, ICHT/'NTC'/, ICHD/'UN'/\n*     .. Executable Statements ..\n      FULL = SNAME( 3: 3 ).EQ.'R'\n      BANDED = SNAME( 3: 3 ).EQ.'B'\n      PACKED = SNAME( 3: 3 ).EQ.'P'\n*     Define the number of arguments.\n      IF( FULL )THEN\n         NARGS = 8\n      ELSE IF( BANDED )THEN\n         NARGS = 9\n      ELSE IF( PACKED )THEN\n         NARGS = 7\n      END IF\n*\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = RZERO\n*     Set up zero vector for ZMVCH.\n      DO 10 I = 1, NMAX\n         Z( I ) = ZERO\n   10 CONTINUE\n*\n      DO 110 IN = 1, NIDIM\n         N = IDIM( IN )\n*\n         IF( BANDED )THEN\n            NK = NKB\n         ELSE\n            NK = 1\n         END IF\n         DO 100 IK = 1, NK\n            IF( BANDED )THEN\n               K = KB( IK )\n            ELSE\n               K = N - 1\n            END IF\n*           Set LDA to 1 more than minimum value if room.\n            IF( BANDED )THEN\n               LDA = K + 1\n            ELSE\n               LDA = N\n            END IF\n            IF( LDA.LT.NMAX )\n     $         LDA = LDA + 1\n*           Skip tests if not enough room.\n            IF( LDA.GT.NMAX )\n     $         GO TO 100\n            IF( PACKED )THEN\n               LAA = ( N*( N + 1 ) )/2\n            ELSE\n               LAA = LDA*N\n            END IF\n            NULL = N.LE.0\n*\n            DO 90 ICU = 1, 2\n               UPLO = ICHU( ICU: ICU )\n*\n               DO 80 ICT = 1, 3\n                  TRANS = ICHT( ICT: ICT )\n*\n                  DO 70 ICD = 1, 2\n                     DIAG = ICHD( ICD: ICD )\n*\n*                    Generate the matrix A.\n*\n                     TRANSL = ZERO\n                     CALL ZMAKE( SNAME( 2: 3 ), UPLO, DIAG, N, N, A,\n     $                           NMAX, AA, LDA, K, K, RESET, TRANSL )\n*\n                     DO 60 IX = 1, NINC\n                        INCX = INC( IX )\n                        LX = ABS( INCX )*N\n*\n*                       Generate the vector X.\n*\n                        TRANSL = HALF\n                        CALL ZMAKE( 'GE', ' ', ' ', 1, N, X, 1, XX,\n     $                              ABS( INCX ), 0, N - 1, RESET,\n     $                              TRANSL )\n                        IF( N.GT.1 )THEN\n                           X( N/2 ) = ZERO\n                           XX( 1 + ABS( INCX )*( N/2 - 1 ) ) = ZERO\n                        END IF\n*\n                        NC = NC + 1\n*\n*                       Save every datum before calling the subroutine.\n*\n                        UPLOS = UPLO\n                        TRANSS = TRANS\n                        DIAGS = DIAG\n                        NS = N\n                        KS = K\n                        DO 20 I = 1, LAA\n                           AS( I ) = AA( I )\n   20                   CONTINUE\n                        LDAS = LDA\n                        DO 30 I = 1, LX\n                           XS( I ) = XX( I )\n   30                   CONTINUE\n                        INCXS = INCX\n*\n*                       Call the subroutine.\n*\n                        IF( SNAME( 4: 5 ).EQ.'MV' )THEN\n                           IF( FULL )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9993 )NC, SNAME,\n     $                           UPLO, TRANS, DIAG, N, LDA, INCX\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL ZTRMV( UPLO, TRANS, DIAG, N, AA, LDA,\n     $                                    XX, INCX )\n                           ELSE IF( BANDED )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9994 )NC, SNAME,\n     $                           UPLO, TRANS, DIAG, N, K, LDA, INCX\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL ZTBMV( UPLO, TRANS, DIAG, N, K, AA,\n     $                                    LDA, XX, INCX )\n                           ELSE IF( PACKED )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9995 )NC, SNAME,\n     $                           UPLO, TRANS, DIAG, N, INCX\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL ZTPMV( UPLO, TRANS, DIAG, N, AA, XX,\n     $                                    INCX )\n                           END IF\n                        ELSE IF( SNAME( 4: 5 ).EQ.'SV' )THEN\n                           IF( FULL )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9993 )NC, SNAME,\n     $                           UPLO, TRANS, DIAG, N, LDA, INCX\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL ZTRSV( UPLO, TRANS, DIAG, N, AA, LDA,\n     $                                    XX, INCX )\n                           ELSE IF( BANDED )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9994 )NC, SNAME,\n     $                           UPLO, TRANS, DIAG, N, K, LDA, INCX\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL ZTBSV( UPLO, TRANS, DIAG, N, K, AA,\n     $                                    LDA, XX, INCX )\n                           ELSE IF( PACKED )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9995 )NC, SNAME,\n     $                           UPLO, TRANS, DIAG, N, INCX\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL ZTPSV( UPLO, TRANS, DIAG, N, AA, XX,\n     $                                    INCX )\n                           END IF\n                        END IF\n*\n*                       Check if error-exit was taken incorrectly.\n*\n                        IF( .NOT.OK )THEN\n                           WRITE( NOUT, FMT = 9992 )\n                           FATAL = .TRUE.\n                           GO TO 120\n                        END IF\n*\n*                       See what data changed inside subroutines.\n*\n                        ISAME( 1 ) = UPLO.EQ.UPLOS\n                        ISAME( 2 ) = TRANS.EQ.TRANSS\n                        ISAME( 3 ) = DIAG.EQ.DIAGS\n                        ISAME( 4 ) = NS.EQ.N\n                        IF( FULL )THEN\n                           ISAME( 5 ) = LZE( AS, AA, LAA )\n                           ISAME( 6 ) = LDAS.EQ.LDA\n                           IF( NULL )THEN\n                              ISAME( 7 ) = LZE( XS, XX, LX )\n                           ELSE\n                              ISAME( 7 ) = LZERES( 'GE', ' ', 1, N, XS,\n     $                                     XX, ABS( INCX ) )\n                           END IF\n                           ISAME( 8 ) = INCXS.EQ.INCX\n                        ELSE IF( BANDED )THEN\n                           ISAME( 5 ) = KS.EQ.K\n                           ISAME( 6 ) = LZE( AS, AA, LAA )\n                           ISAME( 7 ) = LDAS.EQ.LDA\n                           IF( NULL )THEN\n                              ISAME( 8 ) = LZE( XS, XX, LX )\n                           ELSE\n                              ISAME( 8 ) = LZERES( 'GE', ' ', 1, N, XS,\n     $                                     XX, ABS( INCX ) )\n                           END IF\n                           ISAME( 9 ) = INCXS.EQ.INCX\n                        ELSE IF( PACKED )THEN\n                           ISAME( 5 ) = LZE( AS, AA, LAA )\n                           IF( NULL )THEN\n                              ISAME( 6 ) = LZE( XS, XX, LX )\n                           ELSE\n                              ISAME( 6 ) = LZERES( 'GE', ' ', 1, N, XS,\n     $                                     XX, ABS( INCX ) )\n                           END IF\n                           ISAME( 7 ) = INCXS.EQ.INCX\n                        END IF\n*\n*                       If data was incorrectly changed, report and\n*                       return.\n*\n                        SAME = .TRUE.\n                        DO 40 I = 1, NARGS\n                           SAME = SAME.AND.ISAME( I )\n                           IF( .NOT.ISAME( I ) )\n     $                        WRITE( NOUT, FMT = 9998 )I\n   40                   CONTINUE\n                        IF( .NOT.SAME )THEN\n                           FATAL = .TRUE.\n                           GO TO 120\n                        END IF\n*\n                        IF( .NOT.NULL )THEN\n                           IF( SNAME( 4: 5 ).EQ.'MV' )THEN\n*\n*                             Check the result.\n*\n                              CALL ZMVCH( TRANS, N, N, ONE, A, NMAX, X,\n     $                                    INCX, ZERO, Z, INCX, XT, G,\n     $                                    XX, EPS, ERR, FATAL, NOUT,\n     $                                    .TRUE. )\n                           ELSE IF( SNAME( 4: 5 ).EQ.'SV' )THEN\n*\n*                             Compute approximation to original vector.\n*\n                              DO 50 I = 1, N\n                                 Z( I ) = XX( 1 + ( I - 1 )*\n     $                                    ABS( INCX ) )\n                                 XX( 1 + ( I - 1 )*ABS( INCX ) )\n     $                              = X( I )\n   50                         CONTINUE\n                              CALL ZMVCH( TRANS, N, N, ONE, A, NMAX, Z,\n     $                                    INCX, ZERO, X, INCX, XT, G,\n     $                                    XX, EPS, ERR, FATAL, NOUT,\n     $                                    .FALSE. )\n                           END IF\n                           ERRMAX = MAX( ERRMAX, ERR )\n*                          If got really bad answer, report and return.\n                           IF( FATAL )\n     $                        GO TO 120\n                        ELSE\n*                          Avoid repeating tests with N.le.0.\n                           GO TO 110\n                        END IF\n*\n   60                CONTINUE\n*\n   70             CONTINUE\n*\n   80          CONTINUE\n*\n   90       CONTINUE\n*\n  100    CONTINUE\n*\n  110 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 130\n*\n  120 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      IF( FULL )THEN\n         WRITE( NOUT, FMT = 9993 )NC, SNAME, UPLO, TRANS, DIAG, N, LDA,\n     $      INCX\n      ELSE IF( BANDED )THEN\n         WRITE( NOUT, FMT = 9994 )NC, SNAME, UPLO, TRANS, DIAG, N, K,\n     $      LDA, INCX\n      ELSE IF( PACKED )THEN\n         WRITE( NOUT, FMT = 9995 )NC, SNAME, UPLO, TRANS, DIAG, N, INCX\n      END IF\n*\n  130 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( 1X, I6, ': ', A6, '(', 3( '''', A1, ''',' ), I3, ', AP, ',\n     $      'X,', I2, ')                                      .' )\n 9994 FORMAT( 1X, I6, ': ', A6, '(', 3( '''', A1, ''',' ), 2( I3, ',' ),\n     $      ' A,', I3, ', X,', I2, ')                               .' )\n 9993 FORMAT( 1X, I6, ': ', A6, '(', 3( '''', A1, ''',' ), I3, ', A,',\n     $      I3, ', X,', I2, ')                                   .' )\n 9992 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of ZCHK3.\n*\n      END\n      SUBROUTINE ZCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX,\n     $                  INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G,\n     $                  Z )\n*\n*  Tests ZGERC and ZGERU.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Parameters ..\n      COMPLEX*16         ZERO, HALF, ONE\n      PARAMETER          ( ZERO = ( 0.0D0, 0.0D0 ),\n     $                   HALF = ( 0.5D0, 0.0D0 ),\n     $                   ONE = ( 1.0D0, 0.0D0 ) )\n      DOUBLE PRECISION   RZERO\n      PARAMETER          ( RZERO = 0.0D0 )\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION   EPS, THRESH\n      INTEGER            INCMAX, NALF, NIDIM, NINC, NMAX, NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      COMPLEX*16         A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),\n     $                   AS( NMAX*NMAX ), X( NMAX ), XS( NMAX*INCMAX ),\n     $                   XX( NMAX*INCMAX ), Y( NMAX ),\n     $                   YS( NMAX*INCMAX ), YT( NMAX ),\n     $                   YY( NMAX*INCMAX ), Z( NMAX )\n      DOUBLE PRECISION   G( NMAX )\n      INTEGER            IDIM( NIDIM ), INC( NINC )\n*     .. Local Scalars ..\n      COMPLEX*16         ALPHA, ALS, TRANSL\n      DOUBLE PRECISION   ERR, ERRMAX\n      INTEGER            I, IA, IM, IN, INCX, INCXS, INCY, INCYS, IX,\n     $                   IY, J, LAA, LDA, LDAS, LX, LY, M, MS, N, NARGS,\n     $                   NC, ND, NS\n      LOGICAL            CONJ, NULL, RESET, SAME\n*     .. Local Arrays ..\n      COMPLEX*16         W( 1 )\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LZE, LZERES\n      EXTERNAL           LZE, LZERES\n*     .. External Subroutines ..\n      EXTERNAL           ZGERC, ZGERU, ZMAKE, ZMVCH\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, DCONJG, MAX, MIN\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Executable Statements ..\n      CONJ = SNAME( 5: 5 ).EQ.'C'\n*     Define the number of arguments.\n      NARGS = 9\n*\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = RZERO\n*\n      DO 120 IN = 1, NIDIM\n         N = IDIM( IN )\n         ND = N/2 + 1\n*\n         DO 110 IM = 1, 2\n            IF( IM.EQ.1 )\n     $         M = MAX( N - ND, 0 )\n            IF( IM.EQ.2 )\n     $         M = MIN( N + ND, NMAX )\n*\n*           Set LDA to 1 more than minimum value if room.\n            LDA = M\n            IF( LDA.LT.NMAX )\n     $         LDA = LDA + 1\n*           Skip tests if not enough room.\n            IF( LDA.GT.NMAX )\n     $         GO TO 110\n            LAA = LDA*N\n            NULL = N.LE.0.OR.M.LE.0\n*\n            DO 100 IX = 1, NINC\n               INCX = INC( IX )\n               LX = ABS( INCX )*M\n*\n*              Generate the vector X.\n*\n               TRANSL = HALF\n               CALL ZMAKE( 'GE', ' ', ' ', 1, M, X, 1, XX, ABS( INCX ),\n     $                     0, M - 1, RESET, TRANSL )\n               IF( M.GT.1 )THEN\n                  X( M/2 ) = ZERO\n                  XX( 1 + ABS( INCX )*( M/2 - 1 ) ) = ZERO\n               END IF\n*\n               DO 90 IY = 1, NINC\n                  INCY = INC( IY )\n                  LY = ABS( INCY )*N\n*\n*                 Generate the vector Y.\n*\n                  TRANSL = ZERO\n                  CALL ZMAKE( 'GE', ' ', ' ', 1, N, Y, 1, YY,\n     $                        ABS( INCY ), 0, N - 1, RESET, TRANSL )\n                  IF( N.GT.1 )THEN\n                     Y( N/2 ) = ZERO\n                     YY( 1 + ABS( INCY )*( N/2 - 1 ) ) = ZERO\n                  END IF\n*\n                  DO 80 IA = 1, NALF\n                     ALPHA = ALF( IA )\n*\n*                    Generate the matrix A.\n*\n                     TRANSL = ZERO\n                     CALL ZMAKE( SNAME( 2: 3 ), ' ', ' ', M, N, A, NMAX,\n     $                           AA, LDA, M - 1, N - 1, RESET, TRANSL )\n*\n                     NC = NC + 1\n*\n*                    Save every datum before calling the subroutine.\n*\n                     MS = M\n                     NS = N\n                     ALS = ALPHA\n                     DO 10 I = 1, LAA\n                        AS( I ) = AA( I )\n   10                CONTINUE\n                     LDAS = LDA\n                     DO 20 I = 1, LX\n                        XS( I ) = XX( I )\n   20                CONTINUE\n                     INCXS = INCX\n                     DO 30 I = 1, LY\n                        YS( I ) = YY( I )\n   30                CONTINUE\n                     INCYS = INCY\n*\n*                    Call the subroutine.\n*\n                     IF( TRACE )\n     $                  WRITE( NTRA, FMT = 9994 )NC, SNAME, M, N,\n     $                  ALPHA, INCX, INCY, LDA\n                     IF( CONJ )THEN\n                        IF( REWI )\n     $                     REWIND NTRA\n                        CALL ZGERC( M, N, ALPHA, XX, INCX, YY, INCY, AA,\n     $                              LDA )\n                     ELSE\n                        IF( REWI )\n     $                     REWIND NTRA\n                        CALL ZGERU( M, N, ALPHA, XX, INCX, YY, INCY, AA,\n     $                              LDA )\n                     END IF\n*\n*                    Check if error-exit was taken incorrectly.\n*\n                     IF( .NOT.OK )THEN\n                        WRITE( NOUT, FMT = 9993 )\n                        FATAL = .TRUE.\n                        GO TO 140\n                     END IF\n*\n*                    See what data changed inside subroutine.\n*\n                     ISAME( 1 ) = MS.EQ.M\n                     ISAME( 2 ) = NS.EQ.N\n                     ISAME( 3 ) = ALS.EQ.ALPHA\n                     ISAME( 4 ) = LZE( XS, XX, LX )\n                     ISAME( 5 ) = INCXS.EQ.INCX\n                     ISAME( 6 ) = LZE( YS, YY, LY )\n                     ISAME( 7 ) = INCYS.EQ.INCY\n                     IF( NULL )THEN\n                        ISAME( 8 ) = LZE( AS, AA, LAA )\n                     ELSE\n                        ISAME( 8 ) = LZERES( 'GE', ' ', M, N, AS, AA,\n     $                               LDA )\n                     END IF\n                     ISAME( 9 ) = LDAS.EQ.LDA\n*\n*                    If data was incorrectly changed, report and return.\n*\n                     SAME = .TRUE.\n                     DO 40 I = 1, NARGS\n                        SAME = SAME.AND.ISAME( I )\n                        IF( .NOT.ISAME( I ) )\n     $                     WRITE( NOUT, FMT = 9998 )I\n   40                CONTINUE\n                     IF( .NOT.SAME )THEN\n                        FATAL = .TRUE.\n                        GO TO 140\n                     END IF\n*\n                     IF( .NOT.NULL )THEN\n*\n*                       Check the result column by column.\n*\n                        IF( INCX.GT.0 )THEN\n                           DO 50 I = 1, M\n                              Z( I ) = X( I )\n   50                      CONTINUE\n                        ELSE\n                           DO 60 I = 1, M\n                              Z( I ) = X( M - I + 1 )\n   60                      CONTINUE\n                        END IF\n                        DO 70 J = 1, N\n                           IF( INCY.GT.0 )THEN\n                              W( 1 ) = Y( J )\n                           ELSE\n                              W( 1 ) = Y( N - J + 1 )\n                           END IF\n                           IF( CONJ )\n     $                        W( 1 ) = DCONJG( W( 1 ) )\n                           CALL ZMVCH( 'N', M, 1, ALPHA, Z, NMAX, W, 1,\n     $                                 ONE, A( 1, J ), 1, YT, G,\n     $                                 AA( 1 + ( J - 1 )*LDA ), EPS,\n     $                                 ERR, FATAL, NOUT, .TRUE. )\n                           ERRMAX = MAX( ERRMAX, ERR )\n*                          If got really bad answer, report and return.\n                           IF( FATAL )\n     $                        GO TO 130\n   70                   CONTINUE\n                     ELSE\n*                       Avoid repeating tests with M.le.0 or N.le.0.\n                        GO TO 110\n                     END IF\n*\n   80             CONTINUE\n*\n   90          CONTINUE\n*\n  100       CONTINUE\n*\n  110    CONTINUE\n*\n  120 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 150\n*\n  130 CONTINUE\n      WRITE( NOUT, FMT = 9995 )J\n*\n  140 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      WRITE( NOUT, FMT = 9994 )NC, SNAME, M, N, ALPHA, INCX, INCY, LDA\n*\n  150 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( '      THESE ARE THE RESULTS FOR COLUMN ', I3 )\n 9994 FORMAT( 1X, I6, ': ', A6, '(', 2( I3, ',' ), '(', F4.1, ',', F4.1,\n     $      '), X,', I2, ', Y,', I2, ', A,', I3, ')                   ',\n     $      '      .' )\n 9993 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of ZCHK4.\n*\n      END\n      SUBROUTINE ZCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX,\n     $                  INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G,\n     $                  Z )\n*\n*  Tests ZHER and ZHPR.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Parameters ..\n      COMPLEX*16         ZERO, HALF, ONE\n      PARAMETER          ( ZERO = ( 0.0D0, 0.0D0 ),\n     $                   HALF = ( 0.5D0, 0.0D0 ),\n     $                   ONE = ( 1.0D0, 0.0D0 ) )\n      DOUBLE PRECISION   RZERO\n      PARAMETER          ( RZERO = 0.0D0 )\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION   EPS, THRESH\n      INTEGER            INCMAX, NALF, NIDIM, NINC, NMAX, NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      COMPLEX*16         A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),\n     $                   AS( NMAX*NMAX ), X( NMAX ), XS( NMAX*INCMAX ),\n     $                   XX( NMAX*INCMAX ), Y( NMAX ),\n     $                   YS( NMAX*INCMAX ), YT( NMAX ),\n     $                   YY( NMAX*INCMAX ), Z( NMAX )\n      DOUBLE PRECISION   G( NMAX )\n      INTEGER            IDIM( NIDIM ), INC( NINC )\n*     .. Local Scalars ..\n      COMPLEX*16         ALPHA, TRANSL\n      DOUBLE PRECISION   ERR, ERRMAX, RALPHA, RALS\n      INTEGER            I, IA, IC, IN, INCX, INCXS, IX, J, JA, JJ, LAA,\n     $                   LDA, LDAS, LJ, LX, N, NARGS, NC, NS\n      LOGICAL            FULL, NULL, PACKED, RESET, SAME, UPPER\n      CHARACTER*1        UPLO, UPLOS\n      CHARACTER*2        ICH\n*     .. Local Arrays ..\n      COMPLEX*16         W( 1 )\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LZE, LZERES\n      EXTERNAL           LZE, LZERES\n*     .. External Subroutines ..\n      EXTERNAL           ZHER, ZHPR, ZMAKE, ZMVCH\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, DBLE, DCMPLX, DCONJG, MAX\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Data statements ..\n      DATA               ICH/'UL'/\n*     .. Executable Statements ..\n      FULL = SNAME( 3: 3 ).EQ.'E'\n      PACKED = SNAME( 3: 3 ).EQ.'P'\n*     Define the number of arguments.\n      IF( FULL )THEN\n         NARGS = 7\n      ELSE IF( PACKED )THEN\n         NARGS = 6\n      END IF\n*\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = RZERO\n*\n      DO 100 IN = 1, NIDIM\n         N = IDIM( IN )\n*        Set LDA to 1 more than minimum value if room.\n         LDA = N\n         IF( LDA.LT.NMAX )\n     $      LDA = LDA + 1\n*        Skip tests if not enough room.\n         IF( LDA.GT.NMAX )\n     $      GO TO 100\n         IF( PACKED )THEN\n            LAA = ( N*( N + 1 ) )/2\n         ELSE\n            LAA = LDA*N\n         END IF\n*\n         DO 90 IC = 1, 2\n            UPLO = ICH( IC: IC )\n            UPPER = UPLO.EQ.'U'\n*\n            DO 80 IX = 1, NINC\n               INCX = INC( IX )\n               LX = ABS( INCX )*N\n*\n*              Generate the vector X.\n*\n               TRANSL = HALF\n               CALL ZMAKE( 'GE', ' ', ' ', 1, N, X, 1, XX, ABS( INCX ),\n     $                     0, N - 1, RESET, TRANSL )\n               IF( N.GT.1 )THEN\n                  X( N/2 ) = ZERO\n                  XX( 1 + ABS( INCX )*( N/2 - 1 ) ) = ZERO\n               END IF\n*\n               DO 70 IA = 1, NALF\n                  RALPHA = DBLE( ALF( IA ) )\n                  ALPHA = DCMPLX( RALPHA, RZERO )\n                  NULL = N.LE.0.OR.RALPHA.EQ.RZERO\n*\n*                 Generate the matrix A.\n*\n                  TRANSL = ZERO\n                  CALL ZMAKE( SNAME( 2: 3 ), UPLO, ' ', N, N, A, NMAX,\n     $                        AA, LDA, N - 1, N - 1, RESET, TRANSL )\n*\n                  NC = NC + 1\n*\n*                 Save every datum before calling the subroutine.\n*\n                  UPLOS = UPLO\n                  NS = N\n                  RALS = RALPHA\n                  DO 10 I = 1, LAA\n                     AS( I ) = AA( I )\n   10             CONTINUE\n                  LDAS = LDA\n                  DO 20 I = 1, LX\n                     XS( I ) = XX( I )\n   20             CONTINUE\n                  INCXS = INCX\n*\n*                 Call the subroutine.\n*\n                  IF( FULL )THEN\n                     IF( TRACE )\n     $                  WRITE( NTRA, FMT = 9993 )NC, SNAME, UPLO, N,\n     $                  RALPHA, INCX, LDA\n                     IF( REWI )\n     $                  REWIND NTRA\n                     CALL ZHER( UPLO, N, RALPHA, XX, INCX, AA, LDA )\n                  ELSE IF( PACKED )THEN\n                     IF( TRACE )\n     $                  WRITE( NTRA, FMT = 9994 )NC, SNAME, UPLO, N,\n     $                  RALPHA, INCX\n                     IF( REWI )\n     $                  REWIND NTRA\n                     CALL ZHPR( UPLO, N, RALPHA, XX, INCX, AA )\n                  END IF\n*\n*                 Check if error-exit was taken incorrectly.\n*\n                  IF( .NOT.OK )THEN\n                     WRITE( NOUT, FMT = 9992 )\n                     FATAL = .TRUE.\n                     GO TO 120\n                  END IF\n*\n*                 See what data changed inside subroutines.\n*\n                  ISAME( 1 ) = UPLO.EQ.UPLOS\n                  ISAME( 2 ) = NS.EQ.N\n                  ISAME( 3 ) = RALS.EQ.RALPHA\n                  ISAME( 4 ) = LZE( XS, XX, LX )\n                  ISAME( 5 ) = INCXS.EQ.INCX\n                  IF( NULL )THEN\n                     ISAME( 6 ) = LZE( AS, AA, LAA )\n                  ELSE\n                     ISAME( 6 ) = LZERES( SNAME( 2: 3 ), UPLO, N, N, AS,\n     $                            AA, LDA )\n                  END IF\n                  IF( .NOT.PACKED )THEN\n                     ISAME( 7 ) = LDAS.EQ.LDA\n                  END IF\n*\n*                 If data was incorrectly changed, report and return.\n*\n                  SAME = .TRUE.\n                  DO 30 I = 1, NARGS\n                     SAME = SAME.AND.ISAME( I )\n                     IF( .NOT.ISAME( I ) )\n     $                  WRITE( NOUT, FMT = 9998 )I\n   30             CONTINUE\n                  IF( .NOT.SAME )THEN\n                     FATAL = .TRUE.\n                     GO TO 120\n                  END IF\n*\n                  IF( .NOT.NULL )THEN\n*\n*                    Check the result column by column.\n*\n                     IF( INCX.GT.0 )THEN\n                        DO 40 I = 1, N\n                           Z( I ) = X( I )\n   40                   CONTINUE\n                     ELSE\n                        DO 50 I = 1, N\n                           Z( I ) = X( N - I + 1 )\n   50                   CONTINUE\n                     END IF\n                     JA = 1\n                     DO 60 J = 1, N\n                        W( 1 ) = DCONJG( Z( J ) )\n                        IF( UPPER )THEN\n                           JJ = 1\n                           LJ = J\n                        ELSE\n                           JJ = J\n                           LJ = N - J + 1\n                        END IF\n                        CALL ZMVCH( 'N', LJ, 1, ALPHA, Z( JJ ), LJ, W,\n     $                              1, ONE, A( JJ, J ), 1, YT, G,\n     $                              AA( JA ), EPS, ERR, FATAL, NOUT,\n     $                              .TRUE. )\n                        IF( FULL )THEN\n                           IF( UPPER )THEN\n                              JA = JA + LDA\n                           ELSE\n                              JA = JA + LDA + 1\n                           END IF\n                        ELSE\n                           JA = JA + LJ\n                        END IF\n                        ERRMAX = MAX( ERRMAX, ERR )\n*                       If got really bad answer, report and return.\n                        IF( FATAL )\n     $                     GO TO 110\n   60                CONTINUE\n                  ELSE\n*                    Avoid repeating tests if N.le.0.\n                     IF( N.LE.0 )\n     $                  GO TO 100\n                  END IF\n*\n   70          CONTINUE\n*\n   80       CONTINUE\n*\n   90    CONTINUE\n*\n  100 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 130\n*\n  110 CONTINUE\n      WRITE( NOUT, FMT = 9995 )J\n*\n  120 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      IF( FULL )THEN\n         WRITE( NOUT, FMT = 9993 )NC, SNAME, UPLO, N, RALPHA, INCX, LDA\n      ELSE IF( PACKED )THEN\n         WRITE( NOUT, FMT = 9994 )NC, SNAME, UPLO, N, RALPHA, INCX\n      END IF\n*\n  130 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( '      THESE ARE THE RESULTS FOR COLUMN ', I3 )\n 9994 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', I3, ',', F4.1, ', X,',\n     $      I2, ', AP)                                         .' )\n 9993 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', I3, ',', F4.1, ', X,',\n     $      I2, ', A,', I3, ')                                      .' )\n 9992 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of ZCHK5.\n*\n      END\n      SUBROUTINE ZCHK6( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX,\n     $                  INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G,\n     $                  Z )\n*\n*  Tests ZHER2 and ZHPR2.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Parameters ..\n      COMPLEX*16         ZERO, HALF, ONE\n      PARAMETER          ( ZERO = ( 0.0D0, 0.0D0 ),\n     $                   HALF = ( 0.5D0, 0.0D0 ),\n     $                   ONE = ( 1.0D0, 0.0D0 ) )\n      DOUBLE PRECISION   RZERO\n      PARAMETER          ( RZERO = 0.0D0 )\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION   EPS, THRESH\n      INTEGER            INCMAX, NALF, NIDIM, NINC, NMAX, NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      COMPLEX*16         A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),\n     $                   AS( NMAX*NMAX ), X( NMAX ), XS( NMAX*INCMAX ),\n     $                   XX( NMAX*INCMAX ), Y( NMAX ),\n     $                   YS( NMAX*INCMAX ), YT( NMAX ),\n     $                   YY( NMAX*INCMAX ), Z( NMAX, 2 )\n      DOUBLE PRECISION   G( NMAX )\n      INTEGER            IDIM( NIDIM ), INC( NINC )\n*     .. Local Scalars ..\n      COMPLEX*16         ALPHA, ALS, TRANSL\n      DOUBLE PRECISION   ERR, ERRMAX\n      INTEGER            I, IA, IC, IN, INCX, INCXS, INCY, INCYS, IX,\n     $                   IY, J, JA, JJ, LAA, LDA, LDAS, LJ, LX, LY, N,\n     $                   NARGS, NC, NS\n      LOGICAL            FULL, NULL, PACKED, RESET, SAME, UPPER\n      CHARACTER*1        UPLO, UPLOS\n      CHARACTER*2        ICH\n*     .. Local Arrays ..\n      COMPLEX*16         W( 2 )\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LZE, LZERES\n      EXTERNAL           LZE, LZERES\n*     .. External Subroutines ..\n      EXTERNAL           ZHER2, ZHPR2, ZMAKE, ZMVCH\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, DCONJG, MAX\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Data statements ..\n      DATA               ICH/'UL'/\n*     .. Executable Statements ..\n      FULL = SNAME( 3: 3 ).EQ.'E'\n      PACKED = SNAME( 3: 3 ).EQ.'P'\n*     Define the number of arguments.\n      IF( FULL )THEN\n         NARGS = 9\n      ELSE IF( PACKED )THEN\n         NARGS = 8\n      END IF\n*\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = RZERO\n*\n      DO 140 IN = 1, NIDIM\n         N = IDIM( IN )\n*        Set LDA to 1 more than minimum value if room.\n         LDA = N\n         IF( LDA.LT.NMAX )\n     $      LDA = LDA + 1\n*        Skip tests if not enough room.\n         IF( LDA.GT.NMAX )\n     $      GO TO 140\n         IF( PACKED )THEN\n            LAA = ( N*( N + 1 ) )/2\n         ELSE\n            LAA = LDA*N\n         END IF\n*\n         DO 130 IC = 1, 2\n            UPLO = ICH( IC: IC )\n            UPPER = UPLO.EQ.'U'\n*\n            DO 120 IX = 1, NINC\n               INCX = INC( IX )\n               LX = ABS( INCX )*N\n*\n*              Generate the vector X.\n*\n               TRANSL = HALF\n               CALL ZMAKE( 'GE', ' ', ' ', 1, N, X, 1, XX, ABS( INCX ),\n     $                     0, N - 1, RESET, TRANSL )\n               IF( N.GT.1 )THEN\n                  X( N/2 ) = ZERO\n                  XX( 1 + ABS( INCX )*( N/2 - 1 ) ) = ZERO\n               END IF\n*\n               DO 110 IY = 1, NINC\n                  INCY = INC( IY )\n                  LY = ABS( INCY )*N\n*\n*                 Generate the vector Y.\n*\n                  TRANSL = ZERO\n                  CALL ZMAKE( 'GE', ' ', ' ', 1, N, Y, 1, YY,\n     $                        ABS( INCY ), 0, N - 1, RESET, TRANSL )\n                  IF( N.GT.1 )THEN\n                     Y( N/2 ) = ZERO\n                     YY( 1 + ABS( INCY )*( N/2 - 1 ) ) = ZERO\n                  END IF\n*\n                  DO 100 IA = 1, NALF\n                     ALPHA = ALF( IA )\n                     NULL = N.LE.0.OR.ALPHA.EQ.ZERO\n*\n*                    Generate the matrix A.\n*\n                     TRANSL = ZERO\n                     CALL ZMAKE( SNAME( 2: 3 ), UPLO, ' ', N, N, A,\n     $                           NMAX, AA, LDA, N - 1, N - 1, RESET,\n     $                           TRANSL )\n*\n                     NC = NC + 1\n*\n*                    Save every datum before calling the subroutine.\n*\n                     UPLOS = UPLO\n                     NS = N\n                     ALS = ALPHA\n                     DO 10 I = 1, LAA\n                        AS( I ) = AA( I )\n   10                CONTINUE\n                     LDAS = LDA\n                     DO 20 I = 1, LX\n                        XS( I ) = XX( I )\n   20                CONTINUE\n                     INCXS = INCX\n                     DO 30 I = 1, LY\n                        YS( I ) = YY( I )\n   30                CONTINUE\n                     INCYS = INCY\n*\n*                    Call the subroutine.\n*\n                     IF( FULL )THEN\n                        IF( TRACE )\n     $                     WRITE( NTRA, FMT = 9993 )NC, SNAME, UPLO, N,\n     $                     ALPHA, INCX, INCY, LDA\n                        IF( REWI )\n     $                     REWIND NTRA\n                        CALL ZHER2( UPLO, N, ALPHA, XX, INCX, YY, INCY,\n     $                              AA, LDA )\n                     ELSE IF( PACKED )THEN\n                        IF( TRACE )\n     $                     WRITE( NTRA, FMT = 9994 )NC, SNAME, UPLO, N,\n     $                     ALPHA, INCX, INCY\n                        IF( REWI )\n     $                     REWIND NTRA\n                        CALL ZHPR2( UPLO, N, ALPHA, XX, INCX, YY, INCY,\n     $                              AA )\n                     END IF\n*\n*                    Check if error-exit was taken incorrectly.\n*\n                     IF( .NOT.OK )THEN\n                        WRITE( NOUT, FMT = 9992 )\n                        FATAL = .TRUE.\n                        GO TO 160\n                     END IF\n*\n*                    See what data changed inside subroutines.\n*\n                     ISAME( 1 ) = UPLO.EQ.UPLOS\n                     ISAME( 2 ) = NS.EQ.N\n                     ISAME( 3 ) = ALS.EQ.ALPHA\n                     ISAME( 4 ) = LZE( XS, XX, LX )\n                     ISAME( 5 ) = INCXS.EQ.INCX\n                     ISAME( 6 ) = LZE( YS, YY, LY )\n                     ISAME( 7 ) = INCYS.EQ.INCY\n                     IF( NULL )THEN\n                        ISAME( 8 ) = LZE( AS, AA, LAA )\n                     ELSE\n                        ISAME( 8 ) = LZERES( SNAME( 2: 3 ), UPLO, N, N,\n     $                               AS, AA, LDA )\n                     END IF\n                     IF( .NOT.PACKED )THEN\n                        ISAME( 9 ) = LDAS.EQ.LDA\n                     END IF\n*\n*                    If data was incorrectly changed, report and return.\n*\n                     SAME = .TRUE.\n                     DO 40 I = 1, NARGS\n                        SAME = SAME.AND.ISAME( I )\n                        IF( .NOT.ISAME( I ) )\n     $                     WRITE( NOUT, FMT = 9998 )I\n   40                CONTINUE\n                     IF( .NOT.SAME )THEN\n                        FATAL = .TRUE.\n                        GO TO 160\n                     END IF\n*\n                     IF( .NOT.NULL )THEN\n*\n*                       Check the result column by column.\n*\n                        IF( INCX.GT.0 )THEN\n                           DO 50 I = 1, N\n                              Z( I, 1 ) = X( I )\n   50                      CONTINUE\n                        ELSE\n                           DO 60 I = 1, N\n                              Z( I, 1 ) = X( N - I + 1 )\n   60                      CONTINUE\n                        END IF\n                        IF( INCY.GT.0 )THEN\n                           DO 70 I = 1, N\n                              Z( I, 2 ) = Y( I )\n   70                      CONTINUE\n                        ELSE\n                           DO 80 I = 1, N\n                              Z( I, 2 ) = Y( N - I + 1 )\n   80                      CONTINUE\n                        END IF\n                        JA = 1\n                        DO 90 J = 1, N\n                           W( 1 ) = ALPHA*DCONJG( Z( J, 2 ) )\n                           W( 2 ) = DCONJG( ALPHA )*DCONJG( Z( J, 1 ) )\n                           IF( UPPER )THEN\n                              JJ = 1\n                              LJ = J\n                           ELSE\n                              JJ = J\n                              LJ = N - J + 1\n                           END IF\n                           CALL ZMVCH( 'N', LJ, 2, ONE, Z( JJ, 1 ),\n     $                                 NMAX, W, 1, ONE, A( JJ, J ), 1,\n     $                                 YT, G, AA( JA ), EPS, ERR, FATAL,\n     $                                 NOUT, .TRUE. )\n                           IF( FULL )THEN\n                              IF( UPPER )THEN\n                                 JA = JA + LDA\n                              ELSE\n                                 JA = JA + LDA + 1\n                              END IF\n                           ELSE\n                              JA = JA + LJ\n                           END IF\n                           ERRMAX = MAX( ERRMAX, ERR )\n*                          If got really bad answer, report and return.\n                           IF( FATAL )\n     $                        GO TO 150\n   90                   CONTINUE\n                     ELSE\n*                       Avoid repeating tests with N.le.0.\n                        IF( N.LE.0 )\n     $                     GO TO 140\n                     END IF\n*\n  100             CONTINUE\n*\n  110          CONTINUE\n*\n  120       CONTINUE\n*\n  130    CONTINUE\n*\n  140 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 170\n*\n  150 CONTINUE\n      WRITE( NOUT, FMT = 9995 )J\n*\n  160 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      IF( FULL )THEN\n         WRITE( NOUT, FMT = 9993 )NC, SNAME, UPLO, N, ALPHA, INCX,\n     $      INCY, LDA\n      ELSE IF( PACKED )THEN\n         WRITE( NOUT, FMT = 9994 )NC, SNAME, UPLO, N, ALPHA, INCX, INCY\n      END IF\n*\n  170 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( '      THESE ARE THE RESULTS FOR COLUMN ', I3 )\n 9994 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', I3, ',(', F4.1, ',',\n     $      F4.1, '), X,', I2, ', Y,', I2, ', AP)                     ',\n     $      '       .' )\n 9993 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', I3, ',(', F4.1, ',',\n     $      F4.1, '), X,', I2, ', Y,', I2, ', A,', I3, ')             ',\n     $      '            .' )\n 9992 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of ZCHK6.\n*\n      END\n      SUBROUTINE ZCHKE( ISNUM, SRNAMT, NOUT )\n*\n*  Tests the error exits from the Level 2 Blas.\n*  Requires a special version of the error-handling routine XERBLA.\n*  ALPHA, RALPHA, BETA, A, X and Y should not need to be defined.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Scalar Arguments ..\n      INTEGER            ISNUM, NOUT\n      CHARACTER*6        SRNAMT\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Local Scalars ..\n      COMPLEX*16         ALPHA, BETA\n      DOUBLE PRECISION   RALPHA\n*     .. Local Arrays ..\n      COMPLEX*16         A( 1, 1 ), X( 1 ), Y( 1 )\n*     .. External Subroutines ..\n      EXTERNAL           CHKXER, ZGBMV, ZGEMV, ZGERC, ZGERU, ZHBMV,\n     $                   ZHEMV, ZHER, ZHER2, ZHPMV, ZHPR, ZHPR2, ZTBMV,\n     $                   ZTBSV, ZTPMV, ZTPSV, ZTRMV, ZTRSV\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Executable Statements ..\n*     OK is set to .FALSE. by the special version of XERBLA or by CHKXER\n*     if anything is wrong.\n      OK = .TRUE.\n*     LERR is set to .TRUE. by the special version of XERBLA each time\n*     it is called, and is then tested and re-set by CHKXER.\n      LERR = .FALSE.\n      GO TO ( 10, 20, 30, 40, 50, 60, 70, 80,\n     $        90, 100, 110, 120, 130, 140, 150, 160,\n     $        170 )ISNUM\n   10 INFOT = 1\n      CALL ZGEMV( '/', 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL ZGEMV( 'N', -1, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZGEMV( 'N', 0, -1, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL ZGEMV( 'N', 2, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL ZGEMV( 'N', 0, 0, ALPHA, A, 1, X, 0, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL ZGEMV( 'N', 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 180\n   20 INFOT = 1\n      CALL ZGBMV( '/', 0, 0, 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL ZGBMV( 'N', -1, 0, 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZGBMV( 'N', 0, -1, 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZGBMV( 'N', 0, 0, -1, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZGBMV( 'N', 2, 0, 0, -1, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL ZGBMV( 'N', 0, 0, 1, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL ZGBMV( 'N', 0, 0, 0, 0, ALPHA, A, 1, X, 0, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 13\n      CALL ZGBMV( 'N', 0, 0, 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 180\n   30 INFOT = 1\n      CALL ZHEMV( '/', 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL ZHEMV( 'U', -1, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZHEMV( 'U', 2, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL ZHEMV( 'U', 0, ALPHA, A, 1, X, 0, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL ZHEMV( 'U', 0, ALPHA, A, 1, X, 1, BETA, Y, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 180\n   40 INFOT = 1\n      CALL ZHBMV( '/', 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL ZHBMV( 'U', -1, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZHBMV( 'U', 0, -1, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL ZHBMV( 'U', 0, 1, ALPHA, A, 1, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL ZHBMV( 'U', 0, 0, ALPHA, A, 1, X, 0, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL ZHBMV( 'U', 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 180\n   50 INFOT = 1\n      CALL ZHPMV( '/', 0, ALPHA, A, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL ZHPMV( 'U', -1, ALPHA, A, X, 1, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL ZHPMV( 'U', 0, ALPHA, A, X, 0, BETA, Y, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZHPMV( 'U', 0, ALPHA, A, X, 1, BETA, Y, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 180\n   60 INFOT = 1\n      CALL ZTRMV( '/', 'N', 'N', 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL ZTRMV( 'U', '/', 'N', 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZTRMV( 'U', 'N', '/', 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZTRMV( 'U', 'N', 'N', -1, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL ZTRMV( 'U', 'N', 'N', 2, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL ZTRMV( 'U', 'N', 'N', 0, A, 1, X, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 180\n   70 INFOT = 1\n      CALL ZTBMV( '/', 'N', 'N', 0, 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL ZTBMV( 'U', '/', 'N', 0, 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZTBMV( 'U', 'N', '/', 0, 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZTBMV( 'U', 'N', 'N', -1, 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZTBMV( 'U', 'N', 'N', 0, -1, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL ZTBMV( 'U', 'N', 'N', 0, 1, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZTBMV( 'U', 'N', 'N', 0, 0, A, 1, X, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 180\n   80 INFOT = 1\n      CALL ZTPMV( '/', 'N', 'N', 0, A, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL ZTPMV( 'U', '/', 'N', 0, A, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZTPMV( 'U', 'N', '/', 0, A, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZTPMV( 'U', 'N', 'N', -1, A, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL ZTPMV( 'U', 'N', 'N', 0, A, X, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 180\n   90 INFOT = 1\n      CALL ZTRSV( '/', 'N', 'N', 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL ZTRSV( 'U', '/', 'N', 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZTRSV( 'U', 'N', '/', 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZTRSV( 'U', 'N', 'N', -1, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL ZTRSV( 'U', 'N', 'N', 2, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL ZTRSV( 'U', 'N', 'N', 0, A, 1, X, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 180\n  100 INFOT = 1\n      CALL ZTBSV( '/', 'N', 'N', 0, 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL ZTBSV( 'U', '/', 'N', 0, 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZTBSV( 'U', 'N', '/', 0, 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZTBSV( 'U', 'N', 'N', -1, 0, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZTBSV( 'U', 'N', 'N', 0, -1, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL ZTBSV( 'U', 'N', 'N', 0, 1, A, 1, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZTBSV( 'U', 'N', 'N', 0, 0, A, 1, X, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 180\n  110 INFOT = 1\n      CALL ZTPSV( '/', 'N', 'N', 0, A, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL ZTPSV( 'U', '/', 'N', 0, A, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZTPSV( 'U', 'N', '/', 0, A, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZTPSV( 'U', 'N', 'N', -1, A, X, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL ZTPSV( 'U', 'N', 'N', 0, A, X, 0 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 180\n  120 INFOT = 1\n      CALL ZGERC( -1, 0, ALPHA, X, 1, Y, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL ZGERC( 0, -1, ALPHA, X, 1, Y, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZGERC( 0, 0, ALPHA, X, 0, Y, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL ZGERC( 0, 0, ALPHA, X, 1, Y, 0, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZGERC( 2, 0, ALPHA, X, 1, Y, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 180\n  130 INFOT = 1\n      CALL ZGERU( -1, 0, ALPHA, X, 1, Y, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL ZGERU( 0, -1, ALPHA, X, 1, Y, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZGERU( 0, 0, ALPHA, X, 0, Y, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL ZGERU( 0, 0, ALPHA, X, 1, Y, 0, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZGERU( 2, 0, ALPHA, X, 1, Y, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 180\n  140 INFOT = 1\n      CALL ZHER( '/', 0, RALPHA, X, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL ZHER( 'U', -1, RALPHA, X, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZHER( 'U', 0, RALPHA, X, 0, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL ZHER( 'U', 2, RALPHA, X, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 180\n  150 INFOT = 1\n      CALL ZHPR( '/', 0, RALPHA, X, 1, A )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL ZHPR( 'U', -1, RALPHA, X, 1, A )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZHPR( 'U', 0, RALPHA, X, 0, A )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 180\n  160 INFOT = 1\n      CALL ZHER2( '/', 0, ALPHA, X, 1, Y, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL ZHER2( 'U', -1, ALPHA, X, 1, Y, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZHER2( 'U', 0, ALPHA, X, 0, Y, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL ZHER2( 'U', 0, ALPHA, X, 1, Y, 0, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZHER2( 'U', 2, ALPHA, X, 1, Y, 1, A, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 180\n  170 INFOT = 1\n      CALL ZHPR2( '/', 0, ALPHA, X, 1, Y, 1, A )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL ZHPR2( 'U', -1, ALPHA, X, 1, Y, 1, A )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZHPR2( 'U', 0, ALPHA, X, 0, Y, 1, A )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL ZHPR2( 'U', 0, ALPHA, X, 1, Y, 0, A )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n*\n  180 IF( OK )THEN\n         WRITE( NOUT, FMT = 9999 )SRNAMT\n      ELSE\n         WRITE( NOUT, FMT = 9998 )SRNAMT\n      END IF\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE TESTS OF ERROR-EXITS' )\n 9998 FORMAT( ' ******* ', A6, ' FAILED THE TESTS OF ERROR-EXITS *****',\n     $      '**' )\n*\n*     End of ZCHKE.\n*\n      END\n      SUBROUTINE ZMAKE( TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, KL,\n     $                  KU, RESET, TRANSL )\n*\n*  Generates values for an M by N matrix A within the bandwidth\n*  defined by KL and KU.\n*  Stores the values in the array AA in the data structure required\n*  by the routine, with unwanted elements set to rogue value.\n*\n*  TYPE is 'GE', 'GB', 'HE', 'HB', 'HP', 'TR', 'TB' OR 'TP'.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Parameters ..\n      COMPLEX*16         ZERO, ONE\n      PARAMETER          ( ZERO = ( 0.0D0, 0.0D0 ),\n     $                   ONE = ( 1.0D0, 0.0D0 ) )\n      COMPLEX*16         ROGUE\n      PARAMETER          ( ROGUE = ( -1.0D10, 1.0D10 ) )\n      DOUBLE PRECISION   RZERO\n      PARAMETER          ( RZERO = 0.0D0 )\n      DOUBLE PRECISION   RROGUE\n      PARAMETER          ( RROGUE = -1.0D10 )\n*     .. Scalar Arguments ..\n      COMPLEX*16         TRANSL\n      INTEGER            KL, KU, LDA, M, N, NMAX\n      LOGICAL            RESET\n      CHARACTER*1        DIAG, UPLO\n      CHARACTER*2        TYPE\n*     .. Array Arguments ..\n      COMPLEX*16         A( NMAX, * ), AA( * )\n*     .. Local Scalars ..\n      INTEGER            I, I1, I2, I3, IBEG, IEND, IOFF, J, JJ, KK\n      LOGICAL            GEN, LOWER, SYM, TRI, UNIT, UPPER\n*     .. External Functions ..\n      COMPLEX*16         ZBEG\n      EXTERNAL           ZBEG\n*     .. Intrinsic Functions ..\n      INTRINSIC          DBLE, DCMPLX, DCONJG, MAX, MIN\n*     .. Executable Statements ..\n      GEN = TYPE( 1: 1 ).EQ.'G'\n      SYM = TYPE( 1: 1 ).EQ.'H'\n      TRI = TYPE( 1: 1 ).EQ.'T'\n      UPPER = ( SYM.OR.TRI ).AND.UPLO.EQ.'U'\n      LOWER = ( SYM.OR.TRI ).AND.UPLO.EQ.'L'\n      UNIT = TRI.AND.DIAG.EQ.'U'\n*\n*     Generate data in array A.\n*\n      DO 20 J = 1, N\n         DO 10 I = 1, M\n            IF( GEN.OR.( UPPER.AND.I.LE.J ).OR.( LOWER.AND.I.GE.J ) )\n     $          THEN\n               IF( ( I.LE.J.AND.J - I.LE.KU ).OR.\n     $             ( I.GE.J.AND.I - J.LE.KL ) )THEN\n                  A( I, J ) = ZBEG( RESET ) + TRANSL\n               ELSE\n                  A( I, J ) = ZERO\n               END IF\n               IF( I.NE.J )THEN\n                  IF( SYM )THEN\n                     A( J, I ) = DCONJG( A( I, J ) )\n                  ELSE IF( TRI )THEN\n                     A( J, I ) = ZERO\n                  END IF\n               END IF\n            END IF\n   10    CONTINUE\n         IF( SYM )\n     $      A( J, J ) = DCMPLX( DBLE( A( J, J ) ), RZERO )\n         IF( TRI )\n     $      A( J, J ) = A( J, J ) + ONE\n         IF( UNIT )\n     $      A( J, J ) = ONE\n   20 CONTINUE\n*\n*     Store elements in array AS in data structure required by routine.\n*\n      IF( TYPE.EQ.'GE' )THEN\n         DO 50 J = 1, N\n            DO 30 I = 1, M\n               AA( I + ( J - 1 )*LDA ) = A( I, J )\n   30       CONTINUE\n            DO 40 I = M + 1, LDA\n               AA( I + ( J - 1 )*LDA ) = ROGUE\n   40       CONTINUE\n   50    CONTINUE\n      ELSE IF( TYPE.EQ.'GB' )THEN\n         DO 90 J = 1, N\n            DO 60 I1 = 1, KU + 1 - J\n               AA( I1 + ( J - 1 )*LDA ) = ROGUE\n   60       CONTINUE\n            DO 70 I2 = I1, MIN( KL + KU + 1, KU + 1 + M - J )\n               AA( I2 + ( J - 1 )*LDA ) = A( I2 + J - KU - 1, J )\n   70       CONTINUE\n            DO 80 I3 = I2, LDA\n               AA( I3 + ( J - 1 )*LDA ) = ROGUE\n   80       CONTINUE\n   90    CONTINUE\n      ELSE IF( TYPE.EQ.'HE'.OR.TYPE.EQ.'TR' )THEN\n         DO 130 J = 1, N\n            IF( UPPER )THEN\n               IBEG = 1\n               IF( UNIT )THEN\n                  IEND = J - 1\n               ELSE\n                  IEND = J\n               END IF\n            ELSE\n               IF( UNIT )THEN\n                  IBEG = J + 1\n               ELSE\n                  IBEG = J\n               END IF\n               IEND = N\n            END IF\n            DO 100 I = 1, IBEG - 1\n               AA( I + ( J - 1 )*LDA ) = ROGUE\n  100       CONTINUE\n            DO 110 I = IBEG, IEND\n               AA( I + ( J - 1 )*LDA ) = A( I, J )\n  110       CONTINUE\n            DO 120 I = IEND + 1, LDA\n               AA( I + ( J - 1 )*LDA ) = ROGUE\n  120       CONTINUE\n            IF( SYM )THEN\n               JJ = J + ( J - 1 )*LDA\n               AA( JJ ) = DCMPLX( DBLE( AA( JJ ) ), RROGUE )\n            END IF\n  130    CONTINUE\n      ELSE IF( TYPE.EQ.'HB'.OR.TYPE.EQ.'TB' )THEN\n         DO 170 J = 1, N\n            IF( UPPER )THEN\n               KK = KL + 1\n               IBEG = MAX( 1, KL + 2 - J )\n               IF( UNIT )THEN\n                  IEND = KL\n               ELSE\n                  IEND = KL + 1\n               END IF\n            ELSE\n               KK = 1\n               IF( UNIT )THEN\n                  IBEG = 2\n               ELSE\n                  IBEG = 1\n               END IF\n               IEND = MIN( KL + 1, 1 + M - J )\n            END IF\n            DO 140 I = 1, IBEG - 1\n               AA( I + ( J - 1 )*LDA ) = ROGUE\n  140       CONTINUE\n            DO 150 I = IBEG, IEND\n               AA( I + ( J - 1 )*LDA ) = A( I + J - KK, J )\n  150       CONTINUE\n            DO 160 I = IEND + 1, LDA\n               AA( I + ( J - 1 )*LDA ) = ROGUE\n  160       CONTINUE\n            IF( SYM )THEN\n               JJ = KK + ( J - 1 )*LDA\n               AA( JJ ) = DCMPLX( DBLE( AA( JJ ) ), RROGUE )\n            END IF\n  170    CONTINUE\n      ELSE IF( TYPE.EQ.'HP'.OR.TYPE.EQ.'TP' )THEN\n         IOFF = 0\n         DO 190 J = 1, N\n            IF( UPPER )THEN\n               IBEG = 1\n               IEND = J\n            ELSE\n               IBEG = J\n               IEND = N\n            END IF\n            DO 180 I = IBEG, IEND\n               IOFF = IOFF + 1\n               AA( IOFF ) = A( I, J )\n               IF( I.EQ.J )THEN\n                  IF( UNIT )\n     $               AA( IOFF ) = ROGUE\n                  IF( SYM )\n     $               AA( IOFF ) = DCMPLX( DBLE( AA( IOFF ) ), RROGUE )\n               END IF\n  180       CONTINUE\n  190    CONTINUE\n      END IF\n      RETURN\n*\n*     End of ZMAKE.\n*\n      END\n      SUBROUTINE ZMVCH( TRANS, M, N, ALPHA, A, NMAX, X, INCX, BETA, Y,\n     $                  INCY, YT, G, YY, EPS, ERR, FATAL, NOUT, MV )\n*\n*  Checks the results of the computational tests.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Parameters ..\n      COMPLEX*16         ZERO\n      PARAMETER          ( ZERO = ( 0.0D0, 0.0D0 ) )\n      DOUBLE PRECISION   RZERO, RONE\n      PARAMETER          ( RZERO = 0.0D0, RONE = 1.0D0 )\n*     .. Scalar Arguments ..\n      COMPLEX*16         ALPHA, BETA\n      DOUBLE PRECISION   EPS, ERR\n      INTEGER            INCX, INCY, M, N, NMAX, NOUT\n      LOGICAL            FATAL, MV\n      CHARACTER*1        TRANS\n*     .. Array Arguments ..\n      COMPLEX*16         A( NMAX, * ), X( * ), Y( * ), YT( * ), YY( * )\n      DOUBLE PRECISION   G( * )\n*     .. Local Scalars ..\n      COMPLEX*16         C\n      DOUBLE PRECISION   ERRI\n      INTEGER            I, INCXL, INCYL, IY, J, JX, KX, KY, ML, NL\n      LOGICAL            CTRAN, TRAN\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, DBLE, DCONJG, DIMAG, MAX, SQRT\n*     .. Statement Functions ..\n      DOUBLE PRECISION   ABS1\n*     .. Statement Function definitions ..\n      ABS1( C ) = ABS( DBLE( C ) ) + ABS( DIMAG( C ) )\n*     .. Executable Statements ..\n      TRAN = TRANS.EQ.'T'\n      CTRAN = TRANS.EQ.'C'\n      IF( TRAN.OR.CTRAN )THEN\n         ML = N\n         NL = M\n      ELSE\n         ML = M\n         NL = N\n      END IF\n      IF( INCX.LT.0 )THEN\n         KX = NL\n         INCXL = -1\n      ELSE\n         KX = 1\n         INCXL = 1\n      END IF\n      IF( INCY.LT.0 )THEN\n         KY = ML\n         INCYL = -1\n      ELSE\n         KY = 1\n         INCYL = 1\n      END IF\n*\n*     Compute expected result in YT using data in A, X and Y.\n*     Compute gauges in G.\n*\n      IY = KY\n      DO 40 I = 1, ML\n         YT( IY ) = ZERO\n         G( IY ) = RZERO\n         JX = KX\n         IF( TRAN )THEN\n            DO 10 J = 1, NL\n               YT( IY ) = YT( IY ) + A( J, I )*X( JX )\n               G( IY ) = G( IY ) + ABS1( A( J, I ) )*ABS1( X( JX ) )\n               JX = JX + INCXL\n   10       CONTINUE\n         ELSE IF( CTRAN )THEN\n            DO 20 J = 1, NL\n               YT( IY ) = YT( IY ) + DCONJG( A( J, I ) )*X( JX )\n               G( IY ) = G( IY ) + ABS1( A( J, I ) )*ABS1( X( JX ) )\n               JX = JX + INCXL\n   20       CONTINUE\n         ELSE\n            DO 30 J = 1, NL\n               YT( IY ) = YT( IY ) + A( I, J )*X( JX )\n               G( IY ) = G( IY ) + ABS1( A( I, J ) )*ABS1( X( JX ) )\n               JX = JX + INCXL\n   30       CONTINUE\n         END IF\n         YT( IY ) = ALPHA*YT( IY ) + BETA*Y( IY )\n         G( IY ) = ABS1( ALPHA )*G( IY ) + ABS1( BETA )*ABS1( Y( IY ) )\n         IY = IY + INCYL\n   40 CONTINUE\n*\n*     Compute the error ratio for this result.\n*\n      ERR = ZERO\n      DO 50 I = 1, ML\n         ERRI = ABS( YT( I ) - YY( 1 + ( I - 1 )*ABS( INCY ) ) )/EPS\n         IF( G( I ).NE.RZERO )\n     $      ERRI = ERRI/G( I )\n         ERR = MAX( ERR, ERRI )\n         IF( ERR*SQRT( EPS ).GE.RONE )\n     $      GO TO 60\n   50 CONTINUE\n*     If the loop completes, all results are at least half accurate.\n      GO TO 80\n*\n*     Report fatal error.\n*\n   60 FATAL = .TRUE.\n      WRITE( NOUT, FMT = 9999 )\n      DO 70 I = 1, ML\n         IF( MV )THEN\n            WRITE( NOUT, FMT = 9998 )I, YT( I ),\n     $         YY( 1 + ( I - 1 )*ABS( INCY ) )\n         ELSE\n            WRITE( NOUT, FMT = 9998 )I,\n     $         YY( 1 + ( I - 1 )*ABS( INCY ) ), YT( I )\n         END IF\n   70 CONTINUE\n*\n   80 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ******* FATAL ERROR - COMPUTED RESULT IS LESS THAN HAL',\n     $      'F ACCURATE *******', /'                       EXPECTED RE',\n     $      'SULT                    COMPUTED RESULT' )\n 9998 FORMAT( 1X, I7, 2( '  (', G15.6, ',', G15.6, ')' ) )\n*\n*     End of ZMVCH.\n*\n      END\n      LOGICAL FUNCTION LZE( RI, RJ, LR )\n*\n*  Tests if two arrays are identical.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Scalar Arguments ..\n      INTEGER            LR\n*     .. Array Arguments ..\n      COMPLEX*16         RI( * ), RJ( * )\n*     .. Local Scalars ..\n      INTEGER            I\n*     .. Executable Statements ..\n      DO 10 I = 1, LR\n         IF( RI( I ).NE.RJ( I ) )\n     $      GO TO 20\n   10 CONTINUE\n      LZE = .TRUE.\n      GO TO 30\n   20 CONTINUE\n      LZE = .FALSE.\n   30 RETURN\n*\n*     End of LZE.\n*\n      END\n      LOGICAL FUNCTION LZERES( TYPE, UPLO, M, N, AA, AS, LDA )\n*\n*  Tests if selected elements in two arrays are equal.\n*\n*  TYPE is 'GE', 'HE' or 'HP'.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Scalar Arguments ..\n      INTEGER            LDA, M, N\n      CHARACTER*1        UPLO\n      CHARACTER*2        TYPE\n*     .. Array Arguments ..\n      COMPLEX*16         AA( LDA, * ), AS( LDA, * )\n*     .. Local Scalars ..\n      INTEGER            I, IBEG, IEND, J\n      LOGICAL            UPPER\n*     .. Executable Statements ..\n      UPPER = UPLO.EQ.'U'\n      IF( TYPE.EQ.'GE' )THEN\n         DO 20 J = 1, N\n            DO 10 I = M + 1, LDA\n               IF( AA( I, J ).NE.AS( I, J ) )\n     $            GO TO 70\n   10       CONTINUE\n   20    CONTINUE\n      ELSE IF( TYPE.EQ.'HE' )THEN\n         DO 50 J = 1, N\n            IF( UPPER )THEN\n               IBEG = 1\n               IEND = J\n            ELSE\n               IBEG = J\n               IEND = N\n            END IF\n            DO 30 I = 1, IBEG - 1\n               IF( AA( I, J ).NE.AS( I, J ) )\n     $            GO TO 70\n   30       CONTINUE\n            DO 40 I = IEND + 1, LDA\n               IF( AA( I, J ).NE.AS( I, J ) )\n     $            GO TO 70\n   40       CONTINUE\n   50    CONTINUE\n      END IF\n*\n   60 CONTINUE\n      LZERES = .TRUE.\n      GO TO 80\n   70 CONTINUE\n      LZERES = .FALSE.\n   80 RETURN\n*\n*     End of LZERES.\n*\n      END\n      COMPLEX*16 FUNCTION ZBEG( RESET )\n*\n*  Generates complex numbers as pairs of random numbers uniformly\n*  distributed between -0.5 and 0.5.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Scalar Arguments ..\n      LOGICAL            RESET\n*     .. Local Scalars ..\n      INTEGER            I, IC, J, MI, MJ\n*     .. Save statement ..\n      SAVE               I, IC, J, MI, MJ\n*     .. Intrinsic Functions ..\n      INTRINSIC          DCMPLX\n*     .. Executable Statements ..\n      IF( RESET )THEN\n*        Initialize local variables.\n         MI = 891\n         MJ = 457\n         I = 7\n         J = 7\n         IC = 0\n         RESET = .FALSE.\n      END IF\n*\n*     The sequence of values of I or J is bounded between 1 and 999.\n*     If initial I or J = 1,2,3,6,7 or 9, the period will be 50.\n*     If initial I or J = 4 or 8, the period will be 25.\n*     If initial I or J = 5, the period will be 10.\n*     IC is used to break up the period by skipping 1 value of I or J\n*     in 6.\n*\n      IC = IC + 1\n   10 I = I*MI\n      J = J*MJ\n      I = I - 1000*( I/1000 )\n      J = J - 1000*( J/1000 )\n      IF( IC.GE.5 )THEN\n         IC = 0\n         GO TO 10\n      END IF\n      ZBEG = DCMPLX( ( I - 500 )/1001.0D0, ( J - 500 )/1001.0D0 )\n      RETURN\n*\n*     End of ZBEG.\n*\n      END\n      DOUBLE PRECISION FUNCTION DDIFF( X, Y )\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION   X, Y\n*     .. Executable Statements ..\n      DDIFF = X - Y\n      RETURN\n*\n*     End of DDIFF.\n*\n      END\n      SUBROUTINE CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n*\n*  Tests whether XERBLA has detected an error when it should.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Scalar Arguments ..\n      INTEGER            INFOT, NOUT\n      LOGICAL            LERR, OK\n      CHARACTER*6        SRNAMT\n*     .. Executable Statements ..\n      IF( .NOT.LERR )THEN\n         WRITE( NOUT, FMT = 9999 )INFOT, SRNAMT\n         OK = .FALSE.\n      END IF\n      LERR = .FALSE.\n      RETURN\n*\n 9999 FORMAT( ' ***** ILLEGAL VALUE OF PARAMETER NUMBER ', I2, ' NOT D',\n     $      'ETECTED BY ', A6, ' *****' )\n*\n*     End of CHKXER.\n*\n      END\n      SUBROUTINE XERBLA( SRNAME, INFO )\n*\n*  This is a special version of XERBLA to be used only as part of\n*  the test program for testing error exits from the Level 2 BLAS\n*  routines.\n*\n*  XERBLA  is an error handler for the Level 2 BLAS routines.\n*\n*  It is called by the Level 2 BLAS routines if an input parameter is\n*  invalid.\n*\n*  Auxiliary routine for test program for Level 2 Blas.\n*\n*  -- Written on 10-August-1987.\n*     Richard Hanson, Sandia National Labs.\n*     Jeremy Du Croz, NAG Central Office.\n*\n*     .. Scalar Arguments ..\n      INTEGER            INFO\n      CHARACTER*6        SRNAME\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUT\n      LOGICAL            LERR, OK\n      CHARACTER*6        SRNAMT\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUT, OK, LERR\n      COMMON             /SRNAMC/SRNAMT\n*     .. Executable Statements ..\n      LERR = .TRUE.\n      IF( INFO.NE.INFOT )THEN\n         IF( INFOT.NE.0 )THEN\n            WRITE( NOUT, FMT = 9999 )INFO, INFOT\n         ELSE\n            WRITE( NOUT, FMT = 9997 )INFO\n         END IF\n         OK = .FALSE.\n      END IF\n      IF( SRNAME.NE.SRNAMT )THEN\n         WRITE( NOUT, FMT = 9998 )SRNAME, SRNAMT\n         OK = .FALSE.\n      END IF\n      RETURN\n*\n 9999 FORMAT( ' ******* XERBLA WAS CALLED WITH INFO = ', I6, ' INSTEAD',\n     $      ' OF ', I2, ' *******' )\n 9998 FORMAT( ' ******* XERBLA WAS CALLED WITH SRNAME = ', A6, ' INSTE',\n     $      'AD OF ', A6, ' *******' )\n 9997 FORMAT( ' ******* XERBLA WAS CALLED WITH INFO = ', I6,\n     $      ' *******' )\n*\n*     End of XERBLA\n*\n      END\n\n"
  },
  {
    "path": "libs/eigen/blas/testing/zblat3.f",
    "content": "      PROGRAM ZBLAT3\n*\n*  Test program for the COMPLEX*16       Level 3 Blas.\n*\n*  The program must be driven by a short data file. The first 14 records\n*  of the file are read using list-directed input, the last 9 records\n*  are read using the format ( A6, L2 ). An annotated example of a data\n*  file can be obtained by deleting the first 3 characters from the\n*  following 23 lines:\n*  'ZBLAT3.SUMM'     NAME OF SUMMARY OUTPUT FILE\n*  6                 UNIT NUMBER OF SUMMARY FILE\n*  'ZBLAT3.SNAP'     NAME OF SNAPSHOT OUTPUT FILE\n*  -1                UNIT NUMBER OF SNAPSHOT FILE (NOT USED IF .LT. 0)\n*  F        LOGICAL FLAG, T TO REWIND SNAPSHOT FILE AFTER EACH RECORD.\n*  F        LOGICAL FLAG, T TO STOP ON FAILURES.\n*  T        LOGICAL FLAG, T TO TEST ERROR EXITS.\n*  16.0     THRESHOLD VALUE OF TEST RATIO\n*  6                 NUMBER OF VALUES OF N\n*  0 1 2 3 5 9       VALUES OF N\n*  3                 NUMBER OF VALUES OF ALPHA\n*  (0.0,0.0) (1.0,0.0) (0.7,-0.9)       VALUES OF ALPHA\n*  3                 NUMBER OF VALUES OF BETA\n*  (0.0,0.0) (1.0,0.0) (1.3,-1.1)       VALUES OF BETA\n*  ZGEMM  T PUT F FOR NO TEST. SAME COLUMNS.\n*  ZHEMM  T PUT F FOR NO TEST. SAME COLUMNS.\n*  ZSYMM  T PUT F FOR NO TEST. SAME COLUMNS.\n*  ZTRMM  T PUT F FOR NO TEST. SAME COLUMNS.\n*  ZTRSM  T PUT F FOR NO TEST. SAME COLUMNS.\n*  ZHERK  T PUT F FOR NO TEST. SAME COLUMNS.\n*  ZSYRK  T PUT F FOR NO TEST. SAME COLUMNS.\n*  ZHER2K T PUT F FOR NO TEST. SAME COLUMNS.\n*  ZSYR2K T PUT F FOR NO TEST. SAME COLUMNS.\n*\n*  See:\n*\n*     Dongarra J. J., Du Croz J. J., Duff I. S. and Hammarling S.\n*     A Set of Level 3 Basic Linear Algebra Subprograms.\n*\n*     Technical Memorandum No.88 (Revision 1), Mathematics and\n*     Computer Science Division, Argonne National Laboratory, 9700\n*     South Cass Avenue, Argonne, Illinois 60439, US.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Parameters ..\n      INTEGER            NIN\n      PARAMETER          ( NIN = 5 )\n      INTEGER            NSUBS\n      PARAMETER          ( NSUBS = 9 )\n      COMPLEX*16         ZERO, ONE\n      PARAMETER          ( ZERO = ( 0.0D0, 0.0D0 ),\n     $                   ONE = ( 1.0D0, 0.0D0 ) )\n      DOUBLE PRECISION   RZERO, RHALF, RONE\n      PARAMETER          ( RZERO = 0.0D0, RHALF = 0.5D0, RONE = 1.0D0 )\n      INTEGER            NMAX\n      PARAMETER          ( NMAX = 65 )\n      INTEGER            NIDMAX, NALMAX, NBEMAX\n      PARAMETER          ( NIDMAX = 9, NALMAX = 7, NBEMAX = 7 )\n*     .. Local Scalars ..\n      DOUBLE PRECISION   EPS, ERR, THRESH\n      INTEGER            I, ISNUM, J, N, NALF, NBET, NIDIM, NOUT, NTRA\n      LOGICAL            FATAL, LTESTT, REWI, SAME, SFATAL, TRACE,\n     $                   TSTERR\n      CHARACTER*1        TRANSA, TRANSB\n      CHARACTER*6        SNAMET\n      CHARACTER*32       SNAPS, SUMMRY\n*     .. Local Arrays ..\n      COMPLEX*16         AA( NMAX*NMAX ), AB( NMAX, 2*NMAX ),\n     $                   ALF( NALMAX ), AS( NMAX*NMAX ),\n     $                   BB( NMAX*NMAX ), BET( NBEMAX ),\n     $                   BS( NMAX*NMAX ), C( NMAX, NMAX ),\n     $                   CC( NMAX*NMAX ), CS( NMAX*NMAX ), CT( NMAX ),\n     $                   W( 2*NMAX )\n      DOUBLE PRECISION   G( NMAX )\n      INTEGER            IDIM( NIDMAX )\n      LOGICAL            LTEST( NSUBS )\n      CHARACTER*6        SNAMES( NSUBS )\n*     .. External Functions ..\n      DOUBLE PRECISION   DDIFF\n      LOGICAL            LZE\n      EXTERNAL           DDIFF, LZE\n*     .. External Subroutines ..\n      EXTERNAL           ZCHK1, ZCHK2, ZCHK3, ZCHK4, ZCHK5, ZCHKE, ZMMCH\n*     .. Intrinsic Functions ..\n      INTRINSIC          MAX, MIN\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n      CHARACTER*6        SRNAMT\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n      COMMON             /SRNAMC/SRNAMT\n*     .. Data statements ..\n      DATA               SNAMES/'ZGEMM ', 'ZHEMM ', 'ZSYMM ', 'ZTRMM ',\n     $                   'ZTRSM ', 'ZHERK ', 'ZSYRK ', 'ZHER2K',\n     $                   'ZSYR2K'/\n*     .. Executable Statements ..\n*\n*     Read name and unit number for summary output file and open file.\n*\n      READ( NIN, FMT = * )SUMMRY\n      READ( NIN, FMT = * )NOUT\n      OPEN( NOUT, FILE = SUMMRY, STATUS = 'NEW' )\n      NOUTC = NOUT\n*\n*     Read name and unit number for snapshot output file and open file.\n*\n      READ( NIN, FMT = * )SNAPS\n      READ( NIN, FMT = * )NTRA\n      TRACE = NTRA.GE.0\n      IF( TRACE )THEN\n         OPEN( NTRA, FILE = SNAPS, STATUS = 'NEW' )\n      END IF\n*     Read the flag that directs rewinding of the snapshot file.\n      READ( NIN, FMT = * )REWI\n      REWI = REWI.AND.TRACE\n*     Read the flag that directs stopping on any failure.\n      READ( NIN, FMT = * )SFATAL\n*     Read the flag that indicates whether error exits are to be tested.\n      READ( NIN, FMT = * )TSTERR\n*     Read the threshold value of the test ratio\n      READ( NIN, FMT = * )THRESH\n*\n*     Read and check the parameter values for the tests.\n*\n*     Values of N\n      READ( NIN, FMT = * )NIDIM\n      IF( NIDIM.LT.1.OR.NIDIM.GT.NIDMAX )THEN\n         WRITE( NOUT, FMT = 9997 )'N', NIDMAX\n         GO TO 220\n      END IF\n      READ( NIN, FMT = * )( IDIM( I ), I = 1, NIDIM )\n      DO 10 I = 1, NIDIM\n         IF( IDIM( I ).LT.0.OR.IDIM( I ).GT.NMAX )THEN\n            WRITE( NOUT, FMT = 9996 )NMAX\n            GO TO 220\n         END IF\n   10 CONTINUE\n*     Values of ALPHA\n      READ( NIN, FMT = * )NALF\n      IF( NALF.LT.1.OR.NALF.GT.NALMAX )THEN\n         WRITE( NOUT, FMT = 9997 )'ALPHA', NALMAX\n         GO TO 220\n      END IF\n      READ( NIN, FMT = * )( ALF( I ), I = 1, NALF )\n*     Values of BETA\n      READ( NIN, FMT = * )NBET\n      IF( NBET.LT.1.OR.NBET.GT.NBEMAX )THEN\n         WRITE( NOUT, FMT = 9997 )'BETA', NBEMAX\n         GO TO 220\n      END IF\n      READ( NIN, FMT = * )( BET( I ), I = 1, NBET )\n*\n*     Report values of parameters.\n*\n      WRITE( NOUT, FMT = 9995 )\n      WRITE( NOUT, FMT = 9994 )( IDIM( I ), I = 1, NIDIM )\n      WRITE( NOUT, FMT = 9993 )( ALF( I ), I = 1, NALF )\n      WRITE( NOUT, FMT = 9992 )( BET( I ), I = 1, NBET )\n      IF( .NOT.TSTERR )THEN\n         WRITE( NOUT, FMT = * )\n         WRITE( NOUT, FMT = 9984 )\n      END IF\n      WRITE( NOUT, FMT = * )\n      WRITE( NOUT, FMT = 9999 )THRESH\n      WRITE( NOUT, FMT = * )\n*\n*     Read names of subroutines and flags which indicate\n*     whether they are to be tested.\n*\n      DO 20 I = 1, NSUBS\n         LTEST( I ) = .FALSE.\n   20 CONTINUE\n   30 READ( NIN, FMT = 9988, END = 60 )SNAMET, LTESTT\n      DO 40 I = 1, NSUBS\n         IF( SNAMET.EQ.SNAMES( I ) )\n     $      GO TO 50\n   40 CONTINUE\n      WRITE( NOUT, FMT = 9990 )SNAMET\n      STOP\n   50 LTEST( I ) = LTESTT\n      GO TO 30\n*\n   60 CONTINUE\n      CLOSE ( NIN )\n*\n*     Compute EPS (the machine precision).\n*\n      EPS = RONE\n   70 CONTINUE\n      IF( DDIFF( RONE + EPS, RONE ).EQ.RZERO )\n     $   GO TO 80\n      EPS = RHALF*EPS\n      GO TO 70\n   80 CONTINUE\n      EPS = EPS + EPS\n      WRITE( NOUT, FMT = 9998 )EPS\n*\n*     Check the reliability of ZMMCH using exact data.\n*\n      N = MIN( 32, NMAX )\n      DO 100 J = 1, N\n         DO 90 I = 1, N\n            AB( I, J ) = MAX( I - J + 1, 0 )\n   90    CONTINUE\n         AB( J, NMAX + 1 ) = J\n         AB( 1, NMAX + J ) = J\n         C( J, 1 ) = ZERO\n  100 CONTINUE\n      DO 110 J = 1, N\n         CC( J ) = J*( ( J + 1 )*J )/2 - ( ( J + 1 )*J*( J - 1 ) )/3\n  110 CONTINUE\n*     CC holds the exact result. On exit from ZMMCH CT holds\n*     the result computed by ZMMCH.\n      TRANSA = 'N'\n      TRANSB = 'N'\n      CALL ZMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX,\n     $            AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC,\n     $            NMAX, EPS, ERR, FATAL, NOUT, .TRUE. )\n      SAME = LZE( CC, CT, N )\n      IF( .NOT.SAME.OR.ERR.NE.RZERO )THEN\n         WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR\n         STOP\n      END IF\n      TRANSB = 'C'\n      CALL ZMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX,\n     $            AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC,\n     $            NMAX, EPS, ERR, FATAL, NOUT, .TRUE. )\n      SAME = LZE( CC, CT, N )\n      IF( .NOT.SAME.OR.ERR.NE.RZERO )THEN\n         WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR\n         STOP\n      END IF\n      DO 120 J = 1, N\n         AB( J, NMAX + 1 ) = N - J + 1\n         AB( 1, NMAX + J ) = N - J + 1\n  120 CONTINUE\n      DO 130 J = 1, N\n         CC( N - J + 1 ) = J*( ( J + 1 )*J )/2 -\n     $                     ( ( J + 1 )*J*( J - 1 ) )/3\n  130 CONTINUE\n      TRANSA = 'C'\n      TRANSB = 'N'\n      CALL ZMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX,\n     $            AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC,\n     $            NMAX, EPS, ERR, FATAL, NOUT, .TRUE. )\n      SAME = LZE( CC, CT, N )\n      IF( .NOT.SAME.OR.ERR.NE.RZERO )THEN\n         WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR\n         STOP\n      END IF\n      TRANSB = 'C'\n      CALL ZMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX,\n     $            AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC,\n     $            NMAX, EPS, ERR, FATAL, NOUT, .TRUE. )\n      SAME = LZE( CC, CT, N )\n      IF( .NOT.SAME.OR.ERR.NE.RZERO )THEN\n         WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR\n         STOP\n      END IF\n*\n*     Test each subroutine in turn.\n*\n      DO 200 ISNUM = 1, NSUBS\n         WRITE( NOUT, FMT = * )\n         IF( .NOT.LTEST( ISNUM ) )THEN\n*           Subprogram is not to be tested.\n            WRITE( NOUT, FMT = 9987 )SNAMES( ISNUM )\n         ELSE\n            SRNAMT = SNAMES( ISNUM )\n*           Test error exits.\n            IF( TSTERR )THEN\n               CALL ZCHKE( ISNUM, SNAMES( ISNUM ), NOUT )\n               WRITE( NOUT, FMT = * )\n            END IF\n*           Test computations.\n            INFOT = 0\n            OK = .TRUE.\n            FATAL = .FALSE.\n            GO TO ( 140, 150, 150, 160, 160, 170, 170,\n     $              180, 180 )ISNUM\n*           Test ZGEMM, 01.\n  140       CALL ZCHK1( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,\n     $                  NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C,\n     $                  CC, CS, CT, G )\n            GO TO 190\n*           Test ZHEMM, 02, ZSYMM, 03.\n  150       CALL ZCHK2( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,\n     $                  NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C,\n     $                  CC, CS, CT, G )\n            GO TO 190\n*           Test ZTRMM, 04, ZTRSM, 05.\n  160       CALL ZCHK3( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NMAX, AB,\n     $                  AA, AS, AB( 1, NMAX + 1 ), BB, BS, CT, G, C )\n            GO TO 190\n*           Test ZHERK, 06, ZSYRK, 07.\n  170       CALL ZCHK4( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,\n     $                  NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C,\n     $                  CC, CS, CT, G )\n            GO TO 190\n*           Test ZHER2K, 08, ZSYR2K, 09.\n  180       CALL ZCHK5( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,\n     $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,\n     $                  NMAX, AB, AA, AS, BB, BS, C, CC, CS, CT, G, W )\n            GO TO 190\n*\n  190       IF( FATAL.AND.SFATAL )\n     $         GO TO 210\n         END IF\n  200 CONTINUE\n      WRITE( NOUT, FMT = 9986 )\n      GO TO 230\n*\n  210 CONTINUE\n      WRITE( NOUT, FMT = 9985 )\n      GO TO 230\n*\n  220 CONTINUE\n      WRITE( NOUT, FMT = 9991 )\n*\n  230 CONTINUE\n      IF( TRACE )\n     $   CLOSE ( NTRA )\n      CLOSE ( NOUT )\n      STOP\n*\n 9999 FORMAT( ' ROUTINES PASS COMPUTATIONAL TESTS IF TEST RATIO IS LES',\n     $      'S THAN', F8.2 )\n 9998 FORMAT( ' RELATIVE MACHINE PRECISION IS TAKEN TO BE', 1P, D9.1 )\n 9997 FORMAT( ' NUMBER OF VALUES OF ', A, ' IS LESS THAN 1 OR GREATER ',\n     $      'THAN ', I2 )\n 9996 FORMAT( ' VALUE OF N IS LESS THAN 0 OR GREATER THAN ', I2 )\n 9995 FORMAT( ' TESTS OF THE COMPLEX*16       LEVEL 3 BLAS', //' THE F',\n     $      'OLLOWING PARAMETER VALUES WILL BE USED:' )\n 9994 FORMAT( '   FOR N              ', 9I6 )\n 9993 FORMAT( '   FOR ALPHA          ',\n     $      7( '(', F4.1, ',', F4.1, ')  ', : ) )\n 9992 FORMAT( '   FOR BETA           ',\n     $      7( '(', F4.1, ',', F4.1, ')  ', : ) )\n 9991 FORMAT( ' AMEND DATA FILE OR INCREASE ARRAY SIZES IN PROGRAM',\n     $      /' ******* TESTS ABANDONED *******' )\n 9990 FORMAT( ' SUBPROGRAM NAME ', A6, ' NOT RECOGNIZED', /' ******* T',\n     $      'ESTS ABANDONED *******' )\n 9989 FORMAT( ' ERROR IN ZMMCH -  IN-LINE DOT PRODUCTS ARE BEING EVALU',\n     $      'ATED WRONGLY.', /' ZMMCH WAS CALLED WITH TRANSA = ', A1,\n     $      ' AND TRANSB = ', A1, /' AND RETURNED SAME = ', L1, ' AND ',\n     $      'ERR = ', F12.3, '.', /' THIS MAY BE DUE TO FAULTS IN THE ',\n     $      'ARITHMETIC OR THE COMPILER.', /' ******* TESTS ABANDONED ',\n     $      '*******' )\n 9988 FORMAT( A6, L2 )\n 9987 FORMAT( 1X, A6, ' WAS NOT TESTED' )\n 9986 FORMAT( /' END OF TESTS' )\n 9985 FORMAT( /' ******* FATAL ERROR - TESTS ABANDONED *******' )\n 9984 FORMAT( ' ERROR-EXITS WILL NOT BE TESTED' )\n*\n*     End of ZBLAT3.\n*\n      END\n      SUBROUTINE ZCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX,\n     $                  A, AA, AS, B, BB, BS, C, CC, CS, CT, G )\n*\n*  Tests ZGEMM.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Parameters ..\n      COMPLEX*16         ZERO\n      PARAMETER          ( ZERO = ( 0.0D0, 0.0D0 ) )\n      DOUBLE PRECISION   RZERO\n      PARAMETER          ( RZERO = 0.0D0 )\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION   EPS, THRESH\n      INTEGER            NALF, NBET, NIDIM, NMAX, NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      COMPLEX*16         A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),\n     $                   AS( NMAX*NMAX ), B( NMAX, NMAX ),\n     $                   BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ),\n     $                   C( NMAX, NMAX ), CC( NMAX*NMAX ),\n     $                   CS( NMAX*NMAX ), CT( NMAX )\n      DOUBLE PRECISION   G( NMAX )\n      INTEGER            IDIM( NIDIM )\n*     .. Local Scalars ..\n      COMPLEX*16         ALPHA, ALS, BETA, BLS\n      DOUBLE PRECISION   ERR, ERRMAX\n      INTEGER            I, IA, IB, ICA, ICB, IK, IM, IN, K, KS, LAA,\n     $                   LBB, LCC, LDA, LDAS, LDB, LDBS, LDC, LDCS, M,\n     $                   MA, MB, MS, N, NA, NARGS, NB, NC, NS\n      LOGICAL            NULL, RESET, SAME, TRANA, TRANB\n      CHARACTER*1        TRANAS, TRANBS, TRANSA, TRANSB\n      CHARACTER*3        ICH\n*     .. Local Arrays ..\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LZE, LZERES\n      EXTERNAL           LZE, LZERES\n*     .. External Subroutines ..\n      EXTERNAL           ZGEMM, ZMAKE, ZMMCH\n*     .. Intrinsic Functions ..\n      INTRINSIC          MAX\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Data statements ..\n      DATA               ICH/'NTC'/\n*     .. Executable Statements ..\n*\n      NARGS = 13\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = RZERO\n*\n      DO 110 IM = 1, NIDIM\n         M = IDIM( IM )\n*\n         DO 100 IN = 1, NIDIM\n            N = IDIM( IN )\n*           Set LDC to 1 more than minimum value if room.\n            LDC = M\n            IF( LDC.LT.NMAX )\n     $         LDC = LDC + 1\n*           Skip tests if not enough room.\n            IF( LDC.GT.NMAX )\n     $         GO TO 100\n            LCC = LDC*N\n            NULL = N.LE.0.OR.M.LE.0\n*\n            DO 90 IK = 1, NIDIM\n               K = IDIM( IK )\n*\n               DO 80 ICA = 1, 3\n                  TRANSA = ICH( ICA: ICA )\n                  TRANA = TRANSA.EQ.'T'.OR.TRANSA.EQ.'C'\n*\n                  IF( TRANA )THEN\n                     MA = K\n                     NA = M\n                  ELSE\n                     MA = M\n                     NA = K\n                  END IF\n*                 Set LDA to 1 more than minimum value if room.\n                  LDA = MA\n                  IF( LDA.LT.NMAX )\n     $               LDA = LDA + 1\n*                 Skip tests if not enough room.\n                  IF( LDA.GT.NMAX )\n     $               GO TO 80\n                  LAA = LDA*NA\n*\n*                 Generate the matrix A.\n*\n                  CALL ZMAKE( 'GE', ' ', ' ', MA, NA, A, NMAX, AA, LDA,\n     $                        RESET, ZERO )\n*\n                  DO 70 ICB = 1, 3\n                     TRANSB = ICH( ICB: ICB )\n                     TRANB = TRANSB.EQ.'T'.OR.TRANSB.EQ.'C'\n*\n                     IF( TRANB )THEN\n                        MB = N\n                        NB = K\n                     ELSE\n                        MB = K\n                        NB = N\n                     END IF\n*                    Set LDB to 1 more than minimum value if room.\n                     LDB = MB\n                     IF( LDB.LT.NMAX )\n     $                  LDB = LDB + 1\n*                    Skip tests if not enough room.\n                     IF( LDB.GT.NMAX )\n     $                  GO TO 70\n                     LBB = LDB*NB\n*\n*                    Generate the matrix B.\n*\n                     CALL ZMAKE( 'GE', ' ', ' ', MB, NB, B, NMAX, BB,\n     $                           LDB, RESET, ZERO )\n*\n                     DO 60 IA = 1, NALF\n                        ALPHA = ALF( IA )\n*\n                        DO 50 IB = 1, NBET\n                           BETA = BET( IB )\n*\n*                          Generate the matrix C.\n*\n                           CALL ZMAKE( 'GE', ' ', ' ', M, N, C, NMAX,\n     $                                 CC, LDC, RESET, ZERO )\n*\n                           NC = NC + 1\n*\n*                          Save every datum before calling the\n*                          subroutine.\n*\n                           TRANAS = TRANSA\n                           TRANBS = TRANSB\n                           MS = M\n                           NS = N\n                           KS = K\n                           ALS = ALPHA\n                           DO 10 I = 1, LAA\n                              AS( I ) = AA( I )\n   10                      CONTINUE\n                           LDAS = LDA\n                           DO 20 I = 1, LBB\n                              BS( I ) = BB( I )\n   20                      CONTINUE\n                           LDBS = LDB\n                           BLS = BETA\n                           DO 30 I = 1, LCC\n                              CS( I ) = CC( I )\n   30                      CONTINUE\n                           LDCS = LDC\n*\n*                          Call the subroutine.\n*\n                           IF( TRACE )\n     $                        WRITE( NTRA, FMT = 9995 )NC, SNAME,\n     $                        TRANSA, TRANSB, M, N, K, ALPHA, LDA, LDB,\n     $                        BETA, LDC\n                           IF( REWI )\n     $                        REWIND NTRA\n                           CALL ZGEMM( TRANSA, TRANSB, M, N, K, ALPHA,\n     $                                 AA, LDA, BB, LDB, BETA, CC, LDC )\n*\n*                          Check if error-exit was taken incorrectly.\n*\n                           IF( .NOT.OK )THEN\n                              WRITE( NOUT, FMT = 9994 )\n                              FATAL = .TRUE.\n                              GO TO 120\n                           END IF\n*\n*                          See what data changed inside subroutines.\n*\n                           ISAME( 1 ) = TRANSA.EQ.TRANAS\n                           ISAME( 2 ) = TRANSB.EQ.TRANBS\n                           ISAME( 3 ) = MS.EQ.M\n                           ISAME( 4 ) = NS.EQ.N\n                           ISAME( 5 ) = KS.EQ.K\n                           ISAME( 6 ) = ALS.EQ.ALPHA\n                           ISAME( 7 ) = LZE( AS, AA, LAA )\n                           ISAME( 8 ) = LDAS.EQ.LDA\n                           ISAME( 9 ) = LZE( BS, BB, LBB )\n                           ISAME( 10 ) = LDBS.EQ.LDB\n                           ISAME( 11 ) = BLS.EQ.BETA\n                           IF( NULL )THEN\n                              ISAME( 12 ) = LZE( CS, CC, LCC )\n                           ELSE\n                              ISAME( 12 ) = LZERES( 'GE', ' ', M, N, CS,\n     $                                      CC, LDC )\n                           END IF\n                           ISAME( 13 ) = LDCS.EQ.LDC\n*\n*                          If data was incorrectly changed, report\n*                          and return.\n*\n                           SAME = .TRUE.\n                           DO 40 I = 1, NARGS\n                              SAME = SAME.AND.ISAME( I )\n                              IF( .NOT.ISAME( I ) )\n     $                           WRITE( NOUT, FMT = 9998 )I\n   40                      CONTINUE\n                           IF( .NOT.SAME )THEN\n                              FATAL = .TRUE.\n                              GO TO 120\n                           END IF\n*\n                           IF( .NOT.NULL )THEN\n*\n*                             Check the result.\n*\n                              CALL ZMMCH( TRANSA, TRANSB, M, N, K,\n     $                                    ALPHA, A, NMAX, B, NMAX, BETA,\n     $                                    C, NMAX, CT, G, CC, LDC, EPS,\n     $                                    ERR, FATAL, NOUT, .TRUE. )\n                              ERRMAX = MAX( ERRMAX, ERR )\n*                             If got really bad answer, report and\n*                             return.\n                              IF( FATAL )\n     $                           GO TO 120\n                           END IF\n*\n   50                   CONTINUE\n*\n   60                CONTINUE\n*\n   70             CONTINUE\n*\n   80          CONTINUE\n*\n   90       CONTINUE\n*\n  100    CONTINUE\n*\n  110 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 130\n*\n  120 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      WRITE( NOUT, FMT = 9995 )NC, SNAME, TRANSA, TRANSB, M, N, K,\n     $   ALPHA, LDA, LDB, BETA, LDC\n*\n  130 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',''', A1, ''',',\n     $      3( I3, ',' ), '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3,\n     $      ',(', F4.1, ',', F4.1, '), C,', I3, ').' )\n 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of ZCHK1.\n*\n      END\n      SUBROUTINE ZCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX,\n     $                  A, AA, AS, B, BB, BS, C, CC, CS, CT, G )\n*\n*  Tests ZHEMM and ZSYMM.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Parameters ..\n      COMPLEX*16         ZERO\n      PARAMETER          ( ZERO = ( 0.0D0, 0.0D0 ) )\n      DOUBLE PRECISION   RZERO\n      PARAMETER          ( RZERO = 0.0D0 )\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION   EPS, THRESH\n      INTEGER            NALF, NBET, NIDIM, NMAX, NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      COMPLEX*16         A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),\n     $                   AS( NMAX*NMAX ), B( NMAX, NMAX ),\n     $                   BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ),\n     $                   C( NMAX, NMAX ), CC( NMAX*NMAX ),\n     $                   CS( NMAX*NMAX ), CT( NMAX )\n      DOUBLE PRECISION   G( NMAX )\n      INTEGER            IDIM( NIDIM )\n*     .. Local Scalars ..\n      COMPLEX*16         ALPHA, ALS, BETA, BLS\n      DOUBLE PRECISION   ERR, ERRMAX\n      INTEGER            I, IA, IB, ICS, ICU, IM, IN, LAA, LBB, LCC,\n     $                   LDA, LDAS, LDB, LDBS, LDC, LDCS, M, MS, N, NA,\n     $                   NARGS, NC, NS\n      LOGICAL            CONJ, LEFT, NULL, RESET, SAME\n      CHARACTER*1        SIDE, SIDES, UPLO, UPLOS\n      CHARACTER*2        ICHS, ICHU\n*     .. Local Arrays ..\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LZE, LZERES\n      EXTERNAL           LZE, LZERES\n*     .. External Subroutines ..\n      EXTERNAL           ZHEMM, ZMAKE, ZMMCH, ZSYMM\n*     .. Intrinsic Functions ..\n      INTRINSIC          MAX\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Data statements ..\n      DATA               ICHS/'LR'/, ICHU/'UL'/\n*     .. Executable Statements ..\n      CONJ = SNAME( 2: 3 ).EQ.'HE'\n*\n      NARGS = 12\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = RZERO\n*\n      DO 100 IM = 1, NIDIM\n         M = IDIM( IM )\n*\n         DO 90 IN = 1, NIDIM\n            N = IDIM( IN )\n*           Set LDC to 1 more than minimum value if room.\n            LDC = M\n            IF( LDC.LT.NMAX )\n     $         LDC = LDC + 1\n*           Skip tests if not enough room.\n            IF( LDC.GT.NMAX )\n     $         GO TO 90\n            LCC = LDC*N\n            NULL = N.LE.0.OR.M.LE.0\n*           Set LDB to 1 more than minimum value if room.\n            LDB = M\n            IF( LDB.LT.NMAX )\n     $         LDB = LDB + 1\n*           Skip tests if not enough room.\n            IF( LDB.GT.NMAX )\n     $         GO TO 90\n            LBB = LDB*N\n*\n*           Generate the matrix B.\n*\n            CALL ZMAKE( 'GE', ' ', ' ', M, N, B, NMAX, BB, LDB, RESET,\n     $                  ZERO )\n*\n            DO 80 ICS = 1, 2\n               SIDE = ICHS( ICS: ICS )\n               LEFT = SIDE.EQ.'L'\n*\n               IF( LEFT )THEN\n                  NA = M\n               ELSE\n                  NA = N\n               END IF\n*              Set LDA to 1 more than minimum value if room.\n               LDA = NA\n               IF( LDA.LT.NMAX )\n     $            LDA = LDA + 1\n*              Skip tests if not enough room.\n               IF( LDA.GT.NMAX )\n     $            GO TO 80\n               LAA = LDA*NA\n*\n               DO 70 ICU = 1, 2\n                  UPLO = ICHU( ICU: ICU )\n*\n*                 Generate the hermitian or symmetric matrix A.\n*\n                  CALL ZMAKE( SNAME( 2: 3 ), UPLO, ' ', NA, NA, A, NMAX,\n     $                        AA, LDA, RESET, ZERO )\n*\n                  DO 60 IA = 1, NALF\n                     ALPHA = ALF( IA )\n*\n                     DO 50 IB = 1, NBET\n                        BETA = BET( IB )\n*\n*                       Generate the matrix C.\n*\n                        CALL ZMAKE( 'GE', ' ', ' ', M, N, C, NMAX, CC,\n     $                              LDC, RESET, ZERO )\n*\n                        NC = NC + 1\n*\n*                       Save every datum before calling the\n*                       subroutine.\n*\n                        SIDES = SIDE\n                        UPLOS = UPLO\n                        MS = M\n                        NS = N\n                        ALS = ALPHA\n                        DO 10 I = 1, LAA\n                           AS( I ) = AA( I )\n   10                   CONTINUE\n                        LDAS = LDA\n                        DO 20 I = 1, LBB\n                           BS( I ) = BB( I )\n   20                   CONTINUE\n                        LDBS = LDB\n                        BLS = BETA\n                        DO 30 I = 1, LCC\n                           CS( I ) = CC( I )\n   30                   CONTINUE\n                        LDCS = LDC\n*\n*                       Call the subroutine.\n*\n                        IF( TRACE )\n     $                     WRITE( NTRA, FMT = 9995 )NC, SNAME, SIDE,\n     $                     UPLO, M, N, ALPHA, LDA, LDB, BETA, LDC\n                        IF( REWI )\n     $                     REWIND NTRA\n                        IF( CONJ )THEN\n                           CALL ZHEMM( SIDE, UPLO, M, N, ALPHA, AA, LDA,\n     $                                 BB, LDB, BETA, CC, LDC )\n                        ELSE\n                           CALL ZSYMM( SIDE, UPLO, M, N, ALPHA, AA, LDA,\n     $                                 BB, LDB, BETA, CC, LDC )\n                        END IF\n*\n*                       Check if error-exit was taken incorrectly.\n*\n                        IF( .NOT.OK )THEN\n                           WRITE( NOUT, FMT = 9994 )\n                           FATAL = .TRUE.\n                           GO TO 110\n                        END IF\n*\n*                       See what data changed inside subroutines.\n*\n                        ISAME( 1 ) = SIDES.EQ.SIDE\n                        ISAME( 2 ) = UPLOS.EQ.UPLO\n                        ISAME( 3 ) = MS.EQ.M\n                        ISAME( 4 ) = NS.EQ.N\n                        ISAME( 5 ) = ALS.EQ.ALPHA\n                        ISAME( 6 ) = LZE( AS, AA, LAA )\n                        ISAME( 7 ) = LDAS.EQ.LDA\n                        ISAME( 8 ) = LZE( BS, BB, LBB )\n                        ISAME( 9 ) = LDBS.EQ.LDB\n                        ISAME( 10 ) = BLS.EQ.BETA\n                        IF( NULL )THEN\n                           ISAME( 11 ) = LZE( CS, CC, LCC )\n                        ELSE\n                           ISAME( 11 ) = LZERES( 'GE', ' ', M, N, CS,\n     $                                   CC, LDC )\n                        END IF\n                        ISAME( 12 ) = LDCS.EQ.LDC\n*\n*                       If data was incorrectly changed, report and\n*                       return.\n*\n                        SAME = .TRUE.\n                        DO 40 I = 1, NARGS\n                           SAME = SAME.AND.ISAME( I )\n                           IF( .NOT.ISAME( I ) )\n     $                        WRITE( NOUT, FMT = 9998 )I\n   40                   CONTINUE\n                        IF( .NOT.SAME )THEN\n                           FATAL = .TRUE.\n                           GO TO 110\n                        END IF\n*\n                        IF( .NOT.NULL )THEN\n*\n*                          Check the result.\n*\n                           IF( LEFT )THEN\n                              CALL ZMMCH( 'N', 'N', M, N, M, ALPHA, A,\n     $                                    NMAX, B, NMAX, BETA, C, NMAX,\n     $                                    CT, G, CC, LDC, EPS, ERR,\n     $                                    FATAL, NOUT, .TRUE. )\n                           ELSE\n                              CALL ZMMCH( 'N', 'N', M, N, N, ALPHA, B,\n     $                                    NMAX, A, NMAX, BETA, C, NMAX,\n     $                                    CT, G, CC, LDC, EPS, ERR,\n     $                                    FATAL, NOUT, .TRUE. )\n                           END IF\n                           ERRMAX = MAX( ERRMAX, ERR )\n*                          If got really bad answer, report and\n*                          return.\n                           IF( FATAL )\n     $                        GO TO 110\n                        END IF\n*\n   50                CONTINUE\n*\n   60             CONTINUE\n*\n   70          CONTINUE\n*\n   80       CONTINUE\n*\n   90    CONTINUE\n*\n  100 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 120\n*\n  110 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      WRITE( NOUT, FMT = 9995 )NC, SNAME, SIDE, UPLO, M, N, ALPHA, LDA,\n     $   LDB, BETA, LDC\n*\n  120 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ),\n     $      '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ',(', F4.1,\n     $      ',', F4.1, '), C,', I3, ')    .' )\n 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of ZCHK2.\n*\n      END\n      SUBROUTINE ZCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NALF, ALF, NMAX, A, AA, AS,\n     $                  B, BB, BS, CT, G, C )\n*\n*  Tests ZTRMM and ZTRSM.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Parameters ..\n      COMPLEX*16         ZERO, ONE\n      PARAMETER          ( ZERO = ( 0.0D0, 0.0D0 ),\n     $                   ONE = ( 1.0D0, 0.0D0 ) )\n      DOUBLE PRECISION   RZERO\n      PARAMETER          ( RZERO = 0.0D0 )\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION   EPS, THRESH\n      INTEGER            NALF, NIDIM, NMAX, NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      COMPLEX*16         A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),\n     $                   AS( NMAX*NMAX ), B( NMAX, NMAX ),\n     $                   BB( NMAX*NMAX ), BS( NMAX*NMAX ),\n     $                   C( NMAX, NMAX ), CT( NMAX )\n      DOUBLE PRECISION   G( NMAX )\n      INTEGER            IDIM( NIDIM )\n*     .. Local Scalars ..\n      COMPLEX*16         ALPHA, ALS\n      DOUBLE PRECISION   ERR, ERRMAX\n      INTEGER            I, IA, ICD, ICS, ICT, ICU, IM, IN, J, LAA, LBB,\n     $                   LDA, LDAS, LDB, LDBS, M, MS, N, NA, NARGS, NC,\n     $                   NS\n      LOGICAL            LEFT, NULL, RESET, SAME\n      CHARACTER*1        DIAG, DIAGS, SIDE, SIDES, TRANAS, TRANSA, UPLO,\n     $                   UPLOS\n      CHARACTER*2        ICHD, ICHS, ICHU\n      CHARACTER*3        ICHT\n*     .. Local Arrays ..\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LZE, LZERES\n      EXTERNAL           LZE, LZERES\n*     .. External Subroutines ..\n      EXTERNAL           ZMAKE, ZMMCH, ZTRMM, ZTRSM\n*     .. Intrinsic Functions ..\n      INTRINSIC          MAX\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Data statements ..\n      DATA               ICHU/'UL'/, ICHT/'NTC'/, ICHD/'UN'/, ICHS/'LR'/\n*     .. Executable Statements ..\n*\n      NARGS = 11\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = RZERO\n*     Set up zero matrix for ZMMCH.\n      DO 20 J = 1, NMAX\n         DO 10 I = 1, NMAX\n            C( I, J ) = ZERO\n   10    CONTINUE\n   20 CONTINUE\n*\n      DO 140 IM = 1, NIDIM\n         M = IDIM( IM )\n*\n         DO 130 IN = 1, NIDIM\n            N = IDIM( IN )\n*           Set LDB to 1 more than minimum value if room.\n            LDB = M\n            IF( LDB.LT.NMAX )\n     $         LDB = LDB + 1\n*           Skip tests if not enough room.\n            IF( LDB.GT.NMAX )\n     $         GO TO 130\n            LBB = LDB*N\n            NULL = M.LE.0.OR.N.LE.0\n*\n            DO 120 ICS = 1, 2\n               SIDE = ICHS( ICS: ICS )\n               LEFT = SIDE.EQ.'L'\n               IF( LEFT )THEN\n                  NA = M\n               ELSE\n                  NA = N\n               END IF\n*              Set LDA to 1 more than minimum value if room.\n               LDA = NA\n               IF( LDA.LT.NMAX )\n     $            LDA = LDA + 1\n*              Skip tests if not enough room.\n               IF( LDA.GT.NMAX )\n     $            GO TO 130\n               LAA = LDA*NA\n*\n               DO 110 ICU = 1, 2\n                  UPLO = ICHU( ICU: ICU )\n*\n                  DO 100 ICT = 1, 3\n                     TRANSA = ICHT( ICT: ICT )\n*\n                     DO 90 ICD = 1, 2\n                        DIAG = ICHD( ICD: ICD )\n*\n                        DO 80 IA = 1, NALF\n                           ALPHA = ALF( IA )\n*\n*                          Generate the matrix A.\n*\n                           CALL ZMAKE( 'TR', UPLO, DIAG, NA, NA, A,\n     $                                 NMAX, AA, LDA, RESET, ZERO )\n*\n*                          Generate the matrix B.\n*\n                           CALL ZMAKE( 'GE', ' ', ' ', M, N, B, NMAX,\n     $                                 BB, LDB, RESET, ZERO )\n*\n                           NC = NC + 1\n*\n*                          Save every datum before calling the\n*                          subroutine.\n*\n                           SIDES = SIDE\n                           UPLOS = UPLO\n                           TRANAS = TRANSA\n                           DIAGS = DIAG\n                           MS = M\n                           NS = N\n                           ALS = ALPHA\n                           DO 30 I = 1, LAA\n                              AS( I ) = AA( I )\n   30                      CONTINUE\n                           LDAS = LDA\n                           DO 40 I = 1, LBB\n                              BS( I ) = BB( I )\n   40                      CONTINUE\n                           LDBS = LDB\n*\n*                          Call the subroutine.\n*\n                           IF( SNAME( 4: 5 ).EQ.'MM' )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9995 )NC, SNAME,\n     $                           SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA,\n     $                           LDA, LDB\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL ZTRMM( SIDE, UPLO, TRANSA, DIAG, M,\n     $                                    N, ALPHA, AA, LDA, BB, LDB )\n                           ELSE IF( SNAME( 4: 5 ).EQ.'SM' )THEN\n                              IF( TRACE )\n     $                           WRITE( NTRA, FMT = 9995 )NC, SNAME,\n     $                           SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA,\n     $                           LDA, LDB\n                              IF( REWI )\n     $                           REWIND NTRA\n                              CALL ZTRSM( SIDE, UPLO, TRANSA, DIAG, M,\n     $                                    N, ALPHA, AA, LDA, BB, LDB )\n                           END IF\n*\n*                          Check if error-exit was taken incorrectly.\n*\n                           IF( .NOT.OK )THEN\n                              WRITE( NOUT, FMT = 9994 )\n                              FATAL = .TRUE.\n                              GO TO 150\n                           END IF\n*\n*                          See what data changed inside subroutines.\n*\n                           ISAME( 1 ) = SIDES.EQ.SIDE\n                           ISAME( 2 ) = UPLOS.EQ.UPLO\n                           ISAME( 3 ) = TRANAS.EQ.TRANSA\n                           ISAME( 4 ) = DIAGS.EQ.DIAG\n                           ISAME( 5 ) = MS.EQ.M\n                           ISAME( 6 ) = NS.EQ.N\n                           ISAME( 7 ) = ALS.EQ.ALPHA\n                           ISAME( 8 ) = LZE( AS, AA, LAA )\n                           ISAME( 9 ) = LDAS.EQ.LDA\n                           IF( NULL )THEN\n                              ISAME( 10 ) = LZE( BS, BB, LBB )\n                           ELSE\n                              ISAME( 10 ) = LZERES( 'GE', ' ', M, N, BS,\n     $                                      BB, LDB )\n                           END IF\n                           ISAME( 11 ) = LDBS.EQ.LDB\n*\n*                          If data was incorrectly changed, report and\n*                          return.\n*\n                           SAME = .TRUE.\n                           DO 50 I = 1, NARGS\n                              SAME = SAME.AND.ISAME( I )\n                              IF( .NOT.ISAME( I ) )\n     $                           WRITE( NOUT, FMT = 9998 )I\n   50                      CONTINUE\n                           IF( .NOT.SAME )THEN\n                              FATAL = .TRUE.\n                              GO TO 150\n                           END IF\n*\n                           IF( .NOT.NULL )THEN\n                              IF( SNAME( 4: 5 ).EQ.'MM' )THEN\n*\n*                                Check the result.\n*\n                                 IF( LEFT )THEN\n                                    CALL ZMMCH( TRANSA, 'N', M, N, M,\n     $                                          ALPHA, A, NMAX, B, NMAX,\n     $                                          ZERO, C, NMAX, CT, G,\n     $                                          BB, LDB, EPS, ERR,\n     $                                          FATAL, NOUT, .TRUE. )\n                                 ELSE\n                                    CALL ZMMCH( 'N', TRANSA, M, N, N,\n     $                                          ALPHA, B, NMAX, A, NMAX,\n     $                                          ZERO, C, NMAX, CT, G,\n     $                                          BB, LDB, EPS, ERR,\n     $                                          FATAL, NOUT, .TRUE. )\n                                 END IF\n                              ELSE IF( SNAME( 4: 5 ).EQ.'SM' )THEN\n*\n*                                Compute approximation to original\n*                                matrix.\n*\n                                 DO 70 J = 1, N\n                                    DO 60 I = 1, M\n                                       C( I, J ) = BB( I + ( J - 1 )*\n     $                                             LDB )\n                                       BB( I + ( J - 1 )*LDB ) = ALPHA*\n     $                                    B( I, J )\n   60                               CONTINUE\n   70                            CONTINUE\n*\n                                 IF( LEFT )THEN\n                                    CALL ZMMCH( TRANSA, 'N', M, N, M,\n     $                                          ONE, A, NMAX, C, NMAX,\n     $                                          ZERO, B, NMAX, CT, G,\n     $                                          BB, LDB, EPS, ERR,\n     $                                          FATAL, NOUT, .FALSE. )\n                                 ELSE\n                                    CALL ZMMCH( 'N', TRANSA, M, N, N,\n     $                                          ONE, C, NMAX, A, NMAX,\n     $                                          ZERO, B, NMAX, CT, G,\n     $                                          BB, LDB, EPS, ERR,\n     $                                          FATAL, NOUT, .FALSE. )\n                                 END IF\n                              END IF\n                              ERRMAX = MAX( ERRMAX, ERR )\n*                             If got really bad answer, report and\n*                             return.\n                              IF( FATAL )\n     $                           GO TO 150\n                           END IF\n*\n   80                   CONTINUE\n*\n   90                CONTINUE\n*\n  100             CONTINUE\n*\n  110          CONTINUE\n*\n  120       CONTINUE\n*\n  130    CONTINUE\n*\n  140 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 160\n*\n  150 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      WRITE( NOUT, FMT = 9995 )NC, SNAME, SIDE, UPLO, TRANSA, DIAG, M,\n     $   N, ALPHA, LDA, LDB\n*\n  160 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( 1X, I6, ': ', A6, '(', 4( '''', A1, ''',' ), 2( I3, ',' ),\n     $      '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ')         ',\n     $      '      .' )\n 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of ZCHK3.\n*\n      END\n      SUBROUTINE ZCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX,\n     $                  A, AA, AS, B, BB, BS, C, CC, CS, CT, G )\n*\n*  Tests ZHERK and ZSYRK.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Parameters ..\n      COMPLEX*16         ZERO\n      PARAMETER          ( ZERO = ( 0.0D0, 0.0D0 ) )\n      DOUBLE PRECISION   RONE, RZERO\n      PARAMETER          ( RONE = 1.0D0, RZERO = 0.0D0 )\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION   EPS, THRESH\n      INTEGER            NALF, NBET, NIDIM, NMAX, NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      COMPLEX*16         A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),\n     $                   AS( NMAX*NMAX ), B( NMAX, NMAX ),\n     $                   BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ),\n     $                   C( NMAX, NMAX ), CC( NMAX*NMAX ),\n     $                   CS( NMAX*NMAX ), CT( NMAX )\n      DOUBLE PRECISION   G( NMAX )\n      INTEGER            IDIM( NIDIM )\n*     .. Local Scalars ..\n      COMPLEX*16         ALPHA, ALS, BETA, BETS\n      DOUBLE PRECISION   ERR, ERRMAX, RALPHA, RALS, RBETA, RBETS\n      INTEGER            I, IA, IB, ICT, ICU, IK, IN, J, JC, JJ, K, KS,\n     $                   LAA, LCC, LDA, LDAS, LDC, LDCS, LJ, MA, N, NA,\n     $                   NARGS, NC, NS\n      LOGICAL            CONJ, NULL, RESET, SAME, TRAN, UPPER\n      CHARACTER*1        TRANS, TRANSS, TRANST, UPLO, UPLOS\n      CHARACTER*2        ICHT, ICHU\n*     .. Local Arrays ..\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LZE, LZERES\n      EXTERNAL           LZE, LZERES\n*     .. External Subroutines ..\n      EXTERNAL           ZHERK, ZMAKE, ZMMCH, ZSYRK\n*     .. Intrinsic Functions ..\n      INTRINSIC          DCMPLX, MAX, DBLE\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Data statements ..\n      DATA               ICHT/'NC'/, ICHU/'UL'/\n*     .. Executable Statements ..\n      CONJ = SNAME( 2: 3 ).EQ.'HE'\n*\n      NARGS = 10\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = RZERO\n*\n      DO 100 IN = 1, NIDIM\n         N = IDIM( IN )\n*        Set LDC to 1 more than minimum value if room.\n         LDC = N\n         IF( LDC.LT.NMAX )\n     $      LDC = LDC + 1\n*        Skip tests if not enough room.\n         IF( LDC.GT.NMAX )\n     $      GO TO 100\n         LCC = LDC*N\n*\n         DO 90 IK = 1, NIDIM\n            K = IDIM( IK )\n*\n            DO 80 ICT = 1, 2\n               TRANS = ICHT( ICT: ICT )\n               TRAN = TRANS.EQ.'C'\n               IF( TRAN.AND..NOT.CONJ )\n     $            TRANS = 'T'\n               IF( TRAN )THEN\n                  MA = K\n                  NA = N\n               ELSE\n                  MA = N\n                  NA = K\n               END IF\n*              Set LDA to 1 more than minimum value if room.\n               LDA = MA\n               IF( LDA.LT.NMAX )\n     $            LDA = LDA + 1\n*              Skip tests if not enough room.\n               IF( LDA.GT.NMAX )\n     $            GO TO 80\n               LAA = LDA*NA\n*\n*              Generate the matrix A.\n*\n               CALL ZMAKE( 'GE', ' ', ' ', MA, NA, A, NMAX, AA, LDA,\n     $                     RESET, ZERO )\n*\n               DO 70 ICU = 1, 2\n                  UPLO = ICHU( ICU: ICU )\n                  UPPER = UPLO.EQ.'U'\n*\n                  DO 60 IA = 1, NALF\n                     ALPHA = ALF( IA )\n                     IF( CONJ )THEN\n                        RALPHA = DBLE( ALPHA )\n                        ALPHA = DCMPLX( RALPHA, RZERO )\n                     END IF\n*\n                     DO 50 IB = 1, NBET\n                        BETA = BET( IB )\n                        IF( CONJ )THEN\n                           RBETA = DBLE( BETA )\n                           BETA = DCMPLX( RBETA, RZERO )\n                        END IF\n                        NULL = N.LE.0\n                        IF( CONJ )\n     $                     NULL = NULL.OR.( ( K.LE.0.OR.RALPHA.EQ.\n     $                            RZERO ).AND.RBETA.EQ.RONE )\n*\n*                       Generate the matrix C.\n*\n                        CALL ZMAKE( SNAME( 2: 3 ), UPLO, ' ', N, N, C,\n     $                              NMAX, CC, LDC, RESET, ZERO )\n*\n                        NC = NC + 1\n*\n*                       Save every datum before calling the subroutine.\n*\n                        UPLOS = UPLO\n                        TRANSS = TRANS\n                        NS = N\n                        KS = K\n                        IF( CONJ )THEN\n                           RALS = RALPHA\n                        ELSE\n                           ALS = ALPHA\n                        END IF\n                        DO 10 I = 1, LAA\n                           AS( I ) = AA( I )\n   10                   CONTINUE\n                        LDAS = LDA\n                        IF( CONJ )THEN\n                           RBETS = RBETA\n                        ELSE\n                           BETS = BETA\n                        END IF\n                        DO 20 I = 1, LCC\n                           CS( I ) = CC( I )\n   20                   CONTINUE\n                        LDCS = LDC\n*\n*                       Call the subroutine.\n*\n                        IF( CONJ )THEN\n                           IF( TRACE )\n     $                        WRITE( NTRA, FMT = 9994 )NC, SNAME, UPLO,\n     $                        TRANS, N, K, RALPHA, LDA, RBETA, LDC\n                           IF( REWI )\n     $                        REWIND NTRA\n                           CALL ZHERK( UPLO, TRANS, N, K, RALPHA, AA,\n     $                                 LDA, RBETA, CC, LDC )\n                        ELSE\n                           IF( TRACE )\n     $                        WRITE( NTRA, FMT = 9993 )NC, SNAME, UPLO,\n     $                        TRANS, N, K, ALPHA, LDA, BETA, LDC\n                           IF( REWI )\n     $                        REWIND NTRA\n                           CALL ZSYRK( UPLO, TRANS, N, K, ALPHA, AA,\n     $                                 LDA, BETA, CC, LDC )\n                        END IF\n*\n*                       Check if error-exit was taken incorrectly.\n*\n                        IF( .NOT.OK )THEN\n                           WRITE( NOUT, FMT = 9992 )\n                           FATAL = .TRUE.\n                           GO TO 120\n                        END IF\n*\n*                       See what data changed inside subroutines.\n*\n                        ISAME( 1 ) = UPLOS.EQ.UPLO\n                        ISAME( 2 ) = TRANSS.EQ.TRANS\n                        ISAME( 3 ) = NS.EQ.N\n                        ISAME( 4 ) = KS.EQ.K\n                        IF( CONJ )THEN\n                           ISAME( 5 ) = RALS.EQ.RALPHA\n                        ELSE\n                           ISAME( 5 ) = ALS.EQ.ALPHA\n                        END IF\n                        ISAME( 6 ) = LZE( AS, AA, LAA )\n                        ISAME( 7 ) = LDAS.EQ.LDA\n                        IF( CONJ )THEN\n                           ISAME( 8 ) = RBETS.EQ.RBETA\n                        ELSE\n                           ISAME( 8 ) = BETS.EQ.BETA\n                        END IF\n                        IF( NULL )THEN\n                           ISAME( 9 ) = LZE( CS, CC, LCC )\n                        ELSE\n                           ISAME( 9 ) = LZERES( SNAME( 2: 3 ), UPLO, N,\n     $                                  N, CS, CC, LDC )\n                        END IF\n                        ISAME( 10 ) = LDCS.EQ.LDC\n*\n*                       If data was incorrectly changed, report and\n*                       return.\n*\n                        SAME = .TRUE.\n                        DO 30 I = 1, NARGS\n                           SAME = SAME.AND.ISAME( I )\n                           IF( .NOT.ISAME( I ) )\n     $                        WRITE( NOUT, FMT = 9998 )I\n   30                   CONTINUE\n                        IF( .NOT.SAME )THEN\n                           FATAL = .TRUE.\n                           GO TO 120\n                        END IF\n*\n                        IF( .NOT.NULL )THEN\n*\n*                          Check the result column by column.\n*\n                           IF( CONJ )THEN\n                              TRANST = 'C'\n                           ELSE\n                              TRANST = 'T'\n                           END IF\n                           JC = 1\n                           DO 40 J = 1, N\n                              IF( UPPER )THEN\n                                 JJ = 1\n                                 LJ = J\n                              ELSE\n                                 JJ = J\n                                 LJ = N - J + 1\n                              END IF\n                              IF( TRAN )THEN\n                                 CALL ZMMCH( TRANST, 'N', LJ, 1, K,\n     $                                       ALPHA, A( 1, JJ ), NMAX,\n     $                                       A( 1, J ), NMAX, BETA,\n     $                                       C( JJ, J ), NMAX, CT, G,\n     $                                       CC( JC ), LDC, EPS, ERR,\n     $                                       FATAL, NOUT, .TRUE. )\n                              ELSE\n                                 CALL ZMMCH( 'N', TRANST, LJ, 1, K,\n     $                                       ALPHA, A( JJ, 1 ), NMAX,\n     $                                       A( J, 1 ), NMAX, BETA,\n     $                                       C( JJ, J ), NMAX, CT, G,\n     $                                       CC( JC ), LDC, EPS, ERR,\n     $                                       FATAL, NOUT, .TRUE. )\n                              END IF\n                              IF( UPPER )THEN\n                                 JC = JC + LDC\n                              ELSE\n                                 JC = JC + LDC + 1\n                              END IF\n                              ERRMAX = MAX( ERRMAX, ERR )\n*                             If got really bad answer, report and\n*                             return.\n                              IF( FATAL )\n     $                           GO TO 110\n   40                      CONTINUE\n                        END IF\n*\n   50                CONTINUE\n*\n   60             CONTINUE\n*\n   70          CONTINUE\n*\n   80       CONTINUE\n*\n   90    CONTINUE\n*\n  100 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 130\n*\n  110 CONTINUE\n      IF( N.GT.1 )\n     $   WRITE( NOUT, FMT = 9995 )J\n*\n  120 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      IF( CONJ )THEN\n         WRITE( NOUT, FMT = 9994 )NC, SNAME, UPLO, TRANS, N, K, RALPHA,\n     $      LDA, RBETA, LDC\n      ELSE\n         WRITE( NOUT, FMT = 9993 )NC, SNAME, UPLO, TRANS, N, K, ALPHA,\n     $      LDA, BETA, LDC\n      END IF\n*\n  130 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( '      THESE ARE THE RESULTS FOR COLUMN ', I3 )\n 9994 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ),\n     $      F4.1, ', A,', I3, ',', F4.1, ', C,', I3, ')               ',\n     $      '          .' )\n 9993 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ),\n     $      '(', F4.1, ',', F4.1, ') , A,', I3, ',(', F4.1, ',', F4.1,\n     $      '), C,', I3, ')          .' )\n 9992 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of ZCHK4.\n*\n      END\n      SUBROUTINE ZCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,\n     $                  FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX,\n     $                  AB, AA, AS, BB, BS, C, CC, CS, CT, G, W )\n*\n*  Tests ZHER2K and ZSYR2K.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Parameters ..\n      COMPLEX*16         ZERO, ONE\n      PARAMETER          ( ZERO = ( 0.0D0, 0.0D0 ),\n     $                   ONE = ( 1.0D0, 0.0D0 ) )\n      DOUBLE PRECISION   RONE, RZERO\n      PARAMETER          ( RONE = 1.0D0, RZERO = 0.0D0 )\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION   EPS, THRESH\n      INTEGER            NALF, NBET, NIDIM, NMAX, NOUT, NTRA\n      LOGICAL            FATAL, REWI, TRACE\n      CHARACTER*6        SNAME\n*     .. Array Arguments ..\n      COMPLEX*16         AA( NMAX*NMAX ), AB( 2*NMAX*NMAX ),\n     $                   ALF( NALF ), AS( NMAX*NMAX ), BB( NMAX*NMAX ),\n     $                   BET( NBET ), BS( NMAX*NMAX ), C( NMAX, NMAX ),\n     $                   CC( NMAX*NMAX ), CS( NMAX*NMAX ), CT( NMAX ),\n     $                   W( 2*NMAX )\n      DOUBLE PRECISION   G( NMAX )\n      INTEGER            IDIM( NIDIM )\n*     .. Local Scalars ..\n      COMPLEX*16         ALPHA, ALS, BETA, BETS\n      DOUBLE PRECISION   ERR, ERRMAX, RBETA, RBETS\n      INTEGER            I, IA, IB, ICT, ICU, IK, IN, J, JC, JJ, JJAB,\n     $                   K, KS, LAA, LBB, LCC, LDA, LDAS, LDB, LDBS,\n     $                   LDC, LDCS, LJ, MA, N, NA, NARGS, NC, NS\n      LOGICAL            CONJ, NULL, RESET, SAME, TRAN, UPPER\n      CHARACTER*1        TRANS, TRANSS, TRANST, UPLO, UPLOS\n      CHARACTER*2        ICHT, ICHU\n*     .. Local Arrays ..\n      LOGICAL            ISAME( 13 )\n*     .. External Functions ..\n      LOGICAL            LZE, LZERES\n      EXTERNAL           LZE, LZERES\n*     .. External Subroutines ..\n      EXTERNAL           ZHER2K, ZMAKE, ZMMCH, ZSYR2K\n*     .. Intrinsic Functions ..\n      INTRINSIC          DCMPLX, DCONJG, MAX, DBLE\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Data statements ..\n      DATA               ICHT/'NC'/, ICHU/'UL'/\n*     .. Executable Statements ..\n      CONJ = SNAME( 2: 3 ).EQ.'HE'\n*\n      NARGS = 12\n      NC = 0\n      RESET = .TRUE.\n      ERRMAX = RZERO\n*\n      DO 130 IN = 1, NIDIM\n         N = IDIM( IN )\n*        Set LDC to 1 more than minimum value if room.\n         LDC = N\n         IF( LDC.LT.NMAX )\n     $      LDC = LDC + 1\n*        Skip tests if not enough room.\n         IF( LDC.GT.NMAX )\n     $      GO TO 130\n         LCC = LDC*N\n*\n         DO 120 IK = 1, NIDIM\n            K = IDIM( IK )\n*\n            DO 110 ICT = 1, 2\n               TRANS = ICHT( ICT: ICT )\n               TRAN = TRANS.EQ.'C'\n               IF( TRAN.AND..NOT.CONJ )\n     $            TRANS = 'T'\n               IF( TRAN )THEN\n                  MA = K\n                  NA = N\n               ELSE\n                  MA = N\n                  NA = K\n               END IF\n*              Set LDA to 1 more than minimum value if room.\n               LDA = MA\n               IF( LDA.LT.NMAX )\n     $            LDA = LDA + 1\n*              Skip tests if not enough room.\n               IF( LDA.GT.NMAX )\n     $            GO TO 110\n               LAA = LDA*NA\n*\n*              Generate the matrix A.\n*\n               IF( TRAN )THEN\n                  CALL ZMAKE( 'GE', ' ', ' ', MA, NA, AB, 2*NMAX, AA,\n     $                        LDA, RESET, ZERO )\n               ELSE\n                  CALL ZMAKE( 'GE', ' ', ' ', MA, NA, AB, NMAX, AA, LDA,\n     $                        RESET, ZERO )\n               END IF\n*\n*              Generate the matrix B.\n*\n               LDB = LDA\n               LBB = LAA\n               IF( TRAN )THEN\n                  CALL ZMAKE( 'GE', ' ', ' ', MA, NA, AB( K + 1 ),\n     $                        2*NMAX, BB, LDB, RESET, ZERO )\n               ELSE\n                  CALL ZMAKE( 'GE', ' ', ' ', MA, NA, AB( K*NMAX + 1 ),\n     $                        NMAX, BB, LDB, RESET, ZERO )\n               END IF\n*\n               DO 100 ICU = 1, 2\n                  UPLO = ICHU( ICU: ICU )\n                  UPPER = UPLO.EQ.'U'\n*\n                  DO 90 IA = 1, NALF\n                     ALPHA = ALF( IA )\n*\n                     DO 80 IB = 1, NBET\n                        BETA = BET( IB )\n                        IF( CONJ )THEN\n                           RBETA = DBLE( BETA )\n                           BETA = DCMPLX( RBETA, RZERO )\n                        END IF\n                        NULL = N.LE.0\n                        IF( CONJ )\n     $                     NULL = NULL.OR.( ( K.LE.0.OR.ALPHA.EQ.\n     $                            ZERO ).AND.RBETA.EQ.RONE )\n*\n*                       Generate the matrix C.\n*\n                        CALL ZMAKE( SNAME( 2: 3 ), UPLO, ' ', N, N, C,\n     $                              NMAX, CC, LDC, RESET, ZERO )\n*\n                        NC = NC + 1\n*\n*                       Save every datum before calling the subroutine.\n*\n                        UPLOS = UPLO\n                        TRANSS = TRANS\n                        NS = N\n                        KS = K\n                        ALS = ALPHA\n                        DO 10 I = 1, LAA\n                           AS( I ) = AA( I )\n   10                   CONTINUE\n                        LDAS = LDA\n                        DO 20 I = 1, LBB\n                           BS( I ) = BB( I )\n   20                   CONTINUE\n                        LDBS = LDB\n                        IF( CONJ )THEN\n                           RBETS = RBETA\n                        ELSE\n                           BETS = BETA\n                        END IF\n                        DO 30 I = 1, LCC\n                           CS( I ) = CC( I )\n   30                   CONTINUE\n                        LDCS = LDC\n*\n*                       Call the subroutine.\n*\n                        IF( CONJ )THEN\n                           IF( TRACE )\n     $                        WRITE( NTRA, FMT = 9994 )NC, SNAME, UPLO,\n     $                        TRANS, N, K, ALPHA, LDA, LDB, RBETA, LDC\n                           IF( REWI )\n     $                        REWIND NTRA\n                           CALL ZHER2K( UPLO, TRANS, N, K, ALPHA, AA,\n     $                                  LDA, BB, LDB, RBETA, CC, LDC )\n                        ELSE\n                           IF( TRACE )\n     $                        WRITE( NTRA, FMT = 9993 )NC, SNAME, UPLO,\n     $                        TRANS, N, K, ALPHA, LDA, LDB, BETA, LDC\n                           IF( REWI )\n     $                        REWIND NTRA\n                           CALL ZSYR2K( UPLO, TRANS, N, K, ALPHA, AA,\n     $                                  LDA, BB, LDB, BETA, CC, LDC )\n                        END IF\n*\n*                       Check if error-exit was taken incorrectly.\n*\n                        IF( .NOT.OK )THEN\n                           WRITE( NOUT, FMT = 9992 )\n                           FATAL = .TRUE.\n                           GO TO 150\n                        END IF\n*\n*                       See what data changed inside subroutines.\n*\n                        ISAME( 1 ) = UPLOS.EQ.UPLO\n                        ISAME( 2 ) = TRANSS.EQ.TRANS\n                        ISAME( 3 ) = NS.EQ.N\n                        ISAME( 4 ) = KS.EQ.K\n                        ISAME( 5 ) = ALS.EQ.ALPHA\n                        ISAME( 6 ) = LZE( AS, AA, LAA )\n                        ISAME( 7 ) = LDAS.EQ.LDA\n                        ISAME( 8 ) = LZE( BS, BB, LBB )\n                        ISAME( 9 ) = LDBS.EQ.LDB\n                        IF( CONJ )THEN\n                           ISAME( 10 ) = RBETS.EQ.RBETA\n                        ELSE\n                           ISAME( 10 ) = BETS.EQ.BETA\n                        END IF\n                        IF( NULL )THEN\n                           ISAME( 11 ) = LZE( CS, CC, LCC )\n                        ELSE\n                           ISAME( 11 ) = LZERES( 'HE', UPLO, N, N, CS,\n     $                                   CC, LDC )\n                        END IF\n                        ISAME( 12 ) = LDCS.EQ.LDC\n*\n*                       If data was incorrectly changed, report and\n*                       return.\n*\n                        SAME = .TRUE.\n                        DO 40 I = 1, NARGS\n                           SAME = SAME.AND.ISAME( I )\n                           IF( .NOT.ISAME( I ) )\n     $                        WRITE( NOUT, FMT = 9998 )I\n   40                   CONTINUE\n                        IF( .NOT.SAME )THEN\n                           FATAL = .TRUE.\n                           GO TO 150\n                        END IF\n*\n                        IF( .NOT.NULL )THEN\n*\n*                          Check the result column by column.\n*\n                           IF( CONJ )THEN\n                              TRANST = 'C'\n                           ELSE\n                              TRANST = 'T'\n                           END IF\n                           JJAB = 1\n                           JC = 1\n                           DO 70 J = 1, N\n                              IF( UPPER )THEN\n                                 JJ = 1\n                                 LJ = J\n                              ELSE\n                                 JJ = J\n                                 LJ = N - J + 1\n                              END IF\n                              IF( TRAN )THEN\n                                 DO 50 I = 1, K\n                                    W( I ) = ALPHA*AB( ( J - 1 )*2*\n     $                                       NMAX + K + I )\n                                    IF( CONJ )THEN\n                                       W( K + I ) = DCONJG( ALPHA )*\n     $                                              AB( ( J - 1 )*2*\n     $                                              NMAX + I )\n                                    ELSE\n                                       W( K + I ) = ALPHA*\n     $                                              AB( ( J - 1 )*2*\n     $                                              NMAX + I )\n                                    END IF\n   50                            CONTINUE\n                                 CALL ZMMCH( TRANST, 'N', LJ, 1, 2*K,\n     $                                       ONE, AB( JJAB ), 2*NMAX, W,\n     $                                       2*NMAX, BETA, C( JJ, J ),\n     $                                       NMAX, CT, G, CC( JC ), LDC,\n     $                                       EPS, ERR, FATAL, NOUT,\n     $                                       .TRUE. )\n                              ELSE\n                                 DO 60 I = 1, K\n                                    IF( CONJ )THEN\n                                       W( I ) = ALPHA*DCONJG( AB( ( K +\n     $                                          I - 1 )*NMAX + J ) )\n                                       W( K + I ) = DCONJG( ALPHA*\n     $                                              AB( ( I - 1 )*NMAX +\n     $                                              J ) )\n                                    ELSE\n                                       W( I ) = ALPHA*AB( ( K + I - 1 )*\n     $                                          NMAX + J )\n                                       W( K + I ) = ALPHA*\n     $                                              AB( ( I - 1 )*NMAX +\n     $                                              J )\n                                    END IF\n   60                            CONTINUE\n                                 CALL ZMMCH( 'N', 'N', LJ, 1, 2*K, ONE,\n     $                                       AB( JJ ), NMAX, W, 2*NMAX,\n     $                                       BETA, C( JJ, J ), NMAX, CT,\n     $                                       G, CC( JC ), LDC, EPS, ERR,\n     $                                       FATAL, NOUT, .TRUE. )\n                              END IF\n                              IF( UPPER )THEN\n                                 JC = JC + LDC\n                              ELSE\n                                 JC = JC + LDC + 1\n                                 IF( TRAN )\n     $                              JJAB = JJAB + 2*NMAX\n                              END IF\n                              ERRMAX = MAX( ERRMAX, ERR )\n*                             If got really bad answer, report and\n*                             return.\n                              IF( FATAL )\n     $                           GO TO 140\n   70                      CONTINUE\n                        END IF\n*\n   80                CONTINUE\n*\n   90             CONTINUE\n*\n  100          CONTINUE\n*\n  110       CONTINUE\n*\n  120    CONTINUE\n*\n  130 CONTINUE\n*\n*     Report result.\n*\n      IF( ERRMAX.LT.THRESH )THEN\n         WRITE( NOUT, FMT = 9999 )SNAME, NC\n      ELSE\n         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX\n      END IF\n      GO TO 160\n*\n  140 CONTINUE\n      IF( N.GT.1 )\n     $   WRITE( NOUT, FMT = 9995 )J\n*\n  150 CONTINUE\n      WRITE( NOUT, FMT = 9996 )SNAME\n      IF( CONJ )THEN\n         WRITE( NOUT, FMT = 9994 )NC, SNAME, UPLO, TRANS, N, K, ALPHA,\n     $      LDA, LDB, RBETA, LDC\n      ELSE\n         WRITE( NOUT, FMT = 9993 )NC, SNAME, UPLO, TRANS, N, K, ALPHA,\n     $      LDA, LDB, BETA, LDC\n      END IF\n*\n  160 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',\n     $      'S)' )\n 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',\n     $      'ANGED INCORRECTLY *******' )\n 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',\n     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,\n     $      ' - SUSPECT *******' )\n 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )\n 9995 FORMAT( '      THESE ARE THE RESULTS FOR COLUMN ', I3 )\n 9994 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ),\n     $      '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ',', F4.1,\n     $      ', C,', I3, ')           .' )\n 9993 FORMAT( 1X, I6, ': ', A6, '(', 2( '''', A1, ''',' ), 2( I3, ',' ),\n     $      '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ',(', F4.1,\n     $      ',', F4.1, '), C,', I3, ')    .' )\n 9992 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',\n     $      '******' )\n*\n*     End of ZCHK5.\n*\n      END\n      SUBROUTINE ZCHKE( ISNUM, SRNAMT, NOUT )\n*\n*  Tests the error exits from the Level 3 Blas.\n*  Requires a special version of the error-handling routine XERBLA.\n*  ALPHA, RALPHA, BETA, RBETA, A, B and C should not need to be defined.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Scalar Arguments ..\n      INTEGER            ISNUM, NOUT\n      CHARACTER*6        SRNAMT\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUTC\n      LOGICAL            LERR, OK\n*     .. Local Scalars ..\n      COMPLEX*16         ALPHA, BETA\n      DOUBLE PRECISION   RALPHA, RBETA\n*     .. Local Arrays ..\n      COMPLEX*16         A( 2, 1 ), B( 2, 1 ), C( 2, 1 )\n*     .. External Subroutines ..\n      EXTERNAL           ZGEMM, ZHEMM, ZHER2K, ZHERK, CHKXER, ZSYMM,\n     $                   ZSYR2K, ZSYRK, ZTRMM, ZTRSM\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUTC, OK, LERR\n*     .. Executable Statements ..\n*     OK is set to .FALSE. by the special version of XERBLA or by CHKXER\n*     if anything is wrong.\n      OK = .TRUE.\n*     LERR is set to .TRUE. by the special version of XERBLA each time\n*     it is called, and is then tested and re-set by CHKXER.\n      LERR = .FALSE.\n      GO TO ( 10, 20, 30, 40, 50, 60, 70, 80,\n     $        90 )ISNUM\n   10 INFOT = 1\n      CALL ZGEMM( '/', 'N', 0, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 1\n      CALL ZGEMM( '/', 'C', 0, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 1\n      CALL ZGEMM( '/', 'T', 0, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL ZGEMM( 'N', '/', 0, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL ZGEMM( 'C', '/', 0, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL ZGEMM( 'T', '/', 0, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZGEMM( 'N', 'N', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZGEMM( 'N', 'C', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZGEMM( 'N', 'T', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZGEMM( 'C', 'N', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZGEMM( 'C', 'C', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZGEMM( 'C', 'T', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZGEMM( 'T', 'N', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZGEMM( 'T', 'C', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZGEMM( 'T', 'T', -1, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZGEMM( 'N', 'N', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZGEMM( 'N', 'C', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZGEMM( 'N', 'T', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZGEMM( 'C', 'N', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZGEMM( 'C', 'C', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZGEMM( 'C', 'T', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZGEMM( 'T', 'N', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZGEMM( 'T', 'C', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZGEMM( 'T', 'T', 0, -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZGEMM( 'N', 'N', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZGEMM( 'N', 'C', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZGEMM( 'N', 'T', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZGEMM( 'C', 'N', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZGEMM( 'C', 'C', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZGEMM( 'C', 'T', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZGEMM( 'T', 'N', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZGEMM( 'T', 'C', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZGEMM( 'T', 'T', 0, 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL ZGEMM( 'N', 'N', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL ZGEMM( 'N', 'C', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL ZGEMM( 'N', 'T', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL ZGEMM( 'C', 'N', 0, 0, 2, ALPHA, A, 1, B, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL ZGEMM( 'C', 'C', 0, 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL ZGEMM( 'C', 'T', 0, 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL ZGEMM( 'T', 'N', 0, 0, 2, ALPHA, A, 1, B, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL ZGEMM( 'T', 'C', 0, 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 8\n      CALL ZGEMM( 'T', 'T', 0, 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL ZGEMM( 'N', 'N', 0, 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL ZGEMM( 'C', 'N', 0, 0, 2, ALPHA, A, 2, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL ZGEMM( 'T', 'N', 0, 0, 2, ALPHA, A, 2, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL ZGEMM( 'N', 'C', 0, 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL ZGEMM( 'C', 'C', 0, 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL ZGEMM( 'T', 'C', 0, 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL ZGEMM( 'N', 'T', 0, 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL ZGEMM( 'C', 'T', 0, 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL ZGEMM( 'T', 'T', 0, 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 13\n      CALL ZGEMM( 'N', 'N', 2, 0, 0, ALPHA, A, 2, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 13\n      CALL ZGEMM( 'N', 'C', 2, 0, 0, ALPHA, A, 2, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 13\n      CALL ZGEMM( 'N', 'T', 2, 0, 0, ALPHA, A, 2, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 13\n      CALL ZGEMM( 'C', 'N', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 13\n      CALL ZGEMM( 'C', 'C', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 13\n      CALL ZGEMM( 'C', 'T', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 13\n      CALL ZGEMM( 'T', 'N', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 13\n      CALL ZGEMM( 'T', 'C', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 13\n      CALL ZGEMM( 'T', 'T', 2, 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 100\n   20 INFOT = 1\n      CALL ZHEMM( '/', 'U', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL ZHEMM( 'L', '/', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZHEMM( 'L', 'U', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZHEMM( 'R', 'U', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZHEMM( 'L', 'L', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZHEMM( 'R', 'L', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZHEMM( 'L', 'U', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZHEMM( 'R', 'U', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZHEMM( 'L', 'L', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZHEMM( 'R', 'L', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL ZHEMM( 'L', 'U', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL ZHEMM( 'R', 'U', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL ZHEMM( 'L', 'L', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL ZHEMM( 'R', 'L', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZHEMM( 'L', 'U', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZHEMM( 'R', 'U', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZHEMM( 'L', 'L', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZHEMM( 'R', 'L', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL ZHEMM( 'L', 'U', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL ZHEMM( 'R', 'U', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL ZHEMM( 'L', 'L', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL ZHEMM( 'R', 'L', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 100\n   30 INFOT = 1\n      CALL ZSYMM( '/', 'U', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL ZSYMM( 'L', '/', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZSYMM( 'L', 'U', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZSYMM( 'R', 'U', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZSYMM( 'L', 'L', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZSYMM( 'R', 'L', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZSYMM( 'L', 'U', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZSYMM( 'R', 'U', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZSYMM( 'L', 'L', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZSYMM( 'R', 'L', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL ZSYMM( 'L', 'U', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL ZSYMM( 'R', 'U', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL ZSYMM( 'L', 'L', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL ZSYMM( 'R', 'L', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZSYMM( 'L', 'U', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZSYMM( 'R', 'U', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZSYMM( 'L', 'L', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZSYMM( 'R', 'L', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL ZSYMM( 'L', 'U', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL ZSYMM( 'R', 'U', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL ZSYMM( 'L', 'L', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL ZSYMM( 'R', 'L', 2, 0, ALPHA, A, 1, B, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 100\n   40 INFOT = 1\n      CALL ZTRMM( '/', 'U', 'N', 'N', 0, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL ZTRMM( 'L', '/', 'N', 'N', 0, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZTRMM( 'L', 'U', '/', 'N', 0, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZTRMM( 'L', 'U', 'N', '/', 0, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZTRMM( 'L', 'U', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZTRMM( 'L', 'U', 'C', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZTRMM( 'L', 'U', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZTRMM( 'R', 'U', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZTRMM( 'R', 'U', 'C', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZTRMM( 'R', 'U', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZTRMM( 'L', 'L', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZTRMM( 'L', 'L', 'C', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZTRMM( 'L', 'L', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZTRMM( 'R', 'L', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZTRMM( 'R', 'L', 'C', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZTRMM( 'R', 'L', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL ZTRMM( 'L', 'U', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL ZTRMM( 'L', 'U', 'C', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL ZTRMM( 'L', 'U', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL ZTRMM( 'R', 'U', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL ZTRMM( 'R', 'U', 'C', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL ZTRMM( 'R', 'U', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL ZTRMM( 'L', 'L', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL ZTRMM( 'L', 'L', 'C', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL ZTRMM( 'L', 'L', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL ZTRMM( 'R', 'L', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL ZTRMM( 'R', 'L', 'C', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL ZTRMM( 'R', 'L', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZTRMM( 'L', 'U', 'N', 'N', 2, 0, ALPHA, A, 1, B, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZTRMM( 'L', 'U', 'C', 'N', 2, 0, ALPHA, A, 1, B, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZTRMM( 'L', 'U', 'T', 'N', 2, 0, ALPHA, A, 1, B, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZTRMM( 'R', 'U', 'N', 'N', 0, 2, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZTRMM( 'R', 'U', 'C', 'N', 0, 2, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZTRMM( 'R', 'U', 'T', 'N', 0, 2, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZTRMM( 'L', 'L', 'N', 'N', 2, 0, ALPHA, A, 1, B, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZTRMM( 'L', 'L', 'C', 'N', 2, 0, ALPHA, A, 1, B, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZTRMM( 'L', 'L', 'T', 'N', 2, 0, ALPHA, A, 1, B, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZTRMM( 'R', 'L', 'N', 'N', 0, 2, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZTRMM( 'R', 'L', 'C', 'N', 0, 2, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZTRMM( 'R', 'L', 'T', 'N', 0, 2, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL ZTRMM( 'L', 'U', 'N', 'N', 2, 0, ALPHA, A, 2, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL ZTRMM( 'L', 'U', 'C', 'N', 2, 0, ALPHA, A, 2, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL ZTRMM( 'L', 'U', 'T', 'N', 2, 0, ALPHA, A, 2, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL ZTRMM( 'R', 'U', 'N', 'N', 2, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL ZTRMM( 'R', 'U', 'C', 'N', 2, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL ZTRMM( 'R', 'U', 'T', 'N', 2, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL ZTRMM( 'L', 'L', 'N', 'N', 2, 0, ALPHA, A, 2, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL ZTRMM( 'L', 'L', 'C', 'N', 2, 0, ALPHA, A, 2, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL ZTRMM( 'L', 'L', 'T', 'N', 2, 0, ALPHA, A, 2, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL ZTRMM( 'R', 'L', 'N', 'N', 2, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL ZTRMM( 'R', 'L', 'C', 'N', 2, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL ZTRMM( 'R', 'L', 'T', 'N', 2, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 100\n   50 INFOT = 1\n      CALL ZTRSM( '/', 'U', 'N', 'N', 0, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL ZTRSM( 'L', '/', 'N', 'N', 0, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZTRSM( 'L', 'U', '/', 'N', 0, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZTRSM( 'L', 'U', 'N', '/', 0, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZTRSM( 'L', 'U', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZTRSM( 'L', 'U', 'C', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZTRSM( 'L', 'U', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZTRSM( 'R', 'U', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZTRSM( 'R', 'U', 'C', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZTRSM( 'R', 'U', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZTRSM( 'L', 'L', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZTRSM( 'L', 'L', 'C', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZTRSM( 'L', 'L', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZTRSM( 'R', 'L', 'N', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZTRSM( 'R', 'L', 'C', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 5\n      CALL ZTRSM( 'R', 'L', 'T', 'N', -1, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL ZTRSM( 'L', 'U', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL ZTRSM( 'L', 'U', 'C', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL ZTRSM( 'L', 'U', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL ZTRSM( 'R', 'U', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL ZTRSM( 'R', 'U', 'C', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL ZTRSM( 'R', 'U', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL ZTRSM( 'L', 'L', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL ZTRSM( 'L', 'L', 'C', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL ZTRSM( 'L', 'L', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL ZTRSM( 'R', 'L', 'N', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL ZTRSM( 'R', 'L', 'C', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 6\n      CALL ZTRSM( 'R', 'L', 'T', 'N', 0, -1, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZTRSM( 'L', 'U', 'N', 'N', 2, 0, ALPHA, A, 1, B, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZTRSM( 'L', 'U', 'C', 'N', 2, 0, ALPHA, A, 1, B, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZTRSM( 'L', 'U', 'T', 'N', 2, 0, ALPHA, A, 1, B, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZTRSM( 'R', 'U', 'N', 'N', 0, 2, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZTRSM( 'R', 'U', 'C', 'N', 0, 2, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZTRSM( 'R', 'U', 'T', 'N', 0, 2, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZTRSM( 'L', 'L', 'N', 'N', 2, 0, ALPHA, A, 1, B, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZTRSM( 'L', 'L', 'C', 'N', 2, 0, ALPHA, A, 1, B, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZTRSM( 'L', 'L', 'T', 'N', 2, 0, ALPHA, A, 1, B, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZTRSM( 'R', 'L', 'N', 'N', 0, 2, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZTRSM( 'R', 'L', 'C', 'N', 0, 2, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZTRSM( 'R', 'L', 'T', 'N', 0, 2, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL ZTRSM( 'L', 'U', 'N', 'N', 2, 0, ALPHA, A, 2, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL ZTRSM( 'L', 'U', 'C', 'N', 2, 0, ALPHA, A, 2, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL ZTRSM( 'L', 'U', 'T', 'N', 2, 0, ALPHA, A, 2, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL ZTRSM( 'R', 'U', 'N', 'N', 2, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL ZTRSM( 'R', 'U', 'C', 'N', 2, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL ZTRSM( 'R', 'U', 'T', 'N', 2, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL ZTRSM( 'L', 'L', 'N', 'N', 2, 0, ALPHA, A, 2, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL ZTRSM( 'L', 'L', 'C', 'N', 2, 0, ALPHA, A, 2, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL ZTRSM( 'L', 'L', 'T', 'N', 2, 0, ALPHA, A, 2, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL ZTRSM( 'R', 'L', 'N', 'N', 2, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL ZTRSM( 'R', 'L', 'C', 'N', 2, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 11\n      CALL ZTRSM( 'R', 'L', 'T', 'N', 2, 0, ALPHA, A, 1, B, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 100\n   60 INFOT = 1\n      CALL ZHERK( '/', 'N', 0, 0, RALPHA, A, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL ZHERK( 'U', 'T', 0, 0, RALPHA, A, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZHERK( 'U', 'N', -1, 0, RALPHA, A, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZHERK( 'U', 'C', -1, 0, RALPHA, A, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZHERK( 'L', 'N', -1, 0, RALPHA, A, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZHERK( 'L', 'C', -1, 0, RALPHA, A, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZHERK( 'U', 'N', 0, -1, RALPHA, A, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZHERK( 'U', 'C', 0, -1, RALPHA, A, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZHERK( 'L', 'N', 0, -1, RALPHA, A, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZHERK( 'L', 'C', 0, -1, RALPHA, A, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL ZHERK( 'U', 'N', 2, 0, RALPHA, A, 1, RBETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL ZHERK( 'U', 'C', 0, 2, RALPHA, A, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL ZHERK( 'L', 'N', 2, 0, RALPHA, A, 1, RBETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL ZHERK( 'L', 'C', 0, 2, RALPHA, A, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL ZHERK( 'U', 'N', 2, 0, RALPHA, A, 2, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL ZHERK( 'U', 'C', 2, 0, RALPHA, A, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL ZHERK( 'L', 'N', 2, 0, RALPHA, A, 2, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL ZHERK( 'L', 'C', 2, 0, RALPHA, A, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 100\n   70 INFOT = 1\n      CALL ZSYRK( '/', 'N', 0, 0, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL ZSYRK( 'U', 'C', 0, 0, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZSYRK( 'U', 'N', -1, 0, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZSYRK( 'U', 'T', -1, 0, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZSYRK( 'L', 'N', -1, 0, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZSYRK( 'L', 'T', -1, 0, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZSYRK( 'U', 'N', 0, -1, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZSYRK( 'U', 'T', 0, -1, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZSYRK( 'L', 'N', 0, -1, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZSYRK( 'L', 'T', 0, -1, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL ZSYRK( 'U', 'N', 2, 0, ALPHA, A, 1, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL ZSYRK( 'U', 'T', 0, 2, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL ZSYRK( 'L', 'N', 2, 0, ALPHA, A, 1, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL ZSYRK( 'L', 'T', 0, 2, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL ZSYRK( 'U', 'N', 2, 0, ALPHA, A, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL ZSYRK( 'U', 'T', 2, 0, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL ZSYRK( 'L', 'N', 2, 0, ALPHA, A, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 10\n      CALL ZSYRK( 'L', 'T', 2, 0, ALPHA, A, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 100\n   80 INFOT = 1\n      CALL ZHER2K( '/', 'N', 0, 0, ALPHA, A, 1, B, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL ZHER2K( 'U', 'T', 0, 0, ALPHA, A, 1, B, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZHER2K( 'U', 'N', -1, 0, ALPHA, A, 1, B, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZHER2K( 'U', 'C', -1, 0, ALPHA, A, 1, B, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZHER2K( 'L', 'N', -1, 0, ALPHA, A, 1, B, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZHER2K( 'L', 'C', -1, 0, ALPHA, A, 1, B, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZHER2K( 'U', 'N', 0, -1, ALPHA, A, 1, B, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZHER2K( 'U', 'C', 0, -1, ALPHA, A, 1, B, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZHER2K( 'L', 'N', 0, -1, ALPHA, A, 1, B, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZHER2K( 'L', 'C', 0, -1, ALPHA, A, 1, B, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL ZHER2K( 'U', 'N', 2, 0, ALPHA, A, 1, B, 1, RBETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL ZHER2K( 'U', 'C', 0, 2, ALPHA, A, 1, B, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL ZHER2K( 'L', 'N', 2, 0, ALPHA, A, 1, B, 1, RBETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL ZHER2K( 'L', 'C', 0, 2, ALPHA, A, 1, B, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZHER2K( 'U', 'N', 2, 0, ALPHA, A, 2, B, 1, RBETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZHER2K( 'U', 'C', 0, 2, ALPHA, A, 2, B, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZHER2K( 'L', 'N', 2, 0, ALPHA, A, 2, B, 1, RBETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZHER2K( 'L', 'C', 0, 2, ALPHA, A, 2, B, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL ZHER2K( 'U', 'N', 2, 0, ALPHA, A, 2, B, 2, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL ZHER2K( 'U', 'C', 2, 0, ALPHA, A, 1, B, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL ZHER2K( 'L', 'N', 2, 0, ALPHA, A, 2, B, 2, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL ZHER2K( 'L', 'C', 2, 0, ALPHA, A, 1, B, 1, RBETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      GO TO 100\n   90 INFOT = 1\n      CALL ZSYR2K( '/', 'N', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 2\n      CALL ZSYR2K( 'U', 'C', 0, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZSYR2K( 'U', 'N', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZSYR2K( 'U', 'T', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZSYR2K( 'L', 'N', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 3\n      CALL ZSYR2K( 'L', 'T', -1, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZSYR2K( 'U', 'N', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZSYR2K( 'U', 'T', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZSYR2K( 'L', 'N', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 4\n      CALL ZSYR2K( 'L', 'T', 0, -1, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL ZSYR2K( 'U', 'N', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL ZSYR2K( 'U', 'T', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL ZSYR2K( 'L', 'N', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 7\n      CALL ZSYR2K( 'L', 'T', 0, 2, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZSYR2K( 'U', 'N', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZSYR2K( 'U', 'T', 0, 2, ALPHA, A, 2, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZSYR2K( 'L', 'N', 2, 0, ALPHA, A, 2, B, 1, BETA, C, 2 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 9\n      CALL ZSYR2K( 'L', 'T', 0, 2, ALPHA, A, 2, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL ZSYR2K( 'U', 'N', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL ZSYR2K( 'U', 'T', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL ZSYR2K( 'L', 'N', 2, 0, ALPHA, A, 2, B, 2, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n      INFOT = 12\n      CALL ZSYR2K( 'L', 'T', 2, 0, ALPHA, A, 1, B, 1, BETA, C, 1 )\n      CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n*\n  100 IF( OK )THEN\n         WRITE( NOUT, FMT = 9999 )SRNAMT\n      ELSE\n         WRITE( NOUT, FMT = 9998 )SRNAMT\n      END IF\n      RETURN\n*\n 9999 FORMAT( ' ', A6, ' PASSED THE TESTS OF ERROR-EXITS' )\n 9998 FORMAT( ' ******* ', A6, ' FAILED THE TESTS OF ERROR-EXITS *****',\n     $      '**' )\n*\n*     End of ZCHKE.\n*\n      END\n      SUBROUTINE ZMAKE( TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, RESET,\n     $                  TRANSL )\n*\n*  Generates values for an M by N matrix A.\n*  Stores the values in the array AA in the data structure required\n*  by the routine, with unwanted elements set to rogue value.\n*\n*  TYPE is 'GE', 'HE', 'SY' or 'TR'.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Parameters ..\n      COMPLEX*16         ZERO, ONE\n      PARAMETER          ( ZERO = ( 0.0D0, 0.0D0 ),\n     $                   ONE = ( 1.0D0, 0.0D0 ) )\n      COMPLEX*16         ROGUE\n      PARAMETER          ( ROGUE = ( -1.0D10, 1.0D10 ) )\n      DOUBLE PRECISION   RZERO\n      PARAMETER          ( RZERO = 0.0D0 )\n      DOUBLE PRECISION   RROGUE\n      PARAMETER          ( RROGUE = -1.0D10 )\n*     .. Scalar Arguments ..\n      COMPLEX*16         TRANSL\n      INTEGER            LDA, M, N, NMAX\n      LOGICAL            RESET\n      CHARACTER*1        DIAG, UPLO\n      CHARACTER*2        TYPE\n*     .. Array Arguments ..\n      COMPLEX*16         A( NMAX, * ), AA( * )\n*     .. Local Scalars ..\n      INTEGER            I, IBEG, IEND, J, JJ\n      LOGICAL            GEN, HER, LOWER, SYM, TRI, UNIT, UPPER\n*     .. External Functions ..\n      COMPLEX*16         ZBEG\n      EXTERNAL           ZBEG\n*     .. Intrinsic Functions ..\n      INTRINSIC          DCMPLX, DCONJG, DBLE\n*     .. Executable Statements ..\n      GEN = TYPE.EQ.'GE'\n      HER = TYPE.EQ.'HE'\n      SYM = TYPE.EQ.'SY'\n      TRI = TYPE.EQ.'TR'\n      UPPER = ( HER.OR.SYM.OR.TRI ).AND.UPLO.EQ.'U'\n      LOWER = ( HER.OR.SYM.OR.TRI ).AND.UPLO.EQ.'L'\n      UNIT = TRI.AND.DIAG.EQ.'U'\n*\n*     Generate data in array A.\n*\n      DO 20 J = 1, N\n         DO 10 I = 1, M\n            IF( GEN.OR.( UPPER.AND.I.LE.J ).OR.( LOWER.AND.I.GE.J ) )\n     $          THEN\n               A( I, J ) = ZBEG( RESET ) + TRANSL\n               IF( I.NE.J )THEN\n*                 Set some elements to zero\n                  IF( N.GT.3.AND.J.EQ.N/2 )\n     $               A( I, J ) = ZERO\n                  IF( HER )THEN\n                     A( J, I ) = DCONJG( A( I, J ) )\n                  ELSE IF( SYM )THEN\n                     A( J, I ) = A( I, J )\n                  ELSE IF( TRI )THEN\n                     A( J, I ) = ZERO\n                  END IF\n               END IF\n            END IF\n   10    CONTINUE\n         IF( HER )\n     $      A( J, J ) = DCMPLX( DBLE( A( J, J ) ), RZERO )\n         IF( TRI )\n     $      A( J, J ) = A( J, J ) + ONE\n         IF( UNIT )\n     $      A( J, J ) = ONE\n   20 CONTINUE\n*\n*     Store elements in array AS in data structure required by routine.\n*\n      IF( TYPE.EQ.'GE' )THEN\n         DO 50 J = 1, N\n            DO 30 I = 1, M\n               AA( I + ( J - 1 )*LDA ) = A( I, J )\n   30       CONTINUE\n            DO 40 I = M + 1, LDA\n               AA( I + ( J - 1 )*LDA ) = ROGUE\n   40       CONTINUE\n   50    CONTINUE\n      ELSE IF( TYPE.EQ.'HE'.OR.TYPE.EQ.'SY'.OR.TYPE.EQ.'TR' )THEN\n         DO 90 J = 1, N\n            IF( UPPER )THEN\n               IBEG = 1\n               IF( UNIT )THEN\n                  IEND = J - 1\n               ELSE\n                  IEND = J\n               END IF\n            ELSE\n               IF( UNIT )THEN\n                  IBEG = J + 1\n               ELSE\n                  IBEG = J\n               END IF\n               IEND = N\n            END IF\n            DO 60 I = 1, IBEG - 1\n               AA( I + ( J - 1 )*LDA ) = ROGUE\n   60       CONTINUE\n            DO 70 I = IBEG, IEND\n               AA( I + ( J - 1 )*LDA ) = A( I, J )\n   70       CONTINUE\n            DO 80 I = IEND + 1, LDA\n               AA( I + ( J - 1 )*LDA ) = ROGUE\n   80       CONTINUE\n            IF( HER )THEN\n               JJ = J + ( J - 1 )*LDA\n               AA( JJ ) = DCMPLX( DBLE( AA( JJ ) ), RROGUE )\n            END IF\n   90    CONTINUE\n      END IF\n      RETURN\n*\n*     End of ZMAKE.\n*\n      END\n      SUBROUTINE ZMMCH( TRANSA, TRANSB, M, N, KK, ALPHA, A, LDA, B, LDB,\n     $                  BETA, C, LDC, CT, G, CC, LDCC, EPS, ERR, FATAL,\n     $                  NOUT, MV )\n*\n*  Checks the results of the computational tests.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Parameters ..\n      COMPLEX*16         ZERO\n      PARAMETER          ( ZERO = ( 0.0D0, 0.0D0 ) )\n      DOUBLE PRECISION   RZERO, RONE\n      PARAMETER          ( RZERO = 0.0D0, RONE = 1.0D0 )\n*     .. Scalar Arguments ..\n      COMPLEX*16         ALPHA, BETA\n      DOUBLE PRECISION   EPS, ERR\n      INTEGER            KK, LDA, LDB, LDC, LDCC, M, N, NOUT\n      LOGICAL            FATAL, MV\n      CHARACTER*1        TRANSA, TRANSB\n*     .. Array Arguments ..\n      COMPLEX*16         A( LDA, * ), B( LDB, * ), C( LDC, * ),\n     $                   CC( LDCC, * ), CT( * )\n      DOUBLE PRECISION   G( * )\n*     .. Local Scalars ..\n      COMPLEX*16         CL\n      DOUBLE PRECISION   ERRI\n      INTEGER            I, J, K\n      LOGICAL            CTRANA, CTRANB, TRANA, TRANB\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, DIMAG, DCONJG, MAX, DBLE, SQRT\n*     .. Statement Functions ..\n      DOUBLE PRECISION   ABS1\n*     .. Statement Function definitions ..\n      ABS1( CL ) = ABS( DBLE( CL ) ) + ABS( DIMAG( CL ) )\n*     .. Executable Statements ..\n      TRANA = TRANSA.EQ.'T'.OR.TRANSA.EQ.'C'\n      TRANB = TRANSB.EQ.'T'.OR.TRANSB.EQ.'C'\n      CTRANA = TRANSA.EQ.'C'\n      CTRANB = TRANSB.EQ.'C'\n*\n*     Compute expected result, one column at a time, in CT using data\n*     in A, B and C.\n*     Compute gauges in G.\n*\n      DO 220 J = 1, N\n*\n         DO 10 I = 1, M\n            CT( I ) = ZERO\n            G( I ) = RZERO\n   10    CONTINUE\n         IF( .NOT.TRANA.AND..NOT.TRANB )THEN\n            DO 30 K = 1, KK\n               DO 20 I = 1, M\n                  CT( I ) = CT( I ) + A( I, K )*B( K, J )\n                  G( I ) = G( I ) + ABS1( A( I, K ) )*ABS1( B( K, J ) )\n   20          CONTINUE\n   30       CONTINUE\n         ELSE IF( TRANA.AND..NOT.TRANB )THEN\n            IF( CTRANA )THEN\n               DO 50 K = 1, KK\n                  DO 40 I = 1, M\n                     CT( I ) = CT( I ) + DCONJG( A( K, I ) )*B( K, J )\n                     G( I ) = G( I ) + ABS1( A( K, I ) )*\n     $                        ABS1( B( K, J ) )\n   40             CONTINUE\n   50          CONTINUE\n            ELSE\n               DO 70 K = 1, KK\n                  DO 60 I = 1, M\n                     CT( I ) = CT( I ) + A( K, I )*B( K, J )\n                     G( I ) = G( I ) + ABS1( A( K, I ) )*\n     $                        ABS1( B( K, J ) )\n   60             CONTINUE\n   70          CONTINUE\n            END IF\n         ELSE IF( .NOT.TRANA.AND.TRANB )THEN\n            IF( CTRANB )THEN\n               DO 90 K = 1, KK\n                  DO 80 I = 1, M\n                     CT( I ) = CT( I ) + A( I, K )*DCONJG( B( J, K ) )\n                     G( I ) = G( I ) + ABS1( A( I, K ) )*\n     $                        ABS1( B( J, K ) )\n   80             CONTINUE\n   90          CONTINUE\n            ELSE\n               DO 110 K = 1, KK\n                  DO 100 I = 1, M\n                     CT( I ) = CT( I ) + A( I, K )*B( J, K )\n                     G( I ) = G( I ) + ABS1( A( I, K ) )*\n     $                        ABS1( B( J, K ) )\n  100             CONTINUE\n  110          CONTINUE\n            END IF\n         ELSE IF( TRANA.AND.TRANB )THEN\n            IF( CTRANA )THEN\n               IF( CTRANB )THEN\n                  DO 130 K = 1, KK\n                     DO 120 I = 1, M\n                        CT( I ) = CT( I ) + DCONJG( A( K, I ) )*\n     $                            DCONJG( B( J, K ) )\n                        G( I ) = G( I ) + ABS1( A( K, I ) )*\n     $                           ABS1( B( J, K ) )\n  120                CONTINUE\n  130             CONTINUE\n               ELSE\n                  DO 150 K = 1, KK\n                     DO 140 I = 1, M\n                        CT( I ) = CT( I ) + DCONJG( A( K, I ) )*\n     $                            B( J, K )\n                        G( I ) = G( I ) + ABS1( A( K, I ) )*\n     $                           ABS1( B( J, K ) )\n  140                CONTINUE\n  150             CONTINUE\n               END IF\n            ELSE\n               IF( CTRANB )THEN\n                  DO 170 K = 1, KK\n                     DO 160 I = 1, M\n                        CT( I ) = CT( I ) + A( K, I )*\n     $                            DCONJG( B( J, K ) )\n                        G( I ) = G( I ) + ABS1( A( K, I ) )*\n     $                           ABS1( B( J, K ) )\n  160                CONTINUE\n  170             CONTINUE\n               ELSE\n                  DO 190 K = 1, KK\n                     DO 180 I = 1, M\n                        CT( I ) = CT( I ) + A( K, I )*B( J, K )\n                        G( I ) = G( I ) + ABS1( A( K, I ) )*\n     $                           ABS1( B( J, K ) )\n  180                CONTINUE\n  190             CONTINUE\n               END IF\n            END IF\n         END IF\n         DO 200 I = 1, M\n            CT( I ) = ALPHA*CT( I ) + BETA*C( I, J )\n            G( I ) = ABS1( ALPHA )*G( I ) +\n     $               ABS1( BETA )*ABS1( C( I, J ) )\n  200    CONTINUE\n*\n*        Compute the error ratio for this result.\n*\n         ERR = ZERO\n         DO 210 I = 1, M\n            ERRI = ABS1( CT( I ) - CC( I, J ) )/EPS\n            IF( G( I ).NE.RZERO )\n     $         ERRI = ERRI/G( I )\n            ERR = MAX( ERR, ERRI )\n            IF( ERR*SQRT( EPS ).GE.RONE )\n     $         GO TO 230\n  210    CONTINUE\n*\n  220 CONTINUE\n*\n*     If the loop completes, all results are at least half accurate.\n      GO TO 250\n*\n*     Report fatal error.\n*\n  230 FATAL = .TRUE.\n      WRITE( NOUT, FMT = 9999 )\n      DO 240 I = 1, M\n         IF( MV )THEN\n            WRITE( NOUT, FMT = 9998 )I, CT( I ), CC( I, J )\n         ELSE\n            WRITE( NOUT, FMT = 9998 )I, CC( I, J ), CT( I )\n         END IF\n  240 CONTINUE\n      IF( N.GT.1 )\n     $   WRITE( NOUT, FMT = 9997 )J\n*\n  250 CONTINUE\n      RETURN\n*\n 9999 FORMAT( ' ******* FATAL ERROR - COMPUTED RESULT IS LESS THAN HAL',\n     $      'F ACCURATE *******', /'                       EXPECTED RE',\n     $      'SULT                    COMPUTED RESULT' )\n 9998 FORMAT( 1X, I7, 2( '  (', G15.6, ',', G15.6, ')' ) )\n 9997 FORMAT( '      THESE ARE THE RESULTS FOR COLUMN ', I3 )\n*\n*     End of ZMMCH.\n*\n      END\n      LOGICAL FUNCTION LZE( RI, RJ, LR )\n*\n*  Tests if two arrays are identical.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Scalar Arguments ..\n      INTEGER            LR\n*     .. Array Arguments ..\n      COMPLEX*16         RI( * ), RJ( * )\n*     .. Local Scalars ..\n      INTEGER            I\n*     .. Executable Statements ..\n      DO 10 I = 1, LR\n         IF( RI( I ).NE.RJ( I ) )\n     $      GO TO 20\n   10 CONTINUE\n      LZE = .TRUE.\n      GO TO 30\n   20 CONTINUE\n      LZE = .FALSE.\n   30 RETURN\n*\n*     End of LZE.\n*\n      END\n      LOGICAL FUNCTION LZERES( TYPE, UPLO, M, N, AA, AS, LDA )\n*\n*  Tests if selected elements in two arrays are equal.\n*\n*  TYPE is 'GE' or 'HE' or 'SY'.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Scalar Arguments ..\n      INTEGER            LDA, M, N\n      CHARACTER*1        UPLO\n      CHARACTER*2        TYPE\n*     .. Array Arguments ..\n      COMPLEX*16         AA( LDA, * ), AS( LDA, * )\n*     .. Local Scalars ..\n      INTEGER            I, IBEG, IEND, J\n      LOGICAL            UPPER\n*     .. Executable Statements ..\n      UPPER = UPLO.EQ.'U'\n      IF( TYPE.EQ.'GE' )THEN\n         DO 20 J = 1, N\n            DO 10 I = M + 1, LDA\n               IF( AA( I, J ).NE.AS( I, J ) )\n     $            GO TO 70\n   10       CONTINUE\n   20    CONTINUE\n      ELSE IF( TYPE.EQ.'HE'.OR.TYPE.EQ.'SY' )THEN\n         DO 50 J = 1, N\n            IF( UPPER )THEN\n               IBEG = 1\n               IEND = J\n            ELSE\n               IBEG = J\n               IEND = N\n            END IF\n            DO 30 I = 1, IBEG - 1\n               IF( AA( I, J ).NE.AS( I, J ) )\n     $            GO TO 70\n   30       CONTINUE\n            DO 40 I = IEND + 1, LDA\n               IF( AA( I, J ).NE.AS( I, J ) )\n     $            GO TO 70\n   40       CONTINUE\n   50    CONTINUE\n      END IF\n*\n   60 CONTINUE\n      LZERES = .TRUE.\n      GO TO 80\n   70 CONTINUE\n      LZERES = .FALSE.\n   80 RETURN\n*\n*     End of LZERES.\n*\n      END\n      COMPLEX*16     FUNCTION ZBEG( RESET )\n*\n*  Generates complex numbers as pairs of random numbers uniformly\n*  distributed between -0.5 and 0.5.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Scalar Arguments ..\n      LOGICAL            RESET\n*     .. Local Scalars ..\n      INTEGER            I, IC, J, MI, MJ\n*     .. Save statement ..\n      SAVE               I, IC, J, MI, MJ\n*     .. Intrinsic Functions ..\n      INTRINSIC          DCMPLX\n*     .. Executable Statements ..\n      IF( RESET )THEN\n*        Initialize local variables.\n         MI = 891\n         MJ = 457\n         I = 7\n         J = 7\n         IC = 0\n         RESET = .FALSE.\n      END IF\n*\n*     The sequence of values of I or J is bounded between 1 and 999.\n*     If initial I or J = 1,2,3,6,7 or 9, the period will be 50.\n*     If initial I or J = 4 or 8, the period will be 25.\n*     If initial I or J = 5, the period will be 10.\n*     IC is used to break up the period by skipping 1 value of I or J\n*     in 6.\n*\n      IC = IC + 1\n   10 I = I*MI\n      J = J*MJ\n      I = I - 1000*( I/1000 )\n      J = J - 1000*( J/1000 )\n      IF( IC.GE.5 )THEN\n         IC = 0\n         GO TO 10\n      END IF\n      ZBEG = DCMPLX( ( I - 500 )/1001.0D0, ( J - 500 )/1001.0D0 )\n      RETURN\n*\n*     End of ZBEG.\n*\n      END\n      DOUBLE PRECISION FUNCTION DDIFF( X, Y )\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION   X, Y\n*     .. Executable Statements ..\n      DDIFF = X - Y\n      RETURN\n*\n*     End of DDIFF.\n*\n      END\n      SUBROUTINE CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )\n*\n*  Tests whether XERBLA has detected an error when it should.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Scalar Arguments ..\n      INTEGER            INFOT, NOUT\n      LOGICAL            LERR, OK\n      CHARACTER*6        SRNAMT\n*     .. Executable Statements ..\n      IF( .NOT.LERR )THEN\n         WRITE( NOUT, FMT = 9999 )INFOT, SRNAMT\n         OK = .FALSE.\n      END IF\n      LERR = .FALSE.\n      RETURN\n*\n 9999 FORMAT( ' ***** ILLEGAL VALUE OF PARAMETER NUMBER ', I2, ' NOT D',\n     $      'ETECTED BY ', A6, ' *****' )\n*\n*     End of CHKXER.\n*\n      END\n      SUBROUTINE XERBLA( SRNAME, INFO )\n*\n*  This is a special version of XERBLA to be used only as part of\n*  the test program for testing error exits from the Level 3 BLAS\n*  routines.\n*\n*  XERBLA  is an error handler for the Level 3 BLAS routines.\n*\n*  It is called by the Level 3 BLAS routines if an input parameter is\n*  invalid.\n*\n*  Auxiliary routine for test program for Level 3 Blas.\n*\n*  -- Written on 8-February-1989.\n*     Jack Dongarra, Argonne National Laboratory.\n*     Iain Duff, AERE Harwell.\n*     Jeremy Du Croz, Numerical Algorithms Group Ltd.\n*     Sven Hammarling, Numerical Algorithms Group Ltd.\n*\n*     .. Scalar Arguments ..\n      INTEGER            INFO\n      CHARACTER*6        SRNAME\n*     .. Scalars in Common ..\n      INTEGER            INFOT, NOUT\n      LOGICAL            LERR, OK\n      CHARACTER*6        SRNAMT\n*     .. Common blocks ..\n      COMMON             /INFOC/INFOT, NOUT, OK, LERR\n      COMMON             /SRNAMC/SRNAMT\n*     .. Executable Statements ..\n      LERR = .TRUE.\n      IF( INFO.NE.INFOT )THEN\n         IF( INFOT.NE.0 )THEN\n            WRITE( NOUT, FMT = 9999 )INFO, INFOT\n         ELSE\n            WRITE( NOUT, FMT = 9997 )INFO\n         END IF\n         OK = .FALSE.\n      END IF\n      IF( SRNAME.NE.SRNAMT )THEN\n         WRITE( NOUT, FMT = 9998 )SRNAME, SRNAMT\n         OK = .FALSE.\n      END IF\n      RETURN\n*\n 9999 FORMAT( ' ******* XERBLA WAS CALLED WITH INFO = ', I6, ' INSTEAD',\n     $      ' OF ', I2, ' *******' )\n 9998 FORMAT( ' ******* XERBLA WAS CALLED WITH SRNAME = ', A6, ' INSTE',\n     $      'AD OF ', A6, ' *******' )\n 9997 FORMAT( ' ******* XERBLA WAS CALLED WITH INFO = ', I6,\n     $      ' *******' )\n*\n*     End of XERBLA\n*\n      END\n\n"
  },
  {
    "path": "libs/eigen/blas/xerbla.cpp",
    "content": "\n#include <iostream>\n\n#if (defined __GNUC__) && (!defined __MINGW32__) && (!defined __CYGWIN__)\n#define EIGEN_WEAK_LINKING __attribute__ ((weak))\n#else\n#define EIGEN_WEAK_LINKING\n#endif\n\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n\nEIGEN_WEAK_LINKING int xerbla_(const char * msg, int *info, int)\n{\n  std::cerr << \"Eigen BLAS ERROR #\" << *info << \": \" << msg << \"\\n\";\n  return 0;\n}\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "libs/eigen/blas/zhbmv.f",
    "content": "      SUBROUTINE ZHBMV(UPLO,N,K,ALPHA,A,LDA,X,INCX,BETA,Y,INCY)\n*     .. Scalar Arguments ..\n      DOUBLE COMPLEX ALPHA,BETA\n      INTEGER INCX,INCY,K,LDA,N\n      CHARACTER UPLO\n*     ..\n*     .. Array Arguments ..\n      DOUBLE COMPLEX A(LDA,*),X(*),Y(*)\n*     ..\n*\n*  Purpose\n*  =======\n*\n*  ZHBMV  performs the matrix-vector  operation\n*\n*     y := alpha*A*x + beta*y,\n*\n*  where alpha and beta are scalars, x and y are n element vectors and\n*  A is an n by n hermitian band matrix, with k super-diagonals.\n*\n*  Arguments\n*  ==========\n*\n*  UPLO   - CHARACTER*1.\n*           On entry, UPLO specifies whether the upper or lower\n*           triangular part of the band matrix A is being supplied as\n*           follows:\n*\n*              UPLO = 'U' or 'u'   The upper triangular part of A is\n*                                  being supplied.\n*\n*              UPLO = 'L' or 'l'   The lower triangular part of A is\n*                                  being supplied.\n*\n*           Unchanged on exit.\n*\n*  N      - INTEGER.\n*           On entry, N specifies the order of the matrix A.\n*           N must be at least zero.\n*           Unchanged on exit.\n*\n*  K      - INTEGER.\n*           On entry, K specifies the number of super-diagonals of the\n*           matrix A. K must satisfy  0 .le. K.\n*           Unchanged on exit.\n*\n*  ALPHA  - COMPLEX*16      .\n*           On entry, ALPHA specifies the scalar alpha.\n*           Unchanged on exit.\n*\n*  A      - COMPLEX*16       array of DIMENSION ( LDA, n ).\n*           Before entry with UPLO = 'U' or 'u', the leading ( k + 1 )\n*           by n part of the array A must contain the upper triangular\n*           band part of the hermitian matrix, supplied column by\n*           column, with the leading diagonal of the matrix in row\n*           ( k + 1 ) of the array, the first super-diagonal starting at\n*           position 2 in row k, and so on. The top left k by k triangle\n*           of the array A is not referenced.\n*           The following program segment will transfer the upper\n*           triangular part of a hermitian band matrix from conventional\n*           full matrix storage to band storage:\n*\n*                 DO 20, J = 1, N\n*                    M = K + 1 - J\n*                    DO 10, I = MAX( 1, J - K ), J\n*                       A( M + I, J ) = matrix( I, J )\n*              10    CONTINUE\n*              20 CONTINUE\n*\n*           Before entry with UPLO = 'L' or 'l', the leading ( k + 1 )\n*           by n part of the array A must contain the lower triangular\n*           band part of the hermitian matrix, supplied column by\n*           column, with the leading diagonal of the matrix in row 1 of\n*           the array, the first sub-diagonal starting at position 1 in\n*           row 2, and so on. The bottom right k by k triangle of the\n*           array A is not referenced.\n*           The following program segment will transfer the lower\n*           triangular part of a hermitian band matrix from conventional\n*           full matrix storage to band storage:\n*\n*                 DO 20, J = 1, N\n*                    M = 1 - J\n*                    DO 10, I = J, MIN( N, J + K )\n*                       A( M + I, J ) = matrix( I, J )\n*              10    CONTINUE\n*              20 CONTINUE\n*\n*           Note that the imaginary parts of the diagonal elements need\n*           not be set and are assumed to be zero.\n*           Unchanged on exit.\n*\n*  LDA    - INTEGER.\n*           On entry, LDA specifies the first dimension of A as declared\n*           in the calling (sub) program. LDA must be at least\n*           ( k + 1 ).\n*           Unchanged on exit.\n*\n*  X      - COMPLEX*16       array of DIMENSION at least\n*           ( 1 + ( n - 1 )*abs( INCX ) ).\n*           Before entry, the incremented array X must contain the\n*           vector x.\n*           Unchanged on exit.\n*\n*  INCX   - INTEGER.\n*           On entry, INCX specifies the increment for the elements of\n*           X. INCX must not be zero.\n*           Unchanged on exit.\n*\n*  BETA   - COMPLEX*16      .\n*           On entry, BETA specifies the scalar beta.\n*           Unchanged on exit.\n*\n*  Y      - COMPLEX*16       array of DIMENSION at least\n*           ( 1 + ( n - 1 )*abs( INCY ) ).\n*           Before entry, the incremented array Y must contain the\n*           vector y. On exit, Y is overwritten by the updated vector y.\n*\n*  INCY   - INTEGER.\n*           On entry, INCY specifies the increment for the elements of\n*           Y. INCY must not be zero.\n*           Unchanged on exit.\n*\n*  Further Details\n*  ===============\n*\n*  Level 2 Blas routine.\n*\n*  -- Written on 22-October-1986.\n*     Jack Dongarra, Argonne National Lab.\n*     Jeremy Du Croz, Nag Central Office.\n*     Sven Hammarling, Nag Central Office.\n*     Richard Hanson, Sandia National Labs.\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      DOUBLE COMPLEX ONE\n      PARAMETER (ONE= (1.0D+0,0.0D+0))\n      DOUBLE COMPLEX ZERO\n      PARAMETER (ZERO= (0.0D+0,0.0D+0))\n*     ..\n*     .. Local Scalars ..\n      DOUBLE COMPLEX TEMP1,TEMP2\n      INTEGER I,INFO,IX,IY,J,JX,JY,KPLUS1,KX,KY,L\n*     ..\n*     .. External Functions ..\n      LOGICAL LSAME\n      EXTERNAL LSAME\n*     ..\n*     .. External Subroutines ..\n      EXTERNAL XERBLA\n*     ..\n*     .. Intrinsic Functions ..\n      INTRINSIC DBLE,DCONJG,MAX,MIN\n*     ..\n*\n*     Test the input parameters.\n*\n      INFO = 0\n      IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN\n          INFO = 1\n      ELSE IF (N.LT.0) THEN\n          INFO = 2\n      ELSE IF (K.LT.0) THEN\n          INFO = 3\n      ELSE IF (LDA.LT. (K+1)) THEN\n          INFO = 6\n      ELSE IF (INCX.EQ.0) THEN\n          INFO = 8\n      ELSE IF (INCY.EQ.0) THEN\n          INFO = 11\n      END IF\n      IF (INFO.NE.0) THEN\n          CALL XERBLA('ZHBMV ',INFO)\n          RETURN\n      END IF\n*\n*     Quick return if possible.\n*\n      IF ((N.EQ.0) .OR. ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN\n*\n*     Set up the start points in  X  and  Y.\n*\n      IF (INCX.GT.0) THEN\n          KX = 1\n      ELSE\n          KX = 1 - (N-1)*INCX\n      END IF\n      IF (INCY.GT.0) THEN\n          KY = 1\n      ELSE\n          KY = 1 - (N-1)*INCY\n      END IF\n*\n*     Start the operations. In this version the elements of the array A\n*     are accessed sequentially with one pass through A.\n*\n*     First form  y := beta*y.\n*\n      IF (BETA.NE.ONE) THEN\n          IF (INCY.EQ.1) THEN\n              IF (BETA.EQ.ZERO) THEN\n                  DO 10 I = 1,N\n                      Y(I) = ZERO\n   10             CONTINUE\n              ELSE\n                  DO 20 I = 1,N\n                      Y(I) = BETA*Y(I)\n   20             CONTINUE\n              END IF\n          ELSE\n              IY = KY\n              IF (BETA.EQ.ZERO) THEN\n                  DO 30 I = 1,N\n                      Y(IY) = ZERO\n                      IY = IY + INCY\n   30             CONTINUE\n              ELSE\n                  DO 40 I = 1,N\n                      Y(IY) = BETA*Y(IY)\n                      IY = IY + INCY\n   40             CONTINUE\n              END IF\n          END IF\n      END IF\n      IF (ALPHA.EQ.ZERO) RETURN\n      IF (LSAME(UPLO,'U')) THEN\n*\n*        Form  y  when upper triangle of A is stored.\n*\n          KPLUS1 = K + 1\n          IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THEN\n              DO 60 J = 1,N\n                  TEMP1 = ALPHA*X(J)\n                  TEMP2 = ZERO\n                  L = KPLUS1 - J\n                  DO 50 I = MAX(1,J-K),J - 1\n                      Y(I) = Y(I) + TEMP1*A(L+I,J)\n                      TEMP2 = TEMP2 + DCONJG(A(L+I,J))*X(I)\n   50             CONTINUE\n                  Y(J) = Y(J) + TEMP1*DBLE(A(KPLUS1,J)) + ALPHA*TEMP2\n   60         CONTINUE\n          ELSE\n              JX = KX\n              JY = KY\n              DO 80 J = 1,N\n                  TEMP1 = ALPHA*X(JX)\n                  TEMP2 = ZERO\n                  IX = KX\n                  IY = KY\n                  L = KPLUS1 - J\n                  DO 70 I = MAX(1,J-K),J - 1\n                      Y(IY) = Y(IY) + TEMP1*A(L+I,J)\n                      TEMP2 = TEMP2 + DCONJG(A(L+I,J))*X(IX)\n                      IX = IX + INCX\n                      IY = IY + INCY\n   70             CONTINUE\n                  Y(JY) = Y(JY) + TEMP1*DBLE(A(KPLUS1,J)) + ALPHA*TEMP2\n                  JX = JX + INCX\n                  JY = JY + INCY\n                  IF (J.GT.K) THEN\n                      KX = KX + INCX\n                      KY = KY + INCY\n                  END IF\n   80         CONTINUE\n          END IF\n      ELSE\n*\n*        Form  y  when lower triangle of A is stored.\n*\n          IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THEN\n              DO 100 J = 1,N\n                  TEMP1 = ALPHA*X(J)\n                  TEMP2 = ZERO\n                  Y(J) = Y(J) + TEMP1*DBLE(A(1,J))\n                  L = 1 - J\n                  DO 90 I = J + 1,MIN(N,J+K)\n                      Y(I) = Y(I) + TEMP1*A(L+I,J)\n                      TEMP2 = TEMP2 + DCONJG(A(L+I,J))*X(I)\n   90             CONTINUE\n                  Y(J) = Y(J) + ALPHA*TEMP2\n  100         CONTINUE\n          ELSE\n              JX = KX\n              JY = KY\n              DO 120 J = 1,N\n                  TEMP1 = ALPHA*X(JX)\n                  TEMP2 = ZERO\n                  Y(JY) = Y(JY) + TEMP1*DBLE(A(1,J))\n                  L = 1 - J\n                  IX = JX\n                  IY = JY\n                  DO 110 I = J + 1,MIN(N,J+K)\n                      IX = IX + INCX\n                      IY = IY + INCY\n                      Y(IY) = Y(IY) + TEMP1*A(L+I,J)\n                      TEMP2 = TEMP2 + DCONJG(A(L+I,J))*X(IX)\n  110             CONTINUE\n                  Y(JY) = Y(JY) + ALPHA*TEMP2\n                  JX = JX + INCX\n                  JY = JY + INCY\n  120         CONTINUE\n          END IF\n      END IF\n*\n      RETURN\n*\n*     End of ZHBMV .\n*\n      END\n"
  },
  {
    "path": "libs/eigen/blas/zhpmv.f",
    "content": "      SUBROUTINE ZHPMV(UPLO,N,ALPHA,AP,X,INCX,BETA,Y,INCY)\n*     .. Scalar Arguments ..\n      DOUBLE COMPLEX ALPHA,BETA\n      INTEGER INCX,INCY,N\n      CHARACTER UPLO\n*     ..\n*     .. Array Arguments ..\n      DOUBLE COMPLEX AP(*),X(*),Y(*)\n*     ..\n*\n*  Purpose\n*  =======\n*\n*  ZHPMV  performs the matrix-vector operation\n*\n*     y := alpha*A*x + beta*y,\n*\n*  where alpha and beta are scalars, x and y are n element vectors and\n*  A is an n by n hermitian matrix, supplied in packed form.\n*\n*  Arguments\n*  ==========\n*\n*  UPLO   - CHARACTER*1.\n*           On entry, UPLO specifies whether the upper or lower\n*           triangular part of the matrix A is supplied in the packed\n*           array AP as follows:\n*\n*              UPLO = 'U' or 'u'   The upper triangular part of A is\n*                                  supplied in AP.\n*\n*              UPLO = 'L' or 'l'   The lower triangular part of A is\n*                                  supplied in AP.\n*\n*           Unchanged on exit.\n*\n*  N      - INTEGER.\n*           On entry, N specifies the order of the matrix A.\n*           N must be at least zero.\n*           Unchanged on exit.\n*\n*  ALPHA  - COMPLEX*16      .\n*           On entry, ALPHA specifies the scalar alpha.\n*           Unchanged on exit.\n*\n*  AP     - COMPLEX*16       array of DIMENSION at least\n*           ( ( n*( n + 1 ) )/2 ).\n*           Before entry with UPLO = 'U' or 'u', the array AP must\n*           contain the upper triangular part of the hermitian matrix\n*           packed sequentially, column by column, so that AP( 1 )\n*           contains a( 1, 1 ), AP( 2 ) and AP( 3 ) contain a( 1, 2 )\n*           and a( 2, 2 ) respectively, and so on.\n*           Before entry with UPLO = 'L' or 'l', the array AP must\n*           contain the lower triangular part of the hermitian matrix\n*           packed sequentially, column by column, so that AP( 1 )\n*           contains a( 1, 1 ), AP( 2 ) and AP( 3 ) contain a( 2, 1 )\n*           and a( 3, 1 ) respectively, and so on.\n*           Note that the imaginary parts of the diagonal elements need\n*           not be set and are assumed to be zero.\n*           Unchanged on exit.\n*\n*  X      - COMPLEX*16       array of dimension at least\n*           ( 1 + ( n - 1 )*abs( INCX ) ).\n*           Before entry, the incremented array X must contain the n\n*           element vector x.\n*           Unchanged on exit.\n*\n*  INCX   - INTEGER.\n*           On entry, INCX specifies the increment for the elements of\n*           X. INCX must not be zero.\n*           Unchanged on exit.\n*\n*  BETA   - COMPLEX*16      .\n*           On entry, BETA specifies the scalar beta. When BETA is\n*           supplied as zero then Y need not be set on input.\n*           Unchanged on exit.\n*\n*  Y      - COMPLEX*16       array of dimension at least\n*           ( 1 + ( n - 1 )*abs( INCY ) ).\n*           Before entry, the incremented array Y must contain the n\n*           element vector y. On exit, Y is overwritten by the updated\n*           vector y.\n*\n*  INCY   - INTEGER.\n*           On entry, INCY specifies the increment for the elements of\n*           Y. INCY must not be zero.\n*           Unchanged on exit.\n*\n*  Further Details\n*  ===============\n*\n*  Level 2 Blas routine.\n*\n*  -- Written on 22-October-1986.\n*     Jack Dongarra, Argonne National Lab.\n*     Jeremy Du Croz, Nag Central Office.\n*     Sven Hammarling, Nag Central Office.\n*     Richard Hanson, Sandia National Labs.\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      DOUBLE COMPLEX ONE\n      PARAMETER (ONE= (1.0D+0,0.0D+0))\n      DOUBLE COMPLEX ZERO\n      PARAMETER (ZERO= (0.0D+0,0.0D+0))\n*     ..\n*     .. Local Scalars ..\n      DOUBLE COMPLEX TEMP1,TEMP2\n      INTEGER I,INFO,IX,IY,J,JX,JY,K,KK,KX,KY\n*     ..\n*     .. External Functions ..\n      LOGICAL LSAME\n      EXTERNAL LSAME\n*     ..\n*     .. External Subroutines ..\n      EXTERNAL XERBLA\n*     ..\n*     .. Intrinsic Functions ..\n      INTRINSIC DBLE,DCONJG\n*     ..\n*\n*     Test the input parameters.\n*\n      INFO = 0\n      IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN\n          INFO = 1\n      ELSE IF (N.LT.0) THEN\n          INFO = 2\n      ELSE IF (INCX.EQ.0) THEN\n          INFO = 6\n      ELSE IF (INCY.EQ.0) THEN\n          INFO = 9\n      END IF\n      IF (INFO.NE.0) THEN\n          CALL XERBLA('ZHPMV ',INFO)\n          RETURN\n      END IF\n*\n*     Quick return if possible.\n*\n      IF ((N.EQ.0) .OR. ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN\n*\n*     Set up the start points in  X  and  Y.\n*\n      IF (INCX.GT.0) THEN\n          KX = 1\n      ELSE\n          KX = 1 - (N-1)*INCX\n      END IF\n      IF (INCY.GT.0) THEN\n          KY = 1\n      ELSE\n          KY = 1 - (N-1)*INCY\n      END IF\n*\n*     Start the operations. In this version the elements of the array AP\n*     are accessed sequentially with one pass through AP.\n*\n*     First form  y := beta*y.\n*\n      IF (BETA.NE.ONE) THEN\n          IF (INCY.EQ.1) THEN\n              IF (BETA.EQ.ZERO) THEN\n                  DO 10 I = 1,N\n                      Y(I) = ZERO\n   10             CONTINUE\n              ELSE\n                  DO 20 I = 1,N\n                      Y(I) = BETA*Y(I)\n   20             CONTINUE\n              END IF\n          ELSE\n              IY = KY\n              IF (BETA.EQ.ZERO) THEN\n                  DO 30 I = 1,N\n                      Y(IY) = ZERO\n                      IY = IY + INCY\n   30             CONTINUE\n              ELSE\n                  DO 40 I = 1,N\n                      Y(IY) = BETA*Y(IY)\n                      IY = IY + INCY\n   40             CONTINUE\n              END IF\n          END IF\n      END IF\n      IF (ALPHA.EQ.ZERO) RETURN\n      KK = 1\n      IF (LSAME(UPLO,'U')) THEN\n*\n*        Form  y  when AP contains the upper triangle.\n*\n          IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THEN\n              DO 60 J = 1,N\n                  TEMP1 = ALPHA*X(J)\n                  TEMP2 = ZERO\n                  K = KK\n                  DO 50 I = 1,J - 1\n                      Y(I) = Y(I) + TEMP1*AP(K)\n                      TEMP2 = TEMP2 + DCONJG(AP(K))*X(I)\n                      K = K + 1\n   50             CONTINUE\n                  Y(J) = Y(J) + TEMP1*DBLE(AP(KK+J-1)) + ALPHA*TEMP2\n                  KK = KK + J\n   60         CONTINUE\n          ELSE\n              JX = KX\n              JY = KY\n              DO 80 J = 1,N\n                  TEMP1 = ALPHA*X(JX)\n                  TEMP2 = ZERO\n                  IX = KX\n                  IY = KY\n                  DO 70 K = KK,KK + J - 2\n                      Y(IY) = Y(IY) + TEMP1*AP(K)\n                      TEMP2 = TEMP2 + DCONJG(AP(K))*X(IX)\n                      IX = IX + INCX\n                      IY = IY + INCY\n   70             CONTINUE\n                  Y(JY) = Y(JY) + TEMP1*DBLE(AP(KK+J-1)) + ALPHA*TEMP2\n                  JX = JX + INCX\n                  JY = JY + INCY\n                  KK = KK + J\n   80         CONTINUE\n          END IF\n      ELSE\n*\n*        Form  y  when AP contains the lower triangle.\n*\n          IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THEN\n              DO 100 J = 1,N\n                  TEMP1 = ALPHA*X(J)\n                  TEMP2 = ZERO\n                  Y(J) = Y(J) + TEMP1*DBLE(AP(KK))\n                  K = KK + 1\n                  DO 90 I = J + 1,N\n                      Y(I) = Y(I) + TEMP1*AP(K)\n                      TEMP2 = TEMP2 + DCONJG(AP(K))*X(I)\n                      K = K + 1\n   90             CONTINUE\n                  Y(J) = Y(J) + ALPHA*TEMP2\n                  KK = KK + (N-J+1)\n  100         CONTINUE\n          ELSE\n              JX = KX\n              JY = KY\n              DO 120 J = 1,N\n                  TEMP1 = ALPHA*X(JX)\n                  TEMP2 = ZERO\n                  Y(JY) = Y(JY) + TEMP1*DBLE(AP(KK))\n                  IX = JX\n                  IY = JY\n                  DO 110 K = KK + 1,KK + N - J\n                      IX = IX + INCX\n                      IY = IY + INCY\n                      Y(IY) = Y(IY) + TEMP1*AP(K)\n                      TEMP2 = TEMP2 + DCONJG(AP(K))*X(IX)\n  110             CONTINUE\n                  Y(JY) = Y(JY) + ALPHA*TEMP2\n                  JX = JX + INCX\n                  JY = JY + INCY\n                  KK = KK + (N-J+1)\n  120         CONTINUE\n          END IF\n      END IF\n*\n      RETURN\n*\n*     End of ZHPMV .\n*\n      END\n"
  },
  {
    "path": "libs/eigen/blas/ztbmv.f",
    "content": "      SUBROUTINE ZTBMV(UPLO,TRANS,DIAG,N,K,A,LDA,X,INCX)\n*     .. Scalar Arguments ..\n      INTEGER INCX,K,LDA,N\n      CHARACTER DIAG,TRANS,UPLO\n*     ..\n*     .. Array Arguments ..\n      DOUBLE COMPLEX A(LDA,*),X(*)\n*     ..\n*\n*  Purpose\n*  =======\n*\n*  ZTBMV  performs one of the matrix-vector operations\n*\n*     x := A*x,   or   x := A'*x,   or   x := conjg( A' )*x,\n*\n*  where x is an n element vector and  A is an n by n unit, or non-unit,\n*  upper or lower triangular band matrix, with ( k + 1 ) diagonals.\n*\n*  Arguments\n*  ==========\n*\n*  UPLO   - CHARACTER*1.\n*           On entry, UPLO specifies whether the matrix is an upper or\n*           lower triangular matrix as follows:\n*\n*              UPLO = 'U' or 'u'   A is an upper triangular matrix.\n*\n*              UPLO = 'L' or 'l'   A is a lower triangular matrix.\n*\n*           Unchanged on exit.\n*\n*  TRANS  - CHARACTER*1.\n*           On entry, TRANS specifies the operation to be performed as\n*           follows:\n*\n*              TRANS = 'N' or 'n'   x := A*x.\n*\n*              TRANS = 'T' or 't'   x := A'*x.\n*\n*              TRANS = 'C' or 'c'   x := conjg( A' )*x.\n*\n*           Unchanged on exit.\n*\n*  DIAG   - CHARACTER*1.\n*           On entry, DIAG specifies whether or not A is unit\n*           triangular as follows:\n*\n*              DIAG = 'U' or 'u'   A is assumed to be unit triangular.\n*\n*              DIAG = 'N' or 'n'   A is not assumed to be unit\n*                                  triangular.\n*\n*           Unchanged on exit.\n*\n*  N      - INTEGER.\n*           On entry, N specifies the order of the matrix A.\n*           N must be at least zero.\n*           Unchanged on exit.\n*\n*  K      - INTEGER.\n*           On entry with UPLO = 'U' or 'u', K specifies the number of\n*           super-diagonals of the matrix A.\n*           On entry with UPLO = 'L' or 'l', K specifies the number of\n*           sub-diagonals of the matrix A.\n*           K must satisfy  0 .le. K.\n*           Unchanged on exit.\n*\n*  A      - COMPLEX*16       array of DIMENSION ( LDA, n ).\n*           Before entry with UPLO = 'U' or 'u', the leading ( k + 1 )\n*           by n part of the array A must contain the upper triangular\n*           band part of the matrix of coefficients, supplied column by\n*           column, with the leading diagonal of the matrix in row\n*           ( k + 1 ) of the array, the first super-diagonal starting at\n*           position 2 in row k, and so on. The top left k by k triangle\n*           of the array A is not referenced.\n*           The following program segment will transfer an upper\n*           triangular band matrix from conventional full matrix storage\n*           to band storage:\n*\n*                 DO 20, J = 1, N\n*                    M = K + 1 - J\n*                    DO 10, I = MAX( 1, J - K ), J\n*                       A( M + I, J ) = matrix( I, J )\n*              10    CONTINUE\n*              20 CONTINUE\n*\n*           Before entry with UPLO = 'L' or 'l', the leading ( k + 1 )\n*           by n part of the array A must contain the lower triangular\n*           band part of the matrix of coefficients, supplied column by\n*           column, with the leading diagonal of the matrix in row 1 of\n*           the array, the first sub-diagonal starting at position 1 in\n*           row 2, and so on. The bottom right k by k triangle of the\n*           array A is not referenced.\n*           The following program segment will transfer a lower\n*           triangular band matrix from conventional full matrix storage\n*           to band storage:\n*\n*                 DO 20, J = 1, N\n*                    M = 1 - J\n*                    DO 10, I = J, MIN( N, J + K )\n*                       A( M + I, J ) = matrix( I, J )\n*              10    CONTINUE\n*              20 CONTINUE\n*\n*           Note that when DIAG = 'U' or 'u' the elements of the array A\n*           corresponding to the diagonal elements of the matrix are not\n*           referenced, but are assumed to be unity.\n*           Unchanged on exit.\n*\n*  LDA    - INTEGER.\n*           On entry, LDA specifies the first dimension of A as declared\n*           in the calling (sub) program. LDA must be at least\n*           ( k + 1 ).\n*           Unchanged on exit.\n*\n*  X      - COMPLEX*16       array of dimension at least\n*           ( 1 + ( n - 1 )*abs( INCX ) ).\n*           Before entry, the incremented array X must contain the n\n*           element vector x. On exit, X is overwritten with the\n*           tranformed vector x.\n*\n*  INCX   - INTEGER.\n*           On entry, INCX specifies the increment for the elements of\n*           X. INCX must not be zero.\n*           Unchanged on exit.\n*\n*  Further Details\n*  ===============\n*\n*  Level 2 Blas routine.\n*\n*  -- Written on 22-October-1986.\n*     Jack Dongarra, Argonne National Lab.\n*     Jeremy Du Croz, Nag Central Office.\n*     Sven Hammarling, Nag Central Office.\n*     Richard Hanson, Sandia National Labs.\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      DOUBLE COMPLEX ZERO\n      PARAMETER (ZERO= (0.0D+0,0.0D+0))\n*     ..\n*     .. Local Scalars ..\n      DOUBLE COMPLEX TEMP\n      INTEGER I,INFO,IX,J,JX,KPLUS1,KX,L\n      LOGICAL NOCONJ,NOUNIT\n*     ..\n*     .. External Functions ..\n      LOGICAL LSAME\n      EXTERNAL LSAME\n*     ..\n*     .. External Subroutines ..\n      EXTERNAL XERBLA\n*     ..\n*     .. Intrinsic Functions ..\n      INTRINSIC DCONJG,MAX,MIN\n*     ..\n*\n*     Test the input parameters.\n*\n      INFO = 0\n      IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN\n          INFO = 1\n      ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND.\n     +         .NOT.LSAME(TRANS,'C')) THEN\n          INFO = 2\n      ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN\n          INFO = 3\n      ELSE IF (N.LT.0) THEN\n          INFO = 4\n      ELSE IF (K.LT.0) THEN\n          INFO = 5\n      ELSE IF (LDA.LT. (K+1)) THEN\n          INFO = 7\n      ELSE IF (INCX.EQ.0) THEN\n          INFO = 9\n      END IF\n      IF (INFO.NE.0) THEN\n          CALL XERBLA('ZTBMV ',INFO)\n          RETURN\n      END IF\n*\n*     Quick return if possible.\n*\n      IF (N.EQ.0) RETURN\n*\n      NOCONJ = LSAME(TRANS,'T')\n      NOUNIT = LSAME(DIAG,'N')\n*\n*     Set up the start point in X if the increment is not unity. This\n*     will be  ( N - 1 )*INCX   too small for descending loops.\n*\n      IF (INCX.LE.0) THEN\n          KX = 1 - (N-1)*INCX\n      ELSE IF (INCX.NE.1) THEN\n          KX = 1\n      END IF\n*\n*     Start the operations. In this version the elements of A are\n*     accessed sequentially with one pass through A.\n*\n      IF (LSAME(TRANS,'N')) THEN\n*\n*         Form  x := A*x.\n*\n          IF (LSAME(UPLO,'U')) THEN\n              KPLUS1 = K + 1\n              IF (INCX.EQ.1) THEN\n                  DO 20 J = 1,N\n                      IF (X(J).NE.ZERO) THEN\n                          TEMP = X(J)\n                          L = KPLUS1 - J\n                          DO 10 I = MAX(1,J-K),J - 1\n                              X(I) = X(I) + TEMP*A(L+I,J)\n   10                     CONTINUE\n                          IF (NOUNIT) X(J) = X(J)*A(KPLUS1,J)\n                      END IF\n   20             CONTINUE\n              ELSE\n                  JX = KX\n                  DO 40 J = 1,N\n                      IF (X(JX).NE.ZERO) THEN\n                          TEMP = X(JX)\n                          IX = KX\n                          L = KPLUS1 - J\n                          DO 30 I = MAX(1,J-K),J - 1\n                              X(IX) = X(IX) + TEMP*A(L+I,J)\n                              IX = IX + INCX\n   30                     CONTINUE\n                          IF (NOUNIT) X(JX) = X(JX)*A(KPLUS1,J)\n                      END IF\n                      JX = JX + INCX\n                      IF (J.GT.K) KX = KX + INCX\n   40             CONTINUE\n              END IF\n          ELSE\n              IF (INCX.EQ.1) THEN\n                  DO 60 J = N,1,-1\n                      IF (X(J).NE.ZERO) THEN\n                          TEMP = X(J)\n                          L = 1 - J\n                          DO 50 I = MIN(N,J+K),J + 1,-1\n                              X(I) = X(I) + TEMP*A(L+I,J)\n   50                     CONTINUE\n                          IF (NOUNIT) X(J) = X(J)*A(1,J)\n                      END IF\n   60             CONTINUE\n              ELSE\n                  KX = KX + (N-1)*INCX\n                  JX = KX\n                  DO 80 J = N,1,-1\n                      IF (X(JX).NE.ZERO) THEN\n                          TEMP = X(JX)\n                          IX = KX\n                          L = 1 - J\n                          DO 70 I = MIN(N,J+K),J + 1,-1\n                              X(IX) = X(IX) + TEMP*A(L+I,J)\n                              IX = IX - INCX\n   70                     CONTINUE\n                          IF (NOUNIT) X(JX) = X(JX)*A(1,J)\n                      END IF\n                      JX = JX - INCX\n                      IF ((N-J).GE.K) KX = KX - INCX\n   80             CONTINUE\n              END IF\n          END IF\n      ELSE\n*\n*        Form  x := A'*x  or  x := conjg( A' )*x.\n*\n          IF (LSAME(UPLO,'U')) THEN\n              KPLUS1 = K + 1\n              IF (INCX.EQ.1) THEN\n                  DO 110 J = N,1,-1\n                      TEMP = X(J)\n                      L = KPLUS1 - J\n                      IF (NOCONJ) THEN\n                          IF (NOUNIT) TEMP = TEMP*A(KPLUS1,J)\n                          DO 90 I = J - 1,MAX(1,J-K),-1\n                              TEMP = TEMP + A(L+I,J)*X(I)\n   90                     CONTINUE\n                      ELSE\n                          IF (NOUNIT) TEMP = TEMP*DCONJG(A(KPLUS1,J))\n                          DO 100 I = J - 1,MAX(1,J-K),-1\n                              TEMP = TEMP + DCONJG(A(L+I,J))*X(I)\n  100                     CONTINUE\n                      END IF\n                      X(J) = TEMP\n  110             CONTINUE\n              ELSE\n                  KX = KX + (N-1)*INCX\n                  JX = KX\n                  DO 140 J = N,1,-1\n                      TEMP = X(JX)\n                      KX = KX - INCX\n                      IX = KX\n                      L = KPLUS1 - J\n                      IF (NOCONJ) THEN\n                          IF (NOUNIT) TEMP = TEMP*A(KPLUS1,J)\n                          DO 120 I = J - 1,MAX(1,J-K),-1\n                              TEMP = TEMP + A(L+I,J)*X(IX)\n                              IX = IX - INCX\n  120                     CONTINUE\n                      ELSE\n                          IF (NOUNIT) TEMP = TEMP*DCONJG(A(KPLUS1,J))\n                          DO 130 I = J - 1,MAX(1,J-K),-1\n                              TEMP = TEMP + DCONJG(A(L+I,J))*X(IX)\n                              IX = IX - INCX\n  130                     CONTINUE\n                      END IF\n                      X(JX) = TEMP\n                      JX = JX - INCX\n  140             CONTINUE\n              END IF\n          ELSE\n              IF (INCX.EQ.1) THEN\n                  DO 170 J = 1,N\n                      TEMP = X(J)\n                      L = 1 - J\n                      IF (NOCONJ) THEN\n                          IF (NOUNIT) TEMP = TEMP*A(1,J)\n                          DO 150 I = J + 1,MIN(N,J+K)\n                              TEMP = TEMP + A(L+I,J)*X(I)\n  150                     CONTINUE\n                      ELSE\n                          IF (NOUNIT) TEMP = TEMP*DCONJG(A(1,J))\n                          DO 160 I = J + 1,MIN(N,J+K)\n                              TEMP = TEMP + DCONJG(A(L+I,J))*X(I)\n  160                     CONTINUE\n                      END IF\n                      X(J) = TEMP\n  170             CONTINUE\n              ELSE\n                  JX = KX\n                  DO 200 J = 1,N\n                      TEMP = X(JX)\n                      KX = KX + INCX\n                      IX = KX\n                      L = 1 - J\n                      IF (NOCONJ) THEN\n                          IF (NOUNIT) TEMP = TEMP*A(1,J)\n                          DO 180 I = J + 1,MIN(N,J+K)\n                              TEMP = TEMP + A(L+I,J)*X(IX)\n                              IX = IX + INCX\n  180                     CONTINUE\n                      ELSE\n                          IF (NOUNIT) TEMP = TEMP*DCONJG(A(1,J))\n                          DO 190 I = J + 1,MIN(N,J+K)\n                              TEMP = TEMP + DCONJG(A(L+I,J))*X(IX)\n                              IX = IX + INCX\n  190                     CONTINUE\n                      END IF\n                      X(JX) = TEMP\n                      JX = JX + INCX\n  200             CONTINUE\n              END IF\n          END IF\n      END IF\n*\n      RETURN\n*\n*     End of ZTBMV .\n*\n      END\n"
  },
  {
    "path": "libs/eigen/cmake/EigenConfigureTesting.cmake",
    "content": "include(EigenTesting)\ninclude(CheckCXXSourceCompiles)\n\n# configure the \"site\" and \"buildname\"\nei_set_sitename()\n\n# retrieve and store the build string\nei_set_build_string()\n\nadd_custom_target(buildtests)\nadd_custom_target(check COMMAND \"ctest\")\nadd_dependencies(check buildtests)\n\n# check whether /bin/bash exists\nfind_file(EIGEN_BIN_BASH_EXISTS \"/bin/bash\" PATHS \"/\" NO_DEFAULT_PATH)\n\n# This call activates testing and generates the DartConfiguration.tcl\ninclude(CTest)\n\nset(EIGEN_TEST_BUILD_FLAGS \"\" CACHE STRING \"Options passed to the build command of unit tests\")\n\n# Overwrite default DartConfiguration.tcl such that ctest can build our unit tests.\n# Recall that our unit tests are not in the \"all\" target, so we have to explicitely ask ctest to build our custom 'buildtests' target.\n# At this stage, we can also add custom flags to the build tool through the user defined EIGEN_TEST_BUILD_FLAGS variable.\nfile(READ  \"${CMAKE_CURRENT_BINARY_DIR}/DartConfiguration.tcl\" EIGEN_DART_CONFIG_FILE)\n# try to grab the default flags\nstring(REGEX MATCH \"MakeCommand:.*-- (.*)\\nDefaultCTestConfigurationType\" EIGEN_DUMMY ${EIGEN_DART_CONFIG_FILE})\nif(NOT CMAKE_MATCH_1)\nstring(REGEX MATCH \"MakeCommand:.*[^c]make (.*)\\nDefaultCTestConfigurationType\" EIGEN_DUMMY ${EIGEN_DART_CONFIG_FILE})\nendif()\nstring(REGEX REPLACE \"MakeCommand:.*DefaultCTestConfigurationType\" \"MakeCommand: ${CMAKE_COMMAND} --build . --target buildtests --config \\\"\\${CTEST_CONFIGURATION_TYPE}\\\" -- ${CMAKE_MATCH_1} ${EIGEN_TEST_BUILD_FLAGS}\\nDefaultCTestConfigurationType\"\n       EIGEN_DART_CONFIG_FILE2 ${EIGEN_DART_CONFIG_FILE})\nfile(WRITE \"${CMAKE_CURRENT_BINARY_DIR}/DartConfiguration.tcl\" ${EIGEN_DART_CONFIG_FILE2})\n\nconfigure_file(${CMAKE_CURRENT_SOURCE_DIR}/CTestCustom.cmake.in ${CMAKE_BINARY_DIR}/CTestCustom.cmake)\n\n# some documentation of this function would be nice\nei_init_testing()\n\n# configure Eigen related testing options\noption(EIGEN_NO_ASSERTION_CHECKING \"Disable checking of assertions using exceptions\" OFF)\noption(EIGEN_DEBUG_ASSERTS \"Enable advanced debuging of assertions\" OFF)\n\nif(CMAKE_COMPILER_IS_GNUCXX)\n  option(EIGEN_COVERAGE_TESTING \"Enable/disable gcov\" OFF)\n  if(EIGEN_COVERAGE_TESTING)\n    set(COVERAGE_FLAGS \"-fprofile-arcs -ftest-coverage\")\n    set(CTEST_CUSTOM_COVERAGE_EXCLUDE \"/test/\")\n  else(EIGEN_COVERAGE_TESTING)\n    set(COVERAGE_FLAGS \"\")\n  endif(EIGEN_COVERAGE_TESTING)\n  if(EIGEN_TEST_C++0x)\n    set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -std=gnu++0x\")\n  endif(EIGEN_TEST_C++0x)\n  if(CMAKE_SYSTEM_NAME MATCHES Linux)\n    set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} ${COVERAGE_FLAGS} -g2\")\n    set(CMAKE_CXX_FLAGS_RELWITHDEBINFO \"${CMAKE_CXX_FLAGS_RELWITHDEBINFO} ${COVERAGE_FLAGS} -O2 -g2\")\n    set(CMAKE_CXX_FLAGS_RELEASE \"${CMAKE_CXX_FLAGS_RELEASE} ${COVERAGE_FLAGS} -fno-inline-functions\")\n    set(CMAKE_CXX_FLAGS_DEBUG \"${CMAKE_CXX_FLAGS_DEBUG} ${COVERAGE_FLAGS} -O0 -g3\")\n  endif(CMAKE_SYSTEM_NAME MATCHES Linux)\nelseif(MSVC)\n  set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} /D_CRT_SECURE_NO_WARNINGS /D_SCL_SECURE_NO_WARNINGS\")\nendif(CMAKE_COMPILER_IS_GNUCXX)\n"
  },
  {
    "path": "libs/eigen/cmake/EigenDetermineOSVersion.cmake",
    "content": "# The utility function DetermineOSVersion aims at providing an\n# improved version of the CMake variable ${CMAKE_SYSTEM} on Windows\n# machines.\n#\n# Usage:\n#  include(EigenDetermineOSVersion)\n#  DetermineOSVersion(OS_VERSION)\n#  message(\"OS: ${OS_VERSION}\")\n\n# - A little helper variable which should not be directly called\nfunction(DetermineShortWindowsName WIN_VERSION win_num_version)\n   if    (${win_num_version} VERSION_EQUAL \"6.1\")\n       set(_version \"win7\")\n   elseif(${win_num_version} VERSION_EQUAL \"6.0\")\n       set(_version \"winVista\")\n   elseif(${win_num_version} VERSION_EQUAL \"5.2\")\n       set(_version \"winXpProf\")\n   elseif(${win_num_version} VERSION_EQUAL \"5.1\")\n       set(_version \"winXp\")\n   elseif(${win_num_version} VERSION_EQUAL \"5.0\")\n       set(_version \"win2000Prof\")\n   else()\n       set(_version \"unknownWin\")\n   endif()\n   set(${WIN_VERSION} ${_version} PARENT_SCOPE)\nendfunction()\n\nfunction(DetermineOSVersion OS_VERSION)\n  if (WIN32 AND CMAKE_HOST_SYSTEM_NAME MATCHES Windows)\n    file (TO_NATIVE_PATH \"$ENV{COMSPEC}\" SHELL)\n    exec_program( ${SHELL} ARGS \"/c\" \"ver\" OUTPUT_VARIABLE ver_output)\n\t\t\t\t\n      string(REGEX MATCHALL \"[0-9]+\"\n           ver_list \"${ver_output}\")\n      list(GET ver_list 0 _major)\t\t   \n      list(GET ver_list 1 _minor)\n\t\t\t\t\n    set(win_num_version ${_major}.${_minor})\n    DetermineShortWindowsName(win_version \"${win_num_version}\")\n    if(win_version)\n      set(${OS_VERSION} ${win_version} PARENT_SCOPE)\n    endif()\n  else()\n    set(${OS_VERSION} ${CMAKE_SYSTEM} PARENT_SCOPE)\n  endif()\nendfunction()\n"
  },
  {
    "path": "libs/eigen/cmake/EigenDetermineVSServicePack.cmake",
    "content": "include(CMakeDetermineVSServicePack)\n\n# The code is almost identical to the CMake version. The only difference is that we remove\n# _DetermineVSServicePack_FastCheckVersionWithCompiler which lead to errors on some systems.\nfunction(EigenDetermineVSServicePack _pack)\n    if(NOT DETERMINED_VS_SERVICE_PACK OR NOT ${_pack})\n\n        if(NOT DETERMINED_VS_SERVICE_PACK)\n            _DetermineVSServicePack_CheckVersionWithTryCompile(DETERMINED_VS_SERVICE_PACK _cl_version)\n            if(NOT DETERMINED_VS_SERVICE_PACK)\n                _DetermineVSServicePack_CheckVersionWithTryRun(DETERMINED_VS_SERVICE_PACK _cl_version)\n            endif()\n        endif()\n\n        if(DETERMINED_VS_SERVICE_PACK)\n\n            if(_cl_version)\n                # Call helper function to determine VS version\n                _DetermineVSServicePackFromCompiler(_sp \"${_cl_version}\")\n                if(_sp)\n                    set(${_pack} ${_sp} CACHE INTERNAL\n                        \"The Visual Studio Release with Service Pack\")\n                endif()\n            endif()\n        endif()\n    endif()\nendfunction()\n"
  },
  {
    "path": "libs/eigen/cmake/EigenTesting.cmake",
    "content": "\nmacro(ei_add_property prop value)\n  get_property(previous GLOBAL PROPERTY ${prop})  \n  if ((NOT previous) OR (previous STREQUAL \"\"))\n    set_property(GLOBAL PROPERTY ${prop} \"${value}\")\n  else()\n    set_property(GLOBAL PROPERTY ${prop} \"${previous} ${value}\")\n  endif()  \nendmacro(ei_add_property)\n\n#internal. See documentation of ei_add_test for details.\nmacro(ei_add_test_internal testname testname_with_suffix)\n  set(targetname ${testname_with_suffix})\n\n  set(filename ${testname}.cpp)\n  add_executable(${targetname} ${filename})\n  if (targetname MATCHES \"^eigen2_\")\n    add_dependencies(eigen2_buildtests ${targetname})\n  else()\n    add_dependencies(buildtests ${targetname})\n  endif()\n\n  if(EIGEN_NO_ASSERTION_CHECKING)\n    ei_add_target_property(${targetname} COMPILE_FLAGS \"-DEIGEN_NO_ASSERTION_CHECKING=1\")\n  else(EIGEN_NO_ASSERTION_CHECKING)\n    if(EIGEN_DEBUG_ASSERTS)\n      ei_add_target_property(${targetname} COMPILE_FLAGS \"-DEIGEN_DEBUG_ASSERTS=1\")\n    endif(EIGEN_DEBUG_ASSERTS)\n  endif(EIGEN_NO_ASSERTION_CHECKING)\n  \n  ei_add_target_property(${targetname} COMPILE_FLAGS \"-DEIGEN_TEST_MAX_SIZE=${EIGEN_TEST_MAX_SIZE}\")\n\n  ei_add_target_property(${targetname} COMPILE_FLAGS \"-DEIGEN_TEST_FUNC=${testname}\")\n  \n  if(MSVC AND NOT EIGEN_SPLIT_LARGE_TESTS)\n    ei_add_target_property(${targetname} COMPILE_FLAGS \"/bigobj\")\n  endif()  \n\n  # let the user pass flags.\n  if(${ARGC} GREATER 2)\n    ei_add_target_property(${targetname} COMPILE_FLAGS \"${ARGV2}\")\n  endif(${ARGC} GREATER 2)\n  \n  if(EIGEN_TEST_CUSTOM_CXX_FLAGS)\n    ei_add_target_property(${targetname} COMPILE_FLAGS \"${EIGEN_TEST_CUSTOM_CXX_FLAGS}\")\n  endif()\n\n  if(EIGEN_STANDARD_LIBRARIES_TO_LINK_TO)\n    target_link_libraries(${targetname} ${EIGEN_STANDARD_LIBRARIES_TO_LINK_TO})\n  endif()\n  if(EXTERNAL_LIBS)\n    target_link_libraries(${targetname} ${EXTERNAL_LIBS})\n  endif()\n  if(EIGEN_TEST_CUSTOM_LINKER_FLAGS)\n    target_link_libraries(${targetname} ${EIGEN_TEST_CUSTOM_LINKER_FLAGS})\n  endif()\n\n  if(${ARGC} GREATER 3)\n    set(libs_to_link ${ARGV3})\n    # it could be that some cmake module provides a bad library string \" \"  (just spaces),\n    # and that severely breaks target_link_libraries (\"can't link to -l-lstdc++\" errors).\n    # so we check for strings containing only spaces.\n    string(STRIP \"${libs_to_link}\" libs_to_link_stripped)\n    string(LENGTH \"${libs_to_link_stripped}\" libs_to_link_stripped_length)\n    if(${libs_to_link_stripped_length} GREATER 0)\n      # notice: no double quotes around ${libs_to_link} here. It may be a list.\n      target_link_libraries(${targetname} ${libs_to_link})\n    endif()\n  endif() \n\n  if(EIGEN_BIN_BASH_EXISTS)\n    add_test(${testname_with_suffix} \"${Eigen_SOURCE_DIR}/test/runtest.sh\" \"${testname_with_suffix}\")\n  else()\n    add_test(${testname_with_suffix} \"${targetname}\")\n  endif()\n  \n  # Specify target and test labels accoirding to EIGEN_CURRENT_SUBPROJECT\n  get_property(current_subproject GLOBAL PROPERTY EIGEN_CURRENT_SUBPROJECT)  \n  if ((current_subproject) AND (NOT (current_subproject STREQUAL \"\")))\n    set_property(TARGET ${targetname} PROPERTY LABELS \"Build${current_subproject}\")\n    add_dependencies(\"Build${current_subproject}\" ${targetname})\n    set_property(TEST ${testname_with_suffix} PROPERTY LABELS \"${current_subproject}\")\n  endif()\n\nendmacro(ei_add_test_internal)\n\n# Macro to add a test\n#\n# the unique mandatory parameter testname must correspond to a file\n# <testname>.cpp which follows this pattern:\n#\n# #include \"main.h\"\n# void test_<testname>() { ... }\n#\n# Depending on the contents of that file, this macro can have 2 behaviors,\n# see below.\n#\n# The optional 2nd parameter is libraries to link to.\n#\n# A. Default behavior\n#\n# this macro adds an executable <testname> as well as a ctest test\n# named <testname> too.\n#\n# On platforms with bash simply run:\n#   \"ctest -V\" or \"ctest -V -R <testname>\"\n# On other platform use ctest as usual\n#\n# B. Multi-part behavior\n#\n# If the source file matches the regexp\n#    CALL_SUBTEST_[0-9]+|EIGEN_TEST_PART_[0-9]+\n# then it is interpreted as a multi-part test. The behavior then depends on the\n# CMake option EIGEN_SPLIT_LARGE_TESTS, which is ON by default.\n#\n# If EIGEN_SPLIT_LARGE_TESTS is OFF, the behavior is the same as in A (the multi-part\n# aspect is ignored).\n#\n# If EIGEN_SPLIT_LARGE_TESTS is ON, the test is split into multiple executables\n#   test_<testname>_<N>\n# where N runs from 1 to the greatest occurence found in the source file. Each of these\n# executables is built passing -DEIGEN_TEST_PART_N. This allows to split large tests\n# into smaller executables.\n#\n# Moreover, targets <testname> are still generated, they\n# have the effect of building all the parts of the test.\n#\n# Again, ctest -R allows to run all matching tests.\nmacro(ei_add_test testname)\n  get_property(EIGEN_TESTS_LIST GLOBAL PROPERTY EIGEN_TESTS_LIST)\n  set(EIGEN_TESTS_LIST \"${EIGEN_TESTS_LIST}${testname}\\n\")\n  set_property(GLOBAL PROPERTY EIGEN_TESTS_LIST \"${EIGEN_TESTS_LIST}\")\n\n  file(READ \"${testname}.cpp\" test_source)\n  set(parts 0)\n  string(REGEX MATCHALL \"CALL_SUBTEST_[0-9]+|EIGEN_TEST_PART_[0-9]+|EIGEN_SUFFIXES(;[0-9]+)+\"\n         occurences \"${test_source}\")\n  string(REGEX REPLACE \"CALL_SUBTEST_|EIGEN_TEST_PART_|EIGEN_SUFFIXES\" \"\" suffixes \"${occurences}\")\n  list(REMOVE_DUPLICATES suffixes)\n  if(EIGEN_SPLIT_LARGE_TESTS AND suffixes)\n    add_custom_target(${testname})\n    foreach(suffix ${suffixes})\n      ei_add_test_internal(${testname} ${testname}_${suffix}\n        \"${ARGV1} -DEIGEN_TEST_PART_${suffix}=1\" \"${ARGV2}\")\n      add_dependencies(${testname} ${testname}_${suffix})\n    endforeach(suffix)\n  else(EIGEN_SPLIT_LARGE_TESTS AND suffixes)\n    set(symbols_to_enable_all_parts \"\")\n    foreach(suffix ${suffixes})\n      set(symbols_to_enable_all_parts\n        \"${symbols_to_enable_all_parts} -DEIGEN_TEST_PART_${suffix}=1\")\n    endforeach(suffix)\n    ei_add_test_internal(${testname} ${testname} \"${ARGV1} ${symbols_to_enable_all_parts}\" \"${ARGV2}\")\n  endif(EIGEN_SPLIT_LARGE_TESTS AND suffixes)\nendmacro(ei_add_test)\n\n\n# adds a failtest, i.e. a test that succeed if the program fails to compile\n# note that the test runner for these is CMake itself, when passed -DEIGEN_FAILTEST=ON\n# so here we're just running CMake commands immediately, we're not adding any targets.\nmacro(ei_add_failtest testname)\n  get_property(EIGEN_FAILTEST_FAILURE_COUNT GLOBAL PROPERTY EIGEN_FAILTEST_FAILURE_COUNT)\n  get_property(EIGEN_FAILTEST_COUNT GLOBAL PROPERTY EIGEN_FAILTEST_COUNT)\n\n  message(STATUS \"Checking failtest: ${testname}\")\n  set(filename \"${testname}.cpp\")\n  file(READ \"${filename}\" test_source)\n\n  try_compile(succeeds_when_it_should_fail\n              \"${CMAKE_CURRENT_BINARY_DIR}\"\n              \"${CMAKE_CURRENT_SOURCE_DIR}/${filename}\"\n              COMPILE_DEFINITIONS \"-DEIGEN_SHOULD_FAIL_TO_BUILD\")\n  if (succeeds_when_it_should_fail)\n    message(STATUS \"FAILED: ${testname} build succeeded when it should have failed\")\n  endif()\n\n  try_compile(succeeds_when_it_should_succeed\n              \"${CMAKE_CURRENT_BINARY_DIR}\"\n              \"${CMAKE_CURRENT_SOURCE_DIR}/${filename}\"\n              COMPILE_DEFINITIONS)\n  if (NOT succeeds_when_it_should_succeed)\n    message(STATUS \"FAILED: ${testname} build failed when it should have succeeded\")\n  endif()\n\n  if (succeeds_when_it_should_fail OR NOT succeeds_when_it_should_succeed)\n    math(EXPR EIGEN_FAILTEST_FAILURE_COUNT ${EIGEN_FAILTEST_FAILURE_COUNT}+1)\n  endif()\n\n  math(EXPR EIGEN_FAILTEST_COUNT ${EIGEN_FAILTEST_COUNT}+1)\n\n  set_property(GLOBAL PROPERTY EIGEN_FAILTEST_FAILURE_COUNT ${EIGEN_FAILTEST_FAILURE_COUNT})\n  set_property(GLOBAL PROPERTY EIGEN_FAILTEST_COUNT ${EIGEN_FAILTEST_COUNT})\nendmacro(ei_add_failtest)\n\n# print a summary of the different options\nmacro(ei_testing_print_summary)\n  message(STATUS \"************************************************************\")\n  message(STATUS \"***    Eigen's unit tests configuration summary          ***\")\n  message(STATUS \"************************************************************\")\n  message(STATUS \"\")\n  message(STATUS \"Build type:        ${CMAKE_BUILD_TYPE}\")\n  message(STATUS \"Build site:        ${SITE}\")\n  message(STATUS \"Build string:      ${BUILDNAME}\")\n  get_property(EIGEN_TESTING_SUMMARY GLOBAL PROPERTY EIGEN_TESTING_SUMMARY)\n  get_property(EIGEN_TESTED_BACKENDS GLOBAL PROPERTY EIGEN_TESTED_BACKENDS)\n  get_property(EIGEN_MISSING_BACKENDS GLOBAL PROPERTY EIGEN_MISSING_BACKENDS)\n  message(STATUS \"Enabled backends:  ${EIGEN_TESTED_BACKENDS}\")\n  message(STATUS \"Disabled backends: ${EIGEN_MISSING_BACKENDS}\")\n\n  if(EIGEN_DEFAULT_TO_ROW_MAJOR)\n    message(STATUS \"Default order:     Row-major\")\n  else()\n    message(STATUS \"Default order:     Column-major\")\n  endif()\n\n  if(EIGEN_TEST_NO_EXPLICIT_ALIGNMENT)\n    message(STATUS \"Explicit alignment (hence vectorization) disabled\")\n  elseif(EIGEN_TEST_NO_EXPLICIT_VECTORIZATION)\n    message(STATUS \"Explicit vectorization disabled (alignment kept enabled)\")\n  else()\n  \n  message(STATUS \"Maximal matrix/vector size: ${EIGEN_TEST_MAX_SIZE}\")\n\n    if(EIGEN_TEST_SSE2)\n      message(STATUS \"SSE2:              ON\")\n    else()\n      message(STATUS \"SSE2:              Using architecture defaults\")\n    endif()\n\n    if(EIGEN_TEST_SSE3)\n      message(STATUS \"SSE3:              ON\")\n    else()\n      message(STATUS \"SSE3:              Using architecture defaults\")\n    endif()\n\n    if(EIGEN_TEST_SSSE3)\n      message(STATUS \"SSSE3:             ON\")\n    else()\n      message(STATUS \"SSSE3:             Using architecture defaults\")\n    endif()\n\n    if(EIGEN_TEST_SSE4_1)\n      message(STATUS \"SSE4.1:            ON\")\n    else()\n      message(STATUS \"SSE4.1:            Using architecture defaults\")\n    endif()\n\n    if(EIGEN_TEST_SSE4_2)\n      message(STATUS \"SSE4.2:            ON\")\n    else()\n      message(STATUS \"SSE4.2:            Using architecture defaults\")\n    endif()\n\n    if(EIGEN_TEST_ALTIVEC)\n      message(STATUS \"Altivec:           ON\")\n    else()\n      message(STATUS \"Altivec:           Using architecture defaults\")\n    endif()\n\n    if(EIGEN_TEST_NEON)\n      message(STATUS \"ARM NEON:          ON\")\n    else()\n      message(STATUS \"ARM NEON:          Using architecture defaults\")\n    endif()\n\n  endif() # vectorization / alignment options\n\n  message(STATUS \"\\n${EIGEN_TESTING_SUMMARY}\")\n\n  message(STATUS \"************************************************************\")\nendmacro(ei_testing_print_summary)\n\nmacro(ei_init_testing)\n  define_property(GLOBAL PROPERTY EIGEN_CURRENT_SUBPROJECT BRIEF_DOCS \" \" FULL_DOCS \" \")\n  define_property(GLOBAL PROPERTY EIGEN_TESTED_BACKENDS BRIEF_DOCS \" \" FULL_DOCS \" \")\n  define_property(GLOBAL PROPERTY EIGEN_MISSING_BACKENDS BRIEF_DOCS \" \" FULL_DOCS \" \")\n  define_property(GLOBAL PROPERTY EIGEN_TESTING_SUMMARY BRIEF_DOCS \" \" FULL_DOCS \" \")\n  define_property(GLOBAL PROPERTY EIGEN_TESTS_LIST BRIEF_DOCS \" \" FULL_DOCS \" \")\n\n  set_property(GLOBAL PROPERTY EIGEN_TESTED_BACKENDS \"\")\n  set_property(GLOBAL PROPERTY EIGEN_MISSING_BACKENDS \"\")\n  set_property(GLOBAL PROPERTY EIGEN_TESTING_SUMMARY \"\")\n  set_property(GLOBAL PROPERTY EIGEN_TESTS_LIST \"\")\n\n  define_property(GLOBAL PROPERTY EIGEN_FAILTEST_FAILURE_COUNT BRIEF_DOCS \" \" FULL_DOCS \" \")\n  define_property(GLOBAL PROPERTY EIGEN_FAILTEST_COUNT BRIEF_DOCS \" \" FULL_DOCS \" \")\n\n  set_property(GLOBAL PROPERTY EIGEN_FAILTEST_FAILURE_COUNT \"0\")\n  set_property(GLOBAL PROPERTY EIGEN_FAILTEST_COUNT \"0\")\n  \n  # uncomment anytime you change the ei_get_compilerver_from_cxx_version_string macro\n  # ei_test_get_compilerver_from_cxx_version_string()\nendmacro(ei_init_testing)\n\nmacro(ei_set_sitename)\n  # if the sitename is not yet set, try to set it\n  if(NOT ${SITE} OR ${SITE} STREQUAL \"\")\n    set(eigen_computername $ENV{COMPUTERNAME})\n\tset(eigen_hostname $ENV{HOSTNAME})\n    if(eigen_hostname)\n      set(SITE ${eigen_hostname})\n\telseif(eigen_computername)\n\t  set(SITE ${eigen_computername})\n    endif()\n  endif()\n  # in case it is already set, enforce lower case\n  if(SITE)\n    string(TOLOWER ${SITE} SITE)\n  endif()  \nendmacro(ei_set_sitename)\n\nmacro(ei_get_compilerver VAR)\n  if(MSVC)\n    # on windows system, we use a modified CMake script  \n    include(EigenDetermineVSServicePack)\n    EigenDetermineVSServicePack( my_service_pack )\n\n    if( my_service_pack )\n      set(${VAR} ${my_service_pack})\n    else()\n      set(${VAR} \"na\")\n    endif()\n  else()\n    # on all other system we rely on ${CMAKE_CXX_COMPILER}\n    # supporting a \"--version\" or \"/version\" flag\n    \n    if(WIN32 AND ${CMAKE_CXX_COMPILER_ID} EQUAL \"Intel\")\n      set(EIGEN_CXX_FLAG_VERSION \"/version\")\n    else()\n      set(EIGEN_CXX_FLAG_VERSION \"--version\")\n    endif()\n    \n    execute_process(COMMAND ${CMAKE_CXX_COMPILER}  ${EIGEN_CXX_FLAG_VERSION}\n                    OUTPUT_VARIABLE eigen_cxx_compiler_version_string OUTPUT_STRIP_TRAILING_WHITESPACE)\n    string(REGEX REPLACE \"[\\n\\r].*\"  \"\"  eigen_cxx_compiler_version_string  ${eigen_cxx_compiler_version_string})\n    \n    ei_get_compilerver_from_cxx_version_string(\"${eigen_cxx_compiler_version_string}\" CNAME CVER)\n    set(${VAR} \"${CNAME}-${CVER}\")\n    \n  endif()\nendmacro(ei_get_compilerver)\n\n# Extract compiler name and version from a raw version string\n# WARNING: if you edit thid macro, then please test it by  uncommenting\n# the testing macro call in ei_init_testing() of the EigenTesting.cmake file.\n# See also the ei_test_get_compilerver_from_cxx_version_string macro at the end of the file\nmacro(ei_get_compilerver_from_cxx_version_string VERSTRING CNAME CVER)\n  # extract possible compiler names  \n  string(REGEX MATCH \"g\\\\+\\\\+\"      ei_has_gpp    ${VERSTRING})\n  string(REGEX MATCH \"llvm|LLVM\"    ei_has_llvm   ${VERSTRING})\n  string(REGEX MATCH \"gcc|GCC\"      ei_has_gcc    ${VERSTRING})\n  string(REGEX MATCH \"icpc|ICC\"     ei_has_icpc   ${VERSTRING})\n  string(REGEX MATCH \"clang|CLANG\"  ei_has_clang  ${VERSTRING})\n  \n  # combine them\n  if((ei_has_llvm) AND (ei_has_gpp OR ei_has_gcc))\n    set(${CNAME} \"llvm-g++\")\n  elseif((ei_has_llvm) AND (ei_has_clang))\n    set(${CNAME} \"llvm-clang++\")\n  elseif(ei_has_icpc)\n    set(${CNAME} \"icpc\")\n  elseif(ei_has_gpp OR ei_has_gcc)\n    set(${CNAME} \"g++\")\n  else()\n    set(${CNAME} \"_\")\n  endif()\n  \n  # extract possible version numbers\n  # first try to extract 3 isolated numbers:\n  string(REGEX MATCH \" [0-9]+\\\\.[0-9]+\\\\.[0-9]+\" eicver ${VERSTRING})\n  if(NOT eicver)\n    # try to extract 2 isolated ones:\n    string(REGEX MATCH \" [0-9]+\\\\.[0-9]+\" eicver ${VERSTRING})\n    if(NOT eicver)\n      # try to extract 3:\n      string(REGEX MATCH \"[^0-9][0-9]+\\\\.[0-9]+\\\\.[0-9]+\" eicver ${VERSTRING})\n      if(NOT eicver)\n        # try to extract 2:\n        string(REGEX MATCH \"[^0-9][0-9]+\\\\.[0-9]+\" eicver ${VERSTRING})\n      else()\n        set(eicver \" _\")\n      endif()\n    endif()\n  endif()\n  \n  string(REGEX REPLACE \".(.*)\" \"\\\\1\" ${CVER} ${eicver})\n  \nendmacro(ei_get_compilerver_from_cxx_version_string)\n\nmacro(ei_get_cxxflags VAR)\n  set(${VAR} \"\")\n  ei_is_64bit_env(IS_64BIT_ENV)\n  if(EIGEN_TEST_NEON)\n    set(${VAR} NEON)\n  elseif(EIGEN_TEST_ALTIVEC)\n    set(${VAR} ALVEC)\n  elseif(EIGEN_TEST_SSE4_2)\n    set(${VAR} SSE42)\n  elseif(EIGEN_TEST_SSE4_1)\n    set(${VAR} SSE41)\n  elseif(EIGEN_TEST_SSSE3)\n    set(${VAR} SSSE3)\n  elseif(EIGEN_TEST_SSE3)\n    set(${VAR} SSE3)\n  elseif(EIGEN_TEST_SSE2 OR IS_64BIT_ENV)\n    set(${VAR} SSE2)  \n  endif()\n\n  if(EIGEN_TEST_OPENMP)\n    if (${VAR} STREQUAL \"\")\n\t  set(${VAR} OMP)\n\telse()\n\t  set(${VAR} ${${VAR}}-OMP)\n\tendif()\n  endif()\n  \n  if(EIGEN_DEFAULT_TO_ROW_MAJOR)\n    if (${VAR} STREQUAL \"\")\n\t  set(${VAR} ROW)\n\telse()\n\t  set(${VAR} ${${VAR}}-ROWMAJ)\n\tendif()  \n  endif()\nendmacro(ei_get_cxxflags)\n\nmacro(ei_set_build_string)\n  ei_get_compilerver(LOCAL_COMPILER_VERSION)\n  ei_get_cxxflags(LOCAL_COMPILER_FLAGS)\n  \n  include(EigenDetermineOSVersion)\n  DetermineOSVersion(OS_VERSION)\n\n  set(TMP_BUILD_STRING ${OS_VERSION}-${LOCAL_COMPILER_VERSION})\n\n  if (NOT ${LOCAL_COMPILER_FLAGS} STREQUAL  \"\")\n    set(TMP_BUILD_STRING ${TMP_BUILD_STRING}-${LOCAL_COMPILER_FLAGS})\n  endif()\n\n  ei_is_64bit_env(IS_64BIT_ENV)\n  if(NOT IS_64BIT_ENV)\n    set(TMP_BUILD_STRING ${TMP_BUILD_STRING}-32bit)\n  else()\n    set(TMP_BUILD_STRING ${TMP_BUILD_STRING}-64bit)\n  endif()\n  \n  if(EIGEN_BUILD_STRING_SUFFIX)\n    set(TMP_BUILD_STRING ${TMP_BUILD_STRING}-${EIGEN_BUILD_STRING_SUFFIX})\n  endif()\n\n  string(TOLOWER ${TMP_BUILD_STRING} BUILDNAME)\nendmacro(ei_set_build_string)\n\nmacro(ei_is_64bit_env VAR)\n  if(CMAKE_SIZEOF_VOID_P EQUAL 8)\n    set(${VAR} 1)\n  elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)\n    set(${VAR} 0)\n  else()\n    message(WARNING \"Unsupported pointer size. Please contact the authors.\")\n  endif()\nendmacro(ei_is_64bit_env)\n\n\n# helper macro for testing ei_get_compilerver_from_cxx_version_string\n# STR: raw version string\n# REFNAME: expected compiler name\n# REFVER: expected compiler version\nmacro(ei_test1_get_compilerver_from_cxx_version_string STR REFNAME REFVER)\n  ei_get_compilerver_from_cxx_version_string(${STR} CNAME CVER)\n  if((NOT ${REFNAME} STREQUAL ${CNAME}) OR (NOT ${REFVER} STREQUAL ${CVER}))\n    message(\"STATUS ei_get_compilerver_from_cxx_version_string error:\")\n    message(\"Expected \\\"${REFNAME}-${REFVER}\\\", got \\\"${CNAME}-${CVER}\\\"\")\n  endif()\nendmacro(ei_test1_get_compilerver_from_cxx_version_string)\n\n# macro for testing ei_get_compilerver_from_cxx_version_string\n# feel free to add more version strings\nmacro(ei_test_get_compilerver_from_cxx_version_string)\n  ei_test1_get_compilerver_from_cxx_version_string(\"g++ (SUSE Linux) 4.5.3 20110428 [gcc-4_5-branch revision 173117]\" \"g++\" \"4.5.3\")\n  ei_test1_get_compilerver_from_cxx_version_string(\"c++ (GCC) 4.5.1 20100924 (Red Hat 4.5.1-4)\" \"g++\" \"4.5.1\")\n  ei_test1_get_compilerver_from_cxx_version_string(\"icpc (ICC) 11.0 20081105\" \"icpc\" \"11.0\")\n  ei_test1_get_compilerver_from_cxx_version_string(\"g++-3.4 (GCC) 3.4.6\" \"g++\" \"3.4.6\")\n  ei_test1_get_compilerver_from_cxx_version_string(\"SUSE Linux clang version 3.0 (branches/release_30 145598) (based on LLVM 3.0)\" \"llvm-clang++\" \"3.0\")\n  ei_test1_get_compilerver_from_cxx_version_string(\"icpc (ICC) 12.0.5 20110719\" \"icpc\" \"12.0.5\")\n  ei_test1_get_compilerver_from_cxx_version_string(\"Apple clang version 2.1 (tags/Apple/clang-163.7.1) (based on LLVM 3.0svn)\" \"llvm-clang++\" \"2.1\")\n  ei_test1_get_compilerver_from_cxx_version_string(\"i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)\" \"llvm-g++\" \"4.2.1\")\n  ei_test1_get_compilerver_from_cxx_version_string(\"g++-mp-4.4 (GCC) 4.4.6\" \"g++\" \"4.4.6\")\n  ei_test1_get_compilerver_from_cxx_version_string(\"g++-mp-4.4 (GCC) 2011\" \"g++\" \"4.4\")\nendmacro(ei_test_get_compilerver_from_cxx_version_string)\n"
  },
  {
    "path": "libs/eigen/cmake/FindAdolc.cmake",
    "content": "\nif (ADOLC_INCLUDES AND ADOLC_LIBRARIES)\n  set(ADOLC_FIND_QUIETLY TRUE)\nendif (ADOLC_INCLUDES AND ADOLC_LIBRARIES)\n\nfind_path(ADOLC_INCLUDES\n  NAMES\n  adolc/adouble.h\n  PATHS\n  $ENV{ADOLCDIR}\n  ${INCLUDE_INSTALL_DIR}\n)\n\nfind_library(ADOLC_LIBRARIES adolc PATHS $ENV{ADOLCDIR} ${LIB_INSTALL_DIR})\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(ADOLC DEFAULT_MSG\n                                  ADOLC_INCLUDES ADOLC_LIBRARIES)\n\nmark_as_advanced(ADOLC_INCLUDES ADOLC_LIBRARIES)\n"
  },
  {
    "path": "libs/eigen/cmake/FindBLAS.cmake",
    "content": "# Find BLAS library\n#\n# This module finds an installed library that implements the BLAS\n# linear-algebra interface (see http://www.netlib.org/blas/).\n# The list of libraries searched for is mainly taken\n# from the autoconf macro file, acx_blas.m4 (distributed at\n# http://ac-archive.sourceforge.net/ac-archive/acx_blas.html).\n#\n# This module sets the following variables:\n#  BLAS_FOUND - set to true if a library implementing the BLAS interface\n#    is found\n#  BLAS_INCLUDE_DIR - Directories containing the BLAS header files\n#  BLAS_DEFINITIONS - Compilation options to use BLAS\n#  BLAS_LINKER_FLAGS - Linker flags to use BLAS (excluding -l\n#    and -L).\n#  BLAS_LIBRARIES_DIR - Directories containing the BLAS libraries.\n#     May be null if BLAS_LIBRARIES contains libraries name using full path.\n#  BLAS_LIBRARIES - List of libraries to link against BLAS interface.\n#     May be null if the compiler supports auto-link (e.g. VC++).\n#  BLAS_USE_FILE - The name of the cmake module to include to compile\n#     applications or libraries using BLAS.\n#\n# This module was modified by CGAL team:\n# - find libraries for a C++ compiler, instead of Fortran\n# - added BLAS_INCLUDE_DIR, BLAS_DEFINITIONS and BLAS_LIBRARIES_DIR\n# - removed BLAS95_LIBRARIES\n\ninclude(CheckFunctionExists)\n\n\n# This macro checks for the existence of the combination of fortran libraries\n# given by _list.  If the combination is found, this macro checks (using the\n# check_function_exists macro) whether can link against that library\n# combination using the name of a routine given by _name using the linker\n# flags given by _flags.  If the combination of libraries is found and passes\n# the link test, LIBRARIES is set to the list of complete library paths that\n# have been found and DEFINITIONS to the required definitions.\n# Otherwise, LIBRARIES is set to FALSE.\n# N.B. _prefix is the prefix applied to the names of all cached variables that\n# are generated internally and marked advanced by this macro.\nmacro(check_fortran_libraries DEFINITIONS LIBRARIES _prefix _name _flags _list _path)\n  #message(\"DEBUG: check_fortran_libraries(${_list} in ${_path})\")\n\n  # Check for the existence of the libraries given by _list\n  set(_libraries_found TRUE)\n  set(_libraries_work FALSE)\n  set(${DEFINITIONS} \"\")\n  set(${LIBRARIES} \"\")\n  set(_combined_name)\n  foreach(_library ${_list})\n    set(_combined_name ${_combined_name}_${_library})\n\n    if(_libraries_found)\n      # search first in ${_path}\n      find_library(${_prefix}_${_library}_LIBRARY\n                  NAMES ${_library}\n                  PATHS ${_path} NO_DEFAULT_PATH\n                  )\n      # if not found, search in environment variables and system\n      if ( WIN32 )\n        find_library(${_prefix}_${_library}_LIBRARY\n                    NAMES ${_library}\n                    PATHS ENV LIB\n                    )\n      elseif ( APPLE )\n        find_library(${_prefix}_${_library}_LIBRARY\n                    NAMES ${_library}\n                    PATHS /usr/local/lib /usr/lib /usr/local/lib64 /usr/lib64 ENV DYLD_LIBRARY_PATH\n                    )\n      else ()\n        find_library(${_prefix}_${_library}_LIBRARY\n                    NAMES ${_library}\n                    PATHS /usr/local/lib /usr/lib /usr/local/lib64 /usr/lib64 ENV LD_LIBRARY_PATH\n                    )\n      endif()\n      mark_as_advanced(${_prefix}_${_library}_LIBRARY)\n      set(${LIBRARIES} ${${LIBRARIES}} ${${_prefix}_${_library}_LIBRARY})\n      set(_libraries_found ${${_prefix}_${_library}_LIBRARY})\n    endif(_libraries_found)\n  endforeach(_library ${_list})\n  if(_libraries_found)\n    set(_libraries_found ${${LIBRARIES}})\n  endif()\n\n  # Test this combination of libraries with the Fortran/f2c interface.\n  # We test the Fortran interface first as it is well standardized.\n  if(_libraries_found AND NOT _libraries_work)\n    set(${DEFINITIONS}  \"-D${_prefix}_USE_F2C\")\n    set(${LIBRARIES}    ${_libraries_found})\n    # Some C++ linkers require the f2c library to link with Fortran libraries.\n    # I do not know which ones, thus I just add the f2c library if it is available.\n    find_package( F2C QUIET )\n    if ( F2C_FOUND )\n      set(${DEFINITIONS}  ${${DEFINITIONS}} ${F2C_DEFINITIONS})\n      set(${LIBRARIES}    ${${LIBRARIES}} ${F2C_LIBRARIES})\n    endif()\n    set(CMAKE_REQUIRED_DEFINITIONS  ${${DEFINITIONS}})\n    set(CMAKE_REQUIRED_LIBRARIES    ${_flags} ${${LIBRARIES}})\n    #message(\"DEBUG: CMAKE_REQUIRED_DEFINITIONS = ${CMAKE_REQUIRED_DEFINITIONS}\")\n    #message(\"DEBUG: CMAKE_REQUIRED_LIBRARIES = ${CMAKE_REQUIRED_LIBRARIES}\")\n    # Check if function exists with f2c calling convention (ie a trailing underscore)\n    check_function_exists(${_name}_ ${_prefix}_${_name}_${_combined_name}_f2c_WORKS)\n    set(CMAKE_REQUIRED_DEFINITIONS} \"\")\n    set(CMAKE_REQUIRED_LIBRARIES    \"\")\n    mark_as_advanced(${_prefix}_${_name}_${_combined_name}_f2c_WORKS)\n    set(_libraries_work ${${_prefix}_${_name}_${_combined_name}_f2c_WORKS})\n  endif(_libraries_found AND NOT _libraries_work)\n\n  # If not found, test this combination of libraries with a C interface.\n  # A few implementations (ie ACML) provide a C interface. Unfortunately, there is no standard.\n  if(_libraries_found AND NOT _libraries_work)\n    set(${DEFINITIONS} \"\")\n    set(${LIBRARIES}   ${_libraries_found})\n    set(CMAKE_REQUIRED_DEFINITIONS \"\")\n    set(CMAKE_REQUIRED_LIBRARIES   ${_flags} ${${LIBRARIES}})\n    #message(\"DEBUG: CMAKE_REQUIRED_LIBRARIES = ${CMAKE_REQUIRED_LIBRARIES}\")\n    check_function_exists(${_name} ${_prefix}_${_name}${_combined_name}_WORKS)\n    set(CMAKE_REQUIRED_LIBRARIES \"\")\n    mark_as_advanced(${_prefix}_${_name}${_combined_name}_WORKS)\n    set(_libraries_work ${${_prefix}_${_name}${_combined_name}_WORKS})\n  endif(_libraries_found AND NOT _libraries_work)\n\n  # on failure\n  if(NOT _libraries_work)\n    set(${DEFINITIONS} \"\")\n    set(${LIBRARIES}   FALSE)\n  endif()\n  #message(\"DEBUG: ${DEFINITIONS} = ${${DEFINITIONS}}\")\n  #message(\"DEBUG: ${LIBRARIES} = ${${LIBRARIES}}\")\nendmacro(check_fortran_libraries)\n\n\n#\n# main\n#\n\n# Is it already configured?\nif (BLAS_LIBRARIES_DIR OR BLAS_LIBRARIES)\n\n  set(BLAS_FOUND TRUE)\n\nelse()\n\n  # reset variables\n  set( BLAS_INCLUDE_DIR \"\" )\n  set( BLAS_DEFINITIONS \"\" )\n  set( BLAS_LINKER_FLAGS \"\" )\n  set( BLAS_LIBRARIES \"\" )\n  set( BLAS_LIBRARIES_DIR \"\" )\n\n    #\n    # If Unix, search for BLAS function in possible libraries\n    #\n\n    # BLAS in ATLAS library? (http://math-atlas.sourceforge.net/)\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"cblas;f77blas;atlas\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR\"\n      )\n    endif()\n\n    # BLAS in PhiPACK libraries? (requires generic BLAS lib, too)\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"sgemm;dgemm;blas\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR\"\n      )\n    endif()\n\n    # BLAS in Alpha CXML library?\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"cxml\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR\"\n      )\n    endif()\n\n    # BLAS in Alpha DXML library? (now called CXML, see above)\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"dxml\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR\"\n      )\n    endif()\n\n    # BLAS in Sun Performance library?\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"-xlic_lib=sunperf\"\n      \"sunperf;sunmath\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR\"\n      )\n      if(BLAS_LIBRARIES)\n        # Extra linker flag\n        set(BLAS_LINKER_FLAGS \"-xlic_lib=sunperf\")\n      endif()\n    endif()\n\n    # BLAS in SCSL library?  (SGI/Cray Scientific Library)\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"scsl\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR\"\n      )\n    endif()\n\n    # BLAS in SGIMATH library?\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"complib.sgimath\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR\"\n      )\n    endif()\n\n    # BLAS in IBM ESSL library? (requires generic BLAS lib, too)\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"essl;blas\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR\"\n      )\n    endif()\n\n    #BLAS in intel mkl 10 library? (em64t 64bit)\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"mkl_intel_lp64;mkl_intel_thread;mkl_core;guide;pthread\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR\"\n      )\n    endif()\n\n    ### windows version of intel mkl 10?\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      SGEMM\n      \"\"\n      \"mkl_c_dll;mkl_intel_thread_dll;mkl_core_dll;libguide40\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR\"\n      )\n    endif()\n\n    #older versions of intel mkl libs\n\n    # BLAS in intel mkl library? (shared)\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"mkl;guide;pthread\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR\"\n      )\n    endif()\n\n    #BLAS in intel mkl library? (static, 32bit)\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"mkl_ia32;guide;pthread\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR\"\n      )\n    endif()\n\n    #BLAS in intel mkl library? (static, em64t 64bit)\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"mkl_em64t;guide;pthread\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR\"\n      )\n    endif()\n\n    #BLAS in acml library?\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"acml\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR\"\n      )\n    endif()\n\n    # Apple BLAS library?\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"Accelerate\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR\"\n      )\n    endif()\n\n    if ( NOT BLAS_LIBRARIES )\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"vecLib\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR\"\n      )\n    endif ( NOT BLAS_LIBRARIES )\n\n    # Generic BLAS library?\n    # This configuration *must* be the last try as this library is notably slow.\n    if ( NOT BLAS_LIBRARIES )\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"blas\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR\"\n      )\n    endif()\n\n  if(BLAS_LIBRARIES_DIR OR BLAS_LIBRARIES)\n    set(BLAS_FOUND TRUE)\n  else()\n    set(BLAS_FOUND FALSE)\n  endif()\n\n  if(NOT BLAS_FIND_QUIETLY)\n    if(BLAS_FOUND)\n      message(STATUS \"A library with BLAS API found.\")\n    else(BLAS_FOUND)\n      if(BLAS_FIND_REQUIRED)\n        message(FATAL_ERROR \"A required library with BLAS API not found. Please specify library location.\")\n      else()\n        message(STATUS \"A library with BLAS API not found. Please specify library location.\")\n      endif()\n    endif(BLAS_FOUND)\n  endif(NOT BLAS_FIND_QUIETLY)\n\n  # Add variables to cache\n  set( BLAS_INCLUDE_DIR   \"${BLAS_INCLUDE_DIR}\"\n                          CACHE PATH \"Directories containing the BLAS header files\" FORCE )\n  set( BLAS_DEFINITIONS   \"${BLAS_DEFINITIONS}\"\n                          CACHE STRING \"Compilation options to use BLAS\" FORCE )\n  set( BLAS_LINKER_FLAGS  \"${BLAS_LINKER_FLAGS}\"\n                          CACHE STRING \"Linker flags to use BLAS\" FORCE )\n  set( BLAS_LIBRARIES     \"${BLAS_LIBRARIES}\"\n                          CACHE FILEPATH \"BLAS libraries name\" FORCE )\n  set( BLAS_LIBRARIES_DIR \"${BLAS_LIBRARIES_DIR}\"\n                          CACHE PATH \"Directories containing the BLAS libraries\" FORCE )\n\n  #message(\"DEBUG: BLAS_INCLUDE_DIR = ${BLAS_INCLUDE_DIR}\")\n  #message(\"DEBUG: BLAS_DEFINITIONS = ${BLAS_DEFINITIONS}\")\n  #message(\"DEBUG: BLAS_LINKER_FLAGS = ${BLAS_LINKER_FLAGS}\")\n  #message(\"DEBUG: BLAS_LIBRARIES = ${BLAS_LIBRARIES}\")\n  #message(\"DEBUG: BLAS_LIBRARIES_DIR = ${BLAS_LIBRARIES_DIR}\")\n  #message(\"DEBUG: BLAS_FOUND = ${BLAS_FOUND}\")\n\nendif(BLAS_LIBRARIES_DIR OR BLAS_LIBRARIES)\n"
  },
  {
    "path": "libs/eigen/cmake/FindCholmod.cmake",
    "content": "# Cholmod lib usually requires linking to a blas and lapack library.\n# It is up to the user of this module to find a BLAS and link to it.\n\nif (CHOLMOD_INCLUDES AND CHOLMOD_LIBRARIES)\n  set(CHOLMOD_FIND_QUIETLY TRUE)\nendif (CHOLMOD_INCLUDES AND CHOLMOD_LIBRARIES)\n\nfind_path(CHOLMOD_INCLUDES\n  NAMES\n  cholmod.h\n  PATHS\n  $ENV{CHOLMODDIR}\n  ${INCLUDE_INSTALL_DIR}\n  PATH_SUFFIXES\n  suitesparse\n  ufsparse\n)\n\nfind_library(CHOLMOD_LIBRARIES cholmod PATHS $ENV{CHOLMODDIR} ${LIB_INSTALL_DIR})\n\nif(CHOLMOD_LIBRARIES)\n\n  get_filename_component(CHOLMOD_LIBDIR ${CHOLMOD_LIBRARIES} PATH)\n\n  find_library(AMD_LIBRARY amd PATHS ${CHOLMOD_LIBDIR} $ENV{CHOLMODDIR} ${LIB_INSTALL_DIR})\n  if (AMD_LIBRARY)\n    set(CHOLMOD_LIBRARIES ${CHOLMOD_LIBRARIES} ${AMD_LIBRARY})\n  else ()\n    set(CHOLMOD_LIBRARIES FALSE)\n  endif ()\n\nendif(CHOLMOD_LIBRARIES)\n\nif(CHOLMOD_LIBRARIES)\n\n  find_library(COLAMD_LIBRARY colamd PATHS ${CHOLMOD_LIBDIR} $ENV{CHOLMODDIR} ${LIB_INSTALL_DIR})\n  if (COLAMD_LIBRARY)\n    set(CHOLMOD_LIBRARIES ${CHOLMOD_LIBRARIES} ${COLAMD_LIBRARY})\n  else ()\n    set(CHOLMOD_LIBRARIES FALSE)\n  endif ()\n\nendif(CHOLMOD_LIBRARIES)\n\nif(CHOLMOD_LIBRARIES)\n\n  find_library(CAMD_LIBRARY camd PATHS ${CHOLMOD_LIBDIR} $ENV{CHOLMODDIR} ${LIB_INSTALL_DIR})\n  if (CAMD_LIBRARY)\n    set(CHOLMOD_LIBRARIES ${CHOLMOD_LIBRARIES} ${CAMD_LIBRARY})\n  else ()\n    set(CHOLMOD_LIBRARIES FALSE)\n  endif ()\n\nendif(CHOLMOD_LIBRARIES)\n\nif(CHOLMOD_LIBRARIES)\n\n  find_library(CCOLAMD_LIBRARY ccolamd PATHS ${CHOLMOD_LIBDIR} $ENV{CHOLMODDIR} ${LIB_INSTALL_DIR})\n  if (CCOLAMD_LIBRARY)\n    set(CHOLMOD_LIBRARIES ${CHOLMOD_LIBRARIES} ${CCOLAMD_LIBRARY})\n  else ()\n    set(CHOLMOD_LIBRARIES FALSE)\n  endif ()\n\nendif(CHOLMOD_LIBRARIES)\n\nif(CHOLMOD_LIBRARIES)\n\n  find_library(CHOLMOD_METIS_LIBRARY metis PATHS ${CHOLMOD_LIBDIR} $ENV{CHOLMODDIR} ${LIB_INSTALL_DIR})\n  if (CHOLMOD_METIS_LIBRARY)\n    set(CHOLMOD_LIBRARIES ${CHOLMOD_LIBRARIES} ${CHOLMOD_METIS_LIBRARY})\n  endif ()\n\nendif(CHOLMOD_LIBRARIES)\n\nif(CHOLMOD_LIBRARIES)\n\n  find_library(SUITESPARSE_LIBRARY SuiteSparse PATHS ${CHOLMOD_LIBDIR} $ENV{CHOLMODDIR} ${LIB_INSTALL_DIR})\n  if (SUITESPARSE_LIBRARY)\n    set(CHOLMOD_LIBRARIES ${CHOLMOD_LIBRARIES} ${SUITESPARSE_LIBRARY})\n  endif (SUITESPARSE_LIBRARY)\n  \nendif(CHOLMOD_LIBRARIES)\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(CHOLMOD DEFAULT_MSG\n                                  CHOLMOD_INCLUDES CHOLMOD_LIBRARIES)\n\nmark_as_advanced(CHOLMOD_INCLUDES CHOLMOD_LIBRARIES AMD_LIBRARY COLAMD_LIBRARY SUITESPARSE_LIBRARY CAMD_LIBRARY CCOLAMD_LIBRARY CHOLMOD_METIS_LIBRARY)\n"
  },
  {
    "path": "libs/eigen/cmake/FindEigen2.cmake",
    "content": "# - Try to find Eigen2 lib\n#\n# This module supports requiring a minimum version, e.g. you can do\n#   find_package(Eigen2 2.0.3)\n# to require version 2.0.3 to newer of Eigen2.\n#\n# Once done this will define\n#\n#  EIGEN2_FOUND - system has eigen lib with correct version\n#  EIGEN2_INCLUDE_DIR - the eigen include directory\n#  EIGEN2_VERSION - eigen version\n\n# Copyright (c) 2006, 2007 Montel Laurent, <montel@kde.org>\n# Copyright (c) 2008, 2009 Gael Guennebaud, <g.gael@free.fr>\n# Redistribution and use is allowed according to the terms of the BSD license.\n\nif(NOT Eigen2_FIND_VERSION)\n  if(NOT Eigen2_FIND_VERSION_MAJOR)\n    set(Eigen2_FIND_VERSION_MAJOR 2)\n  endif(NOT Eigen2_FIND_VERSION_MAJOR)\n  if(NOT Eigen2_FIND_VERSION_MINOR)\n    set(Eigen2_FIND_VERSION_MINOR 0)\n  endif(NOT Eigen2_FIND_VERSION_MINOR)\n  if(NOT Eigen2_FIND_VERSION_PATCH)\n    set(Eigen2_FIND_VERSION_PATCH 0)\n  endif(NOT Eigen2_FIND_VERSION_PATCH)\n\n  set(Eigen2_FIND_VERSION \"${Eigen2_FIND_VERSION_MAJOR}.${Eigen2_FIND_VERSION_MINOR}.${Eigen2_FIND_VERSION_PATCH}\")\nendif(NOT Eigen2_FIND_VERSION)\n\nmacro(_eigen2_check_version)\n  file(READ \"${EIGEN2_INCLUDE_DIR}/Eigen/src/Core/util/Macros.h\" _eigen2_version_header)\n\n  string(REGEX MATCH \"define[ \\t]+EIGEN_WORLD_VERSION[ \\t]+([0-9]+)\" _eigen2_world_version_match \"${_eigen2_version_header}\")\n  set(EIGEN2_WORLD_VERSION \"${CMAKE_MATCH_1}\")\n  string(REGEX MATCH \"define[ \\t]+EIGEN_MAJOR_VERSION[ \\t]+([0-9]+)\" _eigen2_major_version_match \"${_eigen2_version_header}\")\n  set(EIGEN2_MAJOR_VERSION \"${CMAKE_MATCH_1}\")\n  string(REGEX MATCH \"define[ \\t]+EIGEN_MINOR_VERSION[ \\t]+([0-9]+)\" _eigen2_minor_version_match \"${_eigen2_version_header}\")\n  set(EIGEN2_MINOR_VERSION \"${CMAKE_MATCH_1}\")\n\n  set(EIGEN2_VERSION ${EIGEN2_WORLD_VERSION}.${EIGEN2_MAJOR_VERSION}.${EIGEN2_MINOR_VERSION})\n  if((${EIGEN2_WORLD_VERSION} NOTEQUAL 2) OR (${EIGEN2_MAJOR_VERSION} GREATER 10) OR (${EIGEN2_VERSION} VERSION_LESS ${Eigen2_FIND_VERSION}))\n    set(EIGEN2_VERSION_OK FALSE)\n  else()\n    set(EIGEN2_VERSION_OK TRUE)\n  endif()\n\n  if(NOT EIGEN2_VERSION_OK)\n\n    message(STATUS \"Eigen2 version ${EIGEN2_VERSION} found in ${EIGEN2_INCLUDE_DIR}, \"\n                   \"but at least version ${Eigen2_FIND_VERSION} is required\")\n  endif(NOT EIGEN2_VERSION_OK)\nendmacro(_eigen2_check_version)\n\nif (EIGEN2_INCLUDE_DIR)\n\n  # in cache already\n  _eigen2_check_version()\n  set(EIGEN2_FOUND ${EIGEN2_VERSION_OK})\n\nelse (EIGEN2_INCLUDE_DIR)\n\nfind_path(EIGEN2_INCLUDE_DIR NAMES Eigen/Core\n     PATHS\n     ${INCLUDE_INSTALL_DIR}\n     ${KDE4_INCLUDE_DIR}\n     PATH_SUFFIXES eigen2\n   )\n\nif(EIGEN2_INCLUDE_DIR)\n  _eigen2_check_version()\nendif(EIGEN2_INCLUDE_DIR)\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(Eigen2 DEFAULT_MSG EIGEN2_INCLUDE_DIR EIGEN2_VERSION_OK)\n\nmark_as_advanced(EIGEN2_INCLUDE_DIR)\n\nendif(EIGEN2_INCLUDE_DIR)\n\n"
  },
  {
    "path": "libs/eigen/cmake/FindEigen3.cmake",
    "content": "# - Try to find Eigen3 lib\n#\n# This module supports requiring a minimum version, e.g. you can do\n#   find_package(Eigen3 3.1.2)\n# to require version 3.1.2 or newer of Eigen3.\n#\n# Once done this will define\n#\n#  EIGEN3_FOUND - system has eigen lib with correct version\n#  EIGEN3_INCLUDE_DIR - the eigen include directory\n#  EIGEN3_VERSION - eigen version\n\n# Copyright (c) 2006, 2007 Montel Laurent, <montel@kde.org>\n# Copyright (c) 2008, 2009 Gael Guennebaud, <g.gael@free.fr>\n# Copyright (c) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n# Redistribution and use is allowed according to the terms of the 2-clause BSD license.\n\nif(NOT Eigen3_FIND_VERSION)\n  if(NOT Eigen3_FIND_VERSION_MAJOR)\n    set(Eigen3_FIND_VERSION_MAJOR 2)\n  endif(NOT Eigen3_FIND_VERSION_MAJOR)\n  if(NOT Eigen3_FIND_VERSION_MINOR)\n    set(Eigen3_FIND_VERSION_MINOR 91)\n  endif(NOT Eigen3_FIND_VERSION_MINOR)\n  if(NOT Eigen3_FIND_VERSION_PATCH)\n    set(Eigen3_FIND_VERSION_PATCH 0)\n  endif(NOT Eigen3_FIND_VERSION_PATCH)\n\n  set(Eigen3_FIND_VERSION \"${Eigen3_FIND_VERSION_MAJOR}.${Eigen3_FIND_VERSION_MINOR}.${Eigen3_FIND_VERSION_PATCH}\")\nendif(NOT Eigen3_FIND_VERSION)\n\nmacro(_eigen3_check_version)\n  file(READ \"${EIGEN3_INCLUDE_DIR}/Eigen/src/Core/util/Macros.h\" _eigen3_version_header)\n\n  string(REGEX MATCH \"define[ \\t]+EIGEN_WORLD_VERSION[ \\t]+([0-9]+)\" _eigen3_world_version_match \"${_eigen3_version_header}\")\n  set(EIGEN3_WORLD_VERSION \"${CMAKE_MATCH_1}\")\n  string(REGEX MATCH \"define[ \\t]+EIGEN_MAJOR_VERSION[ \\t]+([0-9]+)\" _eigen3_major_version_match \"${_eigen3_version_header}\")\n  set(EIGEN3_MAJOR_VERSION \"${CMAKE_MATCH_1}\")\n  string(REGEX MATCH \"define[ \\t]+EIGEN_MINOR_VERSION[ \\t]+([0-9]+)\" _eigen3_minor_version_match \"${_eigen3_version_header}\")\n  set(EIGEN3_MINOR_VERSION \"${CMAKE_MATCH_1}\")\n\n  set(EIGEN3_VERSION ${EIGEN3_WORLD_VERSION}.${EIGEN3_MAJOR_VERSION}.${EIGEN3_MINOR_VERSION})\n  if(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION})\n    set(EIGEN3_VERSION_OK FALSE)\n  else(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION})\n    set(EIGEN3_VERSION_OK TRUE)\n  endif(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION})\n\n  if(NOT EIGEN3_VERSION_OK)\n\n    message(STATUS \"Eigen3 version ${EIGEN3_VERSION} found in ${EIGEN3_INCLUDE_DIR}, \"\n                   \"but at least version ${Eigen3_FIND_VERSION} is required\")\n  endif(NOT EIGEN3_VERSION_OK)\nendmacro(_eigen3_check_version)\n\nif (EIGEN3_INCLUDE_DIR)\n\n  # in cache already\n  _eigen3_check_version()\n  set(EIGEN3_FOUND ${EIGEN3_VERSION_OK})\n\nelse (EIGEN3_INCLUDE_DIR)\n\n  find_path(EIGEN3_INCLUDE_DIR NAMES signature_of_eigen3_matrix_library\n      PATHS\n      ${CMAKE_INSTALL_PREFIX}/include\n      ${KDE4_INCLUDE_DIR}\n      PATH_SUFFIXES eigen3 eigen\n    )\n\n  if(EIGEN3_INCLUDE_DIR)\n    _eigen3_check_version()\n  endif(EIGEN3_INCLUDE_DIR)\n\n  include(FindPackageHandleStandardArgs)\n  find_package_handle_standard_args(Eigen3 DEFAULT_MSG EIGEN3_INCLUDE_DIR EIGEN3_VERSION_OK)\n\n  mark_as_advanced(EIGEN3_INCLUDE_DIR)\n\nendif(EIGEN3_INCLUDE_DIR)\n\n"
  },
  {
    "path": "libs/eigen/cmake/FindFFTW.cmake",
    "content": "# - Find the FFTW library\n#\n# Usage:\n#   find_package(FFTW [REQUIRED] [QUIET] )\n#     \n# It sets the following variables:\n#   FFTW_FOUND               ... true if fftw is found on the system\n#   FFTW_LIBRARIES           ... full path to fftw library\n#   FFTW_INCLUDES            ... fftw include directory\n#\n# The following variables will be checked by the function\n#   FFTW_USE_STATIC_LIBS    ... if true, only static libraries are found\n#   FFTW_ROOT               ... if set, the libraries are exclusively searched\n#                               under this path\n#   FFTW_LIBRARY            ... fftw library to use\n#   FFTW_INCLUDE_DIR        ... fftw include directory\n#\n\n#If environment variable FFTWDIR is specified, it has same effect as FFTW_ROOT\nif( NOT FFTW_ROOT AND ENV{FFTWDIR} )\n  set( FFTW_ROOT $ENV{FFTWDIR} )\nendif()\n\n# Check if we can use PkgConfig\nfind_package(PkgConfig)\n\n#Determine from PKG\nif( PKG_CONFIG_FOUND AND NOT FFTW_ROOT )\n  pkg_check_modules( PKG_FFTW QUIET \"fftw3\" )\nendif()\n\n#Check whether to search static or dynamic libs\nset( CMAKE_FIND_LIBRARY_SUFFIXES_SAV ${CMAKE_FIND_LIBRARY_SUFFIXES} )\n\nif( ${FFTW_USE_STATIC_LIBS} )\n  set( CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_STATIC_LIBRARY_SUFFIX} )\nelse()\n  set( CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_SHARED_LIBRARY_SUFFIX} )\nendif()\n\nif( FFTW_ROOT )\n\n  #find libs\n  find_library(\n    FFTW_LIB\n    NAMES \"fftw3\"\n    PATHS ${FFTW_ROOT}\n    PATH_SUFFIXES \"lib\" \"lib64\"\n    NO_DEFAULT_PATH\n  )\n\n  find_library(\n    FFTWF_LIB\n    NAMES \"fftw3f\"\n    PATHS ${FFTW_ROOT}\n    PATH_SUFFIXES \"lib\" \"lib64\"\n    NO_DEFAULT_PATH\n  )\n\n  find_library(\n    FFTWL_LIB\n    NAMES \"fftw3l\"\n    PATHS ${FFTW_ROOT}\n    PATH_SUFFIXES \"lib\" \"lib64\"\n    NO_DEFAULT_PATH\n  )\n\n  #find includes\n  find_path(\n    FFTW_INCLUDES\n    NAMES \"fftw3.h\"\n    PATHS ${FFTW_ROOT}\n    PATH_SUFFIXES \"include\"\n    NO_DEFAULT_PATH\n  )\n\nelse()\n\n  find_library(\n    FFTW_LIB\n    NAMES \"fftw3\"\n    PATHS ${PKG_FFTW_LIBRARY_DIRS} ${LIB_INSTALL_DIR}\n  )\n\n  find_library(\n    FFTWF_LIB\n    NAMES \"fftw3f\"\n    PATHS ${PKG_FFTW_LIBRARY_DIRS} ${LIB_INSTALL_DIR}\n  )\n\n\n  find_library(\n    FFTWL_LIB\n    NAMES \"fftw3l\"\n    PATHS ${PKG_FFTW_LIBRARY_DIRS} ${LIB_INSTALL_DIR}\n  )\n\n  find_path(\n    FFTW_INCLUDES\n    NAMES \"fftw3.h\"\n    PATHS ${PKG_FFTW_INCLUDE_DIRS} ${INCLUDE_INSTALL_DIR}\n  )\n\nendif( FFTW_ROOT )\n\nset(FFTW_LIBRARIES ${FFTW_LIB} ${FFTWF_LIB})\n\nif(FFTWL_LIB)\n  set(FFTW_LIBRARIES ${FFTW_LIBRARIES} ${FFTWL_LIB})\nendif()\n\nset( CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES_SAV} )\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(FFTW DEFAULT_MSG\n                                  FFTW_INCLUDES FFTW_LIBRARIES)\n\nmark_as_advanced(FFTW_INCLUDES FFTW_LIBRARIES FFTW_LIB FFTWF_LIB FFTWL_LIB)\n\n"
  },
  {
    "path": "libs/eigen/cmake/FindGLEW.cmake",
    "content": "# Copyright (c) 2009 Boudewijn Rempt <boud@valdyas.org>                                                                                          \n#                                                                                                                                                \n# Redistribution and use is allowed according to the terms of the BSD license.                                                                   \n# For details see the accompanying COPYING-CMAKE-SCRIPTS file. \n# \n# - try to find glew library and include files\n#  GLEW_INCLUDE_DIR, where to find GL/glew.h, etc.\n#  GLEW_LIBRARIES, the libraries to link against\n#  GLEW_FOUND, If false, do not try to use GLEW.\n# Also defined, but not for general use are:\n#  GLEW_GLEW_LIBRARY = the full path to the glew library.\n\nIF (WIN32)\n\n  IF(CYGWIN)\n\n    FIND_PATH( GLEW_INCLUDE_DIR GL/glew.h)\n\n    FIND_LIBRARY( GLEW_GLEW_LIBRARY glew32\n      ${OPENGL_LIBRARY_DIR}\n      /usr/lib/w32api\n      /usr/X11R6/lib\n    )\n\n\n  ELSE(CYGWIN)\n  \n    FIND_PATH( GLEW_INCLUDE_DIR GL/glew.h\n      $ENV{GLEW_ROOT_PATH}/include\n    )\n\n    FIND_LIBRARY( GLEW_GLEW_LIBRARY\n      NAMES glew glew32\n      PATHS\n      $ENV{GLEW_ROOT_PATH}/lib\n      ${OPENGL_LIBRARY_DIR}\n    )\n\n  ENDIF(CYGWIN)\n\nELSE (WIN32)\n\n  IF (APPLE)\n# These values for Apple could probably do with improvement.\n    FIND_PATH( GLEW_INCLUDE_DIR glew.h\n      /System/Library/Frameworks/GLEW.framework/Versions/A/Headers\n      ${OPENGL_LIBRARY_DIR}\n    )\n    SET(GLEW_GLEW_LIBRARY \"-framework GLEW\" CACHE STRING \"GLEW library for OSX\")\n    SET(GLEW_cocoa_LIBRARY \"-framework Cocoa\" CACHE STRING \"Cocoa framework for OSX\")\n  ELSE (APPLE)\n\n    FIND_PATH( GLEW_INCLUDE_DIR GL/glew.h\n      /usr/include/GL\n      /usr/openwin/share/include\n      /usr/openwin/include\n      /usr/X11R6/include\n      /usr/include/X11\n      /opt/graphics/OpenGL/include\n      /opt/graphics/OpenGL/contrib/libglew\n    )\n\n    FIND_LIBRARY( GLEW_GLEW_LIBRARY GLEW\n      /usr/openwin/lib\n      /usr/X11R6/lib\n    )\n\n  ENDIF (APPLE)\n\nENDIF (WIN32)\n\nSET( GLEW_FOUND \"NO\" )\nIF(GLEW_INCLUDE_DIR)\n  IF(GLEW_GLEW_LIBRARY)\n    # Is -lXi and -lXmu required on all platforms that have it?\n    # If not, we need some way to figure out what platform we are on.\n    SET( GLEW_LIBRARIES\n      ${GLEW_GLEW_LIBRARY}\n      ${GLEW_cocoa_LIBRARY}\n    )\n    SET( GLEW_FOUND \"YES\" )\n\n#The following deprecated settings are for backwards compatibility with CMake1.4\n    SET (GLEW_LIBRARY ${GLEW_LIBRARIES})\n    SET (GLEW_INCLUDE_PATH ${GLEW_INCLUDE_DIR})\n\n  ENDIF(GLEW_GLEW_LIBRARY)\nENDIF(GLEW_INCLUDE_DIR)\n\nIF(GLEW_FOUND)\n  IF(NOT GLEW_FIND_QUIETLY)\n    MESSAGE(STATUS \"Found Glew: ${GLEW_LIBRARIES}\")\n  ENDIF(NOT GLEW_FIND_QUIETLY)\nELSE(GLEW_FOUND)\n  IF(GLEW_FIND_REQUIRED)\n    MESSAGE(FATAL_ERROR \"Could not find Glew\")\n  ENDIF(GLEW_FIND_REQUIRED)\nENDIF(GLEW_FOUND)\n\nMARK_AS_ADVANCED(\n  GLEW_INCLUDE_DIR\n  GLEW_GLEW_LIBRARY\n  GLEW_Xmu_LIBRARY\n  GLEW_Xi_LIBRARY\n)\n"
  },
  {
    "path": "libs/eigen/cmake/FindGMP.cmake",
    "content": "# Try to find the GNU Multiple Precision Arithmetic Library (GMP)\n# See http://gmplib.org/\n\nif (GMP_INCLUDES AND GMP_LIBRARIES)\n  set(GMP_FIND_QUIETLY TRUE)\nendif (GMP_INCLUDES AND GMP_LIBRARIES)\n\nfind_path(GMP_INCLUDES\n  NAMES\n  gmp.h\n  PATHS\n  $ENV{GMPDIR}\n  ${INCLUDE_INSTALL_DIR}\n)\n\nfind_library(GMP_LIBRARIES gmp PATHS $ENV{GMPDIR} ${LIB_INSTALL_DIR})\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(GMP DEFAULT_MSG\n                                  GMP_INCLUDES GMP_LIBRARIES)\nmark_as_advanced(GMP_INCLUDES GMP_LIBRARIES)\n"
  },
  {
    "path": "libs/eigen/cmake/FindGSL.cmake",
    "content": "# Try to find gnu scientific library GSL\n# See \n# http://www.gnu.org/software/gsl/  and\n# http://gnuwin32.sourceforge.net/packages/gsl.htm\n#\n# Once run this will define: \n# \n# GSL_FOUND       = system has GSL lib\n#\n# GSL_LIBRARIES   = full path to the libraries\n#    on Unix/Linux with additional linker flags from \"gsl-config --libs\"\n# \n# CMAKE_GSL_CXX_FLAGS  = Unix compiler flags for GSL, essentially \"`gsl-config --cxxflags`\"\n#\n# GSL_INCLUDE_DIR      = where to find headers \n#\n# GSL_LINK_DIRECTORIES = link directories, useful for rpath on Unix\n# GSL_EXE_LINKER_FLAGS = rpath on Unix\n#\n# Felix Woelk 07/2004\n# Jan Woetzel\n#\n# www.mip.informatik.uni-kiel.de\n# --------------------------------\n\nIF(WIN32)\n  # JW tested with gsl-1.8, Windows XP, MSVS 7.1\n  SET(GSL_POSSIBLE_ROOT_DIRS\n    ${GSL_ROOT_DIR}\n    $ENV{GSL_ROOT_DIR}\n    ${GSL_DIR}\n    ${GSL_HOME}    \n    $ENV{GSL_DIR}\n    $ENV{GSL_HOME}\n    $ENV{EXTRA}\n    \"C:/Program Files/GnuWin32\"\n    )\n  FIND_PATH(GSL_INCLUDE_DIR\n    NAMES gsl/gsl_cdf.h gsl/gsl_randist.h\n    PATHS ${GSL_POSSIBLE_ROOT_DIRS}\n    PATH_SUFFIXES include\n    DOC \"GSL header include dir\"\n    )\n  \n  FIND_LIBRARY(GSL_GSL_LIBRARY\n    NAMES libgsl.dll.a gsl libgsl\n    PATHS  ${GSL_POSSIBLE_ROOT_DIRS}\n    PATH_SUFFIXES lib\n    DOC \"GSL library\" )\n  \n  if(NOT GSL_GSL_LIBRARY)\n\tFIND_FILE(GSL_GSL_LIBRARY\n\t\tNAMES libgsl.dll.a\n\t\tPATHS  ${GSL_POSSIBLE_ROOT_DIRS}\n\t\tPATH_SUFFIXES lib\n\t\tDOC \"GSL library\")\n  endif(NOT GSL_GSL_LIBRARY)\n  \n  FIND_LIBRARY(GSL_GSLCBLAS_LIBRARY\n    NAMES libgslcblas.dll.a gslcblas libgslcblas\n    PATHS  ${GSL_POSSIBLE_ROOT_DIRS}\n    PATH_SUFFIXES lib\n    DOC \"GSL cblas library dir\" )\n  \n  if(NOT GSL_GSLCBLAS_LIBRARY)\n\tFIND_FILE(GSL_GSLCBLAS_LIBRARY\n\t\tNAMES libgslcblas.dll.a\n\t\tPATHS  ${GSL_POSSIBLE_ROOT_DIRS}\n\t\tPATH_SUFFIXES lib\n\t\tDOC \"GSL library\")\n  endif(NOT GSL_GSLCBLAS_LIBRARY)\n  \n  SET(GSL_LIBRARIES ${GSL_GSL_LIBRARY})\n\n  #MESSAGE(\"DBG\\n\"\n  #  \"GSL_GSL_LIBRARY=${GSL_GSL_LIBRARY}\\n\"\n  #  \"GSL_GSLCBLAS_LIBRARY=${GSL_GSLCBLAS_LIBRARY}\\n\"\n  #  \"GSL_LIBRARIES=${GSL_LIBRARIES}\")\n\n\nELSE(WIN32)\n  \n  IF(UNIX) \n    SET(GSL_CONFIG_PREFER_PATH \n      \"$ENV{GSL_DIR}/bin\"\n      \"$ENV{GSL_DIR}\"\n      \"$ENV{GSL_HOME}/bin\" \n      \"$ENV{GSL_HOME}\" \n      CACHE STRING \"preferred path to GSL (gsl-config)\")\n    FIND_PROGRAM(GSL_CONFIG gsl-config\n      ${GSL_CONFIG_PREFER_PATH}\n      /usr/bin/\n      )\n    # MESSAGE(\"DBG GSL_CONFIG ${GSL_CONFIG}\")\n    \n    IF (GSL_CONFIG) \n      # set CXXFLAGS to be fed into CXX_FLAGS by the user:\n      SET(GSL_CXX_FLAGS \"`${GSL_CONFIG} --cflags`\")\n      \n      # set INCLUDE_DIRS to prefix+include\n      EXEC_PROGRAM(${GSL_CONFIG}\n        ARGS --prefix\n        OUTPUT_VARIABLE GSL_PREFIX)\n      SET(GSL_INCLUDE_DIR ${GSL_PREFIX}/include CACHE STRING INTERNAL)\n\n      # set link libraries and link flags\n      #SET(GSL_LIBRARIES \"`${GSL_CONFIG} --libs`\")\n      EXEC_PROGRAM(${GSL_CONFIG}\n        ARGS --libs\n        OUTPUT_VARIABLE GSL_LIBRARIES )\n        \n      # extract link dirs for rpath  \n      EXEC_PROGRAM(${GSL_CONFIG}\n        ARGS --libs\n        OUTPUT_VARIABLE GSL_CONFIG_LIBS )\n      \n      # extract version\n      EXEC_PROGRAM(${GSL_CONFIG}\n        ARGS --version\n        OUTPUT_VARIABLE GSL_FULL_VERSION )\n      \n      # split version as major/minor\n      STRING(REGEX MATCH \"(.)\\\\..*\" GSL_VERSION_MAJOR_ \"${GSL_FULL_VERSION}\")\n      SET(GSL_VERSION_MAJOR ${CMAKE_MATCH_1})\n      STRING(REGEX MATCH \".\\\\.(.*)\" GSL_VERSION_MINOR_ \"${GSL_FULL_VERSION}\")\n      SET(GSL_VERSION_MINOR ${CMAKE_MATCH_1})\n\n      # split off the link dirs (for rpath)\n      # use regular expression to match wildcard equivalent \"-L*<endchar>\"\n      # with <endchar> is a space or a semicolon\n      STRING(REGEX MATCHALL \"[-][L]([^ ;])+\" \n        GSL_LINK_DIRECTORIES_WITH_PREFIX \n        \"${GSL_CONFIG_LIBS}\" )\n      #      MESSAGE(\"DBG  GSL_LINK_DIRECTORIES_WITH_PREFIX=${GSL_LINK_DIRECTORIES_WITH_PREFIX}\")\n\n      # remove prefix -L because we need the pure directory for LINK_DIRECTORIES\n      \n      IF (GSL_LINK_DIRECTORIES_WITH_PREFIX)\n        STRING(REGEX REPLACE \"[-][L]\" \"\" GSL_LINK_DIRECTORIES ${GSL_LINK_DIRECTORIES_WITH_PREFIX} )\n      ENDIF (GSL_LINK_DIRECTORIES_WITH_PREFIX)\n      SET(GSL_EXE_LINKER_FLAGS \"-Wl,-rpath,${GSL_LINK_DIRECTORIES}\" CACHE STRING INTERNAL)\n      #      MESSAGE(\"DBG  GSL_LINK_DIRECTORIES=${GSL_LINK_DIRECTORIES}\")\n      #      MESSAGE(\"DBG  GSL_EXE_LINKER_FLAGS=${GSL_EXE_LINKER_FLAGS}\")\n\n      #      ADD_DEFINITIONS(\"-DHAVE_GSL\")\n      #      SET(GSL_DEFINITIONS \"-DHAVE_GSL\")\n      MARK_AS_ADVANCED(\n        GSL_CXX_FLAGS\n        GSL_INCLUDE_DIR\n        GSL_LIBRARIES\n        GSL_LINK_DIRECTORIES\n        GSL_DEFINITIONS\n        )\n      MESSAGE(STATUS \"Using GSL from ${GSL_PREFIX}\")\n      \n    ELSE(GSL_CONFIG)\n      MESSAGE(\"FindGSL.cmake: gsl-config not found. Please set it manually. GSL_CONFIG=${GSL_CONFIG}\")\n    ENDIF(GSL_CONFIG)\n\n  ENDIF(UNIX)\nENDIF(WIN32)\n\n\nIF(GSL_LIBRARIES)\n  IF(GSL_INCLUDE_DIR OR GSL_CXX_FLAGS)\n\n    SET(GSL_FOUND 1)\n    \n  ENDIF(GSL_INCLUDE_DIR OR GSL_CXX_FLAGS)\nENDIF(GSL_LIBRARIES)\n"
  },
  {
    "path": "libs/eigen/cmake/FindGoogleHash.cmake",
    "content": "\nif (GOOGLEHASH_INCLUDES AND GOOGLEHASH_LIBRARIES)\n  set(GOOGLEHASH_FIND_QUIETLY TRUE)\nendif (GOOGLEHASH_INCLUDES AND GOOGLEHASH_LIBRARIES)\n\nfind_path(GOOGLEHASH_INCLUDES\n  NAMES\n  google/dense_hash_map\n  PATHS\n  ${INCLUDE_INSTALL_DIR}\n)\n\nif(GOOGLEHASH_INCLUDES)\n  # let's make sure it compiles with the current compiler\n  file(WRITE ${CMAKE_BINARY_DIR}/googlehash_test.cpp\n  \"#include <google/sparse_hash_map>\\n#include <google/dense_hash_map>\\nint main(int argc, char** argv) { google::dense_hash_map<int,float> a; google::sparse_hash_map<int,float> b; return 0;}\\n\")\n  try_compile(GOOGLEHASH_COMPILE ${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}/googlehash_test.cpp OUTPUT_VARIABLE GOOGLEHASH_COMPILE_RESULT)\nendif(GOOGLEHASH_INCLUDES)\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(GOOGLEHASH DEFAULT_MSG GOOGLEHASH_INCLUDES GOOGLEHASH_COMPILE)\n\nmark_as_advanced(GOOGLEHASH_INCLUDES)\n"
  },
  {
    "path": "libs/eigen/cmake/FindLAPACK.cmake",
    "content": "# Find LAPACK library\n#\n# This module finds an installed library that implements the LAPACK\n# linear-algebra interface (see http://www.netlib.org/lapack/).\n# The approach follows mostly that taken for the autoconf macro file, acx_lapack.m4\n# (distributed at http://ac-archive.sourceforge.net/ac-archive/acx_lapack.html).\n#\n# This module sets the following variables:\n#  LAPACK_FOUND - set to true if a library implementing the LAPACK interface\n#    is found\n#  LAPACK_INCLUDE_DIR - Directories containing the LAPACK header files\n#  LAPACK_DEFINITIONS - Compilation options to use LAPACK\n#  LAPACK_LINKER_FLAGS - Linker flags to use LAPACK (excluding -l\n#    and -L).\n#  LAPACK_LIBRARIES_DIR - Directories containing the LAPACK libraries.\n#     May be null if LAPACK_LIBRARIES contains libraries name using full path.\n#  LAPACK_LIBRARIES - List of libraries to link against LAPACK interface.\n#     May be null if the compiler supports auto-link (e.g. VC++).\n#  LAPACK_USE_FILE - The name of the cmake module to include to compile\n#     applications or libraries using LAPACK.\n#\n# This module was modified by CGAL team:\n# - find libraries for a C++ compiler, instead of Fortran\n# - added LAPACK_INCLUDE_DIR, LAPACK_DEFINITIONS and LAPACK_LIBRARIES_DIR\n# - removed LAPACK95_LIBRARIES\n\n\ninclude(CheckFunctionExists)\n\n# This macro checks for the existence of the combination of fortran libraries\n# given by _list.  If the combination is found, this macro checks (using the\n# check_function_exists macro) whether can link against that library\n# combination using the name of a routine given by _name using the linker\n# flags given by _flags.  If the combination of libraries is found and passes\n# the link test, LIBRARIES is set to the list of complete library paths that\n# have been found and DEFINITIONS to the required definitions.\n# Otherwise, LIBRARIES is set to FALSE.\n# N.B. _prefix is the prefix applied to the names of all cached variables that\n# are generated internally and marked advanced by this macro.\nmacro(check_lapack_libraries DEFINITIONS LIBRARIES _prefix _name _flags _list _blas _path)\n  #message(\"DEBUG: check_lapack_libraries(${_list} in ${_path} with ${_blas})\")\n\n  # Check for the existence of the libraries given by _list\n  set(_libraries_found TRUE)\n  set(_libraries_work FALSE)\n  set(${DEFINITIONS} \"\")\n  set(${LIBRARIES} \"\")\n  set(_combined_name)\n  foreach(_library ${_list})\n    set(_combined_name ${_combined_name}_${_library})\n\n    if(_libraries_found)\n      # search first in ${_path}\n      find_library(${_prefix}_${_library}_LIBRARY\n                  NAMES ${_library}\n                  PATHS ${_path} NO_DEFAULT_PATH\n                  )\n      # if not found, search in environment variables and system\n      if ( WIN32 )\n        find_library(${_prefix}_${_library}_LIBRARY\n                    NAMES ${_library}\n                    PATHS ENV LIB\n                    )\n      elseif ( APPLE )\n        find_library(${_prefix}_${_library}_LIBRARY\n                    NAMES ${_library}\n                    PATHS /usr/local/lib /usr/lib /usr/local/lib64 /usr/lib64 ENV DYLD_LIBRARY_PATH\n                    )\n      else ()\n        find_library(${_prefix}_${_library}_LIBRARY\n                    NAMES ${_library}\n                    PATHS /usr/local/lib /usr/lib /usr/local/lib64 /usr/lib64 ENV LD_LIBRARY_PATH\n                    )\n      endif()\n      mark_as_advanced(${_prefix}_${_library}_LIBRARY)\n      set(${LIBRARIES} ${${LIBRARIES}} ${${_prefix}_${_library}_LIBRARY})\n      set(_libraries_found ${${_prefix}_${_library}_LIBRARY})\n    endif(_libraries_found)\n  endforeach(_library ${_list})\n  if(_libraries_found)\n    set(_libraries_found ${${LIBRARIES}})\n  endif()\n\n  # Test this combination of libraries with the Fortran/f2c interface.\n  # We test the Fortran interface first as it is well standardized.\n  if(_libraries_found AND NOT _libraries_work)\n    set(${DEFINITIONS}  \"-D${_prefix}_USE_F2C\")\n    set(${LIBRARIES}    ${_libraries_found})\n    # Some C++ linkers require the f2c library to link with Fortran libraries.\n    # I do not know which ones, thus I just add the f2c library if it is available.\n    find_package( F2C QUIET )\n    if ( F2C_FOUND )\n      set(${DEFINITIONS}  ${${DEFINITIONS}} ${F2C_DEFINITIONS})\n      set(${LIBRARIES}    ${${LIBRARIES}} ${F2C_LIBRARIES})\n    endif()\n    set(CMAKE_REQUIRED_DEFINITIONS  ${${DEFINITIONS}})\n    set(CMAKE_REQUIRED_LIBRARIES    ${_flags} ${${LIBRARIES}} ${_blas})\n    #message(\"DEBUG: CMAKE_REQUIRED_DEFINITIONS = ${CMAKE_REQUIRED_DEFINITIONS}\")\n    #message(\"DEBUG: CMAKE_REQUIRED_LIBRARIES = ${CMAKE_REQUIRED_LIBRARIES}\")\n    # Check if function exists with f2c calling convention (ie a trailing underscore)\n    check_function_exists(${_name}_ ${_prefix}_${_name}_${_combined_name}_f2c_WORKS)\n    set(CMAKE_REQUIRED_DEFINITIONS} \"\")\n    set(CMAKE_REQUIRED_LIBRARIES    \"\")\n    mark_as_advanced(${_prefix}_${_name}_${_combined_name}_f2c_WORKS)\n    set(_libraries_work ${${_prefix}_${_name}_${_combined_name}_f2c_WORKS})\n  endif(_libraries_found AND NOT _libraries_work)\n\n  # If not found, test this combination of libraries with a C interface.\n  # A few implementations (ie ACML) provide a C interface. Unfortunately, there is no standard.\n  if(_libraries_found AND NOT _libraries_work)\n    set(${DEFINITIONS} \"\")\n    set(${LIBRARIES}   ${_libraries_found})\n    set(CMAKE_REQUIRED_DEFINITIONS \"\")\n    set(CMAKE_REQUIRED_LIBRARIES   ${_flags} ${${LIBRARIES}} ${_blas})\n    #message(\"DEBUG: CMAKE_REQUIRED_LIBRARIES = ${CMAKE_REQUIRED_LIBRARIES}\")\n    check_function_exists(${_name} ${_prefix}_${_name}${_combined_name}_WORKS)\n    set(CMAKE_REQUIRED_LIBRARIES \"\")\n    mark_as_advanced(${_prefix}_${_name}${_combined_name}_WORKS)\n    set(_libraries_work ${${_prefix}_${_name}${_combined_name}_WORKS})\n  endif(_libraries_found AND NOT _libraries_work)\n\n  # on failure\n  if(NOT _libraries_work)\n    set(${DEFINITIONS} \"\")\n    set(${LIBRARIES}   FALSE)\n  endif()\n  #message(\"DEBUG: ${DEFINITIONS} = ${${DEFINITIONS}}\")\n  #message(\"DEBUG: ${LIBRARIES} = ${${LIBRARIES}}\")\nendmacro(check_lapack_libraries)\n\n\n#\n# main\n#\n\n# LAPACK requires BLAS\nif(LAPACK_FIND_QUIETLY OR NOT LAPACK_FIND_REQUIRED)\n  find_package(BLAS)\nelse()\n  find_package(BLAS REQUIRED)\nendif()\n\nif (NOT BLAS_FOUND)\n\n  message(STATUS \"LAPACK requires BLAS.\")\n  set(LAPACK_FOUND FALSE)\n\n# Is it already configured?\nelseif (LAPACK_LIBRARIES_DIR OR LAPACK_LIBRARIES)\n\n  set(LAPACK_FOUND TRUE)\n\nelse()\n\n  # reset variables\n  set( LAPACK_INCLUDE_DIR \"\" )\n  set( LAPACK_DEFINITIONS \"\" )\n  set( LAPACK_LINKER_FLAGS \"\" ) # unused (yet)\n  set( LAPACK_LIBRARIES \"\" )\n  set( LAPACK_LIBRARIES_DIR \"\" )\n\n    #\n    # If Unix, search for LAPACK function in possible libraries\n    #\n\n    #intel mkl lapack?\n    if(NOT LAPACK_LIBRARIES)\n      check_lapack_libraries(\n      LAPACK_DEFINITIONS\n      LAPACK_LIBRARIES\n      LAPACK\n      cheev\n      \"\"\n      \"mkl_lapack\"\n      \"${BLAS_LIBRARIES}\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV LAPACK_LIB_DIR\"\n      )\n    endif()\n\n    #acml lapack?\n    if(NOT LAPACK_LIBRARIES)\n      check_lapack_libraries(\n      LAPACK_DEFINITIONS\n      LAPACK_LIBRARIES\n      LAPACK\n      cheev\n      \"\"\n      \"acml\"\n      \"${BLAS_LIBRARIES}\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV LAPACK_LIB_DIR\"\n      )\n    endif()\n\n    # Apple LAPACK library?\n    if(NOT LAPACK_LIBRARIES)\n      check_lapack_libraries(\n      LAPACK_DEFINITIONS\n      LAPACK_LIBRARIES\n      LAPACK\n      cheev\n      \"\"\n      \"Accelerate\"\n      \"${BLAS_LIBRARIES}\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV LAPACK_LIB_DIR\"\n      )\n    endif()\n\n    if ( NOT LAPACK_LIBRARIES )\n      check_lapack_libraries(\n      LAPACK_DEFINITIONS\n      LAPACK_LIBRARIES\n      LAPACK\n      cheev\n      \"\"\n      \"vecLib\"\n      \"${BLAS_LIBRARIES}\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV LAPACK_LIB_DIR\"\n      )\n    endif ( NOT LAPACK_LIBRARIES )\n\n    # Generic LAPACK library?\n    # This configuration *must* be the last try as this library is notably slow.\n    if ( NOT LAPACK_LIBRARIES )\n      check_lapack_libraries(\n      LAPACK_DEFINITIONS\n      LAPACK_LIBRARIES\n      LAPACK\n      cheev\n      \"\"\n      \"lapack\"\n      \"${BLAS_LIBRARIES}\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV LAPACK_LIB_DIR\"\n      )\n    endif()\n\n  if(LAPACK_LIBRARIES_DIR OR LAPACK_LIBRARIES)\n    set(LAPACK_FOUND TRUE)\n  else()\n    set(LAPACK_FOUND FALSE)\n  endif()\n\n  if(NOT LAPACK_FIND_QUIETLY)\n    if(LAPACK_FOUND)\n      message(STATUS \"A library with LAPACK API found.\")\n    else(LAPACK_FOUND)\n      if(LAPACK_FIND_REQUIRED)\n        message(FATAL_ERROR \"A required library with LAPACK API not found. Please specify library location.\")\n      else()\n        message(STATUS \"A library with LAPACK API not found. Please specify library location.\")\n      endif()\n    endif(LAPACK_FOUND)\n  endif(NOT LAPACK_FIND_QUIETLY)\n\n  # Add variables to cache\n  set( LAPACK_INCLUDE_DIR   \"${LAPACK_INCLUDE_DIR}\"\n                            CACHE PATH \"Directories containing the LAPACK header files\" FORCE )\n  set( LAPACK_DEFINITIONS   \"${LAPACK_DEFINITIONS}\"\n                            CACHE STRING \"Compilation options to use LAPACK\" FORCE )\n  set( LAPACK_LINKER_FLAGS  \"${LAPACK_LINKER_FLAGS}\"\n                            CACHE STRING \"Linker flags to use LAPACK\" FORCE )\n  set( LAPACK_LIBRARIES     \"${LAPACK_LIBRARIES}\"\n                            CACHE FILEPATH \"LAPACK libraries name\" FORCE )\n  set( LAPACK_LIBRARIES_DIR \"${LAPACK_LIBRARIES_DIR}\"\n                            CACHE PATH \"Directories containing the LAPACK libraries\" FORCE )\n\n  #message(\"DEBUG: LAPACK_INCLUDE_DIR = ${LAPACK_INCLUDE_DIR}\")\n  #message(\"DEBUG: LAPACK_DEFINITIONS = ${LAPACK_DEFINITIONS}\")\n  #message(\"DEBUG: LAPACK_LINKER_FLAGS = ${LAPACK_LINKER_FLAGS}\")\n  #message(\"DEBUG: LAPACK_LIBRARIES = ${LAPACK_LIBRARIES}\")\n  #message(\"DEBUG: LAPACK_LIBRARIES_DIR = ${LAPACK_LIBRARIES_DIR}\")\n  #message(\"DEBUG: LAPACK_FOUND = ${LAPACK_FOUND}\")\n\nendif(NOT BLAS_FOUND)\n"
  },
  {
    "path": "libs/eigen/cmake/FindMPFR.cmake",
    "content": "# Try to find the MPFR library\n# See http://www.mpfr.org/\n#\n# This module supports requiring a minimum version, e.g. you can do\n#   find_package(MPFR 2.3.0)\n# to require version 2.3.0 to newer of MPFR.\n#\n# Once done this will define\n#\n#  MPFR_FOUND - system has MPFR lib with correct version\n#  MPFR_INCLUDES - the MPFR include directory\n#  MPFR_LIBRARIES - the MPFR library\n#  MPFR_VERSION - MPFR version\n\n# Copyright (c) 2006, 2007 Montel Laurent, <montel@kde.org>\n# Copyright (c) 2008, 2009 Gael Guennebaud, <g.gael@free.fr>\n# Copyright (c) 2010 Jitse Niesen, <jitse@maths.leeds.ac.uk>\n# Redistribution and use is allowed according to the terms of the BSD license.\n\n# Set MPFR_INCLUDES\n\nfind_path(MPFR_INCLUDES\n  NAMES\n  mpfr.h\n  PATHS\n  $ENV{GMPDIR}\n  ${INCLUDE_INSTALL_DIR}\n)\n\n# Set MPFR_FIND_VERSION to 1.0.0 if no minimum version is specified\n\nif(NOT MPFR_FIND_VERSION)\n  if(NOT MPFR_FIND_VERSION_MAJOR)\n    set(MPFR_FIND_VERSION_MAJOR 1)\n  endif(NOT MPFR_FIND_VERSION_MAJOR)\n  if(NOT MPFR_FIND_VERSION_MINOR)\n    set(MPFR_FIND_VERSION_MINOR 0)\n  endif(NOT MPFR_FIND_VERSION_MINOR)\n  if(NOT MPFR_FIND_VERSION_PATCH)\n    set(MPFR_FIND_VERSION_PATCH 0)\n  endif(NOT MPFR_FIND_VERSION_PATCH)\n\n  set(MPFR_FIND_VERSION \"${MPFR_FIND_VERSION_MAJOR}.${MPFR_FIND_VERSION_MINOR}.${MPFR_FIND_VERSION_PATCH}\")\nendif(NOT MPFR_FIND_VERSION)\n\n\nif(MPFR_INCLUDES)\n\n  # Set MPFR_VERSION\n  \n  file(READ \"${MPFR_INCLUDES}/mpfr.h\" _mpfr_version_header)\n  \n  string(REGEX MATCH \"define[ \\t]+MPFR_VERSION_MAJOR[ \\t]+([0-9]+)\" _mpfr_major_version_match \"${_mpfr_version_header}\")\n  set(MPFR_MAJOR_VERSION \"${CMAKE_MATCH_1}\")\n  string(REGEX MATCH \"define[ \\t]+MPFR_VERSION_MINOR[ \\t]+([0-9]+)\" _mpfr_minor_version_match \"${_mpfr_version_header}\")\n  set(MPFR_MINOR_VERSION \"${CMAKE_MATCH_1}\")\n  string(REGEX MATCH \"define[ \\t]+MPFR_VERSION_PATCHLEVEL[ \\t]+([0-9]+)\" _mpfr_patchlevel_version_match \"${_mpfr_version_header}\")\n  set(MPFR_PATCHLEVEL_VERSION \"${CMAKE_MATCH_1}\")\n  \n  set(MPFR_VERSION ${MPFR_MAJOR_VERSION}.${MPFR_MINOR_VERSION}.${MPFR_PATCHLEVEL_VERSION})\n  \n  # Check whether found version exceeds minimum version\n  \n  if(${MPFR_VERSION} VERSION_LESS ${MPFR_FIND_VERSION})\n    set(MPFR_VERSION_OK FALSE)\n    message(STATUS \"MPFR version ${MPFR_VERSION} found in ${MPFR_INCLUDES}, \"\n                   \"but at least version ${MPFR_FIND_VERSION} is required\")\n  else(${MPFR_VERSION} VERSION_LESS ${MPFR_FIND_VERSION})\n    set(MPFR_VERSION_OK TRUE)\n  endif(${MPFR_VERSION} VERSION_LESS ${MPFR_FIND_VERSION})\n\nendif(MPFR_INCLUDES)\n\n# Set MPFR_LIBRARIES\n\nfind_library(MPFR_LIBRARIES mpfr PATHS $ENV{GMPDIR} ${LIB_INSTALL_DIR})\n\n# Epilogue\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(MPFR DEFAULT_MSG\n                                  MPFR_INCLUDES MPFR_LIBRARIES MPFR_VERSION_OK)\nmark_as_advanced(MPFR_INCLUDES MPFR_LIBRARIES)\n"
  },
  {
    "path": "libs/eigen/cmake/FindMetis.cmake",
    "content": "# Pastix requires METIS or METIS (partitioning and reordering tools)\n\nif (METIS_INCLUDES AND METIS_LIBRARIES)\n  set(METIS_FIND_QUIETLY TRUE)\nendif (METIS_INCLUDES AND METIS_LIBRARIES)\n\nfind_path(METIS_INCLUDES \n  NAMES \n  metis.h \n  PATHS \n  $ENV{METISDIR} \n  ${INCLUDE_INSTALL_DIR} \n  PATH_SUFFIXES\n  .\n  metis\n  include\n)\n\nmacro(_metis_check_version)\n  file(READ \"${METIS_INCLUDES}/metis.h\" _metis_version_header)\n\n  string(REGEX MATCH \"define[ \\t]+METIS_VER_MAJOR[ \\t]+([0-9]+)\" _metis_major_version_match \"${_metis_version_header}\")\n  set(METIS_MAJOR_VERSION \"${CMAKE_MATCH_1}\")\n  string(REGEX MATCH \"define[ \\t]+METIS_VER_MINOR[ \\t]+([0-9]+)\" _metis_minor_version_match \"${_metis_version_header}\")\n  set(METIS_MINOR_VERSION \"${CMAKE_MATCH_1}\")\n  string(REGEX MATCH \"define[ \\t]+METIS_VER_SUBMINOR[ \\t]+([0-9]+)\" _metis_subminor_version_match \"${_metis_version_header}\")\n  set(METIS_SUBMINOR_VERSION \"${CMAKE_MATCH_1}\")\n  if(NOT METIS_MAJOR_VERSION)\n    message(STATUS \"Could not determine Metis version. Assuming version 4.0.0\")\n    set(METIS_VERSION 4.0.0)\n  else()\n    set(METIS_VERSION ${METIS_MAJOR_VERSION}.${METIS_MINOR_VERSION}.${METIS_SUBMINOR_VERSION})\n  endif()\n  if(${METIS_VERSION} VERSION_LESS ${Metis_FIND_VERSION})\n    set(METIS_VERSION_OK FALSE)\n  else()\n    set(METIS_VERSION_OK TRUE)\n  endif()\n\n  if(NOT METIS_VERSION_OK)\n    message(STATUS \"Metis version ${METIS_VERSION} found in ${METIS_INCLUDES}, \"\n                   \"but at least version ${Metis_FIND_VERSION} is required\")\n  endif(NOT METIS_VERSION_OK)\nendmacro(_metis_check_version)\n\n  if(METIS_INCLUDES AND Metis_FIND_VERSION)\n    _metis_check_version()\n  else()\n    set(METIS_VERSION_OK TRUE)\n  endif()\n\n\nfind_library(METIS_LIBRARIES metis PATHS $ENV{METISDIR} ${LIB_INSTALL_DIR} PATH_SUFFIXES lib)\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(METIS DEFAULT_MSG\n                                  METIS_INCLUDES METIS_LIBRARIES METIS_VERSION_OK)\n\nmark_as_advanced(METIS_INCLUDES METIS_LIBRARIES)\n"
  },
  {
    "path": "libs/eigen/cmake/FindPastix.cmake",
    "content": "# Pastix lib requires linking to a blas library.\n# It is up to the user of this module to find a BLAS and link to it.\n# Pastix requires SCOTCH or METIS (partitioning and reordering tools) as well\n\nif (PASTIX_INCLUDES AND PASTIX_LIBRARIES)\n  set(PASTIX_FIND_QUIETLY TRUE)\nendif (PASTIX_INCLUDES AND PASTIX_LIBRARIES)\n\nfind_path(PASTIX_INCLUDES\n  NAMES\n  pastix_nompi.h\n  PATHS\n  $ENV{PASTIXDIR}\n  ${INCLUDE_INSTALL_DIR}\n)\n\nfind_library(PASTIX_LIBRARIES pastix PATHS $ENV{PASTIXDIR} ${LIB_INSTALL_DIR})\n\n\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(PASTIX DEFAULT_MSG\n                                  PASTIX_INCLUDES PASTIX_LIBRARIES)\n\nmark_as_advanced(PASTIX_INCLUDES PASTIX_LIBRARIES)\n"
  },
  {
    "path": "libs/eigen/cmake/FindSPQR.cmake",
    "content": "# SPQR lib usually requires linking to a blas and lapack library.\n# It is up to the user of this module to find a BLAS and link to it.\n\n# SPQR lib requires Cholmod, colamd and amd as well. \n# FindCholmod.cmake can be used to find those packages before finding spqr\n\nif (SPQR_INCLUDES AND SPQR_LIBRARIES)\n  set(SPQR_FIND_QUIETLY TRUE)\nendif (SPQR_INCLUDES AND SPQR_LIBRARIES)\n\nfind_path(SPQR_INCLUDES\n  NAMES\n  SuiteSparseQR.hpp\n  PATHS\n  $ENV{SPQRDIR}\n  ${INCLUDE_INSTALL_DIR}\n  PATH_SUFFIXES\n  suitesparse\n  ufsparse\n)\n\nfind_library(SPQR_LIBRARIES spqr $ENV{SPQRDIR} ${LIB_INSTALL_DIR})\n\nif(SPQR_LIBRARIES)\n\n  find_library(SUITESPARSE_LIBRARY SuiteSparse PATHS $ENV{SPQRDIR} ${LIB_INSTALL_DIR})\n  if (SUITESPARSE_LIBRARY)\n    set(SPQR_LIBRARIES ${SPQR_LIBRARIES} ${SUITESPARSE_LIBRARY})\n  endif()\n\n  find_library(CHOLMOD_LIBRARY cholmod PATHS $ENV{UMFPACK_LIBDIR} $ENV{UMFPACKDIR} ${LIB_INSTALL_DIR})\n  if(CHOLMOD_LIBRARY)\n    set(SPQR_LIBRARIES ${SPQR_LIBRARIES} ${CHOLMOD_LIBRARY})\n  endif()\n  \nendif(SPQR_LIBRARIES)\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(SPQR DEFAULT_MSG SPQR_INCLUDES SPQR_LIBRARIES)\n\nmark_as_advanced(SPQR_INCLUDES SPQR_LIBRARIES)"
  },
  {
    "path": "libs/eigen/cmake/FindScotch.cmake",
    "content": "# Pastix requires SCOTCH or METIS (partitioning and reordering tools)\n\nif (SCOTCH_INCLUDES AND SCOTCH_LIBRARIES)\n  set(SCOTCH_FIND_QUIETLY TRUE)\nendif (SCOTCH_INCLUDES AND SCOTCH_LIBRARIES)\n\nfind_path(SCOTCH_INCLUDES \n  NAMES \n  scotch.h \n  PATHS \n  $ENV{SCOTCHDIR} \n  ${INCLUDE_INSTALL_DIR} \n  PATH_SUFFIXES \n  scotch\n)\n\n\nfind_library(SCOTCH_LIBRARIES scotch PATHS $ENV{SCOTCHDIR} ${LIB_INSTALL_DIR})\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(SCOTCH DEFAULT_MSG\n                                  SCOTCH_INCLUDES SCOTCH_LIBRARIES)\n\nmark_as_advanced(SCOTCH_INCLUDES SCOTCH_LIBRARIES)\n"
  },
  {
    "path": "libs/eigen/cmake/FindStandardMathLibrary.cmake",
    "content": "# - Try to find how to link to the standard math library, if anything at all is needed to do.\n# On most platforms this is automatic, but for example it's not automatic on QNX.\n#\n# Once done this will define\n#\n#  STANDARD_MATH_LIBRARY_FOUND - we found how to successfully link to the standard math library\n#  STANDARD_MATH_LIBRARY - the name of the standard library that one has to link to.\n#                            -- this will be left empty if it's automatic (most platforms).\n#                            -- this will be set to \"m\" on platforms where one must explicitly\n#                               pass the \"-lm\" linker flag.\n#\n# Copyright (c) 2010 Benoit Jacob <jacob.benoit.1@gmail.com>\n# Redistribution and use is allowed according to the terms of the 2-clause BSD license.\n\n\ninclude(CheckCXXSourceCompiles)\n\n# a little test program for c++ math functions.\n# notice the std:: is required on some platforms such as QNX\n\nset(find_standard_math_library_test_program\n\"#include<cmath>\nint main() { std::sin(0.0); std::log(0.0f); }\")\n\n# first try compiling/linking the test program without any linker flags\n\nset(CMAKE_REQUIRED_FLAGS \"\")\nset(CMAKE_REQUIRED_LIBRARIES \"\")\nCHECK_CXX_SOURCE_COMPILES(\n  \"${find_standard_math_library_test_program}\"\n  standard_math_library_linked_to_automatically\n)\n\nif(standard_math_library_linked_to_automatically)\n\n  # the test program linked successfully without any linker flag.\n  set(STANDARD_MATH_LIBRARY \"\")\n  set(STANDARD_MATH_LIBRARY_FOUND TRUE)\n\nelse()\n\n  # the test program did not link successfully without any linker flag.\n  # This is a very uncommon case that so far we only saw on QNX. The next try is the\n  # standard name 'm' for the standard math library.\n\n  set(CMAKE_REQUIRED_LIBRARIES \"m\")\n  CHECK_CXX_SOURCE_COMPILES(\n    \"${find_standard_math_library_test_program}\"\n    standard_math_library_linked_to_as_m)\n\n  if(standard_math_library_linked_to_as_m)\n\n    # the test program linked successfully when linking to the 'm' library\n    set(STANDARD_MATH_LIBRARY \"m\")\n    set(STANDARD_MATH_LIBRARY_FOUND TRUE)\n\n  else()\n\n    # the test program still doesn't link successfully\n    set(STANDARD_MATH_LIBRARY_FOUND FALSE)\n\n  endif()\n\nendif()\n"
  },
  {
    "path": "libs/eigen/cmake/FindSuperLU.cmake",
    "content": "\n# Umfpack lib usually requires linking to a blas library.\n# It is up to the user of this module to find a BLAS and link to it.\n\nif (SUPERLU_INCLUDES AND SUPERLU_LIBRARIES)\n  set(SUPERLU_FIND_QUIETLY TRUE)\nendif (SUPERLU_INCLUDES AND SUPERLU_LIBRARIES)\n\nfind_path(SUPERLU_INCLUDES\n  NAMES\n  supermatrix.h\n  PATHS\n  $ENV{SUPERLUDIR}\n  ${INCLUDE_INSTALL_DIR}\n  PATH_SUFFIXES\n  superlu\n  SRC\n)\n\nfind_library(SUPERLU_LIBRARIES superlu PATHS $ENV{SUPERLUDIR} ${LIB_INSTALL_DIR} PATH_SUFFIXES lib)\n  \ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(SUPERLU DEFAULT_MSG\n                                  SUPERLU_INCLUDES SUPERLU_LIBRARIES)\n\nmark_as_advanced(SUPERLU_INCLUDES SUPERLU_LIBRARIES)\n"
  },
  {
    "path": "libs/eigen/cmake/FindUmfpack.cmake",
    "content": "# Umfpack lib usually requires linking to a blas library.\n# It is up to the user of this module to find a BLAS and link to it.\n\nif (UMFPACK_INCLUDES AND UMFPACK_LIBRARIES)\n  set(UMFPACK_FIND_QUIETLY TRUE)\nendif (UMFPACK_INCLUDES AND UMFPACK_LIBRARIES)\n\nfind_path(UMFPACK_INCLUDES\n  NAMES\n  umfpack.h\n  PATHS\n  $ENV{UMFPACKDIR}\n  ${INCLUDE_INSTALL_DIR}\n  PATH_SUFFIXES\n  suitesparse\n  ufsparse\n)\n\nfind_library(UMFPACK_LIBRARIES umfpack PATHS $ENV{UMFPACKDIR} ${LIB_INSTALL_DIR})\n\nif(UMFPACK_LIBRARIES)\n\n  if(NOT UMFPACK_LIBDIR)\n    get_filename_component(UMFPACK_LIBDIR ${UMFPACK_LIBRARIES} PATH)\n  endif(NOT UMFPACK_LIBDIR)\n\n  find_library(COLAMD_LIBRARY colamd PATHS ${UMFPACK_LIBDIR} $ENV{UMFPACKDIR} ${LIB_INSTALL_DIR})\n  if(COLAMD_LIBRARY)\n    set(UMFPACK_LIBRARIES ${UMFPACK_LIBRARIES} ${COLAMD_LIBRARY})\n  endif ()\n  \n  find_library(AMD_LIBRARY amd PATHS ${UMFPACK_LIBDIR} $ENV{UMFPACKDIR} ${LIB_INSTALL_DIR})\n  if(AMD_LIBRARY)\n    set(UMFPACK_LIBRARIES ${UMFPACK_LIBRARIES} ${AMD_LIBRARY})\n  endif ()\n\n  find_library(SUITESPARSE_LIBRARY SuiteSparse PATHS ${UMFPACK_LIBDIR} $ENV{UMFPACKDIR} ${LIB_INSTALL_DIR})\n  if(SUITESPARSE_LIBRARY)\n    set(UMFPACK_LIBRARIES ${UMFPACK_LIBRARIES} ${SUITESPARSE_LIBRARY})\n  endif ()\n\n  find_library(CHOLMOD_LIBRARY cholmod PATHS $ENV{UMFPACK_LIBDIR} $ENV{UMFPACKDIR} ${LIB_INSTALL_DIR})\n  if(CHOLMOD_LIBRARY)\n    set(UMFPACK_LIBRARIES ${UMFPACK_LIBRARIES} ${CHOLMOD_LIBRARY})\n  endif()\n\nendif(UMFPACK_LIBRARIES)\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(UMFPACK DEFAULT_MSG\n                                  UMFPACK_INCLUDES UMFPACK_LIBRARIES)\n\nmark_as_advanced(UMFPACK_INCLUDES UMFPACK_LIBRARIES AMD_LIBRARY COLAMD_LIBRARY CHOLMOD_LIBRARY SUITESPARSE_LIBRARY)\n"
  },
  {
    "path": "libs/eigen/cmake/RegexUtils.cmake",
    "content": "function(escape_string_as_regex _str_out _str_in)\n  STRING(REGEX REPLACE \"\\\\\\\\\" \"\\\\\\\\\\\\\\\\\" FILETEST2 \"${_str_in}\")\n  STRING(REGEX REPLACE \"([.$+*?|-])\" \"\\\\\\\\\\\\1\" FILETEST2 \"${FILETEST2}\")\n  STRING(REGEX REPLACE \"\\\\^\" \"\\\\\\\\^\" FILETEST2 \"${FILETEST2}\")\n  STRING(REGEX REPLACE \"\\\\(\" \"\\\\\\\\(\" FILETEST2 \"${FILETEST2}\")\n  STRING(REGEX REPLACE \"\\\\)\" \"\\\\\\\\)\" FILETEST2 \"${FILETEST2}\")\n  STRING(REGEX REPLACE \"\\\\[\" \"\\\\\\\\[\" FILETEST2 \"${FILETEST2}\")\n  STRING(REGEX REPLACE \"\\\\]\" \"\\\\\\\\]\" FILETEST2 \"${FILETEST2}\")\n  SET(${_str_out} \"${FILETEST2}\" PARENT_SCOPE)\nendfunction()\n\nfunction(test_escape_string_as_regex)\n  SET(test1 \"\\\\.^$-+*()[]?|\")\n  escape_string_as_regex(test2 \"${test1}\")\n  SET(testRef \"\\\\\\\\\\\\.\\\\^\\\\$\\\\-\\\\+\\\\*\\\\(\\\\)\\\\[\\\\]\\\\?\\\\|\")\n  if(NOT test2 STREQUAL testRef)\n\tmessage(\"Error in the escape_string_for_regex function : \\n   ${test1} was escaped as ${test2}, should be ${testRef}\")\n  endif(NOT test2 STREQUAL testRef)\nendfunction()"
  },
  {
    "path": "libs/eigen/cmake/language_support.cmake",
    "content": "# cmake/modules/language_support.cmake\n#\n# Temporary additional general language support is contained within this\n# file.  \n\n# This additional function definition is needed to provide a workaround for\n# CMake bug 9220.\n\n# On debian testing (cmake 2.6.2), I get return code zero when calling \n# cmake the first time, but cmake crashes when running a second time\n# as follows:\n#\n#  -- The Fortran compiler identification is unknown\n#  CMake Error at /usr/share/cmake-2.6/Modules/CMakeFortranInformation.cmake:7 (GET_FILENAME_COMPONENT):\n#    get_filename_component called with incorrect number of arguments\n#  Call Stack (most recent call first):\n#    CMakeLists.txt:3 (enable_language)\n#\n# My workaround is to invoke cmake twice.  If both return codes are zero, \n# it is safe to invoke ENABLE_LANGUAGE(Fortran OPTIONAL)\n\nfunction(workaround_9220 language language_works)\n  #message(\"DEBUG: language = ${language}\")\n  set(text\n    \"project(test NONE)\n    cmake_minimum_required(VERSION 2.8.0)\n    set (CMAKE_Fortran_FLAGS \\\"${CMAKE_Fortran_FLAGS}\\\")\n    set (CMAKE_EXE_LINKER_FLAGS \\\"${CMAKE_EXE_LINKER_FLAGS}\\\")\n    enable_language(${language} OPTIONAL)\n  \")\n  file(REMOVE_RECURSE ${CMAKE_BINARY_DIR}/language_tests/${language})\n  file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/language_tests/${language})\n  file(WRITE ${CMAKE_BINARY_DIR}/language_tests/${language}/CMakeLists.txt\n    ${text})\n  execute_process(\n    COMMAND ${CMAKE_COMMAND} . -G \"${CMAKE_GENERATOR}\"\n    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/language_tests/${language}\n    RESULT_VARIABLE return_code\n    OUTPUT_QUIET\n    ERROR_QUIET\n    )\n\n  if(return_code EQUAL 0)\n    # Second run\n    execute_process (\n      COMMAND ${CMAKE_COMMAND} .\n      WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/language_tests/${language}\n      RESULT_VARIABLE return_code\n      OUTPUT_QUIET\n      ERROR_QUIET\n      )\n    if(return_code EQUAL 0)\n      set(${language_works} ON PARENT_SCOPE)\n    else(return_code EQUAL 0)\n      set(${language_works} OFF PARENT_SCOPE)\n    endif(return_code EQUAL 0)\n  else(return_code EQUAL 0)\n    set(${language_works} OFF PARENT_SCOPE)\n  endif(return_code EQUAL 0)\nendfunction(workaround_9220)\n\n# Temporary tests of the above function.\n#workaround_9220(CXX CXX_language_works)\n#message(\"CXX_language_works = ${CXX_language_works}\")\n#workaround_9220(CXXp CXXp_language_works)\n#message(\"CXXp_language_works = ${CXXp_language_works}\")\n"
  },
  {
    "path": "libs/eigen/debug/gdb/__init__.py",
    "content": "# Intentionally empty\n"
  },
  {
    "path": "libs/eigen/debug/gdb/printers.py",
    "content": "# -*- coding: utf-8 -*-\n# This file is part of Eigen, a lightweight C++ template library\n# for linear algebra.\n#\n# Copyright (C) 2009 Benjamin Schindler <bschindler@inf.ethz.ch>\n#\n# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n# Pretty printers for Eigen::Matrix\n# This is still pretty basic as the python extension to gdb is still pretty basic. \n# It cannot handle complex eigen types and it doesn't support any of the other eigen types\n# Such as quaternion or some other type. \n# This code supports fixed size as well as dynamic size matrices\n\n# To use it:\n#\n# * Create a directory and put the file as well as an empty __init__.py in \n#   that directory.\n# * Create a ~/.gdbinit file, that contains the following:\n#      python\n#      import sys\n#      sys.path.insert(0, '/path/to/eigen/printer/directory')\n#      from printers import register_eigen_printers\n#      register_eigen_printers (None)\n#      end\n\nimport gdb\nimport re\nimport itertools\n\n\nclass EigenMatrixPrinter:\n\t\"Print Eigen Matrix or Array of some kind\"\n\n\tdef __init__(self, variety, val):\n\t\t\"Extract all the necessary information\"\n\t\t\n\t\t# Save the variety (presumably \"Matrix\" or \"Array\") for later usage\n\t\tself.variety = variety\n\t\t\n\t\t# The gdb extension does not support value template arguments - need to extract them by hand\n\t\ttype = val.type\n\t\tif type.code == gdb.TYPE_CODE_REF:\n\t\t\ttype = type.target()\n\t\tself.type = type.unqualified().strip_typedefs()\n\t\ttag = self.type.tag\n\t\tregex = re.compile('\\<.*\\>')\n\t\tm = regex.findall(tag)[0][1:-1]\n\t\ttemplate_params = m.split(',')\n\t\ttemplate_params = map(lambda x:x.replace(\" \", \"\"), template_params)\n\t\t\n\t\tif template_params[1] == '-0x00000000000000001' or template_params[1] == '-0x000000001' or template_params[1] == '-1':\n\t\t\tself.rows = val['m_storage']['m_rows']\n\t\telse:\n\t\t\tself.rows = int(template_params[1])\n\t\t\n\t\tif template_params[2] == '-0x00000000000000001' or template_params[2] == '-0x000000001' or template_params[2] == '-1':\n\t\t\tself.cols = val['m_storage']['m_cols']\n\t\telse:\n\t\t\tself.cols = int(template_params[2])\n\t\t\n\t\tself.options = 0 # default value\n\t\tif len(template_params) > 3:\n\t\t\tself.options = template_params[3];\n\t\t\n\t\tself.rowMajor = (int(self.options) & 0x1)\n\t\t\n\t\tself.innerType = self.type.template_argument(0)\n\t\t\n\t\tself.val = val\n\t\t\n\t\t# Fixed size matrices have a struct as their storage, so we need to walk through this\n\t\tself.data = self.val['m_storage']['m_data']\n\t\tif self.data.type.code == gdb.TYPE_CODE_STRUCT:\n\t\t\tself.data = self.data['array']\n\t\t\tself.data = self.data.cast(self.innerType.pointer())\n\t\t\t\n\tclass _iterator:\n\t\tdef __init__ (self, rows, cols, dataPtr, rowMajor):\n\t\t\tself.rows = rows\n\t\t\tself.cols = cols\n\t\t\tself.dataPtr = dataPtr\n\t\t\tself.currentRow = 0\n\t\t\tself.currentCol = 0\n\t\t\tself.rowMajor = rowMajor\n\t\t\t\n\t\tdef __iter__ (self):\n\t\t\treturn self\n\t\t\t\n\t\tdef next(self):\n\t\t\t\n\t\t\trow = self.currentRow\n\t\t\tcol = self.currentCol\n\t\t\tif self.rowMajor == 0:\n\t\t\t\tif self.currentCol >= self.cols:\n\t\t\t\t\traise StopIteration\n\t\t\t\t\t\n\t\t\t\tself.currentRow = self.currentRow + 1\n\t\t\t\tif self.currentRow >= self.rows:\n\t\t\t\t\tself.currentRow = 0\n\t\t\t\t\tself.currentCol = self.currentCol + 1\n\t\t\telse:\n\t\t\t\tif self.currentRow >= self.rows:\n\t\t\t\t\traise StopIteration\n\t\t\t\t\t\n\t\t\t\tself.currentCol = self.currentCol + 1\n\t\t\t\tif self.currentCol >= self.cols:\n\t\t\t\t\tself.currentCol = 0\n\t\t\t\t\tself.currentRow = self.currentRow + 1\n\t\t\t\t\n\t\t\t\n\t\t\titem = self.dataPtr.dereference()\n\t\t\tself.dataPtr = self.dataPtr + 1\n\t\t\tif (self.cols == 1): #if it's a column vector\n\t\t\t\treturn ('[%d]' % (row,), item)\n\t\t\telif (self.rows == 1): #if it's a row vector\n\t\t\t\treturn ('[%d]' % (col,), item)\n\t\t\treturn ('[%d,%d]' % (row, col), item)\n\t\t\t\n\tdef children(self):\n\t\t\n\t\treturn self._iterator(self.rows, self.cols, self.data, self.rowMajor)\n\t\t\n\tdef to_string(self):\n\t\treturn \"Eigen::%s<%s,%d,%d,%s> (data ptr: %s)\" % (self.variety, self.innerType, self.rows, self.cols, \"RowMajor\" if self.rowMajor else  \"ColMajor\", self.data)\n\nclass EigenQuaternionPrinter:\n\t\"Print an Eigen Quaternion\"\n\t\n\tdef __init__(self, val):\n\t\t\"Extract all the necessary information\"\n\t\t# The gdb extension does not support value template arguments - need to extract them by hand\n\t\ttype = val.type\n\t\tif type.code == gdb.TYPE_CODE_REF:\n\t\t\ttype = type.target()\n\t\tself.type = type.unqualified().strip_typedefs()\n\t\tself.innerType = self.type.template_argument(0)\n\t\tself.val = val\n\t\t\n\t\t# Quaternions have a struct as their storage, so we need to walk through this\n\t\tself.data = self.val['m_coeffs']['m_storage']['m_data']['array']\n\t\tself.data = self.data.cast(self.innerType.pointer())\n\t\t\t\n\tclass _iterator:\n\t\tdef __init__ (self, dataPtr):\n\t\t\tself.dataPtr = dataPtr\n\t\t\tself.currentElement = 0\n\t\t\tself.elementNames = ['x', 'y', 'z', 'w']\n\t\t\t\n\t\tdef __iter__ (self):\n\t\t\treturn self\n\t\t\t\n\t\tdef next(self):\n\t\t\telement = self.currentElement\n\t\t\t\n\t\t\tif self.currentElement >= 4: #there are 4 elements in a quanternion\n\t\t\t\traise StopIteration\n\t\t\t\n\t\t\tself.currentElement = self.currentElement + 1\n\t\t\t\n\t\t\titem = self.dataPtr.dereference()\n\t\t\tself.dataPtr = self.dataPtr + 1\n\t\t\treturn ('[%s]' % (self.elementNames[element],), item)\n\t\t\t\n\tdef children(self):\n\t\t\n\t\treturn self._iterator(self.data)\n\t\n\tdef to_string(self):\n\t\treturn \"Eigen::Quaternion<%s> (data ptr: %s)\" % (self.innerType, self.data)\n\ndef build_eigen_dictionary ():\n\tpretty_printers_dict[re.compile('^Eigen::Quaternion<.*>$')] = lambda val: EigenQuaternionPrinter(val)\n\tpretty_printers_dict[re.compile('^Eigen::Matrix<.*>$')] = lambda val: EigenMatrixPrinter(\"Matrix\", val)\n\tpretty_printers_dict[re.compile('^Eigen::Array<.*>$')]  = lambda val: EigenMatrixPrinter(\"Array\",  val)\n\ndef register_eigen_printers(obj):\n\t\"Register eigen pretty-printers with objfile Obj\"\n\n\tif obj == None:\n\t\tobj = gdb\n\tobj.pretty_printers.append(lookup_function)\n\ndef lookup_function(val):\n\t\"Look-up and return a pretty-printer that can print va.\"\n\t\n\ttype = val.type\n\t\n\tif type.code == gdb.TYPE_CODE_REF:\n\t\ttype = type.target()\n\t\n\ttype = type.unqualified().strip_typedefs()\n\t\n\ttypename = type.tag\n\tif typename == None:\n\t\treturn None\n\t\n\tfor function in pretty_printers_dict:\n\t\tif function.search(typename):\n\t\t\treturn pretty_printers_dict[function](val)\n\t\n\treturn None\n\npretty_printers_dict = {}\n\nbuild_eigen_dictionary ()\n"
  },
  {
    "path": "libs/eigen/debug/msvc/eigen.natvis",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n\r\n<AutoVisualizer xmlns=\"http://schemas.microsoft.com/vstudio/debugger/natvis/2010\">\r\n\r\n  <!-- Fixed x Fixed Matrix -->\r\n  <Type Name=\"Eigen::Matrix&lt;*,*,*,*,*,*&gt;\">      \r\n      <AlternativeType Name=\"Eigen::Array&lt;*,-1,-1,*,*,*&gt;\"/>\r\n      <DisplayString>[{$T2}, {$T3}] (fixed matrix)</DisplayString>\r\n      <Expand>\r\n        <ArrayItems Condition=\"Flags%2\"> <!-- row major layout -->\r\n          <Rank>2</Rank>\r\n          <Size>$i==0 ? $T2 : $T3</Size>\r\n          <ValuePointer>m_storage.m_data.array</ValuePointer>\r\n        </ArrayItems>\r\n        <ArrayItems Condition=\"!(Flags%2)\"> <!-- column major layout -->\r\n          <Direction>Backward</Direction>\r\n          <Rank>2</Rank>\r\n          <Size>$i==0 ? $T2 : $T3</Size>\r\n          <ValuePointer>m_storage.m_data.array</ValuePointer>\r\n        </ArrayItems>\r\n      </Expand>\r\n  </Type>\r\n  \r\n  <!-- 2 x 2 Matrix -->\r\n  <Type Name=\"Eigen::Matrix&lt;*,2,2,*,*,*&gt;\">      \r\n      <AlternativeType Name=\"Eigen::Array&lt;*,2,2,*,*,*&gt;\"/>\r\n      <DisplayString>[2, 2] (fixed matrix)</DisplayString>\r\n      <Expand>\r\n        <Synthetic Name=\"[row 0]\" Condition=\"Flags%2\">\r\n          <DisplayString>({m_storage.m_data.array[0]}, {m_storage.m_data.array[1]})</DisplayString>\r\n        </Synthetic>\r\n        <Synthetic Name=\"[row 0]\" Condition=\"!(Flags%2)\">\r\n          <DisplayString>({m_storage.m_data.array[0]}, {m_storage.m_data.array[2]})</DisplayString>\r\n        </Synthetic>\r\n        <Synthetic Name=\"[row 1]\" Condition=\"Flags%2\">\r\n          <DisplayString>({m_storage.m_data.array[2]}, {m_storage.m_data.array[3]})</DisplayString>\r\n        </Synthetic>\r\n        <Synthetic Name=\"[row 1]\" Condition=\"!(Flags%2)\">\r\n          <DisplayString>({m_storage.m_data.array[1]}, {m_storage.m_data.array[3]})</DisplayString>\r\n        </Synthetic>        \r\n      </Expand>\r\n  </Type>\r\n  \r\n  <!-- 3 x 3 Matrix -->\r\n  <Type Name=\"Eigen::Matrix&lt;*,3,3,*,*,*&gt;\">      \r\n      <AlternativeType Name=\"Eigen::Array&lt;*,3,3,*,*,*&gt;\"/>\r\n      <DisplayString>[3, 3] (fixed matrix)</DisplayString>\r\n      <Expand>\r\n        <Synthetic Name=\"[row 0]\" Condition=\"Flags%2\">\r\n          <DisplayString>({m_storage.m_data.array[0]}, {m_storage.m_data.array[1]}, {m_storage.m_data.array[2]})</DisplayString>\r\n        </Synthetic>\r\n        <Synthetic Name=\"[row 0]\" Condition=\"!(Flags%2)\">\r\n          <DisplayString>({m_storage.m_data.array[0]}, {m_storage.m_data.array[3]}, {m_storage.m_data.array[6]})</DisplayString>\r\n        </Synthetic>\r\n        <Synthetic Name=\"[row 1]\" Condition=\"Flags%2\">\r\n          <DisplayString>({m_storage.m_data.array[3]}, {m_storage.m_data.array[4]}, {m_storage.m_data.array[5]})</DisplayString>\r\n        </Synthetic>\r\n        <Synthetic Name=\"[row 1]\" Condition=\"!(Flags%2)\">\r\n          <DisplayString>({m_storage.m_data.array[1]}, {m_storage.m_data.array[4]}, {m_storage.m_data.array[7]})</DisplayString>\r\n        </Synthetic>\r\n        <Synthetic Name=\"[row 2]\" Condition=\"Flags%2\">\r\n          <DisplayString>({m_storage.m_data.array[6]}, {m_storage.m_data.array[7]}, {m_storage.m_data.array[8]})</DisplayString>\r\n        </Synthetic>\r\n        <Synthetic Name=\"[row 2]\" Condition=\"!(Flags%2)\">\r\n          <DisplayString>({m_storage.m_data.array[2]}, {m_storage.m_data.array[5]}, {m_storage.m_data.array[8]})</DisplayString>\r\n        </Synthetic>        \r\n      </Expand>\r\n  </Type>\r\n  \r\n  <!-- 4 x 4 Matrix -->\r\n  <Type Name=\"Eigen::Matrix&lt;*,4,4,*,*,*&gt;\">      \r\n      <AlternativeType Name=\"Eigen::Array&lt;*,4,4,*,*,*&gt;\"/>\r\n      <DisplayString>[4, 4] (fixed matrix)</DisplayString>\r\n      <Expand>\r\n        <Synthetic Name=\"[row 0]\" Condition=\"Flags%2\">\r\n          <DisplayString>({m_storage.m_data.array[0]}, {m_storage.m_data.array[1]}, {m_storage.m_data.array[2]}, {m_storage.m_data.array[3]})</DisplayString>\r\n        </Synthetic>\r\n        <Synthetic Name=\"[row 0]\" Condition=\"!(Flags%2)\">\r\n          <DisplayString>({m_storage.m_data.array[0]}, {m_storage.m_data.array[4]}, {m_storage.m_data.array[8]}, {m_storage.m_data.array[12]})</DisplayString>\r\n        </Synthetic>\r\n        <Synthetic Name=\"[row 1]\" Condition=\"Flags%2\">\r\n          <DisplayString>({m_storage.m_data.array[4]}, {m_storage.m_data.array[5]}, {m_storage.m_data.array[6]}, {m_storage.m_data.array[7]})</DisplayString>\r\n        </Synthetic>\r\n        <Synthetic Name=\"[row 1]\" Condition=\"!(Flags%2)\">\r\n          <DisplayString>({m_storage.m_data.array[1]}, {m_storage.m_data.array[5]}, {m_storage.m_data.array[9]}, {m_storage.m_data.array[13]})</DisplayString>\r\n        </Synthetic>\r\n        <Synthetic Name=\"[row 2]\" Condition=\"Flags%2\">\r\n          <DisplayString>({m_storage.m_data.array[8]}, {m_storage.m_data.array[9]}, {m_storage.m_data.array[10]}, {m_storage.m_data.array[11]})</DisplayString>\r\n        </Synthetic>\r\n        <Synthetic Name=\"[row 2]\" Condition=\"!(Flags%2)\">\r\n          <DisplayString>({m_storage.m_data.array[2]}, {m_storage.m_data.array[6]}, {m_storage.m_data.array[10]}, {m_storage.m_data.array[14]})</DisplayString>\r\n        </Synthetic>\r\n        <Synthetic Name=\"[row 3]\" Condition=\"Flags%2\">\r\n          <DisplayString>({m_storage.m_data.array[12]}, {m_storage.m_data.array[13]}, {m_storage.m_data.array[14]}, {m_storage.m_data.array[15]})</DisplayString>\r\n        </Synthetic>\r\n        <Synthetic Name=\"[row 3]\" Condition=\"!(Flags%2)\">\r\n          <DisplayString>({m_storage.m_data.array[3]}, {m_storage.m_data.array[7]}, {m_storage.m_data.array[11]}, {m_storage.m_data.array[15]})</DisplayString>\r\n        </Synthetic>        \r\n      </Expand>\r\n  </Type>  \r\n  \r\n  <!-- Dynamic x Dynamic Matrix -->\r\n  <Type Name=\"Eigen::Matrix&lt;*,-1,-1,*,*,*&gt;\">      \r\n      <AlternativeType Name=\"Eigen::Array&lt;*,-1,-1,*,*,*&gt;\"/>\r\n      <DisplayString Condition=\"m_storage.m_data == 0\">empty</DisplayString>\r\n      <DisplayString Condition=\"m_storage.m_data != 0\">[{m_storage.m_rows}, {m_storage.m_cols}] (dynamic matrix)</DisplayString>\r\n      <Expand>\r\n        <ArrayItems Condition=\"Flags%2\"> <!-- row major layout -->\r\n          <Rank>2</Rank>\r\n          <Size>$i==0 ? m_storage.m_rows : m_storage.m_cols</Size>\r\n          <ValuePointer>m_storage.m_data</ValuePointer>\r\n        </ArrayItems>\r\n        <ArrayItems Condition=\"!(Flags%2)\"> <!-- column major layout -->\r\n          <Direction>Backward</Direction>\r\n          <Rank>2</Rank>\r\n          <Size>$i==0 ? m_storage.m_rows : m_storage.m_cols</Size>\r\n          <ValuePointer>m_storage.m_data</ValuePointer>\r\n        </ArrayItems>\r\n      </Expand>\r\n  </Type>\r\n  \r\n  <!-- Fixed x Dynamic Matrix -->\r\n  <Type Name=\"Eigen::Matrix&lt;*,*,-1,*,*,*&gt;\">\r\n      <AlternativeType Name=\"Eigen::Array&lt;*,*,-1,*,*,*&gt;\"/>\r\n      <DisplayString Condition=\"m_storage.m_data == 0\">empty</DisplayString>\r\n      <DisplayString Condition=\"m_storage.m_data != 0\">[{$T2}, {m_storage.m_cols}] (dynamic column matrix)</DisplayString>\r\n      <Expand>\r\n        <ArrayItems Condition=\"Flags%2\"> <!-- row major layout -->\r\n          <Rank>2</Rank>\r\n          <Size>$i==0 ? $T2 : m_storage.m_cols</Size>\r\n          <ValuePointer>m_storage.m_data</ValuePointer>\r\n        </ArrayItems>\r\n        <ArrayItems Condition=\"!(Flags%2)\"> <!-- column major layout -->\r\n          <Direction>Backward</Direction>\r\n          <Rank>2</Rank>\r\n          <Size>$i==0 ? $T2 : m_storage.m_cols</Size>\r\n          <ValuePointer>m_storage.m_data</ValuePointer>\r\n        </ArrayItems>\r\n      </Expand>\r\n  </Type>\r\n  \r\n  <!-- Dynamic x Fixed Matrix -->\r\n  <Type Name=\"Eigen::Matrix&lt;*,-1,*,*,*,*&gt;\">\r\n      <AlternativeType Name=\"Eigen::Array&lt;*,-1,*,*,*,*&gt;\"/>\r\n      <DisplayString Condition=\"m_storage.m_data == 0\">empty</DisplayString>\r\n      <DisplayString Condition=\"m_storage.m_data != 0\">[{m_storage.m_rows}, {$T2}] (dynamic row matrix)</DisplayString>\r\n      <Expand>\r\n        <ArrayItems Condition=\"Flags%2\"> <!-- row major layout -->\r\n          <Rank>2</Rank>\r\n          <Size>$i==0 ? m_storage.m_rows : $T2</Size>\r\n          <ValuePointer>m_storage.m_data</ValuePointer>\r\n        </ArrayItems>\r\n        <ArrayItems Condition=\"!(Flags%2)\"> <!-- column major layout -->\r\n          <Direction>Backward</Direction>\r\n          <Rank>2</Rank>\r\n          <Size>$i==0 ? m_storage.m_rows : $T2</Size>\r\n          <ValuePointer>m_storage.m_data</ValuePointer>\r\n        </ArrayItems>\r\n      </Expand>\r\n  </Type>\r\n  \r\n  <!-- Dynamic Column Vector -->\r\n  <Type Name=\"Eigen::Matrix&lt;*,1,-1,*,*,*&gt;\">\r\n      <AlternativeType Name=\"Eigen::Array&lt;*,1,-1,*,*,*&gt;\"/>\r\n      <DisplayString Condition=\"m_storage.m_data == 0\">empty</DisplayString>\r\n      <DisplayString Condition=\"m_storage.m_data != 0\">[{m_storage.m_cols}] (dynamic column vector)</DisplayString>\r\n      <Expand>\r\n        <Item Name=\"[size]\">m_storage.m_cols</Item>\r\n        <ArrayItems>\r\n          <Size>m_storage.m_cols</Size>\r\n          <ValuePointer>m_storage.m_data</ValuePointer>\r\n        </ArrayItems>\r\n      </Expand>\r\n  </Type>\r\n  \r\n  <!-- Dynamic Row Vector -->\r\n  <Type Name=\"Eigen::Matrix&lt;*,-1,1,*,*,*&gt;\">\r\n      <AlternativeType Name=\"Eigen::Array&lt;*,-1,1,*,*,*&gt;\"/>\r\n      <DisplayString Condition=\"m_storage.m_data == 0\">empty</DisplayString>\r\n      <DisplayString Condition=\"m_storage.m_data != 0\">[{m_storage.m_rows}] (dynamic row vector)</DisplayString>\r\n      <Expand>\r\n        <Item Name=\"[size]\">m_storage.m_rows</Item>\r\n        <ArrayItems>\r\n          <Size>m_storage.m_rows</Size>\r\n          <ValuePointer>m_storage.m_data</ValuePointer>\r\n        </ArrayItems>\r\n      </Expand>\r\n  </Type>\r\n  \r\n  <!-- Fixed Vector -->\r\n  <Type Name=\"Eigen::Matrix&lt;*,1,1,*,*,*&gt;\">\r\n      <AlternativeType Name=\"Eigen::Array&lt;*,1,1,*,*,*&gt;\"/>\r\n      <DisplayString>[1] ({m_storage.m_data.array[0]})</DisplayString>\r\n      <Expand>\r\n        <Item Name=\"[x]\">m_storage.m_data.array[0]</Item>\r\n      </Expand>\r\n  </Type>\r\n  \r\n  <Type Name=\"Eigen::Matrix&lt;*,2,1,*,*,*&gt;\">\r\n      <AlternativeType Name=\"Eigen::Matrix&lt;*,1,2,*,*,*&gt;\"/>\r\n      <AlternativeType Name=\"Eigen::Array&lt;*,2,1,*,*,*&gt;\"/>\r\n      <AlternativeType Name=\"Eigen::Array&lt;*,1,2,*,*,*&gt;\"/>\r\n      <DisplayString>[2] ({m_storage.m_data.array[0]}, {m_storage.m_data.array[1]})</DisplayString>\r\n      <Expand>\r\n        <Item Name=\"[x]\">m_storage.m_data.array[0]</Item>\r\n        <Item Name=\"[y]\">m_storage.m_data.array[1]</Item>\r\n      </Expand>\r\n  </Type>\r\n  \r\n  <Type Name=\"Eigen::Matrix&lt;*,3,1,*,*,*&gt;\">\r\n      <AlternativeType Name=\"Eigen::Matrix&lt;*,1,3,*,*,*&gt;\"/>\r\n      <AlternativeType Name=\"Eigen::Array&lt;*,3,1,*,*,*&gt;\"/>\r\n      <AlternativeType Name=\"Eigen::Array&lt;*,1,3,*,*,*&gt;\"/>\r\n      <DisplayString>[3] ({m_storage.m_data.array[0]}, {m_storage.m_data.array[1]}, {m_storage.m_data.array[2]})</DisplayString>\r\n      <Expand>\r\n        <Item Name=\"[x]\">m_storage.m_data.array[0]</Item>\r\n        <Item Name=\"[y]\">m_storage.m_data.array[1]</Item>\r\n        <Item Name=\"[z]\">m_storage.m_data.array[2]</Item>\r\n      </Expand>\r\n  </Type>\r\n  \r\n    <Type Name=\"Eigen::Matrix&lt;*,4,1,*,*,*&gt;\">\r\n      <AlternativeType Name=\"Eigen::Matrix&lt;*,1,4,*,*,*&gt;\"/>\r\n      <AlternativeType Name=\"Eigen::Array&lt;*,4,1,*,*,*&gt;\"/>\r\n      <AlternativeType Name=\"Eigen::Array&lt;*,1,4,*,*,*&gt;\"/>\r\n      <DisplayString>[4] ({m_storage.m_data.array[0]}, {m_storage.m_data.array[1]}, {m_storage.m_data.array[2]}, {m_storage.m_data.array[3]})</DisplayString>\r\n      <Expand>\r\n        <Item Name=\"[x]\">m_storage.m_data.array[0]</Item>\r\n        <Item Name=\"[y]\">m_storage.m_data.array[1]</Item>\r\n        <Item Name=\"[z]\">m_storage.m_data.array[2]</Item>\r\n        <Item Name=\"[w]\">m_storage.m_data.array[3]</Item>\r\n      </Expand>\r\n  </Type>\r\n\r\n</AutoVisualizer>\r\n"
  },
  {
    "path": "libs/eigen/demos/CMakeLists.txt",
    "content": "project(EigenDemos)\n\nadd_custom_target(demos)\n\nif(NOT EIGEN_TEST_NOQT)\n  find_package(Qt4)\n  if(QT4_FOUND)\n    add_subdirectory(mandelbrot)\n    add_subdirectory(opengl)\n  else(QT4_FOUND)\n    message(STATUS \"Qt4 not found, so disabling the mandelbrot and opengl demos\")\n  endif(QT4_FOUND)\nendif()\n"
  },
  {
    "path": "libs/eigen/demos/mandelbrot/CMakeLists.txt",
    "content": "find_package(Qt4 REQUIRED)\n\nset(CMAKE_INCLUDE_CURRENT_DIR ON)\n\nif (CMAKE_COMPILER_IS_GNUCXX)\n   set ( CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -O2\")\n   add_definitions ( \"-DNDEBUG\" )\nendif (CMAKE_COMPILER_IS_GNUCXX)\n\ninclude_directories( ${QT_INCLUDE_DIR} )\n\nset(mandelbrot_SRCS\n    mandelbrot.cpp\n)\n\nqt4_automoc(${mandelbrot_SRCS})\n\nadd_executable(mandelbrot ${mandelbrot_SRCS})\nadd_dependencies(demos mandelbrot)\n\ntarget_link_libraries(mandelbrot ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY})\n"
  },
  {
    "path": "libs/eigen/demos/mandelbrot/README",
    "content": "*** Mandelbrot demo ***\n\nControls:\n* Left mouse button to center view at a point.\n* Drag vertically with left mouse button to zoom in and out.\n\nBe sure to enable SSE2 or AltiVec to improve performance.\n\nThe number of iterations, and the choice between single and double precision, are\ndetermined at runtime depending on the zoom level.\n"
  },
  {
    "path": "libs/eigen/demos/mandelbrot/mandelbrot.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"mandelbrot.h\"\n#include <iostream>\n#include<QtGui/QPainter>\n#include<QtGui/QImage>\n#include<QtGui/QMouseEvent>\n#include<QtCore/QTime>\n\nvoid MandelbrotWidget::resizeEvent(QResizeEvent *)\n{\n  if(size < width() * height())\n  {\n    std::cout << \"reallocate buffer\" << std::endl;\n    size = width() * height();\n    if(buffer) delete[]buffer;\n    buffer = new unsigned char[4*size];\n  }\n}\n\ntemplate<typename T> struct iters_before_test { enum { ret = 8 }; };\ntemplate<> struct iters_before_test<double> { enum { ret = 16 }; };\n\ntemplate<typename Real> void MandelbrotThread::render(int img_width, int img_height)\n{\n  enum { packetSize = Eigen::internal::packet_traits<Real>::size }; // number of reals in a Packet\n  typedef Eigen::Array<Real, packetSize, 1> Packet; // wrap a Packet as a vector\n\n  enum { iters_before_test = iters_before_test<Real>::ret };\n  max_iter = (max_iter / iters_before_test) * iters_before_test;\n  const int alignedWidth = (img_width/packetSize)*packetSize;\n  unsigned char *const buffer = widget->buffer;\n  const double xradius = widget->xradius;\n  const double yradius = xradius * img_height / img_width;\n  const int threadcount = widget->threadcount;\n  typedef Eigen::Array<Real, 2, 1> Vector2;\n  Vector2 start(widget->center.x() - widget->xradius, widget->center.y() - yradius);\n  Vector2 step(2*widget->xradius/img_width, 2*yradius/img_height);\n  total_iter = 0;\n\n  for(int y = id; y < img_height; y += threadcount)\n  {\n    int pix = y * img_width;\n\n    // for each pixel, we're going to do the iteration z := z^2 + c where z and c are complex numbers, \n    // starting with z = c = complex coord of the pixel. pzi and pzr denote the real and imaginary parts of z.\n    // pci and pcr denote the real and imaginary parts of c.\n\n    Packet pzi_start, pci_start;\n    for(int i = 0; i < packetSize; i++) pzi_start[i] = pci_start[i] = start.y() + y * step.y();\n\n    for(int x = 0; x < alignedWidth; x += packetSize, pix += packetSize)\n    {\n      Packet pcr, pci = pci_start, pzr, pzi = pzi_start, pzr_buf;\n      for(int i = 0; i < packetSize; i++) pzr[i] = pcr[i] = start.x() + (x+i) * step.x();\n\n      // do the iterations. Every iters_before_test iterations we check for divergence,\n      // in which case we can stop iterating.\n      int j = 0;\n      typedef Eigen::Matrix<int, packetSize, 1> Packeti;\n      Packeti pix_iter = Packeti::Zero(), // number of iteration per pixel in the packet\n              pix_dont_diverge; // whether or not each pixel has already diverged\n      do\n      {\n        for(int i = 0; i < iters_before_test/4; i++) // peel the inner loop by 4\n        {\n#         define ITERATE \\\n            pzr_buf = pzr; \\\n            pzr = pzr.square(); \\\n            pzr -= pzi.square(); \\\n            pzr += pcr; \\\n            pzi = (2*pzr_buf)*pzi; \\\n            pzi += pci;\n          ITERATE ITERATE ITERATE ITERATE\n        }\n        pix_dont_diverge = ((pzr.square() + pzi.square())\n                           .eval() // temporary fix as what follows is not yet vectorized by Eigen\n                           <= Packet::Constant(4))\n                                // the 4 here is not a magic value, it's a math fact that if\n                                // the square modulus is >4 then divergence is inevitable.\n                           .template cast<int>();\n        pix_iter += iters_before_test * pix_dont_diverge;\n        j++;\n        total_iter += iters_before_test * packetSize;\n      }\n      while(j < max_iter/iters_before_test && pix_dont_diverge.any()); // any() is not yet vectorized by Eigen\n\n      // compute pixel colors\n      for(int i = 0; i < packetSize; i++)\n      {\n        buffer[4*(pix+i)] = 255*pix_iter[i]/max_iter;\n        buffer[4*(pix+i)+1] = 0;\n        buffer[4*(pix+i)+2] = 0;\n      }\n    }\n\n    // if the width is not a multiple of packetSize, fill the remainder in black\n    for(int x = alignedWidth; x < img_width; x++, pix++)\n      buffer[4*pix] = buffer[4*pix+1] = buffer[4*pix+2] = 0;\n  }\n  return;\n}\n\nvoid MandelbrotThread::run()\n{\n  setTerminationEnabled(true);\n  double resolution = widget->xradius*2/widget->width();\n  max_iter = 128;\n  if(resolution < 1e-4f) max_iter += 128 * ( - 4 - std::log10(resolution));\n  int img_width = widget->width()/widget->draft;\n  int img_height = widget->height()/widget->draft;\n  single_precision = resolution > 1e-7f;\n\n  if(single_precision)\n    render<float>(img_width, img_height);\n  else\n    render<double>(img_width, img_height);\n}\n\nvoid MandelbrotWidget::paintEvent(QPaintEvent *)\n{\n  static float max_speed = 0;\n  long long total_iter = 0;\n\n  QTime time;\n  time.start();\n  for(int th = 0; th < threadcount; th++)\n    threads[th]->start(QThread::LowPriority);\n  for(int th = 0; th < threadcount; th++)\n  {\n    threads[th]->wait();\n    total_iter += threads[th]->total_iter;\n  }\n  int elapsed = time.elapsed();\n\n  if(draft == 1)\n  {\n    float speed = elapsed ? float(total_iter)*1000/elapsed : 0;\n    max_speed = std::max(max_speed, speed);\n    std::cout << threadcount << \" threads, \"\n              << elapsed << \" ms, \"\n              << speed << \" iters/s (max \" << max_speed << \")\" << std::endl;\n    int packetSize = threads[0]->single_precision\n                   ? int(Eigen::internal::packet_traits<float>::size)\n                   : int(Eigen::internal::packet_traits<double>::size);\n    setWindowTitle(QString(\"resolution \")+QString::number(xradius*2/width(), 'e', 2)\n                  +QString(\", %1 iterations per pixel, \").arg(threads[0]->max_iter)\n                  +(threads[0]->single_precision ? QString(\"single \") : QString(\"double \"))\n                  +QString(\"precision, \")\n                  +(packetSize==1 ? QString(\"no vectorization\")\n                                  : QString(\"vectorized (%1 per packet)\").arg(packetSize)));\n  }\n  \n  QImage image(buffer, width()/draft, height()/draft, QImage::Format_RGB32);\n  QPainter painter(this);\n  painter.drawImage(QPoint(0, 0), image.scaled(width(), height()));\n\n  if(draft>1)\n  {\n    draft /= 2;\n    setWindowTitle(QString(\"recomputing at 1/%1 resolution...\").arg(draft));\n    update();\n  }\n}\n\nvoid MandelbrotWidget::mousePressEvent(QMouseEvent *event)\n{\n  if( event->buttons() & Qt::LeftButton )\n  {\n    lastpos = event->pos();\n    double yradius = xradius * height() / width();\n    center = Eigen::Vector2d(center.x() + (event->pos().x() - width()/2) * xradius * 2 / width(),\n                             center.y() + (event->pos().y() - height()/2) * yradius * 2 / height());\n    draft = 16;\n    for(int th = 0; th < threadcount; th++)\n      threads[th]->terminate();\n    update();\n  }\n}\n\nvoid MandelbrotWidget::mouseMoveEvent(QMouseEvent *event)\n{\n  QPoint delta = event->pos() - lastpos;\n  lastpos = event->pos();\n  if( event->buttons() & Qt::LeftButton )\n  {\n    double t = 1 + 5 * double(delta.y()) / height();\n    if(t < 0.5) t = 0.5;\n    if(t > 2) t = 2;\n    xradius *= t;\n    draft = 16;\n    for(int th = 0; th < threadcount; th++)\n      threads[th]->terminate();\n    update();\n  }\n}\n\nint main(int argc, char *argv[])\n{\n  QApplication app(argc, argv);\n  MandelbrotWidget w;\n  w.show();\n  return app.exec();\n}\n\n#include \"mandelbrot.moc\"\n"
  },
  {
    "path": "libs/eigen/demos/mandelbrot/mandelbrot.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef MANDELBROT_H\n#define MANDELBROT_H\n\n#include <Eigen/Core>\n#include <QtGui/QApplication>\n#include <QtGui/QWidget>\n#include <QtCore/QThread>\n\nclass MandelbrotWidget;\n\nclass MandelbrotThread : public QThread\n{\n    friend class MandelbrotWidget;\n    MandelbrotWidget *widget;\n    long long total_iter;\n    int id, max_iter;\n    bool single_precision;\n\n  public:\n    MandelbrotThread(MandelbrotWidget *w, int i) : widget(w), id(i) {}\n    void run();\n    template<typename Real> void render(int img_width, int img_height);\n};\n\nclass MandelbrotWidget : public QWidget\n{\n    Q_OBJECT\n\n    friend class MandelbrotThread;\n    Eigen::Vector2d center;\n    double xradius;\n    int size;\n    unsigned char *buffer;\n    QPoint lastpos;\n    int draft;\n    MandelbrotThread **threads;\n    int threadcount;\n\n  protected:\n    void resizeEvent(QResizeEvent *);\n    void paintEvent(QPaintEvent *);\n    void mousePressEvent(QMouseEvent *event);\n    void mouseMoveEvent(QMouseEvent *event);\n\n  public:\n    MandelbrotWidget() : QWidget(), center(0,0), xradius(2),\n                         size(0), buffer(0), draft(16)\n    {\n      setAutoFillBackground(false);\n      threadcount = QThread::idealThreadCount();\n      threads = new MandelbrotThread*[threadcount];\n      for(int th = 0; th < threadcount; th++) threads[th] = new MandelbrotThread(this, th);\n    }\n    ~MandelbrotWidget()\n    {\n      if(buffer) delete[]buffer;\n      for(int th = 0; th < threadcount; th++) delete threads[th];\n      delete[] threads;\n    }\n};\n\n#endif // MANDELBROT_H\n"
  },
  {
    "path": "libs/eigen/demos/mix_eigen_and_c/README",
    "content": "This is an example of how one can wrap some of Eigen into a C library.\n\nTo try this with GCC, do:\n\n  g++ -c binary_library.cpp -O2 -msse2 -I ../..\n  gcc example.c binary_library.o -o example -lstdc++\n  ./example\n\nTODO: add CMakeLists, add more explanations here"
  },
  {
    "path": "libs/eigen/demos/mix_eigen_and_c/binary_library.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n// This C++ file compiles to binary code that can be linked to by your C program,\n// thanks to the extern \"C\" syntax used in the declarations in binary_library.h.\n\n#include \"binary_library.h\"\n\n#include <Eigen/Core>\n\nusing namespace Eigen;\n\n/************************* pointer conversion methods **********************************************/\n\n////// class MatrixXd //////\n\ninline MatrixXd& c_to_eigen(C_MatrixXd* ptr)\n{\n  return *reinterpret_cast<MatrixXd*>(ptr);\n}\n\ninline const MatrixXd& c_to_eigen(const C_MatrixXd* ptr)\n{\n  return *reinterpret_cast<const MatrixXd*>(ptr);\n}\n\ninline C_MatrixXd* eigen_to_c(MatrixXd& ref)\n{\n  return reinterpret_cast<C_MatrixXd*>(&ref);\n}\n\ninline const C_MatrixXd* eigen_to_c(const MatrixXd& ref)\n{\n  return reinterpret_cast<const C_MatrixXd*>(&ref);\n}\n\n////// class Map<MatrixXd> //////\n\ninline Map<MatrixXd>& c_to_eigen(C_Map_MatrixXd* ptr)\n{\n  return *reinterpret_cast<Map<MatrixXd>*>(ptr);\n}\n\ninline const Map<MatrixXd>& c_to_eigen(const C_Map_MatrixXd* ptr)\n{\n  return *reinterpret_cast<const Map<MatrixXd>*>(ptr);\n}\n\ninline C_Map_MatrixXd* eigen_to_c(Map<MatrixXd>& ref)\n{\n  return reinterpret_cast<C_Map_MatrixXd*>(&ref);\n}\n\ninline const C_Map_MatrixXd* eigen_to_c(const Map<MatrixXd>& ref)\n{\n  return reinterpret_cast<const C_Map_MatrixXd*>(&ref);\n}\n\n\n/************************* implementation of classes **********************************************/\n\n\n////// class MatrixXd //////\n\n\nC_MatrixXd* MatrixXd_new(int rows, int cols)\n{\n  return eigen_to_c(*new MatrixXd(rows,cols));\n}\n\nvoid MatrixXd_delete(C_MatrixXd *m)\n{\n  delete &c_to_eigen(m);\n}\n\ndouble* MatrixXd_data(C_MatrixXd *m)\n{\n  return c_to_eigen(m).data();\n}\n\nvoid MatrixXd_set_zero(C_MatrixXd *m)\n{\n  c_to_eigen(m).setZero();\n}\n\nvoid MatrixXd_resize(C_MatrixXd *m, int rows, int cols)\n{\n  c_to_eigen(m).resize(rows,cols);\n}\n\nvoid MatrixXd_copy(C_MatrixXd *dst, const C_MatrixXd *src)\n{\n  c_to_eigen(dst) = c_to_eigen(src);\n}\n\nvoid MatrixXd_copy_map(C_MatrixXd *dst, const C_Map_MatrixXd *src)\n{\n  c_to_eigen(dst) = c_to_eigen(src);\n}\n\nvoid MatrixXd_set_coeff(C_MatrixXd *m, int i, int j, double coeff)\n{\n  c_to_eigen(m)(i,j) = coeff;\n}\n\ndouble MatrixXd_get_coeff(const C_MatrixXd *m, int i, int j)\n{\n  return c_to_eigen(m)(i,j);\n}\n\nvoid MatrixXd_print(const C_MatrixXd *m)\n{\n  std::cout << c_to_eigen(m) << std::endl;\n}\n\nvoid MatrixXd_multiply(const C_MatrixXd *m1, const C_MatrixXd *m2, C_MatrixXd *result)\n{\n  c_to_eigen(result) = c_to_eigen(m1) * c_to_eigen(m2);\n}\n\nvoid MatrixXd_add(const C_MatrixXd *m1, const C_MatrixXd *m2, C_MatrixXd *result)\n{\n  c_to_eigen(result) = c_to_eigen(m1) + c_to_eigen(m2);\n}\n\n\n\n////// class Map_MatrixXd //////\n\n\nC_Map_MatrixXd* Map_MatrixXd_new(double *array, int rows, int cols)\n{\n  return eigen_to_c(*new Map<MatrixXd>(array,rows,cols));\n}\n\nvoid Map_MatrixXd_delete(C_Map_MatrixXd *m)\n{\n  delete &c_to_eigen(m);\n}\n\nvoid Map_MatrixXd_set_zero(C_Map_MatrixXd *m)\n{\n  c_to_eigen(m).setZero();\n}\n\nvoid Map_MatrixXd_copy(C_Map_MatrixXd *dst, const C_Map_MatrixXd *src)\n{\n  c_to_eigen(dst) = c_to_eigen(src);\n}\n\nvoid Map_MatrixXd_copy_matrix(C_Map_MatrixXd *dst, const C_MatrixXd *src)\n{\n  c_to_eigen(dst) = c_to_eigen(src);\n}\n\nvoid Map_MatrixXd_set_coeff(C_Map_MatrixXd *m, int i, int j, double coeff)\n{\n  c_to_eigen(m)(i,j) = coeff;\n}\n\ndouble Map_MatrixXd_get_coeff(const C_Map_MatrixXd *m, int i, int j)\n{\n  return c_to_eigen(m)(i,j);\n}\n\nvoid Map_MatrixXd_print(const C_Map_MatrixXd *m)\n{\n  std::cout << c_to_eigen(m) << std::endl;\n}\n\nvoid Map_MatrixXd_multiply(const C_Map_MatrixXd *m1, const C_Map_MatrixXd *m2, C_Map_MatrixXd *result)\n{\n  c_to_eigen(result) = c_to_eigen(m1) * c_to_eigen(m2);\n}\n\nvoid Map_MatrixXd_add(const C_Map_MatrixXd *m1, const C_Map_MatrixXd *m2, C_Map_MatrixXd *result)\n{\n  c_to_eigen(result) = c_to_eigen(m1) + c_to_eigen(m2);\n}\n"
  },
  {
    "path": "libs/eigen/demos/mix_eigen_and_c/binary_library.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n// This is a pure C header, no C++ here.\n// The functions declared here will be implemented in C++ but\n// we don't have to know, because thanks to the extern \"C\" syntax,\n// they will be compiled to C object code.\n\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n\n  // just dummy empty structs to give different pointer types,\n  // instead of using void* which would be type unsafe\n  struct C_MatrixXd {};\n  struct C_Map_MatrixXd {};\n\n  // the C_MatrixXd class, wraps some of the functionality\n  // of Eigen::MatrixXd.\n  struct C_MatrixXd* MatrixXd_new(int rows, int cols);\n  void    MatrixXd_delete     (struct C_MatrixXd *m);\n  double* MatrixXd_data       (struct C_MatrixXd *m);\n  void    MatrixXd_set_zero   (struct C_MatrixXd *m);\n  void    MatrixXd_resize     (struct C_MatrixXd *m, int rows, int cols);\n  void    MatrixXd_copy       (struct C_MatrixXd *dst,\n                               const struct C_MatrixXd *src);\n  void    MatrixXd_copy_map   (struct C_MatrixXd *dst,\n                               const struct C_Map_MatrixXd *src);  \n  void    MatrixXd_set_coeff  (struct C_MatrixXd *m,\n                               int i, int j, double coeff);\n  double  MatrixXd_get_coeff  (const struct C_MatrixXd *m,\n                               int i, int j);\n  void    MatrixXd_print      (const struct C_MatrixXd *m);\n  void    MatrixXd_add        (const struct C_MatrixXd *m1,\n                               const struct C_MatrixXd *m2,\n                               struct C_MatrixXd *result);  \n  void    MatrixXd_multiply   (const struct C_MatrixXd *m1,\n                               const struct C_MatrixXd *m2,\n                               struct C_MatrixXd *result);\n  \n  // the C_Map_MatrixXd class, wraps some of the functionality\n  // of Eigen::Map<MatrixXd>\n  struct C_Map_MatrixXd* Map_MatrixXd_new(double *array, int rows, int cols);\n  void   Map_MatrixXd_delete     (struct C_Map_MatrixXd *m);\n  void   Map_MatrixXd_set_zero   (struct C_Map_MatrixXd *m);\n  void   Map_MatrixXd_copy       (struct C_Map_MatrixXd *dst,\n                                  const struct C_Map_MatrixXd *src);\n  void   Map_MatrixXd_copy_matrix(struct C_Map_MatrixXd *dst,\n                                  const struct C_MatrixXd *src);  \n  void   Map_MatrixXd_set_coeff  (struct C_Map_MatrixXd *m,\n                                  int i, int j, double coeff);\n  double Map_MatrixXd_get_coeff  (const struct C_Map_MatrixXd *m,\n                                  int i, int j);\n  void   Map_MatrixXd_print      (const struct C_Map_MatrixXd *m);\n  void   Map_MatrixXd_add        (const struct C_Map_MatrixXd *m1,\n                                  const struct C_Map_MatrixXd *m2,\n                                  struct C_Map_MatrixXd *result);  \n  void   Map_MatrixXd_multiply   (const struct C_Map_MatrixXd *m1,\n                                  const struct C_Map_MatrixXd *m2,\n                                  struct C_Map_MatrixXd *result);\n\n#ifdef __cplusplus\n} // end extern \"C\"\n#endif"
  },
  {
    "path": "libs/eigen/demos/mix_eigen_and_c/example.c",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"binary_library.h\"\n#include \"stdio.h\"\n\nvoid demo_MatrixXd()\n{\n  struct C_MatrixXd *matrix1, *matrix2, *result;\n  printf(\"*** demo_MatrixXd ***\\n\");\n  \n  matrix1 = MatrixXd_new(3, 3);\n  MatrixXd_set_zero(matrix1);\n  MatrixXd_set_coeff(matrix1, 0, 1, 2.5);\n  MatrixXd_set_coeff(matrix1, 1, 0, 1.4);\n  printf(\"Here is matrix1:\\n\");\n  MatrixXd_print(matrix1);\n\n  matrix2 = MatrixXd_new(3, 3);\n  MatrixXd_multiply(matrix1, matrix1, matrix2);\n  printf(\"Here is matrix1*matrix1:\\n\");\n  MatrixXd_print(matrix2);\n\n  MatrixXd_delete(matrix1);\n  MatrixXd_delete(matrix2);\n}\n\n// this helper function takes a plain C array and prints it in one line\nvoid print_array(double *array, int n)\n{\n  struct C_Map_MatrixXd *m = Map_MatrixXd_new(array, 1, n);\n  Map_MatrixXd_print(m);\n  Map_MatrixXd_delete(m);\n}\n\nvoid demo_Map_MatrixXd()\n{\n  struct C_Map_MatrixXd *map;\n  double array[5];\n  int i;\n  printf(\"*** demo_Map_MatrixXd ***\\n\");\n  \n  for(i = 0; i < 5; ++i) array[i] = i;\n  printf(\"Initially, the array is:\\n\");\n  print_array(array, 5);\n  \n  map = Map_MatrixXd_new(array, 5, 1);\n  Map_MatrixXd_add(map, map, map);\n  Map_MatrixXd_delete(map);\n\n  printf(\"Now the array is:\\n\");\n  print_array(array, 5);\n}\n\nint main()\n{\n  demo_MatrixXd();\n  demo_Map_MatrixXd();\n}\n"
  },
  {
    "path": "libs/eigen/demos/opengl/CMakeLists.txt",
    "content": "find_package(Qt4)\nfind_package(OpenGL)\n\nif(QT4_FOUND AND OPENGL_FOUND)\n\n  set(QT_USE_QTOPENGL TRUE)\n  include(${QT_USE_FILE})\n\n  set(CMAKE_INCLUDE_CURRENT_DIR ON)\n\n  include_directories( ${QT_INCLUDE_DIR} )\n\n  set(quaternion_demo_SRCS  gpuhelper.cpp icosphere.cpp camera.cpp trackball.cpp quaternion_demo.cpp)\n\n  qt4_automoc(${quaternion_demo_SRCS})\n\n  add_executable(quaternion_demo ${quaternion_demo_SRCS})\n  add_dependencies(demos quaternion_demo)\n\n  target_link_libraries(quaternion_demo\n    ${QT_QTCORE_LIBRARY}    ${QT_QTGUI_LIBRARY}\n    ${QT_QTOPENGL_LIBRARY}  ${OPENGL_LIBRARIES} )\n\nelse()\n\n  message(STATUS \"OpenGL demo disabled because Qt4 and/or OpenGL have not been found.\")\n\nendif()"
  },
  {
    "path": "libs/eigen/demos/opengl/README",
    "content": "\nNavigation:\n left button:           rotate around the target\n middle button:         zoom\n left button + ctrl     quake rotate (rotate around camera position)\n middle button + ctrl   walk (progress along camera's z direction)\n left button:           pan (translate in the XY camera's plane)\n\nR : move the camera to initial position\nA : start/stop animation\nC : clear the animation\nG : add a key frame\n\n"
  },
  {
    "path": "libs/eigen/demos/opengl/camera.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"camera.h\"\n\n#include \"gpuhelper.h\"\n#include <GL/glu.h>\n\n#include \"Eigen/LU\"\nusing namespace Eigen;\n\nCamera::Camera()\n    : mViewIsUptodate(false), mProjIsUptodate(false)\n{\n    mViewMatrix.setIdentity();\n    \n    mFovY = M_PI/3.;\n    mNearDist = 1.;\n    mFarDist = 50000.;\n    \n    mVpX = 0;\n    mVpY = 0;\n\n    setPosition(Vector3f::Constant(100.));\n    setTarget(Vector3f::Zero());\n}\n\nCamera& Camera::operator=(const Camera& other)\n{\n    mViewIsUptodate = false;\n    mProjIsUptodate = false;\n    \n    mVpX = other.mVpX;\n    mVpY = other.mVpY;\n    mVpWidth = other.mVpWidth;\n    mVpHeight = other.mVpHeight;\n\n    mTarget = other.mTarget;\n    mFovY = other.mFovY;\n    mNearDist = other.mNearDist;\n    mFarDist = other.mFarDist;\n    \n    mViewMatrix = other.mViewMatrix;\n    mProjectionMatrix = other.mProjectionMatrix;\n\n    return *this;\n}\n\nCamera::Camera(const Camera& other)\n{\n    *this = other;\n}\n\nCamera::~Camera()\n{\n}\n\n\nvoid Camera::setViewport(uint offsetx, uint offsety, uint width, uint height)\n{\n    mVpX = offsetx;\n    mVpY = offsety;\n    mVpWidth = width;\n    mVpHeight = height;\n    \n    mProjIsUptodate = false;\n}\n\nvoid Camera::setViewport(uint width, uint height)\n{\n    mVpWidth = width;\n    mVpHeight = height;\n    \n    mProjIsUptodate = false;\n}\n\nvoid Camera::setFovY(float value)\n{\n    mFovY = value;\n    mProjIsUptodate = false;\n}\n\nVector3f Camera::direction(void) const\n{\n    return - (orientation() * Vector3f::UnitZ());\n}\nVector3f Camera::up(void) const\n{\n    return orientation() * Vector3f::UnitY();\n}\nVector3f Camera::right(void) const\n{\n    return orientation() * Vector3f::UnitX();\n}\n\nvoid Camera::setDirection(const Vector3f& newDirection)\n{\n    // TODO implement it computing the rotation between newDirection and current dir ?\n    Vector3f up = this->up();\n    \n    Matrix3f camAxes;\n\n    camAxes.col(2) = (-newDirection).normalized();\n    camAxes.col(0) = up.cross( camAxes.col(2) ).normalized();\n    camAxes.col(1) = camAxes.col(2).cross( camAxes.col(0) ).normalized();\n    setOrientation(Quaternionf(camAxes));\n    \n    mViewIsUptodate = false;\n}\n\nvoid Camera::setTarget(const Vector3f& target)\n{\n    mTarget = target;\n    if (!mTarget.isApprox(position()))\n    {\n        Vector3f newDirection = mTarget - position();\n        setDirection(newDirection.normalized());\n    }\n}\n\nvoid Camera::setPosition(const Vector3f& p)\n{\n    mFrame.position = p;\n    mViewIsUptodate = false;\n}\n\nvoid Camera::setOrientation(const Quaternionf& q)\n{\n    mFrame.orientation = q;\n    mViewIsUptodate = false;\n}\n\nvoid Camera::setFrame(const Frame& f)\n{\n  mFrame = f;\n  mViewIsUptodate = false;\n}\n\nvoid Camera::rotateAroundTarget(const Quaternionf& q)\n{\n    Matrix4f mrot, mt, mtm;\n    \n    // update the transform matrix\n    updateViewMatrix();\n    Vector3f t = mViewMatrix * mTarget;\n\n    mViewMatrix = Translation3f(t)\n                * q\n                * Translation3f(-t)\n                * mViewMatrix;\n    \n    Quaternionf qa(mViewMatrix.linear());\n    qa = qa.conjugate();\n    setOrientation(qa);\n    setPosition(- (qa * mViewMatrix.translation()) );\n\n    mViewIsUptodate = true;\n}\n\nvoid Camera::localRotate(const Quaternionf& q)\n{\n    float dist = (position() - mTarget).norm();\n    setOrientation(orientation() * q);\n    mTarget = position() + dist * direction();\n    mViewIsUptodate = false;\n}\n\nvoid Camera::zoom(float d)\n{\n    float dist = (position() - mTarget).norm();\n    if(dist > d)\n    {\n        setPosition(position() + direction() * d);\n        mViewIsUptodate = false;\n    }\n}\n\nvoid Camera::localTranslate(const Vector3f& t)\n{\n  Vector3f trans = orientation() * t;\n  setPosition( position() + trans );\n  setTarget( mTarget + trans );\n\n  mViewIsUptodate = false;\n}\n\nvoid Camera::updateViewMatrix(void) const\n{\n    if(!mViewIsUptodate)\n    {\n        Quaternionf q = orientation().conjugate();\n        mViewMatrix.linear() = q.toRotationMatrix();\n        mViewMatrix.translation() = - (mViewMatrix.linear() * position());\n\n        mViewIsUptodate = true;\n    }\n}\n\nconst Affine3f& Camera::viewMatrix(void) const\n{\n  updateViewMatrix();\n  return mViewMatrix;\n}\n\nvoid Camera::updateProjectionMatrix(void) const\n{\n  if(!mProjIsUptodate)\n  {\n    mProjectionMatrix.setIdentity();\n    float aspect = float(mVpWidth)/float(mVpHeight);\n    float theta = mFovY*0.5;\n    float range = mFarDist - mNearDist;\n    float invtan = 1./tan(theta);\n\n    mProjectionMatrix(0,0) = invtan / aspect;\n    mProjectionMatrix(1,1) = invtan;\n    mProjectionMatrix(2,2) = -(mNearDist + mFarDist) / range;\n    mProjectionMatrix(3,2) = -1;\n    mProjectionMatrix(2,3) = -2 * mNearDist * mFarDist / range;\n    mProjectionMatrix(3,3) = 0;\n    \n    mProjIsUptodate = true;\n  }\n}\n\nconst Matrix4f& Camera::projectionMatrix(void) const\n{\n  updateProjectionMatrix();\n  return mProjectionMatrix;\n}\n\nvoid Camera::activateGL(void)\n{\n  glViewport(vpX(), vpY(), vpWidth(), vpHeight());\n  gpu.loadMatrix(projectionMatrix(),GL_PROJECTION);\n  gpu.loadMatrix(viewMatrix().matrix(),GL_MODELVIEW);\n}\n\n\nVector3f Camera::unProject(const Vector2f& uv, float depth) const\n{\n    Matrix4f inv = mViewMatrix.inverse().matrix();\n    return unProject(uv, depth, inv);\n}\n\nVector3f Camera::unProject(const Vector2f& uv, float depth, const Matrix4f& invModelview) const\n{\n    updateViewMatrix();\n    updateProjectionMatrix();\n    \n    Vector3f a(2.*uv.x()/float(mVpWidth)-1., 2.*uv.y()/float(mVpHeight)-1., 1.);\n    a.x() *= depth/mProjectionMatrix(0,0);\n    a.y() *= depth/mProjectionMatrix(1,1);\n    a.z() = -depth;\n    // FIXME /\\/|\n    Vector4f b = invModelview * Vector4f(a.x(), a.y(), a.z(), 1.);\n    return Vector3f(b.x(), b.y(), b.z());\n}\n"
  },
  {
    "path": "libs/eigen/demos/opengl/camera.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_CAMERA_H\n#define EIGEN_CAMERA_H\n\n#include <Eigen/Geometry>\n#include <QObject>\n// #include <frame.h>\n\nclass Frame\n{\n  public:\n    EIGEN_MAKE_ALIGNED_OPERATOR_NEW\n    \n    inline Frame(const Eigen::Vector3f& pos = Eigen::Vector3f::Zero(),\n                 const Eigen::Quaternionf& o = Eigen::Quaternionf())\n      : orientation(o), position(pos)\n    {}\n    Frame lerp(float alpha, const Frame& other) const\n    {\n      return Frame((1.f-alpha)*position + alpha * other.position,\n                   orientation.slerp(alpha,other.orientation));\n    }\n\n    Eigen::Quaternionf orientation;\n    Eigen::Vector3f position;\n};\n\nclass Camera\n{\n  public:\n    EIGEN_MAKE_ALIGNED_OPERATOR_NEW\n\n    Camera(void);\n    \n    Camera(const Camera& other);\n    \n    virtual ~Camera();\n    \n    Camera& operator=(const Camera& other);\n    \n    void setViewport(uint offsetx, uint offsety, uint width, uint height);\n    void setViewport(uint width, uint height);\n    \n    inline uint vpX(void) const { return mVpX; }\n    inline uint vpY(void) const { return mVpY; }\n    inline uint vpWidth(void) const { return mVpWidth; }\n    inline uint vpHeight(void) const { return mVpHeight; }\n\n    inline float fovY(void) const { return mFovY; }\n    void setFovY(float value);\n    \n    void setPosition(const Eigen::Vector3f& pos);\n    inline const Eigen::Vector3f& position(void) const { return mFrame.position; }\n\n    void setOrientation(const Eigen::Quaternionf& q);\n    inline const Eigen::Quaternionf& orientation(void) const { return mFrame.orientation; }\n\n    void setFrame(const Frame& f);\n    const Frame& frame(void) const { return mFrame; }\n    \n    void setDirection(const Eigen::Vector3f& newDirection);\n    Eigen::Vector3f direction(void) const;\n    void setUp(const Eigen::Vector3f& vectorUp);\n    Eigen::Vector3f up(void) const;\n    Eigen::Vector3f right(void) const;\n    \n    void setTarget(const Eigen::Vector3f& target);\n    inline const Eigen::Vector3f& target(void) { return mTarget; }\n    \n    const Eigen::Affine3f& viewMatrix(void) const;\n    const Eigen::Matrix4f& projectionMatrix(void) const;\n    \n    void rotateAroundTarget(const Eigen::Quaternionf& q);\n    void localRotate(const Eigen::Quaternionf& q);\n    void zoom(float d);\n    \n    void localTranslate(const Eigen::Vector3f& t);\n    \n    /** Setup OpenGL matrices and viewport */\n    void activateGL(void);\n    \n    Eigen::Vector3f unProject(const Eigen::Vector2f& uv, float depth, const Eigen::Matrix4f& invModelview) const;\n    Eigen::Vector3f unProject(const Eigen::Vector2f& uv, float depth) const;\n    \n  protected:\n    void updateViewMatrix(void) const;\n    void updateProjectionMatrix(void) const;\n\n  protected:\n\n    uint mVpX, mVpY;\n    uint mVpWidth, mVpHeight;\n\n    Frame mFrame;\n    \n    mutable Eigen::Affine3f mViewMatrix;\n    mutable Eigen::Matrix4f mProjectionMatrix;\n\n    mutable bool mViewIsUptodate;\n    mutable bool mProjIsUptodate;\n\n    // used by rotateAroundTarget\n    Eigen::Vector3f mTarget;\n    \n    float mFovY;\n    float mNearDist;\n    float mFarDist;\n};\n\n#endif // EIGEN_CAMERA_H\n"
  },
  {
    "path": "libs/eigen/demos/opengl/gpuhelper.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"gpuhelper.h\"\n#include \"icosphere.h\"\n#include <GL/glu.h>\n// PLEASE don't look at this old code... ;)\n\n#include <fstream>\n#include <algorithm>\n\nGpuHelper gpu;\n\nGpuHelper::GpuHelper()\n{\n    mVpWidth = mVpHeight = 0;\n    mCurrentMatrixTarget = 0;\n    mInitialized = false;\n}\n\nGpuHelper::~GpuHelper()\n{\n}\n\nvoid GpuHelper::pushProjectionMode2D(ProjectionMode2D pm)\n{\n    // switch to 2D projection\n    pushMatrix(Matrix4f::Identity(),GL_PROJECTION);\n\n    if(pm==PM_Normalized)\n    {\n        //glOrtho(-1., 1., -1., 1., 0., 1.);\n    }\n    else if(pm==PM_Viewport)\n    {\n        GLint vp[4];\n        glGetIntegerv(GL_VIEWPORT, vp);\n        glOrtho(0., vp[2], 0., vp[3], -1., 1.);\n    }\n\n    pushMatrix(Matrix4f::Identity(),GL_MODELVIEW);\n}\n\nvoid GpuHelper::popProjectionMode2D(void)\n{\n    popMatrix(GL_PROJECTION);\n    popMatrix(GL_MODELVIEW);\n}\n\nvoid GpuHelper::drawVector(const Vector3f& position, const Vector3f& vec, const Color& color, float aspect /* = 50.*/)\n{\n    static GLUquadricObj *cylindre = gluNewQuadric();\n    glColor4fv(color.data());\n    float length = vec.norm();\n    pushMatrix(GL_MODELVIEW);\n    glTranslatef(position.x(), position.y(), position.z());\n    Vector3f ax = Matrix3f::Identity().col(2).cross(vec);\n    ax.normalize();\n    Vector3f tmp = vec;\n    tmp.normalize();\n    float angle = 180.f/M_PI * acos(tmp.z());\n    if (angle>1e-3)\n        glRotatef(angle, ax.x(), ax.y(), ax.z());\n    gluCylinder(cylindre, length/aspect, length/aspect, 0.8*length, 10, 10);\n    glTranslatef(0.0,0.0,0.8*length);\n    gluCylinder(cylindre, 2.0*length/aspect, 0.0, 0.2*length, 10, 10);\n\n    popMatrix(GL_MODELVIEW);\n}\n\nvoid GpuHelper::drawVectorBox(const Vector3f& position, const Vector3f& vec, const Color& color, float aspect)\n{\n    static GLUquadricObj *cylindre = gluNewQuadric();\n    glColor4fv(color.data());\n    float length = vec.norm();\n    pushMatrix(GL_MODELVIEW);\n    glTranslatef(position.x(), position.y(), position.z());\n    Vector3f ax = Matrix3f::Identity().col(2).cross(vec);\n    ax.normalize();\n    Vector3f tmp = vec;\n    tmp.normalize();\n    float angle = 180.f/M_PI * acos(tmp.z());\n    if (angle>1e-3)\n        glRotatef(angle, ax.x(), ax.y(), ax.z());\n    gluCylinder(cylindre, length/aspect, length/aspect, 0.8*length, 10, 10);\n    glTranslatef(0.0,0.0,0.8*length);\n    glScalef(4.0*length/aspect,4.0*length/aspect,4.0*length/aspect);\n    drawUnitCube();\n    popMatrix(GL_MODELVIEW);\n}\n\nvoid GpuHelper::drawUnitCube(void)\n{\n    static float vertices[][3] = {\n        {-0.5,-0.5,-0.5},\n        { 0.5,-0.5,-0.5},\n        {-0.5, 0.5,-0.5},\n        { 0.5, 0.5,-0.5},\n        {-0.5,-0.5, 0.5},\n        { 0.5,-0.5, 0.5},\n        {-0.5, 0.5, 0.5},\n        { 0.5, 0.5, 0.5}};\n\n    glBegin(GL_QUADS);\n    glNormal3f(0,0,-1); glVertex3fv(vertices[0]); glVertex3fv(vertices[2]); glVertex3fv(vertices[3]); glVertex3fv(vertices[1]);\n    glNormal3f(0,0, 1); glVertex3fv(vertices[4]); glVertex3fv(vertices[5]); glVertex3fv(vertices[7]); glVertex3fv(vertices[6]);\n    glNormal3f(0,-1,0); glVertex3fv(vertices[0]); glVertex3fv(vertices[1]); glVertex3fv(vertices[5]); glVertex3fv(vertices[4]);\n    glNormal3f(0, 1,0); glVertex3fv(vertices[2]); glVertex3fv(vertices[6]); glVertex3fv(vertices[7]); glVertex3fv(vertices[3]);\n    glNormal3f(-1,0,0); glVertex3fv(vertices[0]); glVertex3fv(vertices[4]); glVertex3fv(vertices[6]); glVertex3fv(vertices[2]);\n    glNormal3f( 1,0,0); glVertex3fv(vertices[1]); glVertex3fv(vertices[3]); glVertex3fv(vertices[7]); glVertex3fv(vertices[5]);\n    glEnd();\n}\n\nvoid GpuHelper::drawUnitSphere(int level)\n{\n  static IcoSphere sphere;\n  sphere.draw(level);\n}\n\n\n"
  },
  {
    "path": "libs/eigen/demos/opengl/gpuhelper.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_GPUHELPER_H\n#define EIGEN_GPUHELPER_H\n\n#include <Eigen/Geometry>\n#include <GL/gl.h>\n#include <vector>\n\nusing namespace Eigen;\n\ntypedef Vector4f Color;\n\nclass GpuHelper\n{\n  public:\n\n    GpuHelper();\n\n    ~GpuHelper();\n\n    enum ProjectionMode2D { PM_Normalized = 1, PM_Viewport = 2 };\n    void pushProjectionMode2D(ProjectionMode2D pm);\n    void popProjectionMode2D();\n\n    /** Multiply the OpenGL matrix \\a matrixTarget by the matrix \\a mat.\n        Essentially, this helper function automatically calls glMatrixMode(matrixTarget) if required\n        and does a proper call to the right glMultMatrix*() function according to the scalar type\n        and storage order.\n        \\warning glMatrixMode() must never be called directly. If your're unsure, use forceMatrixMode().\n        \\sa Matrix, loadMatrix(), forceMatrixMode()\n    */\n    template<typename Scalar, int _Flags>\n    void multMatrix(const Matrix<Scalar,4,4, _Flags, 4,4>& mat, GLenum matrixTarget);\n\n    /** Load the matrix \\a mat to the OpenGL matrix \\a matrixTarget.\n        Essentially, this helper function automatically calls glMatrixMode(matrixTarget) if required\n        and does a proper call to the right glLoadMatrix*() or glLoadIdentity() function according to the scalar type\n        and storage order.\n        \\warning glMatrixMode() must never be called directly. If your're unsure, use forceMatrixMode().\n        \\sa Matrix, multMatrix(), forceMatrixMode()\n    */\n    template<typename Scalar, int _Flags>\n    void loadMatrix(const Eigen::Matrix<Scalar,4,4, _Flags, 4,4>& mat, GLenum matrixTarget);\n\n    template<typename Scalar, typename Derived>\n    void loadMatrix(\n        const Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<Scalar>,Derived>&,\n        GLenum matrixTarget);\n\n    /** Make the matrix \\a matrixTarget the current OpenGL matrix target.\n        Call this function before loadMatrix() or multMatrix() if you cannot guarantee that glMatrixMode()\n        has never been called after the last loadMatrix() or multMatrix() calls.\n        \\todo provides a debug mode checking the sanity of the cached matrix mode.\n    */\n    inline void forceMatrixTarget(GLenum matrixTarget) {glMatrixMode(mCurrentMatrixTarget=matrixTarget);}\n\n    inline void setMatrixTarget(GLenum matrixTarget);\n\n    /** Push the OpenGL matrix \\a matrixTarget and load \\a mat.\n    */\n    template<typename Scalar, int _Flags>\n    inline void pushMatrix(const Matrix<Scalar,4,4, _Flags, 4,4>& mat, GLenum matrixTarget);\n\n    template<typename Scalar, typename Derived>\n    void pushMatrix(\n        const Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<Scalar>,Derived>&,\n        GLenum matrixTarget);\n\n    /** Push and clone the OpenGL matrix \\a matrixTarget\n    */\n    inline void pushMatrix(GLenum matrixTarget);\n\n    /** Pop the OpenGL matrix \\a matrixTarget\n    */\n    inline void popMatrix(GLenum matrixTarget);\n\n    void drawVector(const Vector3f& position, const Vector3f& vec, const Color& color, float aspect = 50.);\n    void drawVectorBox(const Vector3f& position, const Vector3f& vec, const Color& color, float aspect = 50.);\n    void drawUnitCube(void);\n    void drawUnitSphere(int level=0);\n\n    /// draw the \\a nofElement first elements\n    inline void draw(GLenum mode, uint nofElement);\n\n    /// draw a range of elements\n    inline void draw(GLenum mode, uint start, uint end);\n\n    /// draw an indexed subset\n    inline void draw(GLenum mode, const std::vector<uint>* pIndexes);\n\nprotected:\n\n    void update(void);\n\n    GLuint mColorBufferId;\n    int mVpWidth, mVpHeight;\n    GLenum mCurrentMatrixTarget;\n    bool mInitialized;\n};\n\n/** Singleton shortcut\n*/\nextern GpuHelper gpu;\n\n\n/** \\internal\n*/\ntemplate<bool RowMajor, int _Flags> struct GlMatrixHelper;\n\ntemplate<int _Flags> struct GlMatrixHelper<false,_Flags>\n{\n    static void loadMatrix(const Matrix<float, 4,4, _Flags, 4,4>&  mat) { glLoadMatrixf(mat.data()); }\n    static void loadMatrix(const Matrix<double,4,4, _Flags, 4,4>& mat) { glLoadMatrixd(mat.data()); }\n    static void multMatrix(const Matrix<float, 4,4, _Flags, 4,4>&  mat) { glMultMatrixf(mat.data()); }\n    static void multMatrix(const Matrix<double,4,4, _Flags, 4,4>& mat) { glMultMatrixd(mat.data()); }\n};\n\ntemplate<int _Flags> struct GlMatrixHelper<true,_Flags>\n{\n    static void loadMatrix(const Matrix<float, 4,4, _Flags, 4,4>&  mat) { glLoadMatrixf(mat.transpose().eval().data()); }\n    static void loadMatrix(const Matrix<double,4,4, _Flags, 4,4>& mat) { glLoadMatrixd(mat.transpose().eval().data()); }\n    static void multMatrix(const Matrix<float, 4,4, _Flags, 4,4>&  mat) { glMultMatrixf(mat.transpose().eval().data()); }\n    static void multMatrix(const Matrix<double,4,4, _Flags, 4,4>& mat) { glMultMatrixd(mat.transpose().eval().data()); }\n};\n\ninline void GpuHelper::setMatrixTarget(GLenum matrixTarget)\n{\n    if (matrixTarget != mCurrentMatrixTarget)\n        glMatrixMode(mCurrentMatrixTarget=matrixTarget);\n}\n\ntemplate<typename Scalar, int _Flags>\nvoid GpuHelper::multMatrix(const Matrix<Scalar,4,4, _Flags, 4,4>& mat, GLenum matrixTarget)\n{\n    setMatrixTarget(matrixTarget);\n    GlMatrixHelper<_Flags&Eigen::RowMajorBit, _Flags>::multMatrix(mat);\n}\n\ntemplate<typename Scalar, typename Derived>\nvoid GpuHelper::loadMatrix(\n    const Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<Scalar>,Derived>&,\n    GLenum matrixTarget)\n{\n    setMatrixTarget(matrixTarget);\n    glLoadIdentity();\n}\n\ntemplate<typename Scalar, int _Flags>\nvoid GpuHelper::loadMatrix(const Eigen::Matrix<Scalar,4,4, _Flags, 4,4>& mat, GLenum matrixTarget)\n{\n    setMatrixTarget(matrixTarget);\n    GlMatrixHelper<(_Flags&Eigen::RowMajorBit)!=0, _Flags>::loadMatrix(mat);\n}\n\ninline void GpuHelper::pushMatrix(GLenum matrixTarget)\n{\n    setMatrixTarget(matrixTarget);\n    glPushMatrix();\n}\n\ntemplate<typename Scalar, int _Flags>\ninline void GpuHelper::pushMatrix(const Matrix<Scalar,4,4, _Flags, 4,4>& mat, GLenum matrixTarget)\n{\n    pushMatrix(matrixTarget);\n    GlMatrixHelper<_Flags&Eigen::RowMajorBit,_Flags>::loadMatrix(mat);\n}\n\ntemplate<typename Scalar, typename Derived>\nvoid GpuHelper::pushMatrix(\n    const Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<Scalar>,Derived>&,\n    GLenum matrixTarget)\n{\n    pushMatrix(matrixTarget);\n    glLoadIdentity();\n}\n\ninline void GpuHelper::popMatrix(GLenum matrixTarget)\n{\n    setMatrixTarget(matrixTarget);\n    glPopMatrix();\n}\n\ninline void GpuHelper::draw(GLenum mode, uint nofElement)\n{\n    glDrawArrays(mode, 0, nofElement);\n}\n\n\ninline void GpuHelper::draw(GLenum mode, const std::vector<uint>* pIndexes)\n{\n    glDrawElements(mode, pIndexes->size(), GL_UNSIGNED_INT, &(pIndexes->front()));\n}\n\ninline void GpuHelper::draw(GLenum mode, uint start, uint end)\n{\n    glDrawArrays(mode, start, end-start);\n}\n\n#endif // EIGEN_GPUHELPER_H\n"
  },
  {
    "path": "libs/eigen/demos/opengl/icosphere.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"icosphere.h\"\n\n#include <GL/gl.h>\n#include <map>\n\nusing namespace Eigen;\n\n//--------------------------------------------------------------------------------\n// icosahedron data\n//--------------------------------------------------------------------------------\n#define X .525731112119133606\n#define Z .850650808352039932\n\nstatic GLfloat vdata[12][3] = {\n   {-X, 0.0, Z}, {X, 0.0, Z}, {-X, 0.0, -Z}, {X, 0.0, -Z},\n   {0.0, Z, X}, {0.0, Z, -X}, {0.0, -Z, X}, {0.0, -Z, -X},\n   {Z, X, 0.0}, {-Z, X, 0.0}, {Z, -X, 0.0}, {-Z, -X, 0.0}\n};\n\nstatic GLint tindices[20][3] = {\n   {0,4,1}, {0,9,4}, {9,5,4}, {4,5,8}, {4,8,1},\n   {8,10,1}, {8,3,10}, {5,3,8}, {5,2,3}, {2,7,3},\n   {7,10,3}, {7,6,10}, {7,11,6}, {11,0,6}, {0,1,6},\n   {6,1,10}, {9,0,11}, {9,11,2}, {9,2,5}, {7,2,11} };\n//--------------------------------------------------------------------------------\n\nIcoSphere::IcoSphere(unsigned int levels)\n{\n  // init with an icosahedron\n  for (int i = 0; i < 12; i++)\n    mVertices.push_back(Map<Vector3f>(vdata[i]));\n  mIndices.push_back(new std::vector<int>);\n  std::vector<int>& indices = *mIndices.back();\n  for (int i = 0; i < 20; i++)\n  {\n    for (int k = 0; k < 3; k++)\n      indices.push_back(tindices[i][k]);\n  }\n  mListIds.push_back(0);\n\n  while(mIndices.size()<levels)\n    _subdivide();\n}\n\nconst std::vector<int>& IcoSphere::indices(int level) const\n{\n  while (level>=int(mIndices.size()))\n    const_cast<IcoSphere*>(this)->_subdivide();\n  return *mIndices[level];\n}\n\nvoid IcoSphere::_subdivide(void)\n{\n  typedef unsigned long long Key;\n  std::map<Key,int> edgeMap;\n  const std::vector<int>& indices = *mIndices.back();\n  mIndices.push_back(new std::vector<int>);\n  std::vector<int>& refinedIndices = *mIndices.back();\n  int end = indices.size();\n  for (int i=0; i<end; i+=3)\n  {\n    int ids0[3],  // indices of outer vertices\n        ids1[3];  // indices of edge vertices\n    for (int k=0; k<3; ++k)\n    {\n      int k1 = (k+1)%3;\n      int e0 = indices[i+k];\n      int e1 = indices[i+k1];\n      ids0[k] = e0;\n      if (e1>e0)\n        std::swap(e0,e1);\n      Key edgeKey = Key(e0) | (Key(e1)<<32);\n      std::map<Key,int>::iterator it = edgeMap.find(edgeKey);\n      if (it==edgeMap.end())\n      {\n        ids1[k] = mVertices.size();\n        edgeMap[edgeKey] = ids1[k];\n        mVertices.push_back( (mVertices[e0]+mVertices[e1]).normalized() );\n      }\n      else\n        ids1[k] = it->second;\n    }\n    refinedIndices.push_back(ids0[0]); refinedIndices.push_back(ids1[0]); refinedIndices.push_back(ids1[2]);\n    refinedIndices.push_back(ids0[1]); refinedIndices.push_back(ids1[1]); refinedIndices.push_back(ids1[0]);\n    refinedIndices.push_back(ids0[2]); refinedIndices.push_back(ids1[2]); refinedIndices.push_back(ids1[1]);\n    refinedIndices.push_back(ids1[0]); refinedIndices.push_back(ids1[1]); refinedIndices.push_back(ids1[2]);\n  }\n  mListIds.push_back(0);\n}\n\nvoid IcoSphere::draw(int level)\n{\n  while (level>=int(mIndices.size()))\n    const_cast<IcoSphere*>(this)->_subdivide();\n  if (mListIds[level]==0)\n  {\n    mListIds[level] = glGenLists(1);\n    glNewList(mListIds[level], GL_COMPILE);\n      glVertexPointer(3, GL_FLOAT, 0, mVertices[0].data());\n      glNormalPointer(GL_FLOAT, 0, mVertices[0].data());\n      glEnableClientState(GL_VERTEX_ARRAY);\n      glEnableClientState(GL_NORMAL_ARRAY);\n      glDrawElements(GL_TRIANGLES, mIndices[level]->size(), GL_UNSIGNED_INT, &(mIndices[level]->at(0)));\n      glDisableClientState(GL_VERTEX_ARRAY);\n      glDisableClientState(GL_NORMAL_ARRAY);\n    glEndList();\n  }\n  glCallList(mListIds[level]);\n}\n\n\n"
  },
  {
    "path": "libs/eigen/demos/opengl/icosphere.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_ICOSPHERE_H\n#define EIGEN_ICOSPHERE_H\n\n#include <Eigen/Core>\n#include <vector>\n\nclass IcoSphere\n{\n  public:\n    IcoSphere(unsigned int levels=1);\n    const std::vector<Eigen::Vector3f>& vertices() const { return mVertices; }\n    const std::vector<int>& indices(int level) const;\n    void draw(int level);\n  protected:\n    void _subdivide();\n    std::vector<Eigen::Vector3f> mVertices;\n    std::vector<std::vector<int>*> mIndices;\n    std::vector<int> mListIds;\n};\n\n#endif // EIGEN_ICOSPHERE_H\n"
  },
  {
    "path": "libs/eigen/demos/opengl/quaternion_demo.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"quaternion_demo.h\"\n#include \"icosphere.h\"\n\n#include <Eigen/Geometry>\n#include <Eigen/QR>\n#include <Eigen/LU>\n\n#include <iostream>\n#include <QEvent>\n#include <QMouseEvent>\n#include <QInputDialog>\n#include <QGridLayout>\n#include <QButtonGroup>\n#include <QRadioButton>\n#include <QDockWidget>\n#include <QPushButton>\n#include <QGroupBox>\n\nusing namespace Eigen;\n\nclass FancySpheres\n{\n  public:\n    EIGEN_MAKE_ALIGNED_OPERATOR_NEW\n    \n    FancySpheres()\n    {\n      const int levels = 4;\n      const float scale = 0.33;\n      float radius = 100;\n      std::vector<int> parents;\n\n      // leval 0\n      mCenters.push_back(Vector3f::Zero());\n      parents.push_back(-1);\n      mRadii.push_back(radius);\n\n      // generate level 1 using icosphere vertices\n      radius *= 0.45;\n      {\n        float dist = mRadii[0]*0.9;\n        for (int i=0; i<12; ++i)\n        {\n          mCenters.push_back(mIcoSphere.vertices()[i] * dist);\n          mRadii.push_back(radius);\n          parents.push_back(0);\n        }\n      }\n\n      static const float angles [10] = {\n        0, 0,\n        M_PI, 0.*M_PI,\n        M_PI, 0.5*M_PI,\n        M_PI, 1.*M_PI,\n        M_PI, 1.5*M_PI\n      };\n\n      // generate other levels\n      int start = 1;\n      for (int l=1; l<levels; l++)\n      {\n        radius *= scale;\n        int end = mCenters.size();\n        for (int i=start; i<end; ++i)\n        {\n          Vector3f c = mCenters[i];\n          Vector3f ax0 = (c - mCenters[parents[i]]).normalized();\n          Vector3f ax1 = ax0.unitOrthogonal();\n          Quaternionf q;\n          q.setFromTwoVectors(Vector3f::UnitZ(), ax0);\n          Affine3f t = Translation3f(c) * q * Scaling(mRadii[i]+radius);\n          for (int j=0; j<5; ++j)\n          {\n            Vector3f newC = c + ( (AngleAxisf(angles[j*2+1], ax0)\n                                * AngleAxisf(angles[j*2+0] * (l==1 ? 0.35 : 0.5), ax1)) * ax0)\n                                * (mRadii[i] + radius*0.8);\n            mCenters.push_back(newC);\n            mRadii.push_back(radius);\n            parents.push_back(i);\n          }\n        }\n        start = end;\n      }\n    }\n\n    void draw()\n    {\n      int end = mCenters.size();\n      glEnable(GL_NORMALIZE);\n      for (int i=0; i<end; ++i)\n      {\n        Affine3f t = Translation3f(mCenters[i]) * Scaling(mRadii[i]);\n        gpu.pushMatrix(GL_MODELVIEW);\n        gpu.multMatrix(t.matrix(),GL_MODELVIEW);\n        mIcoSphere.draw(2);\n        gpu.popMatrix(GL_MODELVIEW);\n      }\n      glDisable(GL_NORMALIZE);\n    }\n  protected:\n    std::vector<Vector3f> mCenters;\n    std::vector<float> mRadii;\n    IcoSphere mIcoSphere;\n};\n\n\n// generic linear interpolation method\ntemplate<typename T> T lerp(float t, const T& a, const T& b)\n{\n  return a*(1-t) + b*t;\n}\n\n// quaternion slerp\ntemplate<> Quaternionf lerp(float t, const Quaternionf& a, const Quaternionf& b)\n{ return a.slerp(t,b); }\n\n// linear interpolation of a frame using the type OrientationType\n// to perform the interpolation of the orientations\ntemplate<typename OrientationType>\ninline static Frame lerpFrame(float alpha, const Frame& a, const Frame& b)\n{\n  return Frame(lerp(alpha,a.position,b.position),\n               Quaternionf(lerp(alpha,OrientationType(a.orientation),OrientationType(b.orientation))));\n}\n\ntemplate<typename _Scalar> class EulerAngles\n{\npublic:\n  enum { Dim = 3 };\n  typedef _Scalar Scalar;\n  typedef Matrix<Scalar,3,3> Matrix3;\n  typedef Matrix<Scalar,3,1> Vector3;\n  typedef Quaternion<Scalar> QuaternionType;\n\nprotected:\n\n  Vector3 m_angles;\n\npublic:\n\n  EulerAngles() {}\n  inline EulerAngles(Scalar a0, Scalar a1, Scalar a2) : m_angles(a0, a1, a2) {}\n  inline EulerAngles(const QuaternionType& q) { *this = q; }\n\n  const Vector3& coeffs() const { return m_angles; }\n  Vector3& coeffs() { return m_angles; }\n\n  EulerAngles& operator=(const QuaternionType& q)\n  {\n    Matrix3 m = q.toRotationMatrix();\n    return *this = m;\n  }\n\n  EulerAngles& operator=(const Matrix3& m)\n  {\n    // mat =  cy*cz          -cy*sz           sy\n    //        cz*sx*sy+cx*sz  cx*cz-sx*sy*sz -cy*sx\n    //       -cx*cz*sy+sx*sz  cz*sx+cx*sy*sz  cx*cy\n    m_angles.coeffRef(1) = std::asin(m.coeff(0,2));\n    m_angles.coeffRef(0) = std::atan2(-m.coeff(1,2),m.coeff(2,2));\n    m_angles.coeffRef(2) = std::atan2(-m.coeff(0,1),m.coeff(0,0));\n    return *this;\n  }\n\n  Matrix3 toRotationMatrix(void) const\n  {\n    Vector3 c = m_angles.array().cos();\n    Vector3 s = m_angles.array().sin();\n    Matrix3 res;\n    res <<  c.y()*c.z(),                    -c.y()*s.z(),                   s.y(),\n            c.z()*s.x()*s.y()+c.x()*s.z(),  c.x()*c.z()-s.x()*s.y()*s.z(),  -c.y()*s.x(),\n            -c.x()*c.z()*s.y()+s.x()*s.z(), c.z()*s.x()+c.x()*s.y()*s.z(),  c.x()*c.y();\n    return res;\n  }\n\n  operator QuaternionType() { return QuaternionType(toRotationMatrix()); }\n};\n\n// Euler angles slerp\ntemplate<> EulerAngles<float> lerp(float t, const EulerAngles<float>& a, const EulerAngles<float>& b)\n{\n  EulerAngles<float> res;\n  res.coeffs() = lerp(t, a.coeffs(), b.coeffs());\n  return res;\n}\n\n\nRenderingWidget::RenderingWidget()\n{\n  mAnimate = false;\n  mCurrentTrackingMode = TM_NO_TRACK;\n  mNavMode = NavTurnAround;\n  mLerpMode = LerpQuaternion;\n  mRotationMode = RotationStable;\n  mTrackball.setCamera(&mCamera);\n\n  // required to capture key press events\n  setFocusPolicy(Qt::ClickFocus);\n}\n\nvoid RenderingWidget::grabFrame(void)\n{\n    // ask user for a time\n    bool ok = false;\n    double t = 0;\n    if (!m_timeline.empty())\n      t = (--m_timeline.end())->first + 1.;\n    t = QInputDialog::getDouble(this, \"Eigen's RenderingWidget\", \"time value: \",\n      t, 0, 1e3, 1, &ok);\n    if (ok)\n    {\n      Frame aux;\n      aux.orientation = mCamera.viewMatrix().linear();\n      aux.position = mCamera.viewMatrix().translation();\n      m_timeline[t] = aux;\n    }\n}\n\nvoid RenderingWidget::drawScene()\n{\n  static FancySpheres sFancySpheres;\n  float length = 50;\n  gpu.drawVector(Vector3f::Zero(), length*Vector3f::UnitX(), Color(1,0,0,1));\n  gpu.drawVector(Vector3f::Zero(), length*Vector3f::UnitY(), Color(0,1,0,1));\n  gpu.drawVector(Vector3f::Zero(), length*Vector3f::UnitZ(), Color(0,0,1,1));\n\n  // draw the fractal object\n  float sqrt3 = internal::sqrt(3.);\n  glLightfv(GL_LIGHT0, GL_AMBIENT, Vector4f(0.5,0.5,0.5,1).data());\n  glLightfv(GL_LIGHT0, GL_DIFFUSE, Vector4f(0.5,1,0.5,1).data());\n  glLightfv(GL_LIGHT0, GL_SPECULAR, Vector4f(1,1,1,1).data());\n  glLightfv(GL_LIGHT0, GL_POSITION, Vector4f(-sqrt3,-sqrt3,sqrt3,0).data());\n\n  glLightfv(GL_LIGHT1, GL_AMBIENT, Vector4f(0,0,0,1).data());\n  glLightfv(GL_LIGHT1, GL_DIFFUSE, Vector4f(1,0.5,0.5,1).data());\n  glLightfv(GL_LIGHT1, GL_SPECULAR, Vector4f(1,1,1,1).data());\n  glLightfv(GL_LIGHT1, GL_POSITION, Vector4f(-sqrt3,sqrt3,-sqrt3,0).data());\n\n  glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, Vector4f(0.7, 0.7, 0.7, 1).data());\n  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, Vector4f(0.8, 0.75, 0.6, 1).data());\n  glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, Vector4f(1, 1, 1, 1).data());\n  glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 64);\n\n  glEnable(GL_LIGHTING);\n  glEnable(GL_LIGHT0);\n  glEnable(GL_LIGHT1);\n\n  sFancySpheres.draw();\n  glVertexPointer(3, GL_FLOAT, 0, mVertices[0].data());\n  glNormalPointer(GL_FLOAT, 0, mNormals[0].data());\n  glEnableClientState(GL_VERTEX_ARRAY);\n  glEnableClientState(GL_NORMAL_ARRAY);\n  glDrawArrays(GL_TRIANGLES, 0, mVertices.size());\n  glDisableClientState(GL_VERTEX_ARRAY);\n  glDisableClientState(GL_NORMAL_ARRAY);\n\n  glDisable(GL_LIGHTING);\n}\n\nvoid RenderingWidget::animate()\n{\n  m_alpha += double(m_timer.interval()) * 1e-3;\n\n  TimeLine::const_iterator hi = m_timeline.upper_bound(m_alpha);\n  TimeLine::const_iterator lo = hi;\n  --lo;\n\n  Frame currentFrame;\n\n  if(hi==m_timeline.end())\n  {\n    // end\n    currentFrame = lo->second;\n    stopAnimation();\n  }\n  else if(hi==m_timeline.begin())\n  {\n    // start\n    currentFrame = hi->second;\n  }\n  else\n  {\n    float s = (m_alpha - lo->first)/(hi->first - lo->first);\n    if (mLerpMode==LerpEulerAngles)\n      currentFrame = ::lerpFrame<EulerAngles<float> >(s, lo->second, hi->second);\n    else if (mLerpMode==LerpQuaternion)\n      currentFrame = ::lerpFrame<Eigen::Quaternionf>(s, lo->second, hi->second);\n    else\n    {\n      std::cerr << \"Invalid rotation interpolation mode (abort)\\n\";\n      exit(2);\n    }\n    currentFrame.orientation.coeffs().normalize();\n  }\n\n  currentFrame.orientation = currentFrame.orientation.inverse();\n  currentFrame.position = - (currentFrame.orientation * currentFrame.position);\n  mCamera.setFrame(currentFrame);\n\n  updateGL();\n}\n\nvoid RenderingWidget::keyPressEvent(QKeyEvent * e)\n{\n    switch(e->key())\n    {\n      case Qt::Key_Up:\n        mCamera.zoom(2);\n        break;\n      case Qt::Key_Down:\n        mCamera.zoom(-2);\n        break;\n      // add a frame\n      case Qt::Key_G:\n        grabFrame();\n        break;\n      // clear the time line\n      case Qt::Key_C:\n        m_timeline.clear();\n        break;\n      // move the camera to initial pos\n      case Qt::Key_R:\n        resetCamera();\n        break;\n      // start/stop the animation\n      case Qt::Key_A:\n        if (mAnimate)\n        {\n          stopAnimation();\n        }\n        else\n        {\n          m_alpha = 0;\n          connect(&m_timer, SIGNAL(timeout()), this, SLOT(animate()));\n          m_timer.start(1000/30);\n          mAnimate = true;\n        }\n        break;\n      default:\n        break;\n    }\n\n    updateGL();\n}\n\nvoid RenderingWidget::stopAnimation()\n{\n  disconnect(&m_timer, SIGNAL(timeout()), this, SLOT(animate()));\n  m_timer.stop();\n  mAnimate = false;\n  m_alpha = 0;\n}\n\nvoid RenderingWidget::mousePressEvent(QMouseEvent* e)\n{\n  mMouseCoords = Vector2i(e->pos().x(), e->pos().y());\n  bool fly = (mNavMode==NavFly) || (e->modifiers()&Qt::ControlModifier);\n  switch(e->button())\n  {\n    case Qt::LeftButton:\n      if(fly)\n      {\n        mCurrentTrackingMode = TM_LOCAL_ROTATE;\n        mTrackball.start(Trackball::Local);\n      }\n      else\n      {\n        mCurrentTrackingMode = TM_ROTATE_AROUND;\n        mTrackball.start(Trackball::Around);\n      }\n      mTrackball.track(mMouseCoords);\n      break;\n    case Qt::MidButton:\n      if(fly)\n        mCurrentTrackingMode = TM_FLY_Z;\n      else\n        mCurrentTrackingMode = TM_ZOOM;\n      break;\n    case Qt::RightButton:\n        mCurrentTrackingMode = TM_FLY_PAN;\n      break;\n    default:\n      break;\n  }\n}\nvoid RenderingWidget::mouseReleaseEvent(QMouseEvent*)\n{\n    mCurrentTrackingMode = TM_NO_TRACK;\n    updateGL();\n}\n\nvoid RenderingWidget::mouseMoveEvent(QMouseEvent* e)\n{\n    // tracking\n    if(mCurrentTrackingMode != TM_NO_TRACK)\n    {\n        float dx =   float(e->x() - mMouseCoords.x()) / float(mCamera.vpWidth());\n        float dy = - float(e->y() - mMouseCoords.y()) / float(mCamera.vpHeight());\n\n        // speedup the transformations\n        if(e->modifiers() & Qt::ShiftModifier)\n        {\n          dx *= 10.;\n          dy *= 10.;\n        }\n\n        switch(mCurrentTrackingMode)\n        {\n          case TM_ROTATE_AROUND:\n          case TM_LOCAL_ROTATE:\n            if (mRotationMode==RotationStable)\n            {\n              // use the stable trackball implementation mapping\n              // the 2D coordinates to 3D points on a sphere.\n              mTrackball.track(Vector2i(e->pos().x(), e->pos().y()));\n            }\n            else\n            {\n              // standard approach mapping the x and y displacements as rotations\n              // around the camera's X and Y axes.\n              Quaternionf q = AngleAxisf( dx*M_PI, Vector3f::UnitY())\n                            * AngleAxisf(-dy*M_PI, Vector3f::UnitX());\n              if (mCurrentTrackingMode==TM_LOCAL_ROTATE)\n                mCamera.localRotate(q);\n              else\n                mCamera.rotateAroundTarget(q);\n            }\n            break;\n          case TM_ZOOM :\n            mCamera.zoom(dy*100);\n            break;\n          case TM_FLY_Z :\n            mCamera.localTranslate(Vector3f(0, 0, -dy*200));\n            break;\n          case TM_FLY_PAN :\n            mCamera.localTranslate(Vector3f(dx*200, dy*200, 0));\n            break;\n          default:\n            break;\n        }\n\n        updateGL();\n    }\n\n    mMouseCoords = Vector2i(e->pos().x(), e->pos().y());\n}\n\nvoid RenderingWidget::paintGL()\n{\n  glEnable(GL_DEPTH_TEST);\n  glDisable(GL_CULL_FACE);\n  glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);\n  glDisable(GL_COLOR_MATERIAL);\n  glDisable(GL_BLEND);\n  glDisable(GL_ALPHA_TEST);\n  glDisable(GL_TEXTURE_1D);\n  glDisable(GL_TEXTURE_2D);\n  glDisable(GL_TEXTURE_3D);\n\n  // Clear buffers\n  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n\n  mCamera.activateGL();\n\n  drawScene();\n}\n\nvoid RenderingWidget::initializeGL()\n{\n  glClearColor(1., 1., 1., 0.);\n  glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1);\n  glDepthMask(GL_TRUE);\n  glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);\n\n  mCamera.setPosition(Vector3f(-200, -200, -200));\n  mCamera.setTarget(Vector3f(0, 0, 0));\n  mInitFrame.orientation = mCamera.orientation().inverse();\n  mInitFrame.position = mCamera.viewMatrix().translation();\n}\n\nvoid RenderingWidget::resizeGL(int width, int height)\n{\n    mCamera.setViewport(width,height);\n}\n\nvoid RenderingWidget::setNavMode(int m)\n{\n  mNavMode = NavMode(m);\n}\n\nvoid RenderingWidget::setLerpMode(int m)\n{\n  mLerpMode = LerpMode(m);\n}\n\nvoid RenderingWidget::setRotationMode(int m)\n{\n  mRotationMode = RotationMode(m);\n}\n\nvoid RenderingWidget::resetCamera()\n{\n  if (mAnimate)\n    stopAnimation();\n  m_timeline.clear();\n  Frame aux0 = mCamera.frame();\n  aux0.orientation = aux0.orientation.inverse();\n  aux0.position = mCamera.viewMatrix().translation();\n  m_timeline[0] = aux0;\n\n  Vector3f currentTarget = mCamera.target();\n  mCamera.setTarget(Vector3f::Zero());\n\n  // compute the rotation duration to move the camera to the target\n  Frame aux1 = mCamera.frame();\n  aux1.orientation = aux1.orientation.inverse();\n  aux1.position = mCamera.viewMatrix().translation();\n  float duration = aux0.orientation.angularDistance(aux1.orientation) * 0.9;\n  if (duration<0.1) duration = 0.1;\n\n  // put the camera at that time step:\n  aux1 = aux0.lerp(duration/2,mInitFrame);\n  // and make it look at the target again\n  aux1.orientation = aux1.orientation.inverse();\n  aux1.position = - (aux1.orientation * aux1.position);\n  mCamera.setFrame(aux1);\n  mCamera.setTarget(Vector3f::Zero());\n\n  // add this camera keyframe\n  aux1.orientation = aux1.orientation.inverse();\n  aux1.position = mCamera.viewMatrix().translation();\n  m_timeline[duration] = aux1;\n\n  m_timeline[2] = mInitFrame;\n  m_alpha = 0;\n  animate();\n  connect(&m_timer, SIGNAL(timeout()), this, SLOT(animate()));\n  m_timer.start(1000/30);\n  mAnimate = true;\n}\n\nQWidget* RenderingWidget::createNavigationControlWidget()\n{\n  QWidget* panel = new QWidget();\n  QVBoxLayout* layout = new QVBoxLayout();\n\n  {\n    QPushButton* but = new QPushButton(\"reset\");\n    but->setToolTip(\"move the camera to initial position (with animation)\");\n    layout->addWidget(but);\n    connect(but, SIGNAL(clicked()), this, SLOT(resetCamera()));\n  }\n  {\n    // navigation mode\n    QGroupBox* box = new QGroupBox(\"navigation mode\");\n    QVBoxLayout* boxLayout = new QVBoxLayout;\n    QButtonGroup* group = new QButtonGroup(panel);\n    QRadioButton* but;\n    but = new QRadioButton(\"turn around\");\n    but->setToolTip(\"look around an object\");\n    group->addButton(but, NavTurnAround);\n    boxLayout->addWidget(but);\n    but = new QRadioButton(\"fly\");\n    but->setToolTip(\"free navigation like a spaceship\\n(this mode can also be enabled pressing the \\\"shift\\\" key)\");\n    group->addButton(but, NavFly);\n    boxLayout->addWidget(but);\n    group->button(mNavMode)->setChecked(true);\n    connect(group, SIGNAL(buttonClicked(int)), this, SLOT(setNavMode(int)));\n    box->setLayout(boxLayout);\n    layout->addWidget(box);\n  }\n  {\n    // track ball, rotation mode\n    QGroupBox* box = new QGroupBox(\"rotation mode\");\n    QVBoxLayout* boxLayout = new QVBoxLayout;\n    QButtonGroup* group = new QButtonGroup(panel);\n    QRadioButton* but;\n    but = new QRadioButton(\"stable trackball\");\n    group->addButton(but, RotationStable);\n    boxLayout->addWidget(but);\n    but->setToolTip(\"use the stable trackball implementation mapping\\nthe 2D coordinates to 3D points on a sphere\");\n    but = new QRadioButton(\"standard rotation\");\n    group->addButton(but, RotationStandard);\n    boxLayout->addWidget(but);\n    but->setToolTip(\"standard approach mapping the x and y displacements\\nas rotations around the camera's X and Y axes\");\n    group->button(mRotationMode)->setChecked(true);\n    connect(group, SIGNAL(buttonClicked(int)), this, SLOT(setRotationMode(int)));\n    box->setLayout(boxLayout);\n    layout->addWidget(box);\n  }\n  {\n    // interpolation mode\n    QGroupBox* box = new QGroupBox(\"spherical interpolation\");\n    QVBoxLayout* boxLayout = new QVBoxLayout;\n    QButtonGroup* group = new QButtonGroup(panel);\n    QRadioButton* but;\n    but = new QRadioButton(\"quaternion slerp\");\n    group->addButton(but, LerpQuaternion);\n    boxLayout->addWidget(but);\n    but->setToolTip(\"use quaternion spherical interpolation\\nto interpolate orientations\");\n    but = new QRadioButton(\"euler angles\");\n    group->addButton(but, LerpEulerAngles);\n    boxLayout->addWidget(but);\n    but->setToolTip(\"use Euler angles to interpolate orientations\");\n    group->button(mNavMode)->setChecked(true);\n    connect(group, SIGNAL(buttonClicked(int)), this, SLOT(setLerpMode(int)));\n    box->setLayout(boxLayout);\n    layout->addWidget(box);\n  }\n  layout->addItem(new QSpacerItem(0,0,QSizePolicy::Minimum,QSizePolicy::Expanding));\n  panel->setLayout(layout);\n  return panel;\n}\n\nQuaternionDemo::QuaternionDemo()\n{\n  mRenderingWidget = new RenderingWidget();\n  setCentralWidget(mRenderingWidget);\n\n  QDockWidget* panel = new QDockWidget(\"navigation\", this);\n  panel->setAllowedAreas((QFlags<Qt::DockWidgetArea>)(Qt::RightDockWidgetArea | Qt::LeftDockWidgetArea));\n  addDockWidget(Qt::RightDockWidgetArea, panel);\n  panel->setWidget(mRenderingWidget->createNavigationControlWidget());\n}\n\nint main(int argc, char *argv[])\n{\n  std::cout << \"Navigation:\\n\";\n  std::cout << \"  left button:           rotate around the target\\n\";\n  std::cout << \"  middle button:         zoom\\n\";\n  std::cout << \"  left button + ctrl     quake rotate (rotate around camera position)\\n\";\n  std::cout << \"  middle button + ctrl   walk (progress along camera's z direction)\\n\";\n  std::cout << \"  left button:           pan (translate in the XY camera's plane)\\n\\n\";\n  std::cout << \"R : move the camera to initial position\\n\";\n  std::cout << \"A : start/stop animation\\n\";\n  std::cout << \"C : clear the animation\\n\";\n  std::cout << \"G : add a key frame\\n\";\n\n  QApplication app(argc, argv);\n  QuaternionDemo demo;\n  demo.resize(600,500);\n  demo.show();\n  return app.exec();\n}\n\n#include \"quaternion_demo.moc\"\n\n"
  },
  {
    "path": "libs/eigen/demos/opengl/quaternion_demo.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_QUATERNION_DEMO_H\n#define EIGEN_QUATERNION_DEMO_H\n\n#include \"gpuhelper.h\"\n#include \"camera.h\"\n#include \"trackball.h\"\n#include <map>\n#include <QTimer>\n#include <QtGui/QApplication>\n#include <QtOpenGL/QGLWidget>\n#include <QtGui/QMainWindow>\n\nclass RenderingWidget : public QGLWidget\n{\n  Q_OBJECT\n\n    typedef std::map<float,Frame> TimeLine;\n    TimeLine m_timeline;\n    Frame lerpFrame(float t);\n\n    Frame mInitFrame;\n    bool mAnimate;\n    float m_alpha;\n\n    enum TrackMode {\n      TM_NO_TRACK=0, TM_ROTATE_AROUND, TM_ZOOM,\n      TM_LOCAL_ROTATE, TM_FLY_Z, TM_FLY_PAN\n    };\n\n    enum NavMode {\n      NavTurnAround,\n      NavFly\n    };\n\n    enum LerpMode {\n      LerpQuaternion,\n      LerpEulerAngles\n    };\n\n    enum RotationMode {\n      RotationStable,\n      RotationStandard\n    };\n\n    Camera mCamera;\n    TrackMode mCurrentTrackingMode;\n    NavMode mNavMode;\n    LerpMode mLerpMode;\n    RotationMode mRotationMode;\n    Vector2i mMouseCoords;\n    Trackball mTrackball;\n\n    QTimer m_timer;\n\n    void setupCamera();\n\n    std::vector<Vector3f> mVertices;\n    std::vector<Vector3f> mNormals;\n    std::vector<int> mIndices;\n\n  protected slots:\n\n    virtual void animate(void);\n    virtual void drawScene(void);\n\n    virtual void grabFrame(void);\n    virtual void stopAnimation();\n\n    virtual void setNavMode(int);\n    virtual void setLerpMode(int);\n    virtual void setRotationMode(int);\n    virtual void resetCamera();\n\n  protected:\n\n    virtual void initializeGL();\n    virtual void resizeGL(int width, int height);\n    virtual void paintGL();\n    \n    //--------------------------------------------------------------------------------\n    virtual void mousePressEvent(QMouseEvent * e);\n    virtual void mouseReleaseEvent(QMouseEvent * e);\n    virtual void mouseMoveEvent(QMouseEvent * e);\n    virtual void keyPressEvent(QKeyEvent * e);\n    //--------------------------------------------------------------------------------\n\n  public: \n    EIGEN_MAKE_ALIGNED_OPERATOR_NEW\n    \n    RenderingWidget();\n    ~RenderingWidget() { }\n\n    QWidget* createNavigationControlWidget();\n};\n\nclass QuaternionDemo : public QMainWindow\n{\n  Q_OBJECT\n  public:\n    QuaternionDemo();\n  protected:\n    RenderingWidget* mRenderingWidget;\n};\n\n#endif // EIGEN_QUATERNION_DEMO_H\n"
  },
  {
    "path": "libs/eigen/demos/opengl/trackball.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"trackball.h\"\n#include \"camera.h\"\n\nusing namespace Eigen;\n\nvoid Trackball::track(const Vector2i& point2D)\n{\n  if (mpCamera==0)\n    return;\n  Vector3f newPoint3D;\n  bool newPointOk = mapToSphere(point2D, newPoint3D);\n\n  if (mLastPointOk && newPointOk)\n  {\n    Vector3f axis = mLastPoint3D.cross(newPoint3D).normalized();\n    float cos_angle = mLastPoint3D.dot(newPoint3D);\n    if ( internal::abs(cos_angle) < 1.0 )\n    {\n      float angle = 2. * acos(cos_angle);\n      if (mMode==Around)\n        mpCamera->rotateAroundTarget(Quaternionf(AngleAxisf(angle, axis)));\n      else\n        mpCamera->localRotate(Quaternionf(AngleAxisf(-angle, axis)));\n    }\n  }\n\n  mLastPoint3D = newPoint3D;\n  mLastPointOk = newPointOk;\n}\n\nbool Trackball::mapToSphere(const Vector2i& p2, Vector3f& v3)\n{\n  if ((p2.x() >= 0) && (p2.x() <= int(mpCamera->vpWidth())) &&\n      (p2.y() >= 0) && (p2.y() <= int(mpCamera->vpHeight())) )\n  {\n    double x  = (double)(p2.x() - 0.5*mpCamera->vpWidth())  / (double)mpCamera->vpWidth();\n    double y  = (double)(0.5*mpCamera->vpHeight() - p2.y()) / (double)mpCamera->vpHeight();\n    double sinx         = sin(M_PI * x * 0.5);\n    double siny         = sin(M_PI * y * 0.5);\n    double sinx2siny2   = sinx * sinx + siny * siny;\n\n    v3.x() = sinx;\n    v3.y() = siny;\n    v3.z() = sinx2siny2 < 1.0 ? sqrt(1.0 - sinx2siny2) : 0.0;\n\n    return true;\n  }\n  else\n    return false;\n}\n"
  },
  {
    "path": "libs/eigen/demos/opengl/trackball.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_TRACKBALL_H\n#define EIGEN_TRACKBALL_H\n\n#include <Eigen/Geometry>\n\nclass Camera;\n\nclass Trackball\n{\n  public:\n\n    enum Mode {Around, Local};\n\n    Trackball() : mpCamera(0) {}\n\n    void start(Mode m = Around) { mMode = m; mLastPointOk = false; }\n\n    void setCamera(Camera* pCam) { mpCamera = pCam; }\n\n    void track(const Eigen::Vector2i& newPoint2D);\n\n  protected:\n\n    bool mapToSphere( const Eigen::Vector2i& p2, Eigen::Vector3f& v3);\n\n    Camera* mpCamera;\n    Eigen::Vector3f mLastPoint3D;\n    Mode mMode;\n    bool mLastPointOk;\n\n};\n\n#endif // EIGEN_TRACKBALL_H\n"
  },
  {
    "path": "libs/eigen/doc/A05_PortingFrom2To3.dox",
    "content": "namespace Eigen {\n\n/** \\page Eigen2ToEigen3 Porting from Eigen2 to Eigen3\n\n<div class=\"bigwarning\">Eigen2 support is deprecated in Eigen 3.2.x and it will be removed in Eigen 3.3.</div>\n\nThis page lists the most important API changes between Eigen2 and Eigen3,\nand gives tips to help porting your application from Eigen2 to Eigen3.\n\n\\eigenAutoToc\n\n\\section CompatibilitySupport Eigen2 compatibility support\n\nIn order to ease the switch from Eigen2 to Eigen3, Eigen3 features \\subpage Eigen2SupportModes \"Eigen2 support modes\".\n\nThe quick way to enable this is to define the \\c EIGEN2_SUPPORT preprocessor token \\b before including any Eigen header (typically it should be set in your project options).\n\nA more powerful, \\em staged migration path is also provided, which may be useful to migrate larger projects from Eigen2 to Eigen3. This is explained in the \\ref Eigen2SupportModes \"Eigen 2 support modes\" page. \n\n\\section Using The USING_PART_OF_NAMESPACE_EIGEN macro\n\nThe USING_PART_OF_NAMESPACE_EIGEN macro has been removed. In Eigen 3, just do:\n\\code\nusing namespace Eigen;\n\\endcode\n\n\\section ComplexDot Dot products over complex numbers\n\nThis is the single trickiest change between Eigen 2 and Eigen 3. It only affects code using \\c std::complex numbers as scalar type.\n\nEigen 2's dot product was linear in the first variable. Eigen 3's dot product is linear in the second variable. In other words, the Eigen 2 code \\code x.dot(y) \\endcode is equivalent to the Eigen 3 code \\code y.dot(x) \\endcode In yet other words, dot products are complex-conjugated in Eigen 3 compared to Eigen 2. The switch to the new convention was commanded by common usage, especially with the notation \\f$ x^Ty \\f$ for dot products of column-vectors.\n\n\\section VectorBlocks Vector blocks\n\n<table class=\"manual\">\n<tr><th>Eigen 2</th><th>Eigen 3</th></th>\n<tr><td>\\code\nvector.start(length)\nvector.start<length>()\nvector.end(length)\nvector.end<length>()\n\\endcode</td><td>\\code\nvector.head(length)\nvector.head<length>()\nvector.tail(length)\nvector.tail<length>()\n\\endcode</td></tr>\n</table>\n\n\n\\section Corners Matrix Corners\n\n<table class=\"manual\">\n<tr><th>Eigen 2</th><th>Eigen 3</th></th>\n<tr><td>\\code\nmatrix.corner(TopLeft,r,c)\nmatrix.corner(TopRight,r,c)\nmatrix.corner(BottomLeft,r,c)\nmatrix.corner(BottomRight,r,c)\nmatrix.corner<r,c>(TopLeft)\nmatrix.corner<r,c>(TopRight)\nmatrix.corner<r,c>(BottomLeft)\nmatrix.corner<r,c>(BottomRight)\n\\endcode</td><td>\\code\nmatrix.topLeftCorner(r,c)\nmatrix.topRightCorner(r,c)\nmatrix.bottomLeftCorner(r,c)\nmatrix.bottomRightCorner(r,c)\nmatrix.topLeftCorner<r,c>()\nmatrix.topRightCorner<r,c>()\nmatrix.bottomLeftCorner<r,c>()\nmatrix.bottomRightCorner<r,c>()\n\\endcode</td>\n</tr>\n</table>\n\nNotice that Eigen3 also provides these new convenience methods: topRows(), bottomRows(), leftCols(), rightCols(). See in class DenseBase.\n\n\\section CoefficientWiseOperations Coefficient wise operations\n\nIn Eigen2, coefficient wise operations which have no proper mathematical definition (as a coefficient wise product)\nwere achieved using the .cwise() prefix, e.g.:\n\\code a.cwise() * b \\endcode\nIn Eigen3 this .cwise() prefix has been superseded by a new kind of matrix type called\nArray for which all operations are performed coefficient wise. You can easily view a matrix as an array and vice versa using\nthe MatrixBase::array() and ArrayBase::matrix() functions respectively. Here is an example:\n\\code\nVector4f a, b, c;\nc = a.array() * b.array();\n\\endcode\nNote that the .array() function is not at all a synonym of the deprecated .cwise() prefix.\nWhile the .cwise() prefix changed the behavior of the following operator, the array() function performs\na permanent conversion to the array world. Therefore, for binary operations such as the coefficient wise product,\nboth sides must be converted to an \\em array as in the above example. On the other hand, when you\nconcatenate multiple coefficient wise operations you only have to do the conversion once, e.g.:\n\\code\nVector4f a, b, c;\nc = a.array().abs().pow(3) * b.array().abs().sin();\n\\endcode\nWith Eigen2 you would have written:\n\\code\nc = (a.cwise().abs().cwise().pow(3)).cwise() * (b.cwise().abs().cwise().sin());\n\\endcode\n\n\\section PartAndExtract Triangular and self-adjoint matrices\n\nIn Eigen 2 you had to play with the part, extract, and marked functions to deal with triangular and selfadjoint matrices. In Eigen 3, all these functions have been removed in favor of the concept of \\em views:\n\n<table class=\"manual\">\n<tr><th>Eigen 2</th><th>Eigen 3</th></tr>\n<tr><td>\\code\nA.part<UpperTriangular>();\nA.part<StrictlyLowerTriangular>(); \\endcode</td>\n<td>\\code\nA.triangularView<Upper>()\nA.triangularView<StrictlyLower>()\\endcode</td></tr>\n<tr><td>\\code\nA.extract<UpperTriangular>();\nA.extract<StrictlyLowerTriangular>();\\endcode</td>\n<td>\\code\nA.triangularView<Upper>()\nA.triangularView<StrictlyLower>()\\endcode</td></tr>\n<tr><td>\\code\nA.marked<UpperTriangular>();\nA.marked<StrictlyLowerTriangular>();\\endcode</td>\n<td>\\code\nA.triangularView<Upper>()\nA.triangularView<StrictlyLower>()\\endcode</td></tr>\n<tr><td colspan=\"2\"></td></tr>\n<tr><td>\\code\nA.part<SelfAdfjoint|UpperTriangular>();\nA.extract<SelfAdfjoint|LowerTriangular>();\\endcode</td>\n<td>\\code\nA.selfadjointView<Upper>()\nA.selfadjointView<Lower>()\\endcode</td></tr>\n<tr><td colspan=\"2\"></td></tr>\n<tr><td>\\code\nUpperTriangular\nLowerTriangular\nUnitUpperTriangular\nUnitLowerTriangular\nStrictlyUpperTriangular\nStrictlyLowerTriangular\n\\endcode</td><td>\\code\nUpper\nLower\nUnitUpper\nUnitLower\nStrictlyUpper\nStrictlyLower\n\\endcode</td>\n</tr>\n</table>\n\n\\sa class TriangularView, class SelfAdjointView\n\n\\section TriangularSolveInPlace Triangular in-place solving\n\n<table class=\"manual\">\n<tr><th>Eigen 2</th><th>Eigen 3</th></tr>\n<tr><td>\\code A.triangularSolveInPlace<XxxTriangular>(Y);\\endcode</td><td>\\code A.triangularView<Xxx>().solveInPlace(Y);\\endcode</td></tr>\n</table>\n\n\n\\section Decompositions Matrix decompositions\n\nSome of Eigen 2's matrix decompositions have been renamed in Eigen 3, while some others have been removed and are replaced by other decompositions in Eigen 3.\n\n<table class=\"manual\">\n  <tr>\n    <th>Eigen 2</th>\n    <th>Eigen 3</th>\n    <th>Notes</th>\n  </tr>\n  <tr>\n    <td>LU</td>\n    <td>FullPivLU</td>\n    <td class=\"alt\">See also the new PartialPivLU, it's much faster</td>\n  </tr>\n  <tr>\n    <td>QR</td>\n    <td>HouseholderQR</td>\n    <td class=\"alt\">See also the new ColPivHouseholderQR, it's more reliable</td>\n  </tr>\n  <tr>\n    <td>SVD</td>\n    <td>JacobiSVD</td>\n    <td class=\"alt\">We currently don't have a bidiagonalizing SVD; of course this is planned.</td>\n  </tr>\n  <tr>\n    <td>EigenSolver and friends</td>\n    <td>\\code #include<Eigen/Eigenvalues> \\endcode </td>\n    <td class=\"alt\">Moved to separate module</td>\n  </tr>\n</table>\n\n\\section LinearSolvers Linear solvers\n\n<table class=\"manual\">\n<tr><th>Eigen 2</th><th>Eigen 3</th><th>Notes</th></tr>\n<tr><td>\\code A.lu();\\endcode</td>\n<td>\\code A.fullPivLu();\\endcode</td>\n<td class=\"alt\">Now A.lu() returns a PartialPivLU</td></tr>\n<tr><td>\\code A.lu().solve(B,&X);\\endcode</td>\n<td>\\code X = A.lu().solve(B);\n X = A.fullPivLu().solve(B);\\endcode</td>\n<td class=\"alt\">The returned by value is fully optimized</td></tr>\n<tr><td>\\code A.llt().solve(B,&X);\\endcode</td>\n<td>\\code X = A.llt().solve(B);\n X = A.selfadjointView<Lower>.llt().solve(B);\n X = A.selfadjointView<Upper>.llt().solve(B);\\endcode</td>\n<td class=\"alt\">The returned by value is fully optimized and \\n\nthe selfadjointView API allows you to select the \\n\ntriangular part to work on (default is lower part)</td></tr>\n<tr><td>\\code A.llt().solveInPlace(B);\\endcode</td>\n<td>\\code B = A.llt().solve(B);\n B = A.selfadjointView<Lower>.llt().solve(B);\n B = A.selfadjointView<Upper>.llt().solve(B);\\endcode</td>\n<td class=\"alt\">In place solving</td></tr>\n<tr><td>\\code A.ldlt().solve(B,&X);\\endcode</td>\n<td>\\code X = A.ldlt().solve(B);\n X = A.selfadjointView<Lower>.ldlt().solve(B);\n X = A.selfadjointView<Upper>.ldlt().solve(B);\\endcode</td>\n<td class=\"alt\">The returned by value is fully optimized and \\n\nthe selfadjointView API allows you to select the \\n\ntriangular part to work on</td></tr>\n</table>\n\n\\section GeometryModule Changes in the Geometry module\n\nThe Geometry module is the one that changed the most. If you rely heavily on it, it's probably a good idea to use the \\ref Eigen2SupportModes \"Eigen 2 support modes\" to perform your migration.\n\n\\section Transform The Transform class\n\nIn Eigen 2, the Transform class didn't really know whether it was a projective or affine transformation. In Eigen 3, it takes a new \\a Mode template parameter, which indicates whether it's \\a Projective or \\a Affine transform. There is no default value.\n\nThe Transform3f (etc) typedefs are no more. In Eigen 3, the Transform typedefs explicitly refer to the \\a Projective and \\a Affine modes:\n\n<table class=\"manual\">\n<tr><th>Eigen 2</th><th>Eigen 3</th><th>Notes</th></tr>\n<tr>\n  <td> Transform3f </td>\n  <td> Affine3f or Projective3f </td>\n  <td> Of course 3f is just an example here </td>\n</tr>\n</table>\n\n\n\\section LazyVsNoalias Lazy evaluation and noalias\n\nIn Eigen all operations are performed in a lazy fashion except the matrix products which are always evaluated into a temporary by default.\nIn Eigen2, lazy evaluation could be enforced by tagging a product using the .lazy() function. However, in complex expressions it was not\neasy to determine where to put the lazy() function. In Eigen3, the lazy() feature has been superseded by the MatrixBase::noalias() function\nwhich can be used on the left hand side of an assignment when no aliasing can occur. Here is an example:\n\\code\nMatrixXf a, b, c;\n...\nc.noalias() += 2 * a.transpose() * b;\n\\endcode\nHowever, the noalias mechanism does not cover all the features of the old .lazy(). Indeed, in some extremely rare cases,\nit might be useful to explicit request for a lay product, i.e., for a product which will be evaluated one coefficient at once, on request,\njust like any other expressions. To this end you can use the MatrixBase::lazyProduct() function, however we strongly discourage you to\nuse it unless you are sure of what you are doing, i.e., you have rigourosly measured a speed improvement.\n\n\\section AlignMacros Alignment-related macros\n\nThe EIGEN_ALIGN_128 macro has been renamed to EIGEN_ALIGN16. Don't be surprised, it's just that we switched to counting in bytes ;-)\n\nThe EIGEN_DONT_ALIGN option still exists in Eigen 3, but it has a new cousin: EIGEN_DONT_ALIGN_STATICALLY. It allows to get rid of all static alignment issues while keeping alignment of dynamic-size heap-allocated arrays, thus keeping vectorization for dynamic-size objects.\n\n\\section AlignedMap Aligned Map objects\n\nA common issue with Eigen 2 was that when mapping an array with Map, there was no way to tell Eigen that your array was aligned. There was a ForceAligned option but it didn't mean that; it was just confusing and has been removed.\n\nNew in Eigen3 is the #Aligned option. See the documentation of class Map. Use it like this:\n\\code\nMap<Vector4f, Aligned> myMappedVector(some_aligned_array);\n\\endcode\nThere also are related convenience static methods, which actually are the preferred way as they take care of such things as constness:\n\\code\nresult = Vector4f::MapAligned(some_aligned_array);\n\\endcode\n\n\\section StdContainers STL Containers\n\nIn Eigen2, <tt>#include<Eigen/StdVector></tt> tweaked std::vector to automatically align elements. The problem was that that was quite invasive. In Eigen3, we only override standard behavior if you use Eigen::aligned_allocator<T> as your allocator type. So for example, if you use std::vector<Matrix4f>, you need to do the following change (note that aligned_allocator is under namespace Eigen):\n\n<table class=\"manual\">\n<tr><th>Eigen 2</th><th>Eigen 3</th></tr>\n<tr>\n  <td> \\code std::vector<Matrix4f> \\endcode </td>\n  <td> \\code std::vector<Matrix4f, aligned_allocator<Matrix4f> > \\endcode </td>\n</tr>\n</table>\n\n\\section eiPrefix Internal ei_ prefix\n\nIn Eigen2, global internal functions and structures were prefixed by \\c ei_. In Eigen3, they all have been moved into the more explicit \\c internal namespace. So, e.g., \\c ei_sqrt(x) now becomes \\c internal::sqrt(x). Of course it is not recommended to rely on Eigen's internal features.\n\n\n\n*/\n\n}\n"
  },
  {
    "path": "libs/eigen/doc/A10_Eigen2SupportModes.dox",
    "content": "namespace Eigen {\n\n/** \\page Eigen2SupportModes Eigen 2 support modes\n\n<div class=\"bigwarning\">Eigen2 support is deprecated in Eigen 3.2.x and it will be removed in Eigen 3.3.</div>\n\nThis page documents the Eigen2 support modes, a powerful tool to help migrating your project from Eigen 2 to Eigen 3.\nDon't miss our page on \\ref Eigen2ToEigen3 \"API changes\" between Eigen 2 and Eigen 3.\n\n\\eigenAutoToc\n\n\\section EIGEN2_SUPPORT_Macro The quick way: define EIGEN2_SUPPORT\n\nBy defining EIGEN2_SUPPORT before including any Eigen 3 header, you get back a large part of the Eigen 2 API, while keeping the Eigen 3 API and ABI unchanged.\n\nThis defaults to the \\ref Stage30 \"stage 30\" described below.\n\nThe rest of this page describes an optional, more powerful \\em staged migration path.\n\n\\section StagedMigrationPathOverview Overview of the staged migration path\n\nThe primary reason why EIGEN2_SUPPORT alone may not be enough to migrate a large project from Eigen 2 to Eigen 3 is that some of the Eigen 2 API is inherently incompatible with the Eigen 3 API. This happens when the same identifier is used in Eigen 2 and in Eigen 3 with different meanings. To help migrate projects that rely on such API, we provide a staged migration path allowing to perform the migration \\em incrementally.\n\nIt goes as follows:\n\\li Step 0: start with a project using Eigen 2.\n\\li Step 1: build your project against Eigen 3 with \\ref Stage10 \"Eigen 2 support stage 10\". This mode enables maximum compatibility with the Eigen 2 API, with just a few exceptions.\n\\li Step 2: build your project against Eigen 3 with \\ref Stage20 \"Eigen 2 support stage 20\". This mode forces you to add eigen2_ prefixes to the Eigen2 identifiers that conflict with Eigen 3 API.\n\\li Step 3: build your project against Eigen 3 with \\ref Stage30 \"Eigen 2 support stage 30\". This mode enables the full Eigen 3 API.\n\\li Step 4: build your project against Eigen 3 with \\ref Stage40 \"Eigen 2 support stage 40\". This mode enables the full Eigen 3 strictness on matters, such as const-correctness, where Eigen 2 was looser.\n\\li Step 5: build your project against Eigen 3 without any Eigen 2 support mode.\n\n\\section Stage10 Stage 10: define EIGEN2_SUPPORT_STAGE10_FULL_EIGEN2_API\n\nEnable this mode by defining the EIGEN2_SUPPORT_STAGE10_FULL_EIGEN2_API preprocessor macro before including any Eigen 3 header.\n\nThis mode maximizes support for the Eigen 2 API. As a result, it does not offer the full Eigen 3 API. Also, it doesn't offer quite 100% of the Eigen 2 API.\n\nThe part of the Eigen 3 API that is not present in this mode, is Eigen 3's Geometry module. Indeed, this mode completely replaces it by a copy of Eigen 2's Geometry module.\n\nThe parts of the API that are still not 100% Eigen 2 compatible in this mode are:\n\\li Dot products over complex numbers. Eigen 2's dot product was linear in the first variable. Eigen 3's dot product is linear in the second variable. In other words, the Eigen 2 code \\code x.dot(y) \\endcode is equivalent to the Eigen 3 code \\code y.dot(x) \\endcode In yet other words, dot products are complex-conjugated in Eigen 3 compared to Eigen 2. The switch to the new convention was commanded by common usage, especially with the notation \\f$ x^Ty \\f$ for dot products of column-vectors.\n\\li The Sparse module.\n\\li Certain fine details of linear algebraic decompositions. For example, LDLT decomposition is now pivoting in Eigen 3 whereas it wasn't in Eigen 2, so code that was relying on its underlying matrix structure will break.\n\\li Usage of Eigen types in STL containers, \\ref Eigen2ToEigen3 \"as explained on this page\".\n\n\\section Stage20 Stage 20: define EIGEN2_SUPPORT_STAGE20_RESOLVE_API_CONFLICTS\n\nEnable this mode by defining the EIGEN2_SUPPORT_STAGE10_FULL_EIGEN2_API preprocessor macro before including any Eigen 3 header.\n\nThis mode removes the Eigen 2 API that is directly conflicting with Eigen 3 API. Instead, these bits of Eigen 2 API remain available with eigen2_ prefixes. The main examples of such API are:\n\\li the whole Geometry module. For example, replace \\c Quaternion by \\c eigen2_Quaternion, replace \\c Transform3f by \\c eigen2_Transform3f, etc.\n\\li the lu() method to obtain a LU decomposition. Replace by eigen2_lu().\n\nThere is also one more eigen2_-prefixed identifier that you should know about, even though its use is not checked at compile time by this mode: the dot() method. As was discussed above, over complex numbers, its meaning is different between Eigen 2 and Eigen 3. You can use eigen2_dot() to get the Eigen 2 behavior.\n\n\\section Stage30 Stage 30: define EIGEN2_SUPPORT_STAGE30_FULL_EIGEN3_API\n\nEnable this mode by defining the EIGEN2_SUPPORT_STAGE30_FULL_EIGEN3_API preprocessor macro before including any Eigen 3 header. Also, this mode is what you get by default when you just define EIGEN2_SUPPORT.\n\nThis mode gives you the full unaltered Eigen 3 API, while still keeping as much support as possible for the Eigen 2 API.\n\nThe eigen2_-prefixed identifiers are still available, but at this stage you should now replace them by Eigen 3 identifiers. Have a look at our page on \\ref Eigen2ToEigen3 \"API changes\" between Eigen 2 and Eigen 3.\n\n\\section Stage40 Stage 40: define EIGEN2_SUPPORT_STAGE40_FULL_EIGEN3_STRICTNESS\n\nEnable this mode by defining the EIGEN2_SUPPORT_STAGE40_FULL_EIGEN3_STRICTNESS preprocessor macro before including any Eigen 3 header.\n\nThis mode tightens the last bits of strictness, especially const-correctness, that had to be loosened to support what Eigen 2 allowed. For example, this code compiled in Eigen 2:\n\\code\nconst float array[4];\nx = Map<Vector4f>(array);\n\\endcode\nThat allowed to circumvent constness. This is no longer allowed in Eigen 3. If you have to map const data in Eigen 3, map it as a const-qualified type. However, rather than explictly constructing Map objects, we strongly encourage you to use the static Map methods instead, as they take care of all of this for you:\n\\code\nconst float array[4];\nx = Vector4f::Map(array);\n\\endcode\nThis lets Eigen do the right thing for you and works equally well in Eigen 2 and in Eigen 3.\n\n\\section FinallyDropAllEigen2Support Finally drop all Eigen 2 support\n\nStage 40 is the first where it's \"comfortable\" to stay for a little longer period, since it preserves 100% Eigen 3 compatibility. However, we still encourage you to complete your migration as quickly as possible. While we do run the Eigen 2 test suite against Eigen 3's stage 10 support mode, we can't guarantee the same level of support and quality assurance for Eigen 2 support as we do for Eigen 3 itself, especially not in the long term. \\ref Eigen2ToEigen3 \"This page\" describes a large part of the changes that you may need to perform.\n\n\\section ABICompatibility What about ABI compatibility?\n\nIt goes as follows:\n\\li Stage 10 already is ABI compatible with Eigen 3 for the basic (Matrix, Array, SparseMatrix...) types. However, since this stage uses a copy of Eigen 2's Geometry module instead of Eigen 3's own Geometry module, the ABI in the Geometry module is not Eigen 3 compatible.\n\\li Stage 20 removes the Eigen 3-incompatible Eigen 2 Geometry module (it remains available with eigen2_ prefix). So at this stage, all the identifiers that exist in Eigen 3 have the Eigen 3 ABI (and API).\n\\li Stage 30 introduces the remaining Eigen 3 identifiers. So at this stage, you have the full Eigen 3 ABI.\n\\li Stage 40 is no different than Stage 30 in these matters.\n\n\n*/\n\n}\n"
  },
  {
    "path": "libs/eigen/doc/AsciiQuickReference.txt",
    "content": "// A simple quickref for Eigen. Add anything that's missing.\n// Main author: Keir Mierle\n\n#include <Eigen/Dense>\n\nMatrix<double, 3, 3> A;               // Fixed rows and cols. Same as Matrix3d.\nMatrix<double, 3, Dynamic> B;         // Fixed rows, dynamic cols.\nMatrix<double, Dynamic, Dynamic> C;   // Full dynamic. Same as MatrixXd.\nMatrix<double, 3, 3, RowMajor> E;     // Row major; default is column-major.\nMatrix3f P, Q, R;                     // 3x3 float matrix.\nVector3f x, y, z;                     // 3x1 float matrix.\nRowVector3f a, b, c;                  // 1x3 float matrix.\nVectorXd v;                           // Dynamic column vector of doubles\ndouble s;                            \n\n// Basic usage\n// Eigen          // Matlab           // comments\nx.size()          // length(x)        // vector size\nC.rows()          // size(C,1)        // number of rows\nC.cols()          // size(C,2)        // number of columns\nx(i)              // x(i+1)           // Matlab is 1-based\nC(i,j)            // C(i+1,j+1)       //\n\nA.resize(4, 4);   // Runtime error if assertions are on.\nB.resize(4, 9);   // Runtime error if assertions are on.\nA.resize(3, 3);   // Ok; size didn't change.\nB.resize(3, 9);   // Ok; only dynamic cols changed.\n                  \nA << 1, 2, 3,     // Initialize A. The elements can also be\n     4, 5, 6,     // matrices, which are stacked along cols\n     7, 8, 9;     // and then the rows are stacked.\nB << A, A, A;     // B is three horizontally stacked A's.\nA.fill(10);       // Fill A with all 10's.\n\n// Eigen                            // Matlab\nMatrixXd::Identity(rows,cols)       // eye(rows,cols)\nC.setIdentity(rows,cols)            // C = eye(rows,cols)\nMatrixXd::Zero(rows,cols)           // zeros(rows,cols)\nC.setZero(rows,cols)                // C = ones(rows,cols)\nMatrixXd::Ones(rows,cols)           // ones(rows,cols)\nC.setOnes(rows,cols)                // C = ones(rows,cols)\nMatrixXd::Random(rows,cols)         // rand(rows,cols)*2-1        // MatrixXd::Random returns uniform random numbers in (-1, 1).\nC.setRandom(rows,cols)              // C = rand(rows,cols)*2-1\nVectorXd::LinSpaced(size,low,high)   // linspace(low,high,size)'\nv.setLinSpaced(size,low,high)        // v = linspace(low,high,size)'\n\n\n// Matrix slicing and blocks. All expressions listed here are read/write.\n// Templated size versions are faster. Note that Matlab is 1-based (a size N\n// vector is x(1)...x(N)).\n// Eigen                           // Matlab\nx.head(n)                          // x(1:n)\nx.head<n>()                        // x(1:n)\nx.tail(n)                          // x(end - n + 1: end)\nx.tail<n>()                        // x(end - n + 1: end)\nx.segment(i, n)                    // x(i+1 : i+n)\nx.segment<n>(i)                    // x(i+1 : i+n)\nP.block(i, j, rows, cols)          // P(i+1 : i+rows, j+1 : j+cols)\nP.block<rows, cols>(i, j)          // P(i+1 : i+rows, j+1 : j+cols)\nP.row(i)                           // P(i+1, :)\nP.col(j)                           // P(:, j+1)\nP.leftCols<cols>()                 // P(:, 1:cols)\nP.leftCols(cols)                   // P(:, 1:cols)\nP.middleCols<cols>(j)              // P(:, j+1:j+cols)\nP.middleCols(j, cols)              // P(:, j+1:j+cols)\nP.rightCols<cols>()                // P(:, end-cols+1:end)\nP.rightCols(cols)                  // P(:, end-cols+1:end)\nP.topRows<rows>()                  // P(1:rows, :)\nP.topRows(rows)                    // P(1:rows, :)\nP.middleRows<rows>(i)              // P(i+1:i+rows, :)\nP.middleRows(i, rows)              // P(i+1:i+rows, :)\nP.bottomRows<rows>()               // P(end-rows+1:end, :)\nP.bottomRows(rows)                 // P(end-rows+1:end, :)\nP.topLeftCorner(rows, cols)        // P(1:rows, 1:cols)\nP.topRightCorner(rows, cols)       // P(1:rows, end-cols+1:end)\nP.bottomLeftCorner(rows, cols)     // P(end-rows+1:end, 1:cols)\nP.bottomRightCorner(rows, cols)    // P(end-rows+1:end, end-cols+1:end)\nP.topLeftCorner<rows,cols>()       // P(1:rows, 1:cols)\nP.topRightCorner<rows,cols>()      // P(1:rows, end-cols+1:end)\nP.bottomLeftCorner<rows,cols>()    // P(end-rows+1:end, 1:cols)\nP.bottomRightCorner<rows,cols>()   // P(end-rows+1:end, end-cols+1:end)\n\n// Of particular note is Eigen's swap function which is highly optimized.\n// Eigen                           // Matlab\nR.row(i) = P.col(j);               // R(i, :) = P(:, i)\nR.col(j1).swap(mat1.col(j2));      // R(:, [j1 j2]) = R(:, [j2, j1])\n\n// Views, transpose, etc; all read-write except for .adjoint().\n// Eigen                           // Matlab\nR.adjoint()                        // R'\nR.transpose()                      // R.' or conj(R')\nR.diagonal()                       // diag(R)\nx.asDiagonal()                     // diag(x)\nR.transpose().colwise().reverse(); // rot90(R)\nR.conjugate()                      // conj(R)\n\n// All the same as Matlab, but matlab doesn't have *= style operators.\n// Matrix-vector.  Matrix-matrix.   Matrix-scalar.\ny  = M*x;          R  = P*Q;        R  = P*s;\na  = b*M;          R  = P - Q;      R  = s*P;\na *= M;            R  = P + Q;      R  = P/s;\n                   R *= Q;          R  = s*P;\n                   R += Q;          R *= s;\n                   R -= Q;          R /= s;\n\n// Vectorized operations on each element independently\n// Eigen                  // Matlab\nR = P.cwiseProduct(Q);    // R = P .* Q\nR = P.array() * s.array();// R = P .* s\nR = P.cwiseQuotient(Q);   // R = P ./ Q\nR = P.array() / Q.array();// R = P ./ Q\nR = P.array() + s.array();// R = P + s\nR = P.array() - s.array();// R = P - s\nR.array() += s;           // R = R + s\nR.array() -= s;           // R = R - s\nR.array() < Q.array();    // R < Q\nR.array() <= Q.array();   // R <= Q\nR.cwiseInverse();         // 1 ./ P\nR.array().inverse();      // 1 ./ P\nR.array().sin()           // sin(P)\nR.array().cos()           // cos(P)\nR.array().pow(s)          // P .^ s\nR.array().square()        // P .^ 2\nR.array().cube()          // P .^ 3\nR.cwiseSqrt()             // sqrt(P)\nR.array().sqrt()          // sqrt(P)\nR.array().exp()           // exp(P)\nR.array().log()           // log(P)\nR.cwiseMax(P)             // max(R, P)\nR.array().max(P.array())  // max(R, P)\nR.cwiseMin(P)             // min(R, P)\nR.array().min(P.array())  // min(R, P)\nR.cwiseAbs()              // abs(P)\nR.array().abs()           // abs(P)\nR.cwiseAbs2()             // abs(P.^2)\nR.array().abs2()          // abs(P.^2)\n(R.array() < s).select(P,Q);  // (R < s ? P : Q)\n\n// Reductions.\nint r, c;\n// Eigen                  // Matlab\nR.minCoeff()              // min(R(:))\nR.maxCoeff()              // max(R(:))\ns = R.minCoeff(&r, &c)    // [s, i] = min(R(:)); [r, c] = ind2sub(size(R), i);\ns = R.maxCoeff(&r, &c)    // [s, i] = max(R(:)); [r, c] = ind2sub(size(R), i);\nR.sum()                   // sum(R(:))\nR.colwise().sum()         // sum(R)\nR.rowwise().sum()         // sum(R, 2) or sum(R')'\nR.prod()                  // prod(R(:))\nR.colwise().prod()        // prod(R)\nR.rowwise().prod()        // prod(R, 2) or prod(R')'\nR.trace()                 // trace(R)\nR.all()                   // all(R(:))\nR.colwise().all()         // all(R)\nR.rowwise().all()         // all(R, 2)\nR.any()                   // any(R(:))\nR.colwise().any()         // any(R)\nR.rowwise().any()         // any(R, 2)\n\n// Dot products, norms, etc.\n// Eigen                  // Matlab\nx.norm()                  // norm(x).    Note that norm(R) doesn't work in Eigen.\nx.squaredNorm()           // dot(x, x)   Note the equivalence is not true for complex\nx.dot(y)                  // dot(x, y)\nx.cross(y)                // cross(x, y) Requires #include <Eigen/Geometry>\n\n//// Type conversion\n// Eigen                           // Matlab\nA.cast<double>();                  // double(A)\nA.cast<float>();                   // single(A)\nA.cast<int>();                     // int32(A)\nA.real();                          // real(A)\nA.imag();                          // imag(A)\n// if the original type equals destination type, no work is done\n\n// Note that for most operations Eigen requires all operands to have the same type:\nMatrixXf F = MatrixXf::Zero(3,3);\nA += F;                // illegal in Eigen. In Matlab A = A+F is allowed\nA += F.cast<double>(); // F converted to double and then added (generally, conversion happens on-the-fly)\n\n// Eigen can map existing memory into Eigen matrices.\nfloat array[3];\nVector3f::Map(array).fill(10);            // create a temporary Map over array and sets entries to 10\nint data[4] = {1, 2, 3, 4};\nMatrix2i mat2x2(data);                    // copies data into mat2x2\nMatrix2i::Map(data) = 2*mat2x2;           // overwrite elements of data with 2*mat2x2\nMatrixXi::Map(data, 2, 2) += mat2x2;      // adds mat2x2 to elements of data (alternative syntax if size is not know at compile time)\n\n// Solve Ax = b. Result stored in x. Matlab: x = A \\ b.\nx = A.ldlt().solve(b));  // A sym. p.s.d.    #include <Eigen/Cholesky>\nx = A.llt() .solve(b));  // A sym. p.d.      #include <Eigen/Cholesky>\nx = A.lu()  .solve(b));  // Stable and fast. #include <Eigen/LU>\nx = A.qr()  .solve(b));  // No pivoting.     #include <Eigen/QR>\nx = A.svd() .solve(b));  // Stable, slowest. #include <Eigen/SVD>\n// .ldlt() -> .matrixL() and .matrixD()\n// .llt()  -> .matrixL()\n// .lu()   -> .matrixL() and .matrixU()\n// .qr()   -> .matrixQ() and .matrixR()\n// .svd()  -> .matrixU(), .singularValues(), and .matrixV()\n\n// Eigenvalue problems\n// Eigen                          // Matlab\nA.eigenvalues();                  // eig(A);\nEigenSolver<Matrix3d> eig(A);     // [vec val] = eig(A)\neig.eigenvalues();                // diag(val)\neig.eigenvectors();               // vec\n// For self-adjoint matrices use SelfAdjointEigenSolver<>\n"
  },
  {
    "path": "libs/eigen/doc/B01_Experimental.dox",
    "content": "namespace Eigen {\n\n/** \\page Experimental Experimental parts of Eigen\n\n\\eigenAutoToc\n\n\\section summary Summary\n\nWith the 2.0 release, Eigen's API is, to a large extent, stable. However, we wish to retain the freedom to make API incompatible changes. To that effect, we call many parts of Eigen \"experimental\" which means that they are not subject to API stability guarantee.\n\nOur goal is that for the 2.1 release (expected in July 2009) most of these parts become API-stable too.\n\nWe are aware that API stability is a major concern for our users. That's why it's a priority for us to reach it, but at the same time we're being serious about not calling Eigen API-stable too early.\n\nExperimental features may at any time:\n\\li be removed;\n\\li be subject to an API incompatible change;\n\\li introduce API or ABI incompatible changes in your own code if you let them affect your API or ABI.\n\n\\section modules Experimental modules\n\nThe following modules are considered entirely experimental, and we make no firm API stability guarantee about them for the time being:\n\\li SVD\n\\li QR\n\\li Cholesky\n\\li Sparse\n\\li Geometry (this one should be mostly stable, but it's a little too early to make a formal guarantee)\n\n\\section core Experimental parts of the Core module\n\nIn the Core module, the only classes subject to ABI stability guarantee (meaning that you can use it for data members in your public ABI) is:\n\\li Matrix\n\\li Map\n\nAll other classes offer no ABI guarantee, e.g. the layout of their data can be changed.\n\nThe only classes subject to (even partial) API stability guarantee (meaning that you can safely construct and use objects) are:\n\\li MatrixBase : partial API stability (see below)\n\\li Matrix : full API stability (except for experimental stuff inherited from MatrixBase)\n\\li Map : full API stability (except for experimental stuff inherited from MatrixBase)\n\nAll other classes offer no direct API guarantee, e.g. their methods can be changed; however notice that most classes inherit MatrixBase and that this is where most of their API comes from -- so in practice most of the API is stable.\n\nA few MatrixBase methods are considered experimental, hence not part of any API stability guarantee:\n\\li all methods documented as internal\n\\li all methods hidden in the Doxygen documentation\n\\li all methods marked as experimental\n\\li all methods defined in experimental modules\n\n*/\n\n}\n"
  },
  {
    "path": "libs/eigen/doc/CMakeLists.txt",
    "content": "project(EigenDoc)\n\nset_directory_properties(PROPERTIES EXCLUDE_FROM_ALL TRUE)\n\nproject(EigenDoc)\n\nif(CMAKE_COMPILER_IS_GNUCXX)\n  if(CMAKE_SYSTEM_NAME MATCHES Linux)\n    set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -O1 -g1\")\n  endif(CMAKE_SYSTEM_NAME MATCHES Linux)\nendif(CMAKE_COMPILER_IS_GNUCXX)\n\n# Set some Doxygen flags\nset(EIGEN_DOXY_PROJECT_NAME             \"Eigen\")\nset(EIGEN_DOXY_OUTPUT_DIRECTORY_SUFFIX  \"\")\nset(EIGEN_DOXY_INPUT                    \"\\\"${Eigen_SOURCE_DIR}/Eigen\\\" \\\"${Eigen_SOURCE_DIR}/doc\\\"\")\nset(EIGEN_DOXY_HTML_COLORSTYLE_HUE      \"220\")\nset(EIGEN_DOXY_TAGFILES                 \"\")\n\nconfigure_file(\n  ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in\n  ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile\n)\n\nset(EIGEN_DOXY_PROJECT_NAME             \"Eigen-unsupported\")\nset(EIGEN_DOXY_OUTPUT_DIRECTORY_SUFFIX  \"/unsupported\")\nset(EIGEN_DOXY_INPUT                    \"\\\"${Eigen_SOURCE_DIR}/unsupported/Eigen\\\" \\\"${Eigen_SOURCE_DIR}/unsupported/doc\\\"\")\nset(EIGEN_DOXY_HTML_COLORSTYLE_HUE      \"0\")\n# set(EIGEN_DOXY_TAGFILES                 \"\\\"${Eigen_BINARY_DIR}/doc/eigen.doxytags =../\\\"\")\nset(EIGEN_DOXY_TAGFILES                 \"\")\n\nconfigure_file(\n  ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in\n  ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile-unsupported\n)\n\nconfigure_file(\n  ${CMAKE_CURRENT_SOURCE_DIR}/eigendoxy_header.html.in\n  ${CMAKE_CURRENT_BINARY_DIR}/eigendoxy_header.html\n)\n\nconfigure_file(\n  ${CMAKE_CURRENT_SOURCE_DIR}/eigendoxy_footer.html.in\n  ${CMAKE_CURRENT_BINARY_DIR}/eigendoxy_footer.html\n)\n\nconfigure_file(\n  ${CMAKE_CURRENT_SOURCE_DIR}/eigendoxy_layout.xml.in\n  ${CMAKE_CURRENT_BINARY_DIR}/eigendoxy_layout.xml\n)\n\nconfigure_file(\n  ${Eigen_SOURCE_DIR}/unsupported/doc/eigendoxy_layout.xml.in\n  ${Eigen_BINARY_DIR}/doc/unsupported/eigendoxy_layout.xml\n)\n\nset(examples_targets \"\")\nset(snippets_targets \"\")\n\nadd_definitions(\"-DEIGEN_MAKING_DOCS\")\nadd_custom_target(all_examples)\n\nadd_subdirectory(examples)\nadd_subdirectory(special_examples)\nadd_subdirectory(snippets)\n\nadd_custom_target(\n  doc-eigen-prerequisites\n  ALL\n  COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/html/\n  COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/eigen_navtree_hacks.js           ${CMAKE_CURRENT_BINARY_DIR}/html/\n  COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/Eigen_Silly_Professor_64x64.png  ${CMAKE_CURRENT_BINARY_DIR}/html/\n  COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/AsciiQuickReference.txt          ${CMAKE_CURRENT_BINARY_DIR}/html/\n  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}\n)\n\nadd_custom_target(\n  doc-unsupported-prerequisites\n  ALL\n  COMMAND ${CMAKE_COMMAND} -E make_directory ${Eigen_BINARY_DIR}/doc/html/unsupported\n  COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/eigen_navtree_hacks.js           ${CMAKE_CURRENT_BINARY_DIR}/html/unsupported/\n  COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/Eigen_Silly_Professor_64x64.png  ${CMAKE_CURRENT_BINARY_DIR}/html/unsupported/\n  WORKING_DIRECTORY ${Eigen_BINARY_DIR}/doc\n)\n\nadd_dependencies(doc-eigen-prerequisites all_snippets all_examples)\nadd_dependencies(doc-unsupported-prerequisites unsupported_snippets unsupported_examples)\n\nadd_custom_target(doc ALL\n  COMMAND doxygen\n  COMMAND doxygen Doxyfile-unsupported\n  COMMAND ${CMAKE_COMMAND} -E copy ${Eigen_BINARY_DIR}/doc/html/group__TopicUnalignedArrayAssert.html ${Eigen_BINARY_DIR}/doc/html/TopicUnalignedArrayAssert.html\n  COMMAND ${CMAKE_COMMAND} -E rename html eigen-doc\n  COMMAND ${CMAKE_COMMAND} -E remove eigen-doc/eigen-doc.tgz\n  COMMAND ${CMAKE_COMMAND} -E tar cfz eigen-doc.tgz eigen-doc\n  COMMAND ${CMAKE_COMMAND} -E rename eigen-doc.tgz eigen-doc/eigen-doc.tgz\n  COMMAND ${CMAKE_COMMAND} -E rename eigen-doc html\n  WORKING_DIRECTORY ${Eigen_BINARY_DIR}/doc)\n\nadd_dependencies(doc doc-eigen-prerequisites doc-unsupported-prerequisites)\n"
  },
  {
    "path": "libs/eigen/doc/ClassHierarchy.dox",
    "content": "namespace Eigen {\n\n/** \\page TopicClassHierarchy The class hierarchy\n\nThis page explains the design of the core classes in Eigen's class hierarchy and how they fit together. Casual\nusers probably need not concern themselves with these details, but it may be useful for both advanced users\nand Eigen developers.\n\n\\eigenAutoToc\n\n\n\\section TopicClassHierarchyPrinciples Principles\n\nEigen's class hierarchy is designed so that virtual functions are avoided where their overhead would\nsignificantly impair performance. Instead, Eigen achieves polymorphism with the Curiously Recurring Template\nPattern (CRTP). In this pattern, the base class (for instance, \\c MatrixBase) is in fact a template class, and\nthe derived class (for instance, \\c Matrix) inherits the base class with the derived class itself as a\ntemplate argument (in this case, \\c Matrix inherits from \\c MatrixBase&lt;Matrix&gt;). This allows Eigen to\nresolve the polymorphic function calls at compile time.\n\nIn addition, the design avoids multiple inheritance. One reason for this is that in our experience, some\ncompilers (like MSVC) fail to perform empty base class optimization, which is crucial for our fixed-size\ntypes.\n\n\n\\section TopicClassHierarchyCoreClasses The core classes\n\nThese are the classes that you need to know about if you want to write functions that accept or return Eigen\nobjects.\n\n  - Matrix means plain dense matrix. If \\c m is a \\c %Matrix, then, for instance, \\c m+m is no longer a \n    \\c %Matrix, it is a \"matrix expression\".\n  - MatrixBase means dense matrix expression. This means that a \\c %MatrixBase is something that can be\n    added, matrix-multiplied, LU-decomposed, QR-decomposed... All matrix expression classes, including \n    \\c %Matrix itself, inherit \\c %MatrixBase.\n  - Array means plain dense array. If \\c x is an \\c %Array, then, for instance, \\c x+x is no longer an \n    \\c %Array, it is an \"array expression\".\n  - ArrayBase means dense array expression. This means that an \\c %ArrayBase is something that can be\n    added, array-multiplied, and on which you can perform all sorts of array operations... All array\n    expression classes, including \\c %Array itself, inherit \\c %ArrayBase.\n  - DenseBase means dense (matrix or array) expression. Both \\c %ArrayBase and \\c %MatrixBase inherit\n    \\c %DenseBase. \\c %DenseBase is where all the methods go that apply to dense expressions regardless of\n    whether they are matrix or array expressions. For example, the \\link DenseBase::block() block(...) \\endlink\n    methods are in \\c %DenseBase.\n\n\\section TopicClassHierarchyBaseClasses Base classes\n\nThese classes serve as base classes for the five core classes mentioned above. They are more internal and so\nless interesting for users of the Eigen library.\n\n  - PlainObjectBase means dense (matrix or array) plain object, i.e. something that stores its own dense\n    array of coefficients. This is where, for instance, the \\link PlainObjectBase::resize() resize() \\endlink\n    methods go. \\c %PlainObjectBase is inherited by \\c %Matrix and by \\c %Array. But above, we said that \n    \\c %Matrix inherits \\c %MatrixBase and \\c %Array inherits \\c %ArrayBase. So does that mean multiple\n    inheritance? No, because \\c %PlainObjectBase \\e itself inherits \\c %MatrixBase or \\c %ArrayBase depending\n    on whether we are in the matrix or array case. When we said above that \\c %Matrix inherited \n    \\c %MatrixBase, we omitted to say it does so indirectly via \\c %PlainObjectBase. Same for \\c %Array.\n  - DenseCoeffsBase means something that has dense coefficient accessors. It is a base class for\n    \\c %DenseBase. The reason for \\c %DenseCoeffsBase to exist is that the set of available coefficient\n    accessors is very different depending on whether a dense expression has direct memory access or not (the\n    \\c DirectAccessBit flag). For example, if \\c x is a plain matrix, then \\c x has direct access, and \n    \\c x.transpose() and \\c x.block(...) also have direct access, because their coefficients can be read right\n    off memory, but for example, \\c x+x does not have direct memory access, because obtaining any of its\n    coefficients requires a computation (an addition), it can't be just read off memory.\n  - EigenBase means anything that can be evaluated into a plain dense matrix or array (even if that would\n    be a bad idea). \\c %EigenBase is really the absolute base class for anything that remotely looks like a\n    matrix or array. It is a base class for \\c %DenseCoeffsBase, so it sits below all our dense class\n    hierarchy, but it is not limited to dense expressions. For example, \\c %EigenBase is also inherited by\n    diagonal matrices, sparse matrices, etc...\n\n\n\\section TopicClassHierarchyInheritanceDiagrams Inheritance diagrams\n\nThe inheritance diagram for Matrix looks as follows:\n\n<pre>\nEigenBase&lt;%Matrix&gt;\n  <-- DenseCoeffsBase&lt;%Matrix&gt;    (direct access case)\n    <-- DenseBase&lt;%Matrix&gt;\n      <-- MatrixBase&lt;%Matrix&gt;\n        <-- PlainObjectBase&lt;%Matrix&gt;    (matrix case)\n          <-- Matrix\n</pre>\n\nThe inheritance diagram for Array looks as follows:\n\n<pre>\nEigenBase&lt;%Array&gt;\n  <-- DenseCoeffsBase&lt;%Array&gt;    (direct access case)\n    <-- DenseBase&lt;%Array&gt;\n      <-- ArrayBase&lt;%Array&gt;\n        <-- PlainObjectBase&lt;%Array&gt;    (array case)\n          <-- Array\n</pre>\n\nThe inheritance diagram for some other matrix expression class, here denoted by \\c SomeMatrixXpr, looks as\nfollows:\n\n<pre>\nEigenBase&lt;SomeMatrixXpr&gt;\n  <-- DenseCoeffsBase&lt;SomeMatrixXpr&gt;    (direct access or no direct access case)\n    <-- DenseBase&lt;SomeMatrixXpr&gt;\n      <-- MatrixBase&lt;SomeMatrixXpr&gt;\n        <-- SomeMatrixXpr\n</pre>\n\nThe inheritance diagram for some other array expression class, here denoted by \\c SomeArrayXpr, looks as\nfollows:\n\n<pre>\nEigenBase&lt;SomeArrayXpr&gt;\n  <-- DenseCoeffsBase&lt;SomeArrayXpr&gt;    (direct access or no direct access case)\n    <-- DenseBase&lt;SomeArrayXpr&gt;\n      <-- ArrayBase&lt;SomeArrayXpr&gt;\n        <-- SomeArrayXpr\n</pre>\n\nFinally, consider an example of something that is not a dense expression, for instance a diagonal matrix. The\ncorresponding inheritance diagram is:\n\n<pre>\nEigenBase&lt;%DiagonalMatrix&gt;\n  <-- DiagonalBase&lt;%DiagonalMatrix&gt;\n    <-- DiagonalMatrix\n</pre>\n\n\n*/\n}\n"
  },
  {
    "path": "libs/eigen/doc/CustomizingEigen.dox",
    "content": "namespace Eigen {\n\n/** \\page TopicCustomizingEigen Customizing/Extending Eigen\n\nEigen can be extended in several ways, for instance, by defining global methods, \\ref ExtendingMatrixBase \"by adding custom methods to MatrixBase\", adding support to \\ref CustomScalarType \"custom types\" etc.\n\n\\eigenAutoToc\n\n\\section ExtendingMatrixBase Extending MatrixBase (and other classes)\n\nIn this section we will see how to add custom methods to MatrixBase. Since all expressions and matrix types inherit MatrixBase, adding a method to MatrixBase make it immediately available to all expressions ! A typical use case is, for instance, to make Eigen compatible with another API.\n\nYou certainly know that in C++ it is not possible to add methods to an existing class. So how that's possible ? Here the trick is to include in the declaration of MatrixBase a file defined by the preprocessor token \\c EIGEN_MATRIXBASE_PLUGIN:\n\\code\nclass MatrixBase {\n  // ...\n  #ifdef EIGEN_MATRIXBASE_PLUGIN\n  #include EIGEN_MATRIXBASE_PLUGIN\n  #endif\n};\n\\endcode\nTherefore to extend MatrixBase with your own methods you just have to create a file with your method declaration and define EIGEN_MATRIXBASE_PLUGIN before you include any Eigen's header file.\n\nYou can extend many of the other classes used in Eigen by defining similarly named preprocessor symbols. For instance, define \\c EIGEN_ARRAYBASE_PLUGIN if you want to extend the ArrayBase class. A full list of classes that can be extended in this way and the corresponding preprocessor symbols can be found on our page \\ref TopicPreprocessorDirectives.\n\nHere is an example of an extension file for adding methods to MatrixBase: \\n\n\\b MatrixBaseAddons.h\n\\code\ninline Scalar at(uint i, uint j) const { return this->operator()(i,j); }\ninline Scalar& at(uint i, uint j) { return this->operator()(i,j); }\ninline Scalar at(uint i) const { return this->operator[](i); }\ninline Scalar& at(uint i) { return this->operator[](i); }\n\ninline RealScalar squaredLength() const { return squaredNorm(); }\ninline RealScalar length() const { return norm(); }\ninline RealScalar invLength(void) const { return fast_inv_sqrt(squaredNorm()); }\n\ntemplate<typename OtherDerived>\ninline Scalar squaredDistanceTo(const MatrixBase<OtherDerived>& other) const\n{ return (derived() - other.derived()).squaredNorm(); }\n\ntemplate<typename OtherDerived>\ninline RealScalar distanceTo(const MatrixBase<OtherDerived>& other) const\n{ return internal::sqrt(derived().squaredDistanceTo(other)); }\n\ninline void scaleTo(RealScalar l) { RealScalar vl = norm(); if (vl>1e-9) derived() *= (l/vl); }\n\ninline Transpose<Derived> transposed() {return this->transpose();}\ninline const Transpose<Derived> transposed() const {return this->transpose();}\n\ninline uint minComponentId(void) const  { int i; this->minCoeff(&i); return i; }\ninline uint maxComponentId(void) const  { int i; this->maxCoeff(&i); return i; }\n\ntemplate<typename OtherDerived>\nvoid makeFloor(const MatrixBase<OtherDerived>& other) { derived() = derived().cwiseMin(other.derived()); }\ntemplate<typename OtherDerived>\nvoid makeCeil(const MatrixBase<OtherDerived>& other) { derived() = derived().cwiseMax(other.derived()); }\n\nconst CwiseUnaryOp<internal::scalar_add_op<Scalar>, Derived>\noperator+(const Scalar& scalar) const\n{ return CwiseUnaryOp<internal::scalar_add_op<Scalar>, Derived>(derived(), internal::scalar_add_op<Scalar>(scalar)); }\n\nfriend const CwiseUnaryOp<internal::scalar_add_op<Scalar>, Derived>\noperator+(const Scalar& scalar, const MatrixBase<Derived>& mat)\n{ return CwiseUnaryOp<internal::scalar_add_op<Scalar>, Derived>(mat.derived(), internal::scalar_add_op<Scalar>(scalar)); }\n\\endcode\n\nThen one can the following declaration in the config.h or whatever prerequisites header file of his project:\n\\code\n#define EIGEN_MATRIXBASE_PLUGIN \"MatrixBaseAddons.h\"\n\\endcode\n\n\\section InheritingFromMatrix Inheriting from Matrix\n\nBefore inheriting from Matrix, be really, i mean REALLY sure that using\nEIGEN_MATRIX_PLUGIN is not what you really want (see previous section).\nIf you just need to add few members to Matrix, this is the way to go.\n\nAn example of when you actually need to inherit Matrix, is when you have\nseveral layers of heritage such as  MyVerySpecificVector1,MyVerySpecificVector1 -> MyVector1 -> Matrix and.\nMyVerySpecificVector3,MyVerySpecificVector4 -> MyVector2 -> Matrix.\n\nIn order for your object to work within the %Eigen framework, you need to\ndefine a few members in your inherited class.\n\nHere is a minimalistic example:\\n\n\\code\nclass MyVectorType : public  Eigen::VectorXd\n{\npublic:\n    MyVectorType(void):Eigen::VectorXd() {}\n\n    typedef Eigen::VectorXd Base;\n\n    // This constructor allows you to construct MyVectorType from Eigen expressions\n    template<typename OtherDerived>\n    MyVectorType(const Eigen::MatrixBase<OtherDerived>& other)\n        : Eigen::Vector3d(other)\n    { }\n\n    // This method allows you to assign Eigen expressions to MyVectorType\n    template<typename OtherDerived>\n    MyVectorType & operator= (const Eigen::MatrixBase <OtherDerived>& other)\n    {\n        this->Base::operator=(other);\n        return *this;\n    }\n};\n\\endcode\n\nThis is the kind of error you can get if you don't provide those methods\n\\code\nerror: no match for ‘operator=’ in ‘delta =\n(((Eigen::MatrixBase<Eigen::Matrix<std::complex<float>, 10000, 1, 2, 10000,\n1> >*)(& delta)) + 8u)->Eigen::MatrixBase<Derived>::cwise [with Derived =\nEigen::Matrix<std::complex<float>, 10000, 1, 2, 10000,\n1>]().Eigen::Cwise<ExpressionType>::operator* [with OtherDerived =\nEigen::Matrix<std::complex<float>, 10000, 1, 2, 10000, 1>, ExpressionType =\nEigen::Matrix<std::complex<float>, 10000, 1, 2, 10000, 1>](((const\nEigen::MatrixBase<Eigen::Matrix<std::complex<float>, 10000, 1, 2, 10000, 1>\n>&)(((const Eigen::MatrixBase<Eigen::Matrix<std::complex<float>, 10000, 1,\n>2, 10000, 1> >*)((const spectral1d*)where)) + 8u)))’                                                    \n\\endcode\n\n\\anchor user_defined_scalars \\section CustomScalarType Using custom scalar types\n\nBy default, Eigen currently supports standard floating-point types (\\c float, \\c double, \\c std::complex<float>, \\c std::complex<double>, \\c long \\c double), as well as all native integer types (e.g., \\c int, \\c unsigned \\c int, \\c short, etc.), and \\c bool.\nOn x86-64 systems, \\c long \\c double permits to locally enforces the use of x87 registers with extended accuracy (in comparison to SSE).\n\nIn order to add support for a custom type \\c T you need:\n-# make sure the common operator (+,-,*,/,etc.) are supported by the type \\c T\n-# add a specialization of struct Eigen::NumTraits<T> (see \\ref NumTraits)\n-# define the math functions that makes sense for your type. This includes standard ones like sqrt, pow, sin, tan, conj, real, imag, etc, as well as abs2 which is Eigen specific.\n     (see the file Eigen/src/Core/MathFunctions.h)\n\nThe math function should be defined in the same namespace than \\c T, or in the \\c std namespace though that second approach is not recommended.\n\nHere is a concrete example adding support for the Adolc's \\c adouble type. <a href=\"https://projects.coin-or.org/ADOL-C\">Adolc</a> is an automatic differentiation library. The type \\c adouble is basically a real value tracking the values of any number of partial derivatives.\n\n\\code\n#ifndef ADOLCSUPPORT_H\n#define ADOLCSUPPORT_H\n\n#define ADOLC_TAPELESS\n#include <adolc/adouble.h>\n#include <Eigen/Core>\n\nnamespace Eigen {\n\ntemplate<> struct NumTraits<adtl::adouble>\n : NumTraits<double> // permits to get the epsilon, dummy_precision, lowest, highest functions\n{\n  typedef adtl::adouble Real;\n  typedef adtl::adouble NonInteger;\n  typedef adtl::adouble Nested;\n\n  enum {\n    IsComplex = 0,\n    IsInteger = 0,\n    IsSigned = 1,\n    RequireInitialization = 1,\n    ReadCost = 1,\n    AddCost = 3,\n    MulCost = 3\n  };\n};\n\n}\n\nnamespace adtl {\n\ninline const adouble& conj(const adouble& x)  { return x; }\ninline const adouble& real(const adouble& x)  { return x; }\ninline adouble imag(const adouble&)    { return 0.; }\ninline adouble abs(const adouble&  x)  { return fabs(x); }\ninline adouble abs2(const adouble& x)  { return x*x; }\n\n}\n\n#endif // ADOLCSUPPORT_H\n\\endcode\n\n\n\\sa \\ref TopicPreprocessorDirectives\n\n*/\n\n}\n"
  },
  {
    "path": "libs/eigen/doc/Doxyfile.in",
    "content": "# Doxyfile 1.8.1.1\n\n# This file describes the settings to be used by the documentation system\n# doxygen (www.doxygen.org) for a project.\n#\n# All text after a hash (#) is considered a comment and will be ignored.\n# The format is:\n#       TAG = value [value, ...]\n# For lists items can also be appended using:\n#       TAG += value [value, ...]\n# Values that contain spaces should be placed between quotes (\" \").\n\n#---------------------------------------------------------------------------\n# Project related configuration options\n#---------------------------------------------------------------------------\n\n# This tag specifies the encoding used for all characters in the config file\n# that follow. The default is UTF-8 which is also the encoding used for all\n# text before the first occurrence of this tag. Doxygen uses libiconv (or the\n# iconv built into libc) for the transcoding. See\n# http://www.gnu.org/software/libiconv for the list of possible encodings.\n\nDOXYFILE_ENCODING      = UTF-8\n\n# The PROJECT_NAME tag is a single word (or sequence of words) that should\n# identify the project. Note that if you do not use Doxywizard you need\n# to put quotes around the project name if it contains spaces.\n\nPROJECT_NAME           = ${EIGEN_DOXY_PROJECT_NAME}\n\n# The PROJECT_NUMBER tag can be used to enter a project or revision number.\n# This could be handy for archiving the generated documentation or\n# if some version control system is used.\n\n# EIGEN_VERSION is set in the root CMakeLists.txt\n\nPROJECT_NUMBER         = \"${EIGEN_VERSION}\"\n\n# Using the PROJECT_BRIEF tag one can provide an optional one line description\n# for a project that appears at the top of each page and should give viewer\n# a quick idea about the purpose of the project. Keep the description short.\n\nPROJECT_BRIEF          =\n\n# With the PROJECT_LOGO tag one can specify an logo or icon that is\n# included in the documentation. The maximum height of the logo should not\n# exceed 55 pixels and the maximum width should not exceed 200 pixels.\n# Doxygen will copy the logo to the output directory.\n\nPROJECT_LOGO           = \"${Eigen_SOURCE_DIR}/doc/Eigen_Silly_Professor_64x64.png\"\n\n# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)\n# base path where the generated documentation will be put.\n# If a relative path is entered, it will be relative to the location\n# where doxygen was started. If left blank the current directory will be used.\n\nOUTPUT_DIRECTORY       = \"${Eigen_BINARY_DIR}/doc${EIGEN_DOXY_OUTPUT_DIRECTORY_SUFFIX}\"\n\n# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create\n# 4096 sub-directories (in 2 levels) under the output directory of each output\n# format and will distribute the generated files over these directories.\n# Enabling this option can be useful when feeding doxygen a huge amount of\n# source files, where putting all generated files in the same directory would\n# otherwise cause performance problems for the file system.\n\nCREATE_SUBDIRS         = NO\n\n# The OUTPUT_LANGUAGE tag is used to specify the language in which all\n# documentation generated by doxygen is written. Doxygen will use this\n# information to generate all constant output in the proper language.\n# The default language is English, other supported languages are:\n# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,\n# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,\n# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English\n# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian,\n# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak,\n# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.\n\nOUTPUT_LANGUAGE        = English\n\n# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will\n# include brief member descriptions after the members that are listed in\n# the file and class documentation (similar to JavaDoc).\n# Set to NO to disable this.\n\nBRIEF_MEMBER_DESC      = YES\n\n# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend\n# the brief description of a member or function before the detailed description.\n# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the\n# brief descriptions will be completely suppressed.\n\nREPEAT_BRIEF           = YES\n\n# This tag implements a quasi-intelligent brief description abbreviator\n# that is used to form the text in various listings. Each string\n# in this list, if found as the leading text of the brief description, will be\n# stripped from the text and the result after processing the whole list, is\n# used as the annotated text. Otherwise, the brief description is used as-is.\n# If left blank, the following values are used (\"$name\" is automatically\n# replaced with the name of the entity): \"The $name class\" \"The $name widget\"\n# \"The $name file\" \"is\" \"provides\" \"specifies\" \"contains\"\n# \"represents\" \"a\" \"an\" \"the\"\n\nABBREVIATE_BRIEF       = \"The $name class\" \\\n                         \"The $name widget\" \\\n                         \"The $name file\" \\\n                         is \\\n                         provides \\\n                         specifies \\\n                         contains \\\n                         represents \\\n                         a \\\n                         an \\\n                         the\n\n# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then\n# Doxygen will generate a detailed section even if there is only a brief\n# description.\n\nALWAYS_DETAILED_SEC    = NO\n\n# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all\n# inherited members of a class in the documentation of that class as if those\n# members were ordinary class members. Constructors, destructors and assignment\n# operators of the base classes will not be shown.\n\nINLINE_INHERITED_MEMB  = YES\n\n# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full\n# path before files name in the file list and in the header files. If set\n# to NO the shortest path that makes the file name unique will be used.\n\nFULL_PATH_NAMES        = NO\n\n# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag\n# can be used to strip a user-defined part of the path. Stripping is\n# only done if one of the specified strings matches the left-hand part of\n# the path. The tag can be used to show relative paths in the file list.\n# If left blank the directory from which doxygen is run is used as the\n# path to strip.\n\nSTRIP_FROM_PATH        =\n\n# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of\n# the path mentioned in the documentation of a class, which tells\n# the reader which header file to include in order to use a class.\n# If left blank only the name of the header file containing the class\n# definition is used. Otherwise one should specify the include paths that\n# are normally passed to the compiler using the -I flag.\n\nSTRIP_FROM_INC_PATH    =\n\n# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter\n# (but less readable) file names. This can be useful if your file system\n# doesn't support long names like on DOS, Mac, or CD-ROM.\n\nSHORT_NAMES            = NO\n\n# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen\n# will interpret the first line (until the first dot) of a JavaDoc-style\n# comment as the brief description. If set to NO, the JavaDoc\n# comments will behave just like regular Qt-style comments\n# (thus requiring an explicit @brief command for a brief description.)\n\nJAVADOC_AUTOBRIEF      = NO\n\n# If the QT_AUTOBRIEF tag is set to YES then Doxygen will\n# interpret the first line (until the first dot) of a Qt-style\n# comment as the brief description. If set to NO, the comments\n# will behave just like regular Qt-style comments (thus requiring\n# an explicit \\brief command for a brief description.)\n\nQT_AUTOBRIEF           = NO\n\n# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen\n# treat a multi-line C++ special comment block (i.e. a block of //! or ///\n# comments) as a brief description. This used to be the default behaviour.\n# The new default is to treat a multi-line C++ comment block as a detailed\n# description. Set this tag to YES if you prefer the old behaviour instead.\n\nMULTILINE_CPP_IS_BRIEF = NO\n\n# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented\n# member inherits the documentation from any documented member that it\n# re-implements.\n\nINHERIT_DOCS           = YES\n\n# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce\n# a new page for each member. If set to NO, the documentation of a member will\n# be part of the file/class/namespace that contains it.\n\nSEPARATE_MEMBER_PAGES  = NO\n\n# The TAB_SIZE tag can be used to set the number of spaces in a tab.\n# Doxygen uses this value to replace tabs by spaces in code fragments.\n\nTAB_SIZE               = 8\n\n# This tag can be used to specify a number of aliases that acts\n# as commands in the documentation. An alias has the form \"name=value\".\n# For example adding \"sideeffect=\\par Side Effects:\\n\" will allow you to\n# put the command \\sideeffect (or @sideeffect) in the documentation, which\n# will result in a user-defined paragraph with heading \"Side Effects:\".\n# You can put \\n's in the value part of an alias to insert newlines.\n\nALIASES                = \"only_for_vectors=This is only for vectors (either row-vectors or column-vectors), i.e. matrices which are known at compile-time to have either one row or one column.\" \\\n                         \"array_module=This is defined in the %Array module. \\code #include <Eigen/Array> \\endcode\" \\\n                         \"cholesky_module=This is defined in the %Cholesky module. \\code #include <Eigen/Cholesky> \\endcode\" \\\n                         \"eigenvalues_module=This is defined in the %Eigenvalues module. \\code #include <Eigen/Eigenvalues> \\endcode\" \\\n                         \"geometry_module=This is defined in the %Geometry module. \\code #include <Eigen/Geometry> \\endcode\" \\\n                         \"householder_module=This is defined in the %Householder module. \\code #include <Eigen/Householder> \\endcode\" \\\n                         \"jacobi_module=This is defined in the %Jacobi module. \\code #include <Eigen/Jacobi> \\endcode\" \\\n                         \"lu_module=This is defined in the %LU module. \\code #include <Eigen/LU> \\endcode\" \\\n                         \"qr_module=This is defined in the %QR module. \\code #include <Eigen/QR> \\endcode\" \\\n                         \"svd_module=This is defined in the %SVD module. \\code #include <Eigen/SVD> \\endcode\" \\\n                         \"label=\\bug\" \\\n                         \"matrixworld=<a href='#matrixonly' style='color:green;text-decoration: none;'>*</a>\" \\\n                         \"arrayworld=<a href='#arrayonly' style='color:blue;text-decoration: none;'>*</a>\" \\\n                         \"note_about_arbitrary_choice_of_solution=If there exists more than one solution, this method will arbitrarily choose one.\" \\\n                         \"note_about_using_kernel_to_study_multiple_solutions=If you need a complete analysis of the space of solutions, take the one solution obtained by this method and add to it elements of the kernel, as determined by kernel().\" \\\n                         \"note_about_checking_solutions=This method just tries to find as good a solution as possible. If you want to check whether a solution exists or if it is accurate, just call this function to get a result and then compute the error of this result, or use MatrixBase::isApprox() directly, for instance like this: \\code bool a_solution_exists = (A*result).isApprox(b, precision); \\endcode This method avoids dividing by zero, so that the non-existence of a solution doesn't by itself mean that you'll get \\c inf or \\c nan values.\" \\\n                         \"note_try_to_help_rvo=This function returns the result by value. In order to make that efficient, it is implemented as just a return statement using a special constructor, hopefully allowing the compiler to perform a RVO (return value optimization).\" \\\n                         \"nonstableyet=\\warning This is not considered to be part of the stable public API yet. Changes may happen in future releases. See \\ref Experimental \\\"Experimental parts of Eigen\\\"\"\n\nALIASES += \"eigenAutoToc=  \"\nALIASES += \"eigenManualPage=\\defgroup\"\n\n# This tag can be used to specify a number of word-keyword mappings (TCL only).\n# A mapping has the form \"name=value\". For example adding\n# \"class=itcl::class\" will allow you to use the command class in the\n# itcl::class meaning.\n\nTCL_SUBST              =\n\n# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C\n# sources only. Doxygen will then generate output that is more tailored for C.\n# For instance, some of the names that are used will be different. The list\n# of all members will be omitted, etc.\n\nOPTIMIZE_OUTPUT_FOR_C  = NO\n\n# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java\n# sources only. Doxygen will then generate output that is more tailored for\n# Java. For instance, namespaces will be presented as packages, qualified\n# scopes will look different, etc.\n\nOPTIMIZE_OUTPUT_JAVA   = NO\n\n# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran\n# sources only. Doxygen will then generate output that is more tailored for\n# Fortran.\n\nOPTIMIZE_FOR_FORTRAN   = NO\n\n# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL\n# sources. Doxygen will then generate output that is tailored for\n# VHDL.\n\nOPTIMIZE_OUTPUT_VHDL   = NO\n\n# Doxygen selects the parser to use depending on the extension of the files it\n# parses. With this tag you can assign which parser to use for a given extension.\n# Doxygen has a built-in mapping, but you can override or extend it using this\n# tag. The format is ext=language, where ext is a file extension, and language\n# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C,\n# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make\n# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C\n# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions\n# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen.\n\nEXTENSION_MAPPING      =\n\n# If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all\n# comments according to the Markdown format, which allows for more readable\n# documentation. See http://daringfireball.net/projects/markdown/ for details.\n# The output of markdown processing is further processed by doxygen, so you\n# can mix doxygen, HTML, and XML commands with Markdown formatting.\n# Disable only in case of backward compatibilities issues.\n\nMARKDOWN_SUPPORT       = YES\n\n# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want\n# to include (a tag file for) the STL sources as input, then you should\n# set this tag to YES in order to let doxygen match functions declarations and\n# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.\n# func(std::string) {}). This also makes the inheritance and collaboration\n# diagrams that involve STL classes more complete and accurate.\n\nBUILTIN_STL_SUPPORT    = NO\n\n# If you use Microsoft's C++/CLI language, you should set this option to YES to\n# enable parsing support.\n\nCPP_CLI_SUPPORT        = NO\n\n# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.\n# Doxygen will parse them like normal C++ but will assume all classes use public\n# instead of private inheritance when no explicit protection keyword is present.\n\nSIP_SUPPORT            = NO\n\n# For Microsoft's IDL there are propget and propput attributes to indicate getter\n# and setter methods for a property. Setting this option to YES (the default)\n# will make doxygen replace the get and set methods by a property in the\n# documentation. This will only work if the methods are indeed getting or\n# setting a simple type. If this is not the case, or you want to show the\n# methods anyway, you should set this option to NO.\n\nIDL_PROPERTY_SUPPORT   = YES\n\n# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC\n# tag is set to YES, then doxygen will reuse the documentation of the first\n# member in the group (if any) for the other members of the group. By default\n# all members of a group must be documented explicitly.\n\nDISTRIBUTE_GROUP_DOC   = YES\n\n# Set the SUBGROUPING tag to YES (the default) to allow class member groups of\n# the same type (for instance a group of public functions) to be put as a\n# subgroup of that type (e.g. under the Public Functions section). Set it to\n# NO to prevent subgrouping. Alternatively, this can be done per class using\n# the \\nosubgrouping command.\n\nSUBGROUPING            = YES\n\n# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and\n# unions are shown inside the group in which they are included (e.g. using\n# @ingroup) instead of on a separate page (for HTML and Man pages) or\n# section (for LaTeX and RTF).\n\nINLINE_GROUPED_CLASSES = NO\n\n# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and\n# unions with only public data fields will be shown inline in the documentation\n# of the scope in which they are defined (i.e. file, namespace, or group\n# documentation), provided this scope is documented. If set to NO (the default),\n# structs, classes, and unions are shown on a separate page (for HTML and Man\n# pages) or section (for LaTeX and RTF).\n\nINLINE_SIMPLE_STRUCTS  = NO\n\n# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum\n# is documented as struct, union, or enum with the name of the typedef. So\n# typedef struct TypeS {} TypeT, will appear in the documentation as a struct\n# with name TypeT. When disabled the typedef will appear as a member of a file,\n# namespace, or class. And the struct will be named TypeS. This can typically\n# be useful for C code in case the coding convention dictates that all compound\n# types are typedef'ed and only the typedef is referenced, never the tag name.\n\nTYPEDEF_HIDES_STRUCT   = NO\n\n# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to\n# determine which symbols to keep in memory and which to flush to disk.\n# When the cache is full, less often used symbols will be written to disk.\n# For small to medium size projects (<1000 input files) the default value is\n# probably good enough. For larger projects a too small cache size can cause\n# doxygen to be busy swapping symbols to and from disk most of the time\n# causing a significant performance penalty.\n# If the system has enough physical memory increasing the cache will improve the\n# performance by keeping more symbols in memory. Note that the value works on\n# a logarithmic scale so increasing the size by one will roughly double the\n# memory usage. The cache size is given by this formula:\n# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,\n# corresponding to a cache size of 2^16 = 65536 symbols.\n\n# SYMBOL_CACHE_SIZE      = 0\n\n# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be\n# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given\n# their name and scope. Since this can be an expensive process and often the\n# same symbol appear multiple times in the code, doxygen keeps a cache of\n# pre-resolved symbols. If the cache is too small doxygen will become slower.\n# If the cache is too large, memory is wasted. The cache size is given by this\n# formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0,\n# corresponding to a cache size of 2^16 = 65536 symbols.\n\nLOOKUP_CACHE_SIZE      = 0\n\n#---------------------------------------------------------------------------\n# Build related configuration options\n#---------------------------------------------------------------------------\n\n# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in\n# documentation are documented, even if no documentation was available.\n# Private class members and static file members will be hidden unless\n# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES\n\nEXTRACT_ALL            = NO\n\n# If the EXTRACT_PRIVATE tag is set to YES all private members of a class\n# will be included in the documentation.\n\nEXTRACT_PRIVATE        = NO\n\n# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal scope will be included in the documentation.\n\nEXTRACT_PACKAGE        = NO\n\n# If the EXTRACT_STATIC tag is set to YES all static members of a file\n# will be included in the documentation.\n\nEXTRACT_STATIC         = NO\n\n# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)\n# defined locally in source files will be included in the documentation.\n# If set to NO only classes defined in header files are included.\n\nEXTRACT_LOCAL_CLASSES  = NO\n\n# This flag is only useful for Objective-C code. When set to YES local\n# methods, which are defined in the implementation section but not in\n# the interface are included in the documentation.\n# If set to NO (the default) only methods in the interface are included.\n\nEXTRACT_LOCAL_METHODS  = NO\n\n# If this flag is set to YES, the members of anonymous namespaces will be\n# extracted and appear in the documentation as a namespace called\n# 'anonymous_namespace{file}', where file will be replaced with the base\n# name of the file that contains the anonymous namespace. By default\n# anonymous namespaces are hidden.\n\nEXTRACT_ANON_NSPACES   = NO\n\n# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all\n# undocumented members of documented classes, files or namespaces.\n# If set to NO (the default) these members will be included in the\n# various overviews, but no documentation section is generated.\n# This option has no effect if EXTRACT_ALL is enabled.\n\nHIDE_UNDOC_MEMBERS     = YES\n\n# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all\n# undocumented classes that are normally visible in the class hierarchy.\n# If set to NO (the default) these classes will be included in the various\n# overviews. This option has no effect if EXTRACT_ALL is enabled.\n\nHIDE_UNDOC_CLASSES     = YES\n\n# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all\n# friend (class|struct|union) declarations.\n# If set to NO (the default) these declarations will be included in the\n# documentation.\n\nHIDE_FRIEND_COMPOUNDS  = YES\n\n# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any\n# documentation blocks found inside the body of a function.\n# If set to NO (the default) these blocks will be appended to the\n# function's detailed documentation block.\n\nHIDE_IN_BODY_DOCS      = NO\n\n# The INTERNAL_DOCS tag determines if documentation\n# that is typed after a \\internal command is included. If the tag is set\n# to NO (the default) then the documentation will be excluded.\n# Set it to YES to include the internal documentation.\n\nINTERNAL_DOCS          = NO\n\n# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate\n# file names in lower-case letters. If set to YES upper-case letters are also\n# allowed. This is useful if you have classes or files whose names only differ\n# in case and if your file system supports case sensitive file names. Windows\n# and Mac users are advised to set this option to NO.\n\nCASE_SENSE_NAMES       = YES\n\n# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen\n# will show members with their full class and namespace scopes in the\n# documentation. If set to YES the scope will be hidden.\n\nHIDE_SCOPE_NAMES       = YES\n\n# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen\n# will put a list of the files that are included by a file in the documentation\n# of that file.\n\nSHOW_INCLUDE_FILES     = NO\n\n# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen\n# will list include files with double quotes in the documentation\n# rather than with sharp brackets.\n\nFORCE_LOCAL_INCLUDES   = NO\n\n# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]\n# is inserted in the documentation for inline members.\n\nINLINE_INFO            = YES\n\n# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen\n# will sort the (detailed) documentation of file and class members\n# alphabetically by member name. If set to NO the members will appear in\n# declaration order.\n\nSORT_MEMBER_DOCS       = YES\n\n# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the\n# brief documentation of file, namespace and class members alphabetically\n# by member name. If set to NO (the default) the members will appear in\n# declaration order.\n\nSORT_BRIEF_DOCS        = YES\n\n# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen\n# will sort the (brief and detailed) documentation of class members so that\n# constructors and destructors are listed first. If set to NO (the default)\n# the constructors will appear in the respective orders defined by\n# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS.\n# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO\n# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.\n\nSORT_MEMBERS_CTORS_1ST = NO\n\n# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the\n# hierarchy of group names into alphabetical order. If set to NO (the default)\n# the group names will appear in their defined order.\n\nSORT_GROUP_NAMES       = NO\n\n# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be\n# sorted by fully-qualified names, including namespaces. If set to\n# NO (the default), the class list will be sorted only by class name,\n# not including the namespace part.\n# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.\n# Note: This option applies only to the class list, not to the\n# alphabetical list.\n\nSORT_BY_SCOPE_NAME     = NO\n\n# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to\n# do proper type resolution of all parameters of a function it will reject a\n# match between the prototype and the implementation of a member function even\n# if there is only one candidate or it is obvious which candidate to choose\n# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen\n# will still accept a match between prototype and implementation in such cases.\n\nSTRICT_PROTO_MATCHING  = NO\n\n# The GENERATE_TODOLIST tag can be used to enable (YES) or\n# disable (NO) the todo list. This list is created by putting \\todo\n# commands in the documentation.\n\nGENERATE_TODOLIST      = NO\n\n# The GENERATE_TESTLIST tag can be used to enable (YES) or\n# disable (NO) the test list. This list is created by putting \\test\n# commands in the documentation.\n\nGENERATE_TESTLIST      = NO\n\n# The GENERATE_BUGLIST tag can be used to enable (YES) or\n# disable (NO) the bug list. This list is created by putting \\bug\n# commands in the documentation.\n\nGENERATE_BUGLIST       = NO\n\n# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or\n# disable (NO) the deprecated list. This list is created by putting\n# \\deprecated commands in the documentation.\n\nGENERATE_DEPRECATEDLIST= YES\n\n# The ENABLED_SECTIONS tag can be used to enable conditional\n# documentation sections, marked by \\if sectionname ... \\endif.\n\nENABLED_SECTIONS       =\n\n# The MAX_INITIALIZER_LINES tag determines the maximum number of lines\n# the initial value of a variable or macro consists of for it to appear in\n# the documentation. If the initializer consists of more lines than specified\n# here it will be hidden. Use a value of 0 to hide initializers completely.\n# The appearance of the initializer of individual variables and macros in the\n# documentation can be controlled using \\showinitializer or \\hideinitializer\n# command in the documentation regardless of this setting.\n\nMAX_INITIALIZER_LINES  = 0\n\n# Set the SHOW_USED_FILES tag to NO to disable the list of files generated\n# at the bottom of the documentation of classes and structs. If set to YES the\n# list will mention the files that were used to generate the documentation.\n\nSHOW_USED_FILES        = YES\n\n# Set the SHOW_FILES tag to NO to disable the generation of the Files page.\n# This will remove the Files entry from the Quick Index and from the\n# Folder Tree View (if specified). The default is YES.\n\nSHOW_FILES             = YES\n\n# Set the SHOW_NAMESPACES tag to NO to disable the generation of the\n# Namespaces page.\n# This will remove the Namespaces entry from the Quick Index\n# and from the Folder Tree View (if specified). The default is YES.\n\nSHOW_NAMESPACES        = NO\n\n# The FILE_VERSION_FILTER tag can be used to specify a program or script that\n# doxygen should invoke to get the current version for each file (typically from\n# the version control system). Doxygen will invoke the program by executing (via\n# popen()) the command <command> <input-file>, where <command> is the value of\n# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file\n# provided by doxygen. Whatever the program writes to standard output\n# is used as the file version. See the manual for examples.\n\nFILE_VERSION_FILTER    =\n\n# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed\n# by doxygen. The layout file controls the global structure of the generated\n# output files in an output format independent way. To create the layout file\n# that represents doxygen's defaults, run doxygen with the -l option.\n# You can optionally specify a file name after the option, if omitted\n# DoxygenLayout.xml will be used as the name of the layout file.\n\nLAYOUT_FILE            = \"${Eigen_BINARY_DIR}/doc${EIGEN_DOXY_OUTPUT_DIRECTORY_SUFFIX}/eigendoxy_layout.xml\"\n\n# The CITE_BIB_FILES tag can be used to specify one or more bib files\n# containing the references data. This must be a list of .bib files. The\n# .bib extension is automatically appended if omitted. Using this command\n# requires the bibtex tool to be installed. See also\n# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style\n# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this\n# feature you need bibtex and perl available in the search path.\n\nCITE_BIB_FILES         =\n\n#---------------------------------------------------------------------------\n# configuration options related to warning and progress messages\n#---------------------------------------------------------------------------\n\n# The QUIET tag can be used to turn on/off the messages that are generated\n# by doxygen. Possible values are YES and NO. If left blank NO is used.\n\nQUIET                  = NO\n\n# The WARNINGS tag can be used to turn on/off the warning messages that are\n# generated by doxygen. Possible values are YES and NO. If left blank\n# NO is used.\n\nWARNINGS               = YES\n\n# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings\n# for undocumented members. If EXTRACT_ALL is set to YES then this flag will\n# automatically be disabled.\n\nWARN_IF_UNDOCUMENTED   = NO\n\n# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for\n# potential errors in the documentation, such as not documenting some\n# parameters in a documented function, or documenting parameters that\n# don't exist or using markup commands wrongly.\n\nWARN_IF_DOC_ERROR      = YES\n\n# The WARN_NO_PARAMDOC option can be enabled to get warnings for\n# functions that are documented, but have no documentation for their parameters\n# or return value. If set to NO (the default) doxygen will only warn about\n# wrong or incomplete parameter documentation, but not about the absence of\n# documentation.\n\nWARN_NO_PARAMDOC       = NO\n\n# The WARN_FORMAT tag determines the format of the warning messages that\n# doxygen can produce. The string should contain the $file, $line, and $text\n# tags, which will be replaced by the file and line number from which the\n# warning originated and the warning text. Optionally the format may contain\n# $version, which will be replaced by the version of the file (if it could\n# be obtained via FILE_VERSION_FILTER)\n\nWARN_FORMAT            = \"$file:$line: $text\"\n\n# The WARN_LOGFILE tag can be used to specify a file to which warning\n# and error messages should be written. If left blank the output is written\n# to stderr.\n\nWARN_LOGFILE           =\n\n#---------------------------------------------------------------------------\n# configuration options related to the input files\n#---------------------------------------------------------------------------\n\n# The INPUT tag can be used to specify the files and/or directories that contain\n# documented source files. You may enter file names like \"myfile.cpp\" or\n# directories like \"/usr/src/myproject\". Separate the files or directories\n# with spaces.\n\nINPUT                  = ${EIGEN_DOXY_INPUT}\n\n# This tag can be used to specify the character encoding of the source files\n# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is\n# also the default input encoding. Doxygen uses libiconv (or the iconv built\n# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for\n# the list of possible encodings.\n\nINPUT_ENCODING         = UTF-8\n\n# If the value of the INPUT tag contains directories, you can use the\n# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp\n# and *.h) to filter out the source-files in the directories. If left\n# blank the following patterns are tested:\n# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh\n# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py\n# *.f90 *.f *.for *.vhd *.vhdl\n\nFILE_PATTERNS          = *\n\n# The RECURSIVE tag can be used to turn specify whether or not subdirectories\n# should be searched for input files as well. Possible values are YES and NO.\n# If left blank NO is used.\n\nRECURSIVE              = YES\n\n# The EXCLUDE tag can be used to specify files and/or directories that should be\n# excluded from the INPUT source files. This way you can easily exclude a\n# subdirectory from a directory tree whose root is specified with the INPUT tag.\n# Note that relative paths are relative to the directory from which doxygen is\n# run.\n\nEXCLUDE                = \"${Eigen_SOURCE_DIR}/Eigen/Eigen2Support\" \\\n                         \"${Eigen_SOURCE_DIR}/Eigen/src/Eigen2Support\" \\\n                         \"${Eigen_SOURCE_DIR}/doc/examples\" \\\n                         \"${Eigen_SOURCE_DIR}/doc/special_examples\" \\\n                         \"${Eigen_SOURCE_DIR}/doc/snippets\" \\\n                         \"${Eigen_SOURCE_DIR}/unsupported/doc/examples\" \\\n                         \"${Eigen_SOURCE_DIR}/unsupported/doc/snippets\"\n\n# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or\n# directories that are symbolic links (a Unix file system feature) are excluded\n# from the input.\n\nEXCLUDE_SYMLINKS       = NO\n\n# If the value of the INPUT tag contains directories, you can use the\n# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude\n# certain files from those directories. Note that the wildcards are matched\n# against the file with absolute path, so to exclude all test directories\n# for example use the pattern */test/*\n\nEXCLUDE_PATTERNS       = CMake* \\\n                         *.txt \\\n                         *.sh \\\n                         *.orig \\\n                         *.diff \\\n                         diff \\\n                         *~ \\\n                         *. \\\n                         *.sln \\\n                         *.sdf \\\n                         *.tmp \\\n                         *.vcxproj \\\n                         *.filters \\\n                         *.user \\\n                         *.suo\n\n# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names\n# (namespaces, classes, functions, etc.) that should be excluded from the\n# output. The symbol name can be a fully qualified name, a word, or if the\n# wildcard * is used, a substring. Examples: ANamespace, AClass,\n# AClass::ANamespace, ANamespace::*Test\n\nEXCLUDE_SYMBOLS        = internal::* \\\n                         Flagged* \\\n                         *InnerIterator* \\\n                         DenseStorage<* \\\n                         \n\n# The EXAMPLE_PATH tag can be used to specify one or more files or\n# directories that contain example code fragments that are included (see\n# the \\include command).\n\nEXAMPLE_PATH           = \"${Eigen_SOURCE_DIR}/doc/snippets\" \\\n                         \"${Eigen_BINARY_DIR}/doc/snippets\" \\\n                         \"${Eigen_SOURCE_DIR}/doc/examples\" \\\n                         \"${Eigen_BINARY_DIR}/doc/examples\" \\\n                         \"${Eigen_SOURCE_DIR}/doc/special_examples\" \\\n                         \"${Eigen_BINARY_DIR}/doc/special_examples\" \\\n                         \"${Eigen_SOURCE_DIR}/unsupported/doc/snippets\" \\\n                         \"${Eigen_BINARY_DIR}/unsupported/doc/snippets\" \\\n                         \"${Eigen_SOURCE_DIR}/unsupported/doc/examples\" \\\n                         \"${Eigen_BINARY_DIR}/unsupported/doc/examples\"\n\n# If the value of the EXAMPLE_PATH tag contains directories, you can use the\n# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp\n# and *.h) to filter out the source-files in the directories. If left\n# blank all files are included.\n\nEXAMPLE_PATTERNS       = *\n\n# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be\n# searched for input files to be used with the \\include or \\dontinclude\n# commands irrespective of the value of the RECURSIVE tag.\n# Possible values are YES and NO. If left blank NO is used.\n\nEXAMPLE_RECURSIVE      = NO\n\n# The IMAGE_PATH tag can be used to specify one or more files or\n# directories that contain image that are included in the documentation (see\n# the \\image command).\n\nIMAGE_PATH             =\n\n# The INPUT_FILTER tag can be used to specify a program that doxygen should\n# invoke to filter for each input file. Doxygen will invoke the filter program\n# by executing (via popen()) the command <filter> <input-file>, where <filter>\n# is the value of the INPUT_FILTER tag, and <input-file> is the name of an\n# input file. Doxygen will then use the output that the filter program writes\n# to standard output.\n# If FILTER_PATTERNS is specified, this tag will be\n# ignored.\n\nINPUT_FILTER           =\n\n# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern\n# basis.\n# Doxygen will compare the file name with each pattern and apply the\n# filter if there is a match.\n# The filters are a list of the form:\n# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further\n# info on how filters are used. If FILTER_PATTERNS is empty or if\n# non of the patterns match the file name, INPUT_FILTER is applied.\n\nFILTER_PATTERNS        =\n\n# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using\n# INPUT_FILTER) will be used to filter the input files when producing source\n# files to browse (i.e. when SOURCE_BROWSER is set to YES).\n\nFILTER_SOURCE_FILES    = NO\n\n# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file\n# pattern. A pattern will override the setting for FILTER_PATTERN (if any)\n# and it is also possible to disable source filtering for a specific pattern\n# using *.ext= (so without naming a filter). This option only has effect when\n# FILTER_SOURCE_FILES is enabled.\n\nFILTER_SOURCE_PATTERNS =\n\n#---------------------------------------------------------------------------\n# configuration options related to source browsing\n#---------------------------------------------------------------------------\n\n# If the SOURCE_BROWSER tag is set to YES then a list of source files will\n# be generated. Documented entities will be cross-referenced with these sources.\n# Note: To get rid of all source code in the generated output, make sure also\n# VERBATIM_HEADERS is set to NO.\n\nSOURCE_BROWSER         = NO\n\n# Setting the INLINE_SOURCES tag to YES will include the body\n# of functions and classes directly in the documentation.\n\nINLINE_SOURCES         = NO\n\n# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct\n# doxygen to hide any special comment blocks from generated source code\n# fragments. Normal C, C++ and Fortran comments will always remain visible.\n\nSTRIP_CODE_COMMENTS    = YES\n\n# If the REFERENCED_BY_RELATION tag is set to YES\n# then for each documented function all documented\n# functions referencing it will be listed.\n\nREFERENCED_BY_RELATION = YES\n\n# If the REFERENCES_RELATION tag is set to YES\n# then for each documented function all documented entities\n# called/used by that function will be listed.\n\nREFERENCES_RELATION    = YES\n\n# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)\n# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from\n# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will\n# link to the source code.\n# Otherwise they will link to the documentation.\n\nREFERENCES_LINK_SOURCE = YES\n\n# If the USE_HTAGS tag is set to YES then the references to source code\n# will point to the HTML generated by the htags(1) tool instead of doxygen\n# built-in source browser. The htags tool is part of GNU's global source\n# tagging system (see http://www.gnu.org/software/global/global.html). You\n# will need version 4.8.6 or higher.\n\nUSE_HTAGS              = NO\n\n# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen\n# will generate a verbatim copy of the header file for each class for\n# which an include is specified. Set to NO to disable this.\n\nVERBATIM_HEADERS       = YES\n\n#---------------------------------------------------------------------------\n# configuration options related to the alphabetical class index\n#---------------------------------------------------------------------------\n\n# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index\n# of all compounds will be generated. Enable this if the project\n# contains a lot of classes, structs, unions or interfaces.\n\nALPHABETICAL_INDEX     = NO\n\n# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then\n# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns\n# in which this list will be split (can be a number in the range [1..20])\n\nCOLS_IN_ALPHA_INDEX    = 5\n\n# In case all classes in a project start with a common prefix, all\n# classes will be put under the same header in the alphabetical index.\n# The IGNORE_PREFIX tag can be used to specify one or more prefixes that\n# should be ignored while generating the index headers.\n\nIGNORE_PREFIX          =\n\n#---------------------------------------------------------------------------\n# configuration options related to the HTML output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_HTML tag is set to YES (the default) Doxygen will\n# generate HTML output.\n\nGENERATE_HTML          = YES\n\n# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `html' will be used as the default path.\n\nHTML_OUTPUT            = \"${Eigen_BINARY_DIR}/doc/html${EIGEN_DOXY_OUTPUT_DIRECTORY_SUFFIX}\"\n\n# The HTML_FILE_EXTENSION tag can be used to specify the file extension for\n# each generated HTML page (for example: .htm,.php,.asp). If it is left blank\n# doxygen will generate files with .html extension.\n\nHTML_FILE_EXTENSION    = .html\n\n# The HTML_HEADER tag can be used to specify a personal HTML header for\n# each generated HTML page. If it is left blank doxygen will generate a\n# standard header. Note that when using a custom header you are responsible\n#  for the proper inclusion of any scripts and style sheets that doxygen\n# needs, which is dependent on the configuration options used.\n# It is advised to generate a default header using \"doxygen -w html\n# header.html footer.html stylesheet.css YourConfigFile\" and then modify\n# that header. Note that the header is subject to change so you typically\n# have to redo this when upgrading to a newer version of doxygen or when\n# changing the value of configuration settings such as GENERATE_TREEVIEW!\n\nHTML_HEADER            = \"${Eigen_BINARY_DIR}/doc/eigendoxy_header.html\"\n\n# The HTML_FOOTER tag can be used to specify a personal HTML footer for\n# each generated HTML page. If it is left blank doxygen will generate a\n# standard footer.\n\nHTML_FOOTER            = \"${Eigen_BINARY_DIR}/doc/eigendoxy_footer.html\"\n\n# The HTML_STYLESHEET tag can be used to specify a user-defined cascading\n# style sheet that is used by each HTML page. It can be used to\n# fine-tune the look of the HTML output. If the tag is left blank doxygen\n# will generate a default style sheet. Note that doxygen will try to copy\n# the style sheet file to the HTML output directory, so don't put your own\n# style sheet in the HTML output directory as well, or it will be erased!\n\nHTML_STYLESHEET        = \n\n# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or\n# other source files which should be copied to the HTML output directory. Note\n# that these files will be copied to the base HTML output directory. Use the\n# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these\n# files. In the HTML_STYLESHEET file, use the file name only. Also note that\n# the files will be copied as-is; there are no commands or markers available.\n\nHTML_EXTRA_FILES       = \"${Eigen_SOURCE_DIR}/doc/eigendoxy.css\"\n\n# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output.\n# Doxygen will adjust the colors in the style sheet and background images\n# according to this color. Hue is specified as an angle on a colorwheel,\n# see http://en.wikipedia.org/wiki/Hue for more information.\n# For instance the value 0 represents red, 60 is yellow, 120 is green,\n# 180 is cyan, 240 is blue, 300 purple, and 360 is red again.\n# The allowed range is 0 to 359.\n# The default is 220.\n\nHTML_COLORSTYLE_HUE    = ${EIGEN_DOXY_HTML_COLORSTYLE_HUE}\n\n# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of\n# the colors in the HTML output. For a value of 0 the output will use\n# grayscales only. A value of 255 will produce the most vivid colors.\n\nHTML_COLORSTYLE_SAT    = 100\n\n# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to\n# the luminance component of the colors in the HTML output. Values below\n# 100 gradually make the output lighter, whereas values above 100 make\n# the output darker. The value divided by 100 is the actual gamma applied,\n# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2,\n# and 100 does not change the gamma.\n\nHTML_COLORSTYLE_GAMMA  = 80\n\n# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML\n# page will contain the date and time when the page was generated. Setting\n# this to NO can help when comparing the output of multiple runs.\n\nHTML_TIMESTAMP         = YES\n\n# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML\n# documentation will contain sections that can be hidden and shown after the\n# page has loaded.\n\nHTML_DYNAMIC_SECTIONS  = YES\n\n# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of\n# entries shown in the various tree structured indices initially; the user\n# can expand and collapse entries dynamically later on. Doxygen will expand\n# the tree to such a level that at most the specified number of entries are\n# visible (unless a fully collapsed tree already exceeds this amount).\n# So setting the number of entries 1 will produce a full collapsed tree by\n# default. 0 is a special value representing an infinite number of entries\n# and will result in a full expanded tree by default.\n\nHTML_INDEX_NUM_ENTRIES = 100\n\n# If the GENERATE_DOCSET tag is set to YES, additional index files\n# will be generated that can be used as input for Apple's Xcode 3\n# integrated development environment, introduced with OSX 10.5 (Leopard).\n# To create a documentation set, doxygen will generate a Makefile in the\n# HTML output directory. Running make will produce the docset in that\n# directory and running \"make install\" will install the docset in\n# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find\n# it at startup.\n# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html\n# for more information.\n\nGENERATE_DOCSET        = NO\n\n# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the\n# feed. A documentation feed provides an umbrella under which multiple\n# documentation sets from a single provider (such as a company or product suite)\n# can be grouped.\n\nDOCSET_FEEDNAME        = \"Doxygen generated docs\"\n\n# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that\n# should uniquely identify the documentation set bundle. This should be a\n# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen\n# will append .docset to the name.\n\nDOCSET_BUNDLE_ID       = org.doxygen.Project\n\n# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify\n# the documentation publisher. This should be a reverse domain-name style\n# string, e.g. com.mycompany.MyDocSet.documentation.\n\nDOCSET_PUBLISHER_ID    = org.doxygen.Publisher\n\n# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.\n\nDOCSET_PUBLISHER_NAME  = Publisher\n\n# If the GENERATE_HTMLHELP tag is set to YES, additional index files\n# will be generated that can be used as input for tools like the\n# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)\n# of the generated HTML documentation.\n\nGENERATE_HTMLHELP      = NO\n\n# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can\n# be used to specify the file name of the resulting .chm file. You\n# can add a path in front of the file if the result should not be\n# written to the html output directory.\n\nCHM_FILE               =\n\n# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can\n# be used to specify the location (absolute path including file name) of\n# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run\n# the HTML help compiler on the generated index.hhp.\n\nHHC_LOCATION           =\n\n# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag\n# controls if a separate .chi index file is generated (YES) or that\n# it should be included in the master .chm file (NO).\n\nGENERATE_CHI           = NO\n\n# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING\n# is used to encode HtmlHelp index (hhk), content (hhc) and project file\n# content.\n\nCHM_INDEX_ENCODING     =\n\n# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag\n# controls whether a binary table of contents is generated (YES) or a\n# normal table of contents (NO) in the .chm file.\n\nBINARY_TOC             = NO\n\n# The TOC_EXPAND flag can be set to YES to add extra items for group members\n# to the contents of the HTML help documentation and to the tree view.\n\nTOC_EXPAND             = NO\n\n# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and\n# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated\n# that can be used as input for Qt's qhelpgenerator to generate a\n# Qt Compressed Help (.qch) of the generated HTML documentation.\n\nGENERATE_QHP           = NO\n\n# If the QHG_LOCATION tag is specified, the QCH_FILE tag can\n# be used to specify the file name of the resulting .qch file.\n# The path specified is relative to the HTML output folder.\n\nQCH_FILE               =\n\n# The QHP_NAMESPACE tag specifies the namespace to use when generating\n# Qt Help Project output. For more information please see\n# http://doc.trolltech.com/qthelpproject.html#namespace\n\nQHP_NAMESPACE          = org.doxygen.Project\n\n# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating\n# Qt Help Project output. For more information please see\n# http://doc.trolltech.com/qthelpproject.html#virtual-folders\n\nQHP_VIRTUAL_FOLDER     = doc\n\n# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to\n# add. For more information please see\n# http://doc.trolltech.com/qthelpproject.html#custom-filters\n\nQHP_CUST_FILTER_NAME   =\n\n# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the\n# custom filter to add. For more information please see\n# <a href=\"http://doc.trolltech.com/qthelpproject.html#custom-filters\">\n# Qt Help Project / Custom Filters</a>.\n\nQHP_CUST_FILTER_ATTRS  =\n\n# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this\n# project's\n# filter section matches.\n# <a href=\"http://doc.trolltech.com/qthelpproject.html#filter-attributes\">\n# Qt Help Project / Filter Attributes</a>.\n\nQHP_SECT_FILTER_ATTRS  =\n\n# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can\n# be used to specify the location of Qt's qhelpgenerator.\n# If non-empty doxygen will try to run qhelpgenerator on the generated\n# .qhp file.\n\nQHG_LOCATION           =\n\n# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files\n#  will be generated, which together with the HTML files, form an Eclipse help\n# plugin. To install this plugin and make it available under the help contents\n# menu in Eclipse, the contents of the directory containing the HTML and XML\n# files needs to be copied into the plugins directory of eclipse. The name of\n# the directory within the plugins directory should be the same as\n# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before\n# the help appears.\n\nGENERATE_ECLIPSEHELP   = NO\n\n# A unique identifier for the eclipse help plugin. When installing the plugin\n# the directory name containing the HTML and XML files should also have\n# this name.\n\nECLIPSE_DOC_ID         = org.doxygen.Project\n\n# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs)\n# at top of each HTML page. The value NO (the default) enables the index and\n# the value YES disables it. Since the tabs have the same information as the\n# navigation tree you can set this option to NO if you already set\n# GENERATE_TREEVIEW to YES.\n\nDISABLE_INDEX          = YES\n\n# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index\n# structure should be generated to display hierarchical information.\n# If the tag value is set to YES, a side panel will be generated\n# containing a tree-like index structure (just like the one that\n# is generated for HTML Help). For this to work a browser that supports\n# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).\n# Windows users are probably better off using the HTML help feature.\n# Since the tree basically has the same information as the tab index you\n# could consider to set DISABLE_INDEX to NO when enabling this option.\n\nGENERATE_TREEVIEW      = YES\n\n# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values\n# (range [0,1..20]) that doxygen will group on one line in the generated HTML\n# documentation. Note that a value of 0 will completely suppress the enum\n# values from appearing in the overview section.\n\nENUM_VALUES_PER_LINE   = 1\n\n# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be\n# used to set the initial width (in pixels) of the frame in which the tree\n# is shown.\n\nTREEVIEW_WIDTH         = 250\n\n# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open\n# links to external symbols imported via tag files in a separate window.\n\nEXT_LINKS_IN_WINDOW    = NO\n\n# Use this tag to change the font size of Latex formulas included\n# as images in the HTML documentation. The default is 10. Note that\n# when you change the font size after a successful doxygen run you need\n# to manually remove any form_*.png images from the HTML output directory\n# to force them to be regenerated.\n\nFORMULA_FONTSIZE       = 12\n\n# Use the FORMULA_TRANPARENT tag to determine whether or not the images\n# generated for formulas are transparent PNGs. Transparent PNGs are\n# not supported properly for IE 6.0, but are supported on all modern browsers.\n# Note that when changing this option you need to delete any form_*.png files\n# in the HTML output before the changes have effect.\n\nFORMULA_TRANSPARENT    = YES\n\n# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax\n# (see http://www.mathjax.org) which uses client side Javascript for the\n# rendering instead of using prerendered bitmaps. Use this if you do not\n# have LaTeX installed or if you want to formulas look prettier in the HTML\n# output. When enabled you may also need to install MathJax separately and\n# configure the path to it using the MATHJAX_RELPATH option.\n\nUSE_MATHJAX            = NO\n\n# When MathJax is enabled you need to specify the location relative to the\n# HTML output directory using the MATHJAX_RELPATH option. The destination\n# directory should contain the MathJax.js script. For instance, if the mathjax\n# directory is located at the same level as the HTML output directory, then\n# MATHJAX_RELPATH should be ../mathjax. The default value points to\n# the MathJax Content Delivery Network so you can quickly see the result without\n# installing MathJax.\n# However, it is strongly recommended to install a local\n# copy of MathJax from http://www.mathjax.org before deployment.\n\nMATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest\n\n# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension\n# names that should be enabled during MathJax rendering.\n\nMATHJAX_EXTENSIONS     =\n\n# When the SEARCHENGINE tag is enabled doxygen will generate a search box\n# for the HTML output. The underlying search engine uses javascript\n# and DHTML and should work on any modern browser. Note that when using\n# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets\n# (GENERATE_DOCSET) there is already a search function so this one should\n# typically be disabled. For large projects the javascript based search engine\n# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.\n\nSEARCHENGINE           = YES\n\n# When the SERVER_BASED_SEARCH tag is enabled the search engine will be\n# implemented using a PHP enabled web server instead of at the web client\n# using Javascript. Doxygen will generate the search PHP script and index\n# file to put on the web server. The advantage of the server\n# based approach is that it scales better to large projects and allows\n# full text search. The disadvantages are that it is more difficult to setup\n# and does not have live searching capabilities.\n\nSERVER_BASED_SEARCH    = NO\n\n#---------------------------------------------------------------------------\n# configuration options related to the LaTeX output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will\n# generate Latex output.\n\nGENERATE_LATEX         = NO\n\n# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `latex' will be used as the default path.\n\nLATEX_OUTPUT           = latex\n\n# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be\n# invoked. If left blank `latex' will be used as the default command name.\n# Note that when enabling USE_PDFLATEX this option is only used for\n# generating bitmaps for formulas in the HTML output, but not in the\n# Makefile that is written to the output directory.\n\nLATEX_CMD_NAME         = latex\n\n# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to\n# generate index for LaTeX. If left blank `makeindex' will be used as the\n# default command name.\n\nMAKEINDEX_CMD_NAME     = makeindex\n\n# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact\n# LaTeX documents. This may be useful for small projects and may help to\n# save some trees in general.\n\nCOMPACT_LATEX          = NO\n\n# The PAPER_TYPE tag can be used to set the paper type that is used\n# by the printer. Possible values are: a4, letter, legal and\n# executive. If left blank a4wide will be used.\n\nPAPER_TYPE             = a4wide\n\n# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX\n# packages that should be included in the LaTeX output.\n\nEXTRA_PACKAGES         = amssymb \\\n                         amsmath\n\n# The LATEX_HEADER tag can be used to specify a personal LaTeX header for\n# the generated latex document. The header should contain everything until\n# the first chapter. If it is left blank doxygen will generate a\n# standard header. Notice: only use this tag if you know what you are doing!\n\nLATEX_HEADER           =\n\n# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for\n# the generated latex document. The footer should contain everything after\n# the last chapter. If it is left blank doxygen will generate a\n# standard footer. Notice: only use this tag if you know what you are doing!\n\nLATEX_FOOTER           =\n\n# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated\n# is prepared for conversion to pdf (using ps2pdf). The pdf file will\n# contain links (just like the HTML output) instead of page references\n# This makes the output suitable for online browsing using a pdf viewer.\n\nPDF_HYPERLINKS         = NO\n\n# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of\n# plain latex in the generated Makefile. Set this option to YES to get a\n# higher quality PDF documentation.\n\nUSE_PDFLATEX           = NO\n\n# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\\\batchmode.\n# command to the generated LaTeX files. This will instruct LaTeX to keep\n# running if errors occur, instead of asking the user for help.\n# This option is also used when generating formulas in HTML.\n\nLATEX_BATCHMODE        = NO\n\n# If LATEX_HIDE_INDICES is set to YES then doxygen will not\n# include the index chapters (such as File Index, Compound Index, etc.)\n# in the output.\n\nLATEX_HIDE_INDICES     = NO\n\n# If LATEX_SOURCE_CODE is set to YES then doxygen will include\n# source code with syntax highlighting in the LaTeX output.\n# Note that which sources are shown also depends on other settings\n# such as SOURCE_BROWSER.\n\nLATEX_SOURCE_CODE      = NO\n\n# The LATEX_BIB_STYLE tag can be used to specify the style to use for the\n# bibliography, e.g. plainnat, or ieeetr. The default style is \"plain\". See\n# http://en.wikipedia.org/wiki/BibTeX for more info.\n\nLATEX_BIB_STYLE        = plain\n\n#---------------------------------------------------------------------------\n# configuration options related to the RTF output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output\n# The RTF output is optimized for Word 97 and may not look very pretty with\n# other RTF readers or editors.\n\nGENERATE_RTF           = NO\n\n# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `rtf' will be used as the default path.\n\nRTF_OUTPUT             = rtf\n\n# If the COMPACT_RTF tag is set to YES Doxygen generates more compact\n# RTF documents. This may be useful for small projects and may help to\n# save some trees in general.\n\nCOMPACT_RTF            = NO\n\n# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated\n# will contain hyperlink fields. The RTF file will\n# contain links (just like the HTML output) instead of page references.\n# This makes the output suitable for online browsing using WORD or other\n# programs which support those fields.\n# Note: wordpad (write) and others do not support links.\n\nRTF_HYPERLINKS         = NO\n\n# Load style sheet definitions from file. Syntax is similar to doxygen's\n# config file, i.e. a series of assignments. You only have to provide\n# replacements, missing definitions are set to their default value.\n\nRTF_STYLESHEET_FILE    =\n\n# Set optional variables used in the generation of an rtf document.\n# Syntax is similar to doxygen's config file.\n\nRTF_EXTENSIONS_FILE    =\n\n#---------------------------------------------------------------------------\n# configuration options related to the man page output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_MAN tag is set to YES (the default) Doxygen will\n# generate man pages\n\nGENERATE_MAN           = NO\n\n# The MAN_OUTPUT tag is used to specify where the man pages will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `man' will be used as the default path.\n\nMAN_OUTPUT             = man\n\n# The MAN_EXTENSION tag determines the extension that is added to\n# the generated man pages (default is the subroutine's section .3)\n\nMAN_EXTENSION          = .3\n\n# If the MAN_LINKS tag is set to YES and Doxygen generates man output,\n# then it will generate one additional man file for each entity\n# documented in the real man page(s). These additional files\n# only source the real man page, but without them the man command\n# would be unable to find the correct page. The default is NO.\n\nMAN_LINKS              = NO\n\n#---------------------------------------------------------------------------\n# configuration options related to the XML output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_XML tag is set to YES Doxygen will\n# generate an XML file that captures the structure of\n# the code including all documentation.\n\nGENERATE_XML           = NO\n\n# The XML_OUTPUT tag is used to specify where the XML pages will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `xml' will be used as the default path.\n\nXML_OUTPUT             = xml\n\n# The XML_SCHEMA tag can be used to specify an XML schema,\n# which can be used by a validating XML parser to check the\n# syntax of the XML files.\n\n# XML_SCHEMA             =\n\n# The XML_DTD tag can be used to specify an XML DTD,\n# which can be used by a validating XML parser to check the\n# syntax of the XML files.\n\n# XML_DTD                =\n\n# If the XML_PROGRAMLISTING tag is set to YES Doxygen will\n# dump the program listings (including syntax highlighting\n# and cross-referencing information) to the XML output. Note that\n# enabling this will significantly increase the size of the XML output.\n\nXML_PROGRAMLISTING     = YES\n\n#---------------------------------------------------------------------------\n# configuration options for the AutoGen Definitions output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will\n# generate an AutoGen Definitions (see autogen.sf.net) file\n# that captures the structure of the code including all\n# documentation. Note that this feature is still experimental\n# and incomplete at the moment.\n\nGENERATE_AUTOGEN_DEF   = NO\n\n#---------------------------------------------------------------------------\n# configuration options related to the Perl module output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_PERLMOD tag is set to YES Doxygen will\n# generate a Perl module file that captures the structure of\n# the code including all documentation. Note that this\n# feature is still experimental and incomplete at the\n# moment.\n\nGENERATE_PERLMOD       = NO\n\n# If the PERLMOD_LATEX tag is set to YES Doxygen will generate\n# the necessary Makefile rules, Perl scripts and LaTeX code to be able\n# to generate PDF and DVI output from the Perl module output.\n\nPERLMOD_LATEX          = NO\n\n# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be\n# nicely formatted so it can be parsed by a human reader.\n# This is useful\n# if you want to understand what is going on.\n# On the other hand, if this\n# tag is set to NO the size of the Perl module output will be much smaller\n# and Perl will parse it just the same.\n\nPERLMOD_PRETTY         = YES\n\n# The names of the make variables in the generated doxyrules.make file\n# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.\n# This is useful so different doxyrules.make files included by the same\n# Makefile don't overwrite each other's variables.\n\nPERLMOD_MAKEVAR_PREFIX =\n\n#---------------------------------------------------------------------------\n# Configuration options related to the preprocessor\n#---------------------------------------------------------------------------\n\n# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will\n# evaluate all C-preprocessor directives found in the sources and include\n# files.\n\nENABLE_PREPROCESSING   = YES\n\n# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro\n# names in the source code. If set to NO (the default) only conditional\n# compilation will be performed. Macro expansion can be done in a controlled\n# way by setting EXPAND_ONLY_PREDEF to YES.\n\nMACRO_EXPANSION        = YES\n\n# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES\n# then the macro expansion is limited to the macros specified with the\n# PREDEFINED and EXPAND_AS_DEFINED tags.\n\nEXPAND_ONLY_PREDEF     = YES\n\n# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files\n# pointed to by INCLUDE_PATH will be searched when a #include is found.\n\nSEARCH_INCLUDES        = YES\n\n# The INCLUDE_PATH tag can be used to specify one or more directories that\n# contain include files that are not input files but should be processed by\n# the preprocessor.\n\nINCLUDE_PATH           = \"${Eigen_SOURCE_DIR}/Eigen/src/plugins\"\n\n# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard\n# patterns (like *.h and *.hpp) to filter out the header-files in the\n# directories. If left blank, the patterns specified with FILE_PATTERNS will\n# be used.\n\nINCLUDE_FILE_PATTERNS  =\n\n# The PREDEFINED tag can be used to specify one or more macro names that\n# are defined before the preprocessor is started (similar to the -D option of\n# gcc). The argument of the tag is a list of macros of the form: name\n# or name=definition (no spaces). If the definition and the = are\n# omitted =1 is assumed. To prevent a macro definition from being\n# undefined via #undef or recursively expanded use the := operator\n# instead of the = operator.\n\nPREDEFINED             = EIGEN_EMPTY_STRUCT \\\n                         EIGEN_PARSED_BY_DOXYGEN \\\n                         EIGEN_VECTORIZE \\\n                         EIGEN_QT_SUPPORT \\\n                         EIGEN_STRONG_INLINE=inline \\\n                         \"EIGEN2_SUPPORT_STAGE=99\" \\\n                         \"EIGEN_MAKE_CWISE_BINARY_OP(METHOD,FUNCTOR)=template<typename OtherDerived> const CwiseBinaryOp<FUNCTOR<Scalar>, const Derived, const OtherDerived> METHOD(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const;\" \\\n                         \"EIGEN_CWISE_PRODUCT_RETURN_TYPE(LHS,RHS)=CwiseBinaryOp<internal::scalar_product_op<typename LHS::Scalar, typename RHS::Scalar >, const LHS, const RHS>\"\n\n# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then\n# this tag can be used to specify a list of macro names that should be expanded.\n# The macro definition that is found in the sources will be used.\n# Use the PREDEFINED tag if you want to use a different macro definition that\n# overrules the definition found in the source code.\n\nEXPAND_AS_DEFINED      = EIGEN_MAKE_TYPEDEFS \\\n                         EIGEN_MAKE_FIXED_TYPEDEFS \\\n                         EIGEN_MAKE_TYPEDEFS_ALL_SIZES \\\n                         EIGEN_CWISE_UNOP_RETURN_TYPE \\\n                         EIGEN_CWISE_BINOP_RETURN_TYPE \\\n                         EIGEN_CURRENT_STORAGE_BASE_CLASS \\\n                         EIGEN_MATHFUNC_IMPL \\\n                         _EIGEN_GENERIC_PUBLIC_INTERFACE \\\n                         EIGEN2_SUPPORT\n\n# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then\n# doxygen's preprocessor will remove all references to function-like macros\n# that are alone on a line, have an all uppercase name, and do not end with a\n# semicolon, because these will confuse the parser if not removed.\n\nSKIP_FUNCTION_MACROS   = YES\n\n#---------------------------------------------------------------------------\n# Configuration::additions related to external references\n#---------------------------------------------------------------------------\n\n# The TAGFILES option can be used to specify one or more tagfiles. For each\n# tag file the location of the external documentation should be added. The\n# format of a tag file without this location is as follows:\n#\n# TAGFILES = file1 file2 ...\n# Adding location for the tag files is done as follows:\n#\n# TAGFILES = file1=loc1 \"file2 = loc2\" ...\n# where \"loc1\" and \"loc2\" can be relative or absolute paths\n# or URLs. Note that each tag file must have a unique name (where the name does\n# NOT include the path). If a tag file is not located in the directory in which\n# doxygen is run, you must also specify the path to the tagfile here.\n\nTAGFILES               = ${EIGEN_DOXY_TAGFILES}\n# \"${Eigen_BINARY_DIR}/doc/eigen-unsupported.doxytags =unsupported\"\n\n# When a file name is specified after GENERATE_TAGFILE, doxygen will create\n# a tag file that is based on the input files it reads.\n\nGENERATE_TAGFILE       = \"${Eigen_BINARY_DIR}/doc/${EIGEN_DOXY_PROJECT_NAME}.doxytags\"\n\n# If the ALLEXTERNALS tag is set to YES all external classes will be listed\n# in the class index. If set to NO only the inherited external classes\n# will be listed.\n\nALLEXTERNALS           = NO\n\n# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed\n# in the modules index. If set to NO, only the current project's groups will\n# be listed.\n\nEXTERNAL_GROUPS        = YES\n\n# The PERL_PATH should be the absolute path and name of the perl script\n# interpreter (i.e. the result of `which perl').\n\nPERL_PATH              = /usr/bin/perl\n\n#---------------------------------------------------------------------------\n# Configuration options related to the dot tool\n#---------------------------------------------------------------------------\n\n# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will\n# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base\n# or super classes. Setting the tag to NO turns the diagrams off. Note that\n# this option also works with HAVE_DOT disabled, but it is recommended to\n# install and use dot, since it yields more powerful graphs.\n\nCLASS_DIAGRAMS         = YES\n\n# You can define message sequence charts within doxygen comments using the \\msc\n# command. Doxygen will then run the mscgen tool (see\n# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the\n# documentation. The MSCGEN_PATH tag allows you to specify the directory where\n# the mscgen tool resides. If left empty the tool is assumed to be found in the\n# default search path.\n\nMSCGEN_PATH            =\n\n# If set to YES, the inheritance and collaboration graphs will hide\n# inheritance and usage relations if the target is undocumented\n# or is not a class.\n\nHIDE_UNDOC_RELATIONS   = NO\n\n# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is\n# available from the path. This tool is part of Graphviz, a graph visualization\n# toolkit from AT&T and Lucent Bell Labs. The other options in this section\n# have no effect if this option is set to NO (the default)\n\nHAVE_DOT               = YES\n\n# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is\n# allowed to run in parallel. When set to 0 (the default) doxygen will\n# base this on the number of processors available in the system. You can set it\n# explicitly to a value larger than 0 to get control over the balance\n# between CPU load and processing speed.\n\nDOT_NUM_THREADS        = 0\n\n# By default doxygen will use the Helvetica font for all dot files that\n# doxygen generates. When you want a differently looking font you can specify\n# the font name using DOT_FONTNAME. You need to make sure dot is able to find\n# the font, which can be done by putting it in a standard location or by setting\n# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the\n# directory containing the font.\n\nDOT_FONTNAME           = \n\n# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.\n# The default size is 10pt.\n\nDOT_FONTSIZE           = 10\n\n# By default doxygen will tell dot to use the Helvetica font.\n# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to\n# set the path where dot can find it.\n\nDOT_FONTPATH           =\n\n# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen\n# will generate a graph for each documented class showing the direct and\n# indirect inheritance relations. Setting this tag to YES will force the\n# CLASS_DIAGRAMS tag to NO.\n\nCLASS_GRAPH            = YES\n\n# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen\n# will generate a graph for each documented class showing the direct and\n# indirect implementation dependencies (inheritance, containment, and\n# class references variables) of the class with other documented classes.\n\nCOLLABORATION_GRAPH    = NO\n\n# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen\n# will generate a graph for groups, showing the direct groups dependencies\n\nGROUP_GRAPHS           = NO\n\n# If the UML_LOOK tag is set to YES doxygen will generate inheritance and\n# collaboration diagrams in a style similar to the OMG's Unified Modeling\n# Language.\n\nUML_LOOK               = YES\n\n# If the UML_LOOK tag is enabled, the fields and methods are shown inside\n# the class node. If there are many fields or methods and many nodes the\n# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS\n# threshold limits the number of items for each type to make the size more\n# managable. Set this to 0 for no limit. Note that the threshold may be\n# exceeded by 50% before the limit is enforced.\n\nUML_LIMIT_NUM_FIELDS   = 10\n\n# If set to YES, the inheritance and collaboration graphs will show the\n# relations between templates and their instances.\n\nTEMPLATE_RELATIONS     = NO\n\n# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT\n# tags are set to YES then doxygen will generate a graph for each documented\n# file showing the direct and indirect include dependencies of the file with\n# other documented files.\n\nINCLUDE_GRAPH          = NO\n\n# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and\n# HAVE_DOT tags are set to YES then doxygen will generate a graph for each\n# documented header file showing the documented files that directly or\n# indirectly include this file.\n\nINCLUDED_BY_GRAPH      = NO\n\n# If the CALL_GRAPH and HAVE_DOT options are set to YES then\n# doxygen will generate a call dependency graph for every global function\n# or class method. Note that enabling this option will significantly increase\n# the time of a run. So in most cases it will be better to enable call graphs\n# for selected functions only using the \\callgraph command.\n\nCALL_GRAPH             = NO\n\n# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then\n# doxygen will generate a caller dependency graph for every global function\n# or class method. Note that enabling this option will significantly increase\n# the time of a run. So in most cases it will be better to enable caller\n# graphs for selected functions only using the \\callergraph command.\n\nCALLER_GRAPH           = NO\n\n# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen\n# will generate a graphical hierarchy of all classes instead of a textual one.\n\nGRAPHICAL_HIERARCHY    = NO\n\n# If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES\n# then doxygen will show the dependencies a directory has on other directories\n# in a graphical way. The dependency relations are determined by the #include\n# relations between the files in the directories.\n\nDIRECTORY_GRAPH        = NO\n\n# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images\n# generated by dot. Possible values are svg, png, jpg, or gif.\n# If left blank png will be used. If you choose svg you need to set\n# HTML_FILE_EXTENSION to xhtml in order to make the SVG files\n# visible in IE 9+ (other browsers do not have this requirement).\n\nDOT_IMAGE_FORMAT       = png\n\n# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to\n# enable generation of interactive SVG images that allow zooming and panning.\n# Note that this requires a modern browser other than Internet Explorer.\n# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you\n# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files\n# visible. Older versions of IE do not have SVG support.\n\nINTERACTIVE_SVG        = NO\n\n# The tag DOT_PATH can be used to specify the path where the dot tool can be\n# found. If left blank, it is assumed the dot tool can be found in the path.\n\nDOT_PATH               =\n\n# The DOTFILE_DIRS tag can be used to specify one or more directories that\n# contain dot files that are included in the documentation (see the\n# \\dotfile command).\n\nDOTFILE_DIRS           =\n\n# The MSCFILE_DIRS tag can be used to specify one or more directories that\n# contain msc files that are included in the documentation (see the\n# \\mscfile command).\n\nMSCFILE_DIRS           =\n\n# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of\n# nodes that will be shown in the graph. If the number of nodes in a graph\n# becomes larger than this value, doxygen will truncate the graph, which is\n# visualized by representing a node as a red box. Note that doxygen if the\n# number of direct children of the root node in a graph is already larger than\n# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note\n# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.\n\nDOT_GRAPH_MAX_NODES    = 50\n\n# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the\n# graphs generated by dot. A depth value of 3 means that only nodes reachable\n# from the root by following a path via at most 3 edges will be shown. Nodes\n# that lay further from the root node will be omitted. Note that setting this\n# option to 1 or 2 may greatly reduce the computation time needed for large\n# code bases. Also note that the size of a graph can be further restricted by\n# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.\n\nMAX_DOT_GRAPH_DEPTH    = 0\n\n# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent\n# background. This is disabled by default, because dot on Windows does not\n# seem to support this out of the box. Warning: Depending on the platform used,\n# enabling this option may lead to badly anti-aliased labels on the edges of\n# a graph (i.e. they become hard to read).\n\nDOT_TRANSPARENT        = NO\n\n# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output\n# files in one run (i.e. multiple -o and -T options on the command line). This\n# makes dot run faster, but since only newer versions of dot (>1.8.10)\n# support this, this feature is disabled by default.\n\nDOT_MULTI_TARGETS      = NO\n\n# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will\n# generate a legend page explaining the meaning of the various boxes and\n# arrows in the dot generated graphs.\n\nGENERATE_LEGEND        = YES\n\n# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will\n# remove the intermediate dot files that are used to generate\n# the various graphs.\n\nDOT_CLEANUP            = YES\n"
  },
  {
    "path": "libs/eigen/doc/FixedSizeVectorizable.dox",
    "content": "namespace Eigen {\n\n/** \\eigenManualPage TopicFixedSizeVectorizable Fixed-size vectorizable Eigen objects\n\nThe goal of this page is to explain what we mean by \"fixed-size vectorizable\".\n\n\\section summary Executive Summary\n\nAn Eigen object is called \"fixed-size vectorizable\" if it has fixed size and that size is a multiple of 16 bytes.\n\nExamples include:\n\\li Eigen::Vector2d\n\\li Eigen::Vector4d\n\\li Eigen::Vector4f\n\\li Eigen::Matrix2d\n\\li Eigen::Matrix2f\n\\li Eigen::Matrix4d\n\\li Eigen::Matrix4f\n\\li Eigen::Affine3d\n\\li Eigen::Affine3f\n\\li Eigen::Quaterniond\n\\li Eigen::Quaternionf\n\n\\section explanation Explanation\n\nFirst, \"fixed-size\" should be clear: an Eigen object has fixed size if its number of rows and its number of columns are fixed at compile-time. So for example Matrix3f has fixed size, but MatrixXf doesn't (the opposite of fixed-size is dynamic-size).\n\nThe array of coefficients of a fixed-size Eigen object is a plain \"static array\", it is not dynamically allocated. For example, the data behind a Matrix4f is just a \"float array[16]\".\n\nFixed-size objects are typically very small, which means that we want to handle them with zero runtime overhead -- both in terms of memory usage and of speed.\n\nNow, vectorization (both SSE and AltiVec) works with 128-bit packets. Moreover, for performance reasons, these packets need to be have 128-bit alignment.\n\nSo it turns out that the only way that fixed-size Eigen objects can be vectorized, is if their size is a multiple of 128 bits, or 16 bytes. Eigen will then request 16-byte alignment for these objects, and henceforth rely on these objects being aligned so no runtime check for alignment is performed.\n\n*/\n\n}\n"
  },
  {
    "path": "libs/eigen/doc/FunctionsTakingEigenTypes.dox",
    "content": "namespace Eigen {\n\n/** \\page TopicFunctionTakingEigenTypes Writing Functions Taking %Eigen Types as Parameters\n\n%Eigen's use of expression templates results in potentially every expression being of a different type. If you pass such an expression to a function taking a parameter of type Matrix, your expression will implicitly be evaluated into a temporary Matrix, which will then be passed to the function. This means that you lose the benefit of expression templates. Concretely, this has two drawbacks:\n \\li The evaluation into a temporary may be useless and inefficient;\n \\li This only allows the function to read from the expression, not to write to it.\n\nFortunately, all this myriad of expression types have in common that they all inherit a few common, templated base classes. By letting your function take templated parameters of these base types, you can let them play nicely with %Eigen's expression templates.\n\n\\eigenAutoToc\n\n\\section TopicFirstExamples Some First Examples\n\nThis section will provide simple examples for different types of objects %Eigen is offering. Before starting with the actual examples, we need to recapitulate which base objects we can work with (see also \\ref TopicClassHierarchy).\n\n \\li MatrixBase: The common base class for all dense matrix expressions (as opposed to array expressions, as opposed to sparse and special matrix classes). Use it in functions that are meant to work only on dense matrices.\n \\li ArrayBase: The common base class for all dense array expressions (as opposed to matrix expressions, etc). Use it in functions that are meant to work only on arrays.\n \\li DenseBase: The common base class for all dense matrix expression, that is, the base class for both \\c MatrixBase and \\c ArrayBase. It can be used in functions that are meant to work on both matrices and arrays.\n \\li EigenBase: The base class unifying all types of objects that can be evaluated into dense matrices or arrays, for example special matrix classes such as diagonal matrices, permutation matrices, etc. It can be used in functions that are meant to work on any such general type.\n\n<b> %EigenBase Example </b><br/><br/>\nPrints the dimensions of the most generic object present in %Eigen. It could be any matrix expressions, any dense or sparse matrix and any array.\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include function_taking_eigenbase.cpp\n</td>\n<td>\n\\verbinclude function_taking_eigenbase.out\n</td></tr></table>\n<b> %DenseBase Example </b><br/><br/>\nPrints a sub-block of the dense expression. Accepts any dense matrix or array expression, but no sparse objects and no special matrix classes such as DiagonalMatrix.\n\\code\ntemplate <typename Derived>\nvoid print_block(const DenseBase<Derived>& b, int x, int y, int r, int c)\n{\n  std::cout << \"block: \" << b.block(x,y,r,c) << std::endl;\n}\n\\endcode\n<b> %ArrayBase Example </b><br/><br/>\nPrints the maximum coefficient of the array or array-expression.\n\\code\ntemplate <typename Derived>\nvoid print_max_coeff(const ArrayBase<Derived> &a)\n{\n  std::cout << \"max: \" << a.maxCoeff() << std::endl;\n}\n\\endcode\n<b> %MatrixBase Example </b><br/><br/>\nPrints the inverse condition number of the given matrix or matrix-expression.\n\\code\ntemplate <typename Derived>\nvoid print_inv_cond(const MatrixBase<Derived>& a)\n{\n  const typename JacobiSVD<typename Derived::PlainObject>::SingularValuesType&\n    sing_vals = a.jacobiSvd().singularValues();\n  std::cout << \"inv cond: \" << sing_vals(sing_vals.size()-1) / sing_vals(0) << std::endl;\n}\n\\endcode\n<b> Multiple templated arguments example </b><br/><br/>\nCalculate the Euclidean distance between two points.\n\\code\ntemplate <typename DerivedA,typename DerivedB>\ntypename DerivedA::Scalar squaredist(const MatrixBase<DerivedA>& p1,const MatrixBase<DerivedB>& p2)\n{\n  return (p1-p2).squaredNorm();\n}\n\\endcode\nNotice that we used two template parameters, one per argument. This permits the function to handle inputs of different types, e.g.,\n\\code\nsquaredist(v1,2*v2)\n\\endcode\nwhere the first argument \\c v1 is a vector and the second argument \\c 2*v2 is an expression.\n<br/><br/>\n\nThese examples are just intended to give the reader a first impression of how functions can be written which take a plain and constant Matrix or Array argument. They are also intended to give the reader an idea about the most common base classes being the optimal candidates for functions. In the next section we will look in more detail at an example and the different ways it can be implemented, while discussing each implementation's problems and advantages. For the discussion below, Matrix and Array as well as MatrixBase and ArrayBase can be exchanged and all arguments still hold.\n\n\n\\section TopicUsingRefClass How to write generic, but non-templated function?\n\nIn all the previous examples, the functions had to be template functions. This approach allows to write very generic code, but it is often desirable to write non templated function and still keep some level of genericity to avoid stupid copies of the arguments. The typical example is to write functions accepting both a MatrixXf or a block of a MatrixXf. This exactly the purpose of the Ref class. Here is a simple example:\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include function_taking_ref.cpp\n</td>\n<td>\n\\verbinclude function_taking_ref.out\n</td></tr></table>\nIn the first two calls to inv_cond, no copy occur because the memory layout of the arguments matches the memory layout accepted by Ref<MatrixXf>. However, in the last call, we have a generic expression that will be automatically evaluated into a temporary MatrixXf by the Ref<> object.\n\nA Ref object can also be writable. Here is an example of a function computing the covariance matrix of two input matrices where each row is an observation:\n\\code\nvoid cov(const Ref<const MatrixXf> x, const Ref<const MatrixXf> y, Ref<MatrixXf> C)\n{\n  const float num_observations = static_cast<float>(x.rows());\n  const RowVectorXf x_mean = x.colwise().sum() / num_observations;\n  const RowVectorXf y_mean = y.colwise().sum() / num_observations;\n  C = (x.rowwise() - x_mean).transpose() * (y.rowwise() - y_mean) / num_observations;\n}\n\\endcode\nand here are two examples calling cov without any copy:\n\\code\nMatrixXf m1, m2, m3\ncov(m1, m2, m3);\ncov(m1.leftCols<3>(), m2.leftCols<3>(), m3.topLeftCorner<3,3>());\n\\endcode\nThe Ref<> class has two other optional template arguments allowing to control the kind of memory layout that can be accepted without any copy. See the class Ref documentation for the details.\n\n\\section TopicPlainFunctionsWorking In which cases do functions taking plain Matrix or Array arguments work?\n\nWithout using template functions, and without the Ref class, a naive implementation of the previous cov function might look like this\n\\code\nMatrixXf cov(const MatrixXf& x, const MatrixXf& y)\n{\n  const float num_observations = static_cast<float>(x.rows());\n  const RowVectorXf x_mean = x.colwise().sum() / num_observations;\n  const RowVectorXf y_mean = y.colwise().sum() / num_observations;\n  return (x.rowwise() - x_mean).transpose() * (y.rowwise() - y_mean) / num_observations;\n}\n\\endcode\nand contrary to what one might think at first, this implementation is fine unless you require a generic implementation that works with double matrices too and unless you do not care about temporary objects. Why is that the case? Where are temporaries involved? How can code as given below compile?\n\\code\nMatrixXf x,y,z;\nMatrixXf C = cov(x,y+z);\n\\endcode\nIn this special case, the example is fine and will be working because both parameters are declared as \\e const references. The compiler creates a temporary and evaluates the expression x+z into this temporary. Once the function is processed, the temporary is released and the result is assigned to C.\n\n\\b Note: Functions taking \\e const references to Matrix (or Array) can process expressions at the cost of temporaries.\n\n\n\\section TopicPlainFunctionsFailing In which cases do functions taking a plain Matrix or Array argument fail?\n\nHere, we consider a slightly modified version of the function given above. This time, we do not want to return the result but pass an additional non-const paramter which allows us to store the result. A first naive implementation might look as follows.\n\\code\n// Note: This code is flawed!\nvoid cov(const MatrixXf& x, const MatrixXf& y, MatrixXf& C)\n{\n  const float num_observations = static_cast<float>(x.rows());\n  const RowVectorXf x_mean = x.colwise().sum() / num_observations;\n  const RowVectorXf y_mean = y.colwise().sum() / num_observations;\n  C = (x.rowwise() - x_mean).transpose() * (y.rowwise() - y_mean) / num_observations;\n}\n\\endcode\nWhen trying to execute the following code\n\\code\nMatrixXf C = MatrixXf::Zero(3,6);\ncov(x,y, C.block(0,0,3,3));\n\\endcode\nthe compiler will fail, because it is not possible to convert the expression returned by \\c MatrixXf::block() into a non-const \\c MatrixXf&. This is the case because the compiler wants to protect you from writing your result to a temporary object. In this special case this protection is not intended -- we want to write to a temporary object. So how can we overcome this problem? \n\nThe solution which is preferred at the moment is based on a little \\em hack. One needs to pass a const reference to the matrix and internally the constness needs to be cast away. The correct implementation for C98 compliant compilers would be\n\\code\ntemplate <typename Derived, typename OtherDerived>\nvoid cov(const MatrixBase<Derived>& x, const MatrixBase<Derived>& y, MatrixBase<OtherDerived> const & C)\n{\n  typedef typename Derived::Scalar Scalar;\n  typedef typename internal::plain_row_type<Derived>::type RowVectorType;\n\n  const Scalar num_observations = static_cast<Scalar>(x.rows());\n\n  const RowVectorType x_mean = x.colwise().sum() / num_observations;\n  const RowVectorType y_mean = y.colwise().sum() / num_observations;\n\n  const_cast< MatrixBase<OtherDerived>& >(C) =\n    (x.rowwise() - x_mean).transpose() * (y.rowwise() - y_mean) / num_observations;\n}\n\\endcode\nThe implementation above does now not only work with temporary expressions but it also allows to use the function with matrices of arbitrary floating point scalar types.\n\n\\b Note: The const cast hack will only work with templated functions. It will not work with the MatrixXf implementation because it is not possible to cast a Block expression to a Matrix reference!\n\n\n\n\\section TopicResizingInGenericImplementations How to resize matrices in generic implementations?\n\nOne might think we are done now, right? This is not completely true because in order for our covariance function to be generically applicable, we want the follwing code to work\n\\code\nMatrixXf x = MatrixXf::Random(100,3);\nMatrixXf y = MatrixXf::Random(100,3);\nMatrixXf C;\ncov(x, y, C);\n\\endcode\nThis is not the case anymore, when we are using an implementation taking MatrixBase as a parameter. In general, %Eigen supports automatic resizing but it is not possible to do so on expressions. Why should resizing of a matrix Block be allowed? It is a reference to a sub-matrix and we definitely don't want to resize that. So how can we incorporate resizing if we cannot resize on MatrixBase? The solution is to resize the derived object as in this implementation.\n\\code\ntemplate <typename Derived, typename OtherDerived>\nvoid cov(const MatrixBase<Derived>& x, const MatrixBase<Derived>& y, MatrixBase<OtherDerived> const & C_)\n{\n  typedef typename Derived::Scalar Scalar;\n  typedef typename internal::plain_row_type<Derived>::type RowVectorType;\n\n  const Scalar num_observations = static_cast<Scalar>(x.rows());\n\n  const RowVectorType x_mean = x.colwise().sum() / num_observations;\n  const RowVectorType y_mean = y.colwise().sum() / num_observations;\n\n  MatrixBase<OtherDerived>& C = const_cast< MatrixBase<OtherDerived>& >(C_);\n  \n  C.derived().resize(x.cols(),x.cols()); // resize the derived object\n  C = (x.rowwise() - x_mean).transpose() * (y.rowwise() - y_mean) / num_observations;\n}\n\\endcode\nThis implementation is now working for parameters being expressions and for parameters being matrices and having the wrong size. Resizing the expressions does not do any harm in this case unless they actually require resizing. That means, passing an expression with the wrong dimensions will result in a run-time error (in debug mode only) while passing expressions of the correct size will just work fine.\n\n\\b Note: In the above discussion the terms Matrix and Array and MatrixBase and ArrayBase can be exchanged and all arguments still hold.\n\n\\section TopicSummary Summary\n\n  - To summarize, the implementation of functions taking non-writable (const referenced) objects is not a big issue and does not lead to problematic situations in terms of compiling and running your program. However, a naive implementation is likely to introduce unnecessary temporary objects in your code. In order to avoid evaluating parameters into temporaries, pass them as (const) references to MatrixBase or ArrayBase (so templatize your function).\n\n  - Functions taking writable (non-const) parameters must take const references and cast away constness within the function body.\n\n  - Functions that take as parameters MatrixBase (or ArrayBase) objects, and potentially need to resize them (in the case where they are resizable), must call resize() on the derived class, as returned by derived().\n*/\n}\n"
  },
  {
    "path": "libs/eigen/doc/HiPerformance.dox",
    "content": "\nnamespace Eigen {\n\n/** \\page TopicWritingEfficientProductExpression Writing efficient matrix product expressions\n\nIn general achieving good performance with Eigen does no require any special effort:\nsimply write your expressions in the most high level way. This is especially true\nfor small fixed size matrices. For large matrices, however, it might be useful to\ntake some care when writing your expressions in order to minimize useless evaluations\nand optimize the performance.\nIn this page we will give a brief overview of the Eigen's internal mechanism to simplify\nand evaluate complex product expressions, and discuss the current limitations.\nIn particular we will focus on expressions matching level 2 and 3 BLAS routines, i.e,\nall kind of matrix products and triangular solvers.\n\nIndeed, in Eigen we have implemented a set of highly optimized routines which are very similar\nto BLAS's ones. Unlike BLAS, those routines are made available to user via a high level and\nnatural API. Each of these routines can compute in a single evaluation a wide variety of expressions.\nGiven an expression, the challenge is then to map it to a minimal set of routines.\nAs explained latter, this mechanism has some limitations, and knowing them will allow\nyou to write faster code by making your expressions more Eigen friendly.\n\n\\section GEMM General Matrix-Matrix product (GEMM)\n\nLet's start with the most common primitive: the matrix product of general dense matrices.\nIn the BLAS world this corresponds to the GEMM routine. Our equivalent primitive can\nperform the following operation:\n\\f$ C.noalias() += \\alpha op1(A) op2(B) \\f$\nwhere A, B, and C are column and/or row major matrices (or sub-matrices),\nalpha is a scalar value, and op1, op2 can be transpose, adjoint, conjugate, or the identity.\nWhen Eigen detects a matrix product, it analyzes both sides of the product to extract a\nunique scalar factor alpha, and for each side, its effective storage order, shape, and conjugation states.\nMore precisely each side is simplified by iteratively removing trivial expressions such as scalar multiple,\nnegation and conjugation. Transpose and Block expressions are not evaluated and they only modify the storage order\nand shape. All other expressions are immediately evaluated.\nFor instance, the following expression:\n\\code m1.noalias() -= s4 * (s1 * m2.adjoint() * (-(s3*m3).conjugate()*s2))  \\endcode\nis automatically simplified to:\n\\code m1.noalias() += (s1*s2*conj(s3)*s4) * m2.adjoint() * m3.conjugate() \\endcode\nwhich exactly matches our GEMM routine.\n\n\\subsection GEMM_Limitations Limitations\nUnfortunately, this simplification mechanism is not perfect yet and not all expressions which could be\nhandled by a single GEMM-like call are correctly detected.\n<table class=\"manual\" style=\"width:100%\">\n<tr>\n<th>Not optimal expression</th>\n<th>Evaluated as</th>\n<th>Optimal version (single evaluation)</th>\n<th>Comments</th>\n</tr>\n<tr>\n<td>\\code\nm1 += m2 * m3; \\endcode</td>\n<td>\\code\ntemp = m2 * m3;\nm1 += temp; \\endcode</td>\n<td>\\code\nm1.noalias() += m2 * m3; \\endcode</td>\n<td>Use .noalias() to tell Eigen the result and right-hand-sides do not alias. \n    Otherwise the product m2 * m3 is evaluated into a temporary.</td>\n</tr>\n<tr class=\"alt\">\n<td></td>\n<td></td>\n<td>\\code\nm1.noalias() += s1 * (m2 * m3); \\endcode</td>\n<td>This is a special feature of Eigen. Here the product between a scalar\n    and a matrix product does not evaluate the matrix product but instead it\n    returns a matrix product expression tracking the scalar scaling factor. <br>\n    Without this optimization, the matrix product would be evaluated into a\n    temporary as in the next example.</td>\n</tr>\n<tr>\n<td>\\code\nm1.noalias() += (m2 * m3).adjoint(); \\endcode</td>\n<td>\\code\ntemp = m2 * m3;\nm1 += temp.adjoint(); \\endcode</td>\n<td>\\code\nm1.noalias() += m3.adjoint()\n*              * m2.adjoint(); \\endcode</td>\n<td>This is because the product expression has the EvalBeforeNesting bit which\n    enforces the evaluation of the product by the Tranpose expression.</td>\n</tr>\n<tr class=\"alt\">\n<td>\\code\nm1 = m1 + m2 * m3; \\endcode</td>\n<td>\\code\ntemp = m2 * m3;\nm1 = m1 + temp; \\endcode</td>\n<td>\\code m1.noalias() += m2 * m3; \\endcode</td>\n<td>Here there is no way to detect at compile time that the two m1 are the same,\n    and so the matrix product will be immediately evaluated.</td>\n</tr>\n<tr>\n<td>\\code\nm1.noalias() = m4 + m2 * m3; \\endcode</td>\n<td>\\code\ntemp = m2 * m3;\nm1 = m4 + temp; \\endcode</td>\n<td>\\code\nm1 = m4;\nm1.noalias() += m2 * m3; \\endcode</td>\n<td>First of all, here the .noalias() in the first expression is useless because\n    m2*m3 will be evaluated anyway. However, note how this expression can be rewritten\n    so that no temporary is required. (tip: for very small fixed size matrix\n    it is slighlty better to rewrite it like this: m1.noalias() = m2 * m3; m1 += m4;</td>\n</tr>\n<tr class=\"alt\">\n<td>\\code\nm1.noalias() += (s1*m2).block(..) * m3; \\endcode</td>\n<td>\\code\ntemp = (s1*m2).block(..);\nm1 += temp * m3; \\endcode</td>\n<td>\\code\nm1.noalias() += s1 * m2.block(..) * m3; \\endcode</td>\n<td>This is because our expression analyzer is currently not able to extract trivial\n    expressions nested in a Block expression. Therefore the nested scalar\n    multiple cannot be properly extracted.</td>\n</tr>\n</table>\n\nOf course all these remarks hold for all other kind of products involving triangular or selfadjoint matrices.\n\n*/\n\n}\n"
  },
  {
    "path": "libs/eigen/doc/InsideEigenExample.dox",
    "content": "namespace Eigen {\n\n/** \\page TopicInsideEigenExample What happens inside Eigen, on a simple example\n\n\\eigenAutoToc\n\n<hr>\n\n\nConsider the following example program:\n\n\\code\n#include<Eigen/Core>\n\nint main()\n{\n  int size = 50;\n  // VectorXf is a vector of floats, with dynamic size.\n  Eigen::VectorXf u(size), v(size), w(size);\n  u = v + w;\n}\n\\endcode\n\nThe goal of this page is to understand how Eigen compiles it, assuming that SSE2 vectorization is enabled (GCC option -msse2).\n\n\\section WhyInteresting Why it's interesting\n\nMaybe you think, that the above example program is so simple, that compiling it shouldn't involve anything interesting. So before starting, let us explain what is nontrivial in compiling it correctly -- that is, producing optimized code -- so that the complexity of Eigen, that we'll explain here, is really useful.\n\nLook at the line of code\n\\code\n  u = v + w;   //   (*)\n\\endcode\n\nThe first important thing about compiling it, is that the arrays should be traversed only once, like\n\\code\n  for(int i = 0; i < size; i++) u[i] = v[i] + w[i];\n\\endcode\nThe problem is that if we make a naive C++ library where the VectorXf class has an operator+ returning a VectorXf, then the line of code (*) will amount to:\n\\code\n  VectorXf tmp = v + w;\n  VectorXf u = tmp;\n\\endcode\nObviously, the introduction of the temporary \\a tmp here is useless. It has a very bad effect on performance, first because the creation of \\a tmp requires a dynamic memory allocation in this context, and second as there are now two for loops:\n\\code\n  for(int i = 0; i < size; i++) tmp[i] = v[i] + w[i];\n  for(int i = 0; i < size; i++) u[i] = tmp[i];\n\\endcode\nTraversing the arrays twice instead of once is terrible for performance, as it means that we do many redundant memory accesses.\n\nThe second important thing about compiling the above program, is to make correct use of SSE2 instructions. Notice that Eigen also supports AltiVec and that all the discussion that we make here applies also to AltiVec.\n\nSSE2, like AltiVec, is a set of instructions allowing to perform computations on packets of 128 bits at once. Since a float is 32 bits, this means that SSE2 instructions can handle 4 floats at once. This means that, if correctly used, they can make our computation go up to 4x faster.\n\nHowever, in the above program, we have chosen size=50, so our vectors consist of 50 float's, and 50 is not a multiple of 4. This means that we cannot hope to do all of that computation using SSE2 instructions. The second best thing, to which we should aim, is to handle the 48 first coefficients with SSE2 instructions, since 48 is the biggest multiple of 4 below 50, and then handle separately, without SSE2, the 49th and 50th coefficients. Something like this:\n\n\\code\n  for(int i = 0; i < 4*(size/4); i+=4) u.packet(i)  = v.packet(i) + w.packet(i);\n  for(int i = 4*(size/4); i < size; i++) u[i] = v[i] + w[i];\n\\endcode\n\nSo let us look line by line at our example program, and let's follow Eigen as it compiles it.\n\n\\section ConstructingVectors Constructing vectors\n\nLet's analyze the first line:\n\n\\code\n  Eigen::VectorXf u(size), v(size), w(size);\n\\endcode\n\nFirst of all, VectorXf is the following typedef:\n\\code\n  typedef Matrix<float, Dynamic, 1> VectorXf;\n\\endcode\n\nThe class template Matrix is declared in src/Core/util/ForwardDeclarations.h with 6 template parameters, but the last 3 are automatically determined by the first 3. So you don't need to worry about them for now. Here, Matrix\\<float, Dynamic, 1\\> means a matrix of floats, with a dynamic number of rows and 1 column.\n\nThe Matrix class inherits a base class, MatrixBase. Don't worry about it, for now it suffices to say that MatrixBase is what unifies matrices/vectors and all the expressions types -- more on that below.\n\nWhen we do\n\\code\n  Eigen::VectorXf u(size);\n\\endcode\nthe constructor that is called is Matrix::Matrix(int), in src/Core/Matrix.h. Besides some assertions, all it does is to construct the \\a m_storage member, which is of type DenseStorage\\<float, Dynamic, Dynamic, 1\\>.\n\nYou may wonder, isn't it overengineering to have the storage in a separate class? The reason is that the Matrix class template covers all kinds of matrices and vector: both fixed-size and dynamic-size. The storage method is not the same in these two cases. For fixed-size, the matrix coefficients are stored as a plain member array. For dynamic-size, the coefficients will be stored as a pointer to a dynamically-allocated array. Because of this, we need to abstract storage away from the Matrix class. That's DenseStorage.\n\nLet's look at this constructor, in src/Core/DenseStorage.h. You can see that there are many partial template specializations of DenseStorages here, treating separately the cases where dimensions are Dynamic or fixed at compile-time. The partial specialization that we are looking at is:\n\\code\ntemplate<typename T, int _Cols> class DenseStorage<T, Dynamic, Dynamic, _Cols>\n\\endcode\n\nHere, the constructor called is DenseStorage::DenseStorage(int size, int rows, int columns)\nwith size=50, rows=50, columns=1.\n\nHere is this constructor:\n\\code\ninline DenseStorage(int size, int rows, int) : m_data(internal::aligned_new<T>(size)), m_rows(rows) {}\n\\endcode\n\nHere, the \\a m_data member is the actual array of coefficients of the matrix. As you see, it is dynamically allocated. Rather than calling new[] or malloc(), as you can see, we have our own internal::aligned_new defined in src/Core/util/Memory.h. What it does is that if vectorization is enabled, then it uses a platform-specific call to allocate a 128-bit-aligned array, as that is very useful for vectorization with both SSE2 and AltiVec. If vectorization is disabled, it amounts to the standard new[].\n\nAs you can see, the constructor also sets the \\a m_rows member to \\a size. Notice that there is no \\a m_columns member: indeed, in this partial specialization of DenseStorage, we know the number of columns at compile-time, since the _Cols template parameter is different from Dynamic. Namely, in our case, _Cols is 1, which is to say that our vector is just a matrix with 1 column. Hence, there is no need to store the number of columns as a runtime variable.\n\nWhen you call VectorXf::data() to get the pointer to the array of coefficients, it returns DenseStorage::data() which returns the \\a m_data member.\n\nWhen you call VectorXf::size() to get the size of the vector, this is actually a method in the base class MatrixBase. It determines that the vector is a column-vector, since ColsAtCompileTime==1 (this comes from the template parameters in the typedef VectorXf). It deduces that the size is the number of rows, so it returns VectorXf::rows(), which returns DenseStorage::rows(), which returns the \\a m_rows member, which was set to \\a size by the constructor.\n\n\\section ConstructionOfSumXpr Construction of the sum expression\n\nNow that our vectors are constructed, let's move on to the next line:\n\n\\code\nu = v + w;\n\\endcode\n\nThe executive summary is that operator+ returns a \"sum of vectors\" expression, but doesn't actually perform the computation. It is the operator=, whose call occurs thereafter, that does the computation.\n\nLet us now see what Eigen does when it sees this:\n\n\\code\nv + w\n\\endcode\n\nHere, v and w are of type VectorXf, which is a typedef for a specialization of Matrix (as we explained above), which is a subclass of MatrixBase. So what is being called is\n\n\\code\nMatrixBase::operator+(const MatrixBase&)\n\\endcode\n\nThe return type of this operator is\n\\code\nCwiseBinaryOp<internal::scalar_sum_op<float>, VectorXf, VectorXf>\n\\endcode\nThe CwiseBinaryOp class is our first encounter with an expression template. As we said, the operator+ doesn't by itself perform any computation, it just returns an abstract \"sum of vectors\" expression. Since there are also \"difference of vectors\" and \"coefficient-wise product of vectors\" expressions, we unify them all as \"coefficient-wise binary operations\", which we abbreviate as \"CwiseBinaryOp\". \"Coefficient-wise\" means that the operations is performed coefficient by coefficient. \"binary\" means that there are two operands -- we are adding two vectors with one another.\n\nNow you might ask, what if we did something like\n\n\\code\nv + w + u;\n\\endcode\n\nThe first v + w would return a CwiseBinaryOp as above, so in order for this to compile, we'd need to define an operator+ also in the class CwiseBinaryOp... at this point it starts looking like a nightmare: are we going to have to define all operators in each of the expression classes (as you guessed, CwiseBinaryOp is only one of many) ? This looks like a dead end!\n\nThe solution is that CwiseBinaryOp itself, as well as Matrix and all the other expression types, is a subclass of MatrixBase. So it is enough to define once and for all the operators in class MatrixBase.\n\nSince MatrixBase is the common base class of different subclasses, the aspects that depend on the subclass must be abstracted from MatrixBase. This is called polymorphism.\n\nThe classical approach to polymorphism in C++ is by means of virtual functions. This is dynamic polymorphism. Here we don't want dynamic polymorphism because the whole design of Eigen is based around the assumption that all the complexity, all the abstraction, gets resolved at compile-time. This is crucial: if the abstraction can't get resolved at compile-time, Eigen's compile-time optimization mechanisms become useless, not to mention that if that abstraction has to be resolved at runtime it'll incur an overhead by itself.\n\nHere, what we want is to have a single class MatrixBase as the base of many subclasses, in such a way that each MatrixBase object (be it a matrix, or vector, or any kind of expression) knows at compile-time (as opposed to run-time) of which particular subclass it is an object (i.e. whether it is a matrix, or an expression, and what kind of expression).\n\nThe solution is the <a href=\"http://en.wikipedia.org/wiki/Curiously_Recurring_Template_Pattern\">Curiously Recurring Template Pattern</a>. Let's do the break now. Hopefully you can read this wikipedia page during the break if needed, but it won't be allowed during the exam.\n\nIn short, MatrixBase takes a template parameter \\a Derived. Whenever we define a subclass Subclass, we actually make Subclass inherit MatrixBase\\<Subclass\\>. The point is that different subclasses inherit different MatrixBase types. Thanks to this, whenever we have an object of a subclass, and we call on it some MatrixBase method, we still remember even from inside the MatrixBase method which particular subclass we're talking about.\n\nThis means that we can put almost all the methods and operators in the base class MatrixBase, and have only the bare minimum in the subclasses. If you look at the subclasses in Eigen, like for instance the CwiseBinaryOp class, they have very few methods. There are coeff() and sometimes coeffRef() methods for access to the coefficients, there are rows() and cols() methods returning the number of rows and columns, but there isn't much more than that. All the meat is in MatrixBase, so it only needs to be coded once for all kinds of expressions, matrices, and vectors.\n\nSo let's end this digression and come back to the piece of code from our example program that we were currently analyzing,\n\n\\code\nv + w\n\\endcode\n\nNow that MatrixBase is a good friend, let's write fully the prototype of the operator+ that gets called here (this code is from src/Core/MatrixBase.h):\n\n\\code\ntemplate<typename Derived>\nclass MatrixBase\n{\n  // ...\n\n  template<typename OtherDerived>\n  const CwiseBinaryOp<internal::scalar_sum_op<typename internal::traits<Derived>::Scalar>, Derived, OtherDerived>\n  operator+(const MatrixBase<OtherDerived> &other) const;\n\n  // ...\n};\n\\endcode\n\nHere of course, \\a Derived and \\a OtherDerived are VectorXf.\n\nAs we said, CwiseBinaryOp is also used for other operations such as substration, so it takes another template parameter determining the operation that will be applied to coefficients. This template parameter is a functor, that is, a class in which we have an operator() so it behaves like a function. Here, the functor used is internal::scalar_sum_op. It is defined in src/Core/Functors.h.\n\nLet us now explain the internal::traits here. The internal::scalar_sum_op class takes one template parameter: the type of the numbers to handle. Here of course we want to pass the scalar type (a.k.a. numeric type) of VectorXf, which is \\c float. How do we determine which is the scalar type of \\a Derived ? Throughout Eigen, all matrix and expression types define a typedef \\a Scalar which gives its scalar type. For example, VectorXf::Scalar is a typedef for \\c float. So here, if life was easy, we could find the numeric type of \\a Derived as just\n\\code\ntypename Derived::Scalar\n\\endcode\nUnfortunately, we can't do that here, as the compiler would complain that the type Derived hasn't yet been defined. So we use a workaround: in src/Core/util/ForwardDeclarations.h, we declared (not defined!) all our subclasses, like Matrix, and we also declared the following class template:\n\\code\ntemplate<typename T> struct internal::traits;\n\\endcode\nIn src/Core/Matrix.h, right \\em before the definition of class Matrix, we define a partial specialization of internal::traits for T=Matrix\\<any template parameters\\>. In this specialization of internal::traits, we define the Scalar typedef. So when we actually define Matrix, it is legal to refer to \"typename internal::traits\\<Matrix\\>::Scalar\".\n\nAnyway, we have declared our operator+. In our case, where \\a Derived and \\a OtherDerived are VectorXf, the above declaration amounts to:\n\\code\nclass MatrixBase<VectorXf>\n{\n  // ...\n\n  const CwiseBinaryOp<internal::scalar_sum_op<float>, VectorXf, VectorXf>\n  operator+(const MatrixBase<VectorXf> &other) const;\n\n  // ...\n};\n\\endcode\n\nLet's now jump to src/Core/CwiseBinaryOp.h to see how it is defined. As you can see there, all it does is to return a CwiseBinaryOp object, and this object is just storing references to the left-hand-side and right-hand-side expressions -- here, these are the vectors \\a v and \\a w. Well, the CwiseBinaryOp object is also storing an instance of the (empty) functor class, but you shouldn't worry about it as that is a minor implementation detail.\n\nThus, the operator+ hasn't performed any actual computation. To summarize, the operation \\a v + \\a w just returned an object of type CwiseBinaryOp which did nothing else than just storing references to \\a v and \\a w.\n\n\\section Assignment The assignment\n\nAt this point, the expression \\a v + \\a w has finished evaluating, so, in the process of compiling the line of code\n\\code\nu = v + w;\n\\endcode\nwe now enter the operator=.\n\nWhat operator= is being called here? The vector u is an object of class VectorXf, i.e. Matrix. In src/Core/Matrix.h, inside the definition of class Matrix, we see this:\n\\code\n    template<typename OtherDerived>\n    inline Matrix& operator=(const MatrixBase<OtherDerived>& other)\n    {\n      eigen_assert(m_storage.data()!=0 && \"you cannot use operator= with a non initialized matrix (instead use set()\");\n      return Base::operator=(other.derived());\n    }\n\\endcode\nHere, Base is a typedef for MatrixBase\\<Matrix\\>. So, what is being called is the operator= of MatrixBase. Let's see its prototype in src/Core/MatrixBase.h:\n\\code\n    template<typename OtherDerived>\n    Derived& operator=(const MatrixBase<OtherDerived>& other);\n\\endcode\nHere, \\a Derived is VectorXf (since u is a VectorXf) and \\a OtherDerived is CwiseBinaryOp. More specifically, as explained in the previous section, \\a OtherDerived is:\n\\code\nCwiseBinaryOp<internal::scalar_sum_op<float>, VectorXf, VectorXf>\n\\endcode\nSo the full prototype of the operator= being called is:\n\\code\nVectorXf& MatrixBase<VectorXf>::operator=(const MatrixBase<CwiseBinaryOp<internal::scalar_sum_op<float>, VectorXf, VectorXf> > & other);\n\\endcode\nThis operator= literally reads \"copying a sum of two VectorXf's into another VectorXf\".\n\nLet's now look at the implementation of this operator=. It resides in the file src/Core/Assign.h.\n\nWhat we can see there is:\n\\code\ntemplate<typename Derived>\ntemplate<typename OtherDerived>\ninline Derived& MatrixBase<Derived>\n  ::operator=(const MatrixBase<OtherDerived>& other)\n{\n  return internal::assign_selector<Derived,OtherDerived>::run(derived(), other.derived());\n}\n\\endcode\n\nOK so our next task is to understand internal::assign_selector :)\n\nHere is its declaration (all that is still in the same file src/Core/Assign.h)\n\\code\ntemplate<typename Derived, typename OtherDerived,\n         bool EvalBeforeAssigning = int(OtherDerived::Flags) & EvalBeforeAssigningBit,\n         bool NeedToTranspose = Derived::IsVectorAtCompileTime\n                && OtherDerived::IsVectorAtCompileTime\n                && int(Derived::RowsAtCompileTime) == int(OtherDerived::ColsAtCompileTime)\n                && int(Derived::ColsAtCompileTime) == int(OtherDerived::RowsAtCompileTime)\n                && int(Derived::SizeAtCompileTime) != 1>\nstruct internal::assign_selector;\n\\endcode\n\nSo internal::assign_selector takes 4 template parameters, but the 2 last ones are automatically determined by the 2 first ones.\n\nEvalBeforeAssigning is here to enforce the EvalBeforeAssigningBit. As explained <a href=\"TopicLazyEvaluation.html\">here</a>, certain expressions have this flag which makes them automatically evaluate into temporaries before assigning them to another expression. This is the case of the Product expression, in order to avoid strange aliasing effects when doing \"m = m * m;\" However, of course here our CwiseBinaryOp expression doesn't have the EvalBeforeAssigningBit: we said since the beginning that we didn't want a temporary to be introduced here. So if you go to src/Core/CwiseBinaryOp.h, you'll see that the Flags in internal::traits\\<CwiseBinaryOp\\> don't include the EvalBeforeAssigningBit. The Flags member of CwiseBinaryOp is then imported from the internal::traits by the EIGEN_GENERIC_PUBLIC_INTERFACE macro. Anyway, here the template parameter EvalBeforeAssigning has the value \\c false.\n\nNeedToTranspose is here for the case where the user wants to copy a row-vector into a column-vector. We allow this as a special exception to the general rule that in assignments we require the dimesions to match. Anyway, here both the left-hand and right-hand sides are column vectors, in the sense that ColsAtCompileTime is equal to 1. So NeedToTranspose is \\c false too.\n\nSo, here we are in the partial specialization:\n\\code\ninternal::assign_selector<Derived, OtherDerived, false, false>\n\\endcode\n\nHere's how it is defined:\n\\code\ntemplate<typename Derived, typename OtherDerived>\nstruct internal::assign_selector<Derived,OtherDerived,false,false> {\n  static Derived& run(Derived& dst, const OtherDerived& other) { return dst.lazyAssign(other.derived()); }\n};\n\\endcode\n\nOK so now our next job is to understand how lazyAssign works :)\n\n\\code\ntemplate<typename Derived>\ntemplate<typename OtherDerived>\ninline Derived& MatrixBase<Derived>\n  ::lazyAssign(const MatrixBase<OtherDerived>& other)\n{\n  EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(Derived,OtherDerived)\n  eigen_assert(rows() == other.rows() && cols() == other.cols());\n  internal::assign_impl<Derived, OtherDerived>::run(derived(),other.derived());\n  return derived();\n}\n\\endcode\n\nWhat do we see here? Some assertions, and then the only interesting line is:\n\\code\n  internal::assign_impl<Derived, OtherDerived>::run(derived(),other.derived());\n\\endcode\n\nOK so now we want to know what is inside internal::assign_impl.\n\nHere is its declaration:\n\\code\ntemplate<typename Derived1, typename Derived2,\n         int Vectorization = internal::assign_traits<Derived1, Derived2>::Vectorization,\n         int Unrolling = internal::assign_traits<Derived1, Derived2>::Unrolling>\nstruct internal::assign_impl;\n\\endcode\nAgain, internal::assign_selector takes 4 template parameters, but the 2 last ones are automatically determined by the 2 first ones.\n\nThese two parameters \\a Vectorization and \\a Unrolling are determined by a helper class internal::assign_traits. Its job is to determine which vectorization strategy to use (that is \\a Vectorization) and which unrolling strategy to use (that is \\a Unrolling).\n\nWe'll not enter into the details of how these strategies are chosen (this is in the implementation of internal::assign_traits at the top of the same file). Let's just say that here \\a Vectorization has the value \\a LinearVectorization, and \\a Unrolling has the value \\a NoUnrolling (the latter is obvious since our vectors have dynamic size so there's no way to unroll the loop at compile-time).\n\nSo the partial specialization of internal::assign_impl that we're looking at is:\n\\code\ninternal::assign_impl<Derived1, Derived2, LinearVectorization, NoUnrolling>\n\\endcode\n\nHere is how it's defined:\n\\code\ntemplate<typename Derived1, typename Derived2>\nstruct internal::assign_impl<Derived1, Derived2, LinearVectorization, NoUnrolling>\n{\n  static void run(Derived1 &dst, const Derived2 &src)\n  {\n    const int size = dst.size();\n    const int packetSize = internal::packet_traits<typename Derived1::Scalar>::size;\n    const int alignedStart = internal::assign_traits<Derived1,Derived2>::DstIsAligned ? 0\n                           : internal::first_aligned(&dst.coeffRef(0), size);\n    const int alignedEnd = alignedStart + ((size-alignedStart)/packetSize)*packetSize;\n\n    for(int index = 0; index < alignedStart; index++)\n      dst.copyCoeff(index, src);\n\n    for(int index = alignedStart; index < alignedEnd; index += packetSize)\n    {\n      dst.template copyPacket<Derived2, Aligned, internal::assign_traits<Derived1,Derived2>::SrcAlignment>(index, src);\n    }\n\n    for(int index = alignedEnd; index < size; index++)\n      dst.copyCoeff(index, src);\n  }\n};\n\\endcode\n\nHere's how it works. \\a LinearVectorization means that the left-hand and right-hand side expression can be accessed linearly i.e. you can refer to their coefficients by one integer \\a index, as opposed to having to refer to its coefficients by two integers \\a row, \\a column.\n\nAs we said at the beginning, vectorization works with blocks of 4 floats. Here, \\a PacketSize is 4.\n\nThere are two potential problems that we need to deal with:\n\\li first, vectorization works much better if the packets are 128-bit-aligned. This is especially important for write access. So when writing to the coefficients of \\a dst, we want to group these coefficients by packets of 4 such that each of these packets is 128-bit-aligned. In general, this requires to skip a few coefficients at the beginning of \\a dst. This is the purpose of \\a alignedStart. We then copy these first few coefficients one by one, not by packets. However, in our case, the \\a dst expression is a VectorXf and remember that in the construction of the vectors we allocated aligned arrays. Thanks to \\a DstIsAligned, Eigen remembers that without having to do any runtime check, so \\a alignedStart is zero and this part is avoided altogether.\n\\li second, the number of coefficients to copy is not in general a multiple of \\a packetSize. Here, there are 50 coefficients to copy and \\a packetSize is 4. So we'll have to copy the last 2 coefficients one by one, not by packets. Here, \\a alignedEnd is 48.\n\nNow come the actual loops.\n\nFirst, the vectorized part: the 48 first coefficients out of 50 will be copied by packets of 4:\n\\code\n  for(int index = alignedStart; index < alignedEnd; index += packetSize)\n  {\n    dst.template copyPacket<Derived2, Aligned, internal::assign_traits<Derived1,Derived2>::SrcAlignment>(index, src);\n  }\n\\endcode\n\nWhat is copyPacket? It is defined in src/Core/Coeffs.h:\n\\code\ntemplate<typename Derived>\ntemplate<typename OtherDerived, int StoreMode, int LoadMode>\ninline void MatrixBase<Derived>::copyPacket(int index, const MatrixBase<OtherDerived>& other)\n{\n  eigen_internal_assert(index >= 0 && index < size());\n  derived().template writePacket<StoreMode>(index,\n    other.derived().template packet<LoadMode>(index));\n}\n\\endcode\n\nOK, what are writePacket() and packet() here?\n\nFirst, writePacket() here is a method on the left-hand side VectorXf. So we go to src/Core/Matrix.h to look at its definition:\n\\code\ntemplate<int StoreMode>\ninline void writePacket(int index, const PacketScalar& x)\n{\n  internal::pstoret<Scalar, PacketScalar, StoreMode>(m_storage.data() + index, x);\n}\n\\endcode\nHere, \\a StoreMode is \\a #Aligned, indicating that we are doing a 128-bit-aligned write access, \\a PacketScalar is a type representing a \"SSE packet of 4 floats\" and internal::pstoret is a function writing such a packet in memory. Their definitions are architecture-specific, we find them in src/Core/arch/SSE/PacketMath.h:\n\nThe line in src/Core/arch/SSE/PacketMath.h that determines the PacketScalar type (via a typedef in Matrix.h) is:\n\\code\ntemplate<> struct internal::packet_traits<float>  { typedef __m128  type; enum {size=4}; };\n\\endcode\nHere, __m128 is a SSE-specific type. Notice that the enum \\a size here is what was used to define \\a packetSize above.\n\nAnd here is the implementation of internal::pstoret:\n\\code\ntemplate<> inline void internal::pstore(float*  to, const __m128&  from) { _mm_store_ps(to, from); }\n\\endcode\nHere, __mm_store_ps is a SSE-specific intrinsic function, representing a single SSE instruction. The difference between internal::pstore and internal::pstoret is that internal::pstoret is a dispatcher handling both the aligned and unaligned cases, you find its definition in src/Core/GenericPacketMath.h:\n\\code\ntemplate<typename Scalar, typename Packet, int LoadMode>\ninline void internal::pstoret(Scalar* to, const Packet& from)\n{\n  if(LoadMode == Aligned)\n    internal::pstore(to, from);\n  else\n    internal::pstoreu(to, from);\n}\n\\endcode\n\nOK, that explains how writePacket() works. Now let's look into the packet() call. Remember that we are analyzing this line of code inside copyPacket():\n\\code\nderived().template writePacket<StoreMode>(index,\n    other.derived().template packet<LoadMode>(index));\n\\endcode\n\nHere, \\a other is our sum expression \\a v + \\a w. The .derived() is just casting from MatrixBase to the subclass which here is CwiseBinaryOp. So let's go to src/Core/CwiseBinaryOp.h:\n\\code\nclass CwiseBinaryOp\n{\n  // ...\n    template<int LoadMode>\n    inline PacketScalar packet(int index) const\n    {\n      return m_functor.packetOp(m_lhs.template packet<LoadMode>(index), m_rhs.template packet<LoadMode>(index));\n    }\n};\n\\endcode\nHere, \\a m_lhs is the vector \\a v, and \\a m_rhs is the vector \\a w. So the packet() function here is Matrix::packet(). The template parameter \\a LoadMode is \\a #Aligned. So we're looking at\n\\code\nclass Matrix\n{\n  // ...\n    template<int LoadMode>\n    inline PacketScalar packet(int index) const\n    {\n      return internal::ploadt<Scalar, LoadMode>(m_storage.data() + index);\n    }\n};\n\\endcode\nWe let you look up the definition of internal::ploadt in GenericPacketMath.h and the internal::pload in src/Core/arch/SSE/PacketMath.h. It is very similar to the above for internal::pstore.\n\nLet's go back to CwiseBinaryOp::packet(). Once the packets from the vectors \\a v and \\a w have been returned, what does this function do? It calls m_functor.packetOp() on them. What is m_functor? Here we must remember what particular template specialization of CwiseBinaryOp we're dealing with:\n\\code\nCwiseBinaryOp<internal::scalar_sum_op<float>, VectorXf, VectorXf>\n\\endcode\nSo m_functor is an object of the empty class internal::scalar_sum_op<float>. As we mentioned above, don't worry about why we constructed an object of this empty class at all -- it's an implementation detail, the point is that some other functors need to store member data.\n\nAnyway, internal::scalar_sum_op is defined in src/Core/Functors.h:\n\\code\ntemplate<typename Scalar> struct internal::scalar_sum_op EIGEN_EMPTY_STRUCT {\n  inline const Scalar operator() (const Scalar& a, const Scalar& b) const { return a + b; }\n  template<typename PacketScalar>\n  inline const PacketScalar packetOp(const PacketScalar& a, const PacketScalar& b) const\n  { return internal::padd(a,b); }\n};\n\\endcode\nAs you can see, all what packetOp() does is to call internal::padd on the two packets. Here is the definition of internal::padd from src/Core/arch/SSE/PacketMath.h:\n\\code\ntemplate<> inline __m128  internal::padd(const __m128&  a, const __m128&  b) { return _mm_add_ps(a,b); }\n\\endcode\nHere, _mm_add_ps is a SSE-specific intrinsic function, representing a single SSE instruction.\n\nTo summarize, the loop\n\\code\n  for(int index = alignedStart; index < alignedEnd; index += packetSize)\n  {\n    dst.template copyPacket<Derived2, Aligned, internal::assign_traits<Derived1,Derived2>::SrcAlignment>(index, src);\n  }\n\\endcode\nhas been compiled to the following code: for \\a index going from 0 to the 11 ( = 48/4 - 1), read the i-th packet (of 4 floats) from the vector v and the i-th packet from the vector w using two __mm_load_ps SSE instructions, then add them together using a __mm_add_ps instruction, then store the result using a __mm_store_ps instruction.\n\nThere remains the second loop handling the last few (here, the last 2) coefficients:\n\\code\n  for(int index = alignedEnd; index < size; index++)\n    dst.copyCoeff(index, src);\n\\endcode\nHowever, it works just like the one we just explained, it is just simpler because there is no SSE vectorization involved here. copyPacket() becomes copyCoeff(), packet() becomes coeff(), writePacket() becomes coeffRef(). If you followed us this far, you can probably understand this part by yourself.\n\nWe see that all the C++ abstraction of Eigen goes away during compilation and that we indeed are precisely controlling which assembly instructions we emit. Such is the beauty of C++! Since we have such precise control over the emitted assembly instructions, but such complex logic to choose the right instructions, we can say that Eigen really behaves like an optimizing compiler. If you prefer, you could say that Eigen behaves like a script for the compiler. In a sense, C++ template metaprogramming is scripting the compiler -- and it's been shown that this scripting language is Turing-complete. See <a href=\"http://en.wikipedia.org/wiki/Template_metaprogramming\"> Wikipedia</a>.\n\n*/\n\n}\n"
  },
  {
    "path": "libs/eigen/doc/Manual.dox",
    "content": "\n// This file strutures pages and modules into a convenient hierarchical structure.\n\nnamespace Eigen {\n\n/** \\page UserManual_Generalities General topics\n  - \\subpage Eigen2ToEigen3\n  - \\subpage TopicFunctionTakingEigenTypes\n  - \\subpage TopicPreprocessorDirectives\n  - \\subpage TopicAssertions\n  - \\subpage TopicCustomizingEigen\n  - \\subpage TopicMultiThreading\n  - \\subpage TopicUsingIntelMKL\n  - \\subpage TopicPitfalls\n  - \\subpage TopicTemplateKeyword\n  - \\subpage UserManual_UnderstandingEigen\n*/\n  \n/** \\page UserManual_UnderstandingEigen Understanding Eigen\n  - \\subpage TopicInsideEigenExample\n  - \\subpage TopicClassHierarchy\n  - \\subpage TopicLazyEvaluation\n*/\n\n/** \\page UnclassifiedPages Unclassified pages\n  - \\subpage TopicResizing\n  - \\subpage TopicVectorization\n  - \\subpage TopicEigenExpressionTemplates\n  - \\subpage TopicScalarTypes\n  - \\subpage GettingStarted\n  - \\subpage TutorialSparse_example_details\n  - \\subpage TopicWritingEfficientProductExpression\n  - \\subpage Experimental\n*/\n\n\n/** \\defgroup Support_modules Support modules\n  * Category of modules which add support for external libraries.\n  */\n\n\n/** \\defgroup DenseMatrixManipulation_chapter Dense matrix and array manipulation */\n/** \\defgroup DenseMatrixManipulation_Alignement Alignment issues */\n/** \\defgroup DenseMatrixManipulation_Reference Reference */\n\n/** \\addtogroup TutorialMatrixClass\n    \\ingroup DenseMatrixManipulation_chapter */\n/** \\addtogroup TutorialMatrixArithmetic\n    \\ingroup DenseMatrixManipulation_chapter */\n/** \\addtogroup TutorialArrayClass\n    \\ingroup DenseMatrixManipulation_chapter */\n/** \\addtogroup TutorialBlockOperations\n    \\ingroup DenseMatrixManipulation_chapter */\n/** \\addtogroup TutorialAdvancedInitialization\n    \\ingroup DenseMatrixManipulation_chapter */\n/** \\addtogroup TutorialReductionsVisitorsBroadcasting\n    \\ingroup DenseMatrixManipulation_chapter */\n/** \\addtogroup TutorialMapClass\n    \\ingroup DenseMatrixManipulation_chapter */\n/** \\addtogroup TopicAliasing\n    \\ingroup DenseMatrixManipulation_chapter */\n/** \\addtogroup TopicStorageOrders\n    \\ingroup DenseMatrixManipulation_chapter */\n    \n/** \\addtogroup DenseMatrixManipulation_Alignement\n    \\ingroup DenseMatrixManipulation_chapter */\n/** \\addtogroup TopicUnalignedArrayAssert\n    \\ingroup DenseMatrixManipulation_Alignement */\n/** \\addtogroup TopicFixedSizeVectorizable\n    \\ingroup DenseMatrixManipulation_Alignement */\n/** \\addtogroup TopicStructHavingEigenMembers\n    \\ingroup DenseMatrixManipulation_Alignement */\n/** \\addtogroup TopicStlContainers\n    \\ingroup DenseMatrixManipulation_Alignement */\n/** \\addtogroup TopicPassingByValue\n    \\ingroup DenseMatrixManipulation_Alignement */\n/** \\addtogroup TopicWrongStackAlignment\n    \\ingroup DenseMatrixManipulation_Alignement */\n    \n/** \\addtogroup DenseMatrixManipulation_Reference\n    \\ingroup DenseMatrixManipulation_chapter */\n/** \\addtogroup Core_Module\n    \\ingroup DenseMatrixManipulation_Reference */  \n/** \\addtogroup Jacobi_Module\n    \\ingroup DenseMatrixManipulation_Reference */ \n/** \\addtogroup Householder_Module\n    \\ingroup DenseMatrixManipulation_Reference */ \n\n/** \\addtogroup QuickRefPage\n    \\ingroup DenseMatrixManipulation_chapter */\n\n\n/** \\defgroup DenseLinearSolvers_chapter Dense linear problems and decompositions */\n/** \\defgroup DenseLinearSolvers_Reference Reference */\n\n/** \\addtogroup TutorialLinearAlgebra\n    \\ingroup DenseLinearSolvers_chapter */\n/** \\addtogroup TopicLinearAlgebraDecompositions\n    \\ingroup DenseLinearSolvers_chapter */\n\n/** \\addtogroup DenseLinearSolvers_Reference\n    \\ingroup DenseLinearSolvers_chapter */\n/** \\addtogroup Cholesky_Module\n    \\ingroup DenseLinearSolvers_Reference */\n/** \\addtogroup LU_Module\n    \\ingroup DenseLinearSolvers_Reference */\n/** \\addtogroup QR_Module\n    \\ingroup DenseLinearSolvers_Reference */\n/** \\addtogroup SVD_Module\n    \\ingroup DenseLinearSolvers_Reference*/\n/** \\addtogroup Eigenvalues_Module\n    \\ingroup DenseLinearSolvers_Reference */\n\n\n\n\n/** \\defgroup Sparse_chapter Sparse linear algebra */\n/** \\defgroup Sparse_Reference Reference */\n\n/** \\addtogroup TutorialSparse\n    \\ingroup Sparse_chapter */\n/** \\addtogroup TopicSparseSystems\n    \\ingroup Sparse_chapter */\n/** \\addtogroup MatrixfreeSolverExample\n    \\ingroup Sparse_chapter */\n\n/** \\addtogroup Sparse_Reference\n    \\ingroup Sparse_chapter */\n/** \\addtogroup SparseCore_Module\n    \\ingroup Sparse_Reference */\n/** \\addtogroup OrderingMethods_Module\n    \\ingroup Sparse_Reference */\n/** \\addtogroup SparseCholesky_Module\n    \\ingroup Sparse_Reference */\n/** \\addtogroup SparseLU_Module\n    \\ingroup Sparse_Reference */\n/** \\addtogroup SparseQR_Module\n    \\ingroup Sparse_Reference */\n/** \\addtogroup IterativeLinearSolvers_Module\n    \\ingroup Sparse_Reference */\n/** \\addtogroup Sparse_Module\n    \\ingroup Sparse_Reference */\n/** \\addtogroup Support_modules\n    \\ingroup Sparse_Reference */    \n\n/** \\addtogroup SparseQuickRefPage\n    \\ingroup Sparse_chapter */\n\n\n/** \\defgroup Geometry_chapter Geometry */\n/** \\defgroup Geometry_Reference Reference */\n\n/** \\addtogroup TutorialGeometry\n    \\ingroup Geometry_chapter */\n    \n/** \\addtogroup Geometry_Reference\n    \\ingroup Geometry_chapter */\n/** \\addtogroup Geometry_Module\n    \\ingroup Geometry_Reference */\n/** \\addtogroup Splines_Module\n    \\ingroup Geometry_Reference */\n}\n"
  },
  {
    "path": "libs/eigen/doc/MatrixfreeSolverExample.dox",
    "content": "\nnamespace Eigen {\n\n/**\n\n\\eigenManualPage MatrixfreeSolverExample Matrix-free solvers\n\nIterative solvers such as ConjugateGradient and BiCGSTAB can be used in a matrix free context. To this end, user must provide a wrapper class inheriting EigenBase<> and implementing the following methods:\n - Index rows() and Index cols(): returns number of rows and columns respectively\n - operator* with and Eigen dense column vector\n - resize(rows,cols): needed for source compatibility (can stay empty)\n\nEigen::internal::traits<> must also be specialized for the wrapper type.\n\nFor efficiency purpose, one might also want to provide a custom preconditioner. Here is an example using ConjugateGradient and implementing also a custom Jacobi preconditioner:\n\\include matrixfree_cg.cpp\nOutput: \\verbinclude matrixfree_cg.out\n\n*/\n\n}"
  },
  {
    "path": "libs/eigen/doc/Overview.dox",
    "content": "namespace Eigen {\n\n/** \\mainpage notitle\n\nThis is the API documentation for Eigen3. You can <a href=\"eigen-doc.tgz\">download</a> it as a tgz archive for offline reading.\n\nYou're already an Eigen2 user? Here is a \\link Eigen2ToEigen3 Eigen2 to Eigen3 guide \\endlink to help porting your application.\n\nFor a first contact with Eigen, the best place is to have a look at the \\link GettingStarted getting started \\endlink page that show you how to write and compile your first program with Eigen.\n\nThen, the \\b quick \\b reference \\b pages give you a quite complete description of the API in a very condensed format that is specially useful to recall the syntax of a particular feature, or to have a quick look at the API. They currently cover the two following feature sets, and more will come in the future:\n  - \\link QuickRefPage [QuickRef] Dense matrix and array manipulations \\endlink\n  - \\link SparseQuickRefPage [QuickRef] Sparse linear algebra \\endlink\n\nYou're a MatLab user? There is also a <a href=\"AsciiQuickReference.txt\">short ASCII reference</a> with Matlab translations.\n  \nThe \\b main \\b documentation is organized into \\em chapters covering different domains of features.\nThey are themselves composed of \\em user \\em manual pages describing the different features in a comprehensive way, and \\em reference pages that gives you access to the API documentation through the related Eigen's \\em modules and \\em classes.\n\nUnder the  \\subpage UserManual_Generalities section, you will find documentation on more general topics such as preprocessor directives, controlling assertions, multi-threading, MKL support, some Eigen's internal insights, and much more...\n\nFinally, do not miss the search engine, useful to quickly get to the documentation of a given class or function.\n\nWant more? Checkout the <a href=\"unsupported/index.html\">\\em unsupported \\em modules </a> documentation.\n\n*/\n\n}\n"
  },
  {
    "path": "libs/eigen/doc/PassingByValue.dox",
    "content": "namespace Eigen {\n\n/** \\eigenManualPage TopicPassingByValue Passing Eigen objects by value to functions\n\nPassing objects by value is almost always a very bad idea in C++, as this means useless copies, and one should pass them by reference instead.\n\nWith Eigen, this is even more important: passing \\ref TopicFixedSizeVectorizable \"fixed-size vectorizable Eigen objects\" by value is not only inefficient, it can be illegal or make your program crash! And the reason is that these Eigen objects have alignment modifiers that aren't respected when they are passed by value.\n\nSo for example, a function like this, where v is passed by value:\n\n\\code\nvoid my_function(Eigen::Vector2d v);\n\\endcode\n\nneeds to be rewritten as follows, passing v by reference:\n\n\\code\nvoid my_function(const Eigen::Vector2d& v);\n\\endcode\n\nLikewise if you have a class having a Eigen object as member:\n\n\\code\nstruct Foo\n{\n  Eigen::Vector2d v;\n};\nvoid my_function(Foo v);\n\\endcode\n\nThis function also needs to be rewritten like this:\n\\code\nvoid my_function(const Foo& v);\n\\endcode\n\nNote that on the other hand, there is no problem with functions that return objects by value.\n\n*/\n\n}\n"
  },
  {
    "path": "libs/eigen/doc/Pitfalls.dox",
    "content": "namespace Eigen {\n\n/** \\page TopicPitfalls Common pitfalls\n\n\\section TopicPitfalls_template_keyword Compilation error with template methods\n\nSee this \\link TopicTemplateKeyword page \\endlink.\n\n\\section TopicPitfalls_auto_keyword C++11 and the auto keyword\n\nIn short: do not use the auto keywords with Eigen's expressions, unless you are 100% sure about what you are doing. In particular, do not use the auto keyword as a replacement for a Matrix<> type. Here is an example:\n\n\\code\nMatrixXd A, B;\nauto C = A*B;\nfor(...) { ... w = C * v;  ...}\n\\endcode\n\nIn this example, the type of C is not a MatrixXd but an abstract expression representing a matrix product and storing references to A and B. Therefore, the product of A*B will be carried out multiple times, once per iteration of the for loop. Moreover, if the coefficients of A or B change during the iteration, then C will evaluate to different values.\n\nHere is another example leading to a segfault:\n\\code\nauto C = ((A+B).eval()).transpose();\n// do something with C\n\\endcode\nThe problem is that eval() returns a temporary object (in this case a MatrixXd) which is then referenced by the Transpose<> expression. However, this temporary is deleted right after the first line, and there the C expression reference a dead object. The same issue might occur when sub expressions are automatically evaluated by Eigen as in the following example:\n\\code\nVectorXd u, v;\nauto C = u + (A*v).normalized();\n// do something with C\n\\endcode\nwhere the normalized() method has to evaluate the expensive product A*v to avoid evaluating it twice. On the other hand, the following example is perfectly fine:\n\\code\nauto C = (u + (A*v).normalized()).eval();\n\\endcode\nIn this case, C will be a regular VectorXd object.\n*/\n}\n"
  },
  {
    "path": "libs/eigen/doc/PreprocessorDirectives.dox",
    "content": "namespace Eigen {\n\n/** \\page TopicPreprocessorDirectives Preprocessor directives\n\nYou can control some aspects of %Eigen by defining the preprocessor tokens using \\c \\#define. These macros\nshould be defined before any %Eigen headers are included. Often they are best set in the project options.\n\nThis page lists the preprocesor tokens recognised by %Eigen.\n\n\\eigenAutoToc\n\n\n\\section TopicPreprocessorDirectivesMajor Macros with major effects\n\nThese macros have a major effect and typically break the API (Application Programming Interface) and/or the\nABI (Application Binary Interface). This can be rather dangerous: if parts of your program are compiled with\none option, and other parts (or libraries that you use) are compiled with another option, your program may\nfail to link or exhibit subtle bugs. Nevertheless, these options can be useful for people who know what they\nare doing.\n\n - \\b EIGEN2_SUPPORT - if defined, enables the Eigen2 compatibility mode. This is meant to ease the transition\n   of Eigen2 to Eigen3 (see \\ref Eigen2ToEigen3). Not defined by default.\n - \\b EIGEN2_SUPPORT_STAGEnn_xxx (for various values of nn and xxx) - staged migration path from Eigen2 to\n   Eigen3; see \\ref Eigen2SupportModes.\n - \\b EIGEN_DEFAULT_DENSE_INDEX_TYPE - the type for column and row indices in matrices, vectors and array\n   (DenseBase::Index). Set to \\c std::ptrdiff_t by default.\n - \\b EIGEN_DEFAULT_IO_FORMAT - the IOFormat to use when printing a matrix if no %IOFormat is specified.\n   Defaults to the %IOFormat constructed by the default constructor IOFormat::IOFormat().\n - \\b EIGEN_INITIALIZE_MATRICES_BY_ZERO - if defined, all entries of newly constructed matrices and arrays are\n   initialized to zero, as are new entries in matrices and arrays after resizing. Not defined by default.\n - \\b EIGEN_INITIALIZE_MATRICES_BY_NAN - if defined, all entries of newly constructed matrices and arrays are\n   initialized to NaN, as are new entries in matrices and arrays after resizing. This option is especially\n   useful for debugging purpose, though a memory tool like <a href=\"http://valgrind.org/\">valgrind</a> is\n   preferable. Not defined by default.\n - \\b EIGEN_NO_AUTOMATIC_RESIZING - if defined, the matrices (or arrays) on both sides of an assignment \n   <tt>a = b</tt> have to be of the same size; otherwise, %Eigen automatically resizes \\c a so that it is of\n   the correct size. Not defined by default.\n\n\n\\section TopicPreprocessorDirectivesAssertions Assertions\n\nThe %Eigen library contains many assertions to guard against programming errors, both at compile time and at\nrun time. However, these assertions do cost time and can thus be turned off.\n\n - \\b EIGEN_NO_DEBUG - disables %Eigen's assertions if defined. Not defined by default, unless the\n   \\c NDEBUG macro is defined (this is a standard C++ macro which disables all asserts). \n - \\b EIGEN_NO_STATIC_ASSERT - if defined, compile-time static assertions are replaced by runtime assertions; \n   this saves compilation time. Not defined by default.\n - \\b eigen_assert - macro with one argument that is used inside %Eigen for assertions. By default, it is\n   basically defined to be \\c assert, which aborts the program if the assertion is violated. Redefine this\n   macro if you want to do something else, like throwing an exception.\n - \\b EIGEN_MPL2_ONLY - disable non MPL2 compatible features, or in other words disable the features which\n   are still under the LGPL.\n\n\n\\section TopicPreprocessorDirectivesPerformance Alignment, vectorization and performance tweaking\n\n - \\b EIGEN_MALLOC_ALREADY_ALIGNED - Can be set to 0 or 1 to tell whether default system malloc already\n   returns aligned buffers. In not defined, then this information is automatically deduced from the compiler\n   and system preprocessor tokens.\n - \\b EIGEN_DONT_ALIGN - disables alignment completely. %Eigen will not try to align its objects and does not\n   expect that any objects passed to it are aligned. This will turn off vectorization. Not defined by default.\n - \\b EIGEN_DONT_ALIGN_STATICALLY - disables alignment of arrays on the stack. Not defined by default, unless\n   \\c EIGEN_DONT_ALIGN is defined.\n - \\b EIGEN_DONT_PARALLELIZE - if defined, this disables multi-threading. This is only relevant if you enabled OpenMP.\n   See \\ref TopicMultiThreading for details.\n - \\b EIGEN_DONT_VECTORIZE - disables explicit vectorization when defined. Not defined by default, unless \n   alignment is disabled by %Eigen's platform test or the user defining \\c EIGEN_DONT_ALIGN.\n - \\b EIGEN_FAST_MATH - enables some optimizations which might affect the accuracy of the result. This currently\n   enables the SSE vectorization of sin() and cos(), and speedups sqrt() for single precision. Defined to 1 by default.\n   Define it to 0 to disable.\n - \\b EIGEN_UNROLLING_LIMIT - defines the size of a loop to enable meta unrolling. Set it to zero to disable\n   unrolling. The size of a loop here is expressed in %Eigen's own notion of \"number of FLOPS\", it does not\n   correspond to the number of iterations or the number of instructions. The default is value 100.\n - \\b EIGEN_STACK_ALLOCATION_LIMIT - defines the maximum bytes for a buffer to be allocated on the stack. For internal\n   temporary buffers, dynamic memory allocation is employed as a fall back. For fixed-size matrices or arrays, exceeding\n   this threshold raises a compile time assertion. Use 0 to set no limit. Default is 128 KB.\n\n\n\\section TopicPreprocessorDirectivesPlugins Plugins\n\nIt is possible to add new methods to many fundamental classes in %Eigen by writing a plugin. As explained in\nthe section \\ref ExtendingMatrixBase, the plugin is specified by defining a \\c EIGEN_xxx_PLUGIN macro. The\nfollowing macros are supported; none of them are defined by default.\n\n - \\b EIGEN_ARRAY_PLUGIN - filename of plugin for extending the Array class.\n - \\b EIGEN_ARRAYBASE_PLUGIN - filename of plugin for extending the ArrayBase class.\n - \\b EIGEN_CWISE_PLUGIN - filename of plugin for extending the Cwise class.\n - \\b EIGEN_DENSEBASE_PLUGIN - filename of plugin for extending the DenseBase class.\n - \\b EIGEN_DYNAMICSPARSEMATRIX_PLUGIN - filename of plugin for extending the DynamicSparseMatrix class.\n - \\b EIGEN_MATRIX_PLUGIN - filename of plugin for extending the Matrix class.\n - \\b EIGEN_MATRIXBASE_PLUGIN - filename of plugin for extending the MatrixBase class.\n - \\b EIGEN_PLAINOBJECTBASE_PLUGIN - filename of plugin for extending the PlainObjectBase class.\n - \\b EIGEN_MAPBASE_PLUGIN - filename of plugin for extending the MapBase class.\n - \\b EIGEN_QUATERNIONBASE_PLUGIN - filename of plugin for extending the QuaternionBase class.\n - \\b EIGEN_SPARSEMATRIX_PLUGIN - filename of plugin for extending the SparseMatrix class.\n - \\b EIGEN_SPARSEMATRIXBASE_PLUGIN - filename of plugin for extending the SparseMatrixBase class.\n - \\b EIGEN_SPARSEVECTOR_PLUGIN - filename of plugin for extending the SparseVector class.\n - \\b EIGEN_TRANSFORM_PLUGIN - filename of plugin for extending the Transform class.\n - \\b EIGEN_FUNCTORS_PLUGIN - filename of plugin for adding new functors and specializations of functor_traits.\n\n\n\\section TopicPreprocessorDirectivesDevelopers Macros for Eigen developers\n\nThese macros are mainly meant for people developing %Eigen and for testing purposes. Even though, they might be useful for power users and the curious for debugging and testing purpose, they \\b should \\b not \\b be \\b used by real-word code.\n\n - \\b EIGEN_DEFAULT_TO_ROW_MAJOR - when defined, the default storage order for matrices becomes row-major\n   instead of column-major. Not defined by default.\n - \\b EIGEN_INTERNAL_DEBUGGING - if defined, enables assertions in %Eigen's internal routines. This is useful\n   for debugging %Eigen itself. Not defined by default.\n - \\b EIGEN_NO_MALLOC - if defined, any request from inside the %Eigen to allocate memory from the heap\n   results in an assertion failure. This is useful to check that some routine does not allocate memory\n   dynamically. Not defined by default.\n - \\b EIGEN_RUNTIME_NO_MALLOC - if defined, a new switch is introduced which can be turned on and off by\n   calling <tt>set_is_malloc_allowed(bool)</tt>. If malloc is not allowed and %Eigen tries to allocate memory\n   dynamically anyway, an assertion failure results. Not defined by default.\n\n*/\n\n}\n"
  },
  {
    "path": "libs/eigen/doc/QuickReference.dox",
    "content": "namespace Eigen {\n\n/** \\eigenManualPage QuickRefPage Quick reference guide\n\n\\eigenAutoToc\n\n<hr>\n\n<a href=\"#\" class=\"top\">top</a>\n\\section QuickRef_Headers Modules and Header files\n\nThe Eigen library is divided in a Core module and several additional modules. Each module has a corresponding header file which has to be included in order to use the module. The \\c %Dense and \\c Eigen header files are provided to conveniently gain access to several modules at once.\n\n<table class=\"manual\">\n<tr><th>Module</th><th>Header file</th><th>Contents</th></tr>\n<tr><td>\\link Core_Module Core \\endlink</td><td>\\code#include <Eigen/Core>\\endcode</td><td>Matrix and Array classes, basic linear algebra (including triangular and selfadjoint products), array manipulation</td></tr>\n<tr class=\"alt\"><td>\\link Geometry_Module Geometry \\endlink</td><td>\\code#include <Eigen/Geometry>\\endcode</td><td>Transform, Translation, Scaling, Rotation2D and 3D rotations (Quaternion, AngleAxis)</td></tr>\n<tr><td>\\link LU_Module LU \\endlink</td><td>\\code#include <Eigen/LU>\\endcode</td><td>Inverse, determinant, LU decompositions with solver (FullPivLU, PartialPivLU)</td></tr>\n<tr><td>\\link Cholesky_Module Cholesky \\endlink</td><td>\\code#include <Eigen/Cholesky>\\endcode</td><td>LLT and LDLT Cholesky factorization with solver</td></tr>\n<tr class=\"alt\"><td>\\link Householder_Module Householder \\endlink</td><td>\\code#include <Eigen/Householder>\\endcode</td><td>Householder transformations; this module is used by several linear algebra modules</td></tr>\n<tr><td>\\link SVD_Module SVD \\endlink</td><td>\\code#include <Eigen/SVD>\\endcode</td><td>SVD decomposition with least-squares solver (JacobiSVD)</td></tr>\n<tr class=\"alt\"><td>\\link QR_Module QR \\endlink</td><td>\\code#include <Eigen/QR>\\endcode</td><td>QR decomposition with solver (HouseholderQR, ColPivHouseholderQR, FullPivHouseholderQR)</td></tr>\n<tr><td>\\link Eigenvalues_Module Eigenvalues \\endlink</td><td>\\code#include <Eigen/Eigenvalues>\\endcode</td><td>Eigenvalue, eigenvector decompositions (EigenSolver, SelfAdjointEigenSolver, ComplexEigenSolver)</td></tr>\n<tr class=\"alt\"><td>\\link Sparse_modules Sparse \\endlink</td><td>\\code#include <Eigen/Sparse>\\endcode</td><td>%Sparse matrix storage and related basic linear algebra (SparseMatrix, DynamicSparseMatrix, SparseVector)</td></tr>\n<tr><td></td><td>\\code#include <Eigen/Dense>\\endcode</td><td>Includes Core, Geometry, LU, Cholesky, SVD, QR, and Eigenvalues header files</td></tr>\n<tr class=\"alt\"><td></td><td>\\code#include <Eigen/Eigen>\\endcode</td><td>Includes %Dense and %Sparse header files (the whole Eigen library)</td></tr>\n</table>\n\n<a href=\"#\" class=\"top\">top</a>\n\\section QuickRef_Types Array, matrix and vector types\n\n\n\\b Recall: Eigen provides two kinds of dense objects: mathematical matrices and vectors which are both represented by the template class Matrix, and general 1D and 2D arrays represented by the template class Array:\n\\code\ntypedef Matrix<Scalar, RowsAtCompileTime, ColsAtCompileTime, Options> MyMatrixType;\ntypedef Array<Scalar, RowsAtCompileTime, ColsAtCompileTime, Options> MyArrayType;\n\\endcode\n\n\\li \\c Scalar is the scalar type of the coefficients (e.g., \\c float, \\c double, \\c bool, \\c int, etc.).\n\\li \\c RowsAtCompileTime and \\c ColsAtCompileTime are the number of rows and columns of the matrix as known at compile-time or \\c Dynamic.\n\\li \\c Options can be \\c ColMajor or \\c RowMajor, default is \\c ColMajor. (see class Matrix for more options)\n\nAll combinations are allowed: you can have a matrix with a fixed number of rows and a dynamic number of columns, etc. The following are all valid:\n\\code\nMatrix<double, 6, Dynamic>                  // Dynamic number of columns (heap allocation)\nMatrix<double, Dynamic, 2>                  // Dynamic number of rows (heap allocation)\nMatrix<double, Dynamic, Dynamic, RowMajor>  // Fully dynamic, row major (heap allocation)\nMatrix<double, 13, 3>                       // Fully fixed (usually allocated on stack)\n\\endcode\n\nIn most cases, you can simply use one of the convenience typedefs for \\ref matrixtypedefs \"matrices\" and \\ref arraytypedefs \"arrays\". Some examples:\n<table class=\"example\">\n<tr><th>Matrices</th><th>Arrays</th></tr>\n<tr><td>\\code\nMatrix<float,Dynamic,Dynamic>   <=>   MatrixXf\nMatrix<double,Dynamic,1>        <=>   VectorXd\nMatrix<int,1,Dynamic>           <=>   RowVectorXi\nMatrix<float,3,3>               <=>   Matrix3f\nMatrix<float,4,1>               <=>   Vector4f\n\\endcode</td><td>\\code\nArray<float,Dynamic,Dynamic>    <=>   ArrayXXf\nArray<double,Dynamic,1>         <=>   ArrayXd\nArray<int,1,Dynamic>            <=>   RowArrayXi\nArray<float,3,3>                <=>   Array33f\nArray<float,4,1>                <=>   Array4f\n\\endcode</td></tr>\n</table>\n\nConversion between the matrix and array worlds:\n\\code\nArray44f a1, a1;\nMatrix4f m1, m2;\nm1 = a1 * a2;                     // coeffwise product, implicit conversion from array to matrix.\na1 = m1 * m2;                     // matrix product, implicit conversion from matrix to array.\na2 = a1 + m1.array();             // mixing array and matrix is forbidden\nm2 = a1.matrix() + m1;            // and explicit conversion is required.\nArrayWrapper<Matrix4f> m1a(m1);   // m1a is an alias for m1.array(), they share the same coefficients\nMatrixWrapper<Array44f> a1m(a1);\n\\endcode\n\nIn the rest of this document we will use the following symbols to emphasize the features which are specifics to a given kind of object:\n\\li <a name=\"matrixonly\"></a>\\matrixworld linear algebra matrix and vector only\n\\li <a name=\"arrayonly\"></a>\\arrayworld array objects only\n\n\\subsection QuickRef_Basics Basic matrix manipulation\n\n<table class=\"manual\">\n<tr><th></th><th>1D objects</th><th>2D objects</th><th>Notes</th></tr>\n<tr><td>Constructors</td>\n<td>\\code\nVector4d  v4;\nVector2f  v1(x, y);\nArray3i   v2(x, y, z);\nVector4d  v3(x, y, z, w);\n\nVectorXf  v5; // empty object\nArrayXf   v6(size);\n\\endcode</td><td>\\code\nMatrix4f  m1;\n\n\n\n\nMatrixXf  m5; // empty object\nMatrixXf  m6(nb_rows, nb_columns);\n\\endcode</td><td class=\"note\">\nBy default, the coefficients \\n are left uninitialized</td></tr>\n<tr class=\"alt\"><td>Comma initializer</td>\n<td>\\code\nVector3f  v1;     v1 << x, y, z;\nArrayXf   v2(4);  v2 << 1, 2, 3, 4;\n\n\\endcode</td><td>\\code\nMatrix3f  m1;   m1 << 1, 2, 3,\n                      4, 5, 6,\n                      7, 8, 9;\n\\endcode</td><td></td></tr>\n\n<tr><td>Comma initializer (bis)</td>\n<td colspan=\"2\">\n\\include Tutorial_commainit_02.cpp\n</td>\n<td>\noutput:\n\\verbinclude Tutorial_commainit_02.out\n</td>\n</tr>\n\n<tr class=\"alt\"><td>Runtime info</td>\n<td>\\code\nvector.size();\n\nvector.innerStride();\nvector.data();\n\\endcode</td><td>\\code\nmatrix.rows();          matrix.cols();\nmatrix.innerSize();     matrix.outerSize();\nmatrix.innerStride();   matrix.outerStride();\nmatrix.data();\n\\endcode</td><td class=\"note\">Inner/Outer* are storage order dependent</td></tr>\n<tr><td>Compile-time info</td>\n<td colspan=\"2\">\\code\nObjectType::Scalar              ObjectType::RowsAtCompileTime\nObjectType::RealScalar          ObjectType::ColsAtCompileTime\nObjectType::Index               ObjectType::SizeAtCompileTime\n\\endcode</td><td></td></tr>\n<tr class=\"alt\"><td>Resizing</td>\n<td>\\code\nvector.resize(size);\n\n\nvector.resizeLike(other_vector);\nvector.conservativeResize(size);\n\\endcode</td><td>\\code\nmatrix.resize(nb_rows, nb_cols);\nmatrix.resize(Eigen::NoChange, nb_cols);\nmatrix.resize(nb_rows, Eigen::NoChange);\nmatrix.resizeLike(other_matrix);\nmatrix.conservativeResize(nb_rows, nb_cols);\n\\endcode</td><td class=\"note\">no-op if the new sizes match,<br/>otherwise data are lost<br/><br/>resizing with data preservation</td></tr>\n\n<tr><td>Coeff access with \\n range checking</td>\n<td>\\code\nvector(i)     vector.x()\nvector[i]     vector.y()\n              vector.z()\n              vector.w()\n\\endcode</td><td>\\code\nmatrix(i,j)\n\\endcode</td><td class=\"note\">Range checking is disabled if \\n NDEBUG or EIGEN_NO_DEBUG is defined</td></tr>\n\n<tr class=\"alt\"><td>Coeff access without \\n range checking</td>\n<td>\\code\nvector.coeff(i)\nvector.coeffRef(i)\n\\endcode</td><td>\\code\nmatrix.coeff(i,j)\nmatrix.coeffRef(i,j)\n\\endcode</td><td></td></tr>\n\n<tr><td>Assignment/copy</td>\n<td colspan=\"2\">\\code\nobject = expression;\nobject_of_float = expression_of_double.cast<float>();\n\\endcode</td><td class=\"note\">the destination is automatically resized (if possible)</td></tr>\n\n</table>\n\n\\subsection QuickRef_PredefMat Predefined Matrices\n\n<table class=\"manual\">\n<tr>\n  <th>Fixed-size matrix or vector</th>\n  <th>Dynamic-size matrix</th>\n  <th>Dynamic-size vector</th>\n</tr>\n<tr style=\"border-bottom-style: none;\">\n  <td>\n\\code\ntypedef {Matrix3f|Array33f} FixedXD;\nFixedXD x;\n\nx = FixedXD::Zero();\nx = FixedXD::Ones();\nx = FixedXD::Constant(value);\nx = FixedXD::Random();\nx = FixedXD::LinSpaced(size, low, high);\n\nx.setZero();\nx.setOnes();\nx.setConstant(value);\nx.setRandom();\nx.setLinSpaced(size, low, high);\n\\endcode\n  </td>\n  <td>\n\\code\ntypedef {MatrixXf|ArrayXXf} Dynamic2D;\nDynamic2D x;\n\nx = Dynamic2D::Zero(rows, cols);\nx = Dynamic2D::Ones(rows, cols);\nx = Dynamic2D::Constant(rows, cols, value);\nx = Dynamic2D::Random(rows, cols);\nN/A\n\nx.setZero(rows, cols);\nx.setOnes(rows, cols);\nx.setConstant(rows, cols, value);\nx.setRandom(rows, cols);\nN/A\n\\endcode\n  </td>\n  <td>\n\\code\ntypedef {VectorXf|ArrayXf} Dynamic1D;\nDynamic1D x;\n\nx = Dynamic1D::Zero(size);\nx = Dynamic1D::Ones(size);\nx = Dynamic1D::Constant(size, value);\nx = Dynamic1D::Random(size);\nx = Dynamic1D::LinSpaced(size, low, high);\n\nx.setZero(size);\nx.setOnes(size);\nx.setConstant(size, value);\nx.setRandom(size);\nx.setLinSpaced(size, low, high);\n\\endcode\n  </td>\n</tr>\n\n<tr><td colspan=\"3\">Identity and \\link MatrixBase::Unit basis vectors \\endlink \\matrixworld</td></tr>\n<tr style=\"border-bottom-style: none;\">\n  <td>\n\\code\nx = FixedXD::Identity();\nx.setIdentity();\n\nVector3f::UnitX() // 1 0 0\nVector3f::UnitY() // 0 1 0\nVector3f::UnitZ() // 0 0 1\n\\endcode\n  </td>\n  <td>\n\\code\nx = Dynamic2D::Identity(rows, cols);\nx.setIdentity(rows, cols);\n\n\n\nN/A\n\\endcode\n  </td>\n  <td>\\code\nN/A\n\n\nVectorXf::Unit(size,i)\nVectorXf::Unit(4,1) == Vector4f(0,1,0,0)\n                    == Vector4f::UnitY()\n\\endcode\n  </td>\n</tr>\n</table>\n\n\n\n\\subsection QuickRef_Map Mapping external arrays\n\n<table class=\"manual\">\n<tr>\n<td>Contiguous \\n memory</td>\n<td>\\code\nfloat data[] = {1,2,3,4};\nMap<Vector3f> v1(data);       // uses v1 as a Vector3f object\nMap<ArrayXf>  v2(data,3);     // uses v2 as a ArrayXf object\nMap<Array22f> m1(data);       // uses m1 as a Array22f object\nMap<MatrixXf> m2(data,2,2);   // uses m2 as a MatrixXf object\n\\endcode</td>\n</tr>\n<tr>\n<td>Typical usage \\n of strides</td>\n<td>\\code\nfloat data[] = {1,2,3,4,5,6,7,8,9};\nMap<VectorXf,0,InnerStride<2> >  v1(data,3);                      // = [1,3,5]\nMap<VectorXf,0,InnerStride<> >   v2(data,3,InnerStride<>(3));     // = [1,4,7]\nMap<MatrixXf,0,OuterStride<3> >  m2(data,2,3);                    // both lines     |1,4,7|\nMap<MatrixXf,0,OuterStride<> >   m1(data,2,3,OuterStride<>(3));   // are equal to:  |2,5,8|\n\\endcode</td>\n</tr>\n</table>\n\n\n<a href=\"#\" class=\"top\">top</a>\n\\section QuickRef_ArithmeticOperators Arithmetic Operators\n\n<table class=\"manual\">\n<tr><td>\nadd \\n subtract</td><td>\\code\nmat3 = mat1 + mat2;           mat3 += mat1;\nmat3 = mat1 - mat2;           mat3 -= mat1;\\endcode\n</td></tr>\n<tr class=\"alt\"><td>\nscalar product</td><td>\\code\nmat3 = mat1 * s1;             mat3 *= s1;           mat3 = s1 * mat1;\nmat3 = mat1 / s1;             mat3 /= s1;\\endcode\n</td></tr>\n<tr><td>\nmatrix/vector \\n products \\matrixworld</td><td>\\code\ncol2 = mat1 * col1;\nrow2 = row1 * mat1;           row1 *= mat1;\nmat3 = mat1 * mat2;           mat3 *= mat1; \\endcode\n</td></tr>\n<tr class=\"alt\"><td>\ntransposition \\n adjoint \\matrixworld</td><td>\\code\nmat1 = mat2.transpose();      mat1.transposeInPlace();\nmat1 = mat2.adjoint();        mat1.adjointInPlace();\n\\endcode\n</td></tr>\n<tr><td>\n\\link MatrixBase::dot() dot \\endlink product \\n inner product \\matrixworld</td><td>\\code\nscalar = vec1.dot(vec2);\nscalar = col1.adjoint() * col2;\nscalar = (col1.adjoint() * col2).value();\\endcode\n</td></tr>\n<tr class=\"alt\"><td>\nouter product \\matrixworld</td><td>\\code\nmat = col1 * col2.transpose();\\endcode\n</td></tr>\n\n<tr><td>\n\\link MatrixBase::norm() norm \\endlink \\n \\link MatrixBase::normalized() normalization \\endlink \\matrixworld</td><td>\\code\nscalar = vec1.norm();         scalar = vec1.squaredNorm()\nvec2 = vec1.normalized();     vec1.normalize(); // inplace \\endcode\n</td></tr>\n\n<tr class=\"alt\"><td>\n\\link MatrixBase::cross() cross product \\endlink \\matrixworld</td><td>\\code\n#include <Eigen/Geometry>\nvec3 = vec1.cross(vec2);\\endcode</td></tr>\n</table>\n\n<a href=\"#\" class=\"top\">top</a>\n\\section QuickRef_Coeffwise Coefficient-wise \\& Array operators\nCoefficient-wise operators for matrices and vectors:\n<table class=\"manual\">\n<tr><th>Matrix API \\matrixworld</th><th>Via Array conversions</th></tr>\n<tr><td>\\code\nmat1.cwiseMin(mat2)\nmat1.cwiseMax(mat2)\nmat1.cwiseAbs2()\nmat1.cwiseAbs()\nmat1.cwiseSqrt()\nmat1.cwiseProduct(mat2)\nmat1.cwiseQuotient(mat2)\\endcode\n</td><td>\\code\nmat1.array().min(mat2.array())\nmat1.array().max(mat2.array())\nmat1.array().abs2()\nmat1.array().abs()\nmat1.array().sqrt()\nmat1.array() * mat2.array()\nmat1.array() / mat2.array()\n\\endcode</td></tr>\n</table>\n\nIt is also very simple to apply any user defined function \\c foo using DenseBase::unaryExpr together with std::ptr_fun:\n\\code mat1.unaryExpr(std::ptr_fun(foo))\\endcode\n\nArray operators:\\arrayworld\n\n<table class=\"manual\">\n<tr><td>Arithmetic operators</td><td>\\code\narray1 * array2     array1 / array2     array1 *= array2    array1 /= array2\narray1 + scalar     array1 - scalar     array1 += scalar    array1 -= scalar\n\\endcode</td></tr>\n<tr><td>Comparisons</td><td>\\code\narray1 < array2     array1 > array2     array1 < scalar     array1 > scalar\narray1 <= array2    array1 >= array2    array1 <= scalar    array1 >= scalar\narray1 == array2    array1 != array2    array1 == scalar    array1 != scalar\n\\endcode</td></tr>\n<tr><td>Trigo, power, and \\n misc functions \\n and the STL variants</td><td>\\code\narray1.min(array2)            \narray1.max(array2)            \narray1.abs2()\narray1.abs()                  abs(array1)\narray1.sqrt()                 sqrt(array1)\narray1.log()                  log(array1)\narray1.exp()                  exp(array1)\narray1.pow(exponent)          pow(array1,exponent)\narray1.square()\narray1.cube()\narray1.inverse()\narray1.sin()                  sin(array1)\narray1.cos()                  cos(array1)\narray1.tan()                  tan(array1)\narray1.asin()                 asin(array1)\narray1.acos()                 acos(array1)\n\\endcode\n</td></tr>\n</table>\n\n<a href=\"#\" class=\"top\">top</a>\n\\section QuickRef_Reductions Reductions\n\nEigen provides several reduction methods such as:\n\\link DenseBase::minCoeff() minCoeff() \\endlink, \\link DenseBase::maxCoeff() maxCoeff() \\endlink,\n\\link DenseBase::sum() sum() \\endlink, \\link DenseBase::prod() prod() \\endlink,\n\\link MatrixBase::trace() trace() \\endlink \\matrixworld,\n\\link MatrixBase::norm() norm() \\endlink \\matrixworld, \\link MatrixBase::squaredNorm() squaredNorm() \\endlink \\matrixworld,\n\\link DenseBase::all() all() \\endlink, and \\link DenseBase::any() any() \\endlink.\nAll reduction operations can be done matrix-wise,\n\\link DenseBase::colwise() column-wise \\endlink or\n\\link DenseBase::rowwise() row-wise \\endlink. Usage example:\n<table class=\"manual\">\n<tr><td rowspan=\"3\" style=\"border-right-style:dashed;vertical-align:middle\">\\code\n      5 3 1\nmat = 2 7 8\n      9 4 6 \\endcode\n</td> <td>\\code mat.minCoeff(); \\endcode</td><td>\\code 1 \\endcode</td></tr>\n<tr class=\"alt\"><td>\\code mat.colwise().minCoeff(); \\endcode</td><td>\\code 2 3 1 \\endcode</td></tr>\n<tr style=\"vertical-align:middle\"><td>\\code mat.rowwise().minCoeff(); \\endcode</td><td>\\code\n1\n2\n4\n\\endcode</td></tr>\n</table>\n\nSpecial versions of \\link DenseBase::minCoeff(IndexType*,IndexType*) const minCoeff \\endlink and \\link DenseBase::maxCoeff(IndexType*,IndexType*) const maxCoeff \\endlink:\n\\code\nint i, j;\ns = vector.minCoeff(&i);        // s == vector[i]\ns = matrix.maxCoeff(&i, &j);    // s == matrix(i,j)\n\\endcode\nTypical use cases of all() and any():\n\\code\nif((array1 > 0).all()) ...      // if all coefficients of array1 are greater than 0 ...\nif((array1 < array2).any()) ... // if there exist a pair i,j such that array1(i,j) < array2(i,j) ...\n\\endcode\n\n\n<a href=\"#\" class=\"top\">top</a>\\section QuickRef_Blocks Sub-matrices\n\nRead-write access to a \\link DenseBase::col(Index) column \\endlink\nor a \\link DenseBase::row(Index) row \\endlink of a matrix (or array):\n\\code\nmat1.row(i) = mat2.col(j);\nmat1.col(j1).swap(mat1.col(j2));\n\\endcode\n\nRead-write access to sub-vectors:\n<table class=\"manual\">\n<tr>\n<th>Default versions</th>\n<th>Optimized versions when the size \\n is known at compile time</th></tr>\n<th></th>\n\n<tr><td>\\code vec1.head(n)\\endcode</td><td>\\code vec1.head<n>()\\endcode</td><td>the first \\c n coeffs </td></tr>\n<tr><td>\\code vec1.tail(n)\\endcode</td><td>\\code vec1.tail<n>()\\endcode</td><td>the last \\c n coeffs </td></tr>\n<tr><td>\\code vec1.segment(pos,n)\\endcode</td><td>\\code vec1.segment<n>(pos)\\endcode</td>\n    <td>the \\c n coeffs in the \\n range [\\c pos : \\c pos + \\c n - 1]</td></tr>\n<tr class=\"alt\"><td colspan=\"3\">\n\nRead-write access to sub-matrices:</td></tr>\n<tr>\n  <td>\\code mat1.block(i,j,rows,cols)\\endcode\n      \\link DenseBase::block(Index,Index,Index,Index) (more) \\endlink</td>\n  <td>\\code mat1.block<rows,cols>(i,j)\\endcode\n      \\link DenseBase::block(Index,Index) (more) \\endlink</td>\n  <td>the \\c rows x \\c cols sub-matrix \\n starting from position (\\c i,\\c j)</td></tr>\n<tr><td>\\code\n mat1.topLeftCorner(rows,cols)\n mat1.topRightCorner(rows,cols)\n mat1.bottomLeftCorner(rows,cols)\n mat1.bottomRightCorner(rows,cols)\\endcode\n <td>\\code\n mat1.topLeftCorner<rows,cols>()\n mat1.topRightCorner<rows,cols>()\n mat1.bottomLeftCorner<rows,cols>()\n mat1.bottomRightCorner<rows,cols>()\\endcode\n <td>the \\c rows x \\c cols sub-matrix \\n taken in one of the four corners</td></tr>\n <tr><td>\\code\n mat1.topRows(rows)\n mat1.bottomRows(rows)\n mat1.leftCols(cols)\n mat1.rightCols(cols)\\endcode\n <td>\\code\n mat1.topRows<rows>()\n mat1.bottomRows<rows>()\n mat1.leftCols<cols>()\n mat1.rightCols<cols>()\\endcode\n <td>specialized versions of block() \\n when the block fit two corners</td></tr>\n</table>\n\n\n\n<a href=\"#\" class=\"top\">top</a>\\section QuickRef_Misc Miscellaneous operations\n\n\\subsection QuickRef_Reverse Reverse\nVectors, rows, and/or columns of a matrix can be reversed (see DenseBase::reverse(), DenseBase::reverseInPlace(), VectorwiseOp::reverse()).\n\\code\nvec.reverse()           mat.colwise().reverse()   mat.rowwise().reverse()\nvec.reverseInPlace()\n\\endcode\n\n\\subsection QuickRef_Replicate Replicate\nVectors, matrices, rows, and/or columns can be replicated in any direction (see DenseBase::replicate(), VectorwiseOp::replicate())\n\\code\nvec.replicate(times)                                          vec.replicate<Times>\nmat.replicate(vertical_times, horizontal_times)               mat.replicate<VerticalTimes, HorizontalTimes>()\nmat.colwise().replicate(vertical_times, horizontal_times)     mat.colwise().replicate<VerticalTimes, HorizontalTimes>()\nmat.rowwise().replicate(vertical_times, horizontal_times)     mat.rowwise().replicate<VerticalTimes, HorizontalTimes>()\n\\endcode\n\n\n<a href=\"#\" class=\"top\">top</a>\\section QuickRef_DiagTriSymm Diagonal, Triangular, and Self-adjoint matrices\n(matrix world \\matrixworld)\n\n\\subsection QuickRef_Diagonal Diagonal matrices\n\n<table class=\"example\">\n<tr><th>Operation</th><th>Code</th></tr>\n<tr><td>\nview a vector \\link MatrixBase::asDiagonal() as a diagonal matrix \\endlink \\n </td><td>\\code\nmat1 = vec1.asDiagonal();\\endcode\n</td></tr>\n<tr><td>\nDeclare a diagonal matrix</td><td>\\code\nDiagonalMatrix<Scalar,SizeAtCompileTime> diag1(size);\ndiag1.diagonal() = vector;\\endcode\n</td></tr>\n<tr><td>Access the \\link MatrixBase::diagonal() diagonal \\endlink and \\link MatrixBase::diagonal(Index) super/sub diagonals \\endlink of a matrix as a vector (read/write)</td>\n <td>\\code\nvec1 = mat1.diagonal();        mat1.diagonal() = vec1;      // main diagonal\nvec1 = mat1.diagonal(+n);      mat1.diagonal(+n) = vec1;    // n-th super diagonal\nvec1 = mat1.diagonal(-n);      mat1.diagonal(-n) = vec1;    // n-th sub diagonal\nvec1 = mat1.diagonal<1>();     mat1.diagonal<1>() = vec1;   // first super diagonal\nvec1 = mat1.diagonal<-2>();    mat1.diagonal<-2>() = vec1;  // second sub diagonal\n\\endcode</td>\n</tr>\n\n<tr><td>Optimized products and inverse</td>\n <td>\\code\nmat3  = scalar * diag1 * mat1;\nmat3 += scalar * mat1 * vec1.asDiagonal();\nmat3 = vec1.asDiagonal().inverse() * mat1\nmat3 = mat1 * diag1.inverse()\n\\endcode</td>\n</tr>\n\n</table>\n\n\\subsection QuickRef_TriangularView Triangular views\n\nTriangularView gives a view on a triangular part of a dense matrix and allows to perform optimized operations on it. The opposite triangular part is never referenced and can be used to store other information.\n\n\\note The .triangularView() template member function requires the \\c template keyword if it is used on an\nobject of a type that depends on a template parameter; see \\ref TopicTemplateKeyword for details.\n\n<table class=\"example\">\n<tr><th>Operation</th><th>Code</th></tr>\n<tr><td>\nReference to a triangular with optional \\n\nunit or null diagonal (read/write):\n</td><td>\\code\nm.triangularView<Xxx>()\n\\endcode \\n\n\\c Xxx = ::Upper, ::Lower, ::StrictlyUpper, ::StrictlyLower, ::UnitUpper, ::UnitLower\n</td></tr>\n<tr><td>\nWriting to a specific triangular part:\\n (only the referenced triangular part is evaluated)\n</td><td>\\code\nm1.triangularView<Eigen::Lower>() = m2 + m3 \\endcode\n</td></tr>\n<tr><td>\nConversion to a dense matrix setting the opposite triangular part to zero:\n</td><td>\\code\nm2 = m1.triangularView<Eigen::UnitUpper>()\\endcode\n</td></tr>\n<tr><td>\nProducts:\n</td><td>\\code\nm3 += s1 * m1.adjoint().triangularView<Eigen::UnitUpper>() * m2\nm3 -= s1 * m2.conjugate() * m1.adjoint().triangularView<Eigen::Lower>() \\endcode\n</td></tr>\n<tr><td>\nSolving linear equations:\\n\n\\f$ M_2 := L_1^{-1} M_2 \\f$ \\n\n\\f$ M_3 := {L_1^*}^{-1} M_3 \\f$ \\n\n\\f$ M_4 := M_4 U_1^{-1} \\f$\n</td><td>\\n \\code\nL1.triangularView<Eigen::UnitLower>().solveInPlace(M2)\nL1.triangularView<Eigen::Lower>().adjoint().solveInPlace(M3)\nU1.triangularView<Eigen::Upper>().solveInPlace<OnTheRight>(M4)\\endcode\n</td></tr>\n</table>\n\n\\subsection QuickRef_SelfadjointMatrix Symmetric/selfadjoint views\n\nJust as for triangular matrix, you can reference any triangular part of a square matrix to see it as a selfadjoint\nmatrix and perform special and optimized operations. Again the opposite triangular part is never referenced and can be\nused to store other information.\n\n\\note The .selfadjointView() template member function requires the \\c template keyword if it is used on an\nobject of a type that depends on a template parameter; see \\ref TopicTemplateKeyword for details.\n\n<table class=\"example\">\n<tr><th>Operation</th><th>Code</th></tr>\n<tr><td>\nConversion to a dense matrix:\n</td><td>\\code\nm2 = m.selfadjointView<Eigen::Lower>();\\endcode\n</td></tr>\n<tr><td>\nProduct with another general matrix or vector:\n</td><td>\\code\nm3  = s1 * m1.conjugate().selfadjointView<Eigen::Upper>() * m3;\nm3 -= s1 * m3.adjoint() * m1.selfadjointView<Eigen::Lower>();\\endcode\n</td></tr>\n<tr><td>\nRank 1 and rank K update: \\n\n\\f$ upper(M_1) \\mathrel{{+}{=}} s_1 M_2 M_2^* \\f$ \\n\n\\f$ lower(M_1) \\mathbin{{-}{=}} M_2^* M_2 \\f$\n</td><td>\\n \\code\nM1.selfadjointView<Eigen::Upper>().rankUpdate(M2,s1);\nM1.selfadjointView<Eigen::Lower>().rankUpdate(M2.adjoint(),-1); \\endcode\n</td></tr>\n<tr><td>\nRank 2 update: (\\f$ M \\mathrel{{+}{=}} s u v^* + s v u^* \\f$)\n</td><td>\\code\nM.selfadjointView<Eigen::Upper>().rankUpdate(u,v,s);\n\\endcode\n</td></tr>\n<tr><td>\nSolving linear equations:\\n(\\f$ M_2 := M_1^{-1} M_2 \\f$)\n</td><td>\\code\n// via a standard Cholesky factorization\nm2 = m1.selfadjointView<Eigen::Upper>().llt().solve(m2);\n// via a Cholesky factorization with pivoting\nm2 = m1.selfadjointView<Eigen::Lower>().ldlt().solve(m2);\n\\endcode\n</td></tr>\n</table>\n\n*/\n\n/*\n<table class=\"tutorial_code\">\n<tr><td>\n\\link MatrixBase::asDiagonal() make a diagonal matrix \\endlink \\n from a vector </td><td>\\code\nmat1 = vec1.asDiagonal();\\endcode\n</td></tr>\n<tr><td>\nDeclare a diagonal matrix</td><td>\\code\nDiagonalMatrix<Scalar,SizeAtCompileTime> diag1(size);\ndiag1.diagonal() = vector;\\endcode\n</td></tr>\n<tr><td>Access \\link MatrixBase::diagonal() the diagonal and super/sub diagonals of a matrix \\endlink as a vector (read/write)</td>\n <td>\\code\nvec1 = mat1.diagonal();            mat1.diagonal() = vec1;      // main diagonal\nvec1 = mat1.diagonal(+n);          mat1.diagonal(+n) = vec1;    // n-th super diagonal\nvec1 = mat1.diagonal(-n);          mat1.diagonal(-n) = vec1;    // n-th sub diagonal\nvec1 = mat1.diagonal<1>();         mat1.diagonal<1>() = vec1;   // first super diagonal\nvec1 = mat1.diagonal<-2>();        mat1.diagonal<-2>() = vec1;  // second sub diagonal\n\\endcode</td>\n</tr>\n\n<tr><td>View on a triangular part of a matrix (read/write)</td>\n <td>\\code\nmat2 = mat1.triangularView<Xxx>();\n// Xxx = Upper, Lower, StrictlyUpper, StrictlyLower, UnitUpper, UnitLower\nmat1.triangularView<Upper>() = mat2 + mat3; // only the upper part is evaluated and referenced\n\\endcode</td></tr>\n\n<tr><td>View a triangular part as a symmetric/self-adjoint matrix (read/write)</td>\n <td>\\code\nmat2 = mat1.selfadjointView<Xxx>();     // Xxx = Upper or Lower\nmat1.selfadjointView<Upper>() = mat2 + mat2.adjoint();  // evaluated and write to the upper triangular part only\n\\endcode</td></tr>\n\n</table>\n\nOptimized products:\n\\code\nmat3 += scalar * vec1.asDiagonal() * mat1\nmat3 += scalar * mat1 * vec1.asDiagonal()\nmat3.noalias() += scalar * mat1.triangularView<Xxx>() * mat2\nmat3.noalias() += scalar * mat2 * mat1.triangularView<Xxx>()\nmat3.noalias() += scalar * mat1.selfadjointView<Upper or Lower>() * mat2\nmat3.noalias() += scalar * mat2 * mat1.selfadjointView<Upper or Lower>()\nmat1.selfadjointView<Upper or Lower>().rankUpdate(mat2);\nmat1.selfadjointView<Upper or Lower>().rankUpdate(mat2.adjoint(), scalar);\n\\endcode\n\nInverse products: (all are optimized)\n\\code\nmat3 = vec1.asDiagonal().inverse() * mat1\nmat3 = mat1 * diag1.inverse()\nmat1.triangularView<Xxx>().solveInPlace(mat2)\nmat1.triangularView<Xxx>().solveInPlace<OnTheRight>(mat2)\nmat2 = mat1.selfadjointView<Upper or Lower>().llt().solve(mat2)\n\\endcode\n\n*/\n}\n"
  },
  {
    "path": "libs/eigen/doc/QuickStartGuide.dox",
    "content": "namespace Eigen {\n\n/** \\page GettingStarted Getting started\n\n\\eigenAutoToc\n\nThis is a very short guide on how to get started with Eigen. It has a dual purpose. It serves as a minimal introduction to the Eigen library for people who want to start coding as soon as possible. You can also read this page as the first part of the Tutorial, which explains the library in more detail; in this case you will continue with \\ref TutorialMatrixClass.\n\n\\section GettingStartedInstallation How to \"install\" Eigen?\n\nIn order to use Eigen, you just need to download and extract Eigen's source code (see <a href=\"http://eigen.tuxfamily.org/index.php?title=Main_Page#Download\">the wiki</a> for download instructions). In fact, the header files in the \\c Eigen subdirectory are the only files required to compile programs using Eigen. The header files are the same for all platforms. It is not necessary to use CMake or install anything.\n\n\n\\section GettingStartedFirstProgram A simple first program\n\nHere is a rather simple program to get you started.\n\n\\include QuickStart_example.cpp\n\nWe will explain the program after telling you how to compile it.\n\n\n\\section GettingStartedCompiling Compiling and running your first program\n\nThere is no library to link to. The only thing that you need to keep in mind when compiling the above program is that the compiler must be able to find the Eigen header files. The directory in which you placed Eigen's source code must be in the include path. With GCC you use the -I option to achieve this, so you can compile the program with a command like this:\n\n\\code g++ -I /path/to/eigen/ my_program.cpp -o my_program \\endcode\n\nOn Linux or Mac OS X, another option is to symlink or copy the Eigen folder into /usr/local/include/. This way, you can compile the program with:\n\n\\code g++ my_program.cpp -o my_program \\endcode\n\nWhen you run the program, it produces the following output:\n\n\\include QuickStart_example.out\n\n\n\\section GettingStartedExplanation Explanation of the first program\n\nThe Eigen header files define many types, but for simple applications it may be enough to use only the \\c MatrixXd type. This represents a matrix of arbitrary size (hence the \\c X in \\c MatrixXd), in which every entry is a \\c double (hence the \\c d in \\c MatrixXd). See the \\ref QuickRef_Types \"quick reference guide\" for an overview of the different types you can use to represent a matrix.\n\nThe \\c Eigen/Dense header file defines all member functions for the MatrixXd type and related types (see also the \\ref QuickRef_Headers \"table of header files\"). All classes and functions defined in this header file (and other Eigen header files) are in the \\c Eigen namespace. \n\nThe first line of the \\c main function declares a variable of type \\c MatrixXd and specifies that it is a matrix with 2 rows and 2 columns (the entries are not initialized). The statement <tt>m(0,0) = 3</tt> sets the entry in the top-left corner to 3. You need to use round parentheses to refer to entries in the matrix. As usual in computer science, the index of the first index is 0, as opposed to the convention in mathematics that the first index is 1.\n\nThe following three statements sets the other three entries. The final line outputs the matrix \\c m to the standard output stream.\n\n\n\\section GettingStartedExample2 Example 2: Matrices and vectors\n\nHere is another example, which combines matrices with vectors. Concentrate on the left-hand program for now; we will talk about the right-hand program later.\n\n<table class=\"manual\">\n<tr><th>Size set at run time:</th><th>Size set at compile time:</th></tr>\n<tr><td>\n\\include QuickStart_example2_dynamic.cpp\n</td>\n<td>\n\\include QuickStart_example2_fixed.cpp\n</td></tr></table>\n\nThe output is as follows:\n\n\\include QuickStart_example2_dynamic.out\n\n\n\\section GettingStartedExplanation2 Explanation of the second example\n\nThe second example starts by declaring a 3-by-3 matrix \\c m which is initialized using the \\link DenseBase::Random(Index,Index) Random() \\endlink method with random values between -1 and 1. The next line applies a linear mapping such that the values are between 10 and 110. The function call \\link DenseBase::Constant(Index,Index,const Scalar&) MatrixXd::Constant\\endlink(3,3,1.2) returns a 3-by-3 matrix expression having all coefficients equal to 1.2. The rest is standard arithmetics.\n\nThe next line of the \\c main function introduces a new type: \\c VectorXd. This represents a (column) vector of arbitrary size. Here, the vector \\c v is created to contain \\c 3 coefficients which are left unitialized. The one but last line uses the so-called comma-initializer, explained in \\ref TutorialAdvancedInitialization, to set all coefficients of the vector \\c v to be as follows:\n\n\\f[\nv =\n\\begin{bmatrix}\n  1 \\\\\n  2 \\\\\n  3\n\\end{bmatrix}.\n\\f]\n\nThe final line of the program multiplies the matrix \\c m with the vector \\c v and outputs the result.\n\nNow look back at the second example program. We presented two versions of it. In the version in the left column, the matrix is of type \\c MatrixXd which represents matrices of arbitrary size. The version in the right column is similar, except that the matrix is of type \\c Matrix3d, which represents matrices of a fixed size (here 3-by-3). Because the type already encodes the size of the matrix, it is not necessary to specify the size in the constructor; compare <tt>MatrixXd m(3,3)</tt> with <tt>Matrix3d m</tt>. Similarly, we have \\c VectorXd on the left (arbitrary size) versus \\c Vector3d on the right (fixed size). Note that here the coefficients of vector \\c v are directly set in the constructor, though the same syntax of the left example could be used too.\n\nThe use of fixed-size matrices and vectors has two advantages. The compiler emits better (faster) code because it knows the size of the matrices and vectors. Specifying the size in the type also allows for more rigorous checking at compile-time. For instance, the compiler will complain if you try to multiply a \\c Matrix4d (a 4-by-4 matrix) with a \\c Vector3d (a vector of size 3). However, the use of many types increases compilation time and the size of the executable. The size of the matrix may also not be known at compile-time. A rule of thumb is to use fixed-size matrices for size 4-by-4 and smaller.\n\n\n\\section GettingStartedConclusion Where to go from here?\n\nIt's worth taking the time to read the  \\ref TutorialMatrixClass \"long tutorial\".\n\nHowever if you think you don't need it, you can directly use the classes documentation and our \\ref QuickRefPage.\n\n\\li \\b Next: \\ref TutorialMatrixClass\n\n*/\n\n}\n\n"
  },
  {
    "path": "libs/eigen/doc/SparseLinearSystems.dox",
    "content": "namespace Eigen {\n/** \\eigenManualPage TopicSparseSystems Solving Sparse Linear Systems\nIn Eigen, there are several methods available to solve linear systems when the coefficient matrix is sparse. Because of the special representation of this class of matrices, special care should be taken in order to get a good performance. See \\ref TutorialSparse for a detailed introduction about sparse matrices in Eigen. This page lists the sparse solvers available in Eigen. The main steps that are common to all these linear solvers are introduced as well. Depending on the properties of the matrix, the desired accuracy, the end-user is able to tune those steps in order to improve the performance of its code. Note that it is not required to know deeply what's hiding behind these steps: the last section presents a benchmark routine that can be easily used to get an insight on the performance of all the available solvers. \n\n\\eigenAutoToc\n\n\\section TutorialSparseDirectSolvers Sparse solvers\n\n%Eigen currently provides a limited set of built-in solvers, as well as wrappers to external solver libraries.\nThey are summarized in the following table:\n\n<table class=\"manual\">\n<tr><th>Class</th><th>Module</th><th>Solver kind</th><th>Matrix kind</th><th>Features related to performance</th>\n    <th>Dependencies,License</th><th class=\"width20em\"><p>Notes</p></th></tr>\n<tr><td>SimplicialLLT    </td><td>\\link SparseCholesky_Module SparseCholesky \\endlink</td><td>Direct LLt factorization</td><td>SPD</td><td>Fill-in reducing</td>\n    <td>built-in, LGPL</td>\n    <td>SimplicialLDLT is often preferable</td></tr>\n<tr><td>SimplicialLDLT   </td><td>\\link SparseCholesky_Module SparseCholesky \\endlink</td><td>Direct LDLt factorization</td><td>SPD</td><td>Fill-in reducing</td>\n    <td>built-in, LGPL</td>\n    <td>Recommended for very sparse and not too large problems (e.g., 2D Poisson eq.)</td></tr>\n<tr><td>ConjugateGradient</td><td>\\link IterativeLinearSolvers_Module IterativeLinearSolvers \\endlink</td><td>Classic iterative CG</td><td>SPD</td><td>Preconditionning</td>\n    <td>built-in, MPL2</td>\n    <td>Recommended for large symmetric problems (e.g., 3D Poisson eq.)</td></tr>\n<tr><td>BiCGSTAB</td><td>\\link IterativeLinearSolvers_Module IterativeLinearSolvers \\endlink</td><td>Iterative stabilized bi-conjugate gradient</td><td>Square</td><td>Preconditionning</td>\n    <td>built-in, MPL2</td>\n    <td>To speedup the convergence, try it with the \\ref IncompleteLUT preconditioner.</td></tr>\n<tr><td>SparseLU</td> <td>\\link SparseLU_Module SparseLU \\endlink </td> <td>LU factorization </td>\n    <td>Square </td><td>Fill-in reducing, Leverage fast dense algebra</td>\n    <td> built-in, MPL2</td> <td>optimized for small and large problems with irregular patterns </td></tr>\n<tr><td>SparseQR</td> <td>\\link SparseQR_Module SparseQR \\endlink</td> <td> QR factorization</td>\n    <td>Any, rectangular</td><td> Fill-in reducing</td>\n    <td>built-in, MPL2</td><td>recommended for least-square problems, has a basic rank-revealing feature</td></tr>\n<tr> <th colspan=\"7\"> Wrappers to external solvers </th></tr>\n<tr><td>PastixLLT \\n PastixLDLT \\n PastixLU</td><td>\\link PaStiXSupport_Module PaStiXSupport \\endlink</td><td>Direct LLt, LDLt, LU factorizations</td><td>SPD \\n SPD \\n Square</td><td>Fill-in reducing, Leverage fast dense algebra, Multithreading</td>\n    <td>Requires the <a href=\"http://pastix.gforge.inria.fr\">PaStiX</a> package, \\b CeCILL-C </td>\n    <td>optimized for tough problems and symmetric patterns</td></tr>\n<tr><td>CholmodSupernodalLLT</td><td>\\link CholmodSupport_Module CholmodSupport \\endlink</td><td>Direct LLt factorization</td><td>SPD</td><td>Fill-in reducing, Leverage fast dense algebra</td>\n    <td>Requires the <a href=\"http://www.suitesparse.com\">SuiteSparse</a> package, \\b GPL </td>\n    <td></td></tr>\n<tr><td>UmfPackLU</td><td>\\link UmfPackSupport_Module UmfPackSupport \\endlink</td><td>Direct LU factorization</td><td>Square</td><td>Fill-in reducing, Leverage fast dense algebra</td>\n    <td>Requires the <a href=\"http://www.suitesparse.com\">SuiteSparse</a> package, \\b GPL </td>\n    <td></td></tr>\n<tr><td>SuperLU</td><td>\\link SuperLUSupport_Module SuperLUSupport \\endlink</td><td>Direct LU factorization</td><td>Square</td><td>Fill-in reducing, Leverage fast dense algebra</td>\n    <td>Requires the <a href=\"http://crd-legacy.lbl.gov/~xiaoye/SuperLU/\">SuperLU</a> library, (BSD-like)</td>\n    <td></td></tr>\n<tr><td>SPQR</td><td>\\link SPQRSupport_Module SPQRSupport \\endlink  </td> <td> QR factorization </td> \n    <td> Any, rectangular</td><td>fill-in reducing, multithreaded, fast dense algebra</td>\n    <td> requires the <a href=\"http://www.suitesparse.com\">SuiteSparse</a> package, \\b GPL </td><td>recommended for linear least-squares problems, has a rank-revealing feature</tr>\n</table>\n\nHere \\c SPD means symmetric positive definite.\n\nAll these solvers follow the same general concept.\nHere is a typical and general example:\n\\code\n#include <Eigen/RequiredModuleName>\n// ...\nSparseMatrix<double> A;\n// fill A\nVectorXd b, x;\n// fill b\n// solve Ax = b\nSolverClassName<SparseMatrix<double> > solver;\nsolver.compute(A);\nif(solver.info()!=Success) {\n  // decomposition failed\n  return;\n}\nx = solver.solve(b);\nif(solver.info()!=Success) {\n  // solving failed\n  return;\n}\n// solve for another right hand side:\nx1 = solver.solve(b1);\n\\endcode\n\nFor \\c SPD solvers, a second optional template argument allows to specify which triangular part have to be used, e.g.:\n\n\\code\n#include <Eigen/IterativeLinearSolvers>\n\nConjugateGradient<SparseMatrix<double>, Eigen::Upper> solver;\nx = solver.compute(A).solve(b);\n\\endcode\nIn the above example, only the upper triangular part of the input matrix A is considered for solving. The opposite triangle might either be empty or contain arbitrary values.\n\nIn the case where multiple problems with the same sparsity pattern have to be solved, then the \"compute\" step can be decomposed as follow:\n\\code\nSolverClassName<SparseMatrix<double> > solver;\nsolver.analyzePattern(A);   // for this step the numerical values of A are not used\nsolver.factorize(A);\nx1 = solver.solve(b1);\nx2 = solver.solve(b2);\n...\nA = ...;                    // modify the values of the nonzeros of A, the nonzeros pattern must stay unchanged\nsolver.factorize(A);\nx1 = solver.solve(b1);\nx2 = solver.solve(b2);\n...\n\\endcode\nThe compute() method is equivalent to calling both analyzePattern() and factorize().\n\nFinally, each solver provides some specific features, such as determinant, access to the factors, controls of the iterations, and so on.\nMore details are availble in the documentations of the respective classes.\n\n\\section TheSparseCompute The Compute Step\nIn the compute() function, the matrix is generally factorized: LLT for self-adjoint matrices, LDLT for general hermitian matrices, LU for non hermitian matrices and QR for rectangular matrices. These are the results of using direct solvers. For this class of solvers precisely, the compute step is further subdivided into analyzePattern() and factorize(). \n\nThe goal of analyzePattern() is to reorder the nonzero elements of the matrix, such that the factorization step creates less fill-in. This step exploits only the structure of the matrix. Hence, the results of this step can be used for other linear systems where the matrix has the same structure. Note however that sometimes, some external solvers (like SuperLU) require that the values of the matrix are set in this step, for instance to equilibrate the rows and columns of the matrix. In this situation, the results of this step should not be used with other matrices.\n\nEigen provides a limited set of methods to reorder the matrix in this step, either built-in (COLAMD, AMD) or external (METIS). These methods are set in template parameter list of the solver :\n\\code\nDirectSolverClassName<SparseMatrix<double>, OrderingMethod<IndexType> > solver;\n\\endcode \n\nSee the \\link OrderingMethods_Module OrderingMethods module \\endlink for the list of available methods and the associated options. \n\nIn factorize(), the factors of the coefficient matrix are computed. This step should be called each time the values of the matrix change. However, the structural pattern of the matrix should not change between multiple calls. \n\nFor iterative solvers, the compute step is used to eventually setup a preconditioner. For instance, with the ILUT preconditioner, the incomplete factors L and U are computed in this step. Remember that, basically, the goal of the preconditioner is to speedup the convergence of an iterative method by solving a modified linear system where the coefficient matrix has more clustered eigenvalues. For real problems, an iterative solver should always be used with a preconditioner. In Eigen, a preconditioner is  selected by simply adding it as a template parameter to the iterative solver object. \n\\code\nIterativeSolverClassName<SparseMatrix<double>, PreconditionerName<SparseMatrix<double> > solver; \n\\endcode\nThe member function preconditioner() returns a read-write reference to the preconditioner \n to directly interact with it. See the \\link IterativeLinearSolvers_Module Iterative solvers module \\endlink and the documentation of each class for the list of available methods.\n\n\\section TheSparseSolve The Solve step\nThe solve() function computes the solution of the linear systems with one or many right hand sides.\n\\code\nX = solver.solve(B);\n\\endcode \nHere, B  can be a vector or a matrix where the columns form the different right hand sides. The solve() function can be called several times as well, for instance when all the right hand sides are not available at once. \n\\code\nx1 = solver.solve(b1);\n// Get the second right hand side b2\nx2 = solver.solve(b2); \n//  ...\n\\endcode\nFor direct methods, the solution are computed at the machine precision. Sometimes, the solution need not be too accurate. In this case, the iterative methods are more suitable and the desired accuracy can be set before the solve step using \\b setTolerance(). For all the available functions, please, refer to the documentation of the \\link IterativeLinearSolvers_Module Iterative solvers module \\endlink. \n\n\\section BenchmarkRoutine\nMost of the time, all you need is to know how much time it will take to qolve your system, and hopefully, what is the most suitable solver. In Eigen, we provide a benchmark routine that can be used for this purpose. It is very easy to use. In the build directory, navigate to bench/spbench and compile the routine by typing \\b make \\e spbenchsolver. Run it with --help option to get the list of all available options. Basically, the matrices to test should be in <a href=\"http://math.nist.gov/MatrixMarket/formats.html\">MatrixMarket Coordinate format</a>, and the routine returns the statistics from all available solvers in Eigen. \n\nThe following table gives an example of XML statistics from several Eigen built-in and external solvers. \n<TABLE border=\"1\">\n <TR><TH>Matrix <TH> N <TH> NNZ <TH>  <TH > UMFPACK <TH > SUPERLU <TH > PASTIX LU <TH >BiCGSTAB <TH > BiCGSTAB+ILUT <TH >GMRES+ILUT<TH > LDLT <TH> CHOLMOD LDLT <TH > PASTIX LDLT <TH > LLT <TH > CHOLMOD SP LLT <TH > CHOLMOD LLT <TH > PASTIX LLT <TH> CG</TR>\n<TR><TH rowspan=\"4\">vector_graphics <TD rowspan=\"4\"> 12855 <TD rowspan=\"4\"> 72069 <TH>Compute Time <TD>0.0254549<TD>0.0215677<TD>0.0701827<TD>0.000153388<TD>0.0140107<TD>0.0153709<TD>0.0101601<TD style=\"background-color:red\">0.00930502<TD>0.0649689\n<TR><TH>Solve Time <TD>0.00337835<TD>0.000951826<TD>0.00484373<TD>0.0374886<TD>0.0046445<TD>0.00847754<TD>0.000541813<TD style=\"background-color:red\">0.000293696<TD>0.00485376\n<TR><TH>Total Time <TD>0.0288333<TD>0.0225195<TD>0.0750265<TD>0.037642<TD>0.0186552<TD>0.0238484<TD>0.0107019<TD style=\"background-color:red\">0.00959871<TD>0.0698227\n<TR><TH>Error(Iter) <TD> 1.299e-16 <TD> 2.04207e-16 <TD> 4.83393e-15 <TD> 3.94856e-11 (80)  <TD> 1.03861e-12 (3)  <TD> 5.81088e-14 (6)  <TD> 1.97578e-16 <TD> 1.83927e-16 <TD> 4.24115e-15\n<TR><TH rowspan=\"4\">poisson_SPD <TD rowspan=\"4\"> 19788 <TD rowspan=\"4\"> 308232 <TH>Compute Time <TD>0.425026<TD>1.82378<TD>0.617367<TD>0.000478921<TD>1.34001<TD>1.33471<TD>0.796419<TD>0.857573<TD>0.473007<TD>0.814826<TD style=\"background-color:red\">0.184719<TD>0.861555<TD>0.470559<TD>0.000458188\n<TR><TH>Solve Time <TD>0.0280053<TD>0.0194402<TD>0.0268747<TD>0.249437<TD>0.0548444<TD>0.0926991<TD>0.00850204<TD>0.0053171<TD>0.0258932<TD>0.00874603<TD style=\"background-color:red\">0.00578155<TD>0.00530361<TD>0.0248942<TD>0.239093\n<TR><TH>Total Time <TD>0.453031<TD>1.84322<TD>0.644241<TD>0.249916<TD>1.39486<TD>1.42741<TD>0.804921<TD>0.862891<TD>0.4989<TD>0.823572<TD style=\"background-color:red\">0.190501<TD>0.866859<TD>0.495453<TD>0.239551\n<TR><TH>Error(Iter) <TD> 4.67146e-16 <TD> 1.068e-15 <TD> 1.3397e-15 <TD> 6.29233e-11 (201)  <TD> 3.68527e-11 (6)  <TD> 3.3168e-15 (16)  <TD> 1.86376e-15 <TD> 1.31518e-16 <TD> 1.42593e-15 <TD> 3.45361e-15 <TD> 3.14575e-16 <TD> 2.21723e-15 <TD> 7.21058e-16 <TD> 9.06435e-12 (261) \n<TR><TH rowspan=\"4\">sherman2 <TD rowspan=\"4\"> 1080 <TD rowspan=\"4\"> 23094 <TH>Compute Time <TD style=\"background-color:red\">0.00631754<TD>0.015052<TD>0.0247514 <TD> -<TD>0.0214425<TD>0.0217988\n<TR><TH>Solve Time <TD style=\"background-color:red\">0.000478424<TD>0.000337998<TD>0.0010291 <TD> -<TD>0.00243152<TD>0.00246152\n<TR><TH>Total Time <TD style=\"background-color:red\">0.00679597<TD>0.01539<TD>0.0257805 <TD> -<TD>0.023874<TD>0.0242603\n<TR><TH>Error(Iter) <TD> 1.83099e-15 <TD> 8.19351e-15 <TD> 2.625e-14 <TD> 1.3678e+69 (1080)  <TD> 4.1911e-12 (7)  <TD> 5.0299e-13 (12) \n<TR><TH rowspan=\"4\">bcsstk01_SPD <TD rowspan=\"4\"> 48 <TD rowspan=\"4\"> 400 <TH>Compute Time <TD>0.000169079<TD>0.00010789<TD>0.000572538<TD>1.425e-06<TD>9.1612e-05<TD>8.3985e-05<TD style=\"background-color:red\">5.6489e-05<TD>7.0913e-05<TD>0.000468251<TD>5.7389e-05<TD>8.0212e-05<TD>5.8394e-05<TD>0.000463017<TD>1.333e-06\n<TR><TH>Solve Time <TD>1.2288e-05<TD>1.1124e-05<TD>0.000286387<TD>8.5896e-05<TD>1.6381e-05<TD>1.6984e-05<TD style=\"background-color:red\">3.095e-06<TD>4.115e-06<TD>0.000325438<TD>3.504e-06<TD>7.369e-06<TD>3.454e-06<TD>0.000294095<TD>6.0516e-05\n<TR><TH>Total Time <TD>0.000181367<TD>0.000119014<TD>0.000858925<TD>8.7321e-05<TD>0.000107993<TD>0.000100969<TD style=\"background-color:red\">5.9584e-05<TD>7.5028e-05<TD>0.000793689<TD>6.0893e-05<TD>8.7581e-05<TD>6.1848e-05<TD>0.000757112<TD>6.1849e-05\n<TR><TH>Error(Iter) <TD> 1.03474e-16 <TD> 2.23046e-16 <TD> 2.01273e-16 <TD> 4.87455e-07 (48)  <TD> 1.03553e-16 (2)  <TD> 3.55965e-16 (2)  <TD> 2.48189e-16 <TD> 1.88808e-16 <TD> 1.97976e-16 <TD> 2.37248e-16 <TD> 1.82701e-16 <TD> 2.71474e-16 <TD> 2.11322e-16 <TD> 3.547e-09 (48) \n<TR><TH rowspan=\"4\">sherman1 <TD rowspan=\"4\"> 1000 <TD rowspan=\"4\"> 3750 <TH>Compute Time <TD>0.00228805<TD>0.00209231<TD>0.00528268<TD>9.846e-06<TD>0.00163522<TD>0.00162155<TD>0.000789259<TD style=\"background-color:red\">0.000804495<TD>0.00438269\n<TR><TH>Solve Time <TD>0.000213788<TD>9.7983e-05<TD>0.000938831<TD>0.00629835<TD>0.000361764<TD>0.00078794<TD>4.3989e-05<TD style=\"background-color:red\">2.5331e-05<TD>0.000917166\n<TR><TH>Total Time <TD>0.00250184<TD>0.00219029<TD>0.00622151<TD>0.0063082<TD>0.00199698<TD>0.00240949<TD>0.000833248<TD style=\"background-color:red\">0.000829826<TD>0.00529986\n<TR><TH>Error(Iter) <TD> 1.16839e-16 <TD> 2.25968e-16 <TD> 2.59116e-16 <TD> 3.76779e-11 (248)  <TD> 4.13343e-11 (4)  <TD> 2.22347e-14 (10)  <TD> 2.05861e-16 <TD> 1.83555e-16 <TD> 1.02917e-15\n<TR><TH rowspan=\"4\">young1c <TD rowspan=\"4\"> 841 <TD rowspan=\"4\"> 4089 <TH>Compute Time <TD>0.00235843<TD style=\"background-color:red\">0.00217228<TD>0.00568075<TD>1.2735e-05<TD>0.00264866<TD>0.00258236\n<TR><TH>Solve Time <TD>0.000329599<TD style=\"background-color:red\">0.000168634<TD>0.00080118<TD>0.0534738<TD>0.00187193<TD>0.00450211\n<TR><TH>Total Time <TD>0.00268803<TD style=\"background-color:red\">0.00234091<TD>0.00648193<TD>0.0534865<TD>0.00452059<TD>0.00708447\n<TR><TH>Error(Iter) <TD> 1.27029e-16 <TD> 2.81321e-16 <TD> 5.0492e-15 <TD> 8.0507e-11 (706)  <TD> 3.00447e-12 (8)  <TD> 1.46532e-12 (16) \n<TR><TH rowspan=\"4\">mhd1280b <TD rowspan=\"4\"> 1280 <TD rowspan=\"4\"> 22778 <TH>Compute Time <TD>0.00234898<TD>0.00207079<TD>0.00570918<TD>2.5976e-05<TD>0.00302563<TD>0.00298036<TD>0.00144525<TD style=\"background-color:red\">0.000919922<TD>0.00426444\n<TR><TH>Solve Time <TD>0.00103392<TD>0.000211911<TD>0.00105<TD>0.0110432<TD>0.000628287<TD>0.00392089<TD>0.000138303<TD style=\"background-color:red\">6.2446e-05<TD>0.00097564\n<TR><TH>Total Time <TD>0.0033829<TD>0.0022827<TD>0.00675918<TD>0.0110692<TD>0.00365392<TD>0.00690124<TD>0.00158355<TD style=\"background-color:red\">0.000982368<TD>0.00524008\n<TR><TH>Error(Iter) <TD> 1.32953e-16 <TD> 3.08646e-16 <TD> 6.734e-16 <TD> 8.83132e-11 (40)  <TD> 1.51153e-16 (1)  <TD> 6.08556e-16 (8)  <TD> 1.89264e-16 <TD> 1.97477e-16 <TD> 6.68126e-09\n<TR><TH rowspan=\"4\">crashbasis <TD rowspan=\"4\"> 160000 <TD rowspan=\"4\"> 1750416 <TH>Compute Time <TD>3.2019<TD>5.7892<TD>15.7573<TD style=\"background-color:red\">0.00383515<TD>3.1006<TD>3.09921\n<TR><TH>Solve Time <TD>0.261915<TD>0.106225<TD>0.402141<TD style=\"background-color:red\">1.49089<TD>0.24888<TD>0.443673\n<TR><TH>Total Time <TD>3.46381<TD>5.89542<TD>16.1594<TD style=\"background-color:red\">1.49473<TD>3.34948<TD>3.54288\n<TR><TH>Error(Iter) <TD> 1.76348e-16 <TD> 4.58395e-16 <TD> 1.67982e-14 <TD> 8.64144e-11 (61)  <TD> 8.5996e-12 (2)  <TD> 6.04042e-14 (5) \n\n</TABLE>\n*/\n}\n"
  },
  {
    "path": "libs/eigen/doc/SparseQuickReference.dox",
    "content": "namespace Eigen {\n/** \\eigenManualPage SparseQuickRefPage Quick reference guide for sparse matrices\n\\eigenAutoToc\n\n<hr>\n\nIn this page, we give a quick summary of the main operations available for sparse matrices in the class SparseMatrix. First, it is recommended to read  the introductory tutorial at \\ref TutorialSparse. The important point to have in mind when working on sparse matrices is how they are stored : \ni.e either row major or column major. The default is column major. Most arithmetic operations on sparse matrices will assert that they have the same storage order. \n\n\\section SparseMatrixInit Sparse Matrix Initialization\n<table class=\"manual\">\n<tr><th> Category </th> <th> Operations</th> <th>Notes</th></tr>\n<tr><td>Constructor</td>\n<td>\n\\code\n  SparseMatrix<double> sm1(1000,1000); \n  SparseMatrix<std::complex<double>,RowMajor> sm2;\n\\endcode\n</td> <td> Default is ColMajor</td> </tr>\n<tr class=\"alt\">\n<td> Resize/Reserve</td>\n<td> \n \\code\n    sm1.resize(m,n);      // Change sm1 to a m x n matrix.\n    sm1.reserve(nnz);     // Allocate room for nnz nonzeros elements.   \n  \\endcode \n</td>\n<td> Note that when calling reserve(), it is not required that nnz is the exact number of nonzero elements in the final matrix. However, an exact estimation will avoid multiple reallocations during the insertion phase. </td>\n</tr>\n<tr> \n<td> Assignment </td>\n<td> \n\\code \n  SparseMatrix<double,Colmajor> sm1;\n // Initialize sm2 with sm1.\n  SparseMatrix<double,Rowmajor> sm2(sm1), sm3;        \n  // Assignment and evaluations modify the storage order.\n  sm3 = sm1; \n \\endcode\n</td>\n<td> The copy constructor can be used to convert from a storage order to another</td>\n</tr>\n<tr class=\"alt\">\n<td> Element-wise Insertion</td>\n<td>\n\\code \n// Insert a new element; \n sm1.insert(i, j) = v_ij;  \n\n// Update the value v_ij\n sm1.coeffRef(i,j) = v_ij;\n sm1.coeffRef(i,j) += v_ij;\n sm1.coeffRef(i,j) -= v_ij;\n\\endcode\n</td>\n<td> insert() assumes that the element does not already exist; otherwise, use coeffRef()</td>\n</tr>\n<tr> \n<td> Batch insertion</td>\n<td>\n\\code\n  std::vector< Eigen::Triplet<double> > tripletList;\n  tripletList.reserve(estimation_of_entries);\n  // -- Fill tripletList with nonzero elements...\n  sm1.setFromTriplets(TripletList.begin(), TripletList.end());\n\\endcode\n</td>\n<td>A complete example is available at \\link TutorialSparseFilling Triplet Insertion \\endlink.</td>\n</tr>\n<tr class=\"alt\"> \n<td> Constant or Random Insertion</td>\n<td>\n\\code\nsm1.setZero();\n\\endcode\n</td>\n<td>Remove all non-zero coefficients</td>\n</tr>\n</table>\n\n\n\\section SparseBasicInfos Matrix properties\nBeyond the basic functions rows() and cols(), there are some useful functions that are available to easily get some informations from the matrix. \n<table class=\"manual\">\n<tr>\n  <td> \\code\n  sm1.rows();         // Number of rows\n  sm1.cols();         // Number of columns \n  sm1.nonZeros();     // Number of non zero values   \n  sm1.outerSize();    // Number of columns (resp. rows) for a column major (resp. row major )\n  sm1.innerSize();    // Number of rows (resp. columns) for a row major (resp. column major)\n  sm1.norm();         // Euclidian norm of the matrix\n  sm1.squaredNorm();  // Squared norm of the matrix\n  sm1.blueNorm();\n  sm1.isVector();     // Check if sm1 is a sparse vector or a sparse matrix\n  sm1.isCompressed(); // Check if sm1 is in compressed form\n  ...\n  \\endcode </td>\n</tr>\n</table>\n\n\\section SparseBasicOps Arithmetic operations\nIt is easy to perform arithmetic operations on sparse matrices provided that the dimensions are adequate and that the matrices have the same storage order. Note that the evaluation can always be done in a matrix with a different storage order. In the following, \\b sm denotes a sparse matrix, \\b dm a dense matrix and \\b dv a dense vector.\n<table class=\"manual\">\n<tr><th> Operations </th> <th> Code </th> <th> Notes </th></tr>\n\n<tr>\n  <td> add subtract </td> \n  <td> \\code\n  sm3 = sm1 + sm2; \n  sm3 = sm1 - sm2;\n  sm2 += sm1; \n  sm2 -= sm1; \\endcode\n  </td>\n  <td> \n  sm1 and sm2 should have the same storage order\n  </td> \n</tr>\n\n<tr class=\"alt\"><td>\n  scalar product</td><td>\\code\n  sm3 = sm1 * s1;   sm3 *= s1; \n  sm3 = s1 * sm1 + s2 * sm2; sm3 /= s1;\\endcode\n  </td>\n  <td>\n    Many combinations are possible if the dimensions and the storage order agree.\n</tr>\n\n<tr>\n  <td> %Sparse %Product </td>\n  <td> \\code\n  sm3 = sm1 * sm2;\n  dm2 = sm1 * dm1;\n  dv2 = sm1 * dv1;\n  \\endcode </td>\n  <td>\n  </td>\n</tr> \n\n<tr class='alt'>\n  <td> transposition, adjoint</td>\n  <td> \\code\n  sm2 = sm1.transpose();\n  sm2 = sm1.adjoint();\n  \\endcode </td>\n  <td>\n  Note that the transposition change the storage order. There is no support for transposeInPlace().\n  </td>\n</tr> \n<tr>\n<td> Permutation </td>\n<td> \n\\code \nperm.indices();      // Reference to the vector of indices\nsm1.twistedBy(perm); // Permute rows and columns\nsm2 = sm1 * perm;    // Permute the columns\nsm2 = perm * sm1;    // Permute the columns\n\\endcode \n</td>\n<td> \n\n</td>\n</tr>\n<tr>\n  <td>\n  Component-wise ops\n  </td>\n  <td>\\code \n  sm1.cwiseProduct(sm2);\n  sm1.cwiseQuotient(sm2);\n  sm1.cwiseMin(sm2);\n  sm1.cwiseMax(sm2);\n  sm1.cwiseAbs();\n  sm1.cwiseSqrt();\n  \\endcode</td>\n  <td>\n  sm1 and sm2 should have the same storage order\n  </td>\n</tr>\n</table>\n\n\\section sparseotherops Other supported operations\n<table class=\"manual\">\n<tr><th style=\"min-width:initial\"> Code </th> <th> Notes</th> </tr>\n<tr><td colspan=\"2\">Sub-matrices</td></tr>\n<tr>\n<td> \n\\code \n  sm1.block(startRow, startCol, rows, cols); \n  sm1.block(startRow, startCol); \n  sm1.topLeftCorner(rows, cols); \n  sm1.topRightCorner(rows, cols);\n  sm1.bottomLeftCorner( rows, cols);\n  sm1.bottomRightCorner( rows, cols);\n  \\endcode\n</td><td>\nContrary to dense matrices, here <strong>all these methods are read-only</strong>.\\n\nSee \\ref TutorialSparse_SubMatrices and below for read-write sub-matrices.\n</td>\n</tr>\n<tr class=\"alt\"><td colspan=\"2\"> Range </td></tr>\n<tr class=\"alt\">\n<td> \n\\code \n  sm1.innerVector(outer);           // RW\n  sm1.innerVectors(start, size);    // RW\n  sm1.leftCols(size);               // RW\n  sm2.rightCols(size);              // RO because sm2 is row-major\n  sm1.middleRows(start, numRows);   // RO becasue sm1 is column-major\n  sm1.middleCols(start, numCols);   // RW\n  sm1.col(j);                       // RW\n\\endcode\n</td>\n<td>\nA inner vector is either a row (for row-major) or a column (for column-major).\\n\nAs stated earlier, for a read-write sub-matrix (RW), the evaluation can be done in a matrix with different storage order.\n</td>\n</tr>\n<tr><td colspan=\"2\"> Triangular and selfadjoint views</td></tr>\n<tr>\n<td> \n\\code\n  sm2 = sm1.triangularview<Lower>();\n  sm2 = sm1.selfadjointview<Lower>();\n\\endcode\n</td>\n<td> Several combination between triangular views and blocks views are possible\n\\code \n  \\endcode </td>\n</tr>\n<tr class=\"alt\"><td colspan=\"2\">Triangular solve </td></tr>\n<tr class=\"alt\">\n<td> \n\\code \n dv2 = sm1.triangularView<Upper>().solve(dv1);\n dv2 = sm1.topLeftCorner(size, size)\n          .triangularView<Lower>().solve(dv1);\n\\endcode \n</td>\n<td> For general sparse solve, Use any suitable module described at \\ref TopicSparseSystems </td>\n</tr>\n<tr><td colspan=\"2\"> Low-level API</td></tr>\n<tr>\n<td>\n\\code\nsm1.valuePtr();      // Pointer to the values\nsm1.innerIndextr();  // Pointer to the indices.\nsm1.outerIndexPtr(); // Pointer to the beginning of each inner vector\n\\endcode\n</td>\n<td>\nIf the matrix is not in compressed form, makeCompressed() should be called before.\\n\nNote that these functions are mostly provided for interoperability purposes with external libraries.\\n\nA better access to the values of the matrix is done by using the InnerIterator class as described in \\link TutorialSparse the Tutorial Sparse \\endlink section</td>\n</tr>\n</table>\n*/\n}\n"
  },
  {
    "path": "libs/eigen/doc/StlContainers.dox",
    "content": "namespace Eigen {\n\n/** \\eigenManualPage TopicStlContainers Using STL Containers with Eigen\n\n\\eigenAutoToc\n\n\\section summary Executive summary\n\nUsing STL containers on \\ref TopicFixedSizeVectorizable \"fixed-size vectorizable Eigen types\", or classes having members of such types, requires taking the following two steps:\n\n\\li A 16-byte-aligned allocator must be used. Eigen does provide one ready for use: aligned_allocator.\n\\li If you want to use the std::vector container, you need to \\#include <Eigen/StdVector>.\n\nThese issues arise only with \\ref TopicFixedSizeVectorizable \"fixed-size vectorizable Eigen types\" and \\ref TopicStructHavingEigenMembers \"structures having such Eigen objects as member\". For other Eigen types, such as Vector3f or MatrixXd, no special care is needed when using STL containers.\n\n\\section allocator Using an aligned allocator\n\nSTL containers take an optional template parameter, the allocator type. When using STL containers on \\ref TopicFixedSizeVectorizable \"fixed-size vectorizable Eigen types\", you need tell the container to use an allocator that will always allocate memory at 16-byte-aligned locations. Fortunately, Eigen does provide such an allocator: Eigen::aligned_allocator.\n\nFor example, instead of\n\\code\nstd::map<int, Eigen::Vector4f>\n\\endcode\nyou need to use\n\\code\nstd::map<int, Eigen::Vector4f, std::less<int>, \n         Eigen::aligned_allocator<std::pair<const int, Eigen::Vector4f> > >\n\\endcode\nNote that the third parameter \"std::less<int>\" is just the default value, but we have to include it because we want to specify the fourth parameter, which is the allocator type.\n\n\\section vector The case of std::vector\n\nThe situation with std::vector was even worse (explanation below) so we had to specialize it for the Eigen::aligned_allocator type. In practice you \\b must use the Eigen::aligned_allocator (not another aligned allocator), \\b and \\#include <Eigen/StdVector>.\n\nHere is an example:\n\\code\n#include<Eigen/StdVector>\n/* ... */\nstd::vector<Eigen::Vector4f,Eigen::aligned_allocator<Eigen::Vector4f> >\n\\endcode\n\n\\subsection vector_spec An alternative - specializing std::vector for Eigen types\n\nAs an alternative to the recommended approach described above, you have the option to specialize std::vector for Eigen types requiring alignment. \nThe advantage is that you won't need to declare std::vector all over with Eigen::allocator. One drawback on the other hand side is that\nthe specialization needs to be defined before all code pieces in which e.g. std::vector<Vector2d> is used. Otherwise, without knowing the specialization\nthe compiler will compile that particular instance with the default std::allocator and you program is most likely to crash.\n\nHere is an example:\n\\code\n#include<Eigen/StdVector>\n/* ... */\nEIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Matrix2d)\nstd::vector<Eigen::Vector2d>\n\\endcode\n\n<span class=\"note\">\\b Explanation: The resize() method of std::vector takes a value_type argument (defaulting to value_type()). So with std::vector<Eigen::Vector4f>, some Eigen::Vector4f objects will be passed by value, which discards any alignment modifiers, so a Eigen::Vector4f can be created at an unaligned location. In order to avoid that, the only solution we saw was to specialize std::vector to make it work on a slight modification of, here, Eigen::Vector4f, that is able to deal properly with this situation.\n</span>\n\n*/\n\n}\n"
  },
  {
    "path": "libs/eigen/doc/StorageOrders.dox",
    "content": "namespace Eigen {\n\n/** \\eigenManualPage TopicStorageOrders Storage orders\n\nThere are two different storage orders for matrices and two-dimensional arrays: column-major and row-major.\nThis page explains these storage orders and how to specify which one should be used.\n\n\\eigenAutoToc\n\n\n\\section TopicStorageOrdersIntro Column-major and row-major storage\n\nThe entries of a matrix form a two-dimensional grid. However, when the matrix is stored in memory, the entries\nhave to somehow be laid out linearly. There are two main ways to do this, by row and by column.\n\nWe say that a matrix is stored in \\b row-major order if it is stored row by row. The entire first row is\nstored first, followed by the entire second row, and so on. Consider for example the matrix\n\n\\f[\nA = \\begin{bmatrix}\n8 & 2 & 2 & 9 \\\\\n9 & 1 & 4 & 4 \\\\\n3 & 5 & 4 & 5\n\\end{bmatrix}.\n\\f]\n\nIf this matrix is stored in row-major order, then the entries are laid out in memory as follows:\n\n\\code 8 2 2 9 9 1 4 4 3 5 4 5 \\endcode\n\nOn the other hand, a matrix is stored in \\b column-major order if it is stored column by column, starting with\nthe entire first column, followed by the entire second column, and so on. If the above matrix is stored in\ncolumn-major order, it is laid out as follows:\n\n\\code 8 9 3 2 1 5 2 4 4 9 4 5 \\endcode\n\nThis example is illustrated by the following Eigen code. It uses the PlainObjectBase::data() function, which\nreturns a pointer to the memory location of the first entry of the matrix.\n\n<table class=\"example\">\n<tr><th>Example</th><th>Output</th></tr>\n<tr><td>\n\\include TopicStorageOrders_example.cpp\n</td>\n<td>\n\\verbinclude TopicStorageOrders_example.out\n</td></tr></table>\n\n\n\\section TopicStorageOrdersInEigen Storage orders in Eigen\n\nThe storage order of a matrix or a two-dimensional array can be set by specifying the \\c Options template\nparameter for Matrix or Array. As \\ref TutorialMatrixClass explains, the %Matrix class template has six\ntemplate parameters, of which three are compulsory (\\c Scalar, \\c RowsAtCompileTime and \\c ColsAtCompileTime)\nand three are optional (\\c Options, \\c MaxRowsAtCompileTime and \\c MaxColsAtCompileTime). If the \\c Options\nparameter is set to \\c RowMajor, then the matrix or array is stored in row-major order; if it is set to \n\\c ColMajor, then it is stored in column-major order. This mechanism is used in the above Eigen program to\nspecify the storage order.\n\nIf the storage order is not specified, then Eigen defaults to storing the entry in column-major. This is also\nthe case if one of the convenience typedefs (\\c Matrix3f, \\c ArrayXXd, etc.) is used.\n\nMatrices and arrays using one storage order can be assigned to matrices and arrays using the other storage\norder, as happens in the above program when \\c Arowmajor is initialized using \\c Acolmajor. Eigen will reorder\nthe entries automatically. More generally, row-major and column-major matrices can be mixed in an expression\nas we want.\n\n\n\\section TopicStorageOrdersWhich Which storage order to choose?\n\nSo, which storage order should you use in your program? There is no simple answer to this question; it depends\non your application. Here are some points to keep in mind:\n\n  - Your users may expect you to use a specific storage order. Alternatively, you may use other libraries than\n    Eigen, and these other libraries may expect a certain storage order. In these cases it may be easiest and\n    fastest to use this storage order in your whole program.\n  - Algorithms that traverse a matrix row by row will go faster when the matrix is stored in row-major order\n    because of better data locality. Similarly, column-by-column traversal is faster for column-major\n    matrices. It may be worthwhile to experiment a bit to find out what is faster for your particular\n    application.\n  - The default in Eigen is column-major. Naturally, most of the development and testing of the Eigen library\n    is thus done with column-major matrices. This means that, even though we aim to support column-major and\n    row-major storage orders transparently, the Eigen library may well work best with column-major matrices.\n\n*/\n}\n"
  },
  {
    "path": "libs/eigen/doc/StructHavingEigenMembers.dox",
    "content": "namespace Eigen {\n\n/** \\eigenManualPage TopicStructHavingEigenMembers Structures Having Eigen Members\n\n\\eigenAutoToc\n\n\\section summary Executive Summary\n\nIf you define a structure having members of \\ref TopicFixedSizeVectorizable \"fixed-size vectorizable Eigen types\", you must overload its \"operator new\" so that it generates 16-bytes-aligned pointers. Fortunately, Eigen provides you with a macro EIGEN_MAKE_ALIGNED_OPERATOR_NEW that does that for you.\n\n\\section what What kind of code needs to be changed?\n\nThe kind of code that needs to be changed is this:\n\n\\code\nclass Foo\n{\n  ...\n  Eigen::Vector2d v;\n  ...\n};\n\n...\n\nFoo *foo = new Foo;\n\\endcode\n\nIn other words: you have a class that has as a member a \\ref TopicFixedSizeVectorizable \"fixed-size vectorizable Eigen object\", and then you dynamically create an object of that class.\n\n\\section how How should such code be modified?\n\nVery easy, you just need to put a EIGEN_MAKE_ALIGNED_OPERATOR_NEW macro in a public part of your class, like this:\n\n\\code\nclass Foo\n{\n  ...\n  Eigen::Vector2d v;\n  ...\npublic:\n  EIGEN_MAKE_ALIGNED_OPERATOR_NEW\n};\n\n...\n\nFoo *foo = new Foo;\n\\endcode\n\nThis macro makes \"new Foo\" always return an aligned pointer.\n\nIf this approach is too intrusive, see also the \\ref othersolutions.\n\n\\section why Why is this needed?\n\nOK let's say that your code looks like this:\n\n\\code\nclass Foo\n{\n  ...\n  Eigen::Vector2d v;\n  ...\n};\n\n...\n\nFoo *foo = new Foo;\n\\endcode\n\nA Eigen::Vector2d consists of 2 doubles, which is 128 bits. Which is exactly the size of a SSE packet, which makes it possible to use SSE for all sorts of operations on this vector. But SSE instructions (at least the ones that Eigen uses, which are the fast ones) require 128-bit alignment. Otherwise you get a segmentation fault.\n\nFor this reason, Eigen takes care by itself to require 128-bit alignment for Eigen::Vector2d, by doing two things:\n\\li Eigen requires 128-bit alignment for the Eigen::Vector2d's array (of 2 doubles). With GCC, this is done with a __attribute__ ((aligned(16))).\n\\li Eigen overloads the \"operator new\" of Eigen::Vector2d so it will always return 128-bit aligned pointers.\n\nThus, normally, you don't have to worry about anything, Eigen handles alignment for you...\n\n... except in one case. When you have a class Foo like above, and you dynamically allocate a new Foo as above, then, since Foo doesn't have aligned \"operator new\", the returned pointer foo is not necessarily 128-bit aligned.\n\nThe alignment attribute of the member v is then relative to the start of the class, foo. If the foo pointer wasn't aligned, then foo->v won't be aligned either!\n\nThe solution is to let class Foo have an aligned \"operator new\", as we showed in the previous section.\n\n\\section movetotop Should I then put all the members of Eigen types at the beginning of my class?\n\nThat's not required. Since Eigen takes care of declaring 128-bit alignment, all members that need it are automatically 128-bit aligned relatively to the class. So code like this works fine:\n\n\\code\nclass Foo\n{\n  double x;\n  Eigen::Vector2d v;\npublic:\n  EIGEN_MAKE_ALIGNED_OPERATOR_NEW\n};\n\\endcode\n\n\\section dynamicsize What about dynamic-size matrices and vectors?\n\nDynamic-size matrices and vectors, such as Eigen::VectorXd, allocate dynamically their own array of coefficients, so they take care of requiring absolute alignment automatically. So they don't cause this issue. The issue discussed here is only with \\ref TopicFixedSizeVectorizable  \"fixed-size vectorizable matrices and vectors\".\n\n\\section bugineigen So is this a bug in Eigen?\n\nNo, it's not our bug. It's more like an inherent problem of the C++98 language specification, and seems to be taken care of in the upcoming language revision: <a href=\"http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2341.pdf\">see this document</a>.\n\n\\section conditional What if I want to do this conditionnally (depending on template parameters) ?\n\nFor this situation, we offer the macro EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(NeedsToAlign). It will generate aligned operators like EIGEN_MAKE_ALIGNED_OPERATOR_NEW if NeedsToAlign is true. It will generate operators with the default alignment if NeedsToAlign is false.\n\nExample:\n\n\\code\ntemplate<int n> class Foo\n{\n  typedef Eigen::Matrix<float,n,1> Vector;\n  enum { NeedsToAlign = (sizeof(Vector)%16)==0 };\n  ...\n  Vector v;\n  ...\npublic:\n  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(NeedsToAlign)\n};\n\n...\n\nFoo<4> *foo4 = new Foo<4>; // foo4 is guaranteed to be 128bit-aligned\nFoo<3> *foo3 = new Foo<3>; // foo3 has only the system default alignment guarantee\n\\endcode\n\n\n\\section othersolutions Other solutions\n\nIn case putting the EIGEN_MAKE_ALIGNED_OPERATOR_NEW macro everywhere is too intrusive, there exists at least two other solutions.\n\n\\subsection othersolutions1 Disabling alignment\n\nThe first is to disable alignment requirement for the fixed size members:\n\\code\nclass Foo\n{\n  ...\n  Eigen::Matrix<double,2,1,Eigen::DontAlign> v;\n  ...\n};\n\\endcode\nThis has for effect to disable vectorization when using \\c v.\nIf a function of Foo uses it several times, then it still possible to re-enable vectorization by copying it into an aligned temporary vector:\n\\code\nvoid Foo::bar()\n{\n  Eigen::Vector2d av(v);\n  // use av instead of v\n  ...\n  // if av changed, then do:\n  v = av;\n}\n\\endcode\n\n\\subsection othersolutions2 Private structure\n\nThe second consist in storing the fixed-size objects into a private struct which will be dynamically allocated at the construction time of the main object:\n\n\\code\nstruct Foo_d\n{\n  EIGEN_MAKE_ALIGNED_OPERATOR_NEW\n  Vector2d v;\n  ...\n};\n\n\nstruct Foo {\n  Foo() { init_d(); }\n  ~Foo() { delete d; }\n  void bar()\n  {\n    // use d->v instead of v\n    ...\n  }\nprivate:\n  void init_d() { d = new Foo_d; }\n  Foo_d* d;\n};\n\\endcode\n\nThe clear advantage here is that the class Foo remains unchanged regarding alignment issues. The drawback is that a heap allocation will be required whatsoever.\n\n*/\n\n}\n"
  },
  {
    "path": "libs/eigen/doc/TemplateKeyword.dox",
    "content": "namespace Eigen {\n\n/** \\page TopicTemplateKeyword The template and typename keywords in C++\n\nThere are two uses for the \\c template and \\c typename keywords in C++. One of them is fairly well known\namongst programmers: to define templates. The other use is more obscure: to specify that an expression refers\nto a template function or a type. This regularly trips up programmers that use the %Eigen library, often\nleading to error messages from the compiler that are difficult to understand.\n\n\\eigenAutoToc\n\n\n\\section TopicTemplateKeywordToDefineTemplates Using the template and typename keywords to define templates\n\nThe \\c template and \\c typename keywords are routinely used to define templates. This is not the topic of this\npage as we assume that the reader is aware of this (otherwise consult a C++ book). The following example\nshould illustrate this use of the \\c template keyword.\n\n\\code\ntemplate <typename T>\nbool isPositive(T x)\n{\n    return x > 0;\n}\n\\endcode\n\nWe could just as well have written <tt>template &lt;class T&gt;</tt>; the keywords \\c typename and \\c class have the\nsame meaning in this context.\n\n\n\\section TopicTemplateKeywordExample An example showing the second use of the template keyword\n\nLet us illustrate the second use of the \\c template keyword with an example. Suppose we want to write a\nfunction which copies all entries in the upper triangular part of a matrix into another matrix, while keeping\nthe lower triangular part unchanged. A straightforward implementation would be as follows:\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include TemplateKeyword_simple.cpp\n</td>\n<td>\n\\verbinclude TemplateKeyword_simple.out\n</td></tr></table>\n\nThat works fine, but it is not very flexible. First, it only works with dynamic-size matrices of\nsingle-precision floats; the function \\c copyUpperTriangularPart() does not accept static-size matrices or\nmatrices with double-precision numbers. Second, if you use an expression such as\n<tt>mat.topLeftCorner(3,3)</tt> as the parameter \\c src, then this is copied into a temporary variable of type\nMatrixXf; this copy can be avoided.\n\nAs explained in \\ref TopicFunctionTakingEigenTypes, both issues can be resolved by making \n\\c copyUpperTriangularPart() accept any object of type MatrixBase. This leads to the following code:\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include TemplateKeyword_flexible.cpp\n</td>\n<td>\n\\verbinclude TemplateKeyword_flexible.out\n</td></tr></table>\n\nThe one line in the body of the function \\c copyUpperTriangularPart() shows the second, more obscure use of\nthe \\c template keyword in C++.  Even though it may look strange, the \\c template keywords are necessary\naccording to the standard. Without it, the compiler may reject the code with an error message like \"no match\nfor operator<\".\n\n\n\\section TopicTemplateKeywordExplanation Explanation\n\nThe reason that the \\c template keyword is necessary in the last example has to do with the rules for how\ntemplates are supposed to be compiled in C++. The compiler has to check the code for correct syntax at the\npoint where the template is defined, without knowing the actual value of the template arguments (\\c Derived1\nand \\c Derived2 in the example). That means that the compiler cannot know that <tt>dst.triangularPart</tt> is\na member template and that the following &lt; symbol is part of the delimiter for the template\nparameter. Another possibility would be that <tt>dst.triangularPart</tt> is a member variable with the &lt;\nsymbol refering to the <tt>operator&lt;()</tt> function. In fact, the compiler should choose the second\npossibility, according to the standard. If <tt>dst.triangularPart</tt> is a member template (as in our case),\nthe programmer should specify this explicitly with the \\c template keyword and write <tt>dst.template\ntriangularPart</tt>.\n\nThe precise rules are rather complicated, but ignoring some subtleties we can summarize them as follows:\n- A <em>dependent name</em> is name that depends (directly or indirectly) on a template parameter. In the\n  example, \\c dst is a dependent name because it is of type <tt>MatrixBase&lt;Derived1&gt;</tt> which depends\n  on the template parameter \\c Derived1.\n- If the code contains either one of the contructions <tt>xxx.yyy</tt> or <tt>xxx-&gt;yyy</tt> and \\c xxx is a\n  dependent name and \\c yyy refers to a member template, then the \\c template keyword must be used before \n  \\c yyy, leading to <tt>xxx.template yyy</tt> or <tt>xxx-&gt;template yyy</tt>.\n- If the code contains the contruction <tt>xxx::yyy</tt> and \\c xxx is a dependent name and \\c yyy refers to a\n  member typedef, then the \\c typename keyword must be used before the whole construction, leading to\n  <tt>typename xxx::yyy</tt>.\n\nAs an example where the \\c typename keyword is required, consider the following code in \\ref TutorialSparse\nfor iterating over the non-zero entries of a sparse matrix type:\n\n\\code\nSparseMatrixType mat(rows,cols);\nfor (int k=0; k<mat.outerSize(); ++k)\n  for (SparseMatrixType::InnerIterator it(mat,k); it; ++it)\n  {\n    /* ... */\n  }\n\\endcode\n\nIf \\c SparseMatrixType depends on a template parameter, then the \\c typename keyword is required:\n\n\\code\ntemplate <typename T>\nvoid iterateOverSparseMatrix(const SparseMatrix<T>& mat;\n{\n  for (int k=0; k<m1.outerSize(); ++k)\n    for (typename SparseMatrix<T>::InnerIterator it(mat,k); it; ++it)\n    {\n      /* ... */\n    }\n}\n\\endcode\n\n\n\\section TopicTemplateKeywordResources Resources for further reading\n\nFor more information and a fuller explanation of this topic, the reader may consult the following sources:\n- The book \"C++ Template Metaprogramming\" by David Abrahams and Aleksey Gurtovoy contains a very good\n  explanation in Appendix B (\"The typename and template Keywords\") which formed the basis for this page.\n- http://pages.cs.wisc.edu/~driscoll/typename.html\n- http://www.parashift.com/c++-faq-lite/templates.html#faq-35.18\n- http://www.comeaucomputing.com/techtalk/templates/#templateprefix\n- http://www.comeaucomputing.com/techtalk/templates/#typename\n\n*/\n}\n"
  },
  {
    "path": "libs/eigen/doc/TopicAliasing.dox",
    "content": "namespace Eigen {\n\n/** \\eigenManualPage TopicAliasing Aliasing\n\nIn %Eigen, aliasing refers to assignment statement in which the same matrix (or array or vector) appears on the\nleft and on the right of the assignment operators. Statements like <tt>mat = 2 * mat;</tt> or <tt>mat =\nmat.transpose();</tt> exhibit aliasing. The aliasing in the first example is harmless, but the aliasing in the\nsecond example leads to unexpected results. This page explains what aliasing is, when it is harmful, and what\nto do about it.\n\n\\eigenAutoToc\n\n\n\\section TopicAliasingExamples Examples\n\nHere is a simple example exhibiting aliasing:\n\n<table class=\"example\">\n<tr><th>Example</th><th>Output</th></tr>\n<tr><td>\n\\include TopicAliasing_block.cpp\n</td>\n<td>\n\\verbinclude TopicAliasing_block.out\n</td></tr></table>\n\nThe output is not what one would expect. The problem is the assignment\n\\code\nmat.bottomRightCorner(2,2) = mat.topLeftCorner(2,2);\n\\endcode\nThis assignment exhibits aliasing: the coefficient \\c mat(1,1) appears both in the block\n<tt>mat.bottomRightCorner(2,2)</tt> on the left-hand side of the assignment and the block\n<tt>mat.topLeftCorner(2,2)</tt> on the right-hand side. After the assignment, the (2,2) entry in the bottom\nright corner should have the value of \\c mat(1,1) before the assignment, which is 5. However, the output shows\nthat \\c mat(2,2) is actually 1. The problem is that %Eigen uses lazy evaluation (see \n\\ref TopicEigenExpressionTemplates) for <tt>mat.topLeftCorner(2,2)</tt>. The result is similar to\n\\code\nmat(1,1) = mat(0,0);\nmat(1,2) = mat(0,1);\nmat(2,1) = mat(1,0);\nmat(2,2) = mat(1,1);\n\\endcode\nThus, \\c mat(2,2) is assigned the \\e new value of \\c mat(1,1) instead of the old value. The next section\nexplains how to solve this problem by calling \\link DenseBase::eval() eval()\\endlink.\n\nAliasing occurs more naturally when trying to shrink a matrix. For example, the expressions <tt>vec =\nvec.head(n)</tt> and <tt>mat = mat.block(i,j,r,c)</tt> exhibit aliasing.\n\nIn general, aliasing cannot be detected at compile time: if \\c mat in the first example were a bit bigger,\nthen the blocks would not overlap, and there would be no aliasing problem. However, %Eigen does detect some\ninstances of aliasing, albeit at run time.  The following example exhibiting aliasing was mentioned in \\ref\nTutorialMatrixArithmetic :\n\n<table class=\"example\">\n<tr><th>Example</th><th>Output</th></tr>\n<tr><td>\n\\include tut_arithmetic_transpose_aliasing.cpp\n</td>\n<td>\n\\verbinclude tut_arithmetic_transpose_aliasing.out\n</td></tr></table>\n\nAgain, the output shows the aliasing issue. However, by default %Eigen uses a run-time assertion to detect this\nand exits with a message like\n\n\\verbatim\nvoid Eigen::DenseBase<Derived>::checkTransposeAliasing(const OtherDerived&) const \n[with OtherDerived = Eigen::Transpose<Eigen::Matrix<int, 2, 2, 0, 2, 2> >, Derived = Eigen::Matrix<int, 2, 2, 0, 2, 2>]: \nAssertion `(!internal::check_transpose_aliasing_selector<Scalar,internal::blas_traits<Derived>::IsTransposed,OtherDerived>::run(internal::extract_data(derived()), other)) \n&& \"aliasing detected during transposition, use transposeInPlace() or evaluate the rhs into a temporary using .eval()\"' failed.\n\\endverbatim\n\nThe user can turn %Eigen's run-time assertions like the one to detect this aliasing problem off by defining the\nEIGEN_NO_DEBUG macro, and the above program was compiled with this macro turned off in order to illustrate the\naliasing problem. See \\ref TopicAssertions for more information about %Eigen's run-time assertions.\n\n\n\\section TopicAliasingSolution Resolving aliasing issues\n\nIf you understand the cause of the aliasing issue, then it is obvious what must happen to solve it: %Eigen has\nto evaluate the right-hand side fully into a temporary matrix/array and then assign it to the left-hand\nside. The function \\link DenseBase::eval() eval() \\endlink does precisely that.\n\nFor example, here is the corrected version of the first example above:\n\n<table class=\"example\">\n<tr><th>Example</th><th>Output</th></tr>\n<tr><td>\n\\include TopicAliasing_block_correct.cpp\n</td>\n<td>\n\\verbinclude TopicAliasing_block_correct.out\n</td></tr></table>\n\nNow, \\c mat(2,2) equals 5 after the assignment, as it should be.\n\nThe same solution also works for the second example, with the transpose: simply replace the line \n<tt>a = a.transpose();</tt> with <tt>a = a.transpose().eval();</tt>. However, in this common case there is a\nbetter solution. %Eigen provides the special-purpose function \n\\link DenseBase::transposeInPlace() transposeInPlace() \\endlink which replaces a matrix by its transpose. \nThis is shown below:\n\n<table class=\"example\">\n<tr><th>Example</th><th>Output</th></tr>\n<tr><td>\n\\include tut_arithmetic_transpose_inplace.cpp\n</td>\n<td>\n\\verbinclude tut_arithmetic_transpose_inplace.out\n</td></tr></table>\n\nIf an xxxInPlace() function is available, then it is best to use it, because it indicates more clearly what you\nare doing. This may also allow %Eigen to optimize more aggressively. These are some of the xxxInPlace()\nfunctions provided: \n\n<table class=\"manual\">\n<tr><th>Original function</th><th>In-place function</th></tr>\n<tr> <td> MatrixBase::adjoint() </td> <td> MatrixBase::adjointInPlace() </td> </tr>\n<tr class=\"alt\"> <td> DenseBase::reverse() </td> <td> DenseBase::reverseInPlace() </td> </tr>\n<tr> <td> LDLT::solve() </td> <td> LDLT::solveInPlace() </td> </tr>\n<tr class=\"alt\"> <td> LLT::solve() </td> <td> LLT::solveInPlace() </td> </tr>\n<tr> <td> TriangularView::solve() </td> <td> TriangularView::solveInPlace() </td> </tr>\n<tr class=\"alt\"> <td> DenseBase::transpose() </td> <td> DenseBase::transposeInPlace() </td> </tr>\n</table>\n\nIn the special case where a matrix or vector is shrunk using an expression like <tt>vec = vec.head(n)</tt>,\nyou can use \\link PlainObjectBase::conservativeResize() conservativeResize() \\endlink.\n\n\n\\section TopicAliasingCwise Aliasing and component-wise operations\n\nAs explained above, it may be dangerous if the same matrix or array occurs on both the left-hand side and the\nright-hand side of an assignment operator, and it is then often necessary to evaluate the right-hand side\nexplicitly. However, applying component-wise operations (such as matrix addition, scalar multiplication and\narray multiplication) is safe. \n\nThe following example has only component-wise operations. Thus, there is no need for \\link DenseBase::eval()\neval() \\endlink even though the same matrix appears on both sides of the assignments.\n\n<table class=\"example\">\n<tr><th>Example</th><th>Output</th></tr>\n<tr><td>\n\\include TopicAliasing_cwise.cpp\n</td>\n<td>\n\\verbinclude TopicAliasing_cwise.out\n</td></tr></table>\n\nIn general, an assignment is safe if the (i,j) entry of the expression on the right-hand side depends only on\nthe (i,j) entry of the matrix or array on the left-hand side and not on any other entries. In that case it is\nnot necessary to evaluate the right-hand side explicitly.\n\n\n\\section TopicAliasingMatrixMult Aliasing and matrix multiplication\n\nMatrix multiplication is the only operation in %Eigen that assumes aliasing by default. Thus, if \\c matA is a\nmatrix, then the statement <tt>matA = matA * matA;</tt> is safe. All other operations in %Eigen assume that\nthere are no aliasing problems, either because the result is assigned to a different matrix or because it is a\ncomponent-wise operation.\n\n<table class=\"example\">\n<tr><th>Example</th><th>Output</th></tr>\n<tr><td>\n\\include TopicAliasing_mult1.cpp\n</td>\n<td>\n\\verbinclude TopicAliasing_mult1.out\n</td></tr></table>\n\nHowever, this comes at a price. When executing the expression <tt>matA = matA * matA</tt>, %Eigen evaluates the\nproduct in a temporary matrix which is assigned to \\c matA after the computation. This is fine. But %Eigen does\nthe same when the product is assigned to a different matrix (e.g., <tt>matB = matA * matA</tt>). In that case,\nit is more efficient to evaluate the product directly into \\c matB instead of evaluating it first into a\ntemporary matrix and copying that matrix to \\c matB.\n\nThe user can indicate with the \\link MatrixBase::noalias() noalias()\\endlink function that there is no\naliasing, as follows: <tt>matB.noalias() = matA * matA</tt>. This allows %Eigen to evaluate the matrix product\n<tt>matA * matA</tt> directly into \\c matB.\n\n<table class=\"example\">\n<tr><th>Example</th><th>Output</th></tr>\n<tr><td>\n\\include TopicAliasing_mult2.cpp\n</td>\n<td>\n\\verbinclude TopicAliasing_mult2.out\n</td></tr></table>\n\nOf course, you should not use \\c noalias() when there is in fact aliasing taking place. If you do, then you\nmay get wrong results:\n\n<table class=\"example\">\n<tr><th>Example</th><th>Output</th></tr>\n<tr><td>\n\\include TopicAliasing_mult3.cpp\n</td>\n<td>\n\\verbinclude TopicAliasing_mult3.out\n</td></tr></table>\n\n\n\\section TopicAliasingSummary Summary\n\nAliasing occurs when the same matrix or array coefficients appear both on the left- and the right-hand side of\nan assignment operator.\n - Aliasing is harmless with coefficient-wise computations; this includes scalar multiplication and matrix or\n   array addition.\n - When you multiply two matrices, %Eigen assumes that aliasing occurs. If you know that there is no aliasing,\n   then you can use \\link MatrixBase::noalias() noalias()\\endlink.\n - In all other situations, %Eigen assumes that there is no aliasing issue and thus gives the wrong result if\n   aliasing does in fact occur. To prevent this, you have to use \\link DenseBase::eval() eval() \\endlink or\n   one of the xxxInPlace() functions.\n\n*/\n}\n"
  },
  {
    "path": "libs/eigen/doc/TopicAssertions.dox",
    "content": "namespace Eigen {\n\n/** \\page TopicAssertions Assertions\n\n\\eigenAutoToc\n\n\\section PlainAssert Assertions\n\nThe macro eigen_assert is defined to be \\c eigen_plain_assert by default. We use eigen_plain_assert instead of \\c assert to work around a known bug for GCC <= 4.3. Basically, eigen_plain_assert \\a is \\c assert.\n\n\\subsection RedefineAssert Redefining assertions\n\nBoth eigen_assert and eigen_plain_assert are defined in Macros.h. Defining eigen_assert indirectly gives you a chance to change its behavior. You can redefine this macro if you want to do something else such as throwing an exception, and fall back to its default behavior with eigen_plain_assert. The code below tells Eigen to throw an std::runtime_error:\n\n\\code\n#include <stdexcept>\n#undef eigen_assert\n#define eigen_assert(x) \\\n  if (!x) { throw (std::runtime_error(\"Put your message here\")); }\n\\endcode\n\n\\subsection DisableAssert Disabling assertions\n\nAssertions cost run time and can be turned off. You can suppress eigen_assert by defining \\c EIGEN_NO_DEBUG \\b before including Eigen headers. \\c EIGEN_NO_DEBUG is undefined by default unless \\c NDEBUG is defined.\n\n\\section StaticAssert Static assertions\n\nStatic assertions are not standardized until C++11. However, in the Eigen library, there are many conditions can and should be detectedat compile time. For instance, we use static assertions to prevent the code below from compiling.\n\n\\code\nMatrix3d()  + Matrix4d();   // adding matrices of different sizes\nMatrix4cd() * Vector3cd();  // invalid product known at compile time\n\\endcode\n\nStatic assertions are defined in StaticAssert.h. If there is native static_assert, we use it. Otherwise, we have implemented an assertion macro that can show a limited range of messages.\n\nOne can easily come up with static assertions without messages, such as:\n\n\\code\n#define STATIC_ASSERT(x) \\\n  switch(0) { case 0: case x:; }\n\\endcode\n\nHowever, the example above obviously cannot tell why the assertion failed. Therefore, we define a \\c struct in namespace Eigen::internal to handle available messages.\n\n\\code\ntemplate<bool condition>\nstruct static_assertion {};\n\ntemplate<>\nstruct static_assertion<true>\n{\n  enum {\n    YOU_TRIED_CALLING_A_VECTOR_METHOD_ON_A_MATRIX,\n    YOU_MIXED_VECTORS_OF_DIFFERENT_SIZES,\n    // see StaticAssert.h for all enums.\n  };\n};\n\\endcode\n\nAnd then, we define EIGEN_STATIC_ASSERT(CONDITION,MSG) to access Eigen::internal::static_assertion<bool(CONDITION)>::MSG. If the condition evaluates into \\c false, your compiler displays a lot of messages explaining there is no MSG in static_assert<false>. Nevertheless, this is \\a not in what we are interested. As you can see, all members of static_assert<true> are ALL_CAPS_AND_THEY_ARE_SHOUTING.\n\n\\warning\nWhen using this macro, MSG should be a member of static_assertion<true>, or the static assertion \\b always fails.\nCurrently, it can only be used in function scope.\n\n\\subsection DerivedStaticAssert Derived static assertions\n\nThere are other macros derived from EIGEN_STATIC_ASSERT to enhance readability. Their names are self-explanatory.\n\n- \\b EIGEN_STATIC_ASSERT_FIXED_SIZE(TYPE) - passes if \\a TYPE is fixed size.\n- \\b EIGEN_STATIC_ASSERT_DYNAMIC_SIZE(TYPE) - passes if \\a TYPE is dynamic size.\n- \\b EIGEN_STATIC_ASSERT_LVALUE(Derived) - failes if \\a Derived is read-only.\n- \\b EIGEN_STATIC_ASSERT_ARRAYXPR(Derived) - passes if \\a Derived is an array expression.\n- <b>EIGEN_STATIC_ASSERT_SAME_XPR_KIND(Derived1, Derived2)</b> - failes if the two expressions are an array one and a matrix one.\n\nBecause Eigen handles both fixed-size and dynamic-size expressions, some conditions cannot be clearly determined at compile time. We classify them into strict assertions and permissive assertions.\n\n\\subsubsection StrictAssertions Strict assertions\n\nThese assertions fail if the condition <b>may not</b> be met. For example, MatrixXd may not be a vector, so it fails EIGEN_STATIC_ASSERT_VECTOR_ONLY.\n\n- \\b EIGEN_STATIC_ASSERT_VECTOR_ONLY(TYPE) - passes if \\a TYPE must be a vector type.\n- <b>EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(TYPE, SIZE)</b> - passes if \\a TYPE must be a vector of the given size.\n- <b>EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(TYPE, ROWS, COLS)</b> - passes if \\a TYPE must be a matrix with given rows and columns.\n\n\\subsubsection PermissiveAssertions Permissive assertions\n\nThese assertions fail if the condition \\b cannot be met. For example, MatrixXd and Matrix4d may have the same size, so they pass EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE.\n\n- \\b EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(TYPE0,TYPE1) - fails if the two vector expression types must have different sizes.\n- \\b EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(TYPE0,TYPE1) - fails if the two matrix expression types must have different sizes.\n- \\b EIGEN_STATIC_ASSERT_SIZE_1x1(TYPE) - fails if \\a TYPE cannot be an 1x1 expression.\n\nSee StaticAssert.h for details such as what messages they throw.\n\n\\subsection DisableStaticAssert Disabling static assertions\n\nIf \\c EIGEN_NO_STATIC_ASSERT is defined, static assertions turn into <tt>eigen_assert</tt>'s, working like:\n\n\\code\n#define EIGEN_STATIC_ASSERT(CONDITION,MSG) eigen_assert((CONDITION) && #MSG);\n\\endcode\n\nThis saves compile time but consumes more run time. \\c EIGEN_NO_STATIC_ASSERT is undefined by default.\n\n*/\n}\n"
  },
  {
    "path": "libs/eigen/doc/TopicEigenExpressionTemplates.dox",
    "content": "namespace Eigen {\n\n/** \\page TopicEigenExpressionTemplates Expression templates in Eigen\n\n\nTODO: write this dox page!\n\nIs linked from the tutorial on arithmetic ops.\n\n*/\n\n}\n"
  },
  {
    "path": "libs/eigen/doc/TopicLazyEvaluation.dox",
    "content": "namespace Eigen {\n\n/** \\page TopicLazyEvaluation Lazy Evaluation and Aliasing\n\nExecutive summary: Eigen has intelligent compile-time mechanisms to enable lazy evaluation and removing temporaries where appropriate.\nIt will handle aliasing automatically in most cases, for example with matrix products. The automatic behavior can be overridden\nmanually by using the MatrixBase::eval() and MatrixBase::noalias() methods.\n\nWhen you write a line of code involving a complex expression such as\n\n\\code mat1 = mat2 + mat3 * (mat4 + mat5); \\endcode\n\nEigen determines automatically, for each sub-expression, whether to evaluate it into a temporary variable. Indeed, in certain cases it is better to evaluate immediately a sub-expression into a temporary variable, while in other cases it is better to avoid that.\n\nA traditional math library without expression templates always evaluates all sub-expressions into temporaries. So with this code,\n\n\\code vec1 = vec2 + vec3; \\endcode\n\na traditional library would evaluate \\c vec2 + vec3 into a temporary \\c vec4 and then copy \\c vec4  into \\c vec1. This is of course inefficient: the arrays are traversed twice, so there are a lot of useless load/store operations.\n\nExpression-templates-based libraries can avoid evaluating sub-expressions into temporaries, which in many cases results in large speed improvements. This is called <i>lazy evaluation</i> as an expression is getting evaluated as late as possible, instead of immediately. However, most other expression-templates-based libraries <i>always</i> choose lazy evaluation. There are two problems with that: first, lazy evaluation is not always a good choice for performance; second, lazy evaluation can be very dangerous, for example with matrix products: doing <tt>matrix = matrix*matrix</tt> gives a wrong result if the matrix product is lazy-evaluated, because of the way matrix product works.\n\nFor these reasons, Eigen has intelligent compile-time mechanisms to determine automatically when to use lazy evaluation, and when on the contrary it should evaluate immediately into a temporary variable.\n\nSo in the basic example,\n\n\\code matrix1 = matrix2 + matrix3; \\endcode\n\nEigen chooses lazy evaluation. Thus the arrays are traversed only once, producing optimized code. If you really want to force immediate evaluation, use \\link MatrixBase::eval() eval()\\endlink:\n\n\\code matrix1 = (matrix2 + matrix3).eval(); \\endcode\n\nHere is now a more involved example:\n\n\\code matrix1 = -matrix2 + matrix3 + 5 * matrix4; \\endcode\n\nEigen chooses lazy evaluation at every stage in that example, which is clearly the correct choice. In fact, lazy evaluation is the \"default choice\" and Eigen will choose it except in a few circumstances.\n\n<b>The first circumstance</b> in which Eigen chooses immediate evaluation, is when it sees an assignment <tt>a = b;</tt> and the expression \\c b has the evaluate-before-assigning \\link flags flag\\endlink. The most important example of such an expression is the \\link GeneralProduct matrix product expression\\endlink. For example, when you do\n\n\\code matrix = matrix * matrix; \\endcode\n\nEigen first evaluates <tt>matrix * matrix</tt> into a temporary matrix, and then copies it into the original \\c matrix. This guarantees a correct result as we saw above that lazy evaluation gives wrong results with matrix products. It also doesn't cost much, as the cost of the matrix product itself is much higher.\n\nWhat if you know that the result does no alias the operand of the product and want to force lazy evaluation? Then use \\link MatrixBase::noalias() .noalias()\\endlink instead. Here is an example:\n\n\\code matrix1.noalias() = matrix2 * matrix2; \\endcode\n\nHere, since we know that matrix2 is not the same matrix as matrix1, we know that lazy evaluation is not dangerous, so we may force lazy evaluation. Concretely, the effect of noalias() here is to bypass the evaluate-before-assigning \\link flags flag\\endlink.\n\n<b>The second circumstance</b> in which Eigen chooses immediate evaluation, is when it sees a nested expression such as <tt>a + b</tt> where \\c b is already an expression having the evaluate-before-nesting \\link flags flag\\endlink. Again, the most important example of such an expression is the \\link GeneralProduct matrix product expression\\endlink. For example, when you do\n\n\\code matrix1 = matrix2 + matrix3 * matrix4; \\endcode\n\nthe product <tt>matrix3 * matrix4</tt> gets evaluated immediately into a temporary matrix. Indeed, experiments showed that it is often beneficial for performance to evaluate immediately matrix products when they are nested into bigger expressions.\n\n<b>The third circumstance</b> in which Eigen chooses immediate evaluation, is when its cost model shows that the total cost of an operation is reduced if a sub-expression gets evaluated into a temporary. Indeed, in certain cases, an intermediate result is sufficiently costly to compute and is reused sufficiently many times, that is worth \"caching\". Here is an example:\n\n\\code matrix1 = matrix2 * (matrix3 + matrix4); \\endcode\n\nHere, provided the matrices have at least 2 rows and 2 columns, each coefficienct of the expression <tt>matrix3 + matrix4</tt> is going to be used several times in the matrix product. Instead of computing the sum everytime, it is much better to compute it once and store it in a temporary variable. Eigen understands this and evaluates <tt>matrix3 + matrix4</tt> into a temporary variable before evaluating the product.\n\n*/\n\n}\n"
  },
  {
    "path": "libs/eigen/doc/TopicLinearAlgebraDecompositions.dox",
    "content": "namespace Eigen {\n\n/** \\eigenManualPage TopicLinearAlgebraDecompositions Catalogue of dense decompositions\n\nThis page presents a catalogue of the dense matrix decompositions offered by Eigen.\nFor an introduction on linear solvers and decompositions, check this \\link TutorialLinearAlgebra page \\endlink.\n\n\\section TopicLinAlgBigTable Catalogue of decompositions offered by Eigen\n\n<table class=\"manual-vl\">\n    <tr>\n        <th class=\"meta\"></th>\n        <th class=\"meta\" colspan=\"5\">Generic information, not Eigen-specific</th>\n        <th class=\"meta\" colspan=\"3\">Eigen-specific</th>\n    </tr>\n\n    <tr>\n        <th>Decomposition</th>\n        <th>Requirements on the matrix</th>\n        <th>Speed</th>\n        <th>Algorithm reliability and accuracy</th>\n        <th>Rank-revealing</th>\n        <th>Allows to compute (besides linear solving)</th>\n        <th>Linear solver provided by Eigen</th>\n        <th>Maturity of Eigen's implementation</th>\n        <th>Optimizations</th>\n    </tr>\n\n    <tr>\n        <td>PartialPivLU</td>\n        <td>Invertible</td>\n        <td>Fast</td>\n        <td>Depends on condition number</td>\n        <td>-</td>\n        <td>-</td>\n        <td>Yes</td>\n        <td>Excellent</td>\n        <td>Blocking, Implicit MT</td>\n    </tr>\n\n    <tr class=\"alt\">\n        <td>FullPivLU</td>\n        <td>-</td>\n        <td>Slow</td>\n        <td>Proven</td>\n        <td>Yes</td>\n        <td>-</td>\n        <td>Yes</td>\n        <td>Excellent</td>\n        <td>-</td>\n    </tr>\n\n    <tr>\n        <td>HouseholderQR</td>\n        <td>-</td>\n        <td>Fast</td>\n        <td>Depends on condition number</td>\n        <td>-</td>\n        <td>Orthogonalization</td>\n        <td>Yes</td>\n        <td>Excellent</td>\n        <td>Blocking</td>\n    </tr>\n\n    <tr class=\"alt\">\n        <td>ColPivHouseholderQR</td>\n        <td>-</td>\n        <td>Fast</td>\n        <td>Good</td>\n        <td>Yes</td>\n        <td>Orthogonalization</td>\n        <td>Yes</td>\n        <td>Excellent</td>\n        <td><em>Soon: blocking</em></td>\n    </tr>\n\n    <tr>\n        <td>FullPivHouseholderQR</td>\n        <td>-</td>\n        <td>Slow</td>\n        <td>Proven</td>\n        <td>Yes</td>\n        <td>Orthogonalization</td>\n        <td>Yes</td>\n        <td>Average</td>\n        <td>-</td>\n    </tr>\n\n    <tr class=\"alt\">\n        <td>LLT</td>\n        <td>Positive definite</td>\n        <td>Very fast</td>\n        <td>Depends on condition number</td>\n        <td>-</td>\n        <td>-</td>\n        <td>Yes</td>\n        <td>Excellent</td>\n        <td>Blocking</td>\n    </tr>\n\n    <tr>\n        <td>LDLT</td>\n        <td>Positive or negative semidefinite<sup><a href=\"#note1\">1</a></sup></td>\n        <td>Very fast</td>\n        <td>Good</td>\n        <td>-</td>\n        <td>-</td>\n        <td>Yes</td>\n        <td>Excellent</td>\n        <td><em>Soon: blocking</em></td>\n    </tr>\n\n    <tr><th class=\"inter\" colspan=\"9\">\\n Singular values and eigenvalues decompositions</th></tr>\n\n    <tr>\n        <td>JacobiSVD (two-sided)</td>\n        <td>-</td>\n        <td>Slow (but fast for small matrices)</td>\n        <td>Excellent-Proven<sup><a href=\"#note3\">3</a></sup></td>\n        <td>Yes</td>\n        <td>Singular values/vectors, least squares</td>\n        <td>Yes (and does least squares)</td>\n        <td>Excellent</td>\n        <td>R-SVD</td>\n    </tr>\n\n    <tr class=\"alt\">\n        <td>SelfAdjointEigenSolver</td>\n        <td>Self-adjoint</td>\n        <td>Fast-average<sup><a href=\"#note2\">2</a></sup></td>\n        <td>Good</td>\n        <td>Yes</td>\n        <td>Eigenvalues/vectors</td>\n        <td>-</td>\n        <td>Good</td>\n        <td><em>Closed forms for 2x2 and 3x3</em></td>\n    </tr>\n\n    <tr>\n        <td>ComplexEigenSolver</td>\n        <td>Square</td>\n        <td>Slow-very slow<sup><a href=\"#note2\">2</a></sup></td>\n        <td>Depends on condition number</td>\n        <td>Yes</td>\n        <td>Eigenvalues/vectors</td>\n        <td>-</td>\n        <td>Average</td>\n        <td>-</td>\n    </tr>\n\n    <tr class=\"alt\">\n        <td>EigenSolver</td>\n        <td>Square and real</td>\n        <td>Average-slow<sup><a href=\"#note2\">2</a></sup></td>\n        <td>Depends on condition number</td>\n        <td>Yes</td>\n        <td>Eigenvalues/vectors</td>\n        <td>-</td>\n        <td>Average</td>\n        <td>-</td>\n    </tr>\n\n    <tr>\n        <td>GeneralizedSelfAdjointEigenSolver</td>\n        <td>Square</td>\n        <td>Fast-average<sup><a href=\"#note2\">2</a></sup></td>\n        <td>Depends on condition number</td>\n        <td>-</td>\n        <td>Generalized eigenvalues/vectors</td>\n        <td>-</td>\n        <td>Good</td>\n        <td>-</td>\n    </tr>\n\n    <tr><th class=\"inter\" colspan=\"9\">\\n Helper decompositions</th></tr>\n\n    <tr>\n        <td>RealSchur</td>\n        <td>Square and real</td>\n        <td>Average-slow<sup><a href=\"#note2\">2</a></sup></td>\n        <td>Depends on condition number</td>\n        <td>Yes</td>\n        <td>-</td>\n        <td>-</td>\n        <td>Average</td>\n        <td>-</td>\n    </tr>\n\n    <tr class=\"alt\">\n        <td>ComplexSchur</td>\n        <td>Square</td>\n        <td>Slow-very slow<sup><a href=\"#note2\">2</a></sup></td>\n        <td>Depends on condition number</td>\n        <td>Yes</td>\n        <td>-</td>\n        <td>-</td>\n        <td>Average</td>\n        <td>-</td>\n    </tr>\n\n    <tr class=\"alt\">\n        <td>Tridiagonalization</td>\n        <td>Self-adjoint</td>\n        <td>Fast</td>\n        <td>Good</td>\n        <td>-</td>\n        <td>-</td>\n        <td>-</td>\n        <td>Good</td>\n        <td><em>Soon: blocking</em></td>\n    </tr>\n\n    <tr>\n        <td>HessenbergDecomposition</td>\n        <td>Square</td>\n        <td>Average</td>\n        <td>Good</td>\n        <td>-</td>\n        <td>-</td>\n        <td>-</td>\n        <td>Good</td>\n        <td><em>Soon: blocking</em></td>\n    </tr>\n\n</table>\n\n\\b Notes:\n<ul>\n<li><a name=\"note1\">\\b 1: </a>There exist two variants of the LDLT algorithm. Eigen's one produces a pure diagonal D matrix, and therefore it cannot handle indefinite matrices, unlike Lapack's one which produces a block diagonal D matrix.</li>\n<li><a name=\"note2\">\\b 2: </a>Eigenvalues, SVD and Schur decompositions rely on iterative algorithms. Their convergence speed depends on how well the eigenvalues are separated.</li>\n<li><a name=\"note3\">\\b 3: </a>Our JacobiSVD is two-sided, making for proven and optimal precision for square matrices. For non-square matrices, we have to use a QR preconditioner first. The default choice, ColPivHouseholderQR, is already very reliable, but if you want it to be proven, use FullPivHouseholderQR instead.\n</ul>\n\n\\section TopicLinAlgTerminology Terminology\n\n<dl>\n  <dt><b>Selfadjoint</b></dt>\n    <dd>For a real matrix, selfadjoint is a synonym for symmetric. For a complex matrix, selfadjoint is a synonym for \\em hermitian.\n        More generally, a matrix \\f$ A \\f$ is selfadjoint if and only if it is equal to its adjoint \\f$ A^* \\f$. The adjoint is also called the \\em conjugate \\em transpose. </dd>\n  <dt><b>Positive/negative definite</b></dt>\n    <dd>A selfadjoint matrix \\f$ A \\f$ is positive definite if \\f$ v^* A v > 0 \\f$ for any non zero vector \\f$ v \\f$.\n        In the same vein, it is negative definite if \\f$ v^* A v < 0 \\f$ for any non zero vector \\f$ v \\f$ </dd>\n  <dt><b>Positive/negative semidefinite</b></dt>\n    <dd>A selfadjoint matrix \\f$ A \\f$ is positive semi-definite if \\f$ v^* A v \\ge 0 \\f$ for any non zero vector \\f$ v \\f$.\n        In the same vein, it is negative semi-definite if \\f$ v^* A v \\le 0 \\f$ for any non zero vector \\f$ v \\f$ </dd>\n\n  <dt><b>Blocking</b></dt>\n    <dd>Means the algorithm can work per block, whence guaranteeing a good scaling of the performance for large matrices.</dd>\n  <dt><b>Implicit Multi Threading (MT)</b></dt>\n    <dd>Means the algorithm can take advantage of multicore processors via OpenMP. \"Implicit\" means the algortihm itself is not parallelized, but that it relies on parallelized matrix-matrix product rountines.</dd>\n  <dt><b>Explicit Multi Threading (MT)</b></dt>\n    <dd>Means the algorithm is explicitely parallelized to take advantage of multicore processors via OpenMP.</dd>\n  <dt><b>Meta-unroller</b></dt>\n    <dd>Means the algorithm is automatically and explicitly unrolled for very small fixed size matrices.</dd>\n  <dt><b></b></dt>\n    <dd></dd>\n</dl>\n\n*/\n\n}\n"
  },
  {
    "path": "libs/eigen/doc/TopicMultithreading.dox",
    "content": "namespace Eigen {\n\n/** \\page TopicMultiThreading Eigen and multi-threading\n\n\\section TopicMultiThreading_MakingEigenMT Make Eigen run in parallel\n\nSome Eigen's algorithms can exploit the multiple cores present in your hardware. To this end, it is enough to enable OpenMP on your compiler, for instance:\n * GCC: \\c -fopenmp\n * ICC: \\c -openmp\n * MSVC: check the respective option in the build properties.\nYou can control the number of thread that will be used using either the OpenMP API or Eiegn's API using the following priority:\n\\code\n OMP_NUM_THREADS=n ./my_program\n omp_set_num_threads(n);\n Eigen::setNbThreads(n);\n\\endcode\nUnless setNbThreads has been called, Eigen uses the number of threads specified by OpenMP. You can restore this bahavior by calling \\code setNbThreads(0); \\endcode\nYou can query the number of threads that will be used with:\n\\code\nn = Eigen::nbThreads( );\n\\endcode\nYou can disable Eigen's multi threading at compile time by defining the EIGEN_DONT_PARALLELIZE preprocessor token.\n\nCurrently, the following algorithms can make use of multi-threading:\n * general matrix - matrix products\n * PartialPivLU\n\n\\section TopicMultiThreading_UsingEigenWithMT Using Eigen in a multi-threaded application\n\nIn the case your own application is multithreaded, and multiple threads make calls to Eigen, then you have to initialize Eigen by calling the following routine \\b before creating the threads:\n\\code\n#include <Eigen/Core>\n\nint main(int argc, char** argv)\n{\n  Eigen::initParallel();\n  \n  ...\n}\n\\endcode\n\nIn the case your application is parallelized with OpenMP, you might want to disable Eigen's own parallization as detailed in the previous section.\n\n*/\n\n}\n"
  },
  {
    "path": "libs/eigen/doc/TopicResizing.dox",
    "content": "namespace Eigen {\n\n/** \\page TopicResizing Resizing\n\n\nTODO: write this dox page!\n\nIs linked from the tutorial on the Matrix class.\n\n*/\n}\n"
  },
  {
    "path": "libs/eigen/doc/TopicScalarTypes.dox",
    "content": "namespace Eigen {\n\n/** \\page TopicScalarTypes Scalar types\n\n\nTODO: write this dox page!\n\nIs linked from the tutorial on the Matrix class.\n\n*/\n\n}\n"
  },
  {
    "path": "libs/eigen/doc/TopicVectorization.dox",
    "content": "namespace Eigen {\n\n/** \\page TopicVectorization Vectorization\n\n\nTODO: write this dox page!\n\n*/\n}\n"
  },
  {
    "path": "libs/eigen/doc/TutorialAdvancedInitialization.dox",
    "content": "namespace Eigen {\n\n/** \\eigenManualPage TutorialAdvancedInitialization Advanced initialization\n\nThis page discusses several advanced methods for initializing matrices. It gives more details on the\ncomma-initializer, which was introduced before. It also explains how to get special matrices such as the\nidentity matrix and the zero matrix.\n\n\\eigenAutoToc\n\n\\section TutorialAdvancedInitializationCommaInitializer The comma initializer\n\nEigen offers a comma initializer syntax which allows the user to easily set all the coefficients of a matrix,\nvector or array. Simply list the coefficients, starting at the top-left corner and moving from left to right\nand from the top to the bottom. The size of the object needs to be specified beforehand. If you list too few\nor too many coefficients, Eigen will complain.\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include Tutorial_commainit_01.cpp\n</td>\n<td>\n\\verbinclude Tutorial_commainit_01.out\n</td></tr></table>\n\nMoreover, the elements of the initialization list may themselves be vectors or matrices. A common use is\nto join vectors or matrices together. For example, here is how to join two row vectors together. Remember\nthat you have to set the size before you can use the comma initializer.\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include Tutorial_AdvancedInitialization_Join.cpp\n</td>\n<td>\n\\verbinclude Tutorial_AdvancedInitialization_Join.out\n</td></tr></table>\n\nWe can use the same technique to initialize matrices with a block structure.\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include Tutorial_AdvancedInitialization_Block.cpp\n</td>\n<td>\n\\verbinclude Tutorial_AdvancedInitialization_Block.out\n</td></tr></table>\n\nThe comma initializer can also be used to fill block expressions such as <tt>m.row(i)</tt>. Here is a more\ncomplicated way to get the same result as in the first example above:\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include Tutorial_commainit_01b.cpp\n</td>\n<td>\n\\verbinclude Tutorial_commainit_01b.out\n</td></tr></table>\n\n\n\\section TutorialAdvancedInitializationSpecialMatrices Special matrices and arrays\n\nThe Matrix and Array classes have static methods like \\link DenseBase::Zero() Zero()\\endlink, which can be\nused to initialize all coefficients to zero. There are three variants. The first variant takes no arguments\nand can only be used for fixed-size objects. If you want to initialize a dynamic-size object to zero, you need\nto specify the size. Thus, the second variant requires one argument and can be used for one-dimensional\ndynamic-size objects, while the third variant requires two arguments and can be used for two-dimensional\nobjects. All three variants are illustrated in the following example:\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include Tutorial_AdvancedInitialization_Zero.cpp\n</td>\n<td>\n\\verbinclude Tutorial_AdvancedInitialization_Zero.out\n</td></tr></table>\n\nSimilarly, the static method \\link DenseBase::Constant() Constant\\endlink(value) sets all coefficients to \\c value.\nIf the size of the object needs to be specified, the additional arguments go before the \\c value\nargument, as in <tt>MatrixXd::Constant(rows, cols, value)</tt>. The method \\link DenseBase::Random() Random()\n\\endlink fills the matrix or array with random coefficients. The identity matrix can be obtained by calling\n\\link MatrixBase::Identity() Identity()\\endlink; this method is only available for Matrix, not for Array,\nbecause \"identity matrix\" is a linear algebra concept.  The method\n\\link DenseBase::LinSpaced LinSpaced\\endlink(size, low, high) is only available for vectors and\none-dimensional arrays; it yields a vector of the specified size whose coefficients are equally spaced between\n\\c low and \\c high. The method \\c LinSpaced() is illustrated in the following example, which prints a table\nwith angles in degrees, the corresponding angle in radians, and their sine and cosine.\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include Tutorial_AdvancedInitialization_LinSpaced.cpp\n</td>\n<td>\n\\verbinclude Tutorial_AdvancedInitialization_LinSpaced.out\n</td></tr></table>\n\nThis example shows that objects like the ones returned by LinSpaced() can be assigned to variables (and\nexpressions). Eigen defines utility functions like \\link DenseBase::setZero() setZero()\\endlink, \n\\link MatrixBase::setIdentity() \\endlink and \\link DenseBase::setLinSpaced() \\endlink to do this\nconveniently. The following example contrasts three ways to construct the matrix\n\\f$ J = \\bigl[ \\begin{smallmatrix} O & I \\\\ I & O \\end{smallmatrix} \\bigr] \\f$: using static methods and\nassignment, using static methods and the comma-initializer, or using the setXxx() methods.\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include Tutorial_AdvancedInitialization_ThreeWays.cpp\n</td>\n<td>\n\\verbinclude Tutorial_AdvancedInitialization_ThreeWays.out\n</td></tr></table>\n\nA summary of all pre-defined matrix, vector and array objects can be found in the \\ref QuickRefPage.\n\n\n\\section TutorialAdvancedInitializationTemporaryObjects Usage as temporary objects\n\nAs shown above, static methods as Zero() and Constant() can be used to initialize variables at the time of\ndeclaration or at the right-hand side of an assignment operator. You can think of these methods as returning a\nmatrix or array; in fact, they return so-called \\ref TopicEigenExpressionTemplates \"expression objects\" which\nevaluate to a matrix or array when needed, so that this syntax does not incur any overhead.\n\nThese expressions can also be used as a temporary object. The second example in\nthe \\ref GettingStarted guide, which we reproduce here, already illustrates this.\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include QuickStart_example2_dynamic.cpp\n</td>\n<td>\n\\verbinclude QuickStart_example2_dynamic.out\n</td></tr></table>\n\nThe expression <tt>m + MatrixXf::Constant(3,3,1.2)</tt> constructs the 3-by-3 matrix expression with all its coefficients\nequal to 1.2 plus the corresponding coefficient of \\a m.\n\nThe comma-initializer, too, can also be used to construct temporary objects. The following example constructs a random\nmatrix of size 2-by-3, and then multiplies this matrix on the left with \n\\f$ \\bigl[ \\begin{smallmatrix} 0 & 1 \\\\ 1 & 0 \\end{smallmatrix} \\bigr] \\f$.\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include Tutorial_AdvancedInitialization_CommaTemporary.cpp\n</td>\n<td>\n\\verbinclude Tutorial_AdvancedInitialization_CommaTemporary.out\n</td></tr></table>\n\nThe \\link CommaInitializer::finished() finished() \\endlink method is necessary here to get the actual matrix\nobject once the comma initialization of our temporary submatrix is done.\n\n\n*/\n\n}\n"
  },
  {
    "path": "libs/eigen/doc/TutorialArrayClass.dox",
    "content": "namespace Eigen {\n\n/** \\eigenManualPage TutorialArrayClass The Array class and coefficient-wise operations\n\nThis page aims to provide an overview and explanations on how to use\nEigen's Array class.\n\n\\eigenAutoToc\n  \n\\section TutorialArrayClassIntro What is the Array class?\n\nThe Array class provides general-purpose arrays, as opposed to the Matrix class which\nis intended for linear algebra. Furthermore, the Array class provides an easy way to\nperform coefficient-wise operations, which might not have a linear algebraic meaning,\nsuch as adding a constant to every coefficient in the array or multiplying two arrays coefficient-wise.\n\n\n\\section TutorialArrayClassTypes Array types\nArray is a class template taking the same template parameters as Matrix.\nAs with Matrix, the first three template parameters are mandatory:\n\\code\nArray<typename Scalar, int RowsAtCompileTime, int ColsAtCompileTime>\n\\endcode\nThe last three template parameters are optional. Since this is exactly the same as for Matrix,\nwe won't explain it again here and just refer to \\ref TutorialMatrixClass.\n\nEigen also provides typedefs for some common cases, in a way that is similar to the Matrix typedefs\nbut with some slight differences, as the word \"array\" is used for both 1-dimensional and 2-dimensional arrays.\nWe adopt the convention that typedefs of the form ArrayNt stand for 1-dimensional arrays, where N and t are\nthe size and the scalar type, as in the Matrix typedefs explained on \\ref TutorialMatrixClass \"this page\". For 2-dimensional arrays, we\nuse typedefs of the form ArrayNNt. Some examples are shown in the following table:\n\n<table class=\"manual\">\n  <tr>\n    <th>Type </th>\n    <th>Typedef </th>\n  </tr>\n  <tr>\n    <td> \\code Array<float,Dynamic,1> \\endcode </td>\n    <td> \\code ArrayXf \\endcode </td>\n  </tr>\n  <tr>\n    <td> \\code Array<float,3,1> \\endcode </td>\n    <td> \\code Array3f \\endcode </td>\n  </tr>\n  <tr>\n    <td> \\code Array<double,Dynamic,Dynamic> \\endcode </td>\n    <td> \\code ArrayXXd \\endcode </td>\n  </tr>\n  <tr>\n    <td> \\code Array<double,3,3> \\endcode </td>\n    <td> \\code Array33d \\endcode </td>\n  </tr>\n</table>\n\n\n\\section TutorialArrayClassAccess Accessing values inside an Array\n\nThe parenthesis operator is overloaded to provide write and read access to the coefficients of an array, just as with matrices.\nFurthermore, the \\c << operator can be used to initialize arrays (via the comma initializer) or to print them.\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include Tutorial_ArrayClass_accessors.cpp\n</td>\n<td>\n\\verbinclude Tutorial_ArrayClass_accessors.out\n</td></tr></table>\n\nFor more information about the comma initializer, see \\ref TutorialAdvancedInitialization.\n\n\n\\section TutorialArrayClassAddSub Addition and subtraction\n\nAdding and subtracting two arrays is the same as for matrices.\nThe operation is valid if both arrays have the same size, and the addition or subtraction is done coefficient-wise.\n\nArrays also support expressions of the form <tt>array + scalar</tt> which add a scalar to each coefficient in the array.\nThis provides a functionality that is not directly available for Matrix objects.\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include Tutorial_ArrayClass_addition.cpp\n</td>\n<td>\n\\verbinclude Tutorial_ArrayClass_addition.out\n</td></tr></table>\n\n\n\\section TutorialArrayClassMult Array multiplication\n\nFirst of all, of course you can multiply an array by a scalar, this works in the same way as matrices. Where arrays\nare fundamentally different from matrices, is when you multiply two together. Matrices interpret\nmultiplication as matrix product and arrays interpret multiplication as coefficient-wise product. Thus, two \narrays can be multiplied if and only if they have the same dimensions.\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include Tutorial_ArrayClass_mult.cpp\n</td>\n<td>\n\\verbinclude Tutorial_ArrayClass_mult.out\n</td></tr></table>\n\n\n\\section TutorialArrayClassCwiseOther Other coefficient-wise operations\n\nThe Array class defines other coefficient-wise operations besides the addition, subtraction and multiplication\noperators described above. For example, the \\link ArrayBase::abs() .abs() \\endlink method takes the absolute\nvalue of each coefficient, while \\link ArrayBase::sqrt() .sqrt() \\endlink computes the square root of the\ncoefficients. If you have two arrays of the same size, you can call \\link ArrayBase::min(const Eigen::ArrayBase<OtherDerived>&) const .min(.) \\endlink to\nconstruct the array whose coefficients are the minimum of the corresponding coefficients of the two given\narrays. These operations are illustrated in the following example.\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include Tutorial_ArrayClass_cwise_other.cpp\n</td>\n<td>\n\\verbinclude Tutorial_ArrayClass_cwise_other.out\n</td></tr></table>\n\nMore coefficient-wise operations can be found in the \\ref QuickRefPage.\n\n\n\\section TutorialArrayClassConvert Converting between array and matrix expressions\n\nWhen should you use objects of the Matrix class and when should you use objects of the Array class? You cannot\napply Matrix operations on arrays, or Array operations on matrices. Thus, if you need to do linear algebraic\noperations such as matrix multiplication, then you should use matrices; if you need to do coefficient-wise\noperations, then you should use arrays. However, sometimes it is not that simple, but you need to use both\nMatrix and Array operations. In that case, you need to convert a matrix to an array or reversely. This gives\naccess to all operations regardless of the choice of declaring objects as arrays or as matrices.\n\n\\link MatrixBase Matrix expressions \\endlink have an \\link MatrixBase::array() .array() \\endlink method that\n'converts' them into \\link ArrayBase array expressions\\endlink, so that coefficient-wise operations\ncan be applied easily. Conversely, \\link ArrayBase array expressions \\endlink\nhave a \\link ArrayBase::matrix() .matrix() \\endlink method. As with all Eigen expression abstractions,\nthis doesn't have any runtime cost (provided that you let your compiler optimize).\nBoth \\link MatrixBase::array() .array() \\endlink and \\link ArrayBase::matrix() .matrix() \\endlink \ncan be used as rvalues and as lvalues.\n\nMixing matrices and arrays in an expression is forbidden with Eigen. For instance, you cannot add a matrix and\narray directly; the operands of a \\c + operator should either both be matrices or both be arrays. However,\nit is easy to convert from one to the other with \\link MatrixBase::array() .array() \\endlink and \n\\link ArrayBase::matrix() .matrix()\\endlink. The exception to this rule is the assignment operator: it is\nallowed to assign a matrix expression to an array variable, or to assign an array expression to a matrix\nvariable.\n\nThe following example shows how to use array operations on a Matrix object by employing the \n\\link MatrixBase::array() .array() \\endlink method. For example, the statement \n<tt>result = m.array() * n.array()</tt> takes two matrices \\c m and \\c n, converts them both to an array, uses\n* to multiply them coefficient-wise and assigns the result to the matrix variable \\c result (this is legal\nbecause Eigen allows assigning array expressions to matrix variables). \n\nAs a matter of fact, this usage case is so common that Eigen provides a \\link MatrixBase::cwiseProduct() const\n.cwiseProduct(.) \\endlink method for matrices to compute the coefficient-wise product. This is also shown in\nthe example program.\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include Tutorial_ArrayClass_interop_matrix.cpp\n</td>\n<td>\n\\verbinclude Tutorial_ArrayClass_interop_matrix.out\n</td></tr></table>\n\nSimilarly, if \\c array1 and \\c array2 are arrays, then the expression <tt>array1.matrix() * array2.matrix()</tt>\ncomputes their matrix product.\n\nHere is a more advanced example. The expression <tt>(m.array() + 4).matrix() * m</tt> adds 4 to every\ncoefficient in the matrix \\c m and then computes the matrix product of the result with \\c m. Similarly, the\nexpression <tt>(m.array() * n.array()).matrix() * m</tt> computes the coefficient-wise product of the matrices\n\\c m and \\c n and then the matrix product of the result with \\c m.\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include Tutorial_ArrayClass_interop.cpp\n</td>\n<td>\n\\verbinclude Tutorial_ArrayClass_interop.out\n</td></tr></table>\n\n*/\n\n}\n"
  },
  {
    "path": "libs/eigen/doc/TutorialBlockOperations.dox",
    "content": "namespace Eigen {\n\n/** \\eigenManualPage TutorialBlockOperations Block operations\n\nThis page explains the essentials of block operations.\nA block is a rectangular part of a matrix or array. Blocks expressions can be used both\nas rvalues and as lvalues. As usual with Eigen expressions, this abstraction has zero runtime cost\nprovided that you let your compiler optimize.\n\n\\eigenAutoToc\n\n\\section TutorialBlockOperationsUsing Using block operations\n\nThe most general block operation in Eigen is called \\link DenseBase::block() .block() \\endlink.\nThere are two versions, whose syntax is as follows:\n\n<table class=\"manual\">\n<tr><th>\\b %Block \\b operation</td>\n<th>Version constructing a \\n dynamic-size block expression</th>\n<th>Version constructing a \\n fixed-size block expression</th></tr>\n<tr><td>%Block of size <tt>(p,q)</tt>, starting at <tt>(i,j)</tt></td>\n    <td>\\code\nmatrix.block(i,j,p,q);\\endcode </td>\n    <td>\\code \nmatrix.block<p,q>(i,j);\\endcode </td>\n</tr>\n</table>\n\nAs always in Eigen, indices start at 0.\n\nBoth versions can be used on fixed-size and dynamic-size matrices and arrays.\nThese two expressions are semantically equivalent.\nThe only difference is that the fixed-size version will typically give you faster code if the block size is small,\nbut requires this size to be known at compile time.\n\nThe following program uses the dynamic-size and fixed-size versions to print the values of several blocks inside a\nmatrix.\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include Tutorial_BlockOperations_print_block.cpp\n</td>\n<td>\n\\verbinclude Tutorial_BlockOperations_print_block.out\n</td></tr></table>\n\nIn the above example the \\link DenseBase::block() .block() \\endlink function was employed as a \\em rvalue, i.e.\nit was only read from. However, blocks can also be used as \\em lvalues, meaning that you can assign to a block.\n\nThis is illustrated in the following example. This example also demonstrates blocks in arrays, which works exactly like the above-demonstrated blocks in matrices.\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include Tutorial_BlockOperations_block_assignment.cpp\n</td>\n<td>\n\\verbinclude Tutorial_BlockOperations_block_assignment.out\n</td></tr></table>\n\nWhile the \\link DenseBase::block() .block() \\endlink method can be used for any block operation, there are\nother methods for special cases, providing more specialized API and/or better performance. On the topic of performance, all what\nmatters is that you give Eigen as much information as possible at compile time. For example, if your block is a single whole column in a matrix,\nusing the specialized \\link DenseBase::col() .col() \\endlink function described below lets Eigen know that, which can give it optimization opportunities.\n\nThe rest of this page describes these specialized methods.\n\n\\section TutorialBlockOperationsSyntaxColumnRows Columns and rows\n\nIndividual columns and rows are special cases of blocks. Eigen provides methods to easily address them:\n\\link DenseBase::col() .col() \\endlink and \\link DenseBase::row() .row()\\endlink.\n\n<table class=\"manual\">\n<tr><th>%Block operation</th>\n<th>Method</th>\n<tr><td>i<sup>th</sup> row\n                    \\link DenseBase::row() * \\endlink</td>\n    <td>\\code\nmatrix.row(i);\\endcode </td>\n</tr>\n<tr><td>j<sup>th</sup> column\n                    \\link DenseBase::col() * \\endlink</td>\n    <td>\\code\nmatrix.col(j);\\endcode </td>\n</tr>\n</table>\n\nThe argument for \\p col() and \\p row() is the index of the column or row to be accessed. As always in Eigen, indices start at 0.\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include Tutorial_BlockOperations_colrow.cpp\n</td>\n<td>\n\\verbinclude Tutorial_BlockOperations_colrow.out\n</td></tr></table>\n\nThat example also demonstrates that block expressions (here columns) can be used in arithmetic like any other expression.\n\n\n\\section TutorialBlockOperationsSyntaxCorners Corner-related operations\n\nEigen also provides special methods for blocks that are flushed against one of the corners or sides of a\nmatrix or array. For instance, \\link DenseBase::topLeftCorner() .topLeftCorner() \\endlink can be used to refer\nto a block in the top-left corner of a matrix.\n\nThe different possibilities are summarized in the following table:\n\n<table class=\"manual\">\n<tr><th>%Block \\b operation</td>\n<th>Version constructing a \\n dynamic-size block expression</th>\n<th>Version constructing a \\n fixed-size block expression</th></tr>\n<tr><td>Top-left p by q block \\link DenseBase::topLeftCorner() * \\endlink</td>\n    <td>\\code\nmatrix.topLeftCorner(p,q);\\endcode </td>\n    <td>\\code \nmatrix.topLeftCorner<p,q>();\\endcode </td>\n</tr>\n<tr><td>Bottom-left p by q block\n              \\link DenseBase::bottomLeftCorner() * \\endlink</td>\n    <td>\\code\nmatrix.bottomLeftCorner(p,q);\\endcode </td>\n    <td>\\code \nmatrix.bottomLeftCorner<p,q>();\\endcode </td>\n</tr>\n<tr><td>Top-right p by q block\n              \\link DenseBase::topRightCorner() * \\endlink</td>\n    <td>\\code\nmatrix.topRightCorner(p,q);\\endcode </td>\n    <td>\\code \nmatrix.topRightCorner<p,q>();\\endcode </td>\n</tr>\n<tr><td>Bottom-right p by q block\n               \\link DenseBase::bottomRightCorner() * \\endlink</td>\n    <td>\\code\nmatrix.bottomRightCorner(p,q);\\endcode </td>\n    <td>\\code \nmatrix.bottomRightCorner<p,q>();\\endcode </td>\n</tr>\n<tr><td>%Block containing the first q rows\n                   \\link DenseBase::topRows() * \\endlink</td>\n    <td>\\code\nmatrix.topRows(q);\\endcode </td>\n    <td>\\code \nmatrix.topRows<q>();\\endcode </td>\n</tr>\n<tr><td>%Block containing the last q rows\n                    \\link DenseBase::bottomRows() * \\endlink</td>\n    <td>\\code\nmatrix.bottomRows(q);\\endcode </td>\n    <td>\\code \nmatrix.bottomRows<q>();\\endcode </td>\n</tr>\n<tr><td>%Block containing the first p columns\n                    \\link DenseBase::leftCols() * \\endlink</td>\n    <td>\\code\nmatrix.leftCols(p);\\endcode </td>\n    <td>\\code \nmatrix.leftCols<p>();\\endcode </td>\n</tr>\n<tr><td>%Block containing the last q columns\n                    \\link DenseBase::rightCols() * \\endlink</td>\n    <td>\\code\nmatrix.rightCols(q);\\endcode </td>\n    <td>\\code \nmatrix.rightCols<q>();\\endcode </td>\n</tr>\n</table>\n\nHere is a simple example illustrating the use of the operations presented above:\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include Tutorial_BlockOperations_corner.cpp\n</td>\n<td>\n\\verbinclude Tutorial_BlockOperations_corner.out\n</td></tr></table>\n\n\n\\section TutorialBlockOperationsSyntaxVectors Block operations for vectors\n\nEigen also provides a set of block operations designed specifically for the special case of vectors and one-dimensional arrays:\n\n<table class=\"manual\">\n<tr><th> %Block operation</th>\n<th>Version constructing a \\n dynamic-size block expression</th>\n<th>Version constructing a \\n fixed-size block expression</th></tr>\n<tr><td>%Block containing the first \\p n elements \n                    \\link DenseBase::head() * \\endlink</td>\n    <td>\\code\nvector.head(n);\\endcode </td>\n    <td>\\code \nvector.head<n>();\\endcode </td>\n</tr>\n<tr><td>%Block containing the last \\p n elements\n                    \\link DenseBase::tail() * \\endlink</td>\n    <td>\\code\nvector.tail(n);\\endcode </td>\n    <td>\\code \nvector.tail<n>();\\endcode </td>\n</tr>\n<tr><td>%Block containing \\p n elements, starting at position \\p i\n                    \\link DenseBase::segment() * \\endlink</td>\n    <td>\\code\nvector.segment(i,n);\\endcode </td>\n    <td>\\code \nvector.segment<n>(i);\\endcode </td>\n</tr>\n</table>\n\n\nAn example is presented below:\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include Tutorial_BlockOperations_vector.cpp\n</td>\n<td>\n\\verbinclude Tutorial_BlockOperations_vector.out\n</td></tr></table>\n\n*/\n\n}\n"
  },
  {
    "path": "libs/eigen/doc/TutorialGeometry.dox",
    "content": "namespace Eigen {\n\n/** \\eigenManualPage TutorialGeometry Space transformations\n\nIn this page, we will introduce the many possibilities offered by the \\ref Geometry_Module \"geometry module\" to deal with 2D and 3D rotations and projective or affine transformations.\n\n\\eigenAutoToc\n\nEigen's Geometry module provides two different kinds of geometric transformations:\n  - Abstract transformations, such as rotations (represented by \\ref AngleAxis \"angle and axis\" or by a \\ref Quaternion \"quaternion\"), \\ref Translation \"translations\", \\ref Scaling \"scalings\". These transformations are NOT represented as matrices, but you can nevertheless mix them with matrices and vectors in expressions, and convert them to matrices if you wish.\n  - Projective or affine transformation matrices: see the Transform class. These are really matrices.\n\n\\note If you are working with OpenGL 4x4 matrices then Affine3f and Affine3d are what you want. Since Eigen defaults to column-major storage, you can directly use the Transform::data() method to pass your transformation matrix to OpenGL.\n\nYou can construct a Transform from an abstract transformation, like this:\n\\code\n  Transform t(AngleAxis(angle,axis));\n\\endcode\nor like this:\n\\code\n  Transform t;\n  t = AngleAxis(angle,axis);\n\\endcode\nBut note that unfortunately, because of how C++ works, you can \\b not do this:\n\\code\n  Transform t = AngleAxis(angle,axis);\n\\endcode\n<span class=\"note\">\\b Explanation: In the C++ language, this would require Transform to have a non-explicit conversion constructor from AngleAxis, but we really don't want to allow implicit casting here.\n</span>\n\n\\section TutorialGeoElementaryTransformations Transformation types\n\n<table class=\"manual\">\n<tr><th>Transformation type</th><th>Typical initialization code</th></tr>\n<tr><td>\n\\ref Rotation2D \"2D rotation\" from an angle</td><td>\\code\nRotation2D<float> rot2(angle_in_radian);\\endcode</td></tr>\n<tr class=\"alt\"><td>\n3D rotation as an \\ref AngleAxis \"angle + axis\"</td><td>\\code\nAngleAxis<float> aa(angle_in_radian, Vector3f(ax,ay,az));\\endcode\n<span class=\"note\">The axis vector must be normalized.</span></td></tr>\n<tr><td>\n3D rotation as a \\ref Quaternion \"quaternion\"</td><td>\\code\nQuaternion<float> q;  q = AngleAxis<float>(angle_in_radian, axis);\\endcode</td></tr>\n<tr class=\"alt\"><td>\nN-D Scaling</td><td>\\code\nScaling(sx, sy)\nScaling(sx, sy, sz)\nScaling(s)\nScaling(vecN)\\endcode</td></tr>\n<tr><td>\nN-D Translation</td><td>\\code\nTranslation<float,2>(tx, ty)\nTranslation<float,3>(tx, ty, tz)\nTranslation<float,N>(s)\nTranslation<float,N>(vecN)\\endcode</td></tr>\n<tr class=\"alt\"><td>\nN-D \\ref TutorialGeoTransform \"Affine transformation\"</td><td>\\code\nTransform<float,N,Affine> t = concatenation_of_any_transformations;\nTransform<float,3,Affine> t = Translation3f(p) * AngleAxisf(a,axis) * Scaling(s);\\endcode</td></tr>\n<tr><td>\nN-D Linear transformations \\n\n<em class=note>(pure rotations, \\n scaling, etc.)</em></td><td>\\code\nMatrix<float,N> t = concatenation_of_rotations_and_scalings;\nMatrix<float,2> t = Rotation2Df(a) * Scaling(s);\nMatrix<float,3> t = AngleAxisf(a,axis) * Scaling(s);\\endcode</td></tr>\n</table>\n\n<strong>Notes on rotations</strong>\\n To transform more than a single vector the preferred\nrepresentations are rotation matrices, while for other usages Quaternion is the\nrepresentation of choice as they are compact, fast and stable. Finally Rotation2D and\nAngleAxis are mainly convenient types to create other rotation objects.\n\n<strong>Notes on Translation and Scaling</strong>\\n Like AngleAxis, these classes were\ndesigned to simplify the creation/initialization of linear (Matrix) and affine (Transform)\ntransformations. Nevertheless, unlike AngleAxis which is inefficient to use, these classes\nmight still be interesting to write generic and efficient algorithms taking as input any\nkind of transformations.\n\nAny of the above transformation types can be converted to any other types of the same nature,\nor to a more generic type. Here are some additional examples:\n<table class=\"manual\">\n<tr><td>\\code\nRotation2Df r;  r  = Matrix2f(..);       // assumes a pure rotation matrix\nAngleAxisf aa;  aa = Quaternionf(..);\nAngleAxisf aa;  aa = Matrix3f(..);       // assumes a pure rotation matrix\nMatrix2f m;     m  = Rotation2Df(..);\nMatrix3f m;     m  = Quaternionf(..);       Matrix3f m;   m = Scaling(..);\nAffine3f m;     m  = AngleAxis3f(..);       Affine3f m;   m = Scaling(..);\nAffine3f m;     m  = Translation3f(..);     Affine3f m;   m = Matrix3f(..);\n\\endcode</td></tr>\n</table>\n\n\n<a href=\"#\" class=\"top\">top</a>\\section TutorialGeoCommontransformationAPI Common API across transformation types\n\nTo some extent, Eigen's \\ref Geometry_Module \"geometry module\" allows you to write\ngeneric algorithms working on any kind of transformation representations:\n<table class=\"manual\">\n<tr><td>\nConcatenation of two transformations</td><td>\\code\ngen1 * gen2;\\endcode</td></tr>\n<tr class=\"alt\"><td>Apply the transformation to a vector</td><td>\\code\nvec2 = gen1 * vec1;\\endcode</td></tr>\n<tr><td>Get the inverse of the transformation</td><td>\\code\ngen2 = gen1.inverse();\\endcode</td></tr>\n<tr class=\"alt\"><td>Spherical interpolation \\n (Rotation2D and Quaternion only)</td><td>\\code\nrot3 = rot1.slerp(alpha,rot2);\\endcode</td></tr>\n</table>\n\n\n\n<a href=\"#\" class=\"top\">top</a>\\section TutorialGeoTransform Affine transformations\nGeneric affine transformations are represented by the Transform class which internaly\nis a (Dim+1)^2 matrix. In Eigen we have chosen to not distinghish between points and\nvectors such that all points are actually represented by displacement vectors from the\norigin ( \\f$ \\mathbf{p} \\equiv \\mathbf{p}-0 \\f$ ). With that in mind, real points and\nvector distinguish when the transformation is applied.\n<table class=\"manual\">\n<tr><td>\nApply the transformation to a \\b point </td><td>\\code\nVectorNf p1, p2;\np2 = t * p1;\\endcode</td></tr>\n<tr class=\"alt\"><td>\nApply the transformation to a \\b vector </td><td>\\code\nVectorNf vec1, vec2;\nvec2 = t.linear() * vec1;\\endcode</td></tr>\n<tr><td>\nApply a \\em general transformation \\n to a \\b normal \\b vector\n(<a href=\"http://femto.cs.uiuc.edu/faqs/cga-faq.html#S5.27\">explanations</a>)</td><td>\\code\nVectorNf n1, n2;\nMatrixNf normalMatrix = t.linear().inverse().transpose();\nn2 = (normalMatrix * n1).normalized();\\endcode</td></tr>\n<tr class=\"alt\"><td>\nApply a transformation with \\em pure \\em rotation \\n to a \\b normal \\b vector\n(no scaling, no shear)</td><td>\\code\nn2 = t.linear() * n1;\\endcode</td></tr>\n<tr><td>\nOpenGL compatibility \\b 3D </td><td>\\code\nglLoadMatrixf(t.data());\\endcode</td></tr>\n<tr class=\"alt\"><td>\nOpenGL compatibility \\b 2D </td><td>\\code\nAffine3f aux(Affine3f::Identity());\naux.linear().topLeftCorner<2,2>() = t.linear();\naux.translation().start<2>() = t.translation();\nglLoadMatrixf(aux.data());\\endcode</td></tr>\n</table>\n\n\\b Component \\b accessors\n<table class=\"manual\">\n<tr><td>\nfull read-write access to the internal matrix</td><td>\\code\nt.matrix() = matN1xN1;    // N1 means N+1\nmatN1xN1 = t.matrix();\n\\endcode</td></tr>\n<tr class=\"alt\"><td>\ncoefficient accessors</td><td>\\code\nt(i,j) = scalar;   <=>   t.matrix()(i,j) = scalar;\nscalar = t(i,j);   <=>   scalar = t.matrix()(i,j);\n\\endcode</td></tr>\n<tr><td>\ntranslation part</td><td>\\code\nt.translation() = vecN;\nvecN = t.translation();\n\\endcode</td></tr>\n<tr class=\"alt\"><td>\nlinear part</td><td>\\code\nt.linear() = matNxN;\nmatNxN = t.linear();\n\\endcode</td></tr>\n<tr><td>\nextract the rotation matrix</td><td>\\code\nmatNxN = t.rotation();\n\\endcode</td></tr>\n</table>\n\n\n\\b Transformation \\b creation \\n\nWhile transformation objects can be created and updated concatenating elementary transformations,\nthe Transform class also features a procedural API:\n<table class=\"manual\">\n<tr><th></th><th>procedural API</th><th>equivalent natural API </th></tr>\n<tr><td>Translation</td><td>\\code\nt.translate(Vector_(tx,ty,..));\nt.pretranslate(Vector_(tx,ty,..));\n\\endcode</td><td>\\code\nt *= Translation_(tx,ty,..);\nt = Translation_(tx,ty,..) * t;\n\\endcode</td></tr>\n<tr class=\"alt\"><td>\\b Rotation \\n <em class=\"note\">In 2D and for the procedural API, any_rotation can also \\n be an angle in radian</em></td><td>\\code\nt.rotate(any_rotation);\nt.prerotate(any_rotation);\n\\endcode</td><td>\\code\nt *= any_rotation;\nt = any_rotation * t;\n\\endcode</td></tr>\n<tr><td>Scaling</td><td>\\code\nt.scale(Vector_(sx,sy,..));\nt.scale(s);\nt.prescale(Vector_(sx,sy,..));\nt.prescale(s);\n\\endcode</td><td>\\code\nt *= Scaling(sx,sy,..);\nt *= Scaling(s);\nt = Scaling(sx,sy,..) * t;\nt = Scaling(s) * t;\n\\endcode</td></tr>\n<tr class=\"alt\"><td>Shear transformation \\n ( \\b 2D \\b only ! )</td><td>\\code\nt.shear(sx,sy);\nt.preshear(sx,sy);\n\\endcode</td><td></td></tr>\n</table>\n\nNote that in both API, any many transformations can be concatenated in a single expression as shown in the two following equivalent examples:\n<table class=\"manual\">\n<tr><td>\\code\nt.pretranslate(..).rotate(..).translate(..).scale(..);\n\\endcode</td></tr>\n<tr><td>\\code\nt = Translation_(..) * t * RotationType(..) * Translation_(..) * Scaling(..);\n\\endcode</td></tr>\n</table>\n\n\n\n<a href=\"#\" class=\"top\">top</a>\\section TutorialGeoEulerAngles Euler angles\n<table class=\"manual\">\n<tr><td style=\"max-width:30em;\">\nEuler angles might be convenient to create rotation objects.\nOn the other hand, since there exist 24 different conventions, they are pretty confusing to use. This example shows how\nto create a rotation matrix according to the 2-1-2 convention.</td><td>\\code\nMatrix3f m;\nm = AngleAxisf(angle1, Vector3f::UnitZ())\n*  * AngleAxisf(angle2, Vector3f::UnitY())\n*  * AngleAxisf(angle3, Vector3f::UnitZ());\n\\endcode</td></tr>\n</table>\n\n*/\n\n}\n"
  },
  {
    "path": "libs/eigen/doc/TutorialLinearAlgebra.dox",
    "content": "namespace Eigen {\n\n/** \\eigenManualPage TutorialLinearAlgebra Linear algebra and decompositions\n\nThis page explains how to solve linear systems, compute various decompositions such as LU,\nQR, %SVD, eigendecompositions... After reading this page, don't miss our\n\\link TopicLinearAlgebraDecompositions catalogue \\endlink of dense matrix decompositions.\n\n\\eigenAutoToc\n\n\\section TutorialLinAlgBasicSolve Basic linear solving\n\n\\b The \\b problem: You have a system of equations, that you have written as a single matrix equation\n    \\f[ Ax \\: = \\: b \\f]\nWhere \\a A and \\a b are matrices (\\a b could be a vector, as a special case). You want to find a solution \\a x.\n\n\\b The \\b solution: You can choose between various decompositions, depending on what your matrix \\a A looks like,\nand depending on whether you favor speed or accuracy. However, let's start with an example that works in all cases,\nand is a good compromise:\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr>\n  <td>\\include TutorialLinAlgExSolveColPivHouseholderQR.cpp </td>\n  <td>\\verbinclude TutorialLinAlgExSolveColPivHouseholderQR.out </td>\n</tr>\n</table>\n\nIn this example, the colPivHouseholderQr() method returns an object of class ColPivHouseholderQR. Since here the\nmatrix is of type Matrix3f, this line could have been replaced by:\n\\code\nColPivHouseholderQR<Matrix3f> dec(A);\nVector3f x = dec.solve(b);\n\\endcode\n\nHere, ColPivHouseholderQR is a QR decomposition with column pivoting. It's a good compromise for this tutorial, as it\nworks for all matrices while being quite fast. Here is a table of some other decompositions that you can choose from,\ndepending on your matrix and the trade-off you want to make:\n\n<table class=\"manual\">\n    <tr>\n        <th>Decomposition</th>\n        <th>Method</th>\n        <th>Requirements on the matrix</th>\n        <th>Speed</th>\n        <th>Accuracy</th>\n    </tr>\n    <tr>\n        <td>PartialPivLU</td>\n        <td>partialPivLu()</td>\n        <td>Invertible</td>\n        <td>++</td>\n        <td>+</td>\n    </tr>\n    <tr class=\"alt\">\n        <td>FullPivLU</td>\n        <td>fullPivLu()</td>\n        <td>None</td>\n        <td>-</td>\n        <td>+++</td>\n    </tr>\n    <tr>\n        <td>HouseholderQR</td>\n        <td>householderQr()</td>\n        <td>None</td>\n        <td>++</td>\n        <td>+</td>\n    </tr>\n    <tr class=\"alt\">\n        <td>ColPivHouseholderQR</td>\n        <td>colPivHouseholderQr()</td>\n        <td>None</td>\n        <td>+</td>\n        <td>++</td>\n    </tr>\n    <tr>\n        <td>FullPivHouseholderQR</td>\n        <td>fullPivHouseholderQr()</td>\n        <td>None</td>\n        <td>-</td>\n        <td>+++</td>\n    </tr>\n    <tr class=\"alt\">\n        <td>LLT</td>\n        <td>llt()</td>\n        <td>Positive definite</td>\n        <td>+++</td>\n        <td>+</td>\n    </tr>\n    <tr>\n        <td>LDLT</td>\n        <td>ldlt()</td>\n        <td>Positive or negative semidefinite</td>\n        <td>+++</td>\n        <td>++</td>\n    </tr>\n</table>\n\nAll of these decompositions offer a solve() method that works as in the above example.\n\nFor example, if your matrix is positive definite, the above table says that a very good\nchoice is then the LDLT decomposition. Here's an example, also demonstrating that using a general\nmatrix (not a vector) as right hand side is possible.\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr>\n  <td>\\include TutorialLinAlgExSolveLDLT.cpp </td>\n  <td>\\verbinclude TutorialLinAlgExSolveLDLT.out </td>\n</tr>\n</table>\n\nFor a \\ref TopicLinearAlgebraDecompositions \"much more complete table\" comparing all decompositions supported by Eigen (notice that Eigen\nsupports many other decompositions), see our special page on\n\\ref TopicLinearAlgebraDecompositions \"this topic\".\n\n\\section TutorialLinAlgSolutionExists Checking if a solution really exists\n\nOnly you know what error margin you want to allow for a solution to be considered valid.\nSo Eigen lets you do this computation for yourself, if you want to, as in this example:\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr>\n  <td>\\include TutorialLinAlgExComputeSolveError.cpp </td>\n  <td>\\verbinclude TutorialLinAlgExComputeSolveError.out </td>\n</tr>\n</table>\n\n\\section TutorialLinAlgEigensolving Computing eigenvalues and eigenvectors\n\nYou need an eigendecomposition here, see available such decompositions on \\ref TopicLinearAlgebraDecompositions \"this page\".\nMake sure to check if your matrix is self-adjoint, as is often the case in these problems. Here's an example using\nSelfAdjointEigenSolver, it could easily be adapted to general matrices using EigenSolver or ComplexEigenSolver.\n\nThe computation of eigenvalues and eigenvectors does not necessarily converge, but such failure to converge is\nvery rare. The call to info() is to check for this possibility.\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr>\n  <td>\\include TutorialLinAlgSelfAdjointEigenSolver.cpp </td>\n  <td>\\verbinclude TutorialLinAlgSelfAdjointEigenSolver.out </td>\n</tr>\n</table>\n\n\\section TutorialLinAlgInverse Computing inverse and determinant\n\nFirst of all, make sure that you really want this. While inverse and determinant are fundamental mathematical concepts,\nin \\em numerical linear algebra they are not as popular as in pure mathematics. Inverse computations are often\nadvantageously replaced by solve() operations, and the determinant is often \\em not a good way of checking if a matrix\nis invertible.\n\nHowever, for \\em very \\em small matrices, the above is not true, and inverse and determinant can be very useful.\n\nWhile certain decompositions, such as PartialPivLU and FullPivLU, offer inverse() and determinant() methods, you can also\ncall inverse() and determinant() directly on a matrix. If your matrix is of a very small fixed size (at most 4x4) this\nallows Eigen to avoid performing a LU decomposition, and instead use formulas that are more efficient on such small matrices.\n\nHere is an example:\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr>\n  <td>\\include TutorialLinAlgInverseDeterminant.cpp </td>\n  <td>\\verbinclude TutorialLinAlgInverseDeterminant.out </td>\n</tr>\n</table>\n\n\\section TutorialLinAlgLeastsquares Least squares solving\n\nThe best way to do least squares solving is with a SVD decomposition. Eigen provides one as the JacobiSVD class, and its solve()\nis doing least-squares solving.\n\nHere is an example:\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr>\n  <td>\\include TutorialLinAlgSVDSolve.cpp </td>\n  <td>\\verbinclude TutorialLinAlgSVDSolve.out </td>\n</tr>\n</table>\n\nAnother way, potentially faster but less reliable, is to use a LDLT decomposition\nof the normal matrix. In any case, just read any reference text on least squares, and it will be very easy for you\nto implement any linear least squares computation on top of Eigen.\n\n\\section TutorialLinAlgSeparateComputation Separating the computation from the construction\n\nIn the above examples, the decomposition was computed at the same time that the decomposition object was constructed.\nThere are however situations where you might want to separate these two things, for example if you don't know,\nat the time of the construction, the matrix that you will want to decompose; or if you want to reuse an existing\ndecomposition object.\n\nWhat makes this possible is that:\n\\li all decompositions have a default constructor,\n\\li all decompositions have a compute(matrix) method that does the computation, and that may be called again\n    on an already-computed decomposition, reinitializing it.\n\nFor example:\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr>\n  <td>\\include TutorialLinAlgComputeTwice.cpp </td>\n  <td>\\verbinclude TutorialLinAlgComputeTwice.out </td>\n</tr>\n</table>\n\nFinally, you can tell the decomposition constructor to preallocate storage for decomposing matrices of a given size,\nso that when you subsequently decompose such matrices, no dynamic memory allocation is performed (of course, if you\nare using fixed-size matrices, no dynamic memory allocation happens at all). This is done by just\npassing the size to the decomposition constructor, as in this example:\n\\code\nHouseholderQR<MatrixXf> qr(50,50);\nMatrixXf A = MatrixXf::Random(50,50);\nqr.compute(A); // no dynamic memory allocation\n\\endcode\n\n\\section TutorialLinAlgRankRevealing Rank-revealing decompositions\n\nCertain decompositions are rank-revealing, i.e. are able to compute the rank of a matrix. These are typically\nalso the decompositions that behave best in the face of a non-full-rank matrix (which in the square case means a\nsingular matrix). On \\ref TopicLinearAlgebraDecompositions \"this table\" you can see for all our decompositions\nwhether they are rank-revealing or not.\n\nRank-revealing decompositions offer at least a rank() method. They can also offer convenience methods such as isInvertible(),\nand some are also providing methods to compute the kernel (null-space) and image (column-space) of the matrix, as is the\ncase with FullPivLU:\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr>\n  <td>\\include TutorialLinAlgRankRevealing.cpp </td>\n  <td>\\verbinclude TutorialLinAlgRankRevealing.out </td>\n</tr>\n</table>\n\nOf course, any rank computation depends on the choice of an arbitrary threshold, since practically no\nfloating-point matrix is \\em exactly rank-deficient. Eigen picks a sensible default threshold, which depends\non the decomposition but is typically the diagonal size times machine epsilon. While this is the best default we\ncould pick, only you know what is the right threshold for your application. You can set this by calling setThreshold()\non your decomposition object before calling rank() or any other method that needs to use such a threshold.\nThe decomposition itself, i.e. the compute() method, is independent of the threshold. You don't need to recompute the\ndecomposition after you've changed the threshold.\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr>\n  <td>\\include TutorialLinAlgSetThreshold.cpp </td>\n  <td>\\verbinclude TutorialLinAlgSetThreshold.out </td>\n</tr>\n</table>\n\n*/\n\n}\n"
  },
  {
    "path": "libs/eigen/doc/TutorialMapClass.dox",
    "content": "namespace Eigen {\n\n/** \\eigenManualPage TutorialMapClass Interfacing with raw buffers: the Map class\n\nThis page explains how to work with \"raw\" C/C++ arrays.\nThis can be useful in a variety of contexts, particularly when \"importing\" vectors and matrices from other libraries into %Eigen.\n\n\\eigenAutoToc\n\n\\section TutorialMapIntroduction Introduction\n\nOccasionally you may have a pre-defined array of numbers that you want to use within %Eigen as a vector or matrix. While one option is to make a copy of the data, most commonly you probably want to re-use this memory as an %Eigen type. Fortunately, this is very easy with the Map class.\n\n\\section TutorialMapTypes Map types and declaring Map variables\n\nA Map object has a type defined by its %Eigen equivalent:\n\\code\nMap<Matrix<typename Scalar, int RowsAtCompileTime, int ColsAtCompileTime> >\n\\endcode\nNote that, in this default case, a Map requires just a single template parameter.  \n\nTo construct a Map variable, you need two other pieces of information: a pointer to the region of memory defining the array of coefficients, and the desired shape of the matrix or vector.  For example, to define a matrix of \\c float with sizes determined at compile time, you might do the following:\n\\code\nMap<MatrixXf> mf(pf,rows,columns);\n\\endcode\nwhere \\c pf is a \\c float \\c * pointing to the array of memory.  A fixed-size read-only vector of integers might be declared as\n\\code\nMap<const Vector4i> mi(pi);\n\\endcode\nwhere \\c pi is an \\c int \\c *. In this case the size does not have to be passed to the constructor, because it is already specified by the Matrix/Array type.\n\nNote that Map does not have a default constructor; you \\em must pass a pointer to intialize the object. However, you can work around this requirement (see \\ref TutorialMapPlacementNew).\n\nMap is flexible enough to accomodate a variety of different data representations.  There are two other (optional) template parameters:\n\\code\nMap<typename MatrixType,\n    int MapOptions,\n    typename StrideType>\n\\endcode\n\\li \\c MapOptions specifies whether the pointer is \\c #Aligned, or \\c #Unaligned.  The default is \\c #Unaligned.\n\\li \\c StrideType allows you to specify a custom layout for the memory array, using the Stride class.  One example would be to specify that the data array is organized in row-major format:\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr>\n<td>\\include Tutorial_Map_rowmajor.cpp </td>\n<td>\\verbinclude Tutorial_Map_rowmajor.out </td>\n</table>\nHowever, Stride is even more flexible than this; for details, see the documentation for the Map and Stride classes.\n\n\\section TutorialMapUsing Using Map variables\n\nYou can use a Map object just like any other %Eigen type:\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr>\n<td>\\include Tutorial_Map_using.cpp </td>\n<td>\\verbinclude Tutorial_Map_using.out </td>\n</table>\n\nAll %Eigen functions are written to accept Map objects just like other %Eigen types. However, when writing your own functions taking %Eigen types, this does \\em not happen automatically: a Map type is not identical to its Dense equivalent.  See \\ref TopicFunctionTakingEigenTypes for details.\n\n\\section TutorialMapPlacementNew Changing the mapped array\n\nIt is possible to change the array of a Map object after declaration, using the C++ \"placement new\" syntax:\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr>\n<td>\\include Map_placement_new.cpp </td>\n<td>\\verbinclude Map_placement_new.out </td>\n</table>\nDespite appearances, this does not invoke the memory allocator, because the syntax specifies the location for storing the result.\n\nThis syntax makes it possible to declare a Map object without first knowing the mapped array's location in memory:\n\\code\nMap<Matrix3f> A(NULL);  // don't try to use this matrix yet!\nVectorXf b(n_matrices);\nfor (int i = 0; i < n_matrices; i++)\n{\n  new (&A) Map<Matrix3f>(get_matrix_pointer(i));\n  b(i) = A.trace();\n}\n\\endcode\n\n*/\n\n}\n"
  },
  {
    "path": "libs/eigen/doc/TutorialMatrixArithmetic.dox",
    "content": "namespace Eigen {\n\n/** \\eigenManualPage TutorialMatrixArithmetic Matrix and vector arithmetic\n\nThis page aims to provide an overview and some details on how to perform arithmetic\nbetween matrices, vectors and scalars with Eigen.\n\n\\eigenAutoToc\n\n\\section TutorialArithmeticIntroduction Introduction\n\nEigen offers matrix/vector arithmetic operations either through overloads of common C++ arithmetic operators such as +, -, *,\nor through special methods such as dot(), cross(), etc.\nFor the Matrix class (matrices and vectors), operators are only overloaded to support\nlinear-algebraic operations. For example, \\c matrix1 \\c * \\c matrix2 means matrix-matrix product,\nand \\c vector \\c + \\c scalar is just not allowed. If you want to perform all kinds of array operations,\nnot linear algebra, see the \\ref TutorialArrayClass \"next page\".\n\n\\section TutorialArithmeticAddSub Addition and subtraction\n\nThe left hand side and right hand side must, of course, have the same numbers of rows and of columns. They must\nalso have the same \\c Scalar type, as Eigen doesn't do automatic type promotion. The operators at hand here are:\n\\li binary operator + as in \\c a+b\n\\li binary operator - as in \\c a-b\n\\li unary operator - as in \\c -a\n\\li compound operator += as in \\c a+=b\n\\li compound operator -= as in \\c a-=b\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include tut_arithmetic_add_sub.cpp\n</td>\n<td>\n\\verbinclude tut_arithmetic_add_sub.out\n</td></tr></table>\n\n\\section TutorialArithmeticScalarMulDiv Scalar multiplication and division\n\nMultiplication and division by a scalar is very simple too. The operators at hand here are:\n\\li binary operator * as in \\c matrix*scalar\n\\li binary operator * as in \\c scalar*matrix\n\\li binary operator / as in \\c matrix/scalar\n\\li compound operator *= as in \\c matrix*=scalar\n\\li compound operator /= as in \\c matrix/=scalar\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include tut_arithmetic_scalar_mul_div.cpp\n</td>\n<td>\n\\verbinclude tut_arithmetic_scalar_mul_div.out\n</td></tr></table>\n\n\n\\section TutorialArithmeticMentionXprTemplates A note about expression templates\n\nThis is an advanced topic that we explain on \\ref TopicEigenExpressionTemplates \"this page\",\nbut it is useful to just mention it now. In Eigen, arithmetic operators such as \\c operator+ don't\nperform any computation by themselves, they just return an \"expression object\" describing the computation to be\nperformed. The actual computation happens later, when the whole expression is evaluated, typically in \\c operator=.\nWhile this might sound heavy, any modern optimizing compiler is able to optimize away that abstraction and\nthe result is perfectly optimized code. For example, when you do:\n\\code\nVectorXf a(50), b(50), c(50), d(50);\n...\na = 3*b + 4*c + 5*d;\n\\endcode\nEigen compiles it to just one for loop, so that the arrays are traversed only once. Simplifying (e.g. ignoring\nSIMD optimizations), this loop looks like this:\n\\code\nfor(int i = 0; i < 50; ++i)\n  a[i] = 3*b[i] + 4*c[i] + 5*d[i];\n\\endcode\nThus, you should not be afraid of using relatively large arithmetic expressions with Eigen: it only gives Eigen\nmore opportunities for optimization.\n\n\\section TutorialArithmeticTranspose Transposition and conjugation\n\nThe transpose \\f$ a^T \\f$, conjugate \\f$ \\bar{a} \\f$, and adjoint (i.e., conjugate transpose) \\f$ a^* \\f$ of a matrix or vector \\f$ a \\f$ are obtained by the member functions \\link DenseBase::transpose() transpose()\\endlink, \\link MatrixBase::conjugate() conjugate()\\endlink, and \\link MatrixBase::adjoint() adjoint()\\endlink, respectively.\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include tut_arithmetic_transpose_conjugate.cpp\n</td>\n<td>\n\\verbinclude tut_arithmetic_transpose_conjugate.out\n</td></tr></table>\n\nFor real matrices, \\c conjugate() is a no-operation, and so \\c adjoint() is equivalent to \\c transpose().\n\nAs for basic arithmetic operators, \\c transpose() and \\c adjoint() simply return a proxy object without doing the actual transposition. If you do <tt>b = a.transpose()</tt>, then the transpose is evaluated at the same time as the result is written into \\c b. However, there is a complication here. If you do <tt>a = a.transpose()</tt>, then Eigen starts writing the result into \\c a before the evaluation of the transpose is finished. Therefore, the instruction <tt>a = a.transpose()</tt> does not replace \\c a with its transpose, as one would expect:\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include tut_arithmetic_transpose_aliasing.cpp\n</td>\n<td>\n\\verbinclude tut_arithmetic_transpose_aliasing.out\n</td></tr></table>\nThis is the so-called \\ref TopicAliasing \"aliasing issue\". In \"debug mode\", i.e., when \\ref TopicAssertions \"assertions\" have not been disabled, such common pitfalls are automatically detected. \n\nFor \\em in-place transposition, as for instance in <tt>a = a.transpose()</tt>, simply use the \\link DenseBase::transposeInPlace() transposeInPlace()\\endlink  function:\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include tut_arithmetic_transpose_inplace.cpp\n</td>\n<td>\n\\verbinclude tut_arithmetic_transpose_inplace.out\n</td></tr></table>\nThere is also the \\link MatrixBase::adjointInPlace() adjointInPlace()\\endlink function for complex matrices.\n\n\\section TutorialArithmeticMatrixMul Matrix-matrix and matrix-vector multiplication\n\nMatrix-matrix multiplication is again done with \\c operator*. Since vectors are a special\ncase of matrices, they are implicitly handled there too, so matrix-vector product is really just a special\ncase of matrix-matrix product, and so is vector-vector outer product. Thus, all these cases are handled by just\ntwo operators:\n\\li binary operator * as in \\c a*b\n\\li compound operator *= as in \\c a*=b (this multiplies on the right: \\c a*=b is equivalent to <tt>a = a*b</tt>)\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include tut_arithmetic_matrix_mul.cpp\n</td>\n<td>\n\\verbinclude tut_arithmetic_matrix_mul.out\n</td></tr></table>\n\nNote: if you read the above paragraph on expression templates and are worried that doing \\c m=m*m might cause\naliasing issues, be reassured for now: Eigen treats matrix multiplication as a special case and takes care of\nintroducing a temporary here, so it will compile \\c m=m*m as:\n\\code\ntmp = m*m;\nm = tmp;\n\\endcode\nIf you know your matrix product can be safely evaluated into the destination matrix without aliasing issue, then you can use the \\link MatrixBase::noalias() noalias()\\endlink function to avoid the temporary, e.g.:\n\\code\nc.noalias() += a * b;\n\\endcode\nFor more details on this topic, see the page on \\ref TopicAliasing \"aliasing\".\n\n\\b Note: for BLAS users worried about performance, expressions such as <tt>c.noalias() -= 2 * a.adjoint() * b;</tt> are fully optimized and trigger a single gemm-like function call.\n\n\\section TutorialArithmeticDotAndCross Dot product and cross product\n\nFor dot product and cross product, you need the \\link MatrixBase::dot() dot()\\endlink and \\link MatrixBase::cross() cross()\\endlink methods. Of course, the dot product can also be obtained as a 1x1 matrix as u.adjoint()*v.\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include tut_arithmetic_dot_cross.cpp\n</td>\n<td>\n\\verbinclude tut_arithmetic_dot_cross.out\n</td></tr></table>\n\nRemember that cross product is only for vectors of size 3. Dot product is for vectors of any sizes.\nWhen using complex numbers, Eigen's dot product is conjugate-linear in the first variable and linear in the\nsecond variable.\n\n\\section TutorialArithmeticRedux Basic arithmetic reduction operations\nEigen also provides some reduction operations to reduce a given matrix or vector to a single value such as the sum (computed by \\link DenseBase::sum() sum()\\endlink), product (\\link DenseBase::prod() prod()\\endlink), or the maximum (\\link DenseBase::maxCoeff() maxCoeff()\\endlink) and minimum (\\link DenseBase::minCoeff() minCoeff()\\endlink) of all its coefficients.\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include tut_arithmetic_redux_basic.cpp\n</td>\n<td>\n\\verbinclude tut_arithmetic_redux_basic.out\n</td></tr></table>\n\nThe \\em trace of a matrix, as returned by the function \\link MatrixBase::trace() trace()\\endlink, is the sum of the diagonal coefficients and can also be computed as efficiently using <tt>a.diagonal().sum()</tt>, as we will see later on.\n\nThere also exist variants of the \\c minCoeff and \\c maxCoeff functions returning the coordinates of the respective coefficient via the arguments:\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include tut_arithmetic_redux_minmax.cpp\n</td>\n<td>\n\\verbinclude tut_arithmetic_redux_minmax.out\n</td></tr></table>\n\n\n\\section TutorialArithmeticValidity Validity of operations\nEigen checks the validity of the operations that you perform. When possible,\nit checks them at compile time, producing compilation errors. These error messages can be long and ugly,\nbut Eigen writes the important message in UPPERCASE_LETTERS_SO_IT_STANDS_OUT. For example:\n\\code\n  Matrix3f m;\n  Vector4f v;\n  v = m*v;      // Compile-time error: YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES\n\\endcode\n\nOf course, in many cases, for example when checking dynamic sizes, the check cannot be performed at compile time.\nEigen then uses runtime assertions. This means that the program will abort with an error message when executing an illegal operation if it is run in \"debug mode\", and it will probably crash if assertions are turned off.\n\n\\code\n  MatrixXf m(3,3);\n  VectorXf v(4);\n  v = m * v; // Run-time assertion failure here: \"invalid matrix product\"\n\\endcode\n\nFor more details on this topic, see \\ref TopicAssertions \"this page\".\n\n*/\n\n}\n"
  },
  {
    "path": "libs/eigen/doc/TutorialMatrixClass.dox",
    "content": "namespace Eigen {\n\n/** \\eigenManualPage TutorialMatrixClass The Matrix class\n\n\\eigenAutoToc\n\nIn Eigen, all matrices and vectors are objects of the Matrix template class.\nVectors are just a special case of matrices, with either 1 row or 1 column.\n\n\\section TutorialMatrixFirst3Params The first three template parameters of Matrix\n\nThe Matrix class takes six template parameters, but for now it's enough to\nlearn about the first three first parameters. The three remaining parameters have default\nvalues, which for now we will leave untouched, and which we\n\\ref TutorialMatrixOptTemplParams \"discuss below\".\n\nThe three mandatory template parameters of Matrix are:\n\\code\nMatrix<typename Scalar, int RowsAtCompileTime, int ColsAtCompileTime>\n\\endcode\n\\li \\c Scalar is the scalar type, i.e. the type of the coefficients.\n    That is, if you want a matrix of floats, choose \\c float here.\n    See \\ref TopicScalarTypes \"Scalar types\" for a list of all supported\n    scalar types and for how to extend support to new types.\n\\li \\c RowsAtCompileTime and \\c ColsAtCompileTime are the number of rows\n    and columns of the matrix as known at compile time (see \n    \\ref TutorialMatrixDynamic \"below\" for what to do if the number is not\n    known at compile time).\n\nWe offer a lot of convenience typedefs to cover the usual cases. For example, \\c Matrix4f is\na 4x4 matrix of floats. Here is how it is defined by Eigen:\n\\code\ntypedef Matrix<float, 4, 4> Matrix4f;\n\\endcode\nWe discuss \\ref TutorialMatrixTypedefs \"below\" these convenience typedefs.\n\n\\section TutorialMatrixVectors Vectors\n\nAs mentioned above, in Eigen, vectors are just a special case of\nmatrices, with either 1 row or 1 column. The case where they have 1 column is the most common;\nsuch vectors are called column-vectors, often abbreviated as just vectors. In the other case\nwhere they have 1 row, they are called row-vectors.\n\nFor example, the convenience typedef \\c Vector3f is a (column) vector of 3 floats. It is defined as follows by Eigen:\n\\code\ntypedef Matrix<float, 3, 1> Vector3f;\n\\endcode\nWe also offer convenience typedefs for row-vectors, for example:\n\\code\ntypedef Matrix<int, 1, 2> RowVector2i;\n\\endcode\n\n\\section TutorialMatrixDynamic The special value Dynamic\n\nOf course, Eigen is not limited to matrices whose dimensions are known at compile time.\nThe \\c RowsAtCompileTime and \\c ColsAtCompileTime template parameters can take the special\nvalue \\c Dynamic which indicates that the size is unknown at compile time, so must\nbe handled as a run-time variable. In Eigen terminology, such a size is referred to as a\n\\em dynamic \\em size; while a size that is known at compile time is called a\n\\em fixed \\em size. For example, the convenience typedef \\c MatrixXd, meaning\na matrix of doubles with dynamic size, is defined as follows:\n\\code\ntypedef Matrix<double, Dynamic, Dynamic> MatrixXd;\n\\endcode\nAnd similarly, we define a self-explanatory typedef \\c VectorXi as follows:\n\\code\ntypedef Matrix<int, Dynamic, 1> VectorXi;\n\\endcode\nYou can perfectly have e.g. a fixed number of rows with a dynamic number of columns, as in:\n\\code\nMatrix<float, 3, Dynamic>\n\\endcode\n\n\\section TutorialMatrixConstructors Constructors\n\nA default constructor is always available, never performs any dynamic memory allocation, and never initializes the matrix coefficients. You can do:\n\\code\nMatrix3f a;\nMatrixXf b;\n\\endcode\nHere,\n\\li \\c a is a 3-by-3 matrix, with a plain float[9] array of uninitialized coefficients,\n\\li \\c b is a dynamic-size matrix whose size is currently 0-by-0, and whose array of\ncoefficients hasn't yet been allocated at all.\n\nConstructors taking sizes are also available. For matrices, the number of rows is always passed first.\nFor vectors, just pass the vector size. They allocate the array of coefficients\nwith the given size, but don't initialize the coefficients themselves:\n\\code\nMatrixXf a(10,15);\nVectorXf b(30);\n\\endcode\nHere,\n\\li \\c a is a 10x15 dynamic-size matrix, with allocated but currently uninitialized coefficients.\n\\li \\c b is a dynamic-size vector of size 30, with allocated but currently uninitialized coefficients.\n\nIn order to offer a uniform API across fixed-size and dynamic-size matrices, it is legal to use these\nconstructors on fixed-size matrices, even if passing the sizes is useless in this case. So this is legal:\n\\code\nMatrix3f a(3,3);\n\\endcode\nand is a no-operation.\n\nFinally, we also offer some constructors to initialize the coefficients of small fixed-size vectors up to size 4:\n\\code\nVector2d a(5.0, 6.0);\nVector3d b(5.0, 6.0, 7.0);\nVector4d c(5.0, 6.0, 7.0, 8.0);\n\\endcode\n\n\\section TutorialMatrixCoeffAccessors Coefficient accessors\n\nThe primary coefficient accessors and mutators in Eigen are the overloaded parenthesis operators.\nFor matrices, the row index is always passed first. For vectors, just pass one index.\nThe numbering starts at 0. This example is self-explanatory:\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include tut_matrix_coefficient_accessors.cpp\n</td>\n<td>\n\\verbinclude tut_matrix_coefficient_accessors.out\n</td></tr></table>\n\nNote that the syntax <tt> m(index) </tt>\nis not restricted to vectors, it is also available for general matrices, meaning index-based access\nin the array of coefficients. This however depends on the matrix's storage order. All Eigen matrices default to\ncolumn-major storage order, but this can be changed to row-major, see \\ref TopicStorageOrders \"Storage orders\".\n\nThe operator[] is also overloaded for index-based access in vectors, but keep in mind that C++ doesn't allow operator[] to\ntake more than one argument. We restrict operator[] to vectors, because an awkwardness in the C++ language\nwould make matrix[i,j] compile to the same thing as matrix[j] !\n\n\\section TutorialMatrixCommaInitializer Comma-initialization\n\n%Matrix and vector coefficients can be conveniently set using the so-called \\em comma-initializer syntax.\nFor now, it is enough to know this example:\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr>\n<td>\\include Tutorial_commainit_01.cpp </td>\n<td>\\verbinclude Tutorial_commainit_01.out </td>\n</tr></table>\n\n\nThe right-hand side can also contain matrix expressions as discussed in \\ref TutorialAdvancedInitialization \"this page\".\n\n\\section TutorialMatrixSizesResizing Resizing\n\nThe current size of a matrix can be retrieved by \\link EigenBase::rows() rows()\\endlink, \\link EigenBase::cols() cols() \\endlink and \\link EigenBase::size() size()\\endlink. These methods return the number of rows, the number of columns and the number of coefficients, respectively. Resizing a dynamic-size matrix is done by the \\link PlainObjectBase::resize(Index,Index) resize() \\endlink method.\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr>\n<td>\\include tut_matrix_resize.cpp </td>\n<td>\\verbinclude tut_matrix_resize.out </td>\n</tr></table>\n\nThe resize() method is a no-operation if the actual matrix size doesn't change; otherwise it is destructive: the values of the coefficients may change.\nIf you want a conservative variant of resize() which does not change the coefficients, use \\link PlainObjectBase::conservativeResize() conservativeResize()\\endlink, see \\ref TopicResizing \"this page\" for more details.\n\nAll these methods are still available on fixed-size matrices, for the sake of API uniformity. Of course, you can't actually\nresize a fixed-size matrix. Trying to change a fixed size to an actually different value will trigger an assertion failure;\nbut the following code is legal:\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr>\n<td>\\include tut_matrix_resize_fixed_size.cpp </td>\n<td>\\verbinclude tut_matrix_resize_fixed_size.out </td>\n</tr></table>\n\n\n\\section TutorialMatrixAssignment Assignment and resizing\n\nAssignment is the action of copying a matrix into another, using \\c operator=. Eigen resizes the matrix on the left-hand side automatically so that it matches the size of the matrix on the right-hand size. For example:\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr>\n<td>\\include tut_matrix_assignment_resizing.cpp </td>\n<td>\\verbinclude tut_matrix_assignment_resizing.out </td>\n</tr></table>\n\nOf course, if the left-hand side is of fixed size, resizing it is not allowed.\n\nIf you do not want this automatic resizing to happen (for example for debugging purposes), you can disable it, see\n\\ref TopicResizing \"this page\".\n\n\n\\section TutorialMatrixFixedVsDynamic Fixed vs. Dynamic size\n\nWhen should one use fixed sizes (e.g. \\c Matrix4f), and when should one prefer dynamic sizes (e.g. \\c MatrixXf)?\nThe simple answer is: use fixed\nsizes for very small sizes where you can, and use dynamic sizes for larger sizes or where you have to. For small sizes,\nespecially for sizes smaller than (roughly) 16, using fixed sizes is hugely beneficial\nto performance, as it allows Eigen to avoid dynamic memory allocation and to unroll\nloops. Internally, a fixed-size Eigen matrix is just a plain array, i.e. doing\n\\code Matrix4f mymatrix; \\endcode\nreally amounts to just doing\n\\code float mymatrix[16]; \\endcode\nso this really has zero runtime cost. By contrast, the array of a dynamic-size matrix\nis always allocated on the heap, so doing\n\\code MatrixXf mymatrix(rows,columns); \\endcode\namounts to doing\n\\code float *mymatrix = new float[rows*columns]; \\endcode\nand in addition to that, the MatrixXf object stores its number of rows and columns as\nmember variables.\n\nThe limitation of using fixed sizes, of course, is that this is only possible\nwhen you know the sizes at compile time. Also, for large enough sizes, say for sizes\ngreater than (roughly) 32, the performance benefit of using fixed sizes becomes negligible.\nWorse, trying to create a very large matrix using fixed sizes inside a function could result in a\nstack overflow, since Eigen will try to allocate the array automatically as a local variable, and\nthis is normally done on the stack.\nFinally, depending on circumstances, Eigen can also be more aggressive trying to vectorize\n(use SIMD instructions) when dynamic sizes are used, see \\ref TopicVectorization \"Vectorization\".\n\n\\section TutorialMatrixOptTemplParams Optional template parameters\n\nWe mentioned at the beginning of this page that the Matrix class takes six template parameters,\nbut so far we only discussed the first three. The remaining three parameters are optional. Here is\nthe complete list of template parameters:\n\\code\nMatrix<typename Scalar,\n       int RowsAtCompileTime,\n       int ColsAtCompileTime,\n       int Options = 0,\n       int MaxRowsAtCompileTime = RowsAtCompileTime,\n       int MaxColsAtCompileTime = ColsAtCompileTime>\n\\endcode\n\\li \\c Options is a bit field. Here, we discuss only one bit: \\c RowMajor. It specifies that the matrices\n      of this type use row-major storage order; by default, the storage order is column-major. See the page on\n      \\ref TopicStorageOrders \"storage orders\". For example, this type means row-major 3x3 matrices:\n      \\code\n      Matrix<float, 3, 3, RowMajor>\n      \\endcode\n\\li \\c MaxRowsAtCompileTime and \\c MaxColsAtCompileTime are useful when you want to specify that, even though\n      the exact sizes of your matrices are not known at compile time, a fixed upper bound is known at\n      compile time. The biggest reason why you might want to do that is to avoid dynamic memory allocation.\n      For example the following matrix type uses a plain array of 12 floats, without dynamic memory allocation:\n      \\code\n      Matrix<float, Dynamic, Dynamic, 0, 3, 4>\n      \\endcode\n\n\\section TutorialMatrixTypedefs Convenience typedefs\n\nEigen defines the following Matrix typedefs:\n\\li MatrixNt for Matrix<type, N, N>. For example, MatrixXi for Matrix<int, Dynamic, Dynamic>.\n\\li VectorNt for Matrix<type, N, 1>. For example, Vector2f for Matrix<float, 2, 1>.\n\\li RowVectorNt for Matrix<type, 1, N>. For example, RowVector3d for Matrix<double, 1, 3>.\n\nWhere:\n\\li N can be any one of \\c 2, \\c 3, \\c 4, or \\c X (meaning \\c Dynamic).\n\\li t can be any one of \\c i (meaning int), \\c f (meaning float), \\c d (meaning double),\n      \\c cf (meaning complex<float>), or \\c cd (meaning complex<double>). The fact that typedefs are only\n    defined for these five types doesn't mean that they are the only supported scalar types. For example,\n    all standard integer types are supported, see \\ref TopicScalarTypes \"Scalar types\".\n\n\n*/\n\n}\n"
  },
  {
    "path": "libs/eigen/doc/TutorialReductionsVisitorsBroadcasting.dox",
    "content": "namespace Eigen {\n\n/** \\eigenManualPage TutorialReductionsVisitorsBroadcasting Reductions, visitors and broadcasting\n\nThis page explains Eigen's reductions, visitors and broadcasting and how they are used with\n\\link MatrixBase matrices \\endlink and \\link ArrayBase arrays \\endlink.\n\n\\eigenAutoToc\n\n\\section TutorialReductionsVisitorsBroadcastingReductions Reductions\nIn Eigen, a reduction is a function taking a matrix or array, and returning a single\nscalar value. One of the most used reductions is \\link DenseBase::sum() .sum() \\endlink,\nreturning the sum of all the coefficients inside a given matrix or array.\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include tut_arithmetic_redux_basic.cpp\n</td>\n<td>\n\\verbinclude tut_arithmetic_redux_basic.out\n</td></tr></table>\n\nThe \\em trace of a matrix, as returned by the function \\c trace(), is the sum of the diagonal coefficients and can equivalently be computed <tt>a.diagonal().sum()</tt>.\n\n\n\\subsection TutorialReductionsVisitorsBroadcastingReductionsNorm Norm computations\n\nThe (Euclidean a.k.a. \\f$\\ell^2\\f$) squared norm of a vector can be obtained \\link MatrixBase::squaredNorm() squaredNorm() \\endlink. It is equal to the dot product of the vector by itself, and equivalently to the sum of squared absolute values of its coefficients.\n\nEigen also provides the \\link MatrixBase::norm() norm() \\endlink method, which returns the square root of \\link MatrixBase::squaredNorm() squaredNorm() \\endlink.\n\nThese operations can also operate on matrices; in that case, a n-by-p matrix is seen as a vector of size (n*p), so for example the \\link MatrixBase::norm() norm() \\endlink method returns the \"Frobenius\" or \"Hilbert-Schmidt\" norm. We refrain from speaking of the \\f$\\ell^2\\f$ norm of a matrix because that can mean different things.\n\nIf you want other \\f$\\ell^p\\f$ norms, use the \\link MatrixBase::lpNorm() lpNnorm<p>() \\endlink method. The template parameter \\a p can take the special value \\a Infinity if you want the \\f$\\ell^\\infty\\f$ norm, which is the maximum of the absolute values of the coefficients.\n\nThe following example demonstrates these methods.\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include Tutorial_ReductionsVisitorsBroadcasting_reductions_norm.cpp\n</td>\n<td>\n\\verbinclude Tutorial_ReductionsVisitorsBroadcasting_reductions_norm.out\n</td></tr></table>\n\n\\subsection TutorialReductionsVisitorsBroadcastingReductionsBool Boolean reductions\n\nThe following reductions operate on boolean values:\n  - \\link DenseBase::all() all() \\endlink returns \\b true if all of the coefficients in a given Matrix or Array evaluate to \\b true .\n  - \\link DenseBase::any() any() \\endlink returns \\b true if at least one of the coefficients in a given Matrix or Array evaluates to \\b true .\n  - \\link DenseBase::count() count() \\endlink returns the number of coefficients in a given Matrix or Array that evaluate to  \\b true.\n\nThese are typically used in conjunction with the coefficient-wise comparison and equality operators provided by Array. For instance, <tt>array > 0</tt> is an %Array of the same size as \\c array , with \\b true at those positions where the corresponding coefficient of \\c array is positive. Thus, <tt>(array > 0).all()</tt> tests whether all coefficients of \\c array are positive. This can be seen in the following example:\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include Tutorial_ReductionsVisitorsBroadcasting_reductions_bool.cpp\n</td>\n<td>\n\\verbinclude Tutorial_ReductionsVisitorsBroadcasting_reductions_bool.out\n</td></tr></table>\n\n\\subsection TutorialReductionsVisitorsBroadcastingReductionsUserdefined User defined reductions\n\nTODO\n\nIn the meantime you can have a look at the DenseBase::redux() function.\n\n\\section TutorialReductionsVisitorsBroadcastingVisitors Visitors\nVisitors are useful when one wants to obtain the location of a coefficient inside \na Matrix or Array. The simplest examples are \n\\link MatrixBase::maxCoeff() maxCoeff(&x,&y) \\endlink and \n\\link MatrixBase::minCoeff() minCoeff(&x,&y)\\endlink, which can be used to find\nthe location of the greatest or smallest coefficient in a Matrix or \nArray.\n\nThe arguments passed to a visitor are pointers to the variables where the\nrow and column position are to be stored. These variables should be of type\n\\link DenseBase::Index Index \\endlink, as shown below:\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include Tutorial_ReductionsVisitorsBroadcasting_visitors.cpp\n</td>\n<td>\n\\verbinclude Tutorial_ReductionsVisitorsBroadcasting_visitors.out\n</td></tr></table>\n\nNote that both functions also return the value of the minimum or maximum coefficient if needed,\nas if it was a typical reduction operation.\n\n\\section TutorialReductionsVisitorsBroadcastingPartialReductions Partial reductions\nPartial reductions are reductions that can operate column- or row-wise on a Matrix or \nArray, applying the reduction operation on each column or row and \nreturning a column or row-vector with the corresponding values. Partial reductions are applied \nwith \\link DenseBase::colwise() colwise() \\endlink or \\link DenseBase::rowwise() rowwise() \\endlink.\n\nA simple example is obtaining the maximum of the elements \nin each column in a given matrix, storing the result in a row-vector:\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include Tutorial_ReductionsVisitorsBroadcasting_colwise.cpp\n</td>\n<td>\n\\verbinclude Tutorial_ReductionsVisitorsBroadcasting_colwise.out\n</td></tr></table>\n\nThe same operation can be performed row-wise:\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include Tutorial_ReductionsVisitorsBroadcasting_rowwise.cpp\n</td>\n<td>\n\\verbinclude Tutorial_ReductionsVisitorsBroadcasting_rowwise.out\n</td></tr></table>\n\n<b>Note that column-wise operations return a 'row-vector' while row-wise operations\nreturn a 'column-vector'</b>\n\n\\subsection TutorialReductionsVisitorsBroadcastingPartialReductionsCombined Combining partial reductions with other operations\nIt is also possible to use the result of a partial reduction to do further processing.\nHere is another example that finds the column whose sum of elements is the maximum\n within a matrix. With column-wise partial reductions this can be coded as:\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include Tutorial_ReductionsVisitorsBroadcasting_maxnorm.cpp\n</td>\n<td>\n\\verbinclude Tutorial_ReductionsVisitorsBroadcasting_maxnorm.out\n</td></tr></table>\n\nThe previous example applies the \\link DenseBase::sum() sum() \\endlink reduction on each column\nthough the \\link DenseBase::colwise() colwise() \\endlink visitor, obtaining a new matrix whose\nsize is 1x4.\n\nTherefore, if\n\\f[\n\\mbox{m} = \\begin{bmatrix} 1 & 2 & 6 & 9 \\\\\n                    3 & 1 & 7 & 2 \\end{bmatrix}\n\\f]\n\nthen\n\n\\f[\n\\mbox{m.colwise().sum()} = \\begin{bmatrix} 4 & 3 & 13 & 11 \\end{bmatrix}\n\\f]\n\nThe \\link DenseBase::maxCoeff() maxCoeff() \\endlink reduction is finally applied \nto obtain the column index where the maximum sum is found, \nwhich is the column index 2 (third column) in this case.\n\n\n\\section TutorialReductionsVisitorsBroadcastingBroadcasting Broadcasting\nThe concept behind broadcasting is similar to partial reductions, with the difference that broadcasting \nconstructs an expression where a vector (column or row) is interpreted as a matrix by replicating it in \none direction.\n\nA simple example is to add a certain column-vector to each column in a matrix. \nThis can be accomplished with:\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include Tutorial_ReductionsVisitorsBroadcasting_broadcast_simple.cpp\n</td>\n<td>\n\\verbinclude Tutorial_ReductionsVisitorsBroadcasting_broadcast_simple.out\n</td></tr></table>\n\nWe can interpret the instruction <tt>mat.colwise() += v</tt> in two equivalent ways. It adds the vector \\c v\nto every column of the matrix. Alternatively, it can be interpreted as repeating the vector \\c v four times to\nform a four-by-two matrix which is then added to \\c mat:\n\\f[\n\\begin{bmatrix} 1 & 2 & 6 & 9 \\\\ 3 & 1 & 7 & 2 \\end{bmatrix}\n+ \\begin{bmatrix} 0 & 0 & 0 & 0 \\\\ 1 & 1 & 1 & 1 \\end{bmatrix}\n= \\begin{bmatrix} 1 & 2 & 6 & 9 \\\\ 4 & 2 & 8 & 3 \\end{bmatrix}.\n\\f]\nThe operators <tt>-=</tt>, <tt>+</tt> and <tt>-</tt> can also be used column-wise and row-wise. On arrays, we \ncan also use the operators <tt>*=</tt>, <tt>/=</tt>, <tt>*</tt> and <tt>/</tt> to perform coefficient-wise \nmultiplication and division column-wise or row-wise. These operators are not available on matrices because it\nis not clear what they would do. If you want multiply column 0 of a matrix \\c mat with \\c v(0), column 1 with \n\\c v(1), and so on, then use <tt>mat = mat * v.asDiagonal()</tt>.\n\nIt is important to point out that the vector to be added column-wise or row-wise must be of type Vector,\nand cannot be a Matrix. If this is not met then you will get compile-time error. This also means that\nbroadcasting operations can only be applied with an object of type Vector, when operating with Matrix.\nThe same applies for the Array class, where the equivalent for VectorXf is ArrayXf. As always, you should\nnot mix arrays and matrices in the same expression.\n\nTo perform the same operation row-wise we can do:\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include Tutorial_ReductionsVisitorsBroadcasting_broadcast_simple_rowwise.cpp\n</td>\n<td>\n\\verbinclude Tutorial_ReductionsVisitorsBroadcasting_broadcast_simple_rowwise.out\n</td></tr></table>\n\n\\subsection TutorialReductionsVisitorsBroadcastingBroadcastingCombined Combining broadcasting with other operations\nBroadcasting can also be combined with other operations, such as Matrix or Array operations, \nreductions and partial reductions.\n\nNow that broadcasting, reductions and partial reductions have been introduced, we can dive into a more advanced example that finds\nthe nearest neighbour of a vector <tt>v</tt> within the columns of matrix <tt>m</tt>. The Euclidean distance will be used in this example,\ncomputing the squared Euclidean distance with the partial reduction named \\link MatrixBase::squaredNorm() squaredNorm() \\endlink:\n\n<table class=\"example\">\n<tr><th>Example:</th><th>Output:</th></tr>\n<tr><td>\n\\include Tutorial_ReductionsVisitorsBroadcasting_broadcast_1nn.cpp\n</td>\n<td>\n\\verbinclude Tutorial_ReductionsVisitorsBroadcasting_broadcast_1nn.out\n</td></tr></table>\n\nThe line that does the job is \n\\code\n  (m.colwise() - v).colwise().squaredNorm().minCoeff(&index);\n\\endcode\n\nWe will go step by step to understand what is happening:\n\n  - <tt>m.colwise() - v</tt> is a broadcasting operation, subtracting <tt>v</tt> from each column in <tt>m</tt>. The result of this operation\nis a new matrix whose size is the same as matrix <tt>m</tt>: \\f[\n  \\mbox{m.colwise() - v} = \n  \\begin{bmatrix}\n    -1 & 21 & 4 & 7 \\\\\n     0 & 8  & 4 & -1\n  \\end{bmatrix}\n\\f]\n\n  - <tt>(m.colwise() - v).colwise().squaredNorm()</tt> is a partial reduction, computing the squared norm column-wise. The result of\nthis operation is a row-vector where each coefficient is the squared Euclidean distance between each column in <tt>m</tt> and <tt>v</tt>: \\f[\n  \\mbox{(m.colwise() - v).colwise().squaredNorm()} =\n  \\begin{bmatrix}\n     1 & 505 & 32 & 50\n  \\end{bmatrix}\n\\f]\n\n  - Finally, <tt>minCoeff(&index)</tt> is used to obtain the index of the column in <tt>m</tt> that is closest to <tt>v</tt> in terms of Euclidean\ndistance.\n\n*/\n\n}\n"
  },
  {
    "path": "libs/eigen/doc/TutorialSparse.dox",
    "content": "namespace Eigen {\n\n/** \\eigenManualPage TutorialSparse Sparse matrix manipulations\n\n\\eigenAutoToc\n\nManipulating and solving sparse problems involves various modules which are summarized below:\n\n<table class=\"manual\">\n<tr><th>Module</th><th>Header file</th><th>Contents</th></tr>\n<tr><td>\\link SparseCore_Module SparseCore \\endlink</td><td>\\code#include <Eigen/SparseCore>\\endcode</td><td>SparseMatrix and SparseVector classes, matrix assembly, basic sparse linear algebra (including sparse triangular solvers)</td></tr>\n<tr><td>\\link SparseCholesky_Module SparseCholesky \\endlink</td><td>\\code#include <Eigen/SparseCholesky>\\endcode</td><td>Direct sparse LLT and LDLT Cholesky factorization to solve sparse self-adjoint positive definite problems</td></tr>\n<tr><td>\\link SparseLU_Module SparseLU \\endlink</td><td>\\code #include<Eigen/SparseLU> \\endcode</td>\n<td>%Sparse LU factorization to solve general square sparse systems</td></tr>\n<tr><td>\\link SparseQR_Module SparseQR \\endlink</td><td>\\code #include<Eigen/SparseQR>\\endcode </td><td>%Sparse QR factorization for solving sparse linear least-squares problems</td></tr>\n<tr><td>\\link IterativeLinearSolvers_Module IterativeLinearSolvers \\endlink</td><td>\\code#include <Eigen/IterativeLinearSolvers>\\endcode</td><td>Iterative solvers to solve large general linear square problems (including self-adjoint positive definite problems)</td></tr>\n<tr><td>\\link Sparse_Module Sparse \\endlink</td><td>\\code#include <Eigen/Sparse>\\endcode</td><td>Includes all the above modules</td></tr>\n</table>\n\n\\section TutorialSparseIntro Sparse matrix format\n\nIn many applications (e.g., finite element methods) it is common to deal with very large matrices where only a few coefficients are different from zero.  In such cases, memory consumption can be reduced and performance increased by using a specialized representation storing only the nonzero coefficients. Such a matrix is called a sparse matrix.\n\n\\b The \\b %SparseMatrix \\b class\n\nThe class SparseMatrix is the main sparse matrix representation of Eigen's sparse module; it offers high performance and low memory usage.\nIt implements a more versatile variant of the widely-used Compressed Column (or Row) Storage scheme.\nIt consists of four compact arrays:\n - \\c Values: stores the coefficient values of the non-zeros.\n - \\c InnerIndices: stores the row (resp. column) indices of the non-zeros.\n - \\c OuterStarts: stores for each column (resp. row) the index of the first non-zero in the previous two arrays.\n - \\c InnerNNZs: stores the number of non-zeros of each column (resp. row).\nThe word \\c inner refers to an \\em inner \\em vector that is a column for a column-major matrix, or a row for a row-major matrix.\nThe word \\c outer refers to the other direction.\n\nThis storage scheme is better explained on an example. The following matrix\n<table class=\"manual\">\n<tr><td> 0</td><td>3</td><td> 0</td><td>0</td><td> 0</td></tr>\n<tr><td>22</td><td>0</td><td> 0</td><td>0</td><td>17</td></tr>\n<tr><td> 7</td><td>5</td><td> 0</td><td>1</td><td> 0</td></tr>\n<tr><td> 0</td><td>0</td><td> 0</td><td>0</td><td> 0</td></tr>\n<tr><td> 0</td><td>0</td><td>14</td><td>0</td><td> 8</td></tr>\n</table>\n\nand one of its possible sparse, \\b column \\b major representation:\n<table class=\"manual\">\n<tr><td>Values:</td>        <td>22</td><td>7</td><td>_</td><td>3</td><td>5</td><td>14</td><td>_</td><td>_</td><td>1</td><td>_</td><td>17</td><td>8</td></tr>\n<tr><td>InnerIndices:</td>  <td> 1</td><td>2</td><td>_</td><td>0</td><td>2</td><td> 4</td><td>_</td><td>_</td><td>2</td><td>_</td><td> 1</td><td>4</td></tr>\n</table>\n<table class=\"manual\">\n<tr><td>OuterStarts:</td><td>0</td><td>3</td><td>5</td><td>8</td><td>10</td><td>\\em 12 </td></tr>\n<tr><td>InnerNNZs:</td>    <td>2</td><td>2</td><td>1</td><td>1</td><td> 2</td><td></td></tr>\n</table>\n\nCurrently the elements of a given inner vector are guaranteed to be always sorted by increasing inner indices.\nThe \\c \"_\" indicates available free space to quickly insert new elements.\nAssuming no reallocation is needed, the insertion of a random element is therefore in O(nnz_j) where nnz_j is the number of nonzeros of the respective inner vector.\nOn the other hand, inserting elements with increasing inner indices in a given inner vector is much more efficient since this only requires to increase the respective \\c InnerNNZs entry that is a O(1) operation.\n\nThe case where no empty space is available is a special case, and is refered as the \\em compressed mode.\nIt corresponds to the widely used Compressed Column (or Row) Storage schemes (CCS or CRS).\nAny SparseMatrix can be turned to this form by calling the SparseMatrix::makeCompressed() function.\nIn this case, one can remark that the \\c InnerNNZs array is redundant with \\c OuterStarts because we the equality: \\c InnerNNZs[j] = \\c OuterStarts[j+1]-\\c OuterStarts[j].\nTherefore, in practice a call to SparseMatrix::makeCompressed() frees this buffer.\n\nIt is worth noting that most of our wrappers to external libraries requires compressed matrices as inputs.\n\nThe results of %Eigen's operations always produces \\b compressed sparse matrices.\nOn the other hand, the insertion of a new element into a SparseMatrix converts this later to the \\b uncompressed mode.\n\nHere is the previous matrix represented in compressed mode:\n<table class=\"manual\">\n<tr><td>Values:</td>        <td>22</td><td>7</td><td>3</td><td>5</td><td>14</td><td>1</td><td>17</td><td>8</td></tr>\n<tr><td>InnerIndices:</td>  <td> 1</td><td>2</td><td>0</td><td>2</td><td> 4</td><td>2</td><td> 1</td><td>4</td></tr>\n</table>\n<table class=\"manual\">\n<tr><td>OuterStarts:</td><td>0</td><td>2</td><td>4</td><td>5</td><td>6</td><td>\\em 8 </td></tr>\n</table>\n\nA SparseVector is a special case of a SparseMatrix where only the \\c Values and \\c InnerIndices arrays are stored.\nThere is no notion of compressed/uncompressed mode for a SparseVector.\n\n\n\\section TutorialSparseExample First example\n\nBefore describing each individual class, let's start with the following typical example: solving the Laplace equation \\f$ \\nabla u = 0 \\f$ on a regular 2D grid using a finite difference scheme and Dirichlet boundary conditions.\nSuch problem can be mathematically expressed as a linear problem of the form \\f$ Ax=b \\f$ where \\f$ x \\f$ is the vector of \\c m unknowns (in our case, the values of the pixels), \\f$ b \\f$ is the right hand side vector resulting from the boundary conditions, and \\f$ A \\f$ is an \\f$ m \\times m \\f$ matrix containing only a few non-zero elements resulting from the discretization of the Laplacian operator.\n\n<table class=\"manual\">\n<tr><td>\n\\include Tutorial_sparse_example.cpp\n</td>\n<td>\n\\image html Tutorial_sparse_example.jpeg\n</td></tr></table>\n\nIn this example, we start by defining a column-major sparse matrix type of double \\c SparseMatrix<double>, and a triplet list of the same scalar type \\c  Triplet<double>. A triplet is a simple object representing a non-zero entry as the triplet: \\c row index, \\c column index, \\c value.\n\nIn the main function, we declare a list \\c coefficients of triplets (as a std vector) and the right hand side vector \\f$ b \\f$ which are filled by the \\a buildProblem function.\nThe raw and flat list of non-zero entries is then converted to a true SparseMatrix object \\c A.\nNote that the elements of the list do not have to be sorted, and possible duplicate entries will be summed up.\n\nThe last step consists of effectively solving the assembled problem.\nSince the resulting matrix \\c A is symmetric by construction, we can perform a direct Cholesky factorization via the SimplicialLDLT class which behaves like its LDLT counterpart for dense objects.\n\nThe resulting vector \\c x contains the pixel values as a 1D array which is saved to a jpeg file shown on the right of the code above.\n\nDescribing the \\a buildProblem and \\a save functions is out of the scope of this tutorial. They are given \\ref TutorialSparse_example_details \"here\" for the curious and reproducibility purpose.\n\n\n\n\n\\section TutorialSparseSparseMatrix The SparseMatrix class\n\n\\b %Matrix \\b and \\b vector \\b properties \\n\n\nThe SparseMatrix and SparseVector classes take three template arguments:\n * the scalar type (e.g., double)\n * the storage order (ColMajor or RowMajor, the default is ColMajor)\n * the inner index type (default is \\c int).\n\nAs for dense Matrix objects, constructors takes the size of the object.\nHere are some examples:\n\n\\code\nSparseMatrix<std::complex<float> > mat(1000,2000);         // declares a 1000x2000 column-major compressed sparse matrix of complex<float>\nSparseMatrix<double,RowMajor> mat(1000,2000);              // declares a 1000x2000 row-major compressed sparse matrix of double\nSparseVector<std::complex<float> > vec(1000);              // declares a column sparse vector of complex<float> of size 1000\nSparseVector<double,RowMajor> vec(1000);                   // declares a row sparse vector of double of size 1000\n\\endcode\n\nIn the rest of the tutorial, \\c mat and \\c vec represent any sparse-matrix and sparse-vector objects, respectively.\n\nThe dimensions of a matrix can be queried using the following functions:\n<table class=\"manual\">\n<tr><td>Standard \\n dimensions</td><td>\\code\nmat.rows()\nmat.cols()\\endcode</td>\n<td>\\code\nvec.size() \\endcode</td>\n</tr>\n<tr><td>Sizes along the \\n inner/outer dimensions</td><td>\\code\nmat.innerSize()\nmat.outerSize()\\endcode</td>\n<td></td>\n</tr>\n<tr><td>Number of non \\n zero coefficients</td><td>\\code\nmat.nonZeros() \\endcode</td>\n<td>\\code\nvec.nonZeros() \\endcode</td></tr>\n</table>\n\n\n\\b Iterating \\b over \\b the \\b nonzero \\b coefficients \\n\n\nRandom access to the elements of a sparse object can be done through the \\c coeffRef(i,j) function.\nHowever, this function involves a quite expensive binary search.\nIn most cases, one only wants to iterate over the non-zeros elements. This is achieved by a standard loop over the outer dimension, and then by iterating over the non-zeros of the current inner vector via an InnerIterator. Thus, the non-zero entries have to be visited in the same order than the storage order.\nHere is an example:\n<table class=\"manual\">\n<tr><td>\n\\code\nSparseMatrix<double> mat(rows,cols);\nfor (int k=0; k<mat.outerSize(); ++k)\n  for (SparseMatrix<double>::InnerIterator it(mat,k); it; ++it)\n  {\n    it.value();\n    it.row();   // row index\n    it.col();   // col index (here it is equal to k)\n    it.index(); // inner index, here it is equal to it.row()\n  }\n\\endcode\n</td><td>\n\\code\nSparseVector<double> vec(size);\nfor (SparseVector<double>::InnerIterator it(vec); it; ++it)\n{\n  it.value(); // == vec[ it.index() ]\n  it.index();\n}\n\\endcode\n</td></tr>\n</table>\nFor a writable expression, the referenced value can be modified using the valueRef() function.\nIf the type of the sparse matrix or vector depends on a template parameter, then the \\c typename keyword is\nrequired to indicate that \\c InnerIterator denotes a type; see \\ref TopicTemplateKeyword for details.\n\n\n\\section TutorialSparseFilling Filling a sparse matrix\n\nBecause of the special storage scheme of a SparseMatrix, special care has to be taken when adding new nonzero entries.\nFor instance, the cost of a single purely random insertion into a SparseMatrix is \\c O(nnz), where \\c nnz is the current number of non-zero coefficients.\n\nThe simplest way to create a sparse matrix while guaranteeing good performance is thus to first build a list of so-called \\em triplets, and then convert it to a SparseMatrix.\n\nHere is a typical usage example:\n\\code\ntypedef Eigen::Triplet<double> T;\nstd::vector<T> tripletList;\ntripletList.reserve(estimation_of_entries);\nfor(...)\n{\n  // ...\n  tripletList.push_back(T(i,j,v_ij));\n}\nSparseMatrixType mat(rows,cols);\nmat.setFromTriplets(tripletList.begin(), tripletList.end());\n// mat is ready to go!\n\\endcode\nThe \\c std::vector of triplets might contain the elements in arbitrary order, and might even contain duplicated elements that will be summed up by setFromTriplets().\nSee the SparseMatrix::setFromTriplets() function and class Triplet for more details.\n\n\nIn some cases, however, slightly higher performance, and lower memory consumption can be reached by directly inserting the non-zeros into the destination matrix.\nA typical scenario of this approach is illustrated bellow:\n\\code\n1: SparseMatrix<double> mat(rows,cols);         // default is column major\n2: mat.reserve(VectorXi::Constant(cols,6));\n3: for each i,j such that v_ij != 0\n4:   mat.insert(i,j) = v_ij;                    // alternative: mat.coeffRef(i,j) += v_ij;\n5: mat.makeCompressed();                        // optional\n\\endcode\n\n- The key ingredient here is the line 2 where we reserve room for 6 non-zeros per column. In many cases, the number of non-zeros per column or row can easily be known in advance. If it varies significantly for each inner vector, then it is possible to specify a reserve size for each inner vector by providing a vector object with an operator[](int j) returning the reserve size of the \\c j-th inner vector (e.g., via a VectorXi or std::vector<int>). If only a rought estimate of the number of nonzeros per inner-vector can be obtained, it is highly recommended to overestimate it rather than the opposite. If this line is omitted, then the first insertion of a new element will reserve room for 2 elements per inner vector.\n- The line 4 performs a sorted insertion. In this example, the ideal case is when the \\c j-th column is not full and contains non-zeros whose inner-indices are smaller than \\c i. In this case, this operation boils down to trivial O(1) operation.\n- When calling insert(i,j) the element \\c i \\c ,j must not already exists, otherwise use the coeffRef(i,j) method that will allow to, e.g., accumulate values. This method first performs a binary search and finally calls insert(i,j) if the element does not already exist. It is more flexible than insert() but also more costly.\n- The line 5 suppresses the remaining empty space and transforms the matrix into a compressed column storage.\n\n\n\n\\section TutorialSparseFeatureSet Supported operators and functions\n\nBecause of their special storage format, sparse matrices cannot offer the same level of flexibility than dense matrices.\nIn Eigen's sparse module we chose to expose only the subset of the dense matrix API which can be efficiently implemented.\nIn the following \\em sm denotes a sparse matrix, \\em sv a sparse vector, \\em dm a dense matrix, and \\em dv a dense vector.\n\n\\subsection TutorialSparse_BasicOps Basic operations\n\n%Sparse expressions support most of the unary and binary coefficient wise operations:\n\\code\nsm1.real()   sm1.imag()   -sm1                    0.5*sm1\nsm1+sm2      sm1-sm2      sm1.cwiseProduct(sm2)\n\\endcode\nHowever, <strong>a strong restriction is that the storage orders must match</strong>. For instance, in the following example:\n\\code\nsm4 = sm1 + sm2 + sm3;\n\\endcode\nsm1, sm2, and sm3 must all be row-major or all column-major.\nOn the other hand, there is no restriction on the target matrix sm4.\nFor instance, this means that for computing \\f$ A^T + A \\f$, the matrix \\f$ A^T \\f$ must be evaluated into a temporary matrix of compatible storage order:\n\\code\nSparseMatrix<double> A, B;\nB = SparseMatrix<double>(A.transpose()) + A;\n\\endcode\n\nSome binary coefficient-wise operators can also mix sparse and dense expressions:\n\\code\nsm2 = sm1.cwiseProduct(dm1);\ndm1 += sm1;\n\\endcode\n\nHowever, it is not yet possible to add a sparse and a dense matrix as in <tt>dm2 = sm1 + dm1</tt>.\nPlease write this as the equivalent <tt>dm2 = dm1; dm2 += sm1</tt> (we plan to lift this restriction\nin the next release of %Eigen).\n\n%Sparse expressions also support transposition:\n\\code\nsm1 = sm2.transpose();\nsm1 = sm2.adjoint();\n\\endcode\nHowever, there is no transposeInPlace() method.\n\n\n\\subsection TutorialSparse_Products Matrix products\n\n%Eigen supports various kind of sparse matrix products which are summarize below:\n  - \\b sparse-dense:\n    \\code\ndv2 = sm1 * dv1;\ndm2 = dm1 * sm1.adjoint();\ndm2 = 2. * sm1 * dm1;\n    \\endcode\n  - \\b symmetric \\b sparse-dense. The product of a sparse symmetric matrix with a dense matrix (or vector) can also be optimized by specifying the symmetry with selfadjointView():\n    \\code\ndm2 = sm1.selfadjointView<>() * dm1;        // if all coefficients of A are stored\ndm2 = A.selfadjointView<Upper>() * dm1;     // if only the upper part of A is stored\ndm2 = A.selfadjointView<Lower>() * dm1;     // if only the lower part of A is stored\n    \\endcode\n  - \\b sparse-sparse. For sparse-sparse products, two different algorithms are available. The default one is conservative and preserve the explicit zeros that might appear:\n    \\code\nsm3 = sm1 * sm2;\nsm3 = 4 * sm1.adjoint() * sm2;\n    \\endcode\n    The second algorithm prunes on the fly the explicit zeros, or the values smaller than a given threshold. It is enabled and controlled through the prune() functions:\n    \\code\nsm3 = (sm1 * sm2).pruned();                  // removes numerical zeros\nsm3 = (sm1 * sm2).pruned(ref);               // removes elements much smaller than ref\nsm3 = (sm1 * sm2).pruned(ref,epsilon);       // removes elements smaller than ref*epsilon\n    \\endcode\n\n  - \\b permutations. Finally, permutations can be applied to sparse matrices too:\n    \\code\nPermutationMatrix<Dynamic,Dynamic> P = ...;\nsm2 = P * sm1;\nsm2 = sm1 * P.inverse();\nsm2 = sm1.transpose() * P;\n    \\endcode\n\n\n\\subsection TutorialSparse_SubMatrices Block operations\n\nRegarding read-access, sparse matrices expose the same API than for dense matrices to access to sub-matrices such as blocks, columns, and rows. See \\ref TutorialBlockOperations for a detailed introduction.\nHowever, for performance reasons, writing to a sub-sparse-matrix is much more limited, and currently only contiguous sets of columns (resp. rows) of a column-major (resp. row-major) SparseMatrix are writable. Moreover, this information has to be known at compile-time, leaving out methods such as <tt>block(...)</tt> and <tt>corner*(...)</tt>. The available API for write-access to a SparseMatrix are summarized below:\n\\code\nSparseMatrix<double,ColMajor> sm1;\nsm1.col(j) = ...;\nsm1.leftCols(ncols) = ...;\nsm1.middleCols(j,ncols) = ...;\nsm1.rightCols(ncols) = ...;\n\nSparseMatrix<double,RowMajor> sm2;\nsm2.row(i) = ...;\nsm2.topRows(nrows) = ...;\nsm2.middleRows(i,nrows) = ...;\nsm2.bottomRows(nrows) = ...;\n\\endcode\n\nIn addition, sparse matrices expose the SparseMatrixBase::innerVector() and SparseMatrixBase::innerVectors() methods, which are aliases to the col/middleCols methods for a column-major storage, and to the row/middleRows methods for a row-major storage.\n\n\\subsection TutorialSparse_TriangularSelfadjoint Triangular and selfadjoint views\n\nJust as with dense matrices, the triangularView() function can be used to address a triangular part of the matrix, and perform triangular solves with a dense right hand side:\n\\code\ndm2 = sm1.triangularView<Lower>(dm1);\ndv2 = sm1.transpose().triangularView<Upper>(dv1);\n\\endcode\n\nThe selfadjointView() function permits various operations:\n - optimized sparse-dense matrix products:\n    \\code\ndm2 = sm1.selfadjointView<>() * dm1;        // if all coefficients of A are stored\ndm2 = A.selfadjointView<Upper>() * dm1;     // if only the upper part of A is stored\ndm2 = A.selfadjointView<Lower>() * dm1;     // if only the lower part of A is stored\n    \\endcode\n - copy of triangular parts:\n    \\code\nsm2 = sm1.selfadjointView<Upper>();                               // makes a full selfadjoint matrix from the upper triangular part\nsm2.selfadjointView<Lower>() = sm1.selfadjointView<Upper>();      // copies the upper triangular part to the lower triangular part\n    \\endcode\n - application of symmetric permutations:\n \\code\nPermutationMatrix<Dynamic,Dynamic> P = ...;\nsm2 = A.selfadjointView<Upper>().twistedBy(P);                                // compute P S P' from the upper triangular part of A, and make it a full matrix\nsm2.selfadjointView<Lower>() = A.selfadjointView<Lower>().twistedBy(P);       // compute P S P' from the lower triangular part of A, and then only compute the lower part\n \\endcode\n\nPlease, refer to the \\link SparseQuickRefPage Quick Reference \\endlink  guide for the list of supported operations. The list of linear solvers available is \\link TopicSparseSystems here. \\endlink\n\n*/\n\n}\n"
  },
  {
    "path": "libs/eigen/doc/TutorialSparse_example_details.dox",
    "content": "/**\n\\page TutorialSparse_example_details\n\\include Tutorial_sparse_example_details.cpp\n*/\n"
  },
  {
    "path": "libs/eigen/doc/UnalignedArrayAssert.dox",
    "content": "namespace Eigen {\n\n/** \\eigenManualPage TopicUnalignedArrayAssert Explanation of the assertion on unaligned arrays\n\nHello! You are seeing this webpage because your program terminated on an assertion failure like this one:\n<pre>\nmy_program: path/to/eigen/Eigen/src/Core/DenseStorage.h:44:\nEigen::internal::matrix_array<T, Size, MatrixOptions, Align>::internal::matrix_array()\n[with T = double, int Size = 2, int MatrixOptions = 2, bool Align = true]:\nAssertion `(reinterpret_cast<size_t>(array) & (sizemask)) == 0 && \"this assertion\nis explained here: http://eigen.tuxfamily.org/dox/group__TopicUnalignedArrayAssert.html\n**** READ THIS WEB PAGE !!! ****\"' failed.\n</pre>\n\nThere are 4 known causes for this issue. Please read on to understand them and learn how to fix them.\n\n\\eigenAutoToc\n\n\\section where Where in my own code is the cause of the problem?\n\nFirst of all, you need to find out where in your own code this assertion was triggered from. At first glance, the error message doesn't look helpful, as it refers to a file inside Eigen! However, since your program crashed, if you can reproduce the crash, you can get a backtrace using any debugger. For example, if you're using GCC, you can use the GDB debugger as follows:\n\\code\n$ gdb ./my_program          # Start GDB on your program\n> run                       # Start running your program\n...                         # Now reproduce the crash!\n> bt                        # Obtain the backtrace\n\\endcode\nNow that you know precisely where in your own code the problem is happening, read on to understand what you need to change.\n\n\\section c1 Cause 1: Structures having Eigen objects as members\n\nIf you have code like this,\n\n\\code\nclass Foo\n{\n  //...\n  Eigen::Vector2d v;\n  //...\n};\n//...\nFoo *foo = new Foo;\n\\endcode\n\nthen you need to read this separate page: \\ref TopicStructHavingEigenMembers \"Structures Having Eigen Members\".\n\nNote that here, Eigen::Vector2d is only used as an example, more generally the issue arises for all \\ref TopicFixedSizeVectorizable \"fixed-size vectorizable Eigen types\".\n\n\\section c2 Cause 2: STL Containers or manual memory allocation\n\nIf you use STL Containers such as std::vector, std::map, ..., with %Eigen objects, or with classes containing %Eigen objects, like this,\n\n\\code\nstd::vector<Eigen::Matrix2f> my_vector;\nstruct my_class { ... Eigen::Matrix2f m; ... };\nstd::map<int, my_class> my_map;\n\\endcode\n\nthen you need to read this separate page: \\ref TopicStlContainers \"Using STL Containers with Eigen\".\n\nNote that here, Eigen::Matrix2f is only used as an example, more generally the issue arises for all \\ref TopicFixedSizeVectorizable \"fixed-size vectorizable Eigen types\" and \\ref TopicStructHavingEigenMembers \"structures having such Eigen objects as member\".\n\nThe same issue will be exhibited by any classes/functions by-passing operator new to allocate memory, that is, by performing custom memory allocation followed by calls to the placement new operator. This is for instance typically the case of \\c std::make_shared or \\c std::allocate_shared for which is the solution is to use an \\ref aligned_allocator \"aligned allocator\" as detailed in the \\ref TopicStlContainers \"solution for STL containers\".\n\n\\section c3 Cause 3: Passing Eigen objects by value\n\nIf some function in your code is getting an Eigen object passed by value, like this,\n\n\\code\nvoid func(Eigen::Vector4d v);\n\\endcode\n\nthen you need to read this separate page: \\ref TopicPassingByValue \"Passing Eigen objects by value to functions\".\n\nNote that here, Eigen::Vector4d is only used as an example, more generally the issue arises for all \\ref TopicFixedSizeVectorizable \"fixed-size vectorizable Eigen types\".\n\n\\section c4 Cause 4: Compiler making a wrong assumption on stack alignment (for instance GCC on Windows)\n\nThis is a must-read for people using GCC on Windows (like MinGW or TDM-GCC). If you have this assertion failure in an innocent function declaring a local variable like this:\n\n\\code\nvoid foo()\n{\n  Eigen::Quaternionf q;\n  //...\n}\n\\endcode\n\nthen you need to read this separate page: \\ref TopicWrongStackAlignment \"Compiler making a wrong assumption on stack alignment\".\n\nNote that here, Eigen::Quaternionf is only used as an example, more generally the issue arises for all \\ref TopicFixedSizeVectorizable \"fixed-size vectorizable Eigen types\".\n\n\\section explanation General explanation of this assertion\n\n\\ref TopicFixedSizeVectorizable \"fixed-size vectorizable Eigen objects\" must absolutely be created at 16-byte-aligned locations, otherwise SIMD instructions adressing them will crash.\n\nEigen normally takes care of these alignment issues for you, by setting an alignment attribute on them and by overloading their \"operator new\".\n\nHowever there are a few corner cases where these alignment settings get overridden: they are the possible causes for this assertion.\n\n\\section getrid I don't care about vectorization, how do I get rid of that stuff?\n\nTwo possibilities:\n<ul>\n  <li>Define EIGEN_DONT_ALIGN_STATICALLY. That disables all 128-bit static alignment code, while keeping 128-bit heap alignment. This has the effect of\n      disabling vectorization for fixed-size objects (like Matrix4d) while keeping vectorization of dynamic-size objects\n      (like MatrixXd). But do note that this breaks ABI compatibility with the default behavior of 128-bit static alignment.</li>\n  <li>Or define both EIGEN_DONT_VECTORIZE and EIGEN_DISABLE_UNALIGNED_ARRAY_ASSERT. This keeps the\n      128-bit alignment code and thus preserves ABI compatibility, but completely disables vectorization.</li>\n</ul>\n\nIf you want to know why defining EIGEN_DONT_VECTORIZE does not by itself disable 128-bit alignment and the assertion, here's the explanation:\n\nIt doesn't disable the assertion, because otherwise code that runs fine without vectorization would suddenly crash when enabling vectorization.\nIt doesn't disable 128bit alignment, because that would mean that vectorized and non-vectorized code are not mutually ABI-compatible. This ABI compatibility is very important, even for people who develop only an in-house application, as for instance one may want to have in the same application a vectorized path and a non-vectorized path.\n\n*/\n\n}\n"
  },
  {
    "path": "libs/eigen/doc/UsingIntelMKL.dox",
    "content": "/*\n Copyright (c) 2011, Intel Corporation. All rights reserved.\n Copyright (C) 2011 Gael Guennebaud <gael.guennebaud@inria.fr>\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n * Neither the name of Intel Corporation nor the names of its contributors may\n   be used to endorse or promote products derived from this software without\n   specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\n ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n ********************************************************************************\n *   Content : Documentation on the use of Intel MKL through Eigen\n ********************************************************************************\n*/\n\nnamespace Eigen {\n\n/** \\page TopicUsingIntelMKL Using Intel® Math Kernel Library from Eigen\n\n\\section TopicUsingIntelMKL_Intro Eigen and Intel® Math Kernel Library (Intel® MKL)\n\nSince Eigen version 3.1 and later, users can benefit from built-in Intel MKL optimizations with an installed copy of Intel MKL 10.3 (or later).\n<a href=\"http://eigen.tuxfamily.org/Counter/redirect_to_mkl.php\"> Intel MKL </a> provides highly optimized multi-threaded mathematical routines for x86-compatible architectures.\nIntel MKL is available on Linux, Mac and Windows for both Intel64 and IA32 architectures.\n\n\\note\nIntel® MKL is a proprietary software and it is the responsibility of users to buy or register for community (free) Intel MKL licenses for their products. Moreover, the license of the user product has to allow linking to proprietary software that excludes any unmodified versions of the GPL.\n\nUsing Intel MKL through Eigen is easy:\n-# define the \\c EIGEN_USE_MKL_ALL macro before including any Eigen's header\n-# link your program to MKL libraries (see the <a href=\"http://software.intel.com/en-us/articles/intel-mkl-link-line-advisor/\">MKL linking advisor</a>)\n-# on a 64bits system, you must use the LP64 interface (not the ILP64 one)\n\nWhen doing so, a number of Eigen's algorithms are silently substituted with calls to Intel MKL routines.\nThese substitutions apply only for \\b Dynamic \\b or \\b large enough objects with one of the following four standard scalar types: \\c float, \\c double, \\c complex<float>, and \\c complex<double>.\nOperations on other scalar types or mixing reals and complexes will continue to use the built-in algorithms.\n\nIn addition you can coarsely select choose which parts will be substituted by defining one or multiple of the following macros:\n\n<table class=\"manual\">\n<tr><td>\\c EIGEN_USE_BLAS </td><td>Enables the use of external BLAS level 2 and 3 routines (currently works with Intel MKL only)</td></tr>\n<tr class=\"alt\"><td>\\c EIGEN_USE_LAPACKE </td><td>Enables the use of external Lapack routines via the <a href=\"http://www.netlib.org/lapack/lapacke.html\">Intel Lapacke</a> C interface to Lapack (currently works with Intel MKL only)</td></tr>\n<tr><td>\\c EIGEN_USE_LAPACKE_STRICT </td><td>Same as \\c EIGEN_USE_LAPACKE but algorithm of lower robustness are disabled. This currently concerns only JacobiSVD which otherwise would be replaced by \\c gesvd that is less robust than Jacobi rotations.</td></tr>\n<tr class=\"alt\"><td>\\c EIGEN_USE_MKL_VML </td><td>Enables the use of Intel VML (vector operations)</td></tr>\n<tr><td>\\c EIGEN_USE_MKL_ALL </td><td>Defines \\c EIGEN_USE_BLAS, \\c EIGEN_USE_LAPACKE, and \\c EIGEN_USE_MKL_VML </td></tr>\n</table>\n\nFinally, the PARDISO sparse solver shipped with Intel MKL can be used through the \\ref PardisoLU, \\ref PardisoLLT and \\ref PardisoLDLT classes of the \\ref PardisoSupport_Module.\n\n\n\\section TopicUsingIntelMKL_SupportedFeatures List of supported features\n\nThe breadth of Eigen functionality covered by Intel MKL is listed in the table below.\n<table class=\"manual\">\n<tr><th>Functional domain</th><th>Code example</th><th>MKL routines</th></tr>\n<tr><td>Matrix-matrix operations \\n \\c EIGEN_USE_BLAS </td><td>\\code\nm1*m2.transpose();\nm1.selfadjointView<Lower>()*m2;\nm1*m2.triangularView<Upper>();\nm1.selfadjointView<Lower>().rankUpdate(m2,1.0);\n\\endcode</td><td>\\code\n?gemm\n?symm/?hemm\n?trmm\ndsyrk/ssyrk\n\\endcode</td></tr>\n<tr class=\"alt\"><td>Matrix-vector operations \\n \\c EIGEN_USE_BLAS </td><td>\\code\nm1.adjoint()*b;\nm1.selfadjointView<Lower>()*b;\nm1.triangularView<Upper>()*b;\n\\endcode</td><td>\\code\n?gemv\n?symv/?hemv\n?trmv\n\\endcode</td></tr>\n<tr><td>LU decomposition \\n \\c EIGEN_USE_LAPACKE \\n \\c EIGEN_USE_LAPACKE_STRICT </td><td>\\code\nv1 = m1.lu().solve(v2);\n\\endcode</td><td>\\code\n?getrf\n\\endcode</td></tr>\n<tr class=\"alt\"><td>Cholesky decomposition \\n \\c EIGEN_USE_LAPACKE \\n \\c EIGEN_USE_LAPACKE_STRICT </td><td>\\code\nv1 = m2.selfadjointView<Upper>().llt().solve(v2);\n\\endcode</td><td>\\code\n?potrf\n\\endcode</td></tr>\n<tr><td>QR decomposition \\n \\c EIGEN_USE_LAPACKE \\n \\c EIGEN_USE_LAPACKE_STRICT </td><td>\\code\nm1.householderQr();\nm1.colPivHouseholderQr();\n\\endcode</td><td>\\code\n?geqrf\n?geqp3\n\\endcode</td></tr>\n<tr class=\"alt\"><td>Singular value decomposition \\n \\c EIGEN_USE_LAPACKE </td><td>\\code\nJacobiSVD<MatrixXd> svd;\nsvd.compute(m1, ComputeThinV);\n\\endcode</td><td>\\code\n?gesvd\n\\endcode</td></tr>\n<tr><td>Eigen-value decompositions \\n \\c EIGEN_USE_LAPACKE \\n \\c EIGEN_USE_LAPACKE_STRICT </td><td>\\code\nEigenSolver<MatrixXd> es(m1);\nComplexEigenSolver<MatrixXcd> ces(m1);\nSelfAdjointEigenSolver<MatrixXd> saes(m1+m1.transpose());\nGeneralizedSelfAdjointEigenSolver<MatrixXd>\n    gsaes(m1+m1.transpose(),m2+m2.transpose());\n\\endcode</td><td>\\code\n?gees\n?gees\n?syev/?heev\n?syev/?heev,\n?potrf\n\\endcode</td></tr>\n<tr class=\"alt\"><td>Schur decomposition \\n \\c EIGEN_USE_LAPACKE \\n \\c EIGEN_USE_LAPACKE_STRICT </td><td>\\code\nRealSchur<MatrixXd> schurR(m1);\nComplexSchur<MatrixXcd> schurC(m1);\n\\endcode</td><td>\\code\n?gees\n\\endcode</td></tr>\n<tr><td>Vector Math \\n \\c EIGEN_USE_MKL_VML </td><td>\\code\nv2=v1.array().sin();\nv2=v1.array().asin();\nv2=v1.array().cos();\nv2=v1.array().acos();\nv2=v1.array().tan();\nv2=v1.array().exp();\nv2=v1.array().log();\nv2=v1.array().sqrt();\nv2=v1.array().square();\nv2=v1.array().pow(1.5);\n\\endcode</td><td>\\code\nv?Sin\nv?Asin\nv?Cos\nv?Acos\nv?Tan\nv?Exp\nv?Ln\nv?Sqrt\nv?Sqr\nv?Powx\n\\endcode</td></tr>\n</table>\nIn the examples, m1 and m2 are dense matrices and v1 and v2 are dense vectors.\n\n\n\\section TopicUsingIntelMKL_Links Links\n- Intel MKL can be purchased and downloaded <a href=\"http://eigen.tuxfamily.org/Counter/redirect_to_mkl.php\">here</a>.\n- Intel MKL is also bundled with <a href=\"http://software.intel.com/en-us/articles/intel-composer-xe/\">Intel Composer XE</a>.\n\n\n*/\n\n}\n"
  },
  {
    "path": "libs/eigen/doc/WrongStackAlignment.dox",
    "content": "namespace Eigen {\n\n/** \\eigenManualPage TopicWrongStackAlignment Compiler making a wrong assumption on stack alignment\n\n<h4>It appears that this was a GCC bug that has been fixed in GCC 4.5.\nIf you hit this issue, please upgrade to GCC 4.5 and report to us, so we can update this page.</h4>\n\nThis is an issue that, so far, we met only with GCC on Windows: for instance, MinGW and TDM-GCC.\n\nBy default, in a function like this,\n\n\\code\nvoid foo()\n{\n  Eigen::Quaternionf q;\n  //...\n}\n\\endcode\n\nGCC assumes that the stack is already 16-byte-aligned so that the object \\a q will be created at a 16-byte-aligned location. For this reason, it doesn't take any special care to explicitly align the object \\a q, as Eigen requires.\n\nThe problem is that, in some particular cases, this assumption can be wrong on Windows, where the stack is only guaranteed to have 4-byte alignment. Indeed, even though GCC takes care of aligning the stack in the main function and does its best to keep it aligned, when a function is called from another thread or from a binary compiled with another compiler, the stack alignment can be corrupted. This results in the object 'q' being created at an unaligned location, making your program crash with the \\ref TopicUnalignedArrayAssert \"assertion on unaligned arrays\". So far we found the three following solutions.\n\n\n\\section sec_sol1 Local solution\n\nA local solution is to mark such a function with this attribute:\n\\code\n__attribute__((force_align_arg_pointer)) void foo()\n{\n  Eigen::Quaternionf q;\n  //...\n}\n\\endcode\nRead <a href=\"http://gcc.gnu.org/onlinedocs/gcc-4.4.0/gcc/Function-Attributes.html#Function-Attributes\">this GCC documentation</a> to understand what this does. Of course this should only be done on GCC on Windows, so for portability you'll have to encapsulate this in a macro which you leave empty on other platforms. The advantage of this solution is that you can finely select which function might have a corrupted stack alignment. Of course on the downside this has to be done for every such function, so you may prefer one of the following two global solutions.\n\n\n\\section sec_sol2 Global solutions\n\nA global solution is to edit your project so that when compiling with GCC on Windows, you pass this option to GCC:\n\\code\n-mincoming-stack-boundary=2\n\\endcode\nExplanation: this tells GCC that the stack is only required to be aligned to 2^2=4 bytes, so that GCC now knows that it really must take extra care to honor the 16 byte alignment of \\ref TopicFixedSizeVectorizable \"fixed-size vectorizable Eigen types\" when needed.\n\nAnother global solution is to pass this option to gcc:\n\\code\n-mstackrealign\n\\endcode\nwhich has the same effect than adding the \\c force_align_arg_pointer attribute to all functions.\n\nThese global solutions are easy to use, but note that they may slowdown your program because they lead to extra prologue/epilogue instructions for every function.\n\n*/\n\n}\n"
  },
  {
    "path": "libs/eigen/doc/eigen_navtree_hacks.js",
    "content": "\n// generate a table of contents in the side-nav based on the h1/h2 tags of the current page.\nfunction generate_autotoc() {\n  var headers = $(\"h1, h2\");\n  if(headers.length > 1) {\n    var toc = $(\"#side-nav\").append('<div id=\"nav-toc\" class=\"toc\"><h3>Table of contents</h3></div>');\n    toc = $(\"#nav-toc\");\n    var footerHeight = footer.height();\n    toc = toc.append('<ul></ul>');\n    toc = toc.find('ul');\n    var indices = new Array();\n    indices[0] = 0;\n    indices[1] = 0;\n\n    var h1counts = $(\"h1\").length;\n    headers.each(function(i) {\n      var current = $(this);\n      var levelTag = current[0].tagName.charAt(1);\n      if(h1counts==0)\n        levelTag--;\n      var cur_id = current.attr(\"id\");\n\n      indices[levelTag-1]+=1;  \n      var prefix = indices[0];\n      if (levelTag >1) {\n        prefix+=\".\"+indices[1];\n      }\n        \n      // Uncomment to add number prefixes\n      // current.html(prefix + \"   \" + current.html());\n      for(var l = levelTag; l < 2; ++l){\n          indices[l] = 0;\n      }\n\n      if(cur_id == undefined) {\n        current.attr('id', 'title' + i);\n        current.addClass('anchor');\n        toc.append(\"<li class='level\" + levelTag + \"'><a id='link\" + i + \"' href='#title\" +\n                    i + \"' title='\" + current.prop(\"tagName\") + \"'>\" + current.text() + \"</a></li>\");\n      } else {\n        toc.append(\"<li class='level\" + levelTag + \"'><a id='\" + cur_id + \"' href='#title\" +\n                    i + \"' title='\" + current.prop(\"tagName\") + \"'>\" + current.text() + \"</a></li>\");\n      }\n    });\n    resizeHeight();\n  }\n}\n\n\nvar global_navtree_object;\n\n// Overloaded to remove links to sections/subsections\nfunction getNode(o, po)\n{\n  po.childrenVisited = true;\n  var l = po.childrenData.length-1;\n  for (var i in po.childrenData) {\n    var nodeData = po.childrenData[i];\n    if((!nodeData[1]) ||  (nodeData[1].indexOf('#')==-1)) // <- we added this line\n      po.children[i] = newNode(o, po, nodeData[0], nodeData[1], nodeData[2], i==l);\n  }\n}\n\n// Overloaded to adjust the size of the navtree wrt the toc\nfunction resizeHeight() \n{\n  var toc = $(\"#nav-toc\");\n  var tocHeight = toc.height();  // <- we added this line\n  var headerHeight = header.height();\n  var footerHeight = footer.height();\n  var windowHeight = $(window).height() - headerHeight - footerHeight;\n  content.css({height:windowHeight + \"px\"});\n  navtree.css({height:(windowHeight-tocHeight) + \"px\"}); // <- we modified this line\n  sidenav.css({height:(windowHeight) + \"px\",top: headerHeight+\"px\"});\n}\n\n// Overloaded to save the root node into global_navtree_object\nfunction initNavTree(toroot,relpath)\n{\n  var o = new Object();\n  global_navtree_object = o; // <- we added this line\n  o.toroot = toroot;\n  o.node = new Object();\n  o.node.li = document.getElementById(\"nav-tree-contents\");\n  o.node.childrenData = NAVTREE;\n  o.node.children = new Array();\n  o.node.childrenUL = document.createElement(\"ul\");\n  o.node.getChildrenUL = function() { return o.node.childrenUL; };\n  o.node.li.appendChild(o.node.childrenUL);\n  o.node.depth = 0;\n  o.node.relpath = relpath;\n  o.node.expanded = false;\n  o.node.isLast = true;\n  o.node.plus_img = document.createElement(\"img\");\n  o.node.plus_img.src = relpath+\"ftv2pnode.png\";\n  o.node.plus_img.width = 16;\n  o.node.plus_img.height = 22;\n\n  if (localStorageSupported()) {\n    var navSync = $('#nav-sync');\n    if (cachedLink()) {\n      showSyncOff(navSync,relpath);\n      navSync.removeClass('sync');\n    } else {\n      showSyncOn(navSync,relpath);\n    }\n    navSync.click(function(){ toggleSyncButton(relpath); });\n  }\n\n  navTo(o,toroot,window.location.hash,relpath);\n\n  $(window).bind('hashchange', function(){\n     if (window.location.hash && window.location.hash.length>1){\n       var a;\n       if ($(location).attr('hash')){\n         var clslink=stripPath($(location).attr('pathname'))+':'+\n                               $(location).attr('hash').substring(1);\n         a=$('.item a[class$=\"'+clslink+'\"]');\n       }\n       if (a==null || !$(a).parent().parent().hasClass('selected')){\n         $('.item').removeClass('selected');\n         $('.item').removeAttr('id');\n       }\n       var link=stripPath2($(location).attr('pathname'));\n       navTo(o,link,$(location).attr('hash'),relpath);\n     } else if (!animationInProgress) {\n       $('#doc-content').scrollTop(0);\n       $('.item').removeClass('selected');\n       $('.item').removeAttr('id');\n       navTo(o,toroot,window.location.hash,relpath);\n     }\n  })\n\n  $(window).load(showRoot);\n}\n\n// return false if the the node has no children at all, or has only section/subsection children\nfunction checkChildrenData(node) {\n  if (!(typeof(node.childrenData)==='string')) {\n    for (var i in node.childrenData) {\n      var url = node.childrenData[i][1];\n      if(url.indexOf(\"#\")==-1)\n        return true;\n    }\n    return false;\n  }\n  return (node.childrenData);\n}\n\n// Modified to:\n// 1 - remove the root node \n// 2 - remove the section/subsection children\nfunction createIndent(o,domNode,node,level)\n{\n  var level=-2; // <- we replaced level=-1 by level=-2\n  var n = node;\n  while (n.parentNode) { level++; n=n.parentNode; }\n  var imgNode = document.createElement(\"img\");\n  imgNode.style.paddingLeft=(16*(level)).toString()+'px';\n  imgNode.width  = 16;\n  imgNode.height = 22;\n  imgNode.border = 0;\n  if (checkChildrenData(node)) { // <- we modified this line to use checkChildrenData(node) instead of node.childrenData\n    node.plus_img = imgNode;\n    node.expandToggle = document.createElement(\"a\");\n    node.expandToggle.href = \"javascript:void(0)\";\n    node.expandToggle.onclick = function() {\n      if (node.expanded) {\n        $(node.getChildrenUL()).slideUp(\"fast\");\n        node.plus_img.src = node.relpath+\"ftv2pnode.png\";\n        node.expanded = false;\n      } else {\n        expandNode(o, node, false, false);\n      }\n    }\n    node.expandToggle.appendChild(imgNode);\n    domNode.appendChild(node.expandToggle);\n    imgNode.src = node.relpath+\"ftv2pnode.png\";\n  } else {\n    imgNode.src = node.relpath+\"ftv2node.png\";\n    domNode.appendChild(imgNode);\n  } \n}\n\n// Overloaded to automatically expand the selected node\nfunction selectAndHighlight(hash,n)\n{\n  var a;\n  if (hash) {\n    var link=stripPath($(location).attr('pathname'))+':'+hash.substring(1);\n    a=$('.item a[class$=\"'+link+'\"]');\n  }\n  if (a && a.length) {\n    a.parent().parent().addClass('selected');\n    a.parent().parent().attr('id','selected');\n    highlightAnchor();\n  } else if (n) {\n    $(n.itemDiv).addClass('selected');\n    $(n.itemDiv).attr('id','selected');\n  }\n  if ($('#nav-tree-contents .item:first').hasClass('selected')) {\n    $('#nav-sync').css('top','30px');\n  } else {\n    $('#nav-sync').css('top','5px');\n  }\n  expandNode(global_navtree_object, n, true, true); // <- we added this line\n  showRoot();\n}\n\n\n$(document).ready(function() {\n  \n  generate_autotoc();\n  \n  (function (){ // wait until the first \"selected\" element has been created\n    try {\n      \n      // this line will triger an exception if there is no #selected element, i.e., before the tree structure is complete.\n      document.getElementById(\"selected\").className = \"item selected\";\n      \n      // ok, the default tree has been created, we can keep going...\n      \n      // expand the \"Chapters\" node\n      if(window.location.href.indexOf('unsupported')==-1)\n        expandNode(global_navtree_object, global_navtree_object.node.children[0].children[2], true, true);\n      else\n        expandNode(global_navtree_object, global_navtree_object.node.children[0].children[1], true, true);\n      \n      // Hide the root node \"Eigen\"\n      $(document.getElementsByClassName('index.html')[0]).parent().parent().css({display:\"none\"});\n      \n    } catch (err) {\n      setTimeout(arguments.callee, 10);\n    }\n  })();\n});\n\n$(window).load(function() {\n  resizeHeight();\n});\n"
  },
  {
    "path": "libs/eigen/doc/eigendoxy.css",
    "content": "\n/******** Eigen specific CSS code ************/\n\n/**** Styles removing elements ****/\n\n/* remove the \"modules|classes\" link for module pages (they are already in the TOC) */\ndiv.summary {\n  display:none;\n}\n\n/* remove */\ndiv.contents hr {\n  display:none;\n}\n\n/**** ****/\n\np, dl.warning, dl.attention, dl.note\n{\n  max-width:60em;\n  text-align:justify;\n}\n\nli {\n  max-width:55em;\n  text-align:justify;  \n}\n\nimg {\n  border: 0;\n}\n\ndiv.fragment {\n  display:table; /* this allows the element to be larger than its parent */\n  padding: 0pt;\n}\npre.fragment {\n  border: 1px solid #cccccc;\n\n  margin: 2px 0px 2px 0px;\n  padding: 3px 5px 3px 5px;\n}\n\n\n\n/* Common style for all Eigen's tables */\n\ntable.example, table.manual, table.manual-vl {\n    max-width:100%;\n    border-collapse: collapse;\n    border-style: solid;\n    border-width: 1px;\n    border-color: #cccccc;\n    font-size: 1em;\n    \n    box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);\n    -moz-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);\n    -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);\n}\n\ntable.example th, table.manual th, table.manual-vl th {\n  padding: 0.5em 0.5em 0.5em 0.5em;\n  text-align: left;\n  padding-right: 1em;\n  color: #555555;\n  background-color: #F4F4E5;\n  \n  background-image: -webkit-gradient(linear,center top,center bottom,from(#FFFFFF), color-stop(0.3,#FFFFFF), color-stop(0.30,#FFFFFF), color-stop(0.98,#F4F4E5), to(#ECECDE));\n  background-image: -moz-linear-gradient(center top, #FFFFFF 0%, #FFFFFF 30%, #F4F4E5 98%, #ECECDE);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFF', endColorstr='#F4F4E5');\n}\n\ntable.example td, table.manual td, table.manual-vl td {\n  vertical-align:top;\n  border-width: 1px;\n  border-color: #cccccc;\n}\n\n/* header of headers */\ntable th.meta {\n  text-align:center;\n  font-size: 1.2em;\n  background-color:#FFFFFF;\n}\n\n/* intermediate header */\ntable th.inter {\n  text-align:left;\n  background-color:#FFFFFF;\n  background-image:none;\n  border-style:solid solid solid solid;\n  border-width: 1px;\n\tborder-color: #cccccc;\n}\n\n/** class for exemple / output tables **/\n\ntable.example {\n}\n\ntable.example th {\n}\n\ntable.example td {\n  padding: 0.5em 0.5em 0.5em 0.5em;\n  vertical-align:top;\n}\n\n/* standard class for the manual */\n\ntable.manual, table.manual-vl {\n    padding: 0.2em 0em 0.5em 0em;\n}\n\ntable.manual th, table.manual-vl th {\n  margin: 0em 0em 0.3em 0em;\n}\n\ntable.manual td, table.manual-vl td {\n  padding: 0.3em 0.5em 0.3em 0.5em;\n  vertical-align:top;\n  border-width: 1px;\n}\n\ntable.manual td.alt, table.manual tr.alt, table.manual-vl td.alt, table.manual-vl tr.alt {\n  background-color: #F4F4E5;\n}\n\ntable.manual-vl th, table.manual-vl td, table.manual-vl td.alt {\n  border-color: #cccccc;\n  border-width: 1px;\n  border-style: none solid none solid;\n}\n\ntable.manual-vl th.inter {\n  border-style: solid solid solid solid;\n}\n\nh2 {\n  margin-top:2em;\n  border-style: none none solid none;\n  border-width: 1px;\n  border-color: #cccccc;\n}\n\n/**** Table of content in the side-nav ****/\n\n\ndiv.toc {\n  margin:0;\n  padding: 0.3em 0 0 0;\n  width:100%;\n  float:none;\n  position:absolute;\n  bottom:0;\n  border-radius:0px;\n  border-style: solid none none none;\n}\n\ndiv.toc h3 {\n  margin-left: 0.5em;\n  margin-bottom: 0.2em;\n}\n\ndiv.toc ul {\n  margin: 0.2em 0 0.4em 0.5em;\n}\n\n/**** old Eigen's styles ****/\n\n\ntable.tutorial_code td {\n  border-color: transparent; /* required for Firefox */\n  padding: 3pt 5pt 3pt 5pt;\n  vertical-align: top;\n}\n\n\n/* Whenever doxygen meets a '\\n' or a '<BR/>', it will put \n * the text containing the characted into a <p class=\"starttd\">.\n * This little hack togehter with table.tutorial_code td.note\n * aims at fixing this issue. */\ntable.tutorial_code td.note p.starttd {\n  margin: 0px;\n  border: none;\n  padding: 0px;\n}\n\ndiv.eimainmenu {\n  text-align:     center;\n}\n\n/* center version number on main page */\nh3.version { \n  text-align:     center;\n}\n\n\ntd.width20em p.endtd {\n  width:  20em;\n}\n\n.bigwarning {\n  font-size:2em;\n  font-weight:bold;\n  margin:1em;\n  padding:1em;\n  color:red;\n  border:solid;\n}\n\n"
  },
  {
    "path": "libs/eigen/doc/eigendoxy_footer.html.in",
    "content": "<!-- start footer part -->\n<!--BEGIN GENERATE_TREEVIEW-->\n<div id=\"nav-path\" class=\"navpath\"><!-- id is needed for treeview function! -->\n  <ul>\n    $navpath\n    <li class=\"footer\">$generatedby\n    <a href=\"http://www.doxygen.org/index.html\">\n    <img class=\"footer\" src=\"$relpath$doxygen.png\" alt=\"doxygen\"/></a> $doxygenversion </li>\n  </ul>\n</div>\n<!--END GENERATE_TREEVIEW-->\n<!--BEGIN !GENERATE_TREEVIEW-->\n<hr class=\"footer\"/><address class=\"footer\"><small>\n$generatedby &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"$relpath$doxygen.png\" alt=\"doxygen\"/>\n</a> $doxygenversion\n</small></address>\n<!--END !GENERATE_TREEVIEW-->\n\n<!-- Piwik -->\n<script type=\"text/javascript\">\nvar pkBaseURL = ((\"https:\" == document.location.protocol) ? \"https://stats.sylphide-consulting.com/piwik/\" : \"http://stats.sylphide-consulting.com/piwik/\");\ndocument.write(unescape(\"%3Cscript src='\" + pkBaseURL + \"piwik.js' type='text/javascript'%3E%3C/script%3E\"));\n</script><script type=\"text/javascript\">\ntry {\nvar piwikTracker = Piwik.getTracker(pkBaseURL + \"piwik.php\", 20);\npiwikTracker.trackPageView();\npiwikTracker.enableLinkTracking();\n} catch( err ) {}\n</script><noscript><p><img src=\"http://stats.sylphide-consulting.com/piwik/piwik.php?idsite=20\" style=\"border:0\" alt=\"\" /></p></noscript>\n<!-- End Piwik Tracking Code -->\n\n</body>\n</html>\n\n\n"
  },
  {
    "path": "libs/eigen/doc/eigendoxy_header.html.in",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen $doxygenversion\"/>\n<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->\n<!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->\n<link href=\"$relpath$tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"$relpath$jquery.js\"></script>\n<script type=\"text/javascript\" src=\"$relpath$dynsections.js\"></script>\n$treeview\n$search\n$mathjax\n<link href=\"$relpath$$stylesheet\"   rel=\"stylesheet\" type=\"text/css\" />\n<link href=\"$relpath$eigendoxy.css\" rel=\"stylesheet\" type=\"text/css\">\n<!-- $extrastylesheet -->\n<script type=\"text/javascript\" src=\"$relpath$eigen_navtree_hacks.js\"></script>\n<!-- <script type=\"text/javascript\"> -->\n<!-- </script> -->\n\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<!-- <a name=\"top\"></a> -->\n\n<!--BEGIN TITLEAREA-->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <!--BEGIN PROJECT_LOGO-->\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"$relpath$$projectlogo\"/></td>\n  <!--END PROJECT_LOGO-->\n  <!--BEGIN PROJECT_NAME-->\n  <td style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\"><a href=\"http://eigen.tuxfamily.org\">$projectname</a>\n   <!--BEGIN PROJECT_NUMBER-->&#160;<span id=\"projectnumber\">$projectnumber</span><!--END PROJECT_NUMBER-->\n   </div>\n   <!--BEGIN PROJECT_BRIEF--><div id=\"projectbrief\">$projectbrief</div><!--END PROJECT_BRIEF-->\n  </td>\n  <!--END PROJECT_NAME-->\n  <!--BEGIN !PROJECT_NAME-->\n   <!--BEGIN PROJECT_BRIEF-->\n    <td style=\"padding-left: 0.5em;\">\n    <div id=\"projectbrief\">$projectbrief</div>\n    </td>\n   <!--END PROJECT_BRIEF-->\n  <!--END !PROJECT_NAME-->\n  <!--BEGIN DISABLE_INDEX-->\n   <!--BEGIN SEARCHENGINE-->\n   <td>$searchbox</td>\n   <!--END SEARCHENGINE-->\n  <!--END DISABLE_INDEX-->\n </tr>\n </tbody>\n</table>\n</div>\n<!--END TITLEAREA-->\n<!-- end header part -->\n\n"
  },
  {
    "path": "libs/eigen/doc/eigendoxy_layout.xml.in",
    "content": "<?xml version=\"1.0\"?>\n<doxygenlayout version=\"1.0\">\n  <!-- Navigation index tabs for HTML output -->\n  <navindex>\n    <tab type=\"user\" url=\"index.html\" title=\"Overview\" />\n    <tab type=\"user\" url=\"@ref GettingStarted\" title=\"Getting started\" />\n    <tab type=\"modules\" visible=\"yes\" title=\"Chapters\" intro=\"\"/>\n    <tab type=\"mainpage\" visible=\"yes\" title=\"\"/>\n    <tab type=\"classlist\" visible=\"yes\" title=\"\" intro=\"\"/>\n<!--     <tab type=\"classmembers\" visible=\"yes\" title=\"\" intro=\"\"/> -->\n  </navindex>\n\n  <!-- Layout definition for a class page -->\n  <class>\n    <briefdescription visible=\"no\"/>\n    <includes visible=\"$SHOW_INCLUDE_FILES\"/>\n    <detaileddescription title=\"\"/>\n    <inheritancegraph visible=\"$CLASS_GRAPH\"/>\n    <collaborationgraph visible=\"$COLLABORATION_GRAPH\"/>\n    <allmemberslink visible=\"yes\"/>\n    <memberdecl>\n      <nestedclasses visible=\"yes\" title=\"\"/>\n      <publictypes title=\"\"/>\n      <publicslots title=\"\"/>\n      <signals title=\"\"/>\n      <publicmethods title=\"\"/>\n      <publicstaticmethods title=\"\"/>\n      <publicattributes title=\"\"/>\n      <publicstaticattributes title=\"\"/>\n      <protectedtypes title=\"\"/>\n      <protectedslots title=\"\"/>\n      <protectedmethods title=\"\"/>\n      <protectedstaticmethods title=\"\"/>\n      <protectedattributes title=\"\"/>\n      <protectedstaticattributes title=\"\"/>\n      <packagetypes title=\"\"/>\n      <packagemethods title=\"\"/>\n      <packagestaticmethods title=\"\"/>\n      <packageattributes title=\"\"/>\n      <packagestaticattributes title=\"\"/>\n      <properties title=\"\"/>\n      <events title=\"\"/>\n      <privatetypes title=\"\"/>\n      <privateslots title=\"\"/>\n      <privatemethods title=\"\"/>\n      <privatestaticmethods title=\"\"/>\n      <privateattributes title=\"\"/>\n      <privatestaticattributes title=\"\"/>\n      <friends title=\"\"/>\n      <related title=\"\" subtitle=\"\"/>\n      <membergroups visible=\"yes\"/>\n    </memberdecl>\n    \n    <memberdef>\n      <inlineclasses title=\"\"/>\n      <typedefs title=\"\"/>\n      <enums title=\"\"/>\n      <constructors title=\"\"/>\n      <functions title=\"\"/>\n      <related title=\"\"/>\n      <variables title=\"\"/>\n      <properties title=\"\"/>\n      <events title=\"\"/>\n    </memberdef>\n    <usedfiles visible=\"$SHOW_USED_FILES\"/>\n    <authorsection visible=\"yes\"/>\n  </class>\n\n  <!-- Layout definition for a namespace page -->\n  <namespace>\n    <briefdescription visible=\"yes\"/>\n    <memberdecl>\n      <nestednamespaces visible=\"yes\" title=\"\"/>\n      <classes visible=\"yes\" title=\"\"/>\n      <typedefs title=\"\"/>\n      <enums title=\"\"/>\n      <functions title=\"\"/>\n      <variables title=\"\"/>\n      <membergroups visible=\"yes\"/>\n    </memberdecl>\n    <detaileddescription title=\"\"/>\n    <memberdef>\n      <inlineclasses title=\"\"/>\n      <typedefs title=\"\"/>\n      <enums title=\"\"/>\n      <functions title=\"\"/>\n      <variables title=\"\"/>\n    </memberdef>\n    <authorsection visible=\"yes\"/>\n  </namespace>\n\n  <!-- Layout definition for a file page -->\n  <file>\n    <briefdescription visible=\"yes\"/>\n    <includes visible=\"$SHOW_INCLUDE_FILES\"/>\n    <includegraph visible=\"$INCLUDE_GRAPH\"/>\n    <includedbygraph visible=\"$INCLUDED_BY_GRAPH\"/>\n    <sourcelink visible=\"yes\"/>\n    <memberdecl>\n      <classes visible=\"yes\" title=\"\"/>\n      <namespaces visible=\"yes\" title=\"\"/>\n      <defines title=\"\"/>\n      <typedefs title=\"\"/>\n      <enums title=\"\"/>\n      <functions title=\"\"/>\n      <variables title=\"\"/>\n      <membergroups visible=\"yes\"/>\n    </memberdecl>\n    <detaileddescription title=\"\"/>\n    <memberdef>\n      <inlineclasses title=\"\"/>\n      <defines title=\"\"/>\n      <typedefs title=\"\"/>\n      <enums title=\"\"/>\n      <functions title=\"\"/>\n      <variables title=\"\"/>\n    </memberdef>\n    <authorsection/>\n  </file>\n\n  <!-- Layout definition for a group page -->\n  <group>\n    <briefdescription visible=\"no\"/>\n    <detaileddescription title=\"\"/>\n    <groupgraph visible=\"$GROUP_GRAPHS\"/>\n    <memberdecl>\n      <nestedgroups visible=\"yes\" title=\"\"/>\n      <dirs visible=\"yes\" title=\"\"/>\n      <files visible=\"yes\" title=\"\"/>\n      <namespaces visible=\"yes\" title=\"\"/>\n      <classes visible=\"yes\" title=\"\"/>\n      <defines title=\"\"/>\n      <typedefs title=\"\"/>\n      <enums title=\"\"/>\n      <enumvalues title=\"\"/>\n      <functions title=\"\"/>\n      <variables title=\"\"/>\n      <signals title=\"\"/>\n      <publicslots title=\"\"/>\n      <protectedslots title=\"\"/>\n      <privateslots title=\"\"/>\n      <events title=\"\"/>\n      <properties title=\"\"/>\n      <friends title=\"\"/>\n      <membergroups visible=\"yes\"/>\n    </memberdecl>\n    \n    <memberdef>\n      <pagedocs/>\n      <inlineclasses title=\"\"/>\n      <defines title=\"\"/>\n      <typedefs title=\"\"/>\n      <enums title=\"\"/>\n      <enumvalues title=\"\"/>\n      <functions title=\"\"/>\n      <variables title=\"\"/>\n      <signals title=\"\"/>\n      <publicslots title=\"\"/>\n      <protectedslots title=\"\"/>\n      <privateslots title=\"\"/>\n      <events title=\"\"/>\n      <properties title=\"\"/>\n      <friends title=\"\"/>\n    </memberdef>\n    <authorsection visible=\"yes\"/>\n  </group>\n\n  <!-- Layout definition for a directory page -->\n  <directory>\n    <briefdescription visible=\"yes\"/>\n    <directorygraph visible=\"yes\"/>\n    <memberdecl>\n      <dirs visible=\"yes\"/>\n      <files visible=\"yes\"/>\n    </memberdecl>\n    <detaileddescription title=\"\"/>\n  </directory>\n</doxygenlayout>\n"
  },
  {
    "path": "libs/eigen/doc/eigendoxy_tabs.css",
    "content": ".tabs, .tabs2, .tabs3 {\n    background-image: url('tab_b.png');\n    width: 100%;\n    z-index: 101;\n    font-size: 13px;\n}\n\n.tabs2 {\n    font-size: 10px;\n}\n.tabs3 {\n    font-size: 9px;\n}\n\n.tablist {\n    margin: 0;\n    padding: 0;\n    display: table;\n}\n\n.tablist li {\n    float: left;\n    display: table-cell;\n    background-image: url('tab_b.png');\n    line-height: 36px;\n    list-style: none;\n}\n\n.tablist a {\n    display: block;\n    padding: 0 20px;\n    font-weight: bold;\n    background-image:url('tab_s.png');\n    background-repeat:no-repeat;\n    background-position:right;\n    color: #283A5D;\n    text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);\n    text-decoration: none;\n    outline: none;\n}\n\n.tabs3 .tablist a {\n    padding: 0 10px;\n}\n\n.tablist a:hover {\n    background-image: url('tab_h.png');\n    background-repeat:repeat-x;\n    color: #fff;\n    text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);\n    text-decoration: none;\n}\n\n.tablist li.current a {\n    background-image: url('tab_a.png');\n    background-repeat:repeat-x;\n    color: #fff;\n    text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/.krazy",
    "content": "EXCLUDE copyright\nEXCLUDE license\n"
  },
  {
    "path": "libs/eigen/doc/examples/CMakeLists.txt",
    "content": "file(GLOB examples_SRCS \"*.cpp\")\n\nforeach(example_src ${examples_SRCS})\n  get_filename_component(example ${example_src} NAME_WE)\n  add_executable(${example} ${example_src})\n  if(EIGEN_STANDARD_LIBRARIES_TO_LINK_TO)\n    target_link_libraries(${example} ${EIGEN_STANDARD_LIBRARIES_TO_LINK_TO})\n  endif()\n  add_custom_command(\n    TARGET ${example}\n    POST_BUILD\n    COMMAND ${example}\n    ARGS >${CMAKE_CURRENT_BINARY_DIR}/${example}.out\n  )\n  add_dependencies(all_examples ${example})\nendforeach(example_src)\n"
  },
  {
    "path": "libs/eigen/doc/examples/DenseBase_middleCols_int.cpp",
    "content": "#include <Eigen/Core>\n#include <iostream>\n\nusing namespace Eigen;\nusing namespace std;\n\nint main(void)\n{\n    int const N = 5;\n    MatrixXi A(N,N);\n    A.setRandom();\n    cout << \"A =\\n\" << A << '\\n' << endl;\n    cout << \"A(1..3,:) =\\n\" << A.middleCols(1,3) << endl;\n    return 0;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/DenseBase_middleRows_int.cpp",
    "content": "#include <Eigen/Core>\n#include <iostream>\n\nusing namespace Eigen;\nusing namespace std;\n\nint main(void)\n{\n    int const N = 5;\n    MatrixXi A(N,N);\n    A.setRandom();\n    cout << \"A =\\n\" << A << '\\n' << endl;\n    cout << \"A(2..3,:) =\\n\" << A.middleRows(2,2) << endl;\n    return 0;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/DenseBase_template_int_middleCols.cpp",
    "content": "#include <Eigen/Core>\n#include <iostream>\n\nusing namespace Eigen;\nusing namespace std;\n\nint main(void)\n{\n    int const N = 5;\n    MatrixXi A(N,N);\n    A.setRandom();\n    cout << \"A =\\n\" << A << '\\n' << endl;\n    cout << \"A(:,1..3) =\\n\" << A.middleCols<3>(1) << endl;\n    return 0;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/DenseBase_template_int_middleRows.cpp",
    "content": "#include <Eigen/Core>\n#include <iostream>\n\nusing namespace Eigen;\nusing namespace std;\n\nint main(void)\n{\n    int const N = 5;\n    MatrixXi A(N,N);\n    A.setRandom();\n    cout << \"A =\\n\" << A << '\\n' << endl;\n    cout << \"A(1..3,:) =\\n\" << A.middleRows<3>(1) << endl;\n    return 0;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/MatrixBase_cwise_const.cpp",
    "content": "#define EIGEN2_SUPPORT\n#include <Eigen/Core>\n#include <iostream>\n\nusing namespace Eigen;\nusing namespace std;\n\nint main()\n{\n  Matrix3i m = Matrix3i::Random();\n  cout << \"Here is the matrix m:\" << endl << m << endl;\n  Matrix3i n = Matrix3i::Random();\n  cout << \"And here is the matrix n:\" << endl << n << endl;\n  cout << \"The coefficient-wise product of m and n is:\" << endl;\n  cout << m.cwise() * n << endl;\n  cout << \"Taking the cube of the coefficients of m yields:\" << endl;\n  cout << m.cwise().pow(3) << endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/QuickStart_example.cpp",
    "content": "#include <iostream>\n#include <Eigen/Dense>\n\nusing Eigen::MatrixXd;\n\nint main()\n{\n  MatrixXd m(2,2);\n  m(0,0) = 3;\n  m(1,0) = 2.5;\n  m(0,1) = -1;\n  m(1,1) = m(1,0) + m(0,1);\n  std::cout << m << std::endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/QuickStart_example2_dynamic.cpp",
    "content": "#include <iostream>\n#include <Eigen/Dense>\n\nusing namespace Eigen;\nusing namespace std;\n\nint main()\n{\n  MatrixXd m = MatrixXd::Random(3,3);\n  m = (m + MatrixXd::Constant(3,3,1.2)) * 50;\n  cout << \"m =\" << endl << m << endl;\n  VectorXd v(3);\n  v << 1, 2, 3;\n  cout << \"m * v =\" << endl << m * v << endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/QuickStart_example2_fixed.cpp",
    "content": "#include <iostream>\n#include <Eigen/Dense>\n\nusing namespace Eigen;\nusing namespace std;\n\nint main()\n{\n  Matrix3d m = Matrix3d::Random();\n  m = (m + Matrix3d::Constant(1.2)) * 50;\n  cout << \"m =\" << endl << m << endl;\n  Vector3d v(1,2,3);\n  \n  cout << \"m * v =\" << endl << m * v << endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/TemplateKeyword_flexible.cpp",
    "content": "#include <Eigen/Dense>\n#include <iostream>\n\nusing namespace Eigen;\n\ntemplate <typename Derived1, typename Derived2>\nvoid copyUpperTriangularPart(MatrixBase<Derived1>& dst, const MatrixBase<Derived2>& src)\n{\n  /* Note the 'template' keywords in the following line! */\n  dst.template triangularView<Upper>() = src.template triangularView<Upper>();\n}\n\nint main()\n{\n  MatrixXi m1 = MatrixXi::Ones(5,5);\n  MatrixXi m2 = MatrixXi::Random(4,4);\n  std::cout << \"m2 before copy:\" << std::endl;\n  std::cout << m2 << std::endl << std::endl;\n  copyUpperTriangularPart(m2, m1.topLeftCorner(4,4));\n  std::cout << \"m2 after copy:\" << std::endl;\n  std::cout << m2 << std::endl << std::endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/TemplateKeyword_simple.cpp",
    "content": "#include <Eigen/Dense>\n#include <iostream>\n\nusing namespace Eigen;\n\nvoid copyUpperTriangularPart(MatrixXf& dst, const MatrixXf& src)\n{\n  dst.triangularView<Upper>() = src.triangularView<Upper>();\n}\n\nint main()\n{\n  MatrixXf m1 = MatrixXf::Ones(4,4);\n  MatrixXf m2 = MatrixXf::Random(4,4);\n  std::cout << \"m2 before copy:\" << std::endl;\n  std::cout << m2 << std::endl << std::endl;\n  copyUpperTriangularPart(m2, m1);\n  std::cout << \"m2 after copy:\" << std::endl;\n  std::cout << m2 << std::endl << std::endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/TutorialLinAlgComputeTwice.cpp",
    "content": "#include <iostream>\n#include <Eigen/Dense>\n\nusing namespace std;\nusing namespace Eigen;\n\nint main()\n{\n   Matrix2f A, b;\n   LLT<Matrix2f> llt;\n   A << 2, -1, -1, 3;\n   b << 1, 2, 3, 1;\n   cout << \"Here is the matrix A:\\n\" << A << endl;\n   cout << \"Here is the right hand side b:\\n\" << b << endl;\n   cout << \"Computing LLT decomposition...\" << endl;\n   llt.compute(A);\n   cout << \"The solution is:\\n\" << llt.solve(b) << endl;\n   A(1,1)++;\n   cout << \"The matrix A is now:\\n\" << A << endl;\n   cout << \"Computing LLT decomposition...\" << endl;\n   llt.compute(A);\n   cout << \"The solution is now:\\n\" << llt.solve(b) << endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/TutorialLinAlgExComputeSolveError.cpp",
    "content": "#include <iostream>\n#include <Eigen/Dense>\n\nusing namespace std;\nusing namespace Eigen;\n\nint main()\n{\n   MatrixXd A = MatrixXd::Random(100,100);\n   MatrixXd b = MatrixXd::Random(100,50);\n   MatrixXd x = A.fullPivLu().solve(b);\n   double relative_error = (A*x - b).norm() / b.norm(); // norm() is L2 norm\n   cout << \"The relative error is:\\n\" << relative_error << endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/TutorialLinAlgExSolveColPivHouseholderQR.cpp",
    "content": "#include <iostream>\n#include <Eigen/Dense>\n\nusing namespace std;\nusing namespace Eigen;\n\nint main()\n{\n   Matrix3f A;\n   Vector3f b;\n   A << 1,2,3,  4,5,6,  7,8,10;\n   b << 3, 3, 4;\n   cout << \"Here is the matrix A:\\n\" << A << endl;\n   cout << \"Here is the vector b:\\n\" << b << endl;\n   Vector3f x = A.colPivHouseholderQr().solve(b);\n   cout << \"The solution is:\\n\" << x << endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/TutorialLinAlgExSolveLDLT.cpp",
    "content": "#include <iostream>\n#include <Eigen/Dense>\n\nusing namespace std;\nusing namespace Eigen;\n\nint main()\n{\n   Matrix2f A, b;\n   A << 2, -1, -1, 3;\n   b << 1, 2, 3, 1;\n   cout << \"Here is the matrix A:\\n\" << A << endl;\n   cout << \"Here is the right hand side b:\\n\" << b << endl;\n   Matrix2f x = A.ldlt().solve(b);\n   cout << \"The solution is:\\n\" << x << endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/TutorialLinAlgInverseDeterminant.cpp",
    "content": "#include <iostream>\n#include <Eigen/Dense>\n\nusing namespace std;\nusing namespace Eigen;\n\nint main()\n{\n   Matrix3f A;\n   A << 1, 2, 1,\n        2, 1, 0,\n        -1, 1, 2;\n   cout << \"Here is the matrix A:\\n\" << A << endl;\n   cout << \"The determinant of A is \" << A.determinant() << endl;\n   cout << \"The inverse of A is:\\n\" << A.inverse() << endl;\n}"
  },
  {
    "path": "libs/eigen/doc/examples/TutorialLinAlgRankRevealing.cpp",
    "content": "#include <iostream>\n#include <Eigen/Dense>\n\nusing namespace std;\nusing namespace Eigen;\n\nint main()\n{\n   Matrix3f A;\n   A << 1, 2, 5,\n        2, 1, 4,\n        3, 0, 3;\n   cout << \"Here is the matrix A:\\n\" << A << endl;\n   FullPivLU<Matrix3f> lu_decomp(A);\n   cout << \"The rank of A is \" << lu_decomp.rank() << endl;\n   cout << \"Here is a matrix whose columns form a basis of the null-space of A:\\n\"\n        << lu_decomp.kernel() << endl;\n   cout << \"Here is a matrix whose columns form a basis of the column-space of A:\\n\"\n        << lu_decomp.image(A) << endl; // yes, have to pass the original A\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/TutorialLinAlgSVDSolve.cpp",
    "content": "#include <iostream>\n#include <Eigen/Dense>\n\nusing namespace std;\nusing namespace Eigen;\n\nint main()\n{\n   MatrixXf A = MatrixXf::Random(3, 2);\n   cout << \"Here is the matrix A:\\n\" << A << endl;\n   VectorXf b = VectorXf::Random(3);\n   cout << \"Here is the right hand side b:\\n\" << b << endl;\n   cout << \"The least-squares solution is:\\n\"\n        << A.jacobiSvd(ComputeThinU | ComputeThinV).solve(b) << endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/TutorialLinAlgSelfAdjointEigenSolver.cpp",
    "content": "#include <iostream>\n#include <Eigen/Dense>\n\nusing namespace std;\nusing namespace Eigen;\n\nint main()\n{\n   Matrix2f A;\n   A << 1, 2, 2, 3;\n   cout << \"Here is the matrix A:\\n\" << A << endl;\n   SelfAdjointEigenSolver<Matrix2f> eigensolver(A);\n   if (eigensolver.info() != Success) abort();\n   cout << \"The eigenvalues of A are:\\n\" << eigensolver.eigenvalues() << endl;\n   cout << \"Here's a matrix whose columns are eigenvectors of A \\n\"\n        << \"corresponding to these eigenvalues:\\n\"\n        << eigensolver.eigenvectors() << endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/TutorialLinAlgSetThreshold.cpp",
    "content": "#include <iostream>\n#include <Eigen/Dense>\n\nusing namespace std;\nusing namespace Eigen;\n\nint main()\n{\n   Matrix2d A;\n   A << 2, 1,\n        2, 0.9999999999;\n   FullPivLU<Matrix2d> lu(A);\n   cout << \"By default, the rank of A is found to be \" << lu.rank() << endl;\n   lu.setThreshold(1e-5);\n   cout << \"With threshold 1e-5, the rank of A is found to be \" << lu.rank() << endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/Tutorial_ArrayClass_accessors.cpp",
    "content": "#include <Eigen/Dense>\n#include <iostream>\n\nusing namespace Eigen;\nusing namespace std;\n\nint main()\n{\n  ArrayXXf  m(2,2);\n  \n  // assign some values coefficient by coefficient\n  m(0,0) = 1.0; m(0,1) = 2.0;\n  m(1,0) = 3.0; m(1,1) = m(0,1) + m(1,0);\n  \n  // print values to standard output\n  cout << m << endl << endl;\n \n  // using the comma-initializer is also allowed\n  m << 1.0,2.0,\n       3.0,4.0;\n     \n  // print values to standard output\n  cout << m << endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/Tutorial_ArrayClass_addition.cpp",
    "content": "#include <Eigen/Dense>\n#include <iostream>\n\nusing namespace Eigen;\nusing namespace std;\n\nint main()\n{\n  ArrayXXf a(3,3);\n  ArrayXXf b(3,3);\n  a << 1,2,3,\n       4,5,6,\n       7,8,9;\n  b << 1,2,3,\n       1,2,3,\n       1,2,3;\n       \n  // Adding two arrays\n  cout << \"a + b = \" << endl << a + b << endl << endl;\n\n  // Subtracting a scalar from an array\n  cout << \"a - 2 = \" << endl << a - 2 << endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/Tutorial_ArrayClass_cwise_other.cpp",
    "content": "#include <Eigen/Dense>\n#include <iostream>\n\nusing namespace Eigen;\nusing namespace std;\n\nint main()\n{\n  ArrayXf a = ArrayXf::Random(5);\n  a *= 2;\n  cout << \"a =\" << endl \n       << a << endl;\n  cout << \"a.abs() =\" << endl \n       << a.abs() << endl;\n  cout << \"a.abs().sqrt() =\" << endl \n       << a.abs().sqrt() << endl;\n  cout << \"a.min(a.abs().sqrt()) =\" << endl \n       << a.min(a.abs().sqrt()) << endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/Tutorial_ArrayClass_interop.cpp",
    "content": "#include <Eigen/Dense>\n#include <iostream>\n\nusing namespace Eigen;\nusing namespace std;\n\nint main()\n{\n  MatrixXf m(2,2);\n  MatrixXf n(2,2);\n  MatrixXf result(2,2);\n\n  m << 1,2,\n       3,4;\n  n << 5,6,\n       7,8;\n  \n  result = (m.array() + 4).matrix() * m;\n  cout << \"-- Combination 1: --\" << endl << result << endl << endl;\n  result = (m.array() * n.array()).matrix() * m;\n  cout << \"-- Combination 2: --\" << endl << result << endl << endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/Tutorial_ArrayClass_interop_matrix.cpp",
    "content": "#include <Eigen/Dense>\n#include <iostream>\n\nusing namespace Eigen;\nusing namespace std;\n\nint main()\n{\n  MatrixXf m(2,2);\n  MatrixXf n(2,2);\n  MatrixXf result(2,2);\n\n  m << 1,2,\n       3,4;\n  n << 5,6,\n       7,8;\n\n  result = m * n;\n  cout << \"-- Matrix m*n: --\" << endl << result << endl << endl;\n  result = m.array() * n.array();\n  cout << \"-- Array m*n: --\" << endl << result << endl << endl;\n  result = m.cwiseProduct(n);\n  cout << \"-- With cwiseProduct: --\" << endl << result << endl << endl;\n  result = m.array() + 4;\n  cout << \"-- Array m + 4: --\" << endl << result << endl << endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/Tutorial_ArrayClass_mult.cpp",
    "content": "#include <Eigen/Dense>\n#include <iostream>\n\nusing namespace Eigen;\nusing namespace std;\n\nint main()\n{\n  ArrayXXf a(2,2);\n  ArrayXXf b(2,2);\n  a << 1,2,\n       3,4;\n  b << 5,6,\n       7,8;\n  cout << \"a * b = \" << endl << a * b << endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/Tutorial_BlockOperations_block_assignment.cpp",
    "content": "#include <Eigen/Dense>\n#include <iostream>\n\nusing namespace std;\nusing namespace Eigen;\n\nint main()\n{\n  Array22f m;\n  m << 1,2,\n       3,4;\n  Array44f a = Array44f::Constant(0.6);\n  cout << \"Here is the array a:\" << endl << a << endl << endl;\n  a.block<2,2>(1,1) = m;\n  cout << \"Here is now a with m copied into its central 2x2 block:\" << endl << a << endl << endl;\n  a.block(0,0,2,3) = a.block(2,1,2,3);\n  cout << \"Here is now a with bottom-right 2x3 block copied into top-left 2x2 block:\" << endl << a << endl << endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/Tutorial_BlockOperations_colrow.cpp",
    "content": "#include <Eigen/Dense>\n#include <iostream>\n\nusing namespace std;\n\nint main()\n{\n  Eigen::MatrixXf m(3,3);\n  m << 1,2,3,\n       4,5,6,\n       7,8,9;\n  cout << \"Here is the matrix m:\" << endl << m << endl;\n  cout << \"2nd Row: \" << m.row(1) << endl;\n  m.col(2) += 3 * m.col(0);\n  cout << \"After adding 3 times the first column into the third column, the matrix m is:\\n\";\n  cout << m << endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/Tutorial_BlockOperations_corner.cpp",
    "content": "#include <Eigen/Dense>\n#include <iostream>\n\nusing namespace std;\n\nint main()\n{\n  Eigen::Matrix4f m;\n  m << 1, 2, 3, 4,\n       5, 6, 7, 8,\n       9, 10,11,12,\n       13,14,15,16;\n  cout << \"m.leftCols(2) =\" << endl << m.leftCols(2) << endl << endl;\n  cout << \"m.bottomRows<2>() =\" << endl << m.bottomRows<2>() << endl << endl;\n  m.topLeftCorner(1,3) = m.bottomRightCorner(3,1).transpose();\n  cout << \"After assignment, m = \" << endl << m << endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/Tutorial_BlockOperations_print_block.cpp",
    "content": "#include <Eigen/Dense>\n#include <iostream>\n\nusing namespace std;\n\nint main()\n{\n  Eigen::MatrixXf m(4,4);\n  m <<  1, 2, 3, 4,\n        5, 6, 7, 8,\n        9,10,11,12,\n       13,14,15,16;\n  cout << \"Block in the middle\" << endl;\n  cout << m.block<2,2>(1,1) << endl << endl;\n  for (int i = 1; i <= 3; ++i)\n  {\n    cout << \"Block of size \" << i << \"x\" << i << endl;\n    cout << m.block(0,0,i,i) << endl << endl;\n  }\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/Tutorial_BlockOperations_vector.cpp",
    "content": "#include <Eigen/Dense>\n#include <iostream>\n\nusing namespace std;\n\nint main()\n{\n  Eigen::ArrayXf v(6);\n  v << 1, 2, 3, 4, 5, 6;\n  cout << \"v.head(3) =\" << endl << v.head(3) << endl << endl;\n  cout << \"v.tail<3>() = \" << endl << v.tail<3>() << endl << endl;\n  v.segment(1,4) *= 2;\n  cout << \"after 'v.segment(1,4) *= 2', v =\" << endl << v << endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/Tutorial_PartialLU_solve.cpp",
    "content": "#include <Eigen/Core>\n#include <Eigen/LU>\n#include <iostream>\n\nusing namespace std;\nusing namespace Eigen;\n\nint main()\n{\n   Matrix3f A;\n   Vector3f b;\n   A << 1,2,3,  4,5,6,  7,8,10;\n   b << 3, 3, 4;\n   cout << \"Here is the matrix A:\" << endl << A << endl;\n   cout << \"Here is the vector b:\" << endl << b << endl;\n   Vector3f x = A.lu().solve(b);\n   cout << \"The solution is:\" << endl << x << endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_broadcast_1nn.cpp",
    "content": "#include <iostream>\n#include <Eigen/Dense>\n\nusing namespace std;\nusing namespace Eigen;\n\nint main()\n{\n  Eigen::MatrixXf m(2,4);\n  Eigen::VectorXf v(2);\n  \n  m << 1, 23, 6, 9,\n       3, 11, 7, 2;\n       \n  v << 2,\n       3;\n\n  MatrixXf::Index index;\n  // find nearest neighbour\n  (m.colwise() - v).colwise().squaredNorm().minCoeff(&index);\n\n  cout << \"Nearest neighbour is column \" << index << \":\" << endl;\n  cout << m.col(index) << endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_broadcast_simple.cpp",
    "content": "#include <iostream>\n#include <Eigen/Dense>\n\nusing namespace std;\nint main()\n{\n  Eigen::MatrixXf mat(2,4);\n  Eigen::VectorXf v(2);\n  \n  mat << 1, 2, 6, 9,\n         3, 1, 7, 2;\n         \n  v << 0,\n       1;\n       \n  //add v to each column of m\n  mat.colwise() += v;\n  \n  std::cout << \"Broadcasting result: \" << std::endl;\n  std::cout << mat << std::endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_broadcast_simple_rowwise.cpp",
    "content": "#include <iostream>\n#include <Eigen/Dense>\n\nusing namespace std;\nint main()\n{\n  Eigen::MatrixXf mat(2,4);\n  Eigen::VectorXf v(4);\n  \n  mat << 1, 2, 6, 9,\n         3, 1, 7, 2;\n         \n  v << 0,1,2,3;\n       \n  //add v to each row of m\n  mat.rowwise() += v.transpose();\n  \n  std::cout << \"Broadcasting result: \" << std::endl;\n  std::cout << mat << std::endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_colwise.cpp",
    "content": "#include <iostream>\n#include <Eigen/Dense>\n\nusing namespace std;\nint main()\n{\n  Eigen::MatrixXf mat(2,4);\n  mat << 1, 2, 6, 9,\n         3, 1, 7, 2;\n  \n  std::cout << \"Column's maximum: \" << std::endl\n   << mat.colwise().maxCoeff() << std::endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_maxnorm.cpp",
    "content": "#include <iostream>\n#include <Eigen/Dense>\n\nusing namespace std;\nusing namespace Eigen;\nint main()\n{\n  MatrixXf mat(2,4);\n  mat << 1, 2, 6, 9,\n         3, 1, 7, 2;\n  \n  MatrixXf::Index   maxIndex;\n  float maxNorm = mat.colwise().sum().maxCoeff(&maxIndex);\n  \n  std::cout << \"Maximum sum at position \" << maxIndex << std::endl;\n\n  std::cout << \"The corresponding vector is: \" << std::endl;\n  std::cout << mat.col( maxIndex ) << std::endl;\n  std::cout << \"And its sum is is: \" << maxNorm << std::endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_reductions_bool.cpp",
    "content": "#include <Eigen/Dense>\n#include <iostream>\n\nusing namespace std;\nusing namespace Eigen;\n\nint main()\n{\n  ArrayXXf a(2,2);\n  \n  a << 1,2,\n       3,4;\n\n  cout << \"(a > 0).all()   = \" << (a > 0).all() << endl;\n  cout << \"(a > 0).any()   = \" << (a > 0).any() << endl;\n  cout << \"(a > 0).count() = \" << (a > 0).count() << endl;\n  cout << endl;\n  cout << \"(a > 2).all()   = \" << (a > 2).all() << endl;\n  cout << \"(a > 2).any()   = \" << (a > 2).any() << endl;\n  cout << \"(a > 2).count() = \" << (a > 2).count() << endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_reductions_norm.cpp",
    "content": "#include <Eigen/Dense>\n#include <iostream>\n\nusing namespace std;\nusing namespace Eigen;\n\nint main()\n{\n  VectorXf v(2);\n  MatrixXf m(2,2), n(2,2);\n  \n  v << -1,\n       2;\n  \n  m << 1,-2,\n       -3,4;\n\n  cout << \"v.squaredNorm() = \" << v.squaredNorm() << endl;\n  cout << \"v.norm() = \" << v.norm() << endl;\n  cout << \"v.lpNorm<1>() = \" << v.lpNorm<1>() << endl;\n  cout << \"v.lpNorm<Infinity>() = \" << v.lpNorm<Infinity>() << endl;\n\n  cout << endl;\n  cout << \"m.squaredNorm() = \" << m.squaredNorm() << endl;\n  cout << \"m.norm() = \" << m.norm() << endl;\n  cout << \"m.lpNorm<1>() = \" << m.lpNorm<1>() << endl;\n  cout << \"m.lpNorm<Infinity>() = \" << m.lpNorm<Infinity>() << endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_rowwise.cpp",
    "content": "#include <iostream>\n#include <Eigen/Dense>\n\nusing namespace std;\nint main()\n{\n  Eigen::MatrixXf mat(2,4);\n  mat << 1, 2, 6, 9,\n         3, 1, 7, 2;\n  \n  std::cout << \"Row's maximum: \" << std::endl\n   << mat.rowwise().maxCoeff() << std::endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_visitors.cpp",
    "content": "#include <iostream>\n#include <Eigen/Dense>\n\nusing namespace std;\nusing namespace Eigen;\n\nint main()\n{\n  Eigen::MatrixXf m(2,2);\n  \n  m << 1, 2,\n       3, 4;\n\n  //get location of maximum\n  MatrixXf::Index maxRow, maxCol;\n  float max = m.maxCoeff(&maxRow, &maxCol);\n\n  //get location of minimum\n  MatrixXf::Index minRow, minCol;\n  float min = m.minCoeff(&minRow, &minCol);\n\n  cout << \"Max: \" << max <<  \", at: \" <<\n     maxRow << \",\" << maxCol << endl;\n  cout << \"Min: \" << min << \", at: \" <<\n     minRow << \",\" << minCol << endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/Tutorial_simple_example_dynamic_size.cpp",
    "content": "#include <Eigen/Core>\n#include <iostream>\n\nusing namespace Eigen;\n\nint main()\n{\n  for (int size=1; size<=4; ++size)\n  {\n    MatrixXi m(size,size+1);         // a (size)x(size+1)-matrix of int's\n    for (int j=0; j<m.cols(); ++j)   // loop over columns\n      for (int i=0; i<m.rows(); ++i) // loop over rows\n        m(i,j) = i+j*m.rows();       // to access matrix coefficients,\n                                     // use operator()(int,int)\n    std::cout << m << \"\\n\\n\";\n  }\n\n  VectorXf v(4); // a vector of 4 float's\n  // to access vector coefficients, use either operator () or operator []\n  v[0] = 1; v[1] = 2; v(2) = 3; v(3) = 4;\n  std::cout << \"\\nv:\\n\" << v << std::endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/Tutorial_simple_example_fixed_size.cpp",
    "content": "#include <Eigen/Core>\n#include <iostream>\n\nusing namespace Eigen;\n\nint main()\n{\n  Matrix3f m3;\n  m3 << 1, 2, 3, 4, 5, 6, 7, 8, 9;\n  Matrix4f m4 = Matrix4f::Identity();\n  Vector4i v4(1, 2, 3, 4);\n\n  std::cout << \"m3\\n\" << m3 << \"\\nm4:\\n\"\n    << m4 << \"\\nv4:\\n\" << v4 << std::endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/class_Block.cpp",
    "content": "#include <Eigen/Core>\n#include <iostream>\nusing namespace Eigen;\nusing namespace std;\n\ntemplate<typename Derived>\nEigen::Block<Derived>\ntopLeftCorner(MatrixBase<Derived>& m, int rows, int cols)\n{\n  return Eigen::Block<Derived>(m.derived(), 0, 0, rows, cols);\n}\n\ntemplate<typename Derived>\nconst Eigen::Block<const Derived>\ntopLeftCorner(const MatrixBase<Derived>& m, int rows, int cols)\n{\n  return Eigen::Block<const Derived>(m.derived(), 0, 0, rows, cols);\n}\n\nint main(int, char**)\n{\n  Matrix4d m = Matrix4d::Identity();\n  cout << topLeftCorner(4*m, 2, 3) << endl; // calls the const version\n  topLeftCorner(m, 2, 3) *= 5;              // calls the non-const version\n  cout << \"Now the matrix m is:\" << endl << m << endl;\n  return 0;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/class_CwiseBinaryOp.cpp",
    "content": "#include <Eigen/Core>\n#include <iostream>\nusing namespace Eigen;\nusing namespace std;\n\n// define a custom template binary functor\ntemplate<typename Scalar> struct MakeComplexOp {\n  EIGEN_EMPTY_STRUCT_CTOR(MakeComplexOp)\n  typedef complex<Scalar> result_type;\n  complex<Scalar> operator()(const Scalar& a, const Scalar& b) const { return complex<Scalar>(a,b); }\n};\n\nint main(int, char**)\n{\n  Matrix4d m1 = Matrix4d::Random(), m2 = Matrix4d::Random();\n  cout << m1.binaryExpr(m2, MakeComplexOp<double>()) << endl;\n  return 0;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/class_CwiseUnaryOp.cpp",
    "content": "#include <Eigen/Core>\n#include <iostream>\nusing namespace Eigen;\nusing namespace std;\n\n// define a custom template unary functor\ntemplate<typename Scalar>\nstruct CwiseClampOp {\n  CwiseClampOp(const Scalar& inf, const Scalar& sup) : m_inf(inf), m_sup(sup) {}\n  const Scalar operator()(const Scalar& x) const { return x<m_inf ? m_inf : (x>m_sup ? m_sup : x); }\n  Scalar m_inf, m_sup;\n};\n\nint main(int, char**)\n{\n  Matrix4d m1 = Matrix4d::Random();\n  cout << m1 << endl << \"becomes: \" << endl << m1.unaryExpr(CwiseClampOp<double>(-0.5,0.5)) << endl;\n  return 0;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/class_CwiseUnaryOp_ptrfun.cpp",
    "content": "#include <Eigen/Core>\n#include <iostream>\nusing namespace Eigen;\nusing namespace std;\n\n// define function to be applied coefficient-wise\ndouble ramp(double x)\n{\n  if (x > 0)\n    return x;\n  else \n    return 0;\n}\n\nint main(int, char**)\n{\n  Matrix4d m1 = Matrix4d::Random();\n  cout << m1 << endl << \"becomes: \" << endl << m1.unaryExpr(ptr_fun(ramp)) << endl;\n  return 0;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/class_FixedBlock.cpp",
    "content": "#include <Eigen/Core>\n#include <iostream>\nusing namespace Eigen;\nusing namespace std;\n\ntemplate<typename Derived>\nEigen::Block<Derived, 2, 2>\ntopLeft2x2Corner(MatrixBase<Derived>& m)\n{\n  return Eigen::Block<Derived, 2, 2>(m.derived(), 0, 0);\n}\n\ntemplate<typename Derived>\nconst Eigen::Block<const Derived, 2, 2>\ntopLeft2x2Corner(const MatrixBase<Derived>& m)\n{\n  return Eigen::Block<const Derived, 2, 2>(m.derived(), 0, 0);\n}\n\nint main(int, char**)\n{\n  Matrix3d m = Matrix3d::Identity();\n  cout << topLeft2x2Corner(4*m) << endl; // calls the const version\n  topLeft2x2Corner(m) *= 2;              // calls the non-const version\n  cout << \"Now the matrix m is:\" << endl << m << endl;\n  return 0;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/class_FixedVectorBlock.cpp",
    "content": "#include <Eigen/Core>\n#include <iostream>\nusing namespace Eigen;\nusing namespace std;\n\ntemplate<typename Derived>\nEigen::VectorBlock<Derived, 2>\nfirstTwo(MatrixBase<Derived>& v)\n{\n  return Eigen::VectorBlock<Derived, 2>(v.derived(), 0);\n}\n\ntemplate<typename Derived>\nconst Eigen::VectorBlock<const Derived, 2>\nfirstTwo(const MatrixBase<Derived>& v)\n{\n  return Eigen::VectorBlock<const Derived, 2>(v.derived(), 0);\n}\n\nint main(int, char**)\n{\n  Matrix<int,1,6> v; v << 1,2,3,4,5,6;\n  cout << firstTwo(4*v) << endl; // calls the const version\n  firstTwo(v) *= 2;              // calls the non-const version\n  cout << \"Now the vector v is:\" << endl << v << endl;\n  return 0;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/class_VectorBlock.cpp",
    "content": "#include <Eigen/Core>\n#include <iostream>\nusing namespace Eigen;\nusing namespace std;\n\ntemplate<typename Derived>\nEigen::VectorBlock<Derived>\nsegmentFromRange(MatrixBase<Derived>& v, int start, int end)\n{\n  return Eigen::VectorBlock<Derived>(v.derived(), start, end-start);\n}\n\ntemplate<typename Derived>\nconst Eigen::VectorBlock<const Derived>\nsegmentFromRange(const MatrixBase<Derived>& v, int start, int end)\n{\n  return Eigen::VectorBlock<const Derived>(v.derived(), start, end-start);\n}\n\nint main(int, char**)\n{\n  Matrix<int,1,6> v; v << 1,2,3,4,5,6;\n  cout << segmentFromRange(2*v, 2, 4) << endl; // calls the const version\n  segmentFromRange(v, 1, 3) *= 5;              // calls the non-const version\n  cout << \"Now the vector v is:\" << endl << v << endl;\n  return 0;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/function_taking_eigenbase.cpp",
    "content": "#include <iostream>\n#include <Eigen/Core>\nusing namespace Eigen;\n\ntemplate <typename Derived>\nvoid print_size(const EigenBase<Derived>& b)\n{\n  std::cout << \"size (rows, cols): \" << b.size() << \" (\" << b.rows()\n            << \", \" << b.cols() << \")\" << std::endl;\n}\n\nint main()\n{\n    Vector3f v;\n    print_size(v);\n    // v.asDiagonal() returns a 3x3 diagonal matrix pseudo-expression\n    print_size(v.asDiagonal());\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/function_taking_ref.cpp",
    "content": "#include <iostream>\n#include <Eigen/SVD>\nusing namespace Eigen;\nusing namespace std;\n\nfloat inv_cond(const Ref<const MatrixXf>& a)\n{\n  const VectorXf sing_vals = a.jacobiSvd().singularValues();\n  return sing_vals(sing_vals.size()-1) / sing_vals(0);\n}\n\nint main()\n{\n  Matrix4f m = Matrix4f::Random();\n  cout << \"matrix m:\" << endl << m << endl << endl;\n  cout << \"inv_cond(m):          \" << inv_cond(m)                      << endl;\n  cout << \"inv_cond(m(1:3,1:3)): \" << inv_cond(m.topLeftCorner(3,3))   << endl;\n  cout << \"inv_cond(m+I):        \" << inv_cond(m+Matrix4f::Identity()) << endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/matrixfree_cg.cpp",
    "content": "#include <iostream>\n#include <Eigen/Core>\n#include <Eigen/Dense>\n#include <Eigen/IterativeLinearSolvers>\n\nclass MatrixReplacement;\ntemplate<typename Rhs> class MatrixReplacement_ProductReturnType;\n\nnamespace Eigen {\nnamespace internal {\n  template<>\n  struct traits<MatrixReplacement> :  Eigen::internal::traits<Eigen::SparseMatrix<double> >\n  {};\n\n  template <typename Rhs>\n  struct traits<MatrixReplacement_ProductReturnType<Rhs> > {\n    // The equivalent plain objet type of the product. This type is used if the product needs to be evaluated into a temporary.\n    typedef Eigen::Matrix<typename Rhs::Scalar, Eigen::Dynamic, Rhs::ColsAtCompileTime> ReturnType;\n  };\n}\n}\n\n// Inheriting EigenBase should not be needed in the future.\nclass MatrixReplacement : public Eigen::EigenBase<MatrixReplacement> {\npublic:\n  // Expose some compile-time information to Eigen:\n  typedef double Scalar;\n  typedef double RealScalar;\n  enum {\n    ColsAtCompileTime = Eigen::Dynamic,\n    RowsAtCompileTime = Eigen::Dynamic,\n    MaxColsAtCompileTime = Eigen::Dynamic,\n    MaxRowsAtCompileTime = Eigen::Dynamic\n  };\n\n  Index rows() const { return 4; }\n  Index cols() const { return 4; }\n\n  void resize(Index a_rows, Index a_cols)\n  {\n    // This method should not be needed in the future.\n    assert(a_rows==0 && a_cols==0 || a_rows==rows() && a_cols==cols());\n  }\n\n  // In the future, the return type should be Eigen::Product<MatrixReplacement,Rhs>\n  template<typename Rhs>\n  MatrixReplacement_ProductReturnType<Rhs> operator*(const Eigen::MatrixBase<Rhs>& x) const {\n    return MatrixReplacement_ProductReturnType<Rhs>(*this, x.derived());\n  }\n\n};\n\n// The proxy class representing the product of a MatrixReplacement with a MatrixBase<>\ntemplate<typename Rhs>\nclass MatrixReplacement_ProductReturnType : public Eigen::ReturnByValue<MatrixReplacement_ProductReturnType<Rhs> > {\npublic:\n  typedef MatrixReplacement::Index Index;\n  \n  // The ctor store references to the matrix and right-hand-side object (usually a vector).\n  MatrixReplacement_ProductReturnType(const MatrixReplacement& matrix, const Rhs& rhs)\n    : m_matrix(matrix), m_rhs(rhs)\n  {}\n  \n  Index rows() const { return m_matrix.rows(); }\n  Index cols() const { return m_rhs.cols(); }\n\n  // This function is automatically called by Eigen. It must evaluate the product of matrix * rhs into y.\n  template<typename Dest>\n  void evalTo(Dest& y) const\n  {\n    y.setZero(4);\n\n    y(0) += 2 * m_rhs(0); y(1) += 1 * m_rhs(0);\n    y(0) += 1 * m_rhs(1); y(1) += 2 * m_rhs(1); y(2) += 1 * m_rhs(1);\n    y(1) += 1 * m_rhs(2); y(2) += 2 * m_rhs(2); y(3) += 1 * m_rhs(2);\n    y(2) += 1 * m_rhs(3); y(3) += 2 * m_rhs(3);\n  }\n\nprotected:\n  const MatrixReplacement& m_matrix;\n  typename Rhs::Nested m_rhs;\n};\n\n\n/*****/\n\n// This class simply warp a diagonal matrix as a Jacobi preconditioner.\n// In the future such simple and generic wrapper should be shipped within Eigen itsel.\ntemplate <typename _Scalar>\nclass MyJacobiPreconditioner\n{\n    typedef _Scalar Scalar;\n    typedef Eigen::Matrix<Scalar,Eigen::Dynamic,1> Vector;\n    typedef typename Vector::Index Index;\n\n  public:\n    // this typedef is only to export the scalar type and compile-time dimensions to solve_retval\n    typedef Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic> MatrixType;\n\n    MyJacobiPreconditioner() : m_isInitialized(false) {}\n\n    void setInvDiag(const Eigen::VectorXd &invdiag) {\n      m_invdiag=invdiag;\n      m_isInitialized=true;\n    }\n\n    Index rows() const { return m_invdiag.size(); }\n    Index cols() const { return m_invdiag.size(); }\n    \n    template<typename MatType>\n    MyJacobiPreconditioner& analyzePattern(const MatType& ) { return *this; }\n    \n    template<typename MatType>\n    MyJacobiPreconditioner& factorize(const MatType& mat) { return *this; }\n    \n    template<typename MatType>\n    MyJacobiPreconditioner& compute(const MatType& mat) { return *this; }\n\n    template<typename Rhs, typename Dest>\n    void _solve(const Rhs& b, Dest& x) const\n    {\n      x = m_invdiag.array() * b.array() ;\n    }\n\n    template<typename Rhs> inline const Eigen::internal::solve_retval<MyJacobiPreconditioner, Rhs>\n    solve(const Eigen::MatrixBase<Rhs>& b) const\n    {\n      eigen_assert(m_isInitialized && \"MyJacobiPreconditioner is not initialized.\");\n      eigen_assert(m_invdiag.size()==b.rows()\n                && \"MyJacobiPreconditioner::solve(): invalid number of rows of the right hand side matrix b\");\n      return Eigen::internal::solve_retval<MyJacobiPreconditioner, Rhs>(*this, b.derived());\n    }\n\n  protected:\n    Vector m_invdiag;\n    bool m_isInitialized;\n};\n\nnamespace Eigen {\nnamespace internal {\n\ntemplate<typename _MatrixType, typename Rhs>\nstruct solve_retval<MyJacobiPreconditioner<_MatrixType>, Rhs>\n  : solve_retval_base<MyJacobiPreconditioner<_MatrixType>, Rhs>\n{\n  typedef MyJacobiPreconditioner<_MatrixType> Dec;\n  EIGEN_MAKE_SOLVE_HELPERS(Dec,Rhs)\n\n  template<typename Dest> void evalTo(Dest& dst) const\n  {\n    dec()._solve(rhs(),dst);\n  }\n};\n\n}\n}\n\n\n/*****/\n\n\nint main()\n{\n  MatrixReplacement A;\n  Eigen::VectorXd b(4), x;\n  b << 1, 1, 1, 1;\n\n  // solve Ax = b using CG with matrix-free version:\n  Eigen::ConjugateGradient < MatrixReplacement, Eigen::Lower|Eigen::Upper, MyJacobiPreconditioner<double> > cg;\n\n  Eigen::VectorXd invdiag(4);\n  invdiag << 1./3., 1./4., 1./4., 1./3.;\n\n  cg.preconditioner().setInvDiag(invdiag);\n  cg.compute(A);\n  x = cg.solve(b);\n\n  std::cout << \"#iterations: \" << cg.iterations() << std::endl;\n  std::cout << \"estimated error: \" << cg.error() << std::endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/tut_arithmetic_add_sub.cpp",
    "content": "#include <iostream>\n#include <Eigen/Dense>\n\nusing namespace Eigen;\n\nint main()\n{\n  Matrix2d a;\n  a << 1, 2,\n       3, 4;\n  MatrixXd b(2,2);\n  b << 2, 3,\n       1, 4;\n  std::cout << \"a + b =\\n\" << a + b << std::endl;\n  std::cout << \"a - b =\\n\" << a - b << std::endl;\n  std::cout << \"Doing a += b;\" << std::endl;\n  a += b;\n  std::cout << \"Now a =\\n\" << a << std::endl;\n  Vector3d v(1,2,3);\n  Vector3d w(1,0,0);\n  std::cout << \"-v + w - v =\\n\" << -v + w - v << std::endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/tut_arithmetic_dot_cross.cpp",
    "content": "#include <iostream>\n#include <Eigen/Dense>\n\nusing namespace Eigen;\nusing namespace std;\nint main()\n{\n  Vector3d v(1,2,3);\n  Vector3d w(0,1,2);\n\n  cout << \"Dot product: \" << v.dot(w) << endl;\n  double dp = v.adjoint()*w; // automatic conversion of the inner product to a scalar\n  cout << \"Dot product via a matrix product: \" << dp << endl;\n  cout << \"Cross product:\\n\" << v.cross(w) << endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/tut_arithmetic_matrix_mul.cpp",
    "content": "#include <iostream>\n#include <Eigen/Dense>\n\nusing namespace Eigen;\nint main()\n{\n  Matrix2d mat;\n  mat << 1, 2,\n         3, 4;\n  Vector2d u(-1,1), v(2,0);\n  std::cout << \"Here is mat*mat:\\n\" << mat*mat << std::endl;\n  std::cout << \"Here is mat*u:\\n\" << mat*u << std::endl;\n  std::cout << \"Here is u^T*mat:\\n\" << u.transpose()*mat << std::endl;\n  std::cout << \"Here is u^T*v:\\n\" << u.transpose()*v << std::endl;\n  std::cout << \"Here is u*v^T:\\n\" << u*v.transpose() << std::endl;\n  std::cout << \"Let's multiply mat by itself\" << std::endl;\n  mat = mat*mat;\n  std::cout << \"Now mat is mat:\\n\" << mat << std::endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/tut_arithmetic_redux_basic.cpp",
    "content": "#include <iostream>\n#include <Eigen/Dense>\n\nusing namespace std;\nint main()\n{\n  Eigen::Matrix2d mat;\n  mat << 1, 2,\n         3, 4;\n  cout << \"Here is mat.sum():       \" << mat.sum()       << endl;\n  cout << \"Here is mat.prod():      \" << mat.prod()      << endl;\n  cout << \"Here is mat.mean():      \" << mat.mean()      << endl;\n  cout << \"Here is mat.minCoeff():  \" << mat.minCoeff()  << endl;\n  cout << \"Here is mat.maxCoeff():  \" << mat.maxCoeff()  << endl;\n  cout << \"Here is mat.trace():     \" << mat.trace()     << endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/tut_arithmetic_scalar_mul_div.cpp",
    "content": "#include <iostream>\n#include <Eigen/Dense>\n\nusing namespace Eigen;\n\nint main()\n{\n  Matrix2d a;\n  a << 1, 2,\n       3, 4;\n  Vector3d v(1,2,3);\n  std::cout << \"a * 2.5 =\\n\" << a * 2.5 << std::endl;\n  std::cout << \"0.1 * v =\\n\" << 0.1 * v << std::endl;\n  std::cout << \"Doing v *= 2;\" << std::endl;\n  v *= 2;\n  std::cout << \"Now v =\\n\" << v << std::endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/tut_matrix_coefficient_accessors.cpp",
    "content": "#include <iostream>\n#include <Eigen/Dense>\n\nusing namespace Eigen;\n\nint main()\n{\n  MatrixXd m(2,2);\n  m(0,0) = 3;\n  m(1,0) = 2.5;\n  m(0,1) = -1;\n  m(1,1) = m(1,0) + m(0,1);\n  std::cout << \"Here is the matrix m:\\n\" << m << std::endl;\n  VectorXd v(2);\n  v(0) = 4;\n  v(1) = v(0) - 1;\n  std::cout << \"Here is the vector v:\\n\" << v << std::endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/tut_matrix_resize.cpp",
    "content": "#include <iostream>\n#include <Eigen/Dense>\n\nusing namespace Eigen;\n\nint main()\n{\n  MatrixXd m(2,5);\n  m.resize(4,3);\n  std::cout << \"The matrix m is of size \"\n            << m.rows() << \"x\" << m.cols() << std::endl;\n  std::cout << \"It has \" << m.size() << \" coefficients\" << std::endl;\n  VectorXd v(2);\n  v.resize(5);\n  std::cout << \"The vector v is of size \" << v.size() << std::endl;\n  std::cout << \"As a matrix, v is of size \"\n            << v.rows() << \"x\" << v.cols() << std::endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/examples/tut_matrix_resize_fixed_size.cpp",
    "content": "#include <iostream>\n#include <Eigen/Dense>\n\nusing namespace Eigen;\n\nint main()\n{\n  Matrix4d m;\n  m.resize(4,4); // no operation\n  std::cout << \"The matrix m is of size \"\n            << m.rows() << \"x\" << m.cols() << std::endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/snippets/.krazy",
    "content": "EXCLUDE copyright\nEXCLUDE license\n"
  },
  {
    "path": "libs/eigen/doc/snippets/AngleAxis_mimic_euler.cpp",
    "content": "Matrix3f m;\nm = AngleAxisf(0.25*M_PI, Vector3f::UnitX())\n  * AngleAxisf(0.5*M_PI,  Vector3f::UnitY())\n  * AngleAxisf(0.33*M_PI, Vector3f::UnitZ());\ncout << m << endl << \"is unitary: \" << m.isUnitary() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/CMakeLists.txt",
    "content": "file(GLOB snippets_SRCS \"*.cpp\")\n\nadd_custom_target(all_snippets)\n\nforeach(snippet_src ${snippets_SRCS})\n  get_filename_component(snippet ${snippet_src} NAME_WE)\n  set(compile_snippet_target compile_${snippet})\n  set(compile_snippet_src ${compile_snippet_target}.cpp)\n  file(READ ${snippet_src} snippet_source_code)\n  configure_file(${CMAKE_CURRENT_SOURCE_DIR}/compile_snippet.cpp.in\n                 ${CMAKE_CURRENT_BINARY_DIR}/${compile_snippet_src})\n  add_executable(${compile_snippet_target}\n                 ${CMAKE_CURRENT_BINARY_DIR}/${compile_snippet_src})\n  if(EIGEN_STANDARD_LIBRARIES_TO_LINK_TO)\n    target_link_libraries(${compile_snippet_target} ${EIGEN_STANDARD_LIBRARIES_TO_LINK_TO})\n  endif()\n  add_custom_command(\n    TARGET ${compile_snippet_target}\n    POST_BUILD\n    COMMAND ${compile_snippet_target}\n    ARGS >${CMAKE_CURRENT_BINARY_DIR}/${snippet}.out\n  )\n  add_dependencies(all_snippets ${compile_snippet_target})\n  set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/${compile_snippet_src}\n                              PROPERTIES OBJECT_DEPENDS ${snippet_src})\nendforeach(snippet_src)\n\nei_add_target_property(compile_tut_arithmetic_transpose_aliasing COMPILE_FLAGS -DEIGEN_NO_DEBUG)\n"
  },
  {
    "path": "libs/eigen/doc/snippets/ColPivHouseholderQR_solve.cpp",
    "content": "Matrix3f m = Matrix3f::Random();\nMatrix3f y = Matrix3f::Random();\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"Here is the matrix y:\" << endl << y << endl;\nMatrix3f x;\nx = m.colPivHouseholderQr().solve(y);\nassert(y.isApprox(m*x));\ncout << \"Here is a solution x to the equation mx=y:\" << endl << x << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/ComplexEigenSolver_compute.cpp",
    "content": "MatrixXcf A = MatrixXcf::Random(4,4);\ncout << \"Here is a random 4x4 matrix, A:\" << endl << A << endl << endl;\n\nComplexEigenSolver<MatrixXcf> ces;\nces.compute(A);\ncout << \"The eigenvalues of A are:\" << endl << ces.eigenvalues() << endl;\ncout << \"The matrix of eigenvectors, V, is:\" << endl << ces.eigenvectors() << endl << endl;\n\ncomplex<float> lambda = ces.eigenvalues()[0];\ncout << \"Consider the first eigenvalue, lambda = \" << lambda << endl;\nVectorXcf v = ces.eigenvectors().col(0);\ncout << \"If v is the corresponding eigenvector, then lambda * v = \" << endl << lambda * v << endl;\ncout << \"... and A * v = \" << endl << A * v << endl << endl;\n\ncout << \"Finally, V * D * V^(-1) = \" << endl\n     << ces.eigenvectors() * ces.eigenvalues().asDiagonal() * ces.eigenvectors().inverse() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/ComplexEigenSolver_eigenvalues.cpp",
    "content": "MatrixXcf ones = MatrixXcf::Ones(3,3);\nComplexEigenSolver<MatrixXcf> ces(ones, /* computeEigenvectors = */ false);\ncout << \"The eigenvalues of the 3x3 matrix of ones are:\" \n     << endl << ces.eigenvalues() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/ComplexEigenSolver_eigenvectors.cpp",
    "content": "MatrixXcf ones = MatrixXcf::Ones(3,3);\nComplexEigenSolver<MatrixXcf> ces(ones);\ncout << \"The first eigenvector of the 3x3 matrix of ones is:\" \n     << endl << ces.eigenvectors().col(1) << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/ComplexSchur_compute.cpp",
    "content": "MatrixXcf A = MatrixXcf::Random(4,4);\nComplexSchur<MatrixXcf> schur(4);\nschur.compute(A);\ncout << \"The matrix T in the decomposition of A is:\" << endl << schur.matrixT() << endl;\nschur.compute(A.inverse());\ncout << \"The matrix T in the decomposition of A^(-1) is:\" << endl << schur.matrixT() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/ComplexSchur_matrixT.cpp",
    "content": "MatrixXcf A = MatrixXcf::Random(4,4);\ncout << \"Here is a random 4x4 matrix, A:\" << endl << A << endl << endl;\nComplexSchur<MatrixXcf> schurOfA(A, false); // false means do not compute U\ncout << \"The triangular matrix T is:\" << endl << schurOfA.matrixT() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/ComplexSchur_matrixU.cpp",
    "content": "MatrixXcf A = MatrixXcf::Random(4,4);\ncout << \"Here is a random 4x4 matrix, A:\" << endl << A << endl << endl;\nComplexSchur<MatrixXcf> schurOfA(A);\ncout << \"The unitary matrix U is:\" << endl << schurOfA.matrixU() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Cwise_abs.cpp",
    "content": "Array3d v(1,-2,-3);\ncout << v.abs() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Cwise_abs2.cpp",
    "content": "Array3d v(1,-2,-3);\ncout << v.abs2() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Cwise_acos.cpp",
    "content": "Array3d v(0, sqrt(2.)/2, 1);\ncout << v.acos() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Cwise_asin.cpp",
    "content": "Array3d v(0, sqrt(2.)/2, 1);\ncout << v.asin() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Cwise_boolean_and.cpp",
    "content": "Array3d v(-1,2,1), w(-3,2,3);\ncout << ((v<w) && (v<0)) << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Cwise_boolean_or.cpp",
    "content": "Array3d v(-1,2,1), w(-3,2,3);\ncout << ((v<w) || (v<0)) << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Cwise_cos.cpp",
    "content": "Array3d v(M_PI, M_PI/2, M_PI/3);\ncout << v.cos() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Cwise_cube.cpp",
    "content": "Array3d v(2,3,4);\ncout << v.cube() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Cwise_equal_equal.cpp",
    "content": "Array3d v(1,2,3), w(3,2,1);\ncout << (v==w) << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Cwise_exp.cpp",
    "content": "Array3d v(1,2,3);\ncout << v.exp() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Cwise_greater.cpp",
    "content": "Array3d v(1,2,3), w(3,2,1);\ncout << (v>w) << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Cwise_greater_equal.cpp",
    "content": "Array3d v(1,2,3), w(3,2,1);\ncout << (v>=w) << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Cwise_inverse.cpp",
    "content": "Array3d v(2,3,4);\ncout << v.inverse() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Cwise_less.cpp",
    "content": "Array3d v(1,2,3), w(3,2,1);\ncout << (v<w) << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Cwise_less_equal.cpp",
    "content": "Array3d v(1,2,3), w(3,2,1);\ncout << (v<=w) << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Cwise_log.cpp",
    "content": "Array3d v(1,2,3);\ncout << v.log() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Cwise_max.cpp",
    "content": "Array3d v(2,3,4), w(4,2,3);\ncout << v.max(w) << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Cwise_min.cpp",
    "content": "Array3d v(2,3,4), w(4,2,3);\ncout << v.min(w) << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Cwise_minus.cpp",
    "content": "Array3d v(1,2,3);\ncout << v-5 << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Cwise_minus_equal.cpp",
    "content": "Array3d v(1,2,3);\nv -= 5;\ncout << v << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Cwise_not_equal.cpp",
    "content": "Array3d v(1,2,3), w(3,2,1);\ncout << (v!=w) << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Cwise_plus.cpp",
    "content": "Array3d v(1,2,3);\ncout << v+5 << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Cwise_plus_equal.cpp",
    "content": "Array3d v(1,2,3);\nv += 5;\ncout << v << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Cwise_pow.cpp",
    "content": "Array3d v(8,27,64);\ncout << v.pow(0.333333) << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Cwise_product.cpp",
    "content": "Array33i a = Array33i::Random(), b = Array33i::Random();\nArray33i c = a * b;\ncout << \"a:\\n\" << a << \"\\nb:\\n\" << b << \"\\nc:\\n\" << c << endl;\n\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Cwise_quotient.cpp",
    "content": "Array3d v(2,3,4), w(4,2,3);\ncout << v/w << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Cwise_sin.cpp",
    "content": "Array3d v(M_PI, M_PI/2, M_PI/3);\ncout << v.sin() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Cwise_slash_equal.cpp",
    "content": "Array3d v(3,2,4), w(5,4,2);\nv /= w;\ncout << v << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Cwise_sqrt.cpp",
    "content": "Array3d v(1,2,4);\ncout << v.sqrt() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Cwise_square.cpp",
    "content": "Array3d v(2,3,4);\ncout << v.square() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Cwise_tan.cpp",
    "content": "Array3d v(M_PI, M_PI/2, M_PI/3);\ncout << v.tan() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Cwise_times_equal.cpp",
    "content": "Array3d v(1,2,3), w(2,3,0);\nv *= w;\ncout << v << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/DenseBase_LinSpaced.cpp",
    "content": "cout << VectorXi::LinSpaced(4,7,10).transpose() << endl;\ncout << VectorXd::LinSpaced(5,0.0,1.0).transpose() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/DenseBase_LinSpaced_seq.cpp",
    "content": "cout << VectorXi::LinSpaced(Sequential,4,7,10).transpose() << endl;\ncout << VectorXd::LinSpaced(Sequential,5,0.0,1.0).transpose() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/DenseBase_setLinSpaced.cpp",
    "content": "VectorXf v;\nv.setLinSpaced(5,0.5f,1.5f);\ncout << v << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/DirectionWise_replicate.cpp",
    "content": "MatrixXi m = MatrixXi::Random(2,3);\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"m.colwise().replicate<3>() = ...\" << endl;\ncout << m.colwise().replicate<3>() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/DirectionWise_replicate_int.cpp",
    "content": "Vector3i v = Vector3i::Random();\ncout << \"Here is the vector v:\" << endl << v << endl;\ncout << \"v.rowwise().replicate(5) = ...\" << endl;\ncout << v.rowwise().replicate(5) << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/EigenSolver_EigenSolver_MatrixType.cpp",
    "content": "MatrixXd A = MatrixXd::Random(6,6);\ncout << \"Here is a random 6x6 matrix, A:\" << endl << A << endl << endl;\n\nEigenSolver<MatrixXd> es(A);\ncout << \"The eigenvalues of A are:\" << endl << es.eigenvalues() << endl;\ncout << \"The matrix of eigenvectors, V, is:\" << endl << es.eigenvectors() << endl << endl;\n\ncomplex<double> lambda = es.eigenvalues()[0];\ncout << \"Consider the first eigenvalue, lambda = \" << lambda << endl;\nVectorXcd v = es.eigenvectors().col(0);\ncout << \"If v is the corresponding eigenvector, then lambda * v = \" << endl << lambda * v << endl;\ncout << \"... and A * v = \" << endl << A.cast<complex<double> >() * v << endl << endl;\n\nMatrixXcd D = es.eigenvalues().asDiagonal();\nMatrixXcd V = es.eigenvectors();\ncout << \"Finally, V * D * V^(-1) = \" << endl << V * D * V.inverse() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/EigenSolver_compute.cpp",
    "content": "EigenSolver<MatrixXf> es;\nMatrixXf A = MatrixXf::Random(4,4);\nes.compute(A, /* computeEigenvectors = */ false);\ncout << \"The eigenvalues of A are: \" << es.eigenvalues().transpose() << endl;\nes.compute(A + MatrixXf::Identity(4,4), false); // re-use es to compute eigenvalues of A+I\ncout << \"The eigenvalues of A+I are: \" << es.eigenvalues().transpose() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/EigenSolver_eigenvalues.cpp",
    "content": "MatrixXd ones = MatrixXd::Ones(3,3);\nEigenSolver<MatrixXd> es(ones, false);\ncout << \"The eigenvalues of the 3x3 matrix of ones are:\" \n     << endl << es.eigenvalues() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/EigenSolver_eigenvectors.cpp",
    "content": "MatrixXd ones = MatrixXd::Ones(3,3);\nEigenSolver<MatrixXd> es(ones);\ncout << \"The first eigenvector of the 3x3 matrix of ones is:\" \n     << endl << es.eigenvectors().col(1) << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/EigenSolver_pseudoEigenvectors.cpp",
    "content": "MatrixXd A = MatrixXd::Random(6,6);\ncout << \"Here is a random 6x6 matrix, A:\" << endl << A << endl << endl;\n\nEigenSolver<MatrixXd> es(A);\nMatrixXd D = es.pseudoEigenvalueMatrix();\nMatrixXd V = es.pseudoEigenvectors();\ncout << \"The pseudo-eigenvalue matrix D is:\" << endl << D << endl;\ncout << \"The pseudo-eigenvector matrix V is:\" << endl << V << endl;\ncout << \"Finally, V * D * V^(-1) = \" << endl << V * D * V.inverse() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/FullPivHouseholderQR_solve.cpp",
    "content": "Matrix3f m = Matrix3f::Random();\nMatrix3f y = Matrix3f::Random();\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"Here is the matrix y:\" << endl << y << endl;\nMatrix3f x;\nx = m.fullPivHouseholderQr().solve(y);\nassert(y.isApprox(m*x));\ncout << \"Here is a solution x to the equation mx=y:\" << endl << x << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/FullPivLU_image.cpp",
    "content": "Matrix3d m;\nm << 1,1,0,\n     1,3,2,\n     0,1,1;\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"Notice that the middle column is the sum of the two others, so the \"\n     << \"columns are linearly dependent.\" << endl;\ncout << \"Here is a matrix whose columns have the same span but are linearly independent:\"\n     << endl << m.fullPivLu().image(m) << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/FullPivLU_kernel.cpp",
    "content": "MatrixXf m = MatrixXf::Random(3,5);\ncout << \"Here is the matrix m:\" << endl << m << endl;\nMatrixXf ker = m.fullPivLu().kernel();\ncout << \"Here is a matrix whose columns form a basis of the kernel of m:\"\n     << endl << ker << endl;\ncout << \"By definition of the kernel, m*ker is zero:\"\n     << endl << m*ker << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/FullPivLU_solve.cpp",
    "content": "Matrix<float,2,3> m = Matrix<float,2,3>::Random();\nMatrix2f y = Matrix2f::Random();\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"Here is the matrix y:\" << endl << y << endl;\nMatrix<float,3,2> x = m.fullPivLu().solve(y);\nif((m*x).isApprox(y))\n{\n  cout << \"Here is a solution x to the equation mx=y:\" << endl << x << endl;\n}\nelse\n  cout << \"The equation mx=y does not have any solution.\" << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/GeneralizedEigenSolver.cpp",
    "content": "GeneralizedEigenSolver<MatrixXf> ges;\nMatrixXf A = MatrixXf::Random(4,4);\nMatrixXf B = MatrixXf::Random(4,4);\nges.compute(A, B);\ncout << \"The (complex) numerators of the generalzied eigenvalues are: \" << ges.alphas().transpose() << endl;\ncout << \"The (real) denominatore of the generalzied eigenvalues are: \" << ges.betas().transpose() << endl;\ncout << \"The (complex) generalzied eigenvalues are (alphas./beta): \" << ges.eigenvalues().transpose() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/HessenbergDecomposition_compute.cpp",
    "content": "MatrixXcf A = MatrixXcf::Random(4,4);\nHessenbergDecomposition<MatrixXcf> hd(4);\nhd.compute(A);\ncout << \"The matrix H in the decomposition of A is:\" << endl << hd.matrixH() << endl;\nhd.compute(2*A); // re-use hd to compute and store decomposition of 2A\ncout << \"The matrix H in the decomposition of 2A is:\" << endl << hd.matrixH() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/HessenbergDecomposition_matrixH.cpp",
    "content": "Matrix4f A = MatrixXf::Random(4,4);\ncout << \"Here is a random 4x4 matrix:\" << endl << A << endl;\nHessenbergDecomposition<MatrixXf> hessOfA(A);\nMatrixXf H = hessOfA.matrixH();\ncout << \"The Hessenberg matrix H is:\" << endl << H << endl;\nMatrixXf Q = hessOfA.matrixQ();\ncout << \"The orthogonal matrix Q is:\" << endl << Q << endl;\ncout << \"Q H Q^T is:\" << endl << Q * H * Q.transpose() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/HessenbergDecomposition_packedMatrix.cpp",
    "content": "Matrix4d A = Matrix4d::Random(4,4);\ncout << \"Here is a random 4x4 matrix:\" << endl << A << endl;\nHessenbergDecomposition<Matrix4d> hessOfA(A);\nMatrix4d pm = hessOfA.packedMatrix();\ncout << \"The packed matrix M is:\" << endl << pm << endl;\ncout << \"The upper Hessenberg part corresponds to the matrix H, which is:\" \n     << endl << hessOfA.matrixH() << endl;\nVector3d hc = hessOfA.householderCoefficients();\ncout << \"The vector of Householder coefficients is:\" << endl << hc << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/HouseholderQR_householderQ.cpp",
    "content": "MatrixXf A(MatrixXf::Random(5,3)), thinQ(MatrixXf::Identity(5,3)), Q;\nA.setRandom();\nHouseholderQR<MatrixXf> qr(A);\nQ = qr.householderQ();\nthinQ = qr.householderQ() * thinQ;\nstd::cout << \"The complete unitary matrix Q is:\\n\" << Q << \"\\n\\n\";\nstd::cout << \"The thin matrix Q is:\\n\" << thinQ << \"\\n\\n\";\n"
  },
  {
    "path": "libs/eigen/doc/snippets/HouseholderQR_solve.cpp",
    "content": "typedef Matrix<float,3,3> Matrix3x3;\nMatrix3x3 m = Matrix3x3::Random();\nMatrix3f y = Matrix3f::Random();\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"Here is the matrix y:\" << endl << y << endl;\nMatrix3f x;\nx = m.householderQr().solve(y);\nassert(y.isApprox(m*x));\ncout << \"Here is a solution x to the equation mx=y:\" << endl << x << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/HouseholderSequence_HouseholderSequence.cpp",
    "content": "Matrix3d v = Matrix3d::Random();\ncout << \"The matrix v is:\" << endl;\ncout << v << endl;\n\nVector3d v0(1, v(1,0), v(2,0));\ncout << \"The first Householder vector is: v_0 = \" << v0.transpose() << endl;\nVector3d v1(0, 1, v(2,1));\ncout << \"The second Householder vector is: v_1 = \" << v1.transpose()  << endl;\nVector3d v2(0, 0, 1);\ncout << \"The third Householder vector is: v_2 = \" << v2.transpose() << endl;\n\nVector3d h = Vector3d::Random();\ncout << \"The Householder coefficients are: h = \" << h.transpose() << endl;\n\nMatrix3d H0 = Matrix3d::Identity() - h(0) * v0 * v0.adjoint();\ncout << \"The first Householder reflection is represented by H_0 = \" << endl;\ncout << H0 << endl;\nMatrix3d H1 = Matrix3d::Identity() - h(1) * v1 * v1.adjoint();\ncout << \"The second Householder reflection is represented by H_1 = \" << endl;\ncout << H1 << endl;\nMatrix3d H2 = Matrix3d::Identity() - h(2) * v2 * v2.adjoint();\ncout << \"The third Householder reflection is represented by H_2 = \" << endl;\ncout << H2 << endl;\ncout << \"Their product is H_0 H_1 H_2 = \" << endl;\ncout << H0 * H1 * H2 << endl;\n\nHouseholderSequence<Matrix3d, Vector3d> hhSeq(v, h);\nMatrix3d hhSeqAsMatrix(hhSeq);\ncout << \"If we construct a HouseholderSequence from v and h\" << endl;\ncout << \"and convert it to a matrix, we get:\" << endl;\ncout << hhSeqAsMatrix << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/IOFormat.cpp",
    "content": "std::string sep = \"\\n----------------------------------------\\n\";\nMatrix3d m1;\nm1 << 1.111111, 2, 3.33333, 4, 5, 6, 7, 8.888888, 9;\n\nIOFormat CommaInitFmt(StreamPrecision, DontAlignCols, \", \", \", \", \"\", \"\", \" << \", \";\");\nIOFormat CleanFmt(4, 0, \", \", \"\\n\", \"[\", \"]\");\nIOFormat OctaveFmt(StreamPrecision, 0, \", \", \";\\n\", \"\", \"\", \"[\", \"]\");\nIOFormat HeavyFmt(FullPrecision, 0, \", \", \";\\n\", \"[\", \"]\", \"[\", \"]\");\n\nstd::cout << m1 << sep;\nstd::cout << m1.format(CommaInitFmt) << sep;\nstd::cout << m1.format(CleanFmt) << sep;\nstd::cout << m1.format(OctaveFmt) << sep;\nstd::cout << m1.format(HeavyFmt) << sep;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/JacobiSVD_basic.cpp",
    "content": "MatrixXf m = MatrixXf::Random(3,2);\ncout << \"Here is the matrix m:\" << endl << m << endl;\nJacobiSVD<MatrixXf> svd(m, ComputeThinU | ComputeThinV);\ncout << \"Its singular values are:\" << endl << svd.singularValues() << endl;\ncout << \"Its left singular vectors are the columns of the thin U matrix:\" << endl << svd.matrixU() << endl;\ncout << \"Its right singular vectors are the columns of the thin V matrix:\" << endl << svd.matrixV() << endl;\nVector3f rhs(1, 0, 0);\ncout << \"Now consider this rhs vector:\" << endl << rhs << endl;\ncout << \"A least-squares solution of m*x = rhs is:\" << endl << svd.solve(rhs) << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Jacobi_makeGivens.cpp",
    "content": "Vector2f v = Vector2f::Random();\nJacobiRotation<float> G;\nG.makeGivens(v.x(), v.y());\ncout << \"Here is the vector v:\" << endl << v << endl;\nv.applyOnTheLeft(0, 1, G.adjoint());\ncout << \"Here is the vector J' * v:\" << endl << v << endl;"
  },
  {
    "path": "libs/eigen/doc/snippets/Jacobi_makeJacobi.cpp",
    "content": "Matrix2f m = Matrix2f::Random();\nm = (m + m.adjoint()).eval();\nJacobiRotation<float> J;\nJ.makeJacobi(m, 0, 1);\ncout << \"Here is the matrix m:\" << endl << m << endl;\nm.applyOnTheLeft(0, 1, J.adjoint());\nm.applyOnTheRight(0, 1, J);\ncout << \"Here is the matrix J' * m * J:\" << endl << m << endl;"
  },
  {
    "path": "libs/eigen/doc/snippets/LLT_example.cpp",
    "content": "MatrixXd A(3,3);\nA << 4,-1,2, -1,6,0, 2,0,5;\ncout << \"The matrix A is\" << endl << A << endl;\n\nLLT<MatrixXd> lltOfA(A); // compute the Cholesky decomposition of A\nMatrixXd L = lltOfA.matrixL(); // retrieve factor L  in the decomposition\n// The previous two lines can also be written as \"L = A.llt().matrixL()\"\n\ncout << \"The Cholesky factor L is\" << endl << L << endl;\ncout << \"To check this, let us compute L * L.transpose()\" << endl;\ncout << L * L.transpose() << endl;\ncout << \"This should equal the matrix A\" << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/LLT_solve.cpp",
    "content": "typedef Matrix<float,Dynamic,2> DataMatrix;\n// let's generate some samples on the 3D plane of equation z = 2x+3y (with some noise)\nDataMatrix samples = DataMatrix::Random(12,2);\nVectorXf elevations = 2*samples.col(0) + 3*samples.col(1) + VectorXf::Random(12)*0.1;\n// and let's solve samples * [x y]^T = elevations in least square sense:\nMatrix<float,2,1> xy\n = (samples.adjoint() * samples).llt().solve((samples.adjoint()*elevations));\ncout << xy << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Map_general_stride.cpp",
    "content": "int array[24];\nfor(int i = 0; i < 24; ++i) array[i] = i;\ncout << Map<MatrixXi, 0, Stride<Dynamic,2> >\n         (array, 3, 3, Stride<Dynamic,2>(8, 2))\n     << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Map_inner_stride.cpp",
    "content": "int array[12];\nfor(int i = 0; i < 12; ++i) array[i] = i;\ncout << Map<VectorXi, 0, InnerStride<2> >\n         (array, 6) // the inner stride has already been passed as template parameter\n     << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Map_outer_stride.cpp",
    "content": "int array[12];\nfor(int i = 0; i < 12; ++i) array[i] = i;\ncout << Map<MatrixXi, 0, OuterStride<> >(array, 3, 3, OuterStride<>(4)) << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Map_placement_new.cpp",
    "content": "int data[] = {1,2,3,4,5,6,7,8,9};\nMap<RowVectorXi> v(data,4);\ncout << \"The mapped vector v is: \" << v << \"\\n\";\nnew (&v) Map<RowVectorXi>(data+4,5);\ncout << \"Now v is: \" << v << \"\\n\";"
  },
  {
    "path": "libs/eigen/doc/snippets/Map_simple.cpp",
    "content": "int array[9];\nfor(int i = 0; i < 9; ++i) array[i] = i;\ncout << Map<Matrix3i>(array) << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_adjoint.cpp",
    "content": "Matrix2cf m = Matrix2cf::Random();\ncout << \"Here is the 2x2 complex matrix m:\" << endl << m << endl;\ncout << \"Here is the adjoint of m:\" << endl << m.adjoint() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_all.cpp",
    "content": "Vector3f boxMin(Vector3f::Zero()), boxMax(Vector3f::Ones());\nVector3f p0 = Vector3f::Random(), p1 = Vector3f::Random().cwiseAbs();\n// let's check if p0 and p1 are inside the axis aligned box defined by the corners boxMin,boxMax:\ncout << \"Is (\" << p0.transpose() << \") inside the box: \"\n     << ((boxMin.array()<p0.array()).all() && (boxMax.array()>p0.array()).all()) << endl;\ncout << \"Is (\" << p1.transpose() << \") inside the box: \"\n     << ((boxMin.array()<p1.array()).all() && (boxMax.array()>p1.array()).all()) << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_applyOnTheLeft.cpp",
    "content": "Matrix3f A = Matrix3f::Random(3,3), B;\nB << 0,1,0,  \n     0,0,1,  \n     1,0,0;\ncout << \"At start, A = \" << endl << A << endl;\nA.applyOnTheLeft(B); \ncout << \"After applyOnTheLeft, A = \" << endl << A << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_applyOnTheRight.cpp",
    "content": "Matrix3f A = Matrix3f::Random(3,3), B;\nB << 0,1,0,  \n     0,0,1,  \n     1,0,0;\ncout << \"At start, A = \" << endl << A << endl;\nA *= B;\ncout << \"After A *= B, A = \" << endl << A << endl;\nA.applyOnTheRight(B);  // equivalent to A *= B\ncout << \"After applyOnTheRight, A = \" << endl << A << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_array.cpp",
    "content": "Vector3d v(1,2,3);\nv.array() += 3;\nv.array() -= 2;\ncout << v << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_array_const.cpp",
    "content": "Vector3d v(-1,2,-3);\ncout << \"the absolute values:\" << endl << v.array().abs() << endl;\ncout << \"the absolute values plus one:\" << endl << v.array().abs()+1 << endl;\ncout << \"sum of the squares: \" << v.array().square().sum() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_asDiagonal.cpp",
    "content": "cout << Matrix3i(Vector3i(2,5,6).asDiagonal()) << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_block_int_int.cpp",
    "content": "Matrix4i m = Matrix4i::Random();\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"Here is m.block<2,2>(1,1):\" << endl << m.block<2,2>(1,1) << endl;\nm.block<2,2>(1,1).setZero();\ncout << \"Now the matrix m is:\" << endl << m << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_block_int_int_int_int.cpp",
    "content": "Matrix4i m = Matrix4i::Random();\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"Here is m.block(1, 1, 2, 2):\" << endl << m.block(1, 1, 2, 2) << endl;\nm.block(1, 1, 2, 2).setZero();\ncout << \"Now the matrix m is:\" << endl << m << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_bottomLeftCorner_int_int.cpp",
    "content": "Matrix4i m = Matrix4i::Random();\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"Here is m.bottomLeftCorner(2, 2):\" << endl;\ncout << m.bottomLeftCorner(2, 2) << endl;\nm.bottomLeftCorner(2, 2).setZero();\ncout << \"Now the matrix m is:\" << endl << m << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_bottomRightCorner_int_int.cpp",
    "content": "Matrix4i m = Matrix4i::Random();\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"Here is m.bottomRightCorner(2, 2):\" << endl;\ncout << m.bottomRightCorner(2, 2) << endl;\nm.bottomRightCorner(2, 2).setZero();\ncout << \"Now the matrix m is:\" << endl << m << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_bottomRows_int.cpp",
    "content": "Array44i a = Array44i::Random();\ncout << \"Here is the array a:\" << endl << a << endl;\ncout << \"Here is a.bottomRows(2):\" << endl;\ncout << a.bottomRows(2) << endl;\na.bottomRows(2).setZero();\ncout << \"Now the array a is:\" << endl << a << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_cast.cpp",
    "content": "Matrix2d md = Matrix2d::Identity() * 0.45;\nMatrix2f mf = Matrix2f::Identity();\ncout << md + mf.cast<double>() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_col.cpp",
    "content": "Matrix3d m = Matrix3d::Identity();\nm.col(1) = Vector3d(4,5,6);\ncout << m << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_colwise.cpp",
    "content": "Matrix3d m = Matrix3d::Random();\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"Here is the sum of each column:\" << endl << m.colwise().sum() << endl;\ncout << \"Here is the maximum absolute value of each column:\"\n     << endl << m.cwiseAbs().colwise().maxCoeff() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_computeInverseAndDetWithCheck.cpp",
    "content": "Matrix3d m = Matrix3d::Random();\ncout << \"Here is the matrix m:\" << endl << m << endl;\nMatrix3d inverse;\nbool invertible;\ndouble determinant;\nm.computeInverseAndDetWithCheck(inverse,determinant,invertible);\ncout << \"Its determinant is \" << determinant << endl;\nif(invertible) {\n  cout << \"It is invertible, and its inverse is:\" << endl << inverse << endl;\n}\nelse {\n  cout << \"It is not invertible.\" << endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_computeInverseWithCheck.cpp",
    "content": "Matrix3d m = Matrix3d::Random();\ncout << \"Here is the matrix m:\" << endl << m << endl;\nMatrix3d inverse;\nbool invertible;\nm.computeInverseWithCheck(inverse,invertible);\nif(invertible) {\n  cout << \"It is invertible, and its inverse is:\" << endl << inverse << endl;\n}\nelse {\n  cout << \"It is not invertible.\" << endl;\n}\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_cwiseAbs.cpp",
    "content": "MatrixXd m(2,3);\nm << 2, -4, 6,   \n     -5, 1, 0;\ncout << m.cwiseAbs() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_cwiseAbs2.cpp",
    "content": "MatrixXd m(2,3);\nm << 2, -4, 6,   \n     -5, 1, 0;\ncout << m.cwiseAbs2() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_cwiseEqual.cpp",
    "content": "MatrixXi m(2,2);\nm << 1, 0,\n     1, 1;\ncout << \"Comparing m with identity matrix:\" << endl;\ncout << m.cwiseEqual(MatrixXi::Identity(2,2)) << endl;\nint count = m.cwiseEqual(MatrixXi::Identity(2,2)).count();\ncout << \"Number of coefficients that are equal: \" << count << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_cwiseInverse.cpp",
    "content": "MatrixXd m(2,3);\nm << 2, 0.5, 1,   \n     3, 0.25, 1;\ncout << m.cwiseInverse() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_cwiseMax.cpp",
    "content": "Vector3d v(2,3,4), w(4,2,3);\ncout << v.cwiseMax(w) << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_cwiseMin.cpp",
    "content": "Vector3d v(2,3,4), w(4,2,3);\ncout << v.cwiseMin(w) << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_cwiseNotEqual.cpp",
    "content": "MatrixXi m(2,2);\nm << 1, 0,\n     1, 1;\ncout << \"Comparing m with identity matrix:\" << endl;\ncout << m.cwiseNotEqual(MatrixXi::Identity(2,2)) << endl;\nint count = m.cwiseNotEqual(MatrixXi::Identity(2,2)).count();\ncout << \"Number of coefficients that are not equal: \" << count << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_cwiseProduct.cpp",
    "content": "Matrix3i a = Matrix3i::Random(), b = Matrix3i::Random();\nMatrix3i c = a.cwiseProduct(b);\ncout << \"a:\\n\" << a << \"\\nb:\\n\" << b << \"\\nc:\\n\" << c << endl;\n\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_cwiseQuotient.cpp",
    "content": "Vector3d v(2,3,4), w(4,2,3);\ncout << v.cwiseQuotient(w) << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_cwiseSqrt.cpp",
    "content": "Vector3d v(1,2,4);\ncout << v.cwiseSqrt() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_diagonal.cpp",
    "content": "Matrix3i m = Matrix3i::Random();\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"Here are the coefficients on the main diagonal of m:\" << endl\n     << m.diagonal() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_diagonal_int.cpp",
    "content": "Matrix4i m = Matrix4i::Random();\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"Here are the coefficients on the 1st super-diagonal and 2nd sub-diagonal of m:\" << endl\n     << m.diagonal(1).transpose() << endl\n     << m.diagonal(-2).transpose() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_diagonal_template_int.cpp",
    "content": "Matrix4i m = Matrix4i::Random();\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"Here are the coefficients on the 1st super-diagonal and 2nd sub-diagonal of m:\" << endl\n     << m.diagonal<1>().transpose() << endl\n     << m.diagonal<-2>().transpose() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_eigenvalues.cpp",
    "content": "MatrixXd ones = MatrixXd::Ones(3,3);\nVectorXcd eivals = ones.eigenvalues();\ncout << \"The eigenvalues of the 3x3 matrix of ones are:\" << endl << eivals << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_end_int.cpp",
    "content": "RowVector4i v = RowVector4i::Random();\ncout << \"Here is the vector v:\" << endl << v << endl;\ncout << \"Here is v.tail(2):\" << endl << v.tail(2) << endl;\nv.tail(2).setZero();\ncout << \"Now the vector v is:\" << endl << v << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_eval.cpp",
    "content": "Matrix2f M = Matrix2f::Random();\nMatrix2f m;\nm = M;\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"Now we want to copy a column into a row.\" << endl;\ncout << \"If we do m.col(1) = m.row(0), then m becomes:\" << endl;\nm.col(1) = m.row(0);\ncout << m << endl << \"which is wrong!\" << endl;\ncout << \"Now let us instead do m.col(1) = m.row(0).eval(). Then m becomes\" << endl;\nm = M;\nm.col(1) = m.row(0).eval();\ncout << m << endl << \"which is right.\" << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_extract.cpp",
    "content": "#ifndef _MSC_VER\n  #warning deprecated\n#endif\n/* deprecated\nMatrix3i m = Matrix3i::Random();\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"Here is the upper-triangular matrix extracted from m:\" << endl\n     << m.part<Eigen::UpperTriangular>() << endl;\ncout << \"Here is the strictly-upper-triangular matrix extracted from m:\" << endl\n     << m.part<Eigen::StrictlyUpperTriangular>() << endl;\ncout << \"Here is the unit-lower-triangular matrix extracted from m:\" << endl\n     << m.part<Eigen::UnitLowerTriangular>() << endl;\n*/"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_fixedBlock_int_int.cpp",
    "content": "Matrix4d m = Vector4d(1,2,3,4).asDiagonal();\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"Here is m.fixed<2, 2>(2, 2):\" << endl << m.block<2, 2>(2, 2) << endl;\nm.block<2, 2>(2, 0) = m.block<2, 2>(2, 2);\ncout << \"Now the matrix m is:\" << endl << m << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_identity.cpp",
    "content": "cout << Matrix<double, 3, 4>::Identity() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_identity_int_int.cpp",
    "content": "cout << MatrixXd::Identity(4, 3) << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_inverse.cpp",
    "content": "Matrix3d m = Matrix3d::Random();\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"Its inverse is:\" << endl << m.inverse() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_isDiagonal.cpp",
    "content": "Matrix3d m = 10000 * Matrix3d::Identity();\nm(0,2) = 1;\ncout << \"Here's the matrix m:\" << endl << m << endl;\ncout << \"m.isDiagonal() returns: \" << m.isDiagonal() << endl;\ncout << \"m.isDiagonal(1e-3) returns: \" << m.isDiagonal(1e-3) << endl;\n\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_isIdentity.cpp",
    "content": "Matrix3d m = Matrix3d::Identity();\nm(0,2) = 1e-4;\ncout << \"Here's the matrix m:\" << endl << m << endl;\ncout << \"m.isIdentity() returns: \" << m.isIdentity() << endl;\ncout << \"m.isIdentity(1e-3) returns: \" << m.isIdentity(1e-3) << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_isOnes.cpp",
    "content": "Matrix3d m = Matrix3d::Ones();\nm(0,2) += 1e-4;\ncout << \"Here's the matrix m:\" << endl << m << endl;\ncout << \"m.isOnes() returns: \" << m.isOnes() << endl;\ncout << \"m.isOnes(1e-3) returns: \" << m.isOnes(1e-3) << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_isOrthogonal.cpp",
    "content": "Vector3d v(1,0,0);\nVector3d w(1e-4,0,1);\ncout << \"Here's the vector v:\" << endl << v << endl;\ncout << \"Here's the vector w:\" << endl << w << endl;\ncout << \"v.isOrthogonal(w) returns: \" << v.isOrthogonal(w) << endl;\ncout << \"v.isOrthogonal(w,1e-3) returns: \" << v.isOrthogonal(w,1e-3) << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_isUnitary.cpp",
    "content": "Matrix3d m = Matrix3d::Identity();\nm(0,2) = 1e-4;\ncout << \"Here's the matrix m:\" << endl << m << endl;\ncout << \"m.isUnitary() returns: \" << m.isUnitary() << endl;\ncout << \"m.isUnitary(1e-3) returns: \" << m.isUnitary(1e-3) << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_isZero.cpp",
    "content": "Matrix3d m = Matrix3d::Zero();\nm(0,2) = 1e-4;\ncout << \"Here's the matrix m:\" << endl << m << endl;\ncout << \"m.isZero() returns: \" << m.isZero() << endl;\ncout << \"m.isZero(1e-3) returns: \" << m.isZero(1e-3) << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_leftCols_int.cpp",
    "content": "Array44i a = Array44i::Random();\ncout << \"Here is the array a:\" << endl << a << endl;\ncout << \"Here is a.leftCols(2):\" << endl;\ncout << a.leftCols(2) << endl;\na.leftCols(2).setZero();\ncout << \"Now the array a is:\" << endl << a << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_marked.cpp",
    "content": "#ifndef _MSC_VER\n  #warning deprecated\n#endif\n/*\nMatrix3d m = Matrix3d::Zero();\nm.part<Eigen::UpperTriangular>().setOnes();\ncout << \"Here is the matrix m:\" << endl << m << endl;\nMatrix3d n = Matrix3d::Ones();\nn.part<Eigen::LowerTriangular>() *= 2;\ncout << \"Here is the matrix n:\" << endl << n << endl;\ncout << \"And now here is m.inverse()*n, taking advantage of the fact that\"\n        \" m is upper-triangular:\" << endl\n     << m.marked<Eigen::UpperTriangular>().solveTriangular(n);\n*/"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_noalias.cpp",
    "content": "Matrix2d a, b, c; a << 1,2,3,4; b << 5,6,7,8;\nc.noalias() = a * b; // this computes the product directly to c\ncout << c << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_ones.cpp",
    "content": "cout << Matrix2d::Ones() << endl;\ncout << 6 * RowVector4i::Ones() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_ones_int.cpp",
    "content": "cout << 6 * RowVectorXi::Ones(4) << endl;\ncout << VectorXf::Ones(2) << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_ones_int_int.cpp",
    "content": "cout << MatrixXi::Ones(2,3) << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_operatorNorm.cpp",
    "content": "MatrixXd ones = MatrixXd::Ones(3,3);\ncout << \"The operator norm of the 3x3 matrix of ones is \"\n     << ones.operatorNorm() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_part.cpp",
    "content": "#ifndef _MSC_VER\n  #warning deprecated\n#endif\n/*\nMatrix3d m = Matrix3d::Zero();\nm.part<Eigen::StrictlyUpperTriangular>().setOnes();\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"And let us now compute m*m.adjoint() in a very optimized way\" << endl\n     << \"taking advantage of the symmetry.\" << endl;\nMatrix3d n;\nn.part<Eigen::SelfAdjoint>() = (m*m.adjoint()).lazy();\ncout << \"The result is:\" << endl << n << endl;\n*/"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_prod.cpp",
    "content": "Matrix3d m = Matrix3d::Random();\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"Here is the product of all the coefficients:\" << endl << m.prod() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_random.cpp",
    "content": "cout << 100 * Matrix2i::Random() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_random_int.cpp",
    "content": "cout << VectorXi::Random(2) << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_random_int_int.cpp",
    "content": "cout << MatrixXi::Random(2,3) << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_replicate.cpp",
    "content": "MatrixXi m = MatrixXi::Random(2,3);\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"m.replicate<3,2>() = ...\" << endl;\ncout << m.replicate<3,2>() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_replicate_int_int.cpp",
    "content": "Vector3i v = Vector3i::Random();\ncout << \"Here is the vector v:\" << endl << v << endl;\ncout << \"v.replicate(2,5) = ...\" << endl;\ncout << v.replicate(2,5) << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_reverse.cpp",
    "content": "MatrixXi m = MatrixXi::Random(3,4);\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"Here is the reverse of m:\" << endl << m.reverse() << endl;\ncout << \"Here is the coefficient (1,0) in the reverse of m:\" << endl\n     << m.reverse()(1,0) << endl;\ncout << \"Let us overwrite this coefficient with the value 4.\" << endl;\nm.reverse()(1,0) = 4;\ncout << \"Now the matrix m is:\" << endl << m << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_rightCols_int.cpp",
    "content": "Array44i a = Array44i::Random();\ncout << \"Here is the array a:\" << endl << a << endl;\ncout << \"Here is a.rightCols(2):\" << endl;\ncout << a.rightCols(2) << endl;\na.rightCols(2).setZero();\ncout << \"Now the array a is:\" << endl << a << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_row.cpp",
    "content": "Matrix3d m = Matrix3d::Identity();\nm.row(1) = Vector3d(4,5,6);\ncout << m << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_rowwise.cpp",
    "content": "Matrix3d m = Matrix3d::Random();\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"Here is the sum of each row:\" << endl << m.rowwise().sum() << endl;\ncout << \"Here is the maximum absolute value of each row:\"\n     << endl << m.cwiseAbs().rowwise().maxCoeff() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_segment_int_int.cpp",
    "content": "RowVector4i v = RowVector4i::Random();\ncout << \"Here is the vector v:\" << endl << v << endl;\ncout << \"Here is v.segment(1, 2):\" << endl << v.segment(1, 2) << endl;\nv.segment(1, 2).setZero();\ncout << \"Now the vector v is:\" << endl << v << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_select.cpp",
    "content": "MatrixXi m(3, 3);\nm << 1, 2, 3,\n     4, 5, 6,\n     7, 8, 9;\nm = (m.array() >= 5).select(-m, m);\ncout << m << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_set.cpp",
    "content": "Matrix3i m1;\nm1 << 1, 2, 3,\n      4, 5, 6,\n      7, 8, 9;\ncout << m1 << endl << endl;\nMatrix3i m2 = Matrix3i::Identity();\nm2.block(0,0, 2,2) << 10, 11, 12, 13;\ncout << m2 << endl << endl;\nVector2i v1;\nv1 << 14, 15;\nm2 << v1.transpose(), 16,\n      v1, m1.block(1,1,2,2);\ncout << m2 << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_setIdentity.cpp",
    "content": "Matrix4i m = Matrix4i::Zero();\nm.block<3,3>(1,0).setIdentity();\ncout << m << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_setOnes.cpp",
    "content": "Matrix4i m = Matrix4i::Random();\nm.row(1).setOnes();\ncout << m << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_setRandom.cpp",
    "content": "Matrix4i m = Matrix4i::Zero();\nm.col(1).setRandom();\ncout << m << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_setZero.cpp",
    "content": "Matrix4i m = Matrix4i::Random();\nm.row(1).setZero();\ncout << m << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_start_int.cpp",
    "content": "RowVector4i v = RowVector4i::Random();\ncout << \"Here is the vector v:\" << endl << v << endl;\ncout << \"Here is v.head(2):\" << endl << v.head(2) << endl;\nv.head(2).setZero();\ncout << \"Now the vector v is:\" << endl << v << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_template_int_bottomRows.cpp",
    "content": "Array44i a = Array44i::Random();\ncout << \"Here is the array a:\" << endl << a << endl;\ncout << \"Here is a.bottomRows<2>():\" << endl;\ncout << a.bottomRows<2>() << endl;\na.bottomRows<2>().setZero();\ncout << \"Now the array a is:\" << endl << a << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_template_int_end.cpp",
    "content": "RowVector4i v = RowVector4i::Random();\ncout << \"Here is the vector v:\" << endl << v << endl;\ncout << \"Here is v.tail(2):\" << endl << v.tail<2>() << endl;\nv.tail<2>().setZero();\ncout << \"Now the vector v is:\" << endl << v << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_template_int_int_block_int_int_int_int.cpp",
    "content": "Matrix4i m = Matrix4i::Random();\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"Here is the block:\" << endl << m.block<2, Dynamic>(1, 1, 2, 3) << endl;\nm.block<2, Dynamic>(1, 1, 2, 3).setZero();\ncout << \"Now the matrix m is:\" << endl << m << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_template_int_int_bottomLeftCorner.cpp",
    "content": "Matrix4i m = Matrix4i::Random();\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"Here is m.bottomLeftCorner<2,2>():\" << endl;\ncout << m.bottomLeftCorner<2,2>() << endl;\nm.bottomLeftCorner<2,2>().setZero();\ncout << \"Now the matrix m is:\" << endl << m << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_template_int_int_bottomLeftCorner_int_int.cpp",
    "content": "Matrix4i m = Matrix4i::Random();\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"Here is m.bottomLeftCorner<2,Dynamic>(2,2):\" << endl;\ncout << m.bottomLeftCorner<2,Dynamic>(2,2) << endl;\nm.bottomLeftCorner<2,Dynamic>(2,2).setZero();\ncout << \"Now the matrix m is:\" << endl << m << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_template_int_int_bottomRightCorner.cpp",
    "content": "Matrix4i m = Matrix4i::Random();\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"Here is m.bottomRightCorner<2,2>():\" << endl;\ncout << m.bottomRightCorner<2,2>() << endl;\nm.bottomRightCorner<2,2>().setZero();\ncout << \"Now the matrix m is:\" << endl << m << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_template_int_int_bottomRightCorner_int_int.cpp",
    "content": "Matrix4i m = Matrix4i::Random();\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"Here is m.bottomRightCorner<2,Dynamic>(2,2):\" << endl;\ncout << m.bottomRightCorner<2,Dynamic>(2,2) << endl;\nm.bottomRightCorner<2,Dynamic>(2,2).setZero();\ncout << \"Now the matrix m is:\" << endl << m << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_template_int_int_topLeftCorner.cpp",
    "content": "Matrix4i m = Matrix4i::Random();\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"Here is m.topLeftCorner<2,2>():\" << endl;\ncout << m.topLeftCorner<2,2>() << endl;\nm.topLeftCorner<2,2>().setZero();\ncout << \"Now the matrix m is:\" << endl << m << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_template_int_int_topLeftCorner_int_int.cpp",
    "content": "Matrix4i m = Matrix4i::Random();\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"Here is m.topLeftCorner<2,Dynamic>(2,2):\" << endl;\ncout << m.topLeftCorner<2,Dynamic>(2,2) << endl;\nm.topLeftCorner<2,Dynamic>(2,2).setZero();\ncout << \"Now the matrix m is:\" << endl << m << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_template_int_int_topRightCorner.cpp",
    "content": "Matrix4i m = Matrix4i::Random();\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"Here is m.topRightCorner<2,2>():\" << endl;\ncout << m.topRightCorner<2,2>() << endl;\nm.topRightCorner<2,2>().setZero();\ncout << \"Now the matrix m is:\" << endl << m << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_template_int_int_topRightCorner_int_int.cpp",
    "content": "Matrix4i m = Matrix4i::Random();\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"Here is m.topRightCorner<2,Dynamic>(2,2):\" << endl;\ncout << m.topRightCorner<2,Dynamic>(2,2) << endl;\nm.topRightCorner<2,Dynamic>(2,2).setZero();\ncout << \"Now the matrix m is:\" << endl << m << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_template_int_leftCols.cpp",
    "content": "Array44i a = Array44i::Random();\ncout << \"Here is the array a:\" << endl << a << endl;\ncout << \"Here is a.leftCols<2>():\" << endl;\ncout << a.leftCols<2>() << endl;\na.leftCols<2>().setZero();\ncout << \"Now the array a is:\" << endl << a << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_template_int_rightCols.cpp",
    "content": "Array44i a = Array44i::Random();\ncout << \"Here is the array a:\" << endl << a << endl;\ncout << \"Here is a.rightCols<2>():\" << endl;\ncout << a.rightCols<2>() << endl;\na.rightCols<2>().setZero();\ncout << \"Now the array a is:\" << endl << a << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_template_int_segment.cpp",
    "content": "RowVector4i v = RowVector4i::Random();\ncout << \"Here is the vector v:\" << endl << v << endl;\ncout << \"Here is v.segment<2>(1):\" << endl << v.segment<2>(1) << endl;\nv.segment<2>(2).setZero();\ncout << \"Now the vector v is:\" << endl << v << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_template_int_start.cpp",
    "content": "RowVector4i v = RowVector4i::Random();\ncout << \"Here is the vector v:\" << endl << v << endl;\ncout << \"Here is v.head(2):\" << endl << v.head<2>() << endl;\nv.head<2>().setZero();\ncout << \"Now the vector v is:\" << endl << v << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_template_int_topRows.cpp",
    "content": "Array44i a = Array44i::Random();\ncout << \"Here is the array a:\" << endl << a << endl;\ncout << \"Here is a.topRows<2>():\" << endl;\ncout << a.topRows<2>() << endl;\na.topRows<2>().setZero();\ncout << \"Now the array a is:\" << endl << a << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_topLeftCorner_int_int.cpp",
    "content": "Matrix4i m = Matrix4i::Random();\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"Here is m.topLeftCorner(2, 2):\" << endl;\ncout << m.topLeftCorner(2, 2) << endl;\nm.topLeftCorner(2, 2).setZero();\ncout << \"Now the matrix m is:\" << endl << m << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_topRightCorner_int_int.cpp",
    "content": "Matrix4i m = Matrix4i::Random();\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"Here is m.topRightCorner(2, 2):\" << endl;\ncout << m.topRightCorner(2, 2) << endl;\nm.topRightCorner(2, 2).setZero();\ncout << \"Now the matrix m is:\" << endl << m << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_topRows_int.cpp",
    "content": "Array44i a = Array44i::Random();\ncout << \"Here is the array a:\" << endl << a << endl;\ncout << \"Here is a.topRows(2):\" << endl;\ncout << a.topRows(2) << endl;\na.topRows(2).setZero();\ncout << \"Now the array a is:\" << endl << a << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_transpose.cpp",
    "content": "Matrix2i m = Matrix2i::Random();\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"Here is the transpose of m:\" << endl << m.transpose() << endl;\ncout << \"Here is the coefficient (1,0) in the transpose of m:\" << endl\n     << m.transpose()(1,0) << endl;\ncout << \"Let us overwrite this coefficient with the value 0.\" << endl;\nm.transpose()(1,0) = 0;\ncout << \"Now the matrix m is:\" << endl << m << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_zero.cpp",
    "content": "cout << Matrix2d::Zero() << endl;\ncout << RowVector4i::Zero() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_zero_int.cpp",
    "content": "cout << RowVectorXi::Zero(4) << endl;\ncout << VectorXf::Zero(2) << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/MatrixBase_zero_int_int.cpp",
    "content": "cout << MatrixXi::Zero(2,3) << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Matrix_resize_NoChange_int.cpp",
    "content": "MatrixXd m(3,4);\nm.resize(NoChange, 5);\ncout << \"m: \" << m.rows() << \" rows, \" << m.cols() << \" cols\" << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Matrix_resize_int.cpp",
    "content": "VectorXd v(10);\nv.resize(3);\nRowVector3d w;\nw.resize(3); // this is legal, but has no effect\ncout << \"v: \" << v.rows() << \" rows, \" << v.cols() << \" cols\" << endl;\ncout << \"w: \" << w.rows() << \" rows, \" << w.cols() << \" cols\" << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Matrix_resize_int_NoChange.cpp",
    "content": "MatrixXd m(3,4);\nm.resize(5, NoChange);\ncout << \"m: \" << m.rows() << \" rows, \" << m.cols() << \" cols\" << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Matrix_resize_int_int.cpp",
    "content": "MatrixXd m(2,3);\nm << 1,2,3,4,5,6;\ncout << \"here's the 2x3 matrix m:\" << endl << m << endl;\ncout << \"let's resize m to 3x2. This is a conservative resizing because 2*3==3*2.\" << endl;\nm.resize(3,2);\ncout << \"here's the 3x2 matrix m:\" << endl << m << endl;\ncout << \"now let's resize m to size 2x2. This is NOT a conservative resizing, so it becomes uninitialized:\" << endl;\nm.resize(2,2);\ncout << m << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Matrix_setConstant_int.cpp",
    "content": "VectorXf v;\nv.setConstant(3, 5);\ncout << v << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Matrix_setConstant_int_int.cpp",
    "content": "MatrixXf m;\nm.setConstant(3, 3, 5);\ncout << m << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Matrix_setIdentity_int_int.cpp",
    "content": "MatrixXf m;\nm.setIdentity(3, 3);\ncout << m << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Matrix_setOnes_int.cpp",
    "content": "VectorXf v;\nv.setOnes(3);\ncout << v << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Matrix_setOnes_int_int.cpp",
    "content": "MatrixXf m;\nm.setOnes(3, 3);\ncout << m << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Matrix_setRandom_int.cpp",
    "content": "VectorXf v;\nv.setRandom(3);\ncout << v << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Matrix_setRandom_int_int.cpp",
    "content": "MatrixXf m;\nm.setRandom(3, 3);\ncout << m << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Matrix_setZero_int.cpp",
    "content": "VectorXf v;\nv.setZero(3);\ncout << v << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Matrix_setZero_int_int.cpp",
    "content": "MatrixXf m;\nm.setZero(3, 3);\ncout << m << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/PartialPivLU_solve.cpp",
    "content": "MatrixXd A = MatrixXd::Random(3,3);\nMatrixXd B = MatrixXd::Random(3,2);\ncout << \"Here is the invertible matrix A:\" << endl << A << endl;\ncout << \"Here is the matrix B:\" << endl << B << endl;\nMatrixXd X = A.lu().solve(B);\ncout << \"Here is the (unique) solution X to the equation AX=B:\" << endl << X << endl;\ncout << \"Relative error: \" << (A*X-B).norm() / B.norm() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/PartialRedux_count.cpp",
    "content": "Matrix3d m = Matrix3d::Random();\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"Here is the count of elements larger or equal than 0.5 of each row:\" << endl << (m.array() >= 0.5).rowwise().count() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/PartialRedux_maxCoeff.cpp",
    "content": "Matrix3d m = Matrix3d::Random();\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"Here is the maximum of each column:\" << endl << m.colwise().maxCoeff() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/PartialRedux_minCoeff.cpp",
    "content": "Matrix3d m = Matrix3d::Random();\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"Here is the minimum of each column:\" << endl << m.colwise().minCoeff() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/PartialRedux_norm.cpp",
    "content": "Matrix3d m = Matrix3d::Random();\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"Here is the norm of each column:\" << endl << m.colwise().norm() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/PartialRedux_prod.cpp",
    "content": "Matrix3d m = Matrix3d::Random();\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"Here is the product of each row:\" << endl << m.rowwise().prod() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/PartialRedux_squaredNorm.cpp",
    "content": "Matrix3d m = Matrix3d::Random();\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"Here is the square norm of each row:\" << endl << m.rowwise().squaredNorm() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/PartialRedux_sum.cpp",
    "content": "Matrix3d m = Matrix3d::Random();\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"Here is the sum of each row:\" << endl << m.rowwise().sum() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/RealQZ_compute.cpp",
    "content": "MatrixXf A = MatrixXf::Random(4,4);\nMatrixXf B = MatrixXf::Random(4,4);\nRealQZ<MatrixXf> qz(4); // preallocate space for 4x4 matrices\nqz.compute(A,B);  // A = Q S Z,  B = Q T Z\n\n// print original matrices and result of decomposition\ncout << \"A:\\n\" << A << \"\\n\" << \"B:\\n\" << B << \"\\n\";\ncout << \"S:\\n\" << qz.matrixS() << \"\\n\" << \"T:\\n\" << qz.matrixT() << \"\\n\";\ncout << \"Q:\\n\" << qz.matrixQ() << \"\\n\" << \"Z:\\n\" << qz.matrixZ() << \"\\n\";\n\n// verify precision\ncout << \"\\nErrors:\"\n  << \"\\n|A-QSZ|: \" << (A-qz.matrixQ()*qz.matrixS()*qz.matrixZ()).norm()\n  << \", |B-QTZ|: \" << (B-qz.matrixQ()*qz.matrixT()*qz.matrixZ()).norm()\n  << \"\\n|QQ* - I|: \" << (qz.matrixQ()*qz.matrixQ().adjoint() - MatrixXf::Identity(4,4)).norm()\n  << \", |ZZ* - I|: \" << (qz.matrixZ()*qz.matrixZ().adjoint() - MatrixXf::Identity(4,4)).norm()\n  << \"\\n\";\n"
  },
  {
    "path": "libs/eigen/doc/snippets/RealSchur_RealSchur_MatrixType.cpp",
    "content": "MatrixXd A = MatrixXd::Random(6,6);\ncout << \"Here is a random 6x6 matrix, A:\" << endl << A << endl << endl;\n\nRealSchur<MatrixXd> schur(A);\ncout << \"The orthogonal matrix U is:\" << endl << schur.matrixU() << endl;\ncout << \"The quasi-triangular matrix T is:\" << endl << schur.matrixT() << endl << endl;\n\nMatrixXd U = schur.matrixU();\nMatrixXd T = schur.matrixT();\ncout << \"U * T * U^T = \" << endl << U * T * U.transpose() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/RealSchur_compute.cpp",
    "content": "MatrixXf A = MatrixXf::Random(4,4);\nRealSchur<MatrixXf> schur(4);\nschur.compute(A, /* computeU = */ false);\ncout << \"The matrix T in the decomposition of A is:\" << endl << schur.matrixT() << endl;\nschur.compute(A.inverse(), /* computeU = */ false);\ncout << \"The matrix T in the decomposition of A^(-1) is:\" << endl << schur.matrixT() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/SelfAdjointEigenSolver_SelfAdjointEigenSolver.cpp",
    "content": "SelfAdjointEigenSolver<Matrix4f> es;\nMatrix4f X = Matrix4f::Random(4,4);\nMatrix4f A = X + X.transpose();\nes.compute(A);\ncout << \"The eigenvalues of A are: \" << es.eigenvalues().transpose() << endl;\nes.compute(A + Matrix4f::Identity(4,4)); // re-use es to compute eigenvalues of A+I\ncout << \"The eigenvalues of A+I are: \" << es.eigenvalues().transpose() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/SelfAdjointEigenSolver_SelfAdjointEigenSolver_MatrixType.cpp",
    "content": "MatrixXd X = MatrixXd::Random(5,5);\nMatrixXd A = X + X.transpose();\ncout << \"Here is a random symmetric 5x5 matrix, A:\" << endl << A << endl << endl;\n\nSelfAdjointEigenSolver<MatrixXd> es(A);\ncout << \"The eigenvalues of A are:\" << endl << es.eigenvalues() << endl;\ncout << \"The matrix of eigenvectors, V, is:\" << endl << es.eigenvectors() << endl << endl;\n\ndouble lambda = es.eigenvalues()[0];\ncout << \"Consider the first eigenvalue, lambda = \" << lambda << endl;\nVectorXd v = es.eigenvectors().col(0);\ncout << \"If v is the corresponding eigenvector, then lambda * v = \" << endl << lambda * v << endl;\ncout << \"... and A * v = \" << endl << A * v << endl << endl;\n\nMatrixXd D = es.eigenvalues().asDiagonal();\nMatrixXd V = es.eigenvectors();\ncout << \"Finally, V * D * V^(-1) = \" << endl << V * D * V.inverse() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/SelfAdjointEigenSolver_SelfAdjointEigenSolver_MatrixType2.cpp",
    "content": "MatrixXd X = MatrixXd::Random(5,5);\nMatrixXd A = X + X.transpose();\ncout << \"Here is a random symmetric matrix, A:\" << endl << A << endl;\nX = MatrixXd::Random(5,5);\nMatrixXd B = X * X.transpose();\ncout << \"and a random postive-definite matrix, B:\" << endl << B << endl << endl;\n\nGeneralizedSelfAdjointEigenSolver<MatrixXd> es(A,B);\ncout << \"The eigenvalues of the pencil (A,B) are:\" << endl << es.eigenvalues() << endl;\ncout << \"The matrix of eigenvectors, V, is:\" << endl << es.eigenvectors() << endl << endl;\n\ndouble lambda = es.eigenvalues()[0];\ncout << \"Consider the first eigenvalue, lambda = \" << lambda << endl;\nVectorXd v = es.eigenvectors().col(0);\ncout << \"If v is the corresponding eigenvector, then A * v = \" << endl << A * v << endl;\ncout << \"... and lambda * B * v = \" << endl << lambda * B * v << endl << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/SelfAdjointEigenSolver_compute_MatrixType.cpp",
    "content": "SelfAdjointEigenSolver<MatrixXf> es(4);\nMatrixXf X = MatrixXf::Random(4,4);\nMatrixXf A = X + X.transpose();\nes.compute(A);\ncout << \"The eigenvalues of A are: \" << es.eigenvalues().transpose() << endl;\nes.compute(A + MatrixXf::Identity(4,4)); // re-use es to compute eigenvalues of A+I\ncout << \"The eigenvalues of A+I are: \" << es.eigenvalues().transpose() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/SelfAdjointEigenSolver_compute_MatrixType2.cpp",
    "content": "MatrixXd X = MatrixXd::Random(5,5);\nMatrixXd A = X * X.transpose();\nX = MatrixXd::Random(5,5);\nMatrixXd B = X * X.transpose();\n\nGeneralizedSelfAdjointEigenSolver<MatrixXd> es(A,B,EigenvaluesOnly);\ncout << \"The eigenvalues of the pencil (A,B) are:\" << endl << es.eigenvalues() << endl;\nes.compute(B,A,false);\ncout << \"The eigenvalues of the pencil (B,A) are:\" << endl << es.eigenvalues() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/SelfAdjointEigenSolver_eigenvalues.cpp",
    "content": "MatrixXd ones = MatrixXd::Ones(3,3);\nSelfAdjointEigenSolver<MatrixXd> es(ones);\ncout << \"The eigenvalues of the 3x3 matrix of ones are:\" \n     << endl << es.eigenvalues() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/SelfAdjointEigenSolver_eigenvectors.cpp",
    "content": "MatrixXd ones = MatrixXd::Ones(3,3);\nSelfAdjointEigenSolver<MatrixXd> es(ones);\ncout << \"The first eigenvector of the 3x3 matrix of ones is:\" \n     << endl << es.eigenvectors().col(1) << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/SelfAdjointEigenSolver_operatorInverseSqrt.cpp",
    "content": "MatrixXd X = MatrixXd::Random(4,4);\nMatrixXd A = X * X.transpose();\ncout << \"Here is a random positive-definite matrix, A:\" << endl << A << endl << endl;\n\nSelfAdjointEigenSolver<MatrixXd> es(A);\ncout << \"The inverse square root of A is: \" << endl;\ncout << es.operatorInverseSqrt() << endl;\ncout << \"We can also compute it with operatorSqrt() and inverse(). That yields: \" << endl;\ncout << es.operatorSqrt().inverse() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/SelfAdjointEigenSolver_operatorSqrt.cpp",
    "content": "MatrixXd X = MatrixXd::Random(4,4);\nMatrixXd A = X * X.transpose();\ncout << \"Here is a random positive-definite matrix, A:\" << endl << A << endl << endl;\n\nSelfAdjointEigenSolver<MatrixXd> es(A);\nMatrixXd sqrtA = es.operatorSqrt();\ncout << \"The square root of A is: \" << endl << sqrtA << endl;\ncout << \"If we square this, we get: \" << endl << sqrtA*sqrtA << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/SelfAdjointView_eigenvalues.cpp",
    "content": "MatrixXd ones = MatrixXd::Ones(3,3);\nVectorXd eivals = ones.selfadjointView<Lower>().eigenvalues();\ncout << \"The eigenvalues of the 3x3 matrix of ones are:\" << endl << eivals << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/SelfAdjointView_operatorNorm.cpp",
    "content": "MatrixXd ones = MatrixXd::Ones(3,3);\ncout << \"The operator norm of the 3x3 matrix of ones is \"\n     << ones.selfadjointView<Lower>().operatorNorm() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/TopicAliasing_block.cpp",
    "content": "MatrixXi mat(3,3); \nmat << 1, 2, 3,   4, 5, 6,   7, 8, 9;\ncout << \"Here is the matrix mat:\\n\" << mat << endl;\n\n// This assignment shows the aliasing problem\nmat.bottomRightCorner(2,2) = mat.topLeftCorner(2,2);\ncout << \"After the assignment, mat = \\n\" << mat << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/TopicAliasing_block_correct.cpp",
    "content": "MatrixXi mat(3,3); \nmat << 1, 2, 3,   4, 5, 6,   7, 8, 9;\ncout << \"Here is the matrix mat:\\n\" << mat << endl;\n\n// The eval() solves the aliasing problem\nmat.bottomRightCorner(2,2) = mat.topLeftCorner(2,2).eval();\ncout << \"After the assignment, mat = \\n\" << mat << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/TopicAliasing_cwise.cpp",
    "content": "MatrixXf mat(2,2); \nmat << 1, 2,  4, 7;\ncout << \"Here is the matrix mat:\\n\" << mat << endl << endl;\n\nmat = 2 * mat;\ncout << \"After 'mat = 2 * mat', mat = \\n\" << mat << endl << endl;\n\n\nmat = mat - MatrixXf::Identity(2,2);\ncout << \"After the subtraction, it becomes\\n\" << mat << endl << endl;\n\n\nArrayXXf arr = mat;\narr = arr.square();\ncout << \"After squaring, it becomes\\n\" << arr << endl << endl;\n\n// Combining all operations in one statement:\nmat << 1, 2,  4, 7;\nmat = (2 * mat - MatrixXf::Identity(2,2)).array().square();\ncout << \"Doing everything at once yields\\n\" << mat << endl << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/TopicAliasing_mult1.cpp",
    "content": "MatrixXf matA(2,2); \nmatA << 2, 0,  0, 2;\nmatA = matA * matA;\ncout << matA;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/TopicAliasing_mult2.cpp",
    "content": "MatrixXf matA(2,2), matB(2,2); \nmatA << 2, 0,  0, 2;\n\n// Simple but not quite as efficient\nmatB = matA * matA;\ncout << matB << endl << endl;\n\n// More complicated but also more efficient\nmatB.noalias() = matA * matA;\ncout << matB;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/TopicAliasing_mult3.cpp",
    "content": "MatrixXf matA(2,2); \nmatA << 2, 0,  0, 2;\nmatA.noalias() = matA * matA;\ncout << matA;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/TopicStorageOrders_example.cpp",
    "content": "Matrix<int, 3, 4, ColMajor> Acolmajor;\nAcolmajor << 8, 2, 2, 9,\n             9, 1, 4, 4,\n\t     3, 5, 4, 5;\ncout << \"The matrix A:\" << endl;\ncout << Acolmajor << endl << endl; \n\ncout << \"In memory (column-major):\" << endl;\nfor (int i = 0; i < Acolmajor.size(); i++)\n  cout << *(Acolmajor.data() + i) << \"  \";\ncout << endl << endl;\n\nMatrix<int, 3, 4, RowMajor> Arowmajor = Acolmajor;\ncout << \"In memory (row-major):\" << endl;\nfor (int i = 0; i < Arowmajor.size(); i++)\n  cout << *(Arowmajor.data() + i) << \"  \";\ncout << endl;\n\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Tridiagonalization_Tridiagonalization_MatrixType.cpp",
    "content": "MatrixXd X = MatrixXd::Random(5,5);\nMatrixXd A = X + X.transpose();\ncout << \"Here is a random symmetric 5x5 matrix:\" << endl << A << endl << endl;\nTridiagonalization<MatrixXd> triOfA(A);\nMatrixXd Q = triOfA.matrixQ();\ncout << \"The orthogonal matrix Q is:\" << endl << Q << endl;\nMatrixXd T = triOfA.matrixT();\ncout << \"The tridiagonal matrix T is:\" << endl << T << endl << endl;\ncout << \"Q * T * Q^T = \" << endl << Q * T * Q.transpose() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Tridiagonalization_compute.cpp",
    "content": "Tridiagonalization<MatrixXf> tri;\nMatrixXf X = MatrixXf::Random(4,4);\nMatrixXf A = X + X.transpose();\ntri.compute(A);\ncout << \"The matrix T in the tridiagonal decomposition of A is: \" << endl;\ncout << tri.matrixT() << endl;\ntri.compute(2*A); // re-use tri to compute eigenvalues of 2A\ncout << \"The matrix T in the tridiagonal decomposition of 2A is: \" << endl;\ncout << tri.matrixT() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Tridiagonalization_decomposeInPlace.cpp",
    "content": "MatrixXd X = MatrixXd::Random(5,5);\nMatrixXd A = X + X.transpose();\ncout << \"Here is a random symmetric 5x5 matrix:\" << endl << A << endl << endl;\n\nVectorXd diag(5);\nVectorXd subdiag(4);\ninternal::tridiagonalization_inplace(A, diag, subdiag, true);\ncout << \"The orthogonal matrix Q is:\" << endl << A << endl;\ncout << \"The diagonal of the tridiagonal matrix T is:\" << endl << diag << endl;\ncout << \"The subdiagonal of the tridiagonal matrix T is:\" << endl << subdiag << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Tridiagonalization_diagonal.cpp",
    "content": "MatrixXcd X = MatrixXcd::Random(4,4);\nMatrixXcd A = X + X.adjoint();\ncout << \"Here is a random self-adjoint 4x4 matrix:\" << endl << A << endl << endl;\n\nTridiagonalization<MatrixXcd> triOfA(A);\nMatrixXd T = triOfA.matrixT();\ncout << \"The tridiagonal matrix T is:\" << endl << T << endl << endl;\n\ncout << \"We can also extract the diagonals of T directly ...\" << endl;\nVectorXd diag = triOfA.diagonal();\ncout << \"The diagonal is:\" << endl << diag << endl; \nVectorXd subdiag = triOfA.subDiagonal();\ncout << \"The subdiagonal is:\" << endl << subdiag << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Tridiagonalization_householderCoefficients.cpp",
    "content": "Matrix4d X = Matrix4d::Random(4,4);\nMatrix4d A = X + X.transpose();\ncout << \"Here is a random symmetric 4x4 matrix:\" << endl << A << endl;\nTridiagonalization<Matrix4d> triOfA(A);\nVector3d hc = triOfA.householderCoefficients();\ncout << \"The vector of Householder coefficients is:\" << endl << hc << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Tridiagonalization_packedMatrix.cpp",
    "content": "Matrix4d X = Matrix4d::Random(4,4);\nMatrix4d A = X + X.transpose();\ncout << \"Here is a random symmetric 4x4 matrix:\" << endl << A << endl;\nTridiagonalization<Matrix4d> triOfA(A);\nMatrix4d pm = triOfA.packedMatrix();\ncout << \"The packed matrix M is:\" << endl << pm << endl;\ncout << \"The diagonal and subdiagonal corresponds to the matrix T, which is:\" \n     << endl << triOfA.matrixT() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Tutorial_AdvancedInitialization_Block.cpp",
    "content": "MatrixXf matA(2, 2);\nmatA << 1, 2, 3, 4;\nMatrixXf matB(4, 4);\nmatB << matA, matA/10, matA/10, matA;\nstd::cout << matB << std::endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Tutorial_AdvancedInitialization_CommaTemporary.cpp",
    "content": "MatrixXf mat = MatrixXf::Random(2, 3);\nstd::cout << mat << std::endl << std::endl;\nmat = (MatrixXf(2,2) << 0, 1, 1, 0).finished() * mat;\nstd::cout << mat << std::endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Tutorial_AdvancedInitialization_Join.cpp",
    "content": "RowVectorXd vec1(3);\nvec1 << 1, 2, 3;\nstd::cout << \"vec1 = \" << vec1 << std::endl;\n\nRowVectorXd vec2(4);\nvec2 << 1, 4, 9, 16;;\nstd::cout << \"vec2 = \" << vec2 << std::endl;\n\nRowVectorXd joined(7);\njoined << vec1, vec2;\nstd::cout << \"joined = \" << joined << std::endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Tutorial_AdvancedInitialization_LinSpaced.cpp",
    "content": "ArrayXXf table(10, 4);\ntable.col(0) = ArrayXf::LinSpaced(10, 0, 90);\ntable.col(1) = M_PI / 180 * table.col(0);\ntable.col(2) = table.col(1).sin();\ntable.col(3) = table.col(1).cos();\nstd::cout << \"  Degrees   Radians      Sine    Cosine\\n\";\nstd::cout << table << std::endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Tutorial_AdvancedInitialization_ThreeWays.cpp",
    "content": "const int size = 6;\nMatrixXd mat1(size, size);\nmat1.topLeftCorner(size/2, size/2)     = MatrixXd::Zero(size/2, size/2);\nmat1.topRightCorner(size/2, size/2)    = MatrixXd::Identity(size/2, size/2);\nmat1.bottomLeftCorner(size/2, size/2)  = MatrixXd::Identity(size/2, size/2);\nmat1.bottomRightCorner(size/2, size/2) = MatrixXd::Zero(size/2, size/2);\nstd::cout << mat1 << std::endl << std::endl;\n\nMatrixXd mat2(size, size);\nmat2.topLeftCorner(size/2, size/2).setZero();\nmat2.topRightCorner(size/2, size/2).setIdentity();\nmat2.bottomLeftCorner(size/2, size/2).setIdentity();\nmat2.bottomRightCorner(size/2, size/2).setZero();\nstd::cout << mat2 << std::endl << std::endl;\n\nMatrixXd mat3(size, size);\nmat3 << MatrixXd::Zero(size/2, size/2), MatrixXd::Identity(size/2, size/2),\n        MatrixXd::Identity(size/2, size/2), MatrixXd::Zero(size/2, size/2);\nstd::cout << mat3 << std::endl;\n\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Tutorial_AdvancedInitialization_Zero.cpp",
    "content": "std::cout << \"A fixed-size array:\\n\";\nArray33f a1 = Array33f::Zero();\nstd::cout << a1 << \"\\n\\n\";\n\n\nstd::cout << \"A one-dimensional dynamic-size array:\\n\";\nArrayXf a2 = ArrayXf::Zero(3);\nstd::cout << a2 << \"\\n\\n\";\n\n\nstd::cout << \"A two-dimensional dynamic-size array:\\n\";\nArrayXXf a3 = ArrayXXf::Zero(3, 4);\nstd::cout << a3 << \"\\n\";\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Tutorial_Map_rowmajor.cpp",
    "content": "int array[8];\nfor(int i = 0; i < 8; ++i) array[i] = i;\ncout << \"Column-major:\\n\" << Map<Matrix<int,2,4> >(array) << endl;\ncout << \"Row-major:\\n\" << Map<Matrix<int,2,4,RowMajor> >(array) << endl;\ncout << \"Row-major using stride:\\n\" <<\n  Map<Matrix<int,2,4>, Unaligned, Stride<1,4> >(array) << endl;\n\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Tutorial_Map_using.cpp",
    "content": "typedef Matrix<float,1,Dynamic> MatrixType;\ntypedef Map<MatrixType> MapType;\ntypedef Map<const MatrixType> MapTypeConst;   // a read-only map\nconst int n_dims = 5;\n  \nMatrixType m1(n_dims), m2(n_dims);\nm1.setRandom();\nm2.setRandom();\nfloat *p = &m2(0);  // get the address storing the data for m2\nMapType m2map(p,m2.size());   // m2map shares data with m2\nMapTypeConst m2mapconst(p,m2.size());  // a read-only accessor for m2\n\ncout << \"m1: \" << m1 << endl;\ncout << \"m2: \" << m2 << endl;\ncout << \"Squared euclidean distance: \" << (m1-m2).squaredNorm() << endl;\ncout << \"Squared euclidean distance, using map: \" <<\n  (m1-m2map).squaredNorm() << endl;\nm2map(3) = 7;   // this will change m2, since they share the same array\ncout << \"Updated m2: \" << m2 << endl;\ncout << \"m2 coefficient 2, constant accessor: \" << m2mapconst(2) << endl;\n/* m2mapconst(2) = 5; */   // this yields a compile-time error\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Tutorial_commainit_01.cpp",
    "content": "Matrix3f m;\nm << 1, 2, 3,\n     4, 5, 6,\n     7, 8, 9;\nstd::cout << m;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Tutorial_commainit_01b.cpp",
    "content": "Matrix3f m;\nm.row(0) << 1, 2, 3;\nm.block(1,0,2,2) << 4, 5, 7, 8;\nm.col(2).tail(2) << 6, 9;\t\t    \nstd::cout << m;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Tutorial_commainit_02.cpp",
    "content": "int rows=5, cols=5;\nMatrixXf m(rows,cols);\nm << (Matrix3f() << 1, 2, 3, 4, 5, 6, 7, 8, 9).finished(),\n     MatrixXf::Zero(3,cols-3),\n     MatrixXf::Zero(rows-3,3),\n     MatrixXf::Identity(rows-3,cols-3);\ncout << m;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Tutorial_solve_matrix_inverse.cpp",
    "content": "Matrix3f A;\nVector3f b;\nA << 1,2,3,  4,5,6,  7,8,10;\nb << 3, 3, 4;\nVector3f x = A.inverse() * b;\ncout << \"The solution is:\" << endl << x << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Tutorial_solve_multiple_rhs.cpp",
    "content": "Matrix3f A(3,3);\nA << 1,2,3,  4,5,6,  7,8,10;\nMatrix<float,3,2> B;\nB << 3,1, 3,1, 4,1;\nMatrix<float,3,2> X;\nX = A.fullPivLu().solve(B);\ncout << \"The solution with right-hand side (3,3,4) is:\" << endl;\ncout << X.col(0) << endl;\ncout << \"The solution with right-hand side (1,1,1) is:\" << endl;\ncout << X.col(1) << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Tutorial_solve_reuse_decomposition.cpp",
    "content": "Matrix3f A(3,3);\nA << 1,2,3,  4,5,6,  7,8,10;\nPartialPivLU<Matrix3f> luOfA(A); // compute LU decomposition of A\nVector3f b;\nb << 3,3,4;\nVector3f x;\nx = luOfA.solve(b);\ncout << \"The solution with right-hand side (3,3,4) is:\" << endl;\ncout << x << endl;\nb << 1,1,1;\nx = luOfA.solve(b);\ncout << \"The solution with right-hand side (1,1,1) is:\" << endl;\ncout << x << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Tutorial_solve_singular.cpp",
    "content": "Matrix3f A;\nVector3f b;\nA << 1,2,3,  4,5,6,  7,8,9;\nb << 3, 3, 4;\ncout << \"Here is the matrix A:\" << endl << A << endl;\ncout << \"Here is the vector b:\" << endl << b << endl;\nVector3f x;\nx = A.lu().solve(b);\ncout << \"The solution is:\" << endl << x << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Tutorial_solve_triangular.cpp",
    "content": "Matrix3f A;\nVector3f b;\nA << 1,2,3,  0,5,6,  0,0,10;\nb << 3, 3, 4;\ncout << \"Here is the matrix A:\" << endl << A << endl;\ncout << \"Here is the vector b:\" << endl << b << endl;\nVector3f x = A.triangularView<Upper>().solve(b);\ncout << \"The solution is:\" << endl << x << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Tutorial_solve_triangular_inplace.cpp",
    "content": "Matrix3f A;\nVector3f b;\nA << 1,2,3,  0,5,6,  0,0,10;\nb << 3, 3, 4;\nA.triangularView<Upper>().solveInPlace(b);\ncout << \"The solution is:\" << endl << b << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/Vectorwise_reverse.cpp",
    "content": "MatrixXi m = MatrixXi::Random(3,4);\ncout << \"Here is the matrix m:\" << endl << m << endl;\ncout << \"Here is the rowwise reverse of m:\" << endl << m.rowwise().reverse() << endl;\ncout << \"Here is the colwise reverse of m:\" << endl << m.colwise().reverse() << endl;\n\ncout << \"Here is the coefficient (1,0) in the rowise reverse of m:\" << endl\n<< m.rowwise().reverse()(1,0) << endl;\ncout << \"Let us overwrite this coefficient with the value 4.\" << endl;\n//m.colwise().reverse()(1,0) = 4;\ncout << \"Now the matrix m is:\" << endl << m << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/class_FullPivLU.cpp",
    "content": "typedef Matrix<double, 5, 3> Matrix5x3;\ntypedef Matrix<double, 5, 5> Matrix5x5;\nMatrix5x3 m = Matrix5x3::Random();\ncout << \"Here is the matrix m:\" << endl << m << endl;\nEigen::FullPivLU<Matrix5x3> lu(m);\ncout << \"Here is, up to permutations, its LU decomposition matrix:\"\n     << endl << lu.matrixLU() << endl;\ncout << \"Here is the L part:\" << endl;\nMatrix5x5 l = Matrix5x5::Identity();\nl.block<5,3>(0,0).triangularView<StrictlyLower>() = lu.matrixLU();\ncout << l << endl;\ncout << \"Here is the U part:\" << endl;\nMatrix5x3 u = lu.matrixLU().triangularView<Upper>();\ncout << u << endl;\ncout << \"Let us now reconstruct the original matrix m:\" << endl;\ncout << lu.permutationP().inverse() * l * u * lu.permutationQ().inverse() << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/compile_snippet.cpp.in",
    "content": "#include <Eigen/Dense>\n#include <iostream>\n\nusing namespace Eigen;\nusing namespace std;\n\nint main(int, char**)\n{\n  cout.precision(3);\n  ${snippet_source_code}\n  return 0;\n}\n"
  },
  {
    "path": "libs/eigen/doc/snippets/tut_arithmetic_redux_minmax.cpp",
    "content": "  Matrix3f m = Matrix3f::Random();\n  std::ptrdiff_t i, j;\n  float minOfM = m.minCoeff(&i,&j);\n  cout << \"Here is the matrix m:\\n\" << m << endl;\n  cout << \"Its minimum coefficient (\" << minOfM \n       << \") is at position (\" << i << \",\" << j << \")\\n\\n\";\n\n  RowVector4i v = RowVector4i::Random();\n  int maxOfV = v.maxCoeff(&i);\n  cout << \"Here is the vector v: \" << v << endl;\n  cout << \"Its maximum coefficient (\" << maxOfV \n       << \") is at position \" << i << endl;\n"
  },
  {
    "path": "libs/eigen/doc/snippets/tut_arithmetic_transpose_aliasing.cpp",
    "content": "Matrix2i a; a << 1, 2, 3, 4;\ncout << \"Here is the matrix a:\\n\" << a << endl;\n\na = a.transpose(); // !!! do NOT do this !!!\ncout << \"and the result of the aliasing effect:\\n\" << a << endl;"
  },
  {
    "path": "libs/eigen/doc/snippets/tut_arithmetic_transpose_conjugate.cpp",
    "content": "MatrixXcf a = MatrixXcf::Random(2,2);\ncout << \"Here is the matrix a\\n\" << a << endl;\n\ncout << \"Here is the matrix a^T\\n\" << a.transpose() << endl;\n\n\ncout << \"Here is the conjugate of a\\n\" << a.conjugate() << endl;\n\n\ncout << \"Here is the matrix a^*\\n\" << a.adjoint() << endl;\n\n\n"
  },
  {
    "path": "libs/eigen/doc/snippets/tut_arithmetic_transpose_inplace.cpp",
    "content": "MatrixXf a(2,3); a << 1, 2, 3, 4, 5, 6;\ncout << \"Here is the initial matrix a:\\n\" << a << endl;\n\n\na.transposeInPlace();\ncout << \"and after being transposed:\\n\" << a << endl;"
  },
  {
    "path": "libs/eigen/doc/snippets/tut_matrix_assignment_resizing.cpp",
    "content": "MatrixXf a(2,2);\nstd::cout << \"a is of size \" << a.rows() << \"x\" << a.cols() << std::endl;\nMatrixXf b(3,3);\na = b;\nstd::cout << \"a is now of size \" << a.rows() << \"x\" << a.cols() << std::endl;\n"
  },
  {
    "path": "libs/eigen/doc/special_examples/CMakeLists.txt",
    "content": "if(NOT EIGEN_TEST_NOQT)\n  find_package(Qt4)\n  if(QT4_FOUND)\n    include(${QT_USE_FILE})\n  endif()\nendif(NOT EIGEN_TEST_NOQT)\n\nif(QT4_FOUND)\n  add_executable(Tutorial_sparse_example Tutorial_sparse_example.cpp Tutorial_sparse_example_details.cpp)\n  target_link_libraries(Tutorial_sparse_example ${EIGEN_STANDARD_LIBRARIES_TO_LINK_TO} ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY})\n\n  add_custom_command(\n    TARGET Tutorial_sparse_example\n    POST_BUILD\n    COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/../html/\n    COMMAND Tutorial_sparse_example ARGS ${CMAKE_CURRENT_BINARY_DIR}/../html/Tutorial_sparse_example.jpeg\n  )\n\n  add_dependencies(all_examples Tutorial_sparse_example)\nendif(QT4_FOUND)\n\n"
  },
  {
    "path": "libs/eigen/doc/special_examples/Tutorial_sparse_example.cpp",
    "content": "#include <Eigen/Sparse>\n#include <vector>\n\ntypedef Eigen::SparseMatrix<double> SpMat; // declares a column-major sparse matrix type of double\ntypedef Eigen::Triplet<double> T;\n\nvoid buildProblem(std::vector<T>& coefficients, Eigen::VectorXd& b, int n);\nvoid saveAsBitmap(const Eigen::VectorXd& x, int n, const char* filename);\n\nint main(int argc, char** argv)\n{\n  int n = 300;  // size of the image\n  int m = n*n;  // number of unknows (=number of pixels)\n\n  // Assembly:\n  std::vector<T> coefficients;            // list of non-zeros coefficients\n  Eigen::VectorXd b(m);                   // the right hand side-vector resulting from the constraints\n  buildProblem(coefficients, b, n);\n\n  SpMat A(m,m);\n  A.setFromTriplets(coefficients.begin(), coefficients.end());\n\n  // Solving:\n  Eigen::SimplicialCholesky<SpMat> chol(A);  // performs a Cholesky factorization of A\n  Eigen::VectorXd x = chol.solve(b);         // use the factorization to solve for the given right hand side\n\n  // Export the result to a file:\n  saveAsBitmap(x, n, argv[1]);\n\n  return 0;\n}\n\n"
  },
  {
    "path": "libs/eigen/doc/special_examples/Tutorial_sparse_example_details.cpp",
    "content": "#include <Eigen/Sparse>\n#include <vector>\n#include <QImage>\n\ntypedef Eigen::SparseMatrix<double> SpMat; // declares a column-major sparse matrix type of double\ntypedef Eigen::Triplet<double> T;\n\nvoid insertCoefficient(int id, int i, int j, double w, std::vector<T>& coeffs,\n                       Eigen::VectorXd& b, const Eigen::VectorXd& boundary)\n{\n  int n = boundary.size();\n  int id1 = i+j*n;\n\n        if(i==-1 || i==n) b(id) -= w * boundary(j); // constrained coefficient\n  else  if(j==-1 || j==n) b(id) -= w * boundary(i); // constrained coefficient\n  else  coeffs.push_back(T(id,id1,w));              // unknown coefficient\n}\n\nvoid buildProblem(std::vector<T>& coefficients, Eigen::VectorXd& b, int n)\n{\n  b.setZero();\n  Eigen::ArrayXd boundary = Eigen::ArrayXd::LinSpaced(n, 0,M_PI).sin().pow(2);\n  for(int j=0; j<n; ++j)\n  {\n    for(int i=0; i<n; ++i)\n    {\n      int id = i+j*n;\n      insertCoefficient(id, i-1,j, -1, coefficients, b, boundary);\n      insertCoefficient(id, i+1,j, -1, coefficients, b, boundary);\n      insertCoefficient(id, i,j-1, -1, coefficients, b, boundary);\n      insertCoefficient(id, i,j+1, -1, coefficients, b, boundary);\n      insertCoefficient(id, i,j,    4, coefficients, b, boundary);\n    }\n  }\n}\n\nvoid saveAsBitmap(const Eigen::VectorXd& x, int n, const char* filename)\n{\n  Eigen::Array<unsigned char,Eigen::Dynamic,Eigen::Dynamic> bits = (x*255).cast<unsigned char>();\n  QImage img(bits.data(), n,n,QImage::Format_Indexed8);\n  img.setColorCount(256);\n  for(int i=0;i<256;i++) img.setColor(i,qRgb(i,i,i));\n  img.save(filename);\n}\n"
  },
  {
    "path": "libs/eigen/doc/tutorial.cpp",
    "content": "#include <Eigen/Array>\n\nint main(int argc, char *argv[])\n{\n  std::cout.precision(2);\n\n  // demo static functions\n  Eigen::Matrix3f m3 = Eigen::Matrix3f::Random();\n  Eigen::Matrix4f m4 = Eigen::Matrix4f::Identity();\n\n  std::cout << \"*** Step 1 ***\\nm3:\\n\" << m3 << \"\\nm4:\\n\" << m4 << std::endl;\n\n  // demo non-static set... functions\n  m4.setZero();\n  m3.diagonal().setOnes();\n  \n  std::cout << \"*** Step 2 ***\\nm3:\\n\" << m3 << \"\\nm4:\\n\" << m4 << std::endl;\n\n  // demo fixed-size block() expression as lvalue and as rvalue\n  m4.block<3,3>(0,1) = m3;\n  m3.row(2) = m4.block<1,3>(2,0);\n\n  std::cout << \"*** Step 3 ***\\nm3:\\n\" << m3 << \"\\nm4:\\n\" << m4 << std::endl;\n\n  // demo dynamic-size block()\n  {\n    int rows = 3, cols = 3;\n    m4.block(0,1,3,3).setIdentity();\n    std::cout << \"*** Step 4 ***\\nm4:\\n\" << m4 << std::endl;\n  }\n\n  // demo vector blocks\n  m4.diagonal().block(1,2).setOnes();\n  std::cout << \"*** Step 5 ***\\nm4.diagonal():\\n\" << m4.diagonal() << std::endl;\n  std::cout << \"m4.diagonal().start(3)\\n\" << m4.diagonal().start(3) << std::endl;\n\n  // demo coeff-wise operations\n  m4 = m4.cwise()*m4;\n  m3 = m3.cwise().cos();\n  std::cout << \"*** Step 6 ***\\nm3:\\n\" << m3 << \"\\nm4:\\n\" << m4 << std::endl;\n\n  // sums of coefficients\n  std::cout << \"*** Step 7 ***\\n m4.sum(): \" << m4.sum() << std::endl;\n  std::cout << \"m4.col(2).sum(): \" << m4.col(2).sum() << std::endl;\n  std::cout << \"m4.colwise().sum():\\n\" << m4.colwise().sum() << std::endl;\n  std::cout << \"m4.rowwise().sum():\\n\" << m4.rowwise().sum() << std::endl;\n\n  // demo intelligent auto-evaluation\n  m4 = m4 * m4; // auto-evaluates so no aliasing problem (performance penalty is low)\n  Eigen::Matrix4f other = (m4 * m4).lazy(); // forces lazy evaluation\n  m4 = m4 + m4; // here Eigen goes for lazy evaluation, as with most expressions\n  m4 = -m4 + m4 + 5 * m4; // same here, Eigen chooses lazy evaluation for all that.\n  m4 = m4 * (m4 + m4); // here Eigen chooses to first evaluate m4 + m4 into a temporary.\n                       // indeed, here it is an optimization to cache this intermediate result.\n  m3 = m3 * m4.block<3,3>(1,1); // here Eigen chooses NOT to evaluate block() into a temporary\n    // because accessing coefficients of that block expression is not more costly than accessing\n    // coefficients of a plain matrix.\n  m4 = m4 * m4.transpose(); // same here, lazy evaluation of the transpose.\n  m4 = m4 * m4.transpose().eval(); // forces immediate evaluation of the transpose\n\n  std::cout << \"*** Step 8 ***\\nm3:\\n\" << m3 << \"\\nm4:\\n\" << m4 << std::endl;\n}\n"
  },
  {
    "path": "libs/eigen/eigen3.pc.in",
    "content": "prefix=@CMAKE_INSTALL_PREFIX@\nexec_prefix=${prefix}\n\nName: Eigen3\nDescription: A C++ template library for linear algebra: vectors, matrices, and related algorithms\nRequires:\nVersion: @EIGEN_VERSION_NUMBER@\nLibs:\nCflags: -I${prefix}/@INCLUDE_INSTALL_DIR@\n"
  },
  {
    "path": "libs/eigen/failtest/CMakeLists.txt",
    "content": "message(STATUS \"Running the failtests\")\n\nei_add_failtest(\"failtest_sanity_check\")\n\nei_add_failtest(\"block_nonconst_ctor_on_const_xpr_0\")\nei_add_failtest(\"block_nonconst_ctor_on_const_xpr_1\")\nei_add_failtest(\"block_nonconst_ctor_on_const_xpr_2\")\nei_add_failtest(\"transpose_nonconst_ctor_on_const_xpr\")\nei_add_failtest(\"diagonal_nonconst_ctor_on_const_xpr\")\n\nei_add_failtest(\"const_qualified_block_method_retval_0\")\nei_add_failtest(\"const_qualified_block_method_retval_1\")\nei_add_failtest(\"const_qualified_transpose_method_retval\")\nei_add_failtest(\"const_qualified_diagonal_method_retval\")\n\nei_add_failtest(\"map_nonconst_ctor_on_const_ptr_0\")\nei_add_failtest(\"map_nonconst_ctor_on_const_ptr_1\")\nei_add_failtest(\"map_nonconst_ctor_on_const_ptr_2\")\nei_add_failtest(\"map_nonconst_ctor_on_const_ptr_3\")\nei_add_failtest(\"map_nonconst_ctor_on_const_ptr_4\")\n\nei_add_failtest(\"map_on_const_type_actually_const_0\")\nei_add_failtest(\"map_on_const_type_actually_const_1\")\nei_add_failtest(\"block_on_const_type_actually_const_0\")\nei_add_failtest(\"block_on_const_type_actually_const_1\")\nei_add_failtest(\"transpose_on_const_type_actually_const\")\nei_add_failtest(\"diagonal_on_const_type_actually_const\")\n\nei_add_failtest(\"ref_1\")\nei_add_failtest(\"ref_2\")\nei_add_failtest(\"ref_3\")\nei_add_failtest(\"ref_4\")\nei_add_failtest(\"ref_5\")\n\nei_add_failtest(\"partialpivlu_int\")\nei_add_failtest(\"fullpivlu_int\")\nei_add_failtest(\"llt_int\")\nei_add_failtest(\"ldlt_int\")\nei_add_failtest(\"qr_int\")\nei_add_failtest(\"colpivqr_int\")\nei_add_failtest(\"fullpivqr_int\")\nei_add_failtest(\"jacobisvd_int\")\nei_add_failtest(\"eigensolver_int\")\nei_add_failtest(\"eigensolver_cplx\")\n\nif (EIGEN_FAILTEST_FAILURE_COUNT)\n  message(FATAL_ERROR\n          \"${EIGEN_FAILTEST_FAILURE_COUNT} out of ${EIGEN_FAILTEST_COUNT} failtests FAILED. \"\n          \"To debug these failures, manually compile these programs in ${CMAKE_CURRENT_SOURCE_DIR}, \"\n          \"with and without #define EIGEN_SHOULD_FAIL_TO_BUILD.\")\nelse()\n  message(STATUS \"Failtest SUCCESS: all ${EIGEN_FAILTEST_COUNT} failtests passed.\")\n  message(STATUS \"\")\nendif()\n"
  },
  {
    "path": "libs/eigen/failtest/block_nonconst_ctor_on_const_xpr_0.cpp",
    "content": "#include \"../Eigen/Core\"\n\n#ifdef EIGEN_SHOULD_FAIL_TO_BUILD\n#define CV_QUALIFIER const\n#else\n#define CV_QUALIFIER\n#endif\n\nusing namespace Eigen;\n\nvoid foo(CV_QUALIFIER Matrix3d &m){\n    Block<Matrix3d,3,3> b(m,0,0);\n}\n\nint main() {}\n"
  },
  {
    "path": "libs/eigen/failtest/block_nonconst_ctor_on_const_xpr_1.cpp",
    "content": "#include \"../Eigen/Core\"\n\n#ifdef EIGEN_SHOULD_FAIL_TO_BUILD\n#define CV_QUALIFIER const\n#else\n#define CV_QUALIFIER\n#endif\n\nusing namespace Eigen;\n\nvoid foo(CV_QUALIFIER Matrix3d &m){\n    Block<Matrix3d> b(m,0,0,3,3);\n}\n\nint main() {}\n"
  },
  {
    "path": "libs/eigen/failtest/block_nonconst_ctor_on_const_xpr_2.cpp",
    "content": "#include \"../Eigen/Core\"\n\n#ifdef EIGEN_SHOULD_FAIL_TO_BUILD\n#define CV_QUALIFIER const\n#else\n#define CV_QUALIFIER\n#endif\n\nusing namespace Eigen;\n\nvoid foo(CV_QUALIFIER Matrix3d &m){\n    // row/column constructor\n    Block<Matrix3d,3,1> b(m,0);\n}\n\nint main() {}\n"
  },
  {
    "path": "libs/eigen/failtest/block_on_const_type_actually_const_0.cpp",
    "content": "#include \"../Eigen/Core\"\n\n#ifdef EIGEN_SHOULD_FAIL_TO_BUILD\n#define CV_QUALIFIER const\n#else\n#define CV_QUALIFIER\n#endif\n\nusing namespace Eigen;\n\nvoid foo(){\n    Matrix3f m;\n    Block<CV_QUALIFIER Matrix3f>(m, 0, 0, 3, 3).coeffRef(0, 0) = 1.0f;\n}\n\nint main() {}\n"
  },
  {
    "path": "libs/eigen/failtest/block_on_const_type_actually_const_1.cpp",
    "content": "#include \"../Eigen/Core\"\n\n#ifdef EIGEN_SHOULD_FAIL_TO_BUILD\n#define CV_QUALIFIER const\n#else\n#define CV_QUALIFIER\n#endif\n\nusing namespace Eigen;\n\nvoid foo(){\n    MatrixXf m;\n    Block<CV_QUALIFIER MatrixXf, 3, 3>(m, 0, 0).coeffRef(0, 0) = 1.0f;\n}\n\nint main() {}\n"
  },
  {
    "path": "libs/eigen/failtest/colpivqr_int.cpp",
    "content": "#include \"../Eigen/QR\"\n\n#ifdef EIGEN_SHOULD_FAIL_TO_BUILD\n#define SCALAR int\n#else\n#define SCALAR float\n#endif\n\nusing namespace Eigen;\n\nint main()\n{\n  ColPivHouseholderQR<Matrix<SCALAR,Dynamic,Dynamic> > qr(Matrix<SCALAR,Dynamic,Dynamic>::Random(10,10));\n}\n"
  },
  {
    "path": "libs/eigen/failtest/const_qualified_block_method_retval_0.cpp",
    "content": "#include \"../Eigen/Core\"\n\n#ifdef EIGEN_SHOULD_FAIL_TO_BUILD\n#define CV_QUALIFIER const\n#else\n#define CV_QUALIFIER\n#endif\n\nusing namespace Eigen;\n\nvoid foo(CV_QUALIFIER Matrix3d &m){\n    Block<Matrix3d,3,3> b(m.block<3,3>(0,0));\n}\n\nint main() {}\n"
  },
  {
    "path": "libs/eigen/failtest/const_qualified_block_method_retval_1.cpp",
    "content": "#include \"../Eigen/Core\"\n\n#ifdef EIGEN_SHOULD_FAIL_TO_BUILD\n#define CV_QUALIFIER const\n#else\n#define CV_QUALIFIER\n#endif\n\nusing namespace Eigen;\n\nvoid foo(CV_QUALIFIER Matrix3d &m){\n    Block<Matrix3d> b(m.block(0,0,3,3));\n}\n\nint main() {}\n"
  },
  {
    "path": "libs/eigen/failtest/const_qualified_diagonal_method_retval.cpp",
    "content": "#include \"../Eigen/Core\"\n\n#ifdef EIGEN_SHOULD_FAIL_TO_BUILD\n#define CV_QUALIFIER const\n#else\n#define CV_QUALIFIER\n#endif\n\nusing namespace Eigen;\n\nvoid foo(CV_QUALIFIER Matrix3d &m){\n    Diagonal<Matrix3d> b(m.diagonal());\n}\n\nint main() {}\n"
  },
  {
    "path": "libs/eigen/failtest/const_qualified_transpose_method_retval.cpp",
    "content": "#include \"../Eigen/Core\"\n\n#ifdef EIGEN_SHOULD_FAIL_TO_BUILD\n#define CV_QUALIFIER const\n#else\n#define CV_QUALIFIER\n#endif\n\nusing namespace Eigen;\n\nvoid foo(CV_QUALIFIER Matrix3d &m){\n    Transpose<Matrix3d> b(m.transpose());\n}\n\nint main() {}\n"
  },
  {
    "path": "libs/eigen/failtest/diagonal_nonconst_ctor_on_const_xpr.cpp",
    "content": "#include \"../Eigen/Core\"\n\n#ifdef EIGEN_SHOULD_FAIL_TO_BUILD\n#define CV_QUALIFIER const\n#else\n#define CV_QUALIFIER\n#endif\n\nusing namespace Eigen;\n\nvoid foo(CV_QUALIFIER Matrix3d &m){\n    Diagonal<Matrix3d> d(m);\n}\n\nint main() {}\n"
  },
  {
    "path": "libs/eigen/failtest/diagonal_on_const_type_actually_const.cpp",
    "content": "#include \"../Eigen/Core\"\n\n#ifdef EIGEN_SHOULD_FAIL_TO_BUILD\n#define CV_QUALIFIER const\n#else\n#define CV_QUALIFIER\n#endif\n\nusing namespace Eigen;\n\nvoid foo(){\n    MatrixXf m;\n    Diagonal<CV_QUALIFIER MatrixXf>(m).coeffRef(0) = 1.0f;\n}\n\nint main() {}\n"
  },
  {
    "path": "libs/eigen/failtest/eigensolver_cplx.cpp",
    "content": "#include \"../Eigen/Eigenvalues\"\n\n#ifdef EIGEN_SHOULD_FAIL_TO_BUILD\n#define SCALAR std::complex<double>\n#else\n#define SCALAR float\n#endif\n\nusing namespace Eigen;\n\nint main()\n{\n  EigenSolver<Matrix<SCALAR,Dynamic,Dynamic> > eig(Matrix<SCALAR,Dynamic,Dynamic>::Random(10,10));\n}\n"
  },
  {
    "path": "libs/eigen/failtest/eigensolver_int.cpp",
    "content": "#include \"../Eigen/Eigenvalues\"\n\n#ifdef EIGEN_SHOULD_FAIL_TO_BUILD\n#define SCALAR int\n#else\n#define SCALAR float\n#endif\n\nusing namespace Eigen;\n\nint main()\n{\n  EigenSolver<Matrix<SCALAR,Dynamic,Dynamic> > eig(Matrix<SCALAR,Dynamic,Dynamic>::Random(10,10));\n}\n"
  },
  {
    "path": "libs/eigen/failtest/failtest_sanity_check.cpp",
    "content": "#ifdef EIGEN_SHOULD_FAIL_TO_BUILD\nThis is just some text that won't compile as a C++ file, as a basic sanity check for failtest.\n#else\nint main() {}\n#endif\n"
  },
  {
    "path": "libs/eigen/failtest/fullpivlu_int.cpp",
    "content": "#include \"../Eigen/LU\"\n\n#ifdef EIGEN_SHOULD_FAIL_TO_BUILD\n#define SCALAR int\n#else\n#define SCALAR float\n#endif\n\nusing namespace Eigen;\n\nint main()\n{\n  FullPivLU<Matrix<SCALAR,Dynamic,Dynamic> > lu(Matrix<SCALAR,Dynamic,Dynamic>::Random(10,10));\n}\n"
  },
  {
    "path": "libs/eigen/failtest/fullpivqr_int.cpp",
    "content": "#include \"../Eigen/QR\"\n\n#ifdef EIGEN_SHOULD_FAIL_TO_BUILD\n#define SCALAR int\n#else\n#define SCALAR float\n#endif\n\nusing namespace Eigen;\n\nint main()\n{\n  FullPivHouseholderQR<Matrix<SCALAR,Dynamic,Dynamic> > qr(Matrix<SCALAR,Dynamic,Dynamic>::Random(10,10));\n}\n"
  },
  {
    "path": "libs/eigen/failtest/jacobisvd_int.cpp",
    "content": "#include \"../Eigen/SVD\"\n\n#ifdef EIGEN_SHOULD_FAIL_TO_BUILD\n#define SCALAR int\n#else\n#define SCALAR float\n#endif\n\nusing namespace Eigen;\n\nint main()\n{\n  JacobiSVD<Matrix<SCALAR,Dynamic,Dynamic> > qr(Matrix<SCALAR,Dynamic,Dynamic>::Random(10,10));\n}\n"
  },
  {
    "path": "libs/eigen/failtest/ldlt_int.cpp",
    "content": "#include \"../Eigen/Cholesky\"\n\n#ifdef EIGEN_SHOULD_FAIL_TO_BUILD\n#define SCALAR int\n#else\n#define SCALAR float\n#endif\n\nusing namespace Eigen;\n\nint main()\n{\n  LDLT<Matrix<SCALAR,Dynamic,Dynamic> > ldlt(Matrix<SCALAR,Dynamic,Dynamic>::Random(10,10));\n}\n"
  },
  {
    "path": "libs/eigen/failtest/llt_int.cpp",
    "content": "#include \"../Eigen/Cholesky\"\n\n#ifdef EIGEN_SHOULD_FAIL_TO_BUILD\n#define SCALAR int\n#else\n#define SCALAR float\n#endif\n\nusing namespace Eigen;\n\nint main()\n{\n  LLT<Matrix<SCALAR,Dynamic,Dynamic> > llt(Matrix<SCALAR,Dynamic,Dynamic>::Random(10,10));\n}\n"
  },
  {
    "path": "libs/eigen/failtest/map_nonconst_ctor_on_const_ptr_0.cpp",
    "content": "#include \"../Eigen/Core\"\n\n#ifdef EIGEN_SHOULD_FAIL_TO_BUILD\n#define CV_QUALIFIER const\n#else\n#define CV_QUALIFIER\n#endif\n\nusing namespace Eigen;\n\nvoid foo(CV_QUALIFIER float *ptr){\n    Map<Matrix3f> m(ptr);\n}\n\nint main() {}\n"
  },
  {
    "path": "libs/eigen/failtest/map_nonconst_ctor_on_const_ptr_1.cpp",
    "content": "#include \"../Eigen/Core\"\n\n#ifdef EIGEN_SHOULD_FAIL_TO_BUILD\n#define CV_QUALIFIER const\n#else\n#define CV_QUALIFIER\n#endif\n\nusing namespace Eigen;\n\nvoid foo(CV_QUALIFIER float *ptr, DenseIndex size){\n    Map<ArrayXf> m(ptr, size);\n}\n\nint main() {}\n"
  },
  {
    "path": "libs/eigen/failtest/map_nonconst_ctor_on_const_ptr_2.cpp",
    "content": "#include \"../Eigen/Core\"\n\n#ifdef EIGEN_SHOULD_FAIL_TO_BUILD\n#define CV_QUALIFIER const\n#else\n#define CV_QUALIFIER\n#endif\n\nusing namespace Eigen;\n\nvoid foo(CV_QUALIFIER float *ptr, DenseIndex rows, DenseIndex cols){\n    Map<MatrixXf> m(ptr, rows, cols);\n}\n\nint main() {}\n"
  },
  {
    "path": "libs/eigen/failtest/map_nonconst_ctor_on_const_ptr_3.cpp",
    "content": "#include \"../Eigen/Core\"\n\n#ifdef EIGEN_SHOULD_FAIL_TO_BUILD\n#define CV_QUALIFIER const\n#else\n#define CV_QUALIFIER\n#endif\n\nusing namespace Eigen;\n\nvoid foo(CV_QUALIFIER float *ptr, DenseIndex rows, DenseIndex cols){\n    Map<MatrixXf, Aligned, InnerStride<2> > m(ptr, rows, cols, InnerStride<2>());\n}\n\nint main() {}\n"
  },
  {
    "path": "libs/eigen/failtest/map_nonconst_ctor_on_const_ptr_4.cpp",
    "content": "#include \"../Eigen/Core\"\n\n#ifdef EIGEN_SHOULD_FAIL_TO_BUILD\n#define CV_QUALIFIER\n#else\n#define CV_QUALIFIER const\n#endif\n\nusing namespace Eigen;\n\nvoid foo(const float *ptr, DenseIndex rows, DenseIndex cols){\n    Map<CV_QUALIFIER MatrixXf, Unaligned, OuterStride<> > m(ptr, rows, cols, OuterStride<>(2));\n}\n\nint main() {}\n"
  },
  {
    "path": "libs/eigen/failtest/map_on_const_type_actually_const_0.cpp",
    "content": "#include \"../Eigen/Core\"\n\n#ifdef EIGEN_SHOULD_FAIL_TO_BUILD\n#define CV_QUALIFIER const\n#else\n#define CV_QUALIFIER\n#endif\n\nusing namespace Eigen;\n\nvoid foo(float *ptr){\n    Map<CV_QUALIFIER MatrixXf>(ptr, 1, 1).coeffRef(0,0) = 1.0f;\n}\n\nint main() {}\n"
  },
  {
    "path": "libs/eigen/failtest/map_on_const_type_actually_const_1.cpp",
    "content": "#include \"../Eigen/Core\"\n\n#ifdef EIGEN_SHOULD_FAIL_TO_BUILD\n#define CV_QUALIFIER const\n#else\n#define CV_QUALIFIER\n#endif\n\nusing namespace Eigen;\n\nvoid foo(float *ptr){\n    Map<CV_QUALIFIER Vector3f>(ptr).coeffRef(0) = 1.0f;\n}\n\nint main() {}\n"
  },
  {
    "path": "libs/eigen/failtest/partialpivlu_int.cpp",
    "content": "#include \"../Eigen/LU\"\n\n#ifdef EIGEN_SHOULD_FAIL_TO_BUILD\n#define SCALAR int\n#else\n#define SCALAR float\n#endif\n\nusing namespace Eigen;\n\nint main()\n{\n  PartialPivLU<Matrix<SCALAR,Dynamic,Dynamic> > lu(Matrix<SCALAR,Dynamic,Dynamic>::Random(10,10));\n}\n"
  },
  {
    "path": "libs/eigen/failtest/qr_int.cpp",
    "content": "#include \"../Eigen/QR\"\n\n#ifdef EIGEN_SHOULD_FAIL_TO_BUILD\n#define SCALAR int\n#else\n#define SCALAR float\n#endif\n\nusing namespace Eigen;\n\nint main()\n{\n  HouseholderQR<Matrix<SCALAR,Dynamic,Dynamic> > qr(Matrix<SCALAR,Dynamic,Dynamic>::Random(10,10));\n}\n"
  },
  {
    "path": "libs/eigen/failtest/ref_1.cpp",
    "content": "#include \"../Eigen/Core\"\n\n#ifdef EIGEN_SHOULD_FAIL_TO_BUILD\n#define CV_QUALIFIER const\n#else\n#define CV_QUALIFIER\n#endif\n\nusing namespace Eigen;\n\nvoid call_ref(Ref<VectorXf> a) { }\n\nint main()\n{\n  VectorXf a(10);\n  CV_QUALIFIER VectorXf& ac(a);\n  call_ref(ac);\n}\n"
  },
  {
    "path": "libs/eigen/failtest/ref_2.cpp",
    "content": "#include \"../Eigen/Core\"\n\nusing namespace Eigen;\n\nvoid call_ref(Ref<VectorXf> a) { }\n\nint main()\n{\n  MatrixXf A(10,10);\n#ifdef EIGEN_SHOULD_FAIL_TO_BUILD\n  call_ref(A.row(3));\n#else\n  call_ref(A.col(3));\n#endif\n}\n"
  },
  {
    "path": "libs/eigen/failtest/ref_3.cpp",
    "content": "#include \"../Eigen/Core\"\n\nusing namespace Eigen;\n\n#ifdef EIGEN_SHOULD_FAIL_TO_BUILD\nvoid call_ref(Ref<VectorXf> a) { }\n#else\nvoid call_ref(const Ref<const VectorXf> &a) { }\n#endif\n\nint main()\n{\n  VectorXf a(10);\n  call_ref(a+a);\n}\n"
  },
  {
    "path": "libs/eigen/failtest/ref_4.cpp",
    "content": "#include \"../Eigen/Core\"\n\nusing namespace Eigen;\n\nvoid call_ref(Ref<MatrixXf,0,OuterStride<> > a) {}\n\nint main()\n{\n  MatrixXf A(10,10);\n#ifdef EIGEN_SHOULD_FAIL_TO_BUILD\n  call_ref(A.transpose());\n#else\n  call_ref(A);\n#endif\n}\n"
  },
  {
    "path": "libs/eigen/failtest/ref_5.cpp",
    "content": "#include \"../Eigen/Core\"\n\nusing namespace Eigen;\n\nvoid call_ref(Ref<VectorXf> a) { }\n\nint main()\n{\n  VectorXf a(10);\n  DenseBase<VectorXf> &ac(a);\n#ifdef EIGEN_SHOULD_FAIL_TO_BUILD\n  call_ref(ac);\n#else\n  call_ref(ac.derived());\n#endif\n}\n"
  },
  {
    "path": "libs/eigen/failtest/transpose_nonconst_ctor_on_const_xpr.cpp",
    "content": "#include \"../Eigen/Core\"\n\n#ifdef EIGEN_SHOULD_FAIL_TO_BUILD\n#define CV_QUALIFIER const\n#else\n#define CV_QUALIFIER\n#endif\n\nusing namespace Eigen;\n\nvoid foo(CV_QUALIFIER Matrix3d &m){\n    Transpose<Matrix3d> t(m);\n}\n\nint main() {}\n"
  },
  {
    "path": "libs/eigen/failtest/transpose_on_const_type_actually_const.cpp",
    "content": "#include \"../Eigen/Core\"\n\n#ifdef EIGEN_SHOULD_FAIL_TO_BUILD\n#define CV_QUALIFIER const\n#else\n#define CV_QUALIFIER\n#endif\n\nusing namespace Eigen;\n\nvoid foo(){\n    MatrixXf m;\n    Transpose<CV_QUALIFIER MatrixXf>(m).coeffRef(0, 0) = 1.0f;\n}\n\nint main() {}\n"
  },
  {
    "path": "libs/eigen/lapack/CMakeLists.txt",
    "content": "\nproject(EigenLapack CXX)\n\ninclude(\"../cmake/language_support.cmake\")\n\nworkaround_9220(Fortran EIGEN_Fortran_COMPILER_WORKS)\n\nif(EIGEN_Fortran_COMPILER_WORKS)\n  enable_language(Fortran OPTIONAL)\n  if(NOT CMAKE_Fortran_COMPILER)\n    set(EIGEN_Fortran_COMPILER_WORKS OFF)\n  endif()\nendif()\n\nadd_custom_target(lapack)\ninclude_directories(../blas)\n\nset(EigenLapack_SRCS\nsingle.cpp double.cpp complex_single.cpp complex_double.cpp ../blas/xerbla.cpp\n)\n\nif(EIGEN_Fortran_COMPILER_WORKS)\n\nset(EigenLapack_SRCS  ${EigenLapack_SRCS}\n  slarft.f  dlarft.f  clarft.f  zlarft.f\n  slarfb.f  dlarfb.f  clarfb.f  zlarfb.f\n  slarfg.f  dlarfg.f  clarfg.f  zlarfg.f\n  slarf.f   dlarf.f   clarf.f   zlarf.f\n  sladiv.f  dladiv.f  cladiv.f  zladiv.f\n  ilaslr.f  iladlr.f  ilaclr.f  ilazlr.f\n  ilaslc.f  iladlc.f  ilaclc.f  ilazlc.f\n  dlapy2.f  dlapy3.f  slapy2.f  slapy3.f\n  clacgv.f  zlacgv.f\n  slamch.f  dlamch.f\n  second_NONE.f dsecnd_NONE.f\n)\n\noption(EIGEN_ENABLE_LAPACK_TESTS OFF \"Enbale the Lapack unit tests\")\n\nif(EIGEN_ENABLE_LAPACK_TESTS)\n\n  get_filename_component(eigen_full_path_to_reference_lapack \"./reference/\" ABSOLUTE)\n  if(NOT EXISTS ${eigen_full_path_to_reference_lapack})\n    # Download lapack and install sources and testing at the right place\n    message(STATUS \"Download lapack_addons_3.4.1.tgz...\")\n    \n    file(DOWNLOAD \"http://downloads.tuxfamily.org/eigen/lapack_addons_3.4.1.tgz\"\n                  \"${CMAKE_CURRENT_SOURCE_DIR}/lapack_addons_3.4.1.tgz\"\n                  INACTIVITY_TIMEOUT 15\n                  TIMEOUT 240\n                  STATUS download_status\n                  EXPECTED_MD5 5758ce55afcf79da98de8b9de1615ad5\n                  SHOW_PROGRESS)\n                  \n    message(STATUS ${download_status})\n    list(GET download_status 0 download_status_num)\n    set(download_status_num 0)\n    if(download_status_num EQUAL 0)\n      message(STATUS \"Setup lapack reference and lapack unit tests\")\n      execute_process(COMMAND tar xzf  \"lapack_addons_3.4.1.tgz\" WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})\n    else()\n      message(STATUS \"Download of lapack_addons_3.4.1.tgz failed, LAPACK unit tests wont be enabled\")\n      set(EIGEN_ENABLE_LAPACK_TESTS false)\n    endif()\n                  \n  endif()\n  \n  get_filename_component(eigen_full_path_to_reference_lapack \"./reference/\" ABSOLUTE)\n  if(EXISTS ${eigen_full_path_to_reference_lapack})\n    set(EigenLapack_funcfilenames\n        ssyev.f   dsyev.f   csyev.f   zsyev.f\n        spotrf.f  dpotrf.f  cpotrf.f  zpotrf.f\n        spotrs.f  dpotrs.f  cpotrs.f  zpotrs.f\n        sgetrf.f  dgetrf.f  cgetrf.f  zgetrf.f\n        sgetrs.f  dgetrs.f  cgetrs.f  zgetrs.f)\n    \n    FILE(GLOB ReferenceLapack_SRCS0 RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} \"reference/*.f\")\n    foreach(filename1 IN LISTS ReferenceLapack_SRCS0)\n      string(REPLACE \"reference/\" \"\" filename ${filename1})\n      list(FIND EigenLapack_SRCS ${filename} id1)\n      list(FIND EigenLapack_funcfilenames ${filename} id2)\n      if((id1 EQUAL -1) AND (id2 EQUAL -1))\n        set(ReferenceLapack_SRCS ${ReferenceLapack_SRCS} reference/${filename})\n      endif()\n    endforeach()\n  endif()\n  \n  \nendif(EIGEN_ENABLE_LAPACK_TESTS)\n\nendif(EIGEN_Fortran_COMPILER_WORKS)\n\nadd_library(eigen_lapack_static ${EigenLapack_SRCS} ${ReferenceLapack_SRCS})\nadd_library(eigen_lapack SHARED ${EigenLapack_SRCS})\n\ntarget_link_libraries(eigen_lapack  eigen_blas)\n\nif(EIGEN_STANDARD_LIBRARIES_TO_LINK_TO)\n  target_link_libraries(eigen_lapack_static ${EIGEN_STANDARD_LIBRARIES_TO_LINK_TO})\n  target_link_libraries(eigen_lapack        ${EIGEN_STANDARD_LIBRARIES_TO_LINK_TO})\nendif()\n\nadd_dependencies(lapack eigen_lapack eigen_lapack_static)\n\ninstall(TARGETS eigen_lapack eigen_lapack_static\n        RUNTIME DESTINATION bin\n        LIBRARY DESTINATION lib\n        ARCHIVE DESTINATION lib)\n\n        \n        \nget_filename_component(eigen_full_path_to_testing_lapack \"./testing/\" ABSOLUTE)\nif(EXISTS ${eigen_full_path_to_testing_lapack})\n  \n  # The following comes from lapack/TESTING/CMakeLists.txt\n  # Get Python\n  find_package(PythonInterp)\n  message(STATUS \"Looking for Python found - ${PYTHONINTERP_FOUND}\")\n  if (PYTHONINTERP_FOUND)\n    message(STATUS \"Using Python version ${PYTHON_VERSION_STRING}\")\n  endif()\n\n  set(LAPACK_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})\n  set(LAPACK_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})\n  set(BUILD_SINGLE      true)\n  set(BUILD_DOUBLE      true)\n  set(BUILD_COMPLEX     true)\n  set(BUILD_COMPLEX16E  true)\n  \n  if(MSVC_VERSION)\n#  string(REPLACE \"/STACK:10000000\" \"/STACK:900000000000000000\"\n#    CMAKE_EXE_LINKER_FLAGS \"${CMAKE_EXE_LINKER_FLAGS}\")\n  string(REGEX REPLACE \"(.*)/STACK:(.*) (.*)\" \"\\\\1/STACK:900000000000000000 \\\\3\"\n    CMAKE_EXE_LINKER_FLAGS \"${CMAKE_EXE_LINKER_FLAGS}\")\n  endif()\n  add_subdirectory(testing/MATGEN)\n  add_subdirectory(testing/LIN)\n  add_subdirectory(testing/EIG)\n  macro(add_lapack_test output input target)\n    set(TEST_INPUT \"${LAPACK_SOURCE_DIR}/testing/${input}\")\n    set(TEST_OUTPUT \"${LAPACK_BINARY_DIR}/testing/${output}\")\n    get_target_property(TEST_LOC ${target} LOCATION)\n    string(REPLACE \".\" \"_\" input_name ${input})\n    set(testName \"${target}_${input_name}\")\n    if(EXISTS \"${TEST_INPUT}\")\n      add_test(LAPACK-${testName} \"${CMAKE_COMMAND}\"\n        -DTEST=${TEST_LOC}\n        -DINPUT=${TEST_INPUT} \n        -DOUTPUT=${TEST_OUTPUT} \n        -DINTDIR=${CMAKE_CFG_INTDIR}\n        -P \"${LAPACK_SOURCE_DIR}/testing/runtest.cmake\")\n    endif()\n  endmacro(add_lapack_test)\n\n  if (BUILD_SINGLE)\n  add_lapack_test(stest.out stest.in xlintsts)\n  #\n  # ======== SINGLE RFP LIN TESTS ========================\n  add_lapack_test(stest_rfp.out stest_rfp.in xlintstrfs)\n  #\n  #\n  # ======== SINGLE EIG TESTS ===========================\n  #\n\n  add_lapack_test(snep.out nep.in xeigtsts)\n\n\n  add_lapack_test(ssep.out sep.in xeigtsts)\n\n\n  add_lapack_test(ssvd.out svd.in xeigtsts)\n\n\n  add_lapack_test(sec.out sec.in xeigtsts)\n\n\n  add_lapack_test(sed.out sed.in xeigtsts)\n\n\n  add_lapack_test(sgg.out sgg.in xeigtsts)\n\n\n  add_lapack_test(sgd.out sgd.in xeigtsts)\n\n\n  add_lapack_test(ssb.out ssb.in xeigtsts)\n\n\n  add_lapack_test(ssg.out ssg.in xeigtsts)\n\n\n  add_lapack_test(sbal.out sbal.in xeigtsts)\n\n\n  add_lapack_test(sbak.out sbak.in xeigtsts)\n\n\n  add_lapack_test(sgbal.out sgbal.in xeigtsts)\n\n\n  add_lapack_test(sgbak.out sgbak.in xeigtsts)\n\n\n  add_lapack_test(sbb.out sbb.in xeigtsts)\n\n\n  add_lapack_test(sglm.out glm.in xeigtsts)\n\n\n  add_lapack_test(sgqr.out gqr.in xeigtsts)\n\n\n  add_lapack_test(sgsv.out gsv.in xeigtsts)\n\n\n  add_lapack_test(scsd.out csd.in xeigtsts)\n\n\n  add_lapack_test(slse.out lse.in xeigtsts)\n  endif()\n\n  if (BUILD_DOUBLE)\n  #\n  # ======== DOUBLE LIN TESTS ===========================\n  add_lapack_test(dtest.out dtest.in xlintstd)\n  #\n  # ======== DOUBLE RFP LIN TESTS ========================\n  add_lapack_test(dtest_rfp.out dtest_rfp.in xlintstrfd)\n  #\n  # ======== DOUBLE EIG TESTS ===========================\n\n  add_lapack_test(dnep.out nep.in xeigtstd)\n\n\n  add_lapack_test(dsep.out sep.in xeigtstd)\n\n\n  add_lapack_test(dsvd.out svd.in xeigtstd)\n\n\n  add_lapack_test(dec.out dec.in xeigtstd)\n\n\n  add_lapack_test(ded.out ded.in xeigtstd)\n\n\n  add_lapack_test(dgg.out dgg.in xeigtstd)\n\n\n  add_lapack_test(dgd.out dgd.in xeigtstd)\n\n\n  add_lapack_test(dsb.out dsb.in xeigtstd)\n\n\n  add_lapack_test(dsg.out dsg.in xeigtstd)\n\n\n  add_lapack_test(dbal.out dbal.in xeigtstd)\n\n\n  add_lapack_test(dbak.out dbak.in xeigtstd)\n\n\n  add_lapack_test(dgbal.out dgbal.in xeigtstd)\n\n\n  add_lapack_test(dgbak.out dgbak.in xeigtstd)\n\n\n  add_lapack_test(dbb.out dbb.in xeigtstd)\n\n\n  add_lapack_test(dglm.out glm.in xeigtstd)\n\n\n  add_lapack_test(dgqr.out gqr.in xeigtstd)\n\n\n  add_lapack_test(dgsv.out gsv.in xeigtstd)\n\n\n  add_lapack_test(dcsd.out csd.in xeigtstd)\n\n\n  add_lapack_test(dlse.out lse.in xeigtstd)\n  endif()\n\n  if (BUILD_COMPLEX)\n  add_lapack_test(ctest.out ctest.in xlintstc)\n  #\n  # ======== COMPLEX RFP LIN TESTS ========================\n  add_lapack_test(ctest_rfp.out ctest_rfp.in xlintstrfc)\n  #\n  # ======== COMPLEX EIG TESTS ===========================\n\n  add_lapack_test(cnep.out nep.in xeigtstc)\n\n\n  add_lapack_test(csep.out sep.in xeigtstc)\n\n\n  add_lapack_test(csvd.out svd.in xeigtstc)\n\n\n  add_lapack_test(cec.out cec.in xeigtstc)\n\n\n  add_lapack_test(ced.out ced.in xeigtstc)\n\n\n  add_lapack_test(cgg.out cgg.in xeigtstc)\n\n\n  add_lapack_test(cgd.out cgd.in xeigtstc)\n\n\n  add_lapack_test(csb.out csb.in xeigtstc)\n\n\n  add_lapack_test(csg.out csg.in xeigtstc)\n\n\n  add_lapack_test(cbal.out cbal.in xeigtstc)\n\n\n  add_lapack_test(cbak.out cbak.in xeigtstc)\n\n\n  add_lapack_test(cgbal.out cgbal.in xeigtstc)\n\n\n  add_lapack_test(cgbak.out cgbak.in xeigtstc)\n\n\n  add_lapack_test(cbb.out cbb.in xeigtstc)\n\n\n  add_lapack_test(cglm.out glm.in xeigtstc)\n\n\n  add_lapack_test(cgqr.out gqr.in xeigtstc)\n\n\n  add_lapack_test(cgsv.out gsv.in xeigtstc)\n\n\n  add_lapack_test(ccsd.out csd.in xeigtstc)\n\n\n  add_lapack_test(clse.out lse.in xeigtstc)\n  endif()\n\n  if (BUILD_COMPLEX16)\n  #\n  # ======== COMPLEX16 LIN TESTS ========================\n  add_lapack_test(ztest.out ztest.in xlintstz)\n  #\n  # ======== COMPLEX16 RFP LIN TESTS ========================\n  add_lapack_test(ztest_rfp.out ztest_rfp.in xlintstrfz)\n  #\n  # ======== COMPLEX16 EIG TESTS ===========================\n\n  add_lapack_test(znep.out nep.in xeigtstz)\n\n\n  add_lapack_test(zsep.out sep.in xeigtstz)\n\n\n  add_lapack_test(zsvd.out svd.in xeigtstz)\n\n\n  add_lapack_test(zec.out zec.in xeigtstz)\n\n\n  add_lapack_test(zed.out zed.in xeigtstz)\n\n\n  add_lapack_test(zgg.out zgg.in xeigtstz)\n\n\n  add_lapack_test(zgd.out zgd.in xeigtstz)\n\n\n  add_lapack_test(zsb.out zsb.in xeigtstz)\n\n\n  add_lapack_test(zsg.out zsg.in xeigtstz)\n\n\n  add_lapack_test(zbal.out zbal.in xeigtstz)\n\n\n  add_lapack_test(zbak.out zbak.in xeigtstz)\n\n\n  add_lapack_test(zgbal.out zgbal.in xeigtstz)\n\n\n  add_lapack_test(zgbak.out zgbak.in xeigtstz)\n\n\n  add_lapack_test(zbb.out zbb.in xeigtstz)\n\n\n  add_lapack_test(zglm.out glm.in xeigtstz)\n\n\n  add_lapack_test(zgqr.out gqr.in xeigtstz)\n\n\n  add_lapack_test(zgsv.out gsv.in xeigtstz)\n\n\n  add_lapack_test(zcsd.out csd.in xeigtstz)\n\n\n  add_lapack_test(zlse.out lse.in xeigtstz)\n  endif()\n\n\n  if (BUILD_SIMPLE)\n      if (BUILD_DOUBLE)\n  #\n  # ======== SINGLE-DOUBLE PROTO LIN TESTS ==============\n          add_lapack_test(dstest.out dstest.in xlintstds)\n      endif()\n  endif()\n\n\n  if (BUILD_COMPLEX)\n      if (BUILD_COMPLEX16)\n  #\n  # ======== COMPLEX-COMPLEX16 LIN TESTS ========================\n          add_lapack_test(zctest.out zctest.in xlintstzc)\n      endif()\n  endif()\n\n  # ==============================================================================\n\n  execute_process(COMMAND ${CMAKE_COMMAND} -E copy ${LAPACK_SOURCE_DIR}/testing/lapack_testing.py ${LAPACK_BINARY_DIR})\n  add_test(\n    NAME LAPACK_Test_Summary\n    WORKING_DIRECTORY ${LAPACK_BINARY_DIR}\n    COMMAND ${PYTHON_EXECUTABLE} \"lapack_testing.py\"\n  )\n\nendif()\n\n"
  },
  {
    "path": "libs/eigen/lapack/cholesky.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2010-2011 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"lapack_common.h\"\n#include <Eigen/Cholesky>\n\n// POTRF computes the Cholesky factorization of a real symmetric positive definite matrix A.\nEIGEN_LAPACK_FUNC(potrf,(char* uplo, int *n, RealScalar *pa, int *lda, int *info))\n{\n  *info = 0;\n        if(UPLO(*uplo)==INVALID) *info = -1;\n  else  if(*n<0)                 *info = -2;\n  else  if(*lda<std::max(1,*n))  *info = -4;\n  if(*info!=0)\n  {\n    int e = -*info;\n    return xerbla_(SCALAR_SUFFIX_UP\"POTRF\", &e, 6);\n  }\n\n  Scalar* a = reinterpret_cast<Scalar*>(pa);\n  MatrixType A(a,*n,*n,*lda);\n  int ret;\n  if(UPLO(*uplo)==UP) ret = int(internal::llt_inplace<Scalar, Upper>::blocked(A));\n  else                ret = int(internal::llt_inplace<Scalar, Lower>::blocked(A));\n\n  if(ret>=0)\n    *info = ret+1;\n  \n  return 0;\n}\n\n// POTRS solves a system of linear equations A*X = B with a symmetric\n// positive definite matrix A using the Cholesky factorization\n// A = U**T*U or A = L*L**T computed by DPOTRF.\nEIGEN_LAPACK_FUNC(potrs,(char* uplo, int *n, int *nrhs, RealScalar *pa, int *lda, RealScalar *pb, int *ldb, int *info))\n{\n  *info = 0;\n        if(UPLO(*uplo)==INVALID) *info = -1;\n  else  if(*n<0)                 *info = -2;\n  else  if(*nrhs<0)              *info = -3;\n  else  if(*lda<std::max(1,*n))  *info = -5;\n  else  if(*ldb<std::max(1,*n))  *info = -7;\n  if(*info!=0)\n  {\n    int e = -*info;\n    return xerbla_(SCALAR_SUFFIX_UP\"POTRS\", &e, 6);\n  }\n\n  Scalar* a = reinterpret_cast<Scalar*>(pa);\n  Scalar* b = reinterpret_cast<Scalar*>(pb);\n  MatrixType A(a,*n,*n,*lda);\n  MatrixType B(b,*n,*nrhs,*ldb);\n\n  if(UPLO(*uplo)==UP)\n  {\n    A.triangularView<Upper>().adjoint().solveInPlace(B);\n    A.triangularView<Upper>().solveInPlace(B);\n  }\n  else\n  {\n    A.triangularView<Lower>().solveInPlace(B);\n    A.triangularView<Lower>().adjoint().solveInPlace(B);\n  }\n\n  return 0;\n}\n"
  },
  {
    "path": "libs/eigen/lapack/clacgv.f",
    "content": "*> \\brief \\b CLACGV\n*\n*  =========== DOCUMENTATION ===========\n*\n* Online html documentation available at \n*            http://www.netlib.org/lapack/explore-html/ \n*\n*> \\htmlonly\n*> Download CLACGV + dependencies \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clacgv.f\"> \n*> [TGZ]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clacgv.f\"> \n*> [ZIP]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clacgv.f\"> \n*> [TXT]</a>\n*> \\endhtmlonly \n*\n*  Definition:\n*  ===========\n*\n*       SUBROUTINE CLACGV( N, X, INCX )\n* \n*       .. Scalar Arguments ..\n*       INTEGER            INCX, N\n*       ..\n*       .. Array Arguments ..\n*       COMPLEX            X( * )\n*       ..\n*  \n*\n*> \\par Purpose:\n*  =============\n*>\n*> \\verbatim\n*>\n*> CLACGV conjugates a complex vector of length N.\n*> \\endverbatim\n*\n*  Arguments:\n*  ==========\n*\n*> \\param[in] N\n*> \\verbatim\n*>          N is INTEGER\n*>          The length of the vector X.  N >= 0.\n*> \\endverbatim\n*>\n*> \\param[in,out] X\n*> \\verbatim\n*>          X is COMPLEX array, dimension\n*>                         (1+(N-1)*abs(INCX))\n*>          On entry, the vector of length N to be conjugated.\n*>          On exit, X is overwritten with conjg(X).\n*> \\endverbatim\n*>\n*> \\param[in] INCX\n*> \\verbatim\n*>          INCX is INTEGER\n*>          The spacing between successive elements of X.\n*> \\endverbatim\n*\n*  Authors:\n*  ========\n*\n*> \\author Univ. of Tennessee \n*> \\author Univ. of California Berkeley \n*> \\author Univ. of Colorado Denver \n*> \\author NAG Ltd. \n*\n*> \\date November 2011\n*\n*> \\ingroup complexOTHERauxiliary\n*\n*  =====================================================================\n      SUBROUTINE CLACGV( N, X, INCX )\n*\n*  -- LAPACK auxiliary routine (version 3.4.0) --\n*  -- LAPACK is a software package provided by Univ. of Tennessee,    --\n*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--\n*     November 2011\n*\n*     .. Scalar Arguments ..\n      INTEGER            INCX, N\n*     ..\n*     .. Array Arguments ..\n      COMPLEX            X( * )\n*     ..\n*\n* =====================================================================\n*\n*     .. Local Scalars ..\n      INTEGER            I, IOFF\n*     ..\n*     .. Intrinsic Functions ..\n      INTRINSIC          CONJG\n*     ..\n*     .. Executable Statements ..\n*\n      IF( INCX.EQ.1 ) THEN\n         DO 10 I = 1, N\n            X( I ) = CONJG( X( I ) )\n   10    CONTINUE\n      ELSE\n         IOFF = 1\n         IF( INCX.LT.0 )\n     $      IOFF = 1 - ( N-1 )*INCX\n         DO 20 I = 1, N\n            X( IOFF ) = CONJG( X( IOFF ) )\n            IOFF = IOFF + INCX\n   20    CONTINUE\n      END IF\n      RETURN\n*\n*     End of CLACGV\n*\n      END\n"
  },
  {
    "path": "libs/eigen/lapack/cladiv.f",
    "content": "*> \\brief \\b CLADIV\n*\n*  =========== DOCUMENTATION ===========\n*\n* Online html documentation available at \n*            http://www.netlib.org/lapack/explore-html/ \n*\n*> \\htmlonly\n*> Download CLADIV + dependencies \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/cladiv.f\"> \n*> [TGZ]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/cladiv.f\"> \n*> [ZIP]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/cladiv.f\"> \n*> [TXT]</a>\n*> \\endhtmlonly \n*\n*  Definition:\n*  ===========\n*\n*       COMPLEX FUNCTION CLADIV( X, Y )\n* \n*       .. Scalar Arguments ..\n*       COMPLEX            X, Y\n*       ..\n*  \n*\n*> \\par Purpose:\n*  =============\n*>\n*> \\verbatim\n*>\n*> CLADIV := X / Y, where X and Y are complex.  The computation of X / Y\n*> will not overflow on an intermediary step unless the results\n*> overflows.\n*> \\endverbatim\n*\n*  Arguments:\n*  ==========\n*\n*> \\param[in] X\n*> \\verbatim\n*>          X is COMPLEX\n*> \\endverbatim\n*>\n*> \\param[in] Y\n*> \\verbatim\n*>          Y is COMPLEX\n*>          The complex scalars X and Y.\n*> \\endverbatim\n*\n*  Authors:\n*  ========\n*\n*> \\author Univ. of Tennessee \n*> \\author Univ. of California Berkeley \n*> \\author Univ. of Colorado Denver \n*> \\author NAG Ltd. \n*\n*> \\date November 2011\n*\n*> \\ingroup complexOTHERauxiliary\n*\n*  =====================================================================\n      COMPLEX FUNCTION CLADIV( X, Y )\n*\n*  -- LAPACK auxiliary routine (version 3.4.0) --\n*  -- LAPACK is a software package provided by Univ. of Tennessee,    --\n*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--\n*     November 2011\n*\n*     .. Scalar Arguments ..\n      COMPLEX            X, Y\n*     ..\n*\n*  =====================================================================\n*\n*     .. Local Scalars ..\n      REAL               ZI, ZR\n*     ..\n*     .. External Subroutines ..\n      EXTERNAL           SLADIV\n*     ..\n*     .. Intrinsic Functions ..\n      INTRINSIC          AIMAG, CMPLX, REAL\n*     ..\n*     .. Executable Statements ..\n*\n      CALL SLADIV( REAL( X ), AIMAG( X ), REAL( Y ), AIMAG( Y ), ZR,\n     $             ZI )\n      CLADIV = CMPLX( ZR, ZI )\n*\n      RETURN\n*\n*     End of CLADIV\n*\n      END\n"
  },
  {
    "path": "libs/eigen/lapack/clarf.f",
    "content": "*> \\brief \\b CLARF\n*\n*  =========== DOCUMENTATION ===========\n*\n* Online html documentation available at \n*            http://www.netlib.org/lapack/explore-html/ \n*\n*> \\htmlonly\n*> Download CLARF + dependencies \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clarf.f\"> \n*> [TGZ]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clarf.f\"> \n*> [ZIP]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clarf.f\"> \n*> [TXT]</a>\n*> \\endhtmlonly \n*\n*  Definition:\n*  ===========\n*\n*       SUBROUTINE CLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK )\n* \n*       .. Scalar Arguments ..\n*       CHARACTER          SIDE\n*       INTEGER            INCV, LDC, M, N\n*       COMPLEX            TAU\n*       ..\n*       .. Array Arguments ..\n*       COMPLEX            C( LDC, * ), V( * ), WORK( * )\n*       ..\n*  \n*\n*> \\par Purpose:\n*  =============\n*>\n*> \\verbatim\n*>\n*> CLARF applies a complex elementary reflector H to a complex M-by-N\n*> matrix C, from either the left or the right. H is represented in the\n*> form\n*>\n*>       H = I - tau * v * v**H\n*>\n*> where tau is a complex scalar and v is a complex vector.\n*>\n*> If tau = 0, then H is taken to be the unit matrix.\n*>\n*> To apply H**H (the conjugate transpose of H), supply conjg(tau) instead\n*> tau.\n*> \\endverbatim\n*\n*  Arguments:\n*  ==========\n*\n*> \\param[in] SIDE\n*> \\verbatim\n*>          SIDE is CHARACTER*1\n*>          = 'L': form  H * C\n*>          = 'R': form  C * H\n*> \\endverbatim\n*>\n*> \\param[in] M\n*> \\verbatim\n*>          M is INTEGER\n*>          The number of rows of the matrix C.\n*> \\endverbatim\n*>\n*> \\param[in] N\n*> \\verbatim\n*>          N is INTEGER\n*>          The number of columns of the matrix C.\n*> \\endverbatim\n*>\n*> \\param[in] V\n*> \\verbatim\n*>          V is COMPLEX array, dimension\n*>                     (1 + (M-1)*abs(INCV)) if SIDE = 'L'\n*>                  or (1 + (N-1)*abs(INCV)) if SIDE = 'R'\n*>          The vector v in the representation of H. V is not used if\n*>          TAU = 0.\n*> \\endverbatim\n*>\n*> \\param[in] INCV\n*> \\verbatim\n*>          INCV is INTEGER\n*>          The increment between elements of v. INCV <> 0.\n*> \\endverbatim\n*>\n*> \\param[in] TAU\n*> \\verbatim\n*>          TAU is COMPLEX\n*>          The value tau in the representation of H.\n*> \\endverbatim\n*>\n*> \\param[in,out] C\n*> \\verbatim\n*>          C is COMPLEX array, dimension (LDC,N)\n*>          On entry, the M-by-N matrix C.\n*>          On exit, C is overwritten by the matrix H * C if SIDE = 'L',\n*>          or C * H if SIDE = 'R'.\n*> \\endverbatim\n*>\n*> \\param[in] LDC\n*> \\verbatim\n*>          LDC is INTEGER\n*>          The leading dimension of the array C. LDC >= max(1,M).\n*> \\endverbatim\n*>\n*> \\param[out] WORK\n*> \\verbatim\n*>          WORK is COMPLEX array, dimension\n*>                         (N) if SIDE = 'L'\n*>                      or (M) if SIDE = 'R'\n*> \\endverbatim\n*\n*  Authors:\n*  ========\n*\n*> \\author Univ. of Tennessee \n*> \\author Univ. of California Berkeley \n*> \\author Univ. of Colorado Denver \n*> \\author NAG Ltd. \n*\n*> \\date November 2011\n*\n*> \\ingroup complexOTHERauxiliary\n*\n*  =====================================================================\n      SUBROUTINE CLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK )\n*\n*  -- LAPACK auxiliary routine (version 3.4.0) --\n*  -- LAPACK is a software package provided by Univ. of Tennessee,    --\n*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--\n*     November 2011\n*\n*     .. Scalar Arguments ..\n      CHARACTER          SIDE\n      INTEGER            INCV, LDC, M, N\n      COMPLEX            TAU\n*     ..\n*     .. Array Arguments ..\n      COMPLEX            C( LDC, * ), V( * ), WORK( * )\n*     ..\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      COMPLEX            ONE, ZERO\n      PARAMETER          ( ONE = ( 1.0E+0, 0.0E+0 ),\n     $                   ZERO = ( 0.0E+0, 0.0E+0 ) )\n*     ..\n*     .. Local Scalars ..\n      LOGICAL            APPLYLEFT\n      INTEGER            I, LASTV, LASTC\n*     ..\n*     .. External Subroutines ..\n      EXTERNAL           CGEMV, CGERC\n*     ..\n*     .. External Functions ..\n      LOGICAL            LSAME\n      INTEGER            ILACLR, ILACLC\n      EXTERNAL           LSAME, ILACLR, ILACLC\n*     ..\n*     .. Executable Statements ..\n*\n      APPLYLEFT = LSAME( SIDE, 'L' )\n      LASTV = 0\n      LASTC = 0\n      IF( TAU.NE.ZERO ) THEN\n!     Set up variables for scanning V.  LASTV begins pointing to the end\n!     of V.\n         IF( APPLYLEFT ) THEN\n            LASTV = M\n         ELSE\n            LASTV = N\n         END IF\n         IF( INCV.GT.0 ) THEN\n            I = 1 + (LASTV-1) * INCV\n         ELSE\n            I = 1\n         END IF\n!     Look for the last non-zero row in V.\n         DO WHILE( LASTV.GT.0 .AND. V( I ).EQ.ZERO )\n            LASTV = LASTV - 1\n            I = I - INCV\n         END DO\n         IF( APPLYLEFT ) THEN\n!     Scan for the last non-zero column in C(1:lastv,:).\n            LASTC = ILACLC(LASTV, N, C, LDC)\n         ELSE\n!     Scan for the last non-zero row in C(:,1:lastv).\n            LASTC = ILACLR(M, LASTV, C, LDC)\n         END IF\n      END IF\n!     Note that lastc.eq.0 renders the BLAS operations null; no special\n!     case is needed at this level.\n      IF( APPLYLEFT ) THEN\n*\n*        Form  H * C\n*\n         IF( LASTV.GT.0 ) THEN\n*\n*           w(1:lastc,1) := C(1:lastv,1:lastc)**H * v(1:lastv,1)\n*\n            CALL CGEMV( 'Conjugate transpose', LASTV, LASTC, ONE,\n     $           C, LDC, V, INCV, ZERO, WORK, 1 )\n*\n*           C(1:lastv,1:lastc) := C(...) - v(1:lastv,1) * w(1:lastc,1)**H\n*\n            CALL CGERC( LASTV, LASTC, -TAU, V, INCV, WORK, 1, C, LDC )\n         END IF\n      ELSE\n*\n*        Form  C * H\n*\n         IF( LASTV.GT.0 ) THEN\n*\n*           w(1:lastc,1) := C(1:lastc,1:lastv) * v(1:lastv,1)\n*\n            CALL CGEMV( 'No transpose', LASTC, LASTV, ONE, C, LDC,\n     $           V, INCV, ZERO, WORK, 1 )\n*\n*           C(1:lastc,1:lastv) := C(...) - w(1:lastc,1) * v(1:lastv,1)**H\n*\n            CALL CGERC( LASTC, LASTV, -TAU, WORK, 1, V, INCV, C, LDC )\n         END IF\n      END IF\n      RETURN\n*\n*     End of CLARF\n*\n      END\n"
  },
  {
    "path": "libs/eigen/lapack/clarfb.f",
    "content": "*> \\brief \\b CLARFB\n*\n*  =========== DOCUMENTATION ===========\n*\n* Online html documentation available at \n*            http://www.netlib.org/lapack/explore-html/ \n*\n*> \\htmlonly\n*> Download CLARFB + dependencies \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clarfb.f\"> \n*> [TGZ]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clarfb.f\"> \n*> [ZIP]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clarfb.f\"> \n*> [TXT]</a>\n*> \\endhtmlonly \n*\n*  Definition:\n*  ===========\n*\n*       SUBROUTINE CLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV,\n*                          T, LDT, C, LDC, WORK, LDWORK )\n* \n*       .. Scalar Arguments ..\n*       CHARACTER          DIRECT, SIDE, STOREV, TRANS\n*       INTEGER            K, LDC, LDT, LDV, LDWORK, M, N\n*       ..\n*       .. Array Arguments ..\n*       COMPLEX            C( LDC, * ), T( LDT, * ), V( LDV, * ),\n*      $                   WORK( LDWORK, * )\n*       ..\n*  \n*\n*> \\par Purpose:\n*  =============\n*>\n*> \\verbatim\n*>\n*> CLARFB applies a complex block reflector H or its transpose H**H to a\n*> complex M-by-N matrix C, from either the left or the right.\n*> \\endverbatim\n*\n*  Arguments:\n*  ==========\n*\n*> \\param[in] SIDE\n*> \\verbatim\n*>          SIDE is CHARACTER*1\n*>          = 'L': apply H or H**H from the Left\n*>          = 'R': apply H or H**H from the Right\n*> \\endverbatim\n*>\n*> \\param[in] TRANS\n*> \\verbatim\n*>          TRANS is CHARACTER*1\n*>          = 'N': apply H (No transpose)\n*>          = 'C': apply H**H (Conjugate transpose)\n*> \\endverbatim\n*>\n*> \\param[in] DIRECT\n*> \\verbatim\n*>          DIRECT is CHARACTER*1\n*>          Indicates how H is formed from a product of elementary\n*>          reflectors\n*>          = 'F': H = H(1) H(2) . . . H(k) (Forward)\n*>          = 'B': H = H(k) . . . H(2) H(1) (Backward)\n*> \\endverbatim\n*>\n*> \\param[in] STOREV\n*> \\verbatim\n*>          STOREV is CHARACTER*1\n*>          Indicates how the vectors which define the elementary\n*>          reflectors are stored:\n*>          = 'C': Columnwise\n*>          = 'R': Rowwise\n*> \\endverbatim\n*>\n*> \\param[in] M\n*> \\verbatim\n*>          M is INTEGER\n*>          The number of rows of the matrix C.\n*> \\endverbatim\n*>\n*> \\param[in] N\n*> \\verbatim\n*>          N is INTEGER\n*>          The number of columns of the matrix C.\n*> \\endverbatim\n*>\n*> \\param[in] K\n*> \\verbatim\n*>          K is INTEGER\n*>          The order of the matrix T (= the number of elementary\n*>          reflectors whose product defines the block reflector).\n*> \\endverbatim\n*>\n*> \\param[in] V\n*> \\verbatim\n*>          V is COMPLEX array, dimension\n*>                                (LDV,K) if STOREV = 'C'\n*>                                (LDV,M) if STOREV = 'R' and SIDE = 'L'\n*>                                (LDV,N) if STOREV = 'R' and SIDE = 'R'\n*>          The matrix V. See Further Details.\n*> \\endverbatim\n*>\n*> \\param[in] LDV\n*> \\verbatim\n*>          LDV is INTEGER\n*>          The leading dimension of the array V.\n*>          If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M);\n*>          if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N);\n*>          if STOREV = 'R', LDV >= K.\n*> \\endverbatim\n*>\n*> \\param[in] T\n*> \\verbatim\n*>          T is COMPLEX array, dimension (LDT,K)\n*>          The triangular K-by-K matrix T in the representation of the\n*>          block reflector.\n*> \\endverbatim\n*>\n*> \\param[in] LDT\n*> \\verbatim\n*>          LDT is INTEGER\n*>          The leading dimension of the array T. LDT >= K.\n*> \\endverbatim\n*>\n*> \\param[in,out] C\n*> \\verbatim\n*>          C is COMPLEX array, dimension (LDC,N)\n*>          On entry, the M-by-N matrix C.\n*>          On exit, C is overwritten by H*C or H**H*C or C*H or C*H**H.\n*> \\endverbatim\n*>\n*> \\param[in] LDC\n*> \\verbatim\n*>          LDC is INTEGER\n*>          The leading dimension of the array C. LDC >= max(1,M).\n*> \\endverbatim\n*>\n*> \\param[out] WORK\n*> \\verbatim\n*>          WORK is COMPLEX array, dimension (LDWORK,K)\n*> \\endverbatim\n*>\n*> \\param[in] LDWORK\n*> \\verbatim\n*>          LDWORK is INTEGER\n*>          The leading dimension of the array WORK.\n*>          If SIDE = 'L', LDWORK >= max(1,N);\n*>          if SIDE = 'R', LDWORK >= max(1,M).\n*> \\endverbatim\n*\n*  Authors:\n*  ========\n*\n*> \\author Univ. of Tennessee \n*> \\author Univ. of California Berkeley \n*> \\author Univ. of Colorado Denver \n*> \\author NAG Ltd. \n*\n*> \\date November 2011\n*\n*> \\ingroup complexOTHERauxiliary\n*\n*> \\par Further Details:\n*  =====================\n*>\n*> \\verbatim\n*>\n*>  The shape of the matrix V and the storage of the vectors which define\n*>  the H(i) is best illustrated by the following example with n = 5 and\n*>  k = 3. The elements equal to 1 are not stored; the corresponding\n*>  array elements are modified but restored on exit. The rest of the\n*>  array is not used.\n*>\n*>  DIRECT = 'F' and STOREV = 'C':         DIRECT = 'F' and STOREV = 'R':\n*>\n*>               V = (  1       )                 V = (  1 v1 v1 v1 v1 )\n*>                   ( v1  1    )                     (     1 v2 v2 v2 )\n*>                   ( v1 v2  1 )                     (        1 v3 v3 )\n*>                   ( v1 v2 v3 )\n*>                   ( v1 v2 v3 )\n*>\n*>  DIRECT = 'B' and STOREV = 'C':         DIRECT = 'B' and STOREV = 'R':\n*>\n*>               V = ( v1 v2 v3 )                 V = ( v1 v1  1       )\n*>                   ( v1 v2 v3 )                     ( v2 v2 v2  1    )\n*>                   (  1 v2 v3 )                     ( v3 v3 v3 v3  1 )\n*>                   (     1 v3 )\n*>                   (        1 )\n*> \\endverbatim\n*>\n*  =====================================================================\n      SUBROUTINE CLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV,\n     $                   T, LDT, C, LDC, WORK, LDWORK )\n*\n*  -- LAPACK auxiliary routine (version 3.4.0) --\n*  -- LAPACK is a software package provided by Univ. of Tennessee,    --\n*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--\n*     November 2011\n*\n*     .. Scalar Arguments ..\n      CHARACTER          DIRECT, SIDE, STOREV, TRANS\n      INTEGER            K, LDC, LDT, LDV, LDWORK, M, N\n*     ..\n*     .. Array Arguments ..\n      COMPLEX            C( LDC, * ), T( LDT, * ), V( LDV, * ),\n     $                   WORK( LDWORK, * )\n*     ..\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      COMPLEX            ONE\n      PARAMETER          ( ONE = ( 1.0E+0, 0.0E+0 ) )\n*     ..\n*     .. Local Scalars ..\n      CHARACTER          TRANST\n      INTEGER            I, J, LASTV, LASTC\n*     ..\n*     .. External Functions ..\n      LOGICAL            LSAME\n      INTEGER            ILACLR, ILACLC\n      EXTERNAL           LSAME, ILACLR, ILACLC\n*     ..\n*     .. External Subroutines ..\n      EXTERNAL           CCOPY, CGEMM, CLACGV, CTRMM\n*     ..\n*     .. Intrinsic Functions ..\n      INTRINSIC          CONJG\n*     ..\n*     .. Executable Statements ..\n*\n*     Quick return if possible\n*\n      IF( M.LE.0 .OR. N.LE.0 )\n     $   RETURN\n*\n      IF( LSAME( TRANS, 'N' ) ) THEN\n         TRANST = 'C'\n      ELSE\n         TRANST = 'N'\n      END IF\n*\n      IF( LSAME( STOREV, 'C' ) ) THEN\n*\n         IF( LSAME( DIRECT, 'F' ) ) THEN\n*\n*           Let  V =  ( V1 )    (first K rows)\n*                     ( V2 )\n*           where  V1  is unit lower triangular.\n*\n            IF( LSAME( SIDE, 'L' ) ) THEN\n*\n*              Form  H * C  or  H**H * C  where  C = ( C1 )\n*                                                    ( C2 )\n*\n               LASTV = MAX( K, ILACLR( M, K, V, LDV ) )\n               LASTC = ILACLC( LASTV, N, C, LDC )\n*\n*              W := C**H * V  =  (C1**H * V1 + C2**H * V2)  (stored in WORK)\n*\n*              W := C1**H\n*\n               DO 10 J = 1, K\n                  CALL CCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 )\n                  CALL CLACGV( LASTC, WORK( 1, J ), 1 )\n   10          CONTINUE\n*\n*              W := W * V1\n*\n               CALL CTRMM( 'Right', 'Lower', 'No transpose', 'Unit',\n     $              LASTC, K, ONE, V, LDV, WORK, LDWORK )\n               IF( LASTV.GT.K ) THEN\n*\n*                 W := W + C2**H *V2\n*\n                  CALL CGEMM( 'Conjugate transpose', 'No transpose',\n     $                 LASTC, K, LASTV-K, ONE, C( K+1, 1 ), LDC,\n     $                 V( K+1, 1 ), LDV, ONE, WORK, LDWORK )\n               END IF\n*\n*              W := W * T**H  or  W * T\n*\n               CALL CTRMM( 'Right', 'Upper', TRANST, 'Non-unit',\n     $              LASTC, K, ONE, T, LDT, WORK, LDWORK )\n*\n*              C := C - V * W**H\n*\n               IF( M.GT.K ) THEN\n*\n*                 C2 := C2 - V2 * W**H\n*\n                  CALL CGEMM( 'No transpose', 'Conjugate transpose',\n     $                 LASTV-K, LASTC, K, -ONE, V( K+1, 1 ), LDV,\n     $                 WORK, LDWORK, ONE, C( K+1, 1 ), LDC )\n               END IF\n*\n*              W := W * V1**H\n*\n               CALL CTRMM( 'Right', 'Lower', 'Conjugate transpose',\n     $              'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK )\n*\n*              C1 := C1 - W**H\n*\n               DO 30 J = 1, K\n                  DO 20 I = 1, LASTC\n                     C( J, I ) = C( J, I ) - CONJG( WORK( I, J ) )\n   20             CONTINUE\n   30          CONTINUE\n*\n            ELSE IF( LSAME( SIDE, 'R' ) ) THEN\n*\n*              Form  C * H  or  C * H**H  where  C = ( C1  C2 )\n*\n               LASTV = MAX( K, ILACLR( N, K, V, LDV ) )\n               LASTC = ILACLR( M, LASTV, C, LDC )\n*\n*              W := C * V  =  (C1*V1 + C2*V2)  (stored in WORK)\n*\n*              W := C1\n*\n               DO 40 J = 1, K\n                  CALL CCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 )\n   40          CONTINUE\n*\n*              W := W * V1\n*\n               CALL CTRMM( 'Right', 'Lower', 'No transpose', 'Unit',\n     $              LASTC, K, ONE, V, LDV, WORK, LDWORK )\n               IF( LASTV.GT.K ) THEN\n*\n*                 W := W + C2 * V2\n*\n                  CALL CGEMM( 'No transpose', 'No transpose',\n     $                 LASTC, K, LASTV-K,\n     $                 ONE, C( 1, K+1 ), LDC, V( K+1, 1 ), LDV,\n     $                 ONE, WORK, LDWORK )\n               END IF\n*\n*              W := W * T  or  W * T**H\n*\n               CALL CTRMM( 'Right', 'Upper', TRANS, 'Non-unit',\n     $              LASTC, K, ONE, T, LDT, WORK, LDWORK )\n*\n*              C := C - W * V**H\n*\n               IF( LASTV.GT.K ) THEN\n*\n*                 C2 := C2 - W * V2**H\n*\n                  CALL CGEMM( 'No transpose', 'Conjugate transpose',\n     $                 LASTC, LASTV-K, K,\n     $                 -ONE, WORK, LDWORK, V( K+1, 1 ), LDV,\n     $                 ONE, C( 1, K+1 ), LDC )\n               END IF\n*\n*              W := W * V1**H\n*\n               CALL CTRMM( 'Right', 'Lower', 'Conjugate transpose',\n     $              'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK )\n*\n*              C1 := C1 - W\n*\n               DO 60 J = 1, K\n                  DO 50 I = 1, LASTC\n                     C( I, J ) = C( I, J ) - WORK( I, J )\n   50             CONTINUE\n   60          CONTINUE\n            END IF\n*\n         ELSE\n*\n*           Let  V =  ( V1 )\n*                     ( V2 )    (last K rows)\n*           where  V2  is unit upper triangular.\n*\n            IF( LSAME( SIDE, 'L' ) ) THEN\n*\n*              Form  H * C  or  H**H * C  where  C = ( C1 )\n*                                                    ( C2 )\n*\n               LASTV = MAX( K, ILACLR( M, K, V, LDV ) )\n               LASTC = ILACLC( LASTV, N, C, LDC )\n*\n*              W := C**H * V  =  (C1**H * V1 + C2**H * V2)  (stored in WORK)\n*\n*              W := C2**H\n*\n               DO 70 J = 1, K\n                  CALL CCOPY( LASTC, C( LASTV-K+J, 1 ), LDC,\n     $                 WORK( 1, J ), 1 )\n                  CALL CLACGV( LASTC, WORK( 1, J ), 1 )\n   70          CONTINUE\n*\n*              W := W * V2\n*\n               CALL CTRMM( 'Right', 'Upper', 'No transpose', 'Unit',\n     $              LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV,\n     $              WORK, LDWORK )\n               IF( LASTV.GT.K ) THEN\n*\n*                 W := W + C1**H*V1\n*\n                  CALL CGEMM( 'Conjugate transpose', 'No transpose',\n     $                 LASTC, K, LASTV-K, ONE, C, LDC, V, LDV,\n     $                 ONE, WORK, LDWORK )\n               END IF\n*\n*              W := W * T**H  or  W * T\n*\n               CALL CTRMM( 'Right', 'Lower', TRANST, 'Non-unit',\n     $              LASTC, K, ONE, T, LDT, WORK, LDWORK )\n*\n*              C := C - V * W**H\n*\n               IF( LASTV.GT.K ) THEN\n*\n*                 C1 := C1 - V1 * W**H\n*\n                  CALL CGEMM( 'No transpose', 'Conjugate transpose',\n     $                 LASTV-K, LASTC, K, -ONE, V, LDV, WORK, LDWORK,\n     $                 ONE, C, LDC )\n               END IF\n*\n*              W := W * V2**H\n*\n               CALL CTRMM( 'Right', 'Upper', 'Conjugate transpose',\n     $              'Unit', LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV,\n     $              WORK, LDWORK )\n*\n*              C2 := C2 - W**H\n*\n               DO 90 J = 1, K\n                  DO 80 I = 1, LASTC\n                     C( LASTV-K+J, I ) = C( LASTV-K+J, I ) -\n     $                               CONJG( WORK( I, J ) )\n   80             CONTINUE\n   90          CONTINUE\n*\n            ELSE IF( LSAME( SIDE, 'R' ) ) THEN\n*\n*              Form  C * H  or  C * H**H  where  C = ( C1  C2 )\n*\n               LASTV = MAX( K, ILACLR( N, K, V, LDV ) )\n               LASTC = ILACLR( M, LASTV, C, LDC )\n*\n*              W := C * V  =  (C1*V1 + C2*V2)  (stored in WORK)\n*\n*              W := C2\n*\n               DO 100 J = 1, K\n                  CALL CCOPY( LASTC, C( 1, LASTV-K+J ), 1,\n     $                 WORK( 1, J ), 1 )\n  100          CONTINUE\n*\n*              W := W * V2\n*\n               CALL CTRMM( 'Right', 'Upper', 'No transpose', 'Unit',\n     $              LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV,\n     $              WORK, LDWORK )\n               IF( LASTV.GT.K ) THEN\n*\n*                 W := W + C1 * V1\n*\n                  CALL CGEMM( 'No transpose', 'No transpose',\n     $                 LASTC, K, LASTV-K,\n     $                 ONE, C, LDC, V, LDV, ONE, WORK, LDWORK )\n               END IF\n*\n*              W := W * T  or  W * T**H\n*\n               CALL CTRMM( 'Right', 'Lower', TRANS, 'Non-unit',\n     $              LASTC, K, ONE, T, LDT, WORK, LDWORK )\n*\n*              C := C - W * V**H\n*\n               IF( LASTV.GT.K ) THEN\n*\n*                 C1 := C1 - W * V1**H\n*\n                  CALL CGEMM( 'No transpose', 'Conjugate transpose',\n     $                 LASTC, LASTV-K, K, -ONE, WORK, LDWORK, V, LDV,\n     $                 ONE, C, LDC )\n               END IF\n*\n*              W := W * V2**H\n*\n               CALL CTRMM( 'Right', 'Upper', 'Conjugate transpose',\n     $              'Unit', LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV,\n     $              WORK, LDWORK )\n*\n*              C2 := C2 - W\n*\n               DO 120 J = 1, K\n                  DO 110 I = 1, LASTC\n                     C( I, LASTV-K+J ) = C( I, LASTV-K+J )\n     $                    - WORK( I, J )\n  110             CONTINUE\n  120          CONTINUE\n            END IF\n         END IF\n*\n      ELSE IF( LSAME( STOREV, 'R' ) ) THEN\n*\n         IF( LSAME( DIRECT, 'F' ) ) THEN\n*\n*           Let  V =  ( V1  V2 )    (V1: first K columns)\n*           where  V1  is unit upper triangular.\n*\n            IF( LSAME( SIDE, 'L' ) ) THEN\n*\n*              Form  H * C  or  H**H * C  where  C = ( C1 )\n*                                                    ( C2 )\n*\n               LASTV = MAX( K, ILACLC( K, M, V, LDV ) )\n               LASTC = ILACLC( LASTV, N, C, LDC )\n*\n*              W := C**H * V**H  =  (C1**H * V1**H + C2**H * V2**H) (stored in WORK)\n*\n*              W := C1**H\n*\n               DO 130 J = 1, K\n                  CALL CCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 )\n                  CALL CLACGV( LASTC, WORK( 1, J ), 1 )\n  130          CONTINUE\n*\n*              W := W * V1**H\n*\n               CALL CTRMM( 'Right', 'Upper', 'Conjugate transpose',\n     $                     'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK )\n               IF( LASTV.GT.K ) THEN\n*\n*                 W := W + C2**H*V2**H\n*\n                  CALL CGEMM( 'Conjugate transpose',\n     $                 'Conjugate transpose', LASTC, K, LASTV-K,\n     $                 ONE, C( K+1, 1 ), LDC, V( 1, K+1 ), LDV,\n     $                 ONE, WORK, LDWORK )\n               END IF\n*\n*              W := W * T**H  or  W * T\n*\n               CALL CTRMM( 'Right', 'Upper', TRANST, 'Non-unit',\n     $              LASTC, K, ONE, T, LDT, WORK, LDWORK )\n*\n*              C := C - V**H * W**H\n*\n               IF( LASTV.GT.K ) THEN\n*\n*                 C2 := C2 - V2**H * W**H\n*\n                  CALL CGEMM( 'Conjugate transpose',\n     $                 'Conjugate transpose', LASTV-K, LASTC, K,\n     $                 -ONE, V( 1, K+1 ), LDV, WORK, LDWORK,\n     $                 ONE, C( K+1, 1 ), LDC )\n               END IF\n*\n*              W := W * V1\n*\n               CALL CTRMM( 'Right', 'Upper', 'No transpose', 'Unit',\n     $              LASTC, K, ONE, V, LDV, WORK, LDWORK )\n*\n*              C1 := C1 - W**H\n*\n               DO 150 J = 1, K\n                  DO 140 I = 1, LASTC\n                     C( J, I ) = C( J, I ) - CONJG( WORK( I, J ) )\n  140             CONTINUE\n  150          CONTINUE\n*\n            ELSE IF( LSAME( SIDE, 'R' ) ) THEN\n*\n*              Form  C * H  or  C * H**H  where  C = ( C1  C2 )\n*\n               LASTV = MAX( K, ILACLC( K, N, V, LDV ) )\n               LASTC = ILACLR( M, LASTV, C, LDC )\n*\n*              W := C * V**H  =  (C1*V1**H + C2*V2**H)  (stored in WORK)\n*\n*              W := C1\n*\n               DO 160 J = 1, K\n                  CALL CCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 )\n  160          CONTINUE\n*\n*              W := W * V1**H\n*\n               CALL CTRMM( 'Right', 'Upper', 'Conjugate transpose',\n     $                     'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK )\n               IF( LASTV.GT.K ) THEN\n*\n*                 W := W + C2 * V2**H\n*\n                  CALL CGEMM( 'No transpose', 'Conjugate transpose',\n     $                 LASTC, K, LASTV-K, ONE, C( 1, K+1 ), LDC,\n     $                 V( 1, K+1 ), LDV, ONE, WORK, LDWORK )\n               END IF\n*\n*              W := W * T  or  W * T**H\n*\n               CALL CTRMM( 'Right', 'Upper', TRANS, 'Non-unit',\n     $              LASTC, K, ONE, T, LDT, WORK, LDWORK )\n*\n*              C := C - W * V\n*\n               IF( LASTV.GT.K ) THEN\n*\n*                 C2 := C2 - W * V2\n*\n                  CALL CGEMM( 'No transpose', 'No transpose',\n     $                 LASTC, LASTV-K, K,\n     $                 -ONE, WORK, LDWORK, V( 1, K+1 ), LDV,\n     $                 ONE, C( 1, K+1 ), LDC )\n               END IF\n*\n*              W := W * V1\n*\n               CALL CTRMM( 'Right', 'Upper', 'No transpose', 'Unit',\n     $              LASTC, K, ONE, V, LDV, WORK, LDWORK )\n*\n*              C1 := C1 - W\n*\n               DO 180 J = 1, K\n                  DO 170 I = 1, LASTC\n                     C( I, J ) = C( I, J ) - WORK( I, J )\n  170             CONTINUE\n  180          CONTINUE\n*\n            END IF\n*\n         ELSE\n*\n*           Let  V =  ( V1  V2 )    (V2: last K columns)\n*           where  V2  is unit lower triangular.\n*\n            IF( LSAME( SIDE, 'L' ) ) THEN\n*\n*              Form  H * C  or  H**H * C  where  C = ( C1 )\n*                                                    ( C2 )\n*\n               LASTV = MAX( K, ILACLC( K, M, V, LDV ) )\n               LASTC = ILACLC( LASTV, N, C, LDC )\n*\n*              W := C**H * V**H  =  (C1**H * V1**H + C2**H * V2**H) (stored in WORK)\n*\n*              W := C2**H\n*\n               DO 190 J = 1, K\n                  CALL CCOPY( LASTC, C( LASTV-K+J, 1 ), LDC,\n     $                 WORK( 1, J ), 1 )\n                  CALL CLACGV( LASTC, WORK( 1, J ), 1 )\n  190          CONTINUE\n*\n*              W := W * V2**H\n*\n               CALL CTRMM( 'Right', 'Lower', 'Conjugate transpose',\n     $              'Unit', LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV,\n     $              WORK, LDWORK )\n               IF( LASTV.GT.K ) THEN\n*\n*                 W := W + C1**H * V1**H\n*\n                  CALL CGEMM( 'Conjugate transpose',\n     $                 'Conjugate transpose', LASTC, K, LASTV-K,\n     $                 ONE, C, LDC, V, LDV, ONE, WORK, LDWORK )\n               END IF\n*\n*              W := W * T**H  or  W * T\n*\n               CALL CTRMM( 'Right', 'Lower', TRANST, 'Non-unit',\n     $              LASTC, K, ONE, T, LDT, WORK, LDWORK )\n*\n*              C := C - V**H * W**H\n*\n               IF( LASTV.GT.K ) THEN\n*\n*                 C1 := C1 - V1**H * W**H\n*\n                  CALL CGEMM( 'Conjugate transpose',\n     $                 'Conjugate transpose', LASTV-K, LASTC, K,\n     $                 -ONE, V, LDV, WORK, LDWORK, ONE, C, LDC )\n               END IF\n*\n*              W := W * V2\n*\n               CALL CTRMM( 'Right', 'Lower', 'No transpose', 'Unit',\n     $              LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV,\n     $              WORK, LDWORK )\n*\n*              C2 := C2 - W**H\n*\n               DO 210 J = 1, K\n                  DO 200 I = 1, LASTC\n                     C( LASTV-K+J, I ) = C( LASTV-K+J, I ) -\n     $                               CONJG( WORK( I, J ) )\n  200             CONTINUE\n  210          CONTINUE\n*\n            ELSE IF( LSAME( SIDE, 'R' ) ) THEN\n*\n*              Form  C * H  or  C * H**H  where  C = ( C1  C2 )\n*\n               LASTV = MAX( K, ILACLC( K, N, V, LDV ) )\n               LASTC = ILACLR( M, LASTV, C, LDC )\n*\n*              W := C * V**H  =  (C1*V1**H + C2*V2**H)  (stored in WORK)\n*\n*              W := C2\n*\n               DO 220 J = 1, K\n                  CALL CCOPY( LASTC, C( 1, LASTV-K+J ), 1,\n     $                 WORK( 1, J ), 1 )\n  220          CONTINUE\n*\n*              W := W * V2**H\n*\n               CALL CTRMM( 'Right', 'Lower', 'Conjugate transpose',\n     $              'Unit', LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV,\n     $              WORK, LDWORK )\n               IF( LASTV.GT.K ) THEN\n*\n*                 W := W + C1 * V1**H\n*\n                  CALL CGEMM( 'No transpose', 'Conjugate transpose',\n     $                 LASTC, K, LASTV-K, ONE, C, LDC, V, LDV, ONE,\n     $                 WORK, LDWORK )\n               END IF\n*\n*              W := W * T  or  W * T**H\n*\n               CALL CTRMM( 'Right', 'Lower', TRANS, 'Non-unit',\n     $              LASTC, K, ONE, T, LDT, WORK, LDWORK )\n*\n*              C := C - W * V\n*\n               IF( LASTV.GT.K ) THEN\n*\n*                 C1 := C1 - W * V1\n*\n                  CALL CGEMM( 'No transpose', 'No transpose',\n     $                 LASTC, LASTV-K, K, -ONE, WORK, LDWORK, V, LDV,\n     $                 ONE, C, LDC )\n               END IF\n*\n*              W := W * V2\n*\n               CALL CTRMM( 'Right', 'Lower', 'No transpose', 'Unit',\n     $              LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV,\n     $              WORK, LDWORK )\n*\n*              C1 := C1 - W\n*\n               DO 240 J = 1, K\n                  DO 230 I = 1, LASTC\n                     C( I, LASTV-K+J ) = C( I, LASTV-K+J )\n     $                    - WORK( I, J )\n  230             CONTINUE\n  240          CONTINUE\n*\n            END IF\n*\n         END IF\n      END IF\n*\n      RETURN\n*\n*     End of CLARFB\n*\n      END\n"
  },
  {
    "path": "libs/eigen/lapack/clarfg.f",
    "content": "*> \\brief \\b CLARFG\n*\n*  =========== DOCUMENTATION ===========\n*\n* Online html documentation available at \n*            http://www.netlib.org/lapack/explore-html/ \n*\n*> \\htmlonly\n*> Download CLARFG + dependencies \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clarfg.f\"> \n*> [TGZ]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clarfg.f\"> \n*> [ZIP]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clarfg.f\"> \n*> [TXT]</a>\n*> \\endhtmlonly \n*\n*  Definition:\n*  ===========\n*\n*       SUBROUTINE CLARFG( N, ALPHA, X, INCX, TAU )\n* \n*       .. Scalar Arguments ..\n*       INTEGER            INCX, N\n*       COMPLEX            ALPHA, TAU\n*       ..\n*       .. Array Arguments ..\n*       COMPLEX            X( * )\n*       ..\n*  \n*\n*> \\par Purpose:\n*  =============\n*>\n*> \\verbatim\n*>\n*> CLARFG generates a complex elementary reflector H of order n, such\n*> that\n*>\n*>       H**H * ( alpha ) = ( beta ),   H**H * H = I.\n*>              (   x   )   (   0  )\n*>\n*> where alpha and beta are scalars, with beta real, and x is an\n*> (n-1)-element complex vector. H is represented in the form\n*>\n*>       H = I - tau * ( 1 ) * ( 1 v**H ) ,\n*>                     ( v )\n*>\n*> where tau is a complex scalar and v is a complex (n-1)-element\n*> vector. Note that H is not hermitian.\n*>\n*> If the elements of x are all zero and alpha is real, then tau = 0\n*> and H is taken to be the unit matrix.\n*>\n*> Otherwise  1 <= real(tau) <= 2  and  abs(tau-1) <= 1 .\n*> \\endverbatim\n*\n*  Arguments:\n*  ==========\n*\n*> \\param[in] N\n*> \\verbatim\n*>          N is INTEGER\n*>          The order of the elementary reflector.\n*> \\endverbatim\n*>\n*> \\param[in,out] ALPHA\n*> \\verbatim\n*>          ALPHA is COMPLEX\n*>          On entry, the value alpha.\n*>          On exit, it is overwritten with the value beta.\n*> \\endverbatim\n*>\n*> \\param[in,out] X\n*> \\verbatim\n*>          X is COMPLEX array, dimension\n*>                         (1+(N-2)*abs(INCX))\n*>          On entry, the vector x.\n*>          On exit, it is overwritten with the vector v.\n*> \\endverbatim\n*>\n*> \\param[in] INCX\n*> \\verbatim\n*>          INCX is INTEGER\n*>          The increment between elements of X. INCX > 0.\n*> \\endverbatim\n*>\n*> \\param[out] TAU\n*> \\verbatim\n*>          TAU is COMPLEX\n*>          The value tau.\n*> \\endverbatim\n*\n*  Authors:\n*  ========\n*\n*> \\author Univ. of Tennessee \n*> \\author Univ. of California Berkeley \n*> \\author Univ. of Colorado Denver \n*> \\author NAG Ltd. \n*\n*> \\date November 2011\n*\n*> \\ingroup complexOTHERauxiliary\n*\n*  =====================================================================\n      SUBROUTINE CLARFG( N, ALPHA, X, INCX, TAU )\n*\n*  -- LAPACK auxiliary routine (version 3.4.0) --\n*  -- LAPACK is a software package provided by Univ. of Tennessee,    --\n*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--\n*     November 2011\n*\n*     .. Scalar Arguments ..\n      INTEGER            INCX, N\n      COMPLEX            ALPHA, TAU\n*     ..\n*     .. Array Arguments ..\n      COMPLEX            X( * )\n*     ..\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      REAL               ONE, ZERO\n      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )\n*     ..\n*     .. Local Scalars ..\n      INTEGER            J, KNT\n      REAL               ALPHI, ALPHR, BETA, RSAFMN, SAFMIN, XNORM\n*     ..\n*     .. External Functions ..\n      REAL               SCNRM2, SLAMCH, SLAPY3\n      COMPLEX            CLADIV\n      EXTERNAL           SCNRM2, SLAMCH, SLAPY3, CLADIV\n*     ..\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, AIMAG, CMPLX, REAL, SIGN\n*     ..\n*     .. External Subroutines ..\n      EXTERNAL           CSCAL, CSSCAL\n*     ..\n*     .. Executable Statements ..\n*\n      IF( N.LE.0 ) THEN\n         TAU = ZERO\n         RETURN\n      END IF\n*\n      XNORM = SCNRM2( N-1, X, INCX )\n      ALPHR = REAL( ALPHA )\n      ALPHI = AIMAG( ALPHA )\n*\n      IF( XNORM.EQ.ZERO .AND. ALPHI.EQ.ZERO ) THEN\n*\n*        H  =  I\n*\n         TAU = ZERO\n      ELSE\n*\n*        general case\n*\n         BETA = -SIGN( SLAPY3( ALPHR, ALPHI, XNORM ), ALPHR )\n         SAFMIN = SLAMCH( 'S' ) / SLAMCH( 'E' )\n         RSAFMN = ONE / SAFMIN\n*\n         KNT = 0\n         IF( ABS( BETA ).LT.SAFMIN ) THEN\n*\n*           XNORM, BETA may be inaccurate; scale X and recompute them\n*\n   10       CONTINUE\n            KNT = KNT + 1\n            CALL CSSCAL( N-1, RSAFMN, X, INCX )\n            BETA = BETA*RSAFMN\n            ALPHI = ALPHI*RSAFMN\n            ALPHR = ALPHR*RSAFMN\n            IF( ABS( BETA ).LT.SAFMIN )\n     $         GO TO 10\n*\n*           New BETA is at most 1, at least SAFMIN\n*\n            XNORM = SCNRM2( N-1, X, INCX )\n            ALPHA = CMPLX( ALPHR, ALPHI )\n            BETA = -SIGN( SLAPY3( ALPHR, ALPHI, XNORM ), ALPHR )\n         END IF\n         TAU = CMPLX( ( BETA-ALPHR ) / BETA, -ALPHI / BETA )\n         ALPHA = CLADIV( CMPLX( ONE ), ALPHA-BETA )\n         CALL CSCAL( N-1, ALPHA, X, INCX )\n*\n*        If ALPHA is subnormal, it may lose relative accuracy\n*\n         DO 20 J = 1, KNT\n            BETA = BETA*SAFMIN\n 20      CONTINUE\n         ALPHA = BETA\n      END IF\n*\n      RETURN\n*\n*     End of CLARFG\n*\n      END\n"
  },
  {
    "path": "libs/eigen/lapack/clarft.f",
    "content": "*> \\brief \\b CLARFT\n*\n*  =========== DOCUMENTATION ===========\n*\n* Online html documentation available at \n*            http://www.netlib.org/lapack/explore-html/ \n*\n*> \\htmlonly\n*> Download CLARFT + dependencies \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clarft.f\"> \n*> [TGZ]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clarft.f\"> \n*> [ZIP]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clarft.f\"> \n*> [TXT]</a>\n*> \\endhtmlonly \n*\n*  Definition:\n*  ===========\n*\n*       SUBROUTINE CLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT )\n* \n*       .. Scalar Arguments ..\n*       CHARACTER          DIRECT, STOREV\n*       INTEGER            K, LDT, LDV, N\n*       ..\n*       .. Array Arguments ..\n*       COMPLEX            T( LDT, * ), TAU( * ), V( LDV, * )\n*       ..\n*  \n*\n*> \\par Purpose:\n*  =============\n*>\n*> \\verbatim\n*>\n*> CLARFT forms the triangular factor T of a complex block reflector H\n*> of order n, which is defined as a product of k elementary reflectors.\n*>\n*> If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular;\n*>\n*> If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular.\n*>\n*> If STOREV = 'C', the vector which defines the elementary reflector\n*> H(i) is stored in the i-th column of the array V, and\n*>\n*>    H  =  I - V * T * V**H\n*>\n*> If STOREV = 'R', the vector which defines the elementary reflector\n*> H(i) is stored in the i-th row of the array V, and\n*>\n*>    H  =  I - V**H * T * V\n*> \\endverbatim\n*\n*  Arguments:\n*  ==========\n*\n*> \\param[in] DIRECT\n*> \\verbatim\n*>          DIRECT is CHARACTER*1\n*>          Specifies the order in which the elementary reflectors are\n*>          multiplied to form the block reflector:\n*>          = 'F': H = H(1) H(2) . . . H(k) (Forward)\n*>          = 'B': H = H(k) . . . H(2) H(1) (Backward)\n*> \\endverbatim\n*>\n*> \\param[in] STOREV\n*> \\verbatim\n*>          STOREV is CHARACTER*1\n*>          Specifies how the vectors which define the elementary\n*>          reflectors are stored (see also Further Details):\n*>          = 'C': columnwise\n*>          = 'R': rowwise\n*> \\endverbatim\n*>\n*> \\param[in] N\n*> \\verbatim\n*>          N is INTEGER\n*>          The order of the block reflector H. N >= 0.\n*> \\endverbatim\n*>\n*> \\param[in] K\n*> \\verbatim\n*>          K is INTEGER\n*>          The order of the triangular factor T (= the number of\n*>          elementary reflectors). K >= 1.\n*> \\endverbatim\n*>\n*> \\param[in] V\n*> \\verbatim\n*>          V is COMPLEX array, dimension\n*>                               (LDV,K) if STOREV = 'C'\n*>                               (LDV,N) if STOREV = 'R'\n*>          The matrix V. See further details.\n*> \\endverbatim\n*>\n*> \\param[in] LDV\n*> \\verbatim\n*>          LDV is INTEGER\n*>          The leading dimension of the array V.\n*>          If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K.\n*> \\endverbatim\n*>\n*> \\param[in] TAU\n*> \\verbatim\n*>          TAU is COMPLEX array, dimension (K)\n*>          TAU(i) must contain the scalar factor of the elementary\n*>          reflector H(i).\n*> \\endverbatim\n*>\n*> \\param[out] T\n*> \\verbatim\n*>          T is COMPLEX array, dimension (LDT,K)\n*>          The k by k triangular factor T of the block reflector.\n*>          If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is\n*>          lower triangular. The rest of the array is not used.\n*> \\endverbatim\n*>\n*> \\param[in] LDT\n*> \\verbatim\n*>          LDT is INTEGER\n*>          The leading dimension of the array T. LDT >= K.\n*> \\endverbatim\n*\n*  Authors:\n*  ========\n*\n*> \\author Univ. of Tennessee \n*> \\author Univ. of California Berkeley \n*> \\author Univ. of Colorado Denver \n*> \\author NAG Ltd. \n*\n*> \\date April 2012\n*\n*> \\ingroup complexOTHERauxiliary\n*\n*> \\par Further Details:\n*  =====================\n*>\n*> \\verbatim\n*>\n*>  The shape of the matrix V and the storage of the vectors which define\n*>  the H(i) is best illustrated by the following example with n = 5 and\n*>  k = 3. The elements equal to 1 are not stored.\n*>\n*>  DIRECT = 'F' and STOREV = 'C':         DIRECT = 'F' and STOREV = 'R':\n*>\n*>               V = (  1       )                 V = (  1 v1 v1 v1 v1 )\n*>                   ( v1  1    )                     (     1 v2 v2 v2 )\n*>                   ( v1 v2  1 )                     (        1 v3 v3 )\n*>                   ( v1 v2 v3 )\n*>                   ( v1 v2 v3 )\n*>\n*>  DIRECT = 'B' and STOREV = 'C':         DIRECT = 'B' and STOREV = 'R':\n*>\n*>               V = ( v1 v2 v3 )                 V = ( v1 v1  1       )\n*>                   ( v1 v2 v3 )                     ( v2 v2 v2  1    )\n*>                   (  1 v2 v3 )                     ( v3 v3 v3 v3  1 )\n*>                   (     1 v3 )\n*>                   (        1 )\n*> \\endverbatim\n*>\n*  =====================================================================\n      SUBROUTINE CLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT )\n*\n*  -- LAPACK auxiliary routine (version 3.4.1) --\n*  -- LAPACK is a software package provided by Univ. of Tennessee,    --\n*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--\n*     April 2012\n*\n*     .. Scalar Arguments ..\n      CHARACTER          DIRECT, STOREV\n      INTEGER            K, LDT, LDV, N\n*     ..\n*     .. Array Arguments ..\n      COMPLEX            T( LDT, * ), TAU( * ), V( LDV, * )\n*     ..\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      COMPLEX            ONE, ZERO\n      PARAMETER          ( ONE = ( 1.0E+0, 0.0E+0 ),\n     $                   ZERO = ( 0.0E+0, 0.0E+0 ) )\n*     ..\n*     .. Local Scalars ..\n      INTEGER            I, J, PREVLASTV, LASTV\n*     ..\n*     .. External Subroutines ..\n      EXTERNAL           CGEMV, CLACGV, CTRMV\n*     ..\n*     .. External Functions ..\n      LOGICAL            LSAME\n      EXTERNAL           LSAME\n*     ..\n*     .. Executable Statements ..\n*\n*     Quick return if possible\n*\n      IF( N.EQ.0 )\n     $   RETURN\n*\n      IF( LSAME( DIRECT, 'F' ) ) THEN\n         PREVLASTV = N\n         DO I = 1, K\n            PREVLASTV = MAX( PREVLASTV, I )\n            IF( TAU( I ).EQ.ZERO ) THEN\n*\n*              H(i)  =  I\n*\n               DO J = 1, I\n                  T( J, I ) = ZERO\n               END DO\n            ELSE\n*\n*              general case\n*\n               IF( LSAME( STOREV, 'C' ) ) THEN\n*                 Skip any trailing zeros.\n                  DO LASTV = N, I+1, -1\n                     IF( V( LASTV, I ).NE.ZERO ) EXIT\n                  END DO\n                  DO J = 1, I-1\n                     T( J, I ) = -TAU( I ) * CONJG( V( I , J ) )\n                  END DO                     \n                  J = MIN( LASTV, PREVLASTV )\n*\n*                 T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)**H * V(i:j,i)\n*\n                  CALL CGEMV( 'Conjugate transpose', J-I, I-1,\n     $                        -TAU( I ), V( I+1, 1 ), LDV, \n     $                        V( I+1, I ), 1,\n     $                        ONE, T( 1, I ), 1 )\n               ELSE\n*                 Skip any trailing zeros.\n                  DO LASTV = N, I+1, -1\n                     IF( V( I, LASTV ).NE.ZERO ) EXIT\n                  END DO\n                  DO J = 1, I-1\n                     T( J, I ) = -TAU( I ) * V( J , I )\n                  END DO                     \n                  J = MIN( LASTV, PREVLASTV )\n*\n*                 T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)**H\n*\n                  CALL CGEMM( 'N', 'C', I-1, 1, J-I, -TAU( I ),\n     $                        V( 1, I+1 ), LDV, V( I, I+1 ), LDV,\n     $                        ONE, T( 1, I ), LDT )                  \n               END IF\n*\n*              T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i)\n*\n               CALL CTRMV( 'Upper', 'No transpose', 'Non-unit', I-1, T,\n     $                     LDT, T( 1, I ), 1 )\n               T( I, I ) = TAU( I )\n               IF( I.GT.1 ) THEN\n                  PREVLASTV = MAX( PREVLASTV, LASTV )\n               ELSE\n                  PREVLASTV = LASTV\n               END IF\n            END IF\n         END DO\n      ELSE\n         PREVLASTV = 1\n         DO I = K, 1, -1\n            IF( TAU( I ).EQ.ZERO ) THEN\n*\n*              H(i)  =  I\n*\n               DO J = I, K\n                  T( J, I ) = ZERO\n               END DO\n            ELSE\n*\n*              general case\n*\n               IF( I.LT.K ) THEN\n                  IF( LSAME( STOREV, 'C' ) ) THEN\n*                    Skip any leading zeros.\n                     DO LASTV = 1, I-1\n                        IF( V( LASTV, I ).NE.ZERO ) EXIT\n                     END DO\n                     DO J = I+1, K\n                        T( J, I ) = -TAU( I ) * CONJG( V( N-K+I , J ) )\n                     END DO                        \n                     J = MAX( LASTV, PREVLASTV )\n*\n*                    T(i+1:k,i) = -tau(i) * V(j:n-k+i,i+1:k)**H * V(j:n-k+i,i)\n*\n                     CALL CGEMV( 'Conjugate transpose', N-K+I-J, K-I,\n     $                           -TAU( I ), V( J, I+1 ), LDV, V( J, I ),\n     $                           1, ONE, T( I+1, I ), 1 )\n                  ELSE\n*                    Skip any leading zeros.\n                     DO LASTV = 1, I-1\n                        IF( V( I, LASTV ).NE.ZERO ) EXIT\n                     END DO\n                     DO J = I+1, K\n                        T( J, I ) = -TAU( I ) * V( J, N-K+I )\n                     END DO                      \n                     J = MAX( LASTV, PREVLASTV )\n*\n*                    T(i+1:k,i) = -tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)**H\n*\n                     CALL CGEMM( 'N', 'C', K-I, 1, N-K+I-J, -TAU( I ),\n     $                           V( I+1, J ), LDV, V( I, J ), LDV,\n     $                           ONE, T( I+1, I ), LDT )                     \n                  END IF\n*\n*                 T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i)\n*\n                  CALL CTRMV( 'Lower', 'No transpose', 'Non-unit', K-I,\n     $                        T( I+1, I+1 ), LDT, T( I+1, I ), 1 )\n                  IF( I.GT.1 ) THEN\n                     PREVLASTV = MIN( PREVLASTV, LASTV )\n                  ELSE\n                     PREVLASTV = LASTV\n                  END IF\n               END IF\n               T( I, I ) = TAU( I )\n            END IF\n         END DO\n      END IF\n      RETURN\n*\n*     End of CLARFT\n*\n      END\n"
  },
  {
    "path": "libs/eigen/lapack/complex_double.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009-2011 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#define SCALAR        std::complex<double>\n#define SCALAR_SUFFIX z\n#define SCALAR_SUFFIX_UP \"Z\"\n#define REAL_SCALAR_SUFFIX d\n#define ISCOMPLEX     1\n\n#include \"cholesky.cpp\"\n#include \"lu.cpp\"\n"
  },
  {
    "path": "libs/eigen/lapack/complex_single.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009-2011 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#define SCALAR        std::complex<float>\n#define SCALAR_SUFFIX c\n#define SCALAR_SUFFIX_UP \"C\"\n#define REAL_SCALAR_SUFFIX s\n#define ISCOMPLEX     1\n\n#include \"cholesky.cpp\"\n#include \"lu.cpp\"\n"
  },
  {
    "path": "libs/eigen/lapack/dladiv.f",
    "content": "*> \\brief \\b DLADIV\n*\n*  =========== DOCUMENTATION ===========\n*\n* Online html documentation available at \n*            http://www.netlib.org/lapack/explore-html/ \n*\n*> \\htmlonly\n*> Download DLADIV + dependencies \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dladiv.f\"> \n*> [TGZ]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dladiv.f\"> \n*> [ZIP]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dladiv.f\"> \n*> [TXT]</a>\n*> \\endhtmlonly \n*\n*  Definition:\n*  ===========\n*\n*       SUBROUTINE DLADIV( A, B, C, D, P, Q )\n* \n*       .. Scalar Arguments ..\n*       DOUBLE PRECISION   A, B, C, D, P, Q\n*       ..\n*  \n*\n*> \\par Purpose:\n*  =============\n*>\n*> \\verbatim\n*>\n*> DLADIV performs complex division in  real arithmetic\n*>\n*>                       a + i*b\n*>            p + i*q = ---------\n*>                       c + i*d\n*>\n*> The algorithm is due to Robert L. Smith and can be found\n*> in D. Knuth, The art of Computer Programming, Vol.2, p.195\n*> \\endverbatim\n*\n*  Arguments:\n*  ==========\n*\n*> \\param[in] A\n*> \\verbatim\n*>          A is DOUBLE PRECISION\n*> \\endverbatim\n*>\n*> \\param[in] B\n*> \\verbatim\n*>          B is DOUBLE PRECISION\n*> \\endverbatim\n*>\n*> \\param[in] C\n*> \\verbatim\n*>          C is DOUBLE PRECISION\n*> \\endverbatim\n*>\n*> \\param[in] D\n*> \\verbatim\n*>          D is DOUBLE PRECISION\n*>          The scalars a, b, c, and d in the above expression.\n*> \\endverbatim\n*>\n*> \\param[out] P\n*> \\verbatim\n*>          P is DOUBLE PRECISION\n*> \\endverbatim\n*>\n*> \\param[out] Q\n*> \\verbatim\n*>          Q is DOUBLE PRECISION\n*>          The scalars p and q in the above expression.\n*> \\endverbatim\n*\n*  Authors:\n*  ========\n*\n*> \\author Univ. of Tennessee \n*> \\author Univ. of California Berkeley \n*> \\author Univ. of Colorado Denver \n*> \\author NAG Ltd. \n*\n*> \\date November 2011\n*\n*> \\ingroup auxOTHERauxiliary\n*\n*  =====================================================================\n      SUBROUTINE DLADIV( A, B, C, D, P, Q )\n*\n*  -- LAPACK auxiliary routine (version 3.4.0) --\n*  -- LAPACK is a software package provided by Univ. of Tennessee,    --\n*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--\n*     November 2011\n*\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION   A, B, C, D, P, Q\n*     ..\n*\n*  =====================================================================\n*\n*     .. Local Scalars ..\n      DOUBLE PRECISION   E, F\n*     ..\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS\n*     ..\n*     .. Executable Statements ..\n*\n      IF( ABS( D ).LT.ABS( C ) ) THEN\n         E = D / C\n         F = C + D*E\n         P = ( A+B*E ) / F\n         Q = ( B-A*E ) / F\n      ELSE\n         E = C / D\n         F = D + C*E\n         P = ( B+A*E ) / F\n         Q = ( -A+B*E ) / F\n      END IF\n*\n      RETURN\n*\n*     End of DLADIV\n*\n      END\n"
  },
  {
    "path": "libs/eigen/lapack/dlamch.f",
    "content": "*> \\brief \\b DLAMCH\n*\n*  =========== DOCUMENTATION ===========\n*\n* Online html documentation available at \n*            http://www.netlib.org/lapack/explore-html/ \n*\n*  Definition:\n*  ===========\n*\n*      DOUBLE PRECISION FUNCTION DLAMCH( CMACH )\n*  \n*\n*> \\par Purpose:\n*  =============\n*>\n*> \\verbatim\n*>\n*> DLAMCH determines double precision machine parameters.\n*> \\endverbatim\n*\n*  Arguments:\n*  ==========\n*\n*> \\param[in] CMACH\n*> \\verbatim\n*>          Specifies the value to be returned by DLAMCH:\n*>          = 'E' or 'e',   DLAMCH := eps\n*>          = 'S' or 's ,   DLAMCH := sfmin\n*>          = 'B' or 'b',   DLAMCH := base\n*>          = 'P' or 'p',   DLAMCH := eps*base\n*>          = 'N' or 'n',   DLAMCH := t\n*>          = 'R' or 'r',   DLAMCH := rnd\n*>          = 'M' or 'm',   DLAMCH := emin\n*>          = 'U' or 'u',   DLAMCH := rmin\n*>          = 'L' or 'l',   DLAMCH := emax\n*>          = 'O' or 'o',   DLAMCH := rmax\n*>          where\n*>          eps   = relative machine precision\n*>          sfmin = safe minimum, such that 1/sfmin does not overflow\n*>          base  = base of the machine\n*>          prec  = eps*base\n*>          t     = number of (base) digits in the mantissa\n*>          rnd   = 1.0 when rounding occurs in addition, 0.0 otherwise\n*>          emin  = minimum exponent before (gradual) underflow\n*>          rmin  = underflow threshold - base**(emin-1)\n*>          emax  = largest exponent before overflow\n*>          rmax  = overflow threshold  - (base**emax)*(1-eps)\n*> \\endverbatim\n*\n*  Authors:\n*  ========\n*\n*> \\author Univ. of Tennessee \n*> \\author Univ. of California Berkeley \n*> \\author Univ. of Colorado Denver \n*> \\author NAG Ltd. \n*\n*> \\date November 2011\n*\n*> \\ingroup auxOTHERauxiliary\n*\n*  =====================================================================\n      DOUBLE PRECISION FUNCTION DLAMCH( CMACH )\n*\n*  -- LAPACK auxiliary routine (version 3.4.0) --\n*  -- LAPACK is a software package provided by Univ. of Tennessee,    --\n*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--\n*     November 2011\n*\n*     .. Scalar Arguments ..\n      CHARACTER          CMACH\n*     ..\n*\n* =====================================================================\n*\n*     .. Parameters ..\n      DOUBLE PRECISION   ONE, ZERO\n      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )\n*     ..\n*     .. Local Scalars ..\n      DOUBLE PRECISION   RND, EPS, SFMIN, SMALL, RMACH\n*     ..\n*     .. External Functions ..\n      LOGICAL            LSAME\n      EXTERNAL           LSAME\n*     ..\n*     .. Intrinsic Functions ..\n      INTRINSIC          DIGITS, EPSILON, HUGE, MAXEXPONENT,\n     $                   MINEXPONENT, RADIX, TINY\n*     ..\n*     .. Executable Statements ..\n*\n*\n*     Assume rounding, not chopping. Always.\n*\n      RND = ONE\n*\n      IF( ONE.EQ.RND ) THEN\n         EPS = EPSILON(ZERO) * 0.5\n      ELSE\n         EPS = EPSILON(ZERO)\n      END IF\n*\n      IF( LSAME( CMACH, 'E' ) ) THEN\n         RMACH = EPS\n      ELSE IF( LSAME( CMACH, 'S' ) ) THEN\n         SFMIN = TINY(ZERO)\n         SMALL = ONE / HUGE(ZERO)\n         IF( SMALL.GE.SFMIN ) THEN\n*\n*           Use SMALL plus a bit, to avoid the possibility of rounding\n*           causing overflow when computing  1/sfmin.\n*\n            SFMIN = SMALL*( ONE+EPS )\n         END IF\n         RMACH = SFMIN\n      ELSE IF( LSAME( CMACH, 'B' ) ) THEN\n         RMACH = RADIX(ZERO)\n      ELSE IF( LSAME( CMACH, 'P' ) ) THEN\n         RMACH = EPS * RADIX(ZERO)\n      ELSE IF( LSAME( CMACH, 'N' ) ) THEN\n         RMACH = DIGITS(ZERO)\n      ELSE IF( LSAME( CMACH, 'R' ) ) THEN\n         RMACH = RND\n      ELSE IF( LSAME( CMACH, 'M' ) ) THEN\n         RMACH = MINEXPONENT(ZERO)\n      ELSE IF( LSAME( CMACH, 'U' ) ) THEN\n         RMACH = tiny(zero)\n      ELSE IF( LSAME( CMACH, 'L' ) ) THEN\n         RMACH = MAXEXPONENT(ZERO)\n      ELSE IF( LSAME( CMACH, 'O' ) ) THEN\n         RMACH = HUGE(ZERO)\n      ELSE\n         RMACH = ZERO\n      END IF\n*\n      DLAMCH = RMACH\n      RETURN\n*\n*     End of DLAMCH\n*\n      END\n************************************************************************\n*> \\brief \\b DLAMC3\n*> \\details\n*> \\b Purpose:\n*> \\verbatim\n*> DLAMC3  is intended to force  A  and  B  to be stored prior to doing\n*> the addition of  A  and  B ,  for use in situations where optimizers\n*> might hold one of these in a register.\n*> \\endverbatim\n*> \\author LAPACK is a software package provided by Univ. of Tennessee, Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..\n*> \\date November 2011\n*> \\ingroup auxOTHERauxiliary\n*>\n*> \\param[in] A\n*> \\verbatim\n*>          A is a DOUBLE PRECISION\n*> \\endverbatim\n*>\n*> \\param[in] B\n*> \\verbatim\n*>          B is a DOUBLE PRECISION\n*>          The values A and B.\n*> \\endverbatim\n*>\n      DOUBLE PRECISION FUNCTION DLAMC3( A, B )\n*\n*  -- LAPACK auxiliary routine (version 3.4.0) --\n*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..\n*     November 2010\n*\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION   A, B\n*     ..\n* =====================================================================\n*\n*     .. Executable Statements ..\n*\n      DLAMC3 = A + B\n*\n      RETURN\n*\n*     End of DLAMC3\n*\n      END\n*\n************************************************************************\n"
  },
  {
    "path": "libs/eigen/lapack/dlapy2.f",
    "content": "*> \\brief \\b DLAPY2\n*\n*  =========== DOCUMENTATION ===========\n*\n* Online html documentation available at \n*            http://www.netlib.org/lapack/explore-html/ \n*\n*> \\htmlonly\n*> Download DLAPY2 + dependencies \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlapy2.f\"> \n*> [TGZ]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlapy2.f\"> \n*> [ZIP]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlapy2.f\"> \n*> [TXT]</a>\n*> \\endhtmlonly \n*\n*  Definition:\n*  ===========\n*\n*       DOUBLE PRECISION FUNCTION DLAPY2( X, Y )\n* \n*       .. Scalar Arguments ..\n*       DOUBLE PRECISION   X, Y\n*       ..\n*  \n*\n*> \\par Purpose:\n*  =============\n*>\n*> \\verbatim\n*>\n*> DLAPY2 returns sqrt(x**2+y**2), taking care not to cause unnecessary\n*> overflow.\n*> \\endverbatim\n*\n*  Arguments:\n*  ==========\n*\n*> \\param[in] X\n*> \\verbatim\n*>          X is DOUBLE PRECISION\n*> \\endverbatim\n*>\n*> \\param[in] Y\n*> \\verbatim\n*>          Y is DOUBLE PRECISION\n*>          X and Y specify the values x and y.\n*> \\endverbatim\n*\n*  Authors:\n*  ========\n*\n*> \\author Univ. of Tennessee \n*> \\author Univ. of California Berkeley \n*> \\author Univ. of Colorado Denver \n*> \\author NAG Ltd. \n*\n*> \\date November 2011\n*\n*> \\ingroup auxOTHERauxiliary\n*\n*  =====================================================================\n      DOUBLE PRECISION FUNCTION DLAPY2( X, Y )\n*\n*  -- LAPACK auxiliary routine (version 3.4.0) --\n*  -- LAPACK is a software package provided by Univ. of Tennessee,    --\n*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--\n*     November 2011\n*\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION   X, Y\n*     ..\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      DOUBLE PRECISION   ZERO\n      PARAMETER          ( ZERO = 0.0D0 )\n      DOUBLE PRECISION   ONE\n      PARAMETER          ( ONE = 1.0D0 )\n*     ..\n*     .. Local Scalars ..\n      DOUBLE PRECISION   W, XABS, YABS, Z\n*     ..\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, MAX, MIN, SQRT\n*     ..\n*     .. Executable Statements ..\n*\n      XABS = ABS( X )\n      YABS = ABS( Y )\n      W = MAX( XABS, YABS )\n      Z = MIN( XABS, YABS )\n      IF( Z.EQ.ZERO ) THEN\n         DLAPY2 = W\n      ELSE\n         DLAPY2 = W*SQRT( ONE+( Z / W )**2 )\n      END IF\n      RETURN\n*\n*     End of DLAPY2\n*\n      END\n"
  },
  {
    "path": "libs/eigen/lapack/dlapy3.f",
    "content": "*> \\brief \\b DLAPY3\n*\n*  =========== DOCUMENTATION ===========\n*\n* Online html documentation available at \n*            http://www.netlib.org/lapack/explore-html/ \n*\n*> \\htmlonly\n*> Download DLAPY3 + dependencies \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlapy3.f\"> \n*> [TGZ]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlapy3.f\"> \n*> [ZIP]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlapy3.f\"> \n*> [TXT]</a>\n*> \\endhtmlonly \n*\n*  Definition:\n*  ===========\n*\n*       DOUBLE PRECISION FUNCTION DLAPY3( X, Y, Z )\n* \n*       .. Scalar Arguments ..\n*       DOUBLE PRECISION   X, Y, Z\n*       ..\n*  \n*\n*> \\par Purpose:\n*  =============\n*>\n*> \\verbatim\n*>\n*> DLAPY3 returns sqrt(x**2+y**2+z**2), taking care not to cause\n*> unnecessary overflow.\n*> \\endverbatim\n*\n*  Arguments:\n*  ==========\n*\n*> \\param[in] X\n*> \\verbatim\n*>          X is DOUBLE PRECISION\n*> \\endverbatim\n*>\n*> \\param[in] Y\n*> \\verbatim\n*>          Y is DOUBLE PRECISION\n*> \\endverbatim\n*>\n*> \\param[in] Z\n*> \\verbatim\n*>          Z is DOUBLE PRECISION\n*>          X, Y and Z specify the values x, y and z.\n*> \\endverbatim\n*\n*  Authors:\n*  ========\n*\n*> \\author Univ. of Tennessee \n*> \\author Univ. of California Berkeley \n*> \\author Univ. of Colorado Denver \n*> \\author NAG Ltd. \n*\n*> \\date November 2011\n*\n*> \\ingroup auxOTHERauxiliary\n*\n*  =====================================================================\n      DOUBLE PRECISION FUNCTION DLAPY3( X, Y, Z )\n*\n*  -- LAPACK auxiliary routine (version 3.4.0) --\n*  -- LAPACK is a software package provided by Univ. of Tennessee,    --\n*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--\n*     November 2011\n*\n*     .. Scalar Arguments ..\n      DOUBLE PRECISION   X, Y, Z\n*     ..\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      DOUBLE PRECISION   ZERO\n      PARAMETER          ( ZERO = 0.0D0 )\n*     ..\n*     .. Local Scalars ..\n      DOUBLE PRECISION   W, XABS, YABS, ZABS\n*     ..\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, MAX, SQRT\n*     ..\n*     .. Executable Statements ..\n*\n      XABS = ABS( X )\n      YABS = ABS( Y )\n      ZABS = ABS( Z )\n      W = MAX( XABS, YABS, ZABS )\n      IF( W.EQ.ZERO ) THEN\n*     W can be zero for max(0,nan,0)\n*     adding all three entries together will make sure\n*     NaN will not disappear.\n         DLAPY3 =  XABS + YABS + ZABS\n      ELSE\n         DLAPY3 = W*SQRT( ( XABS / W )**2+( YABS / W )**2+\n     $            ( ZABS / W )**2 )\n      END IF\n      RETURN\n*\n*     End of DLAPY3\n*\n      END\n"
  },
  {
    "path": "libs/eigen/lapack/dlarf.f",
    "content": "*> \\brief \\b DLARF\n*\n*  =========== DOCUMENTATION ===========\n*\n* Online html documentation available at \n*            http://www.netlib.org/lapack/explore-html/ \n*\n*> \\htmlonly\n*> Download DLARF + dependencies \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlarf.f\"> \n*> [TGZ]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlarf.f\"> \n*> [ZIP]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlarf.f\"> \n*> [TXT]</a>\n*> \\endhtmlonly \n*\n*  Definition:\n*  ===========\n*\n*       SUBROUTINE DLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK )\n* \n*       .. Scalar Arguments ..\n*       CHARACTER          SIDE\n*       INTEGER            INCV, LDC, M, N\n*       DOUBLE PRECISION   TAU\n*       ..\n*       .. Array Arguments ..\n*       DOUBLE PRECISION   C( LDC, * ), V( * ), WORK( * )\n*       ..\n*  \n*\n*> \\par Purpose:\n*  =============\n*>\n*> \\verbatim\n*>\n*> DLARF applies a real elementary reflector H to a real m by n matrix\n*> C, from either the left or the right. H is represented in the form\n*>\n*>       H = I - tau * v * v**T\n*>\n*> where tau is a real scalar and v is a real vector.\n*>\n*> If tau = 0, then H is taken to be the unit matrix.\n*> \\endverbatim\n*\n*  Arguments:\n*  ==========\n*\n*> \\param[in] SIDE\n*> \\verbatim\n*>          SIDE is CHARACTER*1\n*>          = 'L': form  H * C\n*>          = 'R': form  C * H\n*> \\endverbatim\n*>\n*> \\param[in] M\n*> \\verbatim\n*>          M is INTEGER\n*>          The number of rows of the matrix C.\n*> \\endverbatim\n*>\n*> \\param[in] N\n*> \\verbatim\n*>          N is INTEGER\n*>          The number of columns of the matrix C.\n*> \\endverbatim\n*>\n*> \\param[in] V\n*> \\verbatim\n*>          V is DOUBLE PRECISION array, dimension\n*>                     (1 + (M-1)*abs(INCV)) if SIDE = 'L'\n*>                  or (1 + (N-1)*abs(INCV)) if SIDE = 'R'\n*>          The vector v in the representation of H. V is not used if\n*>          TAU = 0.\n*> \\endverbatim\n*>\n*> \\param[in] INCV\n*> \\verbatim\n*>          INCV is INTEGER\n*>          The increment between elements of v. INCV <> 0.\n*> \\endverbatim\n*>\n*> \\param[in] TAU\n*> \\verbatim\n*>          TAU is DOUBLE PRECISION\n*>          The value tau in the representation of H.\n*> \\endverbatim\n*>\n*> \\param[in,out] C\n*> \\verbatim\n*>          C is DOUBLE PRECISION array, dimension (LDC,N)\n*>          On entry, the m by n matrix C.\n*>          On exit, C is overwritten by the matrix H * C if SIDE = 'L',\n*>          or C * H if SIDE = 'R'.\n*> \\endverbatim\n*>\n*> \\param[in] LDC\n*> \\verbatim\n*>          LDC is INTEGER\n*>          The leading dimension of the array C. LDC >= max(1,M).\n*> \\endverbatim\n*>\n*> \\param[out] WORK\n*> \\verbatim\n*>          WORK is DOUBLE PRECISION array, dimension\n*>                         (N) if SIDE = 'L'\n*>                      or (M) if SIDE = 'R'\n*> \\endverbatim\n*\n*  Authors:\n*  ========\n*\n*> \\author Univ. of Tennessee \n*> \\author Univ. of California Berkeley \n*> \\author Univ. of Colorado Denver \n*> \\author NAG Ltd. \n*\n*> \\date November 2011\n*\n*> \\ingroup doubleOTHERauxiliary\n*\n*  =====================================================================\n      SUBROUTINE DLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK )\n*\n*  -- LAPACK auxiliary routine (version 3.4.0) --\n*  -- LAPACK is a software package provided by Univ. of Tennessee,    --\n*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--\n*     November 2011\n*\n*     .. Scalar Arguments ..\n      CHARACTER          SIDE\n      INTEGER            INCV, LDC, M, N\n      DOUBLE PRECISION   TAU\n*     ..\n*     .. Array Arguments ..\n      DOUBLE PRECISION   C( LDC, * ), V( * ), WORK( * )\n*     ..\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      DOUBLE PRECISION   ONE, ZERO\n      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )\n*     ..\n*     .. Local Scalars ..\n      LOGICAL            APPLYLEFT\n      INTEGER            I, LASTV, LASTC\n*     ..\n*     .. External Subroutines ..\n      EXTERNAL           DGEMV, DGER\n*     ..\n*     .. External Functions ..\n      LOGICAL            LSAME\n      INTEGER            ILADLR, ILADLC\n      EXTERNAL           LSAME, ILADLR, ILADLC\n*     ..\n*     .. Executable Statements ..\n*\n      APPLYLEFT = LSAME( SIDE, 'L' )\n      LASTV = 0\n      LASTC = 0\n      IF( TAU.NE.ZERO ) THEN\n!     Set up variables for scanning V.  LASTV begins pointing to the end\n!     of V.\n         IF( APPLYLEFT ) THEN\n            LASTV = M\n         ELSE\n            LASTV = N\n         END IF\n         IF( INCV.GT.0 ) THEN\n            I = 1 + (LASTV-1) * INCV\n         ELSE\n            I = 1\n         END IF\n!     Look for the last non-zero row in V.\n         DO WHILE( LASTV.GT.0 .AND. V( I ).EQ.ZERO )\n            LASTV = LASTV - 1\n            I = I - INCV\n         END DO\n         IF( APPLYLEFT ) THEN\n!     Scan for the last non-zero column in C(1:lastv,:).\n            LASTC = ILADLC(LASTV, N, C, LDC)\n         ELSE\n!     Scan for the last non-zero row in C(:,1:lastv).\n            LASTC = ILADLR(M, LASTV, C, LDC)\n         END IF\n      END IF\n!     Note that lastc.eq.0 renders the BLAS operations null; no special\n!     case is needed at this level.\n      IF( APPLYLEFT ) THEN\n*\n*        Form  H * C\n*\n         IF( LASTV.GT.0 ) THEN\n*\n*           w(1:lastc,1) := C(1:lastv,1:lastc)**T * v(1:lastv,1)\n*\n            CALL DGEMV( 'Transpose', LASTV, LASTC, ONE, C, LDC, V, INCV,\n     $           ZERO, WORK, 1 )\n*\n*           C(1:lastv,1:lastc) := C(...) - v(1:lastv,1) * w(1:lastc,1)**T\n*\n            CALL DGER( LASTV, LASTC, -TAU, V, INCV, WORK, 1, C, LDC )\n         END IF\n      ELSE\n*\n*        Form  C * H\n*\n         IF( LASTV.GT.0 ) THEN\n*\n*           w(1:lastc,1) := C(1:lastc,1:lastv) * v(1:lastv,1)\n*\n            CALL DGEMV( 'No transpose', LASTC, LASTV, ONE, C, LDC,\n     $           V, INCV, ZERO, WORK, 1 )\n*\n*           C(1:lastc,1:lastv) := C(...) - w(1:lastc,1) * v(1:lastv,1)**T\n*\n            CALL DGER( LASTC, LASTV, -TAU, WORK, 1, V, INCV, C, LDC )\n         END IF\n      END IF\n      RETURN\n*\n*     End of DLARF\n*\n      END\n"
  },
  {
    "path": "libs/eigen/lapack/dlarfb.f",
    "content": "*> \\brief \\b DLARFB\n*\n*  =========== DOCUMENTATION ===========\n*\n* Online html documentation available at \n*            http://www.netlib.org/lapack/explore-html/ \n*\n*> \\htmlonly\n*> Download DLARFB + dependencies \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlarfb.f\"> \n*> [TGZ]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlarfb.f\"> \n*> [ZIP]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlarfb.f\"> \n*> [TXT]</a>\n*> \\endhtmlonly \n*\n*  Definition:\n*  ===========\n*\n*       SUBROUTINE DLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV,\n*                          T, LDT, C, LDC, WORK, LDWORK )\n* \n*       .. Scalar Arguments ..\n*       CHARACTER          DIRECT, SIDE, STOREV, TRANS\n*       INTEGER            K, LDC, LDT, LDV, LDWORK, M, N\n*       ..\n*       .. Array Arguments ..\n*       DOUBLE PRECISION   C( LDC, * ), T( LDT, * ), V( LDV, * ),\n*      $                   WORK( LDWORK, * )\n*       ..\n*  \n*\n*> \\par Purpose:\n*  =============\n*>\n*> \\verbatim\n*>\n*> DLARFB applies a real block reflector H or its transpose H**T to a\n*> real m by n matrix C, from either the left or the right.\n*> \\endverbatim\n*\n*  Arguments:\n*  ==========\n*\n*> \\param[in] SIDE\n*> \\verbatim\n*>          SIDE is CHARACTER*1\n*>          = 'L': apply H or H**T from the Left\n*>          = 'R': apply H or H**T from the Right\n*> \\endverbatim\n*>\n*> \\param[in] TRANS\n*> \\verbatim\n*>          TRANS is CHARACTER*1\n*>          = 'N': apply H (No transpose)\n*>          = 'T': apply H**T (Transpose)\n*> \\endverbatim\n*>\n*> \\param[in] DIRECT\n*> \\verbatim\n*>          DIRECT is CHARACTER*1\n*>          Indicates how H is formed from a product of elementary\n*>          reflectors\n*>          = 'F': H = H(1) H(2) . . . H(k) (Forward)\n*>          = 'B': H = H(k) . . . H(2) H(1) (Backward)\n*> \\endverbatim\n*>\n*> \\param[in] STOREV\n*> \\verbatim\n*>          STOREV is CHARACTER*1\n*>          Indicates how the vectors which define the elementary\n*>          reflectors are stored:\n*>          = 'C': Columnwise\n*>          = 'R': Rowwise\n*> \\endverbatim\n*>\n*> \\param[in] M\n*> \\verbatim\n*>          M is INTEGER\n*>          The number of rows of the matrix C.\n*> \\endverbatim\n*>\n*> \\param[in] N\n*> \\verbatim\n*>          N is INTEGER\n*>          The number of columns of the matrix C.\n*> \\endverbatim\n*>\n*> \\param[in] K\n*> \\verbatim\n*>          K is INTEGER\n*>          The order of the matrix T (= the number of elementary\n*>          reflectors whose product defines the block reflector).\n*> \\endverbatim\n*>\n*> \\param[in] V\n*> \\verbatim\n*>          V is DOUBLE PRECISION array, dimension\n*>                                (LDV,K) if STOREV = 'C'\n*>                                (LDV,M) if STOREV = 'R' and SIDE = 'L'\n*>                                (LDV,N) if STOREV = 'R' and SIDE = 'R'\n*>          The matrix V. See Further Details.\n*> \\endverbatim\n*>\n*> \\param[in] LDV\n*> \\verbatim\n*>          LDV is INTEGER\n*>          The leading dimension of the array V.\n*>          If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M);\n*>          if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N);\n*>          if STOREV = 'R', LDV >= K.\n*> \\endverbatim\n*>\n*> \\param[in] T\n*> \\verbatim\n*>          T is DOUBLE PRECISION array, dimension (LDT,K)\n*>          The triangular k by k matrix T in the representation of the\n*>          block reflector.\n*> \\endverbatim\n*>\n*> \\param[in] LDT\n*> \\verbatim\n*>          LDT is INTEGER\n*>          The leading dimension of the array T. LDT >= K.\n*> \\endverbatim\n*>\n*> \\param[in,out] C\n*> \\verbatim\n*>          C is DOUBLE PRECISION array, dimension (LDC,N)\n*>          On entry, the m by n matrix C.\n*>          On exit, C is overwritten by H*C or H**T*C or C*H or C*H**T.\n*> \\endverbatim\n*>\n*> \\param[in] LDC\n*> \\verbatim\n*>          LDC is INTEGER\n*>          The leading dimension of the array C. LDC >= max(1,M).\n*> \\endverbatim\n*>\n*> \\param[out] WORK\n*> \\verbatim\n*>          WORK is DOUBLE PRECISION array, dimension (LDWORK,K)\n*> \\endverbatim\n*>\n*> \\param[in] LDWORK\n*> \\verbatim\n*>          LDWORK is INTEGER\n*>          The leading dimension of the array WORK.\n*>          If SIDE = 'L', LDWORK >= max(1,N);\n*>          if SIDE = 'R', LDWORK >= max(1,M).\n*> \\endverbatim\n*\n*  Authors:\n*  ========\n*\n*> \\author Univ. of Tennessee \n*> \\author Univ. of California Berkeley \n*> \\author Univ. of Colorado Denver \n*> \\author NAG Ltd. \n*\n*> \\date November 2011\n*\n*> \\ingroup doubleOTHERauxiliary\n*\n*> \\par Further Details:\n*  =====================\n*>\n*> \\verbatim\n*>\n*>  The shape of the matrix V and the storage of the vectors which define\n*>  the H(i) is best illustrated by the following example with n = 5 and\n*>  k = 3. The elements equal to 1 are not stored; the corresponding\n*>  array elements are modified but restored on exit. The rest of the\n*>  array is not used.\n*>\n*>  DIRECT = 'F' and STOREV = 'C':         DIRECT = 'F' and STOREV = 'R':\n*>\n*>               V = (  1       )                 V = (  1 v1 v1 v1 v1 )\n*>                   ( v1  1    )                     (     1 v2 v2 v2 )\n*>                   ( v1 v2  1 )                     (        1 v3 v3 )\n*>                   ( v1 v2 v3 )\n*>                   ( v1 v2 v3 )\n*>\n*>  DIRECT = 'B' and STOREV = 'C':         DIRECT = 'B' and STOREV = 'R':\n*>\n*>               V = ( v1 v2 v3 )                 V = ( v1 v1  1       )\n*>                   ( v1 v2 v3 )                     ( v2 v2 v2  1    )\n*>                   (  1 v2 v3 )                     ( v3 v3 v3 v3  1 )\n*>                   (     1 v3 )\n*>                   (        1 )\n*> \\endverbatim\n*>\n*  =====================================================================\n      SUBROUTINE DLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV,\n     $                   T, LDT, C, LDC, WORK, LDWORK )\n*\n*  -- LAPACK auxiliary routine (version 3.4.0) --\n*  -- LAPACK is a software package provided by Univ. of Tennessee,    --\n*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--\n*     November 2011\n*\n*     .. Scalar Arguments ..\n      CHARACTER          DIRECT, SIDE, STOREV, TRANS\n      INTEGER            K, LDC, LDT, LDV, LDWORK, M, N\n*     ..\n*     .. Array Arguments ..\n      DOUBLE PRECISION   C( LDC, * ), T( LDT, * ), V( LDV, * ),\n     $                   WORK( LDWORK, * )\n*     ..\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      DOUBLE PRECISION   ONE\n      PARAMETER          ( ONE = 1.0D+0 )\n*     ..\n*     .. Local Scalars ..\n      CHARACTER          TRANST\n      INTEGER            I, J, LASTV, LASTC\n*     ..\n*     .. External Functions ..\n      LOGICAL            LSAME\n      INTEGER            ILADLR, ILADLC\n      EXTERNAL           LSAME, ILADLR, ILADLC\n*     ..\n*     .. External Subroutines ..\n      EXTERNAL           DCOPY, DGEMM, DTRMM\n*     ..\n*     .. Executable Statements ..\n*\n*     Quick return if possible\n*\n      IF( M.LE.0 .OR. N.LE.0 )\n     $   RETURN\n*\n      IF( LSAME( TRANS, 'N' ) ) THEN\n         TRANST = 'T'\n      ELSE\n         TRANST = 'N'\n      END IF\n*\n      IF( LSAME( STOREV, 'C' ) ) THEN\n*\n         IF( LSAME( DIRECT, 'F' ) ) THEN\n*\n*           Let  V =  ( V1 )    (first K rows)\n*                     ( V2 )\n*           where  V1  is unit lower triangular.\n*\n            IF( LSAME( SIDE, 'L' ) ) THEN\n*\n*              Form  H * C  or  H**T * C  where  C = ( C1 )\n*                                                    ( C2 )\n*\n               LASTV = MAX( K, ILADLR( M, K, V, LDV ) )\n               LASTC = ILADLC( LASTV, N, C, LDC )\n*\n*              W := C**T * V  =  (C1**T * V1 + C2**T * V2)  (stored in WORK)\n*\n*              W := C1**T\n*\n               DO 10 J = 1, K\n                  CALL DCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 )\n   10          CONTINUE\n*\n*              W := W * V1\n*\n               CALL DTRMM( 'Right', 'Lower', 'No transpose', 'Unit',\n     $              LASTC, K, ONE, V, LDV, WORK, LDWORK )\n               IF( LASTV.GT.K ) THEN\n*\n*                 W := W + C2**T *V2\n*\n                  CALL DGEMM( 'Transpose', 'No transpose',\n     $                 LASTC, K, LASTV-K,\n     $                 ONE, C( K+1, 1 ), LDC, V( K+1, 1 ), LDV,\n     $                 ONE, WORK, LDWORK )\n               END IF\n*\n*              W := W * T**T  or  W * T\n*\n               CALL DTRMM( 'Right', 'Upper', TRANST, 'Non-unit',\n     $              LASTC, K, ONE, T, LDT, WORK, LDWORK )\n*\n*              C := C - V * W**T\n*\n               IF( LASTV.GT.K ) THEN\n*\n*                 C2 := C2 - V2 * W**T\n*\n                  CALL DGEMM( 'No transpose', 'Transpose',\n     $                 LASTV-K, LASTC, K,\n     $                 -ONE, V( K+1, 1 ), LDV, WORK, LDWORK, ONE,\n     $                 C( K+1, 1 ), LDC )\n               END IF\n*\n*              W := W * V1**T\n*\n               CALL DTRMM( 'Right', 'Lower', 'Transpose', 'Unit',\n     $              LASTC, K, ONE, V, LDV, WORK, LDWORK )\n*\n*              C1 := C1 - W**T\n*\n               DO 30 J = 1, K\n                  DO 20 I = 1, LASTC\n                     C( J, I ) = C( J, I ) - WORK( I, J )\n   20             CONTINUE\n   30          CONTINUE\n*\n            ELSE IF( LSAME( SIDE, 'R' ) ) THEN\n*\n*              Form  C * H  or  C * H**T  where  C = ( C1  C2 )\n*\n               LASTV = MAX( K, ILADLR( N, K, V, LDV ) )\n               LASTC = ILADLR( M, LASTV, C, LDC )\n*\n*              W := C * V  =  (C1*V1 + C2*V2)  (stored in WORK)\n*\n*              W := C1\n*\n               DO 40 J = 1, K\n                  CALL DCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 )\n   40          CONTINUE\n*\n*              W := W * V1\n*\n               CALL DTRMM( 'Right', 'Lower', 'No transpose', 'Unit',\n     $              LASTC, K, ONE, V, LDV, WORK, LDWORK )\n               IF( LASTV.GT.K ) THEN\n*\n*                 W := W + C2 * V2\n*\n                  CALL DGEMM( 'No transpose', 'No transpose',\n     $                 LASTC, K, LASTV-K,\n     $                 ONE, C( 1, K+1 ), LDC, V( K+1, 1 ), LDV,\n     $                 ONE, WORK, LDWORK )\n               END IF\n*\n*              W := W * T  or  W * T**T\n*\n               CALL DTRMM( 'Right', 'Upper', TRANS, 'Non-unit',\n     $              LASTC, K, ONE, T, LDT, WORK, LDWORK )\n*\n*              C := C - W * V**T\n*\n               IF( LASTV.GT.K ) THEN\n*\n*                 C2 := C2 - W * V2**T\n*\n                  CALL DGEMM( 'No transpose', 'Transpose',\n     $                 LASTC, LASTV-K, K,\n     $                 -ONE, WORK, LDWORK, V( K+1, 1 ), LDV, ONE,\n     $                 C( 1, K+1 ), LDC )\n               END IF\n*\n*              W := W * V1**T\n*\n               CALL DTRMM( 'Right', 'Lower', 'Transpose', 'Unit',\n     $              LASTC, K, ONE, V, LDV, WORK, LDWORK )\n*\n*              C1 := C1 - W\n*\n               DO 60 J = 1, K\n                  DO 50 I = 1, LASTC\n                     C( I, J ) = C( I, J ) - WORK( I, J )\n   50             CONTINUE\n   60          CONTINUE\n            END IF\n*\n         ELSE\n*\n*           Let  V =  ( V1 )\n*                     ( V2 )    (last K rows)\n*           where  V2  is unit upper triangular.\n*\n            IF( LSAME( SIDE, 'L' ) ) THEN\n*\n*              Form  H * C  or  H**T * C  where  C = ( C1 )\n*                                                    ( C2 )\n*\n               LASTV = MAX( K, ILADLR( M, K, V, LDV ) )\n               LASTC = ILADLC( LASTV, N, C, LDC )\n*\n*              W := C**T * V  =  (C1**T * V1 + C2**T * V2)  (stored in WORK)\n*\n*              W := C2**T\n*\n               DO 70 J = 1, K\n                  CALL DCOPY( LASTC, C( LASTV-K+J, 1 ), LDC,\n     $                 WORK( 1, J ), 1 )\n   70          CONTINUE\n*\n*              W := W * V2\n*\n               CALL DTRMM( 'Right', 'Upper', 'No transpose', 'Unit',\n     $              LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV,\n     $              WORK, LDWORK )\n               IF( LASTV.GT.K ) THEN\n*\n*                 W := W + C1**T*V1\n*\n                  CALL DGEMM( 'Transpose', 'No transpose',\n     $                 LASTC, K, LASTV-K, ONE, C, LDC, V, LDV,\n     $                 ONE, WORK, LDWORK )\n               END IF\n*\n*              W := W * T**T  or  W * T\n*\n               CALL DTRMM( 'Right', 'Lower', TRANST, 'Non-unit',\n     $              LASTC, K, ONE, T, LDT, WORK, LDWORK )\n*\n*              C := C - V * W**T\n*\n               IF( LASTV.GT.K ) THEN\n*\n*                 C1 := C1 - V1 * W**T\n*\n                  CALL DGEMM( 'No transpose', 'Transpose',\n     $                 LASTV-K, LASTC, K, -ONE, V, LDV, WORK, LDWORK,\n     $                 ONE, C, LDC )\n               END IF\n*\n*              W := W * V2**T\n*\n               CALL DTRMM( 'Right', 'Upper', 'Transpose', 'Unit',\n     $              LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV,\n     $              WORK, LDWORK )\n*\n*              C2 := C2 - W**T\n*\n               DO 90 J = 1, K\n                  DO 80 I = 1, LASTC\n                     C( LASTV-K+J, I ) = C( LASTV-K+J, I ) - WORK(I, J)\n   80             CONTINUE\n   90          CONTINUE\n*\n            ELSE IF( LSAME( SIDE, 'R' ) ) THEN\n*\n*              Form  C * H  or  C * H**T  where  C = ( C1  C2 )\n*\n               LASTV = MAX( K, ILADLR( N, K, V, LDV ) )\n               LASTC = ILADLR( M, LASTV, C, LDC )\n*\n*              W := C * V  =  (C1*V1 + C2*V2)  (stored in WORK)\n*\n*              W := C2\n*\n               DO 100 J = 1, K\n                  CALL DCOPY( LASTC, C( 1, N-K+J ), 1, WORK( 1, J ), 1 )\n  100          CONTINUE\n*\n*              W := W * V2\n*\n               CALL DTRMM( 'Right', 'Upper', 'No transpose', 'Unit',\n     $              LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV,\n     $              WORK, LDWORK )\n               IF( LASTV.GT.K ) THEN\n*\n*                 W := W + C1 * V1\n*\n                  CALL DGEMM( 'No transpose', 'No transpose',\n     $                 LASTC, K, LASTV-K, ONE, C, LDC, V, LDV,\n     $                 ONE, WORK, LDWORK )\n               END IF\n*\n*              W := W * T  or  W * T**T\n*\n               CALL DTRMM( 'Right', 'Lower', TRANS, 'Non-unit',\n     $              LASTC, K, ONE, T, LDT, WORK, LDWORK )\n*\n*              C := C - W * V**T\n*\n               IF( LASTV.GT.K ) THEN\n*\n*                 C1 := C1 - W * V1**T\n*\n                  CALL DGEMM( 'No transpose', 'Transpose',\n     $                 LASTC, LASTV-K, K, -ONE, WORK, LDWORK, V, LDV,\n     $                 ONE, C, LDC )\n               END IF\n*\n*              W := W * V2**T\n*\n               CALL DTRMM( 'Right', 'Upper', 'Transpose', 'Unit',\n     $              LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV,\n     $              WORK, LDWORK )\n*\n*              C2 := C2 - W\n*\n               DO 120 J = 1, K\n                  DO 110 I = 1, LASTC\n                     C( I, LASTV-K+J ) = C( I, LASTV-K+J ) - WORK(I, J)\n  110             CONTINUE\n  120          CONTINUE\n            END IF\n         END IF\n*\n      ELSE IF( LSAME( STOREV, 'R' ) ) THEN\n*\n         IF( LSAME( DIRECT, 'F' ) ) THEN\n*\n*           Let  V =  ( V1  V2 )    (V1: first K columns)\n*           where  V1  is unit upper triangular.\n*\n            IF( LSAME( SIDE, 'L' ) ) THEN\n*\n*              Form  H * C  or  H**T * C  where  C = ( C1 )\n*                                                    ( C2 )\n*\n               LASTV = MAX( K, ILADLC( K, M, V, LDV ) )\n               LASTC = ILADLC( LASTV, N, C, LDC )\n*\n*              W := C**T * V**T  =  (C1**T * V1**T + C2**T * V2**T) (stored in WORK)\n*\n*              W := C1**T\n*\n               DO 130 J = 1, K\n                  CALL DCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 )\n  130          CONTINUE\n*\n*              W := W * V1**T\n*\n               CALL DTRMM( 'Right', 'Upper', 'Transpose', 'Unit',\n     $              LASTC, K, ONE, V, LDV, WORK, LDWORK )\n               IF( LASTV.GT.K ) THEN\n*\n*                 W := W + C2**T*V2**T\n*\n                  CALL DGEMM( 'Transpose', 'Transpose',\n     $                 LASTC, K, LASTV-K,\n     $                 ONE, C( K+1, 1 ), LDC, V( 1, K+1 ), LDV,\n     $                 ONE, WORK, LDWORK )\n               END IF\n*\n*              W := W * T**T  or  W * T\n*\n               CALL DTRMM( 'Right', 'Upper', TRANST, 'Non-unit',\n     $              LASTC, K, ONE, T, LDT, WORK, LDWORK )\n*\n*              C := C - V**T * W**T\n*\n               IF( LASTV.GT.K ) THEN\n*\n*                 C2 := C2 - V2**T * W**T\n*\n                  CALL DGEMM( 'Transpose', 'Transpose',\n     $                 LASTV-K, LASTC, K,\n     $                 -ONE, V( 1, K+1 ), LDV, WORK, LDWORK,\n     $                 ONE, C( K+1, 1 ), LDC )\n               END IF\n*\n*              W := W * V1\n*\n               CALL DTRMM( 'Right', 'Upper', 'No transpose', 'Unit',\n     $              LASTC, K, ONE, V, LDV, WORK, LDWORK )\n*\n*              C1 := C1 - W**T\n*\n               DO 150 J = 1, K\n                  DO 140 I = 1, LASTC\n                     C( J, I ) = C( J, I ) - WORK( I, J )\n  140             CONTINUE\n  150          CONTINUE\n*\n            ELSE IF( LSAME( SIDE, 'R' ) ) THEN\n*\n*              Form  C * H  or  C * H**T  where  C = ( C1  C2 )\n*\n               LASTV = MAX( K, ILADLC( K, N, V, LDV ) )\n               LASTC = ILADLR( M, LASTV, C, LDC )\n*\n*              W := C * V**T  =  (C1*V1**T + C2*V2**T)  (stored in WORK)\n*\n*              W := C1\n*\n               DO 160 J = 1, K\n                  CALL DCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 )\n  160          CONTINUE\n*\n*              W := W * V1**T\n*\n               CALL DTRMM( 'Right', 'Upper', 'Transpose', 'Unit',\n     $              LASTC, K, ONE, V, LDV, WORK, LDWORK )\n               IF( LASTV.GT.K ) THEN\n*\n*                 W := W + C2 * V2**T\n*\n                  CALL DGEMM( 'No transpose', 'Transpose',\n     $                 LASTC, K, LASTV-K,\n     $                 ONE, C( 1, K+1 ), LDC, V( 1, K+1 ), LDV,\n     $                 ONE, WORK, LDWORK )\n               END IF\n*\n*              W := W * T  or  W * T**T\n*\n               CALL DTRMM( 'Right', 'Upper', TRANS, 'Non-unit',\n     $              LASTC, K, ONE, T, LDT, WORK, LDWORK )\n*\n*              C := C - W * V\n*\n               IF( LASTV.GT.K ) THEN\n*\n*                 C2 := C2 - W * V2\n*\n                  CALL DGEMM( 'No transpose', 'No transpose',\n     $                 LASTC, LASTV-K, K,\n     $                 -ONE, WORK, LDWORK, V( 1, K+1 ), LDV,\n     $                 ONE, C( 1, K+1 ), LDC )\n               END IF\n*\n*              W := W * V1\n*\n               CALL DTRMM( 'Right', 'Upper', 'No transpose', 'Unit',\n     $              LASTC, K, ONE, V, LDV, WORK, LDWORK )\n*\n*              C1 := C1 - W\n*\n               DO 180 J = 1, K\n                  DO 170 I = 1, LASTC\n                     C( I, J ) = C( I, J ) - WORK( I, J )\n  170             CONTINUE\n  180          CONTINUE\n*\n            END IF\n*\n         ELSE\n*\n*           Let  V =  ( V1  V2 )    (V2: last K columns)\n*           where  V2  is unit lower triangular.\n*\n            IF( LSAME( SIDE, 'L' ) ) THEN\n*\n*              Form  H * C  or  H**T * C  where  C = ( C1 )\n*                                                    ( C2 )\n*\n               LASTV = MAX( K, ILADLC( K, M, V, LDV ) )\n               LASTC = ILADLC( LASTV, N, C, LDC )\n*\n*              W := C**T * V**T  =  (C1**T * V1**T + C2**T * V2**T) (stored in WORK)\n*\n*              W := C2**T\n*\n               DO 190 J = 1, K\n                  CALL DCOPY( LASTC, C( LASTV-K+J, 1 ), LDC,\n     $                 WORK( 1, J ), 1 )\n  190          CONTINUE\n*\n*              W := W * V2**T\n*\n               CALL DTRMM( 'Right', 'Lower', 'Transpose', 'Unit',\n     $              LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV,\n     $              WORK, LDWORK )\n               IF( LASTV.GT.K ) THEN\n*\n*                 W := W + C1**T * V1**T\n*\n                  CALL DGEMM( 'Transpose', 'Transpose',\n     $                 LASTC, K, LASTV-K, ONE, C, LDC, V, LDV,\n     $                 ONE, WORK, LDWORK )\n               END IF\n*\n*              W := W * T**T  or  W * T\n*\n               CALL DTRMM( 'Right', 'Lower', TRANST, 'Non-unit',\n     $              LASTC, K, ONE, T, LDT, WORK, LDWORK )\n*\n*              C := C - V**T * W**T\n*\n               IF( LASTV.GT.K ) THEN\n*\n*                 C1 := C1 - V1**T * W**T\n*\n                  CALL DGEMM( 'Transpose', 'Transpose',\n     $                 LASTV-K, LASTC, K, -ONE, V, LDV, WORK, LDWORK,\n     $                 ONE, C, LDC )\n               END IF\n*\n*              W := W * V2\n*\n               CALL DTRMM( 'Right', 'Lower', 'No transpose', 'Unit',\n     $              LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV,\n     $              WORK, LDWORK )\n*\n*              C2 := C2 - W**T\n*\n               DO 210 J = 1, K\n                  DO 200 I = 1, LASTC\n                     C( LASTV-K+J, I ) = C( LASTV-K+J, I ) - WORK(I, J)\n  200             CONTINUE\n  210          CONTINUE\n*\n            ELSE IF( LSAME( SIDE, 'R' ) ) THEN\n*\n*              Form  C * H  or  C * H**T  where  C = ( C1  C2 )\n*\n               LASTV = MAX( K, ILADLC( K, N, V, LDV ) )\n               LASTC = ILADLR( M, LASTV, C, LDC )\n*\n*              W := C * V**T  =  (C1*V1**T + C2*V2**T)  (stored in WORK)\n*\n*              W := C2\n*\n               DO 220 J = 1, K\n                  CALL DCOPY( LASTC, C( 1, LASTV-K+J ), 1,\n     $                 WORK( 1, J ), 1 )\n  220          CONTINUE\n*\n*              W := W * V2**T\n*\n               CALL DTRMM( 'Right', 'Lower', 'Transpose', 'Unit',\n     $              LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV,\n     $              WORK, LDWORK )\n               IF( LASTV.GT.K ) THEN\n*\n*                 W := W + C1 * V1**T\n*\n                  CALL DGEMM( 'No transpose', 'Transpose',\n     $                 LASTC, K, LASTV-K, ONE, C, LDC, V, LDV,\n     $                 ONE, WORK, LDWORK )\n               END IF\n*\n*              W := W * T  or  W * T**T\n*\n               CALL DTRMM( 'Right', 'Lower', TRANS, 'Non-unit',\n     $              LASTC, K, ONE, T, LDT, WORK, LDWORK )\n*\n*              C := C - W * V\n*\n               IF( LASTV.GT.K ) THEN\n*\n*                 C1 := C1 - W * V1\n*\n                  CALL DGEMM( 'No transpose', 'No transpose',\n     $                 LASTC, LASTV-K, K, -ONE, WORK, LDWORK, V, LDV,\n     $                 ONE, C, LDC )\n               END IF\n*\n*              W := W * V2\n*\n               CALL DTRMM( 'Right', 'Lower', 'No transpose', 'Unit',\n     $              LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV,\n     $              WORK, LDWORK )\n*\n*              C1 := C1 - W\n*\n               DO 240 J = 1, K\n                  DO 230 I = 1, LASTC\n                     C( I, LASTV-K+J ) = C( I, LASTV-K+J ) - WORK(I, J)\n  230             CONTINUE\n  240          CONTINUE\n*\n            END IF\n*\n         END IF\n      END IF\n*\n      RETURN\n*\n*     End of DLARFB\n*\n      END\n"
  },
  {
    "path": "libs/eigen/lapack/dlarfg.f",
    "content": "*> \\brief \\b DLARFG\n*\n*  =========== DOCUMENTATION ===========\n*\n* Online html documentation available at \n*            http://www.netlib.org/lapack/explore-html/ \n*\n*> \\htmlonly\n*> Download DLARFG + dependencies \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlarfg.f\"> \n*> [TGZ]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlarfg.f\"> \n*> [ZIP]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlarfg.f\"> \n*> [TXT]</a>\n*> \\endhtmlonly \n*\n*  Definition:\n*  ===========\n*\n*       SUBROUTINE DLARFG( N, ALPHA, X, INCX, TAU )\n* \n*       .. Scalar Arguments ..\n*       INTEGER            INCX, N\n*       DOUBLE PRECISION   ALPHA, TAU\n*       ..\n*       .. Array Arguments ..\n*       DOUBLE PRECISION   X( * )\n*       ..\n*  \n*\n*> \\par Purpose:\n*  =============\n*>\n*> \\verbatim\n*>\n*> DLARFG generates a real elementary reflector H of order n, such\n*> that\n*>\n*>       H * ( alpha ) = ( beta ),   H**T * H = I.\n*>           (   x   )   (   0  )\n*>\n*> where alpha and beta are scalars, and x is an (n-1)-element real\n*> vector. H is represented in the form\n*>\n*>       H = I - tau * ( 1 ) * ( 1 v**T ) ,\n*>                     ( v )\n*>\n*> where tau is a real scalar and v is a real (n-1)-element\n*> vector.\n*>\n*> If the elements of x are all zero, then tau = 0 and H is taken to be\n*> the unit matrix.\n*>\n*> Otherwise  1 <= tau <= 2.\n*> \\endverbatim\n*\n*  Arguments:\n*  ==========\n*\n*> \\param[in] N\n*> \\verbatim\n*>          N is INTEGER\n*>          The order of the elementary reflector.\n*> \\endverbatim\n*>\n*> \\param[in,out] ALPHA\n*> \\verbatim\n*>          ALPHA is DOUBLE PRECISION\n*>          On entry, the value alpha.\n*>          On exit, it is overwritten with the value beta.\n*> \\endverbatim\n*>\n*> \\param[in,out] X\n*> \\verbatim\n*>          X is DOUBLE PRECISION array, dimension\n*>                         (1+(N-2)*abs(INCX))\n*>          On entry, the vector x.\n*>          On exit, it is overwritten with the vector v.\n*> \\endverbatim\n*>\n*> \\param[in] INCX\n*> \\verbatim\n*>          INCX is INTEGER\n*>          The increment between elements of X. INCX > 0.\n*> \\endverbatim\n*>\n*> \\param[out] TAU\n*> \\verbatim\n*>          TAU is DOUBLE PRECISION\n*>          The value tau.\n*> \\endverbatim\n*\n*  Authors:\n*  ========\n*\n*> \\author Univ. of Tennessee \n*> \\author Univ. of California Berkeley \n*> \\author Univ. of Colorado Denver \n*> \\author NAG Ltd. \n*\n*> \\date November 2011\n*\n*> \\ingroup doubleOTHERauxiliary\n*\n*  =====================================================================\n      SUBROUTINE DLARFG( N, ALPHA, X, INCX, TAU )\n*\n*  -- LAPACK auxiliary routine (version 3.4.0) --\n*  -- LAPACK is a software package provided by Univ. of Tennessee,    --\n*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--\n*     November 2011\n*\n*     .. Scalar Arguments ..\n      INTEGER            INCX, N\n      DOUBLE PRECISION   ALPHA, TAU\n*     ..\n*     .. Array Arguments ..\n      DOUBLE PRECISION   X( * )\n*     ..\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      DOUBLE PRECISION   ONE, ZERO\n      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )\n*     ..\n*     .. Local Scalars ..\n      INTEGER            J, KNT\n      DOUBLE PRECISION   BETA, RSAFMN, SAFMIN, XNORM\n*     ..\n*     .. External Functions ..\n      DOUBLE PRECISION   DLAMCH, DLAPY2, DNRM2\n      EXTERNAL           DLAMCH, DLAPY2, DNRM2\n*     ..\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, SIGN\n*     ..\n*     .. External Subroutines ..\n      EXTERNAL           DSCAL\n*     ..\n*     .. Executable Statements ..\n*\n      IF( N.LE.1 ) THEN\n         TAU = ZERO\n         RETURN\n      END IF\n*\n      XNORM = DNRM2( N-1, X, INCX )\n*\n      IF( XNORM.EQ.ZERO ) THEN\n*\n*        H  =  I\n*\n         TAU = ZERO\n      ELSE\n*\n*        general case\n*\n         BETA = -SIGN( DLAPY2( ALPHA, XNORM ), ALPHA )\n         SAFMIN = DLAMCH( 'S' ) / DLAMCH( 'E' )\n         KNT = 0\n         IF( ABS( BETA ).LT.SAFMIN ) THEN\n*\n*           XNORM, BETA may be inaccurate; scale X and recompute them\n*\n            RSAFMN = ONE / SAFMIN\n   10       CONTINUE\n            KNT = KNT + 1\n            CALL DSCAL( N-1, RSAFMN, X, INCX )\n            BETA = BETA*RSAFMN\n            ALPHA = ALPHA*RSAFMN\n            IF( ABS( BETA ).LT.SAFMIN )\n     $         GO TO 10\n*\n*           New BETA is at most 1, at least SAFMIN\n*\n            XNORM = DNRM2( N-1, X, INCX )\n            BETA = -SIGN( DLAPY2( ALPHA, XNORM ), ALPHA )\n         END IF\n         TAU = ( BETA-ALPHA ) / BETA\n         CALL DSCAL( N-1, ONE / ( ALPHA-BETA ), X, INCX )\n*\n*        If ALPHA is subnormal, it may lose relative accuracy\n*\n         DO 20 J = 1, KNT\n            BETA = BETA*SAFMIN\n 20      CONTINUE\n         ALPHA = BETA\n      END IF\n*\n      RETURN\n*\n*     End of DLARFG\n*\n      END\n"
  },
  {
    "path": "libs/eigen/lapack/dlarft.f",
    "content": "*> \\brief \\b DLARFT\n*\n*  =========== DOCUMENTATION ===========\n*\n* Online html documentation available at \n*            http://www.netlib.org/lapack/explore-html/ \n*\n*> \\htmlonly\n*> Download DLARFT + dependencies \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlarft.f\"> \n*> [TGZ]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlarft.f\"> \n*> [ZIP]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlarft.f\"> \n*> [TXT]</a>\n*> \\endhtmlonly \n*\n*  Definition:\n*  ===========\n*\n*       SUBROUTINE DLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT )\n* \n*       .. Scalar Arguments ..\n*       CHARACTER          DIRECT, STOREV\n*       INTEGER            K, LDT, LDV, N\n*       ..\n*       .. Array Arguments ..\n*       DOUBLE PRECISION   T( LDT, * ), TAU( * ), V( LDV, * )\n*       ..\n*  \n*\n*> \\par Purpose:\n*  =============\n*>\n*> \\verbatim\n*>\n*> DLARFT forms the triangular factor T of a real block reflector H\n*> of order n, which is defined as a product of k elementary reflectors.\n*>\n*> If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular;\n*>\n*> If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular.\n*>\n*> If STOREV = 'C', the vector which defines the elementary reflector\n*> H(i) is stored in the i-th column of the array V, and\n*>\n*>    H  =  I - V * T * V**T\n*>\n*> If STOREV = 'R', the vector which defines the elementary reflector\n*> H(i) is stored in the i-th row of the array V, and\n*>\n*>    H  =  I - V**T * T * V\n*> \\endverbatim\n*\n*  Arguments:\n*  ==========\n*\n*> \\param[in] DIRECT\n*> \\verbatim\n*>          DIRECT is CHARACTER*1\n*>          Specifies the order in which the elementary reflectors are\n*>          multiplied to form the block reflector:\n*>          = 'F': H = H(1) H(2) . . . H(k) (Forward)\n*>          = 'B': H = H(k) . . . H(2) H(1) (Backward)\n*> \\endverbatim\n*>\n*> \\param[in] STOREV\n*> \\verbatim\n*>          STOREV is CHARACTER*1\n*>          Specifies how the vectors which define the elementary\n*>          reflectors are stored (see also Further Details):\n*>          = 'C': columnwise\n*>          = 'R': rowwise\n*> \\endverbatim\n*>\n*> \\param[in] N\n*> \\verbatim\n*>          N is INTEGER\n*>          The order of the block reflector H. N >= 0.\n*> \\endverbatim\n*>\n*> \\param[in] K\n*> \\verbatim\n*>          K is INTEGER\n*>          The order of the triangular factor T (= the number of\n*>          elementary reflectors). K >= 1.\n*> \\endverbatim\n*>\n*> \\param[in] V\n*> \\verbatim\n*>          V is DOUBLE PRECISION array, dimension\n*>                               (LDV,K) if STOREV = 'C'\n*>                               (LDV,N) if STOREV = 'R'\n*>          The matrix V. See further details.\n*> \\endverbatim\n*>\n*> \\param[in] LDV\n*> \\verbatim\n*>          LDV is INTEGER\n*>          The leading dimension of the array V.\n*>          If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K.\n*> \\endverbatim\n*>\n*> \\param[in] TAU\n*> \\verbatim\n*>          TAU is DOUBLE PRECISION array, dimension (K)\n*>          TAU(i) must contain the scalar factor of the elementary\n*>          reflector H(i).\n*> \\endverbatim\n*>\n*> \\param[out] T\n*> \\verbatim\n*>          T is DOUBLE PRECISION array, dimension (LDT,K)\n*>          The k by k triangular factor T of the block reflector.\n*>          If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is\n*>          lower triangular. The rest of the array is not used.\n*> \\endverbatim\n*>\n*> \\param[in] LDT\n*> \\verbatim\n*>          LDT is INTEGER\n*>          The leading dimension of the array T. LDT >= K.\n*> \\endverbatim\n*\n*  Authors:\n*  ========\n*\n*> \\author Univ. of Tennessee \n*> \\author Univ. of California Berkeley \n*> \\author Univ. of Colorado Denver \n*> \\author NAG Ltd. \n*\n*> \\date April 2012\n*\n*> \\ingroup doubleOTHERauxiliary\n*\n*> \\par Further Details:\n*  =====================\n*>\n*> \\verbatim\n*>\n*>  The shape of the matrix V and the storage of the vectors which define\n*>  the H(i) is best illustrated by the following example with n = 5 and\n*>  k = 3. The elements equal to 1 are not stored.\n*>\n*>  DIRECT = 'F' and STOREV = 'C':         DIRECT = 'F' and STOREV = 'R':\n*>\n*>               V = (  1       )                 V = (  1 v1 v1 v1 v1 )\n*>                   ( v1  1    )                     (     1 v2 v2 v2 )\n*>                   ( v1 v2  1 )                     (        1 v3 v3 )\n*>                   ( v1 v2 v3 )\n*>                   ( v1 v2 v3 )\n*>\n*>  DIRECT = 'B' and STOREV = 'C':         DIRECT = 'B' and STOREV = 'R':\n*>\n*>               V = ( v1 v2 v3 )                 V = ( v1 v1  1       )\n*>                   ( v1 v2 v3 )                     ( v2 v2 v2  1    )\n*>                   (  1 v2 v3 )                     ( v3 v3 v3 v3  1 )\n*>                   (     1 v3 )\n*>                   (        1 )\n*> \\endverbatim\n*>\n*  =====================================================================\n      SUBROUTINE DLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT )\n*\n*  -- LAPACK auxiliary routine (version 3.4.1) --\n*  -- LAPACK is a software package provided by Univ. of Tennessee,    --\n*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--\n*     April 2012\n*\n*     .. Scalar Arguments ..\n      CHARACTER          DIRECT, STOREV\n      INTEGER            K, LDT, LDV, N\n*     ..\n*     .. Array Arguments ..\n      DOUBLE PRECISION   T( LDT, * ), TAU( * ), V( LDV, * )\n*     ..\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      DOUBLE PRECISION   ONE, ZERO\n      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )\n*     ..\n*     .. Local Scalars ..\n      INTEGER            I, J, PREVLASTV, LASTV\n*     ..\n*     .. External Subroutines ..\n      EXTERNAL           DGEMV, DTRMV\n*     ..\n*     .. External Functions ..\n      LOGICAL            LSAME\n      EXTERNAL           LSAME\n*     ..\n*     .. Executable Statements ..\n*\n*     Quick return if possible\n*\n      IF( N.EQ.0 )\n     $   RETURN\n*\n      IF( LSAME( DIRECT, 'F' ) ) THEN\n         PREVLASTV = N\n         DO I = 1, K\n            PREVLASTV = MAX( I, PREVLASTV )\n            IF( TAU( I ).EQ.ZERO ) THEN\n*\n*              H(i)  =  I\n*\n               DO J = 1, I\n                  T( J, I ) = ZERO\n               END DO\n            ELSE\n*\n*              general case\n*\n               IF( LSAME( STOREV, 'C' ) ) THEN\n*                 Skip any trailing zeros.\n                  DO LASTV = N, I+1, -1\n                     IF( V( LASTV, I ).NE.ZERO ) EXIT\n                  END DO\n                  DO J = 1, I-1\n                     T( J, I ) = -TAU( I ) * V( I , J )\n                  END DO   \n                  J = MIN( LASTV, PREVLASTV )\n*\n*                 T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)**T * V(i:j,i)\n*\n                  CALL DGEMV( 'Transpose', J-I, I-1, -TAU( I ), \n     $                        V( I+1, 1 ), LDV, V( I+1, I ), 1, ONE, \n     $                        T( 1, I ), 1 )\n               ELSE\n*                 Skip any trailing zeros.\n                  DO LASTV = N, I+1, -1\n                     IF( V( I, LASTV ).NE.ZERO ) EXIT\n                  END DO\n                  DO J = 1, I-1\n                     T( J, I ) = -TAU( I ) * V( J , I )\n                  END DO   \n                  J = MIN( LASTV, PREVLASTV )\n*\n*                 T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)**T\n*\n                  CALL DGEMV( 'No transpose', I-1, J-I, -TAU( I ),\n     $                        V( 1, I+1 ), LDV, V( I, I+1 ), LDV, ONE,\n     $                        T( 1, I ), 1 )\n               END IF\n*\n*              T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i)\n*\n               CALL DTRMV( 'Upper', 'No transpose', 'Non-unit', I-1, T,\n     $                     LDT, T( 1, I ), 1 )\n               T( I, I ) = TAU( I )\n               IF( I.GT.1 ) THEN\n                  PREVLASTV = MAX( PREVLASTV, LASTV )\n               ELSE\n                  PREVLASTV = LASTV\n               END IF\n            END IF\n         END DO\n      ELSE\n         PREVLASTV = 1\n         DO I = K, 1, -1\n            IF( TAU( I ).EQ.ZERO ) THEN\n*\n*              H(i)  =  I\n*\n               DO J = I, K\n                  T( J, I ) = ZERO\n               END DO\n            ELSE\n*\n*              general case\n*\n               IF( I.LT.K ) THEN\n                  IF( LSAME( STOREV, 'C' ) ) THEN\n*                    Skip any leading zeros.\n                     DO LASTV = 1, I-1\n                        IF( V( LASTV, I ).NE.ZERO ) EXIT\n                     END DO\n                     DO J = I+1, K\n                        T( J, I ) = -TAU( I ) * V( N-K+I , J )\n                     END DO   \n                     J = MAX( LASTV, PREVLASTV )\n*\n*                    T(i+1:k,i) = -tau(i) * V(j:n-k+i,i+1:k)**T * V(j:n-k+i,i)\n*\n                     CALL DGEMV( 'Transpose', N-K+I-J, K-I, -TAU( I ),\n     $                           V( J, I+1 ), LDV, V( J, I ), 1, ONE,\n     $                           T( I+1, I ), 1 )\n                  ELSE\n*                    Skip any leading zeros.\n                     DO LASTV = 1, I-1\n                        IF( V( I, LASTV ).NE.ZERO ) EXIT\n                     END DO\n                     DO J = I+1, K\n                        T( J, I ) = -TAU( I ) * V( J, N-K+I )\n                     END DO   \n                     J = MAX( LASTV, PREVLASTV )\n*\n*                    T(i+1:k,i) = -tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)**T\n*\n                     CALL DGEMV( 'No transpose', K-I, N-K+I-J,\n     $                    -TAU( I ), V( I+1, J ), LDV, V( I, J ), LDV,\n     $                    ONE, T( I+1, I ), 1 )\n                  END IF\n*\n*                 T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i)\n*\n                  CALL DTRMV( 'Lower', 'No transpose', 'Non-unit', K-I,\n     $                        T( I+1, I+1 ), LDT, T( I+1, I ), 1 )\n                  IF( I.GT.1 ) THEN\n                     PREVLASTV = MIN( PREVLASTV, LASTV )\n                  ELSE\n                     PREVLASTV = LASTV\n                  END IF\n               END IF\n               T( I, I ) = TAU( I )\n            END IF\n         END DO\n      END IF\n      RETURN\n*\n*     End of DLARFT\n*\n      END\n"
  },
  {
    "path": "libs/eigen/lapack/double.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009-2011 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#define SCALAR        double\n#define SCALAR_SUFFIX d\n#define SCALAR_SUFFIX_UP \"D\"\n#define ISCOMPLEX     0\n\n#include \"cholesky.cpp\"\n#include \"lu.cpp\"\n#include \"eigenvalues.cpp\"\n"
  },
  {
    "path": "libs/eigen/lapack/dsecnd_NONE.f",
    "content": "*> \\brief \\b DSECND returns nothing\n*\n*  =========== DOCUMENTATION ===========\n*\n* Online html documentation available at \n*            http://www.netlib.org/lapack/explore-html/ \n*\n*  Definition:\n*  ===========\n*\n*      DOUBLE PRECISION FUNCTION DSECND( )\n*  \n*\n*> \\par Purpose:\n*  =============\n*>\n*> \\verbatim\n*>\n*>  DSECND returns nothing instead of returning the user time for a process in seconds.\n*>  If you are using that routine, it means that neither EXTERNAL ETIME,\n*>  EXTERNAL ETIME_, INTERNAL ETIME, INTERNAL CPU_TIME is available  on\n*>  your machine.\n*> \\endverbatim\n*\n*  Authors:\n*  ========\n*\n*> \\author Univ. of Tennessee \n*> \\author Univ. of California Berkeley \n*> \\author Univ. of Colorado Denver \n*> \\author NAG Ltd. \n*\n*> \\date November 2011\n*\n*> \\ingroup auxOTHERauxiliary\n*\n*  =====================================================================\n      DOUBLE PRECISION FUNCTION DSECND( )\n*\n*  -- LAPACK auxiliary routine (version 3.4.0) --\n*  -- LAPACK is a software package provided by Univ. of Tennessee,    --\n*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--\n*     November 2011\n*\n* =====================================================================\n*\n      DSECND = 0.0D+0\n      RETURN\n*\n*     End of DSECND\n*\n      END\n"
  },
  {
    "path": "libs/eigen/lapack/eigenvalues.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2011 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"common.h\"\n#include <Eigen/Eigenvalues>\n\n// computes an LU factorization of a general M-by-N matrix A using partial pivoting with row interchanges\nEIGEN_LAPACK_FUNC(syev,(char *jobz, char *uplo, int* n, Scalar* a, int *lda, Scalar* w, Scalar* /*work*/, int* lwork, int *info))\n{\n  // TODO exploit the work buffer\n  bool query_size = *lwork==-1;\n  \n  *info = 0;\n        if(*jobz!='N' && *jobz!='V')                    *info = -1;\n  else  if(UPLO(*uplo)==INVALID)                        *info = -2;\n  else  if(*n<0)                                        *info = -3;\n  else  if(*lda<std::max(1,*n))                         *info = -5;\n  else  if((!query_size) && *lwork<std::max(1,3**n-1))  *info = -8;\n  \n//   if(*info==0)\n//   {\n//     int nb = ILAENV( 1, 'SSYTRD', UPLO, N, -1, -1, -1 )\n//          LWKOPT = MAX( 1, ( NB+2 )*N )\n//          WORK( 1 ) = LWKOPT\n// *\n//          IF( LWORK.LT.MAX( 1, 3*N-1 ) .AND. .NOT.LQUERY )\n//      $      INFO = -8\n//       END IF\n// *\n//       IF( INFO.NE.0 ) THEN\n//          CALL XERBLA( 'SSYEV ', -INFO )\n//          RETURN\n//       ELSE IF( LQUERY ) THEN\n//          RETURN\n//       END IF\n  \n  if(*info!=0)\n  {\n    int e = -*info;\n    return xerbla_(SCALAR_SUFFIX_UP\"SYEV \", &e, 6);\n  }\n  \n  if(query_size)\n  {\n    *lwork = 0;\n    return 0;\n  }\n  \n  if(*n==0)\n    return 0;\n  \n  PlainMatrixType mat(*n,*n);\n  if(UPLO(*uplo)==UP) mat = matrix(a,*n,*n,*lda).adjoint();\n  else                mat = matrix(a,*n,*n,*lda);\n  \n  bool computeVectors = *jobz=='V' || *jobz=='v';\n  SelfAdjointEigenSolver<PlainMatrixType> eig(mat,computeVectors?ComputeEigenvectors:EigenvaluesOnly);\n  \n  if(eig.info()==NoConvergence)\n  {\n    vector(w,*n).setZero();\n    if(computeVectors)\n      matrix(a,*n,*n,*lda).setIdentity();\n    //*info = 1;\n    return 0;\n  }\n  \n  vector(w,*n) = eig.eigenvalues();\n  if(computeVectors)\n    matrix(a,*n,*n,*lda) = eig.eigenvectors();\n  \n  return 0;\n}\n"
  },
  {
    "path": "libs/eigen/lapack/ilaclc.f",
    "content": "*> \\brief \\b ILACLC\n*\n*  =========== DOCUMENTATION ===========\n*\n* Online html documentation available at \n*            http://www.netlib.org/lapack/explore-html/ \n*\n*> \\htmlonly\n*> Download ILACLC + dependencies \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/ilaclc.f\"> \n*> [TGZ]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/ilaclc.f\"> \n*> [ZIP]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/ilaclc.f\"> \n*> [TXT]</a>\n*> \\endhtmlonly \n*\n*  Definition:\n*  ===========\n*\n*       INTEGER FUNCTION ILACLC( M, N, A, LDA )\n* \n*       .. Scalar Arguments ..\n*       INTEGER            M, N, LDA\n*       ..\n*       .. Array Arguments ..\n*       COMPLEX            A( LDA, * )\n*       ..\n*  \n*\n*> \\par Purpose:\n*  =============\n*>\n*> \\verbatim\n*>\n*> ILACLC scans A for its last non-zero column.\n*> \\endverbatim\n*\n*  Arguments:\n*  ==========\n*\n*> \\param[in] M\n*> \\verbatim\n*>          M is INTEGER\n*>          The number of rows of the matrix A.\n*> \\endverbatim\n*>\n*> \\param[in] N\n*> \\verbatim\n*>          N is INTEGER\n*>          The number of columns of the matrix A.\n*> \\endverbatim\n*>\n*> \\param[in] A\n*> \\verbatim\n*>          A is COMPLEX array, dimension (LDA,N)\n*>          The m by n matrix A.\n*> \\endverbatim\n*>\n*> \\param[in] LDA\n*> \\verbatim\n*>          LDA is INTEGER\n*>          The leading dimension of the array A. LDA >= max(1,M).\n*> \\endverbatim\n*\n*  Authors:\n*  ========\n*\n*> \\author Univ. of Tennessee \n*> \\author Univ. of California Berkeley \n*> \\author Univ. of Colorado Denver \n*> \\author NAG Ltd. \n*\n*> \\date November 2011\n*\n*> \\ingroup complexOTHERauxiliary\n*\n*  =====================================================================\n      INTEGER FUNCTION ILACLC( M, N, A, LDA )\n*\n*  -- LAPACK auxiliary routine (version 3.4.0) --\n*  -- LAPACK is a software package provided by Univ. of Tennessee,    --\n*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--\n*     November 2011\n*\n*     .. Scalar Arguments ..\n      INTEGER            M, N, LDA\n*     ..\n*     .. Array Arguments ..\n      COMPLEX            A( LDA, * )\n*     ..\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      COMPLEX          ZERO\n      PARAMETER ( ZERO = (0.0E+0, 0.0E+0) )\n*     ..\n*     .. Local Scalars ..\n      INTEGER I\n*     ..\n*     .. Executable Statements ..\n*\n*     Quick test for the common case where one corner is non-zero.\n      IF( N.EQ.0 ) THEN\n         ILACLC = N\n      ELSE IF( A(1, N).NE.ZERO .OR. A(M, N).NE.ZERO ) THEN\n         ILACLC = N\n      ELSE\n*     Now scan each column from the end, returning with the first non-zero.\n         DO ILACLC = N, 1, -1\n            DO I = 1, M\n               IF( A(I, ILACLC).NE.ZERO ) RETURN\n            END DO\n         END DO\n      END IF\n      RETURN\n      END\n"
  },
  {
    "path": "libs/eigen/lapack/ilaclr.f",
    "content": "*> \\brief \\b ILACLR\n*\n*  =========== DOCUMENTATION ===========\n*\n* Online html documentation available at \n*            http://www.netlib.org/lapack/explore-html/ \n*\n*> \\htmlonly\n*> Download ILACLR + dependencies \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/ilaclr.f\"> \n*> [TGZ]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/ilaclr.f\"> \n*> [ZIP]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/ilaclr.f\"> \n*> [TXT]</a>\n*> \\endhtmlonly \n*\n*  Definition:\n*  ===========\n*\n*       INTEGER FUNCTION ILACLR( M, N, A, LDA )\n* \n*       .. Scalar Arguments ..\n*       INTEGER            M, N, LDA\n*       ..\n*       .. Array Arguments ..\n*       COMPLEX            A( LDA, * )\n*       ..\n*  \n*\n*> \\par Purpose:\n*  =============\n*>\n*> \\verbatim\n*>\n*> ILACLR scans A for its last non-zero row.\n*> \\endverbatim\n*\n*  Arguments:\n*  ==========\n*\n*> \\param[in] M\n*> \\verbatim\n*>          M is INTEGER\n*>          The number of rows of the matrix A.\n*> \\endverbatim\n*>\n*> \\param[in] N\n*> \\verbatim\n*>          N is INTEGER\n*>          The number of columns of the matrix A.\n*> \\endverbatim\n*>\n*> \\param[in] A\n*> \\verbatim\n*>          A is array, dimension (LDA,N)\n*>          The m by n matrix A.\n*> \\endverbatim\n*>\n*> \\param[in] LDA\n*> \\verbatim\n*>          LDA is INTEGER\n*>          The leading dimension of the array A. LDA >= max(1,M).\n*> \\endverbatim\n*\n*  Authors:\n*  ========\n*\n*> \\author Univ. of Tennessee \n*> \\author Univ. of California Berkeley \n*> \\author Univ. of Colorado Denver \n*> \\author NAG Ltd. \n*\n*> \\date April 2012\n*\n*> \\ingroup complexOTHERauxiliary\n*\n*  =====================================================================\n      INTEGER FUNCTION ILACLR( M, N, A, LDA )\n*\n*  -- LAPACK auxiliary routine (version 3.4.1) --\n*  -- LAPACK is a software package provided by Univ. of Tennessee,    --\n*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--\n*     April 2012\n*\n*     .. Scalar Arguments ..\n      INTEGER            M, N, LDA\n*     ..\n*     .. Array Arguments ..\n      COMPLEX            A( LDA, * )\n*     ..\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      COMPLEX          ZERO\n      PARAMETER ( ZERO = (0.0E+0, 0.0E+0) )\n*     ..\n*     .. Local Scalars ..\n      INTEGER I, J\n*     ..\n*     .. Executable Statements ..\n*\n*     Quick test for the common case where one corner is non-zero.\n      IF( M.EQ.0 ) THEN\n         ILACLR = M\n      ELSE IF( A(M, 1).NE.ZERO .OR. A(M, N).NE.ZERO ) THEN\n         ILACLR = M\n      ELSE\n*     Scan up each column tracking the last zero row seen.\n         ILACLR = 0\n         DO J = 1, N\n            I=M\n            DO WHILE((A(MAX(I,1),J).EQ.ZERO).AND.(I.GE.1))\n               I=I-1\n            ENDDO\n            ILACLR = MAX( ILACLR, I )\n         END DO\n      END IF\n      RETURN\n      END\n"
  },
  {
    "path": "libs/eigen/lapack/iladlc.f",
    "content": "*> \\brief \\b ILADLC\n*\n*  =========== DOCUMENTATION ===========\n*\n* Online html documentation available at \n*            http://www.netlib.org/lapack/explore-html/ \n*\n*> \\htmlonly\n*> Download ILADLC + dependencies \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/iladlc.f\"> \n*> [TGZ]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/iladlc.f\"> \n*> [ZIP]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/iladlc.f\"> \n*> [TXT]</a>\n*> \\endhtmlonly \n*\n*  Definition:\n*  ===========\n*\n*       INTEGER FUNCTION ILADLC( M, N, A, LDA )\n* \n*       .. Scalar Arguments ..\n*       INTEGER            M, N, LDA\n*       ..\n*       .. Array Arguments ..\n*       DOUBLE PRECISION   A( LDA, * )\n*       ..\n*  \n*\n*> \\par Purpose:\n*  =============\n*>\n*> \\verbatim\n*>\n*> ILADLC scans A for its last non-zero column.\n*> \\endverbatim\n*\n*  Arguments:\n*  ==========\n*\n*> \\param[in] M\n*> \\verbatim\n*>          M is INTEGER\n*>          The number of rows of the matrix A.\n*> \\endverbatim\n*>\n*> \\param[in] N\n*> \\verbatim\n*>          N is INTEGER\n*>          The number of columns of the matrix A.\n*> \\endverbatim\n*>\n*> \\param[in] A\n*> \\verbatim\n*>          A is DOUBLE PRECISION array, dimension (LDA,N)\n*>          The m by n matrix A.\n*> \\endverbatim\n*>\n*> \\param[in] LDA\n*> \\verbatim\n*>          LDA is INTEGER\n*>          The leading dimension of the array A. LDA >= max(1,M).\n*> \\endverbatim\n*\n*  Authors:\n*  ========\n*\n*> \\author Univ. of Tennessee \n*> \\author Univ. of California Berkeley \n*> \\author Univ. of Colorado Denver \n*> \\author NAG Ltd. \n*\n*> \\date November 2011\n*\n*> \\ingroup auxOTHERauxiliary\n*\n*  =====================================================================\n      INTEGER FUNCTION ILADLC( M, N, A, LDA )\n*\n*  -- LAPACK auxiliary routine (version 3.4.0) --\n*  -- LAPACK is a software package provided by Univ. of Tennessee,    --\n*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--\n*     November 2011\n*\n*     .. Scalar Arguments ..\n      INTEGER            M, N, LDA\n*     ..\n*     .. Array Arguments ..\n      DOUBLE PRECISION   A( LDA, * )\n*     ..\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      DOUBLE PRECISION ZERO\n      PARAMETER ( ZERO = 0.0D+0 )\n*     ..\n*     .. Local Scalars ..\n      INTEGER I\n*     ..\n*     .. Executable Statements ..\n*\n*     Quick test for the common case where one corner is non-zero.\n      IF( N.EQ.0 ) THEN\n         ILADLC = N\n      ELSE IF( A(1, N).NE.ZERO .OR. A(M, N).NE.ZERO ) THEN\n         ILADLC = N\n      ELSE\n*     Now scan each column from the end, returning with the first non-zero.\n         DO ILADLC = N, 1, -1\n            DO I = 1, M\n               IF( A(I, ILADLC).NE.ZERO ) RETURN\n            END DO\n         END DO\n      END IF\n      RETURN\n      END\n"
  },
  {
    "path": "libs/eigen/lapack/iladlr.f",
    "content": "*> \\brief \\b ILADLR\n*\n*  =========== DOCUMENTATION ===========\n*\n* Online html documentation available at \n*            http://www.netlib.org/lapack/explore-html/ \n*\n*> \\htmlonly\n*> Download ILADLR + dependencies \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/iladlr.f\"> \n*> [TGZ]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/iladlr.f\"> \n*> [ZIP]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/iladlr.f\"> \n*> [TXT]</a>\n*> \\endhtmlonly \n*\n*  Definition:\n*  ===========\n*\n*       INTEGER FUNCTION ILADLR( M, N, A, LDA )\n* \n*       .. Scalar Arguments ..\n*       INTEGER            M, N, LDA\n*       ..\n*       .. Array Arguments ..\n*       DOUBLE PRECISION   A( LDA, * )\n*       ..\n*  \n*\n*> \\par Purpose:\n*  =============\n*>\n*> \\verbatim\n*>\n*> ILADLR scans A for its last non-zero row.\n*> \\endverbatim\n*\n*  Arguments:\n*  ==========\n*\n*> \\param[in] M\n*> \\verbatim\n*>          M is INTEGER\n*>          The number of rows of the matrix A.\n*> \\endverbatim\n*>\n*> \\param[in] N\n*> \\verbatim\n*>          N is INTEGER\n*>          The number of columns of the matrix A.\n*> \\endverbatim\n*>\n*> \\param[in] A\n*> \\verbatim\n*>          A is DOUBLE PRECISION array, dimension (LDA,N)\n*>          The m by n matrix A.\n*> \\endverbatim\n*>\n*> \\param[in] LDA\n*> \\verbatim\n*>          LDA is INTEGER\n*>          The leading dimension of the array A. LDA >= max(1,M).\n*> \\endverbatim\n*\n*  Authors:\n*  ========\n*\n*> \\author Univ. of Tennessee \n*> \\author Univ. of California Berkeley \n*> \\author Univ. of Colorado Denver \n*> \\author NAG Ltd. \n*\n*> \\date April 2012\n*\n*> \\ingroup auxOTHERauxiliary\n*\n*  =====================================================================\n      INTEGER FUNCTION ILADLR( M, N, A, LDA )\n*\n*  -- LAPACK auxiliary routine (version 3.4.1) --\n*  -- LAPACK is a software package provided by Univ. of Tennessee,    --\n*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--\n*     April 2012\n*\n*     .. Scalar Arguments ..\n      INTEGER            M, N, LDA\n*     ..\n*     .. Array Arguments ..\n      DOUBLE PRECISION   A( LDA, * )\n*     ..\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      DOUBLE PRECISION ZERO\n      PARAMETER ( ZERO = 0.0D+0 )\n*     ..\n*     .. Local Scalars ..\n      INTEGER I, J\n*     ..\n*     .. Executable Statements ..\n*\n*     Quick test for the common case where one corner is non-zero.\n      IF( M.EQ.0 ) THEN\n         ILADLR = M\n      ELSE IF( A(M, 1).NE.ZERO .OR. A(M, N).NE.ZERO ) THEN\n         ILADLR = M\n      ELSE\n*     Scan up each column tracking the last zero row seen.\n         ILADLR = 0\n         DO J = 1, N\n            I=M\n            DO WHILE((A(MAX(I,1),J).EQ.ZERO).AND.(I.GE.1))\n               I=I-1\n            ENDDO\n            ILADLR = MAX( ILADLR, I )\n         END DO\n      END IF\n      RETURN\n      END\n"
  },
  {
    "path": "libs/eigen/lapack/ilaslc.f",
    "content": "*> \\brief \\b ILASLC\n*\n*  =========== DOCUMENTATION ===========\n*\n* Online html documentation available at \n*            http://www.netlib.org/lapack/explore-html/ \n*\n*> \\htmlonly\n*> Download ILASLC + dependencies \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/ilaslc.f\"> \n*> [TGZ]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/ilaslc.f\"> \n*> [ZIP]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/ilaslc.f\"> \n*> [TXT]</a>\n*> \\endhtmlonly \n*\n*  Definition:\n*  ===========\n*\n*       INTEGER FUNCTION ILASLC( M, N, A, LDA )\n* \n*       .. Scalar Arguments ..\n*       INTEGER            M, N, LDA\n*       ..\n*       .. Array Arguments ..\n*       REAL               A( LDA, * )\n*       ..\n*  \n*\n*> \\par Purpose:\n*  =============\n*>\n*> \\verbatim\n*>\n*> ILASLC scans A for its last non-zero column.\n*> \\endverbatim\n*\n*  Arguments:\n*  ==========\n*\n*> \\param[in] M\n*> \\verbatim\n*>          M is INTEGER\n*>          The number of rows of the matrix A.\n*> \\endverbatim\n*>\n*> \\param[in] N\n*> \\verbatim\n*>          N is INTEGER\n*>          The number of columns of the matrix A.\n*> \\endverbatim\n*>\n*> \\param[in] A\n*> \\verbatim\n*>          A is REAL array, dimension (LDA,N)\n*>          The m by n matrix A.\n*> \\endverbatim\n*>\n*> \\param[in] LDA\n*> \\verbatim\n*>          LDA is INTEGER\n*>          The leading dimension of the array A. LDA >= max(1,M).\n*> \\endverbatim\n*\n*  Authors:\n*  ========\n*\n*> \\author Univ. of Tennessee \n*> \\author Univ. of California Berkeley \n*> \\author Univ. of Colorado Denver \n*> \\author NAG Ltd. \n*\n*> \\date November 2011\n*\n*> \\ingroup realOTHERauxiliary\n*\n*  =====================================================================\n      INTEGER FUNCTION ILASLC( M, N, A, LDA )\n*\n*  -- LAPACK auxiliary routine (version 3.4.0) --\n*  -- LAPACK is a software package provided by Univ. of Tennessee,    --\n*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--\n*     November 2011\n*\n*     .. Scalar Arguments ..\n      INTEGER            M, N, LDA\n*     ..\n*     .. Array Arguments ..\n      REAL               A( LDA, * )\n*     ..\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      REAL             ZERO\n      PARAMETER ( ZERO = 0.0D+0 )\n*     ..\n*     .. Local Scalars ..\n      INTEGER I\n*     ..\n*     .. Executable Statements ..\n*\n*     Quick test for the common case where one corner is non-zero.\n      IF( N.EQ.0 ) THEN\n         ILASLC = N\n      ELSE IF( A(1, N).NE.ZERO .OR. A(M, N).NE.ZERO ) THEN\n         ILASLC = N\n      ELSE\n*     Now scan each column from the end, returning with the first non-zero.\n         DO ILASLC = N, 1, -1\n            DO I = 1, M\n               IF( A(I, ILASLC).NE.ZERO ) RETURN\n            END DO\n         END DO\n      END IF\n      RETURN\n      END\n"
  },
  {
    "path": "libs/eigen/lapack/ilaslr.f",
    "content": "*> \\brief \\b ILASLR\n*\n*  =========== DOCUMENTATION ===========\n*\n* Online html documentation available at \n*            http://www.netlib.org/lapack/explore-html/ \n*\n*> \\htmlonly\n*> Download ILASLR + dependencies \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/ilaslr.f\"> \n*> [TGZ]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/ilaslr.f\"> \n*> [ZIP]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/ilaslr.f\"> \n*> [TXT]</a>\n*> \\endhtmlonly \n*\n*  Definition:\n*  ===========\n*\n*       INTEGER FUNCTION ILASLR( M, N, A, LDA )\n* \n*       .. Scalar Arguments ..\n*       INTEGER            M, N, LDA\n*       ..\n*       .. Array Arguments ..\n*       REAL               A( LDA, * )\n*       ..\n*  \n*\n*> \\par Purpose:\n*  =============\n*>\n*> \\verbatim\n*>\n*> ILASLR scans A for its last non-zero row.\n*> \\endverbatim\n*\n*  Arguments:\n*  ==========\n*\n*> \\param[in] M\n*> \\verbatim\n*>          M is INTEGER\n*>          The number of rows of the matrix A.\n*> \\endverbatim\n*>\n*> \\param[in] N\n*> \\verbatim\n*>          N is INTEGER\n*>          The number of columns of the matrix A.\n*> \\endverbatim\n*>\n*> \\param[in] A\n*> \\verbatim\n*>          A is REAL array, dimension (LDA,N)\n*>          The m by n matrix A.\n*> \\endverbatim\n*>\n*> \\param[in] LDA\n*> \\verbatim\n*>          LDA is INTEGER\n*>          The leading dimension of the array A. LDA >= max(1,M).\n*> \\endverbatim\n*\n*  Authors:\n*  ========\n*\n*> \\author Univ. of Tennessee \n*> \\author Univ. of California Berkeley \n*> \\author Univ. of Colorado Denver \n*> \\author NAG Ltd. \n*\n*> \\date April 2012\n*\n*> \\ingroup realOTHERauxiliary\n*\n*  =====================================================================\n      INTEGER FUNCTION ILASLR( M, N, A, LDA )\n*\n*  -- LAPACK auxiliary routine (version 3.4.1) --\n*  -- LAPACK is a software package provided by Univ. of Tennessee,    --\n*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--\n*     April 2012\n*\n*     .. Scalar Arguments ..\n      INTEGER            M, N, LDA\n*     ..\n*     .. Array Arguments ..\n      REAL               A( LDA, * )\n*     ..\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      REAL             ZERO\n      PARAMETER ( ZERO = 0.0E+0 )\n*     ..\n*     .. Local Scalars ..\n      INTEGER I, J\n*     ..\n*     .. Executable Statements ..\n*\n*     Quick test for the common case where one corner is non-zero.\n      IF( M.EQ.0 ) THEN\n         ILASLR = M\n      ELSEIF( A(M, 1).NE.ZERO .OR. A(M, N).NE.ZERO ) THEN\n         ILASLR = M\n      ELSE\n*     Scan up each column tracking the last zero row seen.\n         ILASLR = 0\n         DO J = 1, N\n            I=M\n            DO WHILE((A(MAX(I,1),J).EQ.ZERO).AND.(I.GE.1))\n               I=I-1\n            ENDDO\n            ILASLR = MAX( ILASLR, I )\n         END DO\n      END IF\n      RETURN\n      END\n"
  },
  {
    "path": "libs/eigen/lapack/ilazlc.f",
    "content": "*> \\brief \\b ILAZLC\n*\n*  =========== DOCUMENTATION ===========\n*\n* Online html documentation available at \n*            http://www.netlib.org/lapack/explore-html/ \n*\n*> \\htmlonly\n*> Download ILAZLC + dependencies \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/ilazlc.f\"> \n*> [TGZ]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/ilazlc.f\"> \n*> [ZIP]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/ilazlc.f\"> \n*> [TXT]</a>\n*> \\endhtmlonly \n*\n*  Definition:\n*  ===========\n*\n*       INTEGER FUNCTION ILAZLC( M, N, A, LDA )\n* \n*       .. Scalar Arguments ..\n*       INTEGER            M, N, LDA\n*       ..\n*       .. Array Arguments ..\n*       COMPLEX*16         A( LDA, * )\n*       ..\n*  \n*\n*> \\par Purpose:\n*  =============\n*>\n*> \\verbatim\n*>\n*> ILAZLC scans A for its last non-zero column.\n*> \\endverbatim\n*\n*  Arguments:\n*  ==========\n*\n*> \\param[in] M\n*> \\verbatim\n*>          M is INTEGER\n*>          The number of rows of the matrix A.\n*> \\endverbatim\n*>\n*> \\param[in] N\n*> \\verbatim\n*>          N is INTEGER\n*>          The number of columns of the matrix A.\n*> \\endverbatim\n*>\n*> \\param[in] A\n*> \\verbatim\n*>          A is COMPLEX*16 array, dimension (LDA,N)\n*>          The m by n matrix A.\n*> \\endverbatim\n*>\n*> \\param[in] LDA\n*> \\verbatim\n*>          LDA is INTEGER\n*>          The leading dimension of the array A. LDA >= max(1,M).\n*> \\endverbatim\n*\n*  Authors:\n*  ========\n*\n*> \\author Univ. of Tennessee \n*> \\author Univ. of California Berkeley \n*> \\author Univ. of Colorado Denver \n*> \\author NAG Ltd. \n*\n*> \\date November 2011\n*\n*> \\ingroup complex16OTHERauxiliary\n*\n*  =====================================================================\n      INTEGER FUNCTION ILAZLC( M, N, A, LDA )\n*\n*  -- LAPACK auxiliary routine (version 3.4.0) --\n*  -- LAPACK is a software package provided by Univ. of Tennessee,    --\n*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--\n*     November 2011\n*\n*     .. Scalar Arguments ..\n      INTEGER            M, N, LDA\n*     ..\n*     .. Array Arguments ..\n      COMPLEX*16         A( LDA, * )\n*     ..\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      COMPLEX*16       ZERO\n      PARAMETER ( ZERO = (0.0D+0, 0.0D+0) )\n*     ..\n*     .. Local Scalars ..\n      INTEGER I\n*     ..\n*     .. Executable Statements ..\n*\n*     Quick test for the common case where one corner is non-zero.\n      IF( N.EQ.0 ) THEN\n         ILAZLC = N\n      ELSE IF( A(1, N).NE.ZERO .OR. A(M, N).NE.ZERO ) THEN\n         ILAZLC = N\n      ELSE\n*     Now scan each column from the end, returning with the first non-zero.\n         DO ILAZLC = N, 1, -1\n            DO I = 1, M\n               IF( A(I, ILAZLC).NE.ZERO ) RETURN\n            END DO\n         END DO\n      END IF\n      RETURN\n      END\n"
  },
  {
    "path": "libs/eigen/lapack/ilazlr.f",
    "content": "*> \\brief \\b ILAZLR\n*\n*  =========== DOCUMENTATION ===========\n*\n* Online html documentation available at \n*            http://www.netlib.org/lapack/explore-html/ \n*\n*> \\htmlonly\n*> Download ILAZLR + dependencies \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/ilazlr.f\"> \n*> [TGZ]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/ilazlr.f\"> \n*> [ZIP]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/ilazlr.f\"> \n*> [TXT]</a>\n*> \\endhtmlonly \n*\n*  Definition:\n*  ===========\n*\n*       INTEGER FUNCTION ILAZLR( M, N, A, LDA )\n* \n*       .. Scalar Arguments ..\n*       INTEGER            M, N, LDA\n*       ..\n*       .. Array Arguments ..\n*       COMPLEX*16         A( LDA, * )\n*       ..\n*  \n*\n*> \\par Purpose:\n*  =============\n*>\n*> \\verbatim\n*>\n*> ILAZLR scans A for its last non-zero row.\n*> \\endverbatim\n*\n*  Arguments:\n*  ==========\n*\n*> \\param[in] M\n*> \\verbatim\n*>          M is INTEGER\n*>          The number of rows of the matrix A.\n*> \\endverbatim\n*>\n*> \\param[in] N\n*> \\verbatim\n*>          N is INTEGER\n*>          The number of columns of the matrix A.\n*> \\endverbatim\n*>\n*> \\param[in] A\n*> \\verbatim\n*>          A is COMPLEX*16 array, dimension (LDA,N)\n*>          The m by n matrix A.\n*> \\endverbatim\n*>\n*> \\param[in] LDA\n*> \\verbatim\n*>          LDA is INTEGER\n*>          The leading dimension of the array A. LDA >= max(1,M).\n*> \\endverbatim\n*\n*  Authors:\n*  ========\n*\n*> \\author Univ. of Tennessee \n*> \\author Univ. of California Berkeley \n*> \\author Univ. of Colorado Denver \n*> \\author NAG Ltd. \n*\n*> \\date April 2012\n*\n*> \\ingroup complex16OTHERauxiliary\n*\n*  =====================================================================\n      INTEGER FUNCTION ILAZLR( M, N, A, LDA )\n*\n*  -- LAPACK auxiliary routine (version 3.4.1) --\n*  -- LAPACK is a software package provided by Univ. of Tennessee,    --\n*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--\n*     April 2012\n*\n*     .. Scalar Arguments ..\n      INTEGER            M, N, LDA\n*     ..\n*     .. Array Arguments ..\n      COMPLEX*16         A( LDA, * )\n*     ..\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      COMPLEX*16       ZERO\n      PARAMETER ( ZERO = (0.0D+0, 0.0D+0) )\n*     ..\n*     .. Local Scalars ..\n      INTEGER I, J\n*     ..\n*     .. Executable Statements ..\n*\n*     Quick test for the common case where one corner is non-zero.\n      IF( M.EQ.0 ) THEN\n         ILAZLR = M\n      ELSE IF( A(M, 1).NE.ZERO .OR. A(M, N).NE.ZERO ) THEN\n         ILAZLR = M\n      ELSE\n*     Scan up each column tracking the last zero row seen.\n         ILAZLR = 0\n         DO J = 1, N\n            I=M\n            DO WHILE((A(MAX(I,1),J).EQ.ZERO).AND.(I.GE.1))\n               I=I-1\n            ENDDO\n            ILAZLR = MAX( ILAZLR, I )\n         END DO\n      END IF\n      RETURN\n      END\n"
  },
  {
    "path": "libs/eigen/lapack/lapack_common.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2010-2011 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_LAPACK_COMMON_H\n#define EIGEN_LAPACK_COMMON_H\n\n#include \"../blas/common.h\"\n\n#define EIGEN_LAPACK_FUNC(FUNC,ARGLIST)               \\\n  extern \"C\" { int EIGEN_BLAS_FUNC(FUNC) ARGLIST; }   \\\n  int EIGEN_BLAS_FUNC(FUNC) ARGLIST\n\ntypedef Eigen::Map<Eigen::Transpositions<Eigen::Dynamic,Eigen::Dynamic,int> > PivotsType;\n\n\n\n#endif // EIGEN_LAPACK_COMMON_H\n"
  },
  {
    "path": "libs/eigen/lapack/lu.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2010-2011 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"common.h\"\n#include <Eigen/LU>\n\n// computes an LU factorization of a general M-by-N matrix A using partial pivoting with row interchanges\nEIGEN_LAPACK_FUNC(getrf,(int *m, int *n, RealScalar *pa, int *lda, int *ipiv, int *info))\n{\n  *info = 0;\n        if(*m<0)                  *info = -1;\n  else  if(*n<0)                  *info = -2;\n  else  if(*lda<std::max(1,*m))   *info = -4;\n  if(*info!=0)\n  {\n    int e = -*info;\n    return xerbla_(SCALAR_SUFFIX_UP\"GETRF\", &e, 6);\n  }\n\n  if(*m==0 || *n==0)\n    return 0;\n\n  Scalar* a = reinterpret_cast<Scalar*>(pa);\n  int nb_transpositions;\n  int ret = int(Eigen::internal::partial_lu_impl<Scalar,ColMajor,int>\n                     ::blocked_lu(*m, *n, a, *lda, ipiv, nb_transpositions));\n\n  for(int i=0; i<std::min(*m,*n); ++i)\n    ipiv[i]++;\n\n  if(ret>=0)\n    *info = ret+1;\n\n  return 0;\n}\n\n//GETRS solves a system of linear equations\n//    A * X = B  or  A' * X = B\n//  with a general N-by-N matrix A using the LU factorization computed  by GETRF\nEIGEN_LAPACK_FUNC(getrs,(char *trans, int *n, int *nrhs, RealScalar *pa, int *lda, int *ipiv, RealScalar *pb, int *ldb, int *info))\n{\n  *info = 0;\n        if(OP(*trans)==INVALID)  *info = -1;\n  else  if(*n<0)                 *info = -2;\n  else  if(*nrhs<0)              *info = -3;\n  else  if(*lda<std::max(1,*n))  *info = -5;\n  else  if(*ldb<std::max(1,*n))  *info = -8;\n  if(*info!=0)\n  {\n    int e = -*info;\n    return xerbla_(SCALAR_SUFFIX_UP\"GETRS\", &e, 6);\n  }\n\n  Scalar* a = reinterpret_cast<Scalar*>(pa);\n  Scalar* b = reinterpret_cast<Scalar*>(pb);\n  MatrixType lu(a,*n,*n,*lda);\n  MatrixType B(b,*n,*nrhs,*ldb);\n\n  for(int i=0; i<*n; ++i)\n    ipiv[i]--;\n  if(OP(*trans)==NOTR)\n  {\n    B = PivotsType(ipiv,*n) * B;\n    lu.triangularView<UnitLower>().solveInPlace(B);\n    lu.triangularView<Upper>().solveInPlace(B);\n  }\n  else if(OP(*trans)==TR)\n  {\n    lu.triangularView<Upper>().transpose().solveInPlace(B);\n    lu.triangularView<UnitLower>().transpose().solveInPlace(B);\n    B = PivotsType(ipiv,*n).transpose() * B;\n  }\n  else if(OP(*trans)==ADJ)\n  {\n    lu.triangularView<Upper>().adjoint().solveInPlace(B);\n    lu.triangularView<UnitLower>().adjoint().solveInPlace(B);\n    B = PivotsType(ipiv,*n).transpose() * B;\n  }\n  for(int i=0; i<*n; ++i)\n    ipiv[i]++;\n\n  return 0;\n}\n"
  },
  {
    "path": "libs/eigen/lapack/second_NONE.f",
    "content": "*> \\brief \\b SECOND returns nothing\n*\n*  =========== DOCUMENTATION ===========\n*\n* Online html documentation available at \n*            http://www.netlib.org/lapack/explore-html/ \n*\n*  Definition:\n*  ===========\n*\n*      REAL FUNCTION SECOND( )\n*  \n*\n*> \\par Purpose:\n*  =============\n*>\n*> \\verbatim\n*>\n*>  SECOND returns nothing instead of returning the user time for a process in seconds.\n*>  If you are using that routine, it means that neither EXTERNAL ETIME,\n*>  EXTERNAL ETIME_, INTERNAL ETIME, INTERNAL CPU_TIME is available  on\n*>  your machine.\n*> \\endverbatim\n*\n*  Authors:\n*  ========\n*\n*> \\author Univ. of Tennessee \n*> \\author Univ. of California Berkeley \n*> \\author Univ. of Colorado Denver \n*> \\author NAG Ltd. \n*\n*> \\date November 2011\n*\n*> \\ingroup auxOTHERauxiliary\n*\n*  =====================================================================\n      REAL FUNCTION SECOND( )\n*\n*  -- LAPACK auxiliary routine (version 3.4.0) --\n*  -- LAPACK is a software package provided by Univ. of Tennessee,    --\n*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--\n*     November 2011\n*\n* =====================================================================\n*\n      SECOND = 0.0E+0\n      RETURN\n*\n*     End of SECOND\n*\n      END\n"
  },
  {
    "path": "libs/eigen/lapack/single.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009-2011 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#define SCALAR        float\n#define SCALAR_SUFFIX s\n#define SCALAR_SUFFIX_UP \"S\"\n#define ISCOMPLEX     0\n\n#include \"cholesky.cpp\"\n#include \"lu.cpp\"\n#include \"eigenvalues.cpp\"\n"
  },
  {
    "path": "libs/eigen/lapack/sladiv.f",
    "content": "*> \\brief \\b SLADIV\n*\n*  =========== DOCUMENTATION ===========\n*\n* Online html documentation available at \n*            http://www.netlib.org/lapack/explore-html/ \n*\n*> \\htmlonly\n*> Download SLADIV + dependencies \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/sladiv.f\"> \n*> [TGZ]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/sladiv.f\"> \n*> [ZIP]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/sladiv.f\"> \n*> [TXT]</a>\n*> \\endhtmlonly \n*\n*  Definition:\n*  ===========\n*\n*       SUBROUTINE SLADIV( A, B, C, D, P, Q )\n* \n*       .. Scalar Arguments ..\n*       REAL               A, B, C, D, P, Q\n*       ..\n*  \n*\n*> \\par Purpose:\n*  =============\n*>\n*> \\verbatim\n*>\n*> SLADIV performs complex division in  real arithmetic\n*>\n*>                       a + i*b\n*>            p + i*q = ---------\n*>                       c + i*d\n*>\n*> The algorithm is due to Robert L. Smith and can be found\n*> in D. Knuth, The art of Computer Programming, Vol.2, p.195\n*> \\endverbatim\n*\n*  Arguments:\n*  ==========\n*\n*> \\param[in] A\n*> \\verbatim\n*>          A is REAL\n*> \\endverbatim\n*>\n*> \\param[in] B\n*> \\verbatim\n*>          B is REAL\n*> \\endverbatim\n*>\n*> \\param[in] C\n*> \\verbatim\n*>          C is REAL\n*> \\endverbatim\n*>\n*> \\param[in] D\n*> \\verbatim\n*>          D is REAL\n*>          The scalars a, b, c, and d in the above expression.\n*> \\endverbatim\n*>\n*> \\param[out] P\n*> \\verbatim\n*>          P is REAL\n*> \\endverbatim\n*>\n*> \\param[out] Q\n*> \\verbatim\n*>          Q is REAL\n*>          The scalars p and q in the above expression.\n*> \\endverbatim\n*\n*  Authors:\n*  ========\n*\n*> \\author Univ. of Tennessee \n*> \\author Univ. of California Berkeley \n*> \\author Univ. of Colorado Denver \n*> \\author NAG Ltd. \n*\n*> \\date November 2011\n*\n*> \\ingroup auxOTHERauxiliary\n*\n*  =====================================================================\n      SUBROUTINE SLADIV( A, B, C, D, P, Q )\n*\n*  -- LAPACK auxiliary routine (version 3.4.0) --\n*  -- LAPACK is a software package provided by Univ. of Tennessee,    --\n*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--\n*     November 2011\n*\n*     .. Scalar Arguments ..\n      REAL               A, B, C, D, P, Q\n*     ..\n*\n*  =====================================================================\n*\n*     .. Local Scalars ..\n      REAL               E, F\n*     ..\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS\n*     ..\n*     .. Executable Statements ..\n*\n      IF( ABS( D ).LT.ABS( C ) ) THEN\n         E = D / C\n         F = C + D*E\n         P = ( A+B*E ) / F\n         Q = ( B-A*E ) / F\n      ELSE\n         E = C / D\n         F = D + C*E\n         P = ( B+A*E ) / F\n         Q = ( -A+B*E ) / F\n      END IF\n*\n      RETURN\n*\n*     End of SLADIV\n*\n      END\n"
  },
  {
    "path": "libs/eigen/lapack/slamch.f",
    "content": "*> \\brief \\b SLAMCH\n*\n*  =========== DOCUMENTATION ===========\n*\n* Online html documentation available at \n*            http://www.netlib.org/lapack/explore-html/ \n*\n*  Definition:\n*  ===========\n*\n*      REAL             FUNCTION SLAMCH( CMACH )\n*\n*     .. Scalar Arguments ..\n*      CHARACTER          CMACH\n*     ..\n*  \n*\n*> \\par Purpose:\n*  =============\n*>\n*> \\verbatim\n*>\n*> SLAMCH determines single precision machine parameters.\n*> \\endverbatim\n*\n*  Arguments:\n*  ==========\n*\n*> \\param[in] CMACH\n*> \\verbatim\n*>          Specifies the value to be returned by SLAMCH:\n*>          = 'E' or 'e',   SLAMCH := eps\n*>          = 'S' or 's ,   SLAMCH := sfmin\n*>          = 'B' or 'b',   SLAMCH := base\n*>          = 'P' or 'p',   SLAMCH := eps*base\n*>          = 'N' or 'n',   SLAMCH := t\n*>          = 'R' or 'r',   SLAMCH := rnd\n*>          = 'M' or 'm',   SLAMCH := emin\n*>          = 'U' or 'u',   SLAMCH := rmin\n*>          = 'L' or 'l',   SLAMCH := emax\n*>          = 'O' or 'o',   SLAMCH := rmax\n*>          where\n*>          eps   = relative machine precision\n*>          sfmin = safe minimum, such that 1/sfmin does not overflow\n*>          base  = base of the machine\n*>          prec  = eps*base\n*>          t     = number of (base) digits in the mantissa\n*>          rnd   = 1.0 when rounding occurs in addition, 0.0 otherwise\n*>          emin  = minimum exponent before (gradual) underflow\n*>          rmin  = underflow threshold - base**(emin-1)\n*>          emax  = largest exponent before overflow\n*>          rmax  = overflow threshold  - (base**emax)*(1-eps)\n*> \\endverbatim\n*\n*  Authors:\n*  ========\n*\n*> \\author Univ. of Tennessee \n*> \\author Univ. of California Berkeley \n*> \\author Univ. of Colorado Denver \n*> \\author NAG Ltd. \n*\n*> \\date November 2011\n*\n*> \\ingroup auxOTHERauxiliary\n*\n*  =====================================================================\n      REAL             FUNCTION SLAMCH( CMACH )\n*\n*  -- LAPACK auxiliary routine (version 3.4.0) --\n*  -- LAPACK is a software package provided by Univ. of Tennessee,    --\n*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--\n*     November 2011\n*\n*     .. Scalar Arguments ..\n      CHARACTER          CMACH\n*     ..\n*\n* =====================================================================\n*\n*     .. Parameters ..\n      REAL               ONE, ZERO\n      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )\n*     ..\n*     .. Local Scalars ..\n      REAL               RND, EPS, SFMIN, SMALL, RMACH\n*     ..\n*     .. External Functions ..\n      LOGICAL            LSAME\n      EXTERNAL           LSAME\n*     ..\n*     .. Intrinsic Functions ..\n      INTRINSIC          DIGITS, EPSILON, HUGE, MAXEXPONENT,\n     $                   MINEXPONENT, RADIX, TINY\n*     ..\n*     .. Executable Statements ..\n*\n*\n*     Assume rounding, not chopping. Always.\n*\n      RND = ONE\n*\n      IF( ONE.EQ.RND ) THEN\n         EPS = EPSILON(ZERO) * 0.5\n      ELSE\n         EPS = EPSILON(ZERO)\n      END IF\n*\n      IF( LSAME( CMACH, 'E' ) ) THEN\n         RMACH = EPS\n      ELSE IF( LSAME( CMACH, 'S' ) ) THEN\n         SFMIN = TINY(ZERO)\n         SMALL = ONE / HUGE(ZERO)\n         IF( SMALL.GE.SFMIN ) THEN\n*\n*           Use SMALL plus a bit, to avoid the possibility of rounding\n*           causing overflow when computing  1/sfmin.\n*\n            SFMIN = SMALL*( ONE+EPS )\n         END IF\n         RMACH = SFMIN\n      ELSE IF( LSAME( CMACH, 'B' ) ) THEN\n         RMACH = RADIX(ZERO)\n      ELSE IF( LSAME( CMACH, 'P' ) ) THEN\n         RMACH = EPS * RADIX(ZERO)\n      ELSE IF( LSAME( CMACH, 'N' ) ) THEN\n         RMACH = DIGITS(ZERO)\n      ELSE IF( LSAME( CMACH, 'R' ) ) THEN\n         RMACH = RND\n      ELSE IF( LSAME( CMACH, 'M' ) ) THEN\n         RMACH = MINEXPONENT(ZERO)\n      ELSE IF( LSAME( CMACH, 'U' ) ) THEN\n         RMACH = tiny(zero)\n      ELSE IF( LSAME( CMACH, 'L' ) ) THEN\n         RMACH = MAXEXPONENT(ZERO)\n      ELSE IF( LSAME( CMACH, 'O' ) ) THEN\n         RMACH = HUGE(ZERO)\n      ELSE\n         RMACH = ZERO\n      END IF\n*\n      SLAMCH = RMACH\n      RETURN\n*\n*     End of SLAMCH\n*\n      END\n************************************************************************\n*> \\brief \\b SLAMC3\n*> \\details\n*> \\b Purpose:\n*> \\verbatim\n*> SLAMC3  is intended to force  A  and  B  to be stored prior to doing\n*> the addition of  A  and  B ,  for use in situations where optimizers\n*> might hold one of these in a register.\n*> \\endverbatim\n*> \\author LAPACK is a software package provided by Univ. of Tennessee, Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..\n*> \\date November 2011\n*> \\ingroup auxOTHERauxiliary\n*>\n*> \\param[in] A\n*> \\verbatim\n*> \\endverbatim\n*>\n*> \\param[in] B\n*> \\verbatim\n*>          The values A and B.\n*> \\endverbatim\n*>\n*\n      REAL             FUNCTION SLAMC3( A, B )\n*\n*  -- LAPACK auxiliary routine (version 3.4.0) --\n*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..\n*     November 2010\n*\n*     .. Scalar Arguments ..\n      REAL               A, B\n*     ..\n* =====================================================================\n*\n*     .. Executable Statements ..\n*\n      SLAMC3 = A + B\n*\n      RETURN\n*\n*     End of SLAMC3\n*\n      END\n*\n************************************************************************\n"
  },
  {
    "path": "libs/eigen/lapack/slapy2.f",
    "content": "*> \\brief \\b SLAPY2\n*\n*  =========== DOCUMENTATION ===========\n*\n* Online html documentation available at \n*            http://www.netlib.org/lapack/explore-html/ \n*\n*> \\htmlonly\n*> Download SLAPY2 + dependencies \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/slapy2.f\"> \n*> [TGZ]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/slapy2.f\"> \n*> [ZIP]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/slapy2.f\"> \n*> [TXT]</a>\n*> \\endhtmlonly \n*\n*  Definition:\n*  ===========\n*\n*       REAL             FUNCTION SLAPY2( X, Y )\n* \n*       .. Scalar Arguments ..\n*       REAL               X, Y\n*       ..\n*  \n*\n*> \\par Purpose:\n*  =============\n*>\n*> \\verbatim\n*>\n*> SLAPY2 returns sqrt(x**2+y**2), taking care not to cause unnecessary\n*> overflow.\n*> \\endverbatim\n*\n*  Arguments:\n*  ==========\n*\n*> \\param[in] X\n*> \\verbatim\n*>          X is REAL\n*> \\endverbatim\n*>\n*> \\param[in] Y\n*> \\verbatim\n*>          Y is REAL\n*>          X and Y specify the values x and y.\n*> \\endverbatim\n*\n*  Authors:\n*  ========\n*\n*> \\author Univ. of Tennessee \n*> \\author Univ. of California Berkeley \n*> \\author Univ. of Colorado Denver \n*> \\author NAG Ltd. \n*\n*> \\date November 2011\n*\n*> \\ingroup auxOTHERauxiliary\n*\n*  =====================================================================\n      REAL             FUNCTION SLAPY2( X, Y )\n*\n*  -- LAPACK auxiliary routine (version 3.4.0) --\n*  -- LAPACK is a software package provided by Univ. of Tennessee,    --\n*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--\n*     November 2011\n*\n*     .. Scalar Arguments ..\n      REAL               X, Y\n*     ..\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      REAL               ZERO\n      PARAMETER          ( ZERO = 0.0E0 )\n      REAL               ONE\n      PARAMETER          ( ONE = 1.0E0 )\n*     ..\n*     .. Local Scalars ..\n      REAL               W, XABS, YABS, Z\n*     ..\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, MAX, MIN, SQRT\n*     ..\n*     .. Executable Statements ..\n*\n      XABS = ABS( X )\n      YABS = ABS( Y )\n      W = MAX( XABS, YABS )\n      Z = MIN( XABS, YABS )\n      IF( Z.EQ.ZERO ) THEN\n         SLAPY2 = W\n      ELSE\n         SLAPY2 = W*SQRT( ONE+( Z / W )**2 )\n      END IF\n      RETURN\n*\n*     End of SLAPY2\n*\n      END\n"
  },
  {
    "path": "libs/eigen/lapack/slapy3.f",
    "content": "*> \\brief \\b SLAPY3\n*\n*  =========== DOCUMENTATION ===========\n*\n* Online html documentation available at \n*            http://www.netlib.org/lapack/explore-html/ \n*\n*> \\htmlonly\n*> Download SLAPY3 + dependencies \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/slapy3.f\"> \n*> [TGZ]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/slapy3.f\"> \n*> [ZIP]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/slapy3.f\"> \n*> [TXT]</a>\n*> \\endhtmlonly \n*\n*  Definition:\n*  ===========\n*\n*       REAL             FUNCTION SLAPY3( X, Y, Z )\n* \n*       .. Scalar Arguments ..\n*       REAL               X, Y, Z\n*       ..\n*  \n*\n*> \\par Purpose:\n*  =============\n*>\n*> \\verbatim\n*>\n*> SLAPY3 returns sqrt(x**2+y**2+z**2), taking care not to cause\n*> unnecessary overflow.\n*> \\endverbatim\n*\n*  Arguments:\n*  ==========\n*\n*> \\param[in] X\n*> \\verbatim\n*>          X is REAL\n*> \\endverbatim\n*>\n*> \\param[in] Y\n*> \\verbatim\n*>          Y is REAL\n*> \\endverbatim\n*>\n*> \\param[in] Z\n*> \\verbatim\n*>          Z is REAL\n*>          X, Y and Z specify the values x, y and z.\n*> \\endverbatim\n*\n*  Authors:\n*  ========\n*\n*> \\author Univ. of Tennessee \n*> \\author Univ. of California Berkeley \n*> \\author Univ. of Colorado Denver \n*> \\author NAG Ltd. \n*\n*> \\date November 2011\n*\n*> \\ingroup auxOTHERauxiliary\n*\n*  =====================================================================\n      REAL             FUNCTION SLAPY3( X, Y, Z )\n*\n*  -- LAPACK auxiliary routine (version 3.4.0) --\n*  -- LAPACK is a software package provided by Univ. of Tennessee,    --\n*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--\n*     November 2011\n*\n*     .. Scalar Arguments ..\n      REAL               X, Y, Z\n*     ..\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      REAL               ZERO\n      PARAMETER          ( ZERO = 0.0E0 )\n*     ..\n*     .. Local Scalars ..\n      REAL               W, XABS, YABS, ZABS\n*     ..\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, MAX, SQRT\n*     ..\n*     .. Executable Statements ..\n*\n      XABS = ABS( X )\n      YABS = ABS( Y )\n      ZABS = ABS( Z )\n      W = MAX( XABS, YABS, ZABS )\n      IF( W.EQ.ZERO ) THEN\n*     W can be zero for max(0,nan,0)\n*     adding all three entries together will make sure\n*     NaN will not disappear.\n         SLAPY3 =  XABS + YABS + ZABS\n      ELSE\n         SLAPY3 = W*SQRT( ( XABS / W )**2+( YABS / W )**2+\n     $            ( ZABS / W )**2 )\n      END IF\n      RETURN\n*\n*     End of SLAPY3\n*\n      END\n"
  },
  {
    "path": "libs/eigen/lapack/slarf.f",
    "content": "*> \\brief \\b SLARF\n*\n*  =========== DOCUMENTATION ===========\n*\n* Online html documentation available at \n*            http://www.netlib.org/lapack/explore-html/ \n*\n*> \\htmlonly\n*> Download SLARF + dependencies \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/slarf.f\"> \n*> [TGZ]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/slarf.f\"> \n*> [ZIP]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/slarf.f\"> \n*> [TXT]</a>\n*> \\endhtmlonly \n*\n*  Definition:\n*  ===========\n*\n*       SUBROUTINE SLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK )\n* \n*       .. Scalar Arguments ..\n*       CHARACTER          SIDE\n*       INTEGER            INCV, LDC, M, N\n*       REAL               TAU\n*       ..\n*       .. Array Arguments ..\n*       REAL               C( LDC, * ), V( * ), WORK( * )\n*       ..\n*  \n*\n*> \\par Purpose:\n*  =============\n*>\n*> \\verbatim\n*>\n*> SLARF applies a real elementary reflector H to a real m by n matrix\n*> C, from either the left or the right. H is represented in the form\n*>\n*>       H = I - tau * v * v**T\n*>\n*> where tau is a real scalar and v is a real vector.\n*>\n*> If tau = 0, then H is taken to be the unit matrix.\n*> \\endverbatim\n*\n*  Arguments:\n*  ==========\n*\n*> \\param[in] SIDE\n*> \\verbatim\n*>          SIDE is CHARACTER*1\n*>          = 'L': form  H * C\n*>          = 'R': form  C * H\n*> \\endverbatim\n*>\n*> \\param[in] M\n*> \\verbatim\n*>          M is INTEGER\n*>          The number of rows of the matrix C.\n*> \\endverbatim\n*>\n*> \\param[in] N\n*> \\verbatim\n*>          N is INTEGER\n*>          The number of columns of the matrix C.\n*> \\endverbatim\n*>\n*> \\param[in] V\n*> \\verbatim\n*>          V is REAL array, dimension\n*>                     (1 + (M-1)*abs(INCV)) if SIDE = 'L'\n*>                  or (1 + (N-1)*abs(INCV)) if SIDE = 'R'\n*>          The vector v in the representation of H. V is not used if\n*>          TAU = 0.\n*> \\endverbatim\n*>\n*> \\param[in] INCV\n*> \\verbatim\n*>          INCV is INTEGER\n*>          The increment between elements of v. INCV <> 0.\n*> \\endverbatim\n*>\n*> \\param[in] TAU\n*> \\verbatim\n*>          TAU is REAL\n*>          The value tau in the representation of H.\n*> \\endverbatim\n*>\n*> \\param[in,out] C\n*> \\verbatim\n*>          C is REAL array, dimension (LDC,N)\n*>          On entry, the m by n matrix C.\n*>          On exit, C is overwritten by the matrix H * C if SIDE = 'L',\n*>          or C * H if SIDE = 'R'.\n*> \\endverbatim\n*>\n*> \\param[in] LDC\n*> \\verbatim\n*>          LDC is INTEGER\n*>          The leading dimension of the array C. LDC >= max(1,M).\n*> \\endverbatim\n*>\n*> \\param[out] WORK\n*> \\verbatim\n*>          WORK is REAL array, dimension\n*>                         (N) if SIDE = 'L'\n*>                      or (M) if SIDE = 'R'\n*> \\endverbatim\n*\n*  Authors:\n*  ========\n*\n*> \\author Univ. of Tennessee \n*> \\author Univ. of California Berkeley \n*> \\author Univ. of Colorado Denver \n*> \\author NAG Ltd. \n*\n*> \\date November 2011\n*\n*> \\ingroup realOTHERauxiliary\n*\n*  =====================================================================\n      SUBROUTINE SLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK )\n*\n*  -- LAPACK auxiliary routine (version 3.4.0) --\n*  -- LAPACK is a software package provided by Univ. of Tennessee,    --\n*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--\n*     November 2011\n*\n*     .. Scalar Arguments ..\n      CHARACTER          SIDE\n      INTEGER            INCV, LDC, M, N\n      REAL               TAU\n*     ..\n*     .. Array Arguments ..\n      REAL               C( LDC, * ), V( * ), WORK( * )\n*     ..\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      REAL               ONE, ZERO\n      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )\n*     ..\n*     .. Local Scalars ..\n      LOGICAL            APPLYLEFT\n      INTEGER            I, LASTV, LASTC\n*     ..\n*     .. External Subroutines ..\n      EXTERNAL           SGEMV, SGER\n*     ..\n*     .. External Functions ..\n      LOGICAL            LSAME\n      INTEGER            ILASLR, ILASLC\n      EXTERNAL           LSAME, ILASLR, ILASLC\n*     ..\n*     .. Executable Statements ..\n*\n      APPLYLEFT = LSAME( SIDE, 'L' )\n      LASTV = 0\n      LASTC = 0\n      IF( TAU.NE.ZERO ) THEN\n!     Set up variables for scanning V.  LASTV begins pointing to the end\n!     of V.\n         IF( APPLYLEFT ) THEN\n            LASTV = M\n         ELSE\n            LASTV = N\n         END IF\n         IF( INCV.GT.0 ) THEN\n            I = 1 + (LASTV-1) * INCV\n         ELSE\n            I = 1\n         END IF\n!     Look for the last non-zero row in V.\n         DO WHILE( LASTV.GT.0 .AND. V( I ).EQ.ZERO )\n            LASTV = LASTV - 1\n            I = I - INCV\n         END DO\n         IF( APPLYLEFT ) THEN\n!     Scan for the last non-zero column in C(1:lastv,:).\n            LASTC = ILASLC(LASTV, N, C, LDC)\n         ELSE\n!     Scan for the last non-zero row in C(:,1:lastv).\n            LASTC = ILASLR(M, LASTV, C, LDC)\n         END IF\n      END IF\n!     Note that lastc.eq.0 renders the BLAS operations null; no special\n!     case is needed at this level.\n      IF( APPLYLEFT ) THEN\n*\n*        Form  H * C\n*\n         IF( LASTV.GT.0 ) THEN\n*\n*           w(1:lastc,1) := C(1:lastv,1:lastc)**T * v(1:lastv,1)\n*\n            CALL SGEMV( 'Transpose', LASTV, LASTC, ONE, C, LDC, V, INCV,\n     $           ZERO, WORK, 1 )\n*\n*           C(1:lastv,1:lastc) := C(...) - v(1:lastv,1) * w(1:lastc,1)**T\n*\n            CALL SGER( LASTV, LASTC, -TAU, V, INCV, WORK, 1, C, LDC )\n         END IF\n      ELSE\n*\n*        Form  C * H\n*\n         IF( LASTV.GT.0 ) THEN\n*\n*           w(1:lastc,1) := C(1:lastc,1:lastv) * v(1:lastv,1)\n*\n            CALL SGEMV( 'No transpose', LASTC, LASTV, ONE, C, LDC,\n     $           V, INCV, ZERO, WORK, 1 )\n*\n*           C(1:lastc,1:lastv) := C(...) - w(1:lastc,1) * v(1:lastv,1)**T\n*\n            CALL SGER( LASTC, LASTV, -TAU, WORK, 1, V, INCV, C, LDC )\n         END IF\n      END IF\n      RETURN\n*\n*     End of SLARF\n*\n      END\n"
  },
  {
    "path": "libs/eigen/lapack/slarfb.f",
    "content": "*> \\brief \\b SLARFB\n*\n*  =========== DOCUMENTATION ===========\n*\n* Online html documentation available at \n*            http://www.netlib.org/lapack/explore-html/ \n*\n*> \\htmlonly\n*> Download SLARFB + dependencies \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/slarfb.f\"> \n*> [TGZ]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/slarfb.f\"> \n*> [ZIP]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/slarfb.f\"> \n*> [TXT]</a>\n*> \\endhtmlonly \n*\n*  Definition:\n*  ===========\n*\n*       SUBROUTINE SLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV,\n*                          T, LDT, C, LDC, WORK, LDWORK )\n* \n*       .. Scalar Arguments ..\n*       CHARACTER          DIRECT, SIDE, STOREV, TRANS\n*       INTEGER            K, LDC, LDT, LDV, LDWORK, M, N\n*       ..\n*       .. Array Arguments ..\n*       REAL               C( LDC, * ), T( LDT, * ), V( LDV, * ),\n*      $                   WORK( LDWORK, * )\n*       ..\n*  \n*\n*> \\par Purpose:\n*  =============\n*>\n*> \\verbatim\n*>\n*> SLARFB applies a real block reflector H or its transpose H**T to a\n*> real m by n matrix C, from either the left or the right.\n*> \\endverbatim\n*\n*  Arguments:\n*  ==========\n*\n*> \\param[in] SIDE\n*> \\verbatim\n*>          SIDE is CHARACTER*1\n*>          = 'L': apply H or H**T from the Left\n*>          = 'R': apply H or H**T from the Right\n*> \\endverbatim\n*>\n*> \\param[in] TRANS\n*> \\verbatim\n*>          TRANS is CHARACTER*1\n*>          = 'N': apply H (No transpose)\n*>          = 'T': apply H**T (Transpose)\n*> \\endverbatim\n*>\n*> \\param[in] DIRECT\n*> \\verbatim\n*>          DIRECT is CHARACTER*1\n*>          Indicates how H is formed from a product of elementary\n*>          reflectors\n*>          = 'F': H = H(1) H(2) . . . H(k) (Forward)\n*>          = 'B': H = H(k) . . . H(2) H(1) (Backward)\n*> \\endverbatim\n*>\n*> \\param[in] STOREV\n*> \\verbatim\n*>          STOREV is CHARACTER*1\n*>          Indicates how the vectors which define the elementary\n*>          reflectors are stored:\n*>          = 'C': Columnwise\n*>          = 'R': Rowwise\n*> \\endverbatim\n*>\n*> \\param[in] M\n*> \\verbatim\n*>          M is INTEGER\n*>          The number of rows of the matrix C.\n*> \\endverbatim\n*>\n*> \\param[in] N\n*> \\verbatim\n*>          N is INTEGER\n*>          The number of columns of the matrix C.\n*> \\endverbatim\n*>\n*> \\param[in] K\n*> \\verbatim\n*>          K is INTEGER\n*>          The order of the matrix T (= the number of elementary\n*>          reflectors whose product defines the block reflector).\n*> \\endverbatim\n*>\n*> \\param[in] V\n*> \\verbatim\n*>          V is REAL array, dimension\n*>                                (LDV,K) if STOREV = 'C'\n*>                                (LDV,M) if STOREV = 'R' and SIDE = 'L'\n*>                                (LDV,N) if STOREV = 'R' and SIDE = 'R'\n*>          The matrix V. See Further Details.\n*> \\endverbatim\n*>\n*> \\param[in] LDV\n*> \\verbatim\n*>          LDV is INTEGER\n*>          The leading dimension of the array V.\n*>          If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M);\n*>          if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N);\n*>          if STOREV = 'R', LDV >= K.\n*> \\endverbatim\n*>\n*> \\param[in] T\n*> \\verbatim\n*>          T is REAL array, dimension (LDT,K)\n*>          The triangular k by k matrix T in the representation of the\n*>          block reflector.\n*> \\endverbatim\n*>\n*> \\param[in] LDT\n*> \\verbatim\n*>          LDT is INTEGER\n*>          The leading dimension of the array T. LDT >= K.\n*> \\endverbatim\n*>\n*> \\param[in,out] C\n*> \\verbatim\n*>          C is REAL array, dimension (LDC,N)\n*>          On entry, the m by n matrix C.\n*>          On exit, C is overwritten by H*C or H**T*C or C*H or C*H**T.\n*> \\endverbatim\n*>\n*> \\param[in] LDC\n*> \\verbatim\n*>          LDC is INTEGER\n*>          The leading dimension of the array C. LDC >= max(1,M).\n*> \\endverbatim\n*>\n*> \\param[out] WORK\n*> \\verbatim\n*>          WORK is REAL array, dimension (LDWORK,K)\n*> \\endverbatim\n*>\n*> \\param[in] LDWORK\n*> \\verbatim\n*>          LDWORK is INTEGER\n*>          The leading dimension of the array WORK.\n*>          If SIDE = 'L', LDWORK >= max(1,N);\n*>          if SIDE = 'R', LDWORK >= max(1,M).\n*> \\endverbatim\n*\n*  Authors:\n*  ========\n*\n*> \\author Univ. of Tennessee \n*> \\author Univ. of California Berkeley \n*> \\author Univ. of Colorado Denver \n*> \\author NAG Ltd. \n*\n*> \\date November 2011\n*\n*> \\ingroup realOTHERauxiliary\n*\n*> \\par Further Details:\n*  =====================\n*>\n*> \\verbatim\n*>\n*>  The shape of the matrix V and the storage of the vectors which define\n*>  the H(i) is best illustrated by the following example with n = 5 and\n*>  k = 3. The elements equal to 1 are not stored; the corresponding\n*>  array elements are modified but restored on exit. The rest of the\n*>  array is not used.\n*>\n*>  DIRECT = 'F' and STOREV = 'C':         DIRECT = 'F' and STOREV = 'R':\n*>\n*>               V = (  1       )                 V = (  1 v1 v1 v1 v1 )\n*>                   ( v1  1    )                     (     1 v2 v2 v2 )\n*>                   ( v1 v2  1 )                     (        1 v3 v3 )\n*>                   ( v1 v2 v3 )\n*>                   ( v1 v2 v3 )\n*>\n*>  DIRECT = 'B' and STOREV = 'C':         DIRECT = 'B' and STOREV = 'R':\n*>\n*>               V = ( v1 v2 v3 )                 V = ( v1 v1  1       )\n*>                   ( v1 v2 v3 )                     ( v2 v2 v2  1    )\n*>                   (  1 v2 v3 )                     ( v3 v3 v3 v3  1 )\n*>                   (     1 v3 )\n*>                   (        1 )\n*> \\endverbatim\n*>\n*  =====================================================================\n      SUBROUTINE SLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV,\n     $                   T, LDT, C, LDC, WORK, LDWORK )\n*\n*  -- LAPACK auxiliary routine (version 3.4.0) --\n*  -- LAPACK is a software package provided by Univ. of Tennessee,    --\n*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--\n*     November 2011\n*\n*     .. Scalar Arguments ..\n      CHARACTER          DIRECT, SIDE, STOREV, TRANS\n      INTEGER            K, LDC, LDT, LDV, LDWORK, M, N\n*     ..\n*     .. Array Arguments ..\n      REAL               C( LDC, * ), T( LDT, * ), V( LDV, * ),\n     $                   WORK( LDWORK, * )\n*     ..\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      REAL               ONE\n      PARAMETER          ( ONE = 1.0E+0 )\n*     ..\n*     .. Local Scalars ..\n      CHARACTER          TRANST\n      INTEGER            I, J, LASTV, LASTC\n*     ..\n*     .. External Functions ..\n      LOGICAL            LSAME\n      INTEGER            ILASLR, ILASLC\n      EXTERNAL           LSAME, ILASLR, ILASLC\n*     ..\n*     .. External Subroutines ..\n      EXTERNAL           SCOPY, SGEMM, STRMM\n*     ..\n*     .. Executable Statements ..\n*\n*     Quick return if possible\n*\n      IF( M.LE.0 .OR. N.LE.0 )\n     $   RETURN\n*\n      IF( LSAME( TRANS, 'N' ) ) THEN\n         TRANST = 'T'\n      ELSE\n         TRANST = 'N'\n      END IF\n*\n      IF( LSAME( STOREV, 'C' ) ) THEN\n*\n         IF( LSAME( DIRECT, 'F' ) ) THEN\n*\n*           Let  V =  ( V1 )    (first K rows)\n*                     ( V2 )\n*           where  V1  is unit lower triangular.\n*\n            IF( LSAME( SIDE, 'L' ) ) THEN\n*\n*              Form  H * C  or  H**T * C  where  C = ( C1 )\n*                                                    ( C2 )\n*\n               LASTV = MAX( K, ILASLR( M, K, V, LDV ) )\n               LASTC = ILASLC( LASTV, N, C, LDC )\n*\n*              W := C**T * V  =  (C1**T * V1 + C2**T * V2)  (stored in WORK)\n*\n*              W := C1**T\n*\n               DO 10 J = 1, K\n                  CALL SCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 )\n   10          CONTINUE\n*\n*              W := W * V1\n*\n               CALL STRMM( 'Right', 'Lower', 'No transpose', 'Unit',\n     $              LASTC, K, ONE, V, LDV, WORK, LDWORK )\n               IF( LASTV.GT.K ) THEN\n*\n*                 W := W + C2**T *V2\n*\n                  CALL SGEMM( 'Transpose', 'No transpose',\n     $                 LASTC, K, LASTV-K,\n     $                 ONE, C( K+1, 1 ), LDC, V( K+1, 1 ), LDV,\n     $                 ONE, WORK, LDWORK )\n               END IF\n*\n*              W := W * T**T  or  W * T\n*\n               CALL STRMM( 'Right', 'Upper', TRANST, 'Non-unit',\n     $              LASTC, K, ONE, T, LDT, WORK, LDWORK )\n*\n*              C := C - V * W**T\n*\n               IF( LASTV.GT.K ) THEN\n*\n*                 C2 := C2 - V2 * W**T\n*\n                  CALL SGEMM( 'No transpose', 'Transpose',\n     $                 LASTV-K, LASTC, K,\n     $                 -ONE, V( K+1, 1 ), LDV, WORK, LDWORK, ONE,\n     $                 C( K+1, 1 ), LDC )\n               END IF\n*\n*              W := W * V1**T\n*\n               CALL STRMM( 'Right', 'Lower', 'Transpose', 'Unit',\n     $              LASTC, K, ONE, V, LDV, WORK, LDWORK )\n*\n*              C1 := C1 - W**T\n*\n               DO 30 J = 1, K\n                  DO 20 I = 1, LASTC\n                     C( J, I ) = C( J, I ) - WORK( I, J )\n   20             CONTINUE\n   30          CONTINUE\n*\n            ELSE IF( LSAME( SIDE, 'R' ) ) THEN\n*\n*              Form  C * H  or  C * H**T  where  C = ( C1  C2 )\n*\n               LASTV = MAX( K, ILASLR( N, K, V, LDV ) )\n               LASTC = ILASLR( M, LASTV, C, LDC )\n*\n*              W := C * V  =  (C1*V1 + C2*V2)  (stored in WORK)\n*\n*              W := C1\n*\n               DO 40 J = 1, K\n                  CALL SCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 )\n   40          CONTINUE\n*\n*              W := W * V1\n*\n               CALL STRMM( 'Right', 'Lower', 'No transpose', 'Unit',\n     $              LASTC, K, ONE, V, LDV, WORK, LDWORK )\n               IF( LASTV.GT.K ) THEN\n*\n*                 W := W + C2 * V2\n*\n                  CALL SGEMM( 'No transpose', 'No transpose',\n     $                 LASTC, K, LASTV-K,\n     $                 ONE, C( 1, K+1 ), LDC, V( K+1, 1 ), LDV,\n     $                 ONE, WORK, LDWORK )\n               END IF\n*\n*              W := W * T  or  W * T**T\n*\n               CALL STRMM( 'Right', 'Upper', TRANS, 'Non-unit',\n     $              LASTC, K, ONE, T, LDT, WORK, LDWORK )\n*\n*              C := C - W * V**T\n*\n               IF( LASTV.GT.K ) THEN\n*\n*                 C2 := C2 - W * V2**T\n*\n                  CALL SGEMM( 'No transpose', 'Transpose',\n     $                 LASTC, LASTV-K, K,\n     $                 -ONE, WORK, LDWORK, V( K+1, 1 ), LDV, ONE,\n     $                 C( 1, K+1 ), LDC )\n               END IF\n*\n*              W := W * V1**T\n*\n               CALL STRMM( 'Right', 'Lower', 'Transpose', 'Unit',\n     $              LASTC, K, ONE, V, LDV, WORK, LDWORK )\n*\n*              C1 := C1 - W\n*\n               DO 60 J = 1, K\n                  DO 50 I = 1, LASTC\n                     C( I, J ) = C( I, J ) - WORK( I, J )\n   50             CONTINUE\n   60          CONTINUE\n            END IF\n*\n         ELSE\n*\n*           Let  V =  ( V1 )\n*                     ( V2 )    (last K rows)\n*           where  V2  is unit upper triangular.\n*\n            IF( LSAME( SIDE, 'L' ) ) THEN\n*\n*              Form  H * C  or  H**T * C  where  C = ( C1 )\n*                                                    ( C2 )\n*\n               LASTV = MAX( K, ILASLR( M, K, V, LDV ) )\n               LASTC = ILASLC( LASTV, N, C, LDC )\n*\n*              W := C**T * V  =  (C1**T * V1 + C2**T * V2)  (stored in WORK)\n*\n*              W := C2**T\n*\n               DO 70 J = 1, K\n                  CALL SCOPY( LASTC, C( LASTV-K+J, 1 ), LDC,\n     $                 WORK( 1, J ), 1 )\n   70          CONTINUE\n*\n*              W := W * V2\n*\n               CALL STRMM( 'Right', 'Upper', 'No transpose', 'Unit',\n     $              LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV,\n     $              WORK, LDWORK )\n               IF( LASTV.GT.K ) THEN\n*\n*                 W := W + C1**T*V1\n*\n                  CALL SGEMM( 'Transpose', 'No transpose',\n     $                 LASTC, K, LASTV-K, ONE, C, LDC, V, LDV,\n     $                 ONE, WORK, LDWORK )\n               END IF\n*\n*              W := W * T**T  or  W * T\n*\n               CALL STRMM( 'Right', 'Lower', TRANST, 'Non-unit',\n     $              LASTC, K, ONE, T, LDT, WORK, LDWORK )\n*\n*              C := C - V * W**T\n*\n               IF( LASTV.GT.K ) THEN\n*\n*                 C1 := C1 - V1 * W**T\n*\n                  CALL SGEMM( 'No transpose', 'Transpose',\n     $                 LASTV-K, LASTC, K, -ONE, V, LDV, WORK, LDWORK,\n     $                 ONE, C, LDC )\n               END IF\n*\n*              W := W * V2**T\n*\n               CALL STRMM( 'Right', 'Upper', 'Transpose', 'Unit',\n     $              LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV,\n     $              WORK, LDWORK )\n*\n*              C2 := C2 - W**T\n*\n               DO 90 J = 1, K\n                  DO 80 I = 1, LASTC\n                     C( LASTV-K+J, I ) = C( LASTV-K+J, I ) - WORK(I, J)\n   80             CONTINUE\n   90          CONTINUE\n*\n            ELSE IF( LSAME( SIDE, 'R' ) ) THEN\n*\n*              Form  C * H  or  C * H**T  where  C = ( C1  C2 )\n*\n               LASTV = MAX( K, ILASLR( N, K, V, LDV ) )\n               LASTC = ILASLR( M, LASTV, C, LDC )\n*\n*              W := C * V  =  (C1*V1 + C2*V2)  (stored in WORK)\n*\n*              W := C2\n*\n               DO 100 J = 1, K\n                  CALL SCOPY( LASTC, C( 1, N-K+J ), 1, WORK( 1, J ), 1 )\n  100          CONTINUE\n*\n*              W := W * V2\n*\n               CALL STRMM( 'Right', 'Upper', 'No transpose', 'Unit',\n     $              LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV,\n     $              WORK, LDWORK )\n               IF( LASTV.GT.K ) THEN\n*\n*                 W := W + C1 * V1\n*\n                  CALL SGEMM( 'No transpose', 'No transpose',\n     $                 LASTC, K, LASTV-K, ONE, C, LDC, V, LDV,\n     $                 ONE, WORK, LDWORK )\n               END IF\n*\n*              W := W * T  or  W * T**T\n*\n               CALL STRMM( 'Right', 'Lower', TRANS, 'Non-unit',\n     $              LASTC, K, ONE, T, LDT, WORK, LDWORK )\n*\n*              C := C - W * V**T\n*\n               IF( LASTV.GT.K ) THEN\n*\n*                 C1 := C1 - W * V1**T\n*\n                  CALL SGEMM( 'No transpose', 'Transpose',\n     $                 LASTC, LASTV-K, K, -ONE, WORK, LDWORK, V, LDV,\n     $                 ONE, C, LDC )\n               END IF\n*\n*              W := W * V2**T\n*\n               CALL STRMM( 'Right', 'Upper', 'Transpose', 'Unit',\n     $              LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV,\n     $              WORK, LDWORK )\n*\n*              C2 := C2 - W\n*\n               DO 120 J = 1, K\n                  DO 110 I = 1, LASTC\n                     C( I, LASTV-K+J ) = C( I, LASTV-K+J ) - WORK(I, J)\n  110             CONTINUE\n  120          CONTINUE\n            END IF\n         END IF\n*\n      ELSE IF( LSAME( STOREV, 'R' ) ) THEN\n*\n         IF( LSAME( DIRECT, 'F' ) ) THEN\n*\n*           Let  V =  ( V1  V2 )    (V1: first K columns)\n*           where  V1  is unit upper triangular.\n*\n            IF( LSAME( SIDE, 'L' ) ) THEN\n*\n*              Form  H * C  or  H**T * C  where  C = ( C1 )\n*                                                    ( C2 )\n*\n               LASTV = MAX( K, ILASLC( K, M, V, LDV ) )\n               LASTC = ILASLC( LASTV, N, C, LDC )\n*\n*              W := C**T * V**T  =  (C1**T * V1**T + C2**T * V2**T) (stored in WORK)\n*\n*              W := C1**T\n*\n               DO 130 J = 1, K\n                  CALL SCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 )\n  130          CONTINUE\n*\n*              W := W * V1**T\n*\n               CALL STRMM( 'Right', 'Upper', 'Transpose', 'Unit',\n     $              LASTC, K, ONE, V, LDV, WORK, LDWORK )\n               IF( LASTV.GT.K ) THEN\n*\n*                 W := W + C2**T*V2**T\n*\n                  CALL SGEMM( 'Transpose', 'Transpose',\n     $                 LASTC, K, LASTV-K,\n     $                 ONE, C( K+1, 1 ), LDC, V( 1, K+1 ), LDV,\n     $                 ONE, WORK, LDWORK )\n               END IF\n*\n*              W := W * T**T  or  W * T\n*\n               CALL STRMM( 'Right', 'Upper', TRANST, 'Non-unit',\n     $              LASTC, K, ONE, T, LDT, WORK, LDWORK )\n*\n*              C := C - V**T * W**T\n*\n               IF( LASTV.GT.K ) THEN\n*\n*                 C2 := C2 - V2**T * W**T\n*\n                  CALL SGEMM( 'Transpose', 'Transpose',\n     $                 LASTV-K, LASTC, K,\n     $                 -ONE, V( 1, K+1 ), LDV, WORK, LDWORK,\n     $                 ONE, C( K+1, 1 ), LDC )\n               END IF\n*\n*              W := W * V1\n*\n               CALL STRMM( 'Right', 'Upper', 'No transpose', 'Unit',\n     $              LASTC, K, ONE, V, LDV, WORK, LDWORK )\n*\n*              C1 := C1 - W**T\n*\n               DO 150 J = 1, K\n                  DO 140 I = 1, LASTC\n                     C( J, I ) = C( J, I ) - WORK( I, J )\n  140             CONTINUE\n  150          CONTINUE\n*\n            ELSE IF( LSAME( SIDE, 'R' ) ) THEN\n*\n*              Form  C * H  or  C * H**T  where  C = ( C1  C2 )\n*\n               LASTV = MAX( K, ILASLC( K, N, V, LDV ) )\n               LASTC = ILASLR( M, LASTV, C, LDC )\n*\n*              W := C * V**T  =  (C1*V1**T + C2*V2**T)  (stored in WORK)\n*\n*              W := C1\n*\n               DO 160 J = 1, K\n                  CALL SCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 )\n  160          CONTINUE\n*\n*              W := W * V1**T\n*\n               CALL STRMM( 'Right', 'Upper', 'Transpose', 'Unit',\n     $              LASTC, K, ONE, V, LDV, WORK, LDWORK )\n               IF( LASTV.GT.K ) THEN\n*\n*                 W := W + C2 * V2**T\n*\n                  CALL SGEMM( 'No transpose', 'Transpose',\n     $                 LASTC, K, LASTV-K,\n     $                 ONE, C( 1, K+1 ), LDC, V( 1, K+1 ), LDV,\n     $                 ONE, WORK, LDWORK )\n               END IF\n*\n*              W := W * T  or  W * T**T\n*\n               CALL STRMM( 'Right', 'Upper', TRANS, 'Non-unit',\n     $              LASTC, K, ONE, T, LDT, WORK, LDWORK )\n*\n*              C := C - W * V\n*\n               IF( LASTV.GT.K ) THEN\n*\n*                 C2 := C2 - W * V2\n*\n                  CALL SGEMM( 'No transpose', 'No transpose',\n     $                 LASTC, LASTV-K, K,\n     $                 -ONE, WORK, LDWORK, V( 1, K+1 ), LDV,\n     $                 ONE, C( 1, K+1 ), LDC )\n               END IF\n*\n*              W := W * V1\n*\n               CALL STRMM( 'Right', 'Upper', 'No transpose', 'Unit',\n     $              LASTC, K, ONE, V, LDV, WORK, LDWORK )\n*\n*              C1 := C1 - W\n*\n               DO 180 J = 1, K\n                  DO 170 I = 1, LASTC\n                     C( I, J ) = C( I, J ) - WORK( I, J )\n  170             CONTINUE\n  180          CONTINUE\n*\n            END IF\n*\n         ELSE\n*\n*           Let  V =  ( V1  V2 )    (V2: last K columns)\n*           where  V2  is unit lower triangular.\n*\n            IF( LSAME( SIDE, 'L' ) ) THEN\n*\n*              Form  H * C  or  H**T * C  where  C = ( C1 )\n*                                                    ( C2 )\n*\n               LASTV = MAX( K, ILASLC( K, M, V, LDV ) )\n               LASTC = ILASLC( LASTV, N, C, LDC )\n*\n*              W := C**T * V**T  =  (C1**T * V1**T + C2**T * V2**T) (stored in WORK)\n*\n*              W := C2**T\n*\n               DO 190 J = 1, K\n                  CALL SCOPY( LASTC, C( LASTV-K+J, 1 ), LDC,\n     $                 WORK( 1, J ), 1 )\n  190          CONTINUE\n*\n*              W := W * V2**T\n*\n               CALL STRMM( 'Right', 'Lower', 'Transpose', 'Unit',\n     $              LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV,\n     $              WORK, LDWORK )\n               IF( LASTV.GT.K ) THEN\n*\n*                 W := W + C1**T * V1**T\n*\n                  CALL SGEMM( 'Transpose', 'Transpose',\n     $                 LASTC, K, LASTV-K, ONE, C, LDC, V, LDV,\n     $                 ONE, WORK, LDWORK )\n               END IF\n*\n*              W := W * T**T  or  W * T\n*\n               CALL STRMM( 'Right', 'Lower', TRANST, 'Non-unit',\n     $              LASTC, K, ONE, T, LDT, WORK, LDWORK )\n*\n*              C := C - V**T * W**T\n*\n               IF( LASTV.GT.K ) THEN\n*\n*                 C1 := C1 - V1**T * W**T\n*\n                  CALL SGEMM( 'Transpose', 'Transpose',\n     $                 LASTV-K, LASTC, K, -ONE, V, LDV, WORK, LDWORK,\n     $                 ONE, C, LDC )\n               END IF\n*\n*              W := W * V2\n*\n               CALL STRMM( 'Right', 'Lower', 'No transpose', 'Unit',\n     $              LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV,\n     $              WORK, LDWORK )\n*\n*              C2 := C2 - W**T\n*\n               DO 210 J = 1, K\n                  DO 200 I = 1, LASTC\n                     C( LASTV-K+J, I ) = C( LASTV-K+J, I ) - WORK(I, J)\n  200             CONTINUE\n  210          CONTINUE\n*\n            ELSE IF( LSAME( SIDE, 'R' ) ) THEN\n*\n*              Form  C * H  or  C * H**T  where  C = ( C1  C2 )\n*\n               LASTV = MAX( K, ILASLC( K, N, V, LDV ) )\n               LASTC = ILASLR( M, LASTV, C, LDC )\n*\n*              W := C * V**T  =  (C1*V1**T + C2*V2**T)  (stored in WORK)\n*\n*              W := C2\n*\n               DO 220 J = 1, K\n                  CALL SCOPY( LASTC, C( 1, LASTV-K+J ), 1,\n     $                 WORK( 1, J ), 1 )\n  220          CONTINUE\n*\n*              W := W * V2**T\n*\n               CALL STRMM( 'Right', 'Lower', 'Transpose', 'Unit',\n     $              LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV,\n     $              WORK, LDWORK )\n               IF( LASTV.GT.K ) THEN\n*\n*                 W := W + C1 * V1**T\n*\n                  CALL SGEMM( 'No transpose', 'Transpose',\n     $                 LASTC, K, LASTV-K, ONE, C, LDC, V, LDV,\n     $                 ONE, WORK, LDWORK )\n               END IF\n*\n*              W := W * T  or  W * T**T\n*\n               CALL STRMM( 'Right', 'Lower', TRANS, 'Non-unit',\n     $              LASTC, K, ONE, T, LDT, WORK, LDWORK )\n*\n*              C := C - W * V\n*\n               IF( LASTV.GT.K ) THEN\n*\n*                 C1 := C1 - W * V1\n*\n                  CALL SGEMM( 'No transpose', 'No transpose',\n     $                 LASTC, LASTV-K, K, -ONE, WORK, LDWORK, V, LDV,\n     $                 ONE, C, LDC )\n               END IF\n*\n*              W := W * V2\n*\n               CALL STRMM( 'Right', 'Lower', 'No transpose', 'Unit',\n     $              LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV,\n     $              WORK, LDWORK )\n*\n*              C1 := C1 - W\n*\n               DO 240 J = 1, K\n                  DO 230 I = 1, LASTC\n                     C( I, LASTV-K+J ) = C( I, LASTV-K+J )\n     $                    - WORK( I, J )\n  230             CONTINUE\n  240          CONTINUE\n*\n            END IF\n*\n         END IF\n      END IF\n*\n      RETURN\n*\n*     End of SLARFB\n*\n      END\n"
  },
  {
    "path": "libs/eigen/lapack/slarfg.f",
    "content": "*> \\brief \\b SLARFG\n*\n*  =========== DOCUMENTATION ===========\n*\n* Online html documentation available at \n*            http://www.netlib.org/lapack/explore-html/ \n*\n*> \\htmlonly\n*> Download SLARFG + dependencies \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/slarfg.f\"> \n*> [TGZ]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/slarfg.f\"> \n*> [ZIP]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/slarfg.f\"> \n*> [TXT]</a>\n*> \\endhtmlonly \n*\n*  Definition:\n*  ===========\n*\n*       SUBROUTINE SLARFG( N, ALPHA, X, INCX, TAU )\n* \n*       .. Scalar Arguments ..\n*       INTEGER            INCX, N\n*       REAL               ALPHA, TAU\n*       ..\n*       .. Array Arguments ..\n*       REAL               X( * )\n*       ..\n*  \n*\n*> \\par Purpose:\n*  =============\n*>\n*> \\verbatim\n*>\n*> SLARFG generates a real elementary reflector H of order n, such\n*> that\n*>\n*>       H * ( alpha ) = ( beta ),   H**T * H = I.\n*>           (   x   )   (   0  )\n*>\n*> where alpha and beta are scalars, and x is an (n-1)-element real\n*> vector. H is represented in the form\n*>\n*>       H = I - tau * ( 1 ) * ( 1 v**T ) ,\n*>                     ( v )\n*>\n*> where tau is a real scalar and v is a real (n-1)-element\n*> vector.\n*>\n*> If the elements of x are all zero, then tau = 0 and H is taken to be\n*> the unit matrix.\n*>\n*> Otherwise  1 <= tau <= 2.\n*> \\endverbatim\n*\n*  Arguments:\n*  ==========\n*\n*> \\param[in] N\n*> \\verbatim\n*>          N is INTEGER\n*>          The order of the elementary reflector.\n*> \\endverbatim\n*>\n*> \\param[in,out] ALPHA\n*> \\verbatim\n*>          ALPHA is REAL\n*>          On entry, the value alpha.\n*>          On exit, it is overwritten with the value beta.\n*> \\endverbatim\n*>\n*> \\param[in,out] X\n*> \\verbatim\n*>          X is REAL array, dimension\n*>                         (1+(N-2)*abs(INCX))\n*>          On entry, the vector x.\n*>          On exit, it is overwritten with the vector v.\n*> \\endverbatim\n*>\n*> \\param[in] INCX\n*> \\verbatim\n*>          INCX is INTEGER\n*>          The increment between elements of X. INCX > 0.\n*> \\endverbatim\n*>\n*> \\param[out] TAU\n*> \\verbatim\n*>          TAU is REAL\n*>          The value tau.\n*> \\endverbatim\n*\n*  Authors:\n*  ========\n*\n*> \\author Univ. of Tennessee \n*> \\author Univ. of California Berkeley \n*> \\author Univ. of Colorado Denver \n*> \\author NAG Ltd. \n*\n*> \\date November 2011\n*\n*> \\ingroup realOTHERauxiliary\n*\n*  =====================================================================\n      SUBROUTINE SLARFG( N, ALPHA, X, INCX, TAU )\n*\n*  -- LAPACK auxiliary routine (version 3.4.0) --\n*  -- LAPACK is a software package provided by Univ. of Tennessee,    --\n*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--\n*     November 2011\n*\n*     .. Scalar Arguments ..\n      INTEGER            INCX, N\n      REAL               ALPHA, TAU\n*     ..\n*     .. Array Arguments ..\n      REAL               X( * )\n*     ..\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      REAL               ONE, ZERO\n      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )\n*     ..\n*     .. Local Scalars ..\n      INTEGER            J, KNT\n      REAL               BETA, RSAFMN, SAFMIN, XNORM\n*     ..\n*     .. External Functions ..\n      REAL               SLAMCH, SLAPY2, SNRM2\n      EXTERNAL           SLAMCH, SLAPY2, SNRM2\n*     ..\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, SIGN\n*     ..\n*     .. External Subroutines ..\n      EXTERNAL           SSCAL\n*     ..\n*     .. Executable Statements ..\n*\n      IF( N.LE.1 ) THEN\n         TAU = ZERO\n         RETURN\n      END IF\n*\n      XNORM = SNRM2( N-1, X, INCX )\n*\n      IF( XNORM.EQ.ZERO ) THEN\n*\n*        H  =  I\n*\n         TAU = ZERO\n      ELSE\n*\n*        general case\n*\n         BETA = -SIGN( SLAPY2( ALPHA, XNORM ), ALPHA )\n         SAFMIN = SLAMCH( 'S' ) / SLAMCH( 'E' )\n         KNT = 0\n         IF( ABS( BETA ).LT.SAFMIN ) THEN\n*\n*           XNORM, BETA may be inaccurate; scale X and recompute them\n*\n            RSAFMN = ONE / SAFMIN\n   10       CONTINUE\n            KNT = KNT + 1\n            CALL SSCAL( N-1, RSAFMN, X, INCX )\n            BETA = BETA*RSAFMN\n            ALPHA = ALPHA*RSAFMN\n            IF( ABS( BETA ).LT.SAFMIN )\n     $         GO TO 10\n*\n*           New BETA is at most 1, at least SAFMIN\n*\n            XNORM = SNRM2( N-1, X, INCX )\n            BETA = -SIGN( SLAPY2( ALPHA, XNORM ), ALPHA )\n         END IF\n         TAU = ( BETA-ALPHA ) / BETA\n         CALL SSCAL( N-1, ONE / ( ALPHA-BETA ), X, INCX )\n*\n*        If ALPHA is subnormal, it may lose relative accuracy\n*\n         DO 20 J = 1, KNT\n            BETA = BETA*SAFMIN\n 20      CONTINUE\n         ALPHA = BETA\n      END IF\n*\n      RETURN\n*\n*     End of SLARFG\n*\n      END\n"
  },
  {
    "path": "libs/eigen/lapack/slarft.f",
    "content": "*> \\brief \\b SLARFT\n*\n*  =========== DOCUMENTATION ===========\n*\n* Online html documentation available at \n*            http://www.netlib.org/lapack/explore-html/ \n*\n*> \\htmlonly\n*> Download SLARFT + dependencies \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/slarft.f\"> \n*> [TGZ]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/slarft.f\"> \n*> [ZIP]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/slarft.f\"> \n*> [TXT]</a>\n*> \\endhtmlonly \n*\n*  Definition:\n*  ===========\n*\n*       SUBROUTINE SLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT )\n* \n*       .. Scalar Arguments ..\n*       CHARACTER          DIRECT, STOREV\n*       INTEGER            K, LDT, LDV, N\n*       ..\n*       .. Array Arguments ..\n*       REAL               T( LDT, * ), TAU( * ), V( LDV, * )\n*       ..\n*  \n*\n*> \\par Purpose:\n*  =============\n*>\n*> \\verbatim\n*>\n*> SLARFT forms the triangular factor T of a real block reflector H\n*> of order n, which is defined as a product of k elementary reflectors.\n*>\n*> If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular;\n*>\n*> If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular.\n*>\n*> If STOREV = 'C', the vector which defines the elementary reflector\n*> H(i) is stored in the i-th column of the array V, and\n*>\n*>    H  =  I - V * T * V**T\n*>\n*> If STOREV = 'R', the vector which defines the elementary reflector\n*> H(i) is stored in the i-th row of the array V, and\n*>\n*>    H  =  I - V**T * T * V\n*> \\endverbatim\n*\n*  Arguments:\n*  ==========\n*\n*> \\param[in] DIRECT\n*> \\verbatim\n*>          DIRECT is CHARACTER*1\n*>          Specifies the order in which the elementary reflectors are\n*>          multiplied to form the block reflector:\n*>          = 'F': H = H(1) H(2) . . . H(k) (Forward)\n*>          = 'B': H = H(k) . . . H(2) H(1) (Backward)\n*> \\endverbatim\n*>\n*> \\param[in] STOREV\n*> \\verbatim\n*>          STOREV is CHARACTER*1\n*>          Specifies how the vectors which define the elementary\n*>          reflectors are stored (see also Further Details):\n*>          = 'C': columnwise\n*>          = 'R': rowwise\n*> \\endverbatim\n*>\n*> \\param[in] N\n*> \\verbatim\n*>          N is INTEGER\n*>          The order of the block reflector H. N >= 0.\n*> \\endverbatim\n*>\n*> \\param[in] K\n*> \\verbatim\n*>          K is INTEGER\n*>          The order of the triangular factor T (= the number of\n*>          elementary reflectors). K >= 1.\n*> \\endverbatim\n*>\n*> \\param[in] V\n*> \\verbatim\n*>          V is REAL array, dimension\n*>                               (LDV,K) if STOREV = 'C'\n*>                               (LDV,N) if STOREV = 'R'\n*>          The matrix V. See further details.\n*> \\endverbatim\n*>\n*> \\param[in] LDV\n*> \\verbatim\n*>          LDV is INTEGER\n*>          The leading dimension of the array V.\n*>          If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K.\n*> \\endverbatim\n*>\n*> \\param[in] TAU\n*> \\verbatim\n*>          TAU is REAL array, dimension (K)\n*>          TAU(i) must contain the scalar factor of the elementary\n*>          reflector H(i).\n*> \\endverbatim\n*>\n*> \\param[out] T\n*> \\verbatim\n*>          T is REAL array, dimension (LDT,K)\n*>          The k by k triangular factor T of the block reflector.\n*>          If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is\n*>          lower triangular. The rest of the array is not used.\n*> \\endverbatim\n*>\n*> \\param[in] LDT\n*> \\verbatim\n*>          LDT is INTEGER\n*>          The leading dimension of the array T. LDT >= K.\n*> \\endverbatim\n*\n*  Authors:\n*  ========\n*\n*> \\author Univ. of Tennessee \n*> \\author Univ. of California Berkeley \n*> \\author Univ. of Colorado Denver \n*> \\author NAG Ltd. \n*\n*> \\date April 2012\n*\n*> \\ingroup realOTHERauxiliary\n*\n*> \\par Further Details:\n*  =====================\n*>\n*> \\verbatim\n*>\n*>  The shape of the matrix V and the storage of the vectors which define\n*>  the H(i) is best illustrated by the following example with n = 5 and\n*>  k = 3. The elements equal to 1 are not stored.\n*>\n*>  DIRECT = 'F' and STOREV = 'C':         DIRECT = 'F' and STOREV = 'R':\n*>\n*>               V = (  1       )                 V = (  1 v1 v1 v1 v1 )\n*>                   ( v1  1    )                     (     1 v2 v2 v2 )\n*>                   ( v1 v2  1 )                     (        1 v3 v3 )\n*>                   ( v1 v2 v3 )\n*>                   ( v1 v2 v3 )\n*>\n*>  DIRECT = 'B' and STOREV = 'C':         DIRECT = 'B' and STOREV = 'R':\n*>\n*>               V = ( v1 v2 v3 )                 V = ( v1 v1  1       )\n*>                   ( v1 v2 v3 )                     ( v2 v2 v2  1    )\n*>                   (  1 v2 v3 )                     ( v3 v3 v3 v3  1 )\n*>                   (     1 v3 )\n*>                   (        1 )\n*> \\endverbatim\n*>\n*  =====================================================================\n      SUBROUTINE SLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT )\n*\n*  -- LAPACK auxiliary routine (version 3.4.1) --\n*  -- LAPACK is a software package provided by Univ. of Tennessee,    --\n*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--\n*     April 2012\n*\n*     .. Scalar Arguments ..\n      CHARACTER          DIRECT, STOREV\n      INTEGER            K, LDT, LDV, N\n*     ..\n*     .. Array Arguments ..\n      REAL               T( LDT, * ), TAU( * ), V( LDV, * )\n*     ..\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      REAL               ONE, ZERO\n      PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )\n*     ..\n*     .. Local Scalars ..\n      INTEGER            I, J, PREVLASTV, LASTV\n*     ..\n*     .. External Subroutines ..\n      EXTERNAL           SGEMV, STRMV\n*     ..\n*     .. External Functions ..\n      LOGICAL            LSAME\n      EXTERNAL           LSAME\n*     ..\n*     .. Executable Statements ..\n*\n*     Quick return if possible\n*\n      IF( N.EQ.0 )\n     $   RETURN\n*\n      IF( LSAME( DIRECT, 'F' ) ) THEN\n         PREVLASTV = N\n         DO I = 1, K\n            PREVLASTV = MAX( I, PREVLASTV )\n            IF( TAU( I ).EQ.ZERO ) THEN\n*\n*              H(i)  =  I\n*\n               DO J = 1, I\n                  T( J, I ) = ZERO\n               END DO\n            ELSE\n*\n*              general case\n*\n               IF( LSAME( STOREV, 'C' ) ) THEN\n*                 Skip any trailing zeros.\n                  DO LASTV = N, I+1, -1\n                     IF( V( LASTV, I ).NE.ZERO ) EXIT\n                  END DO\n                  DO J = 1, I-1\n                     T( J, I ) = -TAU( I ) * V( I , J )\n                  END DO   \n                  J = MIN( LASTV, PREVLASTV )\n*\n*                 T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)**T * V(i:j,i)\n*\n                  CALL SGEMV( 'Transpose', J-I, I-1, -TAU( I ),\n     $                        V( I+1, 1 ), LDV, V( I+1, I ), 1, ONE,\n     $                        T( 1, I ), 1 )\n               ELSE\n*                 Skip any trailing zeros.\n                  DO LASTV = N, I+1, -1\n                     IF( V( I, LASTV ).NE.ZERO ) EXIT\n                  END DO\n                  DO J = 1, I-1\n                     T( J, I ) = -TAU( I ) * V( J , I )\n                  END DO   \n                  J = MIN( LASTV, PREVLASTV )\n*\n*                 T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)**T\n*\n                  CALL SGEMV( 'No transpose', I-1, J-I, -TAU( I ),\n     $                        V( 1, I+1 ), LDV, V( I, I+1 ), LDV, \n     $                        ONE, T( 1, I ), 1 )\n               END IF\n*\n*              T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i)\n*\n               CALL STRMV( 'Upper', 'No transpose', 'Non-unit', I-1, T,\n     $                     LDT, T( 1, I ), 1 )\n               T( I, I ) = TAU( I )\n               IF( I.GT.1 ) THEN\n                  PREVLASTV = MAX( PREVLASTV, LASTV )\n               ELSE\n                  PREVLASTV = LASTV\n               END IF\n            END IF\n         END DO\n      ELSE\n         PREVLASTV = 1\n         DO I = K, 1, -1\n            IF( TAU( I ).EQ.ZERO ) THEN\n*\n*              H(i)  =  I\n*\n               DO J = I, K\n                  T( J, I ) = ZERO\n               END DO\n            ELSE\n*\n*              general case\n*\n               IF( I.LT.K ) THEN\n                  IF( LSAME( STOREV, 'C' ) ) THEN\n*                    Skip any leading zeros.\n                     DO LASTV = 1, I-1\n                        IF( V( LASTV, I ).NE.ZERO ) EXIT\n                     END DO\n                     DO J = I+1, K\n                        T( J, I ) = -TAU( I ) * V( N-K+I , J )\n                     END DO   \n                     J = MAX( LASTV, PREVLASTV )\n*\n*                    T(i+1:k,i) = -tau(i) * V(j:n-k+i,i+1:k)**T * V(j:n-k+i,i)\n*\n                     CALL SGEMV( 'Transpose', N-K+I-J, K-I, -TAU( I ),\n     $                           V( J, I+1 ), LDV, V( J, I ), 1, ONE,\n     $                           T( I+1, I ), 1 )\n                  ELSE\n*                    Skip any leading zeros.\n                     DO LASTV = 1, I-1\n                        IF( V( I, LASTV ).NE.ZERO ) EXIT\n                     END DO\n                     DO J = I+1, K\n                        T( J, I ) = -TAU( I ) * V( J, N-K+I )\n                     END DO   \n                     J = MAX( LASTV, PREVLASTV )\n*\n*                    T(i+1:k,i) = -tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)**T\n*\n                     CALL SGEMV( 'No transpose', K-I, N-K+I-J,\n     $                    -TAU( I ), V( I+1, J ), LDV, V( I, J ), LDV,\n     $                    ONE, T( I+1, I ), 1 )\n                  END IF\n*\n*                 T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i)\n*\n                  CALL STRMV( 'Lower', 'No transpose', 'Non-unit', K-I,\n     $                        T( I+1, I+1 ), LDT, T( I+1, I ), 1 )\n                  IF( I.GT.1 ) THEN\n                     PREVLASTV = MIN( PREVLASTV, LASTV )\n                  ELSE\n                     PREVLASTV = LASTV\n                  END IF\n               END IF\n               T( I, I ) = TAU( I )\n            END IF\n         END DO\n      END IF\n      RETURN\n*\n*     End of SLARFT\n*\n      END\n"
  },
  {
    "path": "libs/eigen/lapack/zlacgv.f",
    "content": "*> \\brief \\b ZLACGV\n*\n*  =========== DOCUMENTATION ===========\n*\n* Online html documentation available at \n*            http://www.netlib.org/lapack/explore-html/ \n*\n*> \\htmlonly\n*> Download ZLACGV + dependencies \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zlacgv.f\"> \n*> [TGZ]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zlacgv.f\"> \n*> [ZIP]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zlacgv.f\"> \n*> [TXT]</a>\n*> \\endhtmlonly \n*\n*  Definition:\n*  ===========\n*\n*       SUBROUTINE ZLACGV( N, X, INCX )\n* \n*       .. Scalar Arguments ..\n*       INTEGER            INCX, N\n*       ..\n*       .. Array Arguments ..\n*       COMPLEX*16         X( * )\n*       ..\n*  \n*\n*> \\par Purpose:\n*  =============\n*>\n*> \\verbatim\n*>\n*> ZLACGV conjugates a complex vector of length N.\n*> \\endverbatim\n*\n*  Arguments:\n*  ==========\n*\n*> \\param[in] N\n*> \\verbatim\n*>          N is INTEGER\n*>          The length of the vector X.  N >= 0.\n*> \\endverbatim\n*>\n*> \\param[in,out] X\n*> \\verbatim\n*>          X is COMPLEX*16 array, dimension\n*>                         (1+(N-1)*abs(INCX))\n*>          On entry, the vector of length N to be conjugated.\n*>          On exit, X is overwritten with conjg(X).\n*> \\endverbatim\n*>\n*> \\param[in] INCX\n*> \\verbatim\n*>          INCX is INTEGER\n*>          The spacing between successive elements of X.\n*> \\endverbatim\n*\n*  Authors:\n*  ========\n*\n*> \\author Univ. of Tennessee \n*> \\author Univ. of California Berkeley \n*> \\author Univ. of Colorado Denver \n*> \\author NAG Ltd. \n*\n*> \\date November 2011\n*\n*> \\ingroup complex16OTHERauxiliary\n*\n*  =====================================================================\n      SUBROUTINE ZLACGV( N, X, INCX )\n*\n*  -- LAPACK auxiliary routine (version 3.4.0) --\n*  -- LAPACK is a software package provided by Univ. of Tennessee,    --\n*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--\n*     November 2011\n*\n*     .. Scalar Arguments ..\n      INTEGER            INCX, N\n*     ..\n*     .. Array Arguments ..\n      COMPLEX*16         X( * )\n*     ..\n*\n* =====================================================================\n*\n*     .. Local Scalars ..\n      INTEGER            I, IOFF\n*     ..\n*     .. Intrinsic Functions ..\n      INTRINSIC          DCONJG\n*     ..\n*     .. Executable Statements ..\n*\n      IF( INCX.EQ.1 ) THEN\n         DO 10 I = 1, N\n            X( I ) = DCONJG( X( I ) )\n   10    CONTINUE\n      ELSE\n         IOFF = 1\n         IF( INCX.LT.0 )\n     $      IOFF = 1 - ( N-1 )*INCX\n         DO 20 I = 1, N\n            X( IOFF ) = DCONJG( X( IOFF ) )\n            IOFF = IOFF + INCX\n   20    CONTINUE\n      END IF\n      RETURN\n*\n*     End of ZLACGV\n*\n      END\n"
  },
  {
    "path": "libs/eigen/lapack/zladiv.f",
    "content": "*> \\brief \\b ZLADIV\n*\n*  =========== DOCUMENTATION ===========\n*\n* Online html documentation available at \n*            http://www.netlib.org/lapack/explore-html/ \n*\n*> \\htmlonly\n*> Download ZLADIV + dependencies \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zladiv.f\"> \n*> [TGZ]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zladiv.f\"> \n*> [ZIP]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zladiv.f\"> \n*> [TXT]</a>\n*> \\endhtmlonly \n*\n*  Definition:\n*  ===========\n*\n*       COMPLEX*16     FUNCTION ZLADIV( X, Y )\n* \n*       .. Scalar Arguments ..\n*       COMPLEX*16         X, Y\n*       ..\n*  \n*\n*> \\par Purpose:\n*  =============\n*>\n*> \\verbatim\n*>\n*> ZLADIV := X / Y, where X and Y are complex.  The computation of X / Y\n*> will not overflow on an intermediary step unless the results\n*> overflows.\n*> \\endverbatim\n*\n*  Arguments:\n*  ==========\n*\n*> \\param[in] X\n*> \\verbatim\n*>          X is COMPLEX*16\n*> \\endverbatim\n*>\n*> \\param[in] Y\n*> \\verbatim\n*>          Y is COMPLEX*16\n*>          The complex scalars X and Y.\n*> \\endverbatim\n*\n*  Authors:\n*  ========\n*\n*> \\author Univ. of Tennessee \n*> \\author Univ. of California Berkeley \n*> \\author Univ. of Colorado Denver \n*> \\author NAG Ltd. \n*\n*> \\date November 2011\n*\n*> \\ingroup complex16OTHERauxiliary\n*\n*  =====================================================================\n      COMPLEX*16     FUNCTION ZLADIV( X, Y )\n*\n*  -- LAPACK auxiliary routine (version 3.4.0) --\n*  -- LAPACK is a software package provided by Univ. of Tennessee,    --\n*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--\n*     November 2011\n*\n*     .. Scalar Arguments ..\n      COMPLEX*16         X, Y\n*     ..\n*\n*  =====================================================================\n*\n*     .. Local Scalars ..\n      DOUBLE PRECISION   ZI, ZR\n*     ..\n*     .. External Subroutines ..\n      EXTERNAL           DLADIV\n*     ..\n*     .. Intrinsic Functions ..\n      INTRINSIC          DBLE, DCMPLX, DIMAG\n*     ..\n*     .. Executable Statements ..\n*\n      CALL DLADIV( DBLE( X ), DIMAG( X ), DBLE( Y ), DIMAG( Y ), ZR,\n     $             ZI )\n      ZLADIV = DCMPLX( ZR, ZI )\n*\n      RETURN\n*\n*     End of ZLADIV\n*\n      END\n"
  },
  {
    "path": "libs/eigen/lapack/zlarf.f",
    "content": "*> \\brief \\b ZLARF\n*\n*  =========== DOCUMENTATION ===========\n*\n* Online html documentation available at \n*            http://www.netlib.org/lapack/explore-html/ \n*\n*> \\htmlonly\n*> Download ZLARF + dependencies \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zlarf.f\"> \n*> [TGZ]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zlarf.f\"> \n*> [ZIP]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zlarf.f\"> \n*> [TXT]</a>\n*> \\endhtmlonly \n*\n*  Definition:\n*  ===========\n*\n*       SUBROUTINE ZLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK )\n* \n*       .. Scalar Arguments ..\n*       CHARACTER          SIDE\n*       INTEGER            INCV, LDC, M, N\n*       COMPLEX*16         TAU\n*       ..\n*       .. Array Arguments ..\n*       COMPLEX*16         C( LDC, * ), V( * ), WORK( * )\n*       ..\n*  \n*\n*> \\par Purpose:\n*  =============\n*>\n*> \\verbatim\n*>\n*> ZLARF applies a complex elementary reflector H to a complex M-by-N\n*> matrix C, from either the left or the right. H is represented in the\n*> form\n*>\n*>       H = I - tau * v * v**H\n*>\n*> where tau is a complex scalar and v is a complex vector.\n*>\n*> If tau = 0, then H is taken to be the unit matrix.\n*>\n*> To apply H**H, supply conjg(tau) instead\n*> tau.\n*> \\endverbatim\n*\n*  Arguments:\n*  ==========\n*\n*> \\param[in] SIDE\n*> \\verbatim\n*>          SIDE is CHARACTER*1\n*>          = 'L': form  H * C\n*>          = 'R': form  C * H\n*> \\endverbatim\n*>\n*> \\param[in] M\n*> \\verbatim\n*>          M is INTEGER\n*>          The number of rows of the matrix C.\n*> \\endverbatim\n*>\n*> \\param[in] N\n*> \\verbatim\n*>          N is INTEGER\n*>          The number of columns of the matrix C.\n*> \\endverbatim\n*>\n*> \\param[in] V\n*> \\verbatim\n*>          V is COMPLEX*16 array, dimension\n*>                     (1 + (M-1)*abs(INCV)) if SIDE = 'L'\n*>                  or (1 + (N-1)*abs(INCV)) if SIDE = 'R'\n*>          The vector v in the representation of H. V is not used if\n*>          TAU = 0.\n*> \\endverbatim\n*>\n*> \\param[in] INCV\n*> \\verbatim\n*>          INCV is INTEGER\n*>          The increment between elements of v. INCV <> 0.\n*> \\endverbatim\n*>\n*> \\param[in] TAU\n*> \\verbatim\n*>          TAU is COMPLEX*16\n*>          The value tau in the representation of H.\n*> \\endverbatim\n*>\n*> \\param[in,out] C\n*> \\verbatim\n*>          C is COMPLEX*16 array, dimension (LDC,N)\n*>          On entry, the M-by-N matrix C.\n*>          On exit, C is overwritten by the matrix H * C if SIDE = 'L',\n*>          or C * H if SIDE = 'R'.\n*> \\endverbatim\n*>\n*> \\param[in] LDC\n*> \\verbatim\n*>          LDC is INTEGER\n*>          The leading dimension of the array C. LDC >= max(1,M).\n*> \\endverbatim\n*>\n*> \\param[out] WORK\n*> \\verbatim\n*>          WORK is COMPLEX*16 array, dimension\n*>                         (N) if SIDE = 'L'\n*>                      or (M) if SIDE = 'R'\n*> \\endverbatim\n*\n*  Authors:\n*  ========\n*\n*> \\author Univ. of Tennessee \n*> \\author Univ. of California Berkeley \n*> \\author Univ. of Colorado Denver \n*> \\author NAG Ltd. \n*\n*> \\date November 2011\n*\n*> \\ingroup complex16OTHERauxiliary\n*\n*  =====================================================================\n      SUBROUTINE ZLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK )\n*\n*  -- LAPACK auxiliary routine (version 3.4.0) --\n*  -- LAPACK is a software package provided by Univ. of Tennessee,    --\n*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--\n*     November 2011\n*\n*     .. Scalar Arguments ..\n      CHARACTER          SIDE\n      INTEGER            INCV, LDC, M, N\n      COMPLEX*16         TAU\n*     ..\n*     .. Array Arguments ..\n      COMPLEX*16         C( LDC, * ), V( * ), WORK( * )\n*     ..\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      COMPLEX*16         ONE, ZERO\n      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ),\n     $                   ZERO = ( 0.0D+0, 0.0D+0 ) )\n*     ..\n*     .. Local Scalars ..\n      LOGICAL            APPLYLEFT\n      INTEGER            I, LASTV, LASTC\n*     ..\n*     .. External Subroutines ..\n      EXTERNAL           ZGEMV, ZGERC\n*     ..\n*     .. External Functions ..\n      LOGICAL            LSAME\n      INTEGER            ILAZLR, ILAZLC\n      EXTERNAL           LSAME, ILAZLR, ILAZLC\n*     ..\n*     .. Executable Statements ..\n*\n      APPLYLEFT = LSAME( SIDE, 'L' )\n      LASTV = 0\n      LASTC = 0\n      IF( TAU.NE.ZERO ) THEN\n*     Set up variables for scanning V.  LASTV begins pointing to the end\n*     of V.\n         IF( APPLYLEFT ) THEN\n            LASTV = M\n         ELSE\n            LASTV = N\n         END IF\n         IF( INCV.GT.0 ) THEN\n            I = 1 + (LASTV-1) * INCV\n         ELSE\n            I = 1\n         END IF\n*     Look for the last non-zero row in V.\n         DO WHILE( LASTV.GT.0 .AND. V( I ).EQ.ZERO )\n            LASTV = LASTV - 1\n            I = I - INCV\n         END DO\n         IF( APPLYLEFT ) THEN\n*     Scan for the last non-zero column in C(1:lastv,:).\n            LASTC = ILAZLC(LASTV, N, C, LDC)\n         ELSE\n*     Scan for the last non-zero row in C(:,1:lastv).\n            LASTC = ILAZLR(M, LASTV, C, LDC)\n         END IF\n      END IF\n*     Note that lastc.eq.0 renders the BLAS operations null; no special\n*     case is needed at this level.\n      IF( APPLYLEFT ) THEN\n*\n*        Form  H * C\n*\n         IF( LASTV.GT.0 ) THEN\n*\n*           w(1:lastc,1) := C(1:lastv,1:lastc)**H * v(1:lastv,1)\n*\n            CALL ZGEMV( 'Conjugate transpose', LASTV, LASTC, ONE,\n     $           C, LDC, V, INCV, ZERO, WORK, 1 )\n*\n*           C(1:lastv,1:lastc) := C(...) - v(1:lastv,1) * w(1:lastc,1)**H\n*\n            CALL ZGERC( LASTV, LASTC, -TAU, V, INCV, WORK, 1, C, LDC )\n         END IF\n      ELSE\n*\n*        Form  C * H\n*\n         IF( LASTV.GT.0 ) THEN\n*\n*           w(1:lastc,1) := C(1:lastc,1:lastv) * v(1:lastv,1)\n*\n            CALL ZGEMV( 'No transpose', LASTC, LASTV, ONE, C, LDC,\n     $           V, INCV, ZERO, WORK, 1 )\n*\n*           C(1:lastc,1:lastv) := C(...) - w(1:lastc,1) * v(1:lastv,1)**H\n*\n            CALL ZGERC( LASTC, LASTV, -TAU, WORK, 1, V, INCV, C, LDC )\n         END IF\n      END IF\n      RETURN\n*\n*     End of ZLARF\n*\n      END\n"
  },
  {
    "path": "libs/eigen/lapack/zlarfb.f",
    "content": "*> \\brief \\b ZLARFB\n*\n*  =========== DOCUMENTATION ===========\n*\n* Online html documentation available at \n*            http://www.netlib.org/lapack/explore-html/ \n*\n*> \\htmlonly\n*> Download ZLARFB + dependencies \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zlarfb.f\"> \n*> [TGZ]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zlarfb.f\"> \n*> [ZIP]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zlarfb.f\"> \n*> [TXT]</a>\n*> \\endhtmlonly \n*\n*  Definition:\n*  ===========\n*\n*       SUBROUTINE ZLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV,\n*                          T, LDT, C, LDC, WORK, LDWORK )\n* \n*       .. Scalar Arguments ..\n*       CHARACTER          DIRECT, SIDE, STOREV, TRANS\n*       INTEGER            K, LDC, LDT, LDV, LDWORK, M, N\n*       ..\n*       .. Array Arguments ..\n*       COMPLEX*16         C( LDC, * ), T( LDT, * ), V( LDV, * ),\n*      $                   WORK( LDWORK, * )\n*       ..\n*  \n*\n*> \\par Purpose:\n*  =============\n*>\n*> \\verbatim\n*>\n*> ZLARFB applies a complex block reflector H or its transpose H**H to a\n*> complex M-by-N matrix C, from either the left or the right.\n*> \\endverbatim\n*\n*  Arguments:\n*  ==========\n*\n*> \\param[in] SIDE\n*> \\verbatim\n*>          SIDE is CHARACTER*1\n*>          = 'L': apply H or H**H from the Left\n*>          = 'R': apply H or H**H from the Right\n*> \\endverbatim\n*>\n*> \\param[in] TRANS\n*> \\verbatim\n*>          TRANS is CHARACTER*1\n*>          = 'N': apply H (No transpose)\n*>          = 'C': apply H**H (Conjugate transpose)\n*> \\endverbatim\n*>\n*> \\param[in] DIRECT\n*> \\verbatim\n*>          DIRECT is CHARACTER*1\n*>          Indicates how H is formed from a product of elementary\n*>          reflectors\n*>          = 'F': H = H(1) H(2) . . . H(k) (Forward)\n*>          = 'B': H = H(k) . . . H(2) H(1) (Backward)\n*> \\endverbatim\n*>\n*> \\param[in] STOREV\n*> \\verbatim\n*>          STOREV is CHARACTER*1\n*>          Indicates how the vectors which define the elementary\n*>          reflectors are stored:\n*>          = 'C': Columnwise\n*>          = 'R': Rowwise\n*> \\endverbatim\n*>\n*> \\param[in] M\n*> \\verbatim\n*>          M is INTEGER\n*>          The number of rows of the matrix C.\n*> \\endverbatim\n*>\n*> \\param[in] N\n*> \\verbatim\n*>          N is INTEGER\n*>          The number of columns of the matrix C.\n*> \\endverbatim\n*>\n*> \\param[in] K\n*> \\verbatim\n*>          K is INTEGER\n*>          The order of the matrix T (= the number of elementary\n*>          reflectors whose product defines the block reflector).\n*> \\endverbatim\n*>\n*> \\param[in] V\n*> \\verbatim\n*>          V is COMPLEX*16 array, dimension\n*>                                (LDV,K) if STOREV = 'C'\n*>                                (LDV,M) if STOREV = 'R' and SIDE = 'L'\n*>                                (LDV,N) if STOREV = 'R' and SIDE = 'R'\n*>          See Further Details.\n*> \\endverbatim\n*>\n*> \\param[in] LDV\n*> \\verbatim\n*>          LDV is INTEGER\n*>          The leading dimension of the array V.\n*>          If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M);\n*>          if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N);\n*>          if STOREV = 'R', LDV >= K.\n*> \\endverbatim\n*>\n*> \\param[in] T\n*> \\verbatim\n*>          T is COMPLEX*16 array, dimension (LDT,K)\n*>          The triangular K-by-K matrix T in the representation of the\n*>          block reflector.\n*> \\endverbatim\n*>\n*> \\param[in] LDT\n*> \\verbatim\n*>          LDT is INTEGER\n*>          The leading dimension of the array T. LDT >= K.\n*> \\endverbatim\n*>\n*> \\param[in,out] C\n*> \\verbatim\n*>          C is COMPLEX*16 array, dimension (LDC,N)\n*>          On entry, the M-by-N matrix C.\n*>          On exit, C is overwritten by H*C or H**H*C or C*H or C*H**H.\n*> \\endverbatim\n*>\n*> \\param[in] LDC\n*> \\verbatim\n*>          LDC is INTEGER\n*>          The leading dimension of the array C. LDC >= max(1,M).\n*> \\endverbatim\n*>\n*> \\param[out] WORK\n*> \\verbatim\n*>          WORK is COMPLEX*16 array, dimension (LDWORK,K)\n*> \\endverbatim\n*>\n*> \\param[in] LDWORK\n*> \\verbatim\n*>          LDWORK is INTEGER\n*>          The leading dimension of the array WORK.\n*>          If SIDE = 'L', LDWORK >= max(1,N);\n*>          if SIDE = 'R', LDWORK >= max(1,M).\n*> \\endverbatim\n*\n*  Authors:\n*  ========\n*\n*> \\author Univ. of Tennessee \n*> \\author Univ. of California Berkeley \n*> \\author Univ. of Colorado Denver \n*> \\author NAG Ltd. \n*\n*> \\date November 2011\n*\n*> \\ingroup complex16OTHERauxiliary\n*\n*> \\par Further Details:\n*  =====================\n*>\n*> \\verbatim\n*>\n*>  The shape of the matrix V and the storage of the vectors which define\n*>  the H(i) is best illustrated by the following example with n = 5 and\n*>  k = 3. The elements equal to 1 are not stored; the corresponding\n*>  array elements are modified but restored on exit. The rest of the\n*>  array is not used.\n*>\n*>  DIRECT = 'F' and STOREV = 'C':         DIRECT = 'F' and STOREV = 'R':\n*>\n*>               V = (  1       )                 V = (  1 v1 v1 v1 v1 )\n*>                   ( v1  1    )                     (     1 v2 v2 v2 )\n*>                   ( v1 v2  1 )                     (        1 v3 v3 )\n*>                   ( v1 v2 v3 )\n*>                   ( v1 v2 v3 )\n*>\n*>  DIRECT = 'B' and STOREV = 'C':         DIRECT = 'B' and STOREV = 'R':\n*>\n*>               V = ( v1 v2 v3 )                 V = ( v1 v1  1       )\n*>                   ( v1 v2 v3 )                     ( v2 v2 v2  1    )\n*>                   (  1 v2 v3 )                     ( v3 v3 v3 v3  1 )\n*>                   (     1 v3 )\n*>                   (        1 )\n*> \\endverbatim\n*>\n*  =====================================================================\n      SUBROUTINE ZLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV,\n     $                   T, LDT, C, LDC, WORK, LDWORK )\n*\n*  -- LAPACK auxiliary routine (version 3.4.0) --\n*  -- LAPACK is a software package provided by Univ. of Tennessee,    --\n*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--\n*     November 2011\n*\n*     .. Scalar Arguments ..\n      CHARACTER          DIRECT, SIDE, STOREV, TRANS\n      INTEGER            K, LDC, LDT, LDV, LDWORK, M, N\n*     ..\n*     .. Array Arguments ..\n      COMPLEX*16         C( LDC, * ), T( LDT, * ), V( LDV, * ),\n     $                   WORK( LDWORK, * )\n*     ..\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      COMPLEX*16         ONE\n      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ) )\n*     ..\n*     .. Local Scalars ..\n      CHARACTER          TRANST\n      INTEGER            I, J, LASTV, LASTC\n*     ..\n*     .. External Functions ..\n      LOGICAL            LSAME\n      INTEGER            ILAZLR, ILAZLC\n      EXTERNAL           LSAME, ILAZLR, ILAZLC\n*     ..\n*     .. External Subroutines ..\n      EXTERNAL           ZCOPY, ZGEMM, ZLACGV, ZTRMM\n*     ..\n*     .. Intrinsic Functions ..\n      INTRINSIC          DCONJG\n*     ..\n*     .. Executable Statements ..\n*\n*     Quick return if possible\n*\n      IF( M.LE.0 .OR. N.LE.0 )\n     $   RETURN\n*\n      IF( LSAME( TRANS, 'N' ) ) THEN\n         TRANST = 'C'\n      ELSE\n         TRANST = 'N'\n      END IF\n*\n      IF( LSAME( STOREV, 'C' ) ) THEN\n*\n         IF( LSAME( DIRECT, 'F' ) ) THEN\n*\n*           Let  V =  ( V1 )    (first K rows)\n*                     ( V2 )\n*           where  V1  is unit lower triangular.\n*\n            IF( LSAME( SIDE, 'L' ) ) THEN\n*\n*              Form  H * C  or  H**H * C  where  C = ( C1 )\n*                                                    ( C2 )\n*\n               LASTV = MAX( K, ILAZLR( M, K, V, LDV ) )\n               LASTC = ILAZLC( LASTV, N, C, LDC )\n*\n*              W := C**H * V  =  (C1**H * V1 + C2**H * V2)  (stored in WORK)\n*\n*              W := C1**H\n*\n               DO 10 J = 1, K\n                  CALL ZCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 )\n                  CALL ZLACGV( LASTC, WORK( 1, J ), 1 )\n   10          CONTINUE\n*\n*              W := W * V1\n*\n               CALL ZTRMM( 'Right', 'Lower', 'No transpose', 'Unit',\n     $              LASTC, K, ONE, V, LDV, WORK, LDWORK )\n               IF( LASTV.GT.K ) THEN\n*\n*                 W := W + C2**H *V2\n*\n                  CALL ZGEMM( 'Conjugate transpose', 'No transpose',\n     $                 LASTC, K, LASTV-K, ONE, C( K+1, 1 ), LDC,\n     $                 V( K+1, 1 ), LDV, ONE, WORK, LDWORK )\n               END IF\n*\n*              W := W * T**H  or  W * T\n*\n               CALL ZTRMM( 'Right', 'Upper', TRANST, 'Non-unit',\n     $              LASTC, K, ONE, T, LDT, WORK, LDWORK )\n*\n*              C := C - V * W**H\n*\n               IF( M.GT.K ) THEN\n*\n*                 C2 := C2 - V2 * W**H\n*\n                  CALL ZGEMM( 'No transpose', 'Conjugate transpose',\n     $                 LASTV-K, LASTC, K,\n     $                 -ONE, V( K+1, 1 ), LDV, WORK, LDWORK,\n     $                 ONE, C( K+1, 1 ), LDC )\n               END IF\n*\n*              W := W * V1**H\n*\n               CALL ZTRMM( 'Right', 'Lower', 'Conjugate transpose',\n     $              'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK )\n*\n*              C1 := C1 - W**H\n*\n               DO 30 J = 1, K\n                  DO 20 I = 1, LASTC\n                     C( J, I ) = C( J, I ) - DCONJG( WORK( I, J ) )\n   20             CONTINUE\n   30          CONTINUE\n*\n            ELSE IF( LSAME( SIDE, 'R' ) ) THEN\n*\n*              Form  C * H  or  C * H**H  where  C = ( C1  C2 )\n*\n               LASTV = MAX( K, ILAZLR( N, K, V, LDV ) )\n               LASTC = ILAZLR( M, LASTV, C, LDC )\n*\n*              W := C * V  =  (C1*V1 + C2*V2)  (stored in WORK)\n*\n*              W := C1\n*\n               DO 40 J = 1, K\n                  CALL ZCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 )\n   40          CONTINUE\n*\n*              W := W * V1\n*\n               CALL ZTRMM( 'Right', 'Lower', 'No transpose', 'Unit',\n     $              LASTC, K, ONE, V, LDV, WORK, LDWORK )\n               IF( LASTV.GT.K ) THEN\n*\n*                 W := W + C2 * V2\n*\n                  CALL ZGEMM( 'No transpose', 'No transpose',\n     $                 LASTC, K, LASTV-K,\n     $                 ONE, C( 1, K+1 ), LDC, V( K+1, 1 ), LDV,\n     $                 ONE, WORK, LDWORK )\n               END IF\n*\n*              W := W * T  or  W * T**H\n*\n               CALL ZTRMM( 'Right', 'Upper', TRANS, 'Non-unit',\n     $              LASTC, K, ONE, T, LDT, WORK, LDWORK )\n*\n*              C := C - W * V**H\n*\n               IF( LASTV.GT.K ) THEN\n*\n*                 C2 := C2 - W * V2**H\n*\n                  CALL ZGEMM( 'No transpose', 'Conjugate transpose',\n     $                 LASTC, LASTV-K, K,\n     $                 -ONE, WORK, LDWORK, V( K+1, 1 ), LDV,\n     $                 ONE, C( 1, K+1 ), LDC )\n               END IF\n*\n*              W := W * V1**H\n*\n               CALL ZTRMM( 'Right', 'Lower', 'Conjugate transpose',\n     $              'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK )\n*\n*              C1 := C1 - W\n*\n               DO 60 J = 1, K\n                  DO 50 I = 1, LASTC\n                     C( I, J ) = C( I, J ) - WORK( I, J )\n   50             CONTINUE\n   60          CONTINUE\n            END IF\n*\n         ELSE\n*\n*           Let  V =  ( V1 )\n*                     ( V2 )    (last K rows)\n*           where  V2  is unit upper triangular.\n*\n            IF( LSAME( SIDE, 'L' ) ) THEN\n*\n*              Form  H * C  or  H**H * C  where  C = ( C1 )\n*                                                    ( C2 )\n*\n               LASTV = MAX( K, ILAZLR( M, K, V, LDV ) )\n               LASTC = ILAZLC( LASTV, N, C, LDC )\n*\n*              W := C**H * V  =  (C1**H * V1 + C2**H * V2)  (stored in WORK)\n*\n*              W := C2**H\n*\n               DO 70 J = 1, K\n                  CALL ZCOPY( LASTC, C( LASTV-K+J, 1 ), LDC,\n     $                 WORK( 1, J ), 1 )\n                  CALL ZLACGV( LASTC, WORK( 1, J ), 1 )\n   70          CONTINUE\n*\n*              W := W * V2\n*\n               CALL ZTRMM( 'Right', 'Upper', 'No transpose', 'Unit',\n     $              LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV,\n     $              WORK, LDWORK )\n               IF( LASTV.GT.K ) THEN\n*\n*                 W := W + C1**H*V1\n*\n                  CALL ZGEMM( 'Conjugate transpose', 'No transpose',\n     $                 LASTC, K, LASTV-K,\n     $                 ONE, C, LDC, V, LDV,\n     $                 ONE, WORK, LDWORK )\n               END IF\n*\n*              W := W * T**H  or  W * T\n*\n               CALL ZTRMM( 'Right', 'Lower', TRANST, 'Non-unit',\n     $              LASTC, K, ONE, T, LDT, WORK, LDWORK )\n*\n*              C := C - V * W**H\n*\n               IF( LASTV.GT.K ) THEN\n*\n*                 C1 := C1 - V1 * W**H\n*\n                  CALL ZGEMM( 'No transpose', 'Conjugate transpose',\n     $                 LASTV-K, LASTC, K,\n     $                 -ONE, V, LDV, WORK, LDWORK,\n     $                 ONE, C, LDC )\n               END IF\n*\n*              W := W * V2**H\n*\n               CALL ZTRMM( 'Right', 'Upper', 'Conjugate transpose',\n     $              'Unit', LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV,\n     $              WORK, LDWORK )\n*\n*              C2 := C2 - W**H\n*\n               DO 90 J = 1, K\n                  DO 80 I = 1, LASTC\n                     C( LASTV-K+J, I ) = C( LASTV-K+J, I ) -\n     $                               DCONJG( WORK( I, J ) )\n   80             CONTINUE\n   90          CONTINUE\n*\n            ELSE IF( LSAME( SIDE, 'R' ) ) THEN\n*\n*              Form  C * H  or  C * H**H  where  C = ( C1  C2 )\n*\n               LASTV = MAX( K, ILAZLR( N, K, V, LDV ) )\n               LASTC = ILAZLR( M, LASTV, C, LDC )\n*\n*              W := C * V  =  (C1*V1 + C2*V2)  (stored in WORK)\n*\n*              W := C2\n*\n               DO 100 J = 1, K\n                  CALL ZCOPY( LASTC, C( 1, LASTV-K+J ), 1,\n     $                 WORK( 1, J ), 1 )\n  100          CONTINUE\n*\n*              W := W * V2\n*\n               CALL ZTRMM( 'Right', 'Upper', 'No transpose', 'Unit',\n     $              LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV,\n     $              WORK, LDWORK )\n               IF( LASTV.GT.K ) THEN\n*\n*                 W := W + C1 * V1\n*\n                  CALL ZGEMM( 'No transpose', 'No transpose',\n     $                 LASTC, K, LASTV-K,\n     $                 ONE, C, LDC, V, LDV, ONE, WORK, LDWORK )\n               END IF\n*\n*              W := W * T  or  W * T**H\n*\n               CALL ZTRMM( 'Right', 'Lower', TRANS, 'Non-unit',\n     $              LASTC, K, ONE, T, LDT, WORK, LDWORK )\n*\n*              C := C - W * V**H\n*\n               IF( LASTV.GT.K ) THEN\n*\n*                 C1 := C1 - W * V1**H\n*\n                  CALL ZGEMM( 'No transpose', 'Conjugate transpose',\n     $                 LASTC, LASTV-K, K, -ONE, WORK, LDWORK, V, LDV,\n     $                 ONE, C, LDC )\n               END IF\n*\n*              W := W * V2**H\n*\n               CALL ZTRMM( 'Right', 'Upper', 'Conjugate transpose',\n     $              'Unit', LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV,\n     $              WORK, LDWORK )\n*\n*              C2 := C2 - W\n*\n               DO 120 J = 1, K\n                  DO 110 I = 1, LASTC\n                     C( I, LASTV-K+J ) = C( I, LASTV-K+J )\n     $                    - WORK( I, J )\n  110             CONTINUE\n  120          CONTINUE\n            END IF\n         END IF\n*\n      ELSE IF( LSAME( STOREV, 'R' ) ) THEN\n*\n         IF( LSAME( DIRECT, 'F' ) ) THEN\n*\n*           Let  V =  ( V1  V2 )    (V1: first K columns)\n*           where  V1  is unit upper triangular.\n*\n            IF( LSAME( SIDE, 'L' ) ) THEN\n*\n*              Form  H * C  or  H**H * C  where  C = ( C1 )\n*                                                    ( C2 )\n*\n               LASTV = MAX( K, ILAZLC( K, M, V, LDV ) )\n               LASTC = ILAZLC( LASTV, N, C, LDC )\n*\n*              W := C**H * V**H  =  (C1**H * V1**H + C2**H * V2**H) (stored in WORK)\n*\n*              W := C1**H\n*\n               DO 130 J = 1, K\n                  CALL ZCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 )\n                  CALL ZLACGV( LASTC, WORK( 1, J ), 1 )\n  130          CONTINUE\n*\n*              W := W * V1**H\n*\n               CALL ZTRMM( 'Right', 'Upper', 'Conjugate transpose',\n     $                     'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK )\n               IF( LASTV.GT.K ) THEN\n*\n*                 W := W + C2**H*V2**H\n*\n                  CALL ZGEMM( 'Conjugate transpose',\n     $                 'Conjugate transpose', LASTC, K, LASTV-K,\n     $                 ONE, C( K+1, 1 ), LDC, V( 1, K+1 ), LDV,\n     $                 ONE, WORK, LDWORK )\n               END IF\n*\n*              W := W * T**H  or  W * T\n*\n               CALL ZTRMM( 'Right', 'Upper', TRANST, 'Non-unit',\n     $              LASTC, K, ONE, T, LDT, WORK, LDWORK )\n*\n*              C := C - V**H * W**H\n*\n               IF( LASTV.GT.K ) THEN\n*\n*                 C2 := C2 - V2**H * W**H\n*\n                  CALL ZGEMM( 'Conjugate transpose',\n     $                 'Conjugate transpose', LASTV-K, LASTC, K,\n     $                 -ONE, V( 1, K+1 ), LDV, WORK, LDWORK,\n     $                 ONE, C( K+1, 1 ), LDC )\n               END IF\n*\n*              W := W * V1\n*\n               CALL ZTRMM( 'Right', 'Upper', 'No transpose', 'Unit',\n     $              LASTC, K, ONE, V, LDV, WORK, LDWORK )\n*\n*              C1 := C1 - W**H\n*\n               DO 150 J = 1, K\n                  DO 140 I = 1, LASTC\n                     C( J, I ) = C( J, I ) - DCONJG( WORK( I, J ) )\n  140             CONTINUE\n  150          CONTINUE\n*\n            ELSE IF( LSAME( SIDE, 'R' ) ) THEN\n*\n*              Form  C * H  or  C * H**H  where  C = ( C1  C2 )\n*\n               LASTV = MAX( K, ILAZLC( K, N, V, LDV ) )\n               LASTC = ILAZLR( M, LASTV, C, LDC )\n*\n*              W := C * V**H  =  (C1*V1**H + C2*V2**H)  (stored in WORK)\n*\n*              W := C1\n*\n               DO 160 J = 1, K\n                  CALL ZCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 )\n  160          CONTINUE\n*\n*              W := W * V1**H\n*\n               CALL ZTRMM( 'Right', 'Upper', 'Conjugate transpose',\n     $                     'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK )\n               IF( LASTV.GT.K ) THEN\n*\n*                 W := W + C2 * V2**H\n*\n                  CALL ZGEMM( 'No transpose', 'Conjugate transpose',\n     $                 LASTC, K, LASTV-K, ONE, C( 1, K+1 ), LDC,\n     $                 V( 1, K+1 ), LDV, ONE, WORK, LDWORK )\n               END IF\n*\n*              W := W * T  or  W * T**H\n*\n               CALL ZTRMM( 'Right', 'Upper', TRANS, 'Non-unit',\n     $              LASTC, K, ONE, T, LDT, WORK, LDWORK )\n*\n*              C := C - W * V\n*\n               IF( LASTV.GT.K ) THEN\n*\n*                 C2 := C2 - W * V2\n*\n                  CALL ZGEMM( 'No transpose', 'No transpose',\n     $                 LASTC, LASTV-K, K,\n     $                 -ONE, WORK, LDWORK, V( 1, K+1 ), LDV,\n     $                 ONE, C( 1, K+1 ), LDC )\n               END IF\n*\n*              W := W * V1\n*\n               CALL ZTRMM( 'Right', 'Upper', 'No transpose', 'Unit',\n     $              LASTC, K, ONE, V, LDV, WORK, LDWORK )\n*\n*              C1 := C1 - W\n*\n               DO 180 J = 1, K\n                  DO 170 I = 1, LASTC\n                     C( I, J ) = C( I, J ) - WORK( I, J )\n  170             CONTINUE\n  180          CONTINUE\n*\n            END IF\n*\n         ELSE\n*\n*           Let  V =  ( V1  V2 )    (V2: last K columns)\n*           where  V2  is unit lower triangular.\n*\n            IF( LSAME( SIDE, 'L' ) ) THEN\n*\n*              Form  H * C  or  H**H * C  where  C = ( C1 )\n*                                                    ( C2 )\n*\n               LASTV = MAX( K, ILAZLC( K, M, V, LDV ) )\n               LASTC = ILAZLC( LASTV, N, C, LDC )\n*\n*              W := C**H * V**H  =  (C1**H * V1**H + C2**H * V2**H) (stored in WORK)\n*\n*              W := C2**H\n*\n               DO 190 J = 1, K\n                  CALL ZCOPY( LASTC, C( LASTV-K+J, 1 ), LDC,\n     $                 WORK( 1, J ), 1 )\n                  CALL ZLACGV( LASTC, WORK( 1, J ), 1 )\n  190          CONTINUE\n*\n*              W := W * V2**H\n*\n               CALL ZTRMM( 'Right', 'Lower', 'Conjugate transpose',\n     $              'Unit', LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV,\n     $              WORK, LDWORK )\n               IF( LASTV.GT.K ) THEN\n*\n*                 W := W + C1**H * V1**H\n*\n                  CALL ZGEMM( 'Conjugate transpose',\n     $                 'Conjugate transpose', LASTC, K, LASTV-K,\n     $                 ONE, C, LDC, V, LDV, ONE, WORK, LDWORK )\n               END IF\n*\n*              W := W * T**H  or  W * T\n*\n               CALL ZTRMM( 'Right', 'Lower', TRANST, 'Non-unit',\n     $              LASTC, K, ONE, T, LDT, WORK, LDWORK )\n*\n*              C := C - V**H * W**H\n*\n               IF( LASTV.GT.K ) THEN\n*\n*                 C1 := C1 - V1**H * W**H\n*\n                  CALL ZGEMM( 'Conjugate transpose',\n     $                 'Conjugate transpose', LASTV-K, LASTC, K,\n     $                 -ONE, V, LDV, WORK, LDWORK, ONE, C, LDC )\n               END IF\n*\n*              W := W * V2\n*\n               CALL ZTRMM( 'Right', 'Lower', 'No transpose', 'Unit',\n     $              LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV,\n     $              WORK, LDWORK )\n*\n*              C2 := C2 - W**H\n*\n               DO 210 J = 1, K\n                  DO 200 I = 1, LASTC\n                     C( LASTV-K+J, I ) = C( LASTV-K+J, I ) -\n     $                               DCONJG( WORK( I, J ) )\n  200             CONTINUE\n  210          CONTINUE\n*\n            ELSE IF( LSAME( SIDE, 'R' ) ) THEN\n*\n*              Form  C * H  or  C * H**H  where  C = ( C1  C2 )\n*\n               LASTV = MAX( K, ILAZLC( K, N, V, LDV ) )\n               LASTC = ILAZLR( M, LASTV, C, LDC )\n*\n*              W := C * V**H  =  (C1*V1**H + C2*V2**H)  (stored in WORK)\n*\n*              W := C2\n*\n               DO 220 J = 1, K\n                  CALL ZCOPY( LASTC, C( 1, LASTV-K+J ), 1,\n     $                 WORK( 1, J ), 1 )\n  220          CONTINUE\n*\n*              W := W * V2**H\n*\n               CALL ZTRMM( 'Right', 'Lower', 'Conjugate transpose',\n     $              'Unit', LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV,\n     $              WORK, LDWORK )\n               IF( LASTV.GT.K ) THEN\n*\n*                 W := W + C1 * V1**H\n*\n                  CALL ZGEMM( 'No transpose', 'Conjugate transpose',\n     $                 LASTC, K, LASTV-K, ONE, C, LDC, V, LDV, ONE,\n     $                 WORK, LDWORK )\n               END IF\n*\n*              W := W * T  or  W * T**H\n*\n               CALL ZTRMM( 'Right', 'Lower', TRANS, 'Non-unit',\n     $              LASTC, K, ONE, T, LDT, WORK, LDWORK )\n*\n*              C := C - W * V\n*\n               IF( LASTV.GT.K ) THEN\n*\n*                 C1 := C1 - W * V1\n*\n                  CALL ZGEMM( 'No transpose', 'No transpose',\n     $                 LASTC, LASTV-K, K, -ONE, WORK, LDWORK, V, LDV,\n     $                 ONE, C, LDC )\n               END IF\n*\n*              W := W * V2\n*\n               CALL ZTRMM( 'Right', 'Lower', 'No transpose', 'Unit',\n     $              LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV,\n     $              WORK, LDWORK )\n*\n*              C1 := C1 - W\n*\n               DO 240 J = 1, K\n                  DO 230 I = 1, LASTC\n                     C( I, LASTV-K+J ) = C( I, LASTV-K+J )\n     $                    - WORK( I, J )\n  230             CONTINUE\n  240          CONTINUE\n*\n            END IF\n*\n         END IF\n      END IF\n*\n      RETURN\n*\n*     End of ZLARFB\n*\n      END\n"
  },
  {
    "path": "libs/eigen/lapack/zlarfg.f",
    "content": "*> \\brief \\b ZLARFG\n*\n*  =========== DOCUMENTATION ===========\n*\n* Online html documentation available at \n*            http://www.netlib.org/lapack/explore-html/ \n*\n*> \\htmlonly\n*> Download ZLARFG + dependencies \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zlarfg.f\"> \n*> [TGZ]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zlarfg.f\"> \n*> [ZIP]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zlarfg.f\"> \n*> [TXT]</a>\n*> \\endhtmlonly \n*\n*  Definition:\n*  ===========\n*\n*       SUBROUTINE ZLARFG( N, ALPHA, X, INCX, TAU )\n* \n*       .. Scalar Arguments ..\n*       INTEGER            INCX, N\n*       COMPLEX*16         ALPHA, TAU\n*       ..\n*       .. Array Arguments ..\n*       COMPLEX*16         X( * )\n*       ..\n*  \n*\n*> \\par Purpose:\n*  =============\n*>\n*> \\verbatim\n*>\n*> ZLARFG generates a complex elementary reflector H of order n, such\n*> that\n*>\n*>       H**H * ( alpha ) = ( beta ),   H**H * H = I.\n*>              (   x   )   (   0  )\n*>\n*> where alpha and beta are scalars, with beta real, and x is an\n*> (n-1)-element complex vector. H is represented in the form\n*>\n*>       H = I - tau * ( 1 ) * ( 1 v**H ) ,\n*>                     ( v )\n*>\n*> where tau is a complex scalar and v is a complex (n-1)-element\n*> vector. Note that H is not hermitian.\n*>\n*> If the elements of x are all zero and alpha is real, then tau = 0\n*> and H is taken to be the unit matrix.\n*>\n*> Otherwise  1 <= real(tau) <= 2  and  abs(tau-1) <= 1 .\n*> \\endverbatim\n*\n*  Arguments:\n*  ==========\n*\n*> \\param[in] N\n*> \\verbatim\n*>          N is INTEGER\n*>          The order of the elementary reflector.\n*> \\endverbatim\n*>\n*> \\param[in,out] ALPHA\n*> \\verbatim\n*>          ALPHA is COMPLEX*16\n*>          On entry, the value alpha.\n*>          On exit, it is overwritten with the value beta.\n*> \\endverbatim\n*>\n*> \\param[in,out] X\n*> \\verbatim\n*>          X is COMPLEX*16 array, dimension\n*>                         (1+(N-2)*abs(INCX))\n*>          On entry, the vector x.\n*>          On exit, it is overwritten with the vector v.\n*> \\endverbatim\n*>\n*> \\param[in] INCX\n*> \\verbatim\n*>          INCX is INTEGER\n*>          The increment between elements of X. INCX > 0.\n*> \\endverbatim\n*>\n*> \\param[out] TAU\n*> \\verbatim\n*>          TAU is COMPLEX*16\n*>          The value tau.\n*> \\endverbatim\n*\n*  Authors:\n*  ========\n*\n*> \\author Univ. of Tennessee \n*> \\author Univ. of California Berkeley \n*> \\author Univ. of Colorado Denver \n*> \\author NAG Ltd. \n*\n*> \\date November 2011\n*\n*> \\ingroup complex16OTHERauxiliary\n*\n*  =====================================================================\n      SUBROUTINE ZLARFG( N, ALPHA, X, INCX, TAU )\n*\n*  -- LAPACK auxiliary routine (version 3.4.0) --\n*  -- LAPACK is a software package provided by Univ. of Tennessee,    --\n*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--\n*     November 2011\n*\n*     .. Scalar Arguments ..\n      INTEGER            INCX, N\n      COMPLEX*16         ALPHA, TAU\n*     ..\n*     .. Array Arguments ..\n      COMPLEX*16         X( * )\n*     ..\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      DOUBLE PRECISION   ONE, ZERO\n      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )\n*     ..\n*     .. Local Scalars ..\n      INTEGER            J, KNT\n      DOUBLE PRECISION   ALPHI, ALPHR, BETA, RSAFMN, SAFMIN, XNORM\n*     ..\n*     .. External Functions ..\n      DOUBLE PRECISION   DLAMCH, DLAPY3, DZNRM2\n      COMPLEX*16         ZLADIV\n      EXTERNAL           DLAMCH, DLAPY3, DZNRM2, ZLADIV\n*     ..\n*     .. Intrinsic Functions ..\n      INTRINSIC          ABS, DBLE, DCMPLX, DIMAG, SIGN\n*     ..\n*     .. External Subroutines ..\n      EXTERNAL           ZDSCAL, ZSCAL\n*     ..\n*     .. Executable Statements ..\n*\n      IF( N.LE.0 ) THEN\n         TAU = ZERO\n         RETURN\n      END IF\n*\n      XNORM = DZNRM2( N-1, X, INCX )\n      ALPHR = DBLE( ALPHA )\n      ALPHI = DIMAG( ALPHA )\n*\n      IF( XNORM.EQ.ZERO .AND. ALPHI.EQ.ZERO ) THEN\n*\n*        H  =  I\n*\n         TAU = ZERO\n      ELSE\n*\n*        general case\n*\n         BETA = -SIGN( DLAPY3( ALPHR, ALPHI, XNORM ), ALPHR )\n         SAFMIN = DLAMCH( 'S' ) / DLAMCH( 'E' )\n         RSAFMN = ONE / SAFMIN\n*\n         KNT = 0\n         IF( ABS( BETA ).LT.SAFMIN ) THEN\n*\n*           XNORM, BETA may be inaccurate; scale X and recompute them\n*\n   10       CONTINUE\n            KNT = KNT + 1\n            CALL ZDSCAL( N-1, RSAFMN, X, INCX )\n            BETA = BETA*RSAFMN\n            ALPHI = ALPHI*RSAFMN\n            ALPHR = ALPHR*RSAFMN\n            IF( ABS( BETA ).LT.SAFMIN )\n     $         GO TO 10\n*\n*           New BETA is at most 1, at least SAFMIN\n*\n            XNORM = DZNRM2( N-1, X, INCX )\n            ALPHA = DCMPLX( ALPHR, ALPHI )\n            BETA = -SIGN( DLAPY3( ALPHR, ALPHI, XNORM ), ALPHR )\n         END IF\n         TAU = DCMPLX( ( BETA-ALPHR ) / BETA, -ALPHI / BETA )\n         ALPHA = ZLADIV( DCMPLX( ONE ), ALPHA-BETA )\n         CALL ZSCAL( N-1, ALPHA, X, INCX )\n*\n*        If ALPHA is subnormal, it may lose relative accuracy\n*\n         DO 20 J = 1, KNT\n            BETA = BETA*SAFMIN\n 20      CONTINUE\n         ALPHA = BETA\n      END IF\n*\n      RETURN\n*\n*     End of ZLARFG\n*\n      END\n"
  },
  {
    "path": "libs/eigen/lapack/zlarft.f",
    "content": "*> \\brief \\b ZLARFT\n*\n*  =========== DOCUMENTATION ===========\n*\n* Online html documentation available at \n*            http://www.netlib.org/lapack/explore-html/ \n*\n*> \\htmlonly\n*> Download ZLARFT + dependencies \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zlarft.f\"> \n*> [TGZ]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zlarft.f\"> \n*> [ZIP]</a> \n*> <a href=\"http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zlarft.f\"> \n*> [TXT]</a>\n*> \\endhtmlonly \n*\n*  Definition:\n*  ===========\n*\n*       SUBROUTINE ZLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT )\n* \n*       .. Scalar Arguments ..\n*       CHARACTER          DIRECT, STOREV\n*       INTEGER            K, LDT, LDV, N\n*       ..\n*       .. Array Arguments ..\n*       COMPLEX*16         T( LDT, * ), TAU( * ), V( LDV, * )\n*       ..\n*  \n*\n*> \\par Purpose:\n*  =============\n*>\n*> \\verbatim\n*>\n*> ZLARFT forms the triangular factor T of a complex block reflector H\n*> of order n, which is defined as a product of k elementary reflectors.\n*>\n*> If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular;\n*>\n*> If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular.\n*>\n*> If STOREV = 'C', the vector which defines the elementary reflector\n*> H(i) is stored in the i-th column of the array V, and\n*>\n*>    H  =  I - V * T * V**H\n*>\n*> If STOREV = 'R', the vector which defines the elementary reflector\n*> H(i) is stored in the i-th row of the array V, and\n*>\n*>    H  =  I - V**H * T * V\n*> \\endverbatim\n*\n*  Arguments:\n*  ==========\n*\n*> \\param[in] DIRECT\n*> \\verbatim\n*>          DIRECT is CHARACTER*1\n*>          Specifies the order in which the elementary reflectors are\n*>          multiplied to form the block reflector:\n*>          = 'F': H = H(1) H(2) . . . H(k) (Forward)\n*>          = 'B': H = H(k) . . . H(2) H(1) (Backward)\n*> \\endverbatim\n*>\n*> \\param[in] STOREV\n*> \\verbatim\n*>          STOREV is CHARACTER*1\n*>          Specifies how the vectors which define the elementary\n*>          reflectors are stored (see also Further Details):\n*>          = 'C': columnwise\n*>          = 'R': rowwise\n*> \\endverbatim\n*>\n*> \\param[in] N\n*> \\verbatim\n*>          N is INTEGER\n*>          The order of the block reflector H. N >= 0.\n*> \\endverbatim\n*>\n*> \\param[in] K\n*> \\verbatim\n*>          K is INTEGER\n*>          The order of the triangular factor T (= the number of\n*>          elementary reflectors). K >= 1.\n*> \\endverbatim\n*>\n*> \\param[in] V\n*> \\verbatim\n*>          V is COMPLEX*16 array, dimension\n*>                               (LDV,K) if STOREV = 'C'\n*>                               (LDV,N) if STOREV = 'R'\n*>          The matrix V. See further details.\n*> \\endverbatim\n*>\n*> \\param[in] LDV\n*> \\verbatim\n*>          LDV is INTEGER\n*>          The leading dimension of the array V.\n*>          If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K.\n*> \\endverbatim\n*>\n*> \\param[in] TAU\n*> \\verbatim\n*>          TAU is COMPLEX*16 array, dimension (K)\n*>          TAU(i) must contain the scalar factor of the elementary\n*>          reflector H(i).\n*> \\endverbatim\n*>\n*> \\param[out] T\n*> \\verbatim\n*>          T is COMPLEX*16 array, dimension (LDT,K)\n*>          The k by k triangular factor T of the block reflector.\n*>          If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is\n*>          lower triangular. The rest of the array is not used.\n*> \\endverbatim\n*>\n*> \\param[in] LDT\n*> \\verbatim\n*>          LDT is INTEGER\n*>          The leading dimension of the array T. LDT >= K.\n*> \\endverbatim\n*\n*  Authors:\n*  ========\n*\n*> \\author Univ. of Tennessee \n*> \\author Univ. of California Berkeley \n*> \\author Univ. of Colorado Denver \n*> \\author NAG Ltd. \n*\n*> \\date April 2012\n*\n*> \\ingroup complex16OTHERauxiliary\n*\n*> \\par Further Details:\n*  =====================\n*>\n*> \\verbatim\n*>\n*>  The shape of the matrix V and the storage of the vectors which define\n*>  the H(i) is best illustrated by the following example with n = 5 and\n*>  k = 3. The elements equal to 1 are not stored.\n*>\n*>  DIRECT = 'F' and STOREV = 'C':         DIRECT = 'F' and STOREV = 'R':\n*>\n*>               V = (  1       )                 V = (  1 v1 v1 v1 v1 )\n*>                   ( v1  1    )                     (     1 v2 v2 v2 )\n*>                   ( v1 v2  1 )                     (        1 v3 v3 )\n*>                   ( v1 v2 v3 )\n*>                   ( v1 v2 v3 )\n*>\n*>  DIRECT = 'B' and STOREV = 'C':         DIRECT = 'B' and STOREV = 'R':\n*>\n*>               V = ( v1 v2 v3 )                 V = ( v1 v1  1       )\n*>                   ( v1 v2 v3 )                     ( v2 v2 v2  1    )\n*>                   (  1 v2 v3 )                     ( v3 v3 v3 v3  1 )\n*>                   (     1 v3 )\n*>                   (        1 )\n*> \\endverbatim\n*>\n*  =====================================================================\n      SUBROUTINE ZLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT )\n*\n*  -- LAPACK auxiliary routine (version 3.4.1) --\n*  -- LAPACK is a software package provided by Univ. of Tennessee,    --\n*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--\n*     April 2012\n*\n*     .. Scalar Arguments ..\n      CHARACTER          DIRECT, STOREV\n      INTEGER            K, LDT, LDV, N\n*     ..\n*     .. Array Arguments ..\n      COMPLEX*16         T( LDT, * ), TAU( * ), V( LDV, * )\n*     ..\n*\n*  =====================================================================\n*\n*     .. Parameters ..\n      COMPLEX*16         ONE, ZERO\n      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ),\n     $                   ZERO = ( 0.0D+0, 0.0D+0 ) )\n*     ..\n*     .. Local Scalars ..\n      INTEGER            I, J, PREVLASTV, LASTV\n*     ..\n*     .. External Subroutines ..\n      EXTERNAL           ZGEMV, ZLACGV, ZTRMV\n*     ..\n*     .. External Functions ..\n      LOGICAL            LSAME\n      EXTERNAL           LSAME\n*     ..\n*     .. Executable Statements ..\n*\n*     Quick return if possible\n*\n      IF( N.EQ.0 )\n     $   RETURN\n*\n      IF( LSAME( DIRECT, 'F' ) ) THEN\n         PREVLASTV = N\n         DO I = 1, K\n            PREVLASTV = MAX( PREVLASTV, I )\n            IF( TAU( I ).EQ.ZERO ) THEN\n*\n*              H(i)  =  I\n*\n               DO J = 1, I\n                  T( J, I ) = ZERO\n               END DO\n            ELSE\n*\n*              general case\n*\n               IF( LSAME( STOREV, 'C' ) ) THEN\n*                 Skip any trailing zeros.\n                  DO LASTV = N, I+1, -1\n                     IF( V( LASTV, I ).NE.ZERO ) EXIT\n                  END DO\n                  DO J = 1, I-1\n                     T( J, I ) = -TAU( I ) * CONJG( V( I , J ) )\n                  END DO                     \n                  J = MIN( LASTV, PREVLASTV )\n*\n*                 T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)**H * V(i:j,i)\n*\n                  CALL ZGEMV( 'Conjugate transpose', J-I, I-1,\n     $                        -TAU( I ), V( I+1, 1 ), LDV, \n     $                        V( I+1, I ), 1, ONE, T( 1, I ), 1 )\n               ELSE\n*                 Skip any trailing zeros.\n                  DO LASTV = N, I+1, -1\n                     IF( V( I, LASTV ).NE.ZERO ) EXIT\n                  END DO\n                  DO J = 1, I-1\n                     T( J, I ) = -TAU( I ) * V( J , I )\n                  END DO                     \n                  J = MIN( LASTV, PREVLASTV )\n*\n*                 T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)**H\n*\n                  CALL ZGEMM( 'N', 'C', I-1, 1, J-I, -TAU( I ),\n     $                        V( 1, I+1 ), LDV, V( I, I+1 ), LDV,\n     $                        ONE, T( 1, I ), LDT )                  \n               END IF\n*\n*              T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i)\n*\n               CALL ZTRMV( 'Upper', 'No transpose', 'Non-unit', I-1, T,\n     $                     LDT, T( 1, I ), 1 )\n               T( I, I ) = TAU( I )\n               IF( I.GT.1 ) THEN\n                  PREVLASTV = MAX( PREVLASTV, LASTV )\n               ELSE\n                  PREVLASTV = LASTV\n               END IF\n             END IF\n         END DO\n      ELSE\n         PREVLASTV = 1\n         DO I = K, 1, -1\n            IF( TAU( I ).EQ.ZERO ) THEN\n*\n*              H(i)  =  I\n*\n               DO J = I, K\n                  T( J, I ) = ZERO\n               END DO\n            ELSE\n*\n*              general case\n*\n               IF( I.LT.K ) THEN\n                  IF( LSAME( STOREV, 'C' ) ) THEN\n*                    Skip any leading zeros.\n                     DO LASTV = 1, I-1\n                        IF( V( LASTV, I ).NE.ZERO ) EXIT\n                     END DO\n                     DO J = I+1, K\n                        T( J, I ) = -TAU( I ) * CONJG( V( N-K+I , J ) )\n                     END DO                        \n                     J = MAX( LASTV, PREVLASTV )\n*\n*                    T(i+1:k,i) = -tau(i) * V(j:n-k+i,i+1:k)**H * V(j:n-k+i,i)\n*\n                     CALL ZGEMV( 'Conjugate transpose', N-K+I-J, K-I,\n     $                           -TAU( I ), V( J, I+1 ), LDV, V( J, I ),\n     $                           1, ONE, T( I+1, I ), 1 )\n                  ELSE\n*                    Skip any leading zeros.\n                     DO LASTV = 1, I-1\n                        IF( V( I, LASTV ).NE.ZERO ) EXIT\n                     END DO\n                     DO J = I+1, K\n                        T( J, I ) = -TAU( I ) * V( J, N-K+I )\n                     END DO                                           \n                     J = MAX( LASTV, PREVLASTV )\n*\n*                    T(i+1:k,i) = -tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)**H\n*\n                     CALL ZGEMM( 'N', 'C', K-I, 1, N-K+I-J, -TAU( I ),\n     $                           V( I+1, J ), LDV, V( I, J ), LDV,\n     $                           ONE, T( I+1, I ), LDT )                     \n                  END IF\n*\n*                 T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i)\n*\n                  CALL ZTRMV( 'Lower', 'No transpose', 'Non-unit', K-I,\n     $                        T( I+1, I+1 ), LDT, T( I+1, I ), 1 )\n                  IF( I.GT.1 ) THEN\n                     PREVLASTV = MIN( PREVLASTV, LASTV )\n                  ELSE\n                     PREVLASTV = LASTV\n                  END IF\n               END IF\n               T( I, I ) = TAU( I )\n            END IF\n         END DO\n      END IF\n      RETURN\n*\n*     End of ZLARFT\n*\n      END\n"
  },
  {
    "path": "libs/eigen/scripts/CMakeLists.txt",
    "content": "get_property(EIGEN_TESTS_LIST GLOBAL PROPERTY EIGEN_TESTS_LIST)\nconfigure_file(buildtests.in ${CMAKE_BINARY_DIR}/buildtests.sh @ONLY)\n\nconfigure_file(check.in ${CMAKE_BINARY_DIR}/check.sh COPYONLY)\nconfigure_file(debug.in ${CMAKE_BINARY_DIR}/debug.sh COPYONLY)\nconfigure_file(release.in ${CMAKE_BINARY_DIR}/release.sh COPYONLY)\n"
  },
  {
    "path": "libs/eigen/scripts/cdashtesting.cmake.in",
    "content": "\nset(CTEST_SOURCE_DIRECTORY  \"@CMAKE_SOURCE_DIR@\")\nset(CTEST_BINARY_DIRECTORY  \"@CMAKE_BINARY_DIR@\")\nset(CTEST_CMAKE_GENERATOR   \"@CMAKE_GENERATOR@\")\nset(CTEST_BUILD_NAME        \"@BUILDNAME@\")\nset(CTEST_SITE              \"@SITE@\")\n\nset(MODEL Experimental)\nif(${CTEST_SCRIPT_ARG} MATCHES Nightly)\n  set(MODEL Nightly)\nelseif(${CTEST_SCRIPT_ARG} MATCHES Continuous)\n  set(MODEL Continuous)\nendif()\n\nfind_program(CTEST_HG_COMMAND NAMES hg)\nset(CTEST_UPDATE_COMMAND \"${CTEST_HG_COMMAND}\")\n\nctest_start(${MODEL} ${CTEST_SOURCE_DIRECTORY} ${CTEST_BINARY_DIRECTORY})\n\nctest_update(SOURCE \"${CTEST_SOURCE_DIRECTORY}\")\nctest_submit(PARTS Update Notes)\n\n# to get CTEST_PROJECT_SUBPROJECTS definition:\ninclude(\"${CTEST_SOURCE_DIRECTORY}/CTestConfig.cmake\")\n\nforeach(subproject ${CTEST_PROJECT_SUBPROJECTS})\n  message(\"\")\n  message(\"Process ${subproject}\")\n  \n  set_property(GLOBAL PROPERTY SubProject ${subproject})\n  set_property(GLOBAL PROPERTY Label ${subproject})\n\n  ctest_configure(BUILD ${CTEST_BINARY_DIRECTORY} SOURCE ${CTEST_SOURCE_DIRECTORY} )\n  ctest_submit(PARTS Configure)\n\n  set(CTEST_BUILD_TARGET \"Build${subproject}\")\n  message(\"Build ${CTEST_BUILD_TARGET}\")\n  ctest_build(BUILD \"${CTEST_BINARY_DIRECTORY}\" APPEND)\n  # builds target ${CTEST_BUILD_TARGET}\n  ctest_submit(PARTS Build)\n\n  ctest_test(BUILD \"${CTEST_BINARY_DIRECTORY}\" INCLUDE_LABEL \"${subproject}\" )\n  # runs only tests that have a LABELS property matching \"${subproject}\"\n  \n  ctest_coverage(BUILD \"${CTEST_BINARY_DIRECTORY}\" LABELS \"${subproject}\" )\n  \n  ctest_submit(PARTS Test)\n  \nendforeach()\n"
  },
  {
    "path": "libs/eigen/scripts/check.in",
    "content": "#!/bin/bash\n# check : shorthand for make and ctest -R\n\nif [[ $# != 1 || $1 == *help ]]\nthen\n  echo \"usage: ./check regexp\"\n  echo \"  Builds and runs tests matching the regexp.\"\n  echo \"  The EIGEN_MAKE_ARGS environment variable allows to pass args to 'make'.\"\n  echo \"    For example, to launch 5 concurrent builds, use EIGEN_MAKE_ARGS='-j5'\"\n  echo \"  The EIGEN_CTEST_ARGS environment variable allows to pass args to 'ctest'.\"\n  echo \"    For example, with CTest 2.8, you can use EIGEN_CTEST_ARGS='-j5'.\"\n  exit 0\nfi\n\nif [ -n \"${EIGEN_CTEST_ARGS:+x}\" ]\nthen\n  ./buildtests.sh \"$1\" && ctest -R \"$1\" ${EIGEN_CTEST_ARGS}\nelse\n  ./buildtests.sh \"$1\" && ctest -R \"$1\"\nfi\nexit $?\n"
  },
  {
    "path": "libs/eigen/scripts/debug.in",
    "content": "#!/bin/sh\n\ncmake -DCMAKE_BUILD_TYPE=Debug .\n"
  },
  {
    "path": "libs/eigen/scripts/eigen_gen_credits.cpp",
    "content": "#include <string>\n#include <sstream>\n#include <iostream>\n#include <fstream>\n#include <iomanip>\n#include <map>\n#include <list>\n\nusing namespace std;\n\n// this function takes a line that may contain a name and/or email address,\n// and returns just the name, while fixing the \"bad cases\".\nstd::string contributor_name(const std::string& line)\n{\n  string result;\n\n  // let's first take care of the case of isolated email addresses, like\n  // \"user@localhost.localdomain\" entries\n  if(line.find(\"markb@localhost.localdomain\") != string::npos)\n  {\n    return \"Mark Borgerding\";\n  }\n\n  if(line.find(\"kayhman@contact.intra.cea.fr\") != string::npos)\n  {\n    return \"Guillaume Saupin\";\n  }\n\n  // from there on we assume that we have a entry of the form\n  // either:\n  //   Bla bli Blurp\n  // or:\n  //   Bla bli Blurp <bblurp@email.com>\n  \n  size_t position_of_email_address = line.find_first_of('<');\n  if(position_of_email_address != string::npos)\n  {\n    // there is an e-mail address in <...>.\n    \n    // Hauke once committed as \"John Smith\", fix that.\n    if(line.find(\"hauke.heibel\") != string::npos)\n      result = \"Hauke Heibel\";\n    else\n    {\n      // just remove the e-mail address\n      result = line.substr(0, position_of_email_address);\n    }\n  }\n  else\n  {\n    // there is no e-mail address in <...>.\n    \n    if(line.find(\"convert-repo\") != string::npos)\n      result = \"\";\n    else\n      result = line;\n  }\n\n  // remove trailing spaces\n  size_t length = result.length();\n  while(length >= 1 && result[length-1] == ' ') result.erase(--length);\n\n  return result;\n}\n\n// parses hg churn output to generate a contributors map.\nmap<string,int> contributors_map_from_churn_output(const char *filename)\n{\n  map<string,int> contributors_map;\n\n  string line;\n  ifstream churn_out;\n  churn_out.open(filename, ios::in);\n  while(!getline(churn_out,line).eof())\n  {\n    // remove the histograms \"******\" that hg churn may draw at the end of some lines\n    size_t first_star = line.find_first_of('*');\n    if(first_star != string::npos) line.erase(first_star);\n    \n    // remove trailing spaces\n    size_t length = line.length();\n    while(length >= 1 && line[length-1] == ' ') line.erase(--length);\n\n    // now the last space indicates where the number starts\n    size_t last_space = line.find_last_of(' ');\n    \n    // get the number (of changesets or of modified lines for each contributor)\n    int number;\n    istringstream(line.substr(last_space+1)) >> number;\n\n    // get the name of the contributor\n    line.erase(last_space);    \n    string name = contributor_name(line);\n    \n    map<string,int>::iterator it = contributors_map.find(name);\n    // if new contributor, insert\n    if(it == contributors_map.end())\n      contributors_map.insert(pair<string,int>(name, number));\n    // if duplicate, just add the number\n    else\n      it->second += number;\n  }\n  churn_out.close();\n\n  return contributors_map;\n}\n\n// find the last name, i.e. the last word.\n// for \"van den Schbling\" types of last names, that's not a problem, that's actually what we want.\nstring lastname(const string& name)\n{\n  size_t last_space = name.find_last_of(' ');\n  if(last_space >= name.length()-1) return name;\n  else return name.substr(last_space+1);\n}\n\nstruct contributor\n{\n  string name;\n  int changedlines;\n  int changesets;\n  string url;\n  string misc;\n  \n  contributor() : changedlines(0), changesets(0) {}\n  \n  bool operator < (const contributor& other)\n  {\n    return lastname(name).compare(lastname(other.name)) < 0;\n  }\n};\n\nvoid add_online_info_into_contributors_list(list<contributor>& contributors_list, const char *filename)\n{\n  string line;\n  ifstream online_info;\n  online_info.open(filename, ios::in);\n  while(!getline(online_info,line).eof())\n  {\n    string hgname, realname, url, misc;\n    \n    size_t last_bar = line.find_last_of('|');\n    if(last_bar == string::npos) continue;\n    if(last_bar < line.length())\n      misc = line.substr(last_bar+1);\n    line.erase(last_bar);\n    \n    last_bar = line.find_last_of('|');\n    if(last_bar == string::npos) continue;\n    if(last_bar < line.length())\n      url = line.substr(last_bar+1);\n    line.erase(last_bar);\n\n    last_bar = line.find_last_of('|');\n    if(last_bar == string::npos) continue;\n    if(last_bar < line.length())\n      realname = line.substr(last_bar+1);\n    line.erase(last_bar);\n\n    hgname = line;\n    \n    // remove the example line\n    if(hgname.find(\"MercurialName\") != string::npos) continue;\n    \n    list<contributor>::iterator it;\n    for(it=contributors_list.begin(); it != contributors_list.end() && it->name != hgname; ++it)\n    {}\n    \n    if(it == contributors_list.end())\n    {\n      contributor c;\n      c.name = realname;\n      c.url = url;\n      c.misc = misc;\n      contributors_list.push_back(c);\n    }\n    else\n    {\n      it->name = realname;\n      it->url = url;\n      it->misc = misc;\n    }\n  }\n}\n\nint main()\n{\n  // parse the hg churn output files\n  map<string,int> contributors_map_for_changedlines = contributors_map_from_churn_output(\"churn-changedlines.out\");\n  //map<string,int> contributors_map_for_changesets = contributors_map_from_churn_output(\"churn-changesets.out\");\n  \n  // merge into the contributors list\n  list<contributor> contributors_list;\n  map<string,int>::iterator it;\n  for(it=contributors_map_for_changedlines.begin(); it != contributors_map_for_changedlines.end(); ++it)\n  {\n    contributor c;\n    c.name = it->first;\n    c.changedlines = it->second;\n    c.changesets = 0; //contributors_map_for_changesets.find(it->first)->second;\n    contributors_list.push_back(c);\n  }\n  \n  add_online_info_into_contributors_list(contributors_list, \"online-info.out\");\n  \n  contributors_list.sort();\n  \n  cout << \"{| cellpadding=\\\"5\\\"\\n\";\n  cout << \"!\\n\";\n  cout << \"! Lines changed\\n\";\n  cout << \"!\\n\";\n\n  list<contributor>::iterator itc;\n  int i = 0;\n  for(itc=contributors_list.begin(); itc != contributors_list.end(); ++itc)\n  {\n    if(itc->name.length() == 0) continue;\n    if(i%2) cout << \"|-\\n\";\n    else cout << \"|- style=\\\"background:#FFFFD0\\\"\\n\";\n    if(itc->url.length())\n      cout << \"| [\" << itc->url << \" \" << itc->name << \"]\\n\";\n    else\n      cout << \"| \" << itc->name << \"\\n\";\n    if(itc->changedlines)\n      cout << \"| \" << itc->changedlines << \"\\n\";\n    else\n      cout << \"| (no information)\\n\";\n    cout << \"| \" << itc->misc << \"\\n\";\n    i++;\n  }\n  cout << \"|}\" << endl;\n}\n"
  },
  {
    "path": "libs/eigen/scripts/eigen_gen_docs",
    "content": "#!/bin/sh\n\n# configuration\n# You should call this script with USER set as you want, else some default\n# will be used\nUSER=${USER:-'orzel'}\nUPLOAD_DIR=dox\n\n#ulimit -v 1024000\n\n# step 1 : build\nrm build/doc/html -Rf\nmkdir build -p\n(cd build && cmake .. && make doc) || { echo \"make failed\"; exit 1; }\n\n#step 2 : upload\n# (the '/' at the end of path is very important, see rsync documentation)\nrsync -az --no-p --delete build/doc/html/ $USER@ssh.tuxfamily.org:eigen/eigen.tuxfamily.org-web/htdocs/$UPLOAD_DIR/ || { echo \"upload failed\"; exit 1; }\n\n#step 3 : fix the perm\nssh $USER@ssh.tuxfamily.org \"chmod -R g+w /home/eigen/eigen.tuxfamily.org-web/htdocs/$UPLOAD_DIR\" || { echo \"perm failed\"; exit 1; }\n\necho \"Uploaded successfully\"\n\n"
  },
  {
    "path": "libs/eigen/scripts/release.in",
    "content": "#!/bin/sh\n\ncmake -DCMAKE_BUILD_TYPE=Release .\n"
  },
  {
    "path": "libs/eigen/scripts/relicense.py",
    "content": "# This file is part of Eigen, a lightweight C++ template library\n# for linear algebra.\n#\n# Copyright (C) 2012 Keir Mierle <mierle@gmail.com>\n#\n# This Source Code Form is subject to the terms of the Mozilla\n# Public License v. 2.0. If a copy of the MPL was not distributed\n# with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n#\n# Author: mierle@gmail.com (Keir Mierle)\n#\n# Make the long-awaited conversion to MPL.\n\nlgpl3_header = '''\n// Eigen is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3 of the License, or (at your option) any later version.\n//\n// Alternatively, you can redistribute it and/or\n// modify it under the terms of the GNU General Public License as\n// published by the Free Software Foundation; either version 2 of\n// the License, or (at your option) any later version.\n//\n// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY\n// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License and a copy of the GNU General Public License along with\n// Eigen. If not, see <http://www.gnu.org/licenses/>.\n'''\n\nmpl2_header = \"\"\"\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\"\"\"\n\nimport os\nimport sys\n\nexclusions = set(['relicense.py'])\n\ndef update(text):\n  if text.find(lgpl3_header) == -1:\n    return text, False\n  return text.replace(lgpl3_header, mpl2_header), True\n\nrootdir = sys.argv[1]\nfor root, sub_folders, files in os.walk(rootdir):\n    for basename in files:\n        if basename in exclusions:\n          print 'SKIPPED', filename\n          continue\n        filename = os.path.join(root, basename)\n        fo = file(filename)\n        text = fo.read()\n        fo.close()\n\n        text, updated = update(text)\n        if updated:\n          fo = file(filename, \"w\")\n          fo.write(text)\n          fo.close()\n          print 'UPDATED', filename\n        else:\n          print '       ', filename\n"
  },
  {
    "path": "libs/eigen/signature_of_eigen3_matrix_library",
    "content": "This file is just there as a signature to help identify directories containing Eigen3. When writing a script looking for Eigen3, just look for this file. This is especially useful to help disambiguate with Eigen2...\n"
  },
  {
    "path": "libs/eigen/test/CMakeLists.txt",
    "content": "\n# generate split test header file\nmessage(STATUS ${CMAKE_CURRENT_BINARY_DIR})\nfile(WRITE ${CMAKE_CURRENT_BINARY_DIR}/split_test_helper.h \"\")\nforeach(i RANGE 1 999)\n  file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/split_test_helper.h\n    \"#ifdef EIGEN_TEST_PART_${i}\\n\"\n    \"#define CALL_SUBTEST_${i}(FUNC) CALL_SUBTEST(FUNC)\\n\"\n    \"#else\\n\"\n    \"#define CALL_SUBTEST_${i}(FUNC)\\n\"\n    \"#endif\\n\\n\"\n    )\nendforeach()\n\n# configure blas/lapack (use Eigen's ones)\nset(BLAS_FOUND TRUE)\nset(LAPACK_FOUND TRUE)\nset(BLAS_LIBRARIES eigen_blas)\nset(LAPACK_LIBRARIES eigen_lapack)\n\nset(EIGEN_TEST_MATRIX_DIR \"\" CACHE STRING \"Enable testing of realword sparse matrices contained in the specified path\")\nif(EIGEN_TEST_MATRIX_DIR)\n  if(NOT WIN32)\n    message(STATUS \"Test realworld sparse matrices: ${EIGEN_TEST_MATRIX_DIR}\")\n    add_definitions( -DTEST_REAL_CASES=\"${EIGEN_TEST_MATRIX_DIR}\" )\n  else(NOT WIN32)\n    message(STATUS \"REAL CASES CAN NOT BE CURRENTLY TESTED ON WIN32\")\n  endif(NOT WIN32)\nendif(EIGEN_TEST_MATRIX_DIR)\n\nset(SPARSE_LIBS \" \")\n\nfind_package(Cholmod)\nif(CHOLMOD_FOUND AND BLAS_FOUND AND LAPACK_FOUND)\n  add_definitions(\"-DEIGEN_CHOLMOD_SUPPORT\")\n  include_directories(${CHOLMOD_INCLUDES})\n  set(SPARSE_LIBS ${SPARSE_LIBS} ${CHOLMOD_LIBRARIES} ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES})\n  set(CHOLMOD_ALL_LIBS  ${CHOLMOD_LIBRARIES} ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES})\n  ei_add_property(EIGEN_TESTED_BACKENDS \"Cholmod, \")\nelse()\n  ei_add_property(EIGEN_MISSING_BACKENDS \"Cholmod, \")\nendif()\n\nfind_package(Umfpack)\nif(UMFPACK_FOUND AND BLAS_FOUND)\n  add_definitions(\"-DEIGEN_UMFPACK_SUPPORT\")\n  include_directories(${UMFPACK_INCLUDES})\n  set(SPARSE_LIBS ${SPARSE_LIBS} ${UMFPACK_LIBRARIES} ${BLAS_LIBRARIES})\n  set(UMFPACK_ALL_LIBS ${UMFPACK_LIBRARIES} ${BLAS_LIBRARIES})\n  ei_add_property(EIGEN_TESTED_BACKENDS \"UmfPack, \")\nelse()\n  ei_add_property(EIGEN_MISSING_BACKENDS \"UmfPack, \")\nendif()\n\nfind_package(SuperLU)\nif(SUPERLU_FOUND AND BLAS_FOUND)\n  add_definitions(\"-DEIGEN_SUPERLU_SUPPORT\")\n  include_directories(${SUPERLU_INCLUDES})\n  set(SPARSE_LIBS ${SPARSE_LIBS} ${SUPERLU_LIBRARIES} ${BLAS_LIBRARIES})\n  set(SUPERLU_ALL_LIBS ${SUPERLU_LIBRARIES} ${BLAS_LIBRARIES})\n  ei_add_property(EIGEN_TESTED_BACKENDS  \"SuperLU, \")\nelse()\n  ei_add_property(EIGEN_MISSING_BACKENDS  \"SuperLU, \")\nendif()\n\n\nfind_package(Pastix)\nfind_package(Scotch)\nfind_package(Metis 5.0 REQUIRED)\nif(PASTIX_FOUND AND BLAS_FOUND)\n  add_definitions(\"-DEIGEN_PASTIX_SUPPORT\")\n  include_directories(${PASTIX_INCLUDES})\n  if(SCOTCH_FOUND)\n    include_directories(${SCOTCH_INCLUDES})\n    set(PASTIX_LIBRARIES ${PASTIX_LIBRARIES} ${SCOTCH_LIBRARIES})\n  elseif(METIS_FOUND)\n    include_directories(${METIS_INCLUDES})\n    set(PASTIX_LIBRARIES ${PASTIX_LIBRARIES} ${METIS_LIBRARIES})\n  else(SCOTCH_FOUND)\n    ei_add_property(EIGEN_MISSING_BACKENDS  \"PaStiX, \")\n  endif(SCOTCH_FOUND)\n  set(SPARSE_LIBS ${SPARSE_LIBS} ${PASTIX_LIBRARIES} ${ORDERING_LIBRARIES} ${BLAS_LIBRARIES})\n  set(PASTIX_ALL_LIBS ${PASTIX_LIBRARIES} ${BLAS_LIBRARIES})\n  ei_add_property(EIGEN_TESTED_BACKENDS  \"PaStiX, \")\nelse()\n  ei_add_property(EIGEN_MISSING_BACKENDS  \"PaStiX, \")\nendif()\n\nif(METIS_FOUND)\n  add_definitions(\"-DEIGEN_METIS_SUPPORT\")\n  include_directories(${METIS_INCLUDES})\n  ei_add_property(EIGEN_TESTED_BACKENDS \"METIS, \")\nelse()\n  ei_add_property(EIGEN_MISSING_BACKENDS \"METIS, \")\nendif()\n\nfind_package(SPQR)\nif(SPQR_FOUND AND BLAS_FOUND AND LAPACK_FOUND)\n  if(CHOLMOD_FOUND)\n    add_definitions(\"-DEIGEN_SPQR_SUPPORT\")\n    include_directories(${SPQR_INCLUDES})\n    set(SPQR_ALL_LIBS ${SPQR_LIBRARIES} ${CHOLMOD_LIBRARIES} ${LAPACK_LIBRARIES} ${BLAS_LIBRARIES})\n    set(SPARSE_LIBS ${SPARSE_LIBS} ${SPQR_ALL_LIBS})\n    ei_add_property(EIGEN_TESTED_BACKENDS \"SPQR, \")\n  else(CHOLMOD_FOUND)\n    ei_add_property(EIGEN_MISSING_BACKENDS \"SPQR, \")\n  endif(CHOLMOD_FOUND)\nendif()\n\noption(EIGEN_TEST_NOQT \"Disable Qt support in unit tests\" OFF)\nif(NOT EIGEN_TEST_NOQT)\n  find_package(Qt4)\n  if(QT4_FOUND)\n    include(${QT_USE_FILE})\n    ei_add_property(EIGEN_TESTED_BACKENDS  \"Qt4 support, \")\n  else()\n    ei_add_property(EIGEN_MISSING_BACKENDS  \"Qt4 support, \")\n  endif()\nendif(NOT EIGEN_TEST_NOQT)\n\nif(TEST_LIB)\n  add_definitions(\"-DEIGEN_EXTERN_INSTANTIATIONS=1\")\nendif(TEST_LIB)\n\nset_property(GLOBAL PROPERTY EIGEN_CURRENT_SUBPROJECT \"Official\")\nadd_custom_target(BuildOfficial)\n\nei_add_test(meta)\nei_add_test(sizeof)\nei_add_test(dynalloc)\nei_add_test(nomalloc)\nei_add_test(first_aligned)\nei_add_test(mixingtypes)\nei_add_test(packetmath)\nei_add_test(unalignedassert)\nei_add_test(vectorization_logic)\nei_add_test(basicstuff)\nei_add_test(linearstructure)\nei_add_test(integer_types)\nei_add_test(cwiseop)\nei_add_test(unalignedcount)\nei_add_test(exceptions)\nei_add_test(redux)\nei_add_test(visitor)\nei_add_test(block)\nei_add_test(corners)\nei_add_test(product_small)\nei_add_test(product_large)\nei_add_test(product_extra)\nei_add_test(diagonalmatrices)\nei_add_test(adjoint)\nei_add_test(diagonal)\nei_add_test(miscmatrices)\nei_add_test(commainitializer)\nei_add_test(smallvectors)\nei_add_test(mapped_matrix)\nei_add_test(mapstride)\nei_add_test(mapstaticmethods)\nei_add_test(array)\nei_add_test(array_for_matrix)\nei_add_test(array_replicate)\nei_add_test(array_reverse)\nei_add_test(ref)\nei_add_test(triangular)\nei_add_test(selfadjoint)\nei_add_test(product_selfadjoint)\nei_add_test(product_symm)\nei_add_test(product_syrk)\nei_add_test(product_trmv)\nei_add_test(product_trmm)\nei_add_test(product_trsolve)\nei_add_test(product_mmtr)\nei_add_test(product_notemporary)\nei_add_test(stable_norm)\nei_add_test(bandmatrix)\nei_add_test(cholesky)\nei_add_test(lu)\nei_add_test(determinant)\nei_add_test(inverse)\nei_add_test(qr)\nei_add_test(qr_colpivoting)\nei_add_test(qr_fullpivoting)\nei_add_test(upperbidiagonalization)\nei_add_test(hessenberg)\nei_add_test(schur_real)\nei_add_test(schur_complex)\nei_add_test(eigensolver_selfadjoint)\nei_add_test(eigensolver_generic)\nei_add_test(eigensolver_complex)\nei_add_test(real_qz)\nei_add_test(eigensolver_generalized_real)\nei_add_test(jacobi)\nei_add_test(jacobisvd)\nei_add_test(geo_orthomethods)\nei_add_test(geo_homogeneous)\nei_add_test(geo_quaternion)\nei_add_test(geo_transformations)\nei_add_test(geo_eulerangles)\nei_add_test(geo_hyperplane)\nei_add_test(geo_parametrizedline)\nei_add_test(geo_alignedbox)\nei_add_test(stdvector)\nei_add_test(stdvector_overload)\nei_add_test(stdlist)\nei_add_test(stdlist_overload)\nei_add_test(stddeque)\nei_add_test(stddeque_overload)\nei_add_test(resize)\nei_add_test(sparse_vector)\nei_add_test(sparse_basic)\nei_add_test(sparse_product)\nei_add_test(sparse_solvers)\nei_add_test(umeyama)\nei_add_test(householder)\nei_add_test(swap)\nei_add_test(conservative_resize)\nei_add_test(permutationmatrices)\nei_add_test(sparse_permutations)\nei_add_test(nullary)\nei_add_test(nesting_ops \"${CMAKE_CXX_FLAGS_DEBUG}\")\nei_add_test(zerosized)\nei_add_test(dontalign)\nei_add_test(sizeoverflow)\nei_add_test(prec_inverse_4x4)\nei_add_test(vectorwiseop)\nei_add_test(special_numbers)\nei_add_test(rvalue_types)\nei_add_test(mpl2only)\n\nei_add_test(simplicial_cholesky)\nei_add_test(conjugate_gradient)\nei_add_test(bicgstab)\nei_add_test(sparselu)\nei_add_test(sparseqr)\n\n# ei_add_test(denseLM)\n\nif(QT4_FOUND)\n  ei_add_test(qtvector \"\" \"${QT_QTCORE_LIBRARY}\")\nendif(QT4_FOUND)\n\nei_add_test(eigen2support)\n\nif(UMFPACK_FOUND)\n  ei_add_test(umfpack_support \"\" \"${UMFPACK_ALL_LIBS}\")\nendif()\n\nif(SUPERLU_FOUND)\n  ei_add_test(superlu_support \"\" \"${SUPERLU_ALL_LIBS}\")\nendif()\n\nif(CHOLMOD_FOUND)\n  ei_add_test(cholmod_support \"\" \"${CHOLMOD_ALL_LIBS}\")\nendif()\n\nif(PARDISO_FOUND)\n  ei_add_test(pardiso_support \"\" \"${PARDISO_ALL_LIBS}\")\nendif()\n\nif(PASTIX_FOUND AND (SCOTCH_FOUND OR METIS_FOUND))\n  ei_add_test(pastix_support \"\" \"${PASTIX_ALL_LIBS}\")\nendif()\n\nif(SPQR_FOUND AND CHOLMOD_FOUND)\n  ei_add_test(spqr_support \"\" \"${SPQR_ALL_LIBS}\")\nendif()\n\nif(METIS_FOUND)\nei_add_test(metis_support \"\" \"${METIS_LIBRARIES}\")\nendif()\n\nstring(TOLOWER \"${CMAKE_CXX_COMPILER}\" cmake_cxx_compiler_tolower)\nif(cmake_cxx_compiler_tolower MATCHES \"qcc\")\n  set(CXX_IS_QCC \"ON\")\nendif()\n\nei_add_property(EIGEN_TESTING_SUMMARY \"CXX:               ${CMAKE_CXX_COMPILER}\\n\")\nif(CMAKE_COMPILER_IS_GNUCXX AND NOT CXX_IS_QCC)\n  execute_process(COMMAND ${CMAKE_CXX_COMPILER} --version COMMAND head -n 1 OUTPUT_VARIABLE EIGEN_CXX_VERSION_STRING OUTPUT_STRIP_TRAILING_WHITESPACE)\n  ei_add_property(EIGEN_TESTING_SUMMARY \"CXX_VERSION:       ${EIGEN_CXX_VERSION_STRING}\\n\")\nendif()\nei_add_property(EIGEN_TESTING_SUMMARY \"CXX_FLAGS:         ${CMAKE_CXX_FLAGS}\\n\")\nei_add_property(EIGEN_TESTING_SUMMARY \"Sparse lib flags:  ${SPARSE_LIBS}\\n\")\n\noption(EIGEN_TEST_EIGEN2 \"Run whole Eigen2 test suite against EIGEN2_SUPPORT\" OFF)\nmark_as_advanced(EIGEN_TEST_EIGEN2)\nif(EIGEN_TEST_EIGEN2)\n  add_subdirectory(eigen2)\nendif()\n\n\noption(EIGEN_TEST_BUILD_DOCUMENTATION \"Test building the doxygen documentation\" OFF)\nIF(EIGEN_TEST_BUILD_DOCUMENTATION)\n  add_dependencies(buildtests doc)\nENDIF()\n"
  },
  {
    "path": "libs/eigen/test/adjoint.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#define EIGEN_NO_STATIC_ASSERT\n\n#include \"main.h\"\n\ntemplate<bool IsInteger> struct adjoint_specific;\n\ntemplate<> struct adjoint_specific<true> {\n  template<typename Vec, typename Mat, typename Scalar>\n  static void run(const Vec& v1, const Vec& v2, Vec& v3, const Mat& square, Scalar s1, Scalar s2) {\n    VERIFY(test_isApproxWithRef((s1 * v1 + s2 * v2).dot(v3),     numext::conj(s1) * v1.dot(v3) + numext::conj(s2) * v2.dot(v3), 0));\n    VERIFY(test_isApproxWithRef(v3.dot(s1 * v1 + s2 * v2),       s1*v3.dot(v1)+s2*v3.dot(v2), 0));\n    \n    // check compatibility of dot and adjoint\n    VERIFY(test_isApproxWithRef(v1.dot(square * v2), (square.adjoint() * v1).dot(v2), 0));\n  }\n};\n\ntemplate<> struct adjoint_specific<false> {\n  template<typename Vec, typename Mat, typename Scalar>\n  static void run(const Vec& v1, const Vec& v2, Vec& v3, const Mat& square, Scalar s1, Scalar s2) {\n    typedef typename NumTraits<Scalar>::Real RealScalar;\n    using std::abs;\n    \n    RealScalar ref = NumTraits<Scalar>::IsInteger ? RealScalar(0) : (std::max)((s1 * v1 + s2 * v2).norm(),v3.norm());\n    VERIFY(test_isApproxWithRef((s1 * v1 + s2 * v2).dot(v3),     numext::conj(s1) * v1.dot(v3) + numext::conj(s2) * v2.dot(v3), ref));\n    VERIFY(test_isApproxWithRef(v3.dot(s1 * v1 + s2 * v2),       s1*v3.dot(v1)+s2*v3.dot(v2), ref));\n  \n    VERIFY_IS_APPROX(v1.squaredNorm(),                v1.norm() * v1.norm());\n    // check normalized() and normalize()\n    VERIFY_IS_APPROX(v1, v1.norm() * v1.normalized());\n    v3 = v1;\n    v3.normalize();\n    VERIFY_IS_APPROX(v1, v1.norm() * v3);\n    VERIFY_IS_APPROX(v3, v1.normalized());\n    VERIFY_IS_APPROX(v3.norm(), RealScalar(1));\n    \n    // check compatibility of dot and adjoint\n    ref = NumTraits<Scalar>::IsInteger ? 0 : (std::max)((std::max)(v1.norm(),v2.norm()),(std::max)((square * v2).norm(),(square.adjoint() * v1).norm()));\n    VERIFY(internal::isMuchSmallerThan(abs(v1.dot(square * v2) - (square.adjoint() * v1).dot(v2)), ref, test_precision<Scalar>()));\n    \n    // check that Random().normalized() works: tricky as the random xpr must be evaluated by\n    // normalized() in order to produce a consistent result.\n    VERIFY_IS_APPROX(Vec::Random(v1.size()).normalized().norm(), RealScalar(1));\n  }\n};\n\ntemplate<typename MatrixType> void adjoint(const MatrixType& m)\n{\n  /* this test covers the following files:\n     Transpose.h Conjugate.h Dot.h\n  */\n  using std::abs;\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> VectorType;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, MatrixType::RowsAtCompileTime> SquareMatrixType;\n  \n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  MatrixType m1 = MatrixType::Random(rows, cols),\n             m2 = MatrixType::Random(rows, cols),\n             m3(rows, cols),\n             square = SquareMatrixType::Random(rows, rows);\n  VectorType v1 = VectorType::Random(rows),\n             v2 = VectorType::Random(rows),\n             v3 = VectorType::Random(rows),\n             vzero = VectorType::Zero(rows);\n\n  Scalar s1 = internal::random<Scalar>(),\n         s2 = internal::random<Scalar>();\n\n  // check basic compatibility of adjoint, transpose, conjugate\n  VERIFY_IS_APPROX(m1.transpose().conjugate().adjoint(),    m1);\n  VERIFY_IS_APPROX(m1.adjoint().conjugate().transpose(),    m1);\n\n  // check multiplicative behavior\n  VERIFY_IS_APPROX((m1.adjoint() * m2).adjoint(),           m2.adjoint() * m1);\n  VERIFY_IS_APPROX((s1 * m1).adjoint(),                     numext::conj(s1) * m1.adjoint());\n\n  // check basic properties of dot, squaredNorm\n  VERIFY_IS_APPROX(numext::conj(v1.dot(v2)),               v2.dot(v1));\n  VERIFY_IS_APPROX(numext::real(v1.dot(v1)),               v1.squaredNorm());\n  \n  adjoint_specific<NumTraits<Scalar>::IsInteger>::run(v1, v2, v3, square, s1, s2);\n  \n  VERIFY_IS_MUCH_SMALLER_THAN(abs(vzero.dot(v1)),  static_cast<RealScalar>(1));\n  \n  // like in testBasicStuff, test operator() to check const-qualification\n  Index r = internal::random<Index>(0, rows-1),\n      c = internal::random<Index>(0, cols-1);\n  VERIFY_IS_APPROX(m1.conjugate()(r,c), numext::conj(m1(r,c)));\n  VERIFY_IS_APPROX(m1.adjoint()(c,r), numext::conj(m1(r,c)));\n\n  // check inplace transpose\n  m3 = m1;\n  m3.transposeInPlace();\n  VERIFY_IS_APPROX(m3,m1.transpose());\n  m3.transposeInPlace();\n  VERIFY_IS_APPROX(m3,m1);\n\n  // check inplace adjoint\n  m3 = m1;\n  m3.adjointInPlace();\n  VERIFY_IS_APPROX(m3,m1.adjoint());\n  m3.transposeInPlace();\n  VERIFY_IS_APPROX(m3,m1.conjugate());\n\n  // check mixed dot product\n  typedef Matrix<RealScalar, MatrixType::RowsAtCompileTime, 1> RealVectorType;\n  RealVectorType rv1 = RealVectorType::Random(rows);\n  VERIFY_IS_APPROX(v1.dot(rv1.template cast<Scalar>()), v1.dot(rv1));\n  VERIFY_IS_APPROX(rv1.template cast<Scalar>().dot(v1), rv1.dot(v1));\n}\n\nvoid test_adjoint()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( adjoint(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( adjoint(Matrix3d()) );\n    CALL_SUBTEST_3( adjoint(Matrix4f()) );\n    CALL_SUBTEST_4( adjoint(MatrixXcf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE/2), internal::random<int>(1,EIGEN_TEST_MAX_SIZE/2))) );\n    CALL_SUBTEST_5( adjoint(MatrixXi(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n    CALL_SUBTEST_6( adjoint(MatrixXf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n  }\n  // test a large static matrix only once\n  CALL_SUBTEST_7( adjoint(Matrix<float, 100, 100>()) );\n\n#ifdef EIGEN_TEST_PART_4\n  {\n    MatrixXcf a(10,10), b(10,10);\n    VERIFY_RAISES_ASSERT(a = a.transpose());\n    VERIFY_RAISES_ASSERT(a = a.transpose() + b);\n    VERIFY_RAISES_ASSERT(a = b + a.transpose());\n    VERIFY_RAISES_ASSERT(a = a.conjugate().transpose());\n    VERIFY_RAISES_ASSERT(a = a.adjoint());\n    VERIFY_RAISES_ASSERT(a = a.adjoint() + b);\n    VERIFY_RAISES_ASSERT(a = b + a.adjoint());\n\n    // no assertion should be triggered for these cases:\n    a.transpose() = a.transpose();\n    a.transpose() += a.transpose();\n    a.transpose() += a.transpose() + b;\n    a.transpose() = a.adjoint();\n    a.transpose() += a.adjoint();\n    a.transpose() += a.adjoint() + b;\n  }\n#endif\n}\n\n"
  },
  {
    "path": "libs/eigen/test/array.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\ntemplate<typename ArrayType> void array(const ArrayType& m)\n{\n  typedef typename ArrayType::Index Index;\n  typedef typename ArrayType::Scalar Scalar;\n  typedef Array<Scalar, ArrayType::RowsAtCompileTime, 1> ColVectorType;\n  typedef Array<Scalar, 1, ArrayType::ColsAtCompileTime> RowVectorType;\n\n  Index rows = m.rows();\n  Index cols = m.cols(); \n\n  ArrayType m1 = ArrayType::Random(rows, cols),\n             m2 = ArrayType::Random(rows, cols),\n             m3(rows, cols);\n\n  ColVectorType cv1 = ColVectorType::Random(rows);\n  RowVectorType rv1 = RowVectorType::Random(cols);\n\n  Scalar  s1 = internal::random<Scalar>(),\n          s2 = internal::random<Scalar>();\n\n  // scalar addition\n  VERIFY_IS_APPROX(m1 + s1, s1 + m1);\n  VERIFY_IS_APPROX(m1 + s1, ArrayType::Constant(rows,cols,s1) + m1);\n  VERIFY_IS_APPROX(s1 - m1, (-m1)+s1 );\n  VERIFY_IS_APPROX(m1 - s1, m1 - ArrayType::Constant(rows,cols,s1));\n  VERIFY_IS_APPROX(s1 - m1, ArrayType::Constant(rows,cols,s1) - m1);\n  VERIFY_IS_APPROX((m1*Scalar(2)) - s2, (m1+m1) - ArrayType::Constant(rows,cols,s2) );\n  m3 = m1;\n  m3 += s2;\n  VERIFY_IS_APPROX(m3, m1 + s2);\n  m3 = m1;\n  m3 -= s1;\n  VERIFY_IS_APPROX(m3, m1 - s1);  \n  \n  // scalar operators via Maps\n  m3 = m1;\n  ArrayType::Map(m1.data(), m1.rows(), m1.cols()) -= ArrayType::Map(m2.data(), m2.rows(), m2.cols());\n  VERIFY_IS_APPROX(m1, m3 - m2);\n  \n  m3 = m1;\n  ArrayType::Map(m1.data(), m1.rows(), m1.cols()) += ArrayType::Map(m2.data(), m2.rows(), m2.cols());\n  VERIFY_IS_APPROX(m1, m3 + m2);\n  \n  m3 = m1;\n  ArrayType::Map(m1.data(), m1.rows(), m1.cols()) *= ArrayType::Map(m2.data(), m2.rows(), m2.cols());\n  VERIFY_IS_APPROX(m1, m3 * m2);\n  \n  m3 = m1;\n  m2 = ArrayType::Random(rows,cols);\n  m2 = (m2==0).select(1,m2);\n  ArrayType::Map(m1.data(), m1.rows(), m1.cols()) /= ArrayType::Map(m2.data(), m2.rows(), m2.cols());  \n  VERIFY_IS_APPROX(m1, m3 / m2);\n\n  // reductions\n  VERIFY_IS_APPROX(m1.abs().colwise().sum().sum(), m1.abs().sum());\n  VERIFY_IS_APPROX(m1.abs().rowwise().sum().sum(), m1.abs().sum());\n  using std::abs;\n  VERIFY_IS_MUCH_SMALLER_THAN(abs(m1.colwise().sum().sum() - m1.sum()), m1.abs().sum());\n  VERIFY_IS_MUCH_SMALLER_THAN(abs(m1.rowwise().sum().sum() - m1.sum()), m1.abs().sum());\n  if (!internal::isMuchSmallerThan(abs(m1.sum() - (m1+m2).sum()), m1.abs().sum(), test_precision<Scalar>()))\n      VERIFY_IS_NOT_APPROX(((m1+m2).rowwise().sum()).sum(), m1.sum());\n  VERIFY_IS_APPROX(m1.colwise().sum(), m1.colwise().redux(internal::scalar_sum_op<Scalar>()));\n\n  // vector-wise ops\n  m3 = m1;\n  VERIFY_IS_APPROX(m3.colwise() += cv1, m1.colwise() + cv1);\n  m3 = m1;\n  VERIFY_IS_APPROX(m3.colwise() -= cv1, m1.colwise() - cv1);\n  m3 = m1;\n  VERIFY_IS_APPROX(m3.rowwise() += rv1, m1.rowwise() + rv1);\n  m3 = m1;\n  VERIFY_IS_APPROX(m3.rowwise() -= rv1, m1.rowwise() - rv1);\n}\n\ntemplate<typename ArrayType> void comparisons(const ArrayType& m)\n{\n  using std::abs;\n  typedef typename ArrayType::Index Index;\n  typedef typename ArrayType::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  Index r = internal::random<Index>(0, rows-1),\n        c = internal::random<Index>(0, cols-1);\n\n  ArrayType m1 = ArrayType::Random(rows, cols),\n             m2 = ArrayType::Random(rows, cols),\n             m3(rows, cols);            \n\n  VERIFY(((m1 + Scalar(1)) > m1).all());\n  VERIFY(((m1 - Scalar(1)) < m1).all());\n  if (rows*cols>1)\n  {\n    m3 = m1;\n    m3(r,c) += 1;\n    VERIFY(! (m1 < m3).all() );\n    VERIFY(! (m1 > m3).all() );\n  }\n  VERIFY(!(m1 > m2 && m1 < m2).any());\n  VERIFY((m1 <= m2 || m1 >= m2).all());\n\n  // comparisons to scalar\n  VERIFY( (m1 != (m1(r,c)+1) ).any() );\n  VERIFY( (m1 > (m1(r,c)-1) ).any() );\n  VERIFY( (m1 < (m1(r,c)+1) ).any() );\n  VERIFY( (m1 == m1(r,c) ).any() );\n\n  // test Select\n  VERIFY_IS_APPROX( (m1<m2).select(m1,m2), m1.cwiseMin(m2) );\n  VERIFY_IS_APPROX( (m1>m2).select(m1,m2), m1.cwiseMax(m2) );\n  Scalar mid = (m1.cwiseAbs().minCoeff() + m1.cwiseAbs().maxCoeff())/Scalar(2);\n  for (int j=0; j<cols; ++j)\n  for (int i=0; i<rows; ++i)\n    m3(i,j) = abs(m1(i,j))<mid ? 0 : m1(i,j);\n  VERIFY_IS_APPROX( (m1.abs()<ArrayType::Constant(rows,cols,mid))\n                        .select(ArrayType::Zero(rows,cols),m1), m3);\n  // shorter versions:\n  VERIFY_IS_APPROX( (m1.abs()<ArrayType::Constant(rows,cols,mid))\n                        .select(0,m1), m3);\n  VERIFY_IS_APPROX( (m1.abs()>=ArrayType::Constant(rows,cols,mid))\n                        .select(m1,0), m3);\n  // even shorter version:\n  VERIFY_IS_APPROX( (m1.abs()<mid).select(0,m1), m3);\n\n  // count\n  VERIFY(((m1.abs()+1)>RealScalar(0.1)).count() == rows*cols);\n\n  // and/or\n  VERIFY( (m1<RealScalar(0) && m1>RealScalar(0)).count() == 0);\n  VERIFY( (m1<RealScalar(0) || m1>=RealScalar(0)).count() == rows*cols);\n  RealScalar a = m1.abs().mean();\n  VERIFY( (m1<-a || m1>a).count() == (m1.abs()>a).count());\n\n  typedef Array<typename ArrayType::Index, Dynamic, 1> ArrayOfIndices;\n\n  // TODO allows colwise/rowwise for array\n  VERIFY_IS_APPROX(((m1.abs()+1)>RealScalar(0.1)).colwise().count(), ArrayOfIndices::Constant(cols,rows).transpose());\n  VERIFY_IS_APPROX(((m1.abs()+1)>RealScalar(0.1)).rowwise().count(), ArrayOfIndices::Constant(rows, cols));\n}\n\ntemplate<typename ArrayType> void array_real(const ArrayType& m)\n{\n  using std::abs;\n  using std::sqrt;\n  typedef typename ArrayType::Index Index;\n  typedef typename ArrayType::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  ArrayType m1 = ArrayType::Random(rows, cols),\n            m2 = ArrayType::Random(rows, cols),\n            m3(rows, cols);\n\n  Scalar  s1 = internal::random<Scalar>();\n\n  // these tests are mostly to check possible compilation issues.\n  VERIFY_IS_APPROX(m1.sin(), sin(m1));\n  VERIFY_IS_APPROX(m1.cos(), cos(m1));\n  VERIFY_IS_APPROX(m1.asin(), asin(m1));\n  VERIFY_IS_APPROX(m1.acos(), acos(m1));\n  VERIFY_IS_APPROX(m1.tan(), tan(m1));\n  \n  VERIFY_IS_APPROX(cos(m1+RealScalar(3)*m2), cos((m1+RealScalar(3)*m2).eval()));\n\n  VERIFY_IS_APPROX(m1.abs().sqrt(), sqrt(abs(m1)));\n  VERIFY_IS_APPROX(m1.abs(), sqrt(numext::abs2(m1)));\n\n  VERIFY_IS_APPROX(numext::abs2(numext::real(m1)) + numext::abs2(numext::imag(m1)), numext::abs2(m1));\n  VERIFY_IS_APPROX(numext::abs2(real(m1)) + numext::abs2(imag(m1)), numext::abs2(m1));\n  if(!NumTraits<Scalar>::IsComplex)\n    VERIFY_IS_APPROX(numext::real(m1), m1);\n\n  // shift argument of logarithm so that it is not zero\n  Scalar smallNumber = NumTraits<Scalar>::dummy_precision();\n  VERIFY_IS_APPROX((m1.abs() + smallNumber).log() , log(abs(m1) + smallNumber));\n\n  VERIFY_IS_APPROX(m1.exp() * m2.exp(), exp(m1+m2));\n  VERIFY_IS_APPROX(m1.exp(), exp(m1));\n  VERIFY_IS_APPROX(m1.exp() / m2.exp(),(m1-m2).exp());\n\n  VERIFY_IS_APPROX(m1.pow(2), m1.square());\n  VERIFY_IS_APPROX(pow(m1,2), m1.square());\n\n  ArrayType exponents = ArrayType::Constant(rows, cols, RealScalar(2));\n  VERIFY_IS_APPROX(Eigen::pow(m1,exponents), m1.square());\n\n  m3 = m1.abs();\n  VERIFY_IS_APPROX(m3.pow(RealScalar(0.5)), m3.sqrt());\n  VERIFY_IS_APPROX(pow(m3,RealScalar(0.5)), m3.sqrt());\n\n  // scalar by array division\n  const RealScalar tiny = sqrt(std::numeric_limits<RealScalar>::epsilon());\n  s1 += Scalar(tiny);\n  m1 += ArrayType::Constant(rows,cols,Scalar(tiny));\n  VERIFY_IS_APPROX(s1/m1, s1 * m1.inverse());\n  \n  // check inplace transpose\n  m3 = m1;\n  m3.transposeInPlace();\n  VERIFY_IS_APPROX(m3,m1.transpose());\n  m3.transposeInPlace();\n  VERIFY_IS_APPROX(m3,m1);\n}\n\ntemplate<typename ArrayType> void array_complex(const ArrayType& m)\n{\n  typedef typename ArrayType::Index Index;\n\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  ArrayType m1 = ArrayType::Random(rows, cols),\n            m2(rows, cols);\n\n  for (Index i = 0; i < m.rows(); ++i)\n    for (Index j = 0; j < m.cols(); ++j)\n      m2(i,j) = sqrt(m1(i,j));\n\n  VERIFY_IS_APPROX(m1.sqrt(), m2);\n  VERIFY_IS_APPROX(m1.sqrt(), Eigen::sqrt(m1));\n}\n\ntemplate<typename ArrayType> void min_max(const ArrayType& m)\n{\n  typedef typename ArrayType::Index Index;\n  typedef typename ArrayType::Scalar Scalar;\n\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  ArrayType m1 = ArrayType::Random(rows, cols);\n\n  // min/max with array\n  Scalar maxM1 = m1.maxCoeff();\n  Scalar minM1 = m1.minCoeff();\n\n  VERIFY_IS_APPROX(ArrayType::Constant(rows,cols, minM1), (m1.min)(ArrayType::Constant(rows,cols, minM1)));\n  VERIFY_IS_APPROX(m1, (m1.min)(ArrayType::Constant(rows,cols, maxM1)));\n\n  VERIFY_IS_APPROX(ArrayType::Constant(rows,cols, maxM1), (m1.max)(ArrayType::Constant(rows,cols, maxM1)));\n  VERIFY_IS_APPROX(m1, (m1.max)(ArrayType::Constant(rows,cols, minM1)));\n\n  // min/max with scalar input\n  VERIFY_IS_APPROX(ArrayType::Constant(rows,cols, minM1), (m1.min)( minM1));\n  VERIFY_IS_APPROX(m1, (m1.min)( maxM1));\n\n  VERIFY_IS_APPROX(ArrayType::Constant(rows,cols, maxM1), (m1.max)( maxM1));\n  VERIFY_IS_APPROX(m1, (m1.max)( minM1));\n\n}\n\nvoid test_array()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( array(Array<float, 1, 1>()) );\n    CALL_SUBTEST_2( array(Array22f()) );\n    CALL_SUBTEST_3( array(Array44d()) );\n    CALL_SUBTEST_4( array(ArrayXXcf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n    CALL_SUBTEST_5( array(ArrayXXf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n    CALL_SUBTEST_6( array(ArrayXXi(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n  }\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( comparisons(Array<float, 1, 1>()) );\n    CALL_SUBTEST_2( comparisons(Array22f()) );\n    CALL_SUBTEST_3( comparisons(Array44d()) );\n    CALL_SUBTEST_5( comparisons(ArrayXXf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n    CALL_SUBTEST_6( comparisons(ArrayXXi(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n  }\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( min_max(Array<float, 1, 1>()) );\n    CALL_SUBTEST_2( min_max(Array22f()) );\n    CALL_SUBTEST_3( min_max(Array44d()) );\n    CALL_SUBTEST_5( min_max(ArrayXXf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n    CALL_SUBTEST_6( min_max(ArrayXXi(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n  }\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( array_real(Array<float, 1, 1>()) );\n    CALL_SUBTEST_2( array_real(Array22f()) );\n    CALL_SUBTEST_3( array_real(Array44d()) );\n    CALL_SUBTEST_5( array_real(ArrayXXf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n  }\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_4( array_complex(ArrayXXcf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n  }\n\n  VERIFY((internal::is_same< internal::global_math_functions_filtering_base<int>::type, int >::value));\n  VERIFY((internal::is_same< internal::global_math_functions_filtering_base<float>::type, float >::value));\n  VERIFY((internal::is_same< internal::global_math_functions_filtering_base<Array2i>::type, ArrayBase<Array2i> >::value));\n  typedef CwiseUnaryOp<internal::scalar_sum_op<double>, ArrayXd > Xpr;\n  VERIFY((internal::is_same< internal::global_math_functions_filtering_base<Xpr>::type,\n                           ArrayBase<Xpr>\n                         >::value));\n}\n"
  },
  {
    "path": "libs/eigen/test/array_for_matrix.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\ntemplate<typename MatrixType> void array_for_matrix(const MatrixType& m)\n{\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> ColVectorType;\n  typedef Matrix<Scalar, 1, MatrixType::ColsAtCompileTime> RowVectorType; \n\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  MatrixType m1 = MatrixType::Random(rows, cols),\n             m2 = MatrixType::Random(rows, cols),\n             m3(rows, cols);\n\n  ColVectorType cv1 = ColVectorType::Random(rows);\n  RowVectorType rv1 = RowVectorType::Random(cols);\n  \n  Scalar  s1 = internal::random<Scalar>(),\n          s2 = internal::random<Scalar>();\n          \n  // scalar addition\n  VERIFY_IS_APPROX(m1.array() + s1, s1 + m1.array());\n  VERIFY_IS_APPROX((m1.array() + s1).matrix(), MatrixType::Constant(rows,cols,s1) + m1);\n  VERIFY_IS_APPROX(((m1*Scalar(2)).array() - s2).matrix(), (m1+m1) - MatrixType::Constant(rows,cols,s2) );\n  m3 = m1;\n  m3.array() += s2;\n  VERIFY_IS_APPROX(m3, (m1.array() + s2).matrix());\n  m3 = m1;\n  m3.array() -= s1;\n  VERIFY_IS_APPROX(m3, (m1.array() - s1).matrix());\n\n  // reductions\n  VERIFY_IS_MUCH_SMALLER_THAN(m1.colwise().sum().sum() - m1.sum(), m1.squaredNorm());\n  VERIFY_IS_MUCH_SMALLER_THAN(m1.rowwise().sum().sum() - m1.sum(), m1.squaredNorm());\n  VERIFY_IS_MUCH_SMALLER_THAN(m1.colwise().sum() + m2.colwise().sum() - (m1+m2).colwise().sum(), (m1+m2).squaredNorm());\n  VERIFY_IS_MUCH_SMALLER_THAN(m1.rowwise().sum() - m2.rowwise().sum() - (m1-m2).rowwise().sum(), (m1-m2).squaredNorm());\n  VERIFY_IS_APPROX(m1.colwise().sum(), m1.colwise().redux(internal::scalar_sum_op<Scalar>()));\n\n  // vector-wise ops\n  m3 = m1;\n  VERIFY_IS_APPROX(m3.colwise() += cv1, m1.colwise() + cv1);\n  m3 = m1;\n  VERIFY_IS_APPROX(m3.colwise() -= cv1, m1.colwise() - cv1);\n  m3 = m1;\n  VERIFY_IS_APPROX(m3.rowwise() += rv1, m1.rowwise() + rv1);\n  m3 = m1;\n  VERIFY_IS_APPROX(m3.rowwise() -= rv1, m1.rowwise() - rv1);\n  \n  // empty objects\n  VERIFY_IS_APPROX(m1.block(0,0,0,cols).colwise().sum(),  RowVectorType::Zero(cols));\n  VERIFY_IS_APPROX(m1.block(0,0,rows,0).rowwise().prod(), ColVectorType::Ones(rows));\n  \n  // verify the const accessors exist\n  const Scalar& ref_m1 = m.matrix().array().coeffRef(0);\n  const Scalar& ref_m2 = m.matrix().array().coeffRef(0,0);\n  const Scalar& ref_a1 = m.array().matrix().coeffRef(0);\n  const Scalar& ref_a2 = m.array().matrix().coeffRef(0,0);\n  VERIFY(&ref_a1 == &ref_m1);\n  VERIFY(&ref_a2 == &ref_m2);\n}\n\ntemplate<typename MatrixType> void comparisons(const MatrixType& m)\n{\n  using std::abs;\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  Index r = internal::random<Index>(0, rows-1),\n        c = internal::random<Index>(0, cols-1);\n\n  MatrixType m1 = MatrixType::Random(rows, cols),\n             m2 = MatrixType::Random(rows, cols),\n             m3(rows, cols);\n\n  VERIFY(((m1.array() + Scalar(1)) > m1.array()).all());\n  VERIFY(((m1.array() - Scalar(1)) < m1.array()).all());\n  if (rows*cols>1)\n  {\n    m3 = m1;\n    m3(r,c) += 1;\n    VERIFY(! (m1.array() < m3.array()).all() );\n    VERIFY(! (m1.array() > m3.array()).all() );\n  }\n\n  // comparisons to scalar\n  VERIFY( (m1.array() != (m1(r,c)+1) ).any() );\n  VERIFY( (m1.array() > (m1(r,c)-1) ).any() );\n  VERIFY( (m1.array() < (m1(r,c)+1) ).any() );\n  VERIFY( (m1.array() == m1(r,c) ).any() );\n  VERIFY( m1.cwiseEqual(m1(r,c)).any() );\n\n  // test Select\n  VERIFY_IS_APPROX( (m1.array()<m2.array()).select(m1,m2), m1.cwiseMin(m2) );\n  VERIFY_IS_APPROX( (m1.array()>m2.array()).select(m1,m2), m1.cwiseMax(m2) );\n  Scalar mid = (m1.cwiseAbs().minCoeff() + m1.cwiseAbs().maxCoeff())/Scalar(2);\n  for (int j=0; j<cols; ++j)\n  for (int i=0; i<rows; ++i)\n    m3(i,j) = abs(m1(i,j))<mid ? 0 : m1(i,j);\n  VERIFY_IS_APPROX( (m1.array().abs()<MatrixType::Constant(rows,cols,mid).array())\n                        .select(MatrixType::Zero(rows,cols),m1), m3);\n  // shorter versions:\n  VERIFY_IS_APPROX( (m1.array().abs()<MatrixType::Constant(rows,cols,mid).array())\n                        .select(0,m1), m3);\n  VERIFY_IS_APPROX( (m1.array().abs()>=MatrixType::Constant(rows,cols,mid).array())\n                        .select(m1,0), m3);\n  // even shorter version:\n  VERIFY_IS_APPROX( (m1.array().abs()<mid).select(0,m1), m3);\n\n  // count\n  VERIFY(((m1.array().abs()+1)>RealScalar(0.1)).count() == rows*cols);\n\n  typedef Matrix<typename MatrixType::Index, Dynamic, 1> VectorOfIndices;\n\n  // TODO allows colwise/rowwise for array\n  VERIFY_IS_APPROX(((m1.array().abs()+1)>RealScalar(0.1)).matrix().colwise().count(), VectorOfIndices::Constant(cols,rows).transpose());\n  VERIFY_IS_APPROX(((m1.array().abs()+1)>RealScalar(0.1)).matrix().rowwise().count(), VectorOfIndices::Constant(rows, cols));\n}\n\ntemplate<typename VectorType> void lpNorm(const VectorType& v)\n{\n  using std::sqrt;\n  VectorType u = VectorType::Random(v.size());\n\n  VERIFY_IS_APPROX(u.template lpNorm<Infinity>(), u.cwiseAbs().maxCoeff());\n  VERIFY_IS_APPROX(u.template lpNorm<1>(), u.cwiseAbs().sum());\n  VERIFY_IS_APPROX(u.template lpNorm<2>(), sqrt(u.array().abs().square().sum()));\n  VERIFY_IS_APPROX(numext::pow(u.template lpNorm<5>(), typename VectorType::RealScalar(5)), u.array().abs().pow(5).sum());\n}\n\ntemplate<typename MatrixType> void cwise_min_max(const MatrixType& m)\n{\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  MatrixType m1 = MatrixType::Random(rows, cols);\n\n  // min/max with array\n  Scalar maxM1 = m1.maxCoeff();\n  Scalar minM1 = m1.minCoeff();\n\n  VERIFY_IS_APPROX(MatrixType::Constant(rows,cols, minM1), m1.cwiseMin(MatrixType::Constant(rows,cols, minM1)));\n  VERIFY_IS_APPROX(m1, m1.cwiseMin(MatrixType::Constant(rows,cols, maxM1)));\n\n  VERIFY_IS_APPROX(MatrixType::Constant(rows,cols, maxM1), m1.cwiseMax(MatrixType::Constant(rows,cols, maxM1)));\n  VERIFY_IS_APPROX(m1, m1.cwiseMax(MatrixType::Constant(rows,cols, minM1)));\n\n  // min/max with scalar input\n  VERIFY_IS_APPROX(MatrixType::Constant(rows,cols, minM1), m1.cwiseMin( minM1));\n  VERIFY_IS_APPROX(m1, m1.cwiseMin(maxM1));\n  VERIFY_IS_APPROX(-m1, (-m1).cwiseMin(-minM1));\n  VERIFY_IS_APPROX(-m1.array(), ((-m1).array().min)( -minM1));\n\n  VERIFY_IS_APPROX(MatrixType::Constant(rows,cols, maxM1), m1.cwiseMax( maxM1));\n  VERIFY_IS_APPROX(m1, m1.cwiseMax(minM1));\n  VERIFY_IS_APPROX(-m1, (-m1).cwiseMax(-maxM1));\n  VERIFY_IS_APPROX(-m1.array(), ((-m1).array().max)(-maxM1));\n\n  VERIFY_IS_APPROX(MatrixType::Constant(rows,cols, minM1).array(), (m1.array().min)( minM1));\n  VERIFY_IS_APPROX(m1.array(), (m1.array().min)( maxM1));\n\n  VERIFY_IS_APPROX(MatrixType::Constant(rows,cols, maxM1).array(), (m1.array().max)( maxM1));\n  VERIFY_IS_APPROX(m1.array(), (m1.array().max)( minM1));\n\n}\n\ntemplate<typename MatrixTraits> void resize(const MatrixTraits& t)\n{\n  typedef typename MatrixTraits::Index Index;\n  typedef typename MatrixTraits::Scalar Scalar;\n  typedef Matrix<Scalar,Dynamic,Dynamic> MatrixType;\n  typedef Array<Scalar,Dynamic,Dynamic> Array2DType;\n  typedef Matrix<Scalar,Dynamic,1> VectorType;\n  typedef Array<Scalar,Dynamic,1> Array1DType;\n\n  Index rows = t.rows(), cols = t.cols();\n\n  MatrixType m(rows,cols);\n  VectorType v(rows);\n  Array2DType a2(rows,cols);\n  Array1DType a1(rows);\n\n  m.array().resize(rows+1,cols+1);\n  VERIFY(m.rows()==rows+1 && m.cols()==cols+1);\n  a2.matrix().resize(rows+1,cols+1);\n  VERIFY(a2.rows()==rows+1 && a2.cols()==cols+1);\n  v.array().resize(cols);\n  VERIFY(v.size()==cols);\n  a1.matrix().resize(cols);\n  VERIFY(a1.size()==cols);\n}\n\nvoid regression_bug_654()\n{\n  ArrayXf a = RowVectorXf(3);\n  VectorXf v = Array<float,1,Dynamic>(3);\n}\n\nvoid test_array_for_matrix()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( array_for_matrix(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( array_for_matrix(Matrix2f()) );\n    CALL_SUBTEST_3( array_for_matrix(Matrix4d()) );\n    CALL_SUBTEST_4( array_for_matrix(MatrixXcf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n    CALL_SUBTEST_5( array_for_matrix(MatrixXf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n    CALL_SUBTEST_6( array_for_matrix(MatrixXi(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n  }\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( comparisons(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( comparisons(Matrix2f()) );\n    CALL_SUBTEST_3( comparisons(Matrix4d()) );\n    CALL_SUBTEST_5( comparisons(MatrixXf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n    CALL_SUBTEST_6( comparisons(MatrixXi(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n  }\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( cwise_min_max(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( cwise_min_max(Matrix2f()) );\n    CALL_SUBTEST_3( cwise_min_max(Matrix4d()) );\n    CALL_SUBTEST_5( cwise_min_max(MatrixXf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n    CALL_SUBTEST_6( cwise_min_max(MatrixXi(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n  }\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( lpNorm(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( lpNorm(Vector2f()) );\n    CALL_SUBTEST_7( lpNorm(Vector3d()) );\n    CALL_SUBTEST_8( lpNorm(Vector4f()) );\n    CALL_SUBTEST_5( lpNorm(VectorXf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n    CALL_SUBTEST_4( lpNorm(VectorXcf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n  }\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_4( resize(MatrixXcf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n    CALL_SUBTEST_5( resize(MatrixXf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n    CALL_SUBTEST_6( resize(MatrixXi(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n  }\n  CALL_SUBTEST_6( regression_bug_654() );\n}\n"
  },
  {
    "path": "libs/eigen/test/array_replicate.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\ntemplate<typename MatrixType> void replicate(const MatrixType& m)\n{\n  /* this test covers the following files:\n     Replicate.cpp\n  */\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> VectorType;\n  typedef Matrix<Scalar, Dynamic, Dynamic> MatrixX;\n  typedef Matrix<Scalar, Dynamic, 1> VectorX;\n\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  MatrixType m1 = MatrixType::Random(rows, cols),\n             m2 = MatrixType::Random(rows, cols);\n\n  VectorType v1 = VectorType::Random(rows);\n\n  MatrixX x1, x2;\n  VectorX vx1;\n\n  int  f1 = internal::random<int>(1,10),\n       f2 = internal::random<int>(1,10);\n\n  x1.resize(rows*f1,cols*f2);\n  for(int j=0; j<f2; j++)\n  for(int i=0; i<f1; i++)\n    x1.block(i*rows,j*cols,rows,cols) = m1;\n  VERIFY_IS_APPROX(x1, m1.replicate(f1,f2));\n\n  x2.resize(2*rows,3*cols);\n  x2 << m2, m2, m2,\n        m2, m2, m2;\n  VERIFY_IS_APPROX(x2, (m2.template replicate<2,3>()));\n\n  x2.resize(rows,f1);\n  for (int j=0; j<f1; ++j)\n    x2.col(j) = v1;\n  VERIFY_IS_APPROX(x2, v1.rowwise().replicate(f1));\n\n  vx1.resize(rows*f2);\n  for (int j=0; j<f2; ++j)\n    vx1.segment(j*rows,rows) = v1;\n  VERIFY_IS_APPROX(vx1, v1.colwise().replicate(f2));\n}\n\nvoid test_array_replicate()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( replicate(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( replicate(Vector2f()) );\n    CALL_SUBTEST_3( replicate(Vector3d()) );\n    CALL_SUBTEST_4( replicate(Vector4f()) );\n    CALL_SUBTEST_5( replicate(VectorXf(16)) );\n    CALL_SUBTEST_6( replicate(VectorXcd(10)) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/array_reverse.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n// Copyright (C) 2009 Ricard Marxer <email@ricardmarxer.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <iostream>\n\nusing namespace std;\n\ntemplate<typename MatrixType> void reverse(const MatrixType& m)\n{\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> VectorType;\n\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  // this test relies a lot on Random.h, and there's not much more that we can do\n  // to test it, hence I consider that we will have tested Random.h\n  MatrixType m1 = MatrixType::Random(rows, cols);\n  VectorType v1 = VectorType::Random(rows);\n\n  MatrixType m1_r = m1.reverse();\n  // Verify that MatrixBase::reverse() works\n  for ( int i = 0; i < rows; i++ ) {\n    for ( int j = 0; j < cols; j++ ) {\n      VERIFY_IS_APPROX(m1_r(i, j), m1(rows - 1 - i, cols - 1 - j));\n    }\n  }\n\n  Reverse<MatrixType> m1_rd(m1);\n  // Verify that a Reverse default (in both directions) of an expression works\n  for ( int i = 0; i < rows; i++ ) {\n    for ( int j = 0; j < cols; j++ ) {\n      VERIFY_IS_APPROX(m1_rd(i, j), m1(rows - 1 - i, cols - 1 - j));\n    }\n  }\n\n  Reverse<MatrixType, BothDirections> m1_rb(m1);\n  // Verify that a Reverse in both directions of an expression works\n  for ( int i = 0; i < rows; i++ ) {\n    for ( int j = 0; j < cols; j++ ) {\n      VERIFY_IS_APPROX(m1_rb(i, j), m1(rows - 1 - i, cols - 1 - j));\n    }\n  }\n\n  Reverse<MatrixType, Vertical> m1_rv(m1);\n  // Verify that a Reverse in the vertical directions of an expression works\n  for ( int i = 0; i < rows; i++ ) {\n    for ( int j = 0; j < cols; j++ ) {\n      VERIFY_IS_APPROX(m1_rv(i, j), m1(rows - 1 - i, j));\n    }\n  }\n\n  Reverse<MatrixType, Horizontal> m1_rh(m1);\n  // Verify that a Reverse in the horizontal directions of an expression works\n  for ( int i = 0; i < rows; i++ ) {\n    for ( int j = 0; j < cols; j++ ) {\n      VERIFY_IS_APPROX(m1_rh(i, j), m1(i, cols - 1 - j));\n    }\n  }\n\n  VectorType v1_r = v1.reverse();\n  // Verify that a VectorType::reverse() of an expression works\n  for ( int i = 0; i < rows; i++ ) {\n    VERIFY_IS_APPROX(v1_r(i), v1(rows - 1 - i));\n  }\n\n  MatrixType m1_cr = m1.colwise().reverse();\n  // Verify that PartialRedux::reverse() works (for colwise())\n  for ( int i = 0; i < rows; i++ ) {\n    for ( int j = 0; j < cols; j++ ) {\n      VERIFY_IS_APPROX(m1_cr(i, j), m1(rows - 1 - i, j));\n    }\n  }\n\n  MatrixType m1_rr = m1.rowwise().reverse();\n  // Verify that PartialRedux::reverse() works (for rowwise())\n  for ( int i = 0; i < rows; i++ ) {\n    for ( int j = 0; j < cols; j++ ) {\n      VERIFY_IS_APPROX(m1_rr(i, j), m1(i, cols - 1 - j));\n    }\n  }\n\n  Scalar x = internal::random<Scalar>();\n\n  Index r = internal::random<Index>(0, rows-1),\n        c = internal::random<Index>(0, cols-1);\n\n  m1.reverse()(r, c) = x;\n  VERIFY_IS_APPROX(x, m1(rows - 1 - r, cols - 1 - c));\n\n  /*\n  m1.colwise().reverse()(r, c) = x;\n  VERIFY_IS_APPROX(x, m1(rows - 1 - r, c));\n\n  m1.rowwise().reverse()(r, c) = x;\n  VERIFY_IS_APPROX(x, m1(r, cols - 1 - c));\n  */\n}\n\nvoid test_array_reverse()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( reverse(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( reverse(Matrix2f()) );\n    CALL_SUBTEST_3( reverse(Matrix4f()) );\n    CALL_SUBTEST_4( reverse(Matrix4d()) );\n    CALL_SUBTEST_5( reverse(MatrixXcf(3, 3)) );\n    CALL_SUBTEST_6( reverse(MatrixXi(6, 3)) );\n    CALL_SUBTEST_7( reverse(MatrixXcd(20, 20)) );\n    CALL_SUBTEST_8( reverse(Matrix<float, 100, 100>()) );\n    CALL_SUBTEST_9( reverse(Matrix<float,Dynamic,Dynamic,RowMajor>(6,3)) );\n  }\n#ifdef EIGEN_TEST_PART_3\n  Vector4f x; x << 1, 2, 3, 4;\n  Vector4f y; y << 4, 3, 2, 1;\n  VERIFY(x.reverse()[1] == 3);\n  VERIFY(x.reverse() == y);\n#endif\n}\n"
  },
  {
    "path": "libs/eigen/test/bandmatrix.cpp",
    "content": "// This file is triangularView of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\ntemplate<typename MatrixType> void bandmatrix(const MatrixType& _m)\n{\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  typedef Matrix<Scalar,Dynamic,Dynamic> DenseMatrixType;\n\n  Index rows = _m.rows();\n  Index cols = _m.cols();\n  Index supers = _m.supers();\n  Index subs = _m.subs();\n\n  MatrixType m(rows,cols,supers,subs);\n\n  DenseMatrixType dm1(rows,cols);\n  dm1.setZero();\n\n  m.diagonal().setConstant(123);\n  dm1.diagonal().setConstant(123);\n  for (int i=1; i<=m.supers();++i)\n  {\n    m.diagonal(i).setConstant(static_cast<RealScalar>(i));\n    dm1.diagonal(i).setConstant(static_cast<RealScalar>(i));\n  }\n  for (int i=1; i<=m.subs();++i)\n  {\n    m.diagonal(-i).setConstant(-static_cast<RealScalar>(i));\n    dm1.diagonal(-i).setConstant(-static_cast<RealScalar>(i));\n  }\n  //std::cerr << m.m_data << \"\\n\\n\" << m.toDense() << \"\\n\\n\" << dm1 << \"\\n\\n\\n\\n\";\n  VERIFY_IS_APPROX(dm1,m.toDenseMatrix());\n\n  for (int i=0; i<cols; ++i)\n  {\n    m.col(i).setConstant(static_cast<RealScalar>(i+1));\n    dm1.col(i).setConstant(static_cast<RealScalar>(i+1));\n  }\n  Index d = (std::min)(rows,cols);\n  Index a = std::max<Index>(0,cols-d-supers);\n  Index b = std::max<Index>(0,rows-d-subs);\n  if(a>0) dm1.block(0,d+supers,rows,a).setZero();\n  dm1.block(0,supers+1,cols-supers-1-a,cols-supers-1-a).template triangularView<Upper>().setZero();\n  dm1.block(subs+1,0,rows-subs-1-b,rows-subs-1-b).template triangularView<Lower>().setZero();\n  if(b>0) dm1.block(d+subs,0,b,cols).setZero();\n  //std::cerr << m.m_data << \"\\n\\n\" << m.toDense() << \"\\n\\n\" << dm1 << \"\\n\\n\";\n  VERIFY_IS_APPROX(dm1,m.toDenseMatrix());\n\n}\n\nusing Eigen::internal::BandMatrix;\n\nvoid test_bandmatrix()\n{\n  typedef BandMatrix<float>::Index Index;\n\n  for(int i = 0; i < 10*g_repeat ; i++) {\n    Index rows = internal::random<Index>(1,10);\n    Index cols = internal::random<Index>(1,10);\n    Index sups = internal::random<Index>(0,cols-1);\n    Index subs = internal::random<Index>(0,rows-1);\n    CALL_SUBTEST(bandmatrix(BandMatrix<float>(rows,cols,sups,subs)) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/basicstuff.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#define EIGEN_NO_STATIC_ASSERT\n\n#include \"main.h\"\n\ntemplate<typename MatrixType> void basicStuff(const MatrixType& m)\n{\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> VectorType;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, MatrixType::RowsAtCompileTime> SquareMatrixType;\n\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  // this test relies a lot on Random.h, and there's not much more that we can do\n  // to test it, hence I consider that we will have tested Random.h\n  MatrixType m1 = MatrixType::Random(rows, cols),\n             m2 = MatrixType::Random(rows, cols),\n             m3(rows, cols),\n             mzero = MatrixType::Zero(rows, cols),\n             square = Matrix<Scalar, MatrixType::RowsAtCompileTime, MatrixType::RowsAtCompileTime>::Random(rows, rows);\n  VectorType v1 = VectorType::Random(rows),\n             vzero = VectorType::Zero(rows);\n  SquareMatrixType sm1 = SquareMatrixType::Random(rows,rows), sm2(rows,rows);\n\n  Scalar x = 0;\n  while(x == Scalar(0)) x = internal::random<Scalar>();\n\n  Index r = internal::random<Index>(0, rows-1),\n        c = internal::random<Index>(0, cols-1);\n\n  m1.coeffRef(r,c) = x;\n  VERIFY_IS_APPROX(x, m1.coeff(r,c));\n  m1(r,c) = x;\n  VERIFY_IS_APPROX(x, m1(r,c));\n  v1.coeffRef(r) = x;\n  VERIFY_IS_APPROX(x, v1.coeff(r));\n  v1(r) = x;\n  VERIFY_IS_APPROX(x, v1(r));\n  v1[r] = x;\n  VERIFY_IS_APPROX(x, v1[r]);\n\n  VERIFY_IS_APPROX(               v1,    v1);\n  VERIFY_IS_NOT_APPROX(           v1,    2*v1);\n  VERIFY_IS_MUCH_SMALLER_THAN(    vzero, v1);\n  VERIFY_IS_MUCH_SMALLER_THAN(  vzero, v1.squaredNorm());\n  VERIFY_IS_NOT_MUCH_SMALLER_THAN(v1,    v1);\n  VERIFY_IS_APPROX(               vzero, v1-v1);\n  VERIFY_IS_APPROX(               m1,    m1);\n  VERIFY_IS_NOT_APPROX(           m1,    2*m1);\n  VERIFY_IS_MUCH_SMALLER_THAN(    mzero, m1);\n  VERIFY_IS_NOT_MUCH_SMALLER_THAN(m1,    m1);\n  VERIFY_IS_APPROX(               mzero, m1-m1);\n\n  // always test operator() on each read-only expression class,\n  // in order to check const-qualifiers.\n  // indeed, if an expression class (here Zero) is meant to be read-only,\n  // hence has no _write() method, the corresponding MatrixBase method (here zero())\n  // should return a const-qualified object so that it is the const-qualified\n  // operator() that gets called, which in turn calls _read().\n  VERIFY_IS_MUCH_SMALLER_THAN(MatrixType::Zero(rows,cols)(r,c), static_cast<Scalar>(1));\n\n  // now test copying a row-vector into a (column-)vector and conversely.\n  square.col(r) = square.row(r).eval();\n  Matrix<Scalar, 1, MatrixType::RowsAtCompileTime> rv(rows);\n  Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> cv(rows);\n  rv = square.row(r);\n  cv = square.col(r);\n  \n  VERIFY_IS_APPROX(rv, cv.transpose());\n\n  if(cols!=1 && rows!=1 && MatrixType::SizeAtCompileTime!=Dynamic)\n  {\n    VERIFY_RAISES_ASSERT(m1 = (m2.block(0,0, rows-1, cols-1)));\n  }\n\n  if(cols!=1 && rows!=1)\n  {\n    VERIFY_RAISES_ASSERT(m1[0]);\n    VERIFY_RAISES_ASSERT((m1+m1)[0]);\n  }\n\n  VERIFY_IS_APPROX(m3 = m1,m1);\n  MatrixType m4;\n  VERIFY_IS_APPROX(m4 = m1,m1);\n\n  m3.real() = m1.real();\n  VERIFY_IS_APPROX(static_cast<const MatrixType&>(m3).real(), static_cast<const MatrixType&>(m1).real());\n  VERIFY_IS_APPROX(static_cast<const MatrixType&>(m3).real(), m1.real());\n\n  // check == / != operators\n  VERIFY(m1==m1);\n  VERIFY(m1!=m2);\n  VERIFY(!(m1==m2));\n  VERIFY(!(m1!=m1));\n  m1 = m2;\n  VERIFY(m1==m2);\n  VERIFY(!(m1!=m2));\n  \n  // check automatic transposition\n  sm2.setZero();\n  for(typename MatrixType::Index i=0;i<rows;++i)\n    sm2.col(i) = sm1.row(i);\n  VERIFY_IS_APPROX(sm2,sm1.transpose());\n  \n  sm2.setZero();\n  for(typename MatrixType::Index i=0;i<rows;++i)\n    sm2.col(i).noalias() = sm1.row(i);\n  VERIFY_IS_APPROX(sm2,sm1.transpose());\n  \n  sm2.setZero();\n  for(typename MatrixType::Index i=0;i<rows;++i)\n    sm2.col(i).noalias() += sm1.row(i);\n  VERIFY_IS_APPROX(sm2,sm1.transpose());\n  \n  sm2.setZero();\n  for(typename MatrixType::Index i=0;i<rows;++i)\n    sm2.col(i).noalias() -= sm1.row(i);\n  VERIFY_IS_APPROX(sm2,-sm1.transpose());\n}\n\ntemplate<typename MatrixType> void basicStuffComplex(const MatrixType& m)\n{\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  typedef Matrix<RealScalar, MatrixType::RowsAtCompileTime, MatrixType::ColsAtCompileTime> RealMatrixType;\n\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  Scalar s1 = internal::random<Scalar>(),\n         s2 = internal::random<Scalar>();\n\n  VERIFY(numext::real(s1)==numext::real_ref(s1));\n  VERIFY(numext::imag(s1)==numext::imag_ref(s1));\n  numext::real_ref(s1) = numext::real(s2);\n  numext::imag_ref(s1) = numext::imag(s2);\n  VERIFY(internal::isApprox(s1, s2, NumTraits<RealScalar>::epsilon()));\n  // extended precision in Intel FPUs means that s1 == s2 in the line above is not guaranteed.\n\n  RealMatrixType rm1 = RealMatrixType::Random(rows,cols),\n                 rm2 = RealMatrixType::Random(rows,cols);\n  MatrixType cm(rows,cols);\n  cm.real() = rm1;\n  cm.imag() = rm2;\n  VERIFY_IS_APPROX(static_cast<const MatrixType&>(cm).real(), rm1);\n  VERIFY_IS_APPROX(static_cast<const MatrixType&>(cm).imag(), rm2);\n  rm1.setZero();\n  rm2.setZero();\n  rm1 = cm.real();\n  rm2 = cm.imag();\n  VERIFY_IS_APPROX(static_cast<const MatrixType&>(cm).real(), rm1);\n  VERIFY_IS_APPROX(static_cast<const MatrixType&>(cm).imag(), rm2);\n  cm.real().setZero();\n  VERIFY(static_cast<const MatrixType&>(cm).real().isZero());\n  VERIFY(!static_cast<const MatrixType&>(cm).imag().isZero());\n}\n\n#ifdef EIGEN_TEST_PART_2\nvoid casting()\n{\n  Matrix4f m = Matrix4f::Random(), m2;\n  Matrix4d n = m.cast<double>();\n  VERIFY(m.isApprox(n.cast<float>()));\n  m2 = m.cast<float>(); // check the specialization when NewType == Type\n  VERIFY(m.isApprox(m2));\n}\n#endif\n\ntemplate <typename Scalar>\nvoid fixedSizeMatrixConstruction()\n{\n  const Scalar raw[3] = {1,2,3};\n  Matrix<Scalar,3,1> m(raw);\n  Array<Scalar,3,1> a(raw);\n  VERIFY(m(0) == 1);\n  VERIFY(m(1) == 2);\n  VERIFY(m(2) == 3);\n  VERIFY(a(0) == 1);\n  VERIFY(a(1) == 2);\n  VERIFY(a(2) == 3);  \n}\n\nvoid test_basicstuff()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( basicStuff(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( basicStuff(Matrix4d()) );\n    CALL_SUBTEST_3( basicStuff(MatrixXcf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n    CALL_SUBTEST_4( basicStuff(MatrixXi(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n    CALL_SUBTEST_5( basicStuff(MatrixXcd(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n    CALL_SUBTEST_6( basicStuff(Matrix<float, 100, 100>()) );\n    CALL_SUBTEST_7( basicStuff(Matrix<long double,Dynamic,Dynamic>(internal::random<int>(1,EIGEN_TEST_MAX_SIZE),internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n\n    CALL_SUBTEST_3( basicStuffComplex(MatrixXcf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n    CALL_SUBTEST_5( basicStuffComplex(MatrixXcd(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n  }\n\n  CALL_SUBTEST_1(fixedSizeMatrixConstruction<unsigned char>());\n  CALL_SUBTEST_1(fixedSizeMatrixConstruction<double>());\n  CALL_SUBTEST_1(fixedSizeMatrixConstruction<double>());\n\n  CALL_SUBTEST_2(casting());\n}\n"
  },
  {
    "path": "libs/eigen/test/bicgstab.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2011 Gael Guennebaud <g.gael@free.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"sparse_solver.h\"\n#include <Eigen/IterativeLinearSolvers>\n\ntemplate<typename T> void test_bicgstab_T()\n{\n  BiCGSTAB<SparseMatrix<T>, DiagonalPreconditioner<T> > bicgstab_colmajor_diag;\n  BiCGSTAB<SparseMatrix<T>, IdentityPreconditioner    > bicgstab_colmajor_I;\n  BiCGSTAB<SparseMatrix<T>, IncompleteLUT<T> >           bicgstab_colmajor_ilut;\n  //BiCGSTAB<SparseMatrix<T>, SSORPreconditioner<T> >     bicgstab_colmajor_ssor;\n\n  CALL_SUBTEST( check_sparse_square_solving(bicgstab_colmajor_diag)  );\n//   CALL_SUBTEST( check_sparse_square_solving(bicgstab_colmajor_I)     );\n  CALL_SUBTEST( check_sparse_square_solving(bicgstab_colmajor_ilut)     );\n  //CALL_SUBTEST( check_sparse_square_solving(bicgstab_colmajor_ssor)     );\n}\n\nvoid test_bicgstab()\n{\n  CALL_SUBTEST_1(test_bicgstab_T<double>());\n  CALL_SUBTEST_2(test_bicgstab_T<std::complex<double> >());\n}\n"
  },
  {
    "path": "libs/eigen/test/block.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2006-2010 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#define EIGEN_NO_STATIC_ASSERT // otherwise we fail at compile time on unused paths\n#include \"main.h\"\n\ntemplate<typename MatrixType, typename Index, typename Scalar>\ntypename Eigen::internal::enable_if<!NumTraits<typename MatrixType::Scalar>::IsComplex,typename MatrixType::Scalar>::type\nblock_real_only(const MatrixType &m1, Index r1, Index r2, Index c1, Index c2, const Scalar& s1) {\n  // check cwise-Functions:\n  VERIFY_IS_APPROX(m1.row(r1).cwiseMax(s1), m1.cwiseMax(s1).row(r1));\n  VERIFY_IS_APPROX(m1.col(c1).cwiseMin(s1), m1.cwiseMin(s1).col(c1));\n\n  VERIFY_IS_APPROX(m1.block(r1,c1,r2-r1+1,c2-c1+1).cwiseMin(s1), m1.cwiseMin(s1).block(r1,c1,r2-r1+1,c2-c1+1));\n  VERIFY_IS_APPROX(m1.block(r1,c1,r2-r1+1,c2-c1+1).cwiseMax(s1), m1.cwiseMax(s1).block(r1,c1,r2-r1+1,c2-c1+1));\n  \n  return Scalar(0);\n}\n\ntemplate<typename MatrixType, typename Index, typename Scalar>\ntypename Eigen::internal::enable_if<NumTraits<typename MatrixType::Scalar>::IsComplex,typename MatrixType::Scalar>::type\nblock_real_only(const MatrixType &, Index, Index, Index, Index, const Scalar&) {\n  return Scalar(0);\n}\n\n\ntemplate<typename MatrixType> void block(const MatrixType& m)\n{\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename MatrixType::RealScalar RealScalar;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> VectorType;\n  typedef Matrix<Scalar, 1, MatrixType::ColsAtCompileTime> RowVectorType;\n  typedef Matrix<Scalar, Dynamic, Dynamic> DynamicMatrixType;\n  typedef Matrix<Scalar, Dynamic, 1> DynamicVectorType;\n  \n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  MatrixType m1 = MatrixType::Random(rows, cols),\n             m1_copy = m1,\n             m2 = MatrixType::Random(rows, cols),\n             m3(rows, cols),\n             ones = MatrixType::Ones(rows, cols);\n  VectorType v1 = VectorType::Random(rows);\n\n  Scalar s1 = internal::random<Scalar>();\n\n  Index r1 = internal::random<Index>(0,rows-1);\n  Index r2 = internal::random<Index>(r1,rows-1);\n  Index c1 = internal::random<Index>(0,cols-1);\n  Index c2 = internal::random<Index>(c1,cols-1);\n\n  block_real_only(m1, r1, r2, c1, c1, s1);\n\n  //check row() and col()\n  VERIFY_IS_EQUAL(m1.col(c1).transpose(), m1.transpose().row(c1));\n  //check operator(), both constant and non-constant, on row() and col()\n  m1 = m1_copy;\n  m1.row(r1) += s1 * m1_copy.row(r2);\n  VERIFY_IS_APPROX(m1.row(r1), m1_copy.row(r1) + s1 * m1_copy.row(r2));\n  // check nested block xpr on lhs\n  m1.row(r1).row(0) += s1 * m1_copy.row(r2);\n  VERIFY_IS_APPROX(m1.row(r1), m1_copy.row(r1) + Scalar(2) * s1 * m1_copy.row(r2));\n  m1 = m1_copy;\n  m1.col(c1) += s1 * m1_copy.col(c2);\n  VERIFY_IS_APPROX(m1.col(c1), m1_copy.col(c1) + s1 * m1_copy.col(c2));\n  m1.col(c1).col(0) += s1 * m1_copy.col(c2);\n  VERIFY_IS_APPROX(m1.col(c1), m1_copy.col(c1) + Scalar(2) * s1 * m1_copy.col(c2));\n  \n  \n  //check block()\n  Matrix<Scalar,Dynamic,Dynamic> b1(1,1); b1(0,0) = m1(r1,c1);\n\n  RowVectorType br1(m1.block(r1,0,1,cols));\n  VectorType bc1(m1.block(0,c1,rows,1));\n  VERIFY_IS_EQUAL(b1, m1.block(r1,c1,1,1));\n  VERIFY_IS_EQUAL(m1.row(r1), br1);\n  VERIFY_IS_EQUAL(m1.col(c1), bc1);\n  //check operator(), both constant and non-constant, on block()\n  m1.block(r1,c1,r2-r1+1,c2-c1+1) = s1 * m2.block(0, 0, r2-r1+1,c2-c1+1);\n  m1.block(r1,c1,r2-r1+1,c2-c1+1)(r2-r1,c2-c1) = m2.block(0, 0, r2-r1+1,c2-c1+1)(0,0);\n\n  enum {\n    BlockRows = 2,\n    BlockCols = 5\n  };\n  if (rows>=5 && cols>=8)\n  {\n    // test fixed block() as lvalue\n    m1.template block<BlockRows,BlockCols>(1,1) *= s1;\n    // test operator() on fixed block() both as constant and non-constant\n    m1.template block<BlockRows,BlockCols>(1,1)(0, 3) = m1.template block<2,5>(1,1)(1,2);\n    // check that fixed block() and block() agree\n    Matrix<Scalar,Dynamic,Dynamic> b = m1.template block<BlockRows,BlockCols>(3,3);\n    VERIFY_IS_EQUAL(b, m1.block(3,3,BlockRows,BlockCols));\n\n    // same tests with mixed fixed/dynamic size\n    m1.template block<BlockRows,Dynamic>(1,1,BlockRows,BlockCols) *= s1;\n    m1.template block<BlockRows,Dynamic>(1,1,BlockRows,BlockCols)(0,3) = m1.template block<2,5>(1,1)(1,2);\n    Matrix<Scalar,Dynamic,Dynamic> b2 = m1.template block<Dynamic,BlockCols>(3,3,2,5);\n    VERIFY_IS_EQUAL(b2, m1.block(3,3,BlockRows,BlockCols));\n  }\n\n  if (rows>2)\n  {\n    // test sub vectors\n    VERIFY_IS_EQUAL(v1.template head<2>(), v1.block(0,0,2,1));\n    VERIFY_IS_EQUAL(v1.template head<2>(), v1.head(2));\n    VERIFY_IS_EQUAL(v1.template head<2>(), v1.segment(0,2));\n    VERIFY_IS_EQUAL(v1.template head<2>(), v1.template segment<2>(0));\n    Index i = rows-2;\n    VERIFY_IS_EQUAL(v1.template tail<2>(), v1.block(i,0,2,1));\n    VERIFY_IS_EQUAL(v1.template tail<2>(), v1.tail(2));\n    VERIFY_IS_EQUAL(v1.template tail<2>(), v1.segment(i,2));\n    VERIFY_IS_EQUAL(v1.template tail<2>(), v1.template segment<2>(i));\n    i = internal::random<Index>(0,rows-2);\n    VERIFY_IS_EQUAL(v1.segment(i,2), v1.template segment<2>(i));\n  }\n\n  // stress some basic stuffs with block matrices\n  VERIFY(numext::real(ones.col(c1).sum()) == RealScalar(rows));\n  VERIFY(numext::real(ones.row(r1).sum()) == RealScalar(cols));\n\n  VERIFY(numext::real(ones.col(c1).dot(ones.col(c2))) == RealScalar(rows));\n  VERIFY(numext::real(ones.row(r1).dot(ones.row(r2))) == RealScalar(cols));\n\n  // now test some block-inside-of-block.\n  \n  // expressions with direct access\n  VERIFY_IS_EQUAL( (m1.block(r1,c1,rows-r1,cols-c1).block(r2-r1,c2-c1,rows-r2,cols-c2)) , (m1.block(r2,c2,rows-r2,cols-c2)) );\n  VERIFY_IS_EQUAL( (m1.block(r1,c1,r2-r1+1,c2-c1+1).row(0)) , (m1.row(r1).segment(c1,c2-c1+1)) );\n  VERIFY_IS_EQUAL( (m1.block(r1,c1,r2-r1+1,c2-c1+1).col(0)) , (m1.col(c1).segment(r1,r2-r1+1)) );\n  VERIFY_IS_EQUAL( (m1.block(r1,c1,r2-r1+1,c2-c1+1).transpose().col(0)) , (m1.row(r1).segment(c1,c2-c1+1)).transpose() );\n  VERIFY_IS_EQUAL( (m1.transpose().block(c1,r1,c2-c1+1,r2-r1+1).col(0)) , (m1.row(r1).segment(c1,c2-c1+1)).transpose() );\n\n  // expressions without direct access\n  VERIFY_IS_EQUAL( ((m1+m2).block(r1,c1,rows-r1,cols-c1).block(r2-r1,c2-c1,rows-r2,cols-c2)) , ((m1+m2).block(r2,c2,rows-r2,cols-c2)) );\n  VERIFY_IS_EQUAL( ((m1+m2).block(r1,c1,r2-r1+1,c2-c1+1).row(0)) , ((m1+m2).row(r1).segment(c1,c2-c1+1)) );\n  VERIFY_IS_EQUAL( ((m1+m2).block(r1,c1,r2-r1+1,c2-c1+1).col(0)) , ((m1+m2).col(c1).segment(r1,r2-r1+1)) );\n  VERIFY_IS_EQUAL( ((m1+m2).block(r1,c1,r2-r1+1,c2-c1+1).transpose().col(0)) , ((m1+m2).row(r1).segment(c1,c2-c1+1)).transpose() );\n  VERIFY_IS_EQUAL( ((m1+m2).transpose().block(c1,r1,c2-c1+1,r2-r1+1).col(0)) , ((m1+m2).row(r1).segment(c1,c2-c1+1)).transpose() );\n\n  // evaluation into plain matrices from expressions with direct access (stress MapBase)\n  DynamicMatrixType dm;\n  DynamicVectorType dv;\n  dm.setZero();\n  dm = m1.block(r1,c1,rows-r1,cols-c1).block(r2-r1,c2-c1,rows-r2,cols-c2);\n  VERIFY_IS_EQUAL(dm, (m1.block(r2,c2,rows-r2,cols-c2)));\n  dm.setZero();\n  dv.setZero();\n  dm = m1.block(r1,c1,r2-r1+1,c2-c1+1).row(0).transpose();\n  dv = m1.row(r1).segment(c1,c2-c1+1);\n  VERIFY_IS_EQUAL(dv, dm);\n  dm.setZero();\n  dv.setZero();\n  dm = m1.col(c1).segment(r1,r2-r1+1);\n  dv = m1.block(r1,c1,r2-r1+1,c2-c1+1).col(0);\n  VERIFY_IS_EQUAL(dv, dm);\n  dm.setZero();\n  dv.setZero();\n  dm = m1.block(r1,c1,r2-r1+1,c2-c1+1).transpose().col(0);\n  dv = m1.row(r1).segment(c1,c2-c1+1);\n  VERIFY_IS_EQUAL(dv, dm);\n  dm.setZero();\n  dv.setZero();\n  dm = m1.row(r1).segment(c1,c2-c1+1).transpose();\n  dv = m1.transpose().block(c1,r1,c2-c1+1,r2-r1+1).col(0);\n  VERIFY_IS_EQUAL(dv, dm);\n}\n\n\ntemplate<typename MatrixType>\nvoid compare_using_data_and_stride(const MatrixType& m)\n{\n  typedef typename MatrixType::Index Index;\n  Index rows = m.rows();\n  Index cols = m.cols();\n  Index size = m.size();\n  Index innerStride = m.innerStride();\n  Index outerStride = m.outerStride();\n  Index rowStride = m.rowStride();\n  Index colStride = m.colStride();\n  const typename MatrixType::Scalar* data = m.data();\n\n  for(int j=0;j<cols;++j)\n    for(int i=0;i<rows;++i)\n      VERIFY(m.coeff(i,j) == data[i*rowStride + j*colStride]);\n\n  if(!MatrixType::IsVectorAtCompileTime)\n  {\n    for(int j=0;j<cols;++j)\n      for(int i=0;i<rows;++i)\n        VERIFY(m.coeff(i,j) == data[(MatrixType::Flags&RowMajorBit)\n                                     ? i*outerStride + j*innerStride\n                                     : j*outerStride + i*innerStride]);\n  }\n\n  if(MatrixType::IsVectorAtCompileTime)\n  {\n    VERIFY(innerStride == int((&m.coeff(1))-(&m.coeff(0))));\n    for (int i=0;i<size;++i)\n      VERIFY(m.coeff(i) == data[i*innerStride]);\n  }\n}\n\ntemplate<typename MatrixType>\nvoid data_and_stride(const MatrixType& m)\n{\n  typedef typename MatrixType::Index Index;\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  Index r1 = internal::random<Index>(0,rows-1);\n  Index r2 = internal::random<Index>(r1,rows-1);\n  Index c1 = internal::random<Index>(0,cols-1);\n  Index c2 = internal::random<Index>(c1,cols-1);\n\n  MatrixType m1 = MatrixType::Random(rows, cols);\n  compare_using_data_and_stride(m1.block(r1, c1, r2-r1+1, c2-c1+1));\n  compare_using_data_and_stride(m1.transpose().block(c1, r1, c2-c1+1, r2-r1+1));\n  compare_using_data_and_stride(m1.row(r1));\n  compare_using_data_and_stride(m1.col(c1));\n  compare_using_data_and_stride(m1.row(r1).transpose());\n  compare_using_data_and_stride(m1.col(c1).transpose());\n}\n\nvoid test_block()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( block(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( block(Matrix4d()) );\n    CALL_SUBTEST_3( block(MatrixXcf(3, 3)) );\n    CALL_SUBTEST_4( block(MatrixXi(8, 12)) );\n    CALL_SUBTEST_5( block(MatrixXcd(20, 20)) );\n    CALL_SUBTEST_6( block(MatrixXf(20, 20)) );\n\n    CALL_SUBTEST_8( block(Matrix<float,Dynamic,4>(3, 4)) );\n\n#ifndef EIGEN_DEFAULT_TO_ROW_MAJOR\n    CALL_SUBTEST_6( data_and_stride(MatrixXf(internal::random(5,50), internal::random(5,50))) );\n    CALL_SUBTEST_7( data_and_stride(Matrix<int,Dynamic,Dynamic,RowMajor>(internal::random(5,50), internal::random(5,50))) );\n#endif\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/cholesky.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_NO_ASSERTION_CHECKING\n#define EIGEN_NO_ASSERTION_CHECKING\n#endif\n\nstatic int nb_temporaries;\n\n#define EIGEN_DENSE_STORAGE_CTOR_PLUGIN { if(size!=0) nb_temporaries++; }\n\n#include \"main.h\"\n#include <Eigen/Cholesky>\n#include <Eigen/QR>\n\n#define VERIFY_EVALUATION_COUNT(XPR,N) {\\\n    nb_temporaries = 0; \\\n    XPR; \\\n    if(nb_temporaries!=N) std::cerr << \"nb_temporaries == \" << nb_temporaries << \"\\n\"; \\\n    VERIFY( (#XPR) && nb_temporaries==N ); \\\n  }\n\ntemplate<typename MatrixType,template <typename,int> class CholType> void test_chol_update(const MatrixType& symm)\n{\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename MatrixType::RealScalar RealScalar;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> VectorType;\n\n  MatrixType symmLo = symm.template triangularView<Lower>();\n  MatrixType symmUp = symm.template triangularView<Upper>();\n  MatrixType symmCpy = symm;\n\n  CholType<MatrixType,Lower> chollo(symmLo);\n  CholType<MatrixType,Upper> cholup(symmUp);\n\n  for (int k=0; k<10; ++k)\n  {\n    VectorType vec = VectorType::Random(symm.rows());\n    RealScalar sigma = internal::random<RealScalar>();\n    symmCpy += sigma * vec * vec.adjoint();\n\n    // we are doing some downdates, so it might be the case that the matrix is not SPD anymore\n    CholType<MatrixType,Lower> chol(symmCpy);\n    if(chol.info()!=Success)\n      break;\n\n    chollo.rankUpdate(vec, sigma);\n    VERIFY_IS_APPROX(symmCpy, chollo.reconstructedMatrix());\n\n    cholup.rankUpdate(vec, sigma);\n    VERIFY_IS_APPROX(symmCpy, cholup.reconstructedMatrix());\n  }\n}\n\ntemplate<typename MatrixType> void cholesky(const MatrixType& m)\n{\n  typedef typename MatrixType::Index Index;\n  /* this test covers the following files:\n     LLT.h LDLT.h\n  */\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, MatrixType::RowsAtCompileTime> SquareMatrixType;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> VectorType;\n\n  MatrixType a0 = MatrixType::Random(rows,cols);\n  VectorType vecB = VectorType::Random(rows), vecX(rows);\n  MatrixType matB = MatrixType::Random(rows,cols), matX(rows,cols);\n  SquareMatrixType symm =  a0 * a0.adjoint();\n  // let's make sure the matrix is not singular or near singular\n  for (int k=0; k<3; ++k)\n  {\n    MatrixType a1 = MatrixType::Random(rows,cols);\n    symm += a1 * a1.adjoint();\n  }\n\n  // to test if really Cholesky only uses the upper triangular part, uncomment the following\n  // FIXME: currently that fails !!\n  //symm.template part<StrictlyLower>().setZero();\n\n  {\n    SquareMatrixType symmUp = symm.template triangularView<Upper>();\n    SquareMatrixType symmLo = symm.template triangularView<Lower>();\n    \n    LLT<SquareMatrixType,Lower> chollo(symmLo);\n    VERIFY_IS_APPROX(symm, chollo.reconstructedMatrix());\n    vecX = chollo.solve(vecB);\n    VERIFY_IS_APPROX(symm * vecX, vecB);\n    matX = chollo.solve(matB);\n    VERIFY_IS_APPROX(symm * matX, matB);\n\n    // test the upper mode\n    LLT<SquareMatrixType,Upper> cholup(symmUp);\n    VERIFY_IS_APPROX(symm, cholup.reconstructedMatrix());\n    vecX = cholup.solve(vecB);\n    VERIFY_IS_APPROX(symm * vecX, vecB);\n    matX = cholup.solve(matB);\n    VERIFY_IS_APPROX(symm * matX, matB);\n\n    MatrixType neg = -symmLo;\n    chollo.compute(neg);\n    VERIFY(chollo.info()==NumericalIssue);\n\n    VERIFY_IS_APPROX(MatrixType(chollo.matrixL().transpose().conjugate()), MatrixType(chollo.matrixU()));\n    VERIFY_IS_APPROX(MatrixType(chollo.matrixU().transpose().conjugate()), MatrixType(chollo.matrixL()));\n    VERIFY_IS_APPROX(MatrixType(cholup.matrixL().transpose().conjugate()), MatrixType(cholup.matrixU()));\n    VERIFY_IS_APPROX(MatrixType(cholup.matrixU().transpose().conjugate()), MatrixType(cholup.matrixL()));\n    \n    // test some special use cases of SelfCwiseBinaryOp:\n    MatrixType m1 = MatrixType::Random(rows,cols), m2(rows,cols);\n    m2 = m1;\n    m2 += symmLo.template selfadjointView<Lower>().llt().solve(matB);\n    VERIFY_IS_APPROX(m2, m1 + symmLo.template selfadjointView<Lower>().llt().solve(matB));\n    m2 = m1;\n    m2 -= symmLo.template selfadjointView<Lower>().llt().solve(matB);\n    VERIFY_IS_APPROX(m2, m1 - symmLo.template selfadjointView<Lower>().llt().solve(matB));\n    m2 = m1;\n    m2.noalias() += symmLo.template selfadjointView<Lower>().llt().solve(matB);\n    VERIFY_IS_APPROX(m2, m1 + symmLo.template selfadjointView<Lower>().llt().solve(matB));\n    m2 = m1;\n    m2.noalias() -= symmLo.template selfadjointView<Lower>().llt().solve(matB);\n    VERIFY_IS_APPROX(m2, m1 - symmLo.template selfadjointView<Lower>().llt().solve(matB));\n  }\n\n  // LDLT\n  {\n    int sign = internal::random<int>()%2 ? 1 : -1;\n\n    if(sign == -1)\n    {\n      symm = -symm; // test a negative matrix\n    }\n\n    SquareMatrixType symmUp = symm.template triangularView<Upper>();\n    SquareMatrixType symmLo = symm.template triangularView<Lower>();\n\n    LDLT<SquareMatrixType,Lower> ldltlo(symmLo);\n    VERIFY_IS_APPROX(symm, ldltlo.reconstructedMatrix());\n    vecX = ldltlo.solve(vecB);\n    VERIFY_IS_APPROX(symm * vecX, vecB);\n    matX = ldltlo.solve(matB);\n    VERIFY_IS_APPROX(symm * matX, matB);\n\n    LDLT<SquareMatrixType,Upper> ldltup(symmUp);\n    VERIFY_IS_APPROX(symm, ldltup.reconstructedMatrix());\n    vecX = ldltup.solve(vecB);\n    VERIFY_IS_APPROX(symm * vecX, vecB);\n    matX = ldltup.solve(matB);\n    VERIFY_IS_APPROX(symm * matX, matB);\n\n    VERIFY_IS_APPROX(MatrixType(ldltlo.matrixL().transpose().conjugate()), MatrixType(ldltlo.matrixU()));\n    VERIFY_IS_APPROX(MatrixType(ldltlo.matrixU().transpose().conjugate()), MatrixType(ldltlo.matrixL()));\n    VERIFY_IS_APPROX(MatrixType(ldltup.matrixL().transpose().conjugate()), MatrixType(ldltup.matrixU()));\n    VERIFY_IS_APPROX(MatrixType(ldltup.matrixU().transpose().conjugate()), MatrixType(ldltup.matrixL()));\n\n    if(MatrixType::RowsAtCompileTime==Dynamic)\n    {\n      // note : each inplace permutation requires a small temporary vector (mask)\n\n      // check inplace solve\n      matX = matB;\n      VERIFY_EVALUATION_COUNT(matX = ldltlo.solve(matX), 0);\n      VERIFY_IS_APPROX(matX, ldltlo.solve(matB).eval());\n\n\n      matX = matB;\n      VERIFY_EVALUATION_COUNT(matX = ldltup.solve(matX), 0);\n      VERIFY_IS_APPROX(matX, ldltup.solve(matB).eval());\n    }\n\n    // restore\n    if(sign == -1)\n      symm = -symm;\n\n    // check matrices coming from linear constraints with Lagrange multipliers\n    if(rows>=3)\n    {\n      SquareMatrixType A = symm;\n      int c = internal::random<int>(0,rows-2);\n      A.bottomRightCorner(c,c).setZero();\n      // Make sure a solution exists:\n      vecX.setRandom();\n      vecB = A * vecX;\n      vecX.setZero();\n      ldltlo.compute(A);\n      VERIFY_IS_APPROX(A, ldltlo.reconstructedMatrix());\n      vecX = ldltlo.solve(vecB);\n      VERIFY_IS_APPROX(A * vecX, vecB);\n    }\n    \n    // check non-full rank matrices\n    if(rows>=3)\n    {\n      int r = internal::random<int>(1,rows-1);\n      Matrix<Scalar,Dynamic,Dynamic> a = Matrix<Scalar,Dynamic,Dynamic>::Random(rows,r);\n      SquareMatrixType A = a * a.adjoint();\n      // Make sure a solution exists:\n      vecX.setRandom();\n      vecB = A * vecX;\n      vecX.setZero();\n      ldltlo.compute(A);\n      VERIFY_IS_APPROX(A, ldltlo.reconstructedMatrix());\n      vecX = ldltlo.solve(vecB);\n      VERIFY_IS_APPROX(A * vecX, vecB);\n    }\n    \n    // check matrices with a wide spectrum\n    if(rows>=3)\n    {\n      RealScalar s = (std::min)(16,std::numeric_limits<RealScalar>::max_exponent10/8);\n      Matrix<Scalar,Dynamic,Dynamic> a = Matrix<Scalar,Dynamic,Dynamic>::Random(rows,rows);\n      Matrix<RealScalar,Dynamic,1> d =  Matrix<RealScalar,Dynamic,1>::Random(rows);\n      for(int k=0; k<rows; ++k)\n        d(k) = d(k)*std::pow(RealScalar(10),internal::random<RealScalar>(-s,s));\n      SquareMatrixType A = a * d.asDiagonal() * a.adjoint();\n      // Make sure a solution exists:\n      vecX.setRandom();\n      vecB = A * vecX;\n      vecX.setZero();\n      ldltlo.compute(A);\n      VERIFY_IS_APPROX(A, ldltlo.reconstructedMatrix());\n      vecX = ldltlo.solve(vecB);\n      VERIFY_IS_APPROX(A * vecX, vecB);\n    }\n  }\n\n  // update/downdate\n  CALL_SUBTEST(( test_chol_update<SquareMatrixType,LLT>(symm)  ));\n  CALL_SUBTEST(( test_chol_update<SquareMatrixType,LDLT>(symm) ));\n}\n\ntemplate<typename MatrixType> void cholesky_cplx(const MatrixType& m)\n{\n  // classic test\n  cholesky(m);\n\n  // test mixing real/scalar types\n\n  typedef typename MatrixType::Index Index;\n\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  typedef Matrix<RealScalar, MatrixType::RowsAtCompileTime, MatrixType::RowsAtCompileTime> RealMatrixType;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> VectorType;\n\n  RealMatrixType a0 = RealMatrixType::Random(rows,cols);\n  VectorType vecB = VectorType::Random(rows), vecX(rows);\n  MatrixType matB = MatrixType::Random(rows,cols), matX(rows,cols);\n  RealMatrixType symm =  a0 * a0.adjoint();\n  // let's make sure the matrix is not singular or near singular\n  for (int k=0; k<3; ++k)\n  {\n    RealMatrixType a1 = RealMatrixType::Random(rows,cols);\n    symm += a1 * a1.adjoint();\n  }\n\n  {\n    RealMatrixType symmLo = symm.template triangularView<Lower>();\n\n    LLT<RealMatrixType,Lower> chollo(symmLo);\n    VERIFY_IS_APPROX(symm, chollo.reconstructedMatrix());\n    vecX = chollo.solve(vecB);\n    VERIFY_IS_APPROX(symm * vecX, vecB);\n//     matX = chollo.solve(matB);\n//     VERIFY_IS_APPROX(symm * matX, matB);\n  }\n\n  // LDLT\n  {\n    int sign = internal::random<int>()%2 ? 1 : -1;\n\n    if(sign == -1)\n    {\n      symm = -symm; // test a negative matrix\n    }\n\n    RealMatrixType symmLo = symm.template triangularView<Lower>();\n\n    LDLT<RealMatrixType,Lower> ldltlo(symmLo);\n    VERIFY_IS_APPROX(symm, ldltlo.reconstructedMatrix());\n    vecX = ldltlo.solve(vecB);\n    VERIFY_IS_APPROX(symm * vecX, vecB);\n//     matX = ldltlo.solve(matB);\n//     VERIFY_IS_APPROX(symm * matX, matB);\n  }\n}\n\n// regression test for bug 241\ntemplate<typename MatrixType> void cholesky_bug241(const MatrixType& m)\n{\n  eigen_assert(m.rows() == 2 && m.cols() == 2);\n\n  typedef typename MatrixType::Scalar Scalar;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> VectorType;\n\n  MatrixType matA;\n  matA << 1, 1, 1, 1;\n  VectorType vecB;\n  vecB << 1, 1;\n  VectorType vecX = matA.ldlt().solve(vecB);\n  VERIFY_IS_APPROX(matA * vecX, vecB);\n}\n\n// LDLT is not guaranteed to work for indefinite matrices, but happens to work fine if matrix is diagonal.\n// This test checks that LDLT reports correctly that matrix is indefinite. \n// See http://forum.kde.org/viewtopic.php?f=74&t=106942 and bug 736\ntemplate<typename MatrixType> void cholesky_definiteness(const MatrixType& m)\n{\n  eigen_assert(m.rows() == 2 && m.cols() == 2);\n  MatrixType mat;\n  LDLT<MatrixType> ldlt(2);\n  \n  {\n    mat << 1, 0, 0, -1;\n    ldlt.compute(mat);\n    VERIFY(!ldlt.isNegative());\n    VERIFY(!ldlt.isPositive());\n  }\n  {\n    mat << 1, 2, 2, 1;\n    ldlt.compute(mat);\n    VERIFY(!ldlt.isNegative());\n    VERIFY(!ldlt.isPositive());\n  }\n  {\n    mat << 0, 0, 0, 0;\n    ldlt.compute(mat);\n    VERIFY(ldlt.isNegative());\n    VERIFY(ldlt.isPositive());\n  }\n  {\n    mat << 0, 0, 0, 1;\n    ldlt.compute(mat);\n    VERIFY(!ldlt.isNegative());\n    VERIFY(ldlt.isPositive());\n  }\n  {\n    mat << -1, 0, 0, 0;\n    ldlt.compute(mat);\n    VERIFY(ldlt.isNegative());\n    VERIFY(!ldlt.isPositive());\n  }\n}\n\ntemplate<typename MatrixType> void cholesky_verify_assert()\n{\n  MatrixType tmp;\n\n  LLT<MatrixType> llt;\n  VERIFY_RAISES_ASSERT(llt.matrixL())\n  VERIFY_RAISES_ASSERT(llt.matrixU())\n  VERIFY_RAISES_ASSERT(llt.solve(tmp))\n  VERIFY_RAISES_ASSERT(llt.solveInPlace(&tmp))\n\n  LDLT<MatrixType> ldlt;\n  VERIFY_RAISES_ASSERT(ldlt.matrixL())\n  VERIFY_RAISES_ASSERT(ldlt.permutationP())\n  VERIFY_RAISES_ASSERT(ldlt.vectorD())\n  VERIFY_RAISES_ASSERT(ldlt.isPositive())\n  VERIFY_RAISES_ASSERT(ldlt.isNegative())\n  VERIFY_RAISES_ASSERT(ldlt.solve(tmp))\n  VERIFY_RAISES_ASSERT(ldlt.solveInPlace(&tmp))\n}\n\nvoid test_cholesky()\n{\n  int s = 0;\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( cholesky(Matrix<double,1,1>()) );\n    CALL_SUBTEST_3( cholesky(Matrix2d()) );\n    CALL_SUBTEST_3( cholesky_bug241(Matrix2d()) );\n    CALL_SUBTEST_3( cholesky_definiteness(Matrix2d()) );\n    CALL_SUBTEST_4( cholesky(Matrix3f()) );\n    CALL_SUBTEST_5( cholesky(Matrix4d()) );\n    s = internal::random<int>(1,EIGEN_TEST_MAX_SIZE);\n    CALL_SUBTEST_2( cholesky(MatrixXd(s,s)) );\n    s = internal::random<int>(1,EIGEN_TEST_MAX_SIZE/2);\n    CALL_SUBTEST_6( cholesky_cplx(MatrixXcd(s,s)) );\n  }\n\n  CALL_SUBTEST_4( cholesky_verify_assert<Matrix3f>() );\n  CALL_SUBTEST_7( cholesky_verify_assert<Matrix3d>() );\n  CALL_SUBTEST_8( cholesky_verify_assert<MatrixXf>() );\n  CALL_SUBTEST_2( cholesky_verify_assert<MatrixXd>() );\n\n  // Test problem size constructors\n  CALL_SUBTEST_9( LLT<MatrixXf>(10) );\n  CALL_SUBTEST_9( LDLT<MatrixXf>(10) );\n  \n  TEST_SET_BUT_UNUSED_VARIABLE(s)\n  TEST_SET_BUT_UNUSED_VARIABLE(nb_temporaries)\n}\n"
  },
  {
    "path": "libs/eigen/test/cholmod_support.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2011 Gael Guennebaud <g.gael@free.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"sparse_solver.h\"\n\n#include <Eigen/CholmodSupport>\n\ntemplate<typename T> void test_cholmod_T()\n{\n  CholmodDecomposition<SparseMatrix<T>, Lower> g_chol_colmajor_lower; g_chol_colmajor_lower.setMode(CholmodSupernodalLLt);\n  CholmodDecomposition<SparseMatrix<T>, Upper> g_chol_colmajor_upper; g_chol_colmajor_upper.setMode(CholmodSupernodalLLt);\n  CholmodDecomposition<SparseMatrix<T>, Lower> g_llt_colmajor_lower;  g_llt_colmajor_lower.setMode(CholmodSimplicialLLt);\n  CholmodDecomposition<SparseMatrix<T>, Upper> g_llt_colmajor_upper;  g_llt_colmajor_upper.setMode(CholmodSimplicialLLt);\n  CholmodDecomposition<SparseMatrix<T>, Lower> g_ldlt_colmajor_lower; g_ldlt_colmajor_lower.setMode(CholmodLDLt);\n  CholmodDecomposition<SparseMatrix<T>, Upper> g_ldlt_colmajor_upper; g_ldlt_colmajor_upper.setMode(CholmodLDLt);\n  \n  CholmodSupernodalLLT<SparseMatrix<T>, Lower> chol_colmajor_lower;\n  CholmodSupernodalLLT<SparseMatrix<T>, Upper> chol_colmajor_upper;\n  CholmodSimplicialLLT<SparseMatrix<T>, Lower> llt_colmajor_lower;\n  CholmodSimplicialLLT<SparseMatrix<T>, Upper> llt_colmajor_upper;\n  CholmodSimplicialLDLT<SparseMatrix<T>, Lower> ldlt_colmajor_lower;\n  CholmodSimplicialLDLT<SparseMatrix<T>, Upper> ldlt_colmajor_upper;\n\n  check_sparse_spd_solving(g_chol_colmajor_lower);\n  check_sparse_spd_solving(g_chol_colmajor_upper);\n  check_sparse_spd_solving(g_llt_colmajor_lower);\n  check_sparse_spd_solving(g_llt_colmajor_upper);\n  check_sparse_spd_solving(g_ldlt_colmajor_lower);\n  check_sparse_spd_solving(g_ldlt_colmajor_upper);\n  \n  check_sparse_spd_solving(chol_colmajor_lower);\n  check_sparse_spd_solving(chol_colmajor_upper);\n  check_sparse_spd_solving(llt_colmajor_lower);\n  check_sparse_spd_solving(llt_colmajor_upper);\n  check_sparse_spd_solving(ldlt_colmajor_lower);\n  check_sparse_spd_solving(ldlt_colmajor_upper);\n  \n//  check_sparse_spd_determinant(chol_colmajor_lower);\n//  check_sparse_spd_determinant(chol_colmajor_upper);\n//  check_sparse_spd_determinant(llt_colmajor_lower);\n//  check_sparse_spd_determinant(llt_colmajor_upper);\n//  check_sparse_spd_determinant(ldlt_colmajor_lower);\n//  check_sparse_spd_determinant(ldlt_colmajor_upper);\n}\n\nvoid test_cholmod_support()\n{\n  CALL_SUBTEST_1(test_cholmod_T<double>());\n  CALL_SUBTEST_2(test_cholmod_T<std::complex<double> >());\n}\n"
  },
  {
    "path": "libs/eigen/test/commainitializer.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\nvoid test_commainitializer()\n{\n  Matrix3d m3;\n  Matrix4d m4;\n\n  VERIFY_RAISES_ASSERT( (m3 << 1, 2, 3, 4, 5, 6, 7, 8) );\n  \n  #ifndef _MSC_VER\n  VERIFY_RAISES_ASSERT( (m3 << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10) );\n  #endif\n\n  double data[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};\n  Matrix3d ref = Map<Matrix<double,3,3,RowMajor> >(data);\n\n  m3 = Matrix3d::Random();\n  m3 << 1, 2, 3, 4, 5, 6, 7, 8, 9;\n  VERIFY_IS_APPROX(m3, ref );\n\n  Vector3d vec[3];\n  vec[0] << 1, 4, 7;\n  vec[1] << 2, 5, 8;\n  vec[2] << 3, 6, 9;\n  m3 = Matrix3d::Random();\n  m3 << vec[0], vec[1], vec[2];\n  VERIFY_IS_APPROX(m3, ref);\n\n  vec[0] << 1, 2, 3;\n  vec[1] << 4, 5, 6;\n  vec[2] << 7, 8, 9;\n  m3 = Matrix3d::Random();\n  m3 << vec[0].transpose(),\n        4, 5, 6,\n        vec[2].transpose();\n  VERIFY_IS_APPROX(m3, ref);\n\n}\n"
  },
  {
    "path": "libs/eigen/test/conjugate_gradient.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2011 Gael Guennebaud <g.gael@free.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"sparse_solver.h\"\n#include <Eigen/IterativeLinearSolvers>\n\ntemplate<typename T> void test_conjugate_gradient_T()\n{\n  ConjugateGradient<SparseMatrix<T>, Lower      > cg_colmajor_lower_diag;\n  ConjugateGradient<SparseMatrix<T>, Upper      > cg_colmajor_upper_diag;\n  ConjugateGradient<SparseMatrix<T>, Lower|Upper> cg_colmajor_loup_diag;\n  ConjugateGradient<SparseMatrix<T>, Lower, IdentityPreconditioner> cg_colmajor_lower_I;\n  ConjugateGradient<SparseMatrix<T>, Upper, IdentityPreconditioner> cg_colmajor_upper_I;\n\n  CALL_SUBTEST( check_sparse_spd_solving(cg_colmajor_lower_diag)  );\n  CALL_SUBTEST( check_sparse_spd_solving(cg_colmajor_upper_diag)  );\n  CALL_SUBTEST( check_sparse_spd_solving(cg_colmajor_loup_diag)   );\n  CALL_SUBTEST( check_sparse_spd_solving(cg_colmajor_lower_I)     );\n  CALL_SUBTEST( check_sparse_spd_solving(cg_colmajor_upper_I)     );\n}\n\nvoid test_conjugate_gradient()\n{\n  CALL_SUBTEST_1(test_conjugate_gradient_T<double>());\n  CALL_SUBTEST_2(test_conjugate_gradient_T<std::complex<double> >());\n}\n"
  },
  {
    "path": "libs/eigen/test/conservative_resize.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Hauke Heibel <hauke.heibel@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\n#include <Eigen/Core>\n\nusing namespace Eigen;\n\ntemplate <typename Scalar, int Storage>\nvoid run_matrix_tests()\n{\n  typedef Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic, Storage> MatrixType;\n  typedef typename MatrixType::Index Index;\n\n  MatrixType m, n;\n\n  // boundary cases ...\n  m = n = MatrixType::Random(50,50);\n  m.conservativeResize(1,50);\n  VERIFY_IS_APPROX(m, n.block(0,0,1,50));\n\n  m = n = MatrixType::Random(50,50);\n  m.conservativeResize(50,1);\n  VERIFY_IS_APPROX(m, n.block(0,0,50,1));\n\n  m = n = MatrixType::Random(50,50);\n  m.conservativeResize(50,50);\n  VERIFY_IS_APPROX(m, n.block(0,0,50,50));\n\n  // random shrinking ...\n  for (int i=0; i<25; ++i)\n  {\n    const Index rows = internal::random<Index>(1,50);\n    const Index cols = internal::random<Index>(1,50);\n    m = n = MatrixType::Random(50,50);\n    m.conservativeResize(rows,cols);\n    VERIFY_IS_APPROX(m, n.block(0,0,rows,cols));\n  }\n\n  // random growing with zeroing ...\n  for (int i=0; i<25; ++i)\n  {\n    const Index rows = internal::random<Index>(50,75);\n    const Index cols = internal::random<Index>(50,75);\n    m = n = MatrixType::Random(50,50);\n    m.conservativeResizeLike(MatrixType::Zero(rows,cols));\n    VERIFY_IS_APPROX(m.block(0,0,n.rows(),n.cols()), n);\n    VERIFY( rows<=50 || m.block(50,0,rows-50,cols).sum() == Scalar(0) );\n    VERIFY( cols<=50 || m.block(0,50,rows,cols-50).sum() == Scalar(0) );\n  }\n}\n\ntemplate <typename Scalar>\nvoid run_vector_tests()\n{\n  typedef Matrix<Scalar, 1, Eigen::Dynamic> VectorType;\n\n  VectorType m, n;\n\n  // boundary cases ...\n  m = n = VectorType::Random(50);\n  m.conservativeResize(1);\n  VERIFY_IS_APPROX(m, n.segment(0,1));\n\n  m = n = VectorType::Random(50);\n  m.conservativeResize(50);\n  VERIFY_IS_APPROX(m, n.segment(0,50));\n  \n  m = n = VectorType::Random(50);\n  m.conservativeResize(m.rows(),1);\n  VERIFY_IS_APPROX(m, n.segment(0,1));\n\n  m = n = VectorType::Random(50);\n  m.conservativeResize(m.rows(),50);\n  VERIFY_IS_APPROX(m, n.segment(0,50));\n\n  // random shrinking ...\n  for (int i=0; i<50; ++i)\n  {\n    const int size = internal::random<int>(1,50);\n    m = n = VectorType::Random(50);\n    m.conservativeResize(size);\n    VERIFY_IS_APPROX(m, n.segment(0,size));\n    \n    m = n = VectorType::Random(50);\n    m.conservativeResize(m.rows(), size);\n    VERIFY_IS_APPROX(m, n.segment(0,size));\n  }\n\n  // random growing with zeroing ...\n  for (int i=0; i<50; ++i)\n  {\n    const int size = internal::random<int>(50,100);\n    m = n = VectorType::Random(50);\n    m.conservativeResizeLike(VectorType::Zero(size));\n    VERIFY_IS_APPROX(m.segment(0,50), n);\n    VERIFY( size<=50 || m.segment(50,size-50).sum() == Scalar(0) );\n    \n    m = n = VectorType::Random(50);\n    m.conservativeResizeLike(Matrix<Scalar,Dynamic,Dynamic>::Zero(1,size));\n    VERIFY_IS_APPROX(m.segment(0,50), n);\n    VERIFY( size<=50 || m.segment(50,size-50).sum() == Scalar(0) );\n  }\n}\n\nvoid test_conservative_resize()\n{\n  for(int i=0; i<g_repeat; ++i)\n  {\n    CALL_SUBTEST_1((run_matrix_tests<int, Eigen::RowMajor>()));\n    CALL_SUBTEST_1((run_matrix_tests<int, Eigen::ColMajor>()));\n    CALL_SUBTEST_2((run_matrix_tests<float, Eigen::RowMajor>()));\n    CALL_SUBTEST_2((run_matrix_tests<float, Eigen::ColMajor>()));\n    CALL_SUBTEST_3((run_matrix_tests<double, Eigen::RowMajor>()));\n    CALL_SUBTEST_3((run_matrix_tests<double, Eigen::ColMajor>()));\n    CALL_SUBTEST_4((run_matrix_tests<std::complex<float>, Eigen::RowMajor>()));\n    CALL_SUBTEST_4((run_matrix_tests<std::complex<float>, Eigen::ColMajor>()));\n    CALL_SUBTEST_5((run_matrix_tests<std::complex<double>, Eigen::RowMajor>()));\n    CALL_SUBTEST_6((run_matrix_tests<std::complex<double>, Eigen::ColMajor>()));\n\n    CALL_SUBTEST_1((run_vector_tests<int>()));\n    CALL_SUBTEST_2((run_vector_tests<float>()));\n    CALL_SUBTEST_3((run_vector_tests<double>()));\n    CALL_SUBTEST_4((run_vector_tests<std::complex<float> >()));\n    CALL_SUBTEST_5((run_vector_tests<std::complex<double> >()));\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/corners.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2006-2010 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\n#define COMPARE_CORNER(A,B) \\\n  VERIFY_IS_EQUAL(matrix.A, matrix.B); \\\n  VERIFY_IS_EQUAL(const_matrix.A, const_matrix.B);\n\ntemplate<typename MatrixType> void corners(const MatrixType& m)\n{\n  typedef typename MatrixType::Index Index;\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  Index r = internal::random<Index>(1,rows);\n  Index c = internal::random<Index>(1,cols);\n\n  MatrixType matrix = MatrixType::Random(rows,cols);\n  const MatrixType const_matrix = MatrixType::Random(rows,cols);\n\n  COMPARE_CORNER(topLeftCorner(r,c), block(0,0,r,c));\n  COMPARE_CORNER(topRightCorner(r,c), block(0,cols-c,r,c));\n  COMPARE_CORNER(bottomLeftCorner(r,c), block(rows-r,0,r,c));\n  COMPARE_CORNER(bottomRightCorner(r,c), block(rows-r,cols-c,r,c));\n\n  Index sr = internal::random<Index>(1,rows) - 1;\n  Index nr = internal::random<Index>(1,rows-sr);\n  Index sc = internal::random<Index>(1,cols) - 1;\n  Index nc = internal::random<Index>(1,cols-sc);\n\n  COMPARE_CORNER(topRows(r), block(0,0,r,cols));\n  COMPARE_CORNER(middleRows(sr,nr), block(sr,0,nr,cols));\n  COMPARE_CORNER(bottomRows(r), block(rows-r,0,r,cols));\n  COMPARE_CORNER(leftCols(c), block(0,0,rows,c));\n  COMPARE_CORNER(middleCols(sc,nc), block(0,sc,rows,nc));\n  COMPARE_CORNER(rightCols(c), block(0,cols-c,rows,c));\n}\n\ntemplate<typename MatrixType, int CRows, int CCols, int SRows, int SCols> void corners_fixedsize()\n{\n  MatrixType matrix = MatrixType::Random();\n  const MatrixType const_matrix = MatrixType::Random();\n\n  enum {\n    rows = MatrixType::RowsAtCompileTime,\n    cols = MatrixType::ColsAtCompileTime,\n    r = CRows,\n    c = CCols,\n\tsr = SRows,\n\tsc = SCols\n  };\n\n  VERIFY_IS_EQUAL((matrix.template topLeftCorner<r,c>()), (matrix.template block<r,c>(0,0)));\n  VERIFY_IS_EQUAL((matrix.template topRightCorner<r,c>()), (matrix.template block<r,c>(0,cols-c)));\n  VERIFY_IS_EQUAL((matrix.template bottomLeftCorner<r,c>()), (matrix.template block<r,c>(rows-r,0)));\n  VERIFY_IS_EQUAL((matrix.template bottomRightCorner<r,c>()), (matrix.template block<r,c>(rows-r,cols-c)));\n\n  VERIFY_IS_EQUAL((matrix.template topLeftCorner<r,c>()), (matrix.template topLeftCorner<r,Dynamic>(r,c)));\n  VERIFY_IS_EQUAL((matrix.template topRightCorner<r,c>()), (matrix.template topRightCorner<r,Dynamic>(r,c)));\n  VERIFY_IS_EQUAL((matrix.template bottomLeftCorner<r,c>()), (matrix.template bottomLeftCorner<r,Dynamic>(r,c)));\n  VERIFY_IS_EQUAL((matrix.template bottomRightCorner<r,c>()), (matrix.template bottomRightCorner<r,Dynamic>(r,c)));\n\n  VERIFY_IS_EQUAL((matrix.template topLeftCorner<r,c>()), (matrix.template topLeftCorner<Dynamic,c>(r,c)));\n  VERIFY_IS_EQUAL((matrix.template topRightCorner<r,c>()), (matrix.template topRightCorner<Dynamic,c>(r,c)));\n  VERIFY_IS_EQUAL((matrix.template bottomLeftCorner<r,c>()), (matrix.template bottomLeftCorner<Dynamic,c>(r,c)));\n  VERIFY_IS_EQUAL((matrix.template bottomRightCorner<r,c>()), (matrix.template bottomRightCorner<Dynamic,c>(r,c)));\n\n  VERIFY_IS_EQUAL((matrix.template topRows<r>()), (matrix.template block<r,cols>(0,0)));\n  VERIFY_IS_EQUAL((matrix.template middleRows<r>(sr)), (matrix.template block<r,cols>(sr,0)));\n  VERIFY_IS_EQUAL((matrix.template bottomRows<r>()), (matrix.template block<r,cols>(rows-r,0)));\n  VERIFY_IS_EQUAL((matrix.template leftCols<c>()), (matrix.template block<rows,c>(0,0)));\n  VERIFY_IS_EQUAL((matrix.template middleCols<c>(sc)), (matrix.template block<rows,c>(0,sc)));\n  VERIFY_IS_EQUAL((matrix.template rightCols<c>()), (matrix.template block<rows,c>(0,cols-c)));\n\n  VERIFY_IS_EQUAL((const_matrix.template topLeftCorner<r,c>()), (const_matrix.template block<r,c>(0,0)));\n  VERIFY_IS_EQUAL((const_matrix.template topRightCorner<r,c>()), (const_matrix.template block<r,c>(0,cols-c)));\n  VERIFY_IS_EQUAL((const_matrix.template bottomLeftCorner<r,c>()), (const_matrix.template block<r,c>(rows-r,0)));\n  VERIFY_IS_EQUAL((const_matrix.template bottomRightCorner<r,c>()), (const_matrix.template block<r,c>(rows-r,cols-c)));\n\n  VERIFY_IS_EQUAL((const_matrix.template topLeftCorner<r,c>()), (const_matrix.template topLeftCorner<r,Dynamic>(r,c)));\n  VERIFY_IS_EQUAL((const_matrix.template topRightCorner<r,c>()), (const_matrix.template topRightCorner<r,Dynamic>(r,c)));\n  VERIFY_IS_EQUAL((const_matrix.template bottomLeftCorner<r,c>()), (const_matrix.template bottomLeftCorner<r,Dynamic>(r,c)));\n  VERIFY_IS_EQUAL((const_matrix.template bottomRightCorner<r,c>()), (const_matrix.template bottomRightCorner<r,Dynamic>(r,c)));\n\n  VERIFY_IS_EQUAL((const_matrix.template topLeftCorner<r,c>()), (const_matrix.template topLeftCorner<Dynamic,c>(r,c)));\n  VERIFY_IS_EQUAL((const_matrix.template topRightCorner<r,c>()), (const_matrix.template topRightCorner<Dynamic,c>(r,c)));\n  VERIFY_IS_EQUAL((const_matrix.template bottomLeftCorner<r,c>()), (const_matrix.template bottomLeftCorner<Dynamic,c>(r,c)));\n  VERIFY_IS_EQUAL((const_matrix.template bottomRightCorner<r,c>()), (const_matrix.template bottomRightCorner<Dynamic,c>(r,c)));\n\n  VERIFY_IS_EQUAL((const_matrix.template topRows<r>()), (const_matrix.template block<r,cols>(0,0)));\n  VERIFY_IS_EQUAL((const_matrix.template middleRows<r>(sr)), (const_matrix.template block<r,cols>(sr,0)));\n  VERIFY_IS_EQUAL((const_matrix.template bottomRows<r>()), (const_matrix.template block<r,cols>(rows-r,0)));\n  VERIFY_IS_EQUAL((const_matrix.template leftCols<c>()), (const_matrix.template block<rows,c>(0,0)));\n  VERIFY_IS_EQUAL((const_matrix.template middleCols<c>(sc)), (const_matrix.template block<rows,c>(0,sc)));\n  VERIFY_IS_EQUAL((const_matrix.template rightCols<c>()), (const_matrix.template block<rows,c>(0,cols-c)));\n}\n\nvoid test_corners()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( corners(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( corners(Matrix4d()) );\n    CALL_SUBTEST_3( corners(Matrix<int,10,12>()) );\n    CALL_SUBTEST_4( corners(MatrixXcf(5, 7)) );\n    CALL_SUBTEST_5( corners(MatrixXf(21, 20)) );\n\n    CALL_SUBTEST_1(( corners_fixedsize<Matrix<float, 1, 1>, 1, 1, 0, 0>() ));\n    CALL_SUBTEST_2(( corners_fixedsize<Matrix4d,2,2,1,1>() ));\n    CALL_SUBTEST_3(( corners_fixedsize<Matrix<int,10,12>,4,7,5,2>() ));\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/cwiseop.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#define EIGEN2_SUPPORT\n#define EIGEN_NO_EIGEN2_DEPRECATED_WARNING\n\n#define EIGEN_NO_STATIC_ASSERT\n#include \"main.h\"\n#include <functional>\n\n#ifdef min\n#undef min\n#endif\n\n#ifdef max\n#undef max\n#endif\n\nusing namespace std;\n\ntemplate<typename Scalar> struct AddIfNull {\n    const Scalar operator() (const Scalar a, const Scalar b) const {return a<=1e-3 ? b : a;}\n    enum { Cost = NumTraits<Scalar>::AddCost };\n};\n\ntemplate<typename MatrixType>\ntypename Eigen::internal::enable_if<!NumTraits<typename MatrixType::Scalar>::IsInteger,typename MatrixType::Scalar>::type\ncwiseops_real_only(MatrixType& m1, MatrixType& m2, MatrixType& m3, MatrixType& mones)\n{\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  \n  VERIFY_IS_APPROX(m1.cwise() / m2,    m1.cwise() * (m2.cwise().inverse()));\n  m3 = m1.cwise().abs().cwise().sqrt();\n  VERIFY_IS_APPROX(m3.cwise().square(), m1.cwise().abs());\n  VERIFY_IS_APPROX(m1.cwise().square().cwise().sqrt(), m1.cwise().abs());\n  VERIFY_IS_APPROX(m1.cwise().abs().cwise().log().cwise().exp() , m1.cwise().abs());\n\n  VERIFY_IS_APPROX(m1.cwise().pow(2), m1.cwise().square());\n  m3 = (m1.cwise().abs().cwise()<=RealScalar(0.01)).select(mones,m1);\n  VERIFY_IS_APPROX(m3.cwise().pow(-1), m3.cwise().inverse());\n  m3 = m1.cwise().abs();\n  VERIFY_IS_APPROX(m3.cwise().pow(RealScalar(0.5)), m3.cwise().sqrt());\n\n//   VERIFY_IS_APPROX(m1.cwise().tan(), m1.cwise().sin().cwise() / m1.cwise().cos());\n  VERIFY_IS_APPROX(mones, m1.cwise().sin().cwise().square() + m1.cwise().cos().cwise().square());\n  m3 = m1;\n  m3.cwise() /= m2;\n  VERIFY_IS_APPROX(m3, m1.cwise() / m2);\n  \n  return Scalar(0);\n}\n\ntemplate<typename MatrixType>\ntypename Eigen::internal::enable_if<NumTraits<typename MatrixType::Scalar>::IsInteger,typename MatrixType::Scalar>::type\ncwiseops_real_only(MatrixType& , MatrixType& , MatrixType& , MatrixType& )\n{\n  return 0;\n}\n\ntemplate<typename MatrixType> void cwiseops(const MatrixType& m)\n{\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> VectorType;\n\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  MatrixType m1 = MatrixType::Random(rows, cols),\n             m1bis = m1,\n             m2 = MatrixType::Random(rows, cols),\n             m3(rows, cols),\n             m4(rows, cols),\n             mzero = MatrixType::Zero(rows, cols),\n             mones = MatrixType::Ones(rows, cols),\n             identity = Matrix<Scalar, MatrixType::RowsAtCompileTime, MatrixType::RowsAtCompileTime>\n                              ::Identity(rows, rows);\n  VectorType vzero = VectorType::Zero(rows),\n             vones = VectorType::Ones(rows),\n             v3(rows);\n\n  Index r = internal::random<Index>(0, rows-1),\n        c = internal::random<Index>(0, cols-1);\n\n  Scalar s1 = internal::random<Scalar>();\n\n  // test Zero, Ones, Constant, and the set* variants\n  m3 = MatrixType::Constant(rows, cols, s1);\n  for (int j=0; j<cols; ++j)\n    for (int i=0; i<rows; ++i)\n    {\n      VERIFY_IS_APPROX(mzero(i,j), Scalar(0));\n      VERIFY_IS_APPROX(mones(i,j), Scalar(1));\n      VERIFY_IS_APPROX(m3(i,j), s1);\n    }\n  VERIFY(mzero.isZero());\n  VERIFY(mones.isOnes());\n  VERIFY(m3.isConstant(s1));\n  VERIFY(identity.isIdentity());\n  VERIFY_IS_APPROX(m4.setConstant(s1), m3);\n  VERIFY_IS_APPROX(m4.setConstant(rows,cols,s1), m3);\n  VERIFY_IS_APPROX(m4.setZero(), mzero);\n  VERIFY_IS_APPROX(m4.setZero(rows,cols), mzero);\n  VERIFY_IS_APPROX(m4.setOnes(), mones);\n  VERIFY_IS_APPROX(m4.setOnes(rows,cols), mones);\n  m4.fill(s1);\n  VERIFY_IS_APPROX(m4, m3);\n\n  VERIFY_IS_APPROX(v3.setConstant(rows, s1), VectorType::Constant(rows,s1));\n  VERIFY_IS_APPROX(v3.setZero(rows), vzero);\n  VERIFY_IS_APPROX(v3.setOnes(rows), vones);\n\n  m2 = m2.template binaryExpr<AddIfNull<Scalar> >(mones);\n\n  VERIFY_IS_APPROX(m1.cwise().pow(2), m1.cwise().abs2());\n  VERIFY_IS_APPROX(m1.cwise().pow(2), m1.cwise().square());\n  VERIFY_IS_APPROX(m1.cwise().pow(3), m1.cwise().cube());\n\n  VERIFY_IS_APPROX(m1 + mones, m1.cwise()+Scalar(1));\n  VERIFY_IS_APPROX(m1 - mones, m1.cwise()-Scalar(1));\n  m3 = m1; m3.cwise() += 1;\n  VERIFY_IS_APPROX(m1 + mones, m3);\n  m3 = m1; m3.cwise() -= 1;\n  VERIFY_IS_APPROX(m1 - mones, m3);\n\n  VERIFY_IS_APPROX(m2, m2.cwise() * mones);\n  VERIFY_IS_APPROX(m1.cwise() * m2,  m2.cwise() * m1);\n  m3 = m1;\n  m3.cwise() *= m2;\n  VERIFY_IS_APPROX(m3, m1.cwise() * m2);\n\n  VERIFY_IS_APPROX(mones,    m2.cwise()/m2);\n\n  // check min\n  VERIFY_IS_APPROX( m1.cwise().min(m2), m2.cwise().min(m1) );\n  VERIFY_IS_APPROX( m1.cwise().min(m1+mones), m1 );\n  VERIFY_IS_APPROX( m1.cwise().min(m1-mones), m1-mones );\n\n  // check max\n  VERIFY_IS_APPROX( m1.cwise().max(m2), m2.cwise().max(m1) );\n  VERIFY_IS_APPROX( m1.cwise().max(m1-mones), m1 );\n  VERIFY_IS_APPROX( m1.cwise().max(m1+mones), m1+mones );\n\n  VERIFY( (m1.cwise() == m1).all() );\n  VERIFY( (m1.cwise() != m2).any() );\n  VERIFY(!(m1.cwise() == (m1+mones)).any() );\n  if (rows*cols>1)\n  {\n    m3 = m1;\n    m3(r,c) += 1;\n    VERIFY( (m1.cwise() == m3).any() );\n    VERIFY( !(m1.cwise() == m3).all() );\n  }\n  VERIFY( (m1.cwise().min(m2).cwise() <= m2).all() );\n  VERIFY( (m1.cwise().max(m2).cwise() >= m2).all() );\n  VERIFY( (m1.cwise().min(m2).cwise() < (m1+mones)).all() );\n  VERIFY( (m1.cwise().max(m2).cwise() > (m1-mones)).all() );\n\n  VERIFY( (m1.cwise()<m1.unaryExpr(bind2nd(plus<Scalar>(), Scalar(1)))).all() );\n  VERIFY( !(m1.cwise()<m1bis.unaryExpr(bind2nd(minus<Scalar>(), Scalar(1)))).all() );\n  VERIFY( !(m1.cwise()>m1bis.unaryExpr(bind2nd(plus<Scalar>(), Scalar(1)))).any() );\n  \n  cwiseops_real_only(m1, m2, m3, mones);\n}\n\nvoid test_cwiseop()\n{\n  for(int i = 0; i < g_repeat ; i++) {\n    CALL_SUBTEST_1( cwiseops(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( cwiseops(Matrix4d()) );\n    CALL_SUBTEST_3( cwiseops(MatrixXf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n    CALL_SUBTEST_4( cwiseops(MatrixXf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n    CALL_SUBTEST_5( cwiseops(MatrixXi(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n    CALL_SUBTEST_6( cwiseops(MatrixXd(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/denseLM.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Desire Nuentsa <desire.nuentsa_wakam@inria.fr>\n// Copyright (C) 2012 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include <iostream>\n#include <fstream>\n#include <iomanip>\n\n#include \"main.h\"\n#include <Eigen/LevenbergMarquardt>\nusing namespace std;\nusing namespace Eigen;\n\ntemplate<typename Scalar>\nstruct DenseLM : DenseFunctor<Scalar>\n{\n  typedef DenseFunctor<Scalar> Base;\n  typedef typename Base::JacobianType JacobianType;\n  typedef Matrix<Scalar,Dynamic,1> VectorType;\n  \n  DenseLM(int n, int m) : DenseFunctor<Scalar>(n,m) \n  { }\n \n  VectorType model(const VectorType& uv, VectorType& x)\n  {\n    VectorType y; // Should change to use expression template\n    int m = Base::values(); \n    int n = Base::inputs();\n    eigen_assert(uv.size()%2 == 0);\n    eigen_assert(uv.size() == n);\n    eigen_assert(x.size() == m);\n    y.setZero(m);\n    int half = n/2;\n    VectorBlock<const VectorType> u(uv, 0, half);\n    VectorBlock<const VectorType> v(uv, half, half);\n    for (int j = 0; j < m; j++)\n    {\n      for (int i = 0; i < half; i++)\n        y(j) += u(i)*std::exp(-(x(j)-i)*(x(j)-i)/(v(i)*v(i)));\n    }\n    return y;\n    \n  }\n  void initPoints(VectorType& uv_ref, VectorType& x)\n  {\n    m_x = x;\n    m_y = this->model(uv_ref, x);\n  }\n  \n  int operator()(const VectorType& uv, VectorType& fvec)\n  {\n    \n    int m = Base::values(); \n    int n = Base::inputs();\n    eigen_assert(uv.size()%2 == 0);\n    eigen_assert(uv.size() == n);\n    eigen_assert(fvec.size() == m);\n    int half = n/2;\n    VectorBlock<const VectorType> u(uv, 0, half);\n    VectorBlock<const VectorType> v(uv, half, half);\n    for (int j = 0; j < m; j++)\n    {\n      fvec(j) = m_y(j);\n      for (int i = 0; i < half; i++)\n      {\n        fvec(j) -= u(i) *std::exp(-(m_x(j)-i)*(m_x(j)-i)/(v(i)*v(i)));\n      }\n    }\n    \n    return 0;\n  }\n  int df(const VectorType& uv, JacobianType& fjac)\n  {\n    int m = Base::values(); \n    int n = Base::inputs();\n    eigen_assert(n == uv.size());\n    eigen_assert(fjac.rows() == m);\n    eigen_assert(fjac.cols() == n);\n    int half = n/2;\n    VectorBlock<const VectorType> u(uv, 0, half);\n    VectorBlock<const VectorType> v(uv, half, half);\n    for (int j = 0; j < m; j++)\n    {\n      for (int i = 0; i < half; i++)\n      {\n        fjac.coeffRef(j,i) = -std::exp(-(m_x(j)-i)*(m_x(j)-i)/(v(i)*v(i)));\n        fjac.coeffRef(j,i+half) = -2.*u(i)*(m_x(j)-i)*(m_x(j)-i)/(std::pow(v(i),3)) * std::exp(-(m_x(j)-i)*(m_x(j)-i)/(v(i)*v(i)));\n      }\n    }\n    return 0;\n  }\n  VectorType m_x, m_y; //Data Points\n};\n\ntemplate<typename FunctorType, typename VectorType>\nint test_minimizeLM(FunctorType& functor, VectorType& uv)\n{\n  LevenbergMarquardt<FunctorType> lm(functor);\n  LevenbergMarquardtSpace::Status info; \n  \n  info = lm.minimize(uv);\n  \n  VERIFY_IS_EQUAL(info, 1);\n  //FIXME Check other parameters\n  return info;\n}\n\ntemplate<typename FunctorType, typename VectorType>\nint test_lmder(FunctorType& functor, VectorType& uv)\n{\n  typedef typename VectorType::Scalar Scalar;\n  LevenbergMarquardtSpace::Status info; \n  LevenbergMarquardt<FunctorType> lm(functor);\n  info = lm.lmder1(uv);\n  \n  VERIFY_IS_EQUAL(info, 1);\n  //FIXME Check other parameters\n  return info;\n}\n\ntemplate<typename FunctorType, typename VectorType>\nint test_minimizeSteps(FunctorType& functor, VectorType& uv)\n{\n  LevenbergMarquardtSpace::Status info;   \n  LevenbergMarquardt<FunctorType> lm(functor);\n  info = lm.minimizeInit(uv);\n  if (info==LevenbergMarquardtSpace::ImproperInputParameters)\n      return info;\n  do \n  {\n    info = lm.minimizeOneStep(uv);\n  } while (info==LevenbergMarquardtSpace::Running);\n  \n  VERIFY_IS_EQUAL(info, 1);\n  //FIXME Check other parameters\n  return info;\n}\n\ntemplate<typename T>\nvoid test_denseLM_T()\n{\n  typedef Matrix<T,Dynamic,1> VectorType;\n  \n  int inputs = 10; \n  int values = 1000; \n  DenseLM<T> dense_gaussian(inputs, values);\n  VectorType uv(inputs),uv_ref(inputs);\n  VectorType x(values);\n  \n  // Generate the reference solution \n  uv_ref << -2, 1, 4 ,8, 6, 1.8, 1.2, 1.1, 1.9 , 3;\n  \n  //Generate the reference data points\n  x.setRandom();\n  x = 10*x;\n  x.array() += 10;\n  dense_gaussian.initPoints(uv_ref, x);\n  \n  // Generate the initial parameters \n  VectorBlock<VectorType> u(uv, 0, inputs/2); \n  VectorBlock<VectorType> v(uv, inputs/2, inputs/2);\n  \n  // Solve the optimization problem\n  \n  //Solve in one go\n  u.setOnes(); v.setOnes();\n  test_minimizeLM(dense_gaussian, uv);\n  \n  //Solve until the machine precision\n  u.setOnes(); v.setOnes();\n  test_lmder(dense_gaussian, uv); \n  \n  // Solve step by step\n  v.setOnes(); u.setOnes();\n  test_minimizeSteps(dense_gaussian, uv);\n  \n}\n\nvoid test_denseLM()\n{\n  CALL_SUBTEST_2(test_denseLM_T<double>());\n  \n  // CALL_SUBTEST_2(test_sparseLM_T<std::complex<double>());\n}\n"
  },
  {
    "path": "libs/eigen/test/determinant.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <Eigen/LU>\n\ntemplate<typename MatrixType> void determinant(const MatrixType& m)\n{\n  /* this test covers the following files:\n     Determinant.h\n  */\n  typedef typename MatrixType::Index Index;\n  Index size = m.rows();\n\n  MatrixType m1(size, size), m2(size, size);\n  m1.setRandom();\n  m2.setRandom();\n  typedef typename MatrixType::Scalar Scalar;\n  Scalar x = internal::random<Scalar>();\n  VERIFY_IS_APPROX(MatrixType::Identity(size, size).determinant(), Scalar(1));\n  VERIFY_IS_APPROX((m1*m2).eval().determinant(), m1.determinant() * m2.determinant());\n  if(size==1) return;\n  Index i = internal::random<Index>(0, size-1);\n  Index j;\n  do {\n    j = internal::random<Index>(0, size-1);\n  } while(j==i);\n  m2 = m1;\n  m2.row(i).swap(m2.row(j));\n  VERIFY_IS_APPROX(m2.determinant(), -m1.determinant());\n  m2 = m1;\n  m2.col(i).swap(m2.col(j));\n  VERIFY_IS_APPROX(m2.determinant(), -m1.determinant());\n  VERIFY_IS_APPROX(m2.determinant(), m2.transpose().determinant());\n  VERIFY_IS_APPROX(numext::conj(m2.determinant()), m2.adjoint().determinant());\n  m2 = m1;\n  m2.row(i) += x*m2.row(j);\n  VERIFY_IS_APPROX(m2.determinant(), m1.determinant());\n  m2 = m1;\n  m2.row(i) *= x;\n  VERIFY_IS_APPROX(m2.determinant(), m1.determinant() * x);\n  \n  // check empty matrix\n  VERIFY_IS_APPROX(m2.block(0,0,0,0).determinant(), Scalar(1));\n}\n\nvoid test_determinant()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    int s = 0;\n    CALL_SUBTEST_1( determinant(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( determinant(Matrix<double, 2, 2>()) );\n    CALL_SUBTEST_3( determinant(Matrix<double, 3, 3>()) );\n    CALL_SUBTEST_4( determinant(Matrix<double, 4, 4>()) );\n    CALL_SUBTEST_5( determinant(Matrix<std::complex<double>, 10, 10>()) );\n    s = internal::random<int>(1,EIGEN_TEST_MAX_SIZE/4);\n    CALL_SUBTEST_6( determinant(MatrixXd(s, s)) );\n    TEST_SET_BUT_UNUSED_VARIABLE(s)\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/diagonal.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2006-2010 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\ntemplate<typename MatrixType> void diagonal(const MatrixType& m)\n{\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  MatrixType m1 = MatrixType::Random(rows, cols),\n             m2 = MatrixType::Random(rows, cols);\n\n  //check diagonal()\n  VERIFY_IS_APPROX(m1.diagonal(), m1.transpose().diagonal());\n  m2.diagonal() = 2 * m1.diagonal();\n  m2.diagonal()[0] *= 3;\n\n  if (rows>2)\n  {\n    enum {\n      N1 = MatrixType::RowsAtCompileTime>2 ?  2 : 0,\n      N2 = MatrixType::RowsAtCompileTime>1 ? -1 : 0\n    };\n\n    // check sub/super diagonal\n    if(MatrixType::SizeAtCompileTime!=Dynamic)\n    {\n      VERIFY(m1.template diagonal<N1>().RowsAtCompileTime == m1.diagonal(N1).size());\n      VERIFY(m1.template diagonal<N2>().RowsAtCompileTime == m1.diagonal(N2).size());\n    }\n\n    m2.template diagonal<N1>() = 2 * m1.template diagonal<N1>();\n    VERIFY_IS_APPROX(m2.template diagonal<N1>(), static_cast<Scalar>(2) * m1.diagonal(N1));\n    m2.template diagonal<N1>()[0] *= 3;\n    VERIFY_IS_APPROX(m2.template diagonal<N1>()[0], static_cast<Scalar>(6) * m1.template diagonal<N1>()[0]);\n\n\n    m2.template diagonal<N2>() = 2 * m1.template diagonal<N2>();\n    m2.template diagonal<N2>()[0] *= 3;\n    VERIFY_IS_APPROX(m2.template diagonal<N2>()[0], static_cast<Scalar>(6) * m1.template diagonal<N2>()[0]);\n\n    m2.diagonal(N1) = 2 * m1.diagonal(N1);\n    VERIFY_IS_APPROX(m2.template diagonal<N1>(), static_cast<Scalar>(2) * m1.diagonal(N1));\n    m2.diagonal(N1)[0] *= 3;\n    VERIFY_IS_APPROX(m2.diagonal(N1)[0], static_cast<Scalar>(6) * m1.diagonal(N1)[0]);\n\n    m2.diagonal(N2) = 2 * m1.diagonal(N2);\n    VERIFY_IS_APPROX(m2.template diagonal<N2>(), static_cast<Scalar>(2) * m1.diagonal(N2));\n    m2.diagonal(N2)[0] *= 3;\n    VERIFY_IS_APPROX(m2.diagonal(N2)[0], static_cast<Scalar>(6) * m1.diagonal(N2)[0]);\n  }\n}\n\nvoid test_diagonal()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( diagonal(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_1( diagonal(Matrix<float, 4, 9>()) );\n    CALL_SUBTEST_1( diagonal(Matrix<float, 7, 3>()) );\n    CALL_SUBTEST_2( diagonal(Matrix4d()) );\n    CALL_SUBTEST_2( diagonal(MatrixXcf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n    CALL_SUBTEST_2( diagonal(MatrixXi(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n    CALL_SUBTEST_2( diagonal(MatrixXcd(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n    CALL_SUBTEST_1( diagonal(MatrixXf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n    CALL_SUBTEST_1( diagonal(Matrix<float,Dynamic,4>(3, 4)) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/diagonalmatrices.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\nusing namespace std;\ntemplate<typename MatrixType> void diagonalmatrices(const MatrixType& m)\n{\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n  enum { Rows = MatrixType::RowsAtCompileTime, Cols = MatrixType::ColsAtCompileTime };\n  typedef Matrix<Scalar, Rows, 1> VectorType;\n  typedef Matrix<Scalar, 1, Cols> RowVectorType;\n  typedef Matrix<Scalar, Rows, Rows> SquareMatrixType;\n  typedef DiagonalMatrix<Scalar, Rows> LeftDiagonalMatrix;\n  typedef DiagonalMatrix<Scalar, Cols> RightDiagonalMatrix;\n  typedef Matrix<Scalar, Rows==Dynamic?Dynamic:2*Rows, Cols==Dynamic?Dynamic:2*Cols> BigMatrix;\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  MatrixType m1 = MatrixType::Random(rows, cols),\n             m2 = MatrixType::Random(rows, cols);\n  VectorType v1 = VectorType::Random(rows),\n             v2 = VectorType::Random(rows);\n  RowVectorType rv1 = RowVectorType::Random(cols),\n             rv2 = RowVectorType::Random(cols);\n  LeftDiagonalMatrix ldm1(v1), ldm2(v2);\n  RightDiagonalMatrix rdm1(rv1), rdm2(rv2);\n  \n  Scalar s1 = internal::random<Scalar>();\n\n  SquareMatrixType sq_m1 (v1.asDiagonal());\n  VERIFY_IS_APPROX(sq_m1, v1.asDiagonal().toDenseMatrix());\n  sq_m1 = v1.asDiagonal();\n  VERIFY_IS_APPROX(sq_m1, v1.asDiagonal().toDenseMatrix());\n  SquareMatrixType sq_m2 = v1.asDiagonal();\n  VERIFY_IS_APPROX(sq_m1, sq_m2);\n  \n  ldm1 = v1.asDiagonal();\n  LeftDiagonalMatrix ldm3(v1);\n  VERIFY_IS_APPROX(ldm1.diagonal(), ldm3.diagonal());\n  LeftDiagonalMatrix ldm4 = v1.asDiagonal();\n  VERIFY_IS_APPROX(ldm1.diagonal(), ldm4.diagonal());\n  \n  sq_m1.block(0,0,rows,rows) = ldm1;\n  VERIFY_IS_APPROX(sq_m1, ldm1.toDenseMatrix());\n  sq_m1.transpose() = ldm1;\n  VERIFY_IS_APPROX(sq_m1, ldm1.toDenseMatrix());\n  \n  Index i = internal::random<Index>(0, rows-1);\n  Index j = internal::random<Index>(0, cols-1);\n  \n  VERIFY_IS_APPROX( ((ldm1 * m1)(i,j))  , ldm1.diagonal()(i) * m1(i,j) );\n  VERIFY_IS_APPROX( ((ldm1 * (m1+m2))(i,j))  , ldm1.diagonal()(i) * (m1+m2)(i,j) );\n  VERIFY_IS_APPROX( ((m1 * rdm1)(i,j))  , rdm1.diagonal()(j) * m1(i,j) );\n  VERIFY_IS_APPROX( ((v1.asDiagonal() * m1)(i,j))  , v1(i) * m1(i,j) );\n  VERIFY_IS_APPROX( ((m1 * rv1.asDiagonal())(i,j))  , rv1(j) * m1(i,j) );\n  VERIFY_IS_APPROX( (((v1+v2).asDiagonal() * m1)(i,j))  , (v1+v2)(i) * m1(i,j) );\n  VERIFY_IS_APPROX( (((v1+v2).asDiagonal() * (m1+m2))(i,j))  , (v1+v2)(i) * (m1+m2)(i,j) );\n  VERIFY_IS_APPROX( ((m1 * (rv1+rv2).asDiagonal())(i,j))  , (rv1+rv2)(j) * m1(i,j) );\n  VERIFY_IS_APPROX( (((m1+m2) * (rv1+rv2).asDiagonal())(i,j))  , (rv1+rv2)(j) * (m1+m2)(i,j) );\n\n  BigMatrix big;\n  big.setZero(2*rows, 2*cols);\n  \n  big.block(i,j,rows,cols) = m1;\n  big.block(i,j,rows,cols) = v1.asDiagonal() * big.block(i,j,rows,cols);\n  \n  VERIFY_IS_APPROX((big.block(i,j,rows,cols)) , v1.asDiagonal() * m1 );\n  \n  big.block(i,j,rows,cols) = m1;\n  big.block(i,j,rows,cols) = big.block(i,j,rows,cols) * rv1.asDiagonal();\n  VERIFY_IS_APPROX((big.block(i,j,rows,cols)) , m1 * rv1.asDiagonal() );\n  \n  \n  // scalar multiple\n  VERIFY_IS_APPROX(LeftDiagonalMatrix(ldm1*s1).diagonal(), ldm1.diagonal() * s1);\n  VERIFY_IS_APPROX(LeftDiagonalMatrix(s1*ldm1).diagonal(), s1 * ldm1.diagonal());\n  \n  VERIFY_IS_APPROX(m1 * (rdm1 * s1), (m1 * rdm1) * s1);\n  VERIFY_IS_APPROX(m1 * (s1 * rdm1), (m1 * rdm1) * s1);\n}\n\nvoid test_diagonalmatrices()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( diagonalmatrices(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( diagonalmatrices(Matrix3f()) );\n    CALL_SUBTEST_3( diagonalmatrices(Matrix<double,3,3,RowMajor>()) );\n    CALL_SUBTEST_4( diagonalmatrices(Matrix4d()) );\n    CALL_SUBTEST_5( diagonalmatrices(Matrix<float,4,4,RowMajor>()) );\n    CALL_SUBTEST_6( diagonalmatrices(MatrixXcf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n    CALL_SUBTEST_7( diagonalmatrices(MatrixXi(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n    CALL_SUBTEST_8( diagonalmatrices(Matrix<double,Dynamic,Dynamic,RowMajor>(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n    CALL_SUBTEST_9( diagonalmatrices(MatrixXf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/dontalign.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2011 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#if defined EIGEN_TEST_PART_1 || defined EIGEN_TEST_PART_2 || defined EIGEN_TEST_PART_3 || defined EIGEN_TEST_PART_4\n#define EIGEN_DONT_ALIGN\n#elif defined EIGEN_TEST_PART_5 || defined EIGEN_TEST_PART_6 || defined EIGEN_TEST_PART_7 || defined EIGEN_TEST_PART_8\n#define EIGEN_DONT_ALIGN_STATICALLY\n#endif\n\n#include \"main.h\"\n#include <Eigen/Dense>\n\ntemplate<typename MatrixType>\nvoid dontalign(const MatrixType& m)\n{\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> VectorType;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, MatrixType::RowsAtCompileTime> SquareMatrixType;\n\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  MatrixType a = MatrixType::Random(rows,cols);\n  SquareMatrixType square = SquareMatrixType::Random(rows,rows);\n  VectorType v = VectorType::Random(rows);\n\n  VERIFY_IS_APPROX(v, square * square.colPivHouseholderQr().solve(v));\n  square = square.inverse().eval();\n  a = square * a;\n  square = square*square;\n  v = square * v;\n  v = a.adjoint() * v;\n  VERIFY(square.determinant() != Scalar(0));\n\n  // bug 219: MapAligned() was giving an assert with EIGEN_DONT_ALIGN, because Map Flags were miscomputed\n  Scalar* array = internal::aligned_new<Scalar>(rows);\n  v = VectorType::MapAligned(array, rows);\n  internal::aligned_delete(array, rows);\n}\n\nvoid test_dontalign()\n{\n#if defined EIGEN_TEST_PART_1 || defined EIGEN_TEST_PART_5\n  dontalign(Matrix3d());\n  dontalign(Matrix4f());\n#elif defined EIGEN_TEST_PART_2 || defined EIGEN_TEST_PART_6\n  dontalign(Matrix3cd());\n  dontalign(Matrix4cf());\n#elif defined EIGEN_TEST_PART_3 || defined EIGEN_TEST_PART_7\n  dontalign(Matrix<float, 32, 32>());\n  dontalign(Matrix<std::complex<float>, 32, 32>());\n#elif defined EIGEN_TEST_PART_4 || defined EIGEN_TEST_PART_8\n  dontalign(MatrixXd(32, 32));\n  dontalign(MatrixXcf(32, 32));\n#endif\n}\n"
  },
  {
    "path": "libs/eigen/test/dynalloc.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\n#if EIGEN_ALIGN\n#define ALIGNMENT 16\n#else\n#define ALIGNMENT 1\n#endif\n\nvoid check_handmade_aligned_malloc()\n{\n  for(int i = 1; i < 1000; i++)\n  {\n    char *p = (char*)internal::handmade_aligned_malloc(i);\n    VERIFY(size_t(p)%ALIGNMENT==0);\n    // if the buffer is wrongly allocated this will give a bad write --> check with valgrind\n    for(int j = 0; j < i; j++) p[j]=0;\n    internal::handmade_aligned_free(p);\n  }\n}\n\nvoid check_aligned_malloc()\n{\n  for(int i = 1; i < 1000; i++)\n  {\n    char *p = (char*)internal::aligned_malloc(i);\n    VERIFY(size_t(p)%ALIGNMENT==0);\n    // if the buffer is wrongly allocated this will give a bad write --> check with valgrind\n    for(int j = 0; j < i; j++) p[j]=0;\n    internal::aligned_free(p);\n  }\n}\n\nvoid check_aligned_new()\n{\n  for(int i = 1; i < 1000; i++)\n  {\n    float *p = internal::aligned_new<float>(i);\n    VERIFY(size_t(p)%ALIGNMENT==0);\n    // if the buffer is wrongly allocated this will give a bad write --> check with valgrind\n    for(int j = 0; j < i; j++) p[j]=0;\n    internal::aligned_delete(p,i);\n  }\n}\n\nvoid check_aligned_stack_alloc()\n{\n  for(int i = 1; i < 400; i++)\n  {\n    ei_declare_aligned_stack_constructed_variable(float,p,i,0);\n    VERIFY(size_t(p)%ALIGNMENT==0);\n    // if the buffer is wrongly allocated this will give a bad write --> check with valgrind\n    for(int j = 0; j < i; j++) p[j]=0;\n  }\n}\n\n\n// test compilation with both a struct and a class...\nstruct MyStruct\n{\n  EIGEN_MAKE_ALIGNED_OPERATOR_NEW\n  char dummychar;\n  Vector4f avec;\n};\n\nclass MyClassA\n{\n  public:\n    EIGEN_MAKE_ALIGNED_OPERATOR_NEW\n    char dummychar;\n    Vector4f avec;\n};\n\ntemplate<typename T> void check_dynaligned()\n{\n  T* obj = new T;\n  VERIFY(T::NeedsToAlign==1);\n  VERIFY(size_t(obj)%ALIGNMENT==0);\n  delete obj;\n}\n\ntemplate<typename T> void check_custom_new_delete()\n{\n  {\n    T* t = new T;\n    delete t;\n  }\n  \n  {\n    std::size_t N = internal::random<std::size_t>(1,10);\n    T* t = new T[N];\n    delete[] t;\n  }\n  \n#ifdef EIGEN_ALIGN\n  {\n    T* t = static_cast<T *>((T::operator new)(sizeof(T)));\n    (T::operator delete)(t, sizeof(T));\n  }\n  \n  {\n    T* t = static_cast<T *>((T::operator new)(sizeof(T)));\n    (T::operator delete)(t);\n  }\n#endif\n}\n\nvoid test_dynalloc()\n{\n  // low level dynamic memory allocation\n  CALL_SUBTEST(check_handmade_aligned_malloc());\n  CALL_SUBTEST(check_aligned_malloc());\n  CALL_SUBTEST(check_aligned_new());\n  CALL_SUBTEST(check_aligned_stack_alloc());\n  \n  // check static allocation, who knows ?\n  #if EIGEN_ALIGN_STATICALLY\n  for (int i=0; i<g_repeat*100; ++i)\n  {\n    CALL_SUBTEST(check_dynaligned<Vector4f>() );\n    CALL_SUBTEST(check_dynaligned<Vector2d>() );\n    CALL_SUBTEST(check_dynaligned<Matrix4f>() );\n    CALL_SUBTEST(check_dynaligned<Vector4d>() );\n    CALL_SUBTEST(check_dynaligned<Vector4i>() );\n    \n    CALL_SUBTEST( check_custom_new_delete<Vector4f>() );\n    CALL_SUBTEST( check_custom_new_delete<Vector2f>() );\n    CALL_SUBTEST( check_custom_new_delete<Matrix4f>() );\n    CALL_SUBTEST( check_custom_new_delete<MatrixXi>() );\n  }\n\n  {\n    MyStruct foo0;  VERIFY(size_t(foo0.avec.data())%ALIGNMENT==0);\n    MyClassA fooA;  VERIFY(size_t(fooA.avec.data())%ALIGNMENT==0);\n  }\n  \n  // dynamic allocation, single object\n  for (int i=0; i<g_repeat*100; ++i)\n  {\n    MyStruct *foo0 = new MyStruct();  VERIFY(size_t(foo0->avec.data())%ALIGNMENT==0);\n    MyClassA *fooA = new MyClassA();  VERIFY(size_t(fooA->avec.data())%ALIGNMENT==0);\n    delete foo0;\n    delete fooA;\n  }\n\n  // dynamic allocation, array\n  const int N = 10;\n  for (int i=0; i<g_repeat*100; ++i)\n  {\n    MyStruct *foo0 = new MyStruct[N];  VERIFY(size_t(foo0->avec.data())%ALIGNMENT==0);\n    MyClassA *fooA = new MyClassA[N];  VERIFY(size_t(fooA->avec.data())%ALIGNMENT==0);\n    delete[] foo0;\n    delete[] fooA;\n  }\n  #endif\n  \n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/CMakeLists.txt",
    "content": "add_custom_target(eigen2_buildtests)\nadd_custom_target(eigen2_check COMMAND \"ctest -R eigen2\")\nadd_dependencies(eigen2_check eigen2_buildtests)\nadd_dependencies(buildtests eigen2_buildtests)\n\nadd_definitions(\"-DEIGEN2_SUPPORT_STAGE10_FULL_EIGEN2_API\")\nadd_definitions(\"-DEIGEN_NO_EIGEN2_DEPRECATED_WARNING\")\n\nei_add_test(eigen2_meta)\nei_add_test(eigen2_sizeof)\nei_add_test(eigen2_dynalloc)\nei_add_test(eigen2_nomalloc)\n#ei_add_test(eigen2_first_aligned)\nei_add_test(eigen2_mixingtypes)\n#ei_add_test(eigen2_packetmath)\nei_add_test(eigen2_unalignedassert)\n#ei_add_test(eigen2_vectorization_logic)\nei_add_test(eigen2_basicstuff)\nei_add_test(eigen2_linearstructure)\nei_add_test(eigen2_cwiseop)\nei_add_test(eigen2_sum)\nei_add_test(eigen2_product_small)\nei_add_test(eigen2_product_large ${EI_OFLAG})\nei_add_test(eigen2_adjoint)\nei_add_test(eigen2_submatrices)\nei_add_test(eigen2_miscmatrices)\nei_add_test(eigen2_commainitializer)\nei_add_test(eigen2_smallvectors)\nei_add_test(eigen2_map)\nei_add_test(eigen2_array)\nei_add_test(eigen2_triangular)\nei_add_test(eigen2_cholesky \" \" \"${GSL_LIBRARIES}\")\nei_add_test(eigen2_lu ${EI_OFLAG})\nei_add_test(eigen2_determinant ${EI_OFLAG})\nei_add_test(eigen2_inverse)\nei_add_test(eigen2_qr)\nei_add_test(eigen2_eigensolver \" \" \"${GSL_LIBRARIES}\")\nei_add_test(eigen2_svd)\nei_add_test(eigen2_geometry)\nei_add_test(eigen2_geometry_with_eigen2_prefix)\nei_add_test(eigen2_hyperplane)\nei_add_test(eigen2_parametrizedline)\nei_add_test(eigen2_alignedbox)\nei_add_test(eigen2_regression)\nei_add_test(eigen2_stdvector)\nei_add_test(eigen2_newstdvector)\nif(QT4_FOUND)\n  ei_add_test(eigen2_qtvector \" \" \"${QT_QTCORE_LIBRARY}\")\nendif(QT4_FOUND)\n# no support for eigen2 sparse module\n# if(NOT EIGEN_DEFAULT_TO_ROW_MAJOR)\n#   ei_add_test(eigen2_sparse_vector)\n#   ei_add_test(eigen2_sparse_basic)\n#   ei_add_test(eigen2_sparse_solvers \" \" \"${SPARSE_LIBS}\")\n#   ei_add_test(eigen2_sparse_product)\n# endif()\nei_add_test(eigen2_swap)\nei_add_test(eigen2_visitor)\nei_add_test(eigen2_bug_132)\n\nei_add_test(eigen2_prec_inverse_4x4 ${EI_OFLAG})\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_adjoint.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\ntemplate<typename MatrixType> void adjoint(const MatrixType& m)\n{\n  /* this test covers the following files:\n     Transpose.h Conjugate.h Dot.h\n  */\n\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> VectorType;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, MatrixType::RowsAtCompileTime> SquareMatrixType;\n  int rows = m.rows();\n  int cols = m.cols();\n\n  RealScalar largerEps = test_precision<RealScalar>();\n  if (ei_is_same_type<RealScalar,float>::ret)\n    largerEps = RealScalar(1e-3f);\n\n  MatrixType m1 = MatrixType::Random(rows, cols),\n             m2 = MatrixType::Random(rows, cols),\n             m3(rows, cols),\n             square = SquareMatrixType::Random(rows, rows);\n  VectorType v1 = VectorType::Random(rows),\n             v2 = VectorType::Random(rows),\n             v3 = VectorType::Random(rows),\n             vzero = VectorType::Zero(rows);\n\n  Scalar s1 = ei_random<Scalar>(),\n         s2 = ei_random<Scalar>();\n\n  // check basic compatibility of adjoint, transpose, conjugate\n  VERIFY_IS_APPROX(m1.transpose().conjugate().adjoint(),    m1);\n  VERIFY_IS_APPROX(m1.adjoint().conjugate().transpose(),    m1);\n\n  // check multiplicative behavior\n  VERIFY_IS_APPROX((m1.adjoint() * m2).adjoint(),           m2.adjoint() * m1);\n  VERIFY_IS_APPROX((s1 * m1).adjoint(),                     ei_conj(s1) * m1.adjoint());\n\n  // check basic properties of dot, norm, norm2\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  VERIFY(ei_isApprox((s1 * v1 + s2 * v2).eigen2_dot(v3),   s1 * v1.eigen2_dot(v3) + s2 * v2.eigen2_dot(v3), largerEps));\n  VERIFY(ei_isApprox(v3.eigen2_dot(s1 * v1 + s2 * v2),     ei_conj(s1)*v3.eigen2_dot(v1)+ei_conj(s2)*v3.eigen2_dot(v2), largerEps));\n  VERIFY_IS_APPROX(ei_conj(v1.eigen2_dot(v2)),               v2.eigen2_dot(v1));\n  VERIFY_IS_APPROX(ei_real(v1.eigen2_dot(v1)),               v1.squaredNorm());\n  if(NumTraits<Scalar>::HasFloatingPoint)\n    VERIFY_IS_APPROX(v1.squaredNorm(),                      v1.norm() * v1.norm());\n  VERIFY_IS_MUCH_SMALLER_THAN(ei_abs(vzero.eigen2_dot(v1)),  static_cast<RealScalar>(1));\n  if(NumTraits<Scalar>::HasFloatingPoint)\n    VERIFY_IS_MUCH_SMALLER_THAN(vzero.norm(),         static_cast<RealScalar>(1));\n\n  // check compatibility of dot and adjoint\n  VERIFY(ei_isApprox(v1.eigen2_dot(square * v2), (square.adjoint() * v1).eigen2_dot(v2), largerEps));\n\n  // like in testBasicStuff, test operator() to check const-qualification\n  int r = ei_random<int>(0, rows-1),\n      c = ei_random<int>(0, cols-1);\n  VERIFY_IS_APPROX(m1.conjugate()(r,c), ei_conj(m1(r,c)));\n  VERIFY_IS_APPROX(m1.adjoint()(c,r), ei_conj(m1(r,c)));\n\n  if(NumTraits<Scalar>::HasFloatingPoint)\n  {\n    // check that Random().normalized() works: tricky as the random xpr must be evaluated by\n    // normalized() in order to produce a consistent result.\n    VERIFY_IS_APPROX(VectorType::Random(rows).normalized().norm(), RealScalar(1));\n  }\n\n  // check inplace transpose\n  m3 = m1;\n  m3.transposeInPlace();\n  VERIFY_IS_APPROX(m3,m1.transpose());\n  m3.transposeInPlace();\n  VERIFY_IS_APPROX(m3,m1);\n  \n}\n\nvoid test_eigen2_adjoint()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( adjoint(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( adjoint(Matrix3d()) );\n    CALL_SUBTEST_3( adjoint(Matrix4f()) );\n    CALL_SUBTEST_4( adjoint(MatrixXcf(4, 4)) );\n    CALL_SUBTEST_5( adjoint(MatrixXi(8, 12)) );\n    CALL_SUBTEST_6( adjoint(MatrixXf(21, 21)) );\n  }\n  // test a large matrix only once\n  CALL_SUBTEST_7( adjoint(Matrix<float, 100, 100>()) );\n}\n\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_alignedbox.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <Eigen/Geometry>\n#include <Eigen/LU>\n#include <Eigen/QR>\n\ntemplate<typename BoxType> void alignedbox(const BoxType& _box)\n{\n  /* this test covers the following files:\n     AlignedBox.h\n  */\n\n  const int dim = _box.dim();\n  typedef typename BoxType::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  typedef Matrix<Scalar, BoxType::AmbientDimAtCompileTime, 1> VectorType;\n\n  VectorType p0 = VectorType::Random(dim);\n  VectorType p1 = VectorType::Random(dim);\n  RealScalar s1 = ei_random<RealScalar>(0,1);\n\n  BoxType b0(dim);\n  BoxType b1(VectorType::Random(dim),VectorType::Random(dim));\n  BoxType b2;\n\n  b0.extend(p0);\n  b0.extend(p1);\n  VERIFY(b0.contains(p0*s1+(Scalar(1)-s1)*p1));\n  VERIFY(!b0.contains(p0 + (1+s1)*(p1-p0)));\n\n  (b2 = b0).extend(b1);\n  VERIFY(b2.contains(b0));\n  VERIFY(b2.contains(b1));\n  VERIFY_IS_APPROX(b2.clamp(b0), b0);\n\n  // casting\n  const int Dim = BoxType::AmbientDimAtCompileTime;\n  typedef typename GetDifferentType<Scalar>::type OtherScalar;\n  AlignedBox<OtherScalar,Dim> hp1f = b0.template cast<OtherScalar>();\n  VERIFY_IS_APPROX(hp1f.template cast<Scalar>(),b0);\n  AlignedBox<Scalar,Dim> hp1d = b0.template cast<Scalar>();\n  VERIFY_IS_APPROX(hp1d.template cast<Scalar>(),b0);\n}\n\nvoid test_eigen2_alignedbox()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( alignedbox(AlignedBox<float,2>()) );\n    CALL_SUBTEST_2( alignedbox(AlignedBox<float,3>()) );\n    CALL_SUBTEST_3( alignedbox(AlignedBox<double,4>()) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_array.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <Eigen/Array>\n\ntemplate<typename MatrixType> void array(const MatrixType& m)\n{\n  /* this test covers the following files:\n     Array.cpp\n  */\n\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> VectorType;\n\n  int rows = m.rows();\n  int cols = m.cols();\n\n  MatrixType m1 = MatrixType::Random(rows, cols),\n             m2 = MatrixType::Random(rows, cols),\n             m3(rows, cols);\n\n  Scalar  s1 = ei_random<Scalar>(),\n          s2 = ei_random<Scalar>();\n\n  // scalar addition\n  VERIFY_IS_APPROX(m1.cwise() + s1, s1 + m1.cwise());\n  VERIFY_IS_APPROX(m1.cwise() + s1, MatrixType::Constant(rows,cols,s1) + m1);\n  VERIFY_IS_APPROX((m1*Scalar(2)).cwise() - s2, (m1+m1) - MatrixType::Constant(rows,cols,s2) );\n  m3 = m1;\n  m3.cwise() += s2;\n  VERIFY_IS_APPROX(m3, m1.cwise() + s2);\n  m3 = m1;\n  m3.cwise() -= s1;\n  VERIFY_IS_APPROX(m3, m1.cwise() - s1);\n\n  // reductions\n  VERIFY_IS_APPROX(m1.colwise().sum().sum(), m1.sum());\n  VERIFY_IS_APPROX(m1.rowwise().sum().sum(), m1.sum());\n  if (!ei_isApprox(m1.sum(), (m1+m2).sum()))\n    VERIFY_IS_NOT_APPROX(((m1+m2).rowwise().sum()).sum(), m1.sum());\n  VERIFY_IS_APPROX(m1.colwise().sum(), m1.colwise().redux(internal::scalar_sum_op<Scalar>()));\n}\n\ntemplate<typename MatrixType> void comparisons(const MatrixType& m)\n{\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> VectorType;\n\n  int rows = m.rows();\n  int cols = m.cols();\n\n  int r = ei_random<int>(0, rows-1),\n      c = ei_random<int>(0, cols-1);\n\n  MatrixType m1 = MatrixType::Random(rows, cols),\n             m2 = MatrixType::Random(rows, cols),\n             m3(rows, cols);\n\n  VERIFY(((m1.cwise() + Scalar(1)).cwise() > m1).all());\n  VERIFY(((m1.cwise() - Scalar(1)).cwise() < m1).all());\n  if (rows*cols>1)\n  {\n    m3 = m1;\n    m3(r,c) += 1;\n    VERIFY(! (m1.cwise() < m3).all() );\n    VERIFY(! (m1.cwise() > m3).all() );\n  }\n  \n  // comparisons to scalar\n  VERIFY( (m1.cwise() != (m1(r,c)+1) ).any() );\n  VERIFY( (m1.cwise() > (m1(r,c)-1) ).any() );\n  VERIFY( (m1.cwise() < (m1(r,c)+1) ).any() );\n  VERIFY( (m1.cwise() == m1(r,c) ).any() );\n  \n  // test Select\n  VERIFY_IS_APPROX( (m1.cwise()<m2).select(m1,m2), m1.cwise().min(m2) );\n  VERIFY_IS_APPROX( (m1.cwise()>m2).select(m1,m2), m1.cwise().max(m2) );\n  Scalar mid = (m1.cwise().abs().minCoeff() + m1.cwise().abs().maxCoeff())/Scalar(2);\n  for (int j=0; j<cols; ++j)\n  for (int i=0; i<rows; ++i)\n    m3(i,j) = ei_abs(m1(i,j))<mid ? 0 : m1(i,j);\n  VERIFY_IS_APPROX( (m1.cwise().abs().cwise()<MatrixType::Constant(rows,cols,mid))\n                        .select(MatrixType::Zero(rows,cols),m1), m3);\n  // shorter versions:\n  VERIFY_IS_APPROX( (m1.cwise().abs().cwise()<MatrixType::Constant(rows,cols,mid))\n                        .select(0,m1), m3);\n  VERIFY_IS_APPROX( (m1.cwise().abs().cwise()>=MatrixType::Constant(rows,cols,mid))\n                        .select(m1,0), m3);\n  // even shorter version:\n  VERIFY_IS_APPROX( (m1.cwise().abs().cwise()<mid).select(0,m1), m3);\n  \n  // count\n  VERIFY(((m1.cwise().abs().cwise()+1).cwise()>RealScalar(0.1)).count() == rows*cols);\n  VERIFY_IS_APPROX(((m1.cwise().abs().cwise()+1).cwise()>RealScalar(0.1)).colwise().count().template cast<int>(), RowVectorXi::Constant(cols,rows));\n  VERIFY_IS_APPROX(((m1.cwise().abs().cwise()+1).cwise()>RealScalar(0.1)).rowwise().count().template cast<int>(), VectorXi::Constant(rows, cols));\n}\n\ntemplate<typename VectorType> void lpNorm(const VectorType& v)\n{\n  VectorType u = VectorType::Random(v.size());\n\n  VERIFY_IS_APPROX(u.template lpNorm<Infinity>(), u.cwise().abs().maxCoeff());\n  VERIFY_IS_APPROX(u.template lpNorm<1>(), u.cwise().abs().sum());\n  VERIFY_IS_APPROX(u.template lpNorm<2>(), ei_sqrt(u.cwise().abs().cwise().square().sum()));\n  VERIFY_IS_APPROX(ei_pow(u.template lpNorm<5>(), typename VectorType::RealScalar(5)), u.cwise().abs().cwise().pow(5).sum());\n}\n\nvoid test_eigen2_array()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( array(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( array(Matrix2f()) );\n    CALL_SUBTEST_3( array(Matrix4d()) );\n    CALL_SUBTEST_4( array(MatrixXcf(3, 3)) );\n    CALL_SUBTEST_5( array(MatrixXf(8, 12)) );\n    CALL_SUBTEST_6( array(MatrixXi(8, 12)) );\n  }\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( comparisons(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( comparisons(Matrix2f()) );\n    CALL_SUBTEST_3( comparisons(Matrix4d()) );\n    CALL_SUBTEST_5( comparisons(MatrixXf(8, 12)) );\n    CALL_SUBTEST_6( comparisons(MatrixXi(8, 12)) );\n  }\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( lpNorm(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( lpNorm(Vector2f()) );\n    CALL_SUBTEST_3( lpNorm(Vector3d()) );\n    CALL_SUBTEST_4( lpNorm(Vector4f()) );\n    CALL_SUBTEST_5( lpNorm(VectorXf(16)) );\n    CALL_SUBTEST_7( lpNorm(VectorXcd(10)) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_basicstuff.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\ntemplate<typename MatrixType> void basicStuff(const MatrixType& m)\n{\n  typedef typename MatrixType::Scalar Scalar;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> VectorType;\n\n  int rows = m.rows();\n  int cols = m.cols();\n\n  // this test relies a lot on Random.h, and there's not much more that we can do\n  // to test it, hence I consider that we will have tested Random.h\n  MatrixType m1 = MatrixType::Random(rows, cols),\n             m2 = MatrixType::Random(rows, cols),\n             m3(rows, cols),\n             mzero = MatrixType::Zero(rows, cols),\n             square = Matrix<Scalar, MatrixType::RowsAtCompileTime, MatrixType::RowsAtCompileTime>::Random(rows, rows);\n  VectorType v1 = VectorType::Random(rows),\n             vzero = VectorType::Zero(rows);\n\n  Scalar x = ei_random<Scalar>();\n\n  int r = ei_random<int>(0, rows-1),\n      c = ei_random<int>(0, cols-1);\n\n  m1.coeffRef(r,c) = x;\n  VERIFY_IS_APPROX(x, m1.coeff(r,c));\n  m1(r,c) = x;\n  VERIFY_IS_APPROX(x, m1(r,c));\n  v1.coeffRef(r) = x;\n  VERIFY_IS_APPROX(x, v1.coeff(r));\n  v1(r) = x;\n  VERIFY_IS_APPROX(x, v1(r));\n  v1[r] = x;\n  VERIFY_IS_APPROX(x, v1[r]);\n\n  VERIFY_IS_APPROX(               v1,    v1);\n  VERIFY_IS_NOT_APPROX(           v1,    2*v1);\n  VERIFY_IS_MUCH_SMALLER_THAN(    vzero, v1);\n  if(NumTraits<Scalar>::HasFloatingPoint)\n    VERIFY_IS_MUCH_SMALLER_THAN(  vzero, v1.norm());\n  VERIFY_IS_NOT_MUCH_SMALLER_THAN(v1,    v1);\n  VERIFY_IS_APPROX(               vzero, v1-v1);\n  VERIFY_IS_APPROX(               m1,    m1);\n  VERIFY_IS_NOT_APPROX(           m1,    2*m1);\n  VERIFY_IS_MUCH_SMALLER_THAN(    mzero, m1);\n  VERIFY_IS_NOT_MUCH_SMALLER_THAN(m1,    m1);\n  VERIFY_IS_APPROX(               mzero, m1-m1);\n\n  // always test operator() on each read-only expression class,\n  // in order to check const-qualifiers.\n  // indeed, if an expression class (here Zero) is meant to be read-only,\n  // hence has no _write() method, the corresponding MatrixBase method (here zero())\n  // should return a const-qualified object so that it is the const-qualified\n  // operator() that gets called, which in turn calls _read().\n  VERIFY_IS_MUCH_SMALLER_THAN(MatrixType::Zero(rows,cols)(r,c), static_cast<Scalar>(1));\n\n  // now test copying a row-vector into a (column-)vector and conversely.\n  square.col(r) = square.row(r).eval();\n  Matrix<Scalar, 1, MatrixType::RowsAtCompileTime> rv(rows);\n  Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> cv(rows);\n  rv = square.row(r);\n  cv = square.col(r);\n  VERIFY_IS_APPROX(rv, cv.transpose());\n\n  if(cols!=1 && rows!=1 && MatrixType::SizeAtCompileTime!=Dynamic)\n  {\n    VERIFY_RAISES_ASSERT(m1 = (m2.block(0,0, rows-1, cols-1)));\n  }\n\n  VERIFY_IS_APPROX(m3 = m1,m1);\n  MatrixType m4;\n  VERIFY_IS_APPROX(m4 = m1,m1);\n\n  // test swap\n  m3 = m1;\n  m1.swap(m2);\n  VERIFY_IS_APPROX(m3, m2);\n  if(rows*cols>=3)\n  {\n    VERIFY_IS_NOT_APPROX(m3, m1);\n  }\n}\n\nvoid test_eigen2_basicstuff()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( basicStuff(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( basicStuff(Matrix4d()) );\n    CALL_SUBTEST_3( basicStuff(MatrixXcf(3, 3)) );\n    CALL_SUBTEST_4( basicStuff(MatrixXi(8, 12)) );\n    CALL_SUBTEST_5( basicStuff(MatrixXcd(20, 20)) );\n    CALL_SUBTEST_6( basicStuff(Matrix<float, 100, 100>()) );\n    CALL_SUBTEST_7( basicStuff(Matrix<long double,Dynamic,Dynamic>(10,10)) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_bug_132.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2010 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\nvoid test_eigen2_bug_132() {\n  int size = 100;\n  MatrixXd A(size, size);\n  VectorXd b(size), c(size);\n  {\n    VectorXd y = A.transpose() * (b-c);  // bug 132: infinite recursion in coeffRef\n    VectorXd z = (b-c).transpose() * A;  // bug 132: infinite recursion in coeffRef\n  }\n\n  // the following ones weren't failing, but let's include them for completeness:\n  {\n    VectorXd y = A * (b-c);\n    VectorXd z = (b-c).transpose() * A.transpose();\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_cholesky.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#define EIGEN_NO_ASSERTION_CHECKING\n#include \"main.h\"\n#include <Eigen/Cholesky>\n#include <Eigen/LU>\n\n#ifdef HAS_GSL\n#include \"gsl_helper.h\"\n#endif\n\ntemplate<typename MatrixType> void cholesky(const MatrixType& m)\n{\n  /* this test covers the following files:\n     LLT.h LDLT.h\n  */\n  int rows = m.rows();\n  int cols = m.cols();\n\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, MatrixType::RowsAtCompileTime> SquareMatrixType;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> VectorType;\n\n  MatrixType a0 = MatrixType::Random(rows,cols);\n  VectorType vecB = VectorType::Random(rows), vecX(rows);\n  MatrixType matB = MatrixType::Random(rows,cols), matX(rows,cols);\n  SquareMatrixType symm =  a0 * a0.adjoint();\n  // let's make sure the matrix is not singular or near singular\n  MatrixType a1 = MatrixType::Random(rows,cols);\n  symm += a1 * a1.adjoint();\n\n  #ifdef HAS_GSL\n  if (ei_is_same_type<RealScalar,double>::ret)\n  {\n    typedef GslTraits<Scalar> Gsl;\n    typename Gsl::Matrix gMatA=0, gSymm=0;\n    typename Gsl::Vector gVecB=0, gVecX=0;\n    convert<MatrixType>(symm, gSymm);\n    convert<MatrixType>(symm, gMatA);\n    convert<VectorType>(vecB, gVecB);\n    convert<VectorType>(vecB, gVecX);\n    Gsl::cholesky(gMatA);\n    Gsl::cholesky_solve(gMatA, gVecB, gVecX);\n    VectorType vecX(rows), _vecX, _vecB;\n    convert(gVecX, _vecX);\n    symm.llt().solve(vecB, &vecX);\n    Gsl::prod(gSymm, gVecX, gVecB);\n    convert(gVecB, _vecB);\n    // test gsl itself !\n    VERIFY_IS_APPROX(vecB, _vecB);\n    VERIFY_IS_APPROX(vecX, _vecX);\n\n    Gsl::free(gMatA);\n    Gsl::free(gSymm);\n    Gsl::free(gVecB);\n    Gsl::free(gVecX);\n  }\n  #endif\n\n  {\n    LDLT<SquareMatrixType> ldlt(symm);\n    VERIFY(ldlt.isPositiveDefinite());\n    // in eigen3, LDLT is pivoting\n    //VERIFY_IS_APPROX(symm, ldlt.matrixL() * ldlt.vectorD().asDiagonal() * ldlt.matrixL().adjoint());\n    ldlt.solve(vecB, &vecX);\n    VERIFY_IS_APPROX(symm * vecX, vecB);\n    ldlt.solve(matB, &matX);\n    VERIFY_IS_APPROX(symm * matX, matB);\n  }\n\n  {\n    LLT<SquareMatrixType> chol(symm);\n    VERIFY(chol.isPositiveDefinite());\n    VERIFY_IS_APPROX(symm, chol.matrixL() * chol.matrixL().adjoint());\n    chol.solve(vecB, &vecX);\n    VERIFY_IS_APPROX(symm * vecX, vecB);\n    chol.solve(matB, &matX);\n    VERIFY_IS_APPROX(symm * matX, matB);\n  }\n\n#if 0 // cholesky is not rank-revealing anyway\n  // test isPositiveDefinite on non definite matrix\n  if (rows>4)\n  {\n    SquareMatrixType symm =  a0.block(0,0,rows,cols-4) * a0.block(0,0,rows,cols-4).adjoint();\n    LLT<SquareMatrixType> chol(symm);\n    VERIFY(!chol.isPositiveDefinite());\n    LDLT<SquareMatrixType> cholnosqrt(symm);\n    VERIFY(!cholnosqrt.isPositiveDefinite());\n  }\n#endif\n}\n\nvoid test_eigen2_cholesky()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( cholesky(Matrix<double,1,1>()) );\n    CALL_SUBTEST_2( cholesky(Matrix2d()) );\n    CALL_SUBTEST_3( cholesky(Matrix3f()) );\n    CALL_SUBTEST_4( cholesky(Matrix4d()) );\n    CALL_SUBTEST_5( cholesky(MatrixXcd(7,7)) );\n    CALL_SUBTEST_6( cholesky(MatrixXf(17,17)) );\n    CALL_SUBTEST_7( cholesky(MatrixXd(33,33)) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_commainitializer.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\nvoid test_eigen2_commainitializer()\n{\n  Matrix3d m3;\n  Matrix4d m4;\n\n  VERIFY_RAISES_ASSERT( (m3 << 1, 2, 3, 4, 5, 6, 7, 8) );\n  \n  #ifndef _MSC_VER\n  VERIFY_RAISES_ASSERT( (m3 << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10) );\n  #endif\n\n  double data[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};\n  Matrix3d ref = Map<Matrix<double,3,3,RowMajor> >(data);\n\n  m3 = Matrix3d::Random();\n  m3 << 1, 2, 3, 4, 5, 6, 7, 8, 9;\n  VERIFY_IS_APPROX(m3, ref );\n\n  Vector3d vec[3];\n  vec[0] << 1, 4, 7;\n  vec[1] << 2, 5, 8;\n  vec[2] << 3, 6, 9;\n  m3 = Matrix3d::Random();\n  m3 << vec[0], vec[1], vec[2];\n  VERIFY_IS_APPROX(m3, ref);\n\n  vec[0] << 1, 2, 3;\n  vec[1] << 4, 5, 6;\n  vec[2] << 7, 8, 9;\n  m3 = Matrix3d::Random();\n  m3 << vec[0].transpose(),\n        4, 5, 6,\n        vec[2].transpose();\n  VERIFY_IS_APPROX(m3, ref);\n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_cwiseop.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <functional>\n#include <Eigen/Array>\n\nusing namespace std;\n\ntemplate<typename Scalar> struct AddIfNull {\n    const Scalar operator() (const Scalar a, const Scalar b) const {return a<=1e-3 ? b : a;}\n    enum { Cost = NumTraits<Scalar>::AddCost };\n};\n\ntemplate<typename MatrixType> void cwiseops(const MatrixType& m)\n{\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> VectorType;\n\n  int rows = m.rows();\n  int cols = m.cols();\n\n  MatrixType m1 = MatrixType::Random(rows, cols),\n             m2 = MatrixType::Random(rows, cols),\n             m3(rows, cols),\n             m4(rows, cols),\n             mzero = MatrixType::Zero(rows, cols),\n             mones = MatrixType::Ones(rows, cols),\n             identity = Matrix<Scalar, MatrixType::RowsAtCompileTime, MatrixType::RowsAtCompileTime>\n                              ::Identity(rows, rows);\n  VectorType vzero = VectorType::Zero(rows),\n             vones = VectorType::Ones(rows),\n             v3(rows);\n\n  int r = ei_random<int>(0, rows-1),\n      c = ei_random<int>(0, cols-1);\n  \n  Scalar s1 = ei_random<Scalar>();\n  \n  // test Zero, Ones, Constant, and the set* variants\n  m3 = MatrixType::Constant(rows, cols, s1);\n  for (int j=0; j<cols; ++j)\n    for (int i=0; i<rows; ++i)\n    {\n      VERIFY_IS_APPROX(mzero(i,j), Scalar(0));\n      VERIFY_IS_APPROX(mones(i,j), Scalar(1));\n      VERIFY_IS_APPROX(m3(i,j), s1);\n    }\n  VERIFY(mzero.isZero());\n  VERIFY(mones.isOnes());\n  VERIFY(m3.isConstant(s1));\n  VERIFY(identity.isIdentity());\n  VERIFY_IS_APPROX(m4.setConstant(s1), m3);\n  VERIFY_IS_APPROX(m4.setConstant(rows,cols,s1), m3);\n  VERIFY_IS_APPROX(m4.setZero(), mzero);\n  VERIFY_IS_APPROX(m4.setZero(rows,cols), mzero);\n  VERIFY_IS_APPROX(m4.setOnes(), mones);\n  VERIFY_IS_APPROX(m4.setOnes(rows,cols), mones);\n  m4.fill(s1);\n  VERIFY_IS_APPROX(m4, m3);\n  \n  VERIFY_IS_APPROX(v3.setConstant(rows, s1), VectorType::Constant(rows,s1));\n  VERIFY_IS_APPROX(v3.setZero(rows), vzero);\n  VERIFY_IS_APPROX(v3.setOnes(rows), vones);\n\n  m2 = m2.template binaryExpr<AddIfNull<Scalar> >(mones);\n\n  VERIFY_IS_APPROX(m1.cwise().pow(2), m1.cwise().abs2());\n  VERIFY_IS_APPROX(m1.cwise().pow(2), m1.cwise().square());\n  VERIFY_IS_APPROX(m1.cwise().pow(3), m1.cwise().cube());\n\n  VERIFY_IS_APPROX(m1 + mones, m1.cwise()+Scalar(1));\n  VERIFY_IS_APPROX(m1 - mones, m1.cwise()-Scalar(1));\n  m3 = m1; m3.cwise() += 1;\n  VERIFY_IS_APPROX(m1 + mones, m3);\n  m3 = m1; m3.cwise() -= 1;\n  VERIFY_IS_APPROX(m1 - mones, m3);\n\n  VERIFY_IS_APPROX(m2, m2.cwise() * mones);\n  VERIFY_IS_APPROX(m1.cwise() * m2,  m2.cwise() * m1);\n  m3 = m1;\n  m3.cwise() *= m2;\n  VERIFY_IS_APPROX(m3, m1.cwise() * m2);\n  \n  VERIFY_IS_APPROX(mones,    m2.cwise()/m2);\n  if(NumTraits<Scalar>::HasFloatingPoint)\n  {\n    VERIFY_IS_APPROX(m1.cwise() / m2,    m1.cwise() * (m2.cwise().inverse()));\n    m3 = m1.cwise().abs().cwise().sqrt();\n    VERIFY_IS_APPROX(m3.cwise().square(), m1.cwise().abs());\n    VERIFY_IS_APPROX(m1.cwise().square().cwise().sqrt(), m1.cwise().abs());\n    VERIFY_IS_APPROX(m1.cwise().abs().cwise().log().cwise().exp() , m1.cwise().abs());\n\n    VERIFY_IS_APPROX(m1.cwise().pow(2), m1.cwise().square());\n    m3 = (m1.cwise().abs().cwise()<=RealScalar(0.01)).select(mones,m1);\n    VERIFY_IS_APPROX(m3.cwise().pow(-1), m3.cwise().inverse());\n    m3 = m1.cwise().abs();\n    VERIFY_IS_APPROX(m3.cwise().pow(RealScalar(0.5)), m3.cwise().sqrt());\n    \n//     VERIFY_IS_APPROX(m1.cwise().tan(), m1.cwise().sin().cwise() / m1.cwise().cos());\n    VERIFY_IS_APPROX(mones, m1.cwise().sin().cwise().square() + m1.cwise().cos().cwise().square());\n    m3 = m1;\n    m3.cwise() /= m2;\n    VERIFY_IS_APPROX(m3, m1.cwise() / m2);\n  }\n\n  // check min\n  VERIFY_IS_APPROX( m1.cwise().min(m2), m2.cwise().min(m1) );\n  VERIFY_IS_APPROX( m1.cwise().min(m1+mones), m1 );\n  VERIFY_IS_APPROX( m1.cwise().min(m1-mones), m1-mones );\n\n  // check max\n  VERIFY_IS_APPROX( m1.cwise().max(m2), m2.cwise().max(m1) );\n  VERIFY_IS_APPROX( m1.cwise().max(m1-mones), m1 );\n  VERIFY_IS_APPROX( m1.cwise().max(m1+mones), m1+mones );\n  \n  VERIFY( (m1.cwise() == m1).all() );\n  VERIFY( (m1.cwise() != m2).any() );\n  VERIFY(!(m1.cwise() == (m1+mones)).any() );\n  if (rows*cols>1)\n  {\n    m3 = m1;\n    m3(r,c) += 1;\n    VERIFY( (m1.cwise() == m3).any() );\n    VERIFY( !(m1.cwise() == m3).all() );\n  }\n  VERIFY( (m1.cwise().min(m2).cwise() <= m2).all() );\n  VERIFY( (m1.cwise().max(m2).cwise() >= m2).all() );\n  VERIFY( (m1.cwise().min(m2).cwise() < (m1+mones)).all() );\n  VERIFY( (m1.cwise().max(m2).cwise() > (m1-mones)).all() );\n\n  VERIFY( (m1.cwise()<m1.unaryExpr(bind2nd(plus<Scalar>(), Scalar(1)))).all() );\n  VERIFY( !(m1.cwise()<m1.unaryExpr(bind2nd(minus<Scalar>(), Scalar(1)))).all() );\n  VERIFY( !(m1.cwise()>m1.unaryExpr(bind2nd(plus<Scalar>(), Scalar(1)))).any() );\n}\n\nvoid test_eigen2_cwiseop()\n{\n  for(int i = 0; i < g_repeat ; i++) {\n    CALL_SUBTEST_1( cwiseops(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( cwiseops(Matrix4d()) );\n    CALL_SUBTEST_3( cwiseops(MatrixXf(3, 3)) );\n    CALL_SUBTEST_3( cwiseops(MatrixXf(22, 22)) );\n    CALL_SUBTEST_4( cwiseops(MatrixXi(8, 12)) );\n    CALL_SUBTEST_5( cwiseops(MatrixXd(20, 20)) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_determinant.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <Eigen/LU>\n\ntemplate<typename MatrixType> void determinant(const MatrixType& m)\n{\n  /* this test covers the following files:\n     Determinant.h\n  */\n  int size = m.rows();\n\n  MatrixType m1(size, size), m2(size, size);\n  m1.setRandom();\n  m2.setRandom();\n  typedef typename MatrixType::Scalar Scalar;\n  Scalar x = ei_random<Scalar>();\n  VERIFY_IS_APPROX(MatrixType::Identity(size, size).determinant(), Scalar(1));\n  VERIFY_IS_APPROX((m1*m2).determinant(), m1.determinant() * m2.determinant());\n  if(size==1) return;\n  int i = ei_random<int>(0, size-1);\n  int j;\n  do {\n    j = ei_random<int>(0, size-1);\n  } while(j==i);\n  m2 = m1;\n  m2.row(i).swap(m2.row(j));\n  VERIFY_IS_APPROX(m2.determinant(), -m1.determinant());\n  m2 = m1;\n  m2.col(i).swap(m2.col(j));\n  VERIFY_IS_APPROX(m2.determinant(), -m1.determinant());\n  VERIFY_IS_APPROX(m2.determinant(), m2.transpose().determinant());\n  VERIFY_IS_APPROX(ei_conj(m2.determinant()), m2.adjoint().determinant());\n  m2 = m1;\n  m2.row(i) += x*m2.row(j);\n  VERIFY_IS_APPROX(m2.determinant(), m1.determinant());\n  m2 = m1;\n  m2.row(i) *= x;\n  VERIFY_IS_APPROX(m2.determinant(), m1.determinant() * x);\n}\n\nvoid test_eigen2_determinant()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( determinant(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( determinant(Matrix<double, 2, 2>()) );\n    CALL_SUBTEST_3( determinant(Matrix<double, 3, 3>()) );\n    CALL_SUBTEST_4( determinant(Matrix<double, 4, 4>()) );\n    CALL_SUBTEST_5( determinant(Matrix<std::complex<double>, 10, 10>()) );\n    CALL_SUBTEST_6( determinant(MatrixXd(20, 20)) );\n  }\n  CALL_SUBTEST_6( determinant(MatrixXd(200, 200)) );\n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_dynalloc.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\n#if EIGEN_ARCH_WANTS_ALIGNMENT\n#define ALIGNMENT 16\n#else\n#define ALIGNMENT 1\n#endif\n\nvoid check_handmade_aligned_malloc()\n{\n  for(int i = 1; i < 1000; i++)\n  {\n    char *p = (char*)ei_handmade_aligned_malloc(i);\n    VERIFY(std::size_t(p)%ALIGNMENT==0);\n    // if the buffer is wrongly allocated this will give a bad write --> check with valgrind\n    for(int j = 0; j < i; j++) p[j]=0;\n    ei_handmade_aligned_free(p);\n  }\n}\n\nvoid check_aligned_malloc()\n{\n  for(int i = 1; i < 1000; i++)\n  {\n    char *p = (char*)ei_aligned_malloc(i);\n    VERIFY(std::size_t(p)%ALIGNMENT==0);\n    // if the buffer is wrongly allocated this will give a bad write --> check with valgrind\n    for(int j = 0; j < i; j++) p[j]=0;\n    ei_aligned_free(p);\n  }\n}\n\nvoid check_aligned_new()\n{\n  for(int i = 1; i < 1000; i++)\n  {\n    float *p = ei_aligned_new<float>(i);\n    VERIFY(std::size_t(p)%ALIGNMENT==0);\n    // if the buffer is wrongly allocated this will give a bad write --> check with valgrind\n    for(int j = 0; j < i; j++) p[j]=0;\n    ei_aligned_delete(p,i);\n  }\n}\n\nvoid check_aligned_stack_alloc()\n{\n  for(int i = 1; i < 1000; i++)\n  {\n    ei_declare_aligned_stack_constructed_variable(float, p, i, 0);\n    VERIFY(std::size_t(p)%ALIGNMENT==0);\n    // if the buffer is wrongly allocated this will give a bad write --> check with valgrind\n    for(int j = 0; j < i; j++) p[j]=0;\n  }\n}\n\n\n// test compilation with both a struct and a class...\nstruct MyStruct\n{\n  EIGEN_MAKE_ALIGNED_OPERATOR_NEW\n  char dummychar;\n  Vector4f avec;\n};\n\nclass MyClassA\n{\n  public:\n    EIGEN_MAKE_ALIGNED_OPERATOR_NEW\n    char dummychar;\n    Vector4f avec;\n};\n\ntemplate<typename T> void check_dynaligned()\n{\n  T* obj = new T;\n  VERIFY(std::size_t(obj)%ALIGNMENT==0);\n  delete obj;\n}\n\nvoid test_eigen2_dynalloc()\n{\n  // low level dynamic memory allocation\n  CALL_SUBTEST(check_handmade_aligned_malloc());\n  CALL_SUBTEST(check_aligned_malloc());\n  CALL_SUBTEST(check_aligned_new());\n  CALL_SUBTEST(check_aligned_stack_alloc());\n\n  for (int i=0; i<g_repeat*100; ++i)\n  {\n    CALL_SUBTEST( check_dynaligned<Vector4f>() );\n    CALL_SUBTEST( check_dynaligned<Vector2d>() );\n    CALL_SUBTEST( check_dynaligned<Matrix4f>() );\n    CALL_SUBTEST( check_dynaligned<Vector4d>() );\n    CALL_SUBTEST( check_dynaligned<Vector4i>() );\n  }\n  \n  // check static allocation, who knows ?\n  {\n    MyStruct foo0;  VERIFY(std::size_t(foo0.avec.data())%ALIGNMENT==0);\n    MyClassA fooA;  VERIFY(std::size_t(fooA.avec.data())%ALIGNMENT==0);\n  }\n\n  // dynamic allocation, single object\n  for (int i=0; i<g_repeat*100; ++i)\n  {\n    MyStruct *foo0 = new MyStruct();  VERIFY(std::size_t(foo0->avec.data())%ALIGNMENT==0);\n    MyClassA *fooA = new MyClassA();  VERIFY(std::size_t(fooA->avec.data())%ALIGNMENT==0);\n    delete foo0;\n    delete fooA;\n  }\n\n  // dynamic allocation, array\n  const int N = 10;\n  for (int i=0; i<g_repeat*100; ++i)\n  {\n    MyStruct *foo0 = new MyStruct[N];  VERIFY(std::size_t(foo0->avec.data())%ALIGNMENT==0);\n    MyClassA *fooA = new MyClassA[N];  VERIFY(std::size_t(fooA->avec.data())%ALIGNMENT==0);\n    delete[] foo0;\n    delete[] fooA;\n  }\n  \n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_eigensolver.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <Eigen/QR>\n\n#ifdef HAS_GSL\n#include \"gsl_helper.h\"\n#endif\n\ntemplate<typename MatrixType> void selfadjointeigensolver(const MatrixType& m)\n{\n  /* this test covers the following files:\n     EigenSolver.h, SelfAdjointEigenSolver.h (and indirectly: Tridiagonalization.h)\n  */\n  int rows = m.rows();\n  int cols = m.cols();\n\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> VectorType;\n  typedef Matrix<RealScalar, MatrixType::RowsAtCompileTime, 1> RealVectorType;\n  typedef typename std::complex<typename NumTraits<typename MatrixType::Scalar>::Real> Complex;\n\n  RealScalar largerEps = 10*test_precision<RealScalar>();\n\n  MatrixType a = MatrixType::Random(rows,cols);\n  MatrixType a1 = MatrixType::Random(rows,cols);\n  MatrixType symmA =  a.adjoint() * a + a1.adjoint() * a1;\n\n  MatrixType b = MatrixType::Random(rows,cols);\n  MatrixType b1 = MatrixType::Random(rows,cols);\n  MatrixType symmB = b.adjoint() * b + b1.adjoint() * b1;\n\n  SelfAdjointEigenSolver<MatrixType> eiSymm(symmA);\n  // generalized eigen pb\n  SelfAdjointEigenSolver<MatrixType> eiSymmGen(symmA, symmB);\n\n  #ifdef HAS_GSL\n  if (ei_is_same_type<RealScalar,double>::ret)\n  {\n    typedef GslTraits<Scalar> Gsl;\n    typename Gsl::Matrix gEvec=0, gSymmA=0, gSymmB=0;\n    typename GslTraits<RealScalar>::Vector gEval=0;\n    RealVectorType _eval;\n    MatrixType _evec;\n    convert<MatrixType>(symmA, gSymmA);\n    convert<MatrixType>(symmB, gSymmB);\n    convert<MatrixType>(symmA, gEvec);\n    gEval = GslTraits<RealScalar>::createVector(rows);\n\n    Gsl::eigen_symm(gSymmA, gEval, gEvec);\n    convert(gEval, _eval);\n    convert(gEvec, _evec);\n\n    // test gsl itself !\n    VERIFY((symmA * _evec).isApprox(_evec * _eval.asDiagonal(), largerEps));\n\n    // compare with eigen\n    VERIFY_IS_APPROX(_eval, eiSymm.eigenvalues());\n    VERIFY_IS_APPROX(_evec.cwise().abs(), eiSymm.eigenvectors().cwise().abs());\n\n    // generalized pb\n    Gsl::eigen_symm_gen(gSymmA, gSymmB, gEval, gEvec);\n    convert(gEval, _eval);\n    convert(gEvec, _evec);\n    // test GSL itself:\n    VERIFY((symmA * _evec).isApprox(symmB * (_evec * _eval.asDiagonal()), largerEps));\n\n    // compare with eigen\n    MatrixType normalized_eivec = eiSymmGen.eigenvectors()*eiSymmGen.eigenvectors().colwise().norm().asDiagonal().inverse();\n    VERIFY_IS_APPROX(_eval, eiSymmGen.eigenvalues());\n    VERIFY_IS_APPROX(_evec.cwiseAbs(), normalized_eivec.cwiseAbs());\n\n    Gsl::free(gSymmA);\n    Gsl::free(gSymmB);\n    GslTraits<RealScalar>::free(gEval);\n    Gsl::free(gEvec);\n  }\n  #endif\n\n  VERIFY((symmA * eiSymm.eigenvectors()).isApprox(\n          eiSymm.eigenvectors() * eiSymm.eigenvalues().asDiagonal(), largerEps));\n\n  // generalized eigen problem Ax = lBx\n  VERIFY((symmA * eiSymmGen.eigenvectors()).isApprox(\n          symmB * (eiSymmGen.eigenvectors() * eiSymmGen.eigenvalues().asDiagonal()), largerEps));\n\n  MatrixType sqrtSymmA = eiSymm.operatorSqrt();\n  VERIFY_IS_APPROX(symmA, sqrtSymmA*sqrtSymmA);\n  VERIFY_IS_APPROX(sqrtSymmA, symmA*eiSymm.operatorInverseSqrt());\n}\n\ntemplate<typename MatrixType> void eigensolver(const MatrixType& m)\n{\n  /* this test covers the following files:\n     EigenSolver.h\n  */\n  int rows = m.rows();\n  int cols = m.cols();\n\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> VectorType;\n  typedef Matrix<RealScalar, MatrixType::RowsAtCompileTime, 1> RealVectorType;\n  typedef typename std::complex<typename NumTraits<typename MatrixType::Scalar>::Real> Complex;\n\n  // RealScalar largerEps = 10*test_precision<RealScalar>();\n\n  MatrixType a = MatrixType::Random(rows,cols);\n  MatrixType a1 = MatrixType::Random(rows,cols);\n  MatrixType symmA =  a.adjoint() * a + a1.adjoint() * a1;\n\n  EigenSolver<MatrixType> ei0(symmA);\n  VERIFY_IS_APPROX(symmA * ei0.pseudoEigenvectors(), ei0.pseudoEigenvectors() * ei0.pseudoEigenvalueMatrix());\n  VERIFY_IS_APPROX((symmA.template cast<Complex>()) * (ei0.pseudoEigenvectors().template cast<Complex>()),\n    (ei0.pseudoEigenvectors().template cast<Complex>()) * (ei0.eigenvalues().asDiagonal()));\n\n  EigenSolver<MatrixType> ei1(a);\n  VERIFY_IS_APPROX(a * ei1.pseudoEigenvectors(), ei1.pseudoEigenvectors() * ei1.pseudoEigenvalueMatrix());\n  VERIFY_IS_APPROX(a.template cast<Complex>() * ei1.eigenvectors(),\n                   ei1.eigenvectors() * ei1.eigenvalues().asDiagonal());\n\n}\n\nvoid test_eigen2_eigensolver()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    // very important to test a 3x3 matrix since we provide a special path for it\n    CALL_SUBTEST_1( selfadjointeigensolver(Matrix3f()) );\n    CALL_SUBTEST_2( selfadjointeigensolver(Matrix4d()) );\n    CALL_SUBTEST_3( selfadjointeigensolver(MatrixXf(7,7)) );\n    CALL_SUBTEST_4( selfadjointeigensolver(MatrixXcd(5,5)) );\n    CALL_SUBTEST_5( selfadjointeigensolver(MatrixXd(19,19)) );\n\n    CALL_SUBTEST_6( eigensolver(Matrix4f()) );\n    CALL_SUBTEST_5( eigensolver(MatrixXd(17,17)) );\n  }\n}\n\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_first_aligned.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\ntemplate<typename Scalar>\nvoid test_eigen2_first_aligned_helper(Scalar *array, int size)\n{\n  const int packet_size = sizeof(Scalar) * ei_packet_traits<Scalar>::size;\n  VERIFY(((std::size_t(array) + sizeof(Scalar) * ei_alignmentOffset(array, size)) % packet_size) == 0);\n}\n\ntemplate<typename Scalar>\nvoid test_eigen2_none_aligned_helper(Scalar *array, int size)\n{\n  VERIFY(ei_packet_traits<Scalar>::size == 1 || ei_alignmentOffset(array, size) == size);\n}\n\nstruct some_non_vectorizable_type { float x; };\n\nvoid test_eigen2_first_aligned()\n{\n  EIGEN_ALIGN_128 float array_float[100];\n  test_first_aligned_helper(array_float, 50);\n  test_first_aligned_helper(array_float+1, 50);\n  test_first_aligned_helper(array_float+2, 50);\n  test_first_aligned_helper(array_float+3, 50);\n  test_first_aligned_helper(array_float+4, 50);\n  test_first_aligned_helper(array_float+5, 50);\n  \n  EIGEN_ALIGN_128 double array_double[100];\n  test_first_aligned_helper(array_double, 50);\n  test_first_aligned_helper(array_double+1, 50);\n  test_first_aligned_helper(array_double+2, 50);\n  \n  double *array_double_plus_4_bytes = (double*)(std::size_t(array_double)+4);\n  test_none_aligned_helper(array_double_plus_4_bytes, 50);\n  test_none_aligned_helper(array_double_plus_4_bytes+1, 50);\n  \n  some_non_vectorizable_type array_nonvec[100];\n  test_first_aligned_helper(array_nonvec, 100);\n  test_none_aligned_helper(array_nonvec, 100);\n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_geometry.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <Eigen/Geometry>\n#include <Eigen/LU>\n#include <Eigen/SVD>\n\ntemplate<typename Scalar> void geometry(void)\n{\n  /* this test covers the following files:\n     Cross.h Quaternion.h, Transform.cpp\n  */\n\n  typedef Matrix<Scalar,2,2> Matrix2;\n  typedef Matrix<Scalar,3,3> Matrix3;\n  typedef Matrix<Scalar,4,4> Matrix4;\n  typedef Matrix<Scalar,2,1> Vector2;\n  typedef Matrix<Scalar,3,1> Vector3;\n  typedef Matrix<Scalar,4,1> Vector4;\n  typedef Quaternion<Scalar> Quaternionx;\n  typedef AngleAxis<Scalar> AngleAxisx;\n  typedef Transform<Scalar,2> Transform2;\n  typedef Transform<Scalar,3> Transform3;\n  typedef Scaling<Scalar,2> Scaling2;\n  typedef Scaling<Scalar,3> Scaling3;\n  typedef Translation<Scalar,2> Translation2;\n  typedef Translation<Scalar,3> Translation3;\n\n  Scalar largeEps = test_precision<Scalar>();\n  if (ei_is_same_type<Scalar,float>::ret)\n    largeEps = 1e-2f;\n\n  Vector3 v0 = Vector3::Random(),\n    v1 = Vector3::Random(),\n    v2 = Vector3::Random();\n  Vector2 u0 = Vector2::Random();\n  Matrix3 matrot1;\n\n  Scalar a = ei_random<Scalar>(-Scalar(M_PI), Scalar(M_PI));\n\n  // cross product\n  VERIFY_IS_MUCH_SMALLER_THAN(v1.cross(v2).eigen2_dot(v1), Scalar(1));\n  Matrix3 m;\n  m << v0.normalized(),\n      (v0.cross(v1)).normalized(),\n      (v0.cross(v1).cross(v0)).normalized();\n  VERIFY(m.isUnitary());\n\n  // Quaternion: Identity(), setIdentity();\n  Quaternionx q1, q2;\n  q2.setIdentity();\n  VERIFY_IS_APPROX(Quaternionx(Quaternionx::Identity()).coeffs(), q2.coeffs());\n  q1.coeffs().setRandom();\n  VERIFY_IS_APPROX(q1.coeffs(), (q1*q2).coeffs());\n\n  // unitOrthogonal\n  VERIFY_IS_MUCH_SMALLER_THAN(u0.unitOrthogonal().eigen2_dot(u0), Scalar(1));\n  VERIFY_IS_MUCH_SMALLER_THAN(v0.unitOrthogonal().eigen2_dot(v0), Scalar(1));\n  VERIFY_IS_APPROX(u0.unitOrthogonal().norm(), Scalar(1));\n  VERIFY_IS_APPROX(v0.unitOrthogonal().norm(), Scalar(1));\n\n\n  VERIFY_IS_APPROX(v0, AngleAxisx(a, v0.normalized()) * v0);\n  VERIFY_IS_APPROX(-v0, AngleAxisx(Scalar(M_PI), v0.unitOrthogonal()) * v0);\n  VERIFY_IS_APPROX(ei_cos(a)*v0.squaredNorm(), v0.eigen2_dot(AngleAxisx(a, v0.unitOrthogonal()) * v0));\n  m = AngleAxisx(a, v0.normalized()).toRotationMatrix().adjoint();\n  VERIFY_IS_APPROX(Matrix3::Identity(), m * AngleAxisx(a, v0.normalized()));\n  VERIFY_IS_APPROX(Matrix3::Identity(), AngleAxisx(a, v0.normalized()) * m);\n\n  q1 = AngleAxisx(a, v0.normalized());\n  q2 = AngleAxisx(a, v1.normalized());\n\n  // angular distance\n  Scalar refangle = ei_abs(AngleAxisx(q1.inverse()*q2).angle());\n  if (refangle>Scalar(M_PI))\n    refangle = Scalar(2)*Scalar(M_PI) - refangle;\n  \n  if((q1.coeffs()-q2.coeffs()).norm() > 10*largeEps)\n  {\n    VERIFY(ei_isApprox(q1.angularDistance(q2), refangle, largeEps));\n  }\n\n  // rotation matrix conversion\n  VERIFY_IS_APPROX(q1 * v2, q1.toRotationMatrix() * v2);\n  VERIFY_IS_APPROX(q1 * q2 * v2,\n    q1.toRotationMatrix() * q2.toRotationMatrix() * v2);\n\n  VERIFY( (q2*q1).isApprox(q1*q2, largeEps) || !(q2 * q1 * v2).isApprox(\n    q1.toRotationMatrix() * q2.toRotationMatrix() * v2));\n\n  q2 = q1.toRotationMatrix();\n  VERIFY_IS_APPROX(q1*v1,q2*v1);\n\n  matrot1 = AngleAxisx(Scalar(0.1), Vector3::UnitX())\n          * AngleAxisx(Scalar(0.2), Vector3::UnitY())\n          * AngleAxisx(Scalar(0.3), Vector3::UnitZ());\n  VERIFY_IS_APPROX(matrot1 * v1,\n       AngleAxisx(Scalar(0.1), Vector3(1,0,0)).toRotationMatrix()\n    * (AngleAxisx(Scalar(0.2), Vector3(0,1,0)).toRotationMatrix()\n    * (AngleAxisx(Scalar(0.3), Vector3(0,0,1)).toRotationMatrix() * v1)));\n\n  // angle-axis conversion\n  AngleAxisx aa = q1;\n  VERIFY_IS_APPROX(q1 * v1, Quaternionx(aa) * v1);\n  VERIFY_IS_NOT_APPROX(q1 * v1, Quaternionx(AngleAxisx(aa.angle()*2,aa.axis())) * v1);\n\n  // from two vector creation\n  VERIFY_IS_APPROX(v2.normalized(),(q2.setFromTwoVectors(v1,v2)*v1).normalized());\n  VERIFY_IS_APPROX(v2.normalized(),(q2.setFromTwoVectors(v1,v2)*v1).normalized());\n\n  // inverse and conjugate\n  VERIFY_IS_APPROX(q1 * (q1.inverse() * v1), v1);\n  VERIFY_IS_APPROX(q1 * (q1.conjugate() * v1), v1);\n\n  // AngleAxis\n  VERIFY_IS_APPROX(AngleAxisx(a,v1.normalized()).toRotationMatrix(),\n    Quaternionx(AngleAxisx(a,v1.normalized())).toRotationMatrix());\n\n  AngleAxisx aa1;\n  m = q1.toRotationMatrix();\n  aa1 = m;\n  VERIFY_IS_APPROX(AngleAxisx(m).toRotationMatrix(),\n    Quaternionx(m).toRotationMatrix());\n\n  // Transform\n  // TODO complete the tests !\n  a = 0;\n  while (ei_abs(a)<Scalar(0.1))\n    a = ei_random<Scalar>(-Scalar(0.4)*Scalar(M_PI), Scalar(0.4)*Scalar(M_PI));\n  q1 = AngleAxisx(a, v0.normalized());\n  Transform3 t0, t1, t2;\n  // first test setIdentity() and Identity()\n  t0.setIdentity();\n  VERIFY_IS_APPROX(t0.matrix(), Transform3::MatrixType::Identity());\n  t0.matrix().setZero();\n  t0 = Transform3::Identity();\n  VERIFY_IS_APPROX(t0.matrix(), Transform3::MatrixType::Identity());\n\n  t0.linear() = q1.toRotationMatrix();\n  t1.setIdentity();\n  t1.linear() = q1.toRotationMatrix();\n\n  v0 << 50, 2, 1;//= ei_random_matrix<Vector3>().cwiseProduct(Vector3(10,2,0.5));\n  t0.scale(v0);\n  t1.prescale(v0);\n\n  VERIFY_IS_APPROX( (t0 * Vector3(1,0,0)).norm(), v0.x());\n  //VERIFY(!ei_isApprox((t1 * Vector3(1,0,0)).norm(), v0.x()));\n\n  t0.setIdentity();\n  t1.setIdentity();\n  v1 << 1, 2, 3;\n  t0.linear() = q1.toRotationMatrix();\n  t0.pretranslate(v0);\n  t0.scale(v1);\n  t1.linear() = q1.conjugate().toRotationMatrix();\n  t1.prescale(v1.cwise().inverse());\n  t1.translate(-v0);\n\n  VERIFY((t0.matrix() * t1.matrix()).isIdentity(test_precision<Scalar>()));\n\n  t1.fromPositionOrientationScale(v0, q1, v1);\n  VERIFY_IS_APPROX(t1.matrix(), t0.matrix());\n  VERIFY_IS_APPROX(t1*v1, t0*v1);\n\n  t0.setIdentity(); t0.scale(v0).rotate(q1.toRotationMatrix());\n  t1.setIdentity(); t1.scale(v0).rotate(q1);\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n\n  t0.setIdentity(); t0.scale(v0).rotate(AngleAxisx(q1));\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n\n  VERIFY_IS_APPROX(t0.scale(a).matrix(), t1.scale(Vector3::Constant(a)).matrix());\n  VERIFY_IS_APPROX(t0.prescale(a).matrix(), t1.prescale(Vector3::Constant(a)).matrix());\n\n  // More transform constructors, operator=, operator*=\n\n  Matrix3 mat3 = Matrix3::Random();\n  Matrix4 mat4;\n  mat4 << mat3 , Vector3::Zero() , Vector4::Zero().transpose();\n  Transform3 tmat3(mat3), tmat4(mat4);\n  tmat4.matrix()(3,3) = Scalar(1);\n  VERIFY_IS_APPROX(tmat3.matrix(), tmat4.matrix());\n\n  Scalar a3 = ei_random<Scalar>(-Scalar(M_PI), Scalar(M_PI));\n  Vector3 v3 = Vector3::Random().normalized();\n  AngleAxisx aa3(a3, v3);\n  Transform3 t3(aa3);\n  Transform3 t4;\n  t4 = aa3;\n  VERIFY_IS_APPROX(t3.matrix(), t4.matrix());\n  t4.rotate(AngleAxisx(-a3,v3));\n  VERIFY_IS_APPROX(t4.matrix(), Matrix4::Identity());\n  t4 *= aa3;\n  VERIFY_IS_APPROX(t3.matrix(), t4.matrix());\n\n  v3 = Vector3::Random();\n  Translation3 tv3(v3);\n  Transform3 t5(tv3);\n  t4 = tv3;\n  VERIFY_IS_APPROX(t5.matrix(), t4.matrix());\n  t4.translate(-v3);\n  VERIFY_IS_APPROX(t4.matrix(), Matrix4::Identity());\n  t4 *= tv3;\n  VERIFY_IS_APPROX(t5.matrix(), t4.matrix());\n\n  Scaling3 sv3(v3);\n  Transform3 t6(sv3);\n  t4 = sv3;\n  VERIFY_IS_APPROX(t6.matrix(), t4.matrix());\n  t4.scale(v3.cwise().inverse());\n  VERIFY_IS_APPROX(t4.matrix(), Matrix4::Identity());\n  t4 *= sv3;\n  VERIFY_IS_APPROX(t6.matrix(), t4.matrix());\n\n  // matrix * transform\n  VERIFY_IS_APPROX(Transform3(t3.matrix()*t4).matrix(), Transform3(t3*t4).matrix());\n\n  // chained Transform product\n  VERIFY_IS_APPROX(((t3*t4)*t5).matrix(), (t3*(t4*t5)).matrix());\n\n  // check that Transform product doesn't have aliasing problems\n  t5 = t4;\n  t5 = t5*t5;\n  VERIFY_IS_APPROX(t5, t4*t4);\n\n  // 2D transformation\n  Transform2 t20, t21;\n  Vector2 v20 = Vector2::Random();\n  Vector2 v21 = Vector2::Random();\n  for (int k=0; k<2; ++k)\n    if (ei_abs(v21[k])<Scalar(1e-3)) v21[k] = Scalar(1e-3);\n  t21.setIdentity();\n  t21.linear() = Rotation2D<Scalar>(a).toRotationMatrix();\n  VERIFY_IS_APPROX(t20.fromPositionOrientationScale(v20,a,v21).matrix(),\n    t21.pretranslate(v20).scale(v21).matrix());\n\n  t21.setIdentity();\n  t21.linear() = Rotation2D<Scalar>(-a).toRotationMatrix();\n  VERIFY( (t20.fromPositionOrientationScale(v20,a,v21)\n        * (t21.prescale(v21.cwise().inverse()).translate(-v20))).matrix().isIdentity(test_precision<Scalar>()) );\n\n  // Transform - new API\n  // 3D\n  t0.setIdentity();\n  t0.rotate(q1).scale(v0).translate(v0);\n  // mat * scaling and mat * translation\n  t1 = (Matrix3(q1) * Scaling3(v0)) * Translation3(v0);\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n  // mat * transformation and scaling * translation\n  t1 = Matrix3(q1) * (Scaling3(v0) * Translation3(v0));\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n\n  t0.setIdentity();\n  t0.prerotate(q1).prescale(v0).pretranslate(v0);\n  // translation * scaling and transformation * mat\n  t1 = (Translation3(v0) * Scaling3(v0)) * Matrix3(q1);\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n  // scaling * mat and translation * mat\n  t1 = Translation3(v0) * (Scaling3(v0) * Matrix3(q1));\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n\n  t0.setIdentity();\n  t0.scale(v0).translate(v0).rotate(q1);\n  // translation * mat and scaling * transformation\n  t1 = Scaling3(v0) * (Translation3(v0) * Matrix3(q1));\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n  // transformation * scaling\n  t0.scale(v0);\n  t1 = t1 * Scaling3(v0);\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n  // transformation * translation\n  t0.translate(v0);\n  t1 = t1 * Translation3(v0);\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n  // translation * transformation\n  t0.pretranslate(v0);\n  t1 = Translation3(v0) * t1;\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n\n  // transform * quaternion\n  t0.rotate(q1);\n  t1 = t1 * q1;\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n\n  // translation * quaternion\n  t0.translate(v1).rotate(q1);\n  t1 = t1 * (Translation3(v1) * q1);\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n\n  // scaling * quaternion\n  t0.scale(v1).rotate(q1);\n  t1 = t1 * (Scaling3(v1) * q1);\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n\n  // quaternion * transform\n  t0.prerotate(q1);\n  t1 = q1 * t1;\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n\n  // quaternion * translation\n  t0.rotate(q1).translate(v1);\n  t1 = t1 * (q1 * Translation3(v1));\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n\n  // quaternion * scaling\n  t0.rotate(q1).scale(v1);\n  t1 = t1 * (q1 * Scaling3(v1));\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n\n  // translation * vector\n  t0.setIdentity();\n  t0.translate(v0);\n  VERIFY_IS_APPROX(t0 * v1, Translation3(v0) * v1);\n\n  // scaling * vector\n  t0.setIdentity();\n  t0.scale(v0);\n  VERIFY_IS_APPROX(t0 * v1, Scaling3(v0) * v1);\n\n  // test transform inversion\n  t0.setIdentity();\n  t0.translate(v0);\n  t0.linear().setRandom();\n  VERIFY_IS_APPROX(t0.inverse(Affine), t0.matrix().inverse());\n  t0.setIdentity();\n  t0.translate(v0).rotate(q1);\n  VERIFY_IS_APPROX(t0.inverse(Isometry), t0.matrix().inverse());\n\n  // test extract rotation and scaling\n  t0.setIdentity();\n  t0.translate(v0).rotate(q1).scale(v1);\n  VERIFY_IS_APPROX(t0.rotation() * v1, Matrix3(q1) * v1);\n\n  Matrix3 mat_rotation, mat_scaling;\n  t0.setIdentity();\n  t0.translate(v0).rotate(q1).scale(v1);\n  t0.computeRotationScaling(&mat_rotation, &mat_scaling);\n  VERIFY_IS_APPROX(t0.linear(), mat_rotation * mat_scaling);\n  VERIFY_IS_APPROX(mat_rotation*mat_rotation.adjoint(), Matrix3::Identity());\n  VERIFY_IS_APPROX(mat_rotation.determinant(), Scalar(1));\n  t0.computeScalingRotation(&mat_scaling, &mat_rotation);\n  VERIFY_IS_APPROX(t0.linear(), mat_scaling * mat_rotation);\n  VERIFY_IS_APPROX(mat_rotation*mat_rotation.adjoint(), Matrix3::Identity());\n  VERIFY_IS_APPROX(mat_rotation.determinant(), Scalar(1));\n\n  // test casting\n  Transform<float,3> t1f = t1.template cast<float>();\n  VERIFY_IS_APPROX(t1f.template cast<Scalar>(),t1);\n  Transform<double,3> t1d = t1.template cast<double>();\n  VERIFY_IS_APPROX(t1d.template cast<Scalar>(),t1);\n\n  Translation3 tr1(v0);\n  Translation<float,3> tr1f = tr1.template cast<float>();\n  VERIFY_IS_APPROX(tr1f.template cast<Scalar>(),tr1);\n  Translation<double,3> tr1d = tr1.template cast<double>();\n  VERIFY_IS_APPROX(tr1d.template cast<Scalar>(),tr1);\n\n  Scaling3 sc1(v0);\n  Scaling<float,3> sc1f = sc1.template cast<float>();\n  VERIFY_IS_APPROX(sc1f.template cast<Scalar>(),sc1);\n  Scaling<double,3> sc1d = sc1.template cast<double>();\n  VERIFY_IS_APPROX(sc1d.template cast<Scalar>(),sc1);\n\n  Quaternion<float> q1f = q1.template cast<float>();\n  VERIFY_IS_APPROX(q1f.template cast<Scalar>(),q1);\n  Quaternion<double> q1d = q1.template cast<double>();\n  VERIFY_IS_APPROX(q1d.template cast<Scalar>(),q1);\n\n  AngleAxis<float> aa1f = aa1.template cast<float>();\n  VERIFY_IS_APPROX(aa1f.template cast<Scalar>(),aa1);\n  AngleAxis<double> aa1d = aa1.template cast<double>();\n  VERIFY_IS_APPROX(aa1d.template cast<Scalar>(),aa1);\n\n  Rotation2D<Scalar> r2d1(ei_random<Scalar>());\n  Rotation2D<float> r2d1f = r2d1.template cast<float>();\n  VERIFY_IS_APPROX(r2d1f.template cast<Scalar>(),r2d1);\n  Rotation2D<double> r2d1d = r2d1.template cast<double>();\n  VERIFY_IS_APPROX(r2d1d.template cast<Scalar>(),r2d1);\n\n  m = q1;\n//   m.col(1) = Vector3(0,ei_random<Scalar>(),ei_random<Scalar>()).normalized();\n//   m.col(0) = Vector3(-1,0,0).normalized();\n//   m.col(2) = m.col(0).cross(m.col(1));\n  #define VERIFY_EULER(I,J,K, X,Y,Z) { \\\n    Vector3 ea = m.eulerAngles(I,J,K); \\\n    Matrix3 m1 = Matrix3(AngleAxisx(ea[0], Vector3::Unit##X()) * AngleAxisx(ea[1], Vector3::Unit##Y()) * AngleAxisx(ea[2], Vector3::Unit##Z())); \\\n    VERIFY_IS_APPROX(m, m1); \\\n    VERIFY_IS_APPROX(m,  Matrix3(AngleAxisx(ea[0], Vector3::Unit##X()) * AngleAxisx(ea[1], Vector3::Unit##Y()) * AngleAxisx(ea[2], Vector3::Unit##Z()))); \\\n  }\n  VERIFY_EULER(0,1,2, X,Y,Z);\n  VERIFY_EULER(0,1,0, X,Y,X);\n  VERIFY_EULER(0,2,1, X,Z,Y);\n  VERIFY_EULER(0,2,0, X,Z,X);\n\n  VERIFY_EULER(1,2,0, Y,Z,X);\n  VERIFY_EULER(1,2,1, Y,Z,Y);\n  VERIFY_EULER(1,0,2, Y,X,Z);\n  VERIFY_EULER(1,0,1, Y,X,Y);\n\n  VERIFY_EULER(2,0,1, Z,X,Y);\n  VERIFY_EULER(2,0,2, Z,X,Z);\n  VERIFY_EULER(2,1,0, Z,Y,X);\n  VERIFY_EULER(2,1,2, Z,Y,Z);\n\n  // colwise/rowwise cross product\n  mat3.setRandom();\n  Vector3 vec3 = Vector3::Random();\n  Matrix3 mcross;\n  int i = ei_random<int>(0,2);\n  mcross = mat3.colwise().cross(vec3);\n  VERIFY_IS_APPROX(mcross.col(i), mat3.col(i).cross(vec3));\n  mcross = mat3.rowwise().cross(vec3);\n  VERIFY_IS_APPROX(mcross.row(i), mat3.row(i).cross(vec3));\n\n\n}\n\nvoid test_eigen2_geometry()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( geometry<float>() );\n    CALL_SUBTEST_2( geometry<double>() );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_geometry_with_eigen2_prefix.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#define EIGEN2_SUPPORT_STAGE15_RESOLVE_API_CONFLICTS_WARN\n\n#include \"main.h\"\n#include <Eigen/Geometry>\n#include <Eigen/LU>\n#include <Eigen/SVD>\n\ntemplate<typename Scalar> void geometry(void)\n{\n  /* this test covers the following files:\n     Cross.h Quaternion.h, Transform.cpp\n  */\n\n  typedef Matrix<Scalar,2,2> Matrix2;\n  typedef Matrix<Scalar,3,3> Matrix3;\n  typedef Matrix<Scalar,4,4> Matrix4;\n  typedef Matrix<Scalar,2,1> Vector2;\n  typedef Matrix<Scalar,3,1> Vector3;\n  typedef Matrix<Scalar,4,1> Vector4;\n  typedef eigen2_Quaternion<Scalar> Quaternionx;\n  typedef eigen2_AngleAxis<Scalar> AngleAxisx;\n  typedef eigen2_Transform<Scalar,2> Transform2;\n  typedef eigen2_Transform<Scalar,3> Transform3;\n  typedef eigen2_Scaling<Scalar,2> Scaling2;\n  typedef eigen2_Scaling<Scalar,3> Scaling3;\n  typedef eigen2_Translation<Scalar,2> Translation2;\n  typedef eigen2_Translation<Scalar,3> Translation3;\n\n  Scalar largeEps = test_precision<Scalar>();\n  if (ei_is_same_type<Scalar,float>::ret)\n    largeEps = 1e-2f;\n\n  Vector3 v0 = Vector3::Random(),\n    v1 = Vector3::Random(),\n    v2 = Vector3::Random();\n  Vector2 u0 = Vector2::Random();\n  Matrix3 matrot1;\n\n  Scalar a = ei_random<Scalar>(-Scalar(M_PI), Scalar(M_PI));\n\n  // cross product\n  VERIFY_IS_MUCH_SMALLER_THAN(v1.cross(v2).eigen2_dot(v1), Scalar(1));\n  Matrix3 m;\n  m << v0.normalized(),\n      (v0.cross(v1)).normalized(),\n      (v0.cross(v1).cross(v0)).normalized();\n  VERIFY(m.isUnitary());\n\n  // Quaternion: Identity(), setIdentity();\n  Quaternionx q1, q2;\n  q2.setIdentity();\n  VERIFY_IS_APPROX(Quaternionx(Quaternionx::Identity()).coeffs(), q2.coeffs());\n  q1.coeffs().setRandom();\n  VERIFY_IS_APPROX(q1.coeffs(), (q1*q2).coeffs());\n\n  // unitOrthogonal\n  VERIFY_IS_MUCH_SMALLER_THAN(u0.unitOrthogonal().eigen2_dot(u0), Scalar(1));\n  VERIFY_IS_MUCH_SMALLER_THAN(v0.unitOrthogonal().eigen2_dot(v0), Scalar(1));\n  VERIFY_IS_APPROX(u0.unitOrthogonal().norm(), Scalar(1));\n  VERIFY_IS_APPROX(v0.unitOrthogonal().norm(), Scalar(1));\n\n\n  VERIFY_IS_APPROX(v0, AngleAxisx(a, v0.normalized()) * v0);\n  VERIFY_IS_APPROX(-v0, AngleAxisx(Scalar(M_PI), v0.unitOrthogonal()) * v0);\n  VERIFY_IS_APPROX(ei_cos(a)*v0.squaredNorm(), v0.eigen2_dot(AngleAxisx(a, v0.unitOrthogonal()) * v0));\n  m = AngleAxisx(a, v0.normalized()).toRotationMatrix().adjoint();\n  VERIFY_IS_APPROX(Matrix3::Identity(), m * AngleAxisx(a, v0.normalized()));\n  VERIFY_IS_APPROX(Matrix3::Identity(), AngleAxisx(a, v0.normalized()) * m);\n\n  q1 = AngleAxisx(a, v0.normalized());\n  q2 = AngleAxisx(a, v1.normalized());\n\n  // angular distance\n  Scalar refangle = ei_abs(AngleAxisx(q1.inverse()*q2).angle());\n  if (refangle>Scalar(M_PI))\n    refangle = Scalar(2)*Scalar(M_PI) - refangle;\n  \n  if((q1.coeffs()-q2.coeffs()).norm() > 10*largeEps)\n  {\n    VERIFY(ei_isApprox(q1.angularDistance(q2), refangle, largeEps));\n  }\n\n  // rotation matrix conversion\n  VERIFY_IS_APPROX(q1 * v2, q1.toRotationMatrix() * v2);\n  VERIFY_IS_APPROX(q1 * q2 * v2,\n    q1.toRotationMatrix() * q2.toRotationMatrix() * v2);\n\n  VERIFY( (q2*q1).isApprox(q1*q2, largeEps) || !(q2 * q1 * v2).isApprox(\n    q1.toRotationMatrix() * q2.toRotationMatrix() * v2));\n\n  q2 = q1.toRotationMatrix();\n  VERIFY_IS_APPROX(q1*v1,q2*v1);\n\n  matrot1 = AngleAxisx(Scalar(0.1), Vector3::UnitX())\n          * AngleAxisx(Scalar(0.2), Vector3::UnitY())\n          * AngleAxisx(Scalar(0.3), Vector3::UnitZ());\n  VERIFY_IS_APPROX(matrot1 * v1,\n       AngleAxisx(Scalar(0.1), Vector3(1,0,0)).toRotationMatrix()\n    * (AngleAxisx(Scalar(0.2), Vector3(0,1,0)).toRotationMatrix()\n    * (AngleAxisx(Scalar(0.3), Vector3(0,0,1)).toRotationMatrix() * v1)));\n\n  // angle-axis conversion\n  AngleAxisx aa = q1;\n  VERIFY_IS_APPROX(q1 * v1, Quaternionx(aa) * v1);\n  VERIFY_IS_NOT_APPROX(q1 * v1, Quaternionx(AngleAxisx(aa.angle()*2,aa.axis())) * v1);\n\n  // from two vector creation\n  VERIFY_IS_APPROX(v2.normalized(),(q2.setFromTwoVectors(v1,v2)*v1).normalized());\n  VERIFY_IS_APPROX(v2.normalized(),(q2.setFromTwoVectors(v1,v2)*v1).normalized());\n\n  // inverse and conjugate\n  VERIFY_IS_APPROX(q1 * (q1.inverse() * v1), v1);\n  VERIFY_IS_APPROX(q1 * (q1.conjugate() * v1), v1);\n\n  // AngleAxis\n  VERIFY_IS_APPROX(AngleAxisx(a,v1.normalized()).toRotationMatrix(),\n    Quaternionx(AngleAxisx(a,v1.normalized())).toRotationMatrix());\n\n  AngleAxisx aa1;\n  m = q1.toRotationMatrix();\n  aa1 = m;\n  VERIFY_IS_APPROX(AngleAxisx(m).toRotationMatrix(),\n    Quaternionx(m).toRotationMatrix());\n\n  // Transform\n  // TODO complete the tests !\n  a = 0;\n  while (ei_abs(a)<Scalar(0.1))\n    a = ei_random<Scalar>(-Scalar(0.4)*Scalar(M_PI), Scalar(0.4)*Scalar(M_PI));\n  q1 = AngleAxisx(a, v0.normalized());\n  Transform3 t0, t1, t2;\n  // first test setIdentity() and Identity()\n  t0.setIdentity();\n  VERIFY_IS_APPROX(t0.matrix(), Transform3::MatrixType::Identity());\n  t0.matrix().setZero();\n  t0 = Transform3::Identity();\n  VERIFY_IS_APPROX(t0.matrix(), Transform3::MatrixType::Identity());\n\n  t0.linear() = q1.toRotationMatrix();\n  t1.setIdentity();\n  t1.linear() = q1.toRotationMatrix();\n\n  v0 << 50, 2, 1;//= ei_random_matrix<Vector3>().cwiseProduct(Vector3(10,2,0.5));\n  t0.scale(v0);\n  t1.prescale(v0);\n\n  VERIFY_IS_APPROX( (t0 * Vector3(1,0,0)).norm(), v0.x());\n  //VERIFY(!ei_isApprox((t1 * Vector3(1,0,0)).norm(), v0.x()));\n\n  t0.setIdentity();\n  t1.setIdentity();\n  v1 << 1, 2, 3;\n  t0.linear() = q1.toRotationMatrix();\n  t0.pretranslate(v0);\n  t0.scale(v1);\n  t1.linear() = q1.conjugate().toRotationMatrix();\n  t1.prescale(v1.cwise().inverse());\n  t1.translate(-v0);\n\n  VERIFY((t0.matrix() * t1.matrix()).isIdentity(test_precision<Scalar>()));\n\n  t1.fromPositionOrientationScale(v0, q1, v1);\n  VERIFY_IS_APPROX(t1.matrix(), t0.matrix());\n  VERIFY_IS_APPROX(t1*v1, t0*v1);\n\n  t0.setIdentity(); t0.scale(v0).rotate(q1.toRotationMatrix());\n  t1.setIdentity(); t1.scale(v0).rotate(q1);\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n\n  t0.setIdentity(); t0.scale(v0).rotate(AngleAxisx(q1));\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n\n  VERIFY_IS_APPROX(t0.scale(a).matrix(), t1.scale(Vector3::Constant(a)).matrix());\n  VERIFY_IS_APPROX(t0.prescale(a).matrix(), t1.prescale(Vector3::Constant(a)).matrix());\n\n  // More transform constructors, operator=, operator*=\n\n  Matrix3 mat3 = Matrix3::Random();\n  Matrix4 mat4;\n  mat4 << mat3 , Vector3::Zero() , Vector4::Zero().transpose();\n  Transform3 tmat3(mat3), tmat4(mat4);\n  tmat4.matrix()(3,3) = Scalar(1);\n  VERIFY_IS_APPROX(tmat3.matrix(), tmat4.matrix());\n\n  Scalar a3 = ei_random<Scalar>(-Scalar(M_PI), Scalar(M_PI));\n  Vector3 v3 = Vector3::Random().normalized();\n  AngleAxisx aa3(a3, v3);\n  Transform3 t3(aa3);\n  Transform3 t4;\n  t4 = aa3;\n  VERIFY_IS_APPROX(t3.matrix(), t4.matrix());\n  t4.rotate(AngleAxisx(-a3,v3));\n  VERIFY_IS_APPROX(t4.matrix(), Matrix4::Identity());\n  t4 *= aa3;\n  VERIFY_IS_APPROX(t3.matrix(), t4.matrix());\n\n  v3 = Vector3::Random();\n  Translation3 tv3(v3);\n  Transform3 t5(tv3);\n  t4 = tv3;\n  VERIFY_IS_APPROX(t5.matrix(), t4.matrix());\n  t4.translate(-v3);\n  VERIFY_IS_APPROX(t4.matrix(), Matrix4::Identity());\n  t4 *= tv3;\n  VERIFY_IS_APPROX(t5.matrix(), t4.matrix());\n\n  Scaling3 sv3(v3);\n  Transform3 t6(sv3);\n  t4 = sv3;\n  VERIFY_IS_APPROX(t6.matrix(), t4.matrix());\n  t4.scale(v3.cwise().inverse());\n  VERIFY_IS_APPROX(t4.matrix(), Matrix4::Identity());\n  t4 *= sv3;\n  VERIFY_IS_APPROX(t6.matrix(), t4.matrix());\n\n  // matrix * transform\n  VERIFY_IS_APPROX(Transform3(t3.matrix()*t4).matrix(), Transform3(t3*t4).matrix());\n\n  // chained Transform product\n  VERIFY_IS_APPROX(((t3*t4)*t5).matrix(), (t3*(t4*t5)).matrix());\n\n  // check that Transform product doesn't have aliasing problems\n  t5 = t4;\n  t5 = t5*t5;\n  VERIFY_IS_APPROX(t5, t4*t4);\n\n  // 2D transformation\n  Transform2 t20, t21;\n  Vector2 v20 = Vector2::Random();\n  Vector2 v21 = Vector2::Random();\n  for (int k=0; k<2; ++k)\n    if (ei_abs(v21[k])<Scalar(1e-3)) v21[k] = Scalar(1e-3);\n  t21.setIdentity();\n  t21.linear() = Rotation2D<Scalar>(a).toRotationMatrix();\n  VERIFY_IS_APPROX(t20.fromPositionOrientationScale(v20,a,v21).matrix(),\n    t21.pretranslate(v20).scale(v21).matrix());\n\n  t21.setIdentity();\n  t21.linear() = Rotation2D<Scalar>(-a).toRotationMatrix();\n  VERIFY( (t20.fromPositionOrientationScale(v20,a,v21)\n        * (t21.prescale(v21.cwise().inverse()).translate(-v20))).matrix().isIdentity(test_precision<Scalar>()) );\n\n  // Transform - new API\n  // 3D\n  t0.setIdentity();\n  t0.rotate(q1).scale(v0).translate(v0);\n  // mat * scaling and mat * translation\n  t1 = (Matrix3(q1) * Scaling3(v0)) * Translation3(v0);\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n  // mat * transformation and scaling * translation\n  t1 = Matrix3(q1) * (Scaling3(v0) * Translation3(v0));\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n\n  t0.setIdentity();\n  t0.prerotate(q1).prescale(v0).pretranslate(v0);\n  // translation * scaling and transformation * mat\n  t1 = (Translation3(v0) * Scaling3(v0)) * Matrix3(q1);\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n  // scaling * mat and translation * mat\n  t1 = Translation3(v0) * (Scaling3(v0) * Matrix3(q1));\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n\n  t0.setIdentity();\n  t0.scale(v0).translate(v0).rotate(q1);\n  // translation * mat and scaling * transformation\n  t1 = Scaling3(v0) * (Translation3(v0) * Matrix3(q1));\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n  // transformation * scaling\n  t0.scale(v0);\n  t1 = t1 * Scaling3(v0);\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n  // transformation * translation\n  t0.translate(v0);\n  t1 = t1 * Translation3(v0);\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n  // translation * transformation\n  t0.pretranslate(v0);\n  t1 = Translation3(v0) * t1;\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n\n  // transform * quaternion\n  t0.rotate(q1);\n  t1 = t1 * q1;\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n\n  // translation * quaternion\n  t0.translate(v1).rotate(q1);\n  t1 = t1 * (Translation3(v1) * q1);\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n\n  // scaling * quaternion\n  t0.scale(v1).rotate(q1);\n  t1 = t1 * (Scaling3(v1) * q1);\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n\n  // quaternion * transform\n  t0.prerotate(q1);\n  t1 = q1 * t1;\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n\n  // quaternion * translation\n  t0.rotate(q1).translate(v1);\n  t1 = t1 * (q1 * Translation3(v1));\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n\n  // quaternion * scaling\n  t0.rotate(q1).scale(v1);\n  t1 = t1 * (q1 * Scaling3(v1));\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n\n  // translation * vector\n  t0.setIdentity();\n  t0.translate(v0);\n  VERIFY_IS_APPROX(t0 * v1, Translation3(v0) * v1);\n\n  // scaling * vector\n  t0.setIdentity();\n  t0.scale(v0);\n  VERIFY_IS_APPROX(t0 * v1, Scaling3(v0) * v1);\n\n  // test transform inversion\n  t0.setIdentity();\n  t0.translate(v0);\n  t0.linear().setRandom();\n  VERIFY_IS_APPROX(t0.inverse(Affine), t0.matrix().inverse());\n  t0.setIdentity();\n  t0.translate(v0).rotate(q1);\n  VERIFY_IS_APPROX(t0.inverse(Isometry), t0.matrix().inverse());\n\n  // test extract rotation and scaling\n  t0.setIdentity();\n  t0.translate(v0).rotate(q1).scale(v1);\n  VERIFY_IS_APPROX(t0.rotation() * v1, Matrix3(q1) * v1);\n\n  Matrix3 mat_rotation, mat_scaling;\n  t0.setIdentity();\n  t0.translate(v0).rotate(q1).scale(v1);\n  t0.computeRotationScaling(&mat_rotation, &mat_scaling);\n  VERIFY_IS_APPROX(t0.linear(), mat_rotation * mat_scaling);\n  VERIFY_IS_APPROX(mat_rotation*mat_rotation.adjoint(), Matrix3::Identity());\n  VERIFY_IS_APPROX(mat_rotation.determinant(), Scalar(1));\n  t0.computeScalingRotation(&mat_scaling, &mat_rotation);\n  VERIFY_IS_APPROX(t0.linear(), mat_scaling * mat_rotation);\n  VERIFY_IS_APPROX(mat_rotation*mat_rotation.adjoint(), Matrix3::Identity());\n  VERIFY_IS_APPROX(mat_rotation.determinant(), Scalar(1));\n\n  // test casting\n  eigen2_Transform<float,3> t1f = t1.template cast<float>();\n  VERIFY_IS_APPROX(t1f.template cast<Scalar>(),t1);\n  eigen2_Transform<double,3> t1d = t1.template cast<double>();\n  VERIFY_IS_APPROX(t1d.template cast<Scalar>(),t1);\n\n  Translation3 tr1(v0);\n  eigen2_Translation<float,3> tr1f = tr1.template cast<float>();\n  VERIFY_IS_APPROX(tr1f.template cast<Scalar>(),tr1);\n  eigen2_Translation<double,3> tr1d = tr1.template cast<double>();\n  VERIFY_IS_APPROX(tr1d.template cast<Scalar>(),tr1);\n\n  Scaling3 sc1(v0);\n  eigen2_Scaling<float,3> sc1f = sc1.template cast<float>();\n  VERIFY_IS_APPROX(sc1f.template cast<Scalar>(),sc1);\n  eigen2_Scaling<double,3> sc1d = sc1.template cast<double>();\n  VERIFY_IS_APPROX(sc1d.template cast<Scalar>(),sc1);\n\n  eigen2_Quaternion<float> q1f = q1.template cast<float>();\n  VERIFY_IS_APPROX(q1f.template cast<Scalar>(),q1);\n  eigen2_Quaternion<double> q1d = q1.template cast<double>();\n  VERIFY_IS_APPROX(q1d.template cast<Scalar>(),q1);\n\n  eigen2_AngleAxis<float> aa1f = aa1.template cast<float>();\n  VERIFY_IS_APPROX(aa1f.template cast<Scalar>(),aa1);\n  eigen2_AngleAxis<double> aa1d = aa1.template cast<double>();\n  VERIFY_IS_APPROX(aa1d.template cast<Scalar>(),aa1);\n\n  eigen2_Rotation2D<Scalar> r2d1(ei_random<Scalar>());\n  eigen2_Rotation2D<float> r2d1f = r2d1.template cast<float>();\n  VERIFY_IS_APPROX(r2d1f.template cast<Scalar>(),r2d1);\n  eigen2_Rotation2D<double> r2d1d = r2d1.template cast<double>();\n  VERIFY_IS_APPROX(r2d1d.template cast<Scalar>(),r2d1);\n\n  m = q1;\n//   m.col(1) = Vector3(0,ei_random<Scalar>(),ei_random<Scalar>()).normalized();\n//   m.col(0) = Vector3(-1,0,0).normalized();\n//   m.col(2) = m.col(0).cross(m.col(1));\n  #define VERIFY_EULER(I,J,K, X,Y,Z) { \\\n    Vector3 ea = m.eulerAngles(I,J,K); \\\n    Matrix3 m1 = Matrix3(AngleAxisx(ea[0], Vector3::Unit##X()) * AngleAxisx(ea[1], Vector3::Unit##Y()) * AngleAxisx(ea[2], Vector3::Unit##Z())); \\\n    VERIFY_IS_APPROX(m, m1); \\\n    VERIFY_IS_APPROX(m,  Matrix3(AngleAxisx(ea[0], Vector3::Unit##X()) * AngleAxisx(ea[1], Vector3::Unit##Y()) * AngleAxisx(ea[2], Vector3::Unit##Z()))); \\\n  }\n  VERIFY_EULER(0,1,2, X,Y,Z);\n  VERIFY_EULER(0,1,0, X,Y,X);\n  VERIFY_EULER(0,2,1, X,Z,Y);\n  VERIFY_EULER(0,2,0, X,Z,X);\n\n  VERIFY_EULER(1,2,0, Y,Z,X);\n  VERIFY_EULER(1,2,1, Y,Z,Y);\n  VERIFY_EULER(1,0,2, Y,X,Z);\n  VERIFY_EULER(1,0,1, Y,X,Y);\n\n  VERIFY_EULER(2,0,1, Z,X,Y);\n  VERIFY_EULER(2,0,2, Z,X,Z);\n  VERIFY_EULER(2,1,0, Z,Y,X);\n  VERIFY_EULER(2,1,2, Z,Y,Z);\n\n  // colwise/rowwise cross product\n  mat3.setRandom();\n  Vector3 vec3 = Vector3::Random();\n  Matrix3 mcross;\n  int i = ei_random<int>(0,2);\n  mcross = mat3.colwise().cross(vec3);\n  VERIFY_IS_APPROX(mcross.col(i), mat3.col(i).cross(vec3));\n  mcross = mat3.rowwise().cross(vec3);\n  VERIFY_IS_APPROX(mcross.row(i), mat3.row(i).cross(vec3));\n\n\n}\n\nvoid test_eigen2_geometry_with_eigen2_prefix()\n{\n  std::cout << \"eigen2 support: \" << EIGEN2_SUPPORT_STAGE << std::endl;\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( geometry<float>() );\n    CALL_SUBTEST_2( geometry<double>() );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_hyperplane.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>\n// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <Eigen/Geometry>\n#include <Eigen/LU>\n#include <Eigen/QR>\n\ntemplate<typename HyperplaneType> void hyperplane(const HyperplaneType& _plane)\n{\n  /* this test covers the following files:\n     Hyperplane.h\n  */\n\n  const int dim = _plane.dim();\n  typedef typename HyperplaneType::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  typedef Matrix<Scalar, HyperplaneType::AmbientDimAtCompileTime, 1> VectorType;\n  typedef Matrix<Scalar, HyperplaneType::AmbientDimAtCompileTime,\n                         HyperplaneType::AmbientDimAtCompileTime> MatrixType;\n\n  VectorType p0 = VectorType::Random(dim);\n  VectorType p1 = VectorType::Random(dim);\n\n  VectorType n0 = VectorType::Random(dim).normalized();\n  VectorType n1 = VectorType::Random(dim).normalized();\n\n  HyperplaneType pl0(n0, p0);\n  HyperplaneType pl1(n1, p1);\n  HyperplaneType pl2 = pl1;\n\n  Scalar s0 = ei_random<Scalar>();\n  Scalar s1 = ei_random<Scalar>();\n\n  VERIFY_IS_APPROX( n1.eigen2_dot(n1), Scalar(1) );\n\n  VERIFY_IS_MUCH_SMALLER_THAN( pl0.absDistance(p0), Scalar(1) );\n  VERIFY_IS_APPROX( pl1.signedDistance(p1 + n1 * s0), s0 );\n  VERIFY_IS_MUCH_SMALLER_THAN( pl1.signedDistance(pl1.projection(p0)), Scalar(1) );\n  VERIFY_IS_MUCH_SMALLER_THAN( pl1.absDistance(p1 +  pl1.normal().unitOrthogonal() * s1), Scalar(1) );\n\n  // transform\n  if (!NumTraits<Scalar>::IsComplex)\n  {\n    MatrixType rot = MatrixType::Random(dim,dim).qr().matrixQ();\n    Scaling<Scalar,HyperplaneType::AmbientDimAtCompileTime> scaling(VectorType::Random());\n    Translation<Scalar,HyperplaneType::AmbientDimAtCompileTime> translation(VectorType::Random());\n\n    pl2 = pl1;\n    VERIFY_IS_MUCH_SMALLER_THAN( pl2.transform(rot).absDistance(rot * p1), Scalar(1) );\n    pl2 = pl1;\n    VERIFY_IS_MUCH_SMALLER_THAN( pl2.transform(rot,Isometry).absDistance(rot * p1), Scalar(1) );\n    pl2 = pl1;\n    VERIFY_IS_MUCH_SMALLER_THAN( pl2.transform(rot*scaling).absDistance((rot*scaling) * p1), Scalar(1) );\n    pl2 = pl1;\n    VERIFY_IS_MUCH_SMALLER_THAN( pl2.transform(rot*scaling*translation)\n                                 .absDistance((rot*scaling*translation) * p1), Scalar(1) );\n    pl2 = pl1;\n    VERIFY_IS_MUCH_SMALLER_THAN( pl2.transform(rot*translation,Isometry)\n                                 .absDistance((rot*translation) * p1), Scalar(1) );\n  }\n\n  // casting\n  const int Dim = HyperplaneType::AmbientDimAtCompileTime;\n  typedef typename GetDifferentType<Scalar>::type OtherScalar;\n  Hyperplane<OtherScalar,Dim> hp1f = pl1.template cast<OtherScalar>();\n  VERIFY_IS_APPROX(hp1f.template cast<Scalar>(),pl1);\n  Hyperplane<Scalar,Dim> hp1d = pl1.template cast<Scalar>();\n  VERIFY_IS_APPROX(hp1d.template cast<Scalar>(),pl1);\n}\n\ntemplate<typename Scalar> void lines()\n{\n  typedef Hyperplane<Scalar, 2> HLine;\n  typedef ParametrizedLine<Scalar, 2> PLine;\n  typedef Matrix<Scalar,2,1> Vector;\n  typedef Matrix<Scalar,3,1> CoeffsType;\n\n  for(int i = 0; i < 10; i++)\n  {\n    Vector center = Vector::Random();\n    Vector u = Vector::Random();\n    Vector v = Vector::Random();\n    Scalar a = ei_random<Scalar>();\n    while (ei_abs(a-1) < 1e-4) a = ei_random<Scalar>();\n    while (u.norm() < 1e-4) u = Vector::Random();\n    while (v.norm() < 1e-4) v = Vector::Random();\n\n    HLine line_u = HLine::Through(center + u, center + a*u);\n    HLine line_v = HLine::Through(center + v, center + a*v);\n\n    // the line equations should be normalized so that a^2+b^2=1\n    VERIFY_IS_APPROX(line_u.normal().norm(), Scalar(1));\n    VERIFY_IS_APPROX(line_v.normal().norm(), Scalar(1));\n\n    Vector result = line_u.intersection(line_v);\n\n    // the lines should intersect at the point we called \"center\"\n    VERIFY_IS_APPROX(result, center);\n\n    // check conversions between two types of lines\n    PLine pl(line_u); // gcc 3.3 will commit suicide if we don't name this variable\n    CoeffsType converted_coeffs(HLine(pl).coeffs());\n    converted_coeffs *= line_u.coeffs()(0)/converted_coeffs(0);\n    VERIFY(line_u.coeffs().isApprox(converted_coeffs));\n  }\n}\n\nvoid test_eigen2_hyperplane()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( hyperplane(Hyperplane<float,2>()) );\n    CALL_SUBTEST_2( hyperplane(Hyperplane<float,3>()) );\n    CALL_SUBTEST_3( hyperplane(Hyperplane<double,4>()) );\n    CALL_SUBTEST_4( hyperplane(Hyperplane<std::complex<double>,5>()) );\n    CALL_SUBTEST_5( lines<float>() );\n    CALL_SUBTEST_6( lines<double>() );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_inverse.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>\n// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <Eigen/LU>\n\ntemplate<typename MatrixType> void inverse(const MatrixType& m)\n{\n  /* this test covers the following files:\n     Inverse.h\n  */\n  int rows = m.rows();\n  int cols = m.cols();\n\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  typedef Matrix<Scalar, MatrixType::ColsAtCompileTime, 1> VectorType;\n\n  MatrixType m1 = MatrixType::Random(rows, cols),\n             m2(rows, cols),\n             identity = MatrixType::Identity(rows, rows);\n\n  while(ei_abs(m1.determinant()) < RealScalar(0.1) && rows <= 8)\n  {\n    m1 = MatrixType::Random(rows, cols);\n  }\n\n  m2 = m1.inverse();\n  VERIFY_IS_APPROX(m1, m2.inverse() );\n\n  m1.computeInverse(&m2);\n  VERIFY_IS_APPROX(m1, m2.inverse() );\n\n  VERIFY_IS_APPROX((Scalar(2)*m2).inverse(), m2.inverse()*Scalar(0.5));\n\n  VERIFY_IS_APPROX(identity, m1.inverse() * m1 );\n  VERIFY_IS_APPROX(identity, m1 * m1.inverse() );\n\n  VERIFY_IS_APPROX(m1, m1.inverse().inverse() );\n\n  // since for the general case we implement separately row-major and col-major, test that\n  VERIFY_IS_APPROX(m1.transpose().inverse(), m1.inverse().transpose());\n}\n\nvoid test_eigen2_inverse()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( inverse(Matrix<double,1,1>()) );\n    CALL_SUBTEST_2( inverse(Matrix2d()) );\n    CALL_SUBTEST_3( inverse(Matrix3f()) );\n    CALL_SUBTEST_4( inverse(Matrix4f()) );\n    CALL_SUBTEST_5( inverse(MatrixXf(8,8)) );\n    CALL_SUBTEST_6( inverse(MatrixXcd(7,7)) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_linearstructure.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\ntemplate<typename MatrixType> void linearStructure(const MatrixType& m)\n{\n  /* this test covers the following files:\n     Sum.h Difference.h Opposite.h ScalarMultiple.h\n  */\n\n  typedef typename MatrixType::Scalar Scalar;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> VectorType;\n\n  int rows = m.rows();\n  int cols = m.cols();\n\n  // this test relies a lot on Random.h, and there's not much more that we can do\n  // to test it, hence I consider that we will have tested Random.h\n  MatrixType m1 = MatrixType::Random(rows, cols),\n             m2 = MatrixType::Random(rows, cols),\n             m3(rows, cols);\n\n  Scalar s1 = ei_random<Scalar>();\n  while (ei_abs(s1)<1e-3) s1 = ei_random<Scalar>();\n\n  int r = ei_random<int>(0, rows-1),\n      c = ei_random<int>(0, cols-1);\n\n  VERIFY_IS_APPROX(-(-m1),                  m1);\n  VERIFY_IS_APPROX(m1+m1,                   2*m1);\n  VERIFY_IS_APPROX(m1+m2-m1,                m2);\n  VERIFY_IS_APPROX(-m2+m1+m2,               m1);\n  VERIFY_IS_APPROX(m1*s1,                   s1*m1);\n  VERIFY_IS_APPROX((m1+m2)*s1,              s1*m1+s1*m2);\n  VERIFY_IS_APPROX((-m1+m2)*s1,             -s1*m1+s1*m2);\n  m3 = m2; m3 += m1;\n  VERIFY_IS_APPROX(m3,                      m1+m2);\n  m3 = m2; m3 -= m1;\n  VERIFY_IS_APPROX(m3,                      m2-m1);\n  m3 = m2; m3 *= s1;\n  VERIFY_IS_APPROX(m3,                      s1*m2);\n  if(NumTraits<Scalar>::HasFloatingPoint)\n  {\n    m3 = m2; m3 /= s1;\n    VERIFY_IS_APPROX(m3,                    m2/s1);\n  }\n\n  // again, test operator() to check const-qualification\n  VERIFY_IS_APPROX((-m1)(r,c), -(m1(r,c)));\n  VERIFY_IS_APPROX((m1-m2)(r,c), (m1(r,c))-(m2(r,c)));\n  VERIFY_IS_APPROX((m1+m2)(r,c), (m1(r,c))+(m2(r,c)));\n  VERIFY_IS_APPROX((s1*m1)(r,c), s1*(m1(r,c)));\n  VERIFY_IS_APPROX((m1*s1)(r,c), (m1(r,c))*s1);\n  if(NumTraits<Scalar>::HasFloatingPoint)\n    VERIFY_IS_APPROX((m1/s1)(r,c), (m1(r,c))/s1);\n\n  // use .block to disable vectorization and compare to the vectorized version\n  VERIFY_IS_APPROX(m1+m1.block(0,0,rows,cols), m1+m1);\n  VERIFY_IS_APPROX(m1.cwise() * m1.block(0,0,rows,cols), m1.cwise() * m1);\n  VERIFY_IS_APPROX(m1 - m1.block(0,0,rows,cols), m1 - m1);\n  VERIFY_IS_APPROX(m1.block(0,0,rows,cols) * s1, m1 * s1);\n}\n\nvoid test_eigen2_linearstructure()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( linearStructure(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( linearStructure(Matrix2f()) );\n    CALL_SUBTEST_3( linearStructure(Vector3d()) );\n    CALL_SUBTEST_4( linearStructure(Matrix4d()) );\n    CALL_SUBTEST_5( linearStructure(MatrixXcf(3, 3)) );\n    CALL_SUBTEST_6( linearStructure(MatrixXf(8, 12)) );\n    CALL_SUBTEST_7( linearStructure(MatrixXi(8, 12)) );\n    CALL_SUBTEST_8( linearStructure(MatrixXcd(20, 20)) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_lu.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <Eigen/LU>\n\ntemplate<typename Derived>\nvoid doSomeRankPreservingOperations(Eigen::MatrixBase<Derived>& m)\n{\n  typedef typename Derived::RealScalar RealScalar;\n  for(int a = 0; a < 3*(m.rows()+m.cols()); a++)\n  {\n    RealScalar d = Eigen::ei_random<RealScalar>(-1,1);\n    int i = Eigen::ei_random<int>(0,m.rows()-1); // i is a random row number\n    int j;\n    do {\n      j = Eigen::ei_random<int>(0,m.rows()-1);\n    } while (i==j); // j is another one (must be different)\n    m.row(i) += d * m.row(j);\n\n    i = Eigen::ei_random<int>(0,m.cols()-1); // i is a random column number\n    do {\n      j = Eigen::ei_random<int>(0,m.cols()-1);\n    } while (i==j); // j is another one (must be different)\n    m.col(i) += d * m.col(j);\n  }\n}\n\ntemplate<typename MatrixType> void lu_non_invertible()\n{\n  /* this test covers the following files:\n     LU.h\n  */\n  // NOTE there seems to be a problem with too small sizes -- could easily lie in the doSomeRankPreservingOperations function\n  int rows = ei_random<int>(20,200), cols = ei_random<int>(20,200), cols2 = ei_random<int>(20,200);\n  int rank = ei_random<int>(1, std::min(rows, cols)-1);\n\n  MatrixType m1(rows, cols), m2(cols, cols2), m3(rows, cols2), k(1,1);\n  m1 = MatrixType::Random(rows,cols);\n  if(rows <= cols)\n    for(int i = rank; i < rows; i++) m1.row(i).setZero();\n  else\n    for(int i = rank; i < cols; i++) m1.col(i).setZero();\n  doSomeRankPreservingOperations(m1);\n\n  LU<MatrixType> lu(m1);\n  typename LU<MatrixType>::KernelResultType m1kernel = lu.kernel();\n  typename LU<MatrixType>::ImageResultType m1image = lu.image();\n\n  VERIFY(rank == lu.rank());\n  VERIFY(cols - lu.rank() == lu.dimensionOfKernel());\n  VERIFY(!lu.isInjective());\n  VERIFY(!lu.isInvertible());\n  VERIFY(lu.isSurjective() == (lu.rank() == rows));\n  VERIFY((m1 * m1kernel).isMuchSmallerThan(m1));\n  VERIFY(m1image.lu().rank() == rank);\n  MatrixType sidebyside(m1.rows(), m1.cols() + m1image.cols());\n  sidebyside << m1, m1image;\n  VERIFY(sidebyside.lu().rank() == rank);\n  m2 = MatrixType::Random(cols,cols2);\n  m3 = m1*m2;\n  m2 = MatrixType::Random(cols,cols2);\n  lu.solve(m3, &m2);\n  VERIFY_IS_APPROX(m3, m1*m2);\n  /* solve now always returns true\n  m3 = MatrixType::Random(rows,cols2);\n  VERIFY(!lu.solve(m3, &m2));\n  */\n}\n\ntemplate<typename MatrixType> void lu_invertible()\n{\n  /* this test covers the following files:\n     LU.h\n  */\n  typedef typename NumTraits<typename MatrixType::Scalar>::Real RealScalar;\n  int size = ei_random<int>(10,200);\n\n  MatrixType m1(size, size), m2(size, size), m3(size, size);\n  m1 = MatrixType::Random(size,size);\n\n  if (ei_is_same_type<RealScalar,float>::ret)\n  {\n    // let's build a matrix more stable to inverse\n    MatrixType a = MatrixType::Random(size,size*2);\n    m1 += a * a.adjoint();\n  }\n\n  LU<MatrixType> lu(m1);\n  VERIFY(0 == lu.dimensionOfKernel());\n  VERIFY(size == lu.rank());\n  VERIFY(lu.isInjective());\n  VERIFY(lu.isSurjective());\n  VERIFY(lu.isInvertible());\n  VERIFY(lu.image().lu().isInvertible());\n  m3 = MatrixType::Random(size,size);\n  lu.solve(m3, &m2);\n  VERIFY_IS_APPROX(m3, m1*m2);\n  VERIFY_IS_APPROX(m2, lu.inverse()*m3);\n  m3 = MatrixType::Random(size,size);\n  VERIFY(lu.solve(m3, &m2));\n}\n\nvoid test_eigen2_lu()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( lu_non_invertible<MatrixXf>() );\n    CALL_SUBTEST_2( lu_non_invertible<MatrixXd>() );\n    CALL_SUBTEST_3( lu_non_invertible<MatrixXcf>() );\n    CALL_SUBTEST_4( lu_non_invertible<MatrixXcd>() );\n    CALL_SUBTEST_1( lu_invertible<MatrixXf>() );\n    CALL_SUBTEST_2( lu_invertible<MatrixXd>() );\n    CALL_SUBTEST_3( lu_invertible<MatrixXcf>() );\n    CALL_SUBTEST_4( lu_invertible<MatrixXcd>() );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_map.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2007-2010 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\ntemplate<typename VectorType> void map_class_vector(const VectorType& m)\n{\n  typedef typename VectorType::Scalar Scalar;\n\n  int size = m.size();\n\n  // test Map.h\n  Scalar* array1 = ei_aligned_new<Scalar>(size);\n  Scalar* array2 = ei_aligned_new<Scalar>(size);\n  Scalar* array3 = new Scalar[size+1];\n  Scalar* array3unaligned = std::size_t(array3)%16 == 0 ? array3+1 : array3;\n  \n  Map<VectorType, Aligned>(array1, size) = VectorType::Random(size);\n  Map<VectorType>(array2, size) = Map<VectorType>(array1, size);\n  Map<VectorType>(array3unaligned, size) = Map<VectorType>((const Scalar*)array1, size); // test non-const-correctness support in eigen2\n  VectorType ma1 = Map<VectorType>(array1, size);\n  VectorType ma2 = Map<VectorType, Aligned>(array2, size);\n  VectorType ma3 = Map<VectorType>(array3unaligned, size);\n  VERIFY_IS_APPROX(ma1, ma2);\n  VERIFY_IS_APPROX(ma1, ma3);\n  \n  ei_aligned_delete(array1, size);\n  ei_aligned_delete(array2, size);\n  delete[] array3;\n}\n\ntemplate<typename MatrixType> void map_class_matrix(const MatrixType& m)\n{\n  typedef typename MatrixType::Scalar Scalar;\n\n  int rows = m.rows(), cols = m.cols(), size = rows*cols;\n\n  // test Map.h\n  Scalar* array1 = ei_aligned_new<Scalar>(size);\n  for(int i = 0; i < size; i++) array1[i] = Scalar(1);\n  Scalar* array2 = ei_aligned_new<Scalar>(size);\n  for(int i = 0; i < size; i++) array2[i] = Scalar(1);\n  Scalar* array3 = new Scalar[size+1];\n  for(int i = 0; i < size+1; i++) array3[i] = Scalar(1);\n  Scalar* array3unaligned = std::size_t(array3)%16 == 0 ? array3+1 : array3;\n  Map<MatrixType, Aligned>(array1, rows, cols) = MatrixType::Ones(rows,cols);\n  Map<MatrixType>(array2, rows, cols) = Map<MatrixType>((const Scalar*)array1, rows, cols); // test non-const-correctness support in eigen2\n  Map<MatrixType>(array3unaligned, rows, cols) = Map<MatrixType>(array1, rows, cols);\n  MatrixType ma1 = Map<MatrixType>(array1, rows, cols);\n  MatrixType ma2 = Map<MatrixType, Aligned>(array2, rows, cols);\n  VERIFY_IS_APPROX(ma1, ma2);\n  MatrixType ma3 = Map<MatrixType>(array3unaligned, rows, cols);\n  VERIFY_IS_APPROX(ma1, ma3);\n  \n  ei_aligned_delete(array1, size);\n  ei_aligned_delete(array2, size);\n  delete[] array3;\n}\n\ntemplate<typename VectorType> void map_static_methods(const VectorType& m)\n{\n  typedef typename VectorType::Scalar Scalar;\n\n  int size = m.size();\n\n  // test Map.h\n  Scalar* array1 = ei_aligned_new<Scalar>(size);\n  Scalar* array2 = ei_aligned_new<Scalar>(size);\n  Scalar* array3 = new Scalar[size+1];\n  Scalar* array3unaligned = std::size_t(array3)%16 == 0 ? array3+1 : array3;\n  \n  VectorType::MapAligned(array1, size) = VectorType::Random(size);\n  VectorType::Map(array2, size) = VectorType::Map(array1, size);\n  VectorType::Map(array3unaligned, size) = VectorType::Map(array1, size);\n  VectorType ma1 = VectorType::Map(array1, size);\n  VectorType ma2 = VectorType::MapAligned(array2, size);\n  VectorType ma3 = VectorType::Map(array3unaligned, size);\n  VERIFY_IS_APPROX(ma1, ma2);\n  VERIFY_IS_APPROX(ma1, ma3);\n  \n  ei_aligned_delete(array1, size);\n  ei_aligned_delete(array2, size);\n  delete[] array3;\n}\n\n\nvoid test_eigen2_map()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( map_class_vector(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( map_class_vector(Vector4d()) );\n    CALL_SUBTEST_3( map_class_vector(RowVector4f()) );\n    CALL_SUBTEST_4( map_class_vector(VectorXcf(8)) );\n    CALL_SUBTEST_5( map_class_vector(VectorXi(12)) );\n\n    CALL_SUBTEST_1( map_class_matrix(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( map_class_matrix(Matrix4d()) );\n    CALL_SUBTEST_6( map_class_matrix(Matrix<float,3,5>()) );\n    CALL_SUBTEST_4( map_class_matrix(MatrixXcf(ei_random<int>(1,10),ei_random<int>(1,10))) );\n    CALL_SUBTEST_5( map_class_matrix(MatrixXi(ei_random<int>(1,10),ei_random<int>(1,10))) );\n\n    CALL_SUBTEST_1( map_static_methods(Matrix<double, 1, 1>()) );\n    CALL_SUBTEST_2( map_static_methods(Vector3f()) );\n    CALL_SUBTEST_7( map_static_methods(RowVector3d()) );\n    CALL_SUBTEST_4( map_static_methods(VectorXcd(8)) );\n    CALL_SUBTEST_5( map_static_methods(VectorXf(12)) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_meta.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\nvoid test_eigen2_meta()\n{\n  typedef float & FloatRef;\n  typedef const float & ConstFloatRef;\n  \n  VERIFY((ei_meta_if<(3<4),ei_meta_true, ei_meta_false>::ret::ret));\n  VERIFY(( ei_is_same_type<float,float>::ret));\n  VERIFY((!ei_is_same_type<float,double>::ret));\n  VERIFY((!ei_is_same_type<float,float&>::ret));\n  VERIFY((!ei_is_same_type<float,const float&>::ret));\n  \n  VERIFY(( ei_is_same_type<float,ei_cleantype<const float&>::type >::ret));\n  VERIFY(( ei_is_same_type<float,ei_cleantype<const float*>::type >::ret));\n  VERIFY(( ei_is_same_type<float,ei_cleantype<const float*&>::type >::ret));\n  VERIFY(( ei_is_same_type<float,ei_cleantype<float**>::type >::ret));\n  VERIFY(( ei_is_same_type<float,ei_cleantype<float**&>::type >::ret));\n  VERIFY(( ei_is_same_type<float,ei_cleantype<float* const *&>::type >::ret));\n  VERIFY(( ei_is_same_type<float,ei_cleantype<float* const>::type >::ret));\n\n  VERIFY(( ei_is_same_type<float*,ei_unconst<const float*>::type >::ret));\n  VERIFY(( ei_is_same_type<float&,ei_unconst<const float&>::type >::ret));\n  VERIFY(( ei_is_same_type<float&,ei_unconst<ConstFloatRef>::type >::ret));\n  \n  VERIFY(( ei_is_same_type<float&,ei_unconst<float&>::type >::ret));\n  VERIFY(( ei_is_same_type<float,ei_unref<float&>::type >::ret));\n  VERIFY(( ei_is_same_type<const float,ei_unref<const float&>::type >::ret));\n  VERIFY(( ei_is_same_type<float,ei_unpointer<float*>::type >::ret));\n  VERIFY(( ei_is_same_type<const float,ei_unpointer<const float*>::type >::ret));\n  VERIFY(( ei_is_same_type<float,ei_unpointer<float* const >::type >::ret));\n  \n  VERIFY(ei_meta_sqrt<1>::ret == 1);\n  #define VERIFY_META_SQRT(X) VERIFY(ei_meta_sqrt<X>::ret == int(ei_sqrt(double(X))))\n  VERIFY_META_SQRT(2);\n  VERIFY_META_SQRT(3);\n  VERIFY_META_SQRT(4);\n  VERIFY_META_SQRT(5);\n  VERIFY_META_SQRT(6);\n  VERIFY_META_SQRT(8);\n  VERIFY_META_SQRT(9);\n  VERIFY_META_SQRT(15);\n  VERIFY_META_SQRT(16);\n  VERIFY_META_SQRT(17);\n  VERIFY_META_SQRT(255);\n  VERIFY_META_SQRT(256);\n  VERIFY_META_SQRT(257);\n  VERIFY_META_SQRT(1023);\n  VERIFY_META_SQRT(1024);\n  VERIFY_META_SQRT(1025);\n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_miscmatrices.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\ntemplate<typename MatrixType> void miscMatrices(const MatrixType& m)\n{\n  /* this test covers the following files:\n     DiagonalMatrix.h Ones.h\n  */\n\n  typedef typename MatrixType::Scalar Scalar;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> VectorType;\n  typedef Matrix<Scalar, 1, MatrixType::ColsAtCompileTime> RowVectorType;\n  int rows = m.rows();\n  int cols = m.cols();\n\n  int r = ei_random<int>(0, rows-1), r2 = ei_random<int>(0, rows-1), c = ei_random<int>(0, cols-1);\n  VERIFY_IS_APPROX(MatrixType::Ones(rows,cols)(r,c), static_cast<Scalar>(1));\n  MatrixType m1 = MatrixType::Ones(rows,cols);\n  VERIFY_IS_APPROX(m1(r,c), static_cast<Scalar>(1));\n  VectorType v1 = VectorType::Random(rows);\n  v1[0];\n  Matrix<Scalar, MatrixType::RowsAtCompileTime, MatrixType::RowsAtCompileTime>\n  square = v1.asDiagonal();\n  if(r==r2) VERIFY_IS_APPROX(square(r,r2), v1[r]);\n  else VERIFY_IS_MUCH_SMALLER_THAN(square(r,r2), static_cast<Scalar>(1));\n  square = MatrixType::Zero(rows, rows);\n  square.diagonal() = VectorType::Ones(rows);\n  VERIFY_IS_APPROX(square, MatrixType::Identity(rows, rows));\n}\n\nvoid test_eigen2_miscmatrices()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( miscMatrices(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( miscMatrices(Matrix4d()) );\n    CALL_SUBTEST_3( miscMatrices(MatrixXcf(3, 3)) );\n    CALL_SUBTEST_4( miscMatrices(MatrixXi(8, 12)) );\n    CALL_SUBTEST_5( miscMatrices(MatrixXcd(20, 20)) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_mixingtypes.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>\n// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_NO_STATIC_ASSERT\n#define EIGEN_NO_STATIC_ASSERT // turn static asserts into runtime asserts in order to check them\n#endif\n\n#ifndef EIGEN_DONT_VECTORIZE\n#define EIGEN_DONT_VECTORIZE // SSE intrinsics aren't designed to allow mixing types\n#endif\n\n#include \"main.h\"\n\n\ntemplate<int SizeAtCompileType> void mixingtypes(int size = SizeAtCompileType)\n{\n  typedef Matrix<float, SizeAtCompileType, SizeAtCompileType> Mat_f;\n  typedef Matrix<double, SizeAtCompileType, SizeAtCompileType> Mat_d;\n  typedef Matrix<std::complex<float>, SizeAtCompileType, SizeAtCompileType> Mat_cf;\n  typedef Matrix<std::complex<double>, SizeAtCompileType, SizeAtCompileType> Mat_cd;\n  typedef Matrix<float, SizeAtCompileType, 1> Vec_f;\n  typedef Matrix<double, SizeAtCompileType, 1> Vec_d;\n  typedef Matrix<std::complex<float>, SizeAtCompileType, 1> Vec_cf;\n  typedef Matrix<std::complex<double>, SizeAtCompileType, 1> Vec_cd;\n\n  Mat_f mf(size,size);\n  Mat_d md(size,size);\n  Mat_cf mcf(size,size);\n  Mat_cd mcd(size,size);\n  Vec_f vf(size,1);\n  Vec_d vd(size,1);\n  Vec_cf vcf(size,1);\n  Vec_cd vcd(size,1);\n\n  mf+mf;\n  VERIFY_RAISES_ASSERT(mf+md);\n  VERIFY_RAISES_ASSERT(mf+mcf);\n  VERIFY_RAISES_ASSERT(vf=vd);\n  VERIFY_RAISES_ASSERT(vf+=vd);\n  VERIFY_RAISES_ASSERT(mcd=md);\n\n  mf*mf;\n  md*mcd;\n  mcd*md;\n  mf*vcf;\n  mcf*vf;\n  mcf *= mf;\n  vcd = md*vcd;\n  vcf = mcf*vf;\n#if 0\n  // these are know generating hard build errors in eigen3\n  VERIFY_RAISES_ASSERT(mf*md);\n  VERIFY_RAISES_ASSERT(mcf*mcd);\n  VERIFY_RAISES_ASSERT(mcf*vcd);\n  VERIFY_RAISES_ASSERT(vcf = mf*vf);\n\n  vf.eigen2_dot(vf);\n  VERIFY_RAISES_ASSERT(vd.eigen2_dot(vf));\n  VERIFY_RAISES_ASSERT(vcf.eigen2_dot(vf)); // yeah eventually we should allow this but i'm too lazy to make that change now in Dot.h\n  // especially as that might be rewritten as cwise product .sum() which would make that automatic.\n#endif\n}\n\nvoid test_eigen2_mixingtypes()\n{\n  // check that our operator new is indeed called:\n  CALL_SUBTEST_1(mixingtypes<3>());\n  CALL_SUBTEST_2(mixingtypes<4>());\n  CALL_SUBTEST_3(mixingtypes<Dynamic>(20));\n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_newstdvector.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#define EIGEN_USE_NEW_STDVECTOR\n#include \"main.h\"\n#include <Eigen/StdVector>\n#include <Eigen/Geometry>\n\ntemplate<typename MatrixType>\nvoid check_stdvector_matrix(const MatrixType& m)\n{\n  int rows = m.rows();\n  int cols = m.cols();\n  MatrixType x = MatrixType::Random(rows,cols), y = MatrixType::Random(rows,cols);\n  std::vector<MatrixType,Eigen::aligned_allocator<MatrixType> > v(10, MatrixType(rows,cols)), w(20, y);\n  v[5] = x;\n  w[6] = v[5];\n  VERIFY_IS_APPROX(w[6], v[5]);\n  v = w;\n  for(int i = 0; i < 20; i++)\n  {\n    VERIFY_IS_APPROX(w[i], v[i]);\n  }\n\n  v.resize(21);\n  v[20] = x;\n  VERIFY_IS_APPROX(v[20], x);\n  v.resize(22,y);\n  VERIFY_IS_APPROX(v[21], y);\n  v.push_back(x);\n  VERIFY_IS_APPROX(v[22], x);\n  VERIFY((std::size_t)&(v[22]) == (std::size_t)&(v[21]) + sizeof(MatrixType));\n\n  // do a lot of push_back such that the vector gets internally resized\n  // (with memory reallocation)\n  MatrixType* ref = &w[0];\n  for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i)\n    v.push_back(w[i%w.size()]);\n  for(unsigned int i=23; i<v.size(); ++i)\n  {\n    VERIFY(v[i]==w[(i-23)%w.size()]);\n  }\n}\n\ntemplate<typename TransformType>\nvoid check_stdvector_transform(const TransformType&)\n{\n  typedef typename TransformType::MatrixType MatrixType;\n  TransformType x(MatrixType::Random()), y(MatrixType::Random());\n  std::vector<TransformType,Eigen::aligned_allocator<TransformType> > v(10), w(20, y);\n  v[5] = x;\n  w[6] = v[5];\n  VERIFY_IS_APPROX(w[6], v[5]);\n  v = w;\n  for(int i = 0; i < 20; i++)\n  {\n    VERIFY_IS_APPROX(w[i], v[i]);\n  }\n\n  v.resize(21);\n  v[20] = x;\n  VERIFY_IS_APPROX(v[20], x);\n  v.resize(22,y);\n  VERIFY_IS_APPROX(v[21], y);\n  v.push_back(x);\n  VERIFY_IS_APPROX(v[22], x);\n  VERIFY((std::size_t)&(v[22]) == (std::size_t)&(v[21]) + sizeof(TransformType));\n\n  // do a lot of push_back such that the vector gets internally resized\n  // (with memory reallocation)\n  TransformType* ref = &w[0];\n  for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i)\n    v.push_back(w[i%w.size()]);\n  for(unsigned int i=23; i<v.size(); ++i)\n  {\n    VERIFY(v[i].matrix()==w[(i-23)%w.size()].matrix());\n  }\n}\n\ntemplate<typename QuaternionType>\nvoid check_stdvector_quaternion(const QuaternionType&)\n{\n  typedef typename QuaternionType::Coefficients Coefficients;\n  QuaternionType x(Coefficients::Random()), y(Coefficients::Random());\n  std::vector<QuaternionType,Eigen::aligned_allocator<QuaternionType> > v(10), w(20, y);\n  v[5] = x;\n  w[6] = v[5];\n  VERIFY_IS_APPROX(w[6], v[5]);\n  v = w;\n  for(int i = 0; i < 20; i++)\n  {\n    VERIFY_IS_APPROX(w[i], v[i]);\n  }\n\n  v.resize(21);\n  v[20] = x;\n  VERIFY_IS_APPROX(v[20], x);\n  v.resize(22,y);\n  VERIFY_IS_APPROX(v[21], y);\n  v.push_back(x);\n  VERIFY_IS_APPROX(v[22], x);\n  VERIFY((std::size_t)&(v[22]) == (std::size_t)&(v[21]) + sizeof(QuaternionType));\n\n  // do a lot of push_back such that the vector gets internally resized\n  // (with memory reallocation)\n  QuaternionType* ref = &w[0];\n  for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i)\n    v.push_back(w[i%w.size()]);\n  for(unsigned int i=23; i<v.size(); ++i)\n  {\n    VERIFY(v[i].coeffs()==w[(i-23)%w.size()].coeffs());\n  }\n}\n\nvoid test_eigen2_newstdvector()\n{\n  // some non vectorizable fixed sizes\n  CALL_SUBTEST_1(check_stdvector_matrix(Vector2f()));\n  CALL_SUBTEST_1(check_stdvector_matrix(Matrix3f()));\n  CALL_SUBTEST_1(check_stdvector_matrix(Matrix3d()));\n\n  // some vectorizable fixed sizes\n  CALL_SUBTEST_2(check_stdvector_matrix(Matrix2f()));\n  CALL_SUBTEST_2(check_stdvector_matrix(Vector4f()));\n  CALL_SUBTEST_2(check_stdvector_matrix(Matrix4f()));\n  CALL_SUBTEST_2(check_stdvector_matrix(Matrix4d()));\n\n  // some dynamic sizes\n  CALL_SUBTEST_3(check_stdvector_matrix(MatrixXd(1,1)));\n  CALL_SUBTEST_3(check_stdvector_matrix(VectorXd(20)));\n  CALL_SUBTEST_3(check_stdvector_matrix(RowVectorXf(20)));\n  CALL_SUBTEST_3(check_stdvector_matrix(MatrixXcf(10,10)));\n\n  // some Transform\n  CALL_SUBTEST_4(check_stdvector_transform(Transform2f()));\n  CALL_SUBTEST_4(check_stdvector_transform(Transform3f()));\n  CALL_SUBTEST_4(check_stdvector_transform(Transform3d()));\n  //CALL_SUBTEST(check_stdvector_transform(Transform4d()));\n\n  // some Quaternion\n  CALL_SUBTEST_5(check_stdvector_quaternion(Quaternionf()));\n  CALL_SUBTEST_5(check_stdvector_quaternion(Quaterniond()));\n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_nomalloc.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n// this hack is needed to make this file compiles with -pedantic (gcc)\n#ifdef __GNUC__\n#define throw(X)\n#endif\n// discard stack allocation as that too bypasses malloc\n#define EIGEN_STACK_ALLOCATION_LIMIT 0\n// any heap allocation will raise an assert\n#define EIGEN_NO_MALLOC\n\n#include \"main.h\"\n\ntemplate<typename MatrixType> void nomalloc(const MatrixType& m)\n{\n  /* this test check no dynamic memory allocation are issued with fixed-size matrices\n  */\n\n  typedef typename MatrixType::Scalar Scalar;\n\n  int rows = m.rows();\n  int cols = m.cols();\n\n  MatrixType m1 = MatrixType::Random(rows, cols),\n             m2 = MatrixType::Random(rows, cols);\n\n  Scalar s1 = ei_random<Scalar>();\n\n  int r = ei_random<int>(0, rows-1),\n      c = ei_random<int>(0, cols-1);\n\n  VERIFY_IS_APPROX((m1+m2)*s1,              s1*m1+s1*m2);\n  VERIFY_IS_APPROX((m1+m2)(r,c), (m1(r,c))+(m2(r,c)));\n  VERIFY_IS_APPROX(m1.cwise() * m1.block(0,0,rows,cols), m1.cwise() * m1);\n  VERIFY_IS_APPROX((m1*m1.transpose())*m2,  m1*(m1.transpose()*m2));\n}\n\nvoid test_eigen2_nomalloc()\n{\n  // check that our operator new is indeed called:\n  VERIFY_RAISES_ASSERT(MatrixXd dummy = MatrixXd::Random(3,3));\n  CALL_SUBTEST_1( nomalloc(Matrix<float, 1, 1>()) );\n  CALL_SUBTEST_2( nomalloc(Matrix4d()) );\n  CALL_SUBTEST_3( nomalloc(Matrix<float,32,32>()) );\n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_packetmath.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\n// using namespace Eigen;\n\ntemplate<typename Scalar> bool areApprox(const Scalar* a, const Scalar* b, int size)\n{\n  for (int i=0; i<size; ++i)\n    if (!ei_isApprox(a[i],b[i])) return false;\n  return true;\n}\n\n#define CHECK_CWISE(REFOP, POP) { \\\n  for (int i=0; i<PacketSize; ++i) \\\n    ref[i] = REFOP(data1[i], data1[i+PacketSize]); \\\n  ei_pstore(data2, POP(ei_pload(data1), ei_pload(data1+PacketSize))); \\\n  VERIFY(areApprox(ref, data2, PacketSize) && #POP); \\\n}\n\n#define REF_ADD(a,b) ((a)+(b))\n#define REF_SUB(a,b) ((a)-(b))\n#define REF_MUL(a,b) ((a)*(b))\n#define REF_DIV(a,b) ((a)/(b))\n\nnamespace std {\n\ntemplate<> const complex<float>& min(const complex<float>& a, const complex<float>& b)\n{ return a.real() < b.real() ? a : b; }\n\ntemplate<> const complex<float>& max(const complex<float>& a, const complex<float>& b)\n{ return a.real() < b.real() ? b : a; }\n\n}\n\ntemplate<typename Scalar> void packetmath()\n{\n  typedef typename ei_packet_traits<Scalar>::type Packet;\n  const int PacketSize = ei_packet_traits<Scalar>::size;\n\n  const int size = PacketSize*4;\n  EIGEN_ALIGN_128 Scalar data1[ei_packet_traits<Scalar>::size*4];\n  EIGEN_ALIGN_128 Scalar data2[ei_packet_traits<Scalar>::size*4];\n  EIGEN_ALIGN_128 Packet packets[PacketSize*2];\n  EIGEN_ALIGN_128 Scalar ref[ei_packet_traits<Scalar>::size*4];\n  for (int i=0; i<size; ++i)\n  {\n    data1[i] = ei_random<Scalar>();\n    data2[i] = ei_random<Scalar>();\n  }\n\n  ei_pstore(data2, ei_pload(data1));\n  VERIFY(areApprox(data1, data2, PacketSize) && \"aligned load/store\");\n\n  for (int offset=0; offset<PacketSize; ++offset)\n  {\n    ei_pstore(data2, ei_ploadu(data1+offset));\n    VERIFY(areApprox(data1+offset, data2, PacketSize) && \"ei_ploadu\");\n  }\n\n  for (int offset=0; offset<PacketSize; ++offset)\n  {\n    ei_pstoreu(data2+offset, ei_pload(data1));\n    VERIFY(areApprox(data1, data2+offset, PacketSize) && \"ei_pstoreu\");\n  }\n\n  for (int offset=0; offset<PacketSize; ++offset)\n  {\n    packets[0] = ei_pload(data1);\n    packets[1] = ei_pload(data1+PacketSize);\n         if (offset==0) ei_palign<0>(packets[0], packets[1]);\n    else if (offset==1) ei_palign<1>(packets[0], packets[1]);\n    else if (offset==2) ei_palign<2>(packets[0], packets[1]);\n    else if (offset==3) ei_palign<3>(packets[0], packets[1]);\n    ei_pstore(data2, packets[0]);\n\n    for (int i=0; i<PacketSize; ++i)\n      ref[i] = data1[i+offset];\n\n    typedef Matrix<Scalar, PacketSize, 1> Vector;\n    VERIFY(areApprox(ref, data2, PacketSize) && \"ei_palign\");\n  }\n\n  CHECK_CWISE(REF_ADD,  ei_padd);\n  CHECK_CWISE(REF_SUB,  ei_psub);\n  CHECK_CWISE(REF_MUL,  ei_pmul);\n  #ifndef EIGEN_VECTORIZE_ALTIVEC\n  if (!ei_is_same_type<Scalar,int>::ret)\n    CHECK_CWISE(REF_DIV,  ei_pdiv);\n  #endif\n  CHECK_CWISE(std::min, ei_pmin);\n  CHECK_CWISE(std::max, ei_pmax);\n\n  for (int i=0; i<PacketSize; ++i)\n    ref[i] = data1[0];\n  ei_pstore(data2, ei_pset1(data1[0]));\n  VERIFY(areApprox(ref, data2, PacketSize) && \"ei_pset1\");\n\n  VERIFY(ei_isApprox(data1[0], ei_pfirst(ei_pload(data1))) && \"ei_pfirst\");\n\n  ref[0] = 0;\n  for (int i=0; i<PacketSize; ++i)\n    ref[0] += data1[i];\n  VERIFY(ei_isApprox(ref[0], ei_predux(ei_pload(data1))) && \"ei_predux\");\n\n  for (int j=0; j<PacketSize; ++j)\n  {\n    ref[j] = 0;\n    for (int i=0; i<PacketSize; ++i)\n      ref[j] += data1[i+j*PacketSize];\n    packets[j] = ei_pload(data1+j*PacketSize);\n  }\n  ei_pstore(data2, ei_preduxp(packets));\n  VERIFY(areApprox(ref, data2, PacketSize) && \"ei_preduxp\");\n}\n\nvoid test_eigen2_packetmath()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( packetmath<float>() );\n    CALL_SUBTEST_2( packetmath<double>() );\n    CALL_SUBTEST_3( packetmath<int>() );\n    CALL_SUBTEST_4( packetmath<std::complex<float> >() );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_parametrizedline.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>\n// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <Eigen/Geometry>\n#include <Eigen/LU>\n#include <Eigen/QR>\n\ntemplate<typename LineType> void parametrizedline(const LineType& _line)\n{\n  /* this test covers the following files:\n     ParametrizedLine.h\n  */\n\n  const int dim = _line.dim();\n  typedef typename LineType::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  typedef Matrix<Scalar, LineType::AmbientDimAtCompileTime, 1> VectorType;\n  typedef Matrix<Scalar, LineType::AmbientDimAtCompileTime,\n                         LineType::AmbientDimAtCompileTime> MatrixType;\n\n  VectorType p0 = VectorType::Random(dim);\n  VectorType p1 = VectorType::Random(dim);\n\n  VectorType d0 = VectorType::Random(dim).normalized();\n\n  LineType l0(p0, d0);\n\n  Scalar s0 = ei_random<Scalar>();\n  Scalar s1 = ei_abs(ei_random<Scalar>());\n\n  VERIFY_IS_MUCH_SMALLER_THAN( l0.distance(p0), RealScalar(1) );\n  VERIFY_IS_MUCH_SMALLER_THAN( l0.distance(p0+s0*d0), RealScalar(1) );\n  VERIFY_IS_APPROX( (l0.projection(p1)-p1).norm(), l0.distance(p1) );\n  VERIFY_IS_MUCH_SMALLER_THAN( l0.distance(l0.projection(p1)), RealScalar(1) );\n  VERIFY_IS_APPROX( Scalar(l0.distance((p0+s0*d0) + d0.unitOrthogonal() * s1)), s1 );\n\n  // casting\n  const int Dim = LineType::AmbientDimAtCompileTime;\n  typedef typename GetDifferentType<Scalar>::type OtherScalar;\n  ParametrizedLine<OtherScalar,Dim> hp1f = l0.template cast<OtherScalar>();\n  VERIFY_IS_APPROX(hp1f.template cast<Scalar>(),l0);\n  ParametrizedLine<Scalar,Dim> hp1d = l0.template cast<Scalar>();\n  VERIFY_IS_APPROX(hp1d.template cast<Scalar>(),l0);\n}\n\nvoid test_eigen2_parametrizedline()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( parametrizedline(ParametrizedLine<float,2>()) );\n    CALL_SUBTEST_2( parametrizedline(ParametrizedLine<float,3>()) );\n    CALL_SUBTEST_3( parametrizedline(ParametrizedLine<double,4>()) );\n    CALL_SUBTEST_4( parametrizedline(ParametrizedLine<std::complex<double>,5>()) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_prec_inverse_4x4.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <Eigen/LU>\n#include <algorithm>\n\ntemplate<typename T> std::string type_name() { return \"other\"; }\ntemplate<> std::string type_name<float>() { return \"float\"; }\ntemplate<> std::string type_name<double>() { return \"double\"; }\ntemplate<> std::string type_name<int>() { return \"int\"; }\ntemplate<> std::string type_name<std::complex<float> >() { return \"complex<float>\"; }\ntemplate<> std::string type_name<std::complex<double> >() { return \"complex<double>\"; }\ntemplate<> std::string type_name<std::complex<int> >() { return \"complex<int>\"; }\n\n#define EIGEN_DEBUG_VAR(x) std::cerr << #x << \" = \" << x << std::endl;\n\ntemplate<typename T> inline typename NumTraits<T>::Real epsilon()\n{\n return std::numeric_limits<typename NumTraits<T>::Real>::epsilon();\n}\n\ntemplate<typename MatrixType> void inverse_permutation_4x4()\n{\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename MatrixType::RealScalar RealScalar;\n  Vector4i indices(0,1,2,3);\n  for(int i = 0; i < 24; ++i)\n  {\n    MatrixType m = MatrixType::Zero();\n    m(indices(0),0) = 1;\n    m(indices(1),1) = 1;\n    m(indices(2),2) = 1;\n    m(indices(3),3) = 1;\n    MatrixType inv = m.inverse();\n    double error = double( (m*inv-MatrixType::Identity()).norm() / epsilon<Scalar>() );\n    VERIFY(error == 0.0);\n    std::next_permutation(indices.data(),indices.data()+4);\n  }\n}\n\ntemplate<typename MatrixType> void inverse_general_4x4(int repeat)\n{\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename MatrixType::RealScalar RealScalar;\n  double error_sum = 0., error_max = 0.;\n  for(int i = 0; i < repeat; ++i)\n  {\n    MatrixType m;\n    RealScalar absdet;\n    do {\n      m = MatrixType::Random();\n      absdet = ei_abs(m.determinant());\n    } while(absdet < 10 * epsilon<Scalar>());\n    MatrixType inv = m.inverse();\n    double error = double( (m*inv-MatrixType::Identity()).norm() * absdet / epsilon<Scalar>() );\n    error_sum += error;\n    error_max = std::max(error_max, error);\n  }\n  std::cerr << \"inverse_general_4x4, Scalar = \" << type_name<Scalar>() << std::endl;\n  double error_avg = error_sum / repeat;\n  EIGEN_DEBUG_VAR(error_avg);\n  EIGEN_DEBUG_VAR(error_max);\n  VERIFY(error_avg < (NumTraits<Scalar>::IsComplex ? 8.0 : 1.25));\n  VERIFY(error_max < (NumTraits<Scalar>::IsComplex ? 64.0 : 20.0));\n}\n\nvoid test_eigen2_prec_inverse_4x4()\n{\n  CALL_SUBTEST_1((inverse_permutation_4x4<Matrix4f>()));\n  CALL_SUBTEST_1(( inverse_general_4x4<Matrix4f>(200000 * g_repeat) ));\n\n  CALL_SUBTEST_2((inverse_permutation_4x4<Matrix<double,4,4,RowMajor> >()));\n  CALL_SUBTEST_2(( inverse_general_4x4<Matrix<double,4,4,RowMajor> >(200000 * g_repeat) ));\n\n  CALL_SUBTEST_3((inverse_permutation_4x4<Matrix4cf>()));\n  CALL_SUBTEST_3((inverse_general_4x4<Matrix4cf>(50000 * g_repeat)));\n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_product_large.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"product.h\"\n\nvoid test_eigen2_product_large()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( product(MatrixXf(ei_random<int>(1,320), ei_random<int>(1,320))) );\n    CALL_SUBTEST_2( product(MatrixXd(ei_random<int>(1,320), ei_random<int>(1,320))) );\n    CALL_SUBTEST_3( product(MatrixXi(ei_random<int>(1,320), ei_random<int>(1,320))) );\n    CALL_SUBTEST_4( product(MatrixXcf(ei_random<int>(1,50), ei_random<int>(1,50))) );\n    CALL_SUBTEST_5( product(Matrix<float,Dynamic,Dynamic,RowMajor>(ei_random<int>(1,320), ei_random<int>(1,320))) );\n  }\n\n#ifdef EIGEN_TEST_PART_6\n  {\n    // test a specific issue in DiagonalProduct\n    int N = 1000000;\n    VectorXf v = VectorXf::Ones(N);\n    MatrixXf m = MatrixXf::Ones(N,3);\n    m = (v+v).asDiagonal() * m;\n    VERIFY_IS_APPROX(m, MatrixXf::Constant(N,3,2));\n  }\n\n  {\n    // test deferred resizing in Matrix::operator=\n    MatrixXf a = MatrixXf::Random(10,4), b = MatrixXf::Random(4,10), c = a;\n    VERIFY_IS_APPROX((a = a * b), (c * b).eval());\n  }\n\n  {\n    MatrixXf mat1(10,10); mat1.setRandom();\n    MatrixXf mat2(32,10); mat2.setRandom();\n    MatrixXf result = mat1.row(2)*mat2.transpose();\n    VERIFY_IS_APPROX(result, (mat1.row(2)*mat2.transpose()).eval());\n  }\n#endif\n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_product_small.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#define EIGEN_NO_STATIC_ASSERT\n#include \"product.h\"\n\nvoid test_eigen2_product_small()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( product(Matrix<float, 3, 2>()) );\n    CALL_SUBTEST_2( product(Matrix<int, 3, 5>()) );\n    CALL_SUBTEST_3( product(Matrix3d()) );\n    CALL_SUBTEST_4( product(Matrix4d()) );\n    CALL_SUBTEST_5( product(Matrix4f()) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_qr.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <Eigen/QR>\n\ntemplate<typename MatrixType> void qr(const MatrixType& m)\n{\n  /* this test covers the following files:\n     QR.h\n  */\n  int rows = m.rows();\n  int cols = m.cols();\n\n  typedef typename MatrixType::Scalar Scalar;\n  typedef Matrix<Scalar, MatrixType::ColsAtCompileTime, MatrixType::ColsAtCompileTime> SquareMatrixType;\n  typedef Matrix<Scalar, MatrixType::ColsAtCompileTime, 1> VectorType;\n\n  MatrixType a = MatrixType::Random(rows,cols);\n  QR<MatrixType> qrOfA(a);\n  VERIFY_IS_APPROX(a, qrOfA.matrixQ() * qrOfA.matrixR());\n  VERIFY_IS_NOT_APPROX(a+MatrixType::Identity(rows, cols), qrOfA.matrixQ() * qrOfA.matrixR());\n\n  #if 0 // eigenvalues module not yet ready\n  SquareMatrixType b = a.adjoint() * a;\n\n  // check tridiagonalization\n  Tridiagonalization<SquareMatrixType> tridiag(b);\n  VERIFY_IS_APPROX(b, tridiag.matrixQ() * tridiag.matrixT() * tridiag.matrixQ().adjoint());\n\n  // check hessenberg decomposition\n  HessenbergDecomposition<SquareMatrixType> hess(b);\n  VERIFY_IS_APPROX(b, hess.matrixQ() * hess.matrixH() * hess.matrixQ().adjoint());\n  VERIFY_IS_APPROX(tridiag.matrixT(), hess.matrixH());\n  b = SquareMatrixType::Random(cols,cols);\n  hess.compute(b);\n  VERIFY_IS_APPROX(b, hess.matrixQ() * hess.matrixH() * hess.matrixQ().adjoint());\n  #endif\n}\n\nvoid test_eigen2_qr()\n{\n  for(int i = 0; i < 1; i++) {\n    CALL_SUBTEST_1( qr(Matrix2f()) );\n    CALL_SUBTEST_2( qr(Matrix4d()) );\n    CALL_SUBTEST_3( qr(MatrixXf(12,8)) );\n    CALL_SUBTEST_4( qr(MatrixXcd(5,5)) );\n    CALL_SUBTEST_4( qr(MatrixXcd(7,3)) );\n  }\n\n#ifdef EIGEN_TEST_PART_5\n  // small isFullRank test\n  {\n    Matrix3d mat;\n    mat << 1, 45, 1, 2, 2, 2, 1, 2, 3;\n    VERIFY(mat.qr().isFullRank());\n    mat << 1, 1, 1, 2, 2, 2, 1, 2, 3;\n    //always returns true in eigen2support\n    //VERIFY(!mat.qr().isFullRank());\n  }\n\n#endif\n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_qtvector.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>\n// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#define EIGEN_WORK_AROUND_QT_BUG_CALLING_WRONG_OPERATOR_NEW_FIXED_IN_QT_4_5\n\n#include \"main.h\"\n\n#include <Eigen/Geometry>\n#include <Eigen/QtAlignedMalloc>\n\n#include <QtCore/QVector>\n\ntemplate<typename MatrixType>\nvoid check_qtvector_matrix(const MatrixType& m)\n{\n  int rows = m.rows();\n  int cols = m.cols();\n  MatrixType x = MatrixType::Random(rows,cols), y = MatrixType::Random(rows,cols);\n  QVector<MatrixType> v(10, MatrixType(rows,cols)), w(20, y);\n  for(int i = 0; i < 20; i++)\n  {\n    VERIFY_IS_APPROX(w[i], y);\n  }\n  v[5] = x;\n  w[6] = v[5];\n  VERIFY_IS_APPROX(w[6], v[5]);\n  v = w;\n  for(int i = 0; i < 20; i++)\n  {\n    VERIFY_IS_APPROX(w[i], v[i]);\n  }\n\n  v.resize(21);\n  v[20] = x;\n  VERIFY_IS_APPROX(v[20], x);\n  v.fill(y,22);\n  VERIFY_IS_APPROX(v[21], y);\n  v.push_back(x);\n  VERIFY_IS_APPROX(v[22], x);\n  VERIFY((size_t)&(v[22]) == (size_t)&(v[21]) + sizeof(MatrixType));\n\n  // do a lot of push_back such that the vector gets internally resized\n  // (with memory reallocation)\n  MatrixType* ref = &w[0];\n  for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i)\n    v.push_back(w[i%w.size()]);\n  for(int i=23; i<v.size(); ++i)\n  {\n    VERIFY(v[i]==w[(i-23)%w.size()]);\n  }\n}\n\ntemplate<typename TransformType>\nvoid check_qtvector_transform(const TransformType&)\n{\n  typedef typename TransformType::MatrixType MatrixType;\n  TransformType x(MatrixType::Random()), y(MatrixType::Random());\n  QVector<TransformType> v(10), w(20, y);\n  v[5] = x;\n  w[6] = v[5];\n  VERIFY_IS_APPROX(w[6], v[5]);\n  v = w;\n  for(int i = 0; i < 20; i++)\n  {\n    VERIFY_IS_APPROX(w[i], v[i]);\n  }\n\n  v.resize(21);\n  v[20] = x;\n  VERIFY_IS_APPROX(v[20], x);\n  v.fill(y,22);\n  VERIFY_IS_APPROX(v[21], y);\n  v.push_back(x);\n  VERIFY_IS_APPROX(v[22], x);\n  VERIFY((size_t)&(v[22]) == (size_t)&(v[21]) + sizeof(TransformType));\n\n  // do a lot of push_back such that the vector gets internally resized\n  // (with memory reallocation)\n  TransformType* ref = &w[0];\n  for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i)\n    v.push_back(w[i%w.size()]);\n  for(unsigned int i=23; int(i)<v.size(); ++i)\n  {\n    VERIFY(v[i].matrix()==w[(i-23)%w.size()].matrix());\n  }\n}\n\ntemplate<typename QuaternionType>\nvoid check_qtvector_quaternion(const QuaternionType&)\n{\n  typedef typename QuaternionType::Coefficients Coefficients;\n  QuaternionType x(Coefficients::Random()), y(Coefficients::Random());\n  QVector<QuaternionType> v(10), w(20, y);\n  v[5] = x;\n  w[6] = v[5];\n  VERIFY_IS_APPROX(w[6], v[5]);\n  v = w;\n  for(int i = 0; i < 20; i++)\n  {\n    VERIFY_IS_APPROX(w[i], v[i]);\n  }\n\n  v.resize(21);\n  v[20] = x;\n  VERIFY_IS_APPROX(v[20], x);\n  v.fill(y,22);\n  VERIFY_IS_APPROX(v[21], y);\n  v.push_back(x);\n  VERIFY_IS_APPROX(v[22], x);\n  VERIFY((size_t)&(v[22]) == (size_t)&(v[21]) + sizeof(QuaternionType));\n\n  // do a lot of push_back such that the vector gets internally resized\n  // (with memory reallocation)\n  QuaternionType* ref = &w[0];\n  for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i)\n    v.push_back(w[i%w.size()]);\n  for(unsigned int i=23; int(i)<v.size(); ++i)\n  {\n    VERIFY(v[i].coeffs()==w[(i-23)%w.size()].coeffs());\n  }\n}\n\nvoid test_eigen2_qtvector()\n{\n  // some non vectorizable fixed sizes\n  CALL_SUBTEST_1(check_qtvector_matrix(Vector2f()));\n  CALL_SUBTEST_1(check_qtvector_matrix(Matrix3f()));\n  CALL_SUBTEST_1(check_qtvector_matrix(Matrix3d()));\n\n  // some vectorizable fixed sizes\n  CALL_SUBTEST_2(check_qtvector_matrix(Matrix2f()));\n  CALL_SUBTEST_2(check_qtvector_matrix(Vector4f()));\n  CALL_SUBTEST_2(check_qtvector_matrix(Matrix4f()));\n  CALL_SUBTEST_2(check_qtvector_matrix(Matrix4d()));\n\n  // some dynamic sizes\n  CALL_SUBTEST_3(check_qtvector_matrix(MatrixXd(1,1)));\n  CALL_SUBTEST_3(check_qtvector_matrix(VectorXd(20)));\n  CALL_SUBTEST_3(check_qtvector_matrix(RowVectorXf(20)));\n  CALL_SUBTEST_3(check_qtvector_matrix(MatrixXcf(10,10)));\n\n  // some Transform\n  CALL_SUBTEST_4(check_qtvector_transform(Transform2f()));\n  CALL_SUBTEST_4(check_qtvector_transform(Transform3f()));\n  CALL_SUBTEST_4(check_qtvector_transform(Transform3d()));\n  //CALL_SUBTEST_4(check_qtvector_transform(Transform4d()));\n\n  // some Quaternion\n  CALL_SUBTEST_5(check_qtvector_quaternion(Quaternionf()));\n  CALL_SUBTEST_5(check_qtvector_quaternion(Quaternionf()));\n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_regression.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <Eigen/LeastSquares>\n\ntemplate<typename VectorType,\n         typename HyperplaneType>\nvoid makeNoisyCohyperplanarPoints(int numPoints,\n                                  VectorType **points,\n                                  HyperplaneType *hyperplane,\n                                  typename VectorType::Scalar noiseAmplitude)\n{\n  typedef typename VectorType::Scalar Scalar;\n  const int size = points[0]->size();\n  // pick a random hyperplane, store the coefficients of its equation\n  hyperplane->coeffs().resize(size + 1);\n  for(int j = 0; j < size + 1; j++)\n  {\n    do {\n      hyperplane->coeffs().coeffRef(j) = ei_random<Scalar>();\n    } while(ei_abs(hyperplane->coeffs().coeff(j)) < 0.5);\n  }\n\n  // now pick numPoints random points on this hyperplane\n  for(int i = 0; i < numPoints; i++)\n  {\n    VectorType& cur_point = *(points[i]);\n    do\n    {\n      cur_point = VectorType::Random(size)/*.normalized()*/;\n      // project cur_point onto the hyperplane\n      Scalar x = - (hyperplane->coeffs().start(size).cwise()*cur_point).sum();\n      cur_point *= hyperplane->coeffs().coeff(size) / x;\n    } while( cur_point.norm() < 0.5\n          || cur_point.norm() > 2.0 );\n  }\n\n  // add some noise to these points\n  for(int i = 0; i < numPoints; i++ )\n    *(points[i]) += noiseAmplitude * VectorType::Random(size);\n}\n\ntemplate<typename VectorType>\nvoid check_linearRegression(int numPoints,\n                            VectorType **points,\n                            const VectorType& original,\n                            typename VectorType::Scalar tolerance)\n{\n  int size = points[0]->size();\n  assert(size==2);\n  VectorType result(size);\n  linearRegression(numPoints, points, &result, 1);\n  typename VectorType::Scalar error = (result - original).norm() / original.norm();\n  VERIFY(ei_abs(error) < ei_abs(tolerance));\n}\n\ntemplate<typename VectorType,\n         typename HyperplaneType>\nvoid check_fitHyperplane(int numPoints,\n                         VectorType **points,\n                         const HyperplaneType& original,\n                         typename VectorType::Scalar tolerance)\n{\n  int size = points[0]->size();\n  HyperplaneType result(size);\n  fitHyperplane(numPoints, points, &result);\n  result.coeffs() *= original.coeffs().coeff(size)/result.coeffs().coeff(size);\n  typename VectorType::Scalar error = (result.coeffs() - original.coeffs()).norm() / original.coeffs().norm();\n  std::cout << ei_abs(error) << \"  xxx   \" << ei_abs(tolerance) << std::endl;\n  VERIFY(ei_abs(error) < ei_abs(tolerance));\n}\n\nvoid test_eigen2_regression()\n{\n  for(int i = 0; i < g_repeat; i++)\n  {\n#ifdef EIGEN_TEST_PART_1\n    {\n      Vector2f points2f [1000];\n      Vector2f *points2f_ptrs [1000];\n      for(int i = 0; i < 1000; i++) points2f_ptrs[i] = &(points2f[i]);\n      Vector2f coeffs2f;\n      Hyperplane<float,2> coeffs3f;\n      makeNoisyCohyperplanarPoints(1000, points2f_ptrs, &coeffs3f, 0.01f);\n      coeffs2f[0] = -coeffs3f.coeffs()[0]/coeffs3f.coeffs()[1];\n      coeffs2f[1] = -coeffs3f.coeffs()[2]/coeffs3f.coeffs()[1];\n      CALL_SUBTEST(check_linearRegression(10, points2f_ptrs, coeffs2f, 0.05f));\n      CALL_SUBTEST(check_linearRegression(100, points2f_ptrs, coeffs2f, 0.01f));\n      CALL_SUBTEST(check_linearRegression(1000, points2f_ptrs, coeffs2f, 0.002f));\n    }\n#endif\n#ifdef EIGEN_TEST_PART_2\n    {\n      Vector2f points2f [1000];\n      Vector2f *points2f_ptrs [1000];\n      for(int i = 0; i < 1000; i++) points2f_ptrs[i] = &(points2f[i]);\n      Hyperplane<float,2> coeffs3f;\n      makeNoisyCohyperplanarPoints(1000, points2f_ptrs, &coeffs3f, 0.01f);\n      CALL_SUBTEST(check_fitHyperplane(10, points2f_ptrs, coeffs3f, 0.05f));\n      CALL_SUBTEST(check_fitHyperplane(100, points2f_ptrs, coeffs3f, 0.01f));\n      CALL_SUBTEST(check_fitHyperplane(1000, points2f_ptrs, coeffs3f, 0.002f));\n    }\n#endif\n#ifdef EIGEN_TEST_PART_3\n    {\n      Vector4d points4d [1000];\n      Vector4d *points4d_ptrs [1000];\n      for(int i = 0; i < 1000; i++) points4d_ptrs[i] = &(points4d[i]);\n      Hyperplane<double,4> coeffs5d;\n      makeNoisyCohyperplanarPoints(1000, points4d_ptrs, &coeffs5d, 0.01);\n      CALL_SUBTEST(check_fitHyperplane(10, points4d_ptrs, coeffs5d, 0.05));\n      CALL_SUBTEST(check_fitHyperplane(100, points4d_ptrs, coeffs5d, 0.01));\n      CALL_SUBTEST(check_fitHyperplane(1000, points4d_ptrs, coeffs5d, 0.002));\n    }\n#endif\n#ifdef EIGEN_TEST_PART_4\n    {\n      VectorXcd *points11cd_ptrs[1000];\n      for(int i = 0; i < 1000; i++) points11cd_ptrs[i] = new VectorXcd(11);\n      Hyperplane<std::complex<double>,Dynamic> *coeffs12cd = new Hyperplane<std::complex<double>,Dynamic>(11);\n      makeNoisyCohyperplanarPoints(1000, points11cd_ptrs, coeffs12cd, 0.01);\n      CALL_SUBTEST(check_fitHyperplane(100, points11cd_ptrs, *coeffs12cd, 0.025));\n      CALL_SUBTEST(check_fitHyperplane(1000, points11cd_ptrs, *coeffs12cd, 0.006));\n      delete coeffs12cd;\n      for(int i = 0; i < 1000; i++) delete points11cd_ptrs[i];\n    }\n#endif\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_sizeof.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\ntemplate<typename MatrixType> void verifySizeOf(const MatrixType&)\n{\n  typedef typename MatrixType::Scalar Scalar;\n  if (MatrixType::RowsAtCompileTime!=Dynamic && MatrixType::ColsAtCompileTime!=Dynamic)\n    VERIFY(sizeof(MatrixType)==sizeof(Scalar)*MatrixType::SizeAtCompileTime);\n  else\n    VERIFY(sizeof(MatrixType)==sizeof(Scalar*) + 2 * sizeof(typename MatrixType::Index));\n}\n\nvoid test_eigen2_sizeof()\n{\n  CALL_SUBTEST( verifySizeOf(Matrix<float, 1, 1>()) );\n  CALL_SUBTEST( verifySizeOf(Matrix4d()) );\n  CALL_SUBTEST( verifySizeOf(Matrix<double, 4, 2>()) );\n  CALL_SUBTEST( verifySizeOf(Matrix<bool, 7, 5>()) );\n  CALL_SUBTEST( verifySizeOf(MatrixXcf(3, 3)) );\n  CALL_SUBTEST( verifySizeOf(MatrixXi(8, 12)) );\n  CALL_SUBTEST( verifySizeOf(MatrixXcd(20, 20)) );\n  CALL_SUBTEST( verifySizeOf(Matrix<float, 100, 100>()) );\n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_smallvectors.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\ntemplate<typename Scalar> void smallVectors()\n{\n  typedef Matrix<Scalar, 1, 2> V2;\n  typedef Matrix<Scalar, 3, 1> V3;\n  typedef Matrix<Scalar, 1, 4> V4;\n  Scalar x1 = ei_random<Scalar>(),\n         x2 = ei_random<Scalar>(),\n         x3 = ei_random<Scalar>(),\n         x4 = ei_random<Scalar>();\n  V2 v2(x1, x2);\n  V3 v3(x1, x2, x3);\n  V4 v4(x1, x2, x3, x4);\n  VERIFY_IS_APPROX(x1, v2.x());\n  VERIFY_IS_APPROX(x1, v3.x());\n  VERIFY_IS_APPROX(x1, v4.x());\n  VERIFY_IS_APPROX(x2, v2.y());\n  VERIFY_IS_APPROX(x2, v3.y());\n  VERIFY_IS_APPROX(x2, v4.y());\n  VERIFY_IS_APPROX(x3, v3.z());\n  VERIFY_IS_APPROX(x3, v4.z());\n  VERIFY_IS_APPROX(x4, v4.w());\n}\n\nvoid test_eigen2_smallvectors()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST( smallVectors<int>() );\n    CALL_SUBTEST( smallVectors<float>() );\n    CALL_SUBTEST( smallVectors<double>() );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_sparse_basic.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2008 Daniel Gomez Ferro <dgomezferro@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"sparse.h\"\n\ntemplate<typename SetterType,typename DenseType, typename Scalar, int Options>\nbool test_random_setter(SparseMatrix<Scalar,Options>& sm, const DenseType& ref, const std::vector<Vector2i>& nonzeroCoords)\n{\n  typedef SparseMatrix<Scalar,Options> SparseType;\n  {\n    sm.setZero();\n    SetterType w(sm);\n    std::vector<Vector2i> remaining = nonzeroCoords;\n    while(!remaining.empty())\n    {\n      int i = ei_random<int>(0,remaining.size()-1);\n      w(remaining[i].x(),remaining[i].y()) = ref.coeff(remaining[i].x(),remaining[i].y());\n      remaining[i] = remaining.back();\n      remaining.pop_back();\n    }\n  }\n  return sm.isApprox(ref);\n}\n\ntemplate<typename SetterType,typename DenseType, typename T>\nbool test_random_setter(DynamicSparseMatrix<T>& sm, const DenseType& ref, const std::vector<Vector2i>& nonzeroCoords)\n{\n  sm.setZero();\n  std::vector<Vector2i> remaining = nonzeroCoords;\n  while(!remaining.empty())\n  {\n    int i = ei_random<int>(0,remaining.size()-1);\n    sm.coeffRef(remaining[i].x(),remaining[i].y()) = ref.coeff(remaining[i].x(),remaining[i].y());\n    remaining[i] = remaining.back();\n    remaining.pop_back();\n  }\n  return sm.isApprox(ref);\n}\n\ntemplate<typename SparseMatrixType> void sparse_basic(const SparseMatrixType& ref)\n{\n  const int rows = ref.rows();\n  const int cols = ref.cols();\n  typedef typename SparseMatrixType::Scalar Scalar;\n  enum { Flags = SparseMatrixType::Flags };\n  \n  double density = std::max(8./(rows*cols), 0.01);\n  typedef Matrix<Scalar,Dynamic,Dynamic> DenseMatrix;\n  typedef Matrix<Scalar,Dynamic,1> DenseVector;\n  Scalar eps = 1e-6;\n\n  SparseMatrixType m(rows, cols);\n  DenseMatrix refMat = DenseMatrix::Zero(rows, cols);\n  DenseVector vec1 = DenseVector::Random(rows);\n  Scalar s1 = ei_random<Scalar>();\n\n  std::vector<Vector2i> zeroCoords;\n  std::vector<Vector2i> nonzeroCoords;\n  initSparse<Scalar>(density, refMat, m, 0, &zeroCoords, &nonzeroCoords);\n  \n  if (zeroCoords.size()==0 || nonzeroCoords.size()==0)\n    return;\n\n  // test coeff and coeffRef\n  for (int i=0; i<(int)zeroCoords.size(); ++i)\n  {\n    VERIFY_IS_MUCH_SMALLER_THAN( m.coeff(zeroCoords[i].x(),zeroCoords[i].y()), eps );\n    if(ei_is_same_type<SparseMatrixType,SparseMatrix<Scalar,Flags> >::ret)\n      VERIFY_RAISES_ASSERT( m.coeffRef(zeroCoords[0].x(),zeroCoords[0].y()) = 5 );\n  }\n  VERIFY_IS_APPROX(m, refMat);\n\n  m.coeffRef(nonzeroCoords[0].x(), nonzeroCoords[0].y()) = Scalar(5);\n  refMat.coeffRef(nonzeroCoords[0].x(), nonzeroCoords[0].y()) = Scalar(5);\n\n  VERIFY_IS_APPROX(m, refMat);\n  /*\n  // test InnerIterators and Block expressions\n  for (int t=0; t<10; ++t)\n  {\n    int j = ei_random<int>(0,cols-1);\n    int i = ei_random<int>(0,rows-1);\n    int w = ei_random<int>(1,cols-j-1);\n    int h = ei_random<int>(1,rows-i-1);\n\n//     VERIFY_IS_APPROX(m.block(i,j,h,w), refMat.block(i,j,h,w));\n    for(int c=0; c<w; c++)\n    {\n      VERIFY_IS_APPROX(m.block(i,j,h,w).col(c), refMat.block(i,j,h,w).col(c));\n      for(int r=0; r<h; r++)\n      {\n//         VERIFY_IS_APPROX(m.block(i,j,h,w).col(c).coeff(r), refMat.block(i,j,h,w).col(c).coeff(r));\n      }\n    }\n//     for(int r=0; r<h; r++)\n//     {\n//       VERIFY_IS_APPROX(m.block(i,j,h,w).row(r), refMat.block(i,j,h,w).row(r));\n//       for(int c=0; c<w; c++)\n//       {\n//         VERIFY_IS_APPROX(m.block(i,j,h,w).row(r).coeff(c), refMat.block(i,j,h,w).row(r).coeff(c));\n//       }\n//     }\n  }\n\n  for(int c=0; c<cols; c++)\n  {\n    VERIFY_IS_APPROX(m.col(c) + m.col(c), (m + m).col(c));\n    VERIFY_IS_APPROX(m.col(c) + m.col(c), refMat.col(c) + refMat.col(c));\n  }\n\n  for(int r=0; r<rows; r++)\n  {\n    VERIFY_IS_APPROX(m.row(r) + m.row(r), (m + m).row(r));\n    VERIFY_IS_APPROX(m.row(r) + m.row(r), refMat.row(r) + refMat.row(r));\n  }\n  */\n\n  // test SparseSetters\n  // coherent setter\n  // TODO extend the MatrixSetter\n//   {\n//     m.setZero();\n//     VERIFY_IS_NOT_APPROX(m, refMat);\n//     SparseSetter<SparseMatrixType, FullyCoherentAccessPattern> w(m);\n//     for (int i=0; i<nonzeroCoords.size(); ++i)\n//     {\n//       w->coeffRef(nonzeroCoords[i].x(),nonzeroCoords[i].y()) = refMat.coeff(nonzeroCoords[i].x(),nonzeroCoords[i].y());\n//     }\n//   }\n//   VERIFY_IS_APPROX(m, refMat);\n\n  // random setter\n//   {\n//     m.setZero();\n//     VERIFY_IS_NOT_APPROX(m, refMat);\n//     SparseSetter<SparseMatrixType, RandomAccessPattern> w(m);\n//     std::vector<Vector2i> remaining = nonzeroCoords;\n//     while(!remaining.empty())\n//     {\n//       int i = ei_random<int>(0,remaining.size()-1);\n//       w->coeffRef(remaining[i].x(),remaining[i].y()) = refMat.coeff(remaining[i].x(),remaining[i].y());\n//       remaining[i] = remaining.back();\n//       remaining.pop_back();\n//     }\n//   }\n//   VERIFY_IS_APPROX(m, refMat);\n\n    VERIFY(( test_random_setter<RandomSetter<SparseMatrixType, StdMapTraits> >(m,refMat,nonzeroCoords) ));\n    #ifdef EIGEN_UNORDERED_MAP_SUPPORT\n    VERIFY(( test_random_setter<RandomSetter<SparseMatrixType, StdUnorderedMapTraits> >(m,refMat,nonzeroCoords) ));\n    #endif\n    #ifdef _DENSE_HASH_MAP_H_\n    VERIFY(( test_random_setter<RandomSetter<SparseMatrixType, GoogleDenseHashMapTraits> >(m,refMat,nonzeroCoords) ));\n    #endif\n    #ifdef _SPARSE_HASH_MAP_H_\n    VERIFY(( test_random_setter<RandomSetter<SparseMatrixType, GoogleSparseHashMapTraits> >(m,refMat,nonzeroCoords) ));\n    #endif\n\n    // test fillrand\n    {\n      DenseMatrix m1(rows,cols);\n      m1.setZero();\n      SparseMatrixType m2(rows,cols);\n      m2.startFill();\n      for (int j=0; j<cols; ++j)\n      {\n        for (int k=0; k<rows/2; ++k)\n        {\n          int i = ei_random<int>(0,rows-1);\n          if (m1.coeff(i,j)==Scalar(0))\n            m2.fillrand(i,j) = m1(i,j) = ei_random<Scalar>();\n        }\n      }\n      m2.endFill();\n      VERIFY_IS_APPROX(m2,m1);\n    }\n  \n  // test RandomSetter\n  /*{\n    SparseMatrixType m1(rows,cols), m2(rows,cols);\n    DenseMatrix refM1 = DenseMatrix::Zero(rows, rows);\n    initSparse<Scalar>(density, refM1, m1);\n    {\n      Eigen::RandomSetter<SparseMatrixType > setter(m2);\n      for (int j=0; j<m1.outerSize(); ++j)\n        for (typename SparseMatrixType::InnerIterator i(m1,j); i; ++i)\n          setter(i.index(), j) = i.value();\n    }\n    VERIFY_IS_APPROX(m1, m2);\n  }*/\n//   std::cerr << m.transpose() << \"\\n\\n\"  << refMat.transpose() << \"\\n\\n\";\n//   VERIFY_IS_APPROX(m, refMat);\n\n  // test basic computations\n  {\n    DenseMatrix refM1 = DenseMatrix::Zero(rows, rows);\n    DenseMatrix refM2 = DenseMatrix::Zero(rows, rows);\n    DenseMatrix refM3 = DenseMatrix::Zero(rows, rows);\n    DenseMatrix refM4 = DenseMatrix::Zero(rows, rows);\n    SparseMatrixType m1(rows, rows);\n    SparseMatrixType m2(rows, rows);\n    SparseMatrixType m3(rows, rows);\n    SparseMatrixType m4(rows, rows);\n    initSparse<Scalar>(density, refM1, m1);\n    initSparse<Scalar>(density, refM2, m2);\n    initSparse<Scalar>(density, refM3, m3);\n    initSparse<Scalar>(density, refM4, m4);\n\n    VERIFY_IS_APPROX(m1+m2, refM1+refM2);\n    VERIFY_IS_APPROX(m1+m2+m3, refM1+refM2+refM3);\n    VERIFY_IS_APPROX(m3.cwise()*(m1+m2), refM3.cwise()*(refM1+refM2));\n    VERIFY_IS_APPROX(m1*s1-m2, refM1*s1-refM2);\n\n    VERIFY_IS_APPROX(m1*=s1, refM1*=s1);\n    VERIFY_IS_APPROX(m1/=s1, refM1/=s1);\n    \n    VERIFY_IS_APPROX(m1+=m2, refM1+=refM2);\n    VERIFY_IS_APPROX(m1-=m2, refM1-=refM2);\n    \n    VERIFY_IS_APPROX(m1.col(0).eigen2_dot(refM2.row(0)), refM1.col(0).eigen2_dot(refM2.row(0)));\n    \n    refM4.setRandom();\n    // sparse cwise* dense\n    VERIFY_IS_APPROX(m3.cwise()*refM4, refM3.cwise()*refM4);\n//     VERIFY_IS_APPROX(m3.cwise()/refM4, refM3.cwise()/refM4);\n  }\n\n  // test innerVector()\n  {\n    DenseMatrix refMat2 = DenseMatrix::Zero(rows, rows);\n    SparseMatrixType m2(rows, rows);\n    initSparse<Scalar>(density, refMat2, m2);\n    int j0 = ei_random(0,rows-1);\n    int j1 = ei_random(0,rows-1);\n    VERIFY_IS_APPROX(m2.innerVector(j0), refMat2.col(j0));\n    VERIFY_IS_APPROX(m2.innerVector(j0)+m2.innerVector(j1), refMat2.col(j0)+refMat2.col(j1));\n    //m2.innerVector(j0) = 2*m2.innerVector(j1);\n    //refMat2.col(j0) = 2*refMat2.col(j1);\n    //VERIFY_IS_APPROX(m2, refMat2);\n  }\n  \n  // test innerVectors()\n  {\n    DenseMatrix refMat2 = DenseMatrix::Zero(rows, rows);\n    SparseMatrixType m2(rows, rows);\n    initSparse<Scalar>(density, refMat2, m2);\n    int j0 = ei_random(0,rows-2);\n    int j1 = ei_random(0,rows-2);\n    int n0 = ei_random<int>(1,rows-std::max(j0,j1));\n    VERIFY_IS_APPROX(m2.innerVectors(j0,n0), refMat2.block(0,j0,rows,n0));\n    VERIFY_IS_APPROX(m2.innerVectors(j0,n0)+m2.innerVectors(j1,n0),\n                     refMat2.block(0,j0,rows,n0)+refMat2.block(0,j1,rows,n0));\n    //m2.innerVectors(j0,n0) = m2.innerVectors(j0,n0) + m2.innerVectors(j1,n0);\n    //refMat2.block(0,j0,rows,n0) = refMat2.block(0,j0,rows,n0) + refMat2.block(0,j1,rows,n0);\n  }\n\n  // test transpose\n  {\n    DenseMatrix refMat2 = DenseMatrix::Zero(rows, rows);\n    SparseMatrixType m2(rows, rows);\n    initSparse<Scalar>(density, refMat2, m2);\n    VERIFY_IS_APPROX(m2.transpose().eval(), refMat2.transpose().eval());\n    VERIFY_IS_APPROX(m2.transpose(), refMat2.transpose());\n  }\n  \n  // test prune\n  {\n    SparseMatrixType m2(rows, rows);\n    DenseMatrix refM2(rows, rows);\n    refM2.setZero();\n    int countFalseNonZero = 0;\n    int countTrueNonZero = 0;\n    m2.startFill();\n    for (int j=0; j<m2.outerSize(); ++j)\n      for (int i=0; i<m2.innerSize(); ++i)\n      {\n        float x = ei_random<float>(0,1);\n        if (x<0.1)\n        {\n          // do nothing\n        }\n        else if (x<0.5)\n        {\n          countFalseNonZero++;\n          m2.fill(i,j) = Scalar(0);\n        }\n        else\n        {\n          countTrueNonZero++;\n          m2.fill(i,j) = refM2(i,j) = Scalar(1);\n        }\n      }\n    m2.endFill();\n    VERIFY(countFalseNonZero+countTrueNonZero == m2.nonZeros());\n    VERIFY_IS_APPROX(m2, refM2);\n    m2.prune(1);\n    VERIFY(countTrueNonZero==m2.nonZeros());\n    VERIFY_IS_APPROX(m2, refM2);\n  }\n}\n\nvoid test_eigen2_sparse_basic()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( sparse_basic(SparseMatrix<double>(8, 8)) );\n    CALL_SUBTEST_2( sparse_basic(SparseMatrix<std::complex<double> >(16, 16)) );\n    CALL_SUBTEST_1( sparse_basic(SparseMatrix<double>(33, 33)) );\n    \n    CALL_SUBTEST_3( sparse_basic(DynamicSparseMatrix<double>(8, 8)) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_sparse_product.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2008 Daniel Gomez Ferro <dgomezferro@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"sparse.h\"\n\ntemplate<typename SparseMatrixType> void sparse_product(const SparseMatrixType& ref)\n{\n  const int rows = ref.rows();\n  const int cols = ref.cols();\n  typedef typename SparseMatrixType::Scalar Scalar;\n  enum { Flags = SparseMatrixType::Flags };\n\n  double density = std::max(8./(rows*cols), 0.01);\n  typedef Matrix<Scalar,Dynamic,Dynamic> DenseMatrix;\n  typedef Matrix<Scalar,Dynamic,1> DenseVector;\n\n  // test matrix-matrix product\n  {\n    DenseMatrix refMat2 = DenseMatrix::Zero(rows, rows);\n    DenseMatrix refMat3 = DenseMatrix::Zero(rows, rows);\n    DenseMatrix refMat4 = DenseMatrix::Zero(rows, rows);\n    DenseMatrix dm4 = DenseMatrix::Zero(rows, rows);\n    SparseMatrixType m2(rows, rows);\n    SparseMatrixType m3(rows, rows);\n    SparseMatrixType m4(rows, rows);\n    initSparse<Scalar>(density, refMat2, m2);\n    initSparse<Scalar>(density, refMat3, m3);\n    initSparse<Scalar>(density, refMat4, m4);\n    VERIFY_IS_APPROX(m4=m2*m3, refMat4=refMat2*refMat3);\n    VERIFY_IS_APPROX(m4=m2.transpose()*m3, refMat4=refMat2.transpose()*refMat3);\n    VERIFY_IS_APPROX(m4=m2.transpose()*m3.transpose(), refMat4=refMat2.transpose()*refMat3.transpose());\n    VERIFY_IS_APPROX(m4=m2*m3.transpose(), refMat4=refMat2*refMat3.transpose());\n\n    // sparse * dense\n    VERIFY_IS_APPROX(dm4=m2*refMat3, refMat4=refMat2*refMat3);\n    VERIFY_IS_APPROX(dm4=m2*refMat3.transpose(), refMat4=refMat2*refMat3.transpose());\n    VERIFY_IS_APPROX(dm4=m2.transpose()*refMat3, refMat4=refMat2.transpose()*refMat3);\n    VERIFY_IS_APPROX(dm4=m2.transpose()*refMat3.transpose(), refMat4=refMat2.transpose()*refMat3.transpose());\n\n    // dense * sparse\n    VERIFY_IS_APPROX(dm4=refMat2*m3, refMat4=refMat2*refMat3);\n    VERIFY_IS_APPROX(dm4=refMat2*m3.transpose(), refMat4=refMat2*refMat3.transpose());\n    VERIFY_IS_APPROX(dm4=refMat2.transpose()*m3, refMat4=refMat2.transpose()*refMat3);\n    VERIFY_IS_APPROX(dm4=refMat2.transpose()*m3.transpose(), refMat4=refMat2.transpose()*refMat3.transpose());\n\n    VERIFY_IS_APPROX(m3=m3*m3, refMat3=refMat3*refMat3);\n  }\n\n  // test matrix - diagonal product\n  if(false) // it compiles, but the precision is terrible. probably doesn't matter in this branch....\n  {\n    DenseMatrix refM2 = DenseMatrix::Zero(rows, rows);\n    DenseMatrix refM3 = DenseMatrix::Zero(rows, rows);\n    DiagonalMatrix<DenseVector> d1(DenseVector::Random(rows));\n    SparseMatrixType m2(rows, rows);\n    SparseMatrixType m3(rows, rows);\n    initSparse<Scalar>(density, refM2, m2);\n    initSparse<Scalar>(density, refM3, m3);\n    VERIFY_IS_APPROX(m3=m2*d1, refM3=refM2*d1);\n    VERIFY_IS_APPROX(m3=m2.transpose()*d1, refM3=refM2.transpose()*d1);\n    VERIFY_IS_APPROX(m3=d1*m2, refM3=d1*refM2);\n    VERIFY_IS_APPROX(m3=d1*m2.transpose(), refM3=d1 * refM2.transpose());\n  }\n\n  // test self adjoint products\n  {\n    DenseMatrix b = DenseMatrix::Random(rows, rows);\n    DenseMatrix x = DenseMatrix::Random(rows, rows);\n    DenseMatrix refX = DenseMatrix::Random(rows, rows);\n    DenseMatrix refUp = DenseMatrix::Zero(rows, rows);\n    DenseMatrix refLo = DenseMatrix::Zero(rows, rows);\n    DenseMatrix refS = DenseMatrix::Zero(rows, rows);\n    SparseMatrixType mUp(rows, rows);\n    SparseMatrixType mLo(rows, rows);\n    SparseMatrixType mS(rows, rows);\n    do {\n      initSparse<Scalar>(density, refUp, mUp, ForceRealDiag|/*ForceNonZeroDiag|*/MakeUpperTriangular);\n    } while (refUp.isZero());\n    refLo = refUp.transpose().conjugate();\n    mLo = mUp.transpose().conjugate();\n    refS = refUp + refLo;\n    refS.diagonal() *= 0.5;\n    mS = mUp + mLo;\n    for (int k=0; k<mS.outerSize(); ++k)\n      for (typename SparseMatrixType::InnerIterator it(mS,k); it; ++it)\n        if (it.index() == k)\n          it.valueRef() *= 0.5;\n\n    VERIFY_IS_APPROX(refS.adjoint(), refS);\n    VERIFY_IS_APPROX(mS.transpose().conjugate(), mS);\n    VERIFY_IS_APPROX(mS, refS);\n    VERIFY_IS_APPROX(x=mS*b, refX=refS*b);\n    VERIFY_IS_APPROX(x=mUp.template marked<UpperTriangular|SelfAdjoint>()*b, refX=refS*b);\n    VERIFY_IS_APPROX(x=mLo.template marked<LowerTriangular|SelfAdjoint>()*b, refX=refS*b);\n    VERIFY_IS_APPROX(x=mS.template marked<SelfAdjoint>()*b, refX=refS*b);\n  }\n\n}\n\nvoid test_eigen2_sparse_product()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( sparse_product(SparseMatrix<double>(8, 8)) );\n    CALL_SUBTEST_2( sparse_product(SparseMatrix<std::complex<double> >(16, 16)) );\n    CALL_SUBTEST_1( sparse_product(SparseMatrix<double>(33, 33)) );\n\n    CALL_SUBTEST_3( sparse_product(DynamicSparseMatrix<double>(8, 8)) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_sparse_solvers.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2008 Daniel Gomez Ferro <dgomezferro@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"sparse.h\"\n\ntemplate<typename Scalar> void\ninitSPD(double density,\n        Matrix<Scalar,Dynamic,Dynamic>& refMat,\n        SparseMatrix<Scalar>& sparseMat)\n{\n  Matrix<Scalar,Dynamic,Dynamic> aux(refMat.rows(),refMat.cols());\n  initSparse(density,refMat,sparseMat);\n  refMat = refMat * refMat.adjoint();\n  for (int k=0; k<2; ++k)\n  {\n    initSparse(density,aux,sparseMat,ForceNonZeroDiag);\n    refMat += aux * aux.adjoint();\n  }\n  sparseMat.startFill();\n  for (int j=0 ; j<sparseMat.cols(); ++j)\n    for (int i=j ; i<sparseMat.rows(); ++i)\n      if (refMat(i,j)!=Scalar(0))\n        sparseMat.fill(i,j) = refMat(i,j);\n  sparseMat.endFill();\n}\n\ntemplate<typename Scalar> void sparse_solvers(int rows, int cols)\n{\n  double density = std::max(8./(rows*cols), 0.01);\n  typedef Matrix<Scalar,Dynamic,Dynamic> DenseMatrix;\n  typedef Matrix<Scalar,Dynamic,1> DenseVector;\n  // Scalar eps = 1e-6;\n\n  DenseVector vec1 = DenseVector::Random(rows);\n\n  std::vector<Vector2i> zeroCoords;\n  std::vector<Vector2i> nonzeroCoords;\n\n  // test triangular solver\n  {\n    DenseVector vec2 = vec1, vec3 = vec1;\n    SparseMatrix<Scalar> m2(rows, cols);\n    DenseMatrix refMat2 = DenseMatrix::Zero(rows, cols);\n\n    // lower\n    initSparse<Scalar>(density, refMat2, m2, ForceNonZeroDiag|MakeLowerTriangular, &zeroCoords, &nonzeroCoords);\n    VERIFY_IS_APPROX(refMat2.template marked<LowerTriangular>().solveTriangular(vec2),\n                     m2.template marked<LowerTriangular>().solveTriangular(vec3));\n\n    // lower - transpose\n    initSparse<Scalar>(density, refMat2, m2, ForceNonZeroDiag|MakeLowerTriangular, &zeroCoords, &nonzeroCoords);\n    VERIFY_IS_APPROX(refMat2.template marked<LowerTriangular>().transpose().solveTriangular(vec2),\n                     m2.template marked<LowerTriangular>().transpose().solveTriangular(vec3));\n\n    // upper\n    initSparse<Scalar>(density, refMat2, m2, ForceNonZeroDiag|MakeUpperTriangular, &zeroCoords, &nonzeroCoords);\n    VERIFY_IS_APPROX(refMat2.template marked<UpperTriangular>().solveTriangular(vec2),\n                     m2.template marked<UpperTriangular>().solveTriangular(vec3));\n\n    // upper - transpose\n    initSparse<Scalar>(density, refMat2, m2, ForceNonZeroDiag|MakeUpperTriangular, &zeroCoords, &nonzeroCoords);\n    VERIFY_IS_APPROX(refMat2.template marked<UpperTriangular>().transpose().solveTriangular(vec2),\n                     m2.template marked<UpperTriangular>().transpose().solveTriangular(vec3));\n  }\n\n  // test LLT\n  {\n    // TODO fix the issue with complex (see SparseLLT::solveInPlace)\n    SparseMatrix<Scalar> m2(rows, cols);\n    DenseMatrix refMat2(rows, cols);\n\n    DenseVector b = DenseVector::Random(cols);\n    DenseVector refX(cols), x(cols);\n\n    initSPD(density, refMat2, m2);\n\n    refMat2.llt().solve(b, &refX);\n    typedef SparseMatrix<Scalar,LowerTriangular|SelfAdjoint> SparseSelfAdjointMatrix;\n    if (!NumTraits<Scalar>::IsComplex)\n    {\n      x = b;\n      SparseLLT<SparseSelfAdjointMatrix> (m2).solveInPlace(x);\n      VERIFY(refX.isApprox(x,test_precision<Scalar>()) && \"LLT: default\");\n    }\n    #ifdef EIGEN_CHOLMOD_SUPPORT\n    x = b;\n    SparseLLT<SparseSelfAdjointMatrix,Cholmod>(m2).solveInPlace(x);\n    VERIFY(refX.isApprox(x,test_precision<Scalar>()) && \"LLT: cholmod\");\n    #endif\n    if (!NumTraits<Scalar>::IsComplex)\n    {\n      #ifdef EIGEN_TAUCS_SUPPORT\n      x = b;\n      SparseLLT<SparseSelfAdjointMatrix,Taucs>(m2,IncompleteFactorization).solveInPlace(x);\n      VERIFY(refX.isApprox(x,test_precision<Scalar>()) && \"LLT: taucs (IncompleteFactorization)\");\n      x = b;\n      SparseLLT<SparseSelfAdjointMatrix,Taucs>(m2,SupernodalMultifrontal).solveInPlace(x);\n      VERIFY(refX.isApprox(x,test_precision<Scalar>()) && \"LLT: taucs (SupernodalMultifrontal)\");\n      x = b;\n      SparseLLT<SparseSelfAdjointMatrix,Taucs>(m2,SupernodalLeftLooking).solveInPlace(x);\n      VERIFY(refX.isApprox(x,test_precision<Scalar>()) && \"LLT: taucs (SupernodalLeftLooking)\");\n      #endif\n    }\n  }\n\n  // test LDLT\n  if (!NumTraits<Scalar>::IsComplex)\n  {\n    // TODO fix the issue with complex (see SparseLDLT::solveInPlace)\n    SparseMatrix<Scalar> m2(rows, cols);\n    DenseMatrix refMat2(rows, cols);\n\n    DenseVector b = DenseVector::Random(cols);\n    DenseVector refX(cols), x(cols);\n\n    //initSPD(density, refMat2, m2);\n    initSparse<Scalar>(density, refMat2, m2, ForceNonZeroDiag|MakeUpperTriangular, 0, 0);\n    refMat2 += refMat2.adjoint();\n    refMat2.diagonal() *= 0.5;\n\n    refMat2.ldlt().solve(b, &refX);\n    typedef SparseMatrix<Scalar,UpperTriangular|SelfAdjoint> SparseSelfAdjointMatrix;\n    x = b;\n    SparseLDLT<SparseSelfAdjointMatrix> ldlt(m2);\n    if (ldlt.succeeded())\n      ldlt.solveInPlace(x);\n    VERIFY(refX.isApprox(x,test_precision<Scalar>()) && \"LDLT: default\");\n  }\n\n  // test LU\n  {\n    static int count = 0;\n    SparseMatrix<Scalar> m2(rows, cols);\n    DenseMatrix refMat2(rows, cols);\n\n    DenseVector b = DenseVector::Random(cols);\n    DenseVector refX(cols), x(cols);\n\n    initSparse<Scalar>(density, refMat2, m2, ForceNonZeroDiag, &zeroCoords, &nonzeroCoords);\n\n    LU<DenseMatrix> refLu(refMat2);\n    refLu.solve(b, &refX);\n    #if defined(EIGEN_SUPERLU_SUPPORT) || defined(EIGEN_UMFPACK_SUPPORT)\n    Scalar refDet = refLu.determinant();\n    #endif\n    x.setZero();\n    // // SparseLU<SparseMatrix<Scalar> > (m2).solve(b,&x);\n    // // VERIFY(refX.isApprox(x,test_precision<Scalar>()) && \"LU: default\");\n    #ifdef EIGEN_SUPERLU_SUPPORT\n    {\n      x.setZero();\n      SparseLU<SparseMatrix<Scalar>,SuperLU> slu(m2);\n      if (slu.succeeded())\n      {\n        if (slu.solve(b,&x)) {\n          VERIFY(refX.isApprox(x,test_precision<Scalar>()) && \"LU: SuperLU\");\n        }\n        // std::cerr << refDet << \" == \" << slu.determinant() << \"\\n\";\n        if (count==0) {\n          VERIFY_IS_APPROX(refDet,slu.determinant()); // FIXME det is not very stable for complex\n        }\n      }\n    }\n    #endif\n    #ifdef EIGEN_UMFPACK_SUPPORT\n    {\n      // check solve\n      x.setZero();\n      SparseLU<SparseMatrix<Scalar>,UmfPack> slu(m2);\n      if (slu.succeeded()) {\n        if (slu.solve(b,&x)) {\n          if (count==0) {\n            VERIFY(refX.isApprox(x,test_precision<Scalar>()) && \"LU: umfpack\");  // FIXME solve is not very stable for complex\n          }\n        }\n        VERIFY_IS_APPROX(refDet,slu.determinant());\n        // TODO check the extracted data\n        //std::cerr << slu.matrixL() << \"\\n\";\n      }\n    }\n    #endif\n    count++;\n  }\n\n}\n\nvoid test_eigen2_sparse_solvers()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( sparse_solvers<double>(8, 8) );\n    CALL_SUBTEST_2( sparse_solvers<std::complex<double> >(16, 16) );\n    CALL_SUBTEST_1( sparse_solvers<double>(101, 101) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_sparse_vector.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2008 Daniel Gomez Ferro <dgomezferro@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"sparse.h\"\n\ntemplate<typename Scalar> void sparse_vector(int rows, int cols)\n{\n  double densityMat = std::max(8./(rows*cols), 0.01);\n  double densityVec = std::max(8./float(rows), 0.1);\n  typedef Matrix<Scalar,Dynamic,Dynamic> DenseMatrix;\n  typedef Matrix<Scalar,Dynamic,1> DenseVector;\n  typedef SparseVector<Scalar> SparseVectorType;\n  typedef SparseMatrix<Scalar> SparseMatrixType;\n  Scalar eps = 1e-6;\n\n  SparseMatrixType m1(rows,cols);\n  SparseVectorType v1(rows), v2(rows), v3(rows);\n  DenseMatrix refM1 = DenseMatrix::Zero(rows, cols);\n  DenseVector refV1 = DenseVector::Random(rows),\n    refV2 = DenseVector::Random(rows),\n    refV3 = DenseVector::Random(rows);\n\n  std::vector<int> zerocoords, nonzerocoords;\n  initSparse<Scalar>(densityVec, refV1, v1, &zerocoords, &nonzerocoords);\n  initSparse<Scalar>(densityMat, refM1, m1);\n\n  initSparse<Scalar>(densityVec, refV2, v2);\n  initSparse<Scalar>(densityVec, refV3, v3);\n\n  Scalar s1 = ei_random<Scalar>();\n\n  // test coeff and coeffRef\n  for (unsigned int i=0; i<zerocoords.size(); ++i)\n  {\n    VERIFY_IS_MUCH_SMALLER_THAN( v1.coeff(zerocoords[i]), eps );\n    //VERIFY_RAISES_ASSERT( v1.coeffRef(zerocoords[i]) = 5 );\n  }\n  {\n    VERIFY(int(nonzerocoords.size()) == v1.nonZeros());\n    int j=0;\n    for (typename SparseVectorType::InnerIterator it(v1); it; ++it,++j)\n    {\n      VERIFY(nonzerocoords[j]==it.index());\n      VERIFY(it.value()==v1.coeff(it.index()));\n      VERIFY(it.value()==refV1.coeff(it.index()));\n    }\n  }\n  VERIFY_IS_APPROX(v1, refV1);\n\n  v1.coeffRef(nonzerocoords[0]) = Scalar(5);\n  refV1.coeffRef(nonzerocoords[0]) = Scalar(5);\n  VERIFY_IS_APPROX(v1, refV1);\n\n  VERIFY_IS_APPROX(v1+v2, refV1+refV2);\n  VERIFY_IS_APPROX(v1+v2+v3, refV1+refV2+refV3);\n\n  VERIFY_IS_APPROX(v1*s1-v2, refV1*s1-refV2);\n\n  VERIFY_IS_APPROX(v1*=s1, refV1*=s1);\n  VERIFY_IS_APPROX(v1/=s1, refV1/=s1);\n  \n  VERIFY_IS_APPROX(v1+=v2, refV1+=refV2);\n  VERIFY_IS_APPROX(v1-=v2, refV1-=refV2);\n\n  VERIFY_IS_APPROX(v1.eigen2_dot(v2), refV1.eigen2_dot(refV2));\n  VERIFY_IS_APPROX(v1.eigen2_dot(refV2), refV1.eigen2_dot(refV2));\n\n}\n\nvoid test_eigen2_sparse_vector()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( sparse_vector<double>(8, 8) );\n    CALL_SUBTEST_2( sparse_vector<std::complex<double> >(16, 16) );\n    CALL_SUBTEST_1( sparse_vector<double>(299, 535) );\n  }\n}\n\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_stdvector.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include <Eigen/StdVector>\n#include \"main.h\"\n#include <Eigen/Geometry>\n\ntemplate<typename MatrixType>\nvoid check_stdvector_matrix(const MatrixType& m)\n{\n  int rows = m.rows();\n  int cols = m.cols();\n  MatrixType x = MatrixType::Random(rows,cols), y = MatrixType::Random(rows,cols);\n  std::vector<MatrixType, aligned_allocator<MatrixType> > v(10, MatrixType(rows,cols)), w(20, y);\n  v[5] = x;\n  w[6] = v[5];\n  VERIFY_IS_APPROX(w[6], v[5]);\n  v = w;\n  for(int i = 0; i < 20; i++)\n  {\n    VERIFY_IS_APPROX(w[i], v[i]);\n  }\n\n  v.resize(21);\n  v[20] = x;\n  VERIFY_IS_APPROX(v[20], x);\n  v.resize(22,y);\n  VERIFY_IS_APPROX(v[21], y);\n  v.push_back(x);\n  VERIFY_IS_APPROX(v[22], x);\n  VERIFY((std::size_t)&(v[22]) == (std::size_t)&(v[21]) + sizeof(MatrixType));\n\n  // do a lot of push_back such that the vector gets internally resized\n  // (with memory reallocation)\n  MatrixType* ref = &w[0];\n  for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i)\n    v.push_back(w[i%w.size()]);\n  for(unsigned int i=23; i<v.size(); ++i)\n  {\n    VERIFY(v[i]==w[(i-23)%w.size()]);\n  }\n}\n\ntemplate<typename TransformType>\nvoid check_stdvector_transform(const TransformType&)\n{\n  typedef typename TransformType::MatrixType MatrixType;\n  TransformType x(MatrixType::Random()), y(MatrixType::Random());\n  std::vector<TransformType, aligned_allocator<TransformType> > v(10), w(20, y);\n  v[5] = x;\n  w[6] = v[5];\n  VERIFY_IS_APPROX(w[6], v[5]);\n  v = w;\n  for(int i = 0; i < 20; i++)\n  {\n    VERIFY_IS_APPROX(w[i], v[i]);\n  }\n\n  v.resize(21);\n  v[20] = x;\n  VERIFY_IS_APPROX(v[20], x);\n  v.resize(22,y);\n  VERIFY_IS_APPROX(v[21], y);\n  v.push_back(x);\n  VERIFY_IS_APPROX(v[22], x);\n  VERIFY((std::size_t)&(v[22]) == (std::size_t)&(v[21]) + sizeof(TransformType));\n\n  // do a lot of push_back such that the vector gets internally resized\n  // (with memory reallocation)\n  TransformType* ref = &w[0];\n  for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i)\n    v.push_back(w[i%w.size()]);\n  for(unsigned int i=23; i<v.size(); ++i)\n  {\n    VERIFY(v[i].matrix()==w[(i-23)%w.size()].matrix());\n  }\n}\n\ntemplate<typename QuaternionType>\nvoid check_stdvector_quaternion(const QuaternionType&)\n{\n  typedef typename QuaternionType::Coefficients Coefficients;\n  QuaternionType x(Coefficients::Random()), y(Coefficients::Random());\n  std::vector<QuaternionType, aligned_allocator<QuaternionType> > v(10), w(20, y);\n  v[5] = x;\n  w[6] = v[5];\n  VERIFY_IS_APPROX(w[6], v[5]);\n  v = w;\n  for(int i = 0; i < 20; i++)\n  {\n    VERIFY_IS_APPROX(w[i], v[i]);\n  }\n\n  v.resize(21);\n  v[20] = x;\n  VERIFY_IS_APPROX(v[20], x);\n  v.resize(22,y);\n  VERIFY_IS_APPROX(v[21], y);\n  v.push_back(x);\n  VERIFY_IS_APPROX(v[22], x);\n  VERIFY((std::size_t)&(v[22]) == (std::size_t)&(v[21]) + sizeof(QuaternionType));\n\n  // do a lot of push_back such that the vector gets internally resized\n  // (with memory reallocation)\n  QuaternionType* ref = &w[0];\n  for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i)\n    v.push_back(w[i%w.size()]);\n  for(unsigned int i=23; i<v.size(); ++i)\n  {\n    VERIFY(v[i].coeffs()==w[(i-23)%w.size()].coeffs());\n  }\n}\n\nvoid test_eigen2_stdvector()\n{\n  // some non vectorizable fixed sizes\n  CALL_SUBTEST_1(check_stdvector_matrix(Vector2f()));\n  CALL_SUBTEST_1(check_stdvector_matrix(Matrix3f()));\n  CALL_SUBTEST_1(check_stdvector_matrix(Matrix3d()));\n\n  // some vectorizable fixed sizes\n  CALL_SUBTEST_2(check_stdvector_matrix(Matrix2f()));\n  CALL_SUBTEST_2(check_stdvector_matrix(Vector4f()));\n  CALL_SUBTEST_2(check_stdvector_matrix(Matrix4f()));\n  CALL_SUBTEST_2(check_stdvector_matrix(Matrix4d()));\n\n  // some dynamic sizes\n  CALL_SUBTEST_3(check_stdvector_matrix(MatrixXd(1,1)));\n  CALL_SUBTEST_3(check_stdvector_matrix(VectorXd(20)));\n  CALL_SUBTEST_3(check_stdvector_matrix(RowVectorXf(20)));\n  CALL_SUBTEST_3(check_stdvector_matrix(MatrixXcf(10,10)));\n\n  // some Transform\n  CALL_SUBTEST_4(check_stdvector_transform(Transform2f()));\n  CALL_SUBTEST_4(check_stdvector_transform(Transform3f()));\n  CALL_SUBTEST_4(check_stdvector_transform(Transform3d()));\n  //CALL_SUBTEST_4(check_stdvector_transform(Transform4d()));\n\n  // some Quaternion\n  CALL_SUBTEST_5(check_stdvector_quaternion(Quaternionf()));\n  CALL_SUBTEST_5(check_stdvector_quaternion(Quaternionf()));\n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_submatrices.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\n// check minor separately in order to avoid the possible creation of a zero-sized\n// array. Comes from a compilation error with gcc-3.4 or gcc-4 with -ansi -pedantic.\n// Another solution would be to declare the array like this: T m_data[Size==0?1:Size]; in ei_matrix_storage\n// but this is probably not bad to raise such an error at compile time...\ntemplate<typename Scalar, int _Rows, int _Cols> struct CheckMinor\n{\n    typedef Matrix<Scalar, _Rows, _Cols> MatrixType;\n    CheckMinor(MatrixType& m1, int r1, int c1)\n    {\n        int rows = m1.rows();\n        int cols = m1.cols();\n\n        Matrix<Scalar, Dynamic, Dynamic> mi = m1.minor(0,0).eval();\n        VERIFY_IS_APPROX(mi, m1.block(1,1,rows-1,cols-1));\n        mi = m1.minor(r1,c1);\n        VERIFY_IS_APPROX(mi.transpose(), m1.transpose().minor(c1,r1));\n        //check operator(), both constant and non-constant, on minor()\n        m1.minor(r1,c1)(0,0) = m1.minor(0,0)(0,0);\n    }\n};\n\ntemplate<typename Scalar> struct CheckMinor<Scalar,1,1>\n{\n    typedef Matrix<Scalar, 1, 1> MatrixType;\n    CheckMinor(MatrixType&, int, int) {}\n};\n\ntemplate<typename MatrixType> void submatrices(const MatrixType& m)\n{\n  /* this test covers the following files:\n     Row.h Column.h Block.h Minor.h DiagonalCoeffs.h\n  */\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename MatrixType::RealScalar RealScalar;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> VectorType;\n  typedef Matrix<Scalar, 1, MatrixType::ColsAtCompileTime> RowVectorType;\n  int rows = m.rows();\n  int cols = m.cols();\n\n  MatrixType m1 = MatrixType::Random(rows, cols),\n             m2 = MatrixType::Random(rows, cols),\n             m3(rows, cols),\n             ones = MatrixType::Ones(rows, cols),\n             square = Matrix<Scalar, MatrixType::RowsAtCompileTime, MatrixType::RowsAtCompileTime>\n                              ::Random(rows, rows);\n  VectorType v1 = VectorType::Random(rows);\n\n  Scalar s1 = ei_random<Scalar>();\n\n  int r1 = ei_random<int>(0,rows-1);\n  int r2 = ei_random<int>(r1,rows-1);\n  int c1 = ei_random<int>(0,cols-1);\n  int c2 = ei_random<int>(c1,cols-1);\n\n  //check row() and col()\n  VERIFY_IS_APPROX(m1.col(c1).transpose(), m1.transpose().row(c1));\n  VERIFY_IS_APPROX(square.row(r1).eigen2_dot(m1.col(c1)), (square.lazy() * m1.conjugate())(r1,c1));\n  //check operator(), both constant and non-constant, on row() and col()\n  m1.row(r1) += s1 * m1.row(r2);\n  m1.col(c1) += s1 * m1.col(c2);\n\n  //check block()\n  Matrix<Scalar,Dynamic,Dynamic> b1(1,1); b1(0,0) = m1(r1,c1);\n  RowVectorType br1(m1.block(r1,0,1,cols));\n  VectorType bc1(m1.block(0,c1,rows,1));\n  VERIFY_IS_APPROX(b1, m1.block(r1,c1,1,1));\n  VERIFY_IS_APPROX(m1.row(r1), br1);\n  VERIFY_IS_APPROX(m1.col(c1), bc1);\n  //check operator(), both constant and non-constant, on block()\n  m1.block(r1,c1,r2-r1+1,c2-c1+1) = s1 * m2.block(0, 0, r2-r1+1,c2-c1+1);\n  m1.block(r1,c1,r2-r1+1,c2-c1+1)(r2-r1,c2-c1) = m2.block(0, 0, r2-r1+1,c2-c1+1)(0,0);\n\n  //check minor()\n  CheckMinor<Scalar, MatrixType::RowsAtCompileTime, MatrixType::ColsAtCompileTime> checkminor(m1,r1,c1);\n\n  //check diagonal()\n  VERIFY_IS_APPROX(m1.diagonal(), m1.transpose().diagonal());\n  m2.diagonal() = 2 * m1.diagonal();\n  m2.diagonal()[0] *= 3;\n  VERIFY_IS_APPROX(m2.diagonal()[0], static_cast<Scalar>(6) * m1.diagonal()[0]);\n\n  enum {\n    BlockRows = EIGEN_SIZE_MIN_PREFER_FIXED(MatrixType::RowsAtCompileTime,2),\n    BlockCols = EIGEN_SIZE_MIN_PREFER_FIXED(MatrixType::ColsAtCompileTime,5)\n  };\n  if (rows>=5 && cols>=8)\n  {\n    // test fixed block() as lvalue\n    m1.template block<BlockRows,BlockCols>(1,1) *= s1;\n    // test operator() on fixed block() both as constant and non-constant\n    m1.template block<BlockRows,BlockCols>(1,1)(0, 3) = m1.template block<2,5>(1,1)(1,2);\n    // check that fixed block() and block() agree\n    Matrix<Scalar,Dynamic,Dynamic> b = m1.template block<BlockRows,BlockCols>(3,3);\n    VERIFY_IS_APPROX(b, m1.block(3,3,BlockRows,BlockCols));\n  }\n\n  if (rows>2)\n  {\n    // test sub vectors\n    VERIFY_IS_APPROX(v1.template start<2>(), v1.block(0,0,2,1));\n    VERIFY_IS_APPROX(v1.template start<2>(), v1.start(2));\n    VERIFY_IS_APPROX(v1.template start<2>(), v1.segment(0,2));\n    VERIFY_IS_APPROX(v1.template start<2>(), v1.template segment<2>(0));\n    int i = rows-2;\n    VERIFY_IS_APPROX(v1.template end<2>(), v1.block(i,0,2,1));\n    VERIFY_IS_APPROX(v1.template end<2>(), v1.end(2));\n    VERIFY_IS_APPROX(v1.template end<2>(), v1.segment(i,2));\n    VERIFY_IS_APPROX(v1.template end<2>(), v1.template segment<2>(i));\n    i = ei_random(0,rows-2);\n    VERIFY_IS_APPROX(v1.segment(i,2), v1.template segment<2>(i));\n  }\n\n  // stress some basic stuffs with block matrices\n  VERIFY(ei_real(ones.col(c1).sum()) == RealScalar(rows));\n  VERIFY(ei_real(ones.row(r1).sum()) == RealScalar(cols));\n\n  VERIFY(ei_real(ones.col(c1).eigen2_dot(ones.col(c2))) == RealScalar(rows));\n  VERIFY(ei_real(ones.row(r1).eigen2_dot(ones.row(r2))) == RealScalar(cols));\n}\n\nvoid test_eigen2_submatrices()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( submatrices(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( submatrices(Matrix4d()) );\n    CALL_SUBTEST_3( submatrices(MatrixXcf(3, 3)) );\n    CALL_SUBTEST_4( submatrices(MatrixXi(8, 12)) );\n    CALL_SUBTEST_5( submatrices(MatrixXcd(20, 20)) );\n    CALL_SUBTEST_6( submatrices(MatrixXf(20, 20)) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_sum.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\ntemplate<typename MatrixType> void matrixSum(const MatrixType& m)\n{\n  typedef typename MatrixType::Scalar Scalar;\n\n  int rows = m.rows();\n  int cols = m.cols();\n\n  MatrixType m1 = MatrixType::Random(rows, cols);\n\n  VERIFY_IS_MUCH_SMALLER_THAN(MatrixType::Zero(rows, cols).sum(), Scalar(1));\n  VERIFY_IS_APPROX(MatrixType::Ones(rows, cols).sum(), Scalar(float(rows*cols))); // the float() here to shut up excessive MSVC warning about int->complex conversion being lossy\n  Scalar x = Scalar(0);\n  for(int i = 0; i < rows; i++) for(int j = 0; j < cols; j++) x += m1(i,j);\n  VERIFY_IS_APPROX(m1.sum(), x);\n}\n\ntemplate<typename VectorType> void vectorSum(const VectorType& w)\n{\n  typedef typename VectorType::Scalar Scalar;\n  int size = w.size();\n\n  VectorType v = VectorType::Random(size);\n  for(int i = 1; i < size; i++)\n  {\n    Scalar s = Scalar(0);\n    for(int j = 0; j < i; j++) s += v[j];\n    VERIFY_IS_APPROX(s, v.start(i).sum());\n  }\n\n  for(int i = 0; i < size-1; i++)\n  {\n    Scalar s = Scalar(0);\n    for(int j = i; j < size; j++) s += v[j];\n    VERIFY_IS_APPROX(s, v.end(size-i).sum());\n  }\n\n  for(int i = 0; i < size/2; i++)\n  {\n    Scalar s = Scalar(0);\n    for(int j = i; j < size-i; j++) s += v[j];\n    VERIFY_IS_APPROX(s, v.segment(i, size-2*i).sum());\n  }\n}\n\nvoid test_eigen2_sum()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( matrixSum(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( matrixSum(Matrix2f()) );\n    CALL_SUBTEST_3( matrixSum(Matrix4d()) );\n    CALL_SUBTEST_4( matrixSum(MatrixXcf(3, 3)) );\n    CALL_SUBTEST_5( matrixSum(MatrixXf(8, 12)) );\n    CALL_SUBTEST_6( matrixSum(MatrixXi(8, 12)) );\n  }\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_5( vectorSum(VectorXf(5)) );\n    CALL_SUBTEST_7( vectorSum(VectorXd(10)) );\n    CALL_SUBTEST_5( vectorSum(VectorXf(33)) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_svd.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <Eigen/SVD>\n\ntemplate<typename MatrixType> void svd(const MatrixType& m)\n{\n  /* this test covers the following files:\n     SVD.h\n  */\n  int rows = m.rows();\n  int cols = m.cols();\n\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  MatrixType a = MatrixType::Random(rows,cols);\n  Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> b =\n    Matrix<Scalar, MatrixType::RowsAtCompileTime, 1>::Random(rows,1);\n  Matrix<Scalar, MatrixType::ColsAtCompileTime, 1> x(cols,1), x2(cols,1);\n\n  RealScalar largerEps = test_precision<RealScalar>();\n  if (ei_is_same_type<RealScalar,float>::ret)\n    largerEps = 1e-3f;\n\n  {\n    SVD<MatrixType> svd(a);\n    MatrixType sigma = MatrixType::Zero(rows,cols);\n    MatrixType matU  = MatrixType::Zero(rows,rows);\n    sigma.block(0,0,cols,cols) = svd.singularValues().asDiagonal();\n    matU.block(0,0,rows,cols) = svd.matrixU();\n    VERIFY_IS_APPROX(a, matU * sigma * svd.matrixV().transpose());\n  }\n\n\n  if (rows==cols)\n  {\n    if (ei_is_same_type<RealScalar,float>::ret)\n    {\n      MatrixType a1 = MatrixType::Random(rows,cols);\n      a += a * a.adjoint() + a1 * a1.adjoint();\n    }\n    SVD<MatrixType> svd(a);\n    svd.solve(b, &x);\n    VERIFY_IS_APPROX(a * x,b);\n  }\n\n\n  if(rows==cols)\n  {\n    SVD<MatrixType> svd(a);\n    MatrixType unitary, positive;\n    svd.computeUnitaryPositive(&unitary, &positive);\n    VERIFY_IS_APPROX(unitary * unitary.adjoint(), MatrixType::Identity(unitary.rows(),unitary.rows()));\n    VERIFY_IS_APPROX(positive, positive.adjoint());\n    for(int i = 0; i < rows; i++) VERIFY(positive.diagonal()[i] >= 0); // cheap necessary (not sufficient) condition for positivity\n    VERIFY_IS_APPROX(unitary*positive, a);\n\n    svd.computePositiveUnitary(&positive, &unitary);\n    VERIFY_IS_APPROX(unitary * unitary.adjoint(), MatrixType::Identity(unitary.rows(),unitary.rows()));\n    VERIFY_IS_APPROX(positive, positive.adjoint());\n    for(int i = 0; i < rows; i++) VERIFY(positive.diagonal()[i] >= 0); // cheap necessary (not sufficient) condition for positivity\n    VERIFY_IS_APPROX(positive*unitary, a);\n  }\n}\n\nvoid test_eigen2_svd()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( svd(Matrix3f()) );\n    CALL_SUBTEST_2( svd(Matrix4d()) );\n    CALL_SUBTEST_3( svd(MatrixXf(7,7)) );\n    CALL_SUBTEST_4( svd(MatrixXd(14,7)) );\n    // complex are not implemented yet\n//     CALL_SUBTEST( svd(MatrixXcd(6,6)) );\n//     CALL_SUBTEST( svd(MatrixXcf(3,3)) );\n    SVD<MatrixXf> s;\n    MatrixXf m = MatrixXf::Random(10,1);\n    s.compute(m);\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_swap.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#define EIGEN_NO_STATIC_ASSERT\n#include \"main.h\"\n\ntemplate<typename T>\nstruct other_matrix_type\n{\n  typedef int type;\n};\n\ntemplate<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>\nstruct other_matrix_type<Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> >\n{\n  typedef Matrix<_Scalar, _Rows, _Cols, _Options^RowMajor, _MaxRows, _MaxCols> type;\n};\n\ntemplate<typename MatrixType> void swap(const MatrixType& m)\n{\n  typedef typename other_matrix_type<MatrixType>::type OtherMatrixType;\n  typedef typename MatrixType::Scalar Scalar;\n\n  ei_assert((!ei_is_same_type<MatrixType,OtherMatrixType>::ret));\n  int rows = m.rows();\n  int cols = m.cols();\n  \n  // construct 3 matrix guaranteed to be distinct\n  MatrixType m1 = MatrixType::Random(rows,cols);\n  MatrixType m2 = MatrixType::Random(rows,cols) + Scalar(100) * MatrixType::Identity(rows,cols);\n  OtherMatrixType m3 = OtherMatrixType::Random(rows,cols) + Scalar(200) * OtherMatrixType::Identity(rows,cols);\n  \n  MatrixType m1_copy = m1;\n  MatrixType m2_copy = m2;\n  OtherMatrixType m3_copy = m3;\n  \n  // test swapping 2 matrices of same type\n  m1.swap(m2);\n  VERIFY_IS_APPROX(m1,m2_copy);\n  VERIFY_IS_APPROX(m2,m1_copy);\n  m1 = m1_copy;\n  m2 = m2_copy;\n  \n  // test swapping 2 matrices of different types\n  m1.swap(m3);\n  VERIFY_IS_APPROX(m1,m3_copy);\n  VERIFY_IS_APPROX(m3,m1_copy);\n  m1 = m1_copy;\n  m3 = m3_copy;\n  \n  // test swapping matrix with expression\n  m1.swap(m2.block(0,0,rows,cols));\n  VERIFY_IS_APPROX(m1,m2_copy);\n  VERIFY_IS_APPROX(m2,m1_copy);\n  m1 = m1_copy;\n  m2 = m2_copy;\n\n  // test swapping two expressions of different types\n  m1.transpose().swap(m3.transpose());\n  VERIFY_IS_APPROX(m1,m3_copy);\n  VERIFY_IS_APPROX(m3,m1_copy);\n  m1 = m1_copy;\n  m3 = m3_copy;\n  \n  // test assertion on mismatching size -- matrix case\n  VERIFY_RAISES_ASSERT(m1.swap(m1.row(0)));\n  // test assertion on mismatching size -- xpr case\n  VERIFY_RAISES_ASSERT(m1.row(0).swap(m1));\n}\n\nvoid test_eigen2_swap()\n{\n  CALL_SUBTEST_1( swap(Matrix3f()) ); // fixed size, no vectorization \n  CALL_SUBTEST_1( swap(Matrix4d()) ); // fixed size, possible vectorization \n  CALL_SUBTEST_1( swap(MatrixXd(3,3)) ); // dyn size, no vectorization \n  CALL_SUBTEST_1( swap(MatrixXf(30,30)) ); // dyn size, possible vectorization \n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_triangular.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\ntemplate<typename MatrixType> void triangular(const MatrixType& m)\n{\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n\n  RealScalar largerEps = 10*test_precision<RealScalar>();\n\n  int rows = m.rows();\n  int cols = m.cols();\n\n  MatrixType m1 = MatrixType::Random(rows, cols),\n             m2 = MatrixType::Random(rows, cols),\n             m3(rows, cols),\n             m4(rows, cols),\n             r1(rows, cols),\n             r2(rows, cols);\n\n  MatrixType m1up = m1.template part<Eigen::UpperTriangular>();\n  MatrixType m2up = m2.template part<Eigen::UpperTriangular>();\n\n  if (rows*cols>1)\n  {\n    VERIFY(m1up.isUpperTriangular());\n    VERIFY(m2up.transpose().isLowerTriangular());\n    VERIFY(!m2.isLowerTriangular());\n  }\n\n//   VERIFY_IS_APPROX(m1up.transpose() * m2, m1.upper().transpose().lower() * m2);\n\n  // test overloaded operator+=\n  r1.setZero();\n  r2.setZero();\n  r1.template part<Eigen::UpperTriangular>() +=  m1;\n  r2 += m1up;\n  VERIFY_IS_APPROX(r1,r2);\n\n  // test overloaded operator=\n  m1.setZero();\n  m1.template part<Eigen::UpperTriangular>() = (m2.transpose() * m2).lazy();\n  m3 = m2.transpose() * m2;\n  VERIFY_IS_APPROX(m3.template part<Eigen::LowerTriangular>().transpose(), m1);\n\n  // test overloaded operator=\n  m1.setZero();\n  m1.template part<Eigen::LowerTriangular>() = (m2.transpose() * m2).lazy();\n  VERIFY_IS_APPROX(m3.template part<Eigen::LowerTriangular>(), m1);\n\n  VERIFY_IS_APPROX(m3.template part<Diagonal>(), m3.diagonal().asDiagonal());\n\n  m1 = MatrixType::Random(rows, cols);\n  for (int i=0; i<rows; ++i)\n    while (ei_abs2(m1(i,i))<1e-3) m1(i,i) = ei_random<Scalar>();\n\n  Transpose<MatrixType> trm4(m4);\n  // test back and forward subsitution\n  m3 = m1.template part<Eigen::LowerTriangular>();\n  VERIFY(m3.template marked<Eigen::LowerTriangular>().solveTriangular(m3).cwise().abs().isIdentity(test_precision<RealScalar>()));\n  VERIFY(m3.transpose().template marked<Eigen::UpperTriangular>()\n    .solveTriangular(m3.transpose()).cwise().abs().isIdentity(test_precision<RealScalar>()));\n  // check M * inv(L) using in place API\n  m4 = m3;\n  m3.transpose().template marked<Eigen::UpperTriangular>().solveTriangularInPlace(trm4);\n  VERIFY(m4.cwise().abs().isIdentity(test_precision<RealScalar>()));\n\n  m3 = m1.template part<Eigen::UpperTriangular>();\n  VERIFY(m3.template marked<Eigen::UpperTriangular>().solveTriangular(m3).cwise().abs().isIdentity(test_precision<RealScalar>()));\n  VERIFY(m3.transpose().template marked<Eigen::LowerTriangular>()\n    .solveTriangular(m3.transpose()).cwise().abs().isIdentity(test_precision<RealScalar>()));\n  // check M * inv(U) using in place API\n  m4 = m3;\n  m3.transpose().template marked<Eigen::LowerTriangular>().solveTriangularInPlace(trm4);\n  VERIFY(m4.cwise().abs().isIdentity(test_precision<RealScalar>()));\n\n  m3 = m1.template part<Eigen::UpperTriangular>();\n  VERIFY(m2.isApprox(m3 * (m3.template marked<Eigen::UpperTriangular>().solveTriangular(m2)), largerEps));\n  m3 = m1.template part<Eigen::LowerTriangular>();\n  VERIFY(m2.isApprox(m3 * (m3.template marked<Eigen::LowerTriangular>().solveTriangular(m2)), largerEps));\n\n  VERIFY((m1.template part<Eigen::UpperTriangular>() * m2.template part<Eigen::UpperTriangular>()).isUpperTriangular());\n\n  // test swap\n  m1.setOnes();\n  m2.setZero();\n  m2.template part<Eigen::UpperTriangular>().swap(m1);\n  m3.setZero();\n  m3.template part<Eigen::UpperTriangular>().setOnes();\n  VERIFY_IS_APPROX(m2,m3);\n\n}\n\nvoid selfadjoint()\n{\n  Matrix2i m;\n  m << 1, 2,\n       3, 4;\n\n  Matrix2i m1 = Matrix2i::Zero();\n  m1.part<SelfAdjoint>() = m;\n  Matrix2i ref1;\n  ref1 << 1, 2,\n          2, 4;\n  VERIFY(m1 == ref1);\n  \n  Matrix2i m2 = Matrix2i::Zero();\n  m2.part<SelfAdjoint>() = m.part<UpperTriangular>();\n  Matrix2i ref2;\n  ref2 << 1, 2,\n          2, 4;\n  VERIFY(m2 == ref2);\n \n  Matrix2i m3 = Matrix2i::Zero();\n  m3.part<SelfAdjoint>() = m.part<LowerTriangular>();\n  Matrix2i ref3;\n  ref3 << 1, 0,\n          0, 4;\n  VERIFY(m3 == ref3);\n  \n  // example inspired from bug 159\n  int array[] = {1, 2, 3, 4};\n  Matrix2i::Map(array).part<SelfAdjoint>() = Matrix2i::Random().part<LowerTriangular>();\n  \n  std::cout << \"hello\\n\" << array << std::endl;\n}\n\nvoid test_eigen2_triangular()\n{\n  CALL_SUBTEST_8( selfadjoint() );\n  for(int i = 0; i < g_repeat ; i++) {\n    CALL_SUBTEST_1( triangular(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( triangular(Matrix<float, 2, 2>()) );\n    CALL_SUBTEST_3( triangular(Matrix3d()) );\n    CALL_SUBTEST_4( triangular(MatrixXcf(4, 4)) );\n    CALL_SUBTEST_5( triangular(Matrix<std::complex<float>,8, 8>()) );\n    CALL_SUBTEST_6( triangular(MatrixXd(17,17)) );\n    CALL_SUBTEST_7( triangular(Matrix<float,Dynamic,Dynamic,RowMajor>(5, 5)) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_unalignedassert.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\nstruct Good1\n{\n  MatrixXd m; // good: m will allocate its own array, taking care of alignment.\n  Good1() : m(20,20) {}\n};\n\nstruct Good2\n{\n  Matrix3d m; // good: m's size isn't a multiple of 16 bytes, so m doesn't have to be aligned\n};\n\nstruct Good3\n{\n  Vector2f m; // good: same reason\n};\n\nstruct Bad4\n{\n  Vector2d m; // bad: sizeof(m)%16==0 so alignment is required\n};\n\nstruct Bad5\n{\n  Matrix<float, 2, 6> m; // bad: same reason\n};\n\nstruct Bad6\n{\n  Matrix<double, 3, 4> m; // bad: same reason\n};\n\nstruct Good7\n{\n  EIGEN_MAKE_ALIGNED_OPERATOR_NEW\n  Vector2d m;\n  float f; // make the struct have sizeof%16!=0 to make it a little more tricky when we allow an array of 2 such objects\n};\n\nstruct Good8\n{\n  EIGEN_MAKE_ALIGNED_OPERATOR_NEW\n  float f; // try the f at first -- the EIGEN_ALIGN_128 attribute of m should make that still work\n  Matrix4f m;\n};\n\nstruct Good9\n{\n  Matrix<float,2,2,DontAlign> m; // good: no alignment requested\n  float f;\n};\n\ntemplate<bool Align> struct Depends\n{\n  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(Align)\n  Vector2d m;\n  float f;\n};\n\ntemplate<typename T>\nvoid check_unalignedassert_good()\n{\n  T *x, *y;\n  x = new T;\n  delete x;\n  y = new T[2];\n  delete[] y;\n}\n\n#if EIGEN_ARCH_WANTS_ALIGNMENT\ntemplate<typename T>\nvoid check_unalignedassert_bad()\n{\n  float buf[sizeof(T)+16];\n  float *unaligned = buf;\n  while((reinterpret_cast<std::size_t>(unaligned)&0xf)==0) ++unaligned; // make sure unaligned is really unaligned\n  T *x = ::new(static_cast<void*>(unaligned)) T;\n  x->~T();\n}\n#endif\n\nvoid unalignedassert()\n{\n  check_unalignedassert_good<Good1>();\n  check_unalignedassert_good<Good2>();\n  check_unalignedassert_good<Good3>();\n#if EIGEN_ARCH_WANTS_ALIGNMENT\n  VERIFY_RAISES_ASSERT(check_unalignedassert_bad<Bad4>());\n  VERIFY_RAISES_ASSERT(check_unalignedassert_bad<Bad5>());\n  VERIFY_RAISES_ASSERT(check_unalignedassert_bad<Bad6>());\n#endif\n\n  check_unalignedassert_good<Good7>();\n  check_unalignedassert_good<Good8>();\n  check_unalignedassert_good<Good9>();\n  check_unalignedassert_good<Depends<true> >();\n\n#if EIGEN_ARCH_WANTS_ALIGNMENT\n  VERIFY_RAISES_ASSERT(check_unalignedassert_bad<Depends<false> >());\n#endif\n}\n\nvoid test_eigen2_unalignedassert()\n{\n  CALL_SUBTEST(unalignedassert());\n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/eigen2_visitor.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\ntemplate<typename MatrixType> void matrixVisitor(const MatrixType& p)\n{\n  typedef typename MatrixType::Scalar Scalar;\n\n  int rows = p.rows();\n  int cols = p.cols();\n\n  // construct a random matrix where all coefficients are different\n  MatrixType m;\n  m = MatrixType::Random(rows, cols);\n  for(int i = 0; i < m.size(); i++)\n    for(int i2 = 0; i2 < i; i2++)\n      while(m(i) == m(i2)) // yes, ==\n        m(i) = ei_random<Scalar>();\n  \n  Scalar minc = Scalar(1000), maxc = Scalar(-1000);\n  int minrow=0,mincol=0,maxrow=0,maxcol=0;\n  for(int j = 0; j < cols; j++)\n  for(int i = 0; i < rows; i++)\n  {\n    if(m(i,j) < minc)\n    {\n      minc = m(i,j);\n      minrow = i;\n      mincol = j;\n    }\n    if(m(i,j) > maxc)\n    {\n      maxc = m(i,j);\n      maxrow = i;\n      maxcol = j;\n    }\n  }\n  int eigen_minrow, eigen_mincol, eigen_maxrow, eigen_maxcol;\n  Scalar eigen_minc, eigen_maxc;\n  eigen_minc = m.minCoeff(&eigen_minrow,&eigen_mincol);\n  eigen_maxc = m.maxCoeff(&eigen_maxrow,&eigen_maxcol);\n  VERIFY(minrow == eigen_minrow);\n  VERIFY(maxrow == eigen_maxrow);\n  VERIFY(mincol == eigen_mincol);\n  VERIFY(maxcol == eigen_maxcol);\n  VERIFY_IS_APPROX(minc, eigen_minc);\n  VERIFY_IS_APPROX(maxc, eigen_maxc);\n  VERIFY_IS_APPROX(minc, m.minCoeff());\n  VERIFY_IS_APPROX(maxc, m.maxCoeff());\n}\n\ntemplate<typename VectorType> void vectorVisitor(const VectorType& w)\n{\n  typedef typename VectorType::Scalar Scalar;\n\n  int size = w.size();\n\n  // construct a random vector where all coefficients are different\n  VectorType v;\n  v = VectorType::Random(size);\n  for(int i = 0; i < size; i++)\n    for(int i2 = 0; i2 < i; i2++)\n      while(v(i) == v(i2)) // yes, ==\n        v(i) = ei_random<Scalar>();\n  \n  Scalar minc = Scalar(1000), maxc = Scalar(-1000);\n  int minidx=0,maxidx=0;\n  for(int i = 0; i < size; i++)\n  {\n    if(v(i) < minc)\n    {\n      minc = v(i);\n      minidx = i;\n    }\n    if(v(i) > maxc)\n    {\n      maxc = v(i);\n      maxidx = i;\n    }\n  }\n  int eigen_minidx, eigen_maxidx;\n  Scalar eigen_minc, eigen_maxc;\n  eigen_minc = v.minCoeff(&eigen_minidx);\n  eigen_maxc = v.maxCoeff(&eigen_maxidx);\n  VERIFY(minidx == eigen_minidx);\n  VERIFY(maxidx == eigen_maxidx);\n  VERIFY_IS_APPROX(minc, eigen_minc);\n  VERIFY_IS_APPROX(maxc, eigen_maxc);\n  VERIFY_IS_APPROX(minc, v.minCoeff());\n  VERIFY_IS_APPROX(maxc, v.maxCoeff());\n}\n\nvoid test_eigen2_visitor()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( matrixVisitor(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( matrixVisitor(Matrix2f()) );\n    CALL_SUBTEST_3( matrixVisitor(Matrix4d()) );\n    CALL_SUBTEST_4( matrixVisitor(MatrixXd(8, 12)) );\n    CALL_SUBTEST_5( matrixVisitor(Matrix<double,Dynamic,Dynamic,RowMajor>(20, 20)) );\n    CALL_SUBTEST_6( matrixVisitor(MatrixXi(8, 12)) );\n  }\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_7( vectorVisitor(Vector4f()) );\n    CALL_SUBTEST_4( vectorVisitor(VectorXd(10)) );\n    CALL_SUBTEST_4( vectorVisitor(RowVectorXd(10)) );\n    CALL_SUBTEST_8( vectorVisitor(VectorXf(33)) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/eigen2/gsl_helper.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_GSL_HELPER\n#define EIGEN_GSL_HELPER\n\n#include <Eigen/Core>\n\n#include <gsl/gsl_blas.h>\n#include <gsl/gsl_multifit.h>\n#include <gsl/gsl_eigen.h>\n#include <gsl/gsl_linalg.h>\n#include <gsl/gsl_complex.h>\n#include <gsl/gsl_complex_math.h>\n\nnamespace Eigen {\n\ntemplate<typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex> struct GslTraits\n{\n  typedef gsl_matrix* Matrix;\n  typedef gsl_vector* Vector;\n  static Matrix createMatrix(int rows, int cols) { return gsl_matrix_alloc(rows,cols); }\n  static Vector createVector(int size) { return gsl_vector_alloc(size); }\n  static void free(Matrix& m) { gsl_matrix_free(m); m=0; }\n  static void free(Vector& m) { gsl_vector_free(m); m=0; }\n  static void prod(const Matrix& m, const Vector& v, Vector& x) { gsl_blas_dgemv(CblasNoTrans,1,m,v,0,x); }\n  static void cholesky(Matrix& m) { gsl_linalg_cholesky_decomp(m); }\n  static void cholesky_solve(const Matrix& m, const Vector& b, Vector& x) { gsl_linalg_cholesky_solve(m,b,x); }\n  static void eigen_symm(const Matrix& m, Vector& eval, Matrix& evec)\n  {\n    gsl_eigen_symmv_workspace * w = gsl_eigen_symmv_alloc(m->size1);\n    Matrix a = createMatrix(m->size1, m->size2);\n    gsl_matrix_memcpy(a, m);\n    gsl_eigen_symmv(a,eval,evec,w);\n    gsl_eigen_symmv_sort(eval, evec, GSL_EIGEN_SORT_VAL_ASC);\n    gsl_eigen_symmv_free(w);\n    free(a);\n  }\n  static void eigen_symm_gen(const Matrix& m, const Matrix& _b, Vector& eval, Matrix& evec)\n  {\n    gsl_eigen_gensymmv_workspace * w = gsl_eigen_gensymmv_alloc(m->size1);\n    Matrix a = createMatrix(m->size1, m->size2);\n    Matrix b = createMatrix(_b->size1, _b->size2);\n    gsl_matrix_memcpy(a, m);\n    gsl_matrix_memcpy(b, _b);\n    gsl_eigen_gensymmv(a,b,eval,evec,w);\n    gsl_eigen_symmv_sort(eval, evec, GSL_EIGEN_SORT_VAL_ASC);\n    gsl_eigen_gensymmv_free(w);\n    free(a);\n  }\n};\n\ntemplate<typename Scalar> struct GslTraits<Scalar,true>\n{\n  typedef gsl_matrix_complex* Matrix;\n  typedef gsl_vector_complex* Vector;\n  static Matrix createMatrix(int rows, int cols) { return gsl_matrix_complex_alloc(rows,cols); }\n  static Vector createVector(int size) { return gsl_vector_complex_alloc(size); }\n  static void free(Matrix& m) { gsl_matrix_complex_free(m); m=0; }\n  static void free(Vector& m) { gsl_vector_complex_free(m); m=0; }\n  static void cholesky(Matrix& m) { gsl_linalg_complex_cholesky_decomp(m); }\n  static void cholesky_solve(const Matrix& m, const Vector& b, Vector& x) { gsl_linalg_complex_cholesky_solve(m,b,x); }\n  static void prod(const Matrix& m, const Vector& v, Vector& x)\n  { gsl_blas_zgemv(CblasNoTrans,gsl_complex_rect(1,0),m,v,gsl_complex_rect(0,0),x); }\n  static void eigen_symm(const Matrix& m, gsl_vector* &eval, Matrix& evec)\n  {\n    gsl_eigen_hermv_workspace * w = gsl_eigen_hermv_alloc(m->size1);\n    Matrix a = createMatrix(m->size1, m->size2);\n    gsl_matrix_complex_memcpy(a, m);\n    gsl_eigen_hermv(a,eval,evec,w);\n    gsl_eigen_hermv_sort(eval, evec, GSL_EIGEN_SORT_VAL_ASC);\n    gsl_eigen_hermv_free(w);\n    free(a);\n  }\n  static void eigen_symm_gen(const Matrix& m, const Matrix& _b, gsl_vector* &eval, Matrix& evec)\n  {\n    gsl_eigen_genhermv_workspace * w = gsl_eigen_genhermv_alloc(m->size1);\n    Matrix a = createMatrix(m->size1, m->size2);\n    Matrix b = createMatrix(_b->size1, _b->size2);\n    gsl_matrix_complex_memcpy(a, m);\n    gsl_matrix_complex_memcpy(b, _b);\n    gsl_eigen_genhermv(a,b,eval,evec,w);\n    gsl_eigen_hermv_sort(eval, evec, GSL_EIGEN_SORT_VAL_ASC);\n    gsl_eigen_genhermv_free(w);\n    free(a);\n  }\n};\n\ntemplate<typename MatrixType>\nvoid convert(const MatrixType& m, gsl_matrix* &res)\n{\n//   if (res)\n//     gsl_matrix_free(res);\n  res = gsl_matrix_alloc(m.rows(), m.cols());\n  for (int i=0 ; i<m.rows() ; ++i)\n    for (int j=0 ; j<m.cols(); ++j)\n      gsl_matrix_set(res, i, j, m(i,j));\n}\n\ntemplate<typename MatrixType>\nvoid convert(const gsl_matrix* m, MatrixType& res)\n{\n  res.resize(int(m->size1), int(m->size2));\n  for (int i=0 ; i<res.rows() ; ++i)\n    for (int j=0 ; j<res.cols(); ++j)\n      res(i,j) = gsl_matrix_get(m,i,j);\n}\n\ntemplate<typename VectorType>\nvoid convert(const VectorType& m, gsl_vector* &res)\n{\n  if (res) gsl_vector_free(res);\n  res = gsl_vector_alloc(m.size());\n  for (int i=0 ; i<m.size() ; ++i)\n      gsl_vector_set(res, i, m[i]);\n}\n\ntemplate<typename VectorType>\nvoid convert(const gsl_vector* m, VectorType& res)\n{\n  res.resize (m->size);\n  for (int i=0 ; i<res.rows() ; ++i)\n    res[i] = gsl_vector_get(m, i);\n}\n\ntemplate<typename MatrixType>\nvoid convert(const MatrixType& m, gsl_matrix_complex* &res)\n{\n  res = gsl_matrix_complex_alloc(m.rows(), m.cols());\n  for (int i=0 ; i<m.rows() ; ++i)\n    for (int j=0 ; j<m.cols(); ++j)\n    {\n      gsl_matrix_complex_set(res, i, j,\n        gsl_complex_rect(m(i,j).real(), m(i,j).imag()));\n    }\n}\n\ntemplate<typename MatrixType>\nvoid convert(const gsl_matrix_complex* m, MatrixType& res)\n{\n  res.resize(int(m->size1), int(m->size2));\n  for (int i=0 ; i<res.rows() ; ++i)\n    for (int j=0 ; j<res.cols(); ++j)\n      res(i,j) = typename MatrixType::Scalar(\n        GSL_REAL(gsl_matrix_complex_get(m,i,j)),\n        GSL_IMAG(gsl_matrix_complex_get(m,i,j)));\n}\n\ntemplate<typename VectorType>\nvoid convert(const VectorType& m, gsl_vector_complex* &res)\n{\n  res = gsl_vector_complex_alloc(m.size());\n  for (int i=0 ; i<m.size() ; ++i)\n      gsl_vector_complex_set(res, i, gsl_complex_rect(m[i].real(), m[i].imag()));\n}\n\ntemplate<typename VectorType>\nvoid convert(const gsl_vector_complex* m, VectorType& res)\n{\n  res.resize(m->size);\n  for (int i=0 ; i<res.rows() ; ++i)\n    res[i] = typename VectorType::Scalar(\n        GSL_REAL(gsl_vector_complex_get(m, i)),\n        GSL_IMAG(gsl_vector_complex_get(m, i)));\n}\n\n}\n\n#endif // EIGEN_GSL_HELPER\n"
  },
  {
    "path": "libs/eigen/test/eigen2/main.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include <cstdlib>\n#include <ctime>\n#include <iostream>\n#include <string>\n#include <vector>\n\n#ifndef EIGEN_TEST_FUNC\n#error EIGEN_TEST_FUNC must be defined\n#endif\n\n#define DEFAULT_REPEAT 10\n\nnamespace Eigen\n{\n  static std::vector<std::string> g_test_stack;\n  static int g_repeat;\n}\n\n#define EI_PP_MAKE_STRING2(S) #S\n#define EI_PP_MAKE_STRING(S) EI_PP_MAKE_STRING2(S)\n\n#define EI_PP_CAT2(a,b) a ## b\n#define EI_PP_CAT(a,b) EI_PP_CAT2(a,b)\n\n#ifndef EIGEN_NO_ASSERTION_CHECKING\n\n  namespace Eigen\n  {\n    static const bool should_raise_an_assert = false;\n\n    // Used to avoid to raise two exceptions at a time in which\n    // case the exception is not properly caught.\n    // This may happen when a second exceptions is raise in a destructor.\n    static bool no_more_assert = false;\n\n    struct eigen_assert_exception\n    {\n      eigen_assert_exception(void) {}\n      ~eigen_assert_exception() { Eigen::no_more_assert = false; }\n    };\n  }\n\n  // If EIGEN_DEBUG_ASSERTS is defined and if no assertion is raised while\n  // one should have been, then the list of excecuted assertions is printed out.\n  //\n  // EIGEN_DEBUG_ASSERTS is not enabled by default as it\n  // significantly increases the compilation time\n  // and might even introduce side effects that would hide\n  // some memory errors.\n  #ifdef EIGEN_DEBUG_ASSERTS\n\n    namespace Eigen\n    {\n      static bool ei_push_assert = false;\n      static std::vector<std::string> eigen_assert_list;\n    }\n\n    #define eigen_assert(a)                       \\\n      if( (!(a)) && (!no_more_assert) )     \\\n      {                                     \\\n        Eigen::no_more_assert = true;       \\\n        throw Eigen::eigen_assert_exception(); \\\n      }                                     \\\n      else if (Eigen::ei_push_assert)       \\\n      {                                     \\\n        eigen_assert_list.push_back(std::string(EI_PP_MAKE_STRING(__FILE__)\" (\"EI_PP_MAKE_STRING(__LINE__)\") : \"#a) ); \\\n      }\n\n    #define VERIFY_RAISES_ASSERT(a)                                               \\\n      {                                                                           \\\n        Eigen::no_more_assert = false;                                            \\\n        try {                                                                     \\\n          Eigen::eigen_assert_list.clear();                                          \\\n          Eigen::ei_push_assert = true;                                           \\\n          a;                                                                      \\\n          Eigen::ei_push_assert = false;                                          \\\n          std::cerr << \"One of the following asserts should have been raised:\\n\"; \\\n          for (uint ai=0 ; ai<eigen_assert_list.size() ; ++ai)                       \\\n            std::cerr << \"  \" << eigen_assert_list[ai] << \"\\n\";                      \\\n          VERIFY(Eigen::should_raise_an_assert && # a);                           \\\n        } catch (Eigen::eigen_assert_exception e) {                                  \\\n          Eigen::ei_push_assert = false; VERIFY(true);                            \\\n        }                                                                         \\\n      }\n\n  #else // EIGEN_DEBUG_ASSERTS\n\n    #undef eigen_assert\n\n    // see bug 89. The copy_bool here is working around a bug in gcc <= 4.3\n    #define eigen_assert(a) \\\n      if( (!Eigen::internal::copy_bool(a)) && (!no_more_assert) )\t\\\n      {                                     \\\n        Eigen::no_more_assert = true;       \\\n        throw Eigen::eigen_assert_exception(); \\\n      }\n\n    #define VERIFY_RAISES_ASSERT(a) {                             \\\n        Eigen::no_more_assert = false;                            \\\n        try { a; VERIFY(Eigen::should_raise_an_assert && # a); }  \\\n        catch (Eigen::eigen_assert_exception e) { VERIFY(true); }    \\\n      }\n\n  #endif // EIGEN_DEBUG_ASSERTS\n\n  #define EIGEN_USE_CUSTOM_ASSERT\n\n#else // EIGEN_NO_ASSERTION_CHECKING\n\n  #define VERIFY_RAISES_ASSERT(a) {}\n\n#endif // EIGEN_NO_ASSERTION_CHECKING\n\n\n#define EIGEN_INTERNAL_DEBUGGING\n#define EIGEN_NICE_RANDOM\n#include <Eigen/Array>\n\n\n#define VERIFY(a) do { if (!(a)) { \\\n    std::cerr << \"Test \" << g_test_stack.back() << \" failed in \"EI_PP_MAKE_STRING(__FILE__) << \" (\" << EI_PP_MAKE_STRING(__LINE__) << \")\" \\\n      << std::endl << \"    \" << EI_PP_MAKE_STRING(a) << std::endl << std::endl; \\\n    abort(); \\\n  } } while (0)\n\n#define VERIFY_IS_APPROX(a, b) VERIFY(test_ei_isApprox(a, b))\n#define VERIFY_IS_NOT_APPROX(a, b) VERIFY(!test_ei_isApprox(a, b))\n#define VERIFY_IS_MUCH_SMALLER_THAN(a, b) VERIFY(test_ei_isMuchSmallerThan(a, b))\n#define VERIFY_IS_NOT_MUCH_SMALLER_THAN(a, b) VERIFY(!test_ei_isMuchSmallerThan(a, b))\n#define VERIFY_IS_APPROX_OR_LESS_THAN(a, b) VERIFY(test_ei_isApproxOrLessThan(a, b))\n#define VERIFY_IS_NOT_APPROX_OR_LESS_THAN(a, b) VERIFY(!test_ei_isApproxOrLessThan(a, b))\n\n#define CALL_SUBTEST(FUNC) do { \\\n    g_test_stack.push_back(EI_PP_MAKE_STRING(FUNC)); \\\n    FUNC; \\\n    g_test_stack.pop_back(); \\\n  } while (0)\n\nnamespace Eigen {\n\ntemplate<typename T> inline typename NumTraits<T>::Real test_precision();\ntemplate<> inline int test_precision<int>() { return 0; }\ntemplate<> inline float test_precision<float>() { return 1e-3f; }\ntemplate<> inline double test_precision<double>() { return 1e-6; }\ntemplate<> inline float test_precision<std::complex<float> >() { return test_precision<float>(); }\ntemplate<> inline double test_precision<std::complex<double> >() { return test_precision<double>(); }\ntemplate<> inline long double test_precision<long double>() { return 1e-6; }\n\ninline bool test_ei_isApprox(const int& a, const int& b)\n{ return ei_isApprox(a, b, test_precision<int>()); }\ninline bool test_ei_isMuchSmallerThan(const int& a, const int& b)\n{ return ei_isMuchSmallerThan(a, b, test_precision<int>()); }\ninline bool test_ei_isApproxOrLessThan(const int& a, const int& b)\n{ return ei_isApproxOrLessThan(a, b, test_precision<int>()); }\n\ninline bool test_ei_isApprox(const float& a, const float& b)\n{ return ei_isApprox(a, b, test_precision<float>()); }\ninline bool test_ei_isMuchSmallerThan(const float& a, const float& b)\n{ return ei_isMuchSmallerThan(a, b, test_precision<float>()); }\ninline bool test_ei_isApproxOrLessThan(const float& a, const float& b)\n{ return ei_isApproxOrLessThan(a, b, test_precision<float>()); }\n\ninline bool test_ei_isApprox(const double& a, const double& b)\n{ return ei_isApprox(a, b, test_precision<double>()); }\ninline bool test_ei_isMuchSmallerThan(const double& a, const double& b)\n{ return ei_isMuchSmallerThan(a, b, test_precision<double>()); }\ninline bool test_ei_isApproxOrLessThan(const double& a, const double& b)\n{ return ei_isApproxOrLessThan(a, b, test_precision<double>()); }\n\ninline bool test_ei_isApprox(const std::complex<float>& a, const std::complex<float>& b)\n{ return ei_isApprox(a, b, test_precision<std::complex<float> >()); }\ninline bool test_ei_isMuchSmallerThan(const std::complex<float>& a, const std::complex<float>& b)\n{ return ei_isMuchSmallerThan(a, b, test_precision<std::complex<float> >()); }\n\ninline bool test_ei_isApprox(const std::complex<double>& a, const std::complex<double>& b)\n{ return ei_isApprox(a, b, test_precision<std::complex<double> >()); }\ninline bool test_ei_isMuchSmallerThan(const std::complex<double>& a, const std::complex<double>& b)\n{ return ei_isMuchSmallerThan(a, b, test_precision<std::complex<double> >()); }\n\ninline bool test_ei_isApprox(const long double& a, const long double& b)\n{ return ei_isApprox(a, b, test_precision<long double>()); }\ninline bool test_ei_isMuchSmallerThan(const long double& a, const long double& b)\n{ return ei_isMuchSmallerThan(a, b, test_precision<long double>()); }\ninline bool test_ei_isApproxOrLessThan(const long double& a, const long double& b)\n{ return ei_isApproxOrLessThan(a, b, test_precision<long double>()); }\n\ntemplate<typename Type1, typename Type2>\ninline bool test_ei_isApprox(const Type1& a, const Type2& b)\n{\n  return a.isApprox(b, test_precision<typename Type1::Scalar>());\n}\n\ntemplate<typename Derived1, typename Derived2>\ninline bool test_ei_isMuchSmallerThan(const MatrixBase<Derived1>& m1,\n                                   const MatrixBase<Derived2>& m2)\n{\n  return m1.isMuchSmallerThan(m2, test_precision<typename ei_traits<Derived1>::Scalar>());\n}\n\ntemplate<typename Derived>\ninline bool test_ei_isMuchSmallerThan(const MatrixBase<Derived>& m,\n                                   const typename NumTraits<typename ei_traits<Derived>::Scalar>::Real& s)\n{\n  return m.isMuchSmallerThan(s, test_precision<typename ei_traits<Derived>::Scalar>());\n}\n\n} // end namespace Eigen\n\ntemplate<typename T> struct GetDifferentType;\n\ntemplate<> struct GetDifferentType<float> { typedef double type; };\ntemplate<> struct GetDifferentType<double> { typedef float type; };\ntemplate<typename T> struct GetDifferentType<std::complex<T> >\n{ typedef std::complex<typename GetDifferentType<T>::type> type; };\n\n// forward declaration of the main test function\nvoid EI_PP_CAT(test_,EIGEN_TEST_FUNC)();\n\nusing namespace Eigen;\n\n#ifdef EIGEN_TEST_PART_1\n#define CALL_SUBTEST_1(FUNC) CALL_SUBTEST(FUNC)\n#else\n#define CALL_SUBTEST_1(FUNC)\n#endif\n\n#ifdef EIGEN_TEST_PART_2\n#define CALL_SUBTEST_2(FUNC) CALL_SUBTEST(FUNC)\n#else\n#define CALL_SUBTEST_2(FUNC)\n#endif\n\n#ifdef EIGEN_TEST_PART_3\n#define CALL_SUBTEST_3(FUNC) CALL_SUBTEST(FUNC)\n#else\n#define CALL_SUBTEST_3(FUNC)\n#endif\n\n#ifdef EIGEN_TEST_PART_4\n#define CALL_SUBTEST_4(FUNC) CALL_SUBTEST(FUNC)\n#else\n#define CALL_SUBTEST_4(FUNC)\n#endif\n\n#ifdef EIGEN_TEST_PART_5\n#define CALL_SUBTEST_5(FUNC) CALL_SUBTEST(FUNC)\n#else\n#define CALL_SUBTEST_5(FUNC)\n#endif\n\n#ifdef EIGEN_TEST_PART_6\n#define CALL_SUBTEST_6(FUNC) CALL_SUBTEST(FUNC)\n#else\n#define CALL_SUBTEST_6(FUNC)\n#endif\n\n#ifdef EIGEN_TEST_PART_7\n#define CALL_SUBTEST_7(FUNC) CALL_SUBTEST(FUNC)\n#else\n#define CALL_SUBTEST_7(FUNC)\n#endif\n\n#ifdef EIGEN_TEST_PART_8\n#define CALL_SUBTEST_8(FUNC) CALL_SUBTEST(FUNC)\n#else\n#define CALL_SUBTEST_8(FUNC)\n#endif\n\n#ifdef EIGEN_TEST_PART_9\n#define CALL_SUBTEST_9(FUNC) CALL_SUBTEST(FUNC)\n#else\n#define CALL_SUBTEST_9(FUNC)\n#endif\n\n#ifdef EIGEN_TEST_PART_10\n#define CALL_SUBTEST_10(FUNC) CALL_SUBTEST(FUNC)\n#else\n#define CALL_SUBTEST_10(FUNC)\n#endif\n\n#ifdef EIGEN_TEST_PART_11\n#define CALL_SUBTEST_11(FUNC) CALL_SUBTEST(FUNC)\n#else\n#define CALL_SUBTEST_11(FUNC)\n#endif\n\n#ifdef EIGEN_TEST_PART_12\n#define CALL_SUBTEST_12(FUNC) CALL_SUBTEST(FUNC)\n#else\n#define CALL_SUBTEST_12(FUNC)\n#endif\n\n#ifdef EIGEN_TEST_PART_13\n#define CALL_SUBTEST_13(FUNC) CALL_SUBTEST(FUNC)\n#else\n#define CALL_SUBTEST_13(FUNC)\n#endif\n\n#ifdef EIGEN_TEST_PART_14\n#define CALL_SUBTEST_14(FUNC) CALL_SUBTEST(FUNC)\n#else\n#define CALL_SUBTEST_14(FUNC)\n#endif\n\n#ifdef EIGEN_TEST_PART_15\n#define CALL_SUBTEST_15(FUNC) CALL_SUBTEST(FUNC)\n#else\n#define CALL_SUBTEST_15(FUNC)\n#endif\n\n#ifdef EIGEN_TEST_PART_16\n#define CALL_SUBTEST_16(FUNC) CALL_SUBTEST(FUNC)\n#else\n#define CALL_SUBTEST_16(FUNC)\n#endif\n\n\n\nint main(int argc, char *argv[])\n{\n    bool has_set_repeat = false;\n    bool has_set_seed = false;\n    bool need_help = false;\n    unsigned int seed = 0;\n    int repeat = DEFAULT_REPEAT;\n\n    for(int i = 1; i < argc; i++)\n    {\n      if(argv[i][0] == 'r')\n      {\n        if(has_set_repeat)\n        {\n          std::cout << \"Argument \" << argv[i] << \" conflicting with a former argument\" << std::endl;\n          return 1;\n        }\n        repeat = std::atoi(argv[i]+1);\n        has_set_repeat = true;\n        if(repeat <= 0)\n        {\n          std::cout << \"Invalid \\'repeat\\' value \" << argv[i]+1 << std::endl;\n          return 1;\n        }\n      }\n      else if(argv[i][0] == 's')\n      {\n        if(has_set_seed)\n        {\n          std::cout << \"Argument \" << argv[i] << \" conflicting with a former argument\" << std::endl;\n          return 1;\n        }\n        seed = int(std::strtoul(argv[i]+1, 0, 10));\n        has_set_seed = true;\n        bool ok = seed!=0;\n        if(!ok)\n        {\n          std::cout << \"Invalid \\'seed\\' value \" << argv[i]+1 << std::endl;\n          return 1;\n        }\n      }\n      else\n      {\n        need_help = true;\n      }\n    }\n\n    if(need_help)\n    {\n      std::cout << \"This test application takes the following optional arguments:\" << std::endl;\n      std::cout << \"  rN     Repeat each test N times (default: \" << DEFAULT_REPEAT << \")\" << std::endl;\n      std::cout << \"  sN     Use N as seed for random numbers (default: based on current time)\" << std::endl;\n      return 1;\n    }\n\n    if(!has_set_seed) seed = (unsigned int) std::time(NULL);\n    if(!has_set_repeat) repeat = DEFAULT_REPEAT;\n\n    std::cout << \"Initializing random number generator with seed \" << seed << std::endl;\n\tstd::srand(seed);\n    std::cout << \"Repeating each test \" << repeat << \" times\" << std::endl;\n\n    Eigen::g_repeat = repeat;\n    Eigen::g_test_stack.push_back(EI_PP_MAKE_STRING(EIGEN_TEST_FUNC));\n\n    EI_PP_CAT(test_,EIGEN_TEST_FUNC)();\n    return 0;\n}\n\n\n\n"
  },
  {
    "path": "libs/eigen/test/eigen2/product.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <Eigen/Array>\n#include <Eigen/QR>\n\ntemplate<typename Derived1, typename Derived2>\nbool areNotApprox(const MatrixBase<Derived1>& m1, const MatrixBase<Derived2>& m2, typename Derived1::RealScalar epsilon = precision<typename Derived1::RealScalar>())\n{\n  return !((m1-m2).cwise().abs2().maxCoeff() < epsilon * epsilon\n                          * std::max(m1.cwise().abs2().maxCoeff(), m2.cwise().abs2().maxCoeff()));\n}\n\ntemplate<typename MatrixType> void product(const MatrixType& m)\n{\n  /* this test covers the following files:\n     Identity.h Product.h\n  */\n\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::FloatingPoint FloatingPoint;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> RowVectorType;\n  typedef Matrix<Scalar, MatrixType::ColsAtCompileTime, 1> ColVectorType;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, MatrixType::RowsAtCompileTime> RowSquareMatrixType;\n  typedef Matrix<Scalar, MatrixType::ColsAtCompileTime, MatrixType::ColsAtCompileTime> ColSquareMatrixType;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, MatrixType::ColsAtCompileTime,\n                         MatrixType::Options^RowMajor> OtherMajorMatrixType;\n\n  int rows = m.rows();\n  int cols = m.cols();\n\n  // this test relies a lot on Random.h, and there's not much more that we can do\n  // to test it, hence I consider that we will have tested Random.h\n  MatrixType m1 = MatrixType::Random(rows, cols),\n             m2 = MatrixType::Random(rows, cols),\n             m3(rows, cols);\n  RowSquareMatrixType\n             identity = RowSquareMatrixType::Identity(rows, rows),\n             square = RowSquareMatrixType::Random(rows, rows),\n             res = RowSquareMatrixType::Random(rows, rows);\n  ColSquareMatrixType\n             square2 = ColSquareMatrixType::Random(cols, cols),\n             res2 = ColSquareMatrixType::Random(cols, cols);\n  RowVectorType v1 = RowVectorType::Random(rows);\n  ColVectorType vc2 = ColVectorType::Random(cols), vcres(cols);\n  OtherMajorMatrixType tm1 = m1;\n\n  Scalar s1 = ei_random<Scalar>();\n\n  int r = ei_random<int>(0, rows-1),\n      c = ei_random<int>(0, cols-1);\n\n  // begin testing Product.h: only associativity for now\n  // (we use Transpose.h but this doesn't count as a test for it)\n\n  VERIFY_IS_APPROX((m1*m1.transpose())*m2,  m1*(m1.transpose()*m2));\n  m3 = m1;\n  m3 *= m1.transpose() * m2;\n  VERIFY_IS_APPROX(m3,                      m1 * (m1.transpose()*m2));\n  VERIFY_IS_APPROX(m3,                      m1.lazy() * (m1.transpose()*m2));\n\n  // continue testing Product.h: distributivity\n  VERIFY_IS_APPROX(square*(m1 + m2),        square*m1+square*m2);\n  VERIFY_IS_APPROX(square*(m1 - m2),        square*m1-square*m2);\n\n  // continue testing Product.h: compatibility with ScalarMultiple.h\n  VERIFY_IS_APPROX(s1*(square*m1),          (s1*square)*m1);\n  VERIFY_IS_APPROX(s1*(square*m1),          square*(m1*s1));\n\n  // again, test operator() to check const-qualification\n  s1 += (square.lazy() * m1)(r,c);\n\n  // test Product.h together with Identity.h\n  VERIFY_IS_APPROX(v1,                      identity*v1);\n  VERIFY_IS_APPROX(v1.transpose(),          v1.transpose() * identity);\n  // again, test operator() to check const-qualification\n  VERIFY_IS_APPROX(MatrixType::Identity(rows, cols)(r,c), static_cast<Scalar>(r==c));\n\n  if (rows!=cols)\n     VERIFY_RAISES_ASSERT(m3 = m1*m1);\n\n  // test the previous tests were not screwed up because operator* returns 0\n  // (we use the more accurate default epsilon)\n  if (NumTraits<Scalar>::HasFloatingPoint && std::min(rows,cols)>1)\n  {\n    VERIFY(areNotApprox(m1.transpose()*m2,m2.transpose()*m1));\n  }\n\n  // test optimized operator+= path\n  res = square;\n  res += (m1 * m2.transpose()).lazy();\n  VERIFY_IS_APPROX(res, square + m1 * m2.transpose());\n  if (NumTraits<Scalar>::HasFloatingPoint && std::min(rows,cols)>1)\n  {\n    VERIFY(areNotApprox(res,square + m2 * m1.transpose()));\n  }\n  vcres = vc2;\n  vcres += (m1.transpose() * v1).lazy();\n  VERIFY_IS_APPROX(vcres, vc2 + m1.transpose() * v1);\n  tm1 = m1;\n  VERIFY_IS_APPROX(tm1.transpose() * v1, m1.transpose() * v1);\n  VERIFY_IS_APPROX(v1.transpose() * tm1, v1.transpose() * m1);\n\n  // test submatrix and matrix/vector product\n  for (int i=0; i<rows; ++i)\n    res.row(i) = m1.row(i) * m2.transpose();\n  VERIFY_IS_APPROX(res, m1 * m2.transpose());\n  // the other way round:\n  for (int i=0; i<rows; ++i)\n    res.col(i) = m1 * m2.transpose().col(i);\n  VERIFY_IS_APPROX(res, m1 * m2.transpose());\n\n  res2 = square2;\n  res2 += (m1.transpose() * m2).lazy();\n  VERIFY_IS_APPROX(res2, square2 + m1.transpose() * m2);\n\n  if (NumTraits<Scalar>::HasFloatingPoint && std::min(rows,cols)>1)\n  {\n    VERIFY(areNotApprox(res2,square2 + m2.transpose() * m1));\n  }\n}\n\n"
  },
  {
    "path": "libs/eigen/test/eigen2/runtest.sh",
    "content": "#!/bin/bash\n\nblack='\\E[30m'\nred='\\E[31m'\ngreen='\\E[32m'\nyellow='\\E[33m'\nblue='\\E[34m'\nmagenta='\\E[35m'\ncyan='\\E[36m'\nwhite='\\E[37m'\n\nif make test_$1 > /dev/null  2> .runtest.log ; then\n  if ! ./test_$1 r20 > /dev/null 2> .runtest.log ; then\n    echo -e  $red Test $1 failed: $black\n    echo -e $blue\n    cat .runtest.log\n    echo -e $black\n    exit 1\n  else\n  echo -e $green Test $1 passed$black\n  fi\nelse\n  echo -e  $red Build of target $1 failed: $black\n  echo -e $blue\n  cat .runtest.log\n  echo -e $black\n  exit 1\nfi\n"
  },
  {
    "path": "libs/eigen/test/eigen2/sparse.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. Eigen itself is part of the KDE project.\n//\n// Copyright (C) 2008 Daniel Gomez Ferro <dgomezferro@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_TESTSPARSE_H\n\n#include \"main.h\"\n\n#if EIGEN_GNUC_AT_LEAST(4,0) && !defined __ICC\n#include <tr1/unordered_map>\n#define EIGEN_UNORDERED_MAP_SUPPORT\nnamespace std {\n  using std::tr1::unordered_map;\n}\n#endif\n\n#ifdef EIGEN_GOOGLEHASH_SUPPORT\n  #include <google/sparse_hash_map>\n#endif\n\n#include <Eigen/Cholesky>\n#include <Eigen/LU>\n#include <Eigen/Sparse>\n\nenum {\n  ForceNonZeroDiag = 1,\n  MakeLowerTriangular = 2,\n  MakeUpperTriangular = 4,\n  ForceRealDiag = 8\n};\n\n/* Initializes both a sparse and dense matrix with same random values,\n * and a ratio of \\a density non zero entries.\n * \\param flags is a union of ForceNonZeroDiag, MakeLowerTriangular and MakeUpperTriangular\n *        allowing to control the shape of the matrix.\n * \\param zeroCoords and nonzeroCoords allows to get the coordinate lists of the non zero,\n *        and zero coefficients respectively.\n */\ntemplate<typename Scalar> void\ninitSparse(double density,\n           Matrix<Scalar,Dynamic,Dynamic>& refMat,\n           SparseMatrix<Scalar>& sparseMat,\n           int flags = 0,\n           std::vector<Vector2i>* zeroCoords = 0,\n           std::vector<Vector2i>* nonzeroCoords = 0)\n{\n  sparseMat.startFill(int(refMat.rows()*refMat.cols()*density));\n  for(int j=0; j<refMat.cols(); j++)\n  {\n    for(int i=0; i<refMat.rows(); i++)\n    {\n      Scalar v = (ei_random<double>(0,1) < density) ? ei_random<Scalar>() : Scalar(0);\n      if ((flags&ForceNonZeroDiag) && (i==j))\n      {\n        v = ei_random<Scalar>()*Scalar(3.);\n        v = v*v + Scalar(5.);\n      }\n      if ((flags & MakeLowerTriangular) && j>i)\n        v = Scalar(0);\n      else if ((flags & MakeUpperTriangular) && j<i)\n        v = Scalar(0);\n      \n      if ((flags&ForceRealDiag) && (i==j))\n        v = ei_real(v);\n        \n      if (v!=Scalar(0))\n      {\n        sparseMat.fill(i,j) = v;\n        if (nonzeroCoords)\n          nonzeroCoords->push_back(Vector2i(i,j));\n      }\n      else if (zeroCoords)\n      {\n        zeroCoords->push_back(Vector2i(i,j));\n      }\n      refMat(i,j) = v;\n    }\n  }\n  sparseMat.endFill();\n}\n\ntemplate<typename Scalar> void\ninitSparse(double density,\n           Matrix<Scalar,Dynamic,Dynamic>& refMat,\n           DynamicSparseMatrix<Scalar>& sparseMat,\n           int flags = 0,\n           std::vector<Vector2i>* zeroCoords = 0,\n           std::vector<Vector2i>* nonzeroCoords = 0)\n{\n  sparseMat.startFill(int(refMat.rows()*refMat.cols()*density));\n  for(int j=0; j<refMat.cols(); j++)\n  {\n    for(int i=0; i<refMat.rows(); i++)\n    {\n      Scalar v = (ei_random<double>(0,1) < density) ? ei_random<Scalar>() : Scalar(0);\n      if ((flags&ForceNonZeroDiag) && (i==j))\n      {\n        v = ei_random<Scalar>()*Scalar(3.);\n        v = v*v + Scalar(5.);\n      }\n      if ((flags & MakeLowerTriangular) && j>i)\n        v = Scalar(0);\n      else if ((flags & MakeUpperTriangular) && j<i)\n        v = Scalar(0);\n      \n      if ((flags&ForceRealDiag) && (i==j))\n        v = ei_real(v);\n        \n      if (v!=Scalar(0))\n      {\n        sparseMat.fill(i,j) = v;\n        if (nonzeroCoords)\n          nonzeroCoords->push_back(Vector2i(i,j));\n      }\n      else if (zeroCoords)\n      {\n        zeroCoords->push_back(Vector2i(i,j));\n      }\n      refMat(i,j) = v;\n    }\n  }\n  sparseMat.endFill();\n}\n\ntemplate<typename Scalar> void\ninitSparse(double density,\n           Matrix<Scalar,Dynamic,1>& refVec,\n           SparseVector<Scalar>& sparseVec,\n           std::vector<int>* zeroCoords = 0,\n           std::vector<int>* nonzeroCoords = 0)\n{\n  sparseVec.reserve(int(refVec.size()*density));\n  sparseVec.setZero();\n  for(int i=0; i<refVec.size(); i++)\n  {\n    Scalar v = (ei_random<double>(0,1) < density) ? ei_random<Scalar>() : Scalar(0);\n    if (v!=Scalar(0))\n    {\n      sparseVec.fill(i) = v;\n      if (nonzeroCoords)\n        nonzeroCoords->push_back(i);\n    }\n    else if (zeroCoords)\n        zeroCoords->push_back(i);\n    refVec[i] = v;\n  }\n}\n\n#endif // EIGEN_TESTSPARSE_H\n"
  },
  {
    "path": "libs/eigen/test/eigen2/testsuite.cmake",
    "content": "\n####################################################################\n#\n# Usage:\n#  - create a new folder, let's call it cdash\n#  - in that folder, do:\n#    ctest -S path/to/eigen2/test/testsuite.cmake[,option1=value1[,option2=value2]]\n#\n# Options:\n#  - EIGEN_CXX: compiler, eg.: g++-4.2\n#      default: default c++ compiler\n#  - EIGEN_SITE: eg, INRIA-Bdx_pc-gael, or the name of the contributor, etc.\n#      default: hostname\n#  - EIGEN_BUILD_STRING: a string which identify the system/compiler. It should be formed like that:\n#        <OS_name>-<OS_version>-<arch>-<compiler-version>\n#      with:\n#        <OS_name> = opensuse, debian, osx, windows, cygwin, freebsd, solaris, etc.\n#        <OS_version> = 11.1, XP, vista, leopard, etc.\n#        <arch> = i386, x86_64, ia64, powerpc, etc.\n#        <compiler-version> = gcc-4.3.2, icc-11.0, MSVC-2008, etc.\n#  - EIGEN_EXPLICIT_VECTORIZATION: novec, SSE2, Altivec\n#       default: SSE2 for x86_64 systems, novec otherwise\n#       Its value is automatically appended to EIGEN_BUILD_STRING\n#  - EIGEN_CMAKE_DIR: path to cmake executable\n#  - EIGEN_MODE: dashboard model, can be Experimental, Nightly, or Continuous\n#      default: Nightly\n#  - EIGEN_WORK_DIR: directory used to download the source files and make the builds\n#      default: folder which contains this script\n#  - EIGEN_CMAKE_ARGS: additional arguments passed to cmake\n#  - CTEST_SOURCE_DIRECTORY: path to eigen's src (use a new and empty folder, not the one you are working on)\n#      default: <EIGEN_WORK_DIR>/src\n#  - CTEST_BINARY_DIRECTORY: build directory\n#      default: <EIGEN_WORK_DIR>/nightly-<EIGEN_CXX>\n#\n# Here is an example running several compilers on a linux system:\n# #!/bin/bash\n# ARCH=`uname -m`\n# SITE=`hostname`\n# VERSION=opensuse-11.1\n# WORK_DIR=/home/gael/Coding/eigen2/cdash\n# # get the last version of the script\n# wget http://bitbucket.org/eigen/eigen/raw/tip/test/testsuite.cmake -o $WORK_DIR/testsuite.cmake\n# COMMON=\"ctest -S $WORK_DIR/testsuite.cmake,EIGEN_WORK_DIR=$WORK_DIR,EIGEN_SITE=$SITE,EIGEN_MODE=$1,EIGEN_BUILD_STRING=$OS_VERSION-$ARCH\"\n# $COMMON-gcc-3.4.6,EIGEN_CXX=g++-3.4\n# $COMMON-gcc-4.0.1,EIGEN_CXX=g++-4.0.1\n# $COMMON-gcc-4.3.2,EIGEN_CXX=g++-4.3,EIGEN_EXPLICIT_VECTORIZATION=novec\n# $COMMON-gcc-4.3.2,EIGEN_CXX=g++-4.3,EIGEN_EXPLICIT_VECTORIZATION=SSE2\n# $COMMON-icc-11.0,EIGEN_CXX=icpc\n#\n####################################################################\n\n# process the arguments\n\nset(ARGLIST ${CTEST_SCRIPT_ARG})\nwhile(${ARGLIST} MATCHES  \".+.*\")\n\n  # pick first\n  string(REGEX MATCH \"([^,]*)(,.*)?\" DUMMY ${ARGLIST})\n  SET(TOP ${CMAKE_MATCH_1})\n\n  # remove first\n  string(REGEX MATCHALL \"[^,]*,(.*)\" DUMMY ${ARGLIST})\n  SET(ARGLIST ${CMAKE_MATCH_1})\n\n  # decompose as a pair key=value\n  string(REGEX MATCH \"([^=]*)(=.*)?\" DUMMY ${TOP})\n  SET(KEY ${CMAKE_MATCH_1})\n\n  string(REGEX MATCH \"[^=]*=(.*)\" DUMMY ${TOP})\n  SET(VALUE ${CMAKE_MATCH_1})\n\n  # set the variable to the specified value\n  if(VALUE)\n    SET(${KEY} ${VALUE})\n  else(VALUE)\n    SET(${KEY} ON)\n  endif(VALUE)\n\nendwhile(${ARGLIST} MATCHES \".+.*\")\n\n####################################################################\n# Automatically set some user variables if they have not been defined manually\n####################################################################\ncmake_minimum_required(VERSION 2.6 FATAL_ERROR)\n\nif(NOT EIGEN_SITE)\n  site_name(EIGEN_SITE)\nendif(NOT EIGEN_SITE)\n\nif(NOT EIGEN_CMAKE_DIR)\n  SET(EIGEN_CMAKE_DIR \"\")\nendif(NOT EIGEN_CMAKE_DIR)\n\nif(NOT EIGEN_BUILD_STRING)\n\n  # let's try to find all information we need to make the build string ourself\n\n  # OS\n  build_name(EIGEN_OS_VERSION)\n\n  # arch\n  set(EIGEN_ARCH ${CMAKE_SYSTEM_PROCESSOR})\n  if(WIN32)\n    set(EIGEN_ARCH $ENV{PROCESSOR_ARCHITECTURE})\n  else(WIN32)\n    execute_process(COMMAND uname -m OUTPUT_VARIABLE EIGEN_ARCH OUTPUT_STRIP_TRAILING_WHITESPACE)\n  endif(WIN32)\n\n  set(EIGEN_BUILD_STRING ${EIGEN_OS_VERSION}${EIGEN_ARCH}-${EIGEN_CXX})\n\nendif(NOT EIGEN_BUILD_STRING)\n\nif(DEFINED EIGEN_EXPLICIT_VECTORIZATION)\n  set(EIGEN_BUILD_STRING ${EIGEN_BUILD_STRING}-${EIGEN_EXPLICIT_VECTORIZATION})\nendif(DEFINED EIGEN_EXPLICIT_VECTORIZATION)\n\nif(NOT EIGEN_WORK_DIR)\n  set(EIGEN_WORK_DIR ${CTEST_SCRIPT_DIRECTORY})\nendif(NOT EIGEN_WORK_DIR)\n\nif(NOT CTEST_SOURCE_DIRECTORY)\n  SET (CTEST_SOURCE_DIRECTORY \"${EIGEN_WORK_DIR}/src\")\nendif(NOT CTEST_SOURCE_DIRECTORY)\n\nif(NOT CTEST_BINARY_DIRECTORY)\n  SET (CTEST_BINARY_DIRECTORY \"${EIGEN_WORK_DIR}/nightly_${EIGEN_CXX}\")\nendif(NOT CTEST_BINARY_DIRECTORY)\n\nif(NOT EIGEN_MODE)\n  set(EIGEN_MODE Nightly)\nendif(NOT EIGEN_MODE)\n\n## mandatory variables (the default should be ok in most cases):\n\nSET (CTEST_CVS_COMMAND \"hg\")\nSET (CTEST_CVS_CHECKOUT \"${CTEST_CVS_COMMAND} clone -r 2.0 http://bitbucket.org/eigen/eigen \\\"${CTEST_SOURCE_DIRECTORY}\\\"\")\n\n# which ctest command to use for running the dashboard\nSET (CTEST_COMMAND \"${EIGEN_CMAKE_DIR}ctest -D ${EIGEN_MODE}\")\n\n# what cmake command to use for configuring this dashboard\nSET (CTEST_CMAKE_COMMAND \"${EIGEN_CMAKE_DIR}cmake -DEIGEN_BUILD_TESTS=on \")\n\n####################################################################\n# The values in this section are optional you can either\n# have them or leave them commented out\n####################################################################\n\n# this make sure we get consistent outputs\nSET($ENV{LC_MESSAGES} \"en_EN\")\n\n# should ctest wipe the binary tree before running\nSET(CTEST_START_WITH_EMPTY_BINARY_DIRECTORY TRUE)\nSET(CTEST_BACKUP_AND_RESTORE TRUE)\n\n# this is the initial cache to use for the binary tree, be careful to escape\n# any quotes inside of this string if you use it\nif(WIN32 AND NOT UNIX)\n  #message(SEND_ERROR \"win32\")\n  set(CTEST_CMAKE_COMMAND \"${CTEST_CMAKE_COMMAND} -G \\\"NMake Makefiles\\\" -DCMAKE_MAKE_PROGRAM=nmake\")\n  SET (CTEST_INITIAL_CACHE \"\n    MAKECOMMAND:STRING=nmake -i\n    CMAKE_MAKE_PROGRAM:FILEPATH=nmake\n    CMAKE_GENERATOR:INTERNAL=NMake Makefiles\n    BUILDNAME:STRING=${EIGEN_BUILD_STRING}\n    SITE:STRING=${EIGEN_SITE}\n  \")\nelse(WIN32 AND NOT UNIX)\n  SET (CTEST_INITIAL_CACHE \"\n    BUILDNAME:STRING=${EIGEN_BUILD_STRING}\n    SITE:STRING=${EIGEN_SITE}\n  \")\nendif(WIN32 AND NOT UNIX)\n\n# set any extra environment variables to use during the execution of the script here:\n\nif(EIGEN_CXX)\n  set(CTEST_ENVIRONMENT \"CXX=${EIGEN_CXX}\")\nendif(EIGEN_CXX)\n\nif(DEFINED EIGEN_EXPLICIT_VECTORIZATION)\n  if(EIGEN_EXPLICIT_VECTORIZATION MATCHES SSE2)\n    set(CTEST_CMAKE_COMMAND \"${CTEST_CMAKE_COMMAND} -DEIGEN_TEST_SSE2=ON\")\n  elseif(EIGEN_EXPLICIT_VECTORIZATION MATCHES SSE3)\n    set(CTEST_CMAKE_COMMAND \"${CTEST_CMAKE_COMMAND} -DEIGEN_TEST_SSE2=ON -DEIGEN_TEST_SSE3=ON\")\n  elseif(EIGEN_EXPLICIT_VECTORIZATION MATCHES Altivec)\n    set(CTEST_CMAKE_COMMAND \"${CTEST_CMAKE_COMMAND} -DEIGEN_TEST_ALTIVEC=ON\")\n  elseif(EIGEN_EXPLICIT_VECTORIZATION MATCHES novec)\n    set(CTEST_CMAKE_COMMAND \"${CTEST_CMAKE_COMMAND} -DEIGEN_TEST_NO_EXPLICIT_VECTORIZATION=ON\")\n  else(EIGEN_EXPLICIT_VECTORIZATION MATCHES SSE2)\n    message(FATAL_ERROR \"Invalid value for EIGEN_EXPLICIT_VECTORIZATION (${EIGEN_EXPLICIT_VECTORIZATION}), must be: novec, SSE2, SSE3, Altivec\")\n  endif(EIGEN_EXPLICIT_VECTORIZATION MATCHES SSE2)\nendif(DEFINED EIGEN_EXPLICIT_VECTORIZATION)\n\nif(DEFINED EIGEN_CMAKE_ARGS)\n  set(CTEST_CMAKE_COMMAND \"${CTEST_CMAKE_COMMAND} ${EIGEN_CMAKE_ARGS}\")\nendif(DEFINED EIGEN_CMAKE_ARGS)\n"
  },
  {
    "path": "libs/eigen/test/eigen2support.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#define EIGEN2_SUPPORT\n#define EIGEN_NO_EIGEN2_DEPRECATED_WARNING\n\n#include \"main.h\"\n\ntemplate<typename MatrixType> void eigen2support(const MatrixType& m)\n{\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  MatrixType m1 = MatrixType::Random(rows, cols),\n             m3(rows, cols);\n\n  Scalar  s1 = internal::random<Scalar>(),\n          s2 = internal::random<Scalar>();\n\n  // scalar addition\n  VERIFY_IS_APPROX(m1.cwise() + s1, s1 + m1.cwise());\n  VERIFY_IS_APPROX(m1.cwise() + s1, MatrixType::Constant(rows,cols,s1) + m1);\n  VERIFY_IS_APPROX((m1*Scalar(2)).cwise() - s2, (m1+m1) - MatrixType::Constant(rows,cols,s2) );\n  m3 = m1;\n  m3.cwise() += s2;\n  VERIFY_IS_APPROX(m3, m1.cwise() + s2);\n  m3 = m1;\n  m3.cwise() -= s1;\n  VERIFY_IS_APPROX(m3, m1.cwise() - s1);\n\n  VERIFY_IS_EQUAL((m1.corner(TopLeft,1,1)), (m1.block(0,0,1,1)));\n  VERIFY_IS_EQUAL((m1.template corner<1,1>(TopLeft)), (m1.template block<1,1>(0,0)));\n  VERIFY_IS_EQUAL((m1.col(0).start(1)), (m1.col(0).segment(0,1)));\n  VERIFY_IS_EQUAL((m1.col(0).template start<1>()), (m1.col(0).segment(0,1)));\n  VERIFY_IS_EQUAL((m1.col(0).end(1)), (m1.col(0).segment(rows-1,1)));\n  VERIFY_IS_EQUAL((m1.col(0).template end<1>()), (m1.col(0).segment(rows-1,1)));\n  \n  using std::cos;\n  using numext::real;\n  using numext::abs2;\n  VERIFY_IS_EQUAL(ei_cos(s1), cos(s1));\n  VERIFY_IS_EQUAL(ei_real(s1), real(s1));\n  VERIFY_IS_EQUAL(ei_abs2(s1), abs2(s1));\n\n  m1.minor(0,0);\n}\n\nvoid test_eigen2support()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( eigen2support(Matrix<double,1,1>()) );\n    CALL_SUBTEST_2( eigen2support(MatrixXd(1,1)) );\n    CALL_SUBTEST_4( eigen2support(Matrix3f()) );\n    CALL_SUBTEST_5( eigen2support(Matrix4d()) );\n    CALL_SUBTEST_2( eigen2support(MatrixXf(200,200)) );\n    CALL_SUBTEST_6( eigen2support(MatrixXcd(100,100)) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/eigensolver_complex.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2010 Jitse Niesen <jitse@maths.leeds.ac.uk>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <limits>\n#include <Eigen/Eigenvalues>\n#include <Eigen/LU>\n\n/* Check that two column vectors are approximately equal upto permutations,\n   by checking that the k-th power sums are equal for k = 1, ..., vec1.rows() */\ntemplate<typename VectorType>\nvoid verify_is_approx_upto_permutation(const VectorType& vec1, const VectorType& vec2)\n{\n  typedef typename NumTraits<typename VectorType::Scalar>::Real RealScalar;\n\n  VERIFY(vec1.cols() == 1);\n  VERIFY(vec2.cols() == 1);\n  VERIFY(vec1.rows() == vec2.rows());\n  for (int k = 1; k <= vec1.rows(); ++k)\n  {\n    VERIFY_IS_APPROX(vec1.array().pow(RealScalar(k)).sum(), vec2.array().pow(RealScalar(k)).sum());\n  }\n}\n\n\ntemplate<typename MatrixType> void eigensolver(const MatrixType& m)\n{\n  typedef typename MatrixType::Index Index;\n  /* this test covers the following files:\n     ComplexEigenSolver.h, and indirectly ComplexSchur.h\n  */\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n\n  MatrixType a = MatrixType::Random(rows,cols);\n  MatrixType symmA =  a.adjoint() * a;\n\n  ComplexEigenSolver<MatrixType> ei0(symmA);\n  VERIFY_IS_EQUAL(ei0.info(), Success);\n  VERIFY_IS_APPROX(symmA * ei0.eigenvectors(), ei0.eigenvectors() * ei0.eigenvalues().asDiagonal());\n\n  ComplexEigenSolver<MatrixType> ei1(a);\n  VERIFY_IS_EQUAL(ei1.info(), Success);\n  VERIFY_IS_APPROX(a * ei1.eigenvectors(), ei1.eigenvectors() * ei1.eigenvalues().asDiagonal());\n  // Note: If MatrixType is real then a.eigenvalues() uses EigenSolver and thus\n  // another algorithm so results may differ slightly\n  verify_is_approx_upto_permutation(a.eigenvalues(), ei1.eigenvalues());\n\n  ComplexEigenSolver<MatrixType> ei2;\n  ei2.setMaxIterations(ComplexSchur<MatrixType>::m_maxIterationsPerRow * rows).compute(a);\n  VERIFY_IS_EQUAL(ei2.info(), Success);\n  VERIFY_IS_EQUAL(ei2.eigenvectors(), ei1.eigenvectors());\n  VERIFY_IS_EQUAL(ei2.eigenvalues(), ei1.eigenvalues());\n  if (rows > 2) {\n    ei2.setMaxIterations(1).compute(a);\n    VERIFY_IS_EQUAL(ei2.info(), NoConvergence);\n    VERIFY_IS_EQUAL(ei2.getMaxIterations(), 1);\n  }\n\n  ComplexEigenSolver<MatrixType> eiNoEivecs(a, false);\n  VERIFY_IS_EQUAL(eiNoEivecs.info(), Success);\n  VERIFY_IS_APPROX(ei1.eigenvalues(), eiNoEivecs.eigenvalues());\n\n  // Regression test for issue #66\n  MatrixType z = MatrixType::Zero(rows,cols);\n  ComplexEigenSolver<MatrixType> eiz(z);\n  VERIFY((eiz.eigenvalues().cwiseEqual(0)).all());\n\n  MatrixType id = MatrixType::Identity(rows, cols);\n  VERIFY_IS_APPROX(id.operatorNorm(), RealScalar(1));\n\n  if (rows > 1)\n  {\n    // Test matrix with NaN\n    a(0,0) = std::numeric_limits<typename MatrixType::RealScalar>::quiet_NaN();\n    ComplexEigenSolver<MatrixType> eiNaN(a);\n    VERIFY_IS_EQUAL(eiNaN.info(), NoConvergence);\n  }\n}\n\ntemplate<typename MatrixType> void eigensolver_verify_assert(const MatrixType& m)\n{\n  ComplexEigenSolver<MatrixType> eig;\n  VERIFY_RAISES_ASSERT(eig.eigenvectors());\n  VERIFY_RAISES_ASSERT(eig.eigenvalues());\n\n  MatrixType a = MatrixType::Random(m.rows(),m.cols());\n  eig.compute(a, false);\n  VERIFY_RAISES_ASSERT(eig.eigenvectors());\n}\n\nvoid test_eigensolver_complex()\n{\n  int s = 0;\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( eigensolver(Matrix4cf()) );\n    s = internal::random<int>(1,EIGEN_TEST_MAX_SIZE/4);\n    CALL_SUBTEST_2( eigensolver(MatrixXcd(s,s)) );\n    CALL_SUBTEST_3( eigensolver(Matrix<std::complex<float>, 1, 1>()) );\n    CALL_SUBTEST_4( eigensolver(Matrix3f()) );\n  }\n  CALL_SUBTEST_1( eigensolver_verify_assert(Matrix4cf()) );\n  s = internal::random<int>(1,EIGEN_TEST_MAX_SIZE/4);\n  CALL_SUBTEST_2( eigensolver_verify_assert(MatrixXcd(s,s)) );\n  CALL_SUBTEST_3( eigensolver_verify_assert(Matrix<std::complex<float>, 1, 1>()) );\n  CALL_SUBTEST_4( eigensolver_verify_assert(Matrix3f()) );\n\n  // Test problem size constructors\n  CALL_SUBTEST_5(ComplexEigenSolver<MatrixXf> tmp(s));\n  \n  TEST_SET_BUT_UNUSED_VARIABLE(s)\n}\n"
  },
  {
    "path": "libs/eigen/test/eigensolver_generalized_real.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <limits>\n#include <Eigen/Eigenvalues>\n\ntemplate<typename MatrixType> void generalized_eigensolver_real(const MatrixType& m)\n{\n  typedef typename MatrixType::Index Index;\n  /* this test covers the following files:\n     GeneralizedEigenSolver.h\n  */\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  typedef typename MatrixType::Scalar Scalar;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> VectorType;\n\n  MatrixType a = MatrixType::Random(rows,cols);\n  MatrixType b = MatrixType::Random(rows,cols);\n  MatrixType a1 = MatrixType::Random(rows,cols);\n  MatrixType b1 = MatrixType::Random(rows,cols);\n  MatrixType spdA =  a.adjoint() * a + a1.adjoint() * a1;\n  MatrixType spdB =  b.adjoint() * b + b1.adjoint() * b1;\n\n  // lets compare to GeneralizedSelfAdjointEigenSolver\n  GeneralizedSelfAdjointEigenSolver<MatrixType> symmEig(spdA, spdB);\n  GeneralizedEigenSolver<MatrixType> eig(spdA, spdB);\n\n  VERIFY_IS_EQUAL(eig.eigenvalues().imag().cwiseAbs().maxCoeff(), 0);\n\n  VectorType realEigenvalues = eig.eigenvalues().real();\n  std::sort(realEigenvalues.data(), realEigenvalues.data()+realEigenvalues.size());\n  VERIFY_IS_APPROX(realEigenvalues, symmEig.eigenvalues());\n}\n\nvoid test_eigensolver_generalized_real()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    int s = 0;\n    CALL_SUBTEST_1( generalized_eigensolver_real(Matrix4f()) );\n    s = internal::random<int>(1,EIGEN_TEST_MAX_SIZE/4);\n    CALL_SUBTEST_2( generalized_eigensolver_real(MatrixXd(s,s)) );\n\n    // some trivial but implementation-wise tricky cases\n    CALL_SUBTEST_2( generalized_eigensolver_real(MatrixXd(1,1)) );\n    CALL_SUBTEST_2( generalized_eigensolver_real(MatrixXd(2,2)) );\n    CALL_SUBTEST_3( generalized_eigensolver_real(Matrix<double,1,1>()) );\n    CALL_SUBTEST_4( generalized_eigensolver_real(Matrix2d()) );\n    TEST_SET_BUT_UNUSED_VARIABLE(s)\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/eigensolver_generic.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2010,2012 Jitse Niesen <jitse@maths.leeds.ac.uk>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <limits>\n#include <Eigen/Eigenvalues>\n\ntemplate<typename MatrixType> void eigensolver(const MatrixType& m)\n{\n  typedef typename MatrixType::Index Index;\n  /* this test covers the following files:\n     EigenSolver.h\n  */\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  typedef Matrix<RealScalar, MatrixType::RowsAtCompileTime, 1> RealVectorType;\n  typedef typename std::complex<typename NumTraits<typename MatrixType::Scalar>::Real> Complex;\n\n  MatrixType a = MatrixType::Random(rows,cols);\n  MatrixType a1 = MatrixType::Random(rows,cols);\n  MatrixType symmA =  a.adjoint() * a + a1.adjoint() * a1;\n\n  EigenSolver<MatrixType> ei0(symmA);\n  VERIFY_IS_EQUAL(ei0.info(), Success);\n  VERIFY_IS_APPROX(symmA * ei0.pseudoEigenvectors(), ei0.pseudoEigenvectors() * ei0.pseudoEigenvalueMatrix());\n  VERIFY_IS_APPROX((symmA.template cast<Complex>()) * (ei0.pseudoEigenvectors().template cast<Complex>()),\n    (ei0.pseudoEigenvectors().template cast<Complex>()) * (ei0.eigenvalues().asDiagonal()));\n\n  EigenSolver<MatrixType> ei1(a);\n  VERIFY_IS_EQUAL(ei1.info(), Success);\n  VERIFY_IS_APPROX(a * ei1.pseudoEigenvectors(), ei1.pseudoEigenvectors() * ei1.pseudoEigenvalueMatrix());\n  VERIFY_IS_APPROX(a.template cast<Complex>() * ei1.eigenvectors(),\n                   ei1.eigenvectors() * ei1.eigenvalues().asDiagonal());\n  VERIFY_IS_APPROX(ei1.eigenvectors().colwise().norm(), RealVectorType::Ones(rows).transpose());\n  VERIFY_IS_APPROX(a.eigenvalues(), ei1.eigenvalues());\n\n  EigenSolver<MatrixType> ei2;\n  ei2.setMaxIterations(RealSchur<MatrixType>::m_maxIterationsPerRow * rows).compute(a);\n  VERIFY_IS_EQUAL(ei2.info(), Success);\n  VERIFY_IS_EQUAL(ei2.eigenvectors(), ei1.eigenvectors());\n  VERIFY_IS_EQUAL(ei2.eigenvalues(), ei1.eigenvalues());\n  if (rows > 2) {\n    ei2.setMaxIterations(1).compute(a);\n    VERIFY_IS_EQUAL(ei2.info(), NoConvergence);\n    VERIFY_IS_EQUAL(ei2.getMaxIterations(), 1);\n  }\n\n  EigenSolver<MatrixType> eiNoEivecs(a, false);\n  VERIFY_IS_EQUAL(eiNoEivecs.info(), Success);\n  VERIFY_IS_APPROX(ei1.eigenvalues(), eiNoEivecs.eigenvalues());\n  VERIFY_IS_APPROX(ei1.pseudoEigenvalueMatrix(), eiNoEivecs.pseudoEigenvalueMatrix());\n\n  MatrixType id = MatrixType::Identity(rows, cols);\n  VERIFY_IS_APPROX(id.operatorNorm(), RealScalar(1));\n\n  if (rows > 2)\n  {\n    // Test matrix with NaN\n    a(0,0) = std::numeric_limits<typename MatrixType::RealScalar>::quiet_NaN();\n    EigenSolver<MatrixType> eiNaN(a);\n    VERIFY_IS_EQUAL(eiNaN.info(), NoConvergence);\n  }\n}\n\ntemplate<typename MatrixType> void eigensolver_verify_assert(const MatrixType& m)\n{\n  EigenSolver<MatrixType> eig;\n  VERIFY_RAISES_ASSERT(eig.eigenvectors());\n  VERIFY_RAISES_ASSERT(eig.pseudoEigenvectors());\n  VERIFY_RAISES_ASSERT(eig.pseudoEigenvalueMatrix());\n  VERIFY_RAISES_ASSERT(eig.eigenvalues());\n\n  MatrixType a = MatrixType::Random(m.rows(),m.cols());\n  eig.compute(a, false);\n  VERIFY_RAISES_ASSERT(eig.eigenvectors());\n  VERIFY_RAISES_ASSERT(eig.pseudoEigenvectors());\n}\n\nvoid test_eigensolver_generic()\n{\n  int s = 0;\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( eigensolver(Matrix4f()) );\n    s = internal::random<int>(1,EIGEN_TEST_MAX_SIZE/4);\n    CALL_SUBTEST_2( eigensolver(MatrixXd(s,s)) );\n\n    // some trivial but implementation-wise tricky cases\n    CALL_SUBTEST_2( eigensolver(MatrixXd(1,1)) );\n    CALL_SUBTEST_2( eigensolver(MatrixXd(2,2)) );\n    CALL_SUBTEST_3( eigensolver(Matrix<double,1,1>()) );\n    CALL_SUBTEST_4( eigensolver(Matrix2d()) );\n  }\n\n  CALL_SUBTEST_1( eigensolver_verify_assert(Matrix4f()) );\n  s = internal::random<int>(1,EIGEN_TEST_MAX_SIZE/4);\n  CALL_SUBTEST_2( eigensolver_verify_assert(MatrixXd(s,s)) );\n  CALL_SUBTEST_3( eigensolver_verify_assert(Matrix<double,1,1>()) );\n  CALL_SUBTEST_4( eigensolver_verify_assert(Matrix2d()) );\n\n  // Test problem size constructors\n  CALL_SUBTEST_5(EigenSolver<MatrixXf> tmp(s));\n\n  // regression test for bug 410\n  CALL_SUBTEST_2(\n  {\n     MatrixXd A(1,1);\n     A(0,0) = std::sqrt(-1.);\n     Eigen::EigenSolver<MatrixXd> solver(A);\n     MatrixXd V(1, 1);\n     V(0,0) = solver.eigenvectors()(0,0).real();\n  }\n  );\n  \n  TEST_SET_BUT_UNUSED_VARIABLE(s)\n}\n"
  },
  {
    "path": "libs/eigen/test/eigensolver_selfadjoint.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2010 Jitse Niesen <jitse@maths.leeds.ac.uk>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <limits>\n#include <Eigen/Eigenvalues>\n\ntemplate<typename MatrixType> void selfadjointeigensolver(const MatrixType& m)\n{\n  typedef typename MatrixType::Index Index;\n  /* this test covers the following files:\n     EigenSolver.h, SelfAdjointEigenSolver.h (and indirectly: Tridiagonalization.h)\n  */\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n\n  RealScalar largerEps = 10*test_precision<RealScalar>();\n\n  MatrixType a = MatrixType::Random(rows,cols);\n  MatrixType a1 = MatrixType::Random(rows,cols);\n  MatrixType symmA =  a.adjoint() * a + a1.adjoint() * a1;\n  MatrixType symmC = symmA;\n  \n  // randomly nullify some rows/columns\n  {\n    Index count = 1;//internal::random<Index>(-cols,cols);\n    for(Index k=0; k<count; ++k)\n    {\n      Index i = internal::random<Index>(0,cols-1);\n      symmA.row(i).setZero();\n      symmA.col(i).setZero();\n    }\n  }\n  \n  symmA.template triangularView<StrictlyUpper>().setZero();\n  symmC.template triangularView<StrictlyUpper>().setZero();\n\n  MatrixType b = MatrixType::Random(rows,cols);\n  MatrixType b1 = MatrixType::Random(rows,cols);\n  MatrixType symmB = b.adjoint() * b + b1.adjoint() * b1;\n  symmB.template triangularView<StrictlyUpper>().setZero();\n\n  SelfAdjointEigenSolver<MatrixType> eiSymm(symmA);\n  SelfAdjointEigenSolver<MatrixType> eiDirect;\n  eiDirect.computeDirect(symmA);\n  // generalized eigen pb\n  GeneralizedSelfAdjointEigenSolver<MatrixType> eiSymmGen(symmC, symmB);\n\n  VERIFY_IS_EQUAL(eiSymm.info(), Success);\n  VERIFY((symmA.template selfadjointView<Lower>() * eiSymm.eigenvectors()).isApprox(\n          eiSymm.eigenvectors() * eiSymm.eigenvalues().asDiagonal(), largerEps));\n  VERIFY_IS_APPROX(symmA.template selfadjointView<Lower>().eigenvalues(), eiSymm.eigenvalues());\n  \n  VERIFY_IS_EQUAL(eiDirect.info(), Success);\n  VERIFY((symmA.template selfadjointView<Lower>() * eiDirect.eigenvectors()).isApprox(\n          eiDirect.eigenvectors() * eiDirect.eigenvalues().asDiagonal(), largerEps));\n  VERIFY_IS_APPROX(symmA.template selfadjointView<Lower>().eigenvalues(), eiDirect.eigenvalues());\n\n  SelfAdjointEigenSolver<MatrixType> eiSymmNoEivecs(symmA, false);\n  VERIFY_IS_EQUAL(eiSymmNoEivecs.info(), Success);\n  VERIFY_IS_APPROX(eiSymm.eigenvalues(), eiSymmNoEivecs.eigenvalues());\n  \n  // generalized eigen problem Ax = lBx\n  eiSymmGen.compute(symmC, symmB,Ax_lBx);\n  VERIFY_IS_EQUAL(eiSymmGen.info(), Success);\n  VERIFY((symmC.template selfadjointView<Lower>() * eiSymmGen.eigenvectors()).isApprox(\n          symmB.template selfadjointView<Lower>() * (eiSymmGen.eigenvectors() * eiSymmGen.eigenvalues().asDiagonal()), largerEps));\n\n  // generalized eigen problem BAx = lx\n  eiSymmGen.compute(symmC, symmB,BAx_lx);\n  VERIFY_IS_EQUAL(eiSymmGen.info(), Success);\n  VERIFY((symmB.template selfadjointView<Lower>() * (symmC.template selfadjointView<Lower>() * eiSymmGen.eigenvectors())).isApprox(\n         (eiSymmGen.eigenvectors() * eiSymmGen.eigenvalues().asDiagonal()), largerEps));\n\n  // generalized eigen problem ABx = lx\n  eiSymmGen.compute(symmC, symmB,ABx_lx);\n  VERIFY_IS_EQUAL(eiSymmGen.info(), Success);\n  VERIFY((symmC.template selfadjointView<Lower>() * (symmB.template selfadjointView<Lower>() * eiSymmGen.eigenvectors())).isApprox(\n         (eiSymmGen.eigenvectors() * eiSymmGen.eigenvalues().asDiagonal()), largerEps));\n\n\n  eiSymm.compute(symmC);\n  MatrixType sqrtSymmA = eiSymm.operatorSqrt();\n  VERIFY_IS_APPROX(MatrixType(symmC.template selfadjointView<Lower>()), sqrtSymmA*sqrtSymmA);\n  VERIFY_IS_APPROX(sqrtSymmA, symmC.template selfadjointView<Lower>()*eiSymm.operatorInverseSqrt());\n\n  MatrixType id = MatrixType::Identity(rows, cols);\n  VERIFY_IS_APPROX(id.template selfadjointView<Lower>().operatorNorm(), RealScalar(1));\n\n  SelfAdjointEigenSolver<MatrixType> eiSymmUninitialized;\n  VERIFY_RAISES_ASSERT(eiSymmUninitialized.info());\n  VERIFY_RAISES_ASSERT(eiSymmUninitialized.eigenvalues());\n  VERIFY_RAISES_ASSERT(eiSymmUninitialized.eigenvectors());\n  VERIFY_RAISES_ASSERT(eiSymmUninitialized.operatorSqrt());\n  VERIFY_RAISES_ASSERT(eiSymmUninitialized.operatorInverseSqrt());\n\n  eiSymmUninitialized.compute(symmA, false);\n  VERIFY_RAISES_ASSERT(eiSymmUninitialized.eigenvectors());\n  VERIFY_RAISES_ASSERT(eiSymmUninitialized.operatorSqrt());\n  VERIFY_RAISES_ASSERT(eiSymmUninitialized.operatorInverseSqrt());\n\n  // test Tridiagonalization's methods\n  Tridiagonalization<MatrixType> tridiag(symmC);\n  // FIXME tridiag.matrixQ().adjoint() does not work\n  VERIFY_IS_APPROX(MatrixType(symmC.template selfadjointView<Lower>()), tridiag.matrixQ() * tridiag.matrixT().eval() * MatrixType(tridiag.matrixQ()).adjoint());\n  \n  if (rows > 1)\n  {\n    // Test matrix with NaN\n    symmC(0,0) = std::numeric_limits<typename MatrixType::RealScalar>::quiet_NaN();\n    SelfAdjointEigenSolver<MatrixType> eiSymmNaN(symmC);\n    VERIFY_IS_EQUAL(eiSymmNaN.info(), NoConvergence);\n  }\n}\n\nvoid test_eigensolver_selfadjoint()\n{\n  int s = 0;\n  for(int i = 0; i < g_repeat; i++) {\n    // very important to test 3x3 and 2x2 matrices since we provide special paths for them\n    CALL_SUBTEST_1( selfadjointeigensolver(Matrix2f()) );\n    CALL_SUBTEST_1( selfadjointeigensolver(Matrix2d()) );\n    CALL_SUBTEST_1( selfadjointeigensolver(Matrix3f()) );\n    CALL_SUBTEST_1( selfadjointeigensolver(Matrix3d()) );\n    CALL_SUBTEST_2( selfadjointeigensolver(Matrix4d()) );\n    s = internal::random<int>(1,EIGEN_TEST_MAX_SIZE/4);\n    CALL_SUBTEST_3( selfadjointeigensolver(MatrixXf(s,s)) );\n    s = internal::random<int>(1,EIGEN_TEST_MAX_SIZE/4);\n    CALL_SUBTEST_4( selfadjointeigensolver(MatrixXd(s,s)) );\n    s = internal::random<int>(1,EIGEN_TEST_MAX_SIZE/4);\n    CALL_SUBTEST_5( selfadjointeigensolver(MatrixXcd(s,s)) );\n    \n    s = internal::random<int>(1,EIGEN_TEST_MAX_SIZE/4);\n    CALL_SUBTEST_9( selfadjointeigensolver(Matrix<std::complex<double>,Dynamic,Dynamic,RowMajor>(s,s)) );\n\n    // some trivial but implementation-wise tricky cases\n    CALL_SUBTEST_4( selfadjointeigensolver(MatrixXd(1,1)) );\n    CALL_SUBTEST_4( selfadjointeigensolver(MatrixXd(2,2)) );\n    CALL_SUBTEST_6( selfadjointeigensolver(Matrix<double,1,1>()) );\n    CALL_SUBTEST_7( selfadjointeigensolver(Matrix<double,2,2>()) );\n  }\n\n  // Test problem size constructors\n  s = internal::random<int>(1,EIGEN_TEST_MAX_SIZE/4);\n  CALL_SUBTEST_8(SelfAdjointEigenSolver<MatrixXf> tmp1(s));\n  CALL_SUBTEST_8(Tridiagonalization<MatrixXf> tmp2(s));\n  \n  TEST_SET_BUT_UNUSED_VARIABLE(s)\n}\n\n"
  },
  {
    "path": "libs/eigen/test/exceptions.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2011 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n// Various sanity tests with exceptions:\n//  - no memory leak when a custom scalar type trow an exceptions\n//  - todo: complete the list of tests!\n\n#define EIGEN_STACK_ALLOCATION_LIMIT 100000000\n\n#include \"main.h\"\n\nstruct my_exception\n{\n  my_exception() {}\n  ~my_exception() {}\n};\n    \nclass ScalarWithExceptions\n{\n  public:\n    ScalarWithExceptions() { init(); }\n    ScalarWithExceptions(const float& _v) { init(); *v = _v; }\n    ScalarWithExceptions(const ScalarWithExceptions& other) { init(); *v = *(other.v); }\n    ~ScalarWithExceptions() {\n      delete v;\n      instances--;\n    }\n\n    void init() {\n      v = new float;\n      instances++;\n    }\n\n    ScalarWithExceptions operator+(const ScalarWithExceptions& other) const\n    {\n      countdown--;\n      if(countdown<=0)\n        throw my_exception();\n      return ScalarWithExceptions(*v+*other.v);\n    }\n    \n    ScalarWithExceptions operator-(const ScalarWithExceptions& other) const\n    { return ScalarWithExceptions(*v-*other.v); }\n    \n    ScalarWithExceptions operator*(const ScalarWithExceptions& other) const\n    { return ScalarWithExceptions((*v)*(*other.v)); }\n    \n    ScalarWithExceptions& operator+=(const ScalarWithExceptions& other)\n    { *v+=*other.v; return *this; }\n    ScalarWithExceptions& operator-=(const ScalarWithExceptions& other)\n    { *v-=*other.v; return *this; }\n    ScalarWithExceptions& operator=(const ScalarWithExceptions& other)\n    { *v = *(other.v); return *this; }\n  \n    bool operator==(const ScalarWithExceptions& other) const\n    { return *v==*other.v; }\n    bool operator!=(const ScalarWithExceptions& other) const\n    { return *v!=*other.v; }\n    \n    float* v;\n    static int instances;\n    static int countdown;\n};\n\nScalarWithExceptions real(const ScalarWithExceptions &x) { return x; }\nScalarWithExceptions imag(const ScalarWithExceptions & ) { return 0; }\nScalarWithExceptions conj(const ScalarWithExceptions &x) { return x; }\n\nint ScalarWithExceptions::instances = 0;\nint ScalarWithExceptions::countdown = 0;\n\n\n#define CHECK_MEMLEAK(OP) {                                 \\\n    ScalarWithExceptions::countdown = 100;                  \\\n    int before = ScalarWithExceptions::instances;           \\\n    bool exception_thrown = false;                         \\\n    try { OP; }                              \\\n    catch (my_exception) {                                  \\\n      exception_thrown = true;                              \\\n      VERIFY(ScalarWithExceptions::instances==before && \"memory leak detected in \" && EIGEN_MAKESTRING(OP)); \\\n    } \\\n    VERIFY(exception_thrown && \" no exception thrown in \" && EIGEN_MAKESTRING(OP)); \\\n  }\n\nvoid memoryleak()\n{\n  typedef Eigen::Matrix<ScalarWithExceptions,Dynamic,1> VectorType;\n  typedef Eigen::Matrix<ScalarWithExceptions,Dynamic,Dynamic> MatrixType;\n  \n  {\n    int n = 50;\n    VectorType v0(n), v1(n);\n    MatrixType m0(n,n), m1(n,n), m2(n,n);\n    v0.setOnes(); v1.setOnes();\n    m0.setOnes(); m1.setOnes(); m2.setOnes();\n    CHECK_MEMLEAK(v0 = m0 * m1 * v1);\n    CHECK_MEMLEAK(m2 = m0 * m1 * m2);\n    CHECK_MEMLEAK((v0+v1).dot(v0+v1));\n  }\n  VERIFY(ScalarWithExceptions::instances==0 && \"global memory leak detected in \" && EIGEN_MAKESTRING(OP)); \\\n}\n\nvoid test_exceptions()\n{\n  CALL_SUBTEST( memoryleak() );\n}\n"
  },
  {
    "path": "libs/eigen/test/first_aligned.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\ntemplate<typename Scalar>\nvoid test_first_aligned_helper(Scalar *array, int size)\n{\n  const int packet_size = sizeof(Scalar) * internal::packet_traits<Scalar>::size;\n  VERIFY(((size_t(array) + sizeof(Scalar) * internal::first_aligned(array, size)) % packet_size) == 0);\n}\n\ntemplate<typename Scalar>\nvoid test_none_aligned_helper(Scalar *array, int size)\n{\n  EIGEN_UNUSED_VARIABLE(array);\n  EIGEN_UNUSED_VARIABLE(size);\n  VERIFY(internal::packet_traits<Scalar>::size == 1 || internal::first_aligned(array, size) == size);\n}\n\nstruct some_non_vectorizable_type { float x; };\n\nvoid test_first_aligned()\n{\n  EIGEN_ALIGN16 float array_float[100];\n  test_first_aligned_helper(array_float, 50);\n  test_first_aligned_helper(array_float+1, 50);\n  test_first_aligned_helper(array_float+2, 50);\n  test_first_aligned_helper(array_float+3, 50);\n  test_first_aligned_helper(array_float+4, 50);\n  test_first_aligned_helper(array_float+5, 50);\n  \n  EIGEN_ALIGN16 double array_double[100];\n  test_first_aligned_helper(array_double, 50);\n  test_first_aligned_helper(array_double+1, 50);\n  test_first_aligned_helper(array_double+2, 50);\n  \n  double *array_double_plus_4_bytes = (double*)(size_t(array_double)+4);\n  test_none_aligned_helper(array_double_plus_4_bytes, 50);\n  test_none_aligned_helper(array_double_plus_4_bytes+1, 50);\n  \n  some_non_vectorizable_type array_nonvec[100];\n  test_first_aligned_helper(array_nonvec, 100);\n  test_none_aligned_helper(array_nonvec, 100);\n}\n"
  },
  {
    "path": "libs/eigen/test/geo_alignedbox.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <Eigen/Geometry>\n#include <Eigen/LU>\n#include <Eigen/QR>\n\n#include<iostream>\nusing namespace std;\n\ntemplate<typename T> EIGEN_DONT_INLINE\nvoid kill_extra_precision(T& x) { eigen_assert(&x != 0); }\n\n\ntemplate<typename BoxType> void alignedbox(const BoxType& _box)\n{\n  /* this test covers the following files:\n     AlignedBox.h\n  */\n  typedef typename BoxType::Index Index;  \n  typedef typename BoxType::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  typedef Matrix<Scalar, BoxType::AmbientDimAtCompileTime, 1> VectorType;\n\n  const Index dim = _box.dim();\n\n  VectorType p0 = VectorType::Random(dim);\n  VectorType p1 = VectorType::Random(dim);\n  while( p1 == p0 ){\n      p1 =  VectorType::Random(dim); }\n  RealScalar s1 = internal::random<RealScalar>(0,1);\n\n  BoxType b0(dim);\n  BoxType b1(VectorType::Random(dim),VectorType::Random(dim));\n  BoxType b2;\n  \n  kill_extra_precision(b1);\n  kill_extra_precision(p0);\n  kill_extra_precision(p1);\n\n  b0.extend(p0);\n  b0.extend(p1);\n  VERIFY(b0.contains(p0*s1+(Scalar(1)-s1)*p1));\n\n  (b2 = b0).extend(b1);\n  VERIFY(b2.contains(b0));\n  VERIFY(b2.contains(b1));\n  VERIFY_IS_APPROX(b2.clamp(b0), b0);\n\n\n  // alignment -- make sure there is no memory alignment assertion\n  BoxType *bp0 = new BoxType(dim);\n  BoxType *bp1 = new BoxType(dim);\n  bp0->extend(*bp1);\n  delete bp0;\n  delete bp1;\n\n  // sampling\n  for( int i=0; i<10; ++i )\n  {\n      VectorType r = b0.sample();\n      VERIFY(b0.contains(r));\n  }\n\n}\n\n\n\ntemplate<typename BoxType>\nvoid alignedboxCastTests(const BoxType& _box)\n{\n  // casting  \n  typedef typename BoxType::Index Index;\n  typedef typename BoxType::Scalar Scalar;\n  typedef Matrix<Scalar, BoxType::AmbientDimAtCompileTime, 1> VectorType;\n\n  const Index dim = _box.dim();\n\n  VectorType p0 = VectorType::Random(dim);\n  VectorType p1 = VectorType::Random(dim);\n\n  BoxType b0(dim);\n\n  b0.extend(p0);\n  b0.extend(p1);\n\n  const int Dim = BoxType::AmbientDimAtCompileTime;\n  typedef typename GetDifferentType<Scalar>::type OtherScalar;\n  AlignedBox<OtherScalar,Dim> hp1f = b0.template cast<OtherScalar>();\n  VERIFY_IS_APPROX(hp1f.template cast<Scalar>(),b0);\n  AlignedBox<Scalar,Dim> hp1d = b0.template cast<Scalar>();\n  VERIFY_IS_APPROX(hp1d.template cast<Scalar>(),b0);\n}\n\n\nvoid specificTest1()\n{\n    Vector2f m; m << -1.0f, -2.0f;\n    Vector2f M; M <<  1.0f,  5.0f;\n\n    typedef AlignedBox2f  BoxType;\n    BoxType box( m, M );\n\n    Vector2f sides = M-m;\n    VERIFY_IS_APPROX(sides, box.sizes() );\n    VERIFY_IS_APPROX(sides[1], box.sizes()[1] );\n    VERIFY_IS_APPROX(sides[1], box.sizes().maxCoeff() );\n    VERIFY_IS_APPROX(sides[0], box.sizes().minCoeff() );\n\n    VERIFY_IS_APPROX( 14.0f, box.volume() );\n    VERIFY_IS_APPROX( 53.0f, box.diagonal().squaredNorm() );\n    VERIFY_IS_APPROX( std::sqrt( 53.0f ), box.diagonal().norm() );\n\n    VERIFY_IS_APPROX( m, box.corner( BoxType::BottomLeft ) );\n    VERIFY_IS_APPROX( M, box.corner( BoxType::TopRight ) );\n    Vector2f bottomRight; bottomRight << M[0], m[1];\n    Vector2f topLeft; topLeft << m[0], M[1];\n    VERIFY_IS_APPROX( bottomRight, box.corner( BoxType::BottomRight ) );\n    VERIFY_IS_APPROX( topLeft, box.corner( BoxType::TopLeft ) );\n}\n\n\nvoid specificTest2()\n{\n    Vector3i m; m << -1, -2, 0;\n    Vector3i M; M <<  1,  5, 3;\n\n    typedef AlignedBox3i  BoxType;\n    BoxType box( m, M );\n\n    Vector3i sides = M-m;\n    VERIFY_IS_APPROX(sides, box.sizes() );\n    VERIFY_IS_APPROX(sides[1], box.sizes()[1] );\n    VERIFY_IS_APPROX(sides[1], box.sizes().maxCoeff() );\n    VERIFY_IS_APPROX(sides[0], box.sizes().minCoeff() );\n\n    VERIFY_IS_APPROX( 42, box.volume() );\n    VERIFY_IS_APPROX( 62, box.diagonal().squaredNorm() );\n\n    VERIFY_IS_APPROX( m, box.corner( BoxType::BottomLeftFloor ) );\n    VERIFY_IS_APPROX( M, box.corner( BoxType::TopRightCeil ) );\n    Vector3i bottomRightFloor; bottomRightFloor << M[0], m[1], m[2];\n    Vector3i topLeftFloor; topLeftFloor << m[0], M[1], m[2];\n    VERIFY_IS_APPROX( bottomRightFloor, box.corner( BoxType::BottomRightFloor ) );\n    VERIFY_IS_APPROX( topLeftFloor, box.corner( BoxType::TopLeftFloor ) );\n}\n\n\nvoid test_geo_alignedbox()\n{\n  for(int i = 0; i < g_repeat; i++)\n  {\n    CALL_SUBTEST_1( alignedbox(AlignedBox2f()) );\n    CALL_SUBTEST_2( alignedboxCastTests(AlignedBox2f()) );\n\n    CALL_SUBTEST_3( alignedbox(AlignedBox3f()) );\n    CALL_SUBTEST_4( alignedboxCastTests(AlignedBox3f()) );\n\n    CALL_SUBTEST_5( alignedbox(AlignedBox4d()) );\n    CALL_SUBTEST_6( alignedboxCastTests(AlignedBox4d()) );\n\n    CALL_SUBTEST_7( alignedbox(AlignedBox1d()) );\n    CALL_SUBTEST_8( alignedboxCastTests(AlignedBox1d()) );\n\n    CALL_SUBTEST_9( alignedbox(AlignedBox1i()) );\n    CALL_SUBTEST_10( alignedbox(AlignedBox2i()) );\n    CALL_SUBTEST_11( alignedbox(AlignedBox3i()) );\n\n    CALL_SUBTEST_14( alignedbox(AlignedBox<double,Dynamic>(4)) );\n  }\n  CALL_SUBTEST_12( specificTest1() );\n  CALL_SUBTEST_13( specificTest2() );\n}\n"
  },
  {
    "path": "libs/eigen/test/geo_eulerangles.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2012 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <Eigen/Geometry>\n#include <Eigen/LU>\n#include <Eigen/SVD>\n\n\ntemplate<typename Scalar>\nvoid verify_euler(const Matrix<Scalar,3,1>& ea, int i, int j, int k)\n{\n  typedef Matrix<Scalar,3,3> Matrix3;\n  typedef Matrix<Scalar,3,1> Vector3;\n  typedef AngleAxis<Scalar> AngleAxisx;\n  using std::abs;\n  Matrix3 m(AngleAxisx(ea[0], Vector3::Unit(i)) * AngleAxisx(ea[1], Vector3::Unit(j)) * AngleAxisx(ea[2], Vector3::Unit(k)));\n  Vector3 eabis = m.eulerAngles(i, j, k);\n  Matrix3 mbis(AngleAxisx(eabis[0], Vector3::Unit(i)) * AngleAxisx(eabis[1], Vector3::Unit(j)) * AngleAxisx(eabis[2], Vector3::Unit(k))); \n  VERIFY_IS_APPROX(m,  mbis); \n  /* If I==K, and ea[1]==0, then there no unique solution. */ \n  /* The remark apply in the case where I!=K, and |ea[1]| is close to pi/2. */ \n  if( (i!=k || ea[1]!=0) && (i==k || !internal::isApprox(abs(ea[1]),Scalar(M_PI/2),test_precision<Scalar>())) ) \n    VERIFY((ea-eabis).norm() <= test_precision<Scalar>());\n  \n  // approx_or_less_than does not work for 0\n  VERIFY(0 < eabis[0] || test_isMuchSmallerThan(eabis[0], Scalar(1)));\n  VERIFY_IS_APPROX_OR_LESS_THAN(eabis[0], Scalar(M_PI));\n  VERIFY_IS_APPROX_OR_LESS_THAN(-Scalar(M_PI), eabis[1]);\n  VERIFY_IS_APPROX_OR_LESS_THAN(eabis[1], Scalar(M_PI));\n  VERIFY_IS_APPROX_OR_LESS_THAN(-Scalar(M_PI), eabis[2]);\n  VERIFY_IS_APPROX_OR_LESS_THAN(eabis[2], Scalar(M_PI));\n}\n\ntemplate<typename Scalar> void check_all_var(const Matrix<Scalar,3,1>& ea)\n{\n  verify_euler(ea, 0,1,2);\n  verify_euler(ea, 0,1,0);\n  verify_euler(ea, 0,2,1);\n  verify_euler(ea, 0,2,0);\n\n  verify_euler(ea, 1,2,0);\n  verify_euler(ea, 1,2,1);\n  verify_euler(ea, 1,0,2);\n  verify_euler(ea, 1,0,1);\n\n  verify_euler(ea, 2,0,1);\n  verify_euler(ea, 2,0,2);\n  verify_euler(ea, 2,1,0);\n  verify_euler(ea, 2,1,2);\n}\n\ntemplate<typename Scalar> void eulerangles()\n{\n  typedef Matrix<Scalar,3,3> Matrix3;\n  typedef Matrix<Scalar,3,1> Vector3;\n  typedef Array<Scalar,3,1> Array3;\n  typedef Quaternion<Scalar> Quaternionx;\n  typedef AngleAxis<Scalar> AngleAxisx;\n\n  Scalar a = internal::random<Scalar>(-Scalar(M_PI), Scalar(M_PI));\n  Quaternionx q1;\n  q1 = AngleAxisx(a, Vector3::Random().normalized());\n  Matrix3 m;\n  m = q1;\n  \n  Vector3 ea = m.eulerAngles(0,1,2);\n  check_all_var(ea);\n  ea = m.eulerAngles(0,1,0);\n  check_all_var(ea);\n  \n  // Check with purely random Quaternion:\n  q1.coeffs() = Quaternionx::Coefficients::Random().normalized();\n  m = q1;\n  ea = m.eulerAngles(0,1,2);\n  check_all_var(ea);\n  ea = m.eulerAngles(0,1,0);\n  check_all_var(ea);\n  \n  // Check with random angles in range [0:pi]x[-pi:pi]x[-pi:pi].\n  ea = (Array3::Random() + Array3(1,0,0))*Scalar(M_PI)*Array3(0.5,1,1);\n  check_all_var(ea);\n  \n  ea[2] = ea[0] = internal::random<Scalar>(0,Scalar(M_PI));\n  check_all_var(ea);\n  \n  ea[0] = ea[1] = internal::random<Scalar>(0,Scalar(M_PI));\n  check_all_var(ea);\n  \n  ea[1] = 0;\n  check_all_var(ea);\n  \n  ea.head(2).setZero();\n  check_all_var(ea);\n  \n  ea.setZero();\n  check_all_var(ea);\n}\n\nvoid test_geo_eulerangles()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( eulerangles<float>() );\n    CALL_SUBTEST_2( eulerangles<double>() );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/geo_homogeneous.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <Eigen/Geometry>\n\ntemplate<typename Scalar,int Size> void homogeneous(void)\n{\n  /* this test covers the following files:\n     Homogeneous.h\n  */\n\n  typedef Matrix<Scalar,Size,Size> MatrixType;\n  typedef Matrix<Scalar,Size,1, ColMajor> VectorType;\n\n  typedef Matrix<Scalar,Size+1,Size> HMatrixType;\n  typedef Matrix<Scalar,Size+1,1> HVectorType;\n\n  typedef Matrix<Scalar,Size,Size+1>   T1MatrixType;\n  typedef Matrix<Scalar,Size+1,Size+1> T2MatrixType;\n  typedef Matrix<Scalar,Size+1,Size> T3MatrixType;\n\n  VectorType v0 = VectorType::Random(),\n             ones = VectorType::Ones();\n\n  HVectorType hv0 = HVectorType::Random();\n\n  MatrixType m0 = MatrixType::Random();\n\n  HMatrixType hm0 = HMatrixType::Random();\n\n  hv0 << v0, 1;\n  VERIFY_IS_APPROX(v0.homogeneous(), hv0);\n  VERIFY_IS_APPROX(v0, hv0.hnormalized());\n\n  hm0 << m0, ones.transpose();\n  VERIFY_IS_APPROX(m0.colwise().homogeneous(), hm0);\n  VERIFY_IS_APPROX(m0, hm0.colwise().hnormalized());\n  hm0.row(Size-1).setRandom();\n  for(int j=0; j<Size; ++j)\n    m0.col(j) = hm0.col(j).head(Size) / hm0(Size,j);\n  VERIFY_IS_APPROX(m0, hm0.colwise().hnormalized());\n\n  T1MatrixType t1 = T1MatrixType::Random();\n  VERIFY_IS_APPROX(t1 * (v0.homogeneous().eval()), t1 * v0.homogeneous());\n  VERIFY_IS_APPROX(t1 * (m0.colwise().homogeneous().eval()), t1 * m0.colwise().homogeneous());\n\n  T2MatrixType t2 = T2MatrixType::Random();\n  VERIFY_IS_APPROX(t2 * (v0.homogeneous().eval()), t2 * v0.homogeneous());\n  VERIFY_IS_APPROX(t2 * (m0.colwise().homogeneous().eval()), t2 * m0.colwise().homogeneous());\n  VERIFY_IS_APPROX(t2 * (v0.homogeneous().asDiagonal()), t2 * hv0.asDiagonal());\n  VERIFY_IS_APPROX((v0.homogeneous().asDiagonal()) * t2, hv0.asDiagonal() * t2);\n\n  VERIFY_IS_APPROX((v0.transpose().rowwise().homogeneous().eval()) * t2,\n                    v0.transpose().rowwise().homogeneous() * t2);\n                    m0.transpose().rowwise().homogeneous().eval();\n  VERIFY_IS_APPROX((m0.transpose().rowwise().homogeneous().eval()) * t2,\n                    m0.transpose().rowwise().homogeneous() * t2);\n\n  T3MatrixType t3 = T3MatrixType::Random();\n  VERIFY_IS_APPROX((v0.transpose().rowwise().homogeneous().eval()) * t3,\n                    v0.transpose().rowwise().homogeneous() * t3);\n  VERIFY_IS_APPROX((m0.transpose().rowwise().homogeneous().eval()) * t3,\n                    m0.transpose().rowwise().homogeneous() * t3);\n\n  // test product with a Transform object\n  Transform<Scalar, Size, Affine> aff;\n  Transform<Scalar, Size, AffineCompact> caff;\n  Transform<Scalar, Size, Projective> proj;\n  Matrix<Scalar, Size, Dynamic>   pts;\n  Matrix<Scalar, Size+1, Dynamic> pts1, pts2;\n\n  aff.affine().setRandom();\n  proj = caff = aff;\n  pts.setRandom(Size,internal::random<int>(1,20));\n  \n  pts1 = pts.colwise().homogeneous();\n  VERIFY_IS_APPROX(aff  * pts.colwise().homogeneous(), (aff  * pts1).colwise().hnormalized());\n  VERIFY_IS_APPROX(caff * pts.colwise().homogeneous(), (caff * pts1).colwise().hnormalized());\n  VERIFY_IS_APPROX(proj * pts.colwise().homogeneous(), (proj * pts1));\n  \n  VERIFY_IS_APPROX((aff  * pts1).colwise().hnormalized(),  aff  * pts);\n  VERIFY_IS_APPROX((caff * pts1).colwise().hnormalized(), caff * pts);\n  \n  pts2 = pts1;\n  pts2.row(Size).setRandom();\n  VERIFY_IS_APPROX((aff  * pts2).colwise().hnormalized(), aff  * pts2.colwise().hnormalized());\n  VERIFY_IS_APPROX((caff * pts2).colwise().hnormalized(), caff * pts2.colwise().hnormalized());\n  VERIFY_IS_APPROX((proj * pts2).colwise().hnormalized(), (proj * pts2.colwise().hnormalized().colwise().homogeneous()).colwise().hnormalized());\n}\n\nvoid test_geo_homogeneous()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1(( homogeneous<float,1>() ));\n    CALL_SUBTEST_2(( homogeneous<double,3>() ));\n    CALL_SUBTEST_3(( homogeneous<double,8>() ));\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/geo_hyperplane.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <Eigen/Geometry>\n#include <Eigen/LU>\n#include <Eigen/QR>\n\ntemplate<typename HyperplaneType> void hyperplane(const HyperplaneType& _plane)\n{\n  /* this test covers the following files:\n     Hyperplane.h\n  */\n  typedef typename HyperplaneType::Index Index;\n  const Index dim = _plane.dim();\n  enum { Options = HyperplaneType::Options };\n  typedef typename HyperplaneType::Scalar Scalar;\n  typedef Matrix<Scalar, HyperplaneType::AmbientDimAtCompileTime, 1> VectorType;\n  typedef Matrix<Scalar, HyperplaneType::AmbientDimAtCompileTime,\n                         HyperplaneType::AmbientDimAtCompileTime> MatrixType;\n\n  VectorType p0 = VectorType::Random(dim);\n  VectorType p1 = VectorType::Random(dim);\n\n  VectorType n0 = VectorType::Random(dim).normalized();\n  VectorType n1 = VectorType::Random(dim).normalized();\n\n  HyperplaneType pl0(n0, p0);\n  HyperplaneType pl1(n1, p1);\n  HyperplaneType pl2 = pl1;\n\n  Scalar s0 = internal::random<Scalar>();\n  Scalar s1 = internal::random<Scalar>();\n\n  VERIFY_IS_APPROX( n1.dot(n1), Scalar(1) );\n\n  VERIFY_IS_MUCH_SMALLER_THAN( pl0.absDistance(p0), Scalar(1) );\n  VERIFY_IS_APPROX( pl1.signedDistance(p1 + n1 * s0), s0 );\n  VERIFY_IS_MUCH_SMALLER_THAN( pl1.signedDistance(pl1.projection(p0)), Scalar(1) );\n  VERIFY_IS_MUCH_SMALLER_THAN( pl1.absDistance(p1 +  pl1.normal().unitOrthogonal() * s1), Scalar(1) );\n\n  // transform\n  if (!NumTraits<Scalar>::IsComplex)\n  {\n    MatrixType rot = MatrixType::Random(dim,dim).householderQr().householderQ();\n    DiagonalMatrix<Scalar,HyperplaneType::AmbientDimAtCompileTime> scaling(VectorType::Random());\n    Translation<Scalar,HyperplaneType::AmbientDimAtCompileTime> translation(VectorType::Random());\n\n    pl2 = pl1;\n    VERIFY_IS_MUCH_SMALLER_THAN( pl2.transform(rot).absDistance(rot * p1), Scalar(1) );\n    pl2 = pl1;\n    VERIFY_IS_MUCH_SMALLER_THAN( pl2.transform(rot,Isometry).absDistance(rot * p1), Scalar(1) );\n    pl2 = pl1;\n    VERIFY_IS_MUCH_SMALLER_THAN( pl2.transform(rot*scaling).absDistance((rot*scaling) * p1), Scalar(1) );\n    pl2 = pl1;\n    VERIFY_IS_MUCH_SMALLER_THAN( pl2.transform(rot*scaling*translation)\n                                 .absDistance((rot*scaling*translation) * p1), Scalar(1) );\n    pl2 = pl1;\n    VERIFY_IS_MUCH_SMALLER_THAN( pl2.transform(rot*translation,Isometry)\n                                 .absDistance((rot*translation) * p1), Scalar(1) );\n  }\n\n  // casting\n  const int Dim = HyperplaneType::AmbientDimAtCompileTime;\n  typedef typename GetDifferentType<Scalar>::type OtherScalar;\n  Hyperplane<OtherScalar,Dim,Options> hp1f = pl1.template cast<OtherScalar>();\n  VERIFY_IS_APPROX(hp1f.template cast<Scalar>(),pl1);\n  Hyperplane<Scalar,Dim,Options> hp1d = pl1.template cast<Scalar>();\n  VERIFY_IS_APPROX(hp1d.template cast<Scalar>(),pl1);\n}\n\ntemplate<typename Scalar> void lines()\n{\n  using std::abs;\n  typedef Hyperplane<Scalar, 2> HLine;\n  typedef ParametrizedLine<Scalar, 2> PLine;\n  typedef Matrix<Scalar,2,1> Vector;\n  typedef Matrix<Scalar,3,1> CoeffsType;\n\n  for(int i = 0; i < 10; i++)\n  {\n    Vector center = Vector::Random();\n    Vector u = Vector::Random();\n    Vector v = Vector::Random();\n    Scalar a = internal::random<Scalar>();\n    while (abs(a-1) < 1e-4) a = internal::random<Scalar>();\n    while (u.norm() < 1e-4) u = Vector::Random();\n    while (v.norm() < 1e-4) v = Vector::Random();\n\n    HLine line_u = HLine::Through(center + u, center + a*u);\n    HLine line_v = HLine::Through(center + v, center + a*v);\n\n    // the line equations should be normalized so that a^2+b^2=1\n    VERIFY_IS_APPROX(line_u.normal().norm(), Scalar(1));\n    VERIFY_IS_APPROX(line_v.normal().norm(), Scalar(1));\n\n    Vector result = line_u.intersection(line_v);\n\n    // the lines should intersect at the point we called \"center\"\n    VERIFY_IS_APPROX(result, center);\n\n    // check conversions between two types of lines\n    PLine pl(line_u); // gcc 3.3 will commit suicide if we don't name this variable\n    CoeffsType converted_coeffs = HLine(pl).coeffs();\n    converted_coeffs *= (line_u.coeffs()[0])/(converted_coeffs[0]);\n    VERIFY(line_u.coeffs().isApprox(converted_coeffs));\n  }\n}\n\ntemplate<typename Scalar> void planes()\n{\n  using std::abs;\n  typedef Hyperplane<Scalar, 3> Plane;\n  typedef Matrix<Scalar,3,1> Vector;\n\n  for(int i = 0; i < 10; i++)\n  {\n    Vector v0 = Vector::Random();\n    Vector v1(v0), v2(v0);\n    if(internal::random<double>(0,1)>0.25)\n      v1 += Vector::Random();\n    if(internal::random<double>(0,1)>0.25)\n      v2 += v1 * std::pow(internal::random<Scalar>(0,1),internal::random<int>(1,16));\n    if(internal::random<double>(0,1)>0.25)\n      v2 += Vector::Random() * std::pow(internal::random<Scalar>(0,1),internal::random<int>(1,16));\n\n    Plane p0 = Plane::Through(v0, v1, v2);\n\n    VERIFY_IS_APPROX(p0.normal().norm(), Scalar(1));\n    VERIFY_IS_MUCH_SMALLER_THAN(p0.absDistance(v0), Scalar(1));\n    VERIFY_IS_MUCH_SMALLER_THAN(p0.absDistance(v1), Scalar(1));\n    VERIFY_IS_MUCH_SMALLER_THAN(p0.absDistance(v2), Scalar(1));\n  }\n}\n\ntemplate<typename Scalar> void hyperplane_alignment()\n{\n  typedef Hyperplane<Scalar,3,AutoAlign> Plane3a;\n  typedef Hyperplane<Scalar,3,DontAlign> Plane3u;\n\n  EIGEN_ALIGN16 Scalar array1[4];\n  EIGEN_ALIGN16 Scalar array2[4];\n  EIGEN_ALIGN16 Scalar array3[4+1];\n  Scalar* array3u = array3+1;\n\n  Plane3a *p1 = ::new(reinterpret_cast<void*>(array1)) Plane3a;\n  Plane3u *p2 = ::new(reinterpret_cast<void*>(array2)) Plane3u;\n  Plane3u *p3 = ::new(reinterpret_cast<void*>(array3u)) Plane3u;\n  \n  p1->coeffs().setRandom();\n  *p2 = *p1;\n  *p3 = *p1;\n\n  VERIFY_IS_APPROX(p1->coeffs(), p2->coeffs());\n  VERIFY_IS_APPROX(p1->coeffs(), p3->coeffs());\n  \n  #if defined(EIGEN_VECTORIZE) && EIGEN_ALIGN_STATICALLY\n  if(internal::packet_traits<Scalar>::Vectorizable)\n    VERIFY_RAISES_ASSERT((::new(reinterpret_cast<void*>(array3u)) Plane3a));\n  #endif\n}\n\n\nvoid test_geo_hyperplane()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( hyperplane(Hyperplane<float,2>()) );\n    CALL_SUBTEST_2( hyperplane(Hyperplane<float,3>()) );\n    CALL_SUBTEST_2( hyperplane(Hyperplane<float,3,DontAlign>()) );\n    CALL_SUBTEST_2( hyperplane_alignment<float>() );\n    CALL_SUBTEST_3( hyperplane(Hyperplane<double,4>()) );\n    CALL_SUBTEST_4( hyperplane(Hyperplane<std::complex<double>,5>()) );\n    CALL_SUBTEST_1( lines<float>() );\n    CALL_SUBTEST_3( lines<double>() );\n    CALL_SUBTEST_2( planes<float>() );\n    CALL_SUBTEST_5( planes<double>() );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/geo_orthomethods.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <Eigen/Geometry>\n#include <Eigen/LU>\n#include <Eigen/SVD>\n\n/* this test covers the following files:\n   Geometry/OrthoMethods.h\n*/\n\ntemplate<typename Scalar> void orthomethods_3()\n{\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  typedef Matrix<Scalar,3,3> Matrix3;\n  typedef Matrix<Scalar,3,1> Vector3;\n\n  typedef Matrix<Scalar,4,1> Vector4;\n\n  Vector3 v0 = Vector3::Random(),\n          v1 = Vector3::Random(),\n          v2 = Vector3::Random();\n\n  // cross product\n  VERIFY_IS_MUCH_SMALLER_THAN(v1.cross(v2).dot(v1), Scalar(1));\n  VERIFY_IS_MUCH_SMALLER_THAN(v1.dot(v1.cross(v2)), Scalar(1));\n  VERIFY_IS_MUCH_SMALLER_THAN(v1.cross(v2).dot(v2), Scalar(1));\n  VERIFY_IS_MUCH_SMALLER_THAN(v2.dot(v1.cross(v2)), Scalar(1));\n  Matrix3 mat3;\n  mat3 << v0.normalized(),\n         (v0.cross(v1)).normalized(),\n         (v0.cross(v1).cross(v0)).normalized();\n  VERIFY(mat3.isUnitary());\n\n\n  // colwise/rowwise cross product\n  mat3.setRandom();\n  Vector3 vec3 = Vector3::Random();\n  Matrix3 mcross;\n  int i = internal::random<int>(0,2);\n  mcross = mat3.colwise().cross(vec3);\n  VERIFY_IS_APPROX(mcross.col(i), mat3.col(i).cross(vec3));\n  mcross = mat3.rowwise().cross(vec3);\n  VERIFY_IS_APPROX(mcross.row(i), mat3.row(i).cross(vec3));\n\n  // cross3\n  Vector4 v40 = Vector4::Random(),\n          v41 = Vector4::Random(),\n          v42 = Vector4::Random();\n  v40.w() = v41.w() = v42.w() = 0;\n  v42.template head<3>() = v40.template head<3>().cross(v41.template head<3>());\n  VERIFY_IS_APPROX(v40.cross3(v41), v42);\n  \n  // check mixed product\n  typedef Matrix<RealScalar, 3, 1> RealVector3;\n  RealVector3 rv1 = RealVector3::Random();\n  VERIFY_IS_APPROX(v1.cross(rv1.template cast<Scalar>()), v1.cross(rv1));\n  VERIFY_IS_APPROX(rv1.template cast<Scalar>().cross(v1), rv1.cross(v1));\n}\n\ntemplate<typename Scalar, int Size> void orthomethods(int size=Size)\n{\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  typedef Matrix<Scalar,Size,1> VectorType;\n  typedef Matrix<Scalar,3,Size> Matrix3N;\n  typedef Matrix<Scalar,Size,3> MatrixN3;\n  typedef Matrix<Scalar,3,1> Vector3;\n\n  VectorType v0 = VectorType::Random(size);\n\n  // unitOrthogonal\n  VERIFY_IS_MUCH_SMALLER_THAN(v0.unitOrthogonal().dot(v0), Scalar(1));\n  VERIFY_IS_APPROX(v0.unitOrthogonal().norm(), RealScalar(1));\n\n  if (size>=3)\n  {\n    v0.template head<2>().setZero();\n    v0.tail(size-2).setRandom();\n\n    VERIFY_IS_MUCH_SMALLER_THAN(v0.unitOrthogonal().dot(v0), Scalar(1));\n    VERIFY_IS_APPROX(v0.unitOrthogonal().norm(), RealScalar(1));\n  }\n\n  // colwise/rowwise cross product\n  Vector3 vec3 = Vector3::Random();\n  int i = internal::random<int>(0,size-1);\n\n  Matrix3N mat3N(3,size), mcross3N(3,size);\n  mat3N.setRandom();\n  mcross3N = mat3N.colwise().cross(vec3);\n  VERIFY_IS_APPROX(mcross3N.col(i), mat3N.col(i).cross(vec3));\n\n  MatrixN3 matN3(size,3), mcrossN3(size,3);\n  matN3.setRandom();\n  mcrossN3 = matN3.rowwise().cross(vec3);\n  VERIFY_IS_APPROX(mcrossN3.row(i), matN3.row(i).cross(vec3));\n}\n\nvoid test_geo_orthomethods()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( orthomethods_3<float>() );\n    CALL_SUBTEST_2( orthomethods_3<double>() );\n    CALL_SUBTEST_4( orthomethods_3<std::complex<double> >() );\n    CALL_SUBTEST_1( (orthomethods<float,2>()) );\n    CALL_SUBTEST_2( (orthomethods<double,2>()) );\n    CALL_SUBTEST_1( (orthomethods<float,3>()) );\n    CALL_SUBTEST_2( (orthomethods<double,3>()) );\n    CALL_SUBTEST_3( (orthomethods<float,7>()) );\n    CALL_SUBTEST_4( (orthomethods<std::complex<double>,8>()) );\n    CALL_SUBTEST_5( (orthomethods<float,Dynamic>(36)) );\n    CALL_SUBTEST_6( (orthomethods<double,Dynamic>(35)) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/geo_parametrizedline.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <Eigen/Geometry>\n#include <Eigen/LU>\n#include <Eigen/QR>\n\ntemplate<typename LineType> void parametrizedline(const LineType& _line)\n{\n  /* this test covers the following files:\n     ParametrizedLine.h\n  */\n  using std::abs;\n  typedef typename LineType::Index Index;\n  const Index dim = _line.dim();\n  typedef typename LineType::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  typedef Matrix<Scalar, LineType::AmbientDimAtCompileTime, 1> VectorType;\n  typedef Hyperplane<Scalar,LineType::AmbientDimAtCompileTime> HyperplaneType;\n\n  VectorType p0 = VectorType::Random(dim);\n  VectorType p1 = VectorType::Random(dim);\n\n  VectorType d0 = VectorType::Random(dim).normalized();\n\n  LineType l0(p0, d0);\n\n  Scalar s0 = internal::random<Scalar>();\n  Scalar s1 = abs(internal::random<Scalar>());\n\n  VERIFY_IS_MUCH_SMALLER_THAN( l0.distance(p0), RealScalar(1) );\n  VERIFY_IS_MUCH_SMALLER_THAN( l0.distance(p0+s0*d0), RealScalar(1) );\n  VERIFY_IS_APPROX( (l0.projection(p1)-p1).norm(), l0.distance(p1) );\n  VERIFY_IS_MUCH_SMALLER_THAN( l0.distance(l0.projection(p1)), RealScalar(1) );\n  VERIFY_IS_APPROX( Scalar(l0.distance((p0+s0*d0) + d0.unitOrthogonal() * s1)), s1 );\n\n  // casting\n  const int Dim = LineType::AmbientDimAtCompileTime;\n  typedef typename GetDifferentType<Scalar>::type OtherScalar;\n  ParametrizedLine<OtherScalar,Dim> hp1f = l0.template cast<OtherScalar>();\n  VERIFY_IS_APPROX(hp1f.template cast<Scalar>(),l0);\n  ParametrizedLine<Scalar,Dim> hp1d = l0.template cast<Scalar>();\n  VERIFY_IS_APPROX(hp1d.template cast<Scalar>(),l0);\n\n  // intersections\n  VectorType p2 = VectorType::Random(dim);\n  VectorType n2 = VectorType::Random(dim).normalized();\n  HyperplaneType hp(p2,n2);\n  Scalar t = l0.intersectionParameter(hp);\n  VectorType pi = l0.pointAt(t);\n  VERIFY_IS_MUCH_SMALLER_THAN(hp.signedDistance(pi), RealScalar(1));\n  VERIFY_IS_MUCH_SMALLER_THAN(l0.distance(pi), RealScalar(1));\n  VERIFY_IS_APPROX(l0.intersectionPoint(hp), pi);\n}\n\ntemplate<typename Scalar> void parametrizedline_alignment()\n{\n  typedef ParametrizedLine<Scalar,4,AutoAlign> Line4a;\n  typedef ParametrizedLine<Scalar,4,DontAlign> Line4u;\n\n  EIGEN_ALIGN16 Scalar array1[8];\n  EIGEN_ALIGN16 Scalar array2[8];\n  EIGEN_ALIGN16 Scalar array3[8+1];\n  Scalar* array3u = array3+1;\n\n  Line4a *p1 = ::new(reinterpret_cast<void*>(array1)) Line4a;\n  Line4u *p2 = ::new(reinterpret_cast<void*>(array2)) Line4u;\n  Line4u *p3 = ::new(reinterpret_cast<void*>(array3u)) Line4u;\n  \n  p1->origin().setRandom();\n  p1->direction().setRandom();\n  *p2 = *p1;\n  *p3 = *p1;\n\n  VERIFY_IS_APPROX(p1->origin(), p2->origin());\n  VERIFY_IS_APPROX(p1->origin(), p3->origin());\n  VERIFY_IS_APPROX(p1->direction(), p2->direction());\n  VERIFY_IS_APPROX(p1->direction(), p3->direction());\n  \n  #if defined(EIGEN_VECTORIZE) && EIGEN_ALIGN_STATICALLY\n  if(internal::packet_traits<Scalar>::Vectorizable)\n    VERIFY_RAISES_ASSERT((::new(reinterpret_cast<void*>(array3u)) Line4a));\n  #endif\n}\n\nvoid test_geo_parametrizedline()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( parametrizedline(ParametrizedLine<float,2>()) );\n    CALL_SUBTEST_2( parametrizedline(ParametrizedLine<float,3>()) );\n    CALL_SUBTEST_2( parametrizedline_alignment<float>() );\n    CALL_SUBTEST_3( parametrizedline(ParametrizedLine<double,4>()) );\n    CALL_SUBTEST_3( parametrizedline_alignment<double>() );\n    CALL_SUBTEST_4( parametrizedline(ParametrizedLine<std::complex<double>,5>()) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/geo_quaternion.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2009 Mathieu Gautier <mathieu.gautier@cea.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <Eigen/Geometry>\n#include <Eigen/LU>\n#include <Eigen/SVD>\n\ntemplate<typename T> T bounded_acos(T v)\n{\n  using std::acos;\n  using std::min;\n  using std::max;\n  return acos((max)(T(-1),(min)(v,T(1))));\n}\n\ntemplate<typename QuatType> void check_slerp(const QuatType& q0, const QuatType& q1)\n{\n  using std::abs;\n  typedef typename QuatType::Scalar Scalar;\n  typedef AngleAxis<Scalar> AA;\n\n  Scalar largeEps = test_precision<Scalar>();\n\n  Scalar theta_tot = AA(q1*q0.inverse()).angle();\n  if(theta_tot>M_PI)\n    theta_tot = Scalar(2.*M_PI)-theta_tot;\n  for(Scalar t=0; t<=Scalar(1.001); t+=Scalar(0.1))\n  {\n    QuatType q = q0.slerp(t,q1);\n    Scalar theta = AA(q*q0.inverse()).angle();\n    VERIFY(abs(q.norm() - 1) < largeEps);\n    if(theta_tot==0)  VERIFY(theta_tot==0);\n    else              VERIFY(abs(theta - t * theta_tot) < largeEps);\n  }\n}\n\ntemplate<typename Scalar, int Options> void quaternion(void)\n{\n  /* this test covers the following files:\n     Quaternion.h\n  */\n  using std::abs;\n  typedef Matrix<Scalar,3,1> Vector3;\n  typedef Matrix<Scalar,4,1> Vector4;\n  typedef Quaternion<Scalar,Options> Quaternionx;\n  typedef AngleAxis<Scalar> AngleAxisx;\n\n  Scalar largeEps = test_precision<Scalar>();\n  if (internal::is_same<Scalar,float>::value)\n    largeEps = 1e-3f;\n\n  Scalar eps = internal::random<Scalar>() * Scalar(1e-2);\n\n  Vector3 v0 = Vector3::Random(),\n          v1 = Vector3::Random(),\n          v2 = Vector3::Random(),\n          v3 = Vector3::Random();\n\n  Scalar  a = internal::random<Scalar>(-Scalar(M_PI), Scalar(M_PI)),\n          b = internal::random<Scalar>(-Scalar(M_PI), Scalar(M_PI));\n\n  // Quaternion: Identity(), setIdentity();\n  Quaternionx q1, q2;\n  q2.setIdentity();\n  VERIFY_IS_APPROX(Quaternionx(Quaternionx::Identity()).coeffs(), q2.coeffs());\n  q1.coeffs().setRandom();\n  VERIFY_IS_APPROX(q1.coeffs(), (q1*q2).coeffs());\n\n  // concatenation\n  q1 *= q2;\n\n  q1 = AngleAxisx(a, v0.normalized());\n  q2 = AngleAxisx(a, v1.normalized());\n\n  // angular distance\n  Scalar refangle = abs(AngleAxisx(q1.inverse()*q2).angle());\n  if (refangle>Scalar(M_PI))\n    refangle = Scalar(2)*Scalar(M_PI) - refangle;\n\n  if((q1.coeffs()-q2.coeffs()).norm() > 10*largeEps)\n  {\n    VERIFY_IS_MUCH_SMALLER_THAN(abs(q1.angularDistance(q2) - refangle), Scalar(1));\n  }\n\n  // rotation matrix conversion\n  VERIFY_IS_APPROX(q1 * v2, q1.toRotationMatrix() * v2);\n  VERIFY_IS_APPROX(q1 * q2 * v2,\n    q1.toRotationMatrix() * q2.toRotationMatrix() * v2);\n\n  VERIFY(  (q2*q1).isApprox(q1*q2, largeEps)\n        || !(q2 * q1 * v2).isApprox(q1.toRotationMatrix() * q2.toRotationMatrix() * v2));\n\n  q2 = q1.toRotationMatrix();\n  VERIFY_IS_APPROX(q1*v1,q2*v1);\n\n\n  // angle-axis conversion\n  AngleAxisx aa = AngleAxisx(q1);\n  VERIFY_IS_APPROX(q1 * v1, Quaternionx(aa) * v1);\n\n  // Do not execute the test if the rotation angle is almost zero, or\n  // the rotation axis and v1 are almost parallel.\n  if (abs(aa.angle()) > 5*test_precision<Scalar>()\n      && (aa.axis() - v1.normalized()).norm() < 1.99\n      && (aa.axis() + v1.normalized()).norm() < 1.99) \n  {\n    VERIFY_IS_NOT_APPROX(q1 * v1, Quaternionx(AngleAxisx(aa.angle()*2,aa.axis())) * v1);\n  }\n\n  // from two vector creation\n  VERIFY_IS_APPROX( v2.normalized(),(q2.setFromTwoVectors(v1, v2)*v1).normalized());\n  VERIFY_IS_APPROX( v1.normalized(),(q2.setFromTwoVectors(v1, v1)*v1).normalized());\n  VERIFY_IS_APPROX(-v1.normalized(),(q2.setFromTwoVectors(v1,-v1)*v1).normalized());\n  if (internal::is_same<Scalar,double>::value)\n  {\n    v3 = (v1.array()+eps).matrix();\n    VERIFY_IS_APPROX( v3.normalized(),(q2.setFromTwoVectors(v1, v3)*v1).normalized());\n    VERIFY_IS_APPROX(-v3.normalized(),(q2.setFromTwoVectors(v1,-v3)*v1).normalized());\n  }\n\n  // from two vector creation static function\n  VERIFY_IS_APPROX( v2.normalized(),(Quaternionx::FromTwoVectors(v1, v2)*v1).normalized());\n  VERIFY_IS_APPROX( v1.normalized(),(Quaternionx::FromTwoVectors(v1, v1)*v1).normalized());\n  VERIFY_IS_APPROX(-v1.normalized(),(Quaternionx::FromTwoVectors(v1,-v1)*v1).normalized());\n  if (internal::is_same<Scalar,double>::value)\n  {\n    v3 = (v1.array()+eps).matrix();\n    VERIFY_IS_APPROX( v3.normalized(),(Quaternionx::FromTwoVectors(v1, v3)*v1).normalized());\n    VERIFY_IS_APPROX(-v3.normalized(),(Quaternionx::FromTwoVectors(v1,-v3)*v1).normalized());\n  }\n\n  // inverse and conjugate\n  VERIFY_IS_APPROX(q1 * (q1.inverse() * v1), v1);\n  VERIFY_IS_APPROX(q1 * (q1.conjugate() * v1), v1);\n\n  // test casting\n  Quaternion<float> q1f = q1.template cast<float>();\n  VERIFY_IS_APPROX(q1f.template cast<Scalar>(),q1);\n  Quaternion<double> q1d = q1.template cast<double>();\n  VERIFY_IS_APPROX(q1d.template cast<Scalar>(),q1);\n\n  // test bug 369 - improper alignment.\n  Quaternionx *q = new Quaternionx;\n  delete q;\n\n  q1 = AngleAxisx(a, v0.normalized());\n  q2 = AngleAxisx(b, v1.normalized());\n  check_slerp(q1,q2);\n\n  q1 = AngleAxisx(b, v1.normalized());\n  q2 = AngleAxisx(b+Scalar(M_PI), v1.normalized());\n  check_slerp(q1,q2);\n\n  q1 = AngleAxisx(b,  v1.normalized());\n  q2 = AngleAxisx(-b, -v1.normalized());\n  check_slerp(q1,q2);\n\n  q1.coeffs() = Vector4::Random().normalized();\n  q2.coeffs() = -q1.coeffs();\n  check_slerp(q1,q2);\n}\n\ntemplate<typename Scalar> void mapQuaternion(void){\n  typedef Map<Quaternion<Scalar>, Aligned> MQuaternionA;\n  typedef Map<const Quaternion<Scalar>, Aligned> MCQuaternionA;\n  typedef Map<Quaternion<Scalar> > MQuaternionUA;\n  typedef Map<const Quaternion<Scalar> > MCQuaternionUA;\n  typedef Quaternion<Scalar> Quaternionx;\n  typedef Matrix<Scalar,3,1> Vector3;\n  typedef AngleAxis<Scalar> AngleAxisx;\n  \n  Vector3 v0 = Vector3::Random(),\n          v1 = Vector3::Random();\n  Scalar  a = internal::random<Scalar>(-Scalar(M_PI), Scalar(M_PI));\n\n  EIGEN_ALIGN16 Scalar array1[4];\n  EIGEN_ALIGN16 Scalar array2[4];\n  EIGEN_ALIGN16 Scalar array3[4+1];\n  Scalar* array3unaligned = array3+1;\n  \n  MQuaternionA    mq1(array1);\n  MCQuaternionA   mcq1(array1);\n  MQuaternionA    mq2(array2);\n  MQuaternionUA   mq3(array3unaligned);\n  MCQuaternionUA  mcq3(array3unaligned);\n\n//  std::cerr << array1 << \" \" << array2 << \" \" << array3 << \"\\n\";\n  mq1 = AngleAxisx(a, v0.normalized());\n  mq2 = mq1;\n  mq3 = mq1;\n\n  Quaternionx q1 = mq1;\n  Quaternionx q2 = mq2;\n  Quaternionx q3 = mq3;\n  Quaternionx q4 = MCQuaternionUA(array3unaligned);\n\n  VERIFY_IS_APPROX(q1.coeffs(), q2.coeffs());\n  VERIFY_IS_APPROX(q1.coeffs(), q3.coeffs());\n  VERIFY_IS_APPROX(q4.coeffs(), q3.coeffs());\n  #ifdef EIGEN_VECTORIZE\n  if(internal::packet_traits<Scalar>::Vectorizable)\n    VERIFY_RAISES_ASSERT((MQuaternionA(array3unaligned)));\n  #endif\n    \n  VERIFY_IS_APPROX(mq1 * (mq1.inverse() * v1), v1);\n  VERIFY_IS_APPROX(mq1 * (mq1.conjugate() * v1), v1);\n  \n  VERIFY_IS_APPROX(mcq1 * (mcq1.inverse() * v1), v1);\n  VERIFY_IS_APPROX(mcq1 * (mcq1.conjugate() * v1), v1);\n  \n  VERIFY_IS_APPROX(mq3 * (mq3.inverse() * v1), v1);\n  VERIFY_IS_APPROX(mq3 * (mq3.conjugate() * v1), v1);\n  \n  VERIFY_IS_APPROX(mcq3 * (mcq3.inverse() * v1), v1);\n  VERIFY_IS_APPROX(mcq3 * (mcq3.conjugate() * v1), v1);\n  \n  VERIFY_IS_APPROX(mq1*mq2, q1*q2);\n  VERIFY_IS_APPROX(mq3*mq2, q3*q2);\n  VERIFY_IS_APPROX(mcq1*mq2, q1*q2);\n  VERIFY_IS_APPROX(mcq3*mq2, q3*q2);\n}\n\ntemplate<typename Scalar> void quaternionAlignment(void){\n  typedef Quaternion<Scalar,AutoAlign> QuaternionA;\n  typedef Quaternion<Scalar,DontAlign> QuaternionUA;\n\n  EIGEN_ALIGN16 Scalar array1[4];\n  EIGEN_ALIGN16 Scalar array2[4];\n  EIGEN_ALIGN16 Scalar array3[4+1];\n  Scalar* arrayunaligned = array3+1;\n\n  QuaternionA *q1 = ::new(reinterpret_cast<void*>(array1)) QuaternionA;\n  QuaternionUA *q2 = ::new(reinterpret_cast<void*>(array2)) QuaternionUA;\n  QuaternionUA *q3 = ::new(reinterpret_cast<void*>(arrayunaligned)) QuaternionUA;\n\n  q1->coeffs().setRandom();\n  *q2 = *q1;\n  *q3 = *q1;\n\n  VERIFY_IS_APPROX(q1->coeffs(), q2->coeffs());\n  VERIFY_IS_APPROX(q1->coeffs(), q3->coeffs());\n  #if defined(EIGEN_VECTORIZE) && EIGEN_ALIGN_STATICALLY\n  if(internal::packet_traits<Scalar>::Vectorizable)\n    VERIFY_RAISES_ASSERT((::new(reinterpret_cast<void*>(arrayunaligned)) QuaternionA));\n  #endif\n}\n\ntemplate<typename PlainObjectType> void check_const_correctness(const PlainObjectType&)\n{\n  // there's a lot that we can't test here while still having this test compile!\n  // the only possible approach would be to run a script trying to compile stuff and checking that it fails.\n  // CMake can help with that.\n\n  // verify that map-to-const don't have LvalueBit\n  typedef typename internal::add_const<PlainObjectType>::type ConstPlainObjectType;\n  VERIFY( !(internal::traits<Map<ConstPlainObjectType> >::Flags & LvalueBit) );\n  VERIFY( !(internal::traits<Map<ConstPlainObjectType, Aligned> >::Flags & LvalueBit) );\n  VERIFY( !(Map<ConstPlainObjectType>::Flags & LvalueBit) );\n  VERIFY( !(Map<ConstPlainObjectType, Aligned>::Flags & LvalueBit) );\n}\n\nvoid test_geo_quaternion()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1(( quaternion<float,AutoAlign>() ));\n    CALL_SUBTEST_1( check_const_correctness(Quaternionf()) );\n    CALL_SUBTEST_2(( quaternion<double,AutoAlign>() ));\n    CALL_SUBTEST_2( check_const_correctness(Quaterniond()) );\n    CALL_SUBTEST_3(( quaternion<float,DontAlign>() ));\n    CALL_SUBTEST_4(( quaternion<double,DontAlign>() ));\n    CALL_SUBTEST_5(( quaternionAlignment<float>() ));\n    CALL_SUBTEST_6(( quaternionAlignment<double>() ));\n    CALL_SUBTEST_1( mapQuaternion<float>() );\n    CALL_SUBTEST_2( mapQuaternion<double>() );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/geo_transformations.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <Eigen/Geometry>\n#include <Eigen/LU>\n#include <Eigen/SVD>\n\ntemplate<typename Scalar, int Mode, int Options> void non_projective_only()\n{\n    /* this test covers the following files:\n     Cross.h Quaternion.h, Transform.cpp\n  */\n  typedef Matrix<Scalar,3,1> Vector3;\n  typedef Quaternion<Scalar> Quaternionx;\n  typedef AngleAxis<Scalar> AngleAxisx;\n  typedef Transform<Scalar,3,Mode,Options> Transform3;\n  typedef DiagonalMatrix<Scalar,3> AlignedScaling3;\n  typedef Translation<Scalar,3> Translation3;\n\n  Vector3 v0 = Vector3::Random(),\n          v1 = Vector3::Random();\n\n  Transform3 t0, t1, t2;\n\n  Scalar a = internal::random<Scalar>(-Scalar(M_PI), Scalar(M_PI));\n\n  Quaternionx q1, q2;\n\n  q1 = AngleAxisx(a, v0.normalized());\n\n  t0 = Transform3::Identity();\n  VERIFY_IS_APPROX(t0.matrix(), Transform3::MatrixType::Identity());\n\n  t0.linear() = q1.toRotationMatrix();\n\n  v0 << 50, 2, 1;\n  t0.scale(v0);\n\n  VERIFY_IS_APPROX( (t0 * Vector3(1,0,0)).template head<3>().norm(), v0.x());\n\n  t0.setIdentity();\n  t1.setIdentity();\n  v1 << 1, 2, 3;\n  t0.linear() = q1.toRotationMatrix();\n  t0.pretranslate(v0);\n  t0.scale(v1);\n  t1.linear() = q1.conjugate().toRotationMatrix();\n  t1.prescale(v1.cwiseInverse());\n  t1.translate(-v0);\n\n  VERIFY((t0 * t1).matrix().isIdentity(test_precision<Scalar>()));\n\n  t1.fromPositionOrientationScale(v0, q1, v1);\n  VERIFY_IS_APPROX(t1.matrix(), t0.matrix());\n  VERIFY_IS_APPROX(t1*v1, t0*v1);\n\n  // translation * vector\n  t0.setIdentity();\n  t0.translate(v0);\n  VERIFY_IS_APPROX((t0 * v1).template head<3>(), Translation3(v0) * v1);\n\n  // AlignedScaling * vector\n  t0.setIdentity();\n  t0.scale(v0);\n  VERIFY_IS_APPROX((t0 * v1).template head<3>(), AlignedScaling3(v0) * v1);\n}\n\ntemplate<typename Scalar, int Mode, int Options> void transformations()\n{\n  /* this test covers the following files:\n     Cross.h Quaternion.h, Transform.cpp\n  */\n  using std::cos;\n  using std::abs;\n  typedef Matrix<Scalar,3,3> Matrix3;\n  typedef Matrix<Scalar,4,4> Matrix4;\n  typedef Matrix<Scalar,2,1> Vector2;\n  typedef Matrix<Scalar,3,1> Vector3;\n  typedef Matrix<Scalar,4,1> Vector4;\n  typedef Quaternion<Scalar> Quaternionx;\n  typedef AngleAxis<Scalar> AngleAxisx;\n  typedef Transform<Scalar,2,Mode,Options> Transform2;\n  typedef Transform<Scalar,3,Mode,Options> Transform3;\n  typedef typename Transform3::MatrixType MatrixType;\n  typedef DiagonalMatrix<Scalar,3> AlignedScaling3;\n  typedef Translation<Scalar,2> Translation2;\n  typedef Translation<Scalar,3> Translation3;\n\n  Vector3 v0 = Vector3::Random(),\n          v1 = Vector3::Random();\n  Matrix3 matrot1, m;\n\n  Scalar a = internal::random<Scalar>(-Scalar(M_PI), Scalar(M_PI));\n  Scalar s0 = internal::random<Scalar>(),\n         s1 = internal::random<Scalar>();\n  \n  while(v0.norm() < test_precision<Scalar>()) v0 = Vector3::Random();\n  while(v1.norm() < test_precision<Scalar>()) v1 = Vector3::Random();\n    \n\n  VERIFY_IS_APPROX(v0, AngleAxisx(a, v0.normalized()) * v0);\n  VERIFY_IS_APPROX(-v0, AngleAxisx(Scalar(M_PI), v0.unitOrthogonal()) * v0);\n  if(abs(cos(a)) > test_precision<Scalar>())\n  {\n    VERIFY_IS_APPROX(cos(a)*v0.squaredNorm(), v0.dot(AngleAxisx(a, v0.unitOrthogonal()) * v0));\n  }\n  m = AngleAxisx(a, v0.normalized()).toRotationMatrix().adjoint();\n  VERIFY_IS_APPROX(Matrix3::Identity(), m * AngleAxisx(a, v0.normalized()));\n  VERIFY_IS_APPROX(Matrix3::Identity(), AngleAxisx(a, v0.normalized()) * m);\n\n  Quaternionx q1, q2;\n  q1 = AngleAxisx(a, v0.normalized());\n  q2 = AngleAxisx(a, v1.normalized());\n\n  // rotation matrix conversion\n  matrot1 = AngleAxisx(Scalar(0.1), Vector3::UnitX())\n          * AngleAxisx(Scalar(0.2), Vector3::UnitY())\n          * AngleAxisx(Scalar(0.3), Vector3::UnitZ());\n  VERIFY_IS_APPROX(matrot1 * v1,\n       AngleAxisx(Scalar(0.1), Vector3(1,0,0)).toRotationMatrix()\n    * (AngleAxisx(Scalar(0.2), Vector3(0,1,0)).toRotationMatrix()\n    * (AngleAxisx(Scalar(0.3), Vector3(0,0,1)).toRotationMatrix() * v1)));\n\n  // angle-axis conversion\n  AngleAxisx aa = AngleAxisx(q1);\n  VERIFY_IS_APPROX(q1 * v1, Quaternionx(aa) * v1);\n  \n  if(abs(aa.angle()) > NumTraits<Scalar>::dummy_precision())\n  {\n    VERIFY( !(q1 * v1).isApprox(Quaternionx(AngleAxisx(aa.angle()*2,aa.axis())) * v1) );\n  }\n\n  aa.fromRotationMatrix(aa.toRotationMatrix());\n  VERIFY_IS_APPROX(q1 * v1, Quaternionx(aa) * v1);\n  if(abs(aa.angle()) > NumTraits<Scalar>::dummy_precision())\n  {\n    VERIFY( !(q1 * v1).isApprox(Quaternionx(AngleAxisx(aa.angle()*2,aa.axis())) * v1) );\n  }\n\n  // AngleAxis\n  VERIFY_IS_APPROX(AngleAxisx(a,v1.normalized()).toRotationMatrix(),\n    Quaternionx(AngleAxisx(a,v1.normalized())).toRotationMatrix());\n\n  AngleAxisx aa1;\n  m = q1.toRotationMatrix();\n  aa1 = m;\n  VERIFY_IS_APPROX(AngleAxisx(m).toRotationMatrix(),\n    Quaternionx(m).toRotationMatrix());\n\n  // Transform\n  // TODO complete the tests !\n  a = 0;\n  while (abs(a)<Scalar(0.1))\n    a = internal::random<Scalar>(-Scalar(0.4)*Scalar(M_PI), Scalar(0.4)*Scalar(M_PI));\n  q1 = AngleAxisx(a, v0.normalized());\n  Transform3 t0, t1, t2;\n\n  // first test setIdentity() and Identity()\n  t0.setIdentity();\n  VERIFY_IS_APPROX(t0.matrix(), Transform3::MatrixType::Identity());\n  t0.matrix().setZero();\n  t0 = Transform3::Identity();\n  VERIFY_IS_APPROX(t0.matrix(), Transform3::MatrixType::Identity());\n\n  t0.setIdentity();\n  t1.setIdentity();\n  v1 << 1, 2, 3;\n  t0.linear() = q1.toRotationMatrix();\n  t0.pretranslate(v0);\n  t0.scale(v1);\n  t1.linear() = q1.conjugate().toRotationMatrix();\n  t1.prescale(v1.cwiseInverse());\n  t1.translate(-v0);\n\n  VERIFY((t0 * t1).matrix().isIdentity(test_precision<Scalar>()));\n\n  t1.fromPositionOrientationScale(v0, q1, v1);\n  VERIFY_IS_APPROX(t1.matrix(), t0.matrix());\n\n  t0.setIdentity(); t0.scale(v0).rotate(q1.toRotationMatrix());\n  t1.setIdentity(); t1.scale(v0).rotate(q1);\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n\n  t0.setIdentity(); t0.scale(v0).rotate(AngleAxisx(q1));\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n\n  VERIFY_IS_APPROX(t0.scale(a).matrix(), t1.scale(Vector3::Constant(a)).matrix());\n  VERIFY_IS_APPROX(t0.prescale(a).matrix(), t1.prescale(Vector3::Constant(a)).matrix());\n\n  // More transform constructors, operator=, operator*=\n\n  Matrix3 mat3 = Matrix3::Random();\n  Matrix4 mat4;\n  mat4 << mat3 , Vector3::Zero() , Vector4::Zero().transpose();\n  Transform3 tmat3(mat3), tmat4(mat4);\n  if(Mode!=int(AffineCompact))\n    tmat4.matrix()(3,3) = Scalar(1);\n  VERIFY_IS_APPROX(tmat3.matrix(), tmat4.matrix());\n\n  Scalar a3 = internal::random<Scalar>(-Scalar(M_PI), Scalar(M_PI));\n  Vector3 v3 = Vector3::Random().normalized();\n  AngleAxisx aa3(a3, v3);\n  Transform3 t3(aa3);\n  Transform3 t4;\n  t4 = aa3;\n  VERIFY_IS_APPROX(t3.matrix(), t4.matrix());\n  t4.rotate(AngleAxisx(-a3,v3));\n  VERIFY_IS_APPROX(t4.matrix(), MatrixType::Identity());\n  t4 *= aa3;\n  VERIFY_IS_APPROX(t3.matrix(), t4.matrix());\n\n  v3 = Vector3::Random();\n  Translation3 tv3(v3);\n  Transform3 t5(tv3);\n  t4 = tv3;\n  VERIFY_IS_APPROX(t5.matrix(), t4.matrix());\n  t4.translate(-v3);\n  VERIFY_IS_APPROX(t4.matrix(), MatrixType::Identity());\n  t4 *= tv3;\n  VERIFY_IS_APPROX(t5.matrix(), t4.matrix());\n\n  AlignedScaling3 sv3(v3);\n  Transform3 t6(sv3);\n  t4 = sv3;\n  VERIFY_IS_APPROX(t6.matrix(), t4.matrix());\n  t4.scale(v3.cwiseInverse());\n  VERIFY_IS_APPROX(t4.matrix(), MatrixType::Identity());\n  t4 *= sv3;\n  VERIFY_IS_APPROX(t6.matrix(), t4.matrix());\n\n  // matrix * transform\n  VERIFY_IS_APPROX((t3.matrix()*t4).matrix(), (t3*t4).matrix());\n\n  // chained Transform product\n  VERIFY_IS_APPROX(((t3*t4)*t5).matrix(), (t3*(t4*t5)).matrix());\n\n  // check that Transform product doesn't have aliasing problems\n  t5 = t4;\n  t5 = t5*t5;\n  VERIFY_IS_APPROX(t5, t4*t4);\n\n  // 2D transformation\n  Transform2 t20, t21;\n  Vector2 v20 = Vector2::Random();\n  Vector2 v21 = Vector2::Random();\n  for (int k=0; k<2; ++k)\n    if (abs(v21[k])<Scalar(1e-3)) v21[k] = Scalar(1e-3);\n  t21.setIdentity();\n  t21.linear() = Rotation2D<Scalar>(a).toRotationMatrix();\n  VERIFY_IS_APPROX(t20.fromPositionOrientationScale(v20,a,v21).matrix(),\n    t21.pretranslate(v20).scale(v21).matrix());\n\n  t21.setIdentity();\n  t21.linear() = Rotation2D<Scalar>(-a).toRotationMatrix();\n  VERIFY( (t20.fromPositionOrientationScale(v20,a,v21)\n        * (t21.prescale(v21.cwiseInverse()).translate(-v20))).matrix().isIdentity(test_precision<Scalar>()) );\n\n  // Transform - new API\n  // 3D\n  t0.setIdentity();\n  t0.rotate(q1).scale(v0).translate(v0);\n  // mat * aligned scaling and mat * translation\n  t1 = (Matrix3(q1) * AlignedScaling3(v0)) * Translation3(v0);\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n  t1 = (Matrix3(q1) * Eigen::Scaling(v0)) * Translation3(v0);\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n  t1 = (q1 * Eigen::Scaling(v0)) * Translation3(v0);\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n  // mat * transformation and aligned scaling * translation\n  t1 = Matrix3(q1) * (AlignedScaling3(v0) * Translation3(v0));\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n\n\n  t0.setIdentity();\n  t0.scale(s0).translate(v0);\n  t1 = Eigen::Scaling(s0) * Translation3(v0);\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n  t0.prescale(s0);\n  t1 = Eigen::Scaling(s0) * t1;\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n  \n  t0 = t3;\n  t0.scale(s0);\n  t1 = t3 * Eigen::Scaling(s0,s0,s0);\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n  t0.prescale(s0);\n  t1 = Eigen::Scaling(s0,s0,s0) * t1;\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n\n  t0 = t3;\n  t0.scale(s0);\n  t1 = t3 * Eigen::Scaling(s0);\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n  t0.prescale(s0);\n  t1 = Eigen::Scaling(s0) * t1;\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n\n  t0.setIdentity();\n  t0.prerotate(q1).prescale(v0).pretranslate(v0);\n  // translation * aligned scaling and transformation * mat\n  t1 = (Translation3(v0) * AlignedScaling3(v0)) * Transform3(q1);\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n  // scaling * mat and translation * mat\n  t1 = Translation3(v0) * (AlignedScaling3(v0) * Transform3(q1));\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n\n  t0.setIdentity();\n  t0.scale(v0).translate(v0).rotate(q1);\n  // translation * mat and aligned scaling * transformation\n  t1 = AlignedScaling3(v0) * (Translation3(v0) * Transform3(q1));\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n  // transformation * aligned scaling\n  t0.scale(v0);\n  t1 *= AlignedScaling3(v0);\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n  // transformation * translation\n  t0.translate(v0);\n  t1 = t1 * Translation3(v0);\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n  // translation * transformation\n  t0.pretranslate(v0);\n  t1 = Translation3(v0) * t1;\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n\n  // transform * quaternion\n  t0.rotate(q1);\n  t1 = t1 * q1;\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n\n  // translation * quaternion\n  t0.translate(v1).rotate(q1);\n  t1 = t1 * (Translation3(v1) * q1);\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n\n  // aligned scaling * quaternion\n  t0.scale(v1).rotate(q1);\n  t1 = t1 * (AlignedScaling3(v1) * q1);\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n\n  // quaternion * transform\n  t0.prerotate(q1);\n  t1 = q1 * t1;\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n\n  // quaternion * translation\n  t0.rotate(q1).translate(v1);\n  t1 = t1 * (q1 * Translation3(v1));\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n\n  // quaternion * aligned scaling\n  t0.rotate(q1).scale(v1);\n  t1 = t1 * (q1 * AlignedScaling3(v1));\n  VERIFY_IS_APPROX(t0.matrix(), t1.matrix());\n\n  // test transform inversion\n  t0.setIdentity();\n  t0.translate(v0);\n  do {\n    t0.linear().setRandom();\n  } while(t0.linear().jacobiSvd().singularValues()(2)<test_precision<Scalar>());\n  Matrix4 t044 = Matrix4::Zero();\n  t044(3,3) = 1;\n  t044.block(0,0,t0.matrix().rows(),4) = t0.matrix();\n  VERIFY_IS_APPROX(t0.inverse(Affine).matrix(), t044.inverse().block(0,0,t0.matrix().rows(),4));\n  t0.setIdentity();\n  t0.translate(v0).rotate(q1);\n  t044 = Matrix4::Zero();\n  t044(3,3) = 1;\n  t044.block(0,0,t0.matrix().rows(),4) = t0.matrix();\n  VERIFY_IS_APPROX(t0.inverse(Isometry).matrix(), t044.inverse().block(0,0,t0.matrix().rows(),4));\n\n  Matrix3 mat_rotation, mat_scaling;\n  t0.setIdentity();\n  t0.translate(v0).rotate(q1).scale(v1);\n  t0.computeRotationScaling(&mat_rotation, &mat_scaling);\n  VERIFY_IS_APPROX(t0.linear(), mat_rotation * mat_scaling);\n  VERIFY_IS_APPROX(mat_rotation*mat_rotation.adjoint(), Matrix3::Identity());\n  VERIFY_IS_APPROX(mat_rotation.determinant(), Scalar(1));\n  t0.computeScalingRotation(&mat_scaling, &mat_rotation);\n  VERIFY_IS_APPROX(t0.linear(), mat_scaling * mat_rotation);\n  VERIFY_IS_APPROX(mat_rotation*mat_rotation.adjoint(), Matrix3::Identity());\n  VERIFY_IS_APPROX(mat_rotation.determinant(), Scalar(1));\n\n  // test casting\n  Transform<float,3,Mode> t1f = t1.template cast<float>();\n  VERIFY_IS_APPROX(t1f.template cast<Scalar>(),t1);\n  Transform<double,3,Mode> t1d = t1.template cast<double>();\n  VERIFY_IS_APPROX(t1d.template cast<Scalar>(),t1);\n\n  Translation3 tr1(v0);\n  Translation<float,3> tr1f = tr1.template cast<float>();\n  VERIFY_IS_APPROX(tr1f.template cast<Scalar>(),tr1);\n  Translation<double,3> tr1d = tr1.template cast<double>();\n  VERIFY_IS_APPROX(tr1d.template cast<Scalar>(),tr1);\n\n  AngleAxis<float> aa1f = aa1.template cast<float>();\n  VERIFY_IS_APPROX(aa1f.template cast<Scalar>(),aa1);\n  AngleAxis<double> aa1d = aa1.template cast<double>();\n  VERIFY_IS_APPROX(aa1d.template cast<Scalar>(),aa1);\n\n  Rotation2D<Scalar> r2d1(internal::random<Scalar>());\n  Rotation2D<float> r2d1f = r2d1.template cast<float>();\n  VERIFY_IS_APPROX(r2d1f.template cast<Scalar>(),r2d1);\n  Rotation2D<double> r2d1d = r2d1.template cast<double>();\n  VERIFY_IS_APPROX(r2d1d.template cast<Scalar>(),r2d1);\n\n  t20 = Translation2(v20) * (Rotation2D<Scalar>(s0) * Eigen::Scaling(s0));\n  t21 = Translation2(v20) * Rotation2D<Scalar>(s0) * Eigen::Scaling(s0);\n  VERIFY_IS_APPROX(t20,t21);\n  \n  Rotation2D<Scalar> R0(s0), R1(s1);\n  t20 = Translation2(v20) * (R0 * Eigen::Scaling(s0));\n  t21 = Translation2(v20) * R0 * Eigen::Scaling(s0);\n  VERIFY_IS_APPROX(t20,t21);\n  \n  t20 = Translation2(v20) * (R0 * R0.inverse() * Eigen::Scaling(s0));\n  t21 = Translation2(v20) * Eigen::Scaling(s0);\n  VERIFY_IS_APPROX(t20,t21);\n  \n  VERIFY_IS_APPROX(s0, (R0.slerp(0, R1)).angle());\n  VERIFY_IS_APPROX(s1, (R0.slerp(1, R1)).angle());\n  VERIFY_IS_APPROX(s0, (R0.slerp(0.5, R0)).angle());\n  VERIFY_IS_APPROX(Scalar(0), (R0.slerp(0.5, R0.inverse())).angle());\n  \n  // check basic features\n  {\n    Rotation2D<Scalar> r1;           // default ctor\n    r1 = Rotation2D<Scalar>(s0);     // copy assignment\n    VERIFY_IS_APPROX(r1.angle(),s0);\n    Rotation2D<Scalar> r2(r1);       // copy ctor\n    VERIFY_IS_APPROX(r2.angle(),s0);\n  }\n}\n\ntemplate<typename Scalar> void transform_alignment()\n{\n  typedef Transform<Scalar,3,Projective,AutoAlign> Projective3a;\n  typedef Transform<Scalar,3,Projective,DontAlign> Projective3u;\n\n  EIGEN_ALIGN16 Scalar array1[16];\n  EIGEN_ALIGN16 Scalar array2[16];\n  EIGEN_ALIGN16 Scalar array3[16+1];\n  Scalar* array3u = array3+1;\n\n  Projective3a *p1 = ::new(reinterpret_cast<void*>(array1)) Projective3a;\n  Projective3u *p2 = ::new(reinterpret_cast<void*>(array2)) Projective3u;\n  Projective3u *p3 = ::new(reinterpret_cast<void*>(array3u)) Projective3u;\n  \n  p1->matrix().setRandom();\n  *p2 = *p1;\n  *p3 = *p1;\n\n  VERIFY_IS_APPROX(p1->matrix(), p2->matrix());\n  VERIFY_IS_APPROX(p1->matrix(), p3->matrix());\n  \n  VERIFY_IS_APPROX( (*p1) * (*p1), (*p2)*(*p3));\n  \n  #if defined(EIGEN_VECTORIZE) && EIGEN_ALIGN_STATICALLY\n  if(internal::packet_traits<Scalar>::Vectorizable)\n    VERIFY_RAISES_ASSERT((::new(reinterpret_cast<void*>(array3u)) Projective3a));\n  #endif\n}\n\ntemplate<typename Scalar, int Dim, int Options> void transform_products()\n{\n  typedef Matrix<Scalar,Dim+1,Dim+1> Mat;\n  typedef Transform<Scalar,Dim,Projective,Options> Proj;\n  typedef Transform<Scalar,Dim,Affine,Options> Aff;\n  typedef Transform<Scalar,Dim,AffineCompact,Options> AffC;\n\n  Proj p; p.matrix().setRandom();\n  Aff a; a.linear().setRandom(); a.translation().setRandom();\n  AffC ac = a;\n\n  Mat p_m(p.matrix()), a_m(a.matrix());\n\n  VERIFY_IS_APPROX((p*p).matrix(), p_m*p_m);\n  VERIFY_IS_APPROX((a*a).matrix(), a_m*a_m);\n  VERIFY_IS_APPROX((p*a).matrix(), p_m*a_m);\n  VERIFY_IS_APPROX((a*p).matrix(), a_m*p_m);\n  VERIFY_IS_APPROX((ac*a).matrix(), a_m*a_m);\n  VERIFY_IS_APPROX((a*ac).matrix(), a_m*a_m);\n  VERIFY_IS_APPROX((p*ac).matrix(), p_m*a_m);\n  VERIFY_IS_APPROX((ac*p).matrix(), a_m*p_m);\n}\n\nvoid test_geo_transformations()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1(( transformations<double,Affine,AutoAlign>() ));\n    CALL_SUBTEST_1(( non_projective_only<double,Affine,AutoAlign>() ));\n    \n    CALL_SUBTEST_2(( transformations<float,AffineCompact,AutoAlign>() ));\n    CALL_SUBTEST_2(( non_projective_only<float,AffineCompact,AutoAlign>() ));\n    CALL_SUBTEST_2(( transform_alignment<float>() ));\n    \n    CALL_SUBTEST_3(( transformations<double,Projective,AutoAlign>() ));\n    CALL_SUBTEST_3(( transformations<double,Projective,DontAlign>() ));\n    CALL_SUBTEST_3(( transform_alignment<double>() ));\n    \n    CALL_SUBTEST_4(( transformations<float,Affine,RowMajor|AutoAlign>() ));\n    CALL_SUBTEST_4(( non_projective_only<float,Affine,RowMajor>() ));\n    \n    CALL_SUBTEST_5(( transformations<double,AffineCompact,RowMajor|AutoAlign>() ));\n    CALL_SUBTEST_5(( non_projective_only<double,AffineCompact,RowMajor>() ));\n\n    CALL_SUBTEST_6(( transformations<double,Projective,RowMajor|AutoAlign>() ));\n    CALL_SUBTEST_6(( transformations<double,Projective,RowMajor|DontAlign>() ));\n\n\n    CALL_SUBTEST_7(( transform_products<double,3,RowMajor|AutoAlign>() ));\n    CALL_SUBTEST_7(( transform_products<float,2,AutoAlign>() ));\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/hessenberg.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2010 Jitse Niesen <jitse@maths.leeds.ac.uk>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <Eigen/Eigenvalues>\n\ntemplate<typename Scalar,int Size> void hessenberg(int size = Size)\n{\n  typedef Matrix<Scalar,Size,Size> MatrixType;\n\n  // Test basic functionality: A = U H U* and H is Hessenberg\n  for(int counter = 0; counter < g_repeat; ++counter) {\n    MatrixType m = MatrixType::Random(size,size);\n    HessenbergDecomposition<MatrixType> hess(m);\n    MatrixType Q = hess.matrixQ();\n    MatrixType H = hess.matrixH();\n    VERIFY_IS_APPROX(m, Q * H * Q.adjoint());\n    for(int row = 2; row < size; ++row) {\n      for(int col = 0; col < row-1; ++col) {\n\tVERIFY(H(row,col) == (typename MatrixType::Scalar)0);\n      }\n    }\n  }\n\n  // Test whether compute() and constructor returns same result\n  MatrixType A = MatrixType::Random(size, size);\n  HessenbergDecomposition<MatrixType> cs1;\n  cs1.compute(A);\n  HessenbergDecomposition<MatrixType> cs2(A);\n  VERIFY_IS_EQUAL(cs1.matrixH().eval(), cs2.matrixH().eval());\n  MatrixType cs1Q = cs1.matrixQ();\n  MatrixType cs2Q = cs2.matrixQ();  \n  VERIFY_IS_EQUAL(cs1Q, cs2Q);\n\n  // Test assertions for when used uninitialized\n  HessenbergDecomposition<MatrixType> hessUninitialized;\n  VERIFY_RAISES_ASSERT( hessUninitialized.matrixH() );\n  VERIFY_RAISES_ASSERT( hessUninitialized.matrixQ() );\n  VERIFY_RAISES_ASSERT( hessUninitialized.householderCoefficients() );\n  VERIFY_RAISES_ASSERT( hessUninitialized.packedMatrix() );\n\n  // TODO: Add tests for packedMatrix() and householderCoefficients()\n}\n\nvoid test_hessenberg()\n{\n  CALL_SUBTEST_1(( hessenberg<std::complex<double>,1>() ));\n  CALL_SUBTEST_2(( hessenberg<std::complex<double>,2>() ));\n  CALL_SUBTEST_3(( hessenberg<std::complex<float>,4>() ));\n  CALL_SUBTEST_4(( hessenberg<float,Dynamic>(internal::random<int>(1,EIGEN_TEST_MAX_SIZE)) ));\n  CALL_SUBTEST_5(( hessenberg<std::complex<double>,Dynamic>(internal::random<int>(1,EIGEN_TEST_MAX_SIZE)) ));\n\n  // Test problem size constructors\n  CALL_SUBTEST_6(HessenbergDecomposition<MatrixXf>(10));\n}\n"
  },
  {
    "path": "libs/eigen/test/householder.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009-2010 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <Eigen/QR>\n\ntemplate<typename MatrixType> void householder(const MatrixType& m)\n{\n  typedef typename MatrixType::Index Index;\n  static bool even = true;\n  even = !even;\n  /* this test covers the following files:\n     Householder.h\n  */\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> VectorType;\n  typedef Matrix<Scalar, internal::decrement_size<MatrixType::RowsAtCompileTime>::ret, 1> EssentialVectorType;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, MatrixType::RowsAtCompileTime> SquareMatrixType;\n  typedef Matrix<Scalar, Dynamic, MatrixType::ColsAtCompileTime> HBlockMatrixType;\n  typedef Matrix<Scalar, Dynamic, 1> HCoeffsVectorType;\n\n  typedef Matrix<Scalar, MatrixType::ColsAtCompileTime, MatrixType::RowsAtCompileTime> TMatrixType;\n  \n  Matrix<Scalar, EIGEN_SIZE_MAX(MatrixType::RowsAtCompileTime,MatrixType::ColsAtCompileTime), 1> _tmp((std::max)(rows,cols));\n  Scalar* tmp = &_tmp.coeffRef(0,0);\n\n  Scalar beta;\n  RealScalar alpha;\n  EssentialVectorType essential;\n\n  VectorType v1 = VectorType::Random(rows), v2;\n  v2 = v1;\n  v1.makeHouseholder(essential, beta, alpha);\n  v1.applyHouseholderOnTheLeft(essential,beta,tmp);\n  VERIFY_IS_APPROX(v1.norm(), v2.norm());\n  if(rows>=2) VERIFY_IS_MUCH_SMALLER_THAN(v1.tail(rows-1).norm(), v1.norm());\n  v1 = VectorType::Random(rows);\n  v2 = v1;\n  v1.applyHouseholderOnTheLeft(essential,beta,tmp);\n  VERIFY_IS_APPROX(v1.norm(), v2.norm());\n\n  MatrixType m1(rows, cols),\n             m2(rows, cols);\n\n  v1 = VectorType::Random(rows);\n  if(even) v1.tail(rows-1).setZero();\n  m1.colwise() = v1;\n  m2 = m1;\n  m1.col(0).makeHouseholder(essential, beta, alpha);\n  m1.applyHouseholderOnTheLeft(essential,beta,tmp);\n  VERIFY_IS_APPROX(m1.norm(), m2.norm());\n  if(rows>=2) VERIFY_IS_MUCH_SMALLER_THAN(m1.block(1,0,rows-1,cols).norm(), m1.norm());\n  VERIFY_IS_MUCH_SMALLER_THAN(numext::imag(m1(0,0)), numext::real(m1(0,0)));\n  VERIFY_IS_APPROX(numext::real(m1(0,0)), alpha);\n\n  v1 = VectorType::Random(rows);\n  if(even) v1.tail(rows-1).setZero();\n  SquareMatrixType m3(rows,rows), m4(rows,rows);\n  m3.rowwise() = v1.transpose();\n  m4 = m3;\n  m3.row(0).makeHouseholder(essential, beta, alpha);\n  m3.applyHouseholderOnTheRight(essential,beta,tmp);\n  VERIFY_IS_APPROX(m3.norm(), m4.norm());\n  if(rows>=2) VERIFY_IS_MUCH_SMALLER_THAN(m3.block(0,1,rows,rows-1).norm(), m3.norm());\n  VERIFY_IS_MUCH_SMALLER_THAN(numext::imag(m3(0,0)), numext::real(m3(0,0)));\n  VERIFY_IS_APPROX(numext::real(m3(0,0)), alpha);\n\n  // test householder sequence on the left with a shift\n\n  Index shift = internal::random<Index>(0, std::max<Index>(rows-2,0));\n  Index brows = rows - shift;\n  m1.setRandom(rows, cols);\n  HBlockMatrixType hbm = m1.block(shift,0,brows,cols);\n  HouseholderQR<HBlockMatrixType> qr(hbm);\n  m2 = m1;\n  m2.block(shift,0,brows,cols) = qr.matrixQR();\n  HCoeffsVectorType hc = qr.hCoeffs().conjugate();\n  HouseholderSequence<MatrixType, HCoeffsVectorType> hseq(m2, hc);\n  hseq.setLength(hc.size()).setShift(shift);\n  VERIFY(hseq.length() == hc.size());\n  VERIFY(hseq.shift() == shift);\n  \n  MatrixType m5 = m2;\n  m5.block(shift,0,brows,cols).template triangularView<StrictlyLower>().setZero();\n  VERIFY_IS_APPROX(hseq * m5, m1); // test applying hseq directly\n  m3 = hseq;\n  VERIFY_IS_APPROX(m3 * m5, m1); // test evaluating hseq to a dense matrix, then applying\n  \n  SquareMatrixType hseq_mat = hseq;\n  SquareMatrixType hseq_mat_conj = hseq.conjugate();\n  SquareMatrixType hseq_mat_adj = hseq.adjoint();\n  SquareMatrixType hseq_mat_trans = hseq.transpose();\n  SquareMatrixType m6 = SquareMatrixType::Random(rows, rows);\n  VERIFY_IS_APPROX(hseq_mat.adjoint(),    hseq_mat_adj);\n  VERIFY_IS_APPROX(hseq_mat.conjugate(),  hseq_mat_conj);\n  VERIFY_IS_APPROX(hseq_mat.transpose(),  hseq_mat_trans);\n  VERIFY_IS_APPROX(hseq_mat * m6,             hseq_mat * m6);\n  VERIFY_IS_APPROX(hseq_mat.adjoint() * m6,   hseq_mat_adj * m6);\n  VERIFY_IS_APPROX(hseq_mat.conjugate() * m6, hseq_mat_conj * m6);\n  VERIFY_IS_APPROX(hseq_mat.transpose() * m6, hseq_mat_trans * m6);\n  VERIFY_IS_APPROX(m6 * hseq_mat,             m6 * hseq_mat);\n  VERIFY_IS_APPROX(m6 * hseq_mat.adjoint(),   m6 * hseq_mat_adj);\n  VERIFY_IS_APPROX(m6 * hseq_mat.conjugate(), m6 * hseq_mat_conj);\n  VERIFY_IS_APPROX(m6 * hseq_mat.transpose(), m6 * hseq_mat_trans);\n\n  // test householder sequence on the right with a shift\n\n  TMatrixType tm2 = m2.transpose();\n  HouseholderSequence<TMatrixType, HCoeffsVectorType, OnTheRight> rhseq(tm2, hc);\n  rhseq.setLength(hc.size()).setShift(shift);\n  VERIFY_IS_APPROX(rhseq * m5, m1); // test applying rhseq directly\n  m3 = rhseq;\n  VERIFY_IS_APPROX(m3 * m5, m1); // test evaluating rhseq to a dense matrix, then applying\n}\n\nvoid test_householder()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( householder(Matrix<double,2,2>()) );\n    CALL_SUBTEST_2( householder(Matrix<float,2,3>()) );\n    CALL_SUBTEST_3( householder(Matrix<double,3,5>()) );\n    CALL_SUBTEST_4( householder(Matrix<float,4,4>()) );\n    CALL_SUBTEST_5( householder(MatrixXd(internal::random<int>(1,EIGEN_TEST_MAX_SIZE),internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n    CALL_SUBTEST_6( householder(MatrixXcf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE),internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n    CALL_SUBTEST_7( householder(MatrixXf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE),internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n    CALL_SUBTEST_8( householder(Matrix<double,1,1>()) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/integer_types.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2010 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#define EIGEN_NO_STATIC_ASSERT\n\n#include \"main.h\"\n\n#undef VERIFY_IS_APPROX\n#define VERIFY_IS_APPROX(a, b) VERIFY((a)==(b));\n#undef VERIFY_IS_NOT_APPROX\n#define VERIFY_IS_NOT_APPROX(a, b) VERIFY((a)!=(b));\n\ntemplate<typename MatrixType> void signed_integer_type_tests(const MatrixType& m)\n{\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n\n  enum { is_signed = (Scalar(-1) > Scalar(0)) ? 0 : 1 };\n  VERIFY(is_signed == 1);\n\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  MatrixType m1(rows, cols),\n             m2 = MatrixType::Random(rows, cols),\n             mzero = MatrixType::Zero(rows, cols);\n\n  do {\n    m1 = MatrixType::Random(rows, cols);\n  } while(m1 == mzero || m1 == m2);\n\n  // check linear structure\n\n  Scalar s1;\n  do {\n    s1 = internal::random<Scalar>();\n  } while(s1 == 0);\n\n  VERIFY_IS_EQUAL(-(-m1),                  m1);\n  VERIFY_IS_EQUAL(-m2+m1+m2,               m1);\n  VERIFY_IS_EQUAL((-m1+m2)*s1,             -s1*m1+s1*m2);\n}\n\ntemplate<typename MatrixType> void integer_type_tests(const MatrixType& m)\n{\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n\n  VERIFY(NumTraits<Scalar>::IsInteger);\n  enum { is_signed = (Scalar(-1) > Scalar(0)) ? 0 : 1 };\n  VERIFY(int(NumTraits<Scalar>::IsSigned) == is_signed);\n\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> VectorType;\n\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  // this test relies a lot on Random.h, and there's not much more that we can do\n  // to test it, hence I consider that we will have tested Random.h\n  MatrixType m1(rows, cols),\n             m2 = MatrixType::Random(rows, cols),\n             m3(rows, cols),\n             mzero = MatrixType::Zero(rows, cols);\n\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, MatrixType::RowsAtCompileTime> SquareMatrixType;\n  SquareMatrixType identity = SquareMatrixType::Identity(rows, rows),\n                   square = SquareMatrixType::Random(rows, rows);\n  VectorType v1(rows),\n             v2 = VectorType::Random(rows),\n             vzero = VectorType::Zero(rows);\n\n  do {\n    m1 = MatrixType::Random(rows, cols);\n  } while(m1 == mzero || m1 == m2);\n\n  do {\n    v1 = VectorType::Random(rows);\n  } while(v1 == vzero || v1 == v2);\n\n  VERIFY_IS_APPROX(               v1,    v1);\n  VERIFY_IS_NOT_APPROX(           v1,    2*v1);\n  VERIFY_IS_APPROX(               vzero, v1-v1);\n  VERIFY_IS_APPROX(               m1,    m1);\n  VERIFY_IS_NOT_APPROX(           m1,    2*m1);\n  VERIFY_IS_APPROX(               mzero, m1-m1);\n\n  VERIFY_IS_APPROX(m3 = m1,m1);\n  MatrixType m4;\n  VERIFY_IS_APPROX(m4 = m1,m1);\n\n  m3.real() = m1.real();\n  VERIFY_IS_APPROX(static_cast<const MatrixType&>(m3).real(), static_cast<const MatrixType&>(m1).real());\n  VERIFY_IS_APPROX(static_cast<const MatrixType&>(m3).real(), m1.real());\n\n  // check == / != operators\n  VERIFY(m1==m1);\n  VERIFY(m1!=m2);\n  VERIFY(!(m1==m2));\n  VERIFY(!(m1!=m1));\n  m1 = m2;\n  VERIFY(m1==m2);\n  VERIFY(!(m1!=m2));\n\n  // check linear structure\n\n  Scalar s1;\n  do {\n    s1 = internal::random<Scalar>();\n  } while(s1 == 0);\n\n  VERIFY_IS_EQUAL(m1+m1,                   2*m1);\n  VERIFY_IS_EQUAL(m1+m2-m1,                m2);\n  VERIFY_IS_EQUAL(m1*s1,                   s1*m1);\n  VERIFY_IS_EQUAL((m1+m2)*s1,              s1*m1+s1*m2);\n  m3 = m2; m3 += m1;\n  VERIFY_IS_EQUAL(m3,                      m1+m2);\n  m3 = m2; m3 -= m1;\n  VERIFY_IS_EQUAL(m3,                      m2-m1);\n  m3 = m2; m3 *= s1;\n  VERIFY_IS_EQUAL(m3,                      s1*m2);\n\n  // check matrix product.\n\n  VERIFY_IS_APPROX(identity * m1, m1);\n  VERIFY_IS_APPROX(square * (m1 + m2), square * m1 + square * m2);\n  VERIFY_IS_APPROX((m1 + m2).transpose() * square, m1.transpose() * square + m2.transpose() * square);\n  VERIFY_IS_APPROX((m1 * m2.transpose()) * m1, m1 * (m2.transpose() * m1));\n}\n\nvoid test_integer_types()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( integer_type_tests(Matrix<unsigned int, 1, 1>()) );\n    CALL_SUBTEST_1( integer_type_tests(Matrix<unsigned long, 3, 4>()) );\n\n    CALL_SUBTEST_2( integer_type_tests(Matrix<long, 2, 2>()) );\n    CALL_SUBTEST_2( signed_integer_type_tests(Matrix<long, 2, 2>()) );\n\n    CALL_SUBTEST_3( integer_type_tests(Matrix<char, 2, Dynamic>(2, 10)) );\n    CALL_SUBTEST_3( signed_integer_type_tests(Matrix<signed char, 2, Dynamic>(2, 10)) );\n\n    CALL_SUBTEST_4( integer_type_tests(Matrix<unsigned char, 3, 3>()) );\n    CALL_SUBTEST_4( integer_type_tests(Matrix<unsigned char, Dynamic, Dynamic>(20, 20)) );\n\n    CALL_SUBTEST_5( integer_type_tests(Matrix<short, Dynamic, 4>(7, 4)) );\n    CALL_SUBTEST_5( signed_integer_type_tests(Matrix<short, Dynamic, 4>(7, 4)) );\n\n    CALL_SUBTEST_6( integer_type_tests(Matrix<unsigned short, 4, 4>()) );\n\n    CALL_SUBTEST_7( integer_type_tests(Matrix<long long, 11, 13>()) );\n    CALL_SUBTEST_7( signed_integer_type_tests(Matrix<long long, 11, 13>()) );\n\n    CALL_SUBTEST_8( integer_type_tests(Matrix<unsigned long long, Dynamic, 5>(1, 5)) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/inverse.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <Eigen/LU>\n\ntemplate<typename MatrixType> void inverse(const MatrixType& m)\n{\n  using std::abs;\n  typedef typename MatrixType::Index Index;\n  /* this test covers the following files:\n     Inverse.h\n  */\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  typedef typename MatrixType::Scalar Scalar;\n\n  MatrixType m1(rows, cols),\n             m2(rows, cols),\n             identity = MatrixType::Identity(rows, rows);\n  createRandomPIMatrixOfRank(rows,rows,rows,m1);\n  m2 = m1.inverse();\n  VERIFY_IS_APPROX(m1, m2.inverse() );\n\n  VERIFY_IS_APPROX((Scalar(2)*m2).inverse(), m2.inverse()*Scalar(0.5));\n\n  VERIFY_IS_APPROX(identity, m1.inverse() * m1 );\n  VERIFY_IS_APPROX(identity, m1 * m1.inverse() );\n\n  VERIFY_IS_APPROX(m1, m1.inverse().inverse() );\n\n  // since for the general case we implement separately row-major and col-major, test that\n  VERIFY_IS_APPROX(MatrixType(m1.transpose().inverse()), MatrixType(m1.inverse().transpose()));\n\n#if !defined(EIGEN_TEST_PART_5) && !defined(EIGEN_TEST_PART_6)\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  typedef Matrix<Scalar, MatrixType::ColsAtCompileTime, 1> VectorType;\n  \n  //computeInverseAndDetWithCheck tests\n  //First: an invertible matrix\n  bool invertible;\n  RealScalar det;\n\n  m2.setZero();\n  m1.computeInverseAndDetWithCheck(m2, det, invertible);\n  VERIFY(invertible);\n  VERIFY_IS_APPROX(identity, m1*m2);\n  VERIFY_IS_APPROX(det, m1.determinant());\n\n  m2.setZero();\n  m1.computeInverseWithCheck(m2, invertible);\n  VERIFY(invertible);\n  VERIFY_IS_APPROX(identity, m1*m2);\n\n  //Second: a rank one matrix (not invertible, except for 1x1 matrices)\n  VectorType v3 = VectorType::Random(rows);\n  MatrixType m3 = v3*v3.transpose(), m4(rows,cols);\n  m3.computeInverseAndDetWithCheck(m4, det, invertible);\n  VERIFY( rows==1 ? invertible : !invertible );\n  VERIFY_IS_MUCH_SMALLER_THAN(abs(det-m3.determinant()), RealScalar(1));\n  m3.computeInverseWithCheck(m4, invertible);\n  VERIFY( rows==1 ? invertible : !invertible );\n#endif\n\n  // check in-place inversion\n  if(MatrixType::RowsAtCompileTime>=2 && MatrixType::RowsAtCompileTime<=4)\n  {\n    // in-place is forbidden\n    VERIFY_RAISES_ASSERT(m1 = m1.inverse());\n  }\n  else\n  {\n    m2 = m1.inverse();\n    m1 = m1.inverse();\n    VERIFY_IS_APPROX(m1,m2);\n  }\n}\n\nvoid test_inverse()\n{\n  int s = 0;\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( inverse(Matrix<double,1,1>()) );\n    CALL_SUBTEST_2( inverse(Matrix2d()) );\n    CALL_SUBTEST_3( inverse(Matrix3f()) );\n    CALL_SUBTEST_4( inverse(Matrix4f()) );\n    CALL_SUBTEST_4( inverse(Matrix<float,4,4,DontAlign>()) );\n    s = internal::random<int>(50,320); \n    CALL_SUBTEST_5( inverse(MatrixXf(s,s)) );\n    s = internal::random<int>(25,100);\n    CALL_SUBTEST_6( inverse(MatrixXcd(s,s)) );\n    CALL_SUBTEST_7( inverse(Matrix4d()) );\n    CALL_SUBTEST_7( inverse(Matrix<double,4,4,DontAlign>()) );\n  }\n  TEST_SET_BUT_UNUSED_VARIABLE(s)\n}\n"
  },
  {
    "path": "libs/eigen/test/jacobi.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <Eigen/SVD>\n\ntemplate<typename MatrixType, typename JacobiScalar>\nvoid jacobi(const MatrixType& m = MatrixType())\n{\n  typedef typename MatrixType::Index Index;\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  enum {\n    RowsAtCompileTime = MatrixType::RowsAtCompileTime,\n    ColsAtCompileTime = MatrixType::ColsAtCompileTime\n  };\n\n  typedef Matrix<JacobiScalar, 2, 1> JacobiVector;\n\n  const MatrixType a(MatrixType::Random(rows, cols));\n\n  JacobiVector v = JacobiVector::Random().normalized();\n  JacobiScalar c = v.x(), s = v.y();\n  JacobiRotation<JacobiScalar> rot(c, s);\n\n  {\n    Index p = internal::random<Index>(0, rows-1);\n    Index q;\n    do {\n      q = internal::random<Index>(0, rows-1);\n    } while (q == p);\n\n    MatrixType b = a;\n    b.applyOnTheLeft(p, q, rot);\n    VERIFY_IS_APPROX(b.row(p), c * a.row(p) + numext::conj(s) * a.row(q));\n    VERIFY_IS_APPROX(b.row(q), -s * a.row(p) + numext::conj(c) * a.row(q));\n  }\n\n  {\n    Index p = internal::random<Index>(0, cols-1);\n    Index q;\n    do {\n      q = internal::random<Index>(0, cols-1);\n    } while (q == p);\n\n    MatrixType b = a;\n    b.applyOnTheRight(p, q, rot);\n    VERIFY_IS_APPROX(b.col(p), c * a.col(p) - s * a.col(q));\n    VERIFY_IS_APPROX(b.col(q), numext::conj(s) * a.col(p) + numext::conj(c) * a.col(q));\n  }\n}\n\nvoid test_jacobi()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1(( jacobi<Matrix3f, float>() ));\n    CALL_SUBTEST_2(( jacobi<Matrix4d, double>() ));\n    CALL_SUBTEST_3(( jacobi<Matrix4cf, float>() ));\n    CALL_SUBTEST_3(( jacobi<Matrix4cf, std::complex<float> >() ));\n\n    int r = internal::random<int>(2, internal::random<int>(1,EIGEN_TEST_MAX_SIZE)/2),\n        c = internal::random<int>(2, internal::random<int>(1,EIGEN_TEST_MAX_SIZE)/2);\n    CALL_SUBTEST_4(( jacobi<MatrixXf, float>(MatrixXf(r,c)) ));\n    CALL_SUBTEST_5(( jacobi<MatrixXcd, double>(MatrixXcd(r,c)) ));\n    CALL_SUBTEST_5(( jacobi<MatrixXcd, std::complex<double> >(MatrixXcd(r,c)) ));\n    // complex<float> is really important to test as it is the only way to cover conjugation issues in certain unaligned paths\n    CALL_SUBTEST_6(( jacobi<MatrixXcf, float>(MatrixXcf(r,c)) ));\n    CALL_SUBTEST_6(( jacobi<MatrixXcf, std::complex<float> >(MatrixXcf(r,c)) ));\n    \n    TEST_SET_BUT_UNUSED_VARIABLE(r);\n    TEST_SET_BUT_UNUSED_VARIABLE(c);\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/jacobisvd.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n// discard stack allocation as that too bypasses malloc\n#define EIGEN_STACK_ALLOCATION_LIMIT 0\n#define EIGEN_RUNTIME_NO_MALLOC\n#include \"main.h\"\n#include <Eigen/SVD>\n\ntemplate<typename MatrixType, int QRPreconditioner>\nvoid jacobisvd_check_full(const MatrixType& m, const JacobiSVD<MatrixType, QRPreconditioner>& svd)\n{\n  typedef typename MatrixType::Index Index;\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  enum {\n    RowsAtCompileTime = MatrixType::RowsAtCompileTime,\n    ColsAtCompileTime = MatrixType::ColsAtCompileTime\n  };\n\n  typedef typename MatrixType::Scalar Scalar;\n  typedef Matrix<Scalar, RowsAtCompileTime, RowsAtCompileTime> MatrixUType;\n  typedef Matrix<Scalar, ColsAtCompileTime, ColsAtCompileTime> MatrixVType;\n\n  MatrixType sigma = MatrixType::Zero(rows,cols);\n  sigma.diagonal() = svd.singularValues().template cast<Scalar>();\n  MatrixUType u = svd.matrixU();\n  MatrixVType v = svd.matrixV();\n\n  VERIFY_IS_APPROX(m, u * sigma * v.adjoint());\n  VERIFY_IS_UNITARY(u);\n  VERIFY_IS_UNITARY(v);\n}\n\ntemplate<typename MatrixType, int QRPreconditioner>\nvoid jacobisvd_compare_to_full(const MatrixType& m,\n                               unsigned int computationOptions,\n                               const JacobiSVD<MatrixType, QRPreconditioner>& referenceSvd)\n{\n  typedef typename MatrixType::Index Index;\n  Index rows = m.rows();\n  Index cols = m.cols();\n  Index diagSize = (std::min)(rows, cols);\n\n  JacobiSVD<MatrixType, QRPreconditioner> svd(m, computationOptions);\n\n  VERIFY_IS_APPROX(svd.singularValues(), referenceSvd.singularValues());\n  if(computationOptions & ComputeFullU)\n    VERIFY_IS_APPROX(svd.matrixU(), referenceSvd.matrixU());\n  if(computationOptions & ComputeThinU)\n    VERIFY_IS_APPROX(svd.matrixU(), referenceSvd.matrixU().leftCols(diagSize));\n  if(computationOptions & ComputeFullV)\n    VERIFY_IS_APPROX(svd.matrixV(), referenceSvd.matrixV());\n  if(computationOptions & ComputeThinV)\n    VERIFY_IS_APPROX(svd.matrixV(), referenceSvd.matrixV().leftCols(diagSize));\n}\n\ntemplate<typename MatrixType, int QRPreconditioner>\nvoid jacobisvd_solve(const MatrixType& m, unsigned int computationOptions)\n{\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename MatrixType::RealScalar RealScalar;\n  typedef typename MatrixType::Index Index;\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  enum {\n    RowsAtCompileTime = MatrixType::RowsAtCompileTime,\n    ColsAtCompileTime = MatrixType::ColsAtCompileTime\n  };\n\n  typedef Matrix<Scalar, RowsAtCompileTime, Dynamic> RhsType;\n  typedef Matrix<Scalar, ColsAtCompileTime, Dynamic> SolutionType;\n\n  RhsType rhs = RhsType::Random(rows, internal::random<Index>(1, cols));\n  JacobiSVD<MatrixType, QRPreconditioner> svd(m, computationOptions);\n\n       if(internal::is_same<RealScalar,double>::value) svd.setThreshold(1e-8);\n  else if(internal::is_same<RealScalar,float>::value)  svd.setThreshold(1e-4);\n  \n  SolutionType x = svd.solve(rhs);\n  \n  RealScalar residual = (m*x-rhs).norm();\n  // Check that there is no significantly better solution in the neighborhood of x\n  if(!test_isMuchSmallerThan(residual,rhs.norm()))\n  {\n    // If the residual is very small, then we have an exact solution, so we are already good.\n    for(int k=0;k<x.rows();++k)\n    {\n      SolutionType y(x);\n      y.row(k).array() += 2*NumTraits<RealScalar>::epsilon();\n      RealScalar residual_y = (m*y-rhs).norm();\n      VERIFY( test_isApprox(residual_y,residual) || residual < residual_y );\n      \n      y.row(k) = x.row(k).array() - 2*NumTraits<RealScalar>::epsilon();\n      residual_y = (m*y-rhs).norm();\n      VERIFY( test_isApprox(residual_y,residual) || residual < residual_y );\n    }\n  }\n  \n  // evaluate normal equation which works also for least-squares solutions\n  if(internal::is_same<RealScalar,double>::value)\n  {\n    // This test is not stable with single precision.\n    // This is probably because squaring m signicantly affects the precision.\n    VERIFY_IS_APPROX(m.adjoint()*m*x,m.adjoint()*rhs);\n  }\n  \n  // check minimal norm solutions\n  {\n    // generate a full-rank m x n problem with m<n\n    enum {\n      RankAtCompileTime2 = ColsAtCompileTime==Dynamic ? Dynamic : (ColsAtCompileTime)/2+1,\n      RowsAtCompileTime3 = ColsAtCompileTime==Dynamic ? Dynamic : ColsAtCompileTime+1\n    };\n    typedef Matrix<Scalar, RankAtCompileTime2, ColsAtCompileTime> MatrixType2;\n    typedef Matrix<Scalar, RankAtCompileTime2, 1> RhsType2;\n    typedef Matrix<Scalar, ColsAtCompileTime, RankAtCompileTime2> MatrixType2T;\n    Index rank = RankAtCompileTime2==Dynamic ? internal::random<Index>(1,cols) : Index(RankAtCompileTime2);\n    MatrixType2 m2(rank,cols);\n    int guard = 0;\n    do {\n      m2.setRandom();\n    } while(m2.jacobiSvd().setThreshold(test_precision<Scalar>()).rank()!=rank && (++guard)<10);\n    VERIFY(guard<10);\n    RhsType2 rhs2 = RhsType2::Random(rank);\n    // use QR to find a reference minimal norm solution\n    HouseholderQR<MatrixType2T> qr(m2.adjoint());\n    Matrix<Scalar,Dynamic,1> tmp = qr.matrixQR().topLeftCorner(rank,rank).template triangularView<Upper>().adjoint().solve(rhs2);\n    tmp.conservativeResize(cols);\n    tmp.tail(cols-rank).setZero();\n    SolutionType x21 = qr.householderQ() * tmp;\n    // now check with SVD\n    JacobiSVD<MatrixType2, ColPivHouseholderQRPreconditioner> svd2(m2, computationOptions);\n    SolutionType x22 = svd2.solve(rhs2);\n    VERIFY_IS_APPROX(m2*x21, rhs2);\n    VERIFY_IS_APPROX(m2*x22, rhs2);\n    VERIFY_IS_APPROX(x21, x22);\n    \n    // Now check with a rank deficient matrix\n    typedef Matrix<Scalar, RowsAtCompileTime3, ColsAtCompileTime> MatrixType3;\n    typedef Matrix<Scalar, RowsAtCompileTime3, 1> RhsType3;\n    Index rows3 = RowsAtCompileTime3==Dynamic ? internal::random<Index>(rank+1,2*cols) : Index(RowsAtCompileTime3);\n    Matrix<Scalar,RowsAtCompileTime3,Dynamic> C = Matrix<Scalar,RowsAtCompileTime3,Dynamic>::Random(rows3,rank);\n    MatrixType3 m3 = C * m2;\n    RhsType3 rhs3 = C * rhs2;\n    JacobiSVD<MatrixType3, ColPivHouseholderQRPreconditioner> svd3(m3, computationOptions);\n    SolutionType x3 = svd3.solve(rhs3);\n    if(svd3.rank()!=rank) {\n      std::cout << m3 << \"\\n\\n\";\n      std::cout << svd3.singularValues().transpose() << \"\\n\";\n    std::cout << svd3.rank() << \" == \" << rank << \"\\n\";\n    std::cout << x21.norm() << \" == \" << x3.norm() << \"\\n\";\n    }\n//     VERIFY_IS_APPROX(m3*x3, rhs3);\n    VERIFY_IS_APPROX(m3*x21, rhs3);\n    VERIFY_IS_APPROX(m2*x3, rhs2);\n    \n    VERIFY_IS_APPROX(x21, x3);\n  }\n}\n\ntemplate<typename MatrixType, int QRPreconditioner>\nvoid jacobisvd_test_all_computation_options(const MatrixType& m)\n{\n  if (QRPreconditioner == NoQRPreconditioner && m.rows() != m.cols())\n    return;\n  JacobiSVD<MatrixType, QRPreconditioner> fullSvd(m, ComputeFullU|ComputeFullV);\n  CALL_SUBTEST(( jacobisvd_check_full(m, fullSvd) ));\n  CALL_SUBTEST(( jacobisvd_solve<MatrixType, QRPreconditioner>(m, ComputeFullU | ComputeFullV) ));\n  \n  #if defined __INTEL_COMPILER\n  // remark #111: statement is unreachable\n  #pragma warning disable 111\n  #endif\n  if(QRPreconditioner == FullPivHouseholderQRPreconditioner)\n    return;\n\n  CALL_SUBTEST(( jacobisvd_compare_to_full(m, ComputeFullU, fullSvd) ));\n  CALL_SUBTEST(( jacobisvd_compare_to_full(m, ComputeFullV, fullSvd) ));\n  CALL_SUBTEST(( jacobisvd_compare_to_full(m, 0, fullSvd) ));\n\n  if (MatrixType::ColsAtCompileTime == Dynamic) {\n    // thin U/V are only available with dynamic number of columns\n    CALL_SUBTEST(( jacobisvd_compare_to_full(m, ComputeFullU|ComputeThinV, fullSvd) ));\n    CALL_SUBTEST(( jacobisvd_compare_to_full(m,              ComputeThinV, fullSvd) ));\n    CALL_SUBTEST(( jacobisvd_compare_to_full(m, ComputeThinU|ComputeFullV, fullSvd) ));\n    CALL_SUBTEST(( jacobisvd_compare_to_full(m, ComputeThinU             , fullSvd) ));\n    CALL_SUBTEST(( jacobisvd_compare_to_full(m, ComputeThinU|ComputeThinV, fullSvd) ));\n    CALL_SUBTEST(( jacobisvd_solve<MatrixType, QRPreconditioner>(m, ComputeFullU | ComputeThinV) ));\n    CALL_SUBTEST(( jacobisvd_solve<MatrixType, QRPreconditioner>(m, ComputeThinU | ComputeFullV) ));\n    CALL_SUBTEST(( jacobisvd_solve<MatrixType, QRPreconditioner>(m, ComputeThinU | ComputeThinV) ));\n\n    // test reconstruction\n    typedef typename MatrixType::Index Index;\n    Index diagSize = (std::min)(m.rows(), m.cols());\n    JacobiSVD<MatrixType, QRPreconditioner> svd(m, ComputeThinU | ComputeThinV);\n    VERIFY_IS_APPROX(m, svd.matrixU().leftCols(diagSize) * svd.singularValues().asDiagonal() * svd.matrixV().leftCols(diagSize).adjoint());\n  }\n}\n\ntemplate<typename MatrixType>\nvoid jacobisvd(const MatrixType& a = MatrixType(), bool pickrandom = true)\n{\n  MatrixType m = a;\n  if(pickrandom)\n  {\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename MatrixType::RealScalar RealScalar;\n    typedef typename MatrixType::Index Index;\n    Index diagSize = (std::min)(a.rows(), a.cols());\n    RealScalar s = std::numeric_limits<RealScalar>::max_exponent10/4;\n    s = internal::random<RealScalar>(1,s);\n    Matrix<RealScalar,Dynamic,1> d =  Matrix<RealScalar,Dynamic,1>::Random(diagSize);\n    for(Index k=0; k<diagSize; ++k)\n      d(k) = d(k)*std::pow(RealScalar(10),internal::random<RealScalar>(-s,s));\n    m = Matrix<Scalar,Dynamic,Dynamic>::Random(a.rows(),diagSize) * d.asDiagonal() * Matrix<Scalar,Dynamic,Dynamic>::Random(diagSize,a.cols());\n    // cancel some coeffs\n    Index n  = internal::random<Index>(0,m.size()-1);\n    for(Index i=0; i<n; ++i)\n      m(internal::random<Index>(0,m.rows()-1), internal::random<Index>(0,m.cols()-1)) = Scalar(0);\n  }\n\n  CALL_SUBTEST(( jacobisvd_test_all_computation_options<MatrixType, FullPivHouseholderQRPreconditioner>(m) ));\n  CALL_SUBTEST(( jacobisvd_test_all_computation_options<MatrixType, ColPivHouseholderQRPreconditioner>(m) ));\n  CALL_SUBTEST(( jacobisvd_test_all_computation_options<MatrixType, HouseholderQRPreconditioner>(m) ));\n  CALL_SUBTEST(( jacobisvd_test_all_computation_options<MatrixType, NoQRPreconditioner>(m) ));\n}\n\ntemplate<typename MatrixType> void jacobisvd_verify_assert(const MatrixType& m)\n{\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename MatrixType::Index Index;\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  enum {\n    RowsAtCompileTime = MatrixType::RowsAtCompileTime,\n    ColsAtCompileTime = MatrixType::ColsAtCompileTime\n  };\n\n  typedef Matrix<Scalar, RowsAtCompileTime, 1> RhsType;\n\n  RhsType rhs(rows);\n\n  JacobiSVD<MatrixType> svd;\n  VERIFY_RAISES_ASSERT(svd.matrixU())\n  VERIFY_RAISES_ASSERT(svd.singularValues())\n  VERIFY_RAISES_ASSERT(svd.matrixV())\n  VERIFY_RAISES_ASSERT(svd.solve(rhs))\n\n  MatrixType a = MatrixType::Zero(rows, cols);\n  a.setZero();\n  svd.compute(a, 0);\n  VERIFY_RAISES_ASSERT(svd.matrixU())\n  VERIFY_RAISES_ASSERT(svd.matrixV())\n  svd.singularValues();\n  VERIFY_RAISES_ASSERT(svd.solve(rhs))\n\n  if (ColsAtCompileTime == Dynamic)\n  {\n    svd.compute(a, ComputeThinU);\n    svd.matrixU();\n    VERIFY_RAISES_ASSERT(svd.matrixV())\n    VERIFY_RAISES_ASSERT(svd.solve(rhs))\n\n    svd.compute(a, ComputeThinV);\n    svd.matrixV();\n    VERIFY_RAISES_ASSERT(svd.matrixU())\n    VERIFY_RAISES_ASSERT(svd.solve(rhs))\n\n    JacobiSVD<MatrixType, FullPivHouseholderQRPreconditioner> svd_fullqr;\n    VERIFY_RAISES_ASSERT(svd_fullqr.compute(a, ComputeFullU|ComputeThinV))\n    VERIFY_RAISES_ASSERT(svd_fullqr.compute(a, ComputeThinU|ComputeThinV))\n    VERIFY_RAISES_ASSERT(svd_fullqr.compute(a, ComputeThinU|ComputeFullV))\n  }\n  else\n  {\n    VERIFY_RAISES_ASSERT(svd.compute(a, ComputeThinU))\n    VERIFY_RAISES_ASSERT(svd.compute(a, ComputeThinV))\n  }\n}\n\ntemplate<typename MatrixType>\nvoid jacobisvd_method()\n{\n  enum { Size = MatrixType::RowsAtCompileTime };\n  typedef typename MatrixType::RealScalar RealScalar;\n  typedef Matrix<RealScalar, Size, 1> RealVecType;\n  MatrixType m = MatrixType::Identity();\n  VERIFY_IS_APPROX(m.jacobiSvd().singularValues(), RealVecType::Ones());\n  VERIFY_RAISES_ASSERT(m.jacobiSvd().matrixU());\n  VERIFY_RAISES_ASSERT(m.jacobiSvd().matrixV());\n  VERIFY_IS_APPROX(m.jacobiSvd(ComputeFullU|ComputeFullV).solve(m), m);\n}\n\n// work around stupid msvc error when constructing at compile time an expression that involves\n// a division by zero, even if the numeric type has floating point\ntemplate<typename Scalar>\nEIGEN_DONT_INLINE Scalar zero() { return Scalar(0); }\n\n// workaround aggressive optimization in ICC\ntemplate<typename T> EIGEN_DONT_INLINE  T sub(T a, T b) { return a - b; }\n\ntemplate<typename MatrixType>\nvoid jacobisvd_inf_nan()\n{\n  // all this function does is verify we don't iterate infinitely on nan/inf values\n\n  JacobiSVD<MatrixType> svd;\n  typedef typename MatrixType::Scalar Scalar;\n  Scalar some_inf = Scalar(1) / zero<Scalar>();\n  VERIFY(sub(some_inf, some_inf) != sub(some_inf, some_inf));\n  svd.compute(MatrixType::Constant(10,10,some_inf), ComputeFullU | ComputeFullV);\n\n  Scalar nan = std::numeric_limits<Scalar>::quiet_NaN();\n  VERIFY(nan != nan);\n  svd.compute(MatrixType::Constant(10,10,nan), ComputeFullU | ComputeFullV);\n\n  MatrixType m = MatrixType::Zero(10,10);\n  m(internal::random<int>(0,9), internal::random<int>(0,9)) = some_inf;\n  svd.compute(m, ComputeFullU | ComputeFullV);\n\n  m = MatrixType::Zero(10,10);\n  m(internal::random<int>(0,9), internal::random<int>(0,9)) = nan;\n  svd.compute(m, ComputeFullU | ComputeFullV);\n  \n  // regression test for bug 791\n  m.resize(3,3);\n  m << 0,    2*NumTraits<Scalar>::epsilon(),  0.5,\n       0,   -0.5,                             0,\n       nan,  0,                               0;\n  svd.compute(m, ComputeFullU | ComputeFullV);\n}\n\n// Regression test for bug 286: JacobiSVD loops indefinitely with some\n// matrices containing denormal numbers.\nvoid jacobisvd_bug286()\n{\n#if defined __INTEL_COMPILER\n// shut up warning #239: floating point underflow\n#pragma warning push\n#pragma warning disable 239\n#endif\n  Matrix2d M;\n  M << -7.90884e-313, -4.94e-324,\n                 0, 5.60844e-313;\n#if defined __INTEL_COMPILER\n#pragma warning pop\n#endif\n  JacobiSVD<Matrix2d> svd;\n  svd.compute(M); // just check we don't loop indefinitely\n}\n\nvoid jacobisvd_preallocate()\n{\n  Vector3f v(3.f, 2.f, 1.f);\n  MatrixXf m = v.asDiagonal();\n\n  internal::set_is_malloc_allowed(false);\n  VERIFY_RAISES_ASSERT(VectorXf tmp(10);)\n  JacobiSVD<MatrixXf> svd;\n  internal::set_is_malloc_allowed(true);\n  svd.compute(m);\n  VERIFY_IS_APPROX(svd.singularValues(), v);\n\n  JacobiSVD<MatrixXf> svd2(3,3);\n  internal::set_is_malloc_allowed(false);\n  svd2.compute(m);\n  internal::set_is_malloc_allowed(true);\n  VERIFY_IS_APPROX(svd2.singularValues(), v);\n  VERIFY_RAISES_ASSERT(svd2.matrixU());\n  VERIFY_RAISES_ASSERT(svd2.matrixV());\n  svd2.compute(m, ComputeFullU | ComputeFullV);\n  VERIFY_IS_APPROX(svd2.matrixU(), Matrix3f::Identity());\n  VERIFY_IS_APPROX(svd2.matrixV(), Matrix3f::Identity());\n  internal::set_is_malloc_allowed(false);\n  svd2.compute(m);\n  internal::set_is_malloc_allowed(true);\n\n  JacobiSVD<MatrixXf> svd3(3,3,ComputeFullU|ComputeFullV);\n  internal::set_is_malloc_allowed(false);\n  svd2.compute(m);\n  internal::set_is_malloc_allowed(true);\n  VERIFY_IS_APPROX(svd2.singularValues(), v);\n  VERIFY_IS_APPROX(svd2.matrixU(), Matrix3f::Identity());\n  VERIFY_IS_APPROX(svd2.matrixV(), Matrix3f::Identity());\n  internal::set_is_malloc_allowed(false);\n  svd2.compute(m, ComputeFullU|ComputeFullV);\n  internal::set_is_malloc_allowed(true);\n}\n\nvoid test_jacobisvd()\n{\n  CALL_SUBTEST_3(( jacobisvd_verify_assert(Matrix3f()) ));\n  CALL_SUBTEST_4(( jacobisvd_verify_assert(Matrix4d()) ));\n  CALL_SUBTEST_7(( jacobisvd_verify_assert(MatrixXf(10,12)) ));\n  CALL_SUBTEST_8(( jacobisvd_verify_assert(MatrixXcd(7,5)) ));\n\n  for(int i = 0; i < g_repeat; i++) {\n    Matrix2cd m;\n    m << 0, 1,\n         0, 1;\n    CALL_SUBTEST_1(( jacobisvd(m, false) ));\n    m << 1, 0,\n         1, 0;\n    CALL_SUBTEST_1(( jacobisvd(m, false) ));\n\n    Matrix2d n;\n    n << 0, 0,\n         0, 0;\n    CALL_SUBTEST_2(( jacobisvd(n, false) ));\n    n << 0, 0,\n         0, 1;\n    CALL_SUBTEST_2(( jacobisvd(n, false) ));\n    \n    CALL_SUBTEST_3(( jacobisvd<Matrix3f>() ));\n    CALL_SUBTEST_4(( jacobisvd<Matrix4d>() ));\n    CALL_SUBTEST_5(( jacobisvd<Matrix<float,3,5> >() ));\n    CALL_SUBTEST_6(( jacobisvd<Matrix<double,Dynamic,2> >(Matrix<double,Dynamic,2>(10,2)) ));\n\n    int r = internal::random<int>(1, 30),\n        c = internal::random<int>(1, 30);\n    \n    TEST_SET_BUT_UNUSED_VARIABLE(r)\n    TEST_SET_BUT_UNUSED_VARIABLE(c)\n    \n    CALL_SUBTEST_10(( jacobisvd<MatrixXd>(MatrixXd(r,c)) ));\n    CALL_SUBTEST_7(( jacobisvd<MatrixXf>(MatrixXf(r,c)) ));\n    CALL_SUBTEST_8(( jacobisvd<MatrixXcd>(MatrixXcd(r,c)) ));\n    (void) r;\n    (void) c;\n\n    // Test on inf/nan matrix\n    CALL_SUBTEST_7( jacobisvd_inf_nan<MatrixXf>() );\n    CALL_SUBTEST_10( jacobisvd_inf_nan<MatrixXd>() );\n  }\n\n  CALL_SUBTEST_7(( jacobisvd<MatrixXf>(MatrixXf(internal::random<int>(EIGEN_TEST_MAX_SIZE/4, EIGEN_TEST_MAX_SIZE/2), internal::random<int>(EIGEN_TEST_MAX_SIZE/4, EIGEN_TEST_MAX_SIZE/2))) ));\n  CALL_SUBTEST_8(( jacobisvd<MatrixXcd>(MatrixXcd(internal::random<int>(EIGEN_TEST_MAX_SIZE/4, EIGEN_TEST_MAX_SIZE/3), internal::random<int>(EIGEN_TEST_MAX_SIZE/4, EIGEN_TEST_MAX_SIZE/3))) ));\n\n  // test matrixbase method\n  CALL_SUBTEST_1(( jacobisvd_method<Matrix2cd>() ));\n  CALL_SUBTEST_3(( jacobisvd_method<Matrix3f>() ));\n\n  // Test problem size constructors\n  CALL_SUBTEST_7( JacobiSVD<MatrixXf>(10,10) );\n\n  // Check that preallocation avoids subsequent mallocs\n  CALL_SUBTEST_9( jacobisvd_preallocate() );\n\n  // Regression check for bug 286\n  CALL_SUBTEST_2( jacobisvd_bug286() );\n}\n"
  },
  {
    "path": "libs/eigen/test/linearstructure.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\ntemplate<typename MatrixType> void linearStructure(const MatrixType& m)\n{\n  using std::abs;\n  /* this test covers the following files:\n     CwiseUnaryOp.h, CwiseBinaryOp.h, SelfCwiseBinaryOp.h \n  */\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  // this test relies a lot on Random.h, and there's not much more that we can do\n  // to test it, hence I consider that we will have tested Random.h\n  MatrixType m1 = MatrixType::Random(rows, cols),\n             m2 = MatrixType::Random(rows, cols),\n             m3(rows, cols);\n\n  Scalar s1 = internal::random<Scalar>();\n  while (abs(s1)<1e-3) s1 = internal::random<Scalar>();\n\n  Index r = internal::random<Index>(0, rows-1),\n        c = internal::random<Index>(0, cols-1);\n\n  VERIFY_IS_APPROX(-(-m1),                  m1);\n  VERIFY_IS_APPROX(m1+m1,                   2*m1);\n  VERIFY_IS_APPROX(m1+m2-m1,                m2);\n  VERIFY_IS_APPROX(-m2+m1+m2,               m1);\n  VERIFY_IS_APPROX(m1*s1,                   s1*m1);\n  VERIFY_IS_APPROX((m1+m2)*s1,              s1*m1+s1*m2);\n  VERIFY_IS_APPROX((-m1+m2)*s1,             -s1*m1+s1*m2);\n  m3 = m2; m3 += m1;\n  VERIFY_IS_APPROX(m3,                      m1+m2);\n  m3 = m2; m3 -= m1;\n  VERIFY_IS_APPROX(m3,                      m2-m1);\n  m3 = m2; m3 *= s1;\n  VERIFY_IS_APPROX(m3,                      s1*m2);\n  if(!NumTraits<Scalar>::IsInteger)\n  {\n    m3 = m2; m3 /= s1;\n    VERIFY_IS_APPROX(m3,                    m2/s1);\n  }\n\n  // again, test operator() to check const-qualification\n  VERIFY_IS_APPROX((-m1)(r,c), -(m1(r,c)));\n  VERIFY_IS_APPROX((m1-m2)(r,c), (m1(r,c))-(m2(r,c)));\n  VERIFY_IS_APPROX((m1+m2)(r,c), (m1(r,c))+(m2(r,c)));\n  VERIFY_IS_APPROX((s1*m1)(r,c), s1*(m1(r,c)));\n  VERIFY_IS_APPROX((m1*s1)(r,c), (m1(r,c))*s1);\n  if(!NumTraits<Scalar>::IsInteger)\n    VERIFY_IS_APPROX((m1/s1)(r,c), (m1(r,c))/s1);\n\n  // use .block to disable vectorization and compare to the vectorized version\n  VERIFY_IS_APPROX(m1+m1.block(0,0,rows,cols), m1+m1);\n  VERIFY_IS_APPROX(m1.cwiseProduct(m1.block(0,0,rows,cols)), m1.cwiseProduct(m1));\n  VERIFY_IS_APPROX(m1 - m1.block(0,0,rows,cols), m1 - m1);\n  VERIFY_IS_APPROX(m1.block(0,0,rows,cols) * s1, m1 * s1);\n}\n\nvoid test_linearstructure()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( linearStructure(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( linearStructure(Matrix2f()) );\n    CALL_SUBTEST_3( linearStructure(Vector3d()) );\n    CALL_SUBTEST_4( linearStructure(Matrix4d()) );\n    CALL_SUBTEST_5( linearStructure(MatrixXcf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE/2), internal::random<int>(1,EIGEN_TEST_MAX_SIZE/2))) );\n    CALL_SUBTEST_6( linearStructure(MatrixXf (internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n    CALL_SUBTEST_7( linearStructure(MatrixXi (internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n    CALL_SUBTEST_8( linearStructure(MatrixXcd(internal::random<int>(1,EIGEN_TEST_MAX_SIZE/2), internal::random<int>(1,EIGEN_TEST_MAX_SIZE/2))) );\n    CALL_SUBTEST_9( linearStructure(ArrayXXf (internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/lu.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <Eigen/LU>\nusing namespace std;\n\ntemplate<typename MatrixType> void lu_non_invertible()\n{\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::RealScalar RealScalar;\n  /* this test covers the following files:\n     LU.h\n  */\n  Index rows, cols, cols2;\n  if(MatrixType::RowsAtCompileTime==Dynamic)\n  {\n    rows = internal::random<Index>(2,EIGEN_TEST_MAX_SIZE);\n  }\n  else\n  {\n    rows = MatrixType::RowsAtCompileTime;\n  }\n  if(MatrixType::ColsAtCompileTime==Dynamic)\n  {\n    cols = internal::random<Index>(2,EIGEN_TEST_MAX_SIZE);\n    cols2 = internal::random<int>(2,EIGEN_TEST_MAX_SIZE);\n  }\n  else\n  {\n    cols2 = cols = MatrixType::ColsAtCompileTime;\n  }\n\n  enum {\n    RowsAtCompileTime = MatrixType::RowsAtCompileTime,\n    ColsAtCompileTime = MatrixType::ColsAtCompileTime\n  };\n  typedef typename internal::kernel_retval_base<FullPivLU<MatrixType> >::ReturnType KernelMatrixType;\n  typedef typename internal::image_retval_base<FullPivLU<MatrixType> >::ReturnType ImageMatrixType;\n  typedef Matrix<typename MatrixType::Scalar, ColsAtCompileTime, ColsAtCompileTime>\n          CMatrixType;\n  typedef Matrix<typename MatrixType::Scalar, RowsAtCompileTime, RowsAtCompileTime>\n          RMatrixType;\n\n  Index rank = internal::random<Index>(1, (std::min)(rows, cols)-1);\n\n  // The image of the zero matrix should consist of a single (zero) column vector\n  VERIFY((MatrixType::Zero(rows,cols).fullPivLu().image(MatrixType::Zero(rows,cols)).cols() == 1));\n\n  MatrixType m1(rows, cols), m3(rows, cols2);\n  CMatrixType m2(cols, cols2);\n  createRandomPIMatrixOfRank(rank, rows, cols, m1);\n\n  FullPivLU<MatrixType> lu;\n\n  // The special value 0.01 below works well in tests. Keep in mind that we're only computing the rank\n  // of singular values are either 0 or 1.\n  // So it's not clear at all that the epsilon should play any role there.\n  lu.setThreshold(RealScalar(0.01));\n  lu.compute(m1);\n\n  MatrixType u(rows,cols);\n  u = lu.matrixLU().template triangularView<Upper>();\n  RMatrixType l = RMatrixType::Identity(rows,rows);\n  l.block(0,0,rows,(std::min)(rows,cols)).template triangularView<StrictlyLower>()\n    = lu.matrixLU().block(0,0,rows,(std::min)(rows,cols));\n\n  VERIFY_IS_APPROX(lu.permutationP() * m1 * lu.permutationQ(), l*u);\n\n  KernelMatrixType m1kernel = lu.kernel();\n  ImageMatrixType m1image = lu.image(m1);\n\n  VERIFY_IS_APPROX(m1, lu.reconstructedMatrix());\n  VERIFY(rank == lu.rank());\n  VERIFY(cols - lu.rank() == lu.dimensionOfKernel());\n  VERIFY(!lu.isInjective());\n  VERIFY(!lu.isInvertible());\n  VERIFY(!lu.isSurjective());\n  VERIFY((m1 * m1kernel).isMuchSmallerThan(m1));\n  VERIFY(m1image.fullPivLu().rank() == rank);\n  VERIFY_IS_APPROX(m1 * m1.adjoint() * m1image, m1image);\n\n  m2 = CMatrixType::Random(cols,cols2);\n  m3 = m1*m2;\n  m2 = CMatrixType::Random(cols,cols2);\n  // test that the code, which does resize(), may be applied to an xpr\n  m2.block(0,0,m2.rows(),m2.cols()) = lu.solve(m3);\n  VERIFY_IS_APPROX(m3, m1*m2);\n}\n\ntemplate<typename MatrixType> void lu_invertible()\n{\n  /* this test covers the following files:\n     LU.h\n  */\n  typedef typename NumTraits<typename MatrixType::Scalar>::Real RealScalar;\n  DenseIndex size = MatrixType::RowsAtCompileTime;\n  if( size==Dynamic)\n    size = internal::random<DenseIndex>(1,EIGEN_TEST_MAX_SIZE);\n\n  MatrixType m1(size, size), m2(size, size), m3(size, size);\n  FullPivLU<MatrixType> lu;\n  lu.setThreshold(RealScalar(0.01));\n  do {\n    m1 = MatrixType::Random(size,size);\n    lu.compute(m1);\n  } while(!lu.isInvertible());\n\n  VERIFY_IS_APPROX(m1, lu.reconstructedMatrix());\n  VERIFY(0 == lu.dimensionOfKernel());\n  VERIFY(lu.kernel().cols() == 1); // the kernel() should consist of a single (zero) column vector\n  VERIFY(size == lu.rank());\n  VERIFY(lu.isInjective());\n  VERIFY(lu.isSurjective());\n  VERIFY(lu.isInvertible());\n  VERIFY(lu.image(m1).fullPivLu().isInvertible());\n  m3 = MatrixType::Random(size,size);\n  m2 = lu.solve(m3);\n  VERIFY_IS_APPROX(m3, m1*m2);\n  VERIFY_IS_APPROX(m2, lu.inverse()*m3);\n\n  // Regression test for Bug 302\n  MatrixType m4 = MatrixType::Random(size,size);\n  VERIFY_IS_APPROX(lu.solve(m3*m4), lu.solve(m3)*m4);\n}\n\ntemplate<typename MatrixType> void lu_partial_piv()\n{\n  /* this test covers the following files:\n     PartialPivLU.h\n  */\n  typedef typename MatrixType::Index Index;\n  Index rows = internal::random<Index>(1,4);\n  Index cols = rows;\n\n  MatrixType m1(cols, rows);\n  m1.setRandom();\n  PartialPivLU<MatrixType> plu(m1);\n\n  VERIFY_IS_APPROX(m1, plu.reconstructedMatrix());\n}\n\ntemplate<typename MatrixType> void lu_verify_assert()\n{\n  MatrixType tmp;\n\n  FullPivLU<MatrixType> lu;\n  VERIFY_RAISES_ASSERT(lu.matrixLU())\n  VERIFY_RAISES_ASSERT(lu.permutationP())\n  VERIFY_RAISES_ASSERT(lu.permutationQ())\n  VERIFY_RAISES_ASSERT(lu.kernel())\n  VERIFY_RAISES_ASSERT(lu.image(tmp))\n  VERIFY_RAISES_ASSERT(lu.solve(tmp))\n  VERIFY_RAISES_ASSERT(lu.determinant())\n  VERIFY_RAISES_ASSERT(lu.rank())\n  VERIFY_RAISES_ASSERT(lu.dimensionOfKernel())\n  VERIFY_RAISES_ASSERT(lu.isInjective())\n  VERIFY_RAISES_ASSERT(lu.isSurjective())\n  VERIFY_RAISES_ASSERT(lu.isInvertible())\n  VERIFY_RAISES_ASSERT(lu.inverse())\n\n  PartialPivLU<MatrixType> plu;\n  VERIFY_RAISES_ASSERT(plu.matrixLU())\n  VERIFY_RAISES_ASSERT(plu.permutationP())\n  VERIFY_RAISES_ASSERT(plu.solve(tmp))\n  VERIFY_RAISES_ASSERT(plu.determinant())\n  VERIFY_RAISES_ASSERT(plu.inverse())\n}\n\nvoid test_lu()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( lu_non_invertible<Matrix3f>() );\n    CALL_SUBTEST_1( lu_invertible<Matrix3f>() );\n    CALL_SUBTEST_1( lu_verify_assert<Matrix3f>() );\n\n    CALL_SUBTEST_2( (lu_non_invertible<Matrix<double, 4, 6> >()) );\n    CALL_SUBTEST_2( (lu_verify_assert<Matrix<double, 4, 6> >()) );\n\n    CALL_SUBTEST_3( lu_non_invertible<MatrixXf>() );\n    CALL_SUBTEST_3( lu_invertible<MatrixXf>() );\n    CALL_SUBTEST_3( lu_verify_assert<MatrixXf>() );\n\n    CALL_SUBTEST_4( lu_non_invertible<MatrixXd>() );\n    CALL_SUBTEST_4( lu_invertible<MatrixXd>() );\n    CALL_SUBTEST_4( lu_partial_piv<MatrixXd>() );\n    CALL_SUBTEST_4( lu_verify_assert<MatrixXd>() );\n\n    CALL_SUBTEST_5( lu_non_invertible<MatrixXcf>() );\n    CALL_SUBTEST_5( lu_invertible<MatrixXcf>() );\n    CALL_SUBTEST_5( lu_verify_assert<MatrixXcf>() );\n\n    CALL_SUBTEST_6( lu_non_invertible<MatrixXcd>() );\n    CALL_SUBTEST_6( lu_invertible<MatrixXcd>() );\n    CALL_SUBTEST_6( lu_partial_piv<MatrixXcd>() );\n    CALL_SUBTEST_6( lu_verify_assert<MatrixXcd>() );\n\n    CALL_SUBTEST_7(( lu_non_invertible<Matrix<float,Dynamic,16> >() ));\n\n    // Test problem size constructors\n    CALL_SUBTEST_9( PartialPivLU<MatrixXf>(10) );\n    CALL_SUBTEST_9( FullPivLU<MatrixXf>(10, 20); );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/main.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include <cstdlib>\n#include <cerrno>\n#include <ctime>\n#include <iostream>\n#include <fstream>\n#include <string>\n#include <sstream>\n#include <vector>\n#include <typeinfo>\n\n// The following includes of STL headers have to be done _before_ the\n// definition of macros min() and max().  The reason is that many STL\n// implementations will not work properly as the min and max symbols collide\n// with the STL functions std:min() and std::max().  The STL headers may check\n// for the macro definition of min/max and issue a warning or undefine the\n// macros.\n//\n// Still, Windows defines min() and max() in windef.h as part of the regular\n// Windows system interfaces and many other Windows APIs depend on these\n// macros being available.  To prevent the macro expansion of min/max and to\n// make Eigen compatible with the Windows environment all function calls of\n// std::min() and std::max() have to be written with parenthesis around the\n// function name.\n//\n// All STL headers used by Eigen should be included here.  Because main.h is\n// included before any Eigen header and because the STL headers are guarded\n// against multiple inclusions, no STL header will see our own min/max macro\n// definitions.\n#include <limits>\n#include <algorithm>\n#include <complex>\n#include <deque>\n#include <queue>\n#include <list>\n\n// To test that all calls from Eigen code to std::min() and std::max() are\n// protected by parenthesis against macro expansion, the min()/max() macros\n// are defined here and any not-parenthesized min/max call will cause a\n// compiler error.\n#define min(A,B) please_protect_your_min_with_parentheses\n#define max(A,B) please_protect_your_max_with_parentheses\n\n#define FORBIDDEN_IDENTIFIER (this_identifier_is_forbidden_to_avoid_clashes) this_identifier_is_forbidden_to_avoid_clashes\n// B0 is defined in POSIX header termios.h\n#define B0 FORBIDDEN_IDENTIFIER\n\n\n// shuts down ICC's remark #593: variable \"XXX\" was set but never used\n#define TEST_SET_BUT_UNUSED_VARIABLE(X) X = X + 0;\n\n// the following file is automatically generated by cmake\n#include \"split_test_helper.h\"\n\n#ifdef NDEBUG\n#undef NDEBUG\n#endif\n\n// On windows CE, NDEBUG is automatically defined <assert.h> if NDEBUG is not defined.\n#ifndef DEBUG\n#define DEBUG\n#endif\n\n// bounds integer values for AltiVec\n#ifdef __ALTIVEC__\n#define EIGEN_MAKING_DOCS\n#endif\n\n#ifndef EIGEN_TEST_FUNC\n#error EIGEN_TEST_FUNC must be defined\n#endif\n\n#define DEFAULT_REPEAT 10\n\nnamespace Eigen\n{\n  static std::vector<std::string> g_test_stack;\n  static int g_repeat;\n  static unsigned int g_seed;\n  static bool g_has_set_repeat, g_has_set_seed;\n}\n\n#define EI_PP_MAKE_STRING2(S) #S\n#define EI_PP_MAKE_STRING(S) EI_PP_MAKE_STRING2(S)\n\n#define EIGEN_DEFAULT_IO_FORMAT IOFormat(4, 0, \"  \", \"\\n\", \"\", \"\", \"\", \"\")\n\n#ifndef EIGEN_NO_ASSERTION_CHECKING\n\n  namespace Eigen\n  {\n    static const bool should_raise_an_assert = false;\n\n    // Used to avoid to raise two exceptions at a time in which\n    // case the exception is not properly caught.\n    // This may happen when a second exceptions is triggered in a destructor.\n    static bool no_more_assert = false;\n    static bool report_on_cerr_on_assert_failure = true;\n\n    struct eigen_assert_exception\n    {\n      eigen_assert_exception(void) {}\n      ~eigen_assert_exception() { Eigen::no_more_assert = false; }\n    };\n  }\n  // If EIGEN_DEBUG_ASSERTS is defined and if no assertion is triggered while\n  // one should have been, then the list of excecuted assertions is printed out.\n  //\n  // EIGEN_DEBUG_ASSERTS is not enabled by default as it\n  // significantly increases the compilation time\n  // and might even introduce side effects that would hide\n  // some memory errors.\n  #ifdef EIGEN_DEBUG_ASSERTS\n\n    namespace Eigen\n    {\n      namespace internal\n      {\n        static bool push_assert = false;\n      }\n      static std::vector<std::string> eigen_assert_list;\n    }\n    #define eigen_assert(a)                       \\\n      if( (!(a)) && (!no_more_assert) )     \\\n      { \\\n        if(report_on_cerr_on_assert_failure) \\\n          std::cerr <<  #a << \" \" __FILE__ << \"(\" << __LINE__ << \")\\n\"; \\\n        Eigen::no_more_assert = true;       \\\n        throw Eigen::eigen_assert_exception(); \\\n      }                                     \\\n      else if (Eigen::internal::push_assert)       \\\n      {                                     \\\n        eigen_assert_list.push_back(std::string(EI_PP_MAKE_STRING(__FILE__) \" (\" EI_PP_MAKE_STRING(__LINE__) \") : \" #a) ); \\\n      }\n\n    #define VERIFY_RAISES_ASSERT(a)                                                   \\\n      {                                                                               \\\n        Eigen::no_more_assert = false;                                                \\\n        Eigen::eigen_assert_list.clear();                                                \\\n        Eigen::internal::push_assert = true;                                                 \\\n        Eigen::report_on_cerr_on_assert_failure = false;                              \\\n        try {                                                                         \\\n          a;                                                                          \\\n          std::cerr << \"One of the following asserts should have been triggered:\\n\";  \\\n          for (uint ai=0 ; ai<eigen_assert_list.size() ; ++ai)                           \\\n            std::cerr << \"  \" << eigen_assert_list[ai] << \"\\n\";                          \\\n          VERIFY(Eigen::should_raise_an_assert && # a);                               \\\n        } catch (Eigen::eigen_assert_exception) {                                        \\\n          Eigen::internal::push_assert = false; VERIFY(true);                                \\\n        }                                                                             \\\n        Eigen::report_on_cerr_on_assert_failure = true;                               \\\n        Eigen::internal::push_assert = false;                                                \\\n      }\n\n  #else // EIGEN_DEBUG_ASSERTS\n    // see bug 89. The copy_bool here is working around a bug in gcc <= 4.3\n    #define eigen_assert(a) \\\n      if( (!Eigen::internal::copy_bool(a)) && (!no_more_assert) )\\\n      {                                       \\\n        Eigen::no_more_assert = true;         \\\n        if(report_on_cerr_on_assert_failure)  \\\n          eigen_plain_assert(a);              \\\n        else                                  \\\n          throw Eigen::eigen_assert_exception(); \\\n      }\n    #define VERIFY_RAISES_ASSERT(a) {                             \\\n        Eigen::no_more_assert = false;                            \\\n        Eigen::report_on_cerr_on_assert_failure = false;          \\\n        try {                                                     \\\n          a;                                                      \\\n          VERIFY(Eigen::should_raise_an_assert && # a);           \\\n        }                                                         \\\n        catch (Eigen::eigen_assert_exception&) { VERIFY(true); }     \\\n        Eigen::report_on_cerr_on_assert_failure = true;           \\\n      }\n\n  #endif // EIGEN_DEBUG_ASSERTS\n\n  #define EIGEN_USE_CUSTOM_ASSERT\n\n#else // EIGEN_NO_ASSERTION_CHECKING\n\n  #define VERIFY_RAISES_ASSERT(a) {}\n\n#endif // EIGEN_NO_ASSERTION_CHECKING\n\n\n#define EIGEN_INTERNAL_DEBUGGING\n#include <Eigen/QR> // required for createRandomPIMatrixOfRank\n\ninline void verify_impl(bool condition, const char *testname, const char *file, int line, const char *condition_as_string)\n{\n  if (!condition)\n  {\n    std::cerr << \"Test \" << testname << \" failed in \" << file << \" (\" << line << \")\"\n      << std::endl << \"    \" << condition_as_string << std::endl;\n    std::cerr << \"Stack:\\n\";\n    const int test_stack_size = static_cast<int>(Eigen::g_test_stack.size());\n    for(int i=test_stack_size-1; i>=0; --i)\n      std::cerr << \"  - \" << Eigen::g_test_stack[i] << \"\\n\";\n    std::cerr << \"\\n\";\n    abort();\n  }\n}\n\n#define VERIFY(a) ::verify_impl(a, g_test_stack.back().c_str(), __FILE__, __LINE__, EI_PP_MAKE_STRING(a))\n\n#define VERIFY_IS_EQUAL(a, b) VERIFY(test_is_equal(a, b))\n#define VERIFY_IS_APPROX(a, b) VERIFY(test_isApprox(a, b))\n#define VERIFY_IS_NOT_APPROX(a, b) VERIFY(!test_isApprox(a, b))\n#define VERIFY_IS_MUCH_SMALLER_THAN(a, b) VERIFY(test_isMuchSmallerThan(a, b))\n#define VERIFY_IS_NOT_MUCH_SMALLER_THAN(a, b) VERIFY(!test_isMuchSmallerThan(a, b))\n#define VERIFY_IS_APPROX_OR_LESS_THAN(a, b) VERIFY(test_isApproxOrLessThan(a, b))\n#define VERIFY_IS_NOT_APPROX_OR_LESS_THAN(a, b) VERIFY(!test_isApproxOrLessThan(a, b))\n\n#define VERIFY_IS_UNITARY(a) VERIFY(test_isUnitary(a))\n\n#define CALL_SUBTEST(FUNC) do { \\\n    g_test_stack.push_back(EI_PP_MAKE_STRING(FUNC)); \\\n    FUNC; \\\n    g_test_stack.pop_back(); \\\n  } while (0)\n\n\nnamespace Eigen {\n\ntemplate<typename T> inline typename NumTraits<T>::Real test_precision() { return NumTraits<T>::dummy_precision(); }\ntemplate<> inline float test_precision<float>() { return 1e-3f; }\ntemplate<> inline double test_precision<double>() { return 1e-6; }\ntemplate<> inline float test_precision<std::complex<float> >() { return test_precision<float>(); }\ntemplate<> inline double test_precision<std::complex<double> >() { return test_precision<double>(); }\ntemplate<> inline long double test_precision<long double>() { return 1e-6; }\n\ninline bool test_isApprox(const int& a, const int& b)\n{ return internal::isApprox(a, b, test_precision<int>()); }\ninline bool test_isMuchSmallerThan(const int& a, const int& b)\n{ return internal::isMuchSmallerThan(a, b, test_precision<int>()); }\ninline bool test_isApproxOrLessThan(const int& a, const int& b)\n{ return internal::isApproxOrLessThan(a, b, test_precision<int>()); }\n\ninline bool test_isApprox(const float& a, const float& b)\n{ return internal::isApprox(a, b, test_precision<float>()); }\ninline bool test_isMuchSmallerThan(const float& a, const float& b)\n{ return internal::isMuchSmallerThan(a, b, test_precision<float>()); }\ninline bool test_isApproxOrLessThan(const float& a, const float& b)\n{ return internal::isApproxOrLessThan(a, b, test_precision<float>()); }\ninline bool test_isApprox(const double& a, const double& b)\n{ return internal::isApprox(a, b, test_precision<double>()); }\n\ninline bool test_isMuchSmallerThan(const double& a, const double& b)\n{ return internal::isMuchSmallerThan(a, b, test_precision<double>()); }\ninline bool test_isApproxOrLessThan(const double& a, const double& b)\n{ return internal::isApproxOrLessThan(a, b, test_precision<double>()); }\n\ninline bool test_isApprox(const std::complex<float>& a, const std::complex<float>& b)\n{ return internal::isApprox(a, b, test_precision<std::complex<float> >()); }\ninline bool test_isMuchSmallerThan(const std::complex<float>& a, const std::complex<float>& b)\n{ return internal::isMuchSmallerThan(a, b, test_precision<std::complex<float> >()); }\n\ninline bool test_isApprox(const std::complex<double>& a, const std::complex<double>& b)\n{ return internal::isApprox(a, b, test_precision<std::complex<double> >()); }\ninline bool test_isMuchSmallerThan(const std::complex<double>& a, const std::complex<double>& b)\n{ return internal::isMuchSmallerThan(a, b, test_precision<std::complex<double> >()); }\n\ninline bool test_isApprox(const long double& a, const long double& b)\n{\n    bool ret = internal::isApprox(a, b, test_precision<long double>());\n    if (!ret) std::cerr\n        << std::endl << \"    actual   = \" << a\n        << std::endl << \"    expected = \" << b << std::endl << std::endl;\n    return ret;\n}\n\ninline bool test_isMuchSmallerThan(const long double& a, const long double& b)\n{ return internal::isMuchSmallerThan(a, b, test_precision<long double>()); }\ninline bool test_isApproxOrLessThan(const long double& a, const long double& b)\n{ return internal::isApproxOrLessThan(a, b, test_precision<long double>()); }\n\ntemplate<typename Type1, typename Type2>\ninline bool test_isApprox(const Type1& a, const Type2& b)\n{\n  return a.isApprox(b, test_precision<typename Type1::Scalar>());\n}\n\n// The idea behind this function is to compare the two scalars a and b where\n// the scalar ref is a hint about the expected order of magnitude of a and b.\n// WARNING: the scalar a and b must be positive\n// Therefore, if for some reason a and b are very small compared to ref,\n// we won't issue a false negative.\n// This test could be: abs(a-b) <= eps * ref\n// However, it seems that simply comparing a+ref and b+ref is more sensitive to true error.\ntemplate<typename Scalar,typename ScalarRef>\ninline bool test_isApproxWithRef(const Scalar& a, const Scalar& b, const ScalarRef& ref)\n{\n  return test_isApprox(a+ref, b+ref);\n}\n\ntemplate<typename Derived1, typename Derived2>\ninline bool test_isMuchSmallerThan(const MatrixBase<Derived1>& m1,\n                                   const MatrixBase<Derived2>& m2)\n{\n  return m1.isMuchSmallerThan(m2, test_precision<typename internal::traits<Derived1>::Scalar>());\n}\n\ntemplate<typename Derived>\ninline bool test_isMuchSmallerThan(const MatrixBase<Derived>& m,\n                                   const typename NumTraits<typename internal::traits<Derived>::Scalar>::Real& s)\n{\n  return m.isMuchSmallerThan(s, test_precision<typename internal::traits<Derived>::Scalar>());\n}\n\ntemplate<typename Derived>\ninline bool test_isUnitary(const MatrixBase<Derived>& m)\n{\n  return m.isUnitary(test_precision<typename internal::traits<Derived>::Scalar>());\n}\n\n// Forward declaration to avoid ICC warning\ntemplate<typename T, typename U>\nbool test_is_equal(const T& actual, const U& expected);\n\ntemplate<typename T, typename U>\nbool test_is_equal(const T& actual, const U& expected)\n{\n    if (actual==expected)\n        return true;\n    // false:\n    std::cerr\n        << std::endl << \"    actual   = \" << actual\n        << std::endl << \"    expected = \" << expected << std::endl << std::endl;\n    return false;\n}\n\n/** Creates a random Partial Isometry matrix of given rank.\n  *\n  * A partial isometry is a matrix all of whose singular values are either 0 or 1.\n  * This is very useful to test rank-revealing algorithms.\n  */\n// Forward declaration to avoid ICC warning\ntemplate<typename MatrixType>\nvoid createRandomPIMatrixOfRank(typename MatrixType::Index desired_rank, typename MatrixType::Index rows, typename MatrixType::Index cols, MatrixType& m);\ntemplate<typename MatrixType>\nvoid createRandomPIMatrixOfRank(typename MatrixType::Index desired_rank, typename MatrixType::Index rows, typename MatrixType::Index cols, MatrixType& m)\n{\n  typedef typename internal::traits<MatrixType>::Index Index;\n  typedef typename internal::traits<MatrixType>::Scalar Scalar;\n  enum { Rows = MatrixType::RowsAtCompileTime, Cols = MatrixType::ColsAtCompileTime };\n\n  typedef Matrix<Scalar, Dynamic, 1> VectorType;\n  typedef Matrix<Scalar, Rows, Rows> MatrixAType;\n  typedef Matrix<Scalar, Cols, Cols> MatrixBType;\n\n  if(desired_rank == 0)\n  {\n    m.setZero(rows,cols);\n    return;\n  }\n\n  if(desired_rank == 1)\n  {\n    // here we normalize the vectors to get a partial isometry\n    m = VectorType::Random(rows).normalized() * VectorType::Random(cols).normalized().transpose();\n    return;\n  }\n\n  MatrixAType a = MatrixAType::Random(rows,rows);\n  MatrixType d = MatrixType::Identity(rows,cols);\n  MatrixBType  b = MatrixBType::Random(cols,cols);\n\n  // set the diagonal such that only desired_rank non-zero entries reamain\n  const Index diag_size = (std::min)(d.rows(),d.cols());\n  if(diag_size != desired_rank)\n    d.diagonal().segment(desired_rank, diag_size-desired_rank) = VectorType::Zero(diag_size-desired_rank);\n\n  HouseholderQR<MatrixAType> qra(a);\n  HouseholderQR<MatrixBType> qrb(b);\n  m = qra.householderQ() * d * qrb.householderQ();\n}\n\n// Forward declaration to avoid ICC warning\ntemplate<typename PermutationVectorType>\nvoid randomPermutationVector(PermutationVectorType& v, typename PermutationVectorType::Index size);\ntemplate<typename PermutationVectorType>\nvoid randomPermutationVector(PermutationVectorType& v, typename PermutationVectorType::Index size)\n{\n  typedef typename PermutationVectorType::Index Index;\n  typedef typename PermutationVectorType::Scalar Scalar;\n  v.resize(size);\n  for(Index i = 0; i < size; ++i) v(i) = Scalar(i);\n  if(size == 1) return;\n  for(Index n = 0; n < 3 * size; ++n)\n  {\n    Index i = internal::random<Index>(0, size-1);\n    Index j;\n    do j = internal::random<Index>(0, size-1); while(j==i);\n    std::swap(v(i), v(j));\n  }\n}\n\ntemplate<typename T> bool isNotNaN(const T& x)\n{\n  return x==x;\n}\n\ntemplate<typename T> bool isNaN(const T& x)\n{\n  return x!=x;\n}\n\ntemplate<typename T> bool isInf(const T& x)\n{\n  return x > NumTraits<T>::highest();\n}\n\ntemplate<typename T> bool isMinusInf(const T& x)\n{\n  return x < NumTraits<T>::lowest();\n}\n\n} // end namespace Eigen\n\ntemplate<typename T> struct GetDifferentType;\n\ntemplate<> struct GetDifferentType<float> { typedef double type; };\ntemplate<> struct GetDifferentType<double> { typedef float type; };\ntemplate<typename T> struct GetDifferentType<std::complex<T> >\n{ typedef std::complex<typename GetDifferentType<T>::type> type; };\n\n// Forward declaration to avoid ICC warning\ntemplate<typename T> std::string type_name();\ntemplate<typename T> std::string type_name()              { return \"other\"; }\ntemplate<> std::string type_name<float>()                 { return \"float\"; }\ntemplate<> std::string type_name<double>()                { return \"double\"; }\ntemplate<> std::string type_name<int>()                   { return \"int\"; }\ntemplate<> std::string type_name<std::complex<float> >()  { return \"complex<float>\"; }\ntemplate<> std::string type_name<std::complex<double> >() { return \"complex<double>\"; }\ntemplate<> std::string type_name<std::complex<int> >()    { return \"complex<int>\"; }\n\n// forward declaration of the main test function\nvoid EIGEN_CAT(test_,EIGEN_TEST_FUNC)();\n\nusing namespace Eigen;\n\ninline void set_repeat_from_string(const char *str)\n{\n  errno = 0;\n  g_repeat = int(strtoul(str, 0, 10));\n  if(errno || g_repeat <= 0)\n  {\n    std::cout << \"Invalid repeat value \" << str << std::endl;\n    exit(EXIT_FAILURE);\n  }\n  g_has_set_repeat = true;\n}\n\ninline void set_seed_from_string(const char *str)\n{\n  errno = 0;\n  g_seed = int(strtoul(str, 0, 10));\n  if(errno || g_seed == 0)\n  {\n    std::cout << \"Invalid seed value \" << str << std::endl;\n    exit(EXIT_FAILURE);\n  }\n  g_has_set_seed = true;\n}\n\nint main(int argc, char *argv[])\n{\n    g_has_set_repeat = false;\n    g_has_set_seed = false;\n    bool need_help = false;\n\n    for(int i = 1; i < argc; i++)\n    {\n      if(argv[i][0] == 'r')\n      {\n        if(g_has_set_repeat)\n        {\n          std::cout << \"Argument \" << argv[i] << \" conflicting with a former argument\" << std::endl;\n          return 1;\n        }\n        set_repeat_from_string(argv[i]+1);\n      }\n      else if(argv[i][0] == 's')\n      {\n        if(g_has_set_seed)\n        {\n          std::cout << \"Argument \" << argv[i] << \" conflicting with a former argument\" << std::endl;\n          return 1;\n        }\n         set_seed_from_string(argv[i]+1);\n      }\n      else\n      {\n        need_help = true;\n      }\n    }\n\n    if(need_help)\n    {\n      std::cout << \"This test application takes the following optional arguments:\" << std::endl;\n      std::cout << \"  rN     Repeat each test N times (default: \" << DEFAULT_REPEAT << \")\" << std::endl;\n      std::cout << \"  sN     Use N as seed for random numbers (default: based on current time)\" << std::endl;\n      std::cout << std::endl;\n      std::cout << \"If defined, the environment variables EIGEN_REPEAT and EIGEN_SEED\" << std::endl;\n      std::cout << \"will be used as default values for these parameters.\" << std::endl;\n      return 1;\n    }\n\n    char *env_EIGEN_REPEAT = getenv(\"EIGEN_REPEAT\");\n    if(!g_has_set_repeat && env_EIGEN_REPEAT)\n      set_repeat_from_string(env_EIGEN_REPEAT);\n    char *env_EIGEN_SEED = getenv(\"EIGEN_SEED\");\n    if(!g_has_set_seed && env_EIGEN_SEED)\n      set_seed_from_string(env_EIGEN_SEED);\n\n    if(!g_has_set_seed) g_seed = (unsigned int) time(NULL);\n    if(!g_has_set_repeat) g_repeat = DEFAULT_REPEAT;\n\n    std::cout << \"Initializing random number generator with seed \" << g_seed << std::endl;\n    std::stringstream ss;\n    ss << \"Seed: \" << g_seed;\n    g_test_stack.push_back(ss.str());\n    srand(g_seed);\n    std::cout << \"Repeating each test \" << g_repeat << \" times\" << std::endl;\n\n    Eigen::g_test_stack.push_back(std::string(EI_PP_MAKE_STRING(EIGEN_TEST_FUNC)));\n\n    EIGEN_CAT(test_,EIGEN_TEST_FUNC)();\n    return 0;\n}\n\n// These warning are disabled here such that they are still ON when parsing Eigen's header files.\n#if defined __INTEL_COMPILER\n  // remark #383: value copied to temporary, reference to temporary used\n  //  -> this warning is raised even for legal usage as: g_test_stack.push_back(\"foo\"); where g_test_stack is a std::vector<std::string>\n  // remark #1418: external function definition with no prior declaration\n  //  -> this warning is raised for all our test functions. Declaring them static would fix the issue.\n  // warning #279: controlling expression is constant\n  // remark #1572: floating-point equality and inequality comparisons are unreliable\n  #pragma warning disable 279 383 1418 1572\n#endif\n"
  },
  {
    "path": "libs/eigen/test/mapped_matrix.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2006-2010 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_NO_STATIC_ASSERT\n#define EIGEN_NO_STATIC_ASSERT // turn static asserts into runtime asserts in order to check them\n#endif\n\n#include \"main.h\"\n\ntemplate<typename VectorType> void map_class_vector(const VectorType& m)\n{\n  typedef typename VectorType::Index Index;\n  typedef typename VectorType::Scalar Scalar;\n\n  Index size = m.size();\n\n  // test Map.h\n  Scalar* array1 = internal::aligned_new<Scalar>(size);\n  Scalar* array2 = internal::aligned_new<Scalar>(size);\n  Scalar* array3 = new Scalar[size+1];\n  Scalar* array3unaligned = size_t(array3)%16 == 0 ? array3+1 : array3;\n\n  Map<VectorType, Aligned>(array1, size) = VectorType::Random(size);\n  Map<VectorType, Aligned>(array2, size) = Map<VectorType,Aligned>(array1, size);\n  Map<VectorType>(array3unaligned, size) = Map<VectorType>(array1, size);\n  VectorType ma1 = Map<VectorType, Aligned>(array1, size);\n  VectorType ma2 = Map<VectorType, Aligned>(array2, size);\n  VectorType ma3 = Map<VectorType>(array3unaligned, size);\n  VERIFY_IS_EQUAL(ma1, ma2);\n  VERIFY_IS_EQUAL(ma1, ma3);\n  #ifdef EIGEN_VECTORIZE\n  if(internal::packet_traits<Scalar>::Vectorizable)\n    VERIFY_RAISES_ASSERT((Map<VectorType,Aligned>(array3unaligned, size)))\n  #endif\n\n  internal::aligned_delete(array1, size);\n  internal::aligned_delete(array2, size);\n  delete[] array3;\n}\n\ntemplate<typename MatrixType> void map_class_matrix(const MatrixType& m)\n{\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n\n  Index rows = m.rows(), cols = m.cols(), size = rows*cols;\n\n  // test Map.h\n  Scalar* array1 = internal::aligned_new<Scalar>(size);\n  for(int i = 0; i < size; i++) array1[i] = Scalar(1);\n  Scalar* array2 = internal::aligned_new<Scalar>(size);\n  for(int i = 0; i < size; i++) array2[i] = Scalar(1);\n  Scalar* array3 = new Scalar[size+1];\n  for(int i = 0; i < size+1; i++) array3[i] = Scalar(1);\n  Scalar* array3unaligned = size_t(array3)%16 == 0 ? array3+1 : array3;\n  Map<MatrixType, Aligned>(array1, rows, cols) = MatrixType::Ones(rows,cols);\n  Map<MatrixType>(array2, rows, cols) = Map<MatrixType>(array1, rows, cols);\n  Map<MatrixType>(array3unaligned, rows, cols) = Map<MatrixType>(array1, rows, cols);\n  MatrixType ma1 = Map<MatrixType>(array1, rows, cols);\n  MatrixType ma2 = Map<MatrixType, Aligned>(array2, rows, cols);\n  VERIFY_IS_EQUAL(ma1, ma2);\n  MatrixType ma3 = Map<MatrixType>(array3unaligned, rows, cols);\n  VERIFY_IS_EQUAL(ma1, ma3);\n\n  internal::aligned_delete(array1, size);\n  internal::aligned_delete(array2, size);\n  delete[] array3;\n}\n\ntemplate<typename VectorType> void map_static_methods(const VectorType& m)\n{\n  typedef typename VectorType::Index Index;\n  typedef typename VectorType::Scalar Scalar;\n\n  Index size = m.size();\n\n  // test Map.h\n  Scalar* array1 = internal::aligned_new<Scalar>(size);\n  Scalar* array2 = internal::aligned_new<Scalar>(size);\n  Scalar* array3 = new Scalar[size+1];\n  Scalar* array3unaligned = size_t(array3)%16 == 0 ? array3+1 : array3;\n\n  VectorType::MapAligned(array1, size) = VectorType::Random(size);\n  VectorType::Map(array2, size) = VectorType::Map(array1, size);\n  VectorType::Map(array3unaligned, size) = VectorType::Map(array1, size);\n  VectorType ma1 = VectorType::Map(array1, size);\n  VectorType ma2 = VectorType::MapAligned(array2, size);\n  VectorType ma3 = VectorType::Map(array3unaligned, size);\n  VERIFY_IS_EQUAL(ma1, ma2);\n  VERIFY_IS_EQUAL(ma1, ma3);\n\n  internal::aligned_delete(array1, size);\n  internal::aligned_delete(array2, size);\n  delete[] array3;\n}\n\ntemplate<typename PlainObjectType> void check_const_correctness(const PlainObjectType&)\n{\n  // there's a lot that we can't test here while still having this test compile!\n  // the only possible approach would be to run a script trying to compile stuff and checking that it fails.\n  // CMake can help with that.\n\n  // verify that map-to-const don't have LvalueBit\n  typedef typename internal::add_const<PlainObjectType>::type ConstPlainObjectType;\n  VERIFY( !(internal::traits<Map<ConstPlainObjectType> >::Flags & LvalueBit) );\n  VERIFY( !(internal::traits<Map<ConstPlainObjectType, Aligned> >::Flags & LvalueBit) );\n  VERIFY( !(Map<ConstPlainObjectType>::Flags & LvalueBit) );\n  VERIFY( !(Map<ConstPlainObjectType, Aligned>::Flags & LvalueBit) );\n}\n\ntemplate<typename Scalar>\nvoid map_not_aligned_on_scalar()\n{\n  typedef Matrix<Scalar,Dynamic,Dynamic> MatrixType;\n  typedef typename MatrixType::Index Index;\n  Index size = 11;\n  Scalar* array1 = internal::aligned_new<Scalar>((size+1)*(size+1)+1);\n  Scalar* array2 = reinterpret_cast<Scalar*>(sizeof(Scalar)/2+std::size_t(array1));\n  Map<MatrixType,0,OuterStride<> > map2(array2, size, size, OuterStride<>(size+1));\n  MatrixType m2 = MatrixType::Random(size,size);\n  map2 = m2;\n  VERIFY_IS_EQUAL(m2, map2);\n  \n  typedef Matrix<Scalar,Dynamic,1> VectorType;\n  Map<VectorType> map3(array2, size);\n  MatrixType v3 = VectorType::Random(size);\n  map3 = v3;\n  VERIFY_IS_EQUAL(v3, map3);\n  \n  internal::aligned_delete(array1, (size+1)*(size+1)+1);\n}\n\nvoid test_mapped_matrix()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( map_class_vector(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_1( check_const_correctness(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( map_class_vector(Vector4d()) );\n    CALL_SUBTEST_2( check_const_correctness(Matrix4d()) );\n    CALL_SUBTEST_3( map_class_vector(RowVector4f()) );\n    CALL_SUBTEST_4( map_class_vector(VectorXcf(8)) );\n    CALL_SUBTEST_5( map_class_vector(VectorXi(12)) );\n    CALL_SUBTEST_5( check_const_correctness(VectorXi(12)) );\n\n    CALL_SUBTEST_1( map_class_matrix(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( map_class_matrix(Matrix4d()) );\n    CALL_SUBTEST_11( map_class_matrix(Matrix<float,3,5>()) );\n    CALL_SUBTEST_4( map_class_matrix(MatrixXcf(internal::random<int>(1,10),internal::random<int>(1,10))) );\n    CALL_SUBTEST_5( map_class_matrix(MatrixXi(internal::random<int>(1,10),internal::random<int>(1,10))) );\n\n    CALL_SUBTEST_6( map_static_methods(Matrix<double, 1, 1>()) );\n    CALL_SUBTEST_7( map_static_methods(Vector3f()) );\n    CALL_SUBTEST_8( map_static_methods(RowVector3d()) );\n    CALL_SUBTEST_9( map_static_methods(VectorXcd(8)) );\n    CALL_SUBTEST_10( map_static_methods(VectorXf(12)) );\n    \n    CALL_SUBTEST_11( map_not_aligned_on_scalar<double>() );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/mapstaticmethods.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2011 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\nfloat *ptr;\nconst float *const_ptr;\n\ntemplate<typename PlainObjectType,\n         bool IsDynamicSize = PlainObjectType::SizeAtCompileTime == Dynamic,\n         bool IsVector = PlainObjectType::IsVectorAtCompileTime\n>\nstruct mapstaticmethods_impl {};\n\ntemplate<typename PlainObjectType, bool IsVector>\nstruct mapstaticmethods_impl<PlainObjectType, false, IsVector>\n{\n  static void run(const PlainObjectType& m)\n  {\n    mapstaticmethods_impl<PlainObjectType, true, IsVector>::run(m);\n\n    int i = internal::random<int>(2,5), j = internal::random<int>(2,5);\n\n    PlainObjectType::Map(ptr).setZero();\n    PlainObjectType::MapAligned(ptr).setZero();\n    PlainObjectType::Map(const_ptr).sum();\n    PlainObjectType::MapAligned(const_ptr).sum();\n\n    PlainObjectType::Map(ptr, InnerStride<>(i)).setZero();\n    PlainObjectType::MapAligned(ptr, InnerStride<>(i)).setZero();\n    PlainObjectType::Map(const_ptr, InnerStride<>(i)).sum();\n    PlainObjectType::MapAligned(const_ptr, InnerStride<>(i)).sum();\n\n    PlainObjectType::Map(ptr, InnerStride<2>()).setZero();\n    PlainObjectType::MapAligned(ptr, InnerStride<3>()).setZero();\n    PlainObjectType::Map(const_ptr, InnerStride<4>()).sum();\n    PlainObjectType::MapAligned(const_ptr, InnerStride<5>()).sum();\n\n    PlainObjectType::Map(ptr, OuterStride<>(i)).setZero();\n    PlainObjectType::MapAligned(ptr, OuterStride<>(i)).setZero();\n    PlainObjectType::Map(const_ptr, OuterStride<>(i)).sum();\n    PlainObjectType::MapAligned(const_ptr, OuterStride<>(i)).sum();\n\n    PlainObjectType::Map(ptr, OuterStride<2>()).setZero();\n    PlainObjectType::MapAligned(ptr, OuterStride<3>()).setZero();\n    PlainObjectType::Map(const_ptr, OuterStride<4>()).sum();\n    PlainObjectType::MapAligned(const_ptr, OuterStride<5>()).sum();\n\n    PlainObjectType::Map(ptr, Stride<Dynamic, Dynamic>(i,j)).setZero();\n    PlainObjectType::MapAligned(ptr, Stride<2,Dynamic>(2,i)).setZero();\n    PlainObjectType::Map(const_ptr, Stride<Dynamic,3>(i,3)).sum();\n    PlainObjectType::MapAligned(const_ptr, Stride<Dynamic, Dynamic>(i,j)).sum();\n\n    PlainObjectType::Map(ptr, Stride<2,3>()).setZero();\n    PlainObjectType::MapAligned(ptr, Stride<3,4>()).setZero();\n    PlainObjectType::Map(const_ptr, Stride<2,4>()).sum();\n    PlainObjectType::MapAligned(const_ptr, Stride<5,3>()).sum();\n  }\n};\n\ntemplate<typename PlainObjectType>\nstruct mapstaticmethods_impl<PlainObjectType, true, false>\n{\n  static void run(const PlainObjectType& m)\n  {\n    int rows = m.rows(), cols = m.cols();\n\n    int i = internal::random<int>(2,5), j = internal::random<int>(2,5);\n\n    PlainObjectType::Map(ptr, rows, cols).setZero();\n    PlainObjectType::MapAligned(ptr, rows, cols).setZero();\n    PlainObjectType::Map(const_ptr, rows, cols).sum();\n    PlainObjectType::MapAligned(const_ptr, rows, cols).sum();\n\n    PlainObjectType::Map(ptr, rows, cols, InnerStride<>(i)).setZero();\n    PlainObjectType::MapAligned(ptr, rows, cols, InnerStride<>(i)).setZero();\n    PlainObjectType::Map(const_ptr, rows, cols, InnerStride<>(i)).sum();\n    PlainObjectType::MapAligned(const_ptr, rows, cols, InnerStride<>(i)).sum();\n\n    PlainObjectType::Map(ptr, rows, cols, InnerStride<2>()).setZero();\n    PlainObjectType::MapAligned(ptr, rows, cols, InnerStride<3>()).setZero();\n    PlainObjectType::Map(const_ptr, rows, cols, InnerStride<4>()).sum();\n    PlainObjectType::MapAligned(const_ptr, rows, cols, InnerStride<5>()).sum();\n\n    PlainObjectType::Map(ptr, rows, cols, OuterStride<>(i)).setZero();\n    PlainObjectType::MapAligned(ptr, rows, cols, OuterStride<>(i)).setZero();\n    PlainObjectType::Map(const_ptr, rows, cols, OuterStride<>(i)).sum();\n    PlainObjectType::MapAligned(const_ptr, rows, cols, OuterStride<>(i)).sum();\n\n    PlainObjectType::Map(ptr, rows, cols, OuterStride<2>()).setZero();\n    PlainObjectType::MapAligned(ptr, rows, cols, OuterStride<3>()).setZero();\n    PlainObjectType::Map(const_ptr, rows, cols, OuterStride<4>()).sum();\n    PlainObjectType::MapAligned(const_ptr, rows, cols, OuterStride<5>()).sum();\n\n    PlainObjectType::Map(ptr, rows, cols, Stride<Dynamic, Dynamic>(i,j)).setZero();\n    PlainObjectType::MapAligned(ptr, rows, cols, Stride<2,Dynamic>(2,i)).setZero();\n    PlainObjectType::Map(const_ptr, rows, cols, Stride<Dynamic,3>(i,3)).sum();\n    PlainObjectType::MapAligned(const_ptr, rows, cols, Stride<Dynamic, Dynamic>(i,j)).sum();\n\n    PlainObjectType::Map(ptr, rows, cols, Stride<2,3>()).setZero();\n    PlainObjectType::MapAligned(ptr, rows, cols, Stride<3,4>()).setZero();\n    PlainObjectType::Map(const_ptr, rows, cols, Stride<2,4>()).sum();\n    PlainObjectType::MapAligned(const_ptr, rows, cols, Stride<5,3>()).sum();\n  }\n};\n\ntemplate<typename PlainObjectType>\nstruct mapstaticmethods_impl<PlainObjectType, true, true>\n{\n  static void run(const PlainObjectType& v)\n  {\n    int size = v.size();\n\n    int i = internal::random<int>(2,5);\n\n    PlainObjectType::Map(ptr, size).setZero();\n    PlainObjectType::MapAligned(ptr, size).setZero();\n    PlainObjectType::Map(const_ptr, size).sum();\n    PlainObjectType::MapAligned(const_ptr, size).sum();\n\n    PlainObjectType::Map(ptr, size, InnerStride<>(i)).setZero();\n    PlainObjectType::MapAligned(ptr, size, InnerStride<>(i)).setZero();\n    PlainObjectType::Map(const_ptr, size, InnerStride<>(i)).sum();\n    PlainObjectType::MapAligned(const_ptr, size, InnerStride<>(i)).sum();\n\n    PlainObjectType::Map(ptr, size, InnerStride<2>()).setZero();\n    PlainObjectType::MapAligned(ptr, size, InnerStride<3>()).setZero();\n    PlainObjectType::Map(const_ptr, size, InnerStride<4>()).sum();\n    PlainObjectType::MapAligned(const_ptr, size, InnerStride<5>()).sum();\n  }\n};\n\ntemplate<typename PlainObjectType>\nvoid mapstaticmethods(const PlainObjectType& m)\n{\n  mapstaticmethods_impl<PlainObjectType>::run(m);\n  VERIFY(true); // just to avoid 'unused function' warning\n}\n\nvoid test_mapstaticmethods()\n{\n  ptr = internal::aligned_new<float>(1000);\n  for(int i = 0; i < 1000; i++) ptr[i] = float(i);\n\n  const_ptr = ptr;\n\n  CALL_SUBTEST_1(( mapstaticmethods(Matrix<float, 1, 1>()) ));\n  CALL_SUBTEST_1(( mapstaticmethods(Vector2f()) ));\n  CALL_SUBTEST_2(( mapstaticmethods(Vector3f()) ));\n  CALL_SUBTEST_2(( mapstaticmethods(Matrix2f()) ));\n  CALL_SUBTEST_3(( mapstaticmethods(Matrix4f()) ));\n  CALL_SUBTEST_3(( mapstaticmethods(Array4f()) ));\n  CALL_SUBTEST_4(( mapstaticmethods(Array3f()) ));\n  CALL_SUBTEST_4(( mapstaticmethods(Array33f()) ));\n  CALL_SUBTEST_5(( mapstaticmethods(Array44f()) ));\n  CALL_SUBTEST_5(( mapstaticmethods(VectorXf(1)) ));\n  CALL_SUBTEST_5(( mapstaticmethods(VectorXf(8)) ));\n  CALL_SUBTEST_6(( mapstaticmethods(MatrixXf(1,1)) ));\n  CALL_SUBTEST_6(( mapstaticmethods(MatrixXf(5,7)) ));\n  CALL_SUBTEST_7(( mapstaticmethods(ArrayXf(1)) ));\n  CALL_SUBTEST_7(( mapstaticmethods(ArrayXf(5)) ));\n  CALL_SUBTEST_8(( mapstaticmethods(ArrayXXf(1,1)) ));\n  CALL_SUBTEST_8(( mapstaticmethods(ArrayXXf(8,6)) ));\n\n  internal::aligned_delete(ptr, 1000);\n}\n\n"
  },
  {
    "path": "libs/eigen/test/mapstride.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2010 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\ntemplate<int Alignment,typename VectorType> void map_class_vector(const VectorType& m)\n{\n  typedef typename VectorType::Index Index;\n  typedef typename VectorType::Scalar Scalar;\n\n  Index size = m.size();\n\n  VectorType v = VectorType::Random(size);\n\n  Index arraysize = 3*size;\n  \n  Scalar* a_array = internal::aligned_new<Scalar>(arraysize+1);\n  Scalar* array = a_array;\n  if(Alignment!=Aligned)\n    array = (Scalar*)(ptrdiff_t(a_array) + (internal::packet_traits<Scalar>::AlignedOnScalar?sizeof(Scalar):sizeof(typename NumTraits<Scalar>::Real)));\n\n  {\n    Map<VectorType, Alignment, InnerStride<3> > map(array, size);\n    map = v;\n    for(int i = 0; i < size; ++i)\n    {\n      VERIFY(array[3*i] == v[i]);\n      VERIFY(map[i] == v[i]);\n    }\n  }\n\n  {\n    Map<VectorType, Unaligned, InnerStride<Dynamic> > map(array, size, InnerStride<Dynamic>(2));\n    map = v;\n    for(int i = 0; i < size; ++i)\n    {\n      VERIFY(array[2*i] == v[i]);\n      VERIFY(map[i] == v[i]);\n    }\n  }\n\n  internal::aligned_delete(a_array, arraysize+1);\n}\n\ntemplate<int Alignment,typename MatrixType> void map_class_matrix(const MatrixType& _m)\n{\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n\n  Index rows = _m.rows(), cols = _m.cols();\n\n  MatrixType m = MatrixType::Random(rows,cols);\n\n  Index arraysize = 2*(rows+4)*(cols+4);\n\n  Scalar* a_array = internal::aligned_new<Scalar>(arraysize+1);\n  Scalar* array = a_array;\n  if(Alignment!=Aligned)\n    array = (Scalar*)(ptrdiff_t(a_array) + (internal::packet_traits<Scalar>::AlignedOnScalar?sizeof(Scalar):sizeof(typename NumTraits<Scalar>::Real)));\n\n  // test no inner stride and some dynamic outer stride\n  {\n    Map<MatrixType, Alignment, OuterStride<Dynamic> > map(array, rows, cols, OuterStride<Dynamic>(m.innerSize()+1));\n    map = m;\n    VERIFY(map.outerStride() == map.innerSize()+1);\n    for(int i = 0; i < m.outerSize(); ++i)\n      for(int j = 0; j < m.innerSize(); ++j)\n      {\n        VERIFY(array[map.outerStride()*i+j] == m.coeffByOuterInner(i,j));\n        VERIFY(map.coeffByOuterInner(i,j) == m.coeffByOuterInner(i,j));\n      }\n  }\n\n  // test no inner stride and an outer stride of +4. This is quite important as for fixed-size matrices,\n  // this allows to hit the special case where it's vectorizable.\n  {\n    enum {\n      InnerSize = MatrixType::InnerSizeAtCompileTime,\n      OuterStrideAtCompileTime = InnerSize==Dynamic ? Dynamic : InnerSize+4\n    };\n    Map<MatrixType, Alignment, OuterStride<OuterStrideAtCompileTime> >\n      map(array, rows, cols, OuterStride<OuterStrideAtCompileTime>(m.innerSize()+4));\n    map = m;\n    VERIFY(map.outerStride() == map.innerSize()+4);\n    for(int i = 0; i < m.outerSize(); ++i)\n      for(int j = 0; j < m.innerSize(); ++j)\n      {\n        VERIFY(array[map.outerStride()*i+j] == m.coeffByOuterInner(i,j));\n        VERIFY(map.coeffByOuterInner(i,j) == m.coeffByOuterInner(i,j));\n      }\n  }\n\n  // test both inner stride and outer stride\n  {\n    Map<MatrixType, Alignment, Stride<Dynamic,Dynamic> > map(array, rows, cols, Stride<Dynamic,Dynamic>(2*m.innerSize()+1, 2));\n    map = m;\n    VERIFY(map.outerStride() == 2*map.innerSize()+1);\n    VERIFY(map.innerStride() == 2);\n    for(int i = 0; i < m.outerSize(); ++i)\n      for(int j = 0; j < m.innerSize(); ++j)\n      {\n        VERIFY(array[map.outerStride()*i+map.innerStride()*j] == m.coeffByOuterInner(i,j));\n        VERIFY(map.coeffByOuterInner(i,j) == m.coeffByOuterInner(i,j));\n      }\n  }\n\n  internal::aligned_delete(a_array, arraysize+1);\n}\n\nvoid test_mapstride()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    int maxn = 30;\n    CALL_SUBTEST_1( map_class_vector<Aligned>(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_1( map_class_vector<Unaligned>(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( map_class_vector<Aligned>(Vector4d()) );\n    CALL_SUBTEST_2( map_class_vector<Unaligned>(Vector4d()) );\n    CALL_SUBTEST_3( map_class_vector<Aligned>(RowVector4f()) );\n    CALL_SUBTEST_3( map_class_vector<Unaligned>(RowVector4f()) );\n    CALL_SUBTEST_4( map_class_vector<Aligned>(VectorXcf(internal::random<int>(1,maxn))) );\n    CALL_SUBTEST_4( map_class_vector<Unaligned>(VectorXcf(internal::random<int>(1,maxn))) );\n    CALL_SUBTEST_5( map_class_vector<Aligned>(VectorXi(internal::random<int>(1,maxn))) );\n    CALL_SUBTEST_5( map_class_vector<Unaligned>(VectorXi(internal::random<int>(1,maxn))) );\n\n    CALL_SUBTEST_1( map_class_matrix<Aligned>(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_1( map_class_matrix<Unaligned>(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( map_class_matrix<Aligned>(Matrix4d()) );\n    CALL_SUBTEST_2( map_class_matrix<Unaligned>(Matrix4d()) );\n    CALL_SUBTEST_3( map_class_matrix<Aligned>(Matrix<float,3,5>()) );\n    CALL_SUBTEST_3( map_class_matrix<Unaligned>(Matrix<float,3,5>()) );\n    CALL_SUBTEST_3( map_class_matrix<Aligned>(Matrix<float,4,8>()) );\n    CALL_SUBTEST_3( map_class_matrix<Unaligned>(Matrix<float,4,8>()) );\n    CALL_SUBTEST_4( map_class_matrix<Aligned>(MatrixXcf(internal::random<int>(1,maxn),internal::random<int>(1,maxn))) );\n    CALL_SUBTEST_4( map_class_matrix<Unaligned>(MatrixXcf(internal::random<int>(1,maxn),internal::random<int>(1,maxn))) );\n    CALL_SUBTEST_5( map_class_matrix<Aligned>(MatrixXi(internal::random<int>(1,maxn),internal::random<int>(1,maxn))) );\n    CALL_SUBTEST_5( map_class_matrix<Unaligned>(MatrixXi(internal::random<int>(1,maxn),internal::random<int>(1,maxn))) );\n    CALL_SUBTEST_6( map_class_matrix<Aligned>(MatrixXcd(internal::random<int>(1,maxn),internal::random<int>(1,maxn))) );\n    CALL_SUBTEST_6( map_class_matrix<Unaligned>(MatrixXcd(internal::random<int>(1,maxn),internal::random<int>(1,maxn))) );\n    \n    TEST_SET_BUT_UNUSED_VARIABLE(maxn);\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/meta.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\nvoid test_meta()\n{\n  VERIFY((internal::conditional<(3<4),internal::true_type, internal::false_type>::type::value));\n  VERIFY(( internal::is_same<float,float>::value));\n  VERIFY((!internal::is_same<float,double>::value));\n  VERIFY((!internal::is_same<float,float&>::value));\n  VERIFY((!internal::is_same<float,const float&>::value));\n  \n  VERIFY(( internal::is_same<float,internal::remove_all<const float&>::type >::value));\n  VERIFY(( internal::is_same<float,internal::remove_all<const float*>::type >::value));\n  VERIFY(( internal::is_same<float,internal::remove_all<const float*&>::type >::value));\n  VERIFY(( internal::is_same<float,internal::remove_all<float**>::type >::value));\n  VERIFY(( internal::is_same<float,internal::remove_all<float**&>::type >::value));\n  VERIFY(( internal::is_same<float,internal::remove_all<float* const *&>::type >::value));\n  VERIFY(( internal::is_same<float,internal::remove_all<float* const>::type >::value));\n\n  // test add_const\n  VERIFY(( internal::is_same< internal::add_const<float>::type, const float >::value));\n  VERIFY(( internal::is_same< internal::add_const<float*>::type, float* const>::value));\n  VERIFY(( internal::is_same< internal::add_const<float const*>::type, float const* const>::value));\n  VERIFY(( internal::is_same< internal::add_const<float&>::type, float& >::value));\n\n  // test remove_const\n  VERIFY(( internal::is_same< internal::remove_const<float const* const>::type, float const* >::value));\n  VERIFY(( internal::is_same< internal::remove_const<float const*>::type, float const* >::value));\n  VERIFY(( internal::is_same< internal::remove_const<float* const>::type, float* >::value));\n\n  // test add_const_on_value_type\n  VERIFY(( internal::is_same< internal::add_const_on_value_type<float&>::type, float const& >::value));\n  VERIFY(( internal::is_same< internal::add_const_on_value_type<float*>::type, float const* >::value));\n\n  VERIFY(( internal::is_same< internal::add_const_on_value_type<float>::type, const float >::value));\n  VERIFY(( internal::is_same< internal::add_const_on_value_type<const float>::type, const float >::value));\n\n  VERIFY(( internal::is_same< internal::add_const_on_value_type<const float* const>::type, const float* const>::value));\n  VERIFY(( internal::is_same< internal::add_const_on_value_type<float* const>::type, const float* const>::value));\n  \n  VERIFY(( internal::is_same<float,internal::remove_reference<float&>::type >::value));\n  VERIFY(( internal::is_same<const float,internal::remove_reference<const float&>::type >::value));\n  VERIFY(( internal::is_same<float,internal::remove_pointer<float*>::type >::value));\n  VERIFY(( internal::is_same<const float,internal::remove_pointer<const float*>::type >::value));\n  VERIFY(( internal::is_same<float,internal::remove_pointer<float* const >::type >::value));\n  \n  VERIFY(internal::meta_sqrt<1>::ret == 1);\n  #define VERIFY_META_SQRT(X) VERIFY(internal::meta_sqrt<X>::ret == int(std::sqrt(double(X))))\n  VERIFY_META_SQRT(2);\n  VERIFY_META_SQRT(3);\n  VERIFY_META_SQRT(4);\n  VERIFY_META_SQRT(5);\n  VERIFY_META_SQRT(6);\n  VERIFY_META_SQRT(8);\n  VERIFY_META_SQRT(9);\n  VERIFY_META_SQRT(15);\n  VERIFY_META_SQRT(16);\n  VERIFY_META_SQRT(17);\n  VERIFY_META_SQRT(255);\n  VERIFY_META_SQRT(256);\n  VERIFY_META_SQRT(257);\n  VERIFY_META_SQRT(1023);\n  VERIFY_META_SQRT(1024);\n  VERIFY_META_SQRT(1025);\n}\n"
  },
  {
    "path": "libs/eigen/test/metis_support.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam@inria.fr>\n//\n// Eigen is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3 of the License, or (at your option) any later version.\n//\n// Alternatively, you can redistribute it and/or\n// modify it under the terms of the GNU General Public License as\n// published by the Free Software Foundation; either version 2 of\n// the License, or (at your option) any later version.\n//\n// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY\n// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License and a copy of the GNU General Public License along with\n// Eigen. If not, see <http://www.gnu.org/licenses/>.\n#include \"sparse_solver.h\"\n#include <Eigen/SparseLU>\n#include <Eigen/MetisSupport>\n#include <unsupported/Eigen/SparseExtra>\n\ntemplate<typename T> void test_metis_T()\n{\n  SparseLU<SparseMatrix<T, ColMajor>, MetisOrdering<int> > sparselu_metis;\n  \n  check_sparse_square_solving(sparselu_metis); \n}\n\nvoid test_metis_support()\n{\n  CALL_SUBTEST_1(test_metis_T<double>());\n}\n"
  },
  {
    "path": "libs/eigen/test/miscmatrices.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\ntemplate<typename MatrixType> void miscMatrices(const MatrixType& m)\n{\n  /* this test covers the following files:\n     DiagonalMatrix.h Ones.h\n  */\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> VectorType;\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  Index r = internal::random<Index>(0, rows-1), r2 = internal::random<Index>(0, rows-1), c = internal::random<Index>(0, cols-1);\n  VERIFY_IS_APPROX(MatrixType::Ones(rows,cols)(r,c), static_cast<Scalar>(1));\n  MatrixType m1 = MatrixType::Ones(rows,cols);\n  VERIFY_IS_APPROX(m1(r,c), static_cast<Scalar>(1));\n  VectorType v1 = VectorType::Random(rows);\n  v1[0];\n  Matrix<Scalar, MatrixType::RowsAtCompileTime, MatrixType::RowsAtCompileTime>\n  square(v1.asDiagonal());\n  if(r==r2) VERIFY_IS_APPROX(square(r,r2), v1[r]);\n  else VERIFY_IS_MUCH_SMALLER_THAN(square(r,r2), static_cast<Scalar>(1));\n  square = MatrixType::Zero(rows, rows);\n  square.diagonal() = VectorType::Ones(rows);\n  VERIFY_IS_APPROX(square, MatrixType::Identity(rows, rows));\n}\n\nvoid test_miscmatrices()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( miscMatrices(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( miscMatrices(Matrix4d()) );\n    CALL_SUBTEST_3( miscMatrices(MatrixXcf(3, 3)) );\n    CALL_SUBTEST_4( miscMatrices(MatrixXi(8, 12)) );\n    CALL_SUBTEST_5( miscMatrices(MatrixXcd(20, 20)) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/mixingtypes.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n// work around \"uninitialized\" warnings and give that option some testing\n#define EIGEN_INITIALIZE_MATRICES_BY_ZERO\n\n#ifndef EIGEN_NO_STATIC_ASSERT\n#define EIGEN_NO_STATIC_ASSERT // turn static asserts into runtime asserts in order to check them\n#endif\n\n// #ifndef EIGEN_DONT_VECTORIZE\n// #define EIGEN_DONT_VECTORIZE // SSE intrinsics aren't designed to allow mixing types\n// #endif\n\n#include \"main.h\"\n\nusing namespace std;\n\ntemplate<int SizeAtCompileType> void mixingtypes(int size = SizeAtCompileType)\n{\n  typedef std::complex<float>   CF;\n  typedef std::complex<double>  CD;\n  typedef Matrix<float, SizeAtCompileType, SizeAtCompileType> Mat_f;\n  typedef Matrix<double, SizeAtCompileType, SizeAtCompileType> Mat_d;\n  typedef Matrix<std::complex<float>, SizeAtCompileType, SizeAtCompileType> Mat_cf;\n  typedef Matrix<std::complex<double>, SizeAtCompileType, SizeAtCompileType> Mat_cd;\n  typedef Matrix<float, SizeAtCompileType, 1> Vec_f;\n  typedef Matrix<double, SizeAtCompileType, 1> Vec_d;\n  typedef Matrix<std::complex<float>, SizeAtCompileType, 1> Vec_cf;\n  typedef Matrix<std::complex<double>, SizeAtCompileType, 1> Vec_cd;\n\n  Mat_f mf    = Mat_f::Random(size,size);\n  Mat_d md    = mf.template cast<double>();\n  Mat_cf mcf  = Mat_cf::Random(size,size);\n  Mat_cd mcd  = mcf.template cast<complex<double> >();\n  Vec_f vf    = Vec_f::Random(size,1);\n  Vec_d vd    = vf.template cast<double>();\n  Vec_cf vcf  = Vec_cf::Random(size,1);\n  Vec_cd vcd  = vcf.template cast<complex<double> >();\n  float           sf  = internal::random<float>();\n  double          sd  = internal::random<double>();\n  complex<float>  scf = internal::random<complex<float> >();\n  complex<double> scd = internal::random<complex<double> >();\n\n\n  mf+mf;\n  VERIFY_RAISES_ASSERT(mf+md);\n  VERIFY_RAISES_ASSERT(mf+mcf);\n  VERIFY_RAISES_ASSERT(vf=vd);\n  VERIFY_RAISES_ASSERT(vf+=vd);\n  VERIFY_RAISES_ASSERT(mcd=md);\n\n  // check scalar products\n  VERIFY_IS_APPROX(vcf * sf , vcf * complex<float>(sf));\n  VERIFY_IS_APPROX(sd * vcd, complex<double>(sd) * vcd);\n  VERIFY_IS_APPROX(vf * scf , vf.template cast<complex<float> >() * scf);\n  VERIFY_IS_APPROX(scd * vd, scd * vd.template cast<complex<double> >());\n\n  // check dot product\n  vf.dot(vf);\n#if 0 // we get other compilation errors here than just static asserts\n  VERIFY_RAISES_ASSERT(vd.dot(vf));\n#endif\n  VERIFY_IS_APPROX(vcf.dot(vf), vcf.dot(vf.template cast<complex<float> >()));\n\n  // check diagonal product\n  VERIFY_IS_APPROX(vf.asDiagonal() * mcf, vf.template cast<complex<float> >().asDiagonal() * mcf);\n  VERIFY_IS_APPROX(vcd.asDiagonal() * md, vcd.asDiagonal() * md.template cast<complex<double> >());\n  VERIFY_IS_APPROX(mcf * vf.asDiagonal(), mcf * vf.template cast<complex<float> >().asDiagonal());\n  VERIFY_IS_APPROX(md * vcd.asDiagonal(), md.template cast<complex<double> >() * vcd.asDiagonal());\n//   vd.asDiagonal() * mf;    // does not even compile\n//   vcd.asDiagonal() * mf;   // does not even compile\n\n  // check inner product\n  VERIFY_IS_APPROX((vf.transpose() * vcf).value(), (vf.template cast<complex<float> >().transpose() * vcf).value());\n\n  // check outer product\n  VERIFY_IS_APPROX((vf * vcf.transpose()).eval(), (vf.template cast<complex<float> >() * vcf.transpose()).eval());\n\n  // coeff wise product\n\n  VERIFY_IS_APPROX((vf * vcf.transpose()).eval(), (vf.template cast<complex<float> >() * vcf.transpose()).eval());\n\n  Mat_cd mcd2 = mcd;\n  VERIFY_IS_APPROX(mcd.array() *= md.array(), mcd2.array() *= md.array().template cast<std::complex<double> >());\n  \n  // check matrix-matrix products\n\n  VERIFY_IS_APPROX(sd*md*mcd, (sd*md).template cast<CD>().eval()*mcd);\n  VERIFY_IS_APPROX(sd*mcd*md, sd*mcd*md.template cast<CD>());\n  VERIFY_IS_APPROX(scd*md*mcd, scd*md.template cast<CD>().eval()*mcd);\n  VERIFY_IS_APPROX(scd*mcd*md, scd*mcd*md.template cast<CD>());\n\n  VERIFY_IS_APPROX(sf*mf*mcf, sf*mf.template cast<CF>()*mcf);\n  VERIFY_IS_APPROX(sf*mcf*mf, sf*mcf*mf.template cast<CF>());\n  VERIFY_IS_APPROX(scf*mf*mcf, scf*mf.template cast<CF>()*mcf);\n  VERIFY_IS_APPROX(scf*mcf*mf, scf*mcf*mf.template cast<CF>());\n\n  VERIFY_IS_APPROX(sf*mf*vcf, (sf*mf).template cast<CF>().eval()*vcf);\n  VERIFY_IS_APPROX(scf*mf*vcf,(scf*mf.template cast<CF>()).eval()*vcf);\n  VERIFY_IS_APPROX(sf*mcf*vf, sf*mcf*vf.template cast<CF>());\n  VERIFY_IS_APPROX(scf*mcf*vf,scf*mcf*vf.template cast<CF>());\n\n  VERIFY_IS_APPROX(sf*vcf.adjoint()*mf,  sf*vcf.adjoint()*mf.template cast<CF>().eval());\n  VERIFY_IS_APPROX(scf*vcf.adjoint()*mf, scf*vcf.adjoint()*mf.template cast<CF>().eval());\n  VERIFY_IS_APPROX(sf*vf.adjoint()*mcf,  sf*vf.adjoint().template cast<CF>().eval()*mcf);\n  VERIFY_IS_APPROX(scf*vf.adjoint()*mcf, scf*vf.adjoint().template cast<CF>().eval()*mcf);\n\n  VERIFY_IS_APPROX(sd*md*vcd, (sd*md).template cast<CD>().eval()*vcd);\n  VERIFY_IS_APPROX(scd*md*vcd,(scd*md.template cast<CD>()).eval()*vcd);\n  VERIFY_IS_APPROX(sd*mcd*vd, sd*mcd*vd.template cast<CD>().eval());\n  VERIFY_IS_APPROX(scd*mcd*vd,scd*mcd*vd.template cast<CD>().eval());\n\n  VERIFY_IS_APPROX(sd*vcd.adjoint()*md,  sd*vcd.adjoint()*md.template cast<CD>().eval());\n  VERIFY_IS_APPROX(scd*vcd.adjoint()*md, scd*vcd.adjoint()*md.template cast<CD>().eval());\n  VERIFY_IS_APPROX(sd*vd.adjoint()*mcd,  sd*vd.adjoint().template cast<CD>().eval()*mcd);\n  VERIFY_IS_APPROX(scd*vd.adjoint()*mcd, scd*vd.adjoint().template cast<CD>().eval()*mcd);\n}\n\nvoid test_mixingtypes()\n{\n  CALL_SUBTEST_1(mixingtypes<3>());\n  CALL_SUBTEST_2(mixingtypes<4>());\n  CALL_SUBTEST_3(mixingtypes<Dynamic>(internal::random<int>(1,EIGEN_TEST_MAX_SIZE)));\n}\n"
  },
  {
    "path": "libs/eigen/test/mpl2only.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2015 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#define EIGEN_MPL2_ONLY\n#include <Eigen/Dense>\n#include <Eigen/SparseCore>\n#include <Eigen/SparseLU>\n#include <Eigen/SparseQR>\n#include <Eigen/IterativeLinearSolvers>\n\nint main()\n{\n  return 0;\n}\n"
  },
  {
    "path": "libs/eigen/test/nesting_ops.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2010 Hauke Heibel <hauke.heibel@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\ntemplate <typename MatrixType> void run_nesting_ops(const MatrixType& _m)\n{\n  typename MatrixType::Nested m(_m);\n\n  // Make really sure that we are in debug mode!\n  VERIFY_RAISES_ASSERT(eigen_assert(false));\n\n  // The only intention of these tests is to ensure that this code does\n  // not trigger any asserts or segmentation faults... more to come.\n  VERIFY_IS_APPROX( (m.transpose() * m).diagonal().sum(), (m.transpose() * m).diagonal().sum() );\n  VERIFY_IS_APPROX( (m.transpose() * m).diagonal().array().abs().sum(), (m.transpose() * m).diagonal().array().abs().sum() );\n\n  VERIFY_IS_APPROX( (m.transpose() * m).array().abs().sum(), (m.transpose() * m).array().abs().sum() );\n}\n\nvoid test_nesting_ops()\n{\n  CALL_SUBTEST_1(run_nesting_ops(MatrixXf::Random(25,25)));\n  CALL_SUBTEST_2(run_nesting_ops(MatrixXd::Random(25,25)));\n  CALL_SUBTEST_3(run_nesting_ops(Matrix4f::Random()));\n  CALL_SUBTEST_4(run_nesting_ops(Matrix4d::Random()));\n}\n"
  },
  {
    "path": "libs/eigen/test/nomalloc.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n// this hack is needed to make this file compiles with -pedantic (gcc)\n#ifdef __GNUC__\n#define throw(X)\n#endif\n\n#ifdef __INTEL_COMPILER\n  // disable \"warning #76: argument to macro is empty\" produced by the above hack\n  #pragma warning disable 76\n#endif\n\n// discard stack allocation as that too bypasses malloc\n#define EIGEN_STACK_ALLOCATION_LIMIT 0\n// any heap allocation will raise an assert\n#define EIGEN_NO_MALLOC\n\n#include \"main.h\"\n#include <Eigen/Cholesky>\n#include <Eigen/Eigenvalues>\n#include <Eigen/LU>\n#include <Eigen/QR>\n#include <Eigen/SVD>\n\ntemplate<typename MatrixType> void nomalloc(const MatrixType& m)\n{\n  /* this test check no dynamic memory allocation are issued with fixed-size matrices\n  */\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  MatrixType m1 = MatrixType::Random(rows, cols),\n             m2 = MatrixType::Random(rows, cols),\n             m3(rows, cols);\n\n  Scalar s1 = internal::random<Scalar>();\n\n  Index r = internal::random<Index>(0, rows-1),\n        c = internal::random<Index>(0, cols-1);\n\n  VERIFY_IS_APPROX((m1+m2)*s1,              s1*m1+s1*m2);\n  VERIFY_IS_APPROX((m1+m2)(r,c), (m1(r,c))+(m2(r,c)));\n  VERIFY_IS_APPROX(m1.cwiseProduct(m1.block(0,0,rows,cols)), (m1.array()*m1.array()).matrix());\n  VERIFY_IS_APPROX((m1*m1.transpose())*m2,  m1*(m1.transpose()*m2));\n  \n  m2.col(0).noalias() = m1 * m1.col(0);\n  m2.col(0).noalias() -= m1.adjoint() * m1.col(0);\n  m2.col(0).noalias() -= m1 * m1.row(0).adjoint();\n  m2.col(0).noalias() -= m1.adjoint() * m1.row(0).adjoint();\n\n  m2.row(0).noalias() = m1.row(0) * m1;\n  m2.row(0).noalias() -= m1.row(0) * m1.adjoint();\n  m2.row(0).noalias() -= m1.col(0).adjoint() * m1;\n  m2.row(0).noalias() -= m1.col(0).adjoint() * m1.adjoint();\n  VERIFY_IS_APPROX(m2,m2);\n  \n  m2.col(0).noalias() = m1.template triangularView<Upper>() * m1.col(0);\n  m2.col(0).noalias() -= m1.adjoint().template triangularView<Upper>() * m1.col(0);\n  m2.col(0).noalias() -= m1.template triangularView<Upper>() * m1.row(0).adjoint();\n  m2.col(0).noalias() -= m1.adjoint().template triangularView<Upper>() * m1.row(0).adjoint();\n\n  m2.row(0).noalias() = m1.row(0) * m1.template triangularView<Upper>();\n  m2.row(0).noalias() -= m1.row(0) * m1.adjoint().template triangularView<Upper>();\n  m2.row(0).noalias() -= m1.col(0).adjoint() * m1.template triangularView<Upper>();\n  m2.row(0).noalias() -= m1.col(0).adjoint() * m1.adjoint().template triangularView<Upper>();\n  VERIFY_IS_APPROX(m2,m2);\n  \n  m2.col(0).noalias() = m1.template selfadjointView<Upper>() * m1.col(0);\n  m2.col(0).noalias() -= m1.adjoint().template selfadjointView<Upper>() * m1.col(0);\n  m2.col(0).noalias() -= m1.template selfadjointView<Upper>() * m1.row(0).adjoint();\n  m2.col(0).noalias() -= m1.adjoint().template selfadjointView<Upper>() * m1.row(0).adjoint();\n\n  m2.row(0).noalias() = m1.row(0) * m1.template selfadjointView<Upper>();\n  m2.row(0).noalias() -= m1.row(0) * m1.adjoint().template selfadjointView<Upper>();\n  m2.row(0).noalias() -= m1.col(0).adjoint() * m1.template selfadjointView<Upper>();\n  m2.row(0).noalias() -= m1.col(0).adjoint() * m1.adjoint().template selfadjointView<Upper>();\n  VERIFY_IS_APPROX(m2,m2);\n  \n  m2.template selfadjointView<Lower>().rankUpdate(m1.col(0),-1);\n  m2.template selfadjointView<Lower>().rankUpdate(m1.row(0),-1);\n\n  // The following fancy matrix-matrix products are not safe yet regarding static allocation\n//   m1 += m1.template triangularView<Upper>() * m2.col(;\n//   m1.template selfadjointView<Lower>().rankUpdate(m2);\n//   m1 += m1.template triangularView<Upper>() * m2;\n//   m1 += m1.template selfadjointView<Lower>() * m2;\n//   VERIFY_IS_APPROX(m1,m1);\n}\n\ntemplate<typename Scalar>\nvoid ctms_decompositions()\n{\n  const int maxSize = 16;\n  const int size    = 12;\n\n  typedef Eigen::Matrix<Scalar,\n                        Eigen::Dynamic, Eigen::Dynamic,\n                        0,\n                        maxSize, maxSize> Matrix;\n\n  typedef Eigen::Matrix<Scalar,\n                        Eigen::Dynamic, 1,\n                        0,\n                        maxSize, 1> Vector;\n\n  typedef Eigen::Matrix<std::complex<Scalar>,\n                        Eigen::Dynamic, Eigen::Dynamic,\n                        0,\n                        maxSize, maxSize> ComplexMatrix;\n\n  const Matrix A(Matrix::Random(size, size)), B(Matrix::Random(size, size));\n  Matrix X(size,size);\n  const ComplexMatrix complexA(ComplexMatrix::Random(size, size));\n  const Matrix saA = A.adjoint() * A;\n  const Vector b(Vector::Random(size));\n  Vector x(size);\n\n  // Cholesky module\n  Eigen::LLT<Matrix>  LLT;  LLT.compute(A);\n  X = LLT.solve(B);\n  x = LLT.solve(b);\n  Eigen::LDLT<Matrix> LDLT; LDLT.compute(A);\n  X = LDLT.solve(B);\n  x = LDLT.solve(b);\n\n  // Eigenvalues module\n  Eigen::HessenbergDecomposition<ComplexMatrix> hessDecomp;        hessDecomp.compute(complexA);\n  Eigen::ComplexSchur<ComplexMatrix>            cSchur(size);      cSchur.compute(complexA);\n  Eigen::ComplexEigenSolver<ComplexMatrix>      cEigSolver;        cEigSolver.compute(complexA);\n  Eigen::EigenSolver<Matrix>                    eigSolver;         eigSolver.compute(A);\n  Eigen::SelfAdjointEigenSolver<Matrix>         saEigSolver(size); saEigSolver.compute(saA);\n  Eigen::Tridiagonalization<Matrix>             tridiag;           tridiag.compute(saA);\n\n  // LU module\n  Eigen::PartialPivLU<Matrix> ppLU; ppLU.compute(A);\n  X = ppLU.solve(B);\n  x = ppLU.solve(b);\n  Eigen::FullPivLU<Matrix>    fpLU; fpLU.compute(A);\n  X = fpLU.solve(B);\n  x = fpLU.solve(b);\n\n  // QR module\n  Eigen::HouseholderQR<Matrix>        hQR;  hQR.compute(A);\n  X = hQR.solve(B);\n  x = hQR.solve(b);\n  Eigen::ColPivHouseholderQR<Matrix>  cpQR; cpQR.compute(A);\n  X = cpQR.solve(B);\n  x = cpQR.solve(b);\n  Eigen::FullPivHouseholderQR<Matrix> fpQR; fpQR.compute(A);\n  // FIXME X = fpQR.solve(B);\n  x = fpQR.solve(b);\n\n  // SVD module\n  Eigen::JacobiSVD<Matrix> jSVD; jSVD.compute(A, ComputeFullU | ComputeFullV);\n}\n\nvoid test_zerosized() {\n  // default constructors:\n  Eigen::MatrixXd A;\n  Eigen::VectorXd v;\n  // explicit zero-sized:\n  Eigen::ArrayXXd A0(0,0);\n  Eigen::ArrayXd v0(std::ptrdiff_t(0)); // FIXME ArrayXd(0) is ambiguous\n\n  // assigning empty objects to each other:\n  A=A0;\n  v=v0;\n}\n\ntemplate<typename MatrixType> void test_reference(const MatrixType& m) {\n  typedef typename MatrixType::Scalar Scalar;\n  enum { Flag          =  MatrixType::IsRowMajor ? Eigen::RowMajor : Eigen::ColMajor};\n  enum { TransposeFlag = !MatrixType::IsRowMajor ? Eigen::RowMajor : Eigen::ColMajor};\n  typename MatrixType::Index rows = m.rows(), cols=m.cols();\n  // Dynamic reference:\n  typedef Eigen::Ref<const Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic, Flag         > > Ref;\n  typedef Eigen::Ref<const Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic, TransposeFlag> > RefT;\n\n  Ref r1(m);\n  Ref r2(m.block(rows/3, cols/4, rows/2, cols/2));\n  RefT r3(m.transpose());\n  RefT r4(m.topLeftCorner(rows/2, cols/2).transpose());\n\n  VERIFY_RAISES_ASSERT(RefT r5(m));\n  VERIFY_RAISES_ASSERT(Ref r6(m.transpose()));\n  VERIFY_RAISES_ASSERT(Ref r7(Scalar(2) * m));\n}\n\nvoid test_nomalloc()\n{\n  // check that our operator new is indeed called:\n  VERIFY_RAISES_ASSERT(MatrixXd dummy(MatrixXd::Random(3,3)));\n  CALL_SUBTEST_1(nomalloc(Matrix<float, 1, 1>()) );\n  CALL_SUBTEST_2(nomalloc(Matrix4d()) );\n  CALL_SUBTEST_3(nomalloc(Matrix<float,32,32>()) );\n  \n  // Check decomposition modules with dynamic matrices that have a known compile-time max size (ctms)\n  CALL_SUBTEST_4(ctms_decompositions<float>());\n  CALL_SUBTEST_5(test_zerosized());\n  CALL_SUBTEST_6(test_reference(Matrix<float,32,32>()));\n}\n"
  },
  {
    "path": "libs/eigen/test/nullary.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2010-2011 Jitse Niesen <jitse@maths.leeds.ac.uk>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\ntemplate<typename MatrixType>\nbool equalsIdentity(const MatrixType& A)\n{\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n  Scalar zero = static_cast<Scalar>(0);\n\n  bool offDiagOK = true;\n  for (Index i = 0; i < A.rows(); ++i) {\n    for (Index j = i+1; j < A.cols(); ++j) {\n      offDiagOK = offDiagOK && (A(i,j) == zero);\n    }\n  }\n  for (Index i = 0; i < A.rows(); ++i) {\n    for (Index j = 0; j < (std::min)(i, A.cols()); ++j) {\n      offDiagOK = offDiagOK && (A(i,j) == zero);\n    }\n  }\n\n  bool diagOK = (A.diagonal().array() == 1).all();\n  return offDiagOK && diagOK;\n}\n\ntemplate<typename VectorType>\nvoid testVectorType(const VectorType& base)\n{\n  typedef typename internal::traits<VectorType>::Index Index;\n  typedef typename internal::traits<VectorType>::Scalar Scalar;\n\n  const Index size = base.size();\n  \n  Scalar high = internal::random<Scalar>(-500,500);\n  Scalar low = (size == 1 ? high : internal::random<Scalar>(-500,500));\n  if (low>high) std::swap(low,high);\n\n  const Scalar step = ((size == 1) ? 1 : (high-low)/(size-1));\n\n  // check whether the result yields what we expect it to do\n  VectorType m(base);\n  m.setLinSpaced(size,low,high);\n\n  VectorType n(size);\n  for (int i=0; i<size; ++i)\n    n(i) = low+i*step;\n\n  VERIFY_IS_APPROX(m,n);\n\n  // random access version\n  m = VectorType::LinSpaced(size,low,high);\n  VERIFY_IS_APPROX(m,n);\n\n  // Assignment of a RowVectorXd to a MatrixXd (regression test for bug #79).\n  VERIFY( (MatrixXd(RowVectorXd::LinSpaced(3, 0, 1)) - RowVector3d(0, 0.5, 1)).norm() < std::numeric_limits<Scalar>::epsilon() );\n\n  // These guys sometimes fail! This is not good. Any ideas how to fix them!?\n  //VERIFY( m(m.size()-1) == high );\n  //VERIFY( m(0) == low );\n\n  // sequential access version\n  m = VectorType::LinSpaced(Sequential,size,low,high);\n  VERIFY_IS_APPROX(m,n);\n\n  // These guys sometimes fail! This is not good. Any ideas how to fix them!?\n  //VERIFY( m(m.size()-1) == high );\n  //VERIFY( m(0) == low );\n\n  // check whether everything works with row and col major vectors\n  Matrix<Scalar,Dynamic,1> row_vector(size);\n  Matrix<Scalar,1,Dynamic> col_vector(size);\n  row_vector.setLinSpaced(size,low,high);\n  col_vector.setLinSpaced(size,low,high);\n  // when using the extended precision (e.g., FPU) the relative error might exceed 1 bit\n  // when computing the squared sum in isApprox, thus the 2x factor.\n  VERIFY( row_vector.isApprox(col_vector.transpose(), Scalar(2)*NumTraits<Scalar>::epsilon()));\n\n  Matrix<Scalar,Dynamic,1> size_changer(size+50);\n  size_changer.setLinSpaced(size,low,high);\n  VERIFY( size_changer.size() == size );\n\n  typedef Matrix<Scalar,1,1> ScalarMatrix;\n  ScalarMatrix scalar;\n  scalar.setLinSpaced(1,low,high);\n  VERIFY_IS_APPROX( scalar, ScalarMatrix::Constant(high) );\n  VERIFY_IS_APPROX( ScalarMatrix::LinSpaced(1,low,high), ScalarMatrix::Constant(high) );\n\n  // regression test for bug 526 (linear vectorized transversal)\n  if (size > 1) {\n    m.tail(size-1).setLinSpaced(low, high);\n    VERIFY_IS_APPROX(m(size-1), high);\n  }\n}\n\ntemplate<typename MatrixType>\nvoid testMatrixType(const MatrixType& m)\n{\n  typedef typename MatrixType::Index Index;\n  const Index rows = m.rows();\n  const Index cols = m.cols();\n\n  MatrixType A;\n  A.setIdentity(rows, cols);\n  VERIFY(equalsIdentity(A));\n  VERIFY(equalsIdentity(MatrixType::Identity(rows, cols)));\n}\n\nvoid test_nullary()\n{\n  CALL_SUBTEST_1( testMatrixType(Matrix2d()) );\n  CALL_SUBTEST_2( testMatrixType(MatrixXcf(internal::random<int>(1,300),internal::random<int>(1,300))) );\n  CALL_SUBTEST_3( testMatrixType(MatrixXf(internal::random<int>(1,300),internal::random<int>(1,300))) );\n  \n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_4( testVectorType(VectorXd(internal::random<int>(1,300))) );\n    CALL_SUBTEST_5( testVectorType(Vector4d()) );  // regression test for bug 232\n    CALL_SUBTEST_6( testVectorType(Vector3d()) );\n    CALL_SUBTEST_7( testVectorType(VectorXf(internal::random<int>(1,300))) );\n    CALL_SUBTEST_8( testVectorType(Vector3f()) );\n    CALL_SUBTEST_8( testVectorType(Matrix<float,1,1>()) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/packetmath.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\n// using namespace Eigen;\n\nnamespace Eigen {\nnamespace internal {\ntemplate<typename T> T negate(const T& x) { return -x; }\n}\n}\n\ntemplate<typename Scalar> bool isApproxAbs(const Scalar& a, const Scalar& b, const typename NumTraits<Scalar>::Real& refvalue)\n{\n  return internal::isMuchSmallerThan(a-b, refvalue);\n}\n\ntemplate<typename Scalar> bool areApproxAbs(const Scalar* a, const Scalar* b, int size, const typename NumTraits<Scalar>::Real& refvalue)\n{\n  for (int i=0; i<size; ++i)\n  {\n    if (!isApproxAbs(a[i],b[i],refvalue))\n    {\n      std::cout << \"[\" << Map<const Matrix<Scalar,1,Dynamic> >(a,size) << \"]\" << \" != \" << Map<const Matrix<Scalar,1,Dynamic> >(b,size) << \"\\n\";\n      return false;\n    }\n  }\n  return true;\n}\n\ntemplate<typename Scalar> bool areApprox(const Scalar* a, const Scalar* b, int size)\n{\n  for (int i=0; i<size; ++i)\n  {\n    if (a[i]!=b[i] && !internal::isApprox(a[i],b[i]))\n    {\n      std::cout << \"[\" << Map<const Matrix<Scalar,1,Dynamic> >(a,size) << \"]\" << \" != \" << Map<const Matrix<Scalar,1,Dynamic> >(b,size) << \"\\n\";\n      return false;\n    }\n  }\n  return true;\n}\n\n\n#define CHECK_CWISE2(REFOP, POP) { \\\n  for (int i=0; i<PacketSize; ++i) \\\n    ref[i] = REFOP(data1[i], data1[i+PacketSize]); \\\n  internal::pstore(data2, POP(internal::pload<Packet>(data1), internal::pload<Packet>(data1+PacketSize))); \\\n  VERIFY(areApprox(ref, data2, PacketSize) && #POP); \\\n}\n\n#define CHECK_CWISE1(REFOP, POP) { \\\n  for (int i=0; i<PacketSize; ++i) \\\n    ref[i] = REFOP(data1[i]); \\\n  internal::pstore(data2, POP(internal::pload<Packet>(data1))); \\\n  VERIFY(areApprox(ref, data2, PacketSize) && #POP); \\\n}\n\ntemplate<bool Cond,typename Packet>\nstruct packet_helper\n{\n  template<typename T>\n  inline Packet load(const T* from) const { return internal::pload<Packet>(from); }\n\n  template<typename T>\n  inline void store(T* to, const Packet& x) const { internal::pstore(to,x); }\n};\n\ntemplate<typename Packet>\nstruct packet_helper<false,Packet>\n{\n  template<typename T>\n  inline T load(const T* from) const { return *from; }\n\n  template<typename T>\n  inline void store(T* to, const T& x) const { *to = x; }\n};\n\n#define CHECK_CWISE1_IF(COND, REFOP, POP) if(COND) { \\\n  packet_helper<COND,Packet> h; \\\n  for (int i=0; i<PacketSize; ++i) \\\n    ref[i] = REFOP(data1[i]); \\\n  h.store(data2, POP(h.load(data1))); \\\n  VERIFY(areApprox(ref, data2, PacketSize) && #POP); \\\n}\n\n#define REF_ADD(a,b) ((a)+(b))\n#define REF_SUB(a,b) ((a)-(b))\n#define REF_MUL(a,b) ((a)*(b))\n#define REF_DIV(a,b) ((a)/(b))\n\ntemplate<typename Scalar> void packetmath()\n{\n  using std::abs;\n  typedef typename internal::packet_traits<Scalar>::type Packet;\n  const int PacketSize = internal::packet_traits<Scalar>::size;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n\n  const int size = PacketSize*4;\n  EIGEN_ALIGN16 Scalar data1[internal::packet_traits<Scalar>::size*4];\n  EIGEN_ALIGN16 Scalar data2[internal::packet_traits<Scalar>::size*4];\n  EIGEN_ALIGN16 Packet packets[PacketSize*2];\n  EIGEN_ALIGN16 Scalar ref[internal::packet_traits<Scalar>::size*4];\n  RealScalar refvalue = 0;\n  for (int i=0; i<size; ++i)\n  {\n    data1[i] = internal::random<Scalar>()/RealScalar(PacketSize);\n    data2[i] = internal::random<Scalar>()/RealScalar(PacketSize);\n    refvalue = (std::max)(refvalue,abs(data1[i]));\n  }\n\n  internal::pstore(data2, internal::pload<Packet>(data1));\n  VERIFY(areApprox(data1, data2, PacketSize) && \"aligned load/store\");\n\n  for (int offset=0; offset<PacketSize; ++offset)\n  {\n    internal::pstore(data2, internal::ploadu<Packet>(data1+offset));\n    VERIFY(areApprox(data1+offset, data2, PacketSize) && \"internal::ploadu\");\n  }\n\n  for (int offset=0; offset<PacketSize; ++offset)\n  {\n    internal::pstoreu(data2+offset, internal::pload<Packet>(data1));\n    VERIFY(areApprox(data1, data2+offset, PacketSize) && \"internal::pstoreu\");\n  }\n\n  for (int offset=0; offset<PacketSize; ++offset)\n  {\n    packets[0] = internal::pload<Packet>(data1);\n    packets[1] = internal::pload<Packet>(data1+PacketSize);\n         if (offset==0) internal::palign<0>(packets[0], packets[1]);\n    else if (offset==1) internal::palign<1>(packets[0], packets[1]);\n    else if (offset==2) internal::palign<2>(packets[0], packets[1]);\n    else if (offset==3) internal::palign<3>(packets[0], packets[1]);\n    internal::pstore(data2, packets[0]);\n\n    for (int i=0; i<PacketSize; ++i)\n      ref[i] = data1[i+offset];\n\n    VERIFY(areApprox(ref, data2, PacketSize) && \"internal::palign\");\n  }\n\n  CHECK_CWISE2(REF_ADD,  internal::padd);\n  CHECK_CWISE2(REF_SUB,  internal::psub);\n  CHECK_CWISE2(REF_MUL,  internal::pmul);\n  #ifndef EIGEN_VECTORIZE_ALTIVEC\n  if (!internal::is_same<Scalar,int>::value)\n    CHECK_CWISE2(REF_DIV,  internal::pdiv);\n  #endif\n  CHECK_CWISE1(internal::negate, internal::pnegate);\n  CHECK_CWISE1(numext::conj, internal::pconj);\n\n  for(int offset=0;offset<3;++offset)\n  {\n    for (int i=0; i<PacketSize; ++i)\n      ref[i] = data1[offset];\n    internal::pstore(data2, internal::pset1<Packet>(data1[offset]));\n    VERIFY(areApprox(ref, data2, PacketSize) && \"internal::pset1\");\n  }\n  \n  VERIFY(internal::isApprox(data1[0], internal::pfirst(internal::pload<Packet>(data1))) && \"internal::pfirst\");\n  \n  if(PacketSize>1)\n  {\n    for(int offset=0;offset<4;++offset)\n    {\n      for(int i=0;i<PacketSize/2;++i)\n        ref[2*i+0] = ref[2*i+1] = data1[offset+i];\n      internal::pstore(data2,internal::ploaddup<Packet>(data1+offset));\n      VERIFY(areApprox(ref, data2, PacketSize) && \"ploaddup\");\n    }\n  }\n\n  ref[0] = 0;\n  for (int i=0; i<PacketSize; ++i)\n    ref[0] += data1[i];\n  VERIFY(isApproxAbs(ref[0], internal::predux(internal::pload<Packet>(data1)), refvalue) && \"internal::predux\");\n\n  ref[0] = 1;\n  for (int i=0; i<PacketSize; ++i)\n    ref[0] *= data1[i];\n  VERIFY(internal::isApprox(ref[0], internal::predux_mul(internal::pload<Packet>(data1))) && \"internal::predux_mul\");\n\n  for (int j=0; j<PacketSize; ++j)\n  {\n    ref[j] = 0;\n    for (int i=0; i<PacketSize; ++i)\n      ref[j] += data1[i+j*PacketSize];\n    packets[j] = internal::pload<Packet>(data1+j*PacketSize);\n  }\n  internal::pstore(data2, internal::preduxp(packets));\n  VERIFY(areApproxAbs(ref, data2, PacketSize, refvalue) && \"internal::preduxp\");\n\n  for (int i=0; i<PacketSize; ++i)\n    ref[i] = data1[PacketSize-i-1];\n  internal::pstore(data2, internal::preverse(internal::pload<Packet>(data1)));\n  VERIFY(areApprox(ref, data2, PacketSize) && \"internal::preverse\");\n}\n\ntemplate<typename Scalar> void packetmath_real()\n{\n  using std::abs;\n  typedef typename internal::packet_traits<Scalar>::type Packet;\n  const int PacketSize = internal::packet_traits<Scalar>::size;\n\n  const int size = PacketSize*4;\n  EIGEN_ALIGN16 Scalar data1[internal::packet_traits<Scalar>::size*4];\n  EIGEN_ALIGN16 Scalar data2[internal::packet_traits<Scalar>::size*4];\n  EIGEN_ALIGN16 Scalar ref[internal::packet_traits<Scalar>::size*4];\n\n  for (int i=0; i<size; ++i)\n  {\n    data1[i] = internal::random<Scalar>(-1,1) * std::pow(Scalar(10), internal::random<Scalar>(-3,3));\n    data2[i] = internal::random<Scalar>(-1,1) * std::pow(Scalar(10), internal::random<Scalar>(-3,3));\n  }\n  CHECK_CWISE1_IF(internal::packet_traits<Scalar>::HasSin, std::sin, internal::psin);\n  CHECK_CWISE1_IF(internal::packet_traits<Scalar>::HasCos, std::cos, internal::pcos);\n  CHECK_CWISE1_IF(internal::packet_traits<Scalar>::HasTan, std::tan, internal::ptan);\n  \n  for (int i=0; i<size; ++i)\n  {\n    data1[i] = internal::random<Scalar>(-1,1);\n    data2[i] = internal::random<Scalar>(-1,1);\n  }\n  CHECK_CWISE1_IF(internal::packet_traits<Scalar>::HasASin, std::asin, internal::pasin);\n  CHECK_CWISE1_IF(internal::packet_traits<Scalar>::HasACos, std::acos, internal::pacos);\n\n  for (int i=0; i<size; ++i)\n  {\n    data1[i] = internal::random<Scalar>(-87,88);\n    data2[i] = internal::random<Scalar>(-87,88);\n  }\n  CHECK_CWISE1_IF(internal::packet_traits<Scalar>::HasExp, std::exp, internal::pexp);\n  {\n    data1[0] = std::numeric_limits<Scalar>::quiet_NaN();\n    packet_helper<internal::packet_traits<Scalar>::HasExp,Packet> h;\n    h.store(data2, internal::pexp(h.load(data1))); \n    VERIFY(isNaN(data2[0]));\n  }\n\n  for (int i=0; i<size; ++i)\n  {\n    data1[i] = internal::random<Scalar>(0,1) * std::pow(Scalar(10), internal::random<Scalar>(-6,6));\n    data2[i] = internal::random<Scalar>(0,1) * std::pow(Scalar(10), internal::random<Scalar>(-6,6));\n  }\n  if(internal::random<float>(0,1)<0.1)\n    data1[internal::random<int>(0, PacketSize)] = 0;\n  CHECK_CWISE1_IF(internal::packet_traits<Scalar>::HasSqrt, std::sqrt, internal::psqrt);\n  CHECK_CWISE1_IF(internal::packet_traits<Scalar>::HasLog, std::log, internal::plog);\n  {\n    data1[0] = std::numeric_limits<Scalar>::quiet_NaN();\n    packet_helper<internal::packet_traits<Scalar>::HasLog,Packet> h;\n    h.store(data2, internal::plog(h.load(data1)));\n    VERIFY(isNaN(data2[0]));\n    data1[0] = -1.0f;\n    h.store(data2, internal::plog(h.load(data1)));\n    VERIFY(isNaN(data2[0]));\n#if !EIGEN_FAST_MATH\n    h.store(data2, internal::psqrt(h.load(data1)));\n    VERIFY(isNaN(data2[0]));\n    VERIFY(isNaN(data2[1]));\n#endif\n  }\n}\n\ntemplate<typename Scalar> void packetmath_notcomplex()\n{\n  using std::abs;\n  typedef typename internal::packet_traits<Scalar>::type Packet;\n  const int PacketSize = internal::packet_traits<Scalar>::size;\n\n  EIGEN_ALIGN16 Scalar data1[internal::packet_traits<Scalar>::size*4];\n  EIGEN_ALIGN16 Scalar data2[internal::packet_traits<Scalar>::size*4];\n  EIGEN_ALIGN16 Scalar ref[internal::packet_traits<Scalar>::size*4];\n  \n  Array<Scalar,Dynamic,1>::Map(data1, internal::packet_traits<Scalar>::size*4).setRandom();\n\n  ref[0] = data1[0];\n  for (int i=0; i<PacketSize; ++i)\n    ref[0] = (std::min)(ref[0],data1[i]);\n  VERIFY(internal::isApprox(ref[0], internal::predux_min(internal::pload<Packet>(data1))) && \"internal::predux_min\");\n\n  CHECK_CWISE2((std::min), internal::pmin);\n  CHECK_CWISE2((std::max), internal::pmax);\n  CHECK_CWISE1(abs, internal::pabs);\n\n  ref[0] = data1[0];\n  for (int i=0; i<PacketSize; ++i)\n    ref[0] = (std::max)(ref[0],data1[i]);\n  VERIFY(internal::isApprox(ref[0], internal::predux_max(internal::pload<Packet>(data1))) && \"internal::predux_max\");\n  \n  for (int i=0; i<PacketSize; ++i)\n    ref[i] = data1[0]+Scalar(i);\n  internal::pstore(data2, internal::plset(data1[0]));\n  VERIFY(areApprox(ref, data2, PacketSize) && \"internal::plset\");\n}\n\ntemplate<typename Scalar,bool ConjLhs,bool ConjRhs> void test_conj_helper(Scalar* data1, Scalar* data2, Scalar* ref, Scalar* pval)\n{\n  typedef typename internal::packet_traits<Scalar>::type Packet;\n  const int PacketSize = internal::packet_traits<Scalar>::size;\n  \n  internal::conj_if<ConjLhs> cj0;\n  internal::conj_if<ConjRhs> cj1;\n  internal::conj_helper<Scalar,Scalar,ConjLhs,ConjRhs> cj;\n  internal::conj_helper<Packet,Packet,ConjLhs,ConjRhs> pcj;\n  \n  for(int i=0;i<PacketSize;++i)\n  {\n    ref[i] = cj0(data1[i]) * cj1(data2[i]);\n    VERIFY(internal::isApprox(ref[i], cj.pmul(data1[i],data2[i])) && \"conj_helper pmul\");\n  }\n  internal::pstore(pval,pcj.pmul(internal::pload<Packet>(data1),internal::pload<Packet>(data2)));\n  VERIFY(areApprox(ref, pval, PacketSize) && \"conj_helper pmul\");\n  \n  for(int i=0;i<PacketSize;++i)\n  {\n    Scalar tmp = ref[i];\n    ref[i] += cj0(data1[i]) * cj1(data2[i]);\n    VERIFY(internal::isApprox(ref[i], cj.pmadd(data1[i],data2[i],tmp)) && \"conj_helper pmadd\");\n  }\n  internal::pstore(pval,pcj.pmadd(internal::pload<Packet>(data1),internal::pload<Packet>(data2),internal::pload<Packet>(pval)));\n  VERIFY(areApprox(ref, pval, PacketSize) && \"conj_helper pmadd\");\n}\n\ntemplate<typename Scalar> void packetmath_complex()\n{\n  typedef typename internal::packet_traits<Scalar>::type Packet;\n  const int PacketSize = internal::packet_traits<Scalar>::size;\n\n  const int size = PacketSize*4;\n  EIGEN_ALIGN16 Scalar data1[PacketSize*4];\n  EIGEN_ALIGN16 Scalar data2[PacketSize*4];\n  EIGEN_ALIGN16 Scalar ref[PacketSize*4];\n  EIGEN_ALIGN16 Scalar pval[PacketSize*4];\n\n  for (int i=0; i<size; ++i)\n  {\n    data1[i] = internal::random<Scalar>() * Scalar(1e2);\n    data2[i] = internal::random<Scalar>() * Scalar(1e2);\n  }\n  \n  test_conj_helper<Scalar,false,false> (data1,data2,ref,pval);\n  test_conj_helper<Scalar,false,true>  (data1,data2,ref,pval);\n  test_conj_helper<Scalar,true,false>  (data1,data2,ref,pval);\n  test_conj_helper<Scalar,true,true>   (data1,data2,ref,pval);\n  \n  {\n    for(int i=0;i<PacketSize;++i)\n      ref[i] = Scalar(std::imag(data1[i]),std::real(data1[i]));\n    internal::pstore(pval,internal::pcplxflip(internal::pload<Packet>(data1)));\n    VERIFY(areApprox(ref, pval, PacketSize) && \"pcplxflip\");\n  }\n  \n  \n}\n\nvoid test_packetmath()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( packetmath<float>() );\n    CALL_SUBTEST_2( packetmath<double>() );\n    CALL_SUBTEST_3( packetmath<int>() );\n    CALL_SUBTEST_1( packetmath<std::complex<float> >() );\n    CALL_SUBTEST_2( packetmath<std::complex<double> >() );\n\n    CALL_SUBTEST_1( packetmath_notcomplex<float>() );\n    CALL_SUBTEST_2( packetmath_notcomplex<double>() );\n    CALL_SUBTEST_3( packetmath_notcomplex<int>() );\n    \n    CALL_SUBTEST_1( packetmath_real<float>() );\n    CALL_SUBTEST_2( packetmath_real<double>() );\n\n    CALL_SUBTEST_1( packetmath_complex<std::complex<float> >() );\n    CALL_SUBTEST_2( packetmath_complex<std::complex<double> >() );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/pardiso_support.cpp",
    "content": "/* \n   Intel Copyright (C) ....\n*/\n\n#include \"sparse_solver.h\"\n#include <Eigen/PardisoSupport>\n\ntemplate<typename T> void test_pardiso_T()\n{\n  PardisoLLT < SparseMatrix<T, RowMajor>, Lower> pardiso_llt_lower;\n  PardisoLLT < SparseMatrix<T, RowMajor>, Upper> pardiso_llt_upper;\n  PardisoLDLT < SparseMatrix<T, RowMajor>, Lower> pardiso_ldlt_lower;\n  PardisoLDLT < SparseMatrix<T, RowMajor>, Upper> pardiso_ldlt_upper;\n  PardisoLU  < SparseMatrix<T, RowMajor> > pardiso_lu;\n\n  check_sparse_spd_solving(pardiso_llt_lower);\n  check_sparse_spd_solving(pardiso_llt_upper);\n  check_sparse_spd_solving(pardiso_ldlt_lower);\n  check_sparse_spd_solving(pardiso_ldlt_upper);\n  check_sparse_square_solving(pardiso_lu);\n}\n\nvoid test_pardiso_support()\n{\n  CALL_SUBTEST_1(test_pardiso_T<float>());\n  CALL_SUBTEST_2(test_pardiso_T<double>());\n  CALL_SUBTEST_3(test_pardiso_T< std::complex<float> >());\n  CALL_SUBTEST_4(test_pardiso_T< std::complex<double> >());\n}\n"
  },
  {
    "path": "libs/eigen/test/pastix_support.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2012 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n#include \"sparse_solver.h\"\n#include <Eigen/PaStiXSupport>\n#include <unsupported/Eigen/SparseExtra>\n\n\ntemplate<typename T> void test_pastix_T()\n{\n  PastixLLT< SparseMatrix<T, ColMajor>, Eigen::Lower > pastix_llt_lower;\n  PastixLDLT< SparseMatrix<T, ColMajor>, Eigen::Lower > pastix_ldlt_lower;\n  PastixLLT< SparseMatrix<T, ColMajor>, Eigen::Upper > pastix_llt_upper;\n  PastixLDLT< SparseMatrix<T, ColMajor>, Eigen::Upper > pastix_ldlt_upper;\n  PastixLU< SparseMatrix<T, ColMajor> > pastix_lu;\n\n  check_sparse_spd_solving(pastix_llt_lower);\n  check_sparse_spd_solving(pastix_ldlt_lower);\n  check_sparse_spd_solving(pastix_llt_upper);\n  check_sparse_spd_solving(pastix_ldlt_upper);\n  check_sparse_square_solving(pastix_lu);\n}\n\n// There is no support for selfadjoint matrices with PaStiX. \n// Complex symmetric matrices should pass though\ntemplate<typename T> void test_pastix_T_LU()\n{\n  PastixLU< SparseMatrix<T, ColMajor> > pastix_lu;\n  check_sparse_square_solving(pastix_lu);\n}\n\nvoid test_pastix_support()\n{\n  CALL_SUBTEST_1(test_pastix_T<float>());\n  CALL_SUBTEST_2(test_pastix_T<double>());\n  CALL_SUBTEST_3( (test_pastix_T_LU<std::complex<float> >()) );\n  CALL_SUBTEST_4(test_pastix_T_LU<std::complex<double> >());\n} \n"
  },
  {
    "path": "libs/eigen/test/permutationmatrices.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\nusing namespace std;\ntemplate<typename MatrixType> void permutationmatrices(const MatrixType& m)\n{\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n  enum { Rows = MatrixType::RowsAtCompileTime, Cols = MatrixType::ColsAtCompileTime,\n         Options = MatrixType::Options };\n  typedef PermutationMatrix<Rows> LeftPermutationType;\n  typedef Matrix<int, Rows, 1> LeftPermutationVectorType;\n  typedef Map<LeftPermutationType> MapLeftPerm;\n  typedef PermutationMatrix<Cols> RightPermutationType;\n  typedef Matrix<int, Cols, 1> RightPermutationVectorType;\n  typedef Map<RightPermutationType> MapRightPerm;\n\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  MatrixType m_original = MatrixType::Random(rows,cols);\n  LeftPermutationVectorType lv;\n  randomPermutationVector(lv, rows);\n  LeftPermutationType lp(lv);\n  RightPermutationVectorType rv;\n  randomPermutationVector(rv, cols);\n  RightPermutationType rp(rv);\n  MatrixType m_permuted = lp * m_original * rp;\n\n  for (int i=0; i<rows; i++)\n    for (int j=0; j<cols; j++)\n        VERIFY_IS_APPROX(m_permuted(lv(i),j), m_original(i,rv(j)));\n\n  Matrix<Scalar,Rows,Rows> lm(lp);\n  Matrix<Scalar,Cols,Cols> rm(rp);\n\n  VERIFY_IS_APPROX(m_permuted, lm*m_original*rm);\n\n  VERIFY_IS_APPROX(lp.inverse()*m_permuted*rp.inverse(), m_original);\n  VERIFY_IS_APPROX(lv.asPermutation().inverse()*m_permuted*rv.asPermutation().inverse(), m_original);\n  VERIFY_IS_APPROX(MapLeftPerm(lv.data(),lv.size()).inverse()*m_permuted*MapRightPerm(rv.data(),rv.size()).inverse(), m_original);\n  \n  VERIFY((lp*lp.inverse()).toDenseMatrix().isIdentity());\n  VERIFY((lv.asPermutation()*lv.asPermutation().inverse()).toDenseMatrix().isIdentity());\n  VERIFY((MapLeftPerm(lv.data(),lv.size())*MapLeftPerm(lv.data(),lv.size()).inverse()).toDenseMatrix().isIdentity());\n\n  LeftPermutationVectorType lv2;\n  randomPermutationVector(lv2, rows);\n  LeftPermutationType lp2(lv2);\n  Matrix<Scalar,Rows,Rows> lm2(lp2);\n  VERIFY_IS_APPROX((lp*lp2).toDenseMatrix().template cast<Scalar>(), lm*lm2);\n  VERIFY_IS_APPROX((lv.asPermutation()*lv2.asPermutation()).toDenseMatrix().template cast<Scalar>(), lm*lm2);\n  VERIFY_IS_APPROX((MapLeftPerm(lv.data(),lv.size())*MapLeftPerm(lv2.data(),lv2.size())).toDenseMatrix().template cast<Scalar>(), lm*lm2);\n\n  LeftPermutationType identityp;\n  identityp.setIdentity(rows);\n  VERIFY_IS_APPROX(m_original, identityp*m_original);\n\n  // check inplace permutations\n  m_permuted = m_original;\n  m_permuted = lp.inverse() * m_permuted;\n  VERIFY_IS_APPROX(m_permuted, lp.inverse()*m_original);\n\n  m_permuted = m_original;\n  m_permuted = m_permuted * rp.inverse();\n  VERIFY_IS_APPROX(m_permuted, m_original*rp.inverse());\n\n  m_permuted = m_original;\n  m_permuted = lp * m_permuted;\n  VERIFY_IS_APPROX(m_permuted, lp*m_original);\n\n  m_permuted = m_original;\n  m_permuted = m_permuted * rp;\n  VERIFY_IS_APPROX(m_permuted, m_original*rp);\n\n  if(rows>1 && cols>1)\n  {\n    lp2 = lp;\n    Index i = internal::random<Index>(0, rows-1);\n    Index j;\n    do j = internal::random<Index>(0, rows-1); while(j==i);\n    lp2.applyTranspositionOnTheLeft(i, j);\n    lm = lp;\n    lm.row(i).swap(lm.row(j));\n    VERIFY_IS_APPROX(lm, lp2.toDenseMatrix().template cast<Scalar>());\n\n    RightPermutationType rp2 = rp;\n    i = internal::random<Index>(0, cols-1);\n    do j = internal::random<Index>(0, cols-1); while(j==i);\n    rp2.applyTranspositionOnTheRight(i, j);\n    rm = rp;\n    rm.col(i).swap(rm.col(j));\n    VERIFY_IS_APPROX(rm, rp2.toDenseMatrix().template cast<Scalar>());\n  }  \n}\n\nvoid test_permutationmatrices()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( permutationmatrices(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( permutationmatrices(Matrix3f()) );\n    CALL_SUBTEST_3( permutationmatrices(Matrix<double,3,3,RowMajor>()) );\n    CALL_SUBTEST_4( permutationmatrices(Matrix4d()) );\n    CALL_SUBTEST_5( permutationmatrices(Matrix<double,40,60>()) );\n    CALL_SUBTEST_6( permutationmatrices(Matrix<double,Dynamic,Dynamic,RowMajor>(20, 30)) );\n    CALL_SUBTEST_7( permutationmatrices(MatrixXcf(15, 10)) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/prec_inverse_4x4.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <Eigen/LU>\n#include <algorithm>\n\ntemplate<typename MatrixType> void inverse_permutation_4x4()\n{\n  typedef typename MatrixType::Scalar Scalar;\n  Vector4i indices(0,1,2,3);\n  for(int i = 0; i < 24; ++i)\n  {\n    MatrixType m = PermutationMatrix<4>(indices);\n    MatrixType inv = m.inverse();\n    double error = double( (m*inv-MatrixType::Identity()).norm() / NumTraits<Scalar>::epsilon() );\n    EIGEN_DEBUG_VAR(error)\n    VERIFY(error == 0.0);\n    std::next_permutation(indices.data(),indices.data()+4);\n  }\n}\n\ntemplate<typename MatrixType> void inverse_general_4x4(int repeat)\n{\n  using std::abs;\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename MatrixType::RealScalar RealScalar;\n  double error_sum = 0., error_max = 0.;\n  for(int i = 0; i < repeat; ++i)\n  {\n    MatrixType m;\n    RealScalar absdet;\n    do {\n      m = MatrixType::Random();\n      absdet = abs(m.determinant());\n    } while(absdet < NumTraits<Scalar>::epsilon());\n    MatrixType inv = m.inverse();\n    double error = double( (m*inv-MatrixType::Identity()).norm() * absdet / NumTraits<Scalar>::epsilon() );\n    error_sum += error;\n    error_max = (std::max)(error_max, error);\n  }\n  std::cerr << \"inverse_general_4x4, Scalar = \" << type_name<Scalar>() << std::endl;\n  double error_avg = error_sum / repeat;\n  EIGEN_DEBUG_VAR(error_avg);\n  EIGEN_DEBUG_VAR(error_max);\n   // FIXME that 1.25 used to be a 1.0 until the NumTraits changes on 28 April 2010, what's going wrong??\n   // FIXME that 1.25 used to be 1.2 until we tested gcc 4.1 on 30 June 2010 and got 1.21.\n  VERIFY(error_avg < (NumTraits<Scalar>::IsComplex ? 8.0 : 1.25));\n  VERIFY(error_max < (NumTraits<Scalar>::IsComplex ? 64.0 : 20.0));\n}\n\nvoid test_prec_inverse_4x4()\n{\n  CALL_SUBTEST_1((inverse_permutation_4x4<Matrix4f>()));\n  CALL_SUBTEST_1(( inverse_general_4x4<Matrix4f>(200000 * g_repeat) ));\n\n  CALL_SUBTEST_2((inverse_permutation_4x4<Matrix<double,4,4,RowMajor> >()));\n  CALL_SUBTEST_2(( inverse_general_4x4<Matrix<double,4,4,RowMajor> >(200000 * g_repeat) ));\n\n  CALL_SUBTEST_3((inverse_permutation_4x4<Matrix4cf>()));\n  CALL_SUBTEST_3((inverse_general_4x4<Matrix4cf>(50000 * g_repeat)));\n}\n"
  },
  {
    "path": "libs/eigen/test/product.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <Eigen/QR>\n\ntemplate<typename Derived1, typename Derived2>\nbool areNotApprox(const MatrixBase<Derived1>& m1, const MatrixBase<Derived2>& m2, typename Derived1::RealScalar epsilon = NumTraits<typename Derived1::RealScalar>::dummy_precision())\n{\n  return !((m1-m2).cwiseAbs2().maxCoeff() < epsilon * epsilon\n                          * (std::max)(m1.cwiseAbs2().maxCoeff(), m2.cwiseAbs2().maxCoeff()));\n}\n\ntemplate<typename MatrixType> void product(const MatrixType& m)\n{\n  /* this test covers the following files:\n     Identity.h Product.h\n  */\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> RowVectorType;\n  typedef Matrix<Scalar, MatrixType::ColsAtCompileTime, 1> ColVectorType;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, MatrixType::RowsAtCompileTime> RowSquareMatrixType;\n  typedef Matrix<Scalar, MatrixType::ColsAtCompileTime, MatrixType::ColsAtCompileTime> ColSquareMatrixType;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, MatrixType::ColsAtCompileTime,\n                         MatrixType::Flags&RowMajorBit?ColMajor:RowMajor> OtherMajorMatrixType;\n\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  // this test relies a lot on Random.h, and there's not much more that we can do\n  // to test it, hence I consider that we will have tested Random.h\n  MatrixType m1 = MatrixType::Random(rows, cols),\n             m2 = MatrixType::Random(rows, cols),\n             m3(rows, cols);\n  RowSquareMatrixType\n             identity = RowSquareMatrixType::Identity(rows, rows),\n             square = RowSquareMatrixType::Random(rows, rows),\n             res = RowSquareMatrixType::Random(rows, rows);\n  ColSquareMatrixType\n             square2 = ColSquareMatrixType::Random(cols, cols),\n             res2 = ColSquareMatrixType::Random(cols, cols);\n  RowVectorType v1 = RowVectorType::Random(rows);\n  ColVectorType vc2 = ColVectorType::Random(cols), vcres(cols);\n  OtherMajorMatrixType tm1 = m1;\n\n  Scalar s1 = internal::random<Scalar>();\n\n  Index r  = internal::random<Index>(0, rows-1),\n        c  = internal::random<Index>(0, cols-1),\n        c2 = internal::random<Index>(0, cols-1);\n\n  // begin testing Product.h: only associativity for now\n  // (we use Transpose.h but this doesn't count as a test for it)\n  VERIFY_IS_APPROX((m1*m1.transpose())*m2,  m1*(m1.transpose()*m2));\n  m3 = m1;\n  m3 *= m1.transpose() * m2;\n  VERIFY_IS_APPROX(m3,                      m1 * (m1.transpose()*m2));\n  VERIFY_IS_APPROX(m3,                      m1 * (m1.transpose()*m2));\n\n  // continue testing Product.h: distributivity\n  VERIFY_IS_APPROX(square*(m1 + m2),        square*m1+square*m2);\n  VERIFY_IS_APPROX(square*(m1 - m2),        square*m1-square*m2);\n\n  // continue testing Product.h: compatibility with ScalarMultiple.h\n  VERIFY_IS_APPROX(s1*(square*m1),          (s1*square)*m1);\n  VERIFY_IS_APPROX(s1*(square*m1),          square*(m1*s1));\n\n  // test Product.h together with Identity.h\n  VERIFY_IS_APPROX(v1,                      identity*v1);\n  VERIFY_IS_APPROX(v1.transpose(),          v1.transpose() * identity);\n  // again, test operator() to check const-qualification\n  VERIFY_IS_APPROX(MatrixType::Identity(rows, cols)(r,c), static_cast<Scalar>(r==c));\n\n  if (rows!=cols)\n     VERIFY_RAISES_ASSERT(m3 = m1*m1);\n\n  // test the previous tests were not screwed up because operator* returns 0\n  // (we use the more accurate default epsilon)\n  if (!NumTraits<Scalar>::IsInteger && (std::min)(rows,cols)>1)\n  {\n    VERIFY(areNotApprox(m1.transpose()*m2,m2.transpose()*m1));\n  }\n\n  // test optimized operator+= path\n  res = square;\n  res.noalias() += m1 * m2.transpose();\n  VERIFY_IS_APPROX(res, square + m1 * m2.transpose());\n  if (!NumTraits<Scalar>::IsInteger && (std::min)(rows,cols)>1)\n  {\n    VERIFY(areNotApprox(res,square + m2 * m1.transpose()));\n  }\n  vcres = vc2;\n  vcres.noalias() += m1.transpose() * v1;\n  VERIFY_IS_APPROX(vcres, vc2 + m1.transpose() * v1);\n\n  // test optimized operator-= path\n  res = square;\n  res.noalias() -= m1 * m2.transpose();\n  VERIFY_IS_APPROX(res, square - (m1 * m2.transpose()));\n  if (!NumTraits<Scalar>::IsInteger && (std::min)(rows,cols)>1)\n  {\n    VERIFY(areNotApprox(res,square - m2 * m1.transpose()));\n  }\n  vcres = vc2;\n  vcres.noalias() -= m1.transpose() * v1;\n  VERIFY_IS_APPROX(vcres, vc2 - m1.transpose() * v1);\n\n  tm1 = m1;\n  VERIFY_IS_APPROX(tm1.transpose() * v1, m1.transpose() * v1);\n  VERIFY_IS_APPROX(v1.transpose() * tm1, v1.transpose() * m1);\n\n  // test submatrix and matrix/vector product\n  for (int i=0; i<rows; ++i)\n    res.row(i) = m1.row(i) * m2.transpose();\n  VERIFY_IS_APPROX(res, m1 * m2.transpose());\n  // the other way round:\n  for (int i=0; i<rows; ++i)\n    res.col(i) = m1 * m2.transpose().col(i);\n  VERIFY_IS_APPROX(res, m1 * m2.transpose());\n\n  res2 = square2;\n  res2.noalias() += m1.transpose() * m2;\n  VERIFY_IS_APPROX(res2, square2 + m1.transpose() * m2);\n  if (!NumTraits<Scalar>::IsInteger && (std::min)(rows,cols)>1)\n  {\n    VERIFY(areNotApprox(res2,square2 + m2.transpose() * m1));\n  }\n\n  VERIFY_IS_APPROX(res.col(r).noalias() = square.adjoint() * square.col(r), (square.adjoint() * square.col(r)).eval());\n  VERIFY_IS_APPROX(res.col(r).noalias() = square * square.col(r), (square * square.col(r)).eval());\n\n  // vector at runtime (see bug 1166)\n  {\n    RowSquareMatrixType ref(square);\n    ColSquareMatrixType ref2(square2);\n    ref = res = square;\n    VERIFY_IS_APPROX(res.block(0,0,1,rows).noalias() = m1.col(0).transpose() * square.transpose(),            (ref.row(0) = m1.col(0).transpose() * square.transpose()));\n    VERIFY_IS_APPROX(res.block(0,0,1,rows).noalias() = m1.block(0,0,rows,1).transpose() * square.transpose(), (ref.row(0) = m1.col(0).transpose() * square.transpose()));\n    VERIFY_IS_APPROX(res.block(0,0,1,rows).noalias() = m1.col(0).transpose() * square,                        (ref.row(0) = m1.col(0).transpose() * square));\n    VERIFY_IS_APPROX(res.block(0,0,1,rows).noalias() = m1.block(0,0,rows,1).transpose() * square,             (ref.row(0) = m1.col(0).transpose() * square));\n    ref2 = res2 = square2;\n    VERIFY_IS_APPROX(res2.block(0,0,1,cols).noalias() = m1.row(0) * square2.transpose(),                      (ref2.row(0) = m1.row(0) * square2.transpose()));\n    VERIFY_IS_APPROX(res2.block(0,0,1,cols).noalias() = m1.block(0,0,1,cols) * square2.transpose(),           (ref2.row(0) = m1.row(0) * square2.transpose()));\n    VERIFY_IS_APPROX(res2.block(0,0,1,cols).noalias() = m1.row(0) * square2,                                  (ref2.row(0) = m1.row(0) * square2));\n    VERIFY_IS_APPROX(res2.block(0,0,1,cols).noalias() = m1.block(0,0,1,cols) * square2,                       (ref2.row(0) = m1.row(0) * square2));\n  }\n\n  // inner product\n  {\n    Scalar x = square2.row(c) * square2.col(c2);\n    VERIFY_IS_APPROX(x, square2.row(c).transpose().cwiseProduct(square2.col(c2)).sum());\n  }\n  \n  // outer product\n  VERIFY_IS_APPROX(m1.col(c) * m1.row(r), m1.block(0,c,rows,1) * m1.block(r,0,1,cols));\n  VERIFY_IS_APPROX(m1.row(r).transpose() * m1.col(c).transpose(), m1.block(r,0,1,cols).transpose() * m1.block(0,c,rows,1).transpose());\n  VERIFY_IS_APPROX(m1.block(0,c,rows,1) * m1.row(r), m1.block(0,c,rows,1) * m1.block(r,0,1,cols));\n  VERIFY_IS_APPROX(m1.col(c) * m1.block(r,0,1,cols), m1.block(0,c,rows,1) * m1.block(r,0,1,cols));\n  VERIFY_IS_APPROX(m1.leftCols(1) * m1.row(r), m1.block(0,0,rows,1) * m1.block(r,0,1,cols));\n  VERIFY_IS_APPROX(m1.col(c) * m1.topRows(1), m1.block(0,c,rows,1) * m1.block(0,0,1,cols));\n\n  // Aliasing\n  {\n    ColVectorType x(cols); x.setRandom();\n    ColVectorType z(x);\n    ColVectorType y(cols); y.setZero();\n    ColSquareMatrixType A(cols,cols); A.setRandom();\n    // CwiseBinaryOp\n    VERIFY_IS_APPROX(x = y + A*x, A*z);\n    x = z;\n    // CwiseUnaryOp\n    VERIFY_IS_APPROX(x = Scalar(1.)*(A*x), A*z);\n  }\n\n  // regression for blas_trais\n  {\n    VERIFY_IS_APPROX(square * (square*square).transpose(), square * square.transpose() * square.transpose());\n    VERIFY_IS_APPROX(square * (-(square*square)), -square * square * square);\n    VERIFY_IS_APPROX(square * (s1*(square*square)), s1 * square * square * square);\n    VERIFY_IS_APPROX(square * (square*square).conjugate(), square * square.conjugate() * square.conjugate());\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/product_extra.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\ntemplate<typename MatrixType> void product_extra(const MatrixType& m)\n{\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n  typedef Matrix<Scalar, 1, Dynamic> RowVectorType;\n  typedef Matrix<Scalar, Dynamic, 1> ColVectorType;\n  typedef Matrix<Scalar, Dynamic, Dynamic,\n                         MatrixType::Flags&RowMajorBit> OtherMajorMatrixType;\n\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  MatrixType m1 = MatrixType::Random(rows, cols),\n             m2 = MatrixType::Random(rows, cols),\n             m3(rows, cols),\n             mzero = MatrixType::Zero(rows, cols),\n             identity = MatrixType::Identity(rows, rows),\n             square = MatrixType::Random(rows, rows),\n             res = MatrixType::Random(rows, rows),\n             square2 = MatrixType::Random(cols, cols),\n             res2 = MatrixType::Random(cols, cols);\n  RowVectorType v1 = RowVectorType::Random(rows), vrres(rows);\n  ColVectorType vc2 = ColVectorType::Random(cols), vcres(cols);\n  OtherMajorMatrixType tm1 = m1;\n\n  Scalar s1 = internal::random<Scalar>(),\n         s2 = internal::random<Scalar>(),\n         s3 = internal::random<Scalar>();\n\n  VERIFY_IS_APPROX(m3.noalias() = m1 * m2.adjoint(),                 m1 * m2.adjoint().eval());\n  VERIFY_IS_APPROX(m3.noalias() = m1.adjoint() * square.adjoint(),   m1.adjoint().eval() * square.adjoint().eval());\n  VERIFY_IS_APPROX(m3.noalias() = m1.adjoint() * m2,                 m1.adjoint().eval() * m2);\n  VERIFY_IS_APPROX(m3.noalias() = (s1 * m1.adjoint()) * m2,          (s1 * m1.adjoint()).eval() * m2);\n  VERIFY_IS_APPROX(m3.noalias() = ((s1 * m1).adjoint()) * m2,        (numext::conj(s1) * m1.adjoint()).eval() * m2);\n  VERIFY_IS_APPROX(m3.noalias() = (- m1.adjoint() * s1) * (s3 * m2), (- m1.adjoint()  * s1).eval() * (s3 * m2).eval());\n  VERIFY_IS_APPROX(m3.noalias() = (s2 * m1.adjoint() * s1) * m2,     (s2 * m1.adjoint()  * s1).eval() * m2);\n  VERIFY_IS_APPROX(m3.noalias() = (-m1*s2) * s1*m2.adjoint(),        (-m1*s2).eval() * (s1*m2.adjoint()).eval());\n\n  // a very tricky case where a scale factor has to be automatically conjugated:\n  VERIFY_IS_APPROX( m1.adjoint() * (s1*m2).conjugate(), (m1.adjoint()).eval() * ((s1*m2).conjugate()).eval());\n\n\n  // test all possible conjugate combinations for the four matrix-vector product cases:\n\n  VERIFY_IS_APPROX((-m1.conjugate() * s2) * (s1 * vc2),\n                   (-m1.conjugate()*s2).eval() * (s1 * vc2).eval());\n  VERIFY_IS_APPROX((-m1 * s2) * (s1 * vc2.conjugate()),\n                   (-m1*s2).eval() * (s1 * vc2.conjugate()).eval());\n  VERIFY_IS_APPROX((-m1.conjugate() * s2) * (s1 * vc2.conjugate()),\n                   (-m1.conjugate()*s2).eval() * (s1 * vc2.conjugate()).eval());\n\n  VERIFY_IS_APPROX((s1 * vc2.transpose()) * (-m1.adjoint() * s2),\n                   (s1 * vc2.transpose()).eval() * (-m1.adjoint()*s2).eval());\n  VERIFY_IS_APPROX((s1 * vc2.adjoint()) * (-m1.transpose() * s2),\n                   (s1 * vc2.adjoint()).eval() * (-m1.transpose()*s2).eval());\n  VERIFY_IS_APPROX((s1 * vc2.adjoint()) * (-m1.adjoint() * s2),\n                   (s1 * vc2.adjoint()).eval() * (-m1.adjoint()*s2).eval());\n\n  VERIFY_IS_APPROX((-m1.adjoint() * s2) * (s1 * v1.transpose()),\n                   (-m1.adjoint()*s2).eval() * (s1 * v1.transpose()).eval());\n  VERIFY_IS_APPROX((-m1.transpose() * s2) * (s1 * v1.adjoint()),\n                   (-m1.transpose()*s2).eval() * (s1 * v1.adjoint()).eval());\n  VERIFY_IS_APPROX((-m1.adjoint() * s2) * (s1 * v1.adjoint()),\n                   (-m1.adjoint()*s2).eval() * (s1 * v1.adjoint()).eval());\n\n  VERIFY_IS_APPROX((s1 * v1) * (-m1.conjugate() * s2),\n                   (s1 * v1).eval() * (-m1.conjugate()*s2).eval());\n  VERIFY_IS_APPROX((s1 * v1.conjugate()) * (-m1 * s2),\n                   (s1 * v1.conjugate()).eval() * (-m1*s2).eval());\n  VERIFY_IS_APPROX((s1 * v1.conjugate()) * (-m1.conjugate() * s2),\n                   (s1 * v1.conjugate()).eval() * (-m1.conjugate()*s2).eval());\n\n  VERIFY_IS_APPROX((-m1.adjoint() * s2) * (s1 * v1.adjoint()),\n                   (-m1.adjoint()*s2).eval() * (s1 * v1.adjoint()).eval());\n\n  // test the vector-matrix product with non aligned starts\n  Index i = internal::random<Index>(0,m1.rows()-2);\n  Index j = internal::random<Index>(0,m1.cols()-2);\n  Index r = internal::random<Index>(1,m1.rows()-i);\n  Index c = internal::random<Index>(1,m1.cols()-j);\n  Index i2 = internal::random<Index>(0,m1.rows()-1);\n  Index j2 = internal::random<Index>(0,m1.cols()-1);\n\n  VERIFY_IS_APPROX(m1.col(j2).adjoint() * m1.block(0,j,m1.rows(),c), m1.col(j2).adjoint().eval() * m1.block(0,j,m1.rows(),c).eval());\n  VERIFY_IS_APPROX(m1.block(i,0,r,m1.cols()) * m1.row(i2).adjoint(), m1.block(i,0,r,m1.cols()).eval() * m1.row(i2).adjoint().eval());\n  \n  // regression test\n  MatrixType tmp = m1 * m1.adjoint() * s1;\n  VERIFY_IS_APPROX(tmp, m1 * m1.adjoint() * s1);\n}\n\n// Regression test for bug reported at http://forum.kde.org/viewtopic.php?f=74&t=96947\nvoid mat_mat_scalar_scalar_product()\n{\n  Eigen::Matrix2Xd dNdxy(2, 3);\n  dNdxy << -0.5, 0.5, 0,\n           -0.3, 0, 0.3;\n  double det = 6.0, wt = 0.5;\n  VERIFY_IS_APPROX(dNdxy.transpose()*dNdxy*det*wt, det*wt*dNdxy.transpose()*dNdxy);\n}\n\ntemplate <typename MatrixType> \nvoid zero_sized_objects(const MatrixType& m)\n{\n  typedef typename MatrixType::Scalar Scalar;\n  const int PacketSize  = internal::packet_traits<Scalar>::size;\n  const int PacketSize1 = PacketSize>1 ?  PacketSize-1 : 1;\n  DenseIndex rows = m.rows();\n  DenseIndex cols = m.cols();\n  \n  {\n    MatrixType res, a(rows,0), b(0,cols);\n    VERIFY_IS_APPROX( (res=a*b), MatrixType::Zero(rows,cols) );\n    VERIFY_IS_APPROX( (res=a*a.transpose()), MatrixType::Zero(rows,rows) );\n    VERIFY_IS_APPROX( (res=b.transpose()*b), MatrixType::Zero(cols,cols) );\n    VERIFY_IS_APPROX( (res=b.transpose()*a.transpose()), MatrixType::Zero(cols,rows) );\n  }\n  \n  {\n    MatrixType res, a(rows,cols), b(cols,0);\n    res = a*b;\n    VERIFY(res.rows()==rows && res.cols()==0);\n    b.resize(0,rows);\n    res = b*a;\n    VERIFY(res.rows()==0 && res.cols()==cols);\n  }\n  \n  {\n    Matrix<Scalar,PacketSize,0> a;\n    Matrix<Scalar,0,1> b;\n    Matrix<Scalar,PacketSize,1> res;\n    VERIFY_IS_APPROX( (res=a*b), MatrixType::Zero(PacketSize,1) );\n    VERIFY_IS_APPROX( (res=a.lazyProduct(b)), MatrixType::Zero(PacketSize,1) );\n  }\n  \n  {\n    Matrix<Scalar,PacketSize1,0> a;\n    Matrix<Scalar,0,1> b;\n    Matrix<Scalar,PacketSize1,1> res;\n    VERIFY_IS_APPROX( (res=a*b), MatrixType::Zero(PacketSize1,1) );\n    VERIFY_IS_APPROX( (res=a.lazyProduct(b)), MatrixType::Zero(PacketSize1,1) );\n  }\n  \n  {\n    Matrix<Scalar,PacketSize,Dynamic> a(PacketSize,0);\n    Matrix<Scalar,Dynamic,1> b(0,1);\n    Matrix<Scalar,PacketSize,1> res;\n    VERIFY_IS_APPROX( (res=a*b), MatrixType::Zero(PacketSize,1) );\n    VERIFY_IS_APPROX( (res=a.lazyProduct(b)), MatrixType::Zero(PacketSize,1) );\n  }\n  \n  {\n    Matrix<Scalar,PacketSize1,Dynamic> a(PacketSize1,0);\n    Matrix<Scalar,Dynamic,1> b(0,1);\n    Matrix<Scalar,PacketSize1,1> res;\n    VERIFY_IS_APPROX( (res=a*b), MatrixType::Zero(PacketSize1,1) );\n    VERIFY_IS_APPROX( (res=a.lazyProduct(b)), MatrixType::Zero(PacketSize1,1) );\n  }\n}\n\nvoid bug_127()\n{\n  // Bug 127\n  //\n  // a product of the form lhs*rhs with\n  //\n  // lhs:\n  // rows = 1, cols = 4\n  // RowsAtCompileTime = 1, ColsAtCompileTime = -1\n  // MaxRowsAtCompileTime = 1, MaxColsAtCompileTime = 5\n  //\n  // rhs:\n  // rows = 4, cols = 0\n  // RowsAtCompileTime = -1, ColsAtCompileTime = -1\n  // MaxRowsAtCompileTime = 5, MaxColsAtCompileTime = 1\n  //\n  // was failing on a runtime assertion, because it had been mis-compiled as a dot product because Product.h was using the\n  // max-sizes to detect size 1 indicating vectors, and that didn't account for 0-sized object with max-size 1.\n\n  Matrix<float,1,Dynamic,RowMajor,1,5> a(1,4);\n  Matrix<float,Dynamic,Dynamic,ColMajor,5,1> b(4,0);\n  a*b;\n}\n\nvoid unaligned_objects()\n{\n  // Regression test for the bug reported here:\n  // http://forum.kde.org/viewtopic.php?f=74&t=107541\n  // Recall the matrix*vector kernel avoid unaligned loads by loading two packets and then reassemble then.\n  // There was a mistake in the computation of the valid range for fully unaligned objects: in some rare cases,\n  // memory was read outside the allocated matrix memory. Though the values were not used, this might raise segfault.\n  for(int m=450;m<460;++m)\n  {\n    for(int n=8;n<12;++n)\n    {\n      MatrixXf M(m, n);\n      VectorXf v1(n), r1(500);\n      RowVectorXf v2(m), r2(16);\n\n      M.setRandom();\n      v1.setRandom();\n      v2.setRandom();\n      for(int o=0; o<4; ++o)\n      {\n        r1.segment(o,m).noalias() = M * v1;\n        VERIFY_IS_APPROX(r1.segment(o,m), M * MatrixXf(v1));\n        r2.segment(o,n).noalias() = v2 * M;\n        VERIFY_IS_APPROX(r2.segment(o,n), MatrixXf(v2) * M);\n      }\n    }\n  }\n}\n\nvoid test_product_extra()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( product_extra(MatrixXf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n    CALL_SUBTEST_2( product_extra(MatrixXd(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n    CALL_SUBTEST_2( mat_mat_scalar_scalar_product() );\n    CALL_SUBTEST_3( product_extra(MatrixXcf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE/2), internal::random<int>(1,EIGEN_TEST_MAX_SIZE/2))) );\n    CALL_SUBTEST_4( product_extra(MatrixXcd(internal::random<int>(1,EIGEN_TEST_MAX_SIZE/2), internal::random<int>(1,EIGEN_TEST_MAX_SIZE/2))) );\n    CALL_SUBTEST_1( zero_sized_objects(MatrixXf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n  }\n  CALL_SUBTEST_5( bug_127() );\n  CALL_SUBTEST_6( unaligned_objects() );\n}\n"
  },
  {
    "path": "libs/eigen/test/product_large.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"product.h\"\n\ntemplate<typename T>\nvoid test_aliasing()\n{\n  int rows = internal::random<int>(1,12);\n  int cols = internal::random<int>(1,12);\n  typedef Matrix<T,Dynamic,Dynamic> MatrixType;\n  typedef Matrix<T,Dynamic,1> VectorType;\n  VectorType x(cols); x.setRandom();\n  VectorType z(x);\n  VectorType y(rows); y.setZero();\n  MatrixType A(rows,cols); A.setRandom();\n  // CwiseBinaryOp\n  VERIFY_IS_APPROX(x = y + A*x, A*z);\n  x = z;\n  // CwiseUnaryOp\n  VERIFY_IS_APPROX(x = T(1.)*(A*x), A*z);\n  x = z;\n  VERIFY_IS_APPROX(x = y+(-(A*x)), -A*z);\n  x = z;\n}\n\nvoid test_product_large()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( product(MatrixXf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n    CALL_SUBTEST_2( product(MatrixXd(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n    CALL_SUBTEST_3( product(MatrixXi(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n    CALL_SUBTEST_4( product(MatrixXcf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE/2), internal::random<int>(1,EIGEN_TEST_MAX_SIZE/2))) );\n    CALL_SUBTEST_5( product(Matrix<float,Dynamic,Dynamic,RowMajor>(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n\n    CALL_SUBTEST_1( test_aliasing<float>() );\n  }\n\n#if defined EIGEN_TEST_PART_6\n  {\n    // test a specific issue in DiagonalProduct\n    int N = 1000000;\n    VectorXf v = VectorXf::Ones(N);\n    MatrixXf m = MatrixXf::Ones(N,3);\n    m = (v+v).asDiagonal() * m;\n    VERIFY_IS_APPROX(m, MatrixXf::Constant(N,3,2));\n  }\n\n  {\n    // test deferred resizing in Matrix::operator=\n    MatrixXf a = MatrixXf::Random(10,4), b = MatrixXf::Random(4,10), c = a;\n    VERIFY_IS_APPROX((a = a * b), (c * b).eval());\n  }\n\n  {\n    // check the functions to setup blocking sizes compile and do not segfault\n    // FIXME check they do what they are supposed to do !!\n    std::ptrdiff_t l1 = internal::random<int>(10000,20000);\n    std::ptrdiff_t l2 = internal::random<int>(1000000,2000000);\n    setCpuCacheSizes(l1,l2);\n    VERIFY(l1==l1CacheSize());\n    VERIFY(l2==l2CacheSize());\n    std::ptrdiff_t k1 = internal::random<int>(10,100)*16;\n    std::ptrdiff_t m1 = internal::random<int>(10,100)*16;\n    std::ptrdiff_t n1 = internal::random<int>(10,100)*16;\n    // only makes sure it compiles fine\n    internal::computeProductBlockingSizes<float,float>(k1,m1,n1);\n  }\n\n  {\n    // test regression in row-vector by matrix (bad Map type)\n    MatrixXf mat1(10,32); mat1.setRandom();\n    MatrixXf mat2(32,32); mat2.setRandom();\n    MatrixXf r1 = mat1.row(2)*mat2.transpose();\n    VERIFY_IS_APPROX(r1, (mat1.row(2)*mat2.transpose()).eval());\n\n    MatrixXf r2 = mat1.row(2)*mat2;\n    VERIFY_IS_APPROX(r2, (mat1.row(2)*mat2).eval());\n  }\n#endif\n}\n"
  },
  {
    "path": "libs/eigen/test/product_mmtr.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\n#define CHECK_MMTR(DEST, TRI, OP) {                   \\\n    ref2 = ref1 = DEST;                               \\\n    DEST.template triangularView<TRI>() OP;           \\\n    ref1 OP;                                          \\\n    ref2.template triangularView<TRI>() = ref1;       \\\n    VERIFY_IS_APPROX(DEST,ref2);                      \\\n  }\n\ntemplate<typename Scalar> void mmtr(int size)\n{\n  typedef Matrix<Scalar,Dynamic,Dynamic,ColMajor> MatrixColMaj;\n  typedef Matrix<Scalar,Dynamic,Dynamic,RowMajor> MatrixRowMaj;\n\n  DenseIndex othersize = internal::random<DenseIndex>(1,200);\n  \n  MatrixColMaj matc = MatrixColMaj::Zero(size, size);\n  MatrixRowMaj matr = MatrixRowMaj::Zero(size, size);\n  MatrixColMaj ref1(size, size), ref2(size, size);\n  \n  MatrixColMaj soc(size,othersize); soc.setRandom();\n  MatrixColMaj osc(othersize,size); osc.setRandom();\n  MatrixRowMaj sor(size,othersize); sor.setRandom();\n  MatrixRowMaj osr(othersize,size); osr.setRandom();\n  \n  Scalar s = internal::random<Scalar>();\n  \n  CHECK_MMTR(matc, Lower, = s*soc*sor.adjoint());\n  CHECK_MMTR(matc, Upper, = s*(soc*soc.adjoint()));\n  CHECK_MMTR(matr, Lower, = s*soc*soc.adjoint());\n  CHECK_MMTR(matr, Upper, = soc*(s*sor.adjoint()));\n  \n  CHECK_MMTR(matc, Lower, += s*soc*soc.adjoint());\n  CHECK_MMTR(matc, Upper, += s*(soc*sor.transpose()));\n  CHECK_MMTR(matr, Lower, += s*sor*soc.adjoint());\n  CHECK_MMTR(matr, Upper, += soc*(s*soc.adjoint()));\n  \n  CHECK_MMTR(matc, Lower, -= s*soc*soc.adjoint());\n  CHECK_MMTR(matc, Upper, -= s*(osc.transpose()*osc.conjugate()));\n  CHECK_MMTR(matr, Lower, -= s*soc*soc.adjoint());\n  CHECK_MMTR(matr, Upper, -= soc*(s*soc.adjoint()));\n}\n\nvoid test_product_mmtr()\n{\n  for(int i = 0; i < g_repeat ; i++)\n  {\n    CALL_SUBTEST_1((mmtr<float>(internal::random<int>(1,EIGEN_TEST_MAX_SIZE))));\n    CALL_SUBTEST_2((mmtr<double>(internal::random<int>(1,EIGEN_TEST_MAX_SIZE))));\n    CALL_SUBTEST_3((mmtr<std::complex<float> >(internal::random<int>(1,EIGEN_TEST_MAX_SIZE/2))));\n    CALL_SUBTEST_4((mmtr<std::complex<double> >(internal::random<int>(1,EIGEN_TEST_MAX_SIZE/2))));\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/product_notemporary.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\nstatic int nb_temporaries;\n\ninline void on_temporary_creation(int size) {\n  // here's a great place to set a breakpoint when debugging failures in this test!\n  if(size!=0) nb_temporaries++;\n}\n  \n\n#define EIGEN_DENSE_STORAGE_CTOR_PLUGIN { on_temporary_creation(size); }\n\n#include \"main.h\"\n\n#define VERIFY_EVALUATION_COUNT(XPR,N) {\\\n    nb_temporaries = 0; \\\n    XPR; \\\n    if(nb_temporaries!=N) std::cerr << \"nb_temporaries == \" << nb_temporaries << \"\\n\"; \\\n    VERIFY( (#XPR) && nb_temporaries==N ); \\\n  }\n\ntemplate<typename MatrixType> void product_notemporary(const MatrixType& m)\n{\n  /* This test checks the number of temporaries created\n   * during the evaluation of a complex expression */\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename MatrixType::RealScalar RealScalar;\n  typedef Matrix<Scalar, 1, Dynamic> RowVectorType;\n  typedef Matrix<Scalar, Dynamic, 1> ColVectorType;\n  typedef Matrix<Scalar, Dynamic, Dynamic, ColMajor> ColMajorMatrixType;\n  typedef Matrix<Scalar, Dynamic, Dynamic, RowMajor> RowMajorMatrixType;\n\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  ColMajorMatrixType m1 = MatrixType::Random(rows, cols),\n                     m2 = MatrixType::Random(rows, cols),\n                     m3(rows, cols);\n  RowVectorType rv1 = RowVectorType::Random(rows), rvres(rows);\n  ColVectorType cv1 = ColVectorType::Random(cols), cvres(cols);\n  RowMajorMatrixType rm3(rows, cols);\n\n  Scalar s1 = internal::random<Scalar>(),\n         s2 = internal::random<Scalar>(),\n         s3 = internal::random<Scalar>();\n\n  Index c0 = internal::random<Index>(4,cols-8),\n        c1 = internal::random<Index>(8,cols-c0),\n        r0 = internal::random<Index>(4,cols-8),\n        r1 = internal::random<Index>(8,rows-r0);\n\n  VERIFY_EVALUATION_COUNT( m3 = (m1 * m2.adjoint()), 1);\n  VERIFY_EVALUATION_COUNT( m3 = (m1 * m2.adjoint()).transpose(), 1);\n  VERIFY_EVALUATION_COUNT( m3.noalias() = m1 * m2.adjoint(), 0);\n\n  VERIFY_EVALUATION_COUNT( m3 = s1 * (m1 * m2.transpose()), 1);\n  VERIFY_EVALUATION_COUNT( m3 = m3 + s1 * (m1 * m2.transpose()), 1);\n  VERIFY_EVALUATION_COUNT( m3.noalias() = s1 * (m1 * m2.transpose()), 0);\n\n  VERIFY_EVALUATION_COUNT( m3 = m3 + (m1 * m2.adjoint()), 1);\n  VERIFY_EVALUATION_COUNT( m3 = m3 + (m1 * m2.adjoint()).transpose(), 1);\n  VERIFY_EVALUATION_COUNT( m3.noalias() = m3 + m1 * m2.transpose(), 1);   // 0 in 3.3\n  VERIFY_EVALUATION_COUNT( m3.noalias() += m3 + m1 * m2.transpose(), 1);  // 0 in 3.3\n  VERIFY_EVALUATION_COUNT( m3.noalias() -= m3 + m1 * m2.transpose(), 1);  // 0 in 3.3\n\n  VERIFY_EVALUATION_COUNT( m3.noalias() = s1 * m1 * s2 * m2.adjoint(), 0);\n  VERIFY_EVALUATION_COUNT( m3.noalias() = s1 * m1 * s2 * (m1*s3+m2*s2).adjoint(), 1);\n  VERIFY_EVALUATION_COUNT( m3.noalias() = (s1 * m1).adjoint() * s2 * m2, 0);\n  VERIFY_EVALUATION_COUNT( m3.noalias() += s1 * (-m1*s3).adjoint() * (s2 * m2 * s3), 0);\n  VERIFY_EVALUATION_COUNT( m3.noalias() -= s1 * (m1.transpose() * m2), 0);\n\n  VERIFY_EVALUATION_COUNT(( m3.block(r0,r0,r1,r1).noalias() += -m1.block(r0,c0,r1,c1) * (s2*m2.block(r0,c0,r1,c1)).adjoint() ), 0);\n  VERIFY_EVALUATION_COUNT(( m3.block(r0,r0,r1,r1).noalias() -= s1 * m1.block(r0,c0,r1,c1) * m2.block(c0,r0,c1,r1) ), 0);\n\n  // NOTE this is because the Block expression is not handled yet by our expression analyser\n  VERIFY_EVALUATION_COUNT(( m3.block(r0,r0,r1,r1).noalias() = s1 * m1.block(r0,c0,r1,c1) * (s1*m2).block(c0,r0,c1,r1) ), 1);\n\n  VERIFY_EVALUATION_COUNT( m3.noalias() -= (s1 * m1).template triangularView<Lower>() * m2, 0);\n  VERIFY_EVALUATION_COUNT( rm3.noalias() = (s1 * m1.adjoint()).template triangularView<Upper>() * (m2+m2), 1);\n  VERIFY_EVALUATION_COUNT( rm3.noalias() = (s1 * m1.adjoint()).template triangularView<UnitUpper>() * m2.adjoint(), 0);\n  \n  VERIFY_EVALUATION_COUNT( m3.template triangularView<Upper>() = (m1 * m2.adjoint()), 0);\n  VERIFY_EVALUATION_COUNT( m3.template triangularView<Upper>() -= (m1 * m2.adjoint()), 0);\n\n  // NOTE this is because the blas_traits require innerstride==1 to avoid a temporary, but that doesn't seem to be actually needed for the triangular products\n  VERIFY_EVALUATION_COUNT( rm3.col(c0).noalias() = (s1 * m1.adjoint()).template triangularView<UnitUpper>() * (s2*m2.row(c0)).adjoint(), 1);\n\n  VERIFY_EVALUATION_COUNT( m1.template triangularView<Lower>().solveInPlace(m3), 0);\n  VERIFY_EVALUATION_COUNT( m1.adjoint().template triangularView<Lower>().solveInPlace(m3.transpose()), 0);\n\n  VERIFY_EVALUATION_COUNT( m3.noalias() -= (s1 * m1).adjoint().template selfadjointView<Lower>() * (-m2*s3).adjoint(), 0);\n  VERIFY_EVALUATION_COUNT( m3.noalias() = s2 * m2.adjoint() * (s1 * m1.adjoint()).template selfadjointView<Upper>(), 0);\n  VERIFY_EVALUATION_COUNT( rm3.noalias() = (s1 * m1.adjoint()).template selfadjointView<Lower>() * m2.adjoint(), 0);\n\n  // NOTE this is because the blas_traits require innerstride==1 to avoid a temporary, but that doesn't seem to be actually needed for the triangular products\n  VERIFY_EVALUATION_COUNT( m3.col(c0).noalias() = (s1 * m1).adjoint().template selfadjointView<Lower>() * (-m2.row(c0)*s3).adjoint(), 1);\n  VERIFY_EVALUATION_COUNT( m3.col(c0).noalias() -= (s1 * m1).adjoint().template selfadjointView<Upper>() * (-m2.row(c0)*s3).adjoint(), 1);\n\n  VERIFY_EVALUATION_COUNT( m3.block(r0,c0,r1,c1).noalias() += m1.block(r0,r0,r1,r1).template selfadjointView<Upper>() * (s1*m2.block(r0,c0,r1,c1)), 0);\n  VERIFY_EVALUATION_COUNT( m3.block(r0,c0,r1,c1).noalias() = m1.block(r0,r0,r1,r1).template selfadjointView<Upper>() * m2.block(r0,c0,r1,c1), 0);\n\n  VERIFY_EVALUATION_COUNT( m3.template selfadjointView<Lower>().rankUpdate(m2.adjoint()), 0);\n\n  // Here we will get 1 temporary for each resize operation of the lhs operator; resize(r1,c1) would lead to zero temporaries\n  m3.resize(1,1);\n  VERIFY_EVALUATION_COUNT( m3.noalias() = m1.block(r0,r0,r1,r1).template selfadjointView<Lower>() * m2.block(r0,c0,r1,c1), 1);\n  m3.resize(1,1);\n  VERIFY_EVALUATION_COUNT( m3.noalias() = m1.block(r0,r0,r1,r1).template triangularView<UnitUpper>()  * m2.block(r0,c0,r1,c1), 1);\n\n  // Zero temporaries for lazy products ...\n  VERIFY_EVALUATION_COUNT( Scalar tmp = 0; tmp += Scalar(RealScalar(1)) /  (m3.transpose().lazyProduct(m3)).diagonal().sum(), 0 );\n\n  // ... and even no temporary for even deeply (>=2) nested products\n  VERIFY_EVALUATION_COUNT( Scalar tmp = 0; tmp += Scalar(RealScalar(1)) /  (m3.transpose() * m3).diagonal().sum(), 0 );\n  VERIFY_EVALUATION_COUNT( Scalar tmp = 0; tmp += Scalar(RealScalar(1)) /  (m3.transpose() * m3).diagonal().array().abs().sum(), 0 );\n\n  // Zero temporaries for ... CoeffBasedProductMode\n  // - does not work with GCC because of the <..>, we'ld need variadic macros ...\n  //VERIFY_EVALUATION_COUNT( m3.col(0).head<5>() * m3.col(0).transpose() + m3.col(0).head<5>() * m3.col(0).transpose(), 0 );\n\n  // Check matrix * vectors\n  VERIFY_EVALUATION_COUNT( cvres.noalias() = m1 * cv1, 0 );\n  VERIFY_EVALUATION_COUNT( cvres.noalias() -= m1 * cv1, 0 );\n  VERIFY_EVALUATION_COUNT( cvres.noalias() -= m1 * m2.col(0), 0 );\n  VERIFY_EVALUATION_COUNT( cvres.noalias() -= m1 * rv1.adjoint(), 0 );\n  VERIFY_EVALUATION_COUNT( cvres.noalias() -= m1 * m2.row(0).transpose(), 0 );\n}\n\nvoid test_product_notemporary()\n{\n  int s;\n  for(int i = 0; i < g_repeat; i++) {\n    s = internal::random<int>(16,EIGEN_TEST_MAX_SIZE);\n    CALL_SUBTEST_1( product_notemporary(MatrixXf(s, s)) );\n    s = internal::random<int>(16,EIGEN_TEST_MAX_SIZE);\n    CALL_SUBTEST_2( product_notemporary(MatrixXd(s, s)) );\n    s = internal::random<int>(16,EIGEN_TEST_MAX_SIZE/2);\n    CALL_SUBTEST_3( product_notemporary(MatrixXcf(s,s)) );\n    s = internal::random<int>(16,EIGEN_TEST_MAX_SIZE/2);\n    CALL_SUBTEST_4( product_notemporary(MatrixXcd(s,s)) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/product_selfadjoint.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\ntemplate<typename MatrixType> void product_selfadjoint(const MatrixType& m)\n{\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> VectorType;\n  typedef Matrix<Scalar, 1, MatrixType::RowsAtCompileTime> RowVectorType;\n\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, Dynamic, RowMajor> RhsMatrixType;\n\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  MatrixType m1 = MatrixType::Random(rows, cols),\n             m2 = MatrixType::Random(rows, cols),\n             m3;\n  VectorType v1 = VectorType::Random(rows),\n             v2 = VectorType::Random(rows),\n             v3(rows);\n  RowVectorType r1 = RowVectorType::Random(rows),\n                r2 = RowVectorType::Random(rows);\n  RhsMatrixType m4 = RhsMatrixType::Random(rows,10);\n\n  Scalar s1 = internal::random<Scalar>(),\n         s2 = internal::random<Scalar>(),\n         s3 = internal::random<Scalar>();\n\n  m1 = (m1.adjoint() + m1).eval();\n\n  // rank2 update\n  m2 = m1.template triangularView<Lower>();\n  m2.template selfadjointView<Lower>().rankUpdate(v1,v2);\n  VERIFY_IS_APPROX(m2, (m1 + v1 * v2.adjoint()+ v2 * v1.adjoint()).template triangularView<Lower>().toDenseMatrix());\n\n  m2 = m1.template triangularView<Upper>();\n  m2.template selfadjointView<Upper>().rankUpdate(-v1,s2*v2,s3);\n  VERIFY_IS_APPROX(m2, (m1 + (s3*(-v1)*(s2*v2).adjoint()+numext::conj(s3)*(s2*v2)*(-v1).adjoint())).template triangularView<Upper>().toDenseMatrix());\n\n  m2 = m1.template triangularView<Upper>();\n  m2.template selfadjointView<Upper>().rankUpdate(-s2*r1.adjoint(),r2.adjoint()*s3,s1);\n  VERIFY_IS_APPROX(m2, (m1 + s1*(-s2*r1.adjoint())*(r2.adjoint()*s3).adjoint() + numext::conj(s1)*(r2.adjoint()*s3) * (-s2*r1.adjoint()).adjoint()).template triangularView<Upper>().toDenseMatrix());\n\n  if (rows>1)\n  {\n    m2 = m1.template triangularView<Lower>();\n    m2.block(1,1,rows-1,cols-1).template selfadjointView<Lower>().rankUpdate(v1.tail(rows-1),v2.head(cols-1));\n    m3 = m1;\n    m3.block(1,1,rows-1,cols-1) += v1.tail(rows-1) * v2.head(cols-1).adjoint()+ v2.head(cols-1) * v1.tail(rows-1).adjoint();\n    VERIFY_IS_APPROX(m2, m3.template triangularView<Lower>().toDenseMatrix());\n  }\n}\n\nvoid test_product_selfadjoint()\n{\n  int s = 0;\n  for(int i = 0; i < g_repeat ; i++) {\n    CALL_SUBTEST_1( product_selfadjoint(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( product_selfadjoint(Matrix<float, 2, 2>()) );\n    CALL_SUBTEST_3( product_selfadjoint(Matrix3d()) );\n    s = internal::random<int>(1,EIGEN_TEST_MAX_SIZE/2);\n    CALL_SUBTEST_4( product_selfadjoint(MatrixXcf(s, s)) );\n    s = internal::random<int>(1,EIGEN_TEST_MAX_SIZE/2);\n    CALL_SUBTEST_5( product_selfadjoint(MatrixXcd(s,s)) );\n    s = internal::random<int>(1,EIGEN_TEST_MAX_SIZE);\n    CALL_SUBTEST_6( product_selfadjoint(MatrixXd(s,s)) );\n    s = internal::random<int>(1,EIGEN_TEST_MAX_SIZE);\n    CALL_SUBTEST_7( product_selfadjoint(Matrix<float,Dynamic,Dynamic,RowMajor>(s,s)) );\n  }\n  TEST_SET_BUT_UNUSED_VARIABLE(s)\n}\n"
  },
  {
    "path": "libs/eigen/test/product_small.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#define EIGEN_NO_STATIC_ASSERT\n#include \"product.h\"\n\n// regression test for bug 447\nvoid product1x1()\n{\n  Matrix<float,1,3> matAstatic;\n  Matrix<float,3,1> matBstatic;\n  matAstatic.setRandom();\n  matBstatic.setRandom();\n  VERIFY_IS_APPROX( (matAstatic * matBstatic).coeff(0,0), \n                    matAstatic.cwiseProduct(matBstatic.transpose()).sum() );\n\n  MatrixXf matAdynamic(1,3);\n  MatrixXf matBdynamic(3,1);\n  matAdynamic.setRandom();\n  matBdynamic.setRandom();\n  VERIFY_IS_APPROX( (matAdynamic * matBdynamic).coeff(0,0), \n                    matAdynamic.cwiseProduct(matBdynamic.transpose()).sum() );\n}\n\n\nvoid test_product_small()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( product(Matrix<float, 3, 2>()) );\n    CALL_SUBTEST_2( product(Matrix<int, 3, 5>()) );\n    CALL_SUBTEST_3( product(Matrix3d()) );\n    CALL_SUBTEST_4( product(Matrix4d()) );\n    CALL_SUBTEST_5( product(Matrix4f()) );\n    CALL_SUBTEST_6( product1x1() );\n  }\n\n#ifdef EIGEN_TEST_PART_6\n  {\n    // test compilation of (outer_product) * vector\n    Vector3f v = Vector3f::Random();\n    VERIFY_IS_APPROX( (v * v.transpose()) * v, (v * v.transpose()).eval() * v);\n  }\n#endif\n}\n"
  },
  {
    "path": "libs/eigen/test/product_symm.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\ntemplate<typename Scalar, int Size, int OtherSize> void symm(int size = Size, int othersize = OtherSize)\n{\n  typedef Matrix<Scalar, Size, Size> MatrixType;\n  typedef Matrix<Scalar, Size, OtherSize> Rhs1;\n  typedef Matrix<Scalar, OtherSize, Size> Rhs2;\n  enum { order = OtherSize==1 ? 0 : RowMajor };\n  typedef Matrix<Scalar, Size, OtherSize,order> Rhs3;\n  typedef typename MatrixType::Index Index;\n\n  Index rows = size;\n  Index cols = size;\n\n  MatrixType m1 = MatrixType::Random(rows, cols),\n             m2 = MatrixType::Random(rows, cols), m3;\n\n  m1 = (m1+m1.adjoint()).eval();\n\n  Rhs1 rhs1 = Rhs1::Random(cols, othersize), rhs12(cols, othersize), rhs13(cols, othersize);\n  Rhs2 rhs2 = Rhs2::Random(othersize, rows), rhs22(othersize, rows), rhs23(othersize, rows);\n  Rhs3 rhs3 = Rhs3::Random(cols, othersize), rhs32(cols, othersize), rhs33(cols, othersize);\n\n  Scalar s1 = internal::random<Scalar>(),\n         s2 = internal::random<Scalar>();\n\n  m2 = m1.template triangularView<Lower>();\n  m3 = m2.template selfadjointView<Lower>();\n  VERIFY_IS_EQUAL(m1, m3);\n  VERIFY_IS_APPROX(rhs12 = (s1*m2).template selfadjointView<Lower>() * (s2*rhs1),\n                   rhs13 = (s1*m1) * (s2*rhs1));\n\n  m2 = m1.template triangularView<Upper>(); rhs12.setRandom(); rhs13 = rhs12;\n  m3 = m2.template selfadjointView<Upper>();\n  VERIFY_IS_EQUAL(m1, m3);\n  VERIFY_IS_APPROX(rhs12 += (s1*m2).template selfadjointView<Upper>() * (s2*rhs1),\n                   rhs13 += (s1*m1) * (s2*rhs1));\n\n  m2 = m1.template triangularView<Lower>();\n  VERIFY_IS_APPROX(rhs12 = (s1*m2).template selfadjointView<Lower>() * (s2*rhs2.adjoint()),\n                   rhs13 = (s1*m1) * (s2*rhs2.adjoint()));\n\n  m2 = m1.template triangularView<Upper>();\n  VERIFY_IS_APPROX(rhs12 = (s1*m2).template selfadjointView<Upper>() * (s2*rhs2.adjoint()),\n                   rhs13 = (s1*m1) * (s2*rhs2.adjoint()));\n\n  m2 = m1.template triangularView<Upper>();\n  VERIFY_IS_APPROX(rhs12 = (s1*m2.adjoint()).template selfadjointView<Lower>() * (s2*rhs2.adjoint()),\n                   rhs13 = (s1*m1.adjoint()) * (s2*rhs2.adjoint()));\n\n  // test row major = <...>\n  m2 = m1.template triangularView<Lower>(); rhs12.setRandom(); rhs13 = rhs12;\n  VERIFY_IS_APPROX(rhs12 -= (s1*m2).template selfadjointView<Lower>() * (s2*rhs3),\n                   rhs13 -= (s1*m1) * (s2 * rhs3));\n\n  m2 = m1.template triangularView<Upper>();\n  VERIFY_IS_APPROX(rhs12 = (s1*m2.adjoint()).template selfadjointView<Lower>() * (s2*rhs3).conjugate(),\n                   rhs13 = (s1*m1.adjoint()) * (s2*rhs3).conjugate());\n\n\n  m2 = m1.template triangularView<Upper>(); rhs13 = rhs12;\n  VERIFY_IS_APPROX(rhs12.noalias() += s1 * ((m2.adjoint()).template selfadjointView<Lower>() * (s2*rhs3).conjugate()),\n                   rhs13 += (s1*m1.adjoint()) * (s2*rhs3).conjugate());\n\n  m2 = m1.template triangularView<Lower>();\n  VERIFY_IS_APPROX(rhs22 = (rhs2) * (m2).template selfadjointView<Lower>(), rhs23 = (rhs2) * (m1));\n  VERIFY_IS_APPROX(rhs22 = (s2*rhs2) * (s1*m2).template selfadjointView<Lower>(), rhs23 = (s2*rhs2) * (s1*m1));\n\n}\n\nvoid test_product_symm()\n{\n  for(int i = 0; i < g_repeat ; i++)\n  {\n    CALL_SUBTEST_1(( symm<float,Dynamic,Dynamic>(internal::random<int>(1,EIGEN_TEST_MAX_SIZE),internal::random<int>(1,EIGEN_TEST_MAX_SIZE)) ));\n    CALL_SUBTEST_2(( symm<double,Dynamic,Dynamic>(internal::random<int>(1,EIGEN_TEST_MAX_SIZE),internal::random<int>(1,EIGEN_TEST_MAX_SIZE)) ));\n    CALL_SUBTEST_3(( symm<std::complex<float>,Dynamic,Dynamic>(internal::random<int>(1,EIGEN_TEST_MAX_SIZE/2),internal::random<int>(1,EIGEN_TEST_MAX_SIZE/2)) ));\n    CALL_SUBTEST_4(( symm<std::complex<double>,Dynamic,Dynamic>(internal::random<int>(1,EIGEN_TEST_MAX_SIZE/2),internal::random<int>(1,EIGEN_TEST_MAX_SIZE/2)) ));\n\n    CALL_SUBTEST_5(( symm<float,Dynamic,1>(internal::random<int>(1,EIGEN_TEST_MAX_SIZE)) ));\n    CALL_SUBTEST_6(( symm<double,Dynamic,1>(internal::random<int>(1,EIGEN_TEST_MAX_SIZE)) ));\n    CALL_SUBTEST_7(( symm<std::complex<float>,Dynamic,1>(internal::random<int>(1,EIGEN_TEST_MAX_SIZE)) ));\n    CALL_SUBTEST_8(( symm<std::complex<double>,Dynamic,1>(internal::random<int>(1,EIGEN_TEST_MAX_SIZE)) ));\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/product_syrk.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\ntemplate<typename MatrixType> void syrk(const MatrixType& m)\n{\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, MatrixType::ColsAtCompileTime, RowMajor> RMatrixType;\n  typedef Matrix<Scalar, MatrixType::ColsAtCompileTime, Dynamic> Rhs1;\n  typedef Matrix<Scalar, Dynamic, MatrixType::RowsAtCompileTime> Rhs2;\n  typedef Matrix<Scalar, MatrixType::ColsAtCompileTime, Dynamic,RowMajor> Rhs3;\n\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  MatrixType m1 = MatrixType::Random(rows, cols),\n             m2 = MatrixType::Random(rows, cols),\n             m3 = MatrixType::Random(rows, cols);\n  RMatrixType rm2 = MatrixType::Random(rows, cols);\n\n  Rhs1 rhs1 = Rhs1::Random(internal::random<int>(1,320), cols); Rhs1 rhs11 = Rhs1::Random(rhs1.rows(), cols);\n  Rhs2 rhs2 = Rhs2::Random(rows, internal::random<int>(1,320)); Rhs2 rhs22 = Rhs2::Random(rows, rhs2.cols());\n  Rhs3 rhs3 = Rhs3::Random(internal::random<int>(1,320), rows);\n\n  Scalar s1 = internal::random<Scalar>();\n  \n  Index c = internal::random<Index>(0,cols-1);\n\n  m2.setZero();\n  VERIFY_IS_APPROX((m2.template selfadjointView<Lower>().rankUpdate(rhs2,s1)._expression()),\n                   ((s1 * rhs2 * rhs2.adjoint()).eval().template triangularView<Lower>().toDenseMatrix()));\n  m2.setZero();\n  VERIFY_IS_APPROX(((m2.template triangularView<Lower>() += s1 * rhs2  * rhs22.adjoint()).nestedExpression()),\n                   ((s1 * rhs2 * rhs22.adjoint()).eval().template triangularView<Lower>().toDenseMatrix()));\n\n  \n  m2.setZero();\n  VERIFY_IS_APPROX(m2.template selfadjointView<Upper>().rankUpdate(rhs2,s1)._expression(),\n                   (s1 * rhs2 * rhs2.adjoint()).eval().template triangularView<Upper>().toDenseMatrix());\n  m2.setZero();\n  VERIFY_IS_APPROX((m2.template triangularView<Upper>() += s1 * rhs22 * rhs2.adjoint()).nestedExpression(),\n                   (s1 * rhs22 * rhs2.adjoint()).eval().template triangularView<Upper>().toDenseMatrix());\n\n  \n  m2.setZero();\n  VERIFY_IS_APPROX(m2.template selfadjointView<Lower>().rankUpdate(rhs1.adjoint(),s1)._expression(),\n                   (s1 * rhs1.adjoint() * rhs1).eval().template triangularView<Lower>().toDenseMatrix());\n  m2.setZero();\n  VERIFY_IS_APPROX((m2.template triangularView<Lower>() += s1 * rhs11.adjoint() * rhs1).nestedExpression(),\n                   (s1 * rhs11.adjoint() * rhs1).eval().template triangularView<Lower>().toDenseMatrix());\n  \n  \n  m2.setZero();\n  VERIFY_IS_APPROX(m2.template selfadjointView<Upper>().rankUpdate(rhs1.adjoint(),s1)._expression(),\n                   (s1 * rhs1.adjoint() * rhs1).eval().template triangularView<Upper>().toDenseMatrix());\n  VERIFY_IS_APPROX((m2.template triangularView<Upper>() = s1 * rhs1.adjoint() * rhs11).nestedExpression(),\n                   (s1 * rhs1.adjoint() * rhs11).eval().template triangularView<Upper>().toDenseMatrix());\n\n  \n  m2.setZero();\n  VERIFY_IS_APPROX(m2.template selfadjointView<Lower>().rankUpdate(rhs3.adjoint(),s1)._expression(),\n                   (s1 * rhs3.adjoint() * rhs3).eval().template triangularView<Lower>().toDenseMatrix());\n\n  m2.setZero();\n  VERIFY_IS_APPROX(m2.template selfadjointView<Upper>().rankUpdate(rhs3.adjoint(),s1)._expression(),\n                   (s1 * rhs3.adjoint() * rhs3).eval().template triangularView<Upper>().toDenseMatrix());\n                   \n  m2.setZero();\n  VERIFY_IS_APPROX((m2.template selfadjointView<Lower>().rankUpdate(m1.col(c),s1)._expression()),\n                   ((s1 * m1.col(c) * m1.col(c).adjoint()).eval().template triangularView<Lower>().toDenseMatrix()));\n                   \n  m2.setZero();\n  VERIFY_IS_APPROX((m2.template selfadjointView<Upper>().rankUpdate(m1.col(c),s1)._expression()),\n                   ((s1 * m1.col(c) * m1.col(c).adjoint()).eval().template triangularView<Upper>().toDenseMatrix()));\n  rm2.setZero();\n  VERIFY_IS_APPROX((rm2.template selfadjointView<Upper>().rankUpdate(m1.col(c),s1)._expression()),\n                   ((s1 * m1.col(c) * m1.col(c).adjoint()).eval().template triangularView<Upper>().toDenseMatrix()));\n  m2.setZero();\n  VERIFY_IS_APPROX((m2.template triangularView<Upper>() += s1 * m3.col(c) * m1.col(c).adjoint()).nestedExpression(),\n                   ((s1 * m3.col(c) * m1.col(c).adjoint()).eval().template triangularView<Upper>().toDenseMatrix()));\n  rm2.setZero();\n  VERIFY_IS_APPROX((rm2.template triangularView<Upper>() += s1 * m1.col(c) * m3.col(c).adjoint()).nestedExpression(),\n                   ((s1 * m1.col(c) * m3.col(c).adjoint()).eval().template triangularView<Upper>().toDenseMatrix()));\n  \n  m2.setZero();\n  VERIFY_IS_APPROX((m2.template selfadjointView<Lower>().rankUpdate(m1.col(c).conjugate(),s1)._expression()),\n                   ((s1 * m1.col(c).conjugate() * m1.col(c).conjugate().adjoint()).eval().template triangularView<Lower>().toDenseMatrix()));\n                   \n  m2.setZero();\n  VERIFY_IS_APPROX((m2.template selfadjointView<Upper>().rankUpdate(m1.col(c).conjugate(),s1)._expression()),\n                   ((s1 * m1.col(c).conjugate() * m1.col(c).conjugate().adjoint()).eval().template triangularView<Upper>().toDenseMatrix()));\n  \n  \n  m2.setZero();\n  VERIFY_IS_APPROX((m2.template selfadjointView<Lower>().rankUpdate(m1.row(c),s1)._expression()),\n                   ((s1 * m1.row(c).transpose() * m1.row(c).transpose().adjoint()).eval().template triangularView<Lower>().toDenseMatrix()));\n  rm2.setZero();\n  VERIFY_IS_APPROX((rm2.template selfadjointView<Lower>().rankUpdate(m1.row(c),s1)._expression()),\n                   ((s1 * m1.row(c).transpose() * m1.row(c).transpose().adjoint()).eval().template triangularView<Lower>().toDenseMatrix()));\n  m2.setZero();\n  VERIFY_IS_APPROX((m2.template triangularView<Lower>() += s1 * m3.row(c).transpose() * m1.row(c).transpose().adjoint()).nestedExpression(),\n                   ((s1 * m3.row(c).transpose() * m1.row(c).transpose().adjoint()).eval().template triangularView<Lower>().toDenseMatrix()));\n  rm2.setZero();\n  VERIFY_IS_APPROX((rm2.template triangularView<Lower>() += s1 * m3.row(c).transpose() * m1.row(c).transpose().adjoint()).nestedExpression(),\n                   ((s1 * m3.row(c).transpose() * m1.row(c).transpose().adjoint()).eval().template triangularView<Lower>().toDenseMatrix()));\n  \n  \n  m2.setZero();\n  VERIFY_IS_APPROX((m2.template selfadjointView<Upper>().rankUpdate(m1.row(c).adjoint(),s1)._expression()),\n                   ((s1 * m1.row(c).adjoint() * m1.row(c).adjoint().adjoint()).eval().template triangularView<Upper>().toDenseMatrix()));\n}\n\nvoid test_product_syrk()\n{\n  for(int i = 0; i < g_repeat ; i++)\n  {\n    int s;\n    s = internal::random<int>(1,EIGEN_TEST_MAX_SIZE);\n    CALL_SUBTEST_1( syrk(MatrixXf(s, s)) );\n    s = internal::random<int>(1,EIGEN_TEST_MAX_SIZE);\n    CALL_SUBTEST_2( syrk(MatrixXd(s, s)) );\n    s = internal::random<int>(1,EIGEN_TEST_MAX_SIZE/2);\n    CALL_SUBTEST_3( syrk(MatrixXcf(s, s)) );\n    s = internal::random<int>(1,EIGEN_TEST_MAX_SIZE/2);\n    CALL_SUBTEST_4( syrk(MatrixXcd(s, s)) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/product_trmm.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\ntemplate<typename Scalar, int Mode, int TriOrder, int OtherOrder, int ResOrder, int OtherCols>\nvoid trmm(int rows=internal::random<int>(1,EIGEN_TEST_MAX_SIZE),\n          int cols=internal::random<int>(1,EIGEN_TEST_MAX_SIZE),\n          int otherCols = OtherCols==Dynamic?internal::random<int>(1,EIGEN_TEST_MAX_SIZE):OtherCols)\n{\n  typedef Matrix<Scalar,Dynamic,Dynamic,TriOrder> TriMatrix;\n  typedef Matrix<Scalar,Dynamic,OtherCols,OtherCols==1?ColMajor:OtherOrder> OnTheRight;\n  typedef Matrix<Scalar,OtherCols,Dynamic,OtherCols==1?RowMajor:OtherOrder> OnTheLeft;\n  \n  typedef Matrix<Scalar,Dynamic,OtherCols,OtherCols==1?ColMajor:ResOrder> ResXS;\n  typedef Matrix<Scalar,OtherCols,Dynamic,OtherCols==1?RowMajor:ResOrder> ResSX;\n\n  TriMatrix  mat(rows,cols), tri(rows,cols), triTr(cols,rows);\n  \n  OnTheRight  ge_right(cols,otherCols);\n  OnTheLeft   ge_left(otherCols,rows);\n  ResSX       ge_sx, ge_sx_save;\n  ResXS       ge_xs, ge_xs_save;\n\n  Scalar s1 = internal::random<Scalar>(),\n         s2 = internal::random<Scalar>();\n\n  mat.setRandom();\n  tri = mat.template triangularView<Mode>();\n  triTr = mat.transpose().template triangularView<Mode>();\n  ge_right.setRandom();\n  ge_left.setRandom();\n\n  VERIFY_IS_APPROX( ge_xs = mat.template triangularView<Mode>() * ge_right, tri * ge_right);\n  VERIFY_IS_APPROX( ge_sx = ge_left * mat.template triangularView<Mode>(), ge_left * tri);\n  \n  VERIFY_IS_APPROX( ge_xs.noalias() = mat.template triangularView<Mode>() * ge_right, tri * ge_right);\n  VERIFY_IS_APPROX( ge_sx.noalias() = ge_left * mat.template triangularView<Mode>(), ge_left * tri);\n  \n  VERIFY_IS_APPROX( ge_xs.noalias() = (s1*mat.adjoint()).template triangularView<Mode>() * (s2*ge_left.transpose()), s1*triTr.conjugate() * (s2*ge_left.transpose()));\n  VERIFY_IS_APPROX( ge_sx.noalias() = ge_right.transpose() * mat.adjoint().template triangularView<Mode>(), ge_right.transpose() * triTr.conjugate());\n  \n  VERIFY_IS_APPROX( ge_xs.noalias() = (s1*mat.adjoint()).template triangularView<Mode>() * (s2*ge_left.adjoint()), s1*triTr.conjugate() * (s2*ge_left.adjoint()));\n  VERIFY_IS_APPROX( ge_sx.noalias() = ge_right.adjoint() * mat.adjoint().template triangularView<Mode>(), ge_right.adjoint() * triTr.conjugate());\n  \n  ge_xs_save = ge_xs;\n  VERIFY_IS_APPROX( (ge_xs_save + s1*triTr.conjugate() * (s2*ge_left.adjoint())).eval(), ge_xs.noalias() += (s1*mat.adjoint()).template triangularView<Mode>() * (s2*ge_left.adjoint()) );\n  ge_sx.setRandom();\n  ge_sx_save = ge_sx;\n  VERIFY_IS_APPROX( ge_sx_save - (ge_right.adjoint() * (-s1 * triTr).conjugate()).eval(), ge_sx.noalias() -= (ge_right.adjoint() * (-s1 * mat).adjoint().template triangularView<Mode>()).eval());\n  \n  VERIFY_IS_APPROX( ge_xs = (s1*mat).adjoint().template triangularView<Mode>() * ge_left.adjoint(), numext::conj(s1) * triTr.conjugate() * ge_left.adjoint());\n  \n  // TODO check with sub-matrix expressions ?\n}\n\ntemplate<typename Scalar, int Mode, int TriOrder>\nvoid trmv(int rows=internal::random<int>(1,EIGEN_TEST_MAX_SIZE), int cols=internal::random<int>(1,EIGEN_TEST_MAX_SIZE))\n{\n  trmm<Scalar,Mode,TriOrder,ColMajor,ColMajor,1>(rows,cols,1);\n}\n\ntemplate<typename Scalar, int Mode, int TriOrder, int OtherOrder, int ResOrder>\nvoid trmm(int rows=internal::random<int>(1,EIGEN_TEST_MAX_SIZE), int cols=internal::random<int>(1,EIGEN_TEST_MAX_SIZE), int otherCols = internal::random<int>(1,EIGEN_TEST_MAX_SIZE))\n{\n  trmm<Scalar,Mode,TriOrder,OtherOrder,ResOrder,Dynamic>(rows,cols,otherCols);\n}\n\n#define CALL_ALL_ORDERS(NB,SCALAR,MODE)                                             \\\n  EIGEN_CAT(CALL_SUBTEST_,NB)((trmm<SCALAR, MODE, ColMajor,ColMajor,ColMajor>()));  \\\n  EIGEN_CAT(CALL_SUBTEST_,NB)((trmm<SCALAR, MODE, ColMajor,ColMajor,RowMajor>()));  \\\n  EIGEN_CAT(CALL_SUBTEST_,NB)((trmm<SCALAR, MODE, ColMajor,RowMajor,ColMajor>()));  \\\n  EIGEN_CAT(CALL_SUBTEST_,NB)((trmm<SCALAR, MODE, ColMajor,RowMajor,RowMajor>()));  \\\n  EIGEN_CAT(CALL_SUBTEST_,NB)((trmm<SCALAR, MODE, RowMajor,ColMajor,ColMajor>()));  \\\n  EIGEN_CAT(CALL_SUBTEST_,NB)((trmm<SCALAR, MODE, RowMajor,ColMajor,RowMajor>()));  \\\n  EIGEN_CAT(CALL_SUBTEST_,NB)((trmm<SCALAR, MODE, RowMajor,RowMajor,ColMajor>()));  \\\n  EIGEN_CAT(CALL_SUBTEST_,NB)((trmm<SCALAR, MODE, RowMajor,RowMajor,RowMajor>()));  \\\n  \\\n  EIGEN_CAT(CALL_SUBTEST_1,NB)((trmv<SCALAR, MODE, ColMajor>()));                   \\\n  EIGEN_CAT(CALL_SUBTEST_1,NB)((trmv<SCALAR, MODE, RowMajor>()));\n\n  \n#define CALL_ALL(NB,SCALAR)                 \\\n  CALL_ALL_ORDERS(EIGEN_CAT(1,NB),SCALAR,Upper)          \\\n  CALL_ALL_ORDERS(EIGEN_CAT(2,NB),SCALAR,UnitUpper)      \\\n  CALL_ALL_ORDERS(EIGEN_CAT(3,NB),SCALAR,StrictlyUpper)  \\\n  CALL_ALL_ORDERS(EIGEN_CAT(1,NB),SCALAR,Lower)          \\\n  CALL_ALL_ORDERS(EIGEN_CAT(2,NB),SCALAR,UnitLower)      \\\n  CALL_ALL_ORDERS(EIGEN_CAT(3,NB),SCALAR,StrictlyLower)\n  \n\nvoid test_product_trmm()\n{\n  for(int i = 0; i < g_repeat ; i++)\n  {\n    CALL_ALL(1,float);                //  EIGEN_SUFFIXES;11;111;21;121;31;131\n    CALL_ALL(2,double);               //  EIGEN_SUFFIXES;12;112;22;122;32;132\n    CALL_ALL(3,std::complex<float>);  //  EIGEN_SUFFIXES;13;113;23;123;33;133\n    CALL_ALL(4,std::complex<double>); //  EIGEN_SUFFIXES;14;114;24;124;34;134\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/product_trmv.cpp",
    "content": "// This file is triangularView of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\ntemplate<typename MatrixType> void trmv(const MatrixType& m)\n{\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> VectorType;\n\n  RealScalar largerEps = 10*test_precision<RealScalar>();\n\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  MatrixType m1 = MatrixType::Random(rows, cols),\n             m3(rows, cols);\n  VectorType v1 = VectorType::Random(rows);\n\n  Scalar s1 = internal::random<Scalar>();\n\n  m1 = MatrixType::Random(rows, cols);\n\n  // check with a column-major matrix\n  m3 = m1.template triangularView<Eigen::Lower>();\n  VERIFY((m3 * v1).isApprox(m1.template triangularView<Eigen::Lower>() * v1, largerEps));\n  m3 = m1.template triangularView<Eigen::Upper>();\n  VERIFY((m3 * v1).isApprox(m1.template triangularView<Eigen::Upper>() * v1, largerEps));\n  m3 = m1.template triangularView<Eigen::UnitLower>();\n  VERIFY((m3 * v1).isApprox(m1.template triangularView<Eigen::UnitLower>() * v1, largerEps));\n  m3 = m1.template triangularView<Eigen::UnitUpper>();\n  VERIFY((m3 * v1).isApprox(m1.template triangularView<Eigen::UnitUpper>() * v1, largerEps));\n\n  // check conjugated and scalar multiple expressions (col-major)\n  m3 = m1.template triangularView<Eigen::Lower>();\n  VERIFY(((s1*m3).conjugate() * v1).isApprox((s1*m1).conjugate().template triangularView<Eigen::Lower>() * v1, largerEps));\n  m3 = m1.template triangularView<Eigen::Upper>();\n  VERIFY((m3.conjugate() * v1.conjugate()).isApprox(m1.conjugate().template triangularView<Eigen::Upper>() * v1.conjugate(), largerEps));\n\n  // check with a row-major matrix\n  m3 = m1.template triangularView<Eigen::Upper>();\n  VERIFY((m3.transpose() * v1).isApprox(m1.transpose().template triangularView<Eigen::Lower>() * v1, largerEps));\n  m3 = m1.template triangularView<Eigen::Lower>();\n  VERIFY((m3.transpose() * v1).isApprox(m1.transpose().template triangularView<Eigen::Upper>() * v1, largerEps));\n  m3 = m1.template triangularView<Eigen::UnitUpper>();\n  VERIFY((m3.transpose() * v1).isApprox(m1.transpose().template triangularView<Eigen::UnitLower>() * v1, largerEps));\n  m3 = m1.template triangularView<Eigen::UnitLower>();\n  VERIFY((m3.transpose() * v1).isApprox(m1.transpose().template triangularView<Eigen::UnitUpper>() * v1, largerEps));\n\n  // check conjugated and scalar multiple expressions (row-major)\n  m3 = m1.template triangularView<Eigen::Upper>();\n  VERIFY((m3.adjoint() * v1).isApprox(m1.adjoint().template triangularView<Eigen::Lower>() * v1, largerEps));\n  m3 = m1.template triangularView<Eigen::Lower>();\n  VERIFY((m3.adjoint() * (s1*v1.conjugate())).isApprox(m1.adjoint().template triangularView<Eigen::Upper>() * (s1*v1.conjugate()), largerEps));\n  m3 = m1.template triangularView<Eigen::UnitUpper>();\n\n  // check transposed cases:\n  m3 = m1.template triangularView<Eigen::Lower>();\n  VERIFY((v1.transpose() * m3).isApprox(v1.transpose() * m1.template triangularView<Eigen::Lower>(), largerEps));\n  VERIFY((v1.adjoint() * m3).isApprox(v1.adjoint() * m1.template triangularView<Eigen::Lower>(), largerEps));\n  VERIFY((v1.adjoint() * m3.adjoint()).isApprox(v1.adjoint() * m1.template triangularView<Eigen::Lower>().adjoint(), largerEps));\n\n  // TODO check with sub-matrices\n}\n\nvoid test_product_trmv()\n{\n  int s = 0;\n  for(int i = 0; i < g_repeat ; i++) {\n    CALL_SUBTEST_1( trmv(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( trmv(Matrix<float, 2, 2>()) );\n    CALL_SUBTEST_3( trmv(Matrix3d()) );\n    s = internal::random<int>(1,EIGEN_TEST_MAX_SIZE/2);\n    CALL_SUBTEST_4( trmv(MatrixXcf(s,s)) );\n    s = internal::random<int>(1,EIGEN_TEST_MAX_SIZE/2);\n    CALL_SUBTEST_5( trmv(MatrixXcd(s,s)) );\n    s = internal::random<int>(1,EIGEN_TEST_MAX_SIZE);\n    CALL_SUBTEST_6( trmv(Matrix<float,Dynamic,Dynamic,RowMajor>(s, s)) );\n  }\n  TEST_SET_BUT_UNUSED_VARIABLE(s);\n}\n"
  },
  {
    "path": "libs/eigen/test/product_trsolve.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\n#define VERIFY_TRSM(TRI,XB) { \\\n    (XB).setRandom(); ref = (XB); \\\n    (TRI).solveInPlace(XB); \\\n    VERIFY_IS_APPROX((TRI).toDenseMatrix() * (XB), ref); \\\n    (XB).setRandom(); ref = (XB); \\\n    (XB) = (TRI).solve(XB); \\\n    VERIFY_IS_APPROX((TRI).toDenseMatrix() * (XB), ref); \\\n  }\n\n#define VERIFY_TRSM_ONTHERIGHT(TRI,XB) { \\\n    (XB).setRandom(); ref = (XB); \\\n    (TRI).transpose().template solveInPlace<OnTheRight>(XB.transpose()); \\\n    VERIFY_IS_APPROX((XB).transpose() * (TRI).transpose().toDenseMatrix(), ref.transpose()); \\\n    (XB).setRandom(); ref = (XB); \\\n    (XB).transpose() = (TRI).transpose().template solve<OnTheRight>(XB.transpose()); \\\n    VERIFY_IS_APPROX((XB).transpose() * (TRI).transpose().toDenseMatrix(), ref.transpose()); \\\n  }\n\ntemplate<typename Scalar,int Size, int Cols> void trsolve(int size=Size,int cols=Cols)\n{\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n\n  Matrix<Scalar,Size,Size,ColMajor> cmLhs(size,size);\n  Matrix<Scalar,Size,Size,RowMajor> rmLhs(size,size);\n\n  enum {  colmajor = Size==1 ? RowMajor : ColMajor,\n          rowmajor = Cols==1 ? ColMajor : RowMajor };\n  Matrix<Scalar,Size,Cols,colmajor> cmRhs(size,cols);\n  Matrix<Scalar,Size,Cols,rowmajor> rmRhs(size,cols);\n  Matrix<Scalar,Dynamic,Dynamic,colmajor> ref(size,cols);\n\n  cmLhs.setRandom(); cmLhs *= static_cast<RealScalar>(0.1); cmLhs.diagonal().array() += static_cast<RealScalar>(1);\n  rmLhs.setRandom(); rmLhs *= static_cast<RealScalar>(0.1); rmLhs.diagonal().array() += static_cast<RealScalar>(1);\n\n  VERIFY_TRSM(cmLhs.conjugate().template triangularView<Lower>(), cmRhs);\n  VERIFY_TRSM(cmLhs.adjoint()  .template triangularView<Lower>(), cmRhs);\n  VERIFY_TRSM(cmLhs            .template triangularView<Upper>(), cmRhs);\n  VERIFY_TRSM(cmLhs            .template triangularView<Lower>(), rmRhs);\n  VERIFY_TRSM(cmLhs.conjugate().template triangularView<Upper>(), rmRhs);\n  VERIFY_TRSM(cmLhs.adjoint()  .template triangularView<Upper>(), rmRhs);\n\n  VERIFY_TRSM(cmLhs.conjugate().template triangularView<UnitLower>(), cmRhs);\n  VERIFY_TRSM(cmLhs            .template triangularView<UnitUpper>(), rmRhs);\n\n  VERIFY_TRSM(rmLhs            .template triangularView<Lower>(), cmRhs);\n  VERIFY_TRSM(rmLhs.conjugate().template triangularView<UnitUpper>(), rmRhs);\n\n\n  VERIFY_TRSM_ONTHERIGHT(cmLhs.conjugate().template triangularView<Lower>(), cmRhs);\n  VERIFY_TRSM_ONTHERIGHT(cmLhs            .template triangularView<Upper>(), cmRhs);\n  VERIFY_TRSM_ONTHERIGHT(cmLhs            .template triangularView<Lower>(), rmRhs);\n  VERIFY_TRSM_ONTHERIGHT(cmLhs.conjugate().template triangularView<Upper>(), rmRhs);\n\n  VERIFY_TRSM_ONTHERIGHT(cmLhs.conjugate().template triangularView<UnitLower>(), cmRhs);\n  VERIFY_TRSM_ONTHERIGHT(cmLhs            .template triangularView<UnitUpper>(), rmRhs);\n\n  VERIFY_TRSM_ONTHERIGHT(rmLhs            .template triangularView<Lower>(), cmRhs);\n  VERIFY_TRSM_ONTHERIGHT(rmLhs.conjugate().template triangularView<UnitUpper>(), rmRhs);\n\n  int c = internal::random<int>(0,cols-1);\n  VERIFY_TRSM(rmLhs.template triangularView<Lower>(), rmRhs.col(c));\n  VERIFY_TRSM(cmLhs.template triangularView<Lower>(), rmRhs.col(c));\n}\n\nvoid test_product_trsolve()\n{\n  for(int i = 0; i < g_repeat ; i++)\n  {\n    // matrices\n    CALL_SUBTEST_1((trsolve<float,Dynamic,Dynamic>(internal::random<int>(1,EIGEN_TEST_MAX_SIZE),internal::random<int>(1,EIGEN_TEST_MAX_SIZE))));\n    CALL_SUBTEST_2((trsolve<double,Dynamic,Dynamic>(internal::random<int>(1,EIGEN_TEST_MAX_SIZE),internal::random<int>(1,EIGEN_TEST_MAX_SIZE))));\n    CALL_SUBTEST_3((trsolve<std::complex<float>,Dynamic,Dynamic>(internal::random<int>(1,EIGEN_TEST_MAX_SIZE/2),internal::random<int>(1,EIGEN_TEST_MAX_SIZE/2))));\n    CALL_SUBTEST_4((trsolve<std::complex<double>,Dynamic,Dynamic>(internal::random<int>(1,EIGEN_TEST_MAX_SIZE/2),internal::random<int>(1,EIGEN_TEST_MAX_SIZE/2))));\n\n    // vectors\n    CALL_SUBTEST_1((trsolve<float,Dynamic,1>(internal::random<int>(1,EIGEN_TEST_MAX_SIZE))));\n    CALL_SUBTEST_5((trsolve<std::complex<double>,Dynamic,1>(internal::random<int>(1,EIGEN_TEST_MAX_SIZE))));\n    CALL_SUBTEST_6((trsolve<float,1,1>()));\n    CALL_SUBTEST_7((trsolve<float,1,2>()));\n    CALL_SUBTEST_8((trsolve<std::complex<float>,4,1>()));\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/qr.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <Eigen/QR>\n\ntemplate<typename MatrixType> void qr(const MatrixType& m)\n{\n  typedef typename MatrixType::Index Index;\n\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  typedef typename MatrixType::Scalar Scalar;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, MatrixType::RowsAtCompileTime> MatrixQType;\n\n  MatrixType a = MatrixType::Random(rows,cols);\n  HouseholderQR<MatrixType> qrOfA(a);\n\n  MatrixQType q = qrOfA.householderQ();\n  VERIFY_IS_UNITARY(q);\n\n  MatrixType r = qrOfA.matrixQR().template triangularView<Upper>();\n  VERIFY_IS_APPROX(a, qrOfA.householderQ() * r);\n}\n\ntemplate<typename MatrixType, int Cols2> void qr_fixedsize()\n{\n  enum { Rows = MatrixType::RowsAtCompileTime, Cols = MatrixType::ColsAtCompileTime };\n  typedef typename MatrixType::Scalar Scalar;\n  Matrix<Scalar,Rows,Cols> m1 = Matrix<Scalar,Rows,Cols>::Random();\n  HouseholderQR<Matrix<Scalar,Rows,Cols> > qr(m1);\n\n  Matrix<Scalar,Rows,Cols> r = qr.matrixQR();\n  // FIXME need better way to construct trapezoid\n  for(int i = 0; i < Rows; i++) for(int j = 0; j < Cols; j++) if(i>j) r(i,j) = Scalar(0);\n\n  VERIFY_IS_APPROX(m1, qr.householderQ() * r);\n\n  Matrix<Scalar,Cols,Cols2> m2 = Matrix<Scalar,Cols,Cols2>::Random(Cols,Cols2);\n  Matrix<Scalar,Rows,Cols2> m3 = m1*m2;\n  m2 = Matrix<Scalar,Cols,Cols2>::Random(Cols,Cols2);\n  m2 = qr.solve(m3);\n  VERIFY_IS_APPROX(m3, m1*m2);\n}\n\ntemplate<typename MatrixType> void qr_invertible()\n{\n  using std::log;\n  using std::abs;\n  typedef typename NumTraits<typename MatrixType::Scalar>::Real RealScalar;\n  typedef typename MatrixType::Scalar Scalar;\n\n  int size = internal::random<int>(10,50);\n\n  MatrixType m1(size, size), m2(size, size), m3(size, size);\n  m1 = MatrixType::Random(size,size);\n\n  if (internal::is_same<RealScalar,float>::value)\n  {\n    // let's build a matrix more stable to inverse\n    MatrixType a = MatrixType::Random(size,size*2);\n    m1 += a * a.adjoint();\n  }\n\n  HouseholderQR<MatrixType> qr(m1);\n  m3 = MatrixType::Random(size,size);\n  m2 = qr.solve(m3);\n  VERIFY_IS_APPROX(m3, m1*m2);\n\n  // now construct a matrix with prescribed determinant\n  m1.setZero();\n  for(int i = 0; i < size; i++) m1(i,i) = internal::random<Scalar>();\n  RealScalar absdet = abs(m1.diagonal().prod());\n  m3 = qr.householderQ(); // get a unitary\n  m1 = m3 * m1 * m3;\n  qr.compute(m1);\n  VERIFY_IS_APPROX(absdet, qr.absDeterminant());\n  VERIFY_IS_APPROX(log(absdet), qr.logAbsDeterminant());\n}\n\ntemplate<typename MatrixType> void qr_verify_assert()\n{\n  MatrixType tmp;\n\n  HouseholderQR<MatrixType> qr;\n  VERIFY_RAISES_ASSERT(qr.matrixQR())\n  VERIFY_RAISES_ASSERT(qr.solve(tmp))\n  VERIFY_RAISES_ASSERT(qr.householderQ())\n  VERIFY_RAISES_ASSERT(qr.absDeterminant())\n  VERIFY_RAISES_ASSERT(qr.logAbsDeterminant())\n}\n\nvoid test_qr()\n{\n  for(int i = 0; i < g_repeat; i++) {\n   CALL_SUBTEST_1( qr(MatrixXf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE),internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );\n   CALL_SUBTEST_2( qr(MatrixXcd(internal::random<int>(1,EIGEN_TEST_MAX_SIZE/2),internal::random<int>(1,EIGEN_TEST_MAX_SIZE/2))) );\n   CALL_SUBTEST_3(( qr_fixedsize<Matrix<float,3,4>, 2 >() ));\n   CALL_SUBTEST_4(( qr_fixedsize<Matrix<double,6,2>, 4 >() ));\n   CALL_SUBTEST_5(( qr_fixedsize<Matrix<double,2,5>, 7 >() ));\n   CALL_SUBTEST_11( qr(Matrix<float,1,1>()) );\n  }\n\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( qr_invertible<MatrixXf>() );\n    CALL_SUBTEST_6( qr_invertible<MatrixXd>() );\n    CALL_SUBTEST_7( qr_invertible<MatrixXcf>() );\n    CALL_SUBTEST_8( qr_invertible<MatrixXcd>() );\n  }\n\n  CALL_SUBTEST_9(qr_verify_assert<Matrix3f>());\n  CALL_SUBTEST_10(qr_verify_assert<Matrix3d>());\n  CALL_SUBTEST_1(qr_verify_assert<MatrixXf>());\n  CALL_SUBTEST_6(qr_verify_assert<MatrixXd>());\n  CALL_SUBTEST_7(qr_verify_assert<MatrixXcf>());\n  CALL_SUBTEST_8(qr_verify_assert<MatrixXcd>());\n\n  // Test problem size constructors\n  CALL_SUBTEST_12(HouseholderQR<MatrixXf>(10, 20));\n}\n"
  },
  {
    "path": "libs/eigen/test/qr_colpivoting.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <Eigen/QR>\n\ntemplate<typename MatrixType> void qr()\n{\n  typedef typename MatrixType::Index Index;\n\n  Index rows = internal::random<Index>(2,EIGEN_TEST_MAX_SIZE), cols = internal::random<Index>(2,EIGEN_TEST_MAX_SIZE), cols2 = internal::random<Index>(2,EIGEN_TEST_MAX_SIZE);\n  Index rank = internal::random<Index>(1, (std::min)(rows, cols)-1);\n\n  typedef typename MatrixType::Scalar Scalar;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, MatrixType::RowsAtCompileTime> MatrixQType;\n  MatrixType m1;\n  createRandomPIMatrixOfRank(rank,rows,cols,m1);\n  ColPivHouseholderQR<MatrixType> qr(m1);\n  VERIFY(rank == qr.rank());\n  VERIFY(cols - qr.rank() == qr.dimensionOfKernel());\n  VERIFY(!qr.isInjective());\n  VERIFY(!qr.isInvertible());\n  VERIFY(!qr.isSurjective());\n\n  MatrixQType q = qr.householderQ();\n  VERIFY_IS_UNITARY(q);\n\n  MatrixType r = qr.matrixQR().template triangularView<Upper>();\n  MatrixType c = q * r * qr.colsPermutation().inverse();\n  VERIFY_IS_APPROX(m1, c);\n\n  MatrixType m2 = MatrixType::Random(cols,cols2);\n  MatrixType m3 = m1*m2;\n  m2 = MatrixType::Random(cols,cols2);\n  m2 = qr.solve(m3);\n  VERIFY_IS_APPROX(m3, m1*m2);\n}\n\ntemplate<typename MatrixType, int Cols2> void qr_fixedsize()\n{\n  enum { Rows = MatrixType::RowsAtCompileTime, Cols = MatrixType::ColsAtCompileTime };\n  typedef typename MatrixType::Scalar Scalar;\n  int rank = internal::random<int>(1, (std::min)(int(Rows), int(Cols))-1);\n  Matrix<Scalar,Rows,Cols> m1;\n  createRandomPIMatrixOfRank(rank,Rows,Cols,m1);\n  ColPivHouseholderQR<Matrix<Scalar,Rows,Cols> > qr(m1);\n  VERIFY(rank == qr.rank());\n  VERIFY(Cols - qr.rank() == qr.dimensionOfKernel());\n  VERIFY(qr.isInjective() == (rank == Rows));\n  VERIFY(qr.isSurjective() == (rank == Cols));\n  VERIFY(qr.isInvertible() == (qr.isInjective() && qr.isSurjective()));\n\n  Matrix<Scalar,Rows,Cols> r = qr.matrixQR().template triangularView<Upper>();\n  Matrix<Scalar,Rows,Cols> c = qr.householderQ() * r * qr.colsPermutation().inverse();\n  VERIFY_IS_APPROX(m1, c);\n\n  Matrix<Scalar,Cols,Cols2> m2 = Matrix<Scalar,Cols,Cols2>::Random(Cols,Cols2);\n  Matrix<Scalar,Rows,Cols2> m3 = m1*m2;\n  m2 = Matrix<Scalar,Cols,Cols2>::Random(Cols,Cols2);\n  m2 = qr.solve(m3);\n  VERIFY_IS_APPROX(m3, m1*m2);\n}\n\ntemplate<typename MatrixType> void qr_invertible()\n{\n  using std::log;\n  using std::abs;\n  typedef typename NumTraits<typename MatrixType::Scalar>::Real RealScalar;\n  typedef typename MatrixType::Scalar Scalar;\n\n  int size = internal::random<int>(10,50);\n\n  MatrixType m1(size, size), m2(size, size), m3(size, size);\n  m1 = MatrixType::Random(size,size);\n\n  if (internal::is_same<RealScalar,float>::value)\n  {\n    // let's build a matrix more stable to inverse\n    MatrixType a = MatrixType::Random(size,size*2);\n    m1 += a * a.adjoint();\n  }\n\n  ColPivHouseholderQR<MatrixType> qr(m1);\n  m3 = MatrixType::Random(size,size);\n  m2 = qr.solve(m3);\n  //VERIFY_IS_APPROX(m3, m1*m2);\n\n  // now construct a matrix with prescribed determinant\n  m1.setZero();\n  for(int i = 0; i < size; i++) m1(i,i) = internal::random<Scalar>();\n  RealScalar absdet = abs(m1.diagonal().prod());\n  m3 = qr.householderQ(); // get a unitary\n  m1 = m3 * m1 * m3;\n  qr.compute(m1);\n  VERIFY_IS_APPROX(absdet, qr.absDeterminant());\n  VERIFY_IS_APPROX(log(absdet), qr.logAbsDeterminant());\n}\n\ntemplate<typename MatrixType> void qr_verify_assert()\n{\n  MatrixType tmp;\n\n  ColPivHouseholderQR<MatrixType> qr;\n  VERIFY_RAISES_ASSERT(qr.matrixQR())\n  VERIFY_RAISES_ASSERT(qr.solve(tmp))\n  VERIFY_RAISES_ASSERT(qr.householderQ())\n  VERIFY_RAISES_ASSERT(qr.dimensionOfKernel())\n  VERIFY_RAISES_ASSERT(qr.isInjective())\n  VERIFY_RAISES_ASSERT(qr.isSurjective())\n  VERIFY_RAISES_ASSERT(qr.isInvertible())\n  VERIFY_RAISES_ASSERT(qr.inverse())\n  VERIFY_RAISES_ASSERT(qr.absDeterminant())\n  VERIFY_RAISES_ASSERT(qr.logAbsDeterminant())\n}\n\nvoid test_qr_colpivoting()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( qr<MatrixXf>() );\n    CALL_SUBTEST_2( qr<MatrixXd>() );\n    CALL_SUBTEST_3( qr<MatrixXcd>() );\n    CALL_SUBTEST_4(( qr_fixedsize<Matrix<float,3,5>, 4 >() ));\n    CALL_SUBTEST_5(( qr_fixedsize<Matrix<double,6,2>, 3 >() ));\n    CALL_SUBTEST_5(( qr_fixedsize<Matrix<double,1,1>, 1 >() ));\n  }\n\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( qr_invertible<MatrixXf>() );\n    CALL_SUBTEST_2( qr_invertible<MatrixXd>() );\n    CALL_SUBTEST_6( qr_invertible<MatrixXcf>() );\n    CALL_SUBTEST_3( qr_invertible<MatrixXcd>() );\n  }\n\n  CALL_SUBTEST_7(qr_verify_assert<Matrix3f>());\n  CALL_SUBTEST_8(qr_verify_assert<Matrix3d>());\n  CALL_SUBTEST_1(qr_verify_assert<MatrixXf>());\n  CALL_SUBTEST_2(qr_verify_assert<MatrixXd>());\n  CALL_SUBTEST_6(qr_verify_assert<MatrixXcf>());\n  CALL_SUBTEST_3(qr_verify_assert<MatrixXcd>());\n\n  // Test problem size constructors\n  CALL_SUBTEST_9(ColPivHouseholderQR<MatrixXf>(10, 20));\n}\n"
  },
  {
    "path": "libs/eigen/test/qr_fullpivoting.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <Eigen/QR>\n\ntemplate<typename MatrixType> void qr()\n{\n  typedef typename MatrixType::Index Index;\n\n  Index rows = internal::random<Index>(20,200), cols = internal::random<int>(20,200), cols2 = internal::random<int>(20,200);\n  Index rank = internal::random<Index>(1, (std::min)(rows, cols)-1);\n\n  typedef typename MatrixType::Scalar Scalar;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, MatrixType::RowsAtCompileTime> MatrixQType;\n  MatrixType m1;\n  createRandomPIMatrixOfRank(rank,rows,cols,m1);\n  FullPivHouseholderQR<MatrixType> qr(m1);\n  VERIFY(rank == qr.rank());\n  VERIFY(cols - qr.rank() == qr.dimensionOfKernel());\n  VERIFY(!qr.isInjective());\n  VERIFY(!qr.isInvertible());\n  VERIFY(!qr.isSurjective());\n\n  MatrixType r = qr.matrixQR();\n  \n  MatrixQType q = qr.matrixQ();\n  VERIFY_IS_UNITARY(q);\n  \n  // FIXME need better way to construct trapezoid\n  for(int i = 0; i < rows; i++) for(int j = 0; j < cols; j++) if(i>j) r(i,j) = Scalar(0);\n\n  MatrixType c = qr.matrixQ() * r * qr.colsPermutation().inverse();\n\n  VERIFY_IS_APPROX(m1, c);\n\n  MatrixType m2 = MatrixType::Random(cols,cols2);\n  MatrixType m3 = m1*m2;\n  m2 = MatrixType::Random(cols,cols2);\n  m2 = qr.solve(m3);\n  VERIFY_IS_APPROX(m3, m1*m2);\n}\n\ntemplate<typename MatrixType> void qr_invertible()\n{\n  using std::log;\n  using std::abs;\n  typedef typename NumTraits<typename MatrixType::Scalar>::Real RealScalar;\n  typedef typename MatrixType::Scalar Scalar;\n\n  int size = internal::random<int>(10,50);\n\n  MatrixType m1(size, size), m2(size, size), m3(size, size);\n  m1 = MatrixType::Random(size,size);\n\n  if (internal::is_same<RealScalar,float>::value)\n  {\n    // let's build a matrix more stable to inverse\n    MatrixType a = MatrixType::Random(size,size*2);\n    m1 += a * a.adjoint();\n  }\n\n  FullPivHouseholderQR<MatrixType> qr(m1);\n  VERIFY(qr.isInjective());\n  VERIFY(qr.isInvertible());\n  VERIFY(qr.isSurjective());\n\n  m3 = MatrixType::Random(size,size);\n  m2 = qr.solve(m3);\n  VERIFY_IS_APPROX(m3, m1*m2);\n\n  // now construct a matrix with prescribed determinant\n  m1.setZero();\n  for(int i = 0; i < size; i++) m1(i,i) = internal::random<Scalar>();\n  RealScalar absdet = abs(m1.diagonal().prod());\n  m3 = qr.matrixQ(); // get a unitary\n  m1 = m3 * m1 * m3;\n  qr.compute(m1);\n  VERIFY_IS_APPROX(absdet, qr.absDeterminant());\n  VERIFY_IS_APPROX(log(absdet), qr.logAbsDeterminant());\n}\n\ntemplate<typename MatrixType> void qr_verify_assert()\n{\n  MatrixType tmp;\n\n  FullPivHouseholderQR<MatrixType> qr;\n  VERIFY_RAISES_ASSERT(qr.matrixQR())\n  VERIFY_RAISES_ASSERT(qr.solve(tmp))\n  VERIFY_RAISES_ASSERT(qr.matrixQ())\n  VERIFY_RAISES_ASSERT(qr.dimensionOfKernel())\n  VERIFY_RAISES_ASSERT(qr.isInjective())\n  VERIFY_RAISES_ASSERT(qr.isSurjective())\n  VERIFY_RAISES_ASSERT(qr.isInvertible())\n  VERIFY_RAISES_ASSERT(qr.inverse())\n  VERIFY_RAISES_ASSERT(qr.absDeterminant())\n  VERIFY_RAISES_ASSERT(qr.logAbsDeterminant())\n}\n\nvoid test_qr_fullpivoting()\n{\n for(int i = 0; i < 1; i++) {\n    // FIXME : very weird bug here\n//     CALL_SUBTEST(qr(Matrix2f()) );\n    CALL_SUBTEST_1( qr<MatrixXf>() );\n    CALL_SUBTEST_2( qr<MatrixXd>() );\n    CALL_SUBTEST_3( qr<MatrixXcd>() );\n  }\n\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( qr_invertible<MatrixXf>() );\n    CALL_SUBTEST_2( qr_invertible<MatrixXd>() );\n    CALL_SUBTEST_4( qr_invertible<MatrixXcf>() );\n    CALL_SUBTEST_3( qr_invertible<MatrixXcd>() );\n  }\n\n  CALL_SUBTEST_5(qr_verify_assert<Matrix3f>());\n  CALL_SUBTEST_6(qr_verify_assert<Matrix3d>());\n  CALL_SUBTEST_1(qr_verify_assert<MatrixXf>());\n  CALL_SUBTEST_2(qr_verify_assert<MatrixXd>());\n  CALL_SUBTEST_4(qr_verify_assert<MatrixXcf>());\n  CALL_SUBTEST_3(qr_verify_assert<MatrixXcd>());\n\n  // Test problem size constructors\n  CALL_SUBTEST_7(FullPivHouseholderQR<MatrixXf>(10, 20));\n  CALL_SUBTEST_7((FullPivHouseholderQR<Matrix<float,10,20> >(10,20)));\n  CALL_SUBTEST_7((FullPivHouseholderQR<Matrix<float,10,20> >(Matrix<float,10,20>::Random())));\n  CALL_SUBTEST_7((FullPivHouseholderQR<Matrix<float,20,10> >(20,10)));\n  CALL_SUBTEST_7((FullPivHouseholderQR<Matrix<float,20,10> >(Matrix<float,20,10>::Random())));\n}\n"
  },
  {
    "path": "libs/eigen/test/qtvector.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#define EIGEN_WORK_AROUND_QT_BUG_CALLING_WRONG_OPERATOR_NEW_FIXED_IN_QT_4_5\n\n#include \"main.h\"\n#include <QtCore/QVector>\n#include <Eigen/Geometry>\n#include <Eigen/QtAlignedMalloc>\n\ntemplate<typename MatrixType>\nvoid check_qtvector_matrix(const MatrixType& m)\n{\n  typedef typename MatrixType::Index Index;\n\n  Index rows = m.rows();\n  Index cols = m.cols();\n  MatrixType x = MatrixType::Random(rows,cols), y = MatrixType::Random(rows,cols);\n  QVector<MatrixType> v(10, MatrixType(rows,cols)), w(20, y);\n  for(int i = 0; i < 20; i++)\n  {\n    VERIFY_IS_APPROX(w[i], y);\n  }\n  v[5] = x;\n  w[6] = v[5];\n  VERIFY_IS_APPROX(w[6], v[5]);\n  v = w;\n  for(int i = 0; i < 20; i++)\n  {\n    VERIFY_IS_APPROX(w[i], v[i]);\n  }\n\n  v.resize(21);\n  v[20] = x;\n  VERIFY_IS_APPROX(v[20], x);\n  v.fill(y,22);\n  VERIFY_IS_APPROX(v[21], y);\n  v.push_back(x);\n  VERIFY_IS_APPROX(v[22], x);\n  VERIFY((size_t)&(v[22]) == (size_t)&(v[21]) + sizeof(MatrixType));\n\n  // do a lot of push_back such that the vector gets internally resized\n  // (with memory reallocation)\n  MatrixType* ref = &w[0];\n  for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i)\n    v.push_back(w[i%w.size()]);\n  for(int i=23; i<v.size(); ++i)\n  {\n    VERIFY(v[i]==w[(i-23)%w.size()]);\n  }\n}\n\ntemplate<typename TransformType>\nvoid check_qtvector_transform(const TransformType&)\n{\n  typedef typename TransformType::MatrixType MatrixType;\n  TransformType x(MatrixType::Random()), y(MatrixType::Random());\n  QVector<TransformType> v(10), w(20, y);\n  v[5] = x;\n  w[6] = v[5];\n  VERIFY_IS_APPROX(w[6], v[5]);\n  v = w;\n  for(int i = 0; i < 20; i++)\n  {\n    VERIFY_IS_APPROX(w[i], v[i]);\n  }\n\n  v.resize(21);\n  v[20] = x;\n  VERIFY_IS_APPROX(v[20], x);\n  v.fill(y,22);\n  VERIFY_IS_APPROX(v[21], y);\n  v.push_back(x);\n  VERIFY_IS_APPROX(v[22], x);\n  VERIFY((size_t)&(v[22]) == (size_t)&(v[21]) + sizeof(TransformType));\n\n  // do a lot of push_back such that the vector gets internally resized\n  // (with memory reallocation)\n  TransformType* ref = &w[0];\n  for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i)\n    v.push_back(w[i%w.size()]);\n  for(unsigned int i=23; int(i)<v.size(); ++i)\n  {\n    VERIFY(v[i].matrix()==w[(i-23)%w.size()].matrix());\n  }\n}\n\ntemplate<typename QuaternionType>\nvoid check_qtvector_quaternion(const QuaternionType&)\n{\n  typedef typename QuaternionType::Coefficients Coefficients;\n  QuaternionType x(Coefficients::Random()), y(Coefficients::Random());\n  QVector<QuaternionType> v(10), w(20, y);\n  v[5] = x;\n  w[6] = v[5];\n  VERIFY_IS_APPROX(w[6], v[5]);\n  v = w;\n  for(int i = 0; i < 20; i++)\n  {\n    VERIFY_IS_APPROX(w[i], v[i]);\n  }\n\n  v.resize(21);\n  v[20] = x;\n  VERIFY_IS_APPROX(v[20], x);\n  v.fill(y,22);\n  VERIFY_IS_APPROX(v[21], y);\n  v.push_back(x);\n  VERIFY_IS_APPROX(v[22], x);\n  VERIFY((size_t)&(v[22]) == (size_t)&(v[21]) + sizeof(QuaternionType));\n\n  // do a lot of push_back such that the vector gets internally resized\n  // (with memory reallocation)\n  QuaternionType* ref = &w[0];\n  for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i)\n    v.push_back(w[i%w.size()]);\n  for(unsigned int i=23; int(i)<v.size(); ++i)\n  {\n    VERIFY(v[i].coeffs()==w[(i-23)%w.size()].coeffs());\n  }\n}\n\nvoid test_qtvector()\n{\n  // some non vectorizable fixed sizes\n  CALL_SUBTEST(check_qtvector_matrix(Vector2f()));\n  CALL_SUBTEST(check_qtvector_matrix(Matrix3f()));\n  CALL_SUBTEST(check_qtvector_matrix(Matrix3d()));\n\n  // some vectorizable fixed sizes\n  CALL_SUBTEST(check_qtvector_matrix(Matrix2f()));\n  CALL_SUBTEST(check_qtvector_matrix(Vector4f()));\n  CALL_SUBTEST(check_qtvector_matrix(Matrix4f()));\n  CALL_SUBTEST(check_qtvector_matrix(Matrix4d()));\n\n  // some dynamic sizes\n  CALL_SUBTEST(check_qtvector_matrix(MatrixXd(1,1)));\n  CALL_SUBTEST(check_qtvector_matrix(VectorXd(20)));\n  CALL_SUBTEST(check_qtvector_matrix(RowVectorXf(20)));\n  CALL_SUBTEST(check_qtvector_matrix(MatrixXcf(10,10)));\n\n  // some Transform\n  CALL_SUBTEST(check_qtvector_transform(Affine2f()));\n  CALL_SUBTEST(check_qtvector_transform(Affine3f()));\n  CALL_SUBTEST(check_qtvector_transform(Affine3d()));\n  //CALL_SUBTEST(check_qtvector_transform(Transform4d()));\n\n  // some Quaternion\n  CALL_SUBTEST(check_qtvector_quaternion(Quaternionf()));\n  CALL_SUBTEST(check_qtvector_quaternion(Quaternionf()));\n}\n"
  },
  {
    "path": "libs/eigen/test/real_qz.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Alexey Korepanov <kaikaikai@yandex.ru>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <limits>\n#include <Eigen/Eigenvalues>\n\ntemplate<typename MatrixType> void real_qz(const MatrixType& m)\n{\n  /* this test covers the following files:\n     RealQZ.h\n  */\n  using std::abs;\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n  \n  Index dim = m.cols();\n  \n  MatrixType A = MatrixType::Random(dim,dim),\n             B = MatrixType::Random(dim,dim);\n\n\n  // Regression test for bug 985: Randomly set rows or columns to zero\n  Index k=internal::random<Index>(0, dim-1);\n  switch(internal::random<int>(0,10)) {\n  case 0:\n    A.row(k).setZero(); break;\n  case 1:\n    A.col(k).setZero(); break;\n  case 2:\n    B.row(k).setZero(); break;\n  case 3:\n    B.col(k).setZero(); break;\n  default:\n    break;\n  }\n\n  RealQZ<MatrixType> qz(A,B);\n  \n  VERIFY_IS_EQUAL(qz.info(), Success);\n  // check for zeros\n  bool all_zeros = true;\n  for (Index i=0; i<A.cols(); i++)\n    for (Index j=0; j<i; j++) {\n      if (abs(qz.matrixT()(i,j))!=Scalar(0.0))\n        all_zeros = false;\n      if (j<i-1 && abs(qz.matrixS()(i,j))!=Scalar(0.0))\n        all_zeros = false;\n      if (j==i-1 && j>0 && abs(qz.matrixS()(i,j))!=Scalar(0.0) && abs(qz.matrixS()(i-1,j-1))!=Scalar(0.0))\n        all_zeros = false;\n    }\n  VERIFY_IS_EQUAL(all_zeros, true);\n  VERIFY_IS_APPROX(qz.matrixQ()*qz.matrixS()*qz.matrixZ(), A);\n  VERIFY_IS_APPROX(qz.matrixQ()*qz.matrixT()*qz.matrixZ(), B);\n  VERIFY_IS_APPROX(qz.matrixQ()*qz.matrixQ().adjoint(), MatrixType::Identity(dim,dim));\n  VERIFY_IS_APPROX(qz.matrixZ()*qz.matrixZ().adjoint(), MatrixType::Identity(dim,dim));\n}\n\nvoid test_real_qz()\n{\n  int s = 0;\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( real_qz(Matrix4f()) );\n    s = internal::random<int>(1,EIGEN_TEST_MAX_SIZE/4);\n    CALL_SUBTEST_2( real_qz(MatrixXd(s,s)) );\n\n    // some trivial but implementation-wise tricky cases\n    CALL_SUBTEST_2( real_qz(MatrixXd(1,1)) );\n    CALL_SUBTEST_2( real_qz(MatrixXd(2,2)) );\n    CALL_SUBTEST_3( real_qz(Matrix<double,1,1>()) );\n    CALL_SUBTEST_4( real_qz(Matrix2d()) );\n  }\n  \n  TEST_SET_BUT_UNUSED_VARIABLE(s)\n}\n"
  },
  {
    "path": "libs/eigen/test/redux.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\ntemplate<typename MatrixType> void matrixRedux(const MatrixType& m)\n{\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename MatrixType::RealScalar RealScalar;\n\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  MatrixType m1 = MatrixType::Random(rows, cols);\n\n  // The entries of m1 are uniformly distributed in [0,1], so m1.prod() is very small. This may lead to test\n  // failures if we underflow into denormals. Thus, we scale so that entires are close to 1.\n  MatrixType m1_for_prod = MatrixType::Ones(rows, cols) + RealScalar(0.2) * m1;\n\n  VERIFY_IS_MUCH_SMALLER_THAN(MatrixType::Zero(rows, cols).sum(), Scalar(1));\n  VERIFY_IS_APPROX(MatrixType::Ones(rows, cols).sum(), Scalar(float(rows*cols))); // the float() here to shut up excessive MSVC warning about int->complex conversion being lossy\n  Scalar s(0), p(1), minc(numext::real(m1.coeff(0))), maxc(numext::real(m1.coeff(0)));\n  for(int j = 0; j < cols; j++)\n  for(int i = 0; i < rows; i++)\n  {\n    s += m1(i,j);\n    p *= m1_for_prod(i,j);\n    minc = (std::min)(numext::real(minc), numext::real(m1(i,j)));\n    maxc = (std::max)(numext::real(maxc), numext::real(m1(i,j)));\n  }\n  const Scalar mean = s/Scalar(RealScalar(rows*cols));\n\n  VERIFY_IS_APPROX(m1.sum(), s);\n  VERIFY_IS_APPROX(m1.mean(), mean);\n  VERIFY_IS_APPROX(m1_for_prod.prod(), p);\n  VERIFY_IS_APPROX(m1.real().minCoeff(), numext::real(minc));\n  VERIFY_IS_APPROX(m1.real().maxCoeff(), numext::real(maxc));\n\n  // test slice vectorization assuming assign is ok\n  Index r0 = internal::random<Index>(0,rows-1);\n  Index c0 = internal::random<Index>(0,cols-1);\n  Index r1 = internal::random<Index>(r0+1,rows)-r0;\n  Index c1 = internal::random<Index>(c0+1,cols)-c0;\n  VERIFY_IS_APPROX(m1.block(r0,c0,r1,c1).sum(), m1.block(r0,c0,r1,c1).eval().sum());\n  VERIFY_IS_APPROX(m1.block(r0,c0,r1,c1).mean(), m1.block(r0,c0,r1,c1).eval().mean());\n  VERIFY_IS_APPROX(m1_for_prod.block(r0,c0,r1,c1).prod(), m1_for_prod.block(r0,c0,r1,c1).eval().prod());\n  VERIFY_IS_APPROX(m1.block(r0,c0,r1,c1).real().minCoeff(), m1.block(r0,c0,r1,c1).real().eval().minCoeff());\n  VERIFY_IS_APPROX(m1.block(r0,c0,r1,c1).real().maxCoeff(), m1.block(r0,c0,r1,c1).real().eval().maxCoeff());\n\n  // regression for bug 1090\n  const int R1 = MatrixType::RowsAtCompileTime>=2 ? MatrixType::RowsAtCompileTime/2 : 6;\n  const int C1 = MatrixType::ColsAtCompileTime>=2 ? MatrixType::ColsAtCompileTime/2 : 6;\n  if(R1<=rows-r0 && C1<=cols-c0)\n  {\n    VERIFY_IS_APPROX( (m1.template block<R1,C1>(r0,c0).sum()), m1.block(r0,c0,R1,C1).sum() );\n  }\n  \n  // test empty objects\n  VERIFY_IS_APPROX(m1.block(r0,c0,0,0).sum(),   Scalar(0));\n  VERIFY_IS_APPROX(m1.block(r0,c0,0,0).prod(),  Scalar(1));\n}\n\ntemplate<typename VectorType> void vectorRedux(const VectorType& w)\n{\n  using std::abs;\n  typedef typename VectorType::Index Index;\n  typedef typename VectorType::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  Index size = w.size();\n\n  VectorType v = VectorType::Random(size);\n  VectorType v_for_prod = VectorType::Ones(size) + Scalar(0.2) * v; // see comment above declaration of m1_for_prod\n\n  for(int i = 1; i < size; i++)\n  {\n    Scalar s(0), p(1);\n    RealScalar minc(numext::real(v.coeff(0))), maxc(numext::real(v.coeff(0)));\n    for(int j = 0; j < i; j++)\n    {\n      s += v[j];\n      p *= v_for_prod[j];\n      minc = (std::min)(minc, numext::real(v[j]));\n      maxc = (std::max)(maxc, numext::real(v[j]));\n    }\n    VERIFY_IS_MUCH_SMALLER_THAN(abs(s - v.head(i).sum()), Scalar(1));\n    VERIFY_IS_APPROX(p, v_for_prod.head(i).prod());\n    VERIFY_IS_APPROX(minc, v.real().head(i).minCoeff());\n    VERIFY_IS_APPROX(maxc, v.real().head(i).maxCoeff());\n  }\n\n  for(int i = 0; i < size-1; i++)\n  {\n    Scalar s(0), p(1);\n    RealScalar minc(numext::real(v.coeff(i))), maxc(numext::real(v.coeff(i)));\n    for(int j = i; j < size; j++)\n    {\n      s += v[j];\n      p *= v_for_prod[j];\n      minc = (std::min)(minc, numext::real(v[j]));\n      maxc = (std::max)(maxc, numext::real(v[j]));\n    }\n    VERIFY_IS_MUCH_SMALLER_THAN(abs(s - v.tail(size-i).sum()), Scalar(1));\n    VERIFY_IS_APPROX(p, v_for_prod.tail(size-i).prod());\n    VERIFY_IS_APPROX(minc, v.real().tail(size-i).minCoeff());\n    VERIFY_IS_APPROX(maxc, v.real().tail(size-i).maxCoeff());\n  }\n\n  for(int i = 0; i < size/2; i++)\n  {\n    Scalar s(0), p(1);\n    RealScalar minc(numext::real(v.coeff(i))), maxc(numext::real(v.coeff(i)));\n    for(int j = i; j < size-i; j++)\n    {\n      s += v[j];\n      p *= v_for_prod[j];\n      minc = (std::min)(minc, numext::real(v[j]));\n      maxc = (std::max)(maxc, numext::real(v[j]));\n    }\n    VERIFY_IS_MUCH_SMALLER_THAN(abs(s - v.segment(i, size-2*i).sum()), Scalar(1));\n    VERIFY_IS_APPROX(p, v_for_prod.segment(i, size-2*i).prod());\n    VERIFY_IS_APPROX(minc, v.real().segment(i, size-2*i).minCoeff());\n    VERIFY_IS_APPROX(maxc, v.real().segment(i, size-2*i).maxCoeff());\n  }\n  \n  // test empty objects\n  VERIFY_IS_APPROX(v.head(0).sum(),   Scalar(0));\n  VERIFY_IS_APPROX(v.tail(0).prod(),  Scalar(1));\n  VERIFY_RAISES_ASSERT(v.head(0).mean());\n  VERIFY_RAISES_ASSERT(v.head(0).minCoeff());\n  VERIFY_RAISES_ASSERT(v.head(0).maxCoeff());\n}\n\nvoid test_redux()\n{\n  // the max size cannot be too large, otherwise reduxion operations obviously generate large errors.\n  int maxsize = (std::min)(100,EIGEN_TEST_MAX_SIZE);\n  TEST_SET_BUT_UNUSED_VARIABLE(maxsize);\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( matrixRedux(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_1( matrixRedux(Array<float, 1, 1>()) );\n    CALL_SUBTEST_2( matrixRedux(Matrix2f()) );\n    CALL_SUBTEST_2( matrixRedux(Array2f()) );\n    CALL_SUBTEST_3( matrixRedux(Matrix4d()) );\n    CALL_SUBTEST_3( matrixRedux(Array4d()) );\n    CALL_SUBTEST_4( matrixRedux(MatrixXcf(internal::random<int>(1,maxsize), internal::random<int>(1,maxsize))) );\n    CALL_SUBTEST_4( matrixRedux(ArrayXXcf(internal::random<int>(1,maxsize), internal::random<int>(1,maxsize))) );\n    CALL_SUBTEST_5( matrixRedux(MatrixXd (internal::random<int>(1,maxsize), internal::random<int>(1,maxsize))) );\n    CALL_SUBTEST_5( matrixRedux(ArrayXXd (internal::random<int>(1,maxsize), internal::random<int>(1,maxsize))) );\n    CALL_SUBTEST_6( matrixRedux(MatrixXi (internal::random<int>(1,maxsize), internal::random<int>(1,maxsize))) );\n    CALL_SUBTEST_6( matrixRedux(ArrayXXi (internal::random<int>(1,maxsize), internal::random<int>(1,maxsize))) );\n  }\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_7( vectorRedux(Vector4f()) );\n    CALL_SUBTEST_7( vectorRedux(Array4f()) );\n    CALL_SUBTEST_5( vectorRedux(VectorXd(internal::random<int>(1,maxsize))) );\n    CALL_SUBTEST_5( vectorRedux(ArrayXd(internal::random<int>(1,maxsize))) );\n    CALL_SUBTEST_8( vectorRedux(VectorXf(internal::random<int>(1,maxsize))) );\n    CALL_SUBTEST_8( vectorRedux(ArrayXf(internal::random<int>(1,maxsize))) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/ref.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 20013 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n// This unit test cannot be easily written to work with EIGEN_DEFAULT_TO_ROW_MAJOR\n#ifdef EIGEN_DEFAULT_TO_ROW_MAJOR\n#undef EIGEN_DEFAULT_TO_ROW_MAJOR\n#endif\n\nstatic int nb_temporaries;\n\ninline void on_temporary_creation(int) {\n  // here's a great place to set a breakpoint when debugging failures in this test!\n  nb_temporaries++;\n}\n  \n\n#define EIGEN_DENSE_STORAGE_CTOR_PLUGIN { on_temporary_creation(size); }\n\n#include \"main.h\"\n\n#define VERIFY_EVALUATION_COUNT(XPR,N) {\\\n    nb_temporaries = 0; \\\n    XPR; \\\n    if(nb_temporaries!=N) std::cerr << \"nb_temporaries == \" << nb_temporaries << \"\\n\"; \\\n    VERIFY( (#XPR) && nb_temporaries==N ); \\\n  }\n\n\n// test Ref.h\n\n// Deal with i387 extended precision\n#if EIGEN_ARCH_i386 && !(EIGEN_ARCH_x86_64)\n\n#if EIGEN_COMP_GNUC_STRICT && EIGEN_GNUC_AT_LEAST(4,4)\n#pragma GCC optimize (\"-ffloat-store\")\n#else\n#undef VERIFY_IS_EQUAL\n#define VERIFY_IS_EQUAL(X,Y) VERIFY_IS_APPROX(X,Y)\n#endif\n\n#endif\n\ntemplate<typename MatrixType> void ref_matrix(const MatrixType& m)\n{\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename MatrixType::RealScalar RealScalar;\n  typedef Matrix<Scalar,Dynamic,Dynamic,MatrixType::Options> DynMatrixType;\n  typedef Matrix<RealScalar,Dynamic,Dynamic,MatrixType::Options> RealDynMatrixType;\n  \n  typedef Ref<MatrixType> RefMat;\n  typedef Ref<DynMatrixType> RefDynMat;\n  typedef Ref<const DynMatrixType> ConstRefDynMat;\n  typedef Ref<RealDynMatrixType , 0, Stride<Dynamic,Dynamic> > RefRealMatWithStride;\n\n  Index rows = m.rows(), cols = m.cols();\n  \n  MatrixType  m1 = MatrixType::Random(rows, cols),\n              m2 = m1;\n  \n  Index i = internal::random<Index>(0,rows-1);\n  Index j = internal::random<Index>(0,cols-1);\n  Index brows = internal::random<Index>(1,rows-i);\n  Index bcols = internal::random<Index>(1,cols-j);\n  \n  RefMat rm0 = m1;\n  VERIFY_IS_EQUAL(rm0, m1);\n  RefDynMat rm1 = m1;\n  VERIFY_IS_EQUAL(rm1, m1);\n  RefDynMat rm2 = m1.block(i,j,brows,bcols);\n  VERIFY_IS_EQUAL(rm2, m1.block(i,j,brows,bcols));\n  rm2.setOnes();\n  m2.block(i,j,brows,bcols).setOnes();\n  VERIFY_IS_EQUAL(m1, m2);\n  \n  m2.block(i,j,brows,bcols).setRandom();\n  rm2 = m2.block(i,j,brows,bcols);\n  VERIFY_IS_EQUAL(m1, m2);\n  \n  ConstRefDynMat rm3 = m1.block(i,j,brows,bcols);\n  m1.block(i,j,brows,bcols) *= 2;\n  m2.block(i,j,brows,bcols) *= 2;\n  VERIFY_IS_EQUAL(rm3, m2.block(i,j,brows,bcols));\n  RefRealMatWithStride rm4 = m1.real();\n  VERIFY_IS_EQUAL(rm4, m2.real());\n  rm4.array() += 1;\n  m2.real().array() += 1;\n  VERIFY_IS_EQUAL(m1, m2);\n}\n\ntemplate<typename VectorType> void ref_vector(const VectorType& m)\n{\n  typedef typename VectorType::Index Index;\n  typedef typename VectorType::Scalar Scalar;\n  typedef typename VectorType::RealScalar RealScalar;\n  typedef Matrix<Scalar,Dynamic,1,VectorType::Options> DynMatrixType;\n  typedef Matrix<Scalar,Dynamic,Dynamic,ColMajor> MatrixType;\n  typedef Matrix<RealScalar,Dynamic,1,VectorType::Options> RealDynMatrixType;\n  \n  typedef Ref<VectorType> RefMat;\n  typedef Ref<DynMatrixType> RefDynMat;\n  typedef Ref<const DynMatrixType> ConstRefDynMat;\n  typedef Ref<RealDynMatrixType , 0, InnerStride<> > RefRealMatWithStride;\n  typedef Ref<DynMatrixType , 0, InnerStride<> > RefMatWithStride;\n\n  Index size = m.size();\n  \n  VectorType  v1 = VectorType::Random(size),\n              v2 = v1;\n  MatrixType mat1 = MatrixType::Random(size,size),\n             mat2 = mat1,\n             mat3 = MatrixType::Random(size,size);\n  \n  Index i = internal::random<Index>(0,size-1);\n  Index bsize = internal::random<Index>(1,size-i);\n  \n  RefMat rm0 = v1;\n  VERIFY_IS_EQUAL(rm0, v1);\n  RefDynMat rv1 = v1;\n  VERIFY_IS_EQUAL(rv1, v1);\n  RefDynMat rv2 = v1.segment(i,bsize);\n  VERIFY_IS_EQUAL(rv2, v1.segment(i,bsize));\n  rv2.setOnes();\n  v2.segment(i,bsize).setOnes();\n  VERIFY_IS_EQUAL(v1, v2);\n  \n  v2.segment(i,bsize).setRandom();\n  rv2 = v2.segment(i,bsize);\n  VERIFY_IS_EQUAL(v1, v2);\n  \n  ConstRefDynMat rm3 = v1.segment(i,bsize);\n  v1.segment(i,bsize) *= 2;\n  v2.segment(i,bsize) *= 2;\n  VERIFY_IS_EQUAL(rm3, v2.segment(i,bsize));\n  \n  RefRealMatWithStride rm4 = v1.real();\n  VERIFY_IS_EQUAL(rm4, v2.real());\n  rm4.array() += 1;\n  v2.real().array() += 1;\n  VERIFY_IS_EQUAL(v1, v2);\n  \n  RefMatWithStride rm5 = mat1.row(i).transpose();\n  VERIFY_IS_EQUAL(rm5, mat1.row(i).transpose());\n  rm5.array() += 1;\n  mat2.row(i).array() += 1;\n  VERIFY_IS_EQUAL(mat1, mat2);\n  rm5.noalias() = rm4.transpose() * mat3;\n  mat2.row(i) = v2.real().transpose() * mat3;\n  VERIFY_IS_APPROX(mat1, mat2);\n}\n\ntemplate<typename PlainObjectType> void check_const_correctness(const PlainObjectType&)\n{\n  // verify that ref-to-const don't have LvalueBit\n  typedef typename internal::add_const<PlainObjectType>::type ConstPlainObjectType;\n  VERIFY( !(internal::traits<Ref<ConstPlainObjectType> >::Flags & LvalueBit) );\n  VERIFY( !(internal::traits<Ref<ConstPlainObjectType, Aligned> >::Flags & LvalueBit) );\n  VERIFY( !(Ref<ConstPlainObjectType>::Flags & LvalueBit) );\n  VERIFY( !(Ref<ConstPlainObjectType, Aligned>::Flags & LvalueBit) );\n}\n\ntemplate<typename B>\nEIGEN_DONT_INLINE void call_ref_1(Ref<VectorXf> a, const B &b) { VERIFY_IS_EQUAL(a,b); }\ntemplate<typename B>\nEIGEN_DONT_INLINE void call_ref_2(const Ref<const VectorXf>& a, const B &b) { VERIFY_IS_EQUAL(a,b); }\ntemplate<typename B>\nEIGEN_DONT_INLINE void call_ref_3(Ref<VectorXf,0,InnerStride<> > a, const B &b) { VERIFY_IS_EQUAL(a,b); }\ntemplate<typename B>\nEIGEN_DONT_INLINE void call_ref_4(const Ref<const VectorXf,0,InnerStride<> >& a, const B &b) { VERIFY_IS_EQUAL(a,b); }\ntemplate<typename B>\nEIGEN_DONT_INLINE void call_ref_5(Ref<MatrixXf,0,OuterStride<> > a, const B &b) { VERIFY_IS_EQUAL(a,b); }\ntemplate<typename B>\nEIGEN_DONT_INLINE void call_ref_6(const Ref<const MatrixXf,0,OuterStride<> >& a, const B &b) { VERIFY_IS_EQUAL(a,b); }\ntemplate<typename B>\nEIGEN_DONT_INLINE void call_ref_7(Ref<Matrix<float,Dynamic,3> > a, const B &b) { VERIFY_IS_EQUAL(a,b); }\n\nvoid call_ref()\n{\n  VectorXcf ca  = VectorXcf::Random(10);\n  VectorXf a    = VectorXf::Random(10);\n  RowVectorXf b = RowVectorXf::Random(10);\n  MatrixXf A    = MatrixXf::Random(10,10);\n  RowVector3f c = RowVector3f::Random();\n  const VectorXf& ac(a);\n  VectorBlock<VectorXf> ab(a,0,3);\n  const VectorBlock<VectorXf> abc(a,0,3);\n  \n\n  VERIFY_EVALUATION_COUNT( call_ref_1(a,a), 0);\n  VERIFY_EVALUATION_COUNT( call_ref_1(b,b.transpose()), 0);\n//   call_ref_1(ac,a<c);           // does not compile because ac is const\n  VERIFY_EVALUATION_COUNT( call_ref_1(ab,ab), 0);\n  VERIFY_EVALUATION_COUNT( call_ref_1(a.head(4),a.head(4)), 0);\n  VERIFY_EVALUATION_COUNT( call_ref_1(abc,abc), 0);\n  VERIFY_EVALUATION_COUNT( call_ref_1(A.col(3),A.col(3)), 0);\n//   call_ref_1(A.row(3),A.row(3));    // does not compile because innerstride!=1\n  VERIFY_EVALUATION_COUNT( call_ref_3(A.row(3),A.row(3).transpose()), 0);\n  VERIFY_EVALUATION_COUNT( call_ref_4(A.row(3),A.row(3).transpose()), 0);\n//   call_ref_1(a+a, a+a);          // does not compile for obvious reason\n\n  MatrixXf tmp = A*A.col(1);\n  VERIFY_EVALUATION_COUNT( call_ref_2(A*A.col(1), tmp), 1);     // evaluated into a temp\n  VERIFY_EVALUATION_COUNT( call_ref_2(ac.head(5),ac.head(5)), 0);\n  VERIFY_EVALUATION_COUNT( call_ref_2(ac,ac), 0);\n  VERIFY_EVALUATION_COUNT( call_ref_2(a,a), 0);\n  VERIFY_EVALUATION_COUNT( call_ref_2(ab,ab), 0);\n  VERIFY_EVALUATION_COUNT( call_ref_2(a.head(4),a.head(4)), 0);\n  tmp = a+a;\n  VERIFY_EVALUATION_COUNT( call_ref_2(a+a,tmp), 1);            // evaluated into a temp\n  VERIFY_EVALUATION_COUNT( call_ref_2(ca.imag(),ca.imag()), 1);      // evaluated into a temp\n\n  VERIFY_EVALUATION_COUNT( call_ref_4(ac.head(5),ac.head(5)), 0);\n  tmp = a+a;\n  VERIFY_EVALUATION_COUNT( call_ref_4(a+a,tmp), 1);           // evaluated into a temp\n  VERIFY_EVALUATION_COUNT( call_ref_4(ca.imag(),ca.imag()), 0);\n\n  VERIFY_EVALUATION_COUNT( call_ref_5(a,a), 0);\n  VERIFY_EVALUATION_COUNT( call_ref_5(a.head(3),a.head(3)), 0);\n  VERIFY_EVALUATION_COUNT( call_ref_5(A,A), 0);\n//   call_ref_5(A.transpose(),A.transpose());   // does not compile because storage order does not match\n  VERIFY_EVALUATION_COUNT( call_ref_5(A.block(1,1,2,2),A.block(1,1,2,2)), 0);\n  VERIFY_EVALUATION_COUNT( call_ref_5(b,b), 0);             // storage order do not match, but this is a degenerate case that should work\n  VERIFY_EVALUATION_COUNT( call_ref_5(a.row(3),a.row(3)), 0);\n\n  VERIFY_EVALUATION_COUNT( call_ref_6(a,a), 0);\n  VERIFY_EVALUATION_COUNT( call_ref_6(a.head(3),a.head(3)), 0);\n  VERIFY_EVALUATION_COUNT( call_ref_6(A.row(3),A.row(3)), 1);           // evaluated into a temp thouth it could be avoided by viewing it as a 1xn matrix\n  tmp = A+A;\n  VERIFY_EVALUATION_COUNT( call_ref_6(A+A,tmp), 1);                // evaluated into a temp\n  VERIFY_EVALUATION_COUNT( call_ref_6(A,A), 0);\n  VERIFY_EVALUATION_COUNT( call_ref_6(A.transpose(),A.transpose()), 1);      // evaluated into a temp because the storage orders do not match\n  VERIFY_EVALUATION_COUNT( call_ref_6(A.block(1,1,2,2),A.block(1,1,2,2)), 0);\n  \n  VERIFY_EVALUATION_COUNT( call_ref_7(c,c), 0);\n}\n\ntypedef Matrix<double,Dynamic,Dynamic,RowMajor> RowMatrixXd;\nint test_ref_overload_fun1(Ref<MatrixXd> )       { return 1; }\nint test_ref_overload_fun1(Ref<RowMatrixXd> )    { return 2; }\nint test_ref_overload_fun1(Ref<MatrixXf> )       { return 3; }\n\nint test_ref_overload_fun2(Ref<const MatrixXd> ) { return 4; }\nint test_ref_overload_fun2(Ref<const MatrixXf> ) { return 5; }\n\n// See also bug 969\nvoid test_ref_overloads()\n{\n  MatrixXd Ad, Bd;\n  RowMatrixXd rAd, rBd;\n  VERIFY( test_ref_overload_fun1(Ad)==1 );\n  VERIFY( test_ref_overload_fun1(rAd)==2 );\n  \n  MatrixXf Af, Bf;\n  VERIFY( test_ref_overload_fun2(Ad)==4 );\n  VERIFY( test_ref_overload_fun2(Ad+Bd)==4 );\n  VERIFY( test_ref_overload_fun2(Af+Bf)==5 );\n}\n\nvoid test_ref()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( ref_vector(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_1( check_const_correctness(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( ref_vector(Vector4d()) );\n    CALL_SUBTEST_2( check_const_correctness(Matrix4d()) );\n    CALL_SUBTEST_3( ref_vector(Vector4cf()) );\n    CALL_SUBTEST_4( ref_vector(VectorXcf(8)) );\n    CALL_SUBTEST_5( ref_vector(VectorXi(12)) );\n    CALL_SUBTEST_5( check_const_correctness(VectorXi(12)) );\n\n    CALL_SUBTEST_1( ref_matrix(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( ref_matrix(Matrix4d()) );\n    CALL_SUBTEST_1( ref_matrix(Matrix<float,3,5>()) );\n    CALL_SUBTEST_4( ref_matrix(MatrixXcf(internal::random<int>(1,10),internal::random<int>(1,10))) );\n    CALL_SUBTEST_4( ref_matrix(Matrix<std::complex<double>,10,15>()) );\n    CALL_SUBTEST_5( ref_matrix(MatrixXi(internal::random<int>(1,10),internal::random<int>(1,10))) );\n    CALL_SUBTEST_6( call_ref() );\n  }\n  \n  CALL_SUBTEST_7( test_ref_overloads() );\n}\n"
  },
  {
    "path": "libs/eigen/test/resize.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Keir Mierle <mierle@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\ntemplate<DenseIndex rows, DenseIndex cols>\nvoid resizeLikeTest()\n{\n  MatrixXf A(rows, cols);\n  MatrixXf B;\n  Matrix<double, rows, cols> C;\n  B.resizeLike(A);\n  C.resizeLike(B);  // Shouldn't crash.\n  VERIFY(B.rows() == rows && B.cols() == cols);\n\n  VectorXf x(rows);\n  RowVectorXf y;\n  y.resizeLike(x);\n  VERIFY(y.rows() == 1 && y.cols() == rows);\n\n  y.resize(cols);\n  x.resizeLike(y);\n  VERIFY(x.rows() == cols && x.cols() == 1);\n}\n\nvoid resizeLikeTest12() { resizeLikeTest<1,2>(); }\nvoid resizeLikeTest1020() { resizeLikeTest<10,20>(); }\nvoid resizeLikeTest31() { resizeLikeTest<3,1>(); }\n\nvoid test_resize()\n{\n  CALL_SUBTEST(resizeLikeTest12() );\n  CALL_SUBTEST(resizeLikeTest1020() );\n  CALL_SUBTEST(resizeLikeTest31() );\n}\n"
  },
  {
    "path": "libs/eigen/test/runtest.sh",
    "content": "#!/bin/bash\n\nblack='\\E[30m'\nred='\\E[31m'\ngreen='\\E[32m'\nyellow='\\E[33m'\nblue='\\E[34m'\nmagenta='\\E[35m'\ncyan='\\E[36m'\nwhite='\\E[37m'\n\nif ! ./$1 > /dev/null 2> .runtest.log ; then\n  echo -e  $red Test $1 failed: $black\n  echo -e $blue\n  cat .runtest.log\n  echo -e $black\n  exit 1\nelse\necho -e $green Test $1 passed$black\nfi\n"
  },
  {
    "path": "libs/eigen/test/rvalue_types.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2013 Hauke Heibel <hauke.heibel@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\n#include <Eigen/Core>\n\n#ifdef EIGEN_HAVE_RVALUE_REFERENCES\ntemplate <typename MatrixType>\nvoid rvalue_copyassign(const MatrixType& m)\n{\n\n  typedef typename internal::traits<MatrixType>::Scalar Scalar;\n\n  // create a temporary which we are about to destroy by moving\n  MatrixType tmp = m;\n  long src_address = reinterpret_cast<long>(tmp.data());\n\n  // move the temporary to n\n  MatrixType n = std::move(tmp);\n  long dst_address = reinterpret_cast<long>(n.data());\n\n  if (MatrixType::RowsAtCompileTime==Dynamic|| MatrixType::ColsAtCompileTime==Dynamic)\n  {\n    // verify that we actually moved the guts\n    VERIFY_IS_EQUAL(src_address, dst_address);\n  }\n\n  // verify that the content did not change\n  Scalar abs_diff = (m-n).array().abs().sum();\n  VERIFY_IS_EQUAL(abs_diff, Scalar(0));\n}\n#else\ntemplate <typename MatrixType>\nvoid rvalue_copyassign(const MatrixType&) {}\n#endif\n\nvoid test_rvalue_types()\n{\n  CALL_SUBTEST_1(rvalue_copyassign( MatrixXf::Random(50,50).eval() ));\n  CALL_SUBTEST_1(rvalue_copyassign( ArrayXXf::Random(50,50).eval() ));\n\n  CALL_SUBTEST_1(rvalue_copyassign( Matrix<float,1,Dynamic>::Random(50).eval() ));\n  CALL_SUBTEST_1(rvalue_copyassign( Array<float,1,Dynamic>::Random(50).eval() ));\n\n  CALL_SUBTEST_1(rvalue_copyassign( Matrix<float,Dynamic,1>::Random(50).eval() ));\n  CALL_SUBTEST_1(rvalue_copyassign( Array<float,Dynamic,1>::Random(50).eval() ));\n\n  CALL_SUBTEST_2(rvalue_copyassign( Array<float,2,1>::Random().eval() ));\n  CALL_SUBTEST_2(rvalue_copyassign( Array<float,3,1>::Random().eval() ));\n  CALL_SUBTEST_2(rvalue_copyassign( Array<float,4,1>::Random().eval() ));\n\n  CALL_SUBTEST_2(rvalue_copyassign( Array<float,2,2>::Random().eval() ));\n  CALL_SUBTEST_2(rvalue_copyassign( Array<float,3,3>::Random().eval() ));\n  CALL_SUBTEST_2(rvalue_copyassign( Array<float,4,4>::Random().eval() ));\n}\n"
  },
  {
    "path": "libs/eigen/test/schur_complex.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2010,2012 Jitse Niesen <jitse@maths.leeds.ac.uk>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <limits>\n#include <Eigen/Eigenvalues>\n\ntemplate<typename MatrixType> void schur(int size = MatrixType::ColsAtCompileTime)\n{\n  typedef typename ComplexSchur<MatrixType>::ComplexScalar ComplexScalar;\n  typedef typename ComplexSchur<MatrixType>::ComplexMatrixType ComplexMatrixType;\n\n  // Test basic functionality: T is triangular and A = U T U*\n  for(int counter = 0; counter < g_repeat; ++counter) {\n    MatrixType A = MatrixType::Random(size, size);\n    ComplexSchur<MatrixType> schurOfA(A);\n    VERIFY_IS_EQUAL(schurOfA.info(), Success);\n    ComplexMatrixType U = schurOfA.matrixU();\n    ComplexMatrixType T = schurOfA.matrixT();\n    for(int row = 1; row < size; ++row) {\n      for(int col = 0; col < row; ++col) {\n\tVERIFY(T(row,col) == (typename MatrixType::Scalar)0);\n      }\n    }\n    VERIFY_IS_APPROX(A.template cast<ComplexScalar>(), U * T * U.adjoint());\n  }\n\n  // Test asserts when not initialized\n  ComplexSchur<MatrixType> csUninitialized;\n  VERIFY_RAISES_ASSERT(csUninitialized.matrixT());\n  VERIFY_RAISES_ASSERT(csUninitialized.matrixU());\n  VERIFY_RAISES_ASSERT(csUninitialized.info());\n  \n  // Test whether compute() and constructor returns same result\n  MatrixType A = MatrixType::Random(size, size);\n  ComplexSchur<MatrixType> cs1;\n  cs1.compute(A);\n  ComplexSchur<MatrixType> cs2(A);\n  VERIFY_IS_EQUAL(cs1.info(), Success);\n  VERIFY_IS_EQUAL(cs2.info(), Success);\n  VERIFY_IS_EQUAL(cs1.matrixT(), cs2.matrixT());\n  VERIFY_IS_EQUAL(cs1.matrixU(), cs2.matrixU());\n\n  // Test maximum number of iterations\n  ComplexSchur<MatrixType> cs3;\n  cs3.setMaxIterations(ComplexSchur<MatrixType>::m_maxIterationsPerRow * size).compute(A);\n  VERIFY_IS_EQUAL(cs3.info(), Success);\n  VERIFY_IS_EQUAL(cs3.matrixT(), cs1.matrixT());\n  VERIFY_IS_EQUAL(cs3.matrixU(), cs1.matrixU());\n  cs3.setMaxIterations(1).compute(A);\n  VERIFY_IS_EQUAL(cs3.info(), size > 1 ? NoConvergence : Success);\n  VERIFY_IS_EQUAL(cs3.getMaxIterations(), 1);\n\n  MatrixType Atriangular = A;\n  Atriangular.template triangularView<StrictlyLower>().setZero(); \n  cs3.setMaxIterations(1).compute(Atriangular); // triangular matrices do not need any iterations\n  VERIFY_IS_EQUAL(cs3.info(), Success);\n  VERIFY_IS_EQUAL(cs3.matrixT(), Atriangular.template cast<ComplexScalar>());\n  VERIFY_IS_EQUAL(cs3.matrixU(), ComplexMatrixType::Identity(size, size));\n\n  // Test computation of only T, not U\n  ComplexSchur<MatrixType> csOnlyT(A, false);\n  VERIFY_IS_EQUAL(csOnlyT.info(), Success);\n  VERIFY_IS_EQUAL(cs1.matrixT(), csOnlyT.matrixT());\n  VERIFY_RAISES_ASSERT(csOnlyT.matrixU());\n\n  if (size > 1)\n  {\n    // Test matrix with NaN\n    A(0,0) = std::numeric_limits<typename MatrixType::RealScalar>::quiet_NaN();\n    ComplexSchur<MatrixType> csNaN(A);\n    VERIFY_IS_EQUAL(csNaN.info(), NoConvergence);\n  }\n}\n\nvoid test_schur_complex()\n{\n  CALL_SUBTEST_1(( schur<Matrix4cd>() ));\n  CALL_SUBTEST_2(( schur<MatrixXcf>(internal::random<int>(1,EIGEN_TEST_MAX_SIZE/4)) ));\n  CALL_SUBTEST_3(( schur<Matrix<std::complex<float>, 1, 1> >() ));\n  CALL_SUBTEST_4(( schur<Matrix<float, 3, 3, Eigen::RowMajor> >() ));\n\n  // Test problem size constructors\n  CALL_SUBTEST_5(ComplexSchur<MatrixXf>(10));\n}\n"
  },
  {
    "path": "libs/eigen/test/schur_real.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2010,2012 Jitse Niesen <jitse@maths.leeds.ac.uk>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <limits>\n#include <Eigen/Eigenvalues>\n\ntemplate<typename MatrixType> void verifyIsQuasiTriangular(const MatrixType& T)\n{\n  typedef typename MatrixType::Index Index;\n\n  const Index size = T.cols();\n  typedef typename MatrixType::Scalar Scalar;\n\n  // Check T is lower Hessenberg\n  for(int row = 2; row < size; ++row) {\n    for(int col = 0; col < row - 1; ++col) {\n      VERIFY(T(row,col) == Scalar(0));\n    }\n  }\n\n  // Check that any non-zero on the subdiagonal is followed by a zero and is\n  // part of a 2x2 diagonal block with imaginary eigenvalues.\n  for(int row = 1; row < size; ++row) {\n    if (T(row,row-1) != Scalar(0)) {\n      VERIFY(row == size-1 || T(row+1,row) == 0);\n      Scalar tr = T(row-1,row-1) + T(row,row);\n      Scalar det = T(row-1,row-1) * T(row,row) - T(row-1,row) * T(row,row-1);\n      VERIFY(4 * det > tr * tr);\n    }\n  }\n}\n\ntemplate<typename MatrixType> void schur(int size = MatrixType::ColsAtCompileTime)\n{\n  // Test basic functionality: T is quasi-triangular and A = U T U*\n  for(int counter = 0; counter < g_repeat; ++counter) {\n    MatrixType A = MatrixType::Random(size, size);\n    RealSchur<MatrixType> schurOfA(A);\n    VERIFY_IS_EQUAL(schurOfA.info(), Success);\n    MatrixType U = schurOfA.matrixU();\n    MatrixType T = schurOfA.matrixT();\n    verifyIsQuasiTriangular(T);\n    VERIFY_IS_APPROX(A, U * T * U.transpose());\n  }\n\n  // Test asserts when not initialized\n  RealSchur<MatrixType> rsUninitialized;\n  VERIFY_RAISES_ASSERT(rsUninitialized.matrixT());\n  VERIFY_RAISES_ASSERT(rsUninitialized.matrixU());\n  VERIFY_RAISES_ASSERT(rsUninitialized.info());\n  \n  // Test whether compute() and constructor returns same result\n  MatrixType A = MatrixType::Random(size, size);\n  RealSchur<MatrixType> rs1;\n  rs1.compute(A);\n  RealSchur<MatrixType> rs2(A);\n  VERIFY_IS_EQUAL(rs1.info(), Success);\n  VERIFY_IS_EQUAL(rs2.info(), Success);\n  VERIFY_IS_EQUAL(rs1.matrixT(), rs2.matrixT());\n  VERIFY_IS_EQUAL(rs1.matrixU(), rs2.matrixU());\n\n  // Test maximum number of iterations\n  RealSchur<MatrixType> rs3;\n  rs3.setMaxIterations(RealSchur<MatrixType>::m_maxIterationsPerRow * size).compute(A);\n  VERIFY_IS_EQUAL(rs3.info(), Success);\n  VERIFY_IS_EQUAL(rs3.matrixT(), rs1.matrixT());\n  VERIFY_IS_EQUAL(rs3.matrixU(), rs1.matrixU());\n  if (size > 2) {\n    rs3.setMaxIterations(1).compute(A);\n    VERIFY_IS_EQUAL(rs3.info(), NoConvergence);\n    VERIFY_IS_EQUAL(rs3.getMaxIterations(), 1);\n  }\n\n  MatrixType Atriangular = A;\n  Atriangular.template triangularView<StrictlyLower>().setZero(); \n  rs3.setMaxIterations(1).compute(Atriangular); // triangular matrices do not need any iterations\n  VERIFY_IS_EQUAL(rs3.info(), Success);\n  VERIFY_IS_EQUAL(rs3.matrixT(), Atriangular);\n  VERIFY_IS_EQUAL(rs3.matrixU(), MatrixType::Identity(size, size));\n\n  // Test computation of only T, not U\n  RealSchur<MatrixType> rsOnlyT(A, false);\n  VERIFY_IS_EQUAL(rsOnlyT.info(), Success);\n  VERIFY_IS_EQUAL(rs1.matrixT(), rsOnlyT.matrixT());\n  VERIFY_RAISES_ASSERT(rsOnlyT.matrixU());\n\n  if (size > 2)\n  {\n    // Test matrix with NaN\n    A(0,0) = std::numeric_limits<typename MatrixType::Scalar>::quiet_NaN();\n    RealSchur<MatrixType> rsNaN(A);\n    VERIFY_IS_EQUAL(rsNaN.info(), NoConvergence);\n  }\n}\n\nvoid test_schur_real()\n{\n  CALL_SUBTEST_1(( schur<Matrix4f>() ));\n  CALL_SUBTEST_2(( schur<MatrixXd>(internal::random<int>(1,EIGEN_TEST_MAX_SIZE/4)) ));\n  CALL_SUBTEST_3(( schur<Matrix<float, 1, 1> >() ));\n  CALL_SUBTEST_4(( schur<Matrix<double, 3, 3, Eigen::RowMajor> >() ));\n\n  // Test problem size constructors\n  CALL_SUBTEST_5(RealSchur<MatrixXf>(10));\n}\n"
  },
  {
    "path": "libs/eigen/test/selfadjoint.cpp",
    "content": "// This file is triangularView of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\n// This file tests the basic selfadjointView API,\n// the related products and decompositions are tested in specific files.\n\ntemplate<typename MatrixType> void selfadjoint(const MatrixType& m)\n{\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  MatrixType m1 = MatrixType::Random(rows, cols),\n             m3(rows, cols);\n\n  m1.diagonal() = m1.diagonal().real().template cast<Scalar>();\n\n  // check selfadjoint to dense\n  m3 = m1.template selfadjointView<Upper>();\n  VERIFY_IS_APPROX(MatrixType(m3.template triangularView<Upper>()), MatrixType(m1.template triangularView<Upper>()));\n  VERIFY_IS_APPROX(m3, m3.adjoint());\n\n\n  m3 = m1.template selfadjointView<Lower>();\n  VERIFY_IS_APPROX(MatrixType(m3.template triangularView<Lower>()), MatrixType(m1.template triangularView<Lower>()));\n  VERIFY_IS_APPROX(m3, m3.adjoint());\n}\n\nvoid bug_159()\n{\n  Matrix3d m = Matrix3d::Random().selfadjointView<Lower>();\n  EIGEN_UNUSED_VARIABLE(m)\n}\n\nvoid test_selfadjoint()\n{\n  for(int i = 0; i < g_repeat ; i++)\n  {\n    int s = internal::random<int>(1,EIGEN_TEST_MAX_SIZE);\n\n    CALL_SUBTEST_1( selfadjoint(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( selfadjoint(Matrix<float, 2, 2>()) );\n    CALL_SUBTEST_3( selfadjoint(Matrix3cf()) );\n    CALL_SUBTEST_4( selfadjoint(MatrixXcd(s,s)) );\n    CALL_SUBTEST_5( selfadjoint(Matrix<float,Dynamic,Dynamic,RowMajor>(s, s)) );\n    \n    TEST_SET_BUT_UNUSED_VARIABLE(s)\n  }\n  \n  CALL_SUBTEST_1( bug_159() );\n}\n"
  },
  {
    "path": "libs/eigen/test/simplicial_cholesky.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2011 Gael Guennebaud <g.gael@free.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"sparse_solver.h\"\n\ntemplate<typename T> void test_simplicial_cholesky_T()\n{\n  SimplicialCholesky<SparseMatrix<T>, Lower> chol_colmajor_lower_amd;\n  SimplicialCholesky<SparseMatrix<T>, Upper> chol_colmajor_upper_amd;\n  SimplicialLLT<SparseMatrix<T>, Lower> llt_colmajor_lower_amd;\n  SimplicialLLT<SparseMatrix<T>, Upper> llt_colmajor_upper_amd;\n  SimplicialLDLT<SparseMatrix<T>, Lower> ldlt_colmajor_lower_amd;\n  SimplicialLDLT<SparseMatrix<T>, Upper> ldlt_colmajor_upper_amd;\n  SimplicialLDLT<SparseMatrix<T>, Lower, NaturalOrdering<int> > ldlt_colmajor_lower_nat;\n  SimplicialLDLT<SparseMatrix<T>, Upper, NaturalOrdering<int> > ldlt_colmajor_upper_nat;\n\n  check_sparse_spd_solving(chol_colmajor_lower_amd);\n  check_sparse_spd_solving(chol_colmajor_upper_amd);\n  check_sparse_spd_solving(llt_colmajor_lower_amd);\n  check_sparse_spd_solving(llt_colmajor_upper_amd);\n  check_sparse_spd_solving(ldlt_colmajor_lower_amd);\n  check_sparse_spd_solving(ldlt_colmajor_upper_amd);\n  \n  check_sparse_spd_determinant(chol_colmajor_lower_amd);\n  check_sparse_spd_determinant(chol_colmajor_upper_amd);\n  check_sparse_spd_determinant(llt_colmajor_lower_amd);\n  check_sparse_spd_determinant(llt_colmajor_upper_amd);\n  check_sparse_spd_determinant(ldlt_colmajor_lower_amd);\n  check_sparse_spd_determinant(ldlt_colmajor_upper_amd);\n  \n  check_sparse_spd_solving(ldlt_colmajor_lower_nat);\n  check_sparse_spd_solving(ldlt_colmajor_upper_nat);\n}\n\nvoid test_simplicial_cholesky()\n{\n  CALL_SUBTEST_1(test_simplicial_cholesky_T<double>());\n  CALL_SUBTEST_2(test_simplicial_cholesky_T<std::complex<double> >());\n}\n"
  },
  {
    "path": "libs/eigen/test/sizeof.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\ntemplate<typename MatrixType> void verifySizeOf(const MatrixType&)\n{\n  typedef typename MatrixType::Scalar Scalar;\n  if (MatrixType::RowsAtCompileTime!=Dynamic && MatrixType::ColsAtCompileTime!=Dynamic)\n    VERIFY(std::ptrdiff_t(sizeof(MatrixType))==std::ptrdiff_t(sizeof(Scalar))*std::ptrdiff_t(MatrixType::SizeAtCompileTime));\n  else\n    VERIFY(sizeof(MatrixType)==sizeof(Scalar*) + 2 * sizeof(typename MatrixType::Index));\n}\n\nvoid test_sizeof()\n{\n  CALL_SUBTEST(verifySizeOf(Matrix<float, 1, 1>()) );\n  CALL_SUBTEST(verifySizeOf(Matrix4d()) );\n  CALL_SUBTEST(verifySizeOf(Matrix<double, 4, 2>()) );\n  CALL_SUBTEST(verifySizeOf(Matrix<bool, 7, 5>()) );\n  CALL_SUBTEST(verifySizeOf(MatrixXcf(3, 3)) );\n  CALL_SUBTEST(verifySizeOf(MatrixXi(8, 12)) );\n  CALL_SUBTEST(verifySizeOf(MatrixXcd(20, 20)) );\n  CALL_SUBTEST(verifySizeOf(Matrix<float, 100, 100>()) );\n  \n  VERIFY(sizeof(std::complex<float>) == 2*sizeof(float));\n  VERIFY(sizeof(std::complex<double>) == 2*sizeof(double));\n}\n"
  },
  {
    "path": "libs/eigen/test/sizeoverflow.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2011 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\n#define VERIFY_THROWS_BADALLOC(a) {                           \\\n    bool threw = false;                                       \\\n    try {                                                     \\\n      a;                                                      \\\n    }                                                         \\\n    catch (std::bad_alloc&) { threw = true; }                 \\\n    VERIFY(threw && \"should have thrown bad_alloc: \" #a);     \\\n  }\n\ntypedef DenseIndex Index;\n\ntemplate<typename MatrixType>\nvoid triggerMatrixBadAlloc(Index rows, Index cols)\n{\n  VERIFY_THROWS_BADALLOC( MatrixType m(rows, cols) );\n  VERIFY_THROWS_BADALLOC( MatrixType m; m.resize(rows, cols) );\n  VERIFY_THROWS_BADALLOC( MatrixType m; m.conservativeResize(rows, cols) );\n}\n\ntemplate<typename VectorType>\nvoid triggerVectorBadAlloc(Index size)\n{\n  VERIFY_THROWS_BADALLOC( VectorType v(size) );\n  VERIFY_THROWS_BADALLOC( VectorType v; v.resize(size) );\n  VERIFY_THROWS_BADALLOC( VectorType v; v.conservativeResize(size) );\n}\n\nvoid test_sizeoverflow()\n{\n  // there are 2 levels of overflow checking. first in PlainObjectBase.h we check for overflow in rows*cols computations.\n  // this is tested in tests of the form times_itself_gives_0 * times_itself_gives_0\n  // Then in Memory.h we check for overflow in size * sizeof(T) computations.\n  // this is tested in tests of the form times_4_gives_0 * sizeof(float)\n  \n  size_t times_itself_gives_0 = size_t(1) << (8 * sizeof(Index) / 2);\n  VERIFY(times_itself_gives_0 * times_itself_gives_0 == 0);\n\n  size_t times_4_gives_0 = size_t(1) << (8 * sizeof(Index) - 2);\n  VERIFY(times_4_gives_0 * 4 == 0);\n\n  size_t times_8_gives_0 = size_t(1) << (8 * sizeof(Index) - 3);\n  VERIFY(times_8_gives_0 * 8 == 0);\n\n  triggerMatrixBadAlloc<MatrixXf>(times_itself_gives_0, times_itself_gives_0);\n  triggerMatrixBadAlloc<MatrixXf>(times_itself_gives_0 / 4, times_itself_gives_0);\n  triggerMatrixBadAlloc<MatrixXf>(times_4_gives_0, 1);\n\n  triggerMatrixBadAlloc<MatrixXd>(times_itself_gives_0, times_itself_gives_0);\n  triggerMatrixBadAlloc<MatrixXd>(times_itself_gives_0 / 8, times_itself_gives_0);\n  triggerMatrixBadAlloc<MatrixXd>(times_8_gives_0, 1);\n  \n  triggerVectorBadAlloc<VectorXf>(times_4_gives_0);\n  \n  triggerVectorBadAlloc<VectorXd>(times_8_gives_0);\n}\n"
  },
  {
    "path": "libs/eigen/test/smallvectors.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#define EIGEN_NO_STATIC_ASSERT\n#include \"main.h\"\n\ntemplate<typename Scalar> void smallVectors()\n{\n  typedef Matrix<Scalar, 1, 2> V2;\n  typedef Matrix<Scalar, 3, 1> V3;\n  typedef Matrix<Scalar, 1, 4> V4;\n  typedef Matrix<Scalar, Dynamic, 1> VX;\n  Scalar x1 = internal::random<Scalar>(),\n         x2 = internal::random<Scalar>(),\n         x3 = internal::random<Scalar>(),\n         x4 = internal::random<Scalar>();\n  V2 v2(x1, x2);\n  V3 v3(x1, x2, x3);\n  V4 v4(x1, x2, x3, x4);\n  VERIFY_IS_APPROX(x1, v2.x());\n  VERIFY_IS_APPROX(x1, v3.x());\n  VERIFY_IS_APPROX(x1, v4.x());\n  VERIFY_IS_APPROX(x2, v2.y());\n  VERIFY_IS_APPROX(x2, v3.y());\n  VERIFY_IS_APPROX(x2, v4.y());\n  VERIFY_IS_APPROX(x3, v3.z());\n  VERIFY_IS_APPROX(x3, v4.z());\n  VERIFY_IS_APPROX(x4, v4.w());\n\n  if (!NumTraits<Scalar>::IsInteger)\n  {\n    VERIFY_RAISES_ASSERT(V3(2, 1))\n    VERIFY_RAISES_ASSERT(V3(3, 2))\n    VERIFY_RAISES_ASSERT(V3(Scalar(3), 1))\n    VERIFY_RAISES_ASSERT(V3(3, Scalar(1)))\n    VERIFY_RAISES_ASSERT(V3(Scalar(3), Scalar(1)))\n    VERIFY_RAISES_ASSERT(V3(Scalar(123), Scalar(123)))\n\n    VERIFY_RAISES_ASSERT(V4(1, 3))\n    VERIFY_RAISES_ASSERT(V4(2, 4))\n    VERIFY_RAISES_ASSERT(V4(1, Scalar(4)))\n    VERIFY_RAISES_ASSERT(V4(Scalar(1), 4))\n    VERIFY_RAISES_ASSERT(V4(Scalar(1), Scalar(4)))\n    VERIFY_RAISES_ASSERT(V4(Scalar(123), Scalar(123)))\n\n    VERIFY_RAISES_ASSERT(VX(3, 2))\n    VERIFY_RAISES_ASSERT(VX(Scalar(3), 1))\n    VERIFY_RAISES_ASSERT(VX(3, Scalar(1)))\n    VERIFY_RAISES_ASSERT(VX(Scalar(3), Scalar(1)))\n    VERIFY_RAISES_ASSERT(VX(Scalar(123), Scalar(123)))\n  }\n}\n\nvoid test_smallvectors()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST(smallVectors<int>() );\n    CALL_SUBTEST(smallVectors<float>() );\n    CALL_SUBTEST(smallVectors<double>() );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/sparse.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2011 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_TESTSPARSE_H\n#define EIGEN_TESTSPARSE_H\n\n#define EIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET\n\n#include \"main.h\"\n\n#if EIGEN_GNUC_AT_LEAST(4,0) && !defined __ICC && !defined(__clang__)\n\n#ifdef min\n#undef min\n#endif\n\n#ifdef max\n#undef max\n#endif\n\n#include <tr1/unordered_map>\n#define EIGEN_UNORDERED_MAP_SUPPORT\nnamespace std {\n  using std::tr1::unordered_map;\n}\n#endif\n\n#ifdef EIGEN_GOOGLEHASH_SUPPORT\n  #include <google/sparse_hash_map>\n#endif\n\n#include <Eigen/Cholesky>\n#include <Eigen/LU>\n#include <Eigen/Sparse>\n\nenum {\n  ForceNonZeroDiag = 1,\n  MakeLowerTriangular = 2,\n  MakeUpperTriangular = 4,\n  ForceRealDiag = 8\n};\n\n/* Initializes both a sparse and dense matrix with same random values,\n * and a ratio of \\a density non zero entries.\n * \\param flags is a union of ForceNonZeroDiag, MakeLowerTriangular and MakeUpperTriangular\n *        allowing to control the shape of the matrix.\n * \\param zeroCoords and nonzeroCoords allows to get the coordinate lists of the non zero,\n *        and zero coefficients respectively.\n */\ntemplate<typename Scalar,int Opt1,int Opt2,typename Index> void\ninitSparse(double density,\n           Matrix<Scalar,Dynamic,Dynamic,Opt1>& refMat,\n           SparseMatrix<Scalar,Opt2,Index>& sparseMat,\n           int flags = 0,\n           std::vector<Matrix<Index,2,1> >* zeroCoords = 0,\n           std::vector<Matrix<Index,2,1> >* nonzeroCoords = 0)\n{\n  enum { IsRowMajor = SparseMatrix<Scalar,Opt2,Index>::IsRowMajor };\n  sparseMat.setZero();\n  //sparseMat.reserve(int(refMat.rows()*refMat.cols()*density));\n  sparseMat.reserve(VectorXi::Constant(IsRowMajor ? refMat.rows() : refMat.cols(), int((1.5*density)*(IsRowMajor?refMat.cols():refMat.rows()))));\n  \n  for(Index j=0; j<sparseMat.outerSize(); j++)\n  {\n    //sparseMat.startVec(j);\n    for(Index i=0; i<sparseMat.innerSize(); i++)\n    {\n      int ai(i), aj(j);\n      if(IsRowMajor)\n        std::swap(ai,aj);\n      Scalar v = (internal::random<double>(0,1) < density) ? internal::random<Scalar>() : Scalar(0);\n      if ((flags&ForceNonZeroDiag) && (i==j))\n      {\n        v = internal::random<Scalar>()*Scalar(3.);\n        v = v*v + Scalar(5.);\n      }\n      if ((flags & MakeLowerTriangular) && aj>ai)\n        v = Scalar(0);\n      else if ((flags & MakeUpperTriangular) && aj<ai)\n        v = Scalar(0);\n\n      if ((flags&ForceRealDiag) && (i==j))\n        v = numext::real(v);\n\n      if (v!=Scalar(0))\n      {\n        //sparseMat.insertBackByOuterInner(j,i) = v;\n        sparseMat.insertByOuterInner(j,i) = v;\n        if (nonzeroCoords)\n          nonzeroCoords->push_back(Matrix<Index,2,1> (ai,aj));\n      }\n      else if (zeroCoords)\n      {\n        zeroCoords->push_back(Matrix<Index,2,1> (ai,aj));\n      }\n      refMat(ai,aj) = v;\n    }\n  }\n  //sparseMat.finalize();\n}\n\ntemplate<typename Scalar,int Opt1,int Opt2,typename Index> void\ninitSparse(double density,\n           Matrix<Scalar,Dynamic,Dynamic, Opt1>& refMat,\n           DynamicSparseMatrix<Scalar, Opt2, Index>& sparseMat,\n           int flags = 0,\n           std::vector<Matrix<Index,2,1> >* zeroCoords = 0,\n           std::vector<Matrix<Index,2,1> >* nonzeroCoords = 0)\n{\n  enum { IsRowMajor = DynamicSparseMatrix<Scalar,Opt2,Index>::IsRowMajor };\n  sparseMat.setZero();\n  sparseMat.reserve(int(refMat.rows()*refMat.cols()*density));\n  for(int j=0; j<sparseMat.outerSize(); j++)\n  {\n    sparseMat.startVec(j); // not needed for DynamicSparseMatrix\n    for(int i=0; i<sparseMat.innerSize(); i++)\n    {\n      int ai(i), aj(j);\n      if(IsRowMajor)\n        std::swap(ai,aj);\n      Scalar v = (internal::random<double>(0,1) < density) ? internal::random<Scalar>() : Scalar(0);\n      if ((flags&ForceNonZeroDiag) && (i==j))\n      {\n        v = internal::random<Scalar>()*Scalar(3.);\n        v = v*v + Scalar(5.);\n      }\n      if ((flags & MakeLowerTriangular) && aj>ai)\n        v = Scalar(0);\n      else if ((flags & MakeUpperTriangular) && aj<ai)\n        v = Scalar(0);\n\n      if ((flags&ForceRealDiag) && (i==j))\n        v = numext::real(v);\n\n      if (v!=Scalar(0))\n      {\n        sparseMat.insertBackByOuterInner(j,i) = v;\n        if (nonzeroCoords)\n          nonzeroCoords->push_back(Matrix<Index,2,1> (ai,aj));\n      }\n      else if (zeroCoords)\n      {\n        zeroCoords->push_back(Matrix<Index,2,1> (ai,aj));\n      }\n      refMat(ai,aj) = v;\n    }\n  }\n  sparseMat.finalize();\n}\n\ntemplate<typename Scalar,int Options,typename Index> void\ninitSparse(double density,\n           Matrix<Scalar,Dynamic,1>& refVec,\n           SparseVector<Scalar,Options,Index>& sparseVec,\n           std::vector<int>* zeroCoords = 0,\n           std::vector<int>* nonzeroCoords = 0)\n{\n  sparseVec.reserve(int(refVec.size()*density));\n  sparseVec.setZero();\n  for(Index i=0; i<refVec.size(); i++)\n  {\n    Scalar v = (internal::random<double>(0,1) < density) ? internal::random<Scalar>() : Scalar(0);\n    if (v!=Scalar(0))\n    {\n      sparseVec.insertBack(i) = v;\n      if (nonzeroCoords)\n        nonzeroCoords->push_back(i);\n    }\n    else if (zeroCoords)\n        zeroCoords->push_back(i);\n    refVec[i] = v;\n  }\n}\n\ntemplate<typename Scalar,int Options,typename Index> void\ninitSparse(double density,\n           Matrix<Scalar,1,Dynamic>& refVec,\n           SparseVector<Scalar,Options,Index>& sparseVec,\n           std::vector<int>* zeroCoords = 0,\n           std::vector<int>* nonzeroCoords = 0)\n{\n  sparseVec.reserve(int(refVec.size()*density));\n  sparseVec.setZero();\n  for(int i=0; i<refVec.size(); i++)\n  {\n    Scalar v = (internal::random<double>(0,1) < density) ? internal::random<Scalar>() : Scalar(0);\n    if (v!=Scalar(0))\n    {\n      sparseVec.insertBack(i) = v;\n      if (nonzeroCoords)\n        nonzeroCoords->push_back(i);\n    }\n    else if (zeroCoords)\n        zeroCoords->push_back(i);\n    refVec[i] = v;\n  }\n}\n\n\n#include <unsupported/Eigen/SparseExtra>\n#endif // EIGEN_TESTSPARSE_H\n"
  },
  {
    "path": "libs/eigen/test/sparseLM.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Desire Nuentsa <desire.nuentsa_wakam@inria.fr>\n// Copyright (C) 2012 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n#include <iostream>\n#include <fstream>\n#include <iomanip>\n\n#include \"main.h\"\n#include <Eigen/LevenbergMarquardt>\n\nusing namespace std;\nusing namespace Eigen;\n\ntemplate <typename Scalar>\nstruct sparseGaussianTest : SparseFunctor<Scalar, int>\n{\n  typedef Matrix<Scalar,Dynamic,1> VectorType;\n  typedef SparseFunctor<Scalar,int> Base;\n  typedef typename Base::JacobianType JacobianType;\n  sparseGaussianTest(int inputs, int values) : SparseFunctor<Scalar,int>(inputs,values)\n  { }\n  \n  VectorType model(const VectorType& uv, VectorType& x)\n  {\n    VectorType y; //Change this to use expression template\n    int m = Base::values(); \n    int n = Base::inputs();\n    eigen_assert(uv.size()%2 == 0);\n    eigen_assert(uv.size() == n);\n    eigen_assert(x.size() == m);\n    y.setZero(m);\n    int half = n/2;\n    VectorBlock<const VectorType> u(uv, 0, half);\n    VectorBlock<const VectorType> v(uv, half, half);\n    Scalar coeff;\n    for (int j = 0; j < m; j++)\n    {\n      for (int i = 0; i < half; i++) \n      {\n        coeff = (x(j)-i)/v(i);\n        coeff *= coeff;\n        if (coeff < 1. && coeff > 0.)\n          y(j) += u(i)*std::pow((1-coeff), 2);\n      }\n    }\n    return y;\n  }\n  void initPoints(VectorType& uv_ref, VectorType& x)\n  {\n    m_x = x;\n    m_y = this->model(uv_ref,x);\n  }\n  int operator()(const VectorType& uv, VectorType& fvec)\n  {\n    int m = Base::values(); \n    int n = Base::inputs();\n    eigen_assert(uv.size()%2 == 0);\n    eigen_assert(uv.size() == n);\n    int half = n/2;\n    VectorBlock<const VectorType> u(uv, 0, half);\n    VectorBlock<const VectorType> v(uv, half, half);\n    fvec = m_y;\n    Scalar coeff;\n    for (int j = 0; j < m; j++)\n    {\n      for (int i = 0; i < half; i++)\n      {\n        coeff = (m_x(j)-i)/v(i);\n        coeff *= coeff;\n        if (coeff < 1. && coeff > 0.)\n          fvec(j) -= u(i)*std::pow((1-coeff), 2);\n      }\n    }\n    return 0;\n  }\n  \n  int df(const VectorType& uv, JacobianType& fjac)\n  {\n    int m = Base::values(); \n    int n = Base::inputs();\n    eigen_assert(n == uv.size());\n    eigen_assert(fjac.rows() == m);\n    eigen_assert(fjac.cols() == n);\n    int half = n/2;\n    VectorBlock<const VectorType> u(uv, 0, half);\n    VectorBlock<const VectorType> v(uv, half, half);\n    Scalar coeff;\n    \n    //Derivatives with respect to u\n    for (int col = 0; col < half; col++)\n    {\n      for (int row = 0; row < m; row++)\n      {\n        coeff = (m_x(row)-col)/v(col);\n          coeff = coeff*coeff;\n        if(coeff < 1. && coeff > 0.)\n        {\n          fjac.coeffRef(row,col) = -(1-coeff)*(1-coeff);\n        }\n      }\n    }\n    //Derivatives with respect to v\n    for (int col = 0; col < half; col++)\n    {\n      for (int row = 0; row < m; row++)\n      {\n        coeff = (m_x(row)-col)/v(col);\n        coeff = coeff*coeff;\n        if(coeff < 1. && coeff > 0.)\n        {\n          fjac.coeffRef(row,col+half) = -4 * (u(col)/v(col))*coeff*(1-coeff);\n        }\n      }\n    }\n    return 0;\n  }\n  \n  VectorType m_x, m_y; //Data points\n};\n\n\ntemplate<typename T>\nvoid test_sparseLM_T()\n{\n  typedef Matrix<T,Dynamic,1> VectorType;\n  \n  int inputs = 10;\n  int values = 2000;\n  sparseGaussianTest<T> sparse_gaussian(inputs, values);\n  VectorType uv(inputs),uv_ref(inputs);\n  VectorType x(values);\n  // Generate the reference solution \n  uv_ref << -2, 1, 4 ,8, 6, 1.8, 1.2, 1.1, 1.9 , 3;\n  //Generate the reference data points\n  x.setRandom();\n  x = 10*x;\n  x.array() += 10;\n  sparse_gaussian.initPoints(uv_ref, x);\n  \n  \n  // Generate the initial parameters \n  VectorBlock<VectorType> u(uv, 0, inputs/2); \n  VectorBlock<VectorType> v(uv, inputs/2, inputs/2);\n  v.setOnes();\n  //Generate u or Solve for u from v\n  u.setOnes();\n  \n  // Solve the optimization problem\n  LevenbergMarquardt<sparseGaussianTest<T> > lm(sparse_gaussian);\n  int info;\n//   info = lm.minimize(uv);\n  \n  VERIFY_IS_EQUAL(info,1);\n    // Do a step by step solution and save the residual \n  int maxiter = 200;\n  int iter = 0;\n  MatrixXd Err(values, maxiter);\n  MatrixXd Mod(values, maxiter);\n  LevenbergMarquardtSpace::Status status; \n  status = lm.minimizeInit(uv);\n  if (status==LevenbergMarquardtSpace::ImproperInputParameters)\n      return ;\n\n}\nvoid test_sparseLM()\n{\n  CALL_SUBTEST_1(test_sparseLM_T<double>());\n  \n  // CALL_SUBTEST_2(test_sparseLM_T<std::complex<double>());\n}\n"
  },
  {
    "path": "libs/eigen/test/sparse_basic.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2011 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2008 Daniel Gomez Ferro <dgomezferro@gmail.com>\n// Copyright (C) 2013 Désiré Nuentsa-Wakam <desire.nuentsa_wakam@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"sparse.h\"\n\ntemplate<typename SparseMatrixType> void sparse_basic(const SparseMatrixType& ref)\n{\n  typedef typename SparseMatrixType::Index Index;\n  typedef Matrix<Index,2,1> Vector2;\n  \n  const Index rows = ref.rows();\n  const Index cols = ref.cols();\n  typedef typename SparseMatrixType::Scalar Scalar;\n  enum { Flags = SparseMatrixType::Flags };\n\n  double density = (std::max)(8./(rows*cols), 0.01);\n  typedef Matrix<Scalar,Dynamic,Dynamic> DenseMatrix;\n  typedef Matrix<Scalar,Dynamic,1> DenseVector;\n  typedef Matrix<Scalar,1,Dynamic> RowDenseVector;\n  Scalar eps = 1e-6;\n\n  Scalar s1 = internal::random<Scalar>();\n  {\n    SparseMatrixType m(rows, cols);\n    DenseMatrix refMat = DenseMatrix::Zero(rows, cols);\n    DenseVector vec1 = DenseVector::Random(rows);\n\n    std::vector<Vector2> zeroCoords;\n    std::vector<Vector2> nonzeroCoords;\n    initSparse<Scalar>(density, refMat, m, 0, &zeroCoords, &nonzeroCoords);\n\n    if (zeroCoords.size()==0 || nonzeroCoords.size()==0)\n      return;\n\n    // test coeff and coeffRef\n    for (int i=0; i<(int)zeroCoords.size(); ++i)\n    {\n      VERIFY_IS_MUCH_SMALLER_THAN( m.coeff(zeroCoords[i].x(),zeroCoords[i].y()), eps );\n      if(internal::is_same<SparseMatrixType,SparseMatrix<Scalar,Flags> >::value)\n        VERIFY_RAISES_ASSERT( m.coeffRef(zeroCoords[0].x(),zeroCoords[0].y()) = 5 );\n    }\n    VERIFY_IS_APPROX(m, refMat);\n\n    m.coeffRef(nonzeroCoords[0].x(), nonzeroCoords[0].y()) = Scalar(5);\n    refMat.coeffRef(nonzeroCoords[0].x(), nonzeroCoords[0].y()) = Scalar(5);\n\n    VERIFY_IS_APPROX(m, refMat);\n      \n      // test InnerIterators and Block expressions\n      for (int t=0; t<10; ++t)\n      {\n        int j = internal::random<int>(0,cols-1);\n        int i = internal::random<int>(0,rows-1);\n        int w = internal::random<int>(1,cols-j-1);\n        int h = internal::random<int>(1,rows-i-1);\n\n        VERIFY_IS_APPROX(m.block(i,j,h,w), refMat.block(i,j,h,w));\n        for(int c=0; c<w; c++)\n        {\n          VERIFY_IS_APPROX(m.block(i,j,h,w).col(c), refMat.block(i,j,h,w).col(c));\n          for(int r=0; r<h; r++)\n          {\n            VERIFY_IS_APPROX(m.block(i,j,h,w).col(c).coeff(r), refMat.block(i,j,h,w).col(c).coeff(r));\n            VERIFY_IS_APPROX(m.block(i,j,h,w).coeff(r,c), refMat.block(i,j,h,w).coeff(r,c));\n          }\n        }\n        for(int r=0; r<h; r++)\n        {\n          VERIFY_IS_APPROX(m.block(i,j,h,w).row(r), refMat.block(i,j,h,w).row(r));\n          for(int c=0; c<w; c++)\n          {\n            VERIFY_IS_APPROX(m.block(i,j,h,w).row(r).coeff(c), refMat.block(i,j,h,w).row(r).coeff(c));\n            VERIFY_IS_APPROX(m.block(i,j,h,w).coeff(r,c), refMat.block(i,j,h,w).coeff(r,c));\n          }\n        }\n        \n        VERIFY_IS_APPROX(m.middleCols(j,w), refMat.middleCols(j,w));\n        VERIFY_IS_APPROX(m.middleRows(i,h), refMat.middleRows(i,h));\n        for(int r=0; r<h; r++)\n        {\n          VERIFY_IS_APPROX(m.middleCols(j,w).row(r), refMat.middleCols(j,w).row(r));\n          VERIFY_IS_APPROX(m.middleRows(i,h).row(r), refMat.middleRows(i,h).row(r));\n          for(int c=0; c<w; c++)\n          {\n            VERIFY_IS_APPROX(m.col(c).coeff(r), refMat.col(c).coeff(r));\n            VERIFY_IS_APPROX(m.row(r).coeff(c), refMat.row(r).coeff(c));\n            \n            VERIFY_IS_APPROX(m.middleCols(j,w).coeff(r,c), refMat.middleCols(j,w).coeff(r,c));\n            VERIFY_IS_APPROX(m.middleRows(i,h).coeff(r,c), refMat.middleRows(i,h).coeff(r,c));\n            if(m.middleCols(j,w).coeff(r,c) != Scalar(0))\n            {\n              VERIFY_IS_APPROX(m.middleCols(j,w).coeffRef(r,c), refMat.middleCols(j,w).coeff(r,c));\n            }\n            if(m.middleRows(i,h).coeff(r,c) != Scalar(0))\n            {\n              VERIFY_IS_APPROX(m.middleRows(i,h).coeff(r,c), refMat.middleRows(i,h).coeff(r,c));\n            }\n          }\n        }\n        for(int c=0; c<w; c++)\n        {\n          VERIFY_IS_APPROX(m.middleCols(j,w).col(c), refMat.middleCols(j,w).col(c));\n          VERIFY_IS_APPROX(m.middleRows(i,h).col(c), refMat.middleRows(i,h).col(c));\n        }\n      }\n\n      for(int c=0; c<cols; c++)\n      {\n        VERIFY_IS_APPROX(m.col(c) + m.col(c), (m + m).col(c));\n        VERIFY_IS_APPROX(m.col(c) + m.col(c), refMat.col(c) + refMat.col(c));\n      }\n\n      for(int r=0; r<rows; r++)\n      {\n        VERIFY_IS_APPROX(m.row(r) + m.row(r), (m + m).row(r));\n        VERIFY_IS_APPROX(m.row(r) + m.row(r), refMat.row(r) + refMat.row(r));\n      }\n      \n      \n      // test assertion\n      VERIFY_RAISES_ASSERT( m.coeffRef(-1,1) = 0 );\n      VERIFY_RAISES_ASSERT( m.coeffRef(0,m.cols()) = 0 );\n    }\n\n    // test insert (inner random)\n    {\n      DenseMatrix m1(rows,cols);\n      m1.setZero();\n      SparseMatrixType m2(rows,cols);\n      if(internal::random<int>()%2)\n        m2.reserve(VectorXi::Constant(m2.outerSize(), 2));\n      for (Index j=0; j<cols; ++j)\n      {\n        for (Index k=0; k<rows/2; ++k)\n        {\n          Index i = internal::random<Index>(0,rows-1);\n          if (m1.coeff(i,j)==Scalar(0))\n            m2.insert(i,j) = m1(i,j) = internal::random<Scalar>();\n        }\n      }\n      m2.finalize();\n      VERIFY_IS_APPROX(m2,m1);\n    }\n\n    // test insert (fully random)\n    {\n      DenseMatrix m1(rows,cols);\n      m1.setZero();\n      SparseMatrixType m2(rows,cols);\n      if(internal::random<int>()%2)\n        m2.reserve(VectorXi::Constant(m2.outerSize(), 2));\n      for (int k=0; k<rows*cols; ++k)\n      {\n        Index i = internal::random<Index>(0,rows-1);\n        Index j = internal::random<Index>(0,cols-1);\n        if ((m1.coeff(i,j)==Scalar(0)) && (internal::random<int>()%2))\n          m2.insert(i,j) = m1(i,j) = internal::random<Scalar>();\n        else\n        {\n          Scalar v = internal::random<Scalar>();\n          m2.coeffRef(i,j) += v;\n          m1(i,j) += v;\n        }\n      }\n      VERIFY_IS_APPROX(m2,m1);\n    }\n    \n    // test insert (un-compressed)\n    for(int mode=0;mode<4;++mode)\n    {\n      DenseMatrix m1(rows,cols);\n      m1.setZero();\n      SparseMatrixType m2(rows,cols);\n      VectorXi r(VectorXi::Constant(m2.outerSize(), ((mode%2)==0) ? m2.innerSize() : std::max<int>(1,m2.innerSize()/8)));\n      m2.reserve(r);\n      for (int k=0; k<rows*cols; ++k)\n      {\n        Index i = internal::random<Index>(0,rows-1);\n        Index j = internal::random<Index>(0,cols-1);\n        if (m1.coeff(i,j)==Scalar(0))\n          m2.insert(i,j) = m1(i,j) = internal::random<Scalar>();\n        if(mode==3)\n          m2.reserve(r);\n      }\n      if(internal::random<int>()%2)\n        m2.makeCompressed();\n      VERIFY_IS_APPROX(m2,m1);\n    }\n\n  // test innerVector()\n  {\n    DenseMatrix refMat2 = DenseMatrix::Zero(rows, rows);\n    SparseMatrixType m2(rows, rows);\n    initSparse<Scalar>(density, refMat2, m2);\n    Index j0 = internal::random<Index>(0,rows-1);\n    Index j1 = internal::random<Index>(0,rows-1);\n    if(SparseMatrixType::IsRowMajor)\n      VERIFY_IS_APPROX(m2.innerVector(j0), refMat2.row(j0));\n    else\n      VERIFY_IS_APPROX(m2.innerVector(j0), refMat2.col(j0));\n\n    if(SparseMatrixType::IsRowMajor)\n      VERIFY_IS_APPROX(m2.innerVector(j0)+m2.innerVector(j1), refMat2.row(j0)+refMat2.row(j1));\n    else\n      VERIFY_IS_APPROX(m2.innerVector(j0)+m2.innerVector(j1), refMat2.col(j0)+refMat2.col(j1));\n\n    SparseMatrixType m3(rows,rows);\n    m3.reserve(VectorXi::Constant(rows,rows/2));\n    for(Index j=0; j<rows; ++j)\n      for(Index k=0; k<j; ++k)\n        m3.insertByOuterInner(j,k) = k+1;\n    for(Index j=0; j<rows; ++j)\n    {\n      VERIFY(j==numext::real(m3.innerVector(j).nonZeros()));\n      if(j>0)\n        VERIFY(j==numext::real(m3.innerVector(j).lastCoeff()));\n    }\n    m3.makeCompressed();\n    for(Index j=0; j<rows; ++j)\n    {\n      VERIFY(j==numext::real(m3.innerVector(j).nonZeros()));\n      if(j>0)\n        VERIFY(j==numext::real(m3.innerVector(j).lastCoeff()));\n    }\n\n    //m2.innerVector(j0) = 2*m2.innerVector(j1);\n    //refMat2.col(j0) = 2*refMat2.col(j1);\n    //VERIFY_IS_APPROX(m2, refMat2);\n  }\n\n  // test innerVectors()\n  {\n    DenseMatrix refMat2 = DenseMatrix::Zero(rows, rows);\n    SparseMatrixType m2(rows, rows);\n    initSparse<Scalar>(density, refMat2, m2);\n    if(internal::random<float>(0,1)>0.5) m2.makeCompressed();\n    \n    Index j0 = internal::random<Index>(0,rows-2);\n    Index j1 = internal::random<Index>(0,rows-2);\n    Index n0 = internal::random<Index>(1,rows-(std::max)(j0,j1));\n    if(SparseMatrixType::IsRowMajor)\n      VERIFY_IS_APPROX(m2.innerVectors(j0,n0), refMat2.block(j0,0,n0,cols));\n    else\n      VERIFY_IS_APPROX(m2.innerVectors(j0,n0), refMat2.block(0,j0,rows,n0));\n    if(SparseMatrixType::IsRowMajor)\n      VERIFY_IS_APPROX(m2.innerVectors(j0,n0)+m2.innerVectors(j1,n0),\n                       refMat2.middleRows(j0,n0)+refMat2.middleRows(j1,n0));\n    else\n      VERIFY_IS_APPROX(m2.innerVectors(j0,n0)+m2.innerVectors(j1,n0),\n                      refMat2.block(0,j0,rows,n0)+refMat2.block(0,j1,rows,n0));\n    \n    VERIFY_IS_APPROX(m2, refMat2);\n    \n    m2.innerVectors(j0,n0) = m2.innerVectors(j0,n0) + m2.innerVectors(j1,n0);\n    if(SparseMatrixType::IsRowMajor)\n      refMat2.middleRows(j0,n0) = (refMat2.middleRows(j0,n0) + refMat2.middleRows(j1,n0)).eval();\n    else\n      refMat2.middleCols(j0,n0) = (refMat2.middleCols(j0,n0) + refMat2.middleCols(j1,n0)).eval();\n    \n    VERIFY_IS_APPROX(m2, refMat2);\n    \n  }\n  \n  // test basic computations\n  {\n    DenseMatrix refM1 = DenseMatrix::Zero(rows, rows);\n    DenseMatrix refM2 = DenseMatrix::Zero(rows, rows);\n    DenseMatrix refM3 = DenseMatrix::Zero(rows, rows);\n    DenseMatrix refM4 = DenseMatrix::Zero(rows, rows);\n    SparseMatrixType m1(rows, rows);\n    SparseMatrixType m2(rows, rows);\n    SparseMatrixType m3(rows, rows);\n    SparseMatrixType m4(rows, rows);\n    initSparse<Scalar>(density, refM1, m1);\n    initSparse<Scalar>(density, refM2, m2);\n    initSparse<Scalar>(density, refM3, m3);\n    initSparse<Scalar>(density, refM4, m4);\n\n    VERIFY_IS_APPROX(m1+m2, refM1+refM2);\n    VERIFY_IS_APPROX(m1+m2+m3, refM1+refM2+refM3);\n    VERIFY_IS_APPROX(m3.cwiseProduct(m1+m2), refM3.cwiseProduct(refM1+refM2));\n    VERIFY_IS_APPROX(m1*s1-m2, refM1*s1-refM2);\n\n    VERIFY_IS_APPROX(m1*=s1, refM1*=s1);\n    VERIFY_IS_APPROX(m1/=s1, refM1/=s1);\n\n    VERIFY_IS_APPROX(m1+=m2, refM1+=refM2);\n    VERIFY_IS_APPROX(m1-=m2, refM1-=refM2);\n\n    if(SparseMatrixType::IsRowMajor)\n      VERIFY_IS_APPROX(m1.innerVector(0).dot(refM2.row(0)), refM1.row(0).dot(refM2.row(0)));\n    else\n      VERIFY_IS_APPROX(m1.innerVector(0).dot(refM2.row(0)), refM1.col(0).dot(refM2.row(0)));\n\n    VERIFY_IS_APPROX(m1.conjugate(), refM1.conjugate());\n    VERIFY_IS_APPROX(m1.real(), refM1.real());\n\n    refM4.setRandom();\n    // sparse cwise* dense\n    VERIFY_IS_APPROX(m3.cwiseProduct(refM4), refM3.cwiseProduct(refM4));\n    // dense cwise* sparse\n    VERIFY_IS_APPROX(refM4.cwiseProduct(m3), refM4.cwiseProduct(refM3));\n//     VERIFY_IS_APPROX(m3.cwise()/refM4, refM3.cwise()/refM4);\n\n    // test aliasing\n    VERIFY_IS_APPROX((m1 = -m1), (refM1 = -refM1));\n    VERIFY_IS_APPROX((m1 = m1.transpose()), (refM1 = refM1.transpose().eval()));\n    VERIFY_IS_APPROX((m1 = -m1.transpose()), (refM1 = -refM1.transpose().eval()));\n    VERIFY_IS_APPROX((m1 += -m1), (refM1 += -refM1));\n  }\n\n  // test transpose\n  {\n    DenseMatrix refMat2 = DenseMatrix::Zero(rows, rows);\n    SparseMatrixType m2(rows, rows);\n    initSparse<Scalar>(density, refMat2, m2);\n    VERIFY_IS_APPROX(m2.transpose().eval(), refMat2.transpose().eval());\n    VERIFY_IS_APPROX(m2.transpose(), refMat2.transpose());\n\n    VERIFY_IS_APPROX(SparseMatrixType(m2.adjoint()), refMat2.adjoint());\n  }\n\n  \n  \n  // test generic blocks\n  {\n    DenseMatrix refMat2 = DenseMatrix::Zero(rows, rows);\n    SparseMatrixType m2(rows, rows);\n    initSparse<Scalar>(density, refMat2, m2);\n    Index j0 = internal::random<Index>(0,rows-2);\n    Index j1 = internal::random<Index>(0,rows-2);\n    Index n0 = internal::random<Index>(1,rows-(std::max)(j0,j1));\n    if(SparseMatrixType::IsRowMajor)\n      VERIFY_IS_APPROX(m2.block(j0,0,n0,cols), refMat2.block(j0,0,n0,cols));\n    else\n      VERIFY_IS_APPROX(m2.block(0,j0,rows,n0), refMat2.block(0,j0,rows,n0));\n    \n    if(SparseMatrixType::IsRowMajor)\n      VERIFY_IS_APPROX(m2.block(j0,0,n0,cols)+m2.block(j1,0,n0,cols),\n                      refMat2.block(j0,0,n0,cols)+refMat2.block(j1,0,n0,cols));\n    else\n      VERIFY_IS_APPROX(m2.block(0,j0,rows,n0)+m2.block(0,j1,rows,n0),\n                      refMat2.block(0,j0,rows,n0)+refMat2.block(0,j1,rows,n0));\n      \n    Index i = internal::random<Index>(0,m2.outerSize()-1);\n    if(SparseMatrixType::IsRowMajor) {\n      m2.innerVector(i) = m2.innerVector(i) * s1;\n      refMat2.row(i) = refMat2.row(i) * s1;\n      VERIFY_IS_APPROX(m2,refMat2);\n    } else {\n      m2.innerVector(i) = m2.innerVector(i) * s1;\n      refMat2.col(i) = refMat2.col(i) * s1;\n      VERIFY_IS_APPROX(m2,refMat2);\n    }\n    \n    VERIFY_IS_APPROX(DenseVector(m2.col(j0)), refMat2.col(j0));\n    VERIFY_IS_APPROX(m2.col(j0), refMat2.col(j0));\n    \n    VERIFY_IS_APPROX(RowDenseVector(m2.row(j0)), refMat2.row(j0));\n    VERIFY_IS_APPROX(m2.row(j0), refMat2.row(j0));\n    \n    VERIFY_IS_APPROX(m2.block(j0,j1,n0,n0), refMat2.block(j0,j1,n0,n0));\n    VERIFY_IS_APPROX((2*m2).block(j0,j1,n0,n0), (2*refMat2).block(j0,j1,n0,n0));\n  }\n\n  // test prune\n  {\n    SparseMatrixType m2(rows, rows);\n    DenseMatrix refM2(rows, rows);\n    refM2.setZero();\n    int countFalseNonZero = 0;\n    int countTrueNonZero = 0;\n    for (Index j=0; j<m2.outerSize(); ++j)\n    {\n      m2.startVec(j);\n      for (Index i=0; i<m2.innerSize(); ++i)\n      {\n        float x = internal::random<float>(0,1);\n        if (x<0.1)\n        {\n          // do nothing\n        }\n        else if (x<0.5)\n        {\n          countFalseNonZero++;\n          m2.insertBackByOuterInner(j,i) = Scalar(0);\n        }\n        else\n        {\n          countTrueNonZero++;\n          m2.insertBackByOuterInner(j,i) = Scalar(1);\n          if(SparseMatrixType::IsRowMajor)\n            refM2(j,i) = Scalar(1);\n          else\n            refM2(i,j) = Scalar(1);\n        }\n      }\n    }\n    m2.finalize();\n    VERIFY(countFalseNonZero+countTrueNonZero == m2.nonZeros());\n    VERIFY_IS_APPROX(m2, refM2);\n    m2.prune(Scalar(1));\n    VERIFY(countTrueNonZero==m2.nonZeros());\n    VERIFY_IS_APPROX(m2, refM2);\n  }\n\n  // test setFromTriplets\n  {\n    typedef Triplet<Scalar,Index> TripletType;\n    std::vector<TripletType> triplets;\n    int ntriplets = rows*cols;\n    triplets.reserve(ntriplets);\n    DenseMatrix refMat(rows,cols);\n    refMat.setZero();\n    for(int i=0;i<ntriplets;++i)\n    {\n      Index r = internal::random<Index>(0,rows-1);\n      Index c = internal::random<Index>(0,cols-1);\n      Scalar v = internal::random<Scalar>();\n      triplets.push_back(TripletType(r,c,v));\n      refMat(r,c) += v;\n    }\n    SparseMatrixType m(rows,cols);\n    m.setFromTriplets(triplets.begin(), triplets.end());\n    VERIFY_IS_APPROX(m, refMat);\n  }\n\n  // test triangularView\n  {\n    DenseMatrix refMat2(rows, rows), refMat3(rows, rows);\n    SparseMatrixType m2(rows, rows), m3(rows, rows);\n    initSparse<Scalar>(density, refMat2, m2);\n    refMat3 = refMat2.template triangularView<Lower>();\n    m3 = m2.template triangularView<Lower>();\n    VERIFY_IS_APPROX(m3, refMat3);\n\n    refMat3 = refMat2.template triangularView<Upper>();\n    m3 = m2.template triangularView<Upper>();\n    VERIFY_IS_APPROX(m3, refMat3);\n\n    refMat3 = refMat2.template triangularView<UnitUpper>();\n    m3 = m2.template triangularView<UnitUpper>();\n    VERIFY_IS_APPROX(m3, refMat3);\n\n    refMat3 = refMat2.template triangularView<UnitLower>();\n    m3 = m2.template triangularView<UnitLower>();\n    VERIFY_IS_APPROX(m3, refMat3);\n\n    refMat3 = refMat2.template triangularView<StrictlyUpper>();\n    m3 = m2.template triangularView<StrictlyUpper>();\n    VERIFY_IS_APPROX(m3, refMat3);\n\n    refMat3 = refMat2.template triangularView<StrictlyLower>();\n    m3 = m2.template triangularView<StrictlyLower>();\n    VERIFY_IS_APPROX(m3, refMat3);\n  }\n  \n  // test selfadjointView\n  if(!SparseMatrixType::IsRowMajor)\n  {\n    DenseMatrix refMat2(rows, rows), refMat3(rows, rows);\n    SparseMatrixType m2(rows, rows), m3(rows, rows);\n    initSparse<Scalar>(density, refMat2, m2);\n    refMat3 = refMat2.template selfadjointView<Lower>();\n    m3 = m2.template selfadjointView<Lower>();\n    VERIFY_IS_APPROX(m3, refMat3);\n  }\n  \n  // test sparseView\n  {\n    DenseMatrix refMat2 = DenseMatrix::Zero(rows, rows);\n    SparseMatrixType m2(rows, rows);\n    initSparse<Scalar>(density, refMat2, m2);\n    VERIFY_IS_APPROX(m2.eval(), refMat2.sparseView().eval());\n  }\n\n  // test diagonal\n  {\n    DenseMatrix refMat2 = DenseMatrix::Zero(rows, rows);\n    SparseMatrixType m2(rows, rows);\n    initSparse<Scalar>(density, refMat2, m2);\n    VERIFY_IS_APPROX(m2.diagonal(), refMat2.diagonal().eval());\n  }\n  \n  // test conservative resize\n  {\n      std::vector< std::pair<Index,Index> > inc;\n      inc.push_back(std::pair<Index,Index>(-3,-2));\n      inc.push_back(std::pair<Index,Index>(0,0));\n      inc.push_back(std::pair<Index,Index>(3,2));\n      inc.push_back(std::pair<Index,Index>(3,0));\n      inc.push_back(std::pair<Index,Index>(0,3));\n      \n      for(size_t i = 0; i< inc.size(); i++) {\n        Index incRows = inc[i].first;\n        Index incCols = inc[i].second;\n        SparseMatrixType m1(rows, cols);\n        DenseMatrix refMat1 = DenseMatrix::Zero(rows, cols);\n        initSparse<Scalar>(density, refMat1, m1);\n        \n        m1.conservativeResize(rows+incRows, cols+incCols);\n        refMat1.conservativeResize(rows+incRows, cols+incCols);\n        if (incRows > 0) refMat1.bottomRows(incRows).setZero();\n        if (incCols > 0) refMat1.rightCols(incCols).setZero();\n        \n        VERIFY_IS_APPROX(m1, refMat1);\n        \n        // Insert new values\n        if (incRows > 0) \n          m1.insert(m1.rows()-1, 0) = refMat1(refMat1.rows()-1, 0) = 1;\n        if (incCols > 0) \n          m1.insert(0, m1.cols()-1) = refMat1(0, refMat1.cols()-1) = 1;\n          \n        VERIFY_IS_APPROX(m1, refMat1);\n          \n          \n      }\n  }\n\n  // test Identity matrix\n  {\n    DenseMatrix refMat1 = DenseMatrix::Identity(rows, rows);\n    SparseMatrixType m1(rows, rows);\n    m1.setIdentity();\n    VERIFY_IS_APPROX(m1, refMat1);\n    for(int k=0; k<rows*rows/4; ++k)\n    {\n      Index i = internal::random<Index>(0,rows-1);\n      Index j = internal::random<Index>(0,rows-1);\n      Scalar v = internal::random<Scalar>();\n      m1.coeffRef(i,j) = v;\n      refMat1.coeffRef(i,j) = v;\n      VERIFY_IS_APPROX(m1, refMat1);\n      if(internal::random<Index>(0,10)<2)\n        m1.makeCompressed();\n    }\n    m1.setIdentity();\n    refMat1.setIdentity();\n    VERIFY_IS_APPROX(m1, refMat1);\n  }\n}\n\nvoid test_sparse_basic()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    int s = Eigen::internal::random<int>(1,50);\n    EIGEN_UNUSED_VARIABLE(s);\n    CALL_SUBTEST_1(( sparse_basic(SparseMatrix<double>(8, 8)) ));\n    CALL_SUBTEST_2(( sparse_basic(SparseMatrix<std::complex<double>, ColMajor>(s, s)) ));\n    CALL_SUBTEST_2(( sparse_basic(SparseMatrix<std::complex<double>, RowMajor>(s, s)) ));\n    CALL_SUBTEST_1(( sparse_basic(SparseMatrix<double>(s, s)) ));\n    CALL_SUBTEST_1(( sparse_basic(SparseMatrix<double,ColMajor,long int>(s, s)) ));\n    CALL_SUBTEST_1(( sparse_basic(SparseMatrix<double,RowMajor,long int>(s, s)) ));\n    \n    CALL_SUBTEST_1(( sparse_basic(SparseMatrix<double,ColMajor,short int>(short(s), short(s))) ));\n    CALL_SUBTEST_1(( sparse_basic(SparseMatrix<double,RowMajor,short int>(short(s), short(s))) ));\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/sparse_permutations.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2011 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"sparse.h\"\n\ntemplate<int OtherStorage, typename SparseMatrixType> void sparse_permutations(const SparseMatrixType& ref)\n{\n  typedef typename SparseMatrixType::Index Index;\n\n  const Index rows = ref.rows();\n  const Index cols = ref.cols();\n  typedef typename SparseMatrixType::Scalar Scalar;\n  typedef typename SparseMatrixType::Index Index;\n  typedef SparseMatrix<Scalar, OtherStorage, Index> OtherSparseMatrixType;\n  typedef Matrix<Scalar,Dynamic,Dynamic> DenseMatrix;\n  typedef Matrix<Index,Dynamic,1> VectorI;\n  \n  double density = (std::max)(8./(rows*cols), 0.01);\n  \n  SparseMatrixType mat(rows, cols), up(rows,cols), lo(rows,cols);\n  OtherSparseMatrixType res;\n  DenseMatrix mat_d = DenseMatrix::Zero(rows, cols), up_sym_d, lo_sym_d, res_d;\n  \n  initSparse<Scalar>(density, mat_d, mat, 0);\n\n  up = mat.template triangularView<Upper>();\n  lo = mat.template triangularView<Lower>();\n  \n  up_sym_d = mat_d.template selfadjointView<Upper>();\n  lo_sym_d = mat_d.template selfadjointView<Lower>();\n  \n  VERIFY_IS_APPROX(mat, mat_d);\n  VERIFY_IS_APPROX(up, DenseMatrix(mat_d.template triangularView<Upper>()));\n  VERIFY_IS_APPROX(lo, DenseMatrix(mat_d.template triangularView<Lower>()));\n  \n  PermutationMatrix<Dynamic> p, p_null;\n  VectorI pi;\n  randomPermutationVector(pi, cols);\n  p.indices() = pi;\n\n  res = mat*p;\n  res_d = mat_d*p;\n  VERIFY(res.isApprox(res_d) && \"mat*p\");\n\n  res = p*mat;\n  res_d = p*mat_d;\n  VERIFY(res.isApprox(res_d) && \"p*mat\");\n\n  res = mat*p.inverse();\n  res_d = mat*p.inverse();\n  VERIFY(res.isApprox(res_d) && \"mat*inv(p)\");\n\n  res = p.inverse()*mat;\n  res_d = p.inverse()*mat_d;\n  VERIFY(res.isApprox(res_d) && \"inv(p)*mat\");\n\n  res = mat.twistedBy(p);\n  res_d = (p * mat_d) * p.inverse();\n  VERIFY(res.isApprox(res_d) && \"p*mat*inv(p)\");\n\n  \n  res = mat.template selfadjointView<Upper>().twistedBy(p_null);\n  res_d = up_sym_d;\n  VERIFY(res.isApprox(res_d) && \"full selfadjoint upper to full\");\n  \n  res = mat.template selfadjointView<Lower>().twistedBy(p_null);\n  res_d = lo_sym_d;\n  VERIFY(res.isApprox(res_d) && \"full selfadjoint lower to full\");\n  \n  \n  res = up.template selfadjointView<Upper>().twistedBy(p_null);\n  res_d = up_sym_d;\n  VERIFY(res.isApprox(res_d) && \"upper selfadjoint to full\");\n  \n  res = lo.template selfadjointView<Lower>().twistedBy(p_null);\n  res_d = lo_sym_d;\n  VERIFY(res.isApprox(res_d) && \"lower selfadjoint full\");\n\n\n  res = mat.template selfadjointView<Upper>();\n  res_d = up_sym_d;\n  VERIFY(res.isApprox(res_d) && \"full selfadjoint upper to full\");\n\n  res = mat.template selfadjointView<Lower>();\n  res_d = lo_sym_d;\n  VERIFY(res.isApprox(res_d) && \"full selfadjoint lower to full\");\n\n  res = up.template selfadjointView<Upper>();\n  res_d = up_sym_d;\n  VERIFY(res.isApprox(res_d) && \"upper selfadjoint to full\");\n\n  res = lo.template selfadjointView<Lower>();\n  res_d = lo_sym_d;\n  VERIFY(res.isApprox(res_d) && \"lower selfadjoint full\");\n\n\n  res.template selfadjointView<Upper>() = mat.template selfadjointView<Upper>();\n  res_d = up_sym_d.template triangularView<Upper>();\n  VERIFY(res.isApprox(res_d) && \"full selfadjoint upper to upper\");\n\n  res.template selfadjointView<Lower>() = mat.template selfadjointView<Upper>();\n  res_d = up_sym_d.template triangularView<Lower>();\n  VERIFY(res.isApprox(res_d) && \"full selfadjoint upper to lower\");\n\n  res.template selfadjointView<Upper>() = mat.template selfadjointView<Lower>();\n  res_d = lo_sym_d.template triangularView<Upper>();\n  VERIFY(res.isApprox(res_d) && \"full selfadjoint lower to upper\");\n\n  res.template selfadjointView<Lower>() = mat.template selfadjointView<Lower>();\n  res_d = lo_sym_d.template triangularView<Lower>();\n  VERIFY(res.isApprox(res_d) && \"full selfadjoint lower to lower\");\n\n  \n  \n  res.template selfadjointView<Upper>() = mat.template selfadjointView<Upper>().twistedBy(p);\n  res_d = ((p * up_sym_d) * p.inverse()).eval().template triangularView<Upper>();\n  VERIFY(res.isApprox(res_d) && \"full selfadjoint upper twisted to upper\");\n  \n  res.template selfadjointView<Upper>() = mat.template selfadjointView<Lower>().twistedBy(p);\n  res_d = ((p * lo_sym_d) * p.inverse()).eval().template triangularView<Upper>();\n  VERIFY(res.isApprox(res_d) && \"full selfadjoint lower twisted to upper\");\n  \n  res.template selfadjointView<Lower>() = mat.template selfadjointView<Lower>().twistedBy(p);\n  res_d = ((p * lo_sym_d) * p.inverse()).eval().template triangularView<Lower>();\n  VERIFY(res.isApprox(res_d) && \"full selfadjoint lower twisted to lower\");\n  \n  res.template selfadjointView<Lower>() = mat.template selfadjointView<Upper>().twistedBy(p);\n  res_d = ((p * up_sym_d) * p.inverse()).eval().template triangularView<Lower>();\n  VERIFY(res.isApprox(res_d) && \"full selfadjoint upper twisted to lower\");\n  \n  \n  res.template selfadjointView<Upper>() = up.template selfadjointView<Upper>().twistedBy(p);\n  res_d = ((p * up_sym_d) * p.inverse()).eval().template triangularView<Upper>();\n  VERIFY(res.isApprox(res_d) && \"upper selfadjoint twisted to upper\");\n  \n  res.template selfadjointView<Upper>() = lo.template selfadjointView<Lower>().twistedBy(p);\n  res_d = ((p * lo_sym_d) * p.inverse()).eval().template triangularView<Upper>();\n  VERIFY(res.isApprox(res_d) && \"lower selfadjoint twisted to upper\");\n  \n  res.template selfadjointView<Lower>() = lo.template selfadjointView<Lower>().twistedBy(p);\n  res_d = ((p * lo_sym_d) * p.inverse()).eval().template triangularView<Lower>();\n  VERIFY(res.isApprox(res_d) && \"lower selfadjoint twisted to lower\");\n  \n  res.template selfadjointView<Lower>() = up.template selfadjointView<Upper>().twistedBy(p);\n  res_d = ((p * up_sym_d) * p.inverse()).eval().template triangularView<Lower>();\n  VERIFY(res.isApprox(res_d) && \"upper selfadjoint twisted to lower\");\n\n  \n  res = mat.template selfadjointView<Upper>().twistedBy(p);\n  res_d = (p * up_sym_d) * p.inverse();\n  VERIFY(res.isApprox(res_d) && \"full selfadjoint upper twisted to full\");\n  \n  res = mat.template selfadjointView<Lower>().twistedBy(p);\n  res_d = (p * lo_sym_d) * p.inverse();\n  VERIFY(res.isApprox(res_d) && \"full selfadjoint lower twisted to full\");\n  \n  res = up.template selfadjointView<Upper>().twistedBy(p);\n  res_d = (p * up_sym_d) * p.inverse();\n  VERIFY(res.isApprox(res_d) && \"upper selfadjoint twisted to full\");\n  \n  res = lo.template selfadjointView<Lower>().twistedBy(p);\n  res_d = (p * lo_sym_d) * p.inverse();\n  VERIFY(res.isApprox(res_d) && \"lower selfadjoint twisted to full\");\n}\n\ntemplate<typename Scalar> void sparse_permutations_all(int size)\n{\n  CALL_SUBTEST(( sparse_permutations<ColMajor>(SparseMatrix<Scalar, ColMajor>(size,size)) ));\n  CALL_SUBTEST(( sparse_permutations<ColMajor>(SparseMatrix<Scalar, RowMajor>(size,size)) ));\n  CALL_SUBTEST(( sparse_permutations<RowMajor>(SparseMatrix<Scalar, ColMajor>(size,size)) ));\n  CALL_SUBTEST(( sparse_permutations<RowMajor>(SparseMatrix<Scalar, RowMajor>(size,size)) ));\n}\n\nvoid test_sparse_permutations()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    int s = Eigen::internal::random<int>(1,50);\n    CALL_SUBTEST_1((  sparse_permutations_all<double>(s) ));\n    CALL_SUBTEST_2((  sparse_permutations_all<std::complex<double> >(s) ));\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/sparse_product.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2011 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"sparse.h\"\n\ntemplate<typename SparseMatrixType, typename DenseMatrix, bool IsRowMajor=SparseMatrixType::IsRowMajor> struct test_outer;\n\ntemplate<typename SparseMatrixType, typename DenseMatrix> struct test_outer<SparseMatrixType,DenseMatrix,false> {\n  static void run(SparseMatrixType& m2, SparseMatrixType& m4, DenseMatrix& refMat2, DenseMatrix& refMat4) {\n    typedef typename SparseMatrixType::Index Index;\n    Index c  = internal::random<Index>(0,m2.cols()-1);\n    Index c1 = internal::random<Index>(0,m2.cols()-1);\n    VERIFY_IS_APPROX(m4=m2.col(c)*refMat2.col(c1).transpose(), refMat4=refMat2.col(c)*refMat2.col(c1).transpose());\n    VERIFY_IS_APPROX(m4=refMat2.col(c1)*m2.col(c).transpose(), refMat4=refMat2.col(c1)*refMat2.col(c).transpose());\n  }\n};\n\ntemplate<typename SparseMatrixType, typename DenseMatrix> struct test_outer<SparseMatrixType,DenseMatrix,true> {\n  static void run(SparseMatrixType& m2, SparseMatrixType& m4, DenseMatrix& refMat2, DenseMatrix& refMat4) {\n    typedef typename SparseMatrixType::Index Index;\n    Index r  = internal::random<Index>(0,m2.rows()-1);\n    Index c1 = internal::random<Index>(0,m2.cols()-1);\n    VERIFY_IS_APPROX(m4=m2.row(r).transpose()*refMat2.col(c1).transpose(), refMat4=refMat2.row(r).transpose()*refMat2.col(c1).transpose());\n    VERIFY_IS_APPROX(m4=refMat2.col(c1)*m2.row(r), refMat4=refMat2.col(c1)*refMat2.row(r));\n  }\n};\n\n// (m2,m4,refMat2,refMat4,dv1);\n//     VERIFY_IS_APPROX(m4=m2.innerVector(c)*dv1.transpose(), refMat4=refMat2.colVector(c)*dv1.transpose());\n//     VERIFY_IS_APPROX(m4=dv1*mcm.col(c).transpose(), refMat4=dv1*refMat2.col(c).transpose());\n\ntemplate<typename SparseMatrixType> void sparse_product()\n{\n  typedef typename SparseMatrixType::Index Index;\n  Index n = 100;\n  const Index rows  = internal::random<Index>(1,n);\n  const Index cols  = internal::random<Index>(1,n);\n  const Index depth = internal::random<Index>(1,n);\n  typedef typename SparseMatrixType::Scalar Scalar;\n  enum { Flags = SparseMatrixType::Flags };\n\n  double density = (std::max)(8./(rows*cols), 0.1);\n  typedef Matrix<Scalar,Dynamic,Dynamic> DenseMatrix;\n  typedef Matrix<Scalar,Dynamic,1> DenseVector;\n  typedef Matrix<Scalar,1,Dynamic> RowDenseVector;\n  typedef SparseVector<Scalar,0,Index> ColSpVector;\n  typedef SparseVector<Scalar,RowMajor,Index> RowSpVector;\n\n  Scalar s1 = internal::random<Scalar>();\n  Scalar s2 = internal::random<Scalar>();\n\n  // test matrix-matrix product\n  {\n    DenseMatrix refMat2  = DenseMatrix::Zero(rows, depth);\n    DenseMatrix refMat2t = DenseMatrix::Zero(depth, rows);\n    DenseMatrix refMat3  = DenseMatrix::Zero(depth, cols);\n    DenseMatrix refMat3t = DenseMatrix::Zero(cols, depth);\n    DenseMatrix refMat4  = DenseMatrix::Zero(rows, cols);\n    DenseMatrix refMat4t = DenseMatrix::Zero(cols, rows);\n    DenseMatrix refMat5  = DenseMatrix::Random(depth, cols);\n    DenseMatrix refMat6  = DenseMatrix::Random(rows, rows);\n    DenseMatrix dm4 = DenseMatrix::Zero(rows, rows);\n//     DenseVector dv1 = DenseVector::Random(rows);\n    SparseMatrixType m2 (rows, depth);\n    SparseMatrixType m2t(depth, rows);\n    SparseMatrixType m3 (depth, cols);\n    SparseMatrixType m3t(cols, depth);\n    SparseMatrixType m4 (rows, cols);\n    SparseMatrixType m4t(cols, rows);\n    SparseMatrixType m6(rows, rows);\n    initSparse(density, refMat2,  m2);\n    initSparse(density, refMat2t, m2t);\n    initSparse(density, refMat3,  m3);\n    initSparse(density, refMat3t, m3t);\n    initSparse(density, refMat4,  m4);\n    initSparse(density, refMat4t, m4t);\n    initSparse(density, refMat6, m6);\n\n//     int c = internal::random<int>(0,depth-1);\n\n    // sparse * sparse\n    VERIFY_IS_APPROX(m4=m2*m3, refMat4=refMat2*refMat3);\n    VERIFY_IS_APPROX(m4=m2t.transpose()*m3, refMat4=refMat2t.transpose()*refMat3);\n    VERIFY_IS_APPROX(m4=m2t.transpose()*m3t.transpose(), refMat4=refMat2t.transpose()*refMat3t.transpose());\n    VERIFY_IS_APPROX(m4=m2*m3t.transpose(), refMat4=refMat2*refMat3t.transpose());\n\n    VERIFY_IS_APPROX(m4 = m2*m3/s1, refMat4 = refMat2*refMat3/s1);\n    VERIFY_IS_APPROX(m4 = m2*m3*s1, refMat4 = refMat2*refMat3*s1);\n    VERIFY_IS_APPROX(m4 = s2*m2*m3*s1, refMat4 = s2*refMat2*refMat3*s1);\n\n    VERIFY_IS_APPROX(m4=(m2*m3).pruned(0), refMat4=refMat2*refMat3);\n    VERIFY_IS_APPROX(m4=(m2t.transpose()*m3).pruned(0), refMat4=refMat2t.transpose()*refMat3);\n    VERIFY_IS_APPROX(m4=(m2t.transpose()*m3t.transpose()).pruned(0), refMat4=refMat2t.transpose()*refMat3t.transpose());\n    VERIFY_IS_APPROX(m4=(m2*m3t.transpose()).pruned(0), refMat4=refMat2*refMat3t.transpose());\n\n    // test aliasing\n    m4 = m2; refMat4 = refMat2;\n    VERIFY_IS_APPROX(m4=m4*m3, refMat4=refMat4*refMat3);\n\n    // sparse * dense\n    VERIFY_IS_APPROX(dm4=m2*refMat3, refMat4=refMat2*refMat3);\n    VERIFY_IS_APPROX(dm4=m2*refMat3t.transpose(), refMat4=refMat2*refMat3t.transpose());\n    VERIFY_IS_APPROX(dm4=m2t.transpose()*refMat3, refMat4=refMat2t.transpose()*refMat3);\n    VERIFY_IS_APPROX(dm4=m2t.transpose()*refMat3t.transpose(), refMat4=refMat2t.transpose()*refMat3t.transpose());\n\n    VERIFY_IS_APPROX(dm4=m2*(refMat3+refMat3), refMat4=refMat2*(refMat3+refMat3));\n    VERIFY_IS_APPROX(dm4=m2t.transpose()*(refMat3+refMat5)*0.5, refMat4=refMat2t.transpose()*(refMat3+refMat5)*0.5);\n\n    // dense * sparse\n    VERIFY_IS_APPROX(dm4=refMat2*m3, refMat4=refMat2*refMat3);\n    VERIFY_IS_APPROX(dm4=refMat2*m3t.transpose(), refMat4=refMat2*refMat3t.transpose());\n    VERIFY_IS_APPROX(dm4=refMat2t.transpose()*m3, refMat4=refMat2t.transpose()*refMat3);\n    VERIFY_IS_APPROX(dm4=refMat2t.transpose()*m3t.transpose(), refMat4=refMat2t.transpose()*refMat3t.transpose());\n\n    // sparse * dense and dense * sparse outer product\n    test_outer<SparseMatrixType,DenseMatrix>::run(m2,m4,refMat2,refMat4);\n\n    VERIFY_IS_APPROX(m6=m6*m6, refMat6=refMat6*refMat6);\n    \n    // sparse matrix * sparse vector\n    ColSpVector cv0(cols), cv1;\n    DenseVector dcv0(cols), dcv1;\n    initSparse(2*density,dcv0, cv0);\n    \n    RowSpVector rv0(depth), rv1;\n    RowDenseVector drv0(depth), drv1(rv1);\n    initSparse(2*density,drv0, rv0);\n    \n    VERIFY_IS_APPROX(cv1=rv0*m3, dcv1=drv0*refMat3);\n    VERIFY_IS_APPROX(rv1=rv0*m3, drv1=drv0*refMat3);\n    VERIFY_IS_APPROX(cv1=m3*cv0, dcv1=refMat3*dcv0);\n    VERIFY_IS_APPROX(cv1=m3t.adjoint()*cv0, dcv1=refMat3t.adjoint()*dcv0);\n    VERIFY_IS_APPROX(rv1=m3*cv0, drv1=refMat3*dcv0);\n  }\n  \n  // test matrix - diagonal product\n  {\n    DenseMatrix refM2 = DenseMatrix::Zero(rows, cols);\n    DenseMatrix refM3 = DenseMatrix::Zero(rows, cols);\n    DenseMatrix d3 = DenseMatrix::Zero(rows, cols);\n    DiagonalMatrix<Scalar,Dynamic> d1(DenseVector::Random(cols));\n    DiagonalMatrix<Scalar,Dynamic> d2(DenseVector::Random(rows));\n    SparseMatrixType m2(rows, cols);\n    SparseMatrixType m3(rows, cols);\n    initSparse<Scalar>(density, refM2, m2);\n    initSparse<Scalar>(density, refM3, m3);\n    VERIFY_IS_APPROX(m3=m2*d1, refM3=refM2*d1);\n    VERIFY_IS_APPROX(m3=m2.transpose()*d2, refM3=refM2.transpose()*d2);\n    VERIFY_IS_APPROX(m3=d2*m2, refM3=d2*refM2);\n    VERIFY_IS_APPROX(m3=d1*m2.transpose(), refM3=d1*refM2.transpose());\n    \n    // also check with a SparseWrapper:\n    DenseVector v1 = DenseVector::Random(cols);\n    DenseVector v2 = DenseVector::Random(rows);\n    VERIFY_IS_APPROX(m3=m2*v1.asDiagonal(), refM3=refM2*v1.asDiagonal());\n    VERIFY_IS_APPROX(m3=m2.transpose()*v2.asDiagonal(), refM3=refM2.transpose()*v2.asDiagonal());\n    VERIFY_IS_APPROX(m3=v2.asDiagonal()*m2, refM3=v2.asDiagonal()*refM2);\n    VERIFY_IS_APPROX(m3=v1.asDiagonal()*m2.transpose(), refM3=v1.asDiagonal()*refM2.transpose());\n    \n    VERIFY_IS_APPROX(m3=v2.asDiagonal()*m2*v1.asDiagonal(), refM3=v2.asDiagonal()*refM2*v1.asDiagonal());\n    \n    // evaluate to a dense matrix to check the .row() and .col() iterator functions\n    VERIFY_IS_APPROX(d3=m2*d1, refM3=refM2*d1);\n    VERIFY_IS_APPROX(d3=m2.transpose()*d2, refM3=refM2.transpose()*d2);\n    VERIFY_IS_APPROX(d3=d2*m2, refM3=d2*refM2);\n    VERIFY_IS_APPROX(d3=d1*m2.transpose(), refM3=d1*refM2.transpose());\n  }\n\n  // test self adjoint products\n  {\n    DenseMatrix b = DenseMatrix::Random(rows, rows);\n    DenseMatrix x = DenseMatrix::Random(rows, rows);\n    DenseMatrix refX = DenseMatrix::Random(rows, rows);\n    DenseMatrix refUp = DenseMatrix::Zero(rows, rows);\n    DenseMatrix refLo = DenseMatrix::Zero(rows, rows);\n    DenseMatrix refS = DenseMatrix::Zero(rows, rows);\n    SparseMatrixType mUp(rows, rows);\n    SparseMatrixType mLo(rows, rows);\n    SparseMatrixType mS(rows, rows);\n    do {\n      initSparse<Scalar>(density, refUp, mUp, ForceRealDiag|/*ForceNonZeroDiag|*/MakeUpperTriangular);\n    } while (refUp.isZero());\n    refLo = refUp.adjoint();\n    mLo = mUp.adjoint();\n    refS = refUp + refLo;\n    refS.diagonal() *= 0.5;\n    mS = mUp + mLo;\n    // TODO be able to address the diagonal....\n    for (int k=0; k<mS.outerSize(); ++k)\n      for (typename SparseMatrixType::InnerIterator it(mS,k); it; ++it)\n        if (it.index() == k)\n          it.valueRef() *= 0.5;\n\n    VERIFY_IS_APPROX(refS.adjoint(), refS);\n    VERIFY_IS_APPROX(mS.adjoint(), mS);\n    VERIFY_IS_APPROX(mS, refS);\n    VERIFY_IS_APPROX(x=mS*b, refX=refS*b);\n\n    VERIFY_IS_APPROX(x=mUp.template selfadjointView<Upper>()*b, refX=refS*b);\n    VERIFY_IS_APPROX(x=mLo.template selfadjointView<Lower>()*b, refX=refS*b);\n    VERIFY_IS_APPROX(x=mS.template selfadjointView<Upper|Lower>()*b, refX=refS*b);\n    \n    // sparse selfadjointView * sparse \n    SparseMatrixType mSres(rows,rows);\n    VERIFY_IS_APPROX(mSres = mLo.template selfadjointView<Lower>()*mS,\n                     refX = refLo.template selfadjointView<Lower>()*refS);\n    // sparse * sparse selfadjointview\n    VERIFY_IS_APPROX(mSres = mS * mLo.template selfadjointView<Lower>(),\n                     refX = refS * refLo.template selfadjointView<Lower>());\n  }\n  \n}\n\n// New test for Bug in SparseTimeDenseProduct\ntemplate<typename SparseMatrixType, typename DenseMatrixType> void sparse_product_regression_test()\n{\n  // This code does not compile with afflicted versions of the bug\n  SparseMatrixType sm1(3,2);\n  DenseMatrixType m2(2,2);\n  sm1.setZero();\n  m2.setZero();\n\n  DenseMatrixType m3 = sm1*m2;\n\n\n  // This code produces a segfault with afflicted versions of another SparseTimeDenseProduct\n  // bug\n\n  SparseMatrixType sm2(20000,2);\n  sm2.setZero();\n  DenseMatrixType m4(sm2*m2);\n\n  VERIFY_IS_APPROX( m4(0,0), 0.0 );\n}\n\nvoid test_sparse_product()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( (sparse_product<SparseMatrix<double,ColMajor> >()) );\n    CALL_SUBTEST_1( (sparse_product<SparseMatrix<double,RowMajor> >()) );\n    CALL_SUBTEST_2( (sparse_product<SparseMatrix<std::complex<double>, ColMajor > >()) );\n    CALL_SUBTEST_2( (sparse_product<SparseMatrix<std::complex<double>, RowMajor > >()) );\n    CALL_SUBTEST_3( (sparse_product<SparseMatrix<float,ColMajor,long int> >()) );\n    CALL_SUBTEST_4( (sparse_product_regression_test<SparseMatrix<double,RowMajor>, Matrix<double, Dynamic, Dynamic, RowMajor> >()) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/sparse_solver.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2011 Gael Guennebaud <g.gael@free.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"sparse.h\"\n#include <Eigen/SparseCore>\n\ntemplate<typename Solver, typename Rhs, typename DenseMat, typename DenseRhs>\nvoid check_sparse_solving(Solver& solver, const typename Solver::MatrixType& A, const Rhs& b, const DenseMat& dA, const DenseRhs& db)\n{\n  typedef typename Solver::MatrixType Mat;\n  typedef typename Mat::Scalar Scalar;\n\n  DenseRhs refX = dA.lu().solve(db);\n  {\n    Rhs x(b.rows(), b.cols());\n    Rhs oldb = b;\n\n    solver.compute(A);\n    if (solver.info() != Success)\n    {\n      std::cerr << \"sparse solver testing: factorization failed (check_sparse_solving)\\n\";\n      exit(0);\n      return;\n    }\n    x = solver.solve(b);\n    if (solver.info() != Success)\n    {\n      std::cerr << \"sparse solver testing: solving failed\\n\";\n      return;\n    }\n    VERIFY(oldb.isApprox(b) && \"sparse solver testing: the rhs should not be modified!\");\n\n    VERIFY(x.isApprox(refX,test_precision<Scalar>()));\n    x.setZero();\n    // test the analyze/factorize API\n    solver.analyzePattern(A);\n    solver.factorize(A);\n    if (solver.info() != Success)\n    {\n      std::cerr << \"sparse solver testing: factorization failed (check_sparse_solving)\\n\";\n      exit(0);\n      return;\n    }\n    x = solver.solve(b);\n    if (solver.info() != Success)\n    {\n      std::cerr << \"sparse solver testing: solving failed\\n\";\n      return;\n    }\n    VERIFY(oldb.isApprox(b) && \"sparse solver testing: the rhs should not be modified!\");\n\n    VERIFY(x.isApprox(refX,test_precision<Scalar>()));\n  }\n  \n  // test dense Block as the result and rhs:\n  {\n    DenseRhs x(db.rows(), db.cols());\n    DenseRhs oldb(db);\n    x.setZero();\n    x.block(0,0,x.rows(),x.cols()) = solver.solve(db.block(0,0,db.rows(),db.cols()));\n    VERIFY(oldb.isApprox(db) && \"sparse solver testing: the rhs should not be modified!\");\n    VERIFY(x.isApprox(refX,test_precision<Scalar>()));\n  }\n\n  // if not too large, do some extra check:\n  if(A.rows()<2000)\n  {\n\n    // test expression as input\n    {\n      solver.compute(0.5*(A+A));\n      Rhs x = solver.solve(b);\n      VERIFY(x.isApprox(refX,test_precision<Scalar>()));\n\n      Solver solver2(0.5*(A+A));\n      Rhs x2 = solver2.solve(b);\n      VERIFY(x2.isApprox(refX,test_precision<Scalar>()));\n    }\n  }\n}\n\ntemplate<typename Solver, typename Rhs>\nvoid check_sparse_solving_real_cases(Solver& solver, const typename Solver::MatrixType& A, const Rhs& b, const Rhs& refX)\n{\n  typedef typename Solver::MatrixType Mat;\n  typedef typename Mat::Scalar Scalar;\n  typedef typename Mat::RealScalar RealScalar;\n  \n  Rhs x(b.rows(), b.cols());\n  \n  solver.compute(A);\n  if (solver.info() != Success)\n  {\n    std::cerr << \"sparse solver testing: factorization failed (check_sparse_solving_real_cases)\\n\";\n    exit(0);\n    return;\n  }\n  x = solver.solve(b);\n  if (solver.info() != Success)\n  {\n    std::cerr << \"sparse solver testing: solving failed\\n\";\n    return;\n  }\n  \n  RealScalar res_error;\n  // Compute the norm of the relative error\n  if(refX.size() != 0)\n    res_error = (refX - x).norm()/refX.norm();\n  else\n  { \n    // Compute the relative residual norm\n    res_error = (b - A * x).norm()/b.norm();\n  }\n  if (res_error > test_precision<Scalar>() ){\n    std::cerr << \"Test \" << g_test_stack.back() << \" failed in \"EI_PP_MAKE_STRING(__FILE__) \n    << \" (\" << EI_PP_MAKE_STRING(__LINE__) << \")\" << std::endl << std::endl;\n    abort();\n  }\n  \n}\ntemplate<typename Solver, typename DenseMat>\nvoid check_sparse_determinant(Solver& solver, const typename Solver::MatrixType& A, const DenseMat& dA)\n{\n  typedef typename Solver::MatrixType Mat;\n  typedef typename Mat::Scalar Scalar;\n  \n  solver.compute(A);\n  if (solver.info() != Success)\n  {\n    std::cerr << \"sparse solver testing: factorization failed (check_sparse_determinant)\\n\";\n    return;\n  }\n\n  Scalar refDet = dA.determinant();\n  VERIFY_IS_APPROX(refDet,solver.determinant());\n}\ntemplate<typename Solver, typename DenseMat>\nvoid check_sparse_abs_determinant(Solver& solver, const typename Solver::MatrixType& A, const DenseMat& dA)\n{\n  using std::abs;\n  typedef typename Solver::MatrixType Mat;\n  typedef typename Mat::Scalar Scalar;\n  \n  solver.compute(A);\n  if (solver.info() != Success)\n  {\n    std::cerr << \"sparse solver testing: factorization failed (check_sparse_abs_determinant)\\n\";\n    return;\n  }\n\n  Scalar refDet = abs(dA.determinant());\n  VERIFY_IS_APPROX(refDet,solver.absDeterminant());\n}\n\ntemplate<typename Solver, typename DenseMat>\nint generate_sparse_spd_problem(Solver& , typename Solver::MatrixType& A, typename Solver::MatrixType& halfA, DenseMat& dA, int maxSize = 300)\n{\n  typedef typename Solver::MatrixType Mat;\n  typedef typename Mat::Scalar Scalar;\n  typedef Matrix<Scalar,Dynamic,Dynamic> DenseMatrix;\n\n  int size = internal::random<int>(1,maxSize);\n  double density = (std::max)(8./(size*size), 0.01);\n\n  Mat M(size, size);\n  DenseMatrix dM(size, size);\n\n  initSparse<Scalar>(density, dM, M, ForceNonZeroDiag);\n\n  A = M * M.adjoint();\n  dA = dM * dM.adjoint();\n  \n  halfA.resize(size,size);\n  if(Solver::UpLo==(Lower|Upper))\n    halfA = A;\n  else\n    halfA.template selfadjointView<Solver::UpLo>().rankUpdate(M);\n  \n  return size;\n}\n\n\n#ifdef TEST_REAL_CASES\ntemplate<typename Scalar>\ninline std::string get_matrixfolder()\n{\n  std::string mat_folder = TEST_REAL_CASES; \n  if( internal::is_same<Scalar, std::complex<float> >::value || internal::is_same<Scalar, std::complex<double> >::value )\n    mat_folder  = mat_folder + static_cast<std::string>(\"/complex/\");\n  else\n    mat_folder = mat_folder + static_cast<std::string>(\"/real/\");\n  return mat_folder;\n}\n#endif\n\ntemplate<typename Solver> void check_sparse_spd_solving(Solver& solver)\n{\n  typedef typename Solver::MatrixType Mat;\n  typedef typename Mat::Scalar Scalar;\n  typedef SparseMatrix<Scalar,ColMajor> SpMat;\n  typedef Matrix<Scalar,Dynamic,Dynamic> DenseMatrix;\n  typedef Matrix<Scalar,Dynamic,1> DenseVector;\n\n  // generate the problem\n  Mat A, halfA;\n  DenseMatrix dA;\n  for (int i = 0; i < g_repeat; i++) {\n    int size = generate_sparse_spd_problem(solver, A, halfA, dA);\n\n    // generate the right hand sides\n    int rhsCols = internal::random<int>(1,16);\n    double density = (std::max)(8./(size*rhsCols), 0.1);\n    SpMat B(size,rhsCols);\n    DenseVector b = DenseVector::Random(size);\n    DenseMatrix dB(size,rhsCols);\n    initSparse<Scalar>(density, dB, B, ForceNonZeroDiag);\n  \n    check_sparse_solving(solver, A,     b,  dA, b);\n    check_sparse_solving(solver, halfA, b,  dA, b);\n    check_sparse_solving(solver, A,     dB, dA, dB);\n    check_sparse_solving(solver, halfA, dB, dA, dB);\n    check_sparse_solving(solver, A,     B,  dA, dB);\n    check_sparse_solving(solver, halfA, B,  dA, dB);\n    \n    // check only once\n    if(i==0)\n    {\n      b = DenseVector::Zero(size);\n      check_sparse_solving(solver, A, b, dA, b);\n    }\n  }\n  \n  // First, get the folder \n#ifdef TEST_REAL_CASES  \n  if (internal::is_same<Scalar, float>::value \n      || internal::is_same<Scalar, std::complex<float> >::value)\n    return ;\n  \n  std::string mat_folder = get_matrixfolder<Scalar>();\n  MatrixMarketIterator<Scalar> it(mat_folder);\n  for (; it; ++it)\n  {\n    if (it.sym() == SPD){\n      Mat halfA;\n      PermutationMatrix<Dynamic, Dynamic, Index> pnull;\n      halfA.template selfadjointView<Solver::UpLo>() = it.matrix().template triangularView<Eigen::Lower>().twistedBy(pnull);\n      \n      std::cout<< \" ==== SOLVING WITH MATRIX \" << it.matname() << \" ==== \\n\";\n      check_sparse_solving_real_cases(solver, it.matrix(), it.rhs(), it.refX());\n      check_sparse_solving_real_cases(solver, halfA, it.rhs(), it.refX());\n    }\n  }\n#endif\n}\n\ntemplate<typename Solver> void check_sparse_spd_determinant(Solver& solver)\n{\n  typedef typename Solver::MatrixType Mat;\n  typedef typename Mat::Scalar Scalar;\n  typedef Matrix<Scalar,Dynamic,Dynamic> DenseMatrix;\n\n  // generate the problem\n  Mat A, halfA;\n  DenseMatrix dA;\n  generate_sparse_spd_problem(solver, A, halfA, dA, 30);\n  \n  for (int i = 0; i < g_repeat; i++) {\n    check_sparse_determinant(solver, A,     dA);\n    check_sparse_determinant(solver, halfA, dA );\n  }\n}\n\ntemplate<typename Solver, typename DenseMat>\nint generate_sparse_square_problem(Solver&, typename Solver::MatrixType& A, DenseMat& dA, int maxSize = 300)\n{\n  typedef typename Solver::MatrixType Mat;\n  typedef typename Mat::Scalar Scalar;\n\n  int size = internal::random<int>(1,maxSize);\n  double density = (std::max)(8./(size*size), 0.01);\n  \n  A.resize(size,size);\n  dA.resize(size,size);\n\n  initSparse<Scalar>(density, dA, A, ForceNonZeroDiag);\n  \n  return size;\n}\n\n\nstruct prune_column {\n  int m_col;\n  prune_column(int col) : m_col(col) {}\n  template<class Scalar>\n  bool operator()(int, int col, const Scalar&) const {\n    return col != m_col;\n  }\n};\n\ntemplate<typename Solver> void check_sparse_square_solving(Solver& solver, bool checkDeficient = false)\n{\n  typedef typename Solver::MatrixType Mat;\n  typedef typename Mat::Scalar Scalar;\n  typedef SparseMatrix<Scalar,ColMajor> SpMat;\n  typedef Matrix<Scalar,Dynamic,Dynamic> DenseMatrix;\n  typedef Matrix<Scalar,Dynamic,1> DenseVector;\n\n  int rhsCols = internal::random<int>(1,16);\n\n  Mat A;\n  DenseMatrix dA;\n  for (int i = 0; i < g_repeat; i++) {\n    int size = generate_sparse_square_problem(solver, A, dA);\n\n    A.makeCompressed();\n    DenseVector b = DenseVector::Random(size);\n    DenseMatrix dB(size,rhsCols);\n    SpMat B(size,rhsCols);\n    double density = (std::max)(8./(size*rhsCols), 0.1);\n    initSparse<Scalar>(density, dB, B, ForceNonZeroDiag);\n    B.makeCompressed();\n    check_sparse_solving(solver, A, b,  dA, b);\n    check_sparse_solving(solver, A, dB, dA, dB);\n    check_sparse_solving(solver, A, B,  dA, dB);\n    \n    // check only once\n    if(i==0)\n    {\n      b = DenseVector::Zero(size);\n      check_sparse_solving(solver, A, b, dA, b);\n    }\n    // regression test for Bug 792 (structurally rank deficient matrices):\n    if(checkDeficient && size>1) {\n      int col = internal::random<int>(0,size-1);\n      A.prune(prune_column(col));\n      solver.compute(A);\n      VERIFY_IS_EQUAL(solver.info(), NumericalIssue);\n    }\n  }\n  \n  // First, get the folder \n#ifdef TEST_REAL_CASES\n  if (internal::is_same<Scalar, float>::value \n      || internal::is_same<Scalar, std::complex<float> >::value)\n    return ;\n  \n  std::string mat_folder = get_matrixfolder<Scalar>();\n  MatrixMarketIterator<Scalar> it(mat_folder);\n  for (; it; ++it)\n  {\n    std::cout<< \" ==== SOLVING WITH MATRIX \" << it.matname() << \" ==== \\n\";\n    check_sparse_solving_real_cases(solver, it.matrix(), it.rhs(), it.refX());\n  }\n#endif\n\n}\n\ntemplate<typename Solver> void check_sparse_square_determinant(Solver& solver)\n{\n  typedef typename Solver::MatrixType Mat;\n  typedef typename Mat::Scalar Scalar;\n  typedef Matrix<Scalar,Dynamic,Dynamic> DenseMatrix;\n\n  // generate the problem\n  Mat A;\n  DenseMatrix dA;\n  generate_sparse_square_problem(solver, A, dA, 30);\n  A.makeCompressed();\n  for (int i = 0; i < g_repeat; i++) {\n    check_sparse_determinant(solver, A, dA);\n  }\n}\n\ntemplate<typename Solver> void check_sparse_square_abs_determinant(Solver& solver)\n{\n  typedef typename Solver::MatrixType Mat;\n  typedef typename Mat::Scalar Scalar;\n  typedef Matrix<Scalar,Dynamic,Dynamic> DenseMatrix;\n\n  // generate the problem\n  Mat A;\n  DenseMatrix dA;\n  generate_sparse_square_problem(solver, A, dA, 30);\n  A.makeCompressed();\n  for (int i = 0; i < g_repeat; i++) {\n    check_sparse_abs_determinant(solver, A, dA);\n  }\n}\n\n"
  },
  {
    "path": "libs/eigen/test/sparse_solvers.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"sparse.h\"\n\ntemplate<typename Scalar> void\ninitSPD(double density,\n        Matrix<Scalar,Dynamic,Dynamic>& refMat,\n        SparseMatrix<Scalar>& sparseMat)\n{\n  Matrix<Scalar,Dynamic,Dynamic> aux(refMat.rows(),refMat.cols());\n  initSparse(density,refMat,sparseMat);\n  refMat = refMat * refMat.adjoint();\n  for (int k=0; k<2; ++k)\n  {\n    initSparse(density,aux,sparseMat,ForceNonZeroDiag);\n    refMat += aux * aux.adjoint();\n  }\n  sparseMat.setZero();\n  for (int j=0 ; j<sparseMat.cols(); ++j)\n    for (int i=j ; i<sparseMat.rows(); ++i)\n      if (refMat(i,j)!=Scalar(0))\n        sparseMat.insert(i,j) = refMat(i,j);\n  sparseMat.finalize();\n}\n\ntemplate<typename Scalar> void sparse_solvers(int rows, int cols)\n{\n  double density = (std::max)(8./(rows*cols), 0.01);\n  typedef Matrix<Scalar,Dynamic,Dynamic> DenseMatrix;\n  typedef Matrix<Scalar,Dynamic,1> DenseVector;\n  // Scalar eps = 1e-6;\n\n  DenseVector vec1 = DenseVector::Random(rows);\n\n  std::vector<Vector2i> zeroCoords;\n  std::vector<Vector2i> nonzeroCoords;\n\n  // test triangular solver\n  {\n    DenseVector vec2 = vec1, vec3 = vec1;\n    SparseMatrix<Scalar> m2(rows, cols);\n    DenseMatrix refMat2 = DenseMatrix::Zero(rows, cols);\n\n    // lower - dense\n    initSparse<Scalar>(density, refMat2, m2, ForceNonZeroDiag|MakeLowerTriangular, &zeroCoords, &nonzeroCoords);\n    VERIFY_IS_APPROX(refMat2.template triangularView<Lower>().solve(vec2),\n                     m2.template triangularView<Lower>().solve(vec3));\n\n    // upper - dense\n    initSparse<Scalar>(density, refMat2, m2, ForceNonZeroDiag|MakeUpperTriangular, &zeroCoords, &nonzeroCoords);\n    VERIFY_IS_APPROX(refMat2.template triangularView<Upper>().solve(vec2),\n                     m2.template triangularView<Upper>().solve(vec3));\n    VERIFY_IS_APPROX(refMat2.conjugate().template triangularView<Upper>().solve(vec2),\n                     m2.conjugate().template triangularView<Upper>().solve(vec3));\n    {\n      SparseMatrix<Scalar> cm2(m2);\n      //Index rows, Index cols, Index nnz, Index* outerIndexPtr, Index* innerIndexPtr, Scalar* valuePtr\n      MappedSparseMatrix<Scalar> mm2(rows, cols, cm2.nonZeros(), cm2.outerIndexPtr(), cm2.innerIndexPtr(), cm2.valuePtr());\n      VERIFY_IS_APPROX(refMat2.conjugate().template triangularView<Upper>().solve(vec2),\n                       mm2.conjugate().template triangularView<Upper>().solve(vec3));\n    }\n\n    // lower - transpose\n    initSparse<Scalar>(density, refMat2, m2, ForceNonZeroDiag|MakeLowerTriangular, &zeroCoords, &nonzeroCoords);\n    VERIFY_IS_APPROX(refMat2.transpose().template triangularView<Upper>().solve(vec2),\n                     m2.transpose().template triangularView<Upper>().solve(vec3));\n\n    // upper - transpose\n    initSparse<Scalar>(density, refMat2, m2, ForceNonZeroDiag|MakeUpperTriangular, &zeroCoords, &nonzeroCoords);\n    VERIFY_IS_APPROX(refMat2.transpose().template triangularView<Lower>().solve(vec2),\n                     m2.transpose().template triangularView<Lower>().solve(vec3));\n\n    SparseMatrix<Scalar> matB(rows, rows);\n    DenseMatrix refMatB = DenseMatrix::Zero(rows, rows);\n\n    // lower - sparse\n    initSparse<Scalar>(density, refMat2, m2, ForceNonZeroDiag|MakeLowerTriangular);\n    initSparse<Scalar>(density, refMatB, matB);\n    refMat2.template triangularView<Lower>().solveInPlace(refMatB);\n    m2.template triangularView<Lower>().solveInPlace(matB);\n    VERIFY_IS_APPROX(matB.toDense(), refMatB);\n\n    // upper - sparse\n    initSparse<Scalar>(density, refMat2, m2, ForceNonZeroDiag|MakeUpperTriangular);\n    initSparse<Scalar>(density, refMatB, matB);\n    refMat2.template triangularView<Upper>().solveInPlace(refMatB);\n    m2.template triangularView<Upper>().solveInPlace(matB);\n    VERIFY_IS_APPROX(matB, refMatB);\n\n    // test deprecated API\n    initSparse<Scalar>(density, refMat2, m2, ForceNonZeroDiag|MakeLowerTriangular, &zeroCoords, &nonzeroCoords);\n    VERIFY_IS_APPROX(refMat2.template triangularView<Lower>().solve(vec2),\n                     m2.template triangularView<Lower>().solve(vec3));\n  }\n}\n\nvoid test_sparse_solvers()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1(sparse_solvers<double>(8, 8) );\n    int s = internal::random<int>(1,300);\n    CALL_SUBTEST_2(sparse_solvers<std::complex<double> >(s,s) );\n    CALL_SUBTEST_1(sparse_solvers<double>(s,s) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/sparse_vector.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2011 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"sparse.h\"\n\ntemplate<typename Scalar,typename Index> void sparse_vector(int rows, int cols)\n{\n  double densityMat = (std::max)(8./(rows*cols), 0.01);\n  double densityVec = (std::max)(8./float(rows), 0.1);\n  typedef Matrix<Scalar,Dynamic,Dynamic> DenseMatrix;\n  typedef Matrix<Scalar,Dynamic,1> DenseVector;\n  typedef SparseVector<Scalar,0,Index> SparseVectorType;\n  typedef SparseMatrix<Scalar,0,Index> SparseMatrixType;\n  Scalar eps = 1e-6;\n\n  SparseMatrixType m1(rows,rows);\n  SparseVectorType v1(rows), v2(rows), v3(rows);\n  DenseMatrix refM1 = DenseMatrix::Zero(rows, rows);\n  DenseVector refV1 = DenseVector::Random(rows),\n    refV2 = DenseVector::Random(rows),\n    refV3 = DenseVector::Random(rows);\n\n  std::vector<int> zerocoords, nonzerocoords;\n  initSparse<Scalar>(densityVec, refV1, v1, &zerocoords, &nonzerocoords);\n  initSparse<Scalar>(densityMat, refM1, m1);\n\n  initSparse<Scalar>(densityVec, refV2, v2);\n  initSparse<Scalar>(densityVec, refV3, v3);\n\n  Scalar s1 = internal::random<Scalar>();\n\n  // test coeff and coeffRef\n  for (unsigned int i=0; i<zerocoords.size(); ++i)\n  {\n    VERIFY_IS_MUCH_SMALLER_THAN( v1.coeff(zerocoords[i]), eps );\n    //VERIFY_RAISES_ASSERT( v1.coeffRef(zerocoords[i]) = 5 );\n  }\n  {\n    VERIFY(int(nonzerocoords.size()) == v1.nonZeros());\n    int j=0;\n    for (typename SparseVectorType::InnerIterator it(v1); it; ++it,++j)\n    {\n      VERIFY(nonzerocoords[j]==it.index());\n      VERIFY(it.value()==v1.coeff(it.index()));\n      VERIFY(it.value()==refV1.coeff(it.index()));\n    }\n  }\n  VERIFY_IS_APPROX(v1, refV1);\n\n  v1.coeffRef(nonzerocoords[0]) = Scalar(5);\n  refV1.coeffRef(nonzerocoords[0]) = Scalar(5);\n  VERIFY_IS_APPROX(v1, refV1);\n\n  VERIFY_IS_APPROX(v1+v2, refV1+refV2);\n  VERIFY_IS_APPROX(v1+v2+v3, refV1+refV2+refV3);\n\n  VERIFY_IS_APPROX(v1*s1-v2, refV1*s1-refV2);\n\n  VERIFY_IS_APPROX(v1*=s1, refV1*=s1);\n  VERIFY_IS_APPROX(v1/=s1, refV1/=s1);\n\n  VERIFY_IS_APPROX(v1+=v2, refV1+=refV2);\n  VERIFY_IS_APPROX(v1-=v2, refV1-=refV2);\n\n  VERIFY_IS_APPROX(v1.dot(v2), refV1.dot(refV2));\n  VERIFY_IS_APPROX(v1.dot(refV2), refV1.dot(refV2));\n\n  VERIFY_IS_APPROX(v1.dot(m1*v2), refV1.dot(refM1*refV2));\n  int i = internal::random<int>(0,rows-1);\n  VERIFY_IS_APPROX(v1.dot(m1.col(i)), refV1.dot(refM1.col(i)));\n\n\n  VERIFY_IS_APPROX(v1.squaredNorm(), refV1.squaredNorm());\n  \n  VERIFY_IS_APPROX(v1.blueNorm(), refV1.blueNorm());\n\n  // test aliasing\n  VERIFY_IS_APPROX((v1 = -v1), (refV1 = -refV1));\n  VERIFY_IS_APPROX((v1 = v1.transpose()), (refV1 = refV1.transpose().eval()));\n  VERIFY_IS_APPROX((v1 += -v1), (refV1 += -refV1));\n  \n  // sparse matrix to sparse vector\n  SparseMatrixType mv1;\n  VERIFY_IS_APPROX((mv1=v1),v1);\n  VERIFY_IS_APPROX(mv1,(v1=mv1));\n  VERIFY_IS_APPROX(mv1,(v1=mv1.transpose()));\n  \n  // check copy to dense vector with transpose\n  refV3.resize(0);\n  VERIFY_IS_APPROX(refV3 = v1.transpose(),v1.toDense()); \n  VERIFY_IS_APPROX(DenseVector(v1),v1.toDense()); \n\n}\n\nvoid test_sparse_vector()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1(( sparse_vector<double,int>(8, 8) ));\n    CALL_SUBTEST_2(( sparse_vector<std::complex<double>, int>(16, 16) ));\n    CALL_SUBTEST_1(( sparse_vector<double,long int>(299, 535) ));\n    CALL_SUBTEST_1(( sparse_vector<double,short>(299, 535) ));\n  }\n}\n\n"
  },
  {
    "path": "libs/eigen/test/sparselu.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam@inria.fr>\n//\n// Eigen is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3 of the License, or (at your option) any later version.\n//\n// Alternatively, you can redistribute it and/or\n// modify it under the terms of the GNU General Public License as\n// published by the Free Software Foundation; either version 2 of\n// the License, or (at your option) any later version.\n//\n// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY\n// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License and a copy of the GNU General Public License along with\n// Eigen. If not, see <http://www.gnu.org/licenses/>.\n\n\n// SparseLU solve does not accept column major matrices for the destination.\n// However, as expected, the generic check_sparse_square_solving routines produces row-major\n// rhs and destination matrices when compiled with EIGEN_DEFAULT_TO_ROW_MAJOR\n\n#ifdef EIGEN_DEFAULT_TO_ROW_MAJOR\n#undef EIGEN_DEFAULT_TO_ROW_MAJOR\n#endif\n\n#include \"sparse_solver.h\"\n#include <Eigen/SparseLU>\n#include <unsupported/Eigen/SparseExtra>\n\ntemplate<typename T> void test_sparselu_T()\n{\n  SparseLU<SparseMatrix<T, ColMajor> /*, COLAMDOrdering<int>*/ > sparselu_colamd; // COLAMDOrdering is the default\n  SparseLU<SparseMatrix<T, ColMajor>, AMDOrdering<int> > sparselu_amd; \n  SparseLU<SparseMatrix<T, ColMajor, long int>, NaturalOrdering<long int> > sparselu_natural;\n  \n  check_sparse_square_solving(sparselu_colamd, true); \n  check_sparse_square_solving(sparselu_amd,    true);\n  check_sparse_square_solving(sparselu_natural,true);\n  \n  check_sparse_square_abs_determinant(sparselu_colamd);\n  check_sparse_square_abs_determinant(sparselu_amd);\n  \n  check_sparse_square_determinant(sparselu_colamd);\n  check_sparse_square_determinant(sparselu_amd);\n}\n\nvoid test_sparselu()\n{\n  CALL_SUBTEST_1(test_sparselu_T<float>()); \n  CALL_SUBTEST_2(test_sparselu_T<double>());\n  CALL_SUBTEST_3(test_sparselu_T<std::complex<float> >()); \n  CALL_SUBTEST_4(test_sparselu_T<std::complex<double> >());\n}\n"
  },
  {
    "path": "libs/eigen/test/sparseqr.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Desire Nuentsa Wakam <desire.nuentsa_wakam@inria.fr>\n// Copyright (C) 2014 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n#include \"sparse.h\"\n#include <Eigen/SparseQR>\n\ntemplate<typename MatrixType,typename DenseMat>\nint generate_sparse_rectangular_problem(MatrixType& A, DenseMat& dA, int maxRows = 300)\n{\n  typedef typename MatrixType::Scalar Scalar;\n  int rows = internal::random<int>(1,maxRows);\n  int cols = internal::random<int>(1,rows);\n  double density = (std::max)(8./(rows*cols), 0.01);\n  \n  A.resize(rows,cols);\n  dA.resize(rows,cols);\n  initSparse<Scalar>(density, dA, A,ForceNonZeroDiag);\n  A.makeCompressed();\n  int nop = internal::random<int>(0, internal::random<double>(0,1) > 0.5 ? cols/2 : 0);\n  for(int k=0; k<nop; ++k)\n  {\n    int j0 = internal::random<int>(0,cols-1);\n    int j1 = internal::random<int>(0,cols-1);\n    Scalar s = internal::random<Scalar>();\n    A.col(j0)  = s * A.col(j1);\n    dA.col(j0) = s * dA.col(j1);\n  }\n  \n//   if(rows<cols) {\n//     A.conservativeResize(cols,cols);\n//     dA.conservativeResize(cols,cols);\n//     dA.bottomRows(cols-rows).setZero();\n//   }\n  \n  return rows;\n}\n\ntemplate<typename Scalar> void test_sparseqr_scalar()\n{\n  typedef SparseMatrix<Scalar,ColMajor> MatrixType; \n  typedef Matrix<Scalar,Dynamic,Dynamic> DenseMat;\n  typedef Matrix<Scalar,Dynamic,1> DenseVector;\n  MatrixType A;\n  DenseMat dA;\n  DenseVector refX,x,b; \n  SparseQR<MatrixType, COLAMDOrdering<int> > solver; \n  generate_sparse_rectangular_problem(A,dA);\n  \n  b = dA * DenseVector::Random(A.cols());\n  solver.compute(A);\n  if(internal::random<float>(0,1)>0.5)\n    solver.factorize(A);  // this checks that calling analyzePattern is not needed if the pattern do not change.\n  if (solver.info() != Success)\n  {\n    std::cerr << \"sparse QR factorization failed\\n\";\n    exit(0);\n    return;\n  }\n  x = solver.solve(b);\n  if (solver.info() != Success)\n  {\n    std::cerr << \"sparse QR factorization failed\\n\";\n    exit(0);\n    return;\n  }\n  \n  VERIFY_IS_APPROX(A * x, b);\n  \n  //Compare with a dense QR solver\n  ColPivHouseholderQR<DenseMat> dqr(dA);\n  refX = dqr.solve(b);\n  \n  VERIFY_IS_EQUAL(dqr.rank(), solver.rank());\n  if(solver.rank()==A.cols()) // full rank\n    VERIFY_IS_APPROX(x, refX);\n//   else\n//     VERIFY((dA * refX - b).norm() * 2 > (A * x - b).norm() );\n\n  // Compute explicitly the matrix Q\n  MatrixType Q, QtQ, idM;\n  Q = solver.matrixQ();\n  //Check  ||Q' * Q - I ||\n  QtQ = Q * Q.adjoint();\n  idM.resize(Q.rows(), Q.rows()); idM.setIdentity();\n  VERIFY(idM.isApprox(QtQ));\n}\nvoid test_sparseqr()\n{\n  for(int i=0; i<g_repeat; ++i)\n  {\n    CALL_SUBTEST_1(test_sparseqr_scalar<double>());\n    CALL_SUBTEST_2(test_sparseqr_scalar<std::complex<double> >());\n  }\n}\n\n"
  },
  {
    "path": "libs/eigen/test/special_numbers.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2013 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\ntemplate<typename Scalar> void special_numbers()\n{\n  typedef Matrix<Scalar, Dynamic,Dynamic> MatType;\n  int rows = internal::random<int>(1,300);\n  int cols = internal::random<int>(1,300);\n  \n  Scalar nan = std::numeric_limits<Scalar>::quiet_NaN();\n  Scalar inf = std::numeric_limits<Scalar>::infinity();\n  Scalar s1 = internal::random<Scalar>();\n  \n  MatType m1    = MatType::Random(rows,cols),\n          mnan  = MatType::Random(rows,cols),\n          minf  = MatType::Random(rows,cols),\n          mboth = MatType::Random(rows,cols);\n          \n  int n = internal::random<int>(1,10);\n  for(int k=0; k<n; ++k)\n  {\n    mnan(internal::random<int>(0,rows-1), internal::random<int>(0,cols-1)) = nan;\n    minf(internal::random<int>(0,rows-1), internal::random<int>(0,cols-1)) = inf;\n  }\n  mboth = mnan + minf;\n  \n  VERIFY(!m1.hasNaN());\n  VERIFY(m1.allFinite());\n  \n  VERIFY(mnan.hasNaN());\n  VERIFY((s1*mnan).hasNaN());\n  VERIFY(!minf.hasNaN());\n  VERIFY(!(2*minf).hasNaN());\n  VERIFY(mboth.hasNaN());\n  VERIFY(mboth.array().hasNaN());\n  \n  VERIFY(!mnan.allFinite());\n  VERIFY(!minf.allFinite());\n  VERIFY(!(minf-mboth).allFinite());\n  VERIFY(!mboth.allFinite());\n  VERIFY(!mboth.array().allFinite());\n}\n\nvoid test_special_numbers()\n{\n  for(int i = 0; i < 10*g_repeat; i++) {\n    CALL_SUBTEST_1( special_numbers<float>() );\n    CALL_SUBTEST_1( special_numbers<double>() );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/spqr_support.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Desire Nuentsa Wakam <desire.nuentsa_wakam@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n#include \"sparse.h\"\n#include <Eigen/SPQRSupport>\n\n\ntemplate<typename MatrixType,typename DenseMat>\nint generate_sparse_rectangular_problem(MatrixType& A, DenseMat& dA, int maxRows = 300, int maxCols = 300)\n{\n  eigen_assert(maxRows >= maxCols);\n  typedef typename MatrixType::Scalar Scalar;\n  int rows = internal::random<int>(1,maxRows);\n  int cols = internal::random<int>(1,rows);\n  double density = (std::max)(8./(rows*cols), 0.01);\n  \n  A.resize(rows,rows);\n  dA.resize(rows,rows);\n  initSparse<Scalar>(density, dA, A,ForceNonZeroDiag);\n  A.makeCompressed();\n  return rows;\n}\n\ntemplate<typename Scalar> void test_spqr_scalar()\n{\n  typedef SparseMatrix<Scalar,ColMajor> MatrixType; \n  MatrixType A;\n  Matrix<Scalar,Dynamic,Dynamic> dA;\n  typedef Matrix<Scalar,Dynamic,1> DenseVector;\n  DenseVector refX,x,b; \n  SPQR<MatrixType> solver; \n  generate_sparse_rectangular_problem(A,dA);\n  \n  int m = A.rows();\n  b = DenseVector::Random(m);\n  solver.compute(A);\n  if (solver.info() != Success)\n  {\n    std::cerr << \"sparse QR factorization failed\\n\";\n    exit(0);\n    return;\n  }\n  x = solver.solve(b);\n  if (solver.info() != Success)\n  {\n    std::cerr << \"sparse QR factorization failed\\n\";\n    exit(0);\n    return;\n  }  \n  //Compare with a dense solver\n  refX = dA.colPivHouseholderQr().solve(b);\n  VERIFY(x.isApprox(refX,test_precision<Scalar>()));\n}\nvoid test_spqr_support()\n{\n  CALL_SUBTEST_1(test_spqr_scalar<double>());\n  CALL_SUBTEST_2(test_spqr_scalar<std::complex<double> >());\n}\n"
  },
  {
    "path": "libs/eigen/test/stable_norm.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\n// workaround aggressive optimization in ICC\ntemplate<typename T> EIGEN_DONT_INLINE  T sub(T a, T b) { return a - b; }\n\ntemplate<typename T> bool isFinite(const T& x)\n{\n  return isNotNaN(sub(x,x));\n}\n\ntemplate<typename T> EIGEN_DONT_INLINE T copy(const T& x)\n{\n  return x;\n}\n\ntemplate<typename MatrixType> void stable_norm(const MatrixType& m)\n{\n  /* this test covers the following files:\n     StableNorm.h\n  */\n  using std::sqrt;\n  using std::abs;\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n\n  // Check the basic machine-dependent constants.\n  {\n    int ibeta, it, iemin, iemax;\n\n    ibeta = std::numeric_limits<RealScalar>::radix;         // base for floating-point numbers\n    it    = std::numeric_limits<RealScalar>::digits;        // number of base-beta digits in mantissa\n    iemin = std::numeric_limits<RealScalar>::min_exponent;  // minimum exponent\n    iemax = std::numeric_limits<RealScalar>::max_exponent;  // maximum exponent\n\n    VERIFY( (!(iemin > 1 - 2*it || 1+it>iemax || (it==2 && ibeta<5) || (it<=4 && ibeta <= 3 ) || it<2))\n           && \"the stable norm algorithm cannot be guaranteed on this computer\");\n  }\n\n\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  // get a non-zero random factor\n  Scalar factor = internal::random<Scalar>();\n  while(numext::abs2(factor)<RealScalar(1e-4))\n    factor = internal::random<Scalar>();\n  Scalar big = factor * ((std::numeric_limits<RealScalar>::max)() * RealScalar(1e-4));\n  \n  factor = internal::random<Scalar>();\n  while(numext::abs2(factor)<RealScalar(1e-4))\n    factor = internal::random<Scalar>();\n  Scalar small = factor * ((std::numeric_limits<RealScalar>::min)() * RealScalar(1e4));\n\n  MatrixType  vzero = MatrixType::Zero(rows, cols),\n              vrand = MatrixType::Random(rows, cols),\n              vbig(rows, cols),\n              vsmall(rows,cols);\n\n  vbig.fill(big);\n  vsmall.fill(small);\n\n  VERIFY_IS_MUCH_SMALLER_THAN(vzero.norm(), static_cast<RealScalar>(1));\n  VERIFY_IS_APPROX(vrand.stableNorm(),      vrand.norm());\n  VERIFY_IS_APPROX(vrand.blueNorm(),        vrand.norm());\n  VERIFY_IS_APPROX(vrand.hypotNorm(),       vrand.norm());\n\n  RealScalar size = static_cast<RealScalar>(m.size());\n\n  // test isFinite\n  VERIFY(!isFinite( std::numeric_limits<RealScalar>::infinity()));\n  VERIFY(!isFinite(sqrt(-abs(big))));\n\n  // test overflow\n  VERIFY(isFinite(sqrt(size)*abs(big)));\n  VERIFY_IS_NOT_APPROX(sqrt(copy(vbig.squaredNorm())), abs(sqrt(size)*big)); // here the default norm must fail\n  VERIFY_IS_APPROX(vbig.stableNorm(), sqrt(size)*abs(big));\n  VERIFY_IS_APPROX(vbig.blueNorm(),   sqrt(size)*abs(big));\n  VERIFY_IS_APPROX(vbig.hypotNorm(),  sqrt(size)*abs(big));\n\n  // test underflow\n  VERIFY(isFinite(sqrt(size)*abs(small)));\n  VERIFY_IS_NOT_APPROX(sqrt(copy(vsmall.squaredNorm())),   abs(sqrt(size)*small)); // here the default norm must fail\n  VERIFY_IS_APPROX(vsmall.stableNorm(), sqrt(size)*abs(small));\n  VERIFY_IS_APPROX(vsmall.blueNorm(),   sqrt(size)*abs(small));\n  VERIFY_IS_APPROX(vsmall.hypotNorm(),  sqrt(size)*abs(small));\n\n  // Test compilation of cwise() version\n  VERIFY_IS_APPROX(vrand.colwise().stableNorm(),      vrand.colwise().norm());\n  VERIFY_IS_APPROX(vrand.colwise().blueNorm(),        vrand.colwise().norm());\n  VERIFY_IS_APPROX(vrand.colwise().hypotNorm(),       vrand.colwise().norm());\n  VERIFY_IS_APPROX(vrand.rowwise().stableNorm(),      vrand.rowwise().norm());\n  VERIFY_IS_APPROX(vrand.rowwise().blueNorm(),        vrand.rowwise().norm());\n  VERIFY_IS_APPROX(vrand.rowwise().hypotNorm(),       vrand.rowwise().norm());\n}\n\nvoid test_stable_norm()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( stable_norm(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( stable_norm(Vector4d()) );\n    CALL_SUBTEST_3( stable_norm(VectorXd(internal::random<int>(10,2000))) );\n    CALL_SUBTEST_4( stable_norm(VectorXf(internal::random<int>(10,2000))) );\n    CALL_SUBTEST_5( stable_norm(VectorXcd(internal::random<int>(10,2000))) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/stddeque.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n// Copyright (C) 2010 Hauke Heibel <hauke.heibel@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <Eigen/StdDeque>\n#include <Eigen/Geometry>\n\ntemplate<typename MatrixType>\nvoid check_stddeque_matrix(const MatrixType& m)\n{\n  typedef typename MatrixType::Index Index;\n  \n  Index rows = m.rows();\n  Index cols = m.cols();\n  MatrixType x = MatrixType::Random(rows,cols), y = MatrixType::Random(rows,cols);\n  std::deque<MatrixType,Eigen::aligned_allocator<MatrixType> > v(10, MatrixType(rows,cols)), w(20, y);\n  v.front() = x;\n  w.front() = w.back();\n  VERIFY_IS_APPROX(w.front(), w.back());\n  v = w;\n\n  typename std::deque<MatrixType,Eigen::aligned_allocator<MatrixType> >::iterator vi = v.begin();\n  typename std::deque<MatrixType,Eigen::aligned_allocator<MatrixType> >::iterator wi = w.begin();\n  for(int i = 0; i < 20; i++)\n  {\n    VERIFY_IS_APPROX(*vi, *wi);\n    ++vi;\n    ++wi;\n  }\n\n  v.resize(21);  \n  v.back() = x;\n  VERIFY_IS_APPROX(v.back(), x);\n  v.resize(22,y);\n  VERIFY_IS_APPROX(v.back(), y);\n  v.push_back(x);\n  VERIFY_IS_APPROX(v.back(), x);\n}\n\ntemplate<typename TransformType>\nvoid check_stddeque_transform(const TransformType&)\n{\n  typedef typename TransformType::MatrixType MatrixType;\n  TransformType x(MatrixType::Random()), y(MatrixType::Random());\n  std::deque<TransformType,Eigen::aligned_allocator<TransformType> > v(10), w(20, y);\n  v.front() = x;\n  w.front() = w.back();\n  VERIFY_IS_APPROX(w.front(), w.back());\n  v = w;\n\n  typename std::deque<TransformType,Eigen::aligned_allocator<TransformType> >::iterator vi = v.begin();\n  typename std::deque<TransformType,Eigen::aligned_allocator<TransformType> >::iterator wi = w.begin();\n  for(int i = 0; i < 20; i++)\n  {\n    VERIFY_IS_APPROX(*vi, *wi);\n    ++vi;\n    ++wi;\n  }\n\n  v.resize(21);\n  v.back() = x;\n  VERIFY_IS_APPROX(v.back(), x);\n  v.resize(22,y);\n  VERIFY_IS_APPROX(v.back(), y);\n  v.push_back(x);\n  VERIFY_IS_APPROX(v.back(), x);\n}\n\ntemplate<typename QuaternionType>\nvoid check_stddeque_quaternion(const QuaternionType&)\n{\n  typedef typename QuaternionType::Coefficients Coefficients;\n  QuaternionType x(Coefficients::Random()), y(Coefficients::Random());\n  std::deque<QuaternionType,Eigen::aligned_allocator<QuaternionType> > v(10), w(20, y);\n  v.front() = x;\n  w.front() = w.back();\n  VERIFY_IS_APPROX(w.front(), w.back());\n  v = w;\n\n  typename std::deque<QuaternionType,Eigen::aligned_allocator<QuaternionType> >::iterator vi = v.begin();\n  typename std::deque<QuaternionType,Eigen::aligned_allocator<QuaternionType> >::iterator wi = w.begin();\n  for(int i = 0; i < 20; i++)\n  {\n    VERIFY_IS_APPROX(*vi, *wi);\n    ++vi;\n    ++wi;\n  }\n\n  v.resize(21);\n  v.back() = x;\n  VERIFY_IS_APPROX(v.back(), x);\n  v.resize(22,y);\n  VERIFY_IS_APPROX(v.back(), y);\n  v.push_back(x);\n  VERIFY_IS_APPROX(v.back(), x);\n}\n\nvoid test_stddeque()\n{\n  // some non vectorizable fixed sizes\n  CALL_SUBTEST_1(check_stddeque_matrix(Vector2f()));\n  CALL_SUBTEST_1(check_stddeque_matrix(Matrix3f()));\n  CALL_SUBTEST_2(check_stddeque_matrix(Matrix3d()));\n\n  // some vectorizable fixed sizes\n  CALL_SUBTEST_1(check_stddeque_matrix(Matrix2f()));\n  CALL_SUBTEST_1(check_stddeque_matrix(Vector4f()));\n  CALL_SUBTEST_1(check_stddeque_matrix(Matrix4f()));\n  CALL_SUBTEST_2(check_stddeque_matrix(Matrix4d()));\n\n  // some dynamic sizes\n  CALL_SUBTEST_3(check_stddeque_matrix(MatrixXd(1,1)));\n  CALL_SUBTEST_3(check_stddeque_matrix(VectorXd(20)));\n  CALL_SUBTEST_3(check_stddeque_matrix(RowVectorXf(20)));\n  CALL_SUBTEST_3(check_stddeque_matrix(MatrixXcf(10,10)));\n\n  // some Transform\n  CALL_SUBTEST_4(check_stddeque_transform(Affine2f()));\n  CALL_SUBTEST_4(check_stddeque_transform(Affine3f()));\n  CALL_SUBTEST_4(check_stddeque_transform(Affine3d()));\n\n  // some Quaternion\n  CALL_SUBTEST_5(check_stddeque_quaternion(Quaternionf()));\n  CALL_SUBTEST_5(check_stddeque_quaternion(Quaterniond()));\n}\n"
  },
  {
    "path": "libs/eigen/test/stddeque_overload.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n// Copyright (C) 2010 Hauke Heibel <hauke.heibel@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\n#include <Eigen/StdDeque>\n#include <Eigen/Geometry>\n\nEIGEN_DEFINE_STL_DEQUE_SPECIALIZATION(Vector4f)\n\nEIGEN_DEFINE_STL_DEQUE_SPECIALIZATION(Matrix2f)\nEIGEN_DEFINE_STL_DEQUE_SPECIALIZATION(Matrix4f)\nEIGEN_DEFINE_STL_DEQUE_SPECIALIZATION(Matrix4d)\n\nEIGEN_DEFINE_STL_DEQUE_SPECIALIZATION(Affine3f)\nEIGEN_DEFINE_STL_DEQUE_SPECIALIZATION(Affine3d)\n\nEIGEN_DEFINE_STL_DEQUE_SPECIALIZATION(Quaternionf)\nEIGEN_DEFINE_STL_DEQUE_SPECIALIZATION(Quaterniond)\n\ntemplate<typename MatrixType>\nvoid check_stddeque_matrix(const MatrixType& m)\n{\n  typename MatrixType::Index rows = m.rows();\n  typename MatrixType::Index cols = m.cols();\n  MatrixType x = MatrixType::Random(rows,cols), y = MatrixType::Random(rows,cols);\n  std::deque<MatrixType> v(10, MatrixType(rows,cols)), w(20, y);\n  v[5] = x;\n  w[6] = v[5];\n  VERIFY_IS_APPROX(w[6], v[5]);\n  v = w;\n  for(int i = 0; i < 20; i++)\n  {\n    VERIFY_IS_APPROX(w[i], v[i]);\n  }\n\n  v.resize(21);\n  v[20] = x;\n  VERIFY_IS_APPROX(v[20], x);\n  v.resize(22,y);\n  VERIFY_IS_APPROX(v[21], y);\n  v.push_back(x);\n  VERIFY_IS_APPROX(v[22], x);\n\n  // do a lot of push_back such that the deque gets internally resized\n  // (with memory reallocation)\n  MatrixType* ref = &w[0];\n  for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i)\n    v.push_back(w[i%w.size()]);\n  for(unsigned int i=23; i<v.size(); ++i)\n  {\n    VERIFY(v[i]==w[(i-23)%w.size()]);\n  }\n}\n\ntemplate<typename TransformType>\nvoid check_stddeque_transform(const TransformType&)\n{\n  typedef typename TransformType::MatrixType MatrixType;\n  TransformType x(MatrixType::Random()), y(MatrixType::Random());\n  std::deque<TransformType> v(10), w(20, y);\n  v[5] = x;\n  w[6] = v[5];\n  VERIFY_IS_APPROX(w[6], v[5]);\n  v = w;\n  for(int i = 0; i < 20; i++)\n  {\n    VERIFY_IS_APPROX(w[i], v[i]);\n  }\n\n  v.resize(21);\n  v[20] = x;\n  VERIFY_IS_APPROX(v[20], x);\n  v.resize(22,y);\n  VERIFY_IS_APPROX(v[21], y);\n  v.push_back(x);\n  VERIFY_IS_APPROX(v[22], x);\n\n  // do a lot of push_back such that the deque gets internally resized\n  // (with memory reallocation)\n  TransformType* ref = &w[0];\n  for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i)\n    v.push_back(w[i%w.size()]);\n  for(unsigned int i=23; i<v.size(); ++i)\n  {\n    VERIFY(v[i].matrix()==w[(i-23)%w.size()].matrix());\n  }\n}\n\ntemplate<typename QuaternionType>\nvoid check_stddeque_quaternion(const QuaternionType&)\n{\n  typedef typename QuaternionType::Coefficients Coefficients;\n  QuaternionType x(Coefficients::Random()), y(Coefficients::Random());\n  std::deque<QuaternionType> v(10), w(20, y);\n  v[5] = x;\n  w[6] = v[5];\n  VERIFY_IS_APPROX(w[6], v[5]);\n  v = w;\n  for(int i = 0; i < 20; i++)\n  {\n    VERIFY_IS_APPROX(w[i], v[i]);\n  }\n\n  v.resize(21);\n  v[20] = x;\n  VERIFY_IS_APPROX(v[20], x);\n  v.resize(22,y);\n  VERIFY_IS_APPROX(v[21], y);\n  v.push_back(x);\n  VERIFY_IS_APPROX(v[22], x);\n\n  // do a lot of push_back such that the deque gets internally resized\n  // (with memory reallocation)\n  QuaternionType* ref = &w[0];\n  for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i)\n    v.push_back(w[i%w.size()]);\n  for(unsigned int i=23; i<v.size(); ++i)\n  {\n    VERIFY(v[i].coeffs()==w[(i-23)%w.size()].coeffs());\n  }\n}\n\nvoid test_stddeque_overload()\n{\n  // some non vectorizable fixed sizes\n  CALL_SUBTEST_1(check_stddeque_matrix(Vector2f()));\n  CALL_SUBTEST_1(check_stddeque_matrix(Matrix3f()));\n  CALL_SUBTEST_2(check_stddeque_matrix(Matrix3d()));\n\n  // some vectorizable fixed sizes\n  CALL_SUBTEST_1(check_stddeque_matrix(Matrix2f()));\n  CALL_SUBTEST_1(check_stddeque_matrix(Vector4f()));\n  CALL_SUBTEST_1(check_stddeque_matrix(Matrix4f()));\n  CALL_SUBTEST_2(check_stddeque_matrix(Matrix4d()));\n\n  // some dynamic sizes\n  CALL_SUBTEST_3(check_stddeque_matrix(MatrixXd(1,1)));\n  CALL_SUBTEST_3(check_stddeque_matrix(VectorXd(20)));\n  CALL_SUBTEST_3(check_stddeque_matrix(RowVectorXf(20)));\n  CALL_SUBTEST_3(check_stddeque_matrix(MatrixXcf(10,10)));\n\n  // some Transform\n  CALL_SUBTEST_4(check_stddeque_transform(Affine2f())); // does not need the specialization (2+1)^2 = 9\n  CALL_SUBTEST_4(check_stddeque_transform(Affine3f()));\n  CALL_SUBTEST_4(check_stddeque_transform(Affine3d()));\n\n  // some Quaternion\n  CALL_SUBTEST_5(check_stddeque_quaternion(Quaternionf()));\n  CALL_SUBTEST_5(check_stddeque_quaternion(Quaterniond()));\n}\n"
  },
  {
    "path": "libs/eigen/test/stdlist.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n// Copyright (C) 2010 Hauke Heibel <hauke.heibel@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <Eigen/StdList>\n#include <Eigen/Geometry>\n\ntemplate<typename MatrixType>\nvoid check_stdlist_matrix(const MatrixType& m)\n{\n  typedef typename MatrixType::Index Index;\n  \n  Index rows = m.rows();\n  Index cols = m.cols();\n  MatrixType x = MatrixType::Random(rows,cols), y = MatrixType::Random(rows,cols);\n  std::list<MatrixType,Eigen::aligned_allocator<MatrixType> > v(10, MatrixType(rows,cols)), w(20, y);\n  v.front() = x;\n  w.front() = w.back();\n  VERIFY_IS_APPROX(w.front(), w.back());\n  v = w;\n\n  typename std::list<MatrixType,Eigen::aligned_allocator<MatrixType> >::iterator vi = v.begin();\n  typename std::list<MatrixType,Eigen::aligned_allocator<MatrixType> >::iterator wi = w.begin();\n  for(int i = 0; i < 20; i++)\n  {\n    VERIFY_IS_APPROX(*vi, *wi);\n    ++vi;\n    ++wi;\n  }\n\n  v.resize(21);  \n  v.back() = x;\n  VERIFY_IS_APPROX(v.back(), x);\n  v.resize(22,y);\n  VERIFY_IS_APPROX(v.back(), y);\n  v.push_back(x);\n  VERIFY_IS_APPROX(v.back(), x);\n}\n\ntemplate<typename TransformType>\nvoid check_stdlist_transform(const TransformType&)\n{\n  typedef typename TransformType::MatrixType MatrixType;\n  TransformType x(MatrixType::Random()), y(MatrixType::Random());\n  std::list<TransformType,Eigen::aligned_allocator<TransformType> > v(10), w(20, y);\n  v.front() = x;\n  w.front() = w.back();\n  VERIFY_IS_APPROX(w.front(), w.back());\n  v = w;\n\n  typename std::list<TransformType,Eigen::aligned_allocator<TransformType> >::iterator vi = v.begin();\n  typename std::list<TransformType,Eigen::aligned_allocator<TransformType> >::iterator wi = w.begin();\n  for(int i = 0; i < 20; i++)\n  {\n    VERIFY_IS_APPROX(*vi, *wi);\n    ++vi;\n    ++wi;\n  }\n\n  v.resize(21);\n  v.back() = x;\n  VERIFY_IS_APPROX(v.back(), x);\n  v.resize(22,y);\n  VERIFY_IS_APPROX(v.back(), y);\n  v.push_back(x);\n  VERIFY_IS_APPROX(v.back(), x);\n}\n\ntemplate<typename QuaternionType>\nvoid check_stdlist_quaternion(const QuaternionType&)\n{\n  typedef typename QuaternionType::Coefficients Coefficients;\n  QuaternionType x(Coefficients::Random()), y(Coefficients::Random());\n  std::list<QuaternionType,Eigen::aligned_allocator<QuaternionType> > v(10), w(20, y);\n  v.front() = x;\n  w.front() = w.back();\n  VERIFY_IS_APPROX(w.front(), w.back());\n  v = w;\n\n  typename std::list<QuaternionType,Eigen::aligned_allocator<QuaternionType> >::iterator vi = v.begin();\n  typename std::list<QuaternionType,Eigen::aligned_allocator<QuaternionType> >::iterator wi = w.begin();\n  for(int i = 0; i < 20; i++)\n  {\n    VERIFY_IS_APPROX(*vi, *wi);\n    ++vi;\n    ++wi;\n  }\n\n  v.resize(21);\n  v.back() = x;\n  VERIFY_IS_APPROX(v.back(), x);\n  v.resize(22,y);\n  VERIFY_IS_APPROX(v.back(), y);\n  v.push_back(x);\n  VERIFY_IS_APPROX(v.back(), x);\n}\n\nvoid test_stdlist()\n{\n  // some non vectorizable fixed sizes\n  CALL_SUBTEST_1(check_stdlist_matrix(Vector2f()));\n  CALL_SUBTEST_1(check_stdlist_matrix(Matrix3f()));\n  CALL_SUBTEST_2(check_stdlist_matrix(Matrix3d()));\n\n  // some vectorizable fixed sizes\n  CALL_SUBTEST_1(check_stdlist_matrix(Matrix2f()));\n  CALL_SUBTEST_1(check_stdlist_matrix(Vector4f()));\n  CALL_SUBTEST_1(check_stdlist_matrix(Matrix4f()));\n  CALL_SUBTEST_2(check_stdlist_matrix(Matrix4d()));\n\n  // some dynamic sizes\n  CALL_SUBTEST_3(check_stdlist_matrix(MatrixXd(1,1)));\n  CALL_SUBTEST_3(check_stdlist_matrix(VectorXd(20)));\n  CALL_SUBTEST_3(check_stdlist_matrix(RowVectorXf(20)));\n  CALL_SUBTEST_3(check_stdlist_matrix(MatrixXcf(10,10)));\n\n  // some Transform\n  CALL_SUBTEST_4(check_stdlist_transform(Affine2f()));\n  CALL_SUBTEST_4(check_stdlist_transform(Affine3f()));\n  CALL_SUBTEST_4(check_stdlist_transform(Affine3d()));\n\n  // some Quaternion\n  CALL_SUBTEST_5(check_stdlist_quaternion(Quaternionf()));\n  CALL_SUBTEST_5(check_stdlist_quaternion(Quaterniond()));\n}\n"
  },
  {
    "path": "libs/eigen/test/stdlist_overload.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n// Copyright (C) 2010 Hauke Heibel <hauke.heibel@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\n#include <Eigen/StdList>\n#include <Eigen/Geometry>\n\nEIGEN_DEFINE_STL_LIST_SPECIALIZATION(Vector4f)\n\nEIGEN_DEFINE_STL_LIST_SPECIALIZATION(Matrix2f)\nEIGEN_DEFINE_STL_LIST_SPECIALIZATION(Matrix4f)\nEIGEN_DEFINE_STL_LIST_SPECIALIZATION(Matrix4d)\n\nEIGEN_DEFINE_STL_LIST_SPECIALIZATION(Affine3f)\nEIGEN_DEFINE_STL_LIST_SPECIALIZATION(Affine3d)\n\nEIGEN_DEFINE_STL_LIST_SPECIALIZATION(Quaternionf)\nEIGEN_DEFINE_STL_LIST_SPECIALIZATION(Quaterniond)\n\ntemplate <class Container, class Position>\ntypename Container::iterator get(Container & c, Position position)\n{\n  typename Container::iterator it = c.begin();\n  std::advance(it, position);\n  return it;\n}\n\ntemplate <class Container, class Position, class Value>\nvoid set(Container & c, Position position, const Value & value)\n{\n  typename Container::iterator it = c.begin();\n  std::advance(it, position);\n  *it = value;\n}\n\ntemplate<typename MatrixType>\nvoid check_stdlist_matrix(const MatrixType& m)\n{\n  typename MatrixType::Index rows = m.rows();\n  typename MatrixType::Index cols = m.cols();\n  MatrixType x = MatrixType::Random(rows,cols), y = MatrixType::Random(rows,cols);\n  std::list<MatrixType> v(10, MatrixType(rows,cols)), w(20, y);\n  typename std::list<MatrixType>::iterator itv = get(v, 5);\n  typename std::list<MatrixType>::iterator itw = get(w, 6);\n  *itv = x;\n  *itw = *itv;\n  VERIFY_IS_APPROX(*itw, *itv);\n  v = w;\n  itv = v.begin();\n  itw = w.begin();\n  for(int i = 0; i < 20; i++)\n  {\n    VERIFY_IS_APPROX(*itw, *itv);\n    ++itv;\n    ++itw;\n  }\n\n  v.resize(21);\n  set(v, 20, x);\n  VERIFY_IS_APPROX(*get(v, 20), x);\n  v.resize(22,y);\n  VERIFY_IS_APPROX(*get(v, 21), y);\n  v.push_back(x);\n  VERIFY_IS_APPROX(*get(v, 22), x);\n\n  // do a lot of push_back such that the list gets internally resized\n  // (with memory reallocation)\n  MatrixType* ref = &(*get(w, 0));\n  for(int i=0; i<30 || ((ref==&(*get(w, 0))) && i<300); ++i)\n    v.push_back(*get(w, i%w.size()));\n  for(unsigned int i=23; i<v.size(); ++i)\n  {\n    VERIFY((*get(v, i))==(*get(w, (i-23)%w.size())));\n  }\n}\n\ntemplate<typename TransformType>\nvoid check_stdlist_transform(const TransformType&)\n{\n  typedef typename TransformType::MatrixType MatrixType;\n  TransformType x(MatrixType::Random()), y(MatrixType::Random());\n  std::list<TransformType> v(10), w(20, y);\n  typename std::list<TransformType>::iterator itv = get(v, 5);\n  typename std::list<TransformType>::iterator itw = get(w, 6);\n  *itv = x;\n  *itw = *itv;\n  VERIFY_IS_APPROX(*itw, *itv);\n  v = w;\n  itv = v.begin();\n  itw = w.begin();\n  for(int i = 0; i < 20; i++)\n  {\n    VERIFY_IS_APPROX(*itw, *itv);\n    ++itv;\n    ++itw;\n  }\n\n  v.resize(21);\n  set(v, 20, x);\n  VERIFY_IS_APPROX(*get(v, 20), x);\n  v.resize(22,y);\n  VERIFY_IS_APPROX(*get(v, 21), y);\n  v.push_back(x);\n  VERIFY_IS_APPROX(*get(v, 22), x);\n\n  // do a lot of push_back such that the list gets internally resized\n  // (with memory reallocation)\n  TransformType* ref = &(*get(w, 0));\n  for(int i=0; i<30 || ((ref==&(*get(w, 0))) && i<300); ++i)\n    v.push_back(*get(w, i%w.size()));\n  for(unsigned int i=23; i<v.size(); ++i)\n  {\n    VERIFY(get(v, i)->matrix()==get(w, (i-23)%w.size())->matrix());\n  }\n}\n\ntemplate<typename QuaternionType>\nvoid check_stdlist_quaternion(const QuaternionType&)\n{\n  typedef typename QuaternionType::Coefficients Coefficients;\n  QuaternionType x(Coefficients::Random()), y(Coefficients::Random());\n  std::list<QuaternionType> v(10), w(20, y);\n  typename std::list<QuaternionType>::iterator itv = get(v, 5);\n  typename std::list<QuaternionType>::iterator itw = get(w, 6);\n  *itv = x;\n  *itw = *itv;\n  VERIFY_IS_APPROX(*itw, *itv);\n  v = w;\n  itv = v.begin();\n  itw = w.begin();\n  for(int i = 0; i < 20; i++)\n  {\n    VERIFY_IS_APPROX(*itw, *itv);\n    ++itv;\n    ++itw;\n  }\n\n  v.resize(21);\n  set(v, 20, x);\n  VERIFY_IS_APPROX(*get(v, 20), x);\n  v.resize(22,y);\n  VERIFY_IS_APPROX(*get(v, 21), y);\n  v.push_back(x);\n  VERIFY_IS_APPROX(*get(v, 22), x);\n\n  // do a lot of push_back such that the list gets internally resized\n  // (with memory reallocation)\n  QuaternionType* ref = &(*get(w, 0));\n  for(int i=0; i<30 || ((ref==&(*get(w, 0))) && i<300); ++i)\n    v.push_back(*get(w, i%w.size()));\n  for(unsigned int i=23; i<v.size(); ++i)\n  {\n    VERIFY(get(v, i)->coeffs()==get(w, (i-23)%w.size())->coeffs());\n  }\n}\n\nvoid test_stdlist_overload()\n{\n  // some non vectorizable fixed sizes\n  CALL_SUBTEST_1(check_stdlist_matrix(Vector2f()));\n  CALL_SUBTEST_1(check_stdlist_matrix(Matrix3f()));\n  CALL_SUBTEST_2(check_stdlist_matrix(Matrix3d()));\n\n  // some vectorizable fixed sizes\n  CALL_SUBTEST_1(check_stdlist_matrix(Matrix2f()));\n  CALL_SUBTEST_1(check_stdlist_matrix(Vector4f()));\n  CALL_SUBTEST_1(check_stdlist_matrix(Matrix4f()));\n  CALL_SUBTEST_2(check_stdlist_matrix(Matrix4d()));\n\n  // some dynamic sizes\n  CALL_SUBTEST_3(check_stdlist_matrix(MatrixXd(1,1)));\n  CALL_SUBTEST_3(check_stdlist_matrix(VectorXd(20)));\n  CALL_SUBTEST_3(check_stdlist_matrix(RowVectorXf(20)));\n  CALL_SUBTEST_3(check_stdlist_matrix(MatrixXcf(10,10)));\n\n  // some Transform\n  CALL_SUBTEST_4(check_stdlist_transform(Affine2f())); // does not need the specialization (2+1)^2 = 9\n  CALL_SUBTEST_4(check_stdlist_transform(Affine3f()));\n  CALL_SUBTEST_4(check_stdlist_transform(Affine3d()));\n\n  // some Quaternion\n  CALL_SUBTEST_5(check_stdlist_quaternion(Quaternionf()));\n  CALL_SUBTEST_5(check_stdlist_quaternion(Quaterniond()));\n}\n"
  },
  {
    "path": "libs/eigen/test/stdvector.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <Eigen/StdVector>\n#include <Eigen/Geometry>\n\ntemplate<typename MatrixType>\nvoid check_stdvector_matrix(const MatrixType& m)\n{\n  typename MatrixType::Index rows = m.rows();\n  typename MatrixType::Index cols = m.cols();\n  MatrixType x = MatrixType::Random(rows,cols), y = MatrixType::Random(rows,cols);\n  std::vector<MatrixType,Eigen::aligned_allocator<MatrixType> > v(10, MatrixType(rows,cols)), w(20, y);\n  v[5] = x;\n  w[6] = v[5];\n  VERIFY_IS_APPROX(w[6], v[5]);\n  v = w;\n  for(int i = 0; i < 20; i++)\n  {\n    VERIFY_IS_APPROX(w[i], v[i]);\n  }\n\n  v.resize(21);\n  v[20] = x;\n  VERIFY_IS_APPROX(v[20], x);\n  v.resize(22,y);\n  VERIFY_IS_APPROX(v[21], y);\n  v.push_back(x);\n  VERIFY_IS_APPROX(v[22], x);\n  VERIFY((size_t)&(v[22]) == (size_t)&(v[21]) + sizeof(MatrixType));\n\n  // do a lot of push_back such that the vector gets internally resized\n  // (with memory reallocation)\n  MatrixType* ref = &w[0];\n  for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i)\n    v.push_back(w[i%w.size()]);\n  for(unsigned int i=23; i<v.size(); ++i)\n  {\n    VERIFY(v[i]==w[(i-23)%w.size()]);\n  }\n}\n\ntemplate<typename TransformType>\nvoid check_stdvector_transform(const TransformType&)\n{\n  typedef typename TransformType::MatrixType MatrixType;\n  TransformType x(MatrixType::Random()), y(MatrixType::Random());\n  std::vector<TransformType,Eigen::aligned_allocator<TransformType> > v(10), w(20, y);\n  v[5] = x;\n  w[6] = v[5];\n  VERIFY_IS_APPROX(w[6], v[5]);\n  v = w;\n  for(int i = 0; i < 20; i++)\n  {\n    VERIFY_IS_APPROX(w[i], v[i]);\n  }\n\n  v.resize(21);\n  v[20] = x;\n  VERIFY_IS_APPROX(v[20], x);\n  v.resize(22,y);\n  VERIFY_IS_APPROX(v[21], y);\n  v.push_back(x);\n  VERIFY_IS_APPROX(v[22], x);\n  VERIFY((size_t)&(v[22]) == (size_t)&(v[21]) + sizeof(TransformType));\n\n  // do a lot of push_back such that the vector gets internally resized\n  // (with memory reallocation)\n  TransformType* ref = &w[0];\n  for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i)\n    v.push_back(w[i%w.size()]);\n  for(unsigned int i=23; i<v.size(); ++i)\n  {\n    VERIFY(v[i].matrix()==w[(i-23)%w.size()].matrix());\n  }\n}\n\ntemplate<typename QuaternionType>\nvoid check_stdvector_quaternion(const QuaternionType&)\n{\n  typedef typename QuaternionType::Coefficients Coefficients;\n  QuaternionType x(Coefficients::Random()), y(Coefficients::Random());\n  std::vector<QuaternionType,Eigen::aligned_allocator<QuaternionType> > v(10), w(20, y);\n  v[5] = x;\n  w[6] = v[5];\n  VERIFY_IS_APPROX(w[6], v[5]);\n  v = w;\n  for(int i = 0; i < 20; i++)\n  {\n    VERIFY_IS_APPROX(w[i], v[i]);\n  }\n\n  v.resize(21);\n  v[20] = x;\n  VERIFY_IS_APPROX(v[20], x);\n  v.resize(22,y);\n  VERIFY_IS_APPROX(v[21], y);\n  v.push_back(x);\n  VERIFY_IS_APPROX(v[22], x);\n  VERIFY((size_t)&(v[22]) == (size_t)&(v[21]) + sizeof(QuaternionType));\n\n  // do a lot of push_back such that the vector gets internally resized\n  // (with memory reallocation)\n  QuaternionType* ref = &w[0];\n  for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i)\n    v.push_back(w[i%w.size()]);\n  for(unsigned int i=23; i<v.size(); ++i)\n  {\n    VERIFY(v[i].coeffs()==w[(i-23)%w.size()].coeffs());\n  }\n}\n\nvoid test_stdvector()\n{\n  // some non vectorizable fixed sizes\n  CALL_SUBTEST_1(check_stdvector_matrix(Vector2f()));\n  CALL_SUBTEST_1(check_stdvector_matrix(Matrix3f()));\n  CALL_SUBTEST_2(check_stdvector_matrix(Matrix3d()));\n\n  // some vectorizable fixed sizes\n  CALL_SUBTEST_1(check_stdvector_matrix(Matrix2f()));\n  CALL_SUBTEST_1(check_stdvector_matrix(Vector4f()));\n  CALL_SUBTEST_1(check_stdvector_matrix(Matrix4f()));\n  CALL_SUBTEST_2(check_stdvector_matrix(Matrix4d()));\n\n  // some dynamic sizes\n  CALL_SUBTEST_3(check_stdvector_matrix(MatrixXd(1,1)));\n  CALL_SUBTEST_3(check_stdvector_matrix(VectorXd(20)));\n  CALL_SUBTEST_3(check_stdvector_matrix(RowVectorXf(20)));\n  CALL_SUBTEST_3(check_stdvector_matrix(MatrixXcf(10,10)));\n\n  // some Transform\n  CALL_SUBTEST_4(check_stdvector_transform(Projective2f()));\n  CALL_SUBTEST_4(check_stdvector_transform(Projective3f()));\n  CALL_SUBTEST_4(check_stdvector_transform(Projective3d()));\n  //CALL_SUBTEST(heck_stdvector_transform(Projective4d()));\n\n  // some Quaternion\n  CALL_SUBTEST_5(check_stdvector_quaternion(Quaternionf()));\n  CALL_SUBTEST_5(check_stdvector_quaternion(Quaterniond()));\n}\n"
  },
  {
    "path": "libs/eigen/test/stdvector_overload.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n// Copyright (C) 2010 Hauke Heibel <hauke.heibel@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\n#include <Eigen/StdVector>\n#include <Eigen/Geometry>\n\nEIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Vector4f)\n\nEIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Matrix2f)\nEIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Matrix4f)\nEIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Matrix4d)\n\nEIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Affine3f)\nEIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Affine3d)\n\nEIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Quaternionf)\nEIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Quaterniond)\n\ntemplate<typename MatrixType>\nvoid check_stdvector_matrix(const MatrixType& m)\n{\n  typename MatrixType::Index rows = m.rows();\n  typename MatrixType::Index cols = m.cols();\n  MatrixType x = MatrixType::Random(rows,cols), y = MatrixType::Random(rows,cols);\n  std::vector<MatrixType> v(10, MatrixType(rows,cols)), w(20, y);\n  v[5] = x;\n  w[6] = v[5];\n  VERIFY_IS_APPROX(w[6], v[5]);\n  v = w;\n  for(int i = 0; i < 20; i++)\n  {\n    VERIFY_IS_APPROX(w[i], v[i]);\n  }\n\n  v.resize(21);\n  v[20] = x;\n  VERIFY_IS_APPROX(v[20], x);\n  v.resize(22,y);\n  VERIFY_IS_APPROX(v[21], y);\n  v.push_back(x);\n  VERIFY_IS_APPROX(v[22], x);\n  VERIFY((size_t)&(v[22]) == (size_t)&(v[21]) + sizeof(MatrixType));\n\n  // do a lot of push_back such that the vector gets internally resized\n  // (with memory reallocation)\n  MatrixType* ref = &w[0];\n  for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i)\n    v.push_back(w[i%w.size()]);\n  for(unsigned int i=23; i<v.size(); ++i)\n  {\n    VERIFY(v[i]==w[(i-23)%w.size()]);\n  }\n}\n\ntemplate<typename TransformType>\nvoid check_stdvector_transform(const TransformType&)\n{\n  typedef typename TransformType::MatrixType MatrixType;\n  TransformType x(MatrixType::Random()), y(MatrixType::Random());\n  std::vector<TransformType> v(10), w(20, y);\n  v[5] = x;\n  w[6] = v[5];\n  VERIFY_IS_APPROX(w[6], v[5]);\n  v = w;\n  for(int i = 0; i < 20; i++)\n  {\n    VERIFY_IS_APPROX(w[i], v[i]);\n  }\n\n  v.resize(21);\n  v[20] = x;\n  VERIFY_IS_APPROX(v[20], x);\n  v.resize(22,y);\n  VERIFY_IS_APPROX(v[21], y);\n  v.push_back(x);\n  VERIFY_IS_APPROX(v[22], x);\n  VERIFY((size_t)&(v[22]) == (size_t)&(v[21]) + sizeof(TransformType));\n\n  // do a lot of push_back such that the vector gets internally resized\n  // (with memory reallocation)\n  TransformType* ref = &w[0];\n  for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i)\n    v.push_back(w[i%w.size()]);\n  for(unsigned int i=23; i<v.size(); ++i)\n  {\n    VERIFY(v[i].matrix()==w[(i-23)%w.size()].matrix());\n  }\n}\n\ntemplate<typename QuaternionType>\nvoid check_stdvector_quaternion(const QuaternionType&)\n{\n  typedef typename QuaternionType::Coefficients Coefficients;\n  QuaternionType x(Coefficients::Random()), y(Coefficients::Random());\n  std::vector<QuaternionType> v(10), w(20, y);\n  v[5] = x;\n  w[6] = v[5];\n  VERIFY_IS_APPROX(w[6], v[5]);\n  v = w;\n  for(int i = 0; i < 20; i++)\n  {\n    VERIFY_IS_APPROX(w[i], v[i]);\n  }\n\n  v.resize(21);\n  v[20] = x;\n  VERIFY_IS_APPROX(v[20], x);\n  v.resize(22,y);\n  VERIFY_IS_APPROX(v[21], y);\n  v.push_back(x);\n  VERIFY_IS_APPROX(v[22], x);\n  VERIFY((size_t)&(v[22]) == (size_t)&(v[21]) + sizeof(QuaternionType));\n\n  // do a lot of push_back such that the vector gets internally resized\n  // (with memory reallocation)\n  QuaternionType* ref = &w[0];\n  for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i)\n    v.push_back(w[i%w.size()]);\n  for(unsigned int i=23; i<v.size(); ++i)\n  {\n    VERIFY(v[i].coeffs()==w[(i-23)%w.size()].coeffs());\n  }\n}\n\nvoid test_stdvector_overload()\n{\n  // some non vectorizable fixed sizes\n  CALL_SUBTEST_1(check_stdvector_matrix(Vector2f()));\n  CALL_SUBTEST_1(check_stdvector_matrix(Matrix3f()));\n  CALL_SUBTEST_2(check_stdvector_matrix(Matrix3d()));\n\n  // some vectorizable fixed sizes\n  CALL_SUBTEST_1(check_stdvector_matrix(Matrix2f()));\n  CALL_SUBTEST_1(check_stdvector_matrix(Vector4f()));\n  CALL_SUBTEST_1(check_stdvector_matrix(Matrix4f()));\n  CALL_SUBTEST_2(check_stdvector_matrix(Matrix4d()));\n\n  // some dynamic sizes\n  CALL_SUBTEST_3(check_stdvector_matrix(MatrixXd(1,1)));\n  CALL_SUBTEST_3(check_stdvector_matrix(VectorXd(20)));\n  CALL_SUBTEST_3(check_stdvector_matrix(RowVectorXf(20)));\n  CALL_SUBTEST_3(check_stdvector_matrix(MatrixXcf(10,10)));\n\n  // some Transform\n  CALL_SUBTEST_4(check_stdvector_transform(Affine2f())); // does not need the specialization (2+1)^2 = 9\n  CALL_SUBTEST_4(check_stdvector_transform(Affine3f()));\n  CALL_SUBTEST_4(check_stdvector_transform(Affine3d()));\n\n  // some Quaternion\n  CALL_SUBTEST_5(check_stdvector_quaternion(Quaternionf()));\n  CALL_SUBTEST_5(check_stdvector_quaternion(Quaterniond()));\n}\n"
  },
  {
    "path": "libs/eigen/test/superlu_support.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2011 Gael Guennebaud <g.gael@free.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"sparse_solver.h\"\n\n#include <Eigen/SuperLUSupport>\n\nvoid test_superlu_support()\n{\n  SuperLU<SparseMatrix<double> > superlu_double_colmajor;\n  SuperLU<SparseMatrix<std::complex<double> > > superlu_cplxdouble_colmajor;\n  CALL_SUBTEST_1( check_sparse_square_solving(superlu_double_colmajor)      );\n  CALL_SUBTEST_2( check_sparse_square_solving(superlu_cplxdouble_colmajor)  );\n  CALL_SUBTEST_1( check_sparse_square_determinant(superlu_double_colmajor)      );\n  CALL_SUBTEST_2( check_sparse_square_determinant(superlu_cplxdouble_colmajor)  );\n}\n"
  },
  {
    "path": "libs/eigen/test/swap.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#define EIGEN_NO_STATIC_ASSERT\n#include \"main.h\"\n\ntemplate<typename T>\nstruct other_matrix_type\n{\n  typedef int type;\n};\n\ntemplate<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>\nstruct other_matrix_type<Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> >\n{\n  typedef Matrix<_Scalar, _Rows, _Cols, _Options^RowMajor, _MaxRows, _MaxCols> type;\n};\n\ntemplate<typename MatrixType> void swap(const MatrixType& m)\n{\n  typedef typename other_matrix_type<MatrixType>::type OtherMatrixType;\n  typedef typename MatrixType::Scalar Scalar;\n\n  eigen_assert((!internal::is_same<MatrixType,OtherMatrixType>::value));\n  typename MatrixType::Index rows = m.rows();\n  typename MatrixType::Index cols = m.cols();\n  \n  // construct 3 matrix guaranteed to be distinct\n  MatrixType m1 = MatrixType::Random(rows,cols);\n  MatrixType m2 = MatrixType::Random(rows,cols) + Scalar(100) * MatrixType::Identity(rows,cols);\n  OtherMatrixType m3 = OtherMatrixType::Random(rows,cols) + Scalar(200) * OtherMatrixType::Identity(rows,cols);\n  \n  MatrixType m1_copy = m1;\n  MatrixType m2_copy = m2;\n  OtherMatrixType m3_copy = m3;\n  \n  // test swapping 2 matrices of same type\n  m1.swap(m2);\n  VERIFY_IS_APPROX(m1,m2_copy);\n  VERIFY_IS_APPROX(m2,m1_copy);\n  m1 = m1_copy;\n  m2 = m2_copy;\n  \n  // test swapping 2 matrices of different types\n  m1.swap(m3);\n  VERIFY_IS_APPROX(m1,m3_copy);\n  VERIFY_IS_APPROX(m3,m1_copy);\n  m1 = m1_copy;\n  m3 = m3_copy;\n  \n  // test swapping matrix with expression\n  m1.swap(m2.block(0,0,rows,cols));\n  VERIFY_IS_APPROX(m1,m2_copy);\n  VERIFY_IS_APPROX(m2,m1_copy);\n  m1 = m1_copy;\n  m2 = m2_copy;\n\n  // test swapping two expressions of different types\n  m1.transpose().swap(m3.transpose());\n  VERIFY_IS_APPROX(m1,m3_copy);\n  VERIFY_IS_APPROX(m3,m1_copy);\n  m1 = m1_copy;\n  m3 = m3_copy;\n  \n  // test assertion on mismatching size -- matrix case\n  VERIFY_RAISES_ASSERT(m1.swap(m1.row(0)));\n  // test assertion on mismatching size -- xpr case\n  VERIFY_RAISES_ASSERT(m1.row(0).swap(m1));\n}\n\nvoid test_swap()\n{\n  CALL_SUBTEST_1( swap(Matrix3f()) ); // fixed size, no vectorization \n  CALL_SUBTEST_2( swap(Matrix4d()) ); // fixed size, possible vectorization \n  CALL_SUBTEST_3( swap(MatrixXd(3,3)) ); // dyn size, no vectorization \n  CALL_SUBTEST_4( swap(MatrixXf(30,30)) ); // dyn size, possible vectorization \n}\n"
  },
  {
    "path": "libs/eigen/test/testsuite.cmake",
    "content": "\n####################################################################\n#\n# Usage:\n#  - create a new folder, let's call it cdash\n#  - in that folder, do:\n#    ctest -S path/to/eigen/test/testsuite.cmake[,option1=value1[,option2=value2]]\n#\n# Options:\n#  - EIGEN_CXX: compiler, eg.: g++-4.2\n#      default: default c++ compiler\n#  - EIGEN_SITE: eg, INRIA-Bdx_pc-gael, or the name of the contributor, etc.\n#      default: hostname\n#  - EIGEN_BUILD_STRING: a string which identify the system/compiler. It should be formed like that:\n#        <OS_name>-<OS_version>-<arch>-<compiler-version>\n#      with:\n#        <OS_name> = opensuse, debian, osx, windows, cygwin, freebsd, solaris, etc.\n#        <OS_version> = 11.1, XP, vista, leopard, etc.\n#        <arch> = i386, x86_64, ia64, powerpc, etc.\n#        <compiler-version> = gcc-4.3.2, icc-11.0, MSVC-2008, etc.\n#  - EIGEN_EXPLICIT_VECTORIZATION: novec, SSE2, Altivec\n#       default: SSE2 for x86_64 systems, novec otherwise\n#       Its value is automatically appended to EIGEN_BUILD_STRING\n#  - EIGEN_CMAKE_DIR: path to cmake executable\n#  - EIGEN_MODE: dashboard model, can be Experimental, Nightly, or Continuous\n#      default: Nightly\n#  - EIGEN_WORK_DIR: directory used to download the source files and make the builds\n#      default: folder which contains this script\n#  - EIGEN_CMAKE_ARGS: additional arguments passed to cmake\n#  - EIGEN_GENERATOR_TYPE: allows to overwrite the generator type\n#      default: nmake (windows\n#      See http://www.cmake.org/cmake/help/cmake2.6docs.html#section_Generators for a complete\n#      list of supported generators.\n#  - EIGEN_NO_UPDATE: allows to submit dash boards from local repositories\n#      This might be interesting in case you want to submit dashboards\n#      including local changes.\n#  - CTEST_SOURCE_DIRECTORY: path to eigen's src (use a new and empty folder, not the one you are working on)\n#      default: <EIGEN_WORK_DIR>/src\n#  - CTEST_BINARY_DIRECTORY: build directory\n#      default: <EIGEN_WORK_DIR>/nightly-<EIGEN_CXX>\n#\n# Here is an example running several compilers on a linux system:\n# #!/bin/bash\n# ARCH=`uname -m`\n# SITE=`hostname`\n# VERSION=opensuse-11.1\n# WORK_DIR=/home/gael/Coding/eigen/cdash\n# # get the last version of the script\n# wget http://bitbucket.org/eigen/eigen/raw/tip/test/testsuite.cmake -o $WORK_DIR/testsuite.cmake\n# COMMON=\"ctest -S $WORK_DIR/testsuite.cmake,EIGEN_WORK_DIR=$WORK_DIR,EIGEN_SITE=$SITE,EIGEN_MODE=$1,EIGEN_BUILD_STRING=$OS_VERSION-$ARCH\"\n# $COMMON-gcc-3.4.6,EIGEN_CXX=g++-3.4\n# $COMMON-gcc-4.0.1,EIGEN_CXX=g++-4.0.1\n# $COMMON-gcc-4.3.2,EIGEN_CXX=g++-4.3,EIGEN_EXPLICIT_VECTORIZATION=novec\n# $COMMON-gcc-4.3.2,EIGEN_CXX=g++-4.3,EIGEN_EXPLICIT_VECTORIZATION=SSE2\n# $COMMON-icc-11.0,EIGEN_CXX=icpc\n#\n####################################################################\n\n# process the arguments\n\nset(ARGLIST ${CTEST_SCRIPT_ARG})\nwhile(${ARGLIST} MATCHES  \".+.*\")\n\n  # pick first\n  string(REGEX MATCH \"([^,]*)(,.*)?\" DUMMY ${ARGLIST})\n  SET(TOP ${CMAKE_MATCH_1})\n\n  # remove first\n  string(REGEX MATCHALL \"[^,]*,(.*)\" DUMMY ${ARGLIST})\n  SET(ARGLIST ${CMAKE_MATCH_1})\n\n  # decompose as a pair key=value\n  string(REGEX MATCH \"([^=]*)(=.*)?\" DUMMY ${TOP})\n  SET(KEY ${CMAKE_MATCH_1})\n\n  string(REGEX MATCH \"[^=]*=(.*)\" DUMMY ${TOP})\n  SET(VALUE ${CMAKE_MATCH_1})\n\n  # set the variable to the specified value\n  if(VALUE)\n    SET(${KEY} ${VALUE})\n  else(VALUE)\n    SET(${KEY} ON)\n  endif(VALUE)\n\nendwhile(${ARGLIST} MATCHES \".+.*\")\n\n####################################################################\n# Automatically set some user variables if they have not been defined manually\n####################################################################\ncmake_minimum_required(VERSION 2.6 FATAL_ERROR)\n\nif(NOT EIGEN_SITE)\n  site_name(EIGEN_SITE)\nendif(NOT EIGEN_SITE)\n\nif(NOT EIGEN_CMAKE_DIR)\n  SET(EIGEN_CMAKE_DIR \"\")\nendif(NOT EIGEN_CMAKE_DIR)\n\nif(NOT EIGEN_BUILD_STRING)\n\n  # let's try to find all information we need to make the build string ourself\n\n  # OS\n  build_name(EIGEN_OS_VERSION)\n\n  # arch\n  set(EIGEN_ARCH ${CMAKE_SYSTEM_PROCESSOR})\n  if(WIN32)\n    set(EIGEN_ARCH $ENV{PROCESSOR_ARCHITECTURE})\n  else(WIN32)\n    execute_process(COMMAND uname -m OUTPUT_VARIABLE EIGEN_ARCH OUTPUT_STRIP_TRAILING_WHITESPACE)\n  endif(WIN32)\n\n  set(EIGEN_BUILD_STRING ${EIGEN_OS_VERSION}${EIGEN_ARCH}-${EIGEN_CXX})\n\nendif(NOT EIGEN_BUILD_STRING)\n\nif(DEFINED EIGEN_EXPLICIT_VECTORIZATION)\n  set(EIGEN_BUILD_STRING ${EIGEN_BUILD_STRING}-${EIGEN_EXPLICIT_VECTORIZATION})\nendif(DEFINED EIGEN_EXPLICIT_VECTORIZATION)\n\nif(NOT EIGEN_WORK_DIR)\n  set(EIGEN_WORK_DIR ${CTEST_SCRIPT_DIRECTORY})\nendif(NOT EIGEN_WORK_DIR)\n\nif(NOT CTEST_SOURCE_DIRECTORY)\n  SET (CTEST_SOURCE_DIRECTORY \"${EIGEN_WORK_DIR}/src\")\nendif(NOT CTEST_SOURCE_DIRECTORY)\n\nif(NOT CTEST_BINARY_DIRECTORY)\n  SET (CTEST_BINARY_DIRECTORY \"${EIGEN_WORK_DIR}/nightly_${EIGEN_CXX}\")\nendif(NOT CTEST_BINARY_DIRECTORY)\n\nif(NOT EIGEN_MODE)\n  set(EIGEN_MODE Nightly)\nendif(NOT EIGEN_MODE)\n\n## mandatory variables (the default should be ok in most cases):\n\nif(NOT EIGEN_NO_UPDATE)\n  SET (CTEST_CVS_COMMAND \"hg\")\n  SET (CTEST_CVS_CHECKOUT \"${CTEST_CVS_COMMAND} clone http://bitbucket.org/eigen/eigen \\\"${CTEST_SOURCE_DIRECTORY}\\\"\")\n  SET(CTEST_BACKUP_AND_RESTORE TRUE) # the backup is CVS related ...\nendif(NOT EIGEN_NO_UPDATE)\n\n# which ctest command to use for running the dashboard\nSET (CTEST_COMMAND \"${EIGEN_CMAKE_DIR}ctest -D ${EIGEN_MODE} --no-compress-output\")\nif($ENV{EIGEN_CTEST_ARGS})\nSET (CTEST_COMMAND \"${CTEST_COMMAND} $ENV{EIGEN_CTEST_ARGS}\")\nendif($ENV{EIGEN_CTEST_ARGS})\n# what cmake command to use for configuring this dashboard\nSET (CTEST_CMAKE_COMMAND \"${EIGEN_CMAKE_DIR}cmake -DEIGEN_LEAVE_TEST_IN_ALL_TARGET=ON\")\n\n####################################################################\n# The values in this section are optional you can either\n# have them or leave them commented out\n####################################################################\n\n# this make sure we get consistent outputs\nSET($ENV{LC_MESSAGES} \"en_EN\")\n\n# should ctest wipe the binary tree before running\nSET(CTEST_START_WITH_EMPTY_BINARY_DIRECTORY TRUE)\n\n# raise the warning/error limit\nset(CTEST_CUSTOM_MAXIMUM_NUMBER_OF_WARNINGS \"33331\")\nset(CTEST_CUSTOM_MAXIMUM_NUMBER_OF_ERRORS \"33331\")\n\n# this is the initial cache to use for the binary tree, be careful to escape\n# any quotes inside of this string if you use it\nif(WIN32 AND NOT UNIX)\n  #message(SEND_ERROR \"win32\")\n  if(EIGEN_GENERATOR_TYPE)\n    set(CTEST_CMAKE_COMMAND \"${CTEST_CMAKE_COMMAND} -G \\\"${EIGEN_GENERATOR_TYPE}\\\"\")\n    SET (CTEST_INITIAL_CACHE \"\n      CMAKE_BUILD_TYPE:STRING=Release\n      BUILDNAME:STRING=${EIGEN_BUILD_STRING}\n      SITE:STRING=${EIGEN_SITE}\n    \")\n  else(EIGEN_GENERATOR_TYPE)\n    set(CTEST_CMAKE_COMMAND \"${CTEST_CMAKE_COMMAND} -G \\\"NMake Makefiles\\\" -DCMAKE_MAKE_PROGRAM=nmake\")\n    SET (CTEST_INITIAL_CACHE \"\n      MAKECOMMAND:STRING=nmake /i\n      CMAKE_MAKE_PROGRAM:FILEPATH=nmake\n      CMAKE_GENERATOR:INTERNAL=NMake Makefiles\n      CMAKE_BUILD_TYPE:STRING=Release\n      BUILDNAME:STRING=${EIGEN_BUILD_STRING}\n      SITE:STRING=${EIGEN_SITE}\n    \")\n  endif(EIGEN_GENERATOR_TYPE)\nelse(WIN32 AND NOT UNIX)\n  SET (CTEST_INITIAL_CACHE \"\n    BUILDNAME:STRING=${EIGEN_BUILD_STRING}\n    SITE:STRING=${EIGEN_SITE}\n  \")\nendif(WIN32 AND NOT UNIX)\n\n# set any extra environment variables to use during the execution of the script here:\n# setting this variable on windows machines causes trouble ...\n\nif(EIGEN_CXX AND NOT WIN32)\n  set(CTEST_ENVIRONMENT \"CXX=${EIGEN_CXX}\")\nendif(EIGEN_CXX AND NOT WIN32)\n\nif(DEFINED EIGEN_EXPLICIT_VECTORIZATION)\n  if(EIGEN_EXPLICIT_VECTORIZATION MATCHES SSE2)\n    set(CTEST_CMAKE_COMMAND \"${CTEST_CMAKE_COMMAND} -DEIGEN_TEST_SSE2=ON\")\n  elseif(EIGEN_EXPLICIT_VECTORIZATION MATCHES SSE3)\n    set(CTEST_CMAKE_COMMAND \"${CTEST_CMAKE_COMMAND} -DEIGEN_TEST_SSE2=ON -DEIGEN_TEST_SSE3=ON\")\n  elseif(EIGEN_EXPLICIT_VECTORIZATION MATCHES SSSE3)\n    set(CTEST_CMAKE_COMMAND \"${CTEST_CMAKE_COMMAND} -DEIGEN_TEST_SSE2=ON -DEIGEN_TEST_SSE3=ON -DEIGEN_TEST_SSSE3=ON\")  \n  elseif(EIGEN_EXPLICIT_VECTORIZATION MATCHES SSE4_1)\n    set(CTEST_CMAKE_COMMAND \"${CTEST_CMAKE_COMMAND} -DEIGEN_TEST_SSE2=ON -DEIGEN_TEST_SSE3=ON -DEIGEN_TEST_SSSE3=ON -DEIGEN_TEST_SSE4_1=ON\")\n  elseif(EIGEN_EXPLICIT_VECTORIZATION MATCHES SSE4_2)\n    set(CTEST_CMAKE_COMMAND \"${CTEST_CMAKE_COMMAND} -DEIGEN_TEST_SSE2=ON -DEIGEN_TEST_SSE3=ON -DEIGEN_TEST_SSSE3=ON -DEIGEN_TEST_SSE4_1=ON -DEIGEN_TEST_SSE4_2=ON\")\n  elseif(EIGEN_EXPLICIT_VECTORIZATION MATCHES Altivec)\n    set(CTEST_CMAKE_COMMAND \"${CTEST_CMAKE_COMMAND} -DEIGEN_TEST_ALTIVEC=ON\")\n  elseif(EIGEN_EXPLICIT_VECTORIZATION MATCHES novec)\n    set(CTEST_CMAKE_COMMAND \"${CTEST_CMAKE_COMMAND} -DEIGEN_TEST_NO_EXPLICIT_VECTORIZATION=ON\")\n  else(EIGEN_EXPLICIT_VECTORIZATION MATCHES SSE2)\n    message(FATAL_ERROR \"Invalid value for EIGEN_EXPLICIT_VECTORIZATION (${EIGEN_EXPLICIT_VECTORIZATION}), must be: novec, SSE2, SSE3, Altivec\")\n  endif(EIGEN_EXPLICIT_VECTORIZATION MATCHES SSE2)\nendif(DEFINED EIGEN_EXPLICIT_VECTORIZATION)\n\nif(DEFINED EIGEN_CMAKE_ARGS)\n  set(CTEST_CMAKE_COMMAND \"${CTEST_CMAKE_COMMAND} ${EIGEN_CMAKE_ARGS}\")\nendif(DEFINED EIGEN_CMAKE_ARGS)\n"
  },
  {
    "path": "libs/eigen/test/triangular.cpp",
    "content": "// This file is triangularView of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\n\n\ntemplate<typename MatrixType> void triangular_square(const MatrixType& m)\n{\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> VectorType;\n\n  RealScalar largerEps = 10*test_precision<RealScalar>();\n\n  typename MatrixType::Index rows = m.rows();\n  typename MatrixType::Index cols = m.cols();\n\n  MatrixType m1 = MatrixType::Random(rows, cols),\n             m2 = MatrixType::Random(rows, cols),\n             m3(rows, cols),\n             m4(rows, cols),\n             r1(rows, cols),\n             r2(rows, cols);\n  VectorType v2 = VectorType::Random(rows);\n\n  MatrixType m1up = m1.template triangularView<Upper>();\n  MatrixType m2up = m2.template triangularView<Upper>();\n\n  if (rows*cols>1)\n  {\n    VERIFY(m1up.isUpperTriangular());\n    VERIFY(m2up.transpose().isLowerTriangular());\n    VERIFY(!m2.isLowerTriangular());\n  }\n\n//   VERIFY_IS_APPROX(m1up.transpose() * m2, m1.upper().transpose().lower() * m2);\n\n  // test overloaded operator+=\n  r1.setZero();\n  r2.setZero();\n  r1.template triangularView<Upper>() +=  m1;\n  r2 += m1up;\n  VERIFY_IS_APPROX(r1,r2);\n\n  // test overloaded operator=\n  m1.setZero();\n  m1.template triangularView<Upper>() = m2.transpose() + m2;\n  m3 = m2.transpose() + m2;\n  VERIFY_IS_APPROX(m3.template triangularView<Lower>().transpose().toDenseMatrix(), m1);\n\n  // test overloaded operator=\n  m1.setZero();\n  m1.template triangularView<Lower>() = m2.transpose() + m2;\n  VERIFY_IS_APPROX(m3.template triangularView<Lower>().toDenseMatrix(), m1);\n\n  VERIFY_IS_APPROX(m3.template triangularView<Lower>().conjugate().toDenseMatrix(),\n                   m3.conjugate().template triangularView<Lower>().toDenseMatrix());\n\n  m1 = MatrixType::Random(rows, cols);\n  for (int i=0; i<rows; ++i)\n    while (numext::abs2(m1(i,i))<1e-1) m1(i,i) = internal::random<Scalar>();\n\n  Transpose<MatrixType> trm4(m4);\n  // test back and forward subsitution with a vector as the rhs\n  m3 = m1.template triangularView<Upper>();\n  VERIFY(v2.isApprox(m3.adjoint() * (m1.adjoint().template triangularView<Lower>().solve(v2)), largerEps));\n  m3 = m1.template triangularView<Lower>();\n  VERIFY(v2.isApprox(m3.transpose() * (m1.transpose().template triangularView<Upper>().solve(v2)), largerEps));\n  m3 = m1.template triangularView<Upper>();\n  VERIFY(v2.isApprox(m3 * (m1.template triangularView<Upper>().solve(v2)), largerEps));\n  m3 = m1.template triangularView<Lower>();\n  VERIFY(v2.isApprox(m3.conjugate() * (m1.conjugate().template triangularView<Lower>().solve(v2)), largerEps));\n\n  // test back and forward subsitution with a matrix as the rhs\n  m3 = m1.template triangularView<Upper>();\n  VERIFY(m2.isApprox(m3.adjoint() * (m1.adjoint().template triangularView<Lower>().solve(m2)), largerEps));\n  m3 = m1.template triangularView<Lower>();\n  VERIFY(m2.isApprox(m3.transpose() * (m1.transpose().template triangularView<Upper>().solve(m2)), largerEps));\n  m3 = m1.template triangularView<Upper>();\n  VERIFY(m2.isApprox(m3 * (m1.template triangularView<Upper>().solve(m2)), largerEps));\n  m3 = m1.template triangularView<Lower>();\n  VERIFY(m2.isApprox(m3.conjugate() * (m1.conjugate().template triangularView<Lower>().solve(m2)), largerEps));\n\n  // check M * inv(L) using in place API\n  m4 = m3;\n  m1.transpose().template triangularView<Eigen::Upper>().solveInPlace(trm4);\n  VERIFY_IS_APPROX(m4 * m1.template triangularView<Eigen::Lower>(), m3);\n\n  // check M * inv(U) using in place API\n  m3 = m1.template triangularView<Upper>();\n  m4 = m3;\n  m3.transpose().template triangularView<Eigen::Lower>().solveInPlace(trm4);\n  VERIFY_IS_APPROX(m4 * m1.template triangularView<Eigen::Upper>(), m3);\n\n  // check solve with unit diagonal\n  m3 = m1.template triangularView<UnitUpper>();\n  VERIFY(m2.isApprox(m3 * (m1.template triangularView<UnitUpper>().solve(m2)), largerEps));\n\n//   VERIFY((  m1.template triangularView<Upper>()\n//           * m2.template triangularView<Upper>()).isUpperTriangular());\n\n  // test swap\n  m1.setOnes();\n  m2.setZero();\n  m2.template triangularView<Upper>().swap(m1);\n  m3.setZero();\n  m3.template triangularView<Upper>().setOnes();\n  VERIFY_IS_APPROX(m2,m3);\n\n}\n\n\ntemplate<typename MatrixType> void triangular_rect(const MatrixType& m)\n{\n  typedef const typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  enum { Rows =  MatrixType::RowsAtCompileTime, Cols =  MatrixType::ColsAtCompileTime };\n\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  MatrixType m1 = MatrixType::Random(rows, cols),\n             m2 = MatrixType::Random(rows, cols),\n             m3(rows, cols),\n             m4(rows, cols),\n             r1(rows, cols),\n             r2(rows, cols);\n\n  MatrixType m1up = m1.template triangularView<Upper>();\n  MatrixType m2up = m2.template triangularView<Upper>();\n\n  if (rows>1 && cols>1)\n  {\n    VERIFY(m1up.isUpperTriangular());\n    VERIFY(m2up.transpose().isLowerTriangular());\n    VERIFY(!m2.isLowerTriangular());\n  }\n\n  // test overloaded operator+=\n  r1.setZero();\n  r2.setZero();\n  r1.template triangularView<Upper>() +=  m1;\n  r2 += m1up;\n  VERIFY_IS_APPROX(r1,r2);\n\n  // test overloaded operator=\n  m1.setZero();\n  m1.template triangularView<Upper>() = 3 * m2;\n  m3 = 3 * m2;\n  VERIFY_IS_APPROX(m3.template triangularView<Upper>().toDenseMatrix(), m1);\n\n\n  m1.setZero();\n  m1.template triangularView<Lower>() = 3 * m2;\n  VERIFY_IS_APPROX(m3.template triangularView<Lower>().toDenseMatrix(), m1);\n\n  m1.setZero();\n  m1.template triangularView<StrictlyUpper>() = 3 * m2;\n  VERIFY_IS_APPROX(m3.template triangularView<StrictlyUpper>().toDenseMatrix(), m1);\n\n\n  m1.setZero();\n  m1.template triangularView<StrictlyLower>() = 3 * m2;\n  VERIFY_IS_APPROX(m3.template triangularView<StrictlyLower>().toDenseMatrix(), m1);\n  m1.setRandom();\n  m2 = m1.template triangularView<Upper>();\n  VERIFY(m2.isUpperTriangular());\n  VERIFY(!m2.isLowerTriangular());\n  m2 = m1.template triangularView<StrictlyUpper>();\n  VERIFY(m2.isUpperTriangular());\n  VERIFY(m2.diagonal().isMuchSmallerThan(RealScalar(1)));\n  m2 = m1.template triangularView<UnitUpper>();\n  VERIFY(m2.isUpperTriangular());\n  m2.diagonal().array() -= Scalar(1);\n  VERIFY(m2.diagonal().isMuchSmallerThan(RealScalar(1)));\n  m2 = m1.template triangularView<Lower>();\n  VERIFY(m2.isLowerTriangular());\n  VERIFY(!m2.isUpperTriangular());\n  m2 = m1.template triangularView<StrictlyLower>();\n  VERIFY(m2.isLowerTriangular());\n  VERIFY(m2.diagonal().isMuchSmallerThan(RealScalar(1)));\n  m2 = m1.template triangularView<UnitLower>();\n  VERIFY(m2.isLowerTriangular());\n  m2.diagonal().array() -= Scalar(1);\n  VERIFY(m2.diagonal().isMuchSmallerThan(RealScalar(1)));\n  // test swap\n  m1.setOnes();\n  m2.setZero();\n  m2.template triangularView<Upper>().swap(m1);\n  m3.setZero();\n  m3.template triangularView<Upper>().setOnes();\n  VERIFY_IS_APPROX(m2,m3);\n}\n\nvoid bug_159()\n{\n  Matrix3d m = Matrix3d::Random().triangularView<Lower>();\n  EIGEN_UNUSED_VARIABLE(m)\n}\n\nvoid test_triangular()\n{\n  int maxsize = (std::min)(EIGEN_TEST_MAX_SIZE,20);\n  for(int i = 0; i < g_repeat ; i++)\n  {\n    int r = internal::random<int>(2,maxsize); TEST_SET_BUT_UNUSED_VARIABLE(r)\n    int c = internal::random<int>(2,maxsize); TEST_SET_BUT_UNUSED_VARIABLE(c)\n\n    CALL_SUBTEST_1( triangular_square(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( triangular_square(Matrix<float, 2, 2>()) );\n    CALL_SUBTEST_3( triangular_square(Matrix3d()) );\n    CALL_SUBTEST_4( triangular_square(Matrix<std::complex<float>,8, 8>()) );\n    CALL_SUBTEST_5( triangular_square(MatrixXcd(r,r)) );\n    CALL_SUBTEST_6( triangular_square(Matrix<float,Dynamic,Dynamic,RowMajor>(r, r)) );\n\n    CALL_SUBTEST_7( triangular_rect(Matrix<float, 4, 5>()) );\n    CALL_SUBTEST_8( triangular_rect(Matrix<double, 6, 2>()) );\n    CALL_SUBTEST_9( triangular_rect(MatrixXcf(r, c)) );\n    CALL_SUBTEST_5( triangular_rect(MatrixXcd(r, c)) );\n    CALL_SUBTEST_6( triangular_rect(Matrix<float,Dynamic,Dynamic,RowMajor>(r, c)) );\n  }\n  \n  CALL_SUBTEST_1( bug_159() );\n}\n"
  },
  {
    "path": "libs/eigen/test/umeyama.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Hauke Heibel <hauke.heibel@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\n#include <Eigen/Core>\n#include <Eigen/Geometry>\n\n#include <Eigen/LU> // required for MatrixBase::determinant\n#include <Eigen/SVD> // required for SVD\n\nusing namespace Eigen;\n\n//  Constructs a random matrix from the unitary group U(size).\ntemplate <typename T>\nEigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> randMatrixUnitary(int size)\n{\n  typedef T Scalar;\n  typedef Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> MatrixType;\n\n  MatrixType Q;\n\n  int max_tries = 40;\n  double is_unitary = false;\n\n  while (!is_unitary && max_tries > 0)\n  {\n    // initialize random matrix\n    Q = MatrixType::Random(size, size);\n\n    // orthogonalize columns using the Gram-Schmidt algorithm\n    for (int col = 0; col < size; ++col)\n    {\n      typename MatrixType::ColXpr colVec = Q.col(col);\n      for (int prevCol = 0; prevCol < col; ++prevCol)\n      {\n        typename MatrixType::ColXpr prevColVec = Q.col(prevCol);\n        colVec -= colVec.dot(prevColVec)*prevColVec;\n      }\n      Q.col(col) = colVec.normalized();\n    }\n\n    // this additional orthogonalization is not necessary in theory but should enhance\n    // the numerical orthogonality of the matrix\n    for (int row = 0; row < size; ++row)\n    {\n      typename MatrixType::RowXpr rowVec = Q.row(row);\n      for (int prevRow = 0; prevRow < row; ++prevRow)\n      {\n        typename MatrixType::RowXpr prevRowVec = Q.row(prevRow);\n        rowVec -= rowVec.dot(prevRowVec)*prevRowVec;\n      }\n      Q.row(row) = rowVec.normalized();\n    }\n\n    // final check\n    is_unitary = Q.isUnitary();\n    --max_tries;\n  }\n\n  if (max_tries == 0)\n    eigen_assert(false && \"randMatrixUnitary: Could not construct unitary matrix!\");\n\n  return Q;\n}\n\n//  Constructs a random matrix from the special unitary group SU(size).\ntemplate <typename T>\nEigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> randMatrixSpecialUnitary(int size)\n{\n  typedef T Scalar;\n\n  typedef Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> MatrixType;\n\n  // initialize unitary matrix\n  MatrixType Q = randMatrixUnitary<Scalar>(size);\n\n  // tweak the first column to make the determinant be 1\n  Q.col(0) *= numext::conj(Q.determinant());\n\n  return Q;\n}\n\ntemplate <typename MatrixType>\nvoid run_test(int dim, int num_elements)\n{\n  using std::abs;\n  typedef typename internal::traits<MatrixType>::Scalar Scalar;\n  typedef Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> MatrixX;\n  typedef Matrix<Scalar, Eigen::Dynamic, 1> VectorX;\n\n  // MUST be positive because in any other case det(cR_t) may become negative for\n  // odd dimensions!\n  const Scalar c = abs(internal::random<Scalar>());\n\n  MatrixX R = randMatrixSpecialUnitary<Scalar>(dim);\n  VectorX t = Scalar(50)*VectorX::Random(dim,1);\n\n  MatrixX cR_t = MatrixX::Identity(dim+1,dim+1);\n  cR_t.block(0,0,dim,dim) = c*R;\n  cR_t.block(0,dim,dim,1) = t;\n\n  MatrixX src = MatrixX::Random(dim+1, num_elements);\n  src.row(dim) = Matrix<Scalar, 1, Dynamic>::Constant(num_elements, Scalar(1));\n\n  MatrixX dst = cR_t*src;\n\n  MatrixX cR_t_umeyama = umeyama(src.block(0,0,dim,num_elements), dst.block(0,0,dim,num_elements));\n\n  const Scalar error = ( cR_t_umeyama*src - dst ).norm() / dst.norm();\n  VERIFY(error < Scalar(40)*std::numeric_limits<Scalar>::epsilon());\n}\n\ntemplate<typename Scalar, int Dimension>\nvoid run_fixed_size_test(int num_elements)\n{\n  using std::abs;\n  typedef Matrix<Scalar, Dimension+1, Dynamic> MatrixX;\n  typedef Matrix<Scalar, Dimension+1, Dimension+1> HomMatrix;\n  typedef Matrix<Scalar, Dimension, Dimension> FixedMatrix;\n  typedef Matrix<Scalar, Dimension, 1> FixedVector;\n\n  const int dim = Dimension;\n\n  // MUST be positive because in any other case det(cR_t) may become negative for\n  // odd dimensions!\n  // Also if c is to small compared to t.norm(), problem is ill-posed (cf. Bug 744)\n  const Scalar c = internal::random<Scalar>(0.5, 2.0);\n\n  FixedMatrix R = randMatrixSpecialUnitary<Scalar>(dim);\n  FixedVector t = Scalar(32)*FixedVector::Random(dim,1);\n\n  HomMatrix cR_t = HomMatrix::Identity(dim+1,dim+1);\n  cR_t.block(0,0,dim,dim) = c*R;\n  cR_t.block(0,dim,dim,1) = t;\n\n  MatrixX src = MatrixX::Random(dim+1, num_elements);\n  src.row(dim) = Matrix<Scalar, 1, Dynamic>::Constant(num_elements, Scalar(1));\n\n  MatrixX dst = cR_t*src;\n\n  Block<MatrixX, Dimension, Dynamic> src_block(src,0,0,dim,num_elements);\n  Block<MatrixX, Dimension, Dynamic> dst_block(dst,0,0,dim,num_elements);\n\n  HomMatrix cR_t_umeyama = umeyama(src_block, dst_block);\n\n  const Scalar error = ( cR_t_umeyama*src - dst ).squaredNorm();\n\n  VERIFY(error < Scalar(16)*std::numeric_limits<Scalar>::epsilon());\n}\n\nvoid test_umeyama()\n{\n  for (int i=0; i<g_repeat; ++i)\n  {\n    const int num_elements = internal::random<int>(40,500);\n\n    // works also for dimensions bigger than 3...\n    for (int dim=2; dim<8; ++dim)\n    {\n      CALL_SUBTEST_1(run_test<MatrixXd>(dim, num_elements));\n      CALL_SUBTEST_2(run_test<MatrixXf>(dim, num_elements));\n    }\n\n    CALL_SUBTEST_3((run_fixed_size_test<float, 2>(num_elements)));\n    CALL_SUBTEST_4((run_fixed_size_test<float, 3>(num_elements)));\n    CALL_SUBTEST_5((run_fixed_size_test<float, 4>(num_elements)));\n\n    CALL_SUBTEST_6((run_fixed_size_test<double, 2>(num_elements)));\n    CALL_SUBTEST_7((run_fixed_size_test<double, 3>(num_elements)));\n    CALL_SUBTEST_8((run_fixed_size_test<double, 4>(num_elements)));\n  }\n\n  // Those two calls don't compile and result in meaningful error messages!\n  // umeyama(MatrixXcf(),MatrixXcf());\n  // umeyama(MatrixXcd(),MatrixXcd());\n}\n"
  },
  {
    "path": "libs/eigen/test/umfpack_support.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2011 Gael Guennebaud <g.gael@free.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"sparse_solver.h\"\n\n#include <Eigen/UmfPackSupport>\n\ntemplate<typename T> void test_umfpack_support_T()\n{\n  UmfPackLU<SparseMatrix<T, ColMajor> > umfpack_colmajor;\n  UmfPackLU<SparseMatrix<T, RowMajor> > umfpack_rowmajor;\n  \n  check_sparse_square_solving(umfpack_colmajor);\n  check_sparse_square_solving(umfpack_rowmajor);\n  \n  check_sparse_square_determinant(umfpack_colmajor);\n  check_sparse_square_determinant(umfpack_rowmajor);\n}\n\nvoid test_umfpack_support()\n{\n  CALL_SUBTEST_1(test_umfpack_support_T<double>());\n  CALL_SUBTEST_2(test_umfpack_support_T<std::complex<double> >());\n}\n\n"
  },
  {
    "path": "libs/eigen/test/unalignedassert.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\nstruct TestNew1\n{\n  MatrixXd m; // good: m will allocate its own array, taking care of alignment.\n  TestNew1() : m(20,20) {}\n};\n\nstruct TestNew2\n{\n  Matrix3d m; // good: m's size isn't a multiple of 16 bytes, so m doesn't have to be 16-byte aligned,\n              // 8-byte alignment is good enough here, which we'll get automatically\n};\n\nstruct TestNew3\n{\n  Vector2f m; // good: m's size isn't a multiple of 16 bytes, so m doesn't have to be 16-byte aligned\n};\n\nstruct TestNew4\n{\n  EIGEN_MAKE_ALIGNED_OPERATOR_NEW\n  Vector2d m;\n  float f; // make the struct have sizeof%16!=0 to make it a little more tricky when we allow an array of 2 such objects\n};\n\nstruct TestNew5\n{\n  EIGEN_MAKE_ALIGNED_OPERATOR_NEW\n  float f; // try the f at first -- the EIGEN_ALIGN16 attribute of m should make that still work\n  Matrix4f m;\n};\n\nstruct TestNew6\n{\n  Matrix<float,2,2,DontAlign> m; // good: no alignment requested\n  float f;\n};\n\ntemplate<bool Align> struct Depends\n{\n  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(Align)\n  Vector2d m;\n  float f;\n};\n\ntemplate<typename T>\nvoid check_unalignedassert_good()\n{\n  T *x, *y;\n  x = new T;\n  delete x;\n  y = new T[2];\n  delete[] y;\n}\n\n#if EIGEN_ALIGN_STATICALLY\ntemplate<typename T>\nvoid construct_at_boundary(int boundary)\n{\n  char buf[sizeof(T)+256];\n  size_t _buf = reinterpret_cast<size_t>(buf);\n  _buf += (16 - (_buf % 16)); // make 16-byte aligned\n  _buf += boundary; // make exact boundary-aligned\n  T *x = ::new(reinterpret_cast<void*>(_buf)) T;\n  x[0].setZero(); // just in order to silence warnings\n  x->~T();\n}\n#endif\n\nvoid unalignedassert()\n{\n  #if EIGEN_ALIGN_STATICALLY\n  construct_at_boundary<Vector2f>(4);\n  construct_at_boundary<Vector3f>(4);\n  construct_at_boundary<Vector4f>(16);\n  construct_at_boundary<Matrix2f>(16);\n  construct_at_boundary<Matrix3f>(4);\n  construct_at_boundary<Matrix4f>(16);\n\n  construct_at_boundary<Vector2d>(16);\n  construct_at_boundary<Vector3d>(4);\n  construct_at_boundary<Vector4d>(16);\n  construct_at_boundary<Matrix2d>(16);\n  construct_at_boundary<Matrix3d>(4);\n  construct_at_boundary<Matrix4d>(16);\n\n  construct_at_boundary<Vector2cf>(16);\n  construct_at_boundary<Vector3cf>(4);\n  construct_at_boundary<Vector2cd>(16);\n  construct_at_boundary<Vector3cd>(16);\n  #endif\n\n  check_unalignedassert_good<TestNew1>();\n  check_unalignedassert_good<TestNew2>();\n  check_unalignedassert_good<TestNew3>();\n\n  check_unalignedassert_good<TestNew4>();\n  check_unalignedassert_good<TestNew5>();\n  check_unalignedassert_good<TestNew6>();\n  check_unalignedassert_good<Depends<true> >();\n\n#if EIGEN_ALIGN_STATICALLY\n  VERIFY_RAISES_ASSERT(construct_at_boundary<Vector4f>(8));\n  VERIFY_RAISES_ASSERT(construct_at_boundary<Matrix4f>(8));\n  VERIFY_RAISES_ASSERT(construct_at_boundary<Vector2d>(8));\n  VERIFY_RAISES_ASSERT(construct_at_boundary<Vector4d>(8));\n  VERIFY_RAISES_ASSERT(construct_at_boundary<Matrix2d>(8));\n  VERIFY_RAISES_ASSERT(construct_at_boundary<Matrix4d>(8));\n  VERIFY_RAISES_ASSERT(construct_at_boundary<Vector2cf>(8));\n  VERIFY_RAISES_ASSERT(construct_at_boundary<Vector2cd>(8));\n#endif\n}\n\nvoid test_unalignedassert()\n{\n  CALL_SUBTEST(unalignedassert());\n}\n"
  },
  {
    "path": "libs/eigen/test/unalignedcount.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\nstatic int nb_load;\nstatic int nb_loadu;\nstatic int nb_store;\nstatic int nb_storeu;\n\n#define EIGEN_DEBUG_ALIGNED_LOAD    { nb_load++;    }\n#define EIGEN_DEBUG_UNALIGNED_LOAD  { nb_loadu++;   }\n#define EIGEN_DEBUG_ALIGNED_STORE   { nb_store++;   }\n#define EIGEN_DEBUG_UNALIGNED_STORE { nb_storeu++;  }\n\n#define VERIFY_ALIGNED_UNALIGNED_COUNT(XPR,AL,UL,AS,US) {\\\n    nb_load = nb_loadu = nb_store = nb_storeu = 0; \\\n    XPR; \\\n    if(!(nb_load==AL && nb_loadu==UL && nb_store==AS && nb_storeu==US)) \\\n      std::cerr << \" >> \" << nb_load << \", \" << nb_loadu << \", \" << nb_store << \", \" << nb_storeu << \"\\n\"; \\\n    VERIFY( (#XPR) && nb_load==AL && nb_loadu==UL && nb_store==AS && nb_storeu==US ); \\\n  }\n\n\n#include \"main.h\"\n\nvoid test_unalignedcount()\n{\n  #ifdef EIGEN_VECTORIZE_SSE\n  VectorXf a(40), b(40);\n  VERIFY_ALIGNED_UNALIGNED_COUNT(a += b, 20, 0, 10, 0);\n  VERIFY_ALIGNED_UNALIGNED_COUNT(a.segment(0,40) += b.segment(0,40), 10, 10, 10, 0);\n  VERIFY_ALIGNED_UNALIGNED_COUNT(a.segment(0,40) -= b.segment(0,40), 10, 10, 10, 0);\n  VERIFY_ALIGNED_UNALIGNED_COUNT(a.segment(0,40) *= 3.5, 10, 0, 10, 0);\n  VERIFY_ALIGNED_UNALIGNED_COUNT(a.segment(0,40) /= 3.5, 10, 0, 10, 0);\n  #else\n  // The following line is to eliminate \"variable not used\" warnings\n  nb_load = nb_loadu = nb_store = nb_storeu = 0;\n  int a(0), b(0);\n  VERIFY(a==b);\n  #endif\n}\n"
  },
  {
    "path": "libs/eigen/test/upperbidiagonalization.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2010 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <Eigen/SVD>\n\ntemplate<typename MatrixType> void upperbidiag(const MatrixType& m)\n{\n  const typename MatrixType::Index rows = m.rows();\n  const typename MatrixType::Index cols = m.cols();\n\n  typedef Matrix<typename MatrixType::RealScalar, MatrixType::RowsAtCompileTime,  MatrixType::ColsAtCompileTime> RealMatrixType;\n  typedef Matrix<typename MatrixType::Scalar, MatrixType::ColsAtCompileTime,  MatrixType::RowsAtCompileTime> TransposeMatrixType;\n\n  MatrixType a = MatrixType::Random(rows,cols);\n  internal::UpperBidiagonalization<MatrixType> ubd(a);\n  RealMatrixType b(rows, cols);\n  b.setZero();\n  b.block(0,0,cols,cols) = ubd.bidiagonal();\n  MatrixType c = ubd.householderU() * b * ubd.householderV().adjoint();\n  VERIFY_IS_APPROX(a,c);\n  TransposeMatrixType d = ubd.householderV() * b.adjoint() * ubd.householderU().adjoint();\n  VERIFY_IS_APPROX(a.adjoint(),d);\n}\n\nvoid test_upperbidiagonalization()\n{\n  for(int i = 0; i < g_repeat; i++) {\n   CALL_SUBTEST_1( upperbidiag(MatrixXf(3,3)) );\n   CALL_SUBTEST_2( upperbidiag(MatrixXd(17,12)) );\n   CALL_SUBTEST_3( upperbidiag(MatrixXcf(20,20)) );\n   CALL_SUBTEST_4( upperbidiag(MatrixXcd(16,15)) );\n   CALL_SUBTEST_5( upperbidiag(Matrix<float,6,4>()) );\n   CALL_SUBTEST_6( upperbidiag(Matrix<float,5,5>()) );\n   CALL_SUBTEST_7( upperbidiag(Matrix<double,4,3>()) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/vectorization_logic.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#define EIGEN_DEBUG_ASSIGN\n#include \"main.h\"\n#include <typeinfo>\n\nstd::string demangle_traversal(int t)\n{\n  if(t==DefaultTraversal) return \"DefaultTraversal\";\n  if(t==LinearTraversal) return \"LinearTraversal\";\n  if(t==InnerVectorizedTraversal) return \"InnerVectorizedTraversal\";\n  if(t==LinearVectorizedTraversal) return \"LinearVectorizedTraversal\";\n  if(t==SliceVectorizedTraversal) return \"SliceVectorizedTraversal\";\n  return \"?\";\n}\nstd::string demangle_unrolling(int t)\n{\n  if(t==NoUnrolling) return \"NoUnrolling\";\n  if(t==InnerUnrolling) return \"InnerUnrolling\";\n  if(t==CompleteUnrolling) return \"CompleteUnrolling\";\n  return \"?\";\n}\n\ntemplate<typename Dst, typename Src>\nbool test_assign(const Dst&, const Src&, int traversal, int unrolling)\n{\n  internal::assign_traits<Dst,Src>::debug();\n  bool res = internal::assign_traits<Dst,Src>::Traversal==traversal\n          && internal::assign_traits<Dst,Src>::Unrolling==unrolling;\n  if(!res)\n  {\n    std::cerr << \" Expected Traversal == \" << demangle_traversal(traversal)\n              << \" got \" << demangle_traversal(internal::assign_traits<Dst,Src>::Traversal) << \"\\n\";\n    std::cerr << \" Expected Unrolling == \" << demangle_unrolling(unrolling)\n              << \" got \" << demangle_unrolling(internal::assign_traits<Dst,Src>::Unrolling) << \"\\n\";\n  }\n  return res;\n}\n\ntemplate<typename Dst, typename Src>\nbool test_assign(int traversal, int unrolling)\n{\n  internal::assign_traits<Dst,Src>::debug();\n  bool res = internal::assign_traits<Dst,Src>::Traversal==traversal\n          && internal::assign_traits<Dst,Src>::Unrolling==unrolling;\n  if(!res)\n  {\n    std::cerr << \" Expected Traversal == \" << demangle_traversal(traversal)\n              << \" got \" << demangle_traversal(internal::assign_traits<Dst,Src>::Traversal) << \"\\n\";\n    std::cerr << \" Expected Unrolling == \" << demangle_unrolling(unrolling)\n              << \" got \" << demangle_unrolling(internal::assign_traits<Dst,Src>::Unrolling) << \"\\n\";\n  }\n  return res;\n}\n\ntemplate<typename Xpr>\nbool test_redux(const Xpr&, int traversal, int unrolling)\n{\n  typedef internal::redux_traits<internal::scalar_sum_op<typename Xpr::Scalar>,Xpr> traits;\n  bool res = traits::Traversal==traversal && traits::Unrolling==unrolling;\n  if(!res)\n  {\n    std::cerr << \" Expected Traversal == \" << demangle_traversal(traversal)\n              << \" got \" << demangle_traversal(traits::Traversal) << \"\\n\";\n    std::cerr << \" Expected Unrolling == \" << demangle_unrolling(unrolling)\n              << \" got \" << demangle_unrolling(traits::Unrolling) << \"\\n\";\n  }\n  return res;\n}\n\ntemplate<typename Scalar, bool Enable = internal::packet_traits<Scalar>::Vectorizable> struct vectorization_logic\n{\n  enum {\n    PacketSize = internal::packet_traits<Scalar>::size\n  };\n  static void run()\n  {\n    \n    typedef Matrix<Scalar,PacketSize,1> Vector1;\n    typedef Matrix<Scalar,Dynamic,1> VectorX;\n    typedef Matrix<Scalar,Dynamic,Dynamic> MatrixXX;\n    typedef Matrix<Scalar,PacketSize,PacketSize> Matrix11;\n    typedef Matrix<Scalar,2*PacketSize,2*PacketSize> Matrix22;\n    typedef Matrix<Scalar,(Matrix11::Flags&RowMajorBit)?16:4*PacketSize,(Matrix11::Flags&RowMajorBit)?4*PacketSize:16> Matrix44;\n    typedef Matrix<Scalar,(Matrix11::Flags&RowMajorBit)?16:4*PacketSize,(Matrix11::Flags&RowMajorBit)?4*PacketSize:16,DontAlign|EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION> Matrix44u;\n    typedef Matrix<Scalar,4*PacketSize,16,ColMajor> Matrix44c;\n    typedef Matrix<Scalar,4*PacketSize,16,RowMajor> Matrix44r;\n\n    typedef Matrix<Scalar,\n        (PacketSize==8 ? 4 : PacketSize==4 ? 2 : PacketSize==2 ? 1 : /*PacketSize==1 ?*/ 1),\n        (PacketSize==8 ? 2 : PacketSize==4 ? 2 : PacketSize==2 ? 2 : /*PacketSize==1 ?*/ 1)\n      > Matrix1;\n\n    typedef Matrix<Scalar,\n        (PacketSize==8 ? 4 : PacketSize==4 ? 2 : PacketSize==2 ? 1 : /*PacketSize==1 ?*/ 1),\n        (PacketSize==8 ? 2 : PacketSize==4 ? 2 : PacketSize==2 ? 2 : /*PacketSize==1 ?*/ 1),\n      DontAlign|((Matrix1::Flags&RowMajorBit)?RowMajor:ColMajor)> Matrix1u;\n\n    // this type is made such that it can only be vectorized when viewed as a linear 1D vector\n    typedef Matrix<Scalar,\n        (PacketSize==8 ? 4 : PacketSize==4 ? 6 : PacketSize==2 ? ((Matrix11::Flags&RowMajorBit)?2:3) : /*PacketSize==1 ?*/ 1),\n        (PacketSize==8 ? 6 : PacketSize==4 ? 2 : PacketSize==2 ? ((Matrix11::Flags&RowMajorBit)?3:2) : /*PacketSize==1 ?*/ 3)\n      > Matrix3;\n    \n    #if !EIGEN_GCC_AND_ARCH_DOESNT_WANT_STACK_ALIGNMENT\n    VERIFY(test_assign(Vector1(),Vector1(),\n      InnerVectorizedTraversal,CompleteUnrolling));\n    VERIFY(test_assign(Vector1(),Vector1()+Vector1(),\n      InnerVectorizedTraversal,CompleteUnrolling));\n    VERIFY(test_assign(Vector1(),Vector1().cwiseProduct(Vector1()),\n      InnerVectorizedTraversal,CompleteUnrolling));\n    VERIFY(test_assign(Vector1(),Vector1().template cast<Scalar>(),\n      InnerVectorizedTraversal,CompleteUnrolling));\n\n\n    VERIFY(test_assign(Vector1(),Vector1(),\n      InnerVectorizedTraversal,CompleteUnrolling));\n    VERIFY(test_assign(Vector1(),Vector1()+Vector1(),\n      InnerVectorizedTraversal,CompleteUnrolling));\n    VERIFY(test_assign(Vector1(),Vector1().cwiseProduct(Vector1()),\n      InnerVectorizedTraversal,CompleteUnrolling));\n\n    VERIFY(test_assign(Matrix44(),Matrix44()+Matrix44(),\n      InnerVectorizedTraversal,InnerUnrolling));\n\n    VERIFY(test_assign(Matrix44u(),Matrix44()+Matrix44(),\n      LinearTraversal,NoUnrolling));\n\n    VERIFY(test_assign(Matrix1u(),Matrix1()+Matrix1(),\n      LinearTraversal,CompleteUnrolling));\n\n    VERIFY(test_assign(Matrix44c().col(1),Matrix44c().col(2)+Matrix44c().col(3),\n      InnerVectorizedTraversal,CompleteUnrolling));\n    \n    VERIFY(test_assign(Matrix44r().row(2),Matrix44r().row(1)+Matrix44r().row(1),\n      InnerVectorizedTraversal,CompleteUnrolling));\n        \n    if(PacketSize>1)\n    {\n      typedef Matrix<Scalar,3,3,ColMajor> Matrix33c;\n      VERIFY(test_assign(Matrix33c().row(2),Matrix33c().row(1)+Matrix33c().row(1),\n        LinearTraversal,CompleteUnrolling));\n      VERIFY(test_assign(Matrix33c().col(0),Matrix33c().col(1)+Matrix33c().col(1),\n        LinearTraversal,CompleteUnrolling));\n      \n      VERIFY(test_assign(Matrix3(),Matrix3().cwiseQuotient(Matrix3()),\n        LinearVectorizedTraversal,CompleteUnrolling));\n\n      VERIFY(test_assign(Matrix<Scalar,17,17>(),Matrix<Scalar,17,17>()+Matrix<Scalar,17,17>(),\n        LinearTraversal,NoUnrolling));\n\n      VERIFY(test_assign(Matrix11(),Matrix<Scalar,17,17>().template block<PacketSize,PacketSize>(2,3)+Matrix<Scalar,17,17>().template block<PacketSize,PacketSize>(10,4),\n      DefaultTraversal,CompleteUnrolling));\n    }\n    \n    VERIFY(test_redux(Matrix3(),\n      LinearVectorizedTraversal,CompleteUnrolling));\n\n    VERIFY(test_redux(Matrix44(),\n      LinearVectorizedTraversal,NoUnrolling));\n\n    VERIFY(test_redux(Matrix44().template block<(Matrix1::Flags&RowMajorBit)?4:PacketSize,(Matrix1::Flags&RowMajorBit)?PacketSize:4>(1,2),\n      DefaultTraversal,CompleteUnrolling));\n\n    VERIFY(test_redux(Matrix44c().template block<2*PacketSize,1>(1,2),\n      LinearVectorizedTraversal,CompleteUnrolling));\n\n    VERIFY(test_redux(Matrix44r().template block<1,2*PacketSize>(2,1),\n      LinearVectorizedTraversal,CompleteUnrolling));\n    \n    VERIFY((test_assign<\n            Map<Matrix22, Aligned, OuterStride<3*PacketSize> >,\n            Matrix22\n            >(InnerVectorizedTraversal,CompleteUnrolling)));\n\n    VERIFY((test_assign<\n            Map<Matrix22, Aligned, InnerStride<3*PacketSize> >,\n            Matrix22\n            >(DefaultTraversal,CompleteUnrolling)));\n\n    VERIFY((test_assign(Matrix11(), Matrix11()*Matrix11(), InnerVectorizedTraversal, CompleteUnrolling)));\n    #endif\n\n    VERIFY(test_assign(MatrixXX(10,10),MatrixXX(20,20).block(10,10,2,3),\n      SliceVectorizedTraversal,NoUnrolling));\n\n    VERIFY(test_redux(VectorX(10),\n      LinearVectorizedTraversal,NoUnrolling));\n\n    \n  }\n};\n\ntemplate<typename Scalar> struct vectorization_logic<Scalar,false>\n{\n  static void run() {}\n};\n\nvoid test_vectorization_logic()\n{\n\n#ifdef EIGEN_VECTORIZE\n\n  CALL_SUBTEST( vectorization_logic<float>::run() );\n  CALL_SUBTEST( vectorization_logic<double>::run() );\n  CALL_SUBTEST( vectorization_logic<std::complex<float> >::run() );\n  CALL_SUBTEST( vectorization_logic<std::complex<double> >::run() );\n  \n  if(internal::packet_traits<float>::Vectorizable)\n  {\n    VERIFY(test_assign(Matrix<float,3,3>(),Matrix<float,3,3>()+Matrix<float,3,3>(),\n      LinearTraversal,CompleteUnrolling));\n      \n    VERIFY(test_redux(Matrix<float,5,2>(),\n      DefaultTraversal,CompleteUnrolling));\n  }\n  \n  if(internal::packet_traits<double>::Vectorizable)\n  {\n    VERIFY(test_assign(Matrix<double,3,3>(),Matrix<double,3,3>()+Matrix<double,3,3>(),\n      LinearTraversal,CompleteUnrolling));\n    \n    VERIFY(test_redux(Matrix<double,7,3>(),\n      DefaultTraversal,CompleteUnrolling));\n  }\n#endif // EIGEN_VECTORIZE\n\n}\n"
  },
  {
    "path": "libs/eigen/test/vectorwiseop.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2011 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#define EIGEN_NO_STATIC_ASSERT\n\n#include \"main.h\"\n\ntemplate<typename ArrayType> void vectorwiseop_array(const ArrayType& m)\n{\n  typedef typename ArrayType::Index Index;\n  typedef typename ArrayType::Scalar Scalar;\n  typedef Array<Scalar, ArrayType::RowsAtCompileTime, 1> ColVectorType;\n  typedef Array<Scalar, 1, ArrayType::ColsAtCompileTime> RowVectorType;\n\n  Index rows = m.rows();\n  Index cols = m.cols();\n  Index r = internal::random<Index>(0, rows-1),\n        c = internal::random<Index>(0, cols-1);\n\n  ArrayType m1 = ArrayType::Random(rows, cols),\n            m2(rows, cols),\n            m3(rows, cols);\n\n  ColVectorType colvec = ColVectorType::Random(rows);\n  RowVectorType rowvec = RowVectorType::Random(cols);\n\n  // test addition\n\n  m2 = m1;\n  m2.colwise() += colvec;\n  VERIFY_IS_APPROX(m2, m1.colwise() + colvec);\n  VERIFY_IS_APPROX(m2.col(c), m1.col(c) + colvec);\n\n  VERIFY_RAISES_ASSERT(m2.colwise() += colvec.transpose());\n  VERIFY_RAISES_ASSERT(m1.colwise() + colvec.transpose());\n\n  m2 = m1;\n  m2.rowwise() += rowvec;\n  VERIFY_IS_APPROX(m2, m1.rowwise() + rowvec);\n  VERIFY_IS_APPROX(m2.row(r), m1.row(r) + rowvec);\n\n  VERIFY_RAISES_ASSERT(m2.rowwise() += rowvec.transpose());\n  VERIFY_RAISES_ASSERT(m1.rowwise() + rowvec.transpose());\n\n  // test substraction\n\n  m2 = m1;\n  m2.colwise() -= colvec;\n  VERIFY_IS_APPROX(m2, m1.colwise() - colvec);\n  VERIFY_IS_APPROX(m2.col(c), m1.col(c) - colvec);\n\n  VERIFY_RAISES_ASSERT(m2.colwise() -= colvec.transpose());\n  VERIFY_RAISES_ASSERT(m1.colwise() - colvec.transpose());\n\n  m2 = m1;\n  m2.rowwise() -= rowvec;\n  VERIFY_IS_APPROX(m2, m1.rowwise() - rowvec);\n  VERIFY_IS_APPROX(m2.row(r), m1.row(r) - rowvec);\n\n  VERIFY_RAISES_ASSERT(m2.rowwise() -= rowvec.transpose());\n  VERIFY_RAISES_ASSERT(m1.rowwise() - rowvec.transpose());\n\n  // test multiplication\n\n  m2 = m1;\n  m2.colwise() *= colvec;\n  VERIFY_IS_APPROX(m2, m1.colwise() * colvec);\n  VERIFY_IS_APPROX(m2.col(c), m1.col(c) * colvec);\n\n  VERIFY_RAISES_ASSERT(m2.colwise() *= colvec.transpose());\n  VERIFY_RAISES_ASSERT(m1.colwise() * colvec.transpose());\n\n  m2 = m1;\n  m2.rowwise() *= rowvec;\n  VERIFY_IS_APPROX(m2, m1.rowwise() * rowvec);\n  VERIFY_IS_APPROX(m2.row(r), m1.row(r) * rowvec);\n\n  VERIFY_RAISES_ASSERT(m2.rowwise() *= rowvec.transpose());\n  VERIFY_RAISES_ASSERT(m1.rowwise() * rowvec.transpose());\n\n  // test quotient\n\n  m2 = m1;\n  m2.colwise() /= colvec;\n  VERIFY_IS_APPROX(m2, m1.colwise() / colvec);\n  VERIFY_IS_APPROX(m2.col(c), m1.col(c) / colvec);\n\n  VERIFY_RAISES_ASSERT(m2.colwise() /= colvec.transpose());\n  VERIFY_RAISES_ASSERT(m1.colwise() / colvec.transpose());\n\n  m2 = m1;\n  m2.rowwise() /= rowvec;\n  VERIFY_IS_APPROX(m2, m1.rowwise() / rowvec);\n  VERIFY_IS_APPROX(m2.row(r), m1.row(r) / rowvec);\n\n  VERIFY_RAISES_ASSERT(m2.rowwise() /= rowvec.transpose());\n  VERIFY_RAISES_ASSERT(m1.rowwise() / rowvec.transpose());\n  \n  m2 = m1;\n  // yes, there might be an aliasing issue there but \".rowwise() /=\"\n  // is suppposed to evaluate \" m2.colwise().sum()\" into to temporary to avoid\n  // evaluating the reducions multiple times\n  if(ArrayType::RowsAtCompileTime>2 || ArrayType::RowsAtCompileTime==Dynamic)\n  {\n    m2.rowwise() /= m2.colwise().sum();\n    VERIFY_IS_APPROX(m2, m1.rowwise() / m1.colwise().sum());\n  }\n\n  // all/any\n  Array<bool,Dynamic,Dynamic> mb(rows,cols);\n  mb = (m1.real()<=0.7).colwise().all();\n  VERIFY( (mb.col(c) == (m1.real().col(c)<=0.7).all()).all() );\n  mb = (m1.real()<=0.7).rowwise().all();\n  VERIFY( (mb.row(r) == (m1.real().row(r)<=0.7).all()).all() );\n\n  mb = (m1.real()>=0.7).colwise().any();\n  VERIFY( (mb.col(c) == (m1.real().col(c)>=0.7).any()).all() );\n  mb = (m1.real()>=0.7).rowwise().any();\n  VERIFY( (mb.row(r) == (m1.real().row(r)>=0.7).any()).all() );\n}\n\ntemplate<typename MatrixType> void vectorwiseop_matrix(const MatrixType& m)\n{\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> ColVectorType;\n  typedef Matrix<Scalar, 1, MatrixType::ColsAtCompileTime> RowVectorType;\n  typedef Matrix<RealScalar, MatrixType::RowsAtCompileTime, 1> RealColVectorType;\n  typedef Matrix<RealScalar, 1, MatrixType::ColsAtCompileTime> RealRowVectorType;\n\n  Index rows = m.rows();\n  Index cols = m.cols();\n  Index r = internal::random<Index>(0, rows-1),\n        c = internal::random<Index>(0, cols-1);\n\n  MatrixType m1 = MatrixType::Random(rows, cols),\n            m2(rows, cols),\n            m3(rows, cols);\n\n  ColVectorType colvec = ColVectorType::Random(rows);\n  RowVectorType rowvec = RowVectorType::Random(cols);\n  RealColVectorType rcres;\n  RealRowVectorType rrres;\n\n  // test addition\n\n  m2 = m1;\n  m2.colwise() += colvec;\n  VERIFY_IS_APPROX(m2, m1.colwise() + colvec);\n  VERIFY_IS_APPROX(m2.col(c), m1.col(c) + colvec);\n\n  VERIFY_RAISES_ASSERT(m2.colwise() += colvec.transpose());\n  VERIFY_RAISES_ASSERT(m1.colwise() + colvec.transpose());\n\n  m2 = m1;\n  m2.rowwise() += rowvec;\n  VERIFY_IS_APPROX(m2, m1.rowwise() + rowvec);\n  VERIFY_IS_APPROX(m2.row(r), m1.row(r) + rowvec);\n\n  VERIFY_RAISES_ASSERT(m2.rowwise() += rowvec.transpose());\n  VERIFY_RAISES_ASSERT(m1.rowwise() + rowvec.transpose());\n\n  // test substraction\n\n  m2 = m1;\n  m2.colwise() -= colvec;\n  VERIFY_IS_APPROX(m2, m1.colwise() - colvec);\n  VERIFY_IS_APPROX(m2.col(c), m1.col(c) - colvec);\n\n  VERIFY_RAISES_ASSERT(m2.colwise() -= colvec.transpose());\n  VERIFY_RAISES_ASSERT(m1.colwise() - colvec.transpose());\n\n  m2 = m1;\n  m2.rowwise() -= rowvec;\n  VERIFY_IS_APPROX(m2, m1.rowwise() - rowvec);\n  VERIFY_IS_APPROX(m2.row(r), m1.row(r) - rowvec);\n\n  VERIFY_RAISES_ASSERT(m2.rowwise() -= rowvec.transpose());\n  VERIFY_RAISES_ASSERT(m1.rowwise() - rowvec.transpose());\n  \n  // test norm\n  rrres = m1.colwise().norm();\n  VERIFY_IS_APPROX(rrres(c), m1.col(c).norm());\n  rcres = m1.rowwise().norm();\n  VERIFY_IS_APPROX(rcres(r), m1.row(r).norm());\n  \n  // test normalized\n  m2 = m1.colwise().normalized();\n  VERIFY_IS_APPROX(m2.col(c), m1.col(c).normalized());\n  m2 = m1.rowwise().normalized();\n  VERIFY_IS_APPROX(m2.row(r), m1.row(r).normalized());\n  \n  // test normalize\n  m2 = m1;\n  m2.colwise().normalize();\n  VERIFY_IS_APPROX(m2.col(c), m1.col(c).normalized());\n  m2 = m1;\n  m2.rowwise().normalize();\n  VERIFY_IS_APPROX(m2.row(r), m1.row(r).normalized());\n}\n\nvoid test_vectorwiseop()\n{\n  CALL_SUBTEST_1(vectorwiseop_array(Array22cd()));\n  CALL_SUBTEST_2(vectorwiseop_array(Array<double, 3, 2>()));\n  CALL_SUBTEST_3(vectorwiseop_array(ArrayXXf(3, 4)));\n  CALL_SUBTEST_4(vectorwiseop_matrix(Matrix4cf()));\n  CALL_SUBTEST_5(vectorwiseop_matrix(Matrix<float,4,5>()));\n  CALL_SUBTEST_6(vectorwiseop_matrix(MatrixXd(7,2)));\n}\n"
  },
  {
    "path": "libs/eigen/test/visitor.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\ntemplate<typename MatrixType> void matrixVisitor(const MatrixType& p)\n{\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename MatrixType::Index Index;\n\n  Index rows = p.rows();\n  Index cols = p.cols();\n\n  // construct a random matrix where all coefficients are different\n  MatrixType m;\n  m = MatrixType::Random(rows, cols);\n  for(Index i = 0; i < m.size(); i++)\n    for(Index i2 = 0; i2 < i; i2++)\n      while(m(i) == m(i2)) // yes, ==\n        m(i) = internal::random<Scalar>();\n  \n  Scalar minc = Scalar(1000), maxc = Scalar(-1000);\n  Index minrow=0,mincol=0,maxrow=0,maxcol=0;\n  for(Index j = 0; j < cols; j++)\n  for(Index i = 0; i < rows; i++)\n  {\n    if(m(i,j) < minc)\n    {\n      minc = m(i,j);\n      minrow = i;\n      mincol = j;\n    }\n    if(m(i,j) > maxc)\n    {\n      maxc = m(i,j);\n      maxrow = i;\n      maxcol = j;\n    }\n  }\n  Index eigen_minrow, eigen_mincol, eigen_maxrow, eigen_maxcol;\n  Scalar eigen_minc, eigen_maxc;\n  eigen_minc = m.minCoeff(&eigen_minrow,&eigen_mincol);\n  eigen_maxc = m.maxCoeff(&eigen_maxrow,&eigen_maxcol);\n  VERIFY(minrow == eigen_minrow);\n  VERIFY(maxrow == eigen_maxrow);\n  VERIFY(mincol == eigen_mincol);\n  VERIFY(maxcol == eigen_maxcol);\n  VERIFY_IS_APPROX(minc, eigen_minc);\n  VERIFY_IS_APPROX(maxc, eigen_maxc);\n  VERIFY_IS_APPROX(minc, m.minCoeff());\n  VERIFY_IS_APPROX(maxc, m.maxCoeff());\n\n  eigen_maxc = (m.adjoint()*m).maxCoeff(&eigen_maxrow,&eigen_maxcol);\n  eigen_maxc = (m.adjoint()*m).eval().maxCoeff(&maxrow,&maxcol);\n  VERIFY(maxrow == eigen_maxrow);\n  VERIFY(maxcol == eigen_maxcol);\n}\n\ntemplate<typename VectorType> void vectorVisitor(const VectorType& w)\n{\n  typedef typename VectorType::Scalar Scalar;\n  typedef typename VectorType::Index Index;\n\n  Index size = w.size();\n\n  // construct a random vector where all coefficients are different\n  VectorType v;\n  v = VectorType::Random(size);\n  for(Index i = 0; i < size; i++)\n    for(Index i2 = 0; i2 < i; i2++)\n      while(v(i) == v(i2)) // yes, ==\n        v(i) = internal::random<Scalar>();\n  \n  Scalar minc = v(0), maxc = v(0);\n  Index minidx=0, maxidx=0;\n  for(Index i = 0; i < size; i++)\n  {\n    if(v(i) < minc)\n    {\n      minc = v(i);\n      minidx = i;\n    }\n    if(v(i) > maxc)\n    {\n      maxc = v(i);\n      maxidx = i;\n    }\n  }\n  Index eigen_minidx, eigen_maxidx;\n  Scalar eigen_minc, eigen_maxc;\n  eigen_minc = v.minCoeff(&eigen_minidx);\n  eigen_maxc = v.maxCoeff(&eigen_maxidx);\n  VERIFY(minidx == eigen_minidx);\n  VERIFY(maxidx == eigen_maxidx);\n  VERIFY_IS_APPROX(minc, eigen_minc);\n  VERIFY_IS_APPROX(maxc, eigen_maxc);\n  VERIFY_IS_APPROX(minc, v.minCoeff());\n  VERIFY_IS_APPROX(maxc, v.maxCoeff());\n  \n  Index idx0 = internal::random<Index>(0,size-1);\n  Index idx1 = eigen_minidx;\n  Index idx2 = eigen_maxidx;\n  VectorType v1(v), v2(v);\n  v1(idx0) = v1(idx1);\n  v2(idx0) = v2(idx2);\n  v1.minCoeff(&eigen_minidx);\n  v2.maxCoeff(&eigen_maxidx);\n  VERIFY(eigen_minidx == (std::min)(idx0,idx1));\n  VERIFY(eigen_maxidx == (std::min)(idx0,idx2));\n}\n\nvoid test_visitor()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( matrixVisitor(Matrix<float, 1, 1>()) );\n    CALL_SUBTEST_2( matrixVisitor(Matrix2f()) );\n    CALL_SUBTEST_3( matrixVisitor(Matrix4d()) );\n    CALL_SUBTEST_4( matrixVisitor(MatrixXd(8, 12)) );\n    CALL_SUBTEST_5( matrixVisitor(Matrix<double,Dynamic,Dynamic,RowMajor>(20, 20)) );\n    CALL_SUBTEST_6( matrixVisitor(MatrixXi(8, 12)) );\n  }\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_7( vectorVisitor(Vector4f()) );\n    CALL_SUBTEST_7( vectorVisitor(Matrix<int,12,1>()) );\n    CALL_SUBTEST_8( vectorVisitor(VectorXd(10)) );\n    CALL_SUBTEST_9( vectorVisitor(RowVectorXd(10)) );\n    CALL_SUBTEST_10( vectorVisitor(VectorXf(33)) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/test/zerosized.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2011 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\n\ntemplate<typename MatrixType> void zeroReduction(const MatrixType& m) {\n  // Reductions that must hold for zero sized objects\n  VERIFY(m.all());\n  VERIFY(!m.any());\n  VERIFY(m.prod()==1);\n  VERIFY(m.sum()==0);\n  VERIFY(m.count()==0);\n  VERIFY(m.allFinite());\n  VERIFY(!m.hasNaN());\n}\n\n\ntemplate<typename MatrixType> void zeroSizedMatrix()\n{\n  MatrixType t1;\n\n  if (MatrixType::SizeAtCompileTime == Dynamic || MatrixType::SizeAtCompileTime == 0)\n  {\n    zeroReduction(t1);\n    if (MatrixType::RowsAtCompileTime == Dynamic)\n      VERIFY(t1.rows() == 0);\n    if (MatrixType::ColsAtCompileTime == Dynamic)\n      VERIFY(t1.cols() == 0);\n\n    if (MatrixType::RowsAtCompileTime == Dynamic && MatrixType::ColsAtCompileTime == Dynamic)\n    {\n\n      MatrixType t2(0, 0);\n      VERIFY(t2.rows() == 0);\n      VERIFY(t2.cols() == 0);\n\n      zeroReduction(t2);\n      VERIFY(t1==t2);\n    }\n  }\n}\n\ntemplate<typename VectorType> void zeroSizedVector()\n{\n  VectorType t1;\n\n  if (VectorType::SizeAtCompileTime == Dynamic || VectorType::SizeAtCompileTime==0)\n  {\n    zeroReduction(t1);\n    VERIFY(t1.size() == 0);\n    VectorType t2(DenseIndex(0)); // DenseIndex disambiguates with 0-the-null-pointer (error with gcc 4.4 and MSVC8)\n    VERIFY(t2.size() == 0);\n    zeroReduction(t2);\n\n    VERIFY(t1==t2);\n  }\n}\n\nvoid test_zerosized()\n{\n  zeroSizedMatrix<Matrix2d>();\n  zeroSizedMatrix<Matrix3i>();\n  zeroSizedMatrix<Matrix<float, 2, Dynamic> >();\n  zeroSizedMatrix<MatrixXf>();\n  zeroSizedMatrix<Matrix<float, 0, 0> >();\n  zeroSizedMatrix<Matrix<float, Dynamic, 0, 0, 0, 0> >();\n  zeroSizedMatrix<Matrix<float, 0, Dynamic, 0, 0, 0> >();\n  zeroSizedMatrix<Matrix<float, Dynamic, Dynamic, 0, 0, 0> >();\n  zeroSizedMatrix<Matrix<float, 0, 4> >();\n  zeroSizedMatrix<Matrix<float, 4, 0> >();\n\n  zeroSizedVector<Vector2d>();\n  zeroSizedVector<Vector3i>();\n  zeroSizedVector<VectorXf>();\n  zeroSizedVector<Matrix<float, 0, 1> >();\n  zeroSizedVector<Matrix<float, 1, 0> >();\n}\n"
  },
  {
    "path": "libs/eigen/unsupported/CMakeLists.txt",
    "content": "add_subdirectory(Eigen)\nadd_subdirectory(doc EXCLUDE_FROM_ALL)\nif(EIGEN_LEAVE_TEST_IN_ALL_TARGET)\n  add_subdirectory(test) # can't do EXCLUDE_FROM_ALL here, breaks CTest\nelse()\n  add_subdirectory(test EXCLUDE_FROM_ALL)\nendif()\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/AdolcForward",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <g.gael@free.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_ADLOC_FORWARD\n#define EIGEN_ADLOC_FORWARD\n\n//--------------------------------------------------------------------------------\n//\n// This file provides support for adolc's adouble type in forward mode.\n// ADOL-C is a C++ automatic differentiation library,\n// see https://projects.coin-or.org/ADOL-C for more information.\n//\n// Note that the maximal number of directions is controlled by\n// the preprocessor token NUMBER_DIRECTIONS. The default is 2.\n//\n//--------------------------------------------------------------------------------\n\n#define ADOLC_TAPELESS\n#ifndef NUMBER_DIRECTIONS\n# define NUMBER_DIRECTIONS 2\n#endif\n#include <adolc/adouble.h>\n\n// adolc defines some very stupid macros:\n#if defined(malloc)\n# undef malloc\n#endif\n\n#if defined(calloc)\n# undef calloc\n#endif\n\n#if defined(realloc)\n# undef realloc\n#endif\n\n#include <Eigen/Core>\n\nnamespace Eigen {\n\n/**\n  * \\defgroup AdolcForward_Module Adolc forward module\n  * This module provides support for adolc's adouble type in forward mode.\n  * ADOL-C is a C++ automatic differentiation library,\n  * see https://projects.coin-or.org/ADOL-C for more information.\n  * It mainly consists in:\n  *  - a struct Eigen::NumTraits<adtl::adouble> specialization\n  *  - overloads of internal::* math function for adtl::adouble type.\n  *\n  * Note that the maximal number of directions is controlled by\n  * the preprocessor token NUMBER_DIRECTIONS. The default is 2.\n  *\n  * \\code\n  * #include <unsupported/Eigen/AdolcSupport>\n  * \\endcode\n  */\n  //@{\n\n} // namespace Eigen\n\n// Eigen's require a few additional functions which must be defined in the same namespace\n// than the custom scalar type own namespace\nnamespace adtl {\n\ninline const adouble& conj(const adouble& x)  { return x; }\ninline const adouble& real(const adouble& x)  { return x; }\ninline adouble imag(const adouble&)    { return 0.; }\ninline adouble abs(const adouble&  x)  { return fabs(x); }\ninline adouble abs2(const adouble& x)  { return x*x; }\n\n}\n\nnamespace Eigen {\n\ntemplate<> struct NumTraits<adtl::adouble>\n    : NumTraits<double>\n{\n  typedef adtl::adouble Real;\n  typedef adtl::adouble NonInteger;\n  typedef adtl::adouble Nested;\n  enum {\n    IsComplex = 0,\n    IsInteger = 0,\n    IsSigned = 1,\n    RequireInitialization = 1,\n    ReadCost = 1,\n    AddCost = 1,\n    MulCost = 1\n  };\n};\n\ntemplate<typename Functor> class AdolcForwardJacobian : public Functor\n{\n  typedef adtl::adouble ActiveScalar;\npublic:\n\n  AdolcForwardJacobian() : Functor() {}\n  AdolcForwardJacobian(const Functor& f) : Functor(f) {}\n\n  // forward constructors\n  template<typename T0>\n  AdolcForwardJacobian(const T0& a0) : Functor(a0) {}\n  template<typename T0, typename T1>\n  AdolcForwardJacobian(const T0& a0, const T1& a1) : Functor(a0, a1) {}\n  template<typename T0, typename T1, typename T2>\n  AdolcForwardJacobian(const T0& a0, const T1& a1, const T1& a2) : Functor(a0, a1, a2) {}\n\n  typedef typename Functor::InputType InputType;\n  typedef typename Functor::ValueType ValueType;\n  typedef typename Functor::JacobianType JacobianType;\n\n  typedef Matrix<ActiveScalar, InputType::SizeAtCompileTime, 1> ActiveInput;\n  typedef Matrix<ActiveScalar, ValueType::SizeAtCompileTime, 1> ActiveValue;\n\n  void operator() (const InputType& x, ValueType* v, JacobianType* _jac) const\n  {\n    eigen_assert(v!=0);\n    if (!_jac)\n    {\n      Functor::operator()(x, v);\n      return;\n    }\n\n    JacobianType& jac = *_jac;\n\n    ActiveInput ax = x.template cast<ActiveScalar>();\n    ActiveValue av(jac.rows());\n\n    for (int j=0; j<jac.cols(); j++)\n      for (int i=0; i<jac.cols(); i++)\n        ax[i].setADValue(j, i==j ? 1 : 0);\n\n    Functor::operator()(ax, &av);\n\n    for (int i=0; i<jac.rows(); i++)\n    {\n      (*v)[i] = av[i].getValue();\n      for (int j=0; j<jac.cols(); j++)\n        jac.coeffRef(i,j) = av[i].getADValue(j);\n    }\n  }\nprotected:\n\n};\n\n//@}\n\n}\n\n#endif // EIGEN_ADLOC_FORWARD\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/AlignedVector3",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Gael Guennebaud <g.gael@free.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_ALIGNED_VECTOR3\n#define EIGEN_ALIGNED_VECTOR3\n\n#include <Eigen/Geometry>\n\nnamespace Eigen {\n\n/**\n  * \\defgroup AlignedVector3_Module Aligned vector3 module\n  *\n  * \\code\n  * #include <unsupported/Eigen/AlignedVector3>\n  * \\endcode\n  */\n  //@{\n\n\n/** \\class AlignedVector3\n  *\n  * \\brief A vectorization friendly 3D vector\n  *\n  * This class represents a 3D vector internally using a 4D vector\n  * such that vectorization can be seamlessly enabled. Of course,\n  * the same result can be achieved by directly using a 4D vector.\n  * This class makes this process simpler.\n  *\n  */\n// TODO specialize Cwise\ntemplate<typename _Scalar> class AlignedVector3;\n\nnamespace internal {\ntemplate<typename _Scalar> struct traits<AlignedVector3<_Scalar> >\n  : traits<Matrix<_Scalar,3,1,0,4,1> >\n{\n};\n}\n\ntemplate<typename _Scalar> class AlignedVector3\n  : public MatrixBase<AlignedVector3<_Scalar> >\n{\n    typedef Matrix<_Scalar,4,1> CoeffType;\n    CoeffType m_coeffs;\n  public:\n\n    typedef MatrixBase<AlignedVector3<_Scalar> > Base;\t\n    EIGEN_DENSE_PUBLIC_INTERFACE(AlignedVector3)\n    using Base::operator*;\n\n    inline Index rows() const { return 3; }\n    inline Index cols() const { return 1; }\n\n    inline const Scalar& coeff(Index row, Index col) const\n    { return m_coeffs.coeff(row, col); }\n\n    inline Scalar& coeffRef(Index row, Index col)\n    { return m_coeffs.coeffRef(row, col); }\n\n    inline const Scalar& coeff(Index index) const\n    { return m_coeffs.coeff(index); }\n\n    inline Scalar& coeffRef(Index index)\n    { return m_coeffs.coeffRef(index);}\n\n\n    inline AlignedVector3(const Scalar& x, const Scalar& y, const Scalar& z)\n      : m_coeffs(x, y, z, Scalar(0))\n    {}\n\n    inline AlignedVector3(const AlignedVector3& other)\n      : Base(), m_coeffs(other.m_coeffs)\n    {}\n\n    template<typename XprType, int Size=XprType::SizeAtCompileTime>\n    struct generic_assign_selector {};\n\n    template<typename XprType> struct generic_assign_selector<XprType,4>\n    {\n      inline static void run(AlignedVector3& dest, const XprType& src)\n      {\n        dest.m_coeffs = src;\n      }\n    };\n\n    template<typename XprType> struct generic_assign_selector<XprType,3>\n    {\n      inline static void run(AlignedVector3& dest, const XprType& src)\n      {\n        dest.m_coeffs.template head<3>() = src;\n        dest.m_coeffs.w() = Scalar(0);\n      }\n    };\n\n    template<typename Derived>\n    inline explicit AlignedVector3(const MatrixBase<Derived>& other)\n    {\n      generic_assign_selector<Derived>::run(*this,other.derived());\n    }\n\n    inline AlignedVector3& operator=(const AlignedVector3& other)\n    { m_coeffs = other.m_coeffs; return *this; }\n\n\n    inline AlignedVector3 operator+(const AlignedVector3& other) const\n    { return AlignedVector3(m_coeffs + other.m_coeffs); }\n\n    inline AlignedVector3& operator+=(const AlignedVector3& other)\n    { m_coeffs += other.m_coeffs; return *this; }\n\n    inline AlignedVector3 operator-(const AlignedVector3& other) const\n    { return AlignedVector3(m_coeffs - other.m_coeffs); }\n\n    inline AlignedVector3 operator-=(const AlignedVector3& other)\n    { m_coeffs -= other.m_coeffs; return *this; }\n\n    inline AlignedVector3 operator*(const Scalar& s) const\n    { return AlignedVector3(m_coeffs * s); }\n\n    inline friend AlignedVector3 operator*(const Scalar& s,const AlignedVector3& vec)\n    { return AlignedVector3(s * vec.m_coeffs); }\n\n    inline AlignedVector3& operator*=(const Scalar& s)\n    { m_coeffs *= s; return *this; }\n\n    inline AlignedVector3 operator/(const Scalar& s) const\n    { return AlignedVector3(m_coeffs / s); }\n\n    inline AlignedVector3& operator/=(const Scalar& s)\n    { m_coeffs /= s; return *this; }\n\n    inline Scalar dot(const AlignedVector3& other) const\n    {\n      eigen_assert(m_coeffs.w()==Scalar(0));\n      eigen_assert(other.m_coeffs.w()==Scalar(0));\n      return m_coeffs.dot(other.m_coeffs);\n    }\n\n    inline void normalize()\n    {\n      m_coeffs /= norm();\n    }\n\n    inline AlignedVector3 normalized()\n    {\n      return AlignedVector3(m_coeffs / norm());\n    }\n\n    inline Scalar sum() const\n    {\n      eigen_assert(m_coeffs.w()==Scalar(0));\n      return m_coeffs.sum();\n    }\n\n    inline Scalar squaredNorm() const\n    {\n      eigen_assert(m_coeffs.w()==Scalar(0));\n      return m_coeffs.squaredNorm();\n    }\n\n    inline Scalar norm() const\n    {\n      using std::sqrt;\n      return sqrt(squaredNorm());\n    }\n\n    inline AlignedVector3 cross(const AlignedVector3& other) const\n    {\n      return AlignedVector3(m_coeffs.cross3(other.m_coeffs));\n    }\n\n    template<typename Derived>\n    inline bool isApprox(const MatrixBase<Derived>& other, const RealScalar& eps=NumTraits<Scalar>::dummy_precision()) const\n    {\n      return m_coeffs.template head<3>().isApprox(other,eps);\n    }\n};\n\n//@}\n\n}\n\n#endif // EIGEN_ALIGNED_VECTOR3\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/ArpackSupport",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_ARPACKSUPPORT_MODULE_H\n#define EIGEN_ARPACKSUPPORT_MODULE_H\n\n#include <Eigen/Core>\n\n#include <Eigen/src/Core/util/DisableStupidWarnings.h>\n\n/** \\defgroup ArpackSupport_Module Arpack support module\n  *\n  * This module provides a wrapper to Arpack, a library for sparse eigenvalue decomposition.\n  *\n  * \\code\n  * #include <Eigen/ArpackSupport>\n  * \\endcode\n  */\n\n#include <Eigen/SparseCholesky>\n#include \"src/Eigenvalues/ArpackSelfAdjointEigenSolver.h\"\n\n#include <Eigen/src/Core/util/ReenableStupidWarnings.h>\n\n#endif // EIGEN_ARPACKSUPPORT_MODULE_H\n/* vim: set filetype=cpp et sw=2 ts=2 ai: */\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/AutoDiff",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <g.gael@free.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_AUTODIFF_MODULE\n#define EIGEN_AUTODIFF_MODULE\n\nnamespace Eigen {\n\n/**\n  * \\defgroup AutoDiff_Module Auto Diff module\n  *\n  * This module features forward automatic differentation via a simple\n  * templated scalar type wrapper AutoDiffScalar.\n  *\n  * Warning : this should NOT be confused with numerical differentiation, which\n  * is a different method and has its own module in Eigen : \\ref NumericalDiff_Module.\n  *\n  * \\code\n  * #include <unsupported/Eigen/AutoDiff>\n  * \\endcode\n  */\n//@{\n\n}\n\n#include \"src/AutoDiff/AutoDiffScalar.h\"\n// #include \"src/AutoDiff/AutoDiffVector.h\"\n#include \"src/AutoDiff/AutoDiffJacobian.h\"\n\nnamespace Eigen {\n//@}\n}\n\n#endif // EIGEN_AUTODIFF_MODULE\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/BVH",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Ilya Baran <ibaran@mit.edu>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_BVH_MODULE_H\n#define EIGEN_BVH_MODULE_H\n\n#include <Eigen/Core>\n#include <Eigen/Geometry>\n#include <Eigen/StdVector>\n#include <algorithm>\n#include <queue>\n\nnamespace Eigen {\n\n/**\n  * \\defgroup BVH_Module BVH module\n  * \\brief This module provides generic bounding volume hierarchy algorithms\n  * and reference tree implementations.\n  *\n  *\n  * \\code\n  * #include <unsupported/Eigen/BVH>\n  * \\endcode\n  *\n  * A bounding volume hierarchy (BVH) can accelerate many geometric queries.  This module provides a generic implementation\n  * of the two basic algorithms over a BVH: intersection of a query object against all objects in the hierarchy and minimization\n  * of a function over the objects in the hierarchy.  It also provides intersection and minimization over a cartesian product of\n  * two BVH's.  A BVH accelerates intersection by using the fact that if a query object does not intersect a volume, then it cannot\n  * intersect any object contained in that volume.  Similarly, a BVH accelerates minimization because the minimum of a function\n  * over a volume is no greater than the minimum of a function over any object contained in it.\n  *\n  * Some sample queries that can be written in terms of intersection are:\n  *   - Determine all points where a ray intersects a triangle mesh\n  *   - Given a set of points, determine which are contained in a query sphere\n  *   - Given a set of spheres, determine which contain the query point\n  *   - Given a set of disks, determine if any is completely contained in a query rectangle (represent each 2D disk as a point \\f$(x,y,r)\\f$\n  *     in 3D and represent the rectangle as a pyramid based on the original rectangle and shrinking in the \\f$r\\f$ direction)\n  *   - Given a set of points, count how many pairs are \\f$d\\pm\\epsilon\\f$ apart (done by looking at the cartesian product of the set\n  *     of points with itself)\n  *\n  * Some sample queries that can be written in terms of function minimization over a set of objects are:\n  *   - Find the intersection between a ray and a triangle mesh closest to the ray origin (function is infinite off the ray)\n  *   - Given a polyline and a query point, determine the closest point on the polyline to the query\n  *   - Find the diameter of a point cloud (done by looking at the cartesian product and using negative distance as the function)\n  *   - Determine how far two meshes are from colliding (this is also a cartesian product query)\n  *\n  * This implementation decouples the basic algorithms both from the type of hierarchy (and the types of the bounding volumes) and\n  * from the particulars of the query.  To enable abstraction from the BVH, the BVH is required to implement a generic mechanism\n  * for traversal.  To abstract from the query, the query is responsible for keeping track of results.\n  *\n  * To be used in the algorithms, a hierarchy must implement the following traversal mechanism (see KdBVH for a sample implementation): \\code\n      typedef Volume  //the type of bounding volume\n      typedef Object  //the type of object in the hierarchy\n      typedef Index   //a reference to a node in the hierarchy--typically an int or a pointer\n      typedef VolumeIterator //an iterator type over node children--returns Index\n      typedef ObjectIterator //an iterator over object (leaf) children--returns const Object &\n      Index getRootIndex() const //returns the index of the hierarchy root\n      const Volume &getVolume(Index index) const //returns the bounding volume of the node at given index\n      void getChildren(Index index, VolumeIterator &outVBegin, VolumeIterator &outVEnd,\n                      ObjectIterator &outOBegin, ObjectIterator &outOEnd) const\n      //getChildren takes a node index and makes [outVBegin, outVEnd) range over its node children\n      //and [outOBegin, outOEnd) range over its object children\n    \\endcode\n  *\n  * To use the hierarchy, call BVIntersect or BVMinimize, passing it a BVH (or two, for cartesian product) and a minimizer or intersector.\n  * For an intersection query on a single BVH, the intersector encapsulates the query and must provide two functions:\n  * \\code\n      bool intersectVolume(const Volume &volume) //returns true if the query intersects the volume\n      bool intersectObject(const Object &object) //returns true if the intersection search should terminate immediately\n    \\endcode\n  * The guarantee that BVIntersect provides is that intersectObject will be called on every object whose bounding volume\n  * intersects the query (but possibly on other objects too) unless the search is terminated prematurely.  It is the\n  * responsibility of the intersectObject function to keep track of the results in whatever manner is appropriate.\n  * The cartesian product intersection and the BVMinimize queries are similar--see their individual documentation.\n  *\n  * The following is a simple but complete example for how to use the BVH to accelerate the search for a closest red-blue point pair:\n  * \\include BVH_Example.cpp\n  * Output: \\verbinclude BVH_Example.out\n  */\n}\n\n//@{\n\n#include \"src/BVH/BVAlgorithms.h\"\n#include \"src/BVH/KdBVH.h\"\n\n//@}\n\n#endif // EIGEN_BVH_MODULE_H\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/CMakeLists.txt",
    "content": "set(Eigen_HEADERS AdolcForward AlignedVector3 ArpackSupport AutoDiff BVH FFT IterativeSolvers KroneckerProduct LevenbergMarquardt\n                  MatrixFunctions MoreVectorization MPRealSupport NonLinearOptimization NumericalDiff OpenGLSupport Polynomials\n                  Skyline SparseExtra Splines\n   )\n\ninstall(FILES\n  ${Eigen_HEADERS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/unsupported/Eigen COMPONENT Devel\n  )\n\nadd_subdirectory(src)\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/FFT",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. \n//\n// Copyright (C) 2009 Mark Borgerding mark a borgerding net\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_FFT_H\n#define EIGEN_FFT_H\n\n#include <complex>\n#include <vector>\n#include <map>\n#include <Eigen/Core>\n\n\n/**\n  * \\defgroup FFT_Module Fast Fourier Transform module\n  *\n  * \\code\n  * #include <unsupported/Eigen/FFT>\n  * \\endcode\n  *\n  * This module provides Fast Fourier transformation, with a configurable backend\n  * implementation.\n  *\n  * The default implementation is based on kissfft. It is a small, free, and\n  * reasonably efficient default.\n  *\n  * There are currently two implementation backend:\n  *\n  * - fftw (http://www.fftw.org) : faster, GPL -- incompatible with Eigen in LGPL form, bigger code size.\n  * - MKL (http://en.wikipedia.org/wiki/Math_Kernel_Library) : fastest, commercial -- may be incompatible with Eigen in GPL form.\n  *\n  * \\section FFTDesign Design\n  *\n  * The following design decisions were made concerning scaling and\n  * half-spectrum for real FFT.\n  *\n  * The intent is to facilitate generic programming and ease migrating code\n  * from  Matlab/octave.\n  * We think the default behavior of Eigen/FFT should favor correctness and\n  * generality over speed. Of course, the caller should be able to \"opt-out\" from this\n  * behavior and get the speed increase if they want it.\n  *\n  * 1) %Scaling:\n  * Other libraries (FFTW,IMKL,KISSFFT)  do not perform scaling, so there\n  * is a constant gain incurred after the forward&inverse transforms , so \n  * IFFT(FFT(x)) = Kx;  this is done to avoid a vector-by-value multiply.  \n  * The downside is that algorithms that worked correctly in Matlab/octave \n  * don't behave the same way once implemented in C++.\n  *\n  * How Eigen/FFT differs: invertible scaling is performed so IFFT( FFT(x) ) = x. \n  *\n  * 2) Real FFT half-spectrum\n  * Other libraries use only half the frequency spectrum (plus one extra \n  * sample for the Nyquist bin) for a real FFT, the other half is the \n  * conjugate-symmetric of the first half.  This saves them a copy and some \n  * memory.  The downside is the caller needs to have special logic for the \n  * number of bins in complex vs real.\n  *\n  * How Eigen/FFT differs: The full spectrum is returned from the forward \n  * transform.  This facilitates generic template programming by obviating \n  * separate specializations for real vs complex.  On the inverse\n  * transform, only half the spectrum is actually used if the output type is real.\n  */\n \n\n#ifdef EIGEN_FFTW_DEFAULT\n// FFTW: faster, GPL -- incompatible with Eigen in LGPL form, bigger code size\n#  include <fftw3.h>\n#  include \"src/FFT/ei_fftw_impl.h\"\n   namespace Eigen {\n     //template <typename T> typedef struct internal::fftw_impl  default_fft_impl; this does not work\n     template <typename T> struct default_fft_impl : public internal::fftw_impl<T> {};\n   }\n#elif defined EIGEN_MKL_DEFAULT\n// TODO \n// intel Math Kernel Library: fastest, commercial -- may be incompatible with Eigen in GPL form\n#  include \"src/FFT/ei_imklfft_impl.h\"\n   namespace Eigen {\n     template <typename T> struct default_fft_impl : public internal::imklfft_impl {};\n   }\n#else\n// internal::kissfft_impl:  small, free, reasonably efficient default, derived from kissfft\n//\n# include \"src/FFT/ei_kissfft_impl.h\"\n  namespace Eigen {\n     template <typename T> \n       struct default_fft_impl : public internal::kissfft_impl<T> {};\n  }\n#endif\n\nnamespace Eigen {\n\n \n// \ntemplate<typename T_SrcMat,typename T_FftIfc> struct fft_fwd_proxy;\ntemplate<typename T_SrcMat,typename T_FftIfc> struct fft_inv_proxy;\n\nnamespace internal {\ntemplate<typename T_SrcMat,typename T_FftIfc>\nstruct traits< fft_fwd_proxy<T_SrcMat,T_FftIfc> >\n{\n  typedef typename T_SrcMat::PlainObject ReturnType;\n};\ntemplate<typename T_SrcMat,typename T_FftIfc>\nstruct traits< fft_inv_proxy<T_SrcMat,T_FftIfc> >\n{\n  typedef typename T_SrcMat::PlainObject ReturnType;\n};\n}\n\ntemplate<typename T_SrcMat,typename T_FftIfc> \nstruct fft_fwd_proxy\n : public ReturnByValue<fft_fwd_proxy<T_SrcMat,T_FftIfc> >\n{\n  typedef DenseIndex Index;\n\n  fft_fwd_proxy(const T_SrcMat& src,T_FftIfc & fft, Index nfft) : m_src(src),m_ifc(fft), m_nfft(nfft) {}\n\n  template<typename T_DestMat> void evalTo(T_DestMat& dst) const;\n\n  Index rows() const { return m_src.rows(); }\n  Index cols() const { return m_src.cols(); }\nprotected:\n  const T_SrcMat & m_src;\n  T_FftIfc & m_ifc;\n  Index m_nfft;\nprivate:\n  fft_fwd_proxy& operator=(const fft_fwd_proxy&);\n};\n\ntemplate<typename T_SrcMat,typename T_FftIfc> \nstruct fft_inv_proxy\n : public ReturnByValue<fft_inv_proxy<T_SrcMat,T_FftIfc> >\n{\n  typedef DenseIndex Index;\n\n  fft_inv_proxy(const T_SrcMat& src,T_FftIfc & fft, Index nfft) : m_src(src),m_ifc(fft), m_nfft(nfft) {}\n\n  template<typename T_DestMat> void evalTo(T_DestMat& dst) const;\n\n  Index rows() const { return m_src.rows(); }\n  Index cols() const { return m_src.cols(); }\nprotected:\n  const T_SrcMat & m_src;\n  T_FftIfc & m_ifc;\n  Index m_nfft;\nprivate:\n  fft_inv_proxy& operator=(const fft_inv_proxy&);\n};\n\n\ntemplate <typename T_Scalar,\n         typename T_Impl=default_fft_impl<T_Scalar> >\nclass FFT\n{\n  public:\n    typedef T_Impl impl_type;\n    typedef DenseIndex Index;\n    typedef typename impl_type::Scalar Scalar;\n    typedef typename impl_type::Complex Complex;\n\n    enum Flag {\n      Default=0, // goof proof\n      Unscaled=1,\n      HalfSpectrum=2,\n      // SomeOtherSpeedOptimization=4\n      Speedy=32767\n    };\n\n    FFT( const impl_type & impl=impl_type() , Flag flags=Default ) :m_impl(impl),m_flag(flags) { }\n\n    inline\n    bool HasFlag(Flag f) const { return (m_flag & (int)f) == f;}\n\n    inline\n    void SetFlag(Flag f) { m_flag |= (int)f;}\n\n    inline\n    void ClearFlag(Flag f) { m_flag &= (~(int)f);}\n\n    inline\n    void fwd( Complex * dst, const Scalar * src, Index nfft)\n    {\n        m_impl.fwd(dst,src,static_cast<int>(nfft));\n        if ( HasFlag(HalfSpectrum) == false)\n          ReflectSpectrum(dst,nfft);\n    }\n\n    inline\n    void fwd( Complex * dst, const Complex * src, Index nfft)\n    {\n        m_impl.fwd(dst,src,static_cast<int>(nfft));\n    }\n\n    /*\n    inline \n    void fwd2(Complex * dst, const Complex * src, int n0,int n1)\n    {\n      m_impl.fwd2(dst,src,n0,n1);\n    }\n    */\n\n    template <typename _Input>\n    inline\n    void fwd( std::vector<Complex> & dst, const std::vector<_Input> & src) \n    {\n      if ( NumTraits<_Input>::IsComplex == 0 && HasFlag(HalfSpectrum) )\n        dst.resize( (src.size()>>1)+1); // half the bins + Nyquist bin\n      else\n        dst.resize(src.size());\n      fwd(&dst[0],&src[0],src.size());\n    }\n\n    template<typename InputDerived, typename ComplexDerived>\n    inline\n    void fwd( MatrixBase<ComplexDerived> & dst, const MatrixBase<InputDerived> & src, Index nfft=-1)\n    {\n      typedef typename ComplexDerived::Scalar dst_type;\n      typedef typename InputDerived::Scalar src_type;\n      EIGEN_STATIC_ASSERT_VECTOR_ONLY(InputDerived)\n      EIGEN_STATIC_ASSERT_VECTOR_ONLY(ComplexDerived)\n      EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ComplexDerived,InputDerived) // size at compile-time\n      EIGEN_STATIC_ASSERT((internal::is_same<dst_type, Complex>::value),\n            YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)\n      EIGEN_STATIC_ASSERT(int(InputDerived::Flags)&int(ComplexDerived::Flags)&DirectAccessBit,\n            THIS_METHOD_IS_ONLY_FOR_EXPRESSIONS_WITH_DIRECT_MEMORY_ACCESS_SUCH_AS_MAP_OR_PLAIN_MATRICES)\n\n      if (nfft<1)\n        nfft = src.size();\n\n      if ( NumTraits< src_type >::IsComplex == 0 && HasFlag(HalfSpectrum) )\n        dst.derived().resize( (nfft>>1)+1);\n      else\n        dst.derived().resize(nfft);\n\n      if ( src.innerStride() != 1 || src.size() < nfft ) {\n        Matrix<src_type,1,Dynamic> tmp;\n        if (src.size()<nfft) {\n          tmp.setZero(nfft);\n          tmp.block(0,0,src.size(),1 ) = src;\n        }else{\n          tmp = src;\n        }\n        fwd( &dst[0],&tmp[0],nfft );\n      }else{\n        fwd( &dst[0],&src[0],nfft );\n      }\n    }\n \n    template<typename InputDerived>\n    inline\n    fft_fwd_proxy< MatrixBase<InputDerived>, FFT<T_Scalar,T_Impl> >\n    fwd( const MatrixBase<InputDerived> & src, Index nfft=-1)\n    {\n      return fft_fwd_proxy< MatrixBase<InputDerived> ,FFT<T_Scalar,T_Impl> >( src, *this,nfft );\n    }\n\n    template<typename InputDerived>\n    inline\n    fft_inv_proxy< MatrixBase<InputDerived>, FFT<T_Scalar,T_Impl> >\n    inv( const MatrixBase<InputDerived> & src, Index nfft=-1)\n    {\n      return  fft_inv_proxy< MatrixBase<InputDerived> ,FFT<T_Scalar,T_Impl> >( src, *this,nfft );\n    }\n\n    inline\n    void inv( Complex * dst, const Complex * src, Index nfft)\n    {\n      m_impl.inv( dst,src,static_cast<int>(nfft) );\n      if ( HasFlag( Unscaled ) == false)\n        scale(dst,Scalar(1./nfft),nfft); // scale the time series\n    }\n\n    inline\n    void inv( Scalar * dst, const Complex * src, Index nfft)\n    {\n      m_impl.inv( dst,src,static_cast<int>(nfft) );\n      if ( HasFlag( Unscaled ) == false)\n        scale(dst,Scalar(1./nfft),nfft); // scale the time series\n    }\n\n    template<typename OutputDerived, typename ComplexDerived>\n    inline\n    void inv( MatrixBase<OutputDerived> & dst, const MatrixBase<ComplexDerived> & src, Index nfft=-1)\n    {\n      typedef typename ComplexDerived::Scalar src_type;\n      typedef typename OutputDerived::Scalar dst_type;\n      const bool realfft= (NumTraits<dst_type>::IsComplex == 0);\n      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OutputDerived)\n      EIGEN_STATIC_ASSERT_VECTOR_ONLY(ComplexDerived)\n      EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ComplexDerived,OutputDerived) // size at compile-time\n      EIGEN_STATIC_ASSERT((internal::is_same<src_type, Complex>::value),\n            YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)\n      EIGEN_STATIC_ASSERT(int(OutputDerived::Flags)&int(ComplexDerived::Flags)&DirectAccessBit,\n            THIS_METHOD_IS_ONLY_FOR_EXPRESSIONS_WITH_DIRECT_MEMORY_ACCESS_SUCH_AS_MAP_OR_PLAIN_MATRICES)\n\n      if (nfft<1) { //automatic FFT size determination\n        if ( realfft && HasFlag(HalfSpectrum) ) \n          nfft = 2*(src.size()-1); //assume even fft size\n        else\n          nfft = src.size();\n      }\n      dst.derived().resize( nfft );\n\n      // check for nfft that does not fit the input data size\n      Index resize_input= ( realfft && HasFlag(HalfSpectrum) )\n        ? ( (nfft/2+1) - src.size() )\n        : ( nfft - src.size() );\n\n      if ( src.innerStride() != 1 || resize_input ) {\n        // if the vector is strided, then we need to copy it to a packed temporary\n        Matrix<src_type,1,Dynamic> tmp;\n        if ( resize_input ) {\n          size_t ncopy = (std::min)(src.size(),src.size() + resize_input);\n          tmp.setZero(src.size() + resize_input);\n          if ( realfft && HasFlag(HalfSpectrum) ) {\n            // pad at the Nyquist bin\n            tmp.head(ncopy) = src.head(ncopy);\n            tmp(ncopy-1) = real(tmp(ncopy-1)); // enforce real-only Nyquist bin\n          }else{\n            size_t nhead,ntail;\n            nhead = 1+ncopy/2-1; // range  [0:pi)\n            ntail = ncopy/2-1;   // range (-pi:0)\n            tmp.head(nhead) = src.head(nhead);\n            tmp.tail(ntail) = src.tail(ntail);\n            if (resize_input<0) { //shrinking -- create the Nyquist bin as the average of the two bins that fold into it\n              tmp(nhead) = ( src(nfft/2) + src( src.size() - nfft/2 ) )*src_type(.5);\n            }else{ // expanding -- split the old Nyquist bin into two halves\n              tmp(nhead) = src(nhead) * src_type(.5);\n              tmp(tmp.size()-nhead) = tmp(nhead);\n            }\n          }\n        }else{\n          tmp = src;\n        }\n        inv( &dst[0],&tmp[0], nfft);\n      }else{\n        inv( &dst[0],&src[0], nfft);\n      }\n    }\n\n    template <typename _Output>\n    inline\n    void inv( std::vector<_Output> & dst, const std::vector<Complex> & src,Index nfft=-1)\n    {\n      if (nfft<1)\n        nfft = ( NumTraits<_Output>::IsComplex == 0 && HasFlag(HalfSpectrum) ) ? 2*(src.size()-1) : src.size();\n      dst.resize( nfft );\n      inv( &dst[0],&src[0],nfft);\n    }\n\n\n    /*\n    // TODO: multi-dimensional FFTs\n    inline \n    void inv2(Complex * dst, const Complex * src, int n0,int n1)\n    {\n      m_impl.inv2(dst,src,n0,n1);\n      if ( HasFlag( Unscaled ) == false)\n          scale(dst,1./(n0*n1),n0*n1);\n    }\n  */\n\n    inline\n    impl_type & impl() {return m_impl;}\n  private:\n\n    template <typename T_Data>\n    inline\n    void scale(T_Data * x,Scalar s,Index nx)\n    {\n#if 1\n      for (int k=0;k<nx;++k)\n        *x++ *= s;\n#else\n      if ( ((ptrdiff_t)x) & 15 )\n        Matrix<T_Data, Dynamic, 1>::Map(x,nx) *= s;\n      else\n        Matrix<T_Data, Dynamic, 1>::MapAligned(x,nx) *= s;\n         //Matrix<T_Data, Dynamic, Dynamic>::Map(x,nx) * s;\n#endif  \n    }\n\n    inline\n    void ReflectSpectrum(Complex * freq, Index nfft)\n    {\n      // create the implicit right-half spectrum (conjugate-mirror of the left-half)\n      Index nhbins=(nfft>>1)+1;\n      for (Index k=nhbins;k < nfft; ++k )\n        freq[k] = conj(freq[nfft-k]);\n    }\n\n    impl_type m_impl;\n    int m_flag;\n};\n\ntemplate<typename T_SrcMat,typename T_FftIfc> \ntemplate<typename T_DestMat> inline \nvoid fft_fwd_proxy<T_SrcMat,T_FftIfc>::evalTo(T_DestMat& dst) const\n{\n    m_ifc.fwd( dst, m_src, m_nfft);\n}\n\ntemplate<typename T_SrcMat,typename T_FftIfc> \ntemplate<typename T_DestMat> inline \nvoid fft_inv_proxy<T_SrcMat,T_FftIfc>::evalTo(T_DestMat& dst) const\n{\n    m_ifc.inv( dst, m_src, m_nfft);\n}\n\n}\n#endif\n/* vim: set filetype=cpp et sw=2 ts=2 ai: */\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/IterativeSolvers",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <g.gael@free.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_ITERATIVE_SOLVERS_MODULE_H\n#define EIGEN_ITERATIVE_SOLVERS_MODULE_H\n\n#include <Eigen/Sparse>\n\n/**\n  * \\defgroup IterativeSolvers_Module Iterative solvers module\n  * This module aims to provide various iterative linear and non linear solver algorithms.\n  * It currently provides:\n  *  - a constrained conjugate gradient\n  *  - a Householder GMRES implementation\n  * \\code\n  * #include <unsupported/Eigen/IterativeSolvers>\n  * \\endcode\n  */\n//@{\n\n#include \"../../Eigen/src/misc/Solve.h\"\n#include \"../../Eigen/src/misc/SparseSolve.h\"\n\n#ifndef EIGEN_MPL2_ONLY\n#include \"src/IterativeSolvers/IterationController.h\"\n#include \"src/IterativeSolvers/ConstrainedConjGrad.h\"\n#endif\n\n#include \"src/IterativeSolvers/IncompleteLU.h\"\n#include \"../../Eigen/Jacobi\"\n#include \"../../Eigen/Householder\"\n#include \"src/IterativeSolvers/GMRES.h\"\n#include \"src/IterativeSolvers/IncompleteCholesky.h\"\n//#include \"src/IterativeSolvers/SSORPreconditioner.h\"\n#include \"src/IterativeSolvers/MINRES.h\"\n\n//@}\n\n#endif // EIGEN_ITERATIVE_SOLVERS_MODULE_H\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/KroneckerProduct",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_KRONECKER_PRODUCT_MODULE_H\n#define EIGEN_KRONECKER_PRODUCT_MODULE_H\n\n#include \"../../Eigen/Core\"\n\n#include \"../../Eigen/src/Core/util/DisableStupidWarnings.h\"\n\nnamespace Eigen {\n\n/**\n  * \\defgroup KroneckerProduct_Module KroneckerProduct module\n  *\n  * This module contains an experimental Kronecker product implementation.\n  *\n  * \\code\n  * #include <Eigen/KroneckerProduct>\n  * \\endcode\n  */\n\n} // namespace Eigen\n\n#include \"src/KroneckerProduct/KroneckerTensorProduct.h\"\n\n#include \"../../Eigen/src/Core/util/ReenableStupidWarnings.h\"\n\n#endif // EIGEN_KRONECKER_PRODUCT_MODULE_H\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/LevenbergMarquardt",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Thomas Capricelli <orzel@freehackers.org>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_LEVENBERGMARQUARDT_MODULE\n#define EIGEN_LEVENBERGMARQUARDT_MODULE\n\n// #include <vector>\n\n#include <Eigen/Core>\n#include <Eigen/Jacobi>\n#include <Eigen/QR>\n#include <unsupported/Eigen/NumericalDiff> \n\n#include <Eigen/SparseQR>\n\n/**\n  * \\defgroup LevenbergMarquardt_Module Levenberg-Marquardt module\n  *\n  * \\code\n  * #include </Eigen/LevenbergMarquardt>\n  * \\endcode\n  *\n  * \n  */\n\n#include \"Eigen/SparseCore\"\n#ifndef EIGEN_PARSED_BY_DOXYGEN\n\n#include \"src/LevenbergMarquardt/LMqrsolv.h\"\n#include \"src/LevenbergMarquardt/LMcovar.h\"\n#include \"src/LevenbergMarquardt/LMpar.h\"\n\n#endif\n\n#include \"src/LevenbergMarquardt/LevenbergMarquardt.h\"\n#include \"src/LevenbergMarquardt/LMonestep.h\"\n\n\n#endif // EIGEN_LEVENBERGMARQUARDT_MODULE\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/MPRealSupport",
    "content": "// This file is part of a joint effort between Eigen, a lightweight C++ template library\n// for linear algebra, and MPFR C++, a C++ interface to MPFR library (http://www.holoborodko.com/pavel/)\n//\n// Copyright (C) 2010-2012 Pavel Holoborodko <pavel@holoborodko.com>\n// Copyright (C) 2010 Konstantin Holoborodko <konstantin@holoborodko.com>\n// Copyright (C) 2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_MPREALSUPPORT_MODULE_H\n#define EIGEN_MPREALSUPPORT_MODULE_H\n\n#include <Eigen/Core>\n#include <mpreal.h>\n\nnamespace Eigen {\n  \n/**\n  * \\defgroup MPRealSupport_Module MPFRC++ Support module\n  * \\code\n  * #include <Eigen/MPRealSupport>\n  * \\endcode\n  *\n  * This module provides support for multi precision floating point numbers\n  * via the <a href=\"http://www.holoborodko.com/pavel/mpfr\">MPFR C++</a>\n  * library which itself is built upon <a href=\"http://www.mpfr.org/\">MPFR</a>/<a href=\"http://gmplib.org/\">GMP</a>.\n  *\n  * You can find a copy of MPFR C++ that is known to be compatible in the unsupported/test/mpreal folder.\n  *\n  * Here is an example:\n  *\n\\code\n#include <iostream>\n#include <Eigen/MPRealSupport>\n#include <Eigen/LU>\nusing namespace mpfr;\nusing namespace Eigen;\nint main()\n{\n  // set precision to 256 bits (double has only 53 bits)\n  mpreal::set_default_prec(256);\n  // Declare matrix and vector types with multi-precision scalar type\n  typedef Matrix<mpreal,Dynamic,Dynamic>  MatrixXmp;\n  typedef Matrix<mpreal,Dynamic,1>        VectorXmp;\n\n  MatrixXmp A = MatrixXmp::Random(100,100);\n  VectorXmp b = VectorXmp::Random(100);\n\n  // Solve Ax=b using LU\n  VectorXmp x = A.lu().solve(b);\n  std::cout << \"relative error: \" << (A*x - b).norm() / b.norm() << std::endl;\n  return 0;\n}\n\\endcode\n  *\n  */\n\t\n  template<> struct NumTraits<mpfr::mpreal>\n    : GenericNumTraits<mpfr::mpreal>\n  {\n    enum {\n      IsInteger = 0,\n      IsSigned = 1,\n      IsComplex = 0,\n      RequireInitialization = 1,\n      ReadCost = 10,\n      AddCost = 10,\n      MulCost = 40\n    };\n\n    typedef mpfr::mpreal Real;\n    typedef mpfr::mpreal NonInteger;\n    \n    inline static Real highest   (long Precision = mpfr::mpreal::get_default_prec())  { return  mpfr::maxval(Precision); }\n    inline static Real lowest    (long Precision = mpfr::mpreal::get_default_prec())  { return -mpfr::maxval(Precision); }\n\n    // Constants\n    inline static Real Pi       (long Precision = mpfr::mpreal::get_default_prec())     {    return mpfr::const_pi(Precision);        }\n    inline static Real Euler    (long Precision = mpfr::mpreal::get_default_prec())     {    return mpfr::const_euler(Precision);     }\n    inline static Real Log2     (long Precision = mpfr::mpreal::get_default_prec())     {    return mpfr::const_log2(Precision);      }\n    inline static Real Catalan  (long Precision = mpfr::mpreal::get_default_prec())     {    return mpfr::const_catalan(Precision);   }\n\n    inline static Real epsilon  (long Precision = mpfr::mpreal::get_default_prec())     {    return mpfr::machine_epsilon(Precision); }\n    inline static Real epsilon  (const Real& x)                                         {    return mpfr::machine_epsilon(x); }\n\n    inline static Real dummy_precision()   \n    { \n        unsigned int weak_prec = ((mpfr::mpreal::get_default_prec()-1) * 90) / 100;\n        return mpfr::machine_epsilon(weak_prec);\n    }\n  };\n\n  namespace internal {\n\n  template<> inline mpfr::mpreal random<mpfr::mpreal>()\n  {\n    return mpfr::random();\n  }\n\n  template<> inline mpfr::mpreal random<mpfr::mpreal>(const mpfr::mpreal& a, const mpfr::mpreal& b)\n  {\n    return a + (b-a) * random<mpfr::mpreal>();\n  }\n\n  inline bool isMuchSmallerThan(const mpfr::mpreal& a, const mpfr::mpreal& b, const mpfr::mpreal& eps)\n  {\n    return mpfr::abs(a) <= mpfr::abs(b) * eps;\n  }\n\n  inline bool isApprox(const mpfr::mpreal& a, const mpfr::mpreal& b, const mpfr::mpreal& eps)\n  {\n    return mpfr::isEqualFuzzy(a,b,eps);\n  }\n\n  inline bool isApproxOrLessThan(const mpfr::mpreal& a, const mpfr::mpreal& b, const mpfr::mpreal& eps)\n  {\n    return a <= b || mpfr::isEqualFuzzy(a,b,eps);\n  }\n\n  template<> inline long double cast<mpfr::mpreal,long double>(const mpfr::mpreal& x)\n  { return x.toLDouble(); }\n\n  template<> inline double cast<mpfr::mpreal,double>(const mpfr::mpreal& x)\n  { return x.toDouble(); }\n\n  template<> inline long cast<mpfr::mpreal,long>(const mpfr::mpreal& x)\n  { return x.toLong(); }\n\n  template<> inline int cast<mpfr::mpreal,int>(const mpfr::mpreal& x)\n  { return int(x.toLong()); }\n\n  // Specialize GEBP kernel and traits for mpreal (no need for peeling, nor complicated stuff)\n  // This also permits to directly call mpfr's routines and avoid many temporaries produced by mpreal\n    template<>\n    class gebp_traits<mpfr::mpreal, mpfr::mpreal, false, false>\n    {\n    public:\n      typedef mpfr::mpreal ResScalar;\n      enum {\n        nr = 2, // must be 2 for proper packing...\n        mr = 1,\n        WorkSpaceFactor = nr,\n        LhsProgress = 1,\n        RhsProgress = 1\n      };\n    };\n\n    template<typename Index, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>\n    struct gebp_kernel<mpfr::mpreal,mpfr::mpreal,Index,mr,nr,ConjugateLhs,ConjugateRhs>\n    {\n      typedef mpfr::mpreal mpreal;\n\n      EIGEN_DONT_INLINE\n      void operator()(mpreal* res, Index resStride, const mpreal* blockA, const mpreal* blockB, Index rows, Index depth, Index cols, mpreal alpha,\n                      Index strideA=-1, Index strideB=-1, Index offsetA=0, Index offsetB=0, mpreal* /*unpackedB*/ = 0)\n      {\n        mpreal acc1, acc2, tmp;\n        \n        if(strideA==-1) strideA = depth;\n        if(strideB==-1) strideB = depth;\n\n        for(Index j=0; j<cols; j+=nr)\n        {\n          Index actual_nr = (std::min<Index>)(nr,cols-j);\n          mpreal *C1 = res + j*resStride;\n          mpreal *C2 = res + (j+1)*resStride;\n          for(Index i=0; i<rows; i++)\n          {\n            mpreal *B = const_cast<mpreal*>(blockB) + j*strideB + offsetB*actual_nr;\n            mpreal *A = const_cast<mpreal*>(blockA) + i*strideA + offsetA;\n            acc1 = 0;\n            acc2 = 0;\n            for(Index k=0; k<depth; k++)\n            {\n              mpfr_mul(tmp.mpfr_ptr(), A[k].mpfr_ptr(), B[0].mpfr_ptr(), mpreal::get_default_rnd());\n              mpfr_add(acc1.mpfr_ptr(), acc1.mpfr_ptr(), tmp.mpfr_ptr(),  mpreal::get_default_rnd());\n              \n              if(actual_nr==2) {\n                mpfr_mul(tmp.mpfr_ptr(), A[k].mpfr_ptr(), B[1].mpfr_ptr(), mpreal::get_default_rnd());\n                mpfr_add(acc2.mpfr_ptr(), acc2.mpfr_ptr(), tmp.mpfr_ptr(),  mpreal::get_default_rnd());\n              }\n              \n              B+=actual_nr;\n            }\n            \n            mpfr_mul(acc1.mpfr_ptr(), acc1.mpfr_ptr(), alpha.mpfr_ptr(), mpreal::get_default_rnd());\n            mpfr_add(C1[i].mpfr_ptr(), C1[i].mpfr_ptr(), acc1.mpfr_ptr(),  mpreal::get_default_rnd());\n            \n            if(actual_nr==2) {\n              mpfr_mul(acc2.mpfr_ptr(), acc2.mpfr_ptr(), alpha.mpfr_ptr(), mpreal::get_default_rnd());\n              mpfr_add(C2[i].mpfr_ptr(), C2[i].mpfr_ptr(), acc2.mpfr_ptr(),  mpreal::get_default_rnd());\n            }\n          }\n        }\n      }\n    };\n\n  } // end namespace internal\n}\n\n#endif // EIGEN_MPREALSUPPORT_MODULE_H\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/MatrixFunctions",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Jitse Niesen <jitse@maths.leeds.ac.uk>\n// Copyright (C) 2012 Chen-Pang He <jdh8@ms63.hinet.net>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_MATRIX_FUNCTIONS\n#define EIGEN_MATRIX_FUNCTIONS\n\n#include <cfloat>\n#include <list>\n#include <functional>\n#include <iterator>\n\n#include <Eigen/Core>\n#include <Eigen/LU>\n#include <Eigen/Eigenvalues>\n\n/**\n  * \\defgroup MatrixFunctions_Module Matrix functions module\n  * \\brief This module aims to provide various methods for the computation of\n  * matrix functions. \n  *\n  * To use this module, add \n  * \\code\n  * #include <unsupported/Eigen/MatrixFunctions>\n  * \\endcode\n  * at the start of your source file.\n  *\n  * This module defines the following MatrixBase methods.\n  *  - \\ref matrixbase_cos \"MatrixBase::cos()\", for computing the matrix cosine\n  *  - \\ref matrixbase_cosh \"MatrixBase::cosh()\", for computing the matrix hyperbolic cosine\n  *  - \\ref matrixbase_exp \"MatrixBase::exp()\", for computing the matrix exponential\n  *  - \\ref matrixbase_log \"MatrixBase::log()\", for computing the matrix logarithm\n  *  - \\ref matrixbase_pow \"MatrixBase::pow()\", for computing the matrix power\n  *  - \\ref matrixbase_matrixfunction \"MatrixBase::matrixFunction()\", for computing general matrix functions\n  *  - \\ref matrixbase_sin \"MatrixBase::sin()\", for computing the matrix sine\n  *  - \\ref matrixbase_sinh \"MatrixBase::sinh()\", for computing the matrix hyperbolic sine\n  *  - \\ref matrixbase_sqrt \"MatrixBase::sqrt()\", for computing the matrix square root\n  *\n  * These methods are the main entry points to this module. \n  *\n  * %Matrix functions are defined as follows.  Suppose that \\f$ f \\f$\n  * is an entire function (that is, a function on the complex plane\n  * that is everywhere complex differentiable).  Then its Taylor\n  * series\n  * \\f[ f(0) + f'(0) x + \\frac{f''(0)}{2} x^2 + \\frac{f'''(0)}{3!} x^3 + \\cdots \\f]\n  * converges to \\f$ f(x) \\f$. In this case, we can define the matrix\n  * function by the same series:\n  * \\f[ f(M) = f(0) + f'(0) M + \\frac{f''(0)}{2} M^2 + \\frac{f'''(0)}{3!} M^3 + \\cdots \\f]\n  *\n  */\n\n#include \"src/MatrixFunctions/MatrixExponential.h\"\n#include \"src/MatrixFunctions/MatrixFunction.h\"\n#include \"src/MatrixFunctions/MatrixSquareRoot.h\"\n#include \"src/MatrixFunctions/MatrixLogarithm.h\"\n#include \"src/MatrixFunctions/MatrixPower.h\"\n\n\n/** \n\\page matrixbaseextra_page\n\\ingroup MatrixFunctions_Module\n\n\\section matrixbaseextra MatrixBase methods defined in the MatrixFunctions module\n\nThe remainder of the page documents the following MatrixBase methods\nwhich are defined in the MatrixFunctions module.\n\n\n\n\\subsection matrixbase_cos MatrixBase::cos()\n\nCompute the matrix cosine.\n\n\\code\nconst MatrixFunctionReturnValue<Derived> MatrixBase<Derived>::cos() const\n\\endcode\n\n\\param[in]  M  a square matrix.\n\\returns  expression representing \\f$ \\cos(M) \\f$.\n\nThis function calls \\ref matrixbase_matrixfunction \"matrixFunction()\" with StdStemFunctions::cos().\n\n\\sa \\ref matrixbase_sin \"sin()\" for an example.\n\n\n\n\\subsection matrixbase_cosh MatrixBase::cosh()\n\nCompute the matrix hyberbolic cosine.\n\n\\code\nconst MatrixFunctionReturnValue<Derived> MatrixBase<Derived>::cosh() const\n\\endcode\n\n\\param[in]  M  a square matrix.\n\\returns  expression representing \\f$ \\cosh(M) \\f$\n\nThis function calls \\ref matrixbase_matrixfunction \"matrixFunction()\" with StdStemFunctions::cosh().\n\n\\sa \\ref matrixbase_sinh \"sinh()\" for an example.\n\n\n\n\\subsection matrixbase_exp MatrixBase::exp()\n\nCompute the matrix exponential.\n\n\\code\nconst MatrixExponentialReturnValue<Derived> MatrixBase<Derived>::exp() const\n\\endcode\n\n\\param[in]  M  matrix whose exponential is to be computed.\n\\returns    expression representing the matrix exponential of \\p M.\n\nThe matrix exponential of \\f$ M \\f$ is defined by\n\\f[ \\exp(M) = \\sum_{k=0}^\\infty \\frac{M^k}{k!}. \\f]\nThe matrix exponential can be used to solve linear ordinary\ndifferential equations: the solution of \\f$ y' = My \\f$ with the\ninitial condition \\f$ y(0) = y_0 \\f$ is given by\n\\f$ y(t) = \\exp(M) y_0 \\f$.\n\nThe cost of the computation is approximately \\f$ 20 n^3 \\f$ for\nmatrices of size \\f$ n \\f$. The number 20 depends weakly on the\nnorm of the matrix.\n\nThe matrix exponential is computed using the scaling-and-squaring\nmethod combined with Pad&eacute; approximation. The matrix is first\nrescaled, then the exponential of the reduced matrix is computed\napproximant, and then the rescaling is undone by repeated\nsquaring. The degree of the Pad&eacute; approximant is chosen such\nthat the approximation error is less than the round-off\nerror. However, errors may accumulate during the squaring phase.\n\nDetails of the algorithm can be found in: Nicholas J. Higham, \"The\nscaling and squaring method for the matrix exponential revisited,\"\n<em>SIAM J. %Matrix Anal. Applic.</em>, <b>26</b>:1179&ndash;1193,\n2005.\n\nExample: The following program checks that\n\\f[ \\exp \\left[ \\begin{array}{ccc}\n      0 & \\frac14\\pi & 0 \\\\\n      -\\frac14\\pi & 0 & 0 \\\\\n      0 & 0 & 0\n    \\end{array} \\right] = \\left[ \\begin{array}{ccc}\n      \\frac12\\sqrt2 & -\\frac12\\sqrt2 & 0 \\\\\n      \\frac12\\sqrt2 & \\frac12\\sqrt2 & 0 \\\\\n      0 & 0 & 1\n    \\end{array} \\right]. \\f]\nThis corresponds to a rotation of \\f$ \\frac14\\pi \\f$ radians around\nthe z-axis.\n\n\\include MatrixExponential.cpp\nOutput: \\verbinclude MatrixExponential.out\n\n\\note \\p M has to be a matrix of \\c float, \\c double, \\c long double\n\\c complex<float>, \\c complex<double>, or \\c complex<long double> .\n\n\n\\subsection matrixbase_log MatrixBase::log()\n\nCompute the matrix logarithm.\n\n\\code\nconst MatrixLogarithmReturnValue<Derived> MatrixBase<Derived>::log() const\n\\endcode\n\n\\param[in]  M  invertible matrix whose logarithm is to be computed.\n\\returns    expression representing the matrix logarithm root of \\p M.\n\nThe matrix logarithm of \\f$ M \\f$ is a matrix \\f$ X \\f$ such that \n\\f$ \\exp(X) = M \\f$ where exp denotes the matrix exponential. As for\nthe scalar logarithm, the equation \\f$ \\exp(X) = M \\f$ may have\nmultiple solutions; this function returns a matrix whose eigenvalues\nhave imaginary part in the interval \\f$ (-\\pi,\\pi] \\f$.\n\nIn the real case, the matrix \\f$ M \\f$ should be invertible and\nit should have no eigenvalues which are real and negative (pairs of\ncomplex conjugate eigenvalues are allowed). In the complex case, it\nonly needs to be invertible.\n\nThis function computes the matrix logarithm using the Schur-Parlett\nalgorithm as implemented by MatrixBase::matrixFunction(). The\nlogarithm of an atomic block is computed by MatrixLogarithmAtomic,\nwhich uses direct computation for 1-by-1 and 2-by-2 blocks and an\ninverse scaling-and-squaring algorithm for bigger blocks, with the\nsquare roots computed by MatrixBase::sqrt().\n\nDetails of the algorithm can be found in Section 11.6.2 of:\nNicholas J. Higham,\n<em>Functions of Matrices: Theory and Computation</em>,\nSIAM 2008. ISBN 978-0-898716-46-7.\n\nExample: The following program checks that\n\\f[ \\log \\left[ \\begin{array}{ccc} \n      \\frac12\\sqrt2 & -\\frac12\\sqrt2 & 0 \\\\\n      \\frac12\\sqrt2 & \\frac12\\sqrt2 & 0 \\\\\n      0 & 0 & 1\n    \\end{array} \\right] = \\left[ \\begin{array}{ccc}\n      0 & \\frac14\\pi & 0 \\\\ \n      -\\frac14\\pi & 0 & 0 \\\\\n      0 & 0 & 0 \n    \\end{array} \\right]. \\f]\nThis corresponds to a rotation of \\f$ \\frac14\\pi \\f$ radians around\nthe z-axis. This is the inverse of the example used in the\ndocumentation of \\ref matrixbase_exp \"exp()\".\n\n\\include MatrixLogarithm.cpp\nOutput: \\verbinclude MatrixLogarithm.out\n\n\\note \\p M has to be a matrix of \\c float, \\c double, <tt>long\ndouble</tt>, \\c complex<float>, \\c complex<double>, or \\c complex<long\ndouble> .\n\n\\sa MatrixBase::exp(), MatrixBase::matrixFunction(), \n    class MatrixLogarithmAtomic, MatrixBase::sqrt().\n\n\n\\subsection matrixbase_pow MatrixBase::pow()\n\nCompute the matrix raised to arbitrary real power.\n\n\\code\nconst MatrixPowerReturnValue<Derived> MatrixBase<Derived>::pow(RealScalar p) const\n\\endcode\n\n\\param[in]  M  base of the matrix power, should be a square matrix.\n\\param[in]  p  exponent of the matrix power, should be real.\n\nThe matrix power \\f$ M^p \\f$ is defined as \\f$ \\exp(p \\log(M)) \\f$,\nwhere exp denotes the matrix exponential, and log denotes the matrix\nlogarithm.\n\nThe matrix \\f$ M \\f$ should meet the conditions to be an argument of\nmatrix logarithm. If \\p p is not of the real scalar type of \\p M, it\nis casted into the real scalar type of \\p M.\n\nThis function computes the matrix power using the Schur-Pad&eacute;\nalgorithm as implemented by class MatrixPower. The exponent is split\ninto integral part and fractional part, where the fractional part is\nin the interval \\f$ (-1, 1) \\f$. The main diagonal and the first\nsuper-diagonal is directly computed.\n\nDetails of the algorithm can be found in: Nicholas J. Higham and\nLijing Lin, \"A Schur-Pad&eacute; algorithm for fractional powers of a\nmatrix,\" <em>SIAM J. %Matrix Anal. Applic.</em>,\n<b>32(3)</b>:1056&ndash;1078, 2011.\n\nExample: The following program checks that\n\\f[ \\left[ \\begin{array}{ccc}\n      \\cos1 & -\\sin1 & 0 \\\\\n      \\sin1 & \\cos1 & 0 \\\\\n      0 & 0 & 1\n    \\end{array} \\right]^{\\frac14\\pi} = \\left[ \\begin{array}{ccc}\n      \\frac12\\sqrt2 & -\\frac12\\sqrt2 & 0 \\\\\n      \\frac12\\sqrt2 & \\frac12\\sqrt2 & 0 \\\\\n      0 & 0 & 1\n    \\end{array} \\right]. \\f]\nThis corresponds to \\f$ \\frac14\\pi \\f$ rotations of 1 radian around\nthe z-axis.\n\n\\include MatrixPower.cpp\nOutput: \\verbinclude MatrixPower.out\n\nMatrixBase::pow() is user-friendly. However, there are some\ncircumstances under which you should use class MatrixPower directly.\nMatrixPower can save the result of Schur decomposition, so it's\nbetter for computing various powers for the same matrix.\n\nExample:\n\\include MatrixPower_optimal.cpp\nOutput: \\verbinclude MatrixPower_optimal.out\n\n\\note \\p M has to be a matrix of \\c float, \\c double, <tt>long\ndouble</tt>, \\c complex<float>, \\c complex<double>, or \\c complex<long\ndouble> .\n\n\\sa MatrixBase::exp(), MatrixBase::log(), class MatrixPower.\n\n\n\\subsection matrixbase_matrixfunction MatrixBase::matrixFunction()\n\nCompute a matrix function.\n\n\\code\nconst MatrixFunctionReturnValue<Derived> MatrixBase<Derived>::matrixFunction(typename internal::stem_function<typename internal::traits<Derived>::Scalar>::type f) const\n\\endcode\n\n\\param[in]  M  argument of matrix function, should be a square matrix.\n\\param[in]  f  an entire function; \\c f(x,n) should compute the n-th\nderivative of f at x.\n\\returns  expression representing \\p f applied to \\p M.\n\nSuppose that \\p M is a matrix whose entries have type \\c Scalar. \nThen, the second argument, \\p f, should be a function with prototype\n\\code \nComplexScalar f(ComplexScalar, int) \n\\endcode\nwhere \\c ComplexScalar = \\c std::complex<Scalar> if \\c Scalar is\nreal (e.g., \\c float or \\c double) and \\c ComplexScalar =\n\\c Scalar if \\c Scalar is complex. The return value of \\c f(x,n)\nshould be \\f$ f^{(n)}(x) \\f$, the n-th derivative of f at x.\n\nThis routine uses the algorithm described in:\nPhilip Davies and Nicholas J. Higham, \n\"A Schur-Parlett algorithm for computing matrix functions\", \n<em>SIAM J. %Matrix Anal. Applic.</em>, <b>25</b>:464&ndash;485, 2003.\n\nThe actual work is done by the MatrixFunction class.\n\nExample: The following program checks that\n\\f[ \\exp \\left[ \\begin{array}{ccc} \n      0 & \\frac14\\pi & 0 \\\\ \n      -\\frac14\\pi & 0 & 0 \\\\\n      0 & 0 & 0 \n    \\end{array} \\right] = \\left[ \\begin{array}{ccc}\n      \\frac12\\sqrt2 & -\\frac12\\sqrt2 & 0 \\\\\n      \\frac12\\sqrt2 & \\frac12\\sqrt2 & 0 \\\\\n      0 & 0 & 1\n    \\end{array} \\right]. \\f]\nThis corresponds to a rotation of \\f$ \\frac14\\pi \\f$ radians around\nthe z-axis. This is the same example as used in the documentation\nof \\ref matrixbase_exp \"exp()\".\n\n\\include MatrixFunction.cpp\nOutput: \\verbinclude MatrixFunction.out\n\nNote that the function \\c expfn is defined for complex numbers \n\\c x, even though the matrix \\c A is over the reals. Instead of\n\\c expfn, we could also have used StdStemFunctions::exp:\n\\code\nA.matrixFunction(StdStemFunctions<std::complex<double> >::exp, &B);\n\\endcode\n\n\n\n\\subsection matrixbase_sin MatrixBase::sin()\n\nCompute the matrix sine.\n\n\\code\nconst MatrixFunctionReturnValue<Derived> MatrixBase<Derived>::sin() const\n\\endcode\n\n\\param[in]  M  a square matrix.\n\\returns  expression representing \\f$ \\sin(M) \\f$.\n\nThis function calls \\ref matrixbase_matrixfunction \"matrixFunction()\" with StdStemFunctions::sin().\n\nExample: \\include MatrixSine.cpp\nOutput: \\verbinclude MatrixSine.out\n\n\n\n\\subsection matrixbase_sinh MatrixBase::sinh()\n\nCompute the matrix hyperbolic sine.\n\n\\code\nMatrixFunctionReturnValue<Derived> MatrixBase<Derived>::sinh() const\n\\endcode\n\n\\param[in]  M  a square matrix.\n\\returns  expression representing \\f$ \\sinh(M) \\f$\n\nThis function calls \\ref matrixbase_matrixfunction \"matrixFunction()\" with StdStemFunctions::sinh().\n\nExample: \\include MatrixSinh.cpp\nOutput: \\verbinclude MatrixSinh.out\n\n\n\\subsection matrixbase_sqrt MatrixBase::sqrt()\n\nCompute the matrix square root.\n\n\\code\nconst MatrixSquareRootReturnValue<Derived> MatrixBase<Derived>::sqrt() const\n\\endcode\n\n\\param[in]  M  invertible matrix whose square root is to be computed.\n\\returns    expression representing the matrix square root of \\p M.\n\nThe matrix square root of \\f$ M \\f$ is the matrix \\f$ M^{1/2} \\f$\nwhose square is the original matrix; so if \\f$ S = M^{1/2} \\f$ then\n\\f$ S^2 = M \\f$. \n\nIn the <b>real case</b>, the matrix \\f$ M \\f$ should be invertible and\nit should have no eigenvalues which are real and negative (pairs of\ncomplex conjugate eigenvalues are allowed). In that case, the matrix\nhas a square root which is also real, and this is the square root\ncomputed by this function. \n\nThe matrix square root is computed by first reducing the matrix to\nquasi-triangular form with the real Schur decomposition. The square\nroot of the quasi-triangular matrix can then be computed directly. The\ncost is approximately \\f$ 25 n^3 \\f$ real flops for the real Schur\ndecomposition and \\f$ 3\\frac13 n^3 \\f$ real flops for the remainder\n(though the computation time in practice is likely more than this\nindicates).\n\nDetails of the algorithm can be found in: Nicholas J. Highan,\n\"Computing real square roots of a real matrix\", <em>Linear Algebra\nAppl.</em>, 88/89:405&ndash;430, 1987.\n\nIf the matrix is <b>positive-definite symmetric</b>, then the square\nroot is also positive-definite symmetric. In this case, it is best to\nuse SelfAdjointEigenSolver::operatorSqrt() to compute it.\n\nIn the <b>complex case</b>, the matrix \\f$ M \\f$ should be invertible;\nthis is a restriction of the algorithm. The square root computed by\nthis algorithm is the one whose eigenvalues have an argument in the\ninterval \\f$ (-\\frac12\\pi, \\frac12\\pi] \\f$. This is the usual branch\ncut.\n\nThe computation is the same as in the real case, except that the\ncomplex Schur decomposition is used to reduce the matrix to a\ntriangular matrix. The theoretical cost is the same. Details are in:\n&Aring;ke Bj&ouml;rck and Sven Hammarling, \"A Schur method for the\nsquare root of a matrix\", <em>Linear Algebra Appl.</em>,\n52/53:127&ndash;140, 1983.\n\nExample: The following program checks that the square root of\n\\f[ \\left[ \\begin{array}{cc} \n              \\cos(\\frac13\\pi) & -\\sin(\\frac13\\pi) \\\\\n              \\sin(\\frac13\\pi) & \\cos(\\frac13\\pi)\n    \\end{array} \\right], \\f]\ncorresponding to a rotation over 60 degrees, is a rotation over 30 degrees:\n\\f[ \\left[ \\begin{array}{cc} \n              \\cos(\\frac16\\pi) & -\\sin(\\frac16\\pi) \\\\\n              \\sin(\\frac16\\pi) & \\cos(\\frac16\\pi)\n    \\end{array} \\right]. \\f]\n\n\\include MatrixSquareRoot.cpp\nOutput: \\verbinclude MatrixSquareRoot.out\n\n\\sa class RealSchur, class ComplexSchur, class MatrixSquareRoot,\n    SelfAdjointEigenSolver::operatorSqrt().\n\n*/\n\n#endif // EIGEN_MATRIX_FUNCTIONS\n\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/MoreVectorization",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_MOREVECTORIZATION_MODULE_H\n#define EIGEN_MOREVECTORIZATION_MODULE_H\n\n#include <Eigen/Core>\n\nnamespace Eigen {\n\n/**\n  * \\defgroup MoreVectorization More vectorization module\n  */\n\n}\n\n#include \"src/MoreVectorization/MathFunctions.h\"\n\n#endif // EIGEN_MOREVECTORIZATION_MODULE_H\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/NonLinearOptimization",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Thomas Capricelli <orzel@freehackers.org>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_NONLINEAROPTIMIZATION_MODULE\n#define EIGEN_NONLINEAROPTIMIZATION_MODULE\n\n#include <vector>\n\n#include <Eigen/Core>\n#include <Eigen/Jacobi>\n#include <Eigen/QR>\n#include <unsupported/Eigen/NumericalDiff>\n\n/**\n  * \\defgroup NonLinearOptimization_Module Non linear optimization module\n  *\n  * \\code\n  * #include <unsupported/Eigen/NonLinearOptimization>\n  * \\endcode\n  *\n  * This module provides implementation of two important algorithms in non linear\n  * optimization. In both cases, we consider a system of non linear functions. Of\n  * course, this should work, and even work very well if those functions are\n  * actually linear. But if this is so, you should probably better use other\n  * methods more fitted to this special case.\n  *\n  * One algorithm allows to find an extremum of such a system (Levenberg\n  * Marquardt algorithm) and the second one is used to find \n  * a zero for the system (Powell hybrid \"dogleg\" method).\n  *\n  * This code is a port of minpack (http://en.wikipedia.org/wiki/MINPACK).\n  * Minpack is a very famous, old, robust and well-reknown package, written in \n  * fortran. Those implementations have been carefully tuned, tested, and used\n  * for several decades.\n  *\n  * The original fortran code was automatically translated using f2c (http://en.wikipedia.org/wiki/F2c) in C,\n  * then c++, and then cleaned by several different authors.\n  * The last one of those cleanings being our starting point : \n  * http://devernay.free.fr/hacks/cminpack.html\n  * \n  * Finally, we ported this code to Eigen, creating classes and API\n  * coherent with Eigen. When possible, we switched to Eigen\n  * implementation, such as most linear algebra (vectors, matrices, stable norms).\n  *\n  * Doing so, we were very careful to check the tests we setup at the very\n  * beginning, which ensure that the same results are found.\n  *\n  * \\section Tests Tests\n  * \n  * The tests are placed in the file unsupported/test/NonLinear.cpp.\n  * \n  * There are two kinds of tests : those that come from examples bundled with cminpack.\n  * They guaranty we get the same results as the original algorithms (value for 'x',\n  * for the number of evaluations of the function, and for the number of evaluations\n  * of the jacobian if ever).\n  * \n  * Other tests were added by myself at the very beginning of the \n  * process and check the results for levenberg-marquardt using the reference data \n  * on http://www.itl.nist.gov/div898/strd/nls/nls_main.shtml. Since then i've \n  * carefully checked that the same results were obtained when modifiying the \n  * code. Please note that we do not always get the exact same decimals as they do,\n  * but this is ok : they use 128bits float, and we do the tests using the C type 'double',\n  * which is 64 bits on most platforms (x86 and amd64, at least).\n  * I've performed those tests on several other implementations of levenberg-marquardt, and\n  * (c)minpack performs VERY well compared to those, both in accuracy and speed.\n  * \n  * The documentation for running the tests is on the wiki\n  * http://eigen.tuxfamily.org/index.php?title=Tests\n  * \n  * \\section API API : overview of methods\n  * \n  * Both algorithms can use either the jacobian (provided by the user) or compute \n  * an approximation by themselves (actually using Eigen \\ref NumericalDiff_Module).\n  * The part of API referring to the latter use 'NumericalDiff' in the method names\n  * (exemple: LevenbergMarquardt.minimizeNumericalDiff() ) \n  * \n  * The methods LevenbergMarquardt.lmder1()/lmdif1()/lmstr1() and \n  * HybridNonLinearSolver.hybrj1()/hybrd1() are specific methods from the original \n  * minpack package that you probably should NOT use until you are porting a code that\n  *  was previously using minpack. They just define a 'simple' API with default values \n  * for some parameters.\n  * \n  * All algorithms are provided using Two APIs :\n  *     - one where the user inits the algorithm, and uses '*OneStep()' as much as he wants : \n  * this way the caller have control over the steps\n  *     - one where the user just calls a method (optimize() or solve()) which will \n  * handle the loop: init + loop until a stop condition is met. Those are provided for\n  *  convenience.\n  * \n  * As an example, the method LevenbergMarquardt::minimize() is \n  * implemented as follow : \n  * \\code\n  * Status LevenbergMarquardt<FunctorType,Scalar>::minimize(FVectorType  &x, const int mode)\n  * {\n  *     Status status = minimizeInit(x, mode);\n  *     do {\n  *         status = minimizeOneStep(x, mode);\n  *     } while (status==Running);\n  *     return status;\n  * }\n  * \\endcode\n  * \n  * \\section examples Examples\n  * \n  * The easiest way to understand how to use this module is by looking at the many examples in the file\n  * unsupported/test/NonLinearOptimization.cpp.\n  */\n\n#ifndef EIGEN_PARSED_BY_DOXYGEN\n\n#include \"src/NonLinearOptimization/qrsolv.h\"\n#include \"src/NonLinearOptimization/r1updt.h\"\n#include \"src/NonLinearOptimization/r1mpyq.h\"\n#include \"src/NonLinearOptimization/rwupdt.h\"\n#include \"src/NonLinearOptimization/fdjac1.h\"\n#include \"src/NonLinearOptimization/lmpar.h\"\n#include \"src/NonLinearOptimization/dogleg.h\"\n#include \"src/NonLinearOptimization/covar.h\"\n\n#include \"src/NonLinearOptimization/chkder.h\"\n\n#endif\n\n#include \"src/NonLinearOptimization/HybridNonLinearSolver.h\"\n#include \"src/NonLinearOptimization/LevenbergMarquardt.h\"\n\n\n#endif // EIGEN_NONLINEAROPTIMIZATION_MODULE\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/NumericalDiff",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Thomas Capricelli <orzel@freehackers.org>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_NUMERICALDIFF_MODULE\n#define EIGEN_NUMERICALDIFF_MODULE\n\n#include <Eigen/Core>\n\nnamespace Eigen {\n\n/**\n  * \\defgroup NumericalDiff_Module Numerical differentiation module\n  *\n  * \\code\n  * #include <unsupported/Eigen/NumericalDiff>\n  * \\endcode\n  *\n  * See http://en.wikipedia.org/wiki/Numerical_differentiation\n  *\n  * Warning : this should NOT be confused with automatic differentiation, which\n  * is a different method and has its own module in Eigen : \\ref\n  * AutoDiff_Module.\n  *\n  * Currently only \"Forward\" and \"Central\" schemes are implemented. Those\n  * are basic methods, and there exist some more elaborated way of\n  * computing such approximates. They are implemented using both\n  * proprietary and free software, and usually requires linking to an\n  * external library. It is very easy for you to write a functor\n  * using such software, and the purpose is quite orthogonal to what we\n  * want to achieve with Eigen.\n  *\n  * This is why we will not provide wrappers for every great numerical\n  * differentiation software that exist, but should rather stick with those\n  * basic ones, that still are useful for testing.\n  *\n  * Also, the \\ref NonLinearOptimization_Module needs this in order to\n  * provide full features compatibility with the original (c)minpack\n  * package.\n  *\n  */\n}\n\n//@{\n\n#include \"src/NumericalDiff/NumericalDiff.h\"\n\n//@}\n\n\n#endif // EIGEN_NUMERICALDIFF_MODULE\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/OpenGLSupport",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_OPENGL_MODULE\n#define EIGEN_OPENGL_MODULE\n\n#include <Eigen/Geometry>\n\n#if defined(__APPLE_CC__)\n  #include <OpenGL/gl.h>\n#else\n  #include <GL/gl.h>\n#endif\n\nnamespace Eigen {\n\n/**\n  * \\defgroup OpenGLSUpport_Module OpenGL Support module\n  *\n  * This module provides wrapper functions for a couple of OpenGL functions\n  * which simplify the way to pass Eigen's object to openGL.\n  * Here is an exmaple:\n  * \n  * \\code\n  * // You need to add path_to_eigen/unsupported to your include path.\n  * #include <Eigen/OpenGLSupport>\n  * // ...\n  * Vector3f x, y;\n  * Matrix3f rot;\n  * \n  * glVertex(y + x * rot);\n  * \n  * Quaternion q;\n  * glRotate(q);\n  * \n  * // ...\n  * \\endcode\n  *\n  */\n//@{\n\n#define EIGEN_GL_FUNC_DECLARATION(FUNC)                                                                             \\\nnamespace internal {                                                                                                \\\n  template< typename XprType,                                                                                       \\\n            typename Scalar = typename XprType::Scalar,                                                             \\\n            int Rows = XprType::RowsAtCompileTime,                                                                  \\\n            int Cols = XprType::ColsAtCompileTime,                                                                  \\\n            bool IsGLCompatible = bool(XprType::Flags&LinearAccessBit)                                              \\\n                              && bool(XprType::Flags&DirectAccessBit)                                               \\\n                              && (XprType::IsVectorAtCompileTime || (XprType::Flags&RowMajorBit)==0)>               \\\n  struct EIGEN_CAT(EIGEN_CAT(gl_,FUNC),_impl);                                                                      \\\n                                                                                                                    \\\n  template<typename XprType, typename Scalar, int Rows, int Cols>                                                   \\\n  struct EIGEN_CAT(EIGEN_CAT(gl_,FUNC),_impl)<XprType,Scalar,Rows,Cols,false> {                                     \\\n    inline static void run(const XprType& p) {                                                                      \\\n      EIGEN_CAT(EIGEN_CAT(gl_,FUNC),_impl)<typename plain_matrix_type_column_major<XprType>::type>::run(p); }       \\\n  };                                                                                                                \\\n}                                                                                                                   \\\n                                                                                                                    \\\ntemplate<typename Derived> inline void FUNC(const Eigen::DenseBase<Derived>& p) {                                   \\\n  EIGEN_CAT(EIGEN_CAT(internal::gl_,FUNC),_impl)<Derived>::run(p.derived());                                        \\\n}\n\n\n#define EIGEN_GL_FUNC_SPECIALIZATION_MAT(FUNC,SCALAR,ROWS,COLS,SUFFIX)                                              \\\nnamespace internal {                                                                                                \\\n  template< typename XprType> struct EIGEN_CAT(EIGEN_CAT(gl_,FUNC),_impl)<XprType, SCALAR, ROWS, COLS, true> {      \\\n    inline static void run(const XprType& p) { FUNC##SUFFIX(p.data()); }                                            \\\n  };                                                                                                                \\\n}\n\n  \n#define EIGEN_GL_FUNC_SPECIALIZATION_VEC(FUNC,SCALAR,SIZE,SUFFIX)                                                   \\\nnamespace internal {                                                                                                \\\n  template< typename XprType> struct EIGEN_CAT(EIGEN_CAT(gl_,FUNC),_impl)<XprType, SCALAR, SIZE, 1, true> {         \\\n    inline static void run(const XprType& p) { FUNC##SUFFIX(p.data()); }                                            \\\n  };                                                                                                                \\\n  template< typename XprType> struct EIGEN_CAT(EIGEN_CAT(gl_,FUNC),_impl)<XprType, SCALAR, 1, SIZE, true> {         \\\n    inline static void run(const XprType& p) { FUNC##SUFFIX(p.data()); }                                            \\\n  };                                                                                                                \\\n}\n\n  \nEIGEN_GL_FUNC_DECLARATION       (glVertex)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex,int,    2,2iv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex,short,  2,2sv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex,float,  2,2fv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex,double, 2,2dv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex,int,    3,3iv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex,short,  3,3sv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex,float,  3,3fv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex,double, 3,3dv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex,int,    4,4iv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex,short,  4,4sv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex,float,  4,4fv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex,double, 4,4dv)\n\nEIGEN_GL_FUNC_DECLARATION       (glTexCoord)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord,int,    2,2iv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord,short,  2,2sv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord,float,  2,2fv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord,double, 2,2dv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord,int,    3,3iv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord,short,  3,3sv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord,float,  3,3fv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord,double, 3,3dv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord,int,    4,4iv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord,short,  4,4sv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord,float,  4,4fv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord,double, 4,4dv)\n\nEIGEN_GL_FUNC_DECLARATION       (glColor)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor,int,    2,2iv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor,short,  2,2sv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor,float,  2,2fv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor,double, 2,2dv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor,int,    3,3iv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor,short,  3,3sv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor,float,  3,3fv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor,double, 3,3dv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor,int,    4,4iv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor,short,  4,4sv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor,float,  4,4fv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor,double, 4,4dv)\n\nEIGEN_GL_FUNC_DECLARATION       (glNormal)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glNormal,int,    3,3iv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glNormal,short,  3,3sv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glNormal,float,  3,3fv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glNormal,double, 3,3dv)\n\ninline void glScale2fv(const float*  v) { glScalef(v[0], v[1], 1.f);  }\ninline void glScale2dv(const double* v) { glScaled(v[0], v[1], 1.0);  }\ninline void glScale3fv(const float*  v) { glScalef(v[0], v[1], v[2]); }\ninline void glScale3dv(const double* v) { glScaled(v[0], v[1], v[2]); }\n\nEIGEN_GL_FUNC_DECLARATION       (glScale)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glScale,float,  2,2fv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glScale,double, 2,2dv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glScale,float,  3,3fv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glScale,double, 3,3dv)\n\ntemplate<typename Scalar> void glScale(const UniformScaling<Scalar>& s)  { glScale(Matrix<Scalar,3,1>::Constant(s.factor())); }\n\ninline void glTranslate2fv(const float*  v) { glTranslatef(v[0], v[1], 0.f);  }\ninline void glTranslate2dv(const double* v) { glTranslated(v[0], v[1], 0.0);  }\ninline void glTranslate3fv(const float*  v) { glTranslatef(v[0], v[1], v[2]); }\ninline void glTranslate3dv(const double* v) { glTranslated(v[0], v[1], v[2]); }\n\nEIGEN_GL_FUNC_DECLARATION       (glTranslate)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glTranslate,float,  2,2fv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glTranslate,double, 2,2dv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glTranslate,float,  3,3fv)\nEIGEN_GL_FUNC_SPECIALIZATION_VEC(glTranslate,double, 3,3dv)\n\ntemplate<typename Scalar> void glTranslate(const Translation<Scalar,2>& t)  { glTranslate(t.vector()); }\ntemplate<typename Scalar> void glTranslate(const Translation<Scalar,3>& t)  { glTranslate(t.vector()); }\n\nEIGEN_GL_FUNC_DECLARATION       (glMultMatrix)\nEIGEN_GL_FUNC_SPECIALIZATION_MAT(glMultMatrix,float,  4,4,f)\nEIGEN_GL_FUNC_SPECIALIZATION_MAT(glMultMatrix,double, 4,4,d)\n\ntemplate<typename Scalar> void glMultMatrix(const Transform<Scalar,3,Affine>& t)        { glMultMatrix(t.matrix()); }\ntemplate<typename Scalar> void glMultMatrix(const Transform<Scalar,3,Projective>& t)    { glMultMatrix(t.matrix()); }\ntemplate<typename Scalar> void glMultMatrix(const Transform<Scalar,3,AffineCompact>& t) { glMultMatrix(Transform<Scalar,3,Affine>(t).matrix()); }\n\nEIGEN_GL_FUNC_DECLARATION       (glLoadMatrix)\nEIGEN_GL_FUNC_SPECIALIZATION_MAT(glLoadMatrix,float,  4,4,f)\nEIGEN_GL_FUNC_SPECIALIZATION_MAT(glLoadMatrix,double, 4,4,d)\n\ntemplate<typename Scalar> void glLoadMatrix(const Transform<Scalar,3,Affine>& t)        { glLoadMatrix(t.matrix()); }\ntemplate<typename Scalar> void glLoadMatrix(const Transform<Scalar,3,Projective>& t)    { glLoadMatrix(t.matrix()); }\ntemplate<typename Scalar> void glLoadMatrix(const Transform<Scalar,3,AffineCompact>& t) { glLoadMatrix(Transform<Scalar,3,Affine>(t).matrix()); }\n\ninline void glRotate(const Rotation2D<float>& rot)\n{\n  glRotatef(rot.angle()*180.f/float(M_PI), 0.f, 0.f, 1.f);\n}\ninline void glRotate(const Rotation2D<double>& rot)\n{\n  glRotated(rot.angle()*180.0/M_PI, 0.0, 0.0, 1.0);\n}\n\ntemplate<typename Derived> void glRotate(const RotationBase<Derived,3>& rot)\n{  \n  Transform<typename Derived::Scalar,3,Projective> tr(rot);\n  glMultMatrix(tr.matrix());\n}\n\n#define EIGEN_GL_MAKE_CONST_const const\n#define EIGEN_GL_MAKE_CONST__ \n#define EIGEN_GL_EVAL(X) X\n\n#define EIGEN_GL_FUNC1_DECLARATION(FUNC,ARG1,CONST)                                                                             \\\nnamespace internal {                                                                                                            \\\n  template< typename XprType,                                                                                                   \\\n            typename Scalar = typename XprType::Scalar,                                                                         \\\n            int Rows = XprType::RowsAtCompileTime,                                                                              \\\n            int Cols = XprType::ColsAtCompileTime,                                                                              \\\n            bool IsGLCompatible = bool(XprType::Flags&LinearAccessBit)                                                          \\\n                              && bool(XprType::Flags&DirectAccessBit)                                                           \\\n                              && (XprType::IsVectorAtCompileTime || (XprType::Flags&RowMajorBit)==0)>                           \\\n  struct EIGEN_CAT(EIGEN_CAT(gl_,FUNC),_impl);                                                                                  \\\n                                                                                                                                \\\n  template<typename XprType, typename Scalar, int Rows, int Cols>                                                               \\\n  struct EIGEN_CAT(EIGEN_CAT(gl_,FUNC),_impl)<XprType,Scalar,Rows,Cols,false> {                                                 \\\n    inline static void run(ARG1 a,EIGEN_GL_EVAL(EIGEN_GL_MAKE_CONST_##CONST) XprType& p) {                                      \\\n      EIGEN_CAT(EIGEN_CAT(gl_,FUNC),_impl)<typename plain_matrix_type_column_major<XprType>::type>::run(a,p); }                 \\\n  };                                                                                                                            \\\n}                                                                                                                               \\\n                                                                                                                                \\\ntemplate<typename Derived> inline void FUNC(ARG1 a,EIGEN_GL_EVAL(EIGEN_GL_MAKE_CONST_##CONST) Eigen::DenseBase<Derived>& p) {   \\\n  EIGEN_CAT(EIGEN_CAT(internal::gl_,FUNC),_impl)<Derived>::run(a,p.derived());                                                  \\\n}\n\n\n#define EIGEN_GL_FUNC1_SPECIALIZATION_MAT(FUNC,ARG1,CONST,SCALAR,ROWS,COLS,SUFFIX)                                              \\\nnamespace internal {                                                                                                            \\\n  template< typename XprType> struct EIGEN_CAT(EIGEN_CAT(gl_,FUNC),_impl)<XprType, SCALAR, ROWS, COLS, true> {                  \\\n    inline static void run(ARG1 a, EIGEN_GL_EVAL(EIGEN_GL_MAKE_CONST_##CONST) XprType& p) { FUNC##SUFFIX(a,p.data()); }         \\\n  }; \\\n}\n\n  \n#define EIGEN_GL_FUNC1_SPECIALIZATION_VEC(FUNC,ARG1,CONST,SCALAR,SIZE,SUFFIX)                                                   \\\nnamespace internal {                                                                                                            \\\n  template< typename XprType> struct EIGEN_CAT(EIGEN_CAT(gl_,FUNC),_impl)<XprType, SCALAR, SIZE, 1, true> {                     \\\n    inline static void run(ARG1 a, EIGEN_GL_EVAL(EIGEN_GL_MAKE_CONST_##CONST) XprType& p) { FUNC##SUFFIX(a,p.data()); }         \\\n  };                                                                                                                            \\\n  template< typename XprType> struct EIGEN_CAT(EIGEN_CAT(gl_,FUNC),_impl)<XprType, SCALAR, 1, SIZE, true> {                     \\\n    inline static void run(ARG1 a, EIGEN_GL_EVAL(EIGEN_GL_MAKE_CONST_##CONST) XprType& p) { FUNC##SUFFIX(a,p.data()); }         \\\n  };                                                                                                                            \\\n}\n\nEIGEN_GL_FUNC1_DECLARATION       (glGet,GLenum,_)\nEIGEN_GL_FUNC1_SPECIALIZATION_MAT(glGet,GLenum,_,float,  4,4,Floatv)\nEIGEN_GL_FUNC1_SPECIALIZATION_MAT(glGet,GLenum,_,double, 4,4,Doublev)\n\n// glUniform API\n\n#ifdef GL_VERSION_2_0\n\ninline void glUniform2fv_ei  (GLint loc, const float* v)         { glUniform2fv(loc,1,v); }\ninline void glUniform2iv_ei  (GLint loc, const int* v)           { glUniform2iv(loc,1,v); }\n\ninline void glUniform3fv_ei  (GLint loc, const float* v)         { glUniform3fv(loc,1,v); }\ninline void glUniform3iv_ei  (GLint loc, const int* v)           { glUniform3iv(loc,1,v); }\n\ninline void glUniform4fv_ei  (GLint loc, const float* v)         { glUniform4fv(loc,1,v); }\ninline void glUniform4iv_ei  (GLint loc, const int* v)           { glUniform4iv(loc,1,v); }\n\ninline void glUniformMatrix2fv_ei  (GLint loc, const float* v)         { glUniformMatrix2fv(loc,1,false,v); }\ninline void glUniformMatrix3fv_ei  (GLint loc, const float* v)         { glUniformMatrix3fv(loc,1,false,v); }\ninline void glUniformMatrix4fv_ei  (GLint loc, const float* v)         { glUniformMatrix4fv(loc,1,false,v); }\n\n\nEIGEN_GL_FUNC1_DECLARATION       (glUniform,GLint,const)\nEIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform,GLint,const,float,        2,2fv_ei)\nEIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform,GLint,const,int,          2,2iv_ei)\nEIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform,GLint,const,float,        3,3fv_ei)\nEIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform,GLint,const,int,          3,3iv_ei)\nEIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform,GLint,const,float,        4,4fv_ei)\nEIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform,GLint,const,int,          4,4iv_ei)\n\nEIGEN_GL_FUNC1_SPECIALIZATION_MAT(glUniform,GLint,const,float,        2,2,Matrix2fv_ei)\nEIGEN_GL_FUNC1_SPECIALIZATION_MAT(glUniform,GLint,const,float,        3,3,Matrix3fv_ei)\nEIGEN_GL_FUNC1_SPECIALIZATION_MAT(glUniform,GLint,const,float,        4,4,Matrix4fv_ei)\n\n#endif\n\n#ifdef GL_VERSION_2_1\n\nstatic void glUniformMatrix2x3fv_ei(GLint loc, const float* v)         { glUniformMatrix2x3fv(loc,1,false,v); }\nstatic void glUniformMatrix3x2fv_ei(GLint loc, const float* v)         { glUniformMatrix3x2fv(loc,1,false,v); }\nstatic void glUniformMatrix2x4fv_ei(GLint loc, const float* v)         { glUniformMatrix2x4fv(loc,1,false,v); }\nstatic void glUniformMatrix4x2fv_ei(GLint loc, const float* v)         { glUniformMatrix4x2fv(loc,1,false,v); }\nstatic void glUniformMatrix3x4fv_ei(GLint loc, const float* v)         { glUniformMatrix3x4fv(loc,1,false,v); }\nstatic void glUniformMatrix4x3fv_ei(GLint loc, const float* v)         { glUniformMatrix4x3fv(loc,1,false,v); }\n\nEIGEN_GL_FUNC1_SPECIALIZATION_MAT(glUniform,GLint,const,float,        2,3,Matrix2x3fv_ei)\nEIGEN_GL_FUNC1_SPECIALIZATION_MAT(glUniform,GLint,const,float,        3,2,Matrix3x2fv_ei)\nEIGEN_GL_FUNC1_SPECIALIZATION_MAT(glUniform,GLint,const,float,        2,4,Matrix2x4fv_ei)\nEIGEN_GL_FUNC1_SPECIALIZATION_MAT(glUniform,GLint,const,float,        4,2,Matrix4x2fv_ei)\nEIGEN_GL_FUNC1_SPECIALIZATION_MAT(glUniform,GLint,const,float,        3,4,Matrix3x4fv_ei)\nEIGEN_GL_FUNC1_SPECIALIZATION_MAT(glUniform,GLint,const,float,        4,3,Matrix4x3fv_ei)\n\n#endif\n\n#ifdef GL_VERSION_3_0\n\ninline void glUniform2uiv_ei (GLint loc, const unsigned int* v)  { glUniform2uiv(loc,1,v); }\ninline void glUniform3uiv_ei (GLint loc, const unsigned int* v)  { glUniform3uiv(loc,1,v); }\ninline void glUniform4uiv_ei (GLint loc, const unsigned int* v)  { glUniform4uiv(loc,1,v); }\n\nEIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform,GLint,const,unsigned int, 2,2uiv_ei)\nEIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform,GLint,const,unsigned int, 3,3uiv_ei)\nEIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform,GLint,const,unsigned int, 4,4uiv_ei)\n\n#endif\n\n#ifdef GL_ARB_gpu_shader_fp64\ninline void glUniform2dv_ei  (GLint loc, const double* v)        { glUniform2dv(loc,1,v); }\ninline void glUniform3dv_ei  (GLint loc, const double* v)        { glUniform3dv(loc,1,v); }\ninline void glUniform4dv_ei  (GLint loc, const double* v)        { glUniform4dv(loc,1,v); }\n\nEIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform,GLint,const,double,       2,2dv_ei)\nEIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform,GLint,const,double,       3,3dv_ei)\nEIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform,GLint,const,double,       4,4dv_ei)\n#endif\n\n\n//@}\n\n}\n\n#endif // EIGEN_OPENGL_MODULE\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/Polynomials",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_POLYNOMIALS_MODULE_H\n#define EIGEN_POLYNOMIALS_MODULE_H\n\n#include <Eigen/Core>\n\n#include <Eigen/src/Core/util/DisableStupidWarnings.h>\n\n#include <Eigen/Eigenvalues>\n\n// Note that EIGEN_HIDE_HEAVY_CODE has to be defined per module\n#if (defined EIGEN_EXTERN_INSTANTIATIONS) && (EIGEN_EXTERN_INSTANTIATIONS>=2)\n  #ifndef EIGEN_HIDE_HEAVY_CODE\n  #define EIGEN_HIDE_HEAVY_CODE\n  #endif\n#elif defined EIGEN_HIDE_HEAVY_CODE\n  #undef EIGEN_HIDE_HEAVY_CODE\n#endif\n\n/**\n  * \\defgroup Polynomials_Module Polynomials module\n  * \\brief This module provides a QR based polynomial solver.\n\t*\n  * To use this module, add\n  * \\code\n  * #include <unsupported/Eigen/Polynomials>\n  * \\endcode\n\t* at the start of your source file.\n  */\n\n#include \"src/Polynomials/PolynomialUtils.h\"\n#include \"src/Polynomials/Companion.h\"\n#include \"src/Polynomials/PolynomialSolver.h\"\n\n/**\n\t\\page polynomials Polynomials defines functions for dealing with polynomials\n\tand a QR based polynomial solver.\n\t\\ingroup Polynomials_Module\n\n\tThe remainder of the page documents first the functions for evaluating, computing\n\tpolynomials, computing estimates about polynomials and next the QR based polynomial\n\tsolver.\n\n\t\\section polynomialUtils convenient functions to deal with polynomials\n\t\\subsection roots_to_monicPolynomial\n\tThe function\n\t\\code\n\tvoid roots_to_monicPolynomial( const RootVector& rv, Polynomial& poly )\n\t\\endcode\n\tcomputes the coefficients \\f$ a_i \\f$ of\n\n\t\\f$ p(x) = a_0 + a_{1}x + ... + a_{n-1}x^{n-1} + x^n \\f$\n\n\twhere \\f$ p \\f$ is known through its roots i.e. \\f$ p(x) = (x-r_1)(x-r_2)...(x-r_n) \\f$.\n\n\t\\subsection poly_eval\n\tThe function\n\t\\code\n\tT poly_eval( const Polynomials& poly, const T& x )\n\t\\endcode\n\tevaluates a polynomial at a given point using stabilized H&ouml;rner method.\n\n\tThe following code: first computes the coefficients in the monomial basis of the monic polynomial that has the provided roots;\n\tthen, it evaluates the computed polynomial, using a stabilized H&ouml;rner method.\n\n\t\\include PolynomialUtils1.cpp\n  Output: \\verbinclude PolynomialUtils1.out\n\n\t\\subsection Cauchy bounds\n\tThe function\n\t\\code\n\tReal cauchy_max_bound( const Polynomial& poly )\n\t\\endcode\n\tprovides a maximum bound (the Cauchy one: \\f$C(p)\\f$) for the absolute value of a root of the given polynomial i.e.\n\t\\f$ \\forall r_i \\f$ root of \\f$ p(x) = \\sum_{k=0}^d a_k x^k \\f$,\n\t\\f$ |r_i| \\le C(p) = \\sum_{k=0}^{d} \\left | \\frac{a_k}{a_d} \\right | \\f$\n\tThe leading coefficient \\f$ p \\f$: should be non zero \\f$a_d \\neq 0\\f$.\n\n\n\tThe function\n\t\\code\n\tReal cauchy_min_bound( const Polynomial& poly )\n\t\\endcode\n\tprovides a minimum bound (the Cauchy one: \\f$c(p)\\f$) for the absolute value of a non zero root of the given polynomial i.e.\n\t\\f$ \\forall r_i \\neq 0 \\f$ root of \\f$ p(x) = \\sum_{k=0}^d a_k x^k \\f$,\n\t\\f$ |r_i| \\ge c(p) = \\left( \\sum_{k=0}^{d} \\left | \\frac{a_k}{a_0} \\right | \\right)^{-1} \\f$\n\n\n\n\n\t\\section QR polynomial solver class\n\tComputes the complex roots of a polynomial by computing the eigenvalues of the associated companion matrix with the QR algorithm.\n\t\n\tThe roots of \\f$ p(x) = a_0 + a_1 x + a_2 x^2 + a_{3} x^3 + x^4 \\f$ are the eigenvalues of\n\t\\f$\n\t\\left [\n\t\\begin{array}{cccc}\n\t0 & 0 &  0 & a_0 \\\\\n\t1 & 0 &  0 & a_1 \\\\\n\t0 & 1 &  0 & a_2 \\\\\n\t0 & 0 &  1 & a_3\n\t\\end{array} \\right ]\n\t\\f$\n\n\tHowever, the QR algorithm is not guaranteed to converge when there are several eigenvalues with same modulus.\n\n\tTherefore the current polynomial solver is guaranteed to provide a correct result only when the complex roots \\f$r_1,r_2,...,r_d\\f$ have distinct moduli i.e.\n\t\n\t\\f$ \\forall i,j \\in [1;d],~ \\| r_i \\| \\neq \\| r_j \\| \\f$.\n\n\tWith 32bit (float) floating types this problem shows up frequently.\n  However, almost always, correct accuracy is reached even in these cases for 64bit\n  (double) floating types and small polynomial degree (<20).\n\n\t\\include PolynomialSolver1.cpp\n\t\n\tIn the above example:\n\t\n\t-# a simple use of the polynomial solver is shown;\n\t-# the accuracy problem with the QR algorithm is presented: a polynomial with almost conjugate roots is provided to the solver.\n\tThose roots have almost same module therefore the QR algorithm failed to converge: the accuracy\n\tof the last root is bad;\n\t-# a simple way to circumvent the problem is shown: use doubles instead of floats.\n\n  Output: \\verbinclude PolynomialSolver1.out\n*/\n\n#include <Eigen/src/Core/util/ReenableStupidWarnings.h>\n\n#endif // EIGEN_POLYNOMIALS_MODULE_H\n/* vim: set filetype=cpp et sw=2 ts=2 ai: */\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/SVD",
    "content": "#ifndef EIGEN_SVD_MODULE_H\n#define EIGEN_SVD_MODULE_H\n\n#include <Eigen/QR>\n#include <Eigen/Householder>\n#include <Eigen/Jacobi>\n\n#include \"../../Eigen/src/Core/util/DisableStupidWarnings.h\"\n\n/** \\defgroup SVD_Module SVD module\n  *\n  *\n  *\n  * This module provides SVD decomposition for matrices (both real and complex).\n  * This decomposition is accessible via the following MatrixBase method:\n  *  - MatrixBase::jacobiSvd()\n  *\n  * \\code\n  * #include <Eigen/SVD>\n  * \\endcode\n  */\n\n#include \"../../Eigen/src/misc/Solve.h\"\n#include \"../../Eigen/src/SVD/UpperBidiagonalization.h\"\n#include \"src/SVD/SVDBase.h\"\n#include \"src/SVD/JacobiSVD.h\"\n#include \"src/SVD/BDCSVD.h\"\n#if defined(EIGEN_USE_LAPACKE) && !defined(EIGEN_USE_LAPACKE_STRICT)\n#include \"../../Eigen/src/SVD/JacobiSVD_MKL.h\"\n#endif\n\n#ifdef EIGEN2_SUPPORT\n#include \"../../Eigen/src/Eigen2Support/SVD.h\"\n#endif\n\n#include \"../../Eigen/src/Core/util/ReenableStupidWarnings.h\"\n\n#endif // EIGEN_SVD_MODULE_H\n/* vim: set filetype=cpp et sw=2 ts=2 ai: */\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/Skyline",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SKYLINE_MODULE_H\n#define EIGEN_SKYLINE_MODULE_H\n\n\n#include \"Eigen/Core\"\n\n#include \"Eigen/src/Core/util/DisableStupidWarnings.h\"\n\n#include <map>\n#include <cstdlib>\n#include <cstring>\n#include <algorithm>\n\n/**\n *  \\defgroup Skyline_Module Skyline module\n *\n *\n *\n *\n */\n\n#include \"src/Skyline/SkylineUtil.h\"\n#include \"src/Skyline/SkylineMatrixBase.h\"\n#include \"src/Skyline/SkylineStorage.h\"\n#include \"src/Skyline/SkylineMatrix.h\"\n#include \"src/Skyline/SkylineInplaceLU.h\"\n#include \"src/Skyline/SkylineProduct.h\"\n\n#include \"Eigen/src/Core/util/ReenableStupidWarnings.h\"\n\n#endif // EIGEN_SKYLINE_MODULE_H\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/SparseExtra",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <g.gael@free.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SPARSE_EXTRA_MODULE_H\n#define EIGEN_SPARSE_EXTRA_MODULE_H\n\n#include \"../../Eigen/Sparse\"\n\n#include \"../../Eigen/src/Core/util/DisableStupidWarnings.h\"\n\n#include <vector>\n#include <map>\n#include <cstdlib>\n#include <cstring>\n#include <algorithm>\n#include <fstream>\n#include <sstream>\n\n#ifdef EIGEN_GOOGLEHASH_SUPPORT\n  #include <google/dense_hash_map>\n#endif\n\n/**\n  * \\defgroup SparseExtra_Module SparseExtra module\n  *\n  * This module contains some experimental features extending the sparse module.\n  *\n  * \\code\n  * #include <Eigen/SparseExtra>\n  * \\endcode\n  */\n\n\n#include \"../../Eigen/src/misc/Solve.h\"\n#include \"../../Eigen/src/misc/SparseSolve.h\"\n\n#include \"src/SparseExtra/DynamicSparseMatrix.h\"\n#include \"src/SparseExtra/BlockOfDynamicSparseMatrix.h\"\n#include \"src/SparseExtra/RandomSetter.h\"\n\n#include \"src/SparseExtra/MarketIO.h\"\n\n#if !defined(_WIN32)\n#include <dirent.h>\n#include \"src/SparseExtra/MatrixMarketIterator.h\"\n#endif\n\n#include \"../../Eigen/src/Core/util/ReenableStupidWarnings.h\"\n\n#endif // EIGEN_SPARSE_EXTRA_MODULE_H\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/Splines",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 20010-2011 Hauke Heibel <hauke.heibel@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SPLINES_MODULE_H\n#define EIGEN_SPLINES_MODULE_H\n\nnamespace Eigen \n{\n/**\n  * \\defgroup Splines_Module Spline and spline fitting module\n  *\n  * This module provides a simple multi-dimensional spline class while\n  * offering most basic functionality to fit a spline to point sets.\n  *\n  * \\code\n  * #include <unsupported/Eigen/Splines>\n  * \\endcode\n  */\n}\n\n#include \"src/Splines/SplineFwd.h\"\n#include \"src/Splines/Spline.h\"\n#include \"src/Splines/SplineFitting.h\"\n\n#endif // EIGEN_SPLINES_MODULE_H\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/AutoDiff/AutoDiffJacobian.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_AUTODIFF_JACOBIAN_H\n#define EIGEN_AUTODIFF_JACOBIAN_H\n\nnamespace Eigen\n{\n\ntemplate<typename Functor> class AutoDiffJacobian : public Functor\n{\npublic:\n  AutoDiffJacobian() : Functor() {}\n  AutoDiffJacobian(const Functor& f) : Functor(f) {}\n\n  // forward constructors\n  template<typename T0>\n  AutoDiffJacobian(const T0& a0) : Functor(a0) {}\n  template<typename T0, typename T1>\n  AutoDiffJacobian(const T0& a0, const T1& a1) : Functor(a0, a1) {}\n  template<typename T0, typename T1, typename T2>\n  AutoDiffJacobian(const T0& a0, const T1& a1, const T2& a2) : Functor(a0, a1, a2) {}\n\n  enum {\n    InputsAtCompileTime = Functor::InputsAtCompileTime,\n    ValuesAtCompileTime = Functor::ValuesAtCompileTime\n  };\n\n  typedef typename Functor::InputType InputType;\n  typedef typename Functor::ValueType ValueType;\n  typedef typename Functor::JacobianType JacobianType;\n  typedef typename JacobianType::Scalar Scalar;\n  typedef typename JacobianType::Index Index;\n\n  typedef Matrix<Scalar,InputsAtCompileTime,1> DerivativeType;\n  typedef AutoDiffScalar<DerivativeType> ActiveScalar;\n\n\n  typedef Matrix<ActiveScalar, InputsAtCompileTime, 1> ActiveInput;\n  typedef Matrix<ActiveScalar, ValuesAtCompileTime, 1> ActiveValue;\n\n  void operator() (const InputType& x, ValueType* v, JacobianType* _jac=0) const\n  {\n    eigen_assert(v!=0);\n    if (!_jac)\n    {\n      Functor::operator()(x, v);\n      return;\n    }\n\n    JacobianType& jac = *_jac;\n\n    ActiveInput ax = x.template cast<ActiveScalar>();\n    ActiveValue av(jac.rows());\n\n    if(InputsAtCompileTime==Dynamic)\n      for (Index j=0; j<jac.rows(); j++)\n        av[j].derivatives().resize(this->inputs());\n\n    for (Index i=0; i<jac.cols(); i++)\n      ax[i].derivatives() = DerivativeType::Unit(this->inputs(),i);\n\n    Functor::operator()(ax, &av);\n\n    for (Index i=0; i<jac.rows(); i++)\n    {\n      (*v)[i] = av[i].value();\n      jac.row(i) = av[i].derivatives();\n    }\n  }\nprotected:\n\n};\n\n}\n\n#endif // EIGEN_AUTODIFF_JACOBIAN_H\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/AutoDiff/AutoDiffScalar.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_AUTODIFF_SCALAR_H\n#define EIGEN_AUTODIFF_SCALAR_H\n\nnamespace Eigen {\n\nnamespace internal {\n\ntemplate<typename A, typename B>\nstruct make_coherent_impl {\n  static void run(A&, B&) {}\n};\n\n// resize a to match b is a.size()==0, and conversely.\ntemplate<typename A, typename B>\nvoid make_coherent(const A& a, const B&b)\n{\n  make_coherent_impl<A,B>::run(a.const_cast_derived(), b.const_cast_derived());\n}\n\ntemplate<typename _DerType, bool Enable> struct auto_diff_special_op;\n\n} // end namespace internal\n\n/** \\class AutoDiffScalar\n  * \\brief A scalar type replacement with automatic differentation capability\n  *\n  * \\param _DerType the vector type used to store/represent the derivatives. The base scalar type\n  *                 as well as the number of derivatives to compute are determined from this type.\n  *                 Typical choices include, e.g., \\c Vector4f for 4 derivatives, or \\c VectorXf\n  *                 if the number of derivatives is not known at compile time, and/or, the number\n  *                 of derivatives is large.\n  *                 Note that _DerType can also be a reference (e.g., \\c VectorXf&) to wrap a\n  *                 existing vector into an AutoDiffScalar.\n  *                 Finally, _DerType can also be any Eigen compatible expression.\n  *\n  * This class represents a scalar value while tracking its respective derivatives using Eigen's expression\n  * template mechanism.\n  *\n  * It supports the following list of global math function:\n  *  - std::abs, std::sqrt, std::pow, std::exp, std::log, std::sin, std::cos,\n  *  - internal::abs, internal::sqrt, numext::pow, internal::exp, internal::log, internal::sin, internal::cos,\n  *  - internal::conj, internal::real, internal::imag, numext::abs2.\n  *\n  * AutoDiffScalar can be used as the scalar type of an Eigen::Matrix object. However,\n  * in that case, the expression template mechanism only occurs at the top Matrix level,\n  * while derivatives are computed right away.\n  *\n  */\n\ntemplate<typename _DerType>\nclass AutoDiffScalar\n  : public internal::auto_diff_special_op\n            <_DerType, !internal::is_same<typename internal::traits<typename internal::remove_all<_DerType>::type>::Scalar,\n                                        typename NumTraits<typename internal::traits<typename internal::remove_all<_DerType>::type>::Scalar>::Real>::value>\n{\n  public:\n    typedef internal::auto_diff_special_op\n            <_DerType, !internal::is_same<typename internal::traits<typename internal::remove_all<_DerType>::type>::Scalar,\n                       typename NumTraits<typename internal::traits<typename internal::remove_all<_DerType>::type>::Scalar>::Real>::value> Base;\n    typedef typename internal::remove_all<_DerType>::type DerType;\n    typedef typename internal::traits<DerType>::Scalar Scalar;\n    typedef typename NumTraits<Scalar>::Real Real;\n\n    using Base::operator+;\n    using Base::operator*;\n\n    /** Default constructor without any initialization. */\n    AutoDiffScalar() {}\n\n    /** Constructs an active scalar from its \\a value,\n        and initializes the \\a nbDer derivatives such that it corresponds to the \\a derNumber -th variable */\n    AutoDiffScalar(const Scalar& value, int nbDer, int derNumber)\n      : m_value(value), m_derivatives(DerType::Zero(nbDer))\n    {\n      m_derivatives.coeffRef(derNumber) = Scalar(1);\n    }\n\n    /** Conversion from a scalar constant to an active scalar.\n      * The derivatives are set to zero. */\n    /*explicit*/ AutoDiffScalar(const Real& value)\n      : m_value(value)\n    {\n      if(m_derivatives.size()>0)\n        m_derivatives.setZero();\n    }\n\n    /** Constructs an active scalar from its \\a value and derivatives \\a der */\n    AutoDiffScalar(const Scalar& value, const DerType& der)\n      : m_value(value), m_derivatives(der)\n    {}\n\n    template<typename OtherDerType>\n    AutoDiffScalar(const AutoDiffScalar<OtherDerType>& other)\n      : m_value(other.value()), m_derivatives(other.derivatives())\n    {}\n\n    friend  std::ostream & operator << (std::ostream & s, const AutoDiffScalar& a)\n    {\n      return s << a.value();\n    }\n\n    AutoDiffScalar(const AutoDiffScalar& other)\n      : m_value(other.value()), m_derivatives(other.derivatives())\n    {}\n\n    template<typename OtherDerType>\n    inline AutoDiffScalar& operator=(const AutoDiffScalar<OtherDerType>& other)\n    {\n      m_value = other.value();\n      m_derivatives = other.derivatives();\n      return *this;\n    }\n\n    inline AutoDiffScalar& operator=(const AutoDiffScalar& other)\n    {\n      m_value = other.value();\n      m_derivatives = other.derivatives();\n      return *this;\n    }\n\n//     inline operator const Scalar& () const { return m_value; }\n//     inline operator Scalar& () { return m_value; }\n\n    inline const Scalar& value() const { return m_value; }\n    inline Scalar& value() { return m_value; }\n\n    inline const DerType& derivatives() const { return m_derivatives; }\n    inline DerType& derivatives() { return m_derivatives; }\n\n    inline bool operator< (const Scalar& other) const  { return m_value <  other; }\n    inline bool operator<=(const Scalar& other) const  { return m_value <= other; }\n    inline bool operator> (const Scalar& other) const  { return m_value >  other; }\n    inline bool operator>=(const Scalar& other) const  { return m_value >= other; }\n    inline bool operator==(const Scalar& other) const  { return m_value == other; }\n    inline bool operator!=(const Scalar& other) const  { return m_value != other; }\n\n    friend inline bool operator< (const Scalar& a, const AutoDiffScalar& b) { return a <  b.value(); }\n    friend inline bool operator<=(const Scalar& a, const AutoDiffScalar& b) { return a <= b.value(); }\n    friend inline bool operator> (const Scalar& a, const AutoDiffScalar& b) { return a >  b.value(); }\n    friend inline bool operator>=(const Scalar& a, const AutoDiffScalar& b) { return a >= b.value(); }\n    friend inline bool operator==(const Scalar& a, const AutoDiffScalar& b) { return a == b.value(); }\n    friend inline bool operator!=(const Scalar& a, const AutoDiffScalar& b) { return a != b.value(); }\n\n    template<typename OtherDerType> inline bool operator< (const AutoDiffScalar<OtherDerType>& b) const  { return m_value <  b.value(); }\n    template<typename OtherDerType> inline bool operator<=(const AutoDiffScalar<OtherDerType>& b) const  { return m_value <= b.value(); }\n    template<typename OtherDerType> inline bool operator> (const AutoDiffScalar<OtherDerType>& b) const  { return m_value >  b.value(); }\n    template<typename OtherDerType> inline bool operator>=(const AutoDiffScalar<OtherDerType>& b) const  { return m_value >= b.value(); }\n    template<typename OtherDerType> inline bool operator==(const AutoDiffScalar<OtherDerType>& b) const  { return m_value == b.value(); }\n    template<typename OtherDerType> inline bool operator!=(const AutoDiffScalar<OtherDerType>& b) const  { return m_value != b.value(); }\n\n    inline const AutoDiffScalar<DerType&> operator+(const Scalar& other) const\n    {\n      return AutoDiffScalar<DerType&>(m_value + other, m_derivatives);\n    }\n\n    friend inline const AutoDiffScalar<DerType&> operator+(const Scalar& a, const AutoDiffScalar& b)\n    {\n      return AutoDiffScalar<DerType&>(a + b.value(), b.derivatives());\n    }\n\n//     inline const AutoDiffScalar<DerType&> operator+(const Real& other) const\n//     {\n//       return AutoDiffScalar<DerType&>(m_value + other, m_derivatives);\n//     }\n\n//     friend inline const AutoDiffScalar<DerType&> operator+(const Real& a, const AutoDiffScalar& b)\n//     {\n//       return AutoDiffScalar<DerType&>(a + b.value(), b.derivatives());\n//     }\n\n    inline AutoDiffScalar& operator+=(const Scalar& other)\n    {\n      value() += other;\n      return *this;\n    }\n\n    template<typename OtherDerType>\n    inline const AutoDiffScalar<CwiseBinaryOp<internal::scalar_sum_op<Scalar>,const DerType,const typename internal::remove_all<OtherDerType>::type> >\n    operator+(const AutoDiffScalar<OtherDerType>& other) const\n    {\n      internal::make_coherent(m_derivatives, other.derivatives());\n      return AutoDiffScalar<CwiseBinaryOp<internal::scalar_sum_op<Scalar>,const DerType,const typename internal::remove_all<OtherDerType>::type> >(\n        m_value + other.value(),\n        m_derivatives + other.derivatives());\n    }\n\n    template<typename OtherDerType>\n    inline AutoDiffScalar&\n    operator+=(const AutoDiffScalar<OtherDerType>& other)\n    {\n      (*this) = (*this) + other;\n      return *this;\n    }\n\n    inline const AutoDiffScalar<DerType&> operator-(const Scalar& b) const\n    {\n      return AutoDiffScalar<DerType&>(m_value - b, m_derivatives);\n    }\n\n    friend inline const AutoDiffScalar<CwiseUnaryOp<internal::scalar_opposite_op<Scalar>, const DerType> >\n    operator-(const Scalar& a, const AutoDiffScalar& b)\n    {\n      return AutoDiffScalar<CwiseUnaryOp<internal::scalar_opposite_op<Scalar>, const DerType> >\n            (a - b.value(), -b.derivatives());\n    }\n\n    inline AutoDiffScalar& operator-=(const Scalar& other)\n    {\n      value() -= other;\n      return *this;\n    }\n\n    template<typename OtherDerType>\n    inline const AutoDiffScalar<CwiseBinaryOp<internal::scalar_difference_op<Scalar>, const DerType,const typename internal::remove_all<OtherDerType>::type> >\n    operator-(const AutoDiffScalar<OtherDerType>& other) const\n    {\n      internal::make_coherent(m_derivatives, other.derivatives());\n      return AutoDiffScalar<CwiseBinaryOp<internal::scalar_difference_op<Scalar>, const DerType,const typename internal::remove_all<OtherDerType>::type> >(\n        m_value - other.value(),\n        m_derivatives - other.derivatives());\n    }\n\n    template<typename OtherDerType>\n    inline AutoDiffScalar&\n    operator-=(const AutoDiffScalar<OtherDerType>& other)\n    {\n      *this = *this - other;\n      return *this;\n    }\n\n    inline const AutoDiffScalar<CwiseUnaryOp<internal::scalar_opposite_op<Scalar>, const DerType> >\n    operator-() const\n    {\n      return AutoDiffScalar<CwiseUnaryOp<internal::scalar_opposite_op<Scalar>, const DerType> >(\n        -m_value,\n        -m_derivatives);\n    }\n\n    inline const AutoDiffScalar<CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const DerType> >\n    operator*(const Scalar& other) const\n    {\n      return AutoDiffScalar<CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const DerType> >(\n        m_value * other,\n        (m_derivatives * other));\n    }\n\n    friend inline const AutoDiffScalar<CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const DerType> >\n    operator*(const Scalar& other, const AutoDiffScalar& a)\n    {\n      return AutoDiffScalar<CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const DerType> >(\n        a.value() * other,\n        a.derivatives() * other);\n    }\n\n//     inline const AutoDiffScalar<typename CwiseUnaryOp<internal::scalar_multiple_op<Real>, DerType>::Type >\n//     operator*(const Real& other) const\n//     {\n//       return AutoDiffScalar<typename CwiseUnaryOp<internal::scalar_multiple_op<Real>, DerType>::Type >(\n//         m_value * other,\n//         (m_derivatives * other));\n//     }\n//\n//     friend inline const AutoDiffScalar<typename CwiseUnaryOp<internal::scalar_multiple_op<Real>, DerType>::Type >\n//     operator*(const Real& other, const AutoDiffScalar& a)\n//     {\n//       return AutoDiffScalar<typename CwiseUnaryOp<internal::scalar_multiple_op<Real>, DerType>::Type >(\n//         a.value() * other,\n//         a.derivatives() * other);\n//     }\n\n    inline const AutoDiffScalar<CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const DerType> >\n    operator/(const Scalar& other) const\n    {\n      return AutoDiffScalar<CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const DerType> >(\n        m_value / other,\n        (m_derivatives * (Scalar(1)/other)));\n    }\n\n    friend inline const AutoDiffScalar<CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const DerType> >\n    operator/(const Scalar& other, const AutoDiffScalar& a)\n    {\n      return AutoDiffScalar<CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const DerType> >(\n        other / a.value(),\n        a.derivatives() * (Scalar(-other) / (a.value()*a.value())));\n    }\n\n//     inline const AutoDiffScalar<typename CwiseUnaryOp<internal::scalar_multiple_op<Real>, DerType>::Type >\n//     operator/(const Real& other) const\n//     {\n//       return AutoDiffScalar<typename CwiseUnaryOp<internal::scalar_multiple_op<Real>, DerType>::Type >(\n//         m_value / other,\n//         (m_derivatives * (Real(1)/other)));\n//     }\n//\n//     friend inline const AutoDiffScalar<typename CwiseUnaryOp<internal::scalar_multiple_op<Real>, DerType>::Type >\n//     operator/(const Real& other, const AutoDiffScalar& a)\n//     {\n//       return AutoDiffScalar<typename CwiseUnaryOp<internal::scalar_multiple_op<Real>, DerType>::Type >(\n//         other / a.value(),\n//         a.derivatives() * (-Real(1)/other));\n//     }\n\n    template<typename OtherDerType>\n    inline const AutoDiffScalar<CwiseUnaryOp<internal::scalar_multiple_op<Scalar>,\n        const CwiseBinaryOp<internal::scalar_difference_op<Scalar>,\n          const CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const DerType>,\n          const CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const typename internal::remove_all<OtherDerType>::type > > > >\n    operator/(const AutoDiffScalar<OtherDerType>& other) const\n    {\n      internal::make_coherent(m_derivatives, other.derivatives());\n      return AutoDiffScalar<CwiseUnaryOp<internal::scalar_multiple_op<Scalar>,\n        const CwiseBinaryOp<internal::scalar_difference_op<Scalar>,\n          const CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const DerType>,\n          const CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const typename internal::remove_all<OtherDerType>::type > > > >(\n        m_value / other.value(),\n          ((m_derivatives * other.value()) - (m_value * other.derivatives()))\n        * (Scalar(1)/(other.value()*other.value())));\n    }\n\n    template<typename OtherDerType>\n    inline const AutoDiffScalar<CwiseBinaryOp<internal::scalar_sum_op<Scalar>,\n        const CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const DerType>,\n        const CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const typename internal::remove_all<OtherDerType>::type> > >\n    operator*(const AutoDiffScalar<OtherDerType>& other) const\n    {\n      internal::make_coherent(m_derivatives, other.derivatives());\n      return AutoDiffScalar<const CwiseBinaryOp<internal::scalar_sum_op<Scalar>,\n        const CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const DerType>,\n        const CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const typename internal::remove_all<OtherDerType>::type > > >(\n        m_value * other.value(),\n        (m_derivatives * other.value()) + (m_value * other.derivatives()));\n    }\n\n    inline AutoDiffScalar& operator*=(const Scalar& other)\n    {\n      *this = *this * other;\n      return *this;\n    }\n\n    template<typename OtherDerType>\n    inline AutoDiffScalar& operator*=(const AutoDiffScalar<OtherDerType>& other)\n    {\n      *this = *this * other;\n      return *this;\n    }\n\n    inline AutoDiffScalar& operator/=(const Scalar& other)\n    {\n      *this = *this / other;\n      return *this;\n    }\n\n    template<typename OtherDerType>\n    inline AutoDiffScalar& operator/=(const AutoDiffScalar<OtherDerType>& other)\n    {\n      *this = *this / other;\n      return *this;\n    }\n\n  protected:\n    Scalar m_value;\n    DerType m_derivatives;\n\n};\n\nnamespace internal {\n\ntemplate<typename _DerType>\nstruct auto_diff_special_op<_DerType, true>\n//   : auto_diff_scalar_op<_DerType, typename NumTraits<Scalar>::Real,\n//                            is_same<Scalar,typename NumTraits<Scalar>::Real>::value>\n{\n  typedef typename remove_all<_DerType>::type DerType;\n  typedef typename traits<DerType>::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real Real;\n\n//   typedef auto_diff_scalar_op<_DerType, typename NumTraits<Scalar>::Real,\n//                            is_same<Scalar,typename NumTraits<Scalar>::Real>::value> Base;\n\n//   using Base::operator+;\n//   using Base::operator+=;\n//   using Base::operator-;\n//   using Base::operator-=;\n//   using Base::operator*;\n//   using Base::operator*=;\n\n  const AutoDiffScalar<_DerType>& derived() const { return *static_cast<const AutoDiffScalar<_DerType>*>(this); }\n  AutoDiffScalar<_DerType>& derived() { return *static_cast<AutoDiffScalar<_DerType>*>(this); }\n\n\n  inline const AutoDiffScalar<DerType&> operator+(const Real& other) const\n  {\n    return AutoDiffScalar<DerType&>(derived().value() + other, derived().derivatives());\n  }\n\n  friend inline const AutoDiffScalar<DerType&> operator+(const Real& a, const AutoDiffScalar<_DerType>& b)\n  {\n    return AutoDiffScalar<DerType&>(a + b.value(), b.derivatives());\n  }\n\n  inline AutoDiffScalar<_DerType>& operator+=(const Real& other)\n  {\n    derived().value() += other;\n    return derived();\n  }\n\n\n  inline const AutoDiffScalar<typename CwiseUnaryOp<scalar_multiple2_op<Scalar,Real>, DerType>::Type >\n  operator*(const Real& other) const\n  {\n    return AutoDiffScalar<typename CwiseUnaryOp<scalar_multiple2_op<Scalar,Real>, DerType>::Type >(\n      derived().value() * other,\n      derived().derivatives() * other);\n  }\n\n  friend inline const AutoDiffScalar<typename CwiseUnaryOp<scalar_multiple2_op<Scalar,Real>, DerType>::Type >\n  operator*(const Real& other, const AutoDiffScalar<_DerType>& a)\n  {\n    return AutoDiffScalar<typename CwiseUnaryOp<scalar_multiple2_op<Scalar,Real>, DerType>::Type >(\n      a.value() * other,\n      a.derivatives() * other);\n  }\n\n  inline AutoDiffScalar<_DerType>& operator*=(const Scalar& other)\n  {\n    *this = *this * other;\n    return derived();\n  }\n};\n\ntemplate<typename _DerType>\nstruct auto_diff_special_op<_DerType, false>\n{\n  void operator*() const;\n  void operator-() const;\n  void operator+() const;\n};\n\ntemplate<typename A_Scalar, int A_Rows, int A_Cols, int A_Options, int A_MaxRows, int A_MaxCols, typename B>\nstruct make_coherent_impl<Matrix<A_Scalar, A_Rows, A_Cols, A_Options, A_MaxRows, A_MaxCols>, B> {\n  typedef Matrix<A_Scalar, A_Rows, A_Cols, A_Options, A_MaxRows, A_MaxCols> A;\n  static void run(A& a, B& b) {\n    if((A_Rows==Dynamic || A_Cols==Dynamic) && (a.size()==0))\n    {\n      a.resize(b.size());\n      a.setZero();\n    }\n  }\n};\n\ntemplate<typename A, typename B_Scalar, int B_Rows, int B_Cols, int B_Options, int B_MaxRows, int B_MaxCols>\nstruct make_coherent_impl<A, Matrix<B_Scalar, B_Rows, B_Cols, B_Options, B_MaxRows, B_MaxCols> > {\n  typedef Matrix<B_Scalar, B_Rows, B_Cols, B_Options, B_MaxRows, B_MaxCols> B;\n  static void run(A& a, B& b) {\n    if((B_Rows==Dynamic || B_Cols==Dynamic) && (b.size()==0))\n    {\n      b.resize(a.size());\n      b.setZero();\n    }\n  }\n};\n\ntemplate<typename A_Scalar, int A_Rows, int A_Cols, int A_Options, int A_MaxRows, int A_MaxCols,\n         typename B_Scalar, int B_Rows, int B_Cols, int B_Options, int B_MaxRows, int B_MaxCols>\nstruct make_coherent_impl<Matrix<A_Scalar, A_Rows, A_Cols, A_Options, A_MaxRows, A_MaxCols>,\n                             Matrix<B_Scalar, B_Rows, B_Cols, B_Options, B_MaxRows, B_MaxCols> > {\n  typedef Matrix<A_Scalar, A_Rows, A_Cols, A_Options, A_MaxRows, A_MaxCols> A;\n  typedef Matrix<B_Scalar, B_Rows, B_Cols, B_Options, B_MaxRows, B_MaxCols> B;\n  static void run(A& a, B& b) {\n    if((A_Rows==Dynamic || A_Cols==Dynamic) && (a.size()==0))\n    {\n      a.resize(b.size());\n      a.setZero();\n    }\n    else if((B_Rows==Dynamic || B_Cols==Dynamic) && (b.size()==0))\n    {\n      b.resize(a.size());\n      b.setZero();\n    }\n  }\n};\n\ntemplate<typename A_Scalar, int A_Rows, int A_Cols, int A_Options, int A_MaxRows, int A_MaxCols>\nstruct scalar_product_traits<Matrix<A_Scalar, A_Rows, A_Cols, A_Options, A_MaxRows, A_MaxCols>,A_Scalar>\n{\n  enum { Defined = 1 };\n  typedef Matrix<A_Scalar, A_Rows, A_Cols, A_Options, A_MaxRows, A_MaxCols> ReturnType;\n};\n\ntemplate<typename A_Scalar, int A_Rows, int A_Cols, int A_Options, int A_MaxRows, int A_MaxCols>\nstruct scalar_product_traits<A_Scalar, Matrix<A_Scalar, A_Rows, A_Cols, A_Options, A_MaxRows, A_MaxCols> >\n{\n  enum { Defined = 1 };\n  typedef Matrix<A_Scalar, A_Rows, A_Cols, A_Options, A_MaxRows, A_MaxCols> ReturnType;\n};\n\ntemplate<typename DerType>\nstruct scalar_product_traits<AutoDiffScalar<DerType>,typename DerType::Scalar>\n{\n  enum { Defined = 1 };\n  typedef AutoDiffScalar<DerType> ReturnType;\n};\n\ntemplate<typename DerType>\nstruct scalar_product_traits<typename DerType::Scalar,AutoDiffScalar<DerType> >\n{\n  enum { Defined = 1 };\n  typedef AutoDiffScalar<DerType> ReturnType;\n};\n\n} // end namespace internal\n\n#define EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(FUNC,CODE) \\\n  template<typename DerType> \\\n  inline const Eigen::AutoDiffScalar<Eigen::CwiseUnaryOp<Eigen::internal::scalar_multiple_op<typename Eigen::internal::traits<typename Eigen::internal::remove_all<DerType>::type>::Scalar>, const typename Eigen::internal::remove_all<DerType>::type> > \\\n  FUNC(const Eigen::AutoDiffScalar<DerType>& x) { \\\n    using namespace Eigen; \\\n    typedef typename Eigen::internal::traits<typename Eigen::internal::remove_all<DerType>::type>::Scalar Scalar; \\\n    typedef AutoDiffScalar<CwiseUnaryOp<Eigen::internal::scalar_multiple_op<Scalar>, const typename Eigen::internal::remove_all<DerType>::type> > ReturnType; \\\n    CODE; \\\n  }\n\ntemplate<typename DerType>\ninline const AutoDiffScalar<DerType>& conj(const AutoDiffScalar<DerType>& x)  { return x; }\ntemplate<typename DerType>\ninline const AutoDiffScalar<DerType>& real(const AutoDiffScalar<DerType>& x)  { return x; }\ntemplate<typename DerType>\ninline typename DerType::Scalar imag(const AutoDiffScalar<DerType>&)    { return 0.; }\ntemplate<typename DerType, typename T>\ninline AutoDiffScalar<DerType> (min)(const AutoDiffScalar<DerType>& x, const T& y)    { return (x <= y ? x : y); }\ntemplate<typename DerType, typename T>\ninline AutoDiffScalar<DerType> (max)(const AutoDiffScalar<DerType>& x, const T& y)    { return (x >= y ? x : y); }\ntemplate<typename DerType, typename T>\ninline AutoDiffScalar<DerType> (min)(const T& x, const AutoDiffScalar<DerType>& y)    { return (x < y ? x : y); }\ntemplate<typename DerType, typename T>\ninline AutoDiffScalar<DerType> (max)(const T& x, const AutoDiffScalar<DerType>& y)    { return (x > y ? x : y); }\n\nEIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(abs,\n  using std::abs;\n  return ReturnType(abs(x.value()), x.derivatives() * (x.value()<0 ? -1 : 1) );)\n\nEIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(abs2,\n  using numext::abs2;\n  return ReturnType(abs2(x.value()), x.derivatives() * (Scalar(2)*x.value()));)\n\nEIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(sqrt,\n  using std::sqrt;\n  Scalar sqrtx = sqrt(x.value());\n  return ReturnType(sqrtx,x.derivatives() * (Scalar(0.5) / sqrtx));)\n\nEIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(cos,\n  using std::cos;\n  using std::sin;\n  return ReturnType(cos(x.value()), x.derivatives() * (-sin(x.value())));)\n\nEIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(sin,\n  using std::sin;\n  using std::cos;\n  return ReturnType(sin(x.value()),x.derivatives() * cos(x.value()));)\n\nEIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(exp,\n  using std::exp;\n  Scalar expx = exp(x.value());\n  return ReturnType(expx,x.derivatives() * expx);)\n\nEIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(log,\n  using std::log;\n  return ReturnType(log(x.value()),x.derivatives() * (Scalar(1)/x.value()));)\n\ntemplate<typename DerType>\ninline const Eigen::AutoDiffScalar<Eigen::CwiseUnaryOp<Eigen::internal::scalar_multiple_op<typename Eigen::internal::traits<DerType>::Scalar>, const DerType> >\npow(const Eigen::AutoDiffScalar<DerType>& x, typename Eigen::internal::traits<DerType>::Scalar y)\n{\n  using namespace Eigen;\n  typedef typename Eigen::internal::traits<DerType>::Scalar Scalar;\n  return AutoDiffScalar<CwiseUnaryOp<Eigen::internal::scalar_multiple_op<Scalar>, const DerType> >(\n    std::pow(x.value(),y),\n    x.derivatives() * (y * std::pow(x.value(),y-1)));\n}\n\n\ntemplate<typename DerTypeA,typename DerTypeB>\ninline const AutoDiffScalar<Matrix<typename internal::traits<DerTypeA>::Scalar,Dynamic,1> >\natan2(const AutoDiffScalar<DerTypeA>& a, const AutoDiffScalar<DerTypeB>& b)\n{\n  using std::atan2;\n  using std::max;\n  typedef typename internal::traits<DerTypeA>::Scalar Scalar;\n  typedef AutoDiffScalar<Matrix<Scalar,Dynamic,1> > PlainADS;\n  PlainADS ret;\n  ret.value() = atan2(a.value(), b.value());\n  \n  Scalar tmp2 = a.value() * a.value();\n  Scalar tmp3 = b.value() * b.value();\n  Scalar tmp4 = tmp3/(tmp2+tmp3);\n  \n  if (tmp4!=0)\n    ret.derivatives() = (a.derivatives() * b.value() - a.value() * b.derivatives()) * (tmp2+tmp3);\n\n  return ret;\n}\n\nEIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(tan,\n  using std::tan;\n  using std::cos;\n  return ReturnType(tan(x.value()),x.derivatives() * (Scalar(1)/numext::abs2(cos(x.value()))));)\n\nEIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(asin,\n  using std::sqrt;\n  using std::asin;\n  return ReturnType(asin(x.value()),x.derivatives() * (Scalar(1)/sqrt(1-numext::abs2(x.value()))));)\n  \nEIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(acos,\n  using std::sqrt;\n  using std::acos;\n  return ReturnType(acos(x.value()),x.derivatives() * (Scalar(-1)/sqrt(1-numext::abs2(x.value()))));)\n\n#undef EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY\n\ntemplate<typename DerType> struct NumTraits<AutoDiffScalar<DerType> >\n  : NumTraits< typename NumTraits<typename DerType::Scalar>::Real >\n{\n  typedef AutoDiffScalar<Matrix<typename NumTraits<typename DerType::Scalar>::Real,DerType::RowsAtCompileTime,DerType::ColsAtCompileTime> > Real;\n  typedef AutoDiffScalar<DerType> NonInteger;\n  typedef AutoDiffScalar<DerType> Nested;\n  enum{\n    RequireInitialization = 1\n  };\n};\n\n}\n\n#endif // EIGEN_AUTODIFF_SCALAR_H\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/AutoDiff/AutoDiffVector.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_AUTODIFF_VECTOR_H\n#define EIGEN_AUTODIFF_VECTOR_H\n\nnamespace Eigen {\n\n/* \\class AutoDiffScalar\n  * \\brief A scalar type replacement with automatic differentation capability\n  *\n  * \\param DerType the vector type used to store/represent the derivatives (e.g. Vector3f)\n  *\n  * This class represents a scalar value while tracking its respective derivatives.\n  *\n  * It supports the following list of global math function:\n  *  - std::abs, std::sqrt, std::pow, std::exp, std::log, std::sin, std::cos,\n  *  - internal::abs, internal::sqrt, numext::pow, internal::exp, internal::log, internal::sin, internal::cos,\n  *  - internal::conj, internal::real, internal::imag, numext::abs2.\n  *\n  * AutoDiffScalar can be used as the scalar type of an Eigen::Matrix object. However,\n  * in that case, the expression template mechanism only occurs at the top Matrix level,\n  * while derivatives are computed right away.\n  *\n  */\ntemplate<typename ValueType, typename JacobianType>\nclass AutoDiffVector\n{\n  public:\n    //typedef typename internal::traits<ValueType>::Scalar Scalar;\n    typedef typename internal::traits<ValueType>::Scalar BaseScalar;\n    typedef AutoDiffScalar<Matrix<BaseScalar,JacobianType::RowsAtCompileTime,1> > ActiveScalar;\n    typedef ActiveScalar Scalar;\n    typedef AutoDiffScalar<typename JacobianType::ColXpr> CoeffType;\n    typedef typename JacobianType::Index Index;\n\n    inline AutoDiffVector() {}\n\n    inline AutoDiffVector(const ValueType& values)\n      : m_values(values)\n    {\n      m_jacobian.setZero();\n    }\n\n\n    CoeffType operator[] (Index i) { return CoeffType(m_values[i], m_jacobian.col(i)); }\n    const CoeffType operator[] (Index i) const { return CoeffType(m_values[i], m_jacobian.col(i)); }\n\n    CoeffType operator() (Index i) { return CoeffType(m_values[i], m_jacobian.col(i)); }\n    const CoeffType operator() (Index i) const { return CoeffType(m_values[i], m_jacobian.col(i)); }\n\n    CoeffType coeffRef(Index i) { return CoeffType(m_values[i], m_jacobian.col(i)); }\n    const CoeffType coeffRef(Index i) const { return CoeffType(m_values[i], m_jacobian.col(i)); }\n\n    Index size() const { return m_values.size(); }\n\n    // FIXME here we could return an expression of the sum\n    Scalar sum() const { /*std::cerr << \"sum \\n\\n\";*/ /*std::cerr << m_jacobian.rowwise().sum() << \"\\n\\n\";*/ return Scalar(m_values.sum(), m_jacobian.rowwise().sum()); }\n\n\n    inline AutoDiffVector(const ValueType& values, const JacobianType& jac)\n      : m_values(values), m_jacobian(jac)\n    {}\n\n    template<typename OtherValueType, typename OtherJacobianType>\n    inline AutoDiffVector(const AutoDiffVector<OtherValueType, OtherJacobianType>& other)\n      : m_values(other.values()), m_jacobian(other.jacobian())\n    {}\n\n    inline AutoDiffVector(const AutoDiffVector& other)\n      : m_values(other.values()), m_jacobian(other.jacobian())\n    {}\n\n    template<typename OtherValueType, typename OtherJacobianType>\n    inline AutoDiffVector& operator=(const AutoDiffVector<OtherValueType, OtherJacobianType>& other)\n    {\n      m_values = other.values();\n      m_jacobian = other.jacobian();\n      return *this;\n    }\n\n    inline AutoDiffVector& operator=(const AutoDiffVector& other)\n    {\n      m_values = other.values();\n      m_jacobian = other.jacobian();\n      return *this;\n    }\n\n    inline const ValueType& values() const { return m_values; }\n    inline ValueType& values() { return m_values; }\n\n    inline const JacobianType& jacobian() const { return m_jacobian; }\n    inline JacobianType& jacobian() { return m_jacobian; }\n\n    template<typename OtherValueType,typename OtherJacobianType>\n    inline const AutoDiffVector<\n      typename MakeCwiseBinaryOp<internal::scalar_sum_op<BaseScalar>,ValueType,OtherValueType>::Type,\n      typename MakeCwiseBinaryOp<internal::scalar_sum_op<BaseScalar>,JacobianType,OtherJacobianType>::Type >\n    operator+(const AutoDiffVector<OtherValueType,OtherJacobianType>& other) const\n    {\n      return AutoDiffVector<\n      typename MakeCwiseBinaryOp<internal::scalar_sum_op<BaseScalar>,ValueType,OtherValueType>::Type,\n      typename MakeCwiseBinaryOp<internal::scalar_sum_op<BaseScalar>,JacobianType,OtherJacobianType>::Type >(\n        m_values + other.values(),\n        m_jacobian + other.jacobian());\n    }\n\n    template<typename OtherValueType, typename OtherJacobianType>\n    inline AutoDiffVector&\n    operator+=(const AutoDiffVector<OtherValueType,OtherJacobianType>& other)\n    {\n      m_values += other.values();\n      m_jacobian += other.jacobian();\n      return *this;\n    }\n\n    template<typename OtherValueType,typename OtherJacobianType>\n    inline const AutoDiffVector<\n      typename MakeCwiseBinaryOp<internal::scalar_difference_op<Scalar>,ValueType,OtherValueType>::Type,\n      typename MakeCwiseBinaryOp<internal::scalar_difference_op<Scalar>,JacobianType,OtherJacobianType>::Type >\n    operator-(const AutoDiffVector<OtherValueType,OtherJacobianType>& other) const\n    {\n      return AutoDiffVector<\n        typename MakeCwiseBinaryOp<internal::scalar_difference_op<Scalar>,ValueType,OtherValueType>::Type,\n        typename MakeCwiseBinaryOp<internal::scalar_difference_op<Scalar>,JacobianType,OtherJacobianType>::Type >(\n          m_values - other.values(),\n          m_jacobian - other.jacobian());\n    }\n\n    template<typename OtherValueType, typename OtherJacobianType>\n    inline AutoDiffVector&\n    operator-=(const AutoDiffVector<OtherValueType,OtherJacobianType>& other)\n    {\n      m_values -= other.values();\n      m_jacobian -= other.jacobian();\n      return *this;\n    }\n\n    inline const AutoDiffVector<\n      typename MakeCwiseUnaryOp<internal::scalar_opposite_op<Scalar>, ValueType>::Type,\n      typename MakeCwiseUnaryOp<internal::scalar_opposite_op<Scalar>, JacobianType>::Type >\n    operator-() const\n    {\n      return AutoDiffVector<\n        typename MakeCwiseUnaryOp<internal::scalar_opposite_op<Scalar>, ValueType>::Type,\n        typename MakeCwiseUnaryOp<internal::scalar_opposite_op<Scalar>, JacobianType>::Type >(\n          -m_values,\n          -m_jacobian);\n    }\n\n    inline const AutoDiffVector<\n      typename MakeCwiseUnaryOp<internal::scalar_multiple_op<Scalar>, ValueType>::Type,\n      typename MakeCwiseUnaryOp<internal::scalar_multiple_op<Scalar>, JacobianType>::Type>\n    operator*(const BaseScalar& other) const\n    {\n      return AutoDiffVector<\n        typename MakeCwiseUnaryOp<internal::scalar_multiple_op<Scalar>, ValueType>::Type,\n        typename MakeCwiseUnaryOp<internal::scalar_multiple_op<Scalar>, JacobianType>::Type >(\n          m_values * other,\n          m_jacobian * other);\n    }\n\n    friend inline const AutoDiffVector<\n      typename MakeCwiseUnaryOp<internal::scalar_multiple_op<Scalar>, ValueType>::Type,\n      typename MakeCwiseUnaryOp<internal::scalar_multiple_op<Scalar>, JacobianType>::Type >\n    operator*(const Scalar& other, const AutoDiffVector& v)\n    {\n      return AutoDiffVector<\n        typename MakeCwiseUnaryOp<internal::scalar_multiple_op<Scalar>, ValueType>::Type,\n        typename MakeCwiseUnaryOp<internal::scalar_multiple_op<Scalar>, JacobianType>::Type >(\n          v.values() * other,\n          v.jacobian() * other);\n    }\n\n//     template<typename OtherValueType,typename OtherJacobianType>\n//     inline const AutoDiffVector<\n//       CwiseBinaryOp<internal::scalar_multiple_op<Scalar>, ValueType, OtherValueType>\n//       CwiseBinaryOp<internal::scalar_sum_op<Scalar>,\n//         CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, JacobianType>,\n//         CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, OtherJacobianType> > >\n//     operator*(const AutoDiffVector<OtherValueType,OtherJacobianType>& other) const\n//     {\n//       return AutoDiffVector<\n//         CwiseBinaryOp<internal::scalar_multiple_op<Scalar>, ValueType, OtherValueType>\n//         CwiseBinaryOp<internal::scalar_sum_op<Scalar>,\n//           CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, JacobianType>,\n//           CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, OtherJacobianType> > >(\n//             m_values.cwise() * other.values(),\n//             (m_jacobian * other.values()) + (m_values * other.jacobian()));\n//     }\n\n    inline AutoDiffVector& operator*=(const Scalar& other)\n    {\n      m_values *= other;\n      m_jacobian *= other;\n      return *this;\n    }\n\n    template<typename OtherValueType,typename OtherJacobianType>\n    inline AutoDiffVector& operator*=(const AutoDiffVector<OtherValueType,OtherJacobianType>& other)\n    {\n      *this = *this * other;\n      return *this;\n    }\n\n  protected:\n    ValueType m_values;\n    JacobianType m_jacobian;\n\n};\n\n}\n\n#endif // EIGEN_AUTODIFF_VECTOR_H\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/AutoDiff/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_AutoDiff_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_AutoDiff_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/unsupported/Eigen/src/AutoDiff COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/BVH/BVAlgorithms.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Ilya Baran <ibaran@mit.edu>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_BVALGORITHMS_H\n#define EIGEN_BVALGORITHMS_H\n\nnamespace Eigen { \n\nnamespace internal {\n\n#ifndef EIGEN_PARSED_BY_DOXYGEN\ntemplate<typename BVH, typename Intersector>\nbool intersect_helper(const BVH &tree, Intersector &intersector, typename BVH::Index root)\n{\n  typedef typename BVH::Index Index;\n  typedef typename BVH::VolumeIterator VolIter;\n  typedef typename BVH::ObjectIterator ObjIter;\n\n  VolIter vBegin = VolIter(), vEnd = VolIter();\n  ObjIter oBegin = ObjIter(), oEnd = ObjIter();\n\n  std::vector<Index> todo(1, root);\n\n  while(!todo.empty()) {\n    tree.getChildren(todo.back(), vBegin, vEnd, oBegin, oEnd);\n    todo.pop_back();\n\n    for(; vBegin != vEnd; ++vBegin) //go through child volumes\n      if(intersector.intersectVolume(tree.getVolume(*vBegin)))\n        todo.push_back(*vBegin);\n\n    for(; oBegin != oEnd; ++oBegin) //go through child objects\n      if(intersector.intersectObject(*oBegin))\n        return true; //intersector said to stop query\n  }\n  return false;\n}\n#endif //not EIGEN_PARSED_BY_DOXYGEN\n\ntemplate<typename Volume1, typename Object1, typename Object2, typename Intersector>\nstruct intersector_helper1\n{\n  intersector_helper1(const Object2 &inStored, Intersector &in) : stored(inStored), intersector(in) {}\n  bool intersectVolume(const Volume1 &vol) { return intersector.intersectVolumeObject(vol, stored); }\n  bool intersectObject(const Object1 &obj) { return intersector.intersectObjectObject(obj, stored); }\n  Object2 stored;\n  Intersector &intersector;\nprivate:\n  intersector_helper1& operator=(const intersector_helper1&);\n};\n\ntemplate<typename Volume2, typename Object2, typename Object1, typename Intersector>\nstruct intersector_helper2\n{\n  intersector_helper2(const Object1 &inStored, Intersector &in) : stored(inStored), intersector(in) {}\n  bool intersectVolume(const Volume2 &vol) { return intersector.intersectObjectVolume(stored, vol); }\n  bool intersectObject(const Object2 &obj) { return intersector.intersectObjectObject(stored, obj); }\n  Object1 stored;\n  Intersector &intersector;\nprivate:\n  intersector_helper2& operator=(const intersector_helper2&);\n};\n\n} // end namespace internal\n\n/**  Given a BVH, runs the query encapsulated by \\a intersector.\n  *  The Intersector type must provide the following members: \\code\n     bool intersectVolume(const BVH::Volume &volume) //returns true if volume intersects the query\n     bool intersectObject(const BVH::Object &object) //returns true if the search should terminate immediately\n  \\endcode\n  */\ntemplate<typename BVH, typename Intersector>\nvoid BVIntersect(const BVH &tree, Intersector &intersector)\n{\n  internal::intersect_helper(tree, intersector, tree.getRootIndex());\n}\n\n/**  Given two BVH's, runs the query on their Cartesian product encapsulated by \\a intersector.\n  *  The Intersector type must provide the following members: \\code\n     bool intersectVolumeVolume(const BVH1::Volume &v1, const BVH2::Volume &v2) //returns true if product of volumes intersects the query\n     bool intersectVolumeObject(const BVH1::Volume &v1, const BVH2::Object &o2) //returns true if the volume-object product intersects the query\n     bool intersectObjectVolume(const BVH1::Object &o1, const BVH2::Volume &v2) //returns true if the volume-object product intersects the query\n     bool intersectObjectObject(const BVH1::Object &o1, const BVH2::Object &o2) //returns true if the search should terminate immediately\n  \\endcode\n  */\ntemplate<typename BVH1, typename BVH2, typename Intersector>\nvoid BVIntersect(const BVH1 &tree1, const BVH2 &tree2, Intersector &intersector) //TODO: tandem descent when it makes sense\n{\n  typedef typename BVH1::Index Index1;\n  typedef typename BVH2::Index Index2;\n  typedef internal::intersector_helper1<typename BVH1::Volume, typename BVH1::Object, typename BVH2::Object, Intersector> Helper1;\n  typedef internal::intersector_helper2<typename BVH2::Volume, typename BVH2::Object, typename BVH1::Object, Intersector> Helper2;\n  typedef typename BVH1::VolumeIterator VolIter1;\n  typedef typename BVH1::ObjectIterator ObjIter1;\n  typedef typename BVH2::VolumeIterator VolIter2;\n  typedef typename BVH2::ObjectIterator ObjIter2;\n\n  VolIter1 vBegin1 = VolIter1(), vEnd1 = VolIter1();\n  ObjIter1 oBegin1 = ObjIter1(), oEnd1 = ObjIter1();\n  VolIter2 vBegin2 = VolIter2(), vEnd2 = VolIter2(), vCur2 = VolIter2();\n  ObjIter2 oBegin2 = ObjIter2(), oEnd2 = ObjIter2(), oCur2 = ObjIter2();\n\n  std::vector<std::pair<Index1, Index2> > todo(1, std::make_pair(tree1.getRootIndex(), tree2.getRootIndex()));\n\n  while(!todo.empty()) {\n    tree1.getChildren(todo.back().first, vBegin1, vEnd1, oBegin1, oEnd1);\n    tree2.getChildren(todo.back().second, vBegin2, vEnd2, oBegin2, oEnd2);\n    todo.pop_back();\n\n    for(; vBegin1 != vEnd1; ++vBegin1) { //go through child volumes of first tree\n      const typename BVH1::Volume &vol1 = tree1.getVolume(*vBegin1);\n      for(vCur2 = vBegin2; vCur2 != vEnd2; ++vCur2) { //go through child volumes of second tree\n        if(intersector.intersectVolumeVolume(vol1, tree2.getVolume(*vCur2)))\n          todo.push_back(std::make_pair(*vBegin1, *vCur2));\n      }\n\n      for(oCur2 = oBegin2; oCur2 != oEnd2; ++oCur2) {//go through child objects of second tree\n        Helper1 helper(*oCur2, intersector);\n        if(internal::intersect_helper(tree1, helper, *vBegin1))\n          return; //intersector said to stop query\n      }\n    }\n\n    for(; oBegin1 != oEnd1; ++oBegin1) { //go through child objects of first tree\n      for(vCur2 = vBegin2; vCur2 != vEnd2; ++vCur2) { //go through child volumes of second tree\n        Helper2 helper(*oBegin1, intersector);\n        if(internal::intersect_helper(tree2, helper, *vCur2))\n          return; //intersector said to stop query\n      }\n\n      for(oCur2 = oBegin2; oCur2 != oEnd2; ++oCur2) {//go through child objects of second tree\n        if(intersector.intersectObjectObject(*oBegin1, *oCur2))\n          return; //intersector said to stop query\n      }\n    }\n  }\n}\n\nnamespace internal {\n\n#ifndef EIGEN_PARSED_BY_DOXYGEN\ntemplate<typename BVH, typename Minimizer>\ntypename Minimizer::Scalar minimize_helper(const BVH &tree, Minimizer &minimizer, typename BVH::Index root, typename Minimizer::Scalar minimum)\n{\n  typedef typename Minimizer::Scalar Scalar;\n  typedef typename BVH::Index Index;\n  typedef std::pair<Scalar, Index> QueueElement; //first element is priority\n  typedef typename BVH::VolumeIterator VolIter;\n  typedef typename BVH::ObjectIterator ObjIter;\n\n  VolIter vBegin = VolIter(), vEnd = VolIter();\n  ObjIter oBegin = ObjIter(), oEnd = ObjIter();\n  std::priority_queue<QueueElement, std::vector<QueueElement>, std::greater<QueueElement> > todo; //smallest is at the top\n\n  todo.push(std::make_pair(Scalar(), root));\n\n  while(!todo.empty()) {\n    tree.getChildren(todo.top().second, vBegin, vEnd, oBegin, oEnd);\n    todo.pop();\n\n    for(; oBegin != oEnd; ++oBegin) //go through child objects\n      minimum = (std::min)(minimum, minimizer.minimumOnObject(*oBegin));\n\n    for(; vBegin != vEnd; ++vBegin) { //go through child volumes\n      Scalar val = minimizer.minimumOnVolume(tree.getVolume(*vBegin));\n      if(val < minimum)\n        todo.push(std::make_pair(val, *vBegin));\n    }\n  }\n\n  return minimum;\n}\n#endif //not EIGEN_PARSED_BY_DOXYGEN\n\n\ntemplate<typename Volume1, typename Object1, typename Object2, typename Minimizer>\nstruct minimizer_helper1\n{\n  typedef typename Minimizer::Scalar Scalar;\n  minimizer_helper1(const Object2 &inStored, Minimizer &m) : stored(inStored), minimizer(m) {}\n  Scalar minimumOnVolume(const Volume1 &vol) { return minimizer.minimumOnVolumeObject(vol, stored); }\n  Scalar minimumOnObject(const Object1 &obj) { return minimizer.minimumOnObjectObject(obj, stored); }\n  Object2 stored;\n  Minimizer &minimizer;\nprivate:\n  minimizer_helper1& operator=(const minimizer_helper1&);\n};\n\ntemplate<typename Volume2, typename Object2, typename Object1, typename Minimizer>\nstruct minimizer_helper2\n{\n  typedef typename Minimizer::Scalar Scalar;\n  minimizer_helper2(const Object1 &inStored, Minimizer &m) : stored(inStored), minimizer(m) {}\n  Scalar minimumOnVolume(const Volume2 &vol) { return minimizer.minimumOnObjectVolume(stored, vol); }\n  Scalar minimumOnObject(const Object2 &obj) { return minimizer.minimumOnObjectObject(stored, obj); }\n  Object1 stored;\n  Minimizer &minimizer;\nprivate:\n  minimizer_helper2& operator=(const minimizer_helper2&);\n};\n\n} // end namespace internal\n\n/**  Given a BVH, runs the query encapsulated by \\a minimizer.\n  *  \\returns the minimum value.\n  *  The Minimizer type must provide the following members: \\code\n     typedef Scalar //the numeric type of what is being minimized--not necessarily the Scalar type of the BVH (if it has one)\n     Scalar minimumOnVolume(const BVH::Volume &volume)\n     Scalar minimumOnObject(const BVH::Object &object)\n  \\endcode\n  */\ntemplate<typename BVH, typename Minimizer>\ntypename Minimizer::Scalar BVMinimize(const BVH &tree, Minimizer &minimizer)\n{\n  return internal::minimize_helper(tree, minimizer, tree.getRootIndex(), (std::numeric_limits<typename Minimizer::Scalar>::max)());\n}\n\n/**  Given two BVH's, runs the query on their cartesian product encapsulated by \\a minimizer.\n  *  \\returns the minimum value.\n  *  The Minimizer type must provide the following members: \\code\n     typedef Scalar //the numeric type of what is being minimized--not necessarily the Scalar type of the BVH (if it has one)\n     Scalar minimumOnVolumeVolume(const BVH1::Volume &v1, const BVH2::Volume &v2)\n     Scalar minimumOnVolumeObject(const BVH1::Volume &v1, const BVH2::Object &o2)\n     Scalar minimumOnObjectVolume(const BVH1::Object &o1, const BVH2::Volume &v2)\n     Scalar minimumOnObjectObject(const BVH1::Object &o1, const BVH2::Object &o2)\n  \\endcode\n  */\ntemplate<typename BVH1, typename BVH2, typename Minimizer>\ntypename Minimizer::Scalar BVMinimize(const BVH1 &tree1, const BVH2 &tree2, Minimizer &minimizer)\n{\n  typedef typename Minimizer::Scalar Scalar;\n  typedef typename BVH1::Index Index1;\n  typedef typename BVH2::Index Index2;\n  typedef internal::minimizer_helper1<typename BVH1::Volume, typename BVH1::Object, typename BVH2::Object, Minimizer> Helper1;\n  typedef internal::minimizer_helper2<typename BVH2::Volume, typename BVH2::Object, typename BVH1::Object, Minimizer> Helper2;\n  typedef std::pair<Scalar, std::pair<Index1, Index2> > QueueElement; //first element is priority\n  typedef typename BVH1::VolumeIterator VolIter1;\n  typedef typename BVH1::ObjectIterator ObjIter1;\n  typedef typename BVH2::VolumeIterator VolIter2;\n  typedef typename BVH2::ObjectIterator ObjIter2;\n\n  VolIter1 vBegin1 = VolIter1(), vEnd1 = VolIter1();\n  ObjIter1 oBegin1 = ObjIter1(), oEnd1 = ObjIter1();\n  VolIter2 vBegin2 = VolIter2(), vEnd2 = VolIter2(), vCur2 = VolIter2();\n  ObjIter2 oBegin2 = ObjIter2(), oEnd2 = ObjIter2(), oCur2 = ObjIter2();\n  std::priority_queue<QueueElement, std::vector<QueueElement>, std::greater<QueueElement> > todo; //smallest is at the top\n\n  Scalar minimum = (std::numeric_limits<Scalar>::max)();\n  todo.push(std::make_pair(Scalar(), std::make_pair(tree1.getRootIndex(), tree2.getRootIndex())));\n\n  while(!todo.empty()) {\n    tree1.getChildren(todo.top().second.first, vBegin1, vEnd1, oBegin1, oEnd1);\n    tree2.getChildren(todo.top().second.second, vBegin2, vEnd2, oBegin2, oEnd2);\n    todo.pop();\n\n    for(; oBegin1 != oEnd1; ++oBegin1) { //go through child objects of first tree\n      for(oCur2 = oBegin2; oCur2 != oEnd2; ++oCur2) {//go through child objects of second tree\n        minimum = (std::min)(minimum, minimizer.minimumOnObjectObject(*oBegin1, *oCur2));\n      }\n\n      for(vCur2 = vBegin2; vCur2 != vEnd2; ++vCur2) { //go through child volumes of second tree\n        Helper2 helper(*oBegin1, minimizer);\n        minimum = (std::min)(minimum, internal::minimize_helper(tree2, helper, *vCur2, minimum));\n      }\n    }\n\n    for(; vBegin1 != vEnd1; ++vBegin1) { //go through child volumes of first tree\n      const typename BVH1::Volume &vol1 = tree1.getVolume(*vBegin1);\n\n      for(oCur2 = oBegin2; oCur2 != oEnd2; ++oCur2) {//go through child objects of second tree\n        Helper1 helper(*oCur2, minimizer);\n        minimum = (std::min)(minimum, internal::minimize_helper(tree1, helper, *vBegin1, minimum));\n      }\n\n      for(vCur2 = vBegin2; vCur2 != vEnd2; ++vCur2) { //go through child volumes of second tree\n        Scalar val = minimizer.minimumOnVolumeVolume(vol1, tree2.getVolume(*vCur2));\n        if(val < minimum)\n          todo.push(std::make_pair(val, std::make_pair(*vBegin1, *vCur2)));\n      }\n    }\n  }\n  return minimum;\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_BVALGORITHMS_H\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/BVH/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_BVH_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_BVH_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/unsupported/Eigen/src/BVH COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/BVH/KdBVH.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Ilya Baran <ibaran@mit.edu>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef KDBVH_H_INCLUDED\n#define KDBVH_H_INCLUDED\n\nnamespace Eigen { \n\nnamespace internal {\n\n//internal pair class for the BVH--used instead of std::pair because of alignment\ntemplate<typename Scalar, int Dim>\nstruct vector_int_pair\n{\nEIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(Scalar, Dim)\n  typedef Matrix<Scalar, Dim, 1> VectorType;\n\n  vector_int_pair(const VectorType &v, int i) : first(v), second(i) {}\n\n  VectorType first;\n  int second;\n};\n\n//these templates help the tree initializer get the bounding boxes either from a provided\n//iterator range or using bounding_box in a unified way\ntemplate<typename ObjectList, typename VolumeList, typename BoxIter>\nstruct get_boxes_helper {\n  void operator()(const ObjectList &objects, BoxIter boxBegin, BoxIter boxEnd, VolumeList &outBoxes)\n  {\n    outBoxes.insert(outBoxes.end(), boxBegin, boxEnd);\n    eigen_assert(outBoxes.size() == objects.size());\n  }\n};\n\ntemplate<typename ObjectList, typename VolumeList>\nstruct get_boxes_helper<ObjectList, VolumeList, int> {\n  void operator()(const ObjectList &objects, int, int, VolumeList &outBoxes)\n  {\n    outBoxes.reserve(objects.size());\n    for(int i = 0; i < (int)objects.size(); ++i)\n      outBoxes.push_back(bounding_box(objects[i]));\n  }\n};\n\n} // end namespace internal\n\n\n/** \\class KdBVH\n *  \\brief A simple bounding volume hierarchy based on AlignedBox\n *\n *  \\param _Scalar The underlying scalar type of the bounding boxes\n *  \\param _Dim The dimension of the space in which the hierarchy lives\n *  \\param _Object The object type that lives in the hierarchy.  It must have value semantics.  Either bounding_box(_Object) must\n *                 be defined and return an AlignedBox<_Scalar, _Dim> or bounding boxes must be provided to the tree initializer.\n *\n *  This class provides a simple (as opposed to optimized) implementation of a bounding volume hierarchy analogous to a Kd-tree.\n *  Given a sequence of objects, it computes their bounding boxes, constructs a Kd-tree of their centers\n *  and builds a BVH with the structure of that Kd-tree.  When the elements of the tree are too expensive to be copied around,\n *  it is useful for _Object to be a pointer.\n */\ntemplate<typename _Scalar, int _Dim, typename _Object> class KdBVH\n{\npublic:\n  enum { Dim = _Dim };\n  typedef _Object Object;\n  typedef std::vector<Object, aligned_allocator<Object> > ObjectList;\n  typedef _Scalar Scalar;\n  typedef AlignedBox<Scalar, Dim> Volume;\n  typedef std::vector<Volume, aligned_allocator<Volume> > VolumeList;\n  typedef int Index;\n  typedef const int *VolumeIterator; //the iterators are just pointers into the tree's vectors\n  typedef const Object *ObjectIterator;\n\n  KdBVH() {}\n\n  /** Given an iterator range over \\a Object references, constructs the BVH.  Requires that bounding_box(Object) return a Volume. */\n  template<typename Iter> KdBVH(Iter begin, Iter end) { init(begin, end, 0, 0); } //int is recognized by init as not being an iterator type\n\n  /** Given an iterator range over \\a Object references and an iterator range over their bounding boxes, constructs the BVH */\n  template<typename OIter, typename BIter> KdBVH(OIter begin, OIter end, BIter boxBegin, BIter boxEnd) { init(begin, end, boxBegin, boxEnd); }\n\n  /** Given an iterator range over \\a Object references, constructs the BVH, overwriting whatever is in there currently.\n    * Requires that bounding_box(Object) return a Volume. */\n  template<typename Iter> void init(Iter begin, Iter end) { init(begin, end, 0, 0); }\n\n  /** Given an iterator range over \\a Object references and an iterator range over their bounding boxes,\n    * constructs the BVH, overwriting whatever is in there currently. */\n  template<typename OIter, typename BIter> void init(OIter begin, OIter end, BIter boxBegin, BIter boxEnd)\n  {\n    objects.clear();\n    boxes.clear();\n    children.clear();\n\n    objects.insert(objects.end(), begin, end);\n    int n = static_cast<int>(objects.size());\n\n    if(n < 2)\n      return; //if we have at most one object, we don't need any internal nodes\n\n    VolumeList objBoxes;\n    VIPairList objCenters;\n\n    //compute the bounding boxes depending on BIter type\n    internal::get_boxes_helper<ObjectList, VolumeList, BIter>()(objects, boxBegin, boxEnd, objBoxes);\n\n    objCenters.reserve(n);\n    boxes.reserve(n - 1);\n    children.reserve(2 * n - 2);\n\n    for(int i = 0; i < n; ++i)\n      objCenters.push_back(VIPair(objBoxes[i].center(), i));\n\n    build(objCenters, 0, n, objBoxes, 0); //the recursive part of the algorithm\n\n    ObjectList tmp(n);\n    tmp.swap(objects);\n    for(int i = 0; i < n; ++i)\n      objects[i] = tmp[objCenters[i].second];\n  }\n\n  /** \\returns the index of the root of the hierarchy */\n  inline Index getRootIndex() const { return (int)boxes.size() - 1; }\n\n  /** Given an \\a index of a node, on exit, \\a outVBegin and \\a outVEnd range over the indices of the volume children of the node\n    * and \\a outOBegin and \\a outOEnd range over the object children of the node */\n  EIGEN_STRONG_INLINE void getChildren(Index index, VolumeIterator &outVBegin, VolumeIterator &outVEnd,\n                                       ObjectIterator &outOBegin, ObjectIterator &outOEnd) const\n  { //inlining this function should open lots of optimization opportunities to the compiler\n    if(index < 0) {\n      outVBegin = outVEnd;\n      if(!objects.empty())\n        outOBegin = &(objects[0]);\n      outOEnd = outOBegin + objects.size(); //output all objects--necessary when the tree has only one object\n      return;\n    }\n\n    int numBoxes = static_cast<int>(boxes.size());\n\n    int idx = index * 2;\n    if(children[idx + 1] < numBoxes) { //second index is always bigger\n      outVBegin = &(children[idx]);\n      outVEnd = outVBegin + 2;\n      outOBegin = outOEnd;\n    }\n    else if(children[idx] >= numBoxes) { //if both children are objects\n      outVBegin = outVEnd;\n      outOBegin = &(objects[children[idx] - numBoxes]);\n      outOEnd = outOBegin + 2;\n    } else { //if the first child is a volume and the second is an object\n      outVBegin = &(children[idx]);\n      outVEnd = outVBegin + 1;\n      outOBegin = &(objects[children[idx + 1] - numBoxes]);\n      outOEnd = outOBegin + 1;\n    }\n  }\n\n  /** \\returns the bounding box of the node at \\a index */\n  inline const Volume &getVolume(Index index) const\n  {\n    return boxes[index];\n  }\n\nprivate:\n  typedef internal::vector_int_pair<Scalar, Dim> VIPair;\n  typedef std::vector<VIPair, aligned_allocator<VIPair> > VIPairList;\n  typedef Matrix<Scalar, Dim, 1> VectorType;\n  struct VectorComparator //compares vectors, or, more specificall, VIPairs along a particular dimension\n  {\n    VectorComparator(int inDim) : dim(inDim) {}\n    inline bool operator()(const VIPair &v1, const VIPair &v2) const { return v1.first[dim] < v2.first[dim]; }\n    int dim;\n  };\n\n  //Build the part of the tree between objects[from] and objects[to] (not including objects[to]).\n  //This routine partitions the objCenters in [from, to) along the dimension dim, recursively constructs\n  //the two halves, and adds their parent node.  TODO: a cache-friendlier layout\n  void build(VIPairList &objCenters, int from, int to, const VolumeList &objBoxes, int dim)\n  {\n    eigen_assert(to - from > 1);\n    if(to - from == 2) {\n      boxes.push_back(objBoxes[objCenters[from].second].merged(objBoxes[objCenters[from + 1].second]));\n      children.push_back(from + (int)objects.size() - 1); //there are objects.size() - 1 tree nodes\n      children.push_back(from + (int)objects.size());\n    }\n    else if(to - from == 3) {\n      int mid = from + 2;\n      std::nth_element(objCenters.begin() + from, objCenters.begin() + mid,\n                        objCenters.begin() + to, VectorComparator(dim)); //partition\n      build(objCenters, from, mid, objBoxes, (dim + 1) % Dim);\n      int idx1 = (int)boxes.size() - 1;\n      boxes.push_back(boxes[idx1].merged(objBoxes[objCenters[mid].second]));\n      children.push_back(idx1);\n      children.push_back(mid + (int)objects.size() - 1);\n    }\n    else {\n      int mid = from + (to - from) / 2;\n      nth_element(objCenters.begin() + from, objCenters.begin() + mid,\n                  objCenters.begin() + to, VectorComparator(dim)); //partition\n      build(objCenters, from, mid, objBoxes, (dim + 1) % Dim);\n      int idx1 = (int)boxes.size() - 1;\n      build(objCenters, mid, to, objBoxes, (dim + 1) % Dim);\n      int idx2 = (int)boxes.size() - 1;\n      boxes.push_back(boxes[idx1].merged(boxes[idx2]));\n      children.push_back(idx1);\n      children.push_back(idx2);\n    }\n  }\n\n  std::vector<int> children; //children of x are children[2x] and children[2x+1], indices bigger than boxes.size() index into objects.\n  VolumeList boxes;\n  ObjectList objects;\n};\n\n} // end namespace Eigen\n\n#endif //KDBVH_H_INCLUDED\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/CMakeLists.txt",
    "content": "ADD_SUBDIRECTORY(AutoDiff)\nADD_SUBDIRECTORY(BVH)\nADD_SUBDIRECTORY(Eigenvalues)\nADD_SUBDIRECTORY(FFT)\nADD_SUBDIRECTORY(IterativeSolvers)\nADD_SUBDIRECTORY(KroneckerProduct)\nADD_SUBDIRECTORY(LevenbergMarquardt)\nADD_SUBDIRECTORY(MatrixFunctions)\nADD_SUBDIRECTORY(MoreVectorization)\nADD_SUBDIRECTORY(NonLinearOptimization)\nADD_SUBDIRECTORY(NumericalDiff)\nADD_SUBDIRECTORY(Polynomials)\nADD_SUBDIRECTORY(Skyline)\nADD_SUBDIRECTORY(SparseExtra)\nADD_SUBDIRECTORY(Splines)\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/Eigenvalues/ArpackSelfAdjointEigenSolver.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 David Harmon <dharmon@gmail.com>\n//\n// Eigen is free software; you can redistribute it and/or\n// modify it under the terms of the GNU Lesser General Public\n// License as published by the Free Software Foundation; either\n// version 3 of the License, or (at your option) any later version.\n//\n// Alternatively, you can redistribute it and/or\n// modify it under the terms of the GNU General Public License as\n// published by the Free Software Foundation; either version 2 of\n// the License, or (at your option) any later version.\n//\n// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY\n// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public\n// License and a copy of the GNU General Public License along with\n// Eigen. If not, see <http://www.gnu.org/licenses/>.\n\n#ifndef EIGEN_ARPACKGENERALIZEDSELFADJOINTEIGENSOLVER_H\n#define EIGEN_ARPACKGENERALIZEDSELFADJOINTEIGENSOLVER_H\n\n#include <Eigen/Dense>\n\nnamespace Eigen { \n\nnamespace internal {\n  template<typename Scalar, typename RealScalar> struct arpack_wrapper;\n  template<typename MatrixSolver, typename MatrixType, typename Scalar, bool BisSPD> struct OP;\n}\n\n\n\ntemplate<typename MatrixType, typename MatrixSolver=SimplicialLLT<MatrixType>, bool BisSPD=false>\nclass ArpackGeneralizedSelfAdjointEigenSolver\n{\npublic:\n  //typedef typename MatrixSolver::MatrixType MatrixType;\n\n  /** \\brief Scalar type for matrices of type \\p MatrixType. */\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename MatrixType::Index Index;\n\n  /** \\brief Real scalar type for \\p MatrixType.\n   *\n   * This is just \\c Scalar if #Scalar is real (e.g., \\c float or\n   * \\c Scalar), and the type of the real part of \\c Scalar if #Scalar is\n   * complex.\n   */\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n\n  /** \\brief Type for vector of eigenvalues as returned by eigenvalues().\n   *\n   * This is a column vector with entries of type #RealScalar.\n   * The length of the vector is the size of \\p nbrEigenvalues.\n   */\n  typedef typename internal::plain_col_type<MatrixType, RealScalar>::type RealVectorType;\n\n  /** \\brief Default constructor.\n   *\n   * The default constructor is for cases in which the user intends to\n   * perform decompositions via compute().\n   *\n   */\n  ArpackGeneralizedSelfAdjointEigenSolver()\n   : m_eivec(),\n     m_eivalues(),\n     m_isInitialized(false),\n     m_eigenvectorsOk(false),\n     m_nbrConverged(0),\n     m_nbrIterations(0)\n  { }\n\n  /** \\brief Constructor; computes generalized eigenvalues of given matrix with respect to another matrix.\n   *\n   * \\param[in] A Self-adjoint matrix whose eigenvalues / eigenvectors will\n   *    computed. By default, the upper triangular part is used, but can be changed\n   *    through the template parameter.\n   * \\param[in] B Self-adjoint matrix for the generalized eigenvalue problem.\n   * \\param[in] nbrEigenvalues The number of eigenvalues / eigenvectors to compute.\n   *    Must be less than the size of the input matrix, or an error is returned.\n   * \\param[in] eigs_sigma String containing either \"LM\", \"SM\", \"LA\", or \"SA\", with\n   *    respective meanings to find the largest magnitude , smallest magnitude,\n   *    largest algebraic, or smallest algebraic eigenvalues. Alternatively, this\n   *    value can contain floating point value in string form, in which case the\n   *    eigenvalues closest to this value will be found.\n   * \\param[in]  options Can be #ComputeEigenvectors (default) or #EigenvaluesOnly.\n   * \\param[in] tol What tolerance to find the eigenvalues to. Default is 0, which\n   *    means machine precision.\n   *\n   * This constructor calls compute(const MatrixType&, const MatrixType&, Index, string, int, RealScalar)\n   * to compute the eigenvalues of the matrix \\p A with respect to \\p B. The eigenvectors are computed if\n   * \\p options equals #ComputeEigenvectors.\n   *\n   */\n  ArpackGeneralizedSelfAdjointEigenSolver(const MatrixType& A, const MatrixType& B,\n                                          Index nbrEigenvalues, std::string eigs_sigma=\"LM\",\n                               int options=ComputeEigenvectors, RealScalar tol=0.0)\n    : m_eivec(),\n      m_eivalues(),\n      m_isInitialized(false),\n      m_eigenvectorsOk(false),\n      m_nbrConverged(0),\n      m_nbrIterations(0)\n  {\n    compute(A, B, nbrEigenvalues, eigs_sigma, options, tol);\n  }\n\n  /** \\brief Constructor; computes eigenvalues of given matrix.\n   *\n   * \\param[in] A Self-adjoint matrix whose eigenvalues / eigenvectors will\n   *    computed. By default, the upper triangular part is used, but can be changed\n   *    through the template parameter.\n   * \\param[in] nbrEigenvalues The number of eigenvalues / eigenvectors to compute.\n   *    Must be less than the size of the input matrix, or an error is returned.\n   * \\param[in] eigs_sigma String containing either \"LM\", \"SM\", \"LA\", or \"SA\", with\n   *    respective meanings to find the largest magnitude , smallest magnitude,\n   *    largest algebraic, or smallest algebraic eigenvalues. Alternatively, this\n   *    value can contain floating point value in string form, in which case the\n   *    eigenvalues closest to this value will be found.\n   * \\param[in]  options Can be #ComputeEigenvectors (default) or #EigenvaluesOnly.\n   * \\param[in] tol What tolerance to find the eigenvalues to. Default is 0, which\n   *    means machine precision.\n   *\n   * This constructor calls compute(const MatrixType&, Index, string, int, RealScalar)\n   * to compute the eigenvalues of the matrix \\p A. The eigenvectors are computed if\n   * \\p options equals #ComputeEigenvectors.\n   *\n   */\n\n  ArpackGeneralizedSelfAdjointEigenSolver(const MatrixType& A,\n                                          Index nbrEigenvalues, std::string eigs_sigma=\"LM\",\n                               int options=ComputeEigenvectors, RealScalar tol=0.0)\n    : m_eivec(),\n      m_eivalues(),\n      m_isInitialized(false),\n      m_eigenvectorsOk(false),\n      m_nbrConverged(0),\n      m_nbrIterations(0)\n  {\n    compute(A, nbrEigenvalues, eigs_sigma, options, tol);\n  }\n\n\n  /** \\brief Computes generalized eigenvalues / eigenvectors of given matrix using the external ARPACK library.\n   *\n   * \\param[in]  A  Selfadjoint matrix whose eigendecomposition is to be computed.\n   * \\param[in]  B  Selfadjoint matrix for generalized eigenvalues.\n   * \\param[in] nbrEigenvalues The number of eigenvalues / eigenvectors to compute.\n   *    Must be less than the size of the input matrix, or an error is returned.\n   * \\param[in] eigs_sigma String containing either \"LM\", \"SM\", \"LA\", or \"SA\", with\n   *    respective meanings to find the largest magnitude , smallest magnitude,\n   *    largest algebraic, or smallest algebraic eigenvalues. Alternatively, this\n   *    value can contain floating point value in string form, in which case the\n   *    eigenvalues closest to this value will be found.\n   * \\param[in]  options Can be #ComputeEigenvectors (default) or #EigenvaluesOnly.\n   * \\param[in] tol What tolerance to find the eigenvalues to. Default is 0, which\n   *    means machine precision.\n   *\n   * \\returns    Reference to \\c *this\n   *\n   * This function computes the generalized eigenvalues of \\p A with respect to \\p B using ARPACK.  The eigenvalues()\n   * function can be used to retrieve them.  If \\p options equals #ComputeEigenvectors,\n   * then the eigenvectors are also computed and can be retrieved by\n   * calling eigenvectors().\n   *\n   */\n  ArpackGeneralizedSelfAdjointEigenSolver& compute(const MatrixType& A, const MatrixType& B,\n                                                   Index nbrEigenvalues, std::string eigs_sigma=\"LM\",\n                                        int options=ComputeEigenvectors, RealScalar tol=0.0);\n  \n  /** \\brief Computes eigenvalues / eigenvectors of given matrix using the external ARPACK library.\n   *\n   * \\param[in]  A  Selfadjoint matrix whose eigendecomposition is to be computed.\n   * \\param[in] nbrEigenvalues The number of eigenvalues / eigenvectors to compute.\n   *    Must be less than the size of the input matrix, or an error is returned.\n   * \\param[in] eigs_sigma String containing either \"LM\", \"SM\", \"LA\", or \"SA\", with\n   *    respective meanings to find the largest magnitude , smallest magnitude,\n   *    largest algebraic, or smallest algebraic eigenvalues. Alternatively, this\n   *    value can contain floating point value in string form, in which case the\n   *    eigenvalues closest to this value will be found.\n   * \\param[in]  options Can be #ComputeEigenvectors (default) or #EigenvaluesOnly.\n   * \\param[in] tol What tolerance to find the eigenvalues to. Default is 0, which\n   *    means machine precision.\n   *\n   * \\returns    Reference to \\c *this\n   *\n   * This function computes the eigenvalues of \\p A using ARPACK.  The eigenvalues()\n   * function can be used to retrieve them.  If \\p options equals #ComputeEigenvectors,\n   * then the eigenvectors are also computed and can be retrieved by\n   * calling eigenvectors().\n   *\n   */\n  ArpackGeneralizedSelfAdjointEigenSolver& compute(const MatrixType& A,\n                                                   Index nbrEigenvalues, std::string eigs_sigma=\"LM\",\n                                        int options=ComputeEigenvectors, RealScalar tol=0.0);\n\n\n  /** \\brief Returns the eigenvectors of given matrix.\n   *\n   * \\returns  A const reference to the matrix whose columns are the eigenvectors.\n   *\n   * \\pre The eigenvectors have been computed before.\n   *\n   * Column \\f$ k \\f$ of the returned matrix is an eigenvector corresponding\n   * to eigenvalue number \\f$ k \\f$ as returned by eigenvalues().  The\n   * eigenvectors are normalized to have (Euclidean) norm equal to one. If\n   * this object was used to solve the eigenproblem for the selfadjoint\n   * matrix \\f$ A \\f$, then the matrix returned by this function is the\n   * matrix \\f$ V \\f$ in the eigendecomposition \\f$ A V = D V \\f$.\n   * For the generalized eigenproblem, the matrix returned is the solution \\f$ A V = D B V \\f$\n   *\n   * Example: \\include SelfAdjointEigenSolver_eigenvectors.cpp\n   * Output: \\verbinclude SelfAdjointEigenSolver_eigenvectors.out\n   *\n   * \\sa eigenvalues()\n   */\n  const Matrix<Scalar, Dynamic, Dynamic>& eigenvectors() const\n  {\n    eigen_assert(m_isInitialized && \"ArpackGeneralizedSelfAdjointEigenSolver is not initialized.\");\n    eigen_assert(m_eigenvectorsOk && \"The eigenvectors have not been computed together with the eigenvalues.\");\n    return m_eivec;\n  }\n\n  /** \\brief Returns the eigenvalues of given matrix.\n   *\n   * \\returns A const reference to the column vector containing the eigenvalues.\n   *\n   * \\pre The eigenvalues have been computed before.\n   *\n   * The eigenvalues are repeated according to their algebraic multiplicity,\n   * so there are as many eigenvalues as rows in the matrix. The eigenvalues\n   * are sorted in increasing order.\n   *\n   * Example: \\include SelfAdjointEigenSolver_eigenvalues.cpp\n   * Output: \\verbinclude SelfAdjointEigenSolver_eigenvalues.out\n   *\n   * \\sa eigenvectors(), MatrixBase::eigenvalues()\n   */\n  const Matrix<Scalar, Dynamic, 1>& eigenvalues() const\n  {\n    eigen_assert(m_isInitialized && \"ArpackGeneralizedSelfAdjointEigenSolver is not initialized.\");\n    return m_eivalues;\n  }\n\n  /** \\brief Computes the positive-definite square root of the matrix.\n   *\n   * \\returns the positive-definite square root of the matrix\n   *\n   * \\pre The eigenvalues and eigenvectors of a positive-definite matrix\n   * have been computed before.\n   *\n   * The square root of a positive-definite matrix \\f$ A \\f$ is the\n   * positive-definite matrix whose square equals \\f$ A \\f$. This function\n   * uses the eigendecomposition \\f$ A = V D V^{-1} \\f$ to compute the\n   * square root as \\f$ A^{1/2} = V D^{1/2} V^{-1} \\f$.\n   *\n   * Example: \\include SelfAdjointEigenSolver_operatorSqrt.cpp\n   * Output: \\verbinclude SelfAdjointEigenSolver_operatorSqrt.out\n   *\n   * \\sa operatorInverseSqrt(),\n   *     \\ref MatrixFunctions_Module \"MatrixFunctions Module\"\n   */\n  Matrix<Scalar, Dynamic, Dynamic> operatorSqrt() const\n  {\n    eigen_assert(m_isInitialized && \"SelfAdjointEigenSolver is not initialized.\");\n    eigen_assert(m_eigenvectorsOk && \"The eigenvectors have not been computed together with the eigenvalues.\");\n    return m_eivec * m_eivalues.cwiseSqrt().asDiagonal() * m_eivec.adjoint();\n  }\n\n  /** \\brief Computes the inverse square root of the matrix.\n   *\n   * \\returns the inverse positive-definite square root of the matrix\n   *\n   * \\pre The eigenvalues and eigenvectors of a positive-definite matrix\n   * have been computed before.\n   *\n   * This function uses the eigendecomposition \\f$ A = V D V^{-1} \\f$ to\n   * compute the inverse square root as \\f$ V D^{-1/2} V^{-1} \\f$. This is\n   * cheaper than first computing the square root with operatorSqrt() and\n   * then its inverse with MatrixBase::inverse().\n   *\n   * Example: \\include SelfAdjointEigenSolver_operatorInverseSqrt.cpp\n   * Output: \\verbinclude SelfAdjointEigenSolver_operatorInverseSqrt.out\n   *\n   * \\sa operatorSqrt(), MatrixBase::inverse(),\n   *     \\ref MatrixFunctions_Module \"MatrixFunctions Module\"\n   */\n  Matrix<Scalar, Dynamic, Dynamic> operatorInverseSqrt() const\n  {\n    eigen_assert(m_isInitialized && \"SelfAdjointEigenSolver is not initialized.\");\n    eigen_assert(m_eigenvectorsOk && \"The eigenvectors have not been computed together with the eigenvalues.\");\n    return m_eivec * m_eivalues.cwiseInverse().cwiseSqrt().asDiagonal() * m_eivec.adjoint();\n  }\n\n  /** \\brief Reports whether previous computation was successful.\n   *\n   * \\returns \\c Success if computation was succesful, \\c NoConvergence otherwise.\n   */\n  ComputationInfo info() const\n  {\n    eigen_assert(m_isInitialized && \"ArpackGeneralizedSelfAdjointEigenSolver is not initialized.\");\n    return m_info;\n  }\n\n  size_t getNbrConvergedEigenValues() const\n  { return m_nbrConverged; }\n\n  size_t getNbrIterations() const\n  { return m_nbrIterations; }\n\nprotected:\n  Matrix<Scalar, Dynamic, Dynamic> m_eivec;\n  Matrix<Scalar, Dynamic, 1> m_eivalues;\n  ComputationInfo m_info;\n  bool m_isInitialized;\n  bool m_eigenvectorsOk;\n\n  size_t m_nbrConverged;\n  size_t m_nbrIterations;\n};\n\n\n\n\n\ntemplate<typename MatrixType, typename MatrixSolver, bool BisSPD>\nArpackGeneralizedSelfAdjointEigenSolver<MatrixType, MatrixSolver, BisSPD>&\n    ArpackGeneralizedSelfAdjointEigenSolver<MatrixType, MatrixSolver, BisSPD>\n::compute(const MatrixType& A, Index nbrEigenvalues,\n          std::string eigs_sigma, int options, RealScalar tol)\n{\n    MatrixType B(0,0);\n    compute(A, B, nbrEigenvalues, eigs_sigma, options, tol);\n    \n    return *this;\n}\n\n\ntemplate<typename MatrixType, typename MatrixSolver, bool BisSPD>\nArpackGeneralizedSelfAdjointEigenSolver<MatrixType, MatrixSolver, BisSPD>&\n    ArpackGeneralizedSelfAdjointEigenSolver<MatrixType, MatrixSolver, BisSPD>\n::compute(const MatrixType& A, const MatrixType& B, Index nbrEigenvalues,\n          std::string eigs_sigma, int options, RealScalar tol)\n{\n  eigen_assert(A.cols() == A.rows());\n  eigen_assert(B.cols() == B.rows());\n  eigen_assert(B.rows() == 0 || A.cols() == B.rows());\n  eigen_assert((options &~ (EigVecMask | GenEigMask)) == 0\n            && (options & EigVecMask) != EigVecMask\n            && \"invalid option parameter\");\n\n  bool isBempty = (B.rows() == 0) || (B.cols() == 0);\n\n  // For clarity, all parameters match their ARPACK name\n  //\n  // Always 0 on the first call\n  //\n  int ido = 0;\n\n  int n = (int)A.cols();\n\n  // User options: \"LA\", \"SA\", \"SM\", \"LM\", \"BE\"\n  //\n  char whch[3] = \"LM\";\n    \n  // Specifies the shift if iparam[6] = { 3, 4, 5 }, not used if iparam[6] = { 1, 2 }\n  //\n  RealScalar sigma = 0.0;\n\n  if (eigs_sigma.length() >= 2 && isalpha(eigs_sigma[0]) && isalpha(eigs_sigma[1]))\n  {\n      eigs_sigma[0] = toupper(eigs_sigma[0]);\n      eigs_sigma[1] = toupper(eigs_sigma[1]);\n\n      // In the following special case we're going to invert the problem, since solving\n      // for larger magnitude is much much faster\n      // i.e., if 'SM' is specified, we're going to really use 'LM', the default\n      //\n      if (eigs_sigma.substr(0,2) != \"SM\")\n      {\n          whch[0] = eigs_sigma[0];\n          whch[1] = eigs_sigma[1];\n      }\n  }\n  else\n  {\n      eigen_assert(false && \"Specifying clustered eigenvalues is not yet supported!\");\n\n      // If it's not scalar values, then the user may be explicitly\n      // specifying the sigma value to cluster the evs around\n      //\n      sigma = atof(eigs_sigma.c_str());\n\n      // If atof fails, it returns 0.0, which is a fine default\n      //\n  }\n\n  // \"I\" means normal eigenvalue problem, \"G\" means generalized\n  //\n  char bmat[2] = \"I\";\n  if (eigs_sigma.substr(0,2) == \"SM\" || !(isalpha(eigs_sigma[0]) && isalpha(eigs_sigma[1])) || (!isBempty && !BisSPD))\n      bmat[0] = 'G';\n\n  // Now we determine the mode to use\n  //\n  int mode = (bmat[0] == 'G') + 1;\n  if (eigs_sigma.substr(0,2) == \"SM\" || !(isalpha(eigs_sigma[0]) && isalpha(eigs_sigma[1])))\n  {\n      // We're going to use shift-and-invert mode, and basically find\n      // the largest eigenvalues of the inverse operator\n      //\n      mode = 3;\n  }\n\n  // The user-specified number of eigenvalues/vectors to compute\n  //\n  int nev = (int)nbrEigenvalues;\n\n  // Allocate space for ARPACK to store the residual\n  //\n  Scalar *resid = new Scalar[n];\n\n  // Number of Lanczos vectors, must satisfy nev < ncv <= n\n  // Note that this indicates that nev != n, and we cannot compute\n  // all eigenvalues of a mtrix\n  //\n  int ncv = std::min(std::max(2*nev, 20), n);\n\n  // The working n x ncv matrix, also store the final eigenvectors (if computed)\n  //\n  Scalar *v = new Scalar[n*ncv];\n  int ldv = n;\n\n  // Working space\n  //\n  Scalar *workd = new Scalar[3*n];\n  int lworkl = ncv*ncv+8*ncv; // Must be at least this length\n  Scalar *workl = new Scalar[lworkl];\n\n  int *iparam= new int[11];\n  iparam[0] = 1; // 1 means we let ARPACK perform the shifts, 0 means we'd have to do it\n  iparam[2] = std::max(300, (int)std::ceil(2*n/std::max(ncv,1)));\n  iparam[6] = mode; // The mode, 1 is standard ev problem, 2 for generalized ev, 3 for shift-and-invert\n\n  // Used during reverse communicate to notify where arrays start\n  //\n  int *ipntr = new int[11]; \n\n  // Error codes are returned in here, initial value of 0 indicates a random initial\n  // residual vector is used, any other values means resid contains the initial residual\n  // vector, possibly from a previous run\n  //\n  int info = 0;\n\n  Scalar scale = 1.0;\n  //if (!isBempty)\n  //{\n  //Scalar scale = B.norm() / std::sqrt(n);\n  //scale = std::pow(2, std::floor(std::log(scale+1)));\n  ////M /= scale;\n  //for (size_t i=0; i<(size_t)B.outerSize(); i++)\n  //    for (typename MatrixType::InnerIterator it(B, i); it; ++it)\n  //        it.valueRef() /= scale;\n  //}\n\n  MatrixSolver OP;\n  if (mode == 1 || mode == 2)\n  {\n      if (!isBempty)\n          OP.compute(B);\n  }\n  else if (mode == 3)\n  {\n      if (sigma == 0.0)\n      {\n          OP.compute(A);\n      }\n      else\n      {\n          // Note: We will never enter here because sigma must be 0.0\n          //\n          if (isBempty)\n          {\n            MatrixType AminusSigmaB(A);\n            for (Index i=0; i<A.rows(); ++i)\n                AminusSigmaB.coeffRef(i,i) -= sigma;\n            \n            OP.compute(AminusSigmaB);\n          }\n          else\n          {\n              MatrixType AminusSigmaB = A - sigma * B;\n              OP.compute(AminusSigmaB);\n          }\n      }\n  }\n \n  if (!(mode == 1 && isBempty) && !(mode == 2 && isBempty) && OP.info() != Success)\n      std::cout << \"Error factoring matrix\" << std::endl;\n\n  do\n  {\n    internal::arpack_wrapper<Scalar, RealScalar>::saupd(&ido, bmat, &n, whch, &nev, &tol, resid, \n                                                        &ncv, v, &ldv, iparam, ipntr, workd, workl,\n                                                        &lworkl, &info);\n\n    if (ido == -1 || ido == 1)\n    {\n      Scalar *in  = workd + ipntr[0] - 1;\n      Scalar *out = workd + ipntr[1] - 1;\n\n      if (ido == 1 && mode != 2)\n      {\n          Scalar *out2 = workd + ipntr[2] - 1;\n          if (isBempty || mode == 1)\n            Matrix<Scalar, Dynamic, 1>::Map(out2, n) = Matrix<Scalar, Dynamic, 1>::Map(in, n);\n          else\n            Matrix<Scalar, Dynamic, 1>::Map(out2, n) = B * Matrix<Scalar, Dynamic, 1>::Map(in, n);\n          \n          in = workd + ipntr[2] - 1;\n      }\n\n      if (mode == 1)\n      {\n        if (isBempty)\n        {\n          // OP = A\n          //\n          Matrix<Scalar, Dynamic, 1>::Map(out, n) = A * Matrix<Scalar, Dynamic, 1>::Map(in, n);\n        }\n        else\n        {\n          // OP = L^{-1}AL^{-T}\n          //\n          internal::OP<MatrixSolver, MatrixType, Scalar, BisSPD>::applyOP(OP, A, n, in, out);\n        }\n      }\n      else if (mode == 2)\n      {\n        if (ido == 1)\n          Matrix<Scalar, Dynamic, 1>::Map(in, n)  = A * Matrix<Scalar, Dynamic, 1>::Map(in, n);\n        \n        // OP = B^{-1} A\n        //\n        Matrix<Scalar, Dynamic, 1>::Map(out, n) = OP.solve(Matrix<Scalar, Dynamic, 1>::Map(in, n));\n      }\n      else if (mode == 3)\n      {\n        // OP = (A-\\sigmaB)B (\\sigma could be 0, and B could be I)\n        // The B * in is already computed and stored at in if ido == 1\n        //\n        if (ido == 1 || isBempty)\n          Matrix<Scalar, Dynamic, 1>::Map(out, n) = OP.solve(Matrix<Scalar, Dynamic, 1>::Map(in, n));\n        else\n          Matrix<Scalar, Dynamic, 1>::Map(out, n) = OP.solve(B * Matrix<Scalar, Dynamic, 1>::Map(in, n));\n      }\n    }\n    else if (ido == 2)\n    {\n      Scalar *in  = workd + ipntr[0] - 1;\n      Scalar *out = workd + ipntr[1] - 1;\n\n      if (isBempty || mode == 1)\n        Matrix<Scalar, Dynamic, 1>::Map(out, n) = Matrix<Scalar, Dynamic, 1>::Map(in, n);\n      else\n        Matrix<Scalar, Dynamic, 1>::Map(out, n) = B * Matrix<Scalar, Dynamic, 1>::Map(in, n);\n    }\n  } while (ido != 99);\n\n  if (info == 1)\n    m_info = NoConvergence;\n  else if (info == 3)\n    m_info = NumericalIssue;\n  else if (info < 0)\n    m_info = InvalidInput;\n  else if (info != 0)\n    eigen_assert(false && \"Unknown ARPACK return value!\");\n  else\n  {\n    // Do we compute eigenvectors or not?\n    //\n    int rvec = (options & ComputeEigenvectors) == ComputeEigenvectors;\n\n    // \"A\" means \"All\", use \"S\" to choose specific eigenvalues (not yet supported in ARPACK))\n    //\n    char howmny[2] = \"A\"; \n\n    // if howmny == \"S\", specifies the eigenvalues to compute (not implemented in ARPACK)\n    //\n    int *select = new int[ncv];\n\n    // Final eigenvalues\n    //\n    m_eivalues.resize(nev, 1);\n\n    internal::arpack_wrapper<Scalar, RealScalar>::seupd(&rvec, howmny, select, m_eivalues.data(), v, &ldv,\n                                                        &sigma, bmat, &n, whch, &nev, &tol, resid, &ncv,\n                                                        v, &ldv, iparam, ipntr, workd, workl, &lworkl, &info);\n\n    if (info == -14)\n      m_info = NoConvergence;\n    else if (info != 0)\n      m_info = InvalidInput;\n    else\n    {\n      if (rvec)\n      {\n        m_eivec.resize(A.rows(), nev);\n        for (int i=0; i<nev; i++)\n          for (int j=0; j<n; j++)\n            m_eivec(j,i) = v[i*n+j] / scale;\n      \n        if (mode == 1 && !isBempty && BisSPD)\n          internal::OP<MatrixSolver, MatrixType, Scalar, BisSPD>::project(OP, n, nev, m_eivec.data());\n\n        m_eigenvectorsOk = true;\n      }\n\n      m_nbrIterations = iparam[2];\n      m_nbrConverged  = iparam[4];\n\n      m_info = Success;\n    }\n\n    delete select;\n  }\n\n  delete v;\n  delete iparam;\n  delete ipntr;\n  delete workd;\n  delete workl;\n  delete resid;\n\n  m_isInitialized = true;\n\n  return *this;\n}\n\n\n// Single precision\n//\nextern \"C\" void ssaupd_(int *ido, char *bmat, int *n, char *which,\n    int *nev, float *tol, float *resid, int *ncv,\n    float *v, int *ldv, int *iparam, int *ipntr,\n    float *workd, float *workl, int *lworkl,\n    int *info);\n\nextern \"C\" void sseupd_(int *rvec, char *All, int *select, float *d,\n    float *z, int *ldz, float *sigma, \n    char *bmat, int *n, char *which, int *nev,\n    float *tol, float *resid, int *ncv, float *v,\n    int *ldv, int *iparam, int *ipntr, float *workd,\n    float *workl, int *lworkl, int *ierr);\n\n// Double precision\n//\nextern \"C\" void dsaupd_(int *ido, char *bmat, int *n, char *which,\n    int *nev, double *tol, double *resid, int *ncv,\n    double *v, int *ldv, int *iparam, int *ipntr,\n    double *workd, double *workl, int *lworkl,\n    int *info);\n\nextern \"C\" void dseupd_(int *rvec, char *All, int *select, double *d,\n    double *z, int *ldz, double *sigma, \n    char *bmat, int *n, char *which, int *nev,\n    double *tol, double *resid, int *ncv, double *v,\n    int *ldv, int *iparam, int *ipntr, double *workd,\n    double *workl, int *lworkl, int *ierr);\n\n\nnamespace internal {\n\ntemplate<typename Scalar, typename RealScalar> struct arpack_wrapper\n{\n  static inline void saupd(int *ido, char *bmat, int *n, char *which,\n      int *nev, RealScalar *tol, Scalar *resid, int *ncv,\n      Scalar *v, int *ldv, int *iparam, int *ipntr,\n      Scalar *workd, Scalar *workl, int *lworkl, int *info)\n  { \n    EIGEN_STATIC_ASSERT(!NumTraits<Scalar>::IsComplex, NUMERIC_TYPE_MUST_BE_REAL)\n  }\n\n  static inline void seupd(int *rvec, char *All, int *select, Scalar *d,\n      Scalar *z, int *ldz, RealScalar *sigma,\n      char *bmat, int *n, char *which, int *nev,\n      RealScalar *tol, Scalar *resid, int *ncv, Scalar *v,\n      int *ldv, int *iparam, int *ipntr, Scalar *workd,\n      Scalar *workl, int *lworkl, int *ierr)\n  {\n    EIGEN_STATIC_ASSERT(!NumTraits<Scalar>::IsComplex, NUMERIC_TYPE_MUST_BE_REAL)\n  }\n};\n\ntemplate <> struct arpack_wrapper<float, float>\n{\n  static inline void saupd(int *ido, char *bmat, int *n, char *which,\n      int *nev, float *tol, float *resid, int *ncv,\n      float *v, int *ldv, int *iparam, int *ipntr,\n      float *workd, float *workl, int *lworkl, int *info)\n  {\n    ssaupd_(ido, bmat, n, which, nev, tol, resid, ncv, v, ldv, iparam, ipntr, workd, workl, lworkl, info);\n  }\n\n  static inline void seupd(int *rvec, char *All, int *select, float *d,\n      float *z, int *ldz, float *sigma,\n      char *bmat, int *n, char *which, int *nev,\n      float *tol, float *resid, int *ncv, float *v,\n      int *ldv, int *iparam, int *ipntr, float *workd,\n      float *workl, int *lworkl, int *ierr)\n  {\n    sseupd_(rvec, All, select, d, z, ldz, sigma, bmat, n, which, nev, tol, resid, ncv, v, ldv, iparam, ipntr,\n        workd, workl, lworkl, ierr);\n  }\n};\n\ntemplate <> struct arpack_wrapper<double, double>\n{\n  static inline void saupd(int *ido, char *bmat, int *n, char *which,\n      int *nev, double *tol, double *resid, int *ncv,\n      double *v, int *ldv, int *iparam, int *ipntr,\n      double *workd, double *workl, int *lworkl, int *info)\n  {\n    dsaupd_(ido, bmat, n, which, nev, tol, resid, ncv, v, ldv, iparam, ipntr, workd, workl, lworkl, info);\n  }\n\n  static inline void seupd(int *rvec, char *All, int *select, double *d,\n      double *z, int *ldz, double *sigma,\n      char *bmat, int *n, char *which, int *nev,\n      double *tol, double *resid, int *ncv, double *v,\n      int *ldv, int *iparam, int *ipntr, double *workd,\n      double *workl, int *lworkl, int *ierr)\n  {\n    dseupd_(rvec, All, select, d, v, ldv, sigma, bmat, n, which, nev, tol, resid, ncv, v, ldv, iparam, ipntr,\n        workd, workl, lworkl, ierr);\n  }\n};\n\n\ntemplate<typename MatrixSolver, typename MatrixType, typename Scalar, bool BisSPD>\nstruct OP\n{\n    static inline void applyOP(MatrixSolver &OP, const MatrixType &A, int n, Scalar *in, Scalar *out);\n    static inline void project(MatrixSolver &OP, int n, int k, Scalar *vecs);\n};\n\ntemplate<typename MatrixSolver, typename MatrixType, typename Scalar>\nstruct OP<MatrixSolver, MatrixType, Scalar, true>\n{\n  static inline void applyOP(MatrixSolver &OP, const MatrixType &A, int n, Scalar *in, Scalar *out)\n{\n    // OP = L^{-1} A L^{-T}  (B = LL^T)\n    //\n    // First solve L^T out = in\n    //\n    Matrix<Scalar, Dynamic, 1>::Map(out, n) = OP.matrixU().solve(Matrix<Scalar, Dynamic, 1>::Map(in, n));\n    Matrix<Scalar, Dynamic, 1>::Map(out, n) = OP.permutationPinv() * Matrix<Scalar, Dynamic, 1>::Map(out, n);\n\n    // Then compute out = A out\n    //\n    Matrix<Scalar, Dynamic, 1>::Map(out, n) = A * Matrix<Scalar, Dynamic, 1>::Map(out, n);\n\n    // Then solve L out = out\n    //\n    Matrix<Scalar, Dynamic, 1>::Map(out, n) = OP.permutationP() * Matrix<Scalar, Dynamic, 1>::Map(out, n);\n    Matrix<Scalar, Dynamic, 1>::Map(out, n) = OP.matrixL().solve(Matrix<Scalar, Dynamic, 1>::Map(out, n));\n}\n\n  static inline void project(MatrixSolver &OP, int n, int k, Scalar *vecs)\n{\n    // Solve L^T out = in\n    //\n    Matrix<Scalar, Dynamic, Dynamic>::Map(vecs, n, k) = OP.matrixU().solve(Matrix<Scalar, Dynamic, Dynamic>::Map(vecs, n, k));\n    Matrix<Scalar, Dynamic, Dynamic>::Map(vecs, n, k) = OP.permutationPinv() * Matrix<Scalar, Dynamic, Dynamic>::Map(vecs, n, k);\n}\n\n};\n\ntemplate<typename MatrixSolver, typename MatrixType, typename Scalar>\nstruct OP<MatrixSolver, MatrixType, Scalar, false>\n{\n  static inline void applyOP(MatrixSolver &OP, const MatrixType &A, int n, Scalar *in, Scalar *out)\n{\n    eigen_assert(false && \"Should never be in here...\");\n}\n\n  static inline void project(MatrixSolver &OP, int n, int k, Scalar *vecs)\n{\n    eigen_assert(false && \"Should never be in here...\");\n}\n\n};\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_ARPACKSELFADJOINTEIGENSOLVER_H\n\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/Eigenvalues/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_Eigenvalues_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_Eigenvalues_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/unsupported/Eigen/src/Eigenvalues COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/FFT/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_FFT_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_FFT_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/unsupported/Eigen/src/FFT COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/FFT/ei_fftw_impl.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra. \n//\n// Copyright (C) 2009 Mark Borgerding mark a borgerding net\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\nnamespace Eigen { \n\nnamespace internal {\n\n  // FFTW uses non-const arguments\n  // so we must use ugly const_cast calls for all the args it uses\n  //\n  // This should be safe as long as \n  // 1. we use FFTW_ESTIMATE for all our planning\n  //       see the FFTW docs section 4.3.2 \"Planner Flags\"\n  // 2. fftw_complex is compatible with std::complex\n  //    This assumes std::complex<T> layout is array of size 2 with real,imag\n  template <typename T> \n  inline \n  T * fftw_cast(const T* p)\n  { \n      return const_cast<T*>( p); \n  }\n\n  inline \n  fftw_complex * fftw_cast( const std::complex<double> * p)\n  {\n      return const_cast<fftw_complex*>( reinterpret_cast<const fftw_complex*>(p) ); \n  }\n\n  inline \n  fftwf_complex * fftw_cast( const std::complex<float> * p)\n  { \n      return const_cast<fftwf_complex*>( reinterpret_cast<const fftwf_complex*>(p) ); \n  }\n\n  inline \n  fftwl_complex * fftw_cast( const std::complex<long double> * p)\n  { \n      return const_cast<fftwl_complex*>( reinterpret_cast<const fftwl_complex*>(p) ); \n  }\n\n  template <typename T> \n  struct fftw_plan {};\n\n  template <> \n  struct fftw_plan<float>\n  {\n      typedef float scalar_type;\n      typedef fftwf_complex complex_type;\n      fftwf_plan m_plan;\n      fftw_plan() :m_plan(NULL) {}\n      ~fftw_plan() {if (m_plan) fftwf_destroy_plan(m_plan);}\n\n      inline\n      void fwd(complex_type * dst,complex_type * src,int nfft) {\n          if (m_plan==NULL) m_plan = fftwf_plan_dft_1d(nfft,src,dst, FFTW_FORWARD, FFTW_ESTIMATE|FFTW_PRESERVE_INPUT);\n          fftwf_execute_dft( m_plan, src,dst);\n      }\n      inline\n      void inv(complex_type * dst,complex_type * src,int nfft) {\n          if (m_plan==NULL) m_plan = fftwf_plan_dft_1d(nfft,src,dst, FFTW_BACKWARD , FFTW_ESTIMATE|FFTW_PRESERVE_INPUT);\n          fftwf_execute_dft( m_plan, src,dst);\n      }\n      inline\n      void fwd(complex_type * dst,scalar_type * src,int nfft) {\n          if (m_plan==NULL) m_plan = fftwf_plan_dft_r2c_1d(nfft,src,dst,FFTW_ESTIMATE|FFTW_PRESERVE_INPUT);\n          fftwf_execute_dft_r2c( m_plan,src,dst);\n      }\n      inline\n      void inv(scalar_type * dst,complex_type * src,int nfft) {\n          if (m_plan==NULL)\n              m_plan = fftwf_plan_dft_c2r_1d(nfft,src,dst,FFTW_ESTIMATE|FFTW_PRESERVE_INPUT);\n          fftwf_execute_dft_c2r( m_plan, src,dst);\n      }\n\n      inline \n      void fwd2( complex_type * dst,complex_type * src,int n0,int n1) {\n          if (m_plan==NULL) m_plan = fftwf_plan_dft_2d(n0,n1,src,dst,FFTW_FORWARD,FFTW_ESTIMATE|FFTW_PRESERVE_INPUT);\n          fftwf_execute_dft( m_plan, src,dst);\n      }\n      inline \n      void inv2( complex_type * dst,complex_type * src,int n0,int n1) {\n          if (m_plan==NULL) m_plan = fftwf_plan_dft_2d(n0,n1,src,dst,FFTW_BACKWARD,FFTW_ESTIMATE|FFTW_PRESERVE_INPUT);\n          fftwf_execute_dft( m_plan, src,dst);\n      }\n\n  };\n  template <> \n  struct fftw_plan<double>\n  {\n      typedef double scalar_type;\n      typedef fftw_complex complex_type;\n      ::fftw_plan m_plan;\n      fftw_plan() :m_plan(NULL) {}\n      ~fftw_plan() {if (m_plan) fftw_destroy_plan(m_plan);}\n\n      inline\n      void fwd(complex_type * dst,complex_type * src,int nfft) {\n          if (m_plan==NULL) m_plan = fftw_plan_dft_1d(nfft,src,dst, FFTW_FORWARD, FFTW_ESTIMATE|FFTW_PRESERVE_INPUT);\n          fftw_execute_dft( m_plan, src,dst);\n      }\n      inline\n      void inv(complex_type * dst,complex_type * src,int nfft) {\n          if (m_plan==NULL) m_plan = fftw_plan_dft_1d(nfft,src,dst, FFTW_BACKWARD , FFTW_ESTIMATE|FFTW_PRESERVE_INPUT);\n          fftw_execute_dft( m_plan, src,dst);\n      }\n      inline\n      void fwd(complex_type * dst,scalar_type * src,int nfft) {\n          if (m_plan==NULL) m_plan = fftw_plan_dft_r2c_1d(nfft,src,dst,FFTW_ESTIMATE|FFTW_PRESERVE_INPUT);\n          fftw_execute_dft_r2c( m_plan,src,dst);\n      }\n      inline\n      void inv(scalar_type * dst,complex_type * src,int nfft) {\n          if (m_plan==NULL)\n              m_plan = fftw_plan_dft_c2r_1d(nfft,src,dst,FFTW_ESTIMATE|FFTW_PRESERVE_INPUT);\n          fftw_execute_dft_c2r( m_plan, src,dst);\n      }\n      inline \n      void fwd2( complex_type * dst,complex_type * src,int n0,int n1) {\n          if (m_plan==NULL) m_plan = fftw_plan_dft_2d(n0,n1,src,dst,FFTW_FORWARD,FFTW_ESTIMATE|FFTW_PRESERVE_INPUT);\n          fftw_execute_dft( m_plan, src,dst);\n      }\n      inline \n      void inv2( complex_type * dst,complex_type * src,int n0,int n1) {\n          if (m_plan==NULL) m_plan = fftw_plan_dft_2d(n0,n1,src,dst,FFTW_BACKWARD,FFTW_ESTIMATE|FFTW_PRESERVE_INPUT);\n          fftw_execute_dft( m_plan, src,dst);\n      }\n  };\n  template <> \n  struct fftw_plan<long double>\n  {\n      typedef long double scalar_type;\n      typedef fftwl_complex complex_type;\n      fftwl_plan m_plan;\n      fftw_plan() :m_plan(NULL) {}\n      ~fftw_plan() {if (m_plan) fftwl_destroy_plan(m_plan);}\n\n      inline\n      void fwd(complex_type * dst,complex_type * src,int nfft) {\n          if (m_plan==NULL) m_plan = fftwl_plan_dft_1d(nfft,src,dst, FFTW_FORWARD, FFTW_ESTIMATE|FFTW_PRESERVE_INPUT);\n          fftwl_execute_dft( m_plan, src,dst);\n      }\n      inline\n      void inv(complex_type * dst,complex_type * src,int nfft) {\n          if (m_plan==NULL) m_plan = fftwl_plan_dft_1d(nfft,src,dst, FFTW_BACKWARD , FFTW_ESTIMATE|FFTW_PRESERVE_INPUT);\n          fftwl_execute_dft( m_plan, src,dst);\n      }\n      inline\n      void fwd(complex_type * dst,scalar_type * src,int nfft) {\n          if (m_plan==NULL) m_plan = fftwl_plan_dft_r2c_1d(nfft,src,dst,FFTW_ESTIMATE|FFTW_PRESERVE_INPUT);\n          fftwl_execute_dft_r2c( m_plan,src,dst);\n      }\n      inline\n      void inv(scalar_type * dst,complex_type * src,int nfft) {\n          if (m_plan==NULL)\n              m_plan = fftwl_plan_dft_c2r_1d(nfft,src,dst,FFTW_ESTIMATE|FFTW_PRESERVE_INPUT);\n          fftwl_execute_dft_c2r( m_plan, src,dst);\n      }\n      inline \n      void fwd2( complex_type * dst,complex_type * src,int n0,int n1) {\n          if (m_plan==NULL) m_plan = fftwl_plan_dft_2d(n0,n1,src,dst,FFTW_FORWARD,FFTW_ESTIMATE|FFTW_PRESERVE_INPUT);\n          fftwl_execute_dft( m_plan, src,dst);\n      }\n      inline \n      void inv2( complex_type * dst,complex_type * src,int n0,int n1) {\n          if (m_plan==NULL) m_plan = fftwl_plan_dft_2d(n0,n1,src,dst,FFTW_BACKWARD,FFTW_ESTIMATE|FFTW_PRESERVE_INPUT);\n          fftwl_execute_dft( m_plan, src,dst);\n      }\n  };\n\n  template <typename _Scalar>\n  struct fftw_impl\n  {\n      typedef _Scalar Scalar;\n      typedef std::complex<Scalar> Complex;\n\n      inline\n      void clear() \n      {\n        m_plans.clear();\n      }\n\n      // complex-to-complex forward FFT\n      inline\n      void fwd( Complex * dst,const Complex *src,int nfft)\n      {\n        get_plan(nfft,false,dst,src).fwd(fftw_cast(dst), fftw_cast(src),nfft );\n      }\n\n      // real-to-complex forward FFT\n      inline\n      void fwd( Complex * dst,const Scalar * src,int nfft) \n      {\n          get_plan(nfft,false,dst,src).fwd(fftw_cast(dst), fftw_cast(src) ,nfft);\n      }\n\n      // 2-d complex-to-complex\n      inline\n      void fwd2(Complex * dst, const Complex * src, int n0,int n1)\n      {\n          get_plan(n0,n1,false,dst,src).fwd2(fftw_cast(dst), fftw_cast(src) ,n0,n1);\n      }\n\n      // inverse complex-to-complex\n      inline\n      void inv(Complex * dst,const Complex  *src,int nfft)\n      {\n        get_plan(nfft,true,dst,src).inv(fftw_cast(dst), fftw_cast(src),nfft );\n      }\n\n      // half-complex to scalar\n      inline\n      void inv( Scalar * dst,const Complex * src,int nfft) \n      {\n        get_plan(nfft,true,dst,src).inv(fftw_cast(dst), fftw_cast(src),nfft );\n      }\n\n      // 2-d complex-to-complex\n      inline\n      void inv2(Complex * dst, const Complex * src, int n0,int n1)\n      {\n        get_plan(n0,n1,true,dst,src).inv2(fftw_cast(dst), fftw_cast(src) ,n0,n1);\n      }\n\n\n  protected:\n      typedef fftw_plan<Scalar> PlanData;\n\n      typedef std::map<int64_t,PlanData> PlanMap;\n\n      PlanMap m_plans;\n\n      inline\n      PlanData & get_plan(int nfft,bool inverse,void * dst,const void * src)\n      {\n          bool inplace = (dst==src);\n          bool aligned = ( (reinterpret_cast<size_t>(src)&15) | (reinterpret_cast<size_t>(dst)&15) ) == 0;\n          int64_t key = ( (nfft<<3 ) | (inverse<<2) | (inplace<<1) | aligned ) << 1;\n          return m_plans[key];\n      }\n\n      inline\n      PlanData & get_plan(int n0,int n1,bool inverse,void * dst,const void * src)\n      {\n          bool inplace = (dst==src);\n          bool aligned = ( (reinterpret_cast<size_t>(src)&15) | (reinterpret_cast<size_t>(dst)&15) ) == 0;\n          int64_t key = ( ( (((int64_t)n0) << 30)|(n1<<3 ) | (inverse<<2) | (inplace<<1) | aligned ) << 1 ) + 1;\n          return m_plans[key];\n      }\n  };\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n/* vim: set filetype=cpp et sw=2 ts=2 ai: */\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/FFT/ei_kissfft_impl.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Mark Borgerding mark a borgerding net\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\nnamespace Eigen { \n\nnamespace internal {\n\n  // This FFT implementation was derived from kissfft http:sourceforge.net/projects/kissfft\n  // Copyright 2003-2009 Mark Borgerding\n\ntemplate <typename _Scalar>\nstruct kiss_cpx_fft\n{\n  typedef _Scalar Scalar;\n  typedef std::complex<Scalar> Complex;\n  std::vector<Complex> m_twiddles;\n  std::vector<int> m_stageRadix;\n  std::vector<int> m_stageRemainder;\n  std::vector<Complex> m_scratchBuf;\n  bool m_inverse;\n\n  inline\n    void make_twiddles(int nfft,bool inverse)\n    {\n      using std::acos;\n      m_inverse = inverse;\n      m_twiddles.resize(nfft);\n      Scalar phinc =  (inverse?2:-2)* acos( (Scalar) -1)  / nfft;\n      for (int i=0;i<nfft;++i)\n        m_twiddles[i] = exp( Complex(0,i*phinc) );\n    }\n\n  void factorize(int nfft)\n  {\n    //start factoring out 4's, then 2's, then 3,5,7,9,...\n    int n= nfft;\n    int p=4;\n    do {\n      while (n % p) {\n        switch (p) {\n          case 4: p = 2; break;\n          case 2: p = 3; break;\n          default: p += 2; break;\n        }\n        if (p*p>n)\n          p=n;// impossible to have a factor > sqrt(n)\n      }\n      n /= p;\n      m_stageRadix.push_back(p);\n      m_stageRemainder.push_back(n);\n      if ( p > 5 )\n        m_scratchBuf.resize(p); // scratchbuf will be needed in bfly_generic\n    }while(n>1);\n  }\n\n  template <typename _Src>\n    inline\n    void work( int stage,Complex * xout, const _Src * xin, size_t fstride,size_t in_stride)\n    {\n      int p = m_stageRadix[stage];\n      int m = m_stageRemainder[stage];\n      Complex * Fout_beg = xout;\n      Complex * Fout_end = xout + p*m;\n\n      if (m>1) {\n        do{\n          // recursive call:\n          // DFT of size m*p performed by doing\n          // p instances of smaller DFTs of size m, \n          // each one takes a decimated version of the input\n          work(stage+1, xout , xin, fstride*p,in_stride);\n          xin += fstride*in_stride;\n        }while( (xout += m) != Fout_end );\n      }else{\n        do{\n          *xout = *xin;\n          xin += fstride*in_stride;\n        }while(++xout != Fout_end );\n      }\n      xout=Fout_beg;\n\n      // recombine the p smaller DFTs \n      switch (p) {\n        case 2: bfly2(xout,fstride,m); break;\n        case 3: bfly3(xout,fstride,m); break;\n        case 4: bfly4(xout,fstride,m); break;\n        case 5: bfly5(xout,fstride,m); break;\n        default: bfly_generic(xout,fstride,m,p); break;\n      }\n    }\n\n  inline\n    void bfly2( Complex * Fout, const size_t fstride, int m)\n    {\n      for (int k=0;k<m;++k) {\n        Complex t = Fout[m+k] * m_twiddles[k*fstride];\n        Fout[m+k] = Fout[k] - t;\n        Fout[k] += t;\n      }\n    }\n\n  inline\n    void bfly4( Complex * Fout, const size_t fstride, const size_t m)\n    {\n      Complex scratch[6];\n      int negative_if_inverse = m_inverse * -2 +1;\n      for (size_t k=0;k<m;++k) {\n        scratch[0] = Fout[k+m] * m_twiddles[k*fstride];\n        scratch[1] = Fout[k+2*m] * m_twiddles[k*fstride*2];\n        scratch[2] = Fout[k+3*m] * m_twiddles[k*fstride*3];\n        scratch[5] = Fout[k] - scratch[1];\n\n        Fout[k] += scratch[1];\n        scratch[3] = scratch[0] + scratch[2];\n        scratch[4] = scratch[0] - scratch[2];\n        scratch[4] = Complex( scratch[4].imag()*negative_if_inverse , -scratch[4].real()* negative_if_inverse );\n\n        Fout[k+2*m]  = Fout[k] - scratch[3];\n        Fout[k] += scratch[3];\n        Fout[k+m] = scratch[5] + scratch[4];\n        Fout[k+3*m] = scratch[5] - scratch[4];\n      }\n    }\n\n  inline\n    void bfly3( Complex * Fout, const size_t fstride, const size_t m)\n    {\n      size_t k=m;\n      const size_t m2 = 2*m;\n      Complex *tw1,*tw2;\n      Complex scratch[5];\n      Complex epi3;\n      epi3 = m_twiddles[fstride*m];\n\n      tw1=tw2=&m_twiddles[0];\n\n      do{\n        scratch[1]=Fout[m] * *tw1;\n        scratch[2]=Fout[m2] * *tw2;\n\n        scratch[3]=scratch[1]+scratch[2];\n        scratch[0]=scratch[1]-scratch[2];\n        tw1 += fstride;\n        tw2 += fstride*2;\n        Fout[m] = Complex( Fout->real() - Scalar(.5)*scratch[3].real() , Fout->imag() - Scalar(.5)*scratch[3].imag() );\n        scratch[0] *= epi3.imag();\n        *Fout += scratch[3];\n        Fout[m2] = Complex(  Fout[m].real() + scratch[0].imag() , Fout[m].imag() - scratch[0].real() );\n        Fout[m] += Complex( -scratch[0].imag(),scratch[0].real() );\n        ++Fout;\n      }while(--k);\n    }\n\n  inline\n    void bfly5( Complex * Fout, const size_t fstride, const size_t m)\n    {\n      Complex *Fout0,*Fout1,*Fout2,*Fout3,*Fout4;\n      size_t u;\n      Complex scratch[13];\n      Complex * twiddles = &m_twiddles[0];\n      Complex *tw;\n      Complex ya,yb;\n      ya = twiddles[fstride*m];\n      yb = twiddles[fstride*2*m];\n\n      Fout0=Fout;\n      Fout1=Fout0+m;\n      Fout2=Fout0+2*m;\n      Fout3=Fout0+3*m;\n      Fout4=Fout0+4*m;\n\n      tw=twiddles;\n      for ( u=0; u<m; ++u ) {\n        scratch[0] = *Fout0;\n\n        scratch[1]  = *Fout1 * tw[u*fstride];\n        scratch[2]  = *Fout2 * tw[2*u*fstride];\n        scratch[3]  = *Fout3 * tw[3*u*fstride];\n        scratch[4]  = *Fout4 * tw[4*u*fstride];\n\n        scratch[7] = scratch[1] + scratch[4];\n        scratch[10] = scratch[1] - scratch[4];\n        scratch[8] = scratch[2] + scratch[3];\n        scratch[9] = scratch[2] - scratch[3];\n\n        *Fout0 +=  scratch[7];\n        *Fout0 +=  scratch[8];\n\n        scratch[5] = scratch[0] + Complex(\n            (scratch[7].real()*ya.real() ) + (scratch[8].real() *yb.real() ),\n            (scratch[7].imag()*ya.real()) + (scratch[8].imag()*yb.real())\n            );\n\n        scratch[6] = Complex(\n            (scratch[10].imag()*ya.imag()) + (scratch[9].imag()*yb.imag()),\n            -(scratch[10].real()*ya.imag()) - (scratch[9].real()*yb.imag())\n            );\n\n        *Fout1 = scratch[5] - scratch[6];\n        *Fout4 = scratch[5] + scratch[6];\n\n        scratch[11] = scratch[0] +\n          Complex(\n              (scratch[7].real()*yb.real()) + (scratch[8].real()*ya.real()),\n              (scratch[7].imag()*yb.real()) + (scratch[8].imag()*ya.real())\n              );\n\n        scratch[12] = Complex(\n            -(scratch[10].imag()*yb.imag()) + (scratch[9].imag()*ya.imag()),\n            (scratch[10].real()*yb.imag()) - (scratch[9].real()*ya.imag())\n            );\n\n        *Fout2=scratch[11]+scratch[12];\n        *Fout3=scratch[11]-scratch[12];\n\n        ++Fout0;++Fout1;++Fout2;++Fout3;++Fout4;\n      }\n    }\n\n  /* perform the butterfly for one stage of a mixed radix FFT */\n  inline\n    void bfly_generic(\n        Complex * Fout,\n        const size_t fstride,\n        int m,\n        int p\n        )\n    {\n      int u,k,q1,q;\n      Complex * twiddles = &m_twiddles[0];\n      Complex t;\n      int Norig = static_cast<int>(m_twiddles.size());\n      Complex * scratchbuf = &m_scratchBuf[0];\n\n      for ( u=0; u<m; ++u ) {\n        k=u;\n        for ( q1=0 ; q1<p ; ++q1 ) {\n          scratchbuf[q1] = Fout[ k  ];\n          k += m;\n        }\n\n        k=u;\n        for ( q1=0 ; q1<p ; ++q1 ) {\n          int twidx=0;\n          Fout[ k ] = scratchbuf[0];\n          for (q=1;q<p;++q ) {\n            twidx += static_cast<int>(fstride) * k;\n            if (twidx>=Norig) twidx-=Norig;\n            t=scratchbuf[q] * twiddles[twidx];\n            Fout[ k ] += t;\n          }\n          k += m;\n        }\n      }\n    }\n};\n\ntemplate <typename _Scalar>\nstruct kissfft_impl\n{\n  typedef _Scalar Scalar;\n  typedef std::complex<Scalar> Complex;\n\n  void clear() \n  {\n    m_plans.clear();\n    m_realTwiddles.clear();\n  }\n\n  inline\n    void fwd( Complex * dst,const Complex *src,int nfft)\n    {\n      get_plan(nfft,false).work(0, dst, src, 1,1);\n    }\n\n  inline\n    void fwd2( Complex * dst,const Complex *src,int n0,int n1)\n    {\n        EIGEN_UNUSED_VARIABLE(dst);\n        EIGEN_UNUSED_VARIABLE(src);\n        EIGEN_UNUSED_VARIABLE(n0);\n        EIGEN_UNUSED_VARIABLE(n1);\n    }\n\n  inline\n    void inv2( Complex * dst,const Complex *src,int n0,int n1)\n    {\n        EIGEN_UNUSED_VARIABLE(dst);\n        EIGEN_UNUSED_VARIABLE(src);\n        EIGEN_UNUSED_VARIABLE(n0);\n        EIGEN_UNUSED_VARIABLE(n1);\n    }\n\n  // real-to-complex forward FFT\n  // perform two FFTs of src even and src odd\n  // then twiddle to recombine them into the half-spectrum format\n  // then fill in the conjugate symmetric half\n  inline\n    void fwd( Complex * dst,const Scalar * src,int nfft) \n    {\n      if ( nfft&3  ) {\n        // use generic mode for odd\n        m_tmpBuf1.resize(nfft);\n        get_plan(nfft,false).work(0, &m_tmpBuf1[0], src, 1,1);\n        std::copy(m_tmpBuf1.begin(),m_tmpBuf1.begin()+(nfft>>1)+1,dst );\n      }else{\n        int ncfft = nfft>>1;\n        int ncfft2 = nfft>>2;\n        Complex * rtw = real_twiddles(ncfft2);\n\n        // use optimized mode for even real\n        fwd( dst, reinterpret_cast<const Complex*> (src), ncfft);\n        Complex dc = dst[0].real() +  dst[0].imag();\n        Complex nyquist = dst[0].real() -  dst[0].imag();\n        int k;\n        for ( k=1;k <= ncfft2 ; ++k ) {\n          Complex fpk = dst[k];\n          Complex fpnk = conj(dst[ncfft-k]);\n          Complex f1k = fpk + fpnk;\n          Complex f2k = fpk - fpnk;\n          Complex tw= f2k * rtw[k-1];\n          dst[k] =  (f1k + tw) * Scalar(.5);\n          dst[ncfft-k] =  conj(f1k -tw)*Scalar(.5);\n        }\n        dst[0] = dc;\n        dst[ncfft] = nyquist;\n      }\n    }\n\n  // inverse complex-to-complex\n  inline\n    void inv(Complex * dst,const Complex  *src,int nfft)\n    {\n      get_plan(nfft,true).work(0, dst, src, 1,1);\n    }\n\n  // half-complex to scalar\n  inline\n    void inv( Scalar * dst,const Complex * src,int nfft) \n    {\n      if (nfft&3) {\n        m_tmpBuf1.resize(nfft);\n        m_tmpBuf2.resize(nfft);\n        std::copy(src,src+(nfft>>1)+1,m_tmpBuf1.begin() );\n        for (int k=1;k<(nfft>>1)+1;++k)\n          m_tmpBuf1[nfft-k] = conj(m_tmpBuf1[k]);\n        inv(&m_tmpBuf2[0],&m_tmpBuf1[0],nfft);\n        for (int k=0;k<nfft;++k)\n          dst[k] = m_tmpBuf2[k].real();\n      }else{\n        // optimized version for multiple of 4\n        int ncfft = nfft>>1;\n        int ncfft2 = nfft>>2;\n        Complex * rtw = real_twiddles(ncfft2);\n        m_tmpBuf1.resize(ncfft);\n        m_tmpBuf1[0] = Complex( src[0].real() + src[ncfft].real(), src[0].real() - src[ncfft].real() );\n        for (int k = 1; k <= ncfft / 2; ++k) {\n          Complex fk = src[k];\n          Complex fnkc = conj(src[ncfft-k]);\n          Complex fek = fk + fnkc;\n          Complex tmp = fk - fnkc;\n          Complex fok = tmp * conj(rtw[k-1]);\n          m_tmpBuf1[k] = fek + fok;\n          m_tmpBuf1[ncfft-k] = conj(fek - fok);\n        }\n        get_plan(ncfft,true).work(0, reinterpret_cast<Complex*>(dst), &m_tmpBuf1[0], 1,1);\n      }\n    }\n\n  protected:\n  typedef kiss_cpx_fft<Scalar> PlanData;\n  typedef std::map<int,PlanData> PlanMap;\n\n  PlanMap m_plans;\n  std::map<int, std::vector<Complex> > m_realTwiddles;\n  std::vector<Complex> m_tmpBuf1;\n  std::vector<Complex> m_tmpBuf2;\n\n  inline\n    int PlanKey(int nfft, bool isinverse) const { return (nfft<<1) | int(isinverse); }\n\n  inline\n    PlanData & get_plan(int nfft, bool inverse)\n    {\n      // TODO look for PlanKey(nfft, ! inverse) and conjugate the twiddles\n      PlanData & pd = m_plans[ PlanKey(nfft,inverse) ];\n      if ( pd.m_twiddles.size() == 0 ) {\n        pd.make_twiddles(nfft,inverse);\n        pd.factorize(nfft);\n      }\n      return pd;\n    }\n\n  inline\n    Complex * real_twiddles(int ncfft2)\n    {\n      using std::acos;\n      std::vector<Complex> & twidref = m_realTwiddles[ncfft2];// creates new if not there\n      if ( (int)twidref.size() != ncfft2 ) {\n        twidref.resize(ncfft2);\n        int ncfft= ncfft2<<1;\n        Scalar pi =  acos( Scalar(-1) );\n        for (int k=1;k<=ncfft2;++k) \n          twidref[k-1] = exp( Complex(0,-pi * (Scalar(k) / ncfft + Scalar(.5)) ) );\n      }\n      return &twidref[0];\n    }\n};\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n/* vim: set filetype=cpp et sw=2 ts=2 ai: */\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/IterativeSolvers/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_IterativeSolvers_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_IterativeSolvers_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/unsupported/Eigen/src/IterativeSolvers COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/IterativeSolvers/ConstrainedConjGrad.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n\n/* NOTE The functions of this file have been adapted from the GMM++ library */\n\n//========================================================================\n//\n// Copyright (C) 2002-2007 Yves Renard\n//\n// This file is a part of GETFEM++\n//\n// Getfem++ is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as\n// published by the Free Software Foundation; version 2.1 of the License.\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 Lesser General Public License for more details.\n// You should have received a copy of the GNU Lesser General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301,\n// USA.\n//\n//========================================================================\n\n#include \"../../../../Eigen/src/Core/util/NonMPL2.h\"\n\n#ifndef EIGEN_CONSTRAINEDCG_H\n#define EIGEN_CONSTRAINEDCG_H\n\n#include <Eigen/Core>\n\nnamespace Eigen { \n\nnamespace internal {\n\n/** \\ingroup IterativeSolvers_Module\n  * Compute the pseudo inverse of the non-square matrix C such that\n  * \\f$ CINV = (C * C^T)^{-1} * C \\f$ based on a conjugate gradient method.\n  *\n  * This function is internally used by constrained_cg.\n  */\ntemplate <typename CMatrix, typename CINVMatrix>\nvoid pseudo_inverse(const CMatrix &C, CINVMatrix &CINV)\n{\n  // optimisable : copie de la ligne, precalcul de C * trans(C).\n  typedef typename CMatrix::Scalar Scalar;\n  typedef typename CMatrix::Index Index;\n  // FIXME use sparse vectors ?\n  typedef Matrix<Scalar,Dynamic,1> TmpVec;\n\n  Index rows = C.rows(), cols = C.cols();\n\n  TmpVec d(rows), e(rows), l(cols), p(rows), q(rows), r(rows);\n  Scalar rho, rho_1, alpha;\n  d.setZero();\n\n  typedef Triplet<double> T;\n  std::vector<T> tripletList;\n    \n  for (Index i = 0; i < rows; ++i)\n  {\n    d[i] = 1.0;\n    rho = 1.0;\n    e.setZero();\n    r = d;\n    p = d;\n\n    while (rho >= 1e-38)\n    { /* conjugate gradient to compute e             */\n      /* which is the i-th row of inv(C * trans(C))  */\n      l = C.transpose() * p;\n      q = C * l;\n      alpha = rho / p.dot(q);\n      e +=  alpha * p;\n      r += -alpha * q;\n      rho_1 = rho;\n      rho = r.dot(r);\n      p = (rho/rho_1) * p + r;\n    }\n\n    l = C.transpose() * e; // l is the i-th row of CINV\n    // FIXME add a generic \"prune/filter\" expression for both dense and sparse object to sparse\n    for (Index j=0; j<l.size(); ++j)\n      if (l[j]<1e-15)\n\ttripletList.push_back(T(i,j,l(j)));\n\n\t\n    d[i] = 0.0;\n  }\n  CINV.setFromTriplets(tripletList.begin(), tripletList.end());\n}\n\n\n\n/** \\ingroup IterativeSolvers_Module\n  * Constrained conjugate gradient\n  *\n  * Computes the minimum of \\f$ 1/2((Ax).x) - bx \\f$ under the contraint \\f$ Cx \\le f \\f$\n  */\ntemplate<typename TMatrix, typename CMatrix,\n         typename VectorX, typename VectorB, typename VectorF>\nvoid constrained_cg(const TMatrix& A, const CMatrix& C, VectorX& x,\n                       const VectorB& b, const VectorF& f, IterationController &iter)\n{\n  using std::sqrt;\n  typedef typename TMatrix::Scalar Scalar;\n  typedef typename TMatrix::Index Index;\n  typedef Matrix<Scalar,Dynamic,1>  TmpVec;\n\n  Scalar rho = 1.0, rho_1, lambda, gamma;\n  Index xSize = x.size();\n  TmpVec  p(xSize), q(xSize), q2(xSize),\n          r(xSize), old_z(xSize), z(xSize),\n          memox(xSize);\n  std::vector<bool> satured(C.rows());\n  p.setZero();\n  iter.setRhsNorm(sqrt(b.dot(b))); // gael vect_sp(PS, b, b)\n  if (iter.rhsNorm() == 0.0) iter.setRhsNorm(1.0);\n\n  SparseMatrix<Scalar,RowMajor> CINV(C.rows(), C.cols());\n  pseudo_inverse(C, CINV);\n\n  while(true)\n  {\n    // computation of residual\n    old_z = z;\n    memox = x;\n    r = b;\n    r += A * -x;\n    z = r;\n    bool transition = false;\n    for (Index i = 0; i < C.rows(); ++i)\n    {\n      Scalar al = C.row(i).dot(x) - f.coeff(i);\n      if (al >= -1.0E-15)\n      {\n        if (!satured[i])\n        {\n          satured[i] = true;\n          transition = true;\n        }\n        Scalar bb = CINV.row(i).dot(z);\n        if (bb > 0.0)\n          // FIXME: we should allow that: z += -bb * C.row(i);\n          for (typename CMatrix::InnerIterator it(C,i); it; ++it)\n            z.coeffRef(it.index()) -= bb*it.value();\n      }\n      else\n        satured[i] = false;\n    }\n\n    // descent direction\n    rho_1 = rho;\n    rho = r.dot(z);\n\n    if (iter.finished(rho)) break;\n\n    if (iter.noiseLevel() > 0 && transition) std::cerr << \"CCG: transition\\n\";\n    if (transition || iter.first()) gamma = 0.0;\n    else gamma = (std::max)(0.0, (rho - old_z.dot(z)) / rho_1);\n    p = z + gamma*p;\n\n    ++iter;\n    // one dimensionnal optimization\n    q = A * p;\n    lambda = rho / q.dot(p);\n    for (Index i = 0; i < C.rows(); ++i)\n    {\n      if (!satured[i])\n      {\n        Scalar bb = C.row(i).dot(p) - f[i];\n        if (bb > 0.0)\n          lambda = (std::min)(lambda, (f.coeff(i)-C.row(i).dot(x)) / bb);\n      }\n    }\n    x += lambda * p;\n    memox -= x;\n  }\n}\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_CONSTRAINEDCG_H\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/IterativeSolvers/DGMRES.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_DGMRES_H\n#define EIGEN_DGMRES_H\n\n#include <Eigen/Eigenvalues>\n\nnamespace Eigen { \n  \ntemplate< typename _MatrixType,\n          typename _Preconditioner = DiagonalPreconditioner<typename _MatrixType::Scalar> >\nclass DGMRES;\n\nnamespace internal {\n\ntemplate< typename _MatrixType, typename _Preconditioner>\nstruct traits<DGMRES<_MatrixType,_Preconditioner> >\n{\n  typedef _MatrixType MatrixType;\n  typedef _Preconditioner Preconditioner;\n};\n\n/** \\brief Computes a permutation vector to have a sorted sequence\n  * \\param vec The vector to reorder.\n  * \\param perm gives the sorted sequence on output. Must be initialized with 0..n-1\n  * \\param ncut Put  the ncut smallest elements at the end of the vector\n  * WARNING This is an expensive sort, so should be used only \n  * for small size vectors\n  * TODO Use modified QuickSplit or std::nth_element to get the smallest values \n  */\ntemplate <typename VectorType, typename IndexType>\nvoid sortWithPermutation (VectorType& vec, IndexType& perm, typename IndexType::Scalar& ncut)\n{\n  eigen_assert(vec.size() == perm.size());\n  typedef typename IndexType::Scalar Index; \n  typedef typename VectorType::Scalar Scalar; \n  bool flag; \n  for (Index k  = 0; k < ncut; k++)\n  {\n    flag = false;\n    for (Index j = 0; j < vec.size()-1; j++)\n    {\n      if ( vec(perm(j)) < vec(perm(j+1)) )\n      {\n        std::swap(perm(j),perm(j+1)); \n        flag = true;\n      }\n      if (!flag) break; // The vector is in sorted order\n    }\n  }\n}\n\n}\n/**\n * \\ingroup IterativeLInearSolvers_Module\n * \\brief A Restarted GMRES with deflation.\n * This class implements a modification of the GMRES solver for\n * sparse linear systems. The basis is built with modified \n * Gram-Schmidt. At each restart, a few approximated eigenvectors\n * corresponding to the smallest eigenvalues are used to build a\n * preconditioner for the next cycle. This preconditioner \n * for deflation can be combined with any other preconditioner, \n * the IncompleteLUT for instance. The preconditioner is applied \n * at right of the matrix and the combination is multiplicative.\n * \n * \\tparam _MatrixType the type of the sparse matrix A, can be a dense or a sparse matrix.\n * \\tparam _Preconditioner the type of the preconditioner. Default is DiagonalPreconditioner\n * Typical usage :\n * \\code\n * SparseMatrix<double> A;\n * VectorXd x, b; \n * //Fill A and b ...\n * DGMRES<SparseMatrix<double> > solver;\n * solver.set_restart(30); // Set restarting value\n * solver.setEigenv(1); // Set the number of eigenvalues to deflate\n * solver.compute(A);\n * x = solver.solve(b);\n * \\endcode\n * \n * References :\n * [1] D. NUENTSA WAKAM and F. PACULL, Memory Efficient Hybrid\n *  Algebraic Solvers for Linear Systems Arising from Compressible\n *  Flows, Computers and Fluids, In Press,\n *  http://dx.doi.org/10.1016/j.compfluid.2012.03.023   \n * [2] K. Burrage and J. Erhel, On the performance of various \n * adaptive preconditioned GMRES strategies, 5(1998), 101-121.\n * [3] J. Erhel, K. Burrage and B. Pohl, Restarted GMRES \n *  preconditioned by deflation,J. Computational and Applied\n *  Mathematics, 69(1996), 303-318. \n\n * \n */\ntemplate< typename _MatrixType, typename _Preconditioner>\nclass DGMRES : public IterativeSolverBase<DGMRES<_MatrixType,_Preconditioner> >\n{\n    typedef IterativeSolverBase<DGMRES> Base;\n    using Base::mp_matrix;\n    using Base::m_error;\n    using Base::m_iterations;\n    using Base::m_info;\n    using Base::m_isInitialized;\n    using Base::m_tolerance; \n  public:\n    typedef _MatrixType MatrixType;\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename MatrixType::Index Index;\n    typedef typename MatrixType::RealScalar RealScalar;\n    typedef _Preconditioner Preconditioner;\n    typedef Matrix<Scalar,Dynamic,Dynamic> DenseMatrix; \n    typedef Matrix<RealScalar,Dynamic,Dynamic> DenseRealMatrix; \n    typedef Matrix<Scalar,Dynamic,1> DenseVector;\n    typedef Matrix<RealScalar,Dynamic,1> DenseRealVector; \n    typedef Matrix<std::complex<RealScalar>, Dynamic, 1> ComplexVector;\n \n    \n  /** Default constructor. */\n  DGMRES() : Base(),m_restart(30),m_neig(0),m_r(0),m_maxNeig(5),m_isDeflAllocated(false),m_isDeflInitialized(false) {}\n\n  /** Initialize the solver with matrix \\a A for further \\c Ax=b solving.\n    * \n    * This constructor is a shortcut for the default constructor followed\n    * by a call to compute().\n    * \n    * \\warning this class stores a reference to the matrix A as well as some\n    * precomputed values that depend on it. Therefore, if \\a A is changed\n    * this class becomes invalid. Call compute() to update it with the new\n    * matrix A, or modify a copy of A.\n    */\n  template<typename MatrixDerived>\n  explicit DGMRES(const EigenBase<MatrixDerived>& A) : Base(A.derived()), m_restart(30),m_neig(0),m_r(0),m_maxNeig(5),m_isDeflAllocated(false),m_isDeflInitialized(false) {}\n\n  ~DGMRES() {}\n  \n  /** \\returns the solution x of \\f$ A x = b \\f$ using the current decomposition of A\n    * \\a x0 as an initial solution.\n    *\n    * \\sa compute()\n    */\n  template<typename Rhs,typename Guess>\n  inline const internal::solve_retval_with_guess<DGMRES, Rhs, Guess>\n  solveWithGuess(const MatrixBase<Rhs>& b, const Guess& x0) const\n  {\n    eigen_assert(m_isInitialized && \"DGMRES is not initialized.\");\n    eigen_assert(Base::rows()==b.rows()\n              && \"DGMRES::solve(): invalid number of rows of the right hand side matrix b\");\n    return internal::solve_retval_with_guess\n            <DGMRES, Rhs, Guess>(*this, b.derived(), x0);\n  }\n  \n  /** \\internal */\n  template<typename Rhs,typename Dest>\n  void _solveWithGuess(const Rhs& b, Dest& x) const\n  {    \n    bool failed = false;\n    for(int j=0; j<b.cols(); ++j)\n    {\n      m_iterations = Base::maxIterations();\n      m_error = Base::m_tolerance;\n      \n      typename Dest::ColXpr xj(x,j);\n      dgmres(*mp_matrix, b.col(j), xj, Base::m_preconditioner);\n    }\n    m_info = failed ? NumericalIssue\n           : m_error <= Base::m_tolerance ? Success\n           : NoConvergence;\n    m_isInitialized = true;\n  }\n\n  /** \\internal */\n  template<typename Rhs,typename Dest>\n  void _solve(const Rhs& b, Dest& x) const\n  {\n    x = b;\n    _solveWithGuess(b,x);\n  }\n  /** \n   * Get the restart value\n    */\n  int restart() { return m_restart; }\n  \n  /** \n   * Set the restart value (default is 30)  \n   */\n  void set_restart(const int restart) { m_restart=restart; }\n  \n  /** \n   * Set the number of eigenvalues to deflate at each restart \n   */\n  void setEigenv(const int neig) \n  {\n    m_neig = neig;\n    if (neig+1 > m_maxNeig) m_maxNeig = neig+1; // To allow for complex conjugates\n  }\n  \n  /** \n   * Get the size of the deflation subspace size\n   */ \n  int deflSize() {return m_r; }\n  \n  /**\n   * Set the maximum size of the deflation subspace\n   */\n  void setMaxEigenv(const int maxNeig) { m_maxNeig = maxNeig; }\n  \n  protected:\n    // DGMRES algorithm \n    template<typename Rhs, typename Dest>\n    void dgmres(const MatrixType& mat,const Rhs& rhs, Dest& x, const Preconditioner& precond) const;\n    // Perform one cycle of GMRES\n    template<typename Dest>\n    int dgmresCycle(const MatrixType& mat, const Preconditioner& precond, Dest& x, DenseVector& r0, RealScalar& beta, const RealScalar& normRhs, int& nbIts) const; \n    // Compute data to use for deflation \n    int dgmresComputeDeflationData(const MatrixType& mat, const Preconditioner& precond, const Index& it, Index& neig) const;\n    // Apply deflation to a vector\n    template<typename RhsType, typename DestType>\n    int dgmresApplyDeflation(const RhsType& In, DestType& Out) const; \n    ComplexVector schurValues(const ComplexSchur<DenseMatrix>& schurofH) const;\n    ComplexVector schurValues(const RealSchur<DenseMatrix>& schurofH) const;\n    // Init data for deflation\n    void dgmresInitDeflation(Index& rows) const; \n    mutable DenseMatrix m_V; // Krylov basis vectors\n    mutable DenseMatrix m_H; // Hessenberg matrix \n    mutable DenseMatrix m_Hes; // Initial hessenberg matrix wihout Givens rotations applied\n    mutable Index m_restart; // Maximum size of the Krylov subspace\n    mutable DenseMatrix m_U; // Vectors that form the basis of the invariant subspace \n    mutable DenseMatrix m_MU; // matrix operator applied to m_U (for next cycles)\n    mutable DenseMatrix m_T; /* T=U^T*M^{-1}*A*U */\n    mutable PartialPivLU<DenseMatrix> m_luT; // LU factorization of m_T\n    mutable int m_neig; //Number of eigenvalues to extract at each restart\n    mutable int m_r; // Current number of deflated eigenvalues, size of m_U\n    mutable int m_maxNeig; // Maximum number of eigenvalues to deflate\n    mutable RealScalar m_lambdaN; //Modulus of the largest eigenvalue of A\n    mutable bool m_isDeflAllocated;\n    mutable bool m_isDeflInitialized;\n    \n    //Adaptive strategy \n    mutable RealScalar m_smv; // Smaller multiple of the remaining number of steps allowed\n    mutable bool m_force; // Force the use of deflation at each restart\n    \n}; \n/** \n * \\brief Perform several cycles of restarted GMRES with modified Gram Schmidt, \n * \n * A right preconditioner is used combined with deflation.\n * \n */\ntemplate< typename _MatrixType, typename _Preconditioner>\ntemplate<typename Rhs, typename Dest>\nvoid DGMRES<_MatrixType, _Preconditioner>::dgmres(const MatrixType& mat,const Rhs& rhs, Dest& x,\n              const Preconditioner& precond) const\n{\n  //Initialization\n  int n = mat.rows(); \n  DenseVector r0(n); \n  int nbIts = 0; \n  m_H.resize(m_restart+1, m_restart);\n  m_Hes.resize(m_restart, m_restart);\n  m_V.resize(n,m_restart+1);\n  //Initial residual vector and intial norm\n  x = precond.solve(x);\n  r0 = rhs - mat * x; \n  RealScalar beta = r0.norm(); \n  RealScalar normRhs = rhs.norm();\n  m_error = beta/normRhs; \n  if(m_error < m_tolerance)\n    m_info = Success; \n  else\n    m_info = NoConvergence;\n  \n  // Iterative process\n  while (nbIts < m_iterations && m_info == NoConvergence)\n  {\n    dgmresCycle(mat, precond, x, r0, beta, normRhs, nbIts); \n    \n    // Compute the new residual vector for the restart \n    if (nbIts < m_iterations && m_info == NoConvergence)\n      r0 = rhs - mat * x; \n  }\n} \n\n/**\n * \\brief Perform one restart cycle of DGMRES\n * \\param mat The coefficient matrix\n * \\param precond The preconditioner\n * \\param x the new approximated solution\n * \\param r0 The initial residual vector\n * \\param beta The norm of the residual computed so far\n * \\param normRhs The norm of the right hand side vector\n * \\param nbIts The number of iterations\n */\ntemplate< typename _MatrixType, typename _Preconditioner>\ntemplate<typename Dest>\nint DGMRES<_MatrixType, _Preconditioner>::dgmresCycle(const MatrixType& mat, const Preconditioner& precond, Dest& x, DenseVector& r0, RealScalar& beta, const RealScalar& normRhs, int& nbIts) const\n{\n  //Initialization \n  DenseVector g(m_restart+1); // Right hand side of the least square problem\n  g.setZero();  \n  g(0) = Scalar(beta); \n  m_V.col(0) = r0/beta; \n  m_info = NoConvergence; \n  std::vector<JacobiRotation<Scalar> >gr(m_restart); // Givens rotations\n  int it = 0; // Number of inner iterations \n  int n = mat.rows();\n  DenseVector tv1(n), tv2(n);  //Temporary vectors\n  while (m_info == NoConvergence && it < m_restart && nbIts < m_iterations)\n  {    \n    // Apply preconditioner(s) at right\n    if (m_isDeflInitialized )\n    {\n      dgmresApplyDeflation(m_V.col(it), tv1); // Deflation\n      tv2 = precond.solve(tv1); \n    }\n    else\n    {\n      tv2 = precond.solve(m_V.col(it)); // User's selected preconditioner\n    }\n    tv1 = mat * tv2; \n   \n    // Orthogonalize it with the previous basis in the basis using modified Gram-Schmidt\n    Scalar coef; \n    for (int i = 0; i <= it; ++i)\n    { \n      coef = tv1.dot(m_V.col(i));\n      tv1 = tv1 - coef * m_V.col(i); \n      m_H(i,it) = coef; \n      m_Hes(i,it) = coef; \n    }\n    // Normalize the vector \n    coef = tv1.norm(); \n    m_V.col(it+1) = tv1/coef;\n    m_H(it+1, it) = coef;\n//     m_Hes(it+1,it) = coef; \n    \n    // FIXME Check for happy breakdown \n    \n    // Update Hessenberg matrix with Givens rotations\n    for (int i = 1; i <= it; ++i) \n    {\n      m_H.col(it).applyOnTheLeft(i-1,i,gr[i-1].adjoint());\n    }\n    // Compute the new plane rotation \n    gr[it].makeGivens(m_H(it, it), m_H(it+1,it)); \n    // Apply the new rotation\n    m_H.col(it).applyOnTheLeft(it,it+1,gr[it].adjoint());\n    g.applyOnTheLeft(it,it+1, gr[it].adjoint()); \n    \n    beta = std::abs(g(it+1));\n    m_error = beta/normRhs; \n    std::cerr << nbIts << \" Relative Residual Norm \" << m_error << std::endl;\n    it++; nbIts++; \n    \n    if (m_error < m_tolerance)\n    {\n      // The method has converged\n      m_info = Success;\n      break;\n    }\n  }\n  \n  // Compute the new coefficients by solving the least square problem\n//   it++;\n  //FIXME  Check first if the matrix is singular ... zero diagonal\n  DenseVector nrs(m_restart); \n  nrs = m_H.topLeftCorner(it,it).template triangularView<Upper>().solve(g.head(it)); \n  \n  // Form the new solution\n  if (m_isDeflInitialized)\n  {\n    tv1 = m_V.leftCols(it) * nrs; \n    dgmresApplyDeflation(tv1, tv2); \n    x = x + precond.solve(tv2);\n  }\n  else\n    x = x + precond.solve(m_V.leftCols(it) * nrs); \n  \n  // Go for a new cycle and compute data for deflation\n  if(nbIts < m_iterations && m_info == NoConvergence && m_neig > 0 && (m_r+m_neig) < m_maxNeig)\n    dgmresComputeDeflationData(mat, precond, it, m_neig); \n  return 0; \n  \n}\n\n\ntemplate< typename _MatrixType, typename _Preconditioner>\nvoid DGMRES<_MatrixType, _Preconditioner>::dgmresInitDeflation(Index& rows) const\n{\n  m_U.resize(rows, m_maxNeig);\n  m_MU.resize(rows, m_maxNeig); \n  m_T.resize(m_maxNeig, m_maxNeig);\n  m_lambdaN = 0.0; \n  m_isDeflAllocated = true; \n}\n\ntemplate< typename _MatrixType, typename _Preconditioner>\ninline typename DGMRES<_MatrixType, _Preconditioner>::ComplexVector DGMRES<_MatrixType, _Preconditioner>::schurValues(const ComplexSchur<DenseMatrix>& schurofH) const\n{\n  return schurofH.matrixT().diagonal();\n}\n\ntemplate< typename _MatrixType, typename _Preconditioner>\ninline typename DGMRES<_MatrixType, _Preconditioner>::ComplexVector DGMRES<_MatrixType, _Preconditioner>::schurValues(const RealSchur<DenseMatrix>& schurofH) const\n{\n  typedef typename MatrixType::Index Index;\n  const DenseMatrix& T = schurofH.matrixT();\n  Index it = T.rows();\n  ComplexVector eig(it);\n  Index j = 0;\n  while (j < it-1)\n  {\n    if (T(j+1,j) ==Scalar(0))\n    {\n      eig(j) = std::complex<RealScalar>(T(j,j),RealScalar(0)); \n      j++; \n    }\n    else\n    {\n      eig(j) = std::complex<RealScalar>(T(j,j),T(j+1,j)); \n      eig(j+1) = std::complex<RealScalar>(T(j,j+1),T(j+1,j+1));\n      j++;\n    }\n  }\n  if (j < it-1) eig(j) = std::complex<RealScalar>(T(j,j),RealScalar(0));\n  return eig;\n}\n\ntemplate< typename _MatrixType, typename _Preconditioner>\nint DGMRES<_MatrixType, _Preconditioner>::dgmresComputeDeflationData(const MatrixType& mat, const Preconditioner& precond, const Index& it, Index& neig) const\n{\n  // First, find the Schur form of the Hessenberg matrix H\n  typename internal::conditional<NumTraits<Scalar>::IsComplex, ComplexSchur<DenseMatrix>, RealSchur<DenseMatrix> >::type schurofH; \n  bool computeU = true;\n  DenseMatrix matrixQ(it,it); \n  matrixQ.setIdentity();\n  schurofH.computeFromHessenberg(m_Hes.topLeftCorner(it,it), matrixQ, computeU); \n  \n  ComplexVector eig(it);\n  Matrix<Index,Dynamic,1>perm(it); \n  eig = this->schurValues(schurofH);\n  \n  // Reorder the absolute values of Schur values\n  DenseRealVector modulEig(it); \n  for (int j=0; j<it; ++j) modulEig(j) = std::abs(eig(j)); \n  perm.setLinSpaced(it,0,it-1);\n  internal::sortWithPermutation(modulEig, perm, neig);\n  \n  if (!m_lambdaN)\n  {\n    m_lambdaN = (std::max)(modulEig.maxCoeff(), m_lambdaN);\n  }\n  //Count the real number of extracted eigenvalues (with complex conjugates)\n  int nbrEig = 0; \n  while (nbrEig < neig)\n  {\n    if(eig(perm(it-nbrEig-1)).imag() == RealScalar(0)) nbrEig++; \n    else nbrEig += 2; \n  }\n  // Extract the  Schur vectors corresponding to the smallest Ritz values\n  DenseMatrix Sr(it, nbrEig); \n  Sr.setZero();\n  for (int j = 0; j < nbrEig; j++)\n  {\n    Sr.col(j) = schurofH.matrixU().col(perm(it-j-1));\n  }\n  \n  // Form the Schur vectors of the initial matrix using the Krylov basis\n  DenseMatrix X; \n  X = m_V.leftCols(it) * Sr;\n  if (m_r)\n  {\n   // Orthogonalize X against m_U using modified Gram-Schmidt\n   for (int j = 0; j < nbrEig; j++)\n     for (int k =0; k < m_r; k++)\n      X.col(j) = X.col(j) - (m_U.col(k).dot(X.col(j)))*m_U.col(k); \n  }\n  \n  // Compute m_MX = A * M^-1 * X\n  Index m = m_V.rows();\n  if (!m_isDeflAllocated) \n    dgmresInitDeflation(m); \n  DenseMatrix MX(m, nbrEig);\n  DenseVector tv1(m);\n  for (int j = 0; j < nbrEig; j++)\n  {\n    tv1 = mat * X.col(j);\n    MX.col(j) = precond.solve(tv1);\n  }\n  \n  //Update m_T = [U'MU U'MX; X'MU X'MX]\n  m_T.block(m_r, m_r, nbrEig, nbrEig) = X.transpose() * MX; \n  if(m_r)\n  {\n    m_T.block(0, m_r, m_r, nbrEig) = m_U.leftCols(m_r).transpose() * MX; \n    m_T.block(m_r, 0, nbrEig, m_r) = X.transpose() * m_MU.leftCols(m_r);\n  }\n  \n  // Save X into m_U and m_MX in m_MU\n  for (int j = 0; j < nbrEig; j++) m_U.col(m_r+j) = X.col(j);\n  for (int j = 0; j < nbrEig; j++) m_MU.col(m_r+j) = MX.col(j);\n  // Increase the size of the invariant subspace\n  m_r += nbrEig; \n  \n  // Factorize m_T into m_luT\n  m_luT.compute(m_T.topLeftCorner(m_r, m_r));\n  \n  //FIXME CHeck if the factorization was correctly done (nonsingular matrix)\n  m_isDeflInitialized = true;\n  return 0; \n}\ntemplate<typename _MatrixType, typename _Preconditioner>\ntemplate<typename RhsType, typename DestType>\nint DGMRES<_MatrixType, _Preconditioner>::dgmresApplyDeflation(const RhsType &x, DestType &y) const\n{\n  DenseVector x1 = m_U.leftCols(m_r).transpose() * x; \n  y = x + m_U.leftCols(m_r) * ( m_lambdaN * m_luT.solve(x1) - x1);\n  return 0; \n}\n\nnamespace internal {\n\n  template<typename _MatrixType, typename _Preconditioner, typename Rhs>\nstruct solve_retval<DGMRES<_MatrixType, _Preconditioner>, Rhs>\n  : solve_retval_base<DGMRES<_MatrixType, _Preconditioner>, Rhs>\n{\n  typedef DGMRES<_MatrixType, _Preconditioner> Dec;\n  EIGEN_MAKE_SOLVE_HELPERS(Dec,Rhs)\n\n  template<typename Dest> void evalTo(Dest& dst) const\n  {\n    dec()._solve(rhs(),dst);\n  }\n};\n} // end namespace internal\n\n} // end namespace Eigen\n#endif \n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/IterativeSolvers/GMRES.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2011 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2012, 2014 Kolja Brix <brix@igpm.rwth-aaachen.de>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_GMRES_H\n#define EIGEN_GMRES_H\n\nnamespace Eigen { \n\nnamespace internal {\n\n/**\n * Generalized Minimal Residual Algorithm based on the\n * Arnoldi algorithm implemented with Householder reflections.\n *\n * Parameters:\n *  \\param mat       matrix of linear system of equations\n *  \\param Rhs       right hand side vector of linear system of equations\n *  \\param x         on input: initial guess, on output: solution\n *  \\param precond   preconditioner used\n *  \\param iters     on input: maximum number of iterations to perform\n *                   on output: number of iterations performed\n *  \\param restart   number of iterations for a restart\n *  \\param tol_error on input: residual tolerance\n *                   on output: residuum achieved\n *\n * \\sa IterativeMethods::bicgstab() \n *  \n *\n * For references, please see:\n *\n * Saad, Y. and Schultz, M. H.\n * GMRES: A Generalized Minimal Residual Algorithm for Solving Nonsymmetric Linear Systems.\n * SIAM J.Sci.Stat.Comp. 7, 1986, pp. 856 - 869.\n *\n * Saad, Y.\n * Iterative Methods for Sparse Linear Systems.\n * Society for Industrial and Applied Mathematics, Philadelphia, 2003.\n *\n * Walker, H. F.\n * Implementations of the GMRES method.\n * Comput.Phys.Comm. 53, 1989, pp. 311 - 320.\n *\n * Walker, H. F.\n * Implementation of the GMRES Method using Householder Transformations.\n * SIAM J.Sci.Stat.Comp. 9, 1988, pp. 152 - 163.\n *\n */\ntemplate<typename MatrixType, typename Rhs, typename Dest, typename Preconditioner>\nbool gmres(const MatrixType & mat, const Rhs & rhs, Dest & x, const Preconditioner & precond,\n\t\tint &iters, const int &restart, typename Dest::RealScalar & tol_error) {\n\n\tusing std::sqrt;\n\tusing std::abs;\n\n\ttypedef typename Dest::RealScalar RealScalar;\n\ttypedef typename Dest::Scalar Scalar;\n\ttypedef Matrix < Scalar, Dynamic, 1 > VectorType;\n\ttypedef Matrix < Scalar, Dynamic, Dynamic > FMatrixType;\n\n\tRealScalar tol = tol_error;\n\tconst int maxIters = iters;\n\titers = 0;\n\n\tconst int m = mat.rows();\n\n\tVectorType p0 = rhs - mat*x;\n\tVectorType r0 = precond.solve(p0);\n \n\t// is initial guess already good enough?\n\tif(abs(r0.norm()) < tol) {\n\t\treturn true; \n\t}\n\n\tVectorType w = VectorType::Zero(restart + 1);\n\n\tFMatrixType H = FMatrixType::Zero(m, restart + 1); // Hessenberg matrix\n\tVectorType tau = VectorType::Zero(restart + 1);\n\tstd::vector < JacobiRotation < Scalar > > G(restart);\n\n\t// generate first Householder vector\n\tVectorType e(m-1);\n\tRealScalar beta;\n\tr0.makeHouseholder(e, tau.coeffRef(0), beta);\n\tw(0)=(Scalar) beta;\n\tH.bottomLeftCorner(m - 1, 1) = e;\n\n\tfor (int k = 1; k <= restart; ++k) {\n\n\t\t++iters;\n\n\t\tVectorType v = VectorType::Unit(m, k - 1), workspace(m);\n\n\t\t// apply Householder reflections H_{1} ... H_{k-1} to v\n\t\tfor (int i = k - 1; i >= 0; --i) {\n\t\t\tv.tail(m - i).applyHouseholderOnTheLeft(H.col(i).tail(m - i - 1), tau.coeffRef(i), workspace.data());\n\t\t}\n\n\t\t// apply matrix M to v:  v = mat * v;\n\t\tVectorType t=mat*v;\n\t\tv=precond.solve(t);\n\n\t\t// apply Householder reflections H_{k-1} ... H_{1} to v\n\t\tfor (int i = 0; i < k; ++i) {\n\t\t\tv.tail(m - i).applyHouseholderOnTheLeft(H.col(i).tail(m - i - 1), tau.coeffRef(i), workspace.data());\n\t\t}\n\n\t\tif (v.tail(m - k).norm() != 0.0) {\n\n\t\t\tif (k <= restart) {\n\n\t\t\t\t// generate new Householder vector\n                                  VectorType e(m - k - 1);\n\t\t\t\tRealScalar beta;\n\t\t\t\tv.tail(m - k).makeHouseholder(e, tau.coeffRef(k), beta);\n\t\t\t\tH.col(k).tail(m - k - 1) = e;\n\n\t\t\t\t// apply Householder reflection H_{k} to v\n\t\t\t\tv.tail(m - k).applyHouseholderOnTheLeft(H.col(k).tail(m - k - 1), tau.coeffRef(k), workspace.data());\n\n\t\t\t}\n                }\n\n                if (k > 1) {\n                        for (int i = 0; i < k - 1; ++i) {\n                                // apply old Givens rotations to v\n                                v.applyOnTheLeft(i, i + 1, G[i].adjoint());\n                        }\n                }\n\n                if (k<m && v(k) != (Scalar) 0) {\n                        // determine next Givens rotation\n                        G[k - 1].makeGivens(v(k - 1), v(k));\n\n                        // apply Givens rotation to v and w\n                        v.applyOnTheLeft(k - 1, k, G[k - 1].adjoint());\n                        w.applyOnTheLeft(k - 1, k, G[k - 1].adjoint());\n\n                }\n\n                // insert coefficients into upper matrix triangle\n                H.col(k - 1).head(k) = v.head(k);\n\n                bool stop=(k==m || abs(w(k)) < tol || iters == maxIters);\n\n                if (stop || k == restart) {\n\n                        // solve upper triangular system\n                        VectorType y = w.head(k);\n                        H.topLeftCorner(k, k).template triangularView < Eigen::Upper > ().solveInPlace(y);\n\n                        // use Horner-like scheme to calculate solution vector\n                        VectorType x_new = y(k - 1) * VectorType::Unit(m, k - 1);\n\n                        // apply Householder reflection H_{k} to x_new\n                        x_new.tail(m - k + 1).applyHouseholderOnTheLeft(H.col(k - 1).tail(m - k), tau.coeffRef(k - 1), workspace.data());\n\n                        for (int i = k - 2; i >= 0; --i) {\n                                x_new += y(i) * VectorType::Unit(m, i);\n                                // apply Householder reflection H_{i} to x_new\n                                x_new.tail(m - i).applyHouseholderOnTheLeft(H.col(i).tail(m - i - 1), tau.coeffRef(i), workspace.data());\n                        }\n\n                        x += x_new;\n\n                        if (stop) {\n                                return true;\n                        } else {\n                                k=0;\n\n                                // reset data for a restart  r0 = rhs - mat * x;\n                                VectorType p0=mat*x;\n                                VectorType p1=precond.solve(p0);\n                                r0 = rhs - p1;\n//                                 r0_sqnorm = r0.squaredNorm();\n                                w = VectorType::Zero(restart + 1);\n                                H = FMatrixType::Zero(m, restart + 1);\n                                tau = VectorType::Zero(restart + 1);\n\n                                // generate first Householder vector\n                                RealScalar beta;\n                                r0.makeHouseholder(e, tau.coeffRef(0), beta);\n                                w(0)=(Scalar) beta;\n                                H.bottomLeftCorner(m - 1, 1) = e;\n\n                        }\n\n                }\n\n\n\n\t}\n\t\n\treturn false;\n\n}\n\n}\n\ntemplate< typename _MatrixType,\n          typename _Preconditioner = DiagonalPreconditioner<typename _MatrixType::Scalar> >\nclass GMRES;\n\nnamespace internal {\n\ntemplate< typename _MatrixType, typename _Preconditioner>\nstruct traits<GMRES<_MatrixType,_Preconditioner> >\n{\n  typedef _MatrixType MatrixType;\n  typedef _Preconditioner Preconditioner;\n};\n\n}\n\n/** \\ingroup IterativeLinearSolvers_Module\n  * \\brief A GMRES solver for sparse square problems\n  *\n  * This class allows to solve for A.x = b sparse linear problems using a generalized minimal\n  * residual method. The vectors x and b can be either dense or sparse.\n  *\n  * \\tparam _MatrixType the type of the sparse matrix A, can be a dense or a sparse matrix.\n  * \\tparam _Preconditioner the type of the preconditioner. Default is DiagonalPreconditioner\n  *\n  * The maximal number of iterations and tolerance value can be controlled via the setMaxIterations()\n  * and setTolerance() methods. The defaults are the size of the problem for the maximal number of iterations\n  * and NumTraits<Scalar>::epsilon() for the tolerance.\n  * \n  * This class can be used as the direct solver classes. Here is a typical usage example:\n  * \\code\n  * int n = 10000;\n  * VectorXd x(n), b(n);\n  * SparseMatrix<double> A(n,n);\n  * // fill A and b\n  * GMRES<SparseMatrix<double> > solver(A);\n  * x = solver.solve(b);\n  * std::cout << \"#iterations:     \" << solver.iterations() << std::endl;\n  * std::cout << \"estimated error: \" << solver.error()      << std::endl;\n  * // update b, and solve again\n  * x = solver.solve(b);\n  * \\endcode\n  * \n  * By default the iterations start with x=0 as an initial guess of the solution.\n  * One can control the start using the solveWithGuess() method.\n  * \n  * \\sa class SimplicialCholesky, DiagonalPreconditioner, IdentityPreconditioner\n  */\ntemplate< typename _MatrixType, typename _Preconditioner>\nclass GMRES : public IterativeSolverBase<GMRES<_MatrixType,_Preconditioner> >\n{\n  typedef IterativeSolverBase<GMRES> Base;\n  using Base::mp_matrix;\n  using Base::m_error;\n  using Base::m_iterations;\n  using Base::m_info;\n  using Base::m_isInitialized;\n \nprivate:\n  int m_restart;\n  \npublic:\n  typedef _MatrixType MatrixType;\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::RealScalar RealScalar;\n  typedef _Preconditioner Preconditioner;\n\npublic:\n\n  /** Default constructor. */\n  GMRES() : Base(), m_restart(30) {}\n\n  /** Initialize the solver with matrix \\a A for further \\c Ax=b solving.\n    * \n    * This constructor is a shortcut for the default constructor followed\n    * by a call to compute().\n    * \n    * \\warning this class stores a reference to the matrix A as well as some\n    * precomputed values that depend on it. Therefore, if \\a A is changed\n    * this class becomes invalid. Call compute() to update it with the new\n    * matrix A, or modify a copy of A.\n    */\n  template<typename MatrixDerived>\n  explicit GMRES(const EigenBase<MatrixDerived>& A) : Base(A.derived()), m_restart(30) {}\n\n  ~GMRES() {}\n  \n  /** Get the number of iterations after that a restart is performed.\n    */\n  int get_restart() { return m_restart; }\n  \n  /** Set the number of iterations after that a restart is performed.\n    *  \\param restart   number of iterations for a restarti, default is 30.\n    */\n  void set_restart(const int restart) { m_restart=restart; }\n  \n  /** \\returns the solution x of \\f$ A x = b \\f$ using the current decomposition of A\n    * \\a x0 as an initial solution.\n    *\n    * \\sa compute()\n    */\n  template<typename Rhs,typename Guess>\n  inline const internal::solve_retval_with_guess<GMRES, Rhs, Guess>\n  solveWithGuess(const MatrixBase<Rhs>& b, const Guess& x0) const\n  {\n    eigen_assert(m_isInitialized && \"GMRES is not initialized.\");\n    eigen_assert(Base::rows()==b.rows()\n              && \"GMRES::solve(): invalid number of rows of the right hand side matrix b\");\n    return internal::solve_retval_with_guess\n            <GMRES, Rhs, Guess>(*this, b.derived(), x0);\n  }\n  \n  /** \\internal */\n  template<typename Rhs,typename Dest>\n  void _solveWithGuess(const Rhs& b, Dest& x) const\n  {    \n    bool failed = false;\n    for(int j=0; j<b.cols(); ++j)\n    {\n      m_iterations = Base::maxIterations();\n      m_error = Base::m_tolerance;\n      \n      typename Dest::ColXpr xj(x,j);\n      if(!internal::gmres(*mp_matrix, b.col(j), xj, Base::m_preconditioner, m_iterations, m_restart, m_error))\n        failed = true;\n    }\n    m_info = failed ? NumericalIssue\n           : m_error <= Base::m_tolerance ? Success\n           : NoConvergence;\n    m_isInitialized = true;\n  }\n\n  /** \\internal */\n  template<typename Rhs,typename Dest>\n  void _solve(const Rhs& b, Dest& x) const\n  {\n    x = b;\n    if(x.squaredNorm() == 0) return; // Check Zero right hand side\n    _solveWithGuess(b,x);\n  }\n\nprotected:\n\n};\n\n\nnamespace internal {\n\n  template<typename _MatrixType, typename _Preconditioner, typename Rhs>\nstruct solve_retval<GMRES<_MatrixType, _Preconditioner>, Rhs>\n  : solve_retval_base<GMRES<_MatrixType, _Preconditioner>, Rhs>\n{\n  typedef GMRES<_MatrixType, _Preconditioner> Dec;\n  EIGEN_MAKE_SOLVE_HELPERS(Dec,Rhs)\n\n  template<typename Dest> void evalTo(Dest& dst) const\n  {\n    dec()._solve(rhs(),dst);\n  }\n};\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_GMRES_H\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/IterativeSolvers/IncompleteCholesky.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_INCOMPLETE_CHOlESKY_H\n#define EIGEN_INCOMPLETE_CHOlESKY_H\n#include \"Eigen/src/IterativeLinearSolvers/IncompleteLUT.h\" \n#include <Eigen/OrderingMethods>\n#include <list>\n\nnamespace Eigen {  \n/** \n * \\brief Modified Incomplete Cholesky with dual threshold\n * \n * References : C-J. Lin and J. J. Moré, Incomplete Cholesky Factorizations with\n *              Limited memory, SIAM J. Sci. Comput.  21(1), pp. 24-45, 1999\n * \n * \\tparam _MatrixType The type of the sparse matrix. It should be a symmetric \n *                     matrix. It is advised to give  a row-oriented sparse matrix \n * \\tparam _UpLo The triangular part of the matrix to reference. \n * \\tparam _OrderingType \n */\n\ntemplate <typename Scalar, int _UpLo = Lower, typename _OrderingType = NaturalOrdering<int> >\nclass IncompleteCholesky : internal::noncopyable\n{\n  public:\n    typedef SparseMatrix<Scalar,ColMajor> MatrixType;\n    typedef _OrderingType OrderingType;\n    typedef typename MatrixType::RealScalar RealScalar; \n    typedef typename MatrixType::Index Index; \n    typedef PermutationMatrix<Dynamic, Dynamic, Index> PermutationType;\n    typedef Matrix<Scalar,Dynamic,1> ScalarType; \n    typedef Matrix<Index,Dynamic, 1> IndexType;\n    typedef std::vector<std::list<Index> > VectorList; \n    enum { UpLo = _UpLo };\n  public:\n    IncompleteCholesky() : m_shift(1),m_factorizationIsOk(false) {}\n    IncompleteCholesky(const MatrixType& matrix) : m_shift(1),m_factorizationIsOk(false)\n    {\n      compute(matrix);\n    }\n    \n    Index rows() const { return m_L.rows(); }\n    \n    Index cols() const { return m_L.cols(); }\n    \n\n    /** \\brief Reports whether previous computation was successful.\n      *\n      * \\returns \\c Success if computation was succesful,\n      *          \\c NumericalIssue if the matrix appears to be negative.\n      */\n    ComputationInfo info() const\n    {\n      eigen_assert(m_isInitialized && \"IncompleteLLT is not initialized.\");\n      return m_info;\n    }\n    \n    /** \n     * \\brief Set the initial shift parameter\n     */\n    void setShift( Scalar shift) { m_shift = shift; }\n    \n    /**\n    * \\brief Computes the fill reducing permutation vector. \n    */\n    template<typename MatrixType>\n    void analyzePattern(const MatrixType& mat)\n    {\n      OrderingType ord; \n      ord(mat.template selfadjointView<UpLo>(), m_perm); \n      m_analysisIsOk = true; \n    }\n    \n    template<typename MatrixType>\n    void factorize(const MatrixType& amat);\n    \n    template<typename MatrixType>\n    void compute (const MatrixType& matrix)\n    {\n      analyzePattern(matrix); \n      factorize(matrix);\n    }\n    \n    template<typename Rhs, typename Dest>\n    void _solve(const Rhs& b, Dest& x) const\n    {\n      eigen_assert(m_factorizationIsOk && \"factorize() should be called first\");\n      if (m_perm.rows() == b.rows())\n        x = m_perm.inverse() * b; \n      else \n        x = b; \n      x = m_scal.asDiagonal() * x;\n      x = m_L.template triangularView<UnitLower>().solve(x); \n      x = m_L.adjoint().template triangularView<Upper>().solve(x); \n      if (m_perm.rows() == b.rows())\n        x = m_perm * x;\n      x = m_scal.asDiagonal() * x;\n    }\n    template<typename Rhs> inline const internal::solve_retval<IncompleteCholesky, Rhs>\n    solve(const MatrixBase<Rhs>& b) const\n    {\n      eigen_assert(m_factorizationIsOk && \"IncompleteLLT did not succeed\");\n      eigen_assert(m_isInitialized && \"IncompleteLLT is not initialized.\");\n      eigen_assert(cols()==b.rows()\n                && \"IncompleteLLT::solve(): invalid number of rows of the right hand side matrix b\");\n      return internal::solve_retval<IncompleteCholesky, Rhs>(*this, b.derived());\n    }\n  protected:\n    SparseMatrix<Scalar,ColMajor> m_L;  // The lower part stored in CSC\n    ScalarType m_scal; // The vector for scaling the matrix \n    Scalar m_shift; //The initial shift parameter\n    bool m_analysisIsOk; \n    bool m_factorizationIsOk; \n    bool m_isInitialized;\n    ComputationInfo m_info;\n    PermutationType m_perm; \n    \n  private:\n    template <typename IdxType, typename SclType>\n    inline void updateList(const IdxType& colPtr, IdxType& rowIdx, SclType& vals, const Index& col, const Index& jk, IndexType& firstElt, VectorList& listCol); \n}; \n\ntemplate<typename Scalar, int _UpLo, typename OrderingType>\ntemplate<typename _MatrixType>\nvoid IncompleteCholesky<Scalar,_UpLo, OrderingType>::factorize(const _MatrixType& mat)\n{\n  using std::sqrt;\n  using std::min;\n  eigen_assert(m_analysisIsOk && \"analyzePattern() should be called first\"); \n    \n  // Dropping strategies : Keep only the p largest elements per column, where p is the number of elements in the column of the original matrix. Other strategies will be added\n  \n  // Apply the fill-reducing permutation computed in analyzePattern()\n  if (m_perm.rows() == mat.rows() ) // To detect the null permutation\n    m_L.template selfadjointView<Lower>() = mat.template selfadjointView<_UpLo>().twistedBy(m_perm);\n  else\n    m_L.template selfadjointView<Lower>() = mat.template selfadjointView<_UpLo>();\n  \n  Index n = m_L.cols(); \n  Index nnz = m_L.nonZeros();\n  Map<ScalarType> vals(m_L.valuePtr(), nnz); //values\n  Map<IndexType> rowIdx(m_L.innerIndexPtr(), nnz);  //Row indices\n  Map<IndexType> colPtr( m_L.outerIndexPtr(), n+1); // Pointer to the beginning of each row\n  IndexType firstElt(n-1); // for each j, points to the next entry in vals that will be used in the factorization\n  VectorList listCol(n); // listCol(j) is a linked list of columns to update column j\n  ScalarType curCol(n); // Store a  nonzero values in each column\n  IndexType irow(n); // Row indices of nonzero elements in each column\n  \n  \n  // Computes the scaling factors \n  m_scal.resize(n);\n  for (int j = 0; j < n; j++)\n  {\n    m_scal(j) = m_L.col(j).norm();\n    m_scal(j) = sqrt(m_scal(j));\n  }\n  // Scale and compute the shift for the matrix \n  Scalar mindiag = vals[0];\n  for (int j = 0; j < n; j++){\n    for (int k = colPtr[j]; k < colPtr[j+1]; k++)\n     vals[k] /= (m_scal(j) * m_scal(rowIdx[k]));\n    mindiag = (min)(vals[colPtr[j]], mindiag);\n  }\n  \n  if(mindiag < Scalar(0.)) m_shift = m_shift - mindiag;\n  // Apply the shift to the diagonal elements of the matrix\n  for (int j = 0; j < n; j++)\n    vals[colPtr[j]] += m_shift;\n  // jki version of the Cholesky factorization \n  for (int j=0; j < n; ++j)\n  {  \n    //Left-looking factorize the column j \n    // First, load the jth column into curCol \n    Scalar diag = vals[colPtr[j]];  // It is assumed that only the lower part is stored\n    curCol.setZero();\n    irow.setLinSpaced(n,0,n-1); \n    for (int i = colPtr[j] + 1; i < colPtr[j+1]; i++)\n    {\n      curCol(rowIdx[i]) = vals[i]; \n      irow(rowIdx[i]) = rowIdx[i]; \n    }\n    std::list<int>::iterator k; \n    // Browse all previous columns that will update column j\n    for(k = listCol[j].begin(); k != listCol[j].end(); k++) \n    {\n      int jk = firstElt(*k); // First element to use in the column \n      jk += 1; \n      for (int i = jk; i < colPtr[*k+1]; i++)\n      {\n        curCol(rowIdx[i]) -= vals[i] * vals[jk] ;\n      }\n      updateList(colPtr,rowIdx,vals, *k, jk, firstElt, listCol);\n    }\n    \n    // Scale the current column\n    if(RealScalar(diag) <= 0) \n    {\n      std::cerr << \"\\nNegative diagonal during Incomplete factorization... \"<< j << \"\\n\";\n      m_info = NumericalIssue; \n      return; \n    }\n    RealScalar rdiag = sqrt(RealScalar(diag));\n    vals[colPtr[j]] = rdiag;\n    for (int i = j+1; i < n; i++)\n    {\n      //Scale \n      curCol(i) /= rdiag;\n      //Update the remaining diagonals with curCol\n      vals[colPtr[i]] -= curCol(i) * curCol(i);\n    }\n    // Select the largest p elements\n    //  p is the original number of elements in the column (without the diagonal)\n    int p = colPtr[j+1] - colPtr[j] - 1 ; \n    internal::QuickSplit(curCol, irow, p); \n    // Insert the largest p elements in the matrix\n    int cpt = 0; \n    for (int i = colPtr[j]+1; i < colPtr[j+1]; i++)\n    {\n      vals[i] = curCol(cpt); \n      rowIdx[i] = irow(cpt); \n      cpt ++; \n    }\n    // Get the first smallest row index and put it after the diagonal element\n    Index jk = colPtr(j)+1;\n    updateList(colPtr,rowIdx,vals,j,jk,firstElt,listCol); \n  }\n  m_factorizationIsOk = true; \n  m_isInitialized = true;\n  m_info = Success; \n}\n\ntemplate<typename Scalar, int _UpLo, typename OrderingType>\ntemplate <typename IdxType, typename SclType>\ninline void IncompleteCholesky<Scalar,_UpLo, OrderingType>::updateList(const IdxType& colPtr, IdxType& rowIdx, SclType& vals, const Index& col, const Index& jk, IndexType& firstElt, VectorList& listCol)\n{\n  if (jk < colPtr(col+1) )\n  {\n    Index p = colPtr(col+1) - jk;\n    Index minpos; \n    rowIdx.segment(jk,p).minCoeff(&minpos);\n    minpos += jk;\n    if (rowIdx(minpos) != rowIdx(jk))\n    {\n      //Swap\n      std::swap(rowIdx(jk),rowIdx(minpos));\n      std::swap(vals(jk),vals(minpos));\n    }\n    firstElt(col) = jk;\n    listCol[rowIdx(jk)].push_back(col);\n  }\n}\nnamespace internal {\n\ntemplate<typename _Scalar, int _UpLo, typename OrderingType, typename Rhs>\nstruct solve_retval<IncompleteCholesky<_Scalar,  _UpLo, OrderingType>, Rhs>\n  : solve_retval_base<IncompleteCholesky<_Scalar, _UpLo, OrderingType>, Rhs>\n{\n  typedef IncompleteCholesky<_Scalar, _UpLo, OrderingType> Dec;\n  EIGEN_MAKE_SOLVE_HELPERS(Dec,Rhs)\n\n  template<typename Dest> void evalTo(Dest& dst) const\n  {\n    dec()._solve(rhs(),dst);\n  }\n};\n\n} // end namespace internal\n\n} // end namespace Eigen \n\n#endif\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/IterativeSolvers/IncompleteLU.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2011 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_INCOMPLETE_LU_H\n#define EIGEN_INCOMPLETE_LU_H\n\nnamespace Eigen { \n\ntemplate <typename _Scalar>\nclass IncompleteLU\n{\n    typedef _Scalar Scalar;\n    typedef Matrix<Scalar,Dynamic,1> Vector;\n    typedef typename Vector::Index Index;\n    typedef SparseMatrix<Scalar,RowMajor> FactorType;\n\n  public:\n    typedef Matrix<Scalar,Dynamic,Dynamic> MatrixType;\n\n    IncompleteLU() : m_isInitialized(false) {}\n\n    template<typename MatrixType>\n    IncompleteLU(const MatrixType& mat) : m_isInitialized(false)\n    {\n      compute(mat);\n    }\n\n    Index rows() const { return m_lu.rows(); }\n    Index cols() const { return m_lu.cols(); }\n\n    template<typename MatrixType>\n    IncompleteLU& compute(const MatrixType& mat)\n    {\n      m_lu = mat;\n      int size = mat.cols();\n      Vector diag(size);\n      for(int i=0; i<size; ++i)\n      {\n        typename FactorType::InnerIterator k_it(m_lu,i);\n        for(; k_it && k_it.index()<i; ++k_it)\n        {\n          int k = k_it.index();\n          k_it.valueRef() /= diag(k);\n\n          typename FactorType::InnerIterator j_it(k_it);\n          typename FactorType::InnerIterator kj_it(m_lu, k);\n          while(kj_it && kj_it.index()<=k) ++kj_it;\n          for(++j_it; j_it; )\n          {\n            if(kj_it.index()==j_it.index())\n            {\n              j_it.valueRef() -= k_it.value() * kj_it.value();\n              ++j_it;\n              ++kj_it;\n            }\n            else if(kj_it.index()<j_it.index()) ++kj_it;\n            else                                ++j_it;\n          }\n        }\n        if(k_it && k_it.index()==i) diag(i) = k_it.value();\n        else                        diag(i) = 1;\n      }\n      m_isInitialized = true;\n      return *this;\n    }\n\n    template<typename Rhs, typename Dest>\n    void _solve(const Rhs& b, Dest& x) const\n    {\n      x = m_lu.template triangularView<UnitLower>().solve(b);\n      x = m_lu.template triangularView<Upper>().solve(x);\n    }\n\n    template<typename Rhs> inline const internal::solve_retval<IncompleteLU, Rhs>\n    solve(const MatrixBase<Rhs>& b) const\n    {\n      eigen_assert(m_isInitialized && \"IncompleteLU is not initialized.\");\n      eigen_assert(cols()==b.rows()\n                && \"IncompleteLU::solve(): invalid number of rows of the right hand side matrix b\");\n      return internal::solve_retval<IncompleteLU, Rhs>(*this, b.derived());\n    }\n\n  protected:\n    FactorType m_lu;\n    bool m_isInitialized;\n};\n\nnamespace internal {\n\ntemplate<typename _MatrixType, typename Rhs>\nstruct solve_retval<IncompleteLU<_MatrixType>, Rhs>\n  : solve_retval_base<IncompleteLU<_MatrixType>, Rhs>\n{\n  typedef IncompleteLU<_MatrixType> Dec;\n  EIGEN_MAKE_SOLVE_HELPERS(Dec,Rhs)\n\n  template<typename Dest> void evalTo(Dest& dst) const\n  {\n    dec()._solve(rhs(),dst);\n  }\n};\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_INCOMPLETE_LU_H\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/IterativeSolvers/IterationController.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n\n/* NOTE The class IterationController has been adapted from the iteration\n *      class of the GMM++ and ITL libraries.\n */\n\n//=======================================================================\n// Copyright (C) 1997-2001\n// Authors: Andrew Lumsdaine <lums@osl.iu.edu> \n//          Lie-Quan Lee     <llee@osl.iu.edu>\n//\n// This file is part of the Iterative Template Library\n//\n// You should have received a copy of the License Agreement for the\n// Iterative Template Library along with the software;  see the\n// file LICENSE.  \n//\n// Permission to modify the code and to distribute modified code is\n// granted, provided the text of this NOTICE is retained, a notice that\n// the code was modified is included with the above COPYRIGHT NOTICE and\n// with the COPYRIGHT NOTICE in the LICENSE file, and that the LICENSE\n// file is distributed with the modified code.\n//\n// LICENSOR MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED.\n// By way of example, but not limitation, Licensor MAKES NO\n// REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY\n// PARTICULAR PURPOSE OR THAT THE USE OF THE LICENSED SOFTWARE COMPONENTS\n// OR DOCUMENTATION WILL NOT INFRINGE ANY PATENTS, COPYRIGHTS, TRADEMARKS\n// OR OTHER RIGHTS.\n//=======================================================================\n\n//========================================================================\n//\n// Copyright (C) 2002-2007 Yves Renard\n//\n// This file is a part of GETFEM++\n//\n// Getfem++ is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as\n// published by the Free Software Foundation; version 2.1 of the License.\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 Lesser General Public License for more details.\n// You should have received a copy of the GNU Lesser General Public\n// License along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301,\n// USA.\n//\n//========================================================================\n\n#include \"../../../../Eigen/src/Core/util/NonMPL2.h\"\n\n#ifndef EIGEN_ITERATION_CONTROLLER_H\n#define EIGEN_ITERATION_CONTROLLER_H\n\nnamespace Eigen { \n\n/** \\ingroup IterativeSolvers_Module\n  * \\class IterationController\n  *\n  * \\brief Controls the iterations of the iterative solvers\n  *\n  * This class has been adapted from the iteration class of GMM++ and ITL libraries.\n  *\n  */\nclass IterationController\n{\n  protected :\n    double m_rhsn;        ///< Right hand side norm\n    size_t m_maxiter;     ///< Max. number of iterations\n    int m_noise;          ///< if noise > 0 iterations are printed\n    double m_resmax;      ///< maximum residual\n    double m_resminreach, m_resadd;\n    size_t m_nit;         ///< iteration number\n    double m_res;         ///< last computed residual\n    bool m_written;\n    void (*m_callback)(const IterationController&);\n  public :\n\n    void init()\n    {\n      m_nit = 0; m_res = 0.0; m_written = false;\n      m_resminreach = 1E50; m_resadd = 0.0;\n      m_callback = 0;\n    }\n\n    IterationController(double r = 1.0E-8, int noi = 0, size_t mit = size_t(-1))\n      : m_rhsn(1.0), m_maxiter(mit), m_noise(noi), m_resmax(r) { init(); }\n\n    void operator ++(int) { m_nit++; m_written = false; m_resadd += m_res; }\n    void operator ++() { (*this)++; }\n\n    bool first() { return m_nit == 0; }\n\n    /* get/set the \"noisyness\" (verbosity) of the solvers */\n    int noiseLevel() const { return m_noise; }\n    void setNoiseLevel(int n) { m_noise = n; }\n    void reduceNoiseLevel() { if (m_noise > 0) m_noise--; }\n\n    double maxResidual() const { return m_resmax; }\n    void setMaxResidual(double r) { m_resmax = r; }\n\n    double residual() const { return m_res; }\n\n    /* change the user-definable callback, called after each iteration */\n    void setCallback(void (*t)(const IterationController&))\n    {\n      m_callback = t;\n    }\n\n    size_t iteration() const { return m_nit; }\n    void setIteration(size_t i) { m_nit = i; }\n\n    size_t maxIterarions() const { return m_maxiter; }\n    void setMaxIterations(size_t i) { m_maxiter = i; }\n\n    double rhsNorm() const { return m_rhsn; }\n    void setRhsNorm(double r) { m_rhsn = r; }\n\n    bool converged() const { return m_res <= m_rhsn * m_resmax; }\n    bool converged(double nr)\n    {\n      using std::abs;\n      m_res = abs(nr); \n      m_resminreach = (std::min)(m_resminreach, m_res);\n      return converged();\n    }\n    template<typename VectorType> bool converged(const VectorType &v)\n    { return converged(v.squaredNorm()); }\n\n    bool finished(double nr)\n    {\n      if (m_callback) m_callback(*this);\n      if (m_noise > 0 && !m_written)\n      {\n        converged(nr);\n        m_written = true;\n      }\n      return (m_nit >= m_maxiter || converged(nr));\n    }\n    template <typename VectorType>\n    bool finished(const MatrixBase<VectorType> &v)\n    { return finished(double(v.squaredNorm())); }\n\n};\n\n} // end namespace Eigen\n\n#endif // EIGEN_ITERATION_CONTROLLER_H\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/IterativeSolvers/MINRES.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Giacomo Po <gpo@ucla.edu>\n// Copyright (C) 2011 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n#ifndef EIGEN_MINRES_H_\n#define EIGEN_MINRES_H_\n\n\nnamespace Eigen {\n    \n    namespace internal {\n        \n        /** \\internal Low-level MINRES algorithm\n         * \\param mat The matrix A\n         * \\param rhs The right hand side vector b\n         * \\param x On input and initial solution, on output the computed solution.\n         * \\param precond A right preconditioner being able to efficiently solve for an\n         *                approximation of Ax=b (regardless of b)\n         * \\param iters On input the max number of iteration, on output the number of performed iterations.\n         * \\param tol_error On input the tolerance error, on output an estimation of the relative error.\n         */\n        template<typename MatrixType, typename Rhs, typename Dest, typename Preconditioner>\n        EIGEN_DONT_INLINE\n        void minres(const MatrixType& mat, const Rhs& rhs, Dest& x,\n                    const Preconditioner& precond, int& iters,\n                    typename Dest::RealScalar& tol_error)\n        {\n            using std::sqrt;\n            typedef typename Dest::RealScalar RealScalar;\n            typedef typename Dest::Scalar Scalar;\n            typedef Matrix<Scalar,Dynamic,1> VectorType;\n\n            // Check for zero rhs\n            const RealScalar rhsNorm2(rhs.squaredNorm());\n            if(rhsNorm2 == 0)\n            {\n                x.setZero();\n                iters = 0;\n                tol_error = 0;\n                return;\n            }\n            \n            // initialize\n            const int maxIters(iters);  // initialize maxIters to iters\n            const int N(mat.cols());    // the size of the matrix\n            const RealScalar threshold2(tol_error*tol_error*rhsNorm2); // convergence threshold (compared to residualNorm2)\n            \n            // Initialize preconditioned Lanczos\n            VectorType v_old(N); // will be initialized inside loop\n            VectorType v( VectorType::Zero(N) ); //initialize v\n            VectorType v_new(rhs-mat*x); //initialize v_new\n            RealScalar residualNorm2(v_new.squaredNorm());\n            VectorType w(N); // will be initialized inside loop\n            VectorType w_new(precond.solve(v_new)); // initialize w_new\n//            RealScalar beta; // will be initialized inside loop\n            RealScalar beta_new2(v_new.dot(w_new));\n            eigen_assert(beta_new2 >= 0.0 && \"PRECONDITIONER IS NOT POSITIVE DEFINITE\");\n            RealScalar beta_new(sqrt(beta_new2));\n            const RealScalar beta_one(beta_new);\n            v_new /= beta_new;\n            w_new /= beta_new;\n            // Initialize other variables\n            RealScalar c(1.0); // the cosine of the Givens rotation\n            RealScalar c_old(1.0);\n            RealScalar s(0.0); // the sine of the Givens rotation\n            RealScalar s_old(0.0); // the sine of the Givens rotation\n            VectorType p_oold(N); // will be initialized in loop\n            VectorType p_old(VectorType::Zero(N)); // initialize p_old=0\n            VectorType p(p_old); // initialize p=0\n            RealScalar eta(1.0);\n                        \n            iters = 0; // reset iters\n            while ( iters < maxIters )\n            {\n                // Preconditioned Lanczos\n                /* Note that there are 4 variants on the Lanczos algorithm. These are\n                 * described in Paige, C. C. (1972). Computational variants of\n                 * the Lanczos method for the eigenproblem. IMA Journal of Applied\n                 * Mathematics, 10(3), 373–381. The current implementation corresponds \n                 * to the case A(2,7) in the paper. It also corresponds to \n                 * algorithm 6.14 in Y. Saad, Iterative Methods ￼￼￼for Sparse Linear\n                 * Systems, 2003 p.173. For the preconditioned version see \n                 * A. Greenbaum, Iterative Methods for Solving Linear Systems, SIAM (1987).\n                 */\n                const RealScalar beta(beta_new);\n                v_old = v; // update: at first time step, this makes v_old = 0 so value of beta doesn't matter\n//                const VectorType v_old(v); // NOT SURE IF CREATING v_old EVERY ITERATION IS EFFICIENT\n                v = v_new; // update\n                w = w_new; // update\n//                const VectorType w(w_new); // NOT SURE IF CREATING w EVERY ITERATION IS EFFICIENT\n                v_new.noalias() = mat*w - beta*v_old; // compute v_new\n                const RealScalar alpha = v_new.dot(w);\n                v_new -= alpha*v; // overwrite v_new\n                w_new = precond.solve(v_new); // overwrite w_new\n                beta_new2 = v_new.dot(w_new); // compute beta_new\n                eigen_assert(beta_new2 >= 0.0 && \"PRECONDITIONER IS NOT POSITIVE DEFINITE\");\n                beta_new = sqrt(beta_new2); // compute beta_new\n                v_new /= beta_new; // overwrite v_new for next iteration\n                w_new /= beta_new; // overwrite w_new for next iteration\n                \n                // Givens rotation\n                const RealScalar r2 =s*alpha+c*c_old*beta; // s, s_old, c and c_old are still from previous iteration\n                const RealScalar r3 =s_old*beta; // s, s_old, c and c_old are still from previous iteration\n                const RealScalar r1_hat=c*alpha-c_old*s*beta;\n                const RealScalar r1 =sqrt( std::pow(r1_hat,2) + std::pow(beta_new,2) );\n                c_old = c; // store for next iteration\n                s_old = s; // store for next iteration\n                c=r1_hat/r1; // new cosine\n                s=beta_new/r1; // new sine\n                \n                // Update solution\n                p_oold = p_old;\n//                const VectorType p_oold(p_old); // NOT SURE IF CREATING p_oold EVERY ITERATION IS EFFICIENT\n                p_old = p;\n                p.noalias()=(w-r2*p_old-r3*p_oold) /r1; // IS NOALIAS REQUIRED?\n                x += beta_one*c*eta*p;\n                \n                /* Update the squared residual. Note that this is the estimated residual.\n                The real residual |Ax-b|^2 may be slightly larger */\n                residualNorm2 *= s*s;\n                \n                if ( residualNorm2 < threshold2)\n                {\n                    break;\n                }\n                \n                eta=-s*eta; // update eta\n                iters++; // increment iteration number (for output purposes)\n            }\n            \n            /* Compute error. Note that this is the estimated error. The real \n             error |Ax-b|/|b| may be slightly larger */\n            tol_error = std::sqrt(residualNorm2 / rhsNorm2);\n        }\n        \n    }\n    \n    template< typename _MatrixType, int _UpLo=Lower,\n    typename _Preconditioner = IdentityPreconditioner>\n//    typename _Preconditioner = IdentityPreconditioner<typename _MatrixType::Scalar> > // preconditioner must be positive definite\n    class MINRES;\n    \n    namespace internal {\n        \n        template< typename _MatrixType, int _UpLo, typename _Preconditioner>\n        struct traits<MINRES<_MatrixType,_UpLo,_Preconditioner> >\n        {\n            typedef _MatrixType MatrixType;\n            typedef _Preconditioner Preconditioner;\n        };\n        \n    }\n    \n    /** \\ingroup IterativeLinearSolvers_Module\n     * \\brief A minimal residual solver for sparse symmetric problems\n     *\n     * This class allows to solve for A.x = b sparse linear problems using the MINRES algorithm\n     * of Paige and Saunders (1975). The sparse matrix A must be symmetric (possibly indefinite).\n     * The vectors x and b can be either dense or sparse.\n     *\n     * \\tparam _MatrixType the type of the sparse matrix A, can be a dense or a sparse matrix.\n     * \\tparam _UpLo the triangular part that will be used for the computations. It can be Lower\n     *               or Upper. Default is Lower.\n     * \\tparam _Preconditioner the type of the preconditioner. Default is DiagonalPreconditioner\n     *\n     * The maximal number of iterations and tolerance value can be controlled via the setMaxIterations()\n     * and setTolerance() methods. The defaults are the size of the problem for the maximal number of iterations\n     * and NumTraits<Scalar>::epsilon() for the tolerance.\n     *\n     * This class can be used as the direct solver classes. Here is a typical usage example:\n     * \\code\n     * int n = 10000;\n     * VectorXd x(n), b(n);\n     * SparseMatrix<double> A(n,n);\n     * // fill A and b\n     * MINRES<SparseMatrix<double> > mr;\n     * mr.compute(A);\n     * x = mr.solve(b);\n     * std::cout << \"#iterations:     \" << mr.iterations() << std::endl;\n     * std::cout << \"estimated error: \" << mr.error()      << std::endl;\n     * // update b, and solve again\n     * x = mr.solve(b);\n     * \\endcode\n     *\n     * By default the iterations start with x=0 as an initial guess of the solution.\n     * One can control the start using the solveWithGuess() method.\n     *\n     * \\sa class ConjugateGradient, BiCGSTAB, SimplicialCholesky, DiagonalPreconditioner, IdentityPreconditioner\n     */\n    template< typename _MatrixType, int _UpLo, typename _Preconditioner>\n    class MINRES : public IterativeSolverBase<MINRES<_MatrixType,_UpLo,_Preconditioner> >\n    {\n        \n        typedef IterativeSolverBase<MINRES> Base;\n        using Base::mp_matrix;\n        using Base::m_error;\n        using Base::m_iterations;\n        using Base::m_info;\n        using Base::m_isInitialized;\n    public:\n        typedef _MatrixType MatrixType;\n        typedef typename MatrixType::Scalar Scalar;\n        typedef typename MatrixType::Index Index;\n        typedef typename MatrixType::RealScalar RealScalar;\n        typedef _Preconditioner Preconditioner;\n        \n        enum {UpLo = _UpLo};\n        \n    public:\n        \n        /** Default constructor. */\n        MINRES() : Base() {}\n        \n        /** Initialize the solver with matrix \\a A for further \\c Ax=b solving.\n         *\n         * This constructor is a shortcut for the default constructor followed\n         * by a call to compute().\n         *\n         * \\warning this class stores a reference to the matrix A as well as some\n         * precomputed values that depend on it. Therefore, if \\a A is changed\n         * this class becomes invalid. Call compute() to update it with the new\n         * matrix A, or modify a copy of A.\n         */\n        template<typename MatrixDerived>\n        explicit MINRES(const EigenBase<MatrixDerived>& A) : Base(A.derived()) {}\n        \n        /** Destructor. */\n        ~MINRES(){}\n\t\t\n        /** \\returns the solution x of \\f$ A x = b \\f$ using the current decomposition of A\n         * \\a x0 as an initial solution.\n         *\n         * \\sa compute()\n         */\n        template<typename Rhs,typename Guess>\n        inline const internal::solve_retval_with_guess<MINRES, Rhs, Guess>\n        solveWithGuess(const MatrixBase<Rhs>& b, const Guess& x0) const\n        {\n            eigen_assert(m_isInitialized && \"MINRES is not initialized.\");\n            eigen_assert(Base::rows()==b.rows()\n                         && \"MINRES::solve(): invalid number of rows of the right hand side matrix b\");\n            return internal::solve_retval_with_guess\n            <MINRES, Rhs, Guess>(*this, b.derived(), x0);\n        }\n        \n        /** \\internal */\n        template<typename Rhs,typename Dest>\n        void _solveWithGuess(const Rhs& b, Dest& x) const\n        {\n            typedef typename internal::conditional<UpLo==(Lower|Upper),\n                                                   const MatrixType&,\n                                                   SparseSelfAdjointView<const MatrixType, UpLo>\n                                                  >::type MatrixWrapperType;\n                                          \n            m_iterations = Base::maxIterations();\n            m_error = Base::m_tolerance;\n            \n            for(int j=0; j<b.cols(); ++j)\n            {\n                m_iterations = Base::maxIterations();\n                m_error = Base::m_tolerance;\n                \n                typename Dest::ColXpr xj(x,j);\n                internal::minres(MatrixWrapperType(*mp_matrix), b.col(j), xj,\n                                 Base::m_preconditioner, m_iterations, m_error);\n            }\n            \n            m_isInitialized = true;\n            m_info = m_error <= Base::m_tolerance ? Success : NoConvergence;\n        }\n        \n        /** \\internal */\n        template<typename Rhs,typename Dest>\n        void _solve(const Rhs& b, Dest& x) const\n        {\n            x.setZero();\n            _solveWithGuess(b,x);\n        }\n        \n    protected:\n        \n    };\n    \n    namespace internal {\n        \n        template<typename _MatrixType, int _UpLo, typename _Preconditioner, typename Rhs>\n        struct solve_retval<MINRES<_MatrixType,_UpLo,_Preconditioner>, Rhs>\n        : solve_retval_base<MINRES<_MatrixType,_UpLo,_Preconditioner>, Rhs>\n        {\n            typedef MINRES<_MatrixType,_UpLo,_Preconditioner> Dec;\n            EIGEN_MAKE_SOLVE_HELPERS(Dec,Rhs)\n            \n            template<typename Dest> void evalTo(Dest& dst) const\n            {\n                dec()._solve(rhs(),dst);\n            }\n        };\n        \n    } // end namespace internal\n    \n} // end namespace Eigen\n\n#endif // EIGEN_MINRES_H\n\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/IterativeSolvers/Scaling.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Desire NUENTSA WAKAM <desire.nuentsa_wakam@inria.fr\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_ITERSCALING_H\n#define EIGEN_ITERSCALING_H\n/**\n  * \\ingroup IterativeSolvers_Module\n  * \\brief iterative scaling algorithm to equilibrate rows and column norms in matrices\n  * \n  * This class can be used as a preprocessing tool to accelerate the convergence of iterative methods \n  * \n  * This feature is  useful to limit the pivoting amount during LU/ILU factorization\n  * The  scaling strategy as presented here preserves the symmetry of the problem\n  * NOTE It is assumed that the matrix does not have empty row or column, \n  * \n  * Example with key steps \n  * \\code\n  * VectorXd x(n), b(n);\n  * SparseMatrix<double> A;\n  * // fill A and b;\n  * IterScaling<SparseMatrix<double> > scal; \n  * // Compute the left and right scaling vectors. The matrix is equilibrated at output\n  * scal.computeRef(A); \n  * // Scale the right hand side\n  * b = scal.LeftScaling().cwiseProduct(b); \n  * // Now, solve the equilibrated linear system with any available solver\n  * \n  * // Scale back the computed solution\n  * x = scal.RightScaling().cwiseProduct(x); \n  * \\endcode\n  * \n  * \\tparam _MatrixType the type of the matrix. It should be a real square sparsematrix\n  * \n  * References : D. Ruiz and B. Ucar, A Symmetry Preserving Algorithm for Matrix Scaling, INRIA Research report RR-7552\n  * \n  * \\sa \\ref IncompleteLUT \n  */\nnamespace Eigen {\nusing std::abs; \ntemplate<typename _MatrixType>\nclass IterScaling\n{\n  public:\n    typedef _MatrixType MatrixType; \n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename MatrixType::Index Index;\n    \n  public:\n    IterScaling() { init(); }\n    \n    IterScaling(const MatrixType& matrix)\n    {\n      init();\n      compute(matrix);\n    }\n    \n    ~IterScaling() { }\n    \n    /** \n     * Compute the left and right diagonal matrices to scale the input matrix @p mat\n     * \n     * FIXME This algorithm will be modified such that the diagonal elements are permuted on the diagonal. \n     * \n     * \\sa LeftScaling() RightScaling()\n     */\n    void compute (const MatrixType& mat)\n    {\n      int m = mat.rows(); \n      int n = mat.cols();\n      eigen_assert((m>0 && m == n) && \"Please give a non - empty matrix\");\n      m_left.resize(m); \n      m_right.resize(n);\n      m_left.setOnes();\n      m_right.setOnes();\n      m_matrix = mat;\n      VectorXd Dr, Dc, DrRes, DcRes; // Temporary Left and right scaling vectors\n      Dr.resize(m); Dc.resize(n);\n      DrRes.resize(m); DcRes.resize(n);\n      double EpsRow = 1.0, EpsCol = 1.0;\n      int its = 0; \n      do\n      { // Iterate until the infinite norm of each row and column is approximately 1\n        // Get the maximum value in each row and column\n        Dr.setZero(); Dc.setZero();\n        for (int k=0; k<m_matrix.outerSize(); ++k)\n        {\n          for (typename MatrixType::InnerIterator it(m_matrix, k); it; ++it)\n          {\n            if ( Dr(it.row()) < abs(it.value()) )\n              Dr(it.row()) = abs(it.value());\n            \n            if ( Dc(it.col()) < abs(it.value()) )\n              Dc(it.col()) = abs(it.value());\n          }\n        }\n        for (int i = 0; i < m; ++i) \n        {\n          Dr(i) = std::sqrt(Dr(i));\n          Dc(i) = std::sqrt(Dc(i));\n        }\n        // Save the scaling factors \n        for (int i = 0; i < m; ++i) \n        {\n          m_left(i) /= Dr(i);\n          m_right(i) /= Dc(i);\n        }\n        // Scale the rows and the columns of the matrix\n        DrRes.setZero(); DcRes.setZero(); \n        for (int k=0; k<m_matrix.outerSize(); ++k)\n        {\n          for (typename MatrixType::InnerIterator it(m_matrix, k); it; ++it)\n          {\n            it.valueRef() = it.value()/( Dr(it.row()) * Dc(it.col()) );\n            // Accumulate the norms of the row and column vectors   \n            if ( DrRes(it.row()) < abs(it.value()) )\n              DrRes(it.row()) = abs(it.value());\n            \n            if ( DcRes(it.col()) < abs(it.value()) )\n              DcRes(it.col()) = abs(it.value());\n          }\n        }  \n        DrRes.array() = (1-DrRes.array()).abs();\n        EpsRow = DrRes.maxCoeff();\n        DcRes.array() = (1-DcRes.array()).abs();\n        EpsCol = DcRes.maxCoeff();\n        its++;\n      }while ( (EpsRow >m_tol || EpsCol > m_tol) && (its < m_maxits) );\n      m_isInitialized = true;\n    }\n    /** Compute the left and right vectors to scale the vectors\n     * the input matrix is scaled with the computed vectors at output\n     * \n     * \\sa compute()\n     */\n    void computeRef (MatrixType& mat)\n    {\n      compute (mat);\n      mat = m_matrix;\n    }\n    /** Get the vector to scale the rows of the matrix \n     */\n    VectorXd& LeftScaling()\n    {\n      return m_left;\n    }\n    \n    /** Get the vector to scale the columns of the matrix \n     */\n    VectorXd& RightScaling()\n    {\n      return m_right;\n    }\n    \n    /** Set the tolerance for the convergence of the iterative scaling algorithm\n     */\n    void setTolerance(double tol)\n    {\n      m_tol = tol; \n    }\n      \n  protected:\n    \n    void init()\n    {\n      m_tol = 1e-10;\n      m_maxits = 5;\n      m_isInitialized = false;\n    }\n    \n    MatrixType m_matrix;\n    mutable ComputationInfo m_info; \n    bool m_isInitialized; \n    VectorXd m_left; // Left scaling vector\n    VectorXd m_right; // m_right scaling vector\n    double m_tol; \n    int m_maxits; // Maximum number of iterations allowed\n};\n}\n#endif\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/KroneckerProduct/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_KroneckerProduct_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_KroneckerProduct_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/unsupported/Eigen/src/KroneckerProduct COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/KroneckerProduct/KroneckerTensorProduct.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2011 Kolja Brix <brix@igpm.rwth-aachen.de>\n// Copyright (C) 2011 Andreas Platen <andiplaten@gmx.de>\n// Copyright (C) 2012 Chen-Pang He <jdh8@ms63.hinet.net>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef KRONECKER_TENSOR_PRODUCT_H\n#define KRONECKER_TENSOR_PRODUCT_H\n\nnamespace Eigen { \n\ntemplate<typename Scalar, int Options, typename Index> class SparseMatrix;\n\n/*!\n * \\brief Kronecker tensor product helper class for dense matrices\n *\n * This class is the return value of kroneckerProduct(MatrixBase,\n * MatrixBase). Use the function rather than construct this class\n * directly to avoid specifying template prarameters.\n *\n * \\tparam Lhs  Type of the left-hand side, a matrix expression.\n * \\tparam Rhs  Type of the rignt-hand side, a matrix expression.\n */\ntemplate<typename Lhs, typename Rhs>\nclass KroneckerProduct : public ReturnByValue<KroneckerProduct<Lhs,Rhs> >\n{\n  private:\n    typedef ReturnByValue<KroneckerProduct> Base;\n    typedef typename Base::Scalar Scalar;\n    typedef typename Base::Index Index;\n\n  public:\n    /*! \\brief Constructor. */\n    KroneckerProduct(const Lhs& A, const Rhs& B)\n      : m_A(A), m_B(B)\n    {}\n\n    /*! \\brief Evaluate the Kronecker tensor product. */\n    template<typename Dest> void evalTo(Dest& dst) const;\n    \n    inline Index rows() const { return m_A.rows() * m_B.rows(); }\n    inline Index cols() const { return m_A.cols() * m_B.cols(); }\n\n    Scalar coeff(Index row, Index col) const\n    {\n      return m_A.coeff(row / m_B.rows(), col / m_B.cols()) *\n             m_B.coeff(row % m_B.rows(), col % m_B.cols());\n    }\n\n    Scalar coeff(Index i) const\n    {\n      EIGEN_STATIC_ASSERT_VECTOR_ONLY(KroneckerProduct);\n      return m_A.coeff(i / m_A.size()) * m_B.coeff(i % m_A.size());\n    }\n\n  private:\n    typename Lhs::Nested m_A;\n    typename Rhs::Nested m_B;\n};\n\n/*!\n * \\brief Kronecker tensor product helper class for sparse matrices\n *\n * If at least one of the operands is a sparse matrix expression,\n * then this class is returned and evaluates into a sparse matrix.\n *\n * This class is the return value of kroneckerProduct(EigenBase,\n * EigenBase). Use the function rather than construct this class\n * directly to avoid specifying template prarameters.\n *\n * \\tparam Lhs  Type of the left-hand side, a matrix expression.\n * \\tparam Rhs  Type of the rignt-hand side, a matrix expression.\n */\ntemplate<typename Lhs, typename Rhs>\nclass KroneckerProductSparse : public EigenBase<KroneckerProductSparse<Lhs,Rhs> >\n{\n  private:\n    typedef typename internal::traits<KroneckerProductSparse>::Index Index;\n\n  public:\n    /*! \\brief Constructor. */\n    KroneckerProductSparse(const Lhs& A, const Rhs& B)\n      : m_A(A), m_B(B)\n    {}\n\n    /*! \\brief Evaluate the Kronecker tensor product. */\n    template<typename Dest> void evalTo(Dest& dst) const;\n    \n    inline Index rows() const { return m_A.rows() * m_B.rows(); }\n    inline Index cols() const { return m_A.cols() * m_B.cols(); }\n\n    template<typename Scalar, int Options, typename Index>\n    operator SparseMatrix<Scalar, Options, Index>()\n    {\n      SparseMatrix<Scalar, Options, Index> result;\n      evalTo(result.derived());\n      return result;\n    }\n\n  private:\n    typename Lhs::Nested m_A;\n    typename Rhs::Nested m_B;\n};\n\ntemplate<typename Lhs, typename Rhs>\ntemplate<typename Dest>\nvoid KroneckerProduct<Lhs,Rhs>::evalTo(Dest& dst) const\n{\n  const int BlockRows = Rhs::RowsAtCompileTime,\n            BlockCols = Rhs::ColsAtCompileTime;\n  const Index Br = m_B.rows(),\n              Bc = m_B.cols();\n  for (Index i=0; i < m_A.rows(); ++i)\n    for (Index j=0; j < m_A.cols(); ++j)\n      Block<Dest,BlockRows,BlockCols>(dst,i*Br,j*Bc,Br,Bc) = m_A.coeff(i,j) * m_B;\n}\n\ntemplate<typename Lhs, typename Rhs>\ntemplate<typename Dest>\nvoid KroneckerProductSparse<Lhs,Rhs>::evalTo(Dest& dst) const\n{\n  const Index Br = m_B.rows(),\n              Bc = m_B.cols();\n  dst.resize(rows(),cols());\n  dst.resizeNonZeros(0);\n  dst.reserve(m_A.nonZeros() * m_B.nonZeros());\n\n  for (Index kA=0; kA < m_A.outerSize(); ++kA)\n  {\n    for (Index kB=0; kB < m_B.outerSize(); ++kB)\n    {\n      for (typename Lhs::InnerIterator itA(m_A,kA); itA; ++itA)\n      {\n        for (typename Rhs::InnerIterator itB(m_B,kB); itB; ++itB)\n        {\n          const Index i = itA.row() * Br + itB.row(),\n                      j = itA.col() * Bc + itB.col();\n          dst.insert(i,j) = itA.value() * itB.value();\n        }\n      }\n    }\n  }\n}\n\nnamespace internal {\n\ntemplate<typename _Lhs, typename _Rhs>\nstruct traits<KroneckerProduct<_Lhs,_Rhs> >\n{\n  typedef typename remove_all<_Lhs>::type Lhs;\n  typedef typename remove_all<_Rhs>::type Rhs;\n  typedef typename scalar_product_traits<typename Lhs::Scalar, typename Rhs::Scalar>::ReturnType Scalar;\n\n  enum {\n    Rows = size_at_compile_time<traits<Lhs>::RowsAtCompileTime, traits<Rhs>::RowsAtCompileTime>::ret,\n    Cols = size_at_compile_time<traits<Lhs>::ColsAtCompileTime, traits<Rhs>::ColsAtCompileTime>::ret,\n    MaxRows = size_at_compile_time<traits<Lhs>::MaxRowsAtCompileTime, traits<Rhs>::MaxRowsAtCompileTime>::ret,\n    MaxCols = size_at_compile_time<traits<Lhs>::MaxColsAtCompileTime, traits<Rhs>::MaxColsAtCompileTime>::ret,\n    CoeffReadCost = Lhs::CoeffReadCost + Rhs::CoeffReadCost + NumTraits<Scalar>::MulCost\n  };\n\n  typedef Matrix<Scalar,Rows,Cols> ReturnType;\n};\n\ntemplate<typename _Lhs, typename _Rhs>\nstruct traits<KroneckerProductSparse<_Lhs,_Rhs> >\n{\n  typedef MatrixXpr XprKind;\n  typedef typename remove_all<_Lhs>::type Lhs;\n  typedef typename remove_all<_Rhs>::type Rhs;\n  typedef typename scalar_product_traits<typename Lhs::Scalar, typename Rhs::Scalar>::ReturnType Scalar;\n  typedef typename promote_storage_type<typename traits<Lhs>::StorageKind, typename traits<Rhs>::StorageKind>::ret StorageKind;\n  typedef typename promote_index_type<typename Lhs::Index, typename Rhs::Index>::type Index;\n\n  enum {\n    LhsFlags = Lhs::Flags,\n    RhsFlags = Rhs::Flags,\n\n    RowsAtCompileTime = size_at_compile_time<traits<Lhs>::RowsAtCompileTime, traits<Rhs>::RowsAtCompileTime>::ret,\n    ColsAtCompileTime = size_at_compile_time<traits<Lhs>::ColsAtCompileTime, traits<Rhs>::ColsAtCompileTime>::ret,\n    MaxRowsAtCompileTime = size_at_compile_time<traits<Lhs>::MaxRowsAtCompileTime, traits<Rhs>::MaxRowsAtCompileTime>::ret,\n    MaxColsAtCompileTime = size_at_compile_time<traits<Lhs>::MaxColsAtCompileTime, traits<Rhs>::MaxColsAtCompileTime>::ret,\n\n    EvalToRowMajor = (LhsFlags & RhsFlags & RowMajorBit),\n    RemovedBits = ~(EvalToRowMajor ? 0 : RowMajorBit),\n\n    Flags = ((LhsFlags | RhsFlags) & HereditaryBits & RemovedBits)\n          | EvalBeforeNestingBit | EvalBeforeAssigningBit,\n    CoeffReadCost = Dynamic\n  };\n};\n\n} // end namespace internal\n\n/*!\n * \\ingroup KroneckerProduct_Module\n *\n * Computes Kronecker tensor product of two dense matrices\n *\n * \\warning If you want to replace a matrix by its Kronecker product\n *          with some matrix, do \\b NOT do this:\n * \\code\n * A = kroneckerProduct(A,B); // bug!!! caused by aliasing effect\n * \\endcode\n * instead, use eval() to work around this:\n * \\code\n * A = kroneckerProduct(A,B).eval();\n * \\endcode\n *\n * \\param a  Dense matrix a\n * \\param b  Dense matrix b\n * \\return   Kronecker tensor product of a and b\n */\ntemplate<typename A, typename B>\nKroneckerProduct<A,B> kroneckerProduct(const MatrixBase<A>& a, const MatrixBase<B>& b)\n{\n  return KroneckerProduct<A, B>(a.derived(), b.derived());\n}\n\n/*!\n * \\ingroup KroneckerProduct_Module\n *\n * Computes Kronecker tensor product of two matrices, at least one of\n * which is sparse\n *\n * \\param a  Dense/sparse matrix a\n * \\param b  Dense/sparse matrix b\n * \\return   Kronecker tensor product of a and b, stored in a sparse\n *           matrix\n */\ntemplate<typename A, typename B>\nKroneckerProductSparse<A,B> kroneckerProduct(const EigenBase<A>& a, const EigenBase<B>& b)\n{\n  return KroneckerProductSparse<A,B>(a.derived(), b.derived());\n}\n\n} // end namespace Eigen\n\n#endif // KRONECKER_TENSOR_PRODUCT_H\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/LevenbergMarquardt/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_LevenbergMarquardt_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_LevenbergMarquardt_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/unsupported/Eigen/src/LevenbergMarquardt COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/LevenbergMarquardt/CopyrightMINPACK.txt",
    "content": "Minpack Copyright Notice (1999) University of Chicago.  All rights reserved\n\nRedistribution and use in source and binary forms, with or\nwithout modification, are permitted provided that the\nfollowing conditions are met:\n\n1. Redistributions of source code must retain the above\ncopyright notice, this list of conditions and the following\ndisclaimer.\n\n2. Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following\ndisclaimer in the documentation and/or other materials\nprovided with the distribution.\n\n3. The end-user documentation included with the\nredistribution, if any, must include the following\nacknowledgment:\n\n   \"This product includes software developed by the\n   University of Chicago, as Operator of Argonne National\n   Laboratory.\n\nAlternately, this acknowledgment may appear in the software\nitself, if and wherever such third-party acknowledgments\nnormally appear.\n\n4. WARRANTY DISCLAIMER. THE SOFTWARE IS SUPPLIED \"AS IS\"\nWITHOUT WARRANTY OF ANY KIND. THE COPYRIGHT HOLDER, THE\nUNITED STATES, THE UNITED STATES DEPARTMENT OF ENERGY, AND\nTHEIR EMPLOYEES: (1) DISCLAIM ANY WARRANTIES, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO ANY IMPLIED WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE\nOR NON-INFRINGEMENT, (2) DO NOT ASSUME ANY LEGAL LIABILITY\nOR RESPONSIBILITY FOR THE ACCURACY, COMPLETENESS, OR\nUSEFULNESS OF THE SOFTWARE, (3) DO NOT REPRESENT THAT USE OF\nTHE SOFTWARE WOULD NOT INFRINGE PRIVATELY OWNED RIGHTS, (4)\nDO NOT WARRANT THAT THE SOFTWARE WILL FUNCTION\nUNINTERRUPTED, THAT IT IS ERROR-FREE OR THAT ANY ERRORS WILL\nBE CORRECTED.\n\n5. LIMITATION OF LIABILITY. IN NO EVENT WILL THE COPYRIGHT\nHOLDER, THE UNITED STATES, THE UNITED STATES DEPARTMENT OF\nENERGY, OR THEIR EMPLOYEES: BE LIABLE FOR ANY INDIRECT,\nINCIDENTAL, CONSEQUENTIAL, SPECIAL OR PUNITIVE DAMAGES OF\nANY KIND OR NATURE, INCLUDING BUT NOT LIMITED TO LOSS OF\nPROFITS OR LOSS OF DATA, FOR ANY REASON WHATSOEVER, WHETHER\nSUCH LIABILITY IS ASSERTED ON THE BASIS OF CONTRACT, TORT\n(INCLUDING NEGLIGENCE OR STRICT LIABILITY), OR OTHERWISE,\nEVEN IF ANY OF SAID PARTIES HAS BEEN WARNED OF THE\nPOSSIBILITY OF SUCH LOSS OR DAMAGES.\n\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/LevenbergMarquardt/LMcovar.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// This code initially comes from MINPACK whose original authors are:\n// Copyright Jorge More - Argonne National Laboratory\n// Copyright Burt Garbow - Argonne National Laboratory\n// Copyright Ken Hillstrom - Argonne National Laboratory\n//\n// This Source Code Form is subject to the terms of the Minpack license\n// (a BSD-like license) described in the campaigned CopyrightMINPACK.txt file.\n\n#ifndef EIGEN_LMCOVAR_H\n#define EIGEN_LMCOVAR_H\n\nnamespace Eigen { \n\nnamespace internal {\n\ntemplate <typename Scalar>\nvoid covar(\n        Matrix< Scalar, Dynamic, Dynamic > &r,\n        const VectorXi& ipvt,\n        Scalar tol = std::sqrt(NumTraits<Scalar>::epsilon()) )\n{\n    using std::abs;\n    typedef DenseIndex Index;\n    /* Local variables */\n    Index i, j, k, l, ii, jj;\n    bool sing;\n    Scalar temp;\n\n    /* Function Body */\n    const Index n = r.cols();\n    const Scalar tolr = tol * abs(r(0,0));\n    Matrix< Scalar, Dynamic, 1 > wa(n);\n    eigen_assert(ipvt.size()==n);\n\n    /* form the inverse of r in the full upper triangle of r. */\n    l = -1;\n    for (k = 0; k < n; ++k)\n        if (abs(r(k,k)) > tolr) {\n            r(k,k) = 1. / r(k,k);\n            for (j = 0; j <= k-1; ++j) {\n                temp = r(k,k) * r(j,k);\n                r(j,k) = 0.;\n                r.col(k).head(j+1) -= r.col(j).head(j+1) * temp;\n            }\n            l = k;\n        }\n\n    /* form the full upper triangle of the inverse of (r transpose)*r */\n    /* in the full upper triangle of r. */\n    for (k = 0; k <= l; ++k) {\n        for (j = 0; j <= k-1; ++j)\n            r.col(j).head(j+1) += r.col(k).head(j+1) * r(j,k);\n        r.col(k).head(k+1) *= r(k,k);\n    }\n\n    /* form the full lower triangle of the covariance matrix */\n    /* in the strict lower triangle of r and in wa. */\n    for (j = 0; j < n; ++j) {\n        jj = ipvt[j];\n        sing = j > l;\n        for (i = 0; i <= j; ++i) {\n            if (sing)\n                r(i,j) = 0.;\n            ii = ipvt[i];\n            if (ii > jj)\n                r(ii,jj) = r(i,j);\n            if (ii < jj)\n                r(jj,ii) = r(i,j);\n        }\n        wa[jj] = r(j,j);\n    }\n\n    /* symmetrize the covariance matrix in r. */\n    r.topLeftCorner(n,n).template triangularView<StrictlyUpper>() = r.topLeftCorner(n,n).transpose();\n    r.diagonal() = wa;\n}\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_LMCOVAR_H\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/LevenbergMarquardt/LMonestep.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Thomas Capricelli <orzel@freehackers.org>\n//\n// This code initially comes from MINPACK whose original authors are:\n// Copyright Jorge More - Argonne National Laboratory\n// Copyright Burt Garbow - Argonne National Laboratory\n// Copyright Ken Hillstrom - Argonne National Laboratory\n//\n// This Source Code Form is subject to the terms of the Minpack license\n// (a BSD-like license) described in the campaigned CopyrightMINPACK.txt file.\n\n#ifndef EIGEN_LMONESTEP_H\n#define EIGEN_LMONESTEP_H\n\nnamespace Eigen {\n\ntemplate<typename FunctorType>\nLevenbergMarquardtSpace::Status\nLevenbergMarquardt<FunctorType>::minimizeOneStep(FVectorType  &x)\n{\n  using std::abs;\n  using std::sqrt;\n  RealScalar temp, temp1,temp2; \n  RealScalar ratio; \n  RealScalar pnorm, xnorm, fnorm1, actred, dirder, prered;\n  eigen_assert(x.size()==n); // check the caller is not cheating us\n\n  temp = 0.0; xnorm = 0.0;\n  /* calculate the jacobian matrix. */\n  Index df_ret = m_functor.df(x, m_fjac);\n  if (df_ret<0)\n      return LevenbergMarquardtSpace::UserAsked;\n  if (df_ret>0)\n      // numerical diff, we evaluated the function df_ret times\n      m_nfev += df_ret;\n  else m_njev++;\n\n  /* compute the qr factorization of the jacobian. */\n  for (int j = 0; j < x.size(); ++j)\n    m_wa2(j) = m_fjac.col(j).blueNorm();\n  QRSolver qrfac(m_fjac);\n  if(qrfac.info() != Success) {\n    m_info = NumericalIssue;\n    return LevenbergMarquardtSpace::ImproperInputParameters;\n  }\n  // Make a copy of the first factor with the associated permutation\n  m_rfactor = qrfac.matrixR();\n  m_permutation = (qrfac.colsPermutation());\n\n  /* on the first iteration and if external scaling is not used, scale according */\n  /* to the norms of the columns of the initial jacobian. */\n  if (m_iter == 1) {\n      if (!m_useExternalScaling)\n          for (Index j = 0; j < n; ++j)\n              m_diag[j] = (m_wa2[j]==0.)? 1. : m_wa2[j];\n\n      /* on the first iteration, calculate the norm of the scaled x */\n      /* and initialize the step bound m_delta. */\n      xnorm = m_diag.cwiseProduct(x).stableNorm();\n      m_delta = m_factor * xnorm;\n      if (m_delta == 0.)\n          m_delta = m_factor;\n  }\n\n  /* form (q transpose)*m_fvec and store the first n components in */\n  /* m_qtf. */\n  m_wa4 = m_fvec;\n  m_wa4 = qrfac.matrixQ().adjoint() * m_fvec; \n  m_qtf = m_wa4.head(n);\n\n  /* compute the norm of the scaled gradient. */\n  m_gnorm = 0.;\n  if (m_fnorm != 0.)\n      for (Index j = 0; j < n; ++j)\n          if (m_wa2[m_permutation.indices()[j]] != 0.)\n              m_gnorm = (std::max)(m_gnorm, abs( m_rfactor.col(j).head(j+1).dot(m_qtf.head(j+1)/m_fnorm) / m_wa2[m_permutation.indices()[j]]));\n\n  /* test for convergence of the gradient norm. */\n  if (m_gnorm <= m_gtol) {\n    m_info = Success;\n    return LevenbergMarquardtSpace::CosinusTooSmall;\n  }\n\n  /* rescale if necessary. */\n  if (!m_useExternalScaling)\n      m_diag = m_diag.cwiseMax(m_wa2);\n\n  do {\n    /* determine the levenberg-marquardt parameter. */\n    internal::lmpar2(qrfac, m_diag, m_qtf, m_delta, m_par, m_wa1);\n\n    /* store the direction p and x + p. calculate the norm of p. */\n    m_wa1 = -m_wa1;\n    m_wa2 = x + m_wa1;\n    pnorm = m_diag.cwiseProduct(m_wa1).stableNorm();\n\n    /* on the first iteration, adjust the initial step bound. */\n    if (m_iter == 1)\n        m_delta = (std::min)(m_delta,pnorm);\n\n    /* evaluate the function at x + p and calculate its norm. */\n    if ( m_functor(m_wa2, m_wa4) < 0)\n        return LevenbergMarquardtSpace::UserAsked;\n    ++m_nfev;\n    fnorm1 = m_wa4.stableNorm();\n\n    /* compute the scaled actual reduction. */\n    actred = -1.;\n    if (Scalar(.1) * fnorm1 < m_fnorm)\n        actred = 1. - numext::abs2(fnorm1 / m_fnorm);\n\n    /* compute the scaled predicted reduction and */\n    /* the scaled directional derivative. */\n    m_wa3 = m_rfactor.template triangularView<Upper>() * (m_permutation.inverse() *m_wa1);\n    temp1 = numext::abs2(m_wa3.stableNorm() / m_fnorm);\n    temp2 = numext::abs2(sqrt(m_par) * pnorm / m_fnorm);\n    prered = temp1 + temp2 / Scalar(.5);\n    dirder = -(temp1 + temp2);\n\n    /* compute the ratio of the actual to the predicted */\n    /* reduction. */\n    ratio = 0.;\n    if (prered != 0.)\n        ratio = actred / prered;\n\n    /* update the step bound. */\n    if (ratio <= Scalar(.25)) {\n        if (actred >= 0.)\n            temp = RealScalar(.5);\n        if (actred < 0.)\n            temp = RealScalar(.5) * dirder / (dirder + RealScalar(.5) * actred);\n        if (RealScalar(.1) * fnorm1 >= m_fnorm || temp < RealScalar(.1))\n            temp = Scalar(.1);\n        /* Computing MIN */\n        m_delta = temp * (std::min)(m_delta, pnorm / RealScalar(.1));\n        m_par /= temp;\n    } else if (!(m_par != 0. && ratio < RealScalar(.75))) {\n        m_delta = pnorm / RealScalar(.5);\n        m_par = RealScalar(.5) * m_par;\n    }\n\n    /* test for successful iteration. */\n    if (ratio >= RealScalar(1e-4)) {\n        /* successful iteration. update x, m_fvec, and their norms. */\n        x = m_wa2;\n        m_wa2 = m_diag.cwiseProduct(x);\n        m_fvec = m_wa4;\n        xnorm = m_wa2.stableNorm();\n        m_fnorm = fnorm1;\n        ++m_iter;\n    }\n\n    /* tests for convergence. */\n    if (abs(actred) <= m_ftol && prered <= m_ftol && Scalar(.5) * ratio <= 1. && m_delta <= m_xtol * xnorm)\n    {\n       m_info = Success;\n      return LevenbergMarquardtSpace::RelativeErrorAndReductionTooSmall;\n    }\n    if (abs(actred) <= m_ftol && prered <= m_ftol && Scalar(.5) * ratio <= 1.) \n    {\n      m_info = Success;\n      return LevenbergMarquardtSpace::RelativeReductionTooSmall;\n    }\n    if (m_delta <= m_xtol * xnorm)\n    {\n      m_info = Success;\n      return LevenbergMarquardtSpace::RelativeErrorTooSmall;\n    }\n\n    /* tests for termination and stringent tolerances. */\n    if (m_nfev >= m_maxfev) \n    {\n      m_info = NoConvergence;\n      return LevenbergMarquardtSpace::TooManyFunctionEvaluation;\n    }\n    if (abs(actred) <= NumTraits<Scalar>::epsilon() && prered <= NumTraits<Scalar>::epsilon() && Scalar(.5) * ratio <= 1.)\n    {\n      m_info = Success;\n      return LevenbergMarquardtSpace::FtolTooSmall;\n    }\n    if (m_delta <= NumTraits<Scalar>::epsilon() * xnorm) \n    {\n      m_info = Success;\n      return LevenbergMarquardtSpace::XtolTooSmall;\n    }\n    if (m_gnorm <= NumTraits<Scalar>::epsilon())\n    {\n      m_info = Success;\n      return LevenbergMarquardtSpace::GtolTooSmall;\n    }\n\n  } while (ratio < Scalar(1e-4));\n\n  return LevenbergMarquardtSpace::Running;\n}\n\n  \n} // end namespace Eigen\n\n#endif // EIGEN_LMONESTEP_H\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/LevenbergMarquardt/LMpar.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// This code initially comes from MINPACK whose original authors are:\n// Copyright Jorge More - Argonne National Laboratory\n// Copyright Burt Garbow - Argonne National Laboratory\n// Copyright Ken Hillstrom - Argonne National Laboratory\n//\n// This Source Code Form is subject to the terms of the Minpack license\n// (a BSD-like license) described in the campaigned CopyrightMINPACK.txt file.\n\n#ifndef EIGEN_LMPAR_H\n#define EIGEN_LMPAR_H\n\nnamespace Eigen {\n\nnamespace internal {\n  \n  template <typename QRSolver, typename VectorType>\n    void lmpar2(\n    const QRSolver &qr,\n    const VectorType  &diag,\n    const VectorType  &qtb,\n    typename VectorType::Scalar m_delta,\n    typename VectorType::Scalar &par,\n    VectorType  &x)\n\n  {\n    using std::sqrt;\n    using std::abs;\n    typedef typename QRSolver::MatrixType MatrixType;\n    typedef typename QRSolver::Scalar Scalar;\n    typedef typename QRSolver::Index Index;\n\n    /* Local variables */\n    Index j;\n    Scalar fp;\n    Scalar parc, parl;\n    Index iter;\n    Scalar temp, paru;\n    Scalar gnorm;\n    Scalar dxnorm;\n    \n    // Make a copy of the triangular factor. \n    // This copy is modified during call the qrsolv\n    MatrixType s;\n    s = qr.matrixR();\n\n    /* Function Body */\n    const Scalar dwarf = (std::numeric_limits<Scalar>::min)();\n    const Index n = qr.matrixR().cols();\n    eigen_assert(n==diag.size());\n    eigen_assert(n==qtb.size());\n\n    VectorType  wa1, wa2;\n\n    /* compute and store in x the gauss-newton direction. if the */\n    /* jacobian is rank-deficient, obtain a least squares solution. */\n\n    //    const Index rank = qr.nonzeroPivots(); // exactly double(0.)\n    const Index rank = qr.rank(); // use a threshold\n    wa1 = qtb;\n    wa1.tail(n-rank).setZero();\n    //FIXME There is no solve in place for sparse triangularView\n    wa1.head(rank) = s.topLeftCorner(rank,rank).template triangularView<Upper>().solve(qtb.head(rank));\n\n    x = qr.colsPermutation()*wa1;\n\n    /* initialize the iteration counter. */\n    /* evaluate the function at the origin, and test */\n    /* for acceptance of the gauss-newton direction. */\n    iter = 0;\n    wa2 = diag.cwiseProduct(x);\n    dxnorm = wa2.blueNorm();\n    fp = dxnorm - m_delta;\n    if (fp <= Scalar(0.1) * m_delta) {\n      par = 0;\n      return;\n    }\n\n    /* if the jacobian is not rank deficient, the newton */\n    /* step provides a lower bound, parl, for the zero of */\n    /* the function. otherwise set this bound to zero. */\n    parl = 0.;\n    if (rank==n) {\n      wa1 = qr.colsPermutation().inverse() *  diag.cwiseProduct(wa2)/dxnorm;\n      s.topLeftCorner(n,n).transpose().template triangularView<Lower>().solveInPlace(wa1);\n      temp = wa1.blueNorm();\n      parl = fp / m_delta / temp / temp;\n    }\n\n    /* calculate an upper bound, paru, for the zero of the function. */\n    for (j = 0; j < n; ++j)\n      wa1[j] = s.col(j).head(j+1).dot(qtb.head(j+1)) / diag[qr.colsPermutation().indices()(j)];\n\n    gnorm = wa1.stableNorm();\n    paru = gnorm / m_delta;\n    if (paru == 0.)\n      paru = dwarf / (std::min)(m_delta,Scalar(0.1));\n\n    /* if the input par lies outside of the interval (parl,paru), */\n    /* set par to the closer endpoint. */\n    par = (std::max)(par,parl);\n    par = (std::min)(par,paru);\n    if (par == 0.)\n      par = gnorm / dxnorm;\n\n    /* beginning of an iteration. */\n    while (true) {\n      ++iter;\n\n      /* evaluate the function at the current value of par. */\n      if (par == 0.)\n        par = (std::max)(dwarf,Scalar(.001) * paru); /* Computing MAX */\n      wa1 = sqrt(par)* diag;\n\n      VectorType sdiag(n);\n      lmqrsolv(s, qr.colsPermutation(), wa1, qtb, x, sdiag);\n\n      wa2 = diag.cwiseProduct(x);\n      dxnorm = wa2.blueNorm();\n      temp = fp;\n      fp = dxnorm - m_delta;\n\n      /* if the function is small enough, accept the current value */\n      /* of par. also test for the exceptional cases where parl */\n      /* is zero or the number of iterations has reached 10. */\n      if (abs(fp) <= Scalar(0.1) * m_delta || (parl == 0. && fp <= temp && temp < 0.) || iter == 10)\n        break;\n\n      /* compute the newton correction. */\n      wa1 = qr.colsPermutation().inverse() * diag.cwiseProduct(wa2/dxnorm);\n      // we could almost use this here, but the diagonal is outside qr, in sdiag[]\n      for (j = 0; j < n; ++j) {\n        wa1[j] /= sdiag[j];\n        temp = wa1[j];\n        for (Index i = j+1; i < n; ++i)\n          wa1[i] -= s.coeff(i,j) * temp;\n      }\n      temp = wa1.blueNorm();\n      parc = fp / m_delta / temp / temp;\n\n      /* depending on the sign of the function, update parl or paru. */\n      if (fp > 0.)\n        parl = (std::max)(parl,par);\n      if (fp < 0.)\n        paru = (std::min)(paru,par);\n\n      /* compute an improved estimate for par. */\n      par = (std::max)(parl,par+parc);\n    }\n    if (iter == 0)\n      par = 0.;\n    return;\n  }\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_LMPAR_H\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/LevenbergMarquardt/LMqrsolv.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Thomas Capricelli <orzel@freehackers.org>\n// Copyright (C) 2012 Desire Nuentsa <desire.nuentsa_wakam@inria.fr>\n//\n// This code initially comes from MINPACK whose original authors are:\n// Copyright Jorge More - Argonne National Laboratory\n// Copyright Burt Garbow - Argonne National Laboratory\n// Copyright Ken Hillstrom - Argonne National Laboratory\n//\n// This Source Code Form is subject to the terms of the Minpack license\n// (a BSD-like license) described in the campaigned CopyrightMINPACK.txt file.\n\n#ifndef EIGEN_LMQRSOLV_H\n#define EIGEN_LMQRSOLV_H\n\nnamespace Eigen { \n\nnamespace internal {\n\ntemplate <typename Scalar,int Rows, int Cols, typename Index>\nvoid lmqrsolv(\n  Matrix<Scalar,Rows,Cols> &s,\n  const PermutationMatrix<Dynamic,Dynamic,Index> &iPerm,\n  const Matrix<Scalar,Dynamic,1> &diag,\n  const Matrix<Scalar,Dynamic,1> &qtb,\n  Matrix<Scalar,Dynamic,1> &x,\n  Matrix<Scalar,Dynamic,1> &sdiag)\n{\n\n    /* Local variables */\n    Index i, j, k, l;\n    Scalar temp;\n    Index n = s.cols();\n    Matrix<Scalar,Dynamic,1>  wa(n);\n    JacobiRotation<Scalar> givens;\n\n    /* Function Body */\n    // the following will only change the lower triangular part of s, including\n    // the diagonal, though the diagonal is restored afterward\n\n    /*     copy r and (q transpose)*b to preserve input and initialize s. */\n    /*     in particular, save the diagonal elements of r in x. */\n    x = s.diagonal();\n    wa = qtb;\n    \n   \n    s.topLeftCorner(n,n).template triangularView<StrictlyLower>() = s.topLeftCorner(n,n).transpose();\n    /*     eliminate the diagonal matrix d using a givens rotation. */\n    for (j = 0; j < n; ++j) {\n\n        /*        prepare the row of d to be eliminated, locating the */\n        /*        diagonal element using p from the qr factorization. */\n        l = iPerm.indices()(j);\n        if (diag[l] == 0.)\n            break;\n        sdiag.tail(n-j).setZero();\n        sdiag[j] = diag[l];\n\n        /*        the transformations to eliminate the row of d */\n        /*        modify only a single element of (q transpose)*b */\n        /*        beyond the first n, which is initially zero. */\n        Scalar qtbpj = 0.;\n        for (k = j; k < n; ++k) {\n            /*           determine a givens rotation which eliminates the */\n            /*           appropriate element in the current row of d. */\n            givens.makeGivens(-s(k,k), sdiag[k]);\n\n            /*           compute the modified diagonal element of r and */\n            /*           the modified element of ((q transpose)*b,0). */\n            s(k,k) = givens.c() * s(k,k) + givens.s() * sdiag[k];\n            temp = givens.c() * wa[k] + givens.s() * qtbpj;\n            qtbpj = -givens.s() * wa[k] + givens.c() * qtbpj;\n            wa[k] = temp;\n\n            /*           accumulate the tranformation in the row of s. */\n            for (i = k+1; i<n; ++i) {\n                temp = givens.c() * s(i,k) + givens.s() * sdiag[i];\n                sdiag[i] = -givens.s() * s(i,k) + givens.c() * sdiag[i];\n                s(i,k) = temp;\n            }\n        }\n    }\n  \n    /*     solve the triangular system for z. if the system is */\n    /*     singular, then obtain a least squares solution. */\n    Index nsing;\n    for(nsing=0; nsing<n && sdiag[nsing]!=0; nsing++) {}\n\n    wa.tail(n-nsing).setZero();\n    s.topLeftCorner(nsing, nsing).transpose().template triangularView<Upper>().solveInPlace(wa.head(nsing));\n  \n    // restore\n    sdiag = s.diagonal();\n    s.diagonal() = x;\n\n    /* permute the components of z back to components of x. */\n    x = iPerm * wa; \n}\n\ntemplate <typename Scalar, int _Options, typename Index>\nvoid lmqrsolv(\n  SparseMatrix<Scalar,_Options,Index> &s,\n  const PermutationMatrix<Dynamic,Dynamic> &iPerm,\n  const Matrix<Scalar,Dynamic,1> &diag,\n  const Matrix<Scalar,Dynamic,1> &qtb,\n  Matrix<Scalar,Dynamic,1> &x,\n  Matrix<Scalar,Dynamic,1> &sdiag)\n{\n  /* Local variables */\n  typedef SparseMatrix<Scalar,RowMajor,Index> FactorType;\n    Index i, j, k, l;\n    Scalar temp;\n    Index n = s.cols();\n    Matrix<Scalar,Dynamic,1>  wa(n);\n    JacobiRotation<Scalar> givens;\n\n    /* Function Body */\n    // the following will only change the lower triangular part of s, including\n    // the diagonal, though the diagonal is restored afterward\n\n    /*     copy r and (q transpose)*b to preserve input and initialize R. */\n    wa = qtb;\n    FactorType R(s);\n    // Eliminate the diagonal matrix d using a givens rotation\n    for (j = 0; j < n; ++j)\n    {\n      // Prepare the row of d to be eliminated, locating the \n      // diagonal element using p from the qr factorization\n      l = iPerm.indices()(j);\n      if (diag(l) == Scalar(0)) \n        break; \n      sdiag.tail(n-j).setZero();\n      sdiag[j] = diag[l];\n      // the transformations to eliminate the row of d\n      // modify only a single element of (q transpose)*b\n      // beyond the first n, which is initially zero. \n      \n      Scalar qtbpj = 0; \n      // Browse the nonzero elements of row j of the upper triangular s\n      for (k = j; k < n; ++k)\n      {\n        typename FactorType::InnerIterator itk(R,k);\n        for (; itk; ++itk){\n          if (itk.index() < k) continue;\n          else break;\n        }\n        //At this point, we have the diagonal element R(k,k)\n        // Determine a givens rotation which eliminates \n        // the appropriate element in the current row of d\n        givens.makeGivens(-itk.value(), sdiag(k));\n        \n        // Compute the modified diagonal element of r and \n        // the modified element of ((q transpose)*b,0).\n        itk.valueRef() = givens.c() * itk.value() + givens.s() * sdiag(k);\n        temp = givens.c() * wa(k) + givens.s() * qtbpj; \n        qtbpj = -givens.s() * wa(k) + givens.c() * qtbpj;\n        wa(k) = temp;\n        \n        // Accumulate the transformation in the remaining k row/column of R\n        for (++itk; itk; ++itk)\n        {\n          i = itk.index();\n          temp = givens.c() *  itk.value() + givens.s() * sdiag(i);\n          sdiag(i) = -givens.s() * itk.value() + givens.c() * sdiag(i);\n          itk.valueRef() = temp;\n        }\n      }\n    }\n    \n    // Solve the triangular system for z. If the system is \n    // singular, then obtain a least squares solution\n    Index nsing;\n    for(nsing = 0; nsing<n && sdiag(nsing) !=0; nsing++) {}\n    \n    wa.tail(n-nsing).setZero();\n//     x = wa; \n    wa.head(nsing) = R.topLeftCorner(nsing,nsing).template triangularView<Upper>().solve/*InPlace*/(wa.head(nsing));\n    \n    sdiag = R.diagonal();\n    // Permute the components of z back to components of x\n    x = iPerm * wa; \n}\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_LMQRSOLV_H\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/LevenbergMarquardt/LevenbergMarquardt.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Thomas Capricelli <orzel@freehackers.org>\n// Copyright (C) 2012 Desire Nuentsa <desire.nuentsa_wakam@inria.fr>\n//\n// The algorithm of this class initially comes from MINPACK whose original authors are:\n// Copyright Jorge More - Argonne National Laboratory\n// Copyright Burt Garbow - Argonne National Laboratory\n// Copyright Ken Hillstrom - Argonne National Laboratory\n//\n// This Source Code Form is subject to the terms of the Minpack license\n// (a BSD-like license) described in the campaigned CopyrightMINPACK.txt file.\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_LEVENBERGMARQUARDT_H\n#define EIGEN_LEVENBERGMARQUARDT_H\n\n\nnamespace Eigen {\nnamespace LevenbergMarquardtSpace {\n    enum Status {\n        NotStarted = -2,\n        Running = -1,\n        ImproperInputParameters = 0,\n        RelativeReductionTooSmall = 1,\n        RelativeErrorTooSmall = 2,\n        RelativeErrorAndReductionTooSmall = 3,\n        CosinusTooSmall = 4,\n        TooManyFunctionEvaluation = 5,\n        FtolTooSmall = 6,\n        XtolTooSmall = 7,\n        GtolTooSmall = 8,\n        UserAsked = 9\n    };\n}\n\ntemplate <typename _Scalar, int NX=Dynamic, int NY=Dynamic>\nstruct DenseFunctor\n{\n  typedef _Scalar Scalar;\n  enum {\n    InputsAtCompileTime = NX,\n    ValuesAtCompileTime = NY\n  };\n  typedef Matrix<Scalar,InputsAtCompileTime,1> InputType;\n  typedef Matrix<Scalar,ValuesAtCompileTime,1> ValueType;\n  typedef Matrix<Scalar,ValuesAtCompileTime,InputsAtCompileTime> JacobianType;\n  typedef ColPivHouseholderQR<JacobianType> QRSolver;\n  const int m_inputs, m_values;\n\n  DenseFunctor() : m_inputs(InputsAtCompileTime), m_values(ValuesAtCompileTime) {}\n  DenseFunctor(int inputs, int values) : m_inputs(inputs), m_values(values) {}\n\n  int inputs() const { return m_inputs; }\n  int values() const { return m_values; }\n\n  //int operator()(const InputType &x, ValueType& fvec) { }\n  // should be defined in derived classes\n  \n  //int df(const InputType &x, JacobianType& fjac) { }\n  // should be defined in derived classes\n};\n\ntemplate <typename _Scalar, typename _Index>\nstruct SparseFunctor\n{\n  typedef _Scalar Scalar;\n  typedef _Index Index;\n  typedef Matrix<Scalar,Dynamic,1> InputType;\n  typedef Matrix<Scalar,Dynamic,1> ValueType;\n  typedef SparseMatrix<Scalar, ColMajor, Index> JacobianType;\n  typedef SparseQR<JacobianType, COLAMDOrdering<int> > QRSolver;\n  enum {\n    InputsAtCompileTime = Dynamic,\n    ValuesAtCompileTime = Dynamic\n  };\n  \n  SparseFunctor(int inputs, int values) : m_inputs(inputs), m_values(values) {}\n\n  int inputs() const { return m_inputs; }\n  int values() const { return m_values; }\n  \n  const int m_inputs, m_values;\n  //int operator()(const InputType &x, ValueType& fvec) { }\n  // to be defined in the functor\n  \n  //int df(const InputType &x, JacobianType& fjac) { }\n  // to be defined in the functor if no automatic differentiation\n  \n};\nnamespace internal {\ntemplate <typename QRSolver, typename VectorType>\nvoid lmpar2(const QRSolver &qr, const VectorType  &diag, const VectorType  &qtb,\n\t    typename VectorType::Scalar m_delta, typename VectorType::Scalar &par,\n\t    VectorType  &x);\n    }\n/**\n  * \\ingroup NonLinearOptimization_Module\n  * \\brief Performs non linear optimization over a non-linear function,\n  * using a variant of the Levenberg Marquardt algorithm.\n  *\n  * Check wikipedia for more information.\n  * http://en.wikipedia.org/wiki/Levenberg%E2%80%93Marquardt_algorithm\n  */\ntemplate<typename _FunctorType>\nclass LevenbergMarquardt : internal::no_assignment_operator\n{\n  public:\n    typedef _FunctorType FunctorType;\n    typedef typename FunctorType::QRSolver QRSolver;\n    typedef typename FunctorType::JacobianType JacobianType;\n    typedef typename JacobianType::Scalar Scalar;\n    typedef typename JacobianType::RealScalar RealScalar; \n    typedef typename JacobianType::Index Index;\n    typedef typename QRSolver::Index PermIndex;\n    typedef Matrix<Scalar,Dynamic,1> FVectorType;\n    typedef PermutationMatrix<Dynamic,Dynamic> PermutationType;\n  public:\n    LevenbergMarquardt(FunctorType& functor) \n    : m_functor(functor),m_nfev(0),m_njev(0),m_fnorm(0.0),m_gnorm(0),\n      m_isInitialized(false),m_info(InvalidInput)\n    {\n      resetParameters();\n      m_useExternalScaling=false; \n    }\n    \n    LevenbergMarquardtSpace::Status minimize(FVectorType &x);\n    LevenbergMarquardtSpace::Status minimizeInit(FVectorType &x);\n    LevenbergMarquardtSpace::Status minimizeOneStep(FVectorType &x);\n    LevenbergMarquardtSpace::Status lmder1(\n      FVectorType  &x, \n      const Scalar tol = std::sqrt(NumTraits<Scalar>::epsilon())\n    );\n    static LevenbergMarquardtSpace::Status lmdif1(\n            FunctorType &functor,\n            FVectorType  &x,\n            Index *nfev,\n            const Scalar tol = std::sqrt(NumTraits<Scalar>::epsilon())\n            );\n    \n    /** Sets the default parameters */\n    void resetParameters() \n    { \n      m_factor = 100.; \n      m_maxfev = 400; \n      m_ftol = std::sqrt(NumTraits<RealScalar>::epsilon());\n      m_xtol = std::sqrt(NumTraits<RealScalar>::epsilon());\n      m_gtol = 0. ; \n      m_epsfcn = 0. ;\n    }\n    \n    /** Sets the tolerance for the norm of the solution vector*/\n    void setXtol(RealScalar xtol) { m_xtol = xtol; }\n    \n    /** Sets the tolerance for the norm of the vector function*/\n    void setFtol(RealScalar ftol) { m_ftol = ftol; }\n    \n    /** Sets the tolerance for the norm of the gradient of the error vector*/\n    void setGtol(RealScalar gtol) { m_gtol = gtol; }\n    \n    /** Sets the step bound for the diagonal shift */\n    void setFactor(RealScalar factor) { m_factor = factor; }    \n    \n    /** Sets the error precision  */\n    void setEpsilon (RealScalar epsfcn) { m_epsfcn = epsfcn; }\n    \n    /** Sets the maximum number of function evaluation */\n    void setMaxfev(Index maxfev) {m_maxfev = maxfev; }\n    \n    /** Use an external Scaling. If set to true, pass a nonzero diagonal to diag() */\n    void setExternalScaling(bool value) {m_useExternalScaling  = value; }\n    \n    /** \\returns a reference to the diagonal of the jacobian */\n    FVectorType& diag() {return m_diag; }\n    \n    /** \\returns the number of iterations performed */\n    Index iterations() { return m_iter; }\n    \n    /** \\returns the number of functions evaluation */\n    Index nfev() { return m_nfev; }\n    \n    /** \\returns the number of jacobian evaluation */\n    Index njev() { return m_njev; }\n    \n    /** \\returns the norm of current vector function */\n    RealScalar fnorm() {return m_fnorm; }\n    \n    /** \\returns the norm of the gradient of the error */\n    RealScalar gnorm() {return m_gnorm; }\n    \n    /** \\returns the LevenbergMarquardt parameter */\n    RealScalar lm_param(void) { return m_par; }\n    \n    /** \\returns a reference to the  current vector function \n     */\n    FVectorType& fvec() {return m_fvec; }\n    \n    /** \\returns a reference to the matrix where the current Jacobian matrix is stored\n     */\n    JacobianType& jacobian() {return m_fjac; }\n    \n    /** \\returns a reference to the triangular matrix R from the QR of the jacobian matrix.\n     * \\sa jacobian()\n     */\n    JacobianType& matrixR() {return m_rfactor; }\n    \n    /** the permutation used in the QR factorization\n     */\n    PermutationType permutation() {return m_permutation; }\n    \n    /** \n     * \\brief Reports whether the minimization was successful\n     * \\returns \\c Success if the minimization was succesful,\n     *         \\c NumericalIssue if a numerical problem arises during the \n     *          minimization process, for exemple during the QR factorization\n     *         \\c NoConvergence if the minimization did not converge after \n     *          the maximum number of function evaluation allowed\n     *          \\c InvalidInput if the input matrix is invalid\n     */\n    ComputationInfo info() const\n    {\n      \n      return m_info;\n    }\n  private:\n    JacobianType m_fjac; \n    JacobianType m_rfactor; // The triangular matrix R from the QR of the jacobian matrix m_fjac\n    FunctorType &m_functor;\n    FVectorType m_fvec, m_qtf, m_diag; \n    Index n;\n    Index m; \n    Index m_nfev;\n    Index m_njev; \n    RealScalar m_fnorm; // Norm of the current vector function\n    RealScalar m_gnorm; //Norm of the gradient of the error \n    RealScalar m_factor; //\n    Index m_maxfev; // Maximum number of function evaluation\n    RealScalar m_ftol; //Tolerance in the norm of the vector function\n    RealScalar m_xtol; // \n    RealScalar m_gtol; //tolerance of the norm of the error gradient\n    RealScalar m_epsfcn; //\n    Index m_iter; // Number of iterations performed\n    RealScalar m_delta;\n    bool m_useExternalScaling;\n    PermutationType m_permutation;\n    FVectorType m_wa1, m_wa2, m_wa3, m_wa4; //Temporary vectors\n    RealScalar m_par;\n    bool m_isInitialized; // Check whether the minimization step has been called\n    ComputationInfo m_info; \n};\n\ntemplate<typename FunctorType>\nLevenbergMarquardtSpace::Status\nLevenbergMarquardt<FunctorType>::minimize(FVectorType  &x)\n{\n    LevenbergMarquardtSpace::Status status = minimizeInit(x);\n    if (status==LevenbergMarquardtSpace::ImproperInputParameters) {\n      m_isInitialized = true;\n      return status;\n    }\n    do {\n//       std::cout << \" uv \" << x.transpose() << \"\\n\";\n        status = minimizeOneStep(x);\n    } while (status==LevenbergMarquardtSpace::Running);\n     m_isInitialized = true;\n     return status;\n}\n\ntemplate<typename FunctorType>\nLevenbergMarquardtSpace::Status\nLevenbergMarquardt<FunctorType>::minimizeInit(FVectorType  &x)\n{\n    n = x.size();\n    m = m_functor.values();\n\n    m_wa1.resize(n); m_wa2.resize(n); m_wa3.resize(n);\n    m_wa4.resize(m);\n    m_fvec.resize(m);\n    //FIXME Sparse Case : Allocate space for the jacobian\n    m_fjac.resize(m, n);\n//     m_fjac.reserve(VectorXi::Constant(n,5)); // FIXME Find a better alternative\n    if (!m_useExternalScaling)\n        m_diag.resize(n);\n    eigen_assert( (!m_useExternalScaling || m_diag.size()==n) || \"When m_useExternalScaling is set, the caller must provide a valid 'm_diag'\");\n    m_qtf.resize(n);\n\n    /* Function Body */\n    m_nfev = 0;\n    m_njev = 0;\n\n    /*     check the input parameters for errors. */\n    if (n <= 0 || m < n || m_ftol < 0. || m_xtol < 0. || m_gtol < 0. || m_maxfev <= 0 || m_factor <= 0.){\n      m_info = InvalidInput;\n      return LevenbergMarquardtSpace::ImproperInputParameters;\n    }\n\n    if (m_useExternalScaling)\n        for (Index j = 0; j < n; ++j)\n            if (m_diag[j] <= 0.) \n            {\n              m_info = InvalidInput;\n              return LevenbergMarquardtSpace::ImproperInputParameters;\n            }\n\n    /*     evaluate the function at the starting point */\n    /*     and calculate its norm. */\n    m_nfev = 1;\n    if ( m_functor(x, m_fvec) < 0)\n        return LevenbergMarquardtSpace::UserAsked;\n    m_fnorm = m_fvec.stableNorm();\n\n    /*     initialize levenberg-marquardt parameter and iteration counter. */\n    m_par = 0.;\n    m_iter = 1;\n\n    return LevenbergMarquardtSpace::NotStarted;\n}\n\ntemplate<typename FunctorType>\nLevenbergMarquardtSpace::Status\nLevenbergMarquardt<FunctorType>::lmder1(\n        FVectorType  &x,\n        const Scalar tol\n        )\n{\n    n = x.size();\n    m = m_functor.values();\n\n    /* check the input parameters for errors. */\n    if (n <= 0 || m < n || tol < 0.)\n        return LevenbergMarquardtSpace::ImproperInputParameters;\n\n    resetParameters();\n    m_ftol = tol;\n    m_xtol = tol;\n    m_maxfev = 100*(n+1);\n\n    return minimize(x);\n}\n\n\ntemplate<typename FunctorType>\nLevenbergMarquardtSpace::Status\nLevenbergMarquardt<FunctorType>::lmdif1(\n        FunctorType &functor,\n        FVectorType  &x,\n        Index *nfev,\n        const Scalar tol\n        )\n{\n    Index n = x.size();\n    Index m = functor.values();\n\n    /* check the input parameters for errors. */\n    if (n <= 0 || m < n || tol < 0.)\n        return LevenbergMarquardtSpace::ImproperInputParameters;\n\n    NumericalDiff<FunctorType> numDiff(functor);\n    // embedded LevenbergMarquardt\n    LevenbergMarquardt<NumericalDiff<FunctorType> > lm(numDiff);\n    lm.setFtol(tol);\n    lm.setXtol(tol);\n    lm.setMaxfev(200*(n+1));\n\n    LevenbergMarquardtSpace::Status info = LevenbergMarquardtSpace::Status(lm.minimize(x));\n    if (nfev)\n        * nfev = lm.nfev();\n    return info;\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_LEVENBERGMARQUARDT_H\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/MatrixFunctions/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_MatrixFunctions_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_MatrixFunctions_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/unsupported/Eigen/src/MatrixFunctions COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/MatrixFunctions/MatrixExponential.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009, 2010 Jitse Niesen <jitse@maths.leeds.ac.uk>\n// Copyright (C) 2011 Chen-Pang He <jdh8@ms63.hinet.net>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_MATRIX_EXPONENTIAL\n#define EIGEN_MATRIX_EXPONENTIAL\n\n#include \"StemFunction.h\"\n\nnamespace Eigen {\n\n/** \\ingroup MatrixFunctions_Module\n  * \\brief Class for computing the matrix exponential.\n  * \\tparam MatrixType type of the argument of the exponential,\n  * expected to be an instantiation of the Matrix class template.\n  */\ntemplate <typename MatrixType>\nclass MatrixExponential {\n\n  public:\n\n    /** \\brief Constructor.\n      * \n      * The class stores a reference to \\p M, so it should not be\n      * changed (or destroyed) before compute() is called.\n      *\n      * \\param[in] M  matrix whose exponential is to be computed.\n      */\n    MatrixExponential(const MatrixType &M);\n\n    /** \\brief Computes the matrix exponential.\n      *\n      * \\param[out] result  the matrix exponential of \\p M in the constructor.\n      */\n    template <typename ResultType> \n    void compute(ResultType &result);\n\n  private:\n\n    // Prevent copying\n    MatrixExponential(const MatrixExponential&);\n    MatrixExponential& operator=(const MatrixExponential&);\n\n    /** \\brief Compute the (3,3)-Pad&eacute; approximant to the exponential.\n     *\n     *  After exit, \\f$ (V+U)(V-U)^{-1} \\f$ is the Pad&eacute;\n     *  approximant of \\f$ \\exp(A) \\f$ around \\f$ A = 0 \\f$.\n     *\n     *  \\param[in] A   Argument of matrix exponential\n     */\n    void pade3(const MatrixType &A);\n\n    /** \\brief Compute the (5,5)-Pad&eacute; approximant to the exponential.\n     *\n     *  After exit, \\f$ (V+U)(V-U)^{-1} \\f$ is the Pad&eacute;\n     *  approximant of \\f$ \\exp(A) \\f$ around \\f$ A = 0 \\f$.\n     *\n     *  \\param[in] A   Argument of matrix exponential\n     */\n    void pade5(const MatrixType &A);\n\n    /** \\brief Compute the (7,7)-Pad&eacute; approximant to the exponential.\n     *\n     *  After exit, \\f$ (V+U)(V-U)^{-1} \\f$ is the Pad&eacute;\n     *  approximant of \\f$ \\exp(A) \\f$ around \\f$ A = 0 \\f$.\n     *\n     *  \\param[in] A   Argument of matrix exponential\n     */\n    void pade7(const MatrixType &A);\n\n    /** \\brief Compute the (9,9)-Pad&eacute; approximant to the exponential.\n     *\n     *  After exit, \\f$ (V+U)(V-U)^{-1} \\f$ is the Pad&eacute;\n     *  approximant of \\f$ \\exp(A) \\f$ around \\f$ A = 0 \\f$.\n     *\n     *  \\param[in] A   Argument of matrix exponential\n     */\n    void pade9(const MatrixType &A);\n\n    /** \\brief Compute the (13,13)-Pad&eacute; approximant to the exponential.\n     *\n     *  After exit, \\f$ (V+U)(V-U)^{-1} \\f$ is the Pad&eacute;\n     *  approximant of \\f$ \\exp(A) \\f$ around \\f$ A = 0 \\f$.\n     *\n     *  \\param[in] A   Argument of matrix exponential\n     */\n    void pade13(const MatrixType &A);\n\n    /** \\brief Compute the (17,17)-Pad&eacute; approximant to the exponential.\n     *\n     *  After exit, \\f$ (V+U)(V-U)^{-1} \\f$ is the Pad&eacute;\n     *  approximant of \\f$ \\exp(A) \\f$ around \\f$ A = 0 \\f$.\n     *\n     *  This function activates only if your long double is double-double or quadruple.\n     *\n     *  \\param[in] A   Argument of matrix exponential\n     */\n    void pade17(const MatrixType &A);\n\n    /** \\brief Compute Pad&eacute; approximant to the exponential.\n     *\n     * Computes \\c m_U, \\c m_V and \\c m_squarings such that\n     * \\f$ (V+U)(V-U)^{-1} \\f$ is a Pad&eacute; of\n     * \\f$ \\exp(2^{-\\mbox{squarings}}M) \\f$ around \\f$ M = 0 \\f$. The\n     * degree of the Pad&eacute; approximant and the value of\n     * squarings are chosen such that the approximation error is no\n     * more than the round-off error.\n     *\n     * The argument of this function should correspond with the (real\n     * part of) the entries of \\c m_M.  It is used to select the\n     * correct implementation using overloading.\n     */\n    void computeUV(double);\n\n    /** \\brief Compute Pad&eacute; approximant to the exponential.\n     *\n     *  \\sa computeUV(double);\n     */\n    void computeUV(float);\n    \n    /** \\brief Compute Pad&eacute; approximant to the exponential.\n     *\n     *  \\sa computeUV(double);\n     */\n    void computeUV(long double);\n\n    typedef typename internal::traits<MatrixType>::Scalar Scalar;\n    typedef typename NumTraits<Scalar>::Real RealScalar;\n    typedef typename std::complex<RealScalar> ComplexScalar;\n\n    /** \\brief Reference to matrix whose exponential is to be computed. */\n    typename internal::nested<MatrixType>::type m_M;\n\n    /** \\brief Odd-degree terms in numerator of Pad&eacute; approximant. */\n    MatrixType m_U;\n\n    /** \\brief Even-degree terms in numerator of Pad&eacute; approximant. */\n    MatrixType m_V;\n\n    /** \\brief Used for temporary storage. */\n    MatrixType m_tmp1;\n\n    /** \\brief Used for temporary storage. */\n    MatrixType m_tmp2;\n\n    /** \\brief Identity matrix of the same size as \\c m_M. */\n    MatrixType m_Id;\n\n    /** \\brief Number of squarings required in the last step. */\n    int m_squarings;\n\n    /** \\brief L1 norm of m_M. */\n    RealScalar m_l1norm;\n};\n\ntemplate <typename MatrixType>\nMatrixExponential<MatrixType>::MatrixExponential(const MatrixType &M) :\n  m_M(M),\n  m_U(M.rows(),M.cols()),\n  m_V(M.rows(),M.cols()),\n  m_tmp1(M.rows(),M.cols()),\n  m_tmp2(M.rows(),M.cols()),\n  m_Id(MatrixType::Identity(M.rows(), M.cols())),\n  m_squarings(0),\n  m_l1norm(M.cwiseAbs().colwise().sum().maxCoeff())\n{\n  /* empty body */\n}\n\ntemplate <typename MatrixType>\ntemplate <typename ResultType> \nvoid MatrixExponential<MatrixType>::compute(ResultType &result)\n{\n#if LDBL_MANT_DIG > 112 // rarely happens\n  if(sizeof(RealScalar) > 14) {\n    result = m_M.matrixFunction(StdStemFunctions<ComplexScalar>::exp);\n    return;\n  }\n#endif\n  computeUV(RealScalar());\n  m_tmp1 = m_U + m_V;   // numerator of Pade approximant\n  m_tmp2 = -m_U + m_V;  // denominator of Pade approximant\n  result = m_tmp2.partialPivLu().solve(m_tmp1);\n  for (int i=0; i<m_squarings; i++)\n    result *= result;   // undo scaling by repeated squaring\n}\n\ntemplate <typename MatrixType>\nEIGEN_STRONG_INLINE void MatrixExponential<MatrixType>::pade3(const MatrixType &A)\n{\n  const RealScalar b[] = {120., 60., 12., 1.};\n  m_tmp1.noalias() = A * A;\n  m_tmp2 = b[3]*m_tmp1 + b[1]*m_Id;\n  m_U.noalias() = A * m_tmp2;\n  m_V = b[2]*m_tmp1 + b[0]*m_Id;\n}\n\ntemplate <typename MatrixType>\nEIGEN_STRONG_INLINE void MatrixExponential<MatrixType>::pade5(const MatrixType &A)\n{\n  const RealScalar b[] = {30240., 15120., 3360., 420., 30., 1.};\n  MatrixType A2 = A * A;\n  m_tmp1.noalias() = A2 * A2;\n  m_tmp2 = b[5]*m_tmp1 + b[3]*A2 + b[1]*m_Id;\n  m_U.noalias() = A * m_tmp2;\n  m_V = b[4]*m_tmp1 + b[2]*A2 + b[0]*m_Id;\n}\n\ntemplate <typename MatrixType>\nEIGEN_STRONG_INLINE void MatrixExponential<MatrixType>::pade7(const MatrixType &A)\n{\n  const RealScalar b[] = {17297280., 8648640., 1995840., 277200., 25200., 1512., 56., 1.};\n  MatrixType A2 = A * A;\n  MatrixType A4 = A2 * A2;\n  m_tmp1.noalias() = A4 * A2;\n  m_tmp2 = b[7]*m_tmp1 + b[5]*A4 + b[3]*A2 + b[1]*m_Id;\n  m_U.noalias() = A * m_tmp2;\n  m_V = b[6]*m_tmp1 + b[4]*A4 + b[2]*A2 + b[0]*m_Id;\n}\n\ntemplate <typename MatrixType>\nEIGEN_STRONG_INLINE void MatrixExponential<MatrixType>::pade9(const MatrixType &A)\n{\n  const RealScalar b[] = {17643225600., 8821612800., 2075673600., 302702400., 30270240.,\n\t\t      2162160., 110880., 3960., 90., 1.};\n  MatrixType A2 = A * A;\n  MatrixType A4 = A2 * A2;\n  MatrixType A6 = A4 * A2;\n  m_tmp1.noalias() = A6 * A2;\n  m_tmp2 = b[9]*m_tmp1 + b[7]*A6 + b[5]*A4 + b[3]*A2 + b[1]*m_Id;\n  m_U.noalias() = A * m_tmp2;\n  m_V = b[8]*m_tmp1 + b[6]*A6 + b[4]*A4 + b[2]*A2 + b[0]*m_Id;\n}\n\ntemplate <typename MatrixType>\nEIGEN_STRONG_INLINE void MatrixExponential<MatrixType>::pade13(const MatrixType &A)\n{\n  const RealScalar b[] = {64764752532480000., 32382376266240000., 7771770303897600.,\n\t\t      1187353796428800., 129060195264000., 10559470521600., 670442572800.,\n\t\t      33522128640., 1323241920., 40840800., 960960., 16380., 182., 1.};\n  MatrixType A2 = A * A;\n  MatrixType A4 = A2 * A2;\n  m_tmp1.noalias() = A4 * A2;\n  m_V = b[13]*m_tmp1 + b[11]*A4 + b[9]*A2; // used for temporary storage\n  m_tmp2.noalias() = m_tmp1 * m_V;\n  m_tmp2 += b[7]*m_tmp1 + b[5]*A4 + b[3]*A2 + b[1]*m_Id;\n  m_U.noalias() = A * m_tmp2;\n  m_tmp2 = b[12]*m_tmp1 + b[10]*A4 + b[8]*A2;\n  m_V.noalias() = m_tmp1 * m_tmp2;\n  m_V += b[6]*m_tmp1 + b[4]*A4 + b[2]*A2 + b[0]*m_Id;\n}\n\n#if LDBL_MANT_DIG > 64\ntemplate <typename MatrixType>\nEIGEN_STRONG_INLINE void MatrixExponential<MatrixType>::pade17(const MatrixType &A)\n{\n  const RealScalar b[] = {830034394580628357120000.L, 415017197290314178560000.L,\n\t\t      100610229646136770560000.L, 15720348382208870400000.L,\n\t\t      1774878043152614400000.L, 153822763739893248000.L, 10608466464820224000.L,\n\t\t      595373117923584000.L, 27563570274240000.L, 1060137318240000.L,\n\t\t      33924394183680.L, 899510451840.L, 19554575040.L, 341863200.L, 4651200.L,\n\t\t      46512.L, 306.L, 1.L};\n  MatrixType A2 = A * A;\n  MatrixType A4 = A2 * A2;\n  MatrixType A6 = A4 * A2;\n  m_tmp1.noalias() = A4 * A4;\n  m_V = b[17]*m_tmp1 + b[15]*A6 + b[13]*A4 + b[11]*A2; // used for temporary storage\n  m_tmp2.noalias() = m_tmp1 * m_V;\n  m_tmp2 += b[9]*m_tmp1 + b[7]*A6 + b[5]*A4 + b[3]*A2 + b[1]*m_Id;\n  m_U.noalias() = A * m_tmp2;\n  m_tmp2 = b[16]*m_tmp1 + b[14]*A6 + b[12]*A4 + b[10]*A2;\n  m_V.noalias() = m_tmp1 * m_tmp2;\n  m_V += b[8]*m_tmp1 + b[6]*A6 + b[4]*A4 + b[2]*A2 + b[0]*m_Id;\n}\n#endif\n\ntemplate <typename MatrixType>\nvoid MatrixExponential<MatrixType>::computeUV(float)\n{\n  using std::frexp;\n  using std::pow;\n  if (m_l1norm < 4.258730016922831e-001) {\n    pade3(m_M);\n  } else if (m_l1norm < 1.880152677804762e+000) {\n    pade5(m_M);\n  } else {\n    const float maxnorm = 3.925724783138660f;\n    frexp(m_l1norm / maxnorm, &m_squarings);\n    if (m_squarings < 0) m_squarings = 0;\n    MatrixType A = m_M / Scalar(pow(2, m_squarings));\n    pade7(A);\n  }\n}\n\ntemplate <typename MatrixType>\nvoid MatrixExponential<MatrixType>::computeUV(double)\n{\n  using std::frexp;\n  using std::pow;\n  if (m_l1norm < 1.495585217958292e-002) {\n    pade3(m_M);\n  } else if (m_l1norm < 2.539398330063230e-001) {\n    pade5(m_M);\n  } else if (m_l1norm < 9.504178996162932e-001) {\n    pade7(m_M);\n  } else if (m_l1norm < 2.097847961257068e+000) {\n    pade9(m_M);\n  } else {\n    const double maxnorm = 5.371920351148152;\n    frexp(m_l1norm / maxnorm, &m_squarings);\n    if (m_squarings < 0) m_squarings = 0;\n    MatrixType A = m_M / Scalar(pow(2, m_squarings));\n    pade13(A);\n  }\n}\n\ntemplate <typename MatrixType>\nvoid MatrixExponential<MatrixType>::computeUV(long double)\n{\n  using std::frexp;\n  using std::pow;\n#if   LDBL_MANT_DIG == 53   // double precision\n  computeUV(double());\n#elif LDBL_MANT_DIG <= 64   // extended precision\n  if (m_l1norm < 4.1968497232266989671e-003L) {\n    pade3(m_M);\n  } else if (m_l1norm < 1.1848116734693823091e-001L) {\n    pade5(m_M);\n  } else if (m_l1norm < 5.5170388480686700274e-001L) {\n    pade7(m_M);\n  } else if (m_l1norm < 1.3759868875587845383e+000L) {\n    pade9(m_M);\n  } else {\n    const long double maxnorm = 4.0246098906697353063L;\n    frexp(m_l1norm / maxnorm, &m_squarings);\n    if (m_squarings < 0) m_squarings = 0;\n    MatrixType A = m_M / Scalar(pow(2, m_squarings));\n    pade13(A);\n  }\n#elif LDBL_MANT_DIG <= 106  // double-double\n  if (m_l1norm < 3.2787892205607026992947488108213e-005L) {\n    pade3(m_M);\n  } else if (m_l1norm < 6.4467025060072760084130906076332e-003L) {\n    pade5(m_M);\n  } else if (m_l1norm < 6.8988028496595374751374122881143e-002L) {\n    pade7(m_M);\n  } else if (m_l1norm < 2.7339737518502231741495857201670e-001L) {\n    pade9(m_M);\n  } else if (m_l1norm < 1.3203382096514474905666448850278e+000L) {\n    pade13(m_M);\n  } else {\n    const long double maxnorm = 3.2579440895405400856599663723517L;\n    frexp(m_l1norm / maxnorm, &m_squarings);\n    if (m_squarings < 0) m_squarings = 0;\n    MatrixType A = m_M / pow(Scalar(2), m_squarings);\n    pade17(A);\n  }\n#elif LDBL_MANT_DIG <= 112  // quadruple precison\n  if (m_l1norm < 1.639394610288918690547467954466970e-005L) {\n    pade3(m_M);\n  } else if (m_l1norm < 4.253237712165275566025884344433009e-003L) {\n    pade5(m_M);\n  } else if (m_l1norm < 5.125804063165764409885122032933142e-002L) {\n    pade7(m_M);\n  } else if (m_l1norm < 2.170000765161155195453205651889853e-001L) {\n    pade9(m_M);\n  } else if (m_l1norm < 1.125358383453143065081397882891878e+000L) {\n    pade13(m_M);\n  } else {\n    const long double maxnorm = 2.884233277829519311757165057717815L;\n    frexp(m_l1norm / maxnorm, &m_squarings);\n    if (m_squarings < 0) m_squarings = 0;\n    MatrixType A = m_M / Scalar(pow(2, m_squarings));\n    pade17(A);\n  }\n#else\n  // this case should be handled in compute()\n  eigen_assert(false && \"Bug in MatrixExponential\"); \n#endif  // LDBL_MANT_DIG\n}\n\n/** \\ingroup MatrixFunctions_Module\n  *\n  * \\brief Proxy for the matrix exponential of some matrix (expression).\n  *\n  * \\tparam Derived  Type of the argument to the matrix exponential.\n  *\n  * This class holds the argument to the matrix exponential until it\n  * is assigned or evaluated for some other reason (so the argument\n  * should not be changed in the meantime). It is the return type of\n  * MatrixBase::exp() and most of the time this is the only way it is\n  * used.\n  */\ntemplate<typename Derived> struct MatrixExponentialReturnValue\n: public ReturnByValue<MatrixExponentialReturnValue<Derived> >\n{\n    typedef typename Derived::Index Index;\n  public:\n    /** \\brief Constructor.\n      *\n      * \\param[in] src %Matrix (expression) forming the argument of the\n      * matrix exponential.\n      */\n    MatrixExponentialReturnValue(const Derived& src) : m_src(src) { }\n\n    /** \\brief Compute the matrix exponential.\n      *\n      * \\param[out] result the matrix exponential of \\p src in the\n      * constructor.\n      */\n    template <typename ResultType>\n    inline void evalTo(ResultType& result) const\n    {\n      const typename Derived::PlainObject srcEvaluated = m_src.eval();\n      MatrixExponential<typename Derived::PlainObject> me(srcEvaluated);\n      me.compute(result);\n    }\n\n    Index rows() const { return m_src.rows(); }\n    Index cols() const { return m_src.cols(); }\n\n  protected:\n    const Derived& m_src;\n  private:\n    MatrixExponentialReturnValue& operator=(const MatrixExponentialReturnValue&);\n};\n\nnamespace internal {\ntemplate<typename Derived>\nstruct traits<MatrixExponentialReturnValue<Derived> >\n{\n  typedef typename Derived::PlainObject ReturnType;\n};\n}\n\ntemplate <typename Derived>\nconst MatrixExponentialReturnValue<Derived> MatrixBase<Derived>::exp() const\n{\n  eigen_assert(rows() == cols());\n  return MatrixExponentialReturnValue<Derived>(derived());\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_MATRIX_EXPONENTIAL\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/MatrixFunctions/MatrixFunction.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009-2011 Jitse Niesen <jitse@maths.leeds.ac.uk>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_MATRIX_FUNCTION\n#define EIGEN_MATRIX_FUNCTION\n\n#include \"StemFunction.h\"\n#include \"MatrixFunctionAtomic.h\"\n\n\nnamespace Eigen { \n\n/** \\ingroup MatrixFunctions_Module\n  * \\brief Class for computing matrix functions.\n  * \\tparam  MatrixType  type of the argument of the matrix function,\n  *                      expected to be an instantiation of the Matrix class template.\n  * \\tparam  AtomicType  type for computing matrix function of atomic blocks.\n  * \\tparam  IsComplex   used internally to select correct specialization.\n  *\n  * This class implements the Schur-Parlett algorithm for computing matrix functions. The spectrum of the\n  * matrix is divided in clustered of eigenvalues that lies close together. This class delegates the\n  * computation of the matrix function on every block corresponding to these clusters to an object of type\n  * \\p AtomicType and uses these results to compute the matrix function of the whole matrix. The class\n  * \\p AtomicType should have a \\p compute() member function for computing the matrix function of a block.\n  *\n  * \\sa class MatrixFunctionAtomic, class MatrixLogarithmAtomic\n  */\ntemplate <typename MatrixType, \n\t  typename AtomicType,  \n          int IsComplex = NumTraits<typename internal::traits<MatrixType>::Scalar>::IsComplex>\nclass MatrixFunction\n{  \n  public:\n\n    /** \\brief Constructor. \n      *\n      * \\param[in]  A       argument of matrix function, should be a square matrix.\n      * \\param[in]  atomic  class for computing matrix function of atomic blocks.\n      *\n      * The class stores references to \\p A and \\p atomic, so they should not be\n      * changed (or destroyed) before compute() is called.\n      */\n    MatrixFunction(const MatrixType& A, AtomicType& atomic);\n\n    /** \\brief Compute the matrix function.\n      *\n      * \\param[out] result  the function \\p f applied to \\p A, as\n      * specified in the constructor.\n      *\n      * See MatrixBase::matrixFunction() for details on how this computation\n      * is implemented.\n      */\n    template <typename ResultType> \n    void compute(ResultType &result);    \n};\n\n\n/** \\internal \\ingroup MatrixFunctions_Module \n  * \\brief Partial specialization of MatrixFunction for real matrices\n  */\ntemplate <typename MatrixType, typename AtomicType>\nclass MatrixFunction<MatrixType, AtomicType, 0>\n{  \n  private:\n\n    typedef internal::traits<MatrixType> Traits;\n    typedef typename Traits::Scalar Scalar;\n    static const int Rows = Traits::RowsAtCompileTime;\n    static const int Cols = Traits::ColsAtCompileTime;\n    static const int Options = MatrixType::Options;\n    static const int MaxRows = Traits::MaxRowsAtCompileTime;\n    static const int MaxCols = Traits::MaxColsAtCompileTime;\n\n    typedef std::complex<Scalar> ComplexScalar;\n    typedef Matrix<ComplexScalar, Rows, Cols, Options, MaxRows, MaxCols> ComplexMatrix;\n\n  public:\n\n    /** \\brief Constructor. \n      *\n      * \\param[in]  A       argument of matrix function, should be a square matrix.\n      * \\param[in]  atomic  class for computing matrix function of atomic blocks.\n      */\n    MatrixFunction(const MatrixType& A, AtomicType& atomic) : m_A(A), m_atomic(atomic) { }\n\n    /** \\brief Compute the matrix function.\n      *\n      * \\param[out] result  the function \\p f applied to \\p A, as\n      * specified in the constructor.\n      *\n      * This function converts the real matrix \\c A to a complex matrix,\n      * uses MatrixFunction<MatrixType,1> and then converts the result back to\n      * a real matrix.\n      */\n    template <typename ResultType>\n    void compute(ResultType& result) \n    {\n      ComplexMatrix CA = m_A.template cast<ComplexScalar>();\n      ComplexMatrix Cresult;\n      MatrixFunction<ComplexMatrix, AtomicType> mf(CA, m_atomic);\n      mf.compute(Cresult);\n      result = Cresult.real();\n    }\n\n  private:\n    typename internal::nested<MatrixType>::type m_A; /**< \\brief Reference to argument of matrix function. */\n    AtomicType& m_atomic; /**< \\brief Class for computing matrix function of atomic blocks. */\n\n    MatrixFunction& operator=(const MatrixFunction&);\n};\n\n      \n/** \\internal \\ingroup MatrixFunctions_Module \n  * \\brief Partial specialization of MatrixFunction for complex matrices\n  */\ntemplate <typename MatrixType, typename AtomicType>\nclass MatrixFunction<MatrixType, AtomicType, 1>\n{\n  private:\n\n    typedef internal::traits<MatrixType> Traits;\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename MatrixType::Index Index;\n    static const int RowsAtCompileTime = Traits::RowsAtCompileTime;\n    static const int ColsAtCompileTime = Traits::ColsAtCompileTime;\n    static const int Options = MatrixType::Options;\n    typedef typename NumTraits<Scalar>::Real RealScalar;\n    typedef Matrix<Scalar, Traits::RowsAtCompileTime, 1> VectorType;\n    typedef Matrix<Index, Traits::RowsAtCompileTime, 1> IntVectorType;\n    typedef Matrix<Index, Dynamic, 1> DynamicIntVectorType;\n    typedef std::list<Scalar> Cluster;\n    typedef std::list<Cluster> ListOfClusters;\n    typedef Matrix<Scalar, Dynamic, Dynamic, Options, RowsAtCompileTime, ColsAtCompileTime> DynMatrixType;\n\n  public:\n\n    MatrixFunction(const MatrixType& A, AtomicType& atomic);\n    template <typename ResultType> void compute(ResultType& result);\n\n  private:\n\n    void computeSchurDecomposition();\n    void partitionEigenvalues();\n    typename ListOfClusters::iterator findCluster(Scalar key);\n    void computeClusterSize();\n    void computeBlockStart();\n    void constructPermutation();\n    void permuteSchur();\n    void swapEntriesInSchur(Index index);\n    void computeBlockAtomic();\n    Block<MatrixType> block(MatrixType& A, Index i, Index j);\n    void computeOffDiagonal();\n    DynMatrixType solveTriangularSylvester(const DynMatrixType& A, const DynMatrixType& B, const DynMatrixType& C);\n\n    typename internal::nested<MatrixType>::type m_A; /**< \\brief Reference to argument of matrix function. */\n    AtomicType& m_atomic; /**< \\brief Class for computing matrix function of atomic blocks. */\n    MatrixType m_T; /**< \\brief Triangular part of Schur decomposition */\n    MatrixType m_U; /**< \\brief Unitary part of Schur decomposition */\n    MatrixType m_fT; /**< \\brief %Matrix function applied to #m_T */\n    ListOfClusters m_clusters; /**< \\brief Partition of eigenvalues into clusters of ei'vals \"close\" to each other */\n    DynamicIntVectorType m_eivalToCluster; /**< \\brief m_eivalToCluster[i] = j means i-th ei'val is in j-th cluster */\n    DynamicIntVectorType m_clusterSize; /**< \\brief Number of eigenvalues in each clusters  */\n    DynamicIntVectorType m_blockStart; /**< \\brief Row index at which block corresponding to i-th cluster starts */\n    IntVectorType m_permutation; /**< \\brief Permutation which groups ei'vals in the same cluster together */\n\n    /** \\brief Maximum distance allowed between eigenvalues to be considered \"close\".\n      *\n      * This is morally a \\c static \\c const \\c Scalar, but only\n      * integers can be static constant class members in C++. The\n      * separation constant is set to 0.1, a value taken from the\n      * paper by Davies and Higham. */\n    static const RealScalar separation() { return static_cast<RealScalar>(0.1); }\n\n    MatrixFunction& operator=(const MatrixFunction&);\n};\n\n/** \\brief Constructor. \n *\n * \\param[in]  A       argument of matrix function, should be a square matrix.\n * \\param[in]  atomic  class for computing matrix function of atomic blocks.\n */\ntemplate <typename MatrixType, typename AtomicType>\nMatrixFunction<MatrixType,AtomicType,1>::MatrixFunction(const MatrixType& A, AtomicType& atomic)\n  : m_A(A), m_atomic(atomic)\n{\n  /* empty body */\n}\n\n/** \\brief Compute the matrix function.\n  *\n  * \\param[out] result  the function \\p f applied to \\p A, as\n  * specified in the constructor.\n  */\ntemplate <typename MatrixType, typename AtomicType>\ntemplate <typename ResultType>\nvoid MatrixFunction<MatrixType,AtomicType,1>::compute(ResultType& result) \n{\n  computeSchurDecomposition();\n  partitionEigenvalues();\n  computeClusterSize();\n  computeBlockStart();\n  constructPermutation();\n  permuteSchur();\n  computeBlockAtomic();\n  computeOffDiagonal();\n  result = m_U * (m_fT.template triangularView<Upper>() * m_U.adjoint());\n}\n\n/** \\brief Store the Schur decomposition of #m_A in #m_T and #m_U */\ntemplate <typename MatrixType, typename AtomicType>\nvoid MatrixFunction<MatrixType,AtomicType,1>::computeSchurDecomposition()\n{\n  const ComplexSchur<MatrixType> schurOfA(m_A);  \n  m_T = schurOfA.matrixT();\n  m_U = schurOfA.matrixU();\n}\n\n/** \\brief Partition eigenvalues in clusters of ei'vals close to each other\n  * \n  * This function computes #m_clusters. This is a partition of the\n  * eigenvalues of #m_T in clusters, such that\n  * # Any eigenvalue in a certain cluster is at most separation() away\n  *   from another eigenvalue in the same cluster.\n  * # The distance between two eigenvalues in different clusters is\n  *   more than separation().\n  * The implementation follows Algorithm 4.1 in the paper of Davies\n  * and Higham. \n  */\ntemplate <typename MatrixType, typename AtomicType>\nvoid MatrixFunction<MatrixType,AtomicType,1>::partitionEigenvalues()\n{\n  using std::abs;\n  const Index rows = m_T.rows();\n  VectorType diag = m_T.diagonal(); // contains eigenvalues of A\n\n  for (Index i=0; i<rows; ++i) {\n    // Find set containing diag(i), adding a new set if necessary\n    typename ListOfClusters::iterator qi = findCluster(diag(i));\n    if (qi == m_clusters.end()) {\n      Cluster l;\n      l.push_back(diag(i));\n      m_clusters.push_back(l);\n      qi = m_clusters.end();\n      --qi;\n    }\n\n    // Look for other element to add to the set\n    for (Index j=i+1; j<rows; ++j) {\n      if (abs(diag(j) - diag(i)) <= separation() && std::find(qi->begin(), qi->end(), diag(j)) == qi->end()) {\n        typename ListOfClusters::iterator qj = findCluster(diag(j));\n        if (qj == m_clusters.end()) {\n          qi->push_back(diag(j));\n        } else {\n          qi->insert(qi->end(), qj->begin(), qj->end());\n          m_clusters.erase(qj);\n        }\n      }\n    }\n  }\n}\n\n/** \\brief Find cluster in #m_clusters containing some value \n  * \\param[in] key Value to find\n  * \\returns Iterator to cluster containing \\c key, or\n  * \\c m_clusters.end() if no cluster in m_clusters contains \\c key.\n  */\ntemplate <typename MatrixType, typename AtomicType>\ntypename MatrixFunction<MatrixType,AtomicType,1>::ListOfClusters::iterator MatrixFunction<MatrixType,AtomicType,1>::findCluster(Scalar key)\n{\n  typename Cluster::iterator j;\n  for (typename ListOfClusters::iterator i = m_clusters.begin(); i != m_clusters.end(); ++i) {\n    j = std::find(i->begin(), i->end(), key);\n    if (j != i->end())\n      return i;\n  }\n  return m_clusters.end();\n}\n\n/** \\brief Compute #m_clusterSize and #m_eivalToCluster using #m_clusters */\ntemplate <typename MatrixType, typename AtomicType>\nvoid MatrixFunction<MatrixType,AtomicType,1>::computeClusterSize()\n{\n  const Index rows = m_T.rows();\n  VectorType diag = m_T.diagonal(); \n  const Index numClusters = static_cast<Index>(m_clusters.size());\n\n  m_clusterSize.setZero(numClusters);\n  m_eivalToCluster.resize(rows);\n  Index clusterIndex = 0;\n  for (typename ListOfClusters::const_iterator cluster = m_clusters.begin(); cluster != m_clusters.end(); ++cluster) {\n    for (Index i = 0; i < diag.rows(); ++i) {\n      if (std::find(cluster->begin(), cluster->end(), diag(i)) != cluster->end()) {\n        ++m_clusterSize[clusterIndex];\n        m_eivalToCluster[i] = clusterIndex;\n      }\n    }\n    ++clusterIndex;\n  }\n}\n\n/** \\brief Compute #m_blockStart using #m_clusterSize */\ntemplate <typename MatrixType, typename AtomicType>\nvoid MatrixFunction<MatrixType,AtomicType,1>::computeBlockStart()\n{\n  m_blockStart.resize(m_clusterSize.rows());\n  m_blockStart(0) = 0;\n  for (Index i = 1; i < m_clusterSize.rows(); i++) {\n    m_blockStart(i) = m_blockStart(i-1) + m_clusterSize(i-1);\n  }\n}\n\n/** \\brief Compute #m_permutation using #m_eivalToCluster and #m_blockStart */\ntemplate <typename MatrixType, typename AtomicType>\nvoid MatrixFunction<MatrixType,AtomicType,1>::constructPermutation()\n{\n  DynamicIntVectorType indexNextEntry = m_blockStart;\n  m_permutation.resize(m_T.rows());\n  for (Index i = 0; i < m_T.rows(); i++) {\n    Index cluster = m_eivalToCluster[i];\n    m_permutation[i] = indexNextEntry[cluster];\n    ++indexNextEntry[cluster];\n  }\n}  \n\n/** \\brief Permute Schur decomposition in #m_U and #m_T according to #m_permutation */\ntemplate <typename MatrixType, typename AtomicType>\nvoid MatrixFunction<MatrixType,AtomicType,1>::permuteSchur()\n{\n  IntVectorType p = m_permutation;\n  for (Index i = 0; i < p.rows() - 1; i++) {\n    Index j;\n    for (j = i; j < p.rows(); j++) {\n      if (p(j) == i) break;\n    }\n    eigen_assert(p(j) == i);\n    for (Index k = j-1; k >= i; k--) {\n      swapEntriesInSchur(k);\n      std::swap(p.coeffRef(k), p.coeffRef(k+1));\n    }\n  }\n}\n\n/** \\brief Swap rows \\a index and \\a index+1 in Schur decomposition in #m_U and #m_T */\ntemplate <typename MatrixType, typename AtomicType>\nvoid MatrixFunction<MatrixType,AtomicType,1>::swapEntriesInSchur(Index index)\n{\n  JacobiRotation<Scalar> rotation;\n  rotation.makeGivens(m_T(index, index+1), m_T(index+1, index+1) - m_T(index, index));\n  m_T.applyOnTheLeft(index, index+1, rotation.adjoint());\n  m_T.applyOnTheRight(index, index+1, rotation);\n  m_U.applyOnTheRight(index, index+1, rotation);\n}  \n\n/** \\brief Compute block diagonal part of #m_fT.\n  *\n  * This routine computes the matrix function applied to the block diagonal part of #m_T, with the blocking\n  * given by #m_blockStart. The matrix function of each diagonal block is computed by #m_atomic. The\n  * off-diagonal parts of #m_fT are set to zero.\n  */\ntemplate <typename MatrixType, typename AtomicType>\nvoid MatrixFunction<MatrixType,AtomicType,1>::computeBlockAtomic()\n{ \n  m_fT.resize(m_T.rows(), m_T.cols());\n  m_fT.setZero();\n  for (Index i = 0; i < m_clusterSize.rows(); ++i) {\n    block(m_fT, i, i) = m_atomic.compute(block(m_T, i, i));\n  }\n}\n\n/** \\brief Return block of matrix according to blocking given by #m_blockStart */\ntemplate <typename MatrixType, typename AtomicType>\nBlock<MatrixType> MatrixFunction<MatrixType,AtomicType,1>::block(MatrixType& A, Index i, Index j)\n{\n  return A.block(m_blockStart(i), m_blockStart(j), m_clusterSize(i), m_clusterSize(j));\n}\n\n/** \\brief Compute part of #m_fT above block diagonal.\n  *\n  * This routine assumes that the block diagonal part of #m_fT (which\n  * equals the matrix function applied to #m_T) has already been computed and computes\n  * the part above the block diagonal. The part below the diagonal is\n  * zero, because #m_T is upper triangular.\n  */\ntemplate <typename MatrixType, typename AtomicType>\nvoid MatrixFunction<MatrixType,AtomicType,1>::computeOffDiagonal()\n{ \n  for (Index diagIndex = 1; diagIndex < m_clusterSize.rows(); diagIndex++) {\n    for (Index blockIndex = 0; blockIndex < m_clusterSize.rows() - diagIndex; blockIndex++) {\n      // compute (blockIndex, blockIndex+diagIndex) block\n      DynMatrixType A = block(m_T, blockIndex, blockIndex);\n      DynMatrixType B = -block(m_T, blockIndex+diagIndex, blockIndex+diagIndex);\n      DynMatrixType C = block(m_fT, blockIndex, blockIndex) * block(m_T, blockIndex, blockIndex+diagIndex);\n      C -= block(m_T, blockIndex, blockIndex+diagIndex) * block(m_fT, blockIndex+diagIndex, blockIndex+diagIndex);\n      for (Index k = blockIndex + 1; k < blockIndex + diagIndex; k++) {\n\tC += block(m_fT, blockIndex, k) * block(m_T, k, blockIndex+diagIndex);\n\tC -= block(m_T, blockIndex, k) * block(m_fT, k, blockIndex+diagIndex);\n      }\n      block(m_fT, blockIndex, blockIndex+diagIndex) = solveTriangularSylvester(A, B, C);\n    }\n  }\n}\n\n/** \\brief Solve a triangular Sylvester equation AX + XB = C \n  *\n  * \\param[in]  A  the matrix A; should be square and upper triangular\n  * \\param[in]  B  the matrix B; should be square and upper triangular\n  * \\param[in]  C  the matrix C; should have correct size.\n  *\n  * \\returns the solution X.\n  *\n  * If A is m-by-m and B is n-by-n, then both C and X are m-by-n. \n  * The (i,j)-th component of the Sylvester equation is\n  * \\f[ \n  *     \\sum_{k=i}^m A_{ik} X_{kj} + \\sum_{k=1}^j X_{ik} B_{kj} = C_{ij}. \n  * \\f]\n  * This can be re-arranged to yield:\n  * \\f[ \n  *     X_{ij} = \\frac{1}{A_{ii} + B_{jj}} \\Bigl( C_{ij}\n  *     - \\sum_{k=i+1}^m A_{ik} X_{kj} - \\sum_{k=1}^{j-1} X_{ik} B_{kj} \\Bigr).\n  * \\f]\n  * It is assumed that A and B are such that the numerator is never\n  * zero (otherwise the Sylvester equation does not have a unique\n  * solution). In that case, these equations can be evaluated in the\n  * order \\f$ i=m,\\ldots,1 \\f$ and \\f$ j=1,\\ldots,n \\f$.\n  */\ntemplate <typename MatrixType, typename AtomicType>\ntypename MatrixFunction<MatrixType,AtomicType,1>::DynMatrixType MatrixFunction<MatrixType,AtomicType,1>::solveTriangularSylvester(\n  const DynMatrixType& A, \n  const DynMatrixType& B, \n  const DynMatrixType& C)\n{\n  eigen_assert(A.rows() == A.cols());\n  eigen_assert(A.isUpperTriangular());\n  eigen_assert(B.rows() == B.cols());\n  eigen_assert(B.isUpperTriangular());\n  eigen_assert(C.rows() == A.rows());\n  eigen_assert(C.cols() == B.rows());\n\n  Index m = A.rows();\n  Index n = B.rows();\n  DynMatrixType X(m, n);\n\n  for (Index i = m - 1; i >= 0; --i) {\n    for (Index j = 0; j < n; ++j) {\n\n      // Compute AX = \\sum_{k=i+1}^m A_{ik} X_{kj}\n      Scalar AX;\n      if (i == m - 1) {\n\tAX = 0; \n      } else {\n\tMatrix<Scalar,1,1> AXmatrix = A.row(i).tail(m-1-i) * X.col(j).tail(m-1-i);\n\tAX = AXmatrix(0,0);\n      }\n\n      // Compute XB = \\sum_{k=1}^{j-1} X_{ik} B_{kj}\n      Scalar XB;\n      if (j == 0) {\n\tXB = 0; \n      } else {\n\tMatrix<Scalar,1,1> XBmatrix = X.row(i).head(j) * B.col(j).head(j);\n\tXB = XBmatrix(0,0);\n      }\n\n      X(i,j) = (C(i,j) - AX - XB) / (A(i,i) + B(j,j));\n    }\n  }\n  return X;\n}\n\n/** \\ingroup MatrixFunctions_Module\n  *\n  * \\brief Proxy for the matrix function of some matrix (expression).\n  *\n  * \\tparam Derived  Type of the argument to the matrix function.\n  *\n  * This class holds the argument to the matrix function until it is\n  * assigned or evaluated for some other reason (so the argument\n  * should not be changed in the meantime). It is the return type of\n  * matrixBase::matrixFunction() and related functions and most of the\n  * time this is the only way it is used.\n  */\ntemplate<typename Derived> class MatrixFunctionReturnValue\n: public ReturnByValue<MatrixFunctionReturnValue<Derived> >\n{\n  public:\n\n    typedef typename Derived::Scalar Scalar;\n    typedef typename Derived::Index Index;\n    typedef typename internal::stem_function<Scalar>::type StemFunction;\n\n   /** \\brief Constructor.\n      *\n      * \\param[in] A  %Matrix (expression) forming the argument of the\n      * matrix function.\n      * \\param[in] f  Stem function for matrix function under consideration.\n      */\n    MatrixFunctionReturnValue(const Derived& A, StemFunction f) : m_A(A), m_f(f) { }\n\n    /** \\brief Compute the matrix function.\n      *\n      * \\param[out] result \\p f applied to \\p A, where \\p f and \\p A\n      * are as in the constructor.\n      */\n    template <typename ResultType>\n    inline void evalTo(ResultType& result) const\n    {\n      typedef typename Derived::PlainObject PlainObject;\n      typedef internal::traits<PlainObject> Traits;\n      static const int RowsAtCompileTime = Traits::RowsAtCompileTime;\n      static const int ColsAtCompileTime = Traits::ColsAtCompileTime;\n      static const int Options = PlainObject::Options;\n      typedef std::complex<typename NumTraits<Scalar>::Real> ComplexScalar;\n      typedef Matrix<ComplexScalar, Dynamic, Dynamic, Options, RowsAtCompileTime, ColsAtCompileTime> DynMatrixType;\n      typedef MatrixFunctionAtomic<DynMatrixType> AtomicType;\n      AtomicType atomic(m_f);\n\n      const PlainObject Aevaluated = m_A.eval();\n      MatrixFunction<PlainObject, AtomicType> mf(Aevaluated, atomic);\n      mf.compute(result);\n    }\n\n    Index rows() const { return m_A.rows(); }\n    Index cols() const { return m_A.cols(); }\n\n  private:\n    typename internal::nested<Derived>::type m_A;\n    StemFunction *m_f;\n\n    MatrixFunctionReturnValue& operator=(const MatrixFunctionReturnValue&);\n};\n\nnamespace internal {\ntemplate<typename Derived>\nstruct traits<MatrixFunctionReturnValue<Derived> >\n{\n  typedef typename Derived::PlainObject ReturnType;\n};\n}\n\n\n/********** MatrixBase methods **********/\n\n\ntemplate <typename Derived>\nconst MatrixFunctionReturnValue<Derived> MatrixBase<Derived>::matrixFunction(typename internal::stem_function<typename internal::traits<Derived>::Scalar>::type f) const\n{\n  eigen_assert(rows() == cols());\n  return MatrixFunctionReturnValue<Derived>(derived(), f);\n}\n\ntemplate <typename Derived>\nconst MatrixFunctionReturnValue<Derived> MatrixBase<Derived>::sin() const\n{\n  eigen_assert(rows() == cols());\n  typedef typename internal::stem_function<Scalar>::ComplexScalar ComplexScalar;\n  return MatrixFunctionReturnValue<Derived>(derived(), StdStemFunctions<ComplexScalar>::sin);\n}\n\ntemplate <typename Derived>\nconst MatrixFunctionReturnValue<Derived> MatrixBase<Derived>::cos() const\n{\n  eigen_assert(rows() == cols());\n  typedef typename internal::stem_function<Scalar>::ComplexScalar ComplexScalar;\n  return MatrixFunctionReturnValue<Derived>(derived(), StdStemFunctions<ComplexScalar>::cos);\n}\n\ntemplate <typename Derived>\nconst MatrixFunctionReturnValue<Derived> MatrixBase<Derived>::sinh() const\n{\n  eigen_assert(rows() == cols());\n  typedef typename internal::stem_function<Scalar>::ComplexScalar ComplexScalar;\n  return MatrixFunctionReturnValue<Derived>(derived(), StdStemFunctions<ComplexScalar>::sinh);\n}\n\ntemplate <typename Derived>\nconst MatrixFunctionReturnValue<Derived> MatrixBase<Derived>::cosh() const\n{\n  eigen_assert(rows() == cols());\n  typedef typename internal::stem_function<Scalar>::ComplexScalar ComplexScalar;\n  return MatrixFunctionReturnValue<Derived>(derived(), StdStemFunctions<ComplexScalar>::cosh);\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_MATRIX_FUNCTION\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/MatrixFunctions/MatrixFunctionAtomic.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Jitse Niesen <jitse@maths.leeds.ac.uk>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_MATRIX_FUNCTION_ATOMIC\n#define EIGEN_MATRIX_FUNCTION_ATOMIC\n\nnamespace Eigen { \n\n/** \\ingroup MatrixFunctions_Module\n  * \\class MatrixFunctionAtomic\n  * \\brief Helper class for computing matrix functions of atomic matrices.\n  *\n  * \\internal\n  * Here, an atomic matrix is a triangular matrix whose diagonal\n  * entries are close to each other.\n  */\ntemplate <typename MatrixType>\nclass MatrixFunctionAtomic\n{\n  public:\n\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename MatrixType::Index Index;\n    typedef typename NumTraits<Scalar>::Real RealScalar;\n    typedef typename internal::stem_function<Scalar>::type StemFunction;\n    typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> VectorType;\n\n    /** \\brief Constructor\n      * \\param[in]  f  matrix function to compute.\n      */\n    MatrixFunctionAtomic(StemFunction f) : m_f(f) { }\n\n    /** \\brief Compute matrix function of atomic matrix\n      * \\param[in]  A  argument of matrix function, should be upper triangular and atomic\n      * \\returns  f(A), the matrix function evaluated at the given matrix\n      */\n    MatrixType compute(const MatrixType& A);\n\n  private:\n\n    // Prevent copying\n    MatrixFunctionAtomic(const MatrixFunctionAtomic&);\n    MatrixFunctionAtomic& operator=(const MatrixFunctionAtomic&);\n\n    void computeMu();\n    bool taylorConverged(Index s, const MatrixType& F, const MatrixType& Fincr, const MatrixType& P);\n\n    /** \\brief Pointer to scalar function */\n    StemFunction* m_f;\n\n    /** \\brief Size of matrix function */\n    Index m_Arows;\n\n    /** \\brief Mean of eigenvalues */\n    Scalar m_avgEival;\n\n    /** \\brief Argument shifted by mean of eigenvalues */\n    MatrixType m_Ashifted;\n\n    /** \\brief Constant used to determine whether Taylor series has converged */\n    RealScalar m_mu;\n};\n\ntemplate <typename MatrixType>\nMatrixType MatrixFunctionAtomic<MatrixType>::compute(const MatrixType& A)\n{\n  // TODO: Use that A is upper triangular\n  m_Arows = A.rows();\n  m_avgEival = A.trace() / Scalar(RealScalar(m_Arows));\n  m_Ashifted = A - m_avgEival * MatrixType::Identity(m_Arows, m_Arows);\n  computeMu();\n  MatrixType F = m_f(m_avgEival, 0) * MatrixType::Identity(m_Arows, m_Arows);\n  MatrixType P = m_Ashifted;\n  MatrixType Fincr;\n  for (Index s = 1; s < 1.1 * m_Arows + 10; s++) { // upper limit is fairly arbitrary\n    Fincr = m_f(m_avgEival, static_cast<int>(s)) * P;\n    F += Fincr;\n    P = Scalar(RealScalar(1.0/(s + 1))) * P * m_Ashifted;\n    if (taylorConverged(s, F, Fincr, P)) {\n      return F;\n    }\n  }\n  eigen_assert(\"Taylor series does not converge\" && 0);\n  return F;\n}\n\n/** \\brief Compute \\c m_mu. */\ntemplate <typename MatrixType>\nvoid MatrixFunctionAtomic<MatrixType>::computeMu()\n{\n  const MatrixType N = MatrixType::Identity(m_Arows, m_Arows) - m_Ashifted;\n  VectorType e = VectorType::Ones(m_Arows);\n  N.template triangularView<Upper>().solveInPlace(e);\n  m_mu = e.cwiseAbs().maxCoeff();\n}\n\n/** \\brief Determine whether Taylor series has converged */\ntemplate <typename MatrixType>\nbool MatrixFunctionAtomic<MatrixType>::taylorConverged(Index s, const MatrixType& F,\n\t\t\t\t\t\t       const MatrixType& Fincr, const MatrixType& P)\n{\n  const Index n = F.rows();\n  const RealScalar F_norm = F.cwiseAbs().rowwise().sum().maxCoeff();\n  const RealScalar Fincr_norm = Fincr.cwiseAbs().rowwise().sum().maxCoeff();\n  if (Fincr_norm < NumTraits<Scalar>::epsilon() * F_norm) {\n    RealScalar delta = 0;\n    RealScalar rfactorial = 1;\n    for (Index r = 0; r < n; r++) {\n      RealScalar mx = 0;\n      for (Index i = 0; i < n; i++)\n        mx = (std::max)(mx, std::abs(m_f(m_Ashifted(i, i) + m_avgEival, static_cast<int>(s+r))));\n      if (r != 0)\n        rfactorial *= RealScalar(r);\n      delta = (std::max)(delta, mx / rfactorial);\n    }\n    const RealScalar P_norm = P.cwiseAbs().rowwise().sum().maxCoeff();\n    if (m_mu * delta * P_norm < NumTraits<Scalar>::epsilon() * F_norm)\n      return true;\n  }\n  return false;\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_MATRIX_FUNCTION_ATOMIC\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/MatrixFunctions/MatrixLogarithm.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2011 Jitse Niesen <jitse@maths.leeds.ac.uk>\n// Copyright (C) 2011 Chen-Pang He <jdh8@ms63.hinet.net>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_MATRIX_LOGARITHM\n#define EIGEN_MATRIX_LOGARITHM\n\n#ifndef M_PI\n#define M_PI 3.141592653589793238462643383279503L\n#endif\n\nnamespace Eigen { \n\n/** \\ingroup MatrixFunctions_Module\n  * \\class MatrixLogarithmAtomic\n  * \\brief Helper class for computing matrix logarithm of atomic matrices.\n  *\n  * \\internal\n  * Here, an atomic matrix is a triangular matrix whose diagonal\n  * entries are close to each other.\n  *\n  * \\sa class MatrixFunctionAtomic, MatrixBase::log()\n  */\ntemplate <typename MatrixType>\nclass MatrixLogarithmAtomic\n{\npublic:\n\n  typedef typename MatrixType::Scalar Scalar;\n  // typedef typename MatrixType::Index Index;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  // typedef typename internal::stem_function<Scalar>::type StemFunction;\n  // typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> VectorType;\n\n  /** \\brief Constructor. */\n  MatrixLogarithmAtomic() { }\n\n  /** \\brief Compute matrix logarithm of atomic matrix\n    * \\param[in]  A  argument of matrix logarithm, should be upper triangular and atomic\n    * \\returns  The logarithm of \\p A.\n    */\n  MatrixType compute(const MatrixType& A);\n\nprivate:\n\n  void compute2x2(const MatrixType& A, MatrixType& result);\n  void computeBig(const MatrixType& A, MatrixType& result);\n  int getPadeDegree(float normTminusI);\n  int getPadeDegree(double normTminusI);\n  int getPadeDegree(long double normTminusI);\n  void computePade(MatrixType& result, const MatrixType& T, int degree);\n  void computePade3(MatrixType& result, const MatrixType& T);\n  void computePade4(MatrixType& result, const MatrixType& T);\n  void computePade5(MatrixType& result, const MatrixType& T);\n  void computePade6(MatrixType& result, const MatrixType& T);\n  void computePade7(MatrixType& result, const MatrixType& T);\n  void computePade8(MatrixType& result, const MatrixType& T);\n  void computePade9(MatrixType& result, const MatrixType& T);\n  void computePade10(MatrixType& result, const MatrixType& T);\n  void computePade11(MatrixType& result, const MatrixType& T);\n\n  static const int minPadeDegree = 3;\n  static const int maxPadeDegree = std::numeric_limits<RealScalar>::digits<= 24?  5:  // single precision\n                                   std::numeric_limits<RealScalar>::digits<= 53?  7:  // double precision\n                                   std::numeric_limits<RealScalar>::digits<= 64?  8:  // extended precision\n                                   std::numeric_limits<RealScalar>::digits<=106? 10:  // double-double\n                                                                                 11;  // quadruple precision\n\n  // Prevent copying\n  MatrixLogarithmAtomic(const MatrixLogarithmAtomic&);\n  MatrixLogarithmAtomic& operator=(const MatrixLogarithmAtomic&);\n};\n\n/** \\brief Compute logarithm of triangular matrix with clustered eigenvalues. */\ntemplate <typename MatrixType>\nMatrixType MatrixLogarithmAtomic<MatrixType>::compute(const MatrixType& A)\n{\n  using std::log;\n  MatrixType result(A.rows(), A.rows());\n  if (A.rows() == 1)\n    result(0,0) = log(A(0,0));\n  else if (A.rows() == 2)\n    compute2x2(A, result);\n  else\n    computeBig(A, result);\n  return result;\n}\n\n/** \\brief Compute logarithm of 2x2 triangular matrix. */\ntemplate <typename MatrixType>\nvoid MatrixLogarithmAtomic<MatrixType>::compute2x2(const MatrixType& A, MatrixType& result)\n{\n  using std::abs;\n  using std::ceil;\n  using std::imag;\n  using std::log;\n\n  Scalar logA00 = log(A(0,0));\n  Scalar logA11 = log(A(1,1));\n\n  result(0,0) = logA00;\n  result(1,0) = Scalar(0);\n  result(1,1) = logA11;\n\n  if (A(0,0) == A(1,1)) {\n    result(0,1) = A(0,1) / A(0,0);\n  } else if ((abs(A(0,0)) < 0.5*abs(A(1,1))) || (abs(A(0,0)) > 2*abs(A(1,1)))) {\n    result(0,1) = A(0,1) * (logA11 - logA00) / (A(1,1) - A(0,0));\n  } else {\n    // computation in previous branch is inaccurate if A(1,1) \\approx A(0,0)\n    int unwindingNumber = static_cast<int>(ceil((imag(logA11 - logA00) - M_PI) / (2*M_PI)));\n    Scalar y = A(1,1) - A(0,0), x = A(1,1) + A(0,0);\n    result(0,1) = A(0,1) * (Scalar(2) * numext::atanh2(y,x) + Scalar(0,2*M_PI*unwindingNumber)) / y;\n  }\n}\n\n/** \\brief Compute logarithm of triangular matrices with size > 2. \n  * \\details This uses a inverse scale-and-square algorithm. */\ntemplate <typename MatrixType>\nvoid MatrixLogarithmAtomic<MatrixType>::computeBig(const MatrixType& A, MatrixType& result)\n{\n  using std::pow;\n  int numberOfSquareRoots = 0;\n  int numberOfExtraSquareRoots = 0;\n  int degree;\n  MatrixType T = A, sqrtT;\n  const RealScalar maxNormForPade = maxPadeDegree<= 5? 5.3149729967117310e-1:                     // single precision\n                                    maxPadeDegree<= 7? 2.6429608311114350e-1:                     // double precision\n                                    maxPadeDegree<= 8? 2.32777776523703892094e-1L:                // extended precision\n                                    maxPadeDegree<=10? 1.05026503471351080481093652651105e-1L:    // double-double\n                                                       1.1880960220216759245467951592883642e-1L;  // quadruple precision\n\n  while (true) {\n    RealScalar normTminusI = (T - MatrixType::Identity(T.rows(), T.rows())).cwiseAbs().colwise().sum().maxCoeff();\n    if (normTminusI < maxNormForPade) {\n      degree = getPadeDegree(normTminusI);\n      int degree2 = getPadeDegree(normTminusI / RealScalar(2));\n      if ((degree - degree2 <= 1) || (numberOfExtraSquareRoots == 1)) \n        break;\n      ++numberOfExtraSquareRoots;\n    }\n    MatrixSquareRootTriangular<MatrixType>(T).compute(sqrtT);\n    T = sqrtT.template triangularView<Upper>();\n    ++numberOfSquareRoots;\n  }\n\n  computePade(result, T, degree);\n  result *= pow(RealScalar(2), numberOfSquareRoots);\n}\n\n/* \\brief Get suitable degree for Pade approximation. (specialized for RealScalar = float) */\ntemplate <typename MatrixType>\nint MatrixLogarithmAtomic<MatrixType>::getPadeDegree(float normTminusI)\n{\n  const float maxNormForPade[] = { 2.5111573934555054e-1 /* degree = 3 */ , 4.0535837411880493e-1,\n            5.3149729967117310e-1 };\n  int degree = 3;\n  for (; degree <= maxPadeDegree; ++degree) \n    if (normTminusI <= maxNormForPade[degree - minPadeDegree])\n      break;\n  return degree;\n}\n\n/* \\brief Get suitable degree for Pade approximation. (specialized for RealScalar = double) */\ntemplate <typename MatrixType>\nint MatrixLogarithmAtomic<MatrixType>::getPadeDegree(double normTminusI)\n{\n  const double maxNormForPade[] = { 1.6206284795015624e-2 /* degree = 3 */ , 5.3873532631381171e-2,\n            1.1352802267628681e-1, 1.8662860613541288e-1, 2.642960831111435e-1 };\n  int degree = 3;\n  for (; degree <= maxPadeDegree; ++degree)\n    if (normTminusI <= maxNormForPade[degree - minPadeDegree])\n      break;\n  return degree;\n}\n\n/* \\brief Get suitable degree for Pade approximation. (specialized for RealScalar = long double) */\ntemplate <typename MatrixType>\nint MatrixLogarithmAtomic<MatrixType>::getPadeDegree(long double normTminusI)\n{\n#if   LDBL_MANT_DIG == 53         // double precision\n  const long double maxNormForPade[] = { 1.6206284795015624e-2L /* degree = 3 */ , 5.3873532631381171e-2L,\n            1.1352802267628681e-1L, 1.8662860613541288e-1L, 2.642960831111435e-1L };\n#elif LDBL_MANT_DIG <= 64         // extended precision\n  const long double maxNormForPade[] = { 5.48256690357782863103e-3L /* degree = 3 */, 2.34559162387971167321e-2L,\n            5.84603923897347449857e-2L, 1.08486423756725170223e-1L, 1.68385767881294446649e-1L,\n            2.32777776523703892094e-1L };\n#elif LDBL_MANT_DIG <= 106        // double-double\n  const long double maxNormForPade[] = { 8.58970550342939562202529664318890e-5L /* degree = 3 */,\n            9.34074328446359654039446552677759e-4L, 4.26117194647672175773064114582860e-3L,\n            1.21546224740281848743149666560464e-2L, 2.61100544998339436713088248557444e-2L,\n            4.66170074627052749243018566390567e-2L, 7.32585144444135027565872014932387e-2L,\n            1.05026503471351080481093652651105e-1L };\n#else                             // quadruple precision\n  const long double maxNormForPade[] = { 4.7419931187193005048501568167858103e-5L /* degree = 3 */,\n            5.8853168473544560470387769480192666e-4L, 2.9216120366601315391789493628113520e-3L,\n            8.8415758124319434347116734705174308e-3L, 1.9850836029449446668518049562565291e-2L,\n            3.6688019729653446926585242192447447e-2L, 5.9290962294020186998954055264528393e-2L,\n            8.6998436081634343903250580992127677e-2L, 1.1880960220216759245467951592883642e-1L };\n#endif\n  int degree = 3;\n  for (; degree <= maxPadeDegree; ++degree)\n    if (normTminusI <= maxNormForPade[degree - minPadeDegree])\n      break;\n  return degree;\n}\n\n/* \\brief Compute Pade approximation to matrix logarithm */\ntemplate <typename MatrixType>\nvoid MatrixLogarithmAtomic<MatrixType>::computePade(MatrixType& result, const MatrixType& T, int degree)\n{\n  switch (degree) {\n    case 3:  computePade3(result, T);  break;\n    case 4:  computePade4(result, T);  break;\n    case 5:  computePade5(result, T);  break;\n    case 6:  computePade6(result, T);  break;\n    case 7:  computePade7(result, T);  break;\n    case 8:  computePade8(result, T);  break;\n    case 9:  computePade9(result, T);  break;\n    case 10: computePade10(result, T); break;\n    case 11: computePade11(result, T); break;\n    default: assert(false); // should never happen\n  }\n} \n\ntemplate <typename MatrixType>\nvoid MatrixLogarithmAtomic<MatrixType>::computePade3(MatrixType& result, const MatrixType& T)\n{\n  const int degree = 3;\n  const RealScalar nodes[]   = { 0.1127016653792583114820734600217600L, 0.5000000000000000000000000000000000L,\n            0.8872983346207416885179265399782400L };\n  const RealScalar weights[] = { 0.2777777777777777777777777777777778L, 0.4444444444444444444444444444444444L,\n            0.2777777777777777777777777777777778L };\n  eigen_assert(degree <= maxPadeDegree);\n  MatrixType TminusI = T - MatrixType::Identity(T.rows(), T.rows());\n  result.setZero(T.rows(), T.rows());\n  for (int k = 0; k < degree; ++k)\n    result += weights[k] * (MatrixType::Identity(T.rows(), T.rows()) + nodes[k] * TminusI)\n                           .template triangularView<Upper>().solve(TminusI);\n}\n\ntemplate <typename MatrixType>\nvoid MatrixLogarithmAtomic<MatrixType>::computePade4(MatrixType& result, const MatrixType& T)\n{\n  const int degree = 4;\n  const RealScalar nodes[]   = { 0.0694318442029737123880267555535953L, 0.3300094782075718675986671204483777L,\n            0.6699905217924281324013328795516223L, 0.9305681557970262876119732444464048L };\n  const RealScalar weights[] = { 0.1739274225687269286865319746109997L, 0.3260725774312730713134680253890003L,\n            0.3260725774312730713134680253890003L, 0.1739274225687269286865319746109997L };\n  eigen_assert(degree <= maxPadeDegree);\n  MatrixType TminusI = T - MatrixType::Identity(T.rows(), T.rows());\n  result.setZero(T.rows(), T.rows());\n  for (int k = 0; k < degree; ++k)\n    result += weights[k] * (MatrixType::Identity(T.rows(), T.rows()) + nodes[k] * TminusI)\n                           .template triangularView<Upper>().solve(TminusI);\n}\n\ntemplate <typename MatrixType>\nvoid MatrixLogarithmAtomic<MatrixType>::computePade5(MatrixType& result, const MatrixType& T)\n{\n  const int degree = 5;\n  const RealScalar nodes[]   = { 0.0469100770306680036011865608503035L, 0.2307653449471584544818427896498956L,\n            0.5000000000000000000000000000000000L, 0.7692346550528415455181572103501044L,\n            0.9530899229693319963988134391496965L };\n  const RealScalar weights[] = { 0.1184634425280945437571320203599587L, 0.2393143352496832340206457574178191L,\n            0.2844444444444444444444444444444444L, 0.2393143352496832340206457574178191L,\n            0.1184634425280945437571320203599587L };\n  eigen_assert(degree <= maxPadeDegree);\n  MatrixType TminusI = T - MatrixType::Identity(T.rows(), T.rows());\n  result.setZero(T.rows(), T.rows());\n  for (int k = 0; k < degree; ++k)\n    result += weights[k] * (MatrixType::Identity(T.rows(), T.rows()) + nodes[k] * TminusI)\n                           .template triangularView<Upper>().solve(TminusI);\n}\n\ntemplate <typename MatrixType>\nvoid MatrixLogarithmAtomic<MatrixType>::computePade6(MatrixType& result, const MatrixType& T)\n{\n  const int degree = 6;\n  const RealScalar nodes[]   = { 0.0337652428984239860938492227530027L, 0.1693953067668677431693002024900473L,\n            0.3806904069584015456847491391596440L, 0.6193095930415984543152508608403560L,\n            0.8306046932331322568306997975099527L, 0.9662347571015760139061507772469973L };\n  const RealScalar weights[] = { 0.0856622461895851725201480710863665L, 0.1803807865240693037849167569188581L,\n            0.2339569672863455236949351719947755L, 0.2339569672863455236949351719947755L,\n            0.1803807865240693037849167569188581L, 0.0856622461895851725201480710863665L };\n  eigen_assert(degree <= maxPadeDegree);\n  MatrixType TminusI = T - MatrixType::Identity(T.rows(), T.rows());\n  result.setZero(T.rows(), T.rows());\n  for (int k = 0; k < degree; ++k)\n    result += weights[k] * (MatrixType::Identity(T.rows(), T.rows()) + nodes[k] * TminusI)\n                           .template triangularView<Upper>().solve(TminusI);\n}\n\ntemplate <typename MatrixType>\nvoid MatrixLogarithmAtomic<MatrixType>::computePade7(MatrixType& result, const MatrixType& T)\n{\n  const int degree = 7;\n  const RealScalar nodes[]   = { 0.0254460438286207377369051579760744L, 0.1292344072003027800680676133596058L,\n            0.2970774243113014165466967939615193L, 0.5000000000000000000000000000000000L,\n            0.7029225756886985834533032060384807L, 0.8707655927996972199319323866403942L,\n            0.9745539561713792622630948420239256L };\n  const RealScalar weights[] = { 0.0647424830844348466353057163395410L, 0.1398526957446383339507338857118898L,\n            0.1909150252525594724751848877444876L, 0.2089795918367346938775510204081633L,\n            0.1909150252525594724751848877444876L, 0.1398526957446383339507338857118898L,\n            0.0647424830844348466353057163395410L };\n  eigen_assert(degree <= maxPadeDegree);\n  MatrixType TminusI = T - MatrixType::Identity(T.rows(), T.rows());\n  result.setZero(T.rows(), T.rows());\n  for (int k = 0; k < degree; ++k)\n    result += weights[k] * (MatrixType::Identity(T.rows(), T.rows()) + nodes[k] * TminusI)\n                           .template triangularView<Upper>().solve(TminusI);\n}\n\ntemplate <typename MatrixType>\nvoid MatrixLogarithmAtomic<MatrixType>::computePade8(MatrixType& result, const MatrixType& T)\n{\n  const int degree = 8;\n  const RealScalar nodes[]   = { 0.0198550717512318841582195657152635L, 0.1016667612931866302042230317620848L,\n            0.2372337950418355070911304754053768L, 0.4082826787521750975302619288199080L,\n            0.5917173212478249024697380711800920L, 0.7627662049581644929088695245946232L,\n            0.8983332387068133697957769682379152L, 0.9801449282487681158417804342847365L };\n  const RealScalar weights[] = { 0.0506142681451881295762656771549811L, 0.1111905172266872352721779972131204L,\n            0.1568533229389436436689811009933007L, 0.1813418916891809914825752246385978L,\n            0.1813418916891809914825752246385978L, 0.1568533229389436436689811009933007L,\n            0.1111905172266872352721779972131204L, 0.0506142681451881295762656771549811L };\n  eigen_assert(degree <= maxPadeDegree);\n  MatrixType TminusI = T - MatrixType::Identity(T.rows(), T.rows());\n  result.setZero(T.rows(), T.rows());\n  for (int k = 0; k < degree; ++k)\n    result += weights[k] * (MatrixType::Identity(T.rows(), T.rows()) + nodes[k] * TminusI)\n                           .template triangularView<Upper>().solve(TminusI);\n}\n\ntemplate <typename MatrixType>\nvoid MatrixLogarithmAtomic<MatrixType>::computePade9(MatrixType& result, const MatrixType& T)\n{\n  const int degree = 9;\n  const RealScalar nodes[]   = { 0.0159198802461869550822118985481636L, 0.0819844463366821028502851059651326L,\n            0.1933142836497048013456489803292629L, 0.3378732882980955354807309926783317L,\n            0.5000000000000000000000000000000000L, 0.6621267117019044645192690073216683L,\n            0.8066857163502951986543510196707371L, 0.9180155536633178971497148940348674L,\n            0.9840801197538130449177881014518364L };\n  const RealScalar weights[] = { 0.0406371941807872059859460790552618L, 0.0903240803474287020292360156214564L,\n            0.1303053482014677311593714347093164L, 0.1561735385200014200343152032922218L,\n            0.1651196775006298815822625346434870L, 0.1561735385200014200343152032922218L,\n            0.1303053482014677311593714347093164L, 0.0903240803474287020292360156214564L,\n            0.0406371941807872059859460790552618L };\n  eigen_assert(degree <= maxPadeDegree);\n  MatrixType TminusI = T - MatrixType::Identity(T.rows(), T.rows());\n  result.setZero(T.rows(), T.rows());\n  for (int k = 0; k < degree; ++k)\n    result += weights[k] * (MatrixType::Identity(T.rows(), T.rows()) + nodes[k] * TminusI)\n                           .template triangularView<Upper>().solve(TminusI);\n}\n\ntemplate <typename MatrixType>\nvoid MatrixLogarithmAtomic<MatrixType>::computePade10(MatrixType& result, const MatrixType& T)\n{\n  const int degree = 10;\n  const RealScalar nodes[]   = { 0.0130467357414141399610179939577740L, 0.0674683166555077446339516557882535L,\n            0.1602952158504877968828363174425632L, 0.2833023029353764046003670284171079L,\n            0.4255628305091843945575869994351400L, 0.5744371694908156054424130005648600L,\n            0.7166976970646235953996329715828921L, 0.8397047841495122031171636825574368L,\n            0.9325316833444922553660483442117465L, 0.9869532642585858600389820060422260L };\n  const RealScalar weights[] = { 0.0333356721543440687967844049466659L, 0.0747256745752902965728881698288487L,\n            0.1095431812579910219977674671140816L, 0.1346333596549981775456134607847347L,\n            0.1477621123573764350869464973256692L, 0.1477621123573764350869464973256692L,\n            0.1346333596549981775456134607847347L, 0.1095431812579910219977674671140816L,\n            0.0747256745752902965728881698288487L, 0.0333356721543440687967844049466659L };\n  eigen_assert(degree <= maxPadeDegree);\n  MatrixType TminusI = T - MatrixType::Identity(T.rows(), T.rows());\n  result.setZero(T.rows(), T.rows());\n  for (int k = 0; k < degree; ++k)\n    result += weights[k] * (MatrixType::Identity(T.rows(), T.rows()) + nodes[k] * TminusI)\n                           .template triangularView<Upper>().solve(TminusI);\n}\n\ntemplate <typename MatrixType>\nvoid MatrixLogarithmAtomic<MatrixType>::computePade11(MatrixType& result, const MatrixType& T)\n{\n  const int degree = 11;\n  const RealScalar nodes[]   = { 0.0108856709269715035980309994385713L, 0.0564687001159523504624211153480364L,\n            0.1349239972129753379532918739844233L, 0.2404519353965940920371371652706952L,\n            0.3652284220238275138342340072995692L, 0.5000000000000000000000000000000000L,\n            0.6347715779761724861657659927004308L, 0.7595480646034059079628628347293048L,\n            0.8650760027870246620467081260155767L, 0.9435312998840476495375788846519636L,\n            0.9891143290730284964019690005614287L };\n  const RealScalar weights[] = { 0.0278342835580868332413768602212743L, 0.0627901847324523123173471496119701L,\n            0.0931451054638671257130488207158280L, 0.1165968822959952399592618524215876L,\n            0.1314022722551233310903444349452546L, 0.1364625433889503153572417641681711L,\n            0.1314022722551233310903444349452546L, 0.1165968822959952399592618524215876L,\n            0.0931451054638671257130488207158280L, 0.0627901847324523123173471496119701L,\n            0.0278342835580868332413768602212743L };\n  eigen_assert(degree <= maxPadeDegree);\n  MatrixType TminusI = T - MatrixType::Identity(T.rows(), T.rows());\n  result.setZero(T.rows(), T.rows());\n  for (int k = 0; k < degree; ++k)\n    result += weights[k] * (MatrixType::Identity(T.rows(), T.rows()) + nodes[k] * TminusI)\n                           .template triangularView<Upper>().solve(TminusI);\n}\n\n/** \\ingroup MatrixFunctions_Module\n  *\n  * \\brief Proxy for the matrix logarithm of some matrix (expression).\n  *\n  * \\tparam Derived  Type of the argument to the matrix function.\n  *\n  * This class holds the argument to the matrix function until it is\n  * assigned or evaluated for some other reason (so the argument\n  * should not be changed in the meantime). It is the return type of\n  * MatrixBase::log() and most of the time this is the only way it\n  * is used.\n  */\ntemplate<typename Derived> class MatrixLogarithmReturnValue\n: public ReturnByValue<MatrixLogarithmReturnValue<Derived> >\n{\npublic:\n\n  typedef typename Derived::Scalar Scalar;\n  typedef typename Derived::Index Index;\n\n  /** \\brief Constructor.\n    *\n    * \\param[in]  A  %Matrix (expression) forming the argument of the matrix logarithm.\n    */\n  MatrixLogarithmReturnValue(const Derived& A) : m_A(A) { }\n  \n  /** \\brief Compute the matrix logarithm.\n    *\n    * \\param[out]  result  Logarithm of \\p A, where \\A is as specified in the constructor.\n    */\n  template <typename ResultType>\n  inline void evalTo(ResultType& result) const\n  {\n    typedef typename Derived::PlainObject PlainObject;\n    typedef internal::traits<PlainObject> Traits;\n    static const int RowsAtCompileTime = Traits::RowsAtCompileTime;\n    static const int ColsAtCompileTime = Traits::ColsAtCompileTime;\n    static const int Options = PlainObject::Options;\n    typedef std::complex<typename NumTraits<Scalar>::Real> ComplexScalar;\n    typedef Matrix<ComplexScalar, Dynamic, Dynamic, Options, RowsAtCompileTime, ColsAtCompileTime> DynMatrixType;\n    typedef MatrixLogarithmAtomic<DynMatrixType> AtomicType;\n    AtomicType atomic;\n    \n    const PlainObject Aevaluated = m_A.eval();\n    MatrixFunction<PlainObject, AtomicType> mf(Aevaluated, atomic);\n    mf.compute(result);\n  }\n\n  Index rows() const { return m_A.rows(); }\n  Index cols() const { return m_A.cols(); }\n  \nprivate:\n  typename internal::nested<Derived>::type m_A;\n  \n  MatrixLogarithmReturnValue& operator=(const MatrixLogarithmReturnValue&);\n};\n\nnamespace internal {\n  template<typename Derived>\n  struct traits<MatrixLogarithmReturnValue<Derived> >\n  {\n    typedef typename Derived::PlainObject ReturnType;\n  };\n}\n\n\n/********** MatrixBase method **********/\n\n\ntemplate <typename Derived>\nconst MatrixLogarithmReturnValue<Derived> MatrixBase<Derived>::log() const\n{\n  eigen_assert(rows() == cols());\n  return MatrixLogarithmReturnValue<Derived>(derived());\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_MATRIX_LOGARITHM\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/MatrixFunctions/MatrixPower.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012, 2013 Chen-Pang He <jdh8@ms63.hinet.net>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_MATRIX_POWER\n#define EIGEN_MATRIX_POWER\n\nnamespace Eigen {\n\ntemplate<typename MatrixType> class MatrixPower;\n\ntemplate<typename MatrixType>\nclass MatrixPowerRetval : public ReturnByValue< MatrixPowerRetval<MatrixType> >\n{\n  public:\n    typedef typename MatrixType::RealScalar RealScalar;\n    typedef typename MatrixType::Index Index;\n\n    MatrixPowerRetval(MatrixPower<MatrixType>& pow, RealScalar p) : m_pow(pow), m_p(p)\n    { }\n\n    template<typename ResultType>\n    inline void evalTo(ResultType& res) const\n    { m_pow.compute(res, m_p); }\n\n    Index rows() const { return m_pow.rows(); }\n    Index cols() const { return m_pow.cols(); }\n\n  private:\n    MatrixPower<MatrixType>& m_pow;\n    const RealScalar m_p;\n    MatrixPowerRetval& operator=(const MatrixPowerRetval&);\n};\n\ntemplate<typename MatrixType>\nclass MatrixPowerAtomic\n{\n  private:\n    enum {\n      RowsAtCompileTime = MatrixType::RowsAtCompileTime,\n      MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime\n    };\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename MatrixType::RealScalar RealScalar;\n    typedef std::complex<RealScalar> ComplexScalar;\n    typedef typename MatrixType::Index Index;\n    typedef Array<Scalar, RowsAtCompileTime, 1, ColMajor, MaxRowsAtCompileTime> ArrayType;\n\n    const MatrixType& m_A;\n    RealScalar m_p;\n\n    void computePade(int degree, const MatrixType& IminusT, MatrixType& res) const;\n    void compute2x2(MatrixType& res, RealScalar p) const;\n    void computeBig(MatrixType& res) const;\n    static int getPadeDegree(float normIminusT);\n    static int getPadeDegree(double normIminusT);\n    static int getPadeDegree(long double normIminusT);\n    static ComplexScalar computeSuperDiag(const ComplexScalar&, const ComplexScalar&, RealScalar p);\n    static RealScalar computeSuperDiag(RealScalar, RealScalar, RealScalar p);\n\n  public:\n    MatrixPowerAtomic(const MatrixType& T, RealScalar p);\n    void compute(MatrixType& res) const;\n};\n\ntemplate<typename MatrixType>\nMatrixPowerAtomic<MatrixType>::MatrixPowerAtomic(const MatrixType& T, RealScalar p) :\n  m_A(T), m_p(p)\n{ eigen_assert(T.rows() == T.cols()); }\n\ntemplate<typename MatrixType>\nvoid MatrixPowerAtomic<MatrixType>::compute(MatrixType& res) const\n{\n  res.resizeLike(m_A);\n  switch (m_A.rows()) {\n    case 0:\n      break;\n    case 1:\n      res(0,0) = std::pow(m_A(0,0), m_p);\n      break;\n    case 2:\n      compute2x2(res, m_p);\n      break;\n    default:\n      computeBig(res);\n  }\n}\n\ntemplate<typename MatrixType>\nvoid MatrixPowerAtomic<MatrixType>::computePade(int degree, const MatrixType& IminusT, MatrixType& res) const\n{\n  int i = degree<<1;\n  res = (m_p-degree) / ((i-1)<<1) * IminusT;\n  for (--i; i; --i) {\n    res = (MatrixType::Identity(IminusT.rows(), IminusT.cols()) + res).template triangularView<Upper>()\n\t.solve((i==1 ? -m_p : i&1 ? (-m_p-(i>>1))/(i<<1) : (m_p-(i>>1))/((i-1)<<1)) * IminusT).eval();\n  }\n  res += MatrixType::Identity(IminusT.rows(), IminusT.cols());\n}\n\n// This function assumes that res has the correct size (see bug 614)\ntemplate<typename MatrixType>\nvoid MatrixPowerAtomic<MatrixType>::compute2x2(MatrixType& res, RealScalar p) const\n{\n  using std::abs;\n  using std::pow;\n  \n  res.coeffRef(0,0) = pow(m_A.coeff(0,0), p);\n\n  for (Index i=1; i < m_A.cols(); ++i) {\n    res.coeffRef(i,i) = pow(m_A.coeff(i,i), p);\n    if (m_A.coeff(i-1,i-1) == m_A.coeff(i,i))\n      res.coeffRef(i-1,i) = p * pow(m_A.coeff(i,i), p-1);\n    else if (2*abs(m_A.coeff(i-1,i-1)) < abs(m_A.coeff(i,i)) || 2*abs(m_A.coeff(i,i)) < abs(m_A.coeff(i-1,i-1)))\n      res.coeffRef(i-1,i) = (res.coeff(i,i)-res.coeff(i-1,i-1)) / (m_A.coeff(i,i)-m_A.coeff(i-1,i-1));\n    else\n      res.coeffRef(i-1,i) = computeSuperDiag(m_A.coeff(i,i), m_A.coeff(i-1,i-1), p);\n    res.coeffRef(i-1,i) *= m_A.coeff(i-1,i);\n  }\n}\n\ntemplate<typename MatrixType>\nvoid MatrixPowerAtomic<MatrixType>::computeBig(MatrixType& res) const\n{\n  const int digits = std::numeric_limits<RealScalar>::digits;\n  const RealScalar maxNormForPade = digits <=  24? 4.3386528e-1f:                           // sigle precision\n\t\t\t\t    digits <=  53? 2.789358995219730e-1:                    // double precision\n\t\t\t\t    digits <=  64? 2.4471944416607995472e-1L:               // extended precision\n\t\t\t\t    digits <= 106? 1.1016843812851143391275867258512e-1L:   // double-double\n\t\t\t\t\t\t   9.134603732914548552537150753385375e-2L; // quadruple precision\n  MatrixType IminusT, sqrtT, T = m_A.template triangularView<Upper>();\n  RealScalar normIminusT;\n  int degree, degree2, numberOfSquareRoots = 0;\n  bool hasExtraSquareRoot = false;\n\n  /* FIXME\n   * For singular T, norm(I - T) >= 1 but maxNormForPade < 1, leads to infinite\n   * loop.  We should move 0 eigenvalues to bottom right corner.  We need not\n   * worry about tiny values (e.g. 1e-300) because they will reach 1 if\n   * repetitively sqrt'ed.\n   *\n   * If the 0 eigenvalues are semisimple, they can form a 0 matrix at the\n   * bottom right corner.\n   *\n   * [ T  A ]^p   [ T^p  (T^-1 T^p A) ]\n   * [      ]   = [                   ]\n   * [ 0  0 ]     [  0         0      ]\n   */\n  for (Index i=0; i < m_A.cols(); ++i)\n    eigen_assert(m_A(i,i) != RealScalar(0));\n\n  while (true) {\n    IminusT = MatrixType::Identity(m_A.rows(), m_A.cols()) - T;\n    normIminusT = IminusT.cwiseAbs().colwise().sum().maxCoeff();\n    if (normIminusT < maxNormForPade) {\n      degree = getPadeDegree(normIminusT);\n      degree2 = getPadeDegree(normIminusT/2);\n      if (degree - degree2 <= 1 || hasExtraSquareRoot)\n\tbreak;\n      hasExtraSquareRoot = true;\n    }\n    MatrixSquareRootTriangular<MatrixType>(T).compute(sqrtT);\n    T = sqrtT.template triangularView<Upper>();\n    ++numberOfSquareRoots;\n  }\n  computePade(degree, IminusT, res);\n\n  for (; numberOfSquareRoots; --numberOfSquareRoots) {\n    compute2x2(res, std::ldexp(m_p, -numberOfSquareRoots));\n    res = res.template triangularView<Upper>() * res;\n  }\n  compute2x2(res, m_p);\n}\n  \ntemplate<typename MatrixType>\ninline int MatrixPowerAtomic<MatrixType>::getPadeDegree(float normIminusT)\n{\n  const float maxNormForPade[] = { 2.8064004e-1f /* degree = 3 */ , 4.3386528e-1f };\n  int degree = 3;\n  for (; degree <= 4; ++degree)\n    if (normIminusT <= maxNormForPade[degree - 3])\n      break;\n  return degree;\n}\n\ntemplate<typename MatrixType>\ninline int MatrixPowerAtomic<MatrixType>::getPadeDegree(double normIminusT)\n{\n  const double maxNormForPade[] = { 1.884160592658218e-2 /* degree = 3 */ , 6.038881904059573e-2, 1.239917516308172e-1,\n      1.999045567181744e-1, 2.789358995219730e-1 };\n  int degree = 3;\n  for (; degree <= 7; ++degree)\n    if (normIminusT <= maxNormForPade[degree - 3])\n      break;\n  return degree;\n}\n\ntemplate<typename MatrixType>\ninline int MatrixPowerAtomic<MatrixType>::getPadeDegree(long double normIminusT)\n{\n#if   LDBL_MANT_DIG == 53\n  const int maxPadeDegree = 7;\n  const double maxNormForPade[] = { 1.884160592658218e-2L /* degree = 3 */ , 6.038881904059573e-2L, 1.239917516308172e-1L,\n      1.999045567181744e-1L, 2.789358995219730e-1L };\n#elif LDBL_MANT_DIG <= 64\n  const int maxPadeDegree = 8;\n  const double maxNormForPade[] = { 6.3854693117491799460e-3L /* degree = 3 */ , 2.6394893435456973676e-2L,\n      6.4216043030404063729e-2L, 1.1701165502926694307e-1L, 1.7904284231268670284e-1L, 2.4471944416607995472e-1L };\n#elif LDBL_MANT_DIG <= 106\n  const int maxPadeDegree = 10;\n  const double maxNormForPade[] = { 1.0007161601787493236741409687186e-4L /* degree = 3 */ ,\n      1.0007161601787493236741409687186e-3L, 4.7069769360887572939882574746264e-3L, 1.3220386624169159689406653101695e-2L,\n      2.8063482381631737920612944054906e-2L, 4.9625993951953473052385361085058e-2L, 7.7367040706027886224557538328171e-2L,\n      1.1016843812851143391275867258512e-1L };\n#else\n  const int maxPadeDegree = 10;\n  const double maxNormForPade[] = { 5.524506147036624377378713555116378e-5L /* degree = 3 */ ,\n      6.640600568157479679823602193345995e-4L, 3.227716520106894279249709728084626e-3L,\n      9.619593944683432960546978734646284e-3L, 2.134595382433742403911124458161147e-2L,\n      3.908166513900489428442993794761185e-2L, 6.266780814639442865832535460550138e-2L,\n      9.134603732914548552537150753385375e-2L };\n#endif\n  int degree = 3;\n  for (; degree <= maxPadeDegree; ++degree)\n    if (normIminusT <= maxNormForPade[degree - 3])\n      break;\n  return degree;\n}\n\ntemplate<typename MatrixType>\ninline typename MatrixPowerAtomic<MatrixType>::ComplexScalar\nMatrixPowerAtomic<MatrixType>::computeSuperDiag(const ComplexScalar& curr, const ComplexScalar& prev, RealScalar p)\n{\n  ComplexScalar logCurr = std::log(curr);\n  ComplexScalar logPrev = std::log(prev);\n  int unwindingNumber = std::ceil((numext::imag(logCurr - logPrev) - M_PI) / (2*M_PI));\n  ComplexScalar w = numext::atanh2(curr - prev, curr + prev) + ComplexScalar(0, M_PI*unwindingNumber);\n  return RealScalar(2) * std::exp(RealScalar(0.5) * p * (logCurr + logPrev)) * std::sinh(p * w) / (curr - prev);\n}\n\ntemplate<typename MatrixType>\ninline typename MatrixPowerAtomic<MatrixType>::RealScalar\nMatrixPowerAtomic<MatrixType>::computeSuperDiag(RealScalar curr, RealScalar prev, RealScalar p)\n{\n  RealScalar w = numext::atanh2(curr - prev, curr + prev);\n  return 2 * std::exp(p * (std::log(curr) + std::log(prev)) / 2) * std::sinh(p * w) / (curr - prev);\n}\n\n/**\n * \\ingroup MatrixFunctions_Module\n *\n * \\brief Class for computing matrix powers.\n *\n * \\tparam MatrixType  type of the base, expected to be an instantiation\n * of the Matrix class template.\n *\n * This class is capable of computing real/complex matrices raised to\n * an arbitrary real power. Meanwhile, it saves the result of Schur\n * decomposition if an non-integral power has even been calculated.\n * Therefore, if you want to compute multiple (>= 2) matrix powers\n * for the same matrix, using the class directly is more efficient than\n * calling MatrixBase::pow().\n *\n * Example:\n * \\include MatrixPower_optimal.cpp\n * Output: \\verbinclude MatrixPower_optimal.out\n */\ntemplate<typename MatrixType>\nclass MatrixPower\n{\n  private:\n    enum {\n      RowsAtCompileTime = MatrixType::RowsAtCompileTime,\n      ColsAtCompileTime = MatrixType::ColsAtCompileTime,\n      MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,\n      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime\n    };\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename MatrixType::RealScalar RealScalar;\n    typedef typename MatrixType::Index Index;\n\n  public:\n    /**\n     * \\brief Constructor.\n     *\n     * \\param[in] A  the base of the matrix power.\n     *\n     * The class stores a reference to A, so it should not be changed\n     * (or destroyed) before evaluation.\n     */\n    explicit MatrixPower(const MatrixType& A) : m_A(A), m_conditionNumber(0)\n    { eigen_assert(A.rows() == A.cols()); }\n\n    /**\n     * \\brief Returns the matrix power.\n     *\n     * \\param[in] p  exponent, a real scalar.\n     * \\return The expression \\f$ A^p \\f$, where A is specified in the\n     * constructor.\n     */\n    const MatrixPowerRetval<MatrixType> operator()(RealScalar p)\n    { return MatrixPowerRetval<MatrixType>(*this, p); }\n\n    /**\n     * \\brief Compute the matrix power.\n     *\n     * \\param[in]  p    exponent, a real scalar.\n     * \\param[out] res  \\f$ A^p \\f$ where A is specified in the\n     * constructor.\n     */\n    template<typename ResultType>\n    void compute(ResultType& res, RealScalar p);\n    \n    Index rows() const { return m_A.rows(); }\n    Index cols() const { return m_A.cols(); }\n\n  private:\n    typedef std::complex<RealScalar> ComplexScalar;\n    typedef Matrix<ComplexScalar, RowsAtCompileTime, ColsAtCompileTime, MatrixType::Options,\n              MaxRowsAtCompileTime, MaxColsAtCompileTime> ComplexMatrix;\n\n    typename MatrixType::Nested m_A;\n    MatrixType m_tmp;\n    ComplexMatrix m_T, m_U, m_fT;\n    RealScalar m_conditionNumber;\n\n    RealScalar modfAndInit(RealScalar, RealScalar*);\n\n    template<typename ResultType>\n    void computeIntPower(ResultType&, RealScalar);\n\n    template<typename ResultType>\n    void computeFracPower(ResultType&, RealScalar);\n\n    template<int Rows, int Cols, int Options, int MaxRows, int MaxCols>\n    static void revertSchur(\n        Matrix<ComplexScalar, Rows, Cols, Options, MaxRows, MaxCols>& res,\n        const ComplexMatrix& T,\n        const ComplexMatrix& U);\n\n    template<int Rows, int Cols, int Options, int MaxRows, int MaxCols>\n    static void revertSchur(\n        Matrix<RealScalar, Rows, Cols, Options, MaxRows, MaxCols>& res,\n        const ComplexMatrix& T,\n        const ComplexMatrix& U);\n};\n\ntemplate<typename MatrixType>\ntemplate<typename ResultType>\nvoid MatrixPower<MatrixType>::compute(ResultType& res, RealScalar p)\n{\n  switch (cols()) {\n    case 0:\n      break;\n    case 1:\n      res(0,0) = std::pow(m_A.coeff(0,0), p);\n      break;\n    default:\n      RealScalar intpart, x = modfAndInit(p, &intpart);\n      computeIntPower(res, intpart);\n      computeFracPower(res, x);\n  }\n}\n\ntemplate<typename MatrixType>\ntypename MatrixPower<MatrixType>::RealScalar\nMatrixPower<MatrixType>::modfAndInit(RealScalar x, RealScalar* intpart)\n{\n  typedef Array<RealScalar, RowsAtCompileTime, 1, ColMajor, MaxRowsAtCompileTime> RealArray;\n\n  *intpart = std::floor(x);\n  RealScalar res = x - *intpart;\n\n  if (!m_conditionNumber && res) {\n    const ComplexSchur<MatrixType> schurOfA(m_A);\n    m_T = schurOfA.matrixT();\n    m_U = schurOfA.matrixU();\n    \n    const RealArray absTdiag = m_T.diagonal().array().abs();\n    m_conditionNumber = absTdiag.maxCoeff() / absTdiag.minCoeff();\n  }\n\n  if (res>RealScalar(0.5) && res>(1-res)*std::pow(m_conditionNumber, res)) {\n    --res;\n    ++*intpart;\n  }\n  return res;\n}\n\ntemplate<typename MatrixType>\ntemplate<typename ResultType>\nvoid MatrixPower<MatrixType>::computeIntPower(ResultType& res, RealScalar p)\n{\n  RealScalar pp = std::abs(p);\n\n  if (p<0)  m_tmp = m_A.inverse();\n  else      m_tmp = m_A;\n\n  res = MatrixType::Identity(rows(), cols());\n  while (pp >= 1) {\n    if (std::fmod(pp, 2) >= 1)\n      res = m_tmp * res;\n    m_tmp *= m_tmp;\n    pp /= 2;\n  }\n}\n\ntemplate<typename MatrixType>\ntemplate<typename ResultType>\nvoid MatrixPower<MatrixType>::computeFracPower(ResultType& res, RealScalar p)\n{\n  if (p) {\n    eigen_assert(m_conditionNumber);\n    MatrixPowerAtomic<ComplexMatrix>(m_T, p).compute(m_fT);\n    revertSchur(m_tmp, m_fT, m_U);\n    res = m_tmp * res;\n  }\n}\n\ntemplate<typename MatrixType>\ntemplate<int Rows, int Cols, int Options, int MaxRows, int MaxCols>\ninline void MatrixPower<MatrixType>::revertSchur(\n    Matrix<ComplexScalar, Rows, Cols, Options, MaxRows, MaxCols>& res,\n    const ComplexMatrix& T,\n    const ComplexMatrix& U)\n{ res.noalias() = U * (T.template triangularView<Upper>() * U.adjoint()); }\n\ntemplate<typename MatrixType>\ntemplate<int Rows, int Cols, int Options, int MaxRows, int MaxCols>\ninline void MatrixPower<MatrixType>::revertSchur(\n    Matrix<RealScalar, Rows, Cols, Options, MaxRows, MaxCols>& res,\n    const ComplexMatrix& T,\n    const ComplexMatrix& U)\n{ res.noalias() = (U * (T.template triangularView<Upper>() * U.adjoint())).real(); }\n\n/**\n * \\ingroup MatrixFunctions_Module\n *\n * \\brief Proxy for the matrix power of some matrix (expression).\n *\n * \\tparam Derived  type of the base, a matrix (expression).\n *\n * This class holds the arguments to the matrix power until it is\n * assigned or evaluated for some other reason (so the argument\n * should not be changed in the meantime). It is the return type of\n * MatrixBase::pow() and related functions and most of the\n * time this is the only way it is used.\n */\ntemplate<typename Derived>\nclass MatrixPowerReturnValue : public ReturnByValue< MatrixPowerReturnValue<Derived> >\n{\n  public:\n    typedef typename Derived::PlainObject PlainObject;\n    typedef typename Derived::RealScalar RealScalar;\n    typedef typename Derived::Index Index;\n\n    /**\n     * \\brief Constructor.\n     *\n     * \\param[in] A  %Matrix (expression), the base of the matrix power.\n     * \\param[in] p  scalar, the exponent of the matrix power.\n     */\n    MatrixPowerReturnValue(const Derived& A, RealScalar p) : m_A(A), m_p(p)\n    { }\n\n    /**\n     * \\brief Compute the matrix power.\n     *\n     * \\param[out] result  \\f$ A^p \\f$ where \\p A and \\p p are as in the\n     * constructor.\n     */\n    template<typename ResultType>\n    inline void evalTo(ResultType& res) const\n    { MatrixPower<PlainObject>(m_A.eval()).compute(res, m_p); }\n\n    Index rows() const { return m_A.rows(); }\n    Index cols() const { return m_A.cols(); }\n\n  private:\n    const Derived& m_A;\n    const RealScalar m_p;\n    MatrixPowerReturnValue& operator=(const MatrixPowerReturnValue&);\n};\n\nnamespace internal {\n\ntemplate<typename MatrixPowerType>\nstruct traits< MatrixPowerRetval<MatrixPowerType> >\n{ typedef typename MatrixPowerType::PlainObject ReturnType; };\n\ntemplate<typename Derived>\nstruct traits< MatrixPowerReturnValue<Derived> >\n{ typedef typename Derived::PlainObject ReturnType; };\n\n}\n\ntemplate<typename Derived>\nconst MatrixPowerReturnValue<Derived> MatrixBase<Derived>::pow(const RealScalar& p) const\n{ return MatrixPowerReturnValue<Derived>(derived(), p); }\n\n} // namespace Eigen\n\n#endif // EIGEN_MATRIX_POWER\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/MatrixFunctions/MatrixSquareRoot.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2011 Jitse Niesen <jitse@maths.leeds.ac.uk>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_MATRIX_SQUARE_ROOT\n#define EIGEN_MATRIX_SQUARE_ROOT\n\nnamespace Eigen { \n\n/** \\ingroup MatrixFunctions_Module\n  * \\brief Class for computing matrix square roots of upper quasi-triangular matrices.\n  * \\tparam  MatrixType  type of the argument of the matrix square root,\n  *                      expected to be an instantiation of the Matrix class template.\n  *\n  * This class computes the square root of the upper quasi-triangular\n  * matrix stored in the upper Hessenberg part of the matrix passed to\n  * the constructor.\n  *\n  * \\sa MatrixSquareRoot, MatrixSquareRootTriangular\n  */\ntemplate <typename MatrixType>\nclass MatrixSquareRootQuasiTriangular\n{\n  public:\n\n    /** \\brief Constructor. \n      *\n      * \\param[in]  A  upper quasi-triangular matrix whose square root \n      *                is to be computed.\n      *\n      * The class stores a reference to \\p A, so it should not be\n      * changed (or destroyed) before compute() is called.\n      */\n    MatrixSquareRootQuasiTriangular(const MatrixType& A) \n      : m_A(A) \n    {\n      eigen_assert(A.rows() == A.cols());\n    }\n    \n    /** \\brief Compute the matrix square root\n      *\n      * \\param[out] result  square root of \\p A, as specified in the constructor.\n      *\n      * Only the upper Hessenberg part of \\p result is updated, the\n      * rest is not touched.  See MatrixBase::sqrt() for details on\n      * how this computation is implemented.\n      */\n    template <typename ResultType> void compute(ResultType &result);    \n    \n  private:\n    typedef typename MatrixType::Index Index;\n    typedef typename MatrixType::Scalar Scalar;\n    \n    void computeDiagonalPartOfSqrt(MatrixType& sqrtT, const MatrixType& T);\n    void computeOffDiagonalPartOfSqrt(MatrixType& sqrtT, const MatrixType& T);\n    void compute2x2diagonalBlock(MatrixType& sqrtT, const MatrixType& T, typename MatrixType::Index i);\n    void compute1x1offDiagonalBlock(MatrixType& sqrtT, const MatrixType& T, \n\t\t\t\t  typename MatrixType::Index i, typename MatrixType::Index j);\n    void compute1x2offDiagonalBlock(MatrixType& sqrtT, const MatrixType& T, \n\t\t\t\t  typename MatrixType::Index i, typename MatrixType::Index j);\n    void compute2x1offDiagonalBlock(MatrixType& sqrtT, const MatrixType& T, \n\t\t\t\t  typename MatrixType::Index i, typename MatrixType::Index j);\n    void compute2x2offDiagonalBlock(MatrixType& sqrtT, const MatrixType& T, \n\t\t\t\t  typename MatrixType::Index i, typename MatrixType::Index j);\n  \n    template <typename SmallMatrixType>\n    static void solveAuxiliaryEquation(SmallMatrixType& X, const SmallMatrixType& A, \n\t\t\t\t     const SmallMatrixType& B, const SmallMatrixType& C);\n  \n    const MatrixType& m_A;\n};\n\ntemplate <typename MatrixType>\ntemplate <typename ResultType> \nvoid MatrixSquareRootQuasiTriangular<MatrixType>::compute(ResultType &result)\n{\n  result.resize(m_A.rows(), m_A.cols());\n  computeDiagonalPartOfSqrt(result, m_A);\n  computeOffDiagonalPartOfSqrt(result, m_A);\n}\n\n// pre:  T is quasi-upper-triangular and sqrtT is a zero matrix of the same size\n// post: the diagonal blocks of sqrtT are the square roots of the diagonal blocks of T\ntemplate <typename MatrixType>\nvoid MatrixSquareRootQuasiTriangular<MatrixType>::computeDiagonalPartOfSqrt(MatrixType& sqrtT, \n\t\t\t\t\t\t\t\t\t  const MatrixType& T)\n{\n  using std::sqrt;\n  const Index size = m_A.rows();\n  for (Index i = 0; i < size; i++) {\n    if (i == size - 1 || T.coeff(i+1, i) == 0) {\n      eigen_assert(T(i,i) >= 0);\n      sqrtT.coeffRef(i,i) = sqrt(T.coeff(i,i));\n    }\n    else {\n      compute2x2diagonalBlock(sqrtT, T, i);\n      ++i;\n    }\n  }\n}\n\n// pre:  T is quasi-upper-triangular and diagonal blocks of sqrtT are square root of diagonal blocks of T.\n// post: sqrtT is the square root of T.\ntemplate <typename MatrixType>\nvoid MatrixSquareRootQuasiTriangular<MatrixType>::computeOffDiagonalPartOfSqrt(MatrixType& sqrtT, \n\t\t\t\t\t\t\t\t\t     const MatrixType& T)\n{\n  const Index size = m_A.rows();\n  for (Index j = 1; j < size; j++) {\n      if (T.coeff(j, j-1) != 0)  // if T(j-1:j, j-1:j) is a 2-by-2 block\n\tcontinue;\n    for (Index i = j-1; i >= 0; i--) {\n      if (i > 0 && T.coeff(i, i-1) != 0)  // if T(i-1:i, i-1:i) is a 2-by-2 block\n\tcontinue;\n      bool iBlockIs2x2 = (i < size - 1) && (T.coeff(i+1, i) != 0);\n      bool jBlockIs2x2 = (j < size - 1) && (T.coeff(j+1, j) != 0);\n      if (iBlockIs2x2 && jBlockIs2x2) \n\tcompute2x2offDiagonalBlock(sqrtT, T, i, j);\n      else if (iBlockIs2x2 && !jBlockIs2x2) \n\tcompute2x1offDiagonalBlock(sqrtT, T, i, j);\n      else if (!iBlockIs2x2 && jBlockIs2x2) \n\tcompute1x2offDiagonalBlock(sqrtT, T, i, j);\n      else if (!iBlockIs2x2 && !jBlockIs2x2) \n\tcompute1x1offDiagonalBlock(sqrtT, T, i, j);\n    }\n  }\n}\n\n// pre:  T.block(i,i,2,2) has complex conjugate eigenvalues\n// post: sqrtT.block(i,i,2,2) is square root of T.block(i,i,2,2)\ntemplate <typename MatrixType>\nvoid MatrixSquareRootQuasiTriangular<MatrixType>\n     ::compute2x2diagonalBlock(MatrixType& sqrtT, const MatrixType& T, typename MatrixType::Index i)\n{\n  // TODO: This case (2-by-2 blocks with complex conjugate eigenvalues) is probably hidden somewhere\n  //       in EigenSolver. If we expose it, we could call it directly from here.\n  Matrix<Scalar,2,2> block = T.template block<2,2>(i,i);\n  EigenSolver<Matrix<Scalar,2,2> > es(block);\n  sqrtT.template block<2,2>(i,i)\n    = (es.eigenvectors() * es.eigenvalues().cwiseSqrt().asDiagonal() * es.eigenvectors().inverse()).real();\n}\n\n// pre:  block structure of T is such that (i,j) is a 1x1 block,\n//       all blocks of sqrtT to left of and below (i,j) are correct\n// post: sqrtT(i,j) has the correct value\ntemplate <typename MatrixType>\nvoid MatrixSquareRootQuasiTriangular<MatrixType>\n     ::compute1x1offDiagonalBlock(MatrixType& sqrtT, const MatrixType& T, \n\t\t\t\t  typename MatrixType::Index i, typename MatrixType::Index j)\n{\n  Scalar tmp = (sqrtT.row(i).segment(i+1,j-i-1) * sqrtT.col(j).segment(i+1,j-i-1)).value();\n  sqrtT.coeffRef(i,j) = (T.coeff(i,j) - tmp) / (sqrtT.coeff(i,i) + sqrtT.coeff(j,j));\n}\n\n// similar to compute1x1offDiagonalBlock()\ntemplate <typename MatrixType>\nvoid MatrixSquareRootQuasiTriangular<MatrixType>\n     ::compute1x2offDiagonalBlock(MatrixType& sqrtT, const MatrixType& T, \n\t\t\t\t  typename MatrixType::Index i, typename MatrixType::Index j)\n{\n  Matrix<Scalar,1,2> rhs = T.template block<1,2>(i,j);\n  if (j-i > 1)\n    rhs -= sqrtT.block(i, i+1, 1, j-i-1) * sqrtT.block(i+1, j, j-i-1, 2);\n  Matrix<Scalar,2,2> A = sqrtT.coeff(i,i) * Matrix<Scalar,2,2>::Identity();\n  A += sqrtT.template block<2,2>(j,j).transpose();\n  sqrtT.template block<1,2>(i,j).transpose() = A.fullPivLu().solve(rhs.transpose());\n}\n\n// similar to compute1x1offDiagonalBlock()\ntemplate <typename MatrixType>\nvoid MatrixSquareRootQuasiTriangular<MatrixType>\n     ::compute2x1offDiagonalBlock(MatrixType& sqrtT, const MatrixType& T, \n\t\t\t\t  typename MatrixType::Index i, typename MatrixType::Index j)\n{\n  Matrix<Scalar,2,1> rhs = T.template block<2,1>(i,j);\n  if (j-i > 2)\n    rhs -= sqrtT.block(i, i+2, 2, j-i-2) * sqrtT.block(i+2, j, j-i-2, 1);\n  Matrix<Scalar,2,2> A = sqrtT.coeff(j,j) * Matrix<Scalar,2,2>::Identity();\n  A += sqrtT.template block<2,2>(i,i);\n  sqrtT.template block<2,1>(i,j) = A.fullPivLu().solve(rhs);\n}\n\n// similar to compute1x1offDiagonalBlock()\ntemplate <typename MatrixType>\nvoid MatrixSquareRootQuasiTriangular<MatrixType>\n     ::compute2x2offDiagonalBlock(MatrixType& sqrtT, const MatrixType& T, \n\t\t\t\t  typename MatrixType::Index i, typename MatrixType::Index j)\n{\n  Matrix<Scalar,2,2> A = sqrtT.template block<2,2>(i,i);\n  Matrix<Scalar,2,2> B = sqrtT.template block<2,2>(j,j);\n  Matrix<Scalar,2,2> C = T.template block<2,2>(i,j);\n  if (j-i > 2)\n    C -= sqrtT.block(i, i+2, 2, j-i-2) * sqrtT.block(i+2, j, j-i-2, 2);\n  Matrix<Scalar,2,2> X;\n  solveAuxiliaryEquation(X, A, B, C);\n  sqrtT.template block<2,2>(i,j) = X;\n}\n\n// solves the equation A X + X B = C where all matrices are 2-by-2\ntemplate <typename MatrixType>\ntemplate <typename SmallMatrixType>\nvoid MatrixSquareRootQuasiTriangular<MatrixType>\n     ::solveAuxiliaryEquation(SmallMatrixType& X, const SmallMatrixType& A,\n\t\t\t      const SmallMatrixType& B, const SmallMatrixType& C)\n{\n  EIGEN_STATIC_ASSERT((internal::is_same<SmallMatrixType, Matrix<Scalar,2,2> >::value),\n\t\t      EIGEN_INTERNAL_ERROR_PLEASE_FILE_A_BUG_REPORT);\n\n  Matrix<Scalar,4,4> coeffMatrix = Matrix<Scalar,4,4>::Zero();\n  coeffMatrix.coeffRef(0,0) = A.coeff(0,0) + B.coeff(0,0);\n  coeffMatrix.coeffRef(1,1) = A.coeff(0,0) + B.coeff(1,1);\n  coeffMatrix.coeffRef(2,2) = A.coeff(1,1) + B.coeff(0,0);\n  coeffMatrix.coeffRef(3,3) = A.coeff(1,1) + B.coeff(1,1);\n  coeffMatrix.coeffRef(0,1) = B.coeff(1,0);\n  coeffMatrix.coeffRef(0,2) = A.coeff(0,1);\n  coeffMatrix.coeffRef(1,0) = B.coeff(0,1);\n  coeffMatrix.coeffRef(1,3) = A.coeff(0,1);\n  coeffMatrix.coeffRef(2,0) = A.coeff(1,0);\n  coeffMatrix.coeffRef(2,3) = B.coeff(1,0);\n  coeffMatrix.coeffRef(3,1) = A.coeff(1,0);\n  coeffMatrix.coeffRef(3,2) = B.coeff(0,1);\n  \n  Matrix<Scalar,4,1> rhs;\n  rhs.coeffRef(0) = C.coeff(0,0);\n  rhs.coeffRef(1) = C.coeff(0,1);\n  rhs.coeffRef(2) = C.coeff(1,0);\n  rhs.coeffRef(3) = C.coeff(1,1);\n  \n  Matrix<Scalar,4,1> result;\n  result = coeffMatrix.fullPivLu().solve(rhs);\n\n  X.coeffRef(0,0) = result.coeff(0);\n  X.coeffRef(0,1) = result.coeff(1);\n  X.coeffRef(1,0) = result.coeff(2);\n  X.coeffRef(1,1) = result.coeff(3);\n}\n\n\n/** \\ingroup MatrixFunctions_Module\n  * \\brief Class for computing matrix square roots of upper triangular matrices.\n  * \\tparam  MatrixType  type of the argument of the matrix square root,\n  *                      expected to be an instantiation of the Matrix class template.\n  *\n  * This class computes the square root of the upper triangular matrix\n  * stored in the upper triangular part (including the diagonal) of\n  * the matrix passed to the constructor.\n  *\n  * \\sa MatrixSquareRoot, MatrixSquareRootQuasiTriangular\n  */\ntemplate <typename MatrixType>\nclass MatrixSquareRootTriangular\n{\n  public:\n    MatrixSquareRootTriangular(const MatrixType& A) \n      : m_A(A) \n    {\n      eigen_assert(A.rows() == A.cols());\n    }\n\n    /** \\brief Compute the matrix square root\n      *\n      * \\param[out] result  square root of \\p A, as specified in the constructor.\n      *\n      * Only the upper triangular part (including the diagonal) of \n      * \\p result is updated, the rest is not touched.  See\n      * MatrixBase::sqrt() for details on how this computation is\n      * implemented.\n      */\n    template <typename ResultType> void compute(ResultType &result);    \n\n private:\n    const MatrixType& m_A;\n};\n\ntemplate <typename MatrixType>\ntemplate <typename ResultType> \nvoid MatrixSquareRootTriangular<MatrixType>::compute(ResultType &result)\n{\n  using std::sqrt;\n\n  // Compute square root of m_A and store it in upper triangular part of result\n  // This uses that the square root of triangular matrices can be computed directly.\n  result.resize(m_A.rows(), m_A.cols());\n  typedef typename MatrixType::Index Index;\n  for (Index i = 0; i < m_A.rows(); i++) {\n    result.coeffRef(i,i) = sqrt(m_A.coeff(i,i));\n  }\n  for (Index j = 1; j < m_A.cols(); j++) {\n    for (Index i = j-1; i >= 0; i--) {\n      typedef typename MatrixType::Scalar Scalar;\n      // if i = j-1, then segment has length 0 so tmp = 0\n      Scalar tmp = (result.row(i).segment(i+1,j-i-1) * result.col(j).segment(i+1,j-i-1)).value();\n      // denominator may be zero if original matrix is singular\n      result.coeffRef(i,j) = (m_A.coeff(i,j) - tmp) / (result.coeff(i,i) + result.coeff(j,j));\n    }\n  }\n}\n\n\n/** \\ingroup MatrixFunctions_Module\n  * \\brief Class for computing matrix square roots of general matrices.\n  * \\tparam  MatrixType  type of the argument of the matrix square root,\n  *                      expected to be an instantiation of the Matrix class template.\n  *\n  * \\sa MatrixSquareRootTriangular, MatrixSquareRootQuasiTriangular, MatrixBase::sqrt()\n  */\ntemplate <typename MatrixType, int IsComplex = NumTraits<typename internal::traits<MatrixType>::Scalar>::IsComplex>\nclass MatrixSquareRoot\n{\n  public:\n\n    /** \\brief Constructor. \n      *\n      * \\param[in]  A  matrix whose square root is to be computed.\n      *\n      * The class stores a reference to \\p A, so it should not be\n      * changed (or destroyed) before compute() is called.\n      */\n    MatrixSquareRoot(const MatrixType& A); \n    \n    /** \\brief Compute the matrix square root\n      *\n      * \\param[out] result  square root of \\p A, as specified in the constructor.\n      *\n      * See MatrixBase::sqrt() for details on how this computation is\n      * implemented.\n      */\n    template <typename ResultType> void compute(ResultType &result);    \n};\n\n\n// ********** Partial specialization for real matrices **********\n\ntemplate <typename MatrixType>\nclass MatrixSquareRoot<MatrixType, 0>\n{\n  public:\n\n    MatrixSquareRoot(const MatrixType& A) \n      : m_A(A) \n    {  \n      eigen_assert(A.rows() == A.cols());\n    }\n  \n    template <typename ResultType> void compute(ResultType &result)\n    {\n      // Compute Schur decomposition of m_A\n      const RealSchur<MatrixType> schurOfA(m_A);  \n      const MatrixType& T = schurOfA.matrixT();\n      const MatrixType& U = schurOfA.matrixU();\n    \n      // Compute square root of T\n      MatrixType sqrtT = MatrixType::Zero(m_A.rows(), m_A.cols());\n      MatrixSquareRootQuasiTriangular<MatrixType>(T).compute(sqrtT);\n    \n      // Compute square root of m_A\n      result = U * sqrtT * U.adjoint();\n    }\n    \n  private:\n    const MatrixType& m_A;\n};\n\n\n// ********** Partial specialization for complex matrices **********\n\ntemplate <typename MatrixType>\nclass MatrixSquareRoot<MatrixType, 1>\n{\n  public:\n\n    MatrixSquareRoot(const MatrixType& A) \n      : m_A(A) \n    {  \n      eigen_assert(A.rows() == A.cols());\n    }\n  \n    template <typename ResultType> void compute(ResultType &result)\n    {\n      // Compute Schur decomposition of m_A\n      const ComplexSchur<MatrixType> schurOfA(m_A);  \n      const MatrixType& T = schurOfA.matrixT();\n      const MatrixType& U = schurOfA.matrixU();\n    \n      // Compute square root of T\n      MatrixType sqrtT;\n      MatrixSquareRootTriangular<MatrixType>(T).compute(sqrtT);\n    \n      // Compute square root of m_A\n      result = U * (sqrtT.template triangularView<Upper>() * U.adjoint());\n    }\n    \n  private:\n    const MatrixType& m_A;\n};\n\n\n/** \\ingroup MatrixFunctions_Module\n  *\n  * \\brief Proxy for the matrix square root of some matrix (expression).\n  *\n  * \\tparam Derived  Type of the argument to the matrix square root.\n  *\n  * This class holds the argument to the matrix square root until it\n  * is assigned or evaluated for some other reason (so the argument\n  * should not be changed in the meantime). It is the return type of\n  * MatrixBase::sqrt() and most of the time this is the only way it is\n  * used.\n  */\ntemplate<typename Derived> class MatrixSquareRootReturnValue\n: public ReturnByValue<MatrixSquareRootReturnValue<Derived> >\n{\n    typedef typename Derived::Index Index;\n  public:\n    /** \\brief Constructor.\n      *\n      * \\param[in]  src  %Matrix (expression) forming the argument of the\n      * matrix square root.\n      */\n    MatrixSquareRootReturnValue(const Derived& src) : m_src(src) { }\n\n    /** \\brief Compute the matrix square root.\n      *\n      * \\param[out]  result  the matrix square root of \\p src in the\n      * constructor.\n      */\n    template <typename ResultType>\n    inline void evalTo(ResultType& result) const\n    {\n      const typename Derived::PlainObject srcEvaluated = m_src.eval();\n      MatrixSquareRoot<typename Derived::PlainObject> me(srcEvaluated);\n      me.compute(result);\n    }\n\n    Index rows() const { return m_src.rows(); }\n    Index cols() const { return m_src.cols(); }\n\n  protected:\n    const Derived& m_src;\n  private:\n    MatrixSquareRootReturnValue& operator=(const MatrixSquareRootReturnValue&);\n};\n\nnamespace internal {\ntemplate<typename Derived>\nstruct traits<MatrixSquareRootReturnValue<Derived> >\n{\n  typedef typename Derived::PlainObject ReturnType;\n};\n}\n\ntemplate <typename Derived>\nconst MatrixSquareRootReturnValue<Derived> MatrixBase<Derived>::sqrt() const\n{\n  eigen_assert(rows() == cols());\n  return MatrixSquareRootReturnValue<Derived>(derived());\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_MATRIX_FUNCTION\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/MatrixFunctions/StemFunction.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2010 Jitse Niesen <jitse@maths.leeds.ac.uk>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_STEM_FUNCTION\n#define EIGEN_STEM_FUNCTION\n\nnamespace Eigen { \n\n/** \\ingroup MatrixFunctions_Module \n  * \\brief Stem functions corresponding to standard mathematical functions.\n  */\ntemplate <typename Scalar>\nclass StdStemFunctions\n{\n  public:\n\n    /** \\brief The exponential function (and its derivatives). */\n    static Scalar exp(Scalar x, int)\n    {\n      return std::exp(x);\n    }\n\n    /** \\brief Cosine (and its derivatives). */\n    static Scalar cos(Scalar x, int n)\n    {\n      Scalar res;\n      switch (n % 4) {\n      case 0: \n\tres = std::cos(x);\n\tbreak;\n      case 1:\n\tres = -std::sin(x);\n\tbreak;\n      case 2:\n\tres = -std::cos(x);\n\tbreak;\n      case 3:\n\tres = std::sin(x);\n\tbreak;\n      }\n      return res;\n    }\n\n    /** \\brief Sine (and its derivatives). */\n    static Scalar sin(Scalar x, int n)\n    {\n      Scalar res;\n      switch (n % 4) {\n      case 0:\n\tres = std::sin(x);\n\tbreak;\n      case 1:\n\tres = std::cos(x);\n\tbreak;\n      case 2:\n\tres = -std::sin(x);\n\tbreak;\n      case 3:\n\tres = -std::cos(x);\n\tbreak;\n      }\n      return res;\n    }\n\n    /** \\brief Hyperbolic cosine (and its derivatives). */\n    static Scalar cosh(Scalar x, int n)\n    {\n      Scalar res;\n      switch (n % 2) {\n      case 0:\n\tres = std::cosh(x);\n\tbreak;\n      case 1:\n\tres = std::sinh(x);\n\tbreak;\n      }\n      return res;\n    }\n\t\n    /** \\brief Hyperbolic sine (and its derivatives). */\n    static Scalar sinh(Scalar x, int n)\n    {\n      Scalar res;\n      switch (n % 2) {\n      case 0:\n\tres = std::sinh(x);\n\tbreak;\n      case 1:\n\tres = std::cosh(x);\n\tbreak;\n      }\n      return res;\n    }\n\n}; // end of class StdStemFunctions\n\n} // end namespace Eigen\n\n#endif // EIGEN_STEM_FUNCTION\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/MoreVectorization/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_MoreVectorization_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_MoreVectorization_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/unsupported/Eigen/src/MoreVectorization COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/MoreVectorization/MathFunctions.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Rohit Garg <rpg.314@gmail.com>\n// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_MOREVECTORIZATION_MATHFUNCTIONS_H\n#define EIGEN_MOREVECTORIZATION_MATHFUNCTIONS_H\n\nnamespace Eigen { \n\nnamespace internal {\n\n/** \\internal \\returns the arcsin of \\a a (coeff-wise) */\ntemplate<typename Packet> inline static Packet pasin(Packet a) { return std::asin(a); }\n\n#ifdef EIGEN_VECTORIZE_SSE\n\ntemplate<> EIGEN_DONT_INLINE Packet4f pasin(Packet4f x)\n{\n  _EIGEN_DECLARE_CONST_Packet4f(half, 0.5);\n  _EIGEN_DECLARE_CONST_Packet4f(minus_half, -0.5);\n  _EIGEN_DECLARE_CONST_Packet4f(3half, 1.5);\n\n  _EIGEN_DECLARE_CONST_Packet4f_FROM_INT(sign_mask, 0x80000000);\n\n  _EIGEN_DECLARE_CONST_Packet4f(pi, 3.141592654);\n  _EIGEN_DECLARE_CONST_Packet4f(pi_over_2, 3.141592654*0.5);\n\n  _EIGEN_DECLARE_CONST_Packet4f(asin1, 4.2163199048E-2);\n  _EIGEN_DECLARE_CONST_Packet4f(asin2, 2.4181311049E-2);\n  _EIGEN_DECLARE_CONST_Packet4f(asin3, 4.5470025998E-2);\n  _EIGEN_DECLARE_CONST_Packet4f(asin4, 7.4953002686E-2);\n  _EIGEN_DECLARE_CONST_Packet4f(asin5, 1.6666752422E-1);\n\n  Packet4f a = pabs(x);//got the absolute value\n\n  Packet4f sign_bit= _mm_and_ps(x, p4f_sign_mask);//extracted the sign bit\n\n  Packet4f z1,z2;//will need them during computation    \n\n\n//will compute the two branches for asin\n//so first compare with half\n\n  Packet4f branch_mask= _mm_cmpgt_ps(a, p4f_half);//this is to select which branch to take\n//both will be taken, and finally results will be merged\n//the branch for values >0.5\n\n    {\n//the core series expansion \n    z1=pmadd(p4f_minus_half,a,p4f_half);\n    Packet4f x1=psqrt(z1);\n    Packet4f s1=pmadd(p4f_asin1, z1, p4f_asin2);\n    Packet4f s2=pmadd(s1, z1, p4f_asin3);\n    Packet4f s3=pmadd(s2,z1, p4f_asin4);\n    Packet4f s4=pmadd(s3,z1, p4f_asin5);\n    Packet4f temp=pmul(s4,z1);//not really a madd but a mul by z so that the next term can be a madd\n    z1=pmadd(temp,x1,x1);\n    z1=padd(z1,z1);\n    z1=psub(p4f_pi_over_2,z1);\n    }\n\n    {\n//the core series expansion \n    Packet4f x2=a;\n    z2=pmul(x2,x2);\n    Packet4f s1=pmadd(p4f_asin1, z2, p4f_asin2);\n    Packet4f s2=pmadd(s1, z2, p4f_asin3);\n    Packet4f s3=pmadd(s2,z2, p4f_asin4);\n    Packet4f s4=pmadd(s3,z2, p4f_asin5);\n    Packet4f temp=pmul(s4,z2);//not really a madd but a mul by z so that the next term can be a madd\n    z2=pmadd(temp,x2,x2);\n    }\n\n/* select the correct result from the two branch evaluations */\n  z1  = _mm_and_ps(branch_mask, z1);\n  z2  = _mm_andnot_ps(branch_mask, z2);\n  Packet4f z  = _mm_or_ps(z1,z2);\n\n/* update the sign */\n  return _mm_xor_ps(z, sign_bit);\n}\n\n#endif // EIGEN_VECTORIZE_SSE\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_MOREVECTORIZATION_MATHFUNCTIONS_H\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/NonLinearOptimization/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_NonLinearOptimization_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_NonLinearOptimization_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/unsupported/Eigen/src/NonLinearOptimization COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/NonLinearOptimization/HybridNonLinearSolver.h",
    "content": "// -*- coding: utf-8\n// vim: set fileencoding=utf-8\n\n// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Thomas Capricelli <orzel@freehackers.org>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_HYBRIDNONLINEARSOLVER_H\n#define EIGEN_HYBRIDNONLINEARSOLVER_H\n\nnamespace Eigen { \n\nnamespace HybridNonLinearSolverSpace { \n    enum Status {\n        Running = -1,\n        ImproperInputParameters = 0,\n        RelativeErrorTooSmall = 1,\n        TooManyFunctionEvaluation = 2,\n        TolTooSmall = 3,\n        NotMakingProgressJacobian = 4,\n        NotMakingProgressIterations = 5,\n        UserAsked = 6\n    };\n}\n\n/**\n  * \\ingroup NonLinearOptimization_Module\n  * \\brief Finds a zero of a system of n\n  * nonlinear functions in n variables by a modification of the Powell\n  * hybrid method (\"dogleg\").\n  *\n  * The user must provide a subroutine which calculates the\n  * functions. The Jacobian is either provided by the user, or approximated\n  * using a forward-difference method.\n  *\n  */\ntemplate<typename FunctorType, typename Scalar=double>\nclass HybridNonLinearSolver\n{\npublic:\n    typedef DenseIndex Index;\n\n    HybridNonLinearSolver(FunctorType &_functor)\n        : functor(_functor) { nfev=njev=iter = 0;  fnorm= 0.; useExternalScaling=false;}\n\n    struct Parameters {\n        Parameters()\n            : factor(Scalar(100.))\n            , maxfev(1000)\n            , xtol(std::sqrt(NumTraits<Scalar>::epsilon()))\n            , nb_of_subdiagonals(-1)\n            , nb_of_superdiagonals(-1)\n            , epsfcn(Scalar(0.)) {}\n        Scalar factor;\n        Index maxfev;   // maximum number of function evaluation\n        Scalar xtol;\n        Index nb_of_subdiagonals;\n        Index nb_of_superdiagonals;\n        Scalar epsfcn;\n    };\n    typedef Matrix< Scalar, Dynamic, 1 > FVectorType;\n    typedef Matrix< Scalar, Dynamic, Dynamic > JacobianType;\n    /* TODO: if eigen provides a triangular storage, use it here */\n    typedef Matrix< Scalar, Dynamic, Dynamic > UpperTriangularType;\n\n    HybridNonLinearSolverSpace::Status hybrj1(\n            FVectorType  &x,\n            const Scalar tol = std::sqrt(NumTraits<Scalar>::epsilon())\n            );\n\n    HybridNonLinearSolverSpace::Status solveInit(FVectorType  &x);\n    HybridNonLinearSolverSpace::Status solveOneStep(FVectorType  &x);\n    HybridNonLinearSolverSpace::Status solve(FVectorType  &x);\n\n    HybridNonLinearSolverSpace::Status hybrd1(\n            FVectorType  &x,\n            const Scalar tol = std::sqrt(NumTraits<Scalar>::epsilon())\n            );\n\n    HybridNonLinearSolverSpace::Status solveNumericalDiffInit(FVectorType  &x);\n    HybridNonLinearSolverSpace::Status solveNumericalDiffOneStep(FVectorType  &x);\n    HybridNonLinearSolverSpace::Status solveNumericalDiff(FVectorType  &x);\n\n    void resetParameters(void) { parameters = Parameters(); }\n    Parameters parameters;\n    FVectorType  fvec, qtf, diag;\n    JacobianType fjac;\n    UpperTriangularType R;\n    Index nfev;\n    Index njev;\n    Index iter;\n    Scalar fnorm;\n    bool useExternalScaling; \nprivate:\n    FunctorType &functor;\n    Index n;\n    Scalar sum;\n    bool sing;\n    Scalar temp;\n    Scalar delta;\n    bool jeval;\n    Index ncsuc;\n    Scalar ratio;\n    Scalar pnorm, xnorm, fnorm1;\n    Index nslow1, nslow2;\n    Index ncfail;\n    Scalar actred, prered;\n    FVectorType wa1, wa2, wa3, wa4;\n\n    HybridNonLinearSolver& operator=(const HybridNonLinearSolver&);\n};\n\n\n\ntemplate<typename FunctorType, typename Scalar>\nHybridNonLinearSolverSpace::Status\nHybridNonLinearSolver<FunctorType,Scalar>::hybrj1(\n        FVectorType  &x,\n        const Scalar tol\n        )\n{\n    n = x.size();\n\n    /* check the input parameters for errors. */\n    if (n <= 0 || tol < 0.)\n        return HybridNonLinearSolverSpace::ImproperInputParameters;\n\n    resetParameters();\n    parameters.maxfev = 100*(n+1);\n    parameters.xtol = tol;\n    diag.setConstant(n, 1.);\n    useExternalScaling = true;\n    return solve(x);\n}\n\ntemplate<typename FunctorType, typename Scalar>\nHybridNonLinearSolverSpace::Status\nHybridNonLinearSolver<FunctorType,Scalar>::solveInit(FVectorType  &x)\n{\n    n = x.size();\n\n    wa1.resize(n); wa2.resize(n); wa3.resize(n); wa4.resize(n);\n    fvec.resize(n);\n    qtf.resize(n);\n    fjac.resize(n, n);\n    if (!useExternalScaling)\n        diag.resize(n);\n    eigen_assert( (!useExternalScaling || diag.size()==n) || \"When useExternalScaling is set, the caller must provide a valid 'diag'\");\n\n    /* Function Body */\n    nfev = 0;\n    njev = 0;\n\n    /*     check the input parameters for errors. */\n    if (n <= 0 || parameters.xtol < 0. || parameters.maxfev <= 0 || parameters.factor <= 0. )\n        return HybridNonLinearSolverSpace::ImproperInputParameters;\n    if (useExternalScaling)\n        for (Index j = 0; j < n; ++j)\n            if (diag[j] <= 0.)\n                return HybridNonLinearSolverSpace::ImproperInputParameters;\n\n    /*     evaluate the function at the starting point */\n    /*     and calculate its norm. */\n    nfev = 1;\n    if ( functor(x, fvec) < 0)\n        return HybridNonLinearSolverSpace::UserAsked;\n    fnorm = fvec.stableNorm();\n\n    /*     initialize iteration counter and monitors. */\n    iter = 1;\n    ncsuc = 0;\n    ncfail = 0;\n    nslow1 = 0;\n    nslow2 = 0;\n\n    return HybridNonLinearSolverSpace::Running;\n}\n\ntemplate<typename FunctorType, typename Scalar>\nHybridNonLinearSolverSpace::Status\nHybridNonLinearSolver<FunctorType,Scalar>::solveOneStep(FVectorType  &x)\n{\n    using std::abs;\n    \n    eigen_assert(x.size()==n); // check the caller is not cheating us\n\n    Index j;\n    std::vector<JacobiRotation<Scalar> > v_givens(n), w_givens(n);\n\n    jeval = true;\n\n    /* calculate the jacobian matrix. */\n    if ( functor.df(x, fjac) < 0)\n        return HybridNonLinearSolverSpace::UserAsked;\n    ++njev;\n\n    wa2 = fjac.colwise().blueNorm();\n\n    /* on the first iteration and if external scaling is not used, scale according */\n    /* to the norms of the columns of the initial jacobian. */\n    if (iter == 1) {\n        if (!useExternalScaling)\n            for (j = 0; j < n; ++j)\n                diag[j] = (wa2[j]==0.) ? 1. : wa2[j];\n\n        /* on the first iteration, calculate the norm of the scaled x */\n        /* and initialize the step bound delta. */\n        xnorm = diag.cwiseProduct(x).stableNorm();\n        delta = parameters.factor * xnorm;\n        if (delta == 0.)\n            delta = parameters.factor;\n    }\n\n    /* compute the qr factorization of the jacobian. */\n    HouseholderQR<JacobianType> qrfac(fjac); // no pivoting:\n\n    /* copy the triangular factor of the qr factorization into r. */\n    R = qrfac.matrixQR();\n\n    /* accumulate the orthogonal factor in fjac. */\n    fjac = qrfac.householderQ();\n\n    /* form (q transpose)*fvec and store in qtf. */\n    qtf = fjac.transpose() * fvec;\n\n    /* rescale if necessary. */\n    if (!useExternalScaling)\n        diag = diag.cwiseMax(wa2);\n\n    while (true) {\n        /* determine the direction p. */\n        internal::dogleg<Scalar>(R, diag, qtf, delta, wa1);\n\n        /* store the direction p and x + p. calculate the norm of p. */\n        wa1 = -wa1;\n        wa2 = x + wa1;\n        pnorm = diag.cwiseProduct(wa1).stableNorm();\n\n        /* on the first iteration, adjust the initial step bound. */\n        if (iter == 1)\n            delta = (std::min)(delta,pnorm);\n\n        /* evaluate the function at x + p and calculate its norm. */\n        if ( functor(wa2, wa4) < 0)\n            return HybridNonLinearSolverSpace::UserAsked;\n        ++nfev;\n        fnorm1 = wa4.stableNorm();\n\n        /* compute the scaled actual reduction. */\n        actred = -1.;\n        if (fnorm1 < fnorm) /* Computing 2nd power */\n            actred = 1. - numext::abs2(fnorm1 / fnorm);\n\n        /* compute the scaled predicted reduction. */\n        wa3 = R.template triangularView<Upper>()*wa1 + qtf;\n        temp = wa3.stableNorm();\n        prered = 0.;\n        if (temp < fnorm) /* Computing 2nd power */\n            prered = 1. - numext::abs2(temp / fnorm);\n\n        /* compute the ratio of the actual to the predicted reduction. */\n        ratio = 0.;\n        if (prered > 0.)\n            ratio = actred / prered;\n\n        /* update the step bound. */\n        if (ratio < Scalar(.1)) {\n            ncsuc = 0;\n            ++ncfail;\n            delta = Scalar(.5) * delta;\n        } else {\n            ncfail = 0;\n            ++ncsuc;\n            if (ratio >= Scalar(.5) || ncsuc > 1)\n                delta = (std::max)(delta, pnorm / Scalar(.5));\n            if (abs(ratio - 1.) <= Scalar(.1)) {\n                delta = pnorm / Scalar(.5);\n            }\n        }\n\n        /* test for successful iteration. */\n        if (ratio >= Scalar(1e-4)) {\n            /* successful iteration. update x, fvec, and their norms. */\n            x = wa2;\n            wa2 = diag.cwiseProduct(x);\n            fvec = wa4;\n            xnorm = wa2.stableNorm();\n            fnorm = fnorm1;\n            ++iter;\n        }\n\n        /* determine the progress of the iteration. */\n        ++nslow1;\n        if (actred >= Scalar(.001))\n            nslow1 = 0;\n        if (jeval)\n            ++nslow2;\n        if (actred >= Scalar(.1))\n            nslow2 = 0;\n\n        /* test for convergence. */\n        if (delta <= parameters.xtol * xnorm || fnorm == 0.)\n            return HybridNonLinearSolverSpace::RelativeErrorTooSmall;\n\n        /* tests for termination and stringent tolerances. */\n        if (nfev >= parameters.maxfev)\n            return HybridNonLinearSolverSpace::TooManyFunctionEvaluation;\n        if (Scalar(.1) * (std::max)(Scalar(.1) * delta, pnorm) <= NumTraits<Scalar>::epsilon() * xnorm)\n            return HybridNonLinearSolverSpace::TolTooSmall;\n        if (nslow2 == 5)\n            return HybridNonLinearSolverSpace::NotMakingProgressJacobian;\n        if (nslow1 == 10)\n            return HybridNonLinearSolverSpace::NotMakingProgressIterations;\n\n        /* criterion for recalculating jacobian. */\n        if (ncfail == 2)\n            break; // leave inner loop and go for the next outer loop iteration\n\n        /* calculate the rank one modification to the jacobian */\n        /* and update qtf if necessary. */\n        wa1 = diag.cwiseProduct( diag.cwiseProduct(wa1)/pnorm );\n        wa2 = fjac.transpose() * wa4;\n        if (ratio >= Scalar(1e-4))\n            qtf = wa2;\n        wa2 = (wa2-wa3)/pnorm;\n\n        /* compute the qr factorization of the updated jacobian. */\n        internal::r1updt<Scalar>(R, wa1, v_givens, w_givens, wa2, wa3, &sing);\n        internal::r1mpyq<Scalar>(n, n, fjac.data(), v_givens, w_givens);\n        internal::r1mpyq<Scalar>(1, n, qtf.data(), v_givens, w_givens);\n\n        jeval = false;\n    }\n    return HybridNonLinearSolverSpace::Running;\n}\n\ntemplate<typename FunctorType, typename Scalar>\nHybridNonLinearSolverSpace::Status\nHybridNonLinearSolver<FunctorType,Scalar>::solve(FVectorType  &x)\n{\n    HybridNonLinearSolverSpace::Status status = solveInit(x);\n    if (status==HybridNonLinearSolverSpace::ImproperInputParameters)\n        return status;\n    while (status==HybridNonLinearSolverSpace::Running)\n        status = solveOneStep(x);\n    return status;\n}\n\n\n\ntemplate<typename FunctorType, typename Scalar>\nHybridNonLinearSolverSpace::Status\nHybridNonLinearSolver<FunctorType,Scalar>::hybrd1(\n        FVectorType  &x,\n        const Scalar tol\n        )\n{\n    n = x.size();\n\n    /* check the input parameters for errors. */\n    if (n <= 0 || tol < 0.)\n        return HybridNonLinearSolverSpace::ImproperInputParameters;\n\n    resetParameters();\n    parameters.maxfev = 200*(n+1);\n    parameters.xtol = tol;\n\n    diag.setConstant(n, 1.);\n    useExternalScaling = true;\n    return solveNumericalDiff(x);\n}\n\ntemplate<typename FunctorType, typename Scalar>\nHybridNonLinearSolverSpace::Status\nHybridNonLinearSolver<FunctorType,Scalar>::solveNumericalDiffInit(FVectorType  &x)\n{\n    n = x.size();\n\n    if (parameters.nb_of_subdiagonals<0) parameters.nb_of_subdiagonals= n-1;\n    if (parameters.nb_of_superdiagonals<0) parameters.nb_of_superdiagonals= n-1;\n\n    wa1.resize(n); wa2.resize(n); wa3.resize(n); wa4.resize(n);\n    qtf.resize(n);\n    fjac.resize(n, n);\n    fvec.resize(n);\n    if (!useExternalScaling)\n        diag.resize(n);\n    eigen_assert( (!useExternalScaling || diag.size()==n) || \"When useExternalScaling is set, the caller must provide a valid 'diag'\");\n\n    /* Function Body */\n    nfev = 0;\n    njev = 0;\n\n    /*     check the input parameters for errors. */\n    if (n <= 0 || parameters.xtol < 0. || parameters.maxfev <= 0 || parameters.nb_of_subdiagonals< 0 || parameters.nb_of_superdiagonals< 0 || parameters.factor <= 0. )\n        return HybridNonLinearSolverSpace::ImproperInputParameters;\n    if (useExternalScaling)\n        for (Index j = 0; j < n; ++j)\n            if (diag[j] <= 0.)\n                return HybridNonLinearSolverSpace::ImproperInputParameters;\n\n    /*     evaluate the function at the starting point */\n    /*     and calculate its norm. */\n    nfev = 1;\n    if ( functor(x, fvec) < 0)\n        return HybridNonLinearSolverSpace::UserAsked;\n    fnorm = fvec.stableNorm();\n\n    /*     initialize iteration counter and monitors. */\n    iter = 1;\n    ncsuc = 0;\n    ncfail = 0;\n    nslow1 = 0;\n    nslow2 = 0;\n\n    return HybridNonLinearSolverSpace::Running;\n}\n\ntemplate<typename FunctorType, typename Scalar>\nHybridNonLinearSolverSpace::Status\nHybridNonLinearSolver<FunctorType,Scalar>::solveNumericalDiffOneStep(FVectorType  &x)\n{\n    using std::sqrt;\n    using std::abs;\n    \n    assert(x.size()==n); // check the caller is not cheating us\n\n    Index j;\n    std::vector<JacobiRotation<Scalar> > v_givens(n), w_givens(n);\n\n    jeval = true;\n    if (parameters.nb_of_subdiagonals<0) parameters.nb_of_subdiagonals= n-1;\n    if (parameters.nb_of_superdiagonals<0) parameters.nb_of_superdiagonals= n-1;\n\n    /* calculate the jacobian matrix. */\n    if (internal::fdjac1(functor, x, fvec, fjac, parameters.nb_of_subdiagonals, parameters.nb_of_superdiagonals, parameters.epsfcn) <0)\n        return HybridNonLinearSolverSpace::UserAsked;\n    nfev += (std::min)(parameters.nb_of_subdiagonals+parameters.nb_of_superdiagonals+ 1, n);\n\n    wa2 = fjac.colwise().blueNorm();\n\n    /* on the first iteration and if external scaling is not used, scale according */\n    /* to the norms of the columns of the initial jacobian. */\n    if (iter == 1) {\n        if (!useExternalScaling)\n            for (j = 0; j < n; ++j)\n                diag[j] = (wa2[j]==0.) ? 1. : wa2[j];\n\n        /* on the first iteration, calculate the norm of the scaled x */\n        /* and initialize the step bound delta. */\n        xnorm = diag.cwiseProduct(x).stableNorm();\n        delta = parameters.factor * xnorm;\n        if (delta == 0.)\n            delta = parameters.factor;\n    }\n\n    /* compute the qr factorization of the jacobian. */\n    HouseholderQR<JacobianType> qrfac(fjac); // no pivoting:\n\n    /* copy the triangular factor of the qr factorization into r. */\n    R = qrfac.matrixQR();\n\n    /* accumulate the orthogonal factor in fjac. */\n    fjac = qrfac.householderQ();\n\n    /* form (q transpose)*fvec and store in qtf. */\n    qtf = fjac.transpose() * fvec;\n\n    /* rescale if necessary. */\n    if (!useExternalScaling)\n        diag = diag.cwiseMax(wa2);\n\n    while (true) {\n        /* determine the direction p. */\n        internal::dogleg<Scalar>(R, diag, qtf, delta, wa1);\n\n        /* store the direction p and x + p. calculate the norm of p. */\n        wa1 = -wa1;\n        wa2 = x + wa1;\n        pnorm = diag.cwiseProduct(wa1).stableNorm();\n\n        /* on the first iteration, adjust the initial step bound. */\n        if (iter == 1)\n            delta = (std::min)(delta,pnorm);\n\n        /* evaluate the function at x + p and calculate its norm. */\n        if ( functor(wa2, wa4) < 0)\n            return HybridNonLinearSolverSpace::UserAsked;\n        ++nfev;\n        fnorm1 = wa4.stableNorm();\n\n        /* compute the scaled actual reduction. */\n        actred = -1.;\n        if (fnorm1 < fnorm) /* Computing 2nd power */\n            actred = 1. - numext::abs2(fnorm1 / fnorm);\n\n        /* compute the scaled predicted reduction. */\n        wa3 = R.template triangularView<Upper>()*wa1 + qtf;\n        temp = wa3.stableNorm();\n        prered = 0.;\n        if (temp < fnorm) /* Computing 2nd power */\n            prered = 1. - numext::abs2(temp / fnorm);\n\n        /* compute the ratio of the actual to the predicted reduction. */\n        ratio = 0.;\n        if (prered > 0.)\n            ratio = actred / prered;\n\n        /* update the step bound. */\n        if (ratio < Scalar(.1)) {\n            ncsuc = 0;\n            ++ncfail;\n            delta = Scalar(.5) * delta;\n        } else {\n            ncfail = 0;\n            ++ncsuc;\n            if (ratio >= Scalar(.5) || ncsuc > 1)\n                delta = (std::max)(delta, pnorm / Scalar(.5));\n            if (abs(ratio - 1.) <= Scalar(.1)) {\n                delta = pnorm / Scalar(.5);\n            }\n        }\n\n        /* test for successful iteration. */\n        if (ratio >= Scalar(1e-4)) {\n            /* successful iteration. update x, fvec, and their norms. */\n            x = wa2;\n            wa2 = diag.cwiseProduct(x);\n            fvec = wa4;\n            xnorm = wa2.stableNorm();\n            fnorm = fnorm1;\n            ++iter;\n        }\n\n        /* determine the progress of the iteration. */\n        ++nslow1;\n        if (actred >= Scalar(.001))\n            nslow1 = 0;\n        if (jeval)\n            ++nslow2;\n        if (actred >= Scalar(.1))\n            nslow2 = 0;\n\n        /* test for convergence. */\n        if (delta <= parameters.xtol * xnorm || fnorm == 0.)\n            return HybridNonLinearSolverSpace::RelativeErrorTooSmall;\n\n        /* tests for termination and stringent tolerances. */\n        if (nfev >= parameters.maxfev)\n            return HybridNonLinearSolverSpace::TooManyFunctionEvaluation;\n        if (Scalar(.1) * (std::max)(Scalar(.1) * delta, pnorm) <= NumTraits<Scalar>::epsilon() * xnorm)\n            return HybridNonLinearSolverSpace::TolTooSmall;\n        if (nslow2 == 5)\n            return HybridNonLinearSolverSpace::NotMakingProgressJacobian;\n        if (nslow1 == 10)\n            return HybridNonLinearSolverSpace::NotMakingProgressIterations;\n\n        /* criterion for recalculating jacobian. */\n        if (ncfail == 2)\n            break; // leave inner loop and go for the next outer loop iteration\n\n        /* calculate the rank one modification to the jacobian */\n        /* and update qtf if necessary. */\n        wa1 = diag.cwiseProduct( diag.cwiseProduct(wa1)/pnorm );\n        wa2 = fjac.transpose() * wa4;\n        if (ratio >= Scalar(1e-4))\n            qtf = wa2;\n        wa2 = (wa2-wa3)/pnorm;\n\n        /* compute the qr factorization of the updated jacobian. */\n        internal::r1updt<Scalar>(R, wa1, v_givens, w_givens, wa2, wa3, &sing);\n        internal::r1mpyq<Scalar>(n, n, fjac.data(), v_givens, w_givens);\n        internal::r1mpyq<Scalar>(1, n, qtf.data(), v_givens, w_givens);\n\n        jeval = false;\n    }\n    return HybridNonLinearSolverSpace::Running;\n}\n\ntemplate<typename FunctorType, typename Scalar>\nHybridNonLinearSolverSpace::Status\nHybridNonLinearSolver<FunctorType,Scalar>::solveNumericalDiff(FVectorType  &x)\n{\n    HybridNonLinearSolverSpace::Status status = solveNumericalDiffInit(x);\n    if (status==HybridNonLinearSolverSpace::ImproperInputParameters)\n        return status;\n    while (status==HybridNonLinearSolverSpace::Running)\n        status = solveNumericalDiffOneStep(x);\n    return status;\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_HYBRIDNONLINEARSOLVER_H\n\n//vim: ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/NonLinearOptimization/LevenbergMarquardt.h",
    "content": "// -*- coding: utf-8\n// vim: set fileencoding=utf-8\n\n// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Thomas Capricelli <orzel@freehackers.org>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_LEVENBERGMARQUARDT__H\n#define EIGEN_LEVENBERGMARQUARDT__H\n\nnamespace Eigen { \n\nnamespace LevenbergMarquardtSpace {\n    enum Status {\n        NotStarted = -2,\n        Running = -1,\n        ImproperInputParameters = 0,\n        RelativeReductionTooSmall = 1,\n        RelativeErrorTooSmall = 2,\n        RelativeErrorAndReductionTooSmall = 3,\n        CosinusTooSmall = 4,\n        TooManyFunctionEvaluation = 5,\n        FtolTooSmall = 6,\n        XtolTooSmall = 7,\n        GtolTooSmall = 8,\n        UserAsked = 9\n    };\n}\n\n\n\n/**\n  * \\ingroup NonLinearOptimization_Module\n  * \\brief Performs non linear optimization over a non-linear function,\n  * using a variant of the Levenberg Marquardt algorithm.\n  *\n  * Check wikipedia for more information.\n  * http://en.wikipedia.org/wiki/Levenberg%E2%80%93Marquardt_algorithm\n  */\ntemplate<typename FunctorType, typename Scalar=double>\nclass LevenbergMarquardt\n{\npublic:\n    LevenbergMarquardt(FunctorType &_functor)\n        : functor(_functor) { nfev = njev = iter = 0;  fnorm = gnorm = 0.; useExternalScaling=false; }\n\n    typedef DenseIndex Index;\n\n    struct Parameters {\n        Parameters()\n            : factor(Scalar(100.))\n            , maxfev(400)\n            , ftol(std::sqrt(NumTraits<Scalar>::epsilon()))\n            , xtol(std::sqrt(NumTraits<Scalar>::epsilon()))\n            , gtol(Scalar(0.))\n            , epsfcn(Scalar(0.)) {}\n        Scalar factor;\n        Index maxfev;   // maximum number of function evaluation\n        Scalar ftol;\n        Scalar xtol;\n        Scalar gtol;\n        Scalar epsfcn;\n    };\n\n    typedef Matrix< Scalar, Dynamic, 1 > FVectorType;\n    typedef Matrix< Scalar, Dynamic, Dynamic > JacobianType;\n\n    LevenbergMarquardtSpace::Status lmder1(\n            FVectorType &x,\n            const Scalar tol = std::sqrt(NumTraits<Scalar>::epsilon())\n            );\n\n    LevenbergMarquardtSpace::Status minimize(FVectorType &x);\n    LevenbergMarquardtSpace::Status minimizeInit(FVectorType &x);\n    LevenbergMarquardtSpace::Status minimizeOneStep(FVectorType &x);\n\n    static LevenbergMarquardtSpace::Status lmdif1(\n            FunctorType &functor,\n            FVectorType &x,\n            Index *nfev,\n            const Scalar tol = std::sqrt(NumTraits<Scalar>::epsilon())\n            );\n\n    LevenbergMarquardtSpace::Status lmstr1(\n            FVectorType  &x,\n            const Scalar tol = std::sqrt(NumTraits<Scalar>::epsilon())\n            );\n\n    LevenbergMarquardtSpace::Status minimizeOptimumStorage(FVectorType  &x);\n    LevenbergMarquardtSpace::Status minimizeOptimumStorageInit(FVectorType  &x);\n    LevenbergMarquardtSpace::Status minimizeOptimumStorageOneStep(FVectorType  &x);\n\n    void resetParameters(void) { parameters = Parameters(); }\n\n    Parameters parameters;\n    FVectorType  fvec, qtf, diag;\n    JacobianType fjac;\n    PermutationMatrix<Dynamic,Dynamic> permutation;\n    Index nfev;\n    Index njev;\n    Index iter;\n    Scalar fnorm, gnorm;\n    bool useExternalScaling; \n\n    Scalar lm_param(void) { return par; }\nprivate:\n    FunctorType &functor;\n    Index n;\n    Index m;\n    FVectorType wa1, wa2, wa3, wa4;\n\n    Scalar par, sum;\n    Scalar temp, temp1, temp2;\n    Scalar delta;\n    Scalar ratio;\n    Scalar pnorm, xnorm, fnorm1, actred, dirder, prered;\n\n    LevenbergMarquardt& operator=(const LevenbergMarquardt&);\n};\n\ntemplate<typename FunctorType, typename Scalar>\nLevenbergMarquardtSpace::Status\nLevenbergMarquardt<FunctorType,Scalar>::lmder1(\n        FVectorType  &x,\n        const Scalar tol\n        )\n{\n    n = x.size();\n    m = functor.values();\n\n    /* check the input parameters for errors. */\n    if (n <= 0 || m < n || tol < 0.)\n        return LevenbergMarquardtSpace::ImproperInputParameters;\n\n    resetParameters();\n    parameters.ftol = tol;\n    parameters.xtol = tol;\n    parameters.maxfev = 100*(n+1);\n\n    return minimize(x);\n}\n\n\ntemplate<typename FunctorType, typename Scalar>\nLevenbergMarquardtSpace::Status\nLevenbergMarquardt<FunctorType,Scalar>::minimize(FVectorType  &x)\n{\n    LevenbergMarquardtSpace::Status status = minimizeInit(x);\n    if (status==LevenbergMarquardtSpace::ImproperInputParameters)\n        return status;\n    do {\n        status = minimizeOneStep(x);\n    } while (status==LevenbergMarquardtSpace::Running);\n    return status;\n}\n\ntemplate<typename FunctorType, typename Scalar>\nLevenbergMarquardtSpace::Status\nLevenbergMarquardt<FunctorType,Scalar>::minimizeInit(FVectorType  &x)\n{\n    n = x.size();\n    m = functor.values();\n\n    wa1.resize(n); wa2.resize(n); wa3.resize(n);\n    wa4.resize(m);\n    fvec.resize(m);\n    fjac.resize(m, n);\n    if (!useExternalScaling)\n        diag.resize(n);\n    eigen_assert( (!useExternalScaling || diag.size()==n) || \"When useExternalScaling is set, the caller must provide a valid 'diag'\");\n    qtf.resize(n);\n\n    /* Function Body */\n    nfev = 0;\n    njev = 0;\n\n    /*     check the input parameters for errors. */\n    if (n <= 0 || m < n || parameters.ftol < 0. || parameters.xtol < 0. || parameters.gtol < 0. || parameters.maxfev <= 0 || parameters.factor <= 0.)\n        return LevenbergMarquardtSpace::ImproperInputParameters;\n\n    if (useExternalScaling)\n        for (Index j = 0; j < n; ++j)\n            if (diag[j] <= 0.)\n                return LevenbergMarquardtSpace::ImproperInputParameters;\n\n    /*     evaluate the function at the starting point */\n    /*     and calculate its norm. */\n    nfev = 1;\n    if ( functor(x, fvec) < 0)\n        return LevenbergMarquardtSpace::UserAsked;\n    fnorm = fvec.stableNorm();\n\n    /*     initialize levenberg-marquardt parameter and iteration counter. */\n    par = 0.;\n    iter = 1;\n\n    return LevenbergMarquardtSpace::NotStarted;\n}\n\ntemplate<typename FunctorType, typename Scalar>\nLevenbergMarquardtSpace::Status\nLevenbergMarquardt<FunctorType,Scalar>::minimizeOneStep(FVectorType  &x)\n{\n    using std::abs;\n    using std::sqrt;\n    \n    eigen_assert(x.size()==n); // check the caller is not cheating us\n\n    /* calculate the jacobian matrix. */\n    Index df_ret = functor.df(x, fjac);\n    if (df_ret<0)\n        return LevenbergMarquardtSpace::UserAsked;\n    if (df_ret>0)\n        // numerical diff, we evaluated the function df_ret times\n        nfev += df_ret;\n    else njev++;\n\n    /* compute the qr factorization of the jacobian. */\n    wa2 = fjac.colwise().blueNorm();\n    ColPivHouseholderQR<JacobianType> qrfac(fjac);\n    fjac = qrfac.matrixQR();\n    permutation = qrfac.colsPermutation();\n\n    /* on the first iteration and if external scaling is not used, scale according */\n    /* to the norms of the columns of the initial jacobian. */\n    if (iter == 1) {\n        if (!useExternalScaling)\n            for (Index j = 0; j < n; ++j)\n                diag[j] = (wa2[j]==0.)? 1. : wa2[j];\n\n        /* on the first iteration, calculate the norm of the scaled x */\n        /* and initialize the step bound delta. */\n        xnorm = diag.cwiseProduct(x).stableNorm();\n        delta = parameters.factor * xnorm;\n        if (delta == 0.)\n            delta = parameters.factor;\n    }\n\n    /* form (q transpose)*fvec and store the first n components in */\n    /* qtf. */\n    wa4 = fvec;\n    wa4.applyOnTheLeft(qrfac.householderQ().adjoint());\n    qtf = wa4.head(n);\n\n    /* compute the norm of the scaled gradient. */\n    gnorm = 0.;\n    if (fnorm != 0.)\n        for (Index j = 0; j < n; ++j)\n            if (wa2[permutation.indices()[j]] != 0.)\n                gnorm = (std::max)(gnorm, abs( fjac.col(j).head(j+1).dot(qtf.head(j+1)/fnorm) / wa2[permutation.indices()[j]]));\n\n    /* test for convergence of the gradient norm. */\n    if (gnorm <= parameters.gtol)\n        return LevenbergMarquardtSpace::CosinusTooSmall;\n\n    /* rescale if necessary. */\n    if (!useExternalScaling)\n        diag = diag.cwiseMax(wa2);\n\n    do {\n\n        /* determine the levenberg-marquardt parameter. */\n        internal::lmpar2<Scalar>(qrfac, diag, qtf, delta, par, wa1);\n\n        /* store the direction p and x + p. calculate the norm of p. */\n        wa1 = -wa1;\n        wa2 = x + wa1;\n        pnorm = diag.cwiseProduct(wa1).stableNorm();\n\n        /* on the first iteration, adjust the initial step bound. */\n        if (iter == 1)\n            delta = (std::min)(delta,pnorm);\n\n        /* evaluate the function at x + p and calculate its norm. */\n        if ( functor(wa2, wa4) < 0)\n            return LevenbergMarquardtSpace::UserAsked;\n        ++nfev;\n        fnorm1 = wa4.stableNorm();\n\n        /* compute the scaled actual reduction. */\n        actred = -1.;\n        if (Scalar(.1) * fnorm1 < fnorm)\n            actred = 1. - numext::abs2(fnorm1 / fnorm);\n\n        /* compute the scaled predicted reduction and */\n        /* the scaled directional derivative. */\n        wa3 = fjac.template triangularView<Upper>() * (qrfac.colsPermutation().inverse() *wa1);\n        temp1 = numext::abs2(wa3.stableNorm() / fnorm);\n        temp2 = numext::abs2(sqrt(par) * pnorm / fnorm);\n        prered = temp1 + temp2 / Scalar(.5);\n        dirder = -(temp1 + temp2);\n\n        /* compute the ratio of the actual to the predicted */\n        /* reduction. */\n        ratio = 0.;\n        if (prered != 0.)\n            ratio = actred / prered;\n\n        /* update the step bound. */\n        if (ratio <= Scalar(.25)) {\n            if (actred >= 0.)\n                temp = Scalar(.5);\n            if (actred < 0.)\n                temp = Scalar(.5) * dirder / (dirder + Scalar(.5) * actred);\n            if (Scalar(.1) * fnorm1 >= fnorm || temp < Scalar(.1))\n                temp = Scalar(.1);\n            /* Computing MIN */\n            delta = temp * (std::min)(delta, pnorm / Scalar(.1));\n            par /= temp;\n        } else if (!(par != 0. && ratio < Scalar(.75))) {\n            delta = pnorm / Scalar(.5);\n            par = Scalar(.5) * par;\n        }\n\n        /* test for successful iteration. */\n        if (ratio >= Scalar(1e-4)) {\n            /* successful iteration. update x, fvec, and their norms. */\n            x = wa2;\n            wa2 = diag.cwiseProduct(x);\n            fvec = wa4;\n            xnorm = wa2.stableNorm();\n            fnorm = fnorm1;\n            ++iter;\n        }\n\n        /* tests for convergence. */\n        if (abs(actred) <= parameters.ftol && prered <= parameters.ftol && Scalar(.5) * ratio <= 1. && delta <= parameters.xtol * xnorm)\n            return LevenbergMarquardtSpace::RelativeErrorAndReductionTooSmall;\n        if (abs(actred) <= parameters.ftol && prered <= parameters.ftol && Scalar(.5) * ratio <= 1.)\n            return LevenbergMarquardtSpace::RelativeReductionTooSmall;\n        if (delta <= parameters.xtol * xnorm)\n            return LevenbergMarquardtSpace::RelativeErrorTooSmall;\n\n        /* tests for termination and stringent tolerances. */\n        if (nfev >= parameters.maxfev)\n            return LevenbergMarquardtSpace::TooManyFunctionEvaluation;\n        if (abs(actred) <= NumTraits<Scalar>::epsilon() && prered <= NumTraits<Scalar>::epsilon() && Scalar(.5) * ratio <= 1.)\n            return LevenbergMarquardtSpace::FtolTooSmall;\n        if (delta <= NumTraits<Scalar>::epsilon() * xnorm)\n            return LevenbergMarquardtSpace::XtolTooSmall;\n        if (gnorm <= NumTraits<Scalar>::epsilon())\n            return LevenbergMarquardtSpace::GtolTooSmall;\n\n    } while (ratio < Scalar(1e-4));\n\n    return LevenbergMarquardtSpace::Running;\n}\n\ntemplate<typename FunctorType, typename Scalar>\nLevenbergMarquardtSpace::Status\nLevenbergMarquardt<FunctorType,Scalar>::lmstr1(\n        FVectorType  &x,\n        const Scalar tol\n        )\n{\n    n = x.size();\n    m = functor.values();\n\n    /* check the input parameters for errors. */\n    if (n <= 0 || m < n || tol < 0.)\n        return LevenbergMarquardtSpace::ImproperInputParameters;\n\n    resetParameters();\n    parameters.ftol = tol;\n    parameters.xtol = tol;\n    parameters.maxfev = 100*(n+1);\n\n    return minimizeOptimumStorage(x);\n}\n\ntemplate<typename FunctorType, typename Scalar>\nLevenbergMarquardtSpace::Status\nLevenbergMarquardt<FunctorType,Scalar>::minimizeOptimumStorageInit(FVectorType  &x)\n{\n    n = x.size();\n    m = functor.values();\n\n    wa1.resize(n); wa2.resize(n); wa3.resize(n);\n    wa4.resize(m);\n    fvec.resize(m);\n    // Only R is stored in fjac. Q is only used to compute 'qtf', which is\n    // Q.transpose()*rhs. qtf will be updated using givens rotation,\n    // instead of storing them in Q.\n    // The purpose it to only use a nxn matrix, instead of mxn here, so\n    // that we can handle cases where m>>n :\n    fjac.resize(n, n);\n    if (!useExternalScaling)\n        diag.resize(n);\n    eigen_assert( (!useExternalScaling || diag.size()==n) || \"When useExternalScaling is set, the caller must provide a valid 'diag'\");\n    qtf.resize(n);\n\n    /* Function Body */\n    nfev = 0;\n    njev = 0;\n\n    /*     check the input parameters for errors. */\n    if (n <= 0 || m < n || parameters.ftol < 0. || parameters.xtol < 0. || parameters.gtol < 0. || parameters.maxfev <= 0 || parameters.factor <= 0.)\n        return LevenbergMarquardtSpace::ImproperInputParameters;\n\n    if (useExternalScaling)\n        for (Index j = 0; j < n; ++j)\n            if (diag[j] <= 0.)\n                return LevenbergMarquardtSpace::ImproperInputParameters;\n\n    /*     evaluate the function at the starting point */\n    /*     and calculate its norm. */\n    nfev = 1;\n    if ( functor(x, fvec) < 0)\n        return LevenbergMarquardtSpace::UserAsked;\n    fnorm = fvec.stableNorm();\n\n    /*     initialize levenberg-marquardt parameter and iteration counter. */\n    par = 0.;\n    iter = 1;\n\n    return LevenbergMarquardtSpace::NotStarted;\n}\n\n\ntemplate<typename FunctorType, typename Scalar>\nLevenbergMarquardtSpace::Status\nLevenbergMarquardt<FunctorType,Scalar>::minimizeOptimumStorageOneStep(FVectorType  &x)\n{\n    using std::abs;\n    using std::sqrt;\n    \n    eigen_assert(x.size()==n); // check the caller is not cheating us\n\n    Index i, j;\n    bool sing;\n\n    /* compute the qr factorization of the jacobian matrix */\n    /* calculated one row at a time, while simultaneously */\n    /* forming (q transpose)*fvec and storing the first */\n    /* n components in qtf. */\n    qtf.fill(0.);\n    fjac.fill(0.);\n    Index rownb = 2;\n    for (i = 0; i < m; ++i) {\n        if (functor.df(x, wa3, rownb) < 0) return LevenbergMarquardtSpace::UserAsked;\n        internal::rwupdt<Scalar>(fjac, wa3, qtf, fvec[i]);\n        ++rownb;\n    }\n    ++njev;\n\n    /* if the jacobian is rank deficient, call qrfac to */\n    /* reorder its columns and update the components of qtf. */\n    sing = false;\n    for (j = 0; j < n; ++j) {\n        if (fjac(j,j) == 0.)\n            sing = true;\n        wa2[j] = fjac.col(j).head(j).stableNorm();\n    }\n    permutation.setIdentity(n);\n    if (sing) {\n        wa2 = fjac.colwise().blueNorm();\n        // TODO We have no unit test covering this code path, do not modify\n        // until it is carefully tested\n        ColPivHouseholderQR<JacobianType> qrfac(fjac);\n        fjac = qrfac.matrixQR();\n        wa1 = fjac.diagonal();\n        fjac.diagonal() = qrfac.hCoeffs();\n        permutation = qrfac.colsPermutation();\n        // TODO : avoid this:\n        for(Index ii=0; ii< fjac.cols(); ii++) fjac.col(ii).segment(ii+1, fjac.rows()-ii-1) *= fjac(ii,ii); // rescale vectors\n\n        for (j = 0; j < n; ++j) {\n            if (fjac(j,j) != 0.) {\n                sum = 0.;\n                for (i = j; i < n; ++i)\n                    sum += fjac(i,j) * qtf[i];\n                temp = -sum / fjac(j,j);\n                for (i = j; i < n; ++i)\n                    qtf[i] += fjac(i,j) * temp;\n            }\n            fjac(j,j) = wa1[j];\n        }\n    }\n\n    /* on the first iteration and if external scaling is not used, scale according */\n    /* to the norms of the columns of the initial jacobian. */\n    if (iter == 1) {\n        if (!useExternalScaling)\n            for (j = 0; j < n; ++j)\n                diag[j] = (wa2[j]==0.)? 1. : wa2[j];\n\n        /* on the first iteration, calculate the norm of the scaled x */\n        /* and initialize the step bound delta. */\n        xnorm = diag.cwiseProduct(x).stableNorm();\n        delta = parameters.factor * xnorm;\n        if (delta == 0.)\n            delta = parameters.factor;\n    }\n\n    /* compute the norm of the scaled gradient. */\n    gnorm = 0.;\n    if (fnorm != 0.)\n        for (j = 0; j < n; ++j)\n            if (wa2[permutation.indices()[j]] != 0.)\n                gnorm = (std::max)(gnorm, abs( fjac.col(j).head(j+1).dot(qtf.head(j+1)/fnorm) / wa2[permutation.indices()[j]]));\n\n    /* test for convergence of the gradient norm. */\n    if (gnorm <= parameters.gtol)\n        return LevenbergMarquardtSpace::CosinusTooSmall;\n\n    /* rescale if necessary. */\n    if (!useExternalScaling)\n        diag = diag.cwiseMax(wa2);\n\n    do {\n\n        /* determine the levenberg-marquardt parameter. */\n        internal::lmpar<Scalar>(fjac, permutation.indices(), diag, qtf, delta, par, wa1);\n\n        /* store the direction p and x + p. calculate the norm of p. */\n        wa1 = -wa1;\n        wa2 = x + wa1;\n        pnorm = diag.cwiseProduct(wa1).stableNorm();\n\n        /* on the first iteration, adjust the initial step bound. */\n        if (iter == 1)\n            delta = (std::min)(delta,pnorm);\n\n        /* evaluate the function at x + p and calculate its norm. */\n        if ( functor(wa2, wa4) < 0)\n            return LevenbergMarquardtSpace::UserAsked;\n        ++nfev;\n        fnorm1 = wa4.stableNorm();\n\n        /* compute the scaled actual reduction. */\n        actred = -1.;\n        if (Scalar(.1) * fnorm1 < fnorm)\n            actred = 1. - numext::abs2(fnorm1 / fnorm);\n\n        /* compute the scaled predicted reduction and */\n        /* the scaled directional derivative. */\n        wa3 = fjac.topLeftCorner(n,n).template triangularView<Upper>() * (permutation.inverse() * wa1);\n        temp1 = numext::abs2(wa3.stableNorm() / fnorm);\n        temp2 = numext::abs2(sqrt(par) * pnorm / fnorm);\n        prered = temp1 + temp2 / Scalar(.5);\n        dirder = -(temp1 + temp2);\n\n        /* compute the ratio of the actual to the predicted */\n        /* reduction. */\n        ratio = 0.;\n        if (prered != 0.)\n            ratio = actred / prered;\n\n        /* update the step bound. */\n        if (ratio <= Scalar(.25)) {\n            if (actred >= 0.)\n                temp = Scalar(.5);\n            if (actred < 0.)\n                temp = Scalar(.5) * dirder / (dirder + Scalar(.5) * actred);\n            if (Scalar(.1) * fnorm1 >= fnorm || temp < Scalar(.1))\n                temp = Scalar(.1);\n            /* Computing MIN */\n            delta = temp * (std::min)(delta, pnorm / Scalar(.1));\n            par /= temp;\n        } else if (!(par != 0. && ratio < Scalar(.75))) {\n            delta = pnorm / Scalar(.5);\n            par = Scalar(.5) * par;\n        }\n\n        /* test for successful iteration. */\n        if (ratio >= Scalar(1e-4)) {\n            /* successful iteration. update x, fvec, and their norms. */\n            x = wa2;\n            wa2 = diag.cwiseProduct(x);\n            fvec = wa4;\n            xnorm = wa2.stableNorm();\n            fnorm = fnorm1;\n            ++iter;\n        }\n\n        /* tests for convergence. */\n        if (abs(actred) <= parameters.ftol && prered <= parameters.ftol && Scalar(.5) * ratio <= 1. && delta <= parameters.xtol * xnorm)\n            return LevenbergMarquardtSpace::RelativeErrorAndReductionTooSmall;\n        if (abs(actred) <= parameters.ftol && prered <= parameters.ftol && Scalar(.5) * ratio <= 1.)\n            return LevenbergMarquardtSpace::RelativeReductionTooSmall;\n        if (delta <= parameters.xtol * xnorm)\n            return LevenbergMarquardtSpace::RelativeErrorTooSmall;\n\n        /* tests for termination and stringent tolerances. */\n        if (nfev >= parameters.maxfev)\n            return LevenbergMarquardtSpace::TooManyFunctionEvaluation;\n        if (abs(actred) <= NumTraits<Scalar>::epsilon() && prered <= NumTraits<Scalar>::epsilon() && Scalar(.5) * ratio <= 1.)\n            return LevenbergMarquardtSpace::FtolTooSmall;\n        if (delta <= NumTraits<Scalar>::epsilon() * xnorm)\n            return LevenbergMarquardtSpace::XtolTooSmall;\n        if (gnorm <= NumTraits<Scalar>::epsilon())\n            return LevenbergMarquardtSpace::GtolTooSmall;\n\n    } while (ratio < Scalar(1e-4));\n\n    return LevenbergMarquardtSpace::Running;\n}\n\ntemplate<typename FunctorType, typename Scalar>\nLevenbergMarquardtSpace::Status\nLevenbergMarquardt<FunctorType,Scalar>::minimizeOptimumStorage(FVectorType  &x)\n{\n    LevenbergMarquardtSpace::Status status = minimizeOptimumStorageInit(x);\n    if (status==LevenbergMarquardtSpace::ImproperInputParameters)\n        return status;\n    do {\n        status = minimizeOptimumStorageOneStep(x);\n    } while (status==LevenbergMarquardtSpace::Running);\n    return status;\n}\n\ntemplate<typename FunctorType, typename Scalar>\nLevenbergMarquardtSpace::Status\nLevenbergMarquardt<FunctorType,Scalar>::lmdif1(\n        FunctorType &functor,\n        FVectorType  &x,\n        Index *nfev,\n        const Scalar tol\n        )\n{\n    Index n = x.size();\n    Index m = functor.values();\n\n    /* check the input parameters for errors. */\n    if (n <= 0 || m < n || tol < 0.)\n        return LevenbergMarquardtSpace::ImproperInputParameters;\n\n    NumericalDiff<FunctorType> numDiff(functor);\n    // embedded LevenbergMarquardt\n    LevenbergMarquardt<NumericalDiff<FunctorType>, Scalar > lm(numDiff);\n    lm.parameters.ftol = tol;\n    lm.parameters.xtol = tol;\n    lm.parameters.maxfev = 200*(n+1);\n\n    LevenbergMarquardtSpace::Status info = LevenbergMarquardtSpace::Status(lm.minimize(x));\n    if (nfev)\n        * nfev = lm.nfev;\n    return info;\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_LEVENBERGMARQUARDT__H\n\n//vim: ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/NonLinearOptimization/chkder.h",
    "content": "#define chkder_log10e 0.43429448190325182765\n#define chkder_factor 100.\n\nnamespace Eigen { \n\nnamespace internal {\n\ntemplate<typename Scalar>\nvoid chkder(\n        const Matrix< Scalar, Dynamic, 1 >  &x,\n        const Matrix< Scalar, Dynamic, 1 >  &fvec,\n        const Matrix< Scalar, Dynamic, Dynamic > &fjac,\n        Matrix< Scalar, Dynamic, 1 >  &xp,\n        const Matrix< Scalar, Dynamic, 1 >  &fvecp,\n        int mode,\n        Matrix< Scalar, Dynamic, 1 >  &err\n        )\n{\n    using std::sqrt;\n    using std::abs;\n    using std::log;\n    \n    typedef DenseIndex Index;\n\n    const Scalar eps = sqrt(NumTraits<Scalar>::epsilon());\n    const Scalar epsf = chkder_factor * NumTraits<Scalar>::epsilon();\n    const Scalar epslog = chkder_log10e * log(eps);\n    Scalar temp;\n\n    const Index m = fvec.size(), n = x.size();\n\n    if (mode != 2) {\n        /* mode = 1. */\n        xp.resize(n);\n        for (Index j = 0; j < n; ++j) {\n            temp = eps * abs(x[j]);\n            if (temp == 0.)\n                temp = eps;\n            xp[j] = x[j] + temp;\n        }\n    }\n    else {\n        /* mode = 2. */\n        err.setZero(m); \n        for (Index j = 0; j < n; ++j) {\n            temp = abs(x[j]);\n            if (temp == 0.)\n                temp = 1.;\n            err += temp * fjac.col(j);\n        }\n        for (Index i = 0; i < m; ++i) {\n            temp = 1.;\n            if (fvec[i] != 0. && fvecp[i] != 0. && abs(fvecp[i] - fvec[i]) >= epsf * abs(fvec[i]))\n                temp = eps * abs((fvecp[i] - fvec[i]) / eps - err[i]) / (abs(fvec[i]) + abs(fvecp[i]));\n            err[i] = 1.;\n            if (temp > NumTraits<Scalar>::epsilon() && temp < eps)\n                err[i] = (chkder_log10e * log(temp) - epslog) / epslog;\n            if (temp >= eps)\n                err[i] = 0.;\n        }\n    }\n}\n\n} // end namespace internal\n\n} // end namespace Eigen\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/NonLinearOptimization/covar.h",
    "content": "namespace Eigen { \n\nnamespace internal {\n\ntemplate <typename Scalar>\nvoid covar(\n        Matrix< Scalar, Dynamic, Dynamic > &r,\n        const VectorXi &ipvt,\n        Scalar tol = std::sqrt(NumTraits<Scalar>::epsilon()) )\n{\n    using std::abs;\n    typedef DenseIndex Index;\n\n    /* Local variables */\n    Index i, j, k, l, ii, jj;\n    bool sing;\n    Scalar temp;\n\n    /* Function Body */\n    const Index n = r.cols();\n    const Scalar tolr = tol * abs(r(0,0));\n    Matrix< Scalar, Dynamic, 1 > wa(n);\n    eigen_assert(ipvt.size()==n);\n\n    /* form the inverse of r in the full upper triangle of r. */\n    l = -1;\n    for (k = 0; k < n; ++k)\n        if (abs(r(k,k)) > tolr) {\n            r(k,k) = 1. / r(k,k);\n            for (j = 0; j <= k-1; ++j) {\n                temp = r(k,k) * r(j,k);\n                r(j,k) = 0.;\n                r.col(k).head(j+1) -= r.col(j).head(j+1) * temp;\n            }\n            l = k;\n        }\n\n    /* form the full upper triangle of the inverse of (r transpose)*r */\n    /* in the full upper triangle of r. */\n    for (k = 0; k <= l; ++k) {\n        for (j = 0; j <= k-1; ++j)\n            r.col(j).head(j+1) += r.col(k).head(j+1) * r(j,k);\n        r.col(k).head(k+1) *= r(k,k);\n    }\n\n    /* form the full lower triangle of the covariance matrix */\n    /* in the strict lower triangle of r and in wa. */\n    for (j = 0; j < n; ++j) {\n        jj = ipvt[j];\n        sing = j > l;\n        for (i = 0; i <= j; ++i) {\n            if (sing)\n                r(i,j) = 0.;\n            ii = ipvt[i];\n            if (ii > jj)\n                r(ii,jj) = r(i,j);\n            if (ii < jj)\n                r(jj,ii) = r(i,j);\n        }\n        wa[jj] = r(j,j);\n    }\n\n    /* symmetrize the covariance matrix in r. */\n    r.topLeftCorner(n,n).template triangularView<StrictlyUpper>() = r.topLeftCorner(n,n).transpose();\n    r.diagonal() = wa;\n}\n\n} // end namespace internal\n\n} // end namespace Eigen\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/NonLinearOptimization/dogleg.h",
    "content": "namespace Eigen { \n\nnamespace internal {\n\ntemplate <typename Scalar>\nvoid dogleg(\n        const Matrix< Scalar, Dynamic, Dynamic >  &qrfac,\n        const Matrix< Scalar, Dynamic, 1 >  &diag,\n        const Matrix< Scalar, Dynamic, 1 >  &qtb,\n        Scalar delta,\n        Matrix< Scalar, Dynamic, 1 >  &x)\n{\n    using std::abs;\n    using std::sqrt;\n    \n    typedef DenseIndex Index;\n\n    /* Local variables */\n    Index i, j;\n    Scalar sum, temp, alpha, bnorm;\n    Scalar gnorm, qnorm;\n    Scalar sgnorm;\n\n    /* Function Body */\n    const Scalar epsmch = NumTraits<Scalar>::epsilon();\n    const Index n = qrfac.cols();\n    eigen_assert(n==qtb.size());\n    eigen_assert(n==x.size());\n    eigen_assert(n==diag.size());\n    Matrix< Scalar, Dynamic, 1 >  wa1(n), wa2(n);\n\n    /* first, calculate the gauss-newton direction. */\n    for (j = n-1; j >=0; --j) {\n        temp = qrfac(j,j);\n        if (temp == 0.) {\n            temp = epsmch * qrfac.col(j).head(j+1).maxCoeff();\n            if (temp == 0.)\n                temp = epsmch;\n        }\n        if (j==n-1)\n            x[j] = qtb[j] / temp;\n        else\n            x[j] = (qtb[j] - qrfac.row(j).tail(n-j-1).dot(x.tail(n-j-1))) / temp;\n    }\n\n    /* test whether the gauss-newton direction is acceptable. */\n    qnorm = diag.cwiseProduct(x).stableNorm();\n    if (qnorm <= delta)\n        return;\n\n    // TODO : this path is not tested by Eigen unit tests\n\n    /* the gauss-newton direction is not acceptable. */\n    /* next, calculate the scaled gradient direction. */\n\n    wa1.fill(0.);\n    for (j = 0; j < n; ++j) {\n        wa1.tail(n-j) += qrfac.row(j).tail(n-j) * qtb[j];\n        wa1[j] /= diag[j];\n    }\n\n    /* calculate the norm of the scaled gradient and test for */\n    /* the special case in which the scaled gradient is zero. */\n    gnorm = wa1.stableNorm();\n    sgnorm = 0.;\n    alpha = delta / qnorm;\n    if (gnorm == 0.)\n        goto algo_end;\n\n    /* calculate the point along the scaled gradient */\n    /* at which the quadratic is minimized. */\n    wa1.array() /= (diag*gnorm).array();\n    // TODO : once unit tests cover this part,:\n    // wa2 = qrfac.template triangularView<Upper>() * wa1;\n    for (j = 0; j < n; ++j) {\n        sum = 0.;\n        for (i = j; i < n; ++i) {\n            sum += qrfac(j,i) * wa1[i];\n        }\n        wa2[j] = sum;\n    }\n    temp = wa2.stableNorm();\n    sgnorm = gnorm / temp / temp;\n\n    /* test whether the scaled gradient direction is acceptable. */\n    alpha = 0.;\n    if (sgnorm >= delta)\n        goto algo_end;\n\n    /* the scaled gradient direction is not acceptable. */\n    /* finally, calculate the point along the dogleg */\n    /* at which the quadratic is minimized. */\n    bnorm = qtb.stableNorm();\n    temp = bnorm / gnorm * (bnorm / qnorm) * (sgnorm / delta);\n    temp = temp - delta / qnorm * numext::abs2(sgnorm / delta) + sqrt(numext::abs2(temp - delta / qnorm) + (1.-numext::abs2(delta / qnorm)) * (1.-numext::abs2(sgnorm / delta)));\n    alpha = delta / qnorm * (1. - numext::abs2(sgnorm / delta)) / temp;\nalgo_end:\n\n    /* form appropriate convex combination of the gauss-newton */\n    /* direction and the scaled gradient direction. */\n    temp = (1.-alpha) * (std::min)(sgnorm,delta);\n    x = temp * wa1 + alpha * x;\n}\n\n} // end namespace internal\n\n} // end namespace Eigen\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/NonLinearOptimization/fdjac1.h",
    "content": "namespace Eigen { \n\nnamespace internal {\n\ntemplate<typename FunctorType, typename Scalar>\nDenseIndex fdjac1(\n        const FunctorType &Functor,\n        Matrix< Scalar, Dynamic, 1 >  &x,\n        Matrix< Scalar, Dynamic, 1 >  &fvec,\n        Matrix< Scalar, Dynamic, Dynamic > &fjac,\n        DenseIndex ml, DenseIndex mu,\n        Scalar epsfcn)\n{\n    using std::sqrt;\n    using std::abs;\n    \n    typedef DenseIndex Index;\n\n    /* Local variables */\n    Scalar h;\n    Index j, k;\n    Scalar eps, temp;\n    Index msum;\n    int iflag;\n    Index start, length;\n\n    /* Function Body */\n    const Scalar epsmch = NumTraits<Scalar>::epsilon();\n    const Index n = x.size();\n    eigen_assert(fvec.size()==n);\n    Matrix< Scalar, Dynamic, 1 >  wa1(n);\n    Matrix< Scalar, Dynamic, 1 >  wa2(n);\n\n    eps = sqrt((std::max)(epsfcn,epsmch));\n    msum = ml + mu + 1;\n    if (msum >= n) {\n        /* computation of dense approximate jacobian. */\n        for (j = 0; j < n; ++j) {\n            temp = x[j];\n            h = eps * abs(temp);\n            if (h == 0.)\n                h = eps;\n            x[j] = temp + h;\n            iflag = Functor(x, wa1);\n            if (iflag < 0)\n                return iflag;\n            x[j] = temp;\n            fjac.col(j) = (wa1-fvec)/h;\n        }\n\n    }else {\n        /* computation of banded approximate jacobian. */\n        for (k = 0; k < msum; ++k) {\n            for (j = k; (msum<0) ? (j>n): (j<n); j += msum) {\n                wa2[j] = x[j];\n                h = eps * abs(wa2[j]);\n                if (h == 0.) h = eps;\n                x[j] = wa2[j] + h;\n            }\n            iflag = Functor(x, wa1);\n            if (iflag < 0)\n                return iflag;\n            for (j = k; (msum<0) ? (j>n): (j<n); j += msum) {\n                x[j] = wa2[j];\n                h = eps * abs(wa2[j]);\n                if (h == 0.) h = eps;\n                fjac.col(j).setZero();\n                start = std::max<Index>(0,j-mu);\n                length = (std::min)(n-1, j+ml) - start + 1;\n                fjac.col(j).segment(start, length) = ( wa1.segment(start, length)-fvec.segment(start, length))/h;\n            }\n        }\n    }\n    return 0;\n}\n\n} // end namespace internal\n\n} // end namespace Eigen\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/NonLinearOptimization/lmpar.h",
    "content": "namespace Eigen { \n\nnamespace internal {\n\ntemplate <typename Scalar>\nvoid lmpar(\n        Matrix< Scalar, Dynamic, Dynamic > &r,\n        const VectorXi &ipvt,\n        const Matrix< Scalar, Dynamic, 1 >  &diag,\n        const Matrix< Scalar, Dynamic, 1 >  &qtb,\n        Scalar delta,\n        Scalar &par,\n        Matrix< Scalar, Dynamic, 1 >  &x)\n{\n    using std::abs;\n    using std::sqrt;\n    typedef DenseIndex Index;\n\n    /* Local variables */\n    Index i, j, l;\n    Scalar fp;\n    Scalar parc, parl;\n    Index iter;\n    Scalar temp, paru;\n    Scalar gnorm;\n    Scalar dxnorm;\n\n\n    /* Function Body */\n    const Scalar dwarf = (std::numeric_limits<Scalar>::min)();\n    const Index n = r.cols();\n    eigen_assert(n==diag.size());\n    eigen_assert(n==qtb.size());\n    eigen_assert(n==x.size());\n\n    Matrix< Scalar, Dynamic, 1 >  wa1, wa2;\n\n    /* compute and store in x the gauss-newton direction. if the */\n    /* jacobian is rank-deficient, obtain a least squares solution. */\n    Index nsing = n-1;\n    wa1 = qtb;\n    for (j = 0; j < n; ++j) {\n        if (r(j,j) == 0. && nsing == n-1)\n            nsing = j - 1;\n        if (nsing < n-1)\n            wa1[j] = 0.;\n    }\n    for (j = nsing; j>=0; --j) {\n        wa1[j] /= r(j,j);\n        temp = wa1[j];\n        for (i = 0; i < j ; ++i)\n            wa1[i] -= r(i,j) * temp;\n    }\n\n    for (j = 0; j < n; ++j)\n        x[ipvt[j]] = wa1[j];\n\n    /* initialize the iteration counter. */\n    /* evaluate the function at the origin, and test */\n    /* for acceptance of the gauss-newton direction. */\n    iter = 0;\n    wa2 = diag.cwiseProduct(x);\n    dxnorm = wa2.blueNorm();\n    fp = dxnorm - delta;\n    if (fp <= Scalar(0.1) * delta) {\n        par = 0;\n        return;\n    }\n\n    /* if the jacobian is not rank deficient, the newton */\n    /* step provides a lower bound, parl, for the zero of */\n    /* the function. otherwise set this bound to zero. */\n    parl = 0.;\n    if (nsing >= n-1) {\n        for (j = 0; j < n; ++j) {\n            l = ipvt[j];\n            wa1[j] = diag[l] * (wa2[l] / dxnorm);\n        }\n        // it's actually a triangularView.solveInplace(), though in a weird\n        // way:\n        for (j = 0; j < n; ++j) {\n            Scalar sum = 0.;\n            for (i = 0; i < j; ++i)\n                sum += r(i,j) * wa1[i];\n            wa1[j] = (wa1[j] - sum) / r(j,j);\n        }\n        temp = wa1.blueNorm();\n        parl = fp / delta / temp / temp;\n    }\n\n    /* calculate an upper bound, paru, for the zero of the function. */\n    for (j = 0; j < n; ++j)\n        wa1[j] = r.col(j).head(j+1).dot(qtb.head(j+1)) / diag[ipvt[j]];\n\n    gnorm = wa1.stableNorm();\n    paru = gnorm / delta;\n    if (paru == 0.)\n        paru = dwarf / (std::min)(delta,Scalar(0.1));\n\n    /* if the input par lies outside of the interval (parl,paru), */\n    /* set par to the closer endpoint. */\n    par = (std::max)(par,parl);\n    par = (std::min)(par,paru);\n    if (par == 0.)\n        par = gnorm / dxnorm;\n\n    /* beginning of an iteration. */\n    while (true) {\n        ++iter;\n\n        /* evaluate the function at the current value of par. */\n        if (par == 0.)\n            par = (std::max)(dwarf,Scalar(.001) * paru); /* Computing MAX */\n        wa1 = sqrt(par)* diag;\n\n        Matrix< Scalar, Dynamic, 1 > sdiag(n);\n        qrsolv<Scalar>(r, ipvt, wa1, qtb, x, sdiag);\n\n        wa2 = diag.cwiseProduct(x);\n        dxnorm = wa2.blueNorm();\n        temp = fp;\n        fp = dxnorm - delta;\n\n        /* if the function is small enough, accept the current value */\n        /* of par. also test for the exceptional cases where parl */\n        /* is zero or the number of iterations has reached 10. */\n        if (abs(fp) <= Scalar(0.1) * delta || (parl == 0. && fp <= temp && temp < 0.) || iter == 10)\n            break;\n\n        /* compute the newton correction. */\n        for (j = 0; j < n; ++j) {\n            l = ipvt[j];\n            wa1[j] = diag[l] * (wa2[l] / dxnorm);\n        }\n        for (j = 0; j < n; ++j) {\n            wa1[j] /= sdiag[j];\n            temp = wa1[j];\n            for (i = j+1; i < n; ++i)\n                wa1[i] -= r(i,j) * temp;\n        }\n        temp = wa1.blueNorm();\n        parc = fp / delta / temp / temp;\n\n        /* depending on the sign of the function, update parl or paru. */\n        if (fp > 0.)\n            parl = (std::max)(parl,par);\n        if (fp < 0.)\n            paru = (std::min)(paru,par);\n\n        /* compute an improved estimate for par. */\n        /* Computing MAX */\n        par = (std::max)(parl,par+parc);\n\n        /* end of an iteration. */\n    }\n\n    /* termination. */\n    if (iter == 0)\n        par = 0.;\n    return;\n}\n\ntemplate <typename Scalar>\nvoid lmpar2(\n        const ColPivHouseholderQR<Matrix< Scalar, Dynamic, Dynamic> > &qr,\n        const Matrix< Scalar, Dynamic, 1 >  &diag,\n        const Matrix< Scalar, Dynamic, 1 >  &qtb,\n        Scalar delta,\n        Scalar &par,\n        Matrix< Scalar, Dynamic, 1 >  &x)\n\n{\n    using std::sqrt;\n    using std::abs;\n    typedef DenseIndex Index;\n\n    /* Local variables */\n    Index j;\n    Scalar fp;\n    Scalar parc, parl;\n    Index iter;\n    Scalar temp, paru;\n    Scalar gnorm;\n    Scalar dxnorm;\n\n\n    /* Function Body */\n    const Scalar dwarf = (std::numeric_limits<Scalar>::min)();\n    const Index n = qr.matrixQR().cols();\n    eigen_assert(n==diag.size());\n    eigen_assert(n==qtb.size());\n\n    Matrix< Scalar, Dynamic, 1 >  wa1, wa2;\n\n    /* compute and store in x the gauss-newton direction. if the */\n    /* jacobian is rank-deficient, obtain a least squares solution. */\n\n//    const Index rank = qr.nonzeroPivots(); // exactly double(0.)\n    const Index rank = qr.rank(); // use a threshold\n    wa1 = qtb;\n    wa1.tail(n-rank).setZero();\n    qr.matrixQR().topLeftCorner(rank, rank).template triangularView<Upper>().solveInPlace(wa1.head(rank));\n\n    x = qr.colsPermutation()*wa1;\n\n    /* initialize the iteration counter. */\n    /* evaluate the function at the origin, and test */\n    /* for acceptance of the gauss-newton direction. */\n    iter = 0;\n    wa2 = diag.cwiseProduct(x);\n    dxnorm = wa2.blueNorm();\n    fp = dxnorm - delta;\n    if (fp <= Scalar(0.1) * delta) {\n        par = 0;\n        return;\n    }\n\n    /* if the jacobian is not rank deficient, the newton */\n    /* step provides a lower bound, parl, for the zero of */\n    /* the function. otherwise set this bound to zero. */\n    parl = 0.;\n    if (rank==n) {\n        wa1 = qr.colsPermutation().inverse() *  diag.cwiseProduct(wa2)/dxnorm;\n        qr.matrixQR().topLeftCorner(n, n).transpose().template triangularView<Lower>().solveInPlace(wa1);\n        temp = wa1.blueNorm();\n        parl = fp / delta / temp / temp;\n    }\n\n    /* calculate an upper bound, paru, for the zero of the function. */\n    for (j = 0; j < n; ++j)\n        wa1[j] = qr.matrixQR().col(j).head(j+1).dot(qtb.head(j+1)) / diag[qr.colsPermutation().indices()(j)];\n\n    gnorm = wa1.stableNorm();\n    paru = gnorm / delta;\n    if (paru == 0.)\n        paru = dwarf / (std::min)(delta,Scalar(0.1));\n\n    /* if the input par lies outside of the interval (parl,paru), */\n    /* set par to the closer endpoint. */\n    par = (std::max)(par,parl);\n    par = (std::min)(par,paru);\n    if (par == 0.)\n        par = gnorm / dxnorm;\n\n    /* beginning of an iteration. */\n    Matrix< Scalar, Dynamic, Dynamic > s = qr.matrixQR();\n    while (true) {\n        ++iter;\n\n        /* evaluate the function at the current value of par. */\n        if (par == 0.)\n            par = (std::max)(dwarf,Scalar(.001) * paru); /* Computing MAX */\n        wa1 = sqrt(par)* diag;\n\n        Matrix< Scalar, Dynamic, 1 > sdiag(n);\n        qrsolv<Scalar>(s, qr.colsPermutation().indices(), wa1, qtb, x, sdiag);\n\n        wa2 = diag.cwiseProduct(x);\n        dxnorm = wa2.blueNorm();\n        temp = fp;\n        fp = dxnorm - delta;\n\n        /* if the function is small enough, accept the current value */\n        /* of par. also test for the exceptional cases where parl */\n        /* is zero or the number of iterations has reached 10. */\n        if (abs(fp) <= Scalar(0.1) * delta || (parl == 0. && fp <= temp && temp < 0.) || iter == 10)\n            break;\n\n        /* compute the newton correction. */\n        wa1 = qr.colsPermutation().inverse() * diag.cwiseProduct(wa2/dxnorm);\n        // we could almost use this here, but the diagonal is outside qr, in sdiag[]\n        // qr.matrixQR().topLeftCorner(n, n).transpose().template triangularView<Lower>().solveInPlace(wa1);\n        for (j = 0; j < n; ++j) {\n            wa1[j] /= sdiag[j];\n            temp = wa1[j];\n            for (Index i = j+1; i < n; ++i)\n                wa1[i] -= s(i,j) * temp;\n        }\n        temp = wa1.blueNorm();\n        parc = fp / delta / temp / temp;\n\n        /* depending on the sign of the function, update parl or paru. */\n        if (fp > 0.)\n            parl = (std::max)(parl,par);\n        if (fp < 0.)\n            paru = (std::min)(paru,par);\n\n        /* compute an improved estimate for par. */\n        par = (std::max)(parl,par+parc);\n    }\n    if (iter == 0)\n        par = 0.;\n    return;\n}\n\n} // end namespace internal\n\n} // end namespace Eigen\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/NonLinearOptimization/qrsolv.h",
    "content": "namespace Eigen { \n\nnamespace internal {\n\n// TODO : once qrsolv2 is removed, use ColPivHouseholderQR or PermutationMatrix instead of ipvt\ntemplate <typename Scalar>\nvoid qrsolv(\n        Matrix< Scalar, Dynamic, Dynamic > &s,\n        // TODO : use a PermutationMatrix once lmpar is no more:\n        const VectorXi &ipvt,\n        const Matrix< Scalar, Dynamic, 1 >  &diag,\n        const Matrix< Scalar, Dynamic, 1 >  &qtb,\n        Matrix< Scalar, Dynamic, 1 >  &x,\n        Matrix< Scalar, Dynamic, 1 >  &sdiag)\n\n{\n    typedef DenseIndex Index;\n\n    /* Local variables */\n    Index i, j, k, l;\n    Scalar temp;\n    Index n = s.cols();\n    Matrix< Scalar, Dynamic, 1 >  wa(n);\n    JacobiRotation<Scalar> givens;\n\n    /* Function Body */\n    // the following will only change the lower triangular part of s, including\n    // the diagonal, though the diagonal is restored afterward\n\n    /*     copy r and (q transpose)*b to preserve input and initialize s. */\n    /*     in particular, save the diagonal elements of r in x. */\n    x = s.diagonal();\n    wa = qtb;\n\n    s.topLeftCorner(n,n).template triangularView<StrictlyLower>() = s.topLeftCorner(n,n).transpose();\n\n    /*     eliminate the diagonal matrix d using a givens rotation. */\n    for (j = 0; j < n; ++j) {\n\n        /*        prepare the row of d to be eliminated, locating the */\n        /*        diagonal element using p from the qr factorization. */\n        l = ipvt[j];\n        if (diag[l] == 0.)\n            break;\n        sdiag.tail(n-j).setZero();\n        sdiag[j] = diag[l];\n\n        /*        the transformations to eliminate the row of d */\n        /*        modify only a single element of (q transpose)*b */\n        /*        beyond the first n, which is initially zero. */\n        Scalar qtbpj = 0.;\n        for (k = j; k < n; ++k) {\n            /*           determine a givens rotation which eliminates the */\n            /*           appropriate element in the current row of d. */\n            givens.makeGivens(-s(k,k), sdiag[k]);\n\n            /*           compute the modified diagonal element of r and */\n            /*           the modified element of ((q transpose)*b,0). */\n            s(k,k) = givens.c() * s(k,k) + givens.s() * sdiag[k];\n            temp = givens.c() * wa[k] + givens.s() * qtbpj;\n            qtbpj = -givens.s() * wa[k] + givens.c() * qtbpj;\n            wa[k] = temp;\n\n            /*           accumulate the tranformation in the row of s. */\n            for (i = k+1; i<n; ++i) {\n                temp = givens.c() * s(i,k) + givens.s() * sdiag[i];\n                sdiag[i] = -givens.s() * s(i,k) + givens.c() * sdiag[i];\n                s(i,k) = temp;\n            }\n        }\n    }\n\n    /*     solve the triangular system for z. if the system is */\n    /*     singular, then obtain a least squares solution. */\n    Index nsing;\n    for(nsing=0; nsing<n && sdiag[nsing]!=0; nsing++) {}\n\n    wa.tail(n-nsing).setZero();\n    s.topLeftCorner(nsing, nsing).transpose().template triangularView<Upper>().solveInPlace(wa.head(nsing));\n\n    // restore\n    sdiag = s.diagonal();\n    s.diagonal() = x;\n\n    /*     permute the components of z back to components of x. */\n    for (j = 0; j < n; ++j) x[ipvt[j]] = wa[j];\n}\n\n} // end namespace internal\n\n} // end namespace Eigen\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/NonLinearOptimization/r1mpyq.h",
    "content": "namespace Eigen { \n\nnamespace internal {\n\n// TODO : move this to GivensQR once there's such a thing in Eigen\n\ntemplate <typename Scalar>\nvoid r1mpyq(DenseIndex m, DenseIndex n, Scalar *a, const std::vector<JacobiRotation<Scalar> > &v_givens, const std::vector<JacobiRotation<Scalar> > &w_givens)\n{\n    typedef DenseIndex Index;\n\n    /*     apply the first set of givens rotations to a. */\n    for (Index j = n-2; j>=0; --j)\n        for (Index i = 0; i<m; ++i) {\n            Scalar temp = v_givens[j].c() * a[i+m*j] - v_givens[j].s() * a[i+m*(n-1)];\n            a[i+m*(n-1)] = v_givens[j].s() * a[i+m*j] + v_givens[j].c() * a[i+m*(n-1)];\n            a[i+m*j] = temp;\n        }\n    /*     apply the second set of givens rotations to a. */\n    for (Index j = 0; j<n-1; ++j)\n        for (Index i = 0; i<m; ++i) {\n            Scalar temp = w_givens[j].c() * a[i+m*j] + w_givens[j].s() * a[i+m*(n-1)];\n            a[i+m*(n-1)] = -w_givens[j].s() * a[i+m*j] + w_givens[j].c() * a[i+m*(n-1)];\n            a[i+m*j] = temp;\n        }\n}\n\n} // end namespace internal\n\n} // end namespace Eigen\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/NonLinearOptimization/r1updt.h",
    "content": "namespace Eigen { \n\nnamespace internal {\n\ntemplate <typename Scalar>\nvoid r1updt(\n        Matrix< Scalar, Dynamic, Dynamic > &s,\n        const Matrix< Scalar, Dynamic, 1> &u,\n        std::vector<JacobiRotation<Scalar> > &v_givens,\n        std::vector<JacobiRotation<Scalar> > &w_givens,\n        Matrix< Scalar, Dynamic, 1> &v,\n        Matrix< Scalar, Dynamic, 1> &w,\n        bool *sing)\n{\n    typedef DenseIndex Index;\n    const JacobiRotation<Scalar> IdentityRotation = JacobiRotation<Scalar>(1,0);\n\n    /* Local variables */\n    const Index m = s.rows();\n    const Index n = s.cols();\n    Index i, j=1;\n    Scalar temp;\n    JacobiRotation<Scalar> givens;\n\n    // r1updt had a broader usecase, but we dont use it here. And, more\n    // importantly, we can not test it.\n    eigen_assert(m==n);\n    eigen_assert(u.size()==m);\n    eigen_assert(v.size()==n);\n    eigen_assert(w.size()==n);\n\n    /* move the nontrivial part of the last column of s into w. */\n    w[n-1] = s(n-1,n-1);\n\n    /* rotate the vector v into a multiple of the n-th unit vector */\n    /* in such a way that a spike is introduced into w. */\n    for (j=n-2; j>=0; --j) {\n        w[j] = 0.;\n        if (v[j] != 0.) {\n            /* determine a givens rotation which eliminates the */\n            /* j-th element of v. */\n            givens.makeGivens(-v[n-1], v[j]);\n\n            /* apply the transformation to v and store the information */\n            /* necessary to recover the givens rotation. */\n            v[n-1] = givens.s() * v[j] + givens.c() * v[n-1];\n            v_givens[j] = givens;\n\n            /* apply the transformation to s and extend the spike in w. */\n            for (i = j; i < m; ++i) {\n                temp = givens.c() * s(j,i) - givens.s() * w[i];\n                w[i] = givens.s() * s(j,i) + givens.c() * w[i];\n                s(j,i) = temp;\n            }\n        } else\n            v_givens[j] = IdentityRotation;\n    }\n\n    /* add the spike from the rank 1 update to w. */\n    w += v[n-1] * u;\n\n    /* eliminate the spike. */\n    *sing = false;\n    for (j = 0; j < n-1; ++j) {\n        if (w[j] != 0.) {\n            /* determine a givens rotation which eliminates the */\n            /* j-th element of the spike. */\n            givens.makeGivens(-s(j,j), w[j]);\n\n            /* apply the transformation to s and reduce the spike in w. */\n            for (i = j; i < m; ++i) {\n                temp = givens.c() * s(j,i) + givens.s() * w[i];\n                w[i] = -givens.s() * s(j,i) + givens.c() * w[i];\n                s(j,i) = temp;\n            }\n\n            /* store the information necessary to recover the */\n            /* givens rotation. */\n            w_givens[j] = givens;\n        } else\n            v_givens[j] = IdentityRotation;\n\n        /* test for zero diagonal elements in the output s. */\n        if (s(j,j) == 0.) {\n            *sing = true;\n        }\n    }\n    /* move w back into the last column of the output s. */\n    s(n-1,n-1) = w[n-1];\n\n    if (s(j,j) == 0.) {\n        *sing = true;\n    }\n    return;\n}\n\n} // end namespace internal\n\n} // end namespace Eigen\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/NonLinearOptimization/rwupdt.h",
    "content": "namespace Eigen { \n\nnamespace internal {\n\ntemplate <typename Scalar>\nvoid rwupdt(\n        Matrix< Scalar, Dynamic, Dynamic >  &r,\n        const Matrix< Scalar, Dynamic, 1>  &w,\n        Matrix< Scalar, Dynamic, 1>  &b,\n        Scalar alpha)\n{\n    typedef DenseIndex Index;\n\n    const Index n = r.cols();\n    eigen_assert(r.rows()>=n);\n    std::vector<JacobiRotation<Scalar> > givens(n);\n\n    /* Local variables */\n    Scalar temp, rowj;\n\n    /* Function Body */\n    for (Index j = 0; j < n; ++j) {\n        rowj = w[j];\n\n        /* apply the previous transformations to */\n        /* r(i,j), i=0,1,...,j-1, and to w(j). */\n        for (Index i = 0; i < j; ++i) {\n            temp = givens[i].c() * r(i,j) + givens[i].s() * rowj;\n            rowj = -givens[i].s() * r(i,j) + givens[i].c() * rowj;\n            r(i,j) = temp;\n        }\n\n        /* determine a givens rotation which eliminates w(j). */\n        givens[j].makeGivens(-r(j,j), rowj);\n\n        if (rowj == 0.)\n            continue; // givens[j] is identity\n\n        /* apply the current transformation to r(j,j), b(j), and alpha. */\n        r(j,j) = givens[j].c() * r(j,j) + givens[j].s() * rowj;\n        temp = givens[j].c() * b[j] + givens[j].s() * alpha;\n        alpha = -givens[j].s() * b[j] + givens[j].c() * alpha;\n        b[j] = temp;\n    }\n}\n\n} // end namespace internal\n\n} // end namespace Eigen\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/NumericalDiff/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_NumericalDiff_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_NumericalDiff_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/unsupported/Eigen/src/NumericalDiff COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/NumericalDiff/NumericalDiff.h",
    "content": "// -*- coding: utf-8\n// vim: set fileencoding=utf-8\n\n// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Thomas Capricelli <orzel@freehackers.org>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_NUMERICAL_DIFF_H\n#define EIGEN_NUMERICAL_DIFF_H\n\nnamespace Eigen { \n\nenum NumericalDiffMode {\n    Forward,\n    Central\n};\n\n\n/**\n  * This class allows you to add a method df() to your functor, which will \n  * use numerical differentiation to compute an approximate of the\n  * derivative for the functor. Of course, if you have an analytical form\n  * for the derivative, you should rather implement df() by yourself.\n  *\n  * More information on\n  * http://en.wikipedia.org/wiki/Numerical_differentiation\n  *\n  * Currently only \"Forward\" and \"Central\" scheme are implemented.\n  */\ntemplate<typename _Functor, NumericalDiffMode mode=Forward>\nclass NumericalDiff : public _Functor\n{\npublic:\n    typedef _Functor Functor;\n    typedef typename Functor::Scalar Scalar;\n    typedef typename Functor::InputType InputType;\n    typedef typename Functor::ValueType ValueType;\n    typedef typename Functor::JacobianType JacobianType;\n\n    NumericalDiff(Scalar _epsfcn=0.) : Functor(), epsfcn(_epsfcn) {}\n    NumericalDiff(const Functor& f, Scalar _epsfcn=0.) : Functor(f), epsfcn(_epsfcn) {}\n\n    // forward constructors\n    template<typename T0>\n        NumericalDiff(const T0& a0) : Functor(a0), epsfcn(0) {}\n    template<typename T0, typename T1>\n        NumericalDiff(const T0& a0, const T1& a1) : Functor(a0, a1), epsfcn(0) {}\n    template<typename T0, typename T1, typename T2>\n        NumericalDiff(const T0& a0, const T1& a1, const T2& a2) : Functor(a0, a1, a2), epsfcn(0) {}\n\n    enum {\n        InputsAtCompileTime = Functor::InputsAtCompileTime,\n        ValuesAtCompileTime = Functor::ValuesAtCompileTime\n    };\n\n    /**\n      * return the number of evaluation of functor\n     */\n    int df(const InputType& _x, JacobianType &jac) const\n    {\n        using std::sqrt;\n        using std::abs;\n        /* Local variables */\n        Scalar h;\n        int nfev=0;\n        const typename InputType::Index n = _x.size();\n        const Scalar eps = sqrt(((std::max)(epsfcn,NumTraits<Scalar>::epsilon() )));\n        ValueType val1, val2;\n        InputType x = _x;\n        // TODO : we should do this only if the size is not already known\n        val1.resize(Functor::values());\n        val2.resize(Functor::values());\n\n        // initialization\n        switch(mode) {\n            case Forward:\n                // compute f(x)\n                Functor::operator()(x, val1); nfev++;\n                break;\n            case Central:\n                // do nothing\n                break;\n            default:\n                eigen_assert(false);\n        };\n\n        // Function Body\n        for (int j = 0; j < n; ++j) {\n            h = eps * abs(x[j]);\n            if (h == 0.) {\n                h = eps;\n            }\n            switch(mode) {\n                case Forward:\n                    x[j] += h;\n                    Functor::operator()(x, val2);\n                    nfev++;\n                    x[j] = _x[j];\n                    jac.col(j) = (val2-val1)/h;\n                    break;\n                case Central:\n                    x[j] += h;\n                    Functor::operator()(x, val2); nfev++;\n                    x[j] -= 2*h;\n                    Functor::operator()(x, val1); nfev++;\n                    x[j] = _x[j];\n                    jac.col(j) = (val2-val1)/(2*h);\n                    break;\n                default:\n                    eigen_assert(false);\n            };\n        }\n        return nfev;\n    }\nprivate:\n    Scalar epsfcn;\n\n    NumericalDiff& operator=(const NumericalDiff&);\n};\n\n} // end namespace Eigen\n\n//vim: ai ts=4 sts=4 et sw=4\n#endif // EIGEN_NUMERICAL_DIFF_H\n\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/Polynomials/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_Polynomials_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_Polynomials_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/unsupported/Eigen/src/Polynomials COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/Polynomials/Companion.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2010 Manuel Yguel <manuel.yguel@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_COMPANION_H\n#define EIGEN_COMPANION_H\n\n// This file requires the user to include\n// * Eigen/Core\n// * Eigen/src/PolynomialSolver.h\n\nnamespace Eigen { \n\nnamespace internal {\n\n#ifndef EIGEN_PARSED_BY_DOXYGEN\n\ntemplate <typename T>\nT radix(){ return 2; }\n\ntemplate <typename T>\nT radix2(){ return radix<T>()*radix<T>(); }\n\ntemplate<int Size>\nstruct decrement_if_fixed_size\n{\n  enum {\n    ret = (Size == Dynamic) ? Dynamic : Size-1 };\n};\n\n#endif\n\ntemplate< typename _Scalar, int _Deg >\nclass companion\n{\n  public:\n    EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_Deg==Dynamic ? Dynamic : _Deg)\n\n    enum {\n      Deg = _Deg,\n      Deg_1=decrement_if_fixed_size<Deg>::ret\n    };\n\n    typedef _Scalar                                Scalar;\n    typedef typename NumTraits<Scalar>::Real       RealScalar;\n    typedef Matrix<Scalar, Deg, 1>                 RightColumn;\n    //typedef DiagonalMatrix< Scalar, Deg_1, Deg_1 > BottomLeftDiagonal;\n    typedef Matrix<Scalar, Deg_1, 1>               BottomLeftDiagonal;\n\n    typedef Matrix<Scalar, Deg, Deg>               DenseCompanionMatrixType;\n    typedef Matrix< Scalar, _Deg, Deg_1 >          LeftBlock;\n    typedef Matrix< Scalar, Deg_1, Deg_1 >         BottomLeftBlock;\n    typedef Matrix< Scalar, 1, Deg_1 >             LeftBlockFirstRow;\n\n    typedef DenseIndex Index;\n\n  public:\n    EIGEN_STRONG_INLINE const _Scalar operator()(Index row, Index col ) const\n    {\n      if( m_bl_diag.rows() > col )\n      {\n        if( 0 < row ){ return m_bl_diag[col]; }\n        else{ return 0; }\n      }\n      else{ return m_monic[row]; }\n    }\n\n  public:\n    template<typename VectorType>\n    void setPolynomial( const VectorType& poly )\n    {\n      const Index deg = poly.size()-1;\n      m_monic = -1/poly[deg] * poly.head(deg);\n      //m_bl_diag.setIdentity( deg-1 );\n      m_bl_diag.setOnes(deg-1);\n    }\n\n    template<typename VectorType>\n    companion( const VectorType& poly ){\n      setPolynomial( poly ); }\n\n  public:\n    DenseCompanionMatrixType denseMatrix() const\n    {\n      const Index deg   = m_monic.size();\n      const Index deg_1 = deg-1;\n      DenseCompanionMatrixType companion(deg,deg);\n      companion <<\n        ( LeftBlock(deg,deg_1)\n          << LeftBlockFirstRow::Zero(1,deg_1),\n          BottomLeftBlock::Identity(deg-1,deg-1)*m_bl_diag.asDiagonal() ).finished()\n        , m_monic;\n      return companion;\n    }\n\n\n\n  protected:\n    /** Helper function for the balancing algorithm.\n     * \\returns true if the row and the column, having colNorm and rowNorm\n     * as norms, are balanced, false otherwise.\n     * colB and rowB are repectively the multipliers for\n     * the column and the row in order to balance them.\n     * */\n    bool balanced( Scalar colNorm, Scalar rowNorm,\n        bool& isBalanced, Scalar& colB, Scalar& rowB );\n\n    /** Helper function for the balancing algorithm.\n     * \\returns true if the row and the column, having colNorm and rowNorm\n     * as norms, are balanced, false otherwise.\n     * colB and rowB are repectively the multipliers for\n     * the column and the row in order to balance them.\n     * */\n    bool balancedR( Scalar colNorm, Scalar rowNorm,\n        bool& isBalanced, Scalar& colB, Scalar& rowB );\n\n  public:\n    /**\n     * Balancing algorithm from B. N. PARLETT and C. REINSCH (1969)\n     * \"Balancing a matrix for calculation of eigenvalues and eigenvectors\"\n     * adapted to the case of companion matrices.\n     * A matrix with non zero row and non zero column is balanced\n     * for a certain norm if the i-th row and the i-th column\n     * have same norm for all i.\n     */\n    void balance();\n\n  protected:\n      RightColumn                m_monic;\n      BottomLeftDiagonal         m_bl_diag;\n};\n\n\n\ntemplate< typename _Scalar, int _Deg >\ninline\nbool companion<_Scalar,_Deg>::balanced( Scalar colNorm, Scalar rowNorm,\n    bool& isBalanced, Scalar& colB, Scalar& rowB )\n{\n  if( Scalar(0) == colNorm || Scalar(0) == rowNorm ){ return true; }\n  else\n  {\n    //To find the balancing coefficients, if the radix is 2,\n    //one finds \\f$ \\sigma \\f$ such that\n    // \\f$ 2^{2\\sigma-1} < rowNorm / colNorm \\le 2^{2\\sigma+1} \\f$\n    // then the balancing coefficient for the row is \\f$ 1/2^{\\sigma} \\f$\n    // and the balancing coefficient for the column is \\f$ 2^{\\sigma} \\f$\n    rowB = rowNorm / radix<Scalar>();\n    colB = Scalar(1);\n    const Scalar s = colNorm + rowNorm;\n\n    while (colNorm < rowB)\n    {\n      colB *= radix<Scalar>();\n      colNorm *= radix2<Scalar>();\n    }\n\n    rowB = rowNorm * radix<Scalar>();\n\n    while (colNorm >= rowB)\n    {\n      colB /= radix<Scalar>();\n      colNorm /= radix2<Scalar>();\n    }\n\n    //This line is used to avoid insubstantial balancing\n    if ((rowNorm + colNorm) < Scalar(0.95) * s * colB)\n    {\n      isBalanced = false;\n      rowB = Scalar(1) / colB;\n      return false;\n    }\n    else{\n      return true; }\n  }\n}\n\ntemplate< typename _Scalar, int _Deg >\ninline\nbool companion<_Scalar,_Deg>::balancedR( Scalar colNorm, Scalar rowNorm,\n    bool& isBalanced, Scalar& colB, Scalar& rowB )\n{\n  if( Scalar(0) == colNorm || Scalar(0) == rowNorm ){ return true; }\n  else\n  {\n    /**\n     * Set the norm of the column and the row to the geometric mean\n     * of the row and column norm\n     */\n    const _Scalar q = colNorm/rowNorm;\n    if( !isApprox( q, _Scalar(1) ) )\n    {\n      rowB = sqrt( colNorm/rowNorm );\n      colB = Scalar(1)/rowB;\n\n      isBalanced = false;\n      return false;\n    }\n    else{\n      return true; }\n  }\n}\n\n\ntemplate< typename _Scalar, int _Deg >\nvoid companion<_Scalar,_Deg>::balance()\n{\n  using std::abs;\n  EIGEN_STATIC_ASSERT( Deg == Dynamic || 1 < Deg, YOU_MADE_A_PROGRAMMING_MISTAKE );\n  const Index deg   = m_monic.size();\n  const Index deg_1 = deg-1;\n\n  bool hasConverged=false;\n  while( !hasConverged )\n  {\n    hasConverged = true;\n    Scalar colNorm,rowNorm;\n    Scalar colB,rowB;\n\n    //First row, first column excluding the diagonal\n    //==============================================\n    colNorm = abs(m_bl_diag[0]);\n    rowNorm = abs(m_monic[0]);\n\n    //Compute balancing of the row and the column\n    if( !balanced( colNorm, rowNorm, hasConverged, colB, rowB ) )\n    {\n      m_bl_diag[0] *= colB;\n      m_monic[0] *= rowB;\n    }\n\n    //Middle rows and columns excluding the diagonal\n    //==============================================\n    for( Index i=1; i<deg_1; ++i )\n    {\n      // column norm, excluding the diagonal\n      colNorm = abs(m_bl_diag[i]);\n\n      // row norm, excluding the diagonal\n      rowNorm = abs(m_bl_diag[i-1]) + abs(m_monic[i]);\n\n      //Compute balancing of the row and the column\n      if( !balanced( colNorm, rowNorm, hasConverged, colB, rowB ) )\n      {\n        m_bl_diag[i]   *= colB;\n        m_bl_diag[i-1] *= rowB;\n        m_monic[i]     *= rowB;\n      }\n    }\n\n    //Last row, last column excluding the diagonal\n    //============================================\n    const Index ebl = m_bl_diag.size()-1;\n    VectorBlock<RightColumn,Deg_1> headMonic( m_monic, 0, deg_1 );\n    colNorm = headMonic.array().abs().sum();\n    rowNorm = abs( m_bl_diag[ebl] );\n\n    //Compute balancing of the row and the column\n    if( !balanced( colNorm, rowNorm, hasConverged, colB, rowB ) )\n    {\n      headMonic      *= colB;\n      m_bl_diag[ebl] *= rowB;\n    }\n  }\n}\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_COMPANION_H\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/Polynomials/PolynomialSolver.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2010 Manuel Yguel <manuel.yguel@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_POLYNOMIAL_SOLVER_H\n#define EIGEN_POLYNOMIAL_SOLVER_H\n\nnamespace Eigen { \n\n/** \\ingroup Polynomials_Module\n *  \\class PolynomialSolverBase.\n *\n * \\brief Defined to be inherited by polynomial solvers: it provides\n * convenient methods such as\n *  - real roots,\n *  - greatest, smallest complex roots,\n *  - real roots with greatest, smallest absolute real value,\n *  - greatest, smallest real roots.\n *\n * It stores the set of roots as a vector of complexes.\n *\n */\ntemplate< typename _Scalar, int _Deg >\nclass PolynomialSolverBase\n{\n  public:\n    EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_Deg==Dynamic ? Dynamic : _Deg)\n\n    typedef _Scalar                             Scalar;\n    typedef typename NumTraits<Scalar>::Real    RealScalar;\n    typedef std::complex<RealScalar>            RootType;\n    typedef Matrix<RootType,_Deg,1>             RootsType;\n\n    typedef DenseIndex Index;\n\n  protected:\n    template< typename OtherPolynomial >\n    inline void setPolynomial( const OtherPolynomial& poly ){\n      m_roots.resize(poly.size()); }\n\n  public:\n    template< typename OtherPolynomial >\n    inline PolynomialSolverBase( const OtherPolynomial& poly ){\n      setPolynomial( poly() ); }\n\n    inline PolynomialSolverBase(){}\n\n  public:\n    /** \\returns the complex roots of the polynomial */\n    inline const RootsType& roots() const { return m_roots; }\n\n  public:\n    /** Clear and fills the back insertion sequence with the real roots of the polynomial\n     * i.e. the real part of the complex roots that have an imaginary part which\n     * absolute value is smaller than absImaginaryThreshold.\n     * absImaginaryThreshold takes the dummy_precision associated\n     * with the _Scalar template parameter of the PolynomialSolver class as the default value.\n     *\n     * \\param[out] bi_seq : the back insertion sequence (stl concept)\n     * \\param[in]  absImaginaryThreshold : the maximum bound of the imaginary part of a complex\n     *  number that is considered as real.\n     * */\n    template<typename Stl_back_insertion_sequence>\n    inline void realRoots( Stl_back_insertion_sequence& bi_seq,\n        const RealScalar& absImaginaryThreshold = NumTraits<Scalar>::dummy_precision() ) const\n    {\n      using std::abs;\n      bi_seq.clear();\n      for(Index i=0; i<m_roots.size(); ++i )\n      {\n        if( abs( m_roots[i].imag() ) < absImaginaryThreshold ){\n          bi_seq.push_back( m_roots[i].real() ); }\n      }\n    }\n\n  protected:\n    template<typename squaredNormBinaryPredicate>\n    inline const RootType& selectComplexRoot_withRespectToNorm( squaredNormBinaryPredicate& pred ) const\n    {\n      Index res=0;\n      RealScalar norm2 = numext::abs2( m_roots[0] );\n      for( Index i=1; i<m_roots.size(); ++i )\n      {\n        const RealScalar currNorm2 = numext::abs2( m_roots[i] );\n        if( pred( currNorm2, norm2 ) ){\n          res=i; norm2=currNorm2; }\n      }\n      return m_roots[res];\n    }\n\n  public:\n    /**\n     * \\returns the complex root with greatest norm.\n     */\n    inline const RootType& greatestRoot() const\n    {\n      std::greater<Scalar> greater;\n      return selectComplexRoot_withRespectToNorm( greater );\n    }\n\n    /**\n     * \\returns the complex root with smallest norm.\n     */\n    inline const RootType& smallestRoot() const\n    {\n      std::less<Scalar> less;\n      return selectComplexRoot_withRespectToNorm( less );\n    }\n\n  protected:\n    template<typename squaredRealPartBinaryPredicate>\n    inline const RealScalar& selectRealRoot_withRespectToAbsRealPart(\n        squaredRealPartBinaryPredicate& pred,\n        bool& hasArealRoot,\n        const RealScalar& absImaginaryThreshold = NumTraits<Scalar>::dummy_precision() ) const\n    {\n      using std::abs;\n      hasArealRoot = false;\n      Index res=0;\n      RealScalar abs2(0);\n\n      for( Index i=0; i<m_roots.size(); ++i )\n      {\n        if( abs( m_roots[i].imag() ) < absImaginaryThreshold )\n        {\n          if( !hasArealRoot )\n          {\n            hasArealRoot = true;\n            res = i;\n            abs2 = m_roots[i].real() * m_roots[i].real();\n          }\n          else\n          {\n            const RealScalar currAbs2 = m_roots[i].real() * m_roots[i].real();\n            if( pred( currAbs2, abs2 ) )\n            {\n              abs2 = currAbs2;\n              res = i;\n            }\n          }\n        }\n        else\n        {\n          if( abs( m_roots[i].imag() ) < abs( m_roots[res].imag() ) ){\n            res = i; }\n        }\n      }\n      return numext::real_ref(m_roots[res]);\n    }\n\n\n    template<typename RealPartBinaryPredicate>\n    inline const RealScalar& selectRealRoot_withRespectToRealPart(\n        RealPartBinaryPredicate& pred,\n        bool& hasArealRoot,\n        const RealScalar& absImaginaryThreshold = NumTraits<Scalar>::dummy_precision() ) const\n    {\n      using std::abs;\n      hasArealRoot = false;\n      Index res=0;\n      RealScalar val(0);\n\n      for( Index i=0; i<m_roots.size(); ++i )\n      {\n        if( abs( m_roots[i].imag() ) < absImaginaryThreshold )\n        {\n          if( !hasArealRoot )\n          {\n            hasArealRoot = true;\n            res = i;\n            val = m_roots[i].real();\n          }\n          else\n          {\n            const RealScalar curr = m_roots[i].real();\n            if( pred( curr, val ) )\n            {\n              val = curr;\n              res = i;\n            }\n          }\n        }\n        else\n        {\n          if( abs( m_roots[i].imag() ) < abs( m_roots[res].imag() ) ){\n            res = i; }\n        }\n      }\n      return numext::real_ref(m_roots[res]);\n    }\n\n  public:\n    /**\n     * \\returns a real root with greatest absolute magnitude.\n     * A real root is defined as the real part of a complex root with absolute imaginary\n     * part smallest than absImaginaryThreshold.\n     * absImaginaryThreshold takes the dummy_precision associated\n     * with the _Scalar template parameter of the PolynomialSolver class as the default value.\n     * If no real root is found the boolean hasArealRoot is set to false and the real part of\n     * the root with smallest absolute imaginary part is returned instead.\n     *\n     * \\param[out] hasArealRoot : boolean true if a real root is found according to the\n     *  absImaginaryThreshold criterion, false otherwise.\n     * \\param[in] absImaginaryThreshold : threshold on the absolute imaginary part to decide\n     *  whether or not a root is real.\n     */\n    inline const RealScalar& absGreatestRealRoot(\n        bool& hasArealRoot,\n        const RealScalar& absImaginaryThreshold = NumTraits<Scalar>::dummy_precision() ) const\n    {\n      std::greater<Scalar> greater;\n      return selectRealRoot_withRespectToAbsRealPart( greater, hasArealRoot, absImaginaryThreshold );\n    }\n\n\n    /**\n     * \\returns a real root with smallest absolute magnitude.\n     * A real root is defined as the real part of a complex root with absolute imaginary\n     * part smallest than absImaginaryThreshold.\n     * absImaginaryThreshold takes the dummy_precision associated\n     * with the _Scalar template parameter of the PolynomialSolver class as the default value.\n     * If no real root is found the boolean hasArealRoot is set to false and the real part of\n     * the root with smallest absolute imaginary part is returned instead.\n     *\n     * \\param[out] hasArealRoot : boolean true if a real root is found according to the\n     *  absImaginaryThreshold criterion, false otherwise.\n     * \\param[in] absImaginaryThreshold : threshold on the absolute imaginary part to decide\n     *  whether or not a root is real.\n     */\n    inline const RealScalar& absSmallestRealRoot(\n        bool& hasArealRoot,\n        const RealScalar& absImaginaryThreshold = NumTraits<Scalar>::dummy_precision() ) const\n    {\n      std::less<Scalar> less;\n      return selectRealRoot_withRespectToAbsRealPart( less, hasArealRoot, absImaginaryThreshold );\n    }\n\n\n    /**\n     * \\returns the real root with greatest value.\n     * A real root is defined as the real part of a complex root with absolute imaginary\n     * part smallest than absImaginaryThreshold.\n     * absImaginaryThreshold takes the dummy_precision associated\n     * with the _Scalar template parameter of the PolynomialSolver class as the default value.\n     * If no real root is found the boolean hasArealRoot is set to false and the real part of\n     * the root with smallest absolute imaginary part is returned instead.\n     *\n     * \\param[out] hasArealRoot : boolean true if a real root is found according to the\n     *  absImaginaryThreshold criterion, false otherwise.\n     * \\param[in] absImaginaryThreshold : threshold on the absolute imaginary part to decide\n     *  whether or not a root is real.\n     */\n    inline const RealScalar& greatestRealRoot(\n        bool& hasArealRoot,\n        const RealScalar& absImaginaryThreshold = NumTraits<Scalar>::dummy_precision() ) const\n    {\n      std::greater<Scalar> greater;\n      return selectRealRoot_withRespectToRealPart( greater, hasArealRoot, absImaginaryThreshold );\n    }\n\n\n    /**\n     * \\returns the real root with smallest value.\n     * A real root is defined as the real part of a complex root with absolute imaginary\n     * part smallest than absImaginaryThreshold.\n     * absImaginaryThreshold takes the dummy_precision associated\n     * with the _Scalar template parameter of the PolynomialSolver class as the default value.\n     * If no real root is found the boolean hasArealRoot is set to false and the real part of\n     * the root with smallest absolute imaginary part is returned instead.\n     *\n     * \\param[out] hasArealRoot : boolean true if a real root is found according to the\n     *  absImaginaryThreshold criterion, false otherwise.\n     * \\param[in] absImaginaryThreshold : threshold on the absolute imaginary part to decide\n     *  whether or not a root is real.\n     */\n    inline const RealScalar& smallestRealRoot(\n        bool& hasArealRoot,\n        const RealScalar& absImaginaryThreshold = NumTraits<Scalar>::dummy_precision() ) const\n    {\n      std::less<Scalar> less;\n      return selectRealRoot_withRespectToRealPart( less, hasArealRoot, absImaginaryThreshold );\n    }\n\n  protected:\n    RootsType               m_roots;\n};\n\n#define EIGEN_POLYNOMIAL_SOLVER_BASE_INHERITED_TYPES( BASE )  \\\n  typedef typename BASE::Scalar                 Scalar;       \\\n  typedef typename BASE::RealScalar             RealScalar;   \\\n  typedef typename BASE::RootType               RootType;     \\\n  typedef typename BASE::RootsType              RootsType;\n\n\n\n/** \\ingroup Polynomials_Module\n  *\n  * \\class PolynomialSolver\n  *\n  * \\brief A polynomial solver\n  *\n  * Computes the complex roots of a real polynomial.\n  *\n  * \\param _Scalar the scalar type, i.e., the type of the polynomial coefficients\n  * \\param _Deg the degree of the polynomial, can be a compile time value or Dynamic.\n  *             Notice that the number of polynomial coefficients is _Deg+1.\n  *\n  * This class implements a polynomial solver and provides convenient methods such as\n  * - real roots,\n  * - greatest, smallest complex roots,\n  * - real roots with greatest, smallest absolute real value.\n  * - greatest, smallest real roots.\n  *\n  * WARNING: this polynomial solver is experimental, part of the unsuported Eigen modules.\n  *\n  *\n  * Currently a QR algorithm is used to compute the eigenvalues of the companion matrix of\n  * the polynomial to compute its roots.\n  * This supposes that the complex moduli of the roots are all distinct: e.g. there should\n  * be no multiple roots or conjugate roots for instance.\n  * With 32bit (float) floating types this problem shows up frequently.\n  * However, almost always, correct accuracy is reached even in these cases for 64bit\n  * (double) floating types and small polynomial degree (<20).\n  */\ntemplate< typename _Scalar, int _Deg >\nclass PolynomialSolver : public PolynomialSolverBase<_Scalar,_Deg>\n{\n  public:\n    EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_Deg==Dynamic ? Dynamic : _Deg)\n\n    typedef PolynomialSolverBase<_Scalar,_Deg>    PS_Base;\n    EIGEN_POLYNOMIAL_SOLVER_BASE_INHERITED_TYPES( PS_Base )\n\n    typedef Matrix<Scalar,_Deg,_Deg>                 CompanionMatrixType;\n    typedef EigenSolver<CompanionMatrixType>         EigenSolverType;\n\n  public:\n    /** Computes the complex roots of a new polynomial. */\n    template< typename OtherPolynomial >\n    void compute( const OtherPolynomial& poly )\n    {\n      eigen_assert( Scalar(0) != poly[poly.size()-1] );\n      internal::companion<Scalar,_Deg> companion( poly );\n      companion.balance();\n      m_eigenSolver.compute( companion.denseMatrix() );\n      m_roots = m_eigenSolver.eigenvalues();\n    }\n\n  public:\n    template< typename OtherPolynomial >\n    inline PolynomialSolver( const OtherPolynomial& poly ){\n      compute( poly ); }\n\n    inline PolynomialSolver(){}\n\n  protected:\n    using                   PS_Base::m_roots;\n    EigenSolverType         m_eigenSolver;\n};\n\n\ntemplate< typename _Scalar >\nclass PolynomialSolver<_Scalar,1> : public PolynomialSolverBase<_Scalar,1>\n{\n  public:\n    typedef PolynomialSolverBase<_Scalar,1>    PS_Base;\n    EIGEN_POLYNOMIAL_SOLVER_BASE_INHERITED_TYPES( PS_Base )\n\n  public:\n    /** Computes the complex roots of a new polynomial. */\n    template< typename OtherPolynomial >\n    void compute( const OtherPolynomial& poly )\n    {\n      eigen_assert( Scalar(0) != poly[poly.size()-1] );\n      m_roots[0] = -poly[0]/poly[poly.size()-1];\n    }\n\n  protected:\n    using                   PS_Base::m_roots;\n};\n\n} // end namespace Eigen\n\n#endif // EIGEN_POLYNOMIAL_SOLVER_H\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/Polynomials/PolynomialUtils.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2010 Manuel Yguel <manuel.yguel@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_POLYNOMIAL_UTILS_H\n#define EIGEN_POLYNOMIAL_UTILS_H\n\nnamespace Eigen { \n\n/** \\ingroup Polynomials_Module\n * \\returns the evaluation of the polynomial at x using Horner algorithm.\n *\n * \\param[in] poly : the vector of coefficients of the polynomial ordered\n *  by degrees i.e. poly[i] is the coefficient of degree i of the polynomial\n *  e.g. \\f$ 1 + 3x^2 \\f$ is stored as a vector \\f$ [ 1, 0, 3 ] \\f$.\n * \\param[in] x : the value to evaluate the polynomial at.\n *\n * <i><b>Note for stability:</b></i>\n *  <dd> \\f$ |x| \\le 1 \\f$ </dd>\n */\ntemplate <typename Polynomials, typename T>\ninline\nT poly_eval_horner( const Polynomials& poly, const T& x )\n{\n  T val=poly[poly.size()-1];\n  for(DenseIndex i=poly.size()-2; i>=0; --i ){\n    val = val*x + poly[i]; }\n  return val;\n}\n\n/** \\ingroup Polynomials_Module\n * \\returns the evaluation of the polynomial at x using stabilized Horner algorithm.\n *\n * \\param[in] poly : the vector of coefficients of the polynomial ordered\n *  by degrees i.e. poly[i] is the coefficient of degree i of the polynomial\n *  e.g. \\f$ 1 + 3x^2 \\f$ is stored as a vector \\f$ [ 1, 0, 3 ] \\f$.\n * \\param[in] x : the value to evaluate the polynomial at.\n */\ntemplate <typename Polynomials, typename T>\ninline\nT poly_eval( const Polynomials& poly, const T& x )\n{\n  typedef typename NumTraits<T>::Real Real;\n\n  if( numext::abs2( x ) <= Real(1) ){\n    return poly_eval_horner( poly, x ); }\n  else\n  {\n    T val=poly[0];\n    T inv_x = T(1)/x;\n    for( DenseIndex i=1; i<poly.size(); ++i ){\n      val = val*inv_x + poly[i]; }\n\n    return std::pow(x,(T)(poly.size()-1)) * val;\n  }\n}\n\n/** \\ingroup Polynomials_Module\n * \\returns a maximum bound for the absolute value of any root of the polynomial.\n *\n * \\param[in] poly : the vector of coefficients of the polynomial ordered\n *  by degrees i.e. poly[i] is the coefficient of degree i of the polynomial\n *  e.g. \\f$ 1 + 3x^2 \\f$ is stored as a vector \\f$ [ 1, 0, 3 ] \\f$.\n *\n *  <i><b>Precondition:</b></i>\n *  <dd> the leading coefficient of the input polynomial poly must be non zero </dd>\n */\ntemplate <typename Polynomial>\ninline\ntypename NumTraits<typename Polynomial::Scalar>::Real cauchy_max_bound( const Polynomial& poly )\n{\n  using std::abs;\n  typedef typename Polynomial::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real Real;\n\n  eigen_assert( Scalar(0) != poly[poly.size()-1] );\n  const Scalar inv_leading_coeff = Scalar(1)/poly[poly.size()-1];\n  Real cb(0);\n\n  for( DenseIndex i=0; i<poly.size()-1; ++i ){\n    cb += abs(poly[i]*inv_leading_coeff); }\n  return cb + Real(1);\n}\n\n/** \\ingroup Polynomials_Module\n * \\returns a minimum bound for the absolute value of any non zero root of the polynomial.\n * \\param[in] poly : the vector of coefficients of the polynomial ordered\n *  by degrees i.e. poly[i] is the coefficient of degree i of the polynomial\n *  e.g. \\f$ 1 + 3x^2 \\f$ is stored as a vector \\f$ [ 1, 0, 3 ] \\f$.\n */\ntemplate <typename Polynomial>\ninline\ntypename NumTraits<typename Polynomial::Scalar>::Real cauchy_min_bound( const Polynomial& poly )\n{\n  using std::abs;\n  typedef typename Polynomial::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real Real;\n\n  DenseIndex i=0;\n  while( i<poly.size()-1 && Scalar(0) == poly(i) ){ ++i; }\n  if( poly.size()-1 == i ){\n    return Real(1); }\n\n  const Scalar inv_min_coeff = Scalar(1)/poly[i];\n  Real cb(1);\n  for( DenseIndex j=i+1; j<poly.size(); ++j ){\n    cb += abs(poly[j]*inv_min_coeff); }\n  return Real(1)/cb;\n}\n\n/** \\ingroup Polynomials_Module\n * Given the roots of a polynomial compute the coefficients in the\n * monomial basis of the monic polynomial with same roots and minimal degree.\n * If RootVector is a vector of complexes, Polynomial should also be a vector\n * of complexes.\n * \\param[in] rv : a vector containing the roots of a polynomial.\n * \\param[out] poly : the vector of coefficients of the polynomial ordered\n *  by degrees i.e. poly[i] is the coefficient of degree i of the polynomial\n *  e.g. \\f$ 3 + x^2 \\f$ is stored as a vector \\f$ [ 3, 0, 1 ] \\f$.\n */\ntemplate <typename RootVector, typename Polynomial>\nvoid roots_to_monicPolynomial( const RootVector& rv, Polynomial& poly )\n{\n\n  typedef typename Polynomial::Scalar Scalar;\n\n  poly.setZero( rv.size()+1 );\n  poly[0] = -rv[0]; poly[1] = Scalar(1);\n  for( DenseIndex i=1; i< rv.size(); ++i )\n  {\n    for( DenseIndex j=i+1; j>0; --j ){ poly[j] = poly[j-1] - rv[i]*poly[j]; }\n    poly[0] = -rv[i]*poly[0];\n  }\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_POLYNOMIAL_UTILS_H\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/SVD/BDCSVD.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n// \n// We used the \"A Divide-And-Conquer Algorithm for the Bidiagonal SVD\"\n// research report written by Ming Gu and Stanley C.Eisenstat\n// The code variable names correspond to the names they used in their \n// report\n//\n// Copyright (C) 2013 Gauthier Brun <brun.gauthier@gmail.com>\n// Copyright (C) 2013 Nicolas Carre <nicolas.carre@ensimag.fr>\n// Copyright (C) 2013 Jean Ceccato <jean.ceccato@ensimag.fr>\n// Copyright (C) 2013 Pierre Zoppitelli <pierre.zoppitelli@ensimag.fr>\n//\n// Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_BDCSVD_H\n#define EIGEN_BDCSVD_H\n\n#define EPSILON 0.0000000000000001\n\n#define ALGOSWAP 32\n\nnamespace Eigen {\n/** \\ingroup SVD_Module\n *\n *\n * \\class BDCSVD\n *\n * \\brief class Bidiagonal Divide and Conquer SVD\n *\n * \\param MatrixType the type of the matrix of which we are computing the SVD decomposition\n * We plan to have a very similar interface to JacobiSVD on this class.\n * It should be used to speed up the calcul of SVD for big matrices. \n */\ntemplate<typename _MatrixType> \nclass BDCSVD : public SVDBase<_MatrixType>\n{\n  typedef SVDBase<_MatrixType> Base;\n    \npublic:\n  using Base::rows;\n  using Base::cols;\n  \n  typedef _MatrixType MatrixType;\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename NumTraits<typename MatrixType::Scalar>::Real RealScalar;\n  typedef typename MatrixType::Index Index;\n  enum {\n    RowsAtCompileTime = MatrixType::RowsAtCompileTime, \n    ColsAtCompileTime = MatrixType::ColsAtCompileTime, \n    DiagSizeAtCompileTime = EIGEN_SIZE_MIN_PREFER_DYNAMIC(RowsAtCompileTime, ColsAtCompileTime), \n    MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime, \n    MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime, \n    MaxDiagSizeAtCompileTime = EIGEN_SIZE_MIN_PREFER_FIXED(MaxRowsAtCompileTime, MaxColsAtCompileTime), \n    MatrixOptions = MatrixType::Options\n  };\n\n  typedef Matrix<Scalar, RowsAtCompileTime, RowsAtCompileTime, \n\t\t MatrixOptions, MaxRowsAtCompileTime, MaxRowsAtCompileTime>\n  MatrixUType;\n  typedef Matrix<Scalar, ColsAtCompileTime, ColsAtCompileTime, \n\t\t MatrixOptions, MaxColsAtCompileTime, MaxColsAtCompileTime>\n  MatrixVType;\n  typedef typename internal::plain_diag_type<MatrixType, RealScalar>::type SingularValuesType;\n  typedef typename internal::plain_row_type<MatrixType>::type RowType;\n  typedef typename internal::plain_col_type<MatrixType>::type ColType;\n  typedef Matrix<Scalar, Dynamic, Dynamic> MatrixX;\n  typedef Matrix<RealScalar, Dynamic, Dynamic> MatrixXr;\n  typedef Matrix<RealScalar, Dynamic, 1> VectorType;\n\n  /** \\brief Default Constructor.\n   *\n   * The default constructor is useful in cases in which the user intends to\n   * perform decompositions via BDCSVD::compute(const MatrixType&).\n   */\n  BDCSVD()\n    : SVDBase<_MatrixType>::SVDBase(), \n      algoswap(ALGOSWAP)\n  {}\n\n\n  /** \\brief Default Constructor with memory preallocation\n   *\n   * Like the default constructor but with preallocation of the internal data\n   * according to the specified problem size.\n   * \\sa BDCSVD()\n   */\n  BDCSVD(Index rows, Index cols, unsigned int computationOptions = 0)\n    : SVDBase<_MatrixType>::SVDBase(), \n      algoswap(ALGOSWAP)\n  {\n    allocate(rows, cols, computationOptions);\n  }\n\n  /** \\brief Constructor performing the decomposition of given matrix.\n   *\n   * \\param matrix the matrix to decompose\n   * \\param computationOptions optional parameter allowing to specify if you want full or thin U or V unitaries to be computed.\n   *                           By default, none is computed. This is a bit - field, the possible bits are #ComputeFullU, #ComputeThinU, \n   *                           #ComputeFullV, #ComputeThinV.\n   *\n   * Thin unitaries are only available if your matrix type has a Dynamic number of columns (for example MatrixXf). They also are not\n   * available with the (non - default) FullPivHouseholderQR preconditioner.\n   */\n  BDCSVD(const MatrixType& matrix, unsigned int computationOptions = 0)\n    : SVDBase<_MatrixType>::SVDBase(), \n      algoswap(ALGOSWAP)\n  {\n    compute(matrix, computationOptions);\n  }\n\n  ~BDCSVD() \n  {\n  }\n  /** \\brief Method performing the decomposition of given matrix using custom options.\n   *\n   * \\param matrix the matrix to decompose\n   * \\param computationOptions optional parameter allowing to specify if you want full or thin U or V unitaries to be computed.\n   *                           By default, none is computed. This is a bit - field, the possible bits are #ComputeFullU, #ComputeThinU, \n   *                           #ComputeFullV, #ComputeThinV.\n   *\n   * Thin unitaries are only available if your matrix type has a Dynamic number of columns (for example MatrixXf). They also are not\n   * available with the (non - default) FullPivHouseholderQR preconditioner.\n   */\n  SVDBase<MatrixType>& compute(const MatrixType& matrix, unsigned int computationOptions);\n\n  /** \\brief Method performing the decomposition of given matrix using current options.\n   *\n   * \\param matrix the matrix to decompose\n   *\n   * This method uses the current \\a computationOptions, as already passed to the constructor or to compute(const MatrixType&, unsigned int).\n   */\n  SVDBase<MatrixType>& compute(const MatrixType& matrix)\n  {\n    return compute(matrix, this->m_computationOptions);\n  }\n\n  void setSwitchSize(int s) \n  {\n    eigen_assert(s>3 && \"BDCSVD the size of the algo switch has to be greater than 4\");\n    algoswap = s;\n  }\n\n\n  /** \\returns a (least squares) solution of \\f$ A x = b \\f$ using the current SVD decomposition of A.\n   *\n   * \\param b the right - hand - side of the equation to solve.\n   *\n   * \\note Solving requires both U and V to be computed. Thin U and V are enough, there is no need for full U or V.\n   *\n   * \\note SVD solving is implicitly least - squares. Thus, this method serves both purposes of exact solving and least - squares solving.\n   * In other words, the returned solution is guaranteed to minimize the Euclidean norm \\f$ \\Vert A x - b \\Vert \\f$.\n   */\n  template<typename Rhs>\n  inline const internal::solve_retval<BDCSVD, Rhs>\n  solve(const MatrixBase<Rhs>& b) const\n  {\n    eigen_assert(this->m_isInitialized && \"BDCSVD is not initialized.\");\n    eigen_assert(SVDBase<_MatrixType>::computeU() && SVDBase<_MatrixType>::computeV() && \n\t\t \"BDCSVD::solve() requires both unitaries U and V to be computed (thin unitaries suffice).\");\n    return internal::solve_retval<BDCSVD, Rhs>(*this, b.derived());\n  }\n\n \n  const MatrixUType& matrixU() const\n  {\n    eigen_assert(this->m_isInitialized && \"SVD is not initialized.\");\n    if (isTranspose){\n      eigen_assert(this->computeV() && \"This SVD decomposition didn't compute U. Did you ask for it?\");\n      return this->m_matrixV;\n    }\n    else \n    {\n      eigen_assert(this->computeU() && \"This SVD decomposition didn't compute U. Did you ask for it?\");\n      return this->m_matrixU;\n    }\n     \n  }\n\n\n  const MatrixVType& matrixV() const\n  {\n    eigen_assert(this->m_isInitialized && \"SVD is not initialized.\");\n    if (isTranspose){\n      eigen_assert(this->computeU() && \"This SVD decomposition didn't compute V. Did you ask for it?\");\n      return this->m_matrixU;\n    }\n    else\n    {\n      eigen_assert(this->computeV() && \"This SVD decomposition didn't compute V. Did you ask for it?\");\n      return this->m_matrixV;\n    }\n  }\n \nprivate:\n  void allocate(Index rows, Index cols, unsigned int computationOptions);\n  void divide (Index firstCol, Index lastCol, Index firstRowW, \n\t       Index firstColW, Index shift);\n  void deflation43(Index firstCol, Index shift, Index i, Index size);\n  void deflation44(Index firstColu , Index firstColm, Index firstRowW, Index firstColW, Index i, Index j, Index size);\n  void deflation(Index firstCol, Index lastCol, Index k, Index firstRowW, Index firstColW, Index shift);\n  void copyUV(MatrixXr naiveU, MatrixXr naiveV, MatrixX householderU, MatrixX houseHolderV);\n\nprotected:\n  MatrixXr m_naiveU, m_naiveV;\n  MatrixXr m_computed;\n  Index nRec;\n  int algoswap;\n  bool isTranspose, compU, compV;\n  \n}; //end class BDCSVD\n\n\n// Methode to allocate ans initialize matrix and attributs\ntemplate<typename MatrixType>\nvoid BDCSVD<MatrixType>::allocate(Index rows, Index cols, unsigned int computationOptions)\n{\n  isTranspose = (cols > rows);\n  if (SVDBase<MatrixType>::allocate(rows, cols, computationOptions)) return;\n  m_computed = MatrixXr::Zero(this->m_diagSize + 1, this->m_diagSize );\n  if (isTranspose){\n    compU = this->computeU();\n    compV = this->computeV();    \n  } \n  else\n  {\n    compV = this->computeU();\n    compU = this->computeV();   \n  }\n  if (compU) m_naiveU = MatrixXr::Zero(this->m_diagSize + 1, this->m_diagSize + 1 );\n  else m_naiveU = MatrixXr::Zero(2, this->m_diagSize + 1 );\n  \n  if (compV) m_naiveV = MatrixXr::Zero(this->m_diagSize, this->m_diagSize);\n  \n\n  //should be changed for a cleaner implementation\n  if (isTranspose){\n    bool aux;\n    if (this->computeU()||this->computeV()){\n      aux = this->m_computeFullU;\n      this->m_computeFullU = this->m_computeFullV;\n      this->m_computeFullV = aux;\n      aux = this->m_computeThinU;\n      this->m_computeThinU = this->m_computeThinV;\n      this->m_computeThinV = aux;\n    } \n  }\n}// end allocate\n\n// Methode which compute the BDCSVD for the int\ntemplate<>\nSVDBase<Matrix<int, Dynamic, Dynamic> >&\nBDCSVD<Matrix<int, Dynamic, Dynamic> >::compute(const MatrixType& matrix, unsigned int computationOptions) {\n  allocate(matrix.rows(), matrix.cols(), computationOptions);\n  this->m_nonzeroSingularValues = 0;\n  m_computed = Matrix<int, Dynamic, Dynamic>::Zero(rows(), cols());\n  for (int i=0; i<this->m_diagSize; i++)   {\n    this->m_singularValues.coeffRef(i) = 0;\n  }\n  if (this->m_computeFullU) this->m_matrixU = Matrix<int, Dynamic, Dynamic>::Zero(rows(), rows());\n  if (this->m_computeFullV) this->m_matrixV = Matrix<int, Dynamic, Dynamic>::Zero(cols(), cols()); \n  this->m_isInitialized = true;\n  return *this;\n}\n\n\n// Methode which compute the BDCSVD\ntemplate<typename MatrixType>\nSVDBase<MatrixType>&\nBDCSVD<MatrixType>::compute(const MatrixType& matrix, unsigned int computationOptions) \n{\n  allocate(matrix.rows(), matrix.cols(), computationOptions);\n  using std::abs;\n\n  //**** step 1 Bidiagonalization  isTranspose = (matrix.cols()>matrix.rows()) ;\n  MatrixType copy;\n  if (isTranspose) copy = matrix.adjoint();\n  else copy = matrix;\n  \n  internal::UpperBidiagonalization<MatrixX > bid(copy);\n\n  //**** step 2 Divide\n  // this is ugly and has to be redone (care of complex cast)\n  MatrixXr temp;\n  temp = bid.bidiagonal().toDenseMatrix().transpose();\n  m_computed.setZero();\n  for (int i=0; i<this->m_diagSize - 1; i++)   {\n    m_computed(i, i) = temp(i, i);\n    m_computed(i + 1, i) = temp(i + 1, i);\n  }\n  m_computed(this->m_diagSize - 1, this->m_diagSize - 1) = temp(this->m_diagSize - 1, this->m_diagSize - 1);\n  divide(0, this->m_diagSize - 1, 0, 0, 0);\n\n  //**** step 3 copy\n  for (int i=0; i<this->m_diagSize; i++)   {\n    RealScalar a = abs(m_computed.coeff(i, i));\n    this->m_singularValues.coeffRef(i) = a;\n    if (a == 0){\n      this->m_nonzeroSingularValues = i;\n      break;\n    }\n    else  if (i == this->m_diagSize - 1)\n    {\n      this->m_nonzeroSingularValues = i + 1;\n      break;\n    }\n  }\n  copyUV(m_naiveV, m_naiveU, bid.householderU(), bid.householderV());\n  this->m_isInitialized = true;\n  return *this;\n}// end compute\n\n\ntemplate<typename MatrixType>\nvoid BDCSVD<MatrixType>::copyUV(MatrixXr naiveU, MatrixXr naiveV, MatrixX householderU, MatrixX householderV){\n  if (this->computeU()){\n    MatrixX temp = MatrixX::Zero(naiveU.rows(), naiveU.cols());\n    temp.real() = naiveU;\n    if (this->m_computeThinU){\n      this->m_matrixU = MatrixX::Identity(householderU.cols(), this->m_nonzeroSingularValues );\n      this->m_matrixU.block(0, 0, this->m_diagSize, this->m_nonzeroSingularValues) = \n\ttemp.block(0, 0, this->m_diagSize, this->m_nonzeroSingularValues);\n      this->m_matrixU = householderU * this->m_matrixU ;\n    }\n    else\n    {\n      this->m_matrixU = MatrixX::Identity(householderU.cols(), householderU.cols());\n      this->m_matrixU.block(0, 0, this->m_diagSize, this->m_diagSize) = temp.block(0, 0, this->m_diagSize, this->m_diagSize);\n      this->m_matrixU = householderU * this->m_matrixU ;\n    }\n  }\n  if (this->computeV()){\n    MatrixX temp = MatrixX::Zero(naiveV.rows(), naiveV.cols());\n    temp.real() = naiveV;\n    if (this->m_computeThinV){\n      this->m_matrixV = MatrixX::Identity(householderV.cols(),this->m_nonzeroSingularValues );\n      this->m_matrixV.block(0, 0, this->m_nonzeroSingularValues, this->m_nonzeroSingularValues) = \n\ttemp.block(0, 0, this->m_nonzeroSingularValues, this->m_nonzeroSingularValues);\n      this->m_matrixV = householderV * this->m_matrixV ;\n    }\n    else  \n    {\n      this->m_matrixV = MatrixX::Identity(householderV.cols(), householderV.cols());\n      this->m_matrixV.block(0, 0, this->m_diagSize, this->m_diagSize) = temp.block(0, 0, this->m_diagSize, this->m_diagSize);\n      this->m_matrixV = householderV * this->m_matrixV;\n    }\n  }\n}\n\n// The divide algorithm is done \"in place\", we are always working on subsets of the same matrix. The divide methods takes as argument the \n// place of the submatrix we are currently working on.\n\n//@param firstCol : The Index of the first column of the submatrix of m_computed and for m_naiveU;\n//@param lastCol : The Index of the last column of the submatrix of m_computed and for m_naiveU; \n// lastCol + 1 - firstCol is the size of the submatrix.\n//@param firstRowW : The Index of the first row of the matrix W that we are to change. (see the reference paper section 1 for more information on W)\n//@param firstRowW : Same as firstRowW with the column.\n//@param shift : Each time one takes the left submatrix, one must add 1 to the shift. Why? Because! We actually want the last column of the U submatrix \n// to become the first column (*coeff) and to shift all the other columns to the right. There are more details on the reference paper.\ntemplate<typename MatrixType>\nvoid BDCSVD<MatrixType>::divide (Index firstCol, Index lastCol, Index firstRowW, \n\t\t\t\t Index firstColW, Index shift)\n{\n  // requires nbRows = nbCols + 1;\n  using std::pow;\n  using std::sqrt;\n  using std::abs;\n  const Index n = lastCol - firstCol + 1;\n  const Index k = n/2;\n  RealScalar alphaK;\n  RealScalar betaK; \n  RealScalar r0; \n  RealScalar lambda, phi, c0, s0;\n  MatrixXr l, f;\n  // We use the other algorithm which is more efficient for small \n  // matrices.\n  if (n < algoswap){\n    JacobiSVD<MatrixXr> b(m_computed.block(firstCol, firstCol, n + 1, n), \n\t\t\t  ComputeFullU | (ComputeFullV * compV)) ;\n    if (compU) m_naiveU.block(firstCol, firstCol, n + 1, n + 1).real() << b.matrixU();\n    else \n    {\n      m_naiveU.row(0).segment(firstCol, n + 1).real() << b.matrixU().row(0);\n      m_naiveU.row(1).segment(firstCol, n + 1).real() << b.matrixU().row(n);\n    }\n    if (compV) m_naiveV.block(firstRowW, firstColW, n, n).real() << b.matrixV();\n    m_computed.block(firstCol + shift, firstCol + shift, n + 1, n).setZero();\n    for (int i=0; i<n; i++)\n    {\n      m_computed(firstCol + shift + i, firstCol + shift +i) = b.singularValues().coeffRef(i);\n    }\n    return;\n  }\n  // We use the divide and conquer algorithm\n  alphaK =  m_computed(firstCol + k, firstCol + k);\n  betaK = m_computed(firstCol + k + 1, firstCol + k);\n  // The divide must be done in that order in order to have good results. Divide change the data inside the submatrices\n  // and the divide of the right submatrice reads one column of the left submatrice. That's why we need to treat the \n  // right submatrix before the left one. \n  divide(k + 1 + firstCol, lastCol, k + 1 + firstRowW, k + 1 + firstColW, shift);\n  divide(firstCol, k - 1 + firstCol, firstRowW, firstColW + 1, shift + 1);\n  if (compU)\n  {\n    lambda = m_naiveU(firstCol + k, firstCol + k);\n    phi = m_naiveU(firstCol + k + 1, lastCol + 1);\n  } \n  else \n  {\n    lambda = m_naiveU(1, firstCol + k);\n    phi = m_naiveU(0, lastCol + 1);\n  }\n  r0 = sqrt((abs(alphaK * lambda) * abs(alphaK * lambda))\n\t    + abs(betaK * phi) * abs(betaK * phi));\n  if (compU)\n  {\n    l = m_naiveU.row(firstCol + k).segment(firstCol, k);\n    f = m_naiveU.row(firstCol + k + 1).segment(firstCol + k + 1, n - k - 1);\n  } \n  else \n  {\n    l = m_naiveU.row(1).segment(firstCol, k);\n    f = m_naiveU.row(0).segment(firstCol + k + 1, n - k - 1);\n  }\n  if (compV) m_naiveV(firstRowW+k, firstColW) = 1;\n  if (r0 == 0)\n  {\n    c0 = 1;\n    s0 = 0;\n  }\n  else\n  {\n    c0 = alphaK * lambda / r0;\n    s0 = betaK * phi / r0;\n  }\n  if (compU)\n  {\n    MatrixXr q1 (m_naiveU.col(firstCol + k).segment(firstCol, k + 1));     \n    // we shiftW Q1 to the right\n    for (Index i = firstCol + k - 1; i >= firstCol; i--) \n    {\n      m_naiveU.col(i + 1).segment(firstCol, k + 1) << m_naiveU.col(i).segment(firstCol, k + 1);\n    }\n    // we shift q1 at the left with a factor c0\n    m_naiveU.col(firstCol).segment( firstCol, k + 1) << (q1 * c0);\n    // last column = q1 * - s0\n    m_naiveU.col(lastCol + 1).segment(firstCol, k + 1) << (q1 * ( - s0));\n    // first column = q2 * s0\n    m_naiveU.col(firstCol).segment(firstCol + k + 1, n - k) << \n      m_naiveU.col(lastCol + 1).segment(firstCol + k + 1, n - k) *s0; \n    // q2 *= c0\n    m_naiveU.col(lastCol + 1).segment(firstCol + k + 1, n - k) *= c0; \n  } \n  else \n  {\n    RealScalar q1 = (m_naiveU(0, firstCol + k));\n    // we shift Q1 to the right\n    for (Index i = firstCol + k - 1; i >= firstCol; i--) \n    {\n      m_naiveU(0, i + 1) = m_naiveU(0, i);\n    }\n    // we shift q1 at the left with a factor c0\n    m_naiveU(0, firstCol) = (q1 * c0);\n    // last column = q1 * - s0\n    m_naiveU(0, lastCol + 1) = (q1 * ( - s0));\n    // first column = q2 * s0\n    m_naiveU(1, firstCol) = m_naiveU(1, lastCol + 1) *s0; \n    // q2 *= c0\n    m_naiveU(1, lastCol + 1) *= c0;\n    m_naiveU.row(1).segment(firstCol + 1, k).setZero();\n    m_naiveU.row(0).segment(firstCol + k + 1, n - k - 1).setZero();\n  }\n  m_computed(firstCol + shift, firstCol + shift) = r0;\n  m_computed.col(firstCol + shift).segment(firstCol + shift + 1, k) << alphaK * l.transpose().real();\n  m_computed.col(firstCol + shift).segment(firstCol + shift + k + 1, n - k - 1) << betaK * f.transpose().real();\n\n\n  // the line below do the deflation of the matrix for the third part of the algorithm\n  // Here the deflation is commented because the third part of the algorithm is not implemented\n  // the third part of the algorithm is a fast SVD on the matrix m_computed which works thanks to the deflation\n\n  deflation(firstCol, lastCol, k, firstRowW, firstColW, shift);\n\n  // Third part of the algorithm, since the real third part of the algorithm is not implemeted we use a JacobiSVD\n  JacobiSVD<MatrixXr> res= JacobiSVD<MatrixXr>(m_computed.block(firstCol + shift, firstCol +shift, n + 1, n), \n\t\t\t\t\t       ComputeFullU | (ComputeFullV * compV)) ;\n  if (compU) m_naiveU.block(firstCol, firstCol, n + 1, n + 1) *= res.matrixU();\n  else m_naiveU.block(0, firstCol, 2, n + 1) *= res.matrixU();\n  \n  if (compV) m_naiveV.block(firstRowW, firstColW, n, n) *= res.matrixV();\n  m_computed.block(firstCol + shift, firstCol + shift, n, n) << MatrixXr::Zero(n, n);\n  for (int i=0; i<n; i++)\n    m_computed(firstCol + shift + i, firstCol + shift +i) = res.singularValues().coeffRef(i);\n  // end of the third part\n\n\n}// end divide\n\n\n// page 12_13\n// i >= 1, di almost null and zi non null.\n// We use a rotation to zero out zi applied to the left of M\ntemplate <typename MatrixType>\nvoid BDCSVD<MatrixType>::deflation43(Index firstCol, Index shift, Index i, Index size){\n  using std::abs;\n  using std::sqrt;\n  using std::pow;\n  RealScalar c = m_computed(firstCol + shift, firstCol + shift);\n  RealScalar s = m_computed(i, firstCol + shift);\n  RealScalar r = sqrt(pow(abs(c), 2) + pow(abs(s), 2));\n  if (r == 0){\n    m_computed(i, i)=0;\n    return;\n  }\n  c/=r;\n  s/=r;\n  m_computed(firstCol + shift, firstCol + shift) = r;  \n  m_computed(i, firstCol + shift) = 0;\n  m_computed(i, i) = 0;\n  if (compU){\n    m_naiveU.col(firstCol).segment(firstCol,size) = \n      c * m_naiveU.col(firstCol).segment(firstCol, size) - \n      s * m_naiveU.col(i).segment(firstCol, size) ;\n\n    m_naiveU.col(i).segment(firstCol, size) = \n      (c + s*s/c) * m_naiveU.col(i).segment(firstCol, size) + \n      (s/c) * m_naiveU.col(firstCol).segment(firstCol,size);\n  }\n}// end deflation 43\n\n\n// page 13\n// i,j >= 1, i != j and |di - dj| < epsilon * norm2(M)\n// We apply two rotations to have zj = 0;\ntemplate <typename MatrixType>\nvoid BDCSVD<MatrixType>::deflation44(Index firstColu , Index firstColm, Index firstRowW, Index firstColW, Index i, Index j, Index size){\n  using std::abs;\n  using std::sqrt;\n  using std::conj;\n  using std::pow;\n  RealScalar c = m_computed(firstColm, firstColm + j - 1);\n  RealScalar s = m_computed(firstColm, firstColm + i - 1);\n  RealScalar r = sqrt(pow(abs(c), 2) + pow(abs(s), 2));\n  if (r==0){\n    m_computed(firstColm + i, firstColm + i) = m_computed(firstColm + j, firstColm + j);\n    return;\n  }\n  c/=r;\n  s/=r;\n  m_computed(firstColm + i, firstColm) = r;  \n  m_computed(firstColm + i, firstColm + i) = m_computed(firstColm + j, firstColm + j);\n  m_computed(firstColm + j, firstColm) = 0;\n  if (compU){\n    m_naiveU.col(firstColu + i).segment(firstColu, size) = \n      c * m_naiveU.col(firstColu + i).segment(firstColu, size) - \n      s * m_naiveU.col(firstColu + j).segment(firstColu, size) ;\n\n    m_naiveU.col(firstColu + j).segment(firstColu, size) = \n      (c + s*s/c) *  m_naiveU.col(firstColu + j).segment(firstColu, size) + \n      (s/c) * m_naiveU.col(firstColu + i).segment(firstColu, size);\n  } \n  if (compV){\n    m_naiveV.col(firstColW + i).segment(firstRowW, size - 1) = \n      c * m_naiveV.col(firstColW + i).segment(firstRowW, size - 1) + \n      s * m_naiveV.col(firstColW + j).segment(firstRowW, size - 1) ;\n\n    m_naiveV.col(firstColW + j).segment(firstRowW, size - 1)  = \n      (c + s*s/c) * m_naiveV.col(firstColW + j).segment(firstRowW, size - 1) - \n      (s/c) * m_naiveV.col(firstColW + i).segment(firstRowW, size - 1);\n  }\n}// end deflation 44\n\n\n\ntemplate <typename MatrixType>\nvoid BDCSVD<MatrixType>::deflation(Index firstCol, Index lastCol, Index k, Index firstRowW, Index firstColW, Index shift){\n  //condition 4.1\n  RealScalar EPS = EPSILON * (std::max<RealScalar>(m_computed(firstCol + shift + 1, firstCol + shift + 1), m_computed(firstCol + k, firstCol + k)));\n  const Index length = lastCol + 1 - firstCol;\n  if (m_computed(firstCol + shift, firstCol + shift) < EPS){\n    m_computed(firstCol + shift, firstCol + shift) = EPS;\n  }\n  //condition 4.2\n  for (Index i=firstCol + shift + 1;i<=lastCol + shift;i++){\n    if (std::abs(m_computed(i, firstCol + shift)) < EPS){\n      m_computed(i, firstCol + shift) = 0;\n    }\n  }\n\n  //condition 4.3\n  for (Index i=firstCol + shift + 1;i<=lastCol + shift; i++){\n    if (m_computed(i, i) < EPS){\n      deflation43(firstCol, shift, i, length);\n    }\n  }\n\n  //condition 4.4\n \n  Index i=firstCol + shift + 1, j=firstCol + shift + k + 1;\n  //we stock the final place of each line\n  Index *permutation = new Index[length];\n\n  for (Index p =1; p < length; p++) {\n    if (i> firstCol + shift + k){\n      permutation[p] = j;\n      j++;\n    } else if (j> lastCol + shift) \n    {\n      permutation[p] = i;\n      i++;\n    }\n    else \n    {\n      if (m_computed(i, i) < m_computed(j, j)){\n        permutation[p] = j;\n        j++;\n      } \n      else\n      {\n        permutation[p] = i;\n        i++;\n      }\n    }\n  }\n  //we do the permutation\n  RealScalar aux;\n  //we stock the current index of each col\n  //and the column of each index\n  Index *realInd = new Index[length];\n  Index *realCol = new Index[length];\n  for (int pos = 0; pos< length; pos++){\n    realCol[pos] = pos + firstCol + shift;\n    realInd[pos] = pos;\n  }\n  const Index Zero = firstCol + shift;\n  VectorType temp;\n  for (int i = 1; i < length - 1; i++){\n    const Index I = i + Zero;\n    const Index realI = realInd[i];\n    const Index j  = permutation[length - i] - Zero;\n    const Index J = realCol[j];\n    \n    //diag displace\n    aux = m_computed(I, I); \n    m_computed(I, I) = m_computed(J, J);\n    m_computed(J, J) = aux;\n    \n    //firstrow displace\n    aux = m_computed(I, Zero); \n    m_computed(I, Zero) = m_computed(J, Zero);\n    m_computed(J, Zero) = aux;\n\n    // change columns\n    if (compU) {\n      temp = m_naiveU.col(I - shift).segment(firstCol, length + 1);\n      m_naiveU.col(I - shift).segment(firstCol, length + 1) << \n        m_naiveU.col(J - shift).segment(firstCol, length + 1);\n      m_naiveU.col(J - shift).segment(firstCol, length + 1) << temp;\n    } \n    else\n    {\n      temp = m_naiveU.col(I - shift).segment(0, 2);\n      m_naiveU.col(I - shift).segment(0, 2) << \n        m_naiveU.col(J - shift).segment(0, 2);\n      m_naiveU.col(J - shift).segment(0, 2) << temp;      \n    }\n    if (compV) {\n      const Index CWI = I + firstColW - Zero;\n      const Index CWJ = J + firstColW - Zero;\n      temp = m_naiveV.col(CWI).segment(firstRowW, length);\n      m_naiveV.col(CWI).segment(firstRowW, length) << m_naiveV.col(CWJ).segment(firstRowW, length);\n      m_naiveV.col(CWJ).segment(firstRowW, length) << temp;\n    }\n\n    //update real pos\n    realCol[realI] = J;\n    realCol[j] = I;\n    realInd[J - Zero] = realI;\n    realInd[I - Zero] = j;\n  }\n  for (Index i = firstCol + shift + 1; i<lastCol + shift;i++){\n    if ((m_computed(i + 1, i + 1) - m_computed(i, i)) < EPS){\n      deflation44(firstCol , \n\t\t  firstCol + shift, \n\t\t  firstRowW, \n\t\t  firstColW, \n\t\t  i - Zero, \n\t\t  i + 1 - Zero, \n\t\t  length);\n    }\n  }\n  delete [] permutation;\n  delete [] realInd;\n  delete [] realCol;\n\n}//end deflation\n\n\nnamespace internal{\n\ntemplate<typename _MatrixType, typename Rhs>\nstruct solve_retval<BDCSVD<_MatrixType>, Rhs>\n  : solve_retval_base<BDCSVD<_MatrixType>, Rhs>\n{\n  typedef BDCSVD<_MatrixType> BDCSVDType;\n  EIGEN_MAKE_SOLVE_HELPERS(BDCSVDType, Rhs)\n\n  template<typename Dest> void evalTo(Dest& dst) const\n  {\n    eigen_assert(rhs().rows() == dec().rows());\n    // A = U S V^*\n    // So A^{ - 1} = V S^{ - 1} U^*    \n    Index diagSize = (std::min)(dec().rows(), dec().cols());\n    typename BDCSVDType::SingularValuesType invertedSingVals(diagSize);\n    Index nonzeroSingVals = dec().nonzeroSingularValues();\n    invertedSingVals.head(nonzeroSingVals) = dec().singularValues().head(nonzeroSingVals).array().inverse();\n    invertedSingVals.tail(diagSize - nonzeroSingVals).setZero();\n    \n    dst = dec().matrixV().leftCols(diagSize)\n      * invertedSingVals.asDiagonal()\n      * dec().matrixU().leftCols(diagSize).adjoint()\n      * rhs();\t\n    return;\n  }\n};\n\n} //end namespace internal\n\n  /** \\svd_module\n   *\n   * \\return the singular value decomposition of \\c *this computed by \n   *  BDC Algorithm\n   *\n   * \\sa class BDCSVD\n   */\n/*\ntemplate<typename Derived>\nBDCSVD<typename MatrixBase<Derived>::PlainObject>\nMatrixBase<Derived>::bdcSvd(unsigned int computationOptions) const\n{\n  return BDCSVD<PlainObject>(*this, computationOptions);\n}\n*/\n\n} // end namespace Eigen\n\n#endif\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/SVD/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_SVD_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_SVD_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}unsupported/Eigen/src/SVD COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/SVD/JacobiSVD.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009-2010 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_JACOBISVD_H\n#define EIGEN_JACOBISVD_H\n\nnamespace Eigen { \n\nnamespace internal {\n// forward declaration (needed by ICC)\n// the empty body is required by MSVC\ntemplate<typename MatrixType, int QRPreconditioner,\n         bool IsComplex = NumTraits<typename MatrixType::Scalar>::IsComplex>\nstruct svd_precondition_2x2_block_to_be_real {};\n\n/*** QR preconditioners (R-SVD)\n ***\n *** Their role is to reduce the problem of computing the SVD to the case of a square matrix.\n *** This approach, known as R-SVD, is an optimization for rectangular-enough matrices, and is a requirement for\n *** JacobiSVD which by itself is only able to work on square matrices.\n ***/\n\nenum { PreconditionIfMoreColsThanRows, PreconditionIfMoreRowsThanCols };\n\ntemplate<typename MatrixType, int QRPreconditioner, int Case>\nstruct qr_preconditioner_should_do_anything\n{\n  enum { a = MatrixType::RowsAtCompileTime != Dynamic &&\n             MatrixType::ColsAtCompileTime != Dynamic &&\n             MatrixType::ColsAtCompileTime <= MatrixType::RowsAtCompileTime,\n         b = MatrixType::RowsAtCompileTime != Dynamic &&\n             MatrixType::ColsAtCompileTime != Dynamic &&\n             MatrixType::RowsAtCompileTime <= MatrixType::ColsAtCompileTime,\n         ret = !( (QRPreconditioner == NoQRPreconditioner) ||\n                  (Case == PreconditionIfMoreColsThanRows && bool(a)) ||\n                  (Case == PreconditionIfMoreRowsThanCols && bool(b)) )\n  };\n};\n\ntemplate<typename MatrixType, int QRPreconditioner, int Case,\n         bool DoAnything = qr_preconditioner_should_do_anything<MatrixType, QRPreconditioner, Case>::ret\n> struct qr_preconditioner_impl {};\n\ntemplate<typename MatrixType, int QRPreconditioner, int Case>\nclass qr_preconditioner_impl<MatrixType, QRPreconditioner, Case, false>\n{\npublic:\n  typedef typename MatrixType::Index Index;\n  void allocate(const JacobiSVD<MatrixType, QRPreconditioner>&) {}\n  bool run(JacobiSVD<MatrixType, QRPreconditioner>&, const MatrixType&)\n  {\n    return false;\n  }\n};\n\n/*** preconditioner using FullPivHouseholderQR ***/\n\ntemplate<typename MatrixType>\nclass qr_preconditioner_impl<MatrixType, FullPivHouseholderQRPreconditioner, PreconditionIfMoreRowsThanCols, true>\n{\npublic:\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n  enum\n  {\n    RowsAtCompileTime = MatrixType::RowsAtCompileTime,\n    MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime\n  };\n  typedef Matrix<Scalar, 1, RowsAtCompileTime, RowMajor, 1, MaxRowsAtCompileTime> WorkspaceType;\n\n  void allocate(const JacobiSVD<MatrixType, FullPivHouseholderQRPreconditioner>& svd)\n  {\n    if (svd.rows() != m_qr.rows() || svd.cols() != m_qr.cols())\n    {\n      m_qr.~QRType();\n      ::new (&m_qr) QRType(svd.rows(), svd.cols());\n    }\n    if (svd.m_computeFullU) m_workspace.resize(svd.rows());\n  }\n\n  bool run(JacobiSVD<MatrixType, FullPivHouseholderQRPreconditioner>& svd, const MatrixType& matrix)\n  {\n    if(matrix.rows() > matrix.cols())\n    {\n      m_qr.compute(matrix);\n      svd.m_workMatrix = m_qr.matrixQR().block(0,0,matrix.cols(),matrix.cols()).template triangularView<Upper>();\n      if(svd.m_computeFullU) m_qr.matrixQ().evalTo(svd.m_matrixU, m_workspace);\n      if(svd.computeV()) svd.m_matrixV = m_qr.colsPermutation();\n      return true;\n    }\n    return false;\n  }\nprivate:\n  typedef FullPivHouseholderQR<MatrixType> QRType;\n  QRType m_qr;\n  WorkspaceType m_workspace;\n};\n\ntemplate<typename MatrixType>\nclass qr_preconditioner_impl<MatrixType, FullPivHouseholderQRPreconditioner, PreconditionIfMoreColsThanRows, true>\n{\npublic:\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n  enum\n  {\n    RowsAtCompileTime = MatrixType::RowsAtCompileTime,\n    ColsAtCompileTime = MatrixType::ColsAtCompileTime,\n    MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,\n    MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime,\n    Options = MatrixType::Options\n  };\n  typedef Matrix<Scalar, ColsAtCompileTime, RowsAtCompileTime, Options, MaxColsAtCompileTime, MaxRowsAtCompileTime>\n          TransposeTypeWithSameStorageOrder;\n\n  void allocate(const JacobiSVD<MatrixType, FullPivHouseholderQRPreconditioner>& svd)\n  {\n    if (svd.cols() != m_qr.rows() || svd.rows() != m_qr.cols())\n    {\n      m_qr.~QRType();\n      ::new (&m_qr) QRType(svd.cols(), svd.rows());\n    }\n    m_adjoint.resize(svd.cols(), svd.rows());\n    if (svd.m_computeFullV) m_workspace.resize(svd.cols());\n  }\n\n  bool run(JacobiSVD<MatrixType, FullPivHouseholderQRPreconditioner>& svd, const MatrixType& matrix)\n  {\n    if(matrix.cols() > matrix.rows())\n    {\n      m_adjoint = matrix.adjoint();\n      m_qr.compute(m_adjoint);\n      svd.m_workMatrix = m_qr.matrixQR().block(0,0,matrix.rows(),matrix.rows()).template triangularView<Upper>().adjoint();\n      if(svd.m_computeFullV) m_qr.matrixQ().evalTo(svd.m_matrixV, m_workspace);\n      if(svd.computeU()) svd.m_matrixU = m_qr.colsPermutation();\n      return true;\n    }\n    else return false;\n  }\nprivate:\n  typedef FullPivHouseholderQR<TransposeTypeWithSameStorageOrder> QRType;\n  QRType m_qr;\n  TransposeTypeWithSameStorageOrder m_adjoint;\n  typename internal::plain_row_type<MatrixType>::type m_workspace;\n};\n\n/*** preconditioner using ColPivHouseholderQR ***/\n\ntemplate<typename MatrixType>\nclass qr_preconditioner_impl<MatrixType, ColPivHouseholderQRPreconditioner, PreconditionIfMoreRowsThanCols, true>\n{\npublic:\n  typedef typename MatrixType::Index Index;\n\n  void allocate(const JacobiSVD<MatrixType, ColPivHouseholderQRPreconditioner>& svd)\n  {\n    if (svd.rows() != m_qr.rows() || svd.cols() != m_qr.cols())\n    {\n      m_qr.~QRType();\n      ::new (&m_qr) QRType(svd.rows(), svd.cols());\n    }\n    if (svd.m_computeFullU) m_workspace.resize(svd.rows());\n    else if (svd.m_computeThinU) m_workspace.resize(svd.cols());\n  }\n\n  bool run(JacobiSVD<MatrixType, ColPivHouseholderQRPreconditioner>& svd, const MatrixType& matrix)\n  {\n    if(matrix.rows() > matrix.cols())\n    {\n      m_qr.compute(matrix);\n      svd.m_workMatrix = m_qr.matrixQR().block(0,0,matrix.cols(),matrix.cols()).template triangularView<Upper>();\n      if(svd.m_computeFullU) m_qr.householderQ().evalTo(svd.m_matrixU, m_workspace);\n      else if(svd.m_computeThinU)\n      {\n        svd.m_matrixU.setIdentity(matrix.rows(), matrix.cols());\n        m_qr.householderQ().applyThisOnTheLeft(svd.m_matrixU, m_workspace);\n      }\n      if(svd.computeV()) svd.m_matrixV = m_qr.colsPermutation();\n      return true;\n    }\n    return false;\n  }\n\nprivate:\n  typedef ColPivHouseholderQR<MatrixType> QRType;\n  QRType m_qr;\n  typename internal::plain_col_type<MatrixType>::type m_workspace;\n};\n\ntemplate<typename MatrixType>\nclass qr_preconditioner_impl<MatrixType, ColPivHouseholderQRPreconditioner, PreconditionIfMoreColsThanRows, true>\n{\npublic:\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n  enum\n  {\n    RowsAtCompileTime = MatrixType::RowsAtCompileTime,\n    ColsAtCompileTime = MatrixType::ColsAtCompileTime,\n    MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,\n    MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime,\n    Options = MatrixType::Options\n  };\n\n  typedef Matrix<Scalar, ColsAtCompileTime, RowsAtCompileTime, Options, MaxColsAtCompileTime, MaxRowsAtCompileTime>\n          TransposeTypeWithSameStorageOrder;\n\n  void allocate(const JacobiSVD<MatrixType, ColPivHouseholderQRPreconditioner>& svd)\n  {\n    if (svd.cols() != m_qr.rows() || svd.rows() != m_qr.cols())\n    {\n      m_qr.~QRType();\n      ::new (&m_qr) QRType(svd.cols(), svd.rows());\n    }\n    if (svd.m_computeFullV) m_workspace.resize(svd.cols());\n    else if (svd.m_computeThinV) m_workspace.resize(svd.rows());\n    m_adjoint.resize(svd.cols(), svd.rows());\n  }\n\n  bool run(JacobiSVD<MatrixType, ColPivHouseholderQRPreconditioner>& svd, const MatrixType& matrix)\n  {\n    if(matrix.cols() > matrix.rows())\n    {\n      m_adjoint = matrix.adjoint();\n      m_qr.compute(m_adjoint);\n\n      svd.m_workMatrix = m_qr.matrixQR().block(0,0,matrix.rows(),matrix.rows()).template triangularView<Upper>().adjoint();\n      if(svd.m_computeFullV) m_qr.householderQ().evalTo(svd.m_matrixV, m_workspace);\n      else if(svd.m_computeThinV)\n      {\n        svd.m_matrixV.setIdentity(matrix.cols(), matrix.rows());\n        m_qr.householderQ().applyThisOnTheLeft(svd.m_matrixV, m_workspace);\n      }\n      if(svd.computeU()) svd.m_matrixU = m_qr.colsPermutation();\n      return true;\n    }\n    else return false;\n  }\n\nprivate:\n  typedef ColPivHouseholderQR<TransposeTypeWithSameStorageOrder> QRType;\n  QRType m_qr;\n  TransposeTypeWithSameStorageOrder m_adjoint;\n  typename internal::plain_row_type<MatrixType>::type m_workspace;\n};\n\n/*** preconditioner using HouseholderQR ***/\n\ntemplate<typename MatrixType>\nclass qr_preconditioner_impl<MatrixType, HouseholderQRPreconditioner, PreconditionIfMoreRowsThanCols, true>\n{\npublic:\n  typedef typename MatrixType::Index Index;\n\n  void allocate(const JacobiSVD<MatrixType, HouseholderQRPreconditioner>& svd)\n  {\n    if (svd.rows() != m_qr.rows() || svd.cols() != m_qr.cols())\n    {\n      m_qr.~QRType();\n      ::new (&m_qr) QRType(svd.rows(), svd.cols());\n    }\n    if (svd.m_computeFullU) m_workspace.resize(svd.rows());\n    else if (svd.m_computeThinU) m_workspace.resize(svd.cols());\n  }\n\n  bool run(JacobiSVD<MatrixType, HouseholderQRPreconditioner>& svd, const MatrixType& matrix)\n  {\n    if(matrix.rows() > matrix.cols())\n    {\n      m_qr.compute(matrix);\n      svd.m_workMatrix = m_qr.matrixQR().block(0,0,matrix.cols(),matrix.cols()).template triangularView<Upper>();\n      if(svd.m_computeFullU) m_qr.householderQ().evalTo(svd.m_matrixU, m_workspace);\n      else if(svd.m_computeThinU)\n      {\n        svd.m_matrixU.setIdentity(matrix.rows(), matrix.cols());\n        m_qr.householderQ().applyThisOnTheLeft(svd.m_matrixU, m_workspace);\n      }\n      if(svd.computeV()) svd.m_matrixV.setIdentity(matrix.cols(), matrix.cols());\n      return true;\n    }\n    return false;\n  }\nprivate:\n  typedef HouseholderQR<MatrixType> QRType;\n  QRType m_qr;\n  typename internal::plain_col_type<MatrixType>::type m_workspace;\n};\n\ntemplate<typename MatrixType>\nclass qr_preconditioner_impl<MatrixType, HouseholderQRPreconditioner, PreconditionIfMoreColsThanRows, true>\n{\npublic:\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n  enum\n  {\n    RowsAtCompileTime = MatrixType::RowsAtCompileTime,\n    ColsAtCompileTime = MatrixType::ColsAtCompileTime,\n    MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,\n    MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime,\n    Options = MatrixType::Options\n  };\n\n  typedef Matrix<Scalar, ColsAtCompileTime, RowsAtCompileTime, Options, MaxColsAtCompileTime, MaxRowsAtCompileTime>\n          TransposeTypeWithSameStorageOrder;\n\n  void allocate(const JacobiSVD<MatrixType, HouseholderQRPreconditioner>& svd)\n  {\n    if (svd.cols() != m_qr.rows() || svd.rows() != m_qr.cols())\n    {\n      m_qr.~QRType();\n      ::new (&m_qr) QRType(svd.cols(), svd.rows());\n    }\n    if (svd.m_computeFullV) m_workspace.resize(svd.cols());\n    else if (svd.m_computeThinV) m_workspace.resize(svd.rows());\n    m_adjoint.resize(svd.cols(), svd.rows());\n  }\n\n  bool run(JacobiSVD<MatrixType, HouseholderQRPreconditioner>& svd, const MatrixType& matrix)\n  {\n    if(matrix.cols() > matrix.rows())\n    {\n      m_adjoint = matrix.adjoint();\n      m_qr.compute(m_adjoint);\n\n      svd.m_workMatrix = m_qr.matrixQR().block(0,0,matrix.rows(),matrix.rows()).template triangularView<Upper>().adjoint();\n      if(svd.m_computeFullV) m_qr.householderQ().evalTo(svd.m_matrixV, m_workspace);\n      else if(svd.m_computeThinV)\n      {\n        svd.m_matrixV.setIdentity(matrix.cols(), matrix.rows());\n        m_qr.householderQ().applyThisOnTheLeft(svd.m_matrixV, m_workspace);\n      }\n      if(svd.computeU()) svd.m_matrixU.setIdentity(matrix.rows(), matrix.rows());\n      return true;\n    }\n    else return false;\n  }\n\nprivate:\n  typedef HouseholderQR<TransposeTypeWithSameStorageOrder> QRType;\n  QRType m_qr;\n  TransposeTypeWithSameStorageOrder m_adjoint;\n  typename internal::plain_row_type<MatrixType>::type m_workspace;\n};\n\n/*** 2x2 SVD implementation\n ***\n *** JacobiSVD consists in performing a series of 2x2 SVD subproblems\n ***/\n\ntemplate<typename MatrixType, int QRPreconditioner>\nstruct svd_precondition_2x2_block_to_be_real<MatrixType, QRPreconditioner, false>\n{\n  typedef JacobiSVD<MatrixType, QRPreconditioner> SVD;\n  typedef typename SVD::Index Index;\n  static void run(typename SVD::WorkMatrixType&, SVD&, Index, Index) {}\n};\n\ntemplate<typename MatrixType, int QRPreconditioner>\nstruct svd_precondition_2x2_block_to_be_real<MatrixType, QRPreconditioner, true>\n{\n  typedef JacobiSVD<MatrixType, QRPreconditioner> SVD;\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename MatrixType::RealScalar RealScalar;\n  typedef typename SVD::Index Index;\n  static void run(typename SVD::WorkMatrixType& work_matrix, SVD& svd, Index p, Index q)\n  {\n    using std::sqrt;\n    Scalar z;\n    JacobiRotation<Scalar> rot;\n    RealScalar n = sqrt(numext::abs2(work_matrix.coeff(p,p)) + numext::abs2(work_matrix.coeff(q,p)));\n    if(n==0)\n    {\n      z = abs(work_matrix.coeff(p,q)) / work_matrix.coeff(p,q);\n      work_matrix.row(p) *= z;\n      if(svd.computeU()) svd.m_matrixU.col(p) *= conj(z);\n      z = abs(work_matrix.coeff(q,q)) / work_matrix.coeff(q,q);\n      work_matrix.row(q) *= z;\n      if(svd.computeU()) svd.m_matrixU.col(q) *= conj(z);\n    }\n    else\n    {\n      rot.c() = conj(work_matrix.coeff(p,p)) / n;\n      rot.s() = work_matrix.coeff(q,p) / n;\n      work_matrix.applyOnTheLeft(p,q,rot);\n      if(svd.computeU()) svd.m_matrixU.applyOnTheRight(p,q,rot.adjoint());\n      if(work_matrix.coeff(p,q) != Scalar(0))\n      {\n        Scalar z = abs(work_matrix.coeff(p,q)) / work_matrix.coeff(p,q);\n        work_matrix.col(q) *= z;\n        if(svd.computeV()) svd.m_matrixV.col(q) *= z;\n      }\n      if(work_matrix.coeff(q,q) != Scalar(0))\n      {\n        z = abs(work_matrix.coeff(q,q)) / work_matrix.coeff(q,q);\n        work_matrix.row(q) *= z;\n        if(svd.computeU()) svd.m_matrixU.col(q) *= conj(z);\n      }\n    }\n  }\n};\n\ntemplate<typename MatrixType, typename RealScalar, typename Index>\nvoid real_2x2_jacobi_svd(const MatrixType& matrix, Index p, Index q,\n                            JacobiRotation<RealScalar> *j_left,\n                            JacobiRotation<RealScalar> *j_right)\n{\n  using std::sqrt;\n  Matrix<RealScalar,2,2> m;\n  m << numext::real(matrix.coeff(p,p)), numext::real(matrix.coeff(p,q)),\n       numext::real(matrix.coeff(q,p)), numext::real(matrix.coeff(q,q));\n  JacobiRotation<RealScalar> rot1;\n  RealScalar t = m.coeff(0,0) + m.coeff(1,1);\n  RealScalar d = m.coeff(1,0) - m.coeff(0,1);\n  if(t == RealScalar(0))\n  {\n    rot1.c() = RealScalar(0);\n    rot1.s() = d > RealScalar(0) ? RealScalar(1) : RealScalar(-1);\n  }\n  else\n  {\n    RealScalar u = d / t;\n    rot1.c() = RealScalar(1) / sqrt(RealScalar(1) + numext::abs2(u));\n    rot1.s() = rot1.c() * u;\n  }\n  m.applyOnTheLeft(0,1,rot1);\n  j_right->makeJacobi(m,0,1);\n  *j_left  = rot1 * j_right->transpose();\n}\n\n} // end namespace internal\n\n/** \\ingroup SVD_Module\n  *\n  *\n  * \\class JacobiSVD\n  *\n  * \\brief Two-sided Jacobi SVD decomposition of a rectangular matrix\n  *\n  * \\param MatrixType the type of the matrix of which we are computing the SVD decomposition\n  * \\param QRPreconditioner this optional parameter allows to specify the type of QR decomposition that will be used internally\n  *                        for the R-SVD step for non-square matrices. See discussion of possible values below.\n  *\n  * SVD decomposition consists in decomposing any n-by-p matrix \\a A as a product\n  *   \\f[ A = U S V^* \\f]\n  * where \\a U is a n-by-n unitary, \\a V is a p-by-p unitary, and \\a S is a n-by-p real positive matrix which is zero outside of its main diagonal;\n  * the diagonal entries of S are known as the \\em singular \\em values of \\a A and the columns of \\a U and \\a V are known as the left\n  * and right \\em singular \\em vectors of \\a A respectively.\n  *\n  * Singular values are always sorted in decreasing order.\n  *\n  * This JacobiSVD decomposition computes only the singular values by default. If you want \\a U or \\a V, you need to ask for them explicitly.\n  *\n  * You can ask for only \\em thin \\a U or \\a V to be computed, meaning the following. In case of a rectangular n-by-p matrix, letting \\a m be the\n  * smaller value among \\a n and \\a p, there are only \\a m singular vectors; the remaining columns of \\a U and \\a V do not correspond to actual\n  * singular vectors. Asking for \\em thin \\a U or \\a V means asking for only their \\a m first columns to be formed. So \\a U is then a n-by-m matrix,\n  * and \\a V is then a p-by-m matrix. Notice that thin \\a U and \\a V are all you need for (least squares) solving.\n  *\n  * Here's an example demonstrating basic usage:\n  * \\include JacobiSVD_basic.cpp\n  * Output: \\verbinclude JacobiSVD_basic.out\n  *\n  * This JacobiSVD class is a two-sided Jacobi R-SVD decomposition, ensuring optimal reliability and accuracy. The downside is that it's slower than\n  * bidiagonalizing SVD algorithms for large square matrices; however its complexity is still \\f$ O(n^2p) \\f$ where \\a n is the smaller dimension and\n  * \\a p is the greater dimension, meaning that it is still of the same order of complexity as the faster bidiagonalizing R-SVD algorithms.\n  * In particular, like any R-SVD, it takes advantage of non-squareness in that its complexity is only linear in the greater dimension.\n  *\n  * If the input matrix has inf or nan coefficients, the result of the computation is undefined, but the computation is guaranteed to\n  * terminate in finite (and reasonable) time.\n  *\n  * The possible values for QRPreconditioner are:\n  * \\li ColPivHouseholderQRPreconditioner is the default. In practice it's very safe. It uses column-pivoting QR.\n  * \\li FullPivHouseholderQRPreconditioner, is the safest and slowest. It uses full-pivoting QR.\n  *     Contrary to other QRs, it doesn't allow computing thin unitaries.\n  * \\li HouseholderQRPreconditioner is the fastest, and less safe and accurate than the pivoting variants. It uses non-pivoting QR.\n  *     This is very similar in safety and accuracy to the bidiagonalization process used by bidiagonalizing SVD algorithms (since bidiagonalization\n  *     is inherently non-pivoting). However the resulting SVD is still more reliable than bidiagonalizing SVDs because the Jacobi-based iterarive\n  *     process is more reliable than the optimized bidiagonal SVD iterations.\n  * \\li NoQRPreconditioner allows not to use a QR preconditioner at all. This is useful if you know that you will only be computing\n  *     JacobiSVD decompositions of square matrices. Non-square matrices require a QR preconditioner. Using this option will result in\n  *     faster compilation and smaller executable code. It won't significantly speed up computation, since JacobiSVD is always checking\n  *     if QR preconditioning is needed before applying it anyway.\n  *\n  * \\sa MatrixBase::jacobiSvd()\n  */\ntemplate<typename _MatrixType, int QRPreconditioner> \nclass JacobiSVD : public SVDBase<_MatrixType>\n{\n  public:\n\n    typedef _MatrixType MatrixType;\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename NumTraits<typename MatrixType::Scalar>::Real RealScalar;\n    typedef typename MatrixType::Index Index;\n    enum {\n      RowsAtCompileTime = MatrixType::RowsAtCompileTime,\n      ColsAtCompileTime = MatrixType::ColsAtCompileTime,\n      DiagSizeAtCompileTime = EIGEN_SIZE_MIN_PREFER_DYNAMIC(RowsAtCompileTime,ColsAtCompileTime),\n      MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,\n      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime,\n      MaxDiagSizeAtCompileTime = EIGEN_SIZE_MIN_PREFER_FIXED(MaxRowsAtCompileTime,MaxColsAtCompileTime),\n      MatrixOptions = MatrixType::Options\n    };\n\n    typedef Matrix<Scalar, RowsAtCompileTime, RowsAtCompileTime,\n                   MatrixOptions, MaxRowsAtCompileTime, MaxRowsAtCompileTime>\n            MatrixUType;\n    typedef Matrix<Scalar, ColsAtCompileTime, ColsAtCompileTime,\n                   MatrixOptions, MaxColsAtCompileTime, MaxColsAtCompileTime>\n            MatrixVType;\n    typedef typename internal::plain_diag_type<MatrixType, RealScalar>::type SingularValuesType;\n    typedef typename internal::plain_row_type<MatrixType>::type RowType;\n    typedef typename internal::plain_col_type<MatrixType>::type ColType;\n    typedef Matrix<Scalar, DiagSizeAtCompileTime, DiagSizeAtCompileTime,\n                   MatrixOptions, MaxDiagSizeAtCompileTime, MaxDiagSizeAtCompileTime>\n            WorkMatrixType;\n\n    /** \\brief Default Constructor.\n      *\n      * The default constructor is useful in cases in which the user intends to\n      * perform decompositions via JacobiSVD::compute(const MatrixType&).\n      */\n    JacobiSVD()\n      : SVDBase<_MatrixType>::SVDBase()\n    {}\n\n\n    /** \\brief Default Constructor with memory preallocation\n      *\n      * Like the default constructor but with preallocation of the internal data\n      * according to the specified problem size.\n      * \\sa JacobiSVD()\n      */\n    JacobiSVD(Index rows, Index cols, unsigned int computationOptions = 0)\n      : SVDBase<_MatrixType>::SVDBase() \n    {\n      allocate(rows, cols, computationOptions);\n    }\n\n    /** \\brief Constructor performing the decomposition of given matrix.\n     *\n     * \\param matrix the matrix to decompose\n     * \\param computationOptions optional parameter allowing to specify if you want full or thin U or V unitaries to be computed.\n     *                           By default, none is computed. This is a bit-field, the possible bits are #ComputeFullU, #ComputeThinU,\n     *                           #ComputeFullV, #ComputeThinV.\n     *\n     * Thin unitaries are only available if your matrix type has a Dynamic number of columns (for example MatrixXf). They also are not\n     * available with the (non-default) FullPivHouseholderQR preconditioner.\n     */\n    JacobiSVD(const MatrixType& matrix, unsigned int computationOptions = 0)\n      : SVDBase<_MatrixType>::SVDBase()\n    {\n      compute(matrix, computationOptions);\n    }\n\n    /** \\brief Method performing the decomposition of given matrix using custom options.\n     *\n     * \\param matrix the matrix to decompose\n     * \\param computationOptions optional parameter allowing to specify if you want full or thin U or V unitaries to be computed.\n     *                           By default, none is computed. This is a bit-field, the possible bits are #ComputeFullU, #ComputeThinU,\n     *                           #ComputeFullV, #ComputeThinV.\n     *\n     * Thin unitaries are only available if your matrix type has a Dynamic number of columns (for example MatrixXf). They also are not\n     * available with the (non-default) FullPivHouseholderQR preconditioner.\n     */\n    SVDBase<MatrixType>& compute(const MatrixType& matrix, unsigned int computationOptions);\n\n    /** \\brief Method performing the decomposition of given matrix using current options.\n     *\n     * \\param matrix the matrix to decompose\n     *\n     * This method uses the current \\a computationOptions, as already passed to the constructor or to compute(const MatrixType&, unsigned int).\n     */\n    SVDBase<MatrixType>& compute(const MatrixType& matrix)\n    {\n      return compute(matrix, this->m_computationOptions);\n    }\n    \n    /** \\returns a (least squares) solution of \\f$ A x = b \\f$ using the current SVD decomposition of A.\n      *\n      * \\param b the right-hand-side of the equation to solve.\n      *\n      * \\note Solving requires both U and V to be computed. Thin U and V are enough, there is no need for full U or V.\n      *\n      * \\note SVD solving is implicitly least-squares. Thus, this method serves both purposes of exact solving and least-squares solving.\n      * In other words, the returned solution is guaranteed to minimize the Euclidean norm \\f$ \\Vert A x - b \\Vert \\f$.\n      */\n    template<typename Rhs>\n    inline const internal::solve_retval<JacobiSVD, Rhs>\n    solve(const MatrixBase<Rhs>& b) const\n    {\n      eigen_assert(this->m_isInitialized && \"JacobiSVD is not initialized.\");\n      eigen_assert(SVDBase<MatrixType>::computeU() && SVDBase<MatrixType>::computeV() && \"JacobiSVD::solve() requires both unitaries U and V to be computed (thin unitaries suffice).\");\n      return internal::solve_retval<JacobiSVD, Rhs>(*this, b.derived());\n    }\n\n    \n\n  private:\n    void allocate(Index rows, Index cols, unsigned int computationOptions);\n\n  protected:\n    WorkMatrixType m_workMatrix;\n   \n    template<typename __MatrixType, int _QRPreconditioner, bool _IsComplex>\n    friend struct internal::svd_precondition_2x2_block_to_be_real;\n    template<typename __MatrixType, int _QRPreconditioner, int _Case, bool _DoAnything>\n    friend struct internal::qr_preconditioner_impl;\n\n    internal::qr_preconditioner_impl<MatrixType, QRPreconditioner, internal::PreconditionIfMoreColsThanRows> m_qr_precond_morecols;\n    internal::qr_preconditioner_impl<MatrixType, QRPreconditioner, internal::PreconditionIfMoreRowsThanCols> m_qr_precond_morerows;\n};\n\ntemplate<typename MatrixType, int QRPreconditioner>\nvoid JacobiSVD<MatrixType, QRPreconditioner>::allocate(Index rows, Index cols, unsigned int computationOptions)\n{\n  if (SVDBase<MatrixType>::allocate(rows, cols, computationOptions)) return;\n\n  if (QRPreconditioner == FullPivHouseholderQRPreconditioner)\n  {\n      eigen_assert(!(this->m_computeThinU || this->m_computeThinV) &&\n              \"JacobiSVD: can't compute thin U or thin V with the FullPivHouseholderQR preconditioner. \"\n              \"Use the ColPivHouseholderQR preconditioner instead.\");\n  }\n\n  m_workMatrix.resize(this->m_diagSize, this->m_diagSize);\n  \n  if(this->m_cols>this->m_rows) m_qr_precond_morecols.allocate(*this);\n  if(this->m_rows>this->m_cols) m_qr_precond_morerows.allocate(*this);\n}\n\ntemplate<typename MatrixType, int QRPreconditioner>\nSVDBase<MatrixType>&\nJacobiSVD<MatrixType, QRPreconditioner>::compute(const MatrixType& matrix, unsigned int computationOptions)\n{\n  using std::abs;\n  allocate(matrix.rows(), matrix.cols(), computationOptions);\n\n  // currently we stop when we reach precision 2*epsilon as the last bit of precision can require an unreasonable number of iterations,\n  // only worsening the precision of U and V as we accumulate more rotations\n  const RealScalar precision = RealScalar(2) * NumTraits<Scalar>::epsilon();\n\n  // limit for very small denormal numbers to be considered zero in order to avoid infinite loops (see bug 286)\n  const RealScalar considerAsZero = RealScalar(2) * std::numeric_limits<RealScalar>::denorm_min();\n\n  /*** step 1. The R-SVD step: we use a QR decomposition to reduce to the case of a square matrix */\n\n  if(!m_qr_precond_morecols.run(*this, matrix) && !m_qr_precond_morerows.run(*this, matrix))\n  {\n    m_workMatrix = matrix.block(0,0,this->m_diagSize,this->m_diagSize);\n    if(this->m_computeFullU) this->m_matrixU.setIdentity(this->m_rows,this->m_rows);\n    if(this->m_computeThinU) this->m_matrixU.setIdentity(this->m_rows,this->m_diagSize);\n    if(this->m_computeFullV) this->m_matrixV.setIdentity(this->m_cols,this->m_cols);\n    if(this->m_computeThinV) this->m_matrixV.setIdentity(this->m_cols, this->m_diagSize);\n  }\n\n  /*** step 2. The main Jacobi SVD iteration. ***/\n\n  bool finished = false;\n  while(!finished)\n  {\n    finished = true;\n\n    // do a sweep: for all index pairs (p,q), perform SVD of the corresponding 2x2 sub-matrix\n\n    for(Index p = 1; p < this->m_diagSize; ++p)\n    {\n      for(Index q = 0; q < p; ++q)\n      {\n        // if this 2x2 sub-matrix is not diagonal already...\n        // notice that this comparison will evaluate to false if any NaN is involved, ensuring that NaN's don't\n        // keep us iterating forever. Similarly, small denormal numbers are considered zero.\n        using std::max;\n        RealScalar threshold = (max)(considerAsZero, precision * (max)(abs(m_workMatrix.coeff(p,p)),\n                                                                       abs(m_workMatrix.coeff(q,q))));\n        if((max)(abs(m_workMatrix.coeff(p,q)),abs(m_workMatrix.coeff(q,p))) > threshold)\n        {\n          finished = false;\n\n          // perform SVD decomposition of 2x2 sub-matrix corresponding to indices p,q to make it diagonal\n          internal::svd_precondition_2x2_block_to_be_real<MatrixType, QRPreconditioner>::run(m_workMatrix, *this, p, q);\n          JacobiRotation<RealScalar> j_left, j_right;\n          internal::real_2x2_jacobi_svd(m_workMatrix, p, q, &j_left, &j_right);\n\n          // accumulate resulting Jacobi rotations\n          m_workMatrix.applyOnTheLeft(p,q,j_left);\n          if(SVDBase<MatrixType>::computeU()) this->m_matrixU.applyOnTheRight(p,q,j_left.transpose());\n\n          m_workMatrix.applyOnTheRight(p,q,j_right);\n          if(SVDBase<MatrixType>::computeV()) this->m_matrixV.applyOnTheRight(p,q,j_right);\n        }\n      }\n    }\n  }\n\n  /*** step 3. The work matrix is now diagonal, so ensure it's positive so its diagonal entries are the singular values ***/\n\n  for(Index i = 0; i < this->m_diagSize; ++i)\n  {\n    RealScalar a = abs(m_workMatrix.coeff(i,i));\n    this->m_singularValues.coeffRef(i) = a;\n    if(SVDBase<MatrixType>::computeU() && (a!=RealScalar(0))) this->m_matrixU.col(i) *= this->m_workMatrix.coeff(i,i)/a;\n  }\n\n  /*** step 4. Sort singular values in descending order and compute the number of nonzero singular values ***/\n\n  this->m_nonzeroSingularValues = this->m_diagSize;\n  for(Index i = 0; i < this->m_diagSize; i++)\n  {\n    Index pos;\n    RealScalar maxRemainingSingularValue = this->m_singularValues.tail(this->m_diagSize-i).maxCoeff(&pos);\n    if(maxRemainingSingularValue == RealScalar(0))\n    {\n      this->m_nonzeroSingularValues = i;\n      break;\n    }\n    if(pos)\n    {\n      pos += i;\n      std::swap(this->m_singularValues.coeffRef(i), this->m_singularValues.coeffRef(pos));\n      if(SVDBase<MatrixType>::computeU()) this->m_matrixU.col(pos).swap(this->m_matrixU.col(i));\n      if(SVDBase<MatrixType>::computeV()) this->m_matrixV.col(pos).swap(this->m_matrixV.col(i));\n    }\n  }\n\n  this->m_isInitialized = true;\n  return *this;\n}\n\nnamespace internal {\ntemplate<typename _MatrixType, int QRPreconditioner, typename Rhs>\nstruct solve_retval<JacobiSVD<_MatrixType, QRPreconditioner>, Rhs>\n  : solve_retval_base<JacobiSVD<_MatrixType, QRPreconditioner>, Rhs>\n{\n  typedef JacobiSVD<_MatrixType, QRPreconditioner> JacobiSVDType;\n  EIGEN_MAKE_SOLVE_HELPERS(JacobiSVDType,Rhs)\n\n  template<typename Dest> void evalTo(Dest& dst) const\n  {\n    eigen_assert(rhs().rows() == dec().rows());\n\n    // A = U S V^*\n    // So A^{-1} = V S^{-1} U^*\n\n    Index diagSize = (std::min)(dec().rows(), dec().cols());\n    typename JacobiSVDType::SingularValuesType invertedSingVals(diagSize);\n\n    Index nonzeroSingVals = dec().nonzeroSingularValues();\n    invertedSingVals.head(nonzeroSingVals) = dec().singularValues().head(nonzeroSingVals).array().inverse();\n    invertedSingVals.tail(diagSize - nonzeroSingVals).setZero();\n\n    dst = dec().matrixV().leftCols(diagSize)\n        * invertedSingVals.asDiagonal()\n        * dec().matrixU().leftCols(diagSize).adjoint()\n        * rhs();\n  }\n};\n} // end namespace internal\n\n/** \\svd_module\n  *\n  * \\return the singular value decomposition of \\c *this computed by two-sided\n  * Jacobi transformations.\n  *\n  * \\sa class JacobiSVD\n  */\ntemplate<typename Derived>\nJacobiSVD<typename MatrixBase<Derived>::PlainObject>\nMatrixBase<Derived>::jacobiSvd(unsigned int computationOptions) const\n{\n  return JacobiSVD<PlainObject>(*this, computationOptions);\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_JACOBISVD_H\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/SVD/SVDBase.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009-2010 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// Copyright (C) 2013 Gauthier Brun <brun.gauthier@gmail.com>\n// Copyright (C) 2013 Nicolas Carre <nicolas.carre@ensimag.fr>\n// Copyright (C) 2013 Jean Ceccato <jean.ceccato@ensimag.fr>\n// Copyright (C) 2013 Pierre Zoppitelli <pierre.zoppitelli@ensimag.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SVD_H\n#define EIGEN_SVD_H\n\nnamespace Eigen {\n/** \\ingroup SVD_Module\n *\n *\n * \\class SVDBase\n *\n * \\brief Mother class of SVD classes algorithms\n *\n * \\param MatrixType the type of the matrix of which we are computing the SVD decomposition\n * SVD decomposition consists in decomposing any n-by-p matrix \\a A as a product\n *   \\f[ A = U S V^* \\f]\n * where \\a U is a n-by-n unitary, \\a V is a p-by-p unitary, and \\a S is a n-by-p real positive matrix which is zero outside of its main diagonal;\n * the diagonal entries of S are known as the \\em singular \\em values of \\a A and the columns of \\a U and \\a V are known as the left\n * and right \\em singular \\em vectors of \\a A respectively.\n *\n * Singular values are always sorted in decreasing order.\n *\n * \n * You can ask for only \\em thin \\a U or \\a V to be computed, meaning the following. In case of a rectangular n-by-p matrix, letting \\a m be the\n * smaller value among \\a n and \\a p, there are only \\a m singular vectors; the remaining columns of \\a U and \\a V do not correspond to actual\n * singular vectors. Asking for \\em thin \\a U or \\a V means asking for only their \\a m first columns to be formed. So \\a U is then a n-by-m matrix,\n * and \\a V is then a p-by-m matrix. Notice that thin \\a U and \\a V are all you need for (least squares) solving.\n *  \n * If the input matrix has inf or nan coefficients, the result of the computation is undefined, but the computation is guaranteed to\n * terminate in finite (and reasonable) time.\n * \\sa MatrixBase::genericSvd()\n */\ntemplate<typename _MatrixType> \nclass SVDBase\n{\n\npublic:\n  typedef _MatrixType MatrixType;\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename NumTraits<typename MatrixType::Scalar>::Real RealScalar;\n  typedef typename MatrixType::Index Index;\n  enum {\n    RowsAtCompileTime = MatrixType::RowsAtCompileTime,\n    ColsAtCompileTime = MatrixType::ColsAtCompileTime,\n    DiagSizeAtCompileTime = EIGEN_SIZE_MIN_PREFER_DYNAMIC(RowsAtCompileTime,ColsAtCompileTime),\n    MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,\n    MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime,\n    MaxDiagSizeAtCompileTime = EIGEN_SIZE_MIN_PREFER_FIXED(MaxRowsAtCompileTime,MaxColsAtCompileTime),\n    MatrixOptions = MatrixType::Options\n  };\n\n  typedef Matrix<Scalar, RowsAtCompileTime, RowsAtCompileTime,\n\t\t MatrixOptions, MaxRowsAtCompileTime, MaxRowsAtCompileTime>\n  MatrixUType;\n  typedef Matrix<Scalar, ColsAtCompileTime, ColsAtCompileTime,\n\t\t MatrixOptions, MaxColsAtCompileTime, MaxColsAtCompileTime>\n  MatrixVType;\n  typedef typename internal::plain_diag_type<MatrixType, RealScalar>::type SingularValuesType;\n  typedef typename internal::plain_row_type<MatrixType>::type RowType;\n  typedef typename internal::plain_col_type<MatrixType>::type ColType;\n  typedef Matrix<Scalar, DiagSizeAtCompileTime, DiagSizeAtCompileTime,\n\t\t MatrixOptions, MaxDiagSizeAtCompileTime, MaxDiagSizeAtCompileTime>\n  WorkMatrixType;\n\t\n\n\n\n  /** \\brief Method performing the decomposition of given matrix using custom options.\n   *\n   * \\param matrix the matrix to decompose\n   * \\param computationOptions optional parameter allowing to specify if you want full or thin U or V unitaries to be computed.\n   *                           By default, none is computed. This is a bit-field, the possible bits are #ComputeFullU, #ComputeThinU,\n   *                           #ComputeFullV, #ComputeThinV.\n   *\n   * Thin unitaries are only available if your matrix type has a Dynamic number of columns (for example MatrixXf). They also are not\n   * available with the (non-default) FullPivHouseholderQR preconditioner.\n   */\n  SVDBase& compute(const MatrixType& matrix, unsigned int computationOptions);\n\n  /** \\brief Method performing the decomposition of given matrix using current options.\n   *\n   * \\param matrix the matrix to decompose\n   *\n   * This method uses the current \\a computationOptions, as already passed to the constructor or to compute(const MatrixType&, unsigned int).\n   */\n  //virtual SVDBase& compute(const MatrixType& matrix) = 0;\n  SVDBase& compute(const MatrixType& matrix);\n\n  /** \\returns the \\a U matrix.\n   *\n   * For the SVDBase decomposition of a n-by-p matrix, letting \\a m be the minimum of \\a n and \\a p,\n   * the U matrix is n-by-n if you asked for #ComputeFullU, and is n-by-m if you asked for #ComputeThinU.\n   *\n   * The \\a m first columns of \\a U are the left singular vectors of the matrix being decomposed.\n   *\n   * This method asserts that you asked for \\a U to be computed.\n   */\n  const MatrixUType& matrixU() const\n  {\n    eigen_assert(m_isInitialized && \"SVD is not initialized.\");\n    eigen_assert(computeU() && \"This SVD decomposition didn't compute U. Did you ask for it?\");\n    return m_matrixU;\n  }\n\n  /** \\returns the \\a V matrix.\n   *\n   * For the SVD decomposition of a n-by-p matrix, letting \\a m be the minimum of \\a n and \\a p,\n   * the V matrix is p-by-p if you asked for #ComputeFullV, and is p-by-m if you asked for ComputeThinV.\n   *\n   * The \\a m first columns of \\a V are the right singular vectors of the matrix being decomposed.\n   *\n   * This method asserts that you asked for \\a V to be computed.\n   */\n  const MatrixVType& matrixV() const\n  {\n    eigen_assert(m_isInitialized && \"SVD is not initialized.\");\n    eigen_assert(computeV() && \"This SVD decomposition didn't compute V. Did you ask for it?\");\n    return m_matrixV;\n  }\n\n  /** \\returns the vector of singular values.\n   *\n   * For the SVD decomposition of a n-by-p matrix, letting \\a m be the minimum of \\a n and \\a p, the\n   * returned vector has size \\a m.  Singular values are always sorted in decreasing order.\n   */\n  const SingularValuesType& singularValues() const\n  {\n    eigen_assert(m_isInitialized && \"SVD is not initialized.\");\n    return m_singularValues;\n  }\n\n  \n\n  /** \\returns the number of singular values that are not exactly 0 */\n  Index nonzeroSingularValues() const\n  {\n    eigen_assert(m_isInitialized && \"SVD is not initialized.\");\n    return m_nonzeroSingularValues;\n  }\n\n\n  /** \\returns true if \\a U (full or thin) is asked for in this SVD decomposition */\n  inline bool computeU() const { return m_computeFullU || m_computeThinU; }\n  /** \\returns true if \\a V (full or thin) is asked for in this SVD decomposition */\n  inline bool computeV() const { return m_computeFullV || m_computeThinV; }\n\n\n  inline Index rows() const { return m_rows; }\n  inline Index cols() const { return m_cols; }\n\n\nprotected:\n  // return true if already allocated\n  bool allocate(Index rows, Index cols, unsigned int computationOptions) ;\n\n  MatrixUType m_matrixU;\n  MatrixVType m_matrixV;\n  SingularValuesType m_singularValues;\n  bool m_isInitialized, m_isAllocated;\n  bool m_computeFullU, m_computeThinU;\n  bool m_computeFullV, m_computeThinV;\n  unsigned int m_computationOptions;\n  Index m_nonzeroSingularValues, m_rows, m_cols, m_diagSize;\n\n\n  /** \\brief Default Constructor.\n   *\n   * Default constructor of SVDBase\n   */\n  SVDBase()\n    : m_isInitialized(false),\n      m_isAllocated(false),\n      m_computationOptions(0),\n      m_rows(-1), m_cols(-1)\n  {}\n\n\n};\n\n\ntemplate<typename MatrixType>\nbool SVDBase<MatrixType>::allocate(Index rows, Index cols, unsigned int computationOptions)\n{\n  eigen_assert(rows >= 0 && cols >= 0);\n\n  if (m_isAllocated &&\n      rows == m_rows &&\n      cols == m_cols &&\n      computationOptions == m_computationOptions)\n  {\n    return true;\n  }\n\n  m_rows = rows;\n  m_cols = cols;\n  m_isInitialized = false;\n  m_isAllocated = true;\n  m_computationOptions = computationOptions;\n  m_computeFullU = (computationOptions & ComputeFullU) != 0;\n  m_computeThinU = (computationOptions & ComputeThinU) != 0;\n  m_computeFullV = (computationOptions & ComputeFullV) != 0;\n  m_computeThinV = (computationOptions & ComputeThinV) != 0;\n  eigen_assert(!(m_computeFullU && m_computeThinU) && \"SVDBase: you can't ask for both full and thin U\");\n  eigen_assert(!(m_computeFullV && m_computeThinV) && \"SVDBase: you can't ask for both full and thin V\");\n  eigen_assert(EIGEN_IMPLIES(m_computeThinU || m_computeThinV, MatrixType::ColsAtCompileTime==Dynamic) &&\n\t       \"SVDBase: thin U and V are only available when your matrix has a dynamic number of columns.\");\n\n  m_diagSize = (std::min)(m_rows, m_cols);\n  m_singularValues.resize(m_diagSize);\n  if(RowsAtCompileTime==Dynamic)\n    m_matrixU.resize(m_rows, m_computeFullU ? m_rows\n\t\t     : m_computeThinU ? m_diagSize\n\t\t     : 0);\n  if(ColsAtCompileTime==Dynamic)\n    m_matrixV.resize(m_cols, m_computeFullV ? m_cols\n\t\t     : m_computeThinV ? m_diagSize\n\t\t     : 0);\n\n  return false;\n}\n\n}// end namespace\n\n#endif // EIGEN_SVD_H\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/SVD/TODOBdcsvd.txt",
    "content": "TO DO LIST\n\n\n\n(optional optimization) - do all the allocations in the allocate part \n                        - support static matrices\n                        - return a error at compilation time when using integer matrices (int, long, std::complex<int>, ...)\n\nto finish the algorithm :\n\t\t\t-implement the last part of the algorithm as described on the reference paper. \n\t\t\t    You may find more information on that part on this paper\n\n\t\t\t-to replace the call to JacobiSVD at the end of the divide algorithm, just after the call to \n\t\t\t    deflation.\n\n(suggested step by step resolution)\n                       0) comment the call to Jacobi in the last part of the divide method and everything right after\n                               until the end of the method. What is commented can be a guideline to steps 3) 4) and 6)\n                       1) solve the secular equation (Characteristic equation) on the values that are not null (zi!=0 and di!=0), after the deflation\n                               wich should be uncommented in the divide method\n                       2) remember the values of the singular values that are already computed (zi=0)\n                       3) assign the singular values found in m_computed at the right places (with the ones found in step 2) )\n                               in decreasing order\n                       4) set the firstcol to zero (except the first element) in m_computed\n                       5) compute all the singular vectors when CompV is set to true and only the left vectors when\n                               CompV is set to false\n                       6) multiply naiveU and naiveV to the right by the matrices found, only naiveU when CompV is set to\n                               false, /!\\ if CompU is false NaiveU has only 2 rows\n                       7) delete everything commented in step 0)\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/SVD/doneInBDCSVD.txt",
    "content": "This unsupported package is about a divide and conquer algorithm to compute SVD.\n\nThe implementation follows as closely as possible the following reference paper : \nhttp://www.cs.yale.edu/publications/techreports/tr933.pdf\n\nThe code documentation uses the same names for variables as the reference paper. The code, deflation included, is\nworking  but there are a few things that could be optimised as explained in the TODOBdsvd. \n\nIn the code comments were put at the line where would be the third step of the algorithm so one could simply add the call \nof a function doing the last part of the algorithm and that would not require any knowledge of the part we implemented.\n\nIn the TODOBdcsvd we explain what is the main difficulty of the last part and suggest a reference paper to help solve it.\n\nThe implemented has trouble with fixed size matrices. \n\nIn the actual implementation, it returns matrices of zero when ask to do a svd on an int matrix. \n\n\nPaper for the third part:\nhttp://www.stat.uchicago.edu/~lekheng/courses/302/classics/greengard-rokhlin.pdf\n\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/Skyline/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_Skyline_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_Skyline_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/unsupported/Eigen/src/Skyline COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/Skyline/SkylineInplaceLU.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Guillaume Saupin <guillaume.saupin@cea.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SKYLINEINPLACELU_H\n#define EIGEN_SKYLINEINPLACELU_H\n\nnamespace Eigen { \n\n/** \\ingroup Skyline_Module\n *\n * \\class SkylineInplaceLU\n *\n * \\brief Inplace LU decomposition of a skyline matrix and associated features\n *\n * \\param MatrixType the type of the matrix of which we are computing the LU factorization\n *\n */\ntemplate<typename MatrixType>\nclass SkylineInplaceLU {\nprotected:\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename MatrixType::Index Index;\n    \n    typedef typename NumTraits<typename MatrixType::Scalar>::Real RealScalar;\n\npublic:\n\n    /** Creates a LU object and compute the respective factorization of \\a matrix using\n     * flags \\a flags. */\n    SkylineInplaceLU(MatrixType& matrix, int flags = 0)\n    : /*m_matrix(matrix.rows(), matrix.cols()),*/ m_flags(flags), m_status(0), m_lu(matrix) {\n        m_precision = RealScalar(0.1) * Eigen::dummy_precision<RealScalar > ();\n        m_lu.IsRowMajor ? computeRowMajor() : compute();\n    }\n\n    /** Sets the relative threshold value used to prune zero coefficients during the decomposition.\n     *\n     * Setting a value greater than zero speeds up computation, and yields to an imcomplete\n     * factorization with fewer non zero coefficients. Such approximate factors are especially\n     * useful to initialize an iterative solver.\n     *\n     * Note that the exact meaning of this parameter might depends on the actual\n     * backend. Moreover, not all backends support this feature.\n     *\n     * \\sa precision() */\n    void setPrecision(RealScalar v) {\n        m_precision = v;\n    }\n\n    /** \\returns the current precision.\n     *\n     * \\sa setPrecision() */\n    RealScalar precision() const {\n        return m_precision;\n    }\n\n    /** Sets the flags. Possible values are:\n     *  - CompleteFactorization\n     *  - IncompleteFactorization\n     *  - MemoryEfficient\n     *  - one of the ordering methods\n     *  - etc...\n     *\n     * \\sa flags() */\n    void setFlags(int f) {\n        m_flags = f;\n    }\n\n    /** \\returns the current flags */\n    int flags() const {\n        return m_flags;\n    }\n\n    void setOrderingMethod(int m) {\n        m_flags = m;\n    }\n\n    int orderingMethod() const {\n        return m_flags;\n    }\n\n    /** Computes/re-computes the LU factorization */\n    void compute();\n    void computeRowMajor();\n\n    /** \\returns the lower triangular matrix L */\n    //inline const MatrixType& matrixL() const { return m_matrixL; }\n\n    /** \\returns the upper triangular matrix U */\n    //inline const MatrixType& matrixU() const { return m_matrixU; }\n\n    template<typename BDerived, typename XDerived>\n    bool solve(const MatrixBase<BDerived> &b, MatrixBase<XDerived>* x,\n            const int transposed = 0) const;\n\n    /** \\returns true if the factorization succeeded */\n    inline bool succeeded(void) const {\n        return m_succeeded;\n    }\n\nprotected:\n    RealScalar m_precision;\n    int m_flags;\n    mutable int m_status;\n    bool m_succeeded;\n    MatrixType& m_lu;\n};\n\n/** Computes / recomputes the in place LU decomposition of the SkylineInplaceLU.\n * using the default algorithm.\n */\ntemplate<typename MatrixType>\n//template<typename _Scalar>\nvoid SkylineInplaceLU<MatrixType>::compute() {\n    const size_t rows = m_lu.rows();\n    const size_t cols = m_lu.cols();\n\n    eigen_assert(rows == cols && \"We do not (yet) support rectangular LU.\");\n    eigen_assert(!m_lu.IsRowMajor && \"LU decomposition does not work with rowMajor Storage\");\n\n    for (Index row = 0; row < rows; row++) {\n        const double pivot = m_lu.coeffDiag(row);\n\n        //Lower matrix Columns update\n        const Index& col = row;\n        for (typename MatrixType::InnerLowerIterator lIt(m_lu, col); lIt; ++lIt) {\n            lIt.valueRef() /= pivot;\n        }\n\n        //Upper matrix update -> contiguous memory access\n        typename MatrixType::InnerLowerIterator lIt(m_lu, col);\n        for (Index rrow = row + 1; rrow < m_lu.rows(); rrow++) {\n            typename MatrixType::InnerUpperIterator uItPivot(m_lu, row);\n            typename MatrixType::InnerUpperIterator uIt(m_lu, rrow);\n            const double coef = lIt.value();\n\n            uItPivot += (rrow - row - 1);\n\n            //update upper part  -> contiguous memory access\n            for (++uItPivot; uIt && uItPivot;) {\n                uIt.valueRef() -= uItPivot.value() * coef;\n\n                ++uIt;\n                ++uItPivot;\n            }\n            ++lIt;\n        }\n\n        //Upper matrix update -> non contiguous memory access\n        typename MatrixType::InnerLowerIterator lIt3(m_lu, col);\n        for (Index rrow = row + 1; rrow < m_lu.rows(); rrow++) {\n            typename MatrixType::InnerUpperIterator uItPivot(m_lu, row);\n            const double coef = lIt3.value();\n\n            //update lower part ->  non contiguous memory access\n            for (Index i = 0; i < rrow - row - 1; i++) {\n                m_lu.coeffRefLower(rrow, row + i + 1) -= uItPivot.value() * coef;\n                ++uItPivot;\n            }\n            ++lIt3;\n        }\n        //update diag -> contiguous\n        typename MatrixType::InnerLowerIterator lIt2(m_lu, col);\n        for (Index rrow = row + 1; rrow < m_lu.rows(); rrow++) {\n\n            typename MatrixType::InnerUpperIterator uItPivot(m_lu, row);\n            typename MatrixType::InnerUpperIterator uIt(m_lu, rrow);\n            const double coef = lIt2.value();\n\n            uItPivot += (rrow - row - 1);\n            m_lu.coeffRefDiag(rrow) -= uItPivot.value() * coef;\n            ++lIt2;\n        }\n    }\n}\n\ntemplate<typename MatrixType>\nvoid SkylineInplaceLU<MatrixType>::computeRowMajor() {\n    const size_t rows = m_lu.rows();\n    const size_t cols = m_lu.cols();\n\n    eigen_assert(rows == cols && \"We do not (yet) support rectangular LU.\");\n    eigen_assert(m_lu.IsRowMajor && \"You're trying to apply rowMajor decomposition on a ColMajor matrix !\");\n\n    for (Index row = 0; row < rows; row++) {\n        typename MatrixType::InnerLowerIterator llIt(m_lu, row);\n\n\n        for (Index col = llIt.col(); col < row; col++) {\n            if (m_lu.coeffExistLower(row, col)) {\n                const double diag = m_lu.coeffDiag(col);\n\n                typename MatrixType::InnerLowerIterator lIt(m_lu, row);\n                typename MatrixType::InnerUpperIterator uIt(m_lu, col);\n\n\n                const Index offset = lIt.col() - uIt.row();\n\n\n                Index stop = offset > 0 ? col - lIt.col() : col - uIt.row();\n\n                //#define VECTORIZE\n#ifdef VECTORIZE\n                Map<VectorXd > rowVal(lIt.valuePtr() + (offset > 0 ? 0 : -offset), stop);\n                Map<VectorXd > colVal(uIt.valuePtr() + (offset > 0 ? offset : 0), stop);\n\n\n                Scalar newCoeff = m_lu.coeffLower(row, col) - rowVal.dot(colVal);\n#else\n                if (offset > 0) //Skip zero value of lIt\n                    uIt += offset;\n                else //Skip zero values of uIt\n                    lIt += -offset;\n                Scalar newCoeff = m_lu.coeffLower(row, col);\n\n                for (Index k = 0; k < stop; ++k) {\n                    const Scalar tmp = newCoeff;\n                    newCoeff = tmp - lIt.value() * uIt.value();\n                    ++lIt;\n                    ++uIt;\n                }\n#endif\n\n                m_lu.coeffRefLower(row, col) = newCoeff / diag;\n            }\n        }\n\n        //Upper matrix update\n        const Index col = row;\n        typename MatrixType::InnerUpperIterator uuIt(m_lu, col);\n        for (Index rrow = uuIt.row(); rrow < col; rrow++) {\n\n            typename MatrixType::InnerLowerIterator lIt(m_lu, rrow);\n            typename MatrixType::InnerUpperIterator uIt(m_lu, col);\n            const Index offset = lIt.col() - uIt.row();\n\n            Index stop = offset > 0 ? rrow - lIt.col() : rrow - uIt.row();\n\n#ifdef VECTORIZE\n            Map<VectorXd > rowVal(lIt.valuePtr() + (offset > 0 ? 0 : -offset), stop);\n            Map<VectorXd > colVal(uIt.valuePtr() + (offset > 0 ? offset : 0), stop);\n\n            Scalar newCoeff = m_lu.coeffUpper(rrow, col) - rowVal.dot(colVal);\n#else\n            if (offset > 0) //Skip zero value of lIt\n                uIt += offset;\n            else //Skip zero values of uIt\n                lIt += -offset;\n            Scalar newCoeff = m_lu.coeffUpper(rrow, col);\n            for (Index k = 0; k < stop; ++k) {\n                const Scalar tmp = newCoeff;\n                newCoeff = tmp - lIt.value() * uIt.value();\n\n                ++lIt;\n                ++uIt;\n            }\n#endif\n            m_lu.coeffRefUpper(rrow, col) = newCoeff;\n        }\n\n\n        //Diag matrix update\n        typename MatrixType::InnerLowerIterator lIt(m_lu, row);\n        typename MatrixType::InnerUpperIterator uIt(m_lu, row);\n\n        const Index offset = lIt.col() - uIt.row();\n\n\n        Index stop = offset > 0 ? lIt.size() : uIt.size();\n#ifdef VECTORIZE\n        Map<VectorXd > rowVal(lIt.valuePtr() + (offset > 0 ? 0 : -offset), stop);\n        Map<VectorXd > colVal(uIt.valuePtr() + (offset > 0 ? offset : 0), stop);\n        Scalar newCoeff = m_lu.coeffDiag(row) - rowVal.dot(colVal);\n#else\n        if (offset > 0) //Skip zero value of lIt\n            uIt += offset;\n        else //Skip zero values of uIt\n            lIt += -offset;\n        Scalar newCoeff = m_lu.coeffDiag(row);\n        for (Index k = 0; k < stop; ++k) {\n            const Scalar tmp = newCoeff;\n            newCoeff = tmp - lIt.value() * uIt.value();\n            ++lIt;\n            ++uIt;\n        }\n#endif\n        m_lu.coeffRefDiag(row) = newCoeff;\n    }\n}\n\n/** Computes *x = U^-1 L^-1 b\n *\n * If \\a transpose is set to SvTranspose or SvAdjoint, the solution\n * of the transposed/adjoint system is computed instead.\n *\n * Not all backends implement the solution of the transposed or\n * adjoint system.\n */\ntemplate<typename MatrixType>\ntemplate<typename BDerived, typename XDerived>\nbool SkylineInplaceLU<MatrixType>::solve(const MatrixBase<BDerived> &b, MatrixBase<XDerived>* x, const int transposed) const {\n    const size_t rows = m_lu.rows();\n    const size_t cols = m_lu.cols();\n\n\n    for (Index row = 0; row < rows; row++) {\n        x->coeffRef(row) = b.coeff(row);\n        Scalar newVal = x->coeff(row);\n        typename MatrixType::InnerLowerIterator lIt(m_lu, row);\n\n        Index col = lIt.col();\n        while (lIt.col() < row) {\n\n            newVal -= x->coeff(col++) * lIt.value();\n            ++lIt;\n        }\n\n        x->coeffRef(row) = newVal;\n    }\n\n\n    for (Index col = rows - 1; col > 0; col--) {\n        x->coeffRef(col) = x->coeff(col) / m_lu.coeffDiag(col);\n\n        const Scalar x_col = x->coeff(col);\n\n        typename MatrixType::InnerUpperIterator uIt(m_lu, col);\n        uIt += uIt.size()-1;\n\n\n        while (uIt) {\n            x->coeffRef(uIt.row()) -= x_col * uIt.value();\n            //TODO : introduce --operator\n            uIt += -1;\n        }\n\n\n    }\n    x->coeffRef(0) = x->coeff(0) / m_lu.coeffDiag(0);\n\n    return true;\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_SKYLINELU_H\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/Skyline/SkylineMatrix.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Guillaume Saupin <guillaume.saupin@cea.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SKYLINEMATRIX_H\n#define EIGEN_SKYLINEMATRIX_H\n\n#include \"SkylineStorage.h\"\n#include \"SkylineMatrixBase.h\"\n\nnamespace Eigen { \n\n/** \\ingroup Skyline_Module\n *\n * \\class SkylineMatrix\n *\n * \\brief The main skyline matrix class\n *\n * This class implements a skyline matrix using the very uncommon storage\n * scheme.\n *\n * \\param _Scalar the scalar type, i.e. the type of the coefficients\n * \\param _Options Union of bit flags controlling the storage scheme. Currently the only possibility\n *                 is RowMajor. The default is 0 which means column-major.\n *\n *\n */\nnamespace internal {\ntemplate<typename _Scalar, int _Options>\nstruct traits<SkylineMatrix<_Scalar, _Options> > {\n    typedef _Scalar Scalar;\n    typedef Sparse StorageKind;\n\n    enum {\n        RowsAtCompileTime = Dynamic,\n        ColsAtCompileTime = Dynamic,\n        MaxRowsAtCompileTime = Dynamic,\n        MaxColsAtCompileTime = Dynamic,\n        Flags = SkylineBit | _Options,\n        CoeffReadCost = NumTraits<Scalar>::ReadCost,\n    };\n};\n}\n\ntemplate<typename _Scalar, int _Options>\nclass SkylineMatrix\n: public SkylineMatrixBase<SkylineMatrix<_Scalar, _Options> > {\npublic:\n    EIGEN_SKYLINE_GENERIC_PUBLIC_INTERFACE(SkylineMatrix)\n    EIGEN_SKYLINE_INHERIT_ASSIGNMENT_OPERATOR(SkylineMatrix, +=)\n    EIGEN_SKYLINE_INHERIT_ASSIGNMENT_OPERATOR(SkylineMatrix, -=)\n\n    using Base::IsRowMajor;\n\nprotected:\n\n    typedef SkylineMatrix<Scalar, (Flags&~RowMajorBit) | (IsRowMajor ? RowMajorBit : 0) > TransposedSkylineMatrix;\n\n    Index m_outerSize;\n    Index m_innerSize;\n\npublic:\n    Index* m_colStartIndex;\n    Index* m_rowStartIndex;\n    SkylineStorage<Scalar> m_data;\n\npublic:\n\n    inline Index rows() const {\n        return IsRowMajor ? m_outerSize : m_innerSize;\n    }\n\n    inline Index cols() const {\n        return IsRowMajor ? m_innerSize : m_outerSize;\n    }\n\n    inline Index innerSize() const {\n        return m_innerSize;\n    }\n\n    inline Index outerSize() const {\n        return m_outerSize;\n    }\n\n    inline Index upperNonZeros() const {\n        return m_data.upperSize();\n    }\n\n    inline Index lowerNonZeros() const {\n        return m_data.lowerSize();\n    }\n\n    inline Index upperNonZeros(Index j) const {\n        return m_colStartIndex[j + 1] - m_colStartIndex[j];\n    }\n\n    inline Index lowerNonZeros(Index j) const {\n        return m_rowStartIndex[j + 1] - m_rowStartIndex[j];\n    }\n\n    inline const Scalar* _diagPtr() const {\n        return &m_data.diag(0);\n    }\n\n    inline Scalar* _diagPtr() {\n        return &m_data.diag(0);\n    }\n\n    inline const Scalar* _upperPtr() const {\n        return &m_data.upper(0);\n    }\n\n    inline Scalar* _upperPtr() {\n        return &m_data.upper(0);\n    }\n\n    inline const Scalar* _lowerPtr() const {\n        return &m_data.lower(0);\n    }\n\n    inline Scalar* _lowerPtr() {\n        return &m_data.lower(0);\n    }\n\n    inline const Index* _upperProfilePtr() const {\n        return &m_data.upperProfile(0);\n    }\n\n    inline Index* _upperProfilePtr() {\n        return &m_data.upperProfile(0);\n    }\n\n    inline const Index* _lowerProfilePtr() const {\n        return &m_data.lowerProfile(0);\n    }\n\n    inline Index* _lowerProfilePtr() {\n        return &m_data.lowerProfile(0);\n    }\n\n    inline Scalar coeff(Index row, Index col) const {\n        const Index outer = IsRowMajor ? row : col;\n        const Index inner = IsRowMajor ? col : row;\n\n        eigen_assert(outer < outerSize());\n        eigen_assert(inner < innerSize());\n\n        if (outer == inner)\n            return this->m_data.diag(outer);\n\n        if (IsRowMajor) {\n            if (inner > outer) //upper matrix\n            {\n                const Index minOuterIndex = inner - m_data.upperProfile(inner);\n                if (outer >= minOuterIndex)\n                    return this->m_data.upper(m_colStartIndex[inner] + outer - (inner - m_data.upperProfile(inner)));\n                else\n                    return Scalar(0);\n            }\n            if (inner < outer) //lower matrix\n            {\n                const Index minInnerIndex = outer - m_data.lowerProfile(outer);\n                if (inner >= minInnerIndex)\n                    return this->m_data.lower(m_rowStartIndex[outer] + inner - (outer - m_data.lowerProfile(outer)));\n                else\n                    return Scalar(0);\n            }\n            return m_data.upper(m_colStartIndex[inner] + outer - inner);\n        } else {\n            if (outer > inner) //upper matrix\n            {\n                const Index maxOuterIndex = inner + m_data.upperProfile(inner);\n                if (outer <= maxOuterIndex)\n                    return this->m_data.upper(m_colStartIndex[inner] + (outer - inner));\n                else\n                    return Scalar(0);\n            }\n            if (outer < inner) //lower matrix\n            {\n                const Index maxInnerIndex = outer + m_data.lowerProfile(outer);\n\n                if (inner <= maxInnerIndex)\n                    return this->m_data.lower(m_rowStartIndex[outer] + (inner - outer));\n                else\n                    return Scalar(0);\n            }\n        }\n    }\n\n    inline Scalar& coeffRef(Index row, Index col) {\n        const Index outer = IsRowMajor ? row : col;\n        const Index inner = IsRowMajor ? col : row;\n\n        eigen_assert(outer < outerSize());\n        eigen_assert(inner < innerSize());\n\n        if (outer == inner)\n            return this->m_data.diag(outer);\n\n        if (IsRowMajor) {\n            if (col > row) //upper matrix\n            {\n                const Index minOuterIndex = inner - m_data.upperProfile(inner);\n                eigen_assert(outer >= minOuterIndex && \"you try to acces a coeff that do not exist in the storage\");\n                return this->m_data.upper(m_colStartIndex[inner] + outer - (inner - m_data.upperProfile(inner)));\n            }\n            if (col < row) //lower matrix\n            {\n                const Index minInnerIndex = outer - m_data.lowerProfile(outer);\n                eigen_assert(inner >= minInnerIndex && \"you try to acces a coeff that do not exist in the storage\");\n                return this->m_data.lower(m_rowStartIndex[outer] + inner - (outer - m_data.lowerProfile(outer)));\n            }\n        } else {\n            if (outer > inner) //upper matrix\n            {\n                const Index maxOuterIndex = inner + m_data.upperProfile(inner);\n                eigen_assert(outer <= maxOuterIndex && \"you try to acces a coeff that do not exist in the storage\");\n                return this->m_data.upper(m_colStartIndex[inner] + (outer - inner));\n            }\n            if (outer < inner) //lower matrix\n            {\n                const Index maxInnerIndex = outer + m_data.lowerProfile(outer);\n                eigen_assert(inner <= maxInnerIndex && \"you try to acces a coeff that do not exist in the storage\");\n                return this->m_data.lower(m_rowStartIndex[outer] + (inner - outer));\n            }\n        }\n    }\n\n    inline Scalar coeffDiag(Index idx) const {\n        eigen_assert(idx < outerSize());\n        eigen_assert(idx < innerSize());\n        return this->m_data.diag(idx);\n    }\n\n    inline Scalar coeffLower(Index row, Index col) const {\n        const Index outer = IsRowMajor ? row : col;\n        const Index inner = IsRowMajor ? col : row;\n\n        eigen_assert(outer < outerSize());\n        eigen_assert(inner < innerSize());\n        eigen_assert(inner != outer);\n\n        if (IsRowMajor) {\n            const Index minInnerIndex = outer - m_data.lowerProfile(outer);\n            if (inner >= minInnerIndex)\n                return this->m_data.lower(m_rowStartIndex[outer] + inner - (outer - m_data.lowerProfile(outer)));\n            else\n                return Scalar(0);\n\n        } else {\n            const Index maxInnerIndex = outer + m_data.lowerProfile(outer);\n            if (inner <= maxInnerIndex)\n                return this->m_data.lower(m_rowStartIndex[outer] + (inner - outer));\n            else\n                return Scalar(0);\n        }\n    }\n\n    inline Scalar coeffUpper(Index row, Index col) const {\n        const Index outer = IsRowMajor ? row : col;\n        const Index inner = IsRowMajor ? col : row;\n\n        eigen_assert(outer < outerSize());\n        eigen_assert(inner < innerSize());\n        eigen_assert(inner != outer);\n\n        if (IsRowMajor) {\n            const Index minOuterIndex = inner - m_data.upperProfile(inner);\n            if (outer >= minOuterIndex)\n                return this->m_data.upper(m_colStartIndex[inner] + outer - (inner - m_data.upperProfile(inner)));\n            else\n                return Scalar(0);\n        } else {\n            const Index maxOuterIndex = inner + m_data.upperProfile(inner);\n            if (outer <= maxOuterIndex)\n                return this->m_data.upper(m_colStartIndex[inner] + (outer - inner));\n            else\n                return Scalar(0);\n        }\n    }\n\n    inline Scalar& coeffRefDiag(Index idx) {\n        eigen_assert(idx < outerSize());\n        eigen_assert(idx < innerSize());\n        return this->m_data.diag(idx);\n    }\n\n    inline Scalar& coeffRefLower(Index row, Index col) {\n        const Index outer = IsRowMajor ? row : col;\n        const Index inner = IsRowMajor ? col : row;\n\n        eigen_assert(outer < outerSize());\n        eigen_assert(inner < innerSize());\n        eigen_assert(inner != outer);\n\n        if (IsRowMajor) {\n            const Index minInnerIndex = outer - m_data.lowerProfile(outer);\n            eigen_assert(inner >= minInnerIndex && \"you try to acces a coeff that do not exist in the storage\");\n            return this->m_data.lower(m_rowStartIndex[outer] + inner - (outer - m_data.lowerProfile(outer)));\n        } else {\n            const Index maxInnerIndex = outer + m_data.lowerProfile(outer);\n            eigen_assert(inner <= maxInnerIndex && \"you try to acces a coeff that do not exist in the storage\");\n            return this->m_data.lower(m_rowStartIndex[outer] + (inner - outer));\n        }\n    }\n\n    inline bool coeffExistLower(Index row, Index col) {\n        const Index outer = IsRowMajor ? row : col;\n        const Index inner = IsRowMajor ? col : row;\n\n        eigen_assert(outer < outerSize());\n        eigen_assert(inner < innerSize());\n        eigen_assert(inner != outer);\n\n        if (IsRowMajor) {\n            const Index minInnerIndex = outer - m_data.lowerProfile(outer);\n            return inner >= minInnerIndex;\n        } else {\n            const Index maxInnerIndex = outer + m_data.lowerProfile(outer);\n            return inner <= maxInnerIndex;\n        }\n    }\n\n    inline Scalar& coeffRefUpper(Index row, Index col) {\n        const Index outer = IsRowMajor ? row : col;\n        const Index inner = IsRowMajor ? col : row;\n\n        eigen_assert(outer < outerSize());\n        eigen_assert(inner < innerSize());\n        eigen_assert(inner != outer);\n\n        if (IsRowMajor) {\n            const Index minOuterIndex = inner - m_data.upperProfile(inner);\n            eigen_assert(outer >= minOuterIndex && \"you try to acces a coeff that do not exist in the storage\");\n            return this->m_data.upper(m_colStartIndex[inner] + outer - (inner - m_data.upperProfile(inner)));\n        } else {\n            const Index maxOuterIndex = inner + m_data.upperProfile(inner);\n            eigen_assert(outer <= maxOuterIndex && \"you try to acces a coeff that do not exist in the storage\");\n            return this->m_data.upper(m_colStartIndex[inner] + (outer - inner));\n        }\n    }\n\n    inline bool coeffExistUpper(Index row, Index col) {\n        const Index outer = IsRowMajor ? row : col;\n        const Index inner = IsRowMajor ? col : row;\n\n        eigen_assert(outer < outerSize());\n        eigen_assert(inner < innerSize());\n        eigen_assert(inner != outer);\n\n        if (IsRowMajor) {\n            const Index minOuterIndex = inner - m_data.upperProfile(inner);\n            return outer >= minOuterIndex;\n        } else {\n            const Index maxOuterIndex = inner + m_data.upperProfile(inner);\n            return outer <= maxOuterIndex;\n        }\n    }\n\n\nprotected:\n\npublic:\n    class InnerUpperIterator;\n    class InnerLowerIterator;\n\n    class OuterUpperIterator;\n    class OuterLowerIterator;\n\n    /** Removes all non zeros */\n    inline void setZero() {\n        m_data.clear();\n        memset(m_colStartIndex, 0, (m_outerSize + 1) * sizeof (Index));\n        memset(m_rowStartIndex, 0, (m_outerSize + 1) * sizeof (Index));\n    }\n\n    /** \\returns the number of non zero coefficients */\n    inline Index nonZeros() const {\n        return m_data.diagSize() + m_data.upperSize() + m_data.lowerSize();\n    }\n\n    /** Preallocates \\a reserveSize non zeros */\n    inline void reserve(Index reserveSize, Index reserveUpperSize, Index reserveLowerSize) {\n        m_data.reserve(reserveSize, reserveUpperSize, reserveLowerSize);\n    }\n\n    /** \\returns a reference to a novel non zero coefficient with coordinates \\a row x \\a col.\n\n     *\n     * \\warning This function can be extremely slow if the non zero coefficients\n     * are not inserted in a coherent order.\n     *\n     * After an insertion session, you should call the finalize() function.\n     */\n    EIGEN_DONT_INLINE Scalar & insert(Index row, Index col) {\n        const Index outer = IsRowMajor ? row : col;\n        const Index inner = IsRowMajor ? col : row;\n\n        eigen_assert(outer < outerSize());\n        eigen_assert(inner < innerSize());\n\n        if (outer == inner)\n            return m_data.diag(col);\n\n        if (IsRowMajor) {\n            if (outer < inner) //upper matrix\n            {\n                Index minOuterIndex = 0;\n                minOuterIndex = inner - m_data.upperProfile(inner);\n\n                if (outer < minOuterIndex) //The value does not yet exist\n                {\n                    const Index previousProfile = m_data.upperProfile(inner);\n\n                    m_data.upperProfile(inner) = inner - outer;\n\n\n                    const Index bandIncrement = m_data.upperProfile(inner) - previousProfile;\n                    //shift data stored after this new one\n                    const Index stop = m_colStartIndex[cols()];\n                    const Index start = m_colStartIndex[inner];\n\n\n                    for (Index innerIdx = stop; innerIdx >= start; innerIdx--) {\n                        m_data.upper(innerIdx + bandIncrement) = m_data.upper(innerIdx);\n                    }\n\n                    for (Index innerIdx = cols(); innerIdx > inner; innerIdx--) {\n                        m_colStartIndex[innerIdx] += bandIncrement;\n                    }\n\n                    //zeros new data\n                    memset(this->_upperPtr() + start, 0, (bandIncrement - 1) * sizeof (Scalar));\n\n                    return m_data.upper(m_colStartIndex[inner]);\n                } else {\n                    return m_data.upper(m_colStartIndex[inner] + outer - (inner - m_data.upperProfile(inner)));\n                }\n            }\n\n            if (outer > inner) //lower matrix\n            {\n                const Index minInnerIndex = outer - m_data.lowerProfile(outer);\n                if (inner < minInnerIndex) //The value does not yet exist\n                {\n                    const Index previousProfile = m_data.lowerProfile(outer);\n                    m_data.lowerProfile(outer) = outer - inner;\n\n                    const Index bandIncrement = m_data.lowerProfile(outer) - previousProfile;\n                    //shift data stored after this new one\n                    const Index stop = m_rowStartIndex[rows()];\n                    const Index start = m_rowStartIndex[outer];\n\n\n                    for (Index innerIdx = stop; innerIdx >= start; innerIdx--) {\n                        m_data.lower(innerIdx + bandIncrement) = m_data.lower(innerIdx);\n                    }\n\n                    for (Index innerIdx = rows(); innerIdx > outer; innerIdx--) {\n                        m_rowStartIndex[innerIdx] += bandIncrement;\n                    }\n\n                    //zeros new data\n                    memset(this->_lowerPtr() + start, 0, (bandIncrement - 1) * sizeof (Scalar));\n                    return m_data.lower(m_rowStartIndex[outer]);\n                } else {\n                    return m_data.lower(m_rowStartIndex[outer] + inner - (outer - m_data.lowerProfile(outer)));\n                }\n            }\n        } else {\n            if (outer > inner) //upper matrix\n            {\n                const Index maxOuterIndex = inner + m_data.upperProfile(inner);\n                if (outer > maxOuterIndex) //The value does not yet exist\n                {\n                    const Index previousProfile = m_data.upperProfile(inner);\n                    m_data.upperProfile(inner) = outer - inner;\n\n                    const Index bandIncrement = m_data.upperProfile(inner) - previousProfile;\n                    //shift data stored after this new one\n                    const Index stop = m_rowStartIndex[rows()];\n                    const Index start = m_rowStartIndex[inner + 1];\n\n                    for (Index innerIdx = stop; innerIdx >= start; innerIdx--) {\n                        m_data.upper(innerIdx + bandIncrement) = m_data.upper(innerIdx);\n                    }\n\n                    for (Index innerIdx = inner + 1; innerIdx < outerSize() + 1; innerIdx++) {\n                        m_rowStartIndex[innerIdx] += bandIncrement;\n                    }\n                    memset(this->_upperPtr() + m_rowStartIndex[inner] + previousProfile + 1, 0, (bandIncrement - 1) * sizeof (Scalar));\n                    return m_data.upper(m_rowStartIndex[inner] + m_data.upperProfile(inner));\n                } else {\n                    return m_data.upper(m_rowStartIndex[inner] + (outer - inner));\n                }\n            }\n\n            if (outer < inner) //lower matrix\n            {\n                const Index maxInnerIndex = outer + m_data.lowerProfile(outer);\n                if (inner > maxInnerIndex) //The value does not yet exist\n                {\n                    const Index previousProfile = m_data.lowerProfile(outer);\n                    m_data.lowerProfile(outer) = inner - outer;\n\n                    const Index bandIncrement = m_data.lowerProfile(outer) - previousProfile;\n                    //shift data stored after this new one\n                    const Index stop = m_colStartIndex[cols()];\n                    const Index start = m_colStartIndex[outer + 1];\n\n                    for (Index innerIdx = stop; innerIdx >= start; innerIdx--) {\n                        m_data.lower(innerIdx + bandIncrement) = m_data.lower(innerIdx);\n                    }\n\n                    for (Index innerIdx = outer + 1; innerIdx < outerSize() + 1; innerIdx++) {\n                        m_colStartIndex[innerIdx] += bandIncrement;\n                    }\n                    memset(this->_lowerPtr() + m_colStartIndex[outer] + previousProfile + 1, 0, (bandIncrement - 1) * sizeof (Scalar));\n                    return m_data.lower(m_colStartIndex[outer] + m_data.lowerProfile(outer));\n                } else {\n                    return m_data.lower(m_colStartIndex[outer] + (inner - outer));\n                }\n            }\n        }\n    }\n\n    /** Must be called after inserting a set of non zero entries.\n     */\n    inline void finalize() {\n        if (IsRowMajor) {\n            if (rows() > cols())\n                m_data.resize(cols(), cols(), rows(), m_colStartIndex[cols()] + 1, m_rowStartIndex[rows()] + 1);\n            else\n                m_data.resize(rows(), cols(), rows(), m_colStartIndex[cols()] + 1, m_rowStartIndex[rows()] + 1);\n\n            //            eigen_assert(rows() == cols() && \"memory reorganisatrion only works with suare matrix\");\n            //\n            //            Scalar* newArray = new Scalar[m_colStartIndex[cols()] + 1 + m_rowStartIndex[rows()] + 1];\n            //            Index dataIdx = 0;\n            //            for (Index row = 0; row < rows(); row++) {\n            //\n            //                const Index nbLowerElts = m_rowStartIndex[row + 1] - m_rowStartIndex[row];\n            //                //                std::cout << \"nbLowerElts\" << nbLowerElts << std::endl;\n            //                memcpy(newArray + dataIdx, m_data.m_lower + m_rowStartIndex[row], nbLowerElts * sizeof (Scalar));\n            //                m_rowStartIndex[row] = dataIdx;\n            //                dataIdx += nbLowerElts;\n            //\n            //                const Index nbUpperElts = m_colStartIndex[row + 1] - m_colStartIndex[row];\n            //                memcpy(newArray + dataIdx, m_data.m_upper + m_colStartIndex[row], nbUpperElts * sizeof (Scalar));\n            //                m_colStartIndex[row] = dataIdx;\n            //                dataIdx += nbUpperElts;\n            //\n            //\n            //            }\n            //            //todo : don't access m_data profile directly : add an accessor from SkylineMatrix\n            //            m_rowStartIndex[rows()] = m_rowStartIndex[rows()-1] + m_data.lowerProfile(rows()-1);\n            //            m_colStartIndex[cols()] = m_colStartIndex[cols()-1] + m_data.upperProfile(cols()-1);\n            //\n            //            delete[] m_data.m_lower;\n            //            delete[] m_data.m_upper;\n            //\n            //            m_data.m_lower = newArray;\n            //            m_data.m_upper = newArray;\n        } else {\n            if (rows() > cols())\n                m_data.resize(cols(), rows(), cols(), m_rowStartIndex[cols()] + 1, m_colStartIndex[cols()] + 1);\n            else\n                m_data.resize(rows(), rows(), cols(), m_rowStartIndex[rows()] + 1, m_colStartIndex[rows()] + 1);\n        }\n    }\n\n    inline void squeeze() {\n        finalize();\n        m_data.squeeze();\n    }\n\n    void prune(Scalar reference, RealScalar epsilon = dummy_precision<RealScalar > ()) {\n        //TODO\n    }\n\n    /** Resizes the matrix to a \\a rows x \\a cols matrix and initializes it to zero\n     * \\sa resizeNonZeros(Index), reserve(), setZero()\n     */\n    void resize(size_t rows, size_t cols) {\n        const Index diagSize = rows > cols ? cols : rows;\n        m_innerSize = IsRowMajor ? cols : rows;\n\n        eigen_assert(rows == cols && \"Skyline matrix must be square matrix\");\n\n        if (diagSize % 2) { // diagSize is odd\n            const Index k = (diagSize - 1) / 2;\n\n            m_data.resize(diagSize, IsRowMajor ? cols : rows, IsRowMajor ? rows : cols,\n                    2 * k * k + k + 1,\n                    2 * k * k + k + 1);\n\n        } else // diagSize is even\n        {\n            const Index k = diagSize / 2;\n            m_data.resize(diagSize, IsRowMajor ? cols : rows, IsRowMajor ? rows : cols,\n                    2 * k * k - k + 1,\n                    2 * k * k - k + 1);\n        }\n\n        if (m_colStartIndex && m_rowStartIndex) {\n            delete[] m_colStartIndex;\n            delete[] m_rowStartIndex;\n        }\n        m_colStartIndex = new Index [cols + 1];\n        m_rowStartIndex = new Index [rows + 1];\n        m_outerSize = diagSize;\n\n        m_data.reset();\n        m_data.clear();\n\n        m_outerSize = diagSize;\n        memset(m_colStartIndex, 0, (cols + 1) * sizeof (Index));\n        memset(m_rowStartIndex, 0, (rows + 1) * sizeof (Index));\n    }\n\n    void resizeNonZeros(Index size) {\n        m_data.resize(size);\n    }\n\n    inline SkylineMatrix()\n    : m_outerSize(-1), m_innerSize(0), m_colStartIndex(0), m_rowStartIndex(0) {\n        resize(0, 0);\n    }\n\n    inline SkylineMatrix(size_t rows, size_t cols)\n    : m_outerSize(0), m_innerSize(0), m_colStartIndex(0), m_rowStartIndex(0) {\n        resize(rows, cols);\n    }\n\n    template<typename OtherDerived>\n    inline SkylineMatrix(const SkylineMatrixBase<OtherDerived>& other)\n    : m_outerSize(0), m_innerSize(0), m_colStartIndex(0), m_rowStartIndex(0) {\n        *this = other.derived();\n    }\n\n    inline SkylineMatrix(const SkylineMatrix & other)\n    : Base(), m_outerSize(0), m_innerSize(0), m_colStartIndex(0), m_rowStartIndex(0) {\n        *this = other.derived();\n    }\n\n    inline void swap(SkylineMatrix & other) {\n        //EIGEN_DBG_SKYLINE(std::cout << \"SkylineMatrix:: swap\\n\");\n        std::swap(m_colStartIndex, other.m_colStartIndex);\n        std::swap(m_rowStartIndex, other.m_rowStartIndex);\n        std::swap(m_innerSize, other.m_innerSize);\n        std::swap(m_outerSize, other.m_outerSize);\n        m_data.swap(other.m_data);\n    }\n\n    inline SkylineMatrix & operator=(const SkylineMatrix & other) {\n        std::cout << \"SkylineMatrix& operator=(const SkylineMatrix& other)\\n\";\n        if (other.isRValue()) {\n            swap(other.const_cast_derived());\n        } else {\n            resize(other.rows(), other.cols());\n            memcpy(m_colStartIndex, other.m_colStartIndex, (m_outerSize + 1) * sizeof (Index));\n            memcpy(m_rowStartIndex, other.m_rowStartIndex, (m_outerSize + 1) * sizeof (Index));\n            m_data = other.m_data;\n        }\n        return *this;\n    }\n\n    template<typename OtherDerived>\n            inline SkylineMatrix & operator=(const SkylineMatrixBase<OtherDerived>& other) {\n        const bool needToTranspose = (Flags & RowMajorBit) != (OtherDerived::Flags & RowMajorBit);\n        if (needToTranspose) {\n            //         TODO\n            //            return *this;\n        } else {\n            // there is no special optimization\n            return SkylineMatrixBase<SkylineMatrix>::operator=(other.derived());\n        }\n    }\n\n    friend std::ostream & operator <<(std::ostream & s, const SkylineMatrix & m) {\n\n        EIGEN_DBG_SKYLINE(\n        std::cout << \"upper elements : \" << std::endl;\n        for (Index i = 0; i < m.m_data.upperSize(); i++)\n            std::cout << m.m_data.upper(i) << \"\\t\";\n        std::cout << std::endl;\n        std::cout << \"upper profile : \" << std::endl;\n        for (Index i = 0; i < m.m_data.upperProfileSize(); i++)\n            std::cout << m.m_data.upperProfile(i) << \"\\t\";\n        std::cout << std::endl;\n        std::cout << \"lower startIdx : \" << std::endl;\n        for (Index i = 0; i < m.m_data.upperProfileSize(); i++)\n            std::cout << (IsRowMajor ? m.m_colStartIndex[i] : m.m_rowStartIndex[i]) << \"\\t\";\n        std::cout << std::endl;\n\n\n        std::cout << \"lower elements : \" << std::endl;\n        for (Index i = 0; i < m.m_data.lowerSize(); i++)\n            std::cout << m.m_data.lower(i) << \"\\t\";\n        std::cout << std::endl;\n        std::cout << \"lower profile : \" << std::endl;\n        for (Index i = 0; i < m.m_data.lowerProfileSize(); i++)\n            std::cout << m.m_data.lowerProfile(i) << \"\\t\";\n        std::cout << std::endl;\n        std::cout << \"lower startIdx : \" << std::endl;\n        for (Index i = 0; i < m.m_data.lowerProfileSize(); i++)\n            std::cout << (IsRowMajor ? m.m_rowStartIndex[i] : m.m_colStartIndex[i]) << \"\\t\";\n        std::cout << std::endl;\n        );\n        for (Index rowIdx = 0; rowIdx < m.rows(); rowIdx++) {\n            for (Index colIdx = 0; colIdx < m.cols(); colIdx++) {\n                s << m.coeff(rowIdx, colIdx) << \"\\t\";\n            }\n            s << std::endl;\n        }\n        return s;\n    }\n\n    /** Destructor */\n    inline ~SkylineMatrix() {\n        delete[] m_colStartIndex;\n        delete[] m_rowStartIndex;\n    }\n\n    /** Overloaded for performance */\n    Scalar sum() const;\n};\n\ntemplate<typename Scalar, int _Options>\nclass SkylineMatrix<Scalar, _Options>::InnerUpperIterator {\npublic:\n\n    InnerUpperIterator(const SkylineMatrix& mat, Index outer)\n    : m_matrix(mat), m_outer(outer),\n    m_id(_Options == RowMajor ? mat.m_colStartIndex[outer] : mat.m_rowStartIndex[outer] + 1),\n    m_start(m_id),\n    m_end(_Options == RowMajor ? mat.m_colStartIndex[outer + 1] : mat.m_rowStartIndex[outer + 1] + 1) {\n    }\n\n    inline InnerUpperIterator & operator++() {\n        m_id++;\n        return *this;\n    }\n\n    inline InnerUpperIterator & operator+=(Index shift) {\n        m_id += shift;\n        return *this;\n    }\n\n    inline Scalar value() const {\n        return m_matrix.m_data.upper(m_id);\n    }\n\n    inline Scalar* valuePtr() {\n        return const_cast<Scalar*> (&(m_matrix.m_data.upper(m_id)));\n    }\n\n    inline Scalar& valueRef() {\n        return const_cast<Scalar&> (m_matrix.m_data.upper(m_id));\n    }\n\n    inline Index index() const {\n        return IsRowMajor ? m_outer - m_matrix.m_data.upperProfile(m_outer) + (m_id - m_start) :\n                m_outer + (m_id - m_start) + 1;\n    }\n\n    inline Index row() const {\n        return IsRowMajor ? index() : m_outer;\n    }\n\n    inline Index col() const {\n        return IsRowMajor ? m_outer : index();\n    }\n\n    inline size_t size() const {\n        return m_matrix.m_data.upperProfile(m_outer);\n    }\n\n    inline operator bool() const {\n        return (m_id < m_end) && (m_id >= m_start);\n    }\n\nprotected:\n    const SkylineMatrix& m_matrix;\n    const Index m_outer;\n    Index m_id;\n    const Index m_start;\n    const Index m_end;\n};\n\ntemplate<typename Scalar, int _Options>\nclass SkylineMatrix<Scalar, _Options>::InnerLowerIterator {\npublic:\n\n    InnerLowerIterator(const SkylineMatrix& mat, Index outer)\n    : m_matrix(mat),\n    m_outer(outer),\n    m_id(_Options == RowMajor ? mat.m_rowStartIndex[outer] : mat.m_colStartIndex[outer] + 1),\n    m_start(m_id),\n    m_end(_Options == RowMajor ? mat.m_rowStartIndex[outer + 1] : mat.m_colStartIndex[outer + 1] + 1) {\n    }\n\n    inline InnerLowerIterator & operator++() {\n        m_id++;\n        return *this;\n    }\n\n    inline InnerLowerIterator & operator+=(Index shift) {\n        m_id += shift;\n        return *this;\n    }\n\n    inline Scalar value() const {\n        return m_matrix.m_data.lower(m_id);\n    }\n\n    inline Scalar* valuePtr() {\n        return const_cast<Scalar*> (&(m_matrix.m_data.lower(m_id)));\n    }\n\n    inline Scalar& valueRef() {\n        return const_cast<Scalar&> (m_matrix.m_data.lower(m_id));\n    }\n\n    inline Index index() const {\n        return IsRowMajor ? m_outer - m_matrix.m_data.lowerProfile(m_outer) + (m_id - m_start) :\n                m_outer + (m_id - m_start) + 1;\n        ;\n    }\n\n    inline Index row() const {\n        return IsRowMajor ? m_outer : index();\n    }\n\n    inline Index col() const {\n        return IsRowMajor ? index() : m_outer;\n    }\n\n    inline size_t size() const {\n        return m_matrix.m_data.lowerProfile(m_outer);\n    }\n\n    inline operator bool() const {\n        return (m_id < m_end) && (m_id >= m_start);\n    }\n\nprotected:\n    const SkylineMatrix& m_matrix;\n    const Index m_outer;\n    Index m_id;\n    const Index m_start;\n    const Index m_end;\n};\n\n} // end namespace Eigen\n\n#endif // EIGEN_SkylineMatrix_H\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/Skyline/SkylineMatrixBase.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Guillaume Saupin <guillaume.saupin@cea.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SKYLINEMATRIXBASE_H\n#define EIGEN_SKYLINEMATRIXBASE_H\n\n#include \"SkylineUtil.h\"\n\nnamespace Eigen { \n\n/** \\ingroup Skyline_Module\n *\n * \\class SkylineMatrixBase\n *\n * \\brief Base class of any skyline matrices or skyline expressions\n *\n * \\param Derived\n *\n */\ntemplate<typename Derived> class SkylineMatrixBase : public EigenBase<Derived> {\npublic:\n\n    typedef typename internal::traits<Derived>::Scalar Scalar;\n    typedef typename internal::traits<Derived>::StorageKind StorageKind;\n    typedef typename internal::index<StorageKind>::type Index;\n\n    enum {\n        RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,\n        /**< The number of rows at compile-time. This is just a copy of the value provided\n         * by the \\a Derived type. If a value is not known at compile-time,\n         * it is set to the \\a Dynamic constant.\n         * \\sa MatrixBase::rows(), MatrixBase::cols(), ColsAtCompileTime, SizeAtCompileTime */\n\n        ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,\n        /**< The number of columns at compile-time. This is just a copy of the value provided\n         * by the \\a Derived type. If a value is not known at compile-time,\n         * it is set to the \\a Dynamic constant.\n         * \\sa MatrixBase::rows(), MatrixBase::cols(), RowsAtCompileTime, SizeAtCompileTime */\n\n\n        SizeAtCompileTime = (internal::size_at_compile_time<internal::traits<Derived>::RowsAtCompileTime,\n        internal::traits<Derived>::ColsAtCompileTime>::ret),\n        /**< This is equal to the number of coefficients, i.e. the number of\n         * rows times the number of columns, or to \\a Dynamic if this is not\n         * known at compile-time. \\sa RowsAtCompileTime, ColsAtCompileTime */\n\n        MaxRowsAtCompileTime = RowsAtCompileTime,\n        MaxColsAtCompileTime = ColsAtCompileTime,\n\n        MaxSizeAtCompileTime = (internal::size_at_compile_time<MaxRowsAtCompileTime,\n        MaxColsAtCompileTime>::ret),\n\n        IsVectorAtCompileTime = RowsAtCompileTime == 1 || ColsAtCompileTime == 1,\n        /**< This is set to true if either the number of rows or the number of\n         * columns is known at compile-time to be equal to 1. Indeed, in that case,\n         * we are dealing with a column-vector (if there is only one column) or with\n         * a row-vector (if there is only one row). */\n\n        Flags = internal::traits<Derived>::Flags,\n        /**< This stores expression \\ref flags flags which may or may not be inherited by new expressions\n         * constructed from this one. See the \\ref flags \"list of flags\".\n         */\n\n        CoeffReadCost = internal::traits<Derived>::CoeffReadCost,\n        /**< This is a rough measure of how expensive it is to read one coefficient from\n         * this expression.\n         */\n\n        IsRowMajor = Flags & RowMajorBit ? 1 : 0\n    };\n\n#ifndef EIGEN_PARSED_BY_DOXYGEN\n    /** This is the \"real scalar\" type; if the \\a Scalar type is already real numbers\n     * (e.g. int, float or double) then \\a RealScalar is just the same as \\a Scalar. If\n     * \\a Scalar is \\a std::complex<T> then RealScalar is \\a T.\n     *\n     * \\sa class NumTraits\n     */\n    typedef typename NumTraits<Scalar>::Real RealScalar;\n\n    /** type of the equivalent square matrix */\n    typedef Matrix<Scalar, EIGEN_SIZE_MAX(RowsAtCompileTime, ColsAtCompileTime),\n                           EIGEN_SIZE_MAX(RowsAtCompileTime, ColsAtCompileTime) > SquareMatrixType;\n\n    inline const Derived& derived() const {\n        return *static_cast<const Derived*> (this);\n    }\n\n    inline Derived& derived() {\n        return *static_cast<Derived*> (this);\n    }\n\n    inline Derived& const_cast_derived() const {\n        return *static_cast<Derived*> (const_cast<SkylineMatrixBase*> (this));\n    }\n#endif // not EIGEN_PARSED_BY_DOXYGEN\n\n    /** \\returns the number of rows. \\sa cols(), RowsAtCompileTime */\n    inline Index rows() const {\n        return derived().rows();\n    }\n\n    /** \\returns the number of columns. \\sa rows(), ColsAtCompileTime*/\n    inline Index cols() const {\n        return derived().cols();\n    }\n\n    /** \\returns the number of coefficients, which is \\a rows()*cols().\n     * \\sa rows(), cols(), SizeAtCompileTime. */\n    inline Index size() const {\n        return rows() * cols();\n    }\n\n    /** \\returns the number of nonzero coefficients which is in practice the number\n     * of stored coefficients. */\n    inline Index nonZeros() const {\n        return derived().nonZeros();\n    }\n\n    /** \\returns the size of the storage major dimension,\n     * i.e., the number of columns for a columns major matrix, and the number of rows otherwise */\n    Index outerSize() const {\n        return (int(Flags) & RowMajorBit) ? this->rows() : this->cols();\n    }\n\n    /** \\returns the size of the inner dimension according to the storage order,\n     * i.e., the number of rows for a columns major matrix, and the number of cols otherwise */\n    Index innerSize() const {\n        return (int(Flags) & RowMajorBit) ? this->cols() : this->rows();\n    }\n\n    bool isRValue() const {\n        return m_isRValue;\n    }\n\n    Derived& markAsRValue() {\n        m_isRValue = true;\n        return derived();\n    }\n\n    SkylineMatrixBase() : m_isRValue(false) {\n        /* TODO check flags */\n    }\n\n    inline Derived & operator=(const Derived& other) {\n        this->operator=<Derived > (other);\n        return derived();\n    }\n\n    template<typename OtherDerived>\n    inline void assignGeneric(const OtherDerived& other) {\n        derived().resize(other.rows(), other.cols());\n        for (Index row = 0; row < rows(); row++)\n            for (Index col = 0; col < cols(); col++) {\n                if (other.coeff(row, col) != Scalar(0))\n                    derived().insert(row, col) = other.coeff(row, col);\n            }\n        derived().finalize();\n    }\n\n    template<typename OtherDerived>\n            inline Derived & operator=(const SkylineMatrixBase<OtherDerived>& other) {\n        //TODO\n    }\n\n    template<typename Lhs, typename Rhs>\n            inline Derived & operator=(const SkylineProduct<Lhs, Rhs, SkylineTimeSkylineProduct>& product);\n\n    friend std::ostream & operator <<(std::ostream & s, const SkylineMatrixBase& m) {\n        s << m.derived();\n        return s;\n    }\n\n    template<typename OtherDerived>\n    const typename SkylineProductReturnType<Derived, OtherDerived>::Type\n    operator*(const MatrixBase<OtherDerived> &other) const;\n\n    /** \\internal use operator= */\n    template<typename DenseDerived>\n    void evalTo(MatrixBase<DenseDerived>& dst) const {\n        dst.setZero();\n        for (Index i = 0; i < rows(); i++)\n            for (Index j = 0; j < rows(); j++)\n                dst(i, j) = derived().coeff(i, j);\n    }\n\n    Matrix<Scalar, RowsAtCompileTime, ColsAtCompileTime> toDense() const {\n        return derived();\n    }\n\n    /** \\returns the matrix or vector obtained by evaluating this expression.\n     *\n     * Notice that in the case of a plain matrix or vector (not an expression) this function just returns\n     * a const reference, in order to avoid a useless copy.\n     */\n    EIGEN_STRONG_INLINE const typename internal::eval<Derived, IsSkyline>::type eval() const {\n        return typename internal::eval<Derived>::type(derived());\n    }\n\nprotected:\n    bool m_isRValue;\n};\n\n} // end namespace Eigen\n\n#endif // EIGEN_SkylineMatrixBase_H\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/Skyline/SkylineProduct.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Guillaume Saupin <guillaume.saupin@cea.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SKYLINEPRODUCT_H\n#define EIGEN_SKYLINEPRODUCT_H\n\nnamespace Eigen { \n\ntemplate<typename Lhs, typename Rhs, int ProductMode>\nstruct SkylineProductReturnType {\n    typedef const typename internal::nested<Lhs, Rhs::RowsAtCompileTime>::type LhsNested;\n    typedef const typename internal::nested<Rhs, Lhs::RowsAtCompileTime>::type RhsNested;\n\n    typedef SkylineProduct<LhsNested, RhsNested, ProductMode> Type;\n};\n\ntemplate<typename LhsNested, typename RhsNested, int ProductMode>\nstruct internal::traits<SkylineProduct<LhsNested, RhsNested, ProductMode> > {\n    // clean the nested types:\n    typedef typename internal::remove_all<LhsNested>::type _LhsNested;\n    typedef typename internal::remove_all<RhsNested>::type _RhsNested;\n    typedef typename _LhsNested::Scalar Scalar;\n\n    enum {\n        LhsCoeffReadCost = _LhsNested::CoeffReadCost,\n        RhsCoeffReadCost = _RhsNested::CoeffReadCost,\n        LhsFlags = _LhsNested::Flags,\n        RhsFlags = _RhsNested::Flags,\n\n        RowsAtCompileTime = _LhsNested::RowsAtCompileTime,\n        ColsAtCompileTime = _RhsNested::ColsAtCompileTime,\n        InnerSize = EIGEN_SIZE_MIN_PREFER_FIXED(_LhsNested::ColsAtCompileTime, _RhsNested::RowsAtCompileTime),\n\n        MaxRowsAtCompileTime = _LhsNested::MaxRowsAtCompileTime,\n        MaxColsAtCompileTime = _RhsNested::MaxColsAtCompileTime,\n\n        EvalToRowMajor = (RhsFlags & LhsFlags & RowMajorBit),\n        ResultIsSkyline = ProductMode == SkylineTimeSkylineProduct,\n\n        RemovedBits = ~((EvalToRowMajor ? 0 : RowMajorBit) | (ResultIsSkyline ? 0 : SkylineBit)),\n\n        Flags = (int(LhsFlags | RhsFlags) & HereditaryBits & RemovedBits)\n        | EvalBeforeAssigningBit\n        | EvalBeforeNestingBit,\n\n        CoeffReadCost = Dynamic\n    };\n\n    typedef typename internal::conditional<ResultIsSkyline,\n            SkylineMatrixBase<SkylineProduct<LhsNested, RhsNested, ProductMode> >,\n            MatrixBase<SkylineProduct<LhsNested, RhsNested, ProductMode> > >::type Base;\n};\n\nnamespace internal {\ntemplate<typename LhsNested, typename RhsNested, int ProductMode>\nclass SkylineProduct : no_assignment_operator,\npublic traits<SkylineProduct<LhsNested, RhsNested, ProductMode> >::Base {\npublic:\n\n    EIGEN_GENERIC_PUBLIC_INTERFACE(SkylineProduct)\n\nprivate:\n\n    typedef typename traits<SkylineProduct>::_LhsNested _LhsNested;\n    typedef typename traits<SkylineProduct>::_RhsNested _RhsNested;\n\npublic:\n\n    template<typename Lhs, typename Rhs>\n    EIGEN_STRONG_INLINE SkylineProduct(const Lhs& lhs, const Rhs& rhs)\n    : m_lhs(lhs), m_rhs(rhs) {\n        eigen_assert(lhs.cols() == rhs.rows());\n\n        enum {\n            ProductIsValid = _LhsNested::ColsAtCompileTime == Dynamic\n            || _RhsNested::RowsAtCompileTime == Dynamic\n            || int(_LhsNested::ColsAtCompileTime) == int(_RhsNested::RowsAtCompileTime),\n            AreVectors = _LhsNested::IsVectorAtCompileTime && _RhsNested::IsVectorAtCompileTime,\n            SameSizes = EIGEN_PREDICATE_SAME_MATRIX_SIZE(_LhsNested, _RhsNested)\n        };\n        // note to the lost user:\n        //    * for a dot product use: v1.dot(v2)\n        //    * for a coeff-wise product use: v1.cwise()*v2\n        EIGEN_STATIC_ASSERT(ProductIsValid || !(AreVectors && SameSizes),\n                INVALID_VECTOR_VECTOR_PRODUCT__IF_YOU_WANTED_A_DOT_OR_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTIONS)\n                EIGEN_STATIC_ASSERT(ProductIsValid || !(SameSizes && !AreVectors),\n                INVALID_MATRIX_PRODUCT__IF_YOU_WANTED_A_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTION)\n                EIGEN_STATIC_ASSERT(ProductIsValid || SameSizes, INVALID_MATRIX_PRODUCT)\n    }\n\n    EIGEN_STRONG_INLINE Index rows() const {\n        return m_lhs.rows();\n    }\n\n    EIGEN_STRONG_INLINE Index cols() const {\n        return m_rhs.cols();\n    }\n\n    EIGEN_STRONG_INLINE const _LhsNested& lhs() const {\n        return m_lhs;\n    }\n\n    EIGEN_STRONG_INLINE const _RhsNested& rhs() const {\n        return m_rhs;\n    }\n\nprotected:\n    LhsNested m_lhs;\n    RhsNested m_rhs;\n};\n\n// dense = skyline * dense\n// Note that here we force no inlining and separate the setZero() because GCC messes up otherwise\n\ntemplate<typename Lhs, typename Rhs, typename Dest>\nEIGEN_DONT_INLINE void skyline_row_major_time_dense_product(const Lhs& lhs, const Rhs& rhs, Dest& dst) {\n    typedef typename remove_all<Lhs>::type _Lhs;\n    typedef typename remove_all<Rhs>::type _Rhs;\n    typedef typename traits<Lhs>::Scalar Scalar;\n\n    enum {\n        LhsIsRowMajor = (_Lhs::Flags & RowMajorBit) == RowMajorBit,\n        LhsIsSelfAdjoint = (_Lhs::Flags & SelfAdjointBit) == SelfAdjointBit,\n        ProcessFirstHalf = LhsIsSelfAdjoint\n        && (((_Lhs::Flags & (UpperTriangularBit | LowerTriangularBit)) == 0)\n        || ((_Lhs::Flags & UpperTriangularBit) && !LhsIsRowMajor)\n        || ((_Lhs::Flags & LowerTriangularBit) && LhsIsRowMajor)),\n        ProcessSecondHalf = LhsIsSelfAdjoint && (!ProcessFirstHalf)\n    };\n\n    //Use matrix diagonal part <- Improvement : use inner iterator on dense matrix.\n    for (Index col = 0; col < rhs.cols(); col++) {\n        for (Index row = 0; row < lhs.rows(); row++) {\n            dst(row, col) = lhs.coeffDiag(row) * rhs(row, col);\n        }\n    }\n    //Use matrix lower triangular part\n    for (Index row = 0; row < lhs.rows(); row++) {\n        typename _Lhs::InnerLowerIterator lIt(lhs, row);\n        const Index stop = lIt.col() + lIt.size();\n        for (Index col = 0; col < rhs.cols(); col++) {\n\n            Index k = lIt.col();\n            Scalar tmp = 0;\n            while (k < stop) {\n                tmp +=\n                        lIt.value() *\n                        rhs(k++, col);\n                ++lIt;\n            }\n            dst(row, col) += tmp;\n            lIt += -lIt.size();\n        }\n\n    }\n\n    //Use matrix upper triangular part\n    for (Index lhscol = 0; lhscol < lhs.cols(); lhscol++) {\n        typename _Lhs::InnerUpperIterator uIt(lhs, lhscol);\n        const Index stop = uIt.size() + uIt.row();\n        for (Index rhscol = 0; rhscol < rhs.cols(); rhscol++) {\n\n\n            const Scalar rhsCoeff = rhs.coeff(lhscol, rhscol);\n            Index k = uIt.row();\n            while (k < stop) {\n                dst(k++, rhscol) +=\n                        uIt.value() *\n                        rhsCoeff;\n                ++uIt;\n            }\n            uIt += -uIt.size();\n        }\n    }\n\n}\n\ntemplate<typename Lhs, typename Rhs, typename Dest>\nEIGEN_DONT_INLINE void skyline_col_major_time_dense_product(const Lhs& lhs, const Rhs& rhs, Dest& dst) {\n    typedef typename remove_all<Lhs>::type _Lhs;\n    typedef typename remove_all<Rhs>::type _Rhs;\n    typedef typename traits<Lhs>::Scalar Scalar;\n\n    enum {\n        LhsIsRowMajor = (_Lhs::Flags & RowMajorBit) == RowMajorBit,\n        LhsIsSelfAdjoint = (_Lhs::Flags & SelfAdjointBit) == SelfAdjointBit,\n        ProcessFirstHalf = LhsIsSelfAdjoint\n        && (((_Lhs::Flags & (UpperTriangularBit | LowerTriangularBit)) == 0)\n        || ((_Lhs::Flags & UpperTriangularBit) && !LhsIsRowMajor)\n        || ((_Lhs::Flags & LowerTriangularBit) && LhsIsRowMajor)),\n        ProcessSecondHalf = LhsIsSelfAdjoint && (!ProcessFirstHalf)\n    };\n\n    //Use matrix diagonal part <- Improvement : use inner iterator on dense matrix.\n    for (Index col = 0; col < rhs.cols(); col++) {\n        for (Index row = 0; row < lhs.rows(); row++) {\n            dst(row, col) = lhs.coeffDiag(row) * rhs(row, col);\n        }\n    }\n\n    //Use matrix upper triangular part\n    for (Index row = 0; row < lhs.rows(); row++) {\n        typename _Lhs::InnerUpperIterator uIt(lhs, row);\n        const Index stop = uIt.col() + uIt.size();\n        for (Index col = 0; col < rhs.cols(); col++) {\n\n            Index k = uIt.col();\n            Scalar tmp = 0;\n            while (k < stop) {\n                tmp +=\n                        uIt.value() *\n                        rhs(k++, col);\n                ++uIt;\n            }\n\n\n            dst(row, col) += tmp;\n            uIt += -uIt.size();\n        }\n    }\n\n    //Use matrix lower triangular part\n    for (Index lhscol = 0; lhscol < lhs.cols(); lhscol++) {\n        typename _Lhs::InnerLowerIterator lIt(lhs, lhscol);\n        const Index stop = lIt.size() + lIt.row();\n        for (Index rhscol = 0; rhscol < rhs.cols(); rhscol++) {\n\n            const Scalar rhsCoeff = rhs.coeff(lhscol, rhscol);\n            Index k = lIt.row();\n            while (k < stop) {\n                dst(k++, rhscol) +=\n                        lIt.value() *\n                        rhsCoeff;\n                ++lIt;\n            }\n            lIt += -lIt.size();\n        }\n    }\n\n}\n\ntemplate<typename Lhs, typename Rhs, typename ResultType,\n        int LhsStorageOrder = traits<Lhs>::Flags&RowMajorBit>\n        struct skyline_product_selector;\n\ntemplate<typename Lhs, typename Rhs, typename ResultType>\nstruct skyline_product_selector<Lhs, Rhs, ResultType, RowMajor> {\n    typedef typename traits<typename remove_all<Lhs>::type>::Scalar Scalar;\n\n    static void run(const Lhs& lhs, const Rhs& rhs, ResultType & res) {\n        skyline_row_major_time_dense_product<Lhs, Rhs, ResultType > (lhs, rhs, res);\n    }\n};\n\ntemplate<typename Lhs, typename Rhs, typename ResultType>\nstruct skyline_product_selector<Lhs, Rhs, ResultType, ColMajor> {\n    typedef typename traits<typename remove_all<Lhs>::type>::Scalar Scalar;\n\n    static void run(const Lhs& lhs, const Rhs& rhs, ResultType & res) {\n        skyline_col_major_time_dense_product<Lhs, Rhs, ResultType > (lhs, rhs, res);\n    }\n};\n\n} // end namespace internal\n\n// template<typename Derived>\n// template<typename Lhs, typename Rhs >\n// Derived & MatrixBase<Derived>::lazyAssign(const SkylineProduct<Lhs, Rhs, SkylineTimeDenseProduct>& product) {\n//     typedef typename internal::remove_all<Lhs>::type _Lhs;\n//     internal::skyline_product_selector<typename internal::remove_all<Lhs>::type,\n//             typename internal::remove_all<Rhs>::type,\n//             Derived>::run(product.lhs(), product.rhs(), derived());\n// \n//     return derived();\n// }\n\n// skyline * dense\n\ntemplate<typename Derived>\ntemplate<typename OtherDerived >\nEIGEN_STRONG_INLINE const typename SkylineProductReturnType<Derived, OtherDerived>::Type\nSkylineMatrixBase<Derived>::operator*(const MatrixBase<OtherDerived> &other) const {\n\n    return typename SkylineProductReturnType<Derived, OtherDerived>::Type(derived(), other.derived());\n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_SKYLINEPRODUCT_H\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/Skyline/SkylineStorage.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Guillaume Saupin <guillaume.saupin@cea.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SKYLINE_STORAGE_H\n#define EIGEN_SKYLINE_STORAGE_H\n\nnamespace Eigen { \n\n/** Stores a skyline set of values in three structures :\n * The diagonal elements\n * The upper elements\n * The lower elements\n *\n */\ntemplate<typename Scalar>\nclass SkylineStorage {\n    typedef typename NumTraits<Scalar>::Real RealScalar;\n    typedef SparseIndex Index;\npublic:\n\n    SkylineStorage()\n    : m_diag(0),\n    m_lower(0),\n    m_upper(0),\n    m_lowerProfile(0),\n    m_upperProfile(0),\n    m_diagSize(0),\n    m_upperSize(0),\n    m_lowerSize(0),\n    m_upperProfileSize(0),\n    m_lowerProfileSize(0),\n    m_allocatedSize(0) {\n    }\n\n    SkylineStorage(const SkylineStorage& other)\n    : m_diag(0),\n    m_lower(0),\n    m_upper(0),\n    m_lowerProfile(0),\n    m_upperProfile(0),\n    m_diagSize(0),\n    m_upperSize(0),\n    m_lowerSize(0),\n    m_upperProfileSize(0),\n    m_lowerProfileSize(0),\n    m_allocatedSize(0) {\n        *this = other;\n    }\n\n    SkylineStorage & operator=(const SkylineStorage& other) {\n        resize(other.diagSize(), other.m_upperProfileSize, other.m_lowerProfileSize, other.upperSize(), other.lowerSize());\n        memcpy(m_diag, other.m_diag, m_diagSize * sizeof (Scalar));\n        memcpy(m_upper, other.m_upper, other.upperSize() * sizeof (Scalar));\n        memcpy(m_lower, other.m_lower, other.lowerSize() * sizeof (Scalar));\n        memcpy(m_upperProfile, other.m_upperProfile, m_upperProfileSize * sizeof (Index));\n        memcpy(m_lowerProfile, other.m_lowerProfile, m_lowerProfileSize * sizeof (Index));\n        return *this;\n    }\n\n    void swap(SkylineStorage& other) {\n        std::swap(m_diag, other.m_diag);\n        std::swap(m_upper, other.m_upper);\n        std::swap(m_lower, other.m_lower);\n        std::swap(m_upperProfile, other.m_upperProfile);\n        std::swap(m_lowerProfile, other.m_lowerProfile);\n        std::swap(m_diagSize, other.m_diagSize);\n        std::swap(m_upperSize, other.m_upperSize);\n        std::swap(m_lowerSize, other.m_lowerSize);\n        std::swap(m_allocatedSize, other.m_allocatedSize);\n    }\n\n    ~SkylineStorage() {\n        delete[] m_diag;\n        delete[] m_upper;\n        if (m_upper != m_lower)\n            delete[] m_lower;\n        delete[] m_upperProfile;\n        delete[] m_lowerProfile;\n    }\n\n    void reserve(Index size, Index upperProfileSize, Index lowerProfileSize, Index upperSize, Index lowerSize) {\n        Index newAllocatedSize = size + upperSize + lowerSize;\n        if (newAllocatedSize > m_allocatedSize)\n            reallocate(size, upperProfileSize, lowerProfileSize, upperSize, lowerSize);\n    }\n\n    void squeeze() {\n        if (m_allocatedSize > m_diagSize + m_upperSize + m_lowerSize)\n            reallocate(m_diagSize, m_upperProfileSize, m_lowerProfileSize, m_upperSize, m_lowerSize);\n    }\n\n    void resize(Index diagSize, Index upperProfileSize, Index lowerProfileSize, Index upperSize, Index lowerSize, float reserveSizeFactor = 0) {\n        if (m_allocatedSize < diagSize + upperSize + lowerSize)\n            reallocate(diagSize, upperProfileSize, lowerProfileSize, upperSize + Index(reserveSizeFactor * upperSize), lowerSize + Index(reserveSizeFactor * lowerSize));\n        m_diagSize = diagSize;\n        m_upperSize = upperSize;\n        m_lowerSize = lowerSize;\n        m_upperProfileSize = upperProfileSize;\n        m_lowerProfileSize = lowerProfileSize;\n    }\n\n    inline Index diagSize() const {\n        return m_diagSize;\n    }\n\n    inline Index upperSize() const {\n        return m_upperSize;\n    }\n\n    inline Index lowerSize() const {\n        return m_lowerSize;\n    }\n\n    inline Index upperProfileSize() const {\n        return m_upperProfileSize;\n    }\n\n    inline Index lowerProfileSize() const {\n        return m_lowerProfileSize;\n    }\n\n    inline Index allocatedSize() const {\n        return m_allocatedSize;\n    }\n\n    inline void clear() {\n        m_diagSize = 0;\n    }\n\n    inline Scalar& diag(Index i) {\n        return m_diag[i];\n    }\n\n    inline const Scalar& diag(Index i) const {\n        return m_diag[i];\n    }\n\n    inline Scalar& upper(Index i) {\n        return m_upper[i];\n    }\n\n    inline const Scalar& upper(Index i) const {\n        return m_upper[i];\n    }\n\n    inline Scalar& lower(Index i) {\n        return m_lower[i];\n    }\n\n    inline const Scalar& lower(Index i) const {\n        return m_lower[i];\n    }\n\n    inline Index& upperProfile(Index i) {\n        return m_upperProfile[i];\n    }\n\n    inline const Index& upperProfile(Index i) const {\n        return m_upperProfile[i];\n    }\n\n    inline Index& lowerProfile(Index i) {\n        return m_lowerProfile[i];\n    }\n\n    inline const Index& lowerProfile(Index i) const {\n        return m_lowerProfile[i];\n    }\n\n    static SkylineStorage Map(Index* upperProfile, Index* lowerProfile, Scalar* diag, Scalar* upper, Scalar* lower, Index size, Index upperSize, Index lowerSize) {\n        SkylineStorage res;\n        res.m_upperProfile = upperProfile;\n        res.m_lowerProfile = lowerProfile;\n        res.m_diag = diag;\n        res.m_upper = upper;\n        res.m_lower = lower;\n        res.m_allocatedSize = res.m_diagSize = size;\n        res.m_upperSize = upperSize;\n        res.m_lowerSize = lowerSize;\n        return res;\n    }\n\n    inline void reset() {\n        memset(m_diag, 0, m_diagSize * sizeof (Scalar));\n        memset(m_upper, 0, m_upperSize * sizeof (Scalar));\n        memset(m_lower, 0, m_lowerSize * sizeof (Scalar));\n        memset(m_upperProfile, 0, m_diagSize * sizeof (Index));\n        memset(m_lowerProfile, 0, m_diagSize * sizeof (Index));\n    }\n\n    void prune(Scalar reference, RealScalar epsilon = dummy_precision<RealScalar>()) {\n        //TODO\n    }\n\nprotected:\n\n    inline void reallocate(Index diagSize, Index upperProfileSize, Index lowerProfileSize, Index upperSize, Index lowerSize) {\n\n        Scalar* diag = new Scalar[diagSize];\n        Scalar* upper = new Scalar[upperSize];\n        Scalar* lower = new Scalar[lowerSize];\n        Index* upperProfile = new Index[upperProfileSize];\n        Index* lowerProfile = new Index[lowerProfileSize];\n\n        Index copyDiagSize = (std::min)(diagSize, m_diagSize);\n        Index copyUpperSize = (std::min)(upperSize, m_upperSize);\n        Index copyLowerSize = (std::min)(lowerSize, m_lowerSize);\n        Index copyUpperProfileSize = (std::min)(upperProfileSize, m_upperProfileSize);\n        Index copyLowerProfileSize = (std::min)(lowerProfileSize, m_lowerProfileSize);\n\n        // copy\n        memcpy(diag, m_diag, copyDiagSize * sizeof (Scalar));\n        memcpy(upper, m_upper, copyUpperSize * sizeof (Scalar));\n        memcpy(lower, m_lower, copyLowerSize * sizeof (Scalar));\n        memcpy(upperProfile, m_upperProfile, copyUpperProfileSize * sizeof (Index));\n        memcpy(lowerProfile, m_lowerProfile, copyLowerProfileSize * sizeof (Index));\n\n\n\n        // delete old stuff\n        delete[] m_diag;\n        delete[] m_upper;\n        delete[] m_lower;\n        delete[] m_upperProfile;\n        delete[] m_lowerProfile;\n        m_diag = diag;\n        m_upper = upper;\n        m_lower = lower;\n        m_upperProfile = upperProfile;\n        m_lowerProfile = lowerProfile;\n        m_allocatedSize = diagSize + upperSize + lowerSize;\n        m_upperSize = upperSize;\n        m_lowerSize = lowerSize;\n    }\n\npublic:\n    Scalar* m_diag;\n    Scalar* m_upper;\n    Scalar* m_lower;\n    Index* m_upperProfile;\n    Index* m_lowerProfile;\n    Index m_diagSize;\n    Index m_upperSize;\n    Index m_lowerSize;\n    Index m_upperProfileSize;\n    Index m_lowerProfileSize;\n    Index m_allocatedSize;\n\n};\n\n} // end namespace Eigen\n\n#endif // EIGEN_COMPRESSED_STORAGE_H\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/Skyline/SkylineUtil.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Guillaume Saupin <guillaume.saupin@cea.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SKYLINEUTIL_H\n#define EIGEN_SKYLINEUTIL_H\n\nnamespace Eigen { \n\n#ifdef NDEBUG\n#define EIGEN_DBG_SKYLINE(X)\n#else\n#define EIGEN_DBG_SKYLINE(X) X\n#endif\n\nconst unsigned int SkylineBit = 0x1200;\ntemplate<typename Lhs, typename Rhs, int ProductMode> class SkylineProduct;\nenum AdditionalProductEvaluationMode {SkylineTimeDenseProduct, SkylineTimeSkylineProduct, DenseTimeSkylineProduct};\nenum {IsSkyline = SkylineBit};\n\n\n#define EIGEN_SKYLINE_INHERIT_ASSIGNMENT_OPERATOR(Derived, Op) \\\ntemplate<typename OtherDerived> \\\nEIGEN_STRONG_INLINE Derived& operator Op(const Eigen::SkylineMatrixBase<OtherDerived>& other) \\\n{ \\\n  return Base::operator Op(other.derived()); \\\n} \\\nEIGEN_STRONG_INLINE Derived& operator Op(const Derived& other) \\\n{ \\\n  return Base::operator Op(other); \\\n}\n\n#define EIGEN_SKYLINE_INHERIT_SCALAR_ASSIGNMENT_OPERATOR(Derived, Op) \\\ntemplate<typename Other> \\\nEIGEN_STRONG_INLINE Derived& operator Op(const Other& scalar) \\\n{ \\\n  return Base::operator Op(scalar); \\\n}\n\n#define EIGEN_SKYLINE_INHERIT_ASSIGNMENT_OPERATORS(Derived) \\\n  EIGEN_SKYLINE_INHERIT_ASSIGNMENT_OPERATOR(Derived, =) \\\n  EIGEN_SKYLINE_INHERIT_ASSIGNMENT_OPERATOR(Derived, +=) \\\n  EIGEN_SKYLINE_INHERIT_ASSIGNMENT_OPERATOR(Derived, -=) \\\n  EIGEN_SKYLINE_INHERIT_SCALAR_ASSIGNMENT_OPERATOR(Derived, *=) \\\n  EIGEN_SKYLINE_INHERIT_SCALAR_ASSIGNMENT_OPERATOR(Derived, /=)\n\n#define _EIGEN_SKYLINE_GENERIC_PUBLIC_INTERFACE(Derived, BaseClass) \\\n  typedef BaseClass Base; \\\n  typedef typename Eigen::internal::traits<Derived>::Scalar Scalar; \\\n  typedef typename Eigen::NumTraits<Scalar>::Real RealScalar; \\\n  typedef typename Eigen::internal::traits<Derived>::StorageKind StorageKind; \\\n  typedef typename Eigen::internal::index<StorageKind>::type Index; \\\n  enum {  Flags = Eigen::internal::traits<Derived>::Flags, };\n\n#define EIGEN_SKYLINE_GENERIC_PUBLIC_INTERFACE(Derived) \\\n  _EIGEN_SKYLINE_GENERIC_PUBLIC_INTERFACE(Derived, Eigen::SkylineMatrixBase<Derived>)\n\ntemplate<typename Derived> class SkylineMatrixBase;\ntemplate<typename _Scalar, int _Flags = 0> class SkylineMatrix;\ntemplate<typename _Scalar, int _Flags = 0> class DynamicSkylineMatrix;\ntemplate<typename _Scalar, int _Flags = 0> class SkylineVector;\ntemplate<typename _Scalar, int _Flags = 0> class MappedSkylineMatrix;\n\nnamespace internal {\n\ntemplate<typename Lhs, typename Rhs> struct skyline_product_mode;\ntemplate<typename Lhs, typename Rhs, int ProductMode = skyline_product_mode<Lhs,Rhs>::value> struct SkylineProductReturnType;\n\ntemplate<typename T> class eval<T,IsSkyline>\n{\n    typedef typename traits<T>::Scalar _Scalar;\n    enum {\n          _Flags = traits<T>::Flags\n    };\n\n  public:\n    typedef SkylineMatrix<_Scalar, _Flags> type;\n};\n\n} // end namespace internal\n\n} // end namespace Eigen\n\n#endif // EIGEN_SKYLINEUTIL_H\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/SparseExtra/BlockOfDynamicSparseMatrix.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SPARSE_BLOCKFORDYNAMICMATRIX_H\n#define EIGEN_SPARSE_BLOCKFORDYNAMICMATRIX_H\n\nnamespace Eigen { \n\n#if 0\n\n// NOTE Have to be reimplemented as a specialization of BlockImpl< DynamicSparseMatrix<_Scalar, _Options, _Index>, ... >\n// See SparseBlock.h for an example\n\n\n/***************************************************************************\n* specialisation for DynamicSparseMatrix\n***************************************************************************/\n\ntemplate<typename _Scalar, int _Options, typename _Index, int Size>\nclass SparseInnerVectorSet<DynamicSparseMatrix<_Scalar, _Options, _Index>, Size>\n  : public SparseMatrixBase<SparseInnerVectorSet<DynamicSparseMatrix<_Scalar, _Options, _Index>, Size> >\n{\n    typedef DynamicSparseMatrix<_Scalar, _Options, _Index> MatrixType;\n  public:\n\n    enum { IsRowMajor = internal::traits<SparseInnerVectorSet>::IsRowMajor };\n\n    EIGEN_SPARSE_PUBLIC_INTERFACE(SparseInnerVectorSet)\n    class InnerIterator: public MatrixType::InnerIterator\n    {\n      public:\n        inline InnerIterator(const SparseInnerVectorSet& xpr, Index outer)\n          : MatrixType::InnerIterator(xpr.m_matrix, xpr.m_outerStart + outer), m_outer(outer)\n        {}\n        inline Index row() const { return IsRowMajor ? m_outer : this->index(); }\n        inline Index col() const { return IsRowMajor ? this->index() : m_outer; }\n      protected:\n        Index m_outer;\n    };\n\n    inline SparseInnerVectorSet(const MatrixType& matrix, Index outerStart, Index outerSize)\n      : m_matrix(matrix), m_outerStart(outerStart), m_outerSize(outerSize)\n    {\n      eigen_assert( (outerStart>=0) && ((outerStart+outerSize)<=matrix.outerSize()) );\n    }\n\n    inline SparseInnerVectorSet(const MatrixType& matrix, Index outer)\n      : m_matrix(matrix), m_outerStart(outer), m_outerSize(Size)\n    {\n      eigen_assert(Size!=Dynamic);\n      eigen_assert( (outer>=0) && (outer<matrix.outerSize()) );\n    }\n\n    template<typename OtherDerived>\n    inline SparseInnerVectorSet& operator=(const SparseMatrixBase<OtherDerived>& other)\n    {\n      if (IsRowMajor != ((OtherDerived::Flags&RowMajorBit)==RowMajorBit))\n      {\n        // need to transpose => perform a block evaluation followed by a big swap\n        DynamicSparseMatrix<Scalar,IsRowMajor?RowMajorBit:0> aux(other);\n        *this = aux.markAsRValue();\n      }\n      else\n      {\n        // evaluate/copy vector per vector\n        for (Index j=0; j<m_outerSize.value(); ++j)\n        {\n          SparseVector<Scalar,IsRowMajor ? RowMajorBit : 0> aux(other.innerVector(j));\n          m_matrix.const_cast_derived()._data()[m_outerStart+j].swap(aux._data());\n        }\n      }\n      return *this;\n    }\n\n    inline SparseInnerVectorSet& operator=(const SparseInnerVectorSet& other)\n    {\n      return operator=<SparseInnerVectorSet>(other);\n    }\n\n    Index nonZeros() const\n    {\n      Index count = 0;\n      for (Index j=0; j<m_outerSize.value(); ++j)\n        count += m_matrix._data()[m_outerStart+j].size();\n      return count;\n    }\n\n    const Scalar& lastCoeff() const\n    {\n      EIGEN_STATIC_ASSERT_VECTOR_ONLY(SparseInnerVectorSet);\n      eigen_assert(m_matrix.data()[m_outerStart].size()>0);\n      return m_matrix.data()[m_outerStart].vale(m_matrix.data()[m_outerStart].size()-1);\n    }\n\n//     template<typename Sparse>\n//     inline SparseInnerVectorSet& operator=(const SparseMatrixBase<OtherDerived>& other)\n//     {\n//       return *this;\n//     }\n\n    EIGEN_STRONG_INLINE Index rows() const { return IsRowMajor ? m_outerSize.value() : m_matrix.rows(); }\n    EIGEN_STRONG_INLINE Index cols() const { return IsRowMajor ? m_matrix.cols() : m_outerSize.value(); }\n\n  protected:\n\n    const typename MatrixType::Nested m_matrix;\n    Index m_outerStart;\n    const internal::variable_if_dynamic<Index, Size> m_outerSize;\n\n};\n\n#endif\n\n} // end namespace Eigen\n\n#endif // EIGEN_SPARSE_BLOCKFORDYNAMICMATRIX_H\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/SparseExtra/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_SparseExtra_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_SparseExtra_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/unsupported/Eigen/src/SparseExtra COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/SparseExtra/DynamicSparseMatrix.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_DYNAMIC_SPARSEMATRIX_H\n#define EIGEN_DYNAMIC_SPARSEMATRIX_H\n\nnamespace Eigen { \n\n/** \\deprecated use a SparseMatrix in an uncompressed mode\n  *\n  * \\class DynamicSparseMatrix\n  *\n  * \\brief A sparse matrix class designed for matrix assembly purpose\n  *\n  * \\param _Scalar the scalar type, i.e. the type of the coefficients\n  *\n  * Unlike SparseMatrix, this class provides a much higher degree of flexibility. In particular, it allows\n  * random read/write accesses in log(rho*outer_size) where \\c rho is the probability that a coefficient is\n  * nonzero and outer_size is the number of columns if the matrix is column-major and the number of rows\n  * otherwise.\n  *\n  * Internally, the data are stored as a std::vector of compressed vector. The performances of random writes might\n  * decrease as the number of nonzeros per inner-vector increase. In practice, we observed very good performance\n  * till about 100 nonzeros/vector, and the performance remains relatively good till 500 nonzeros/vectors.\n  *\n  * \\see SparseMatrix\n  */\n\nnamespace internal {\ntemplate<typename _Scalar, int _Options, typename _Index>\nstruct traits<DynamicSparseMatrix<_Scalar, _Options, _Index> >\n{\n  typedef _Scalar Scalar;\n  typedef _Index Index;\n  typedef Sparse StorageKind;\n  typedef MatrixXpr XprKind;\n  enum {\n    RowsAtCompileTime = Dynamic,\n    ColsAtCompileTime = Dynamic,\n    MaxRowsAtCompileTime = Dynamic,\n    MaxColsAtCompileTime = Dynamic,\n    Flags = _Options | NestByRefBit | LvalueBit,\n    CoeffReadCost = NumTraits<Scalar>::ReadCost,\n    SupportedAccessPatterns = OuterRandomAccessPattern\n  };\n};\n}\n\ntemplate<typename _Scalar, int _Options, typename _Index>\n class  DynamicSparseMatrix\n  : public SparseMatrixBase<DynamicSparseMatrix<_Scalar, _Options, _Index> >\n{\n  public:\n    EIGEN_SPARSE_PUBLIC_INTERFACE(DynamicSparseMatrix)\n    // FIXME: why are these operator already alvailable ???\n    // EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(DynamicSparseMatrix, +=)\n    // EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(DynamicSparseMatrix, -=)\n    typedef MappedSparseMatrix<Scalar,Flags> Map;\n    using Base::IsRowMajor;\n    using Base::operator=;\n    enum {\n      Options = _Options\n    };\n\n  protected:\n\n    typedef DynamicSparseMatrix<Scalar,(Flags&~RowMajorBit)|(IsRowMajor?RowMajorBit:0)> TransposedSparseMatrix;\n\n    Index m_innerSize;\n    std::vector<internal::CompressedStorage<Scalar,Index> > m_data;\n\n  public:\n\n    inline Index rows() const { return IsRowMajor ? outerSize() : m_innerSize; }\n    inline Index cols() const { return IsRowMajor ? m_innerSize : outerSize(); }\n    inline Index innerSize() const { return m_innerSize; }\n    inline Index outerSize() const { return static_cast<Index>(m_data.size()); }\n    inline Index innerNonZeros(Index j) const { return m_data[j].size(); }\n\n    std::vector<internal::CompressedStorage<Scalar,Index> >& _data() { return m_data; }\n    const std::vector<internal::CompressedStorage<Scalar,Index> >& _data() const { return m_data; }\n\n    /** \\returns the coefficient value at given position \\a row, \\a col\n      * This operation involes a log(rho*outer_size) binary search.\n      */\n    inline Scalar coeff(Index row, Index col) const\n    {\n      const Index outer = IsRowMajor ? row : col;\n      const Index inner = IsRowMajor ? col : row;\n      return m_data[outer].at(inner);\n    }\n\n    /** \\returns a reference to the coefficient value at given position \\a row, \\a col\n      * This operation involes a log(rho*outer_size) binary search. If the coefficient does not\n      * exist yet, then a sorted insertion into a sequential buffer is performed.\n      */\n    inline Scalar& coeffRef(Index row, Index col)\n    {\n      const Index outer = IsRowMajor ? row : col;\n      const Index inner = IsRowMajor ? col : row;\n      return m_data[outer].atWithInsertion(inner);\n    }\n\n    class InnerIterator;\n    class ReverseInnerIterator;\n\n    void setZero()\n    {\n      for (Index j=0; j<outerSize(); ++j)\n        m_data[j].clear();\n    }\n\n    /** \\returns the number of non zero coefficients */\n    Index nonZeros() const\n    {\n      Index res = 0;\n      for (Index j=0; j<outerSize(); ++j)\n        res += static_cast<Index>(m_data[j].size());\n      return res;\n    }\n\n\n\n    void reserve(Index reserveSize = 1000)\n    {\n      if (outerSize()>0)\n      {\n        Index reserveSizePerVector = (std::max)(reserveSize/outerSize(),Index(4));\n        for (Index j=0; j<outerSize(); ++j)\n        {\n          m_data[j].reserve(reserveSizePerVector);\n        }\n      }\n    }\n\n    /** Does nothing: provided for compatibility with SparseMatrix */\n    inline void startVec(Index /*outer*/) {}\n\n    /** \\returns a reference to the non zero coefficient at position \\a row, \\a col assuming that:\n      * - the nonzero does not already exist\n      * - the new coefficient is the last one of the given inner vector.\n      *\n      * \\sa insert, insertBackByOuterInner */\n    inline Scalar& insertBack(Index row, Index col)\n    {\n      return insertBackByOuterInner(IsRowMajor?row:col, IsRowMajor?col:row);\n    }\n\n    /** \\sa insertBack */\n    inline Scalar& insertBackByOuterInner(Index outer, Index inner)\n    {\n      eigen_assert(outer<Index(m_data.size()) && inner<m_innerSize && \"out of range\");\n      eigen_assert(((m_data[outer].size()==0) || (m_data[outer].index(m_data[outer].size()-1)<inner))\n                && \"wrong sorted insertion\");\n      m_data[outer].append(0, inner);\n      return m_data[outer].value(m_data[outer].size()-1);\n    }\n\n    inline Scalar& insert(Index row, Index col)\n    {\n      const Index outer = IsRowMajor ? row : col;\n      const Index inner = IsRowMajor ? col : row;\n\n      Index startId = 0;\n      Index id = static_cast<Index>(m_data[outer].size()) - 1;\n      m_data[outer].resize(id+2,1);\n\n      while ( (id >= startId) && (m_data[outer].index(id) > inner) )\n      {\n        m_data[outer].index(id+1) = m_data[outer].index(id);\n        m_data[outer].value(id+1) = m_data[outer].value(id);\n        --id;\n      }\n      m_data[outer].index(id+1) = inner;\n      m_data[outer].value(id+1) = 0;\n      return m_data[outer].value(id+1);\n    }\n\n    /** Does nothing: provided for compatibility with SparseMatrix */\n    inline void finalize() {}\n\n    /** Suppress all nonzeros which are smaller than \\a reference under the tolerence \\a epsilon */\n    void prune(Scalar reference, RealScalar epsilon = NumTraits<RealScalar>::dummy_precision())\n    {\n      for (Index j=0; j<outerSize(); ++j)\n        m_data[j].prune(reference,epsilon);\n    }\n\n    /** Resize the matrix without preserving the data (the matrix is set to zero)\n      */\n    void resize(Index rows, Index cols)\n    {\n      const Index outerSize = IsRowMajor ? rows : cols;\n      m_innerSize = IsRowMajor ? cols : rows;\n      setZero();\n      if (Index(m_data.size()) != outerSize)\n      {\n        m_data.resize(outerSize);\n      }\n    }\n\n    void resizeAndKeepData(Index rows, Index cols)\n    {\n      const Index outerSize = IsRowMajor ? rows : cols;\n      const Index innerSize = IsRowMajor ? cols : rows;\n      if (m_innerSize>innerSize)\n      {\n        // remove all coefficients with innerCoord>=innerSize\n        // TODO\n        //std::cerr << \"not implemented yet\\n\";\n        exit(2);\n      }\n      if (m_data.size() != outerSize)\n      {\n        m_data.resize(outerSize);\n      }\n    }\n\n    /** The class DynamicSparseMatrix is deprectaed */\n    EIGEN_DEPRECATED inline DynamicSparseMatrix()\n      : m_innerSize(0), m_data(0)\n    {\n      eigen_assert(innerSize()==0 && outerSize()==0);\n    }\n\n    /** The class DynamicSparseMatrix is deprectaed */\n    EIGEN_DEPRECATED inline DynamicSparseMatrix(Index rows, Index cols)\n      : m_innerSize(0)\n    {\n      resize(rows, cols);\n    }\n\n    /** The class DynamicSparseMatrix is deprectaed */\n    template<typename OtherDerived>\n    EIGEN_DEPRECATED explicit inline DynamicSparseMatrix(const SparseMatrixBase<OtherDerived>& other)\n      : m_innerSize(0)\n    {\n    Base::operator=(other.derived());\n    }\n\n    inline DynamicSparseMatrix(const DynamicSparseMatrix& other)\n      : Base(), m_innerSize(0)\n    {\n      *this = other.derived();\n    }\n\n    inline void swap(DynamicSparseMatrix& other)\n    {\n      //EIGEN_DBG_SPARSE(std::cout << \"SparseMatrix:: swap\\n\");\n      std::swap(m_innerSize, other.m_innerSize);\n      //std::swap(m_outerSize, other.m_outerSize);\n      m_data.swap(other.m_data);\n    }\n\n    inline DynamicSparseMatrix& operator=(const DynamicSparseMatrix& other)\n    {\n      if (other.isRValue())\n      {\n        swap(other.const_cast_derived());\n      }\n      else\n      {\n        resize(other.rows(), other.cols());\n        m_data = other.m_data;\n      }\n      return *this;\n    }\n\n    /** Destructor */\n    inline ~DynamicSparseMatrix() {}\n\n  public:\n\n    /** \\deprecated\n      * Set the matrix to zero and reserve the memory for \\a reserveSize nonzero coefficients. */\n    EIGEN_DEPRECATED void startFill(Index reserveSize = 1000)\n    {\n      setZero();\n      reserve(reserveSize);\n    }\n\n    /** \\deprecated use insert()\n      * inserts a nonzero coefficient at given coordinates \\a row, \\a col and returns its reference assuming that:\n      *  1 - the coefficient does not exist yet\n      *  2 - this the coefficient with greater inner coordinate for the given outer coordinate.\n      * In other words, assuming \\c *this is column-major, then there must not exists any nonzero coefficient of coordinates\n      * \\c i \\c x \\a col such that \\c i >= \\a row. Otherwise the matrix is invalid.\n      *\n      * \\see fillrand(), coeffRef()\n      */\n    EIGEN_DEPRECATED Scalar& fill(Index row, Index col)\n    {\n      const Index outer = IsRowMajor ? row : col;\n      const Index inner = IsRowMajor ? col : row;\n      return insertBack(outer,inner);\n    }\n\n    /** \\deprecated use insert()\n      * Like fill() but with random inner coordinates.\n      * Compared to the generic coeffRef(), the unique limitation is that we assume\n      * the coefficient does not exist yet.\n      */\n    EIGEN_DEPRECATED Scalar& fillrand(Index row, Index col)\n    {\n      return insert(row,col);\n    }\n\n    /** \\deprecated use finalize()\n      * Does nothing. Provided for compatibility with SparseMatrix. */\n    EIGEN_DEPRECATED void endFill() {}\n    \n#   ifdef EIGEN_DYNAMICSPARSEMATRIX_PLUGIN\n#     include EIGEN_DYNAMICSPARSEMATRIX_PLUGIN\n#   endif\n };\n\ntemplate<typename Scalar, int _Options, typename _Index>\nclass DynamicSparseMatrix<Scalar,_Options,_Index>::InnerIterator : public SparseVector<Scalar,_Options,_Index>::InnerIterator\n{\n    typedef typename SparseVector<Scalar,_Options,_Index>::InnerIterator Base;\n  public:\n    InnerIterator(const DynamicSparseMatrix& mat, Index outer)\n      : Base(mat.m_data[outer]), m_outer(outer)\n    {}\n\n    inline Index row() const { return IsRowMajor ? m_outer : Base::index(); }\n    inline Index col() const { return IsRowMajor ? Base::index() : m_outer; }\n\n  protected:\n    const Index m_outer;\n};\n\ntemplate<typename Scalar, int _Options, typename _Index>\nclass DynamicSparseMatrix<Scalar,_Options,_Index>::ReverseInnerIterator : public SparseVector<Scalar,_Options,_Index>::ReverseInnerIterator\n{\n    typedef typename SparseVector<Scalar,_Options,_Index>::ReverseInnerIterator Base;\n  public:\n    ReverseInnerIterator(const DynamicSparseMatrix& mat, Index outer)\n      : Base(mat.m_data[outer]), m_outer(outer)\n    {}\n\n    inline Index row() const { return IsRowMajor ? m_outer : Base::index(); }\n    inline Index col() const { return IsRowMajor ? Base::index() : m_outer; }\n\n  protected:\n    const Index m_outer;\n};\n\n} // end namespace Eigen\n\n#endif // EIGEN_DYNAMIC_SPARSEMATRIX_H\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/SparseExtra/MarketIO.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2011 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2012 Desire NUENTSA WAKAM <desire.nuentsa_wakam@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SPARSE_MARKET_IO_H\n#define EIGEN_SPARSE_MARKET_IO_H\n\n#include <iostream>\n\nnamespace Eigen { \n\nnamespace internal \n{\n  template <typename Scalar>\n  inline bool GetMarketLine (std::stringstream& line, int& M, int& N, int& i, int& j, Scalar& value)\n  {\n    line >> i >> j >> value;\n    i--;\n    j--;\n    if(i>=0 && j>=0 && i<M && j<N)\n    {\n      return true; \n    }\n    else\n      return false;\n  }\n  template <typename Scalar>\n  inline bool GetMarketLine (std::stringstream& line, int& M, int& N, int& i, int& j, std::complex<Scalar>& value)\n  {\n    Scalar valR, valI;\n    line >> i >> j >> valR >> valI;\n    i--;\n    j--;\n    if(i>=0 && j>=0 && i<M && j<N)\n    {\n      value = std::complex<Scalar>(valR, valI);\n      return true; \n    }\n    else\n      return false;\n  }\n\n  template <typename RealScalar>\n  inline void  GetVectorElt (const std::string& line, RealScalar& val)\n  {\n    std::istringstream newline(line);\n    newline >> val;  \n  }\n\n  template <typename RealScalar>\n  inline void GetVectorElt (const std::string& line, std::complex<RealScalar>& val)\n  {\n    RealScalar valR, valI; \n    std::istringstream newline(line);\n    newline >> valR >> valI; \n    val = std::complex<RealScalar>(valR, valI);\n  }\n  \n  template<typename Scalar>\n  inline void putMarketHeader(std::string& header,int sym)\n  {\n    header= \"%%MatrixMarket matrix coordinate \";\n    if(internal::is_same<Scalar, std::complex<float> >::value || internal::is_same<Scalar, std::complex<double> >::value)\n    {\n      header += \" complex\"; \n      if(sym == Symmetric) header += \" symmetric\";\n      else if (sym == SelfAdjoint) header += \" Hermitian\";\n      else header += \" general\";\n    }\n    else\n    {\n      header += \" real\"; \n      if(sym == Symmetric) header += \" symmetric\";\n      else header += \" general\";\n    }\n  }\n\n  template<typename Scalar>\n  inline void PutMatrixElt(Scalar value, int row, int col, std::ofstream& out)\n  {\n    out << row << \" \"<< col << \" \" << value << \"\\n\";\n  }\n  template<typename Scalar>\n  inline void PutMatrixElt(std::complex<Scalar> value, int row, int col, std::ofstream& out)\n  {\n    out << row << \" \" << col << \" \" << value.real() << \" \" << value.imag() << \"\\n\";\n  }\n\n\n  template<typename Scalar>\n  inline void putVectorElt(Scalar value, std::ofstream& out)\n  {\n    out << value << \"\\n\"; \n  }\n  template<typename Scalar>\n  inline void putVectorElt(std::complex<Scalar> value, std::ofstream& out)\n  {\n    out << value.real << \" \" << value.imag()<< \"\\n\"; \n  }\n\n} // end namepsace internal\n\ninline bool getMarketHeader(const std::string& filename, int& sym, bool& iscomplex, bool& isvector)\n{\n  sym = 0; \n  isvector = false;\n  std::ifstream in(filename.c_str(),std::ios::in);\n  if(!in)\n    return false;\n  \n  std::string line; \n  // The matrix header is always the first line in the file \n  std::getline(in, line); eigen_assert(in.good());\n  \n  std::stringstream fmtline(line); \n  std::string substr[5];\n  fmtline>> substr[0] >> substr[1] >> substr[2] >> substr[3] >> substr[4];\n  if(substr[2].compare(\"array\") == 0) isvector = true;\n  if(substr[3].compare(\"complex\") == 0) iscomplex = true;\n  if(substr[4].compare(\"symmetric\") == 0) sym = Symmetric;\n  else if (substr[4].compare(\"Hermitian\") == 0) sym = SelfAdjoint;\n  \n  return true;\n}\n  \ntemplate<typename SparseMatrixType>\nbool loadMarket(SparseMatrixType& mat, const std::string& filename)\n{\n  typedef typename SparseMatrixType::Scalar Scalar;\n  std::ifstream input(filename.c_str(),std::ios::in);\n  if(!input)\n    return false;\n  \n  const int maxBuffersize = 2048;\n  char buffer[maxBuffersize];\n  \n  bool readsizes = false;\n\n  typedef Triplet<Scalar,int> T;\n  std::vector<T> elements;\n  \n  int M(-1), N(-1), NNZ(-1);\n  int count = 0;\n  while(input.getline(buffer, maxBuffersize))\n  {\n    // skip comments   \n    //NOTE An appropriate test should be done on the header to get the  symmetry\n    if(buffer[0]=='%')\n      continue;\n    \n    std::stringstream line(buffer);\n    \n    if(!readsizes)\n    {\n      line >> M >> N >> NNZ;\n      if(M > 0 && N > 0 && NNZ > 0) \n      {\n        readsizes = true;\n        std::cout << \"sizes: \" << M << \",\" << N << \",\" << NNZ << \"\\n\";\n        mat.resize(M,N);\n        mat.reserve(NNZ);\n      }\n    }\n    else\n    { \n      int i(-1), j(-1);\n      Scalar value; \n      if( internal::GetMarketLine(line, M, N, i, j, value) ) \n      {\n        ++ count;\n        elements.push_back(T(i,j,value));\n      }\n      else \n        std::cerr << \"Invalid read: \" << i << \",\" << j << \"\\n\";        \n    }\n  }\n  mat.setFromTriplets(elements.begin(), elements.end());\n  if(count!=NNZ)\n    std::cerr << count << \"!=\" << NNZ << \"\\n\";\n  \n  input.close();\n  return true;\n}\n\ntemplate<typename VectorType>\nbool loadMarketVector(VectorType& vec, const std::string& filename)\n{\n   typedef typename VectorType::Scalar Scalar;\n  std::ifstream in(filename.c_str(), std::ios::in);\n  if(!in)\n    return false;\n  \n  std::string line; \n  int n(0), col(0); \n  do \n  { // Skip comments\n    std::getline(in, line); eigen_assert(in.good());\n  } while (line[0] == '%');\n  std::istringstream newline(line);\n  newline  >> n >> col; \n  eigen_assert(n>0 && col>0);\n  vec.resize(n);\n  int i = 0; \n  Scalar value; \n  while ( std::getline(in, line) && (i < n) ){\n    internal::GetVectorElt(line, value); \n    vec(i++) = value; \n  }\n  in.close();\n  if (i!=n){\n    std::cerr<< \"Unable to read all elements from file \" << filename << \"\\n\";\n    return false;\n  }\n  return true;\n}\n\ntemplate<typename SparseMatrixType>\nbool saveMarket(const SparseMatrixType& mat, const std::string& filename, int sym = 0)\n{\n  typedef typename SparseMatrixType::Scalar Scalar;\n  std::ofstream out(filename.c_str(),std::ios::out);\n  if(!out)\n    return false;\n  \n  out.flags(std::ios_base::scientific);\n  out.precision(64);\n  std::string header; \n  internal::putMarketHeader<Scalar>(header, sym); \n  out << header << std::endl; \n  out << mat.rows() << \" \" << mat.cols() << \" \" << mat.nonZeros() << \"\\n\";\n  int count = 0;\n  for(int j=0; j<mat.outerSize(); ++j)\n    for(typename SparseMatrixType::InnerIterator it(mat,j); it; ++it)\n    {\n\t++ count;\n\tinternal::PutMatrixElt(it.value(), it.row()+1, it.col()+1, out);\n\t// out << it.row()+1 << \" \" << it.col()+1 << \" \" << it.value() << \"\\n\";\n    }\n  out.close();\n  return true;\n}\n\ntemplate<typename VectorType>\nbool saveMarketVector (const VectorType& vec, const std::string& filename)\n{\n typedef typename VectorType::Scalar Scalar; \n std::ofstream out(filename.c_str(),std::ios::out);\n  if(!out)\n    return false;\n  \n  out.flags(std::ios_base::scientific);\n  out.precision(64);\n  if(internal::is_same<Scalar, std::complex<float> >::value || internal::is_same<Scalar, std::complex<double> >::value)\n      out << \"%%MatrixMarket matrix array complex general\\n\"; \n  else\n    out << \"%%MatrixMarket matrix array real general\\n\"; \n  out << vec.size() << \" \"<< 1 << \"\\n\";\n  for (int i=0; i < vec.size(); i++){\n    internal::putVectorElt(vec(i), out); \n  }\n  out.close();\n  return true; \n}\n\n} // end namespace Eigen\n\n#endif // EIGEN_SPARSE_MARKET_IO_H\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/SparseExtra/MatrixMarketIterator.h",
    "content": "\n// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Desire NUENTSA WAKAM <desire.nuentsa_wakam@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_BROWSE_MATRICES_H\n#define EIGEN_BROWSE_MATRICES_H\n\nnamespace Eigen {\n\nenum {\n  SPD = 0x100,\n  NonSymmetric = 0x0\n}; \n\n/** \n * @brief Iterator to browse matrices from a specified folder\n * \n * This is used to load all the matrices from a folder. \n * The matrices should be in Matrix Market format\n * It is assumed that the matrices are named as matname.mtx\n * and matname_SPD.mtx if the matrix is Symmetric and positive definite (or Hermitian)\n * The right hand side vectors are loaded as well, if they exist.\n * They should be named as matname_b.mtx. \n * Note that the right hand side for a SPD matrix is named as matname_SPD_b.mtx\n * \n * Sometimes a reference solution is available. In this case, it should be named as matname_x.mtx\n * \n * Sample code\n * \\code\n * \n * \\endcode\n * \n * \\tparam Scalar The scalar type \n */\ntemplate <typename Scalar>\nclass MatrixMarketIterator \n{\n  public:\n    typedef Matrix<Scalar,Dynamic,1> VectorType; \n    typedef SparseMatrix<Scalar,ColMajor> MatrixType; \n  \n  public:\n    MatrixMarketIterator(const std::string folder):m_sym(0),m_isvalid(false),m_matIsLoaded(false),m_hasRhs(false),m_hasrefX(false),m_folder(folder)\n    {\n      m_folder_id = opendir(folder.c_str());\n      if (!m_folder_id){\n        m_isvalid = false;\n        std::cerr << \"The provided Matrix folder could not be opened \\n\\n\";\n        abort();\n      }\n      Getnextvalidmatrix();\n    }\n    \n    ~MatrixMarketIterator()\n    {\n      if (m_folder_id) closedir(m_folder_id); \n    }\n    \n    inline MatrixMarketIterator& operator++()\n    {\n      m_matIsLoaded = false;\n      m_hasrefX = false;\n      m_hasRhs = false;\n      Getnextvalidmatrix();\n      return *this;\n    }\n    inline operator bool() const { return m_isvalid;}\n    \n    /** Return the sparse matrix corresponding to the current file */\n    inline MatrixType& matrix() \n    { \n      // Read the matrix\n      if (m_matIsLoaded) return m_mat;\n      \n      std::string matrix_file = m_folder + \"/\" + m_matname + \".mtx\";\n      if ( !loadMarket(m_mat, matrix_file)) \n      {\n        m_matIsLoaded = false;\n        return m_mat;\n      }\n      m_matIsLoaded = true; \n      \n      if (m_sym != NonSymmetric) \n      { // Store the upper part of the matrix. It is needed by the solvers dealing with nonsymmetric matrices ??\n        MatrixType B; \n        B = m_mat;\n        m_mat = B.template selfadjointView<Lower>();\n      }\n      return m_mat; \n    }\n    \n    /** Return the right hand side corresponding to the current matrix. \n     * If the rhs file is not provided, a random rhs is generated\n     */\n    inline VectorType& rhs() \n    { \n       // Get the right hand side\n      if (m_hasRhs) return m_rhs;\n      \n      std::string rhs_file;\n      rhs_file = m_folder + \"/\" + m_matname + \"_b.mtx\"; // The pattern is matname_b.mtx\n      m_hasRhs = Fileexists(rhs_file);\n      if (m_hasRhs)\n      {\n        m_rhs.resize(m_mat.cols());\n        m_hasRhs = loadMarketVector(m_rhs, rhs_file);\n      }\n      if (!m_hasRhs)\n      {\n        // Generate a random right hand side\n        if (!m_matIsLoaded) this->matrix(); \n        m_refX.resize(m_mat.cols());\n        m_refX.setRandom();\n        m_rhs = m_mat * m_refX;\n        m_hasrefX = true;\n        m_hasRhs = true;\n      }\n      return m_rhs; \n    }\n    \n    /** Return a reference solution\n     * If it is not provided and if the right hand side is not available\n     * then refX is randomly generated such that A*refX = b \n     * where A and b are the matrix and the rhs. \n     * Note that when a rhs is provided, refX is not available \n     */\n    inline VectorType& refX() \n    { \n      // Check if a reference solution is provided\n      if (m_hasrefX) return m_refX;\n      \n      std::string lhs_file;\n      lhs_file = m_folder + \"/\" + m_matname + \"_x.mtx\"; \n      m_hasrefX = Fileexists(lhs_file);\n      if (m_hasrefX)\n      {\n        m_refX.resize(m_mat.cols());\n        m_hasrefX = loadMarketVector(m_refX, lhs_file);\n      }\n      return m_refX; \n    }\n    \n    inline std::string& matname() { return m_matname; }\n    \n    inline int sym() { return m_sym; }\n    \n    inline bool hasRhs() {return m_hasRhs; }\n    inline bool hasrefX() {return m_hasrefX; }\n    \n  protected:\n    \n    inline bool Fileexists(std::string file)\n    {\n      std::ifstream file_id(file.c_str());\n      if (!file_id.good() ) \n      {\n        return false;\n      }\n      else \n      {\n        file_id.close();\n        return true;\n      }\n    }\n    \n    void Getnextvalidmatrix( )\n    {\n      m_isvalid = false;\n      // Here, we return with the next valid matrix in the folder\n      while ( (m_curs_id = readdir(m_folder_id)) != NULL) {\n        m_isvalid = false;\n        std::string curfile;\n        curfile = m_folder + \"/\" + m_curs_id->d_name;\n        // Discard if it is a folder\n        if (m_curs_id->d_type == DT_DIR) continue; //FIXME This may not be available on non BSD systems\n//         struct stat st_buf; \n//         stat (curfile.c_str(), &st_buf);\n//         if (S_ISDIR(st_buf.st_mode)) continue;\n        \n        // Determine from the header if it is a matrix or a right hand side \n        bool isvector,iscomplex=false;\n        if(!getMarketHeader(curfile,m_sym,iscomplex,isvector)) continue;\n        if(isvector) continue;\n        if (!iscomplex)\n        {\n          if(internal::is_same<Scalar, std::complex<float> >::value || internal::is_same<Scalar, std::complex<double> >::value)\n            continue; \n        }\n        if (iscomplex)\n        {\n          if(internal::is_same<Scalar, float>::value || internal::is_same<Scalar, double>::value)\n            continue; \n        }\n        \n        \n        // Get the matrix name\n        std::string filename = m_curs_id->d_name;\n        m_matname = filename.substr(0, filename.length()-4); \n        \n        // Find if the matrix is SPD \n        size_t found = m_matname.find(\"SPD\");\n        if( (found!=std::string::npos) && (m_sym != NonSymmetric) )\n          m_sym = SPD;\n       \n        m_isvalid = true;\n        break; \n      }\n    }\n    int m_sym; // Symmetry of the matrix\n    MatrixType m_mat; // Current matrix  \n    VectorType m_rhs;  // Current vector\n    VectorType m_refX; // The reference solution, if exists\n    std::string m_matname; // Matrix Name\n    bool m_isvalid; \n    bool m_matIsLoaded; // Determine if the matrix has already been loaded from the file\n    bool m_hasRhs; // The right hand side exists\n    bool m_hasrefX; // A reference solution is provided\n    std::string m_folder;\n    DIR * m_folder_id;\n    struct dirent *m_curs_id; \n    \n};\n\n} // end namespace Eigen\n\n#endif\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/SparseExtra/RandomSetter.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_RANDOMSETTER_H\n#define EIGEN_RANDOMSETTER_H\n\nnamespace Eigen { \n\n/** Represents a std::map\n  *\n  * \\see RandomSetter\n  */\ntemplate<typename Scalar> struct StdMapTraits\n{\n  typedef int KeyType;\n  typedef std::map<KeyType,Scalar> Type;\n  enum {\n    IsSorted = 1\n  };\n\n  static void setInvalidKey(Type&, const KeyType&) {}\n};\n\n#ifdef EIGEN_UNORDERED_MAP_SUPPORT\n/** Represents a std::unordered_map\n  *\n  * To use it you need to both define EIGEN_UNORDERED_MAP_SUPPORT and include the unordered_map header file\n  * yourself making sure that unordered_map is defined in the std namespace.\n  *\n  * For instance, with current version of gcc you can either enable C++0x standard (-std=c++0x) or do:\n  * \\code\n  * #include <tr1/unordered_map>\n  * #define EIGEN_UNORDERED_MAP_SUPPORT\n  * namespace std {\n  *   using std::tr1::unordered_map;\n  * }\n  * \\endcode\n  *\n  * \\see RandomSetter\n  */\ntemplate<typename Scalar> struct StdUnorderedMapTraits\n{\n  typedef int KeyType;\n  typedef std::unordered_map<KeyType,Scalar> Type;\n  enum {\n    IsSorted = 0\n  };\n\n  static void setInvalidKey(Type&, const KeyType&) {}\n};\n#endif // EIGEN_UNORDERED_MAP_SUPPORT\n\n#ifdef _DENSE_HASH_MAP_H_\n/** Represents a google::dense_hash_map\n  *\n  * \\see RandomSetter\n  */\ntemplate<typename Scalar> struct GoogleDenseHashMapTraits\n{\n  typedef int KeyType;\n  typedef google::dense_hash_map<KeyType,Scalar> Type;\n  enum {\n    IsSorted = 0\n  };\n\n  static void setInvalidKey(Type& map, const KeyType& k)\n  { map.set_empty_key(k); }\n};\n#endif\n\n#ifdef _SPARSE_HASH_MAP_H_\n/** Represents a google::sparse_hash_map\n  *\n  * \\see RandomSetter\n  */\ntemplate<typename Scalar> struct GoogleSparseHashMapTraits\n{\n  typedef int KeyType;\n  typedef google::sparse_hash_map<KeyType,Scalar> Type;\n  enum {\n    IsSorted = 0\n  };\n\n  static void setInvalidKey(Type&, const KeyType&) {}\n};\n#endif\n\n/** \\class RandomSetter\n  *\n  * \\brief The RandomSetter is a wrapper object allowing to set/update a sparse matrix with random access\n  *\n  * \\param SparseMatrixType the type of the sparse matrix we are updating\n  * \\param MapTraits a traits class representing the map implementation used for the temporary sparse storage.\n  *                  Its default value depends on the system.\n  * \\param OuterPacketBits defines the number of rows (or columns) manage by a single map object\n  *                        as a power of two exponent.\n  *\n  * This class temporarily represents a sparse matrix object using a generic map implementation allowing for\n  * efficient random access. The conversion from the compressed representation to a hash_map object is performed\n  * in the RandomSetter constructor, while the sparse matrix is updated back at destruction time. This strategy\n  * suggest the use of nested blocks as in this example:\n  *\n  * \\code\n  * SparseMatrix<double> m(rows,cols);\n  * {\n  *   RandomSetter<SparseMatrix<double> > w(m);\n  *   // don't use m but w instead with read/write random access to the coefficients:\n  *   for(;;)\n  *     w(rand(),rand()) = rand;\n  * }\n  * // when w is deleted, the data are copied back to m\n  * // and m is ready to use.\n  * \\endcode\n  *\n  * Since hash_map objects are not fully sorted, representing a full matrix as a single hash_map would\n  * involve a big and costly sort to update the compressed matrix back. To overcome this issue, a RandomSetter\n  * use multiple hash_map, each representing 2^OuterPacketBits columns or rows according to the storage order.\n  * To reach optimal performance, this value should be adjusted according to the average number of nonzeros\n  * per rows/columns.\n  *\n  * The possible values for the template parameter MapTraits are:\n  *  - \\b StdMapTraits: corresponds to std::map. (does not perform very well)\n  *  - \\b GnuHashMapTraits: corresponds to __gnu_cxx::hash_map (available only with GCC)\n  *  - \\b GoogleDenseHashMapTraits: corresponds to google::dense_hash_map (best efficiency, reasonable memory consumption)\n  *  - \\b GoogleSparseHashMapTraits: corresponds to google::sparse_hash_map (best memory consumption, relatively good performance)\n  *\n  * The default map implementation depends on the availability, and the preferred order is:\n  * GoogleSparseHashMapTraits, GnuHashMapTraits, and finally StdMapTraits.\n  *\n  * For performance and memory consumption reasons it is highly recommended to use one of\n  * the Google's hash_map implementation. To enable the support for them, you have two options:\n  *  - \\#include <google/dense_hash_map> yourself \\b before Eigen/Sparse header\n  *  - define EIGEN_GOOGLEHASH_SUPPORT\n  * In the later case the inclusion of <google/dense_hash_map> is made for you.\n  *\n  * \\see http://code.google.com/p/google-sparsehash/\n  */\ntemplate<typename SparseMatrixType,\n         template <typename T> class MapTraits =\n#if defined _DENSE_HASH_MAP_H_\n          GoogleDenseHashMapTraits\n#elif defined _HASH_MAP\n          GnuHashMapTraits\n#else\n          StdMapTraits\n#endif\n         ,int OuterPacketBits = 6>\nclass RandomSetter\n{\n    typedef typename SparseMatrixType::Scalar Scalar;\n    typedef typename SparseMatrixType::Index Index;\n\n    struct ScalarWrapper\n    {\n      ScalarWrapper() : value(0) {}\n      Scalar value;\n    };\n    typedef typename MapTraits<ScalarWrapper>::KeyType KeyType;\n    typedef typename MapTraits<ScalarWrapper>::Type HashMapType;\n    static const int OuterPacketMask = (1 << OuterPacketBits) - 1;\n    enum {\n      SwapStorage = 1 - MapTraits<ScalarWrapper>::IsSorted,\n      TargetRowMajor = (SparseMatrixType::Flags & RowMajorBit) ? 1 : 0,\n      SetterRowMajor = SwapStorage ? 1-TargetRowMajor : TargetRowMajor\n    };\n\n  public:\n\n    /** Constructs a random setter object from the sparse matrix \\a target\n      *\n      * Note that the initial value of \\a target are imported. If you want to re-set\n      * a sparse matrix from scratch, then you must set it to zero first using the\n      * setZero() function.\n      */\n    inline RandomSetter(SparseMatrixType& target)\n      : mp_target(&target)\n    {\n      const Index outerSize = SwapStorage ? target.innerSize() : target.outerSize();\n      const Index innerSize = SwapStorage ? target.outerSize() : target.innerSize();\n      m_outerPackets = outerSize >> OuterPacketBits;\n      if (outerSize&OuterPacketMask)\n        m_outerPackets += 1;\n      m_hashmaps = new HashMapType[m_outerPackets];\n      // compute number of bits needed to store inner indices\n      Index aux = innerSize - 1;\n      m_keyBitsOffset = 0;\n      while (aux)\n      {\n        ++m_keyBitsOffset;\n        aux = aux >> 1;\n      }\n      KeyType ik = (1<<(OuterPacketBits+m_keyBitsOffset));\n      for (Index k=0; k<m_outerPackets; ++k)\n        MapTraits<ScalarWrapper>::setInvalidKey(m_hashmaps[k],ik);\n\n      // insert current coeffs\n      for (Index j=0; j<mp_target->outerSize(); ++j)\n        for (typename SparseMatrixType::InnerIterator it(*mp_target,j); it; ++it)\n          (*this)(TargetRowMajor?j:it.index(), TargetRowMajor?it.index():j) = it.value();\n    }\n\n    /** Destructor updating back the sparse matrix target */\n    ~RandomSetter()\n    {\n      KeyType keyBitsMask = (1<<m_keyBitsOffset)-1;\n      if (!SwapStorage) // also means the map is sorted\n      {\n        mp_target->setZero();\n        mp_target->makeCompressed();\n        mp_target->reserve(nonZeros());\n        Index prevOuter = -1;\n        for (Index k=0; k<m_outerPackets; ++k)\n        {\n          const Index outerOffset = (1<<OuterPacketBits) * k;\n          typename HashMapType::iterator end = m_hashmaps[k].end();\n          for (typename HashMapType::iterator it = m_hashmaps[k].begin(); it!=end; ++it)\n          {\n            const Index outer = (it->first >> m_keyBitsOffset) + outerOffset;\n            const Index inner = it->first & keyBitsMask;\n            if (prevOuter!=outer)\n            {\n              for (Index j=prevOuter+1;j<=outer;++j)\n                mp_target->startVec(j);\n              prevOuter = outer;\n            }\n            mp_target->insertBackByOuterInner(outer, inner) = it->second.value;\n          }\n        }\n        mp_target->finalize();\n      }\n      else\n      {\n        VectorXi positions(mp_target->outerSize());\n        positions.setZero();\n        // pass 1\n        for (Index k=0; k<m_outerPackets; ++k)\n        {\n          typename HashMapType::iterator end = m_hashmaps[k].end();\n          for (typename HashMapType::iterator it = m_hashmaps[k].begin(); it!=end; ++it)\n          {\n            const Index outer = it->first & keyBitsMask;\n            ++positions[outer];\n          }\n        }\n        // prefix sum\n        Index count = 0;\n        for (Index j=0; j<mp_target->outerSize(); ++j)\n        {\n          Index tmp = positions[j];\n          mp_target->outerIndexPtr()[j] = count;\n          positions[j] = count;\n          count += tmp;\n        }\n        mp_target->makeCompressed();\n        mp_target->outerIndexPtr()[mp_target->outerSize()] = count;\n        mp_target->resizeNonZeros(count);\n        // pass 2\n        for (Index k=0; k<m_outerPackets; ++k)\n        {\n          const Index outerOffset = (1<<OuterPacketBits) * k;\n          typename HashMapType::iterator end = m_hashmaps[k].end();\n          for (typename HashMapType::iterator it = m_hashmaps[k].begin(); it!=end; ++it)\n          {\n            const Index inner = (it->first >> m_keyBitsOffset) + outerOffset;\n            const Index outer = it->first & keyBitsMask;\n            // sorted insertion\n            // Note that we have to deal with at most 2^OuterPacketBits unsorted coefficients,\n            // moreover those 2^OuterPacketBits coeffs are likely to be sparse, an so only a\n            // small fraction of them have to be sorted, whence the following simple procedure:\n            Index posStart = mp_target->outerIndexPtr()[outer];\n            Index i = (positions[outer]++) - 1;\n            while ( (i >= posStart) && (mp_target->innerIndexPtr()[i] > inner) )\n            {\n              mp_target->valuePtr()[i+1] = mp_target->valuePtr()[i];\n              mp_target->innerIndexPtr()[i+1] = mp_target->innerIndexPtr()[i];\n              --i;\n            }\n            mp_target->innerIndexPtr()[i+1] = inner;\n            mp_target->valuePtr()[i+1] = it->second.value;\n          }\n        }\n      }\n      delete[] m_hashmaps;\n    }\n\n    /** \\returns a reference to the coefficient at given coordinates \\a row, \\a col */\n    Scalar& operator() (Index row, Index col)\n    {\n      const Index outer = SetterRowMajor ? row : col;\n      const Index inner = SetterRowMajor ? col : row;\n      const Index outerMajor = outer >> OuterPacketBits; // index of the packet/map\n      const Index outerMinor = outer & OuterPacketMask;  // index of the inner vector in the packet\n      const KeyType key = (KeyType(outerMinor)<<m_keyBitsOffset) | inner;\n      return m_hashmaps[outerMajor][key].value;\n    }\n\n    /** \\returns the number of non zero coefficients\n      *\n      * \\note According to the underlying map/hash_map implementation,\n      * this function might be quite expensive.\n      */\n    Index nonZeros() const\n    {\n      Index nz = 0;\n      for (Index k=0; k<m_outerPackets; ++k)\n        nz += static_cast<Index>(m_hashmaps[k].size());\n      return nz;\n    }\n\n\n  protected:\n\n    HashMapType* m_hashmaps;\n    SparseMatrixType* mp_target;\n    Index m_outerPackets;\n    unsigned char m_keyBitsOffset;\n};\n\n} // end namespace Eigen\n\n#endif // EIGEN_RANDOMSETTER_H\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/Splines/CMakeLists.txt",
    "content": "FILE(GLOB Eigen_Splines_SRCS \"*.h\")\n\nINSTALL(FILES\n  ${Eigen_Splines_SRCS}\n  DESTINATION ${INCLUDE_INSTALL_DIR}/unsupported/Eigen/src/Splines COMPONENT Devel\n  )\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/Splines/Spline.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 20010-2011 Hauke Heibel <hauke.heibel@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SPLINE_H\n#define EIGEN_SPLINE_H\n\n#include \"SplineFwd.h\"\n\nnamespace Eigen\n{\n    /**\n     * \\ingroup Splines_Module\n     * \\class Spline\n     * \\brief A class representing multi-dimensional spline curves.\n     *\n     * The class represents B-splines with non-uniform knot vectors. Each control\n     * point of the B-spline is associated with a basis function\n     * \\f{align*}\n     *   C(u) & = \\sum_{i=0}^{n}N_{i,p}(u)P_i\n     * \\f}\n     *\n     * \\tparam _Scalar The underlying data type (typically float or double)\n     * \\tparam _Dim The curve dimension (e.g. 2 or 3)\n     * \\tparam _Degree Per default set to Dynamic; could be set to the actual desired\n     *                degree for optimization purposes (would result in stack allocation\n     *                of several temporary variables).\n     **/\n  template <typename _Scalar, int _Dim, int _Degree>\n  class Spline\n  {\n  public:\n    typedef _Scalar Scalar; /*!< The spline curve's scalar type. */\n    enum { Dimension = _Dim /*!< The spline curve's dimension. */ };\n    enum { Degree = _Degree /*!< The spline curve's degree. */ };\n\n    /** \\brief The point type the spline is representing. */\n    typedef typename SplineTraits<Spline>::PointType PointType;\n    \n    /** \\brief The data type used to store knot vectors. */\n    typedef typename SplineTraits<Spline>::KnotVectorType KnotVectorType;\n    \n    /** \\brief The data type used to store non-zero basis functions. */\n    typedef typename SplineTraits<Spline>::BasisVectorType BasisVectorType;\n    \n    /** \\brief The data type representing the spline's control points. */\n    typedef typename SplineTraits<Spline>::ControlPointVectorType ControlPointVectorType;\n    \n    /**\n    * \\brief Creates a (constant) zero spline.\n    * For Splines with dynamic degree, the resulting degree will be 0.\n    **/\n    Spline() \n    : m_knots(1, (Degree==Dynamic ? 2 : 2*Degree+2))\n    , m_ctrls(ControlPointVectorType::Zero(2,(Degree==Dynamic ? 1 : Degree+1))) \n    {\n      // in theory this code can go to the initializer list but it will get pretty\n      // much unreadable ...\n      enum { MinDegree = (Degree==Dynamic ? 0 : Degree) };\n      m_knots.template segment<MinDegree+1>(0) = Array<Scalar,1,MinDegree+1>::Zero();\n      m_knots.template segment<MinDegree+1>(MinDegree+1) = Array<Scalar,1,MinDegree+1>::Ones();\n    }\n\n    /**\n    * \\brief Creates a spline from a knot vector and control points.\n    * \\param knots The spline's knot vector.\n    * \\param ctrls The spline's control point vector.\n    **/\n    template <typename OtherVectorType, typename OtherArrayType>\n    Spline(const OtherVectorType& knots, const OtherArrayType& ctrls) : m_knots(knots), m_ctrls(ctrls) {}\n\n    /**\n    * \\brief Copy constructor for splines.\n    * \\param spline The input spline.\n    **/\n    template <int OtherDegree>\n    Spline(const Spline<Scalar, Dimension, OtherDegree>& spline) : \n    m_knots(spline.knots()), m_ctrls(spline.ctrls()) {}\n\n    /**\n     * \\brief Returns the knots of the underlying spline.\n     **/\n    const KnotVectorType& knots() const { return m_knots; }\n    \n    /**\n     * \\brief Returns the knots of the underlying spline.\n     **/    \n    const ControlPointVectorType& ctrls() const { return m_ctrls; }\n\n    /**\n     * \\brief Returns the spline value at a given site \\f$u\\f$.\n     *\n     * The function returns\n     * \\f{align*}\n     *   C(u) & = \\sum_{i=0}^{n}N_{i,p}P_i\n     * \\f}\n     *\n     * \\param u Parameter \\f$u \\in [0;1]\\f$ at which the spline is evaluated.\n     * \\return The spline value at the given location \\f$u\\f$.\n     **/\n    PointType operator()(Scalar u) const;\n\n    /**\n     * \\brief Evaluation of spline derivatives of up-to given order.\n     *\n     * The function returns\n     * \\f{align*}\n     *   \\frac{d^i}{du^i}C(u) & = \\sum_{i=0}^{n} \\frac{d^i}{du^i} N_{i,p}(u)P_i\n     * \\f}\n     * for i ranging between 0 and order.\n     *\n     * \\param u Parameter \\f$u \\in [0;1]\\f$ at which the spline derivative is evaluated.\n     * \\param order The order up to which the derivatives are computed.\n     **/\n    typename SplineTraits<Spline>::DerivativeType\n      derivatives(Scalar u, DenseIndex order) const;\n\n    /**\n     * \\copydoc Spline::derivatives\n     * Using the template version of this function is more efficieent since\n     * temporary objects are allocated on the stack whenever this is possible.\n     **/    \n    template <int DerivativeOrder>\n    typename SplineTraits<Spline,DerivativeOrder>::DerivativeType\n      derivatives(Scalar u, DenseIndex order = DerivativeOrder) const;\n\n    /**\n     * \\brief Computes the non-zero basis functions at the given site.\n     *\n     * Splines have local support and a point from their image is defined\n     * by exactly \\f$p+1\\f$ control points \\f$P_i\\f$ where \\f$p\\f$ is the\n     * spline degree.\n     *\n     * This function computes the \\f$p+1\\f$ non-zero basis function values\n     * for a given parameter value \\f$u\\f$. It returns\n     * \\f{align*}{\n     *   N_{i,p}(u), \\hdots, N_{i+p+1,p}(u)\n     * \\f}\n     *\n     * \\param u Parameter \\f$u \\in [0;1]\\f$ at which the non-zero basis functions \n     *          are computed.\n     **/\n    typename SplineTraits<Spline>::BasisVectorType\n      basisFunctions(Scalar u) const;\n\n    /**\n     * \\brief Computes the non-zero spline basis function derivatives up to given order.\n     *\n     * The function computes\n     * \\f{align*}{\n     *   \\frac{d^i}{du^i} N_{i,p}(u), \\hdots, \\frac{d^i}{du^i} N_{i+p+1,p}(u)\n     * \\f}\n     * with i ranging from 0 up to the specified order.\n     *\n     * \\param u Parameter \\f$u \\in [0;1]\\f$ at which the non-zero basis function\n     *          derivatives are computed.\n     * \\param order The order up to which the basis function derivatives are computes.\n     **/\n    typename SplineTraits<Spline>::BasisDerivativeType\n      basisFunctionDerivatives(Scalar u, DenseIndex order) const;\n\n    /**\n     * \\copydoc Spline::basisFunctionDerivatives\n     * Using the template version of this function is more efficieent since\n     * temporary objects are allocated on the stack whenever this is possible.\n     **/    \n    template <int DerivativeOrder>\n    typename SplineTraits<Spline,DerivativeOrder>::BasisDerivativeType\n      basisFunctionDerivatives(Scalar u, DenseIndex order = DerivativeOrder) const;\n\n    /**\n     * \\brief Returns the spline degree.\n     **/ \n    DenseIndex degree() const;\n\n    /** \n     * \\brief Returns the span within the knot vector in which u is falling.\n     * \\param u The site for which the span is determined.\n     **/\n    DenseIndex span(Scalar u) const;\n\n    /**\n     * \\brief Computes the spang within the provided knot vector in which u is falling.\n     **/\n    static DenseIndex Span(typename SplineTraits<Spline>::Scalar u, DenseIndex degree, const typename SplineTraits<Spline>::KnotVectorType& knots);\n    \n    /**\n     * \\brief Returns the spline's non-zero basis functions.\n     *\n     * The function computes and returns\n     * \\f{align*}{\n     *   N_{i,p}(u), \\hdots, N_{i+p+1,p}(u)\n     * \\f}\n     *\n     * \\param u The site at which the basis functions are computed.\n     * \\param degree The degree of the underlying spline.\n     * \\param knots The underlying spline's knot vector.\n     **/\n    static BasisVectorType BasisFunctions(Scalar u, DenseIndex degree, const KnotVectorType& knots);\n\n\n  private:\n    KnotVectorType m_knots; /*!< Knot vector. */\n    ControlPointVectorType  m_ctrls; /*!< Control points. */\n  };\n\n  template <typename _Scalar, int _Dim, int _Degree>\n  DenseIndex Spline<_Scalar, _Dim, _Degree>::Span(\n    typename SplineTraits< Spline<_Scalar, _Dim, _Degree> >::Scalar u,\n    DenseIndex degree,\n    const typename SplineTraits< Spline<_Scalar, _Dim, _Degree> >::KnotVectorType& knots)\n  {\n    // Piegl & Tiller, \"The NURBS Book\", A2.1 (p. 68)\n    if (u <= knots(0)) return degree;\n    const Scalar* pos = std::upper_bound(knots.data()+degree-1, knots.data()+knots.size()-degree-1, u);\n    return static_cast<DenseIndex>( std::distance(knots.data(), pos) - 1 );\n  }\n\n  template <typename _Scalar, int _Dim, int _Degree>\n  typename Spline<_Scalar, _Dim, _Degree>::BasisVectorType\n    Spline<_Scalar, _Dim, _Degree>::BasisFunctions(\n    typename Spline<_Scalar, _Dim, _Degree>::Scalar u,\n    DenseIndex degree,\n    const typename Spline<_Scalar, _Dim, _Degree>::KnotVectorType& knots)\n  {\n    typedef typename Spline<_Scalar, _Dim, _Degree>::BasisVectorType BasisVectorType;\n\n    const DenseIndex p = degree;\n    const DenseIndex i = Spline::Span(u, degree, knots);\n\n    const KnotVectorType& U = knots;\n\n    BasisVectorType left(p+1); left(0) = Scalar(0);\n    BasisVectorType right(p+1); right(0) = Scalar(0);        \n\n    VectorBlock<BasisVectorType,Degree>(left,1,p) = u - VectorBlock<const KnotVectorType,Degree>(U,i+1-p,p).reverse();\n    VectorBlock<BasisVectorType,Degree>(right,1,p) = VectorBlock<const KnotVectorType,Degree>(U,i+1,p) - u;\n\n    BasisVectorType N(1,p+1);\n    N(0) = Scalar(1);\n    for (DenseIndex j=1; j<=p; ++j)\n    {\n      Scalar saved = Scalar(0);\n      for (DenseIndex r=0; r<j; r++)\n      {\n        const Scalar tmp = N(r)/(right(r+1)+left(j-r));\n        N[r] = saved + right(r+1)*tmp;\n        saved = left(j-r)*tmp;\n      }\n      N(j) = saved;\n    }\n    return N;\n  }\n\n  template <typename _Scalar, int _Dim, int _Degree>\n  DenseIndex Spline<_Scalar, _Dim, _Degree>::degree() const\n  {\n    if (_Degree == Dynamic)\n      return m_knots.size() - m_ctrls.cols() - 1;\n    else\n      return _Degree;\n  }\n\n  template <typename _Scalar, int _Dim, int _Degree>\n  DenseIndex Spline<_Scalar, _Dim, _Degree>::span(Scalar u) const\n  {\n    return Spline::Span(u, degree(), knots());\n  }\n\n  template <typename _Scalar, int _Dim, int _Degree>\n  typename Spline<_Scalar, _Dim, _Degree>::PointType Spline<_Scalar, _Dim, _Degree>::operator()(Scalar u) const\n  {\n    enum { Order = SplineTraits<Spline>::OrderAtCompileTime };\n\n    const DenseIndex span = this->span(u);\n    const DenseIndex p = degree();\n    const BasisVectorType basis_funcs = basisFunctions(u);\n\n    const Replicate<BasisVectorType,Dimension,1> ctrl_weights(basis_funcs);\n    const Block<const ControlPointVectorType,Dimension,Order> ctrl_pts(ctrls(),0,span-p,Dimension,p+1);\n    return (ctrl_weights * ctrl_pts).rowwise().sum();\n  }\n\n  /* --------------------------------------------------------------------------------------------- */\n\n  template <typename SplineType, typename DerivativeType>\n  void derivativesImpl(const SplineType& spline, typename SplineType::Scalar u, DenseIndex order, DerivativeType& der)\n  {    \n    enum { Dimension = SplineTraits<SplineType>::Dimension };\n    enum { Order = SplineTraits<SplineType>::OrderAtCompileTime };\n    enum { DerivativeOrder = DerivativeType::ColsAtCompileTime };\n\n    typedef typename SplineTraits<SplineType>::ControlPointVectorType ControlPointVectorType;\n    typedef typename SplineTraits<SplineType,DerivativeOrder>::BasisDerivativeType BasisDerivativeType;\n    typedef typename BasisDerivativeType::ConstRowXpr BasisDerivativeRowXpr;    \n\n    const DenseIndex p = spline.degree();\n    const DenseIndex span = spline.span(u);\n\n    const DenseIndex n = (std::min)(p, order);\n\n    der.resize(Dimension,n+1);\n\n    // Retrieve the basis function derivatives up to the desired order...    \n    const BasisDerivativeType basis_func_ders = spline.template basisFunctionDerivatives<DerivativeOrder>(u, n+1);\n\n    // ... and perform the linear combinations of the control points.\n    for (DenseIndex der_order=0; der_order<n+1; ++der_order)\n    {\n      const Replicate<BasisDerivativeRowXpr,Dimension,1> ctrl_weights( basis_func_ders.row(der_order) );\n      const Block<const ControlPointVectorType,Dimension,Order> ctrl_pts(spline.ctrls(),0,span-p,Dimension,p+1);\n      der.col(der_order) = (ctrl_weights * ctrl_pts).rowwise().sum();\n    }\n  }\n\n  template <typename _Scalar, int _Dim, int _Degree>\n  typename SplineTraits< Spline<_Scalar, _Dim, _Degree> >::DerivativeType\n    Spline<_Scalar, _Dim, _Degree>::derivatives(Scalar u, DenseIndex order) const\n  {\n    typename SplineTraits< Spline >::DerivativeType res;\n    derivativesImpl(*this, u, order, res);\n    return res;\n  }\n\n  template <typename _Scalar, int _Dim, int _Degree>\n  template <int DerivativeOrder>\n  typename SplineTraits< Spline<_Scalar, _Dim, _Degree>, DerivativeOrder >::DerivativeType\n    Spline<_Scalar, _Dim, _Degree>::derivatives(Scalar u, DenseIndex order) const\n  {\n    typename SplineTraits< Spline, DerivativeOrder >::DerivativeType res;\n    derivativesImpl(*this, u, order, res);\n    return res;\n  }\n\n  template <typename _Scalar, int _Dim, int _Degree>\n  typename SplineTraits< Spline<_Scalar, _Dim, _Degree> >::BasisVectorType\n    Spline<_Scalar, _Dim, _Degree>::basisFunctions(Scalar u) const\n  {\n    return Spline::BasisFunctions(u, degree(), knots());\n  }\n\n  /* --------------------------------------------------------------------------------------------- */\n\n  template <typename SplineType, typename DerivativeType>\n  void basisFunctionDerivativesImpl(const SplineType& spline, typename SplineType::Scalar u, DenseIndex order, DerivativeType& N_)\n  {\n    enum { Order = SplineTraits<SplineType>::OrderAtCompileTime };\n\n    typedef typename SplineTraits<SplineType>::Scalar Scalar;\n    typedef typename SplineTraits<SplineType>::BasisVectorType BasisVectorType;\n    typedef typename SplineTraits<SplineType>::KnotVectorType KnotVectorType;\n\n    const KnotVectorType& U = spline.knots();\n\n    const DenseIndex p = spline.degree();\n    const DenseIndex span = spline.span(u);\n\n    const DenseIndex n = (std::min)(p, order);\n\n    N_.resize(n+1, p+1);\n\n    BasisVectorType left = BasisVectorType::Zero(p+1);\n    BasisVectorType right = BasisVectorType::Zero(p+1);\n\n    Matrix<Scalar,Order,Order> ndu(p+1,p+1);\n\n    double saved, temp;\n\n    ndu(0,0) = 1.0;\n\n    DenseIndex j;\n    for (j=1; j<=p; ++j)\n    {\n      left[j] = u-U[span+1-j];\n      right[j] = U[span+j]-u;\n      saved = 0.0;\n\n      for (DenseIndex r=0; r<j; ++r)\n      {\n        /* Lower triangle */\n        ndu(j,r) = right[r+1]+left[j-r];\n        temp = ndu(r,j-1)/ndu(j,r);\n        /* Upper triangle */\n        ndu(r,j) = static_cast<Scalar>(saved+right[r+1] * temp);\n        saved = left[j-r] * temp;\n      }\n\n      ndu(j,j) = static_cast<Scalar>(saved);\n    }\n\n    for (j = p; j>=0; --j) \n      N_(0,j) = ndu(j,p);\n\n    // Compute the derivatives\n    DerivativeType a(n+1,p+1);\n    DenseIndex r=0;\n    for (; r<=p; ++r)\n    {\n      DenseIndex s1,s2;\n      s1 = 0; s2 = 1; // alternate rows in array a\n      a(0,0) = 1.0;\n\n      // Compute the k-th derivative\n      for (DenseIndex k=1; k<=static_cast<DenseIndex>(n); ++k)\n      {\n        double d = 0.0;\n        DenseIndex rk,pk,j1,j2;\n        rk = r-k; pk = p-k;\n\n        if (r>=k)\n        {\n          a(s2,0) = a(s1,0)/ndu(pk+1,rk);\n          d = a(s2,0)*ndu(rk,pk);\n        }\n\n        if (rk>=-1) j1 = 1;\n        else        j1 = -rk;\n\n        if (r-1 <= pk) j2 = k-1;\n        else           j2 = p-r;\n\n        for (j=j1; j<=j2; ++j)\n        {\n          a(s2,j) = (a(s1,j)-a(s1,j-1))/ndu(pk+1,rk+j);\n          d += a(s2,j)*ndu(rk+j,pk);\n        }\n\n        if (r<=pk)\n        {\n          a(s2,k) = -a(s1,k-1)/ndu(pk+1,r);\n          d += a(s2,k)*ndu(r,pk);\n        }\n\n        N_(k,r) = static_cast<Scalar>(d);\n        j = s1; s1 = s2; s2 = j; // Switch rows\n      }\n    }\n\n    /* Multiply through by the correct factors */\n    /* (Eq. [2.9])                             */\n    r = p;\n    for (DenseIndex k=1; k<=static_cast<DenseIndex>(n); ++k)\n    {\n      for (DenseIndex j=p; j>=0; --j) N_(k,j) *= r;\n      r *= p-k;\n    }\n  }\n\n  template <typename _Scalar, int _Dim, int _Degree>\n  typename SplineTraits< Spline<_Scalar, _Dim, _Degree> >::BasisDerivativeType\n    Spline<_Scalar, _Dim, _Degree>::basisFunctionDerivatives(Scalar u, DenseIndex order) const\n  {\n    typename SplineTraits< Spline >::BasisDerivativeType der;\n    basisFunctionDerivativesImpl(*this, u, order, der);\n    return der;\n  }\n\n  template <typename _Scalar, int _Dim, int _Degree>\n  template <int DerivativeOrder>\n  typename SplineTraits< Spline<_Scalar, _Dim, _Degree>, DerivativeOrder >::BasisDerivativeType\n    Spline<_Scalar, _Dim, _Degree>::basisFunctionDerivatives(Scalar u, DenseIndex order) const\n  {\n    typename SplineTraits< Spline, DerivativeOrder >::BasisDerivativeType der;\n    basisFunctionDerivativesImpl(*this, u, order, der);\n    return der;\n  }\n}\n\n#endif // EIGEN_SPLINE_H\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/Splines/SplineFitting.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 20010-2011 Hauke Heibel <hauke.heibel@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SPLINE_FITTING_H\n#define EIGEN_SPLINE_FITTING_H\n\n#include <numeric>\n\n#include \"SplineFwd.h\"\n\n#include <Eigen/QR>\n\nnamespace Eigen\n{\n  /**\n   * \\brief Computes knot averages.\n   * \\ingroup Splines_Module\n   *\n   * The knots are computed as\n   * \\f{align*}\n   *  u_0 & = \\hdots = u_p = 0 \\\\\n   *  u_{m-p} & = \\hdots = u_{m} = 1 \\\\\n   *  u_{j+p} & = \\frac{1}{p}\\sum_{i=j}^{j+p-1}\\bar{u}_i \\quad\\quad j=1,\\hdots,n-p\n   * \\f}\n   * where \\f$p\\f$ is the degree and \\f$m+1\\f$ the number knots\n   * of the desired interpolating spline.\n   *\n   * \\param[in] parameters The input parameters. During interpolation one for each data point.\n   * \\param[in] degree The spline degree which is used during the interpolation.\n   * \\param[out] knots The output knot vector.\n   *\n   * \\sa Les Piegl and Wayne Tiller, The NURBS book (2nd ed.), 1997, 9.2.1 Global Curve Interpolation to Point Data\n   **/\n  template <typename KnotVectorType>\n  void KnotAveraging(const KnotVectorType& parameters, DenseIndex degree, KnotVectorType& knots)\n  {\n    knots.resize(parameters.size()+degree+1);      \n\n    for (DenseIndex j=1; j<parameters.size()-degree; ++j)\n      knots(j+degree) = parameters.segment(j,degree).mean();\n\n    knots.segment(0,degree+1) = KnotVectorType::Zero(degree+1);\n    knots.segment(knots.size()-degree-1,degree+1) = KnotVectorType::Ones(degree+1);\n  }\n\n  /**\n   * \\brief Computes chord length parameters which are required for spline interpolation.\n   * \\ingroup Splines_Module\n   *\n   * \\param[in] pts The data points to which a spline should be fit.\n   * \\param[out] chord_lengths The resulting chord lenggth vector.\n   *\n   * \\sa Les Piegl and Wayne Tiller, The NURBS book (2nd ed.), 1997, 9.2.1 Global Curve Interpolation to Point Data\n   **/   \n  template <typename PointArrayType, typename KnotVectorType>\n  void ChordLengths(const PointArrayType& pts, KnotVectorType& chord_lengths)\n  {\n    typedef typename KnotVectorType::Scalar Scalar;\n\n    const DenseIndex n = pts.cols();\n\n    // 1. compute the column-wise norms\n    chord_lengths.resize(pts.cols());\n    chord_lengths[0] = 0;\n    chord_lengths.rightCols(n-1) = (pts.array().leftCols(n-1) - pts.array().rightCols(n-1)).matrix().colwise().norm();\n\n    // 2. compute the partial sums\n    std::partial_sum(chord_lengths.data(), chord_lengths.data()+n, chord_lengths.data());\n\n    // 3. normalize the data\n    chord_lengths /= chord_lengths(n-1);\n    chord_lengths(n-1) = Scalar(1);\n  }\n\n  /**\n   * \\brief Spline fitting methods.\n   * \\ingroup Splines_Module\n   **/     \n  template <typename SplineType>\n  struct SplineFitting\n  {\n    typedef typename SplineType::KnotVectorType KnotVectorType;\n\n    /**\n     * \\brief Fits an interpolating Spline to the given data points.\n     *\n     * \\param pts The points for which an interpolating spline will be computed.\n     * \\param degree The degree of the interpolating spline.\n     *\n     * \\returns A spline interpolating the initially provided points.\n     **/\n    template <typename PointArrayType>\n    static SplineType Interpolate(const PointArrayType& pts, DenseIndex degree);\n\n    /**\n     * \\brief Fits an interpolating Spline to the given data points.\n     *\n     * \\param pts The points for which an interpolating spline will be computed.\n     * \\param degree The degree of the interpolating spline.\n     * \\param knot_parameters The knot parameters for the interpolation.\n     *\n     * \\returns A spline interpolating the initially provided points.\n     **/\n    template <typename PointArrayType>\n    static SplineType Interpolate(const PointArrayType& pts, DenseIndex degree, const KnotVectorType& knot_parameters);\n  };\n\n  template <typename SplineType>\n  template <typename PointArrayType>\n  SplineType SplineFitting<SplineType>::Interpolate(const PointArrayType& pts, DenseIndex degree, const KnotVectorType& knot_parameters)\n  {\n    typedef typename SplineType::KnotVectorType::Scalar Scalar;      \n    typedef typename SplineType::ControlPointVectorType ControlPointVectorType;      \n\n    typedef Matrix<Scalar,Dynamic,Dynamic> MatrixType;\n\n    KnotVectorType knots;\n    KnotAveraging(knot_parameters, degree, knots);\n\n    DenseIndex n = pts.cols();\n    MatrixType A = MatrixType::Zero(n,n);\n    for (DenseIndex i=1; i<n-1; ++i)\n    {\n      const DenseIndex span = SplineType::Span(knot_parameters[i], degree, knots);\n\n      // The segment call should somehow be told the spline order at compile time.\n      A.row(i).segment(span-degree, degree+1) = SplineType::BasisFunctions(knot_parameters[i], degree, knots);\n    }\n    A(0,0) = 1.0;\n    A(n-1,n-1) = 1.0;\n\n    HouseholderQR<MatrixType> qr(A);\n\n    // Here, we are creating a temporary due to an Eigen issue.\n    ControlPointVectorType ctrls = qr.solve(MatrixType(pts.transpose())).transpose();\n\n    return SplineType(knots, ctrls);\n  }\n\n  template <typename SplineType>\n  template <typename PointArrayType>\n  SplineType SplineFitting<SplineType>::Interpolate(const PointArrayType& pts, DenseIndex degree)\n  {\n    KnotVectorType chord_lengths; // knot parameters\n    ChordLengths(pts, chord_lengths);\n    return Interpolate(pts, degree, chord_lengths);\n  }\n}\n\n#endif // EIGEN_SPLINE_FITTING_H\n"
  },
  {
    "path": "libs/eigen/unsupported/Eigen/src/Splines/SplineFwd.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 20010-2011 Hauke Heibel <hauke.heibel@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef EIGEN_SPLINES_FWD_H\n#define EIGEN_SPLINES_FWD_H\n\n#include <Eigen/Core>\n\nnamespace Eigen\n{\n    template <typename Scalar, int Dim, int Degree = Dynamic> class Spline;\n\n    template < typename SplineType, int DerivativeOrder = Dynamic > struct SplineTraits {};\n\n    /**\n     * \\ingroup Splines_Module\n     * \\brief Compile-time attributes of the Spline class for Dynamic degree.\n     **/\n    template <typename _Scalar, int _Dim, int _Degree>\n    struct SplineTraits< Spline<_Scalar, _Dim, _Degree>, Dynamic >\n    {\n      typedef _Scalar Scalar; /*!< The spline curve's scalar type. */\n      enum { Dimension = _Dim /*!< The spline curve's dimension. */ };\n      enum { Degree = _Degree /*!< The spline curve's degree. */ };\n\n      enum { OrderAtCompileTime = _Degree==Dynamic ? Dynamic : _Degree+1 /*!< The spline curve's order at compile-time. */ };\n      enum { NumOfDerivativesAtCompileTime = OrderAtCompileTime /*!< The number of derivatives defined for the current spline. */ };\n      \n      enum { DerivativeMemoryLayout = Dimension==1 ? RowMajor : ColMajor /*!< The derivative type's memory layout. */ };\n\n      /** \\brief The data type used to store non-zero basis functions. */\n      typedef Array<Scalar,1,OrderAtCompileTime> BasisVectorType;\n\n      /** \\brief The data type used to store the values of the basis function derivatives. */\n      typedef Array<Scalar,Dynamic,Dynamic,RowMajor,NumOfDerivativesAtCompileTime,OrderAtCompileTime> BasisDerivativeType;\n      \n      /** \\brief The data type used to store the spline's derivative values. */\n      typedef Array<Scalar,Dimension,Dynamic,DerivativeMemoryLayout,Dimension,NumOfDerivativesAtCompileTime> DerivativeType;\n\n      /** \\brief The point type the spline is representing. */\n      typedef Array<Scalar,Dimension,1> PointType;\n      \n      /** \\brief The data type used to store knot vectors. */\n      typedef Array<Scalar,1,Dynamic> KnotVectorType;\n      \n      /** \\brief The data type representing the spline's control points. */\n      typedef Array<Scalar,Dimension,Dynamic> ControlPointVectorType;\n    };\n\n    /**\n     * \\ingroup Splines_Module\n     * \\brief Compile-time attributes of the Spline class for fixed degree.\n     *\n     * The traits class inherits all attributes from the SplineTraits of Dynamic degree.\n     **/\n    template < typename _Scalar, int _Dim, int _Degree, int _DerivativeOrder >\n    struct SplineTraits< Spline<_Scalar, _Dim, _Degree>, _DerivativeOrder > : public SplineTraits< Spline<_Scalar, _Dim, _Degree> >\n    {\n      enum { OrderAtCompileTime = _Degree==Dynamic ? Dynamic : _Degree+1 /*!< The spline curve's order at compile-time. */ };\n      enum { NumOfDerivativesAtCompileTime = _DerivativeOrder==Dynamic ? Dynamic : _DerivativeOrder+1 /*!< The number of derivatives defined for the current spline. */ };\n      \n      enum { DerivativeMemoryLayout = _Dim==1 ? RowMajor : ColMajor /*!< The derivative type's memory layout. */ };\n\n      /** \\brief The data type used to store the values of the basis function derivatives. */\n      typedef Array<_Scalar,Dynamic,Dynamic,RowMajor,NumOfDerivativesAtCompileTime,OrderAtCompileTime> BasisDerivativeType;\n      \n      /** \\brief The data type used to store the spline's derivative values. */      \n      typedef Array<_Scalar,_Dim,Dynamic,DerivativeMemoryLayout,_Dim,NumOfDerivativesAtCompileTime> DerivativeType;\n    };\n\n    /** \\brief 2D float B-spline with dynamic degree. */\n    typedef Spline<float,2> Spline2f;\n    \n    /** \\brief 3D float B-spline with dynamic degree. */\n    typedef Spline<float,3> Spline3f;\n\n    /** \\brief 2D double B-spline with dynamic degree. */\n    typedef Spline<double,2> Spline2d;\n    \n    /** \\brief 3D double B-spline with dynamic degree. */\n    typedef Spline<double,3> Spline3d;\n}\n\n#endif // EIGEN_SPLINES_FWD_H\n"
  },
  {
    "path": "libs/eigen/unsupported/README.txt",
    "content": "This directory contains contributions from various users.\nThey are provided \"as is\", without any support. Nevertheless,\nmost of them are subject to be included in Eigen in the future.\n\nIn order to use an unsupported module you have to do either:\n\n - add the path_to_eigen/unsupported directory to your include path and do:\n   #include <Eigen/ModuleHeader>\n\n - or directly do:\n   #include <unsupported/Eigen/ModuleHeader>\n\n\nIf you are interested in contributing to one of them, or have other stuff\nyou would like to share, feel free to contact us:\nhttp://eigen.tuxfamily.org/index.php?title=Main_Page#Mailing_list\n\nAny kind of contributions are much appreciated, even very preliminary ones.\nHowever, it:\n - must rely on Eigen,\n - must be highly related to math,\n - should have some general purpose in the sense that it could\n   potentially become an offical Eigen module (or be merged into another one).\n\nIn doubt feel free to contact us. For instance, if your addons is very too specific\nbut it shows an interesting way of using Eigen, then it could be a nice demo.\n\n\nThis directory is organized as follow:\n\nunsupported/Eigen/ModuleHeader1\nunsupported/Eigen/ModuleHeader2\nunsupported/Eigen/...\nunsupported/Eigen/src/Module1/SourceFile1.h\nunsupported/Eigen/src/Module1/SourceFile2.h\nunsupported/Eigen/src/Module1/...\nunsupported/Eigen/src/Module2/SourceFile1.h\nunsupported/Eigen/src/Module2/SourceFile2.h\nunsupported/Eigen/src/Module2/...\nunsupported/Eigen/src/...\nunsupported/doc/snippets/.cpp   <- code snippets for the doc\nunsupported/doc/examples/.cpp   <- examples for the doc\nunsupported/doc/TutorialModule1.dox\nunsupported/doc/TutorialModule2.dox\nunsupported/doc/...\nunsupported/test/.cpp           <- unit test files\n\nThe documentation is generated at the same time than the main Eigen documentation.\nThe .html files are generated in: build_dir/doc/html/unsupported/\n\n"
  },
  {
    "path": "libs/eigen/unsupported/bench/bench_svd.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2013 Gauthier Brun <brun.gauthier@gmail.com>\n// Copyright (C) 2013 Nicolas Carre <nicolas.carre@ensimag.fr>\n// Copyright (C) 2013 Jean Ceccato <jean.ceccato@ensimag.fr>\n// Copyright (C) 2013 Pierre Zoppitelli <pierre.zoppitelli@ensimag.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/\n\n// Bench to compare the efficiency of SVD algorithms\n\n#include <iostream>\n#include <bench/BenchTimer.h>\n#include <unsupported/Eigen/SVD>\n\n\nusing namespace Eigen;\nusing namespace std;\n\n// number of computations of each algorithm before the print of the time\n#ifndef REPEAT\n#define REPEAT 10\n#endif\n\n// number of tests of the same type\n#ifndef NUMBER_SAMPLE\n#define NUMBER_SAMPLE 2\n#endif\n\ntemplate<typename MatrixType>\nvoid bench_svd(const MatrixType& a = MatrixType())\n{\n  MatrixType m = MatrixType::Random(a.rows(), a.cols());\n  BenchTimer timerJacobi;\n  BenchTimer timerBDC;\n  timerJacobi.reset();\n  timerBDC.reset();\n\n  cout << \" Only compute Singular Values\" <<endl;\n  for (int k=1; k<=NUMBER_SAMPLE; ++k)\n  {\n    timerBDC.start();\n    for (int i=0; i<REPEAT; ++i) \n    {\n      BDCSVD<MatrixType> bdc_matrix(m);\n    }\n    timerBDC.stop();\n    \n    timerJacobi.start();\n    for (int i=0; i<REPEAT; ++i) \n    {\n      JacobiSVD<MatrixType> jacobi_matrix(m);\n    }\n    timerJacobi.stop();\n\n\n    cout << \"Sample \" << k << \" : \" << REPEAT << \" computations :  Jacobi : \" << fixed << timerJacobi.value() << \"s \";\n    cout << \" || \" << \" BDC : \" << timerBDC.value() << \"s \" <<endl <<endl;\n      \n    if (timerBDC.value() >= timerJacobi.value())  \n      cout << \"KO : BDC is \" <<  timerJacobi.value() / timerBDC.value() << \"  times faster than Jacobi\" <<endl;\n    else \n      cout << \"OK : BDC is \" << timerJacobi.value() / timerBDC.value() << \"  times faster than Jacobi\"  <<endl;\n      \n  }\n  cout << \"       =================\" <<endl;\n  std::cout<< std::endl;\n  timerJacobi.reset();\n  timerBDC.reset();\n  cout << \" Computes rotaion matrix\" <<endl;\n  for (int k=1; k<=NUMBER_SAMPLE; ++k)\n  {\n    timerBDC.start();\n    for (int i=0; i<REPEAT; ++i) \n    {\n      BDCSVD<MatrixType> bdc_matrix(m, ComputeFullU|ComputeFullV);\n    }\n    timerBDC.stop();\n    \n    timerJacobi.start();\n    for (int i=0; i<REPEAT; ++i) \n    {\n      JacobiSVD<MatrixType> jacobi_matrix(m, ComputeFullU|ComputeFullV);\n    }\n    timerJacobi.stop();\n\n\n    cout << \"Sample \" << k << \" : \" << REPEAT << \" computations :  Jacobi : \" << fixed << timerJacobi.value() << \"s \";\n    cout << \" || \" << \" BDC : \" << timerBDC.value() << \"s \" <<endl <<endl;\n      \n    if (timerBDC.value() >= timerJacobi.value())  \n      cout << \"KO : BDC is \" <<  timerJacobi.value() / timerBDC.value() << \"  times faster than Jacobi\" <<endl;\n    else \n      cout << \"OK : BDC is \" << timerJacobi.value() / timerBDC.value() << \"  times faster than Jacobi\"  <<endl;\n      \n  }\n  std::cout<< std::endl;\n}\n\n\n\nint main(int argc, char* argv[])\n{\n  std::cout<< std::endl;\n\n  std::cout<<\"On a (Dynamic, Dynamic) (6, 6) Matrix\" <<std::endl;\n  bench_svd<Matrix<double,Dynamic,Dynamic> >(Matrix<double,Dynamic,Dynamic>(6, 6));\n  \n  std::cout<<\"On a (Dynamic, Dynamic) (32, 32) Matrix\" <<std::endl;\n  bench_svd<Matrix<double,Dynamic,Dynamic> >(Matrix<double,Dynamic,Dynamic>(32, 32));\n\n  //std::cout<<\"On a (Dynamic, Dynamic) (128, 128) Matrix\" <<std::endl;\n  //bench_svd<Matrix<double,Dynamic,Dynamic> >(Matrix<double,Dynamic,Dynamic>(128, 128));\n\n  std::cout<<\"On a (Dynamic, Dynamic) (160, 160) Matrix\" <<std::endl;\n  bench_svd<Matrix<double,Dynamic,Dynamic> >(Matrix<double,Dynamic,Dynamic>(160, 160));\n  \n  std::cout<< \"--------------------------------------------------------------------\"<< std::endl;\n           \n}\n"
  },
  {
    "path": "libs/eigen/unsupported/doc/CMakeLists.txt",
    "content": "set_directory_properties(PROPERTIES EXCLUDE_FROM_ALL TRUE)\n\nadd_subdirectory(examples)\nadd_subdirectory(snippets)\n"
  },
  {
    "path": "libs/eigen/unsupported/doc/Overview.dox",
    "content": "namespace Eigen {\n\n/** \\mainpage Eigen's unsupported modules\n\nThis is the API documentation for Eigen's unsupported modules.\n\nThese modules are contributions from various users. They are provided \"as is\", without any support.\n\nClick on the \\e Modules tab at the top of this page to get a list of all unsupported modules.\n\nDon't miss the <a href=\"..//index.html\">official Eigen documentation</a>.\n\n*/\n\n/*\n\n\\defgroup Unsupported_modules Unsupported modules\n\nThe unsupported modules are contributions from various users. They are\nprovided \"as is\", without any support. Nevertheless, some of them are\nsubject to be included in Eigen in the future.\n\n*/\n\n}\n"
  },
  {
    "path": "libs/eigen/unsupported/doc/eigendoxy_layout.xml.in",
    "content": "<?xml version=\"1.0\"?>\n<doxygenlayout version=\"1.0\">\n  <!-- Navigation index tabs for HTML output -->\n  <navindex>\n    <tab type=\"user\" url=\"index.html\" title=\"Overview\" />\n    <tab type=\"modules\" visible=\"yes\" title=\"Unsupported Modules\" intro=\"\"/>\n<!--     <tab type=\"mainpage\" visible=\"yes\" title=\"\"/> -->\n    <tab type=\"classlist\" visible=\"yes\" title=\"\" intro=\"\"/>\n<!--     <tab type=\"classmembers\" visible=\"yes\" title=\"\" intro=\"\"/> -->\n  </navindex>\n\n  <!-- Layout definition for a class page -->\n  <class>\n    <briefdescription visible=\"no\"/>\n    <includes visible=\"$SHOW_INCLUDE_FILES\"/>\n    <detaileddescription title=\"\"/>\n    <inheritancegraph visible=\"$CLASS_GRAPH\"/>\n    <collaborationgraph visible=\"$COLLABORATION_GRAPH\"/>\n    <allmemberslink visible=\"yes\"/>\n    <memberdecl>\n      <nestedclasses visible=\"yes\" title=\"\"/>\n      <publictypes title=\"\"/>\n      <publicslots title=\"\"/>\n      <signals title=\"\"/>\n      <publicmethods title=\"\"/>\n      <publicstaticmethods title=\"\"/>\n      <publicattributes title=\"\"/>\n      <publicstaticattributes title=\"\"/>\n      <protectedtypes title=\"\"/>\n      <protectedslots title=\"\"/>\n      <protectedmethods title=\"\"/>\n      <protectedstaticmethods title=\"\"/>\n      <protectedattributes title=\"\"/>\n      <protectedstaticattributes title=\"\"/>\n      <packagetypes title=\"\"/>\n      <packagemethods title=\"\"/>\n      <packagestaticmethods title=\"\"/>\n      <packageattributes title=\"\"/>\n      <packagestaticattributes title=\"\"/>\n      <properties title=\"\"/>\n      <events title=\"\"/>\n      <privatetypes title=\"\"/>\n      <privateslots title=\"\"/>\n      <privatemethods title=\"\"/>\n      <privatestaticmethods title=\"\"/>\n      <privateattributes title=\"\"/>\n      <privatestaticattributes title=\"\"/>\n      <friends title=\"\"/>\n      <related title=\"\" subtitle=\"\"/>\n      <membergroups visible=\"yes\"/>\n    </memberdecl>\n    \n    <memberdef>\n      <inlineclasses title=\"\"/>\n      <typedefs title=\"\"/>\n      <enums title=\"\"/>\n      <constructors title=\"\"/>\n      <functions title=\"\"/>\n      <related title=\"\"/>\n      <variables title=\"\"/>\n      <properties title=\"\"/>\n      <events title=\"\"/>\n    </memberdef>\n    <usedfiles visible=\"$SHOW_USED_FILES\"/>\n    <authorsection visible=\"yes\"/>\n  </class>\n\n  <!-- Layout definition for a namespace page -->\n  <namespace>\n    <briefdescription visible=\"yes\"/>\n    <memberdecl>\n      <nestednamespaces visible=\"yes\" title=\"\"/>\n      <classes visible=\"yes\" title=\"\"/>\n      <typedefs title=\"\"/>\n      <enums title=\"\"/>\n      <functions title=\"\"/>\n      <variables title=\"\"/>\n      <membergroups visible=\"yes\"/>\n    </memberdecl>\n    <detaileddescription title=\"\"/>\n    <memberdef>\n      <inlineclasses title=\"\"/>\n      <typedefs title=\"\"/>\n      <enums title=\"\"/>\n      <functions title=\"\"/>\n      <variables title=\"\"/>\n    </memberdef>\n    <authorsection visible=\"yes\"/>\n  </namespace>\n\n  <!-- Layout definition for a file page -->\n  <file>\n    <briefdescription visible=\"yes\"/>\n    <includes visible=\"$SHOW_INCLUDE_FILES\"/>\n    <includegraph visible=\"$INCLUDE_GRAPH\"/>\n    <includedbygraph visible=\"$INCLUDED_BY_GRAPH\"/>\n    <sourcelink visible=\"yes\"/>\n    <memberdecl>\n      <classes visible=\"yes\" title=\"\"/>\n      <namespaces visible=\"yes\" title=\"\"/>\n      <defines title=\"\"/>\n      <typedefs title=\"\"/>\n      <enums title=\"\"/>\n      <functions title=\"\"/>\n      <variables title=\"\"/>\n      <membergroups visible=\"yes\"/>\n    </memberdecl>\n    <detaileddescription title=\"\"/>\n    <memberdef>\n      <inlineclasses title=\"\"/>\n      <defines title=\"\"/>\n      <typedefs title=\"\"/>\n      <enums title=\"\"/>\n      <functions title=\"\"/>\n      <variables title=\"\"/>\n    </memberdef>\n    <authorsection/>\n  </file>\n\n  <!-- Layout definition for a group page -->\n  <group>\n    <briefdescription visible=\"no\"/>\n    <detaileddescription title=\"\"/>\n    <groupgraph visible=\"$GROUP_GRAPHS\"/>\n    <memberdecl>\n      <nestedgroups visible=\"yes\" title=\"\"/>\n      <dirs visible=\"yes\" title=\"\"/>\n      <files visible=\"yes\" title=\"\"/>\n      <namespaces visible=\"yes\" title=\"\"/>\n      <classes visible=\"yes\" title=\"\"/>\n      <defines title=\"\"/>\n      <typedefs title=\"\"/>\n      <enums title=\"\"/>\n      <enumvalues title=\"\"/>\n      <functions title=\"\"/>\n      <variables title=\"\"/>\n      <signals title=\"\"/>\n      <publicslots title=\"\"/>\n      <protectedslots title=\"\"/>\n      <privateslots title=\"\"/>\n      <events title=\"\"/>\n      <properties title=\"\"/>\n      <friends title=\"\"/>\n      <membergroups visible=\"yes\"/>\n    </memberdecl>\n    \n    <memberdef>\n      <pagedocs/>\n      <inlineclasses title=\"\"/>\n      <defines title=\"\"/>\n      <typedefs title=\"\"/>\n      <enums title=\"\"/>\n      <enumvalues title=\"\"/>\n      <functions title=\"\"/>\n      <variables title=\"\"/>\n      <signals title=\"\"/>\n      <publicslots title=\"\"/>\n      <protectedslots title=\"\"/>\n      <privateslots title=\"\"/>\n      <events title=\"\"/>\n      <properties title=\"\"/>\n      <friends title=\"\"/>\n    </memberdef>\n    <authorsection visible=\"yes\"/>\n  </group>\n\n  <!-- Layout definition for a directory page -->\n  <directory>\n    <briefdescription visible=\"yes\"/>\n    <directorygraph visible=\"yes\"/>\n    <memberdecl>\n      <dirs visible=\"yes\"/>\n      <files visible=\"yes\"/>\n    </memberdecl>\n    <detaileddescription title=\"\"/>\n  </directory>\n</doxygenlayout>\n"
  },
  {
    "path": "libs/eigen/unsupported/doc/examples/BVH_Example.cpp",
    "content": "#include <Eigen/StdVector>\n#include <unsupported/Eigen/BVH>\n#include <iostream>\n\nusing namespace Eigen;\ntypedef AlignedBox<double, 2> Box2d;\n\nnamespace Eigen {\n    namespace internal {\n        Box2d bounding_box(const Vector2d &v) { return Box2d(v, v); } //compute the bounding box of a single point\n    }\n}\n\nstruct PointPointMinimizer //how to compute squared distances between points and rectangles\n{\n  PointPointMinimizer() : calls(0) {}\n  typedef double Scalar;\n\n  double minimumOnVolumeVolume(const Box2d &r1, const Box2d &r2) { ++calls; return r1.squaredExteriorDistance(r2); }\n  double minimumOnVolumeObject(const Box2d &r, const Vector2d &v) { ++calls; return r.squaredExteriorDistance(v); }\n  double minimumOnObjectVolume(const Vector2d &v, const Box2d &r) { ++calls; return r.squaredExteriorDistance(v); }\n  double minimumOnObjectObject(const Vector2d &v1, const Vector2d &v2) { ++calls; return (v1 - v2).squaredNorm(); }\n\n  int calls;\n};\n\nint main()\n{\n  typedef std::vector<Vector2d, aligned_allocator<Vector2d> > StdVectorOfVector2d;\n  StdVectorOfVector2d redPoints, bluePoints;\n  for(int i = 0; i < 100; ++i) { //initialize random set of red points and blue points\n    redPoints.push_back(Vector2d::Random());\n    bluePoints.push_back(Vector2d::Random());\n  }\n\n  PointPointMinimizer minimizer;\n  double minDistSq = std::numeric_limits<double>::max();\n\n  //brute force to find closest red-blue pair\n  for(int i = 0; i < (int)redPoints.size(); ++i)\n    for(int j = 0; j < (int)bluePoints.size(); ++j)\n      minDistSq = std::min(minDistSq, minimizer.minimumOnObjectObject(redPoints[i], bluePoints[j]));\n  std::cout << \"Brute force distance = \" << sqrt(minDistSq) << \", calls = \" << minimizer.calls << std::endl;\n\n  //using BVH to find closest red-blue pair\n  minimizer.calls = 0;\n  KdBVH<double, 2, Vector2d> redTree(redPoints.begin(), redPoints.end()), blueTree(bluePoints.begin(), bluePoints.end()); //construct the trees\n  minDistSq = BVMinimize(redTree, blueTree, minimizer); //actual BVH minimization call\n  std::cout << \"BVH distance         = \" << sqrt(minDistSq) << \", calls = \" << minimizer.calls << std::endl;\n\n  return 0;\n}\n"
  },
  {
    "path": "libs/eigen/unsupported/doc/examples/CMakeLists.txt",
    "content": "FILE(GLOB examples_SRCS \"*.cpp\")\n\nADD_CUSTOM_TARGET(unsupported_examples)\n\nINCLUDE_DIRECTORIES(../../../unsupported ../../../unsupported/test)\n\nFOREACH(example_src ${examples_SRCS})\n  GET_FILENAME_COMPONENT(example ${example_src} NAME_WE)\n  ADD_EXECUTABLE(example_${example} ${example_src})\n  if(EIGEN_STANDARD_LIBRARIES_TO_LINK_TO)\n    target_link_libraries(example_${example} ${EIGEN_STANDARD_LIBRARIES_TO_LINK_TO})\n  endif()\n  ADD_CUSTOM_COMMAND(\n    TARGET example_${example}\n    POST_BUILD\n    COMMAND example_${example}\n    ARGS >${CMAKE_CURRENT_BINARY_DIR}/${example}.out\n  )\n  ADD_DEPENDENCIES(unsupported_examples example_${example})\nENDFOREACH(example_src)\n"
  },
  {
    "path": "libs/eigen/unsupported/doc/examples/FFT.cpp",
    "content": "//  To use the simple FFT implementation\n//  g++ -o demofft -I.. -Wall -O3 FFT.cpp \n\n//  To use the FFTW implementation\n//  g++ -o demofft -I.. -DUSE_FFTW -Wall -O3 FFT.cpp -lfftw3 -lfftw3f -lfftw3l\n\n#ifdef USE_FFTW\n#include <fftw3.h>\n#endif\n\n#include <vector>\n#include <complex>\n#include <algorithm>\n#include <iterator>\n#include <iostream>\n#include <Eigen/Core>\n#include <unsupported/Eigen/FFT>\n\nusing namespace std;\nusing namespace Eigen;\n\ntemplate <typename T>\nT mag2(T a)\n{\n    return a*a;\n}\ntemplate <typename T>\nT mag2(std::complex<T> a)\n{\n    return norm(a);\n}\n\ntemplate <typename T>\nT mag2(const std::vector<T> & vec)\n{\n    T out=0;\n    for (size_t k=0;k<vec.size();++k)\n        out += mag2(vec[k]);\n    return out;\n}\n\ntemplate <typename T>\nT mag2(const std::vector<std::complex<T> > & vec)\n{\n    T out=0;\n    for (size_t k=0;k<vec.size();++k)\n        out += mag2(vec[k]);\n    return out;\n}\n\ntemplate <typename T>\nvector<T> operator-(const vector<T> & a,const vector<T> & b )\n{\n    vector<T> c(a);\n    for (size_t k=0;k<b.size();++k) \n        c[k] -= b[k];\n    return c;\n}\n\ntemplate <typename T>\nvoid RandomFill(std::vector<T> & vec)\n{\n    for (size_t k=0;k<vec.size();++k)\n        vec[k] = T( rand() )/T(RAND_MAX) - .5;\n}\n\ntemplate <typename T>\nvoid RandomFill(std::vector<std::complex<T> > & vec)\n{\n    for (size_t k=0;k<vec.size();++k)\n        vec[k] = std::complex<T> ( T( rand() )/T(RAND_MAX) - .5, T( rand() )/T(RAND_MAX) - .5);\n}\n\ntemplate <typename T_time,typename T_freq>\nvoid fwd_inv(size_t nfft)\n{\n    typedef typename NumTraits<T_freq>::Real Scalar;\n    vector<T_time> timebuf(nfft);\n    RandomFill(timebuf);\n\n    vector<T_freq> freqbuf;\n    static FFT<Scalar> fft;\n    fft.fwd(freqbuf,timebuf);\n\n    vector<T_time> timebuf2;\n    fft.inv(timebuf2,freqbuf);\n\n    long double rmse = mag2(timebuf - timebuf2) / mag2(timebuf);\n    cout << \"roundtrip rmse: \" << rmse << endl;\n}\n\ntemplate <typename T_scalar>\nvoid two_demos(int nfft)\n{\n    cout << \"     scalar \";\n    fwd_inv<T_scalar,std::complex<T_scalar> >(nfft);\n    cout << \"    complex \";\n    fwd_inv<std::complex<T_scalar>,std::complex<T_scalar> >(nfft);\n}\n\nvoid demo_all_types(int nfft)\n{\n    cout << \"nfft=\" << nfft << endl;\n    cout << \"   float\" << endl;\n    two_demos<float>(nfft);\n    cout << \"   double\" << endl;\n    two_demos<double>(nfft);\n    cout << \"   long double\" << endl;\n    two_demos<long double>(nfft);\n}\n\nint main()\n{\n    demo_all_types( 2*3*4*5*7 );\n    demo_all_types( 2*9*16*25 );\n    demo_all_types( 1024 );\n    return 0;\n}\n"
  },
  {
    "path": "libs/eigen/unsupported/doc/examples/MatrixExponential.cpp",
    "content": "#include <unsupported/Eigen/MatrixFunctions>\n#include <iostream>\n\nusing namespace Eigen;\n\nint main()\n{\n  const double pi = std::acos(-1.0);\n\n  MatrixXd A(3,3);\n  A << 0,    -pi/4, 0,\n       pi/4, 0,     0,\n       0,    0,     0;\n  std::cout << \"The matrix A is:\\n\" << A << \"\\n\\n\";\n  std::cout << \"The matrix exponential of A is:\\n\" << A.exp() << \"\\n\\n\";\n}\n"
  },
  {
    "path": "libs/eigen/unsupported/doc/examples/MatrixFunction.cpp",
    "content": "#include <unsupported/Eigen/MatrixFunctions>\n#include <iostream>\n\nusing namespace Eigen;\n\nstd::complex<double> expfn(std::complex<double> x, int)\n{\n  return std::exp(x);\n}\n\nint main()\n{\n  const double pi = std::acos(-1.0);\n\n  MatrixXd A(3,3);\n  A << 0,    -pi/4, 0,\n       pi/4, 0,     0,\n       0,    0,     0;\n\n  std::cout << \"The matrix A is:\\n\" << A << \"\\n\\n\";\n  std::cout << \"The matrix exponential of A is:\\n\" \n            << A.matrixFunction(expfn) << \"\\n\\n\";\n}\n"
  },
  {
    "path": "libs/eigen/unsupported/doc/examples/MatrixLogarithm.cpp",
    "content": "#include <unsupported/Eigen/MatrixFunctions>\n#include <iostream>\n\nusing namespace Eigen;\n\nint main()\n{\n  using std::sqrt;\n  MatrixXd A(3,3);\n  A << 0.5*sqrt(2), -0.5*sqrt(2), 0,\n       0.5*sqrt(2),  0.5*sqrt(2), 0,\n       0,            0,           1;\n  std::cout << \"The matrix A is:\\n\" << A << \"\\n\\n\";\n  std::cout << \"The matrix logarithm of A is:\\n\" << A.log() << \"\\n\";\n}\n"
  },
  {
    "path": "libs/eigen/unsupported/doc/examples/MatrixPower.cpp",
    "content": "#include <unsupported/Eigen/MatrixFunctions>\n#include <iostream>\n\nusing namespace Eigen;\n\nint main()\n{\n  const double pi = std::acos(-1.0);\n  Matrix3d A;\n  A << cos(1), -sin(1), 0,\n       sin(1),  cos(1), 0,\n\t   0 ,      0 , 1;\n  std::cout << \"The matrix A is:\\n\" << A << \"\\n\\n\"\n\t       \"The matrix power A^(pi/4) is:\\n\" << A.pow(pi/4) << std::endl;\n  return 0;\n}\n"
  },
  {
    "path": "libs/eigen/unsupported/doc/examples/MatrixPower_optimal.cpp",
    "content": "#include <unsupported/Eigen/MatrixFunctions>\n#include <iostream>\n\nusing namespace Eigen;\n\nint main()\n{\n  Matrix4cd A = Matrix4cd::Random();\n  MatrixPower<Matrix4cd> Apow(A);\n\n  std::cout << \"The matrix A is:\\n\" << A << \"\\n\\n\"\n\t       \"A^3.1 is:\\n\" << Apow(3.1) << \"\\n\\n\"\n\t       \"A^3.3 is:\\n\" << Apow(3.3) << \"\\n\\n\"\n\t       \"A^3.7 is:\\n\" << Apow(3.7) << \"\\n\\n\"\n\t       \"A^3.9 is:\\n\" << Apow(3.9) << std::endl;\n  return 0;\n}\n"
  },
  {
    "path": "libs/eigen/unsupported/doc/examples/MatrixSine.cpp",
    "content": "#include <unsupported/Eigen/MatrixFunctions>\n#include <iostream>\n\nusing namespace Eigen;\n\nint main()\n{\n  MatrixXd A = MatrixXd::Random(3,3);\n  std::cout << \"A = \\n\" << A << \"\\n\\n\";\n\n  MatrixXd sinA = A.sin();\n  std::cout << \"sin(A) = \\n\" << sinA << \"\\n\\n\";\n\n  MatrixXd cosA = A.cos();\n  std::cout << \"cos(A) = \\n\" << cosA << \"\\n\\n\";\n  \n  // The matrix functions satisfy sin^2(A) + cos^2(A) = I, \n  // like the scalar functions.\n  std::cout << \"sin^2(A) + cos^2(A) = \\n\" << sinA*sinA + cosA*cosA << \"\\n\\n\";\n}\n"
  },
  {
    "path": "libs/eigen/unsupported/doc/examples/MatrixSinh.cpp",
    "content": "#include <unsupported/Eigen/MatrixFunctions>\n#include <iostream>\n\nusing namespace Eigen;\n\nint main()\n{\n  MatrixXf A = MatrixXf::Random(3,3);\n  std::cout << \"A = \\n\" << A << \"\\n\\n\";\n\n  MatrixXf sinhA = A.sinh();\n  std::cout << \"sinh(A) = \\n\" << sinhA << \"\\n\\n\";\n\n  MatrixXf coshA = A.cosh();\n  std::cout << \"cosh(A) = \\n\" << coshA << \"\\n\\n\";\n  \n  // The matrix functions satisfy cosh^2(A) - sinh^2(A) = I, \n  // like the scalar functions.\n  std::cout << \"cosh^2(A) - sinh^2(A) = \\n\" << coshA*coshA - sinhA*sinhA << \"\\n\\n\";\n}\n"
  },
  {
    "path": "libs/eigen/unsupported/doc/examples/MatrixSquareRoot.cpp",
    "content": "#include <unsupported/Eigen/MatrixFunctions>\n#include <iostream>\n\nusing namespace Eigen;\n\nint main()\n{\n  const double pi = std::acos(-1.0);\n\n  MatrixXd A(2,2);\n  A << cos(pi/3), -sin(pi/3), \n       sin(pi/3),  cos(pi/3);\n  std::cout << \"The matrix A is:\\n\" << A << \"\\n\\n\";\n  std::cout << \"The matrix square root of A is:\\n\" << A.sqrt() << \"\\n\\n\";\n  std::cout << \"The square of the last matrix is:\\n\" << A.sqrt() * A.sqrt() << \"\\n\";\n}\n"
  },
  {
    "path": "libs/eigen/unsupported/doc/examples/PolynomialSolver1.cpp",
    "content": "#include <unsupported/Eigen/Polynomials>\n#include <vector>\n#include <iostream>\n\nusing namespace Eigen;\nusing namespace std;\n\nint main()\n{\n  typedef Matrix<double,5,1> Vector5d;\n\n  Vector5d roots = Vector5d::Random();\n  cout << \"Roots: \" << roots.transpose() << endl;\n  Eigen::Matrix<double,6,1> polynomial;\n  roots_to_monicPolynomial( roots, polynomial );\n\n  PolynomialSolver<double,5> psolve( polynomial );\n  cout << \"Complex roots: \" << psolve.roots().transpose() << endl;\n\n  std::vector<double> realRoots;\n  psolve.realRoots( realRoots );\n  Map<Vector5d> mapRR( &realRoots[0] );\n  cout << \"Real roots: \" << mapRR.transpose() << endl;\n\n  cout << endl;\n  cout << \"Illustration of the convergence problem with the QR algorithm: \" << endl;\n  cout << \"---------------------------------------------------------------\" << endl;\n  Eigen::Matrix<float,7,1> hardCase_polynomial;\n  hardCase_polynomial <<\n  -0.957, 0.9219, 0.3516, 0.9453, -0.4023, -0.5508, -0.03125;\n  cout << \"Hard case polynomial defined by floats: \" << hardCase_polynomial.transpose() << endl;\n  PolynomialSolver<float,6> psolvef( hardCase_polynomial );\n  cout << \"Complex roots: \" << psolvef.roots().transpose() << endl;\n  Eigen::Matrix<float,6,1> evals;\n  for( int i=0; i<6; ++i ){ evals[i] = std::abs( poly_eval( hardCase_polynomial, psolvef.roots()[i] ) ); }\n  cout << \"Norms of the evaluations of the polynomial at the roots: \" << evals.transpose() << endl << endl;\n\n  cout << \"Using double's almost always solves the problem for small degrees: \" << endl;\n  cout << \"-------------------------------------------------------------------\" << endl;\n  PolynomialSolver<double,6> psolve6d( hardCase_polynomial.cast<double>() );\n  cout << \"Complex roots: \" << psolve6d.roots().transpose() << endl;\n  for( int i=0; i<6; ++i )\n  {\n    std::complex<float> castedRoot( psolve6d.roots()[i].real(), psolve6d.roots()[i].imag() );\n    evals[i] = std::abs( poly_eval( hardCase_polynomial, castedRoot ) );\n  }\n  cout << \"Norms of the evaluations of the polynomial at the roots: \" << evals.transpose() << endl << endl;\n\n  cout.precision(10);\n  cout << \"The last root in float then in double: \" << psolvef.roots()[5] << \"\\t\" << psolve6d.roots()[5] << endl;\n  std::complex<float> castedRoot( psolve6d.roots()[5].real(), psolve6d.roots()[5].imag() );\n  cout << \"Norm of the difference: \" << std::abs( psolvef.roots()[5] - castedRoot ) << endl;\n}\n"
  },
  {
    "path": "libs/eigen/unsupported/doc/examples/PolynomialUtils1.cpp",
    "content": "#include <unsupported/Eigen/Polynomials>\n#include <iostream>\n\nusing namespace Eigen;\nusing namespace std;\n\nint main()\n{\n  Vector4d roots = Vector4d::Random();\n  cout << \"Roots: \" << roots.transpose() << endl;\n  Eigen::Matrix<double,5,1> polynomial;\n  roots_to_monicPolynomial( roots, polynomial );\n  cout << \"Polynomial: \";\n  for( int i=0; i<4; ++i ){ cout << polynomial[i] << \".x^\" << i << \"+ \"; }\n  cout << polynomial[4] << \".x^4\" << endl;\n  Vector4d evaluation;\n  for( int i=0; i<4; ++i ){\n    evaluation[i] = poly_eval( polynomial, roots[i] ); }\n  cout << \"Evaluation of the polynomial at the roots: \" << evaluation.transpose();\n}\n"
  },
  {
    "path": "libs/eigen/unsupported/doc/snippets/CMakeLists.txt",
    "content": "FILE(GLOB snippets_SRCS \"*.cpp\")\n\nADD_CUSTOM_TARGET(unsupported_snippets)\n\nFOREACH(snippet_src ${snippets_SRCS})\n  GET_FILENAME_COMPONENT(snippet ${snippet_src} NAME_WE)\n  SET(compile_snippet_target compile_${snippet})\n  SET(compile_snippet_src ${compile_snippet_target}.cpp)\n  FILE(READ ${snippet_src} snippet_source_code)\n  CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/doc/snippets/compile_snippet.cpp.in\n                 ${CMAKE_CURRENT_BINARY_DIR}/${compile_snippet_src})\n  ADD_EXECUTABLE(${compile_snippet_target}\n                 ${CMAKE_CURRENT_BINARY_DIR}/${compile_snippet_src})\n  if(EIGEN_STANDARD_LIBRARIES_TO_LINK_TO)\n    target_link_libraries(${compile_snippet_target} ${EIGEN_STANDARD_LIBRARIES_TO_LINK_TO})\n  endif()\n  ADD_CUSTOM_COMMAND(\n    TARGET ${compile_snippet_target}\n    POST_BUILD\n    COMMAND ${compile_snippet_target}\n    ARGS >${CMAKE_CURRENT_BINARY_DIR}/${snippet}.out\n  )\n  ADD_DEPENDENCIES(unsupported_snippets ${compile_snippet_target})\n  set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/${compile_snippet_src}\n                              PROPERTIES OBJECT_DEPENDS ${snippet_src})\nENDFOREACH(snippet_src)\n"
  },
  {
    "path": "libs/eigen/unsupported/test/BVH.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Ilya Baran <ibaran@mit.edu>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <Eigen/StdVector>\n#include <Eigen/Geometry>\n#include <unsupported/Eigen/BVH>\n\nnamespace Eigen {\n\ntemplate<typename Scalar, int Dim> AlignedBox<Scalar, Dim> bounding_box(const Matrix<Scalar, Dim, 1> &v) { return AlignedBox<Scalar, Dim>(v); }\n\n}\n\n\ntemplate<int Dim>\nstruct Ball\n{\nEIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(double, Dim)\n\n  typedef Matrix<double, Dim, 1> VectorType;\n\n  Ball() {}\n  Ball(const VectorType &c, double r) : center(c), radius(r) {}\n\n  VectorType center;\n  double radius;\n};\ntemplate<int Dim> AlignedBox<double, Dim> bounding_box(const Ball<Dim> &b)\n{ return AlignedBox<double, Dim>(b.center.array() - b.radius, b.center.array() + b.radius); }\n\ninline double SQR(double x) { return x * x; }\n\ntemplate<int Dim>\nstruct BallPointStuff //this class provides functions to be both an intersector and a minimizer, both for a ball and a point and for two trees\n{\n  typedef double Scalar;\n  typedef Matrix<double, Dim, 1> VectorType;\n  typedef Ball<Dim> BallType;\n  typedef AlignedBox<double, Dim> BoxType;\n\n  BallPointStuff() : calls(0), count(0) {}\n  BallPointStuff(const VectorType &inP) : p(inP), calls(0), count(0) {}\n\n\n  bool intersectVolume(const BoxType &r) { ++calls; return r.contains(p); }\n  bool intersectObject(const BallType &b) {\n    ++calls;\n    if((b.center - p).squaredNorm() < SQR(b.radius))\n      ++count;\n    return false; //continue\n  }\n\n  bool intersectVolumeVolume(const BoxType &r1, const BoxType &r2) { ++calls; return !(r1.intersection(r2)).isNull(); }\n  bool intersectVolumeObject(const BoxType &r, const BallType &b) { ++calls; return r.squaredExteriorDistance(b.center) < SQR(b.radius); }\n  bool intersectObjectVolume(const BallType &b, const BoxType &r) { ++calls; return r.squaredExteriorDistance(b.center) < SQR(b.radius); }\n  bool intersectObjectObject(const BallType &b1, const BallType &b2){\n    ++calls;\n    if((b1.center - b2.center).norm() < b1.radius + b2.radius)\n      ++count;\n    return false;\n  }\n  bool intersectVolumeObject(const BoxType &r, const VectorType &v) { ++calls; return r.contains(v); }\n  bool intersectObjectObject(const BallType &b, const VectorType &v){\n    ++calls;\n    if((b.center - v).squaredNorm() < SQR(b.radius))\n      ++count;\n    return false;\n  }\n\n  double minimumOnVolume(const BoxType &r) { ++calls; return r.squaredExteriorDistance(p); }\n  double minimumOnObject(const BallType &b) { ++calls; return (std::max)(0., (b.center - p).squaredNorm() - SQR(b.radius)); }\n  double minimumOnVolumeVolume(const BoxType &r1, const BoxType &r2) { ++calls; return r1.squaredExteriorDistance(r2); }\n  double minimumOnVolumeObject(const BoxType &r, const BallType &b) { ++calls; return SQR((std::max)(0., r.exteriorDistance(b.center) - b.radius)); }\n  double minimumOnObjectVolume(const BallType &b, const BoxType &r) { ++calls; return SQR((std::max)(0., r.exteriorDistance(b.center) - b.radius)); }\n  double minimumOnObjectObject(const BallType &b1, const BallType &b2){ ++calls; return SQR((std::max)(0., (b1.center - b2.center).norm() - b1.radius - b2.radius)); }\n  double minimumOnVolumeObject(const BoxType &r, const VectorType &v) { ++calls; return r.squaredExteriorDistance(v); }\n  double minimumOnObjectObject(const BallType &b, const VectorType &v){ ++calls; return SQR((std::max)(0., (b.center - v).norm() - b.radius)); }\n\n  VectorType p;\n  int calls;\n  int count;\n};\n\n\ntemplate<int Dim>\nstruct TreeTest\n{\n  typedef Matrix<double, Dim, 1> VectorType;\n  typedef std::vector<VectorType, aligned_allocator<VectorType> > VectorTypeList;\n  typedef Ball<Dim> BallType;\n  typedef std::vector<BallType, aligned_allocator<BallType> > BallTypeList;\n  typedef AlignedBox<double, Dim> BoxType;\n\n  void testIntersect1()\n  {\n    BallTypeList b;\n    for(int i = 0; i < 500; ++i) {\n        b.push_back(BallType(VectorType::Random(), 0.5 * internal::random(0., 1.)));\n    }\n    KdBVH<double, Dim, BallType> tree(b.begin(), b.end());\n\n    VectorType pt = VectorType::Random();\n    BallPointStuff<Dim> i1(pt), i2(pt);\n\n    for(int i = 0; i < (int)b.size(); ++i)\n      i1.intersectObject(b[i]);\n\n    BVIntersect(tree, i2);\n\n    VERIFY(i1.count == i2.count);\n  }\n\n  void testMinimize1()\n  {\n    BallTypeList b;\n    for(int i = 0; i < 500; ++i) {\n        b.push_back(BallType(VectorType::Random(), 0.01 * internal::random(0., 1.)));\n    }\n    KdBVH<double, Dim, BallType> tree(b.begin(), b.end());\n\n    VectorType pt = VectorType::Random();\n    BallPointStuff<Dim> i1(pt), i2(pt);\n\n    double m1 = (std::numeric_limits<double>::max)(), m2 = m1;\n\n    for(int i = 0; i < (int)b.size(); ++i)\n      m1 = (std::min)(m1, i1.minimumOnObject(b[i]));\n\n    m2 = BVMinimize(tree, i2);\n\n    VERIFY_IS_APPROX(m1, m2);\n  }\n\n  void testIntersect2()\n  {\n    BallTypeList b;\n    VectorTypeList v;\n\n    for(int i = 0; i < 50; ++i) {\n        b.push_back(BallType(VectorType::Random(), 0.5 * internal::random(0., 1.)));\n        for(int j = 0; j < 3; ++j)\n            v.push_back(VectorType::Random());\n    }\n\n    KdBVH<double, Dim, BallType> tree(b.begin(), b.end());\n    KdBVH<double, Dim, VectorType> vTree(v.begin(), v.end());\n\n    BallPointStuff<Dim> i1, i2;\n\n    for(int i = 0; i < (int)b.size(); ++i)\n        for(int j = 0; j < (int)v.size(); ++j)\n            i1.intersectObjectObject(b[i], v[j]);\n\n    BVIntersect(tree, vTree, i2);\n\n    VERIFY(i1.count == i2.count);\n  }\n\n  void testMinimize2()\n  {\n    BallTypeList b;\n    VectorTypeList v;\n\n    for(int i = 0; i < 50; ++i) {\n        b.push_back(BallType(VectorType::Random(), 1e-7 + 1e-6 * internal::random(0., 1.)));\n        for(int j = 0; j < 3; ++j)\n            v.push_back(VectorType::Random());\n    }\n\n    KdBVH<double, Dim, BallType> tree(b.begin(), b.end());\n    KdBVH<double, Dim, VectorType> vTree(v.begin(), v.end());\n\n    BallPointStuff<Dim> i1, i2;\n\n    double m1 = (std::numeric_limits<double>::max)(), m2 = m1;\n\n    for(int i = 0; i < (int)b.size(); ++i)\n        for(int j = 0; j < (int)v.size(); ++j)\n            m1 = (std::min)(m1, i1.minimumOnObjectObject(b[i], v[j]));\n\n    m2 = BVMinimize(tree, vTree, i2);\n\n    VERIFY_IS_APPROX(m1, m2);\n  }\n};\n\n\nvoid test_BVH()\n{\n  for(int i = 0; i < g_repeat; i++) {\n#ifdef EIGEN_TEST_PART_1\n    TreeTest<2> test2;\n    CALL_SUBTEST(test2.testIntersect1());\n    CALL_SUBTEST(test2.testMinimize1());\n    CALL_SUBTEST(test2.testIntersect2());\n    CALL_SUBTEST(test2.testMinimize2());\n#endif\n\n#ifdef EIGEN_TEST_PART_2\n    TreeTest<3> test3;\n    CALL_SUBTEST(test3.testIntersect1());\n    CALL_SUBTEST(test3.testMinimize1());\n    CALL_SUBTEST(test3.testIntersect2());\n    CALL_SUBTEST(test3.testMinimize2());\n#endif\n\n#ifdef EIGEN_TEST_PART_3\n    TreeTest<4> test4;\n    CALL_SUBTEST(test4.testIntersect1());\n    CALL_SUBTEST(test4.testMinimize1());\n    CALL_SUBTEST(test4.testIntersect2());\n    CALL_SUBTEST(test4.testMinimize2());\n#endif\n  }\n}\n"
  },
  {
    "path": "libs/eigen/unsupported/test/CMakeLists.txt",
    "content": "\nset_property(GLOBAL PROPERTY EIGEN_CURRENT_SUBPROJECT \"Unsupported\")\nadd_custom_target(BuildUnsupported)\n\ninclude_directories(../../test ../../unsupported ../../Eigen \n                    ${CMAKE_CURRENT_BINARY_DIR}/../../test)\n\nfind_package(GoogleHash)\nif(GOOGLEHASH_FOUND)\n  add_definitions(\"-DEIGEN_GOOGLEHASH_SUPPORT\")\n  include_directories(${GOOGLEHASH_INCLUDES})\n  ei_add_property(EIGEN_TESTED_BACKENDS  \"GoogleHash, \")\nelse(GOOGLEHASH_FOUND)\n  ei_add_property(EIGEN_MISSING_BACKENDS  \"GoogleHash, \")\nendif(GOOGLEHASH_FOUND)\n\nfind_package(Adolc)\nif(ADOLC_FOUND)\n  include_directories(${ADOLC_INCLUDES})\n  ei_add_property(EIGEN_TESTED_BACKENDS \"Adolc, \")\n  ei_add_test(forward_adolc \"\" ${ADOLC_LIBRARIES})\nelse(ADOLC_FOUND)\n  ei_add_property(EIGEN_MISSING_BACKENDS \"Adolc, \")\nendif(ADOLC_FOUND)\n\n# this test seems to never have been successful on x87, so is considered to contain a FP-related bug.\n# see thread: \"non-linear optimization test summary\"\nei_add_test(NonLinearOptimization)\n\nei_add_test(NumericalDiff)\nei_add_test(autodiff)\nei_add_test(BVH)\nei_add_test(matrix_exponential)\nei_add_test(matrix_function)\nei_add_test(matrix_power)\nei_add_test(matrix_square_root)\nei_add_test(alignedvector3)\nei_add_test(FFT)\n\nfind_package(MPFR 2.3.0)\nfind_package(GMP)\nif(MPFR_FOUND)\n  include_directories(${MPFR_INCLUDES} ./mpreal)\n  ei_add_property(EIGEN_TESTED_BACKENDS \"MPFR C++, \")\n  set(EIGEN_MPFR_TEST_LIBRARIES ${MPFR_LIBRARIES} ${GMP_LIBRARIES})\n  ei_add_test(mpreal_support \"\" \"${EIGEN_MPFR_TEST_LIBRARIES}\" )\nelse()\n  ei_add_property(EIGEN_MISSING_BACKENDS \"MPFR C++, \")\nendif()\n\nei_add_test(sparse_extra   \"\" \"\")\n\nfind_package(FFTW)\nif(FFTW_FOUND)\n  ei_add_property(EIGEN_TESTED_BACKENDS \"fftw, \")\n  include_directories( ${FFTW_INCLUDES} )\n  if(FFTWL_LIB)\n    ei_add_test(FFTW  \"-DEIGEN_FFTW_DEFAULT -DEIGEN_HAS_FFTWL\" \"${FFTW_LIBRARIES}\" )\n  else()\n    ei_add_test(FFTW  \"-DEIGEN_FFTW_DEFAULT\" \"${FFTW_LIBRARIES}\" )\n  endif()\nelse()\n  ei_add_property(EIGEN_MISSING_BACKENDS \"fftw, \")\nendif()\n\noption(EIGEN_TEST_NO_OPENGL \"Disable OpenGL support in unit tests\" OFF)\nif(NOT EIGEN_TEST_NO_OPENGL)\n  find_package(OpenGL)\n  find_package(GLUT)\n  find_package(GLEW)\n  if(OPENGL_FOUND AND GLUT_FOUND AND GLEW_FOUND)\n    include_directories(${OPENGL_INCLUDE_DIR} ${GLUT_INCLUDE_DIR} ${GLEW_INCLUDE_DIRS})\n    ei_add_property(EIGEN_TESTED_BACKENDS \"OpenGL, \")\n    set(EIGEN_GL_LIB ${GLUT_LIBRARIES} ${GLEW_LIBRARIES} ${OPENGL_LIBRARIES})\n    ei_add_test(openglsupport  \"\" \"${EIGEN_GL_LIB}\" )\n  else()\n    ei_add_property(EIGEN_MISSING_BACKENDS \"OpenGL, \")\n  endif()\nelse()\n    ei_add_property(EIGEN_MISSING_BACKENDS \"OpenGL, \")\nendif()\n\nei_add_test(polynomialsolver)\nei_add_test(polynomialutils)\nei_add_test(kronecker_product)\nei_add_test(splines)\nei_add_test(gmres)\nei_add_test(minres)\nei_add_test(levenberg_marquardt)\nei_add_test(bdcsvd)\n"
  },
  {
    "path": "libs/eigen/unsupported/test/FFT.cpp",
    "content": "#define test_FFTW test_FFT\n#include \"FFTW.cpp\"\n"
  },
  {
    "path": "libs/eigen/unsupported/test/FFTW.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Mark Borgerding mark a borgerding net\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <unsupported/Eigen/FFT>\n\ntemplate <typename T> \nstd::complex<T> RandomCpx() { return std::complex<T>( (T)(rand()/(T)RAND_MAX - .5), (T)(rand()/(T)RAND_MAX - .5) ); }\n\nusing namespace std;\nusing namespace Eigen;\n\n\ntemplate < typename T>\ncomplex<long double>  promote(complex<T> x) { return complex<long double>(x.real(),x.imag()); }\n\ncomplex<long double>  promote(float x) { return complex<long double>( x); }\ncomplex<long double>  promote(double x) { return complex<long double>( x); }\ncomplex<long double>  promote(long double x) { return complex<long double>( x); }\n    \n\n    template <typename VT1,typename VT2>\n    long double fft_rmse( const VT1 & fftbuf,const VT2 & timebuf)\n    {\n        long double totalpower=0;\n        long double difpower=0;\n        long double pi = acos((long double)-1 );\n        for (size_t k0=0;k0<(size_t)fftbuf.size();++k0) {\n            complex<long double> acc = 0;\n            long double phinc = -2.*k0* pi / timebuf.size();\n            for (size_t k1=0;k1<(size_t)timebuf.size();++k1) {\n                acc +=  promote( timebuf[k1] ) * exp( complex<long double>(0,k1*phinc) );\n            }\n            totalpower += numext::abs2(acc);\n            complex<long double> x = promote(fftbuf[k0]); \n            complex<long double> dif = acc - x;\n            difpower += numext::abs2(dif);\n            //cerr << k0 << \"\\t\" << acc << \"\\t\" <<  x << \"\\t\" << sqrt(numext::abs2(dif)) << endl;\n        }\n        cerr << \"rmse:\" << sqrt(difpower/totalpower) << endl;\n        return sqrt(difpower/totalpower);\n    }\n\n    template <typename VT1,typename VT2>\n    long double dif_rmse( const VT1 buf1,const VT2 buf2)\n    {\n        long double totalpower=0;\n        long double difpower=0;\n        size_t n = (min)( buf1.size(),buf2.size() );\n        for (size_t k=0;k<n;++k) {\n            totalpower += (numext::abs2( buf1[k] ) + numext::abs2(buf2[k]) )/2.;\n            difpower += numext::abs2(buf1[k] - buf2[k]);\n        }\n        return sqrt(difpower/totalpower);\n    }\n\nenum { StdVectorContainer, EigenVectorContainer };\n\ntemplate<int Container, typename Scalar> struct VectorType;\n\ntemplate<typename Scalar> struct VectorType<StdVectorContainer,Scalar>\n{\n  typedef vector<Scalar> type;\n};\n\ntemplate<typename Scalar> struct VectorType<EigenVectorContainer,Scalar>\n{\n  typedef Matrix<Scalar,Dynamic,1> type;\n};\n\ntemplate <int Container, typename T>\nvoid test_scalar_generic(int nfft)\n{\n    typedef typename FFT<T>::Complex Complex;\n    typedef typename FFT<T>::Scalar Scalar;\n    typedef typename VectorType<Container,Scalar>::type ScalarVector;\n    typedef typename VectorType<Container,Complex>::type ComplexVector;\n\n    FFT<T> fft;\n    ScalarVector tbuf(nfft);\n    ComplexVector freqBuf;\n    for (int k=0;k<nfft;++k)\n        tbuf[k]= (T)( rand()/(double)RAND_MAX - .5);\n\n    // make sure it DOESN'T give the right full spectrum answer\n    // if we've asked for half-spectrum\n    fft.SetFlag(fft.HalfSpectrum );\n    fft.fwd( freqBuf,tbuf);\n    VERIFY((size_t)freqBuf.size() == (size_t)( (nfft>>1)+1) );\n    VERIFY( fft_rmse(freqBuf,tbuf) < test_precision<T>()  );// gross check\n\n    fft.ClearFlag(fft.HalfSpectrum );\n    fft.fwd( freqBuf,tbuf);\n    VERIFY( (size_t)freqBuf.size() == (size_t)nfft);\n    VERIFY( fft_rmse(freqBuf,tbuf) < test_precision<T>()  );// gross check\n\n    if (nfft&1)\n        return; // odd FFTs get the wrong size inverse FFT\n\n    ScalarVector tbuf2;\n    fft.inv( tbuf2 , freqBuf);\n    VERIFY( dif_rmse(tbuf,tbuf2) < test_precision<T>()  );// gross check\n\n\n    // verify that the Unscaled flag takes effect\n    ScalarVector tbuf3;\n    fft.SetFlag(fft.Unscaled);\n\n    fft.inv( tbuf3 , freqBuf);\n\n    for (int k=0;k<nfft;++k)\n        tbuf3[k] *= T(1./nfft);\n\n\n    //for (size_t i=0;i<(size_t) tbuf.size();++i)\n    //    cout << \"freqBuf=\" << freqBuf[i] << \" in2=\" << tbuf3[i] << \" -  in=\" << tbuf[i] << \" => \" << (tbuf3[i] - tbuf[i] ) <<  endl;\n\n    VERIFY( dif_rmse(tbuf,tbuf3) < test_precision<T>()  );// gross check\n\n    // verify that ClearFlag works\n    fft.ClearFlag(fft.Unscaled);\n    fft.inv( tbuf2 , freqBuf);\n    VERIFY( dif_rmse(tbuf,tbuf2) < test_precision<T>()  );// gross check\n}\n\ntemplate <typename T>\nvoid test_scalar(int nfft)\n{\n  test_scalar_generic<StdVectorContainer,T>(nfft);\n  //test_scalar_generic<EigenVectorContainer,T>(nfft);\n}\n\n\ntemplate <int Container, typename T>\nvoid test_complex_generic(int nfft)\n{\n    typedef typename FFT<T>::Complex Complex;\n    typedef typename VectorType<Container,Complex>::type ComplexVector;\n\n    FFT<T> fft;\n\n    ComplexVector inbuf(nfft);\n    ComplexVector outbuf;\n    ComplexVector buf3;\n    for (int k=0;k<nfft;++k)\n        inbuf[k]= Complex( (T)(rand()/(double)RAND_MAX - .5), (T)(rand()/(double)RAND_MAX - .5) );\n    fft.fwd( outbuf , inbuf);\n\n    VERIFY( fft_rmse(outbuf,inbuf) < test_precision<T>()  );// gross check\n    fft.inv( buf3 , outbuf);\n\n    VERIFY( dif_rmse(inbuf,buf3) < test_precision<T>()  );// gross check\n\n    // verify that the Unscaled flag takes effect\n    ComplexVector buf4;\n    fft.SetFlag(fft.Unscaled);\n    fft.inv( buf4 , outbuf);\n    for (int k=0;k<nfft;++k)\n        buf4[k] *= T(1./nfft);\n    VERIFY( dif_rmse(inbuf,buf4) < test_precision<T>()  );// gross check\n\n    // verify that ClearFlag works\n    fft.ClearFlag(fft.Unscaled);\n    fft.inv( buf3 , outbuf);\n    VERIFY( dif_rmse(inbuf,buf3) < test_precision<T>()  );// gross check\n}\n\ntemplate <typename T>\nvoid test_complex(int nfft)\n{\n  test_complex_generic<StdVectorContainer,T>(nfft);\n  test_complex_generic<EigenVectorContainer,T>(nfft);\n}\n/*\ntemplate <typename T,int nrows,int ncols>\nvoid test_complex2d()\n{\n    typedef typename Eigen::FFT<T>::Complex Complex;\n    FFT<T> fft;\n    Eigen::Matrix<Complex,nrows,ncols> src,src2,dst,dst2;\n\n    src = Eigen::Matrix<Complex,nrows,ncols>::Random();\n    //src =  Eigen::Matrix<Complex,nrows,ncols>::Identity();\n\n    for (int k=0;k<ncols;k++) {\n        Eigen::Matrix<Complex,nrows,1> tmpOut;\n        fft.fwd( tmpOut,src.col(k) );\n        dst2.col(k) = tmpOut;\n    }\n\n    for (int k=0;k<nrows;k++) {\n        Eigen::Matrix<Complex,1,ncols> tmpOut;\n        fft.fwd( tmpOut,  dst2.row(k) );\n        dst2.row(k) = tmpOut;\n    }\n\n    fft.fwd2(dst.data(),src.data(),ncols,nrows);\n    fft.inv2(src2.data(),dst.data(),ncols,nrows);\n    VERIFY( (src-src2).norm() < test_precision<T>() );\n    VERIFY( (dst-dst2).norm() < test_precision<T>() );\n}\n*/\n\n\nvoid test_return_by_value(int len)\n{\n    VectorXf in;\n    VectorXf in1;\n    in.setRandom( len );\n    VectorXcf out1,out2;\n    FFT<float> fft;\n\n    fft.SetFlag(fft.HalfSpectrum );\n\n    fft.fwd(out1,in);\n    out2 = fft.fwd(in);\n    VERIFY( (out1-out2).norm() < test_precision<float>() );\n    in1 = fft.inv(out1);\n    VERIFY( (in1-in).norm() < test_precision<float>() );\n}\n\nvoid test_FFTW()\n{\n  CALL_SUBTEST( test_return_by_value(32) );\n  //CALL_SUBTEST( ( test_complex2d<float,4,8> () ) ); CALL_SUBTEST( ( test_complex2d<double,4,8> () ) );\n  //CALL_SUBTEST( ( test_complex2d<long double,4,8> () ) );\n  CALL_SUBTEST( test_complex<float>(32) ); CALL_SUBTEST( test_complex<double>(32) ); \n  CALL_SUBTEST( test_complex<float>(256) ); CALL_SUBTEST( test_complex<double>(256) ); \n  CALL_SUBTEST( test_complex<float>(3*8) ); CALL_SUBTEST( test_complex<double>(3*8) ); \n  CALL_SUBTEST( test_complex<float>(5*32) ); CALL_SUBTEST( test_complex<double>(5*32) ); \n  CALL_SUBTEST( test_complex<float>(2*3*4) ); CALL_SUBTEST( test_complex<double>(2*3*4) ); \n  CALL_SUBTEST( test_complex<float>(2*3*4*5) ); CALL_SUBTEST( test_complex<double>(2*3*4*5) ); \n  CALL_SUBTEST( test_complex<float>(2*3*4*5*7) ); CALL_SUBTEST( test_complex<double>(2*3*4*5*7) ); \n\n  CALL_SUBTEST( test_scalar<float>(32) ); CALL_SUBTEST( test_scalar<double>(32) ); \n  CALL_SUBTEST( test_scalar<float>(45) ); CALL_SUBTEST( test_scalar<double>(45) ); \n  CALL_SUBTEST( test_scalar<float>(50) ); CALL_SUBTEST( test_scalar<double>(50) ); \n  CALL_SUBTEST( test_scalar<float>(256) ); CALL_SUBTEST( test_scalar<double>(256) ); \n  CALL_SUBTEST( test_scalar<float>(2*3*4*5*7) ); CALL_SUBTEST( test_scalar<double>(2*3*4*5*7) ); \n  \n  #ifdef EIGEN_HAS_FFTWL\n  CALL_SUBTEST( test_complex<long double>(32) );\n  CALL_SUBTEST( test_complex<long double>(256) );\n  CALL_SUBTEST( test_complex<long double>(3*8) );\n  CALL_SUBTEST( test_complex<long double>(5*32) );\n  CALL_SUBTEST( test_complex<long double>(2*3*4) );\n  CALL_SUBTEST( test_complex<long double>(2*3*4*5) );\n  CALL_SUBTEST( test_complex<long double>(2*3*4*5*7) );\n  \n  CALL_SUBTEST( test_scalar<long double>(32) );\n  CALL_SUBTEST( test_scalar<long double>(45) );\n  CALL_SUBTEST( test_scalar<long double>(50) );\n  CALL_SUBTEST( test_scalar<long double>(256) );\n  CALL_SUBTEST( test_scalar<long double>(2*3*4*5*7) );\n  #endif\n}\n"
  },
  {
    "path": "libs/eigen/unsupported/test/NonLinearOptimization.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Thomas Capricelli <orzel@freehackers.org>\n\n#include <stdio.h>\n\n#include \"main.h\"\n#include <unsupported/Eigen/NonLinearOptimization>\n\n// This disables some useless Warnings on MSVC.\n// It is intended to be done for this test only.\n#include <Eigen/src/Core/util/DisableStupidWarnings.h>\n\nusing std::sqrt;\n\nint fcn_chkder(const VectorXd &x, VectorXd &fvec, MatrixXd &fjac, int iflag)\n{\n    /*      subroutine fcn for chkder example. */\n\n    int i;\n    assert(15 ==  fvec.size());\n    assert(3 ==  x.size());\n    double tmp1, tmp2, tmp3, tmp4;\n    static const double y[15]={1.4e-1, 1.8e-1, 2.2e-1, 2.5e-1, 2.9e-1, 3.2e-1, 3.5e-1,\n        3.9e-1, 3.7e-1, 5.8e-1, 7.3e-1, 9.6e-1, 1.34, 2.1, 4.39};\n\n\n    if (iflag == 0)\n        return 0;\n\n    if (iflag != 2)\n        for (i=0; i<15; i++) {\n            tmp1 = i+1;\n            tmp2 = 16-i-1;\n            tmp3 = tmp1;\n            if (i >= 8) tmp3 = tmp2;\n            fvec[i] = y[i] - (x[0] + tmp1/(x[1]*tmp2 + x[2]*tmp3));\n        }\n    else {\n        for (i = 0; i < 15; i++) {\n            tmp1 = i+1;\n            tmp2 = 16-i-1;\n\n            /* error introduced into next statement for illustration. */\n            /* corrected statement should read    tmp3 = tmp1 . */\n\n            tmp3 = tmp2;\n            if (i >= 8) tmp3 = tmp2;\n            tmp4 = (x[1]*tmp2 + x[2]*tmp3); tmp4=tmp4*tmp4;\n            fjac(i,0) = -1.;\n            fjac(i,1) = tmp1*tmp2/tmp4;\n            fjac(i,2) = tmp1*tmp3/tmp4;\n        }\n    }\n    return 0;\n}\n\n\nvoid testChkder()\n{\n  const int m=15, n=3;\n  VectorXd x(n), fvec(m), xp, fvecp(m), err;\n  MatrixXd fjac(m,n);\n  VectorXi ipvt;\n\n  /*      the following values should be suitable for */\n  /*      checking the jacobian matrix. */\n  x << 9.2e-1, 1.3e-1, 5.4e-1;\n\n  internal::chkder(x, fvec, fjac, xp, fvecp, 1, err);\n  fcn_chkder(x, fvec, fjac, 1);\n  fcn_chkder(x, fvec, fjac, 2);\n  fcn_chkder(xp, fvecp, fjac, 1);\n  internal::chkder(x, fvec, fjac, xp, fvecp, 2, err);\n\n  fvecp -= fvec;\n\n  // check those\n  VectorXd fvec_ref(m), fvecp_ref(m), err_ref(m);\n  fvec_ref <<\n      -1.181606, -1.429655, -1.606344,\n      -1.745269, -1.840654, -1.921586,\n      -1.984141, -2.022537, -2.468977,\n      -2.827562, -3.473582, -4.437612,\n      -6.047662, -9.267761, -18.91806;\n  fvecp_ref <<\n      -7.724666e-09, -3.432406e-09, -2.034843e-10,\n      2.313685e-09,  4.331078e-09,  5.984096e-09,\n      7.363281e-09,   8.53147e-09,  1.488591e-08,\n      2.33585e-08,  3.522012e-08,  5.301255e-08,\n      8.26666e-08,  1.419747e-07,   3.19899e-07;\n  err_ref <<\n      0.1141397,  0.09943516,  0.09674474,\n      0.09980447,  0.1073116, 0.1220445,\n      0.1526814, 1, 1,\n      1, 1, 1,\n      1, 1, 1;\n\n  VERIFY_IS_APPROX(fvec, fvec_ref);\n  VERIFY_IS_APPROX(fvecp, fvecp_ref);\n  VERIFY_IS_APPROX(err, err_ref);\n}\n\n// Generic functor\ntemplate<typename _Scalar, int NX=Dynamic, int NY=Dynamic>\nstruct Functor\n{\n  typedef _Scalar Scalar;\n  enum {\n    InputsAtCompileTime = NX,\n    ValuesAtCompileTime = NY\n  };\n  typedef Matrix<Scalar,InputsAtCompileTime,1> InputType;\n  typedef Matrix<Scalar,ValuesAtCompileTime,1> ValueType;\n  typedef Matrix<Scalar,ValuesAtCompileTime,InputsAtCompileTime> JacobianType;\n\n  const int m_inputs, m_values;\n\n  Functor() : m_inputs(InputsAtCompileTime), m_values(ValuesAtCompileTime) {}\n  Functor(int inputs, int values) : m_inputs(inputs), m_values(values) {}\n\n  int inputs() const { return m_inputs; }\n  int values() const { return m_values; }\n\n  // you should define that in the subclass :\n//  void operator() (const InputType& x, ValueType* v, JacobianType* _j=0) const;\n};\n\nstruct lmder_functor : Functor<double>\n{\n    lmder_functor(void): Functor<double>(3,15) {}\n    int operator()(const VectorXd &x, VectorXd &fvec) const\n    {\n        double tmp1, tmp2, tmp3;\n        static const double y[15] = {1.4e-1, 1.8e-1, 2.2e-1, 2.5e-1, 2.9e-1, 3.2e-1, 3.5e-1,\n            3.9e-1, 3.7e-1, 5.8e-1, 7.3e-1, 9.6e-1, 1.34, 2.1, 4.39};\n\n        for (int i = 0; i < values(); i++)\n        {\n            tmp1 = i+1;\n            tmp2 = 16 - i - 1;\n            tmp3 = (i>=8)? tmp2 : tmp1;\n            fvec[i] = y[i] - (x[0] + tmp1/(x[1]*tmp2 + x[2]*tmp3));\n        }\n        return 0;\n    }\n\n    int df(const VectorXd &x, MatrixXd &fjac) const\n    {\n        double tmp1, tmp2, tmp3, tmp4;\n        for (int i = 0; i < values(); i++)\n        {\n            tmp1 = i+1;\n            tmp2 = 16 - i - 1;\n            tmp3 = (i>=8)? tmp2 : tmp1;\n            tmp4 = (x[1]*tmp2 + x[2]*tmp3); tmp4 = tmp4*tmp4;\n            fjac(i,0) = -1;\n            fjac(i,1) = tmp1*tmp2/tmp4;\n            fjac(i,2) = tmp1*tmp3/tmp4;\n        }\n        return 0;\n    }\n};\n\nvoid testLmder1()\n{\n  int n=3, info;\n\n  VectorXd x;\n\n  /* the following starting values provide a rough fit. */\n  x.setConstant(n, 1.);\n\n  // do the computation\n  lmder_functor functor;\n  LevenbergMarquardt<lmder_functor> lm(functor);\n  info = lm.lmder1(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev, 6);\n  VERIFY_IS_EQUAL(lm.njev, 5);\n\n  // check norm\n  VERIFY_IS_APPROX(lm.fvec.blueNorm(), 0.09063596);\n\n  // check x\n  VectorXd x_ref(n);\n  x_ref << 0.08241058, 1.133037, 2.343695;\n  VERIFY_IS_APPROX(x, x_ref);\n}\n\nvoid testLmder()\n{\n  const int m=15, n=3;\n  int info;\n  double fnorm, covfac;\n  VectorXd x;\n\n  /* the following starting values provide a rough fit. */\n  x.setConstant(n, 1.);\n\n  // do the computation\n  lmder_functor functor;\n  LevenbergMarquardt<lmder_functor> lm(functor);\n  info = lm.minimize(x);\n\n  // check return values\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev, 6);\n  VERIFY_IS_EQUAL(lm.njev, 5);\n\n  // check norm\n  fnorm = lm.fvec.blueNorm();\n  VERIFY_IS_APPROX(fnorm, 0.09063596);\n\n  // check x\n  VectorXd x_ref(n);\n  x_ref << 0.08241058, 1.133037, 2.343695;\n  VERIFY_IS_APPROX(x, x_ref);\n\n  // check covariance\n  covfac = fnorm*fnorm/(m-n);\n  internal::covar(lm.fjac, lm.permutation.indices()); // TODO : move this as a function of lm\n\n  MatrixXd cov_ref(n,n);\n  cov_ref <<\n      0.0001531202,   0.002869941,  -0.002656662,\n      0.002869941,    0.09480935,   -0.09098995,\n      -0.002656662,   -0.09098995,    0.08778727;\n\n//  std::cout << fjac*covfac << std::endl;\n\n  MatrixXd cov;\n  cov =  covfac*lm.fjac.topLeftCorner<n,n>();\n  VERIFY_IS_APPROX( cov, cov_ref);\n  // TODO: why isn't this allowed ? :\n  // VERIFY_IS_APPROX( covfac*fjac.topLeftCorner<n,n>() , cov_ref);\n}\n\nstruct hybrj_functor : Functor<double>\n{\n    hybrj_functor(void) : Functor<double>(9,9) {}\n\n    int operator()(const VectorXd &x, VectorXd &fvec)\n    {\n        double temp, temp1, temp2;\n        const int n = x.size();\n        assert(fvec.size()==n);\n        for (int k = 0; k < n; k++)\n        {\n            temp = (3. - 2.*x[k])*x[k];\n            temp1 = 0.;\n            if (k) temp1 = x[k-1];\n            temp2 = 0.;\n            if (k != n-1) temp2 = x[k+1];\n            fvec[k] = temp - temp1 - 2.*temp2 + 1.;\n        }\n        return 0;\n    }\n    int df(const VectorXd &x, MatrixXd &fjac)\n    {\n        const int n = x.size();\n        assert(fjac.rows()==n);\n        assert(fjac.cols()==n);\n        for (int k = 0; k < n; k++)\n        {\n            for (int j = 0; j < n; j++)\n                fjac(k,j) = 0.;\n            fjac(k,k) = 3.- 4.*x[k];\n            if (k) fjac(k,k-1) = -1.;\n            if (k != n-1) fjac(k,k+1) = -2.;\n        }\n        return 0;\n    }\n};\n\n\nvoid testHybrj1()\n{\n  const int n=9;\n  int info;\n  VectorXd x(n);\n\n  /* the following starting values provide a rough fit. */\n  x.setConstant(n, -1.);\n\n  // do the computation\n  hybrj_functor functor;\n  HybridNonLinearSolver<hybrj_functor> solver(functor);\n  info = solver.hybrj1(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(solver.nfev, 11);\n  VERIFY_IS_EQUAL(solver.njev, 1);\n\n  // check norm\n  VERIFY_IS_APPROX(solver.fvec.blueNorm(), 1.192636e-08);\n\n\n// check x\n  VectorXd x_ref(n);\n  x_ref <<\n     -0.5706545,    -0.6816283,    -0.7017325,\n     -0.7042129,     -0.701369,    -0.6918656,\n     -0.665792,    -0.5960342,    -0.4164121;\n  VERIFY_IS_APPROX(x, x_ref);\n}\n\nvoid testHybrj()\n{\n  const int n=9;\n  int info;\n  VectorXd x(n);\n\n  /* the following starting values provide a rough fit. */\n  x.setConstant(n, -1.);\n\n\n  // do the computation\n  hybrj_functor functor;\n  HybridNonLinearSolver<hybrj_functor> solver(functor);\n  solver.diag.setConstant(n, 1.);\n  solver.useExternalScaling = true;\n  info = solver.solve(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(solver.nfev, 11);\n  VERIFY_IS_EQUAL(solver.njev, 1);\n\n  // check norm\n  VERIFY_IS_APPROX(solver.fvec.blueNorm(), 1.192636e-08);\n\n\n// check x\n  VectorXd x_ref(n);\n  x_ref <<\n     -0.5706545,    -0.6816283,    -0.7017325,\n     -0.7042129,     -0.701369,    -0.6918656,\n     -0.665792,    -0.5960342,    -0.4164121;\n  VERIFY_IS_APPROX(x, x_ref);\n\n}\n\nstruct hybrd_functor : Functor<double>\n{\n    hybrd_functor(void) : Functor<double>(9,9) {}\n    int operator()(const VectorXd &x, VectorXd &fvec) const\n    {\n        double temp, temp1, temp2;\n        const int n = x.size();\n\n        assert(fvec.size()==n);\n        for (int k=0; k < n; k++)\n        {\n            temp = (3. - 2.*x[k])*x[k];\n            temp1 = 0.;\n            if (k) temp1 = x[k-1];\n            temp2 = 0.;\n            if (k != n-1) temp2 = x[k+1];\n            fvec[k] = temp - temp1 - 2.*temp2 + 1.;\n        }\n        return 0;\n    }\n};\n\nvoid testHybrd1()\n{\n  int n=9, info;\n  VectorXd x(n);\n\n  /* the following starting values provide a rough solution. */\n  x.setConstant(n, -1.);\n\n  // do the computation\n  hybrd_functor functor;\n  HybridNonLinearSolver<hybrd_functor> solver(functor);\n  info = solver.hybrd1(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(solver.nfev, 20);\n\n  // check norm\n  VERIFY_IS_APPROX(solver.fvec.blueNorm(), 1.192636e-08);\n\n  // check x\n  VectorXd x_ref(n);\n  x_ref << -0.5706545, -0.6816283, -0.7017325, -0.7042129, -0.701369, -0.6918656, -0.665792, -0.5960342, -0.4164121;\n  VERIFY_IS_APPROX(x, x_ref);\n}\n\nvoid testHybrd()\n{\n  const int n=9;\n  int info;\n  VectorXd x;\n\n  /* the following starting values provide a rough fit. */\n  x.setConstant(n, -1.);\n\n  // do the computation\n  hybrd_functor functor;\n  HybridNonLinearSolver<hybrd_functor> solver(functor);\n  solver.parameters.nb_of_subdiagonals = 1;\n  solver.parameters.nb_of_superdiagonals = 1;\n  solver.diag.setConstant(n, 1.);\n  solver.useExternalScaling = true;\n  info = solver.solveNumericalDiff(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(solver.nfev, 14);\n\n  // check norm\n  VERIFY_IS_APPROX(solver.fvec.blueNorm(), 1.192636e-08);\n\n  // check x\n  VectorXd x_ref(n);\n  x_ref <<\n      -0.5706545,    -0.6816283,    -0.7017325,\n      -0.7042129,     -0.701369,    -0.6918656,\n      -0.665792,    -0.5960342,    -0.4164121;\n  VERIFY_IS_APPROX(x, x_ref);\n}\n\nstruct lmstr_functor : Functor<double>\n{\n    lmstr_functor(void) : Functor<double>(3,15) {}\n    int operator()(const VectorXd &x, VectorXd &fvec)\n    {\n        /*  subroutine fcn for lmstr1 example. */\n        double tmp1, tmp2, tmp3;\n        static const double y[15]={1.4e-1, 1.8e-1, 2.2e-1, 2.5e-1, 2.9e-1, 3.2e-1, 3.5e-1,\n            3.9e-1, 3.7e-1, 5.8e-1, 7.3e-1, 9.6e-1, 1.34, 2.1, 4.39};\n\n        assert(15==fvec.size());\n        assert(3==x.size());\n\n        for (int i=0; i<15; i++)\n        {\n            tmp1 = i+1;\n            tmp2 = 16 - i - 1;\n            tmp3 = (i>=8)? tmp2 : tmp1;\n            fvec[i] = y[i] - (x[0] + tmp1/(x[1]*tmp2 + x[2]*tmp3));\n        }\n        return 0;\n    }\n    int df(const VectorXd &x, VectorXd &jac_row, VectorXd::Index rownb)\n    {\n        assert(x.size()==3);\n        assert(jac_row.size()==x.size());\n        double tmp1, tmp2, tmp3, tmp4;\n\n        int i = rownb-2;\n        tmp1 = i+1;\n        tmp2 = 16 - i - 1;\n        tmp3 = (i>=8)? tmp2 : tmp1;\n        tmp4 = (x[1]*tmp2 + x[2]*tmp3); tmp4 = tmp4*tmp4;\n        jac_row[0] = -1;\n        jac_row[1] = tmp1*tmp2/tmp4;\n        jac_row[2] = tmp1*tmp3/tmp4;\n        return 0;\n    }\n};\n\nvoid testLmstr1()\n{\n  const int n=3;\n  int info;\n\n  VectorXd x(n);\n\n  /* the following starting values provide a rough fit. */\n  x.setConstant(n, 1.);\n\n  // do the computation\n  lmstr_functor functor;\n  LevenbergMarquardt<lmstr_functor> lm(functor);\n  info = lm.lmstr1(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev, 6);\n  VERIFY_IS_EQUAL(lm.njev, 5);\n\n  // check norm\n  VERIFY_IS_APPROX(lm.fvec.blueNorm(), 0.09063596);\n\n  // check x\n  VectorXd x_ref(n);\n  x_ref << 0.08241058, 1.133037, 2.343695 ;\n  VERIFY_IS_APPROX(x, x_ref);\n}\n\nvoid testLmstr()\n{\n  const int n=3;\n  int info;\n  double fnorm;\n  VectorXd x(n);\n\n  /* the following starting values provide a rough fit. */\n  x.setConstant(n, 1.);\n\n  // do the computation\n  lmstr_functor functor;\n  LevenbergMarquardt<lmstr_functor> lm(functor);\n  info = lm.minimizeOptimumStorage(x);\n\n  // check return values\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev, 6);\n  VERIFY_IS_EQUAL(lm.njev, 5);\n\n  // check norm\n  fnorm = lm.fvec.blueNorm();\n  VERIFY_IS_APPROX(fnorm, 0.09063596);\n\n  // check x\n  VectorXd x_ref(n);\n  x_ref << 0.08241058, 1.133037, 2.343695;\n  VERIFY_IS_APPROX(x, x_ref);\n\n}\n\nstruct lmdif_functor : Functor<double>\n{\n    lmdif_functor(void) : Functor<double>(3,15) {}\n    int operator()(const VectorXd &x, VectorXd &fvec) const\n    {\n        int i;\n        double tmp1,tmp2,tmp3;\n        static const double y[15]={1.4e-1,1.8e-1,2.2e-1,2.5e-1,2.9e-1,3.2e-1,3.5e-1,3.9e-1,\n            3.7e-1,5.8e-1,7.3e-1,9.6e-1,1.34e0,2.1e0,4.39e0};\n\n        assert(x.size()==3);\n        assert(fvec.size()==15);\n        for (i=0; i<15; i++)\n        {\n            tmp1 = i+1;\n            tmp2 = 15 - i;\n            tmp3 = tmp1;\n\n            if (i >= 8) tmp3 = tmp2;\n            fvec[i] = y[i] - (x[0] + tmp1/(x[1]*tmp2 + x[2]*tmp3));\n        }\n        return 0;\n    }\n};\n\nvoid testLmdif1()\n{\n  const int n=3;\n  int info;\n\n  VectorXd x(n), fvec(15);\n\n  /* the following starting values provide a rough fit. */\n  x.setConstant(n, 1.);\n\n  // do the computation\n  lmdif_functor functor;\n  DenseIndex nfev;\n  info = LevenbergMarquardt<lmdif_functor>::lmdif1(functor, x, &nfev);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(nfev, 26);\n\n  // check norm\n  functor(x, fvec);\n  VERIFY_IS_APPROX(fvec.blueNorm(), 0.09063596);\n\n  // check x\n  VectorXd x_ref(n);\n  x_ref << 0.0824106, 1.1330366, 2.3436947;\n  VERIFY_IS_APPROX(x, x_ref);\n\n}\n\nvoid testLmdif()\n{\n  const int m=15, n=3;\n  int info;\n  double fnorm, covfac;\n  VectorXd x(n);\n\n  /* the following starting values provide a rough fit. */\n  x.setConstant(n, 1.);\n\n  // do the computation\n  lmdif_functor functor;\n  NumericalDiff<lmdif_functor> numDiff(functor);\n  LevenbergMarquardt<NumericalDiff<lmdif_functor> > lm(numDiff);\n  info = lm.minimize(x);\n\n  // check return values\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev, 26);\n\n  // check norm\n  fnorm = lm.fvec.blueNorm();\n  VERIFY_IS_APPROX(fnorm, 0.09063596);\n\n  // check x\n  VectorXd x_ref(n);\n  x_ref << 0.08241058, 1.133037, 2.343695;\n  VERIFY_IS_APPROX(x, x_ref);\n\n  // check covariance\n  covfac = fnorm*fnorm/(m-n);\n  internal::covar(lm.fjac, lm.permutation.indices()); // TODO : move this as a function of lm\n\n  MatrixXd cov_ref(n,n);\n  cov_ref <<\n      0.0001531202,   0.002869942,  -0.002656662,\n      0.002869942,    0.09480937,   -0.09098997,\n      -0.002656662,   -0.09098997,    0.08778729;\n\n//  std::cout << fjac*covfac << std::endl;\n\n  MatrixXd cov;\n  cov =  covfac*lm.fjac.topLeftCorner<n,n>();\n  VERIFY_IS_APPROX( cov, cov_ref);\n  // TODO: why isn't this allowed ? :\n  // VERIFY_IS_APPROX( covfac*fjac.topLeftCorner<n,n>() , cov_ref);\n}\n\nstruct chwirut2_functor : Functor<double>\n{\n    chwirut2_functor(void) : Functor<double>(3,54) {}\n    static const double m_x[54];\n    static const double m_y[54];\n    int operator()(const VectorXd &b, VectorXd &fvec)\n    {\n        int i;\n\n        assert(b.size()==3);\n        assert(fvec.size()==54);\n        for(i=0; i<54; i++) {\n            double x = m_x[i];\n            fvec[i] = exp(-b[0]*x)/(b[1]+b[2]*x) - m_y[i];\n        }\n        return 0;\n    }\n    int df(const VectorXd &b, MatrixXd &fjac)\n    {\n        assert(b.size()==3);\n        assert(fjac.rows()==54);\n        assert(fjac.cols()==3);\n        for(int i=0; i<54; i++) {\n            double x = m_x[i];\n            double factor = 1./(b[1]+b[2]*x);\n            double e = exp(-b[0]*x);\n            fjac(i,0) = -x*e*factor;\n            fjac(i,1) = -e*factor*factor;\n            fjac(i,2) = -x*e*factor*factor;\n        }\n        return 0;\n    }\n};\nconst double chwirut2_functor::m_x[54] = { 0.500E0, 1.000E0, 1.750E0, 3.750E0, 5.750E0, 0.875E0, 2.250E0, 3.250E0, 5.250E0, 0.750E0, 1.750E0, 2.750E0, 4.750E0, 0.625E0, 1.250E0, 2.250E0, 4.250E0, .500E0, 3.000E0, .750E0, 3.000E0, 1.500E0, 6.000E0, 3.000E0, 6.000E0, 1.500E0, 3.000E0, .500E0, 2.000E0, 4.000E0, .750E0, 2.000E0, 5.000E0, .750E0, 2.250E0, 3.750E0, 5.750E0, 3.000E0, .750E0, 2.500E0, 4.000E0, .750E0, 2.500E0, 4.000E0, .750E0, 2.500E0, 4.000E0, .500E0, 6.000E0, 3.000E0, .500E0, 2.750E0, .500E0, 1.750E0};\nconst double chwirut2_functor::m_y[54] = { 92.9000E0 ,57.1000E0 ,31.0500E0 ,11.5875E0 ,8.0250E0 ,63.6000E0 ,21.4000E0 ,14.2500E0 ,8.4750E0 ,63.8000E0 ,26.8000E0 ,16.4625E0 ,7.1250E0 ,67.3000E0 ,41.0000E0 ,21.1500E0 ,8.1750E0 ,81.5000E0 ,13.1200E0 ,59.9000E0 ,14.6200E0 ,32.9000E0 ,5.4400E0 ,12.5600E0 ,5.4400E0 ,32.0000E0 ,13.9500E0 ,75.8000E0 ,20.0000E0 ,10.4200E0 ,59.5000E0 ,21.6700E0 ,8.5500E0 ,62.0000E0 ,20.2000E0 ,7.7600E0 ,3.7500E0 ,11.8100E0 ,54.7000E0 ,23.7000E0 ,11.5500E0 ,61.3000E0 ,17.7000E0 ,8.7400E0 ,59.2000E0 ,16.3000E0 ,8.6200E0 ,81.0000E0 ,4.8700E0 ,14.6200E0 ,81.7000E0 ,17.1700E0 ,81.3000E0 ,28.9000E0  };\n\n// http://www.itl.nist.gov/div898/strd/nls/data/chwirut2.shtml\nvoid testNistChwirut2(void)\n{\n  const int n=3;\n  int info;\n\n  VectorXd x(n);\n\n  /*\n   * First try\n   */\n  x<< 0.1, 0.01, 0.02;\n  // do the computation\n  chwirut2_functor functor;\n  LevenbergMarquardt<chwirut2_functor> lm(functor);\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev, 10);\n  VERIFY_IS_EQUAL(lm.njev, 8);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.1304802941E+02);\n  // check x\n  VERIFY_IS_APPROX(x[0], 1.6657666537E-01);\n  VERIFY_IS_APPROX(x[1], 5.1653291286E-03);\n  VERIFY_IS_APPROX(x[2], 1.2150007096E-02);\n\n  /*\n   * Second try\n   */\n  x<< 0.15, 0.008, 0.010;\n  // do the computation\n  lm.resetParameters();\n  lm.parameters.ftol = 1.E6*NumTraits<double>::epsilon();\n  lm.parameters.xtol = 1.E6*NumTraits<double>::epsilon();\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev, 7);\n  VERIFY_IS_EQUAL(lm.njev, 6);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.1304802941E+02);\n  // check x\n  VERIFY_IS_APPROX(x[0], 1.6657666537E-01);\n  VERIFY_IS_APPROX(x[1], 5.1653291286E-03);\n  VERIFY_IS_APPROX(x[2], 1.2150007096E-02);\n}\n\n\nstruct misra1a_functor : Functor<double>\n{\n    misra1a_functor(void) : Functor<double>(2,14) {}\n    static const double m_x[14];\n    static const double m_y[14];\n    int operator()(const VectorXd &b, VectorXd &fvec)\n    {\n        assert(b.size()==2);\n        assert(fvec.size()==14);\n        for(int i=0; i<14; i++) {\n            fvec[i] = b[0]*(1.-exp(-b[1]*m_x[i])) - m_y[i] ;\n        }\n        return 0;\n    }\n    int df(const VectorXd &b, MatrixXd &fjac)\n    {\n        assert(b.size()==2);\n        assert(fjac.rows()==14);\n        assert(fjac.cols()==2);\n        for(int i=0; i<14; i++) {\n            fjac(i,0) = (1.-exp(-b[1]*m_x[i]));\n            fjac(i,1) = (b[0]*m_x[i]*exp(-b[1]*m_x[i]));\n        }\n        return 0;\n    }\n};\nconst double misra1a_functor::m_x[14] = { 77.6E0, 114.9E0, 141.1E0, 190.8E0, 239.9E0, 289.0E0, 332.8E0, 378.4E0, 434.8E0, 477.3E0, 536.8E0, 593.1E0, 689.1E0, 760.0E0};\nconst double misra1a_functor::m_y[14] = { 10.07E0, 14.73E0, 17.94E0, 23.93E0, 29.61E0, 35.18E0, 40.02E0, 44.82E0, 50.76E0, 55.05E0, 61.01E0, 66.40E0, 75.47E0, 81.78E0};\n\n// http://www.itl.nist.gov/div898/strd/nls/data/misra1a.shtml\nvoid testNistMisra1a(void)\n{\n  const int n=2;\n  int info;\n\n  VectorXd x(n);\n\n  /*\n   * First try\n   */\n  x<< 500., 0.0001;\n  // do the computation\n  misra1a_functor functor;\n  LevenbergMarquardt<misra1a_functor> lm(functor);\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev, 19);\n  VERIFY_IS_EQUAL(lm.njev, 15);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.2455138894E-01);\n  // check x\n  VERIFY_IS_APPROX(x[0], 2.3894212918E+02);\n  VERIFY_IS_APPROX(x[1], 5.5015643181E-04);\n\n  /*\n   * Second try\n   */\n  x<< 250., 0.0005;\n  // do the computation\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev, 5);\n  VERIFY_IS_EQUAL(lm.njev, 4);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.2455138894E-01);\n  // check x\n  VERIFY_IS_APPROX(x[0], 2.3894212918E+02);\n  VERIFY_IS_APPROX(x[1], 5.5015643181E-04);\n}\n\nstruct hahn1_functor : Functor<double>\n{\n    hahn1_functor(void) : Functor<double>(7,236) {}\n    static const double m_x[236];\n    int operator()(const VectorXd &b, VectorXd &fvec)\n    {\n        static const double m_y[236] = { .591E0 , 1.547E0 , 2.902E0 , 2.894E0 , 4.703E0 , 6.307E0 , 7.03E0  , 7.898E0 , 9.470E0 , 9.484E0 , 10.072E0 , 10.163E0 , 11.615E0 , 12.005E0 , 12.478E0 , 12.982E0 , 12.970E0 , 13.926E0 , 14.452E0 , 14.404E0 , 15.190E0 , 15.550E0 , 15.528E0 , 15.499E0 , 16.131E0 , 16.438E0 , 16.387E0 , 16.549E0 , 16.872E0 , 16.830E0 , 16.926E0 , 16.907E0 , 16.966E0 , 17.060E0 , 17.122E0 , 17.311E0 , 17.355E0 , 17.668E0 , 17.767E0 , 17.803E0 , 17.765E0 , 17.768E0 , 17.736E0 , 17.858E0 , 17.877E0 , 17.912E0 , 18.046E0 , 18.085E0 , 18.291E0 , 18.357E0 , 18.426E0 , 18.584E0 , 18.610E0 , 18.870E0 , 18.795E0 , 19.111E0 , .367E0 , .796E0 , 0.892E0 , 1.903E0 , 2.150E0 , 3.697E0 , 5.870E0 , 6.421E0 , 7.422E0 , 9.944E0 , 11.023E0 , 11.87E0  , 12.786E0 , 14.067E0 , 13.974E0 , 14.462E0 , 14.464E0 , 15.381E0 , 15.483E0 , 15.59E0  , 16.075E0 , 16.347E0 , 16.181E0 , 16.915E0 , 17.003E0 , 16.978E0 , 17.756E0 , 17.808E0 , 17.868E0 , 18.481E0 , 18.486E0 , 19.090E0 , 16.062E0 , 16.337E0 , 16.345E0 ,\n        16.388E0 , 17.159E0 , 17.116E0 , 17.164E0 , 17.123E0 , 17.979E0 , 17.974E0 , 18.007E0 , 17.993E0 , 18.523E0 , 18.669E0 , 18.617E0 , 19.371E0 , 19.330E0 , 0.080E0 , 0.248E0 , 1.089E0 , 1.418E0 , 2.278E0 , 3.624E0 , 4.574E0 , 5.556E0 , 7.267E0 , 7.695E0 , 9.136E0 , 9.959E0 , 9.957E0 , 11.600E0 , 13.138E0 , 13.564E0 , 13.871E0 , 13.994E0 , 14.947E0 , 15.473E0 , 15.379E0 , 15.455E0 , 15.908E0 , 16.114E0 , 17.071E0 , 17.135E0 , 17.282E0 , 17.368E0 , 17.483E0 , 17.764E0 , 18.185E0 , 18.271E0 , 18.236E0 , 18.237E0 , 18.523E0 , 18.627E0 , 18.665E0 , 19.086E0 , 0.214E0 , 0.943E0 , 1.429E0 , 2.241E0 , 2.951E0 , 3.782E0 , 4.757E0 , 5.602E0 , 7.169E0 , 8.920E0 , 10.055E0 , 12.035E0 , 12.861E0 , 13.436E0 , 14.167E0 , 14.755E0 , 15.168E0 , 15.651E0 , 15.746E0 , 16.216E0 , 16.445E0 , 16.965E0 , 17.121E0 , 17.206E0 , 17.250E0 , 17.339E0 , 17.793E0 , 18.123E0 , 18.49E0  , 18.566E0 , 18.645E0 , 18.706E0 , 18.924E0 , 19.1E0   , 0.375E0 , 0.471E0 , 1.504E0 , 2.204E0 , 2.813E0 , 4.765E0 , 9.835E0 , 10.040E0 , 11.946E0 , 12.596E0 , \n13.303E0 , 13.922E0 , 14.440E0 , 14.951E0 , 15.627E0 , 15.639E0 , 15.814E0 , 16.315E0 , 16.334E0 , 16.430E0 , 16.423E0 , 17.024E0 , 17.009E0 , 17.165E0 , 17.134E0 , 17.349E0 , 17.576E0 , 17.848E0 , 18.090E0 , 18.276E0 , 18.404E0 , 18.519E0 , 19.133E0 , 19.074E0 , 19.239E0 , 19.280E0 , 19.101E0 , 19.398E0 , 19.252E0 , 19.89E0  , 20.007E0 , 19.929E0 , 19.268E0 , 19.324E0 , 20.049E0 , 20.107E0 , 20.062E0 , 20.065E0 , 19.286E0 , 19.972E0 , 20.088E0 , 20.743E0 , 20.83E0  , 20.935E0 , 21.035E0 , 20.93E0  , 21.074E0 , 21.085E0 , 20.935E0 };\n\n        //        int called=0; printf(\"call hahn1_functor with  iflag=%d, called=%d\\n\", iflag, called); if (iflag==1) called++;\n\n        assert(b.size()==7);\n        assert(fvec.size()==236);\n        for(int i=0; i<236; i++) {\n            double x=m_x[i], xx=x*x, xxx=xx*x;\n            fvec[i] = (b[0]+b[1]*x+b[2]*xx+b[3]*xxx) / (1.+b[4]*x+b[5]*xx+b[6]*xxx) - m_y[i];\n        }\n        return 0;\n    }\n\n    int df(const VectorXd &b, MatrixXd &fjac)\n    {\n        assert(b.size()==7);\n        assert(fjac.rows()==236);\n        assert(fjac.cols()==7);\n        for(int i=0; i<236; i++) {\n            double x=m_x[i], xx=x*x, xxx=xx*x;\n            double fact = 1./(1.+b[4]*x+b[5]*xx+b[6]*xxx);\n            fjac(i,0) = 1.*fact;\n            fjac(i,1) = x*fact;\n            fjac(i,2) = xx*fact;\n            fjac(i,3) = xxx*fact;\n            fact = - (b[0]+b[1]*x+b[2]*xx+b[3]*xxx) * fact * fact;\n            fjac(i,4) = x*fact;\n            fjac(i,5) = xx*fact;\n            fjac(i,6) = xxx*fact;\n        }\n        return 0;\n    }\n};\nconst double hahn1_functor::m_x[236] = { 24.41E0 , 34.82E0 , 44.09E0 , 45.07E0 , 54.98E0 , 65.51E0 , 70.53E0 , 75.70E0 , 89.57E0 , 91.14E0 , 96.40E0 , 97.19E0 , 114.26E0 , 120.25E0 , 127.08E0 , 133.55E0 , 133.61E0 , 158.67E0 , 172.74E0 , 171.31E0 , 202.14E0 , 220.55E0 , 221.05E0 , 221.39E0 , 250.99E0 , 268.99E0 , 271.80E0 , 271.97E0 , 321.31E0 , 321.69E0 , 330.14E0 , 333.03E0 , 333.47E0 , 340.77E0 , 345.65E0 , 373.11E0 , 373.79E0 , 411.82E0 , 419.51E0 , 421.59E0 , 422.02E0 , 422.47E0 , 422.61E0 , 441.75E0 , 447.41E0 , 448.7E0  , 472.89E0 , 476.69E0 , 522.47E0 , 522.62E0 , 524.43E0 , 546.75E0 , 549.53E0 , 575.29E0 , 576.00E0 , 625.55E0 , 20.15E0 , 28.78E0 , 29.57E0 , 37.41E0 , 39.12E0 , 50.24E0 , 61.38E0 , 66.25E0 , 73.42E0 , 95.52E0 , 107.32E0 , 122.04E0 , 134.03E0 , 163.19E0 , 163.48E0 , 175.70E0 , 179.86E0 , 211.27E0 , 217.78E0 , 219.14E0 , 262.52E0 , 268.01E0 , 268.62E0 , 336.25E0 , 337.23E0 , 339.33E0 , 427.38E0 , 428.58E0 , 432.68E0 , 528.99E0 , 531.08E0 , 628.34E0 , 253.24E0 , 273.13E0 , 273.66E0 ,\n282.10E0 , 346.62E0 , 347.19E0 , 348.78E0 , 351.18E0 , 450.10E0 , 450.35E0 , 451.92E0 , 455.56E0 , 552.22E0 , 553.56E0 , 555.74E0 , 652.59E0 , 656.20E0 , 14.13E0 , 20.41E0 , 31.30E0 , 33.84E0 , 39.70E0 , 48.83E0 , 54.50E0 , 60.41E0 , 72.77E0 , 75.25E0 , 86.84E0 , 94.88E0 , 96.40E0 , 117.37E0 , 139.08E0 , 147.73E0 , 158.63E0 , 161.84E0 , 192.11E0 , 206.76E0 , 209.07E0 , 213.32E0 , 226.44E0 , 237.12E0 , 330.90E0 , 358.72E0 , 370.77E0 , 372.72E0 , 396.24E0 , 416.59E0 , 484.02E0 , 495.47E0 , 514.78E0 , 515.65E0 , 519.47E0 , 544.47E0 , 560.11E0 , 620.77E0 , 18.97E0 , 28.93E0 , 33.91E0 , 40.03E0 , 44.66E0 , 49.87E0 , 55.16E0 , 60.90E0 , 72.08E0 , 85.15E0 , 97.06E0 , 119.63E0 , 133.27E0 , 143.84E0 , 161.91E0 , 180.67E0 , 198.44E0 , 226.86E0 , 229.65E0 , 258.27E0 , 273.77E0 , 339.15E0 , 350.13E0 , 362.75E0 , 371.03E0 , 393.32E0 , 448.53E0 , 473.78E0 , 511.12E0 , 524.70E0 , 548.75E0 , 551.64E0 , 574.02E0 , 623.86E0 , 21.46E0 , 24.33E0 , 33.43E0 , 39.22E0 , 44.18E0 , 55.02E0 , 94.33E0 , 96.44E0 , 118.82E0 , 128.48E0 ,\n141.94E0 , 156.92E0 , 171.65E0 , 190.00E0 , 223.26E0 , 223.88E0 , 231.50E0 , 265.05E0 , 269.44E0 , 271.78E0 , 273.46E0 , 334.61E0 , 339.79E0 , 349.52E0 , 358.18E0 , 377.98E0 , 394.77E0 , 429.66E0 , 468.22E0 , 487.27E0 , 519.54E0 , 523.03E0 , 612.99E0 , 638.59E0 , 641.36E0 , 622.05E0 , 631.50E0 , 663.97E0 , 646.9E0  , 748.29E0 , 749.21E0 , 750.14E0 , 647.04E0 , 646.89E0 , 746.9E0  , 748.43E0 , 747.35E0 , 749.27E0 , 647.61E0 , 747.78E0 , 750.51E0 , 851.37E0 , 845.97E0 , 847.54E0 , 849.93E0 , 851.61E0 , 849.75E0 , 850.98E0 , 848.23E0};\n\n// http://www.itl.nist.gov/div898/strd/nls/data/hahn1.shtml\nvoid testNistHahn1(void)\n{\n  const int  n=7;\n  int info;\n\n  VectorXd x(n);\n\n  /*\n   * First try\n   */\n  x<< 10., -1., .05, -.00001, -.05, .001, -.000001;\n  // do the computation\n  hahn1_functor functor;\n  LevenbergMarquardt<hahn1_functor> lm(functor);\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev, 11);\n  VERIFY_IS_EQUAL(lm.njev, 10);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.5324382854E+00);\n  // check x\n  VERIFY_IS_APPROX(x[0], 1.0776351733E+00);\n  VERIFY_IS_APPROX(x[1],-1.2269296921E-01);\n  VERIFY_IS_APPROX(x[2], 4.0863750610E-03);\n  VERIFY_IS_APPROX(x[3],-1.426264e-06); // shoulde be : -1.4262662514E-06\n  VERIFY_IS_APPROX(x[4],-5.7609940901E-03);\n  VERIFY_IS_APPROX(x[5], 2.4053735503E-04);\n  VERIFY_IS_APPROX(x[6],-1.2314450199E-07);\n\n  /*\n   * Second try\n   */\n  x<< .1, -.1, .005, -.000001, -.005, .0001, -.0000001;\n  // do the computation\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev, 11);\n  VERIFY_IS_EQUAL(lm.njev, 10);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.5324382854E+00);\n  // check x\n  VERIFY_IS_APPROX(x[0], 1.077640); // should be :  1.0776351733E+00\n  VERIFY_IS_APPROX(x[1], -0.1226933); // should be : -1.2269296921E-01\n  VERIFY_IS_APPROX(x[2], 0.004086383); // should be : 4.0863750610E-03\n  VERIFY_IS_APPROX(x[3], -1.426277e-06); // shoulde be : -1.4262662514E-06\n  VERIFY_IS_APPROX(x[4],-5.7609940901E-03);\n  VERIFY_IS_APPROX(x[5], 0.00024053772); // should be : 2.4053735503E-04\n  VERIFY_IS_APPROX(x[6], -1.231450e-07); // should be : -1.2314450199E-07\n\n}\n\nstruct misra1d_functor : Functor<double>\n{\n    misra1d_functor(void) : Functor<double>(2,14) {}\n    static const double x[14];\n    static const double y[14];\n    int operator()(const VectorXd &b, VectorXd &fvec)\n    {\n        assert(b.size()==2);\n        assert(fvec.size()==14);\n        for(int i=0; i<14; i++) {\n            fvec[i] = b[0]*b[1]*x[i]/(1.+b[1]*x[i]) - y[i];\n        }\n        return 0;\n    }\n    int df(const VectorXd &b, MatrixXd &fjac)\n    {\n        assert(b.size()==2);\n        assert(fjac.rows()==14);\n        assert(fjac.cols()==2);\n        for(int i=0; i<14; i++) {\n            double den = 1.+b[1]*x[i];\n            fjac(i,0) = b[1]*x[i] / den;\n            fjac(i,1) = b[0]*x[i]*(den-b[1]*x[i])/den/den;\n        }\n        return 0;\n    }\n};\nconst double misra1d_functor::x[14] = { 77.6E0, 114.9E0, 141.1E0, 190.8E0, 239.9E0, 289.0E0, 332.8E0, 378.4E0, 434.8E0, 477.3E0, 536.8E0, 593.1E0, 689.1E0, 760.0E0};\nconst double misra1d_functor::y[14] = { 10.07E0, 14.73E0, 17.94E0, 23.93E0, 29.61E0, 35.18E0, 40.02E0, 44.82E0, 50.76E0, 55.05E0, 61.01E0, 66.40E0, 75.47E0, 81.78E0};\n\n// http://www.itl.nist.gov/div898/strd/nls/data/misra1d.shtml\nvoid testNistMisra1d(void)\n{\n  const int n=2;\n  int info;\n\n  VectorXd x(n);\n\n  /*\n   * First try\n   */\n  x<< 500., 0.0001;\n  // do the computation\n  misra1d_functor functor;\n  LevenbergMarquardt<misra1d_functor> lm(functor);\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 3);\n  VERIFY_IS_EQUAL(lm.nfev, 9);\n  VERIFY_IS_EQUAL(lm.njev, 7);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.6419295283E-02);\n  // check x\n  VERIFY_IS_APPROX(x[0], 4.3736970754E+02);\n  VERIFY_IS_APPROX(x[1], 3.0227324449E-04);\n\n  /*\n   * Second try\n   */\n  x<< 450., 0.0003;\n  // do the computation\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev, 4);\n  VERIFY_IS_EQUAL(lm.njev, 3);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.6419295283E-02);\n  // check x\n  VERIFY_IS_APPROX(x[0], 4.3736970754E+02);\n  VERIFY_IS_APPROX(x[1], 3.0227324449E-04);\n}\n\n\nstruct lanczos1_functor : Functor<double>\n{\n    lanczos1_functor(void) : Functor<double>(6,24) {}\n    static const double x[24];\n    static const double y[24];\n    int operator()(const VectorXd &b, VectorXd &fvec)\n    {\n        assert(b.size()==6);\n        assert(fvec.size()==24);\n        for(int i=0; i<24; i++)\n            fvec[i] = b[0]*exp(-b[1]*x[i]) + b[2]*exp(-b[3]*x[i]) + b[4]*exp(-b[5]*x[i])  - y[i];\n        return 0;\n    }\n    int df(const VectorXd &b, MatrixXd &fjac)\n    {\n        assert(b.size()==6);\n        assert(fjac.rows()==24);\n        assert(fjac.cols()==6);\n        for(int i=0; i<24; i++) {\n            fjac(i,0) = exp(-b[1]*x[i]);\n            fjac(i,1) = -b[0]*x[i]*exp(-b[1]*x[i]);\n            fjac(i,2) = exp(-b[3]*x[i]);\n            fjac(i,3) = -b[2]*x[i]*exp(-b[3]*x[i]);\n            fjac(i,4) = exp(-b[5]*x[i]);\n            fjac(i,5) = -b[4]*x[i]*exp(-b[5]*x[i]);\n        }\n        return 0;\n    }\n};\nconst double lanczos1_functor::x[24] = { 0.000000000000E+00, 5.000000000000E-02, 1.000000000000E-01, 1.500000000000E-01, 2.000000000000E-01, 2.500000000000E-01, 3.000000000000E-01, 3.500000000000E-01, 4.000000000000E-01, 4.500000000000E-01, 5.000000000000E-01, 5.500000000000E-01, 6.000000000000E-01, 6.500000000000E-01, 7.000000000000E-01, 7.500000000000E-01, 8.000000000000E-01, 8.500000000000E-01, 9.000000000000E-01, 9.500000000000E-01, 1.000000000000E+00, 1.050000000000E+00, 1.100000000000E+00, 1.150000000000E+00 };\nconst double lanczos1_functor::y[24] = { 2.513400000000E+00 ,2.044333373291E+00 ,1.668404436564E+00 ,1.366418021208E+00 ,1.123232487372E+00 ,9.268897180037E-01 ,7.679338563728E-01 ,6.388775523106E-01 ,5.337835317402E-01 ,4.479363617347E-01 ,3.775847884350E-01 ,3.197393199326E-01 ,2.720130773746E-01 ,2.324965529032E-01 ,1.996589546065E-01 ,1.722704126914E-01 ,1.493405660168E-01 ,1.300700206922E-01 ,1.138119324644E-01 ,1.000415587559E-01 ,8.833209084540E-02 ,7.833544019350E-02 ,6.976693743449E-02 ,6.239312536719E-02 };\n\n// http://www.itl.nist.gov/div898/strd/nls/data/lanczos1.shtml\nvoid testNistLanczos1(void)\n{\n  const int n=6;\n  int info;\n\n  VectorXd x(n);\n\n  /*\n   * First try\n   */\n  x<< 1.2, 0.3, 5.6, 5.5, 6.5, 7.6;\n  // do the computation\n  lanczos1_functor functor;\n  LevenbergMarquardt<lanczos1_functor> lm(functor);\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 2);\n  VERIFY_IS_EQUAL(lm.nfev, 79);\n  VERIFY_IS_EQUAL(lm.njev, 72);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.430899764097e-25);  // should be 1.4307867721E-25, but nist results are on 128-bit floats\n  // check x\n  VERIFY_IS_APPROX(x[0], 9.5100000027E-02);\n  VERIFY_IS_APPROX(x[1], 1.0000000001E+00);\n  VERIFY_IS_APPROX(x[2], 8.6070000013E-01);\n  VERIFY_IS_APPROX(x[3], 3.0000000002E+00);\n  VERIFY_IS_APPROX(x[4], 1.5575999998E+00);\n  VERIFY_IS_APPROX(x[5], 5.0000000001E+00);\n\n  /*\n   * Second try\n   */\n  x<< 0.5, 0.7, 3.6, 4.2, 4., 6.3;\n  // do the computation\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 2);\n  VERIFY_IS_EQUAL(lm.nfev, 9);\n  VERIFY_IS_EQUAL(lm.njev, 8);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.428595533845e-25);  // should be 1.4307867721E-25, but nist results are on 128-bit floats\n  // check x\n  VERIFY_IS_APPROX(x[0], 9.5100000027E-02);\n  VERIFY_IS_APPROX(x[1], 1.0000000001E+00);\n  VERIFY_IS_APPROX(x[2], 8.6070000013E-01);\n  VERIFY_IS_APPROX(x[3], 3.0000000002E+00);\n  VERIFY_IS_APPROX(x[4], 1.5575999998E+00);\n  VERIFY_IS_APPROX(x[5], 5.0000000001E+00);\n\n}\n\nstruct rat42_functor : Functor<double>\n{\n    rat42_functor(void) : Functor<double>(3,9) {}\n    static const double x[9];\n    static const double y[9];\n    int operator()(const VectorXd &b, VectorXd &fvec)\n    {\n        assert(b.size()==3);\n        assert(fvec.size()==9);\n        for(int i=0; i<9; i++) {\n            fvec[i] = b[0] / (1.+exp(b[1]-b[2]*x[i])) - y[i];\n        }\n        return 0;\n    }\n\n    int df(const VectorXd &b, MatrixXd &fjac)\n    {\n        assert(b.size()==3);\n        assert(fjac.rows()==9);\n        assert(fjac.cols()==3);\n        for(int i=0; i<9; i++) {\n            double e = exp(b[1]-b[2]*x[i]);\n            fjac(i,0) = 1./(1.+e);\n            fjac(i,1) = -b[0]*e/(1.+e)/(1.+e);\n            fjac(i,2) = +b[0]*e*x[i]/(1.+e)/(1.+e);\n        }\n        return 0;\n    }\n};\nconst double rat42_functor::x[9] = { 9.000E0, 14.000E0, 21.000E0, 28.000E0, 42.000E0, 57.000E0, 63.000E0, 70.000E0, 79.000E0 };\nconst double rat42_functor::y[9] = { 8.930E0 ,10.800E0 ,18.590E0 ,22.330E0 ,39.350E0 ,56.110E0 ,61.730E0 ,64.620E0 ,67.080E0 };\n\n// http://www.itl.nist.gov/div898/strd/nls/data/ratkowsky2.shtml\nvoid testNistRat42(void)\n{\n  const int n=3;\n  int info;\n\n  VectorXd x(n);\n\n  /*\n   * First try\n   */\n  x<< 100., 1., 0.1;\n  // do the computation\n  rat42_functor functor;\n  LevenbergMarquardt<rat42_functor> lm(functor);\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev, 10);\n  VERIFY_IS_EQUAL(lm.njev, 8);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 8.0565229338E+00);\n  // check x\n  VERIFY_IS_APPROX(x[0], 7.2462237576E+01);\n  VERIFY_IS_APPROX(x[1], 2.6180768402E+00);\n  VERIFY_IS_APPROX(x[2], 6.7359200066E-02);\n\n  /*\n   * Second try\n   */\n  x<< 75., 2.5, 0.07;\n  // do the computation\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev, 6);\n  VERIFY_IS_EQUAL(lm.njev, 5);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 8.0565229338E+00);\n  // check x\n  VERIFY_IS_APPROX(x[0], 7.2462237576E+01);\n  VERIFY_IS_APPROX(x[1], 2.6180768402E+00);\n  VERIFY_IS_APPROX(x[2], 6.7359200066E-02);\n}\n\nstruct MGH10_functor : Functor<double>\n{\n    MGH10_functor(void) : Functor<double>(3,16) {}\n    static const double x[16];\n    static const double y[16];\n    int operator()(const VectorXd &b, VectorXd &fvec)\n    {\n        assert(b.size()==3);\n        assert(fvec.size()==16);\n        for(int i=0; i<16; i++)\n            fvec[i] =  b[0] * exp(b[1]/(x[i]+b[2])) - y[i];\n        return 0;\n    }\n    int df(const VectorXd &b, MatrixXd &fjac)\n    {\n        assert(b.size()==3);\n        assert(fjac.rows()==16);\n        assert(fjac.cols()==3);\n        for(int i=0; i<16; i++) {\n            double factor = 1./(x[i]+b[2]);\n            double e = exp(b[1]*factor);\n            fjac(i,0) = e;\n            fjac(i,1) = b[0]*factor*e;\n            fjac(i,2) = -b[1]*b[0]*factor*factor*e;\n        }\n        return 0;\n    }\n};\nconst double MGH10_functor::x[16] = { 5.000000E+01, 5.500000E+01, 6.000000E+01, 6.500000E+01, 7.000000E+01, 7.500000E+01, 8.000000E+01, 8.500000E+01, 9.000000E+01, 9.500000E+01, 1.000000E+02, 1.050000E+02, 1.100000E+02, 1.150000E+02, 1.200000E+02, 1.250000E+02 };\nconst double MGH10_functor::y[16] = { 3.478000E+04, 2.861000E+04, 2.365000E+04, 1.963000E+04, 1.637000E+04, 1.372000E+04, 1.154000E+04, 9.744000E+03, 8.261000E+03, 7.030000E+03, 6.005000E+03, 5.147000E+03, 4.427000E+03, 3.820000E+03, 3.307000E+03, 2.872000E+03 };\n\n// http://www.itl.nist.gov/div898/strd/nls/data/mgh10.shtml\nvoid testNistMGH10(void)\n{\n  const int n=3;\n  int info;\n\n  VectorXd x(n);\n\n  /*\n   * First try\n   */\n  x<< 2., 400000., 25000.;\n  // do the computation\n  MGH10_functor functor;\n  LevenbergMarquardt<MGH10_functor> lm(functor);\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 2); \n  VERIFY_IS_EQUAL(lm.nfev, 284 ); \n  VERIFY_IS_EQUAL(lm.njev, 249 ); \n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 8.7945855171E+01);\n  // check x\n  VERIFY_IS_APPROX(x[0], 5.6096364710E-03);\n  VERIFY_IS_APPROX(x[1], 6.1813463463E+03);\n  VERIFY_IS_APPROX(x[2], 3.4522363462E+02);\n\n  /*\n   * Second try\n   */\n  x<< 0.02, 4000., 250.;\n  // do the computation\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 3);\n  VERIFY_IS_EQUAL(lm.nfev, 126);\n  VERIFY_IS_EQUAL(lm.njev, 116);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 8.7945855171E+01);\n  // check x\n  VERIFY_IS_APPROX(x[0], 5.6096364710E-03);\n  VERIFY_IS_APPROX(x[1], 6.1813463463E+03);\n  VERIFY_IS_APPROX(x[2], 3.4522363462E+02);\n}\n\n\nstruct BoxBOD_functor : Functor<double>\n{\n    BoxBOD_functor(void) : Functor<double>(2,6) {}\n    static const double x[6];\n    int operator()(const VectorXd &b, VectorXd &fvec)\n    {\n        static const double y[6] = { 109., 149., 149., 191., 213., 224. };\n        assert(b.size()==2);\n        assert(fvec.size()==6);\n        for(int i=0; i<6; i++)\n            fvec[i] =  b[0]*(1.-exp(-b[1]*x[i])) - y[i];\n        return 0;\n    }\n    int df(const VectorXd &b, MatrixXd &fjac)\n    {\n        assert(b.size()==2);\n        assert(fjac.rows()==6);\n        assert(fjac.cols()==2);\n        for(int i=0; i<6; i++) {\n            double e = exp(-b[1]*x[i]);\n            fjac(i,0) = 1.-e;\n            fjac(i,1) = b[0]*x[i]*e;\n        }\n        return 0;\n    }\n};\nconst double BoxBOD_functor::x[6] = { 1., 2., 3., 5., 7., 10. };\n\n// http://www.itl.nist.gov/div898/strd/nls/data/boxbod.shtml\nvoid testNistBoxBOD(void)\n{\n  const int n=2;\n  int info;\n\n  VectorXd x(n);\n\n  /*\n   * First try\n   */\n  x<< 1., 1.;\n  // do the computation\n  BoxBOD_functor functor;\n  LevenbergMarquardt<BoxBOD_functor> lm(functor);\n  lm.parameters.ftol = 1.E6*NumTraits<double>::epsilon();\n  lm.parameters.xtol = 1.E6*NumTraits<double>::epsilon();\n  lm.parameters.factor = 10.;\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev, 31);\n  VERIFY_IS_EQUAL(lm.njev, 25);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.1680088766E+03);\n  // check x\n  VERIFY_IS_APPROX(x[0], 2.1380940889E+02);\n  VERIFY_IS_APPROX(x[1], 5.4723748542E-01);\n\n  /*\n   * Second try\n   */\n  x<< 100., 0.75;\n  // do the computation\n  lm.resetParameters();\n  lm.parameters.ftol = NumTraits<double>::epsilon();\n  lm.parameters.xtol = NumTraits<double>::epsilon();\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1); \n  VERIFY_IS_EQUAL(lm.nfev, 15 ); \n  VERIFY_IS_EQUAL(lm.njev, 14 ); \n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.1680088766E+03);\n  // check x\n  VERIFY_IS_APPROX(x[0], 2.1380940889E+02);\n  VERIFY_IS_APPROX(x[1], 5.4723748542E-01);\n}\n\nstruct MGH17_functor : Functor<double>\n{\n    MGH17_functor(void) : Functor<double>(5,33) {}\n    static const double x[33];\n    static const double y[33];\n    int operator()(const VectorXd &b, VectorXd &fvec)\n    {\n        assert(b.size()==5);\n        assert(fvec.size()==33);\n        for(int i=0; i<33; i++)\n            fvec[i] =  b[0] + b[1]*exp(-b[3]*x[i]) +  b[2]*exp(-b[4]*x[i]) - y[i];\n        return 0;\n    }\n    int df(const VectorXd &b, MatrixXd &fjac)\n    {\n        assert(b.size()==5);\n        assert(fjac.rows()==33);\n        assert(fjac.cols()==5);\n        for(int i=0; i<33; i++) {\n            fjac(i,0) = 1.;\n            fjac(i,1) = exp(-b[3]*x[i]);\n            fjac(i,2) = exp(-b[4]*x[i]);\n            fjac(i,3) = -x[i]*b[1]*exp(-b[3]*x[i]);\n            fjac(i,4) = -x[i]*b[2]*exp(-b[4]*x[i]);\n        }\n        return 0;\n    }\n};\nconst double MGH17_functor::x[33] = { 0.000000E+00, 1.000000E+01, 2.000000E+01, 3.000000E+01, 4.000000E+01, 5.000000E+01, 6.000000E+01, 7.000000E+01, 8.000000E+01, 9.000000E+01, 1.000000E+02, 1.100000E+02, 1.200000E+02, 1.300000E+02, 1.400000E+02, 1.500000E+02, 1.600000E+02, 1.700000E+02, 1.800000E+02, 1.900000E+02, 2.000000E+02, 2.100000E+02, 2.200000E+02, 2.300000E+02, 2.400000E+02, 2.500000E+02, 2.600000E+02, 2.700000E+02, 2.800000E+02, 2.900000E+02, 3.000000E+02, 3.100000E+02, 3.200000E+02 };\nconst double MGH17_functor::y[33] = { 8.440000E-01, 9.080000E-01, 9.320000E-01, 9.360000E-01, 9.250000E-01, 9.080000E-01, 8.810000E-01, 8.500000E-01, 8.180000E-01, 7.840000E-01, 7.510000E-01, 7.180000E-01, 6.850000E-01, 6.580000E-01, 6.280000E-01, 6.030000E-01, 5.800000E-01, 5.580000E-01, 5.380000E-01, 5.220000E-01, 5.060000E-01, 4.900000E-01, 4.780000E-01, 4.670000E-01, 4.570000E-01, 4.480000E-01, 4.380000E-01, 4.310000E-01, 4.240000E-01, 4.200000E-01, 4.140000E-01, 4.110000E-01, 4.060000E-01 };\n\n// http://www.itl.nist.gov/div898/strd/nls/data/mgh17.shtml\nvoid testNistMGH17(void)\n{\n  const int n=5;\n  int info;\n\n  VectorXd x(n);\n\n  /*\n   * First try\n   */\n  x<< 50., 150., -100., 1., 2.;\n  // do the computation\n  MGH17_functor functor;\n  LevenbergMarquardt<MGH17_functor> lm(functor);\n  lm.parameters.ftol = NumTraits<double>::epsilon();\n  lm.parameters.xtol = NumTraits<double>::epsilon();\n  lm.parameters.maxfev = 1000;\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 2); \n  VERIFY_IS_EQUAL(lm.nfev, 602 ); \n  VERIFY_IS_EQUAL(lm.njev, 545 ); \n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.4648946975E-05);\n  // check x\n  VERIFY_IS_APPROX(x[0], 3.7541005211E-01);\n  VERIFY_IS_APPROX(x[1], 1.9358469127E+00);\n  VERIFY_IS_APPROX(x[2], -1.4646871366E+00);\n  VERIFY_IS_APPROX(x[3], 1.2867534640E-02);\n  VERIFY_IS_APPROX(x[4], 2.2122699662E-02);\n\n  /*\n   * Second try\n   */\n  x<< 0.5  ,1.5  ,-1   ,0.01 ,0.02;\n  // do the computation\n  lm.resetParameters();\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev, 18);\n  VERIFY_IS_EQUAL(lm.njev, 15);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.4648946975E-05);\n  // check x\n  VERIFY_IS_APPROX(x[0], 3.7541005211E-01);\n  VERIFY_IS_APPROX(x[1], 1.9358469127E+00);\n  VERIFY_IS_APPROX(x[2], -1.4646871366E+00);\n  VERIFY_IS_APPROX(x[3], 1.2867534640E-02);\n  VERIFY_IS_APPROX(x[4], 2.2122699662E-02);\n}\n\nstruct MGH09_functor : Functor<double>\n{\n    MGH09_functor(void) : Functor<double>(4,11) {}\n    static const double _x[11];\n    static const double y[11];\n    int operator()(const VectorXd &b, VectorXd &fvec)\n    {\n        assert(b.size()==4);\n        assert(fvec.size()==11);\n        for(int i=0; i<11; i++) {\n            double x = _x[i], xx=x*x;\n            fvec[i] = b[0]*(xx+x*b[1])/(xx+x*b[2]+b[3]) - y[i];\n        }\n        return 0;\n    }\n    int df(const VectorXd &b, MatrixXd &fjac)\n    {\n        assert(b.size()==4);\n        assert(fjac.rows()==11);\n        assert(fjac.cols()==4);\n        for(int i=0; i<11; i++) {\n            double x = _x[i], xx=x*x;\n            double factor = 1./(xx+x*b[2]+b[3]);\n            fjac(i,0) = (xx+x*b[1]) * factor;\n            fjac(i,1) = b[0]*x* factor;\n            fjac(i,2) = - b[0]*(xx+x*b[1]) * x * factor * factor;\n            fjac(i,3) = - b[0]*(xx+x*b[1]) * factor * factor;\n        }\n        return 0;\n    }\n};\nconst double MGH09_functor::_x[11] = { 4., 2., 1., 5.E-1 , 2.5E-01, 1.670000E-01, 1.250000E-01,  1.E-01, 8.330000E-02, 7.140000E-02, 6.250000E-02 };\nconst double MGH09_functor::y[11] = { 1.957000E-01, 1.947000E-01, 1.735000E-01, 1.600000E-01, 8.440000E-02, 6.270000E-02, 4.560000E-02, 3.420000E-02, 3.230000E-02, 2.350000E-02, 2.460000E-02 };\n\n// http://www.itl.nist.gov/div898/strd/nls/data/mgh09.shtml\nvoid testNistMGH09(void)\n{\n  const int n=4;\n  int info;\n\n  VectorXd x(n);\n\n  /*\n   * First try\n   */\n  x<< 25., 39, 41.5, 39.;\n  // do the computation\n  MGH09_functor functor;\n  LevenbergMarquardt<MGH09_functor> lm(functor);\n  lm.parameters.maxfev = 1000;\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1); \n  VERIFY_IS_EQUAL(lm.nfev, 490 ); \n  VERIFY_IS_EQUAL(lm.njev, 376 ); \n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 3.0750560385E-04);\n  // check x\n  VERIFY_IS_APPROX(x[0], 0.1928077089); // should be 1.9280693458E-01\n  VERIFY_IS_APPROX(x[1], 0.19126423573); // should be 1.9128232873E-01\n  VERIFY_IS_APPROX(x[2], 0.12305309914); // should be 1.2305650693E-01\n  VERIFY_IS_APPROX(x[3], 0.13605395375); // should be 1.3606233068E-01\n\n  /*\n   * Second try\n   */\n  x<< 0.25, 0.39, 0.415, 0.39;\n  // do the computation\n  lm.resetParameters();\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev, 18);\n  VERIFY_IS_EQUAL(lm.njev, 16);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 3.0750560385E-04);\n  // check x\n  VERIFY_IS_APPROX(x[0], 0.19280781); // should be 1.9280693458E-01\n  VERIFY_IS_APPROX(x[1], 0.19126265); // should be 1.9128232873E-01\n  VERIFY_IS_APPROX(x[2], 0.12305280); // should be 1.2305650693E-01\n  VERIFY_IS_APPROX(x[3], 0.13605322); // should be 1.3606233068E-01\n}\n\n\n\nstruct Bennett5_functor : Functor<double>\n{\n    Bennett5_functor(void) : Functor<double>(3,154) {}\n    static const double x[154];\n    static const double y[154];\n    int operator()(const VectorXd &b, VectorXd &fvec)\n    {\n        assert(b.size()==3);\n        assert(fvec.size()==154);\n        for(int i=0; i<154; i++)\n            fvec[i] = b[0]* pow(b[1]+x[i],-1./b[2]) - y[i];\n        return 0;\n    }\n    int df(const VectorXd &b, MatrixXd &fjac)\n    {\n        assert(b.size()==3);\n        assert(fjac.rows()==154);\n        assert(fjac.cols()==3);\n        for(int i=0; i<154; i++) {\n            double e = pow(b[1]+x[i],-1./b[2]);\n            fjac(i,0) = e;\n            fjac(i,1) = - b[0]*e/b[2]/(b[1]+x[i]);\n            fjac(i,2) = b[0]*e*log(b[1]+x[i])/b[2]/b[2];\n        }\n        return 0;\n    }\n};\nconst double Bennett5_functor::x[154] = { 7.447168E0, 8.102586E0, 8.452547E0, 8.711278E0, 8.916774E0, 9.087155E0, 9.232590E0, 9.359535E0, 9.472166E0, 9.573384E0, 9.665293E0, 9.749461E0, 9.827092E0, 9.899128E0, 9.966321E0, 10.029280E0, 10.088510E0, 10.144430E0, 10.197380E0, 10.247670E0, 10.295560E0, 10.341250E0, 10.384950E0, 10.426820E0, 10.467000E0, 10.505640E0, 10.542830E0, 10.578690E0, 10.613310E0, 10.646780E0, 10.679150E0, 10.710520E0, 10.740920E0, 10.770440E0, 10.799100E0, 10.826970E0, 10.854080E0, 10.880470E0, 10.906190E0, 10.931260E0, 10.955720E0, 10.979590E0, 11.002910E0, 11.025700E0, 11.047980E0, 11.069770E0, 11.091100E0, 11.111980E0, 11.132440E0, 11.152480E0, 11.172130E0, 11.191410E0, 11.210310E0, 11.228870E0, 11.247090E0, 11.264980E0, 11.282560E0, 11.299840E0, 11.316820E0, 11.333520E0, 11.349940E0, 11.366100E0, 11.382000E0, 11.397660E0, 11.413070E0, 11.428240E0, 11.443200E0, 11.457930E0, 11.472440E0, 11.486750E0, 11.500860E0, 11.514770E0, 11.528490E0, 11.542020E0, 11.555380E0, 11.568550E0,\n11.581560E0, 11.594420E0, 11.607121E0, 11.619640E0, 11.632000E0, 11.644210E0, 11.656280E0, 11.668200E0, 11.679980E0, 11.691620E0, 11.703130E0, 11.714510E0, 11.725760E0, 11.736880E0, 11.747890E0, 11.758780E0, 11.769550E0, 11.780200E0, 11.790730E0, 11.801160E0, 11.811480E0, 11.821700E0, 11.831810E0, 11.841820E0, 11.851730E0, 11.861550E0, 11.871270E0, 11.880890E0, 11.890420E0, 11.899870E0, 11.909220E0, 11.918490E0, 11.927680E0, 11.936780E0, 11.945790E0, 11.954730E0, 11.963590E0, 11.972370E0, 11.981070E0, 11.989700E0, 11.998260E0, 12.006740E0, 12.015150E0, 12.023490E0, 12.031760E0, 12.039970E0, 12.048100E0, 12.056170E0, 12.064180E0, 12.072120E0, 12.080010E0, 12.087820E0, 12.095580E0, 12.103280E0, 12.110920E0, 12.118500E0, 12.126030E0, 12.133500E0, 12.140910E0, 12.148270E0, 12.155570E0, 12.162830E0, 12.170030E0, 12.177170E0, 12.184270E0, 12.191320E0, 12.198320E0, 12.205270E0, 12.212170E0, 12.219030E0, 12.225840E0, 12.232600E0, 12.239320E0, 12.245990E0, 12.252620E0, 12.259200E0, 12.265750E0, 12.272240E0 };\nconst double Bennett5_functor::y[154] = { -34.834702E0 ,-34.393200E0 ,-34.152901E0 ,-33.979099E0 ,-33.845901E0 ,-33.732899E0 ,-33.640301E0 ,-33.559200E0 ,-33.486801E0 ,-33.423100E0 ,-33.365101E0 ,-33.313000E0 ,-33.260899E0 ,-33.217400E0 ,-33.176899E0 ,-33.139198E0 ,-33.101601E0 ,-33.066799E0 ,-33.035000E0 ,-33.003101E0 ,-32.971298E0 ,-32.942299E0 ,-32.916302E0 ,-32.890202E0 ,-32.864101E0 ,-32.841000E0 ,-32.817799E0 ,-32.797501E0 ,-32.774300E0 ,-32.757000E0 ,-32.733799E0 ,-32.716400E0 ,-32.699100E0 ,-32.678799E0 ,-32.661400E0 ,-32.644001E0 ,-32.626701E0 ,-32.612202E0 ,-32.597698E0 ,-32.583199E0 ,-32.568699E0 ,-32.554298E0 ,-32.539799E0 ,-32.525299E0 ,-32.510799E0 ,-32.499199E0 ,-32.487598E0 ,-32.473202E0 ,-32.461601E0 ,-32.435501E0 ,-32.435501E0 ,-32.426800E0 ,-32.412300E0 ,-32.400799E0 ,-32.392101E0 ,-32.380501E0 ,-32.366001E0 ,-32.357300E0 ,-32.348598E0 ,-32.339901E0 ,-32.328400E0 ,-32.319698E0 ,-32.311001E0 ,-32.299400E0 ,-32.290699E0 ,-32.282001E0 ,-32.273300E0 ,-32.264599E0 ,-32.256001E0 ,-32.247299E0\n,-32.238602E0 ,-32.229900E0 ,-32.224098E0 ,-32.215401E0 ,-32.203800E0 ,-32.198002E0 ,-32.189400E0 ,-32.183601E0 ,-32.174900E0 ,-32.169102E0 ,-32.163300E0 ,-32.154598E0 ,-32.145901E0 ,-32.140099E0 ,-32.131401E0 ,-32.125599E0 ,-32.119801E0 ,-32.111198E0 ,-32.105400E0 ,-32.096699E0 ,-32.090900E0 ,-32.088001E0 ,-32.079300E0 ,-32.073502E0 ,-32.067699E0 ,-32.061901E0 ,-32.056099E0 ,-32.050301E0 ,-32.044498E0 ,-32.038799E0 ,-32.033001E0 ,-32.027199E0 ,-32.024300E0 ,-32.018501E0 ,-32.012699E0 ,-32.004002E0 ,-32.001099E0 ,-31.995300E0 ,-31.989500E0 ,-31.983700E0 ,-31.977900E0 ,-31.972099E0 ,-31.969299E0 ,-31.963501E0 ,-31.957701E0 ,-31.951900E0 ,-31.946100E0 ,-31.940300E0 ,-31.937401E0 ,-31.931601E0 ,-31.925800E0 ,-31.922899E0 ,-31.917101E0 ,-31.911301E0 ,-31.908400E0 ,-31.902599E0 ,-31.896900E0 ,-31.893999E0 ,-31.888201E0 ,-31.885300E0 ,-31.882401E0 ,-31.876600E0 ,-31.873699E0 ,-31.867901E0 ,-31.862101E0 ,-31.859200E0 ,-31.856300E0 ,-31.850500E0 ,-31.844700E0 ,-31.841801E0 ,-31.838900E0 ,-31.833099E0 ,-31.830200E0 ,\n-31.827299E0 ,-31.821600E0 ,-31.818701E0 ,-31.812901E0 ,-31.809999E0 ,-31.807100E0 ,-31.801300E0 ,-31.798401E0 ,-31.795500E0 ,-31.789700E0 ,-31.786800E0 };\n\n// http://www.itl.nist.gov/div898/strd/nls/data/bennett5.shtml\nvoid testNistBennett5(void)\n{\n  const int  n=3;\n  int info;\n\n  VectorXd x(n);\n\n  /*\n   * First try\n   */\n  x<< -2000., 50., 0.8;\n  // do the computation\n  Bennett5_functor functor;\n  LevenbergMarquardt<Bennett5_functor> lm(functor);\n  lm.parameters.maxfev = 1000;\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev, 758);\n  VERIFY_IS_EQUAL(lm.njev, 744);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.2404744073E-04);\n  // check x\n  VERIFY_IS_APPROX(x[0], -2.5235058043E+03);\n  VERIFY_IS_APPROX(x[1], 4.6736564644E+01);\n  VERIFY_IS_APPROX(x[2], 9.3218483193E-01);\n  /*\n   * Second try\n   */\n  x<< -1500., 45., 0.85;\n  // do the computation\n  lm.resetParameters();\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev, 203);\n  VERIFY_IS_EQUAL(lm.njev, 192);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.2404744073E-04);\n  // check x\n  VERIFY_IS_APPROX(x[0], -2523.3007865); // should be -2.5235058043E+03\n  VERIFY_IS_APPROX(x[1], 46.735705771); // should be 4.6736564644E+01);\n  VERIFY_IS_APPROX(x[2], 0.93219881891); // should be 9.3218483193E-01);\n}\n\nstruct thurber_functor : Functor<double>\n{\n    thurber_functor(void) : Functor<double>(7,37) {}\n    static const double _x[37];\n    static const double _y[37];\n    int operator()(const VectorXd &b, VectorXd &fvec)\n    {\n        //        int called=0; printf(\"call hahn1_functor with  iflag=%d, called=%d\\n\", iflag, called); if (iflag==1) called++;\n        assert(b.size()==7);\n        assert(fvec.size()==37);\n        for(int i=0; i<37; i++) {\n            double x=_x[i], xx=x*x, xxx=xx*x;\n            fvec[i] = (b[0]+b[1]*x+b[2]*xx+b[3]*xxx) / (1.+b[4]*x+b[5]*xx+b[6]*xxx) - _y[i];\n        }\n        return 0;\n    }\n    int df(const VectorXd &b, MatrixXd &fjac)\n    {\n        assert(b.size()==7);\n        assert(fjac.rows()==37);\n        assert(fjac.cols()==7);\n        for(int i=0; i<37; i++) {\n            double x=_x[i], xx=x*x, xxx=xx*x;\n            double fact = 1./(1.+b[4]*x+b[5]*xx+b[6]*xxx);\n            fjac(i,0) = 1.*fact;\n            fjac(i,1) = x*fact;\n            fjac(i,2) = xx*fact;\n            fjac(i,3) = xxx*fact;\n            fact = - (b[0]+b[1]*x+b[2]*xx+b[3]*xxx) * fact * fact;\n            fjac(i,4) = x*fact;\n            fjac(i,5) = xx*fact;\n            fjac(i,6) = xxx*fact;\n        }\n        return 0;\n    }\n};\nconst double thurber_functor::_x[37] = { -3.067E0, -2.981E0, -2.921E0, -2.912E0, -2.840E0, -2.797E0, -2.702E0, -2.699E0, -2.633E0, -2.481E0, -2.363E0, -2.322E0, -1.501E0, -1.460E0, -1.274E0, -1.212E0, -1.100E0, -1.046E0, -0.915E0, -0.714E0, -0.566E0, -0.545E0, -0.400E0, -0.309E0, -0.109E0, -0.103E0, 0.010E0, 0.119E0, 0.377E0, 0.790E0, 0.963E0, 1.006E0, 1.115E0, 1.572E0, 1.841E0, 2.047E0, 2.200E0 };\nconst double thurber_functor::_y[37] = { 80.574E0, 84.248E0, 87.264E0, 87.195E0, 89.076E0, 89.608E0, 89.868E0, 90.101E0, 92.405E0, 95.854E0, 100.696E0, 101.060E0, 401.672E0, 390.724E0, 567.534E0, 635.316E0, 733.054E0, 759.087E0, 894.206E0, 990.785E0, 1090.109E0, 1080.914E0, 1122.643E0, 1178.351E0, 1260.531E0, 1273.514E0, 1288.339E0, 1327.543E0, 1353.863E0, 1414.509E0, 1425.208E0, 1421.384E0, 1442.962E0, 1464.350E0, 1468.705E0, 1447.894E0, 1457.628E0};\n\n// http://www.itl.nist.gov/div898/strd/nls/data/thurber.shtml\nvoid testNistThurber(void)\n{\n  const int n=7;\n  int info;\n\n  VectorXd x(n);\n\n  /*\n   * First try\n   */\n  x<< 1000 ,1000 ,400 ,40 ,0.7,0.3,0.0 ;\n  // do the computation\n  thurber_functor functor;\n  LevenbergMarquardt<thurber_functor> lm(functor);\n  lm.parameters.ftol = 1.E4*NumTraits<double>::epsilon();\n  lm.parameters.xtol = 1.E4*NumTraits<double>::epsilon();\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev, 39);\n  VERIFY_IS_EQUAL(lm.njev, 36);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.6427082397E+03);\n  // check x\n  VERIFY_IS_APPROX(x[0], 1.2881396800E+03);\n  VERIFY_IS_APPROX(x[1], 1.4910792535E+03);\n  VERIFY_IS_APPROX(x[2], 5.8323836877E+02);\n  VERIFY_IS_APPROX(x[3], 7.5416644291E+01);\n  VERIFY_IS_APPROX(x[4], 9.6629502864E-01);\n  VERIFY_IS_APPROX(x[5], 3.9797285797E-01);\n  VERIFY_IS_APPROX(x[6], 4.9727297349E-02);\n\n  /*\n   * Second try\n   */\n  x<< 1300 ,1500 ,500  ,75   ,1    ,0.4  ,0.05  ;\n  // do the computation\n  lm.resetParameters();\n  lm.parameters.ftol = 1.E4*NumTraits<double>::epsilon();\n  lm.parameters.xtol = 1.E4*NumTraits<double>::epsilon();\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev, 29);\n  VERIFY_IS_EQUAL(lm.njev, 28);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.6427082397E+03);\n  // check x\n  VERIFY_IS_APPROX(x[0], 1.2881396800E+03);\n  VERIFY_IS_APPROX(x[1], 1.4910792535E+03);\n  VERIFY_IS_APPROX(x[2], 5.8323836877E+02);\n  VERIFY_IS_APPROX(x[3], 7.5416644291E+01);\n  VERIFY_IS_APPROX(x[4], 9.6629502864E-01);\n  VERIFY_IS_APPROX(x[5], 3.9797285797E-01);\n  VERIFY_IS_APPROX(x[6], 4.9727297349E-02);\n}\n\nstruct rat43_functor : Functor<double>\n{\n    rat43_functor(void) : Functor<double>(4,15) {}\n    static const double x[15];\n    static const double y[15];\n    int operator()(const VectorXd &b, VectorXd &fvec)\n    {\n        assert(b.size()==4);\n        assert(fvec.size()==15);\n        for(int i=0; i<15; i++)\n            fvec[i] = b[0] * pow(1.+exp(b[1]-b[2]*x[i]),-1./b[3]) - y[i];\n        return 0;\n    }\n    int df(const VectorXd &b, MatrixXd &fjac)\n    {\n        assert(b.size()==4);\n        assert(fjac.rows()==15);\n        assert(fjac.cols()==4);\n        for(int i=0; i<15; i++) {\n            double e = exp(b[1]-b[2]*x[i]);\n            double power = -1./b[3];\n            fjac(i,0) = pow(1.+e, power);\n            fjac(i,1) = power*b[0]*e*pow(1.+e, power-1.);\n            fjac(i,2) = -power*b[0]*e*x[i]*pow(1.+e, power-1.);\n            fjac(i,3) = b[0]*power*power*log(1.+e)*pow(1.+e, power);\n        }\n        return 0;\n    }\n};\nconst double rat43_functor::x[15] = { 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12., 13., 14., 15. };\nconst double rat43_functor::y[15] = { 16.08, 33.83, 65.80, 97.20, 191.55, 326.20, 386.87, 520.53, 590.03, 651.92, 724.93, 699.56, 689.96, 637.56, 717.41 };\n\n// http://www.itl.nist.gov/div898/strd/nls/data/ratkowsky3.shtml\nvoid testNistRat43(void)\n{\n  const int n=4;\n  int info;\n\n  VectorXd x(n);\n\n  /*\n   * First try\n   */\n  x<< 100., 10., 1., 1.;\n  // do the computation\n  rat43_functor functor;\n  LevenbergMarquardt<rat43_functor> lm(functor);\n  lm.parameters.ftol = 1.E6*NumTraits<double>::epsilon();\n  lm.parameters.xtol = 1.E6*NumTraits<double>::epsilon();\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev, 27);\n  VERIFY_IS_EQUAL(lm.njev, 20);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 8.7864049080E+03);\n  // check x\n  VERIFY_IS_APPROX(x[0], 6.9964151270E+02);\n  VERIFY_IS_APPROX(x[1], 5.2771253025E+00);\n  VERIFY_IS_APPROX(x[2], 7.5962938329E-01);\n  VERIFY_IS_APPROX(x[3], 1.2792483859E+00);\n\n  /*\n   * Second try\n   */\n  x<< 700., 5., 0.75, 1.3;\n  // do the computation\n  lm.resetParameters();\n  lm.parameters.ftol = 1.E5*NumTraits<double>::epsilon();\n  lm.parameters.xtol = 1.E5*NumTraits<double>::epsilon();\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev, 9);\n  VERIFY_IS_EQUAL(lm.njev, 8);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 8.7864049080E+03);\n  // check x\n  VERIFY_IS_APPROX(x[0], 6.9964151270E+02);\n  VERIFY_IS_APPROX(x[1], 5.2771253025E+00);\n  VERIFY_IS_APPROX(x[2], 7.5962938329E-01);\n  VERIFY_IS_APPROX(x[3], 1.2792483859E+00);\n}\n\n\n\nstruct eckerle4_functor : Functor<double>\n{\n    eckerle4_functor(void) : Functor<double>(3,35) {}\n    static const double x[35];\n    static const double y[35];\n    int operator()(const VectorXd &b, VectorXd &fvec)\n    {\n        assert(b.size()==3);\n        assert(fvec.size()==35);\n        for(int i=0; i<35; i++)\n            fvec[i] = b[0]/b[1] * exp(-0.5*(x[i]-b[2])*(x[i]-b[2])/(b[1]*b[1])) - y[i];\n        return 0;\n    }\n    int df(const VectorXd &b, MatrixXd &fjac)\n    {\n        assert(b.size()==3);\n        assert(fjac.rows()==35);\n        assert(fjac.cols()==3);\n        for(int i=0; i<35; i++) {\n            double b12 = b[1]*b[1];\n            double e = exp(-0.5*(x[i]-b[2])*(x[i]-b[2])/b12);\n            fjac(i,0) = e / b[1];\n            fjac(i,1) = ((x[i]-b[2])*(x[i]-b[2])/b12-1.) * b[0]*e/b12;\n            fjac(i,2) = (x[i]-b[2])*e*b[0]/b[1]/b12;\n        }\n        return 0;\n    }\n};\nconst double eckerle4_functor::x[35] = { 400.0, 405.0, 410.0, 415.0, 420.0, 425.0, 430.0, 435.0, 436.5, 438.0, 439.5, 441.0, 442.5, 444.0, 445.5, 447.0, 448.5, 450.0, 451.5, 453.0, 454.5, 456.0, 457.5, 459.0, 460.5, 462.0, 463.5, 465.0, 470.0, 475.0, 480.0, 485.0, 490.0, 495.0, 500.0};\nconst double eckerle4_functor::y[35] = { 0.0001575, 0.0001699, 0.0002350, 0.0003102, 0.0004917, 0.0008710, 0.0017418, 0.0046400, 0.0065895, 0.0097302, 0.0149002, 0.0237310, 0.0401683, 0.0712559, 0.1264458, 0.2073413, 0.2902366, 0.3445623, 0.3698049, 0.3668534, 0.3106727, 0.2078154, 0.1164354, 0.0616764, 0.0337200, 0.0194023, 0.0117831, 0.0074357, 0.0022732, 0.0008800, 0.0004579, 0.0002345, 0.0001586, 0.0001143, 0.0000710 };\n\n// http://www.itl.nist.gov/div898/strd/nls/data/eckerle4.shtml\nvoid testNistEckerle4(void)\n{\n  const int n=3;\n  int info;\n\n  VectorXd x(n);\n\n  /*\n   * First try\n   */\n  x<< 1., 10., 500.;\n  // do the computation\n  eckerle4_functor functor;\n  LevenbergMarquardt<eckerle4_functor> lm(functor);\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev, 18);\n  VERIFY_IS_EQUAL(lm.njev, 15);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.4635887487E-03);\n  // check x\n  VERIFY_IS_APPROX(x[0], 1.5543827178);\n  VERIFY_IS_APPROX(x[1], 4.0888321754);\n  VERIFY_IS_APPROX(x[2], 4.5154121844E+02);\n\n  /*\n   * Second try\n   */\n  x<< 1.5, 5., 450.;\n  // do the computation\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev, 7);\n  VERIFY_IS_EQUAL(lm.njev, 6);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.4635887487E-03);\n  // check x\n  VERIFY_IS_APPROX(x[0], 1.5543827178);\n  VERIFY_IS_APPROX(x[1], 4.0888321754);\n  VERIFY_IS_APPROX(x[2], 4.5154121844E+02);\n}\n\nvoid test_NonLinearOptimization()\n{\n    // Tests using the examples provided by (c)minpack\n    CALL_SUBTEST/*_1*/(testChkder());\n    CALL_SUBTEST/*_1*/(testLmder1());\n    CALL_SUBTEST/*_1*/(testLmder());\n    CALL_SUBTEST/*_2*/(testHybrj1());\n    CALL_SUBTEST/*_2*/(testHybrj());\n    CALL_SUBTEST/*_2*/(testHybrd1());\n    CALL_SUBTEST/*_2*/(testHybrd());\n    CALL_SUBTEST/*_3*/(testLmstr1());\n    CALL_SUBTEST/*_3*/(testLmstr());\n    CALL_SUBTEST/*_3*/(testLmdif1());\n    CALL_SUBTEST/*_3*/(testLmdif());\n\n    // NIST tests, level of difficulty = \"Lower\"\n    CALL_SUBTEST/*_4*/(testNistMisra1a());\n    CALL_SUBTEST/*_4*/(testNistChwirut2());\n\n    // NIST tests, level of difficulty = \"Average\"\n    CALL_SUBTEST/*_5*/(testNistHahn1());\n    CALL_SUBTEST/*_6*/(testNistMisra1d());\n//     CALL_SUBTEST/*_7*/(testNistMGH17());\n//     CALL_SUBTEST/*_8*/(testNistLanczos1());\n\n//     // NIST tests, level of difficulty = \"Higher\"\n    CALL_SUBTEST/*_9*/(testNistRat42());\n//     CALL_SUBTEST/*_10*/(testNistMGH10());\n    CALL_SUBTEST/*_11*/(testNistBoxBOD());\n//     CALL_SUBTEST/*_12*/(testNistMGH09());\n    CALL_SUBTEST/*_13*/(testNistBennett5());\n    CALL_SUBTEST/*_14*/(testNistThurber());\n    CALL_SUBTEST/*_15*/(testNistRat43());\n    CALL_SUBTEST/*_16*/(testNistEckerle4());\n}\n\n/*\n * Can be useful for debugging...\n  printf(\"info, nfev : %d, %d\\n\", info, lm.nfev);\n  printf(\"info, nfev, njev : %d, %d, %d\\n\", info, solver.nfev, solver.njev);\n  printf(\"info, nfev : %d, %d\\n\", info, solver.nfev);\n  printf(\"x[0] : %.32g\\n\", x[0]);\n  printf(\"x[1] : %.32g\\n\", x[1]);\n  printf(\"x[2] : %.32g\\n\", x[2]);\n  printf(\"x[3] : %.32g\\n\", x[3]);\n  printf(\"fvec.blueNorm() : %.32g\\n\", solver.fvec.blueNorm());\n  printf(\"fvec.blueNorm() : %.32g\\n\", lm.fvec.blueNorm());\n\n  printf(\"info, nfev, njev : %d, %d, %d\\n\", info, lm.nfev, lm.njev);\n  printf(\"fvec.squaredNorm() : %.13g\\n\", lm.fvec.squaredNorm());\n  std::cout << x << std::endl;\n  std::cout.precision(9);\n  std::cout << x[0] << std::endl;\n  std::cout << x[1] << std::endl;\n  std::cout << x[2] << std::endl;\n  std::cout << x[3] << std::endl;\n*/\n\n"
  },
  {
    "path": "libs/eigen/unsupported/test/NumericalDiff.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Thomas Capricelli <orzel@freehackers.org>\n\n#include <stdio.h>\n\n#include \"main.h\"\n#include <unsupported/Eigen/NumericalDiff>\n    \n// Generic functor\ntemplate<typename _Scalar, int NX=Dynamic, int NY=Dynamic>\nstruct Functor\n{\n  typedef _Scalar Scalar;\n  enum {\n    InputsAtCompileTime = NX,\n    ValuesAtCompileTime = NY\n  };\n  typedef Matrix<Scalar,InputsAtCompileTime,1> InputType;\n  typedef Matrix<Scalar,ValuesAtCompileTime,1> ValueType;\n  typedef Matrix<Scalar,ValuesAtCompileTime,InputsAtCompileTime> JacobianType;\n  \n  int m_inputs, m_values;\n  \n  Functor() : m_inputs(InputsAtCompileTime), m_values(ValuesAtCompileTime) {}\n  Functor(int inputs, int values) : m_inputs(inputs), m_values(values) {}\n  \n  int inputs() const { return m_inputs; }\n  int values() const { return m_values; }\n\n};\n\nstruct my_functor : Functor<double>\n{\n    my_functor(void): Functor<double>(3,15) {}\n    int operator()(const VectorXd &x, VectorXd &fvec) const\n    {\n        double tmp1, tmp2, tmp3;\n        double y[15] = {1.4e-1, 1.8e-1, 2.2e-1, 2.5e-1, 2.9e-1, 3.2e-1, 3.5e-1,\n            3.9e-1, 3.7e-1, 5.8e-1, 7.3e-1, 9.6e-1, 1.34, 2.1, 4.39};\n\n        for (int i = 0; i < values(); i++)\n        {\n            tmp1 = i+1;\n            tmp2 = 16 - i - 1;\n            tmp3 = (i>=8)? tmp2 : tmp1;\n            fvec[i] = y[i] - (x[0] + tmp1/(x[1]*tmp2 + x[2]*tmp3));\n        }\n        return 0;\n    }\n\n    int actual_df(const VectorXd &x, MatrixXd &fjac) const\n    {\n        double tmp1, tmp2, tmp3, tmp4;\n        for (int i = 0; i < values(); i++)\n        {\n            tmp1 = i+1;\n            tmp2 = 16 - i - 1;\n            tmp3 = (i>=8)? tmp2 : tmp1;\n            tmp4 = (x[1]*tmp2 + x[2]*tmp3); tmp4 = tmp4*tmp4;\n            fjac(i,0) = -1;\n            fjac(i,1) = tmp1*tmp2/tmp4;\n            fjac(i,2) = tmp1*tmp3/tmp4;\n        }\n        return 0;\n    }\n};\n\nvoid test_forward()\n{\n    VectorXd x(3);\n    MatrixXd jac(15,3);\n    MatrixXd actual_jac(15,3);\n    my_functor functor;\n\n    x << 0.082, 1.13, 2.35;\n\n    // real one \n    functor.actual_df(x, actual_jac);\n//    std::cout << actual_jac << std::endl << std::endl;\n\n    // using NumericalDiff\n    NumericalDiff<my_functor> numDiff(functor);\n    numDiff.df(x, jac);\n//    std::cout << jac << std::endl;\n\n    VERIFY_IS_APPROX(jac, actual_jac);\n}\n\nvoid test_central()\n{\n    VectorXd x(3);\n    MatrixXd jac(15,3);\n    MatrixXd actual_jac(15,3);\n    my_functor functor;\n\n    x << 0.082, 1.13, 2.35;\n\n    // real one \n    functor.actual_df(x, actual_jac);\n\n    // using NumericalDiff\n    NumericalDiff<my_functor,Central> numDiff(functor);\n    numDiff.df(x, jac);\n\n    VERIFY_IS_APPROX(jac, actual_jac);\n}\n\nvoid test_NumericalDiff()\n{\n    CALL_SUBTEST(test_forward());\n    CALL_SUBTEST(test_central());\n}\n"
  },
  {
    "path": "libs/eigen/unsupported/test/alignedvector3.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Gael Guennebaud <g.gael@free.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <unsupported/Eigen/AlignedVector3>\n\ntemplate<typename Scalar>\nvoid alignedvector3()\n{\n  Scalar s1 = internal::random<Scalar>();\n  Scalar s2 = internal::random<Scalar>();\n  typedef Matrix<Scalar,3,1> RefType;\n  typedef Matrix<Scalar,3,3> Mat33;\n  typedef AlignedVector3<Scalar> FastType;\n  RefType  r1(RefType::Random()), r2(RefType::Random()), r3(RefType::Random()),\n           r4(RefType::Random()), r5(RefType::Random()), r6(RefType::Random());\n  FastType f1(r1), f2(r2), f3(r3), f4(r4), f5(r5), f6(r6);\n  Mat33 m1(Mat33::Random());\n  \n  VERIFY_IS_APPROX(f1,r1);\n  VERIFY_IS_APPROX(f4,r4);\n\n  VERIFY_IS_APPROX(f4+f1,r4+r1);\n  VERIFY_IS_APPROX(f4-f1,r4-r1);\n  VERIFY_IS_APPROX(f4+f1-f2,r4+r1-r2);\n  VERIFY_IS_APPROX(f4+=f3,r4+=r3);\n  VERIFY_IS_APPROX(f4-=f5,r4-=r5);\n  VERIFY_IS_APPROX(f4-=f5+f1,r4-=r5+r1);\n  VERIFY_IS_APPROX(f5+f1-s1*f2,r5+r1-s1*r2);\n  VERIFY_IS_APPROX(f5+f1/s2-s1*f2,r5+r1/s2-s1*r2);\n  \n  VERIFY_IS_APPROX(m1*f4,m1*r4);\n  VERIFY_IS_APPROX(f4.transpose()*m1,r4.transpose()*m1);\n  \n  VERIFY_IS_APPROX(f2.dot(f3),r2.dot(r3));\n  VERIFY_IS_APPROX(f2.cross(f3),r2.cross(r3));\n  VERIFY_IS_APPROX(f2.norm(),r2.norm());\n\n  VERIFY_IS_APPROX(f2.normalized(),r2.normalized());\n\n  VERIFY_IS_APPROX((f2+f1).normalized(),(r2+r1).normalized());\n  \n  f2.normalize();\n  r2.normalize();\n  VERIFY_IS_APPROX(f2,r2);\n}\n\nvoid test_alignedvector3()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST( alignedvector3<float>() );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/unsupported/test/autodiff.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Gael Guennebaud <g.gael@free.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <unsupported/Eigen/AutoDiff>\n\ntemplate<typename Scalar>\nEIGEN_DONT_INLINE Scalar foo(const Scalar& x, const Scalar& y)\n{\n  using namespace std;\n//   return x+std::sin(y);\n  EIGEN_ASM_COMMENT(\"mybegin\");\n  return static_cast<Scalar>(x*2 - pow(x,2) + 2*sqrt(y*y) - 4 * sin(x) + 2 * cos(y) - exp(-0.5*x*x));\n  //return x+2*y*x;//x*2 -std::pow(x,2);//(2*y/x);// - y*2;\n  EIGEN_ASM_COMMENT(\"myend\");\n}\n\ntemplate<typename Vector>\nEIGEN_DONT_INLINE typename Vector::Scalar foo(const Vector& p)\n{\n  typedef typename Vector::Scalar Scalar;\n  return (p-Vector(Scalar(-1),Scalar(1.))).norm() + (p.array() * p.array()).sum() + p.dot(p);\n}\n\ntemplate<typename _Scalar, int NX=Dynamic, int NY=Dynamic>\nstruct TestFunc1\n{\n  typedef _Scalar Scalar;\n  enum {\n    InputsAtCompileTime = NX,\n    ValuesAtCompileTime = NY\n  };\n  typedef Matrix<Scalar,InputsAtCompileTime,1> InputType;\n  typedef Matrix<Scalar,ValuesAtCompileTime,1> ValueType;\n  typedef Matrix<Scalar,ValuesAtCompileTime,InputsAtCompileTime> JacobianType;\n\n  int m_inputs, m_values;\n\n  TestFunc1() : m_inputs(InputsAtCompileTime), m_values(ValuesAtCompileTime) {}\n  TestFunc1(int inputs, int values) : m_inputs(inputs), m_values(values) {}\n\n  int inputs() const { return m_inputs; }\n  int values() const { return m_values; }\n\n  template<typename T>\n  void operator() (const Matrix<T,InputsAtCompileTime,1>& x, Matrix<T,ValuesAtCompileTime,1>* _v) const\n  {\n    Matrix<T,ValuesAtCompileTime,1>& v = *_v;\n\n    v[0] = 2 * x[0] * x[0] + x[0] * x[1];\n    v[1] = 3 * x[1] * x[0] + 0.5 * x[1] * x[1];\n    if(inputs()>2)\n    {\n      v[0] += 0.5 * x[2];\n      v[1] += x[2];\n    }\n    if(values()>2)\n    {\n      v[2] = 3 * x[1] * x[0] * x[0];\n    }\n    if (inputs()>2 && values()>2)\n      v[2] *= x[2];\n  }\n\n  void operator() (const InputType& x, ValueType* v, JacobianType* _j) const\n  {\n    (*this)(x, v);\n\n    if(_j)\n    {\n      JacobianType& j = *_j;\n\n      j(0,0) = 4 * x[0] + x[1];\n      j(1,0) = 3 * x[1];\n\n      j(0,1) = x[0];\n      j(1,1) = 3 * x[0] + 2 * 0.5 * x[1];\n\n      if (inputs()>2)\n      {\n        j(0,2) = 0.5;\n        j(1,2) = 1;\n      }\n      if(values()>2)\n      {\n        j(2,0) = 3 * x[1] * 2 * x[0];\n        j(2,1) = 3 * x[0] * x[0];\n      }\n      if (inputs()>2 && values()>2)\n      {\n        j(2,0) *= x[2];\n        j(2,1) *= x[2];\n\n        j(2,2) = 3 * x[1] * x[0] * x[0];\n        j(2,2) = 3 * x[1] * x[0] * x[0];\n      }\n    }\n  }\n};\n\ntemplate<typename Func> void forward_jacobian(const Func& f)\n{\n    typename Func::InputType x = Func::InputType::Random(f.inputs());\n    typename Func::ValueType y(f.values()), yref(f.values());\n    typename Func::JacobianType j(f.values(),f.inputs()), jref(f.values(),f.inputs());\n\n    jref.setZero();\n    yref.setZero();\n    f(x,&yref,&jref);\n//     std::cerr << y.transpose() << \"\\n\\n\";;\n//     std::cerr << j << \"\\n\\n\";;\n\n    j.setZero();\n    y.setZero();\n    AutoDiffJacobian<Func> autoj(f);\n    autoj(x, &y, &j);\n//     std::cerr << y.transpose() << \"\\n\\n\";;\n//     std::cerr << j << \"\\n\\n\";;\n\n    VERIFY_IS_APPROX(y, yref);\n    VERIFY_IS_APPROX(j, jref);\n}\n\n\n// TODO also check actual derivatives!\nvoid test_autodiff_scalar()\n{\n  Vector2f p = Vector2f::Random();\n  typedef AutoDiffScalar<Vector2f> AD;\n  AD ax(p.x(),Vector2f::UnitX());\n  AD ay(p.y(),Vector2f::UnitY());\n  AD res = foo<AD>(ax,ay);\n  VERIFY_IS_APPROX(res.value(), foo(p.x(),p.y()));\n}\n\n// TODO also check actual derivatives!\nvoid test_autodiff_vector()\n{\n  Vector2f p = Vector2f::Random();\n  typedef AutoDiffScalar<Vector2f> AD;\n  typedef Matrix<AD,2,1> VectorAD;\n  VectorAD ap = p.cast<AD>();\n  ap.x().derivatives() = Vector2f::UnitX();\n  ap.y().derivatives() = Vector2f::UnitY();\n  \n  AD res = foo<VectorAD>(ap);\n  VERIFY_IS_APPROX(res.value(), foo(p));\n}\n\nvoid test_autodiff_jacobian()\n{\n  CALL_SUBTEST(( forward_jacobian(TestFunc1<double,2,2>()) ));\n  CALL_SUBTEST(( forward_jacobian(TestFunc1<double,2,3>()) ));\n  CALL_SUBTEST(( forward_jacobian(TestFunc1<double,3,2>()) ));\n  CALL_SUBTEST(( forward_jacobian(TestFunc1<double,3,3>()) ));\n  CALL_SUBTEST(( forward_jacobian(TestFunc1<double>(3,3)) ));\n}\n\ndouble bug_1222() {\n  typedef Eigen::AutoDiffScalar<Eigen::Vector3d> AD;\n  const double _cv1_3 = 1.0;\n  const AD chi_3 = 1.0;\n  // this line did not work, because operator+ returns ADS<DerType&>, which then cannot be converted to ADS<DerType>\n  const AD denom = chi_3 + _cv1_3;\n  return denom.value();\n}\n\nvoid test_autodiff()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1( test_autodiff_scalar() );\n    CALL_SUBTEST_2( test_autodiff_vector() );\n    CALL_SUBTEST_3( test_autodiff_jacobian() );\n  }\n\n  bug_1222();\n}\n\n"
  },
  {
    "path": "libs/eigen/unsupported/test/bdcsvd.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2013 Gauthier Brun <brun.gauthier@gmail.com>\n// Copyright (C) 2013 Nicolas Carre <nicolas.carre@ensimag.fr>\n// Copyright (C) 2013 Jean Ceccato <jean.ceccato@ensimag.fr>\n// Copyright (C) 2013 Pierre Zoppitelli <pierre.zoppitelli@ensimag.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/\n\n#include \"svd_common.h\"\n#include <iostream>\n#include <Eigen/LU>\n\n// check if \"svd\" is the good image of \"m\"  \ntemplate<typename MatrixType>\nvoid bdcsvd_check_full(const MatrixType& m, const BDCSVD<MatrixType>& svd)\n{\n  svd_check_full< MatrixType, BDCSVD< MatrixType > >(m, svd);\n}\n\n// Compare to a reference value\ntemplate<typename MatrixType>\nvoid bdcsvd_compare_to_full(const MatrixType& m,\n\t\t\t    unsigned int computationOptions,\n\t\t\t    const BDCSVD<MatrixType>& referenceSvd)\n{\n  svd_compare_to_full< MatrixType, BDCSVD< MatrixType > >(m, computationOptions, referenceSvd);\n} // end bdcsvd_compare_to_full\n\n\ntemplate<typename MatrixType>\nvoid bdcsvd_solve(const MatrixType& m, unsigned int computationOptions)\n{\n  svd_solve< MatrixType, BDCSVD< MatrixType > >(m, computationOptions);\n} //  end template bdcsvd_solve\n\n\n// test the computations options\ntemplate<typename MatrixType>\nvoid bdcsvd_test_all_computation_options(const MatrixType& m)\n{\n  BDCSVD<MatrixType> fullSvd(m, ComputeFullU|ComputeFullV);\n  svd_test_computation_options_1< MatrixType, BDCSVD< MatrixType > >(m, fullSvd); \n  svd_test_computation_options_2< MatrixType, BDCSVD< MatrixType > >(m, fullSvd); \n} // end bdcsvd_test_all_computation_options\n\n\n// Call a test with all the computations options\ntemplate<typename MatrixType>\nvoid bdcsvd(const MatrixType& a = MatrixType(), bool pickrandom = true)\n{\n  MatrixType m = pickrandom ? MatrixType::Random(a.rows(), a.cols()) : a;\n  bdcsvd_test_all_computation_options<MatrixType>(m);\n} // end template bdcsvd\n\n\n// verify assert\ntemplate<typename MatrixType> \nvoid bdcsvd_verify_assert(const MatrixType& m)\n{\n  svd_verify_assert< MatrixType, BDCSVD< MatrixType > >(m);\n}// end template bdcsvd_verify_assert\n\n\n// test weird values\ntemplate<typename MatrixType>\nvoid bdcsvd_inf_nan()\n{\n  svd_inf_nan< MatrixType, BDCSVD< MatrixType > >();\n}// end template bdcsvd_inf_nan\n\n\n\nvoid bdcsvd_preallocate()\n{\n  svd_preallocate< BDCSVD< MatrixXf > >();\n} // end bdcsvd_preallocate\n\n\n// compare the Singular values returned with Jacobi and Bdc\ntemplate<typename MatrixType> \nvoid compare_bdc_jacobi(const MatrixType& a = MatrixType(), unsigned int computationOptions = 0)\n{\n  std::cout << \"debut compare\" << std::endl;\n  MatrixType m = MatrixType::Random(a.rows(), a.cols());\n  BDCSVD<MatrixType> bdc_svd(m);\n  JacobiSVD<MatrixType> jacobi_svd(m);\n  VERIFY_IS_APPROX(bdc_svd.singularValues(), jacobi_svd.singularValues());\n  if(computationOptions & ComputeFullU)\n    VERIFY_IS_APPROX(bdc_svd.matrixU(), jacobi_svd.matrixU());\n  if(computationOptions & ComputeThinU)\n    VERIFY_IS_APPROX(bdc_svd.matrixU(), jacobi_svd.matrixU());\n  if(computationOptions & ComputeFullV)\n    VERIFY_IS_APPROX(bdc_svd.matrixV(), jacobi_svd.matrixV());\n  if(computationOptions & ComputeThinV)\n    VERIFY_IS_APPROX(bdc_svd.matrixV(), jacobi_svd.matrixV());\n  std::cout << \"fin compare\" << std::endl;\n} // end template compare_bdc_jacobi\n\n\n// call the tests\nvoid test_bdcsvd()\n{\n  // test of Dynamic defined Matrix (42, 42) of float \n  CALL_SUBTEST_11(( bdcsvd_verify_assert<Matrix<float,Dynamic,Dynamic> >\n\t\t    (Matrix<float,Dynamic,Dynamic>(42,42)) ));\n  CALL_SUBTEST_11(( compare_bdc_jacobi<Matrix<float,Dynamic,Dynamic> >\n\t\t    (Matrix<float,Dynamic,Dynamic>(42,42), 0) ));\n  CALL_SUBTEST_11(( bdcsvd<Matrix<float,Dynamic,Dynamic> >\n\t\t    (Matrix<float,Dynamic,Dynamic>(42,42)) ));\n\n  // test of Dynamic defined Matrix (50, 50) of double \n  CALL_SUBTEST_13(( bdcsvd_verify_assert<Matrix<double,Dynamic,Dynamic> >\n\t\t    (Matrix<double,Dynamic,Dynamic>(50,50)) ));\n  CALL_SUBTEST_13(( compare_bdc_jacobi<Matrix<double,Dynamic,Dynamic> >\n\t\t    (Matrix<double,Dynamic,Dynamic>(50,50), 0) ));\n  CALL_SUBTEST_13(( bdcsvd<Matrix<double,Dynamic,Dynamic> >\n\t\t    (Matrix<double,Dynamic,Dynamic>(50, 50)) )); \n\n  // test of Dynamic defined Matrix (22, 22) of complex double\n  CALL_SUBTEST_14(( bdcsvd_verify_assert<Matrix<std::complex<double>,Dynamic,Dynamic> >\n  \t\t    (Matrix<std::complex<double>,Dynamic,Dynamic>(22,22)) ));\n  CALL_SUBTEST_14(( compare_bdc_jacobi<Matrix<std::complex<double>,Dynamic,Dynamic> >\n  \t\t    (Matrix<std::complex<double>, Dynamic, Dynamic> (22,22), 0) ));\n  CALL_SUBTEST_14(( bdcsvd<Matrix<std::complex<double>,Dynamic,Dynamic> >\n  \t\t    (Matrix<std::complex<double>,Dynamic,Dynamic>(22, 22)) )); \n\n  // test of Dynamic defined Matrix (10, 10) of int\n  //CALL_SUBTEST_15(( bdcsvd_verify_assert<Matrix<int,Dynamic,Dynamic> >\n  //\t\t    (Matrix<int,Dynamic,Dynamic>(10,10)) ));\t\t    \n  //CALL_SUBTEST_15(( compare_bdc_jacobi<Matrix<int,Dynamic,Dynamic> >\n  //\t\t    (Matrix<int,Dynamic,Dynamic>(10,10), 0) ));\n  //CALL_SUBTEST_15(( bdcsvd<Matrix<int,Dynamic,Dynamic> >\n  //\t\t    (Matrix<int,Dynamic,Dynamic>(10, 10)) )); \n  \n\n  // test of Dynamic defined Matrix (8, 6) of double \n \n  CALL_SUBTEST_16(( bdcsvd_verify_assert<Matrix<double,Dynamic,Dynamic> >\n\t\t    (Matrix<double,Dynamic,Dynamic>(8,6)) ));\n  CALL_SUBTEST_16(( compare_bdc_jacobi<Matrix<double,Dynamic,Dynamic> >\n\t\t    (Matrix<double,Dynamic,Dynamic>(8, 6), 0) )); \n  CALL_SUBTEST_16(( bdcsvd<Matrix<double,Dynamic,Dynamic> >\n\t\t    (Matrix<double,Dynamic,Dynamic>(8, 6)) ));\n\n\n  \n  // test of Dynamic defined Matrix (36, 12) of float\n  CALL_SUBTEST_17(( compare_bdc_jacobi<Matrix<float,Dynamic,Dynamic> >\n\t\t    (Matrix<float,Dynamic,Dynamic>(36, 12), 0) )); \n  CALL_SUBTEST_17(( bdcsvd<Matrix<float,Dynamic,Dynamic> >\n\t\t    (Matrix<float,Dynamic,Dynamic>(36, 12)) )); \n\n  // test of Dynamic defined Matrix (5, 8) of double \n  CALL_SUBTEST_18(( compare_bdc_jacobi<Matrix<double,Dynamic,Dynamic> >\n\t\t    (Matrix<double,Dynamic,Dynamic>(5, 8), 0) )); \n  CALL_SUBTEST_18(( bdcsvd<Matrix<double,Dynamic,Dynamic> >\n\t\t    (Matrix<double,Dynamic,Dynamic>(5, 8)) )); \n\n\n  // non regression tests\n  CALL_SUBTEST_3(( bdcsvd_verify_assert(Matrix3f()) ));\n  CALL_SUBTEST_4(( bdcsvd_verify_assert(Matrix4d()) ));\n  CALL_SUBTEST_7(( bdcsvd_verify_assert(MatrixXf(10,12)) ));\n  CALL_SUBTEST_8(( bdcsvd_verify_assert(MatrixXcd(7,5)) ));\n\n  // SUBTESTS 1 and 2 on specifics matrix\n  for(int i = 0; i < g_repeat; i++) {\n    Matrix2cd m;\n    m << 0, 1,\n      0, 1;\n    CALL_SUBTEST_1(( bdcsvd(m, false) ));\n    m << 1, 0,\n      1, 0;\n    CALL_SUBTEST_1(( bdcsvd(m, false) ));\n\n    Matrix2d n;\n    n << 0, 0,\n      0, 0;\n    CALL_SUBTEST_2(( bdcsvd(n, false) ));\n    n << 0, 0,\n      0, 1;\n    CALL_SUBTEST_2(( bdcsvd(n, false) ));\n    \n    // Statics matrix don't work with BDSVD yet\n    // bdc algo on a random 3x3 float matrix\n    // CALL_SUBTEST_3(( bdcsvd<Matrix3f>() ));\n    // bdc algo on a random 4x4 double matrix\n    // CALL_SUBTEST_4(( bdcsvd<Matrix4d>() ));\n    // bdc algo on a random 3x5 float matrix\n    // CALL_SUBTEST_5(( bdcsvd<Matrix<float,3,5> >() ));\n\n    int r = internal::random<int>(1, 30),\n      c = internal::random<int>(1, 30);\n    CALL_SUBTEST_7(( bdcsvd<MatrixXf>(MatrixXf(r,c)) ));\n    CALL_SUBTEST_8(( bdcsvd<MatrixXcd>(MatrixXcd(r,c)) ));\n    (void) r;\n    (void) c;\n\n    // Test on inf/nan matrix\n    CALL_SUBTEST_7( bdcsvd_inf_nan<MatrixXf>() );\n  }\n\n  CALL_SUBTEST_7(( bdcsvd<MatrixXf>(MatrixXf(internal::random<int>(EIGEN_TEST_MAX_SIZE/4, EIGEN_TEST_MAX_SIZE/2), internal::random<int>(EIGEN_TEST_MAX_SIZE/4, EIGEN_TEST_MAX_SIZE/2))) ));\n  CALL_SUBTEST_8(( bdcsvd<MatrixXcd>(MatrixXcd(internal::random<int>(EIGEN_TEST_MAX_SIZE/4, EIGEN_TEST_MAX_SIZE/3), internal::random<int>(EIGEN_TEST_MAX_SIZE/4, EIGEN_TEST_MAX_SIZE/3))) ));\n\n  // Test problem size constructors\n  CALL_SUBTEST_7( BDCSVD<MatrixXf>(10,10) );\n\n} // end test_bdcsvd\n"
  },
  {
    "path": "libs/eigen/unsupported/test/dgmres.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2011 Gael Guennebaud <g.gael@free.fr>\n// Copyright (C) 2012 desire Nuentsa <desire.nuentsa_wakam@inria.fr\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"../../test/sparse_solver.h\"\n#include <Eigen/src/IterativeSolvers/DGMRES.h>\n\ntemplate<typename T> void test_dgmres_T()\n{\n  DGMRES<SparseMatrix<T>, DiagonalPreconditioner<T> > dgmres_colmajor_diag;\n  DGMRES<SparseMatrix<T>, IdentityPreconditioner    > dgmres_colmajor_I;\n  DGMRES<SparseMatrix<T>, IncompleteLUT<T> >           dgmres_colmajor_ilut;\n  //GMRES<SparseMatrix<T>, SSORPreconditioner<T> >     dgmres_colmajor_ssor;\n\n  CALL_SUBTEST( check_sparse_square_solving(dgmres_colmajor_diag)  );\n//   CALL_SUBTEST( check_sparse_square_solving(dgmres_colmajor_I)     );\n  CALL_SUBTEST( check_sparse_square_solving(dgmres_colmajor_ilut)     );\n  //CALL_SUBTEST( check_sparse_square_solving(dgmres_colmajor_ssor)     );\n}\n\nvoid test_dgmres()\n{\n  CALL_SUBTEST_1(test_dgmres_T<double>());\n  CALL_SUBTEST_2(test_dgmres_T<std::complex<double> >());\n}\n"
  },
  {
    "path": "libs/eigen/unsupported/test/forward_adolc.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <Eigen/Dense>\n\n#define NUMBER_DIRECTIONS 16\n#include <unsupported/Eigen/AdolcForward>\n\nint adtl::ADOLC_numDir;\n\ntemplate<typename Vector>\nEIGEN_DONT_INLINE typename Vector::Scalar foo(const Vector& p)\n{\n  typedef typename Vector::Scalar Scalar;\n  return (p-Vector(Scalar(-1),Scalar(1.))).norm() + (p.array().sqrt().abs() * p.array().sin()).sum() + p.dot(p);\n}\n\ntemplate<typename _Scalar, int NX=Dynamic, int NY=Dynamic>\nstruct TestFunc1\n{\n  typedef _Scalar Scalar;\n  enum {\n    InputsAtCompileTime = NX,\n    ValuesAtCompileTime = NY\n  };\n  typedef Matrix<Scalar,InputsAtCompileTime,1> InputType;\n  typedef Matrix<Scalar,ValuesAtCompileTime,1> ValueType;\n  typedef Matrix<Scalar,ValuesAtCompileTime,InputsAtCompileTime> JacobianType;\n\n  int m_inputs, m_values;\n\n  TestFunc1() : m_inputs(InputsAtCompileTime), m_values(ValuesAtCompileTime) {}\n  TestFunc1(int inputs, int values) : m_inputs(inputs), m_values(values) {}\n\n  int inputs() const { return m_inputs; }\n  int values() const { return m_values; }\n\n  template<typename T>\n  void operator() (const Matrix<T,InputsAtCompileTime,1>& x, Matrix<T,ValuesAtCompileTime,1>* _v) const\n  {\n    Matrix<T,ValuesAtCompileTime,1>& v = *_v;\n\n    v[0] = 2 * x[0] * x[0] + x[0] * x[1];\n    v[1] = 3 * x[1] * x[0] + 0.5 * x[1] * x[1];\n    if(inputs()>2)\n    {\n      v[0] += 0.5 * x[2];\n      v[1] += x[2];\n    }\n    if(values()>2)\n    {\n      v[2] = 3 * x[1] * x[0] * x[0];\n    }\n    if (inputs()>2 && values()>2)\n      v[2] *= x[2];\n  }\n\n  void operator() (const InputType& x, ValueType* v, JacobianType* _j) const\n  {\n    (*this)(x, v);\n\n    if(_j)\n    {\n      JacobianType& j = *_j;\n\n      j(0,0) = 4 * x[0] + x[1];\n      j(1,0) = 3 * x[1];\n\n      j(0,1) = x[0];\n      j(1,1) = 3 * x[0] + 2 * 0.5 * x[1];\n\n      if (inputs()>2)\n      {\n        j(0,2) = 0.5;\n        j(1,2) = 1;\n      }\n      if(values()>2)\n      {\n        j(2,0) = 3 * x[1] * 2 * x[0];\n        j(2,1) = 3 * x[0] * x[0];\n      }\n      if (inputs()>2 && values()>2)\n      {\n        j(2,0) *= x[2];\n        j(2,1) *= x[2];\n\n        j(2,2) = 3 * x[1] * x[0] * x[0];\n        j(2,2) = 3 * x[1] * x[0] * x[0];\n      }\n    }\n  }\n};\n\ntemplate<typename Func> void adolc_forward_jacobian(const Func& f)\n{\n    typename Func::InputType x = Func::InputType::Random(f.inputs());\n    typename Func::ValueType y(f.values()), yref(f.values());\n    typename Func::JacobianType j(f.values(),f.inputs()), jref(f.values(),f.inputs());\n\n    jref.setZero();\n    yref.setZero();\n    f(x,&yref,&jref);\n//     std::cerr << y.transpose() << \"\\n\\n\";;\n//     std::cerr << j << \"\\n\\n\";;\n\n    j.setZero();\n    y.setZero();\n    AdolcForwardJacobian<Func> autoj(f);\n    autoj(x, &y, &j);\n//     std::cerr << y.transpose() << \"\\n\\n\";;\n//     std::cerr << j << \"\\n\\n\";;\n\n    VERIFY_IS_APPROX(y, yref);\n    VERIFY_IS_APPROX(j, jref);\n}\n\nvoid test_forward_adolc()\n{\n  adtl::ADOLC_numDir = NUMBER_DIRECTIONS;\n\n  for(int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST(( adolc_forward_jacobian(TestFunc1<double,2,2>()) ));\n    CALL_SUBTEST(( adolc_forward_jacobian(TestFunc1<double,2,3>()) ));\n    CALL_SUBTEST(( adolc_forward_jacobian(TestFunc1<double,3,2>()) ));\n    CALL_SUBTEST(( adolc_forward_jacobian(TestFunc1<double,3,3>()) ));\n    CALL_SUBTEST(( adolc_forward_jacobian(TestFunc1<double>(3,3)) ));\n  }\n\n  {\n    // simple instanciation tests\n    Matrix<adtl::adouble,2,1> x;\n    foo(x);\n    Matrix<adtl::adouble,Dynamic,Dynamic> A(4,4);;\n    A.selfadjointView<Lower>().eigenvalues();\n  }\n}\n"
  },
  {
    "path": "libs/eigen/unsupported/test/gmres.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2011 Gael Guennebaud <g.gael@free.fr>\n// Copyright (C) 2012 Kolja Brix <brix@igpm.rwth-aaachen.de>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"../../test/sparse_solver.h\"\n#include <Eigen/IterativeSolvers>\n\ntemplate<typename T> void test_gmres_T()\n{\n  GMRES<SparseMatrix<T>, DiagonalPreconditioner<T> > gmres_colmajor_diag;\n  GMRES<SparseMatrix<T>, IdentityPreconditioner    > gmres_colmajor_I;\n  GMRES<SparseMatrix<T>, IncompleteLUT<T> >           gmres_colmajor_ilut;\n  //GMRES<SparseMatrix<T>, SSORPreconditioner<T> >     gmres_colmajor_ssor;\n\n  CALL_SUBTEST( check_sparse_square_solving(gmres_colmajor_diag)  );\n//   CALL_SUBTEST( check_sparse_square_solving(gmres_colmajor_I)     );\n  CALL_SUBTEST( check_sparse_square_solving(gmres_colmajor_ilut)     );\n  //CALL_SUBTEST( check_sparse_square_solving(gmres_colmajor_ssor)     );\n}\n\nvoid test_gmres()\n{\n  CALL_SUBTEST_1(test_gmres_T<double>());\n  CALL_SUBTEST_2(test_gmres_T<std::complex<double> >());\n}\n"
  },
  {
    "path": "libs/eigen/unsupported/test/jacobisvd.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"svd_common.h\"\n\ntemplate<typename MatrixType, int QRPreconditioner>\nvoid jacobisvd_check_full(const MatrixType& m, const JacobiSVD<MatrixType, QRPreconditioner>& svd)\n{\n  svd_check_full<MatrixType, JacobiSVD<MatrixType, QRPreconditioner > >(m, svd);\n}\n\ntemplate<typename MatrixType, int QRPreconditioner>\nvoid jacobisvd_compare_to_full(const MatrixType& m,\n                               unsigned int computationOptions,\n                               const JacobiSVD<MatrixType, QRPreconditioner>& referenceSvd)\n{\n  svd_compare_to_full<MatrixType, JacobiSVD<MatrixType, QRPreconditioner> >(m, computationOptions, referenceSvd);\n}\n\n\ntemplate<typename MatrixType, int QRPreconditioner>\nvoid jacobisvd_solve(const MatrixType& m, unsigned int computationOptions)\n{\n  svd_solve< MatrixType, JacobiSVD< MatrixType, QRPreconditioner > >(m, computationOptions);\n}\n\n\n\ntemplate<typename MatrixType, int QRPreconditioner>\nvoid jacobisvd_test_all_computation_options(const MatrixType& m)\n{\n  \n  if (QRPreconditioner == NoQRPreconditioner && m.rows() != m.cols())\n    return;\n\n  JacobiSVD< MatrixType, QRPreconditioner > fullSvd(m, ComputeFullU|ComputeFullV);\n  svd_test_computation_options_1< MatrixType, JacobiSVD< MatrixType, QRPreconditioner > >(m, fullSvd);\n\n  if(QRPreconditioner == FullPivHouseholderQRPreconditioner)\n    return;\n  svd_test_computation_options_2< MatrixType, JacobiSVD< MatrixType, QRPreconditioner > >(m, fullSvd);\n\n}\n\ntemplate<typename MatrixType>\nvoid jacobisvd(const MatrixType& a = MatrixType(), bool pickrandom = true)\n{\n  MatrixType m = pickrandom ? MatrixType::Random(a.rows(), a.cols()) : a;\n\n  jacobisvd_test_all_computation_options<MatrixType, FullPivHouseholderQRPreconditioner>(m);\n  jacobisvd_test_all_computation_options<MatrixType, ColPivHouseholderQRPreconditioner>(m);\n  jacobisvd_test_all_computation_options<MatrixType, HouseholderQRPreconditioner>(m);\n  jacobisvd_test_all_computation_options<MatrixType, NoQRPreconditioner>(m);\n}\n\n\ntemplate<typename MatrixType> \nvoid jacobisvd_verify_assert(const MatrixType& m)\n{\n  \n  svd_verify_assert<MatrixType, JacobiSVD< MatrixType > >(m);\n\n  typedef typename MatrixType::Index Index;\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  enum {\n    RowsAtCompileTime = MatrixType::RowsAtCompileTime,\n    ColsAtCompileTime = MatrixType::ColsAtCompileTime\n  };\n\n  MatrixType a = MatrixType::Zero(rows, cols);\n  a.setZero();\n\n  if (ColsAtCompileTime == Dynamic)\n  {\n    JacobiSVD<MatrixType, FullPivHouseholderQRPreconditioner> svd_fullqr;\n    VERIFY_RAISES_ASSERT(svd_fullqr.compute(a, ComputeFullU|ComputeThinV))\n    VERIFY_RAISES_ASSERT(svd_fullqr.compute(a, ComputeThinU|ComputeThinV))\n    VERIFY_RAISES_ASSERT(svd_fullqr.compute(a, ComputeThinU|ComputeFullV))\n  }\n}\n\ntemplate<typename MatrixType>\nvoid jacobisvd_method()\n{\n  enum { Size = MatrixType::RowsAtCompileTime };\n  typedef typename MatrixType::RealScalar RealScalar;\n  typedef Matrix<RealScalar, Size, 1> RealVecType;\n  MatrixType m = MatrixType::Identity();\n  VERIFY_IS_APPROX(m.jacobiSvd().singularValues(), RealVecType::Ones());\n  VERIFY_RAISES_ASSERT(m.jacobiSvd().matrixU());\n  VERIFY_RAISES_ASSERT(m.jacobiSvd().matrixV());\n  VERIFY_IS_APPROX(m.jacobiSvd(ComputeFullU|ComputeFullV).solve(m), m);\n}\n\n\n\ntemplate<typename MatrixType>\nvoid jacobisvd_inf_nan()\n{\n  svd_inf_nan<MatrixType, JacobiSVD< MatrixType > >();\n}\n\n\n// Regression test for bug 286: JacobiSVD loops indefinitely with some\n// matrices containing denormal numbers.\nvoid jacobisvd_bug286()\n{\n#if defined __INTEL_COMPILER\n// shut up warning #239: floating point underflow\n#pragma warning push\n#pragma warning disable 239\n#endif\n  Matrix2d M;\n  M << -7.90884e-313, -4.94e-324,\n                 0, 5.60844e-313;\n#if defined __INTEL_COMPILER\n#pragma warning pop\n#endif\n  JacobiSVD<Matrix2d> svd;\n  svd.compute(M); // just check we don't loop indefinitely\n}\n\n\nvoid jacobisvd_preallocate()\n{\n  svd_preallocate< JacobiSVD <MatrixXf> >();\n}\n\nvoid test_jacobisvd()\n{\n  CALL_SUBTEST_11(( jacobisvd<Matrix<double,Dynamic,Dynamic> >\n\t\t    (Matrix<double,Dynamic,Dynamic>(16, 6)) ));\n\n  CALL_SUBTEST_3(( jacobisvd_verify_assert(Matrix3f()) ));\n  CALL_SUBTEST_4(( jacobisvd_verify_assert(Matrix4d()) ));\n  CALL_SUBTEST_7(( jacobisvd_verify_assert(MatrixXf(10,12)) ));\n  CALL_SUBTEST_8(( jacobisvd_verify_assert(MatrixXcd(7,5)) ));\n\n  for(int i = 0; i < g_repeat; i++) {\n    Matrix2cd m;\n    m << 0, 1,\n         0, 1;\n    CALL_SUBTEST_1(( jacobisvd(m, false) ));\n    m << 1, 0,\n         1, 0;\n    CALL_SUBTEST_1(( jacobisvd(m, false) ));\n\n    Matrix2d n;\n    n << 0, 0,\n         0, 0;\n    CALL_SUBTEST_2(( jacobisvd(n, false) ));\n    n << 0, 0,\n         0, 1;\n    CALL_SUBTEST_2(( jacobisvd(n, false) ));\n    \n    CALL_SUBTEST_3(( jacobisvd<Matrix3f>() ));\n    CALL_SUBTEST_4(( jacobisvd<Matrix4d>() ));\n    CALL_SUBTEST_5(( jacobisvd<Matrix<float,3,5> >() ));\n    CALL_SUBTEST_6(( jacobisvd<Matrix<double,Dynamic,2> >(Matrix<double,Dynamic,2>(10,2)) ));\n\n    int r = internal::random<int>(1, 30),\n        c = internal::random<int>(1, 30);\n    CALL_SUBTEST_7(( jacobisvd<MatrixXf>(MatrixXf(r,c)) ));\n    CALL_SUBTEST_8(( jacobisvd<MatrixXcd>(MatrixXcd(r,c)) ));\n    (void) r;\n    (void) c;\n\n    // Test on inf/nan matrix\n    CALL_SUBTEST_7( jacobisvd_inf_nan<MatrixXf>() );\n  }\n\n  CALL_SUBTEST_7(( jacobisvd<MatrixXf>(MatrixXf(internal::random<int>(EIGEN_TEST_MAX_SIZE/4, EIGEN_TEST_MAX_SIZE/2), internal::random<int>(EIGEN_TEST_MAX_SIZE/4, EIGEN_TEST_MAX_SIZE/2))) ));\n  CALL_SUBTEST_8(( jacobisvd<MatrixXcd>(MatrixXcd(internal::random<int>(EIGEN_TEST_MAX_SIZE/4, EIGEN_TEST_MAX_SIZE/3), internal::random<int>(EIGEN_TEST_MAX_SIZE/4, EIGEN_TEST_MAX_SIZE/3))) ));\n\n\n  // test matrixbase method\n  CALL_SUBTEST_1(( jacobisvd_method<Matrix2cd>() ));\n  CALL_SUBTEST_3(( jacobisvd_method<Matrix3f>() ));\n\n\n  // Test problem size constructors\n  CALL_SUBTEST_7( JacobiSVD<MatrixXf>(10,10) );\n\n  // Check that preallocation avoids subsequent mallocs\n  CALL_SUBTEST_9( jacobisvd_preallocate() );\n\n  // Regression check for bug 286\n  CALL_SUBTEST_2( jacobisvd_bug286() );\n}\n"
  },
  {
    "path": "libs/eigen/unsupported/test/kronecker_product.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2011 Kolja Brix <brix@igpm.rwth-aachen.de>\n// Copyright (C) 2011 Andreas Platen <andiplaten@gmx.de>\n// Copyright (C) 2012 Chen-Pang He <jdh8@ms63.hinet.net>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n#include \"sparse.h\"\n#include <Eigen/SparseExtra>\n#include <Eigen/KroneckerProduct>\n\n\ntemplate<typename MatrixType>\nvoid check_dimension(const MatrixType& ab, const int rows,  const int cols)\n{\n  VERIFY_IS_EQUAL(ab.rows(), rows);\n  VERIFY_IS_EQUAL(ab.cols(), cols);\n}\n\n\ntemplate<typename MatrixType>\nvoid check_kronecker_product(const MatrixType& ab)\n{\n  VERIFY_IS_EQUAL(ab.rows(), 6);\n  VERIFY_IS_EQUAL(ab.cols(), 6);\n  VERIFY_IS_EQUAL(ab.nonZeros(),  36);\n  VERIFY_IS_APPROX(ab.coeff(0,0), -0.4017367630386106);\n  VERIFY_IS_APPROX(ab.coeff(0,1),  0.1056863433932735);\n  VERIFY_IS_APPROX(ab.coeff(0,2), -0.7255206194554212);\n  VERIFY_IS_APPROX(ab.coeff(0,3),  0.1908653336744706);\n  VERIFY_IS_APPROX(ab.coeff(0,4),  0.350864567234111);\n  VERIFY_IS_APPROX(ab.coeff(0,5), -0.0923032108308013);\n  VERIFY_IS_APPROX(ab.coeff(1,0),  0.415417514804677);\n  VERIFY_IS_APPROX(ab.coeff(1,1), -0.2369227701722048);\n  VERIFY_IS_APPROX(ab.coeff(1,2),  0.7502275131458511);\n  VERIFY_IS_APPROX(ab.coeff(1,3), -0.4278731019742696);\n  VERIFY_IS_APPROX(ab.coeff(1,4), -0.3628129162264507);\n  VERIFY_IS_APPROX(ab.coeff(1,5),  0.2069210808481275);\n  VERIFY_IS_APPROX(ab.coeff(2,0),  0.05465890160863986);\n  VERIFY_IS_APPROX(ab.coeff(2,1), -0.2634092511419858);\n  VERIFY_IS_APPROX(ab.coeff(2,2),  0.09871180285793758);\n  VERIFY_IS_APPROX(ab.coeff(2,3), -0.4757066334017702);\n  VERIFY_IS_APPROX(ab.coeff(2,4), -0.04773740823058334);\n  VERIFY_IS_APPROX(ab.coeff(2,5),  0.2300535609645254);\n  VERIFY_IS_APPROX(ab.coeff(3,0), -0.8172945853260133);\n  VERIFY_IS_APPROX(ab.coeff(3,1),  0.2150086428359221);\n  VERIFY_IS_APPROX(ab.coeff(3,2),  0.5825113847292743);\n  VERIFY_IS_APPROX(ab.coeff(3,3), -0.1532433770097174);\n  VERIFY_IS_APPROX(ab.coeff(3,4), -0.329383387282399);\n  VERIFY_IS_APPROX(ab.coeff(3,5),  0.08665207912033064);\n  VERIFY_IS_APPROX(ab.coeff(4,0),  0.8451267514863225);\n  VERIFY_IS_APPROX(ab.coeff(4,1), -0.481996458918977);\n  VERIFY_IS_APPROX(ab.coeff(4,2), -0.6023482390791535);\n  VERIFY_IS_APPROX(ab.coeff(4,3),  0.3435339347164565);\n  VERIFY_IS_APPROX(ab.coeff(4,4),  0.3406002157428891);\n  VERIFY_IS_APPROX(ab.coeff(4,5), -0.1942526344200915);\n  VERIFY_IS_APPROX(ab.coeff(5,0),  0.1111982482925399);\n  VERIFY_IS_APPROX(ab.coeff(5,1), -0.5358806424754169);\n  VERIFY_IS_APPROX(ab.coeff(5,2), -0.07925446559335647);\n  VERIFY_IS_APPROX(ab.coeff(5,3),  0.3819388757769038);\n  VERIFY_IS_APPROX(ab.coeff(5,4),  0.04481475387219876);\n  VERIFY_IS_APPROX(ab.coeff(5,5), -0.2159688616158057);\n}\n\n\ntemplate<typename MatrixType>\nvoid check_sparse_kronecker_product(const MatrixType& ab)\n{\n  VERIFY_IS_EQUAL(ab.rows(), 12);\n  VERIFY_IS_EQUAL(ab.cols(), 10);\n  VERIFY_IS_EQUAL(ab.nonZeros(), 3*2);\n  VERIFY_IS_APPROX(ab.coeff(3,0), -0.04);\n  VERIFY_IS_APPROX(ab.coeff(5,1),  0.05);\n  VERIFY_IS_APPROX(ab.coeff(0,6), -0.08);\n  VERIFY_IS_APPROX(ab.coeff(2,7),  0.10);\n  VERIFY_IS_APPROX(ab.coeff(6,8),  0.12);\n  VERIFY_IS_APPROX(ab.coeff(8,9), -0.15);\n}\n\n\nvoid test_kronecker_product()\n{\n  // DM = dense matrix; SM = sparse matrix\n\n  Matrix<double, 2, 3> DM_a;\n  SparseMatrix<double> SM_a(2,3);\n  SM_a.insert(0,0) = DM_a.coeffRef(0,0) = -0.4461540300782201;\n  SM_a.insert(0,1) = DM_a.coeffRef(0,1) = -0.8057364375283049;\n  SM_a.insert(0,2) = DM_a.coeffRef(0,2) =  0.3896572459516341;\n  SM_a.insert(1,0) = DM_a.coeffRef(1,0) = -0.9076572187376921;\n  SM_a.insert(1,1) = DM_a.coeffRef(1,1) =  0.6469156566545853;\n  SM_a.insert(1,2) = DM_a.coeffRef(1,2) = -0.3658010398782789;\n \n  MatrixXd             DM_b(3,2);\n  SparseMatrix<double> SM_b(3,2);\n  SM_b.insert(0,0) = DM_b.coeffRef(0,0) =  0.9004440976767099;\n  SM_b.insert(0,1) = DM_b.coeffRef(0,1) = -0.2368830858139832;\n  SM_b.insert(1,0) = DM_b.coeffRef(1,0) = -0.9311078389941825;\n  SM_b.insert(1,1) = DM_b.coeffRef(1,1) =  0.5310335762980047;\n  SM_b.insert(2,0) = DM_b.coeffRef(2,0) = -0.1225112806872035;\n  SM_b.insert(2,1) = DM_b.coeffRef(2,1) =  0.5903998022741264;\n\n  SparseMatrix<double,RowMajor> SM_row_a(SM_a), SM_row_b(SM_b);\n\n  // test kroneckerProduct(DM_block,DM,DM_fixedSize)\n  Matrix<double, 6, 6> DM_fix_ab = kroneckerProduct(DM_a.topLeftCorner<2,3>(),DM_b);\n\n  CALL_SUBTEST(check_kronecker_product(DM_fix_ab));\n\n  for(int i=0;i<DM_fix_ab.rows();++i)\n    for(int j=0;j<DM_fix_ab.cols();++j)\n       VERIFY_IS_APPROX(kroneckerProduct(DM_a,DM_b).coeff(i,j), DM_fix_ab(i,j));\n\n  // test kroneckerProduct(DM,DM,DM_block)\n  MatrixXd DM_block_ab(10,15);\n  DM_block_ab.block<6,6>(2,5) = kroneckerProduct(DM_a,DM_b);\n  CALL_SUBTEST(check_kronecker_product(DM_block_ab.block<6,6>(2,5)));\n\n  // test kroneckerProduct(DM,DM,DM)\n  MatrixXd DM_ab = kroneckerProduct(DM_a,DM_b);\n  CALL_SUBTEST(check_kronecker_product(DM_ab));\n\n  // test kroneckerProduct(SM,DM,SM)\n  SparseMatrix<double> SM_ab = kroneckerProduct(SM_a,DM_b);\n  CALL_SUBTEST(check_kronecker_product(SM_ab));\n  SparseMatrix<double,RowMajor> SM_ab2 = kroneckerProduct(SM_a,DM_b);\n  CALL_SUBTEST(check_kronecker_product(SM_ab2));\n\n  // test kroneckerProduct(DM,SM,SM)\n  SM_ab.setZero();\n  SM_ab.insert(0,0)=37.0;\n  SM_ab = kroneckerProduct(DM_a,SM_b);\n  CALL_SUBTEST(check_kronecker_product(SM_ab));\n  SM_ab2.setZero();\n  SM_ab2.insert(0,0)=37.0;\n  SM_ab2 = kroneckerProduct(DM_a,SM_b);\n  CALL_SUBTEST(check_kronecker_product(SM_ab2));\n\n  // test kroneckerProduct(SM,SM,SM)\n  SM_ab.resize(2,33);\n  SM_ab.insert(0,0)=37.0;\n  SM_ab = kroneckerProduct(SM_a,SM_b);\n  CALL_SUBTEST(check_kronecker_product(SM_ab));\n  SM_ab2.resize(5,11);\n  SM_ab2.insert(0,0)=37.0;\n  SM_ab2 = kroneckerProduct(SM_a,SM_b);\n  CALL_SUBTEST(check_kronecker_product(SM_ab2));\n\n  // test kroneckerProduct(SM,SM,SM) with sparse pattern\n  SM_a.resize(4,5);\n  SM_b.resize(3,2);\n  SM_a.resizeNonZeros(0);\n  SM_b.resizeNonZeros(0);\n  SM_a.insert(1,0) = -0.1;\n  SM_a.insert(0,3) = -0.2;\n  SM_a.insert(2,4) =  0.3;\n  SM_a.finalize();\n  \n  SM_b.insert(0,0) =  0.4;\n  SM_b.insert(2,1) = -0.5;\n  SM_b.finalize();\n  SM_ab.resize(1,1);\n  SM_ab.insert(0,0)=37.0;\n  SM_ab = kroneckerProduct(SM_a,SM_b);\n  CALL_SUBTEST(check_sparse_kronecker_product(SM_ab));\n\n  // test dimension of result of kroneckerProduct(DM,DM,DM)\n  MatrixXd DM_a2(2,1);\n  MatrixXd DM_b2(5,4);\n  MatrixXd DM_ab2 = kroneckerProduct(DM_a2,DM_b2);\n  CALL_SUBTEST(check_dimension(DM_ab2,2*5,1*4));\n  DM_a2.resize(10,9);\n  DM_b2.resize(4,8);\n  DM_ab2 = kroneckerProduct(DM_a2,DM_b2);\n  CALL_SUBTEST(check_dimension(DM_ab2,10*4,9*8));\n}\n"
  },
  {
    "path": "libs/eigen/unsupported/test/levenberg_marquardt.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Thomas Capricelli <orzel@freehackers.org>\n// Copyright (C) 2012 desire Nuentsa <desire.nuentsa_wakam@inria.fr\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n#include <stdio.h>\n\n#include \"main.h\"\n#include <unsupported/Eigen/LevenbergMarquardt>\n\n// This disables some useless Warnings on MSVC.\n// It is intended to be done for this test only.\n#include <Eigen/src/Core/util/DisableStupidWarnings.h>\n\nusing std::sqrt;\n\nstruct lmder_functor : DenseFunctor<double>\n{\n    lmder_functor(void): DenseFunctor<double>(3,15) {}\n    int operator()(const VectorXd &x, VectorXd &fvec) const\n    {\n        double tmp1, tmp2, tmp3;\n        static const double y[15] = {1.4e-1, 1.8e-1, 2.2e-1, 2.5e-1, 2.9e-1, 3.2e-1, 3.5e-1,\n            3.9e-1, 3.7e-1, 5.8e-1, 7.3e-1, 9.6e-1, 1.34, 2.1, 4.39};\n\n        for (int i = 0; i < values(); i++)\n        {\n            tmp1 = i+1;\n            tmp2 = 16 - i - 1;\n            tmp3 = (i>=8)? tmp2 : tmp1;\n            fvec[i] = y[i] - (x[0] + tmp1/(x[1]*tmp2 + x[2]*tmp3));\n        }\n        return 0;\n    }\n\n    int df(const VectorXd &x, MatrixXd &fjac) const\n    {\n        double tmp1, tmp2, tmp3, tmp4;\n        for (int i = 0; i < values(); i++)\n        {\n            tmp1 = i+1;\n            tmp2 = 16 - i - 1;\n            tmp3 = (i>=8)? tmp2 : tmp1;\n            tmp4 = (x[1]*tmp2 + x[2]*tmp3); tmp4 = tmp4*tmp4;\n            fjac(i,0) = -1;\n            fjac(i,1) = tmp1*tmp2/tmp4;\n            fjac(i,2) = tmp1*tmp3/tmp4;\n        }\n        return 0;\n    }\n};\n\nvoid testLmder1()\n{\n  int n=3, info;\n\n  VectorXd x;\n\n  /* the following starting values provide a rough fit. */\n  x.setConstant(n, 1.);\n\n  // do the computation\n  lmder_functor functor;\n  LevenbergMarquardt<lmder_functor> lm(functor);\n  info = lm.lmder1(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev(), 6);\n  VERIFY_IS_EQUAL(lm.njev(), 5);\n\n  // check norm\n  VERIFY_IS_APPROX(lm.fvec().blueNorm(), 0.09063596);\n\n  // check x\n  VectorXd x_ref(n);\n  x_ref << 0.08241058, 1.133037, 2.343695;\n  VERIFY_IS_APPROX(x, x_ref);\n}\n\nvoid testLmder()\n{\n  const int m=15, n=3;\n  int info;\n  double fnorm, covfac;\n  VectorXd x;\n\n  /* the following starting values provide a rough fit. */\n  x.setConstant(n, 1.);\n\n  // do the computation\n  lmder_functor functor;\n  LevenbergMarquardt<lmder_functor> lm(functor);\n  info = lm.minimize(x);\n\n  // check return values\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev(), 6);\n  VERIFY_IS_EQUAL(lm.njev(), 5);\n\n  // check norm\n  fnorm = lm.fvec().blueNorm();\n  VERIFY_IS_APPROX(fnorm, 0.09063596);\n\n  // check x\n  VectorXd x_ref(n);\n  x_ref << 0.08241058, 1.133037, 2.343695;\n  VERIFY_IS_APPROX(x, x_ref);\n\n  // check covariance\n  covfac = fnorm*fnorm/(m-n);\n  internal::covar(lm.matrixR(), lm.permutation().indices()); // TODO : move this as a function of lm\n\n  MatrixXd cov_ref(n,n);\n  cov_ref <<\n      0.0001531202,   0.002869941,  -0.002656662,\n      0.002869941,    0.09480935,   -0.09098995,\n      -0.002656662,   -0.09098995,    0.08778727;\n\n//  std::cout << fjac*covfac << std::endl;\n\n  MatrixXd cov;\n  cov =  covfac*lm.matrixR().topLeftCorner<n,n>();\n  VERIFY_IS_APPROX( cov, cov_ref);\n  // TODO: why isn't this allowed ? :\n  // VERIFY_IS_APPROX( covfac*fjac.topLeftCorner<n,n>() , cov_ref);\n}\n\nstruct lmdif_functor : DenseFunctor<double>\n{\n    lmdif_functor(void) : DenseFunctor<double>(3,15) {}\n    int operator()(const VectorXd &x, VectorXd &fvec) const\n    {\n        int i;\n        double tmp1,tmp2,tmp3;\n        static const double y[15]={1.4e-1,1.8e-1,2.2e-1,2.5e-1,2.9e-1,3.2e-1,3.5e-1,3.9e-1,\n            3.7e-1,5.8e-1,7.3e-1,9.6e-1,1.34e0,2.1e0,4.39e0};\n\n        assert(x.size()==3);\n        assert(fvec.size()==15);\n        for (i=0; i<15; i++)\n        {\n            tmp1 = i+1;\n            tmp2 = 15 - i;\n            tmp3 = tmp1;\n\n            if (i >= 8) tmp3 = tmp2;\n            fvec[i] = y[i] - (x[0] + tmp1/(x[1]*tmp2 + x[2]*tmp3));\n        }\n        return 0;\n    }\n};\n\nvoid testLmdif1()\n{\n  const int n=3;\n  int info;\n\n  VectorXd x(n), fvec(15);\n\n  /* the following starting values provide a rough fit. */\n  x.setConstant(n, 1.);\n\n  // do the computation\n  lmdif_functor functor;\n  DenseIndex nfev;\n  info = LevenbergMarquardt<lmdif_functor>::lmdif1(functor, x, &nfev);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n//   VERIFY_IS_EQUAL(nfev, 26);\n\n  // check norm\n  functor(x, fvec);\n  VERIFY_IS_APPROX(fvec.blueNorm(), 0.09063596);\n\n  // check x\n  VectorXd x_ref(n);\n  x_ref << 0.0824106, 1.1330366, 2.3436947;\n  VERIFY_IS_APPROX(x, x_ref);\n\n}\n\nvoid testLmdif()\n{\n  const int m=15, n=3;\n  int info;\n  double fnorm, covfac;\n  VectorXd x(n);\n\n  /* the following starting values provide a rough fit. */\n  x.setConstant(n, 1.);\n\n  // do the computation\n  lmdif_functor functor;\n  NumericalDiff<lmdif_functor> numDiff(functor);\n  LevenbergMarquardt<NumericalDiff<lmdif_functor> > lm(numDiff);\n  info = lm.minimize(x);\n\n  // check return values\n  VERIFY_IS_EQUAL(info, 1);\n//   VERIFY_IS_EQUAL(lm.nfev(), 26);\n\n  // check norm\n  fnorm = lm.fvec().blueNorm();\n  VERIFY_IS_APPROX(fnorm, 0.09063596);\n\n  // check x\n  VectorXd x_ref(n);\n  x_ref << 0.08241058, 1.133037, 2.343695;\n  VERIFY_IS_APPROX(x, x_ref);\n\n  // check covariance\n  covfac = fnorm*fnorm/(m-n);\n  internal::covar(lm.matrixR(), lm.permutation().indices()); // TODO : move this as a function of lm\n\n  MatrixXd cov_ref(n,n);\n  cov_ref <<\n      0.0001531202,   0.002869942,  -0.002656662,\n      0.002869942,    0.09480937,   -0.09098997,\n      -0.002656662,   -0.09098997,    0.08778729;\n\n//  std::cout << fjac*covfac << std::endl;\n\n  MatrixXd cov;\n  cov =  covfac*lm.matrixR().topLeftCorner<n,n>();\n  VERIFY_IS_APPROX( cov, cov_ref);\n  // TODO: why isn't this allowed ? :\n  // VERIFY_IS_APPROX( covfac*fjac.topLeftCorner<n,n>() , cov_ref);\n}\n\nstruct chwirut2_functor : DenseFunctor<double>\n{\n    chwirut2_functor(void) : DenseFunctor<double>(3,54) {}\n    static const double m_x[54];\n    static const double m_y[54];\n    int operator()(const VectorXd &b, VectorXd &fvec)\n    {\n        int i;\n\n        assert(b.size()==3);\n        assert(fvec.size()==54);\n        for(i=0; i<54; i++) {\n            double x = m_x[i];\n            fvec[i] = exp(-b[0]*x)/(b[1]+b[2]*x) - m_y[i];\n        }\n        return 0;\n    }\n    int df(const VectorXd &b, MatrixXd &fjac)\n    {\n        assert(b.size()==3);\n        assert(fjac.rows()==54);\n        assert(fjac.cols()==3);\n        for(int i=0; i<54; i++) {\n            double x = m_x[i];\n            double factor = 1./(b[1]+b[2]*x);\n            double e = exp(-b[0]*x);\n            fjac(i,0) = -x*e*factor;\n            fjac(i,1) = -e*factor*factor;\n            fjac(i,2) = -x*e*factor*factor;\n        }\n        return 0;\n    }\n};\nconst double chwirut2_functor::m_x[54] = { 0.500E0, 1.000E0, 1.750E0, 3.750E0, 5.750E0, 0.875E0, 2.250E0, 3.250E0, 5.250E0, 0.750E0, 1.750E0, 2.750E0, 4.750E0, 0.625E0, 1.250E0, 2.250E0, 4.250E0, .500E0, 3.000E0, .750E0, 3.000E0, 1.500E0, 6.000E0, 3.000E0, 6.000E0, 1.500E0, 3.000E0, .500E0, 2.000E0, 4.000E0, .750E0, 2.000E0, 5.000E0, .750E0, 2.250E0, 3.750E0, 5.750E0, 3.000E0, .750E0, 2.500E0, 4.000E0, .750E0, 2.500E0, 4.000E0, .750E0, 2.500E0, 4.000E0, .500E0, 6.000E0, 3.000E0, .500E0, 2.750E0, .500E0, 1.750E0};\nconst double chwirut2_functor::m_y[54] = { 92.9000E0 ,57.1000E0 ,31.0500E0 ,11.5875E0 ,8.0250E0 ,63.6000E0 ,21.4000E0 ,14.2500E0 ,8.4750E0 ,63.8000E0 ,26.8000E0 ,16.4625E0 ,7.1250E0 ,67.3000E0 ,41.0000E0 ,21.1500E0 ,8.1750E0 ,81.5000E0 ,13.1200E0 ,59.9000E0 ,14.6200E0 ,32.9000E0 ,5.4400E0 ,12.5600E0 ,5.4400E0 ,32.0000E0 ,13.9500E0 ,75.8000E0 ,20.0000E0 ,10.4200E0 ,59.5000E0 ,21.6700E0 ,8.5500E0 ,62.0000E0 ,20.2000E0 ,7.7600E0 ,3.7500E0 ,11.8100E0 ,54.7000E0 ,23.7000E0 ,11.5500E0 ,61.3000E0 ,17.7000E0 ,8.7400E0 ,59.2000E0 ,16.3000E0 ,8.6200E0 ,81.0000E0 ,4.8700E0 ,14.6200E0 ,81.7000E0 ,17.1700E0 ,81.3000E0 ,28.9000E0  };\n\n// http://www.itl.nist.gov/div898/strd/nls/data/chwirut2.shtml\nvoid testNistChwirut2(void)\n{\n  const int n=3;\n  int info;\n\n  VectorXd x(n);\n\n  /*\n   * First try\n   */\n  x<< 0.1, 0.01, 0.02;\n  // do the computation\n  chwirut2_functor functor;\n  LevenbergMarquardt<chwirut2_functor> lm(functor);\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n//   VERIFY_IS_EQUAL(lm.nfev(), 10);\n  VERIFY_IS_EQUAL(lm.njev(), 8);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 5.1304802941E+02);\n  // check x\n  VERIFY_IS_APPROX(x[0], 1.6657666537E-01);\n  VERIFY_IS_APPROX(x[1], 5.1653291286E-03);\n  VERIFY_IS_APPROX(x[2], 1.2150007096E-02);\n\n  /*\n   * Second try\n   */\n  x<< 0.15, 0.008, 0.010;\n  // do the computation\n  lm.resetParameters();\n  lm.setFtol(1.E6*NumTraits<double>::epsilon());\n  lm.setXtol(1.E6*NumTraits<double>::epsilon());\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n//   VERIFY_IS_EQUAL(lm.nfev(), 7);\n  VERIFY_IS_EQUAL(lm.njev(), 6);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 5.1304802941E+02);\n  // check x\n  VERIFY_IS_APPROX(x[0], 1.6657666537E-01);\n  VERIFY_IS_APPROX(x[1], 5.1653291286E-03);\n  VERIFY_IS_APPROX(x[2], 1.2150007096E-02);\n}\n\n\nstruct misra1a_functor : DenseFunctor<double>\n{\n    misra1a_functor(void) : DenseFunctor<double>(2,14) {}\n    static const double m_x[14];\n    static const double m_y[14];\n    int operator()(const VectorXd &b, VectorXd &fvec)\n    {\n        assert(b.size()==2);\n        assert(fvec.size()==14);\n        for(int i=0; i<14; i++) {\n            fvec[i] = b[0]*(1.-exp(-b[1]*m_x[i])) - m_y[i] ;\n        }\n        return 0;\n    }\n    int df(const VectorXd &b, MatrixXd &fjac)\n    {\n        assert(b.size()==2);\n        assert(fjac.rows()==14);\n        assert(fjac.cols()==2);\n        for(int i=0; i<14; i++) {\n            fjac(i,0) = (1.-exp(-b[1]*m_x[i]));\n            fjac(i,1) = (b[0]*m_x[i]*exp(-b[1]*m_x[i]));\n        }\n        return 0;\n    }\n};\nconst double misra1a_functor::m_x[14] = { 77.6E0, 114.9E0, 141.1E0, 190.8E0, 239.9E0, 289.0E0, 332.8E0, 378.4E0, 434.8E0, 477.3E0, 536.8E0, 593.1E0, 689.1E0, 760.0E0};\nconst double misra1a_functor::m_y[14] = { 10.07E0, 14.73E0, 17.94E0, 23.93E0, 29.61E0, 35.18E0, 40.02E0, 44.82E0, 50.76E0, 55.05E0, 61.01E0, 66.40E0, 75.47E0, 81.78E0};\n\n// http://www.itl.nist.gov/div898/strd/nls/data/misra1a.shtml\nvoid testNistMisra1a(void)\n{\n  const int n=2;\n  int info;\n\n  VectorXd x(n);\n\n  /*\n   * First try\n   */\n  x<< 500., 0.0001;\n  // do the computation\n  misra1a_functor functor;\n  LevenbergMarquardt<misra1a_functor> lm(functor);\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev(), 19);\n  VERIFY_IS_EQUAL(lm.njev(), 15);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 1.2455138894E-01);\n  // check x\n  VERIFY_IS_APPROX(x[0], 2.3894212918E+02);\n  VERIFY_IS_APPROX(x[1], 5.5015643181E-04);\n\n  /*\n   * Second try\n   */\n  x<< 250., 0.0005;\n  // do the computation\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev(), 5);\n  VERIFY_IS_EQUAL(lm.njev(), 4);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 1.2455138894E-01);\n  // check x\n  VERIFY_IS_APPROX(x[0], 2.3894212918E+02);\n  VERIFY_IS_APPROX(x[1], 5.5015643181E-04);\n}\n\nstruct hahn1_functor : DenseFunctor<double>\n{\n    hahn1_functor(void) : DenseFunctor<double>(7,236) {}\n    static const double m_x[236];\n    int operator()(const VectorXd &b, VectorXd &fvec)\n    {\n        static const double m_y[236] = { .591E0 , 1.547E0 , 2.902E0 , 2.894E0 , 4.703E0 , 6.307E0 , 7.03E0  , 7.898E0 , 9.470E0 , 9.484E0 , 10.072E0 , 10.163E0 , 11.615E0 , 12.005E0 , 12.478E0 , 12.982E0 , 12.970E0 , 13.926E0 , 14.452E0 , 14.404E0 , 15.190E0 , 15.550E0 , 15.528E0 , 15.499E0 , 16.131E0 , 16.438E0 , 16.387E0 , 16.549E0 , 16.872E0 , 16.830E0 , 16.926E0 , 16.907E0 , 16.966E0 , 17.060E0 , 17.122E0 , 17.311E0 , 17.355E0 , 17.668E0 , 17.767E0 , 17.803E0 , 17.765E0 , 17.768E0 , 17.736E0 , 17.858E0 , 17.877E0 , 17.912E0 , 18.046E0 , 18.085E0 , 18.291E0 , 18.357E0 , 18.426E0 , 18.584E0 , 18.610E0 , 18.870E0 , 18.795E0 , 19.111E0 , .367E0 , .796E0 , 0.892E0 , 1.903E0 , 2.150E0 , 3.697E0 , 5.870E0 , 6.421E0 , 7.422E0 , 9.944E0 , 11.023E0 , 11.87E0  , 12.786E0 , 14.067E0 , 13.974E0 , 14.462E0 , 14.464E0 , 15.381E0 , 15.483E0 , 15.59E0  , 16.075E0 , 16.347E0 , 16.181E0 , 16.915E0 , 17.003E0 , 16.978E0 , 17.756E0 , 17.808E0 , 17.868E0 , 18.481E0 , 18.486E0 , 19.090E0 , 16.062E0 , 16.337E0 , 16.345E0 ,\n        16.388E0 , 17.159E0 , 17.116E0 , 17.164E0 , 17.123E0 , 17.979E0 , 17.974E0 , 18.007E0 , 17.993E0 , 18.523E0 , 18.669E0 , 18.617E0 , 19.371E0 , 19.330E0 , 0.080E0 , 0.248E0 , 1.089E0 , 1.418E0 , 2.278E0 , 3.624E0 , 4.574E0 , 5.556E0 , 7.267E0 , 7.695E0 , 9.136E0 , 9.959E0 , 9.957E0 , 11.600E0 , 13.138E0 , 13.564E0 , 13.871E0 , 13.994E0 , 14.947E0 , 15.473E0 , 15.379E0 , 15.455E0 , 15.908E0 , 16.114E0 , 17.071E0 , 17.135E0 , 17.282E0 , 17.368E0 , 17.483E0 , 17.764E0 , 18.185E0 , 18.271E0 , 18.236E0 , 18.237E0 , 18.523E0 , 18.627E0 , 18.665E0 , 19.086E0 , 0.214E0 , 0.943E0 , 1.429E0 , 2.241E0 , 2.951E0 , 3.782E0 , 4.757E0 , 5.602E0 , 7.169E0 , 8.920E0 , 10.055E0 , 12.035E0 , 12.861E0 , 13.436E0 , 14.167E0 , 14.755E0 , 15.168E0 , 15.651E0 , 15.746E0 , 16.216E0 , 16.445E0 , 16.965E0 , 17.121E0 , 17.206E0 , 17.250E0 , 17.339E0 , 17.793E0 , 18.123E0 , 18.49E0  , 18.566E0 , 18.645E0 , 18.706E0 , 18.924E0 , 19.1E0   , 0.375E0 , 0.471E0 , 1.504E0 , 2.204E0 , 2.813E0 , 4.765E0 , 9.835E0 , 10.040E0 , 11.946E0 , \n12.596E0 , \n13.303E0 , 13.922E0 , 14.440E0 , 14.951E0 , 15.627E0 , 15.639E0 , 15.814E0 , 16.315E0 , 16.334E0 , 16.430E0 , 16.423E0 , 17.024E0 , 17.009E0 , 17.165E0 , 17.134E0 , 17.349E0 , 17.576E0 , 17.848E0 , 18.090E0 , 18.276E0 , 18.404E0 , 18.519E0 , 19.133E0 , 19.074E0 , 19.239E0 , 19.280E0 , 19.101E0 , 19.398E0 , 19.252E0 , 19.89E0  , 20.007E0 , 19.929E0 , 19.268E0 , 19.324E0 , 20.049E0 , 20.107E0 , 20.062E0 , 20.065E0 , 19.286E0 , 19.972E0 , 20.088E0 , 20.743E0 , 20.83E0  , 20.935E0 , 21.035E0 , 20.93E0  , 21.074E0 , 21.085E0 , 20.935E0 };\n\n        //        int called=0; printf(\"call hahn1_functor with  iflag=%d, called=%d\\n\", iflag, called); if (iflag==1) called++;\n\n        assert(b.size()==7);\n        assert(fvec.size()==236);\n        for(int i=0; i<236; i++) {\n            double x=m_x[i], xx=x*x, xxx=xx*x;\n            fvec[i] = (b[0]+b[1]*x+b[2]*xx+b[3]*xxx) / (1.+b[4]*x+b[5]*xx+b[6]*xxx) - m_y[i];\n        }\n        return 0;\n    }\n\n    int df(const VectorXd &b, MatrixXd &fjac)\n    {\n        assert(b.size()==7);\n        assert(fjac.rows()==236);\n        assert(fjac.cols()==7);\n        for(int i=0; i<236; i++) {\n            double x=m_x[i], xx=x*x, xxx=xx*x;\n            double fact = 1./(1.+b[4]*x+b[5]*xx+b[6]*xxx);\n            fjac(i,0) = 1.*fact;\n            fjac(i,1) = x*fact;\n            fjac(i,2) = xx*fact;\n            fjac(i,3) = xxx*fact;\n            fact = - (b[0]+b[1]*x+b[2]*xx+b[3]*xxx) * fact * fact;\n            fjac(i,4) = x*fact;\n            fjac(i,5) = xx*fact;\n            fjac(i,6) = xxx*fact;\n        }\n        return 0;\n    }\n};\nconst double hahn1_functor::m_x[236] = { 24.41E0 , 34.82E0 , 44.09E0 , 45.07E0 , 54.98E0 , 65.51E0 , 70.53E0 , 75.70E0 , 89.57E0 , 91.14E0 , 96.40E0 , 97.19E0 , 114.26E0 , 120.25E0 , 127.08E0 , 133.55E0 , 133.61E0 , 158.67E0 , 172.74E0 , 171.31E0 , 202.14E0 , 220.55E0 , 221.05E0 , 221.39E0 , 250.99E0 , 268.99E0 , 271.80E0 , 271.97E0 , 321.31E0 , 321.69E0 , 330.14E0 , 333.03E0 , 333.47E0 , 340.77E0 , 345.65E0 , 373.11E0 , 373.79E0 , 411.82E0 , 419.51E0 , 421.59E0 , 422.02E0 , 422.47E0 , 422.61E0 , 441.75E0 , 447.41E0 , 448.7E0  , 472.89E0 , 476.69E0 , 522.47E0 , 522.62E0 , 524.43E0 , 546.75E0 , 549.53E0 , 575.29E0 , 576.00E0 , 625.55E0 , 20.15E0 , 28.78E0 , 29.57E0 , 37.41E0 , 39.12E0 , 50.24E0 , 61.38E0 , 66.25E0 , 73.42E0 , 95.52E0 , 107.32E0 , 122.04E0 , 134.03E0 , 163.19E0 , 163.48E0 , 175.70E0 , 179.86E0 , 211.27E0 , 217.78E0 , 219.14E0 , 262.52E0 , 268.01E0 , 268.62E0 , 336.25E0 , 337.23E0 , 339.33E0 , 427.38E0 , 428.58E0 , 432.68E0 , 528.99E0 , 531.08E0 , 628.34E0 , 253.24E0 , 273.13E0 , 273.66E0 ,\n282.10E0 , 346.62E0 , 347.19E0 , 348.78E0 , 351.18E0 , 450.10E0 , 450.35E0 , 451.92E0 , 455.56E0 , 552.22E0 , 553.56E0 , 555.74E0 , 652.59E0 , 656.20E0 , 14.13E0 , 20.41E0 , 31.30E0 , 33.84E0 , 39.70E0 , 48.83E0 , 54.50E0 , 60.41E0 , 72.77E0 , 75.25E0 , 86.84E0 , 94.88E0 , 96.40E0 , 117.37E0 , 139.08E0 , 147.73E0 , 158.63E0 , 161.84E0 , 192.11E0 , 206.76E0 , 209.07E0 , 213.32E0 , 226.44E0 , 237.12E0 , 330.90E0 , 358.72E0 , 370.77E0 , 372.72E0 , 396.24E0 , 416.59E0 , 484.02E0 , 495.47E0 , 514.78E0 , 515.65E0 , 519.47E0 , 544.47E0 , 560.11E0 , 620.77E0 , 18.97E0 , 28.93E0 , 33.91E0 , 40.03E0 , 44.66E0 , 49.87E0 , 55.16E0 , 60.90E0 , 72.08E0 , 85.15E0 , 97.06E0 , 119.63E0 , 133.27E0 , 143.84E0 , 161.91E0 , 180.67E0 , 198.44E0 , 226.86E0 , 229.65E0 , 258.27E0 , 273.77E0 , 339.15E0 , 350.13E0 , 362.75E0 , 371.03E0 , 393.32E0 , 448.53E0 , 473.78E0 , 511.12E0 , 524.70E0 , 548.75E0 , 551.64E0 , 574.02E0 , 623.86E0 , 21.46E0 , 24.33E0 , 33.43E0 , 39.22E0 , 44.18E0 , 55.02E0 , 94.33E0 , 96.44E0 , 118.82E0 , 128.48E0 ,\n141.94E0 , 156.92E0 , 171.65E0 , 190.00E0 , 223.26E0 , 223.88E0 , 231.50E0 , 265.05E0 , 269.44E0 , 271.78E0 , 273.46E0 , 334.61E0 , 339.79E0 , 349.52E0 , 358.18E0 , 377.98E0 , 394.77E0 , 429.66E0 , 468.22E0 , 487.27E0 , 519.54E0 , 523.03E0 , 612.99E0 , 638.59E0 , 641.36E0 , 622.05E0 , 631.50E0 , 663.97E0 , 646.9E0  , 748.29E0 , 749.21E0 , 750.14E0 , 647.04E0 , 646.89E0 , 746.9E0  , 748.43E0 , 747.35E0 , 749.27E0 , 647.61E0 , 747.78E0 , 750.51E0 , 851.37E0 , 845.97E0 , 847.54E0 , 849.93E0 , 851.61E0 , 849.75E0 , 850.98E0 , 848.23E0};\n\n// http://www.itl.nist.gov/div898/strd/nls/data/hahn1.shtml\nvoid testNistHahn1(void)\n{\n  const int  n=7;\n  int info;\n\n  VectorXd x(n);\n\n  /*\n   * First try\n   */\n  x<< 10., -1., .05, -.00001, -.05, .001, -.000001;\n  // do the computation\n  hahn1_functor functor;\n  LevenbergMarquardt<hahn1_functor> lm(functor);\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev(), 11);\n  VERIFY_IS_EQUAL(lm.njev(), 10);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 1.5324382854E+00);\n  // check x\n  VERIFY_IS_APPROX(x[0], 1.0776351733E+00);\n  VERIFY_IS_APPROX(x[1],-1.2269296921E-01);\n  VERIFY_IS_APPROX(x[2], 4.0863750610E-03);\n  VERIFY_IS_APPROX(x[3],-1.426264e-06); // shoulde be : -1.4262662514E-06\n  VERIFY_IS_APPROX(x[4],-5.7609940901E-03);\n  VERIFY_IS_APPROX(x[5], 2.4053735503E-04);\n  VERIFY_IS_APPROX(x[6],-1.2314450199E-07);\n\n  /*\n   * Second try\n   */\n  x<< .1, -.1, .005, -.000001, -.005, .0001, -.0000001;\n  // do the computation\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n//   VERIFY_IS_EQUAL(lm.nfev(), 11);\n  VERIFY_IS_EQUAL(lm.njev(), 10);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 1.5324382854E+00);\n  // check x\n  VERIFY_IS_APPROX(x[0], 1.077640); // should be :  1.0776351733E+00\n  VERIFY_IS_APPROX(x[1], -0.1226933); // should be : -1.2269296921E-01\n  VERIFY_IS_APPROX(x[2], 0.004086383); // should be : 4.0863750610E-03\n  VERIFY_IS_APPROX(x[3], -1.426277e-06); // shoulde be : -1.4262662514E-06\n  VERIFY_IS_APPROX(x[4],-5.7609940901E-03);\n  VERIFY_IS_APPROX(x[5], 0.00024053772); // should be : 2.4053735503E-04\n  VERIFY_IS_APPROX(x[6], -1.231450e-07); // should be : -1.2314450199E-07\n\n}\n\nstruct misra1d_functor : DenseFunctor<double>\n{\n    misra1d_functor(void) : DenseFunctor<double>(2,14) {}\n    static const double x[14];\n    static const double y[14];\n    int operator()(const VectorXd &b, VectorXd &fvec)\n    {\n        assert(b.size()==2);\n        assert(fvec.size()==14);\n        for(int i=0; i<14; i++) {\n            fvec[i] = b[0]*b[1]*x[i]/(1.+b[1]*x[i]) - y[i];\n        }\n        return 0;\n    }\n    int df(const VectorXd &b, MatrixXd &fjac)\n    {\n        assert(b.size()==2);\n        assert(fjac.rows()==14);\n        assert(fjac.cols()==2);\n        for(int i=0; i<14; i++) {\n            double den = 1.+b[1]*x[i];\n            fjac(i,0) = b[1]*x[i] / den;\n            fjac(i,1) = b[0]*x[i]*(den-b[1]*x[i])/den/den;\n        }\n        return 0;\n    }\n};\nconst double misra1d_functor::x[14] = { 77.6E0, 114.9E0, 141.1E0, 190.8E0, 239.9E0, 289.0E0, 332.8E0, 378.4E0, 434.8E0, 477.3E0, 536.8E0, 593.1E0, 689.1E0, 760.0E0};\nconst double misra1d_functor::y[14] = { 10.07E0, 14.73E0, 17.94E0, 23.93E0, 29.61E0, 35.18E0, 40.02E0, 44.82E0, 50.76E0, 55.05E0, 61.01E0, 66.40E0, 75.47E0, 81.78E0};\n\n// http://www.itl.nist.gov/div898/strd/nls/data/misra1d.shtml\nvoid testNistMisra1d(void)\n{\n  const int n=2;\n  int info;\n\n  VectorXd x(n);\n\n  /*\n   * First try\n   */\n  x<< 500., 0.0001;\n  // do the computation\n  misra1d_functor functor;\n  LevenbergMarquardt<misra1d_functor> lm(functor);\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev(), 9);\n  VERIFY_IS_EQUAL(lm.njev(), 7);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 5.6419295283E-02);\n  // check x\n  VERIFY_IS_APPROX(x[0], 4.3736970754E+02);\n  VERIFY_IS_APPROX(x[1], 3.0227324449E-04);\n\n  /*\n   * Second try\n   */\n  x<< 450., 0.0003;\n  // do the computation\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev(), 4);\n  VERIFY_IS_EQUAL(lm.njev(), 3);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 5.6419295283E-02);\n  // check x\n  VERIFY_IS_APPROX(x[0], 4.3736970754E+02);\n  VERIFY_IS_APPROX(x[1], 3.0227324449E-04);\n}\n\n\nstruct lanczos1_functor : DenseFunctor<double>\n{\n    lanczos1_functor(void) : DenseFunctor<double>(6,24) {}\n    static const double x[24];\n    static const double y[24];\n    int operator()(const VectorXd &b, VectorXd &fvec)\n    {\n        assert(b.size()==6);\n        assert(fvec.size()==24);\n        for(int i=0; i<24; i++)\n            fvec[i] = b[0]*exp(-b[1]*x[i]) + b[2]*exp(-b[3]*x[i]) + b[4]*exp(-b[5]*x[i])  - y[i];\n        return 0;\n    }\n    int df(const VectorXd &b, MatrixXd &fjac)\n    {\n        assert(b.size()==6);\n        assert(fjac.rows()==24);\n        assert(fjac.cols()==6);\n        for(int i=0; i<24; i++) {\n            fjac(i,0) = exp(-b[1]*x[i]);\n            fjac(i,1) = -b[0]*x[i]*exp(-b[1]*x[i]);\n            fjac(i,2) = exp(-b[3]*x[i]);\n            fjac(i,3) = -b[2]*x[i]*exp(-b[3]*x[i]);\n            fjac(i,4) = exp(-b[5]*x[i]);\n            fjac(i,5) = -b[4]*x[i]*exp(-b[5]*x[i]);\n        }\n        return 0;\n    }\n};\nconst double lanczos1_functor::x[24] = { 0.000000000000E+00, 5.000000000000E-02, 1.000000000000E-01, 1.500000000000E-01, 2.000000000000E-01, 2.500000000000E-01, 3.000000000000E-01, 3.500000000000E-01, 4.000000000000E-01, 4.500000000000E-01, 5.000000000000E-01, 5.500000000000E-01, 6.000000000000E-01, 6.500000000000E-01, 7.000000000000E-01, 7.500000000000E-01, 8.000000000000E-01, 8.500000000000E-01, 9.000000000000E-01, 9.500000000000E-01, 1.000000000000E+00, 1.050000000000E+00, 1.100000000000E+00, 1.150000000000E+00 };\nconst double lanczos1_functor::y[24] = { 2.513400000000E+00 ,2.044333373291E+00 ,1.668404436564E+00 ,1.366418021208E+00 ,1.123232487372E+00 ,9.268897180037E-01 ,7.679338563728E-01 ,6.388775523106E-01 ,5.337835317402E-01 ,4.479363617347E-01 ,3.775847884350E-01 ,3.197393199326E-01 ,2.720130773746E-01 ,2.324965529032E-01 ,1.996589546065E-01 ,1.722704126914E-01 ,1.493405660168E-01 ,1.300700206922E-01 ,1.138119324644E-01 ,1.000415587559E-01 ,8.833209084540E-02 ,7.833544019350E-02 ,6.976693743449E-02 ,6.239312536719E-02 };\n\n// http://www.itl.nist.gov/div898/strd/nls/data/lanczos1.shtml\nvoid testNistLanczos1(void)\n{\n  const int n=6;\n  int info;\n\n  VectorXd x(n);\n\n  /*\n   * First try\n   */\n  x<< 1.2, 0.3, 5.6, 5.5, 6.5, 7.6;\n  // do the computation\n  lanczos1_functor functor;\n  LevenbergMarquardt<lanczos1_functor> lm(functor);\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 2);\n  VERIFY_IS_EQUAL(lm.nfev(), 79);\n  VERIFY_IS_EQUAL(lm.njev(), 72);\n  // check norm^2\n//   VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 1.430899764097e-25);  // should be 1.4307867721E-25, but nist results are on 128-bit floats\n  // check x\n  VERIFY_IS_APPROX(x[0], 9.5100000027E-02);\n  VERIFY_IS_APPROX(x[1], 1.0000000001E+00);\n  VERIFY_IS_APPROX(x[2], 8.6070000013E-01);\n  VERIFY_IS_APPROX(x[3], 3.0000000002E+00);\n  VERIFY_IS_APPROX(x[4], 1.5575999998E+00);\n  VERIFY_IS_APPROX(x[5], 5.0000000001E+00);\n\n  /*\n   * Second try\n   */\n  x<< 0.5, 0.7, 3.6, 4.2, 4., 6.3;\n  // do the computation\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 2);\n  VERIFY_IS_EQUAL(lm.nfev(), 9);\n  VERIFY_IS_EQUAL(lm.njev(), 8);\n  // check norm^2\n//   VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 1.428595533845e-25);  // should be 1.4307867721E-25, but nist results are on 128-bit floats\n  // check x\n  VERIFY_IS_APPROX(x[0], 9.5100000027E-02);\n  VERIFY_IS_APPROX(x[1], 1.0000000001E+00);\n  VERIFY_IS_APPROX(x[2], 8.6070000013E-01);\n  VERIFY_IS_APPROX(x[3], 3.0000000002E+00);\n  VERIFY_IS_APPROX(x[4], 1.5575999998E+00);\n  VERIFY_IS_APPROX(x[5], 5.0000000001E+00);\n\n}\n\nstruct rat42_functor : DenseFunctor<double>\n{\n    rat42_functor(void) : DenseFunctor<double>(3,9) {}\n    static const double x[9];\n    static const double y[9];\n    int operator()(const VectorXd &b, VectorXd &fvec)\n    {\n        assert(b.size()==3);\n        assert(fvec.size()==9);\n        for(int i=0; i<9; i++) {\n            fvec[i] = b[0] / (1.+exp(b[1]-b[2]*x[i])) - y[i];\n        }\n        return 0;\n    }\n\n    int df(const VectorXd &b, MatrixXd &fjac)\n    {\n        assert(b.size()==3);\n        assert(fjac.rows()==9);\n        assert(fjac.cols()==3);\n        for(int i=0; i<9; i++) {\n            double e = exp(b[1]-b[2]*x[i]);\n            fjac(i,0) = 1./(1.+e);\n            fjac(i,1) = -b[0]*e/(1.+e)/(1.+e);\n            fjac(i,2) = +b[0]*e*x[i]/(1.+e)/(1.+e);\n        }\n        return 0;\n    }\n};\nconst double rat42_functor::x[9] = { 9.000E0, 14.000E0, 21.000E0, 28.000E0, 42.000E0, 57.000E0, 63.000E0, 70.000E0, 79.000E0 };\nconst double rat42_functor::y[9] = { 8.930E0 ,10.800E0 ,18.590E0 ,22.330E0 ,39.350E0 ,56.110E0 ,61.730E0 ,64.620E0 ,67.080E0 };\n\n// http://www.itl.nist.gov/div898/strd/nls/data/ratkowsky2.shtml\nvoid testNistRat42(void)\n{\n  const int n=3;\n  int info;\n\n  VectorXd x(n);\n\n  /*\n   * First try\n   */\n  x<< 100., 1., 0.1;\n  // do the computation\n  rat42_functor functor;\n  LevenbergMarquardt<rat42_functor> lm(functor);\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev(), 10);\n  VERIFY_IS_EQUAL(lm.njev(), 8);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 8.0565229338E+00);\n  // check x\n  VERIFY_IS_APPROX(x[0], 7.2462237576E+01);\n  VERIFY_IS_APPROX(x[1], 2.6180768402E+00);\n  VERIFY_IS_APPROX(x[2], 6.7359200066E-02);\n\n  /*\n   * Second try\n   */\n  x<< 75., 2.5, 0.07;\n  // do the computation\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev(), 6);\n  VERIFY_IS_EQUAL(lm.njev(), 5);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 8.0565229338E+00);\n  // check x\n  VERIFY_IS_APPROX(x[0], 7.2462237576E+01);\n  VERIFY_IS_APPROX(x[1], 2.6180768402E+00);\n  VERIFY_IS_APPROX(x[2], 6.7359200066E-02);\n}\n\nstruct MGH10_functor : DenseFunctor<double>\n{\n    MGH10_functor(void) : DenseFunctor<double>(3,16) {}\n    static const double x[16];\n    static const double y[16];\n    int operator()(const VectorXd &b, VectorXd &fvec)\n    {\n        assert(b.size()==3);\n        assert(fvec.size()==16);\n        for(int i=0; i<16; i++)\n            fvec[i] =  b[0] * exp(b[1]/(x[i]+b[2])) - y[i];\n        return 0;\n    }\n    int df(const VectorXd &b, MatrixXd &fjac)\n    {\n        assert(b.size()==3);\n        assert(fjac.rows()==16);\n        assert(fjac.cols()==3);\n        for(int i=0; i<16; i++) {\n            double factor = 1./(x[i]+b[2]);\n            double e = exp(b[1]*factor);\n            fjac(i,0) = e;\n            fjac(i,1) = b[0]*factor*e;\n            fjac(i,2) = -b[1]*b[0]*factor*factor*e;\n        }\n        return 0;\n    }\n};\nconst double MGH10_functor::x[16] = { 5.000000E+01, 5.500000E+01, 6.000000E+01, 6.500000E+01, 7.000000E+01, 7.500000E+01, 8.000000E+01, 8.500000E+01, 9.000000E+01, 9.500000E+01, 1.000000E+02, 1.050000E+02, 1.100000E+02, 1.150000E+02, 1.200000E+02, 1.250000E+02 };\nconst double MGH10_functor::y[16] = { 3.478000E+04, 2.861000E+04, 2.365000E+04, 1.963000E+04, 1.637000E+04, 1.372000E+04, 1.154000E+04, 9.744000E+03, 8.261000E+03, 7.030000E+03, 6.005000E+03, 5.147000E+03, 4.427000E+03, 3.820000E+03, 3.307000E+03, 2.872000E+03 };\n\n// http://www.itl.nist.gov/div898/strd/nls/data/mgh10.shtml\nvoid testNistMGH10(void)\n{\n  const int n=3;\n  int info;\n\n  VectorXd x(n);\n\n  /*\n   * First try\n   */\n  x<< 2., 400000., 25000.;\n  // do the computation\n  MGH10_functor functor;\n  LevenbergMarquardt<MGH10_functor> lm(functor);\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1); \n  VERIFY_IS_EQUAL(lm.nfev(), 284 ); \n  VERIFY_IS_EQUAL(lm.njev(), 249 ); \n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 8.7945855171E+01);\n  // check x\n  VERIFY_IS_APPROX(x[0], 5.6096364710E-03);\n  VERIFY_IS_APPROX(x[1], 6.1813463463E+03);\n  VERIFY_IS_APPROX(x[2], 3.4522363462E+02);\n\n  /*\n   * Second try\n   */\n  x<< 0.02, 4000., 250.;\n  // do the computation\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev(), 126);\n  VERIFY_IS_EQUAL(lm.njev(), 116);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 8.7945855171E+01);\n  // check x\n  VERIFY_IS_APPROX(x[0], 5.6096364710E-03);\n  VERIFY_IS_APPROX(x[1], 6.1813463463E+03);\n  VERIFY_IS_APPROX(x[2], 3.4522363462E+02);\n}\n\n\nstruct BoxBOD_functor : DenseFunctor<double>\n{\n    BoxBOD_functor(void) : DenseFunctor<double>(2,6) {}\n    static const double x[6];\n    int operator()(const VectorXd &b, VectorXd &fvec)\n    {\n        static const double y[6] = { 109., 149., 149., 191., 213., 224. };\n        assert(b.size()==2);\n        assert(fvec.size()==6);\n        for(int i=0; i<6; i++)\n            fvec[i] =  b[0]*(1.-exp(-b[1]*x[i])) - y[i];\n        return 0;\n    }\n    int df(const VectorXd &b, MatrixXd &fjac)\n    {\n        assert(b.size()==2);\n        assert(fjac.rows()==6);\n        assert(fjac.cols()==2);\n        for(int i=0; i<6; i++) {\n            double e = exp(-b[1]*x[i]);\n            fjac(i,0) = 1.-e;\n            fjac(i,1) = b[0]*x[i]*e;\n        }\n        return 0;\n    }\n};\nconst double BoxBOD_functor::x[6] = { 1., 2., 3., 5., 7., 10. };\n\n// http://www.itl.nist.gov/div898/strd/nls/data/boxbod.shtml\nvoid testNistBoxBOD(void)\n{\n  const int n=2;\n  int info;\n\n  VectorXd x(n);\n\n  /*\n   * First try\n   */\n  x<< 1., 1.;\n  // do the computation\n  BoxBOD_functor functor;\n  LevenbergMarquardt<BoxBOD_functor> lm(functor);\n  lm.setFtol(1.E6*NumTraits<double>::epsilon());\n  lm.setXtol(1.E6*NumTraits<double>::epsilon());\n  lm.setFactor(10);\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev(), 31);\n  VERIFY_IS_EQUAL(lm.njev(), 25);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 1.1680088766E+03);\n  // check x\n  VERIFY_IS_APPROX(x[0], 2.1380940889E+02);\n  VERIFY_IS_APPROX(x[1], 5.4723748542E-01);\n\n  /*\n   * Second try\n   */\n  x<< 100., 0.75;\n  // do the computation\n  lm.resetParameters();\n  lm.setFtol(NumTraits<double>::epsilon());\n  lm.setXtol( NumTraits<double>::epsilon());\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1); \n  VERIFY_IS_EQUAL(lm.nfev(), 15 ); \n  VERIFY_IS_EQUAL(lm.njev(), 14 ); \n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 1.1680088766E+03);\n  // check x\n  VERIFY_IS_APPROX(x[0], 2.1380940889E+02);\n  VERIFY_IS_APPROX(x[1], 5.4723748542E-01);\n}\n\nstruct MGH17_functor : DenseFunctor<double>\n{\n    MGH17_functor(void) : DenseFunctor<double>(5,33) {}\n    static const double x[33];\n    static const double y[33];\n    int operator()(const VectorXd &b, VectorXd &fvec)\n    {\n        assert(b.size()==5);\n        assert(fvec.size()==33);\n        for(int i=0; i<33; i++)\n            fvec[i] =  b[0] + b[1]*exp(-b[3]*x[i]) +  b[2]*exp(-b[4]*x[i]) - y[i];\n        return 0;\n    }\n    int df(const VectorXd &b, MatrixXd &fjac)\n    {\n        assert(b.size()==5);\n        assert(fjac.rows()==33);\n        assert(fjac.cols()==5);\n        for(int i=0; i<33; i++) {\n            fjac(i,0) = 1.;\n            fjac(i,1) = exp(-b[3]*x[i]);\n            fjac(i,2) = exp(-b[4]*x[i]);\n            fjac(i,3) = -x[i]*b[1]*exp(-b[3]*x[i]);\n            fjac(i,4) = -x[i]*b[2]*exp(-b[4]*x[i]);\n        }\n        return 0;\n    }\n};\nconst double MGH17_functor::x[33] = { 0.000000E+00, 1.000000E+01, 2.000000E+01, 3.000000E+01, 4.000000E+01, 5.000000E+01, 6.000000E+01, 7.000000E+01, 8.000000E+01, 9.000000E+01, 1.000000E+02, 1.100000E+02, 1.200000E+02, 1.300000E+02, 1.400000E+02, 1.500000E+02, 1.600000E+02, 1.700000E+02, 1.800000E+02, 1.900000E+02, 2.000000E+02, 2.100000E+02, 2.200000E+02, 2.300000E+02, 2.400000E+02, 2.500000E+02, 2.600000E+02, 2.700000E+02, 2.800000E+02, 2.900000E+02, 3.000000E+02, 3.100000E+02, 3.200000E+02 };\nconst double MGH17_functor::y[33] = { 8.440000E-01, 9.080000E-01, 9.320000E-01, 9.360000E-01, 9.250000E-01, 9.080000E-01, 8.810000E-01, 8.500000E-01, 8.180000E-01, 7.840000E-01, 7.510000E-01, 7.180000E-01, 6.850000E-01, 6.580000E-01, 6.280000E-01, 6.030000E-01, 5.800000E-01, 5.580000E-01, 5.380000E-01, 5.220000E-01, 5.060000E-01, 4.900000E-01, 4.780000E-01, 4.670000E-01, 4.570000E-01, 4.480000E-01, 4.380000E-01, 4.310000E-01, 4.240000E-01, 4.200000E-01, 4.140000E-01, 4.110000E-01, 4.060000E-01 };\n\n// http://www.itl.nist.gov/div898/strd/nls/data/mgh17.shtml\nvoid testNistMGH17(void)\n{\n  const int n=5;\n  int info;\n\n  VectorXd x(n);\n\n  /*\n   * First try\n   */\n  x<< 50., 150., -100., 1., 2.;\n  // do the computation\n  MGH17_functor functor;\n  LevenbergMarquardt<MGH17_functor> lm(functor);\n  lm.setFtol(NumTraits<double>::epsilon());\n  lm.setXtol(NumTraits<double>::epsilon());\n  lm.setMaxfev(1000);\n  info = lm.minimize(x);\n\n  // check return value\n//   VERIFY_IS_EQUAL(info, 2);  //FIXME Use (lm.info() == Success)\n//   VERIFY_IS_EQUAL(lm.nfev(), 602 ); \n  VERIFY_IS_EQUAL(lm.njev(), 545 ); \n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 5.4648946975E-05);\n  // check x\n  VERIFY_IS_APPROX(x[0], 3.7541005211E-01);\n  VERIFY_IS_APPROX(x[1], 1.9358469127E+00);\n  VERIFY_IS_APPROX(x[2], -1.4646871366E+00);\n  VERIFY_IS_APPROX(x[3], 1.2867534640E-02);\n  VERIFY_IS_APPROX(x[4], 2.2122699662E-02);\n\n  /*\n   * Second try\n   */\n  x<< 0.5  ,1.5  ,-1   ,0.01 ,0.02;\n  // do the computation\n  lm.resetParameters();\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev(), 18);\n  VERIFY_IS_EQUAL(lm.njev(), 15);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 5.4648946975E-05);\n  // check x\n  VERIFY_IS_APPROX(x[0], 3.7541005211E-01);\n  VERIFY_IS_APPROX(x[1], 1.9358469127E+00);\n  VERIFY_IS_APPROX(x[2], -1.4646871366E+00);\n  VERIFY_IS_APPROX(x[3], 1.2867534640E-02);\n  VERIFY_IS_APPROX(x[4], 2.2122699662E-02);\n}\n\nstruct MGH09_functor : DenseFunctor<double>\n{\n    MGH09_functor(void) : DenseFunctor<double>(4,11) {}\n    static const double _x[11];\n    static const double y[11];\n    int operator()(const VectorXd &b, VectorXd &fvec)\n    {\n        assert(b.size()==4);\n        assert(fvec.size()==11);\n        for(int i=0; i<11; i++) {\n            double x = _x[i], xx=x*x;\n            fvec[i] = b[0]*(xx+x*b[1])/(xx+x*b[2]+b[3]) - y[i];\n        }\n        return 0;\n    }\n    int df(const VectorXd &b, MatrixXd &fjac)\n    {\n        assert(b.size()==4);\n        assert(fjac.rows()==11);\n        assert(fjac.cols()==4);\n        for(int i=0; i<11; i++) {\n            double x = _x[i], xx=x*x;\n            double factor = 1./(xx+x*b[2]+b[3]);\n            fjac(i,0) = (xx+x*b[1]) * factor;\n            fjac(i,1) = b[0]*x* factor;\n            fjac(i,2) = - b[0]*(xx+x*b[1]) * x * factor * factor;\n            fjac(i,3) = - b[0]*(xx+x*b[1]) * factor * factor;\n        }\n        return 0;\n    }\n};\nconst double MGH09_functor::_x[11] = { 4., 2., 1., 5.E-1 , 2.5E-01, 1.670000E-01, 1.250000E-01,  1.E-01, 8.330000E-02, 7.140000E-02, 6.250000E-02 };\nconst double MGH09_functor::y[11] = { 1.957000E-01, 1.947000E-01, 1.735000E-01, 1.600000E-01, 8.440000E-02, 6.270000E-02, 4.560000E-02, 3.420000E-02, 3.230000E-02, 2.350000E-02, 2.460000E-02 };\n\n// http://www.itl.nist.gov/div898/strd/nls/data/mgh09.shtml\nvoid testNistMGH09(void)\n{\n  const int n=4;\n  int info;\n\n  VectorXd x(n);\n\n  /*\n   * First try\n   */\n  x<< 25., 39, 41.5, 39.;\n  // do the computation\n  MGH09_functor functor;\n  LevenbergMarquardt<MGH09_functor> lm(functor);\n  lm.setMaxfev(1000);\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1); \n  VERIFY_IS_EQUAL(lm.nfev(), 490 ); \n  VERIFY_IS_EQUAL(lm.njev(), 376 ); \n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 3.0750560385E-04);\n  // check x\n  VERIFY_IS_APPROX(x[0], 0.1928077089); // should be 1.9280693458E-01\n  VERIFY_IS_APPROX(x[1], 0.19126423573); // should be 1.9128232873E-01\n  VERIFY_IS_APPROX(x[2], 0.12305309914); // should be 1.2305650693E-01\n  VERIFY_IS_APPROX(x[3], 0.13605395375); // should be 1.3606233068E-01\n\n  /*\n   * Second try\n   */\n  x<< 0.25, 0.39, 0.415, 0.39;\n  // do the computation\n  lm.resetParameters();\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev(), 18);\n  VERIFY_IS_EQUAL(lm.njev(), 16);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 3.0750560385E-04);\n  // check x\n  VERIFY_IS_APPROX(x[0], 0.19280781); // should be 1.9280693458E-01\n  VERIFY_IS_APPROX(x[1], 0.19126265); // should be 1.9128232873E-01\n  VERIFY_IS_APPROX(x[2], 0.12305280); // should be 1.2305650693E-01\n  VERIFY_IS_APPROX(x[3], 0.13605322); // should be 1.3606233068E-01\n}\n\n\n\nstruct Bennett5_functor : DenseFunctor<double>\n{\n    Bennett5_functor(void) : DenseFunctor<double>(3,154) {}\n    static const double x[154];\n    static const double y[154];\n    int operator()(const VectorXd &b, VectorXd &fvec)\n    {\n        assert(b.size()==3);\n        assert(fvec.size()==154);\n        for(int i=0; i<154; i++)\n            fvec[i] = b[0]* pow(b[1]+x[i],-1./b[2]) - y[i];\n        return 0;\n    }\n    int df(const VectorXd &b, MatrixXd &fjac)\n    {\n        assert(b.size()==3);\n        assert(fjac.rows()==154);\n        assert(fjac.cols()==3);\n        for(int i=0; i<154; i++) {\n            double e = pow(b[1]+x[i],-1./b[2]);\n            fjac(i,0) = e;\n            fjac(i,1) = - b[0]*e/b[2]/(b[1]+x[i]);\n            fjac(i,2) = b[0]*e*log(b[1]+x[i])/b[2]/b[2];\n        }\n        return 0;\n    }\n};\nconst double Bennett5_functor::x[154] = { 7.447168E0, 8.102586E0, 8.452547E0, 8.711278E0, 8.916774E0, 9.087155E0, 9.232590E0, 9.359535E0, 9.472166E0, 9.573384E0, 9.665293E0, 9.749461E0, 9.827092E0, 9.899128E0, 9.966321E0, 10.029280E0, 10.088510E0, 10.144430E0, 10.197380E0, 10.247670E0, 10.295560E0, 10.341250E0, 10.384950E0, 10.426820E0, 10.467000E0, 10.505640E0, 10.542830E0, 10.578690E0, 10.613310E0, 10.646780E0, 10.679150E0, 10.710520E0, 10.740920E0, 10.770440E0, 10.799100E0, 10.826970E0, 10.854080E0, 10.880470E0, 10.906190E0, 10.931260E0, 10.955720E0, 10.979590E0, 11.002910E0, 11.025700E0, 11.047980E0, 11.069770E0, 11.091100E0, 11.111980E0, 11.132440E0, 11.152480E0, 11.172130E0, 11.191410E0, 11.210310E0, 11.228870E0, 11.247090E0, 11.264980E0, 11.282560E0, 11.299840E0, 11.316820E0, 11.333520E0, 11.349940E0, 11.366100E0, 11.382000E0, 11.397660E0, 11.413070E0, 11.428240E0, 11.443200E0, 11.457930E0, 11.472440E0, 11.486750E0, 11.500860E0, 11.514770E0, 11.528490E0, 11.542020E0, 11.555380E0, 11.568550E0,\n11.581560E0, 11.594420E0, 11.607121E0, 11.619640E0, 11.632000E0, 11.644210E0, 11.656280E0, 11.668200E0, 11.679980E0, 11.691620E0, 11.703130E0, 11.714510E0, 11.725760E0, 11.736880E0, 11.747890E0, 11.758780E0, 11.769550E0, 11.780200E0, 11.790730E0, 11.801160E0, 11.811480E0, 11.821700E0, 11.831810E0, 11.841820E0, 11.851730E0, 11.861550E0, 11.871270E0, 11.880890E0, 11.890420E0, 11.899870E0, 11.909220E0, 11.918490E0, 11.927680E0, 11.936780E0, 11.945790E0, 11.954730E0, 11.963590E0, 11.972370E0, 11.981070E0, 11.989700E0, 11.998260E0, 12.006740E0, 12.015150E0, 12.023490E0, 12.031760E0, 12.039970E0, 12.048100E0, 12.056170E0, 12.064180E0, 12.072120E0, 12.080010E0, 12.087820E0, 12.095580E0, 12.103280E0, 12.110920E0, 12.118500E0, 12.126030E0, 12.133500E0, 12.140910E0, 12.148270E0, 12.155570E0, 12.162830E0, 12.170030E0, 12.177170E0, 12.184270E0, 12.191320E0, 12.198320E0, 12.205270E0, 12.212170E0, 12.219030E0, 12.225840E0, 12.232600E0, 12.239320E0, 12.245990E0, 12.252620E0, 12.259200E0, 12.265750E0, 12.272240E0 };\nconst double Bennett5_functor::y[154] = { -34.834702E0 ,-34.393200E0 ,-34.152901E0 ,-33.979099E0 ,-33.845901E0 ,-33.732899E0 ,-33.640301E0 ,-33.559200E0 ,-33.486801E0 ,-33.423100E0 ,-33.365101E0 ,-33.313000E0 ,-33.260899E0 ,-33.217400E0 ,-33.176899E0 ,-33.139198E0 ,-33.101601E0 ,-33.066799E0 ,-33.035000E0 ,-33.003101E0 ,-32.971298E0 ,-32.942299E0 ,-32.916302E0 ,-32.890202E0 ,-32.864101E0 ,-32.841000E0 ,-32.817799E0 ,-32.797501E0 ,-32.774300E0 ,-32.757000E0 ,-32.733799E0 ,-32.716400E0 ,-32.699100E0 ,-32.678799E0 ,-32.661400E0 ,-32.644001E0 ,-32.626701E0 ,-32.612202E0 ,-32.597698E0 ,-32.583199E0 ,-32.568699E0 ,-32.554298E0 ,-32.539799E0 ,-32.525299E0 ,-32.510799E0 ,-32.499199E0 ,-32.487598E0 ,-32.473202E0 ,-32.461601E0 ,-32.435501E0 ,-32.435501E0 ,-32.426800E0 ,-32.412300E0 ,-32.400799E0 ,-32.392101E0 ,-32.380501E0 ,-32.366001E0 ,-32.357300E0 ,-32.348598E0 ,-32.339901E0 ,-32.328400E0 ,-32.319698E0 ,-32.311001E0 ,-32.299400E0 ,-32.290699E0 ,-32.282001E0 ,-32.273300E0 ,-32.264599E0 ,-32.256001E0 ,-32.247299E0\n,-32.238602E0 ,-32.229900E0 ,-32.224098E0 ,-32.215401E0 ,-32.203800E0 ,-32.198002E0 ,-32.189400E0 ,-32.183601E0 ,-32.174900E0 ,-32.169102E0 ,-32.163300E0 ,-32.154598E0 ,-32.145901E0 ,-32.140099E0 ,-32.131401E0 ,-32.125599E0 ,-32.119801E0 ,-32.111198E0 ,-32.105400E0 ,-32.096699E0 ,-32.090900E0 ,-32.088001E0 ,-32.079300E0 ,-32.073502E0 ,-32.067699E0 ,-32.061901E0 ,-32.056099E0 ,-32.050301E0 ,-32.044498E0 ,-32.038799E0 ,-32.033001E0 ,-32.027199E0 ,-32.024300E0 ,-32.018501E0 ,-32.012699E0 ,-32.004002E0 ,-32.001099E0 ,-31.995300E0 ,-31.989500E0 ,-31.983700E0 ,-31.977900E0 ,-31.972099E0 ,-31.969299E0 ,-31.963501E0 ,-31.957701E0 ,-31.951900E0 ,-31.946100E0 ,-31.940300E0 ,-31.937401E0 ,-31.931601E0 ,-31.925800E0 ,-31.922899E0 ,-31.917101E0 ,-31.911301E0 ,-31.908400E0 ,-31.902599E0 ,-31.896900E0 ,-31.893999E0 ,-31.888201E0 ,-31.885300E0 ,-31.882401E0 ,-31.876600E0 ,-31.873699E0 ,-31.867901E0 ,-31.862101E0 ,-31.859200E0 ,-31.856300E0 ,-31.850500E0 ,-31.844700E0 ,-31.841801E0 ,-31.838900E0 ,-31.833099E0 ,-31.830200E0 ,\n-31.827299E0 ,-31.821600E0 ,-31.818701E0 ,-31.812901E0 ,-31.809999E0 ,-31.807100E0 ,-31.801300E0 ,-31.798401E0 ,-31.795500E0 ,-31.789700E0 ,-31.786800E0 };\n\n// http://www.itl.nist.gov/div898/strd/nls/data/bennett5.shtml\nvoid testNistBennett5(void)\n{\n  const int  n=3;\n  int info;\n\n  VectorXd x(n);\n\n  /*\n   * First try\n   */\n  x<< -2000., 50., 0.8;\n  // do the computation\n  Bennett5_functor functor;\n  LevenbergMarquardt<Bennett5_functor> lm(functor);\n  lm.setMaxfev(1000);\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev(), 758);\n  VERIFY_IS_EQUAL(lm.njev(), 744);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 5.2404744073E-04);\n  // check x\n  VERIFY_IS_APPROX(x[0], -2.5235058043E+03);\n  VERIFY_IS_APPROX(x[1], 4.6736564644E+01);\n  VERIFY_IS_APPROX(x[2], 9.3218483193E-01);\n  /*\n   * Second try\n   */\n  x<< -1500., 45., 0.85;\n  // do the computation\n  lm.resetParameters();\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev(), 203);\n  VERIFY_IS_EQUAL(lm.njev(), 192);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 5.2404744073E-04);\n  // check x\n  VERIFY_IS_APPROX(x[0], -2523.3007865); // should be -2.5235058043E+03\n  VERIFY_IS_APPROX(x[1], 46.735705771); // should be 4.6736564644E+01);\n  VERIFY_IS_APPROX(x[2], 0.93219881891); // should be 9.3218483193E-01);\n}\n\nstruct thurber_functor : DenseFunctor<double>\n{\n    thurber_functor(void) : DenseFunctor<double>(7,37) {}\n    static const double _x[37];\n    static const double _y[37];\n    int operator()(const VectorXd &b, VectorXd &fvec)\n    {\n        //        int called=0; printf(\"call hahn1_functor with  iflag=%d, called=%d\\n\", iflag, called); if (iflag==1) called++;\n        assert(b.size()==7);\n        assert(fvec.size()==37);\n        for(int i=0; i<37; i++) {\n            double x=_x[i], xx=x*x, xxx=xx*x;\n            fvec[i] = (b[0]+b[1]*x+b[2]*xx+b[3]*xxx) / (1.+b[4]*x+b[5]*xx+b[6]*xxx) - _y[i];\n        }\n        return 0;\n    }\n    int df(const VectorXd &b, MatrixXd &fjac)\n    {\n        assert(b.size()==7);\n        assert(fjac.rows()==37);\n        assert(fjac.cols()==7);\n        for(int i=0; i<37; i++) {\n            double x=_x[i], xx=x*x, xxx=xx*x;\n            double fact = 1./(1.+b[4]*x+b[5]*xx+b[6]*xxx);\n            fjac(i,0) = 1.*fact;\n            fjac(i,1) = x*fact;\n            fjac(i,2) = xx*fact;\n            fjac(i,3) = xxx*fact;\n            fact = - (b[0]+b[1]*x+b[2]*xx+b[3]*xxx) * fact * fact;\n            fjac(i,4) = x*fact;\n            fjac(i,5) = xx*fact;\n            fjac(i,6) = xxx*fact;\n        }\n        return 0;\n    }\n};\nconst double thurber_functor::_x[37] = { -3.067E0, -2.981E0, -2.921E0, -2.912E0, -2.840E0, -2.797E0, -2.702E0, -2.699E0, -2.633E0, -2.481E0, -2.363E0, -2.322E0, -1.501E0, -1.460E0, -1.274E0, -1.212E0, -1.100E0, -1.046E0, -0.915E0, -0.714E0, -0.566E0, -0.545E0, -0.400E0, -0.309E0, -0.109E0, -0.103E0, 0.010E0, 0.119E0, 0.377E0, 0.790E0, 0.963E0, 1.006E0, 1.115E0, 1.572E0, 1.841E0, 2.047E0, 2.200E0 };\nconst double thurber_functor::_y[37] = { 80.574E0, 84.248E0, 87.264E0, 87.195E0, 89.076E0, 89.608E0, 89.868E0, 90.101E0, 92.405E0, 95.854E0, 100.696E0, 101.060E0, 401.672E0, 390.724E0, 567.534E0, 635.316E0, 733.054E0, 759.087E0, 894.206E0, 990.785E0, 1090.109E0, 1080.914E0, 1122.643E0, 1178.351E0, 1260.531E0, 1273.514E0, 1288.339E0, 1327.543E0, 1353.863E0, 1414.509E0, 1425.208E0, 1421.384E0, 1442.962E0, 1464.350E0, 1468.705E0, 1447.894E0, 1457.628E0};\n\n// http://www.itl.nist.gov/div898/strd/nls/data/thurber.shtml\nvoid testNistThurber(void)\n{\n  const int n=7;\n  int info;\n\n  VectorXd x(n);\n\n  /*\n   * First try\n   */\n  x<< 1000 ,1000 ,400 ,40 ,0.7,0.3,0.0 ;\n  // do the computation\n  thurber_functor functor;\n  LevenbergMarquardt<thurber_functor> lm(functor);\n  lm.setFtol(1.E4*NumTraits<double>::epsilon());\n  lm.setXtol(1.E4*NumTraits<double>::epsilon());\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev(), 39);\n  VERIFY_IS_EQUAL(lm.njev(), 36);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 5.6427082397E+03);\n  // check x\n  VERIFY_IS_APPROX(x[0], 1.2881396800E+03);\n  VERIFY_IS_APPROX(x[1], 1.4910792535E+03);\n  VERIFY_IS_APPROX(x[2], 5.8323836877E+02);\n  VERIFY_IS_APPROX(x[3], 7.5416644291E+01);\n  VERIFY_IS_APPROX(x[4], 9.6629502864E-01);\n  VERIFY_IS_APPROX(x[5], 3.9797285797E-01);\n  VERIFY_IS_APPROX(x[6], 4.9727297349E-02);\n\n  /*\n   * Second try\n   */\n  x<< 1300 ,1500 ,500  ,75   ,1    ,0.4  ,0.05  ;\n  // do the computation\n  lm.resetParameters();\n  lm.setFtol(1.E4*NumTraits<double>::epsilon());\n  lm.setXtol(1.E4*NumTraits<double>::epsilon());\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev(), 29);\n  VERIFY_IS_EQUAL(lm.njev(), 28);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 5.6427082397E+03);\n  // check x\n  VERIFY_IS_APPROX(x[0], 1.2881396800E+03);\n  VERIFY_IS_APPROX(x[1], 1.4910792535E+03);\n  VERIFY_IS_APPROX(x[2], 5.8323836877E+02);\n  VERIFY_IS_APPROX(x[3], 7.5416644291E+01);\n  VERIFY_IS_APPROX(x[4], 9.6629502864E-01);\n  VERIFY_IS_APPROX(x[5], 3.9797285797E-01);\n  VERIFY_IS_APPROX(x[6], 4.9727297349E-02);\n}\n\nstruct rat43_functor : DenseFunctor<double>\n{\n    rat43_functor(void) : DenseFunctor<double>(4,15) {}\n    static const double x[15];\n    static const double y[15];\n    int operator()(const VectorXd &b, VectorXd &fvec)\n    {\n        assert(b.size()==4);\n        assert(fvec.size()==15);\n        for(int i=0; i<15; i++)\n            fvec[i] = b[0] * pow(1.+exp(b[1]-b[2]*x[i]),-1./b[3]) - y[i];\n        return 0;\n    }\n    int df(const VectorXd &b, MatrixXd &fjac)\n    {\n        assert(b.size()==4);\n        assert(fjac.rows()==15);\n        assert(fjac.cols()==4);\n        for(int i=0; i<15; i++) {\n            double e = exp(b[1]-b[2]*x[i]);\n            double power = -1./b[3];\n            fjac(i,0) = pow(1.+e, power);\n            fjac(i,1) = power*b[0]*e*pow(1.+e, power-1.);\n            fjac(i,2) = -power*b[0]*e*x[i]*pow(1.+e, power-1.);\n            fjac(i,3) = b[0]*power*power*log(1.+e)*pow(1.+e, power);\n        }\n        return 0;\n    }\n};\nconst double rat43_functor::x[15] = { 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12., 13., 14., 15. };\nconst double rat43_functor::y[15] = { 16.08, 33.83, 65.80, 97.20, 191.55, 326.20, 386.87, 520.53, 590.03, 651.92, 724.93, 699.56, 689.96, 637.56, 717.41 };\n\n// http://www.itl.nist.gov/div898/strd/nls/data/ratkowsky3.shtml\nvoid testNistRat43(void)\n{\n  const int n=4;\n  int info;\n\n  VectorXd x(n);\n\n  /*\n   * First try\n   */\n  x<< 100., 10., 1., 1.;\n  // do the computation\n  rat43_functor functor;\n  LevenbergMarquardt<rat43_functor> lm(functor);\n  lm.setFtol(1.E6*NumTraits<double>::epsilon());\n  lm.setXtol(1.E6*NumTraits<double>::epsilon());\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev(), 27);\n  VERIFY_IS_EQUAL(lm.njev(), 20);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 8.7864049080E+03);\n  // check x\n  VERIFY_IS_APPROX(x[0], 6.9964151270E+02);\n  VERIFY_IS_APPROX(x[1], 5.2771253025E+00);\n  VERIFY_IS_APPROX(x[2], 7.5962938329E-01);\n  VERIFY_IS_APPROX(x[3], 1.2792483859E+00);\n\n  /*\n   * Second try\n   */\n  x<< 700., 5., 0.75, 1.3;\n  // do the computation\n  lm.resetParameters();\n  lm.setFtol(1.E5*NumTraits<double>::epsilon());\n  lm.setXtol(1.E5*NumTraits<double>::epsilon());\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev(), 9);\n  VERIFY_IS_EQUAL(lm.njev(), 8);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 8.7864049080E+03);\n  // check x\n  VERIFY_IS_APPROX(x[0], 6.9964151270E+02);\n  VERIFY_IS_APPROX(x[1], 5.2771253025E+00);\n  VERIFY_IS_APPROX(x[2], 7.5962938329E-01);\n  VERIFY_IS_APPROX(x[3], 1.2792483859E+00);\n}\n\n\n\nstruct eckerle4_functor : DenseFunctor<double>\n{\n    eckerle4_functor(void) : DenseFunctor<double>(3,35) {}\n    static const double x[35];\n    static const double y[35];\n    int operator()(const VectorXd &b, VectorXd &fvec)\n    {\n        assert(b.size()==3);\n        assert(fvec.size()==35);\n        for(int i=0; i<35; i++)\n            fvec[i] = b[0]/b[1] * exp(-0.5*(x[i]-b[2])*(x[i]-b[2])/(b[1]*b[1])) - y[i];\n        return 0;\n    }\n    int df(const VectorXd &b, MatrixXd &fjac)\n    {\n        assert(b.size()==3);\n        assert(fjac.rows()==35);\n        assert(fjac.cols()==3);\n        for(int i=0; i<35; i++) {\n            double b12 = b[1]*b[1];\n            double e = exp(-0.5*(x[i]-b[2])*(x[i]-b[2])/b12);\n            fjac(i,0) = e / b[1];\n            fjac(i,1) = ((x[i]-b[2])*(x[i]-b[2])/b12-1.) * b[0]*e/b12;\n            fjac(i,2) = (x[i]-b[2])*e*b[0]/b[1]/b12;\n        }\n        return 0;\n    }\n};\nconst double eckerle4_functor::x[35] = { 400.0, 405.0, 410.0, 415.0, 420.0, 425.0, 430.0, 435.0, 436.5, 438.0, 439.5, 441.0, 442.5, 444.0, 445.5, 447.0, 448.5, 450.0, 451.5, 453.0, 454.5, 456.0, 457.5, 459.0, 460.5, 462.0, 463.5, 465.0, 470.0, 475.0, 480.0, 485.0, 490.0, 495.0, 500.0};\nconst double eckerle4_functor::y[35] = { 0.0001575, 0.0001699, 0.0002350, 0.0003102, 0.0004917, 0.0008710, 0.0017418, 0.0046400, 0.0065895, 0.0097302, 0.0149002, 0.0237310, 0.0401683, 0.0712559, 0.1264458, 0.2073413, 0.2902366, 0.3445623, 0.3698049, 0.3668534, 0.3106727, 0.2078154, 0.1164354, 0.0616764, 0.0337200, 0.0194023, 0.0117831, 0.0074357, 0.0022732, 0.0008800, 0.0004579, 0.0002345, 0.0001586, 0.0001143, 0.0000710 };\n\n// http://www.itl.nist.gov/div898/strd/nls/data/eckerle4.shtml\nvoid testNistEckerle4(void)\n{\n  const int n=3;\n  int info;\n\n  VectorXd x(n);\n\n  /*\n   * First try\n   */\n  x<< 1., 10., 500.;\n  // do the computation\n  eckerle4_functor functor;\n  LevenbergMarquardt<eckerle4_functor> lm(functor);\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev(), 18);\n  VERIFY_IS_EQUAL(lm.njev(), 15);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 1.4635887487E-03);\n  // check x\n  VERIFY_IS_APPROX(x[0], 1.5543827178);\n  VERIFY_IS_APPROX(x[1], 4.0888321754);\n  VERIFY_IS_APPROX(x[2], 4.5154121844E+02);\n\n  /*\n   * Second try\n   */\n  x<< 1.5, 5., 450.;\n  // do the computation\n  info = lm.minimize(x);\n\n  // check return value\n  VERIFY_IS_EQUAL(info, 1);\n  VERIFY_IS_EQUAL(lm.nfev(), 7);\n  VERIFY_IS_EQUAL(lm.njev(), 6);\n  // check norm^2\n  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 1.4635887487E-03);\n  // check x\n  VERIFY_IS_APPROX(x[0], 1.5543827178);\n  VERIFY_IS_APPROX(x[1], 4.0888321754);\n  VERIFY_IS_APPROX(x[2], 4.5154121844E+02);\n}\n\nvoid test_levenberg_marquardt()\n{\n    // Tests using the examples provided by (c)minpack\n    CALL_SUBTEST(testLmder1());\n    CALL_SUBTEST(testLmder());\n    CALL_SUBTEST(testLmdif1());\n//     CALL_SUBTEST(testLmstr1());\n//     CALL_SUBTEST(testLmstr());\n    CALL_SUBTEST(testLmdif());\n\n    // NIST tests, level of difficulty = \"Lower\"\n    CALL_SUBTEST(testNistMisra1a());\n    CALL_SUBTEST(testNistChwirut2());\n\n    // NIST tests, level of difficulty = \"Average\"\n    CALL_SUBTEST(testNistHahn1());\n    CALL_SUBTEST(testNistMisra1d());\n    CALL_SUBTEST(testNistMGH17());\n    CALL_SUBTEST(testNistLanczos1());\n\n//     // NIST tests, level of difficulty = \"Higher\"\n    CALL_SUBTEST(testNistRat42());\n    CALL_SUBTEST(testNistMGH10());\n    CALL_SUBTEST(testNistBoxBOD());\n//     CALL_SUBTEST(testNistMGH09());\n    CALL_SUBTEST(testNistBennett5());\n    CALL_SUBTEST(testNistThurber());\n    CALL_SUBTEST(testNistRat43());\n    CALL_SUBTEST(testNistEckerle4());\n}\n"
  },
  {
    "path": "libs/eigen/unsupported/test/matrix_exponential.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009 Jitse Niesen <jitse@maths.leeds.ac.uk>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"matrix_functions.h\"\n\ndouble binom(int n, int k)\n{\n  double res = 1;\n  for (int i=0; i<k; i++)\n    res = res * (n-k+i+1) / (i+1);\n  return res;\n}\n\ntemplate <typename T>\nT expfn(T x, int)\n{\n  return std::exp(x);\n}\n\ntemplate <typename T>\nvoid test2dRotation(double tol)\n{\n  Matrix<T,2,2> A, B, C;\n  T angle;\n\n  A << 0, 1, -1, 0;\n  for (int i=0; i<=20; i++)\n  {\n    angle = static_cast<T>(pow(10, i / 5. - 2));\n    B << std::cos(angle), std::sin(angle), -std::sin(angle), std::cos(angle);\n\n    C = (angle*A).matrixFunction(expfn);\n    std::cout << \"test2dRotation: i = \" << i << \"   error funm = \" << relerr(C, B);\n    VERIFY(C.isApprox(B, static_cast<T>(tol)));\n\n    C = (angle*A).exp();\n    std::cout << \"   error expm = \" << relerr(C, B) << \"\\n\";\n    VERIFY(C.isApprox(B, static_cast<T>(tol)));\n  }\n}\n\ntemplate <typename T>\nvoid test2dHyperbolicRotation(double tol)\n{\n  Matrix<std::complex<T>,2,2> A, B, C;\n  std::complex<T> imagUnit(0,1);\n  T angle, ch, sh;\n\n  for (int i=0; i<=20; i++)\n  {\n    angle = static_cast<T>((i-10) / 2.0);\n    ch = std::cosh(angle);\n    sh = std::sinh(angle);\n    A << 0, angle*imagUnit, -angle*imagUnit, 0;\n    B << ch, sh*imagUnit, -sh*imagUnit, ch;\n\n    C = A.matrixFunction(expfn);\n    std::cout << \"test2dHyperbolicRotation: i = \" << i << \"   error funm = \" << relerr(C, B);\n    VERIFY(C.isApprox(B, static_cast<T>(tol)));\n\n    C = A.exp();\n    std::cout << \"   error expm = \" << relerr(C, B) << \"\\n\";\n    VERIFY(C.isApprox(B, static_cast<T>(tol)));\n  }\n}\n\ntemplate <typename T>\nvoid testPascal(double tol)\n{\n  for (int size=1; size<20; size++)\n  {\n    Matrix<T,Dynamic,Dynamic> A(size,size), B(size,size), C(size,size);\n    A.setZero();\n    for (int i=0; i<size-1; i++)\n      A(i+1,i) = static_cast<T>(i+1);\n    B.setZero();\n    for (int i=0; i<size; i++)\n      for (int j=0; j<=i; j++)\n    B(i,j) = static_cast<T>(binom(i,j));\n\n    C = A.matrixFunction(expfn);\n    std::cout << \"testPascal: size = \" << size << \"   error funm = \" << relerr(C, B);\n    VERIFY(C.isApprox(B, static_cast<T>(tol)));\n\n    C = A.exp();\n    std::cout << \"   error expm = \" << relerr(C, B) << \"\\n\";\n    VERIFY(C.isApprox(B, static_cast<T>(tol)));\n  }\n}\n\ntemplate<typename MatrixType>\nvoid randomTest(const MatrixType& m, double tol)\n{\n  /* this test covers the following files:\n     Inverse.h\n  */\n  typename MatrixType::Index rows = m.rows();\n  typename MatrixType::Index cols = m.cols();\n  MatrixType m1(rows, cols), m2(rows, cols), identity = MatrixType::Identity(rows, cols);\n\n  typedef typename NumTraits<typename internal::traits<MatrixType>::Scalar>::Real RealScalar;\n\n  for(int i = 0; i < g_repeat; i++) {\n    m1 = MatrixType::Random(rows, cols);\n\n    m2 = m1.matrixFunction(expfn) * (-m1).matrixFunction(expfn);\n    std::cout << \"randomTest: error funm = \" << relerr(identity, m2);\n    VERIFY(identity.isApprox(m2, static_cast<RealScalar>(tol)));\n\n    m2 = m1.exp() * (-m1).exp();\n    std::cout << \"   error expm = \" << relerr(identity, m2) << \"\\n\";\n    VERIFY(identity.isApprox(m2, static_cast<RealScalar>(tol)));\n  }\n}\n\nvoid test_matrix_exponential()\n{\n  CALL_SUBTEST_2(test2dRotation<double>(1e-13));\n  CALL_SUBTEST_1(test2dRotation<float>(2e-5));  // was 1e-5, relaxed for clang 2.8 / linux / x86-64\n  CALL_SUBTEST_8(test2dRotation<long double>(1e-13)); \n  CALL_SUBTEST_2(test2dHyperbolicRotation<double>(1e-14));\n  CALL_SUBTEST_1(test2dHyperbolicRotation<float>(1e-5));\n  CALL_SUBTEST_8(test2dHyperbolicRotation<long double>(1e-14));\n  CALL_SUBTEST_6(testPascal<float>(1e-6));\n  CALL_SUBTEST_5(testPascal<double>(1e-15));\n  CALL_SUBTEST_2(randomTest(Matrix2d(), 1e-13));\n  CALL_SUBTEST_7(randomTest(Matrix<double,3,3,RowMajor>(), 1e-13));\n  CALL_SUBTEST_3(randomTest(Matrix4cd(), 1e-13));\n  CALL_SUBTEST_4(randomTest(MatrixXd(8,8), 1e-13));\n  CALL_SUBTEST_1(randomTest(Matrix2f(), 1e-4));\n  CALL_SUBTEST_5(randomTest(Matrix3cf(), 1e-4));\n  CALL_SUBTEST_1(randomTest(Matrix4f(), 1e-4));\n  CALL_SUBTEST_6(randomTest(MatrixXf(8,8), 1e-4));\n  CALL_SUBTEST_9(randomTest(Matrix<long double,Dynamic,Dynamic>(7,7), 1e-13));\n}\n"
  },
  {
    "path": "libs/eigen/unsupported/test/matrix_function.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2010 Jitse Niesen <jitse@maths.leeds.ac.uk>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <unsupported/Eigen/MatrixFunctions>\n\n// Variant of VERIFY_IS_APPROX which uses absolute error instead of\n// relative error.\n#define VERIFY_IS_APPROX_ABS(a, b) VERIFY(test_isApprox_abs(a, b))\n\ntemplate<typename Type1, typename Type2>\ninline bool test_isApprox_abs(const Type1& a, const Type2& b)\n{\n  return ((a-b).array().abs() < test_precision<typename Type1::RealScalar>()).all();\n}\n\n\n// Returns a matrix with eigenvalues clustered around 0, 1 and 2.\ntemplate<typename MatrixType>\nMatrixType randomMatrixWithRealEivals(const typename MatrixType::Index size)\n{\n  typedef typename MatrixType::Index Index;\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename MatrixType::RealScalar RealScalar;\n  MatrixType diag = MatrixType::Zero(size, size);\n  for (Index i = 0; i < size; ++i) {\n    diag(i, i) = Scalar(RealScalar(internal::random<int>(0,2)))\n      + internal::random<Scalar>() * Scalar(RealScalar(0.01));\n  }\n  MatrixType A = MatrixType::Random(size, size);\n  HouseholderQR<MatrixType> QRofA(A);\n  return QRofA.householderQ().inverse() * diag * QRofA.householderQ();\n}\n\ntemplate <typename MatrixType, int IsComplex = NumTraits<typename internal::traits<MatrixType>::Scalar>::IsComplex>\nstruct randomMatrixWithImagEivals\n{\n  // Returns a matrix with eigenvalues clustered around 0 and +/- i.\n  static MatrixType run(const typename MatrixType::Index size);\n};\n\n// Partial specialization for real matrices\ntemplate<typename MatrixType>\nstruct randomMatrixWithImagEivals<MatrixType, 0>\n{\n  static MatrixType run(const typename MatrixType::Index size)\n  {\n    typedef typename MatrixType::Index Index;\n    typedef typename MatrixType::Scalar Scalar;\n    MatrixType diag = MatrixType::Zero(size, size);\n    Index i = 0;\n    while (i < size) {\n      Index randomInt = internal::random<Index>(-1, 1);\n      if (randomInt == 0 || i == size-1) {\n        diag(i, i) = internal::random<Scalar>() * Scalar(0.01);\n        ++i;\n      } else {\n        Scalar alpha = Scalar(randomInt) + internal::random<Scalar>() * Scalar(0.01);\n        diag(i, i+1) = alpha;\n        diag(i+1, i) = -alpha;\n        i += 2;\n      }\n    }\n    MatrixType A = MatrixType::Random(size, size);\n    HouseholderQR<MatrixType> QRofA(A);\n    return QRofA.householderQ().inverse() * diag * QRofA.householderQ();\n  }\n};\n\n// Partial specialization for complex matrices\ntemplate<typename MatrixType>\nstruct randomMatrixWithImagEivals<MatrixType, 1>\n{\n  static MatrixType run(const typename MatrixType::Index size)\n  {\n    typedef typename MatrixType::Index Index;\n    typedef typename MatrixType::Scalar Scalar;\n    typedef typename MatrixType::RealScalar RealScalar;\n    const Scalar imagUnit(0, 1);\n    MatrixType diag = MatrixType::Zero(size, size);\n    for (Index i = 0; i < size; ++i) {\n      diag(i, i) = Scalar(RealScalar(internal::random<Index>(-1, 1))) * imagUnit\n        + internal::random<Scalar>() * Scalar(RealScalar(0.01));\n    }\n    MatrixType A = MatrixType::Random(size, size);\n    HouseholderQR<MatrixType> QRofA(A);\n    return QRofA.householderQ().inverse() * diag * QRofA.householderQ();\n  }\n};\n\n\ntemplate<typename MatrixType>\nvoid testMatrixExponential(const MatrixType& A)\n{\n  typedef typename internal::traits<MatrixType>::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  typedef std::complex<RealScalar> ComplexScalar;\n\n  VERIFY_IS_APPROX(A.exp(), A.matrixFunction(StdStemFunctions<ComplexScalar>::exp));\n}\n\ntemplate<typename MatrixType>\nvoid testMatrixLogarithm(const MatrixType& A)\n{\n  typedef typename internal::traits<MatrixType>::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n\n  MatrixType scaledA;\n  RealScalar maxImagPartOfSpectrum = A.eigenvalues().imag().cwiseAbs().maxCoeff();\n  if (maxImagPartOfSpectrum >= 0.9 * M_PI)\n    scaledA = A * 0.9 * M_PI / maxImagPartOfSpectrum;\n  else\n    scaledA = A;\n\n  // identity X.exp().log() = X only holds if Im(lambda) < pi for all eigenvalues of X\n  MatrixType expA = scaledA.exp();\n  MatrixType logExpA = expA.log();\n  VERIFY_IS_APPROX(logExpA, scaledA);\n}\n\ntemplate<typename MatrixType>\nvoid testHyperbolicFunctions(const MatrixType& A)\n{\n  // Need to use absolute error because of possible cancellation when\n  // adding/subtracting expA and expmA.\n  VERIFY_IS_APPROX_ABS(A.sinh(), (A.exp() - (-A).exp()) / 2);\n  VERIFY_IS_APPROX_ABS(A.cosh(), (A.exp() + (-A).exp()) / 2);\n}\n\ntemplate<typename MatrixType>\nvoid testGonioFunctions(const MatrixType& A)\n{\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename NumTraits<Scalar>::Real RealScalar;\n  typedef std::complex<RealScalar> ComplexScalar;\n  typedef Matrix<ComplexScalar, MatrixType::RowsAtCompileTime, \n                 MatrixType::ColsAtCompileTime, MatrixType::Options> ComplexMatrix;\n\n  ComplexScalar imagUnit(0,1);\n  ComplexScalar two(2,0);\n\n  ComplexMatrix Ac = A.template cast<ComplexScalar>();\n  \n  ComplexMatrix exp_iA = (imagUnit * Ac).exp();\n  ComplexMatrix exp_miA = (-imagUnit * Ac).exp();\n  \n  ComplexMatrix sinAc = A.sin().template cast<ComplexScalar>();\n  VERIFY_IS_APPROX_ABS(sinAc, (exp_iA - exp_miA) / (two*imagUnit));\n  \n  ComplexMatrix cosAc = A.cos().template cast<ComplexScalar>();\n  VERIFY_IS_APPROX_ABS(cosAc, (exp_iA + exp_miA) / 2);\n}\n\ntemplate<typename MatrixType>\nvoid testMatrix(const MatrixType& A)\n{\n  testMatrixExponential(A);\n  testMatrixLogarithm(A);\n  testHyperbolicFunctions(A);\n  testGonioFunctions(A);\n}\n\ntemplate<typename MatrixType>\nvoid testMatrixType(const MatrixType& m)\n{\n  // Matrices with clustered eigenvalue lead to different code paths\n  // in MatrixFunction.h and are thus useful for testing.\n  typedef typename MatrixType::Index Index;\n\n  const Index size = m.rows();\n  for (int i = 0; i < g_repeat; i++) {\n    testMatrix(MatrixType::Random(size, size).eval());\n    testMatrix(randomMatrixWithRealEivals<MatrixType>(size));\n    testMatrix(randomMatrixWithImagEivals<MatrixType>::run(size));\n  }\n}\n\nvoid test_matrix_function()\n{\n  CALL_SUBTEST_1(testMatrixType(Matrix<float,1,1>()));\n  CALL_SUBTEST_2(testMatrixType(Matrix3cf()));\n  CALL_SUBTEST_3(testMatrixType(MatrixXf(8,8)));\n  CALL_SUBTEST_4(testMatrixType(Matrix2d()));\n  CALL_SUBTEST_5(testMatrixType(Matrix<double,5,5,RowMajor>()));\n  CALL_SUBTEST_6(testMatrixType(Matrix4cd()));\n  CALL_SUBTEST_7(testMatrixType(MatrixXd(13,13)));\n}\n"
  },
  {
    "path": "libs/eigen/unsupported/test/matrix_functions.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2009-2011 Jitse Niesen <jitse@maths.leeds.ac.uk>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <unsupported/Eigen/MatrixFunctions>\n\ntemplate <typename MatrixType, int IsComplex = NumTraits<typename internal::traits<MatrixType>::Scalar>::IsComplex>\nstruct generateTestMatrix;\n\n// for real matrices, make sure none of the eigenvalues are negative\ntemplate <typename MatrixType>\nstruct generateTestMatrix<MatrixType,0>\n{\n  static void run(MatrixType& result, typename MatrixType::Index size)\n  {\n    MatrixType mat = MatrixType::Random(size, size);\n    EigenSolver<MatrixType> es(mat);\n    typename EigenSolver<MatrixType>::EigenvalueType eivals = es.eigenvalues();\n    for (typename MatrixType::Index i = 0; i < size; ++i) {\n      if (eivals(i).imag() == 0 && eivals(i).real() < 0)\n\teivals(i) = -eivals(i);\n    }\n    result = (es.eigenvectors() * eivals.asDiagonal() * es.eigenvectors().inverse()).real();\n  }\n};\n\n// for complex matrices, any matrix is fine\ntemplate <typename MatrixType>\nstruct generateTestMatrix<MatrixType,1>\n{\n  static void run(MatrixType& result, typename MatrixType::Index size)\n  {\n    result = MatrixType::Random(size, size);\n  }\n};\n\ntemplate <typename Derived, typename OtherDerived>\ndouble relerr(const MatrixBase<Derived>& A, const MatrixBase<OtherDerived>& B)\n{\n  return std::sqrt((A - B).cwiseAbs2().sum() / (std::min)(A.cwiseAbs2().sum(), B.cwiseAbs2().sum()));\n}\n"
  },
  {
    "path": "libs/eigen/unsupported/test/matrix_power.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2012 Chen-Pang He <jdh8@ms63.hinet.net>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"matrix_functions.h\"\n\ntemplate <typename MatrixType, int IsComplex = NumTraits<typename MatrixType::Scalar>::IsComplex>\nstruct generateTriangularMatrix;\n\n// for real matrices, make sure none of the eigenvalues are negative\ntemplate <typename MatrixType>\nstruct generateTriangularMatrix<MatrixType,0>\n{\n  static void run(MatrixType& result, typename MatrixType::Index size)\n  {\n    result.resize(size, size);\n    result.template triangularView<Upper>() = MatrixType::Random(size, size);\n    for (typename MatrixType::Index i = 0; i < size; ++i)\n      result.coeffRef(i,i) = std::abs(result.coeff(i,i));\n  }\n};\n\n// for complex matrices, any matrix is fine\ntemplate <typename MatrixType>\nstruct generateTriangularMatrix<MatrixType,1>\n{\n  static void run(MatrixType& result, typename MatrixType::Index size)\n  {\n    result.resize(size, size);\n    result.template triangularView<Upper>() = MatrixType::Random(size, size);\n  }\n};\n\ntemplate<typename T>\nvoid test2dRotation(double tol)\n{\n  Matrix<T,2,2> A, B, C;\n  T angle, c, s;\n\n  A << 0, 1, -1, 0;\n  MatrixPower<Matrix<T,2,2> > Apow(A);\n\n  for (int i=0; i<=20; ++i) {\n    angle = pow(10, (i-10) / 5.);\n    c = std::cos(angle);\n    s = std::sin(angle);\n    B << c, s, -s, c;\n\n    C = Apow(std::ldexp(angle,1) / M_PI);\n    std::cout << \"test2dRotation: i = \" << i << \"   error powerm = \" << relerr(C,B) << '\\n';\n    VERIFY(C.isApprox(B, static_cast<T>(tol)));\n  }\n}\n\ntemplate<typename T>\nvoid test2dHyperbolicRotation(double tol)\n{\n  Matrix<std::complex<T>,2,2> A, B, C;\n  T angle, ch = std::cosh((T)1);\n  std::complex<T> ish(0, std::sinh((T)1));\n\n  A << ch, ish, -ish, ch;\n  MatrixPower<Matrix<std::complex<T>,2,2> > Apow(A);\n\n  for (int i=0; i<=20; ++i) {\n    angle = std::ldexp(static_cast<T>(i-10), -1);\n    ch = std::cosh(angle);\n    ish = std::complex<T>(0, std::sinh(angle));\n    B << ch, ish, -ish, ch;\n\n    C = Apow(angle);\n    std::cout << \"test2dHyperbolicRotation: i = \" << i << \"   error powerm = \" << relerr(C,B) << '\\n';\n    VERIFY(C.isApprox(B, static_cast<T>(tol)));\n  }\n}\n\ntemplate<typename MatrixType>\nvoid testExponentLaws(const MatrixType& m, double tol)\n{\n  typedef typename MatrixType::RealScalar RealScalar;\n  MatrixType m1, m2, m3, m4, m5;\n  RealScalar x, y;\n\n  for (int i=0; i < g_repeat; ++i) {\n    generateTestMatrix<MatrixType>::run(m1, m.rows());\n    MatrixPower<MatrixType> mpow(m1);\n\n    x = internal::random<RealScalar>();\n    y = internal::random<RealScalar>();\n    m2 = mpow(x);\n    m3 = mpow(y);\n\n    m4 = mpow(x+y);\n    m5.noalias() = m2 * m3;\n    VERIFY(m4.isApprox(m5, static_cast<RealScalar>(tol)));\n\n    m4 = mpow(x*y);\n    m5 = m2.pow(y);\n    VERIFY(m4.isApprox(m5, static_cast<RealScalar>(tol)));\n\n    m4 = (std::abs(x) * m1).pow(y);\n    m5 = std::pow(std::abs(x), y) * m3;\n    VERIFY(m4.isApprox(m5, static_cast<RealScalar>(tol)));\n  }\n}\n\ntypedef Matrix<double,3,3,RowMajor>         Matrix3dRowMajor;\ntypedef Matrix<long double,Dynamic,Dynamic> MatrixXe;\n \nvoid test_matrix_power()\n{\n  CALL_SUBTEST_2(test2dRotation<double>(1e-13));\n  CALL_SUBTEST_1(test2dRotation<float>(2e-5));  // was 1e-5, relaxed for clang 2.8 / linux / x86-64\n  CALL_SUBTEST_9(test2dRotation<long double>(1e-13)); \n  CALL_SUBTEST_2(test2dHyperbolicRotation<double>(1e-14));\n  CALL_SUBTEST_1(test2dHyperbolicRotation<float>(1e-5));\n  CALL_SUBTEST_9(test2dHyperbolicRotation<long double>(1e-14));\n\n  CALL_SUBTEST_2(testExponentLaws(Matrix2d(),         1e-13));\n  CALL_SUBTEST_7(testExponentLaws(Matrix3dRowMajor(), 1e-13));\n  CALL_SUBTEST_3(testExponentLaws(Matrix4cd(),        1e-13));\n  CALL_SUBTEST_4(testExponentLaws(MatrixXd(8,8),      2e-12));\n  CALL_SUBTEST_1(testExponentLaws(Matrix2f(),         1e-4));\n  CALL_SUBTEST_5(testExponentLaws(Matrix3cf(),        1e-4));\n  CALL_SUBTEST_8(testExponentLaws(Matrix4f(),         1e-4));\n  CALL_SUBTEST_6(testExponentLaws(MatrixXf(2,2),      1e-3)); // see bug 614\n  CALL_SUBTEST_9(testExponentLaws(MatrixXe(7,7),      1e-13));\n}\n"
  },
  {
    "path": "libs/eigen/unsupported/test/matrix_square_root.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2011 Jitse Niesen <jitse@maths.leeds.ac.uk>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"matrix_functions.h\"\n\ntemplate<typename MatrixType>\nvoid testMatrixSqrt(const MatrixType& m)\n{\n  MatrixType A;\n  generateTestMatrix<MatrixType>::run(A, m.rows());\n  MatrixType sqrtA = A.sqrt();\n  VERIFY_IS_APPROX(sqrtA * sqrtA, A);\n}\n\nvoid test_matrix_square_root()\n{\n  for (int i = 0; i < g_repeat; i++) {\n    CALL_SUBTEST_1(testMatrixSqrt(Matrix3cf()));\n    CALL_SUBTEST_2(testMatrixSqrt(MatrixXcd(12,12)));\n    CALL_SUBTEST_3(testMatrixSqrt(Matrix4f()));\n    CALL_SUBTEST_4(testMatrixSqrt(Matrix<double,Dynamic,Dynamic,RowMajor>(9, 9)));\n    CALL_SUBTEST_5(testMatrixSqrt(Matrix<float,1,1>()));\n    CALL_SUBTEST_5(testMatrixSqrt(Matrix<std::complex<float>,1,1>()));\n  }\n}\n"
  },
  {
    "path": "libs/eigen/unsupported/test/minres.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2011 Gael Guennebaud <g.gael@free.fr>\n// Copyright (C) 2012 Giacomo Po <gpo@ucla.edu>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n#include <cmath>\n\n#include \"../../test/sparse_solver.h\"\n#include <Eigen/IterativeSolvers>\n\ntemplate<typename T> void test_minres_T()\n{\n  MINRES<SparseMatrix<T>, Lower|Upper, DiagonalPreconditioner<T> > minres_colmajor_diag;\n  MINRES<SparseMatrix<T>, Lower, IdentityPreconditioner    > minres_colmajor_lower_I;\n  MINRES<SparseMatrix<T>, Upper, IdentityPreconditioner    > minres_colmajor_upper_I;\n//  MINRES<SparseMatrix<T>, Lower, IncompleteLUT<T> >           minres_colmajor_ilut;\n  //minres<SparseMatrix<T>, SSORPreconditioner<T> >     minres_colmajor_ssor;\n\n\n//   CALL_SUBTEST( check_sparse_square_solving(minres_colmajor_diag)  );\n // CALL_SUBTEST( check_sparse_square_solving(minres_colmajor_ilut)     );\n  //CALL_SUBTEST( check_sparse_square_solving(minres_colmajor_ssor)     );\n\n  // Diagonal preconditioner\n  MINRES<SparseMatrix<T>, Lower, DiagonalPreconditioner<T> > minres_colmajor_lower_diag;\n  MINRES<SparseMatrix<T>, Upper, DiagonalPreconditioner<T> > minres_colmajor_upper_diag;\n  MINRES<SparseMatrix<T>, Upper|Lower, DiagonalPreconditioner<T> > minres_colmajor_uplo_diag;\n  \n  // call tests for SPD matrix\n  CALL_SUBTEST( check_sparse_spd_solving(minres_colmajor_lower_I) );\n  CALL_SUBTEST( check_sparse_spd_solving(minres_colmajor_upper_I) );\n    \n  CALL_SUBTEST( check_sparse_spd_solving(minres_colmajor_lower_diag)  );\n  CALL_SUBTEST( check_sparse_spd_solving(minres_colmajor_upper_diag)  );\n//   CALL_SUBTEST( check_sparse_spd_solving(minres_colmajor_uplo_diag)  );\n    \n  // TO DO: symmetric semi-definite matrix\n  // TO DO: symmetric indefinite matrix\n}\n\nvoid test_minres()\n{\n  CALL_SUBTEST_1(test_minres_T<double>());\n//  CALL_SUBTEST_2(test_minres_T<std::complex<double> >());\n}\n"
  },
  {
    "path": "libs/eigen/unsupported/test/mpreal/mpreal.h",
    "content": "/*\r\n    MPFR C++: Multi-precision floating point number class for C++. \r\n    Based on MPFR library:    http://mpfr.org\r\n\r\n    Project homepage:    http://www.holoborodko.com/pavel/mpfr\r\n    Contact e-mail:      pavel@holoborodko.com\r\n\r\n    Copyright (c) 2008-2014 Pavel Holoborodko\r\n\r\n    Contributors:\r\n    Dmitriy Gubanov, Konstantin Holoborodko, Brian Gladman, \r\n    Helmut Jarausch, Fokko Beekhof, Ulrich Mutze, Heinz van Saanen, \r\n    Pere Constans, Peter van Hoof, Gael Guennebaud, Tsai Chia Cheng, \r\n    Alexei Zubanov, Jauhien Piatlicki, Victor Berger, John Westwood,\r\n    Petr Aleksandrov, Orion Poplawski, Charles Karney.\r\n\r\n    Licensing:\r\n    (A) MPFR C++ is under GNU General Public License (\"GPL\").\r\n    \r\n    (B) Non-free licenses may also be purchased from the author, for users who \r\n        do not want their programs protected by the GPL.\r\n\r\n        The non-free licenses are for users that wish to use MPFR C++ in \r\n        their products but are unwilling to release their software \r\n        under the GPL (which would require them to release source code \r\n        and allow free redistribution).\r\n\r\n        Such users can purchase an unlimited-use license from the author.\r\n        Contact us for more details.\r\n    \r\n    GNU General Public License (\"GPL\") copyright permissions statement:\r\n    **************************************************************************\r\n    This program is free software: you can redistribute it and/or modify\r\n    it under the terms of the GNU General Public License as published by\r\n    the Free Software Foundation, either version 3 of the License, or\r\n    (at your option) any later version.\r\n\r\n    This program is distributed in the hope that it will be useful,\r\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n    GNU General Public License for more details.\r\n\r\n    You should have received a copy of the GNU General Public License\r\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n#ifndef __MPREAL_H__\r\n#define __MPREAL_H__\r\n\r\n#include <string>\r\n#include <iostream>\r\n#include <sstream>\r\n#include <stdexcept>\r\n#include <cfloat>\r\n#include <cmath>\r\n#include <cstring>\r\n#include <limits>\r\n\r\n// Options\r\n// FIXME HAVE_INT64_SUPPORT leads to clashes with long int and int64_t on some systems.\r\n//#define MPREAL_HAVE_INT64_SUPPORT               // Enable int64_t support if possible. Available only for MSVC 2010 & GCC.\r\n#define MPREAL_HAVE_MSVC_DEBUGVIEW              // Enable Debugger Visualizer for \"Debug\" builds in MSVC.\r\n#define MPREAL_HAVE_DYNAMIC_STD_NUMERIC_LIMITS  // Enable extended std::numeric_limits<mpfr::mpreal> specialization.\r\n                                                // Meaning that \"digits\", \"round_style\" and similar members are defined as functions, not constants.\r\n                                                // See std::numeric_limits<mpfr::mpreal> at the end of the file for more information.\r\n\r\n// Library version\r\n#define MPREAL_VERSION_MAJOR 3\r\n#define MPREAL_VERSION_MINOR 5\r\n#define MPREAL_VERSION_PATCHLEVEL 9\r\n#define MPREAL_VERSION_STRING \"3.5.9\"\r\n\r\n// Detect compiler using signatures from http://predef.sourceforge.net/\r\n#if defined(__GNUC__) && defined(__INTEL_COMPILER)\r\n    #define IsInf(x) isinf(x)                   // Intel ICC compiler on Linux \r\n\r\n#elif defined(_MSC_VER)                         // Microsoft Visual C++ \r\n    #define IsInf(x) (!_finite(x))                           \r\n\r\n#else\r\n    #define IsInf(x) std::isinf(x)              // GNU C/C++ (and/or other compilers), just hope for C99 conformance\r\n#endif\r\n\r\n// A Clang feature extension to determine compiler features.\r\n#ifndef __has_feature\r\n    #define __has_feature(x) 0\r\n#endif\r\n\r\n// Detect support for r-value references (move semantic). Borrowed from Eigen.\r\n#if (__has_feature(cxx_rvalue_references) || \\\r\n       defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L || \\\r\n      (defined(_MSC_VER) && _MSC_VER >= 1600))\r\n\r\n    #define MPREAL_HAVE_MOVE_SUPPORT\r\n\r\n    // Use fields in mpfr_t structure to check if it was initialized / set dummy initialization \r\n    #define mpfr_is_initialized(x)      (0 != (x)->_mpfr_d)\r\n    #define mpfr_set_uninitialized(x)   ((x)->_mpfr_d = 0 )\r\n#endif\r\n\r\n// Detect support for explicit converters. \r\n#if (__has_feature(cxx_explicit_conversions) || \\\r\n       defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L || \\\r\n      (defined(_MSC_VER) && _MSC_VER >= 1800))\r\n\r\n    #define MPREAL_HAVE_EXPLICIT_CONVERTERS\r\n#endif\r\n\r\n// Detect available 64-bit capabilities\r\n#if defined(MPREAL_HAVE_INT64_SUPPORT)\r\n    \r\n    #define MPFR_USE_INTMAX_T                   // Should be defined before mpfr.h\r\n\r\n    #if defined(_MSC_VER)                       // MSVC + Windows\r\n        #if (_MSC_VER >= 1600)                    \r\n            #include <stdint.h>                 // <stdint.h> is available only in msvc2010!\r\n\r\n        #else                                   // MPFR relies on intmax_t which is available only in msvc2010\r\n            #undef MPREAL_HAVE_INT64_SUPPORT    // Besides, MPFR & MPIR have to be compiled with msvc2010\r\n            #undef MPFR_USE_INTMAX_T            // Since we cannot detect this, disable x64 by default\r\n                                                // Someone should change this manually if needed.\r\n        #endif\r\n\r\n    #elif defined (__GNUC__) && defined(__linux__)\r\n        #if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || defined(__ia64) || defined(__itanium__) || defined(_M_IA64) || defined (__PPC64__)\r\n            #undef MPREAL_HAVE_INT64_SUPPORT    // Remove all shaman dances for x64 builds since\r\n            #undef MPFR_USE_INTMAX_T            // GCC already supports x64 as of \"long int\" is 64-bit integer, nothing left to do\r\n        #else\r\n            #include <stdint.h>                 // use int64_t, uint64_t otherwise\r\n        #endif\r\n\r\n    #else\r\n        #include <stdint.h>                     // rely on int64_t, uint64_t in all other cases, Mac OSX, etc.\r\n    #endif\r\n\r\n#endif \r\n\r\n#if defined(MPREAL_HAVE_MSVC_DEBUGVIEW) && defined(_MSC_VER) && defined(_DEBUG)\r\n    #define MPREAL_MSVC_DEBUGVIEW_CODE     DebugView = toString();\r\n    #define MPREAL_MSVC_DEBUGVIEW_DATA     std::string DebugView;\r\n#else\r\n    #define MPREAL_MSVC_DEBUGVIEW_CODE \r\n    #define MPREAL_MSVC_DEBUGVIEW_DATA \r\n#endif\r\n\r\n#include <mpfr.h>\r\n\r\n#if (MPFR_VERSION < MPFR_VERSION_NUM(3,0,0))\r\n    #include <cstdlib>                          // Needed for random()\r\n#endif\r\n\r\n// Less important options\r\n#define MPREAL_DOUBLE_BITS_OVERFLOW -1          // Triggers overflow exception during conversion to double if mpreal \r\n                                                // cannot fit in MPREAL_DOUBLE_BITS_OVERFLOW bits\r\n                                                // = -1 disables overflow checks (default)\r\n#if defined(__GNUC__)\r\n  #define MPREAL_PERMISSIVE_EXPR __extension__\r\n#else\r\n  #define MPREAL_PERMISSIVE_EXPR\r\n#endif\r\n\r\nnamespace mpfr {\r\n\r\nclass mpreal {\r\nprivate:\r\n    mpfr_t mp;\r\n    \r\npublic:\r\n    \r\n    // Get default rounding mode & precision\r\n    inline static mp_rnd_t   get_default_rnd()    {    return (mp_rnd_t)(mpfr_get_default_rounding_mode());       }\r\n    inline static mp_prec_t  get_default_prec()   {    return mpfr_get_default_prec();                            }\r\n\r\n    // Constructors && type conversions\r\n    mpreal();\r\n    mpreal(const mpreal& u);\r\n    mpreal(const mpf_t u);    \r\n    mpreal(const mpz_t u,             mp_prec_t prec = mpreal::get_default_prec(), mp_rnd_t mode = mpreal::get_default_rnd());    \r\n    mpreal(const mpq_t u,             mp_prec_t prec = mpreal::get_default_prec(), mp_rnd_t mode = mpreal::get_default_rnd());    \r\n    mpreal(const double u,            mp_prec_t prec = mpreal::get_default_prec(), mp_rnd_t mode = mpreal::get_default_rnd());\r\n    mpreal(const long double u,       mp_prec_t prec = mpreal::get_default_prec(), mp_rnd_t mode = mpreal::get_default_rnd());\r\n    mpreal(const unsigned long int u, mp_prec_t prec = mpreal::get_default_prec(), mp_rnd_t mode = mpreal::get_default_rnd());\r\n    mpreal(const unsigned int u,      mp_prec_t prec = mpreal::get_default_prec(), mp_rnd_t mode = mpreal::get_default_rnd());\r\n    mpreal(const long int u,          mp_prec_t prec = mpreal::get_default_prec(), mp_rnd_t mode = mpreal::get_default_rnd());\r\n    mpreal(const int u,               mp_prec_t prec = mpreal::get_default_prec(), mp_rnd_t mode = mpreal::get_default_rnd());\r\n    \r\n    // Construct mpreal from mpfr_t structure.\r\n    // shared = true allows to avoid deep copy, so that mpreal and 'u' share the same data & pointers.    \r\n    mpreal(const mpfr_t  u, bool shared = false);   \r\n\r\n#if defined (MPREAL_HAVE_INT64_SUPPORT)\r\n    mpreal(const uint64_t u,          mp_prec_t prec = mpreal::get_default_prec(),  mp_rnd_t mode = mpreal::get_default_rnd());\r\n    mpreal(const int64_t u,           mp_prec_t prec = mpreal::get_default_prec(),  mp_rnd_t mode = mpreal::get_default_rnd());\r\n#endif\r\n\r\n    mpreal(const char* s,             mp_prec_t prec = mpreal::get_default_prec(), int base = 10, mp_rnd_t mode = mpreal::get_default_rnd());\r\n    mpreal(const std::string& s,      mp_prec_t prec = mpreal::get_default_prec(), int base = 10, mp_rnd_t mode = mpreal::get_default_rnd());\r\n\r\n    ~mpreal();                           \r\n\r\n#ifdef MPREAL_HAVE_MOVE_SUPPORT\r\n    mpreal& operator=(mpreal&& v);\r\n    mpreal(mpreal&& u);\r\n#endif\r\n\r\n    // Operations\r\n    // =\r\n    // +, -, *, /, ++, --, <<, >> \r\n    // *=, +=, -=, /=,\r\n    // <, >, ==, <=, >=\r\n\r\n    // =\r\n    mpreal& operator=(const mpreal& v);\r\n    mpreal& operator=(const mpf_t v);\r\n    mpreal& operator=(const mpz_t v);\r\n    mpreal& operator=(const mpq_t v);\r\n    mpreal& operator=(const long double v);\r\n    mpreal& operator=(const double v);        \r\n    mpreal& operator=(const unsigned long int v);\r\n    mpreal& operator=(const unsigned int v);\r\n    mpreal& operator=(const long int v);\r\n    mpreal& operator=(const int v);\r\n    mpreal& operator=(const char* s);\r\n    mpreal& operator=(const std::string& s);\r\n\r\n    // +\r\n    mpreal& operator+=(const mpreal& v);\r\n    mpreal& operator+=(const mpf_t v);\r\n    mpreal& operator+=(const mpz_t v);\r\n    mpreal& operator+=(const mpq_t v);\r\n    mpreal& operator+=(const long double u);\r\n    mpreal& operator+=(const double u);\r\n    mpreal& operator+=(const unsigned long int u);\r\n    mpreal& operator+=(const unsigned int u);\r\n    mpreal& operator+=(const long int u);\r\n    mpreal& operator+=(const int u);\r\n\r\n#if defined (MPREAL_HAVE_INT64_SUPPORT)\r\n    mpreal& operator+=(const int64_t  u);\r\n    mpreal& operator+=(const uint64_t u);\r\n    mpreal& operator-=(const int64_t  u);\r\n    mpreal& operator-=(const uint64_t u);\r\n    mpreal& operator*=(const int64_t  u);\r\n    mpreal& operator*=(const uint64_t u);\r\n    mpreal& operator/=(const int64_t  u);\r\n    mpreal& operator/=(const uint64_t u);\r\n#endif \r\n\r\n    const mpreal operator+() const;\r\n    mpreal& operator++ ();\r\n    const mpreal  operator++ (int); \r\n\r\n    // -\r\n    mpreal& operator-=(const mpreal& v);\r\n    mpreal& operator-=(const mpz_t v);\r\n    mpreal& operator-=(const mpq_t v);\r\n    mpreal& operator-=(const long double u);\r\n    mpreal& operator-=(const double u);\r\n    mpreal& operator-=(const unsigned long int u);\r\n    mpreal& operator-=(const unsigned int u);\r\n    mpreal& operator-=(const long int u);\r\n    mpreal& operator-=(const int u);\r\n    const mpreal operator-() const;\r\n    friend const mpreal operator-(const unsigned long int b, const mpreal& a);\r\n    friend const mpreal operator-(const unsigned int b,      const mpreal& a);\r\n    friend const mpreal operator-(const long int b,          const mpreal& a);\r\n    friend const mpreal operator-(const int b,               const mpreal& a);\r\n    friend const mpreal operator-(const double b,            const mpreal& a);\r\n    mpreal& operator-- ();    \r\n    const mpreal  operator-- (int);\r\n\r\n    // *\r\n    mpreal& operator*=(const mpreal& v);\r\n    mpreal& operator*=(const mpz_t v);\r\n    mpreal& operator*=(const mpq_t v);\r\n    mpreal& operator*=(const long double v);\r\n    mpreal& operator*=(const double v);\r\n    mpreal& operator*=(const unsigned long int v);\r\n    mpreal& operator*=(const unsigned int v);\r\n    mpreal& operator*=(const long int v);\r\n    mpreal& operator*=(const int v);\r\n    \r\n    // /\r\n    mpreal& operator/=(const mpreal& v);\r\n    mpreal& operator/=(const mpz_t v);\r\n    mpreal& operator/=(const mpq_t v);\r\n    mpreal& operator/=(const long double v);\r\n    mpreal& operator/=(const double v);\r\n    mpreal& operator/=(const unsigned long int v);\r\n    mpreal& operator/=(const unsigned int v);\r\n    mpreal& operator/=(const long int v);\r\n    mpreal& operator/=(const int v);\r\n    friend const mpreal operator/(const unsigned long int b, const mpreal& a);\r\n    friend const mpreal operator/(const unsigned int b,      const mpreal& a);\r\n    friend const mpreal operator/(const long int b,          const mpreal& a);\r\n    friend const mpreal operator/(const int b,               const mpreal& a);\r\n    friend const mpreal operator/(const double b,            const mpreal& a);\r\n\r\n    //<<= Fast Multiplication by 2^u\r\n    mpreal& operator<<=(const unsigned long int u);\r\n    mpreal& operator<<=(const unsigned int u);\r\n    mpreal& operator<<=(const long int u);\r\n    mpreal& operator<<=(const int u);\r\n\r\n    //>>= Fast Division by 2^u\r\n    mpreal& operator>>=(const unsigned long int u);\r\n    mpreal& operator>>=(const unsigned int u);\r\n    mpreal& operator>>=(const long int u);\r\n    mpreal& operator>>=(const int u);\r\n\r\n    // Boolean Operators\r\n    friend bool operator >  (const mpreal& a, const mpreal& b);\r\n    friend bool operator >= (const mpreal& a, const mpreal& b);\r\n    friend bool operator <  (const mpreal& a, const mpreal& b);\r\n    friend bool operator <= (const mpreal& a, const mpreal& b);\r\n    friend bool operator == (const mpreal& a, const mpreal& b);\r\n    friend bool operator != (const mpreal& a, const mpreal& b);\r\n\r\n    // Optimized specializations for boolean operators\r\n    friend bool operator == (const mpreal& a, const unsigned long int b);\r\n    friend bool operator == (const mpreal& a, const unsigned int b);\r\n    friend bool operator == (const mpreal& a, const long int b);\r\n    friend bool operator == (const mpreal& a, const int b);\r\n    friend bool operator == (const mpreal& a, const long double b);\r\n    friend bool operator == (const mpreal& a, const double b);\r\n\r\n    // Type Conversion operators\r\n    bool            toBool      (mp_rnd_t mode = GMP_RNDZ)    const;\r\n    long            toLong      (mp_rnd_t mode = GMP_RNDZ)    const;\r\n    unsigned long   toULong     (mp_rnd_t mode = GMP_RNDZ)    const;\r\n    float           toFloat     (mp_rnd_t mode = GMP_RNDN)    const;\r\n    double          toDouble    (mp_rnd_t mode = GMP_RNDN)    const;\r\n    long double     toLDouble   (mp_rnd_t mode = GMP_RNDN)    const;\r\n\r\n#if defined (MPREAL_HAVE_EXPLICIT_CONVERTERS)\r\n    explicit operator bool               () const { return toBool();       }\r\n    explicit operator int                () const { return toLong();       }\r\n    explicit operator long               () const { return toLong();       }\r\n    explicit operator long long          () const { return toLong();       }\r\n    explicit operator unsigned           () const { return toULong();      }\r\n    explicit operator unsigned long      () const { return toULong();      }\r\n    explicit operator unsigned long long () const { return toULong();      }\r\n    explicit operator float              () const { return toFloat();      }\r\n    explicit operator double             () const { return toDouble();     }\r\n    explicit operator long double        () const { return toLDouble();    }\r\n#endif\r\n\r\n#if defined (MPREAL_HAVE_INT64_SUPPORT)\r\n    int64_t         toInt64     (mp_rnd_t mode = GMP_RNDZ)    const;\r\n    uint64_t        toUInt64    (mp_rnd_t mode = GMP_RNDZ)    const;\r\n\r\n    #if defined (MPREAL_HAVE_EXPLICIT_CONVERTERS)\r\n    explicit operator int64_t   () const { return toInt64();      }\r\n    explicit operator uint64_t  () const { return toUInt64();     }\r\n    #endif\r\n#endif\r\n\r\n    // Get raw pointers so that mpreal can be directly used in raw mpfr_* functions\r\n    ::mpfr_ptr    mpfr_ptr();\r\n    ::mpfr_srcptr mpfr_ptr()    const;\r\n    ::mpfr_srcptr mpfr_srcptr() const;\r\n\r\n    // Convert mpreal to string with n significant digits in base b\r\n    // n = -1 -> convert with the maximum available digits\r\n    std::string toString(int n = -1, int b = 10, mp_rnd_t mode = mpreal::get_default_rnd()) const;\r\n\r\n#if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0))\r\n    std::string toString(const std::string& format) const;\r\n#endif\r\n\r\n    std::ostream& output(std::ostream& os) const;\r\n\r\n    // Math Functions\r\n    friend const mpreal sqr (const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal sqrt(const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal sqrt(const unsigned long int v, mp_rnd_t rnd_mode);\r\n    friend const mpreal cbrt(const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal root(const mpreal& v, unsigned long int k, mp_rnd_t rnd_mode);\r\n    friend const mpreal pow (const mpreal& a, const mpreal& b, mp_rnd_t rnd_mode);\r\n    friend const mpreal pow (const mpreal& a, const mpz_t b, mp_rnd_t rnd_mode);\r\n    friend const mpreal pow (const mpreal& a, const unsigned long int b, mp_rnd_t rnd_mode);\r\n    friend const mpreal pow (const mpreal& a, const long int b, mp_rnd_t rnd_mode);\r\n    friend const mpreal pow (const unsigned long int a, const mpreal& b, mp_rnd_t rnd_mode);\r\n    friend const mpreal pow (const unsigned long int a, const unsigned long int b, mp_rnd_t rnd_mode);\r\n    friend const mpreal fabs(const mpreal& v, mp_rnd_t rnd_mode);\r\n\r\n    friend const mpreal abs(const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal dim(const mpreal& a, const mpreal& b, mp_rnd_t rnd_mode);\r\n    friend inline const mpreal mul_2ui(const mpreal& v, unsigned long int k, mp_rnd_t rnd_mode);\r\n    friend inline const mpreal mul_2si(const mpreal& v, long int k, mp_rnd_t rnd_mode);\r\n    friend inline const mpreal div_2ui(const mpreal& v, unsigned long int k, mp_rnd_t rnd_mode);\r\n    friend inline const mpreal div_2si(const mpreal& v, long int k, mp_rnd_t rnd_mode);\r\n    friend int cmpabs(const mpreal& a,const mpreal& b);\r\n    \r\n    friend const mpreal log  (const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal log2 (const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal log10(const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal exp  (const mpreal& v, mp_rnd_t rnd_mode); \r\n    friend const mpreal exp2 (const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal exp10(const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal log1p(const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal expm1(const mpreal& v, mp_rnd_t rnd_mode);\r\n\r\n    friend const mpreal cos(const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal sin(const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal tan(const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal sec(const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal csc(const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal cot(const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend int sin_cos(mpreal& s, mpreal& c, const mpreal& v, mp_rnd_t rnd_mode);\r\n\r\n    friend const mpreal acos  (const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal asin  (const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal atan  (const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal atan2 (const mpreal& y, const mpreal& x, mp_rnd_t rnd_mode);\r\n    friend const mpreal acot  (const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal asec  (const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal acsc  (const mpreal& v, mp_rnd_t rnd_mode);\r\n\r\n    friend const mpreal cosh  (const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal sinh  (const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal tanh  (const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal sech  (const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal csch  (const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal coth  (const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal acosh (const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal asinh (const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal atanh (const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal acoth (const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal asech (const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal acsch (const mpreal& v, mp_rnd_t rnd_mode);\r\n\r\n    friend const mpreal hypot (const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode);\r\n\r\n    friend const mpreal fac_ui (unsigned long int v,  mp_prec_t prec, mp_rnd_t rnd_mode);\r\n    friend const mpreal eint   (const mpreal& v, mp_rnd_t rnd_mode);\r\n\r\n    friend const mpreal gamma    (const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal lngamma  (const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal lgamma   (const mpreal& v, int *signp, mp_rnd_t rnd_mode);\r\n    friend const mpreal zeta     (const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal erf      (const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal erfc     (const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal besselj0 (const mpreal& v, mp_rnd_t rnd_mode); \r\n    friend const mpreal besselj1 (const mpreal& v, mp_rnd_t rnd_mode); \r\n    friend const mpreal besseljn (long n, const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal bessely0 (const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal bessely1 (const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal besselyn (long n, const mpreal& v, mp_rnd_t rnd_mode); \r\n    friend const mpreal fma      (const mpreal& v1, const mpreal& v2, const mpreal& v3, mp_rnd_t rnd_mode);\r\n    friend const mpreal fms      (const mpreal& v1, const mpreal& v2, const mpreal& v3, mp_rnd_t rnd_mode);\r\n    friend const mpreal agm      (const mpreal& v1, const mpreal& v2, mp_rnd_t rnd_mode);\r\n    friend const mpreal sum      (const mpreal tab[], unsigned long int n, mp_rnd_t rnd_mode);\r\n    friend int sgn(const mpreal& v); // returns -1 or +1\r\n\r\n// MPFR 2.4.0 Specifics\r\n#if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0))\r\n    friend int          sinh_cosh   (mpreal& s, mpreal& c, const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal li2         (const mpreal& v,                       mp_rnd_t rnd_mode);\r\n    friend const mpreal fmod        (const mpreal& x, const mpreal& y,      mp_rnd_t rnd_mode);\r\n    friend const mpreal rec_sqrt    (const mpreal& v,                       mp_rnd_t rnd_mode);\r\n\r\n    // MATLAB's semantic equivalents\r\n    friend const mpreal rem (const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode); // Remainder after division\r\n    friend const mpreal mod (const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode); // Modulus after division\r\n#endif\r\n\r\n// MPFR 3.0.0 Specifics\r\n#if (MPFR_VERSION >= MPFR_VERSION_NUM(3,0,0))\r\n    friend const mpreal digamma (const mpreal& v,        mp_rnd_t rnd_mode);\r\n    friend const mpreal ai      (const mpreal& v,        mp_rnd_t rnd_mode);\r\n    friend const mpreal urandom (gmp_randstate_t& state, mp_rnd_t rnd_mode);     // use gmp_randinit_default() to init state, gmp_randclear() to clear\r\n    friend const mpreal grandom (gmp_randstate_t& state, mp_rnd_t rnd_mode);     // use gmp_randinit_default() to init state, gmp_randclear() to clear\r\n    friend const mpreal grandom (unsigned int seed);\r\n#endif\r\n    \r\n    // Uniformly distributed random number generation in [0,1] using\r\n    // Mersenne-Twister algorithm by default.\r\n    // Use parameter to setup seed, e.g.: random((unsigned)time(NULL))\r\n    // Check urandom() for more precise control.\r\n    friend const mpreal random(unsigned int seed);\r\n\r\n    // Exponent and mantissa manipulation\r\n    friend const mpreal frexp(const mpreal& v, mp_exp_t* exp);    \r\n    friend const mpreal ldexp(const mpreal& v, mp_exp_t exp);\r\n\r\n    // Splits mpreal value into fractional and integer parts.\r\n    // Returns fractional part and stores integer part in n.\r\n    friend const mpreal modf(const mpreal& v, mpreal& n);    \r\n\r\n    // Constants\r\n    // don't forget to call mpfr_free_cache() for every thread where you are using const-functions\r\n    friend const mpreal const_log2      (mp_prec_t prec, mp_rnd_t rnd_mode);\r\n    friend const mpreal const_pi        (mp_prec_t prec, mp_rnd_t rnd_mode);\r\n    friend const mpreal const_euler     (mp_prec_t prec, mp_rnd_t rnd_mode);\r\n    friend const mpreal const_catalan   (mp_prec_t prec, mp_rnd_t rnd_mode);\r\n\r\n    // returns +inf iff sign>=0 otherwise -inf\r\n    friend const mpreal const_infinity(int sign, mp_prec_t prec);\r\n\r\n    // Output/ Input\r\n    friend std::ostream& operator<<(std::ostream& os, const mpreal& v);\r\n    friend std::istream& operator>>(std::istream& is, mpreal& v);\r\n\r\n    // Integer Related Functions\r\n    friend const mpreal rint (const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal ceil (const mpreal& v);\r\n    friend const mpreal floor(const mpreal& v);\r\n    friend const mpreal round(const mpreal& v);\r\n    friend const mpreal trunc(const mpreal& v);\r\n    friend const mpreal rint_ceil   (const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal rint_floor  (const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal rint_round  (const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal rint_trunc  (const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal frac        (const mpreal& v, mp_rnd_t rnd_mode);\r\n    friend const mpreal remainder   (         const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode);\r\n    friend const mpreal remquo      (long* q, const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode);\r\n    \r\n    // Miscellaneous Functions\r\n    friend const mpreal nexttoward (const mpreal& x, const mpreal& y);\r\n    friend const mpreal nextabove  (const mpreal& x);\r\n    friend const mpreal nextbelow  (const mpreal& x);\r\n\r\n    // use gmp_randinit_default() to init state, gmp_randclear() to clear\r\n    friend const mpreal urandomb (gmp_randstate_t& state); \r\n\r\n// MPFR < 2.4.2 Specifics\r\n#if (MPFR_VERSION <= MPFR_VERSION_NUM(2,4,2))\r\n    friend const mpreal random2 (mp_size_t size, mp_exp_t exp);\r\n#endif\r\n\r\n    // Instance Checkers\r\n    friend bool isnan    (const mpreal& v);\r\n    friend bool isinf    (const mpreal& v);\r\n    friend bool isfinite (const mpreal& v);\r\n\r\n    friend bool isnum    (const mpreal& v);\r\n    friend bool iszero   (const mpreal& v);\r\n    friend bool isint    (const mpreal& v);\r\n\r\n#if (MPFR_VERSION >= MPFR_VERSION_NUM(3,0,0))\r\n    friend bool isregular(const mpreal& v);\r\n#endif\r\n\r\n    // Set/Get instance properties\r\n    inline mp_prec_t    get_prec() const;\r\n    inline void         set_prec(mp_prec_t prec, mp_rnd_t rnd_mode = get_default_rnd());    // Change precision with rounding mode\r\n\r\n    // Aliases for get_prec(), set_prec() - needed for compatibility with std::complex<mpreal> interface\r\n    inline mpreal&      setPrecision(int Precision, mp_rnd_t RoundingMode = get_default_rnd());\r\n    inline int          getPrecision() const;\r\n    \r\n    // Set mpreal to +/- inf, NaN, +/-0\r\n    mpreal&        setInf  (int Sign = +1);    \r\n    mpreal&        setNan  ();\r\n    mpreal&        setZero (int Sign = +1);\r\n    mpreal&        setSign (int Sign, mp_rnd_t RoundingMode = get_default_rnd());\r\n\r\n    //Exponent\r\n    mp_exp_t get_exp();\r\n    int set_exp(mp_exp_t e);\r\n    int check_range  (int t, mp_rnd_t rnd_mode = get_default_rnd());\r\n    int subnormalize (int t,mp_rnd_t rnd_mode = get_default_rnd());\r\n\r\n    // Inexact conversion from float\r\n    inline bool fits_in_bits(double x, int n);\r\n\r\n    // Set/Get global properties\r\n    static void            set_default_prec(mp_prec_t prec);\r\n    static void            set_default_rnd(mp_rnd_t rnd_mode);\r\n\r\n    static mp_exp_t  get_emin (void);\r\n    static mp_exp_t  get_emax (void);\r\n    static mp_exp_t  get_emin_min (void);\r\n    static mp_exp_t  get_emin_max (void);\r\n    static mp_exp_t  get_emax_min (void);\r\n    static mp_exp_t  get_emax_max (void);\r\n    static int       set_emin (mp_exp_t exp);\r\n    static int       set_emax (mp_exp_t exp);\r\n\r\n    // Efficient swapping of two mpreal values - needed for std algorithms\r\n    friend void swap(mpreal& x, mpreal& y);\r\n    \r\n    friend const mpreal fmax(const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode);\r\n    friend const mpreal fmin(const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode);\r\n\r\nprivate:\r\n    // Human friendly Debug Preview in Visual Studio.\r\n    // Put one of these lines:\r\n    //\r\n    // mpfr::mpreal=<DebugView>                              ; Show value only\r\n    // mpfr::mpreal=<DebugView>, <mp[0]._mpfr_prec,u>bits    ; Show value & precision\r\n    // \r\n    // at the beginning of\r\n    // [Visual Studio Installation Folder]\\Common7\\Packages\\Debugger\\autoexp.dat\r\n    MPREAL_MSVC_DEBUGVIEW_DATA\r\n\r\n    // \"Smart\" resources deallocation. Checks if instance initialized before deletion.\r\n    void clear(::mpfr_ptr);\r\n};\r\n\r\n//////////////////////////////////////////////////////////////////////////\r\n// Exceptions\r\nclass conversion_overflow : public std::exception {\r\npublic:\r\n    std::string why() { return \"inexact conversion from floating point\"; }\r\n};\r\n\r\n//////////////////////////////////////////////////////////////////////////\r\n// Constructors & converters\r\n// Default constructor: creates mp number and initializes it to 0.\r\ninline mpreal::mpreal() \r\n{ \r\n    mpfr_init2 (mpfr_ptr(), mpreal::get_default_prec()); \r\n    mpfr_set_ui(mpfr_ptr(), 0, mpreal::get_default_rnd());\r\n\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n}\r\n\r\ninline mpreal::mpreal(const mpreal& u) \r\n{\r\n    mpfr_init2(mpfr_ptr(),mpfr_get_prec(u.mpfr_srcptr()));\r\n    mpfr_set  (mpfr_ptr(),u.mpfr_srcptr(),mpreal::get_default_rnd());\r\n\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n}\r\n\r\n#ifdef MPREAL_HAVE_MOVE_SUPPORT\r\ninline mpreal::mpreal(mpreal&& other)\r\n{\r\n    mpfr_set_uninitialized(mpfr_ptr());     // make sure \"other\" holds no pinter to actual data \r\n    mpfr_swap(mpfr_ptr(), other.mpfr_ptr());\r\n\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n}\r\n\r\ninline mpreal& mpreal::operator=(mpreal&& other)\r\n{\r\n    mpfr_swap(mpfr_ptr(), other.mpfr_ptr());\r\n\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n#endif\r\n\r\ninline mpreal::mpreal(const mpfr_t  u, bool shared)\r\n{\r\n    if(shared)\r\n    {\r\n        std::memcpy(mpfr_ptr(), u, sizeof(mpfr_t));\r\n    }\r\n    else\r\n    {\r\n        mpfr_init2(mpfr_ptr(), mpfr_get_prec(u));\r\n        mpfr_set  (mpfr_ptr(), u, mpreal::get_default_rnd());\r\n    }\r\n\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n}\r\n\r\ninline mpreal::mpreal(const mpf_t u)\r\n{\r\n    mpfr_init2(mpfr_ptr(),(mp_prec_t) mpf_get_prec(u)); // (gmp: mp_bitcnt_t) unsigned long -> long (mpfr: mp_prec_t)\r\n    mpfr_set_f(mpfr_ptr(),u,mpreal::get_default_rnd());\r\n\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n}\r\n\r\ninline mpreal::mpreal(const mpz_t u, mp_prec_t prec, mp_rnd_t mode)\r\n{\r\n    mpfr_init2(mpfr_ptr(), prec);\r\n    mpfr_set_z(mpfr_ptr(), u, mode);\r\n\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n}\r\n\r\ninline mpreal::mpreal(const mpq_t u, mp_prec_t prec, mp_rnd_t mode)\r\n{\r\n    mpfr_init2(mpfr_ptr(), prec);\r\n    mpfr_set_q(mpfr_ptr(), u, mode);\r\n\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n}\r\n\r\ninline mpreal::mpreal(const double u, mp_prec_t prec, mp_rnd_t mode)\r\n{\r\n     mpfr_init2(mpfr_ptr(), prec);\r\n\r\n#if (MPREAL_DOUBLE_BITS_OVERFLOW > -1)\r\n  if(fits_in_bits(u, MPREAL_DOUBLE_BITS_OVERFLOW))\r\n  {\r\n    mpfr_set_d(mpfr_ptr(), u, mode);\r\n  }else\r\n    throw conversion_overflow();\r\n#else\r\n  mpfr_set_d(mpfr_ptr(), u, mode);\r\n#endif\r\n\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n}\r\n\r\ninline mpreal::mpreal(const long double u, mp_prec_t prec, mp_rnd_t mode)\r\n{ \r\n    mpfr_init2 (mpfr_ptr(), prec);\r\n    mpfr_set_ld(mpfr_ptr(), u, mode);\r\n\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n}\r\n\r\ninline mpreal::mpreal(const unsigned long int u, mp_prec_t prec, mp_rnd_t mode)\r\n{ \r\n    mpfr_init2 (mpfr_ptr(), prec);\r\n    mpfr_set_ui(mpfr_ptr(), u, mode);\r\n\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n}\r\n\r\ninline mpreal::mpreal(const unsigned int u, mp_prec_t prec, mp_rnd_t mode)\r\n{ \r\n    mpfr_init2 (mpfr_ptr(), prec);\r\n    mpfr_set_ui(mpfr_ptr(), u, mode);\r\n\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n}\r\n\r\ninline mpreal::mpreal(const long int u, mp_prec_t prec, mp_rnd_t mode)\r\n{ \r\n    mpfr_init2 (mpfr_ptr(), prec);\r\n    mpfr_set_si(mpfr_ptr(), u, mode);\r\n\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n}\r\n\r\ninline mpreal::mpreal(const int u, mp_prec_t prec, mp_rnd_t mode)\r\n{ \r\n    mpfr_init2 (mpfr_ptr(), prec);\r\n    mpfr_set_si(mpfr_ptr(), u, mode);\r\n\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n}\r\n\r\n#if defined (MPREAL_HAVE_INT64_SUPPORT)\r\ninline mpreal::mpreal(const uint64_t u, mp_prec_t prec, mp_rnd_t mode)\r\n{\r\n    mpfr_init2 (mpfr_ptr(), prec);\r\n    mpfr_set_uj(mpfr_ptr(), u, mode); \r\n\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n}\r\n\r\ninline mpreal::mpreal(const int64_t u, mp_prec_t prec, mp_rnd_t mode)\r\n{\r\n    mpfr_init2 (mpfr_ptr(), prec);\r\n    mpfr_set_sj(mpfr_ptr(), u, mode); \r\n\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n}\r\n#endif\r\n\r\ninline mpreal::mpreal(const char* s, mp_prec_t prec, int base, mp_rnd_t mode)\r\n{\r\n    mpfr_init2  (mpfr_ptr(), prec);\r\n    mpfr_set_str(mpfr_ptr(), s, base, mode); \r\n\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n}\r\n\r\ninline mpreal::mpreal(const std::string& s, mp_prec_t prec, int base, mp_rnd_t mode)\r\n{\r\n    mpfr_init2  (mpfr_ptr(), prec);\r\n    mpfr_set_str(mpfr_ptr(), s.c_str(), base, mode); \r\n\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n}\r\n\r\ninline void mpreal::clear(::mpfr_ptr x)\r\n{\r\n#ifdef MPREAL_HAVE_MOVE_SUPPORT\r\n    if(mpfr_is_initialized(x)) \r\n#endif\r\n    mpfr_clear(x);\r\n}\r\n\r\ninline mpreal::~mpreal() \r\n{ \r\n    clear(mpfr_ptr());\r\n}                           \r\n\r\n// internal namespace needed for template magic\r\nnamespace internal{\r\n\r\n    // Use SFINAE to restrict arithmetic operations instantiation only for numeric types\r\n    // This is needed for smooth integration with libraries based on expression templates, like Eigen.\r\n    // TODO: Do the same for boolean operators.\r\n    template <typename ArgumentType> struct result_type {};    \r\n    \r\n    template <> struct result_type<mpreal>              {typedef mpreal type;};    \r\n    template <> struct result_type<mpz_t>               {typedef mpreal type;};    \r\n    template <> struct result_type<mpq_t>               {typedef mpreal type;};    \r\n    template <> struct result_type<long double>         {typedef mpreal type;};    \r\n    template <> struct result_type<double>              {typedef mpreal type;};    \r\n    template <> struct result_type<unsigned long int>   {typedef mpreal type;};    \r\n    template <> struct result_type<unsigned int>        {typedef mpreal type;};    \r\n    template <> struct result_type<long int>            {typedef mpreal type;};    \r\n    template <> struct result_type<int>                 {typedef mpreal type;};    \r\n\r\n#if defined (MPREAL_HAVE_INT64_SUPPORT)\r\n    template <> struct result_type<int64_t  >           {typedef mpreal type;};    \r\n    template <> struct result_type<uint64_t >           {typedef mpreal type;};    \r\n#endif\r\n}\r\n\r\n// + Addition\r\ntemplate <typename Rhs> \r\ninline const typename internal::result_type<Rhs>::type \r\n    operator+(const mpreal& lhs, const Rhs& rhs){ return mpreal(lhs) += rhs;    }\r\n\r\ntemplate <typename Lhs> \r\ninline const typename internal::result_type<Lhs>::type \r\n    operator+(const Lhs& lhs, const mpreal& rhs){ return mpreal(rhs) += lhs;    } \r\n\r\n// - Subtraction\r\ntemplate <typename Rhs> \r\ninline const typename internal::result_type<Rhs>::type \r\n    operator-(const mpreal& lhs, const Rhs& rhs){ return mpreal(lhs) -= rhs;    }\r\n\r\ntemplate <typename Lhs> \r\ninline const typename internal::result_type<Lhs>::type \r\n    operator-(const Lhs& lhs, const mpreal& rhs){ return mpreal(lhs) -= rhs;    }\r\n\r\n// * Multiplication\r\ntemplate <typename Rhs> \r\ninline const typename internal::result_type<Rhs>::type \r\n    operator*(const mpreal& lhs, const Rhs& rhs){ return mpreal(lhs) *= rhs;    }\r\n\r\ntemplate <typename Lhs> \r\ninline const typename internal::result_type<Lhs>::type \r\n    operator*(const Lhs& lhs, const mpreal& rhs){ return mpreal(rhs) *= lhs;    } \r\n\r\n// / Division\r\ntemplate <typename Rhs> \r\ninline const typename internal::result_type<Rhs>::type \r\n    operator/(const mpreal& lhs, const Rhs& rhs){ return mpreal(lhs) /= rhs;    }\r\n\r\ntemplate <typename Lhs> \r\ninline const typename internal::result_type<Lhs>::type \r\n    operator/(const Lhs& lhs, const mpreal& rhs){ return mpreal(lhs) /= rhs;    }\r\n\r\n//////////////////////////////////////////////////////////////////////////\r\n// sqrt\r\nconst mpreal sqrt(const unsigned int v, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\nconst mpreal sqrt(const long int v, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\nconst mpreal sqrt(const int v, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\nconst mpreal sqrt(const long double v, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\nconst mpreal sqrt(const double v, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\n\r\n// abs\r\ninline const mpreal abs(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd());\r\n\r\n//////////////////////////////////////////////////////////////////////////\r\n// pow\r\nconst mpreal pow(const mpreal& a, const unsigned int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\nconst mpreal pow(const mpreal& a, const int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\nconst mpreal pow(const mpreal& a, const long double b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\nconst mpreal pow(const mpreal& a, const double b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\n\r\nconst mpreal pow(const unsigned int a, const mpreal& b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\nconst mpreal pow(const long int a, const mpreal& b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\nconst mpreal pow(const int a, const mpreal& b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\nconst mpreal pow(const long double a, const mpreal& b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\nconst mpreal pow(const double a, const mpreal& b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\n\r\nconst mpreal pow(const unsigned long int a, const unsigned int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\nconst mpreal pow(const unsigned long int a, const long int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\nconst mpreal pow(const unsigned long int a, const int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\nconst mpreal pow(const unsigned long int a, const long double b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\nconst mpreal pow(const unsigned long int a, const double b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\n\r\nconst mpreal pow(const unsigned int a, const unsigned long int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\nconst mpreal pow(const unsigned int a, const unsigned int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\nconst mpreal pow(const unsigned int a, const long int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\nconst mpreal pow(const unsigned int a, const int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\nconst mpreal pow(const unsigned int a, const long double b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\nconst mpreal pow(const unsigned int a, const double b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\n\r\nconst mpreal pow(const long int a, const unsigned long int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\nconst mpreal pow(const long int a, const unsigned int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\nconst mpreal pow(const long int a, const long int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\nconst mpreal pow(const long int a, const int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\nconst mpreal pow(const long int a, const long double b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\nconst mpreal pow(const long int a, const double b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\n\r\nconst mpreal pow(const int a, const unsigned long int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\nconst mpreal pow(const int a, const unsigned int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\nconst mpreal pow(const int a, const long int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\nconst mpreal pow(const int a, const int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); \r\nconst mpreal pow(const int a, const long double b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\nconst mpreal pow(const int a, const double b, mp_rnd_t rnd_mode = mpreal::get_default_rnd()); \r\n\r\nconst mpreal pow(const long double a, const long double b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());    \r\nconst mpreal pow(const long double a, const unsigned long int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\nconst mpreal pow(const long double a, const unsigned int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\nconst mpreal pow(const long double a, const long int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\nconst mpreal pow(const long double a, const int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\n\r\nconst mpreal pow(const double a, const double b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());    \r\nconst mpreal pow(const double a, const unsigned long int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\nconst mpreal pow(const double a, const unsigned int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\nconst mpreal pow(const double a, const long int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\nconst mpreal pow(const double a, const int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\n\r\ninline const mpreal mul_2ui(const mpreal& v, unsigned long int k, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\ninline const mpreal mul_2si(const mpreal& v, long int k, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\ninline const mpreal div_2ui(const mpreal& v, unsigned long int k, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\ninline const mpreal div_2si(const mpreal& v, long int k, mp_rnd_t rnd_mode = mpreal::get_default_rnd());\r\n\r\n//////////////////////////////////////////////////////////////////////////\r\n// Estimate machine epsilon for the given precision\r\n// Returns smallest eps such that 1.0 + eps != 1.0\r\ninline mpreal machine_epsilon(mp_prec_t prec = mpreal::get_default_prec());\r\n\r\n// Returns smallest eps such that x + eps != x (relative machine epsilon)\r\ninline mpreal machine_epsilon(const mpreal& x);        \r\n\r\n// Gives max & min values for the required precision, \r\n// minval is 'safe' meaning 1 / minval does not overflow\r\n// maxval is 'safe' meaning 1 / maxval does not underflow\r\ninline mpreal minval(mp_prec_t prec = mpreal::get_default_prec());\r\ninline mpreal maxval(mp_prec_t prec = mpreal::get_default_prec());\r\n\r\n// 'Dirty' equality check 1: |a-b| < min{|a|,|b|} * eps\r\ninline bool isEqualFuzzy(const mpreal& a, const mpreal& b, const mpreal& eps);\r\n\r\n// 'Dirty' equality check 2: |a-b| < min{|a|,|b|} * eps( min{|a|,|b|} )\r\ninline bool isEqualFuzzy(const mpreal& a, const mpreal& b);\r\n\r\n// 'Bitwise' equality check\r\n//  maxUlps - a and b can be apart by maxUlps binary numbers. \r\ninline bool isEqualUlps(const mpreal& a, const mpreal& b, int maxUlps);\r\n\r\n//////////////////////////////////////////////////////////////////////////\r\n//     Convert precision in 'bits' to decimal digits and vice versa.\r\n//        bits   = ceil(digits*log[2](10))\r\n//        digits = floor(bits*log[10](2))\r\n\r\ninline mp_prec_t digits2bits(int d);\r\ninline int       bits2digits(mp_prec_t b);\r\n\r\n//////////////////////////////////////////////////////////////////////////\r\n// min, max\r\nconst mpreal (max)(const mpreal& x, const mpreal& y);\r\nconst mpreal (min)(const mpreal& x, const mpreal& y);\r\n\r\n//////////////////////////////////////////////////////////////////////////\r\n// Implementation\r\n//////////////////////////////////////////////////////////////////////////\r\n\r\n//////////////////////////////////////////////////////////////////////////\r\n// Operators - Assignment\r\ninline mpreal& mpreal::operator=(const mpreal& v)\r\n{\r\n    if (this != &v)\r\n    {\r\n    mp_prec_t tp = mpfr_get_prec(  mpfr_srcptr());\r\n    mp_prec_t vp = mpfr_get_prec(v.mpfr_srcptr());\r\n\r\n    if(tp != vp){\r\n      clear(mpfr_ptr());\r\n      mpfr_init2(mpfr_ptr(), vp);\r\n    }\r\n\r\n        mpfr_set(mpfr_ptr(), v.mpfr_srcptr(), mpreal::get_default_rnd());\r\n\r\n        MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    }\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator=(const mpf_t v)\r\n{\r\n    mpfr_set_f(mpfr_ptr(), v, mpreal::get_default_rnd());\r\n    \r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator=(const mpz_t v)\r\n{\r\n    mpfr_set_z(mpfr_ptr(), v, mpreal::get_default_rnd());\r\n    \r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator=(const mpq_t v)\r\n{\r\n    mpfr_set_q(mpfr_ptr(), v, mpreal::get_default_rnd());\r\n\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator=(const long double v)        \r\n{    \r\n    mpfr_set_ld(mpfr_ptr(), v, mpreal::get_default_rnd());\r\n\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator=(const double v)                \r\n{   \r\n#if (MPREAL_DOUBLE_BITS_OVERFLOW > -1)\r\n  if(fits_in_bits(v, MPREAL_DOUBLE_BITS_OVERFLOW))\r\n  {\r\n    mpfr_set_d(mpfr_ptr(),v,mpreal::get_default_rnd());\r\n  }else\r\n    throw conversion_overflow();\r\n#else\r\n  mpfr_set_d(mpfr_ptr(),v,mpreal::get_default_rnd());\r\n#endif\r\n\r\n  MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator=(const unsigned long int v)    \r\n{    \r\n    mpfr_set_ui(mpfr_ptr(), v, mpreal::get_default_rnd());    \r\n\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator=(const unsigned int v)        \r\n{    \r\n    mpfr_set_ui(mpfr_ptr(), v, mpreal::get_default_rnd());    \r\n\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator=(const long int v)            \r\n{    \r\n    mpfr_set_si(mpfr_ptr(), v, mpreal::get_default_rnd());    \r\n\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator=(const int v)\r\n{    \r\n    mpfr_set_si(mpfr_ptr(), v, mpreal::get_default_rnd());    \r\n\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator=(const char* s)\r\n{\r\n    // Use other converters for more precise control on base & precision & rounding:\r\n    //\r\n    //        mpreal(const char* s,        mp_prec_t prec, int base, mp_rnd_t mode)\r\n    //        mpreal(const std::string& s,mp_prec_t prec, int base, mp_rnd_t mode)\r\n    //\r\n    // Here we assume base = 10 and we use precision of target variable.\r\n\r\n    mpfr_t t;\r\n\r\n    mpfr_init2(t, mpfr_get_prec(mpfr_srcptr()));\r\n\r\n    if(0 == mpfr_set_str(t, s, 10, mpreal::get_default_rnd()))\r\n    {\r\n        mpfr_set(mpfr_ptr(), t, mpreal::get_default_rnd()); \r\n        MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    }\r\n\r\n    clear(t);\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator=(const std::string& s)\r\n{\r\n    // Use other converters for more precise control on base & precision & rounding:\r\n    //\r\n    //        mpreal(const char* s,        mp_prec_t prec, int base, mp_rnd_t mode)\r\n    //        mpreal(const std::string& s,mp_prec_t prec, int base, mp_rnd_t mode)\r\n    //\r\n    // Here we assume base = 10 and we use precision of target variable.\r\n\r\n    mpfr_t t;\r\n\r\n    mpfr_init2(t, mpfr_get_prec(mpfr_srcptr()));\r\n\r\n    if(0 == mpfr_set_str(t, s.c_str(), 10, mpreal::get_default_rnd()))\r\n    {\r\n        mpfr_set(mpfr_ptr(), t, mpreal::get_default_rnd()); \r\n        MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    }\r\n\r\n    clear(t);\r\n    return *this;\r\n}\r\n\r\n\r\n//////////////////////////////////////////////////////////////////////////\r\n// + Addition\r\ninline mpreal& mpreal::operator+=(const mpreal& v)\r\n{\r\n    mpfr_add(mpfr_ptr(), mpfr_srcptr(), v.mpfr_srcptr(), mpreal::get_default_rnd());\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator+=(const mpf_t u)\r\n{\r\n    *this += mpreal(u);\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator+=(const mpz_t u)\r\n{\r\n    mpfr_add_z(mpfr_ptr(),mpfr_srcptr(),u,mpreal::get_default_rnd());\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator+=(const mpq_t u)\r\n{\r\n    mpfr_add_q(mpfr_ptr(),mpfr_srcptr(),u,mpreal::get_default_rnd());\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator+= (const long double u)\r\n{\r\n    *this += mpreal(u);    \r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;    \r\n}\r\n\r\ninline mpreal& mpreal::operator+= (const double u)\r\n{\r\n#if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0))\r\n    mpfr_add_d(mpfr_ptr(),mpfr_srcptr(),u,mpreal::get_default_rnd());\r\n#else\r\n    *this += mpreal(u);\r\n#endif\r\n\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator+=(const unsigned long int u)\r\n{\r\n    mpfr_add_ui(mpfr_ptr(),mpfr_srcptr(),u,mpreal::get_default_rnd());\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator+=(const unsigned int u)\r\n{\r\n    mpfr_add_ui(mpfr_ptr(),mpfr_srcptr(),u,mpreal::get_default_rnd());\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator+=(const long int u)\r\n{\r\n    mpfr_add_si(mpfr_ptr(),mpfr_srcptr(),u,mpreal::get_default_rnd());\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator+=(const int u)\r\n{\r\n    mpfr_add_si(mpfr_ptr(),mpfr_srcptr(),u,mpreal::get_default_rnd());\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\n#if defined (MPREAL_HAVE_INT64_SUPPORT)\r\ninline mpreal& mpreal::operator+=(const int64_t  u){    *this += mpreal(u); MPREAL_MSVC_DEBUGVIEW_CODE; return *this;    }\r\ninline mpreal& mpreal::operator+=(const uint64_t u){    *this += mpreal(u); MPREAL_MSVC_DEBUGVIEW_CODE; return *this;    }\r\ninline mpreal& mpreal::operator-=(const int64_t  u){    *this -= mpreal(u); MPREAL_MSVC_DEBUGVIEW_CODE; return *this;    }\r\ninline mpreal& mpreal::operator-=(const uint64_t u){    *this -= mpreal(u); MPREAL_MSVC_DEBUGVIEW_CODE; return *this;    }\r\ninline mpreal& mpreal::operator*=(const int64_t  u){    *this *= mpreal(u); MPREAL_MSVC_DEBUGVIEW_CODE; return *this;    }\r\ninline mpreal& mpreal::operator*=(const uint64_t u){    *this *= mpreal(u); MPREAL_MSVC_DEBUGVIEW_CODE; return *this;    }\r\ninline mpreal& mpreal::operator/=(const int64_t  u){    *this /= mpreal(u); MPREAL_MSVC_DEBUGVIEW_CODE; return *this;    }\r\ninline mpreal& mpreal::operator/=(const uint64_t u){    *this /= mpreal(u); MPREAL_MSVC_DEBUGVIEW_CODE; return *this;    }\r\n#endif \r\n\r\ninline const mpreal mpreal::operator+()const    {    return mpreal(*this); }\r\n\r\ninline const mpreal operator+(const mpreal& a, const mpreal& b)\r\n{\r\n  mpreal c(0, (std::max)(mpfr_get_prec(a.mpfr_ptr()), mpfr_get_prec(b.mpfr_ptr())));\r\n  mpfr_add(c.mpfr_ptr(), a.mpfr_srcptr(), b.mpfr_srcptr(), mpreal::get_default_rnd());\r\n  return c;\r\n}\r\n\r\ninline mpreal& mpreal::operator++() \r\n{\r\n    return *this += 1;\r\n}\r\n\r\ninline const mpreal mpreal::operator++ (int)\r\n{\r\n    mpreal x(*this);\r\n    *this += 1;\r\n    return x;\r\n}\r\n\r\ninline mpreal& mpreal::operator--() \r\n{\r\n    return *this -= 1;\r\n}\r\n\r\ninline const mpreal mpreal::operator-- (int)\r\n{\r\n    mpreal x(*this);\r\n    *this -= 1;\r\n    return x;\r\n}\r\n\r\n//////////////////////////////////////////////////////////////////////////\r\n// - Subtraction\r\ninline mpreal& mpreal::operator-=(const mpreal& v)\r\n{\r\n    mpfr_sub(mpfr_ptr(),mpfr_srcptr(),v.mpfr_srcptr(),mpreal::get_default_rnd());\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator-=(const mpz_t v)\r\n{\r\n    mpfr_sub_z(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator-=(const mpq_t v)\r\n{\r\n    mpfr_sub_q(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator-=(const long double v)\r\n{\r\n    *this -= mpreal(v);    \r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;    \r\n}\r\n\r\ninline mpreal& mpreal::operator-=(const double v)\r\n{\r\n#if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0))\r\n    mpfr_sub_d(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());\r\n#else\r\n    *this -= mpreal(v);    \r\n#endif\r\n\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator-=(const unsigned long int v)\r\n{\r\n    mpfr_sub_ui(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator-=(const unsigned int v)\r\n{\r\n    mpfr_sub_ui(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator-=(const long int v)\r\n{\r\n    mpfr_sub_si(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator-=(const int v)\r\n{\r\n    mpfr_sub_si(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline const mpreal mpreal::operator-()const\r\n{\r\n    mpreal u(*this);\r\n    mpfr_neg(u.mpfr_ptr(),u.mpfr_srcptr(),mpreal::get_default_rnd());\r\n    return u;\r\n}\r\n\r\ninline const mpreal operator-(const mpreal& a, const mpreal& b)\r\n{\r\n  mpreal c(0, (std::max)(mpfr_get_prec(a.mpfr_ptr()), mpfr_get_prec(b.mpfr_ptr())));\r\n  mpfr_sub(c.mpfr_ptr(), a.mpfr_srcptr(), b.mpfr_srcptr(), mpreal::get_default_rnd());\r\n  return c;\r\n}\r\n\r\ninline const mpreal operator-(const double  b, const mpreal& a)\r\n{\r\n#if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0))\r\n    mpreal x(0, mpfr_get_prec(a.mpfr_ptr()));\r\n    mpfr_d_sub(x.mpfr_ptr(), b, a.mpfr_srcptr(), mpreal::get_default_rnd());\r\n    return x;\r\n#else\r\n    mpreal x(b, mpfr_get_prec(a.mpfr_ptr()));\r\n    x -= a;\r\n    return x;\r\n#endif\r\n}\r\n\r\ninline const mpreal operator-(const unsigned long int b, const mpreal& a)\r\n{\r\n    mpreal x(0, mpfr_get_prec(a.mpfr_ptr()));\r\n    mpfr_ui_sub(x.mpfr_ptr(), b, a.mpfr_srcptr(), mpreal::get_default_rnd());\r\n    return x;\r\n}\r\n\r\ninline const mpreal operator-(const unsigned int b, const mpreal& a)\r\n{\r\n    mpreal x(0, mpfr_get_prec(a.mpfr_ptr()));\r\n    mpfr_ui_sub(x.mpfr_ptr(), b, a.mpfr_srcptr(), mpreal::get_default_rnd());\r\n    return x;\r\n}\r\n\r\ninline const mpreal operator-(const long int b, const mpreal& a)\r\n{\r\n    mpreal x(0, mpfr_get_prec(a.mpfr_ptr()));\r\n    mpfr_si_sub(x.mpfr_ptr(), b, a.mpfr_srcptr(), mpreal::get_default_rnd());\r\n    return x;\r\n}\r\n\r\ninline const mpreal operator-(const int b, const mpreal& a)\r\n{\r\n    mpreal x(0, mpfr_get_prec(a.mpfr_ptr()));\r\n    mpfr_si_sub(x.mpfr_ptr(), b, a.mpfr_srcptr(), mpreal::get_default_rnd());\r\n    return x;\r\n}\r\n\r\n//////////////////////////////////////////////////////////////////////////\r\n// * Multiplication\r\ninline mpreal& mpreal::operator*= (const mpreal& v)\r\n{\r\n    mpfr_mul(mpfr_ptr(),mpfr_srcptr(),v.mpfr_srcptr(),mpreal::get_default_rnd());\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator*=(const mpz_t v)\r\n{\r\n    mpfr_mul_z(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator*=(const mpq_t v)\r\n{\r\n    mpfr_mul_q(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator*=(const long double v)\r\n{\r\n    *this *= mpreal(v);    \r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;    \r\n}\r\n\r\ninline mpreal& mpreal::operator*=(const double v)\r\n{\r\n#if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0))\r\n    mpfr_mul_d(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());\r\n#else\r\n    *this *= mpreal(v);    \r\n#endif\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator*=(const unsigned long int v)\r\n{\r\n    mpfr_mul_ui(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator*=(const unsigned int v)\r\n{\r\n    mpfr_mul_ui(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator*=(const long int v)\r\n{\r\n    mpfr_mul_si(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator*=(const int v)\r\n{\r\n    mpfr_mul_si(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline const mpreal operator*(const mpreal& a, const mpreal& b)\r\n{\r\n  mpreal c(0, (std::max)(mpfr_get_prec(a.mpfr_ptr()), mpfr_get_prec(b.mpfr_ptr())));\r\n  mpfr_mul(c.mpfr_ptr(), a.mpfr_srcptr(), b.mpfr_srcptr(), mpreal::get_default_rnd());\r\n  return c;\r\n}\r\n\r\n//////////////////////////////////////////////////////////////////////////\r\n// / Division\r\ninline mpreal& mpreal::operator/=(const mpreal& v)\r\n{\r\n    mpfr_div(mpfr_ptr(),mpfr_srcptr(),v.mpfr_srcptr(),mpreal::get_default_rnd());\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator/=(const mpz_t v)\r\n{\r\n    mpfr_div_z(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator/=(const mpq_t v)\r\n{\r\n    mpfr_div_q(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator/=(const long double v)\r\n{\r\n    *this /= mpreal(v);\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;    \r\n}\r\n\r\ninline mpreal& mpreal::operator/=(const double v)\r\n{\r\n#if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0))\r\n    mpfr_div_d(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());\r\n#else\r\n    *this /= mpreal(v);    \r\n#endif\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator/=(const unsigned long int v)\r\n{\r\n    mpfr_div_ui(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator/=(const unsigned int v)\r\n{\r\n    mpfr_div_ui(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator/=(const long int v)\r\n{\r\n    mpfr_div_si(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator/=(const int v)\r\n{\r\n    mpfr_div_si(mpfr_ptr(),mpfr_srcptr(),v,mpreal::get_default_rnd());\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline const mpreal operator/(const mpreal& a, const mpreal& b)\r\n{\r\n  mpreal c(0, (std::max)(mpfr_get_prec(a.mpfr_srcptr()), mpfr_get_prec(b.mpfr_srcptr())));\r\n  mpfr_div(c.mpfr_ptr(), a.mpfr_srcptr(), b.mpfr_srcptr(), mpreal::get_default_rnd());\r\n  return c;\r\n}\r\n\r\ninline const mpreal operator/(const unsigned long int b, const mpreal& a)\r\n{\r\n    mpreal x(0, mpfr_get_prec(a.mpfr_srcptr()));\r\n    mpfr_ui_div(x.mpfr_ptr(), b, a.mpfr_srcptr(), mpreal::get_default_rnd());\r\n    return x;\r\n}\r\n\r\ninline const mpreal operator/(const unsigned int b, const mpreal& a)\r\n{\r\n    mpreal x(0, mpfr_get_prec(a.mpfr_srcptr()));\r\n    mpfr_ui_div(x.mpfr_ptr(), b, a.mpfr_srcptr(), mpreal::get_default_rnd());\r\n    return x;\r\n}\r\n\r\ninline const mpreal operator/(const long int b, const mpreal& a)\r\n{\r\n    mpreal x(0, mpfr_get_prec(a.mpfr_srcptr()));\r\n    mpfr_si_div(x.mpfr_ptr(), b, a.mpfr_srcptr(), mpreal::get_default_rnd());\r\n    return x;\r\n}\r\n\r\ninline const mpreal operator/(const int b, const mpreal& a)\r\n{\r\n    mpreal x(0, mpfr_get_prec(a.mpfr_srcptr()));\r\n    mpfr_si_div(x.mpfr_ptr(), b, a.mpfr_srcptr(), mpreal::get_default_rnd());\r\n    return x;\r\n}\r\n\r\ninline const mpreal operator/(const double  b, const mpreal& a)\r\n{\r\n#if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0))\r\n    mpreal x(0, mpfr_get_prec(a.mpfr_srcptr()));\r\n    mpfr_d_div(x.mpfr_ptr(), b, a.mpfr_srcptr(), mpreal::get_default_rnd());\r\n    return x;\r\n#else\r\n    mpreal x(0, mpfr_get_prec(a.mpfr_ptr()));\r\n    x /= a;\r\n    return x;\r\n#endif\r\n}\r\n\r\n//////////////////////////////////////////////////////////////////////////\r\n// Shifts operators - Multiplication/Division by power of 2\r\ninline mpreal& mpreal::operator<<=(const unsigned long int u)\r\n{\r\n    mpfr_mul_2ui(mpfr_ptr(),mpfr_srcptr(),u,mpreal::get_default_rnd());\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator<<=(const unsigned int u)\r\n{\r\n    mpfr_mul_2ui(mpfr_ptr(),mpfr_srcptr(),static_cast<unsigned long int>(u),mpreal::get_default_rnd());\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator<<=(const long int u)\r\n{\r\n    mpfr_mul_2si(mpfr_ptr(),mpfr_srcptr(),u,mpreal::get_default_rnd());\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator<<=(const int u)\r\n{\r\n    mpfr_mul_2si(mpfr_ptr(),mpfr_srcptr(),static_cast<long int>(u),mpreal::get_default_rnd());\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator>>=(const unsigned long int u)\r\n{\r\n    mpfr_div_2ui(mpfr_ptr(),mpfr_srcptr(),u,mpreal::get_default_rnd());\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator>>=(const unsigned int u)\r\n{\r\n    mpfr_div_2ui(mpfr_ptr(),mpfr_srcptr(),static_cast<unsigned long int>(u),mpreal::get_default_rnd());\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator>>=(const long int u)\r\n{\r\n    mpfr_div_2si(mpfr_ptr(),mpfr_srcptr(),u,mpreal::get_default_rnd());\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::operator>>=(const int u)\r\n{\r\n    mpfr_div_2si(mpfr_ptr(),mpfr_srcptr(),static_cast<long int>(u),mpreal::get_default_rnd());\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline const mpreal operator<<(const mpreal& v, const unsigned long int k)\r\n{\r\n    return mul_2ui(v,k);\r\n}\r\n\r\ninline const mpreal operator<<(const mpreal& v, const unsigned int k)\r\n{\r\n    return mul_2ui(v,static_cast<unsigned long int>(k));\r\n}\r\n\r\ninline const mpreal operator<<(const mpreal& v, const long int k)\r\n{\r\n    return mul_2si(v,k);\r\n}\r\n\r\ninline const mpreal operator<<(const mpreal& v, const int k)\r\n{\r\n    return mul_2si(v,static_cast<long int>(k));\r\n}\r\n\r\ninline const mpreal operator>>(const mpreal& v, const unsigned long int k)\r\n{\r\n    return div_2ui(v,k);\r\n}\r\n\r\ninline const mpreal operator>>(const mpreal& v, const long int k)\r\n{\r\n    return div_2si(v,k);\r\n}\r\n\r\ninline const mpreal operator>>(const mpreal& v, const unsigned int k)\r\n{\r\n    return div_2ui(v,static_cast<unsigned long int>(k));\r\n}\r\n\r\ninline const mpreal operator>>(const mpreal& v, const int k)\r\n{\r\n    return div_2si(v,static_cast<long int>(k));\r\n}\r\n\r\n// mul_2ui\r\ninline const mpreal mul_2ui(const mpreal& v, unsigned long int k, mp_rnd_t rnd_mode)\r\n{\r\n    mpreal x(v);\r\n    mpfr_mul_2ui(x.mpfr_ptr(),v.mpfr_srcptr(),k,rnd_mode);\r\n    return x;\r\n}\r\n\r\n// mul_2si\r\ninline const mpreal mul_2si(const mpreal& v, long int k, mp_rnd_t rnd_mode)\r\n{\r\n    mpreal x(v);\r\n    mpfr_mul_2si(x.mpfr_ptr(),v.mpfr_srcptr(),k,rnd_mode);\r\n    return x;\r\n}\r\n\r\ninline const mpreal div_2ui(const mpreal& v, unsigned long int k, mp_rnd_t rnd_mode)\r\n{\r\n    mpreal x(v);\r\n    mpfr_div_2ui(x.mpfr_ptr(),v.mpfr_srcptr(),k,rnd_mode);\r\n    return x;\r\n}\r\n\r\ninline const mpreal div_2si(const mpreal& v, long int k, mp_rnd_t rnd_mode)\r\n{\r\n    mpreal x(v);\r\n    mpfr_div_2si(x.mpfr_ptr(),v.mpfr_srcptr(),k,rnd_mode);\r\n    return x;\r\n}\r\n\r\n//////////////////////////////////////////////////////////////////////////\r\n//Boolean operators\r\ninline bool operator >  (const mpreal& a, const mpreal& b){    return (mpfr_greater_p       (a.mpfr_srcptr(),b.mpfr_srcptr()) !=0 );    }\r\ninline bool operator >= (const mpreal& a, const mpreal& b){    return (mpfr_greaterequal_p  (a.mpfr_srcptr(),b.mpfr_srcptr()) !=0 );    }\r\ninline bool operator <  (const mpreal& a, const mpreal& b){    return (mpfr_less_p          (a.mpfr_srcptr(),b.mpfr_srcptr()) !=0 );    }\r\ninline bool operator <= (const mpreal& a, const mpreal& b){    return (mpfr_lessequal_p     (a.mpfr_srcptr(),b.mpfr_srcptr()) !=0 );    }\r\ninline bool operator == (const mpreal& a, const mpreal& b){    return (mpfr_equal_p         (a.mpfr_srcptr(),b.mpfr_srcptr()) !=0 );    }\r\ninline bool operator != (const mpreal& a, const mpreal& b){    return (mpfr_lessgreater_p   (a.mpfr_srcptr(),b.mpfr_srcptr()) !=0 );    }\r\n\r\ninline bool operator == (const mpreal& a, const unsigned long int b ){    return (mpfr_cmp_ui(a.mpfr_srcptr(),b) == 0 );    }\r\ninline bool operator == (const mpreal& a, const unsigned int b      ){    return (mpfr_cmp_ui(a.mpfr_srcptr(),b) == 0 );    }\r\ninline bool operator == (const mpreal& a, const long int b          ){    return (mpfr_cmp_si(a.mpfr_srcptr(),b) == 0 );    }\r\ninline bool operator == (const mpreal& a, const int b               ){    return (mpfr_cmp_si(a.mpfr_srcptr(),b) == 0 );    }\r\ninline bool operator == (const mpreal& a, const long double b       ){    return (mpfr_cmp_ld(a.mpfr_srcptr(),b) == 0 );    }\r\ninline bool operator == (const mpreal& a, const double b            ){    return (mpfr_cmp_d (a.mpfr_srcptr(),b) == 0 );    }\r\n\r\n\r\ninline bool isnan    (const mpreal& op){    return (mpfr_nan_p    (op.mpfr_srcptr()) != 0 );    }\r\ninline bool isinf    (const mpreal& op){    return (mpfr_inf_p    (op.mpfr_srcptr()) != 0 );    }\r\ninline bool isfinite (const mpreal& op){    return (mpfr_number_p (op.mpfr_srcptr()) != 0 );    }\r\ninline bool iszero   (const mpreal& op){    return (mpfr_zero_p   (op.mpfr_srcptr()) != 0 );    }\r\ninline bool isint    (const mpreal& op){    return (mpfr_integer_p(op.mpfr_srcptr()) != 0 );    }\r\n\r\n#if (MPFR_VERSION >= MPFR_VERSION_NUM(3,0,0))\r\ninline bool isregular(const mpreal& op){    return (mpfr_regular_p(op.mpfr_srcptr()));}\r\n#endif \r\n\r\n//////////////////////////////////////////////////////////////////////////\r\n// Type Converters\r\ninline bool             mpreal::toBool (mp_rnd_t /*mode*/) const   {    return  mpfr_zero_p (mpfr_srcptr()) == 0;     }\r\ninline long             mpreal::toLong   (mp_rnd_t mode)  const    {    return  mpfr_get_si (mpfr_srcptr(), mode);    }\r\ninline unsigned long    mpreal::toULong  (mp_rnd_t mode)  const    {    return  mpfr_get_ui (mpfr_srcptr(), mode);    }\r\ninline float            mpreal::toFloat  (mp_rnd_t mode)  const    {    return  mpfr_get_flt(mpfr_srcptr(), mode);    }\r\ninline double           mpreal::toDouble (mp_rnd_t mode)  const    {    return  mpfr_get_d  (mpfr_srcptr(), mode);    }\r\ninline long double      mpreal::toLDouble(mp_rnd_t mode)  const    {    return  mpfr_get_ld (mpfr_srcptr(), mode);    }\r\n\r\n#if defined (MPREAL_HAVE_INT64_SUPPORT)\r\ninline int64_t      mpreal::toInt64 (mp_rnd_t mode)    const{    return mpfr_get_sj(mpfr_srcptr(), mode);    }\r\ninline uint64_t     mpreal::toUInt64(mp_rnd_t mode)    const{    return mpfr_get_uj(mpfr_srcptr(), mode);    }\r\n#endif\r\n\r\ninline ::mpfr_ptr     mpreal::mpfr_ptr()             { return mp; }\r\ninline ::mpfr_srcptr  mpreal::mpfr_ptr()    const    { return mp; }\r\ninline ::mpfr_srcptr  mpreal::mpfr_srcptr() const    { return mp; }\r\n\r\ntemplate <class T>\r\ninline std::string toString(T t, std::ios_base & (*f)(std::ios_base&))\r\n{\r\n    std::ostringstream oss;\r\n    oss << f << t;\r\n    return oss.str();\r\n}\r\n\r\n#if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0))\r\n\r\ninline std::string mpreal::toString(const std::string& format) const\r\n{\r\n    char *s = NULL;\r\n    std::string out;\r\n\r\n    if( !format.empty() )\r\n    {\r\n        if(!(mpfr_asprintf(&s, format.c_str(), mpfr_srcptr()) < 0))\r\n        {\r\n            out = std::string(s);\r\n\r\n            mpfr_free_str(s);\r\n        }\r\n    }\r\n\r\n    return out;\r\n}\r\n\r\n#endif\r\n\r\ninline std::string mpreal::toString(int n, int b, mp_rnd_t mode) const\r\n{\r\n    // TODO: Add extended format specification (f, e, rounding mode) as it done in output operator\r\n    (void)b;\r\n    (void)mode;\r\n\r\n#if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0))\r\n\r\n    std::ostringstream format;\r\n\r\n    int digits = (n >= 0) ? n : bits2digits(mpfr_get_prec(mpfr_srcptr()));\r\n    \r\n    format << \"%.\" << digits << \"RNg\";\r\n\r\n    return toString(format.str());\r\n\r\n#else\r\n\r\n    char *s, *ns = NULL; \r\n    size_t slen, nslen;\r\n    mp_exp_t exp;\r\n    std::string out;\r\n\r\n    if(mpfr_inf_p(mp))\r\n    { \r\n        if(mpfr_sgn(mp)>0) return \"+Inf\";\r\n        else               return \"-Inf\";\r\n    }\r\n\r\n    if(mpfr_zero_p(mp)) return \"0\";\r\n    if(mpfr_nan_p(mp))  return \"NaN\";\r\n\r\n    s  = mpfr_get_str(NULL, &exp, b, 0, mp, mode);\r\n    ns = mpfr_get_str(NULL, &exp, b, (std::max)(0,n), mp, mode);\r\n\r\n    if(s!=NULL && ns!=NULL)\r\n    {\r\n        slen  = strlen(s);\r\n        nslen = strlen(ns);\r\n        if(nslen<=slen) \r\n        {\r\n            mpfr_free_str(s);\r\n            s = ns;\r\n            slen = nslen;\r\n        }\r\n        else {\r\n            mpfr_free_str(ns);\r\n        }\r\n\r\n        // Make human eye-friendly formatting if possible\r\n        if (exp>0 && static_cast<size_t>(exp)<slen)\r\n        {\r\n            if(s[0]=='-')\r\n            {\r\n                // Remove zeros starting from right end\r\n                char* ptr = s+slen-1;\r\n                while (*ptr=='0' && ptr>s+exp) ptr--; \r\n\r\n                if(ptr==s+exp) out = std::string(s,exp+1);\r\n                else           out = std::string(s,exp+1)+'.'+std::string(s+exp+1,ptr-(s+exp+1)+1);\r\n\r\n                //out = string(s,exp+1)+'.'+string(s+exp+1);\r\n            }\r\n            else\r\n            {\r\n                // Remove zeros starting from right end\r\n                char* ptr = s+slen-1;\r\n                while (*ptr=='0' && ptr>s+exp-1) ptr--; \r\n\r\n                if(ptr==s+exp-1) out = std::string(s,exp);\r\n                else             out = std::string(s,exp)+'.'+std::string(s+exp,ptr-(s+exp)+1);\r\n\r\n                //out = string(s,exp)+'.'+string(s+exp);\r\n            }\r\n\r\n        }else{ // exp<0 || exp>slen\r\n            if(s[0]=='-')\r\n            {\r\n                // Remove zeros starting from right end\r\n                char* ptr = s+slen-1;\r\n                while (*ptr=='0' && ptr>s+1) ptr--; \r\n\r\n                if(ptr==s+1) out = std::string(s,2);\r\n                else         out = std::string(s,2)+'.'+std::string(s+2,ptr-(s+2)+1);\r\n\r\n                //out = string(s,2)+'.'+string(s+2);\r\n            }\r\n            else\r\n            {\r\n                // Remove zeros starting from right end\r\n                char* ptr = s+slen-1;\r\n                while (*ptr=='0' && ptr>s) ptr--; \r\n\r\n                if(ptr==s) out = std::string(s,1);\r\n                else       out = std::string(s,1)+'.'+std::string(s+1,ptr-(s+1)+1);\r\n\r\n                //out = string(s,1)+'.'+string(s+1);\r\n            }\r\n\r\n            // Make final string\r\n            if(--exp)\r\n            {\r\n                if(exp>0) out += \"e+\"+mpfr::toString<mp_exp_t>(exp,std::dec);\r\n                else       out += \"e\"+mpfr::toString<mp_exp_t>(exp,std::dec);\r\n            }\r\n        }\r\n\r\n        mpfr_free_str(s);\r\n        return out;\r\n    }else{\r\n        return \"conversion error!\";\r\n    }\r\n#endif\r\n}\r\n\r\n\r\n//////////////////////////////////////////////////////////////////////////\r\n// I/O\r\ninline std::ostream& mpreal::output(std::ostream& os) const \r\n{\r\n    std::ostringstream format;\r\n    const std::ios::fmtflags flags = os.flags();\r\n\r\n    format << ((flags & std::ios::showpos) ? \"%+\" : \"%\");\r\n    if (os.precision() >= 0)\r\n        format << '.' << os.precision() << \"R*\"\r\n               << ((flags & std::ios::floatfield) == std::ios::fixed ? 'f' :\r\n                   (flags & std::ios::floatfield) == std::ios::scientific ? 'e' :\r\n                   'g');\r\n    else\r\n        format << \"R*e\";\r\n\r\n    char *s = NULL;\r\n    if(!(mpfr_asprintf(&s, format.str().c_str(),\r\n                        mpfr::mpreal::get_default_rnd(),\r\n                        mpfr_srcptr())\r\n        < 0))\r\n    {\r\n        os << std::string(s);\r\n        mpfr_free_str(s);\r\n    }\r\n    return os;\r\n}\r\n\r\ninline std::ostream& operator<<(std::ostream& os, const mpreal& v)\r\n{\r\n    return v.output(os);\r\n}\r\n\r\ninline std::istream& operator>>(std::istream &is, mpreal& v)\r\n{\r\n    // TODO: use cout::hexfloat and other flags to setup base\r\n    std::string tmp;\r\n    is >> tmp;\r\n    mpfr_set_str(v.mpfr_ptr(), tmp.c_str(), 10, mpreal::get_default_rnd());\r\n    return is;\r\n}\r\n\r\n//////////////////////////////////////////////////////////////////////////\r\n//     Bits - decimal digits relation\r\n//        bits   = ceil(digits*log[2](10))\r\n//        digits = floor(bits*log[10](2))\r\n\r\ninline mp_prec_t digits2bits(int d)\r\n{\r\n    const double LOG2_10 = 3.3219280948873624;\r\n\r\n    return mp_prec_t(std::ceil( d * LOG2_10 ));\r\n}\r\n\r\ninline int bits2digits(mp_prec_t b)\r\n{\r\n    const double LOG10_2 = 0.30102999566398119;\r\n\r\n    return int(std::floor( b * LOG10_2 ));\r\n}\r\n\r\n//////////////////////////////////////////////////////////////////////////\r\n// Set/Get number properties\r\ninline int sgn(const mpreal& op)\r\n{\r\n    int r = mpfr_signbit(op.mpfr_srcptr());\r\n    return (r > 0? -1 : 1);\r\n}\r\n\r\ninline mpreal& mpreal::setSign(int sign, mp_rnd_t RoundingMode)\r\n{\r\n    mpfr_setsign(mpfr_ptr(), mpfr_srcptr(), (sign < 0 ? 1 : 0), RoundingMode);\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline int mpreal::getPrecision() const\r\n{\r\n    return int(mpfr_get_prec(mpfr_srcptr()));\r\n}\r\n\r\ninline mpreal& mpreal::setPrecision(int Precision, mp_rnd_t RoundingMode)\r\n{\r\n    mpfr_prec_round(mpfr_ptr(), Precision, RoundingMode);\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal& mpreal::setInf(int sign) \r\n{ \r\n    mpfr_set_inf(mpfr_ptr(), sign);\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}    \r\n\r\ninline mpreal& mpreal::setNan() \r\n{\r\n    mpfr_set_nan(mpfr_ptr());\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mpreal&    mpreal::setZero(int sign)\r\n{\r\n\r\n#if (MPFR_VERSION >= MPFR_VERSION_NUM(3,0,0))\r\n    mpfr_set_zero(mpfr_ptr(), sign);\r\n#else\r\n    mpfr_set_si(mpfr_ptr(), 0, (mpfr_get_default_rounding_mode)());\r\n    setSign(sign);\r\n#endif \r\n\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return *this;\r\n}\r\n\r\ninline mp_prec_t mpreal::get_prec() const\r\n{\r\n    return mpfr_get_prec(mpfr_srcptr());\r\n}\r\n\r\ninline void mpreal::set_prec(mp_prec_t prec, mp_rnd_t rnd_mode)\r\n{\r\n    mpfr_prec_round(mpfr_ptr(),prec,rnd_mode);\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n}\r\n\r\ninline mp_exp_t mpreal::get_exp ()\r\n{\r\n    return mpfr_get_exp(mpfr_srcptr());\r\n}\r\n\r\ninline int mpreal::set_exp (mp_exp_t e)\r\n{\r\n    int x = mpfr_set_exp(mpfr_ptr(), e);\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return x;\r\n}\r\n\r\ninline const mpreal frexp(const mpreal& v, mp_exp_t* exp)\r\n{\r\n    mpreal x(v);\r\n    *exp = x.get_exp();\r\n    x.set_exp(0);\r\n    return x;\r\n}\r\n\r\ninline const mpreal ldexp(const mpreal& v, mp_exp_t exp)\r\n{\r\n    mpreal x(v);\r\n\r\n    // rounding is not important since we just increasing the exponent\r\n    mpfr_mul_2si(x.mpfr_ptr(), x.mpfr_srcptr(), exp, mpreal::get_default_rnd()); \r\n    return x;\r\n}\r\n\r\ninline mpreal machine_epsilon(mp_prec_t prec)\r\n{\r\n    /* the smallest eps such that 1 + eps != 1 */\r\n    return machine_epsilon(mpreal(1, prec));\r\n}\r\n\r\ninline mpreal machine_epsilon(const mpreal& x)\r\n{    \r\n    /* the smallest eps such that x + eps != x */\r\n    if( x < 0)\r\n    {\r\n        return nextabove(-x) + x;\r\n    }else{\r\n        return nextabove( x) - x;\r\n    }\r\n}\r\n\r\n// minval is 'safe' meaning 1 / minval does not overflow\r\ninline mpreal minval(mp_prec_t prec)\r\n{\r\n    /* min = 1/2 * 2^emin = 2^(emin - 1) */\r\n    return mpreal(1, prec) << mpreal::get_emin()-1;\r\n}\r\n\r\n// maxval is 'safe' meaning 1 / maxval does not underflow\r\ninline mpreal maxval(mp_prec_t prec)\r\n{\r\n    /* max = (1 - eps) * 2^emax, eps is machine epsilon */\r\n    return (mpreal(1, prec) - machine_epsilon(prec)) << mpreal::get_emax(); \r\n}\r\n\r\ninline bool isEqualUlps(const mpreal& a, const mpreal& b, int maxUlps)\r\n{\r\n    return abs(a - b) <= machine_epsilon((max)(abs(a), abs(b))) * maxUlps;\r\n}\r\n\r\ninline bool isEqualFuzzy(const mpreal& a, const mpreal& b, const mpreal& eps)\r\n{\r\n    return abs(a - b) <= eps;\r\n}\r\n\r\ninline bool isEqualFuzzy(const mpreal& a, const mpreal& b)\r\n{\r\n    return isEqualFuzzy(a, b, machine_epsilon((max)(1, (min)(abs(a), abs(b)))));\r\n}\r\n\r\ninline const mpreal modf(const mpreal& v, mpreal& n)\r\n{\r\n    mpreal f(v);\r\n\r\n    // rounding is not important since we are using the same number\r\n    mpfr_frac (f.mpfr_ptr(),f.mpfr_srcptr(),mpreal::get_default_rnd());    \r\n    mpfr_trunc(n.mpfr_ptr(),v.mpfr_srcptr());\r\n    return f;\r\n}\r\n\r\ninline int mpreal::check_range (int t, mp_rnd_t rnd_mode)\r\n{\r\n    return mpfr_check_range(mpfr_ptr(),t,rnd_mode);\r\n}\r\n\r\ninline int mpreal::subnormalize (int t,mp_rnd_t rnd_mode)\r\n{\r\n    int r = mpfr_subnormalize(mpfr_ptr(),t,rnd_mode);\r\n    MPREAL_MSVC_DEBUGVIEW_CODE;\r\n    return r;\r\n}\r\n\r\ninline mp_exp_t mpreal::get_emin (void)\r\n{\r\n    return mpfr_get_emin();\r\n}\r\n\r\ninline int mpreal::set_emin (mp_exp_t exp)\r\n{\r\n    return mpfr_set_emin(exp);\r\n}\r\n\r\ninline mp_exp_t mpreal::get_emax (void)\r\n{\r\n    return mpfr_get_emax();\r\n}\r\n\r\ninline int mpreal::set_emax (mp_exp_t exp)\r\n{\r\n    return mpfr_set_emax(exp);\r\n}\r\n\r\ninline mp_exp_t mpreal::get_emin_min (void)\r\n{\r\n    return mpfr_get_emin_min();\r\n}\r\n\r\ninline mp_exp_t mpreal::get_emin_max (void)\r\n{\r\n    return mpfr_get_emin_max();\r\n}\r\n\r\ninline mp_exp_t mpreal::get_emax_min (void)\r\n{\r\n    return mpfr_get_emax_min();\r\n}\r\n\r\ninline mp_exp_t mpreal::get_emax_max (void)\r\n{\r\n    return mpfr_get_emax_max();\r\n}\r\n\r\n//////////////////////////////////////////////////////////////////////////\r\n// Mathematical Functions\r\n//////////////////////////////////////////////////////////////////////////\r\n#define MPREAL_UNARY_MATH_FUNCTION_BODY(f)                    \\\r\n        mpreal y(0, mpfr_get_prec(x.mpfr_srcptr()));          \\\r\n        mpfr_##f(y.mpfr_ptr(), x.mpfr_srcptr(), r);           \\\r\n        return y; \r\n\r\ninline const mpreal sqr  (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd())\r\n{   MPREAL_UNARY_MATH_FUNCTION_BODY(sqr );    }\r\n\r\ninline const mpreal sqrt (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd())\r\n{   MPREAL_UNARY_MATH_FUNCTION_BODY(sqrt);    }\r\n\r\ninline const mpreal sqrt(const unsigned long int x, mp_rnd_t r)\r\n{\r\n    mpreal y;\r\n    mpfr_sqrt_ui(y.mpfr_ptr(), x, r);\r\n    return y;\r\n}\r\n\r\ninline const mpreal sqrt(const unsigned int v, mp_rnd_t rnd_mode)\r\n{\r\n    return sqrt(static_cast<unsigned long int>(v),rnd_mode);\r\n}\r\n\r\ninline const mpreal sqrt(const long int v, mp_rnd_t rnd_mode)\r\n{\r\n    if (v>=0)   return sqrt(static_cast<unsigned long int>(v),rnd_mode);\r\n    else        return mpreal().setNan(); // NaN  \r\n}\r\n\r\ninline const mpreal sqrt(const int v, mp_rnd_t rnd_mode)\r\n{\r\n    if (v>=0)   return sqrt(static_cast<unsigned long int>(v),rnd_mode);\r\n    else        return mpreal().setNan(); // NaN\r\n}\r\n\r\ninline const mpreal root(const mpreal& x, unsigned long int k, mp_rnd_t r = mpreal::get_default_rnd())\r\n{\r\n    mpreal y(0, mpfr_get_prec(x.mpfr_srcptr())); \r\n    mpfr_root(y.mpfr_ptr(), x.mpfr_srcptr(), k, r);  \r\n    return y; \r\n}\r\n\r\ninline const mpreal dim(const mpreal& a, const mpreal& b, mp_rnd_t r = mpreal::get_default_rnd())\r\n{\r\n    mpreal y(0, mpfr_get_prec(a.mpfr_srcptr()));\r\n    mpfr_dim(y.mpfr_ptr(), a.mpfr_srcptr(), b.mpfr_srcptr(), r);\r\n    return y;\r\n}\r\n\r\ninline int cmpabs(const mpreal& a,const mpreal& b)\r\n{\r\n    return mpfr_cmpabs(a.mpfr_ptr(), b.mpfr_srcptr());\r\n}\r\n\r\ninline int sin_cos(mpreal& s, mpreal& c, const mpreal& v, mp_rnd_t rnd_mode = mpreal::get_default_rnd())\r\n{\r\n    return mpfr_sin_cos(s.mpfr_ptr(), c.mpfr_ptr(), v.mpfr_srcptr(), rnd_mode);\r\n}\r\n\r\ninline const mpreal sqrt  (const long double v, mp_rnd_t rnd_mode)    {   return sqrt(mpreal(v),rnd_mode);    }\r\ninline const mpreal sqrt  (const double v, mp_rnd_t rnd_mode)         {   return sqrt(mpreal(v),rnd_mode);    }\r\n\r\ninline const mpreal cbrt  (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(cbrt );    }\r\ninline const mpreal fabs  (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(abs  );    }\r\ninline const mpreal abs   (const mpreal& x, mp_rnd_t r)                             {   MPREAL_UNARY_MATH_FUNCTION_BODY(abs  );    }\r\ninline const mpreal log   (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(log  );    }\r\ninline const mpreal log2  (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(log2 );    }\r\ninline const mpreal log10 (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(log10);    }\r\ninline const mpreal exp   (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(exp  );    }\r\ninline const mpreal exp2  (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(exp2 );    }\r\ninline const mpreal exp10 (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(exp10);    }\r\ninline const mpreal cos   (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(cos  );    }\r\ninline const mpreal sin   (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(sin  );    }\r\ninline const mpreal tan   (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(tan  );    }\r\ninline const mpreal sec   (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(sec  );    }\r\ninline const mpreal csc   (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(csc  );    }\r\ninline const mpreal cot   (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(cot  );    }\r\ninline const mpreal acos  (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(acos );    }\r\ninline const mpreal asin  (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(asin );    }\r\ninline const mpreal atan  (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(atan );    }\r\n\r\ninline const mpreal acot  (const mpreal& v, mp_rnd_t r = mpreal::get_default_rnd()) {   return atan (1/v, r);                      }\r\ninline const mpreal asec  (const mpreal& v, mp_rnd_t r = mpreal::get_default_rnd()) {   return acos (1/v, r);                      }\r\ninline const mpreal acsc  (const mpreal& v, mp_rnd_t r = mpreal::get_default_rnd()) {   return asin (1/v, r);                      }\r\ninline const mpreal acoth (const mpreal& v, mp_rnd_t r = mpreal::get_default_rnd()) {   return atanh(1/v, r);                      }\r\ninline const mpreal asech (const mpreal& v, mp_rnd_t r = mpreal::get_default_rnd()) {   return acosh(1/v, r);                      }\r\ninline const mpreal acsch (const mpreal& v, mp_rnd_t r = mpreal::get_default_rnd()) {   return asinh(1/v, r);                      }\r\n\r\ninline const mpreal cosh  (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(cosh );    }\r\ninline const mpreal sinh  (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(sinh );    }\r\ninline const mpreal tanh  (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(tanh );    }\r\ninline const mpreal sech  (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(sech );    }\r\ninline const mpreal csch  (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(csch );    }\r\ninline const mpreal coth  (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(coth );    }\r\ninline const mpreal acosh (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(acosh);    }\r\ninline const mpreal asinh (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(asinh);    }\r\ninline const mpreal atanh (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(atanh);    }\r\n\r\ninline const mpreal log1p   (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(log1p  );    }\r\ninline const mpreal expm1   (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(expm1  );    }\r\ninline const mpreal eint    (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(eint   );    }\r\ninline const mpreal gamma   (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(gamma  );    }\r\ninline const mpreal lngamma (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(lngamma);    }\r\ninline const mpreal zeta    (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(zeta   );    }\r\ninline const mpreal erf     (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(erf    );    }\r\ninline const mpreal erfc    (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(erfc   );    }\r\ninline const mpreal besselj0(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(j0     );    }\r\ninline const mpreal besselj1(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(j1     );    }\r\ninline const mpreal bessely0(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(y0     );    }\r\ninline const mpreal bessely1(const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(y1     );    }\r\n\r\ninline const mpreal atan2 (const mpreal& y, const mpreal& x, mp_rnd_t rnd_mode = mpreal::get_default_rnd())\r\n{\r\n    mpreal a(0,(std::max)(y.getPrecision(), x.getPrecision()));\r\n    mpfr_atan2(a.mpfr_ptr(), y.mpfr_srcptr(), x.mpfr_srcptr(), rnd_mode);\r\n    return a;\r\n}\r\n\r\ninline const mpreal hypot (const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode = mpreal::get_default_rnd())\r\n{\r\n    mpreal a(0,(std::max)(y.getPrecision(), x.getPrecision()));\r\n    mpfr_hypot(a.mpfr_ptr(), x.mpfr_srcptr(), y.mpfr_srcptr(), rnd_mode);\r\n    return a;\r\n}\r\n\r\ninline const mpreal remainder (const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode = mpreal::get_default_rnd())\r\n{    \r\n    mpreal a(0,(std::max)(y.getPrecision(), x.getPrecision()));\r\n    mpfr_remainder(a.mpfr_ptr(), x.mpfr_srcptr(), y.mpfr_srcptr(), rnd_mode);\r\n    return a;\r\n}\r\n\r\ninline const mpreal remquo (long* q, const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode = mpreal::get_default_rnd())\r\n{\r\n    mpreal a(0,(std::max)(y.getPrecision(), x.getPrecision()));\r\n    mpfr_remquo(a.mpfr_ptr(),q, x.mpfr_srcptr(), y.mpfr_srcptr(), rnd_mode);\r\n    return a;\r\n}\r\n\r\ninline const mpreal fac_ui (unsigned long int v, mp_prec_t prec     = mpreal::get_default_prec(),\r\n                                           mp_rnd_t  rnd_mode = mpreal::get_default_rnd())\r\n{\r\n    mpreal x(0, prec);\r\n    mpfr_fac_ui(x.mpfr_ptr(),v,rnd_mode);\r\n    return x;\r\n}\r\n\r\n\r\ninline const mpreal lgamma (const mpreal& v, int *signp = 0, mp_rnd_t rnd_mode = mpreal::get_default_rnd())\r\n{\r\n    mpreal x(v);\r\n    int tsignp;\r\n\r\n    if(signp)   mpfr_lgamma(x.mpfr_ptr(),  signp,v.mpfr_srcptr(),rnd_mode);\r\n    else        mpfr_lgamma(x.mpfr_ptr(),&tsignp,v.mpfr_srcptr(),rnd_mode);\r\n\r\n    return x;\r\n}\r\n\r\n\r\ninline const mpreal besseljn (long n, const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd())\r\n{\r\n    mpreal  y(0, x.getPrecision());\r\n    mpfr_jn(y.mpfr_ptr(), n, x.mpfr_srcptr(), r);\r\n    return y;\r\n}\r\n\r\ninline const mpreal besselyn (long n, const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd())\r\n{\r\n    mpreal  y(0, x.getPrecision());\r\n    mpfr_yn(y.mpfr_ptr(), n, x.mpfr_srcptr(), r);\r\n    return y;\r\n}\r\n\r\ninline const mpreal fma (const mpreal& v1, const mpreal& v2, const mpreal& v3, mp_rnd_t rnd_mode = mpreal::get_default_rnd())\r\n{\r\n    mpreal a;\r\n    mp_prec_t p1, p2, p3;\r\n\r\n    p1 = v1.get_prec(); \r\n    p2 = v2.get_prec(); \r\n    p3 = v3.get_prec(); \r\n\r\n    a.set_prec(p3>p2?(p3>p1?p3:p1):(p2>p1?p2:p1));\r\n\r\n    mpfr_fma(a.mp,v1.mp,v2.mp,v3.mp,rnd_mode);\r\n    return a;\r\n}\r\n\r\ninline const mpreal fms (const mpreal& v1, const mpreal& v2, const mpreal& v3, mp_rnd_t rnd_mode = mpreal::get_default_rnd())\r\n{\r\n    mpreal a;\r\n    mp_prec_t p1, p2, p3;\r\n\r\n    p1 = v1.get_prec(); \r\n    p2 = v2.get_prec(); \r\n    p3 = v3.get_prec(); \r\n\r\n    a.set_prec(p3>p2?(p3>p1?p3:p1):(p2>p1?p2:p1));\r\n\r\n    mpfr_fms(a.mp,v1.mp,v2.mp,v3.mp,rnd_mode);\r\n    return a;\r\n}\r\n\r\ninline const mpreal agm (const mpreal& v1, const mpreal& v2, mp_rnd_t rnd_mode = mpreal::get_default_rnd())\r\n{\r\n    mpreal a;\r\n    mp_prec_t p1, p2;\r\n\r\n    p1 = v1.get_prec(); \r\n    p2 = v2.get_prec(); \r\n\r\n    a.set_prec(p1>p2?p1:p2);\r\n\r\n    mpfr_agm(a.mp, v1.mp, v2.mp, rnd_mode);\r\n\r\n    return a;\r\n}\r\n\r\ninline const mpreal sum (const mpreal tab[], unsigned long int n, mp_rnd_t rnd_mode = mpreal::get_default_rnd())\r\n{\r\n    mpreal x;\r\n    mpfr_ptr* t;\r\n    unsigned long int i;\r\n\r\n    t = new mpfr_ptr[n];\r\n    for (i=0;i<n;i++) t[i] = (mpfr_ptr)tab[i].mp;\r\n    mpfr_sum(x.mp,t,n,rnd_mode);\r\n    delete[] t;\r\n    return x;\r\n}\r\n\r\n//////////////////////////////////////////////////////////////////////////\r\n// MPFR 2.4.0 Specifics\r\n#if (MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0))\r\n\r\ninline int sinh_cosh(mpreal& s, mpreal& c, const mpreal& v, mp_rnd_t rnd_mode = mpreal::get_default_rnd())\r\n{\r\n    return mpfr_sinh_cosh(s.mp,c.mp,v.mp,rnd_mode);\r\n}\r\n\r\ninline const mpreal li2 (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) \r\n{   \r\n    MPREAL_UNARY_MATH_FUNCTION_BODY(li2);    \r\n}\r\n\r\ninline const mpreal rem (const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode = mpreal::get_default_rnd())\r\n{\r\n    /*  R = rem(X,Y) if Y != 0, returns X - n * Y where n = trunc(X/Y). */\r\n    return fmod(x, y, rnd_mode);\r\n}\r\n\r\ninline const mpreal mod (const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode = mpreal::get_default_rnd())\r\n{\r\n    (void)rnd_mode;\r\n    \r\n    /*  \r\n\r\n    m = mod(x,y) if y != 0, returns x - n*y where n = floor(x/y)\r\n\r\n    The following are true by convention:\r\n    - mod(x,0) is x\r\n    - mod(x,x) is 0\r\n    - mod(x,y) for x != y and y != 0 has the same sign as y.    \r\n    \r\n    */\r\n\r\n    if(iszero(y)) return x;\r\n    if(x == y) return 0;\r\n\r\n    mpreal m = x - floor(x / y) * y;\r\n    \r\n    m.setSign(sgn(y)); // make sure result has the same sign as Y\r\n\r\n    return m;\r\n}\r\n\r\ninline const mpreal fmod (const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode = mpreal::get_default_rnd())\r\n{\r\n    mpreal a;\r\n    mp_prec_t yp, xp;\r\n\r\n    yp = y.get_prec(); \r\n    xp = x.get_prec(); \r\n\r\n    a.set_prec(yp>xp?yp:xp);\r\n\r\n    mpfr_fmod(a.mp, x.mp, y.mp, rnd_mode);\r\n\r\n    return a;\r\n}\r\n\r\ninline const mpreal rec_sqrt(const mpreal& v, mp_rnd_t rnd_mode = mpreal::get_default_rnd())\r\n{\r\n    mpreal x(v);\r\n    mpfr_rec_sqrt(x.mp,v.mp,rnd_mode);\r\n    return x;\r\n}\r\n#endif //  MPFR 2.4.0 Specifics\r\n\r\n//////////////////////////////////////////////////////////////////////////\r\n// MPFR 3.0.0 Specifics\r\n#if (MPFR_VERSION >= MPFR_VERSION_NUM(3,0,0))\r\ninline const mpreal digamma (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(digamma);     }\r\ninline const mpreal ai      (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(ai);          }\r\n#endif // MPFR 3.0.0 Specifics\r\n\r\n//////////////////////////////////////////////////////////////////////////\r\n// Constants\r\ninline const mpreal const_log2 (mp_prec_t p = mpreal::get_default_prec(), mp_rnd_t r = mpreal::get_default_rnd())\r\n{\r\n    mpreal x(0, p);\r\n    mpfr_const_log2(x.mpfr_ptr(), r);\r\n    return x;\r\n}\r\n\r\ninline const mpreal const_pi (mp_prec_t p = mpreal::get_default_prec(), mp_rnd_t r = mpreal::get_default_rnd())\r\n{\r\n    mpreal x(0, p);\r\n    mpfr_const_pi(x.mpfr_ptr(), r);\r\n    return x;\r\n}\r\n\r\ninline const mpreal const_euler (mp_prec_t p = mpreal::get_default_prec(), mp_rnd_t r = mpreal::get_default_rnd())\r\n{\r\n    mpreal x(0, p);\r\n    mpfr_const_euler(x.mpfr_ptr(), r);\r\n    return x;\r\n}\r\n\r\ninline const mpreal const_catalan (mp_prec_t p = mpreal::get_default_prec(), mp_rnd_t r = mpreal::get_default_rnd())\r\n{\r\n    mpreal x(0, p);\r\n    mpfr_const_catalan(x.mpfr_ptr(), r);\r\n    return x;\r\n}\r\n\r\ninline const mpreal const_infinity (int sign = 1, mp_prec_t p = mpreal::get_default_prec())\r\n{\r\n    mpreal x(0, p);\r\n    mpfr_set_inf(x.mpfr_ptr(), sign);\r\n    return x;\r\n}\r\n\r\n//////////////////////////////////////////////////////////////////////////\r\n// Integer Related Functions\r\ninline const mpreal ceil(const mpreal& v)\r\n{\r\n    mpreal x(v);\r\n    mpfr_ceil(x.mp,v.mp);\r\n    return x;\r\n}\r\n\r\ninline const mpreal floor(const mpreal& v)\r\n{\r\n    mpreal x(v);\r\n    mpfr_floor(x.mp,v.mp);\r\n    return x;\r\n}\r\n\r\ninline const mpreal round(const mpreal& v)\r\n{\r\n    mpreal x(v);\r\n    mpfr_round(x.mp,v.mp);\r\n    return x;\r\n}\r\n\r\ninline const mpreal trunc(const mpreal& v)\r\n{\r\n    mpreal x(v);\r\n    mpfr_trunc(x.mp,v.mp);\r\n    return x;\r\n}\r\n\r\ninline const mpreal rint       (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(rint      );     }\r\ninline const mpreal rint_ceil  (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(rint_ceil );     }\r\ninline const mpreal rint_floor (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(rint_floor);     }\r\ninline const mpreal rint_round (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(rint_round);     }\r\ninline const mpreal rint_trunc (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(rint_trunc);     }\r\ninline const mpreal frac       (const mpreal& x, mp_rnd_t r = mpreal::get_default_rnd()) {   MPREAL_UNARY_MATH_FUNCTION_BODY(frac      );     }\r\n\r\n//////////////////////////////////////////////////////////////////////////\r\n// Miscellaneous Functions\r\ninline void         swap (mpreal& a, mpreal& b)            {    mpfr_swap(a.mp,b.mp);   }\r\ninline const mpreal (max)(const mpreal& x, const mpreal& y){    return (x>y?x:y);       }\r\ninline const mpreal (min)(const mpreal& x, const mpreal& y){    return (x<y?x:y);       }\r\n\r\ninline const mpreal fmax(const mpreal& x, const mpreal& y, mp_rnd_t rnd_mode = mpreal::get_default_rnd())\r\n{\r\n    mpreal a;\r\n    mpfr_max(a.mp,x.mp,y.mp,rnd_mode);\r\n    return a;\r\n}\r\n\r\ninline const mpreal fmin(const mpreal& x, const mpreal& y,  mp_rnd_t rnd_mode = mpreal::get_default_rnd())\r\n{\r\n    mpreal a;\r\n    mpfr_min(a.mp,x.mp,y.mp,rnd_mode);\r\n    return a;\r\n}\r\n\r\ninline const mpreal nexttoward (const mpreal& x, const mpreal& y)\r\n{\r\n    mpreal a(x);\r\n    mpfr_nexttoward(a.mp,y.mp);\r\n    return a;\r\n}\r\n\r\ninline const mpreal nextabove  (const mpreal& x)\r\n{\r\n    mpreal a(x);\r\n    mpfr_nextabove(a.mp);\r\n    return a;\r\n}\r\n\r\ninline const mpreal nextbelow  (const mpreal& x)\r\n{\r\n    mpreal a(x);\r\n    mpfr_nextbelow(a.mp);\r\n    return a;\r\n}\r\n\r\ninline const mpreal urandomb (gmp_randstate_t& state)\r\n{\r\n    mpreal x;\r\n    mpfr_urandomb(x.mp,state);\r\n    return x;\r\n}\r\n\r\n#if (MPFR_VERSION >= MPFR_VERSION_NUM(3,1,0))\r\n// use gmp_randinit_default() to init state, gmp_randclear() to clear\r\ninline const mpreal urandom (gmp_randstate_t& state, mp_rnd_t rnd_mode = mpreal::get_default_rnd())\r\n{\r\n    mpreal x;\r\n    mpfr_urandom(x.mp,state,rnd_mode);\r\n    return x;\r\n}\r\n\r\ninline const mpreal grandom (gmp_randstate_t& state, mp_rnd_t rnd_mode = mpreal::get_default_rnd())\r\n{\r\n    mpreal x;\r\n    mpfr_grandom(x.mp, NULL, state, rnd_mode);\r\n    return x;\r\n}\r\n\r\n#endif \r\n\r\n#if (MPFR_VERSION <= MPFR_VERSION_NUM(2,4,2))\r\ninline const mpreal random2 (mp_size_t size, mp_exp_t exp)\r\n{\r\n    mpreal x;\r\n    mpfr_random2(x.mp,size,exp);\r\n    return x;\r\n}\r\n#endif\r\n\r\n// Uniformly distributed random number generation\r\n// a = random(seed); <- initialization & first random number generation\r\n// a = random();     <- next random numbers generation\r\n// seed != 0\r\ninline const mpreal random(unsigned int seed = 0)\r\n{\r\n\r\n#if (MPFR_VERSION >= MPFR_VERSION_NUM(3,0,0))\r\n    static gmp_randstate_t state;\r\n    static bool isFirstTime = true;\r\n\r\n    if(isFirstTime)\r\n    {\r\n        gmp_randinit_default(state);\r\n        gmp_randseed_ui(state,0);\r\n        isFirstTime = false;\r\n    }\r\n\r\n    if(seed != 0)    gmp_randseed_ui(state,seed);\r\n\r\n    return mpfr::urandom(state);\r\n#else\r\n    if(seed != 0)    std::srand(seed);\r\n    return mpfr::mpreal(std::rand()/(double)RAND_MAX);\r\n#endif\r\n\r\n}\r\n\r\n#if (MPFR_VERSION >= MPFR_VERSION_NUM(3,0,0))\r\ninline const mpreal grandom(unsigned int seed = 0)\r\n{\r\n    static gmp_randstate_t state;\r\n    static bool isFirstTime = true;\r\n\r\n    if(isFirstTime)\r\n    {\r\n        gmp_randinit_default(state);\r\n        gmp_randseed_ui(state,0);\r\n        isFirstTime = false;\r\n    }\r\n\r\n    if(seed != 0) gmp_randseed_ui(state,seed);\r\n\r\n    return mpfr::grandom(state);\r\n}\r\n#endif\r\n\r\n//////////////////////////////////////////////////////////////////////////\r\n// Set/Get global properties\r\ninline void mpreal::set_default_prec(mp_prec_t prec)\r\n{ \r\n    mpfr_set_default_prec(prec); \r\n}\r\n\r\ninline void mpreal::set_default_rnd(mp_rnd_t rnd_mode)\r\n{ \r\n    mpfr_set_default_rounding_mode(rnd_mode); \r\n}\r\n\r\ninline bool mpreal::fits_in_bits(double x, int n)\r\n{   \r\n    int i;\r\n    double t;\r\n    return IsInf(x) || (std::modf ( std::ldexp ( std::frexp ( x, &i ), n ), &t ) == 0.0);\r\n}\r\n\r\ninline const mpreal pow(const mpreal& a, const mpreal& b, mp_rnd_t rnd_mode = mpreal::get_default_rnd())\r\n{\r\n    mpreal x(a);\r\n    mpfr_pow(x.mp,x.mp,b.mp,rnd_mode);\r\n    return x;\r\n}\r\n\r\ninline const mpreal pow(const mpreal& a, const mpz_t b, mp_rnd_t rnd_mode = mpreal::get_default_rnd())\r\n{\r\n    mpreal x(a);\r\n    mpfr_pow_z(x.mp,x.mp,b,rnd_mode);\r\n    return x;\r\n}\r\n\r\ninline const mpreal pow(const mpreal& a, const unsigned long int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd())\r\n{\r\n    mpreal x(a);\r\n    mpfr_pow_ui(x.mp,x.mp,b,rnd_mode);\r\n    return x;\r\n}\r\n\r\ninline const mpreal pow(const mpreal& a, const unsigned int b, mp_rnd_t rnd_mode)\r\n{\r\n    return pow(a,static_cast<unsigned long int>(b),rnd_mode);\r\n}\r\n\r\ninline const mpreal pow(const mpreal& a, const long int b, mp_rnd_t rnd_mode = mpreal::get_default_rnd())\r\n{\r\n    mpreal x(a);\r\n    mpfr_pow_si(x.mp,x.mp,b,rnd_mode);\r\n    return x;\r\n}\r\n\r\ninline const mpreal pow(const mpreal& a, const int b, mp_rnd_t rnd_mode)\r\n{\r\n    return pow(a,static_cast<long int>(b),rnd_mode);\r\n}\r\n\r\ninline const mpreal pow(const mpreal& a, const long double b, mp_rnd_t rnd_mode)\r\n{\r\n    return pow(a,mpreal(b),rnd_mode);\r\n}\r\n\r\ninline const mpreal pow(const mpreal& a, const double b, mp_rnd_t rnd_mode)\r\n{\r\n    return pow(a,mpreal(b),rnd_mode);\r\n}\r\n\r\ninline const mpreal pow(const unsigned long int a, const mpreal& b, mp_rnd_t rnd_mode = mpreal::get_default_rnd())\r\n{\r\n    mpreal x(a);\r\n    mpfr_ui_pow(x.mp,a,b.mp,rnd_mode);\r\n    return x;\r\n}\r\n\r\ninline const mpreal pow(const unsigned int a, const mpreal& b, mp_rnd_t rnd_mode)\r\n{\r\n    return pow(static_cast<unsigned long int>(a),b,rnd_mode);\r\n}\r\n\r\ninline const mpreal pow(const long int a, const mpreal& b, mp_rnd_t rnd_mode)\r\n{\r\n    if (a>=0)     return pow(static_cast<unsigned long int>(a),b,rnd_mode);\r\n    else          return pow(mpreal(a),b,rnd_mode);\r\n}\r\n\r\ninline const mpreal pow(const int a, const mpreal& b, mp_rnd_t rnd_mode)\r\n{\r\n    if (a>=0)     return pow(static_cast<unsigned long int>(a),b,rnd_mode);\r\n    else          return pow(mpreal(a),b,rnd_mode);\r\n}\r\n\r\ninline const mpreal pow(const long double a, const mpreal& b, mp_rnd_t rnd_mode)\r\n{\r\n    return pow(mpreal(a),b,rnd_mode);\r\n}\r\n\r\ninline const mpreal pow(const double a, const mpreal& b, mp_rnd_t rnd_mode)\r\n{\r\n    return pow(mpreal(a),b,rnd_mode);\r\n}\r\n\r\n// pow unsigned long int\r\ninline const mpreal pow(const unsigned long int a, const unsigned long int b, mp_rnd_t rnd_mode)\r\n{\r\n    mpreal x(a);\r\n    mpfr_ui_pow_ui(x.mp,a,b,rnd_mode);\r\n    return x;\r\n}\r\n\r\ninline const mpreal pow(const unsigned long int a, const unsigned int b, mp_rnd_t rnd_mode)\r\n{\r\n    return pow(a,static_cast<unsigned long int>(b),rnd_mode); //mpfr_ui_pow_ui\r\n}\r\n\r\ninline const mpreal pow(const unsigned long int a, const long int b, mp_rnd_t rnd_mode)\r\n{\r\n    if(b>0)    return pow(a,static_cast<unsigned long int>(b),rnd_mode); //mpfr_ui_pow_ui\r\n    else       return pow(a,mpreal(b),rnd_mode); //mpfr_ui_pow\r\n}\r\n\r\ninline const mpreal pow(const unsigned long int a, const int b, mp_rnd_t rnd_mode)\r\n{\r\n    if(b>0)    return pow(a,static_cast<unsigned long int>(b),rnd_mode); //mpfr_ui_pow_ui\r\n    else       return pow(a,mpreal(b),rnd_mode); //mpfr_ui_pow\r\n}\r\n\r\ninline const mpreal pow(const unsigned long int a, const long double b, mp_rnd_t rnd_mode)\r\n{\r\n    return pow(a,mpreal(b),rnd_mode); //mpfr_ui_pow\r\n}\r\n\r\ninline const mpreal pow(const unsigned long int a, const double b, mp_rnd_t rnd_mode)\r\n{\r\n    return pow(a,mpreal(b),rnd_mode); //mpfr_ui_pow\r\n}\r\n\r\n// pow unsigned int\r\ninline const mpreal pow(const unsigned int a, const unsigned long int b, mp_rnd_t rnd_mode)\r\n{\r\n    return pow(static_cast<unsigned long int>(a),b,rnd_mode); //mpfr_ui_pow_ui\r\n}\r\n\r\ninline const mpreal pow(const unsigned int a, const unsigned int b, mp_rnd_t rnd_mode)\r\n{\r\n    return pow(static_cast<unsigned long int>(a),static_cast<unsigned long int>(b),rnd_mode); //mpfr_ui_pow_ui\r\n}\r\n\r\ninline const mpreal pow(const unsigned int a, const long int b, mp_rnd_t rnd_mode)\r\n{\r\n    if(b>0) return pow(static_cast<unsigned long int>(a),static_cast<unsigned long int>(b),rnd_mode); //mpfr_ui_pow_ui\r\n    else    return pow(static_cast<unsigned long int>(a),mpreal(b),rnd_mode); //mpfr_ui_pow\r\n}\r\n\r\ninline const mpreal pow(const unsigned int a, const int b, mp_rnd_t rnd_mode)\r\n{\r\n    if(b>0) return pow(static_cast<unsigned long int>(a),static_cast<unsigned long int>(b),rnd_mode); //mpfr_ui_pow_ui\r\n    else    return pow(static_cast<unsigned long int>(a),mpreal(b),rnd_mode); //mpfr_ui_pow\r\n}\r\n\r\ninline const mpreal pow(const unsigned int a, const long double b, mp_rnd_t rnd_mode)\r\n{\r\n    return pow(static_cast<unsigned long int>(a),mpreal(b),rnd_mode); //mpfr_ui_pow\r\n}\r\n\r\ninline const mpreal pow(const unsigned int a, const double b, mp_rnd_t rnd_mode)\r\n{\r\n    return pow(static_cast<unsigned long int>(a),mpreal(b),rnd_mode); //mpfr_ui_pow\r\n}\r\n\r\n// pow long int\r\ninline const mpreal pow(const long int a, const unsigned long int b, mp_rnd_t rnd_mode)\r\n{\r\n    if (a>0) return pow(static_cast<unsigned long int>(a),b,rnd_mode); //mpfr_ui_pow_ui\r\n    else     return pow(mpreal(a),b,rnd_mode); //mpfr_pow_ui\r\n}\r\n\r\ninline const mpreal pow(const long int a, const unsigned int b, mp_rnd_t rnd_mode)\r\n{\r\n    if (a>0) return pow(static_cast<unsigned long int>(a),static_cast<unsigned long int>(b),rnd_mode);  //mpfr_ui_pow_ui\r\n    else     return pow(mpreal(a),static_cast<unsigned long int>(b),rnd_mode); //mpfr_pow_ui\r\n}\r\n\r\ninline const mpreal pow(const long int a, const long int b, mp_rnd_t rnd_mode)\r\n{\r\n    if (a>0)\r\n    {\r\n        if(b>0) return pow(static_cast<unsigned long int>(a),static_cast<unsigned long int>(b),rnd_mode); //mpfr_ui_pow_ui\r\n        else    return pow(static_cast<unsigned long int>(a),mpreal(b),rnd_mode); //mpfr_ui_pow\r\n    }else{\r\n        return pow(mpreal(a),b,rnd_mode); // mpfr_pow_si\r\n    }\r\n}\r\n\r\ninline const mpreal pow(const long int a, const int b, mp_rnd_t rnd_mode)\r\n{\r\n    if (a>0)\r\n    {\r\n        if(b>0) return pow(static_cast<unsigned long int>(a),static_cast<unsigned long int>(b),rnd_mode); //mpfr_ui_pow_ui\r\n        else    return pow(static_cast<unsigned long int>(a),mpreal(b),rnd_mode); //mpfr_ui_pow\r\n    }else{\r\n        return pow(mpreal(a),static_cast<long int>(b),rnd_mode); // mpfr_pow_si\r\n    }\r\n}\r\n\r\ninline const mpreal pow(const long int a, const long double b, mp_rnd_t rnd_mode)\r\n{\r\n    if (a>=0)   return pow(static_cast<unsigned long int>(a),mpreal(b),rnd_mode); //mpfr_ui_pow\r\n    else        return pow(mpreal(a),mpreal(b),rnd_mode); //mpfr_pow\r\n}\r\n\r\ninline const mpreal pow(const long int a, const double b, mp_rnd_t rnd_mode)\r\n{\r\n    if (a>=0)   return pow(static_cast<unsigned long int>(a),mpreal(b),rnd_mode); //mpfr_ui_pow\r\n    else        return pow(mpreal(a),mpreal(b),rnd_mode); //mpfr_pow\r\n}\r\n\r\n// pow int\r\ninline const mpreal pow(const int a, const unsigned long int b, mp_rnd_t rnd_mode)\r\n{\r\n    if (a>0) return pow(static_cast<unsigned long int>(a),b,rnd_mode); //mpfr_ui_pow_ui\r\n    else     return pow(mpreal(a),b,rnd_mode); //mpfr_pow_ui\r\n}\r\n\r\ninline const mpreal pow(const int a, const unsigned int b, mp_rnd_t rnd_mode)\r\n{\r\n    if (a>0) return pow(static_cast<unsigned long int>(a),static_cast<unsigned long int>(b),rnd_mode);  //mpfr_ui_pow_ui\r\n    else     return pow(mpreal(a),static_cast<unsigned long int>(b),rnd_mode); //mpfr_pow_ui\r\n}\r\n\r\ninline const mpreal pow(const int a, const long int b, mp_rnd_t rnd_mode)\r\n{\r\n    if (a>0)\r\n    {\r\n        if(b>0) return pow(static_cast<unsigned long int>(a),static_cast<unsigned long int>(b),rnd_mode); //mpfr_ui_pow_ui\r\n        else    return pow(static_cast<unsigned long int>(a),mpreal(b),rnd_mode); //mpfr_ui_pow\r\n    }else{\r\n        return pow(mpreal(a),b,rnd_mode); // mpfr_pow_si\r\n    }\r\n}\r\n\r\ninline const mpreal pow(const int a, const int b, mp_rnd_t rnd_mode)\r\n{\r\n    if (a>0)\r\n    {\r\n        if(b>0) return pow(static_cast<unsigned long int>(a),static_cast<unsigned long int>(b),rnd_mode); //mpfr_ui_pow_ui\r\n        else    return pow(static_cast<unsigned long int>(a),mpreal(b),rnd_mode); //mpfr_ui_pow\r\n    }else{\r\n        return pow(mpreal(a),static_cast<long int>(b),rnd_mode); // mpfr_pow_si\r\n    }\r\n}\r\n\r\ninline const mpreal pow(const int a, const long double b, mp_rnd_t rnd_mode)\r\n{\r\n    if (a>=0)   return pow(static_cast<unsigned long int>(a),mpreal(b),rnd_mode); //mpfr_ui_pow\r\n    else        return pow(mpreal(a),mpreal(b),rnd_mode); //mpfr_pow\r\n}\r\n\r\ninline const mpreal pow(const int a, const double b, mp_rnd_t rnd_mode)\r\n{\r\n    if (a>=0)   return pow(static_cast<unsigned long int>(a),mpreal(b),rnd_mode); //mpfr_ui_pow\r\n    else        return pow(mpreal(a),mpreal(b),rnd_mode); //mpfr_pow\r\n}\r\n\r\n// pow long double \r\ninline const mpreal pow(const long double a, const long double b, mp_rnd_t rnd_mode)\r\n{\r\n    return pow(mpreal(a),mpreal(b),rnd_mode);\r\n}\r\n\r\ninline const mpreal pow(const long double a, const unsigned long int b, mp_rnd_t rnd_mode)\r\n{\r\n    return pow(mpreal(a),b,rnd_mode); //mpfr_pow_ui\r\n}\r\n\r\ninline const mpreal pow(const long double a, const unsigned int b, mp_rnd_t rnd_mode)\r\n{\r\n    return pow(mpreal(a),static_cast<unsigned long int>(b),rnd_mode); //mpfr_pow_ui\r\n}\r\n\r\ninline const mpreal pow(const long double a, const long int b, mp_rnd_t rnd_mode)\r\n{\r\n    return pow(mpreal(a),b,rnd_mode); // mpfr_pow_si\r\n}\r\n\r\ninline const mpreal pow(const long double a, const int b, mp_rnd_t rnd_mode)\r\n{\r\n    return pow(mpreal(a),static_cast<long int>(b),rnd_mode); // mpfr_pow_si\r\n}\r\n\r\ninline const mpreal pow(const double a, const double b, mp_rnd_t rnd_mode)\r\n{\r\n    return pow(mpreal(a),mpreal(b),rnd_mode);\r\n}\r\n\r\ninline const mpreal pow(const double a, const unsigned long int b, mp_rnd_t rnd_mode)\r\n{\r\n    return pow(mpreal(a),b,rnd_mode); // mpfr_pow_ui\r\n}\r\n\r\ninline const mpreal pow(const double a, const unsigned int b, mp_rnd_t rnd_mode)\r\n{\r\n    return pow(mpreal(a),static_cast<unsigned long int>(b),rnd_mode); // mpfr_pow_ui\r\n}\r\n\r\ninline const mpreal pow(const double a, const long int b, mp_rnd_t rnd_mode)\r\n{\r\n    return pow(mpreal(a),b,rnd_mode); // mpfr_pow_si\r\n}\r\n\r\ninline const mpreal pow(const double a, const int b, mp_rnd_t rnd_mode)\r\n{\r\n    return pow(mpreal(a),static_cast<long int>(b),rnd_mode); // mpfr_pow_si\r\n}\r\n} // End of mpfr namespace\r\n\r\n// Explicit specialization of std::swap for mpreal numbers\r\n// Thus standard algorithms will use efficient version of swap (due to Koenig lookup)\r\n// Non-throwing swap C++ idiom: http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Non-throwing_swap\r\nnamespace std\r\n{\r\n  // we are allowed to extend namespace std with specializations only\r\n    template <>\r\n    inline void swap(mpfr::mpreal& x, mpfr::mpreal& y) \r\n    { \r\n        return mpfr::swap(x, y); \r\n    }\r\n\r\n    template<>\r\n    class numeric_limits<mpfr::mpreal>\r\n    {\r\n    public:\r\n        static const bool is_specialized    = true;\r\n        static const bool is_signed         = true;\r\n        static const bool is_integer        = false;\r\n        static const bool is_exact          = false;\r\n        static const int  radix             = 2;    \r\n\r\n        static const bool has_infinity      = true;\r\n        static const bool has_quiet_NaN     = true;\r\n        static const bool has_signaling_NaN = true;\r\n\r\n        static const bool is_iec559         = true;        // = IEEE 754\r\n        static const bool is_bounded        = true;\r\n        static const bool is_modulo         = false;\r\n        static const bool traps             = true;\r\n        static const bool tinyness_before   = true;\r\n\r\n        static const float_denorm_style has_denorm  = denorm_absent;\r\n\r\n        inline static mpfr::mpreal (min)    (mp_prec_t precision = mpfr::mpreal::get_default_prec()) {  return  mpfr::minval(precision);  }\r\n        inline static mpfr::mpreal (max)    (mp_prec_t precision = mpfr::mpreal::get_default_prec()) {  return  mpfr::maxval(precision);  }\r\n        inline static mpfr::mpreal lowest   (mp_prec_t precision = mpfr::mpreal::get_default_prec()) {  return -mpfr::maxval(precision);  }\r\n\r\n        // Returns smallest eps such that 1 + eps != 1 (classic machine epsilon)\r\n        inline static mpfr::mpreal epsilon(mp_prec_t precision = mpfr::mpreal::get_default_prec()) {  return  mpfr::machine_epsilon(precision); }\r\n    \r\n        // Returns smallest eps such that x + eps != x (relative machine epsilon)\r\n        inline static mpfr::mpreal epsilon(const mpfr::mpreal& x) {  return mpfr::machine_epsilon(x);  }\r\n\r\n        inline static mpfr::mpreal round_error(mp_prec_t precision = mpfr::mpreal::get_default_prec())\r\n        {\r\n            mp_rnd_t r = mpfr::mpreal::get_default_rnd();\r\n\r\n            if(r == GMP_RNDN)  return mpfr::mpreal(0.5, precision); \r\n            else               return mpfr::mpreal(1.0, precision);    \r\n        }\r\n\r\n        inline static const mpfr::mpreal infinity()         { return mpfr::const_infinity();     }\r\n        inline static const mpfr::mpreal quiet_NaN()        { return mpfr::mpreal().setNan();    }\r\n        inline static const mpfr::mpreal signaling_NaN()    { return mpfr::mpreal().setNan();    }\r\n        inline static const mpfr::mpreal denorm_min()       { return (min)();                    }\r\n\r\n        // Please note, exponent range is not fixed in MPFR\r\n        static const int min_exponent = MPFR_EMIN_DEFAULT;\r\n        static const int max_exponent = MPFR_EMAX_DEFAULT;\r\n        MPREAL_PERMISSIVE_EXPR static const int min_exponent10 = (int) (MPFR_EMIN_DEFAULT * 0.3010299956639811); \r\n        MPREAL_PERMISSIVE_EXPR static const int max_exponent10 = (int) (MPFR_EMAX_DEFAULT * 0.3010299956639811); \r\n\r\n#ifdef MPREAL_HAVE_DYNAMIC_STD_NUMERIC_LIMITS\r\n\r\n        // Following members should be constant according to standard, but they can be variable in MPFR\r\n        // So we define them as functions here. \r\n        //\r\n        // This is preferable way for std::numeric_limits<mpfr::mpreal> specialization.\r\n        // But it is incompatible with standard std::numeric_limits and might not work with other libraries, e.g. boost. \r\n        // See below for compatible implementation. \r\n        inline static float_round_style round_style()\r\n        {\r\n            mp_rnd_t r = mpfr::mpreal::get_default_rnd();\r\n\r\n            switch (r)\r\n            {\r\n            case GMP_RNDN: return round_to_nearest;\r\n            case GMP_RNDZ: return round_toward_zero; \r\n            case GMP_RNDU: return round_toward_infinity; \r\n            case GMP_RNDD: return round_toward_neg_infinity; \r\n            default: return round_indeterminate;\r\n            }\r\n        }\r\n\r\n        inline static int digits()                        {    return int(mpfr::mpreal::get_default_prec());    }\r\n        inline static int digits(const mpfr::mpreal& x)   {    return x.getPrecision();                         }\r\n\r\n        inline static int digits10(mp_prec_t precision = mpfr::mpreal::get_default_prec())\r\n        {\r\n            return mpfr::bits2digits(precision);\r\n        }\r\n\r\n        inline static int digits10(const mpfr::mpreal& x)\r\n        {\r\n            return mpfr::bits2digits(x.getPrecision());\r\n        }\r\n\r\n        inline static int max_digits10(mp_prec_t precision = mpfr::mpreal::get_default_prec())\r\n        {\r\n            return digits10(precision);\r\n        }\r\n#else\r\n        // Digits and round_style are NOT constants when it comes to mpreal.\r\n        // If possible, please use functions digits() and round_style() defined above.\r\n        //\r\n        // These (default) values are preserved for compatibility with existing libraries, e.g. boost.\r\n        // Change them accordingly to your application. \r\n        //\r\n        // For example, if you use 256 bits of precision uniformly in your program, then:\r\n        // digits       = 256\r\n        // digits10     = 77 \r\n        // max_digits10 = 78\r\n        // \r\n        // Approximate formula for decimal digits is: digits10 = floor(log10(2) * digits). See bits2digits() for more details.\r\n\r\n        static const std::float_round_style round_style = round_to_nearest;\r\n        static const int digits       = 53;\r\n        static const int digits10     = 15;\r\n        static const int max_digits10 = 16;\r\n#endif\r\n    };\r\n\r\n}\r\n\r\n#endif /* __MPREAL_H__ */\r\n"
  },
  {
    "path": "libs/eigen/unsupported/test/mpreal_support.cpp",
    "content": "#include \"main.h\"\n#include <Eigen/MPRealSupport>\n#include <Eigen/LU>\n#include <Eigen/Eigenvalues>\n#include <sstream>\n\nusing namespace mpfr;\nusing namespace Eigen;\n\nvoid test_mpreal_support()\n{\n  // set precision to 256 bits (double has only 53 bits)\n  mpreal::set_default_prec(256);\n  typedef Matrix<mpreal,Eigen::Dynamic,Eigen::Dynamic> MatrixXmp;\n\n  std::cerr << \"epsilon =         \" << NumTraits<mpreal>::epsilon() << \"\\n\";\n  std::cerr << \"dummy_precision = \" << NumTraits<mpreal>::dummy_precision() << \"\\n\";\n  std::cerr << \"highest =         \" << NumTraits<mpreal>::highest() << \"\\n\";\n  std::cerr << \"lowest =          \" << NumTraits<mpreal>::lowest() << \"\\n\";\n\n  for(int i = 0; i < g_repeat; i++) {\n    int s = Eigen::internal::random<int>(1,100);\n    MatrixXmp A = MatrixXmp::Random(s,s);\n    MatrixXmp B = MatrixXmp::Random(s,s);\n    MatrixXmp S = A.adjoint() * A;\n    MatrixXmp X;\n    \n    // Basic stuffs\n    VERIFY_IS_APPROX(A.real(), A);\n    VERIFY(Eigen::internal::isApprox(A.array().abs2().sum(), A.squaredNorm()));\n    VERIFY_IS_APPROX(A.array().exp(),         exp(A.array()));\n    VERIFY_IS_APPROX(A.array().abs2().sqrt(), A.array().abs());\n    VERIFY_IS_APPROX(A.array().sin(),         sin(A.array()));\n    VERIFY_IS_APPROX(A.array().cos(),         cos(A.array()));\n    \n\n    // Cholesky\n    X = S.selfadjointView<Lower>().llt().solve(B);\n    VERIFY_IS_APPROX((S.selfadjointView<Lower>()*X).eval(),B);\n\n    // partial LU\n    X = A.lu().solve(B);\n    VERIFY_IS_APPROX((A*X).eval(),B);\n\n    // symmetric eigenvalues\n    SelfAdjointEigenSolver<MatrixXmp> eig(S);\n    VERIFY_IS_EQUAL(eig.info(), Success);\n    VERIFY( (S.selfadjointView<Lower>() * eig.eigenvectors()).isApprox(eig.eigenvectors() * eig.eigenvalues().asDiagonal(), NumTraits<mpreal>::dummy_precision()*1e3) );\n  }\n  \n  {\n    MatrixXmp A(8,3); A.setRandom();\n    // test output (interesting things happen in this code)\n    std::stringstream stream;\n    stream << A;\n  }\n}\n"
  },
  {
    "path": "libs/eigen/unsupported/test/openglsupport.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2010 Gael Guennebaud <gael.guennebaud@inria.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include <main.h>\n#include <iostream>\n#include <GL/glew.h>\n#include <Eigen/OpenGLSupport>\n#include <GL/glut.h>\nusing namespace Eigen;\n\n\n\n\n#define VERIFY_MATRIX(CODE,REF) { \\\n    glLoadIdentity(); \\\n    CODE; \\\n    Matrix<float,4,4,ColMajor> m; m.setZero(); \\\n    glGet(GL_MODELVIEW_MATRIX, m); \\\n    if(!(REF).cast<float>().isApprox(m)) { \\\n      std::cerr << \"Expected:\\n\" << ((REF).cast<float>()) << \"\\n\" << \"got\\n\" << m << \"\\n\\n\"; \\\n    } \\\n    VERIFY_IS_APPROX((REF).cast<float>(), m); \\\n  }\n\n#define VERIFY_UNIFORM(SUFFIX,NAME,TYPE) { \\\n    TYPE value; value.setRandom(); \\\n    TYPE data; \\\n    int loc = glGetUniformLocation(prg_id, #NAME); \\\n    VERIFY((loc!=-1) && \"uniform not found\"); \\\n    glUniform(loc,value); \\\n    EIGEN_CAT(glGetUniform,SUFFIX)(prg_id,loc,data.data()); \\\n    if(!value.isApprox(data)) { \\\n      std::cerr << \"Expected:\\n\" << value << \"\\n\" << \"got\\n\" << data << \"\\n\\n\"; \\\n    } \\\n    VERIFY_IS_APPROX(value, data); \\\n  }\n  \n#define VERIFY_UNIFORMi(NAME,TYPE) { \\\n    TYPE value = TYPE::Random().eval().cast<float>().cast<TYPE::Scalar>(); \\\n    TYPE data; \\\n    int loc = glGetUniformLocation(prg_id, #NAME); \\\n    VERIFY((loc!=-1) && \"uniform not found\"); \\\n    glUniform(loc,value); \\\n    glGetUniformiv(prg_id,loc,(GLint*)data.data()); \\\n    if(!value.isApprox(data)) { \\\n      std::cerr << \"Expected:\\n\" << value << \"\\n\" << \"got\\n\" << data << \"\\n\\n\"; \\\n    } \\\n    VERIFY_IS_APPROX(value, data); \\\n  }\n  \nvoid printInfoLog(GLuint objectID)\n{\n    int infologLength, charsWritten;\n    GLchar *infoLog;\n    glGetProgramiv(objectID,GL_INFO_LOG_LENGTH, &infologLength);\n    if(infologLength > 0)\n    {\n        infoLog = new GLchar[infologLength];\n        glGetProgramInfoLog(objectID, infologLength, &charsWritten, infoLog);\n        if (charsWritten>0)\n          std::cerr << \"Shader info : \\n\" << infoLog << std::endl;\n        delete[] infoLog;\n    }\n}\n\nGLint createShader(const char* vtx, const char* frg)\n{\n  GLint prg_id = glCreateProgram();\n  GLint vtx_id = glCreateShader(GL_VERTEX_SHADER);\n  GLint frg_id = glCreateShader(GL_FRAGMENT_SHADER);\n  GLint ok;\n  \n  glShaderSource(vtx_id, 1, &vtx, 0);\n  glCompileShader(vtx_id);\n  glGetShaderiv(vtx_id,GL_COMPILE_STATUS,&ok);\n  if(!ok)\n  {\n    std::cerr << \"vtx compilation failed\\n\";\n  }\n  \n  glShaderSource(frg_id, 1, &frg, 0);\n  glCompileShader(frg_id);\n  glGetShaderiv(frg_id,GL_COMPILE_STATUS,&ok);\n  if(!ok)\n  {\n    std::cerr << \"frg compilation failed\\n\";\n  }\n  \n  glAttachShader(prg_id, vtx_id);\n  glAttachShader(prg_id, frg_id);\n  glLinkProgram(prg_id);\n  glGetProgramiv(prg_id,GL_LINK_STATUS,&ok);\n  if(!ok)\n  {\n    std::cerr << \"linking failed\\n\";\n  }\n  printInfoLog(prg_id);\n  \n  glUseProgram(prg_id);\n  return prg_id;\n}\n\nvoid test_openglsupport()\n{\n  int argc = 0;\n  glutInit(&argc, 0);\n  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);\n  glutInitWindowPosition (0,0);\n  glutInitWindowSize(10, 10);\n\n  if(glutCreateWindow(\"Eigen\") <= 0)\n  {\n    std::cerr << \"Error: Unable to create GLUT Window.\\n\";\n    exit(1);\n  }\n  \n  glewExperimental = GL_TRUE;\n  if(glewInit() != GLEW_OK)\n  {\n    std::cerr << \"Warning: Failed to initialize GLEW\\n\";\n  }\n\n  Vector3f v3f;\n  Matrix3f rot;\n  glBegin(GL_POINTS);\n  \n  glVertex(v3f);\n  glVertex(2*v3f+v3f);\n  glVertex(rot*v3f);\n  \n  glEnd();\n  \n  // 4x4 matrices\n  Matrix4f mf44; mf44.setRandom();\n  VERIFY_MATRIX(glLoadMatrix(mf44), mf44);\n  VERIFY_MATRIX(glMultMatrix(mf44), mf44);\n  Matrix4d md44; md44.setRandom();\n  VERIFY_MATRIX(glLoadMatrix(md44), md44);\n  VERIFY_MATRIX(glMultMatrix(md44), md44);\n  \n  // Quaternion\n  Quaterniond qd(AngleAxisd(internal::random<double>(), Vector3d::Random()));\n  VERIFY_MATRIX(glRotate(qd), Projective3d(qd).matrix());\n  \n  Quaternionf qf(AngleAxisf(internal::random<double>(), Vector3f::Random()));\n  VERIFY_MATRIX(glRotate(qf), Projective3f(qf).matrix());\n  \n  // 3D Transform\n  Transform<float,3,AffineCompact> acf3; acf3.matrix().setRandom();\n  VERIFY_MATRIX(glLoadMatrix(acf3), Projective3f(acf3).matrix());\n  VERIFY_MATRIX(glMultMatrix(acf3), Projective3f(acf3).matrix());\n  \n  Transform<float,3,Affine> af3(acf3);\n  VERIFY_MATRIX(glLoadMatrix(af3), Projective3f(af3).matrix());\n  VERIFY_MATRIX(glMultMatrix(af3), Projective3f(af3).matrix());\n  \n  Transform<float,3,Projective> pf3; pf3.matrix().setRandom();\n  VERIFY_MATRIX(glLoadMatrix(pf3), Projective3f(pf3).matrix());\n  VERIFY_MATRIX(glMultMatrix(pf3), Projective3f(pf3).matrix());\n  \n  Transform<double,3,AffineCompact> acd3; acd3.matrix().setRandom();\n  VERIFY_MATRIX(glLoadMatrix(acd3), Projective3d(acd3).matrix());\n  VERIFY_MATRIX(glMultMatrix(acd3), Projective3d(acd3).matrix());\n  \n  Transform<double,3,Affine> ad3(acd3);\n  VERIFY_MATRIX(glLoadMatrix(ad3), Projective3d(ad3).matrix());\n  VERIFY_MATRIX(glMultMatrix(ad3), Projective3d(ad3).matrix());\n  \n  Transform<double,3,Projective> pd3; pd3.matrix().setRandom();\n  VERIFY_MATRIX(glLoadMatrix(pd3), Projective3d(pd3).matrix());\n  VERIFY_MATRIX(glMultMatrix(pd3), Projective3d(pd3).matrix());\n  \n  // translations (2D and 3D)\n  {\n    Vector2f vf2; vf2.setRandom(); Vector3f vf23; vf23 << vf2, 0;\n    VERIFY_MATRIX(glTranslate(vf2), Projective3f(Translation3f(vf23)).matrix());\n    Vector2d vd2; vd2.setRandom(); Vector3d vd23; vd23 << vd2, 0;\n    VERIFY_MATRIX(glTranslate(vd2), Projective3d(Translation3d(vd23)).matrix());\n    \n    Vector3f vf3; vf3.setRandom();\n    VERIFY_MATRIX(glTranslate(vf3), Projective3f(Translation3f(vf3)).matrix());\n    Vector3d vd3; vd3.setRandom();\n    VERIFY_MATRIX(glTranslate(vd3), Projective3d(Translation3d(vd3)).matrix());\n    \n    Translation<float,3> tf3; tf3.vector().setRandom();\n    VERIFY_MATRIX(glTranslate(tf3), Projective3f(tf3).matrix());\n    \n    Translation<double,3> td3;  td3.vector().setRandom();\n    VERIFY_MATRIX(glTranslate(td3), Projective3d(td3).matrix());\n  }\n  \n  // scaling (2D and 3D)\n  {\n    Vector2f vf2; vf2.setRandom(); Vector3f vf23; vf23 << vf2, 1;\n    VERIFY_MATRIX(glScale(vf2), Projective3f(Scaling(vf23)).matrix());\n    Vector2d vd2; vd2.setRandom(); Vector3d vd23; vd23 << vd2, 1;\n    VERIFY_MATRIX(glScale(vd2), Projective3d(Scaling(vd23)).matrix());\n    \n    Vector3f vf3; vf3.setRandom();\n    VERIFY_MATRIX(glScale(vf3), Projective3f(Scaling(vf3)).matrix());\n    Vector3d vd3; vd3.setRandom();\n    VERIFY_MATRIX(glScale(vd3), Projective3d(Scaling(vd3)).matrix());\n    \n    UniformScaling<float> usf(internal::random<float>());\n    VERIFY_MATRIX(glScale(usf), Projective3f(usf).matrix());\n    \n    UniformScaling<double> usd(internal::random<double>());\n    VERIFY_MATRIX(glScale(usd), Projective3d(usd).matrix());\n  }\n  \n  // uniform\n  {\n    const char* vtx = \"void main(void) { gl_Position = gl_Vertex; }\\n\";\n    \n    if(GLEW_VERSION_2_0)\n    {\n      #ifdef GL_VERSION_2_0\n      const char* frg = \"\"\n        \"uniform vec2 v2f;\\n\"\n        \"uniform vec3 v3f;\\n\"\n        \"uniform vec4 v4f;\\n\"\n        \"uniform ivec2 v2i;\\n\"\n        \"uniform ivec3 v3i;\\n\"\n        \"uniform ivec4 v4i;\\n\"\n        \"uniform mat2 m2f;\\n\"\n        \"uniform mat3 m3f;\\n\"\n        \"uniform mat4 m4f;\\n\"\n        \"void main(void) { gl_FragColor = vec4(v2f[0]+v3f[0]+v4f[0])+vec4(v2i[0]+v3i[0]+v4i[0])+vec4(m2f[0][0]+m3f[0][0]+m4f[0][0]); }\\n\";\n        \n      GLint prg_id = createShader(vtx,frg);\n      \n      VERIFY_UNIFORM(fv,v2f, Vector2f);\n      VERIFY_UNIFORM(fv,v3f, Vector3f);\n      VERIFY_UNIFORM(fv,v4f, Vector4f);\n      VERIFY_UNIFORMi(v2i, Vector2i);\n      VERIFY_UNIFORMi(v3i, Vector3i);\n      VERIFY_UNIFORMi(v4i, Vector4i);\n      VERIFY_UNIFORM(fv,m2f, Matrix2f);\n      VERIFY_UNIFORM(fv,m3f, Matrix3f);\n      VERIFY_UNIFORM(fv,m4f, Matrix4f);\n      #endif\n    }\n    else\n      std::cerr << \"Warning: opengl 2.0 was not tested\\n\";\n    \n    if(GLEW_VERSION_2_1)\n    {\n      #ifdef GL_VERSION_2_1\n      const char* frg = \"#version 120\\n\"\n        \"uniform mat2x3 m23f;\\n\"\n        \"uniform mat3x2 m32f;\\n\"\n        \"uniform mat2x4 m24f;\\n\"\n        \"uniform mat4x2 m42f;\\n\"\n        \"uniform mat3x4 m34f;\\n\"\n        \"uniform mat4x3 m43f;\\n\"\n        \"void main(void) { gl_FragColor = vec4(m23f[0][0]+m32f[0][0]+m24f[0][0]+m42f[0][0]+m34f[0][0]+m43f[0][0]); }\\n\";\n        \n      GLint prg_id = createShader(vtx,frg);\n      \n      typedef Matrix<float,2,3> Matrix23f;\n      typedef Matrix<float,3,2> Matrix32f;\n      typedef Matrix<float,2,4> Matrix24f;\n      typedef Matrix<float,4,2> Matrix42f;\n      typedef Matrix<float,3,4> Matrix34f;\n      typedef Matrix<float,4,3> Matrix43f;\n      \n      VERIFY_UNIFORM(fv,m23f, Matrix23f);\n      VERIFY_UNIFORM(fv,m32f, Matrix32f);\n      VERIFY_UNIFORM(fv,m24f, Matrix24f);\n      VERIFY_UNIFORM(fv,m42f, Matrix42f);\n      VERIFY_UNIFORM(fv,m34f, Matrix34f);\n      VERIFY_UNIFORM(fv,m43f, Matrix43f);\n      #endif\n    }\n    else\n      std::cerr << \"Warning: opengl 2.1 was not tested\\n\";\n    \n    if(GLEW_VERSION_3_0)\n    {\n      #ifdef GL_VERSION_3_0\n      const char* frg = \"#version 150\\n\"\n        \"uniform uvec2 v2ui;\\n\"\n        \"uniform uvec3 v3ui;\\n\"\n        \"uniform uvec4 v4ui;\\n\"\n        \"out vec4 data;\\n\"\n        \"void main(void) { data = vec4(v2ui[0]+v3ui[0]+v4ui[0]); }\\n\";\n        \n      GLint prg_id = createShader(vtx,frg);\n      \n      typedef Matrix<unsigned int,2,1> Vector2ui;\n      typedef Matrix<unsigned int,3,1> Vector3ui;\n      typedef Matrix<unsigned int,4,1> Vector4ui;\n      \n      VERIFY_UNIFORMi(v2ui, Vector2ui);\n      VERIFY_UNIFORMi(v3ui, Vector3ui);\n      VERIFY_UNIFORMi(v4ui, Vector4ui);\n      #endif\n    }\n    else\n      std::cerr << \"Warning: opengl 3.0 was not tested\\n\";\n    \n    #ifdef GLEW_ARB_gpu_shader_fp64\n    if(GLEW_ARB_gpu_shader_fp64)\n    {\n      #ifdef GL_ARB_gpu_shader_fp64\n      const char* frg = \"#version 150\\n\"\n        \"uniform dvec2 v2d;\\n\"\n        \"uniform dvec3 v3d;\\n\"\n        \"uniform dvec4 v4d;\\n\"\n        \"out vec4 data;\\n\"\n        \"void main(void) { data = vec4(v2d[0]+v3d[0]+v4d[0]); }\\n\";\n        \n      GLint prg_id = createShader(vtx,frg);\n      \n      typedef Vector2d Vector2d;\n      typedef Vector3d Vector3d;\n      typedef Vector4d Vector4d;\n      \n      VERIFY_UNIFORM(dv,v2d, Vector2d);\n      VERIFY_UNIFORM(dv,v3d, Vector3d);\n      VERIFY_UNIFORM(dv,v4d, Vector4d);\n      #endif\n    }\n    else\n      std::cerr << \"Warning: GLEW_ARB_gpu_shader_fp64 was not tested\\n\";\n    #else\n      std::cerr << \"Warning: GLEW_ARB_gpu_shader_fp64 was not tested\\n\";\n    #endif\n  }\n  \n}\n"
  },
  {
    "path": "libs/eigen/unsupported/test/polynomialsolver.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2010 Manuel Yguel <manuel.yguel@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <unsupported/Eigen/Polynomials>\n#include <iostream>\n#include <algorithm>\n\nusing namespace std;\n\nnamespace Eigen {\nnamespace internal {\ntemplate<int Size>\nstruct increment_if_fixed_size\n{\n  enum {\n    ret = (Size == Dynamic) ? Dynamic : Size+1\n  };\n};\n}\n}\n\n\ntemplate<int Deg, typename POLYNOMIAL, typename SOLVER>\nbool aux_evalSolver( const POLYNOMIAL& pols, SOLVER& psolve )\n{\n  typedef typename POLYNOMIAL::Index Index;\n  typedef typename POLYNOMIAL::Scalar Scalar;\n\n  typedef typename SOLVER::RootsType    RootsType;\n  typedef Matrix<Scalar,Deg,1>          EvalRootsType;\n\n  const Index deg = pols.size()-1;\n\n  psolve.compute( pols );\n  const RootsType& roots( psolve.roots() );\n  EvalRootsType evr( deg );\n  for( int i=0; i<roots.size(); ++i ){\n    evr[i] = std::abs( poly_eval( pols, roots[i] ) ); }\n\n  bool evalToZero = evr.isZero( test_precision<Scalar>() );\n  if( !evalToZero )\n  {\n    cerr << \"WRONG root: \" << endl;\n    cerr << \"Polynomial: \" << pols.transpose() << endl;\n    cerr << \"Roots found: \" << roots.transpose() << endl;\n    cerr << \"Abs value of the polynomial at the roots: \" << evr.transpose() << endl;\n    cerr << endl;\n  }\n\n  std::vector<Scalar> rootModuli( roots.size() );\n  Map< EvalRootsType > aux( &rootModuli[0], roots.size() );\n  aux = roots.array().abs();\n  std::sort( rootModuli.begin(), rootModuli.end() );\n  bool distinctModuli=true;\n  for( size_t i=1; i<rootModuli.size() && distinctModuli; ++i )\n  {\n    if( internal::isApprox( rootModuli[i], rootModuli[i-1] ) ){\n      distinctModuli = false; }\n  }\n  VERIFY( evalToZero || !distinctModuli );\n\n  return distinctModuli;\n}\n\n\n\n\n\n\n\ntemplate<int Deg, typename POLYNOMIAL>\nvoid evalSolver( const POLYNOMIAL& pols )\n{\n  typedef typename POLYNOMIAL::Scalar Scalar;\n\n  typedef PolynomialSolver<Scalar, Deg >              PolynomialSolverType;\n\n  PolynomialSolverType psolve;\n  aux_evalSolver<Deg, POLYNOMIAL, PolynomialSolverType>( pols, psolve );\n}\n\n\n\n\ntemplate< int Deg, typename POLYNOMIAL, typename ROOTS, typename REAL_ROOTS >\nvoid evalSolverSugarFunction( const POLYNOMIAL& pols, const ROOTS& roots, const REAL_ROOTS& real_roots )\n{\n  using std::sqrt;\n  typedef typename POLYNOMIAL::Scalar Scalar;\n\n  typedef PolynomialSolver<Scalar, Deg >              PolynomialSolverType;\n\n  PolynomialSolverType psolve;\n  if( aux_evalSolver<Deg, POLYNOMIAL, PolynomialSolverType>( pols, psolve ) )\n  {\n    //It is supposed that\n    // 1) the roots found are correct\n    // 2) the roots have distinct moduli\n\n    typedef typename REAL_ROOTS::Scalar                 Real;\n\n    //Test realRoots\n    std::vector< Real > calc_realRoots;\n    psolve.realRoots( calc_realRoots );\n    VERIFY( calc_realRoots.size() == (size_t)real_roots.size() );\n\n    const Scalar psPrec = sqrt( test_precision<Scalar>() );\n\n    for( size_t i=0; i<calc_realRoots.size(); ++i )\n    {\n      bool found = false;\n      for( size_t j=0; j<calc_realRoots.size()&& !found; ++j )\n      {\n        if( internal::isApprox( calc_realRoots[i], real_roots[j] ), psPrec ){\n          found = true; }\n      }\n      VERIFY( found );\n    }\n\n    //Test greatestRoot\n    VERIFY( internal::isApprox( roots.array().abs().maxCoeff(),\n          abs( psolve.greatestRoot() ), psPrec ) );\n\n    //Test smallestRoot\n    VERIFY( internal::isApprox( roots.array().abs().minCoeff(),\n          abs( psolve.smallestRoot() ), psPrec ) );\n\n    bool hasRealRoot;\n    //Test absGreatestRealRoot\n    Real r = psolve.absGreatestRealRoot( hasRealRoot );\n    VERIFY( hasRealRoot == (real_roots.size() > 0 ) );\n    if( hasRealRoot ){\n      VERIFY( internal::isApprox( real_roots.array().abs().maxCoeff(), abs(r), psPrec ) );  }\n\n    //Test absSmallestRealRoot\n    r = psolve.absSmallestRealRoot( hasRealRoot );\n    VERIFY( hasRealRoot == (real_roots.size() > 0 ) );\n    if( hasRealRoot ){\n      VERIFY( internal::isApprox( real_roots.array().abs().minCoeff(), abs( r ), psPrec ) ); }\n\n    //Test greatestRealRoot\n    r = psolve.greatestRealRoot( hasRealRoot );\n    VERIFY( hasRealRoot == (real_roots.size() > 0 ) );\n    if( hasRealRoot ){\n      VERIFY( internal::isApprox( real_roots.array().maxCoeff(), r, psPrec ) ); }\n\n    //Test smallestRealRoot\n    r = psolve.smallestRealRoot( hasRealRoot );\n    VERIFY( hasRealRoot == (real_roots.size() > 0 ) );\n    if( hasRealRoot ){\n    VERIFY( internal::isApprox( real_roots.array().minCoeff(), r, psPrec ) ); }\n  }\n}\n\n\ntemplate<typename _Scalar, int _Deg>\nvoid polynomialsolver(int deg)\n{\n  typedef internal::increment_if_fixed_size<_Deg>            Dim;\n  typedef Matrix<_Scalar,Dim::ret,1>                  PolynomialType;\n  typedef Matrix<_Scalar,_Deg,1>                      EvalRootsType;\n\n  cout << \"Standard cases\" << endl;\n  PolynomialType pols = PolynomialType::Random(deg+1);\n  evalSolver<_Deg,PolynomialType>( pols );\n\n  cout << \"Hard cases\" << endl;\n  _Scalar multipleRoot = internal::random<_Scalar>();\n  EvalRootsType allRoots = EvalRootsType::Constant(deg,multipleRoot);\n  roots_to_monicPolynomial( allRoots, pols );\n  evalSolver<_Deg,PolynomialType>( pols );\n\n  cout << \"Test sugar\" << endl;\n  EvalRootsType realRoots = EvalRootsType::Random(deg);\n  roots_to_monicPolynomial( realRoots, pols );\n  evalSolverSugarFunction<_Deg>(\n      pols,\n      realRoots.template cast <\n                    std::complex<\n                         typename NumTraits<_Scalar>::Real\n                         >\n                    >(),\n      realRoots );\n}\n\nvoid test_polynomialsolver()\n{\n  for(int i = 0; i < g_repeat; i++)\n  {\n    CALL_SUBTEST_1( (polynomialsolver<float,1>(1)) );\n    CALL_SUBTEST_2( (polynomialsolver<double,2>(2)) );\n    CALL_SUBTEST_3( (polynomialsolver<double,3>(3)) );\n    CALL_SUBTEST_4( (polynomialsolver<float,4>(4)) );\n    CALL_SUBTEST_5( (polynomialsolver<double,5>(5)) );\n    CALL_SUBTEST_6( (polynomialsolver<float,6>(6)) );\n    CALL_SUBTEST_7( (polynomialsolver<float,7>(7)) );\n    CALL_SUBTEST_8( (polynomialsolver<double,8>(8)) );\n\n    CALL_SUBTEST_9( (polynomialsolver<float,Dynamic>(\n            internal::random<int>(9,13)\n            )) );\n    CALL_SUBTEST_10((polynomialsolver<double,Dynamic>(\n            internal::random<int>(9,13)\n            )) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/unsupported/test/polynomialutils.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2010 Manuel Yguel <manuel.yguel@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n#include <unsupported/Eigen/Polynomials>\n#include <iostream>\n\nusing namespace std;\n\nnamespace Eigen {\nnamespace internal {\ntemplate<int Size>\nstruct increment_if_fixed_size\n{\n  enum {\n    ret = (Size == Dynamic) ? Dynamic : Size+1\n  };\n};\n}\n}\n\ntemplate<typename _Scalar, int _Deg>\nvoid realRoots_to_monicPolynomial_test(int deg)\n{\n  typedef internal::increment_if_fixed_size<_Deg>            Dim;\n  typedef Matrix<_Scalar,Dim::ret,1>                  PolynomialType;\n  typedef Matrix<_Scalar,_Deg,1>                      EvalRootsType;\n\n  PolynomialType pols(deg+1);\n  EvalRootsType roots = EvalRootsType::Random(deg);\n  roots_to_monicPolynomial( roots, pols );\n\n  EvalRootsType evr( deg );\n  for( int i=0; i<roots.size(); ++i ){\n    evr[i] = std::abs( poly_eval( pols, roots[i] ) ); }\n\n  bool evalToZero = evr.isZero( test_precision<_Scalar>() );\n  if( !evalToZero ){\n    cerr << evr.transpose() << endl; }\n  VERIFY( evalToZero );\n}\n\ntemplate<typename _Scalar> void realRoots_to_monicPolynomial_scalar()\n{\n  CALL_SUBTEST_2( (realRoots_to_monicPolynomial_test<_Scalar,2>(2)) );\n  CALL_SUBTEST_3( (realRoots_to_monicPolynomial_test<_Scalar,3>(3)) );\n  CALL_SUBTEST_4( (realRoots_to_monicPolynomial_test<_Scalar,4>(4)) );\n  CALL_SUBTEST_5( (realRoots_to_monicPolynomial_test<_Scalar,5>(5)) );\n  CALL_SUBTEST_6( (realRoots_to_monicPolynomial_test<_Scalar,6>(6)) );\n  CALL_SUBTEST_7( (realRoots_to_monicPolynomial_test<_Scalar,7>(7)) );\n  CALL_SUBTEST_8( (realRoots_to_monicPolynomial_test<_Scalar,17>(17)) );\n\n  CALL_SUBTEST_9( (realRoots_to_monicPolynomial_test<_Scalar,Dynamic>(\n          internal::random<int>(18,26) )) );\n}\n\n\n\n\ntemplate<typename _Scalar, int _Deg>\nvoid CauchyBounds(int deg)\n{\n  typedef internal::increment_if_fixed_size<_Deg>            Dim;\n  typedef Matrix<_Scalar,Dim::ret,1>                  PolynomialType;\n  typedef Matrix<_Scalar,_Deg,1>                      EvalRootsType;\n\n  PolynomialType pols(deg+1);\n  EvalRootsType roots = EvalRootsType::Random(deg);\n  roots_to_monicPolynomial( roots, pols );\n  _Scalar M = cauchy_max_bound( pols );\n  _Scalar m = cauchy_min_bound( pols );\n  _Scalar Max = roots.array().abs().maxCoeff();\n  _Scalar min = roots.array().abs().minCoeff();\n  bool eval = (M >= Max) && (m <= min);\n  if( !eval )\n  {\n    cerr << \"Roots: \" << roots << endl;\n    cerr << \"Bounds: (\" << m << \", \" << M << \")\" << endl;\n    cerr << \"Min,Max: (\" << min << \", \" << Max << \")\" << endl;\n  }\n  VERIFY( eval );\n}\n\ntemplate<typename _Scalar> void CauchyBounds_scalar()\n{\n  CALL_SUBTEST_2( (CauchyBounds<_Scalar,2>(2)) );\n  CALL_SUBTEST_3( (CauchyBounds<_Scalar,3>(3)) );\n  CALL_SUBTEST_4( (CauchyBounds<_Scalar,4>(4)) );\n  CALL_SUBTEST_5( (CauchyBounds<_Scalar,5>(5)) );\n  CALL_SUBTEST_6( (CauchyBounds<_Scalar,6>(6)) );\n  CALL_SUBTEST_7( (CauchyBounds<_Scalar,7>(7)) );\n  CALL_SUBTEST_8( (CauchyBounds<_Scalar,17>(17)) );\n\n  CALL_SUBTEST_9( (CauchyBounds<_Scalar,Dynamic>(\n          internal::random<int>(18,26) )) );\n}\n\nvoid test_polynomialutils()\n{\n  for(int i = 0; i < g_repeat; i++)\n  {\n    realRoots_to_monicPolynomial_scalar<double>();\n    realRoots_to_monicPolynomial_scalar<float>();\n    CauchyBounds_scalar<double>();\n    CauchyBounds_scalar<float>();\n  }\n}\n"
  },
  {
    "path": "libs/eigen/unsupported/test/sparse_extra.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008-2010 Gael Guennebaud <g.gael@free.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n// import basic and product tests for deprectaed DynamicSparseMatrix\n#define EIGEN_NO_DEPRECATED_WARNING\n#include \"sparse_basic.cpp\"\n#include \"sparse_product.cpp\"\n#include <Eigen/SparseExtra>\n\ntemplate<typename SetterType,typename DenseType, typename Scalar, int Options>\nbool test_random_setter(SparseMatrix<Scalar,Options>& sm, const DenseType& ref, const std::vector<Vector2i>& nonzeroCoords)\n{\n  {\n    sm.setZero();\n    SetterType w(sm);\n    std::vector<Vector2i> remaining = nonzeroCoords;\n    while(!remaining.empty())\n    {\n      int i = internal::random<int>(0,static_cast<int>(remaining.size())-1);\n      w(remaining[i].x(),remaining[i].y()) = ref.coeff(remaining[i].x(),remaining[i].y());\n      remaining[i] = remaining.back();\n      remaining.pop_back();\n    }\n  }\n  return sm.isApprox(ref);\n}\n\ntemplate<typename SetterType,typename DenseType, typename T>\nbool test_random_setter(DynamicSparseMatrix<T>& sm, const DenseType& ref, const std::vector<Vector2i>& nonzeroCoords)\n{\n  sm.setZero();\n  std::vector<Vector2i> remaining = nonzeroCoords;\n  while(!remaining.empty())\n  {\n    int i = internal::random<int>(0,static_cast<int>(remaining.size())-1);\n    sm.coeffRef(remaining[i].x(),remaining[i].y()) = ref.coeff(remaining[i].x(),remaining[i].y());\n    remaining[i] = remaining.back();\n    remaining.pop_back();\n  }\n  return sm.isApprox(ref);\n}\n\ntemplate<typename SparseMatrixType> void sparse_extra(const SparseMatrixType& ref)\n{\n  typedef typename SparseMatrixType::Index Index;\n  const Index rows = ref.rows();\n  const Index cols = ref.cols();\n  typedef typename SparseMatrixType::Scalar Scalar;\n  enum { Flags = SparseMatrixType::Flags };\n\n  double density = (std::max)(8./(rows*cols), 0.01);\n  typedef Matrix<Scalar,Dynamic,Dynamic> DenseMatrix;\n  typedef Matrix<Scalar,Dynamic,1> DenseVector;\n  Scalar eps = 1e-6;\n\n  SparseMatrixType m(rows, cols);\n  DenseMatrix refMat = DenseMatrix::Zero(rows, cols);\n  DenseVector vec1 = DenseVector::Random(rows);\n\n  std::vector<Vector2i> zeroCoords;\n  std::vector<Vector2i> nonzeroCoords;\n  initSparse<Scalar>(density, refMat, m, 0, &zeroCoords, &nonzeroCoords);\n\n  if (zeroCoords.size()==0 || nonzeroCoords.size()==0)\n    return;\n\n  // test coeff and coeffRef\n  for (int i=0; i<(int)zeroCoords.size(); ++i)\n  {\n    VERIFY_IS_MUCH_SMALLER_THAN( m.coeff(zeroCoords[i].x(),zeroCoords[i].y()), eps );\n    if(internal::is_same<SparseMatrixType,SparseMatrix<Scalar,Flags> >::value)\n      VERIFY_RAISES_ASSERT( m.coeffRef(zeroCoords[0].x(),zeroCoords[0].y()) = 5 );\n  }\n  VERIFY_IS_APPROX(m, refMat);\n\n  m.coeffRef(nonzeroCoords[0].x(), nonzeroCoords[0].y()) = Scalar(5);\n  refMat.coeffRef(nonzeroCoords[0].x(), nonzeroCoords[0].y()) = Scalar(5);\n\n  VERIFY_IS_APPROX(m, refMat);\n\n  // random setter\n//   {\n//     m.setZero();\n//     VERIFY_IS_NOT_APPROX(m, refMat);\n//     SparseSetter<SparseMatrixType, RandomAccessPattern> w(m);\n//     std::vector<Vector2i> remaining = nonzeroCoords;\n//     while(!remaining.empty())\n//     {\n//       int i = internal::random<int>(0,remaining.size()-1);\n//       w->coeffRef(remaining[i].x(),remaining[i].y()) = refMat.coeff(remaining[i].x(),remaining[i].y());\n//       remaining[i] = remaining.back();\n//       remaining.pop_back();\n//     }\n//   }\n//   VERIFY_IS_APPROX(m, refMat);\n\n    VERIFY(( test_random_setter<RandomSetter<SparseMatrixType, StdMapTraits> >(m,refMat,nonzeroCoords) ));\n    #ifdef EIGEN_UNORDERED_MAP_SUPPORT\n    VERIFY(( test_random_setter<RandomSetter<SparseMatrixType, StdUnorderedMapTraits> >(m,refMat,nonzeroCoords) ));\n    #endif\n    #ifdef _DENSE_HASH_MAP_H_\n    VERIFY(( test_random_setter<RandomSetter<SparseMatrixType, GoogleDenseHashMapTraits> >(m,refMat,nonzeroCoords) ));\n    #endif\n    #ifdef _SPARSE_HASH_MAP_H_\n    VERIFY(( test_random_setter<RandomSetter<SparseMatrixType, GoogleSparseHashMapTraits> >(m,refMat,nonzeroCoords) ));\n    #endif\n\n\n  // test RandomSetter\n  /*{\n    SparseMatrixType m1(rows,cols), m2(rows,cols);\n    DenseMatrix refM1 = DenseMatrix::Zero(rows, rows);\n    initSparse<Scalar>(density, refM1, m1);\n    {\n      Eigen::RandomSetter<SparseMatrixType > setter(m2);\n      for (int j=0; j<m1.outerSize(); ++j)\n        for (typename SparseMatrixType::InnerIterator i(m1,j); i; ++i)\n          setter(i.index(), j) = i.value();\n    }\n    VERIFY_IS_APPROX(m1, m2);\n  }*/\n\n\n}\n\nvoid test_sparse_extra()\n{\n  for(int i = 0; i < g_repeat; i++) {\n    int s = Eigen::internal::random<int>(1,50);\n    CALL_SUBTEST_1( sparse_extra(SparseMatrix<double>(8, 8)) );\n    CALL_SUBTEST_2( sparse_extra(SparseMatrix<std::complex<double> >(s, s)) );\n    CALL_SUBTEST_1( sparse_extra(SparseMatrix<double>(s, s)) );\n\n    CALL_SUBTEST_3( sparse_extra(DynamicSparseMatrix<double>(s, s)) );\n//    CALL_SUBTEST_3(( sparse_basic(DynamicSparseMatrix<double>(s, s)) ));\n//    CALL_SUBTEST_3(( sparse_basic(DynamicSparseMatrix<double,ColMajor,long int>(s, s)) ));\n\n    CALL_SUBTEST_3( (sparse_product<DynamicSparseMatrix<float, ColMajor> >()) );\n    CALL_SUBTEST_3( (sparse_product<DynamicSparseMatrix<float, RowMajor> >()) );\n  }\n}\n"
  },
  {
    "path": "libs/eigen/unsupported/test/splines.cpp",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2010-2011 Hauke Heibel <heibel@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"main.h\"\n\n#include <unsupported/Eigen/Splines>\n\nnamespace Eigen {\n  \n// lets do some explicit instantiations and thus\n// force the compilation of all spline functions...\ntemplate class Spline<double, 2, Dynamic>;\ntemplate class Spline<double, 3, Dynamic>;\n\ntemplate class Spline<double, 2, 2>;\ntemplate class Spline<double, 2, 3>;\ntemplate class Spline<double, 2, 4>;\ntemplate class Spline<double, 2, 5>;\n\ntemplate class Spline<float, 2, Dynamic>;\ntemplate class Spline<float, 3, Dynamic>;\n\ntemplate class Spline<float, 3, 2>;\ntemplate class Spline<float, 3, 3>;\ntemplate class Spline<float, 3, 4>;\ntemplate class Spline<float, 3, 5>;\n\n}\n\nSpline<double, 2, Dynamic> closed_spline2d()\n{\n  RowVectorXd knots(12);\n  knots << 0,\n    0,\n    0,\n    0,\n    0.867193179093898,\n    1.660330955342408,\n    2.605084834823134,\n    3.484154586374428,\n    4.252699478956276,\n    4.252699478956276,\n    4.252699478956276,\n    4.252699478956276;\n\n  MatrixXd ctrls(8,2);\n  ctrls << -0.370967741935484,   0.236842105263158,\n    -0.231401860693277,   0.442245185027632,\n    0.344361228532831,   0.773369994120753,\n    0.828990216203802,   0.106550882647595,\n    0.407270163678382,  -1.043452922172848,\n    -0.488467813584053,  -0.390098582530090,\n    -0.494657189446427,   0.054804824897884,\n    -0.370967741935484,   0.236842105263158;\n  ctrls.transposeInPlace();\n\n  return Spline<double, 2, Dynamic>(knots, ctrls);\n}\n\n/* create a reference spline */\nSpline<double, 3, Dynamic> spline3d()\n{\n  RowVectorXd knots(11);\n  knots << 0,\n    0,\n    0,\n    0.118997681558377,\n    0.162611735194631,\n    0.498364051982143,\n    0.655098003973841,\n    0.679702676853675,\n    1.000000000000000,\n    1.000000000000000,\n    1.000000000000000;\n\n  MatrixXd ctrls(8,3);\n  ctrls <<    0.959743958516081,   0.340385726666133,   0.585267750979777,\n    0.223811939491137,   0.751267059305653,   0.255095115459269,\n    0.505957051665142,   0.699076722656686,   0.890903252535799,\n    0.959291425205444,   0.547215529963803,   0.138624442828679,\n    0.149294005559057,   0.257508254123736,   0.840717255983663,\n    0.254282178971531,   0.814284826068816,   0.243524968724989,\n    0.929263623187228,   0.349983765984809,   0.196595250431208,\n    0.251083857976031,   0.616044676146639,   0.473288848902729;\n  ctrls.transposeInPlace();\n\n  return Spline<double, 3, Dynamic>(knots, ctrls);\n}\n\n/* compares evaluations against known results */\nvoid eval_spline3d()\n{\n  Spline3d spline = spline3d();\n\n  RowVectorXd u(10);\n  u << 0.351659507062997,\n    0.830828627896291,\n    0.585264091152724,\n    0.549723608291140,\n    0.917193663829810,\n    0.285839018820374,\n    0.757200229110721,\n    0.753729094278495,\n    0.380445846975357,\n    0.567821640725221;\n\n  MatrixXd pts(10,3);\n  pts << 0.707620811535916,   0.510258911240815,   0.417485437023409,\n    0.603422256426978,   0.529498282727551,   0.270351549348981,\n    0.228364197569334,   0.423745615677815,   0.637687289287490,\n    0.275556796335168,   0.350856706427970,   0.684295784598905,\n    0.514519311047655,   0.525077224890754,   0.351628308305896,\n    0.724152914315666,   0.574461155457304,   0.469860285484058,\n    0.529365063753288,   0.613328702656816,   0.237837040141739,\n    0.522469395136878,   0.619099658652895,   0.237139665242069,\n    0.677357023849552,   0.480655768435853,   0.422227610314397,\n    0.247046593173758,   0.380604672404750,   0.670065791405019;\n  pts.transposeInPlace();\n\n  for (int i=0; i<u.size(); ++i)\n  {\n    Vector3d pt = spline(u(i));\n    VERIFY( (pt - pts.col(i)).norm() < 1e-14 );\n  }\n}\n\n/* compares evaluations on corner cases */\nvoid eval_spline3d_onbrks()\n{\n  Spline3d spline = spline3d();\n\n  RowVectorXd u = spline.knots();\n\n  MatrixXd pts(11,3);\n  pts <<    0.959743958516081,   0.340385726666133,   0.585267750979777,\n    0.959743958516081,   0.340385726666133,   0.585267750979777,\n    0.959743958516081,   0.340385726666133,   0.585267750979777,\n    0.430282980289940,   0.713074680056118,   0.720373307943349,\n    0.558074875553060,   0.681617921034459,   0.804417124839942,\n    0.407076008291750,   0.349707710518163,   0.617275937419545,\n    0.240037008286602,   0.738739390398014,   0.324554153129411,\n    0.302434111480572,   0.781162443963899,   0.240177089094644,\n    0.251083857976031,   0.616044676146639,   0.473288848902729,\n    0.251083857976031,   0.616044676146639,   0.473288848902729,\n    0.251083857976031,   0.616044676146639,   0.473288848902729;\n  pts.transposeInPlace();\n\n  for (int i=0; i<u.size(); ++i)\n  {\n    Vector3d pt = spline(u(i));\n    VERIFY( (pt - pts.col(i)).norm() < 1e-14 );\n  }\n}\n\nvoid eval_closed_spline2d()\n{\n  Spline2d spline = closed_spline2d();\n\n  RowVectorXd u(12);\n  u << 0,\n    0.332457030395796,\n    0.356467130532952,\n    0.453562180176215,\n    0.648017921874804,\n    0.973770235555003,\n    1.882577647219307,\n    2.289408593930498,\n    3.511951429883045,\n    3.884149321369450,\n    4.236261590369414,\n    4.252699478956276;\n\n  MatrixXd pts(12,2);\n  pts << -0.370967741935484,   0.236842105263158,\n    -0.152576775123250,   0.448975001279334,\n    -0.133417538277668,   0.461615613865667,\n    -0.053199060826740,   0.507630360006299,\n    0.114249591147281,   0.570414135097409,\n    0.377810316891987,   0.560497102875315,\n    0.665052120135908,  -0.157557441109611,\n    0.516006487053228,  -0.559763292174825,\n    -0.379486035348887,  -0.331959640488223,\n    -0.462034726249078,  -0.039105670080824,\n    -0.378730600917982,   0.225127015099919,\n    -0.370967741935484,   0.236842105263158;\n  pts.transposeInPlace();\n\n  for (int i=0; i<u.size(); ++i)\n  {\n    Vector2d pt = spline(u(i));\n    VERIFY( (pt - pts.col(i)).norm() < 1e-14 );\n  }\n}\n\nvoid check_global_interpolation2d()\n{\n  typedef Spline2d::PointType PointType;\n  typedef Spline2d::KnotVectorType KnotVectorType;\n  typedef Spline2d::ControlPointVectorType ControlPointVectorType;\n\n  ControlPointVectorType points = ControlPointVectorType::Random(2,100);\n\n  KnotVectorType chord_lengths; // knot parameters\n  Eigen::ChordLengths(points, chord_lengths);\n\n  // interpolation without knot parameters\n  {\n    const Spline2d spline = SplineFitting<Spline2d>::Interpolate(points,3);  \n\n    for (Eigen::DenseIndex i=0; i<points.cols(); ++i)\n    {\n      PointType pt = spline( chord_lengths(i) );\n      PointType ref = points.col(i);\n      VERIFY( (pt - ref).matrix().norm() < 1e-14 );\n    }\n  }\n\n  // interpolation with given knot parameters\n  {\n    const Spline2d spline = SplineFitting<Spline2d>::Interpolate(points,3,chord_lengths);  \n\n    for (Eigen::DenseIndex i=0; i<points.cols(); ++i)\n    {\n      PointType pt = spline( chord_lengths(i) );\n      PointType ref = points.col(i);\n      VERIFY( (pt - ref).matrix().norm() < 1e-14 );\n    }\n  }\n}\n\n\nvoid test_splines()\n{\n  CALL_SUBTEST( eval_spline3d() );\n  CALL_SUBTEST( eval_spline3d_onbrks() );\n  CALL_SUBTEST( eval_closed_spline2d() );\n  CALL_SUBTEST( check_global_interpolation2d() );\n}\n"
  },
  {
    "path": "libs/eigen/unsupported/test/svd_common.h",
    "content": "// This file is part of Eigen, a lightweight C++ template library\n// for linear algebra.\n//\n// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>\n// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>\n//\n// Copyright (C) 2013 Gauthier Brun <brun.gauthier@gmail.com>\n// Copyright (C) 2013 Nicolas Carre <nicolas.carre@ensimag.fr>\n// Copyright (C) 2013 Jean Ceccato <jean.ceccato@ensimag.fr>\n// Copyright (C) 2013 Pierre Zoppitelli <pierre.zoppitelli@ensimag.fr>\n//\n// This Source Code Form is subject to the terms of the Mozilla\n// Public License v. 2.0. If a copy of the MPL was not distributed\n// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n// discard stack allocation as that too bypasses malloc\n#define EIGEN_STACK_ALLOCATION_LIMIT 0\n#define EIGEN_RUNTIME_NO_MALLOC\n\n#include \"main.h\"\n#include <unsupported/Eigen/SVD>\n#include <Eigen/LU>\n\n\n// check if \"svd\" is the good image of \"m\"  \ntemplate<typename MatrixType, typename SVD>\nvoid svd_check_full(const MatrixType& m, const SVD& svd)\n{\n  typedef typename MatrixType::Index Index;\n  Index rows = m.rows();\n  Index cols = m.cols();\n  enum {\n    RowsAtCompileTime = MatrixType::RowsAtCompileTime,\n    ColsAtCompileTime = MatrixType::ColsAtCompileTime\n  };\n\n  typedef typename MatrixType::Scalar Scalar;\n  typedef Matrix<Scalar, RowsAtCompileTime, RowsAtCompileTime> MatrixUType;\n  typedef Matrix<Scalar, ColsAtCompileTime, ColsAtCompileTime> MatrixVType;\n\n  \n  MatrixType sigma = MatrixType::Zero(rows, cols);\n  sigma.diagonal() = svd.singularValues().template cast<Scalar>();\n  MatrixUType u = svd.matrixU();\n  MatrixVType v = svd.matrixV();\n  VERIFY_IS_APPROX(m, u * sigma * v.adjoint());\n  VERIFY_IS_UNITARY(u);\n  VERIFY_IS_UNITARY(v);\n} // end svd_check_full\n\n\n\n// Compare to a reference value\ntemplate<typename MatrixType, typename SVD>\nvoid svd_compare_to_full(const MatrixType& m,\n\t\t\t unsigned int computationOptions,\n\t\t\t const SVD& referenceSvd)\n{\n  typedef typename MatrixType::Index Index;\n  Index rows = m.rows();\n  Index cols = m.cols();\n  Index diagSize = (std::min)(rows, cols);\n\n  SVD svd(m, computationOptions);\n\n  VERIFY_IS_APPROX(svd.singularValues(), referenceSvd.singularValues());\n  if(computationOptions & ComputeFullU)\n    VERIFY_IS_APPROX(svd.matrixU(), referenceSvd.matrixU());\n  if(computationOptions & ComputeThinU)\n    VERIFY_IS_APPROX(svd.matrixU(), referenceSvd.matrixU().leftCols(diagSize));\n  if(computationOptions & ComputeFullV)\n    VERIFY_IS_APPROX(svd.matrixV(), referenceSvd.matrixV());\n  if(computationOptions & ComputeThinV)\n    VERIFY_IS_APPROX(svd.matrixV(), referenceSvd.matrixV().leftCols(diagSize));\n} // end svd_compare_to_full\n\n\n\ntemplate<typename MatrixType, typename SVD>\nvoid svd_solve(const MatrixType& m, unsigned int computationOptions)\n{\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename MatrixType::Index Index;\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  enum {\n    RowsAtCompileTime = MatrixType::RowsAtCompileTime,\n    ColsAtCompileTime = MatrixType::ColsAtCompileTime\n  };\n\n  typedef Matrix<Scalar, RowsAtCompileTime, Dynamic> RhsType;\n  typedef Matrix<Scalar, ColsAtCompileTime, Dynamic> SolutionType;\n\n  RhsType rhs = RhsType::Random(rows, internal::random<Index>(1, cols));\n  SVD svd(m, computationOptions);\n  SolutionType x = svd.solve(rhs);\n  // evaluate normal equation which works also for least-squares solutions\n  VERIFY_IS_APPROX(m.adjoint()*m*x,m.adjoint()*rhs);\n} // end svd_solve\n\n\n// test computations options\n// 2 functions because Jacobisvd can return before the second function\ntemplate<typename MatrixType, typename SVD>\nvoid svd_test_computation_options_1(const MatrixType& m, const SVD& fullSvd)\n{\n  svd_check_full< MatrixType, SVD >(m, fullSvd);\n  svd_solve< MatrixType, SVD >(m, ComputeFullU | ComputeFullV);\n}\n\n\ntemplate<typename MatrixType, typename SVD>\nvoid svd_test_computation_options_2(const MatrixType& m, const SVD& fullSvd)\n{\n  svd_compare_to_full< MatrixType, SVD >(m, ComputeFullU, fullSvd);\n  svd_compare_to_full< MatrixType, SVD >(m, ComputeFullV, fullSvd);\n  svd_compare_to_full< MatrixType, SVD >(m, 0, fullSvd);\n\n  if (MatrixType::ColsAtCompileTime == Dynamic) {\n    // thin U/V are only available with dynamic number of columns\n \n    svd_compare_to_full< MatrixType, SVD >(m, ComputeFullU|ComputeThinV, fullSvd);\n    svd_compare_to_full< MatrixType, SVD >(m,              ComputeThinV, fullSvd);\n    svd_compare_to_full< MatrixType, SVD >(m, ComputeThinU|ComputeFullV, fullSvd);\n    svd_compare_to_full< MatrixType, SVD >(m, ComputeThinU             , fullSvd);\n    svd_compare_to_full< MatrixType, SVD >(m, ComputeThinU|ComputeThinV, fullSvd);\n    svd_solve<MatrixType, SVD>(m, ComputeFullU | ComputeThinV);\n    svd_solve<MatrixType, SVD>(m, ComputeThinU | ComputeFullV);\n    svd_solve<MatrixType, SVD>(m, ComputeThinU | ComputeThinV);\n    \n    typedef typename MatrixType::Index Index;\n    Index diagSize = (std::min)(m.rows(), m.cols());\n    SVD svd(m, ComputeThinU | ComputeThinV);\n    VERIFY_IS_APPROX(m, svd.matrixU().leftCols(diagSize) * svd.singularValues().asDiagonal() * svd.matrixV().leftCols(diagSize).adjoint());\n  }\n}\n\ntemplate<typename MatrixType, typename SVD> \nvoid svd_verify_assert(const MatrixType& m)\n{\n  typedef typename MatrixType::Scalar Scalar;\n  typedef typename MatrixType::Index Index;\n  Index rows = m.rows();\n  Index cols = m.cols();\n\n  enum {\n    RowsAtCompileTime = MatrixType::RowsAtCompileTime,\n    ColsAtCompileTime = MatrixType::ColsAtCompileTime\n  };\n\n  typedef Matrix<Scalar, RowsAtCompileTime, 1> RhsType;\n  RhsType rhs(rows);\n  SVD svd;\n  VERIFY_RAISES_ASSERT(svd.matrixU())\n  VERIFY_RAISES_ASSERT(svd.singularValues())\n  VERIFY_RAISES_ASSERT(svd.matrixV())\n  VERIFY_RAISES_ASSERT(svd.solve(rhs))\n  MatrixType a = MatrixType::Zero(rows, cols);\n  a.setZero();\n  svd.compute(a, 0);\n  VERIFY_RAISES_ASSERT(svd.matrixU())\n  VERIFY_RAISES_ASSERT(svd.matrixV())\n  svd.singularValues();\n  VERIFY_RAISES_ASSERT(svd.solve(rhs))\n    \n  if (ColsAtCompileTime == Dynamic)\n  {\n    svd.compute(a, ComputeThinU);\n    svd.matrixU();\n    VERIFY_RAISES_ASSERT(svd.matrixV())\n    VERIFY_RAISES_ASSERT(svd.solve(rhs))\n    svd.compute(a, ComputeThinV);\n    svd.matrixV();\n    VERIFY_RAISES_ASSERT(svd.matrixU())\n    VERIFY_RAISES_ASSERT(svd.solve(rhs))\n  }\n  else\n  {\n    VERIFY_RAISES_ASSERT(svd.compute(a, ComputeThinU))\n    VERIFY_RAISES_ASSERT(svd.compute(a, ComputeThinV))\n  }\n}\n\n// work around stupid msvc error when constructing at compile time an expression that involves\n// a division by zero, even if the numeric type has floating point\ntemplate<typename Scalar>\nEIGEN_DONT_INLINE Scalar zero() { return Scalar(0); }\n\n// workaround aggressive optimization in ICC\ntemplate<typename T> EIGEN_DONT_INLINE  T sub(T a, T b) { return a - b; }\n\n\ntemplate<typename MatrixType, typename SVD>\nvoid svd_inf_nan()\n{\n  // all this function does is verify we don't iterate infinitely on nan/inf values\n\n  SVD svd;\n  typedef typename MatrixType::Scalar Scalar;\n  Scalar some_inf = Scalar(1) / zero<Scalar>();\n  VERIFY(sub(some_inf, some_inf) != sub(some_inf, some_inf));\n  svd.compute(MatrixType::Constant(10,10,some_inf), ComputeFullU | ComputeFullV);\n\n  Scalar some_nan = zero<Scalar> () / zero<Scalar> ();\n  VERIFY(some_nan != some_nan);\n  svd.compute(MatrixType::Constant(10,10,some_nan), ComputeFullU | ComputeFullV);\n\n  MatrixType m = MatrixType::Zero(10,10);\n  m(internal::random<int>(0,9), internal::random<int>(0,9)) = some_inf;\n  svd.compute(m, ComputeFullU | ComputeFullV);\n\n  m = MatrixType::Zero(10,10);\n  m(internal::random<int>(0,9), internal::random<int>(0,9)) = some_nan;\n  svd.compute(m, ComputeFullU | ComputeFullV);\n}\n\n\ntemplate<typename SVD>\nvoid svd_preallocate()\n{\n  Vector3f v(3.f, 2.f, 1.f);\n  MatrixXf m = v.asDiagonal();\n\n  internal::set_is_malloc_allowed(false);\n  VERIFY_RAISES_ASSERT(VectorXf v(10);)\n    SVD svd;\n  internal::set_is_malloc_allowed(true);\n  svd.compute(m);\n  VERIFY_IS_APPROX(svd.singularValues(), v);\n\n  SVD svd2(3,3);\n  internal::set_is_malloc_allowed(false);\n  svd2.compute(m);\n  internal::set_is_malloc_allowed(true);\n  VERIFY_IS_APPROX(svd2.singularValues(), v);\n  VERIFY_RAISES_ASSERT(svd2.matrixU());\n  VERIFY_RAISES_ASSERT(svd2.matrixV());\n  svd2.compute(m, ComputeFullU | ComputeFullV);\n  VERIFY_IS_APPROX(svd2.matrixU(), Matrix3f::Identity());\n  VERIFY_IS_APPROX(svd2.matrixV(), Matrix3f::Identity());\n  internal::set_is_malloc_allowed(false);\n  svd2.compute(m);\n  internal::set_is_malloc_allowed(true);\n\n  SVD svd3(3,3,ComputeFullU|ComputeFullV);\n  internal::set_is_malloc_allowed(false);\n  svd2.compute(m);\n  internal::set_is_malloc_allowed(true);\n  VERIFY_IS_APPROX(svd2.singularValues(), v);\n  VERIFY_IS_APPROX(svd2.matrixU(), Matrix3f::Identity());\n  VERIFY_IS_APPROX(svd2.matrixV(), Matrix3f::Identity());\n  internal::set_is_malloc_allowed(false);\n  svd2.compute(m, ComputeFullU|ComputeFullV);\n  internal::set_is_malloc_allowed(true);\n}\n\n\n\n\n\n"
  },
  {
    "path": "libs/glew/LICENSE.txt",
    "content": "The OpenGL Extension Wrangler Library\r\nCopyright (C) 2002-2007, Milan Ikits <milan ikits[]ieee org>\r\nCopyright (C) 2002-2007, Marcelo E. Magallon <mmagallo[]debian org>\r\nCopyright (C) 2002, Lev Povalahev\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without \r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n* Redistributions of source code must retain the above copyright notice, \r\n  this list of conditions and the following disclaimer.\r\n* Redistributions in binary form must reproduce the above copyright notice, \r\n  this list of conditions and the following disclaimer in the documentation \r\n  and/or other materials provided with the distribution.\r\n* The name of the author may be used to endorse or promote products \r\n  derived from this software without specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" \r\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE \r\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \r\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \r\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\r\nTHE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n\r\nMesa 3-D graphics library\r\nVersion:  7.0\r\n\r\nCopyright (C) 1999-2007  Brian Paul   All Rights Reserved.\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a\r\ncopy of this software and associated documentation files (the \"Software\"),\r\nto deal in the Software without restriction, including without limitation\r\nthe rights to use, copy, modify, merge, publish, distribute, sublicense,\r\nand/or sell copies of the Software, and to permit persons to whom the\r\nSoftware is furnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included\r\nin all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r\nBRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN\r\nAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n\r\n\r\nCopyright (c) 2007 The Khronos Group Inc.\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a\r\ncopy of this software and/or associated documentation files (the\r\n\"Materials\"), to deal in the Materials without restriction, including\r\nwithout limitation the rights to use, copy, modify, merge, publish,\r\ndistribute, sublicense, and/or sell copies of the Materials, and to\r\npermit persons to whom the Materials are furnished to do so, subject to\r\nthe following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included\r\nin all copies or substantial portions of the Materials.\r\n\r\nTHE MATERIALS ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\r\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\r\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\r\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\r\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\r\nMATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.\r\n"
  },
  {
    "path": "libs/glew/README.txt",
    "content": "See doc/index.html for more information.\r\n\r\nIf you downloaded the tarball from the GLEW website, you just need to:\r\n\r\n    Unix:\r\n\r\n        make\r\n\r\n    Windows:\r\n\r\n        use the project file in build/vc6/\r\n\r\nIf you wish to build GLEW from scratch (update the extension data from\r\nthe net or add your own extension information), you need a Unix\r\nenvironment (including wget, perl, and GNU make).  The extension data\r\nis regenerated from the top level source directory with:\r\n\r\n        make extensions\r\n"
  },
  {
    "path": "libs/glew/TODO.txt",
    "content": "Major:\r\n - add support for windows mini-client drivers\r\n - add windows installer (msi)\r\n - separate build of static and shared object files (for mingw and\r\n cygwin)\r\n - start designing GLEW 2.0\r\n\r\nMinor:\r\n - make auto scripts work with text mode cygwin mounts\r\n - add support for all SUN, MTX, and OML extensions\r\n - make auto/Makefile more robust against auto/core/*~ mistakes\r\n - web poll on separating glew, glxew and wglew\r\n"
  },
  {
    "path": "libs/glew/auto/bin/fix_OML_sync_control.sh",
    "content": "#!/bin/sh\r\n##\r\n## Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>\r\n## Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>\r\n##\r\n## This program is distributed under the terms and conditions of the GNU\r\n## General Public License Version 2 as published by the Free Software\r\n## Foundation or, at your option, any later version.\r\n\r\nperl -e 's/#ifndef GLX_OML_sync_control/#if !defined(GLX_OML_sync_control) \\&\\& defined(__STDC_VERSION__) \\&\\& (__STDC_VERSION__ >= 199901L)\\n#include <inttypes.h>/;' -pi $1\r\nperl -e 's/#ifdef GLX_OML_sync_control/#if defined(GLX_OML_sync_control) \\&\\& defined(__STDC_VERSION__) \\&\\& (__STDC_VERSION__ >= 199901L)\\n#include <inttypes.h>/;' -pi $1\r\nperl -e 's/(extern PFNGLXGETMSCRATEOMLPROC __glewXGetMscRateOML;)/#ifdef GLX_OML_sync_control\\n\\1/' -pi $1\r\nperl -e 's/(extern PFNGLXWAITFORSBCOMLPROC __glewXWaitForSbcOML;)/\\1\\n#endif/' -pi $1\r\nperl -e 's/(extern GLboolean __GLXEW_OML_sync_control;)/#ifdef GLX_OML_sync_control\\n\\1\\n#endif/' -pi $1\r\nperl -e 's/(PFNGLXGETMSCRATEOMLPROC __glewXGetMscRateOML = NULL;)/#ifdef GLX_OML_sync_control\\n\\1/' -pi $1\r\nperl -e 's/(PFNGLXWAITFORSBCOMLPROC __glewXWaitForSbcOML = NULL;)/\\1\\n#endif/' -pi $1\r\nperl -e 's/(GLboolean __GLXEW_OML_sync_control = GL_FALSE;)/#ifdef GLX_OML_sync_control\\n\\1\\n#endif/' -pi $1\r\nrm -f $1.bak\r\n"
  },
  {
    "path": "libs/glew/auto/bin/make.pl",
    "content": "##\r\n## Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>\r\n## Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>\r\n##\r\n## This program is distributed under the terms and conditions of the GNU\r\n## General Public License Version 2 as published by the Free Software\r\n## Foundation or, at your option, any later version.\r\n\r\nmy %regex = (\r\n    extname  => qr/^[A-Z][A-Za-z0-9_]+$/,\r\n    exturl   => qr/^http.+$/,\r\n    function => qr/^(.+) ([a-z][a-z0-9_]*) \\((.+)\\)$/i, \r\n    token    => qr/^([A-Z][A-Z0-9_x]*)\\s+((?:0x)?[0-9A-Fa-f]+|[A-Z][A-Z0-9_]*)$/,\r\n    type     => qr/^typedef\\s+(.+)\\s+([\\*A-Za-z0-9_]+)$/,\r\n    exact    => qr/.*;$/,\r\n);\r\n\r\n# prefix function name with glew\r\nsub prefixname($)\r\n{\r\n    my $name = $_[0];\r\n    $name =~ s/^(.*)gl/__$1glew/;\r\n    return $name;\r\n}\r\n\r\n# prefix function name with glew\r\nsub prefix_varname($)\r\n{\r\n    my $name = $_[0];\r\n    $name =~ s/^(.*)GL(X*)EW/__$1GL$2EW/;\r\n    return $name;\r\n}\r\n\r\n#---------------------------------------------------------------------------------------\r\n\r\nsub make_exact($)\r\n{\r\n\tmy $exact = $_[0];\r\n\t$exact =~ s/(; |{)/$1\\n/g;\r\n    return $exact;\r\n}\r\n\r\nsub make_separator($)\r\n{\r\n    my $extname = $_[0];\r\n    my $l = length $extname;\r\n    my $s = (71 - $l)/2;\r\n    print \"/* \";\r\n    my $j = 3;\r\n    for (my $i = 0; $i < $s; $i++)\r\n    {\r\n\tprint \"-\";\r\n\t$j++;\r\n    }\r\n    print \" $_[0] \";\r\n    $j += $l + 2;\r\n    while ($j < 76)\r\n    {\r\n\tprint \"-\";\r\n\t$j++;\r\n    }\r\n    print \" */\\n\\n\";\r\n}\r\n\r\n#---------------------------------------------------------------------------------------\r\n\r\nsub parse_ext($)\r\n{\r\n    my $filename = shift;\r\n    my %functions = ();\r\n    my %tokens = ();\r\n    my %types = ();\r\n    my @exacts = ();\r\n    my $extname = \"\";\r\n    my $exturl = \"\";\r\n    \r\n    open EXT, \"<$filename\" or return;\r\n\r\n    while(<EXT>)\r\n    {\r\n        chomp;\r\n\tif (/$regex{extname}/)\r\n        {\r\n            $extname = $_;\r\n            next;\r\n        }\r\n\telsif (/$regex{exturl}/)\r\n\t{\r\n\t    $exturl = $_;\r\n\t}\r\n        elsif (s/^\\s+//)\r\n        {\r\n            if (/$regex{exact}/)\r\n            {\r\n\t\t\t\tpush @exacts, $_;\r\n            }\r\n            elsif (/$regex{type}/)\r\n            {\r\n                my ($value, $name) = ($1, $2);\r\n                $types{$name} = $value;\r\n            }\r\n            elsif (/$regex{token}/)\r\n            {\r\n                my ($name, $value) = ($1, $2);\r\n                $tokens{$name} = $value;\r\n            }\r\n            elsif (/$regex{function}/)\r\n            {\r\n                my ($return, $name, $parms) = ($1, $2, $3);\r\n                $functions{$name} = {\r\n\t\t    rtype => $return,\r\n\t\t    parms => $parms,\r\n\t\t};\r\n            } else {\r\n                print STDERR \"'$_' matched no regex.\\n\";\r\n            }\r\n        }\r\n    }\r\n\r\n    close EXT;\r\n\r\n    return ($extname, $exturl, \\%types, \\%tokens, \\%functions, \\@exacts);\r\n}\r\n\r\nsub output_tokens($$)\r\n{\r\n    my ($tbl, $fnc) = @_;\r\n    if (keys %{$tbl})\r\n    {\r\n        local $, = \"\\n\";\r\n        print \"\\n\";\r\n        print map { &{$fnc}($_, $tbl->{$_}) } sort { hex ${$tbl}{$a} <=> hex ${$tbl}{$b} } keys %{$tbl};\r\n        print \"\\n\";\r\n    } else {\r\n        print STDERR \"no keys in table!\\n\";\r\n    }\r\n}\r\n\r\nsub output_types($$)\r\n{\r\n    my ($tbl, $fnc) = @_;\r\n    if (keys %{$tbl})\r\n    {\r\n        local $, = \"\\n\";\r\n        print \"\\n\";\r\n        print map { &{$fnc}($_, $tbl->{$_}) } sort { ${$tbl}{$a} cmp ${$tbl}{$b} } keys %{$tbl};\r\n        print \"\\n\";\r\n    }\r\n}\r\n\r\nsub output_decls($$)\r\n{\r\n    my ($tbl, $fnc) = @_;\r\n    if (keys %{$tbl})\r\n    {\r\n        local $, = \"\\n\";\r\n        print \"\\n\";\r\n        print map { &{$fnc}($_, $tbl->{$_}) } sort keys %{$tbl};\r\n        print \"\\n\";\r\n    }\r\n}\r\n\r\nsub output_exacts($$)\r\n{\r\n    my ($tbl, $fnc) = @_;\r\n    if (scalar @{$tbl})\r\n    {\r\n        local $, = \"\\n\";\r\n        print \"\\n\";\r\n        print map { &{$fnc}($_) } sort @{$tbl};\r\n        print \"\\n\";\r\n    }\r\n}\r\n\r\n"
  },
  {
    "path": "libs/glew/auto/bin/make_def_fun.pl",
    "content": "#!/usr/bin/perl\r\n##\r\n## Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>\r\n## Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>\r\n##\r\n## This program is distributed under the terms and conditions of the GNU\r\n## General Public License Version 2 as published by the Free Software\r\n## Foundation or, at your option, any later version.\r\n\r\nuse strict;\r\nuse warnings;\r\n\r\ndo 'bin/make.pl';\r\n\r\n# function pointer declaration\r\nsub make_pfn_decl($%)\r\n{\r\n    return \"PFN\" . (uc $_[0]) . \"PROC \" . prefixname($_[0]) . \" = NULL;\";\r\n}\r\n\r\nmy @extlist = ();\r\nmy %extensions = ();\r\n\r\nour $type = shift;\r\n\r\nif (@ARGV)\r\n{\r\n    @extlist = @ARGV;\r\n\r\n\tforeach my $ext (sort @extlist)\r\n\t{\r\n\t\tmy ($extname, $exturl, $types, $tokens, $functions, $exacts) = parse_ext($ext);\r\n\t\toutput_decls($functions, \\&make_pfn_decl);\r\n\t}\r\n}\r\n"
  },
  {
    "path": "libs/glew/auto/bin/make_def_var.pl",
    "content": "#!/usr/bin/perl\r\n##\r\n## Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>\r\n## Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>\r\n##\r\n## This program is distributed under the terms and conditions of the GNU\r\n## General Public License Version 2 as published by the Free Software\r\n## Foundation or, at your option, any later version.\r\n\r\nuse strict;\r\nuse warnings;\r\n\r\ndo 'bin/make.pl';\r\n\r\nmy @extlist = ();\r\nmy %extensions = ();\r\n\r\nour $type = shift;\r\n\r\nif (@ARGV)\r\n{\r\n    @extlist = @ARGV;\r\n\r\n\tforeach my $ext (sort @extlist)\r\n\t{\r\n\t\tmy ($extname, $exturl, $types, $tokens, $functions, $exacts) = parse_ext($ext);\r\n\t\tmy $extvar = $extname;\r\n\t\t$extvar =~ s/GL(X*)_/GL$1EW_/;\r\n\t\tprint \"GLboolean \" . prefix_varname($extvar) . \" = GL_FALSE;\\n\";\r\n\t}\r\n}\r\n"
  },
  {
    "path": "libs/glew/auto/bin/make_header.pl",
    "content": "#!/usr/bin/perl\r\n##\r\n## Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>\r\n## Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>\r\n##\r\n## This program is distributed under the terms and conditions of the GNU\r\n## General Public License Version 2 as published by the Free Software\r\n## Foundation or, at your option, any later version.\r\n\r\nuse strict;\r\nuse warnings;\r\n\r\ndo 'bin/make.pl';\r\n\r\n# token\r\nsub make_define($$)\r\n{\r\n    return \"#define $_[0] $_[1]\"\r\n}\r\n\r\n# type declaration\r\nsub make_type($$)\r\n{\r\n    return \"typedef $_[1] $_[0];\"\r\n}\r\n\r\n# function pointer type declaration\r\nsub make_pfn_type($%)\r\n{\r\n    our $api;\r\n    return join(' ', \"typedef\", $_[1]->{rtype},\r\n        \"($api * PFN\" . (uc $_[0]) . \"PROC)\",\r\n        \"(\" . $_[1]->{parms} . \")\") . \";\";\r\n}\r\n\r\n# function name alias\r\nsub make_pfn_alias($%)\r\n{\r\n    our $type;\r\n    return join(\" \", \"#define\", $_[0], $type . \"EW_GET_FUN(\" . prefixname($_[0]) . \")\")\r\n}\r\n\r\nmy @extlist = ();\r\nmy %extensions = ();\r\n\r\nour $api = shift;\r\nour $type = shift;\r\n\r\nif (@ARGV)\r\n{\r\n    @extlist = @ARGV;\r\n\r\n\tforeach my $ext (sort @extlist)\r\n\t{\r\n\t\tmy ($extname, $exturl, $types, $tokens, $functions, $exacts) = parse_ext($ext);\r\n\r\n\t\tmake_separator($extname);\r\n\t\tprint \"#ifndef $extname\\n#define $extname 1\\n\";\r\n\t\toutput_tokens($tokens, \\&make_define);\r\n\t\toutput_types($types, \\&make_type);\r\n\t\toutput_exacts($exacts, \\&make_exact);\r\n\t\toutput_decls($functions, \\&make_pfn_type);\r\n\t\toutput_decls($functions, \\&make_pfn_alias);\r\n\r\n\t\tmy $extvar = $extname;\r\n\t\t$extvar =~ s/GL(X*)_/GL$1EW_/;\r\n\t\t\r\n\t\tprint \"\\n#define $extvar \" . $type . \"EW_GET_VAR(\" . prefix_varname($extvar) . \")\\n\";\r\n\t\tprint \"\\n#endif /* $extname */\\n\\n\";\r\n\t}\r\n}\r\n"
  },
  {
    "path": "libs/glew/auto/bin/make_html.pl",
    "content": "#!/usr/bin/perl\r\n##\r\n## Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>\r\n## Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>\r\n##\r\n## This program is distributed under the terms and conditions of the GNU\r\n## General Public License Version 2 as published by the Free Software\r\n## Foundation or, at your option, any later version.\r\n\r\nuse strict;\r\nuse warnings;\r\n\r\ndo 'bin/make.pl';\r\n\r\n#---------------------------------------------------------------------------------------\r\n\r\nmy @extlist = ();\r\nmy %extensions = ();\r\nmy $group = \"\";\r\nmy $cur_group = \"\";\r\n\r\nif (@ARGV)\r\n{\r\n    @extlist = @ARGV;\r\n\tmy $n = 1;\r\n\tprint \"<table border=\\\"0\\\" width=\\\"100%\\\" cellpadding=\\\"1\\\" cellspacing=\\\"0\\\" align=\\\"center\\\">\\n\";\r\n\tforeach my $ext (sort @extlist)\r\n\t{\r\n\t\tmy ($extname, $exturl, $types, $tokens, $functions, $exacts) = parse_ext($ext);\r\n\t\t$cur_group = $extname;\r\n\t\t$cur_group =~ s/^(?:W?)GL(?:X?)_([A-Z0-9]+?)_.*$/$1/;\r\n\t\t$extname =~ s/^(?:W?)GL(?:X?)_(.*)$/$1/;\r\n\t\tif ($cur_group ne $group)\r\n\t\t{\r\n\t\t\tif ($group ne \"\")\r\n\t\t\t{\r\n\t\t\t\tprint \"<tr><td><br></td><td></td><td></td></tr>\\n\";\r\n\t\t\t}\r\n\t\t\t$group = $cur_group;\r\n\t\t}\r\n\r\n\t\t{\r\n\t\t\tif ($exturl)\r\n\t\t\t{\r\n\t\t\t\tprint \"<tr><td class=\\\"num\\\">$n</td><td>&nbsp;</td><td><a href=\\\"$exturl\\\">$extname</a></td></tr>\\n\";\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tprint \"<tr><td class=\\\"num\\\">$n</td><td>&nbsp;</td><td>$extname</td></tr>\\n\";\r\n\t\t\t}\r\n\t\t\t$n++;\r\n\t\t}\r\n\t}\r\n\tprint \"</table>\\n\"\r\n}\r\n"
  },
  {
    "path": "libs/glew/auto/bin/make_info.pl",
    "content": "#!/usr/bin/perl\r\n##\r\n## Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>\r\n## Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>\r\n##\r\n## This program is distributed under the terms and conditions of the GNU\r\n## General Public License Version 2 as published by the Free Software\r\n## Foundation or, at your option, any later version.\r\n\r\nuse strict;\r\nuse warnings;\r\n\r\ndo 'bin/make.pl';\r\n\r\n#---------------------------------------------------------------------------------------\r\n\r\n# function pointer definition\r\nsub make_pfn_info($%)\r\n{\r\n    my $name = $_[0];\r\n    return \"  glewInfoFunc(\\\"$_[0]\\\", $name == NULL);\";\r\n}\r\n\r\n#---------------------------------------------------------------------------------------\r\n\r\nmy @extlist = ();\r\nmy %extensions = ();\r\n\r\nif (@ARGV)\r\n{\r\n    @extlist = @ARGV;\r\n\r\n\tforeach my $ext (sort @extlist)\r\n\t{\r\n\t\tmy ($extname, $exturl, $types, $tokens, $functions, $exacts) = parse_ext($ext);\r\n\t\tmy $extvar = $extname;\r\n\t\t$extvar =~ s/GL(X*)_/GL$1EW_/;\r\n\t\tmy $extpre = $extname;\r\n\t\t$extpre =~ s/(GLX|GLW|GL).*/$1/;\r\n\t\t$extpre = lc $extpre;\r\n\r\n\t\t#make_separator($extname);\r\n\t\tprint \"#ifdef $extname\\n\\n\";\r\n\t\tprint \"static void _glewInfo_$extname (void)\\n{\\n\";\r\n\t\tif ($extvar =~ /VERSION/)\r\n\t\t{\r\n\t\t\tprint \"  glewPrintExt(\\\"$extname\\\", $extvar, $extvar, $extvar);\\n\";\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tprint \"  glewPrintExt(\\\"$extname\\\", $extvar, $extpre\" .\r\n\t\t\t\t\"ewIsSupported(\\\"$extname\\\"), $extpre\" .\r\n\t\t\t\t\"ewGetExtension(\\\"$extname\\\"));\\n\";\r\n\t\t}\r\n\t\toutput_decls($functions, \\&make_pfn_info);\r\n\t\tprint \"}\\n\\n\";\r\n\t\tprint \"#endif /* $extname */\\n\\n\";\r\n\t}\r\n}\r\n"
  },
  {
    "path": "libs/glew/auto/bin/make_info_list.pl",
    "content": "#!/usr/bin/perl\r\n##\r\n## Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>\r\n## Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>\r\n##\r\n## This program is distributed under the terms and conditions of the GNU\r\n## General Public License Version 2 as published by the Free Software\r\n## Foundation or, at your option, any later version.\r\n\r\nuse strict;\r\nuse warnings;\r\n\r\ndo 'bin/make.pl';\r\n\r\n#---------------------------------------------------------------------------------------\r\n\r\n# function pointer definition\r\nsub make_pfn_def($%)\r\n{\r\n    return \"PFN\" . (uc $_[0]) . \"PROC \" . prefixname($_[0]) . \" = NULL;\";\r\n}\r\n\r\n# function pointer definition\r\nsub make_init_call($%)\r\n{\r\n    my $name = prefixname($_[0]);\r\n    return \"  r = r || (\" . $name . \" = (PFN\" . (uc $_[0]) . \"PROC)glewGetProcAddress((const GLubyte*)\\\"\" . $name . \"\\\")) == NULL;\";\r\n}\r\n\r\n#---------------------------------------------------------------------------------------\r\n\r\nmy @extlist = ();\r\nmy %extensions = ();\r\n\r\nif (@ARGV)\r\n{\r\n    @extlist = @ARGV;\r\n\r\n\tforeach my $ext (sort @extlist)\r\n\t{\r\n\t\tmy ($extname, $exturl, $types, $tokens, $functions, $exacts) = parse_ext($ext);\r\n\r\n\t\tprint \"#ifdef $extname\\n\";\r\n\t\tprint \"  _glewInfo_$extname();\\n\";\r\n\t\tprint \"#endif /* $extname */\\n\";\r\n\t}\r\n}\r\n"
  },
  {
    "path": "libs/glew/auto/bin/make_init.pl",
    "content": "#!/usr/bin/perl\r\n##\r\n## Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>\r\n## Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>\r\n##\r\n## This program is distributed under the terms and conditions of the GNU\r\n## General Public License Version 2 as published by the Free Software\r\n## Foundation or, at your option, any later version.\r\n\r\nuse strict;\r\nuse warnings;\r\n\r\ndo 'bin/make.pl';\r\n\r\n#-------------------------------------------------------------------------------\r\n\r\n# function pointer definition\r\nsub make_pfn_def_init($%)\r\n{\r\n    #my $name = prefixname($_[0]);\r\n    return \"  r = ((\" . $_[0] . \" = (PFN\" . (uc $_[0]) . \"PROC)glewGetProcAddress((const GLubyte*)\\\"\" . $_[0] . \"\\\")) == NULL) || r;\";\r\n}\r\n\r\n#-------------------------------------------------------------------------------\r\n\r\nmy @extlist = ();\r\nmy %extensions = ();\r\n\r\nour $type = shift;\r\n\r\nif (@ARGV)\r\n{\r\n    @extlist = @ARGV;\r\n\r\n\tforeach my $ext (sort @extlist)\r\n\t{\r\n\t\tmy ($extname, $exturl, $types, $tokens, $functions, $exacts) = \r\n\t\t\tparse_ext($ext);\r\n\r\n\t\t#make_separator($extname);\r\n\t\tprint \"#ifdef $extname\\n\\n\";\r\n\t\tmy $extvar = $extname;\r\n\t\tmy $extvardef = $extname;\r\n\t\t$extvar =~ s/GL(X*)_/GL$1EW_/;\r\n\t\tif (keys %$functions)\r\n\t\t{\r\n\t\t\tprint \"static GLboolean _glewInit_$extname (\" . $type . \r\n\t\t\t\t\"EW_CONTEXT_ARG_DEF_INIT)\\n{\\n  GLboolean r = GL_FALSE;\\n\";\r\n\t\t\toutput_decls($functions, \\&make_pfn_def_init);\r\n\t\t\tprint \"\\n  return r;\\n}\\n\\n\";\r\n\t\t}\r\n\t\t#print \"\\nGLboolean \" . prefix_varname($extvar) . \" = GL_FALSE;\\n\\n\";\r\n\t\tprint \"#endif /* $extname */\\n\\n\";\r\n\t}\r\n}\r\n"
  },
  {
    "path": "libs/glew/auto/bin/make_list.pl",
    "content": "#!/usr/bin/perl\r\n##\r\n## Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>\r\n## Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>\r\n##\r\n## This program is distributed under the terms and conditions of the GNU\r\n## General Public License Version 2 as published by the Free Software\r\n## Foundation or, at your option, any later version.\r\n\r\nuse strict;\r\nuse warnings;\r\n\r\ndo 'bin/make.pl';\r\n\r\n#---------------------------------------------------------------------------------------\r\n\r\n# function pointer definition\r\nsub make_init_call($%)\r\n{\r\n    my $name = prefixname($_[0]);\r\n    return \"  r = r || (\" . $_[0] . \" = (PFN\" . (uc $_[0]) . \"PROC)glewGetProcAddress(\\\"\" . $name . \"\\\")) == NULL;\";\r\n}\r\n\r\n#---------------------------------------------------------------------------------------\r\n\r\nmy @extlist = ();\r\nmy %extensions = ();\r\n\r\nif (@ARGV)\r\n{\r\n    @extlist = @ARGV;\r\n\r\n\tforeach my $ext (sort @extlist)\r\n\t{\r\n\t\tmy ($extname, $exturl, $types, $tokens, $functions, $exacts) = parse_ext($ext);\r\n\r\n\t\tmy $extvar = $extname;\r\n\t\t$extvar =~ s/GL(X*)_/GL$1EW_/;\r\n\r\n\t\tmy $extpre = $extname;\r\n\t\t$extpre =~ s/^(W?)GL(X?).*$/\\l$1gl\\l$2ew/;\r\n\r\n\t\t#my $pextvar = prefix_varname($extvar);\r\n\r\n\t\tprint \"#ifdef $extname\\n\";\r\n\t\tprint \"  CONST_CAST(\" . $extvar . \") = \" . $extpre . \"GetExtension(\\\"$extname\\\");\\n\";\r\n\t\tif (keys %$functions)\r\n\t\t{\r\n\t\t\tif ($extname =~ /WGL_.*/)\r\n\t\t\t{\r\n\t\t\t\tprint \"  if (glewExperimental || \" . $extvar . \"|| crippled) CONST_CAST(\" . $extvar . \")= !_glewInit_$extname(GLEW_CONTEXT_ARG_VAR_INIT);\\n\";\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tprint \"  if (glewExperimental || \" . $extvar . \") CONST_CAST(\" . $extvar . \") = !_glewInit_$extname(GLEW_CONTEXT_ARG_VAR_INIT);\\n\";\r\n\t\t\t}\r\n\t\t}\r\n\t\tprint \"#endif /* $extname */\\n\";\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "libs/glew/auto/bin/make_str.pl",
    "content": "#!/usr/bin/perl\r\n##\r\n## Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>\r\n## Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>\r\n##\r\n## This program is distributed under the terms and conditions of the GNU\r\n## General Public License Version 2 as published by the Free Software\r\n## Foundation or, at your option, any later version.\r\n\r\nuse strict;\r\nuse warnings;\r\n\r\ndo 'bin/make.pl';\r\n\r\nmy @extlist = ();\r\nmy %extensions = ();\r\n\r\nif (@ARGV)\r\n{\r\n    @extlist = @ARGV;\r\n\r\n\tmy $curexttype = \"\";\r\n\tforeach my $ext (sort @extlist)\r\n\t{\r\n\t\tmy ($extname, $exturl, $types, $tokens, $functions, $exacts) = parse_ext($ext);\r\n\t\tmy $exttype = $extname;\r\n\t\t$exttype =~ s/(W*?)GL(X*?)_(.*?_)(.*)/$3/;\r\n\t\tmy $extrem = $extname;\r\n\t\t$extrem =~ s/(W*?)GL(X*?)_(.*?_)(.*)/$4/;\r\n\t\tmy $extvar = $extname;\r\n\t\t$extvar =~ s/(W*)GL(X*)_/$1GL$2EW_/;\r\n\t\tif(!($exttype =~ $curexttype))\r\n\t\t{\r\n\t\t\tif(length($curexttype) > 0)\r\n\t\t\t{\r\n\t\t\t\tprint \"      }\\n\";\r\n\t\t\t}\r\n\t\t\tprint \"      if (_glewStrSame2(&pos, &len, (const GLubyte*)\\\"$exttype\\\", \" . length($exttype) . \"))\\n\";\r\n\t\t\tprint \"      {\\n\";\r\n\t\t\t$curexttype = $exttype;\r\n\t\t}\r\n\t\tprint \"#ifdef $extname\\n\";\r\n\t\tprint \"        if (_glewStrSame3(&pos, &len, (const GLubyte*)\\\"$extrem\\\", \". length($extrem) . \"))\\n\";\r\n\t\t#print \"        return $extvar;\\n\";\r\n\t\tprint \"        {\\n\";\r\n\t\tprint \"          ret = $extvar;\\n\";\r\n\t\tprint \"          continue;\\n\";\r\n\t\tprint \"        }\\n\";\r\n\t\tprint \"#endif\\n\";\r\n\t}\r\n\r\n\tprint \"      }\\n\";\r\n}\r\n"
  },
  {
    "path": "libs/glew/auto/bin/make_struct_fun.pl",
    "content": "#!/usr/bin/perl\r\n##\r\n## Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>\r\n## Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>\r\n##\r\n## This program is distributed under the terms and conditions of the GNU\r\n## General Public License Version 2 as published by the Free Software\r\n## Foundation or, at your option, any later version.\r\n\r\nuse strict;\r\nuse warnings;\r\n\r\ndo 'bin/make.pl';\r\n\r\n# function pointer declaration\r\nsub make_pfn_decl($%)\r\n{\r\n    our $export;\r\n    return $export . \" PFN\" . (uc $_[0]) . \"PROC \" . prefixname($_[0]) . \";\";\r\n}\r\n\r\nmy @extlist = ();\r\nmy %extensions = ();\r\n\r\nour $export = shift;\r\n\r\nif (@ARGV)\r\n{\r\n    @extlist = @ARGV;\r\n\r\n\tforeach my $ext (sort @extlist)\r\n\t{\r\n\t\tmy ($extname, $exturl, $types, $tokens, $functions, $exacts) = parse_ext($ext);\r\n\t\toutput_decls($functions, \\&make_pfn_decl);\r\n\t}\r\n}\r\n"
  },
  {
    "path": "libs/glew/auto/bin/make_struct_var.pl",
    "content": "#!/usr/bin/perl\r\n##\r\n## Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>\r\n## Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>\r\n##\r\n## This program is distributed under the terms and conditions of the GNU\r\n## General Public License Version 2 as published by the Free Software\r\n## Foundation or, at your option, any later version.\r\n\r\nuse strict;\r\nuse warnings;\r\n\r\ndo 'bin/make.pl';\r\n\r\nmy @extlist = ();\r\nmy %extensions = ();\r\n\r\nour $export = shift;\r\n\r\nif (@ARGV)\r\n{\r\n    @extlist = @ARGV;\r\n\r\n\tforeach my $ext (sort @extlist)\r\n\t{\r\n\t\tmy ($extname, $exturl, $types, $tokens, $functions, $exacts) = parse_ext($ext);\r\n\t\tmy $extvar = $extname;\r\n\t\t$extvar =~ s/GL(X*)_/GL$1EW_/;\r\n\t\tprint $export . \" GLboolean \" . prefix_varname($extvar) . \";\\n\";\r\n\t}\r\n}\r\n"
  },
  {
    "path": "libs/glew/auto/bin/parse_spec.pl",
    "content": "#!/usr/bin/perl\r\n##\r\n## Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>\r\n## Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>\r\n##\r\n## This program is distributed under the terms and conditions of the GNU\r\n## General Public License Version 2 as published by the Free Software\r\n## Foundation or, at your option, any later version.\r\n\r\nuse strict;\r\nuse warnings;\r\n\r\nsub compile_regex\r\n{\r\n    my $regex = join('', @_);\r\n    return qr/$regex/\r\n}\r\n\r\nmy @sections = (\r\n    \"Name\",\r\n    \"Name Strings?\",\r\n    \"New Procedures and Functions\",\r\n    \"New Tokens\",\r\n);\r\n\r\nmy %typemap = (\r\n    bitfield => \"GLbitfield\",\r\n    boolean  => \"GLboolean\",\r\n    # fsck up in EXT_vertex_array\r\n    Boolean  => \"GLboolean\",\r\n    byte     => \"GLbyte\",\r\n    clampd   => \"GLclampd\",\r\n    clampf   => \"GLclampf\",\r\n    double   => \"GLdouble\",\r\n    enum     => \"GLenum\",\r\n    # Intel fsck up\r\n    Glenum   => \"GLenum\",\r\n    float    => \"GLfloat\",\r\n    half     => \"GLhalf\",\r\n    int      => \"GLint\",\r\n    short    => \"GLshort\",\r\n    sizei    => \"GLsizei\",\r\n    ubyte    => \"GLubyte\",\r\n    uint     => \"GLuint\",\r\n    ushort   => \"GLushort\",\r\n    DMbuffer => \"void *\",\r\n    # Nvidia video output fsck up\r\n    int64EXT => \"GLint64EXT\",\r\n    uint64EXT=> \"GLuint64EXT\",\r\n\r\n    # ARB VBO introduces these.\r\n\r\n    sizeiptr => \"GLsizeiptr\",\r\n    intptr   => \"GLintptr\",\r\n    sizeiptrARB => \"GLsizeiptrARB\",\r\n    intptrARB   => \"GLintptrARB\",\r\n\r\n    # ARB shader objects introduces these, charARB is at least 8 bits,\r\n    # handleARB is at least 32 bits\r\n    charARB => \"GLcharARB\",\r\n    handleARB => \"GLhandleARB\",\r\n\r\n    # OpenGL 3.2 and GL_ARB_sync\r\n\r\n    int64  => \"GLint64\",\r\n    uint64 => \"GLuint64\",\r\n    sync   => \"GLsync\",\r\n\r\n    # GLX 1.3 defines new types which might not be available at compile time\r\n\r\n    #GLXFBConfig   => \"void*\",\r\n    #GLXFBConfigID => \"XID\",\r\n    #GLXContextID  => \"XID\",\r\n    #GLXWindow     => \"XID\",\r\n    #GLXPbuffer    => \"XID\",\r\n\r\n    # Weird stuff to some SGIX extension\r\n\r\n    #GLXFBConfigSGIX   => \"void*\",\r\n    #GLXFBConfigIDSGIX => \"XID\",\r\n\r\n);\r\n\r\nmy %voidtypemap = (\r\n    void    => \"GLvoid\",\r\n);\r\n\r\nmy %taboo_tokens = (\r\n    GL_ZERO => 1,\r\n);\r\n\r\n# list of function definitions to be ignored, unless they are being defined in\r\n# the given spec.  This is an ugly hack arround the fact that people writing\r\n# spec files seem to shut down all brain activity while they are at this task.\r\n#\r\n# This will be moved to its own file eventually.\r\n#\r\n# (mem, 2003-03-19)\r\n\r\nmy %fnc_ignore_list = (\r\n    \"BindProgramARB\"                => \"ARB_vertex_program\",\r\n    \"ColorSubTableEXT\"              => \"EXT_color_subtable\",\r\n    \"DeleteProgramsARB\"             => \"ARB_vertex_program\",\r\n    \"GenProgramsARB\"                => \"ARB_vertex_program\",\r\n    \"GetProgramEnvParameterdvARB\"   => \"ARB_vertex_program\",\r\n    \"GetProgramEnvParameterfvARB\"   => \"ARB_vertex_program\",\r\n    \"GetProgramLocalParameterdvARB\" => \"ARB_vertex_program\",\r\n    \"GetProgramLocalParameterfvARB\" => \"ARB_vertex_program\",\r\n    \"GetProgramStringARB\"           => \"ARB_vertex_program\",\r\n    \"GetProgramivARB\"               => \"ARB_vertex_program\",\r\n    \"IsProgramARB\"                  => \"ARB_vertex_program\",\r\n    \"ProgramEnvParameter4dARB\"      => \"ARB_vertex_program\",\r\n    \"ProgramEnvParameter4dvARB\"     => \"ARB_vertex_program\",\r\n    \"ProgramEnvParameter4fARB\"      => \"ARB_vertex_program\",\r\n    \"ProgramEnvParameter4fvARB\"     => \"ARB_vertex_program\",\r\n    \"ProgramLocalParameter4dARB\"    => \"ARB_vertex_program\",\r\n    \"ProgramLocalParameter4dvARB\"   => \"ARB_vertex_program\",\r\n    \"ProgramLocalParameter4fARB\"    => \"ARB_vertex_program\",\r\n    \"ProgramLocalParameter4fvARB\"   => \"ARB_vertex_program\",\r\n    \"ProgramStringARB\"              => \"ARB_vertex_program\",\r\n    \"glXCreateContextAttribsARB\"    => \"ARB_create_context_profile\",\r\n    \"wglCreateContextAttribsARB\"    => \"WGL_ARB_create_context_profile\",\r\n);\r\n\r\nmy %regex = (\r\n    eofnc    => qr/(?:\\);?$|^$)/, # )$ | );$ | ^$\r\n    extname  => qr/^[A-Z][A-Za-z0-9_]+$/,\r\n    function => qr/^(.+) ([a-z][a-z0-9_]*) \\((.+)\\)$/i,\r\n    prefix   => qr/^(?:[aw]?gl|glX)/, # gl | agl | wgl | glX\r\n    tprefix  => qr/^(?:[AW]?GL|GLX)_/, # GL_ | AGL_ | WGL_ | GLX_\r\n    section  => compile_regex('^(', join('|', @sections), ')$'), # sections in spec\r\n    token    => qr/^([A-Z0-9][A-Z0-9_]*):?\\s+((?:0x)?[0-9A-F]+)(.*)$/, # define tokens\r\n    types    => compile_regex('\\b(', join('|', keys %typemap), ')\\b'), # var types\r\n    voidtype => compile_regex('\\b(', keys %voidtypemap, ')\\b '), # void type\r\n);\r\n\r\n# reshapes the the function declaration from multiline to single line form\r\nsub normalize_prototype\r\n{\r\n    local $_ = join(\" \", @_);\r\n    s/\\s+/ /g;                # multiple whitespace -> single space\r\n    s/\\<.*\\>//g;              # remove <comments> from direct state access extension\r\n    s/\\<.*$//g;               # remove incomplete <comments> from direct state access extension\r\n    s/\\s*\\(\\s*/ \\(/;          # exactly one space before ( and none after\r\n    s/\\s*\\)\\s*/\\)/;           # no space before or after )\r\n    s/\\s*\\*([a-zA-Z])/\\* $1/; # \"* identifier\"\r\n    s/\\*wgl/\\* wgl/;          # \"* wgl\"\r\n    s/\\*glX/\\* glX/;          # \"* glX\"\r\n    s/\\.\\.\\./void/;           # ... -> void\r\n    s/;$//;                   # remove ; at the end of the line\r\n    return $_;\r\n}\r\n\r\n# Ugly hack to work arround the fact that functions are declared in more\r\n# than one spec file.\r\nsub ignore_function($$)\r\n{\r\n    return exists($fnc_ignore_list{$_[0]}) && $fnc_ignore_list{$_[0]} ne $_[1]\r\n}\r\n\r\nsub parse_spec($)\r\n{\r\n    my $filename = shift;\r\n    my $extname = \"\";\r\n    my $vendortag = \"\";\r\n    my @extnames = ();\r\n    my %functions = ();\r\n    my %tokens = ();\r\n\r\n    my $section = \"\";\r\n    my @fnc = ();\r\n\r\n    my %proc = (\r\n        \"Name\" => sub {\r\n            if (/^([a-z0-9]+)_([a-z0-9_]+)/i)\r\n            {\r\n                $extname = \"$1_$2\";\r\n                $vendortag = $1;\r\n            }\r\n        },\r\n\r\n        \"Name Strings\" => sub {\r\n            # Add extension name to extension list\r\n            # Does this look even plausible?\r\n            if (/$regex{extname}/)\r\n            {\r\n                # prefix with \"GL_\" if prefix not present\r\n                s/^/GL_/ unless /$regex{tprefix}/o;\r\n                # Add extension name to extension list\r\n                push @extnames, $_;\r\n            }\r\n        },\r\n\r\n        \"New Procedures and Functions\" => sub {\r\n            # if line matches end of function\r\n            if (/$regex{eofnc}/)\r\n            {\r\n                # add line to function declaration\r\n                push @fnc, $_;\r\n\r\n                # if normalized version of function looks like a function\r\n                if (normalize_prototype(@fnc) =~ /$regex{function}/)\r\n                {\r\n                    # get return type, name, and arguments from regex\r\n                    my ($return, $name, $parms) = ($1, $2, $3);\r\n                    if (!ignore_function($name, $extname))\r\n                    {\r\n                        # prefix with \"gl\" if prefix not present\r\n                        $name =~ s/^/gl/ unless $name =~ /$regex{prefix}/;\r\n                        # is this a pure GL function?\r\n                        if ($name =~ /^gl/ && $name !~ /^glX/)\r\n                        {\r\n                            # apply typemaps\r\n                            $return =~ s/$regex{types}/$typemap{$1}/og;\r\n                            $return =~ s/void\\*/GLvoid */og;\r\n                            $parms =~ s/$regex{types}/$typemap{$1}/og;\r\n                            $parms =~ s/$regex{voidtype}/$voidtypemap{$1}/og;\r\n                        }\r\n                        # add to functions hash\r\n                        $functions{$name} = {\r\n                            rtype => $return,\r\n                            parms => $parms,\r\n                        };\r\n                    }\r\n                }\r\n                # reset function declaration\r\n                @fnc = ();\r\n            } elsif ($_ ne \"\" and $_ ne \"None\") {\r\n                # if not eof, add line to function declaration\r\n                push @fnc, $_\r\n            }\r\n        },\r\n\r\n        \"New Tokens\" => sub {\r\n            if (/$regex{token}/)\r\n            {\r\n                my ($name, $value) = ($1, $2);\r\n                # prefix with \"GL_\" if prefix not present\r\n                $name =~ s/^/GL_/ unless $name =~ /$regex{tprefix}/;\r\n                # Add (name, value) pair to tokens hash, unless it's taboo\r\n                $tokens{$name} = $value unless exists $taboo_tokens{$name};\r\n            }\r\n        },\r\n    );\r\n\r\n    # Some people can't read, the template clearly says \"Name String_s_\"\r\n    $proc{\"Name String\"} = $proc{\"Name Strings\"};\r\n\r\n    # Open spec file\r\n    open SPEC, \"<$filename\" or return;\r\n\r\n    # For each line of SPEC\r\n    while(<SPEC>)\r\n    {\r\n        # Delete trailing newline character\r\n        chomp;\r\n        # Remove trailing white spaces\r\n        s/\\s+$//;\r\n        # If starts with a capital letter, it must be a new section\r\n        if (/^[A-Z]/)\r\n        {\r\n            # Match section name with one of the predefined names \r\n            $section = /$regex{section}/o ? $1 : \"default\";\r\n        } else {\r\n            # Line is internal to a section\r\n            # Remove leading whitespace\r\n            s/^\\s+//;\r\n            # Call appropriate section processing function if it exists\r\n            &{$proc{$section}} if exists $proc{$section};\r\n        }\r\n    }\r\n\r\n    close SPEC;\r\n\r\n    return ($extname, \\@extnames, \\%tokens, \\%functions);\r\n}\r\n\r\n#----------------------------------------------------------------------------------------\r\n\r\nmy @speclist = ();\r\nmy %extensions = ();\r\n\r\nmy $ext_dir = shift;\r\nmy $reg_http = \"http://www.opengl.org/registry/specs/\";\r\n#my $reg_http = \"http://oss.sgi.com/projects/ogl-sample/\";\r\n\r\n# Take command line arguments or read list from file\r\nif (@ARGV)\r\n{\r\n    @speclist = @ARGV;\r\n} else {\r\n    local $/; #???\r\n    @speclist = split \"\\n\", (<>);\r\n}\r\n\r\nforeach my $spec (sort @speclist)\r\n{\r\n    my ($extname, $extnames, $tokens, $functions) = parse_spec($spec);\r\n\r\n    foreach my $ext (@{$extnames})\r\n    {\r\n        my $info = \"$ext_dir/\" . $ext;\r\n        open EXT, \">$info\";\r\n        print EXT $ext . \"\\n\";\r\n\t\tmy $specname = $spec;\r\n\t\t$specname =~ s/registry\\///;\r\n        print EXT $reg_http . $specname . \"\\n\";\r\n\r\n        my $prefix = $ext;\r\n        $prefix =~ s/^(.+?)(_.+)$/$1/;\r\n        foreach my $token (sort { hex ${$tokens}{$a} <=> hex ${$tokens}{$b} } keys %{$tokens})\r\n        {\r\n            if ($token =~ /^$prefix\\_.*/i)\r\n            {\r\n                print EXT \"\\t\" . $token . \" \" . ${\\%{$tokens}}{$token} . \"\\n\";\r\n            }\r\n        }\r\n        foreach my $function (sort keys %{$functions})\r\n        {\r\n            if ($function =~ /^$prefix.*/i)\r\n            {\r\n                print EXT \"\\t\" . ${$functions}{$function}{rtype} . \" \" . $function . \" (\" . ${$functions}{$function}{parms} . \")\" . \"\\n\";\r\n            }\r\n        }\r\n        close EXT;\r\n    }\r\n}\r\n"
  },
  {
    "path": "libs/glew/auto/bin/update_ext.sh",
    "content": "#!/bin/bash\r\n##\r\n## Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>\r\n## Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>\r\n##\r\n## This program is distributed under the terms and conditions of the GNU\r\n## General Public License Version 2 as published by the Free Software\r\n## Foundation or, at your option, any later version.\r\n##\r\n## Parameters:\r\n##\r\n##       $1: Extensions directory\r\n##       $2: Registry directory\r\n##       $3: The black list\r\n\r\nset -e\r\n\r\nif [ ! -d $1 ] ; then\r\n    mkdir $1\r\n\r\n# Parse each of the extensions in the registry\r\n    find $2 -name doc -type d -prune -o -name \\*.txt -print | \\\r\n\tgrep -v -f $3 | sort | bin/parse_spec.pl $1\r\n\r\n# fix GL_NV_texture_compression_vtc\r\n    grep -v EXT $1/GL_NV_texture_compression_vtc > tmp\r\n    mv tmp $1/GL_NV_texture_compression_vtc\r\n\r\n# remove duplicates from GL_ARB_vertex_program and GL_ARB_fragment_program\r\n    grep -v -F -f $1/GL_ARB_vertex_program $1/GL_ARB_fragment_program > tmp\r\n    mv tmp $1/GL_ARB_fragment_program\r\n\r\n# remove duplicates from GLX_EXT_visual_rating and GLX_EXT_visual_info\r\n    grep -v -F -f $1/GLX_EXT_visual_info $1/GLX_EXT_visual_rating > tmp\r\n    mv tmp $1/GLX_EXT_visual_rating\r\n\r\n# GL_EXT_draw_buffers2 and GL_EXT_transform_feedback both define glGetBooleanIndexedvEXT but with different parameter names\r\n    grep -v glGetBooleanIndexedvEXT $1/GL_EXT_transform_feedback > tmp\r\n    mv tmp $1/GL_EXT_transform_feedback    \r\n\r\n# GL_EXT_draw_buffers2 and GL_EXT_transform_feedback both define glGetIntegerIndexedvEXT but with different parameter names\r\n    grep -v glGetIntegerIndexedvEXT $1/GL_EXT_transform_feedback > tmp\r\n    mv tmp $1/GL_EXT_transform_feedback    \r\n\r\n# remove duplicates from GL_NV_present_video and GLX_NV_present_video\r\n    grep -v -F -f $1/GLX_NV_present_video $1/GL_NV_present_video > tmp\r\n    mv tmp $1/GL_NV_present_video\r\n\r\n# fix WGL_NV_present_video\r\n    cat >> $1/WGL_NV_present_video <<EOT\r\n    DECLARE_HANDLE(HVIDEOOUTPUTDEVICENV);\r\nEOT\r\n\r\n# fix WGL_NV_video_output\r\n    cat >> $1/WGL_NV_video_output <<EOT\r\n    DECLARE_HANDLE(HPVIDEODEV);\r\nEOT\r\n\r\n# fix GL_NV_occlusion_query and GL_HP_occlusion_test\r\n    grep -v '_HP' $1/GL_NV_occlusion_query > tmp\r\n    mv tmp $1/GL_NV_occlusion_query\r\n    perl -e's/OCCLUSION_TEST_HP.*/OCCLUSION_TEST_HP 0x8165/' -pi \\\r\n\t$1/GL_HP_occlusion_test\r\n    perl -e's/OCCLUSION_TEST_RESULT_HP.*/OCCLUSION_TEST_RESULT_HP 0x8166/' -pi \\\r\n\t$1/GL_HP_occlusion_test\r\n\r\n# fix GLvoid in GL_ARB_vertex_buffer_objects\r\n    perl -e 's/ void\\*/ GLvoid\\*/g' -pi \\\r\n        $1/GL_ARB_vertex_buffer_object\r\n\r\n# add deprecated constants to GL_ATI_fragment_shader\r\n    cat >> $1/GL_ATI_fragment_shader <<EOT\r\n\tGL_NUM_FRAGMENT_REGISTERS_ATI 0x896E\r\n\tGL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F\r\n\tGL_NUM_PASSES_ATI 0x8970\r\n\tGL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971\r\n\tGL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972\r\n\tGL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973\r\n\tGL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974\r\n\tGL_COLOR_ALPHA_PAIRING_ATI 0x8975\r\n\tGL_SWIZZLE_STRQ_ATI 0x897A\r\n\tGL_SWIZZLE_STRQ_DQ_ATI 0x897B\r\nEOT\r\n\r\n# add deprecated constants to GL_NV_texture_shader\r\n    cat >> $1/GL_NV_texture_shader <<EOT\r\n\tGL_OFFSET_TEXTURE_2D_MATRIX_NV 0x86E1\r\n\tGL_OFFSET_TEXTURE_2D_BIAS_NV 0x86E3\r\n\tGL_OFFSET_TEXTURE_2D_SCALE_NV 0x86E2\r\nEOT\r\n\t\r\n# fix WGL_ATI_pixel_format_float\r\n    cat >> $1/WGL_ATI_pixel_format_float <<EOT\r\n\tGL_RGBA_FLOAT_MODE_ATI 0x8820\r\n\tGL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835\r\nEOT\r\n\r\n# fix WGL_ARB_make_current_read\r\n    cat >> $1/WGL_ARB_make_current_read <<EOT\r\n\tERROR_INVALID_PIXEL_TYPE_ARB 0x2043\r\n\tERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054\r\nEOT\r\n\r\n# fix WGL_EXT_make_current_read\r\n    cat >> $1/WGL_EXT_make_current_read <<EOT\r\n\tERROR_INVALID_PIXEL_TYPE_EXT 0x2043\r\nEOT\r\n\r\n# add typedefs to GL_ARB_vertex_buffer_object; (from personal communication\r\n# with Marco Fabbricatore).\r\n#\r\n# Rationale.  The spec says:\r\n#\r\n#   \"Both types are defined as signed integers large enough to contain\r\n#   any pointer value [...] The idea of making these types unsigned was\r\n#   considered, but was ultimately rejected ...\"\r\n    cat >> $1/GL_ARB_vertex_buffer_object <<EOT\r\n\ttypedef ptrdiff_t GLsizeiptrARB\r\n\ttypedef ptrdiff_t GLintptrARB\r\nEOT\r\n\r\n# add typedefs to GLX_EXT_import_context\r\n    cat >> $1/GLX_EXT_import_context <<EOT\r\n\ttypedef XID GLXContextID\r\nEOT\r\n\r\n# add tokens to GLX_OML_swap_method\r\n    cat >> $1/GLX_OML_swap_method <<EOT\r\n\tGLX_SWAP_EXCHANGE_OML 0x8061\r\n\tGLX_SWAP_COPY_OML 0x8062\r\n\tGLX_SWAP_UNDEFINED_OML 0x8063\r\nEOT\r\n\r\n# add typedefs to GLX_SGIX_fbconfig\r\n    cat >> $1/GLX_SGIX_fbconfig <<EOT\r\n\ttypedef XID GLXFBConfigIDSGIX\r\n\ttypedef struct __GLXFBConfigRec *GLXFBConfigSGIX\r\nEOT\r\n\r\n# add typedefs to GLX_SGIX_pbuffer\r\n    cat >> $1/GLX_SGIX_pbuffer <<EOT\r\n\ttypedef XID GLXPbufferSGIX\r\n\ttypedef struct { int type; unsigned long serial; Bool send_event; Display *display; GLXDrawable drawable; int event_type; int draw_type; unsigned int mask; int x, y; int width, height; int count; } GLXBufferClobberEventSGIX\r\nEOT\r\n\r\n# add typedef to GL_NV_half_float\r\n    cat >> $1/GL_NV_half_float <<EOT\r\n\ttypedef unsigned short GLhalf\r\nEOT\r\n\r\n# add handle to WGL_ARB_pbuffer\r\n    cat >> $1/WGL_ARB_pbuffer <<EOT\r\n\tDECLARE_HANDLE(HPBUFFERARB);\r\nEOT\r\n\r\n# add handle to WGL_EXT_pbuffer\r\n    cat >> $1/WGL_EXT_pbuffer <<EOT\r\n\tDECLARE_HANDLE(HPBUFFEREXT);\r\nEOT\r\n\r\n# get rid of GL_SUN_multi_draw_arrays\r\n    rm -f $1/GL_SUN_multi_draw_arrays\r\n\r\n# change variable names in GL_ARB_vertex_shader\r\n    perl -e 's/v0/x/g' -pi $1/GL_ARB_vertex_shader\r\n    perl -e 's/v1/y/g' -pi $1/GL_ARB_vertex_shader\r\n    perl -e 's/v2/z/g' -pi $1/GL_ARB_vertex_shader\r\n    perl -e 's/v3/w/g' -pi $1/GL_ARB_vertex_shader\r\n\r\n# remove triplicates in GL_ARB_shader_objects, GL_ARB_fragment_shader, \r\n# and GL_ARB_vertex_shader\r\n    grep -v -F -f $1/GL_ARB_shader_objects $1/GL_ARB_fragment_shader > tmp\r\n    mv tmp $1/GL_ARB_fragment_shader\r\n    grep -v -F -f $1/GL_ARB_shader_objects $1/GL_ARB_vertex_shader > tmp\r\n    mv tmp $1/GL_ARB_vertex_shader\r\n\r\n# remove duplicates in GL_ARB_vertex_program and GL_ARB_vertex_shader\r\n    grep -v -F -f $1/GL_ARB_vertex_program $1/GL_ARB_vertex_shader > tmp\r\n    mv tmp $1/GL_ARB_vertex_shader\r\n\r\n# remove triplicates in GL_ARB_fragment_program, GL_ARB_fragment_shader,\r\n# and GL_ARB_vertex_shader\r\n    grep -v -F -f $1/GL_ARB_fragment_program $1/GL_ARB_fragment_shader > tmp\r\n    mv tmp $1/GL_ARB_fragment_shader\r\n    grep -v -F -f $1/GL_ARB_fragment_program $1/GL_ARB_vertex_shader > tmp\r\n    mv tmp $1/GL_ARB_vertex_shader\r\n\r\n# remove duplicates in GL_EXT_direct_state_access\r\n    grep -v \"glGetBooleanIndexedvEXT\" $1/GL_EXT_direct_state_access > tmp\r\n    mv tmp $1/GL_EXT_direct_state_access\r\n    grep -v \"glGetIntegerIndexedvEXT\" $1/GL_EXT_direct_state_access > tmp\r\n    mv tmp $1/GL_EXT_direct_state_access\r\n    grep -v \"glDisableIndexedEXT\" $1/GL_EXT_direct_state_access > tmp\r\n    mv tmp $1/GL_EXT_direct_state_access\r\n    grep -v \"glEnableIndexedEXT\" $1/GL_EXT_direct_state_access > tmp\r\n    mv tmp $1/GL_EXT_direct_state_access\r\n    grep -v \"glIsEnabledIndexedEXT\" $1/GL_EXT_direct_state_access > tmp\r\n    mv tmp $1/GL_EXT_direct_state_access\r\n\r\n# remove duplicates in GL_NV_explicit_multisample\r\n    grep -v \"glGetBooleanIndexedvEXT\" $1/GL_NV_explicit_multisample > tmp\r\n    mv tmp $1/GL_NV_explicit_multisample\r\n    grep -v \"glGetIntegerIndexedvEXT\" $1/GL_NV_explicit_multisample > tmp\r\n    mv tmp $1/GL_NV_explicit_multisample\r\n\r\n# fix bugs in GL_ARB_vertex_shader\r\n    grep -v \"GL_FLOAT\" $1/GL_ARB_vertex_shader > tmp\r\n    mv tmp $1/GL_ARB_vertex_shader\r\n    perl -e 's/handle /GLhandleARB /g' -pi $1/GL_ARB_vertex_shader\r\n\r\n# fix bugs in GL_ARB_shader_objects\r\n    grep -v \"GL_FLOAT \" $1/GL_ARB_shader_objects > tmp\r\n    mv tmp $1/GL_ARB_shader_objects\r\n    grep -v \"GL_INT \" $1/GL_ARB_shader_objects > tmp\r\n    mv tmp $1/GL_ARB_shader_objects\r\n\r\n# add typedefs to GL_ARB_shader_objects\r\n    cat >> $1/GL_ARB_shader_objects <<EOT\r\n\ttypedef char GLcharARB\r\n\ttypedef unsigned int GLhandleARB\r\nEOT\r\n\r\n# add missing functions to GL_ARB_transpose_matrix\r\n\tcat >> $1/GL_ARB_transpose_matrix <<EOT\r\n\tvoid glLoadTransposeMatrixfARB (GLfloat m[16])\r\n\tvoid glLoadTransposeMatrixdARB (GLdouble m[16])\r\n\tvoid glMultTransposeMatrixfARB (GLfloat m[16])\r\n\tvoid glMultTransposeMatrixdARB (GLdouble m[16])\r\nEOT\r\n\r\n# add missing tokens to GL_EXT_framebuffer_multisample\r\n\tcat >> $1/GL_EXT_framebuffer_multisample <<EOT\r\n\tGL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56\r\n\tGL_MAX_SAMPLES_EXT 0x8D57\r\nEOT\r\n\r\n# fix const correctness in GL_ARB_shader_objects\r\n#    perl -e 's/(.+glUniform.*(fv|iv).+)(GLfloat\\*.+|GLint\\*.+)/\\1const \\3/;' -pi $1/GL_ARB_shader_objects\r\n\r\n# Filter out profile enumerations from GLX_ARB_create_context\r\n    grep -v \"_PROFILE_\" $1/GLX_ARB_create_context > tmp\r\n    mv tmp $1/GLX_ARB_create_context\r\n\r\n# Filter only profile related enumerations for GLX_ARB_create_context_profile\r\n    head -n2 $1/GLX_ARB_create_context_profile > tmp\r\n    grep \"_PROFILE_\" $1/GLX_ARB_create_context_profile >> tmp\r\n    mv tmp $1/GLX_ARB_create_context_profile\r\n\r\n# Filter out profile enumerations from WGL_ARB_create_context\r\n    grep -v \"_PROFILE_\" $1/WGL_ARB_create_context > tmp\r\n    mv tmp $1/WGL_ARB_create_context\r\n\r\n# Filter only profile related enumerations for WGL_ARB_create_context_profile\r\n    head -n2 $1/WGL_ARB_create_context_profile > tmp\r\n    grep \"_PROFILE_\" $1/WGL_ARB_create_context_profile >> tmp\r\n    mv tmp $1/WGL_ARB_create_context_profile\r\n\r\n# add missing function to GLX_NV_copy_image\r\n\tcat >> $1/GLX_NV_copy_image <<EOT\r\n  void glXCopyImageSubDataNV (Display *dpy, GLXContext srcCtx, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLXContext dstCtx, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth)\r\nEOT\r\n\r\n# add missing function to WGL_NV_copy_image\r\n\tcat >> $1/WGL_NV_copy_image <<EOT\r\n  BOOL wglCopyImageSubDataNV (HGLRC hSrcRC, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, HGLRC hDstRC, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth)\r\nEOT\r\n\r\n# clean up\r\n    rm -f $1/*.bak\r\n\r\nfi\r\n"
  },
  {
    "path": "libs/glew/auto/bin/update_registry.sh",
    "content": "#!/bin/sh\r\n##\r\n## Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>\r\n## Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>\r\n##\r\n## This program is distributed under the terms and conditions of the GNU\r\n## General Public License Version 2 as published by the Free Software\r\n## Foundation or, at your option, any later version.\r\n\r\nset -e\r\n\r\nif [ ! -d $1 ] ; then\r\n    mkdir $1\r\nfi\r\ncd $1\r\n\r\nwget                                                    \\\r\n    --mirror                                            \\\r\n    --no-parent                                         \\\r\n    --no-host-directories                               \\\r\n    --cut-dirs=2                                        \\\r\n    --accept=txt,html                                   \\\r\n    $2\r\n\r\n"
  },
  {
    "path": "libs/glew/auto/blacklist",
    "content": "EXT/draw_range_elements.txt\nEXT/static_vertex_array.txt\nEXT/vertex_array_set.alt.txt\nEXT/vertex_array_set.txt\nEXT/nurbs_tessellator.txt\nEXT/object_space_tess.txt\nSGI/filter4_parameters.txt\nSGIS/texture_color_mask.txt\nSGIX/dmbuffer.txt\nSGIX/instruments.txt\nSGIX/video_source.txt\nSGIX/hyperpipe_group.txt\nOES/OES_fixed_point.txt\nOES/OES_query_matrix.txt\nNV/video_capture.txt\n"
  },
  {
    "path": "libs/glew/auto/core/GLX_ARB_get_proc_address",
    "content": "GLX_ARB_get_proc_address\r\nhttp://oss.sgi.com/projects/ogl-sample/registry/ARB/get_proc_address.txt\r\n\textern void ( * glXGetProcAddressARB (const GLubyte *procName)) (void);\r\n"
  },
  {
    "path": "libs/glew/auto/core/GLX_ATI_pixel_format_float",
    "content": "GLX_ATI_pixel_format_float\r\n\tGLX_RGBA_FLOAT_ATI_BIT 0x00000100\r\n"
  },
  {
    "path": "libs/glew/auto/core/GLX_ATI_render_texture",
    "content": "GLX_ATI_render_texture\r\n\tGLX_BIND_TO_TEXTURE_RGB_ATI         0x9800\r\n\tGLX_BIND_TO_TEXTURE_RGBA_ATI        0x9801\r\n\tGLX_TEXTURE_FORMAT_ATI              0x9802\r\n\tGLX_TEXTURE_TARGET_ATI              0x9803\r\n\tGLX_MIPMAP_TEXTURE_ATI              0x9804\r\n\tGLX_TEXTURE_RGB_ATI                 0x9805\r\n\tGLX_TEXTURE_RGBA_ATI                0x9806\r\n\tGLX_NO_TEXTURE_ATI                  0x9807\r\n\tGLX_TEXTURE_CUBE_MAP_ATI            0x9808\r\n\tGLX_TEXTURE_1D_ATI                  0x9809\r\n\tGLX_TEXTURE_2D_ATI                  0x980A\r\n\tGLX_MIPMAP_LEVEL_ATI                0x980B\r\n\tGLX_CUBE_MAP_FACE_ATI               0x980C\r\n\tGLX_TEXTURE_CUBE_MAP_POSITIVE_X_ATI 0x980D\r\n\tGLX_TEXTURE_CUBE_MAP_NEGATIVE_X_ATI 0x980E\r\n\tGLX_TEXTURE_CUBE_MAP_POSITIVE_Y_ATI 0x980F\r\n\tGLX_TEXTURE_CUBE_MAP_NEGATIVE_Y_ATI 0x9810\r\n\tGLX_TEXTURE_CUBE_MAP_POSITIVE_Z_ATI 0x9811\r\n\tGLX_TEXTURE_CUBE_MAP_NEGATIVE_Z_ATI 0x9812\r\n\tGLX_FRONT_LEFT_ATI                  0x9813\r\n\tGLX_FRONT_RIGHT_ATI                 0x9814\r\n\tGLX_BACK_LEFT_ATI                   0x9815\r\n\tGLX_BACK_RIGHT_ATI                  0x9816\r\n\tGLX_AUX0_ATI                        0x9817\r\n\tGLX_AUX1_ATI                        0x9818\r\n\tGLX_AUX2_ATI                        0x9819\r\n\tGLX_AUX3_ATI                        0x981A\r\n\tGLX_AUX4_ATI                        0x981B\r\n\tGLX_AUX5_ATI                        0x981C\r\n\tGLX_AUX6_ATI                        0x981D\r\n\tGLX_AUX7_ATI                        0x981E\r\n\tGLX_AUX8_ATI                        0x981F\r\n\tGLX_AUX9_ATI                        0x9820\r\n\tGLX_BIND_TO_TEXTURE_LUMINANCE_ATI   0x9821\r\n\tGLX_BIND_TO_TEXTURE_INTENSITY_ATI   0x9822\r\n\tvoid glXBindTexImageATI (Display *dpy, GLXPbuffer pbuf, int buffer)\r\n\tvoid glXReleaseTexImageATI (Display *dpy, GLXPbuffer pbuf, int buffer)\r\n\tvoid glXDrawableAttribATI (Display *dpy, GLXDrawable draw, const int *attrib_list)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GLX_EXT_fbconfig_packed_float",
    "content": "GLX_EXT_fbconfig_packed_float\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_EXT_packed_float.txt\r\n\tGLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT 0x20B1\r\n\tGLX_RGBA_UNSIGNED_FLOAT_BIT_EXT 0x00000008\r\n"
  },
  {
    "path": "libs/glew/auto/core/GLX_EXT_framebuffer_sRGB",
    "content": "GLX_EXT_framebuffer_sRGB\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_EXT_framebuffer_sRGB.txt\r\n\tGLX_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20B2\r\n"
  },
  {
    "path": "libs/glew/auto/core/GLX_NV_float_buffer",
    "content": "GLX_NV_float_buffer\r\nhttp://cvs1.nvidia.com/inc/GL/glxtokens.h\r\n\tGLX_FLOAT_COMPONENTS_NV 0x20B0\r\n"
  },
  {
    "path": "libs/glew/auto/core/GLX_NV_vertex_array_range",
    "content": "GLX_NV_vertex_array_range\r\nhttp://oss.sgi.com/projects/ogl-sample/registry/NV/vertex_array_range.txt\r\n\tvoid * glXAllocateMemoryNV (GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority)\r\n\tvoid glXFreeMemoryNV (void *pointer)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GLX_SGIS_shared_multisample",
    "content": "GLX_SGIS_shared_multisample\r\n\tGLX_MULTISAMPLE_SUB_RECT_WIDTH_SGIS 0x8026\r\n\tGLX_MULTISAMPLE_SUB_RECT_HEIGHT_SGIS 0x8027\r\n"
  },
  {
    "path": "libs/glew/auto/core/GLX_SGIX_hyperpipe",
    "content": "GLX_SGIX_hyperpipe\r\nhttp://oss.sgi.com/projects/ogl-sample/registry/SGIX/hyperpipe_group.txt\r\n\tGLX_HYPERPIPE_ID_SGIX 0x8030\r\n\tGLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX 80\r\n\tGLX_HYPERPIPE_DISPLAY_PIPE_SGIX 0x00000001\r\n\tGLX_HYPERPIPE_RENDER_PIPE_SGIX 0x00000002\r\n\tGLX_PIPE_RECT_SGIX 0x00000001\r\n\tGLX_PIPE_RECT_LIMITS_SGIX 0x00000002\r\n\tGLX_HYPERPIPE_STEREO_SGIX 0x00000003\r\n\tGLX_HYPERPIPE_PIXEL_AVERAGE_SGIX 0x00000004\r\n\tGLX_BAD_HYPERPIPE_CONFIG_SGIX 91\r\n\tGLX_BAD_HYPERPIPE_SGIX 92\r\n\ttypedef struct {  char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX];   int  networkId; } GLXHyperpipeNetworkSGIX;\r\n\ttypedef struct {  char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX];   int channel;   unsigned int participationType;   int timeSlice; } GLXHyperpipeConfigSGIX;\r\n\ttypedef struct {  char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX];   int srcXOrigin;   int srcYOrigin;   int srcWidth;   int srcHeight;   int destXOrigin;   int destYOrigin;   int destWidth;   int destHeight; } GLXPipeRect;\r\n\ttypedef struct {  char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX];   int XOrigin;   int YOrigin;   int maxHeight;   int maxWidth; } GLXPipeRectLimits;\r\n\tGLXHyperpipeNetworkSGIX * glXQueryHyperpipeNetworkSGIX (Display *dpy, int *npipes)\r\n\tint glXHyperpipeConfigSGIX (Display *dpy, int networkId, int npipes, GLXHyperpipeConfigSGIX *cfg, int *hpId)\r\n\tGLXHyperpipeConfigSGIX * glXQueryHyperpipeConfigSGIX (Display *dpy, int hpId, int *npipes)\r\n\tint glXDestroyHyperpipeConfigSGIX (Display *dpy, int hpId)\r\n\tint glXBindHyperpipeSGIX (Display *dpy, int hpId)\r\n\tint glXQueryHyperpipeBestAttribSGIX (Display *dpy, int timeSlice, int attrib, int size, void *attribList, void *returnAttribList)\r\n\tint glXHyperpipeAttribSGIX (Display *dpy, int timeSlice, int attrib, int size, void *attribList)\r\n\tint glXQueryHyperpipeAttribSGIX (Display *dpy, int timeSlice, int attrib, int size, void *returnAttribList)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GLX_SGIX_swap_barrier",
    "content": "GLX_SGIX_swap_barrier\r\nhttp://oss.sgi.com/projects/ogl-sample/registry/SGIX/swap_barrier.txt\r\n\tvoid glXBindSwapBarrierSGIX (Display *dpy, GLXDrawable drawable, int barrier)\r\n\tBool glXQueryMaxSwapBarriersSGIX (Display *dpy, int screen, int *max)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GLX_SGIX_swap_group",
    "content": "GLX_SGIX_swap_group\r\nhttp://oss.sgi.com/projects/ogl-sample/registry/SGIX/swap_group.txt\r\n\tvoid glXJoinSwapGroupSGIX (Display *dpy, GLXDrawable drawable, GLXDrawable member)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GLX_SUN_video_resize",
    "content": "GLX_SUN_video_resize\r\nhttp://wwws.sun.com/software/graphics/opengl/extensions/glx_sun_video_resize.txt\r\n\tGL_VIDEO_RESIZE_COMPENSATION_SUN 0x85CD\r\n\tGLX_VIDEO_RESIZE_SUN 0x8171\r\n\tint glXVideoResizeSUN (Display* display, GLXDrawable window, float factor)\r\n\tint glXGetVideoResizeSUN (Display* display, GLXDrawable window, float* factor)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GLX_VERSION_1_2",
    "content": "GLX_VERSION_1_2\r\n\tDisplay* glXGetCurrentDisplay (void)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GLX_VERSION_1_3",
    "content": "GLX_VERSION_1_3\r\n\tGLX_WINDOW_BIT 0x00000001\r\n\tGLX_PIXMAP_BIT 0x00000002\r\n\tGLX_PBUFFER_BIT 0x00000004\r\n\tGLX_RGBA_BIT 0x00000001\r\n\tGLX_COLOR_INDEX_BIT 0x00000002\r\n\tGLX_PBUFFER_CLOBBER_MASK 0x08000000\r\n\tGLX_FRONT_LEFT_BUFFER_BIT 0x00000001\r\n\tGLX_FRONT_RIGHT_BUFFER_BIT 0x00000002\r\n\tGLX_BACK_LEFT_BUFFER_BIT 0x00000004\r\n\tGLX_BACK_RIGHT_BUFFER_BIT 0x00000008\r\n\tGLX_AUX_BUFFERS_BIT 0x00000010\r\n\tGLX_DEPTH_BUFFER_BIT 0x00000020\r\n\tGLX_STENCIL_BUFFER_BIT 0x00000040\r\n\tGLX_ACCUM_BUFFER_BIT 0x00000080\r\n\tGLX_CONFIG_CAVEAT 0x20\r\n\tGLX_X_VISUAL_TYPE 0x22\r\n\tGLX_TRANSPARENT_TYPE 0x23\r\n\tGLX_TRANSPARENT_INDEX_VALUE 0x24\r\n\tGLX_TRANSPARENT_RED_VALUE 0x25\r\n\tGLX_TRANSPARENT_GREEN_VALUE 0x26\r\n\tGLX_TRANSPARENT_BLUE_VALUE 0x27\r\n\tGLX_TRANSPARENT_ALPHA_VALUE 0x28\r\n\tGLX_DONT_CARE 0xFFFFFFFF\r\n\tGLX_NONE 0x8000\r\n\tGLX_SLOW_CONFIG 0x8001\r\n\tGLX_TRUE_COLOR 0x8002\r\n\tGLX_DIRECT_COLOR 0x8003\r\n\tGLX_PSEUDO_COLOR 0x8004\r\n\tGLX_STATIC_COLOR 0x8005\r\n\tGLX_GRAY_SCALE 0x8006\r\n\tGLX_STATIC_GRAY 0x8007\r\n\tGLX_TRANSPARENT_RGB 0x8008\r\n\tGLX_TRANSPARENT_INDEX 0x8009\r\n\tGLX_VISUAL_ID 0x800B\r\n\tGLX_SCREEN 0x800C\r\n\tGLX_NON_CONFORMANT_CONFIG 0x800D\r\n\tGLX_DRAWABLE_TYPE 0x8010\r\n\tGLX_RENDER_TYPE 0x8011\r\n\tGLX_X_RENDERABLE 0x8012\r\n\tGLX_FBCONFIG_ID 0x8013\r\n\tGLX_RGBA_TYPE 0x8014\r\n\tGLX_COLOR_INDEX_TYPE 0x8015\r\n\tGLX_MAX_PBUFFER_WIDTH 0x8016\r\n\tGLX_MAX_PBUFFER_HEIGHT 0x8017\r\n\tGLX_MAX_PBUFFER_PIXELS 0x8018\r\n\tGLX_PRESERVED_CONTENTS 0x801B\r\n\tGLX_LARGEST_PBUFFER 0x801C\r\n\tGLX_WIDTH 0x801D\r\n\tGLX_HEIGHT 0x801E\r\n\tGLX_EVENT_MASK 0x801F\r\n\tGLX_DAMAGED 0x8020\r\n\tGLX_SAVED 0x8021\r\n\tGLX_WINDOW 0x8022\r\n\tGLX_PBUFFER 0x8023\r\n\tGLX_PBUFFER_HEIGHT 0x8040\r\n\tGLX_PBUFFER_WIDTH 0x8041\r\n\tGLXFBConfig* glXChooseFBConfig (Display *dpy, int screen, const int *attrib_list, int *nelements)\r\n\tGLXFBConfig* glXGetFBConfigs (Display *dpy, int screen, int *nelements)\r\n\tXVisualInfo* glXGetVisualFromFBConfig (Display *dpy, GLXFBConfig config)\r\n\tint glXGetFBConfigAttrib (Display *dpy, GLXFBConfig config, int attribute, int *value)\r\n\tGLXWindow glXCreateWindow (Display *dpy, GLXFBConfig config, Window win, const int *attrib_list)\r\n\tvoid glXDestroyWindow (Display *dpy, GLXWindow win)\r\n\tGLXPixmap glXCreatePixmap (Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attrib_list)\r\n\tvoid glXDestroyPixmap (Display *dpy, GLXPixmap pixmap)\r\n\tGLXPbuffer glXCreatePbuffer (Display *dpy, GLXFBConfig config, const int *attrib_list)\r\n\tvoid glXDestroyPbuffer (Display *dpy, GLXPbuffer pbuf)\r\n\tvoid glXQueryDrawable (Display *dpy, GLXDrawable draw, int attribute, unsigned int *value)\r\n\tGLXContext glXCreateNewContext (Display *dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct)\r\n\tBool glXMakeContextCurrent (Display *display, GLXDrawable draw, GLXDrawable read, GLXContext ctx)\r\n\tGLXDrawable glXGetCurrentReadDrawable (void)\r\n\tint glXQueryContext (Display *dpy, GLXContext ctx, int attribute, int *value)\r\n\tvoid glXSelectEvent (Display *dpy, GLXDrawable draw, unsigned long event_mask)\r\n\tvoid glXGetSelectedEvent (Display *dpy, GLXDrawable draw, unsigned long *event_mask)\r\n\ttypedef XID GLXWindow\r\n\ttypedef XID GLXPbuffer\r\n\ttypedef XID GLXFBConfigID\r\n\ttypedef struct __GLXFBConfigRec *GLXFBConfig\r\n\ttypedef struct {  int event_type;   int draw_type;   unsigned long serial;   Bool send_event;   Display *display;   GLXDrawable drawable;   unsigned int buffer_mask;   unsigned int aux_buffer;   int x, y;   int width, height;   int count; } GLXPbufferClobberEvent;\r\n\ttypedef union __GLXEvent {  GLXPbufferClobberEvent glxpbufferclobber;   long pad[24]; } GLXEvent;\r\n"
  },
  {
    "path": "libs/glew/auto/core/GLX_VERSION_1_4",
    "content": "GLX_VERSION_1_4\r\n\tGLX_SAMPLE_BUFFERS 100000\r\n\tGLX_SAMPLES 100001\r\n\textern void ( * glXGetProcAddress (const GLubyte *procName)) (void);\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_APPLE_float_pixels",
    "content": "GL_APPLE_float_pixels\r\nhttp://developer.apple.com/opengl/extensions/apple_float_pixels.html\r\n\tGL_HALF_APPLE 0x140B\r\n\tGL_COLOR_FLOAT_APPLE 0x8A0F\r\n\tGL_RGBA_FLOAT32_APPLE 0x8814\r\n\tGL_RGB_FLOAT32_APPLE 0x8815\r\n\tGL_ALPHA_FLOAT32_APPLE 0x8816\r\n\tGL_INTENSITY_FLOAT32_APPLE 0x8817\r\n\tGL_LUMINANCE_FLOAT32_APPLE 0x8818\r\n\tGL_LUMINANCE_ALPHA_FLOAT32_APPLE 0x8819\r\n\tGL_RGBA_FLOAT16_APPLE 0x881A\r\n\tGL_RGB_FLOAT16_APPLE 0x881B\r\n\tGL_ALPHA_FLOAT16_APPLE 0x881C\r\n\tGL_INTENSITY_FLOAT16_APPLE 0x881D\r\n\tGL_LUMINANCE_FLOAT16_APPLE 0x881E\r\n\tGL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881F\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_APPLE_pixel_buffer",
    "content": "GL_APPLE_pixel_buffer\r\n\tGL_MIN_PBUFFER_VIEWPORT_DIMS_APPLE 0x8A10\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_APPLE_texture_range",
    "content": "GL_APPLE_texture_range\r\nhttp://developer.apple.com/opengl/extensions/apple_texture_range.html\r\n\tGL_TEXTURE_STORAGE_HINT_APPLE 0x85BC\r\n\tGL_STORAGE_PRIVATE_APPLE 0x85BD\r\n\tGL_STORAGE_CACHED_APPLE 0x85BE\r\n\tGL_STORAGE_SHARED_APPLE 0x85BF\r\n\tGL_TEXTURE_RANGE_LENGTH_APPLE 0x85B7\r\n\tGL_TEXTURE_RANGE_POINTER_APPLE 0x85B8\r\n\tvoid glTextureRangeAPPLE (GLenum target, GLsizei length, GLvoid *pointer)\r\n\tvoid glGetTexParameterPointervAPPLE (GLenum target, GLenum pname, GLvoid **params)\r\n\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_ARB_imaging",
    "content": "GL_ARB_imaging\r\n\tGL_CONSTANT_COLOR 0x8001\r\n\tGL_ONE_MINUS_CONSTANT_COLOR 0x8002\r\n\tGL_CONSTANT_ALPHA 0x8003\r\n\tGL_ONE_MINUS_CONSTANT_ALPHA 0x8004\r\n\tGL_BLEND_COLOR 0x8005\r\n\tGL_FUNC_ADD 0x8006\r\n\tGL_MIN 0x8007\r\n\tGL_MAX 0x8008\r\n\tGL_BLEND_EQUATION 0x8009\r\n\tGL_FUNC_SUBTRACT 0x800A\r\n\tGL_FUNC_REVERSE_SUBTRACT 0x800B\r\n\tGL_CONVOLUTION_1D 0x8010\r\n\tGL_CONVOLUTION_2D 0x8011\r\n\tGL_SEPARABLE_2D 0x8012\r\n\tGL_CONVOLUTION_BORDER_MODE 0x8013\r\n\tGL_CONVOLUTION_FILTER_SCALE 0x8014\r\n\tGL_CONVOLUTION_FILTER_BIAS 0x8015\r\n\tGL_REDUCE 0x8016\r\n\tGL_CONVOLUTION_FORMAT 0x8017\r\n\tGL_CONVOLUTION_WIDTH 0x8018\r\n\tGL_CONVOLUTION_HEIGHT 0x8019\r\n\tGL_MAX_CONVOLUTION_WIDTH 0x801A\r\n\tGL_MAX_CONVOLUTION_HEIGHT 0x801B\r\n\tGL_POST_CONVOLUTION_RED_SCALE 0x801C\r\n\tGL_POST_CONVOLUTION_GREEN_SCALE 0x801D\r\n\tGL_POST_CONVOLUTION_BLUE_SCALE 0x801E\r\n\tGL_POST_CONVOLUTION_ALPHA_SCALE 0x801F\r\n\tGL_POST_CONVOLUTION_RED_BIAS 0x8020\r\n\tGL_POST_CONVOLUTION_GREEN_BIAS 0x8021\r\n\tGL_POST_CONVOLUTION_BLUE_BIAS 0x8022\r\n\tGL_POST_CONVOLUTION_ALPHA_BIAS 0x8023\r\n\tGL_HISTOGRAM 0x8024\r\n\tGL_PROXY_HISTOGRAM 0x8025\r\n\tGL_HISTOGRAM_WIDTH 0x8026\r\n\tGL_HISTOGRAM_FORMAT 0x8027\r\n\tGL_HISTOGRAM_RED_SIZE 0x8028\r\n\tGL_HISTOGRAM_GREEN_SIZE 0x8029\r\n\tGL_HISTOGRAM_BLUE_SIZE 0x802A\r\n\tGL_HISTOGRAM_ALPHA_SIZE 0x802B\r\n\tGL_HISTOGRAM_LUMINANCE_SIZE 0x802C\r\n\tGL_HISTOGRAM_SINK 0x802D\r\n\tGL_MINMAX 0x802E\r\n\tGL_MINMAX_FORMAT 0x802F\r\n\tGL_MINMAX_SINK 0x8030\r\n\tGL_TABLE_TOO_LARGE 0x8031\r\n\tGL_COLOR_MATRIX 0x80B1\r\n\tGL_COLOR_MATRIX_STACK_DEPTH 0x80B2\r\n\tGL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3\r\n\tGL_POST_COLOR_MATRIX_RED_SCALE 0x80B4\r\n\tGL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5\r\n\tGL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6\r\n\tGL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7\r\n\tGL_POST_COLOR_MATRIX_RED_BIAS 0x80B8\r\n\tGL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9\r\n\tGL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA\r\n\tGL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB\r\n\tGL_COLOR_TABLE 0x80D0\r\n\tGL_POST_CONVOLUTION_COLOR_TABLE 0x80D1\r\n\tGL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2\r\n\tGL_PROXY_COLOR_TABLE 0x80D3\r\n\tGL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4\r\n\tGL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5\r\n\tGL_COLOR_TABLE_SCALE 0x80D6\r\n\tGL_COLOR_TABLE_BIAS 0x80D7\r\n\tGL_COLOR_TABLE_FORMAT 0x80D8\r\n\tGL_COLOR_TABLE_WIDTH 0x80D9\r\n\tGL_COLOR_TABLE_RED_SIZE 0x80DA\r\n\tGL_COLOR_TABLE_GREEN_SIZE 0x80DB\r\n\tGL_COLOR_TABLE_BLUE_SIZE 0x80DC\r\n\tGL_COLOR_TABLE_ALPHA_SIZE 0x80DD\r\n\tGL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE\r\n\tGL_COLOR_TABLE_INTENSITY_SIZE 0x80DF\r\n\tGL_IGNORE_BORDER 0x8150\r\n\tGL_CONSTANT_BORDER 0x8151\r\n\tGL_WRAP_BORDER 0x8152\r\n\tGL_REPLICATE_BORDER 0x8153\r\n\tGL_CONVOLUTION_BORDER_COLOR 0x8154\r\n\tvoid glColorTable (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table)\r\n\tvoid glColorSubTable (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data)\r\n\tvoid glColorTableParameteriv (GLenum target, GLenum pname, const GLint *params)\r\n\tvoid glColorTableParameterfv (GLenum target, GLenum pname, const GLfloat *params)\r\n\tvoid glCopyColorSubTable (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width)\r\n\tvoid glCopyColorTable (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)\r\n\tvoid glGetColorTable (GLenum target, GLenum format, GLenum type, GLvoid *table)\r\n\tvoid glGetColorTableParameterfv (GLenum target, GLenum pname, GLfloat *params)\r\n\tvoid glGetColorTableParameteriv (GLenum target, GLenum pname, GLint *params)\r\n\tvoid glHistogram (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink)\r\n\tvoid glResetHistogram (GLenum target)\r\n\tvoid glGetHistogram (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)\r\n\tvoid glGetHistogramParameterfv (GLenum target, GLenum pname, GLfloat *params)\r\n\tvoid glGetHistogramParameteriv (GLenum target, GLenum pname, GLint *params)\r\n\tvoid glMinmax (GLenum target, GLenum internalformat, GLboolean sink)\r\n\tvoid glResetMinmax (GLenum target)\r\n\tvoid glGetMinmaxParameterfv (GLenum target, GLenum pname, GLfloat *params)\r\n\tvoid glGetMinmaxParameteriv (GLenum target, GLenum pname, GLint *params)\r\n\tvoid glConvolutionFilter1D (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image)\r\n\tvoid glConvolutionFilter2D (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image)\r\n\tvoid glConvolutionParameterf (GLenum target, GLenum pname, GLfloat params)\r\n\tvoid glConvolutionParameterfv (GLenum target, GLenum pname, const GLfloat *params)\r\n\tvoid glConvolutionParameteri (GLenum target, GLenum pname, GLint params)\r\n\tvoid glConvolutionParameteriv (GLenum target, GLenum pname, const GLint *params)\r\n\tvoid glCopyConvolutionFilter1D (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)\r\n\tvoid glCopyConvolutionFilter2D (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height)\r\n\tvoid glGetConvolutionFilter (GLenum target, GLenum format, GLenum type, GLvoid *image)\r\n\tvoid glGetConvolutionParameterfv (GLenum target, GLenum pname, GLfloat *params)\r\n\tvoid glGetConvolutionParameteriv (GLenum target, GLenum pname, GLint *params)\r\n\tvoid glSeparableFilter2D (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column)\r\n\tvoid glGetSeparableFilter (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span)\r\n\tvoid glGetMinmax (GLenum target, GLboolean reset, GLenum format, GLenum types, GLvoid *values)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_ARB_matrix_palette",
    "content": "GL_ARB_matrix_palette\r\nhttp://oss.sgi.com/projects/ogl-sample/registry/ARB/matrix_palette.txt\r\n\tGL_MATRIX_PALETTE_ARB 0x8840\r\n\tGL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841\r\n\tGL_MAX_PALETTE_MATRICES_ARB 0x8842\r\n\tGL_CURRENT_PALETTE_MATRIX_ARB 0x8843\r\n\tGL_MATRIX_INDEX_ARRAY_ARB 0x8844\r\n\tGL_CURRENT_MATRIX_INDEX_ARB 0x8845\r\n\tGL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846\r\n\tGL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847\r\n\tGL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848\r\n\tGL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849\r\n\tvoid glCurrentPaletteMatrixARB (GLint index)\r\n\tvoid glMatrixIndexPointerARB (GLint size, GLenum type, GLsizei stride, GLvoid *pointer)\r\n\tvoid glMatrixIndexubvARB (GLint size, GLubyte *indices)\r\n\tvoid glMatrixIndexusvARB (GLint size, GLushort *indices)\r\n\tvoid glMatrixIndexuivARB (GLint size, GLuint *indices)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_ARB_multitexture",
    "content": "GL_ARB_multitexture\r\nhttp://oss.sgi.com/projects/ogl-sample/registry/ARB/multitexture.txt\r\n\tGL_TEXTURE0_ARB 0x84C0\r\n\tGL_TEXTURE1_ARB 0x84C1\r\n\tGL_TEXTURE2_ARB 0x84C2\r\n\tGL_TEXTURE3_ARB 0x84C3\r\n\tGL_TEXTURE4_ARB 0x84C4\r\n\tGL_TEXTURE5_ARB 0x84C5\r\n\tGL_TEXTURE6_ARB 0x84C6\r\n\tGL_TEXTURE7_ARB 0x84C7\r\n\tGL_TEXTURE8_ARB 0x84C8\r\n\tGL_TEXTURE9_ARB 0x84C9\r\n\tGL_TEXTURE10_ARB 0x84CA\r\n\tGL_TEXTURE11_ARB 0x84CB\r\n\tGL_TEXTURE12_ARB 0x84CC\r\n\tGL_TEXTURE13_ARB 0x84CD\r\n\tGL_TEXTURE14_ARB 0x84CE\r\n\tGL_TEXTURE15_ARB 0x84CF\r\n\tGL_TEXTURE16_ARB 0x84D0\r\n\tGL_TEXTURE17_ARB 0x84D1\r\n\tGL_TEXTURE18_ARB 0x84D2\r\n\tGL_TEXTURE19_ARB 0x84D3\r\n\tGL_TEXTURE20_ARB 0x84D4\r\n\tGL_TEXTURE21_ARB 0x84D5\r\n\tGL_TEXTURE22_ARB 0x84D6\r\n\tGL_TEXTURE23_ARB 0x84D7\r\n\tGL_TEXTURE24_ARB 0x84D8\r\n\tGL_TEXTURE25_ARB 0x84D9\r\n\tGL_TEXTURE26_ARB 0x84DA\r\n\tGL_TEXTURE27_ARB 0x84DB\r\n\tGL_TEXTURE28_ARB 0x84DC\r\n\tGL_TEXTURE29_ARB 0x84DD\r\n\tGL_TEXTURE30_ARB 0x84DE\r\n\tGL_TEXTURE31_ARB 0x84DF\r\n\tGL_ACTIVE_TEXTURE_ARB 0x84E0\r\n\tGL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1\r\n\tGL_MAX_TEXTURE_UNITS_ARB 0x84E2\r\n\tvoid glActiveTextureARB (GLenum texture)\r\n\tvoid glClientActiveTextureARB (GLenum texture)\r\n\tvoid glMultiTexCoord1dARB (GLenum target, GLdouble s)\r\n\tvoid glMultiTexCoord1dvARB (GLenum target, const GLdouble *v)\r\n\tvoid glMultiTexCoord1fARB (GLenum target, GLfloat s)\r\n\tvoid glMultiTexCoord1fvARB (GLenum target, const GLfloat *v)\r\n\tvoid glMultiTexCoord1iARB (GLenum target, GLint s)\r\n\tvoid glMultiTexCoord1ivARB (GLenum target, const GLint *v)\r\n\tvoid glMultiTexCoord1sARB (GLenum target, GLshort s)\r\n\tvoid glMultiTexCoord1svARB (GLenum target, const GLshort *v)\r\n\tvoid glMultiTexCoord2dARB (GLenum target, GLdouble s, GLdouble t)\r\n\tvoid glMultiTexCoord2dvARB (GLenum target, const GLdouble *v)\r\n\tvoid glMultiTexCoord2fARB (GLenum target, GLfloat s, GLfloat t)\r\n\tvoid glMultiTexCoord2fvARB (GLenum target, const GLfloat *v)\r\n\tvoid glMultiTexCoord2iARB (GLenum target, GLint s, GLint t)\r\n\tvoid glMultiTexCoord2ivARB (GLenum target, const GLint *v)\r\n\tvoid glMultiTexCoord2sARB (GLenum target, GLshort s, GLshort t)\r\n\tvoid glMultiTexCoord2svARB (GLenum target, const GLshort *v)\r\n\tvoid glMultiTexCoord3dARB (GLenum target, GLdouble s, GLdouble t, GLdouble r)\r\n\tvoid glMultiTexCoord3dvARB (GLenum target, const GLdouble *v)\r\n\tvoid glMultiTexCoord3fARB (GLenum target, GLfloat s, GLfloat t, GLfloat r)\r\n\tvoid glMultiTexCoord3fvARB (GLenum target, const GLfloat *v)\r\n\tvoid glMultiTexCoord3iARB (GLenum target, GLint s, GLint t, GLint r)\r\n\tvoid glMultiTexCoord3ivARB (GLenum target, const GLint *v)\r\n\tvoid glMultiTexCoord3sARB (GLenum target, GLshort s, GLshort t, GLshort r)\r\n\tvoid glMultiTexCoord3svARB (GLenum target, const GLshort *v)\r\n\tvoid glMultiTexCoord4dARB (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)\r\n\tvoid glMultiTexCoord4dvARB (GLenum target, const GLdouble *v)\r\n\tvoid glMultiTexCoord4fARB (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)\r\n\tvoid glMultiTexCoord4fvARB (GLenum target, const GLfloat *v)\r\n\tvoid glMultiTexCoord4iARB (GLenum target, GLint s, GLint t, GLint r, GLint q)\r\n\tvoid glMultiTexCoord4ivARB (GLenum target, const GLint *v)\r\n\tvoid glMultiTexCoord4sARB (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)\r\n\tvoid glMultiTexCoord4svARB (GLenum target, const GLshort *v)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_ARB_vertex_blend",
    "content": "GL_ARB_vertex_blend\r\nhttp://oss.sgi.com/projects/ogl-sample/registry/ARB/vertex_blend.txt\r\n\tGL_MAX_VERTEX_UNITS_ARB 0x86A4\r\n\tGL_ACTIVE_VERTEX_UNITS_ARB 0x86A5\r\n\tGL_WEIGHT_SUM_UNITY_ARB 0x86A6\r\n\tGL_VERTEX_BLEND_ARB 0x86A7\r\n\tGL_CURRENT_WEIGHT_ARB 0x86A8\r\n\tGL_WEIGHT_ARRAY_TYPE_ARB 0x86A9\r\n\tGL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA\r\n\tGL_WEIGHT_ARRAY_SIZE_ARB 0x86AB\r\n\tGL_WEIGHT_ARRAY_POINTER_ARB 0x86AC\r\n\tGL_WEIGHT_ARRAY_ARB 0x86AD\r\n\tGL_MODELVIEW0_ARB 0x1700\r\n\tGL_MODELVIEW1_ARB 0x850A\r\n\tGL_MODELVIEW2_ARB 0x8722\r\n\tGL_MODELVIEW3_ARB 0x8723\r\n\tGL_MODELVIEW4_ARB 0x8724\r\n\tGL_MODELVIEW5_ARB 0x8725\r\n\tGL_MODELVIEW6_ARB 0x8726\r\n\tGL_MODELVIEW7_ARB 0x8727\r\n\tGL_MODELVIEW8_ARB 0x8728\r\n\tGL_MODELVIEW9_ARB 0x8729\r\n\tGL_MODELVIEW10_ARB 0x872A\r\n\tGL_MODELVIEW11_ARB 0x872B\r\n\tGL_MODELVIEW12_ARB 0x872C\r\n\tGL_MODELVIEW13_ARB 0x872D\r\n\tGL_MODELVIEW14_ARB 0x872E\r\n\tGL_MODELVIEW15_ARB 0x872F\r\n\tGL_MODELVIEW16_ARB 0x8730\r\n\tGL_MODELVIEW17_ARB 0x8731\r\n\tGL_MODELVIEW18_ARB 0x8732\r\n\tGL_MODELVIEW19_ARB 0x8733\r\n\tGL_MODELVIEW20_ARB 0x8734\r\n\tGL_MODELVIEW21_ARB 0x8735\r\n\tGL_MODELVIEW22_ARB 0x8736\r\n\tGL_MODELVIEW23_ARB 0x8737\r\n\tGL_MODELVIEW24_ARB 0x8738\r\n\tGL_MODELVIEW25_ARB 0x8739\r\n\tGL_MODELVIEW26_ARB 0x873A\r\n\tGL_MODELVIEW27_ARB 0x873B\r\n\tGL_MODELVIEW28_ARB 0x873C\r\n\tGL_MODELVIEW29_ARB 0x873D\r\n\tGL_MODELVIEW30_ARB 0x873E\r\n\tGL_MODELVIEW31_ARB 0x873F\r\n\tvoid glWeightbvARB (GLint size, GLbyte *weights)\r\n\tvoid glWeightsvARB (GLint size, GLshort *weights)\r\n\tvoid glWeightivARB (GLint size, GLint *weights)\r\n\tvoid glWeightfvARB (GLint size, GLfloat *weights)\r\n\tvoid glWeightdvARB (GLint size, GLdouble *weights)\r\n\tvoid glWeightubvARB (GLint size, GLubyte *weights)\r\n\tvoid glWeightusvARB (GLint size, GLushort *weights)\r\n\tvoid glWeightuivARB (GLint size, GLuint *weights)\r\n\tvoid glWeightPointerARB (GLint size, GLenum type, GLsizei stride, GLvoid *pointer)\r\n\tvoid glVertexBlendARB (GLint count)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_ATIX_point_sprites",
    "content": "GL_ATIX_point_sprites\r\nhttp://www.ati.com/developer/atiopengl.pdf\r\n\tGL_TEXTURE_POINT_MODE_ATIX 0x60B0\r\n\tGL_TEXTURE_POINT_ONE_COORD_ATIX 0x60B1\r\n\tGL_TEXTURE_POINT_SPRITE_ATIX 0x60B2\r\n\tGL_POINT_SPRITE_CULL_MODE_ATIX 0x60B3\r\n\tGL_POINT_SPRITE_CULL_CENTER_ATIX 0x60B4\r\n\tGL_POINT_SPRITE_CULL_CLIP_ATIX 0x60B5\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_ATIX_texture_env_combine3",
    "content": "GL_ATIX_texture_env_combine3\r\nhttp://www.ati.com/developer/atiopengl.pdf\r\n\tGL_MODULATE_ADD_ATIX 0x8744\r\n\tGL_MODULATE_SIGNED_ADD_ATIX 0x8745\r\n\tGL_MODULATE_SUBTRACT_ATIX 0x8746\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_ATIX_texture_env_route",
    "content": "GL_ATIX_texture_env_route\r\nhttp://www.ati.com/developer/sdk/RadeonSDK/Html/Info/ATIX_texture_env_route.txt\r\n\tGL_SECONDARY_COLOR_ATIX 0x8747\r\n\tGL_TEXTURE_OUTPUT_RGB_ATIX 0x8748\r\n\tGL_TEXTURE_OUTPUT_ALPHA_ATIX 0x8749\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_ATIX_vertex_shader_output_point_size",
    "content": "GL_ATIX_vertex_shader_output_point_size\r\nhttp://www.ati.com/developer/atiopengl.pdf\r\n\tGL_OUTPUT_POINT_SIZE_ATIX 0x610E\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_ATI_envmap_bumpmap",
    "content": "GL_ATI_envmap_bumpmap\r\nhttp://oss.sgi.com/projects/ogl-sample/registry/ATI/envmap_bumpmap.txt\r\n\tGL_BUMP_ROT_MATRIX_ATI 0x8775\r\n\tGL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776\r\n\tGL_BUMP_NUM_TEX_UNITS_ATI 0x8777\r\n\tGL_BUMP_TEX_UNITS_ATI 0x8778\r\n\tGL_DUDV_ATI 0x8779\r\n\tGL_DU8DV8_ATI 0x877A\r\n\tGL_BUMP_ENVMAP_ATI 0x877B\r\n\tGL_BUMP_TARGET_ATI 0x877C\r\n\tvoid glTexBumpParameterivATI (GLenum pname, GLint *param)\r\n\tvoid glTexBumpParameterfvATI (GLenum pname, GLfloat *param)\r\n\tvoid glGetTexBumpParameterivATI (GLenum pname, GLint *param)\r\n\tvoid glGetTexBumpParameterfvATI (GLenum pname, GLfloat *param)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_ATI_map_object_buffer",
    "content": "GL_ATI_map_object_buffer\r\nhttp://www.ati.com/developer/sdk/RADEONSDK/Html/Info/ATI_map_object_buffer.txt\r\n\tvoid* glMapObjectBufferATI (GLuint buffer)\r\n\tvoid glUnmapObjectBufferATI (GLuint buffer)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_ATI_pn_triangles",
    "content": "GL_ATI_pn_triangles\r\nhttp://www.ati.com/developer/sdk/RADEONSDK/Html/Info/ati_pn_triangles.txt\r\n\tGL_PN_TRIANGLES_ATI 0x87F0\r\n\tGL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1\r\n\tGL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2\r\n\tGL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3\r\n\tGL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4\r\n\tGL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5\r\n\tGL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6\r\n\tGL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7\r\n\tGL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8\r\n\tvoid glPNTrianglesiATI (GLenum pname, GLint param)\r\n\tvoid glPNTrianglesfATI (GLenum pname, GLfloat param)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_ATI_separate_stencil",
    "content": "GL_ATI_separate_stencil\r\nhttp://www.ati.com/developer/sdk/RadeonSDK/Html/Info/ATI_separate_stencil.txt\r\n\tGL_STENCIL_BACK_FUNC_ATI 0x8800\r\n\tGL_STENCIL_BACK_FAIL_ATI 0x8801\r\n\tGL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802\r\n\tGL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803\r\n\tvoid glStencilOpSeparateATI (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)\r\n\tvoid glStencilFuncSeparateATI (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_ATI_shader_texture_lod",
    "content": "GL_ATI_shader_texture_lod\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_ATI_texture_compression_3dc",
    "content": "GL_ATI_texture_compression_3dc\r\n\tGL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI 0x8837\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_ATI_vertex_streams",
    "content": "GL_ATI_vertex_streams\r\nhttp://www.ati.com/developer/sdk/RADEONSDK/Html/Info/ATI_vertex_streams.txt\r\n\tGL_MAX_VERTEX_STREAMS_ATI 0x876B\r\n\tGL_VERTEX_SOURCE_ATI 0x876C\r\n\tGL_VERTEX_STREAM0_ATI 0x876D\r\n\tGL_VERTEX_STREAM1_ATI 0x876E\r\n\tGL_VERTEX_STREAM2_ATI 0x876F\r\n\tGL_VERTEX_STREAM3_ATI 0x8770\r\n\tGL_VERTEX_STREAM4_ATI 0x8771\r\n\tGL_VERTEX_STREAM5_ATI 0x8772\r\n\tGL_VERTEX_STREAM6_ATI 0x8773\r\n\tGL_VERTEX_STREAM7_ATI 0x8774\r\n\tvoid glClientActiveVertexStreamATI (GLenum stream)\r\n\tvoid glVertexBlendEnviATI (GLenum pname, GLint param)\r\n\tvoid glVertexBlendEnvfATI (GLenum pname, GLfloat param)\r\n\tvoid glVertexStream2sATI (GLenum stream, GLshort x, GLshort y)\r\n\tvoid glVertexStream2svATI (GLenum stream, const GLshort *v)\r\n\tvoid glVertexStream2iATI (GLenum stream, GLint x, GLint y)\r\n\tvoid glVertexStream2ivATI (GLenum stream, const GLint *v)\r\n\tvoid glVertexStream2fATI (GLenum stream, GLfloat x, GLfloat y)\r\n\tvoid glVertexStream2fvATI (GLenum stream, const GLfloat *v)\r\n\tvoid glVertexStream2dATI (GLenum stream, GLdouble x, GLdouble y)\r\n\tvoid glVertexStream2dvATI (GLenum stream, const GLdouble *v)\r\n\tvoid glVertexStream3sATI (GLenum stream, GLshort x, GLshort y, GLshort z)\r\n\tvoid glVertexStream3svATI (GLenum stream, const GLshort *v)\r\n\tvoid glVertexStream3iATI (GLenum stream, GLint x, GLint y, GLint z)\r\n\tvoid glVertexStream3ivATI (GLenum stream, const GLint *v)\r\n\tvoid glVertexStream3fATI (GLenum stream, GLfloat x, GLfloat y, GLfloat z)\r\n\tvoid glVertexStream3fvATI (GLenum stream, const GLfloat *v)\r\n\tvoid glVertexStream3dATI (GLenum stream, GLdouble x, GLdouble y, GLdouble z)\r\n\tvoid glVertexStream3dvATI (GLenum stream, const GLdouble *v)\r\n\tvoid glVertexStream4sATI (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w)\r\n\tvoid glVertexStream4svATI (GLenum stream, const GLshort *v)\r\n\tvoid glVertexStream4iATI (GLenum stream, GLint x, GLint y, GLint z, GLint w)\r\n\tvoid glVertexStream4ivATI (GLenum stream, const GLint *v)\r\n\tvoid glVertexStream4fATI (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w)\r\n\tvoid glVertexStream4fvATI (GLenum stream, const GLfloat *v)\r\n\tvoid glVertexStream4dATI (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w)\r\n\tvoid glVertexStream4dvATI (GLenum stream, const GLdouble *v)\r\n\tvoid glNormalStream3bATI (GLenum stream, GLbyte x, GLbyte y, GLbyte z)\r\n\tvoid glNormalStream3bvATI (GLenum stream, const GLbyte *v)\r\n\tvoid glNormalStream3sATI (GLenum stream, GLshort x, GLshort y, GLshort z)\r\n\tvoid glNormalStream3svATI (GLenum stream, const GLshort *v)\r\n\tvoid glNormalStream3iATI (GLenum stream, GLint x, GLint y, GLint z)\r\n\tvoid glNormalStream3ivATI (GLenum stream, const GLint *v)\r\n\tvoid glNormalStream3fATI (GLenum stream, GLfloat x, GLfloat y, GLfloat z)\r\n\tvoid glNormalStream3fvATI (GLenum stream, const GLfloat *v)\r\n\tvoid glNormalStream3dATI (GLenum stream, GLdouble x, GLdouble y, GLdouble z)\r\n\tvoid glNormalStream3dvATI (GLenum stream, const GLdouble *v)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_EXT_Cg_shader",
    "content": "GL_EXT_Cg_shader\r\nhttp://download.nvidia.com/developer/GLSL/GLSL%20Release%20Notes%20for%20Release%2060.pdf\r\n\tGL_CG_VERTEX_SHADER_EXT 0x890E\r\n\tGL_CG_FRAGMENT_SHADER_EXT 0x890F\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_EXT_bindable_uniform",
    "content": "GL_EXT_bindable_uniform\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_EXT_bindable_uniform.txt\r\n\tGL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT 0x8DE2\r\n\tGL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT 0x8DE3\r\n\tGL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT 0x8DE4\r\n\tGL_MAX_BINDABLE_UNIFORM_SIZE_EXT 0x8DED\r\n\tGL_UNIFORM_BUFFER_BINDING_EXT 0x8DEF\r\n\tGL_UNIFORM_BUFFER_EXT 0x8DEE\r\n\tvoid glUniformBufferEXT (GLuint program, GLint location, GLuint buffer)\r\n\tGLint glGetUniformBufferSizeEXT (GLuint program, GLint location)\r\n\tGLintptr glGetUniformOffsetEXT (GLuint program, GLint location)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_EXT_depth_bounds_test",
    "content": "GL_EXT_depth_bounds_test\r\nhttp://www.nvidia.com/dev_content/nvopenglspecs/GL_EXT_depth_bounds_test.txt\r\n\tGL_DEPTH_BOUNDS_TEST_EXT 0x8890\r\n\tGL_DEPTH_BOUNDS_EXT 0x8891\r\n\tvoid glDepthBoundsEXT (GLclampd zmin, GLclampd zmax)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_EXT_draw_instanced",
    "content": "GL_EXT_draw_instanced\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_EXT_draw_instanced.txt\r\n\tvoid glDrawArraysInstancedEXT (GLenum mode, GLint start, GLsizei count, GLsizei primcount)\r\n\tvoid glDrawElementsInstancedEXT (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_EXT_draw_range_elements",
    "content": "GL_EXT_draw_range_elements\r\nhttp://oss.sgi.com/projects/ogl-sample/registry/EXT/draw_range_elements.txt\r\n\tGL_MAX_ELEMENTS_VERTICES 0x80E8\r\n\tGL_MAX_ELEMENTS_INDICES 0x80E9\r\n\tvoid glDrawRangeElementsEXT (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_EXT_fog_coord",
    "content": "GL_EXT_fog_coord\r\nhttp://oss.sgi.com/projects/ogl-sample/registry/EXT/fog_coord.txt\r\n\tGL_FOG_COORDINATE_SOURCE_EXT 0x8450\r\n\tGL_FOG_COORDINATE_EXT 0x8451\r\n\tGL_FRAGMENT_DEPTH_EXT 0x8452\r\n\tGL_CURRENT_FOG_COORDINATE_EXT 0x8453\r\n\tGL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454\r\n\tGL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455\r\n\tGL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456\r\n\tGL_FOG_COORDINATE_ARRAY_EXT 0x8457\r\n\tvoid glFogCoordfEXT (GLfloat coord)\r\n\tvoid glFogCoordfvEXT (const GLfloat *coord)\r\n\tvoid glFogCoorddEXT (GLdouble coord)\r\n\tvoid glFogCoorddvEXT (const GLdouble *coord)\r\n\tvoid glFogCoordPointerEXT (GLenum type, GLsizei stride, const GLvoid *pointer)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_EXT_framebuffer_sRGB",
    "content": "GL_EXT_framebuffer_sRGB\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_EXT_framebuffer_sRGB.txt\r\n\tGL_FRAMEBUFFER_SRGB_EXT 0x8DB9\r\n\tGL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_EXT_geometry_shader4",
    "content": "GL_EXT_geometry_shader4\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_EXT_geometry_shader4.txt\r\n\tGL_GEOMETRY_SHADER_EXT 0x8DD9\r\n\tGL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD\r\n\tGL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE\r\n\tGL_MAX_VARYING_COMPONENTS_EXT 0x8B4B\r\n\tGL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF\r\n\tGL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0\r\n\tGL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1\r\n\tGL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA\r\n\tGL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB\r\n\tGL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC\r\n\tGL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29\r\n\tGL_LINES_ADJACENCY_EXT 0xA\r\n\tGL_LINE_STRIP_ADJACENCY_EXT 0xB\r\n\tGL_TRIANGLES_ADJACENCY_EXT 0xC\r\n\tGL_TRIANGLE_STRIP_ADJACENCY_EXT 0xD\r\n\tGL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7\r\n\tGL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8\r\n\tGL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9\r\n\tGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4\r\n\tGL_PROGRAM_POINT_SIZE_EXT 0x8642\r\n\tvoid glProgramParameteriEXT (GLuint program, GLenum pname, GLint value)\r\n\tvoid glFramebufferTextureEXT (GLenum target, GLenum attachment, GLuint texture, GLint level)\r\n\tvoid glFramebufferTextureLayerEXT (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)\r\n\tvoid glFramebufferTextureFaceEXT (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_EXT_gpu_program_parameters",
    "content": "GL_EXT_gpu_program_parameters\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_EXT_gpu_program_parameters.txt\r\n\tvoid glProgramEnvParameters4fvEXT (GLenum target, GLuint index, GLsizei count, const GLfloat* params)\r\n\tvoid glProgramLocalParameters4fvEXT (GLenum target, GLuint index, GLsizei count, const GLfloat* params)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_EXT_gpu_shader4",
    "content": "GL_EXT_gpu_shader4\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_EXT_gpu_shader4.txt\r\n\tGL_SAMPLER_1D_ARRAY_EXT 0x8DC0\r\n\tGL_SAMPLER_2D_ARRAY_EXT 0x8DC1\r\n\tGL_SAMPLER_BUFFER_EXT 0x8DC2\r\n\tGL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8DC3\r\n\tGL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8DC4\r\n\tGL_SAMPLER_CUBE_SHADOW_EXT 0x8DC5\r\n\tGL_UNSIGNED_INT_VEC2_EXT 0x8DC6\r\n\tGL_UNSIGNED_INT_VEC3_EXT 0x8DC7\r\n\tGL_UNSIGNED_INT_VEC4_EXT 0x8DC8\r\n\tGL_INT_SAMPLER_1D_EXT 0x8DC9\r\n\tGL_INT_SAMPLER_2D_EXT 0x8DCA\r\n\tGL_INT_SAMPLER_3D_EXT 0x8DCB\r\n\tGL_INT_SAMPLER_CUBE_EXT 0x8DCC\r\n\tGL_INT_SAMPLER_2D_RECT_EXT 0x8DCD\r\n\tGL_INT_SAMPLER_1D_ARRAY_EXT 0x8DCE\r\n\tGL_INT_SAMPLER_2D_ARRAY_EXT 0x8DCF\r\n\tGL_INT_SAMPLER_BUFFER_EXT 0x8DD0\r\n\tGL_UNSIGNED_INT_SAMPLER_1D_EXT 0x8DD1\r\n\tGL_UNSIGNED_INT_SAMPLER_2D_EXT 0x8DD2\r\n\tGL_UNSIGNED_INT_SAMPLER_3D_EXT 0x8DD3\r\n\tGL_UNSIGNED_INT_SAMPLER_CUBE_EXT 0x8DD4\r\n\tGL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8DD5\r\n\tGL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8DD6\r\n\tGL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8DD7\r\n\tGL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8\r\n\tGL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT 0x88FD\r\n\tvoid glGetUniformuivEXT (GLuint program, GLint location, GLuint *params)\r\n\tvoid glBindFragDataLocationEXT (GLuint program, GLuint color, const GLchar *name)\r\n\tGLint glGetFragDataLocationEXT (GLuint program, const GLchar *name)\r\n\tvoid glUniform1uiEXT (GLint location, GLuint v0)\r\n\tvoid glUniform2uiEXT (GLint location, GLuint v0, GLuint v1)\r\n\tvoid glUniform3uiEXT (GLint location, GLuint v0, GLuint v1, GLuint v2)\r\n\tvoid glUniform4uiEXT (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)\r\n\tvoid glUniform1uivEXT (GLint location, GLsizei count, const GLuint *value)\r\n\tvoid glUniform2uivEXT (GLint location, GLsizei count, const GLuint *value)\r\n\tvoid glUniform3uivEXT (GLint location, GLsizei count, const GLuint *value)\r\n\tvoid glUniform4uivEXT (GLint location, GLsizei count, const GLuint *value)\r\n\tvoid glVertexAttribI1iEXT (GLuint index, GLint x)\r\n\tvoid glVertexAttribI2iEXT (GLuint index, GLint x, GLint y)\r\n\tvoid glVertexAttribI3iEXT (GLuint index, GLint x, GLint y, GLint z)\r\n\tvoid glVertexAttribI4iEXT (GLuint index, GLint x, GLint y, GLint z, GLint w)\r\n\tvoid glVertexAttribI1uiEXT (GLuint index, GLuint x)\r\n\tvoid glVertexAttribI2uiEXT (GLuint index, GLuint x, GLuint y)\r\n\tvoid glVertexAttribI3uiEXT (GLuint index, GLuint x, GLuint y, GLuint z)\r\n\tvoid glVertexAttribI4uiEXT (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)\r\n\tvoid glVertexAttribI1ivEXT (GLuint index, const GLint *v)\r\n\tvoid glVertexAttribI2ivEXT (GLuint index, const GLint *v)\r\n\tvoid glVertexAttribI3ivEXT (GLuint index, const GLint *v)\r\n\tvoid glVertexAttribI4ivEXT (GLuint index, const GLint *v)\r\n\tvoid glVertexAttribI1uivEXT (GLuint index, const GLuint *v)\r\n\tvoid glVertexAttribI2uivEXT (GLuint index, const GLuint *v)\r\n\tvoid glVertexAttribI3uivEXT (GLuint index, const GLuint *v)\r\n\tvoid glVertexAttribI4uivEXT (GLuint index, const GLuint *v)\r\n\tvoid glVertexAttribI4bvEXT (GLuint index, const GLbyte *v)\r\n\tvoid glVertexAttribI4svEXT (GLuint index, const GLshort *v)\r\n\tvoid glVertexAttribI4ubvEXT (GLuint index, const GLubyte *v)\r\n\tvoid glVertexAttribI4usvEXT (GLuint index, const GLushort *v)\r\n\tvoid glVertexAttribIPointerEXT (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)\r\n\tvoid glGetVertexAttribIivEXT (GLuint index, GLenum pname, GLint *params)\r\n\tvoid glGetVertexAttribIuivEXT (GLuint index, GLenum pname, GLuint *params)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_EXT_packed_float",
    "content": "GL_EXT_packed_float\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_EXT_packed_float.txt\r\n\tGL_R11F_G11F_B10F_EXT 0x8C3A\r\n\tGL_UNSIGNED_INT_10F_11F_11F_REV_EXT 0x8C3B\r\n\tGL_RGBA_SIGNED_COMPONENTS_EXT 0x8C3C\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_EXT_pixel_buffer_object",
    "content": "GL_EXT_pixel_buffer_object\r\nhttp://www.nvidia.com/dev_content/nvopenglspecs/GL_EXT_pixel_buffer_object.txt\r\n\tGL_PIXEL_PACK_BUFFER_EXT 0x88EB\r\n\tGL_PIXEL_UNPACK_BUFFER_EXT 0x88EC\r\n\tGL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED\r\n\tGL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_EXT_secondary_color",
    "content": "GL_EXT_secondary_color\r\nhttp://oss.sgi.com/projects/ogl-sample/registry/EXT/secondary_color.txt\r\n\tGL_COLOR_SUM_EXT 0x8458\r\n\tGL_CURRENT_SECONDARY_COLOR_EXT 0x8459\r\n\tGL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A\r\n\tGL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B\r\n\tGL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C\r\n\tGL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D\r\n\tGL_SECONDARY_COLOR_ARRAY_EXT 0x845E\r\n\tvoid glSecondaryColor3bEXT (GLbyte red, GLbyte green, GLbyte blue)\r\n\tvoid glSecondaryColor3bvEXT (const GLbyte *v)\r\n\tvoid glSecondaryColor3dEXT (GLdouble red, GLdouble green, GLdouble blue)\r\n\tvoid glSecondaryColor3dvEXT (const GLdouble *v)\r\n\tvoid glSecondaryColor3fEXT (GLfloat red, GLfloat green, GLfloat blue)\r\n\tvoid glSecondaryColor3fvEXT (const GLfloat *v)\r\n\tvoid glSecondaryColor3iEXT (GLint red, GLint green, GLint blue)\r\n\tvoid glSecondaryColor3ivEXT (const GLint *v)\r\n\tvoid glSecondaryColor3sEXT (GLshort red, GLshort green, GLshort blue)\r\n\tvoid glSecondaryColor3svEXT (const GLshort *v)\r\n\tvoid glSecondaryColor3ubEXT (GLubyte red, GLubyte green, GLubyte blue)\r\n\tvoid glSecondaryColor3ubvEXT (const GLubyte *v)\r\n\tvoid glSecondaryColor3uiEXT (GLuint red, GLuint green, GLuint blue)\r\n\tvoid glSecondaryColor3uivEXT (const GLuint *v)\r\n\tvoid glSecondaryColor3usEXT (GLushort red, GLushort green, GLushort blue)\r\n\tvoid glSecondaryColor3usvEXT (const GLushort *v)\r\n\tvoid glSecondaryColorPointerEXT (GLint size, GLenum type, GLsizei stride, GLvoid *pointer)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_EXT_texture_array",
    "content": "GL_EXT_texture_array\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_EXT_texture_array.txt\r\n\tGL_TEXTURE_1D_ARRAY_EXT 0x8C18\r\n\tGL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19\r\n\tGL_TEXTURE_2D_ARRAY_EXT 0x8C1A\r\n\tGL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B\r\n\tGL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C\r\n\tGL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D\r\n\tGL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF\r\n\tGL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_EXT_texture_buffer_object",
    "content": "GL_EXT_texture_buffer_object\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_EXT_texture_buffer_object.txt\r\n\tGL_TEXTURE_BUFFER_EXT 0x8C2A\r\n\tGL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B\r\n\tGL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C\r\n\tGL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D\r\n\tGL_TEXTURE_BUFFER_FORMAT_EXT 0x8C2E\r\n\tvoid glTexBufferEXT (GLenum target, GLenum internalformat, GLuint buffer)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_EXT_texture_compression_latc",
    "content": "GL_EXT_texture_compression_latc\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_EXT_texture_compression_latc.txt\r\n\tGL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70\r\n\tGL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT 0x8C71\r\n\tGL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72\r\n\tGL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT 0x8C73\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_EXT_texture_compression_rgtc",
    "content": "GL_EXT_texture_compression_rgtc\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_EXT_texture_compression_rgtc.txt\r\n\tGL_COMPRESSED_RED_RGTC1_EXT 0x8DBB\r\n\tGL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC\r\n\tGL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD\r\n\tGL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_EXT_texture_cube_map",
    "content": "GL_EXT_texture_cube_map\r\nhttp://www.nvidia.com/dev_content/nvopenglspecs/GL_EXT_texture_cube_map.txt\r\n\tGL_NORMAL_MAP_EXT 0x8511\r\n\tGL_REFLECTION_MAP_EXT 0x8512\r\n\tGL_TEXTURE_CUBE_MAP_EXT 0x8513\r\n\tGL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514\r\n\tGL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515\r\n\tGL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516\r\n\tGL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517\r\n\tGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518\r\n\tGL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519\r\n\tGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A\r\n\tGL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B\r\n\tGL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_EXT_texture_edge_clamp",
    "content": "GL_EXT_texture_edge_clamp\r\nhttp://www.opengl.org/developers/documentation/Version1.2/1.2specs/texture_edge_clamp.txt\r\n\tGL_CLAMP_TO_EDGE_EXT\t0x812F\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_EXT_texture_integer",
    "content": "GL_EXT_texture_integer\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_EXT_texture_integer.txt\r\n\tGL_RGBA32UI_EXT 0x8D70\r\n\tGL_RGB32UI_EXT 0x8D71\r\n\tGL_ALPHA32UI_EXT 0x8D72\r\n\tGL_INTENSITY32UI_EXT 0x8D73\r\n\tGL_LUMINANCE32UI_EXT 0x8D74\r\n\tGL_LUMINANCE_ALPHA32UI_EXT 0x8D75\r\n\tGL_RGBA16UI_EXT 0x8D76\r\n\tGL_RGB16UI_EXT 0x8D77\r\n\tGL_ALPHA16UI_EXT 0x8D78\r\n\tGL_INTENSITY16UI_EXT 0x8D79\r\n\tGL_LUMINANCE16UI_EXT 0x8D7A\r\n\tGL_LUMINANCE_ALPHA16UI_EXT 0x8D7B\r\n\tGL_RGBA8UI_EXT 0x8D7C\r\n\tGL_RGB8UI_EXT 0x8D7D\r\n\tGL_ALPHA8UI_EXT 0x8D7E\r\n\tGL_INTENSITY8UI_EXT 0x8D7F\r\n\tGL_LUMINANCE8UI_EXT 0x8D80\r\n\tGL_LUMINANCE_ALPHA8UI_EXT 0x8D81\r\n\tGL_RGBA32I_EXT 0x8D82\r\n\tGL_RGB32I_EXT 0x8D83\r\n\tGL_ALPHA32I_EXT 0x8D84\r\n\tGL_INTENSITY32I_EXT 0x8D85\r\n\tGL_LUMINANCE32I_EXT 0x8D86\r\n\tGL_LUMINANCE_ALPHA32I_EXT 0x8D87\r\n\tGL_RGBA16I_EXT 0x8D88\r\n\tGL_RGB16I_EXT 0x8D89\r\n\tGL_ALPHA16I_EXT 0x8D8A\r\n\tGL_INTENSITY16I_EXT 0x8D8B\r\n\tGL_LUMINANCE16I_EXT 0x8D8C\r\n\tGL_LUMINANCE_ALPHA16I_EXT 0x8D8D\r\n\tGL_RGBA8I_EXT 0x8D8E\r\n\tGL_RGB8I_EXT 0x8D8F\r\n\tGL_ALPHA8I_EXT 0x8D90\r\n\tGL_INTENSITY8I_EXT 0x8D91\r\n\tGL_LUMINANCE8I_EXT 0x8D92\r\n\tGL_LUMINANCE_ALPHA8I_EXT 0x8D93\r\n\tGL_RED_INTEGER_EXT 0x8D94\r\n\tGL_GREEN_INTEGER_EXT 0x8D95\r\n\tGL_BLUE_INTEGER_EXT 0x8D96\r\n\tGL_ALPHA_INTEGER_EXT 0x8D97\r\n\tGL_RGB_INTEGER_EXT 0x8D98\r\n\tGL_RGBA_INTEGER_EXT 0x8D99\r\n\tGL_BGR_INTEGER_EXT 0x8D9A\r\n\tGL_BGRA_INTEGER_EXT 0x8D9B\r\n\tGL_LUMINANCE_INTEGER_EXT 0x8D9C\r\n\tGL_LUMINANCE_ALPHA_INTEGER_EXT 0x8D9D\r\n\tGL_RGBA_INTEGER_MODE_EXT 0x8D9E\r\n\tvoid glTexParameterIivEXT (GLenum target, GLenum pname, const GLint *params)\r\n\tvoid glTexParameterIuivEXT (GLenum target, GLenum pname, const GLuint *params)\r\n\tvoid glGetTexParameterIivEXT (GLenum target, GLenum pname, GLint *params)\r\n\tvoid glGetTexParameterIuivEXT (GLenum target, GLenum pname, GLuint *params)\r\n\tvoid glClearColorIiEXT (GLint red, GLint green, GLint blue, GLint alpha)\r\n\tvoid glClearColorIuiEXT (GLuint red, GLuint green, GLuint blue, GLuint alpha)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_EXT_texture_rectangle",
    "content": "GL_EXT_texture_rectangle\r\nhttp://developer.apple.com/opengl/extensions/ext_texture_rectangle.html\r\n\tGL_TEXTURE_RECTANGLE_EXT 0x84F5\r\n\tGL_TEXTURE_BINDING_RECTANGLE_EXT 0x84F6\r\n\tGL_PROXY_TEXTURE_RECTANGLE_EXT 0x84F7\r\n\tGL_MAX_RECTANGLE_TEXTURE_SIZE_EXT 0x84F8\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_EXT_texture_shared_exponent",
    "content": "GL_EXT_texture_shared_exponent\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_EXT_texture_shared_exponent.txt\r\n\tGL_RGB9_E5_EXT 0x8C3D\r\n\tGL_UNSIGNED_INT_5_9_9_9_REV_EXT 0x8C3E\r\n\tGL_TEXTURE_SHARED_SIZE_EXT 0x8C3F\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_EXT_timer_query",
    "content": "GL_EXT_timer_query\r\nhttp://www.nvidia.com/dev_content/nvopenglspecs/GL_EXT_timer_query.txt\r\n\tGL_TIME_ELAPSED_EXT 0x88BF\r\n\tvoid glGetQueryObjecti64vEXT (GLuint id, GLenum pname, GLint64EXT *params)\r\n\tvoid glGetQueryObjectui64vEXT (GLuint id, GLenum pname, GLuint64EXT *params)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_EXT_vertex_shader",
    "content": "GL_EXT_vertex_shader\r\nhttp://oss.sgi.com/projects/ogl-sample/registry/EXT/vertex_shader.txt\r\n\tGL_VERTEX_SHADER_EXT 0x8780\r\n\tGL_VERTEX_SHADER_BINDING_EXT 0x8781\r\n\tGL_OP_INDEX_EXT 0x8782\r\n\tGL_OP_NEGATE_EXT 0x8783\r\n\tGL_OP_DOT3_EXT 0x8784\r\n\tGL_OP_DOT4_EXT 0x8785\r\n\tGL_OP_MUL_EXT 0x8786\r\n\tGL_OP_ADD_EXT 0x8787\r\n\tGL_OP_MADD_EXT 0x8788\r\n\tGL_OP_FRAC_EXT 0x8789\r\n\tGL_OP_MAX_EXT 0x878A\r\n\tGL_OP_MIN_EXT 0x878B\r\n\tGL_OP_SET_GE_EXT 0x878C\r\n\tGL_OP_SET_LT_EXT 0x878D\r\n\tGL_OP_CLAMP_EXT 0x878E\r\n\tGL_OP_FLOOR_EXT 0x878F\r\n\tGL_OP_ROUND_EXT 0x8790\r\n\tGL_OP_EXP_BASE_2_EXT 0x8791\r\n\tGL_OP_LOG_BASE_2_EXT 0x8792\r\n\tGL_OP_POWER_EXT 0x8793\r\n\tGL_OP_RECIP_EXT 0x8794\r\n\tGL_OP_RECIP_SQRT_EXT 0x8795\r\n\tGL_OP_SUB_EXT 0x8796\r\n\tGL_OP_CROSS_PRODUCT_EXT 0x8797\r\n\tGL_OP_MULTIPLY_MATRIX_EXT 0x8798\r\n\tGL_OP_MOV_EXT 0x8799\r\n\tGL_OUTPUT_VERTEX_EXT 0x879A\r\n\tGL_OUTPUT_COLOR0_EXT 0x879B\r\n\tGL_OUTPUT_COLOR1_EXT 0x879C\r\n\tGL_OUTPUT_TEXTURE_COORD0_EXT 0x879D\r\n\tGL_OUTPUT_TEXTURE_COORD1_EXT 0x879E\r\n\tGL_OUTPUT_TEXTURE_COORD2_EXT 0x879F\r\n\tGL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0\r\n\tGL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1\r\n\tGL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2\r\n\tGL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3\r\n\tGL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4\r\n\tGL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5\r\n\tGL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6\r\n\tGL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7\r\n\tGL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8\r\n\tGL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9\r\n\tGL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA\r\n\tGL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB\r\n\tGL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC\r\n\tGL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD\r\n\tGL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE\r\n\tGL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF\r\n\tGL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0\r\n\tGL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1\r\n\tGL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2\r\n\tGL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3\r\n\tGL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4\r\n\tGL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5\r\n\tGL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6\r\n\tGL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7\r\n\tGL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8\r\n\tGL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9\r\n\tGL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA\r\n\tGL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB\r\n\tGL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC\r\n\tGL_OUTPUT_FOG_EXT 0x87BD\r\n\tGL_SCALAR_EXT 0x87BE\r\n\tGL_VECTOR_EXT 0x87BF\r\n\tGL_MATRIX_EXT 0x87C0\r\n\tGL_VARIANT_EXT 0x87C1\r\n\tGL_INVARIANT_EXT 0x87C2\r\n\tGL_LOCAL_CONSTANT_EXT 0x87C3\r\n\tGL_LOCAL_EXT 0x87C4\r\n\tGL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5\r\n\tGL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6\r\n\tGL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7\r\n\tGL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8\r\n\tGL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9\r\n\tGL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA\r\n\tGL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB\r\n\tGL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CC\r\n\tGL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CD\r\n\tGL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE\r\n\tGL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF\r\n\tGL_VERTEX_SHADER_VARIANTS_EXT 0x87D0\r\n\tGL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1\r\n\tGL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2\r\n\tGL_VERTEX_SHADER_LOCALS_EXT 0x87D3\r\n\tGL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4\r\n\tGL_X_EXT 0x87D5\r\n\tGL_Y_EXT 0x87D6\r\n\tGL_Z_EXT 0x87D7\r\n\tGL_W_EXT 0x87D8\r\n\tGL_NEGATIVE_X_EXT 0x87D9\r\n\tGL_NEGATIVE_Y_EXT 0x87DA\r\n\tGL_NEGATIVE_Z_EXT 0x87DB\r\n\tGL_NEGATIVE_W_EXT 0x87DC\r\n\tGL_ZERO_EXT 0x87DD\r\n\tGL_ONE_EXT 0x87DE\r\n\tGL_NEGATIVE_ONE_EXT 0x87DF\r\n\tGL_NORMALIZED_RANGE_EXT 0x87E0\r\n\tGL_FULL_RANGE_EXT 0x87E1\r\n\tGL_CURRENT_VERTEX_EXT 0x87E2\r\n\tGL_MVP_MATRIX_EXT 0x87E3\r\n\tGL_VARIANT_VALUE_EXT 0x87E4\r\n\tGL_VARIANT_DATATYPE_EXT 0x87E5\r\n\tGL_VARIANT_ARRAY_STRIDE_EXT 0x87E6\r\n\tGL_VARIANT_ARRAY_TYPE_EXT 0x87E7\r\n\tGL_VARIANT_ARRAY_EXT 0x87E8\r\n\tGL_VARIANT_ARRAY_POINTER_EXT 0x87E9\r\n\tGL_INVARIANT_VALUE_EXT 0x87EA\r\n\tGL_INVARIANT_DATATYPE_EXT 0x87EB\r\n\tGL_LOCAL_CONSTANT_VALUE_EXT 0x87EC\r\n\tGL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED\r\n\r\n\tvoid glBeginVertexShaderEXT (void)\r\n\tvoid glEndVertexShaderEXT (void)\r\n\tvoid glBindVertexShaderEXT (GLuint id)\r\n\tGLuint glGenVertexShadersEXT (GLuint range)\r\n\tvoid glDeleteVertexShaderEXT (GLuint id)\r\n\tvoid glShaderOp1EXT (GLenum op, GLuint res, GLuint arg1)\r\n\tvoid glShaderOp2EXT (GLenum op, GLuint res, GLuint arg1, GLuint arg2)\r\n\tvoid glShaderOp3EXT (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3)\r\n\tvoid glSwizzleEXT (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW)\r\n\tvoid glWriteMaskEXT (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW)\r\n\tvoid glInsertComponentEXT (GLuint res, GLuint src, GLuint num)\r\n\tvoid glExtractComponentEXT (GLuint res, GLuint src, GLuint num)\r\n\tGLuint glGenSymbolsEXT (GLenum dataType, GLenum storageType, GLenum range, GLuint components)\r\n\tvoid glSetInvariantEXT (GLuint id, GLenum type, GLvoid *addr)\r\n\tvoid glSetLocalConstantEXT (GLuint id, GLenum type, GLvoid *addr)\r\n\tvoid glVariantbvEXT (GLuint id, GLbyte *addr)\r\n\tvoid glVariantsvEXT (GLuint id, GLshort *addr)\r\n\tvoid glVariantivEXT (GLuint id, GLint *addr)\r\n\tvoid glVariantfvEXT (GLuint id, GLfloat *addr)\r\n\tvoid glVariantdvEXT (GLuint id, GLdouble *addr)\r\n\tvoid glVariantubvEXT (GLuint id, GLubyte *addr)\r\n\tvoid glVariantusvEXT (GLuint id, GLushort *addr)\r\n\tvoid glVariantuivEXT (GLuint id, GLuint *addr)\r\n\tvoid glVariantPointerEXT (GLuint id, GLenum type, GLuint stride, GLvoid *addr)\r\n\tvoid glEnableVariantClientStateEXT (GLuint id)\r\n\tvoid glDisableVariantClientStateEXT (GLuint id)\r\n\tGLuint glBindLightParameterEXT (GLenum light, GLenum value)\r\n\tGLuint glBindMaterialParameterEXT (GLenum face, GLenum value)\r\n\tGLuint glBindTexGenParameterEXT (GLenum unit, GLenum coord, GLenum value)\r\n\tGLuint glBindTextureUnitParameterEXT (GLenum unit, GLenum value)\r\n\tGLuint glBindParameterEXT (GLenum value)\r\n\tGLboolean glIsVariantEnabledEXT (GLuint id, GLenum cap)\r\n\tvoid glGetVariantBooleanvEXT (GLuint id, GLenum value, GLboolean *data)\r\n\tvoid glGetVariantIntegervEXT (GLuint id, GLenum value, GLint *data)\r\n\tvoid glGetVariantFloatvEXT (GLuint id, GLenum value, GLfloat *data)\r\n\tvoid glGetVariantPointervEXT (GLuint id, GLenum value, GLvoid **data)\r\n\tvoid glGetInvariantBooleanvEXT (GLuint id, GLenum value, GLboolean *data)\r\n\tvoid glGetInvariantIntegervEXT (GLuint id, GLenum value, GLint *data)\r\n\tvoid glGetInvariantFloatvEXT (GLuint id, GLenum value, GLfloat *data)\r\n\tvoid glGetLocalConstantBooleanvEXT (GLuint id, GLenum value, GLboolean *data)\r\n\tvoid glGetLocalConstantIntegervEXT (GLuint id, GLenum value, GLint *data)\r\n\tvoid glGetLocalConstantFloatvEXT (GLuint id, GLenum value, GLfloat *data)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_KTX_buffer_region",
    "content": "GL_KTX_buffer_region\r\n\tGL_KTX_FRONT_REGION 0x0\r\n\tGL_KTX_BACK_REGION 0x1\r\n\tGL_KTX_Z_REGION 0x2\r\n\tGL_KTX_STENCIL_REGION 0x3\r\n\tGLuint glBufferRegionEnabledEXT (void)\r\n\tGLuint glNewBufferRegionEXT (GLenum region)\r\n\tvoid glDeleteBufferRegionEXT (GLenum region)\r\n\tvoid glReadBufferRegionEXT (GLuint region, GLint x, GLint y, GLsizei width, GLsizei height)\r\n\tvoid glDrawBufferRegionEXT (GLuint region, GLint x, GLint y, GLsizei width, GLsizei height, GLint xDest, GLint yDest)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_NV_depth_buffer_float",
    "content": "GL_NV_depth_buffer_float\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_NV_depth_buffer_float.txt\r\n\tGL_DEPTH_COMPONENT32F_NV 0x8DAB\r\n\tGL_DEPTH32F_STENCIL8_NV 0x8DAC\r\n\tGL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV 0x8DAD\r\n\tGL_DEPTH_BUFFER_FLOAT_MODE_NV 0x8DAF\r\n\tvoid glDepthRangedNV (GLdouble zNear, GLdouble zFar)\r\n\tvoid glClearDepthdNV (GLdouble depth)\r\n\tvoid glDepthBoundsdNV (GLdouble zmin, GLdouble zmax)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_NV_depth_range_unclamped",
    "content": "GL_NV_depth_range_unclamped\r\n\tGL_SAMPLE_COUNT_BITS_NV 0x8864\r\n\tGL_CURRENT_SAMPLE_COUNT_QUERY_NV 0x8865\r\n\tGL_QUERY_RESULT_NV 0x8866\r\n\tGL_QUERY_RESULT_AVAILABLE_NV 0x8867\r\n\tGL_SAMPLE_COUNT_NV 0x8914\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_NV_fragment_program2",
    "content": "GL_NV_fragment_program2\r\nhttp://www.nvidia.com/dev_content/nvopenglspecs/GL_NV_fragment_program2.txt\r\n\tGL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4\r\n\tGL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5\r\n\tGL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6\r\n\tGL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7\r\n\tGL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_NV_fragment_program4",
    "content": "GL_NV_fragment_program4\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_NV_fragment_program4.txt\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_NV_fragment_program_option",
    "content": "GL_NV_fragment_program_option\r\nhttp://www.nvidia.com/dev_content/nvopenglspecs/GL_NV_fragment_program_option.txt\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_NV_framebuffer_multisample_coverage",
    "content": "GL_NV_framebuffer_multisample_coverage\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_NV_framebuffer_multisample_coverage.txt\r\n\tGL_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB\r\n\tGL_RENDERBUFFER_COLOR_SAMPLES_NV  0x8E10\r\n\tGL_MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E11\r\n\tGL_MULTISAMPLE_COVERAGE_MODES_NV 0x8E12\r\n\tvoid glRenderbufferStorageMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_NV_geometry_program4",
    "content": "GL_NV_geometry_program4\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_NV_geometry_program4.txt\r\n\tGL_GEOMETRY_PROGRAM_NV 0x8C26\r\n\tGL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27\r\n\tGL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28\r\n\tvoid glProgramVertexLimitNV (GLenum target, GLint limit)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_NV_geometry_shader4",
    "content": "GL_NV_geometry_shader4\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_NV_geometry_shader4.txt\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_NV_gpu_program4",
    "content": "GL_NV_gpu_program4\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_NV_gpu_program4.txt\r\n\tGL_MIN_PROGRAM_TEXEL_OFFSET_NV 0x8904\r\n\tGL_MAX_PROGRAM_TEXEL_OFFSET_NV 0x8905\r\n\tGL_PROGRAM_ATTRIB_COMPONENTS_NV 0x8906\r\n\tGL_PROGRAM_RESULT_COMPONENTS_NV 0x8907\r\n\tGL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV 0x8908\r\n\tGL_MAX_PROGRAM_RESULT_COMPONENTS_NV 0x8909\r\n\tGL_MAX_PROGRAM_GENERIC_ATTRIBS_NV 0x8DA5\r\n\tGL_MAX_PROGRAM_GENERIC_RESULTS_NV 0x8DA6\r\n\tvoid glProgramLocalParameterI4iNV (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w)\r\n\tvoid glProgramLocalParameterI4ivNV (GLenum target, GLuint index, const GLint *params)\r\n\tvoid glProgramLocalParametersI4ivNV (GLenum target, GLuint index, GLsizei count, const GLint *params)\r\n\tvoid glProgramLocalParameterI4uiNV (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)\r\n\tvoid glProgramLocalParameterI4uivNV (GLenum target, GLuint index, const GLuint *params)\r\n\tvoid glProgramLocalParametersI4uivNV (GLenum target, GLuint index, GLsizei count, const GLuint *params)\r\n\tvoid glProgramEnvParameterI4iNV (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w)\r\n\tvoid glProgramEnvParameterI4ivNV (GLenum target, GLuint index, const GLint *params)\r\n\tvoid glProgramEnvParametersI4ivNV (GLenum target, GLuint index, GLsizei count, const GLint *params)\r\n\tvoid glProgramEnvParameterI4uiNV (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)\r\n\tvoid glProgramEnvParameterI4uivNV (GLenum target, GLuint index, const GLuint *params)\r\n\tvoid glProgramEnvParametersI4uivNV (GLenum target, GLuint index, GLsizei count, const GLuint *params)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_NV_parameter_buffer_object",
    "content": "GL_NV_parameter_buffer_object\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_NV_parameter_buffer_object.txt\r\n\tGL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV 0x8DA2\r\n\tGL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV 0x8DA3\r\n\tGL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV 0x8DA4\r\n\tGL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV 0x8DA0\r\n\tGL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV 0x8DA1\r\n\tvoid glProgramBufferParametersfvNV (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLfloat *params)\r\n\tvoid glProgramBufferParametersIivNV (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLint *params)\r\n\tvoid glProgramBufferParametersIuivNV (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLuint *params)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_NV_transform_feedback",
    "content": "GL_NV_transform_feedback\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_NV_transform_feedback.txt\r\n\tGL_BACK_PRIMARY_COLOR_NV 0x8C77\r\n\tGL_BACK_SECONDARY_COLOR_NV 0x8C78\r\n\tGL_TEXTURE_COORD_NV 0x8C79\r\n\tGL_CLIP_DISTANCE_NV 0x8C7A\r\n\tGL_VERTEX_ID_NV 0x8C7B\r\n\tGL_PRIMITIVE_ID_NV 0x8C7C\r\n\tGL_GENERIC_ATTRIB_NV 0x8C7D\r\n\tGL_TRANSFORM_FEEDBACK_ATTRIBS_NV 0x8C7E\r\n\tGL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV 0x8C7F\r\n\tGL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV 0x8C80\r\n\tGL_ACTIVE_VARYINGS_NV 0x8C81\r\n\tGL_ACTIVE_VARYING_MAX_LENGTH_NV 0x8C82\r\n\tGL_TRANSFORM_FEEDBACK_VARYINGS_NV 0x8C83\r\n\tGL_TRANSFORM_FEEDBACK_BUFFER_START_NV 0x8C84\r\n\tGL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV 0x8C85\r\n\tGL_TRANSFORM_FEEDBACK_RECORD_NV 0x8C86\r\n\tGL_PRIMITIVES_GENERATED_NV 0x8C87\r\n\tGL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV 0x8C88\r\n\tGL_RASTERIZER_DISCARD_NV 0x8C89\r\n\tGL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV 0x8C8A\r\n\tGL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV 0x8C8B\r\n\tGL_INTERLEAVED_ATTRIBS_NV 0x8C8C\r\n\tGL_SEPARATE_ATTRIBS_NV 0x8C8D\r\n\tGL_TRANSFORM_FEEDBACK_BUFFER_NV 0x8C8E\r\n\tGL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV 0x8C8F\r\n\tvoid glBeginTransformFeedbackNV (GLenum primitiveMode)\r\n\tvoid glEndTransformFeedbackNV (void)\r\n\tvoid glTransformFeedbackAttribsNV (GLuint count, const GLint *attribs, GLenum bufferMode)\r\n\tvoid glBindBufferRangeNV (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)\r\n\tvoid glBindBufferOffsetNV (GLenum target, GLuint index, GLuint buffer, GLintptr offset)\r\n\tvoid glBindBufferBaseNV (GLenum target, GLuint index, GLuint buffer)\r\n\tvoid glTransformFeedbackVaryingsNV (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode)\r\n\tvoid glActiveVaryingNV (GLuint program, const GLchar *name)\r\n\tGLint glGetVaryingLocationNV (GLuint program, const GLchar *name)\r\n\tvoid glGetActiveVaryingNV (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)\r\n\tvoid glGetTransformFeedbackVaryingNV (GLuint program, GLuint index, GLint *location)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_NV_vertex_program2_option",
    "content": "GL_NV_vertex_program2_option\r\nhttp://www.nvidia.com/dev_content/nvopenglspecs/GL_NV_vertex_program2_option.txt\r\n\tGL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4\r\n\tGL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_NV_vertex_program3",
    "content": "GL_NV_vertex_program3\r\nhttp://www.nvidia.com/dev_content/nvopenglspecs/GL_NV_vertex_program3.txt\r\n\tMAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_NV_vertex_program4",
    "content": "GL_NV_vertex_program4\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_NV_vertex_program4.txt\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_SGIX_shadow",
    "content": "GL_SGIX_shadow\r\nhttp://oss.sgi.com/projects/ogl-sample/registry/SGIX/shadow.txt\r\n\tGL_TEXTURE_COMPARE_SGIX 0x819A\r\n\tGL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B\r\n\tGL_TEXTURE_LEQUAL_R_SGIX 0x819C\r\n\tGL_TEXTURE_GEQUAL_R_SGIX 0x819D\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_SUN_read_video_pixels",
    "content": "GL_SUN_read_video_pixels\r\nhttp://wwws.sun.com/software/graphics/opengl/extensions/gl_sun_read_video_pixels.txt\r\n\tvoid glReadVideoPixelsSUN (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_VERSION_1_2",
    "content": "GL_VERSION_1_2\r\n\tGL_UNSIGNED_BYTE_3_3_2 0x8032\r\n\tGL_UNSIGNED_SHORT_4_4_4_4 0x8033\r\n\tGL_UNSIGNED_SHORT_5_5_5_1 0x8034\r\n\tGL_UNSIGNED_INT_8_8_8_8 0x8035\r\n\tGL_UNSIGNED_INT_10_10_10_2 0x8036\r\n\tGL_RESCALE_NORMAL 0x803A\r\n\tGL_UNSIGNED_BYTE_2_3_3_REV 0x8362\r\n\tGL_UNSIGNED_SHORT_5_6_5 0x8363\r\n\tGL_UNSIGNED_SHORT_5_6_5_REV 0x8364\r\n\tGL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365\r\n\tGL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366\r\n\tGL_UNSIGNED_INT_8_8_8_8_REV 0x8367\r\n\tGL_UNSIGNED_INT_2_10_10_10_REV 0x8368\r\n\tGL_BGR 0x80E0\r\n\tGL_BGRA 0x80E1\r\n\tGL_MAX_ELEMENTS_VERTICES 0x80E8\r\n\tGL_MAX_ELEMENTS_INDICES 0x80E9\r\n\tGL_CLAMP_TO_EDGE 0x812F\r\n\tGL_TEXTURE_MIN_LOD 0x813A\r\n\tGL_TEXTURE_MAX_LOD 0x813B\r\n\tGL_TEXTURE_BASE_LEVEL 0x813C\r\n\tGL_TEXTURE_MAX_LEVEL 0x813D\r\n\tGL_LIGHT_MODEL_COLOR_CONTROL 0x81F8\r\n\tGL_SINGLE_COLOR 0x81F9\r\n\tGL_SEPARATE_SPECULAR_COLOR 0x81FA\r\n\tGL_SMOOTH_POINT_SIZE_RANGE 0x0B12\r\n\tGL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13\r\n\tGL_SMOOTH_LINE_WIDTH_RANGE 0x0B22\r\n\tGL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23\r\n\tGL_ALIASED_POINT_SIZE_RANGE 0x846D\r\n\tGL_ALIASED_LINE_WIDTH_RANGE 0x846E\r\n\tGL_PACK_SKIP_IMAGES 0x806B\r\n\tGL_PACK_IMAGE_HEIGHT 0x806C\r\n\tGL_UNPACK_SKIP_IMAGES 0x806D\r\n\tGL_UNPACK_IMAGE_HEIGHT 0x806E\r\n\tGL_TEXTURE_3D 0x806F\r\n\tGL_PROXY_TEXTURE_3D 0x8070\r\n\tGL_TEXTURE_DEPTH 0x8071\r\n\tGL_TEXTURE_WRAP_R 0x8072\r\n\tGL_MAX_3D_TEXTURE_SIZE 0x8073\r\n\tGL_TEXTURE_BINDING_3D 0x806A\r\n\tvoid glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)\r\n\tvoid glTexImage3D (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)\r\n\tvoid glTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)\r\n\tvoid glCopyTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_VERSION_1_3",
    "content": "GL_VERSION_1_3\r\n\tGL_TEXTURE0 0x84C0\r\n\tGL_TEXTURE1 0x84C1\r\n\tGL_TEXTURE2 0x84C2\r\n\tGL_TEXTURE3 0x84C3\r\n\tGL_TEXTURE4 0x84C4\r\n\tGL_TEXTURE5 0x84C5\r\n\tGL_TEXTURE6 0x84C6\r\n\tGL_TEXTURE7 0x84C7\r\n\tGL_TEXTURE8 0x84C8\r\n\tGL_TEXTURE9 0x84C9\r\n\tGL_TEXTURE10 0x84CA\r\n\tGL_TEXTURE11 0x84CB\r\n\tGL_TEXTURE12 0x84CC\r\n\tGL_TEXTURE13 0x84CD\r\n\tGL_TEXTURE14 0x84CE\r\n\tGL_TEXTURE15 0x84CF\r\n\tGL_TEXTURE16 0x84D0\r\n\tGL_TEXTURE17 0x84D1\r\n\tGL_TEXTURE18 0x84D2\r\n\tGL_TEXTURE19 0x84D3\r\n\tGL_TEXTURE20 0x84D4\r\n\tGL_TEXTURE21 0x84D5\r\n\tGL_TEXTURE22 0x84D6\r\n\tGL_TEXTURE23 0x84D7\r\n\tGL_TEXTURE24 0x84D8\r\n\tGL_TEXTURE25 0x84D9\r\n\tGL_TEXTURE26 0x84DA\r\n\tGL_TEXTURE27 0x84DB\r\n\tGL_TEXTURE28 0x84DC\r\n\tGL_TEXTURE29 0x84DD\r\n\tGL_TEXTURE30 0x84DE\r\n\tGL_TEXTURE31 0x84DF\r\n\tGL_ACTIVE_TEXTURE 0x84E0\r\n\tGL_CLIENT_ACTIVE_TEXTURE 0x84E1\r\n\tGL_MAX_TEXTURE_UNITS 0x84E2\r\n\tGL_NORMAL_MAP 0x8511\r\n\tGL_REFLECTION_MAP 0x8512\r\n\tGL_TEXTURE_CUBE_MAP 0x8513\r\n\tGL_TEXTURE_BINDING_CUBE_MAP 0x8514\r\n\tGL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515\r\n\tGL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516\r\n\tGL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517\r\n\tGL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518\r\n\tGL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519\r\n\tGL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A\r\n\tGL_PROXY_TEXTURE_CUBE_MAP 0x851B\r\n\tGL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C\r\n\tGL_COMPRESSED_ALPHA 0x84E9\r\n\tGL_COMPRESSED_LUMINANCE 0x84EA\r\n\tGL_COMPRESSED_LUMINANCE_ALPHA 0x84EB\r\n\tGL_COMPRESSED_INTENSITY 0x84EC\r\n\tGL_COMPRESSED_RGB 0x84ED\r\n\tGL_COMPRESSED_RGBA 0x84EE\r\n\tGL_TEXTURE_COMPRESSION_HINT 0x84EF\r\n\tGL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0\r\n\tGL_TEXTURE_COMPRESSED 0x86A1\r\n\tGL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2\r\n\tGL_COMPRESSED_TEXTURE_FORMATS 0x86A3\r\n\tGL_MULTISAMPLE 0x809D\r\n\tGL_SAMPLE_ALPHA_TO_COVERAGE 0x809E\r\n\tGL_SAMPLE_ALPHA_TO_ONE 0x809F\r\n\tGL_SAMPLE_COVERAGE 0x80A0\r\n\tGL_SAMPLE_BUFFERS 0x80A8\r\n\tGL_SAMPLES 0x80A9\r\n\tGL_SAMPLE_COVERAGE_VALUE 0x80AA\r\n\tGL_SAMPLE_COVERAGE_INVERT 0x80AB\r\n\tGL_MULTISAMPLE_BIT 0x20000000\r\n\tGL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3\r\n\tGL_TRANSPOSE_PROJECTION_MATRIX 0x84E4\r\n\tGL_TRANSPOSE_TEXTURE_MATRIX 0x84E5\r\n\tGL_TRANSPOSE_COLOR_MATRIX 0x84E6\r\n\tGL_COMBINE 0x8570\r\n\tGL_COMBINE_RGB 0x8571\r\n\tGL_COMBINE_ALPHA 0x8572\r\n\tGL_SOURCE0_RGB 0x8580\r\n\tGL_SOURCE1_RGB 0x8581\r\n\tGL_SOURCE2_RGB 0x8582\r\n\tGL_SOURCE0_ALPHA 0x8588\r\n\tGL_SOURCE1_ALPHA 0x8589\r\n\tGL_SOURCE2_ALPHA 0x858A\r\n\tGL_OPERAND0_RGB 0x8590\r\n\tGL_OPERAND1_RGB 0x8591\r\n\tGL_OPERAND2_RGB 0x8592\r\n\tGL_OPERAND0_ALPHA 0x8598\r\n\tGL_OPERAND1_ALPHA 0x8599\r\n\tGL_OPERAND2_ALPHA 0x859A\r\n\tGL_RGB_SCALE 0x8573\r\n\tGL_ADD_SIGNED 0x8574\r\n\tGL_INTERPOLATE 0x8575\r\n\tGL_SUBTRACT 0x84E7\r\n\tGL_CONSTANT 0x8576\r\n\tGL_PRIMARY_COLOR 0x8577\r\n\tGL_PREVIOUS 0x8578\r\n\tGL_DOT3_RGB 0x86AE\r\n\tGL_DOT3_RGBA 0x86AF\r\n\tGL_CLAMP_TO_BORDER 0x812D\r\n\r\n\tvoid glActiveTexture (GLenum texture)\r\n\tvoid glClientActiveTexture (GLenum texture)\r\n\tvoid glCompressedTexImage1D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)\r\n\tvoid glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)\r\n\tvoid glCompressedTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)\r\n\tvoid glCompressedTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)\r\n\tvoid glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)\r\n\tvoid glCompressedTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)\r\n\tvoid glGetCompressedTexImage (GLenum target, GLint lod, GLvoid *img)\r\n\tvoid glLoadTransposeMatrixd (const GLdouble m[16])\r\n\tvoid glLoadTransposeMatrixf (const GLfloat m[16])\r\n\tvoid glMultTransposeMatrixd (const GLdouble m[16])\r\n\tvoid glMultTransposeMatrixf (const GLfloat m[16])\r\n\tvoid glMultiTexCoord1d (GLenum target, GLdouble s)\r\n\tvoid glMultiTexCoord1dv (GLenum target, const GLdouble *v)\r\n\tvoid glMultiTexCoord1f (GLenum target, GLfloat s)\r\n\tvoid glMultiTexCoord1fv (GLenum target, const GLfloat *v)\r\n\tvoid glMultiTexCoord1i (GLenum target, GLint s)\r\n\tvoid glMultiTexCoord1iv (GLenum target, const GLint *v)\r\n\tvoid glMultiTexCoord1s (GLenum target, GLshort s)\r\n\tvoid glMultiTexCoord1sv (GLenum target, const GLshort *v)\r\n\tvoid glMultiTexCoord2d (GLenum target, GLdouble s, GLdouble t)\r\n\tvoid glMultiTexCoord2dv (GLenum target, const GLdouble *v)\r\n\tvoid glMultiTexCoord2f (GLenum target, GLfloat s, GLfloat t)\r\n\tvoid glMultiTexCoord2fv (GLenum target, const GLfloat *v)\r\n\tvoid glMultiTexCoord2i (GLenum target, GLint s, GLint t)\r\n\tvoid glMultiTexCoord2iv (GLenum target, const GLint *v)\r\n\tvoid glMultiTexCoord2s (GLenum target, GLshort s, GLshort t)\r\n\tvoid glMultiTexCoord2sv (GLenum target, const GLshort *v)\r\n\tvoid glMultiTexCoord3d (GLenum target, GLdouble s, GLdouble t, GLdouble r)\r\n\tvoid glMultiTexCoord3dv (GLenum target, const GLdouble *v)\r\n\tvoid glMultiTexCoord3f (GLenum target, GLfloat s, GLfloat t, GLfloat r)\r\n\tvoid glMultiTexCoord3fv (GLenum target, const GLfloat *v)\r\n\tvoid glMultiTexCoord3i (GLenum target, GLint s, GLint t, GLint r)\r\n\tvoid glMultiTexCoord3iv (GLenum target, const GLint *v)\r\n\tvoid glMultiTexCoord3s (GLenum target, GLshort s, GLshort t, GLshort r)\r\n\tvoid glMultiTexCoord3sv (GLenum target, const GLshort *v)\r\n\tvoid glMultiTexCoord4d (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)\r\n\tvoid glMultiTexCoord4dv (GLenum target, const GLdouble *v)\r\n\tvoid glMultiTexCoord4f (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)\r\n\tvoid glMultiTexCoord4fv (GLenum target, const GLfloat *v)\r\n\tvoid glMultiTexCoord4i (GLenum target, GLint s, GLint t, GLint r, GLint q)\r\n\tvoid glMultiTexCoord4iv (GLenum target, const GLint *v)\r\n\tvoid glMultiTexCoord4s (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)\r\n\tvoid glMultiTexCoord4sv (GLenum target, const GLshort *v)\r\n\tvoid glSampleCoverage (GLclampf value, GLboolean invert)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_VERSION_1_4",
    "content": "GL_VERSION_1_4\r\n\tGL_GENERATE_MIPMAP 0x8191\r\n\tGL_GENERATE_MIPMAP_HINT 0x8192\r\n\tGL_DEPTH_COMPONENT16 0x81A5\r\n\tGL_DEPTH_COMPONENT24 0x81A6\r\n\tGL_DEPTH_COMPONENT32 0x81A7\r\n\tGL_TEXTURE_DEPTH_SIZE 0x884A\r\n\tGL_DEPTH_TEXTURE_MODE 0x884B\r\n\tGL_TEXTURE_COMPARE_MODE 0x884C\r\n\tGL_TEXTURE_COMPARE_FUNC 0x884D\r\n\tGL_COMPARE_R_TO_TEXTURE 0x884E\r\n\tGL_FOG_COORDINATE_SOURCE 0x8450\r\n\tGL_FOG_COORDINATE 0x8451\r\n\tGL_FRAGMENT_DEPTH 0x8452\r\n\tGL_CURRENT_FOG_COORDINATE 0x8453\r\n\tGL_FOG_COORDINATE_ARRAY_TYPE 0x8454\r\n\tGL_FOG_COORDINATE_ARRAY_STRIDE 0x8455\r\n\tGL_FOG_COORDINATE_ARRAY_POINTER 0x8456\r\n\tGL_FOG_COORDINATE_ARRAY 0x8457\r\n\tGL_POINT_SIZE_MIN 0x8126\r\n\tGL_POINT_SIZE_MAX 0x8127\r\n\tGL_POINT_FADE_THRESHOLD_SIZE 0x8128\r\n\tGL_POINT_DISTANCE_ATTENUATION 0x8129\r\n\tGL_COLOR_SUM 0x8458\r\n\tGL_CURRENT_SECONDARY_COLOR 0x8459\r\n\tGL_SECONDARY_COLOR_ARRAY_SIZE 0x845A\r\n\tGL_SECONDARY_COLOR_ARRAY_TYPE 0x845B\r\n\tGL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C\r\n\tGL_SECONDARY_COLOR_ARRAY_POINTER 0x845D\r\n\tGL_SECONDARY_COLOR_ARRAY 0x845E\r\n\tGL_BLEND_DST_RGB 0x80C8\r\n\tGL_BLEND_SRC_RGB 0x80C9\r\n\tGL_BLEND_DST_ALPHA 0x80CA\r\n\tGL_BLEND_SRC_ALPHA 0x80CB\r\n\tGL_INCR_WRAP 0x8507\r\n\tGL_DECR_WRAP 0x8508\r\n\tGL_TEXTURE_FILTER_CONTROL 0x8500\r\n\tGL_TEXTURE_LOD_BIAS 0x8501\r\n\tGL_MAX_TEXTURE_LOD_BIAS 0x84FD\r\n\tGL_MIRRORED_REPEAT 0x8370\r\n\tvoid glBlendEquation (GLenum mode)\r\n\tvoid glBlendColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)\r\n\tvoid glFogCoordf (GLfloat coord)\r\n\tvoid glFogCoordfv (const GLfloat *coord)\r\n\tvoid glFogCoordd (GLdouble coord)\r\n\tvoid glFogCoorddv (const GLdouble *coord)\r\n\tvoid glFogCoordPointer (GLenum type, GLsizei stride, const GLvoid *pointer)\r\n\tvoid glMultiDrawArrays (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount)\r\n\tvoid glMultiDrawElements (GLenum mode, GLsizei *count, GLenum type, const GLvoid **indices, GLsizei primcount)\r\n\tvoid glPointParameteri (GLenum pname, GLint param)\r\n\tvoid glPointParameteriv (GLenum pname, GLint *params)\r\n\tvoid glPointParameterf (GLenum pname, GLfloat param)\r\n\tvoid glPointParameterfv (GLenum pname, GLfloat *params)\r\n\tvoid glSecondaryColor3b (GLbyte red, GLbyte green, GLbyte blue)\r\n\tvoid glSecondaryColor3bv (const GLbyte *v)\r\n\tvoid glSecondaryColor3d (GLdouble red, GLdouble green, GLdouble blue)\r\n\tvoid glSecondaryColor3dv (const GLdouble *v)\r\n\tvoid glSecondaryColor3f (GLfloat red, GLfloat green, GLfloat blue)\r\n\tvoid glSecondaryColor3fv (const GLfloat *v)\r\n\tvoid glSecondaryColor3i (GLint red, GLint green, GLint blue)\r\n\tvoid glSecondaryColor3iv (const GLint *v)\r\n\tvoid glSecondaryColor3s (GLshort red, GLshort green, GLshort blue)\r\n\tvoid glSecondaryColor3sv (const GLshort *v)\r\n\tvoid glSecondaryColor3ub (GLubyte red, GLubyte green, GLubyte blue)\r\n\tvoid glSecondaryColor3ubv (const GLubyte *v)\r\n\tvoid glSecondaryColor3ui (GLuint red, GLuint green, GLuint blue)\r\n\tvoid glSecondaryColor3uiv (const GLuint *v)\r\n\tvoid glSecondaryColor3us (GLushort red, GLushort green, GLushort blue)\r\n\tvoid glSecondaryColor3usv (const GLushort *v)\r\n\tvoid glSecondaryColorPointer (GLint size, GLenum type, GLsizei stride, GLvoid *pointer)\r\n\tvoid glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)\r\n\tvoid glWindowPos2d (GLdouble x, GLdouble y)\r\n\tvoid glWindowPos2f (GLfloat x, GLfloat y)\r\n\tvoid glWindowPos2i (GLint x, GLint y)\r\n\tvoid glWindowPos2s (GLshort x, GLshort y)\r\n\tvoid glWindowPos2dv (const GLdouble *p)\r\n\tvoid glWindowPos2fv (const GLfloat *p)\r\n\tvoid glWindowPos2iv (const GLint *p)\r\n\tvoid glWindowPos2sv (const GLshort *p)\r\n\tvoid glWindowPos3d (GLdouble x, GLdouble y, GLdouble z)\r\n\tvoid glWindowPos3f (GLfloat x, GLfloat y, GLfloat z)\r\n\tvoid glWindowPos3i (GLint x, GLint y, GLint z)\r\n\tvoid glWindowPos3s (GLshort x, GLshort y, GLshort z)\r\n\tvoid glWindowPos3dv (const GLdouble *p)\r\n\tvoid glWindowPos3fv (const GLfloat *p)\r\n\tvoid glWindowPos3iv (const GLint *p)\r\n\tvoid glWindowPos3sv (const GLshort *p)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_VERSION_1_5",
    "content": "GL_VERSION_1_5\r\nhttp://www.opengl.org/documentation/specs/version1.5/glspec15.pdf\r\n\tGL_BUFFER_SIZE 0x8764\r\n\tGL_BUFFER_USAGE 0x8765\r\n\tGL_QUERY_COUNTER_BITS 0x8864\r\n\tGL_CURRENT_QUERY 0x8865\r\n\tGL_QUERY_RESULT 0x8866\r\n\tGL_QUERY_RESULT_AVAILABLE 0x8867\r\n\tGL_ARRAY_BUFFER 0x8892\r\n\tGL_ELEMENT_ARRAY_BUFFER 0x8893\r\n\tGL_ARRAY_BUFFER_BINDING 0x8894\r\n\tGL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895\r\n\tGL_VERTEX_ARRAY_BUFFER_BINDING 0x8896\r\n\tGL_NORMAL_ARRAY_BUFFER_BINDING 0x8897\r\n\tGL_COLOR_ARRAY_BUFFER_BINDING 0x8898\r\n\tGL_INDEX_ARRAY_BUFFER_BINDING 0x8899\r\n\tGL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A\r\n\tGL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B\r\n\tGL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C\r\n\tGL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D\r\n\tGL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E\r\n\tGL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F\r\n\tGL_READ_ONLY 0x88B8\r\n\tGL_WRITE_ONLY 0x88B9\r\n\tGL_READ_WRITE 0x88BA\r\n\tGL_BUFFER_ACCESS 0x88BB\r\n\tGL_BUFFER_MAPPED 0x88BC\r\n\tGL_BUFFER_MAP_POINTER 0x88BD\r\n\tGL_STREAM_DRAW 0x88E0\r\n\tGL_STREAM_READ 0x88E1\r\n\tGL_STREAM_COPY 0x88E2\r\n\tGL_STATIC_DRAW 0x88E4\r\n\tGL_STATIC_READ 0x88E5\r\n\tGL_STATIC_COPY 0x88E6\r\n\tGL_DYNAMIC_DRAW 0x88E8\r\n\tGL_DYNAMIC_READ 0x88E9\r\n\tGL_DYNAMIC_COPY 0x88EA\r\n\tGL_SAMPLES_PASSED 0x8914\r\n\tGL_FOG_COORD_SRC GL_FOG_COORDINATE_SOURCE\r\n\tGL_FOG_COORD GL_FOG_COORDINATE\r\n\tGL_CURRENT_FOG_COORD GL_CURRENT_FOG_COORDINATE\r\n\tGL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE\r\n\tGL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE\r\n\tGL_FOG_COORD_ARRAY_POINTER GL_FOG_COORDINATE_ARRAY_POINTER\r\n\tGL_FOG_COORD_ARRAY GL_FOG_COORDINATE_ARRAY\r\n\tGL_FOG_COORD_ARRAY_BUFFER_BINDING GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING\r\n\tGL_SRC0_RGB GL_SOURCE0_RGB\r\n\tGL_SRC1_RGB GL_SOURCE1_RGB\r\n\tGL_SRC2_RGB GL_SOURCE2_RGB\r\n\tGL_SRC0_ALPHA GL_SOURCE0_ALPHA\r\n\tGL_SRC1_ALPHA GL_SOURCE1_ALPHA\r\n\tGL_SRC2_ALPHA GL_SOURCE2_ALPHA\r\n\tvoid glGenQueries (GLsizei n, GLuint* ids)\r\n\tvoid glDeleteQueries (GLsizei n, const GLuint* ids)\r\n\tGLboolean glIsQuery (GLuint id)\r\n\tvoid glBeginQuery (GLenum target, GLuint id)\r\n\tvoid glEndQuery (GLenum target)\r\n\tvoid glGetQueryiv (GLenum target, GLenum pname, GLint* params)\r\n\tvoid glGetQueryObjectiv (GLuint id, GLenum pname, GLint* params)\r\n\tvoid glGetQueryObjectuiv (GLuint id, GLenum pname, GLuint* params)\r\n\tvoid glBindBuffer (GLenum target, GLuint buffer)\r\n\tvoid glDeleteBuffers (GLsizei n, const GLuint* buffers)\r\n\tvoid glGenBuffers (GLsizei n, GLuint* buffers)\r\n\tGLboolean glIsBuffer (GLuint buffer)\r\n\tvoid glBufferData (GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)\r\n\tvoid glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)\r\n\tvoid glGetBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid* data)\r\n\tGLvoid* glMapBuffer (GLenum target, GLenum access)\r\n\tGLboolean glUnmapBuffer (GLenum target)\r\n\tvoid glGetBufferParameteriv (GLenum target, GLenum pname, GLint* params)\r\n\tvoid glGetBufferPointerv (GLenum target, GLenum pname, GLvoid** params)\r\n\ttypedef ptrdiff_t GLsizeiptr\r\n\ttypedef ptrdiff_t GLintptr\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_VERSION_2_0",
    "content": "GL_VERSION_2_0\r\nhttp://www.opengl.org/documentation/specs/version2.0/glspec20.pdf\r\n\tGL_BLEND_EQUATION_RGB GL_BLEND_EQUATION\r\n\tGL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622\r\n\tGL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623\r\n\tGL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624\r\n\tGL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625\r\n\tGL_CURRENT_VERTEX_ATTRIB 0x8626\r\n\tGL_VERTEX_PROGRAM_POINT_SIZE 0x8642\r\n\tGL_VERTEX_PROGRAM_TWO_SIDE 0x8643\r\n\tGL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645\r\n\tGL_STENCIL_BACK_FUNC 0x8800\r\n\tGL_STENCIL_BACK_FAIL 0x8801\r\n\tGL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802\r\n\tGL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803\r\n\tGL_MAX_DRAW_BUFFERS 0x8824\r\n\tGL_DRAW_BUFFER0 0x8825\r\n\tGL_DRAW_BUFFER1 0x8826\r\n\tGL_DRAW_BUFFER2 0x8827\r\n\tGL_DRAW_BUFFER3 0x8828\r\n\tGL_DRAW_BUFFER4 0x8829\r\n\tGL_DRAW_BUFFER5 0x882A\r\n\tGL_DRAW_BUFFER6 0x882B\r\n\tGL_DRAW_BUFFER7 0x882C\r\n\tGL_DRAW_BUFFER8 0x882D\r\n\tGL_DRAW_BUFFER9 0x882E\r\n\tGL_DRAW_BUFFER10 0x882F\r\n\tGL_DRAW_BUFFER11 0x8830\r\n\tGL_DRAW_BUFFER12 0x8831\r\n\tGL_DRAW_BUFFER13 0x8832\r\n\tGL_DRAW_BUFFER14 0x8833\r\n\tGL_DRAW_BUFFER15 0x8834\r\n\tGL_BLEND_EQUATION_ALPHA 0x883D\r\n\tGL_POINT_SPRITE 0x8861\r\n\tGL_COORD_REPLACE 0x8862\r\n\tGL_MAX_VERTEX_ATTRIBS 0x8869\r\n\tGL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A\r\n\tGL_MAX_TEXTURE_COORDS 0x8871\r\n\tGL_MAX_TEXTURE_IMAGE_UNITS 0x8872\r\n\tGL_FRAGMENT_SHADER 0x8B30\r\n\tGL_VERTEX_SHADER 0x8B31\r\n\tGL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49\r\n\tGL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A\r\n\tGL_MAX_VARYING_FLOATS 0x8B4B\r\n\tGL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C\r\n\tGL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D\r\n\tGL_SHADER_TYPE 0x8B4F\r\n\tGL_FLOAT_VEC2 0x8B50\r\n\tGL_FLOAT_VEC3 0x8B51\r\n\tGL_FLOAT_VEC4 0x8B52\r\n\tGL_INT_VEC2 0x8B53\r\n\tGL_INT_VEC3 0x8B54\r\n\tGL_INT_VEC4 0x8B55\r\n\tGL_BOOL 0x8B56\r\n\tGL_BOOL_VEC2 0x8B57\r\n\tGL_BOOL_VEC3 0x8B58\r\n\tGL_BOOL_VEC4 0x8B59\r\n\tGL_FLOAT_MAT2 0x8B5A\r\n\tGL_FLOAT_MAT3 0x8B5B\r\n\tGL_FLOAT_MAT4 0x8B5C\r\n\tGL_SAMPLER_1D 0x8B5D\r\n\tGL_SAMPLER_2D 0x8B5E\r\n\tGL_SAMPLER_3D 0x8B5F\r\n\tGL_SAMPLER_CUBE 0x8B60\r\n\tGL_SAMPLER_1D_SHADOW 0x8B61\r\n\tGL_SAMPLER_2D_SHADOW 0x8B62\r\n\tGL_DELETE_STATUS 0x8B80\r\n\tGL_COMPILE_STATUS 0x8B81\r\n\tGL_LINK_STATUS 0x8B82\r\n\tGL_VALIDATE_STATUS 0x8B83\r\n\tGL_INFO_LOG_LENGTH 0x8B84\r\n\tGL_ATTACHED_SHADERS 0x8B85\r\n\tGL_ACTIVE_UNIFORMS 0x8B86\r\n\tGL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87\r\n\tGL_SHADER_SOURCE_LENGTH 0x8B88\r\n\tGL_ACTIVE_ATTRIBUTES 0x8B89\r\n\tGL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A\r\n\tGL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B\r\n\tGL_SHADING_LANGUAGE_VERSION 0x8B8C\r\n\tGL_CURRENT_PROGRAM 0x8B8D\r\n\tGL_POINT_SPRITE_COORD_ORIGIN 0x8CA0\r\n\tGL_LOWER_LEFT 0x8CA1\r\n\tGL_UPPER_LEFT 0x8CA2\r\n\tGL_STENCIL_BACK_REF 0x8CA3\r\n\tGL_STENCIL_BACK_VALUE_MASK 0x8CA4\r\n\tGL_STENCIL_BACK_WRITEMASK 0x8CA5\r\n\ttypedef char GLchar\r\n\tvoid glBlendEquationSeparate (GLenum, GLenum)\r\n\tvoid glDrawBuffers (GLsizei n, const GLenum* bufs)\r\n\tvoid glStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)\r\n\tvoid glStencilFuncSeparate (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask)\r\n\tvoid glStencilMaskSeparate (GLenum, GLuint)\r\n\tvoid glAttachShader (GLuint program, GLuint shader)\r\n\tvoid glBindAttribLocation (GLuint program, GLuint index, const GLchar* name)\r\n\tvoid glCompileShader (GLuint shader)\r\n\tGLuint glCreateProgram (void)\r\n\tGLuint glCreateShader (GLenum type)\r\n\tvoid glDeleteProgram (GLuint program)\r\n\tvoid glDeleteShader (GLuint shader)\r\n\tvoid glDetachShader (GLuint program, GLuint shader)\r\n\tvoid glDisableVertexAttribArray (GLuint)\r\n\tvoid glEnableVertexAttribArray (GLuint)\r\n\tvoid glGetActiveAttrib (GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name)\r\n\tvoid glGetActiveUniform (GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name)\r\n\tvoid glGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei* count, GLuint* shaders)\r\n\tGLint glGetAttribLocation (GLuint program, const GLchar* name)\r\n\tvoid glGetProgramiv (GLuint program, GLenum pname, GLint* param)\r\n\tvoid glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog)\r\n\tvoid glGetShaderiv (GLuint shader, GLenum pname, GLint* param)\r\n\tvoid glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog)\r\n\tvoid glShaderSource (GLuint shader, GLsizei count, const GLchar** strings, const GLint* lengths)\r\n\tGLint glGetUniformLocation (GLuint program, const GLchar* name)\r\n\tvoid glGetUniformfv (GLuint program, GLint location, GLfloat* params)\r\n\tvoid glGetUniformiv (GLuint program, GLint location, GLint* params)\r\n\tvoid glGetVertexAttribdv (GLuint, GLenum, GLdouble*)\r\n\tvoid glGetVertexAttribfv (GLuint, GLenum, GLfloat*)\r\n\tvoid glGetVertexAttribiv (GLuint, GLenum, GLint*)\r\n\tvoid glGetVertexAttribPointerv (GLuint, GLenum, GLvoid*)\r\n\tGLboolean glIsProgram (GLuint program)\r\n\tGLboolean glIsShader (GLuint shader)\r\n\tvoid glLinkProgram (GLuint program)\r\n\tvoid glGetShaderSource (GLint obj, GLsizei maxLength, GLsizei* length, GLchar* source)\r\n\tvoid glUseProgram (GLuint program)\r\n\tvoid glUniform1f (GLint location, GLfloat v0)\r\n\tvoid glUniform1fv (GLint location, GLsizei count, const GLfloat* value)\r\n\tvoid glUniform1i (GLint location, GLint v0)\r\n\tvoid glUniform1iv (GLint location, GLsizei count, const GLint* value)\r\n\tvoid glUniform2f (GLint location, GLfloat v0, GLfloat v1)\r\n\tvoid glUniform2fv (GLint location, GLsizei count, const GLfloat* value)\r\n\tvoid glUniform2i (GLint location, GLint v0, GLint v1)\r\n\tvoid glUniform2iv (GLint location, GLsizei count, const GLint* value)\r\n\tvoid glUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2)\r\n\tvoid glUniform3fv (GLint location, GLsizei count, const GLfloat* value)\r\n\tvoid glUniform3i (GLint location, GLint v0, GLint v1, GLint v2)\r\n\tvoid glUniform3iv (GLint location, GLsizei count, const GLint* value)\r\n\tvoid glUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)\r\n\tvoid glUniform4fv (GLint location, GLsizei count, const GLfloat* value)\r\n\tvoid glUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3)\r\n\tvoid glUniform4iv (GLint location, GLsizei count, const GLint* value)\r\n\tvoid glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)\r\n\tvoid glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)\r\n\tvoid glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)\r\n\tvoid glValidateProgram (GLuint program)\r\n\tvoid glVertexAttrib1d (GLuint index, GLdouble x)\r\n\tvoid glVertexAttrib1dv (GLuint index, const GLdouble* v)\r\n\tvoid glVertexAttrib1f (GLuint index, GLfloat x)\r\n\tvoid glVertexAttrib1fv (GLuint index, const GLfloat* v)\r\n\tvoid glVertexAttrib1s (GLuint index, GLshort x)\r\n\tvoid glVertexAttrib1sv (GLuint index, const GLshort* v)\r\n\tvoid glVertexAttrib2d (GLuint index, GLdouble x, GLdouble y)\r\n\tvoid glVertexAttrib2dv (GLuint index, const GLdouble* v)\r\n\tvoid glVertexAttrib2f (GLuint index, GLfloat x, GLfloat y)\r\n\tvoid glVertexAttrib2fv (GLuint index, const GLfloat* v)\r\n\tvoid glVertexAttrib2s (GLuint index, GLshort x, GLshort y)\r\n\tvoid glVertexAttrib2sv (GLuint index, const GLshort* v)\r\n\tvoid glVertexAttrib3d (GLuint index, GLdouble x, GLdouble y, GLdouble z)\r\n\tvoid glVertexAttrib3dv (GLuint index, const GLdouble* v)\r\n\tvoid glVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z)\r\n\tvoid glVertexAttrib3fv (GLuint index, const GLfloat* v)\r\n\tvoid glVertexAttrib3s (GLuint index, GLshort x, GLshort y, GLshort z)\r\n\tvoid glVertexAttrib3sv (GLuint index, const GLshort* v)\r\n\tvoid glVertexAttrib4Nbv (GLuint index, const GLbyte* v)\r\n\tvoid glVertexAttrib4Niv (GLuint index, const GLint* v)\r\n\tvoid glVertexAttrib4Nsv (GLuint index, const GLshort* v)\r\n\tvoid glVertexAttrib4Nub (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)\r\n\tvoid glVertexAttrib4Nubv (GLuint index, const GLubyte* v)\r\n\tvoid glVertexAttrib4Nuiv (GLuint index, const GLuint* v)\r\n\tvoid glVertexAttrib4Nusv (GLuint index, const GLushort* v)\r\n\tvoid glVertexAttrib4bv (GLuint index, const GLbyte* v)\r\n\tvoid glVertexAttrib4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)\r\n\tvoid glVertexAttrib4dv (GLuint index, const GLdouble* v)\r\n\tvoid glVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)\r\n\tvoid glVertexAttrib4fv (GLuint index, const GLfloat* v)\r\n\tvoid glVertexAttrib4iv (GLuint index, const GLint* v)\r\n\tvoid glVertexAttrib4s (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)\r\n\tvoid glVertexAttrib4sv (GLuint index, const GLshort* v)\r\n\tvoid glVertexAttrib4ubv (GLuint index, const GLubyte* v)\r\n\tvoid glVertexAttrib4uiv (GLuint index, const GLuint* v)\r\n\tvoid glVertexAttrib4usv (GLuint index, const GLushort* v)\r\n\tvoid glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* pointer)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_VERSION_2_1",
    "content": "GL_VERSION_2_1\r\nhttp://www.opengl.org/documentation/specs/version2.1/glspec21.pdf\r\n\tGL_CURRENT_RASTER_SECONDARY_COLOR 0x845F\r\n\tGL_PIXEL_PACK_BUFFER 0x88EB\r\n\tGL_PIXEL_UNPACK_BUFFER 0x88EC\r\n\tGL_PIXEL_PACK_BUFFER_BINDING 0x88ED\r\n\tGL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF\r\n\tGL_FLOAT_MAT2x3 0x8B65\r\n\tGL_FLOAT_MAT2x4 0x8B66\r\n\tGL_FLOAT_MAT3x2 0x8B67\r\n\tGL_FLOAT_MAT3x4 0x8B68\r\n\tGL_FLOAT_MAT4x2 0x8B69\r\n\tGL_FLOAT_MAT4x3 0x8B6A\r\n\tGL_SRGB 0x8C40\r\n\tGL_SRGB8 0x8C41\r\n\tGL_SRGB_ALPHA 0x8C42\r\n\tGL_SRGB8_ALPHA8 0x8C43\r\n\tGL_SLUMINANCE_ALPHA 0x8C44\r\n\tGL_SLUMINANCE8_ALPHA8 0x8C45\r\n\tGL_SLUMINANCE 0x8C46\r\n\tGL_SLUMINANCE8 0x8C47\r\n\tGL_COMPRESSED_SRGB 0x8C48\r\n\tGL_COMPRESSED_SRGB_ALPHA 0x8C49\r\n\tGL_COMPRESSED_SLUMINANCE 0x8C4A\r\n\tGL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B\r\n\tvoid glUniformMatrix2x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)\r\n\tvoid glUniformMatrix3x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)\r\n\tvoid glUniformMatrix2x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)\r\n\tvoid glUniformMatrix4x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)\r\n\tvoid glUniformMatrix3x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)\r\n\tvoid glUniformMatrix4x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_VERSION_3_0",
    "content": "GL_VERSION_3_0\r\nhttp://www.opengl.org/registry/doc/glspec30.20080811.pdf\r\n\tGL_COMPARE_REF_TO_TEXTURE GL_COMPARE_R_TO_TEXTURE_ARB\r\n\tGL_CLIP_DISTANCE0 GL_CLIP_PLANE0\r\n\tGL_CLIP_DISTANCE1 GL_CLIP_PLANE1\r\n\tGL_CLIP_DISTANCE2 GL_CLIP_PLANE2\r\n\tGL_CLIP_DISTANCE3 GL_CLIP_PLANE3\r\n\tGL_CLIP_DISTANCE4 GL_CLIP_PLANE4\r\n\tGL_CLIP_DISTANCE5 GL_CLIP_PLANE5\r\n\tGL_MAX_CLIP_DISTANCES GL_MAX_CLIP_PLANES\r\n\tGL_MAJOR_VERSION 0x821B\r\n\tGL_MINOR_VERSION 0x821C\r\n\tGL_NUM_EXTENSIONS 0x821D\r\n\tGL_CONTEXT_FLAGS 0x821E\r\n\tGL_DEPTH_BUFFER 0x8223\r\n\tGL_STENCIL_BUFFER 0x8224\r\n\tGL_COMPRESSED_RED 0x8225\r\n\tGL_COMPRESSED_RG 0x8226\r\n\tGL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x0001\r\n\tGL_RGBA32F 0x8814\r\n\tGL_RGB32F 0x8815\r\n\tGL_RGBA16F 0x881A\r\n\tGL_RGB16F 0x881B\r\n\tGL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD\r\n\tGL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF\r\n\tGL_MIN_PROGRAM_TEXEL_OFFSET 0x8904\r\n\tGL_MAX_PROGRAM_TEXEL_OFFSET 0x8905\r\n\tGL_CLAMP_VERTEX_COLOR 0x891A\r\n\tGL_CLAMP_FRAGMENT_COLOR 0x891B\r\n\tGL_CLAMP_READ_COLOR 0x891C\r\n\tGL_FIXED_ONLY 0x891D\r\n\tGL_MAX_VARYING_COMPONENTS GL_MAX_VARYING_FLOATS\r\n\tGL_TEXTURE_RED_TYPE 0x8C10\r\n\tGL_TEXTURE_GREEN_TYPE 0x8C11\r\n\tGL_TEXTURE_BLUE_TYPE 0x8C12\r\n\tGL_TEXTURE_ALPHA_TYPE 0x8C13\r\n\tGL_TEXTURE_LUMINANCE_TYPE 0x8C14\r\n\tGL_TEXTURE_INTENSITY_TYPE 0x8C15\r\n\tGL_TEXTURE_DEPTH_TYPE 0x8C16\r\n\tGL_UNSIGNED_NORMALIZED 0x8C17\r\n\tGL_TEXTURE_1D_ARRAY 0x8C18\r\n\tGL_PROXY_TEXTURE_1D_ARRAY 0x8C19\r\n\tGL_TEXTURE_2D_ARRAY 0x8C1A\r\n\tGL_PROXY_TEXTURE_2D_ARRAY 0x8C1B\r\n\tGL_TEXTURE_BINDING_1D_ARRAY 0x8C1C\r\n\tGL_TEXTURE_BINDING_2D_ARRAY 0x8C1D\r\n\tGL_R11F_G11F_B10F 0x8C3A\r\n\tGL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B\r\n\tGL_RGB9_E5 0x8C3D\r\n\tGL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E\r\n\tGL_TEXTURE_SHARED_SIZE 0x8C3F\r\n\tGL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76\r\n\tGL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F\r\n\tGL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80\r\n\tGL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83\r\n\tGL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84\r\n\tGL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85\r\n\tGL_PRIMITIVES_GENERATED 0x8C87\r\n\tGL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88\r\n\tGL_RASTERIZER_DISCARD 0x8C89\r\n\tGL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A\r\n\tGL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B\r\n\tGL_INTERLEAVED_ATTRIBS 0x8C8C\r\n\tGL_SEPARATE_ATTRIBS 0x8C8D\r\n\tGL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E\r\n\tGL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F\r\n\tGL_RGBA32UI 0x8D70\r\n\tGL_RGB32UI 0x8D71\r\n\tGL_RGBA16UI 0x8D76\r\n\tGL_RGB16UI 0x8D77\r\n\tGL_RGBA8UI 0x8D7C\r\n\tGL_RGB8UI 0x8D7D\r\n\tGL_RGBA32I 0x8D82\r\n\tGL_RGB32I 0x8D83\r\n\tGL_RGBA16I 0x8D88\r\n\tGL_RGB16I 0x8D89\r\n\tGL_RGBA8I 0x8D8E\r\n\tGL_RGB8I 0x8D8F\r\n\tGL_RED_INTEGER 0x8D94\r\n\tGL_GREEN_INTEGER 0x8D95\r\n\tGL_BLUE_INTEGER 0x8D96\r\n\tGL_ALPHA_INTEGER 0x8D97\r\n\tGL_RGB_INTEGER 0x8D98\r\n\tGL_RGBA_INTEGER 0x8D99\r\n\tGL_BGR_INTEGER 0x8D9A\r\n\tGL_BGRA_INTEGER 0x8D9B\r\n\tGL_SAMPLER_1D_ARRAY 0x8DC0\r\n\tGL_SAMPLER_2D_ARRAY 0x8DC1\r\n\tGL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3\r\n\tGL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4\r\n\tGL_SAMPLER_CUBE_SHADOW 0x8DC5\r\n\tGL_UNSIGNED_INT_VEC2 0x8DC6\r\n\tGL_UNSIGNED_INT_VEC3 0x8DC7\r\n\tGL_UNSIGNED_INT_VEC4 0x8DC8\r\n\tGL_INT_SAMPLER_1D 0x8DC9\r\n\tGL_INT_SAMPLER_2D 0x8DCA\r\n\tGL_INT_SAMPLER_3D 0x8DCB\r\n\tGL_INT_SAMPLER_CUBE 0x8DCC\r\n\tGL_INT_SAMPLER_1D_ARRAY 0x8DCE\r\n\tGL_INT_SAMPLER_2D_ARRAY 0x8DCF\r\n\tGL_UNSIGNED_INT_SAMPLER_1D 0x8DD1\r\n\tGL_UNSIGNED_INT_SAMPLER_2D 0x8DD2\r\n\tGL_UNSIGNED_INT_SAMPLER_3D 0x8DD3\r\n\tGL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4\r\n\tGL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6\r\n\tGL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7\r\n\tGL_QUERY_WAIT 0x8E13\r\n\tGL_QUERY_NO_WAIT 0x8E14\r\n\tGL_QUERY_BY_REGION_WAIT 0x8E15\r\n\tGL_QUERY_BY_REGION_NO_WAIT 0x8E16\r\n\tvoid glColorMaski (GLuint, GLboolean, GLboolean, GLboolean, GLboolean)\r\n\tvoid glGetBooleani_v (GLenum, GLuint, GLboolean*)\r\n\tvoid glEnablei (GLenum, GLuint)\r\n\tvoid glDisablei (GLenum, GLuint)\r\n\tGLboolean glIsEnabledi (GLenum, GLuint)\r\n\tvoid glBeginTransformFeedback (GLenum)\r\n\tvoid glEndTransformFeedback (void)\r\n\tvoid glTransformFeedbackVaryings (GLuint, GLsizei, const GLchar **, GLenum)\r\n\tvoid glGetTransformFeedbackVarying (GLuint, GLuint, GLint*)\r\n\tvoid glClampColor (GLenum, GLenum)\r\n\tvoid glBeginConditionalRender (GLuint, GLenum)\r\n\tvoid glEndConditionalRender (void)\r\n\tvoid glVertexAttribI1i (GLuint, GLint)\r\n\tvoid glVertexAttribI2i (GLuint, GLint, GLint)\r\n\tvoid glVertexAttribI3i (GLuint, GLint, GLint, GLint)\r\n\tvoid glVertexAttribI4i (GLuint, GLint, GLint, GLint, GLint)\r\n\tvoid glVertexAttribI1ui (GLuint, GLuint)\r\n\tvoid glVertexAttribI2ui (GLuint, GLuint, GLuint)\r\n\tvoid glVertexAttribI3ui (GLuint, GLuint, GLuint, GLuint)\r\n\tvoid glVertexAttribI4ui (GLuint, GLuint, GLuint, GLuint, GLuint)\r\n\tvoid glVertexAttribI1iv (GLuint, const GLint*)\r\n\tvoid glVertexAttribI2iv (GLuint, const GLint*)\r\n\tvoid glVertexAttribI3iv (GLuint, const GLint*)\r\n\tvoid glVertexAttribI4iv (GLuint, const GLint*)\r\n\tvoid glVertexAttribI1uiv (GLuint, const GLuint*)\r\n\tvoid glVertexAttribI2uiv (GLuint, const GLuint*)\r\n\tvoid glVertexAttribI3uiv (GLuint, const GLuint*)\r\n\tvoid glVertexAttribI4uiv (GLuint, const GLuint*)\r\n\tvoid glVertexAttribI4bv (GLuint, const GLbyte*)\r\n\tvoid glVertexAttribI4sv (GLuint, const GLshort*)\r\n\tvoid glVertexAttribI4ubv (GLuint, const GLubyte*)\r\n\tvoid glVertexAttribI4usv (GLuint, const GLushort*)\r\n\tvoid glVertexAttribIPointer (GLuint, GLint, GLenum, GLsizei, const GLvoid*)\r\n\tvoid glGetVertexAttribIiv (GLuint, GLenum, GLint*)\r\n\tvoid glGetVertexAttribIuiv (GLuint, GLenum, GLuint*)\r\n\tvoid glGetUniformuiv (GLuint, GLint, GLuint*)\r\n\tvoid glBindFragDataLocation (GLuint, GLuint, const GLchar*)\r\n\tGLint glGetFragDataLocation (GLuint, const GLchar*)\r\n\tvoid glUniform1ui (GLint, GLuint)\r\n\tvoid glUniform2ui (GLint, GLuint, GLuint)\r\n\tvoid glUniform3ui (GLint, GLuint, GLuint, GLuint)\r\n\tvoid glUniform4ui (GLint, GLuint, GLuint, GLuint, GLuint)\r\n\tvoid glUniform1uiv (GLint, GLsizei, const GLuint*)\r\n\tvoid glUniform2uiv (GLint, GLsizei, const GLuint*)\r\n\tvoid glUniform3uiv (GLint, GLsizei, const GLuint*)\r\n\tvoid glUniform4uiv (GLint, GLsizei, const GLuint*)\r\n\tvoid glTexParameterIiv (GLenum, GLenum, const GLint*)\r\n\tvoid glTexParameterIuiv (GLenum, GLenum, const GLuint*)\r\n\tvoid glGetTexParameterIiv (GLenum, GLenum, GLint*)\r\n\tvoid glGetTexParameterIuiv (GLenum, GLenum, GLuint*)\r\n\tvoid glClearBufferiv (GLenum, GLint, const GLint*)\r\n\tvoid glClearBufferuiv (GLenum, GLint, const GLuint*)\r\n\tvoid glClearBufferfv (GLenum, GLint, const GLfloat*)\r\n\tvoid glClearBufferfi (GLenum, GLint, GLfloat, GLint)\r\n\tconst GLubyte* glGetStringi (GLenum, GLuint)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_VERSION_3_1",
    "content": "GL_VERSION_3_1\r\nhttp://www.opengl.org/registry/doc/glspec30.20080811.pdf\r\n\tGL_SAMPLER_2D_RECT 0x8B63\r\n\tGL_SAMPLER_2D_RECT_SHADOW 0x8B64\r\n\tGL_SAMPLER_BUFFER 0x8DC2\r\n\tGL_INT_SAMPLER_2D_RECT 0x8DCD\r\n\tGL_INT_SAMPLER_BUFFER 0x8DD0\r\n\tGL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5\r\n\tGL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8\r\n\tGL_TEXTURE_BUFFER 0x8C2A\r\n\tGL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B\r\n\tGL_TEXTURE_BINDING_BUFFER 0x8C2C\r\n\tGL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D\r\n\tGL_TEXTURE_BUFFER_FORMAT 0x8C2E\r\n\tGL_TEXTURE_RECTANGLE 0x84F5\r\n\tGL_TEXTURE_BINDING_RECTANGLE 0x84F6\r\n\tGL_PROXY_TEXTURE_RECTANGLE 0x84F7\r\n\tGL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8\r\n\tGL_RED_SNORM 0x8F90\r\n\tGL_RG_SNORM 0x8F91\r\n\tGL_RGB_SNORM 0x8F92\r\n\tGL_RGBA_SNORM 0x8F93\r\n\tGL_R8_SNORM 0x8F94\r\n\tGL_RG8_SNORM 0x8F95\r\n\tGL_RGB8_SNORM 0x8F96\r\n\tGL_RGBA8_SNORM 0x8F97\r\n\tGL_R16_SNORM 0x8F98\r\n\tGL_RG16_SNORM 0x8F99\r\n\tGL_RGB16_SNORM 0x8F9A\r\n\tGL_RGBA16_SNORM 0x8F9B\r\n\tGL_SIGNED_NORMALIZED 0x8F9C\r\n\tGL_PRIMITIVE_RESTART 0x8F9D\r\n\tGL_PRIMITIVE_RESTART_INDEX 0x8F9E\r\n\tGL_BUFFER_ACCESS_FLAGS 0x911F\r\n\tGL_BUFFER_MAP_LENGTH 0x9120\r\n\tGL_BUFFER_MAP_OFFSET 0x9121\r\n\tvoid glDrawArraysInstanced (GLenum, GLint, GLsizei, GLsizei)\r\n\tvoid glDrawElementsInstanced (GLenum, GLsizei, GLenum, const GLvoid*, GLsizei)\r\n\tvoid glTexBuffer (GLenum, GLenum, GLuint)\r\n\tvoid glPrimitiveRestartIndex (GLuint)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_VERSION_3_2",
    "content": "GL_VERSION_3_2\r\nhttp://www.opengl.org/registry/doc/glspec32.core.20090803.pdf\r\n \tGL_CONTEXT_CORE_PROFILE_BIT 0x00000001\r\n\tGL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002\r\n\tGL_LINES_ADJACENCY 0x000A\r\n\tGL_LINE_STRIP_ADJACENCY 0x000B\r\n\tGL_TRIANGLES_ADJACENCY 0x000C\r\n\tGL_TRIANGLE_STRIP_ADJACENCY 0x000D\r\n\tGL_PROGRAM_POINT_SIZE 0x8642\r\n\tGL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29\r\n\tGL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7\r\n\tGL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8\r\n\tGL_GEOMETRY_SHADER 0x8DD9\r\n\tGL_GEOMETRY_VERTICES_OUT 0x8916\r\n\tGL_GEOMETRY_INPUT_TYPE 0x8917\r\n\tGL_GEOMETRY_OUTPUT_TYPE 0x8918\r\n\tGL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF\r\n\tGL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0\r\n\tGL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1\r\n\tGL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122\r\n\tGL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123\r\n\tGL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124\r\n\tGL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125\r\n\tGL_CONTEXT_PROFILE_MASK 0x9126\r\n\tvoid glGetInteger64i_v (GLenum, GLuint, GLint64 *)\r\n\tvoid glGetBufferParameteri64v (GLenum, GLenum, GLint64 *)\r\n\tvoid glFramebufferTexture (GLenum, GLenum, GLuint, GLint)\r\n"
  },
  {
    "path": "libs/glew/auto/core/GL_WIN_swap_hint",
    "content": "GL_WIN_swap_hint\r\nhttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/glfunc01_16zy.asp\r\n\tvoid glAddSwapHintRectWIN (GLint x, GLint y, GLsizei width, GLsizei height)\r\n"
  },
  {
    "path": "libs/glew/auto/core/WGL_ATI_render_texture_rectangle",
    "content": "WGL_ATI_render_texture_rectangle\r\n\tWGL_TEXTURE_RECTANGLE_ATI 0x21A5\r\n"
  },
  {
    "path": "libs/glew/auto/core/WGL_EXT_framebuffer_sRGB",
    "content": "WGL_EXT_framebuffer_sRGB\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_EXT_framebuffer_sRGB.txt\r\n\tWGL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20A9\r\n"
  },
  {
    "path": "libs/glew/auto/core/WGL_EXT_pixel_format_packed_float",
    "content": "WGL_EXT_pixel_format_packed_float\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_EXT_packed_float.txt\r\n\tWGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT 0x20A8\r\n"
  },
  {
    "path": "libs/glew/auto/core/WGL_NV_gpu_affinity",
    "content": "WGL_NV_gpu_affinity\r\nhttp://developer.download.nvidia.com/opengl/specs/WGL_nv_gpu_affinity.txt\r\n\tWGL_ERROR_INCOMPATIBLE_AFFINITY_MASKS_NV 0x20D0\r\n\tWGL_ERROR_MISSING_AFFINITY_MASK_NV 0x20D1\r\n\tBOOL wglEnumGpusNV (UINT iGpuIndex, HGPUNV *phGpu)\r\n\tBOOL wglEnumGpuDevicesNV (HGPUNV hGpu, UINT iDeviceIndex, PGPU_DEVICE lpGpuDevice)\r\n\tHDC wglCreateAffinityDCNV (const HGPUNV *phGpuList)\r\n\tBOOL wglEnumGpusFromAffinityDCNV (HDC hAffinityDC, UINT iGpuIndex, HGPUNV *hGpu)\r\n\tBOOL wglDeleteDCNV (HDC hdc)\r\n\tDECLARE_HANDLE(HGPUNV);\r\n\ttypedef struct _GPU_DEVICE {  DWORD cb;   CHAR DeviceName[32];   CHAR DeviceString[128];   DWORD Flags;   RECT rcVirtualScreen; } GPU_DEVICE, *PGPU_DEVICE;\r\n"
  },
  {
    "path": "libs/glew/auto/core/WGL_NV_vertex_array_range",
    "content": "WGL_NV_vertex_array_range\r\nhttp://oss.sgi.com/projects/ogl-sample/registry/NV/vertex_array_range.txt\r\n\tvoid * wglAllocateMemoryNV (GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority)\r\n\tvoid wglFreeMemoryNV (void *pointer)\r\n"
  },
  {
    "path": "libs/glew/auto/custom.txt",
    "content": "WGL_ARB_extensions_string\r\nWGL_EXT_extensions_string\r\nWGL_ARB_pixel_format\r\nWGL_ARB_pbuffer\r\nWGL_NV_float_buffer\r\nWGL_ATI_pixel_format_float\r\nWGL_ARB_multisample\r\n"
  },
  {
    "path": "libs/glew/auto/doc/advanced.html",
    "content": "<h2>Automatic Code Generation</h2>\r\n\r\n<p>\r\nStarting from release 1.1.0, the source code and parts of the\r\ndocumentation are automatically generated from the extension\r\nspecifications in a two-step process.  In the first step,\r\nspecification files from the OpenGL registry are downloaded and\r\nparsed. Skeleton descriptors are created for each extension.  These\r\ndescriptors contain all necessary information for creating the source\r\ncode and documentation in a simple and compact format, including the\r\nname of the extension, url link to the specification, tokens, function\r\ndeclarations, typedefs and struct definitions.  In the second step,\r\nthe header files as well as the library and glewinfo source are\r\ngenerated from the descriptor files.  The code generation scripts are\r\nlocated in the <tt>auto</tt> subdirectory.\r\n</p>\r\n\r\n<p>\r\nThe code generation scripts require GNU make, wget, and perl. On\r\nWindows, the simplest way to get access to these tools is to install\r\n<a href=\"http://www.cygwin.com/\">Cygwin</a>, but make sure that the\r\nroot directory is mounted in binary mode. The makefile in the\r\n<tt>auto</tt> directory provides the following build targets:\r\n</p>\r\n\r\n<center>\r\n<table border=0 cellpadding=0 cellspacing=0> <!-- bgcolor=\"#f0f0f0\" -->\r\n<tr><td align=\"right\" valign=\"top\" width=\"25%\"><tt>make</tt></td>\r\n<td>&nbsp;&nbsp;&nbsp;&nbsp;</td>\r\n<td align=left>Create the source files from the descriptors. If the\r\ndescriptors do not exist, create them from the spec files. If the spec\r\nfiles do not exist, download them from the OpenGL repository.</td></tr>\r\n<tr><td align=\"right\" valign=\"top\"><tt>make clean</tt></td>\r\n<td>&nbsp;&nbsp;&nbsp;&nbsp;</td>\r\n<td align=left>Delete the source files.</td></tr>\r\n<tr><td align=\"right\" valign=\"top\"><tt>make clobber</tt></td>\r\n<td>&nbsp;&nbsp;&nbsp;&nbsp;</td>\r\n<td align=left>Delete the source files and the descriptors.</td></tr>\r\n<tr><td align=\"right\" valign=\"top\"><tt>make destroy</tt></td>\r\n<td>&nbsp;&nbsp;&nbsp;&nbsp;</td>\r\n<td align=left>Delete the source files, the descriptors, and the spec files.</td></tr>\r\n<tr><td align=\"right\" valign=\"top\"><tt>make custom</tt></td>\r\n<td>&nbsp;&nbsp;&nbsp;&nbsp;</td>\r\n<td align=left>Create the source files for the extensions\r\nlisted in <tt>auto/custom.txt</tt>. See \"Custom Code\r\nGeneration\" below for more details.</td></tr>\r\n</table>\r\n</center>\r\n\r\n<h3>Adding a New Extension</h3>\r\n\r\n<p>\r\nTo add a new extension, create a descriptor file for the extension in\r\n<tt>auto/core</tt> and rerun the code generation scripts by typing\r\n<tt>make clean; make</tt> in the <tt>auto</tt> directory.\r\n</p>\r\n\r\n<p>\r\nThe format of the descriptor file is given below. Items in\r\nbrackets are optional.\r\n</p>\r\n\r\n<p class=\"pre\">\r\n&lt;Extension Name&gt;<br>\r\n[&lt;URL of Specification File&gt;]<br>\r\n&nbsp;&nbsp;&nbsp;&nbsp;[&lt;Token Name&gt; &lt;Token Value&gt;]<br>\r\n&nbsp;&nbsp;&nbsp;&nbsp;[&lt;Token Name&gt; &lt;Token Value&gt;]<br>\r\n&nbsp;&nbsp;&nbsp;&nbsp;...<br>\r\n&nbsp;&nbsp;&nbsp;&nbsp;[&lt;Typedef&gt;]<br>\r\n&nbsp;&nbsp;&nbsp;&nbsp;[&lt;Typedef&gt;]<br>\r\n&nbsp;&nbsp;&nbsp;&nbsp;...<br>\r\n&nbsp;&nbsp;&nbsp;&nbsp;[&lt;Function Signature&gt;]<br>\r\n&nbsp;&nbsp;&nbsp;&nbsp;[&lt;Function Signature&gt;]<br>\r\n&nbsp;&nbsp;&nbsp;&nbsp;...<br>\r\n<!-- &nbsp;&nbsp;&nbsp;&nbsp;[&lt;Function Definition&gt;]<br>\r\n&nbsp;&nbsp;&nbsp;&nbsp;[&lt;Function Definition&gt;]<br>\r\n&nbsp;&nbsp;&nbsp;&nbsp;...<br> -->\r\n</p>\r\n\r\n<!--\r\n<p>\r\nNote that <tt>Function Definitions</tt> are copied to the header files\r\nwithout changes and have to be terminated with a semicolon. In\r\ncontrast, <tt>Tokens</tt>, <tt>Function signatures</tt>, and\r\n<tt>Typedefs</tt> should not be terminated with a semicolon.\r\n</p>\r\n-->\r\n\r\n<p>\r\nTake a look at one of the files in <tt>auto/core</tt> for an\r\nexample. Note that typedefs and function signatures should not be\r\nterminated with a semicolon.\r\n</p>\r\n\r\n<h3>Custom Code Generation</h3>\r\n<p>\r\nStarting from GLEW 1.3.0, it is possible to control which extensions\r\nto include in the libarary by specifying a list in\r\n<tt>auto/custom.txt</tt>. This is useful when you do not need all the\r\nextensions and would like to reduce the size of the source files.\r\nType <tt>make clean; make custom</tt> in the <tt>auto</tt> directory\r\nto rerun the scripts with the custom list of extensions.\r\n</p>\r\n\r\n<p>\r\nFor example, the following is the list of extensions needed to get GLEW and the\r\nutilities to compile.\r\n</p>\r\n\r\n<p class=\"pre\">\r\nWGL_ARB_extensions_string<br>\r\nWGL_ARB_multisample<br>\r\nWGL_ARB_pixel_format<br>\r\nWGL_ARB_pbuffer<br>\r\nWGL_EXT_extensions_string<br>\r\nWGL_ATI_pixel_format_float<br>\r\nWGL_NV_float_buffer<br>\r\n</p>\r\n\r\n<h2>Multiple Rendering Contexts (GLEW MX)</h2>\r\n\r\n<p>Starting with release 1.2.0, thread-safe support for multiple\r\nrendering contexts, possibly with different capabilities, is\r\navailable. Since this is not required by most users, it is not added\r\nto the binary releases to maintain compatibility between different\r\nversions. To include multi-context support, you have to do the\r\nfollowing:</p>\r\n<ol>\r\n<li>Compile and use GLEW with the <tt>GLEW_MX</tt> preprocessor token\r\ndefined.</li>\r\n<li>For each rendering context, create a <tt>GLEWContext</tt> object\r\nthat will be available as long as the rendering context exists.</li>\r\n<li>Define a macro or function called <tt>glewGetContext()</tt> that\r\nreturns a pointer to the <tt>GLEWContext</tt> object associated with\r\nthe rendering context from which OpenGL/WGL/GLX calls are issued. This\r\ndispatch mechanism is primitive, but generic.\r\n<li>Make sure that you call <tt>glewInit()</tt> after creating the\r\n<tt>GLEWContext</tt> object in each rendering context.  Note, that the\r\n<tt>GLEWContext</tt> pointer returned by <tt>glewGetContext()</tt> has\r\nto reside in global or thread-local memory.\r\n</ol>\r\n\r\n<p>Note that according to the <a\r\nhref=\"http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/ntopnglr_6yer.asp\">MSDN\r\nWGL documentation</a>, you have to initialize the entry points for\r\nevery rendering context that use pixel formats with different\r\ncapabilities For example, the pixel formats provided by the generic\r\nsoftware OpenGL implementation by Microsoft vs. the hardware\r\naccelerated pixel formats have different capabilities.  <b>GLEW by\r\ndefault ignores this requirement, and does not define per-context\r\nentry points (you can however do this using the steps described\r\nabove).</b> Assuming a global namespace for the entry points works in\r\nmost situations, because typically all hardware accelerated pixel\r\nformats provide the same entry points and capabilities. This means\r\nthat unless you use the multi-context version of GLEW, you need to\r\ncall <tt>glewInit()</tt> only once in your program, or more precisely,\r\nonce per process.</p>\r\n\r\n<h2>Separate Namespace</h2>\r\n\r\n<p>\r\nTo avoid name clashes when linking with libraries that include the\r\nsame symbols, extension entry points are declared in a separate\r\nnamespace (release 1.1.0 and up). This is achieved by aliasing OpenGL\r\nfunction names to their GLEW equivalents. For instance,\r\n<tt>glFancyFunction</tt> is simply an alias to\r\n<tt>glewFancyFunction</tt>.  The separate namespace does not effect\r\ntoken and function pointer definitions.\r\n</p>\r\n\r\n<h2>Known Issues</h2>\r\n\r\n<p>\r\nGLEW requires GLX 1.2 for compatibility with GLUT.\r\n</p>\r\n\r\n"
  },
  {
    "path": "libs/glew/auto/doc/basic.html",
    "content": "<h2>Initializing GLEW</h2>\r\n<p>\r\nFirst you need to create a valid OpenGL rendering context and call\r\n<tt>glewInit()</tt> to initialize the extension entry points.  If\r\n<tt>glewInit()</tt> returns <tt>GLEW_OK</tt>, the initialization\r\nsucceeded and you can use the available extensions as well as core\r\nOpenGL functionality. For example:\r\n</p>\r\n\r\n<p class=\"pre\">\r\n#include &lt;GL/glew.h&gt;<br>\r\n#include &lt;GL/glut.h&gt;<br>\r\n...<br>\r\nglutInit(&amp;argc, argv);<br>\r\nglutCreateWindow(\"GLEW Test\");<br>\r\nGLenum err = glewInit();<br>\r\nif (GLEW_OK != err)<br>\r\n{<br>\r\n&nbsp;&nbsp;/* Problem: glewInit failed, something is seriously wrong. */<br>\r\n&nbsp;&nbsp;fprintf(stderr, \"Error: %s\\n\", glewGetErrorString(err));<br>\r\n&nbsp;&nbsp;...<br>\r\n}<br>\r\nfprintf(stdout, \"Status: Using GLEW %s\\n\", glewGetString(GLEW_VERSION));<br>\r\n</p>\r\n\r\n<h2>Checking for Extensions</h2>\r\n\r\n<p>\r\nStarting from GLEW 1.1.0, you can find out if a particular extension\r\nis available on your platform by querying globally defined variables\r\nof the form <tt>GLEW_{extension_name}</tt>:\r\n</p>\r\n\r\n<p class=\"pre\">\r\nif (GLEW_ARB_vertex_program)<br>\r\n{<br>\r\n&nbsp;&nbsp;/* It is safe to use the ARB_vertex_program extension here. */<br>\r\n&nbsp;&nbsp;glGenProgramsARB(...);<br>\r\n}<br>\r\n</p>\r\n\r\n<p>\r\n<b>In GLEW 1.0.x, a global structure was used for this task. To ensure\r\nbinary compatibility between releases, the struct was replaced with a\r\nset of variables.</b>\r\n</p>\r\n\r\n<p>\r\nYou can also check for core OpenGL functionality.  For example, to\r\nsee if OpenGL 1.3 is supported, do the following:\r\n</p>\r\n\r\n<p class=\"pre\">\r\nif (GLEW_VERSION_1_3)<br>\r\n{<br>\r\n&nbsp;&nbsp;/* Yay! OpenGL 1.3 is supported! */<br>\r\n}<br>\r\n</p>\r\n\r\n<p>\r\nIn general, you can check if <tt>GLEW_{extension_name}</tt> or\r\n<tt>GLEW_VERSION_{version}</tt> is true or false.\r\n</p>\r\n\r\n<p>\r\nIt is also possible to perform extension checks from string\r\ninput. Starting from the 1.3.0 release, use <tt>glewIsSupported</tt>\r\nto check if the required core or extension functionality is\r\navailable:\r\n</p>\r\n\r\n<p class=\"pre\">\r\nif (glewIsSupported(\"GL_VERSION_1_4&nbsp;&nbsp;GL_ARB_point_sprite\"))<br>\r\n{<br>\r\n&nbsp;&nbsp;/* Great, we have OpenGL 1.4 + point sprites. */<br>\r\n}<br>\r\n</p>\r\n\r\n<p>\r\nFor extensions only, <tt>glewGetExtension</tt> provides a slower alternative\r\n(GLEW 1.0.x-1.2.x). <b>Note that in the 1.3.0 release </b>\r\n<tt>glewGetExtension</tt> <b>was replaced with </b>\r\n<tt>glewIsSupported</tt>.\r\n</p>\r\n\r\n<p class=\"pre\">\r\nif (glewGetExtension(\"GL_ARB_fragment_program\"))<br>\r\n{<br>\r\n&nbsp;&nbsp;/* Looks like ARB_fragment_program is supported. */<br>\r\n}<br>\r\n</p>\r\n\r\n<h2>Experimental Drivers</h2>\r\n\r\n<p>\r\nGLEW obtains information on the supported extensions from the graphics\r\ndriver.  Experimental or pre-release drivers, however, might not\r\nreport every available extension through the standard mechanism, in\r\nwhich case GLEW will report it unsupported.  To circumvent this\r\nsituation, the <tt>glewExperimental</tt> global switch can be turned\r\non by setting it to <tt>GL_TRUE</tt> before calling\r\n<tt>glewInit()</tt>, which ensures that all extensions with valid\r\nentry points will be exposed.\r\n</p>\r\n\r\n<h2>Platform Specific Extensions</h2>\r\n\r\n<p>\r\nPlatform specific extensions are separated into two header files:\r\n<tt>wglew.h</tt> and <tt>glxew.h</tt>, which define the available\r\n<tt>WGL</tt> and <tt>GLX</tt> extensions.  To determine if a certain\r\nextension is supported, query <tt>WGLEW_{extension name}</tt> or\r\n<tt>GLXEW_{extension_name}</tt>.  For example:\r\n</p>\r\n\r\n<p class=\"pre\">\r\n#include &lt;GL/wglew.h&gt;<br>\r\n<br>\r\nif (WGLEW_ARB_pbuffer)<br>\r\n{<br>\r\n&nbsp;&nbsp;/* OK, we can use pbuffers. */<br>\r\n}<br>\r\nelse<br>\r\n{<br>\r\n&nbsp;&nbsp;/* Sorry, pbuffers will not work on this platform. */<br>\r\n}<br>\r\n</p>\r\n\r\n<p>\r\nAlternatively, use <tt>wglewIsSupported</tt> or\r\n<tt>glxewIsSupported</tt> to check for extensions from a string:\r\n</p>\r\n\r\n<p class=\"pre\">\r\nif (wglewIsSupported(\"WGL_ARB_pbuffer\"))<br>\r\n{<br>\r\n&nbsp;&nbsp;/* OK, we can use pbuffers. */<br>\r\n}<br>\r\n</p>\r\n\r\n<h2>Utilities</h2>\r\n\r\n<p>\r\nGLEW provides two command-line utilities: one for creating a list of\r\navailable extensions and visuals; and another for verifying extension\r\nentry points.\r\n</p>\r\n\r\n<h3>visualinfo: extensions and visuals</h3>\r\n\r\n<p>\r\n<tt>visualinfo</tt> is an extended version of <tt>glxinfo</tt>. The\r\nWindows version creates a file called <tt>visualinfo.txt</tt>, which\r\ncontains a list of available OpenGL, WGL, and GLU extensions as well\r\nas a table of visuals aka. pixel formats. Pbuffer and MRT capable\r\nvisuals are also included. For additional usage information, type\r\n<tt>visualinfo -h</tt>.\r\n</p>\r\n\r\n<h3>glewinfo: extension verification utility</h3>\r\n\r\n<p>\r\n<tt>glewinfo</tt> allows you to verify the entry points for the\r\nextensions supported on your platform. The Windows version\r\nreports the results to a text file called <tt>glewinfo.txt</tt>. The\r\nUnix version prints the results to <tt>stdout</tt>.\r\n</p>\r\n\r\n<p>Windows usage:</p>\r\n <blockquote><pre>glewinfo [-pf &lt;id&gt;]</pre></blockquote>\r\n\r\n<p>where <tt>&lt;id&gt;</tt> is the pixel format id for which the\r\ncapabilities are displayed.</p>\r\n\r\n<p>Unix usage:</p>\r\n<blockquote><pre>glewinfo [-display &lt;dpy&gt;] [-visual &lt;id&gt;]</pre></blockquote>\r\n\r\n<p>where <tt>&lt;dpy&gt;</tt> is the X11 display and <tt>&lt;id&gt;</tt> is\r\nthe visual id for which the capabilities are displayed.</p>\r\n\r\n"
  },
  {
    "path": "libs/glew/auto/doc/credits.html",
    "content": "<h2>Credits</h2>\r\n\r\n<p>\r\nGLEW was developed by <a href=\"http://www.cs.utah.edu/~ikits/\">Milan\r\nIkits</a> and <a\r\nhref=\"http://wwwvis.informatik.uni-stuttgart.de/~magallon/\">Marcelo\r\nMagallon</a>.  They also perform occasional maintainance to make sure\r\nthat GLEW stays in mint condition.  Aaron Lefohn, Joe Kniss, and Chris\r\nWyman were the first users and also assisted with the design and\r\ndebugging process.  The acronym GLEW originates from Aaron Lefohn.\r\nPasi K&auml;rkk&auml;inen identified and fixed several problems with\r\nGLX and SDL.  Nate Robins created the <tt>wglinfo</tt> utility, to\r\nwhich modifications were made by Michael Wimmer.  \r\n</p>\r\n\r\n<h2>Copyright</h2>\r\n\r\n<p>\r\nGLEW is originally derived from the EXTGL project by Lev Povalahev.\r\nThe source code is licensed under the <a href=\"glew.txt\">Modified BSD\r\nLicense</a>, the <a href=\"mesa.txt\">Mesa 3-D License</a> (MIT\r\nLicense), and the <a href=\"khronos.txt\">Khronos License</a> (MIT\r\nLicense).  The automatic code generation scripts are released under\r\nthe <a href=\"gpl.txt\">GNU GPL</a>.\r\n</p>\r\n"
  },
  {
    "path": "libs/glew/auto/doc/index.html",
    "content": "<p>\r\nThe OpenGL Extension Wrangler Library (GLEW) is a cross-platform\r\nopen-source C/C++ extension loading library.  GLEW provides efficient\r\nrun-time mechanisms for determining which OpenGL extensions are\r\nsupported on the target platform.  OpenGL core and extension\r\nfunctionality is exposed in a single header file.  GLEW has been\r\ntested on a variety of operating systems, including Windows, Linux,\r\nMac OS X, FreeBSD, Irix, and Solaris.\r\n</p>\r\n\r\n<h2>Download Center</h2>\r\n<p>\r\n<a href=\"http://sourceforge.net/projects/glew/\">GLEW</a> is distributed\r\nas source and precompiled binaries. The latest release is\r\n<a href=\"https://sourceforge.net/projects/glew/files/glew/1.5.3/\">1.5.3</a>\r\n[12-31-09]:\r\n</p>\r\n<p>\r\n</p>\r\n<p>\r\n<table border=\"1\" cellpadding=\"5\" cellspacing=\"0\" bgcolor=\"#f0f0f0\" align=\"center\">\r\n<tr>\r\n<td>\r\n<table border=\"0\" cellpadding=\"3\" cellspacing=\"0\">\r\n<tr>\r\n<td></td>\r\n<td align=\"right\"><b>Source</b></td>\r\n<td></td>\r\n<td align=\"left\">\r\n<a href=\"https://sourceforge.net/projects/glew/files/glew/1.5.3/glew-1.5.3.zip/download\">ZIP</a>&nbsp;|&nbsp;\r\n<a href=\"https://sourceforge.net/projects/glew/files/glew/1.5.3/glew-1.5.3.tgz/download\">TGZ</a></td>\r\n<td></td>\r\n</tr>\r\n<tr>\r\n<td></td>\r\n<td align=\"right\"><b>Binaries</b></td>\r\n<td></td>\r\n<td align=\"left\">\r\n<a href=\"https://sourceforge.net/projects/glew/files/glew/1.5.3/glew-1.5.3-win32.zip/download\">Windows 32-bit</a>&nbsp;|&nbsp;\r\n<a href=\"https://sourceforge.net/projects/glew/files/glew/1.5.3/glew-1.5.3-win64.zip/download\">64-bit</a>&nbsp;\r\n</td>\r\n<td></td>\r\n</tr>\r\n</table>\r\n</tr>\r\n</table>\r\n<p></p>\r\n<p>\r\nAn up-to-date copy is also available from the <a\r\nhref=\"http://glew.svn.sourceforge.net/svnroot/glew/trunk/glew/\">project\r\nrepository</a>:\r\n</p>\r\n<p>\r\n<tt>svn co https://glew.svn.sourceforge.net/svnroot/glew/trunk/glew glew</tt>\r\n</p>\r\n\r\n<h2>Supported Extensions</h2>\r\n<p>\r\nThe latest release contains support for OpenGL 3.2 and the following extensions:\r\n</p>\r\n<ul>\r\n<li><a href=\"glew.html\">OpenGL extensions</a>\r\n<li><a href=\"wglew.html\">WGL extensions</a>\r\n<li><a href=\"glxew.html\">GLX extensions</a>\r\n</ul>\r\n\r\n<h2>News</h2>\r\n<ul>\r\n<li>[02-28-10] <a href=\"https://sourceforge.net/projects/glew/files/glew/1.5.3/\">GLEW 1.5.3</a> fixes minor bugs and adds three new extensions</li>>\r\n<li>[12-31-09] <a href=\"https://sourceforge.net/projects/glew/files/glew/1.5.2/\">GLEW 1.5.2</a> adds support for OpenGL 3.1, OpenGL 3.2 and new extensions</li>\r\n<li>[11-03-08] <a href=\"https://sourceforge.net/project/showfiles.php?group_id=67586&amp;package_id=67942&amp;release_id=637800\">GLEW 1.5.1</a> adds support for OpenGL 3.0 and 31 new extensions</li>\r\n<li>[12-27-07] <a href=\"https://sourceforge.net/project/showfiles.php?group_id=67586&amp;package_id=67942&amp;release_id=564464\">GLEW 1.5.0</a> is released under less restrictive licenses</li>\r\n<li>[04-27-07] <a href=\"https://sourceforge.net/project/showfiles.php?group_id=67586&amp;package_id=67942&amp;release_id=504079\">GLEW 1.4.0</a> is released</li>\r\n<li>[03-08-07] GLEW is included in the <a href=\"http://developer.nvidia.com/object/sdk_home.html\">NVIDIA OpenGL SDK</a></li>\r\n<li>[03-04-07] <a href=\"https://sourceforge.net/project/showfiles.php?group_id=67586&amp;package_id=67942&amp;release_id=491113\">GLEW 1.3.6</a> is released</li>\r\n<li>[02-28-07] <a href=\"http://glew.svn.sourceforge.net/svnroot/glew/trunk/glew/\">Repository</a> is migrated to SVN</li>\r\n<li>[02-25-07] GLEW is included in the <a href=\"http://www.opengl.org/sdk/\">OpenGL SDK</a></li>\r\n<li>[11-21-06] <a href=\"https://sourceforge.net/project/showfiles.php?group_id=67586&amp;package_id=67942&amp;release_id=465334\">GLEW 1.3.5</a> adds OpenGL 2.1 and NVIDIA G80 extensions</li>\r\n<li>[03-04-06] <a href=\"https://sourceforge.net/project/showfiles.php?group_id=67586&amp;package_id=67942&amp;release_id=398455\">GLEW 1.3.4</a> adds support for five new extensions</li>\r\n<li>[05-16-05] <a href=\"https://sourceforge.net/project/showfiles.php?group_id=67586&amp;package_id=67942&amp;release_id=327647\">GLEW 1.3.3</a> is released</li>\r\n<li>[03-16-05] <a href=\"https://sourceforge.net/project/showfiles.php?group_id=67586&amp;package_id=67942&amp;release_id=313345\">GLEW 1.3.2</a> adds support for GL_APPLE_pixel_buffer</li>\r\n<li>[02-11-05] <a href=\"http://gljava.sourceforge.net/\">gljava</a> and <a href=\"http://sdljava.sourceforge.net/\">sdljava</a> provide a Java binding to OpenGL via GLEW</li>\r\n<li>[02-02-05] <a href=\"https://sourceforge.net/project/showfiles.php?group_id=67586&amp;package_id=67942&amp;release_id=302049\">GLEW 1.3.1</a> adds support for <a href=\"http://www.opengl.org/documentation/extensions/EXT_framebuffer_object.txt\">GL_EXT_framebuffer_object</a></li>\r\n<li>[01-04-05] <a href=\"https://sourceforge.net/project/showfiles.php?group_id=67586&amp;package_id=67942&amp;release_id=294527\">GLEW 1.3.0</a> adds core OpenGL 2.0 support plus many enhancements</li>\r\n<li>[12-22-04] <a href=\"http://glewpy.sf.net/\">GLEWpy</a> Python wrapper announced</li>\r\n<li>[12-12-04] <a href=\"https://sourceforge.net/mail/?group_id=67586\">Mailing lists</a> created on sourceforge</li>\r\n<li>[12-06-04] <a href=\"http://sourceforge.net/project/showfiles.php?group_id=67586&amp;package_id=67942&amp;release_id=287948\">GLEW 1.2.5</a> adds new extensions and support for FreeBSD</li>\r\n</ul>\r\n\r\n<h2>Links</h2>\r\n<ul>\r\n<li><a href=\"http://www.opengl.org/sdk/\">OpenGL Software Development Kit</a></li>\r\n<li><a href=\"http://www.opengl.org/resources/features/OGLextensions/\">All About OpenGL Extensions</a></li>\r\n<li><a href=\"http://www.opengl.org/registry/\">OpenGL Extension Registry</a></li>\r\n<li><a href=\"http://ati.amd.com/developer/sdk/radeonSDK/html/info/Prog3D.html\">ATI OpenGL Extension Specifications</a></li>\r\n<li><a href=\"http://developer.apple.com/graphicsimaging/opengl/extensions.html\">APPLE OpenGL Extensions Guide</a></li>\r\n<li><a href=\"http://developer.nvidia.com/object/nvidia_opengl_specs.html\">NVIDIA OpenGL Extension Specifications</a></li>\r\n</ul>\r\n\r\n"
  },
  {
    "path": "libs/glew/auto/doc/install.html",
    "content": "<h2>Installation</h2>\r\n\r\n<p>\r\nTo use the shared library version of GLEW, you need to copy the\r\nheaders and libraries into their destination directories. On Windows\r\nthis typically boils down to copying:\r\n</p>\r\n\r\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\"> <!-- bgcolor=\"#f0f0f0\" -->\r\n<tr><td align=\"left\"><tt>bin/glew32.dll</tt></td><td>&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;&nbsp;&nbsp;&nbsp;</td>\r\n<td align=\"left\"><tt>%SystemRoot%/system32</tt></td></tr>\r\n<tr><td align=\"left\"><tt>lib/glew32.lib</tt></td><td>&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;&nbsp;&nbsp;&nbsp;</td>\r\n<td align=\"left\"><tt>{VC Root}/Lib</tt></td></tr>\r\n<tr><td align=\"left\"><tt>include/GL/glew.h</tt></td><td>&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;&nbsp;&nbsp;&nbsp;</td>\r\n<td align=\"left\"><tt>{VC Root}/Include/GL</tt></td></tr>\r\n<tr><td align=\"left\"><tt>include/GL/wglew.h</tt></td><td>&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;&nbsp;&nbsp;&nbsp;</td>\r\n<td align=\"left\"><tt>{VC Root}/Include/GL</tt></td></tr>\r\n</table>\r\n<p>\r\n</p>\r\n\r\n<p>\r\nwhere <tt>{VC Root}</tt> is the Visual C++ root directory, typically\r\n<tt>C:/Program Files/Microsoft Visual Studio/VC98</tt> for Visual\r\nStudio 6.0 or <tt>C:/Program Files/Microsoft Visual\r\nStudio .NET 2003/Vc7/PlatformSDK</tt> for Visual Studio .NET.\r\n</p>\r\n\r\n<p>\r\nOn Unix, typing <tt>make install</tt> will attempt to install GLEW\r\ninto <tt>/usr/include/GL</tt> and <tt>/usr/lib</tt>.  You can\r\ncustomize the installation target via the <tt>GLEW_DEST</tt>\r\nenvironment variable if you do not have write access to these\r\ndirectories.\r\n</p>\r\n\r\n<h2>Building Your Project with GLEW</h2>\r\n<p>\r\nThere are two ways to build your project with GLEW.\r\n</p>\r\n<h3>Including the source files / project file</h3>\r\n<p>\r\nThe simpler but less flexible way is to include <tt>glew.h</tt> and\r\n<tt>glew.c</tt> into your project.  On Windows, you also need to\r\ndefine the <tt>GLEW_STATIC</tt> preprocessor token when building a\r\nstatic library or executable, and the <tt>GLEW_BUILD</tt> preprocessor\r\ntoken when building a dll.  You also need to replace\r\n<tt>&lt;GL/gl.h&gt;</tt> and <tt>&lt;GL/glu.h&gt;</tt> with\r\n<tt>&lt;glew.h&gt;</tt> in your code and set the appropriate include\r\nflag (<tt>-I</tt>) to tell the compiler where to look for it.  For\r\nexample:\r\n</p>\r\n<p class=\"pre\">\r\n#include &lt;glew.h&gt;<br>\r\n#include &lt;GL/glut.h&gt;<br>\r\n&lt;gl, glu, and glut functionality is available here&gt;<br>\r\n</p>\r\n<p>\r\nDepending on where you put <tt>glew.h</tt> you may also need to change\r\nthe include directives in <tt>glew.c</tt>. Note that if you are using\r\nGLEW together with GLUT, you have to include <tt>glew.h</tt> first.\r\nIn addition, <tt>glew.h</tt> includes <tt>glu.h</tt>, so you do not\r\nneed to include it separately.\r\n</p>\r\n<p>\r\nOn Windows, you also have the option of adding the supplied project\r\nfile <tt>glew_static.dsp</tt> to your workspace (solution) and compile\r\nit together with your other projects.  In this case you also need to\r\nchange the <tt>GLEW_BUILD</tt> preprocessor constant to\r\n<tt>GLEW_STATIC</tt> when building a static library or executable,\r\notherwise you get build errors.\r\n</p>\r\n<p>\r\n<b>Note that GLEW does not use the C\r\nruntime library, so it does not matter which version (single-threaded,\r\nmulti-threaded or multi-threaded DLL) it is linked with (without\r\ndebugging information). It is, however, always a good idea to compile all\r\nyour projects including GLEW with the same C runtime settings.</b>\r\n</p>\r\n\r\n<h3>Using GLEW as a shared library</h3>\r\n\r\n<p>\r\nAlternatively, you can use the provided project files / makefile to\r\nbuild a separate shared library you can link your projects with later.\r\nIn this case the best practice is to install <tt>glew.h</tt>,\r\n<tt>glew32.lib</tt>, and <tt>glew32.dll</tt> / <tt>libGLEW.so</tt> to\r\nwhere the OpenGL equivalents <tt>gl.h</tt>, <tt>opengl32.lib</tt>, and\r\n<tt>opengl32.dll</tt> / <tt>libGL.so</tt> are located.  Note that you\r\nneed administrative privileges to do this.  If you do not have\r\nadministrator access and your system administrator will not do it for\r\nyou, you can install GLEW into your own lib and include subdirectories\r\nand tell the compiler where to find it. Then you can just replace\r\n<tt>&lt;GL/gl.h&gt;</tt> with <tt>&lt;GL/glew.h&gt;</tt> in your\r\nprogram:\r\n</p>\r\n\r\n<p class=\"pre\">\r\n#include &lt;GL/glew.h&gt;<br>\r\n#include &lt;GL/glut.h&gt;<br>\r\n&lt;gl, glu, and glut functionality is available here&gt;<br>\r\n</p>\r\n\r\n<p>\r\nor:\r\n</p>\r\n\r\n<p class=\"pre\">\r\n#include &lt;GL/glew.h&gt;<br>\r\n&lt;gl and glu functionality is available here&gt;<br>\r\n</p>\r\n\r\n<p>\r\nRemember to link your project with <tt>glew32.lib</tt>,\r\n<tt>glu32.lib</tt>, and <tt>opengl32.lib</tt> on Windows and\r\n<tt>libGLEW.so</tt>, <tt>libGLU.so</tt>, and <tt>libGL.so</tt> on\r\nUnix (<tt>-lGLEW -lGLU -lGL</tt>).\r\n</p>\r\n\r\n<p>\r\nIt is important to keep in mind that <tt>glew.h</tt> includes neither\r\n<tt>windows.h</tt> nor <tt>gl.h</tt>.  Also, GLEW will warn you by\r\nissuing a preprocessor error in case you have included <tt>gl.h</tt>,\r\n<tt>glext.h</tt>, or <tt>glATI.h</tt> before <tt>glew.h</tt>.\r\n</p>\r\n\r\n"
  },
  {
    "path": "libs/glew/auto/doc/log.html",
    "content": "<h2>Change Log</h2>\r\n\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.5.3</b> [02-28-10]\r\n<ul>\r\n<li> New extensions:\r\n<ul>\r\n<li> GLX_INTEL_swap_event\r\n<li> GL_AMD_seamless_cubemap_per_texture\r\n<li> GL_AMD_shader_stencil_export\r\n</ul>\r\n<li> Bug fixes:\r\n<ul>\r\n<li> Correct version detection for GL 3.1 and 3.2\r\n<li> Missing 3.1 enumerants\r\n<li> Add glew.pc\r\n</ul>\r\n</ul>\r\n</ul>\r\n\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.5.2</b> [12-31-09]\r\n<ul>\r\n<li> New features:\r\n<ul>\r\n<li> Support for OpenGL 3.1\r\n<li> Support for OpenGL 3.2\r\n</ul>\r\n<li> New extensions:\r\n<ul>\r\n<li> GL_AMD_draw_buffers_blend\r\n<li> GL_AMD_performance_monitor\r\n<li> GL_AMD_texture_texture4\r\n<li> GL_AMD_vertex_shader_tessellator\r\n<li> GL_APPLE_aux_depth_stencil\r\n<li> GL_APPLE_object_purgeable\r\n<li> GL_APPLE_rgb_422\r\n<li> GL_APPLE_row_bytes\r\n<li> GL_APPLE_vertex_program_evaluators\r\n<li> GL_ARB_compatibility\r\n<li> GL_ARB_copy_buffer\r\n<li> GL_ARB_depth_clamp\r\n<li> GL_ARB_draw_buffers_blend\r\n<li> GL_ARB_draw_elements_base_vertex\r\n<li> GL_ARB_fragment_coord_conventions\r\n<li> GL_ARB_provoking_vertex\r\n<li> GL_ARB_sample_shading\r\n<li> GL_ARB_seamless_cube_map\r\n<li> GL_ARB_shader_texture_lod\r\n<li> GL_ARB_sync\r\n<li> GL_ARB_texture_cube_map_array\r\n<li> GL_ARB_texture_gather\r\n<li> GL_ARB_texture_multisample\r\n<li> GL_ARB_texture_query_lod\r\n<li> GL_ARB_uniform_buffer_object\r\n<li> GL_ARB_vertex_array_bgra\r\n<li> GL_ATI_meminfo\r\n<li> GL_EXT_provoking_vertex\r\n<li> GL_EXT_separate_shader_objects\r\n<li> GL_EXT_texture_snorm\r\n<li> GL_NV_copy_image\r\n<li> GL_NV_parameter_buffer_object2\r\n<li> GL_NV_shader_buffer_load\r\n<li> GL_NV_texture_barrier\r\n<li> GL_NV_transform_feedback2\r\n<li> GL_NV_vertex_buffer_unified_memory\r\n<li> WGL_AMD_gpu_association\r\n<li> WGL_ARB_create_context_profile\r\n<li> WGL_NV_copy_image\r\n<li> GLX_ARB_create_context_profile\r\n<li> GLX_EXT_swap_control\r\n<li> GLX_NV_copy_image\r\n</ul>\r\n<li> Bug fixes:\r\n<ul>\r\n<li> DOS line endings for windows .zip archives only.\r\n<li> glTransformFeedbackVaryings arguments.\r\n<li> Resource leak in glewinfo and visualinfo tools.\r\n<li> WIN32_LEAN_AND_MEAN preprocessor pollution.\r\n<li> Fixed version detection for GLEW_VERSION_2_1 and GLEW_VERSION_3_0.\r\n<li> MesaGLUT glut.h GLAPIENTRY dependency.\r\n<li> glFramebufferTextureLayer correction.\r\n<li> OSX compiler warnings resolved.\r\n<li> Cygwin linking to opengl32 by default, rather than X11 OpenGL.\r\n<li> SnowLeopard (OSX 10.6) gl.h detection.\r\n<li> Use $(STRIP) consistently.\r\n</ul>\r\n</ul>\r\n</ul>\r\n\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.5.1</b> [11-03-08]\r\n<ul>\r\n<li> New features:\r\n<ul>\r\n<li> Support for OpenGL 3.0\r\n</ul>\r\n<li> New extensions:\r\n<ul>\r\n<li> GL_ARB_depth_buffer_float\r\n<li> GL_ARB_draw_instance,\r\n<li> GL_ARB_framebuffer_object\r\n<li> GL_ARB_framebuffer_sRGB\r\n<li> GL_ARB_geometry_shader4\r\n<li> GL_ARB_half_float_pixel\r\n<li> GL_ARB_half_float_vertex\r\n<li> GL_ARB_instanced_arrays\r\n<li> GL_ARB_map_buffer_range\r\n<li> GL_ARB_texture_buffer_object\r\n<li> GL_ARB_texture_compression_rgtc\r\n<li> GL_ARB_vertex_array_object\r\n<li> GL_EXT_direct_state_access\r\n<li> GL_EXT_texture_swizzle\r\n<li> GL_EXT_transform_feedback\r\n<li> GL_EXT_vertex_array_bgra\r\n<li> GL_NV_conditional_render\r\n<li> GL_NV_explicit_multisample\r\n<li> GL_NV_present_video\r\n<li> GL_SGIS_point_line_texgen\r\n<li> GL_SGIX_convolution_accuracy\r\n<li> WGL_ARB_create_context\r\n<li> WGL_ARB_framebuffer_sRGB\r\n<li> WGL_NV_present_video\r\n<li> WGL_NV_swap_group\r\n<li> WGL_NV_video_output\r\n<li> GLX_ARB_create_context\r\n<li> GLX_ARB_framebuffer_sRGB\r\n<li> GLX_NV_present_video\r\n<li> GLX_NV_swap_group\r\n<li> GLX_NV_video_output\r\n</ul>\r\n<li> Bug fixes:\r\n<ul>\r\n<li> Licensing issues with documentation\r\n<li> Problems with long long and _MSC_VER on MINGW \r\n<li> Incorrect parameter for glGetUniformLocation\r\n<li> glewGetExtension fails on last entry \r\n<li> Incomplete GL_NV_texture_shader tokens\r\n<li> Scripting problems on Cygwin\r\n<li> Incorrect definition for GLint on OS X\r\n</ul> \r\n</ul>\r\n</ul>\r\n\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.5.0</b> [12-27-07]\r\n<ul>\r\n<li> New features:\r\n<ul>\r\n<li> Licensing change (BSD, Mesa 3-D, Khronos)\r\n<li> Switch to using registry on <a href=\"http://www.opengl.org/registry/\">www.opengl.org</a>\r\n<li> Support for major and minor version strings\r\n</ul>\r\n<li> New extensions:\r\n<ul>\r\n<li> GL_APPLE_flush_buffer_range\r\n<li> GL_GREMEDY_frame_terminator\r\n<li> GLX_EXT_texture_from_pixmap\r\n</ul>\r\n<li> Bug fixes:\r\n<ul>\r\n<li> Incorrent 64-bit type definitions\r\n<li> Do not strip static library on install\r\n<li> Missing tokens in GL_ATI_fragment_shader and WGL_{ARB,EXT}_make_current_read\r\n<li> Missing tokens in GL_VERSION_2_1\r\n<li> Missing functions in GL_VERSION_1_4\r\n<li> Incorrect parameter type for glXCopyContext\r\n</ul> \r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.4.0</b> [04-27-07]\r\n<ul>\r\n<li> New features:\r\n<ul>\r\n<li> Extension variables are declared const to avoid possible\r\ncorruption of their values\r\n</ul>\r\n<li> New extensions:\r\n<ul>\r\n<li> GL_NV_depth_range_unclamped\r\n</ul>\r\n<li> Bug fixes:\r\n<ul>\r\n<li> Incorrect tokens in GL_NV_transform_feedback and GL_NV_framebuffer_multisample_coverage\r\n<li> Incorrect function names in GL_EXT_gpu_program_parameters\r\n<li> Missing tokens in GL_EXT_framebuffer_multisample\r\n<li> GLEW_MX initialization problem for WGL_{ARB,EXT}_extensions_string\r\n</ul> \r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.3.6</b> [03-04-07]\r\n<ul>\r\n<li> New extensions:\r\n<ul>\r\n<li> GL_ATI_shader_texture_lod\r\n<li> GL_EXT_gpu_program_parameters\r\n<li> GL_NV_geometry_shader4\r\n<li> WGL_NV_gpu_affinity\r\n<li> GLX_SGIX_hyperpipe\r\n</ul>\r\n<li> Bug fixes:\r\n<ul>\r\n<li> Missing include guards in glxew.h\r\n<li> Makefile and install problems for Cygwin builds\r\n<li> Install problem for Linux AMD64 builds\r\n<li> Incorrent token in GL_ATI_texture_compression_3dc\r\n<li> Missing tokens from GL_ATIX_point_sprites\r\n</ul>\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.3.5</b> [11-21-06]\r\n<ul>\r\n<li> New features:\r\n<ul>\r\n<li> Support for core OpenGL 2.1\r\n<li> Debug support for glewIsSupported\r\n</ul>\r\n<li> New extensions:\r\n<ul>\r\n<li> GL_EXT_bindable_uniform\r\n<li> GL_EXT_draw_buffers2\r\n<li> GL_EXT_draw_instanced\r\n<li> GL_EXT_framebuffer_sRGB\r\n<li> GL_EXT_geometry_shader4\r\n<li> GL_EXT_gpu_shader4\r\n<li> GL_EXT_packed_float\r\n<li> GL_EXT_texture_array\r\n<li> GL_EXT_texture_buffer_object\r\n<li> GL_EXT_texture_compression_latc\r\n<li> GL_EXT_texture_compression_rgtc\r\n<li> GL_EXT_texture_integer\r\n<li> GL_EXT_texture_shared_exponent\r\n<li> GL_EXT_timer_query\r\n<li> GL_NV_depth_buffer_float\r\n<li> GL_NV_fragment_program4\r\n<li> GL_NV_framebuffer_multisample_coverage\r\n<li> GL_NV_geometry_program4\r\n<li> GL_NV_gpu_program4\r\n<li> GL_NV_parameter_buffer_object\r\n<li> GL_NV_transform_feedback\r\n<li> GL_NV_vertex_program4\r\n<li> GL_OES_byte_coordinates\r\n<li> GL_OES_compressed_paletted_texture\r\n<li> GL_OES_read_format\r\n<li> GL_OES_single_precision\r\n<li> WGL_EXT_pixel_format_packed_float\r\n<li> WGL_EXT_framebuffer_sRGB\r\n<li> GLX_EXT_fbconfig_packed_float\r\n<li> GLX_EXT_framebuffer_sRGB\r\n</ul>\r\n<li> Bug fixes:\r\n<ul>\r\n<li> Wrong GLXContext definition on Solaris\r\n<li> Makefile problem for parallel builds\r\n</ul>\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.3.4</b> [03-04-06]\r\n<ul>\r\n<li> New extensions:\r\n<ul>\r\n<li> GL_EXT_framebuffer_blit\r\n<li> GL_EXT_framebuffer_multisample\r\n<li> GL_EXT_packed_depth_stencil\r\n<li> GL_MESAX_texture_stack\r\n<li> WGL_3DL_stereo_control\r\n</ul>\r\n</ul>\r\n<ul>\r\n<li> Bug fixes:\r\n<ul>\r\n<li> glBlendEquation missing from GL_ARB_imaging\r\n<li> Wrong APIENTRY definition for Cygwin\r\n<li> Incorrect OS X OpenGL types\r\n<li> Unix 64-bit installation patch\r\n</ul>\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.3.3</b> [05-16-05]\r\n<ul>\r\n<li> New feature:\r\n<ul>\r\n<li> Code generation option to split source into multiple files\r\n</ul>\r\n</ul>\r\n<ul>\r\n<li> Bug fixes:\r\n<ul>\r\n<li> OpenGL 2.0 core initialization problems\r\n<li> Wrong value for token GL_SHADER_TYPE\r\n<li> Missing tokens in GL_ATI_fragment_shader\r\n<li> Missing entry points in GL_ARB_transpose_matrix\r\n</ul>\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.3.2</b> [03-16-05]\r\n<ul>\r\n<li> New extension:\r\n<ul>\r\n<li> GL_APPLE_pixel_buffer\r\n</ul>\r\n<li> Bug fixes:\r\n<ul>\r\n<li> Missing OpenGL 2.0 entry points\r\n<li> Missing tokens in GL_SGIX_shadow\r\n<li> MinGW makefile problem\r\n<li> Check for incorrect OpenGL version string on SiS hardware\r\n<li> Documentation update to meet the HTML 4.01 Transitional specification\r\n</ul>\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.3.1</b> [02-02-05]\r\n<ul>\r\n<li> New features:\r\n<ul>\r\n<li> Consistent Unix and Windows versioning\r\n</ul>\r\n<li> New extensions:\r\n<ul>\r\n<li> GL_EXT_framebuffer_object\r\n<li> GL_ARB_pixel_buffer_object\r\n</ul>\r\n<li> Bug fixes:\r\n<ul>\r\n<li> Missing OpenGL 2.0 tokens\r\n<li> Incorrect typedefs (GLhandleARB and GLhalf)\r\n<li> Borland compiler problems\r\n</ul>\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.3.0</b> [01-04-05]\r\n<ul>\r\n<li> New features:\r\n<ul>\r\n<li> Support for core OpenGL 2.0\r\n<li> <tt>glewIsSupported</tt> provides efficient string-based extension checks\r\n<li> Custom code generation from a list of extensions\r\n<li> Makefile changes\r\n</ul>\r\n<li> New extensions:\r\n<ul>\r\n<li> WGL_ATI_render_texture_rectangle\r\n</ul>\r\n<li> Bug fixes:\r\n<ul>\r\n<li> Incorrect function signature in OpenGL 1.5 core\r\n</ul>\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.2.5</b> [12-06-04]\r\n<ul>\r\n<li> New extensions:\r\n<ul>\r\n<li>GL_ATI_texture_compression_3dc\r\n<li>GL_EXT_Cg_shader\r\n<li>GL_EXT_draw_range_elements\r\n<li>GL_KTX_buffer_region\r\n</ul>\r\n<li> Bug fixes:\r\n<ul>\r\n<li> OpenGL version detection bug\r\n<li> Problems with wxWindows and MinGW compilation\r\n<li> <tt>visualinfo</tt> compilation problem with GLEW_MX specified\r\n<li> Wrong token name in OpenGL 1.5 core\r\n</ul>\r\n<li> Support for FreeBSD\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.2.4</b> [09-06-04]\r\n<ul>\r\n<li> Added ARB_draw_buffers and ARB_texture_rectangle\r\n<li> Fixed bug in ARB_shader_objects\r\n<li> Replaced <tt>wglinfo</tt> with <tt>visualinfo</tt>\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.2.3</b> [06-10-04]\r\n<ul>\r\n<li> Added GL_NV_fragment_program2, GL_NV_fragment_program_option, GL_NV_vertex_program2_option, GL_NV_vertex_program3\r\n<li> Bug fix in GL_ARB_vertex_blend\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.2.2</b> [05-08-04]\r\n<ul>\r\n<li> Added GL_EXT_pixel_buffer_object, removed GL_NV_element_array\r\n<li> Fixed GLEW_MX problems\r\n<li> Bug fix in GL_EXT_texture_rectangle and <tt>wglinfo</tt>\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.2.1</b> [03-18-04]\r\n<ul>\r\n<li> Bug fix in OpenGL version query (early release of 1.2.0 contained this bug)\r\n<li> Bug fix in GL_ARB_shader_objects and temporary bug fix in GL_ARB_vertex_shader\r\n<li> Added flags on GDI support and multisampling to <tt>wglinfo</tt>\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.2.0</b> [02-19-04]\r\n<ul>\r\n<li> Added full OpenGL 1.5 support\r\n<li> Added support for multiple rendering contexts with different capabilities\r\n<li> Added command line flags to <tt>glewinfo</tt> for selecting displays and visuals\r\n<li> Added GLX_SGIS_multisample, GLX_SUN_video_resize, and GL_SUN_read_video_pixels\r\n<li> Added MinGW/MSYS support\r\n<li> Bug fixes in GL_ARB_shader_objects and the OS X build\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.1.4</b> [12-15-03]\r\n<ul>\r\n<li> Added GL_APPLE_float_pixels, GL_APPLE_texture_range, \r\nGL_EXT_texture_cube_map, GL_EXT_texture_edge_clamp,\r\nGLX_ATI_pixel_format_float, and GLX_ATI_render_texture\r\n<li> Bug fixes in GL_ATI_map_object_buffer and GL_ATI_fragment_shader\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.1.3</b> [10-28-03]\r\n<ul>\r\n<li> Added Solaris and Darwin support\r\n<li> Added GL_ARB_fragment_shader, GL_ARB_shader_objects, and GL_ARB_vertex_shader\r\n<li> Fixed bug in GL_WIN_swap_hint\r\n<li> Removed <tt>glewinfo</tt>'s dependency on <tt>GLUT</tt>\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.1.2</b> [09-15-03]\r\n<ul>\r\n<li> Removed dependency on WGL_{ARB,EXT}_extensions_string to make GLEW run on Matrox cards\r\n<li> Added glewGetString for querying the GLEW version string\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.1.1</b> [08-11-03]\r\n<ul>\r\n<li> Added GLX_NV_float_buffer, GL_ARB_shading_language_100, and GL_ARB_texture_non_power_of_two\r\n<li> Fixed bug in GL_ARB_vertex_buffer_object\r\n<li> Minor updates in documentation\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.1.0</b> [07-08-03]\r\n<ul>\r\n<li> Added automatic code generation\r\n<li> Added almost every extension in the registry\r\n<li> Added separate namespace\r\n<li> Added Irix support\r\n<li> Updated documentation\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.0.7</b> [06-29-03]\r\n<ul>\r\n<li> Added GL_EXT_depth_bounds_test\r\n<li> Fixed typos\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.0.6</b> [05-05-03]\r\n<ul>\r\n<li> Added ARB_vertex_buffer_object and NV_half_float\r\n<li> Updated <tt>wglinfo</tt>\r\n<li> Temporary Linux bug fixes (problems with SDL and MESA)\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.0.5</b> [02-17-03]\r\n<ul>\r\n<li> Bug fixes\r\n<li> Added <tt>wglinfo</tt>\r\n<li> Updated documentation\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.0.4</b> [02-02-03]\r\n<ul>\r\n<li> Added NV_texture_expand_normal\r\n<li> Added mingw support\r\n<li> Updated documentation\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.0.3</b> [01-09-03]\r\n<ul>\r\n<li> Cleaned up ATI extensions\r\n<li> Changed function prototypes to match glext.h\r\n<li> Added EXT_texture3D\r\n<li> Fixed typos in ATI_vertex_attrib_array_object and ATI_draw_buffers\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.0.2</b> [12-21-02]\r\n<ul>\r\n<li> Added list of supported extensions to documentation\r\n<li> Added NV_half_float and NV_texgen_emboss\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.0.1</b> [12-17-02]\r\n<ul>\r\n<li> Bug fixes\r\n<li> Added glewGetExtension\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.0.0</b> [12-12-02]\r\n<ul>\r\n<li> Initial release\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/.dummy",
    "content": ""
  },
  {
    "path": "libs/glew/auto/extensions/GLX_3DFX_multisample",
    "content": "GLX_3DFX_multisample\r\nhttp://www.opengl.org/registry/specs/3DFX/3dfx_multisample.txt\r\n\tGLX_SAMPLE_BUFFERS_3DFX 0x8050\r\n\tGLX_SAMPLES_3DFX 0x8051\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_ARB_create_context",
    "content": "GLX_ARB_create_context\r\nhttp://www.opengl.org/registry/specs/ARB/glx_create_context.txt\r\n\tGLX_CONTEXT_DEBUG_BIT_ARB 0x0001\r\n\tGLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002\r\n\tGLX_CONTEXT_MAJOR_VERSION_ARB 0x2091\r\n\tGLX_CONTEXT_MINOR_VERSION_ARB 0x2092\r\n\tGLX_CONTEXT_FLAGS_ARB 0x2094\r\n\tGLXContext glXCreateContextAttribsARB (Display* dpy, GLXFBConfig config, GLXContext share_context, Bool direct, const int *attrib_list)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_ARB_create_context_profile",
    "content": "GLX_ARB_create_context_profile\r\nhttp://www.opengl.org/registry/specs/ARB/glx_create_context.txt\r\n\tGLX_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001\r\n\tGLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002\r\n\tGLX_CONTEXT_PROFILE_MASK_ARB 0x9126\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_ARB_fbconfig_float",
    "content": "GLX_ARB_fbconfig_float\r\nhttp://www.opengl.org/registry/specs/ARB/color_buffer_float.txt\r\n\tGLX_RGBA_FLOAT_BIT 0x00000004\r\n\tGLX_RGBA_FLOAT_TYPE 0x20B9\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_ARB_framebuffer_sRGB",
    "content": "GLX_ARB_framebuffer_sRGB\r\nhttp://www.opengl.org/registry/specs/ARB/framebuffer_sRGB.txt\r\n\tGLX_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20B2\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_ARB_get_proc_address",
    "content": "GLX_ARB_get_proc_address\r\nhttp://oss.sgi.com/projects/ogl-sample/registry/ARB/get_proc_address.txt\r\n\textern void ( * glXGetProcAddressARB (const GLubyte *procName)) (void);\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_ARB_multisample",
    "content": "GLX_ARB_multisample\r\nhttp://www.opengl.org/registry/specs/ARB/multisample.txt\r\n\tGLX_SAMPLE_BUFFERS_ARB 100000\r\n\tGLX_SAMPLES_ARB 100001\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_ATI_pixel_format_float",
    "content": "GLX_ATI_pixel_format_float\r\n\tGLX_RGBA_FLOAT_ATI_BIT 0x00000100\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_ATI_render_texture",
    "content": "GLX_ATI_render_texture\r\n\tGLX_BIND_TO_TEXTURE_RGB_ATI         0x9800\r\n\tGLX_BIND_TO_TEXTURE_RGBA_ATI        0x9801\r\n\tGLX_TEXTURE_FORMAT_ATI              0x9802\r\n\tGLX_TEXTURE_TARGET_ATI              0x9803\r\n\tGLX_MIPMAP_TEXTURE_ATI              0x9804\r\n\tGLX_TEXTURE_RGB_ATI                 0x9805\r\n\tGLX_TEXTURE_RGBA_ATI                0x9806\r\n\tGLX_NO_TEXTURE_ATI                  0x9807\r\n\tGLX_TEXTURE_CUBE_MAP_ATI            0x9808\r\n\tGLX_TEXTURE_1D_ATI                  0x9809\r\n\tGLX_TEXTURE_2D_ATI                  0x980A\r\n\tGLX_MIPMAP_LEVEL_ATI                0x980B\r\n\tGLX_CUBE_MAP_FACE_ATI               0x980C\r\n\tGLX_TEXTURE_CUBE_MAP_POSITIVE_X_ATI 0x980D\r\n\tGLX_TEXTURE_CUBE_MAP_NEGATIVE_X_ATI 0x980E\r\n\tGLX_TEXTURE_CUBE_MAP_POSITIVE_Y_ATI 0x980F\r\n\tGLX_TEXTURE_CUBE_MAP_NEGATIVE_Y_ATI 0x9810\r\n\tGLX_TEXTURE_CUBE_MAP_POSITIVE_Z_ATI 0x9811\r\n\tGLX_TEXTURE_CUBE_MAP_NEGATIVE_Z_ATI 0x9812\r\n\tGLX_FRONT_LEFT_ATI                  0x9813\r\n\tGLX_FRONT_RIGHT_ATI                 0x9814\r\n\tGLX_BACK_LEFT_ATI                   0x9815\r\n\tGLX_BACK_RIGHT_ATI                  0x9816\r\n\tGLX_AUX0_ATI                        0x9817\r\n\tGLX_AUX1_ATI                        0x9818\r\n\tGLX_AUX2_ATI                        0x9819\r\n\tGLX_AUX3_ATI                        0x981A\r\n\tGLX_AUX4_ATI                        0x981B\r\n\tGLX_AUX5_ATI                        0x981C\r\n\tGLX_AUX6_ATI                        0x981D\r\n\tGLX_AUX7_ATI                        0x981E\r\n\tGLX_AUX8_ATI                        0x981F\r\n\tGLX_AUX9_ATI                        0x9820\r\n\tGLX_BIND_TO_TEXTURE_LUMINANCE_ATI   0x9821\r\n\tGLX_BIND_TO_TEXTURE_INTENSITY_ATI   0x9822\r\n\tvoid glXBindTexImageATI (Display *dpy, GLXPbuffer pbuf, int buffer)\r\n\tvoid glXReleaseTexImageATI (Display *dpy, GLXPbuffer pbuf, int buffer)\r\n\tvoid glXDrawableAttribATI (Display *dpy, GLXDrawable draw, const int *attrib_list)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_EXT_fbconfig_packed_float",
    "content": "GLX_EXT_fbconfig_packed_float\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_EXT_packed_float.txt\r\n\tGLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT 0x20B1\r\n\tGLX_RGBA_UNSIGNED_FLOAT_BIT_EXT 0x00000008\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_EXT_framebuffer_sRGB",
    "content": "GLX_EXT_framebuffer_sRGB\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_EXT_framebuffer_sRGB.txt\r\n\tGLX_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20B2\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_EXT_import_context",
    "content": "GLX_EXT_import_context\r\nhttp://www.opengl.org/registry/specs/EXT/import_context.txt\r\n\tGLX_SHARE_CONTEXT_EXT 0x800A\r\n\tGLX_VISUAL_ID_EXT 0x800B\r\n\tGLX_SCREEN_EXT 0x800C\r\n\tvoid glXFreeContextEXT (Display* dpy, GLXContext context)\r\n\tGLXContextID glXGetContextIDEXT (const GLXContext context)\r\n\tGLXContext glXImportContextEXT (Display* dpy, GLXContextID contextID)\r\n\tint glXQueryContextInfoEXT (Display* dpy, GLXContext context, int attribute,int *value)\r\n\ttypedef XID GLXContextID\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_EXT_scene_marker",
    "content": "GLX_EXT_scene_marker\r\nhttp://www.opengl.org/registry/specs/EXT/scene_marker.txt\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_EXT_swap_control",
    "content": "GLX_EXT_swap_control\r\nhttp://www.opengl.org/registry/specs/EXT/swap_control.txt\r\n\tGLX_SWAP_INTERVAL_EXT 0x20F1\r\n\tGLX_MAX_SWAP_INTERVAL_EXT 0x20F2\r\n\tvoid glXSwapIntervalEXT (Display* dpy, GLXDrawable drawable, int interval)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_EXT_texture_from_pixmap",
    "content": "GLX_EXT_texture_from_pixmap\r\nhttp://www.opengl.org/registry/specs/EXT/texture_from_pixmap.txt\r\n\tGLX_TEXTURE_1D_BIT_EXT 0x00000001\r\n\tGLX_TEXTURE_2D_BIT_EXT 0x00000002\r\n\tGLX_TEXTURE_RECTANGLE_BIT_EXT 0x00000004\r\n\tGLX_BIND_TO_TEXTURE_RGB_EXT 0x20D0\r\n\tGLX_BIND_TO_TEXTURE_RGBA_EXT 0x20D1\r\n\tGLX_BIND_TO_MIPMAP_TEXTURE_EXT 0x20D2\r\n\tGLX_BIND_TO_TEXTURE_TARGETS_EXT 0x20D3\r\n\tGLX_Y_INVERTED_EXT 0x20D4\r\n\tGLX_TEXTURE_FORMAT_EXT 0x20D5\r\n\tGLX_TEXTURE_TARGET_EXT 0x20D6\r\n\tGLX_MIPMAP_TEXTURE_EXT 0x20D7\r\n\tGLX_TEXTURE_FORMAT_NONE_EXT 0x20D8\r\n\tGLX_TEXTURE_FORMAT_RGB_EXT 0x20D9\r\n\tGLX_TEXTURE_FORMAT_RGBA_EXT 0x20DA\r\n\tGLX_TEXTURE_1D_EXT 0x20DB\r\n\tGLX_TEXTURE_2D_EXT 0x20DC\r\n\tGLX_TEXTURE_RECTANGLE_EXT 0x20DD\r\n\tGLX_FRONT_LEFT_EXT 0x20DE\r\n\tGLX_FRONT_RIGHT_EXT 0x20DF\r\n\tGLX_BACK_LEFT_EXT 0x20E0\r\n\tGLX_BACK_RIGHT_EXT 0x20E1\r\n\tGLX_AUX0_EXT 0x20E2\r\n\tGLX_AUX1_EXT 0x20E3\r\n\tGLX_AUX2_EXT 0x20E4\r\n\tGLX_AUX3_EXT 0x20E5\r\n\tGLX_AUX4_EXT 0x20E6\r\n\tGLX_AUX5_EXT 0x20E7\r\n\tGLX_AUX6_EXT 0x20E8\r\n\tGLX_AUX7_EXT 0x20E9\r\n\tGLX_AUX8_EXT 0x20EA\r\n\tGLX_AUX9_EXT 0x20EB\r\n\tvoid glXBindTexImageEXT (Display* display, GLXDrawable drawable, int buffer, const int *attrib_list)\r\n\tvoid glXReleaseTexImageEXT (Display* display, GLXDrawable drawable, int buffer)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_EXT_visual_info",
    "content": "GLX_EXT_visual_info\r\nhttp://www.opengl.org/registry/specs/EXT/visual_info.txt\r\n\tGLX_X_VISUAL_TYPE_EXT 0x22\r\n\tGLX_TRANSPARENT_TYPE_EXT 0x23\r\n\tGLX_TRANSPARENT_INDEX_VALUE_EXT 0x24\r\n\tGLX_TRANSPARENT_RED_VALUE_EXT 0x25\r\n\tGLX_TRANSPARENT_GREEN_VALUE_EXT 0x26\r\n\tGLX_TRANSPARENT_BLUE_VALUE_EXT 0x27\r\n\tGLX_TRANSPARENT_ALPHA_VALUE_EXT 0x28\r\n\tGLX_NONE_EXT 0x8000\r\n\tGLX_TRUE_COLOR_EXT 0x8002\r\n\tGLX_DIRECT_COLOR_EXT 0x8003\r\n\tGLX_PSEUDO_COLOR_EXT 0x8004\r\n\tGLX_STATIC_COLOR_EXT 0x8005\r\n\tGLX_GRAY_SCALE_EXT 0x8006\r\n\tGLX_STATIC_GRAY_EXT 0x8007\r\n\tGLX_TRANSPARENT_RGB_EXT 0x8008\r\n\tGLX_TRANSPARENT_INDEX_EXT 0x8009\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_EXT_visual_rating",
    "content": "GLX_EXT_visual_rating\r\nhttp://www.opengl.org/registry/specs/EXT/visual_rating.txt\r\n\tGLX_VISUAL_CAVEAT_EXT 0x20\r\n\tGLX_SLOW_VISUAL_EXT 0x8001\r\n\tGLX_NON_CONFORMANT_VISUAL_EXT 0x800D\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_INTEL_swap_event",
    "content": "GLX_INTEL_swap_event\r\nhttp://www.opengl.org/registry/specs/INTEL/swap_event.txt\r\n\tGLX_EXCHANGE_COMPLETE_INTEL 0x8180\r\n\tGLX_COPY_COMPLETE_INTEL 0x8181\r\n\tGLX_FLIP_COMPLETE_INTEL 0x8182\r\n\tGLX_BUFFER_SWAP_COMPLETE_INTEL_MASK 0x04000000\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_MESA_agp_offset",
    "content": "GLX_MESA_agp_offset\r\nhttp://www.opengl.org/registry/specs/MESA/agp_offset.txt\r\n\tunsigned int glXGetAGPOffsetMESA (const void* pointer)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_MESA_copy_sub_buffer",
    "content": "GLX_MESA_copy_sub_buffer\r\nhttp://www.opengl.org/registry/specs/MESA/copy_sub_buffer.txt\r\n\tvoid glXCopySubBufferMESA (Display* dpy, GLXDrawable drawable, int x, int y, int width, int height)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_MESA_pixmap_colormap",
    "content": "GLX_MESA_pixmap_colormap\r\nhttp://www.opengl.org/registry/specs/MESA/pixmap_colormap.txt\r\n\tGLXPixmap glXCreateGLXPixmapMESA (Display* dpy, XVisualInfo *visual, Pixmap pixmap, Colormap cmap)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_MESA_release_buffers",
    "content": "GLX_MESA_release_buffers\r\nhttp://www.opengl.org/registry/specs/MESA/release_buffers.txt\r\n\tBool glXReleaseBuffersMESA (Display* dpy, GLXDrawable d)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_MESA_set_3dfx_mode",
    "content": "GLX_MESA_set_3dfx_mode\r\nhttp://www.opengl.org/registry/specs/MESA/set_3dfx_mode.txt\r\n\tGLX_3DFX_WINDOW_MODE_MESA 0x1\r\n\tGLX_3DFX_FULLSCREEN_MODE_MESA 0x2\r\n\tGLboolean glXSet3DfxModeMESA (GLint mode)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_NV_copy_image",
    "content": "GLX_NV_copy_image\r\nhttp://www.opengl.org/registry/specs/NV/copy_image.txt\r\n  void glXCopyImageSubDataNV (Display *dpy, GLXContext srcCtx, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLXContext dstCtx, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_NV_float_buffer",
    "content": "GLX_NV_float_buffer\r\nhttp://cvs1.nvidia.com/inc/GL/glxtokens.h\r\n\tGLX_FLOAT_COMPONENTS_NV 0x20B0\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_NV_present_video",
    "content": "GLX_NV_present_video\r\nhttp://www.opengl.org/registry/specs/NV/present_video.txt\r\n\tGLX_NUM_VIDEO_SLOTS_NV 0x20F0\r\n\tint glXBindVideoDeviceNV (Display* dpy, unsigned int video_slot, unsigned int video_device, const int *attrib_list)\r\n\tunsigned int* glXEnumerateVideoDevicesNV (Display *dpy, int screen, int *nelements)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_NV_swap_group",
    "content": "GLX_NV_swap_group\r\nhttp://www.opengl.org/registry/specs/NV/glx_swap_group.txt\r\n\tBool glXBindSwapBarrierNV (Display* dpy, GLuint group, GLuint barrier)\r\n\tBool glXJoinSwapGroupNV (Display* dpy, GLXDrawable drawable, GLuint group)\r\n\tBool glXQueryFrameCountNV (Display* dpy, int screen, GLuint *count)\r\n\tBool glXQueryMaxSwapGroupsNV (Display* dpy, int screen, GLuint *maxGroups, GLuint *maxBarriers)\r\n\tBool glXQuerySwapGroupNV (Display* dpy, GLXDrawable drawable, GLuint *group, GLuint *barrier)\r\n\tBool glXResetFrameCountNV (Display* dpy, int screen)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_NV_vertex_array_range",
    "content": "GLX_NV_vertex_array_range\r\nhttp://oss.sgi.com/projects/ogl-sample/registry/NV/vertex_array_range.txt\r\n\tvoid * glXAllocateMemoryNV (GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority)\r\n\tvoid glXFreeMemoryNV (void *pointer)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_NV_video_output",
    "content": "GLX_NV_video_output\r\nhttp://www.opengl.org/registry/specs/NV/glx_video_out.txt\r\n\tGLX_VIDEO_OUT_COLOR_NV 0x20C3\r\n\tGLX_VIDEO_OUT_ALPHA_NV 0x20C4\r\n\tGLX_VIDEO_OUT_DEPTH_NV 0x20C5\r\n\tGLX_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6\r\n\tGLX_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7\r\n\tGLX_VIDEO_OUT_FRAME_NV 0x20C8\r\n\tGLX_VIDEO_OUT_FIELD_1_NV 0x20C9\r\n\tGLX_VIDEO_OUT_FIELD_2_NV 0x20CA\r\n\tGLX_VIDEO_OUT_STACKED_FIELDS_1_2_NV 0x20CB\r\n\tGLX_VIDEO_OUT_STACKED_FIELDS_2_1_NV 0x20CC\r\n\tint glXBindVideoImageNV (Display* dpy, GLXVideoDeviceNV VideoDevice, GLXPbuffer pbuf, int iVideoBuffer)\r\n\tint glXGetVideoDeviceNV (Display* dpy, int screen, int numVideoDevices, GLXVideoDeviceNV *pVideoDevice)\r\n\tint glXGetVideoInfoNV (Display* dpy, int screen, GLXVideoDeviceNV VideoDevice, unsigned long *pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo)\r\n\tint glXReleaseVideoDeviceNV (Display* dpy, int screen, GLXVideoDeviceNV VideoDevice)\r\n\tint glXReleaseVideoImageNV (Display* dpy, GLXPbuffer pbuf)\r\n\tint glXSendPbufferToVideoNV (Display* dpy, GLXPbuffer pbuf, int iBufferType, unsigned long *pulCounterPbuffer, GLboolean bBlock)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_OML_swap_method",
    "content": "GLX_OML_swap_method\r\nhttp://www.opengl.org/registry/specs/OML/glx_swap_method.txt\r\n\tGLX_SWAP_METHOD_OML 0x8060\r\n\tGLX_SWAP_EXCHANGE_OML 0x8061\r\n\tGLX_SWAP_COPY_OML 0x8062\r\n\tGLX_SWAP_UNDEFINED_OML 0x8063\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_OML_sync_control",
    "content": "GLX_OML_sync_control\r\nhttp://www.opengl.org/registry/specs/OML/glx_sync_control.txt\r\n\tBool glXGetMscRateOML (Display* dpy, GLXDrawable drawable, int32_t* numerator, int32_t* denominator)\r\n\tBool glXGetSyncValuesOML (Display* dpy, GLXDrawable drawable, int64_t* ust, int64_t* msc, int64_t* sbc)\r\n\tint64_t glXSwapBuffersMscOML (Display* dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder)\r\n\tBool glXWaitForMscOML (Display* dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder, int64_t* ust, int64_t* msc, int64_t* sbc)\r\n\tBool glXWaitForSbcOML (Display* dpy, GLXDrawable drawable, int64_t target_sbc, int64_t* ust, int64_t* msc, int64_t* sbc)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_SGIS_blended_overlay",
    "content": "GLX_SGIS_blended_overlay\r\nhttp://www.opengl.org/registry/specs/SGIS/blended_overlay.txt\r\n\tGLX_BLENDED_RGBA_SGIS 0x8025\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_SGIS_color_range",
    "content": "GLX_SGIS_color_range\r\nhttp://www.opengl.org/registry/specs/SGIS/color_range.txt\r\n\tGLX_MAX_GREEN_SGIS 0\r\n\tGLX_MIN_RED_SGIS 0\r\n\tGLX_MIN_BLUE_SGIS 0\r\n\tGLX_MAX_RED_SGIS 0\r\n\tGLX_MAX_ALPHA_SGIS 0\r\n\tGLX_MIN_GREEN_SGIS 0\r\n\tGLX_MIN_ALPHA_SGIS 0\r\n\tGLX_EXTENDED_RANGE_SGIS 0\r\n\tGLX_MAX_BLUE_SGIS 0\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_SGIS_multisample",
    "content": "GLX_SGIS_multisample\r\nhttp://www.opengl.org/registry/specs/SGIS/multisample.txt\r\n\tGLX_SAMPLE_BUFFERS_SGIS 100000\r\n\tGLX_SAMPLES_SGIS 100001\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_SGIS_shared_multisample",
    "content": "GLX_SGIS_shared_multisample\r\n\tGLX_MULTISAMPLE_SUB_RECT_WIDTH_SGIS 0x8026\r\n\tGLX_MULTISAMPLE_SUB_RECT_HEIGHT_SGIS 0x8027\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_SGIX_fbconfig",
    "content": "GLX_SGIX_fbconfig\r\nhttp://www.opengl.org/registry/specs/SGIX/fbconfig.txt\r\n\tGLX_WINDOW_BIT_SGIX 0x00000001\r\n\tGLX_RGBA_BIT_SGIX 0x00000001\r\n\tGLX_PIXMAP_BIT_SGIX 0x00000002\r\n\tGLX_COLOR_INDEX_BIT_SGIX 0x00000002\r\n\tGLX_SCREEN_EXT 0x800C\r\n\tGLX_DRAWABLE_TYPE_SGIX 0x8010\r\n\tGLX_RENDER_TYPE_SGIX 0x8011\r\n\tGLX_X_RENDERABLE_SGIX 0x8012\r\n\tGLX_FBCONFIG_ID_SGIX 0x8013\r\n\tGLX_RGBA_TYPE_SGIX 0x8014\r\n\tGLX_COLOR_INDEX_TYPE_SGIX 0x8015\r\n\tGLXFBConfigSGIX* glXChooseFBConfigSGIX (Display *dpy, int screen, const int *attrib_list, int *nelements)\r\n\tGLXContext glXCreateContextWithConfigSGIX (Display* dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct)\r\n\tGLXPixmap glXCreateGLXPixmapWithConfigSGIX (Display* dpy, GLXFBConfig config, Pixmap pixmap)\r\n\tint glXGetFBConfigAttribSGIX (Display* dpy, GLXFBConfigSGIX config, int attribute, int *value)\r\n\tGLXFBConfigSGIX glXGetFBConfigFromVisualSGIX (Display* dpy, XVisualInfo *vis)\r\n\tXVisualInfo* glXGetVisualFromFBConfigSGIX (Display *dpy, GLXFBConfig config)\r\n\ttypedef XID GLXFBConfigIDSGIX\r\n\ttypedef struct __GLXFBConfigRec *GLXFBConfigSGIX\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_SGIX_hyperpipe",
    "content": "GLX_SGIX_hyperpipe\r\nhttp://oss.sgi.com/projects/ogl-sample/registry/SGIX/hyperpipe_group.txt\r\n\tGLX_HYPERPIPE_ID_SGIX 0x8030\r\n\tGLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX 80\r\n\tGLX_HYPERPIPE_DISPLAY_PIPE_SGIX 0x00000001\r\n\tGLX_HYPERPIPE_RENDER_PIPE_SGIX 0x00000002\r\n\tGLX_PIPE_RECT_SGIX 0x00000001\r\n\tGLX_PIPE_RECT_LIMITS_SGIX 0x00000002\r\n\tGLX_HYPERPIPE_STEREO_SGIX 0x00000003\r\n\tGLX_HYPERPIPE_PIXEL_AVERAGE_SGIX 0x00000004\r\n\tGLX_BAD_HYPERPIPE_CONFIG_SGIX 91\r\n\tGLX_BAD_HYPERPIPE_SGIX 92\r\n\ttypedef struct {  char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX];   int  networkId; } GLXHyperpipeNetworkSGIX;\r\n\ttypedef struct {  char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX];   int channel;   unsigned int participationType;   int timeSlice; } GLXHyperpipeConfigSGIX;\r\n\ttypedef struct {  char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX];   int srcXOrigin;   int srcYOrigin;   int srcWidth;   int srcHeight;   int destXOrigin;   int destYOrigin;   int destWidth;   int destHeight; } GLXPipeRect;\r\n\ttypedef struct {  char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX];   int XOrigin;   int YOrigin;   int maxHeight;   int maxWidth; } GLXPipeRectLimits;\r\n\tGLXHyperpipeNetworkSGIX * glXQueryHyperpipeNetworkSGIX (Display *dpy, int *npipes)\r\n\tint glXHyperpipeConfigSGIX (Display *dpy, int networkId, int npipes, GLXHyperpipeConfigSGIX *cfg, int *hpId)\r\n\tGLXHyperpipeConfigSGIX * glXQueryHyperpipeConfigSGIX (Display *dpy, int hpId, int *npipes)\r\n\tint glXDestroyHyperpipeConfigSGIX (Display *dpy, int hpId)\r\n\tint glXBindHyperpipeSGIX (Display *dpy, int hpId)\r\n\tint glXQueryHyperpipeBestAttribSGIX (Display *dpy, int timeSlice, int attrib, int size, void *attribList, void *returnAttribList)\r\n\tint glXHyperpipeAttribSGIX (Display *dpy, int timeSlice, int attrib, int size, void *attribList)\r\n\tint glXQueryHyperpipeAttribSGIX (Display *dpy, int timeSlice, int attrib, int size, void *returnAttribList)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_SGIX_pbuffer",
    "content": "GLX_SGIX_pbuffer\r\nhttp://www.opengl.org/registry/specs/SGIX/pbuffer.txt\r\n\tGLX_FRONT_LEFT_BUFFER_BIT_SGIX 0x00000001\r\n\tGLX_FRONT_RIGHT_BUFFER_BIT_SGIX 0x00000002\r\n\tGLX_PBUFFER_BIT_SGIX 0x00000004\r\n\tGLX_BACK_LEFT_BUFFER_BIT_SGIX 0x00000004\r\n\tGLX_BACK_RIGHT_BUFFER_BIT_SGIX 0x00000008\r\n\tGLX_AUX_BUFFERS_BIT_SGIX 0x00000010\r\n\tGLX_DEPTH_BUFFER_BIT_SGIX 0x00000020\r\n\tGLX_STENCIL_BUFFER_BIT_SGIX 0x00000040\r\n\tGLX_ACCUM_BUFFER_BIT_SGIX 0x00000080\r\n\tGLX_SAMPLE_BUFFERS_BIT_SGIX 0x00000100\r\n\tGLX_MAX_PBUFFER_WIDTH_SGIX 0x8016\r\n\tGLX_MAX_PBUFFER_HEIGHT_SGIX 0x8017\r\n\tGLX_MAX_PBUFFER_PIXELS_SGIX 0x8018\r\n\tGLX_OPTIMAL_PBUFFER_WIDTH_SGIX 0x8019\r\n\tGLX_OPTIMAL_PBUFFER_HEIGHT_SGIX 0x801A\r\n\tGLX_PRESERVED_CONTENTS_SGIX 0x801B\r\n\tGLX_LARGEST_PBUFFER_SGIX 0x801C\r\n\tGLX_WIDTH_SGIX 0x801D\r\n\tGLX_HEIGHT_SGIX 0x801E\r\n\tGLX_EVENT_MASK_SGIX 0x801F\r\n\tGLX_DAMAGED_SGIX 0x8020\r\n\tGLX_SAVED_SGIX 0x8021\r\n\tGLX_WINDOW_SGIX 0x8022\r\n\tGLX_PBUFFER_SGIX 0x8023\r\n\tGLX_BUFFER_CLOBBER_MASK_SGIX 0x08000000\r\n\tGLXPbuffer glXCreateGLXPbufferSGIX (Display* dpy, GLXFBConfig config, unsigned int width, unsigned int height, int *attrib_list)\r\n\tvoid glXDestroyGLXPbufferSGIX (Display* dpy, GLXPbuffer pbuf)\r\n\tvoid glXGetSelectedEventSGIX (Display* dpy, GLXDrawable drawable, unsigned long *mask)\r\n\tvoid glXQueryGLXPbufferSGIX (Display* dpy, GLXPbuffer pbuf, int attribute, unsigned int *value)\r\n\tvoid glXSelectEventSGIX (Display* dpy, GLXDrawable drawable, unsigned long mask)\r\n\ttypedef XID GLXPbufferSGIX\r\n\ttypedef struct { int type; unsigned long serial; Bool send_event; Display *display; GLXDrawable drawable; int event_type; int draw_type; unsigned int mask; int x, y; int width, height; int count; } GLXBufferClobberEventSGIX\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_SGIX_swap_barrier",
    "content": "GLX_SGIX_swap_barrier\r\nhttp://oss.sgi.com/projects/ogl-sample/registry/SGIX/swap_barrier.txt\r\n\tvoid glXBindSwapBarrierSGIX (Display *dpy, GLXDrawable drawable, int barrier)\r\n\tBool glXQueryMaxSwapBarriersSGIX (Display *dpy, int screen, int *max)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_SGIX_swap_group",
    "content": "GLX_SGIX_swap_group\r\nhttp://oss.sgi.com/projects/ogl-sample/registry/SGIX/swap_group.txt\r\n\tvoid glXJoinSwapGroupSGIX (Display *dpy, GLXDrawable drawable, GLXDrawable member)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_SGIX_video_resize",
    "content": "GLX_SGIX_video_resize\r\nhttp://www.opengl.org/registry/specs/SGIX/video_resize.txt\r\n\tGLX_SYNC_FRAME_SGIX 0x00000000\r\n\tGLX_SYNC_SWAP_SGIX 0x00000001\r\n\tint glXBindChannelToWindowSGIX (Display* display, int screen, int channel, Window window)\r\n\tint glXChannelRectSGIX (Display* display, int screen, int channel, int x, int y, int w, int h)\r\n\tint glXChannelRectSyncSGIX (Display* display, int screen, int channel, GLenum synctype)\r\n\tint glXQueryChannelDeltasSGIX (Display* display, int screen, int channel, int *x, int *y, int *w, int *h)\r\n\tint glXQueryChannelRectSGIX (Display* display, int screen, int channel, int *dx, int *dy, int *dw, int *dh)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_SGIX_visual_select_group",
    "content": "GLX_SGIX_visual_select_group\r\nhttp://www.opengl.org/registry/specs/SGIX/visual_select_group.txt\r\n\tGLX_VISUAL_SELECT_GROUP_SGIX 0x8028\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_SGI_cushion",
    "content": "GLX_SGI_cushion\r\nhttp://www.opengl.org/registry/specs/SGI/cushion.txt\r\n\tvoid glXCushionSGI (Display* dpy, Window window, float cushion)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_SGI_make_current_read",
    "content": "GLX_SGI_make_current_read\r\nhttp://www.opengl.org/registry/specs/SGI/make_current_read.txt\r\n\tGLXDrawable glXGetCurrentReadDrawableSGI (void)\r\n\tBool glXMakeCurrentReadSGI (Display* dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_SGI_swap_control",
    "content": "GLX_SGI_swap_control\r\nhttp://www.opengl.org/registry/specs/SGI/swap_control.txt\r\n\tint glXSwapIntervalSGI (int interval)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_SGI_video_sync",
    "content": "GLX_SGI_video_sync\r\nhttp://www.opengl.org/registry/specs/SGI/video_sync.txt\r\n\tint glXGetVideoSyncSGI (uint* count)\r\n\tint glXWaitVideoSyncSGI (int divisor, int remainder, unsigned int* count)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_SUN_get_transparent_index",
    "content": "GLX_SUN_get_transparent_index\r\nhttp://www.opengl.org/registry/specs/SUN/get_transparent_index.txt\r\n\tStatus glXGetTransparentIndexSUN (Display* dpy, Window overlay, Window underlay, unsigned long *pTransparentIndex)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GLX_SUN_video_resize",
    "content": "GLX_SUN_video_resize\r\nhttp://wwws.sun.com/software/graphics/opengl/extensions/glx_sun_video_resize.txt\r\n\tGL_VIDEO_RESIZE_COMPENSATION_SUN 0x85CD\r\n\tGLX_VIDEO_RESIZE_SUN 0x8171\r\n\tint glXVideoResizeSUN (Display* display, GLXDrawable window, float factor)\r\n\tint glXGetVideoResizeSUN (Display* display, GLXDrawable window, float* factor)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_3DFX_multisample",
    "content": "GL_3DFX_multisample\r\nhttp://www.opengl.org/registry/specs/3DFX/3dfx_multisample.txt\r\n\tGL_MULTISAMPLE_3DFX 0x86B2\r\n\tGL_SAMPLE_BUFFERS_3DFX 0x86B3\r\n\tGL_SAMPLES_3DFX 0x86B4\r\n\tGL_MULTISAMPLE_BIT_3DFX 0x20000000\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_3DFX_tbuffer",
    "content": "GL_3DFX_tbuffer\r\nhttp://www.opengl.org/registry/specs/3DFX/tbuffer.txt\r\n\tvoid glTbufferMask3DFX (GLuint mask)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_3DFX_texture_compression_FXT1",
    "content": "GL_3DFX_texture_compression_FXT1\r\nhttp://www.opengl.org/registry/specs/3DFX/texture_compression_FXT1.txt\r\n\tGL_COMPRESSED_RGB_FXT1_3DFX 0x86B0\r\n\tGL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_AMD_draw_buffers_blend",
    "content": "GL_AMD_draw_buffers_blend\r\nhttp://www.opengl.org/registry/specs/AMD/draw_buffers_blend.txt\r\n\tvoid glBlendEquationIndexedAMD (GLuint buf, GLenum mode)\r\n\tvoid glBlendEquationSeparateIndexedAMD (GLuint buf, GLenum modeRGB, GLenum modeAlpha)\r\n\tvoid glBlendFuncIndexedAMD (GLuint buf, GLenum src, GLenum dst)\r\n\tvoid glBlendFuncSeparateIndexedAMD (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_AMD_performance_monitor",
    "content": "GL_AMD_performance_monitor\r\nhttp://www.opengl.org/registry/specs/AMD/performance_monitor.txt\r\n\tGL_UNSIGNED_INT 0x1405\r\n\tGL_FLOAT 0x1406\r\n\tGL_COUNTER_TYPE_AMD 0x8BC0\r\n\tGL_COUNTER_RANGE_AMD 0x8BC1\r\n\tGL_UNSIGNED_INT64_AMD 0x8BC2\r\n\tGL_PERCENTAGE_AMD 0x8BC3\r\n\tGL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4\r\n\tGL_PERFMON_RESULT_SIZE_AMD 0x8BC5\r\n\tGL_PERFMON_RESULT_AMD 0x8BC6\r\n\tvoid glBeginPerfMonitorAMD (GLuint monitor)\r\n\tvoid glDeletePerfMonitorsAMD (GLsizei n, GLuint* monitors)\r\n\tvoid glEndPerfMonitorAMD (GLuint monitor)\r\n\tvoid glGenPerfMonitorsAMD (GLsizei n, GLuint* monitors)\r\n\tvoid glGetPerfMonitorCounterDataAMD (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint* data, GLint *bytesWritten)\r\n\tvoid glGetPerfMonitorCounterInfoAMD (GLuint group, GLuint counter, GLenum pname, void* data)\r\n\tvoid glGetPerfMonitorCounterStringAMD (GLuint group, GLuint counter, GLsizei bufSize, GLsizei* length, char *counterString)\r\n\tvoid glGetPerfMonitorCountersAMD (GLuint group, GLint* numCounters, GLint *maxActiveCounters, GLsizei countersSize, GLuint *counters)\r\n\tvoid glGetPerfMonitorGroupStringAMD (GLuint group, GLsizei bufSize, GLsizei* length, char *groupString)\r\n\tvoid glGetPerfMonitorGroupsAMD (GLint* numGroups, GLsizei groupsSize, GLuint *groups)\r\n\tvoid glSelectPerfMonitorCountersAMD (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint* counterList)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_AMD_seamless_cubemap_per_texture",
    "content": "GL_AMD_seamless_cubemap_per_texture\r\nhttp://www.opengl.org/registry/specs/AMD/seamless_cubemap_per_texture.txt\r\n\tGL_TEXTURE_CUBE_MAP_SEAMLESS_ARB 0x884F\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_AMD_shader_stencil_export",
    "content": "GL_AMD_shader_stencil_export\r\nhttp://www.opengl.org/registry/specs/AMD/shader_stencil_export.txt\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_AMD_texture_texture4",
    "content": "GL_AMD_texture_texture4\r\nhttp://www.opengl.org/registry/specs/AMD/texture_texture4.txt\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_AMD_vertex_shader_tessellator",
    "content": "GL_AMD_vertex_shader_tessellator\r\nhttp://www.opengl.org/registry/specs/AMD/vertex_shader_tessellator.txt\r\n\tGL_SAMPLER_BUFFER_AMD 0x9001\r\n\tGL_INT_SAMPLER_BUFFER_AMD 0x9002\r\n\tGL_UNSIGNED_INT_SAMPLER_BUFFER_AMD 0x9003\r\n\tGL_TESSELLATION_MODE_AMD 0x9004\r\n\tGL_TESSELLATION_FACTOR_AMD 0x9005\r\n\tGL_DISCRETE_AMD 0x9006\r\n\tGL_CONTINUOUS_AMD 0x9007\r\n\tvoid glTessellationFactorAMD (GLfloat factor)\r\n\tvoid glTessellationModeAMD (GLenum mode)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_APPLE_aux_depth_stencil",
    "content": "GL_APPLE_aux_depth_stencil\r\nhttp://www.opengl.org/registry/specs/APPLE/aux_depth_stencil.txt\r\n\tGL_AUX_DEPTH_STENCIL_APPLE 0x8A14\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_APPLE_client_storage",
    "content": "GL_APPLE_client_storage\r\nhttp://www.opengl.org/registry/specs/APPLE/client_storage.txt\r\n\tGL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_APPLE_element_array",
    "content": "GL_APPLE_element_array\r\nhttp://www.opengl.org/registry/specs/APPLE/element_array.txt\r\n\tGL_ELEMENT_ARRAY_APPLE 0x8768\r\n\tGL_ELEMENT_ARRAY_TYPE_APPLE 0x8769\r\n\tGL_ELEMENT_ARRAY_POINTER_APPLE 0x876A\r\n\tvoid glDrawElementArrayAPPLE (GLenum mode, GLint first, GLsizei count)\r\n\tvoid glDrawRangeElementArrayAPPLE (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count)\r\n\tvoid glElementPointerAPPLE (GLenum type, const void* pointer)\r\n\tvoid glMultiDrawElementArrayAPPLE (GLenum mode, const GLint* first, const GLsizei *count, GLsizei primcount)\r\n\tvoid glMultiDrawRangeElementArrayAPPLE (GLenum mode, GLuint start, GLuint end, const GLint* first, const GLsizei *count, GLsizei primcount)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_APPLE_fence",
    "content": "GL_APPLE_fence\r\nhttp://www.opengl.org/registry/specs/APPLE/fence.txt\r\n\tGL_DRAW_PIXELS_APPLE 0x8A0A\r\n\tGL_FENCE_APPLE 0x8A0B\r\n\tvoid glDeleteFencesAPPLE (GLsizei n, const GLuint* fences)\r\n\tvoid glFinishFenceAPPLE (GLuint fence)\r\n\tvoid glFinishObjectAPPLE (GLenum object, GLint name)\r\n\tvoid glGenFencesAPPLE (GLsizei n, GLuint* fences)\r\n\tGLboolean glIsFenceAPPLE (GLuint fence)\r\n\tvoid glSetFenceAPPLE (GLuint fence)\r\n\tGLboolean glTestFenceAPPLE (GLuint fence)\r\n\tGLboolean glTestObjectAPPLE (GLenum object, GLuint name)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_APPLE_float_pixels",
    "content": "GL_APPLE_float_pixels\r\nhttp://developer.apple.com/opengl/extensions/apple_float_pixels.html\r\n\tGL_HALF_APPLE 0x140B\r\n\tGL_COLOR_FLOAT_APPLE 0x8A0F\r\n\tGL_RGBA_FLOAT32_APPLE 0x8814\r\n\tGL_RGB_FLOAT32_APPLE 0x8815\r\n\tGL_ALPHA_FLOAT32_APPLE 0x8816\r\n\tGL_INTENSITY_FLOAT32_APPLE 0x8817\r\n\tGL_LUMINANCE_FLOAT32_APPLE 0x8818\r\n\tGL_LUMINANCE_ALPHA_FLOAT32_APPLE 0x8819\r\n\tGL_RGBA_FLOAT16_APPLE 0x881A\r\n\tGL_RGB_FLOAT16_APPLE 0x881B\r\n\tGL_ALPHA_FLOAT16_APPLE 0x881C\r\n\tGL_INTENSITY_FLOAT16_APPLE 0x881D\r\n\tGL_LUMINANCE_FLOAT16_APPLE 0x881E\r\n\tGL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881F\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_APPLE_flush_buffer_range",
    "content": "GL_APPLE_flush_buffer_range\r\nhttp://www.opengl.org/registry/specs/APPLE/flush_buffer_range.txt\r\n\tGL_BUFFER_SERIALIZED_MODIFY_APPLE 0x8A12\r\n\tGL_BUFFER_FLUSHING_UNMAP_APPLE 0x8A13\r\n\tvoid glBufferParameteriAPPLE (GLenum target, GLenum pname, GLint param)\r\n\tvoid glFlushMappedBufferRangeAPPLE (GLenum target, GLintptr offset, GLsizeiptr size)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_APPLE_object_purgeable",
    "content": "GL_APPLE_object_purgeable\r\nhttp://www.opengl.org/registry/specs/APPLE/object_purgeable.txt\r\n\tGL_BUFFER_OBJECT_APPLE 0x85B3\r\n\tGL_RELEASED_APPLE 0x8A19\r\n\tGL_VOLATILE_APPLE 0x8A1A\r\n\tGL_RETAINED_APPLE 0x8A1B\r\n\tGL_UNDEFINED_APPLE 0x8A1C\r\n\tGL_PURGEABLE_APPLE 0x8A1D\r\n\tvoid glGetObjectParameterivAPPLE (GLenum objectType, GLuint name, GLenum pname, GLint* params)\r\n\tGLenum glObjectPurgeableAPPLE (GLenum objectType, GLuint name, GLenum option)\r\n\tGLenum glObjectUnpurgeableAPPLE (GLenum objectType, GLuint name, GLenum option)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_APPLE_pixel_buffer",
    "content": "GL_APPLE_pixel_buffer\r\n\tGL_MIN_PBUFFER_VIEWPORT_DIMS_APPLE 0x8A10\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_APPLE_rgb_422",
    "content": "GL_APPLE_rgb_422\r\nhttp://www.opengl.org/registry/specs/APPLE/rgb_422.txt\r\n\tGL_UNSIGNED_SHORT_8_8_APPLE 0x85BA\r\n\tGL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB\r\n\tGL_RGB_422_APPLE 0x8A1F\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_APPLE_row_bytes",
    "content": "GL_APPLE_row_bytes\r\nhttp://www.opengl.org/registry/specs/APPLE/row_bytes.txt\r\n\tGL_PACK_ROW_BYTES_APPLE 0x8A15\r\n\tGL_UNPACK_ROW_BYTES_APPLE 0x8A16\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_APPLE_specular_vector",
    "content": "GL_APPLE_specular_vector\r\nhttp://www.opengl.org/registry/specs/APPLE/specular_vector.txt\r\n\tGL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_APPLE_texture_range",
    "content": "GL_APPLE_texture_range\r\nhttp://developer.apple.com/opengl/extensions/apple_texture_range.html\r\n\tGL_TEXTURE_STORAGE_HINT_APPLE 0x85BC\r\n\tGL_STORAGE_PRIVATE_APPLE 0x85BD\r\n\tGL_STORAGE_CACHED_APPLE 0x85BE\r\n\tGL_STORAGE_SHARED_APPLE 0x85BF\r\n\tGL_TEXTURE_RANGE_LENGTH_APPLE 0x85B7\r\n\tGL_TEXTURE_RANGE_POINTER_APPLE 0x85B8\r\n\tvoid glTextureRangeAPPLE (GLenum target, GLsizei length, GLvoid *pointer)\r\n\tvoid glGetTexParameterPointervAPPLE (GLenum target, GLenum pname, GLvoid **params)\r\n\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_APPLE_transform_hint",
    "content": "GL_APPLE_transform_hint\r\nhttp://www.opengl.org/registry/specs/APPLE/transform_hint.txt\r\n\tGL_TRANSFORM_HINT_APPLE 0x85B1\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_APPLE_vertex_array_object",
    "content": "GL_APPLE_vertex_array_object\r\nhttp://www.opengl.org/registry/specs/APPLE/vertex_array_object.txt\r\n\tGL_VERTEX_ARRAY_BINDING_APPLE 0x85B5\r\n\tvoid glBindVertexArrayAPPLE (GLuint array)\r\n\tvoid glDeleteVertexArraysAPPLE (GLsizei n, const GLuint* arrays)\r\n\tvoid glGenVertexArraysAPPLE (GLsizei n, const GLuint* arrays)\r\n\tGLboolean glIsVertexArrayAPPLE (GLuint array)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_APPLE_vertex_array_range",
    "content": "GL_APPLE_vertex_array_range\r\nhttp://www.opengl.org/registry/specs/APPLE/vertex_array_range.txt\r\n\tGL_VERTEX_ARRAY_RANGE_APPLE 0x851D\r\n\tGL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E\r\n\tGL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F\r\n\tGL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_APPLE 0x8520\r\n\tGL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521\r\n\tGL_STORAGE_CACHED_APPLE 0x85BE\r\n\tGL_STORAGE_SHARED_APPLE 0x85BF\r\n\tvoid glFlushVertexArrayRangeAPPLE (GLsizei length, void* pointer)\r\n\tvoid glVertexArrayParameteriAPPLE (GLenum pname, GLint param)\r\n\tvoid glVertexArrayRangeAPPLE (GLsizei length, void* pointer)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_APPLE_vertex_program_evaluators",
    "content": "GL_APPLE_vertex_program_evaluators\r\nhttp://www.opengl.org/registry/specs/APPLE/vertex_program_evaluators.txt\r\n\tGL_VERTEX_ATTRIB_MAP1_APPLE 0x8A00\r\n\tGL_VERTEX_ATTRIB_MAP2_APPLE 0x8A01\r\n\tGL_VERTEX_ATTRIB_MAP1_SIZE_APPLE 0x8A02\r\n\tGL_VERTEX_ATTRIB_MAP1_COEFF_APPLE 0x8A03\r\n\tGL_VERTEX_ATTRIB_MAP1_ORDER_APPLE 0x8A04\r\n\tGL_VERTEX_ATTRIB_MAP1_DOMAIN_APPLE 0x8A05\r\n\tGL_VERTEX_ATTRIB_MAP2_SIZE_APPLE 0x8A06\r\n\tGL_VERTEX_ATTRIB_MAP2_COEFF_APPLE 0x8A07\r\n\tGL_VERTEX_ATTRIB_MAP2_ORDER_APPLE 0x8A08\r\n\tGL_VERTEX_ATTRIB_MAP2_DOMAIN_APPLE 0x8A09\r\n\tvoid glDisableVertexAttribAPPLE (GLuint index, GLenum pname)\r\n\tvoid glEnableVertexAttribAPPLE (GLuint index, GLenum pname)\r\n\tGLboolean glIsVertexAttribEnabledAPPLE (GLuint index, GLenum pname)\r\n\tvoid glMapVertexAttrib1dAPPLE (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble* points)\r\n\tvoid glMapVertexAttrib1fAPPLE (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat* points)\r\n\tvoid glMapVertexAttrib2dAPPLE (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble* points)\r\n\tvoid glMapVertexAttrib2fAPPLE (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat* points)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_APPLE_ycbcr_422",
    "content": "GL_APPLE_ycbcr_422\r\nhttp://www.opengl.org/registry/specs/APPLE/ycbcr_422.txt\r\n\tGL_YCBCR_422_APPLE 0x85B9\r\n\tGL_UNSIGNED_SHORT_8_8_APPLE 0x85BA\r\n\tGL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_color_buffer_float",
    "content": "GL_ARB_color_buffer_float\r\nhttp://www.opengl.org/registry/specs/ARB/color_buffer_float.txt\r\n\tGL_RGBA_FLOAT_MODE_ARB 0x8820\r\n\tGL_CLAMP_VERTEX_COLOR_ARB 0x891A\r\n\tGL_CLAMP_FRAGMENT_COLOR_ARB 0x891B\r\n\tGL_CLAMP_READ_COLOR_ARB 0x891C\r\n\tGL_FIXED_ONLY_ARB 0x891D\r\n\tvoid glClampColorARB (GLenum target, GLenum clamp)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_compatibility",
    "content": "GL_ARB_compatibility\r\nhttp://www.opengl.org/registry/specs/ARB/compatibility.txt\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_copy_buffer",
    "content": "GL_ARB_copy_buffer\r\nhttp://www.opengl.org/registry/specs/ARB/copy_buffer.txt\r\n\tGL_COPY_READ_BUFFER 0x8F36\r\n\tGL_COPY_WRITE_BUFFER 0x8F37\r\n\tvoid glCopyBufferSubData (GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_depth_buffer_float",
    "content": "GL_ARB_depth_buffer_float\r\nhttp://www.opengl.org/registry/specs/ARB/depth_buffer_float.txt\r\n\tGL_DEPTH_COMPONENT32F 0x8CAC\r\n\tGL_DEPTH32F_STENCIL8 0x8CAD\r\n\tGL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_depth_clamp",
    "content": "GL_ARB_depth_clamp\r\nhttp://www.opengl.org/registry/specs/ARB/depth_clamp.txt\r\n\tGL_DEPTH_CLAMP 0x864F\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_depth_texture",
    "content": "GL_ARB_depth_texture\r\nhttp://www.opengl.org/registry/specs/ARB/depth_texture.txt\r\n\tGL_DEPTH_COMPONENT16_ARB 0x81A5\r\n\tGL_DEPTH_COMPONENT24_ARB 0x81A6\r\n\tGL_DEPTH_COMPONENT32_ARB 0x81A7\r\n\tGL_TEXTURE_DEPTH_SIZE_ARB 0x884A\r\n\tGL_DEPTH_TEXTURE_MODE_ARB 0x884B\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_draw_buffers",
    "content": "GL_ARB_draw_buffers\r\nhttp://www.opengl.org/registry/specs/ARB/draw_buffers.txt\r\n\tGL_MAX_DRAW_BUFFERS_ARB 0x8824\r\n\tGL_DRAW_BUFFER0_ARB 0x8825\r\n\tGL_DRAW_BUFFER1_ARB 0x8826\r\n\tGL_DRAW_BUFFER2_ARB 0x8827\r\n\tGL_DRAW_BUFFER3_ARB 0x8828\r\n\tGL_DRAW_BUFFER4_ARB 0x8829\r\n\tGL_DRAW_BUFFER5_ARB 0x882A\r\n\tGL_DRAW_BUFFER6_ARB 0x882B\r\n\tGL_DRAW_BUFFER7_ARB 0x882C\r\n\tGL_DRAW_BUFFER8_ARB 0x882D\r\n\tGL_DRAW_BUFFER9_ARB 0x882E\r\n\tGL_DRAW_BUFFER10_ARB 0x882F\r\n\tGL_DRAW_BUFFER11_ARB 0x8830\r\n\tGL_DRAW_BUFFER12_ARB 0x8831\r\n\tGL_DRAW_BUFFER13_ARB 0x8832\r\n\tGL_DRAW_BUFFER14_ARB 0x8833\r\n\tGL_DRAW_BUFFER15_ARB 0x8834\r\n\tvoid glDrawBuffersARB (GLsizei n, const GLenum* bufs)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_draw_buffers_blend",
    "content": "GL_ARB_draw_buffers_blend\r\nhttp://www.opengl.org/registry/specs/ARB/draw_buffers_blend.txt\r\n\tvoid glBlendEquationSeparateiARB (GLuint buf, GLenum modeRGB, GLenum modeAlpha)\r\n\tvoid glBlendEquationiARB (GLuint buf, GLenum mode)\r\n\tvoid glBlendFuncSeparateiARB (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)\r\n\tvoid glBlendFunciARB (GLuint buf, GLenum src, GLenum dst)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_draw_elements_base_vertex",
    "content": "GL_ARB_draw_elements_base_vertex\r\nhttp://www.opengl.org/registry/specs/ARB/draw_elements_base_vertex.txt\r\n\tvoid glDrawElementsBaseVertex (GLenum mode, GLsizei count, GLenum type, void* indices, GLint basevertex)\r\n\tvoid glDrawElementsInstancedBaseVertex (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount, GLint basevertex)\r\n\tvoid glDrawRangeElementsBaseVertex (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, void* indices, GLint basevertex)\r\n\tvoid glMultiDrawElementsBaseVertex (GLenum mode, GLsizei* count, GLenum type, GLvoid**indices, GLsizei primcount, GLint *basevertex)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_draw_instanced",
    "content": "GL_ARB_draw_instanced\r\nhttp://www.opengl.org/registry/specs/ARB/draw_instanced.txt\r\n\tvoid glDrawArraysInstancedARB (GLenum mode, GLint first, GLsizei count, GLsizei primcount)\r\n\tvoid glDrawElementsInstancedARB (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_fragment_coord_conventions",
    "content": "GL_ARB_fragment_coord_conventions\r\nhttp://www.opengl.org/registry/specs/ARB/fragment_coord_conventions.txt\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_fragment_program",
    "content": "GL_ARB_fragment_program\r\nhttp://www.opengl.org/registry/specs/ARB/fragment_program.txt\r\n\tGL_FRAGMENT_PROGRAM_ARB 0x8804\r\n\tGL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805\r\n\tGL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806\r\n\tGL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807\r\n\tGL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808\r\n\tGL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809\r\n\tGL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A\r\n\tGL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B\r\n\tGL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C\r\n\tGL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D\r\n\tGL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E\r\n\tGL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F\r\n\tGL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810\r\n\tGL_MAX_TEXTURE_COORDS_ARB 0x8871\r\n\tGL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_fragment_program_shadow",
    "content": "GL_ARB_fragment_program_shadow\r\nhttp://www.opengl.org/registry/specs/ARB/fragment_program_shadow.txt\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_fragment_shader",
    "content": "GL_ARB_fragment_shader\r\nhttp://www.opengl.org/registry/specs/ARB/fragment_shader.txt\r\n\tGL_FRAGMENT_SHADER_ARB 0x8B30\r\n\tGL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49\r\n\tGL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_framebuffer_object",
    "content": "GL_ARB_framebuffer_object\r\nhttp://www.opengl.org/registry/specs/ARB/framebuffer_object.txt\r\n\tGL_INVALID_FRAMEBUFFER_OPERATION 0x0506\r\n\tGL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210\r\n\tGL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211\r\n\tGL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212\r\n\tGL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213\r\n\tGL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214\r\n\tGL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215\r\n\tGL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216\r\n\tGL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217\r\n\tGL_FRAMEBUFFER_DEFAULT 0x8218\r\n\tGL_FRAMEBUFFER_UNDEFINED 0x8219\r\n\tGL_DEPTH_STENCIL_ATTACHMENT 0x821A\r\n\tGL_INDEX 0x8222\r\n\tGL_MAX_RENDERBUFFER_SIZE 0x84E8\r\n\tGL_DEPTH_STENCIL 0x84F9\r\n\tGL_UNSIGNED_INT_24_8 0x84FA\r\n\tGL_DEPTH24_STENCIL8 0x88F0\r\n\tGL_TEXTURE_STENCIL_SIZE 0x88F1\r\n\tGL_UNSIGNED_NORMALIZED 0x8C17\r\n\tGL_SRGB 0x8C40\r\n\tGL_DRAW_FRAMEBUFFER_BINDING 0x8CA6\r\n\tGL_FRAMEBUFFER_BINDING 0x8CA6\r\n\tGL_RENDERBUFFER_BINDING 0x8CA7\r\n\tGL_READ_FRAMEBUFFER 0x8CA8\r\n\tGL_DRAW_FRAMEBUFFER 0x8CA9\r\n\tGL_READ_FRAMEBUFFER_BINDING 0x8CAA\r\n\tGL_RENDERBUFFER_SAMPLES 0x8CAB\r\n\tGL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0\r\n\tGL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1\r\n\tGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2\r\n\tGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3\r\n\tGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4\r\n\tGL_FRAMEBUFFER_COMPLETE 0x8CD5\r\n\tGL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6\r\n\tGL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7\r\n\tGL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB\r\n\tGL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC\r\n\tGL_FRAMEBUFFER_UNSUPPORTED 0x8CDD\r\n\tGL_MAX_COLOR_ATTACHMENTS 0x8CDF\r\n\tGL_COLOR_ATTACHMENT0 0x8CE0\r\n\tGL_COLOR_ATTACHMENT1 0x8CE1\r\n\tGL_COLOR_ATTACHMENT2 0x8CE2\r\n\tGL_COLOR_ATTACHMENT3 0x8CE3\r\n\tGL_COLOR_ATTACHMENT4 0x8CE4\r\n\tGL_COLOR_ATTACHMENT5 0x8CE5\r\n\tGL_COLOR_ATTACHMENT6 0x8CE6\r\n\tGL_COLOR_ATTACHMENT7 0x8CE7\r\n\tGL_COLOR_ATTACHMENT8 0x8CE8\r\n\tGL_COLOR_ATTACHMENT9 0x8CE9\r\n\tGL_COLOR_ATTACHMENT10 0x8CEA\r\n\tGL_COLOR_ATTACHMENT11 0x8CEB\r\n\tGL_COLOR_ATTACHMENT12 0x8CEC\r\n\tGL_COLOR_ATTACHMENT13 0x8CED\r\n\tGL_COLOR_ATTACHMENT14 0x8CEE\r\n\tGL_COLOR_ATTACHMENT15 0x8CEF\r\n\tGL_DEPTH_ATTACHMENT 0x8D00\r\n\tGL_STENCIL_ATTACHMENT 0x8D20\r\n\tGL_FRAMEBUFFER 0x8D40\r\n\tGL_RENDERBUFFER 0x8D41\r\n\tGL_RENDERBUFFER_WIDTH 0x8D42\r\n\tGL_RENDERBUFFER_HEIGHT 0x8D43\r\n\tGL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44\r\n\tGL_STENCIL_INDEX1 0x8D46\r\n\tGL_STENCIL_INDEX4 0x8D47\r\n\tGL_STENCIL_INDEX8 0x8D48\r\n\tGL_STENCIL_INDEX16 0x8D49\r\n\tGL_RENDERBUFFER_RED_SIZE 0x8D50\r\n\tGL_RENDERBUFFER_GREEN_SIZE 0x8D51\r\n\tGL_RENDERBUFFER_BLUE_SIZE 0x8D52\r\n\tGL_RENDERBUFFER_ALPHA_SIZE 0x8D53\r\n\tGL_RENDERBUFFER_DEPTH_SIZE 0x8D54\r\n\tGL_RENDERBUFFER_STENCIL_SIZE 0x8D55\r\n\tGL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56\r\n\tGL_MAX_SAMPLES 0x8D57\r\n\tvoid glBindFramebuffer (GLenum target, GLuint framebuffer)\r\n\tvoid glBindRenderbuffer (GLenum target, GLuint renderbuffer)\r\n\tvoid glBlitFramebuffer (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)\r\n\tGLenum glCheckFramebufferStatus (GLenum target)\r\n\tvoid glDeleteFramebuffers (GLsizei n, const GLuint* framebuffers)\r\n\tvoid glDeleteRenderbuffers (GLsizei n, const GLuint* renderbuffers)\r\n\tvoid glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)\r\n\tvoid glFramebufferTexture1D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)\r\n\tvoid glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)\r\n\tvoid glFramebufferTexture3D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint layer)\r\n\tvoid glFramebufferTextureLayer (GLenum target,GLenum attachment, GLuint texture,GLint level,GLint layer)\r\n\tvoid glGenFramebuffers (GLsizei n, GLuint* framebuffers)\r\n\tvoid glGenRenderbuffers (GLsizei n, GLuint* renderbuffers)\r\n\tvoid glGenerateMipmap (GLenum target)\r\n\tvoid glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint* params)\r\n\tvoid glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint* params)\r\n\tGLboolean glIsFramebuffer (GLuint framebuffer)\r\n\tGLboolean glIsRenderbuffer (GLuint renderbuffer)\r\n\tvoid glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height)\r\n\tvoid glRenderbufferStorageMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_framebuffer_sRGB",
    "content": "GL_ARB_framebuffer_sRGB\r\nhttp://www.opengl.org/registry/specs/ARB/framebuffer_sRGB.txt\r\n\tGL_FRAMEBUFFER_SRGB 0x8DB9\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_geometry_shader4",
    "content": "GL_ARB_geometry_shader4\r\nhttp://www.opengl.org/registry/specs/ARB/geometry_shader4.txt\r\n\tGL_LINES_ADJACENCY_ARB 0xA\r\n\tGL_LINE_STRIP_ADJACENCY_ARB 0xB\r\n\tGL_TRIANGLES_ADJACENCY_ARB 0xC\r\n\tGL_TRIANGLE_STRIP_ADJACENCY_ARB 0xD\r\n\tGL_PROGRAM_POINT_SIZE_ARB 0x8642\r\n\tGL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8C29\r\n\tGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4\r\n\tGL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8DA7\r\n\tGL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8DA8\r\n\tGL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8DA9\r\n\tGL_GEOMETRY_SHADER_ARB 0x8DD9\r\n\tGL_GEOMETRY_VERTICES_OUT_ARB 0x8DDA\r\n\tGL_GEOMETRY_INPUT_TYPE_ARB 0x8DDB\r\n\tGL_GEOMETRY_OUTPUT_TYPE_ARB 0x8DDC\r\n\tGL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8DDD\r\n\tGL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8DDE\r\n\tGL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8DDF\r\n\tGL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8DE0\r\n\tGL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8DE1\r\n\tvoid glFramebufferTextureARB (GLenum target, GLenum attachment, GLuint texture, GLint level)\r\n\tvoid glFramebufferTextureFaceARB (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face)\r\n\tvoid glFramebufferTextureLayerARB (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)\r\n\tvoid glProgramParameteriARB (GLuint program, GLenum pname, GLint value)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_half_float_pixel",
    "content": "GL_ARB_half_float_pixel\r\nhttp://www.opengl.org/registry/specs/ARB/half_float_pixel.txt\r\n\tGL_HALF_FLOAT_ARB 0x140B\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_half_float_vertex",
    "content": "GL_ARB_half_float_vertex\r\nhttp://www.opengl.org/registry/specs/ARB/half_float_vertex.txt\r\n\tGL_HALF_FLOAT 0x140B\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_imaging",
    "content": "GL_ARB_imaging\r\n\tGL_CONSTANT_COLOR 0x8001\r\n\tGL_ONE_MINUS_CONSTANT_COLOR 0x8002\r\n\tGL_CONSTANT_ALPHA 0x8003\r\n\tGL_ONE_MINUS_CONSTANT_ALPHA 0x8004\r\n\tGL_BLEND_COLOR 0x8005\r\n\tGL_FUNC_ADD 0x8006\r\n\tGL_MIN 0x8007\r\n\tGL_MAX 0x8008\r\n\tGL_BLEND_EQUATION 0x8009\r\n\tGL_FUNC_SUBTRACT 0x800A\r\n\tGL_FUNC_REVERSE_SUBTRACT 0x800B\r\n\tGL_CONVOLUTION_1D 0x8010\r\n\tGL_CONVOLUTION_2D 0x8011\r\n\tGL_SEPARABLE_2D 0x8012\r\n\tGL_CONVOLUTION_BORDER_MODE 0x8013\r\n\tGL_CONVOLUTION_FILTER_SCALE 0x8014\r\n\tGL_CONVOLUTION_FILTER_BIAS 0x8015\r\n\tGL_REDUCE 0x8016\r\n\tGL_CONVOLUTION_FORMAT 0x8017\r\n\tGL_CONVOLUTION_WIDTH 0x8018\r\n\tGL_CONVOLUTION_HEIGHT 0x8019\r\n\tGL_MAX_CONVOLUTION_WIDTH 0x801A\r\n\tGL_MAX_CONVOLUTION_HEIGHT 0x801B\r\n\tGL_POST_CONVOLUTION_RED_SCALE 0x801C\r\n\tGL_POST_CONVOLUTION_GREEN_SCALE 0x801D\r\n\tGL_POST_CONVOLUTION_BLUE_SCALE 0x801E\r\n\tGL_POST_CONVOLUTION_ALPHA_SCALE 0x801F\r\n\tGL_POST_CONVOLUTION_RED_BIAS 0x8020\r\n\tGL_POST_CONVOLUTION_GREEN_BIAS 0x8021\r\n\tGL_POST_CONVOLUTION_BLUE_BIAS 0x8022\r\n\tGL_POST_CONVOLUTION_ALPHA_BIAS 0x8023\r\n\tGL_HISTOGRAM 0x8024\r\n\tGL_PROXY_HISTOGRAM 0x8025\r\n\tGL_HISTOGRAM_WIDTH 0x8026\r\n\tGL_HISTOGRAM_FORMAT 0x8027\r\n\tGL_HISTOGRAM_RED_SIZE 0x8028\r\n\tGL_HISTOGRAM_GREEN_SIZE 0x8029\r\n\tGL_HISTOGRAM_BLUE_SIZE 0x802A\r\n\tGL_HISTOGRAM_ALPHA_SIZE 0x802B\r\n\tGL_HISTOGRAM_LUMINANCE_SIZE 0x802C\r\n\tGL_HISTOGRAM_SINK 0x802D\r\n\tGL_MINMAX 0x802E\r\n\tGL_MINMAX_FORMAT 0x802F\r\n\tGL_MINMAX_SINK 0x8030\r\n\tGL_TABLE_TOO_LARGE 0x8031\r\n\tGL_COLOR_MATRIX 0x80B1\r\n\tGL_COLOR_MATRIX_STACK_DEPTH 0x80B2\r\n\tGL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3\r\n\tGL_POST_COLOR_MATRIX_RED_SCALE 0x80B4\r\n\tGL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5\r\n\tGL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6\r\n\tGL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7\r\n\tGL_POST_COLOR_MATRIX_RED_BIAS 0x80B8\r\n\tGL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9\r\n\tGL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA\r\n\tGL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB\r\n\tGL_COLOR_TABLE 0x80D0\r\n\tGL_POST_CONVOLUTION_COLOR_TABLE 0x80D1\r\n\tGL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2\r\n\tGL_PROXY_COLOR_TABLE 0x80D3\r\n\tGL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4\r\n\tGL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5\r\n\tGL_COLOR_TABLE_SCALE 0x80D6\r\n\tGL_COLOR_TABLE_BIAS 0x80D7\r\n\tGL_COLOR_TABLE_FORMAT 0x80D8\r\n\tGL_COLOR_TABLE_WIDTH 0x80D9\r\n\tGL_COLOR_TABLE_RED_SIZE 0x80DA\r\n\tGL_COLOR_TABLE_GREEN_SIZE 0x80DB\r\n\tGL_COLOR_TABLE_BLUE_SIZE 0x80DC\r\n\tGL_COLOR_TABLE_ALPHA_SIZE 0x80DD\r\n\tGL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE\r\n\tGL_COLOR_TABLE_INTENSITY_SIZE 0x80DF\r\n\tGL_IGNORE_BORDER 0x8150\r\n\tGL_CONSTANT_BORDER 0x8151\r\n\tGL_WRAP_BORDER 0x8152\r\n\tGL_REPLICATE_BORDER 0x8153\r\n\tGL_CONVOLUTION_BORDER_COLOR 0x8154\r\n\tvoid glColorTable (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table)\r\n\tvoid glColorSubTable (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data)\r\n\tvoid glColorTableParameteriv (GLenum target, GLenum pname, const GLint *params)\r\n\tvoid glColorTableParameterfv (GLenum target, GLenum pname, const GLfloat *params)\r\n\tvoid glCopyColorSubTable (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width)\r\n\tvoid glCopyColorTable (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)\r\n\tvoid glGetColorTable (GLenum target, GLenum format, GLenum type, GLvoid *table)\r\n\tvoid glGetColorTableParameterfv (GLenum target, GLenum pname, GLfloat *params)\r\n\tvoid glGetColorTableParameteriv (GLenum target, GLenum pname, GLint *params)\r\n\tvoid glHistogram (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink)\r\n\tvoid glResetHistogram (GLenum target)\r\n\tvoid glGetHistogram (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)\r\n\tvoid glGetHistogramParameterfv (GLenum target, GLenum pname, GLfloat *params)\r\n\tvoid glGetHistogramParameteriv (GLenum target, GLenum pname, GLint *params)\r\n\tvoid glMinmax (GLenum target, GLenum internalformat, GLboolean sink)\r\n\tvoid glResetMinmax (GLenum target)\r\n\tvoid glGetMinmaxParameterfv (GLenum target, GLenum pname, GLfloat *params)\r\n\tvoid glGetMinmaxParameteriv (GLenum target, GLenum pname, GLint *params)\r\n\tvoid glConvolutionFilter1D (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image)\r\n\tvoid glConvolutionFilter2D (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image)\r\n\tvoid glConvolutionParameterf (GLenum target, GLenum pname, GLfloat params)\r\n\tvoid glConvolutionParameterfv (GLenum target, GLenum pname, const GLfloat *params)\r\n\tvoid glConvolutionParameteri (GLenum target, GLenum pname, GLint params)\r\n\tvoid glConvolutionParameteriv (GLenum target, GLenum pname, const GLint *params)\r\n\tvoid glCopyConvolutionFilter1D (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)\r\n\tvoid glCopyConvolutionFilter2D (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height)\r\n\tvoid glGetConvolutionFilter (GLenum target, GLenum format, GLenum type, GLvoid *image)\r\n\tvoid glGetConvolutionParameterfv (GLenum target, GLenum pname, GLfloat *params)\r\n\tvoid glGetConvolutionParameteriv (GLenum target, GLenum pname, GLint *params)\r\n\tvoid glSeparableFilter2D (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column)\r\n\tvoid glGetSeparableFilter (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span)\r\n\tvoid glGetMinmax (GLenum target, GLboolean reset, GLenum format, GLenum types, GLvoid *values)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_instanced_arrays",
    "content": "GL_ARB_instanced_arrays\r\nhttp://www.opengl.org/registry/specs/ARB/instanced_arrays.txt\r\n\tGL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB 0x88FE\r\n\tvoid glVertexAttribDivisorARB (GLuint index, GLuint divisor)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_map_buffer_range",
    "content": "GL_ARB_map_buffer_range\r\nhttp://www.opengl.org/registry/specs/ARB/map_buffer_range.txt\r\n\tGL_MAP_READ_BIT 0x0001\r\n\tGL_MAP_WRITE_BIT 0x0002\r\n\tGL_MAP_INVALIDATE_RANGE_BIT 0x0004\r\n\tGL_MAP_INVALIDATE_BUFFER_BIT 0x0008\r\n\tGL_MAP_FLUSH_EXPLICIT_BIT 0x0010\r\n\tGL_MAP_UNSYNCHRONIZED_BIT 0x0020\r\n\tvoid glFlushMappedBufferRange (GLenum target, GLintptr offset, GLsizeiptr length)\r\n\tGLvoid * glMapBufferRange (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_matrix_palette",
    "content": "GL_ARB_matrix_palette\r\nhttp://oss.sgi.com/projects/ogl-sample/registry/ARB/matrix_palette.txt\r\n\tGL_MATRIX_PALETTE_ARB 0x8840\r\n\tGL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841\r\n\tGL_MAX_PALETTE_MATRICES_ARB 0x8842\r\n\tGL_CURRENT_PALETTE_MATRIX_ARB 0x8843\r\n\tGL_MATRIX_INDEX_ARRAY_ARB 0x8844\r\n\tGL_CURRENT_MATRIX_INDEX_ARB 0x8845\r\n\tGL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846\r\n\tGL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847\r\n\tGL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848\r\n\tGL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849\r\n\tvoid glCurrentPaletteMatrixARB (GLint index)\r\n\tvoid glMatrixIndexPointerARB (GLint size, GLenum type, GLsizei stride, GLvoid *pointer)\r\n\tvoid glMatrixIndexubvARB (GLint size, GLubyte *indices)\r\n\tvoid glMatrixIndexusvARB (GLint size, GLushort *indices)\r\n\tvoid glMatrixIndexuivARB (GLint size, GLuint *indices)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_multisample",
    "content": "GL_ARB_multisample\r\nhttp://www.opengl.org/registry/specs/ARB/multisample.txt\r\n\tGL_MULTISAMPLE_ARB 0x809D\r\n\tGL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E\r\n\tGL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F\r\n\tGL_SAMPLE_COVERAGE_ARB 0x80A0\r\n\tGL_SAMPLE_BUFFERS_ARB 0x80A8\r\n\tGL_SAMPLES_ARB 0x80A9\r\n\tGL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA\r\n\tGL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB\r\n\tGL_MULTISAMPLE_BIT_ARB 0x20000000\r\n\tvoid glSampleCoverageARB (GLclampf value, GLboolean invert)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_multitexture",
    "content": "GL_ARB_multitexture\r\nhttp://oss.sgi.com/projects/ogl-sample/registry/ARB/multitexture.txt\r\n\tGL_TEXTURE0_ARB 0x84C0\r\n\tGL_TEXTURE1_ARB 0x84C1\r\n\tGL_TEXTURE2_ARB 0x84C2\r\n\tGL_TEXTURE3_ARB 0x84C3\r\n\tGL_TEXTURE4_ARB 0x84C4\r\n\tGL_TEXTURE5_ARB 0x84C5\r\n\tGL_TEXTURE6_ARB 0x84C6\r\n\tGL_TEXTURE7_ARB 0x84C7\r\n\tGL_TEXTURE8_ARB 0x84C8\r\n\tGL_TEXTURE9_ARB 0x84C9\r\n\tGL_TEXTURE10_ARB 0x84CA\r\n\tGL_TEXTURE11_ARB 0x84CB\r\n\tGL_TEXTURE12_ARB 0x84CC\r\n\tGL_TEXTURE13_ARB 0x84CD\r\n\tGL_TEXTURE14_ARB 0x84CE\r\n\tGL_TEXTURE15_ARB 0x84CF\r\n\tGL_TEXTURE16_ARB 0x84D0\r\n\tGL_TEXTURE17_ARB 0x84D1\r\n\tGL_TEXTURE18_ARB 0x84D2\r\n\tGL_TEXTURE19_ARB 0x84D3\r\n\tGL_TEXTURE20_ARB 0x84D4\r\n\tGL_TEXTURE21_ARB 0x84D5\r\n\tGL_TEXTURE22_ARB 0x84D6\r\n\tGL_TEXTURE23_ARB 0x84D7\r\n\tGL_TEXTURE24_ARB 0x84D8\r\n\tGL_TEXTURE25_ARB 0x84D9\r\n\tGL_TEXTURE26_ARB 0x84DA\r\n\tGL_TEXTURE27_ARB 0x84DB\r\n\tGL_TEXTURE28_ARB 0x84DC\r\n\tGL_TEXTURE29_ARB 0x84DD\r\n\tGL_TEXTURE30_ARB 0x84DE\r\n\tGL_TEXTURE31_ARB 0x84DF\r\n\tGL_ACTIVE_TEXTURE_ARB 0x84E0\r\n\tGL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1\r\n\tGL_MAX_TEXTURE_UNITS_ARB 0x84E2\r\n\tvoid glActiveTextureARB (GLenum texture)\r\n\tvoid glClientActiveTextureARB (GLenum texture)\r\n\tvoid glMultiTexCoord1dARB (GLenum target, GLdouble s)\r\n\tvoid glMultiTexCoord1dvARB (GLenum target, const GLdouble *v)\r\n\tvoid glMultiTexCoord1fARB (GLenum target, GLfloat s)\r\n\tvoid glMultiTexCoord1fvARB (GLenum target, const GLfloat *v)\r\n\tvoid glMultiTexCoord1iARB (GLenum target, GLint s)\r\n\tvoid glMultiTexCoord1ivARB (GLenum target, const GLint *v)\r\n\tvoid glMultiTexCoord1sARB (GLenum target, GLshort s)\r\n\tvoid glMultiTexCoord1svARB (GLenum target, const GLshort *v)\r\n\tvoid glMultiTexCoord2dARB (GLenum target, GLdouble s, GLdouble t)\r\n\tvoid glMultiTexCoord2dvARB (GLenum target, const GLdouble *v)\r\n\tvoid glMultiTexCoord2fARB (GLenum target, GLfloat s, GLfloat t)\r\n\tvoid glMultiTexCoord2fvARB (GLenum target, const GLfloat *v)\r\n\tvoid glMultiTexCoord2iARB (GLenum target, GLint s, GLint t)\r\n\tvoid glMultiTexCoord2ivARB (GLenum target, const GLint *v)\r\n\tvoid glMultiTexCoord2sARB (GLenum target, GLshort s, GLshort t)\r\n\tvoid glMultiTexCoord2svARB (GLenum target, const GLshort *v)\r\n\tvoid glMultiTexCoord3dARB (GLenum target, GLdouble s, GLdouble t, GLdouble r)\r\n\tvoid glMultiTexCoord3dvARB (GLenum target, const GLdouble *v)\r\n\tvoid glMultiTexCoord3fARB (GLenum target, GLfloat s, GLfloat t, GLfloat r)\r\n\tvoid glMultiTexCoord3fvARB (GLenum target, const GLfloat *v)\r\n\tvoid glMultiTexCoord3iARB (GLenum target, GLint s, GLint t, GLint r)\r\n\tvoid glMultiTexCoord3ivARB (GLenum target, const GLint *v)\r\n\tvoid glMultiTexCoord3sARB (GLenum target, GLshort s, GLshort t, GLshort r)\r\n\tvoid glMultiTexCoord3svARB (GLenum target, const GLshort *v)\r\n\tvoid glMultiTexCoord4dARB (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)\r\n\tvoid glMultiTexCoord4dvARB (GLenum target, const GLdouble *v)\r\n\tvoid glMultiTexCoord4fARB (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)\r\n\tvoid glMultiTexCoord4fvARB (GLenum target, const GLfloat *v)\r\n\tvoid glMultiTexCoord4iARB (GLenum target, GLint s, GLint t, GLint r, GLint q)\r\n\tvoid glMultiTexCoord4ivARB (GLenum target, const GLint *v)\r\n\tvoid glMultiTexCoord4sARB (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)\r\n\tvoid glMultiTexCoord4svARB (GLenum target, const GLshort *v)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_occlusion_query",
    "content": "GL_ARB_occlusion_query\r\nhttp://www.opengl.org/registry/specs/ARB/occlusion_query.txt\r\n\tGL_QUERY_COUNTER_BITS_ARB 0x8864\r\n\tGL_CURRENT_QUERY_ARB 0x8865\r\n\tGL_QUERY_RESULT_ARB 0x8866\r\n\tGL_QUERY_RESULT_AVAILABLE_ARB 0x8867\r\n\tGL_SAMPLES_PASSED_ARB 0x8914\r\n\tvoid glBeginQueryARB (GLenum target, GLuint id)\r\n\tvoid glDeleteQueriesARB (GLsizei n, const GLuint* ids)\r\n\tvoid glEndQueryARB (GLenum target)\r\n\tvoid glGenQueriesARB (GLsizei n, GLuint* ids)\r\n\tvoid glGetQueryObjectivARB (GLuint id, GLenum pname, GLint* params)\r\n\tvoid glGetQueryObjectuivARB (GLuint id, GLenum pname, GLuint* params)\r\n\tvoid glGetQueryivARB (GLenum target, GLenum pname, GLint* params)\r\n\tGLboolean glIsQueryARB (GLuint id)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_pixel_buffer_object",
    "content": "GL_ARB_pixel_buffer_object\r\nhttp://www.opengl.org/registry/specs/ARB/pixel_buffer_object.txt\r\n\tGL_PIXEL_PACK_BUFFER_ARB 0x88EB\r\n\tGL_PIXEL_UNPACK_BUFFER_ARB 0x88EC\r\n\tGL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED\r\n\tGL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_point_parameters",
    "content": "GL_ARB_point_parameters\r\nhttp://www.opengl.org/registry/specs/ARB/point_parameters.txt\r\n\tGL_POINT_SIZE_MIN_ARB 0x8126\r\n\tGL_POINT_SIZE_MAX_ARB 0x8127\r\n\tGL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128\r\n\tGL_POINT_DISTANCE_ATTENUATION_ARB 0x8129\r\n\tvoid glPointParameterfARB (GLenum pname, GLfloat param)\r\n\tvoid glPointParameterfvARB (GLenum pname, GLfloat* params)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_point_sprite",
    "content": "GL_ARB_point_sprite\r\nhttp://www.opengl.org/registry/specs/ARB/point_sprite.txt\r\n\tGL_POINT_SPRITE_ARB 0x8861\r\n\tGL_COORD_REPLACE_ARB 0x8862\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_provoking_vertex",
    "content": "GL_ARB_provoking_vertex\r\nhttp://www.opengl.org/registry/specs/ARB/provoking_vertex.txt\r\n\tGL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C\r\n\tGL_FIRST_VERTEX_CONVENTION 0x8E4D\r\n\tGL_LAST_VERTEX_CONVENTION 0x8E4E\r\n\tGL_PROVOKING_VERTEX 0x8E4F\r\n\tvoid glProvokingVertex (GLenum mode)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_sample_shading",
    "content": "GL_ARB_sample_shading\r\nhttp://www.opengl.org/registry/specs/ARB/sample_shading.txt\r\n\tGL_SAMPLE_SHADING_ARB 0x8C36\r\n\tGL_MIN_SAMPLE_SHADING_VALUE_ARB 0x8C37\r\n\tvoid glMinSampleShadingARB (GLclampf value)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_seamless_cube_map",
    "content": "GL_ARB_seamless_cube_map\r\nhttp://www.opengl.org/registry/specs/ARB/seamless_cube_map.txt\r\n\tGL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_shader_objects",
    "content": "GL_ARB_shader_objects\r\nhttp://www.opengl.org/registry/specs/ARB/shader_objects.txt\r\n\tGL_PROGRAM_OBJECT_ARB 0x8B40\r\n\tGL_SHADER_OBJECT_ARB 0x8B48\r\n\tGL_OBJECT_TYPE_ARB 0x8B4E\r\n\tGL_OBJECT_SUBTYPE_ARB 0x8B4F\r\n\tGL_FLOAT_VEC2_ARB 0x8B50\r\n\tGL_FLOAT_VEC3_ARB 0x8B51\r\n\tGL_FLOAT_VEC4_ARB 0x8B52\r\n\tGL_INT_VEC2_ARB 0x8B53\r\n\tGL_INT_VEC3_ARB 0x8B54\r\n\tGL_INT_VEC4_ARB 0x8B55\r\n\tGL_BOOL_ARB 0x8B56\r\n\tGL_BOOL_VEC2_ARB 0x8B57\r\n\tGL_BOOL_VEC3_ARB 0x8B58\r\n\tGL_BOOL_VEC4_ARB 0x8B59\r\n\tGL_FLOAT_MAT2_ARB 0x8B5A\r\n\tGL_FLOAT_MAT3_ARB 0x8B5B\r\n\tGL_FLOAT_MAT4_ARB 0x8B5C\r\n\tGL_SAMPLER_1D_ARB 0x8B5D\r\n\tGL_SAMPLER_2D_ARB 0x8B5E\r\n\tGL_SAMPLER_3D_ARB 0x8B5F\r\n\tGL_SAMPLER_CUBE_ARB 0x8B60\r\n\tGL_SAMPLER_1D_SHADOW_ARB 0x8B61\r\n\tGL_SAMPLER_2D_SHADOW_ARB 0x8B62\r\n\tGL_SAMPLER_2D_RECT_ARB 0x8B63\r\n\tGL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64\r\n\tGL_OBJECT_DELETE_STATUS_ARB 0x8B80\r\n\tGL_OBJECT_COMPILE_STATUS_ARB 0x8B81\r\n\tGL_OBJECT_LINK_STATUS_ARB 0x8B82\r\n\tGL_OBJECT_VALIDATE_STATUS_ARB 0x8B83\r\n\tGL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84\r\n\tGL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85\r\n\tGL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86\r\n\tGL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87\r\n\tGL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88\r\n\tvoid glAttachObjectARB (GLhandleARB containerObj, GLhandleARB obj)\r\n\tvoid glCompileShaderARB (GLhandleARB shaderObj)\r\n\tGLhandleARB glCreateProgramObjectARB (void)\r\n\tGLhandleARB glCreateShaderObjectARB (GLenum shaderType)\r\n\tvoid glDeleteObjectARB (GLhandleARB obj)\r\n\tvoid glDetachObjectARB (GLhandleARB containerObj, GLhandleARB attachedObj)\r\n\tvoid glGetActiveUniformARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint *size, GLenum *type, GLcharARB *name)\r\n\tvoid glGetAttachedObjectsARB (GLhandleARB containerObj, GLsizei maxCount, GLsizei* count, GLhandleARB *obj)\r\n\tGLhandleARB glGetHandleARB (GLenum pname)\r\n\tvoid glGetInfoLogARB (GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB *infoLog)\r\n\tvoid glGetObjectParameterfvARB (GLhandleARB obj, GLenum pname, GLfloat* params)\r\n\tvoid glGetObjectParameterivARB (GLhandleARB obj, GLenum pname, GLint* params)\r\n\tvoid glGetShaderSourceARB (GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB *source)\r\n\tGLint glGetUniformLocationARB (GLhandleARB programObj, const GLcharARB* name)\r\n\tvoid glGetUniformfvARB (GLhandleARB programObj, GLint location, GLfloat* params)\r\n\tvoid glGetUniformivARB (GLhandleARB programObj, GLint location, GLint* params)\r\n\tvoid glLinkProgramARB (GLhandleARB programObj)\r\n\tvoid glShaderSourceARB (GLhandleARB shaderObj, GLsizei count, const GLcharARB ** string, const GLint *length)\r\n\tvoid glUniform1fARB (GLint location, GLfloat v0)\r\n\tvoid glUniform1fvARB (GLint location, GLsizei count, const GLfloat* value)\r\n\tvoid glUniform1iARB (GLint location, GLint v0)\r\n\tvoid glUniform1ivARB (GLint location, GLsizei count, const GLint* value)\r\n\tvoid glUniform2fARB (GLint location, GLfloat v0, GLfloat v1)\r\n\tvoid glUniform2fvARB (GLint location, GLsizei count, const GLfloat* value)\r\n\tvoid glUniform2iARB (GLint location, GLint v0, GLint v1)\r\n\tvoid glUniform2ivARB (GLint location, GLsizei count, const GLint* value)\r\n\tvoid glUniform3fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2)\r\n\tvoid glUniform3fvARB (GLint location, GLsizei count, const GLfloat* value)\r\n\tvoid glUniform3iARB (GLint location, GLint v0, GLint v1, GLint v2)\r\n\tvoid glUniform3ivARB (GLint location, GLsizei count, const GLint* value)\r\n\tvoid glUniform4fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)\r\n\tvoid glUniform4fvARB (GLint location, GLsizei count, const GLfloat* value)\r\n\tvoid glUniform4iARB (GLint location, GLint v0, GLint v1, GLint v2, GLint v3)\r\n\tvoid glUniform4ivARB (GLint location, GLsizei count, const GLint* value)\r\n\tvoid glUniformMatrix2fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)\r\n\tvoid glUniformMatrix3fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)\r\n\tvoid glUniformMatrix4fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)\r\n\tvoid glUseProgramObjectARB (GLhandleARB programObj)\r\n\tvoid glValidateProgramARB (GLhandleARB programObj)\r\n\ttypedef char GLcharARB\r\n\ttypedef unsigned int GLhandleARB\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_shader_texture_lod",
    "content": "GL_ARB_shader_texture_lod\r\nhttp://www.opengl.org/registry/specs/ARB/shader_texture_lod.txt\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_shading_language_100",
    "content": "GL_ARB_shading_language_100\r\nhttp://www.opengl.org/registry/specs/ARB/shading_language_100.txt\r\n\tGL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_shadow",
    "content": "GL_ARB_shadow\r\nhttp://www.opengl.org/registry/specs/ARB/shadow.txt\r\n\tGL_TEXTURE_COMPARE_MODE_ARB 0x884C\r\n\tGL_TEXTURE_COMPARE_FUNC_ARB 0x884D\r\n\tGL_COMPARE_R_TO_TEXTURE_ARB 0x884E\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_shadow_ambient",
    "content": "GL_ARB_shadow_ambient\r\nhttp://www.opengl.org/registry/specs/ARB/shadow_ambient.txt\r\n\tGL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_sync",
    "content": "GL_ARB_sync\r\nhttp://www.opengl.org/registry/specs/ARB/sync.txt\r\n\tGL_SYNC_FLUSH_COMMANDS_BIT 0x00000001\r\n\tGL_MAX_SERVER_WAIT_TIMEOUT 0x9111\r\n\tGL_OBJECT_TYPE 0x9112\r\n\tGL_SYNC_CONDITION 0x9113\r\n\tGL_SYNC_STATUS 0x9114\r\n\tGL_SYNC_FLAGS 0x9115\r\n\tGL_SYNC_FENCE 0x9116\r\n\tGL_SYNC_GPU_COMMANDS_COMPLETE 0x9117\r\n\tGL_UNSIGNALED 0x9118\r\n\tGL_SIGNALED 0x9119\r\n\tGL_ALREADY_SIGNALED 0x911A\r\n\tGL_TIMEOUT_EXPIRED 0x911B\r\n\tGL_CONDITION_SATISFIED 0x911C\r\n\tGL_WAIT_FAILED 0x911D\r\n\tGL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFF\r\n\tGLenum glClientWaitSync (GLsync GLsync,GLbitfield flags,GLuint64 timeout)\r\n\tvoid glDeleteSync (GLsync GLsync)\r\n\tGLsync glFenceSync (GLenum condition,GLbitfield flags)\r\n\tvoid glGetInteger64v (GLenum pname, GLint64* params)\r\n\tvoid glGetSynciv (GLsync GLsync,GLenum pname,GLsizei bufSize,GLsizei* length, GLint *values)\r\n\tGLboolean glIsSync (GLsync GLsync)\r\n\tvoid glWaitSync (GLsync GLsync,GLbitfield flags,GLuint64 timeout)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_texture_border_clamp",
    "content": "GL_ARB_texture_border_clamp\r\nhttp://www.opengl.org/registry/specs/ARB/texture_border_clamp.txt\r\n\tGL_CLAMP_TO_BORDER_ARB 0x812D\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_texture_buffer_object",
    "content": "GL_ARB_texture_buffer_object\r\nhttp://www.opengl.org/registry/specs/ARB/texture_buffer_object.txt\r\n\tGL_TEXTURE_BUFFER_ARB 0x8C2A\r\n\tGL_MAX_TEXTURE_BUFFER_SIZE_ARB 0x8C2B\r\n\tGL_TEXTURE_BINDING_BUFFER_ARB 0x8C2C\r\n\tGL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB 0x8C2D\r\n\tGL_TEXTURE_BUFFER_FORMAT_ARB 0x8C2E\r\n\tvoid glTexBufferARB (GLenum target, GLenum internalformat, GLuint buffer)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_texture_compression",
    "content": "GL_ARB_texture_compression\r\nhttp://www.opengl.org/registry/specs/ARB/texture_compression.txt\r\n\tGL_COMPRESSED_ALPHA_ARB 0x84E9\r\n\tGL_COMPRESSED_LUMINANCE_ARB 0x84EA\r\n\tGL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB\r\n\tGL_COMPRESSED_INTENSITY_ARB 0x84EC\r\n\tGL_COMPRESSED_RGB_ARB 0x84ED\r\n\tGL_COMPRESSED_RGBA_ARB 0x84EE\r\n\tGL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF\r\n\tGL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0\r\n\tGL_TEXTURE_COMPRESSED_ARB 0x86A1\r\n\tGL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2\r\n\tGL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3\r\n\tvoid glCompressedTexImage1DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void* data)\r\n\tvoid glCompressedTexImage2DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data)\r\n\tvoid glCompressedTexImage3DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data)\r\n\tvoid glCompressedTexSubImage1DARB (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void* data)\r\n\tvoid glCompressedTexSubImage2DARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data)\r\n\tvoid glCompressedTexSubImage3DARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data)\r\n\tvoid glGetCompressedTexImageARB (GLenum target, GLint lod, void* img)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_texture_compression_rgtc",
    "content": "GL_ARB_texture_compression_rgtc\r\nhttp://www.opengl.org/registry/specs/ARB/texture_compression_rgtc.txt\r\n\tGL_COMPRESSED_RED_RGTC1 0x8DBB\r\n\tGL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC\r\n\tGL_COMPRESSED_RG_RGTC2 0x8DBD\r\n\tGL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_texture_cube_map",
    "content": "GL_ARB_texture_cube_map\r\nhttp://www.opengl.org/registry/specs/ARB/texture_cube_map.txt\r\n\tGL_NORMAL_MAP_ARB 0x8511\r\n\tGL_REFLECTION_MAP_ARB 0x8512\r\n\tGL_TEXTURE_CUBE_MAP_ARB 0x8513\r\n\tGL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514\r\n\tGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515\r\n\tGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516\r\n\tGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517\r\n\tGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518\r\n\tGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519\r\n\tGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A\r\n\tGL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B\r\n\tGL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_texture_cube_map_array",
    "content": "GL_ARB_texture_cube_map_array\r\nhttp://www.opengl.org/registry/specs/ARB/texture_cube_map_array.txt\r\n\tGL_TEXTURE_CUBE_MAP_ARRAY_ARB 0x9009\r\n\tGL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB 0x900A\r\n\tGL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB 0x900B\r\n\tGL_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900C\r\n\tGL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D\r\n\tGL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900E\r\n\tGL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900F\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_texture_env_add",
    "content": "GL_ARB_texture_env_add\r\nhttp://www.opengl.org/registry/specs/ARB/texture_env_add.txt\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_texture_env_combine",
    "content": "GL_ARB_texture_env_combine\r\nhttp://www.opengl.org/registry/specs/ARB/texture_env_combine.txt\r\n\tGL_SUBTRACT_ARB 0x84E7\r\n\tGL_COMBINE_ARB 0x8570\r\n\tGL_COMBINE_RGB_ARB 0x8571\r\n\tGL_COMBINE_ALPHA_ARB 0x8572\r\n\tGL_RGB_SCALE_ARB 0x8573\r\n\tGL_ADD_SIGNED_ARB 0x8574\r\n\tGL_INTERPOLATE_ARB 0x8575\r\n\tGL_CONSTANT_ARB 0x8576\r\n\tGL_PRIMARY_COLOR_ARB 0x8577\r\n\tGL_PREVIOUS_ARB 0x8578\r\n\tGL_SOURCE0_RGB_ARB 0x8580\r\n\tGL_SOURCE1_RGB_ARB 0x8581\r\n\tGL_SOURCE2_RGB_ARB 0x8582\r\n\tGL_SOURCE0_ALPHA_ARB 0x8588\r\n\tGL_SOURCE1_ALPHA_ARB 0x8589\r\n\tGL_SOURCE2_ALPHA_ARB 0x858A\r\n\tGL_OPERAND0_RGB_ARB 0x8590\r\n\tGL_OPERAND1_RGB_ARB 0x8591\r\n\tGL_OPERAND2_RGB_ARB 0x8592\r\n\tGL_OPERAND0_ALPHA_ARB 0x8598\r\n\tGL_OPERAND1_ALPHA_ARB 0x8599\r\n\tGL_OPERAND2_ALPHA_ARB 0x859A\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_texture_env_crossbar",
    "content": "GL_ARB_texture_env_crossbar\r\nhttp://www.opengl.org/registry/specs/ARB/texture_env_crossbar.txt\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_texture_env_dot3",
    "content": "GL_ARB_texture_env_dot3\r\nhttp://www.opengl.org/registry/specs/ARB/texture_env_dot3.txt\r\n\tGL_DOT3_RGB_ARB 0x86AE\r\n\tGL_DOT3_RGBA_ARB 0x86AF\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_texture_float",
    "content": "GL_ARB_texture_float\r\nhttp://www.opengl.org/registry/specs/ARB/texture_float.txt\r\n\tGL_RGBA32F_ARB 0x8814\r\n\tGL_RGB32F_ARB 0x8815\r\n\tGL_ALPHA32F_ARB 0x8816\r\n\tGL_INTENSITY32F_ARB 0x8817\r\n\tGL_LUMINANCE32F_ARB 0x8818\r\n\tGL_LUMINANCE_ALPHA32F_ARB 0x8819\r\n\tGL_RGBA16F_ARB 0x881A\r\n\tGL_RGB16F_ARB 0x881B\r\n\tGL_ALPHA16F_ARB 0x881C\r\n\tGL_INTENSITY16F_ARB 0x881D\r\n\tGL_LUMINANCE16F_ARB 0x881E\r\n\tGL_LUMINANCE_ALPHA16F_ARB 0x881F\r\n\tGL_TEXTURE_RED_TYPE_ARB 0x8C10\r\n\tGL_TEXTURE_GREEN_TYPE_ARB 0x8C11\r\n\tGL_TEXTURE_BLUE_TYPE_ARB 0x8C12\r\n\tGL_TEXTURE_ALPHA_TYPE_ARB 0x8C13\r\n\tGL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14\r\n\tGL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15\r\n\tGL_TEXTURE_DEPTH_TYPE_ARB 0x8C16\r\n\tGL_UNSIGNED_NORMALIZED_ARB 0x8C17\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_texture_gather",
    "content": "GL_ARB_texture_gather\r\nhttp://www.opengl.org/registry/specs/ARB/texture_gather.txt\r\n\tGL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5E\r\n\tGL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5F\r\n\tGL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB 0x8F9F\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_texture_mirrored_repeat",
    "content": "GL_ARB_texture_mirrored_repeat\r\nhttp://www.opengl.org/registry/specs/ARB/texture_mirrored_repeat.txt\r\n\tGL_MIRRORED_REPEAT_ARB 0x8370\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_texture_multisample",
    "content": "GL_ARB_texture_multisample\r\nhttp://www.opengl.org/registry/specs/ARB/texture_multisample.txt\r\n\tGL_SAMPLE_POSITION 0x8E50\r\n\tGL_SAMPLE_MASK 0x8E51\r\n\tGL_SAMPLE_MASK_VALUE 0x8E52\r\n\tGL_MAX_SAMPLE_MASK_WORDS 0x8E59\r\n\tGL_TEXTURE_2D_MULTISAMPLE 0x9100\r\n\tGL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101\r\n\tGL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102\r\n\tGL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103\r\n\tGL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104\r\n\tGL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105\r\n\tGL_TEXTURE_SAMPLES 0x9106\r\n\tGL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107\r\n\tGL_SAMPLER_2D_MULTISAMPLE 0x9108\r\n\tGL_INT_SAMPLER_2D_MULTISAMPLE 0x9109\r\n\tGL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A\r\n\tGL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B\r\n\tGL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C\r\n\tGL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D\r\n\tGL_MAX_COLOR_TEXTURE_SAMPLES 0x910E\r\n\tGL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F\r\n\tGL_MAX_INTEGER_SAMPLES 0x9110\r\n\tvoid glGetMultisamplefv (GLenum pname, GLuint index, GLfloat* val)\r\n\tvoid glSampleMaski (GLuint index, GLbitfield mask)\r\n\tvoid glTexImage2DMultisample (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)\r\n\tvoid glTexImage3DMultisample (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_texture_non_power_of_two",
    "content": "GL_ARB_texture_non_power_of_two\r\nhttp://www.opengl.org/registry/specs/ARB/texture_non_power_of_two.txt\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_texture_query_lod",
    "content": "GL_ARB_texture_query_lod\r\nhttp://www.opengl.org/registry/specs/ARB/texture_query_lod.txt\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_texture_rectangle",
    "content": "GL_ARB_texture_rectangle\r\nhttp://www.opengl.org/registry/specs/ARB/texture_rectangle.txt\r\n\tGL_TEXTURE_RECTANGLE_ARB 0x84F5\r\n\tGL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6\r\n\tGL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7\r\n\tGL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8\r\n\tGL_SAMPLER_2D_RECT_ARB 0x8B63\r\n\tGL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_texture_rg",
    "content": "GL_ARB_texture_rg\r\nhttp://www.opengl.org/registry/specs/ARB/texture_rg.txt\r\n\tGL_RED 0x1903\r\n\tGL_COMPRESSED_RED 0x8225\r\n\tGL_COMPRESSED_RG 0x8226\r\n\tGL_RG 0x8227\r\n\tGL_RG_INTEGER 0x8228\r\n\tGL_R8 0x8229\r\n\tGL_R16 0x822A\r\n\tGL_RG8 0x822B\r\n\tGL_RG16 0x822C\r\n\tGL_R16F 0x822D\r\n\tGL_R32F 0x822E\r\n\tGL_RG16F 0x822F\r\n\tGL_RG32F 0x8230\r\n\tGL_R8I 0x8231\r\n\tGL_R8UI 0x8232\r\n\tGL_R16I 0x8233\r\n\tGL_R16UI 0x8234\r\n\tGL_R32I 0x8235\r\n\tGL_R32UI 0x8236\r\n\tGL_RG8I 0x8237\r\n\tGL_RG8UI 0x8238\r\n\tGL_RG16I 0x8239\r\n\tGL_RG16UI 0x823A\r\n\tGL_RG32I 0x823B\r\n\tGL_RG32UI 0x823C\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_transpose_matrix",
    "content": "GL_ARB_transpose_matrix\r\nhttp://www.opengl.org/registry/specs/ARB/transpose_matrix.txt\r\n\tGL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3\r\n\tGL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4\r\n\tGL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5\r\n\tGL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6\r\n\tvoid glLoadTransposeMatrixfARB (GLfloat m[16])\r\n\tvoid glLoadTransposeMatrixdARB (GLdouble m[16])\r\n\tvoid glMultTransposeMatrixfARB (GLfloat m[16])\r\n\tvoid glMultTransposeMatrixdARB (GLdouble m[16])\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_uniform_buffer_object",
    "content": "GL_ARB_uniform_buffer_object\r\nhttp://www.opengl.org/registry/specs/ARB/uniform_buffer_object.txt\r\n\tGL_UNIFORM_BUFFER 0x8A11\r\n\tGL_UNIFORM_BUFFER_BINDING 0x8A28\r\n\tGL_UNIFORM_BUFFER_START 0x8A29\r\n\tGL_UNIFORM_BUFFER_SIZE 0x8A2A\r\n\tGL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B\r\n\tGL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C\r\n\tGL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D\r\n\tGL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E\r\n\tGL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F\r\n\tGL_MAX_UNIFORM_BLOCK_SIZE 0x8A30\r\n\tGL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31\r\n\tGL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32\r\n\tGL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33\r\n\tGL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34\r\n\tGL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35\r\n\tGL_ACTIVE_UNIFORM_BLOCKS 0x8A36\r\n\tGL_UNIFORM_TYPE 0x8A37\r\n\tGL_UNIFORM_SIZE 0x8A38\r\n\tGL_UNIFORM_NAME_LENGTH 0x8A39\r\n\tGL_UNIFORM_BLOCK_INDEX 0x8A3A\r\n\tGL_UNIFORM_OFFSET 0x8A3B\r\n\tGL_UNIFORM_ARRAY_STRIDE 0x8A3C\r\n\tGL_UNIFORM_MATRIX_STRIDE 0x8A3D\r\n\tGL_UNIFORM_IS_ROW_MAJOR 0x8A3E\r\n\tGL_UNIFORM_BLOCK_BINDING 0x8A3F\r\n\tGL_UNIFORM_BLOCK_DATA_SIZE 0x8A40\r\n\tGL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41\r\n\tGL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42\r\n\tGL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43\r\n\tGL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44\r\n\tGL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45\r\n\tGL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46\r\n\tGL_INVALID_INDEX 0xFFFFFFFF\r\n\tvoid glBindBufferBase (GLenum target, GLuint index, GLuint buffer)\r\n\tvoid glBindBufferRange (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)\r\n\tvoid glGetActiveUniformBlockName (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, char* uniformBlockName)\r\n\tvoid glGetActiveUniformBlockiv (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)\r\n\tvoid glGetActiveUniformName (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei* length, char* uniformName)\r\n\tvoid glGetActiveUniformsiv (GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)\r\n\tvoid glGetIntegeri_v (GLenum target, GLuint index, GLint* data)\r\n\tGLuint glGetUniformBlockIndex (GLuint program, const char* uniformBlockName)\r\n\tvoid glGetUniformIndices (GLuint program, GLsizei uniformCount, const char** uniformNames, GLuint* uniformIndices)\r\n\tvoid glUniformBlockBinding (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_vertex_array_bgra",
    "content": "GL_ARB_vertex_array_bgra\r\nhttp://www.opengl.org/registry/specs/ARB/vertex_array_bgra.txt\r\n\tGL_BGRA 0x80E1\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_vertex_array_object",
    "content": "GL_ARB_vertex_array_object\r\nhttp://www.opengl.org/registry/specs/ARB/vertex_array_object.txt\r\n\tGL_VERTEX_ARRAY_BINDING 0x85B5\r\n\tvoid glBindVertexArray (GLuint array)\r\n\tvoid glDeleteVertexArrays (GLsizei n, const GLuint* arrays)\r\n\tvoid glGenVertexArrays (GLsizei n, GLuint* arrays)\r\n\tGLboolean glIsVertexArray (GLuint array)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_vertex_blend",
    "content": "GL_ARB_vertex_blend\r\nhttp://oss.sgi.com/projects/ogl-sample/registry/ARB/vertex_blend.txt\r\n\tGL_MAX_VERTEX_UNITS_ARB 0x86A4\r\n\tGL_ACTIVE_VERTEX_UNITS_ARB 0x86A5\r\n\tGL_WEIGHT_SUM_UNITY_ARB 0x86A6\r\n\tGL_VERTEX_BLEND_ARB 0x86A7\r\n\tGL_CURRENT_WEIGHT_ARB 0x86A8\r\n\tGL_WEIGHT_ARRAY_TYPE_ARB 0x86A9\r\n\tGL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA\r\n\tGL_WEIGHT_ARRAY_SIZE_ARB 0x86AB\r\n\tGL_WEIGHT_ARRAY_POINTER_ARB 0x86AC\r\n\tGL_WEIGHT_ARRAY_ARB 0x86AD\r\n\tGL_MODELVIEW0_ARB 0x1700\r\n\tGL_MODELVIEW1_ARB 0x850A\r\n\tGL_MODELVIEW2_ARB 0x8722\r\n\tGL_MODELVIEW3_ARB 0x8723\r\n\tGL_MODELVIEW4_ARB 0x8724\r\n\tGL_MODELVIEW5_ARB 0x8725\r\n\tGL_MODELVIEW6_ARB 0x8726\r\n\tGL_MODELVIEW7_ARB 0x8727\r\n\tGL_MODELVIEW8_ARB 0x8728\r\n\tGL_MODELVIEW9_ARB 0x8729\r\n\tGL_MODELVIEW10_ARB 0x872A\r\n\tGL_MODELVIEW11_ARB 0x872B\r\n\tGL_MODELVIEW12_ARB 0x872C\r\n\tGL_MODELVIEW13_ARB 0x872D\r\n\tGL_MODELVIEW14_ARB 0x872E\r\n\tGL_MODELVIEW15_ARB 0x872F\r\n\tGL_MODELVIEW16_ARB 0x8730\r\n\tGL_MODELVIEW17_ARB 0x8731\r\n\tGL_MODELVIEW18_ARB 0x8732\r\n\tGL_MODELVIEW19_ARB 0x8733\r\n\tGL_MODELVIEW20_ARB 0x8734\r\n\tGL_MODELVIEW21_ARB 0x8735\r\n\tGL_MODELVIEW22_ARB 0x8736\r\n\tGL_MODELVIEW23_ARB 0x8737\r\n\tGL_MODELVIEW24_ARB 0x8738\r\n\tGL_MODELVIEW25_ARB 0x8739\r\n\tGL_MODELVIEW26_ARB 0x873A\r\n\tGL_MODELVIEW27_ARB 0x873B\r\n\tGL_MODELVIEW28_ARB 0x873C\r\n\tGL_MODELVIEW29_ARB 0x873D\r\n\tGL_MODELVIEW30_ARB 0x873E\r\n\tGL_MODELVIEW31_ARB 0x873F\r\n\tvoid glWeightbvARB (GLint size, GLbyte *weights)\r\n\tvoid glWeightsvARB (GLint size, GLshort *weights)\r\n\tvoid glWeightivARB (GLint size, GLint *weights)\r\n\tvoid glWeightfvARB (GLint size, GLfloat *weights)\r\n\tvoid glWeightdvARB (GLint size, GLdouble *weights)\r\n\tvoid glWeightubvARB (GLint size, GLubyte *weights)\r\n\tvoid glWeightusvARB (GLint size, GLushort *weights)\r\n\tvoid glWeightuivARB (GLint size, GLuint *weights)\r\n\tvoid glWeightPointerARB (GLint size, GLenum type, GLsizei stride, GLvoid *pointer)\r\n\tvoid glVertexBlendARB (GLint count)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_vertex_buffer_object",
    "content": "GL_ARB_vertex_buffer_object\r\nhttp://www.opengl.org/registry/specs/ARB/vertex_buffer_object.txt\r\n\tGL_BUFFER_SIZE_ARB 0x8764\r\n\tGL_BUFFER_USAGE_ARB 0x8765\r\n\tGL_ARRAY_BUFFER_ARB 0x8892\r\n\tGL_ELEMENT_ARRAY_BUFFER_ARB 0x8893\r\n\tGL_ARRAY_BUFFER_BINDING_ARB 0x8894\r\n\tGL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895\r\n\tGL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896\r\n\tGL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897\r\n\tGL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898\r\n\tGL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899\r\n\tGL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A\r\n\tGL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B\r\n\tGL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C\r\n\tGL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D\r\n\tGL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E\r\n\tGL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F\r\n\tGL_READ_ONLY_ARB 0x88B8\r\n\tGL_WRITE_ONLY_ARB 0x88B9\r\n\tGL_READ_WRITE_ARB 0x88BA\r\n\tGL_BUFFER_ACCESS_ARB 0x88BB\r\n\tGL_BUFFER_MAPPED_ARB 0x88BC\r\n\tGL_BUFFER_MAP_POINTER_ARB 0x88BD\r\n\tGL_STREAM_DRAW_ARB 0x88E0\r\n\tGL_STREAM_READ_ARB 0x88E1\r\n\tGL_STREAM_COPY_ARB 0x88E2\r\n\tGL_STATIC_DRAW_ARB 0x88E4\r\n\tGL_STATIC_READ_ARB 0x88E5\r\n\tGL_STATIC_COPY_ARB 0x88E6\r\n\tGL_DYNAMIC_DRAW_ARB 0x88E8\r\n\tGL_DYNAMIC_READ_ARB 0x88E9\r\n\tGL_DYNAMIC_COPY_ARB 0x88EA\r\n\tvoid glBindBufferARB (GLenum target, GLuint buffer)\r\n\tvoid glBufferDataARB (GLenum target, GLsizeiptrARB size, const GLvoid* data, GLenum usage)\r\n\tvoid glBufferSubDataARB (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid* data)\r\n\tvoid glDeleteBuffersARB (GLsizei n, const GLuint* buffers)\r\n\tvoid glGenBuffersARB (GLsizei n, GLuint* buffers)\r\n\tvoid glGetBufferParameterivARB (GLenum target, GLenum pname, GLint* params)\r\n\tvoid glGetBufferPointervARB (GLenum target, GLenum pname, GLvoid** params)\r\n\tvoid glGetBufferSubDataARB (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid* data)\r\n\tGLboolean glIsBufferARB (GLuint buffer)\r\n\tGLvoid * glMapBufferARB (GLenum target, GLenum access)\r\n\tGLboolean glUnmapBufferARB (GLenum target)\r\n\ttypedef ptrdiff_t GLsizeiptrARB\r\n\ttypedef ptrdiff_t GLintptrARB\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_vertex_program",
    "content": "GL_ARB_vertex_program\r\nhttp://www.opengl.org/registry/specs/ARB/vertex_program.txt\r\n\tGL_COLOR_SUM_ARB 0x8458\r\n\tGL_VERTEX_PROGRAM_ARB 0x8620\r\n\tGL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622\r\n\tGL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623\r\n\tGL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624\r\n\tGL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625\r\n\tGL_CURRENT_VERTEX_ATTRIB_ARB 0x8626\r\n\tGL_PROGRAM_LENGTH_ARB 0x8627\r\n\tGL_PROGRAM_STRING_ARB 0x8628\r\n\tGL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E\r\n\tGL_MAX_PROGRAM_MATRICES_ARB 0x862F\r\n\tGL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640\r\n\tGL_CURRENT_MATRIX_ARB 0x8641\r\n\tGL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642\r\n\tGL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643\r\n\tGL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645\r\n\tGL_PROGRAM_ERROR_POSITION_ARB 0x864B\r\n\tGL_PROGRAM_BINDING_ARB 0x8677\r\n\tGL_MAX_VERTEX_ATTRIBS_ARB 0x8869\r\n\tGL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A\r\n\tGL_PROGRAM_ERROR_STRING_ARB 0x8874\r\n\tGL_PROGRAM_FORMAT_ASCII_ARB 0x8875\r\n\tGL_PROGRAM_FORMAT_ARB 0x8876\r\n\tGL_PROGRAM_INSTRUCTIONS_ARB 0x88A0\r\n\tGL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1\r\n\tGL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2\r\n\tGL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3\r\n\tGL_PROGRAM_TEMPORARIES_ARB 0x88A4\r\n\tGL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5\r\n\tGL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6\r\n\tGL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7\r\n\tGL_PROGRAM_PARAMETERS_ARB 0x88A8\r\n\tGL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9\r\n\tGL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA\r\n\tGL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB\r\n\tGL_PROGRAM_ATTRIBS_ARB 0x88AC\r\n\tGL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD\r\n\tGL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE\r\n\tGL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF\r\n\tGL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0\r\n\tGL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1\r\n\tGL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2\r\n\tGL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3\r\n\tGL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4\r\n\tGL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5\r\n\tGL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6\r\n\tGL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7\r\n\tGL_MATRIX0_ARB 0x88C0\r\n\tGL_MATRIX1_ARB 0x88C1\r\n\tGL_MATRIX2_ARB 0x88C2\r\n\tGL_MATRIX3_ARB 0x88C3\r\n\tGL_MATRIX4_ARB 0x88C4\r\n\tGL_MATRIX5_ARB 0x88C5\r\n\tGL_MATRIX6_ARB 0x88C6\r\n\tGL_MATRIX7_ARB 0x88C7\r\n\tGL_MATRIX8_ARB 0x88C8\r\n\tGL_MATRIX9_ARB 0x88C9\r\n\tGL_MATRIX10_ARB 0x88CA\r\n\tGL_MATRIX11_ARB 0x88CB\r\n\tGL_MATRIX12_ARB 0x88CC\r\n\tGL_MATRIX13_ARB 0x88CD\r\n\tGL_MATRIX14_ARB 0x88CE\r\n\tGL_MATRIX15_ARB 0x88CF\r\n\tGL_MATRIX16_ARB 0x88D0\r\n\tGL_MATRIX17_ARB 0x88D1\r\n\tGL_MATRIX18_ARB 0x88D2\r\n\tGL_MATRIX19_ARB 0x88D3\r\n\tGL_MATRIX20_ARB 0x88D4\r\n\tGL_MATRIX21_ARB 0x88D5\r\n\tGL_MATRIX22_ARB 0x88D6\r\n\tGL_MATRIX23_ARB 0x88D7\r\n\tGL_MATRIX24_ARB 0x88D8\r\n\tGL_MATRIX25_ARB 0x88D9\r\n\tGL_MATRIX26_ARB 0x88DA\r\n\tGL_MATRIX27_ARB 0x88DB\r\n\tGL_MATRIX28_ARB 0x88DC\r\n\tGL_MATRIX29_ARB 0x88DD\r\n\tGL_MATRIX30_ARB 0x88DE\r\n\tGL_MATRIX31_ARB 0x88DF\r\n\tvoid glBindProgramARB (GLenum target, GLuint program)\r\n\tvoid glDeleteProgramsARB (GLsizei n, const GLuint* programs)\r\n\tvoid glDisableVertexAttribArrayARB (GLuint index)\r\n\tvoid glEnableVertexAttribArrayARB (GLuint index)\r\n\tvoid glGenProgramsARB (GLsizei n, GLuint* programs)\r\n\tvoid glGetProgramEnvParameterdvARB (GLenum target, GLuint index, GLdouble* params)\r\n\tvoid glGetProgramEnvParameterfvARB (GLenum target, GLuint index, GLfloat* params)\r\n\tvoid glGetProgramLocalParameterdvARB (GLenum target, GLuint index, GLdouble* params)\r\n\tvoid glGetProgramLocalParameterfvARB (GLenum target, GLuint index, GLfloat* params)\r\n\tvoid glGetProgramStringARB (GLenum target, GLenum pname, void* string)\r\n\tvoid glGetProgramivARB (GLenum target, GLenum pname, GLint* params)\r\n\tvoid glGetVertexAttribPointervARB (GLuint index, GLenum pname, GLvoid** pointer)\r\n\tvoid glGetVertexAttribdvARB (GLuint index, GLenum pname, GLdouble* params)\r\n\tvoid glGetVertexAttribfvARB (GLuint index, GLenum pname, GLfloat* params)\r\n\tvoid glGetVertexAttribivARB (GLuint index, GLenum pname, GLint* params)\r\n\tGLboolean glIsProgramARB (GLuint program)\r\n\tvoid glProgramEnvParameter4dARB (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)\r\n\tvoid glProgramEnvParameter4dvARB (GLenum target, GLuint index, const GLdouble* params)\r\n\tvoid glProgramEnvParameter4fARB (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)\r\n\tvoid glProgramEnvParameter4fvARB (GLenum target, GLuint index, const GLfloat* params)\r\n\tvoid glProgramLocalParameter4dARB (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)\r\n\tvoid glProgramLocalParameter4dvARB (GLenum target, GLuint index, const GLdouble* params)\r\n\tvoid glProgramLocalParameter4fARB (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)\r\n\tvoid glProgramLocalParameter4fvARB (GLenum target, GLuint index, const GLfloat* params)\r\n\tvoid glProgramStringARB (GLenum target, GLenum format, GLsizei len, const void* string)\r\n\tvoid glVertexAttrib1dARB (GLuint index, GLdouble x)\r\n\tvoid glVertexAttrib1dvARB (GLuint index, const GLdouble* v)\r\n\tvoid glVertexAttrib1fARB (GLuint index, GLfloat x)\r\n\tvoid glVertexAttrib1fvARB (GLuint index, const GLfloat* v)\r\n\tvoid glVertexAttrib1sARB (GLuint index, GLshort x)\r\n\tvoid glVertexAttrib1svARB (GLuint index, const GLshort* v)\r\n\tvoid glVertexAttrib2dARB (GLuint index, GLdouble x, GLdouble y)\r\n\tvoid glVertexAttrib2dvARB (GLuint index, const GLdouble* v)\r\n\tvoid glVertexAttrib2fARB (GLuint index, GLfloat x, GLfloat y)\r\n\tvoid glVertexAttrib2fvARB (GLuint index, const GLfloat* v)\r\n\tvoid glVertexAttrib2sARB (GLuint index, GLshort x, GLshort y)\r\n\tvoid glVertexAttrib2svARB (GLuint index, const GLshort* v)\r\n\tvoid glVertexAttrib3dARB (GLuint index, GLdouble x, GLdouble y, GLdouble z)\r\n\tvoid glVertexAttrib3dvARB (GLuint index, const GLdouble* v)\r\n\tvoid glVertexAttrib3fARB (GLuint index, GLfloat x, GLfloat y, GLfloat z)\r\n\tvoid glVertexAttrib3fvARB (GLuint index, const GLfloat* v)\r\n\tvoid glVertexAttrib3sARB (GLuint index, GLshort x, GLshort y, GLshort z)\r\n\tvoid glVertexAttrib3svARB (GLuint index, const GLshort* v)\r\n\tvoid glVertexAttrib4NbvARB (GLuint index, const GLbyte* v)\r\n\tvoid glVertexAttrib4NivARB (GLuint index, const GLint* v)\r\n\tvoid glVertexAttrib4NsvARB (GLuint index, const GLshort* v)\r\n\tvoid glVertexAttrib4NubARB (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)\r\n\tvoid glVertexAttrib4NubvARB (GLuint index, const GLubyte* v)\r\n\tvoid glVertexAttrib4NuivARB (GLuint index, const GLuint* v)\r\n\tvoid glVertexAttrib4NusvARB (GLuint index, const GLushort* v)\r\n\tvoid glVertexAttrib4bvARB (GLuint index, const GLbyte* v)\r\n\tvoid glVertexAttrib4dARB (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)\r\n\tvoid glVertexAttrib4dvARB (GLuint index, const GLdouble* v)\r\n\tvoid glVertexAttrib4fARB (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)\r\n\tvoid glVertexAttrib4fvARB (GLuint index, const GLfloat* v)\r\n\tvoid glVertexAttrib4ivARB (GLuint index, const GLint* v)\r\n\tvoid glVertexAttrib4sARB (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)\r\n\tvoid glVertexAttrib4svARB (GLuint index, const GLshort* v)\r\n\tvoid glVertexAttrib4ubvARB (GLuint index, const GLubyte* v)\r\n\tvoid glVertexAttrib4uivARB (GLuint index, const GLuint* v)\r\n\tvoid glVertexAttrib4usvARB (GLuint index, const GLushort* v)\r\n\tvoid glVertexAttribPointerARB (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* pointer)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_vertex_shader",
    "content": "GL_ARB_vertex_shader\r\nhttp://www.opengl.org/registry/specs/ARB/vertex_shader.txt\r\n\tGL_VERTEX_SHADER_ARB 0x8B31\r\n\tGL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A\r\n\tGL_MAX_VARYING_FLOATS_ARB 0x8B4B\r\n\tGL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C\r\n\tGL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D\r\n\tGL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89\r\n\tGL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A\r\n\tvoid glBindAttribLocationARB (GLhandleARB programObj, GLuint index, const GLcharARB* name)\r\n\tvoid glGetActiveAttribARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint *size, GLenum *type, GLcharARB *name)\r\n\tGLint glGetAttribLocationARB (GLhandleARB programObj, const GLcharARB* name)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ARB_window_pos",
    "content": "GL_ARB_window_pos\r\nhttp://www.opengl.org/registry/specs/ARB/window_pos.txt\r\n\tvoid glWindowPos2dARB (GLdouble x, GLdouble y)\r\n\tvoid glWindowPos2dvARB (const GLdouble* p)\r\n\tvoid glWindowPos2fARB (GLfloat x, GLfloat y)\r\n\tvoid glWindowPos2fvARB (const GLfloat* p)\r\n\tvoid glWindowPos2iARB (GLint x, GLint y)\r\n\tvoid glWindowPos2ivARB (const GLint* p)\r\n\tvoid glWindowPos2sARB (GLshort x, GLshort y)\r\n\tvoid glWindowPos2svARB (const GLshort* p)\r\n\tvoid glWindowPos3dARB (GLdouble x, GLdouble y, GLdouble z)\r\n\tvoid glWindowPos3dvARB (const GLdouble* p)\r\n\tvoid glWindowPos3fARB (GLfloat x, GLfloat y, GLfloat z)\r\n\tvoid glWindowPos3fvARB (const GLfloat* p)\r\n\tvoid glWindowPos3iARB (GLint x, GLint y, GLint z)\r\n\tvoid glWindowPos3ivARB (const GLint* p)\r\n\tvoid glWindowPos3sARB (GLshort x, GLshort y, GLshort z)\r\n\tvoid glWindowPos3svARB (const GLshort* p)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ATIX_point_sprites",
    "content": "GL_ATIX_point_sprites\r\nhttp://www.ati.com/developer/atiopengl.pdf\r\n\tGL_TEXTURE_POINT_MODE_ATIX 0x60B0\r\n\tGL_TEXTURE_POINT_ONE_COORD_ATIX 0x60B1\r\n\tGL_TEXTURE_POINT_SPRITE_ATIX 0x60B2\r\n\tGL_POINT_SPRITE_CULL_MODE_ATIX 0x60B3\r\n\tGL_POINT_SPRITE_CULL_CENTER_ATIX 0x60B4\r\n\tGL_POINT_SPRITE_CULL_CLIP_ATIX 0x60B5\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ATIX_texture_env_combine3",
    "content": "GL_ATIX_texture_env_combine3\r\nhttp://www.ati.com/developer/atiopengl.pdf\r\n\tGL_MODULATE_ADD_ATIX 0x8744\r\n\tGL_MODULATE_SIGNED_ADD_ATIX 0x8745\r\n\tGL_MODULATE_SUBTRACT_ATIX 0x8746\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ATIX_texture_env_route",
    "content": "GL_ATIX_texture_env_route\r\nhttp://www.ati.com/developer/sdk/RadeonSDK/Html/Info/ATIX_texture_env_route.txt\r\n\tGL_SECONDARY_COLOR_ATIX 0x8747\r\n\tGL_TEXTURE_OUTPUT_RGB_ATIX 0x8748\r\n\tGL_TEXTURE_OUTPUT_ALPHA_ATIX 0x8749\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ATIX_vertex_shader_output_point_size",
    "content": "GL_ATIX_vertex_shader_output_point_size\r\nhttp://www.ati.com/developer/atiopengl.pdf\r\n\tGL_OUTPUT_POINT_SIZE_ATIX 0x610E\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ATI_draw_buffers",
    "content": "GL_ATI_draw_buffers\r\nhttp://www.opengl.org/registry/specs/ATI/draw_buffers.txt\r\n\tGL_MAX_DRAW_BUFFERS_ATI 0x8824\r\n\tGL_DRAW_BUFFER0_ATI 0x8825\r\n\tGL_DRAW_BUFFER1_ATI 0x8826\r\n\tGL_DRAW_BUFFER2_ATI 0x8827\r\n\tGL_DRAW_BUFFER3_ATI 0x8828\r\n\tGL_DRAW_BUFFER4_ATI 0x8829\r\n\tGL_DRAW_BUFFER5_ATI 0x882A\r\n\tGL_DRAW_BUFFER6_ATI 0x882B\r\n\tGL_DRAW_BUFFER7_ATI 0x882C\r\n\tGL_DRAW_BUFFER8_ATI 0x882D\r\n\tGL_DRAW_BUFFER9_ATI 0x882E\r\n\tGL_DRAW_BUFFER10_ATI 0x882F\r\n\tGL_DRAW_BUFFER11_ATI 0x8830\r\n\tGL_DRAW_BUFFER12_ATI 0x8831\r\n\tGL_DRAW_BUFFER13_ATI 0x8832\r\n\tGL_DRAW_BUFFER14_ATI 0x8833\r\n\tGL_DRAW_BUFFER15_ATI 0x8834\r\n\tvoid glDrawBuffersATI (GLsizei n, const GLenum* bufs)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ATI_element_array",
    "content": "GL_ATI_element_array\r\nhttp://www.opengl.org/registry/specs/ATI/element_array.txt\r\n\tGL_ELEMENT_ARRAY_ATI 0x8768\r\n\tGL_ELEMENT_ARRAY_TYPE_ATI 0x8769\r\n\tGL_ELEMENT_ARRAY_POINTER_ATI 0x876A\r\n\tvoid glDrawElementArrayATI (GLenum mode, GLsizei count)\r\n\tvoid glDrawRangeElementArrayATI (GLenum mode, GLuint start, GLuint end, GLsizei count)\r\n\tvoid glElementPointerATI (GLenum type, const void* pointer)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ATI_envmap_bumpmap",
    "content": "GL_ATI_envmap_bumpmap\r\nhttp://oss.sgi.com/projects/ogl-sample/registry/ATI/envmap_bumpmap.txt\r\n\tGL_BUMP_ROT_MATRIX_ATI 0x8775\r\n\tGL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776\r\n\tGL_BUMP_NUM_TEX_UNITS_ATI 0x8777\r\n\tGL_BUMP_TEX_UNITS_ATI 0x8778\r\n\tGL_DUDV_ATI 0x8779\r\n\tGL_DU8DV8_ATI 0x877A\r\n\tGL_BUMP_ENVMAP_ATI 0x877B\r\n\tGL_BUMP_TARGET_ATI 0x877C\r\n\tvoid glTexBumpParameterivATI (GLenum pname, GLint *param)\r\n\tvoid glTexBumpParameterfvATI (GLenum pname, GLfloat *param)\r\n\tvoid glGetTexBumpParameterivATI (GLenum pname, GLint *param)\r\n\tvoid glGetTexBumpParameterfvATI (GLenum pname, GLfloat *param)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ATI_fragment_shader",
    "content": "GL_ATI_fragment_shader\r\nhttp://www.opengl.org/registry/specs/ATI/fragment_shader.txt\r\n\tGL_RED_BIT_ATI 0x00000001\r\n\tGL_2X_BIT_ATI 0x00000001\r\n\tGL_4X_BIT_ATI 0x00000002\r\n\tGL_GREEN_BIT_ATI 0x00000002\r\n\tGL_COMP_BIT_ATI 0x00000002\r\n\tGL_BLUE_BIT_ATI 0x00000004\r\n\tGL_8X_BIT_ATI 0x00000004\r\n\tGL_NEGATE_BIT_ATI 0x00000004\r\n\tGL_BIAS_BIT_ATI 0x00000008\r\n\tGL_HALF_BIT_ATI 0x00000008\r\n\tGL_QUARTER_BIT_ATI 0x00000010\r\n\tGL_EIGHTH_BIT_ATI 0x00000020\r\n\tGL_SATURATE_BIT_ATI 0x00000040\r\n\tGL_FRAGMENT_SHADER_ATI 0x8920\r\n\tGL_REG_0_ATI 0x8921\r\n\tGL_REG_1_ATI 0x8922\r\n\tGL_REG_2_ATI 0x8923\r\n\tGL_REG_3_ATI 0x8924\r\n\tGL_REG_4_ATI 0x8925\r\n\tGL_REG_5_ATI 0x8926\r\n\tGL_CON_0_ATI 0x8941\r\n\tGL_CON_1_ATI 0x8942\r\n\tGL_CON_2_ATI 0x8943\r\n\tGL_CON_3_ATI 0x8944\r\n\tGL_CON_4_ATI 0x8945\r\n\tGL_CON_5_ATI 0x8946\r\n\tGL_CON_6_ATI 0x8947\r\n\tGL_CON_7_ATI 0x8948\r\n\tGL_MOV_ATI 0x8961\r\n\tGL_ADD_ATI 0x8963\r\n\tGL_MUL_ATI 0x8964\r\n\tGL_SUB_ATI 0x8965\r\n\tGL_DOT3_ATI 0x8966\r\n\tGL_DOT4_ATI 0x8967\r\n\tGL_MAD_ATI 0x8968\r\n\tGL_LERP_ATI 0x8969\r\n\tGL_CND_ATI 0x896A\r\n\tGL_CND0_ATI 0x896B\r\n\tGL_DOT2_ADD_ATI 0x896C\r\n\tGL_SECONDARY_INTERPOLATOR_ATI 0x896D\r\n\tGL_SWIZZLE_STR_ATI 0x8976\r\n\tGL_SWIZZLE_STQ_ATI 0x8977\r\n\tGL_SWIZZLE_STR_DR_ATI 0x8978\r\n\tGL_SWIZZLE_STQ_DQ_ATI 0x8979\r\n\tvoid glAlphaFragmentOp1ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod)\r\n\tvoid glAlphaFragmentOp2ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod)\r\n\tvoid glAlphaFragmentOp3ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod)\r\n\tvoid glBeginFragmentShaderATI (void)\r\n\tvoid glBindFragmentShaderATI (GLuint id)\r\n\tvoid glColorFragmentOp1ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod)\r\n\tvoid glColorFragmentOp2ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod)\r\n\tvoid glColorFragmentOp3ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod)\r\n\tvoid glDeleteFragmentShaderATI (GLuint id)\r\n\tvoid glEndFragmentShaderATI (void)\r\n\tGLuint glGenFragmentShadersATI (GLuint range)\r\n\tvoid glPassTexCoordATI (GLuint dst, GLuint coord, GLenum swizzle)\r\n\tvoid glSampleMapATI (GLuint dst, GLuint interp, GLenum swizzle)\r\n\tvoid glSetFragmentShaderConstantATI (GLuint dst, const GLfloat* value)\r\n\tGL_NUM_FRAGMENT_REGISTERS_ATI 0x896E\r\n\tGL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F\r\n\tGL_NUM_PASSES_ATI 0x8970\r\n\tGL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971\r\n\tGL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972\r\n\tGL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973\r\n\tGL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974\r\n\tGL_COLOR_ALPHA_PAIRING_ATI 0x8975\r\n\tGL_SWIZZLE_STRQ_ATI 0x897A\r\n\tGL_SWIZZLE_STRQ_DQ_ATI 0x897B\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ATI_map_object_buffer",
    "content": "GL_ATI_map_object_buffer\r\nhttp://www.ati.com/developer/sdk/RADEONSDK/Html/Info/ATI_map_object_buffer.txt\r\n\tvoid* glMapObjectBufferATI (GLuint buffer)\r\n\tvoid glUnmapObjectBufferATI (GLuint buffer)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ATI_meminfo",
    "content": "GL_ATI_meminfo\r\nhttp://www.opengl.org/registry/specs/ATI/meminfo.txt\r\n\tGL_VBO_FREE_MEMORY_ATI 0x87FB\r\n\tGL_TEXTURE_FREE_MEMORY_ATI 0x87FC\r\n\tGL_RENDERBUFFER_FREE_MEMORY_ATI 0x87FD\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ATI_pn_triangles",
    "content": "GL_ATI_pn_triangles\r\nhttp://www.ati.com/developer/sdk/RADEONSDK/Html/Info/ati_pn_triangles.txt\r\n\tGL_PN_TRIANGLES_ATI 0x87F0\r\n\tGL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1\r\n\tGL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2\r\n\tGL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3\r\n\tGL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4\r\n\tGL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5\r\n\tGL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6\r\n\tGL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7\r\n\tGL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8\r\n\tvoid glPNTrianglesiATI (GLenum pname, GLint param)\r\n\tvoid glPNTrianglesfATI (GLenum pname, GLfloat param)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ATI_separate_stencil",
    "content": "GL_ATI_separate_stencil\r\nhttp://www.ati.com/developer/sdk/RadeonSDK/Html/Info/ATI_separate_stencil.txt\r\n\tGL_STENCIL_BACK_FUNC_ATI 0x8800\r\n\tGL_STENCIL_BACK_FAIL_ATI 0x8801\r\n\tGL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802\r\n\tGL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803\r\n\tvoid glStencilOpSeparateATI (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)\r\n\tvoid glStencilFuncSeparateATI (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ATI_shader_texture_lod",
    "content": "GL_ATI_shader_texture_lod\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ATI_text_fragment_shader",
    "content": "GL_ATI_text_fragment_shader\r\nhttp://www.opengl.org/registry/specs/ATI/text_fragment_shader.txt\r\n\tGL_TEXT_FRAGMENT_SHADER_ATI 0x8200\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ATI_texture_compression_3dc",
    "content": "GL_ATI_texture_compression_3dc\r\n\tGL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI 0x8837\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ATI_texture_env_combine3",
    "content": "GL_ATI_texture_env_combine3\r\nhttp://www.opengl.org/registry/specs/ATI/texture_env_combine3.txt\r\n\tGL_MODULATE_ADD_ATI 0x8744\r\n\tGL_MODULATE_SIGNED_ADD_ATI 0x8745\r\n\tGL_MODULATE_SUBTRACT_ATI 0x8746\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ATI_texture_float",
    "content": "GL_ATI_texture_float\r\nhttp://www.opengl.org/registry/specs/ATI/texture_float.txt\r\n\tGL_RGBA_FLOAT32_ATI 0x8814\r\n\tGL_RGB_FLOAT32_ATI 0x8815\r\n\tGL_ALPHA_FLOAT32_ATI 0x8816\r\n\tGL_INTENSITY_FLOAT32_ATI 0x8817\r\n\tGL_LUMINANCE_FLOAT32_ATI 0x8818\r\n\tGL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819\r\n\tGL_RGBA_FLOAT16_ATI 0x881A\r\n\tGL_RGB_FLOAT16_ATI 0x881B\r\n\tGL_ALPHA_FLOAT16_ATI 0x881C\r\n\tGL_INTENSITY_FLOAT16_ATI 0x881D\r\n\tGL_LUMINANCE_FLOAT16_ATI 0x881E\r\n\tGL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ATI_texture_mirror_once",
    "content": "GL_ATI_texture_mirror_once\r\nhttp://www.opengl.org/registry/specs/ATI/texture_mirror_once.txt\r\n\tGL_MIRROR_CLAMP_ATI 0x8742\r\n\tGL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ATI_vertex_array_object",
    "content": "GL_ATI_vertex_array_object\r\nhttp://www.opengl.org/registry/specs/ATI/vertex_array_object.txt\r\n\tGL_STATIC_ATI 0x8760\r\n\tGL_DYNAMIC_ATI 0x8761\r\n\tGL_PRESERVE_ATI 0x8762\r\n\tGL_DISCARD_ATI 0x8763\r\n\tGL_OBJECT_BUFFER_SIZE_ATI 0x8764\r\n\tGL_OBJECT_BUFFER_USAGE_ATI 0x8765\r\n\tGL_ARRAY_OBJECT_BUFFER_ATI 0x8766\r\n\tGL_ARRAY_OBJECT_OFFSET_ATI 0x8767\r\n\tvoid glArrayObjectATI (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset)\r\n\tvoid glFreeObjectBufferATI (GLuint buffer)\r\n\tvoid glGetArrayObjectfvATI (GLenum array, GLenum pname, GLfloat* params)\r\n\tvoid glGetArrayObjectivATI (GLenum array, GLenum pname, GLint* params)\r\n\tvoid glGetObjectBufferfvATI (GLuint buffer, GLenum pname, GLfloat* params)\r\n\tvoid glGetObjectBufferivATI (GLuint buffer, GLenum pname, GLint* params)\r\n\tvoid glGetVariantArrayObjectfvATI (GLuint id, GLenum pname, GLfloat* params)\r\n\tvoid glGetVariantArrayObjectivATI (GLuint id, GLenum pname, GLint* params)\r\n\tGLboolean glIsObjectBufferATI (GLuint buffer)\r\n\tGLuint glNewObjectBufferATI (GLsizei size, const void* pointer, GLenum usage)\r\n\tvoid glUpdateObjectBufferATI (GLuint buffer, GLuint offset, GLsizei size, const void* pointer, GLenum preserve)\r\n\tvoid glVariantArrayObjectATI (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ATI_vertex_attrib_array_object",
    "content": "GL_ATI_vertex_attrib_array_object\r\nhttp://www.opengl.org/registry/specs/ATI/vertex_attrib_array_object.txt\r\n\tvoid glGetVertexAttribArrayObjectfvATI (GLuint index, GLenum pname, GLfloat* params)\r\n\tvoid glGetVertexAttribArrayObjectivATI (GLuint index, GLenum pname, GLint* params)\r\n\tvoid glVertexAttribArrayObjectATI (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_ATI_vertex_streams",
    "content": "GL_ATI_vertex_streams\r\nhttp://www.ati.com/developer/sdk/RADEONSDK/Html/Info/ATI_vertex_streams.txt\r\n\tGL_MAX_VERTEX_STREAMS_ATI 0x876B\r\n\tGL_VERTEX_SOURCE_ATI 0x876C\r\n\tGL_VERTEX_STREAM0_ATI 0x876D\r\n\tGL_VERTEX_STREAM1_ATI 0x876E\r\n\tGL_VERTEX_STREAM2_ATI 0x876F\r\n\tGL_VERTEX_STREAM3_ATI 0x8770\r\n\tGL_VERTEX_STREAM4_ATI 0x8771\r\n\tGL_VERTEX_STREAM5_ATI 0x8772\r\n\tGL_VERTEX_STREAM6_ATI 0x8773\r\n\tGL_VERTEX_STREAM7_ATI 0x8774\r\n\tvoid glClientActiveVertexStreamATI (GLenum stream)\r\n\tvoid glVertexBlendEnviATI (GLenum pname, GLint param)\r\n\tvoid glVertexBlendEnvfATI (GLenum pname, GLfloat param)\r\n\tvoid glVertexStream2sATI (GLenum stream, GLshort x, GLshort y)\r\n\tvoid glVertexStream2svATI (GLenum stream, const GLshort *v)\r\n\tvoid glVertexStream2iATI (GLenum stream, GLint x, GLint y)\r\n\tvoid glVertexStream2ivATI (GLenum stream, const GLint *v)\r\n\tvoid glVertexStream2fATI (GLenum stream, GLfloat x, GLfloat y)\r\n\tvoid glVertexStream2fvATI (GLenum stream, const GLfloat *v)\r\n\tvoid glVertexStream2dATI (GLenum stream, GLdouble x, GLdouble y)\r\n\tvoid glVertexStream2dvATI (GLenum stream, const GLdouble *v)\r\n\tvoid glVertexStream3sATI (GLenum stream, GLshort x, GLshort y, GLshort z)\r\n\tvoid glVertexStream3svATI (GLenum stream, const GLshort *v)\r\n\tvoid glVertexStream3iATI (GLenum stream, GLint x, GLint y, GLint z)\r\n\tvoid glVertexStream3ivATI (GLenum stream, const GLint *v)\r\n\tvoid glVertexStream3fATI (GLenum stream, GLfloat x, GLfloat y, GLfloat z)\r\n\tvoid glVertexStream3fvATI (GLenum stream, const GLfloat *v)\r\n\tvoid glVertexStream3dATI (GLenum stream, GLdouble x, GLdouble y, GLdouble z)\r\n\tvoid glVertexStream3dvATI (GLenum stream, const GLdouble *v)\r\n\tvoid glVertexStream4sATI (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w)\r\n\tvoid glVertexStream4svATI (GLenum stream, const GLshort *v)\r\n\tvoid glVertexStream4iATI (GLenum stream, GLint x, GLint y, GLint z, GLint w)\r\n\tvoid glVertexStream4ivATI (GLenum stream, const GLint *v)\r\n\tvoid glVertexStream4fATI (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w)\r\n\tvoid glVertexStream4fvATI (GLenum stream, const GLfloat *v)\r\n\tvoid glVertexStream4dATI (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w)\r\n\tvoid glVertexStream4dvATI (GLenum stream, const GLdouble *v)\r\n\tvoid glNormalStream3bATI (GLenum stream, GLbyte x, GLbyte y, GLbyte z)\r\n\tvoid glNormalStream3bvATI (GLenum stream, const GLbyte *v)\r\n\tvoid glNormalStream3sATI (GLenum stream, GLshort x, GLshort y, GLshort z)\r\n\tvoid glNormalStream3svATI (GLenum stream, const GLshort *v)\r\n\tvoid glNormalStream3iATI (GLenum stream, GLint x, GLint y, GLint z)\r\n\tvoid glNormalStream3ivATI (GLenum stream, const GLint *v)\r\n\tvoid glNormalStream3fATI (GLenum stream, GLfloat x, GLfloat y, GLfloat z)\r\n\tvoid glNormalStream3fvATI (GLenum stream, const GLfloat *v)\r\n\tvoid glNormalStream3dATI (GLenum stream, GLdouble x, GLdouble y, GLdouble z)\r\n\tvoid glNormalStream3dvATI (GLenum stream, const GLdouble *v)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_422_pixels",
    "content": "GL_EXT_422_pixels\r\nhttp://www.opengl.org/registry/specs/EXT/422_pixels.txt\r\n\tGL_422_EXT 0x80CC\r\n\tGL_422_REV_EXT 0x80CD\r\n\tGL_422_AVERAGE_EXT 0x80CE\r\n\tGL_422_REV_AVERAGE_EXT 0x80CF\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_Cg_shader",
    "content": "GL_EXT_Cg_shader\r\nhttp://download.nvidia.com/developer/GLSL/GLSL%20Release%20Notes%20for%20Release%2060.pdf\r\n\tGL_CG_VERTEX_SHADER_EXT 0x890E\r\n\tGL_CG_FRAGMENT_SHADER_EXT 0x890F\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_abgr",
    "content": "GL_EXT_abgr\r\nhttp://www.opengl.org/registry/specs/EXT/abgr.txt\r\n\tGL_ABGR_EXT 0x8000\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_bgra",
    "content": "GL_EXT_bgra\r\nhttp://www.opengl.org/registry/specs/EXT/bgra.txt\r\n\tGL_BGR_EXT 0x80E0\r\n\tGL_BGRA_EXT 0x80E1\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_bindable_uniform",
    "content": "GL_EXT_bindable_uniform\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_EXT_bindable_uniform.txt\r\n\tGL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT 0x8DE2\r\n\tGL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT 0x8DE3\r\n\tGL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT 0x8DE4\r\n\tGL_MAX_BINDABLE_UNIFORM_SIZE_EXT 0x8DED\r\n\tGL_UNIFORM_BUFFER_BINDING_EXT 0x8DEF\r\n\tGL_UNIFORM_BUFFER_EXT 0x8DEE\r\n\tvoid glUniformBufferEXT (GLuint program, GLint location, GLuint buffer)\r\n\tGLint glGetUniformBufferSizeEXT (GLuint program, GLint location)\r\n\tGLintptr glGetUniformOffsetEXT (GLuint program, GLint location)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_blend_color",
    "content": "GL_EXT_blend_color\r\nhttp://www.opengl.org/registry/specs/EXT/blend_color.txt\r\n\tGL_CONSTANT_COLOR_EXT 0x8001\r\n\tGL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002\r\n\tGL_CONSTANT_ALPHA_EXT 0x8003\r\n\tGL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004\r\n\tGL_BLEND_COLOR_EXT 0x8005\r\n\tvoid glBlendColorEXT (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_blend_equation_separate",
    "content": "GL_EXT_blend_equation_separate\r\nhttp://www.opengl.org/registry/specs/EXT/blend_equation_separate.txt\r\n\tGL_BLEND_EQUATION_RGB_EXT 0x8009\r\n\tGL_BLEND_EQUATION_ALPHA_EXT 0x883D\r\n\tvoid glBlendEquationSeparateEXT (GLenum modeRGB, GLenum modeAlpha)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_blend_func_separate",
    "content": "GL_EXT_blend_func_separate\r\nhttp://www.opengl.org/registry/specs/EXT/blend_func_separate.txt\r\n\tGL_BLEND_DST_RGB_EXT 0x80C8\r\n\tGL_BLEND_SRC_RGB_EXT 0x80C9\r\n\tGL_BLEND_DST_ALPHA_EXT 0x80CA\r\n\tGL_BLEND_SRC_ALPHA_EXT 0x80CB\r\n\tvoid glBlendFuncSeparateEXT (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_blend_logic_op",
    "content": "GL_EXT_blend_logic_op\r\nhttp://www.opengl.org/registry/specs/EXT/blend_logic_op.txt\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_blend_minmax",
    "content": "GL_EXT_blend_minmax\r\nhttp://www.opengl.org/registry/specs/EXT/blend_minmax.txt\r\n\tGL_FUNC_ADD_EXT 0x8006\r\n\tGL_MIN_EXT 0x8007\r\n\tGL_MAX_EXT 0x8008\r\n\tGL_BLEND_EQUATION_EXT 0x8009\r\n\tvoid glBlendEquationEXT (GLenum mode)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_blend_subtract",
    "content": "GL_EXT_blend_subtract\r\nhttp://www.opengl.org/registry/specs/EXT/blend_subtract.txt\r\n\tGL_FUNC_SUBTRACT_EXT 0x800A\r\n\tGL_FUNC_REVERSE_SUBTRACT_EXT 0x800B\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_clip_volume_hint",
    "content": "GL_EXT_clip_volume_hint\r\nhttp://www.opengl.org/registry/specs/EXT/clip_volume_hint.txt\r\n\tGL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_cmyka",
    "content": "GL_EXT_cmyka\r\nhttp://www.opengl.org/registry/specs/EXT/cmyka.txt\r\n\tGL_CMYK_EXT 0x800C\r\n\tGL_CMYKA_EXT 0x800D\r\n\tGL_PACK_CMYK_HINT_EXT 0x800E\r\n\tGL_UNPACK_CMYK_HINT_EXT 0x800F\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_color_subtable",
    "content": "GL_EXT_color_subtable\r\nhttp://www.opengl.org/registry/specs/EXT/color_subtable.txt\r\n\tvoid glColorSubTableEXT (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void* data)\r\n\tvoid glCopyColorSubTableEXT (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_compiled_vertex_array",
    "content": "GL_EXT_compiled_vertex_array\r\nhttp://www.opengl.org/registry/specs/EXT/compiled_vertex_array.txt\r\n\tGL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8\r\n\tGL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9\r\n\tvoid glLockArraysEXT (GLint first, GLsizei count)\r\n\tvoid glUnlockArraysEXT (void)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_convolution",
    "content": "GL_EXT_convolution\r\nhttp://www.opengl.org/registry/specs/EXT/convolution.txt\r\n\tGL_CONVOLUTION_1D_EXT 0x8010\r\n\tGL_CONVOLUTION_2D_EXT 0x8011\r\n\tGL_SEPARABLE_2D_EXT 0x8012\r\n\tGL_CONVOLUTION_BORDER_MODE_EXT 0x8013\r\n\tGL_CONVOLUTION_FILTER_SCALE_EXT 0x8014\r\n\tGL_CONVOLUTION_FILTER_BIAS_EXT 0x8015\r\n\tGL_REDUCE_EXT 0x8016\r\n\tGL_CONVOLUTION_FORMAT_EXT 0x8017\r\n\tGL_CONVOLUTION_WIDTH_EXT 0x8018\r\n\tGL_CONVOLUTION_HEIGHT_EXT 0x8019\r\n\tGL_MAX_CONVOLUTION_WIDTH_EXT 0x801A\r\n\tGL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B\r\n\tGL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C\r\n\tGL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D\r\n\tGL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E\r\n\tGL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F\r\n\tGL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020\r\n\tGL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021\r\n\tGL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022\r\n\tGL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023\r\n\tvoid glConvolutionFilter1DEXT (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void* image)\r\n\tvoid glConvolutionFilter2DEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* image)\r\n\tvoid glConvolutionParameterfEXT (GLenum target, GLenum pname, GLfloat param)\r\n\tvoid glConvolutionParameterfvEXT (GLenum target, GLenum pname, const GLfloat* params)\r\n\tvoid glConvolutionParameteriEXT (GLenum target, GLenum pname, GLint param)\r\n\tvoid glConvolutionParameterivEXT (GLenum target, GLenum pname, const GLint* params)\r\n\tvoid glCopyConvolutionFilter1DEXT (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)\r\n\tvoid glCopyConvolutionFilter2DEXT (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height)\r\n\tvoid glGetConvolutionFilterEXT (GLenum target, GLenum format, GLenum type, void* image)\r\n\tvoid glGetConvolutionParameterfvEXT (GLenum target, GLenum pname, GLfloat* params)\r\n\tvoid glGetConvolutionParameterivEXT (GLenum target, GLenum pname, GLint* params)\r\n\tvoid glGetSeparableFilterEXT (GLenum target, GLenum format, GLenum type, void* row, void* column, void* span)\r\n\tvoid glSeparableFilter2DEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* row, const void* column)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_coordinate_frame",
    "content": "GL_EXT_coordinate_frame\r\nhttp://www.opengl.org/registry/specs/EXT/coordinate_frame.txt\r\n\tGL_TANGENT_ARRAY_EXT 0x8439\r\n\tGL_BINORMAL_ARRAY_EXT 0x843A\r\n\tGL_CURRENT_TANGENT_EXT 0x843B\r\n\tGL_CURRENT_BINORMAL_EXT 0x843C\r\n\tGL_TANGENT_ARRAY_TYPE_EXT 0x843E\r\n\tGL_TANGENT_ARRAY_STRIDE_EXT 0x843F\r\n\tGL_BINORMAL_ARRAY_TYPE_EXT 0x8440\r\n\tGL_BINORMAL_ARRAY_STRIDE_EXT 0x8441\r\n\tGL_TANGENT_ARRAY_POINTER_EXT 0x8442\r\n\tGL_BINORMAL_ARRAY_POINTER_EXT 0x8443\r\n\tGL_MAP1_TANGENT_EXT 0x8444\r\n\tGL_MAP2_TANGENT_EXT 0x8445\r\n\tGL_MAP1_BINORMAL_EXT 0x8446\r\n\tGL_MAP2_BINORMAL_EXT 0x8447\r\n\tvoid glBinormalPointerEXT (GLenum type, GLsizei stride, void* pointer)\r\n\tvoid glTangentPointerEXT (GLenum type, GLsizei stride, void* pointer)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_copy_texture",
    "content": "GL_EXT_copy_texture\r\nhttp://www.opengl.org/registry/specs/EXT/copy_texture.txt\r\n\tvoid glCopyTexImage1DEXT (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)\r\n\tvoid glCopyTexImage2DEXT (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)\r\n\tvoid glCopyTexSubImage1DEXT (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)\r\n\tvoid glCopyTexSubImage2DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)\r\n\tvoid glCopyTexSubImage3DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_cull_vertex",
    "content": "GL_EXT_cull_vertex\r\nhttp://www.opengl.org/registry/specs/EXT/cull_vertex.txt\r\n\tvoid glCullParameterdvEXT (GLenum pname, GLdouble* params)\r\n\tvoid glCullParameterfvEXT (GLenum pname, GLfloat* params)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_depth_bounds_test",
    "content": "GL_EXT_depth_bounds_test\r\nhttp://www.nvidia.com/dev_content/nvopenglspecs/GL_EXT_depth_bounds_test.txt\r\n\tGL_DEPTH_BOUNDS_TEST_EXT 0x8890\r\n\tGL_DEPTH_BOUNDS_EXT 0x8891\r\n\tvoid glDepthBoundsEXT (GLclampd zmin, GLclampd zmax)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_direct_state_access",
    "content": "GL_EXT_direct_state_access\r\nhttp://www.opengl.org/registry/specs/EXT/direct_state_access.txt\r\n\tGL_PROGRAM_MATRIX_EXT 0x8E2D\r\n\tGL_TRANSPOSE_PROGRAM_MATRIX_EXT 0x8E2E\r\n\tGL_PROGRAM_MATRIX_STACK_DEPTH_EXT 0x8E2F\r\n\tvoid glBindMultiTextureEXT (GLenum texunit, GLenum target, GLuint texture)\r\n\tGLenum glCheckNamedFramebufferStatusEXT (GLuint framebuffer, GLenum target)\r\n\tvoid glClientAttribDefaultEXT (GLbitfield mask)\r\n\tvoid glCompressedMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void* data)\r\n\tvoid glCompressedMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data)\r\n\tvoid glCompressedMultiTexImage3DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data)\r\n\tvoid glCompressedMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void* data)\r\n\tvoid glCompressedMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data)\r\n\tvoid glCompressedMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data)\r\n\tvoid glCompressedTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void* data)\r\n\tvoid glCompressedTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data)\r\n\tvoid glCompressedTextureImage3DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data)\r\n\tvoid glCompressedTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void* data)\r\n\tvoid glCompressedTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data)\r\n\tvoid glCompressedTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data)\r\n\tvoid glCopyMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)\r\n\tvoid glCopyMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)\r\n\tvoid glCopyMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)\r\n\tvoid glCopyMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)\r\n\tvoid glCopyMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)\r\n\tvoid glCopyTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)\r\n\tvoid glCopyTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)\r\n\tvoid glCopyTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)\r\n\tvoid glCopyTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)\r\n\tvoid glCopyTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)\r\n\tvoid glDisableClientStateIndexedEXT (GLenum array, GLuint index)\r\n\tvoid glDisableClientStateiEXT (GLenum array, GLuint index)\r\n\tvoid glDisableVertexArrayAttribEXT (GLuint vaobj, GLuint index)\r\n\tvoid glDisableVertexArrayEXT (GLuint vaobj, GLenum array)\r\n\tvoid glEnableClientStateIndexedEXT (GLenum array, GLuint index)\r\n\tvoid glEnableClientStateiEXT (GLenum array, GLuint index)\r\n\tvoid glEnableVertexArrayAttribEXT (GLuint vaobj, GLuint index)\r\n\tvoid glEnableVertexArrayEXT (GLuint vaobj, GLenum array)\r\n\tvoid glFlushMappedNamedBufferRangeEXT (GLuint buffer, GLintptr offset, GLsizeiptr length)\r\n\tvoid glFramebufferDrawBufferEXT (GLuint framebuffer, GLenum mode)\r\n\tvoid glFramebufferDrawBuffersEXT (GLuint framebuffer, GLsizei n, const GLenum* bufs)\r\n\tvoid glFramebufferReadBufferEXT (GLuint framebuffer, GLenum mode)\r\n\tvoid glGenerateMultiTexMipmapEXT (GLenum texunit, GLenum target)\r\n\tvoid glGenerateTextureMipmapEXT (GLuint texture, GLenum target)\r\n\tvoid glGetCompressedMultiTexImageEXT (GLenum texunit, GLenum target, GLint level, void* img)\r\n\tvoid glGetCompressedTextureImageEXT (GLuint texture, GLenum target, GLint level, void* img)\r\n\tvoid glGetDoubleIndexedvEXT (GLenum target, GLuint index, GLdouble* params)\r\n\tvoid glGetDoublei_vEXT (GLenum pname, GLuint index, GLdouble* params)\r\n\tvoid glGetFloatIndexedvEXT (GLenum target, GLuint index, GLfloat* params)\r\n\tvoid glGetFloati_vEXT (GLenum pname, GLuint index, GLfloat* params)\r\n\tvoid glGetFramebufferParameterivEXT (GLuint framebuffer, GLenum pname, GLint* param)\r\n\tvoid glGetMultiTexEnvfvEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat* params)\r\n\tvoid glGetMultiTexEnvivEXT (GLenum texunit, GLenum target, GLenum pname, GLint* params)\r\n\tvoid glGetMultiTexGendvEXT (GLenum texunit, GLenum coord, GLenum pname, GLdouble* params)\r\n\tvoid glGetMultiTexGenfvEXT (GLenum texunit, GLenum coord, GLenum pname, GLfloat* params)\r\n\tvoid glGetMultiTexGenivEXT (GLenum texunit, GLenum coord, GLenum pname, GLint* params)\r\n\tvoid glGetMultiTexImageEXT (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void* pixels)\r\n\tvoid glGetMultiTexLevelParameterfvEXT (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat* params)\r\n\tvoid glGetMultiTexLevelParameterivEXT (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint* params)\r\n\tvoid glGetMultiTexParameterIivEXT (GLenum texunit, GLenum target, GLenum pname, GLint* params)\r\n\tvoid glGetMultiTexParameterIuivEXT (GLenum texunit, GLenum target, GLenum pname, GLuint* params)\r\n\tvoid glGetMultiTexParameterfvEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat* params)\r\n\tvoid glGetMultiTexParameterivEXT (GLenum texunit, GLenum target, GLenum pname, GLint* params)\r\n\tvoid glGetNamedBufferParameterivEXT (GLuint buffer, GLenum pname, GLint* params)\r\n\tvoid glGetNamedBufferPointervEXT (GLuint buffer, GLenum pname, void** params)\r\n\tvoid glGetNamedBufferSubDataEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, void* data)\r\n\tvoid glGetNamedFramebufferAttachmentParameterivEXT (GLuint framebuffer, GLenum attachment, GLenum pname, GLint* params)\r\n\tvoid glGetNamedProgramLocalParameterIivEXT (GLuint program, GLenum target, GLuint index, GLint* params)\r\n\tvoid glGetNamedProgramLocalParameterIuivEXT (GLuint program, GLenum target, GLuint index, GLuint* params)\r\n\tvoid glGetNamedProgramLocalParameterdvEXT (GLuint program, GLenum target, GLuint index, GLdouble* params)\r\n\tvoid glGetNamedProgramLocalParameterfvEXT (GLuint program, GLenum target, GLuint index, GLfloat* params)\r\n\tvoid glGetNamedProgramStringEXT (GLuint program, GLenum target, GLenum pname, void* string)\r\n\tvoid glGetNamedProgramivEXT (GLuint program, GLenum target, GLenum pname, GLint* params)\r\n\tvoid glGetNamedRenderbufferParameterivEXT (GLuint renderbuffer, GLenum pname, GLint* params)\r\n\tvoid glGetPointerIndexedvEXT (GLenum target, GLuint index, GLvoid** params)\r\n\tvoid glGetPointeri_vEXT (GLenum pname, GLuint index, GLvoid** params)\r\n\tvoid glGetTextureImageEXT (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void* pixels)\r\n\tvoid glGetTextureLevelParameterfvEXT (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat* params)\r\n\tvoid glGetTextureLevelParameterivEXT (GLuint texture, GLenum target, GLint level, GLenum pname, GLint* params)\r\n\tvoid glGetTextureParameterIivEXT (GLuint texture, GLenum target, GLenum pname, GLint* params)\r\n\tvoid glGetTextureParameterIuivEXT (GLuint texture, GLenum target, GLenum pname, GLuint* params)\r\n\tvoid glGetTextureParameterfvEXT (GLuint texture, GLenum target, GLenum pname, GLfloat* params)\r\n\tvoid glGetTextureParameterivEXT (GLuint texture, GLenum target, GLenum pname, GLint* params)\r\n\tvoid glGetVertexArrayIntegeri_vEXT (GLuint vaobj, GLuint index, GLenum pname, GLint* param)\r\n\tvoid glGetVertexArrayIntegervEXT (GLuint vaobj, GLenum pname, GLint* param)\r\n\tvoid glGetVertexArrayPointeri_vEXT (GLuint vaobj, GLuint index, GLenum pname, GLvoid** param)\r\n\tvoid glGetVertexArrayPointervEXT (GLuint vaobj, GLenum pname, GLvoid** param)\r\n\tGLvoid * glMapNamedBufferEXT (GLuint buffer, GLenum access)\r\n\tGLvoid * glMapNamedBufferRangeEXT (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access)\r\n\tvoid glMatrixFrustumEXT (GLenum matrixMode, GLdouble l, GLdouble r, GLdouble b, GLdouble t, GLdouble n, GLdouble f)\r\n\tvoid glMatrixLoadIdentityEXT (GLenum matrixMode)\r\n\tvoid glMatrixLoadTransposedEXT (GLenum matrixMode, const GLdouble* m)\r\n\tvoid glMatrixLoadTransposefEXT (GLenum matrixMode, const GLfloat* m)\r\n\tvoid glMatrixLoaddEXT (GLenum matrixMode, const GLdouble* m)\r\n\tvoid glMatrixLoadfEXT (GLenum matrixMode, const GLfloat* m)\r\n\tvoid glMatrixMultTransposedEXT (GLenum matrixMode, const GLdouble* m)\r\n\tvoid glMatrixMultTransposefEXT (GLenum matrixMode, const GLfloat* m)\r\n\tvoid glMatrixMultdEXT (GLenum matrixMode, const GLdouble* m)\r\n\tvoid glMatrixMultfEXT (GLenum matrixMode, const GLfloat* m)\r\n\tvoid glMatrixOrthoEXT (GLenum matrixMode, GLdouble l, GLdouble r, GLdouble b, GLdouble t, GLdouble n, GLdouble f)\r\n\tvoid glMatrixPopEXT (GLenum matrixMode)\r\n\tvoid glMatrixPushEXT (GLenum matrixMode)\r\n\tvoid glMatrixRotatedEXT (GLenum matrixMode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z)\r\n\tvoid glMatrixRotatefEXT (GLenum matrixMode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z)\r\n\tvoid glMatrixScaledEXT (GLenum matrixMode, GLdouble x, GLdouble y, GLdouble z)\r\n\tvoid glMatrixScalefEXT (GLenum matrixMode, GLfloat x, GLfloat y, GLfloat z)\r\n\tvoid glMatrixTranslatedEXT (GLenum matrixMode, GLdouble x, GLdouble y, GLdouble z)\r\n\tvoid glMatrixTranslatefEXT (GLenum matrixMode, GLfloat x, GLfloat y, GLfloat z)\r\n\tvoid glMultiTexBufferEXT (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer)\r\n\tvoid glMultiTexCoordPointerEXT (GLenum texunit, GLint size, GLenum type, GLsizei stride, const void* pointer)\r\n\tvoid glMultiTexEnvfEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat param)\r\n\tvoid glMultiTexEnvfvEXT (GLenum texunit, GLenum target, GLenum pname, const GLfloat* params)\r\n\tvoid glMultiTexEnviEXT (GLenum texunit, GLenum target, GLenum pname, GLint param)\r\n\tvoid glMultiTexEnvivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint* params)\r\n\tvoid glMultiTexGendEXT (GLenum texunit, GLenum coord, GLenum pname, GLdouble param)\r\n\tvoid glMultiTexGendvEXT (GLenum texunit, GLenum coord, GLenum pname, const GLdouble* params)\r\n\tvoid glMultiTexGenfEXT (GLenum texunit, GLenum coord, GLenum pname, GLfloat param)\r\n\tvoid glMultiTexGenfvEXT (GLenum texunit, GLenum coord, GLenum pname, const GLfloat* params)\r\n\tvoid glMultiTexGeniEXT (GLenum texunit, GLenum coord, GLenum pname, GLint param)\r\n\tvoid glMultiTexGenivEXT (GLenum texunit, GLenum coord, GLenum pname, const GLint* params)\r\n\tvoid glMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void* pixels)\r\n\tvoid glMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels)\r\n\tvoid glMultiTexImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels)\r\n\tvoid glMultiTexParameterIivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint* params)\r\n\tvoid glMultiTexParameterIuivEXT (GLenum texunit, GLenum target, GLenum pname, const GLuint* params)\r\n\tvoid glMultiTexParameterfEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat param)\r\n\tvoid glMultiTexParameterfvEXT (GLenum texunit, GLenum target, GLenum pname, const GLfloat* param)\r\n\tvoid glMultiTexParameteriEXT (GLenum texunit, GLenum target, GLenum pname, GLint param)\r\n\tvoid glMultiTexParameterivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint* param)\r\n\tvoid glMultiTexRenderbufferEXT (GLenum texunit, GLenum target, GLuint renderbuffer)\r\n\tvoid glMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void* pixels)\r\n\tvoid glMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels)\r\n\tvoid glMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels)\r\n\tvoid glNamedBufferDataEXT (GLuint buffer, GLsizeiptr size, const void* data, GLenum usage)\r\n\tvoid glNamedBufferSubDataEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data)\r\n\t void glNamedCopyBufferSubDataEXT (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)\r\n\tvoid glNamedFramebufferRenderbufferEXT (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)\r\n\tvoid glNamedFramebufferTexture1DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level)\r\n\tvoid glNamedFramebufferTexture2DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level)\r\n\tvoid glNamedFramebufferTexture3DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)\r\n\tvoid glNamedFramebufferTextureEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level)\r\n\tvoid glNamedFramebufferTextureFaceEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face)\r\n\tvoid glNamedFramebufferTextureLayerEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer)\r\n\tvoid glNamedProgramLocalParameter4dEXT (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)\r\n\tvoid glNamedProgramLocalParameter4dvEXT (GLuint program, GLenum target, GLuint index, const GLdouble* params)\r\n\tvoid glNamedProgramLocalParameter4fEXT (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)\r\n\tvoid glNamedProgramLocalParameter4fvEXT (GLuint program, GLenum target, GLuint index, const GLfloat* params)\r\n\tvoid glNamedProgramLocalParameterI4iEXT (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w)\r\n\tvoid glNamedProgramLocalParameterI4ivEXT (GLuint program, GLenum target, GLuint index, const GLint* params)\r\n\tvoid glNamedProgramLocalParameterI4uiEXT (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)\r\n\tvoid glNamedProgramLocalParameterI4uivEXT (GLuint program, GLenum target, GLuint index, const GLuint* params)\r\n\tvoid glNamedProgramLocalParameters4fvEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat* params)\r\n\tvoid glNamedProgramLocalParametersI4ivEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint* params)\r\n\tvoid glNamedProgramLocalParametersI4uivEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint* params)\r\n\tvoid glNamedProgramStringEXT (GLuint program, GLenum target, GLenum format, GLsizei len, const void* string)\r\n\tvoid glNamedRenderbufferStorageEXT (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height)\r\n\tvoid glNamedRenderbufferStorageMultisampleCoverageEXT (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height)\r\n\tvoid glNamedRenderbufferStorageMultisampleEXT (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)\r\n\tvoid glProgramUniform1fEXT (GLuint program, GLint location, GLfloat v0)\r\n\tvoid glProgramUniform1fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat* value)\r\n\tvoid glProgramUniform1iEXT (GLuint program, GLint location, GLint v0)\r\n\tvoid glProgramUniform1ivEXT (GLuint program, GLint location, GLsizei count, const GLint* value)\r\n\tvoid glProgramUniform1uiEXT (GLuint program, GLint location, GLuint v0)\r\n\tvoid glProgramUniform1uivEXT (GLuint program, GLint location, GLsizei count, const GLuint* value)\r\n\tvoid glProgramUniform2fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1)\r\n\tvoid glProgramUniform2fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat* value)\r\n\tvoid glProgramUniform2iEXT (GLuint program, GLint location, GLint v0, GLint v1)\r\n\tvoid glProgramUniform2ivEXT (GLuint program, GLint location, GLsizei count, const GLint* value)\r\n\tvoid glProgramUniform2uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1)\r\n\tvoid glProgramUniform2uivEXT (GLuint program, GLint location, GLsizei count, const GLuint* value)\r\n\tvoid glProgramUniform3fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)\r\n\tvoid glProgramUniform3fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat* value)\r\n\tvoid glProgramUniform3iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2)\r\n\tvoid glProgramUniform3ivEXT (GLuint program, GLint location, GLsizei count, const GLint* value)\r\n\tvoid glProgramUniform3uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)\r\n\tvoid glProgramUniform3uivEXT (GLuint program, GLint location, GLsizei count, const GLuint* value)\r\n\tvoid glProgramUniform4fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)\r\n\tvoid glProgramUniform4fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat* value)\r\n\tvoid glProgramUniform4iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3)\r\n\tvoid glProgramUniform4ivEXT (GLuint program, GLint location, GLsizei count, const GLint* value)\r\n\tvoid glProgramUniform4uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)\r\n\tvoid glProgramUniform4uivEXT (GLuint program, GLint location, GLsizei count, const GLuint* value)\r\n\tvoid glProgramUniformMatrix2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)\r\n\tvoid glProgramUniformMatrix2x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)\r\n\tvoid glProgramUniformMatrix2x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)\r\n\tvoid glProgramUniformMatrix3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)\r\n\tvoid glProgramUniformMatrix3x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)\r\n\tvoid glProgramUniformMatrix3x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)\r\n\tvoid glProgramUniformMatrix4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)\r\n\tvoid glProgramUniformMatrix4x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)\r\n\tvoid glProgramUniformMatrix4x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)\r\n\tvoid glPushClientAttribDefaultEXT (GLbitfield mask)\r\n\tvoid glTextureBufferEXT (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer)\r\n\tvoid glTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void* pixels)\r\n\tvoid glTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels)\r\n\tvoid glTextureImage3DEXT (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels)\r\n\tvoid glTextureParameterIivEXT (GLuint texture, GLenum target, GLenum pname, const GLint* params)\r\n\tvoid glTextureParameterIuivEXT (GLuint texture, GLenum target, GLenum pname, const GLuint* params)\r\n\tvoid glTextureParameterfEXT (GLuint texture, GLenum target, GLenum pname, GLfloat param)\r\n\tvoid glTextureParameterfvEXT (GLuint texture, GLenum target, GLenum pname, const GLfloat* param)\r\n\tvoid glTextureParameteriEXT (GLuint texture, GLenum target, GLenum pname, GLint param)\r\n\tvoid glTextureParameterivEXT (GLuint texture, GLenum target, GLenum pname, const GLint* param)\r\n\tvoid glTextureRenderbufferEXT (GLuint texture, GLenum target, GLuint renderbuffer)\r\n\tvoid glTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void* pixels)\r\n\tvoid glTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels)\r\n\tvoid glTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels)\r\n\tGLboolean glUnmapNamedBufferEXT (GLuint buffer)\r\n\tvoid glVertexArrayColorOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset)\r\n\tvoid glVertexArrayEdgeFlagOffsetEXT (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset)\r\n\tvoid glVertexArrayFogCoordOffsetEXT (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset)\r\n\tvoid glVertexArrayIndexOffsetEXT (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset)\r\n\tvoid glVertexArrayMultiTexCoordOffsetEXT (GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset)\r\n\tvoid glVertexArrayNormalOffsetEXT (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset)\r\n\tvoid glVertexArraySecondaryColorOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset)\r\n\tvoid glVertexArrayTexCoordOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset)\r\n\tvoid glVertexArrayVertexAttribIOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset)\r\n\tvoid glVertexArrayVertexAttribOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset)\r\n\tvoid glVertexArrayVertexOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_draw_buffers2",
    "content": "GL_EXT_draw_buffers2\r\nhttp://www.opengl.org/registry/specs/EXT/draw_buffers2.txt\r\n\tvoid glColorMaskIndexedEXT (GLuint buf, GLboolean r, GLboolean g, GLboolean b, GLboolean a)\r\n\tvoid glDisableIndexedEXT (GLenum target, GLuint index)\r\n\tvoid glEnableIndexedEXT (GLenum target, GLuint index)\r\n\tvoid glGetBooleanIndexedvEXT (GLenum value, GLuint index, GLboolean* data)\r\n\tvoid glGetIntegerIndexedvEXT (GLenum value, GLuint index, GLint* data)\r\n\tGLboolean glIsEnabledIndexedEXT (GLenum target, GLuint index)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_draw_instanced",
    "content": "GL_EXT_draw_instanced\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_EXT_draw_instanced.txt\r\n\tvoid glDrawArraysInstancedEXT (GLenum mode, GLint start, GLsizei count, GLsizei primcount)\r\n\tvoid glDrawElementsInstancedEXT (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_draw_range_elements",
    "content": "GL_EXT_draw_range_elements\r\nhttp://oss.sgi.com/projects/ogl-sample/registry/EXT/draw_range_elements.txt\r\n\tGL_MAX_ELEMENTS_VERTICES 0x80E8\r\n\tGL_MAX_ELEMENTS_INDICES 0x80E9\r\n\tvoid glDrawRangeElementsEXT (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_fog_coord",
    "content": "GL_EXT_fog_coord\r\nhttp://oss.sgi.com/projects/ogl-sample/registry/EXT/fog_coord.txt\r\n\tGL_FOG_COORDINATE_SOURCE_EXT 0x8450\r\n\tGL_FOG_COORDINATE_EXT 0x8451\r\n\tGL_FRAGMENT_DEPTH_EXT 0x8452\r\n\tGL_CURRENT_FOG_COORDINATE_EXT 0x8453\r\n\tGL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454\r\n\tGL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455\r\n\tGL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456\r\n\tGL_FOG_COORDINATE_ARRAY_EXT 0x8457\r\n\tvoid glFogCoordfEXT (GLfloat coord)\r\n\tvoid glFogCoordfvEXT (const GLfloat *coord)\r\n\tvoid glFogCoorddEXT (GLdouble coord)\r\n\tvoid glFogCoorddvEXT (const GLdouble *coord)\r\n\tvoid glFogCoordPointerEXT (GLenum type, GLsizei stride, const GLvoid *pointer)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_fragment_lighting",
    "content": "GL_EXT_fragment_lighting\r\nhttp://www.opengl.org/registry/specs/EXT/fragment_lighting.txt\r\n\tGL_FRAGMENT_LIGHTING_EXT 0x8400\r\n\tGL_FRAGMENT_COLOR_MATERIAL_EXT 0x8401\r\n\tGL_FRAGMENT_COLOR_MATERIAL_FACE_EXT 0x8402\r\n\tGL_FRAGMENT_COLOR_MATERIAL_PARAMETER_EXT 0x8403\r\n\tGL_MAX_FRAGMENT_LIGHTS_EXT 0x8404\r\n\tGL_MAX_ACTIVE_LIGHTS_EXT 0x8405\r\n\tGL_CURRENT_RASTER_NORMAL_EXT 0x8406\r\n\tGL_LIGHT_ENV_MODE_EXT 0x8407\r\n\tGL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_EXT 0x8408\r\n\tGL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_EXT 0x8409\r\n\tGL_FRAGMENT_LIGHT_MODEL_AMBIENT_EXT 0x840A\r\n\tGL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_EXT 0x840B\r\n\tGL_FRAGMENT_LIGHT0_EXT 0x840C\r\n\tGL_FRAGMENT_LIGHT7_EXT 0x8413\r\n\tvoid glFragmentColorMaterialEXT (GLenum face, GLenum mode)\r\n\tvoid glFragmentLightModelfEXT (GLenum pname, GLfloat param)\r\n\tvoid glFragmentLightModelfvEXT (GLenum pname, GLfloat* params)\r\n\tvoid glFragmentLightModeliEXT (GLenum pname, GLint param)\r\n\tvoid glFragmentLightModelivEXT (GLenum pname, GLint* params)\r\n\tvoid glFragmentLightfEXT (GLenum light, GLenum pname, GLfloat param)\r\n\tvoid glFragmentLightfvEXT (GLenum light, GLenum pname, GLfloat* params)\r\n\tvoid glFragmentLightiEXT (GLenum light, GLenum pname, GLint param)\r\n\tvoid glFragmentLightivEXT (GLenum light, GLenum pname, GLint* params)\r\n\tvoid glFragmentMaterialfEXT (GLenum face, GLenum pname, const GLfloat param)\r\n\tvoid glFragmentMaterialfvEXT (GLenum face, GLenum pname, const GLfloat* params)\r\n\tvoid glFragmentMaterialiEXT (GLenum face, GLenum pname, const GLint param)\r\n\tvoid glFragmentMaterialivEXT (GLenum face, GLenum pname, const GLint* params)\r\n\tvoid glGetFragmentLightfvEXT (GLenum light, GLenum pname, GLfloat* params)\r\n\tvoid glGetFragmentLightivEXT (GLenum light, GLenum pname, GLint* params)\r\n\tvoid glGetFragmentMaterialfvEXT (GLenum face, GLenum pname, const GLfloat* params)\r\n\tvoid glGetFragmentMaterialivEXT (GLenum face, GLenum pname, const GLint* params)\r\n\tvoid glLightEnviEXT (GLenum pname, GLint param)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_framebuffer_blit",
    "content": "GL_EXT_framebuffer_blit\r\nhttp://www.opengl.org/registry/specs/EXT/framebuffer_blit.txt\r\n\tGL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6\r\n\tGL_READ_FRAMEBUFFER_EXT 0x8CA8\r\n\tGL_DRAW_FRAMEBUFFER_EXT 0x8CA9\r\n\tGL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA\r\n\tvoid glBlitFramebufferEXT (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_framebuffer_multisample",
    "content": "GL_EXT_framebuffer_multisample\r\nhttp://www.opengl.org/registry/specs/EXT/framebuffer_multisample.txt\r\n\tGL_RENDERBUFFER_SAMPLES_EXT 0x8CAB\r\n\tGL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56\r\n\tGL_MAX_SAMPLES_EXT 0x8D57\r\n\tvoid glRenderbufferStorageMultisampleEXT (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)\r\n\tGL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56\r\n\tGL_MAX_SAMPLES_EXT 0x8D57\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_framebuffer_object",
    "content": "GL_EXT_framebuffer_object\r\nhttp://www.opengl.org/registry/specs/EXT/framebuffer_object.txt\r\n\tGL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506\r\n\tGL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8\r\n\tGL_FRAMEBUFFER_BINDING_EXT 0x8CA6\r\n\tGL_RENDERBUFFER_BINDING_EXT 0x8CA7\r\n\tGL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0\r\n\tGL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1\r\n\tGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2\r\n\tGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3\r\n\tGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4\r\n\tGL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5\r\n\tGL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6\r\n\tGL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7\r\n\tGL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9\r\n\tGL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA\r\n\tGL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB\r\n\tGL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC\r\n\tGL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD\r\n\tGL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF\r\n\tGL_COLOR_ATTACHMENT0_EXT 0x8CE0\r\n\tGL_COLOR_ATTACHMENT1_EXT 0x8CE1\r\n\tGL_COLOR_ATTACHMENT2_EXT 0x8CE2\r\n\tGL_COLOR_ATTACHMENT3_EXT 0x8CE3\r\n\tGL_COLOR_ATTACHMENT4_EXT 0x8CE4\r\n\tGL_COLOR_ATTACHMENT5_EXT 0x8CE5\r\n\tGL_COLOR_ATTACHMENT6_EXT 0x8CE6\r\n\tGL_COLOR_ATTACHMENT7_EXT 0x8CE7\r\n\tGL_COLOR_ATTACHMENT8_EXT 0x8CE8\r\n\tGL_COLOR_ATTACHMENT9_EXT 0x8CE9\r\n\tGL_COLOR_ATTACHMENT10_EXT 0x8CEA\r\n\tGL_COLOR_ATTACHMENT11_EXT 0x8CEB\r\n\tGL_COLOR_ATTACHMENT12_EXT 0x8CEC\r\n\tGL_COLOR_ATTACHMENT13_EXT 0x8CED\r\n\tGL_COLOR_ATTACHMENT14_EXT 0x8CEE\r\n\tGL_COLOR_ATTACHMENT15_EXT 0x8CEF\r\n\tGL_DEPTH_ATTACHMENT_EXT 0x8D00\r\n\tGL_STENCIL_ATTACHMENT_EXT 0x8D20\r\n\tGL_FRAMEBUFFER_EXT 0x8D40\r\n\tGL_RENDERBUFFER_EXT 0x8D41\r\n\tGL_RENDERBUFFER_WIDTH_EXT 0x8D42\r\n\tGL_RENDERBUFFER_HEIGHT_EXT 0x8D43\r\n\tGL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44\r\n\tGL_STENCIL_INDEX1_EXT 0x8D46\r\n\tGL_STENCIL_INDEX4_EXT 0x8D47\r\n\tGL_STENCIL_INDEX8_EXT 0x8D48\r\n\tGL_STENCIL_INDEX16_EXT 0x8D49\r\n\tGL_RENDERBUFFER_RED_SIZE_EXT 0x8D50\r\n\tGL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51\r\n\tGL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52\r\n\tGL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53\r\n\tGL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54\r\n\tGL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55\r\n\tvoid glBindFramebufferEXT (GLenum target, GLuint framebuffer)\r\n\tvoid glBindRenderbufferEXT (GLenum target, GLuint renderbuffer)\r\n\tGLenum glCheckFramebufferStatusEXT (GLenum target)\r\n\tvoid glDeleteFramebuffersEXT (GLsizei n, const GLuint* framebuffers)\r\n\tvoid glDeleteRenderbuffersEXT (GLsizei n, const GLuint* renderbuffers)\r\n\tvoid glFramebufferRenderbufferEXT (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)\r\n\tvoid glFramebufferTexture1DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)\r\n\tvoid glFramebufferTexture2DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)\r\n\tvoid glFramebufferTexture3DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)\r\n\tvoid glGenFramebuffersEXT (GLsizei n, GLuint* framebuffers)\r\n\tvoid glGenRenderbuffersEXT (GLsizei n, GLuint* renderbuffers)\r\n\tvoid glGenerateMipmapEXT (GLenum target)\r\n\tvoid glGetFramebufferAttachmentParameterivEXT (GLenum target, GLenum attachment, GLenum pname, GLint* params)\r\n\tvoid glGetRenderbufferParameterivEXT (GLenum target, GLenum pname, GLint* params)\r\n\tGLboolean glIsFramebufferEXT (GLuint framebuffer)\r\n\tGLboolean glIsRenderbufferEXT (GLuint renderbuffer)\r\n\tvoid glRenderbufferStorageEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_framebuffer_sRGB",
    "content": "GL_EXT_framebuffer_sRGB\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_EXT_framebuffer_sRGB.txt\r\n\tGL_FRAMEBUFFER_SRGB_EXT 0x8DB9\r\n\tGL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_geometry_shader4",
    "content": "GL_EXT_geometry_shader4\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_EXT_geometry_shader4.txt\r\n\tGL_GEOMETRY_SHADER_EXT 0x8DD9\r\n\tGL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD\r\n\tGL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE\r\n\tGL_MAX_VARYING_COMPONENTS_EXT 0x8B4B\r\n\tGL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF\r\n\tGL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0\r\n\tGL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1\r\n\tGL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA\r\n\tGL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB\r\n\tGL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC\r\n\tGL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29\r\n\tGL_LINES_ADJACENCY_EXT 0xA\r\n\tGL_LINE_STRIP_ADJACENCY_EXT 0xB\r\n\tGL_TRIANGLES_ADJACENCY_EXT 0xC\r\n\tGL_TRIANGLE_STRIP_ADJACENCY_EXT 0xD\r\n\tGL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7\r\n\tGL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8\r\n\tGL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9\r\n\tGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4\r\n\tGL_PROGRAM_POINT_SIZE_EXT 0x8642\r\n\tvoid glProgramParameteriEXT (GLuint program, GLenum pname, GLint value)\r\n\tvoid glFramebufferTextureEXT (GLenum target, GLenum attachment, GLuint texture, GLint level)\r\n\tvoid glFramebufferTextureLayerEXT (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)\r\n\tvoid glFramebufferTextureFaceEXT (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_gpu_program_parameters",
    "content": "GL_EXT_gpu_program_parameters\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_EXT_gpu_program_parameters.txt\r\n\tvoid glProgramEnvParameters4fvEXT (GLenum target, GLuint index, GLsizei count, const GLfloat* params)\r\n\tvoid glProgramLocalParameters4fvEXT (GLenum target, GLuint index, GLsizei count, const GLfloat* params)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_gpu_shader4",
    "content": "GL_EXT_gpu_shader4\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_EXT_gpu_shader4.txt\r\n\tGL_SAMPLER_1D_ARRAY_EXT 0x8DC0\r\n\tGL_SAMPLER_2D_ARRAY_EXT 0x8DC1\r\n\tGL_SAMPLER_BUFFER_EXT 0x8DC2\r\n\tGL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8DC3\r\n\tGL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8DC4\r\n\tGL_SAMPLER_CUBE_SHADOW_EXT 0x8DC5\r\n\tGL_UNSIGNED_INT_VEC2_EXT 0x8DC6\r\n\tGL_UNSIGNED_INT_VEC3_EXT 0x8DC7\r\n\tGL_UNSIGNED_INT_VEC4_EXT 0x8DC8\r\n\tGL_INT_SAMPLER_1D_EXT 0x8DC9\r\n\tGL_INT_SAMPLER_2D_EXT 0x8DCA\r\n\tGL_INT_SAMPLER_3D_EXT 0x8DCB\r\n\tGL_INT_SAMPLER_CUBE_EXT 0x8DCC\r\n\tGL_INT_SAMPLER_2D_RECT_EXT 0x8DCD\r\n\tGL_INT_SAMPLER_1D_ARRAY_EXT 0x8DCE\r\n\tGL_INT_SAMPLER_2D_ARRAY_EXT 0x8DCF\r\n\tGL_INT_SAMPLER_BUFFER_EXT 0x8DD0\r\n\tGL_UNSIGNED_INT_SAMPLER_1D_EXT 0x8DD1\r\n\tGL_UNSIGNED_INT_SAMPLER_2D_EXT 0x8DD2\r\n\tGL_UNSIGNED_INT_SAMPLER_3D_EXT 0x8DD3\r\n\tGL_UNSIGNED_INT_SAMPLER_CUBE_EXT 0x8DD4\r\n\tGL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8DD5\r\n\tGL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8DD6\r\n\tGL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8DD7\r\n\tGL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8\r\n\tGL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT 0x88FD\r\n\tvoid glGetUniformuivEXT (GLuint program, GLint location, GLuint *params)\r\n\tvoid glBindFragDataLocationEXT (GLuint program, GLuint color, const GLchar *name)\r\n\tGLint glGetFragDataLocationEXT (GLuint program, const GLchar *name)\r\n\tvoid glUniform1uiEXT (GLint location, GLuint v0)\r\n\tvoid glUniform2uiEXT (GLint location, GLuint v0, GLuint v1)\r\n\tvoid glUniform3uiEXT (GLint location, GLuint v0, GLuint v1, GLuint v2)\r\n\tvoid glUniform4uiEXT (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)\r\n\tvoid glUniform1uivEXT (GLint location, GLsizei count, const GLuint *value)\r\n\tvoid glUniform2uivEXT (GLint location, GLsizei count, const GLuint *value)\r\n\tvoid glUniform3uivEXT (GLint location, GLsizei count, const GLuint *value)\r\n\tvoid glUniform4uivEXT (GLint location, GLsizei count, const GLuint *value)\r\n\tvoid glVertexAttribI1iEXT (GLuint index, GLint x)\r\n\tvoid glVertexAttribI2iEXT (GLuint index, GLint x, GLint y)\r\n\tvoid glVertexAttribI3iEXT (GLuint index, GLint x, GLint y, GLint z)\r\n\tvoid glVertexAttribI4iEXT (GLuint index, GLint x, GLint y, GLint z, GLint w)\r\n\tvoid glVertexAttribI1uiEXT (GLuint index, GLuint x)\r\n\tvoid glVertexAttribI2uiEXT (GLuint index, GLuint x, GLuint y)\r\n\tvoid glVertexAttribI3uiEXT (GLuint index, GLuint x, GLuint y, GLuint z)\r\n\tvoid glVertexAttribI4uiEXT (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)\r\n\tvoid glVertexAttribI1ivEXT (GLuint index, const GLint *v)\r\n\tvoid glVertexAttribI2ivEXT (GLuint index, const GLint *v)\r\n\tvoid glVertexAttribI3ivEXT (GLuint index, const GLint *v)\r\n\tvoid glVertexAttribI4ivEXT (GLuint index, const GLint *v)\r\n\tvoid glVertexAttribI1uivEXT (GLuint index, const GLuint *v)\r\n\tvoid glVertexAttribI2uivEXT (GLuint index, const GLuint *v)\r\n\tvoid glVertexAttribI3uivEXT (GLuint index, const GLuint *v)\r\n\tvoid glVertexAttribI4uivEXT (GLuint index, const GLuint *v)\r\n\tvoid glVertexAttribI4bvEXT (GLuint index, const GLbyte *v)\r\n\tvoid glVertexAttribI4svEXT (GLuint index, const GLshort *v)\r\n\tvoid glVertexAttribI4ubvEXT (GLuint index, const GLubyte *v)\r\n\tvoid glVertexAttribI4usvEXT (GLuint index, const GLushort *v)\r\n\tvoid glVertexAttribIPointerEXT (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)\r\n\tvoid glGetVertexAttribIivEXT (GLuint index, GLenum pname, GLint *params)\r\n\tvoid glGetVertexAttribIuivEXT (GLuint index, GLenum pname, GLuint *params)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_histogram",
    "content": "GL_EXT_histogram\r\nhttp://www.opengl.org/registry/specs/EXT/histogram.txt\r\n\tGL_HISTOGRAM_EXT 0x8024\r\n\tGL_PROXY_HISTOGRAM_EXT 0x8025\r\n\tGL_HISTOGRAM_WIDTH_EXT 0x8026\r\n\tGL_HISTOGRAM_FORMAT_EXT 0x8027\r\n\tGL_HISTOGRAM_RED_SIZE_EXT 0x8028\r\n\tGL_HISTOGRAM_GREEN_SIZE_EXT 0x8029\r\n\tGL_HISTOGRAM_BLUE_SIZE_EXT 0x802A\r\n\tGL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B\r\n\tGL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C\r\n\tGL_HISTOGRAM_SINK_EXT 0x802D\r\n\tGL_MINMAX_EXT 0x802E\r\n\tGL_MINMAX_FORMAT_EXT 0x802F\r\n\tGL_MINMAX_SINK_EXT 0x8030\r\n\tvoid glGetHistogramEXT (GLenum target, GLboolean reset, GLenum format, GLenum type, void* values)\r\n\tvoid glGetHistogramParameterfvEXT (GLenum target, GLenum pname, GLfloat* params)\r\n\tvoid glGetHistogramParameterivEXT (GLenum target, GLenum pname, GLint* params)\r\n\tvoid glGetMinmaxEXT (GLenum target, GLboolean reset, GLenum format, GLenum type, void* values)\r\n\tvoid glGetMinmaxParameterfvEXT (GLenum target, GLenum pname, GLfloat* params)\r\n\tvoid glGetMinmaxParameterivEXT (GLenum target, GLenum pname, GLint* params)\r\n\tvoid glHistogramEXT (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink)\r\n\tvoid glMinmaxEXT (GLenum target, GLenum internalformat, GLboolean sink)\r\n\tvoid glResetHistogramEXT (GLenum target)\r\n\tvoid glResetMinmaxEXT (GLenum target)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_index_array_formats",
    "content": "GL_EXT_index_array_formats\r\nhttp://www.opengl.org/registry/specs/EXT/index_array_formats.txt\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_index_func",
    "content": "GL_EXT_index_func\r\nhttp://www.opengl.org/registry/specs/EXT/index_func.txt\r\n\tvoid glIndexFuncEXT (GLenum func, GLfloat ref)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_index_material",
    "content": "GL_EXT_index_material\r\nhttp://www.opengl.org/registry/specs/EXT/index_material.txt\r\n\tvoid glIndexMaterialEXT (GLenum face, GLenum mode)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_index_texture",
    "content": "GL_EXT_index_texture\r\nhttp://www.opengl.org/registry/specs/EXT/index_texture.txt\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_light_texture",
    "content": "GL_EXT_light_texture\r\nhttp://www.opengl.org/registry/specs/EXT/light_texture.txt\r\n\tGL_FRAGMENT_MATERIAL_EXT 0x8349\r\n\tGL_FRAGMENT_NORMAL_EXT 0x834A\r\n\tGL_FRAGMENT_COLOR_EXT 0x834C\r\n\tGL_ATTENUATION_EXT 0x834D\r\n\tGL_SHADOW_ATTENUATION_EXT 0x834E\r\n\tGL_TEXTURE_APPLICATION_MODE_EXT 0x834F\r\n\tGL_TEXTURE_LIGHT_EXT 0x8350\r\n\tGL_TEXTURE_MATERIAL_FACE_EXT 0x8351\r\n\tGL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352\r\n\tGL_FRAGMENT_DEPTH_EXT 0x8452\r\n\tvoid glApplyTextureEXT (GLenum mode)\r\n\tvoid glTextureLightEXT (GLenum pname)\r\n\tvoid glTextureMaterialEXT (GLenum face, GLenum mode)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_misc_attribute",
    "content": "GL_EXT_misc_attribute\r\nhttp://www.opengl.org/registry/specs/EXT/misc_attribute.txt\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_multi_draw_arrays",
    "content": "GL_EXT_multi_draw_arrays\r\nhttp://www.opengl.org/registry/specs/EXT/multi_draw_arrays.txt\r\n\tvoid glMultiDrawArraysEXT (GLenum mode, GLint* first, GLsizei *count, GLsizei primcount)\r\n\tvoid glMultiDrawElementsEXT (GLenum mode, GLsizei* count, GLenum type, const GLvoid **indices, GLsizei primcount)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_multisample",
    "content": "GL_EXT_multisample\r\nhttp://www.opengl.org/registry/specs/EXT/wgl_multisample.txt\r\n\tGL_MULTISAMPLE_EXT 0x809D\r\n\tGL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E\r\n\tGL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F\r\n\tGL_SAMPLE_MASK_EXT 0x80A0\r\n\tGL_1PASS_EXT 0x80A1\r\n\tGL_2PASS_0_EXT 0x80A2\r\n\tGL_2PASS_1_EXT 0x80A3\r\n\tGL_4PASS_0_EXT 0x80A4\r\n\tGL_4PASS_1_EXT 0x80A5\r\n\tGL_4PASS_2_EXT 0x80A6\r\n\tGL_4PASS_3_EXT 0x80A7\r\n\tGL_SAMPLE_BUFFERS_EXT 0x80A8\r\n\tGL_SAMPLES_EXT 0x80A9\r\n\tGL_SAMPLE_MASK_VALUE_EXT 0x80AA\r\n\tGL_SAMPLE_MASK_INVERT_EXT 0x80AB\r\n\tGL_SAMPLE_PATTERN_EXT 0x80AC\r\n\tGL_MULTISAMPLE_BIT_EXT 0x20000000\r\n\tvoid glSampleMaskEXT (GLclampf value, GLboolean invert)\r\n\tvoid glSamplePatternEXT (GLenum pattern)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_packed_depth_stencil",
    "content": "GL_EXT_packed_depth_stencil\r\nhttp://www.opengl.org/registry/specs/EXT/packed_depth_stencil.txt\r\n\tGL_DEPTH_STENCIL_EXT 0x84F9\r\n\tGL_UNSIGNED_INT_24_8_EXT 0x84FA\r\n\tGL_DEPTH24_STENCIL8_EXT 0x88F0\r\n\tGL_TEXTURE_STENCIL_SIZE_EXT 0x88F1\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_packed_float",
    "content": "GL_EXT_packed_float\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_EXT_packed_float.txt\r\n\tGL_R11F_G11F_B10F_EXT 0x8C3A\r\n\tGL_UNSIGNED_INT_10F_11F_11F_REV_EXT 0x8C3B\r\n\tGL_RGBA_SIGNED_COMPONENTS_EXT 0x8C3C\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_packed_pixels",
    "content": "GL_EXT_packed_pixels\r\nhttp://www.opengl.org/registry/specs/EXT/packed_pixels.txt\r\n\tGL_UNSIGNED_BYTE_3_3_2_EXT 0x8032\r\n\tGL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033\r\n\tGL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034\r\n\tGL_UNSIGNED_INT_8_8_8_8_EXT 0x8035\r\n\tGL_UNSIGNED_INT_10_10_10_2_EXT 0x8036\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_paletted_texture",
    "content": "GL_EXT_paletted_texture\r\nhttp://www.opengl.org/registry/specs/EXT/paletted_texture.txt\r\n\tGL_TEXTURE_1D 0x0DE0\r\n\tGL_TEXTURE_2D 0x0DE1\r\n\tGL_PROXY_TEXTURE_1D 0x8063\r\n\tGL_PROXY_TEXTURE_2D 0x8064\r\n\tGL_TEXTURE_3D_EXT 0x806F\r\n\tGL_PROXY_TEXTURE_3D_EXT 0x8070\r\n\tGL_COLOR_TABLE_FORMAT_EXT 0x80D8\r\n\tGL_COLOR_TABLE_WIDTH_EXT 0x80D9\r\n\tGL_COLOR_TABLE_RED_SIZE_EXT 0x80DA\r\n\tGL_COLOR_TABLE_GREEN_SIZE_EXT 0x80DB\r\n\tGL_COLOR_TABLE_BLUE_SIZE_EXT 0x80DC\r\n\tGL_COLOR_TABLE_ALPHA_SIZE_EXT 0x80DD\r\n\tGL_COLOR_TABLE_LUMINANCE_SIZE_EXT 0x80DE\r\n\tGL_COLOR_TABLE_INTENSITY_SIZE_EXT 0x80DF\r\n\tGL_COLOR_INDEX1_EXT 0x80E2\r\n\tGL_COLOR_INDEX2_EXT 0x80E3\r\n\tGL_COLOR_INDEX4_EXT 0x80E4\r\n\tGL_COLOR_INDEX8_EXT 0x80E5\r\n\tGL_COLOR_INDEX12_EXT 0x80E6\r\n\tGL_COLOR_INDEX16_EXT 0x80E7\r\n\tGL_TEXTURE_INDEX_SIZE_EXT 0x80ED\r\n\tGL_TEXTURE_CUBE_MAP_ARB 0x8513\r\n\tGL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B\r\n\tvoid glColorTableEXT (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void* data)\r\n\tvoid glGetColorTableEXT (GLenum target, GLenum format, GLenum type, void* data)\r\n\tvoid glGetColorTableParameterfvEXT (GLenum target, GLenum pname, GLfloat* params)\r\n\tvoid glGetColorTableParameterivEXT (GLenum target, GLenum pname, GLint* params)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_pixel_buffer_object",
    "content": "GL_EXT_pixel_buffer_object\r\nhttp://www.nvidia.com/dev_content/nvopenglspecs/GL_EXT_pixel_buffer_object.txt\r\n\tGL_PIXEL_PACK_BUFFER_EXT 0x88EB\r\n\tGL_PIXEL_UNPACK_BUFFER_EXT 0x88EC\r\n\tGL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED\r\n\tGL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_pixel_transform",
    "content": "GL_EXT_pixel_transform\r\nhttp://www.opengl.org/registry/specs/EXT/pixel_transform.txt\r\n\tGL_PIXEL_TRANSFORM_2D_EXT 0x8330\r\n\tGL_PIXEL_MAG_FILTER_EXT 0x8331\r\n\tGL_PIXEL_MIN_FILTER_EXT 0x8332\r\n\tGL_PIXEL_CUBIC_WEIGHT_EXT 0x8333\r\n\tGL_CUBIC_EXT 0x8334\r\n\tGL_AVERAGE_EXT 0x8335\r\n\tGL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336\r\n\tGL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337\r\n\tGL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338\r\n\tvoid glGetPixelTransformParameterfvEXT (GLenum target, GLenum pname, const GLfloat* params)\r\n\tvoid glGetPixelTransformParameterivEXT (GLenum target, GLenum pname, const GLint* params)\r\n\tvoid glPixelTransformParameterfEXT (GLenum target, GLenum pname, const GLfloat param)\r\n\tvoid glPixelTransformParameterfvEXT (GLenum target, GLenum pname, const GLfloat* params)\r\n\tvoid glPixelTransformParameteriEXT (GLenum target, GLenum pname, const GLint param)\r\n\tvoid glPixelTransformParameterivEXT (GLenum target, GLenum pname, const GLint* params)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_pixel_transform_color_table",
    "content": "GL_EXT_pixel_transform_color_table\r\nhttp://www.opengl.org/registry/specs/EXT/pixel_transform_color_table.txt\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_point_parameters",
    "content": "GL_EXT_point_parameters\r\nhttp://www.opengl.org/registry/specs/EXT/point_parameters.txt\r\n\tGL_POINT_SIZE_MIN_EXT 0x8126\r\n\tGL_POINT_SIZE_MAX_EXT 0x8127\r\n\tGL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128\r\n\tGL_DISTANCE_ATTENUATION_EXT 0x8129\r\n\tvoid glPointParameterfEXT (GLenum pname, GLfloat param)\r\n\tvoid glPointParameterfvEXT (GLenum pname, GLfloat* params)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_polygon_offset",
    "content": "GL_EXT_polygon_offset\r\nhttp://www.opengl.org/registry/specs/EXT/polygon_offset.txt\r\n\tGL_POLYGON_OFFSET_EXT 0x8037\r\n\tGL_POLYGON_OFFSET_FACTOR_EXT 0x8038\r\n\tGL_POLYGON_OFFSET_BIAS_EXT 0x8039\r\n\tvoid glPolygonOffsetEXT (GLfloat factor, GLfloat bias)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_provoking_vertex",
    "content": "GL_EXT_provoking_vertex\r\nhttp://www.opengl.org/registry/specs/EXT/provoking_vertex.txt\r\n\tGL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT 0x8E4C\r\n\tGL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D\r\n\tGL_LAST_VERTEX_CONVENTION_EXT 0x8E4E\r\n\tGL_PROVOKING_VERTEX_EXT 0x8E4F\r\n\tvoid glProvokingVertexEXT (GLenum mode)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_rescale_normal",
    "content": "GL_EXT_rescale_normal\r\nhttp://www.opengl.org/registry/specs/EXT/rescale_normal.txt\r\n\tGL_RESCALE_NORMAL_EXT 0x803A\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_scene_marker",
    "content": "GL_EXT_scene_marker\r\nhttp://www.opengl.org/registry/specs/EXT/scene_marker.txt\r\n\tvoid glBeginSceneEXT (void)\r\n\tvoid glEndSceneEXT (void)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_secondary_color",
    "content": "GL_EXT_secondary_color\r\nhttp://oss.sgi.com/projects/ogl-sample/registry/EXT/secondary_color.txt\r\n\tGL_COLOR_SUM_EXT 0x8458\r\n\tGL_CURRENT_SECONDARY_COLOR_EXT 0x8459\r\n\tGL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A\r\n\tGL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B\r\n\tGL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C\r\n\tGL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D\r\n\tGL_SECONDARY_COLOR_ARRAY_EXT 0x845E\r\n\tvoid glSecondaryColor3bEXT (GLbyte red, GLbyte green, GLbyte blue)\r\n\tvoid glSecondaryColor3bvEXT (const GLbyte *v)\r\n\tvoid glSecondaryColor3dEXT (GLdouble red, GLdouble green, GLdouble blue)\r\n\tvoid glSecondaryColor3dvEXT (const GLdouble *v)\r\n\tvoid glSecondaryColor3fEXT (GLfloat red, GLfloat green, GLfloat blue)\r\n\tvoid glSecondaryColor3fvEXT (const GLfloat *v)\r\n\tvoid glSecondaryColor3iEXT (GLint red, GLint green, GLint blue)\r\n\tvoid glSecondaryColor3ivEXT (const GLint *v)\r\n\tvoid glSecondaryColor3sEXT (GLshort red, GLshort green, GLshort blue)\r\n\tvoid glSecondaryColor3svEXT (const GLshort *v)\r\n\tvoid glSecondaryColor3ubEXT (GLubyte red, GLubyte green, GLubyte blue)\r\n\tvoid glSecondaryColor3ubvEXT (const GLubyte *v)\r\n\tvoid glSecondaryColor3uiEXT (GLuint red, GLuint green, GLuint blue)\r\n\tvoid glSecondaryColor3uivEXT (const GLuint *v)\r\n\tvoid glSecondaryColor3usEXT (GLushort red, GLushort green, GLushort blue)\r\n\tvoid glSecondaryColor3usvEXT (const GLushort *v)\r\n\tvoid glSecondaryColorPointerEXT (GLint size, GLenum type, GLsizei stride, GLvoid *pointer)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_separate_shader_objects",
    "content": "GL_EXT_separate_shader_objects\r\nhttp://www.opengl.org/registry/specs/EXT/separate_shader_objects.txt\r\n\tGL_ACTIVE_PROGRAM_EXT 0x8B8D\r\n\tvoid glActiveProgramEXT (GLuint program)\r\n\tGLuint glCreateShaderProgramEXT (GLenum type, const char* string)\r\n\tvoid glUseShaderProgramEXT (GLenum type, GLuint program)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_separate_specular_color",
    "content": "GL_EXT_separate_specular_color\r\nhttp://www.opengl.org/registry/specs/EXT/separate_specular_color.txt\r\n\tGL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8\r\n\tGL_SINGLE_COLOR_EXT 0x81F9\r\n\tGL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_shadow_funcs",
    "content": "GL_EXT_shadow_funcs\r\nhttp://www.opengl.org/registry/specs/EXT/shadow_funcs.txt\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_shared_texture_palette",
    "content": "GL_EXT_shared_texture_palette\r\nhttp://www.opengl.org/registry/specs/EXT/shared_texture_palette.txt\r\n\tGL_SHARED_TEXTURE_PALETTE_EXT 0x81FB\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_stencil_clear_tag",
    "content": "GL_EXT_stencil_clear_tag\r\nhttp://www.opengl.org/registry/specs/EXT/stencil_clear_tag.txt\r\n\tGL_STENCIL_TAG_BITS_EXT 0x88F2\r\n\tGL_STENCIL_CLEAR_TAG_VALUE_EXT 0x88F3\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_stencil_two_side",
    "content": "GL_EXT_stencil_two_side\r\nhttp://www.opengl.org/registry/specs/EXT/stencil_two_side.txt\r\n\tGL_STENCIL_TEST_TWO_SIDE_EXT 0x8910\r\n\tGL_ACTIVE_STENCIL_FACE_EXT 0x8911\r\n\tvoid glActiveStencilFaceEXT (GLenum face)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_stencil_wrap",
    "content": "GL_EXT_stencil_wrap\r\nhttp://www.opengl.org/registry/specs/EXT/stencil_wrap.txt\r\n\tGL_INCR_WRAP_EXT 0x8507\r\n\tGL_DECR_WRAP_EXT 0x8508\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_subtexture",
    "content": "GL_EXT_subtexture\r\nhttp://www.opengl.org/registry/specs/EXT/subtexture.txt\r\n\tvoid glTexSubImage1DEXT (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void* pixels)\r\n\tvoid glTexSubImage2DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels)\r\n\tvoid glTexSubImage3DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_texture",
    "content": "GL_EXT_texture\r\nhttp://www.opengl.org/registry/specs/EXT/texture.txt\r\n\tGL_ALPHA4_EXT 0x803B\r\n\tGL_ALPHA8_EXT 0x803C\r\n\tGL_ALPHA12_EXT 0x803D\r\n\tGL_ALPHA16_EXT 0x803E\r\n\tGL_LUMINANCE4_EXT 0x803F\r\n\tGL_LUMINANCE8_EXT 0x8040\r\n\tGL_LUMINANCE12_EXT 0x8041\r\n\tGL_LUMINANCE16_EXT 0x8042\r\n\tGL_LUMINANCE4_ALPHA4_EXT 0x8043\r\n\tGL_LUMINANCE6_ALPHA2_EXT 0x8044\r\n\tGL_LUMINANCE8_ALPHA8_EXT 0x8045\r\n\tGL_LUMINANCE12_ALPHA4_EXT 0x8046\r\n\tGL_LUMINANCE12_ALPHA12_EXT 0x8047\r\n\tGL_LUMINANCE16_ALPHA16_EXT 0x8048\r\n\tGL_INTENSITY_EXT 0x8049\r\n\tGL_INTENSITY4_EXT 0x804A\r\n\tGL_INTENSITY8_EXT 0x804B\r\n\tGL_INTENSITY12_EXT 0x804C\r\n\tGL_INTENSITY16_EXT 0x804D\r\n\tGL_RGB2_EXT 0x804E\r\n\tGL_RGB4_EXT 0x804F\r\n\tGL_RGB5_EXT 0x8050\r\n\tGL_RGB8_EXT 0x8051\r\n\tGL_RGB10_EXT 0x8052\r\n\tGL_RGB12_EXT 0x8053\r\n\tGL_RGB16_EXT 0x8054\r\n\tGL_RGBA2_EXT 0x8055\r\n\tGL_RGBA4_EXT 0x8056\r\n\tGL_RGB5_A1_EXT 0x8057\r\n\tGL_RGBA8_EXT 0x8058\r\n\tGL_RGB10_A2_EXT 0x8059\r\n\tGL_RGBA12_EXT 0x805A\r\n\tGL_RGBA16_EXT 0x805B\r\n\tGL_TEXTURE_RED_SIZE_EXT 0x805C\r\n\tGL_TEXTURE_GREEN_SIZE_EXT 0x805D\r\n\tGL_TEXTURE_BLUE_SIZE_EXT 0x805E\r\n\tGL_TEXTURE_ALPHA_SIZE_EXT 0x805F\r\n\tGL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060\r\n\tGL_TEXTURE_INTENSITY_SIZE_EXT 0x8061\r\n\tGL_REPLACE_EXT 0x8062\r\n\tGL_PROXY_TEXTURE_1D_EXT 0x8063\r\n\tGL_PROXY_TEXTURE_2D_EXT 0x8064\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_texture3D",
    "content": "GL_EXT_texture3D\r\nhttp://www.opengl.org/registry/specs/EXT/texture3D.txt\r\n\tGL_PACK_SKIP_IMAGES_EXT 0x806B\r\n\tGL_PACK_IMAGE_HEIGHT_EXT 0x806C\r\n\tGL_UNPACK_SKIP_IMAGES_EXT 0x806D\r\n\tGL_UNPACK_IMAGE_HEIGHT_EXT 0x806E\r\n\tGL_TEXTURE_3D_EXT 0x806F\r\n\tGL_PROXY_TEXTURE_3D_EXT 0x8070\r\n\tGL_TEXTURE_DEPTH_EXT 0x8071\r\n\tGL_TEXTURE_WRAP_R_EXT 0x8072\r\n\tGL_MAX_3D_TEXTURE_SIZE_EXT 0x8073\r\n\tvoid glTexImage3DEXT (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_texture_array",
    "content": "GL_EXT_texture_array\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_EXT_texture_array.txt\r\n\tGL_TEXTURE_1D_ARRAY_EXT 0x8C18\r\n\tGL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19\r\n\tGL_TEXTURE_2D_ARRAY_EXT 0x8C1A\r\n\tGL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B\r\n\tGL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C\r\n\tGL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D\r\n\tGL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF\r\n\tGL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_texture_buffer_object",
    "content": "GL_EXT_texture_buffer_object\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_EXT_texture_buffer_object.txt\r\n\tGL_TEXTURE_BUFFER_EXT 0x8C2A\r\n\tGL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B\r\n\tGL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C\r\n\tGL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D\r\n\tGL_TEXTURE_BUFFER_FORMAT_EXT 0x8C2E\r\n\tvoid glTexBufferEXT (GLenum target, GLenum internalformat, GLuint buffer)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_texture_compression_dxt1",
    "content": "GL_EXT_texture_compression_dxt1\r\nhttp://www.opengl.org/registry/specs/EXT/texture_compression_dxt1.txt\r\n\tGL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0\r\n\tGL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_texture_compression_latc",
    "content": "GL_EXT_texture_compression_latc\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_EXT_texture_compression_latc.txt\r\n\tGL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70\r\n\tGL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT 0x8C71\r\n\tGL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72\r\n\tGL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT 0x8C73\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_texture_compression_rgtc",
    "content": "GL_EXT_texture_compression_rgtc\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_EXT_texture_compression_rgtc.txt\r\n\tGL_COMPRESSED_RED_RGTC1_EXT 0x8DBB\r\n\tGL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC\r\n\tGL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD\r\n\tGL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_texture_compression_s3tc",
    "content": "GL_EXT_texture_compression_s3tc\r\nhttp://www.opengl.org/registry/specs/EXT/texture_compression_s3tc.txt\r\n\tGL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0\r\n\tGL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1\r\n\tGL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2\r\n\tGL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_texture_cube_map",
    "content": "GL_EXT_texture_cube_map\r\nhttp://www.nvidia.com/dev_content/nvopenglspecs/GL_EXT_texture_cube_map.txt\r\n\tGL_NORMAL_MAP_EXT 0x8511\r\n\tGL_REFLECTION_MAP_EXT 0x8512\r\n\tGL_TEXTURE_CUBE_MAP_EXT 0x8513\r\n\tGL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514\r\n\tGL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515\r\n\tGL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516\r\n\tGL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517\r\n\tGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518\r\n\tGL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519\r\n\tGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A\r\n\tGL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B\r\n\tGL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_texture_edge_clamp",
    "content": "GL_EXT_texture_edge_clamp\r\nhttp://www.opengl.org/developers/documentation/Version1.2/1.2specs/texture_edge_clamp.txt\r\n\tGL_CLAMP_TO_EDGE_EXT\t0x812F\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_texture_env",
    "content": "GL_EXT_texture_env\r\nhttp://www.opengl.org/registry/specs/EXT/texture_env.txt\r\n\tGL_TEXTURE_ENV0_EXT 0\r\n\tGL_TEXTURE_ENV_SHIFT_EXT 0\r\n\tGL_ENV_BLEND_EXT 0\r\n\tGL_ENV_ADD_EXT 0\r\n\tGL_ENV_REPLACE_EXT 0\r\n\tGL_ENV_SUBTRACT_EXT 0\r\n\tGL_TEXTURE_ENV_MODE_ALPHA_EXT 0\r\n\tGL_ENV_REVERSE_BLEND_EXT 0\r\n\tGL_ENV_REVERSE_SUBTRACT_EXT 0\r\n\tGL_ENV_COPY_EXT 0\r\n\tGL_ENV_MODULATE_EXT 0\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_texture_env_add",
    "content": "GL_EXT_texture_env_add\r\nhttp://www.opengl.org/registry/specs/EXT/texture_env_add.txt\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_texture_env_combine",
    "content": "GL_EXT_texture_env_combine\r\nhttp://www.opengl.org/registry/specs/EXT/texture_env_combine.txt\r\n\tGL_COMBINE_EXT 0x8570\r\n\tGL_COMBINE_RGB_EXT 0x8571\r\n\tGL_COMBINE_ALPHA_EXT 0x8572\r\n\tGL_RGB_SCALE_EXT 0x8573\r\n\tGL_ADD_SIGNED_EXT 0x8574\r\n\tGL_INTERPOLATE_EXT 0x8575\r\n\tGL_CONSTANT_EXT 0x8576\r\n\tGL_PRIMARY_COLOR_EXT 0x8577\r\n\tGL_PREVIOUS_EXT 0x8578\r\n\tGL_SOURCE0_RGB_EXT 0x8580\r\n\tGL_SOURCE1_RGB_EXT 0x8581\r\n\tGL_SOURCE2_RGB_EXT 0x8582\r\n\tGL_SOURCE0_ALPHA_EXT 0x8588\r\n\tGL_SOURCE1_ALPHA_EXT 0x8589\r\n\tGL_SOURCE2_ALPHA_EXT 0x858A\r\n\tGL_OPERAND0_RGB_EXT 0x8590\r\n\tGL_OPERAND1_RGB_EXT 0x8591\r\n\tGL_OPERAND2_RGB_EXT 0x8592\r\n\tGL_OPERAND0_ALPHA_EXT 0x8598\r\n\tGL_OPERAND1_ALPHA_EXT 0x8599\r\n\tGL_OPERAND2_ALPHA_EXT 0x859A\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_texture_env_dot3",
    "content": "GL_EXT_texture_env_dot3\r\nhttp://www.opengl.org/registry/specs/EXT/texture_env_dot3.txt\r\n\tGL_DOT3_RGB_EXT 0x8740\r\n\tGL_DOT3_RGBA_EXT 0x8741\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_texture_filter_anisotropic",
    "content": "GL_EXT_texture_filter_anisotropic\r\nhttp://www.opengl.org/registry/specs/EXT/texture_filter_anisotropic.txt\r\n\tGL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE\r\n\tGL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_texture_integer",
    "content": "GL_EXT_texture_integer\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_EXT_texture_integer.txt\r\n\tGL_RGBA32UI_EXT 0x8D70\r\n\tGL_RGB32UI_EXT 0x8D71\r\n\tGL_ALPHA32UI_EXT 0x8D72\r\n\tGL_INTENSITY32UI_EXT 0x8D73\r\n\tGL_LUMINANCE32UI_EXT 0x8D74\r\n\tGL_LUMINANCE_ALPHA32UI_EXT 0x8D75\r\n\tGL_RGBA16UI_EXT 0x8D76\r\n\tGL_RGB16UI_EXT 0x8D77\r\n\tGL_ALPHA16UI_EXT 0x8D78\r\n\tGL_INTENSITY16UI_EXT 0x8D79\r\n\tGL_LUMINANCE16UI_EXT 0x8D7A\r\n\tGL_LUMINANCE_ALPHA16UI_EXT 0x8D7B\r\n\tGL_RGBA8UI_EXT 0x8D7C\r\n\tGL_RGB8UI_EXT 0x8D7D\r\n\tGL_ALPHA8UI_EXT 0x8D7E\r\n\tGL_INTENSITY8UI_EXT 0x8D7F\r\n\tGL_LUMINANCE8UI_EXT 0x8D80\r\n\tGL_LUMINANCE_ALPHA8UI_EXT 0x8D81\r\n\tGL_RGBA32I_EXT 0x8D82\r\n\tGL_RGB32I_EXT 0x8D83\r\n\tGL_ALPHA32I_EXT 0x8D84\r\n\tGL_INTENSITY32I_EXT 0x8D85\r\n\tGL_LUMINANCE32I_EXT 0x8D86\r\n\tGL_LUMINANCE_ALPHA32I_EXT 0x8D87\r\n\tGL_RGBA16I_EXT 0x8D88\r\n\tGL_RGB16I_EXT 0x8D89\r\n\tGL_ALPHA16I_EXT 0x8D8A\r\n\tGL_INTENSITY16I_EXT 0x8D8B\r\n\tGL_LUMINANCE16I_EXT 0x8D8C\r\n\tGL_LUMINANCE_ALPHA16I_EXT 0x8D8D\r\n\tGL_RGBA8I_EXT 0x8D8E\r\n\tGL_RGB8I_EXT 0x8D8F\r\n\tGL_ALPHA8I_EXT 0x8D90\r\n\tGL_INTENSITY8I_EXT 0x8D91\r\n\tGL_LUMINANCE8I_EXT 0x8D92\r\n\tGL_LUMINANCE_ALPHA8I_EXT 0x8D93\r\n\tGL_RED_INTEGER_EXT 0x8D94\r\n\tGL_GREEN_INTEGER_EXT 0x8D95\r\n\tGL_BLUE_INTEGER_EXT 0x8D96\r\n\tGL_ALPHA_INTEGER_EXT 0x8D97\r\n\tGL_RGB_INTEGER_EXT 0x8D98\r\n\tGL_RGBA_INTEGER_EXT 0x8D99\r\n\tGL_BGR_INTEGER_EXT 0x8D9A\r\n\tGL_BGRA_INTEGER_EXT 0x8D9B\r\n\tGL_LUMINANCE_INTEGER_EXT 0x8D9C\r\n\tGL_LUMINANCE_ALPHA_INTEGER_EXT 0x8D9D\r\n\tGL_RGBA_INTEGER_MODE_EXT 0x8D9E\r\n\tvoid glTexParameterIivEXT (GLenum target, GLenum pname, const GLint *params)\r\n\tvoid glTexParameterIuivEXT (GLenum target, GLenum pname, const GLuint *params)\r\n\tvoid glGetTexParameterIivEXT (GLenum target, GLenum pname, GLint *params)\r\n\tvoid glGetTexParameterIuivEXT (GLenum target, GLenum pname, GLuint *params)\r\n\tvoid glClearColorIiEXT (GLint red, GLint green, GLint blue, GLint alpha)\r\n\tvoid glClearColorIuiEXT (GLuint red, GLuint green, GLuint blue, GLuint alpha)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_texture_lod_bias",
    "content": "GL_EXT_texture_lod_bias\r\nhttp://www.opengl.org/registry/specs/EXT/texture_lod_bias.txt\r\n\tGL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD\r\n\tGL_TEXTURE_FILTER_CONTROL_EXT 0x8500\r\n\tGL_TEXTURE_LOD_BIAS_EXT 0x8501\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_texture_mirror_clamp",
    "content": "GL_EXT_texture_mirror_clamp\r\nhttp://www.opengl.org/registry/specs/EXT/texture_mirror_clamp.txt\r\n\tGL_MIRROR_CLAMP_EXT 0x8742\r\n\tGL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743\r\n\tGL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_texture_object",
    "content": "GL_EXT_texture_object\r\nhttp://www.opengl.org/registry/specs/EXT/texture_object.txt\r\n\tGL_TEXTURE_PRIORITY_EXT 0x8066\r\n\tGL_TEXTURE_RESIDENT_EXT 0x8067\r\n\tGL_TEXTURE_1D_BINDING_EXT 0x8068\r\n\tGL_TEXTURE_2D_BINDING_EXT 0x8069\r\n\tGL_TEXTURE_3D_BINDING_EXT 0x806A\r\n\tGLboolean glAreTexturesResidentEXT (GLsizei n, const GLuint* textures, GLboolean* residences)\r\n\tvoid glBindTextureEXT (GLenum target, GLuint texture)\r\n\tvoid glDeleteTexturesEXT (GLsizei n, const GLuint* textures)\r\n\tvoid glGenTexturesEXT (GLsizei n, GLuint* textures)\r\n\tGLboolean glIsTextureEXT (GLuint texture)\r\n\tvoid glPrioritizeTexturesEXT (GLsizei n, const GLuint* textures, const GLclampf* priorities)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_texture_perturb_normal",
    "content": "GL_EXT_texture_perturb_normal\r\nhttp://www.opengl.org/registry/specs/EXT/texture_perturb_normal.txt\r\n\tGL_PERTURB_EXT 0x85AE\r\n\tGL_TEXTURE_NORMAL_EXT 0x85AF\r\n\tvoid glTextureNormalEXT (GLenum mode)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_texture_rectangle",
    "content": "GL_EXT_texture_rectangle\r\nhttp://developer.apple.com/opengl/extensions/ext_texture_rectangle.html\r\n\tGL_TEXTURE_RECTANGLE_EXT 0x84F5\r\n\tGL_TEXTURE_BINDING_RECTANGLE_EXT 0x84F6\r\n\tGL_PROXY_TEXTURE_RECTANGLE_EXT 0x84F7\r\n\tGL_MAX_RECTANGLE_TEXTURE_SIZE_EXT 0x84F8\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_texture_sRGB",
    "content": "GL_EXT_texture_sRGB\r\nhttp://www.opengl.org/registry/specs/EXT/texture_sRGB.txt\r\n\tGL_SRGB_EXT 0x8C40\r\n\tGL_SRGB8_EXT 0x8C41\r\n\tGL_SRGB_ALPHA_EXT 0x8C42\r\n\tGL_SRGB8_ALPHA8_EXT 0x8C43\r\n\tGL_SLUMINANCE_ALPHA_EXT 0x8C44\r\n\tGL_SLUMINANCE8_ALPHA8_EXT 0x8C45\r\n\tGL_SLUMINANCE_EXT 0x8C46\r\n\tGL_SLUMINANCE8_EXT 0x8C47\r\n\tGL_COMPRESSED_SRGB_EXT 0x8C48\r\n\tGL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49\r\n\tGL_COMPRESSED_SLUMINANCE_EXT 0x8C4A\r\n\tGL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B\r\n\tGL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C\r\n\tGL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D\r\n\tGL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E\r\n\tGL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_texture_shared_exponent",
    "content": "GL_EXT_texture_shared_exponent\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_EXT_texture_shared_exponent.txt\r\n\tGL_RGB9_E5_EXT 0x8C3D\r\n\tGL_UNSIGNED_INT_5_9_9_9_REV_EXT 0x8C3E\r\n\tGL_TEXTURE_SHARED_SIZE_EXT 0x8C3F\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_texture_snorm",
    "content": "GL_EXT_texture_snorm\r\nhttp://www.opengl.org/registry/specs/EXT/texture_snorm.txt\r\n\tGL_RED_SNORM 0x8F90\r\n\tGL_RG_SNORM 0x8F91\r\n\tGL_RGB_SNORM 0x8F92\r\n\tGL_RGBA_SNORM 0x8F93\r\n\tGL_R8_SNORM 0x8F94\r\n\tGL_RG8_SNORM 0x8F95\r\n\tGL_RGB8_SNORM 0x8F96\r\n\tGL_RGBA8_SNORM 0x8F97\r\n\tGL_R16_SNORM 0x8F98\r\n\tGL_RG16_SNORM 0x8F99\r\n\tGL_RGB16_SNORM 0x8F9A\r\n\tGL_RGBA16_SNORM 0x8F9B\r\n\tGL_SIGNED_NORMALIZED 0x8F9C\r\n\tGL_ALPHA_SNORM 0x9010\r\n\tGL_LUMINANCE_SNORM 0x9011\r\n\tGL_LUMINANCE_ALPHA_SNORM 0x9012\r\n\tGL_INTENSITY_SNORM 0x9013\r\n\tGL_ALPHA8_SNORM 0x9014\r\n\tGL_LUMINANCE8_SNORM 0x9015\r\n\tGL_LUMINANCE8_ALPHA8_SNORM 0x9016\r\n\tGL_INTENSITY8_SNORM 0x9017\r\n\tGL_ALPHA16_SNORM 0x9018\r\n\tGL_LUMINANCE16_SNORM 0x9019\r\n\tGL_LUMINANCE16_ALPHA16_SNORM 0x901A\r\n\tGL_INTENSITY16_SNORM 0x901B\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_texture_swizzle",
    "content": "GL_EXT_texture_swizzle\r\nhttp://www.opengl.org/registry/specs/EXT/texture_swizzle.txt\r\n\tGL_TEXTURE_SWIZZLE_R_EXT 0x8E42\r\n\tGL_TEXTURE_SWIZZLE_G_EXT 0x8E43\r\n\tGL_TEXTURE_SWIZZLE_B_EXT 0x8E44\r\n\tGL_TEXTURE_SWIZZLE_A_EXT 0x8E45\r\n\tGL_TEXTURE_SWIZZLE_RGBA_EXT 0x8E46\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_timer_query",
    "content": "GL_EXT_timer_query\r\nhttp://www.nvidia.com/dev_content/nvopenglspecs/GL_EXT_timer_query.txt\r\n\tGL_TIME_ELAPSED_EXT 0x88BF\r\n\tvoid glGetQueryObjecti64vEXT (GLuint id, GLenum pname, GLint64EXT *params)\r\n\tvoid glGetQueryObjectui64vEXT (GLuint id, GLenum pname, GLuint64EXT *params)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_transform_feedback",
    "content": "GL_EXT_transform_feedback\r\nhttp://www.opengl.org/registry/specs/EXT/transform_feedback.txt\r\n\tGL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT 0x8C76\r\n\tGL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT 0x8C7F\r\n\tGL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT 0x8C80\r\n\tGL_TRANSFORM_FEEDBACK_VARYINGS_EXT 0x8C83\r\n\tGL_TRANSFORM_FEEDBACK_BUFFER_START_EXT 0x8C84\r\n\tGL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT 0x8C85\r\n\tGL_PRIMITIVES_GENERATED_EXT 0x8C87\r\n\tGL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT 0x8C88\r\n\tGL_RASTERIZER_DISCARD_EXT 0x8C89\r\n\tGL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT 0x8C8A\r\n\tGL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT 0x8C8B\r\n\tGL_INTERLEAVED_ATTRIBS_EXT 0x8C8C\r\n\tGL_SEPARATE_ATTRIBS_EXT 0x8C8D\r\n\tGL_TRANSFORM_FEEDBACK_BUFFER_EXT 0x8C8E\r\n\tGL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT 0x8C8F\r\n\tvoid glBeginTransformFeedbackEXT (GLenum primitiveMode)\r\n\tvoid glBindBufferBaseEXT (GLenum target, GLuint index, GLuint buffer)\r\n\tvoid glBindBufferOffsetEXT (GLenum target, GLuint index, GLuint buffer, GLintptr offset)\r\n\tvoid glBindBufferRangeEXT (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)\r\n\tvoid glEndTransformFeedbackEXT (void)\r\n\tvoid glGetTransformFeedbackVaryingEXT (GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei *size, GLenum *type, char *name)\r\n\tvoid glTransformFeedbackVaryingsEXT (GLuint program, GLsizei count, const char ** varyings, GLenum bufferMode)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_vertex_array",
    "content": "GL_EXT_vertex_array\r\nhttp://www.opengl.org/registry/specs/EXT/vertex_array.txt\r\n\tGL_DOUBLE_EXT 0x140A\r\n\tGL_VERTEX_ARRAY_EXT 0x8074\r\n\tGL_NORMAL_ARRAY_EXT 0x8075\r\n\tGL_COLOR_ARRAY_EXT 0x8076\r\n\tGL_INDEX_ARRAY_EXT 0x8077\r\n\tGL_TEXTURE_COORD_ARRAY_EXT 0x8078\r\n\tGL_EDGE_FLAG_ARRAY_EXT 0x8079\r\n\tGL_VERTEX_ARRAY_SIZE_EXT 0x807A\r\n\tGL_VERTEX_ARRAY_TYPE_EXT 0x807B\r\n\tGL_VERTEX_ARRAY_STRIDE_EXT 0x807C\r\n\tGL_VERTEX_ARRAY_COUNT_EXT 0x807D\r\n\tGL_NORMAL_ARRAY_TYPE_EXT 0x807E\r\n\tGL_NORMAL_ARRAY_STRIDE_EXT 0x807F\r\n\tGL_NORMAL_ARRAY_COUNT_EXT 0x8080\r\n\tGL_COLOR_ARRAY_SIZE_EXT 0x8081\r\n\tGL_COLOR_ARRAY_TYPE_EXT 0x8082\r\n\tGL_COLOR_ARRAY_STRIDE_EXT 0x8083\r\n\tGL_COLOR_ARRAY_COUNT_EXT 0x8084\r\n\tGL_INDEX_ARRAY_TYPE_EXT 0x8085\r\n\tGL_INDEX_ARRAY_STRIDE_EXT 0x8086\r\n\tGL_INDEX_ARRAY_COUNT_EXT 0x8087\r\n\tGL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088\r\n\tGL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089\r\n\tGL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A\r\n\tGL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B\r\n\tGL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C\r\n\tGL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D\r\n\tGL_VERTEX_ARRAY_POINTER_EXT 0x808E\r\n\tGL_NORMAL_ARRAY_POINTER_EXT 0x808F\r\n\tGL_COLOR_ARRAY_POINTER_EXT 0x8090\r\n\tGL_INDEX_ARRAY_POINTER_EXT 0x8091\r\n\tGL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092\r\n\tGL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093\r\n\tvoid glArrayElementEXT (GLint i)\r\n\tvoid glColorPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const void* pointer)\r\n\tvoid glDrawArraysEXT (GLenum mode, GLint first, GLsizei count)\r\n\tvoid glEdgeFlagPointerEXT (GLsizei stride, GLsizei count, const GLboolean* pointer)\r\n\tvoid glGetPointervEXT (GLenum pname, void** params)\r\n\tvoid glIndexPointerEXT (GLenum type, GLsizei stride, GLsizei count, const void* pointer)\r\n\tvoid glNormalPointerEXT (GLenum type, GLsizei stride, GLsizei count, const void* pointer)\r\n\tvoid glTexCoordPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const void* pointer)\r\n\tvoid glVertexPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const void* pointer)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_vertex_array_bgra",
    "content": "GL_EXT_vertex_array_bgra\r\nhttp://www.opengl.org/registry/specs/EXT/vertex_array_bgra.txt\r\n\tGL_BGRA 0x80E1\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_vertex_shader",
    "content": "GL_EXT_vertex_shader\r\nhttp://oss.sgi.com/projects/ogl-sample/registry/EXT/vertex_shader.txt\r\n\tGL_VERTEX_SHADER_EXT 0x8780\r\n\tGL_VERTEX_SHADER_BINDING_EXT 0x8781\r\n\tGL_OP_INDEX_EXT 0x8782\r\n\tGL_OP_NEGATE_EXT 0x8783\r\n\tGL_OP_DOT3_EXT 0x8784\r\n\tGL_OP_DOT4_EXT 0x8785\r\n\tGL_OP_MUL_EXT 0x8786\r\n\tGL_OP_ADD_EXT 0x8787\r\n\tGL_OP_MADD_EXT 0x8788\r\n\tGL_OP_FRAC_EXT 0x8789\r\n\tGL_OP_MAX_EXT 0x878A\r\n\tGL_OP_MIN_EXT 0x878B\r\n\tGL_OP_SET_GE_EXT 0x878C\r\n\tGL_OP_SET_LT_EXT 0x878D\r\n\tGL_OP_CLAMP_EXT 0x878E\r\n\tGL_OP_FLOOR_EXT 0x878F\r\n\tGL_OP_ROUND_EXT 0x8790\r\n\tGL_OP_EXP_BASE_2_EXT 0x8791\r\n\tGL_OP_LOG_BASE_2_EXT 0x8792\r\n\tGL_OP_POWER_EXT 0x8793\r\n\tGL_OP_RECIP_EXT 0x8794\r\n\tGL_OP_RECIP_SQRT_EXT 0x8795\r\n\tGL_OP_SUB_EXT 0x8796\r\n\tGL_OP_CROSS_PRODUCT_EXT 0x8797\r\n\tGL_OP_MULTIPLY_MATRIX_EXT 0x8798\r\n\tGL_OP_MOV_EXT 0x8799\r\n\tGL_OUTPUT_VERTEX_EXT 0x879A\r\n\tGL_OUTPUT_COLOR0_EXT 0x879B\r\n\tGL_OUTPUT_COLOR1_EXT 0x879C\r\n\tGL_OUTPUT_TEXTURE_COORD0_EXT 0x879D\r\n\tGL_OUTPUT_TEXTURE_COORD1_EXT 0x879E\r\n\tGL_OUTPUT_TEXTURE_COORD2_EXT 0x879F\r\n\tGL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0\r\n\tGL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1\r\n\tGL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2\r\n\tGL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3\r\n\tGL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4\r\n\tGL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5\r\n\tGL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6\r\n\tGL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7\r\n\tGL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8\r\n\tGL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9\r\n\tGL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA\r\n\tGL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB\r\n\tGL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC\r\n\tGL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD\r\n\tGL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE\r\n\tGL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF\r\n\tGL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0\r\n\tGL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1\r\n\tGL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2\r\n\tGL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3\r\n\tGL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4\r\n\tGL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5\r\n\tGL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6\r\n\tGL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7\r\n\tGL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8\r\n\tGL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9\r\n\tGL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA\r\n\tGL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB\r\n\tGL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC\r\n\tGL_OUTPUT_FOG_EXT 0x87BD\r\n\tGL_SCALAR_EXT 0x87BE\r\n\tGL_VECTOR_EXT 0x87BF\r\n\tGL_MATRIX_EXT 0x87C0\r\n\tGL_VARIANT_EXT 0x87C1\r\n\tGL_INVARIANT_EXT 0x87C2\r\n\tGL_LOCAL_CONSTANT_EXT 0x87C3\r\n\tGL_LOCAL_EXT 0x87C4\r\n\tGL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5\r\n\tGL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6\r\n\tGL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7\r\n\tGL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8\r\n\tGL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9\r\n\tGL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA\r\n\tGL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB\r\n\tGL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CC\r\n\tGL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CD\r\n\tGL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE\r\n\tGL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF\r\n\tGL_VERTEX_SHADER_VARIANTS_EXT 0x87D0\r\n\tGL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1\r\n\tGL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2\r\n\tGL_VERTEX_SHADER_LOCALS_EXT 0x87D3\r\n\tGL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4\r\n\tGL_X_EXT 0x87D5\r\n\tGL_Y_EXT 0x87D6\r\n\tGL_Z_EXT 0x87D7\r\n\tGL_W_EXT 0x87D8\r\n\tGL_NEGATIVE_X_EXT 0x87D9\r\n\tGL_NEGATIVE_Y_EXT 0x87DA\r\n\tGL_NEGATIVE_Z_EXT 0x87DB\r\n\tGL_NEGATIVE_W_EXT 0x87DC\r\n\tGL_ZERO_EXT 0x87DD\r\n\tGL_ONE_EXT 0x87DE\r\n\tGL_NEGATIVE_ONE_EXT 0x87DF\r\n\tGL_NORMALIZED_RANGE_EXT 0x87E0\r\n\tGL_FULL_RANGE_EXT 0x87E1\r\n\tGL_CURRENT_VERTEX_EXT 0x87E2\r\n\tGL_MVP_MATRIX_EXT 0x87E3\r\n\tGL_VARIANT_VALUE_EXT 0x87E4\r\n\tGL_VARIANT_DATATYPE_EXT 0x87E5\r\n\tGL_VARIANT_ARRAY_STRIDE_EXT 0x87E6\r\n\tGL_VARIANT_ARRAY_TYPE_EXT 0x87E7\r\n\tGL_VARIANT_ARRAY_EXT 0x87E8\r\n\tGL_VARIANT_ARRAY_POINTER_EXT 0x87E9\r\n\tGL_INVARIANT_VALUE_EXT 0x87EA\r\n\tGL_INVARIANT_DATATYPE_EXT 0x87EB\r\n\tGL_LOCAL_CONSTANT_VALUE_EXT 0x87EC\r\n\tGL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED\r\n\r\n\tvoid glBeginVertexShaderEXT (void)\r\n\tvoid glEndVertexShaderEXT (void)\r\n\tvoid glBindVertexShaderEXT (GLuint id)\r\n\tGLuint glGenVertexShadersEXT (GLuint range)\r\n\tvoid glDeleteVertexShaderEXT (GLuint id)\r\n\tvoid glShaderOp1EXT (GLenum op, GLuint res, GLuint arg1)\r\n\tvoid glShaderOp2EXT (GLenum op, GLuint res, GLuint arg1, GLuint arg2)\r\n\tvoid glShaderOp3EXT (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3)\r\n\tvoid glSwizzleEXT (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW)\r\n\tvoid glWriteMaskEXT (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW)\r\n\tvoid glInsertComponentEXT (GLuint res, GLuint src, GLuint num)\r\n\tvoid glExtractComponentEXT (GLuint res, GLuint src, GLuint num)\r\n\tGLuint glGenSymbolsEXT (GLenum dataType, GLenum storageType, GLenum range, GLuint components)\r\n\tvoid glSetInvariantEXT (GLuint id, GLenum type, GLvoid *addr)\r\n\tvoid glSetLocalConstantEXT (GLuint id, GLenum type, GLvoid *addr)\r\n\tvoid glVariantbvEXT (GLuint id, GLbyte *addr)\r\n\tvoid glVariantsvEXT (GLuint id, GLshort *addr)\r\n\tvoid glVariantivEXT (GLuint id, GLint *addr)\r\n\tvoid glVariantfvEXT (GLuint id, GLfloat *addr)\r\n\tvoid glVariantdvEXT (GLuint id, GLdouble *addr)\r\n\tvoid glVariantubvEXT (GLuint id, GLubyte *addr)\r\n\tvoid glVariantusvEXT (GLuint id, GLushort *addr)\r\n\tvoid glVariantuivEXT (GLuint id, GLuint *addr)\r\n\tvoid glVariantPointerEXT (GLuint id, GLenum type, GLuint stride, GLvoid *addr)\r\n\tvoid glEnableVariantClientStateEXT (GLuint id)\r\n\tvoid glDisableVariantClientStateEXT (GLuint id)\r\n\tGLuint glBindLightParameterEXT (GLenum light, GLenum value)\r\n\tGLuint glBindMaterialParameterEXT (GLenum face, GLenum value)\r\n\tGLuint glBindTexGenParameterEXT (GLenum unit, GLenum coord, GLenum value)\r\n\tGLuint glBindTextureUnitParameterEXT (GLenum unit, GLenum value)\r\n\tGLuint glBindParameterEXT (GLenum value)\r\n\tGLboolean glIsVariantEnabledEXT (GLuint id, GLenum cap)\r\n\tvoid glGetVariantBooleanvEXT (GLuint id, GLenum value, GLboolean *data)\r\n\tvoid glGetVariantIntegervEXT (GLuint id, GLenum value, GLint *data)\r\n\tvoid glGetVariantFloatvEXT (GLuint id, GLenum value, GLfloat *data)\r\n\tvoid glGetVariantPointervEXT (GLuint id, GLenum value, GLvoid **data)\r\n\tvoid glGetInvariantBooleanvEXT (GLuint id, GLenum value, GLboolean *data)\r\n\tvoid glGetInvariantIntegervEXT (GLuint id, GLenum value, GLint *data)\r\n\tvoid glGetInvariantFloatvEXT (GLuint id, GLenum value, GLfloat *data)\r\n\tvoid glGetLocalConstantBooleanvEXT (GLuint id, GLenum value, GLboolean *data)\r\n\tvoid glGetLocalConstantIntegervEXT (GLuint id, GLenum value, GLint *data)\r\n\tvoid glGetLocalConstantFloatvEXT (GLuint id, GLenum value, GLfloat *data)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_EXT_vertex_weighting",
    "content": "GL_EXT_vertex_weighting\r\nhttp://www.opengl.org/registry/specs/EXT/vertex_weighting.txt\r\n\tGL_MODELVIEW0_STACK_DEPTH_EXT 0x0BA3\r\n\tGL_MODELVIEW0_MATRIX_EXT 0x0BA6\r\n\tGL_MODELVIEW0_EXT 0x1700\r\n\tGL_MODELVIEW1_STACK_DEPTH_EXT 0x8502\r\n\tGL_MODELVIEW1_MATRIX_EXT 0x8506\r\n\tGL_VERTEX_WEIGHTING_EXT 0x8509\r\n\tGL_MODELVIEW1_EXT 0x850A\r\n\tGL_CURRENT_VERTEX_WEIGHT_EXT 0x850B\r\n\tGL_VERTEX_WEIGHT_ARRAY_EXT 0x850C\r\n\tGL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D\r\n\tGL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E\r\n\tGL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F\r\n\tGL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510\r\n\tvoid glVertexWeightPointerEXT (GLint size, GLenum type, GLsizei stride, void* pointer)\r\n\tvoid glVertexWeightfEXT (GLfloat weight)\r\n\tvoid glVertexWeightfvEXT (GLfloat* weight)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_GREMEDY_frame_terminator",
    "content": "GL_GREMEDY_frame_terminator\r\nhttp://www.opengl.org/registry/specs/GREMEDY/frame_terminator.txt\r\n\tvoid glFrameTerminatorGREMEDY (void)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_GREMEDY_string_marker",
    "content": "GL_GREMEDY_string_marker\r\nhttp://www.opengl.org/registry/specs/GREMEDY/string_marker.txt\r\n\tvoid glStringMarkerGREMEDY (GLsizei len, const void* string)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_HP_convolution_border_modes",
    "content": "GL_HP_convolution_border_modes\r\nhttp://www.opengl.org/registry/specs/HP/convolution_border_modes.txt\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_HP_image_transform",
    "content": "GL_HP_image_transform\r\nhttp://www.opengl.org/registry/specs/HP/image_transform.txt\r\n\tvoid glGetImageTransformParameterfvHP (GLenum target, GLenum pname, const GLfloat* params)\r\n\tvoid glGetImageTransformParameterivHP (GLenum target, GLenum pname, const GLint* params)\r\n\tvoid glImageTransformParameterfHP (GLenum target, GLenum pname, const GLfloat param)\r\n\tvoid glImageTransformParameterfvHP (GLenum target, GLenum pname, const GLfloat* params)\r\n\tvoid glImageTransformParameteriHP (GLenum target, GLenum pname, const GLint param)\r\n\tvoid glImageTransformParameterivHP (GLenum target, GLenum pname, const GLint* params)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_HP_occlusion_test",
    "content": "GL_HP_occlusion_test\r\nhttp://www.opengl.org/registry/specs/HP/occlusion_test.txt\r\n\tGL_OCCLUSION_TEST_RESULT_HP 0x8166\r\n\tGL_OCCLUSION_TEST_HP 0x8165\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_HP_texture_lighting",
    "content": "GL_HP_texture_lighting\r\nhttp://www.opengl.org/registry/specs/HP/texture_lighting.txt\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_IBM_cull_vertex",
    "content": "GL_IBM_cull_vertex\r\nhttp://www.opengl.org/registry/specs/IBM/cull_vertex.txt\r\n\tGL_CULL_VERTEX_IBM 103050\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_IBM_multimode_draw_arrays",
    "content": "GL_IBM_multimode_draw_arrays\r\nhttp://www.opengl.org/registry/specs/IBM/multimode_draw_arrays.txt\r\n\tvoid glMultiModeDrawArraysIBM (const GLenum* mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride)\r\n\tvoid glMultiModeDrawElementsIBM (const GLenum* mode, const GLsizei *count, GLenum type, const GLvoid * const *indices, GLsizei primcount, GLint modestride)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_IBM_rasterpos_clip",
    "content": "GL_IBM_rasterpos_clip\r\nhttp://www.opengl.org/registry/specs/IBM/rasterpos_clip.txt\r\n\tGL_RASTER_POSITION_UNCLIPPED_IBM 103010\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_IBM_static_data",
    "content": "GL_IBM_static_data\r\nhttp://www.opengl.org/registry/specs/IBM/static_data.txt\r\n\tGL_ALL_STATIC_DATA_IBM 103060\r\n\tGL_STATIC_VERTEX_ARRAY_IBM 103061\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_IBM_texture_mirrored_repeat",
    "content": "GL_IBM_texture_mirrored_repeat\r\nhttp://www.opengl.org/registry/specs/IBM/texture_mirrored_repeat.txt\r\n\tGL_MIRRORED_REPEAT_IBM 0x8370\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_IBM_vertex_array_lists",
    "content": "GL_IBM_vertex_array_lists\r\nhttp://www.opengl.org/registry/specs/IBM/vertex_array_lists.txt\r\n\tGL_VERTEX_ARRAY_LIST_IBM 103070\r\n\tGL_NORMAL_ARRAY_LIST_IBM 103071\r\n\tGL_COLOR_ARRAY_LIST_IBM 103072\r\n\tGL_INDEX_ARRAY_LIST_IBM 103073\r\n\tGL_TEXTURE_COORD_ARRAY_LIST_IBM 103074\r\n\tGL_EDGE_FLAG_ARRAY_LIST_IBM 103075\r\n\tGL_FOG_COORDINATE_ARRAY_LIST_IBM 103076\r\n\tGL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077\r\n\tGL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080\r\n\tGL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081\r\n\tGL_COLOR_ARRAY_LIST_STRIDE_IBM 103082\r\n\tGL_INDEX_ARRAY_LIST_STRIDE_IBM 103083\r\n\tGL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084\r\n\tGL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085\r\n\tGL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086\r\n\tGL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087\r\n\tvoid glColorPointerListIBM (GLint size, GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride)\r\n\tvoid glEdgeFlagPointerListIBM (GLint stride, const GLboolean ** pointer, GLint ptrstride)\r\n\tvoid glFogCoordPointerListIBM (GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride)\r\n\tvoid glIndexPointerListIBM (GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride)\r\n\tvoid glNormalPointerListIBM (GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride)\r\n\tvoid glSecondaryColorPointerListIBM (GLint size, GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride)\r\n\tvoid glTexCoordPointerListIBM (GLint size, GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride)\r\n\tvoid glVertexPointerListIBM (GLint size, GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_INGR_color_clamp",
    "content": "GL_INGR_color_clamp\r\nhttp://www.opengl.org/registry/specs/INGR/color_clamp.txt\r\n\tGL_RED_MIN_CLAMP_INGR 0x8560\r\n\tGL_GREEN_MIN_CLAMP_INGR 0x8561\r\n\tGL_BLUE_MIN_CLAMP_INGR 0x8562\r\n\tGL_ALPHA_MIN_CLAMP_INGR 0x8563\r\n\tGL_RED_MAX_CLAMP_INGR 0x8564\r\n\tGL_GREEN_MAX_CLAMP_INGR 0x8565\r\n\tGL_BLUE_MAX_CLAMP_INGR 0x8566\r\n\tGL_ALPHA_MAX_CLAMP_INGR 0x8567\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_INGR_interlace_read",
    "content": "GL_INGR_interlace_read\r\nhttp://www.opengl.org/registry/specs/INGR/interlace_read.txt\r\n\tGL_INTERLACE_READ_INGR 0x8568\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_INTEL_parallel_arrays",
    "content": "GL_INTEL_parallel_arrays\r\nhttp://www.opengl.org/registry/specs/INTEL/parallel_arrays.txt\r\n\tGL_PARALLEL_ARRAYS_INTEL 0x83F4\r\n\tGL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5\r\n\tGL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6\r\n\tGL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7\r\n\tGL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8\r\n\tvoid glColorPointervINTEL (GLint size, GLenum type, const void** pointer)\r\n\tvoid glNormalPointervINTEL (GLenum type, const void** pointer)\r\n\tvoid glTexCoordPointervINTEL (GLint size, GLenum type, const void** pointer)\r\n\tvoid glVertexPointervINTEL (GLint size, GLenum type, const void** pointer)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_INTEL_texture_scissor",
    "content": "GL_INTEL_texture_scissor\r\nhttp://www.opengl.org/registry/specs/INTEL/texture_scissor.txt\r\n\tvoid glTexScissorFuncINTEL (GLenum target, GLenum lfunc, GLenum hfunc)\r\n\tvoid glTexScissorINTEL (GLenum target, GLclampf tlow, GLclampf thigh)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_KTX_buffer_region",
    "content": "GL_KTX_buffer_region\r\n\tGL_KTX_FRONT_REGION 0x0\r\n\tGL_KTX_BACK_REGION 0x1\r\n\tGL_KTX_Z_REGION 0x2\r\n\tGL_KTX_STENCIL_REGION 0x3\r\n\tGLuint glBufferRegionEnabledEXT (void)\r\n\tGLuint glNewBufferRegionEXT (GLenum region)\r\n\tvoid glDeleteBufferRegionEXT (GLenum region)\r\n\tvoid glReadBufferRegionEXT (GLuint region, GLint x, GLint y, GLsizei width, GLsizei height)\r\n\tvoid glDrawBufferRegionEXT (GLuint region, GLint x, GLint y, GLsizei width, GLsizei height, GLint xDest, GLint yDest)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_MESAX_texture_stack",
    "content": "GL_MESAX_texture_stack\r\nhttp://www.opengl.org/registry/specs/MESAX/texture_stack.txt\r\n\tGL_TEXTURE_1D_STACK_MESAX 0x8759\r\n\tGL_TEXTURE_2D_STACK_MESAX 0x875A\r\n\tGL_PROXY_TEXTURE_1D_STACK_MESAX 0x875B\r\n\tGL_PROXY_TEXTURE_2D_STACK_MESAX 0x875C\r\n\tGL_TEXTURE_1D_STACK_BINDING_MESAX 0x875D\r\n\tGL_TEXTURE_2D_STACK_BINDING_MESAX 0x875E\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_MESA_pack_invert",
    "content": "GL_MESA_pack_invert\r\nhttp://www.opengl.org/registry/specs/MESA/pack_invert.txt\r\n\tGL_PACK_INVERT_MESA 0x8758\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_MESA_resize_buffers",
    "content": "GL_MESA_resize_buffers\r\nhttp://www.opengl.org/registry/specs/MESA/resize_buffers.txt\r\n\tvoid glResizeBuffersMESA (void)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_MESA_window_pos",
    "content": "GL_MESA_window_pos\r\nhttp://www.opengl.org/registry/specs/MESA/window_pos.txt\r\n\tvoid glWindowPos2dMESA (GLdouble x, GLdouble y)\r\n\tvoid glWindowPos2dvMESA (const GLdouble* p)\r\n\tvoid glWindowPos2fMESA (GLfloat x, GLfloat y)\r\n\tvoid glWindowPos2fvMESA (const GLfloat* p)\r\n\tvoid glWindowPos2iMESA (GLint x, GLint y)\r\n\tvoid glWindowPos2ivMESA (const GLint* p)\r\n\tvoid glWindowPos2sMESA (GLshort x, GLshort y)\r\n\tvoid glWindowPos2svMESA (const GLshort* p)\r\n\tvoid glWindowPos3dMESA (GLdouble x, GLdouble y, GLdouble z)\r\n\tvoid glWindowPos3dvMESA (const GLdouble* p)\r\n\tvoid glWindowPos3fMESA (GLfloat x, GLfloat y, GLfloat z)\r\n\tvoid glWindowPos3fvMESA (const GLfloat* p)\r\n\tvoid glWindowPos3iMESA (GLint x, GLint y, GLint z)\r\n\tvoid glWindowPos3ivMESA (const GLint* p)\r\n\tvoid glWindowPos3sMESA (GLshort x, GLshort y, GLshort z)\r\n\tvoid glWindowPos3svMESA (const GLshort* p)\r\n\tvoid glWindowPos4dMESA (GLdouble x, GLdouble y, GLdouble z, GLdouble)\r\n\tvoid glWindowPos4dvMESA (const GLdouble* p)\r\n\tvoid glWindowPos4fMESA (GLfloat x, GLfloat y, GLfloat z, GLfloat w)\r\n\tvoid glWindowPos4fvMESA (const GLfloat* p)\r\n\tvoid glWindowPos4iMESA (GLint x, GLint y, GLint z, GLint w)\r\n\tvoid glWindowPos4ivMESA (const GLint* p)\r\n\tvoid glWindowPos4sMESA (GLshort x, GLshort y, GLshort z, GLshort w)\r\n\tvoid glWindowPos4svMESA (const GLshort* p)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_MESA_ycbcr_texture",
    "content": "GL_MESA_ycbcr_texture\r\nhttp://www.opengl.org/registry/specs/MESA/ycbcr_texture.txt\r\n\tGL_UNSIGNED_SHORT_8_8_MESA 0x85BA\r\n\tGL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB\r\n\tGL_YCBCR_MESA 0x8757\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_blend_square",
    "content": "GL_NV_blend_square\r\nhttp://www.opengl.org/registry/specs/NV/blend_square.txt\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_conditional_render",
    "content": "GL_NV_conditional_render\r\nhttp://www.opengl.org/registry/specs/NV/conditional_render.txt\r\n\tGL_QUERY_WAIT_NV 0x8E13\r\n\tGL_QUERY_NO_WAIT_NV 0x8E14\r\n\tGL_QUERY_BY_REGION_WAIT_NV 0x8E15\r\n\tGL_QUERY_BY_REGION_NO_WAIT_NV 0x8E16\r\n\tvoid glBeginConditionalRenderNV (GLuint id, GLenum mode)\r\n\tvoid glEndConditionalRenderNV (void)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_copy_depth_to_color",
    "content": "GL_NV_copy_depth_to_color\r\nhttp://www.opengl.org/registry/specs/NV/copy_depth_to_color.txt\r\n\tGL_DEPTH_STENCIL_TO_RGBA_NV 0x886E\r\n\tGL_DEPTH_STENCIL_TO_BGRA_NV 0x886F\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_copy_image",
    "content": "GL_NV_copy_image\r\nhttp://www.opengl.org/registry/specs/NV/copy_image.txt\r\n\tvoid glCopyImageSubDataNV (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_depth_buffer_float",
    "content": "GL_NV_depth_buffer_float\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_NV_depth_buffer_float.txt\r\n\tGL_DEPTH_COMPONENT32F_NV 0x8DAB\r\n\tGL_DEPTH32F_STENCIL8_NV 0x8DAC\r\n\tGL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV 0x8DAD\r\n\tGL_DEPTH_BUFFER_FLOAT_MODE_NV 0x8DAF\r\n\tvoid glDepthRangedNV (GLdouble zNear, GLdouble zFar)\r\n\tvoid glClearDepthdNV (GLdouble depth)\r\n\tvoid glDepthBoundsdNV (GLdouble zmin, GLdouble zmax)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_depth_clamp",
    "content": "GL_NV_depth_clamp\r\nhttp://www.opengl.org/registry/specs/NV/depth_clamp.txt\r\n\tGL_DEPTH_CLAMP_NV 0x864F\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_depth_range_unclamped",
    "content": "GL_NV_depth_range_unclamped\r\n\tGL_SAMPLE_COUNT_BITS_NV 0x8864\r\n\tGL_CURRENT_SAMPLE_COUNT_QUERY_NV 0x8865\r\n\tGL_QUERY_RESULT_NV 0x8866\r\n\tGL_QUERY_RESULT_AVAILABLE_NV 0x8867\r\n\tGL_SAMPLE_COUNT_NV 0x8914\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_evaluators",
    "content": "GL_NV_evaluators\r\nhttp://www.opengl.org/registry/specs/NV/evaluators.txt\r\n\tGL_EVAL_2D_NV 0x86C0\r\n\tGL_EVAL_TRIANGULAR_2D_NV 0x86C1\r\n\tGL_MAP_TESSELLATION_NV 0x86C2\r\n\tGL_MAP_ATTRIB_U_ORDER_NV 0x86C3\r\n\tGL_MAP_ATTRIB_V_ORDER_NV 0x86C4\r\n\tGL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5\r\n\tGL_EVAL_VERTEX_ATTRIB0_NV 0x86C6\r\n\tGL_EVAL_VERTEX_ATTRIB1_NV 0x86C7\r\n\tGL_EVAL_VERTEX_ATTRIB2_NV 0x86C8\r\n\tGL_EVAL_VERTEX_ATTRIB3_NV 0x86C9\r\n\tGL_EVAL_VERTEX_ATTRIB4_NV 0x86CA\r\n\tGL_EVAL_VERTEX_ATTRIB5_NV 0x86CB\r\n\tGL_EVAL_VERTEX_ATTRIB6_NV 0x86CC\r\n\tGL_EVAL_VERTEX_ATTRIB7_NV 0x86CD\r\n\tGL_EVAL_VERTEX_ATTRIB8_NV 0x86CE\r\n\tGL_EVAL_VERTEX_ATTRIB9_NV 0x86CF\r\n\tGL_EVAL_VERTEX_ATTRIB10_NV 0x86D0\r\n\tGL_EVAL_VERTEX_ATTRIB11_NV 0x86D1\r\n\tGL_EVAL_VERTEX_ATTRIB12_NV 0x86D2\r\n\tGL_EVAL_VERTEX_ATTRIB13_NV 0x86D3\r\n\tGL_EVAL_VERTEX_ATTRIB14_NV 0x86D4\r\n\tGL_EVAL_VERTEX_ATTRIB15_NV 0x86D5\r\n\tGL_MAX_MAP_TESSELLATION_NV 0x86D6\r\n\tGL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7\r\n\tvoid glEvalMapsNV (GLenum target, GLenum mode)\r\n\tvoid glGetMapAttribParameterfvNV (GLenum target, GLuint index, GLenum pname, GLfloat* params)\r\n\tvoid glGetMapAttribParameterivNV (GLenum target, GLuint index, GLenum pname, GLint* params)\r\n\tvoid glGetMapControlPointsNV (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void* points)\r\n\tvoid glGetMapParameterfvNV (GLenum target, GLenum pname, GLfloat* params)\r\n\tvoid glGetMapParameterivNV (GLenum target, GLenum pname, GLint* params)\r\n\tvoid glMapControlPointsNV (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void* points)\r\n\tvoid glMapParameterfvNV (GLenum target, GLenum pname, const GLfloat* params)\r\n\tvoid glMapParameterivNV (GLenum target, GLenum pname, const GLint* params)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_explicit_multisample",
    "content": "GL_NV_explicit_multisample\r\nhttp://www.opengl.org/registry/specs/NV/explicit_multisample.txt\r\n\tGL_SAMPLE_POSITION_NV 0x8E50\r\n\tGL_SAMPLE_MASK_NV 0x8E51\r\n\tGL_SAMPLE_MASK_VALUE_NV 0x8E52\r\n\tGL_TEXTURE_BINDING_RENDERBUFFER_NV 0x8E53\r\n\tGL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV 0x8E54\r\n\tGL_TEXTURE_RENDERBUFFER_NV 0x8E55\r\n\tGL_SAMPLER_RENDERBUFFER_NV 0x8E56\r\n\tGL_INT_SAMPLER_RENDERBUFFER_NV 0x8E57\r\n\tGL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV 0x8E58\r\n\tGL_MAX_SAMPLE_MASK_WORDS_NV 0x8E59\r\n\tvoid glGetMultisamplefvNV (GLenum pname, GLuint index, GLfloat* val)\r\n\tvoid glSampleMaskIndexedNV (GLuint index, GLbitfield mask)\r\n\tvoid glTexRenderbufferNV (GLenum target, GLuint renderbuffer)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_fence",
    "content": "GL_NV_fence\r\nhttp://www.opengl.org/registry/specs/NV/fence.txt\r\n\tGL_ALL_COMPLETED_NV 0x84F2\r\n\tGL_FENCE_STATUS_NV 0x84F3\r\n\tGL_FENCE_CONDITION_NV 0x84F4\r\n\tvoid glDeleteFencesNV (GLsizei n, const GLuint* fences)\r\n\tvoid glFinishFenceNV (GLuint fence)\r\n\tvoid glGenFencesNV (GLsizei n, GLuint* fences)\r\n\tvoid glGetFenceivNV (GLuint fence, GLenum pname, GLint* params)\r\n\tGLboolean glIsFenceNV (GLuint fence)\r\n\tvoid glSetFenceNV (GLuint fence, GLenum condition)\r\n\tGLboolean glTestFenceNV (GLuint fence)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_float_buffer",
    "content": "GL_NV_float_buffer\r\nhttp://www.opengl.org/registry/specs/NV/float_buffer.txt\r\n\tGL_FLOAT_R_NV 0x8880\r\n\tGL_FLOAT_RG_NV 0x8881\r\n\tGL_FLOAT_RGB_NV 0x8882\r\n\tGL_FLOAT_RGBA_NV 0x8883\r\n\tGL_FLOAT_R16_NV 0x8884\r\n\tGL_FLOAT_R32_NV 0x8885\r\n\tGL_FLOAT_RG16_NV 0x8886\r\n\tGL_FLOAT_RG32_NV 0x8887\r\n\tGL_FLOAT_RGB16_NV 0x8888\r\n\tGL_FLOAT_RGB32_NV 0x8889\r\n\tGL_FLOAT_RGBA16_NV 0x888A\r\n\tGL_FLOAT_RGBA32_NV 0x888B\r\n\tGL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C\r\n\tGL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D\r\n\tGL_FLOAT_RGBA_MODE_NV 0x888E\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_fog_distance",
    "content": "GL_NV_fog_distance\r\nhttp://www.opengl.org/registry/specs/NV/fog_distance.txt\r\n\tGL_FOG_DISTANCE_MODE_NV 0x855A\r\n\tGL_EYE_RADIAL_NV 0x855B\r\n\tGL_EYE_PLANE_ABSOLUTE_NV 0x855C\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_fragment_program",
    "content": "GL_NV_fragment_program\r\nhttp://www.opengl.org/registry/specs/NV/fragment_program.txt\r\n\tGL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868\r\n\tGL_FRAGMENT_PROGRAM_NV 0x8870\r\n\tGL_MAX_TEXTURE_COORDS_NV 0x8871\r\n\tGL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872\r\n\tGL_FRAGMENT_PROGRAM_BINDING_NV 0x8873\r\n\tGL_PROGRAM_ERROR_STRING_NV 0x8874\r\n\tvoid glGetProgramNamedParameterdvNV (GLuint id, GLsizei len, const GLubyte* name, GLdouble *params)\r\n\tvoid glGetProgramNamedParameterfvNV (GLuint id, GLsizei len, const GLubyte* name, GLfloat *params)\r\n\tvoid glProgramNamedParameter4dNV (GLuint id, GLsizei len, const GLubyte* name, GLdouble x, GLdouble y, GLdouble z, GLdouble w)\r\n\tvoid glProgramNamedParameter4dvNV (GLuint id, GLsizei len, const GLubyte* name, const GLdouble v[])\r\n\tvoid glProgramNamedParameter4fNV (GLuint id, GLsizei len, const GLubyte* name, GLfloat x, GLfloat y, GLfloat z, GLfloat w)\r\n\tvoid glProgramNamedParameter4fvNV (GLuint id, GLsizei len, const GLubyte* name, const GLfloat v[])\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_fragment_program2",
    "content": "GL_NV_fragment_program2\r\nhttp://www.nvidia.com/dev_content/nvopenglspecs/GL_NV_fragment_program2.txt\r\n\tGL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4\r\n\tGL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5\r\n\tGL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6\r\n\tGL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7\r\n\tGL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_fragment_program4",
    "content": "GL_NV_fragment_program4\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_NV_fragment_program4.txt\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_fragment_program_option",
    "content": "GL_NV_fragment_program_option\r\nhttp://www.nvidia.com/dev_content/nvopenglspecs/GL_NV_fragment_program_option.txt\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_framebuffer_multisample_coverage",
    "content": "GL_NV_framebuffer_multisample_coverage\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_NV_framebuffer_multisample_coverage.txt\r\n\tGL_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB\r\n\tGL_RENDERBUFFER_COLOR_SAMPLES_NV  0x8E10\r\n\tGL_MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E11\r\n\tGL_MULTISAMPLE_COVERAGE_MODES_NV 0x8E12\r\n\tvoid glRenderbufferStorageMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_geometry_program4",
    "content": "GL_NV_geometry_program4\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_NV_geometry_program4.txt\r\n\tGL_GEOMETRY_PROGRAM_NV 0x8C26\r\n\tGL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27\r\n\tGL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28\r\n\tvoid glProgramVertexLimitNV (GLenum target, GLint limit)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_geometry_shader4",
    "content": "GL_NV_geometry_shader4\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_NV_geometry_shader4.txt\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_gpu_program4",
    "content": "GL_NV_gpu_program4\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_NV_gpu_program4.txt\r\n\tGL_MIN_PROGRAM_TEXEL_OFFSET_NV 0x8904\r\n\tGL_MAX_PROGRAM_TEXEL_OFFSET_NV 0x8905\r\n\tGL_PROGRAM_ATTRIB_COMPONENTS_NV 0x8906\r\n\tGL_PROGRAM_RESULT_COMPONENTS_NV 0x8907\r\n\tGL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV 0x8908\r\n\tGL_MAX_PROGRAM_RESULT_COMPONENTS_NV 0x8909\r\n\tGL_MAX_PROGRAM_GENERIC_ATTRIBS_NV 0x8DA5\r\n\tGL_MAX_PROGRAM_GENERIC_RESULTS_NV 0x8DA6\r\n\tvoid glProgramLocalParameterI4iNV (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w)\r\n\tvoid glProgramLocalParameterI4ivNV (GLenum target, GLuint index, const GLint *params)\r\n\tvoid glProgramLocalParametersI4ivNV (GLenum target, GLuint index, GLsizei count, const GLint *params)\r\n\tvoid glProgramLocalParameterI4uiNV (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)\r\n\tvoid glProgramLocalParameterI4uivNV (GLenum target, GLuint index, const GLuint *params)\r\n\tvoid glProgramLocalParametersI4uivNV (GLenum target, GLuint index, GLsizei count, const GLuint *params)\r\n\tvoid glProgramEnvParameterI4iNV (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w)\r\n\tvoid glProgramEnvParameterI4ivNV (GLenum target, GLuint index, const GLint *params)\r\n\tvoid glProgramEnvParametersI4ivNV (GLenum target, GLuint index, GLsizei count, const GLint *params)\r\n\tvoid glProgramEnvParameterI4uiNV (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)\r\n\tvoid glProgramEnvParameterI4uivNV (GLenum target, GLuint index, const GLuint *params)\r\n\tvoid glProgramEnvParametersI4uivNV (GLenum target, GLuint index, GLsizei count, const GLuint *params)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_half_float",
    "content": "GL_NV_half_float\r\nhttp://www.opengl.org/registry/specs/NV/half_float.txt\r\n\tGL_HALF_FLOAT_NV 0x140B\r\n\tvoid glColor3hNV (GLhalf red, GLhalf green, GLhalf blue)\r\n\tvoid glColor3hvNV (const GLhalf* v)\r\n\tvoid glColor4hNV (GLhalf red, GLhalf green, GLhalf blue, GLhalf alpha)\r\n\tvoid glColor4hvNV (const GLhalf* v)\r\n\tvoid glFogCoordhNV (GLhalf fog)\r\n\tvoid glFogCoordhvNV (const GLhalf* fog)\r\n\tvoid glMultiTexCoord1hNV (GLenum target, GLhalf s)\r\n\tvoid glMultiTexCoord1hvNV (GLenum target, const GLhalf* v)\r\n\tvoid glMultiTexCoord2hNV (GLenum target, GLhalf s, GLhalf t)\r\n\tvoid glMultiTexCoord2hvNV (GLenum target, const GLhalf* v)\r\n\tvoid glMultiTexCoord3hNV (GLenum target, GLhalf s, GLhalf t, GLhalf r)\r\n\tvoid glMultiTexCoord3hvNV (GLenum target, const GLhalf* v)\r\n\tvoid glMultiTexCoord4hNV (GLenum target, GLhalf s, GLhalf t, GLhalf r, GLhalf q)\r\n\tvoid glMultiTexCoord4hvNV (GLenum target, const GLhalf* v)\r\n\tvoid glNormal3hNV (GLhalf nx, GLhalf ny, GLhalf nz)\r\n\tvoid glNormal3hvNV (const GLhalf* v)\r\n\tvoid glSecondaryColor3hNV (GLhalf red, GLhalf green, GLhalf blue)\r\n\tvoid glSecondaryColor3hvNV (const GLhalf* v)\r\n\tvoid glTexCoord1hNV (GLhalf s)\r\n\tvoid glTexCoord1hvNV (const GLhalf* v)\r\n\tvoid glTexCoord2hNV (GLhalf s, GLhalf t)\r\n\tvoid glTexCoord2hvNV (const GLhalf* v)\r\n\tvoid glTexCoord3hNV (GLhalf s, GLhalf t, GLhalf r)\r\n\tvoid glTexCoord3hvNV (const GLhalf* v)\r\n\tvoid glTexCoord4hNV (GLhalf s, GLhalf t, GLhalf r, GLhalf q)\r\n\tvoid glTexCoord4hvNV (const GLhalf* v)\r\n\tvoid glVertex2hNV (GLhalf x, GLhalf y)\r\n\tvoid glVertex2hvNV (const GLhalf* v)\r\n\tvoid glVertex3hNV (GLhalf x, GLhalf y, GLhalf z)\r\n\tvoid glVertex3hvNV (const GLhalf* v)\r\n\tvoid glVertex4hNV (GLhalf x, GLhalf y, GLhalf z, GLhalf w)\r\n\tvoid glVertex4hvNV (const GLhalf* v)\r\n\tvoid glVertexAttrib1hNV (GLuint index, GLhalf x)\r\n\tvoid glVertexAttrib1hvNV (GLuint index, const GLhalf* v)\r\n\tvoid glVertexAttrib2hNV (GLuint index, GLhalf x, GLhalf y)\r\n\tvoid glVertexAttrib2hvNV (GLuint index, const GLhalf* v)\r\n\tvoid glVertexAttrib3hNV (GLuint index, GLhalf x, GLhalf y, GLhalf z)\r\n\tvoid glVertexAttrib3hvNV (GLuint index, const GLhalf* v)\r\n\tvoid glVertexAttrib4hNV (GLuint index, GLhalf x, GLhalf y, GLhalf z, GLhalf w)\r\n\tvoid glVertexAttrib4hvNV (GLuint index, const GLhalf* v)\r\n\tvoid glVertexAttribs1hvNV (GLuint index, GLsizei n, const GLhalf* v)\r\n\tvoid glVertexAttribs2hvNV (GLuint index, GLsizei n, const GLhalf* v)\r\n\tvoid glVertexAttribs3hvNV (GLuint index, GLsizei n, const GLhalf* v)\r\n\tvoid glVertexAttribs4hvNV (GLuint index, GLsizei n, const GLhalf* v)\r\n\tvoid glVertexWeighthNV (GLhalf weight)\r\n\tvoid glVertexWeighthvNV (const GLhalf* weight)\r\n\ttypedef unsigned short GLhalf\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_light_max_exponent",
    "content": "GL_NV_light_max_exponent\r\nhttp://www.opengl.org/registry/specs/NV/light_max_exponent.txt\r\n\tGL_MAX_SHININESS_NV 0x8504\r\n\tGL_MAX_SPOT_EXPONENT_NV 0x8505\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_multisample_filter_hint",
    "content": "GL_NV_multisample_filter_hint\r\nhttp://www.opengl.org/registry/specs/NV/multisample_filter_hint.txt\r\n\tGL_MULTISAMPLE_FILTER_HINT_NV 0x8534\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_occlusion_query",
    "content": "GL_NV_occlusion_query\r\nhttp://www.opengl.org/registry/specs/NV/occlusion_query.txt\r\n\tGL_PIXEL_COUNTER_BITS_NV 0x8864\r\n\tGL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865\r\n\tGL_PIXEL_COUNT_NV 0x8866\r\n\tGL_PIXEL_COUNT_AVAILABLE_NV 0x8867\r\n\tvoid glBeginOcclusionQueryNV (GLuint id)\r\n\tvoid glDeleteOcclusionQueriesNV (GLsizei n, const GLuint* ids)\r\n\tvoid glEndOcclusionQueryNV (void)\r\n\tvoid glGenOcclusionQueriesNV (GLsizei n, GLuint* ids)\r\n\tvoid glGetOcclusionQueryivNV (GLuint id, GLenum pname, GLint* params)\r\n\tvoid glGetOcclusionQueryuivNV (GLuint id, GLenum pname, GLuint* params)\r\n\tGLboolean glIsOcclusionQueryNV (GLuint id)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_packed_depth_stencil",
    "content": "GL_NV_packed_depth_stencil\r\nhttp://www.opengl.org/registry/specs/NV/packed_depth_stencil.txt\r\n\tGL_DEPTH_STENCIL_NV 0x84F9\r\n\tGL_UNSIGNED_INT_24_8_NV 0x84FA\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_parameter_buffer_object",
    "content": "GL_NV_parameter_buffer_object\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_NV_parameter_buffer_object.txt\r\n\tGL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV 0x8DA2\r\n\tGL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV 0x8DA3\r\n\tGL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV 0x8DA4\r\n\tGL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV 0x8DA0\r\n\tGL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV 0x8DA1\r\n\tvoid glProgramBufferParametersfvNV (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLfloat *params)\r\n\tvoid glProgramBufferParametersIivNV (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLint *params)\r\n\tvoid glProgramBufferParametersIuivNV (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLuint *params)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_parameter_buffer_object2",
    "content": "GL_NV_parameter_buffer_object2\r\nhttp://www.opengl.org/registry/specs/NV/parameter_buffer_object2.txt\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_pixel_data_range",
    "content": "GL_NV_pixel_data_range\r\nhttp://www.opengl.org/registry/specs/NV/pixel_data_range.txt\r\n\tGL_WRITE_PIXEL_DATA_RANGE_NV 0x8878\r\n\tGL_READ_PIXEL_DATA_RANGE_NV 0x8879\r\n\tGL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A\r\n\tGL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B\r\n\tGL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C\r\n\tGL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D\r\n\tvoid glFlushPixelDataRangeNV (GLenum target)\r\n\tvoid glPixelDataRangeNV (GLenum target, GLsizei length, void* pointer)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_point_sprite",
    "content": "GL_NV_point_sprite\r\nhttp://www.opengl.org/registry/specs/NV/point_sprite.txt\r\n\tGL_POINT_SPRITE_NV 0x8861\r\n\tGL_COORD_REPLACE_NV 0x8862\r\n\tGL_POINT_SPRITE_R_MODE_NV 0x8863\r\n\tvoid glPointParameteriNV (GLenum pname, GLint param)\r\n\tvoid glPointParameterivNV (GLenum pname, const GLint* params)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_present_video",
    "content": "GL_NV_present_video\r\n\tGL_FRAME_NV 0x8E26\r\n\tGL_FIELDS_NV 0x8E27\r\n\tGL_CURRENT_TIME_NV 0x8E28\r\n\tGL_NUM_FILL_STREAMS_NV 0x8E29\r\n\tGL_PRESENT_TIME_NV 0x8E2A\r\n\tGL_PRESENT_DURATION_NV 0x8E2B\r\n\tvoid glGetVideoi64vNV (GLuint video_slot, GLenum pname, GLint64EXT* params)\r\n\tvoid glGetVideoivNV (GLuint video_slot, GLenum pname, GLint* params)\r\n\tvoid glGetVideoui64vNV (GLuint video_slot, GLenum pname, GLuint64EXT* params)\r\n\tvoid glGetVideouivNV (GLuint video_slot, GLenum pname, GLuint* params)\r\n\tvoid glPresentFrameDualFillNV (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3)\r\n\tvoid glPresentFrameKeyedNV (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_primitive_restart",
    "content": "GL_NV_primitive_restart\r\nhttp://www.opengl.org/registry/specs/NV/primitive_restart.txt\r\n\tGL_PRIMITIVE_RESTART_NV 0x8558\r\n\tGL_PRIMITIVE_RESTART_INDEX_NV 0x8559\r\n\tvoid glPrimitiveRestartIndexNV (GLuint index)\r\n\tvoid glPrimitiveRestartNV (void)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_register_combiners",
    "content": "GL_NV_register_combiners\r\nhttp://www.opengl.org/registry/specs/NV/register_combiners.txt\r\n\tGL_REGISTER_COMBINERS_NV 0x8522\r\n\tGL_VARIABLE_A_NV 0x8523\r\n\tGL_VARIABLE_B_NV 0x8524\r\n\tGL_VARIABLE_C_NV 0x8525\r\n\tGL_VARIABLE_D_NV 0x8526\r\n\tGL_VARIABLE_E_NV 0x8527\r\n\tGL_VARIABLE_F_NV 0x8528\r\n\tGL_VARIABLE_G_NV 0x8529\r\n\tGL_CONSTANT_COLOR0_NV 0x852A\r\n\tGL_CONSTANT_COLOR1_NV 0x852B\r\n\tGL_PRIMARY_COLOR_NV 0x852C\r\n\tGL_SECONDARY_COLOR_NV 0x852D\r\n\tGL_SPARE0_NV 0x852E\r\n\tGL_SPARE1_NV 0x852F\r\n\tGL_DISCARD_NV 0x8530\r\n\tGL_E_TIMES_F_NV 0x8531\r\n\tGL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532\r\n\tGL_UNSIGNED_IDENTITY_NV 0x8536\r\n\tGL_UNSIGNED_INVERT_NV 0x8537\r\n\tGL_EXPAND_NORMAL_NV 0x8538\r\n\tGL_EXPAND_NEGATE_NV 0x8539\r\n\tGL_HALF_BIAS_NORMAL_NV 0x853A\r\n\tGL_HALF_BIAS_NEGATE_NV 0x853B\r\n\tGL_SIGNED_IDENTITY_NV 0x853C\r\n\tGL_SIGNED_NEGATE_NV 0x853D\r\n\tGL_SCALE_BY_TWO_NV 0x853E\r\n\tGL_SCALE_BY_FOUR_NV 0x853F\r\n\tGL_SCALE_BY_ONE_HALF_NV 0x8540\r\n\tGL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541\r\n\tGL_COMBINER_INPUT_NV 0x8542\r\n\tGL_COMBINER_MAPPING_NV 0x8543\r\n\tGL_COMBINER_COMPONENT_USAGE_NV 0x8544\r\n\tGL_COMBINER_AB_DOT_PRODUCT_NV 0x8545\r\n\tGL_COMBINER_CD_DOT_PRODUCT_NV 0x8546\r\n\tGL_COMBINER_MUX_SUM_NV 0x8547\r\n\tGL_COMBINER_SCALE_NV 0x8548\r\n\tGL_COMBINER_BIAS_NV 0x8549\r\n\tGL_COMBINER_AB_OUTPUT_NV 0x854A\r\n\tGL_COMBINER_CD_OUTPUT_NV 0x854B\r\n\tGL_COMBINER_SUM_OUTPUT_NV 0x854C\r\n\tGL_MAX_GENERAL_COMBINERS_NV 0x854D\r\n\tGL_NUM_GENERAL_COMBINERS_NV 0x854E\r\n\tGL_COLOR_SUM_CLAMP_NV 0x854F\r\n\tGL_COMBINER0_NV 0x8550\r\n\tGL_COMBINER1_NV 0x8551\r\n\tGL_COMBINER2_NV 0x8552\r\n\tGL_COMBINER3_NV 0x8553\r\n\tGL_COMBINER4_NV 0x8554\r\n\tGL_COMBINER5_NV 0x8555\r\n\tGL_COMBINER6_NV 0x8556\r\n\tGL_COMBINER7_NV 0x8557\r\n\tvoid glCombinerInputNV (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage)\r\n\tvoid glCombinerOutputNV (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum)\r\n\tvoid glCombinerParameterfNV (GLenum pname, GLfloat param)\r\n\tvoid glCombinerParameterfvNV (GLenum pname, const GLfloat* params)\r\n\tvoid glCombinerParameteriNV (GLenum pname, GLint param)\r\n\tvoid glCombinerParameterivNV (GLenum pname, const GLint* params)\r\n\tvoid glFinalCombinerInputNV (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage)\r\n\tvoid glGetCombinerInputParameterfvNV (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat* params)\r\n\tvoid glGetCombinerInputParameterivNV (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint* params)\r\n\tvoid glGetCombinerOutputParameterfvNV (GLenum stage, GLenum portion, GLenum pname, GLfloat* params)\r\n\tvoid glGetCombinerOutputParameterivNV (GLenum stage, GLenum portion, GLenum pname, GLint* params)\r\n\tvoid glGetFinalCombinerInputParameterfvNV (GLenum variable, GLenum pname, GLfloat* params)\r\n\tvoid glGetFinalCombinerInputParameterivNV (GLenum variable, GLenum pname, GLint* params)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_register_combiners2",
    "content": "GL_NV_register_combiners2\r\nhttp://www.opengl.org/registry/specs/NV/register_combiners2.txt\r\n\tGL_PER_STAGE_CONSTANTS_NV 0x8535\r\n\tvoid glCombinerStageParameterfvNV (GLenum stage, GLenum pname, const GLfloat* params)\r\n\tvoid glGetCombinerStageParameterfvNV (GLenum stage, GLenum pname, GLfloat* params)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_shader_buffer_load",
    "content": "GL_NV_shader_buffer_load\r\nhttp://www.opengl.org/registry/specs/NV/shader_buffer_load.txt\r\n\tGL_BUFFER_GPU_ADDRESS_NV 0x8F1D\r\n\tGL_GPU_ADDRESS_NV 0x8F34\r\n\tGL_MAX_SHADER_BUFFER_ADDRESS_NV 0x8F35\r\n\tvoid glGetBufferParameterui64vNV (GLenum target, GLenum pname, GLuint64EXT* params)\r\n\tvoid glGetIntegerui64vNV (GLenum value, GLuint64EXT* result)\r\n\tvoid glGetNamedBufferParameterui64vNV (GLuint buffer, GLenum pname, GLuint64EXT* params)\r\n\tvoid glGetUniformui64vNV (GLuint program, GLint location, GLuint64EXT* params)\r\n\tGLboolean glIsBufferResidentNV (GLenum target)\r\n\tGLboolean glIsNamedBufferResidentNV (GLuint buffer)\r\n\tvoid glMakeBufferNonResidentNV (GLenum target)\r\n\tvoid glMakeBufferResidentNV (GLenum target, GLenum access)\r\n\tvoid glMakeNamedBufferNonResidentNV (GLuint buffer)\r\n\tvoid glMakeNamedBufferResidentNV (GLuint buffer, GLenum access)\r\n\tvoid glProgramUniformui64NV (GLuint program, GLint location, GLuint64EXT value)\r\n\tvoid glProgramUniformui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value)\r\n\tvoid glUniformui64NV (GLint location, GLuint64EXT value)\r\n\tvoid glUniformui64vNV (GLint location, GLsizei count, const GLuint64EXT* value)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_texgen_emboss",
    "content": "GL_NV_texgen_emboss\r\nhttp://www.opengl.org/registry/specs/NV/texgen_emboss.txt\r\n\tGL_EMBOSS_LIGHT_NV 0x855D\r\n\tGL_EMBOSS_CONSTANT_NV 0x855E\r\n\tGL_EMBOSS_MAP_NV 0x855F\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_texgen_reflection",
    "content": "GL_NV_texgen_reflection\r\nhttp://www.opengl.org/registry/specs/NV/texgen_reflection.txt\r\n\tGL_NORMAL_MAP_NV 0x8511\r\n\tGL_REFLECTION_MAP_NV 0x8512\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_texture_barrier",
    "content": "GL_NV_texture_barrier\r\nhttp://www.opengl.org/registry/specs/NV/texture_barrier.txt\r\n\tvoid glTextureBarrierNV (void)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_texture_compression_vtc",
    "content": "GL_NV_texture_compression_vtc\r\nhttp://www.opengl.org/registry/specs/NV/texture_compression_vtc.txt\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_texture_env_combine4",
    "content": "GL_NV_texture_env_combine4\r\nhttp://www.opengl.org/registry/specs/NV/texture_env_combine4.txt\r\n\tGL_COMBINE4_NV 0x8503\r\n\tGL_SOURCE3_RGB_NV 0x8583\r\n\tGL_SOURCE3_ALPHA_NV 0x858B\r\n\tGL_OPERAND3_RGB_NV 0x8593\r\n\tGL_OPERAND3_ALPHA_NV 0x859B\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_texture_expand_normal",
    "content": "GL_NV_texture_expand_normal\r\nhttp://www.opengl.org/registry/specs/NV/texture_expand_normal.txt\r\n\tGL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_texture_rectangle",
    "content": "GL_NV_texture_rectangle\r\nhttp://www.opengl.org/registry/specs/NV/texture_rectangle.txt\r\n\tGL_TEXTURE_RECTANGLE_NV 0x84F5\r\n\tGL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6\r\n\tGL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7\r\n\tGL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_texture_shader",
    "content": "GL_NV_texture_shader\r\nhttp://www.opengl.org/registry/specs/NV/texture_shader.txt\r\n\tGL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C\r\n\tGL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D\r\n\tGL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E\r\n\tGL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9\r\n\tGL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA\r\n\tGL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB\r\n\tGL_DSDT_MAG_INTENSITY_NV 0x86DC\r\n\tGL_SHADER_CONSISTENT_NV 0x86DD\r\n\tGL_TEXTURE_SHADER_NV 0x86DE\r\n\tGL_SHADER_OPERATION_NV 0x86DF\r\n\tGL_CULL_MODES_NV 0x86E0\r\n\tGL_OFFSET_TEXTURE_MATRIX_NV 0x86E1\r\n\tGL_OFFSET_TEXTURE_SCALE_NV 0x86E2\r\n\tGL_OFFSET_TEXTURE_BIAS_NV 0x86E3\r\n\tGL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4\r\n\tGL_CONST_EYE_NV 0x86E5\r\n\tGL_PASS_THROUGH_NV 0x86E6\r\n\tGL_CULL_FRAGMENT_NV 0x86E7\r\n\tGL_OFFSET_TEXTURE_2D_NV 0x86E8\r\n\tGL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9\r\n\tGL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA\r\n\tGL_DOT_PRODUCT_NV 0x86EC\r\n\tGL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED\r\n\tGL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE\r\n\tGL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0\r\n\tGL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1\r\n\tGL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2\r\n\tGL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3\r\n\tGL_HILO_NV 0x86F4\r\n\tGL_DSDT_NV 0x86F5\r\n\tGL_DSDT_MAG_NV 0x86F6\r\n\tGL_DSDT_MAG_VIB_NV 0x86F7\r\n\tGL_HILO16_NV 0x86F8\r\n\tGL_SIGNED_HILO_NV 0x86F9\r\n\tGL_SIGNED_HILO16_NV 0x86FA\r\n\tGL_SIGNED_RGBA_NV 0x86FB\r\n\tGL_SIGNED_RGBA8_NV 0x86FC\r\n\tGL_SIGNED_RGB_NV 0x86FE\r\n\tGL_SIGNED_RGB8_NV 0x86FF\r\n\tGL_SIGNED_LUMINANCE_NV 0x8701\r\n\tGL_SIGNED_LUMINANCE8_NV 0x8702\r\n\tGL_SIGNED_LUMINANCE_ALPHA_NV 0x8703\r\n\tGL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704\r\n\tGL_SIGNED_ALPHA_NV 0x8705\r\n\tGL_SIGNED_ALPHA8_NV 0x8706\r\n\tGL_SIGNED_INTENSITY_NV 0x8707\r\n\tGL_SIGNED_INTENSITY8_NV 0x8708\r\n\tGL_DSDT8_NV 0x8709\r\n\tGL_DSDT8_MAG8_NV 0x870A\r\n\tGL_DSDT8_MAG8_INTENSITY8_NV 0x870B\r\n\tGL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C\r\n\tGL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D\r\n\tGL_HI_SCALE_NV 0x870E\r\n\tGL_LO_SCALE_NV 0x870F\r\n\tGL_DS_SCALE_NV 0x8710\r\n\tGL_DT_SCALE_NV 0x8711\r\n\tGL_MAGNITUDE_SCALE_NV 0x8712\r\n\tGL_VIBRANCE_SCALE_NV 0x8713\r\n\tGL_HI_BIAS_NV 0x8714\r\n\tGL_LO_BIAS_NV 0x8715\r\n\tGL_DS_BIAS_NV 0x8716\r\n\tGL_DT_BIAS_NV 0x8717\r\n\tGL_MAGNITUDE_BIAS_NV 0x8718\r\n\tGL_VIBRANCE_BIAS_NV 0x8719\r\n\tGL_TEXTURE_BORDER_VALUES_NV 0x871A\r\n\tGL_TEXTURE_HI_SIZE_NV 0x871B\r\n\tGL_TEXTURE_LO_SIZE_NV 0x871C\r\n\tGL_TEXTURE_DS_SIZE_NV 0x871D\r\n\tGL_TEXTURE_DT_SIZE_NV 0x871E\r\n\tGL_TEXTURE_MAG_SIZE_NV 0x871F\r\n\tGL_OFFSET_TEXTURE_2D_MATRIX_NV 0x86E1\r\n\tGL_OFFSET_TEXTURE_2D_BIAS_NV 0x86E3\r\n\tGL_OFFSET_TEXTURE_2D_SCALE_NV 0x86E2\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_texture_shader2",
    "content": "GL_NV_texture_shader2\r\nhttp://www.opengl.org/registry/specs/NV/texture_shader2.txt\r\n\tGL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA\r\n\tGL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB\r\n\tGL_DSDT_MAG_INTENSITY_NV 0x86DC\r\n\tGL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF\r\n\tGL_HILO_NV 0x86F4\r\n\tGL_DSDT_NV 0x86F5\r\n\tGL_DSDT_MAG_NV 0x86F6\r\n\tGL_DSDT_MAG_VIB_NV 0x86F7\r\n\tGL_HILO16_NV 0x86F8\r\n\tGL_SIGNED_HILO_NV 0x86F9\r\n\tGL_SIGNED_HILO16_NV 0x86FA\r\n\tGL_SIGNED_RGBA_NV 0x86FB\r\n\tGL_SIGNED_RGBA8_NV 0x86FC\r\n\tGL_SIGNED_RGB_NV 0x86FE\r\n\tGL_SIGNED_RGB8_NV 0x86FF\r\n\tGL_SIGNED_LUMINANCE_NV 0x8701\r\n\tGL_SIGNED_LUMINANCE8_NV 0x8702\r\n\tGL_SIGNED_LUMINANCE_ALPHA_NV 0x8703\r\n\tGL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704\r\n\tGL_SIGNED_ALPHA_NV 0x8705\r\n\tGL_SIGNED_ALPHA8_NV 0x8706\r\n\tGL_SIGNED_INTENSITY_NV 0x8707\r\n\tGL_SIGNED_INTENSITY8_NV 0x8708\r\n\tGL_DSDT8_NV 0x8709\r\n\tGL_DSDT8_MAG8_NV 0x870A\r\n\tGL_DSDT8_MAG8_INTENSITY8_NV 0x870B\r\n\tGL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C\r\n\tGL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_texture_shader3",
    "content": "GL_NV_texture_shader3\r\nhttp://www.opengl.org/registry/specs/NV/texture_shader3.txt\r\n\tGL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850\r\n\tGL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851\r\n\tGL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852\r\n\tGL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853\r\n\tGL_OFFSET_HILO_TEXTURE_2D_NV 0x8854\r\n\tGL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855\r\n\tGL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856\r\n\tGL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857\r\n\tGL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858\r\n\tGL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859\r\n\tGL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A\r\n\tGL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B\r\n\tGL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C\r\n\tGL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D\r\n\tGL_HILO8_NV 0x885E\r\n\tGL_SIGNED_HILO8_NV 0x885F\r\n\tGL_FORCE_BLUE_TO_ONE_NV 0x8860\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_transform_feedback",
    "content": "GL_NV_transform_feedback\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_NV_transform_feedback.txt\r\n\tGL_BACK_PRIMARY_COLOR_NV 0x8C77\r\n\tGL_BACK_SECONDARY_COLOR_NV 0x8C78\r\n\tGL_TEXTURE_COORD_NV 0x8C79\r\n\tGL_CLIP_DISTANCE_NV 0x8C7A\r\n\tGL_VERTEX_ID_NV 0x8C7B\r\n\tGL_PRIMITIVE_ID_NV 0x8C7C\r\n\tGL_GENERIC_ATTRIB_NV 0x8C7D\r\n\tGL_TRANSFORM_FEEDBACK_ATTRIBS_NV 0x8C7E\r\n\tGL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV 0x8C7F\r\n\tGL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV 0x8C80\r\n\tGL_ACTIVE_VARYINGS_NV 0x8C81\r\n\tGL_ACTIVE_VARYING_MAX_LENGTH_NV 0x8C82\r\n\tGL_TRANSFORM_FEEDBACK_VARYINGS_NV 0x8C83\r\n\tGL_TRANSFORM_FEEDBACK_BUFFER_START_NV 0x8C84\r\n\tGL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV 0x8C85\r\n\tGL_TRANSFORM_FEEDBACK_RECORD_NV 0x8C86\r\n\tGL_PRIMITIVES_GENERATED_NV 0x8C87\r\n\tGL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV 0x8C88\r\n\tGL_RASTERIZER_DISCARD_NV 0x8C89\r\n\tGL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV 0x8C8A\r\n\tGL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV 0x8C8B\r\n\tGL_INTERLEAVED_ATTRIBS_NV 0x8C8C\r\n\tGL_SEPARATE_ATTRIBS_NV 0x8C8D\r\n\tGL_TRANSFORM_FEEDBACK_BUFFER_NV 0x8C8E\r\n\tGL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV 0x8C8F\r\n\tvoid glBeginTransformFeedbackNV (GLenum primitiveMode)\r\n\tvoid glEndTransformFeedbackNV (void)\r\n\tvoid glTransformFeedbackAttribsNV (GLuint count, const GLint *attribs, GLenum bufferMode)\r\n\tvoid glBindBufferRangeNV (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)\r\n\tvoid glBindBufferOffsetNV (GLenum target, GLuint index, GLuint buffer, GLintptr offset)\r\n\tvoid glBindBufferBaseNV (GLenum target, GLuint index, GLuint buffer)\r\n\tvoid glTransformFeedbackVaryingsNV (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode)\r\n\tvoid glActiveVaryingNV (GLuint program, const GLchar *name)\r\n\tGLint glGetVaryingLocationNV (GLuint program, const GLchar *name)\r\n\tvoid glGetActiveVaryingNV (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)\r\n\tvoid glGetTransformFeedbackVaryingNV (GLuint program, GLuint index, GLint *location)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_transform_feedback2",
    "content": "GL_NV_transform_feedback2\r\nhttp://www.opengl.org/registry/specs/NV/transform_feedback2.txt\r\n\tGL_TRANSFORM_FEEDBACK_NV 0x8E22\r\n\tGL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV 0x8E23\r\n\tGL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV 0x8E24\r\n\tGL_TRANSFORM_FEEDBACK_BINDING_NV 0x8E25\r\n\tvoid glBindTransformFeedbackNV (GLenum target, GLuint id)\r\n\tvoid glDeleteTransformFeedbacksNV (GLsizei n, const GLuint* ids)\r\n\tvoid glDrawTransformFeedbackNV (GLenum mode, GLuint id)\r\n\tvoid glGenTransformFeedbacksNV (GLsizei n, GLuint* ids)\r\n\tGLboolean glIsTransformFeedbackNV (GLuint id)\r\n\tvoid glPauseTransformFeedbackNV (void)\r\n\tvoid glResumeTransformFeedbackNV (void)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_vertex_array_range",
    "content": "GL_NV_vertex_array_range\r\nhttp://www.opengl.org/registry/specs/NV/vertex_array_range.txt\r\n\tGL_VERTEX_ARRAY_RANGE_NV 0x851D\r\n\tGL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E\r\n\tGL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F\r\n\tGL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520\r\n\tGL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521\r\n\tvoid glFlushVertexArrayRangeNV (void)\r\n\tvoid glVertexArrayRangeNV (GLsizei length, void* pointer)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_vertex_array_range2",
    "content": "GL_NV_vertex_array_range2\r\nhttp://www.opengl.org/registry/specs/NV/vertex_array_range2.txt\r\n\tGL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_vertex_buffer_unified_memory",
    "content": "GL_NV_vertex_buffer_unified_memory\r\nhttp://www.opengl.org/registry/specs/NV/vertex_buffer_unified_memory.txt\r\n\tGL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV 0x8F1E\r\n\tGL_ELEMENT_ARRAY_UNIFIED_NV 0x8F1F\r\n\tGL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV 0x8F20\r\n\tGL_VERTEX_ARRAY_ADDRESS_NV 0x8F21\r\n\tGL_NORMAL_ARRAY_ADDRESS_NV 0x8F22\r\n\tGL_COLOR_ARRAY_ADDRESS_NV 0x8F23\r\n\tGL_INDEX_ARRAY_ADDRESS_NV 0x8F24\r\n\tGL_TEXTURE_COORD_ARRAY_ADDRESS_NV 0x8F25\r\n\tGL_EDGE_FLAG_ARRAY_ADDRESS_NV 0x8F26\r\n\tGL_SECONDARY_COLOR_ARRAY_ADDRESS_NV 0x8F27\r\n\tGL_FOG_COORD_ARRAY_ADDRESS_NV 0x8F28\r\n\tGL_ELEMENT_ARRAY_ADDRESS_NV 0x8F29\r\n\tGL_VERTEX_ATTRIB_ARRAY_LENGTH_NV 0x8F2A\r\n\tGL_VERTEX_ARRAY_LENGTH_NV 0x8F2B\r\n\tGL_NORMAL_ARRAY_LENGTH_NV 0x8F2C\r\n\tGL_COLOR_ARRAY_LENGTH_NV 0x8F2D\r\n\tGL_INDEX_ARRAY_LENGTH_NV 0x8F2E\r\n\tGL_TEXTURE_COORD_ARRAY_LENGTH_NV 0x8F2F\r\n\tGL_EDGE_FLAG_ARRAY_LENGTH_NV 0x8F30\r\n\tGL_SECONDARY_COLOR_ARRAY_LENGTH_NV 0x8F31\r\n\tGL_FOG_COORD_ARRAY_LENGTH_NV 0x8F32\r\n\tGL_ELEMENT_ARRAY_LENGTH_NV 0x8F33\r\n\tvoid glBufferAddressRangeNV (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length)\r\n\tvoid glColorFormatNV (GLint size, GLenum type, GLsizei stride)\r\n\tvoid glEdgeFlagFormatNV (GLsizei stride)\r\n\tvoid glFogCoordFormatNV (GLenum type, GLsizei stride)\r\n\tvoid glGetIntegerui64i_vNV (GLenum value, GLuint index, GLuint64EXT result[])\r\n\tvoid glIndexFormatNV (GLenum type, GLsizei stride)\r\n\tvoid glNormalFormatNV (GLenum type, GLsizei stride)\r\n\tvoid glSecondaryColorFormatNV (GLint size, GLenum type, GLsizei stride)\r\n\tvoid glTexCoordFormatNV (GLint size, GLenum type, GLsizei stride)\r\n\tvoid glVertexAttribFormatNV (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride)\r\n\tvoid glVertexAttribIFormatNV (GLuint index, GLint size, GLenum type, GLsizei stride)\r\n\tvoid glVertexFormatNV (GLint size, GLenum type, GLsizei stride)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_vertex_program",
    "content": "GL_NV_vertex_program\r\nhttp://www.opengl.org/registry/specs/NV/vertex_program.txt\r\n\tGL_VERTEX_PROGRAM_NV 0x8620\r\n\tGL_VERTEX_STATE_PROGRAM_NV 0x8621\r\n\tGL_ATTRIB_ARRAY_SIZE_NV 0x8623\r\n\tGL_ATTRIB_ARRAY_STRIDE_NV 0x8624\r\n\tGL_ATTRIB_ARRAY_TYPE_NV 0x8625\r\n\tGL_CURRENT_ATTRIB_NV 0x8626\r\n\tGL_PROGRAM_LENGTH_NV 0x8627\r\n\tGL_PROGRAM_STRING_NV 0x8628\r\n\tGL_MODELVIEW_PROJECTION_NV 0x8629\r\n\tGL_IDENTITY_NV 0x862A\r\n\tGL_INVERSE_NV 0x862B\r\n\tGL_TRANSPOSE_NV 0x862C\r\n\tGL_INVERSE_TRANSPOSE_NV 0x862D\r\n\tGL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E\r\n\tGL_MAX_TRACK_MATRICES_NV 0x862F\r\n\tGL_MATRIX0_NV 0x8630\r\n\tGL_MATRIX1_NV 0x8631\r\n\tGL_MATRIX2_NV 0x8632\r\n\tGL_MATRIX3_NV 0x8633\r\n\tGL_MATRIX4_NV 0x8634\r\n\tGL_MATRIX5_NV 0x8635\r\n\tGL_MATRIX6_NV 0x8636\r\n\tGL_MATRIX7_NV 0x8637\r\n\tGL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640\r\n\tGL_CURRENT_MATRIX_NV 0x8641\r\n\tGL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642\r\n\tGL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643\r\n\tGL_PROGRAM_PARAMETER_NV 0x8644\r\n\tGL_ATTRIB_ARRAY_POINTER_NV 0x8645\r\n\tGL_PROGRAM_TARGET_NV 0x8646\r\n\tGL_PROGRAM_RESIDENT_NV 0x8647\r\n\tGL_TRACK_MATRIX_NV 0x8648\r\n\tGL_TRACK_MATRIX_TRANSFORM_NV 0x8649\r\n\tGL_VERTEX_PROGRAM_BINDING_NV 0x864A\r\n\tGL_PROGRAM_ERROR_POSITION_NV 0x864B\r\n\tGL_VERTEX_ATTRIB_ARRAY0_NV 0x8650\r\n\tGL_VERTEX_ATTRIB_ARRAY1_NV 0x8651\r\n\tGL_VERTEX_ATTRIB_ARRAY2_NV 0x8652\r\n\tGL_VERTEX_ATTRIB_ARRAY3_NV 0x8653\r\n\tGL_VERTEX_ATTRIB_ARRAY4_NV 0x8654\r\n\tGL_VERTEX_ATTRIB_ARRAY5_NV 0x8655\r\n\tGL_VERTEX_ATTRIB_ARRAY6_NV 0x8656\r\n\tGL_VERTEX_ATTRIB_ARRAY7_NV 0x8657\r\n\tGL_VERTEX_ATTRIB_ARRAY8_NV 0x8658\r\n\tGL_VERTEX_ATTRIB_ARRAY9_NV 0x8659\r\n\tGL_VERTEX_ATTRIB_ARRAY10_NV 0x865A\r\n\tGL_VERTEX_ATTRIB_ARRAY11_NV 0x865B\r\n\tGL_VERTEX_ATTRIB_ARRAY12_NV 0x865C\r\n\tGL_VERTEX_ATTRIB_ARRAY13_NV 0x865D\r\n\tGL_VERTEX_ATTRIB_ARRAY14_NV 0x865E\r\n\tGL_VERTEX_ATTRIB_ARRAY15_NV 0x865F\r\n\tGL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660\r\n\tGL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661\r\n\tGL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662\r\n\tGL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663\r\n\tGL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664\r\n\tGL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665\r\n\tGL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666\r\n\tGL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667\r\n\tGL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668\r\n\tGL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669\r\n\tGL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A\r\n\tGL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B\r\n\tGL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C\r\n\tGL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D\r\n\tGL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E\r\n\tGL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F\r\n\tGL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670\r\n\tGL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671\r\n\tGL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672\r\n\tGL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673\r\n\tGL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674\r\n\tGL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675\r\n\tGL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676\r\n\tGL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677\r\n\tGL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678\r\n\tGL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679\r\n\tGL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A\r\n\tGL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B\r\n\tGL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C\r\n\tGL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D\r\n\tGL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E\r\n\tGL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F\r\n\tGLboolean glAreProgramsResidentNV (GLsizei n, const GLuint* ids, GLboolean *residences)\r\n\tvoid glBindProgramNV (GLenum target, GLuint id)\r\n\tvoid glDeleteProgramsNV (GLsizei n, const GLuint* ids)\r\n\tvoid glExecuteProgramNV (GLenum target, GLuint id, const GLfloat* params)\r\n\tvoid glGenProgramsNV (GLsizei n, GLuint* ids)\r\n\tvoid glGetProgramParameterdvNV (GLenum target, GLuint index, GLenum pname, GLdouble* params)\r\n\tvoid glGetProgramParameterfvNV (GLenum target, GLuint index, GLenum pname, GLfloat* params)\r\n\tvoid glGetProgramStringNV (GLuint id, GLenum pname, GLubyte* program)\r\n\tvoid glGetProgramivNV (GLuint id, GLenum pname, GLint* params)\r\n\tvoid glGetTrackMatrixivNV (GLenum target, GLuint address, GLenum pname, GLint* params)\r\n\tvoid glGetVertexAttribPointervNV (GLuint index, GLenum pname, GLvoid** pointer)\r\n\tvoid glGetVertexAttribdvNV (GLuint index, GLenum pname, GLdouble* params)\r\n\tvoid glGetVertexAttribfvNV (GLuint index, GLenum pname, GLfloat* params)\r\n\tvoid glGetVertexAttribivNV (GLuint index, GLenum pname, GLint* params)\r\n\tGLboolean glIsProgramNV (GLuint id)\r\n\tvoid glLoadProgramNV (GLenum target, GLuint id, GLsizei len, const GLubyte* program)\r\n\tvoid glProgramParameter4dNV (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)\r\n\tvoid glProgramParameter4dvNV (GLenum target, GLuint index, const GLdouble* params)\r\n\tvoid glProgramParameter4fNV (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)\r\n\tvoid glProgramParameter4fvNV (GLenum target, GLuint index, const GLfloat* params)\r\n\tvoid glProgramParameters4dvNV (GLenum target, GLuint index, GLuint num, const GLdouble* params)\r\n\tvoid glProgramParameters4fvNV (GLenum target, GLuint index, GLuint num, const GLfloat* params)\r\n\tvoid glRequestResidentProgramsNV (GLsizei n, GLuint* ids)\r\n\tvoid glTrackMatrixNV (GLenum target, GLuint address, GLenum matrix, GLenum transform)\r\n\tvoid glVertexAttrib1dNV (GLuint index, GLdouble x)\r\n\tvoid glVertexAttrib1dvNV (GLuint index, const GLdouble* v)\r\n\tvoid glVertexAttrib1fNV (GLuint index, GLfloat x)\r\n\tvoid glVertexAttrib1fvNV (GLuint index, const GLfloat* v)\r\n\tvoid glVertexAttrib1sNV (GLuint index, GLshort x)\r\n\tvoid glVertexAttrib1svNV (GLuint index, const GLshort* v)\r\n\tvoid glVertexAttrib2dNV (GLuint index, GLdouble x, GLdouble y)\r\n\tvoid glVertexAttrib2dvNV (GLuint index, const GLdouble* v)\r\n\tvoid glVertexAttrib2fNV (GLuint index, GLfloat x, GLfloat y)\r\n\tvoid glVertexAttrib2fvNV (GLuint index, const GLfloat* v)\r\n\tvoid glVertexAttrib2sNV (GLuint index, GLshort x, GLshort y)\r\n\tvoid glVertexAttrib2svNV (GLuint index, const GLshort* v)\r\n\tvoid glVertexAttrib3dNV (GLuint index, GLdouble x, GLdouble y, GLdouble z)\r\n\tvoid glVertexAttrib3dvNV (GLuint index, const GLdouble* v)\r\n\tvoid glVertexAttrib3fNV (GLuint index, GLfloat x, GLfloat y, GLfloat z)\r\n\tvoid glVertexAttrib3fvNV (GLuint index, const GLfloat* v)\r\n\tvoid glVertexAttrib3sNV (GLuint index, GLshort x, GLshort y, GLshort z)\r\n\tvoid glVertexAttrib3svNV (GLuint index, const GLshort* v)\r\n\tvoid glVertexAttrib4dNV (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)\r\n\tvoid glVertexAttrib4dvNV (GLuint index, const GLdouble* v)\r\n\tvoid glVertexAttrib4fNV (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)\r\n\tvoid glVertexAttrib4fvNV (GLuint index, const GLfloat* v)\r\n\tvoid glVertexAttrib4sNV (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)\r\n\tvoid glVertexAttrib4svNV (GLuint index, const GLshort* v)\r\n\tvoid glVertexAttrib4ubNV (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)\r\n\tvoid glVertexAttrib4ubvNV (GLuint index, const GLubyte* v)\r\n\tvoid glVertexAttribPointerNV (GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer)\r\n\tvoid glVertexAttribs1dvNV (GLuint index, GLsizei n, const GLdouble* v)\r\n\tvoid glVertexAttribs1fvNV (GLuint index, GLsizei n, const GLfloat* v)\r\n\tvoid glVertexAttribs1svNV (GLuint index, GLsizei n, const GLshort* v)\r\n\tvoid glVertexAttribs2dvNV (GLuint index, GLsizei n, const GLdouble* v)\r\n\tvoid glVertexAttribs2fvNV (GLuint index, GLsizei n, const GLfloat* v)\r\n\tvoid glVertexAttribs2svNV (GLuint index, GLsizei n, const GLshort* v)\r\n\tvoid glVertexAttribs3dvNV (GLuint index, GLsizei n, const GLdouble* v)\r\n\tvoid glVertexAttribs3fvNV (GLuint index, GLsizei n, const GLfloat* v)\r\n\tvoid glVertexAttribs3svNV (GLuint index, GLsizei n, const GLshort* v)\r\n\tvoid glVertexAttribs4dvNV (GLuint index, GLsizei n, const GLdouble* v)\r\n\tvoid glVertexAttribs4fvNV (GLuint index, GLsizei n, const GLfloat* v)\r\n\tvoid glVertexAttribs4svNV (GLuint index, GLsizei n, const GLshort* v)\r\n\tvoid glVertexAttribs4ubvNV (GLuint index, GLsizei n, const GLubyte* v)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_vertex_program1_1",
    "content": "GL_NV_vertex_program1_1\r\nhttp://www.opengl.org/registry/specs/NV/vertex_program1_1.txt\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_vertex_program2",
    "content": "GL_NV_vertex_program2\r\nhttp://www.opengl.org/registry/specs/NV/vertex_program2.txt\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_vertex_program2_option",
    "content": "GL_NV_vertex_program2_option\r\nhttp://www.nvidia.com/dev_content/nvopenglspecs/GL_NV_vertex_program2_option.txt\r\n\tGL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4\r\n\tGL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_vertex_program3",
    "content": "GL_NV_vertex_program3\r\nhttp://www.nvidia.com/dev_content/nvopenglspecs/GL_NV_vertex_program3.txt\r\n\tMAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_NV_vertex_program4",
    "content": "GL_NV_vertex_program4\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_NV_vertex_program4.txt\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_OES_byte_coordinates",
    "content": "GL_OES_byte_coordinates\r\nhttp://www.opengl.org/registry/specs/OES/OES_byte_coordinates.txt\r\n\tGL_BYTE 0x1400\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_OES_compressed_paletted_texture",
    "content": "GL_OES_compressed_paletted_texture\r\nhttp://www.opengl.org/registry/specs/OES/OES_compressed_paletted_texture.txt\r\n\tGL_PALETTE4_RGB8_OES 0x8B90\r\n\tGL_PALETTE4_RGBA8_OES 0x8B91\r\n\tGL_PALETTE4_R5_G6_B5_OES 0x8B92\r\n\tGL_PALETTE4_RGBA4_OES 0x8B93\r\n\tGL_PALETTE4_RGB5_A1_OES 0x8B94\r\n\tGL_PALETTE8_RGB8_OES 0x8B95\r\n\tGL_PALETTE8_RGBA8_OES 0x8B96\r\n\tGL_PALETTE8_R5_G6_B5_OES 0x8B97\r\n\tGL_PALETTE8_RGBA4_OES 0x8B98\r\n\tGL_PALETTE8_RGB5_A1_OES 0x8B99\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_OES_read_format",
    "content": "GL_OES_read_format\r\nhttp://www.opengl.org/registry/specs/OES/OES_read_format.txt\r\n\tGL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A\r\n\tGL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_OES_single_precision",
    "content": "GL_OES_single_precision\r\nhttp://www.opengl.org/registry/specs/OES/OES_single_precision.txt\r\n\tvoid glClearDepthfOES (GLclampd depth)\r\n\tvoid glClipPlanefOES (GLenum plane, const GLfloat* equation)\r\n\tvoid glDepthRangefOES (GLclampf n, GLclampf f)\r\n\tvoid glFrustumfOES (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f)\r\n\tvoid glGetClipPlanefOES (GLenum plane, GLfloat* equation)\r\n\tvoid glOrthofOES (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_OML_interlace",
    "content": "GL_OML_interlace\r\nhttp://www.opengl.org/registry/specs/OML/interlace.txt\r\n\tGL_INTERLACE_OML 0x8980\r\n\tGL_INTERLACE_READ_OML 0x8981\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_OML_resample",
    "content": "GL_OML_resample\r\nhttp://www.opengl.org/registry/specs/OML/resample.txt\r\n\tGL_PACK_RESAMPLE_OML 0x8984\r\n\tGL_UNPACK_RESAMPLE_OML 0x8985\r\n\tGL_RESAMPLE_REPLICATE_OML 0x8986\r\n\tGL_RESAMPLE_ZERO_FILL_OML 0x8987\r\n\tGL_RESAMPLE_AVERAGE_OML 0x8988\r\n\tGL_RESAMPLE_DECIMATE_OML 0x8989\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_OML_subsample",
    "content": "GL_OML_subsample\r\nhttp://www.opengl.org/registry/specs/OML/subsample.txt\r\n\tGL_FORMAT_SUBSAMPLE_24_24_OML 0x8982\r\n\tGL_FORMAT_SUBSAMPLE_244_244_OML 0x8983\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_PGI_misc_hints",
    "content": "GL_PGI_misc_hints\r\nhttp://www.opengl.org/registry/specs/PGI/misc_hints.txt\r\n\tGL_PREFER_DOUBLEBUFFER_HINT_PGI 107000\r\n\tGL_CONSERVE_MEMORY_HINT_PGI 107005\r\n\tGL_RECLAIM_MEMORY_HINT_PGI 107006\r\n\tGL_NATIVE_GRAPHICS_HANDLE_PGI 107010\r\n\tGL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 107011\r\n\tGL_NATIVE_GRAPHICS_END_HINT_PGI 107012\r\n\tGL_ALWAYS_FAST_HINT_PGI 107020\r\n\tGL_ALWAYS_SOFT_HINT_PGI 107021\r\n\tGL_ALLOW_DRAW_OBJ_HINT_PGI 107022\r\n\tGL_ALLOW_DRAW_WIN_HINT_PGI 107023\r\n\tGL_ALLOW_DRAW_FRG_HINT_PGI 107024\r\n\tGL_ALLOW_DRAW_MEM_HINT_PGI 107025\r\n\tGL_STRICT_DEPTHFUNC_HINT_PGI 107030\r\n\tGL_STRICT_LIGHTING_HINT_PGI 107031\r\n\tGL_STRICT_SCISSOR_HINT_PGI 107032\r\n\tGL_FULL_STIPPLE_HINT_PGI 107033\r\n\tGL_CLIP_NEAR_HINT_PGI 107040\r\n\tGL_CLIP_FAR_HINT_PGI 107041\r\n\tGL_WIDE_LINE_HINT_PGI 107042\r\n\tGL_BACK_NORMALS_HINT_PGI 107043\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_PGI_vertex_hints",
    "content": "GL_PGI_vertex_hints\r\nhttp://www.opengl.org/registry/specs/PGI/vertex_hints.txt\r\n\tGL_VERTEX23_BIT_PGI 0x00000004\r\n\tGL_VERTEX4_BIT_PGI 0x00000008\r\n\tGL_COLOR3_BIT_PGI 0x00010000\r\n\tGL_COLOR4_BIT_PGI 0x00020000\r\n\tGL_EDGEFLAG_BIT_PGI 0x00040000\r\n\tGL_INDEX_BIT_PGI 0x00080000\r\n\tGL_MAT_AMBIENT_BIT_PGI 0x00100000\r\n\tGL_VERTEX_DATA_HINT_PGI 107050\r\n\tGL_VERTEX_CONSISTENT_HINT_PGI 107051\r\n\tGL_MATERIAL_SIDE_HINT_PGI 107052\r\n\tGL_MAX_VERTEX_HINT_PGI 107053\r\n\tGL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000\r\n\tGL_MAT_DIFFUSE_BIT_PGI 0x00400000\r\n\tGL_MAT_EMISSION_BIT_PGI 0x00800000\r\n\tGL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000\r\n\tGL_MAT_SHININESS_BIT_PGI 0x02000000\r\n\tGL_MAT_SPECULAR_BIT_PGI 0x04000000\r\n\tGL_NORMAL_BIT_PGI 0x08000000\r\n\tGL_TEXCOORD1_BIT_PGI 0x10000000\r\n\tGL_TEXCOORD2_BIT_PGI 0x20000000\r\n\tGL_TEXCOORD3_BIT_PGI 0x40000000\r\n\tGL_TEXCOORD4_BIT_PGI 0x80000000\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_REND_screen_coordinates",
    "content": "GL_REND_screen_coordinates\r\nhttp://www.opengl.org/registry/specs/REND/screen_coordinates.txt\r\n\tGL_SCREEN_COORDINATES_REND 0x8490\r\n\tGL_INVERTED_SCREEN_W_REND 0x8491\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_S3_s3tc",
    "content": "GL_S3_s3tc\r\nhttp://www.opengl.org/registry/specs/S3/s3tc.txt\r\n\tGL_RGB_S3TC 0x83A0\r\n\tGL_RGB4_S3TC 0x83A1\r\n\tGL_RGBA_S3TC 0x83A2\r\n\tGL_RGBA4_S3TC 0x83A3\r\n\tGL_RGBA_DXT5_S3TC 0x83A4\r\n\tGL_RGBA4_DXT5_S3TC 0x83A5\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIS_color_range",
    "content": "GL_SGIS_color_range\r\nhttp://www.opengl.org/registry/specs/SGIS/color_range.txt\r\n\tGL_EXTENDED_RANGE_SGIS 0x85A5\r\n\tGL_MIN_RED_SGIS 0x85A6\r\n\tGL_MAX_RED_SGIS 0x85A7\r\n\tGL_MIN_GREEN_SGIS 0x85A8\r\n\tGL_MAX_GREEN_SGIS 0x85A9\r\n\tGL_MIN_BLUE_SGIS 0x85AA\r\n\tGL_MAX_BLUE_SGIS 0x85AB\r\n\tGL_MIN_ALPHA_SGIS 0x85AC\r\n\tGL_MAX_ALPHA_SGIS 0x85AD\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIS_detail_texture",
    "content": "GL_SGIS_detail_texture\r\nhttp://www.opengl.org/registry/specs/SGIS/detail_texture.txt\r\n\tvoid glDetailTexFuncSGIS (GLenum target, GLsizei n, const GLfloat* points)\r\n\tvoid glGetDetailTexFuncSGIS (GLenum target, GLfloat* points)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIS_fog_function",
    "content": "GL_SGIS_fog_function\r\nhttp://www.opengl.org/registry/specs/SGIS/fog_func.txt\r\n\tvoid glFogFuncSGIS (GLsizei n, const GLfloat* points)\r\n\tvoid glGetFogFuncSGIS (GLfloat* points)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIS_generate_mipmap",
    "content": "GL_SGIS_generate_mipmap\r\nhttp://www.opengl.org/registry/specs/SGIS/generate_mipmap.txt\r\n\tGL_GENERATE_MIPMAP_SGIS 0x8191\r\n\tGL_GENERATE_MIPMAP_HINT_SGIS 0x8192\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIS_multisample",
    "content": "GL_SGIS_multisample\r\nhttp://www.opengl.org/registry/specs/SGIS/multisample.txt\r\n\tGL_MULTISAMPLE_SGIS 0x809D\r\n\tGL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E\r\n\tGL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F\r\n\tGL_SAMPLE_MASK_SGIS 0x80A0\r\n\tGL_1PASS_SGIS 0x80A1\r\n\tGL_2PASS_0_SGIS 0x80A2\r\n\tGL_2PASS_1_SGIS 0x80A3\r\n\tGL_4PASS_0_SGIS 0x80A4\r\n\tGL_4PASS_1_SGIS 0x80A5\r\n\tGL_4PASS_2_SGIS 0x80A6\r\n\tGL_4PASS_3_SGIS 0x80A7\r\n\tGL_SAMPLE_BUFFERS_SGIS 0x80A8\r\n\tGL_SAMPLES_SGIS 0x80A9\r\n\tGL_SAMPLE_MASK_VALUE_SGIS 0x80AA\r\n\tGL_SAMPLE_MASK_INVERT_SGIS 0x80AB\r\n\tGL_SAMPLE_PATTERN_SGIS 0x80AC\r\n\tGL_MULTISAMPLE_BIT_EXT 0x20000000\r\n\tvoid glSampleMaskSGIS (GLclampf value, GLboolean invert)\r\n\tvoid glSamplePatternSGIS (GLenum pattern)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIS_pixel_texture",
    "content": "GL_SGIS_pixel_texture\r\nhttp://www.opengl.org/registry/specs/SGIS/pixel_texture.txt\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIS_point_line_texgen",
    "content": "GL_SGIS_point_line_texgen\r\nhttp://www.opengl.org/registry/specs/SGIS/point_line_texgen.txt\r\n\tGL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0\r\n\tGL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1\r\n\tGL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2\r\n\tGL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3\r\n\tGL_EYE_POINT_SGIS 0x81F4\r\n\tGL_OBJECT_POINT_SGIS 0x81F5\r\n\tGL_EYE_LINE_SGIS 0x81F6\r\n\tGL_OBJECT_LINE_SGIS 0x81F7\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIS_sharpen_texture",
    "content": "GL_SGIS_sharpen_texture\r\nhttp://www.opengl.org/registry/specs/SGIS/sharpen_texture.txt\r\n\tvoid glGetSharpenTexFuncSGIS (GLenum target, GLfloat* points)\r\n\tvoid glSharpenTexFuncSGIS (GLenum target, GLsizei n, const GLfloat* points)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIS_texture4D",
    "content": "GL_SGIS_texture4D\r\nhttp://www.opengl.org/registry/specs/SGIS/texture4D.txt\r\n\tvoid glTexImage4DSGIS (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei extent, GLint border, GLenum format, GLenum type, const void* pixels)\r\n\tvoid glTexSubImage4DSGIS (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei extent, GLenum format, GLenum type, const void* pixels)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIS_texture_border_clamp",
    "content": "GL_SGIS_texture_border_clamp\r\nhttp://www.opengl.org/registry/specs/SGIS/texture_border_clamp.txt\r\n\tGL_CLAMP_TO_BORDER_SGIS 0x812D\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIS_texture_edge_clamp",
    "content": "GL_SGIS_texture_edge_clamp\r\nhttp://www.opengl.org/registry/specs/SGIS/texture_edge_clamp.txt\r\n\tGL_CLAMP_TO_EDGE_SGIS 0x812F\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIS_texture_filter4",
    "content": "GL_SGIS_texture_filter4\r\nhttp://www.opengl.org/registry/specs/SGIS/texture_filter4.txt\r\n\tvoid glGetTexFilterFuncSGIS (GLenum target, GLenum filter, GLfloat* weights)\r\n\tvoid glTexFilterFuncSGIS (GLenum target, GLenum filter, GLsizei n, const GLfloat* weights)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIS_texture_lod",
    "content": "GL_SGIS_texture_lod\r\nhttp://www.opengl.org/registry/specs/SGIS/texture_lod.txt\r\n\tGL_TEXTURE_MIN_LOD_SGIS 0x813A\r\n\tGL_TEXTURE_MAX_LOD_SGIS 0x813B\r\n\tGL_TEXTURE_BASE_LEVEL_SGIS 0x813C\r\n\tGL_TEXTURE_MAX_LEVEL_SGIS 0x813D\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIS_texture_select",
    "content": "GL_SGIS_texture_select\r\nhttp://www.opengl.org/registry/specs/SGIS/texture_select.txt\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIX_async",
    "content": "GL_SGIX_async\r\nhttp://www.opengl.org/registry/specs/SGIX/async.txt\r\n\tGL_ASYNC_MARKER_SGIX 0x8329\r\n\tvoid glAsyncMarkerSGIX (GLuint marker)\r\n\tvoid glDeleteAsyncMarkersSGIX (GLuint marker, GLsizei range)\r\n\tGLint glFinishAsyncSGIX (GLuint* markerp)\r\n\tGLuint glGenAsyncMarkersSGIX (GLsizei range)\r\n\tGLboolean glIsAsyncMarkerSGIX (GLuint marker)\r\n\tGLint glPollAsyncSGIX (GLuint* markerp)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIX_async_histogram",
    "content": "GL_SGIX_async_histogram\r\nhttp://www.opengl.org/registry/specs/SGIX/async_histogram.txt\r\n\tGL_ASYNC_HISTOGRAM_SGIX 0x832C\r\n\tGL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIX_async_pixel",
    "content": "GL_SGIX_async_pixel\r\nhttp://www.opengl.org/registry/specs/SGIX/async_pixel.txt\r\n\tGL_ASYNC_TEX_IMAGE_SGIX 0x835C\r\n\tGL_ASYNC_DRAW_PIXELS_SGIX 0x835D\r\n\tGL_ASYNC_READ_PIXELS_SGIX 0x835E\r\n\tGL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F\r\n\tGL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360\r\n\tGL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIX_blend_alpha_minmax",
    "content": "GL_SGIX_blend_alpha_minmax\r\nhttp://www.opengl.org/registry/specs/SGIX/blend_alpha_minmax.txt\r\n\tGL_ALPHA_MIN_SGIX 0x8320\r\n\tGL_ALPHA_MAX_SGIX 0x8321\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIX_clipmap",
    "content": "GL_SGIX_clipmap\r\nhttp://www.opengl.org/registry/specs/SGIX/clipmap.txt\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIX_convolution_accuracy",
    "content": "GL_SGIX_convolution_accuracy\r\nhttp://www.opengl.org/registry/specs/SGIX/convolution_accuracy.txt\r\n\tGL_CONVOLUTION_HINT_SGIX 0x8316\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIX_depth_texture",
    "content": "GL_SGIX_depth_texture\r\nhttp://www.opengl.org/registry/specs/SGIX/depth_texture.txt\r\n\tGL_DEPTH_COMPONENT16_SGIX 0x81A5\r\n\tGL_DEPTH_COMPONENT24_SGIX 0x81A6\r\n\tGL_DEPTH_COMPONENT32_SGIX 0x81A7\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIX_flush_raster",
    "content": "GL_SGIX_flush_raster\r\nhttp://www.opengl.org/registry/specs/SGIX/flush_raster.txt\r\n\tvoid glFlushRasterSGIX (void)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIX_fog_offset",
    "content": "GL_SGIX_fog_offset\r\nhttp://www.opengl.org/registry/specs/SGIX/fog_offset.txt\r\n\tGL_FOG_OFFSET_SGIX 0x8198\r\n\tGL_FOG_OFFSET_VALUE_SGIX 0x8199\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIX_fog_texture",
    "content": "GL_SGIX_fog_texture\r\nhttp://www.opengl.org/registry/specs/SGIX/fog_texture.txt\r\n\tGL_TEXTURE_FOG_SGIX 0\r\n\tGL_FOG_PATCHY_FACTOR_SGIX 0\r\n\tGL_FRAGMENT_FOG_SGIX 0\r\n\tvoid glTextureFogSGIX (GLenum pname)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIX_fragment_specular_lighting",
    "content": "GL_SGIX_fragment_specular_lighting\r\nhttp://www.opengl.org/registry/specs/SGIX/fragment_specular_lighting.txt\r\n\tvoid glFragmentColorMaterialSGIX (GLenum face, GLenum mode)\r\n\tvoid glFragmentLightModelfSGIX (GLenum pname, GLfloat param)\r\n\tvoid glFragmentLightModelfvSGIX (GLenum pname, GLfloat* params)\r\n\tvoid glFragmentLightModeliSGIX (GLenum pname, GLint param)\r\n\tvoid glFragmentLightModelivSGIX (GLenum pname, GLint* params)\r\n\tvoid glFragmentLightfSGIX (GLenum light, GLenum pname, GLfloat param)\r\n\tvoid glFragmentLightfvSGIX (GLenum light, GLenum pname, GLfloat* params)\r\n\tvoid glFragmentLightiSGIX (GLenum light, GLenum pname, GLint param)\r\n\tvoid glFragmentLightivSGIX (GLenum light, GLenum pname, GLint* params)\r\n\tvoid glFragmentMaterialfSGIX (GLenum face, GLenum pname, const GLfloat param)\r\n\tvoid glFragmentMaterialfvSGIX (GLenum face, GLenum pname, const GLfloat* params)\r\n\tvoid glFragmentMaterialiSGIX (GLenum face, GLenum pname, const GLint param)\r\n\tvoid glFragmentMaterialivSGIX (GLenum face, GLenum pname, const GLint* params)\r\n\tvoid glGetFragmentLightfvSGIX (GLenum light, GLenum value, GLfloat* data)\r\n\tvoid glGetFragmentLightivSGIX (GLenum light, GLenum value, GLint* data)\r\n\tvoid glGetFragmentMaterialfvSGIX (GLenum face, GLenum pname, const GLfloat* data)\r\n\tvoid glGetFragmentMaterialivSGIX (GLenum face, GLenum pname, const GLint* data)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIX_framezoom",
    "content": "GL_SGIX_framezoom\r\nhttp://www.opengl.org/registry/specs/SGIX/framezoom.txt\r\n\tvoid glFrameZoomSGIX (GLint factor)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIX_interlace",
    "content": "GL_SGIX_interlace\r\nhttp://www.opengl.org/registry/specs/SGIX/interlace.txt\r\n\tGL_INTERLACE_SGIX 0x8094\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIX_ir_instrument1",
    "content": "GL_SGIX_ir_instrument1\r\nhttp://www.opengl.org/registry/specs/SGIX/ir_instrument1.txt\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIX_list_priority",
    "content": "GL_SGIX_list_priority\r\nhttp://www.opengl.org/registry/specs/SGIX/list_priority.txt\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIX_pixel_texture",
    "content": "GL_SGIX_pixel_texture\r\nhttp://www.opengl.org/registry/specs/SGIX/sgix_pixel_texture.txt\r\n\tvoid glPixelTexGenSGIX (GLenum mode)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIX_pixel_texture_bits",
    "content": "GL_SGIX_pixel_texture_bits\r\nhttp://www.opengl.org/registry/specs/SGIX/pixel_texture_bits.txt\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIX_reference_plane",
    "content": "GL_SGIX_reference_plane\r\nhttp://www.opengl.org/registry/specs/SGIX/reference_plane.txt\r\n\tvoid glReferencePlaneSGIX (const GLdouble* equation)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIX_resample",
    "content": "GL_SGIX_resample\r\nhttp://www.opengl.org/registry/specs/SGIX/resample.txt\r\n\tGL_PACK_RESAMPLE_SGIX 0x842E\r\n\tGL_UNPACK_RESAMPLE_SGIX 0x842F\r\n\tGL_RESAMPLE_DECIMATE_SGIX 0x8430\r\n\tGL_RESAMPLE_REPLICATE_SGIX 0x8433\r\n\tGL_RESAMPLE_ZERO_FILL_SGIX 0x8434\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIX_shadow",
    "content": "GL_SGIX_shadow\r\nhttp://oss.sgi.com/projects/ogl-sample/registry/SGIX/shadow.txt\r\n\tGL_TEXTURE_COMPARE_SGIX 0x819A\r\n\tGL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B\r\n\tGL_TEXTURE_LEQUAL_R_SGIX 0x819C\r\n\tGL_TEXTURE_GEQUAL_R_SGIX 0x819D\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIX_shadow_ambient",
    "content": "GL_SGIX_shadow_ambient\r\nhttp://www.opengl.org/registry/specs/SGIX/shadow_ambient.txt\r\n\tGL_SHADOW_AMBIENT_SGIX 0x80BF\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIX_sprite",
    "content": "GL_SGIX_sprite\r\nhttp://www.opengl.org/registry/specs/SGIX/sprite.txt\r\n\tvoid glSpriteParameterfSGIX (GLenum pname, GLfloat param)\r\n\tvoid glSpriteParameterfvSGIX (GLenum pname, GLfloat* params)\r\n\tvoid glSpriteParameteriSGIX (GLenum pname, GLint param)\r\n\tvoid glSpriteParameterivSGIX (GLenum pname, GLint* params)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIX_tag_sample_buffer",
    "content": "GL_SGIX_tag_sample_buffer\r\nhttp://www.opengl.org/registry/specs/SGIX/tag_sample_buffer.txt\r\n\tvoid glTagSampleBufferSGIX (void)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIX_texture_add_env",
    "content": "GL_SGIX_texture_add_env\r\nhttp://www.opengl.org/registry/specs/SGIX/texture_env_add.txt\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIX_texture_coordinate_clamp",
    "content": "GL_SGIX_texture_coordinate_clamp\r\nhttp://www.opengl.org/registry/specs/SGIX/texture_coordinate_clamp.txt\r\n\tGL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369\r\n\tGL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A\r\n\tGL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIX_texture_lod_bias",
    "content": "GL_SGIX_texture_lod_bias\r\nhttp://www.opengl.org/registry/specs/SGIX/texture_lod_bias.txt\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIX_texture_multi_buffer",
    "content": "GL_SGIX_texture_multi_buffer\r\nhttp://www.opengl.org/registry/specs/SGIX/texture_multi_buffer.txt\r\n\tGL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIX_texture_range",
    "content": "GL_SGIX_texture_range\r\nhttp://www.opengl.org/registry/specs/SGIX/texture_range.txt\r\n\tGL_RGB_SIGNED_SGIX 0x85E0\r\n\tGL_RGBA_SIGNED_SGIX 0x85E1\r\n\tGL_ALPHA_SIGNED_SGIX 0x85E2\r\n\tGL_LUMINANCE_SIGNED_SGIX 0x85E3\r\n\tGL_INTENSITY_SIGNED_SGIX 0x85E4\r\n\tGL_LUMINANCE_ALPHA_SIGNED_SGIX 0x85E5\r\n\tGL_RGB16_SIGNED_SGIX 0x85E6\r\n\tGL_RGBA16_SIGNED_SGIX 0x85E7\r\n\tGL_ALPHA16_SIGNED_SGIX 0x85E8\r\n\tGL_LUMINANCE16_SIGNED_SGIX 0x85E9\r\n\tGL_INTENSITY16_SIGNED_SGIX 0x85EA\r\n\tGL_LUMINANCE16_ALPHA16_SIGNED_SGIX 0x85EB\r\n\tGL_RGB_EXTENDED_RANGE_SGIX 0x85EC\r\n\tGL_RGBA_EXTENDED_RANGE_SGIX 0x85ED\r\n\tGL_ALPHA_EXTENDED_RANGE_SGIX 0x85EE\r\n\tGL_LUMINANCE_EXTENDED_RANGE_SGIX 0x85EF\r\n\tGL_INTENSITY_EXTENDED_RANGE_SGIX 0x85F0\r\n\tGL_LUMINANCE_ALPHA_EXTENDED_RANGE_SGIX 0x85F1\r\n\tGL_RGB16_EXTENDED_RANGE_SGIX 0x85F2\r\n\tGL_RGBA16_EXTENDED_RANGE_SGIX 0x85F3\r\n\tGL_ALPHA16_EXTENDED_RANGE_SGIX 0x85F4\r\n\tGL_LUMINANCE16_EXTENDED_RANGE_SGIX 0x85F5\r\n\tGL_INTENSITY16_EXTENDED_RANGE_SGIX 0x85F6\r\n\tGL_LUMINANCE16_ALPHA16_EXTENDED_RANGE_SGIX 0x85F7\r\n\tGL_MIN_LUMINANCE_SGIS 0x85F8\r\n\tGL_MAX_LUMINANCE_SGIS 0x85F9\r\n\tGL_MIN_INTENSITY_SGIS 0x85FA\r\n\tGL_MAX_INTENSITY_SGIS 0x85FB\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIX_texture_scale_bias",
    "content": "GL_SGIX_texture_scale_bias\r\nhttp://www.opengl.org/registry/specs/SGIX/texture_scale_bias.txt\r\n\tGL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179\r\n\tGL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A\r\n\tGL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B\r\n\tGL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIX_vertex_preclip",
    "content": "GL_SGIX_vertex_preclip\r\nhttp://www.opengl.org/registry/specs/SGIX/vertex_preclip.txt\r\n\tGL_VERTEX_PRECLIP_SGIX 0x83EE\r\n\tGL_VERTEX_PRECLIP_HINT_SGIX 0x83EF\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIX_vertex_preclip_hint",
    "content": "GL_SGIX_vertex_preclip_hint\r\nhttp://www.opengl.org/registry/specs/SGIX/vertex_preclip.txt\r\n\tGL_VERTEX_PRECLIP_SGIX 0x83EE\r\n\tGL_VERTEX_PRECLIP_HINT_SGIX 0x83EF\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGIX_ycrcb",
    "content": "GL_SGIX_ycrcb\r\nhttp://www.opengl.org/registry/specs/SGIX/ycrcb.txt\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGI_color_matrix",
    "content": "GL_SGI_color_matrix\r\nhttp://www.opengl.org/registry/specs/SGI/color_matrix.txt\r\n\tGL_COLOR_MATRIX_SGI 0x80B1\r\n\tGL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2\r\n\tGL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3\r\n\tGL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4\r\n\tGL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5\r\n\tGL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6\r\n\tGL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7\r\n\tGL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8\r\n\tGL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9\r\n\tGL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA\r\n\tGL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGI_color_table",
    "content": "GL_SGI_color_table\r\nhttp://www.opengl.org/registry/specs/SGI/color_table.txt\r\n\tGL_COLOR_TABLE_SGI 0x80D0\r\n\tGL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1\r\n\tGL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2\r\n\tGL_PROXY_COLOR_TABLE_SGI 0x80D3\r\n\tGL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4\r\n\tGL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5\r\n\tGL_COLOR_TABLE_SCALE_SGI 0x80D6\r\n\tGL_COLOR_TABLE_BIAS_SGI 0x80D7\r\n\tGL_COLOR_TABLE_FORMAT_SGI 0x80D8\r\n\tGL_COLOR_TABLE_WIDTH_SGI 0x80D9\r\n\tGL_COLOR_TABLE_RED_SIZE_SGI 0x80DA\r\n\tGL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB\r\n\tGL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC\r\n\tGL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD\r\n\tGL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE\r\n\tGL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF\r\n\tvoid glColorTableParameterfvSGI (GLenum target, GLenum pname, const GLfloat* params)\r\n\tvoid glColorTableParameterivSGI (GLenum target, GLenum pname, const GLint* params)\r\n\tvoid glColorTableSGI (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void* table)\r\n\tvoid glCopyColorTableSGI (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)\r\n\tvoid glGetColorTableParameterfvSGI (GLenum target, GLenum pname, GLfloat* params)\r\n\tvoid glGetColorTableParameterivSGI (GLenum target, GLenum pname, GLint* params)\r\n\tvoid glGetColorTableSGI (GLenum target, GLenum format, GLenum type, void* table)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SGI_texture_color_table",
    "content": "GL_SGI_texture_color_table\r\nhttp://www.opengl.org/registry/specs/SGI/texture_color_table.txt\r\n\tGL_TEXTURE_COLOR_TABLE_SGI 0x80BC\r\n\tGL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SUNX_constant_data",
    "content": "GL_SUNX_constant_data\r\nhttp://www.opengl.org/registry/specs/SUNX/constant_data.txt\r\n\tGL_UNPACK_CONSTANT_DATA_SUNX 0x81D5\r\n\tGL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6\r\n\tvoid glFinishTextureSUNX (void)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SUN_convolution_border_modes",
    "content": "GL_SUN_convolution_border_modes\r\nhttp://www.opengl.org/registry/specs/SUN/convolution_border_modes.txt\r\n\tGL_WRAP_BORDER_SUN 0x81D4\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SUN_global_alpha",
    "content": "GL_SUN_global_alpha\r\nhttp://www.opengl.org/registry/specs/SUN/global_alpha.txt\r\n\tGL_GLOBAL_ALPHA_SUN 0x81D9\r\n\tGL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA\r\n\tvoid glGlobalAlphaFactorbSUN (GLbyte factor)\r\n\tvoid glGlobalAlphaFactordSUN (GLdouble factor)\r\n\tvoid glGlobalAlphaFactorfSUN (GLfloat factor)\r\n\tvoid glGlobalAlphaFactoriSUN (GLint factor)\r\n\tvoid glGlobalAlphaFactorsSUN (GLshort factor)\r\n\tvoid glGlobalAlphaFactorubSUN (GLubyte factor)\r\n\tvoid glGlobalAlphaFactoruiSUN (GLuint factor)\r\n\tvoid glGlobalAlphaFactorusSUN (GLushort factor)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SUN_mesh_array",
    "content": "GL_SUN_mesh_array\r\nhttp://www.opengl.org/registry/specs/SUN/mesh_array.txt\r\n\tGL_QUAD_MESH_SUN 0x8614\r\n\tGL_TRIANGLE_MESH_SUN 0x8615\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SUN_read_video_pixels",
    "content": "GL_SUN_read_video_pixels\r\nhttp://wwws.sun.com/software/graphics/opengl/extensions/gl_sun_read_video_pixels.txt\r\n\tvoid glReadVideoPixelsSUN (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SUN_slice_accum",
    "content": "GL_SUN_slice_accum\r\nhttp://www.opengl.org/registry/specs/SUN/slice_accum.txt\r\n\tGL_SLICE_ACCUM_SUN 0x85CC\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SUN_triangle_list",
    "content": "GL_SUN_triangle_list\r\nhttp://www.opengl.org/registry/specs/SUN/triangle_list.txt\r\n\tGL_RESTART_SUN 0x01\r\n\tGL_REPLACE_MIDDLE_SUN 0x02\r\n\tGL_REPLACE_OLDEST_SUN 0x03\r\n\tGL_TRIANGLE_LIST_SUN 0x81D7\r\n\tGL_REPLACEMENT_CODE_SUN 0x81D8\r\n\tGL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0\r\n\tGL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1\r\n\tGL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2\r\n\tGL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3\r\n\tGL_R1UI_V3F_SUN 0x85C4\r\n\tGL_R1UI_C4UB_V3F_SUN 0x85C5\r\n\tGL_R1UI_C3F_V3F_SUN 0x85C6\r\n\tGL_R1UI_N3F_V3F_SUN 0x85C7\r\n\tGL_R1UI_C4F_N3F_V3F_SUN 0x85C8\r\n\tGL_R1UI_T2F_V3F_SUN 0x85C9\r\n\tGL_R1UI_T2F_N3F_V3F_SUN 0x85CA\r\n\tGL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB\r\n\tvoid glReplacementCodePointerSUN (GLenum type, GLsizei stride, const void* pointer)\r\n\tvoid glReplacementCodeubSUN (GLubyte code)\r\n\tvoid glReplacementCodeubvSUN (const GLubyte* code)\r\n\tvoid glReplacementCodeuiSUN (GLuint code)\r\n\tvoid glReplacementCodeuivSUN (const GLuint* code)\r\n\tvoid glReplacementCodeusSUN (GLushort code)\r\n\tvoid glReplacementCodeusvSUN (const GLushort* code)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_SUN_vertex",
    "content": "GL_SUN_vertex\r\nhttp://www.opengl.org/registry/specs/SUN/vertex.txt\r\n\tvoid glColor3fVertex3fSUN (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z)\r\n\tvoid glColor3fVertex3fvSUN (const GLfloat* c, const GLfloat *v)\r\n\tvoid glColor4fNormal3fVertex3fSUN (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z)\r\n\tvoid glColor4fNormal3fVertex3fvSUN (const GLfloat* c, const GLfloat *n, const GLfloat *v)\r\n\tvoid glColor4ubVertex2fSUN (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y)\r\n\tvoid glColor4ubVertex2fvSUN (const GLubyte* c, const GLfloat *v)\r\n\tvoid glColor4ubVertex3fSUN (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z)\r\n\tvoid glColor4ubVertex3fvSUN (const GLubyte* c, const GLfloat *v)\r\n\tvoid glNormal3fVertex3fSUN (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z)\r\n\tvoid glNormal3fVertex3fvSUN (const GLfloat* n, const GLfloat *v)\r\n\tvoid glReplacementCodeuiColor3fVertex3fSUN (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z)\r\n\tvoid glReplacementCodeuiColor3fVertex3fvSUN (const GLuint* rc, const GLfloat *c, const GLfloat *v)\r\n\tvoid glReplacementCodeuiColor4fNormal3fVertex3fSUN (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z)\r\n\tvoid glReplacementCodeuiColor4fNormal3fVertex3fvSUN (const GLuint* rc, const GLfloat *c, const GLfloat *n, const GLfloat *v)\r\n\tvoid glReplacementCodeuiColor4ubVertex3fSUN (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z)\r\n\tvoid glReplacementCodeuiColor4ubVertex3fvSUN (const GLuint* rc, const GLubyte *c, const GLfloat *v)\r\n\tvoid glReplacementCodeuiNormal3fVertex3fSUN (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z)\r\n\tvoid glReplacementCodeuiNormal3fVertex3fvSUN (const GLuint* rc, const GLfloat *n, const GLfloat *v)\r\n\tvoid glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z)\r\n\tvoid glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN (const GLuint* rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v)\r\n\tvoid glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z)\r\n\tvoid glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN (const GLuint* rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v)\r\n\tvoid glReplacementCodeuiTexCoord2fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z)\r\n\tvoid glReplacementCodeuiTexCoord2fVertex3fvSUN (const GLuint* rc, const GLfloat *tc, const GLfloat *v)\r\n\tvoid glReplacementCodeuiVertex3fSUN (GLuint rc, GLfloat x, GLfloat y, GLfloat z)\r\n\tvoid glReplacementCodeuiVertex3fvSUN (const GLuint* rc, const GLfloat *v)\r\n\tvoid glTexCoord2fColor3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z)\r\n\tvoid glTexCoord2fColor3fVertex3fvSUN (const GLfloat* tc, const GLfloat *c, const GLfloat *v)\r\n\tvoid glTexCoord2fColor4fNormal3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z)\r\n\tvoid glTexCoord2fColor4fNormal3fVertex3fvSUN (const GLfloat* tc, const GLfloat *c, const GLfloat *n, const GLfloat *v)\r\n\tvoid glTexCoord2fColor4ubVertex3fSUN (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z)\r\n\tvoid glTexCoord2fColor4ubVertex3fvSUN (const GLfloat* tc, const GLubyte *c, const GLfloat *v)\r\n\tvoid glTexCoord2fNormal3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z)\r\n\tvoid glTexCoord2fNormal3fVertex3fvSUN (const GLfloat* tc, const GLfloat *n, const GLfloat *v)\r\n\tvoid glTexCoord2fVertex3fSUN (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z)\r\n\tvoid glTexCoord2fVertex3fvSUN (const GLfloat* tc, const GLfloat *v)\r\n\tvoid glTexCoord4fColor4fNormal3fVertex4fSUN (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w)\r\n\tvoid glTexCoord4fColor4fNormal3fVertex4fvSUN (const GLfloat* tc, const GLfloat *c, const GLfloat *n, const GLfloat *v)\r\n\tvoid glTexCoord4fVertex4fSUN (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w)\r\n\tvoid glTexCoord4fVertex4fvSUN (const GLfloat* tc, const GLfloat *v)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_WIN_phong_shading",
    "content": "GL_WIN_phong_shading\r\nhttp://www.opengl.org/registry/specs/WIN/phong_shading.txt\r\n\tGL_PHONG_WIN 0x80EA\r\n\tGL_PHONG_HINT_WIN 0x80EB\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_WIN_specular_fog",
    "content": "GL_WIN_specular_fog\r\nhttp://www.opengl.org/registry/specs/WIN/specular_fog.txt\r\n\tGL_FOG_SPECULAR_TEXTURE_WIN 0x80EC\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/GL_WIN_swap_hint",
    "content": "GL_WIN_swap_hint\r\nhttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/glfunc01_16zy.asp\r\n\tvoid glAddSwapHintRectWIN (GLint x, GLint y, GLsizei width, GLsizei height)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_3DFX_multisample",
    "content": "WGL_3DFX_multisample\r\nhttp://www.opengl.org/registry/specs/3DFX/3dfx_multisample.txt\r\n\tWGL_SAMPLE_BUFFERS_3DFX 0x2060\r\n\tWGL_SAMPLES_3DFX 0x2061\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_3DL_stereo_control",
    "content": "WGL_3DL_stereo_control\r\nhttp://www.opengl.org/registry/specs/3DL/stereo_control.txt\r\n\tWGL_STEREO_EMITTER_ENABLE_3DL 0x2055\r\n\tWGL_STEREO_EMITTER_DISABLE_3DL 0x2056\r\n\tWGL_STEREO_POLARITY_NORMAL_3DL 0x2057\r\n\tWGL_STEREO_POLARITY_INVERT_3DL 0x2058\r\n\tBOOL wglSetStereoEmitterState3DL (HDC hDC, UINT uState)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_AMD_gpu_association",
    "content": "WGL_AMD_gpu_association\r\nhttp://www.opengl.org/registry/specs/AMD/wgl_gpu_association.txt\r\n\tWGL_GPU_VENDOR_AMD 0x1F00\r\n\tWGL_GPU_RENDERER_STRING_AMD 0x1F01\r\n\tWGL_GPU_OPENGL_VERSION_STRING_AMD 0x1F02\r\n\tWGL_GPU_FASTEST_TARGET_GPUS_AMD 0x21A2\r\n\tWGL_GPU_RAM_AMD 0x21A3\r\n\tWGL_GPU_CLOCK_AMD 0x21A4\r\n\tWGL_GPU_NUM_PIPES_AMD 0x21A5\r\n\tWGL_GPU_NUM_SIMD_AMD 0x21A6\r\n\tWGL_GPU_NUM_RB_AMD 0x21A7\r\n\tWGL_GPU_NUM_SPI_AMD 0x21A8\r\n\tVOID wglBlitContextFramebufferAMD (HGLRC dstCtx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)\r\n\tHGLRC wglCreateAssociatedContextAMD (UINT id)\r\n\tHGLRC wglCreateAssociatedContextAttribsAMD (UINT id, HGLRC hShareContext, const int* attribList)\r\n\tBOOL wglDeleteAssociatedContextAMD (HGLRC hglrc)\r\n\tUINT wglGetContextGPUIDAMD (HGLRC hglrc)\r\n\tHGLRC wglGetCurrentAssociatedContextAMD (void)\r\n\tUINT wglGetGPUIDsAMD (UINT maxCount, UINT* ids)\r\n\tINT wglGetGPUInfoAMD (UINT id, INT property, GLenum dataType, UINT size, void* data)\r\n\tBOOL wglMakeAssociatedContextCurrentAMD (HGLRC hglrc)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_ARB_buffer_region",
    "content": "WGL_ARB_buffer_region\r\nhttp://www.opengl.org/registry/specs/ARB/wgl_buffer_region.txt\r\n\tWGL_FRONT_COLOR_BUFFER_BIT_ARB 0x00000001\r\n\tWGL_BACK_COLOR_BUFFER_BIT_ARB 0x00000002\r\n\tWGL_DEPTH_BUFFER_BIT_ARB 0x00000004\r\n\tWGL_STENCIL_BUFFER_BIT_ARB 0x00000008\r\n\tHANDLE wglCreateBufferRegionARB (HDC hDC, int iLayerPlane, UINT uType)\r\n\tVOID wglDeleteBufferRegionARB (HANDLE hRegion)\r\n\tBOOL wglRestoreBufferRegionARB (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc)\r\n\tBOOL wglSaveBufferRegionARB (HANDLE hRegion, int x, int y, int width, int height)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_ARB_create_context",
    "content": "WGL_ARB_create_context\r\nhttp://www.opengl.org/registry/specs/ARB/wgl_create_context.txt\r\n\tWGL_CONTEXT_DEBUG_BIT_ARB 0x0001\r\n\tWGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002\r\n\tWGL_CONTEXT_MAJOR_VERSION_ARB 0x2091\r\n\tWGL_CONTEXT_MINOR_VERSION_ARB 0x2092\r\n\tWGL_CONTEXT_LAYER_PLANE_ARB 0x2093\r\n\tWGL_CONTEXT_FLAGS_ARB 0x2094\r\n\tHGLRC wglCreateContextAttribsARB (HDC hDC, HGLRC hShareContext, const int* attribList)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_ARB_create_context_profile",
    "content": "WGL_ARB_create_context_profile\r\nhttp://www.opengl.org/registry/specs/ARB/wgl_create_context.txt\r\n\tWGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001\r\n\tWGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002\r\n\tWGL_CONTEXT_PROFILE_MASK_ARB 0x9126\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_ARB_extensions_string",
    "content": "WGL_ARB_extensions_string\r\nhttp://www.opengl.org/registry/specs/ARB/wgl_extensions_string.txt\r\n\tconst char* wglGetExtensionsStringARB (HDC hdc)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_ARB_framebuffer_sRGB",
    "content": "WGL_ARB_framebuffer_sRGB\r\nhttp://www.opengl.org/registry/specs/ARB/framebuffer_sRGB.txt\r\n\tWGL_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20A9\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_ARB_make_current_read",
    "content": "WGL_ARB_make_current_read\r\nhttp://www.opengl.org/registry/specs/ARB/wgl_make_current_read.txt\r\n\tHDC wglGetCurrentReadDCARB (VOID)\r\n\tBOOL wglMakeContextCurrentARB (HDC hDrawDC, HDC hReadDC, HGLRC hglrc)\r\n\tERROR_INVALID_PIXEL_TYPE_ARB 0x2043\r\n\tERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_ARB_multisample",
    "content": "WGL_ARB_multisample\r\nhttp://www.opengl.org/registry/specs/ARB/multisample.txt\r\n\tWGL_SAMPLE_BUFFERS_ARB 0x2041\r\n\tWGL_SAMPLES_ARB 0x2042\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_ARB_pbuffer",
    "content": "WGL_ARB_pbuffer\r\nhttp://www.opengl.org/registry/specs/ARB/wgl_pbuffer.txt\r\n\tWGL_DRAW_TO_PBUFFER_ARB 0x202D\r\n\tWGL_MAX_PBUFFER_PIXELS_ARB 0x202E\r\n\tWGL_MAX_PBUFFER_WIDTH_ARB 0x202F\r\n\tWGL_MAX_PBUFFER_HEIGHT_ARB 0x2030\r\n\tWGL_PBUFFER_LARGEST_ARB 0x2033\r\n\tWGL_PBUFFER_WIDTH_ARB 0x2034\r\n\tWGL_PBUFFER_HEIGHT_ARB 0x2035\r\n\tWGL_PBUFFER_LOST_ARB 0x2036\r\n\tHPBUFFERARB wglCreatePbufferARB (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList)\r\n\tBOOL wglDestroyPbufferARB (HPBUFFERARB hPbuffer)\r\n\tHDC wglGetPbufferDCARB (HPBUFFERARB hPbuffer)\r\n\tBOOL wglQueryPbufferARB (HPBUFFERARB hPbuffer, int iAttribute, int* piValue)\r\n\tint wglReleasePbufferDCARB (HPBUFFERARB hPbuffer, HDC hDC)\r\n\tDECLARE_HANDLE(HPBUFFERARB);\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_ARB_pixel_format",
    "content": "WGL_ARB_pixel_format\r\nhttp://www.opengl.org/registry/specs/ARB/wgl_pixel_format.txt\r\n\tWGL_NUMBER_PIXEL_FORMATS_ARB 0x2000\r\n\tWGL_DRAW_TO_WINDOW_ARB 0x2001\r\n\tWGL_DRAW_TO_BITMAP_ARB 0x2002\r\n\tWGL_ACCELERATION_ARB 0x2003\r\n\tWGL_NEED_PALETTE_ARB 0x2004\r\n\tWGL_NEED_SYSTEM_PALETTE_ARB 0x2005\r\n\tWGL_SWAP_LAYER_BUFFERS_ARB 0x2006\r\n\tWGL_SWAP_METHOD_ARB 0x2007\r\n\tWGL_NUMBER_OVERLAYS_ARB 0x2008\r\n\tWGL_NUMBER_UNDERLAYS_ARB 0x2009\r\n\tWGL_TRANSPARENT_ARB 0x200A\r\n\tWGL_SHARE_DEPTH_ARB 0x200C\r\n\tWGL_SHARE_STENCIL_ARB 0x200D\r\n\tWGL_SHARE_ACCUM_ARB 0x200E\r\n\tWGL_SUPPORT_GDI_ARB 0x200F\r\n\tWGL_SUPPORT_OPENGL_ARB 0x2010\r\n\tWGL_DOUBLE_BUFFER_ARB 0x2011\r\n\tWGL_STEREO_ARB 0x2012\r\n\tWGL_PIXEL_TYPE_ARB 0x2013\r\n\tWGL_COLOR_BITS_ARB 0x2014\r\n\tWGL_RED_BITS_ARB 0x2015\r\n\tWGL_RED_SHIFT_ARB 0x2016\r\n\tWGL_GREEN_BITS_ARB 0x2017\r\n\tWGL_GREEN_SHIFT_ARB 0x2018\r\n\tWGL_BLUE_BITS_ARB 0x2019\r\n\tWGL_BLUE_SHIFT_ARB 0x201A\r\n\tWGL_ALPHA_BITS_ARB 0x201B\r\n\tWGL_ALPHA_SHIFT_ARB 0x201C\r\n\tWGL_ACCUM_BITS_ARB 0x201D\r\n\tWGL_ACCUM_RED_BITS_ARB 0x201E\r\n\tWGL_ACCUM_GREEN_BITS_ARB 0x201F\r\n\tWGL_ACCUM_BLUE_BITS_ARB 0x2020\r\n\tWGL_ACCUM_ALPHA_BITS_ARB 0x2021\r\n\tWGL_DEPTH_BITS_ARB 0x2022\r\n\tWGL_STENCIL_BITS_ARB 0x2023\r\n\tWGL_AUX_BUFFERS_ARB 0x2024\r\n\tWGL_NO_ACCELERATION_ARB 0x2025\r\n\tWGL_GENERIC_ACCELERATION_ARB 0x2026\r\n\tWGL_FULL_ACCELERATION_ARB 0x2027\r\n\tWGL_SWAP_EXCHANGE_ARB 0x2028\r\n\tWGL_SWAP_COPY_ARB 0x2029\r\n\tWGL_SWAP_UNDEFINED_ARB 0x202A\r\n\tWGL_TYPE_RGBA_ARB 0x202B\r\n\tWGL_TYPE_COLORINDEX_ARB 0x202C\r\n\tWGL_TRANSPARENT_RED_VALUE_ARB 0x2037\r\n\tWGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038\r\n\tWGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039\r\n\tWGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A\r\n\tWGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B\r\n\tBOOL wglChoosePixelFormatARB (HDC hdc, const int* piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats)\r\n\tBOOL wglGetPixelFormatAttribfvARB (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, FLOAT *pfValues)\r\n\tBOOL wglGetPixelFormatAttribivARB (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, int *piValues)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_ARB_pixel_format_float",
    "content": "WGL_ARB_pixel_format_float\r\nhttp://www.opengl.org/registry/specs/ARB/color_buffer_float.txt\r\n\tWGL_TYPE_RGBA_FLOAT_ARB 0x21A0\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_ARB_render_texture",
    "content": "WGL_ARB_render_texture\r\nhttp://www.opengl.org/registry/specs/ARB/wgl_render_texture.txt\r\n\tWGL_BIND_TO_TEXTURE_RGB_ARB 0x2070\r\n\tWGL_BIND_TO_TEXTURE_RGBA_ARB 0x2071\r\n\tWGL_TEXTURE_FORMAT_ARB 0x2072\r\n\tWGL_TEXTURE_TARGET_ARB 0x2073\r\n\tWGL_MIPMAP_TEXTURE_ARB 0x2074\r\n\tWGL_TEXTURE_RGB_ARB 0x2075\r\n\tWGL_TEXTURE_RGBA_ARB 0x2076\r\n\tWGL_NO_TEXTURE_ARB 0x2077\r\n\tWGL_TEXTURE_CUBE_MAP_ARB 0x2078\r\n\tWGL_TEXTURE_1D_ARB 0x2079\r\n\tWGL_TEXTURE_2D_ARB 0x207A\r\n\tWGL_MIPMAP_LEVEL_ARB 0x207B\r\n\tWGL_CUBE_MAP_FACE_ARB 0x207C\r\n\tWGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x207D\r\n\tWGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x207E\r\n\tWGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x207F\r\n\tWGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x2080\r\n\tWGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x2081\r\n\tWGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x2082\r\n\tWGL_FRONT_LEFT_ARB 0x2083\r\n\tWGL_FRONT_RIGHT_ARB 0x2084\r\n\tWGL_BACK_LEFT_ARB 0x2085\r\n\tWGL_BACK_RIGHT_ARB 0x2086\r\n\tWGL_AUX0_ARB 0x2087\r\n\tWGL_AUX1_ARB 0x2088\r\n\tWGL_AUX2_ARB 0x2089\r\n\tWGL_AUX3_ARB 0x208A\r\n\tWGL_AUX4_ARB 0x208B\r\n\tWGL_AUX5_ARB 0x208C\r\n\tWGL_AUX6_ARB 0x208D\r\n\tWGL_AUX7_ARB 0x208E\r\n\tWGL_AUX8_ARB 0x208F\r\n\tWGL_AUX9_ARB 0x2090\r\n\tBOOL wglBindTexImageARB (HPBUFFERARB hPbuffer, int iBuffer)\r\n\tBOOL wglReleaseTexImageARB (HPBUFFERARB hPbuffer, int iBuffer)\r\n\tBOOL wglSetPbufferAttribARB (HPBUFFERARB hPbuffer, const int* piAttribList)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_ATI_pixel_format_float",
    "content": "WGL_ATI_pixel_format_float\r\nhttp://www.opengl.org/registry/specs/ATI/pixel_format_float.txt\r\n\tWGL_TYPE_RGBA_FLOAT_ATI 0x21A0\r\n\tGL_RGBA_FLOAT_MODE_ATI 0x8820\r\n\tGL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_ATI_render_texture_rectangle",
    "content": "WGL_ATI_render_texture_rectangle\r\n\tWGL_TEXTURE_RECTANGLE_ATI 0x21A5\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_EXT_depth_float",
    "content": "WGL_EXT_depth_float\r\nhttp://www.opengl.org/registry/specs/EXT/wgl_depth_float.txt\r\n\tWGL_DEPTH_FLOAT_EXT 0x2040\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_EXT_display_color_table",
    "content": "WGL_EXT_display_color_table\r\nhttp://www.opengl.org/registry/specs/EXT/wgl_display_color_table.txt\r\n\tGLboolean wglBindDisplayColorTableEXT (GLushort id)\r\n\tGLboolean wglCreateDisplayColorTableEXT (GLushort id)\r\n\tvoid wglDestroyDisplayColorTableEXT (GLushort id)\r\n\tGLboolean wglLoadDisplayColorTableEXT (GLushort* table, GLuint length)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_EXT_extensions_string",
    "content": "WGL_EXT_extensions_string\r\nhttp://www.opengl.org/registry/specs/EXT/wgl_extensions_string.txt\r\n\tconst char* wglGetExtensionsStringEXT (void)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_EXT_framebuffer_sRGB",
    "content": "WGL_EXT_framebuffer_sRGB\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_EXT_framebuffer_sRGB.txt\r\n\tWGL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20A9\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_EXT_make_current_read",
    "content": "WGL_EXT_make_current_read\r\nhttp://www.opengl.org/registry/specs/EXT/wgl_make_current_read.txt\r\n\tHDC wglGetCurrentReadDCEXT (VOID)\r\n\tBOOL wglMakeContextCurrentEXT (HDC hDrawDC, HDC hReadDC, HGLRC hglrc)\r\n\tERROR_INVALID_PIXEL_TYPE_EXT 0x2043\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_EXT_multisample",
    "content": "WGL_EXT_multisample\r\nhttp://www.opengl.org/registry/specs/EXT/wgl_multisample.txt\r\n\tWGL_SAMPLE_BUFFERS_EXT 0x2041\r\n\tWGL_SAMPLES_EXT 0x2042\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_EXT_pbuffer",
    "content": "WGL_EXT_pbuffer\r\nhttp://www.opengl.org/registry/specs/EXT/wgl_pbuffer.txt\r\n\tWGL_DRAW_TO_PBUFFER_EXT 0x202D\r\n\tWGL_MAX_PBUFFER_PIXELS_EXT 0x202E\r\n\tWGL_MAX_PBUFFER_WIDTH_EXT 0x202F\r\n\tWGL_MAX_PBUFFER_HEIGHT_EXT 0x2030\r\n\tWGL_OPTIMAL_PBUFFER_WIDTH_EXT 0x2031\r\n\tWGL_OPTIMAL_PBUFFER_HEIGHT_EXT 0x2032\r\n\tWGL_PBUFFER_LARGEST_EXT 0x2033\r\n\tWGL_PBUFFER_WIDTH_EXT 0x2034\r\n\tWGL_PBUFFER_HEIGHT_EXT 0x2035\r\n\tHPBUFFEREXT wglCreatePbufferEXT (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList)\r\n\tBOOL wglDestroyPbufferEXT (HPBUFFEREXT hPbuffer)\r\n\tHDC wglGetPbufferDCEXT (HPBUFFEREXT hPbuffer)\r\n\tBOOL wglQueryPbufferEXT (HPBUFFEREXT hPbuffer, int iAttribute, int* piValue)\r\n\tint wglReleasePbufferDCEXT (HPBUFFEREXT hPbuffer, HDC hDC)\r\n\tDECLARE_HANDLE(HPBUFFEREXT);\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_EXT_pixel_format",
    "content": "WGL_EXT_pixel_format\r\nhttp://www.opengl.org/registry/specs/EXT/wgl_pixel_format.txt\r\n\tWGL_NUMBER_PIXEL_FORMATS_EXT 0x2000\r\n\tWGL_DRAW_TO_WINDOW_EXT 0x2001\r\n\tWGL_DRAW_TO_BITMAP_EXT 0x2002\r\n\tWGL_ACCELERATION_EXT 0x2003\r\n\tWGL_NEED_PALETTE_EXT 0x2004\r\n\tWGL_NEED_SYSTEM_PALETTE_EXT 0x2005\r\n\tWGL_SWAP_LAYER_BUFFERS_EXT 0x2006\r\n\tWGL_SWAP_METHOD_EXT 0x2007\r\n\tWGL_NUMBER_OVERLAYS_EXT 0x2008\r\n\tWGL_NUMBER_UNDERLAYS_EXT 0x2009\r\n\tWGL_TRANSPARENT_EXT 0x200A\r\n\tWGL_TRANSPARENT_VALUE_EXT 0x200B\r\n\tWGL_SHARE_DEPTH_EXT 0x200C\r\n\tWGL_SHARE_STENCIL_EXT 0x200D\r\n\tWGL_SHARE_ACCUM_EXT 0x200E\r\n\tWGL_SUPPORT_GDI_EXT 0x200F\r\n\tWGL_SUPPORT_OPENGL_EXT 0x2010\r\n\tWGL_DOUBLE_BUFFER_EXT 0x2011\r\n\tWGL_STEREO_EXT 0x2012\r\n\tWGL_PIXEL_TYPE_EXT 0x2013\r\n\tWGL_COLOR_BITS_EXT 0x2014\r\n\tWGL_RED_BITS_EXT 0x2015\r\n\tWGL_RED_SHIFT_EXT 0x2016\r\n\tWGL_GREEN_BITS_EXT 0x2017\r\n\tWGL_GREEN_SHIFT_EXT 0x2018\r\n\tWGL_BLUE_BITS_EXT 0x2019\r\n\tWGL_BLUE_SHIFT_EXT 0x201A\r\n\tWGL_ALPHA_BITS_EXT 0x201B\r\n\tWGL_ALPHA_SHIFT_EXT 0x201C\r\n\tWGL_ACCUM_BITS_EXT 0x201D\r\n\tWGL_ACCUM_RED_BITS_EXT 0x201E\r\n\tWGL_ACCUM_GREEN_BITS_EXT 0x201F\r\n\tWGL_ACCUM_BLUE_BITS_EXT 0x2020\r\n\tWGL_ACCUM_ALPHA_BITS_EXT 0x2021\r\n\tWGL_DEPTH_BITS_EXT 0x2022\r\n\tWGL_STENCIL_BITS_EXT 0x2023\r\n\tWGL_AUX_BUFFERS_EXT 0x2024\r\n\tWGL_NO_ACCELERATION_EXT 0x2025\r\n\tWGL_GENERIC_ACCELERATION_EXT 0x2026\r\n\tWGL_FULL_ACCELERATION_EXT 0x2027\r\n\tWGL_SWAP_EXCHANGE_EXT 0x2028\r\n\tWGL_SWAP_COPY_EXT 0x2029\r\n\tWGL_SWAP_UNDEFINED_EXT 0x202A\r\n\tWGL_TYPE_RGBA_EXT 0x202B\r\n\tWGL_TYPE_COLORINDEX_EXT 0x202C\r\n\tBOOL wglChoosePixelFormatEXT (HDC hdc, const int* piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats)\r\n\tBOOL wglGetPixelFormatAttribfvEXT (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, FLOAT *pfValues)\r\n\tBOOL wglGetPixelFormatAttribivEXT (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, int *piValues)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_EXT_pixel_format_packed_float",
    "content": "WGL_EXT_pixel_format_packed_float\r\nhttp://developer.download.nvidia.com/opengl/specs/GL_EXT_packed_float.txt\r\n\tWGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT 0x20A8\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_EXT_swap_control",
    "content": "WGL_EXT_swap_control\r\nhttp://www.opengl.org/registry/specs/EXT/wgl_swap_control.txt\r\n\tint wglGetSwapIntervalEXT (void)\r\n\tBOOL wglSwapIntervalEXT (int interval)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_I3D_digital_video_control",
    "content": "WGL_I3D_digital_video_control\r\nhttp://www.opengl.org/registry/specs/I3D/wgl_digital_video_control.txt\r\n\tWGL_DIGITAL_VIDEO_CURSOR_ALPHA_FRAMEBUFFER_I3D 0x2050\r\n\tWGL_DIGITAL_VIDEO_CURSOR_ALPHA_VALUE_I3D 0x2051\r\n\tWGL_DIGITAL_VIDEO_CURSOR_INCLUDED_I3D 0x2052\r\n\tWGL_DIGITAL_VIDEO_GAMMA_CORRECTED_I3D 0x2053\r\n\tBOOL wglGetDigitalVideoParametersI3D (HDC hDC, int iAttribute, int* piValue)\r\n\tBOOL wglSetDigitalVideoParametersI3D (HDC hDC, int iAttribute, const int* piValue)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_I3D_gamma",
    "content": "WGL_I3D_gamma\r\nhttp://www.opengl.org/registry/specs/I3D/wgl_gamma.txt\r\n\tWGL_GAMMA_TABLE_SIZE_I3D 0x204E\r\n\tWGL_GAMMA_EXCLUDE_DESKTOP_I3D 0x204F\r\n\tBOOL wglGetGammaTableI3D (HDC hDC, int iEntries, USHORT* puRed, USHORT *puGreen, USHORT *puBlue)\r\n\tBOOL wglGetGammaTableParametersI3D (HDC hDC, int iAttribute, int* piValue)\r\n\tBOOL wglSetGammaTableI3D (HDC hDC, int iEntries, const USHORT* puRed, const USHORT *puGreen, const USHORT *puBlue)\r\n\tBOOL wglSetGammaTableParametersI3D (HDC hDC, int iAttribute, const int* piValue)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_I3D_genlock",
    "content": "WGL_I3D_genlock\r\nhttp://www.opengl.org/registry/specs/I3D/wgl_genlock.txt\r\n\tWGL_GENLOCK_SOURCE_MULTIVIEW_I3D 0x2044\r\n\tWGL_GENLOCK_SOURCE_EXTERNAL_SYNC_I3D 0x2045\r\n\tWGL_GENLOCK_SOURCE_EXTERNAL_FIELD_I3D 0x2046\r\n\tWGL_GENLOCK_SOURCE_EXTERNAL_TTL_I3D 0x2047\r\n\tWGL_GENLOCK_SOURCE_DIGITAL_SYNC_I3D 0x2048\r\n\tWGL_GENLOCK_SOURCE_DIGITAL_FIELD_I3D 0x2049\r\n\tWGL_GENLOCK_SOURCE_EDGE_FALLING_I3D 0x204A\r\n\tWGL_GENLOCK_SOURCE_EDGE_RISING_I3D 0x204B\r\n\tWGL_GENLOCK_SOURCE_EDGE_BOTH_I3D 0x204C\r\n\tBOOL wglDisableGenlockI3D (HDC hDC)\r\n\tBOOL wglEnableGenlockI3D (HDC hDC)\r\n\tBOOL wglGenlockSampleRateI3D (HDC hDC, UINT uRate)\r\n\tBOOL wglGenlockSourceDelayI3D (HDC hDC, UINT uDelay)\r\n\tBOOL wglGenlockSourceEdgeI3D (HDC hDC, UINT uEdge)\r\n\tBOOL wglGenlockSourceI3D (HDC hDC, UINT uSource)\r\n\tBOOL wglGetGenlockSampleRateI3D (HDC hDC, UINT* uRate)\r\n\tBOOL wglGetGenlockSourceDelayI3D (HDC hDC, UINT* uDelay)\r\n\tBOOL wglGetGenlockSourceEdgeI3D (HDC hDC, UINT* uEdge)\r\n\tBOOL wglGetGenlockSourceI3D (HDC hDC, UINT* uSource)\r\n\tBOOL wglIsEnabledGenlockI3D (HDC hDC, BOOL* pFlag)\r\n\tBOOL wglQueryGenlockMaxSourceDelayI3D (HDC hDC, UINT* uMaxLineDelay, UINT *uMaxPixelDelay)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_I3D_image_buffer",
    "content": "WGL_I3D_image_buffer\r\nhttp://www.opengl.org/registry/specs/I3D/wgl_image_buffer.txt\r\n\tWGL_IMAGE_BUFFER_MIN_ACCESS_I3D 0x00000001\r\n\tWGL_IMAGE_BUFFER_LOCK_I3D 0x00000002\r\n\tBOOL wglAssociateImageBufferEventsI3D (HDC hdc, HANDLE* pEvent, LPVOID *pAddress, DWORD *pSize, UINT count)\r\n\tLPVOID wglCreateImageBufferI3D (HDC hDC, DWORD dwSize, UINT uFlags)\r\n\tBOOL wglDestroyImageBufferI3D (HDC hDC, LPVOID pAddress)\r\n\tBOOL wglReleaseImageBufferEventsI3D (HDC hdc, LPVOID* pAddress, UINT count)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_I3D_swap_frame_lock",
    "content": "WGL_I3D_swap_frame_lock\r\nhttp://www.opengl.org/registry/specs/I3D/wgl_swap_frame_lock.txt\r\n\tBOOL wglDisableFrameLockI3D (VOID)\r\n\tBOOL wglEnableFrameLockI3D (VOID)\r\n\tBOOL wglIsEnabledFrameLockI3D (BOOL* pFlag)\r\n\tBOOL wglQueryFrameLockMasterI3D (BOOL* pFlag)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_I3D_swap_frame_usage",
    "content": "WGL_I3D_swap_frame_usage\r\nhttp://www.opengl.org/registry/specs/I3D/wgl_swap_frame_usage.txt\r\n\tBOOL wglBeginFrameTrackingI3D (void)\r\n\tBOOL wglEndFrameTrackingI3D (void)\r\n\tBOOL wglGetFrameUsageI3D (float* pUsage)\r\n\tBOOL wglQueryFrameTrackingI3D (DWORD* pFrameCount, DWORD *pMissedFrames, float *pLastMissedUsage)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_NV_copy_image",
    "content": "WGL_NV_copy_image\r\nhttp://www.opengl.org/registry/specs/NV/copy_image.txt\r\n  BOOL wglCopyImageSubDataNV (HGLRC hSrcRC, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, HGLRC hDstRC, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_NV_float_buffer",
    "content": "WGL_NV_float_buffer\r\nhttp://www.opengl.org/registry/specs/NV/float_buffer.txt\r\n\tWGL_FLOAT_COMPONENTS_NV 0x20B0\r\n\tWGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV 0x20B1\r\n\tWGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV 0x20B2\r\n\tWGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV 0x20B3\r\n\tWGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV 0x20B4\r\n\tWGL_TEXTURE_FLOAT_R_NV 0x20B5\r\n\tWGL_TEXTURE_FLOAT_RG_NV 0x20B6\r\n\tWGL_TEXTURE_FLOAT_RGB_NV 0x20B7\r\n\tWGL_TEXTURE_FLOAT_RGBA_NV 0x20B8\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_NV_gpu_affinity",
    "content": "WGL_NV_gpu_affinity\r\nhttp://developer.download.nvidia.com/opengl/specs/WGL_nv_gpu_affinity.txt\r\n\tWGL_ERROR_INCOMPATIBLE_AFFINITY_MASKS_NV 0x20D0\r\n\tWGL_ERROR_MISSING_AFFINITY_MASK_NV 0x20D1\r\n\tBOOL wglEnumGpusNV (UINT iGpuIndex, HGPUNV *phGpu)\r\n\tBOOL wglEnumGpuDevicesNV (HGPUNV hGpu, UINT iDeviceIndex, PGPU_DEVICE lpGpuDevice)\r\n\tHDC wglCreateAffinityDCNV (const HGPUNV *phGpuList)\r\n\tBOOL wglEnumGpusFromAffinityDCNV (HDC hAffinityDC, UINT iGpuIndex, HGPUNV *hGpu)\r\n\tBOOL wglDeleteDCNV (HDC hdc)\r\n\tDECLARE_HANDLE(HGPUNV);\r\n\ttypedef struct _GPU_DEVICE {  DWORD cb;   CHAR DeviceName[32];   CHAR DeviceString[128];   DWORD Flags;   RECT rcVirtualScreen; } GPU_DEVICE, *PGPU_DEVICE;\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_NV_present_video",
    "content": "WGL_NV_present_video\r\nhttp://www.opengl.org/registry/specs/NV/present_video.txt\r\n\tWGL_NUM_VIDEO_SLOTS_NV 0x20F0\r\n\tBOOL wglBindVideoDeviceNV (HDC hDc, unsigned int uVideoSlot, HVIDEOOUTPUTDEVICENV hVideoDevice, const int* piAttribList)\r\n\tint wglEnumerateVideoDevicesNV (HDC hDc, HVIDEOOUTPUTDEVICENV* phDeviceList)\r\n\tBOOL wglQueryCurrentContextNV (int iAttribute, int* piValue)\r\n    DECLARE_HANDLE(HVIDEOOUTPUTDEVICENV);\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_NV_render_depth_texture",
    "content": "WGL_NV_render_depth_texture\r\nhttp://www.opengl.org/registry/specs/NV/render_depth_texture.txt\r\n\tWGL_NO_TEXTURE_ARB 0x2077\r\n\tWGL_BIND_TO_TEXTURE_DEPTH_NV 0x20A3\r\n\tWGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV 0x20A4\r\n\tWGL_DEPTH_TEXTURE_FORMAT_NV 0x20A5\r\n\tWGL_TEXTURE_DEPTH_COMPONENT_NV 0x20A6\r\n\tWGL_DEPTH_COMPONENT_NV 0x20A7\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_NV_render_texture_rectangle",
    "content": "WGL_NV_render_texture_rectangle\r\nhttp://www.opengl.org/registry/specs/NV/render_texture_rectangle.txt\r\n\tWGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV 0x20A0\r\n\tWGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV 0x20A1\r\n\tWGL_TEXTURE_RECTANGLE_NV 0x20A2\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_NV_swap_group",
    "content": "WGL_NV_swap_group\r\nhttp://www.opengl.org/registry/specs/NV/wgl_swap_group.txt\r\n\tBOOL wglBindSwapBarrierNV (GLuint group, GLuint barrier)\r\n\tBOOL wglJoinSwapGroupNV (HDC hDC, GLuint group)\r\n\tBOOL wglQueryFrameCountNV (HDC hDC, GLuint* count)\r\n\tBOOL wglQueryMaxSwapGroupsNV (HDC hDC, GLuint* maxGroups, GLuint *maxBarriers)\r\n\tBOOL wglQuerySwapGroupNV (HDC hDC, GLuint* group, GLuint *barrier)\r\n\tBOOL wglResetFrameCountNV (HDC hDC)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_NV_vertex_array_range",
    "content": "WGL_NV_vertex_array_range\r\nhttp://oss.sgi.com/projects/ogl-sample/registry/NV/vertex_array_range.txt\r\n\tvoid * wglAllocateMemoryNV (GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority)\r\n\tvoid wglFreeMemoryNV (void *pointer)\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_NV_video_output",
    "content": "WGL_NV_video_output\r\nhttp://www.opengl.org/registry/specs/NV/wgl_video_out.txt\r\n\tWGL_BIND_TO_VIDEO_RGB_NV 0x20C0\r\n\tWGL_BIND_TO_VIDEO_RGBA_NV 0x20C1\r\n\tWGL_BIND_TO_VIDEO_RGB_AND_DEPTH_NV 0x20C2\r\n\tWGL_VIDEO_OUT_COLOR_NV 0x20C3\r\n\tWGL_VIDEO_OUT_ALPHA_NV 0x20C4\r\n\tWGL_VIDEO_OUT_DEPTH_NV 0x20C5\r\n\tWGL_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6\r\n\tWGL_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7\r\n\tWGL_VIDEO_OUT_FRAME 0x20C8\r\n\tWGL_VIDEO_OUT_FIELD_1 0x20C9\r\n\tWGL_VIDEO_OUT_FIELD_2 0x20CA\r\n\tWGL_VIDEO_OUT_STACKED_FIELDS_1_2 0x20CB\r\n\tWGL_VIDEO_OUT_STACKED_FIELDS_2_1 0x20CC\r\n\tBOOL wglBindVideoImageNV (HPVIDEODEV hVideoDevice, HPBUFFERARB hPbuffer, int iVideoBuffer)\r\n\tBOOL wglGetVideoDeviceNV (HDC hDC, int numDevices, HPVIDEODEV* hVideoDevice)\r\n\tBOOL wglGetVideoInfoNV (HPVIDEODEV hpVideoDevice, unsigned long* pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo)\r\n\tBOOL wglReleaseVideoDeviceNV (HPVIDEODEV hVideoDevice)\r\n\tBOOL wglReleaseVideoImageNV (HPBUFFERARB hPbuffer, int iVideoBuffer)\r\n\tBOOL wglSendPbufferToVideoNV (HPBUFFERARB hPbuffer, int iBufferType, unsigned long* pulCounterPbuffer, BOOL bBlock)\r\n    DECLARE_HANDLE(HPVIDEODEV);\r\n"
  },
  {
    "path": "libs/glew/auto/extensions/WGL_OML_sync_control",
    "content": "WGL_OML_sync_control\r\nhttp://www.opengl.org/registry/specs/OML/wgl_sync_control.txt\r\n\tBOOL wglGetMscRateOML (HDC hdc, INT32* numerator, INT32 *denominator)\r\n\tBOOL wglGetSyncValuesOML (HDC hdc, INT64* ust, INT64 *msc, INT64 *sbc)\r\n\tINT64 wglSwapBuffersMscOML (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder)\r\n\tINT64 wglSwapLayerBuffersMscOML (HDC hdc, INT fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder)\r\n\tBOOL wglWaitForMscOML (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64* ust, INT64 *msc, INT64 *sbc)\r\n\tBOOL wglWaitForSbcOML (HDC hdc, INT64 target_sbc, INT64* ust, INT64 *msc, INT64 *sbc)\r\n"
  },
  {
    "path": "libs/glew/auto/lib/OpenGL/Spec.pm",
    "content": "package OpenGL::Spec;\r\n\r\n# A very simple task further complicated by the fact that some people\r\n# can't read, others use legacy Operating Systems, and others don't give\r\n# a damn about using a halfway decent text editor.\r\n#\r\n# The code to parse the _template_ is so simple and straightforward...\r\n# yet the code to parse the real spec files is this mess.\r\n\r\nmy %typemap = (\r\n    bitfield    => \"GLbitfield\",\r\n    boolean     => \"GLboolean\",\r\n    # fsck up in EXT_vertex_array\r\n    Boolean     => \"GLboolean\",\r\n    byte        => \"GLbyte\",\r\n    clampd      => \"GLclampd\",\r\n    clampf      => \"GLclampf\",\r\n    double      => \"GLdouble\",\r\n    enum        => \"GLenum\",\r\n    # Intel fsck up\r\n    Glenum      => \"GLenum\",\r\n    float       => \"GLfloat\",\r\n    half        => \"GLuint\",\r\n    int         => \"GLint\",\r\n    short       => \"GLshort\",\r\n    sizei       => \"GLsizei\",\r\n    ubyte       => \"GLubyte\",\r\n    uint        => \"GLuint\",\r\n    ushort      => \"GLushort\",\r\n    DMbuffer    => \"void *\",\r\n\r\n    # ARB VBO introduces these\r\n    sizeiptrARB => \"GLsizeiptrARB\",\r\n    intptrARB   => \"GLintptrARB\",\r\n\r\n    # ARB shader objects introduces these, charARB is at least 8 bits,\r\n    # handleARB is at least 32 bits\r\n    charARB     => \"GLcharARB\",\r\n    handleARB   => \"GLhandleARB\",\r\n\r\n    # GLX 1.3 defines new types which might not be available at compile time\r\n    #GLXFBConfig   => \"void*\",\r\n    #GLXFBConfigID => \"XID\",\r\n    #GLXContextID  => \"XID\",\r\n    #GLXWindow     => \"XID\",\r\n    #GLXPbuffer    => \"XID\",\r\n\r\n    # Weird stuff for some SGIX extension\r\n    #GLXFBConfigSGIX   => \"void*\",\r\n    #GLXFBConfigIDSGIX => \"XID\",\r\n);\r\n\r\nmy %void_typemap = (\r\n    void    => \"GLvoid\",\r\n);\r\n\r\nmy $section_re  = qr{^[A-Z]};\r\nmy $function_re = qr{^(.+) ([a-z][a-z0-9_]*) \\((.+)\\)$}i;\r\nmy $token_re    = qr{^([A-Z0-9][A-Z0-9_]*):?\\s+((?:0x)?[0-9A-F]+)(.*)$};\r\nmy $prefix_re   = qr{^(?:AGL | GLX | WGL)_}x;\r\nmy $eofnc_re    = qr{ \\);?$ | ^$ }x;\r\nmy $function_re = qr{^(.+) ([a-z][a-z0-9_]*) \\((.+)\\)$}i;\r\nmy $prefix_re   = qr{^(?:gl | agl | wgl | glX)}x;\r\nmy $types_re    = __compile_wordlist_cap(keys %typemap);\r\nmy $voidtype_re = __compile_wordlist_cap(keys %void_typemap);\r\n\r\nsub new($)\r\n{\r\n    my $class = shift;\r\n    my $self = { section => {} };\r\n    $self->{filename} = shift;\r\n    local $/;\r\n    open(my $fh, \"<$self->{filename}\") or die \"Can't open $self->{filename}\";\r\n    my $content = <$fh>;\r\n    my $section;\r\n    my $s = $self->{section};\r\n\r\n    $content =~ s{[ \\t]+$}{}mg;\r\n    # Join lines that end with a word-character and ones that *begin*\r\n    # with one\r\n    $content =~ s{(\\w)\\n(\\w)}{$1 $2}sg;\r\n\r\n    foreach (split /\\n/, $content)\r\n    {\r\n        if (/$section_re/)\r\n        {\r\n            chomp;\r\n            s/^Name String$/Name Strings/; # Fix common mistake\r\n            $section = $_;\r\n            $s->{$section} = \"\";\r\n        }\r\n        elsif (defined $section and exists $s->{$section})\r\n        {\r\n            s{^\\s+}{}mg; # Remove leading whitespace\r\n            $s->{$section} .= $_ . \"\\n\";\r\n        }\r\n    }\r\n\r\n    $s->{$_} =~ s{(?:^\\n+|\\n+$)}{}s foreach keys %$s;\r\n\r\n    bless $self, $class;\r\n}\r\n\r\nsub sections()\r\n{\r\n    my $self = shift;\r\n    keys %{$self->{section}};\r\n}\r\n\r\nsub name()\r\n{\r\n    my $self = shift;\r\n    $self->{section}->{Name};\r\n}\r\n\r\nsub name_strings()\r\n{\r\n    my $self = shift;\r\n    split(\"\\n\", $self->{section}->{\"Name Strings\"});\r\n}\r\n\r\nsub tokens()\r\n{\r\n    my $self = shift;\r\n    my %tokens = ();\r\n    foreach (split /\\n/, $self->{section}->{\"New Tokens\"})\r\n    {\r\n        next unless /$token_re/;\r\n        my ($name, $value) = ($1, $2);\r\n        $name =~ s{^}{GL_} unless $name =~ /$prefix_re/;\r\n        $tokens{$name} = $value;\r\n    }\r\n\r\n    return %tokens;\r\n}\r\n\r\nsub functions()\r\n{\r\n    my $self = shift;\r\n    my %functions = ();\r\n    my @fnc = ();\r\n\r\n    foreach (split /\\n/, $self->{section}->{\"New Procedures and Functions\"})\r\n    {\r\n        push @fnc, $_ unless ($_ eq \"\" or $_ eq \"None\");\r\n\r\n        next unless /$eofnc_re/;\r\n\r\n        if (__normalize_proto(@fnc) =~ /$function_re/)\r\n        {\r\n            my ($return, $name, $parms) = ($1, $2, $3);\r\n            if (!__ignore_function($name, $extname))\r\n            {\r\n                $name =~ s/^/gl/ unless $name =~ /$prefix_re/;\r\n                if ($name =~ /^gl/ && $name !~ /^glX/)\r\n                {\r\n                    $return =~ s/$types_re/$typemap{$1}/g;\r\n                    $return =~ s/$voidtype_re/$void_typemap{$1}/g;\r\n                    $parms  =~ s/$types_re/$typemap{$1}/g;\r\n                    $parms  =~ s/$voidtype_re/$void_typemap{$1}/g;\r\n                }\r\n                $functions{$name} = {\r\n                    rtype => $return,\r\n                    parms => $parms,\r\n                };\r\n            }\r\n        }\r\n        @fnc = ();\r\n    }\r\n\r\n    return %functions;\r\n}\r\n\r\nsub __normalize_proto\r\n{\r\n    local $_ = join(\" \", @_);\r\n    s/\\s+/ /g;                # multiple whitespace -> single space\r\n    s/\\s*\\(\\s*/ \\(/;          # exactly one space before ( and none after\r\n    s/\\s*\\)\\s*/\\)/;           # no after before or after )\r\n    s/\\s*\\*([a-zA-Z])/\\* $1/; # \"* identifier\" XXX: g missing?\r\n    s/\\*wgl/\\* wgl/;          # \"* wgl\"        XXX: why doesn't the\r\n    s/\\*glX/\\* glX/;          # \"* glX\"             previous re catch this?\r\n    s/\\.\\.\\./void/;           # ... -> void\r\n    s/;$//;                   # remove ; at the end of the line\r\n    return $_;\r\n}\r\n\r\nsub __ignore_function\r\n{\r\n    return 0;\r\n}\r\n\r\nsub __compile_regex\r\n{\r\n    my $regex = join('', @_);\r\n    return qr/$regex/\r\n}\r\n\r\nsub __compile_wordlist_cap\r\n{\r\n    __compile_regex('\\b(', join('|', @_), ')\\b');\r\n}\r\n"
  },
  {
    "path": "libs/glew/auto/src/footer.html",
    "content": "<!-- begin footer.html -->\r\n</td></tr></table></body>\r\n<!-- end footer.html -->\r\n\r\n"
  },
  {
    "path": "libs/glew/auto/src/glew.rc",
    "content": "\r\n#include <windows.h>\r\n\r\n#ifdef GLEW_MX\r\n#  ifdef GLEW_STATIC\r\n#    ifdef _DEBUG\r\n#      define FILENAME \"glew32mxsd.dll\"\r\n#    else\r\n#      define FILENAME \"glew32mxs.dll\"\r\n#    endif\r\n#  else\r\n#    ifdef _DEBUG\r\n#      define FILENAME \"glew32mxd.dll\"\r\n#    else\r\n#      define FILENAME \"glew32mx.dll\"\r\n#    endif\r\n#  endif\r\n#else\r\n#  ifdef GLEW_STATIC\r\n#    ifdef _DEBUG\r\n#      define FILENAME \"glew32sd.dll\"\r\n#    else\r\n#      define FILENAME \"glew32s.dll\"\r\n#    endif\r\n#  else\r\n#    ifdef _DEBUG\r\n#      define FILENAME \"glew32d.dll\"\r\n#    else\r\n#      define FILENAME \"glew32.dll\"\r\n#    endif\r\n#  endif\r\n#endif\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Version\r\n//\r\nVS_VERSION_INFO VERSIONINFO \r\nFILEVERSION GLEW_MAJOR, GLEW_MINOR, GLEW_MICRO, 0\r\nPRODUCTVERSION GLEW_MAJOR, GLEW_MINOR, GLEW_MICRO, 0\r\nFILEFLAGSMASK VS_FFI_FILEFLAGSMASK\r\n#ifdef _DEBUG\r\nFILEFLAGS VS_FF_DEBUG\r\n#else\r\nFILEFLAGS 0x0L\r\n#endif\r\nFILEOS VOS__WINDOWS32\r\n#ifdef GLEW_STATIC\r\nFILETYPE VFT_STATIC_LIB\r\n#else\r\nFILETYPE VFT_DLL\r\n#endif\r\nFILESUBTYPE VFT2_UNKNOWN\r\nBEGIN\r\n    BLOCK \"StringFileInfo\"\r\n    BEGIN\r\n        BLOCK \"040904b0\"\r\n        BEGIN\r\n            VALUE \"Comments\", \"The OpenGL Extension Wrangler Library\\r\\nCopyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>\\r\\nCopyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>\\r\\nCopyright (C) 2002, Lev Povalahev\\r\\nAll rights reserved.\\r\\n\\r\\nRedistribution and use in source and binary forms, with or without \\r\\nmodification, are permitted provided that the following conditions are met:\\r\\n\\r\\n* Redistributions of source code must retain the above copyright notice, \\r\\n  this list of conditions and the following disclaimer.\\r\\n* Redistributions in binary form must reproduce the above copyright notice, \\r\\n  this list of conditions and the following disclaimer in the documentation \\r\\n  and/or other materials provided with the distribution.\\r\\n* The name of the author may be used to endorse or promote products \\r\\n  derived from this software without specific prior written permission.\\r\\n\\r\\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ''AS IS'' \\r\\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \\r\\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\\r\\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE \\r\\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \\r\\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \\r\\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\\r\\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\\r\\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\\r\\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\\r\\nTHE POSSIBILITY OF SUCH DAMAGE.\\r\\n\\r\\n\\r\\nMesa 3-D graphics library\\r\\n\\r\\nVersion:  7.0\\r\\n\\r\\nCopyright (C) 1999-2007  Brian Paul   All Rights Reserved.\\r\\n\\r\\nPermission is hereby granted, free of charge, to any person obtaining a\\r\\ncopy of this software and associated documentation files (the ''Software''),\\r\\nto deal in the Software without restriction, including without limitation\\r\\nthe rights to use, copy, modify, merge, publish, distribute, sublicense,\\r\\nand/or sell copies of the Software, and to permit persons to whom the\\r\\nSoftware is furnished to do so, subject to the following conditions:\\r\\n\\r\\nThe above copyright notice and this permission notice shall be included\\r\\nin all copies or substantial portions of the Software.\\r\\n\\r\\nTHE SOFTWARE IS PROVIDED ''AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS\\r\\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\\r\\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\\r\\nBRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN\\r\\nAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\\r\\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\\r\\n\\r\\n\\r\\nCopyright (c) 2007 The Khronos Group Inc.\\r\\n\\r\\nPermission is hereby granted, free of charge, to any person obtaining a\\r\\ncopy of this software and/or associated documentation files (the\\r\\n''Materials''), to deal in the Materials without restriction, including\\r\\nwithout limitation the rights to use, copy, modify, merge, publish,\\r\\ndistribute, sublicense, and/or sell copies of the Materials, and to\\r\\npermit persons to whom the Materials are furnished to do so, subject to\\r\\nthe following conditions:\\r\\n\\r\\nThe above copyright notice and this permission notice shall be included\\r\\nin all copies or substantial portions of the Materials.\\r\\n\\r\\nTHE MATERIALS ARE PROVIDED ''AS IS'', WITHOUT WARRANTY OF ANY KIND,\\r\\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\\r\\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\\r\\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\\r\\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\\r\\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\\r\\nMATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.\\0\"\r\n            VALUE \"CompanyName\", \"\\0\"\r\n            VALUE \"FileDescription\", \"The OpenGL Extension Wrangler Library\\0\"\r\n            VALUE \"FileVersion\", \"GLEW_MAJOR,GLEW_MINOR,GLEW_MICRO,0\\0\"\r\n            VALUE \"InternalName\", \"GLEW\\0\"\r\n            VALUE \"LegalCopyright\", \" 2002-2008 Milan Ikits & Marcelo Magallon\\0\"\r\n            VALUE \"LegalTrademarks\", \"\\0\"\r\n            VALUE \"OriginalFilename\", FILENAME \"\\0\"\r\n            VALUE \"PrivateBuild\", \"\\0\"\r\n            VALUE \"ProductName\", \"The OpenGL Extension Wrangler Library\\0\"\r\n            VALUE \"ProductVersion\", \"GLEW_MAJOR,GLEW_MINOR,GLEW_MICRO,0\\0\"\r\n            VALUE \"SpecialBuild\", \"\\0\"\r\n        END\r\n    END\r\n    BLOCK \"VarFileInfo\"\r\n    BEGIN\r\n        VALUE \"Translation\", 0x409, 1200\r\n    END\r\nEND\r\n"
  },
  {
    "path": "libs/glew/auto/src/glew_head.c",
    "content": "#include <GL/glew.h>\r\n#if defined(_WIN32)\r\n#  include <GL/wglew.h>\r\n#elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX)\r\n#  include <GL/glxew.h>\r\n#endif\r\n\r\n/*\r\n * Define glewGetContext and related helper macros.\r\n */\r\n#ifdef GLEW_MX\r\n#  define glewGetContext() ctx\r\n#  ifdef _WIN32\r\n#    define GLEW_CONTEXT_ARG_DEF_INIT GLEWContext* ctx\r\n#    define GLEW_CONTEXT_ARG_VAR_INIT ctx\r\n#    define wglewGetContext() ctx\r\n#    define WGLEW_CONTEXT_ARG_DEF_INIT WGLEWContext* ctx\r\n#    define WGLEW_CONTEXT_ARG_DEF_LIST WGLEWContext* ctx\r\n#  else /* _WIN32 */\r\n#    define GLEW_CONTEXT_ARG_DEF_INIT void\r\n#    define GLEW_CONTEXT_ARG_VAR_INIT\r\n#    define glxewGetContext() ctx\r\n#    define GLXEW_CONTEXT_ARG_DEF_INIT void\r\n#    define GLXEW_CONTEXT_ARG_DEF_LIST GLXEWContext* ctx\r\n#  endif /* _WIN32 */\r\n#  define GLEW_CONTEXT_ARG_DEF_LIST GLEWContext* ctx\r\n#else /* GLEW_MX */\r\n#  define GLEW_CONTEXT_ARG_DEF_INIT void\r\n#  define GLEW_CONTEXT_ARG_VAR_INIT\r\n#  define GLEW_CONTEXT_ARG_DEF_LIST void\r\n#  define WGLEW_CONTEXT_ARG_DEF_INIT void\r\n#  define WGLEW_CONTEXT_ARG_DEF_LIST void\r\n#  define GLXEW_CONTEXT_ARG_DEF_INIT void\r\n#  define GLXEW_CONTEXT_ARG_DEF_LIST void\r\n#endif /* GLEW_MX */\r\n\r\n#if defined(__APPLE__)\r\n#include <stdlib.h>\r\n#include <string.h>\r\n#include <AvailabilityMacros.h>\r\n\r\n#ifdef MAC_OS_X_VERSION_10_3\r\n\r\n#include <dlfcn.h>\r\n\r\nvoid* NSGLGetProcAddress (const GLubyte *name)\r\n{\r\n  static void* image = NULL;\r\n  if (NULL == image) \r\n  {\r\n    image = dlopen(\"/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL\", RTLD_LAZY);\r\n  }\r\n  return image ? dlsym(image, (const char*)name) : NULL;\r\n}\r\n#else\r\n\r\n#include <mach-o/dyld.h>\r\n\r\nvoid* NSGLGetProcAddress (const GLubyte *name)\r\n{\r\n  static const struct mach_header* image = NULL;\r\n  NSSymbol symbol;\r\n  char* symbolName;\r\n  if (NULL == image)\r\n  {\r\n    image = NSAddImage(\"/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL\", NSADDIMAGE_OPTION_RETURN_ON_ERROR);\r\n  }\r\n  /* prepend a '_' for the Unix C symbol mangling convention */\r\n  symbolName = malloc(strlen((const char*)name) + 2);\r\n  strcpy(symbolName+1, (const char*)name);\r\n  symbolName[0] = '_';\r\n  symbol = NULL;\r\n  /* if (NSIsSymbolNameDefined(symbolName))\r\n\t symbol = NSLookupAndBindSymbol(symbolName); */\r\n  symbol = image ? NSLookupSymbolInImage(image, symbolName, NSLOOKUPSYMBOLINIMAGE_OPTION_BIND | NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR) : NULL;\r\n  free(symbolName);\r\n  return symbol ? NSAddressOfSymbol(symbol) : NULL;\r\n}\r\n#endif /* MAC_OS_X_VERSION_10_3 */\r\n#endif /* __APPLE__ */\r\n\r\n#if defined(__sgi) || defined (__sun)\r\n#include <dlfcn.h>\r\n#include <stdio.h>\r\n#include <stdlib.h>\r\n\r\nvoid* dlGetProcAddress (const GLubyte* name)\r\n{\r\n  static void* h = NULL;\r\n  static void* gpa;\r\n\r\n  if (h == NULL)\r\n  {\r\n    if ((h = dlopen(NULL, RTLD_LAZY | RTLD_LOCAL)) == NULL) return NULL;\r\n    gpa = dlsym(h, \"glXGetProcAddress\");\r\n  }\r\n\r\n  if (gpa != NULL)\r\n    return ((void*(*)(const GLubyte*))gpa)(name);\r\n  else\r\n    return dlsym(h, (const char*)name);\r\n}\r\n#endif /* __sgi || __sun */\r\n\r\n/*\r\n * Define glewGetProcAddress.\r\n */\r\n#if defined(_WIN32)\r\n#  define glewGetProcAddress(name) wglGetProcAddress((LPCSTR)name)\r\n#else\r\n#  if defined(__APPLE__)\r\n#    define glewGetProcAddress(name) NSGLGetProcAddress(name)\r\n#  else\r\n#    if defined(__sgi) || defined(__sun)\r\n#      define glewGetProcAddress(name) dlGetProcAddress(name)\r\n#    else /* __linux */\r\n#      define glewGetProcAddress(name) (*glXGetProcAddressARB)(name)\r\n#    endif\r\n#  endif\r\n#endif\r\n\r\n/*\r\n * Define GLboolean const cast.\r\n */\r\n#define CONST_CAST(x) (*(GLboolean*)&x)\r\n\r\n/*\r\n * GLEW, just like OpenGL or GLU, does not rely on the standard C library.\r\n * These functions implement the functionality required in this file.\r\n */\r\nstatic GLuint _glewStrLen (const GLubyte* s)\r\n{\r\n  GLuint i=0;\r\n  if (s == NULL) return 0;\r\n  while (s[i] != '\\0') i++;\r\n  return i;\r\n}\r\n\r\nstatic GLuint _glewStrCLen (const GLubyte* s, GLubyte c)\r\n{\r\n  GLuint i=0;\r\n  if (s == NULL) return 0;\r\n  while (s[i] != '\\0' && s[i] != c) i++;\r\n  return (s[i] == '\\0' || s[i] == c) ? i : 0;\r\n}\r\n\r\nstatic GLboolean _glewStrSame (const GLubyte* a, const GLubyte* b, GLuint n)\r\n{\r\n  GLuint i=0;\r\n  if(a == NULL || b == NULL)\r\n    return (a == NULL && b == NULL && n == 0) ? GL_TRUE : GL_FALSE;\r\n  while (i < n && a[i] != '\\0' && b[i] != '\\0' && a[i] == b[i]) i++;\r\n  return i == n ? GL_TRUE : GL_FALSE;\r\n}\r\n\r\nstatic GLboolean _glewStrSame1 (GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb)\r\n{\r\n  while (*na > 0 && (**a == ' ' || **a == '\\n' || **a == '\\r' || **a == '\\t'))\r\n  {\r\n    (*a)++;\r\n    (*na)--;\r\n  }\r\n  if(*na >= nb)\r\n  {\r\n    GLuint i=0;\r\n    while (i < nb && (*a)+i != NULL && b+i != NULL && (*a)[i] == b[i]) i++;\r\n\tif(i == nb)\r\n\t{\r\n\t\t*a = *a + nb;\r\n\t\t*na = *na - nb;\r\n\t\treturn GL_TRUE;\r\n\t}\r\n  }\r\n  return GL_FALSE;\r\n}\r\n\r\nstatic GLboolean _glewStrSame2 (GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb)\r\n{\r\n  if(*na >= nb)\r\n  {\r\n    GLuint i=0;\r\n    while (i < nb && (*a)+i != NULL && b+i != NULL && (*a)[i] == b[i]) i++;\r\n\tif(i == nb)\r\n\t{\r\n\t\t*a = *a + nb;\r\n\t\t*na = *na - nb;\r\n\t\treturn GL_TRUE;\r\n\t}\r\n  }\r\n  return GL_FALSE;\r\n}\r\n\r\nstatic GLboolean _glewStrSame3 (GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb)\r\n{\r\n  if(*na >= nb)\r\n  {\r\n    GLuint i=0;\r\n    while (i < nb && (*a)+i != NULL && b+i != NULL && (*a)[i] == b[i]) i++;\r\n    if (i == nb && (*na == nb || (*a)[i] == ' ' || (*a)[i] == '\\n' || (*a)[i] == '\\r' || (*a)[i] == '\\t'))\r\n    {\r\n      *a = *a + nb;\r\n      *na = *na - nb;\r\n      return GL_TRUE;\r\n    }\r\n  }\r\n  return GL_FALSE;\r\n}\r\n"
  },
  {
    "path": "libs/glew/auto/src/glew_head.h",
    "content": "#ifndef __glew_h__\r\n#define __glew_h__\r\n#define __GLEW_H__\r\n\r\n#if defined(__gl_h_) || defined(__GL_H__) || defined(__X_GL_H)\r\n#error gl.h included before glew.h\r\n#endif\r\n#if defined(__glext_h_) || defined(__GLEXT_H_)\r\n#error glext.h included before glew.h\r\n#endif\r\n#if defined(__gl_ATI_h_)\r\n#error glATI.h included before glew.h\r\n#endif\r\n\r\n#define __gl_h_\r\n#define __GL_H__\r\n#define __X_GL_H\r\n#define __glext_h_\r\n#define __GLEXT_H_\r\n#define __gl_ATI_h_\r\n\r\n#if defined(_WIN32)\r\n\r\n/*\r\n * GLEW does not include <windows.h> to avoid name space pollution.\r\n * GL needs GLAPI and GLAPIENTRY, GLU needs APIENTRY, CALLBACK, and wchar_t\r\n * defined properly.\r\n */\r\n/* <windef.h> */\r\n#ifndef APIENTRY\r\n#define GLEW_APIENTRY_DEFINED\r\n#  if defined(__MINGW32__) || defined(__CYGWIN__)\r\n#    define APIENTRY __stdcall\r\n#  elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) || defined(__BORLANDC__)\r\n#    define APIENTRY __stdcall\r\n#  else\r\n#    define APIENTRY\r\n#  endif\r\n#endif\r\n#ifndef GLAPI\r\n#  if defined(__MINGW32__) || defined(__CYGWIN__)\r\n#    define GLAPI extern\r\n#  endif\r\n#endif\r\n/* <winnt.h> */\r\n#ifndef CALLBACK\r\n#define GLEW_CALLBACK_DEFINED\r\n#  if defined(__MINGW32__) || defined(__CYGWIN__)\r\n#    define CALLBACK __attribute__ ((__stdcall__))\r\n#  elif (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS)\r\n#    define CALLBACK __stdcall\r\n#  else\r\n#    define CALLBACK\r\n#  endif\r\n#endif\r\n/* <wingdi.h> and <winnt.h> */\r\n#ifndef WINGDIAPI\r\n#define GLEW_WINGDIAPI_DEFINED\r\n#define WINGDIAPI __declspec(dllimport)\r\n#endif\r\n/* <ctype.h> */\r\n#if (defined(_MSC_VER) || defined(__BORLANDC__)) && !defined(_WCHAR_T_DEFINED)\r\ntypedef unsigned short wchar_t;\r\n#  define _WCHAR_T_DEFINED\r\n#endif\r\n/* <stddef.h> */\r\n#if !defined(_W64)\r\n#  if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && defined(_MSC_VER) && _MSC_VER >= 1300\r\n#    define _W64 __w64\r\n#  else\r\n#    define _W64\r\n#  endif\r\n#endif\r\n#if !defined(_PTRDIFF_T_DEFINED) && !defined(_PTRDIFF_T_)\r\n#  ifdef _WIN64\r\ntypedef __int64 ptrdiff_t;\r\n#  else\r\ntypedef _W64 int ptrdiff_t;\r\n#  endif\r\n#  define _PTRDIFF_T_DEFINED\r\n#  define _PTRDIFF_T_\r\n#endif\r\n\r\n#ifndef GLAPI\r\n#  if defined(__MINGW32__) || defined(__CYGWIN__)\r\n#    define GLAPI extern\r\n#  else\r\n#    define GLAPI WINGDIAPI\r\n#  endif\r\n#endif\r\n\r\n#ifndef GLAPIENTRY\r\n#define GLAPIENTRY APIENTRY\r\n#endif\r\n\r\n/*\r\n * GLEW_STATIC needs to be set when using the static version.\r\n * GLEW_BUILD is set when building the DLL version.\r\n */\r\n#ifdef GLEW_STATIC\r\n#  define GLEWAPI extern\r\n#else\r\n#  ifdef GLEW_BUILD\r\n#    define GLEWAPI extern __declspec(dllexport)\r\n#  else\r\n#    define GLEWAPI extern __declspec(dllimport)\r\n#  endif\r\n#endif\r\n\r\n#else /* _UNIX */\r\n\r\n/*\r\n * Needed for ptrdiff_t in turn needed by VBO.  This is defined by ISO\r\n * C.  On my system, this amounts to _3 lines_ of included code, all of\r\n * them pretty much harmless.  If you know of a way of detecting 32 vs\r\n * 64 _targets_ at compile time you are free to replace this with\r\n * something that's portable.  For now, _this_ is the portable solution.\r\n * (mem, 2004-01-04)\r\n */\r\n\r\n#include <stddef.h>\r\n#include <stdint.h>\r\n\r\n#define GLEW_APIENTRY_DEFINED\r\n#define APIENTRY\r\n#define GLEWAPI extern\r\n\r\n/* <glu.h> */\r\n#ifndef GLAPI\r\n#define GLAPI extern\r\n#endif\r\n#ifndef GLAPIENTRY\r\n#define GLAPIENTRY\r\n#endif\r\n\r\n#endif /* _WIN32 */\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/* ----------------------------- GL_VERSION_1_1 ---------------------------- */\r\n\r\n#ifndef GL_VERSION_1_1\r\n#define GL_VERSION_1_1 1\r\n\r\ntypedef unsigned int GLenum;\r\ntypedef unsigned int GLbitfield;\r\ntypedef unsigned int GLuint;\r\ntypedef int GLint;\r\ntypedef int GLsizei;\r\ntypedef unsigned char GLboolean;\r\ntypedef signed char GLbyte;\r\ntypedef short GLshort;\r\ntypedef unsigned char GLubyte;\r\ntypedef unsigned short GLushort;\r\ntypedef unsigned long GLulong;\r\ntypedef float GLfloat;\r\ntypedef float GLclampf;\r\ntypedef double GLdouble;\r\ntypedef double GLclampd;\r\ntypedef void GLvoid;\r\n#if defined(_MSC_VER)\r\n#  if _MSC_VER < 1400\r\ntypedef __int64 GLint64EXT;\r\ntypedef unsigned __int64 GLuint64EXT;\r\n#  else\r\ntypedef signed long long GLint64EXT;\r\ntypedef unsigned long long GLuint64EXT;\r\n#  endif\r\n#else\r\n#  if defined(__MINGW32__) || defined(__CYGWIN__)\r\n#include <inttypes.h>\r\n#  endif\r\ntypedef int64_t GLint64EXT;\r\ntypedef uint64_t GLuint64EXT;\r\n#endif\r\ntypedef GLint64EXT  GLint64;\r\ntypedef GLuint64EXT GLuint64;\r\ntypedef struct __GLsync *GLsync;\r\n\r\n#define GL_ACCUM 0x0100\r\n#define GL_LOAD 0x0101\r\n#define GL_RETURN 0x0102\r\n#define GL_MULT 0x0103\r\n#define GL_ADD 0x0104\r\n#define GL_NEVER 0x0200\r\n#define GL_LESS 0x0201\r\n#define GL_EQUAL 0x0202\r\n#define GL_LEQUAL 0x0203\r\n#define GL_GREATER 0x0204\r\n#define GL_NOTEQUAL 0x0205\r\n#define GL_GEQUAL 0x0206\r\n#define GL_ALWAYS 0x0207\r\n#define GL_CURRENT_BIT 0x00000001\r\n#define GL_POINT_BIT 0x00000002\r\n#define GL_LINE_BIT 0x00000004\r\n#define GL_POLYGON_BIT 0x00000008\r\n#define GL_POLYGON_STIPPLE_BIT 0x00000010\r\n#define GL_PIXEL_MODE_BIT 0x00000020\r\n#define GL_LIGHTING_BIT 0x00000040\r\n#define GL_FOG_BIT 0x00000080\r\n#define GL_DEPTH_BUFFER_BIT 0x00000100\r\n#define GL_ACCUM_BUFFER_BIT 0x00000200\r\n#define GL_STENCIL_BUFFER_BIT 0x00000400\r\n#define GL_VIEWPORT_BIT 0x00000800\r\n#define GL_TRANSFORM_BIT 0x00001000\r\n#define GL_ENABLE_BIT 0x00002000\r\n#define GL_COLOR_BUFFER_BIT 0x00004000\r\n#define GL_HINT_BIT 0x00008000\r\n#define GL_EVAL_BIT 0x00010000\r\n#define GL_LIST_BIT 0x00020000\r\n#define GL_TEXTURE_BIT 0x00040000\r\n#define GL_SCISSOR_BIT 0x00080000\r\n#define GL_ALL_ATTRIB_BITS 0x000fffff\r\n#define GL_POINTS 0x0000\r\n#define GL_LINES 0x0001\r\n#define GL_LINE_LOOP 0x0002\r\n#define GL_LINE_STRIP 0x0003\r\n#define GL_TRIANGLES 0x0004\r\n#define GL_TRIANGLE_STRIP 0x0005\r\n#define GL_TRIANGLE_FAN 0x0006\r\n#define GL_QUADS 0x0007\r\n#define GL_QUAD_STRIP 0x0008\r\n#define GL_POLYGON 0x0009\r\n#define GL_ZERO 0\r\n#define GL_ONE 1\r\n#define GL_SRC_COLOR 0x0300\r\n#define GL_ONE_MINUS_SRC_COLOR 0x0301\r\n#define GL_SRC_ALPHA 0x0302\r\n#define GL_ONE_MINUS_SRC_ALPHA 0x0303\r\n#define GL_DST_ALPHA 0x0304\r\n#define GL_ONE_MINUS_DST_ALPHA 0x0305\r\n#define GL_DST_COLOR 0x0306\r\n#define GL_ONE_MINUS_DST_COLOR 0x0307\r\n#define GL_SRC_ALPHA_SATURATE 0x0308\r\n#define GL_TRUE 1\r\n#define GL_FALSE 0\r\n#define GL_CLIP_PLANE0 0x3000\r\n#define GL_CLIP_PLANE1 0x3001\r\n#define GL_CLIP_PLANE2 0x3002\r\n#define GL_CLIP_PLANE3 0x3003\r\n#define GL_CLIP_PLANE4 0x3004\r\n#define GL_CLIP_PLANE5 0x3005\r\n#define GL_BYTE 0x1400\r\n#define GL_UNSIGNED_BYTE 0x1401\r\n#define GL_SHORT 0x1402\r\n#define GL_UNSIGNED_SHORT 0x1403\r\n#define GL_INT 0x1404\r\n#define GL_UNSIGNED_INT 0x1405\r\n#define GL_FLOAT 0x1406\r\n#define GL_2_BYTES 0x1407\r\n#define GL_3_BYTES 0x1408\r\n#define GL_4_BYTES 0x1409\r\n#define GL_DOUBLE 0x140A\r\n#define GL_NONE 0\r\n#define GL_FRONT_LEFT 0x0400\r\n#define GL_FRONT_RIGHT 0x0401\r\n#define GL_BACK_LEFT 0x0402\r\n#define GL_BACK_RIGHT 0x0403\r\n#define GL_FRONT 0x0404\r\n#define GL_BACK 0x0405\r\n#define GL_LEFT 0x0406\r\n#define GL_RIGHT 0x0407\r\n#define GL_FRONT_AND_BACK 0x0408\r\n#define GL_AUX0 0x0409\r\n#define GL_AUX1 0x040A\r\n#define GL_AUX2 0x040B\r\n#define GL_AUX3 0x040C\r\n#define GL_NO_ERROR 0\r\n#define GL_INVALID_ENUM 0x0500\r\n#define GL_INVALID_VALUE 0x0501\r\n#define GL_INVALID_OPERATION 0x0502\r\n#define GL_STACK_OVERFLOW 0x0503\r\n#define GL_STACK_UNDERFLOW 0x0504\r\n#define GL_OUT_OF_MEMORY 0x0505\r\n#define GL_2D 0x0600\r\n#define GL_3D 0x0601\r\n#define GL_3D_COLOR 0x0602\r\n#define GL_3D_COLOR_TEXTURE 0x0603\r\n#define GL_4D_COLOR_TEXTURE 0x0604\r\n#define GL_PASS_THROUGH_TOKEN 0x0700\r\n#define GL_POINT_TOKEN 0x0701\r\n#define GL_LINE_TOKEN 0x0702\r\n#define GL_POLYGON_TOKEN 0x0703\r\n#define GL_BITMAP_TOKEN 0x0704\r\n#define GL_DRAW_PIXEL_TOKEN 0x0705\r\n#define GL_COPY_PIXEL_TOKEN 0x0706\r\n#define GL_LINE_RESET_TOKEN 0x0707\r\n#define GL_EXP 0x0800\r\n#define GL_EXP2 0x0801\r\n#define GL_CW 0x0900\r\n#define GL_CCW 0x0901\r\n#define GL_COEFF 0x0A00\r\n#define GL_ORDER 0x0A01\r\n#define GL_DOMAIN 0x0A02\r\n#define GL_CURRENT_COLOR 0x0B00\r\n#define GL_CURRENT_INDEX 0x0B01\r\n#define GL_CURRENT_NORMAL 0x0B02\r\n#define GL_CURRENT_TEXTURE_COORDS 0x0B03\r\n#define GL_CURRENT_RASTER_COLOR 0x0B04\r\n#define GL_CURRENT_RASTER_INDEX 0x0B05\r\n#define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06\r\n#define GL_CURRENT_RASTER_POSITION 0x0B07\r\n#define GL_CURRENT_RASTER_POSITION_VALID 0x0B08\r\n#define GL_CURRENT_RASTER_DISTANCE 0x0B09\r\n#define GL_POINT_SMOOTH 0x0B10\r\n#define GL_POINT_SIZE 0x0B11\r\n#define GL_POINT_SIZE_RANGE 0x0B12\r\n#define GL_POINT_SIZE_GRANULARITY 0x0B13\r\n#define GL_LINE_SMOOTH 0x0B20\r\n#define GL_LINE_WIDTH 0x0B21\r\n#define GL_LINE_WIDTH_RANGE 0x0B22\r\n#define GL_LINE_WIDTH_GRANULARITY 0x0B23\r\n#define GL_LINE_STIPPLE 0x0B24\r\n#define GL_LINE_STIPPLE_PATTERN 0x0B25\r\n#define GL_LINE_STIPPLE_REPEAT 0x0B26\r\n#define GL_LIST_MODE 0x0B30\r\n#define GL_MAX_LIST_NESTING 0x0B31\r\n#define GL_LIST_BASE 0x0B32\r\n#define GL_LIST_INDEX 0x0B33\r\n#define GL_POLYGON_MODE 0x0B40\r\n#define GL_POLYGON_SMOOTH 0x0B41\r\n#define GL_POLYGON_STIPPLE 0x0B42\r\n#define GL_EDGE_FLAG 0x0B43\r\n#define GL_CULL_FACE 0x0B44\r\n#define GL_CULL_FACE_MODE 0x0B45\r\n#define GL_FRONT_FACE 0x0B46\r\n#define GL_LIGHTING 0x0B50\r\n#define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51\r\n#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52\r\n#define GL_LIGHT_MODEL_AMBIENT 0x0B53\r\n#define GL_SHADE_MODEL 0x0B54\r\n#define GL_COLOR_MATERIAL_FACE 0x0B55\r\n#define GL_COLOR_MATERIAL_PARAMETER 0x0B56\r\n#define GL_COLOR_MATERIAL 0x0B57\r\n#define GL_FOG 0x0B60\r\n#define GL_FOG_INDEX 0x0B61\r\n#define GL_FOG_DENSITY 0x0B62\r\n#define GL_FOG_START 0x0B63\r\n#define GL_FOG_END 0x0B64\r\n#define GL_FOG_MODE 0x0B65\r\n#define GL_FOG_COLOR 0x0B66\r\n#define GL_DEPTH_RANGE 0x0B70\r\n#define GL_DEPTH_TEST 0x0B71\r\n#define GL_DEPTH_WRITEMASK 0x0B72\r\n#define GL_DEPTH_CLEAR_VALUE 0x0B73\r\n#define GL_DEPTH_FUNC 0x0B74\r\n#define GL_ACCUM_CLEAR_VALUE 0x0B80\r\n#define GL_STENCIL_TEST 0x0B90\r\n#define GL_STENCIL_CLEAR_VALUE 0x0B91\r\n#define GL_STENCIL_FUNC 0x0B92\r\n#define GL_STENCIL_VALUE_MASK 0x0B93\r\n#define GL_STENCIL_FAIL 0x0B94\r\n#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95\r\n#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96\r\n#define GL_STENCIL_REF 0x0B97\r\n#define GL_STENCIL_WRITEMASK 0x0B98\r\n#define GL_MATRIX_MODE 0x0BA0\r\n#define GL_NORMALIZE 0x0BA1\r\n#define GL_VIEWPORT 0x0BA2\r\n#define GL_MODELVIEW_STACK_DEPTH 0x0BA3\r\n#define GL_PROJECTION_STACK_DEPTH 0x0BA4\r\n#define GL_TEXTURE_STACK_DEPTH 0x0BA5\r\n#define GL_MODELVIEW_MATRIX 0x0BA6\r\n#define GL_PROJECTION_MATRIX 0x0BA7\r\n#define GL_TEXTURE_MATRIX 0x0BA8\r\n#define GL_ATTRIB_STACK_DEPTH 0x0BB0\r\n#define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1\r\n#define GL_ALPHA_TEST 0x0BC0\r\n#define GL_ALPHA_TEST_FUNC 0x0BC1\r\n#define GL_ALPHA_TEST_REF 0x0BC2\r\n#define GL_DITHER 0x0BD0\r\n#define GL_BLEND_DST 0x0BE0\r\n#define GL_BLEND_SRC 0x0BE1\r\n#define GL_BLEND 0x0BE2\r\n#define GL_LOGIC_OP_MODE 0x0BF0\r\n#define GL_INDEX_LOGIC_OP 0x0BF1\r\n#define GL_COLOR_LOGIC_OP 0x0BF2\r\n#define GL_AUX_BUFFERS 0x0C00\r\n#define GL_DRAW_BUFFER 0x0C01\r\n#define GL_READ_BUFFER 0x0C02\r\n#define GL_SCISSOR_BOX 0x0C10\r\n#define GL_SCISSOR_TEST 0x0C11\r\n#define GL_INDEX_CLEAR_VALUE 0x0C20\r\n#define GL_INDEX_WRITEMASK 0x0C21\r\n#define GL_COLOR_CLEAR_VALUE 0x0C22\r\n#define GL_COLOR_WRITEMASK 0x0C23\r\n#define GL_INDEX_MODE 0x0C30\r\n#define GL_RGBA_MODE 0x0C31\r\n#define GL_DOUBLEBUFFER 0x0C32\r\n#define GL_STEREO 0x0C33\r\n#define GL_RENDER_MODE 0x0C40\r\n#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50\r\n#define GL_POINT_SMOOTH_HINT 0x0C51\r\n#define GL_LINE_SMOOTH_HINT 0x0C52\r\n#define GL_POLYGON_SMOOTH_HINT 0x0C53\r\n#define GL_FOG_HINT 0x0C54\r\n#define GL_TEXTURE_GEN_S 0x0C60\r\n#define GL_TEXTURE_GEN_T 0x0C61\r\n#define GL_TEXTURE_GEN_R 0x0C62\r\n#define GL_TEXTURE_GEN_Q 0x0C63\r\n#define GL_PIXEL_MAP_I_TO_I 0x0C70\r\n#define GL_PIXEL_MAP_S_TO_S 0x0C71\r\n#define GL_PIXEL_MAP_I_TO_R 0x0C72\r\n#define GL_PIXEL_MAP_I_TO_G 0x0C73\r\n#define GL_PIXEL_MAP_I_TO_B 0x0C74\r\n#define GL_PIXEL_MAP_I_TO_A 0x0C75\r\n#define GL_PIXEL_MAP_R_TO_R 0x0C76\r\n#define GL_PIXEL_MAP_G_TO_G 0x0C77\r\n#define GL_PIXEL_MAP_B_TO_B 0x0C78\r\n#define GL_PIXEL_MAP_A_TO_A 0x0C79\r\n#define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0\r\n#define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1\r\n#define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2\r\n#define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3\r\n#define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4\r\n#define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5\r\n#define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6\r\n#define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7\r\n#define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8\r\n#define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9\r\n#define GL_UNPACK_SWAP_BYTES 0x0CF0\r\n#define GL_UNPACK_LSB_FIRST 0x0CF1\r\n#define GL_UNPACK_ROW_LENGTH 0x0CF2\r\n#define GL_UNPACK_SKIP_ROWS 0x0CF3\r\n#define GL_UNPACK_SKIP_PIXELS 0x0CF4\r\n#define GL_UNPACK_ALIGNMENT 0x0CF5\r\n#define GL_PACK_SWAP_BYTES 0x0D00\r\n#define GL_PACK_LSB_FIRST 0x0D01\r\n#define GL_PACK_ROW_LENGTH 0x0D02\r\n#define GL_PACK_SKIP_ROWS 0x0D03\r\n#define GL_PACK_SKIP_PIXELS 0x0D04\r\n#define GL_PACK_ALIGNMENT 0x0D05\r\n#define GL_MAP_COLOR 0x0D10\r\n#define GL_MAP_STENCIL 0x0D11\r\n#define GL_INDEX_SHIFT 0x0D12\r\n#define GL_INDEX_OFFSET 0x0D13\r\n#define GL_RED_SCALE 0x0D14\r\n#define GL_RED_BIAS 0x0D15\r\n#define GL_ZOOM_X 0x0D16\r\n#define GL_ZOOM_Y 0x0D17\r\n#define GL_GREEN_SCALE 0x0D18\r\n#define GL_GREEN_BIAS 0x0D19\r\n#define GL_BLUE_SCALE 0x0D1A\r\n#define GL_BLUE_BIAS 0x0D1B\r\n#define GL_ALPHA_SCALE 0x0D1C\r\n#define GL_ALPHA_BIAS 0x0D1D\r\n#define GL_DEPTH_SCALE 0x0D1E\r\n#define GL_DEPTH_BIAS 0x0D1F\r\n#define GL_MAX_EVAL_ORDER 0x0D30\r\n#define GL_MAX_LIGHTS 0x0D31\r\n#define GL_MAX_CLIP_PLANES 0x0D32\r\n#define GL_MAX_TEXTURE_SIZE 0x0D33\r\n#define GL_MAX_PIXEL_MAP_TABLE 0x0D34\r\n#define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35\r\n#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36\r\n#define GL_MAX_NAME_STACK_DEPTH 0x0D37\r\n#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38\r\n#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39\r\n#define GL_MAX_VIEWPORT_DIMS 0x0D3A\r\n#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B\r\n#define GL_SUBPIXEL_BITS 0x0D50\r\n#define GL_INDEX_BITS 0x0D51\r\n#define GL_RED_BITS 0x0D52\r\n#define GL_GREEN_BITS 0x0D53\r\n#define GL_BLUE_BITS 0x0D54\r\n#define GL_ALPHA_BITS 0x0D55\r\n#define GL_DEPTH_BITS 0x0D56\r\n#define GL_STENCIL_BITS 0x0D57\r\n#define GL_ACCUM_RED_BITS 0x0D58\r\n#define GL_ACCUM_GREEN_BITS 0x0D59\r\n#define GL_ACCUM_BLUE_BITS 0x0D5A\r\n#define GL_ACCUM_ALPHA_BITS 0x0D5B\r\n#define GL_NAME_STACK_DEPTH 0x0D70\r\n#define GL_AUTO_NORMAL 0x0D80\r\n#define GL_MAP1_COLOR_4 0x0D90\r\n#define GL_MAP1_INDEX 0x0D91\r\n#define GL_MAP1_NORMAL 0x0D92\r\n#define GL_MAP1_TEXTURE_COORD_1 0x0D93\r\n#define GL_MAP1_TEXTURE_COORD_2 0x0D94\r\n#define GL_MAP1_TEXTURE_COORD_3 0x0D95\r\n#define GL_MAP1_TEXTURE_COORD_4 0x0D96\r\n#define GL_MAP1_VERTEX_3 0x0D97\r\n#define GL_MAP1_VERTEX_4 0x0D98\r\n#define GL_MAP2_COLOR_4 0x0DB0\r\n#define GL_MAP2_INDEX 0x0DB1\r\n#define GL_MAP2_NORMAL 0x0DB2\r\n#define GL_MAP2_TEXTURE_COORD_1 0x0DB3\r\n#define GL_MAP2_TEXTURE_COORD_2 0x0DB4\r\n#define GL_MAP2_TEXTURE_COORD_3 0x0DB5\r\n#define GL_MAP2_TEXTURE_COORD_4 0x0DB6\r\n#define GL_MAP2_VERTEX_3 0x0DB7\r\n#define GL_MAP2_VERTEX_4 0x0DB8\r\n#define GL_MAP1_GRID_DOMAIN 0x0DD0\r\n#define GL_MAP1_GRID_SEGMENTS 0x0DD1\r\n#define GL_MAP2_GRID_DOMAIN 0x0DD2\r\n#define GL_MAP2_GRID_SEGMENTS 0x0DD3\r\n#define GL_TEXTURE_1D 0x0DE0\r\n#define GL_TEXTURE_2D 0x0DE1\r\n#define GL_FEEDBACK_BUFFER_POINTER 0x0DF0\r\n#define GL_FEEDBACK_BUFFER_SIZE 0x0DF1\r\n#define GL_FEEDBACK_BUFFER_TYPE 0x0DF2\r\n#define GL_SELECTION_BUFFER_POINTER 0x0DF3\r\n#define GL_SELECTION_BUFFER_SIZE 0x0DF4\r\n#define GL_TEXTURE_WIDTH 0x1000\r\n#define GL_TEXTURE_HEIGHT 0x1001\r\n#define GL_TEXTURE_INTERNAL_FORMAT 0x1003\r\n#define GL_TEXTURE_BORDER_COLOR 0x1004\r\n#define GL_TEXTURE_BORDER 0x1005\r\n#define GL_DONT_CARE 0x1100\r\n#define GL_FASTEST 0x1101\r\n#define GL_NICEST 0x1102\r\n#define GL_LIGHT0 0x4000\r\n#define GL_LIGHT1 0x4001\r\n#define GL_LIGHT2 0x4002\r\n#define GL_LIGHT3 0x4003\r\n#define GL_LIGHT4 0x4004\r\n#define GL_LIGHT5 0x4005\r\n#define GL_LIGHT6 0x4006\r\n#define GL_LIGHT7 0x4007\r\n#define GL_AMBIENT 0x1200\r\n#define GL_DIFFUSE 0x1201\r\n#define GL_SPECULAR 0x1202\r\n#define GL_POSITION 0x1203\r\n#define GL_SPOT_DIRECTION 0x1204\r\n#define GL_SPOT_EXPONENT 0x1205\r\n#define GL_SPOT_CUTOFF 0x1206\r\n#define GL_CONSTANT_ATTENUATION 0x1207\r\n#define GL_LINEAR_ATTENUATION 0x1208\r\n#define GL_QUADRATIC_ATTENUATION 0x1209\r\n#define GL_COMPILE 0x1300\r\n#define GL_COMPILE_AND_EXECUTE 0x1301\r\n#define GL_CLEAR 0x1500\r\n#define GL_AND 0x1501\r\n#define GL_AND_REVERSE 0x1502\r\n#define GL_COPY 0x1503\r\n#define GL_AND_INVERTED 0x1504\r\n#define GL_NOOP 0x1505\r\n#define GL_XOR 0x1506\r\n#define GL_OR 0x1507\r\n#define GL_NOR 0x1508\r\n#define GL_EQUIV 0x1509\r\n#define GL_INVERT 0x150A\r\n#define GL_OR_REVERSE 0x150B\r\n#define GL_COPY_INVERTED 0x150C\r\n#define GL_OR_INVERTED 0x150D\r\n#define GL_NAND 0x150E\r\n#define GL_SET 0x150F\r\n#define GL_EMISSION 0x1600\r\n#define GL_SHININESS 0x1601\r\n#define GL_AMBIENT_AND_DIFFUSE 0x1602\r\n#define GL_COLOR_INDEXES 0x1603\r\n#define GL_MODELVIEW 0x1700\r\n#define GL_PROJECTION 0x1701\r\n#define GL_TEXTURE 0x1702\r\n#define GL_COLOR 0x1800\r\n#define GL_DEPTH 0x1801\r\n#define GL_STENCIL 0x1802\r\n#define GL_COLOR_INDEX 0x1900\r\n#define GL_STENCIL_INDEX 0x1901\r\n#define GL_DEPTH_COMPONENT 0x1902\r\n#define GL_RED 0x1903\r\n#define GL_GREEN 0x1904\r\n#define GL_BLUE 0x1905\r\n#define GL_ALPHA 0x1906\r\n#define GL_RGB 0x1907\r\n#define GL_RGBA 0x1908\r\n#define GL_LUMINANCE 0x1909\r\n#define GL_LUMINANCE_ALPHA 0x190A\r\n#define GL_BITMAP 0x1A00\r\n#define GL_POINT 0x1B00\r\n#define GL_LINE 0x1B01\r\n#define GL_FILL 0x1B02\r\n#define GL_RENDER 0x1C00\r\n#define GL_FEEDBACK 0x1C01\r\n#define GL_SELECT 0x1C02\r\n#define GL_FLAT 0x1D00\r\n#define GL_SMOOTH 0x1D01\r\n#define GL_KEEP 0x1E00\r\n#define GL_REPLACE 0x1E01\r\n#define GL_INCR 0x1E02\r\n#define GL_DECR 0x1E03\r\n#define GL_VENDOR 0x1F00\r\n#define GL_RENDERER 0x1F01\r\n#define GL_VERSION 0x1F02\r\n#define GL_EXTENSIONS 0x1F03\r\n#define GL_S 0x2000\r\n#define GL_T 0x2001\r\n#define GL_R 0x2002\r\n#define GL_Q 0x2003\r\n#define GL_MODULATE 0x2100\r\n#define GL_DECAL 0x2101\r\n#define GL_TEXTURE_ENV_MODE 0x2200\r\n#define GL_TEXTURE_ENV_COLOR 0x2201\r\n#define GL_TEXTURE_ENV 0x2300\r\n#define GL_EYE_LINEAR 0x2400\r\n#define GL_OBJECT_LINEAR 0x2401\r\n#define GL_SPHERE_MAP 0x2402\r\n#define GL_TEXTURE_GEN_MODE 0x2500\r\n#define GL_OBJECT_PLANE 0x2501\r\n#define GL_EYE_PLANE 0x2502\r\n#define GL_NEAREST 0x2600\r\n#define GL_LINEAR 0x2601\r\n#define GL_NEAREST_MIPMAP_NEAREST 0x2700\r\n#define GL_LINEAR_MIPMAP_NEAREST 0x2701\r\n#define GL_NEAREST_MIPMAP_LINEAR 0x2702\r\n#define GL_LINEAR_MIPMAP_LINEAR 0x2703\r\n#define GL_TEXTURE_MAG_FILTER 0x2800\r\n#define GL_TEXTURE_MIN_FILTER 0x2801\r\n#define GL_TEXTURE_WRAP_S 0x2802\r\n#define GL_TEXTURE_WRAP_T 0x2803\r\n#define GL_CLAMP 0x2900\r\n#define GL_REPEAT 0x2901\r\n#define GL_CLIENT_PIXEL_STORE_BIT 0x00000001\r\n#define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002\r\n#define GL_CLIENT_ALL_ATTRIB_BITS 0xffffffff\r\n#define GL_POLYGON_OFFSET_FACTOR 0x8038\r\n#define GL_POLYGON_OFFSET_UNITS 0x2A00\r\n#define GL_POLYGON_OFFSET_POINT 0x2A01\r\n#define GL_POLYGON_OFFSET_LINE 0x2A02\r\n#define GL_POLYGON_OFFSET_FILL 0x8037\r\n#define GL_ALPHA4 0x803B\r\n#define GL_ALPHA8 0x803C\r\n#define GL_ALPHA12 0x803D\r\n#define GL_ALPHA16 0x803E\r\n#define GL_LUMINANCE4 0x803F\r\n#define GL_LUMINANCE8 0x8040\r\n#define GL_LUMINANCE12 0x8041\r\n#define GL_LUMINANCE16 0x8042\r\n#define GL_LUMINANCE4_ALPHA4 0x8043\r\n#define GL_LUMINANCE6_ALPHA2 0x8044\r\n#define GL_LUMINANCE8_ALPHA8 0x8045\r\n#define GL_LUMINANCE12_ALPHA4 0x8046\r\n#define GL_LUMINANCE12_ALPHA12 0x8047\r\n#define GL_LUMINANCE16_ALPHA16 0x8048\r\n#define GL_INTENSITY 0x8049\r\n#define GL_INTENSITY4 0x804A\r\n#define GL_INTENSITY8 0x804B\r\n#define GL_INTENSITY12 0x804C\r\n#define GL_INTENSITY16 0x804D\r\n#define GL_R3_G3_B2 0x2A10\r\n#define GL_RGB4 0x804F\r\n#define GL_RGB5 0x8050\r\n#define GL_RGB8 0x8051\r\n#define GL_RGB10 0x8052\r\n#define GL_RGB12 0x8053\r\n#define GL_RGB16 0x8054\r\n#define GL_RGBA2 0x8055\r\n#define GL_RGBA4 0x8056\r\n#define GL_RGB5_A1 0x8057\r\n#define GL_RGBA8 0x8058\r\n#define GL_RGB10_A2 0x8059\r\n#define GL_RGBA12 0x805A\r\n#define GL_RGBA16 0x805B\r\n#define GL_TEXTURE_RED_SIZE 0x805C\r\n#define GL_TEXTURE_GREEN_SIZE 0x805D\r\n#define GL_TEXTURE_BLUE_SIZE 0x805E\r\n#define GL_TEXTURE_ALPHA_SIZE 0x805F\r\n#define GL_TEXTURE_LUMINANCE_SIZE 0x8060\r\n#define GL_TEXTURE_INTENSITY_SIZE 0x8061\r\n#define GL_PROXY_TEXTURE_1D 0x8063\r\n#define GL_PROXY_TEXTURE_2D 0x8064\r\n#define GL_TEXTURE_PRIORITY 0x8066\r\n#define GL_TEXTURE_RESIDENT 0x8067\r\n#define GL_TEXTURE_BINDING_1D 0x8068\r\n#define GL_TEXTURE_BINDING_2D 0x8069\r\n#define GL_VERTEX_ARRAY 0x8074\r\n#define GL_NORMAL_ARRAY 0x8075\r\n#define GL_COLOR_ARRAY 0x8076\r\n#define GL_INDEX_ARRAY 0x8077\r\n#define GL_TEXTURE_COORD_ARRAY 0x8078\r\n#define GL_EDGE_FLAG_ARRAY 0x8079\r\n#define GL_VERTEX_ARRAY_SIZE 0x807A\r\n#define GL_VERTEX_ARRAY_TYPE 0x807B\r\n#define GL_VERTEX_ARRAY_STRIDE 0x807C\r\n#define GL_NORMAL_ARRAY_TYPE 0x807E\r\n#define GL_NORMAL_ARRAY_STRIDE 0x807F\r\n#define GL_COLOR_ARRAY_SIZE 0x8081\r\n#define GL_COLOR_ARRAY_TYPE 0x8082\r\n#define GL_COLOR_ARRAY_STRIDE 0x8083\r\n#define GL_INDEX_ARRAY_TYPE 0x8085\r\n#define GL_INDEX_ARRAY_STRIDE 0x8086\r\n#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088\r\n#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089\r\n#define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A\r\n#define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C\r\n#define GL_VERTEX_ARRAY_POINTER 0x808E\r\n#define GL_NORMAL_ARRAY_POINTER 0x808F\r\n#define GL_COLOR_ARRAY_POINTER 0x8090\r\n#define GL_INDEX_ARRAY_POINTER 0x8091\r\n#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092\r\n#define GL_EDGE_FLAG_ARRAY_POINTER 0x8093\r\n#define GL_V2F 0x2A20\r\n#define GL_V3F 0x2A21\r\n#define GL_C4UB_V2F 0x2A22\r\n#define GL_C4UB_V3F 0x2A23\r\n#define GL_C3F_V3F 0x2A24\r\n#define GL_N3F_V3F 0x2A25\r\n#define GL_C4F_N3F_V3F 0x2A26\r\n#define GL_T2F_V3F 0x2A27\r\n#define GL_T4F_V4F 0x2A28\r\n#define GL_T2F_C4UB_V3F 0x2A29\r\n#define GL_T2F_C3F_V3F 0x2A2A\r\n#define GL_T2F_N3F_V3F 0x2A2B\r\n#define GL_T2F_C4F_N3F_V3F 0x2A2C\r\n#define GL_T4F_C4F_N3F_V4F 0x2A2D\r\n#define GL_LOGIC_OP GL_INDEX_LOGIC_OP\r\n#define GL_TEXTURE_COMPONENTS GL_TEXTURE_INTERNAL_FORMAT\r\n#define GL_COLOR_INDEX1_EXT 0x80E2\r\n#define GL_COLOR_INDEX2_EXT 0x80E3\r\n#define GL_COLOR_INDEX4_EXT 0x80E4\r\n#define GL_COLOR_INDEX8_EXT 0x80E5\r\n#define GL_COLOR_INDEX12_EXT 0x80E6\r\n#define GL_COLOR_INDEX16_EXT 0x80E7\r\n\r\nGLAPI void GLAPIENTRY glAccum (GLenum op, GLfloat value);\r\nGLAPI void GLAPIENTRY glAlphaFunc (GLenum func, GLclampf ref);\r\nGLAPI GLboolean GLAPIENTRY glAreTexturesResident (GLsizei n, const GLuint *textures, GLboolean *residences);\r\nGLAPI void GLAPIENTRY glArrayElement (GLint i);\r\nGLAPI void GLAPIENTRY glBegin (GLenum mode);\r\nGLAPI void GLAPIENTRY glBindTexture (GLenum target, GLuint texture);\r\nGLAPI void GLAPIENTRY glBitmap (GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);\r\nGLAPI void GLAPIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor);\r\nGLAPI void GLAPIENTRY glCallList (GLuint list);\r\nGLAPI void GLAPIENTRY glCallLists (GLsizei n, GLenum type, const GLvoid *lists);\r\nGLAPI void GLAPIENTRY glClear (GLbitfield mask);\r\nGLAPI void GLAPIENTRY glClearAccum (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);\r\nGLAPI void GLAPIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);\r\nGLAPI void GLAPIENTRY glClearDepth (GLclampd depth);\r\nGLAPI void GLAPIENTRY glClearIndex (GLfloat c);\r\nGLAPI void GLAPIENTRY glClearStencil (GLint s);\r\nGLAPI void GLAPIENTRY glClipPlane (GLenum plane, const GLdouble *equation);\r\nGLAPI void GLAPIENTRY glColor3b (GLbyte red, GLbyte green, GLbyte blue);\r\nGLAPI void GLAPIENTRY glColor3bv (const GLbyte *v);\r\nGLAPI void GLAPIENTRY glColor3d (GLdouble red, GLdouble green, GLdouble blue);\r\nGLAPI void GLAPIENTRY glColor3dv (const GLdouble *v);\r\nGLAPI void GLAPIENTRY glColor3f (GLfloat red, GLfloat green, GLfloat blue);\r\nGLAPI void GLAPIENTRY glColor3fv (const GLfloat *v);\r\nGLAPI void GLAPIENTRY glColor3i (GLint red, GLint green, GLint blue);\r\nGLAPI void GLAPIENTRY glColor3iv (const GLint *v);\r\nGLAPI void GLAPIENTRY glColor3s (GLshort red, GLshort green, GLshort blue);\r\nGLAPI void GLAPIENTRY glColor3sv (const GLshort *v);\r\nGLAPI void GLAPIENTRY glColor3ub (GLubyte red, GLubyte green, GLubyte blue);\r\nGLAPI void GLAPIENTRY glColor3ubv (const GLubyte *v);\r\nGLAPI void GLAPIENTRY glColor3ui (GLuint red, GLuint green, GLuint blue);\r\nGLAPI void GLAPIENTRY glColor3uiv (const GLuint *v);\r\nGLAPI void GLAPIENTRY glColor3us (GLushort red, GLushort green, GLushort blue);\r\nGLAPI void GLAPIENTRY glColor3usv (const GLushort *v);\r\nGLAPI void GLAPIENTRY glColor4b (GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);\r\nGLAPI void GLAPIENTRY glColor4bv (const GLbyte *v);\r\nGLAPI void GLAPIENTRY glColor4d (GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);\r\nGLAPI void GLAPIENTRY glColor4dv (const GLdouble *v);\r\nGLAPI void GLAPIENTRY glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);\r\nGLAPI void GLAPIENTRY glColor4fv (const GLfloat *v);\r\nGLAPI void GLAPIENTRY glColor4i (GLint red, GLint green, GLint blue, GLint alpha);\r\nGLAPI void GLAPIENTRY glColor4iv (const GLint *v);\r\nGLAPI void GLAPIENTRY glColor4s (GLshort red, GLshort green, GLshort blue, GLshort alpha);\r\nGLAPI void GLAPIENTRY glColor4sv (const GLshort *v);\r\nGLAPI void GLAPIENTRY glColor4ub (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);\r\nGLAPI void GLAPIENTRY glColor4ubv (const GLubyte *v);\r\nGLAPI void GLAPIENTRY glColor4ui (GLuint red, GLuint green, GLuint blue, GLuint alpha);\r\nGLAPI void GLAPIENTRY glColor4uiv (const GLuint *v);\r\nGLAPI void GLAPIENTRY glColor4us (GLushort red, GLushort green, GLushort blue, GLushort alpha);\r\nGLAPI void GLAPIENTRY glColor4usv (const GLushort *v);\r\nGLAPI void GLAPIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);\r\nGLAPI void GLAPIENTRY glColorMaterial (GLenum face, GLenum mode);\r\nGLAPI void GLAPIENTRY glColorPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);\r\nGLAPI void GLAPIENTRY glCopyPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);\r\nGLAPI void GLAPIENTRY glCopyTexImage1D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border);\r\nGLAPI void GLAPIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);\r\nGLAPI void GLAPIENTRY glCopyTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);\r\nGLAPI void GLAPIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);\r\nGLAPI void GLAPIENTRY glCullFace (GLenum mode);\r\nGLAPI void GLAPIENTRY glDeleteLists (GLuint list, GLsizei range);\r\nGLAPI void GLAPIENTRY glDeleteTextures (GLsizei n, const GLuint *textures);\r\nGLAPI void GLAPIENTRY glDepthFunc (GLenum func);\r\nGLAPI void GLAPIENTRY glDepthMask (GLboolean flag);\r\nGLAPI void GLAPIENTRY glDepthRange (GLclampd zNear, GLclampd zFar);\r\nGLAPI void GLAPIENTRY glDisable (GLenum cap);\r\nGLAPI void GLAPIENTRY glDisableClientState (GLenum array);\r\nGLAPI void GLAPIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count);\r\nGLAPI void GLAPIENTRY glDrawBuffer (GLenum mode);\r\nGLAPI void GLAPIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);\r\nGLAPI void GLAPIENTRY glDrawPixels (GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);\r\nGLAPI void GLAPIENTRY glEdgeFlag (GLboolean flag);\r\nGLAPI void GLAPIENTRY glEdgeFlagPointer (GLsizei stride, const GLvoid *pointer);\r\nGLAPI void GLAPIENTRY glEdgeFlagv (const GLboolean *flag);\r\nGLAPI void GLAPIENTRY glEnable (GLenum cap);\r\nGLAPI void GLAPIENTRY glEnableClientState (GLenum array);\r\nGLAPI void GLAPIENTRY glEnd (void);\r\nGLAPI void GLAPIENTRY glEndList (void);\r\nGLAPI void GLAPIENTRY glEvalCoord1d (GLdouble u);\r\nGLAPI void GLAPIENTRY glEvalCoord1dv (const GLdouble *u);\r\nGLAPI void GLAPIENTRY glEvalCoord1f (GLfloat u);\r\nGLAPI void GLAPIENTRY glEvalCoord1fv (const GLfloat *u);\r\nGLAPI void GLAPIENTRY glEvalCoord2d (GLdouble u, GLdouble v);\r\nGLAPI void GLAPIENTRY glEvalCoord2dv (const GLdouble *u);\r\nGLAPI void GLAPIENTRY glEvalCoord2f (GLfloat u, GLfloat v);\r\nGLAPI void GLAPIENTRY glEvalCoord2fv (const GLfloat *u);\r\nGLAPI void GLAPIENTRY glEvalMesh1 (GLenum mode, GLint i1, GLint i2);\r\nGLAPI void GLAPIENTRY glEvalMesh2 (GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);\r\nGLAPI void GLAPIENTRY glEvalPoint1 (GLint i);\r\nGLAPI void GLAPIENTRY glEvalPoint2 (GLint i, GLint j);\r\nGLAPI void GLAPIENTRY glFeedbackBuffer (GLsizei size, GLenum type, GLfloat *buffer);\r\nGLAPI void GLAPIENTRY glFinish (void);\r\nGLAPI void GLAPIENTRY glFlush (void);\r\nGLAPI void GLAPIENTRY glFogf (GLenum pname, GLfloat param);\r\nGLAPI void GLAPIENTRY glFogfv (GLenum pname, const GLfloat *params);\r\nGLAPI void GLAPIENTRY glFogi (GLenum pname, GLint param);\r\nGLAPI void GLAPIENTRY glFogiv (GLenum pname, const GLint *params);\r\nGLAPI void GLAPIENTRY glFrontFace (GLenum mode);\r\nGLAPI void GLAPIENTRY glFrustum (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);\r\nGLAPI GLuint GLAPIENTRY glGenLists (GLsizei range);\r\nGLAPI void GLAPIENTRY glGenTextures (GLsizei n, GLuint *textures);\r\nGLAPI void GLAPIENTRY glGetBooleanv (GLenum pname, GLboolean *params);\r\nGLAPI void GLAPIENTRY glGetClipPlane (GLenum plane, GLdouble *equation);\r\nGLAPI void GLAPIENTRY glGetDoublev (GLenum pname, GLdouble *params);\r\nGLAPI GLenum GLAPIENTRY glGetError (void);\r\nGLAPI void GLAPIENTRY glGetFloatv (GLenum pname, GLfloat *params);\r\nGLAPI void GLAPIENTRY glGetIntegerv (GLenum pname, GLint *params);\r\nGLAPI void GLAPIENTRY glGetLightfv (GLenum light, GLenum pname, GLfloat *params);\r\nGLAPI void GLAPIENTRY glGetLightiv (GLenum light, GLenum pname, GLint *params);\r\nGLAPI void GLAPIENTRY glGetMapdv (GLenum target, GLenum query, GLdouble *v);\r\nGLAPI void GLAPIENTRY glGetMapfv (GLenum target, GLenum query, GLfloat *v);\r\nGLAPI void GLAPIENTRY glGetMapiv (GLenum target, GLenum query, GLint *v);\r\nGLAPI void GLAPIENTRY glGetMaterialfv (GLenum face, GLenum pname, GLfloat *params);\r\nGLAPI void GLAPIENTRY glGetMaterialiv (GLenum face, GLenum pname, GLint *params);\r\nGLAPI void GLAPIENTRY glGetPixelMapfv (GLenum map, GLfloat *values);\r\nGLAPI void GLAPIENTRY glGetPixelMapuiv (GLenum map, GLuint *values);\r\nGLAPI void GLAPIENTRY glGetPixelMapusv (GLenum map, GLushort *values);\r\nGLAPI void GLAPIENTRY glGetPointerv (GLenum pname, GLvoid* *params);\r\nGLAPI void GLAPIENTRY glGetPolygonStipple (GLubyte *mask);\r\nGLAPI const GLubyte * GLAPIENTRY glGetString (GLenum name);\r\nGLAPI void GLAPIENTRY glGetTexEnvfv (GLenum target, GLenum pname, GLfloat *params);\r\nGLAPI void GLAPIENTRY glGetTexEnviv (GLenum target, GLenum pname, GLint *params);\r\nGLAPI void GLAPIENTRY glGetTexGendv (GLenum coord, GLenum pname, GLdouble *params);\r\nGLAPI void GLAPIENTRY glGetTexGenfv (GLenum coord, GLenum pname, GLfloat *params);\r\nGLAPI void GLAPIENTRY glGetTexGeniv (GLenum coord, GLenum pname, GLint *params);\r\nGLAPI void GLAPIENTRY glGetTexImage (GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);\r\nGLAPI void GLAPIENTRY glGetTexLevelParameterfv (GLenum target, GLint level, GLenum pname, GLfloat *params);\r\nGLAPI void GLAPIENTRY glGetTexLevelParameteriv (GLenum target, GLint level, GLenum pname, GLint *params);\r\nGLAPI void GLAPIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params);\r\nGLAPI void GLAPIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params);\r\nGLAPI void GLAPIENTRY glHint (GLenum target, GLenum mode);\r\nGLAPI void GLAPIENTRY glIndexMask (GLuint mask);\r\nGLAPI void GLAPIENTRY glIndexPointer (GLenum type, GLsizei stride, const GLvoid *pointer);\r\nGLAPI void GLAPIENTRY glIndexd (GLdouble c);\r\nGLAPI void GLAPIENTRY glIndexdv (const GLdouble *c);\r\nGLAPI void GLAPIENTRY glIndexf (GLfloat c);\r\nGLAPI void GLAPIENTRY glIndexfv (const GLfloat *c);\r\nGLAPI void GLAPIENTRY glIndexi (GLint c);\r\nGLAPI void GLAPIENTRY glIndexiv (const GLint *c);\r\nGLAPI void GLAPIENTRY glIndexs (GLshort c);\r\nGLAPI void GLAPIENTRY glIndexsv (const GLshort *c);\r\nGLAPI void GLAPIENTRY glIndexub (GLubyte c);\r\nGLAPI void GLAPIENTRY glIndexubv (const GLubyte *c);\r\nGLAPI void GLAPIENTRY glInitNames (void);\r\nGLAPI void GLAPIENTRY glInterleavedArrays (GLenum format, GLsizei stride, const GLvoid *pointer);\r\nGLAPI GLboolean GLAPIENTRY glIsEnabled (GLenum cap);\r\nGLAPI GLboolean GLAPIENTRY glIsList (GLuint list);\r\nGLAPI GLboolean GLAPIENTRY glIsTexture (GLuint texture);\r\nGLAPI void GLAPIENTRY glLightModelf (GLenum pname, GLfloat param);\r\nGLAPI void GLAPIENTRY glLightModelfv (GLenum pname, const GLfloat *params);\r\nGLAPI void GLAPIENTRY glLightModeli (GLenum pname, GLint param);\r\nGLAPI void GLAPIENTRY glLightModeliv (GLenum pname, const GLint *params);\r\nGLAPI void GLAPIENTRY glLightf (GLenum light, GLenum pname, GLfloat param);\r\nGLAPI void GLAPIENTRY glLightfv (GLenum light, GLenum pname, const GLfloat *params);\r\nGLAPI void GLAPIENTRY glLighti (GLenum light, GLenum pname, GLint param);\r\nGLAPI void GLAPIENTRY glLightiv (GLenum light, GLenum pname, const GLint *params);\r\nGLAPI void GLAPIENTRY glLineStipple (GLint factor, GLushort pattern);\r\nGLAPI void GLAPIENTRY glLineWidth (GLfloat width);\r\nGLAPI void GLAPIENTRY glListBase (GLuint base);\r\nGLAPI void GLAPIENTRY glLoadIdentity (void);\r\nGLAPI void GLAPIENTRY glLoadMatrixd (const GLdouble *m);\r\nGLAPI void GLAPIENTRY glLoadMatrixf (const GLfloat *m);\r\nGLAPI void GLAPIENTRY glLoadName (GLuint name);\r\nGLAPI void GLAPIENTRY glLogicOp (GLenum opcode);\r\nGLAPI void GLAPIENTRY glMap1d (GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);\r\nGLAPI void GLAPIENTRY glMap1f (GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);\r\nGLAPI void GLAPIENTRY glMap2d (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);\r\nGLAPI void GLAPIENTRY glMap2f (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);\r\nGLAPI void GLAPIENTRY glMapGrid1d (GLint un, GLdouble u1, GLdouble u2);\r\nGLAPI void GLAPIENTRY glMapGrid1f (GLint un, GLfloat u1, GLfloat u2);\r\nGLAPI void GLAPIENTRY glMapGrid2d (GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);\r\nGLAPI void GLAPIENTRY glMapGrid2f (GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);\r\nGLAPI void GLAPIENTRY glMaterialf (GLenum face, GLenum pname, GLfloat param);\r\nGLAPI void GLAPIENTRY glMaterialfv (GLenum face, GLenum pname, const GLfloat *params);\r\nGLAPI void GLAPIENTRY glMateriali (GLenum face, GLenum pname, GLint param);\r\nGLAPI void GLAPIENTRY glMaterialiv (GLenum face, GLenum pname, const GLint *params);\r\nGLAPI void GLAPIENTRY glMatrixMode (GLenum mode);\r\nGLAPI void GLAPIENTRY glMultMatrixd (const GLdouble *m);\r\nGLAPI void GLAPIENTRY glMultMatrixf (const GLfloat *m);\r\nGLAPI void GLAPIENTRY glNewList (GLuint list, GLenum mode);\r\nGLAPI void GLAPIENTRY glNormal3b (GLbyte nx, GLbyte ny, GLbyte nz);\r\nGLAPI void GLAPIENTRY glNormal3bv (const GLbyte *v);\r\nGLAPI void GLAPIENTRY glNormal3d (GLdouble nx, GLdouble ny, GLdouble nz);\r\nGLAPI void GLAPIENTRY glNormal3dv (const GLdouble *v);\r\nGLAPI void GLAPIENTRY glNormal3f (GLfloat nx, GLfloat ny, GLfloat nz);\r\nGLAPI void GLAPIENTRY glNormal3fv (const GLfloat *v);\r\nGLAPI void GLAPIENTRY glNormal3i (GLint nx, GLint ny, GLint nz);\r\nGLAPI void GLAPIENTRY glNormal3iv (const GLint *v);\r\nGLAPI void GLAPIENTRY glNormal3s (GLshort nx, GLshort ny, GLshort nz);\r\nGLAPI void GLAPIENTRY glNormal3sv (const GLshort *v);\r\nGLAPI void GLAPIENTRY glNormalPointer (GLenum type, GLsizei stride, const GLvoid *pointer);\r\nGLAPI void GLAPIENTRY glOrtho (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);\r\nGLAPI void GLAPIENTRY glPassThrough (GLfloat token);\r\nGLAPI void GLAPIENTRY glPixelMapfv (GLenum map, GLsizei mapsize, const GLfloat *values);\r\nGLAPI void GLAPIENTRY glPixelMapuiv (GLenum map, GLsizei mapsize, const GLuint *values);\r\nGLAPI void GLAPIENTRY glPixelMapusv (GLenum map, GLsizei mapsize, const GLushort *values);\r\nGLAPI void GLAPIENTRY glPixelStoref (GLenum pname, GLfloat param);\r\nGLAPI void GLAPIENTRY glPixelStorei (GLenum pname, GLint param);\r\nGLAPI void GLAPIENTRY glPixelTransferf (GLenum pname, GLfloat param);\r\nGLAPI void GLAPIENTRY glPixelTransferi (GLenum pname, GLint param);\r\nGLAPI void GLAPIENTRY glPixelZoom (GLfloat xfactor, GLfloat yfactor);\r\nGLAPI void GLAPIENTRY glPointSize (GLfloat size);\r\nGLAPI void GLAPIENTRY glPolygonMode (GLenum face, GLenum mode);\r\nGLAPI void GLAPIENTRY glPolygonOffset (GLfloat factor, GLfloat units);\r\nGLAPI void GLAPIENTRY glPolygonStipple (const GLubyte *mask);\r\nGLAPI void GLAPIENTRY glPopAttrib (void);\r\nGLAPI void GLAPIENTRY glPopClientAttrib (void);\r\nGLAPI void GLAPIENTRY glPopMatrix (void);\r\nGLAPI void GLAPIENTRY glPopName (void);\r\nGLAPI void GLAPIENTRY glPrioritizeTextures (GLsizei n, const GLuint *textures, const GLclampf *priorities);\r\nGLAPI void GLAPIENTRY glPushAttrib (GLbitfield mask);\r\nGLAPI void GLAPIENTRY glPushClientAttrib (GLbitfield mask);\r\nGLAPI void GLAPIENTRY glPushMatrix (void);\r\nGLAPI void GLAPIENTRY glPushName (GLuint name);\r\nGLAPI void GLAPIENTRY glRasterPos2d (GLdouble x, GLdouble y);\r\nGLAPI void GLAPIENTRY glRasterPos2dv (const GLdouble *v);\r\nGLAPI void GLAPIENTRY glRasterPos2f (GLfloat x, GLfloat y);\r\nGLAPI void GLAPIENTRY glRasterPos2fv (const GLfloat *v);\r\nGLAPI void GLAPIENTRY glRasterPos2i (GLint x, GLint y);\r\nGLAPI void GLAPIENTRY glRasterPos2iv (const GLint *v);\r\nGLAPI void GLAPIENTRY glRasterPos2s (GLshort x, GLshort y);\r\nGLAPI void GLAPIENTRY glRasterPos2sv (const GLshort *v);\r\nGLAPI void GLAPIENTRY glRasterPos3d (GLdouble x, GLdouble y, GLdouble z);\r\nGLAPI void GLAPIENTRY glRasterPos3dv (const GLdouble *v);\r\nGLAPI void GLAPIENTRY glRasterPos3f (GLfloat x, GLfloat y, GLfloat z);\r\nGLAPI void GLAPIENTRY glRasterPos3fv (const GLfloat *v);\r\nGLAPI void GLAPIENTRY glRasterPos3i (GLint x, GLint y, GLint z);\r\nGLAPI void GLAPIENTRY glRasterPos3iv (const GLint *v);\r\nGLAPI void GLAPIENTRY glRasterPos3s (GLshort x, GLshort y, GLshort z);\r\nGLAPI void GLAPIENTRY glRasterPos3sv (const GLshort *v);\r\nGLAPI void GLAPIENTRY glRasterPos4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w);\r\nGLAPI void GLAPIENTRY glRasterPos4dv (const GLdouble *v);\r\nGLAPI void GLAPIENTRY glRasterPos4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w);\r\nGLAPI void GLAPIENTRY glRasterPos4fv (const GLfloat *v);\r\nGLAPI void GLAPIENTRY glRasterPos4i (GLint x, GLint y, GLint z, GLint w);\r\nGLAPI void GLAPIENTRY glRasterPos4iv (const GLint *v);\r\nGLAPI void GLAPIENTRY glRasterPos4s (GLshort x, GLshort y, GLshort z, GLshort w);\r\nGLAPI void GLAPIENTRY glRasterPos4sv (const GLshort *v);\r\nGLAPI void GLAPIENTRY glReadBuffer (GLenum mode);\r\nGLAPI void GLAPIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);\r\nGLAPI void GLAPIENTRY glRectd (GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);\r\nGLAPI void GLAPIENTRY glRectdv (const GLdouble *v1, const GLdouble *v2);\r\nGLAPI void GLAPIENTRY glRectf (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);\r\nGLAPI void GLAPIENTRY glRectfv (const GLfloat *v1, const GLfloat *v2);\r\nGLAPI void GLAPIENTRY glRecti (GLint x1, GLint y1, GLint x2, GLint y2);\r\nGLAPI void GLAPIENTRY glRectiv (const GLint *v1, const GLint *v2);\r\nGLAPI void GLAPIENTRY glRects (GLshort x1, GLshort y1, GLshort x2, GLshort y2);\r\nGLAPI void GLAPIENTRY glRectsv (const GLshort *v1, const GLshort *v2);\r\nGLAPI GLint GLAPIENTRY glRenderMode (GLenum mode);\r\nGLAPI void GLAPIENTRY glRotated (GLdouble angle, GLdouble x, GLdouble y, GLdouble z);\r\nGLAPI void GLAPIENTRY glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z);\r\nGLAPI void GLAPIENTRY glScaled (GLdouble x, GLdouble y, GLdouble z);\r\nGLAPI void GLAPIENTRY glScalef (GLfloat x, GLfloat y, GLfloat z);\r\nGLAPI void GLAPIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height);\r\nGLAPI void GLAPIENTRY glSelectBuffer (GLsizei size, GLuint *buffer);\r\nGLAPI void GLAPIENTRY glShadeModel (GLenum mode);\r\nGLAPI void GLAPIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask);\r\nGLAPI void GLAPIENTRY glStencilMask (GLuint mask);\r\nGLAPI void GLAPIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass);\r\nGLAPI void GLAPIENTRY glTexCoord1d (GLdouble s);\r\nGLAPI void GLAPIENTRY glTexCoord1dv (const GLdouble *v);\r\nGLAPI void GLAPIENTRY glTexCoord1f (GLfloat s);\r\nGLAPI void GLAPIENTRY glTexCoord1fv (const GLfloat *v);\r\nGLAPI void GLAPIENTRY glTexCoord1i (GLint s);\r\nGLAPI void GLAPIENTRY glTexCoord1iv (const GLint *v);\r\nGLAPI void GLAPIENTRY glTexCoord1s (GLshort s);\r\nGLAPI void GLAPIENTRY glTexCoord1sv (const GLshort *v);\r\nGLAPI void GLAPIENTRY glTexCoord2d (GLdouble s, GLdouble t);\r\nGLAPI void GLAPIENTRY glTexCoord2dv (const GLdouble *v);\r\nGLAPI void GLAPIENTRY glTexCoord2f (GLfloat s, GLfloat t);\r\nGLAPI void GLAPIENTRY glTexCoord2fv (const GLfloat *v);\r\nGLAPI void GLAPIENTRY glTexCoord2i (GLint s, GLint t);\r\nGLAPI void GLAPIENTRY glTexCoord2iv (const GLint *v);\r\nGLAPI void GLAPIENTRY glTexCoord2s (GLshort s, GLshort t);\r\nGLAPI void GLAPIENTRY glTexCoord2sv (const GLshort *v);\r\nGLAPI void GLAPIENTRY glTexCoord3d (GLdouble s, GLdouble t, GLdouble r);\r\nGLAPI void GLAPIENTRY glTexCoord3dv (const GLdouble *v);\r\nGLAPI void GLAPIENTRY glTexCoord3f (GLfloat s, GLfloat t, GLfloat r);\r\nGLAPI void GLAPIENTRY glTexCoord3fv (const GLfloat *v);\r\nGLAPI void GLAPIENTRY glTexCoord3i (GLint s, GLint t, GLint r);\r\nGLAPI void GLAPIENTRY glTexCoord3iv (const GLint *v);\r\nGLAPI void GLAPIENTRY glTexCoord3s (GLshort s, GLshort t, GLshort r);\r\nGLAPI void GLAPIENTRY glTexCoord3sv (const GLshort *v);\r\nGLAPI void GLAPIENTRY glTexCoord4d (GLdouble s, GLdouble t, GLdouble r, GLdouble q);\r\nGLAPI void GLAPIENTRY glTexCoord4dv (const GLdouble *v);\r\nGLAPI void GLAPIENTRY glTexCoord4f (GLfloat s, GLfloat t, GLfloat r, GLfloat q);\r\nGLAPI void GLAPIENTRY glTexCoord4fv (const GLfloat *v);\r\nGLAPI void GLAPIENTRY glTexCoord4i (GLint s, GLint t, GLint r, GLint q);\r\nGLAPI void GLAPIENTRY glTexCoord4iv (const GLint *v);\r\nGLAPI void GLAPIENTRY glTexCoord4s (GLshort s, GLshort t, GLshort r, GLshort q);\r\nGLAPI void GLAPIENTRY glTexCoord4sv (const GLshort *v);\r\nGLAPI void GLAPIENTRY glTexCoordPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);\r\nGLAPI void GLAPIENTRY glTexEnvf (GLenum target, GLenum pname, GLfloat param);\r\nGLAPI void GLAPIENTRY glTexEnvfv (GLenum target, GLenum pname, const GLfloat *params);\r\nGLAPI void GLAPIENTRY glTexEnvi (GLenum target, GLenum pname, GLint param);\r\nGLAPI void GLAPIENTRY glTexEnviv (GLenum target, GLenum pname, const GLint *params);\r\nGLAPI void GLAPIENTRY glTexGend (GLenum coord, GLenum pname, GLdouble param);\r\nGLAPI void GLAPIENTRY glTexGendv (GLenum coord, GLenum pname, const GLdouble *params);\r\nGLAPI void GLAPIENTRY glTexGenf (GLenum coord, GLenum pname, GLfloat param);\r\nGLAPI void GLAPIENTRY glTexGenfv (GLenum coord, GLenum pname, const GLfloat *params);\r\nGLAPI void GLAPIENTRY glTexGeni (GLenum coord, GLenum pname, GLint param);\r\nGLAPI void GLAPIENTRY glTexGeniv (GLenum coord, GLenum pname, const GLint *params);\r\nGLAPI void GLAPIENTRY glTexImage1D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);\r\nGLAPI void GLAPIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);\r\nGLAPI void GLAPIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param);\r\nGLAPI void GLAPIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params);\r\nGLAPI void GLAPIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param);\r\nGLAPI void GLAPIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params);\r\nGLAPI void GLAPIENTRY glTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);\r\nGLAPI void GLAPIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);\r\nGLAPI void GLAPIENTRY glTranslated (GLdouble x, GLdouble y, GLdouble z);\r\nGLAPI void GLAPIENTRY glTranslatef (GLfloat x, GLfloat y, GLfloat z);\r\nGLAPI void GLAPIENTRY glVertex2d (GLdouble x, GLdouble y);\r\nGLAPI void GLAPIENTRY glVertex2dv (const GLdouble *v);\r\nGLAPI void GLAPIENTRY glVertex2f (GLfloat x, GLfloat y);\r\nGLAPI void GLAPIENTRY glVertex2fv (const GLfloat *v);\r\nGLAPI void GLAPIENTRY glVertex2i (GLint x, GLint y);\r\nGLAPI void GLAPIENTRY glVertex2iv (const GLint *v);\r\nGLAPI void GLAPIENTRY glVertex2s (GLshort x, GLshort y);\r\nGLAPI void GLAPIENTRY glVertex2sv (const GLshort *v);\r\nGLAPI void GLAPIENTRY glVertex3d (GLdouble x, GLdouble y, GLdouble z);\r\nGLAPI void GLAPIENTRY glVertex3dv (const GLdouble *v);\r\nGLAPI void GLAPIENTRY glVertex3f (GLfloat x, GLfloat y, GLfloat z);\r\nGLAPI void GLAPIENTRY glVertex3fv (const GLfloat *v);\r\nGLAPI void GLAPIENTRY glVertex3i (GLint x, GLint y, GLint z);\r\nGLAPI void GLAPIENTRY glVertex3iv (const GLint *v);\r\nGLAPI void GLAPIENTRY glVertex3s (GLshort x, GLshort y, GLshort z);\r\nGLAPI void GLAPIENTRY glVertex3sv (const GLshort *v);\r\nGLAPI void GLAPIENTRY glVertex4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w);\r\nGLAPI void GLAPIENTRY glVertex4dv (const GLdouble *v);\r\nGLAPI void GLAPIENTRY glVertex4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w);\r\nGLAPI void GLAPIENTRY glVertex4fv (const GLfloat *v);\r\nGLAPI void GLAPIENTRY glVertex4i (GLint x, GLint y, GLint z, GLint w);\r\nGLAPI void GLAPIENTRY glVertex4iv (const GLint *v);\r\nGLAPI void GLAPIENTRY glVertex4s (GLshort x, GLshort y, GLshort z, GLshort w);\r\nGLAPI void GLAPIENTRY glVertex4sv (const GLshort *v);\r\nGLAPI void GLAPIENTRY glVertexPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);\r\nGLAPI void GLAPIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height);\r\n\r\n#define GLEW_VERSION_1_1 GLEW_GET_VAR(__GLEW_VERSION_1_1)\r\n\r\n#endif /* GL_VERSION_1_1 */\r\n\r\n/* ---------------------------------- GLU ---------------------------------- */\r\n\r\n/* this is where we can safely include GLU */\r\n#if defined(__APPLE__) && defined(__MACH__)\r\n#include <OpenGL/glu.h>\r\n#else\r\n#include <GL/glu.h>\r\n#endif\r\n\r\n"
  },
  {
    "path": "libs/glew/auto/src/glew_init_gl.c",
    "content": "/* ------------------------------------------------------------------------- */\r\n\r\n/* \r\n * Search for name in the extensions string. Use of strstr()\r\n * is not sufficient because extension names can be prefixes of\r\n * other extension names. Could use strtok() but the constant\r\n * string returned by glGetString might be in read-only memory.\r\n */\r\nGLboolean glewGetExtension (const char* name)\r\n{    \r\n  GLubyte* p;\r\n  GLubyte* end;\r\n  GLuint len = _glewStrLen((const GLubyte*)name);\r\n  p = (GLubyte*)glGetString(GL_EXTENSIONS);\r\n  if (0 == p) return GL_FALSE;\r\n  end = p + _glewStrLen(p);\r\n  while (p < end)\r\n  {\r\n    GLuint n = _glewStrCLen(p, ' ');\r\n    if (len == n && _glewStrSame((const GLubyte*)name, p, n)) return GL_TRUE;\r\n    p += n+1;\r\n  }\r\n  return GL_FALSE;\r\n}\r\n\r\n/* ------------------------------------------------------------------------- */\r\n\r\n#ifndef GLEW_MX\r\nstatic\r\n#endif\r\nGLenum glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST)\r\n{\r\n  const GLubyte* s;\r\n  GLuint dot;\r\n  GLint major, minor;\r\n  /* query opengl version */\r\n  s = glGetString(GL_VERSION);\r\n  dot = _glewStrCLen(s, '.');\r\n  if (dot == 0)\r\n    return GLEW_ERROR_NO_GL_VERSION;\r\n  \r\n  major = s[dot-1]-'0';\r\n  minor = s[dot+1]-'0';\r\n\r\n  if (minor < 0 || minor > 9)\r\n    minor = 0;\r\n  if (major<0 || major>9)\r\n    return GLEW_ERROR_NO_GL_VERSION;\r\n  \r\n\r\n  if (major == 1 && minor == 0)\r\n  {\r\n    return GLEW_ERROR_GL_VERSION_10_ONLY;\r\n  }\r\n  else\r\n  {\r\n    CONST_CAST(GLEW_VERSION_3_2) = ( major > 3 )               || ( major == 3 && minor >= 2 ) ? GL_TRUE : GL_FALSE;\r\n    CONST_CAST(GLEW_VERSION_3_1) = GLEW_VERSION_3_2 == GL_TRUE || ( major == 3 && minor >= 1 ) ? GL_TRUE : GL_FALSE;\r\n    CONST_CAST(GLEW_VERSION_3_0) = GLEW_VERSION_3_1 == GL_TRUE || ( major == 3               ) ? GL_TRUE : GL_FALSE;\r\n    CONST_CAST(GLEW_VERSION_2_1) = GLEW_VERSION_3_0 == GL_TRUE || ( major == 2 && minor >= 1 ) ? GL_TRUE : GL_FALSE;    \r\n    CONST_CAST(GLEW_VERSION_2_0) = GLEW_VERSION_2_1 == GL_TRUE || ( major == 2               ) ? GL_TRUE : GL_FALSE;\r\n    CONST_CAST(GLEW_VERSION_1_5) = GLEW_VERSION_2_0 == GL_TRUE || ( major == 1 && minor >= 5 ) ? GL_TRUE : GL_FALSE;\r\n    CONST_CAST(GLEW_VERSION_1_4) = GLEW_VERSION_1_5 == GL_TRUE || ( major == 1 && minor >= 4 ) ? GL_TRUE : GL_FALSE;\r\n    CONST_CAST(GLEW_VERSION_1_3) = GLEW_VERSION_1_4 == GL_TRUE || ( major == 1 && minor >= 3 ) ? GL_TRUE : GL_FALSE;\r\n    CONST_CAST(GLEW_VERSION_1_2) = GLEW_VERSION_1_3 == GL_TRUE || ( major == 1 && minor >= 2 ) ? GL_TRUE : GL_FALSE;\r\n    CONST_CAST(GLEW_VERSION_1_1) = GLEW_VERSION_1_2 == GL_TRUE || ( major == 1 && minor >= 1 ) ? GL_TRUE : GL_FALSE;\r\n  }\r\n  /* initialize extensions */\r\n"
  },
  {
    "path": "libs/glew/auto/src/glew_init_glx.c",
    "content": "/* ------------------------------------------------------------------------ */\r\n\r\nGLboolean glxewGetExtension (const char* name)\r\n{    \r\n  GLubyte* p;\r\n  GLubyte* end;\r\n  GLuint len;\r\n\r\n  if (glXGetCurrentDisplay == NULL) return GL_FALSE;\r\n  len = _glewStrLen((const GLubyte*)name);\r\n  p = (GLubyte*)glXGetClientString(glXGetCurrentDisplay(), GLX_EXTENSIONS);\r\n  if (0 == p) return GL_FALSE;\r\n  end = p + _glewStrLen(p);\r\n  while (p < end)\r\n  {\r\n    GLuint n = _glewStrCLen(p, ' ');\r\n    if (len == n && _glewStrSame((const GLubyte*)name, p, n)) return GL_TRUE;\r\n    p += n+1;\r\n  }\r\n  return GL_FALSE;\r\n}\r\n\r\nGLenum glxewContextInit (GLXEW_CONTEXT_ARG_DEF_LIST)\r\n{\r\n  int major, minor;\r\n  /* initialize core GLX 1.2 */\r\n  if (_glewInit_GLX_VERSION_1_2(GLEW_CONTEXT_ARG_VAR_INIT)) return GLEW_ERROR_GLX_VERSION_11_ONLY;\r\n  /* initialize flags */\r\n  CONST_CAST(GLXEW_VERSION_1_0) = GL_TRUE;\r\n  CONST_CAST(GLXEW_VERSION_1_1) = GL_TRUE;\r\n  CONST_CAST(GLXEW_VERSION_1_2) = GL_TRUE;\r\n  CONST_CAST(GLXEW_VERSION_1_3) = GL_TRUE;\r\n  CONST_CAST(GLXEW_VERSION_1_4) = GL_TRUE;\r\n  /* query GLX version */\r\n  glXQueryVersion(glXGetCurrentDisplay(), &major, &minor);\r\n  if (major == 1 && minor <= 3)\r\n  {\r\n    switch (minor)\r\n    {\r\n      case 3:\r\n      CONST_CAST(GLXEW_VERSION_1_4) = GL_FALSE;\r\n      break;\r\n      case 2:\r\n      CONST_CAST(GLXEW_VERSION_1_4) = GL_FALSE;\r\n      CONST_CAST(GLXEW_VERSION_1_3) = GL_FALSE;\r\n      break;\r\n      default:\r\n      return GLEW_ERROR_GLX_VERSION_11_ONLY;\r\n      break;\r\n    }\r\n  }\r\n  /* initialize extensions */\r\n"
  },
  {
    "path": "libs/glew/auto/src/glew_init_tail.c",
    "content": "/* ------------------------------------------------------------------------ */\r\n\r\nconst GLubyte* glewGetErrorString (GLenum error)\r\n{\r\n  static const GLubyte* _glewErrorString[] =\r\n  {\r\n    (const GLubyte*)\"No error\",\r\n    (const GLubyte*)\"Missing GL version\",\r\n    (const GLubyte*)\"GL 1.1 and up are not supported\",\r\n    (const GLubyte*)\"GLX 1.2 and up are not supported\",\r\n    (const GLubyte*)\"Unknown error\"\r\n  };\r\n  const int max_error = sizeof(_glewErrorString)/sizeof(*_glewErrorString) - 1;\r\n  return _glewErrorString[(int)error > max_error ? max_error : (int)error];\r\n}\r\n\r\nconst GLubyte* glewGetString (GLenum name)\r\n{\r\n  static const GLubyte* _glewString[] =\r\n  {\r\n    (const GLubyte*)NULL,\r\n    (const GLubyte*)\"GLEW_VERSION_STRING\",\r\n    (const GLubyte*)\"GLEW_VERSION_MAJOR_STRING\",\r\n    (const GLubyte*)\"GLEW_VERSION_MINOR_STRING\",\r\n    (const GLubyte*)\"GLEW_VERSION_MICRO_STRING\"\r\n  };\r\n  const int max_string = sizeof(_glewString)/sizeof(*_glewString) - 1;\r\n  return _glewString[(int)name > max_string ? 0 : (int)name];\r\n}\r\n\r\n/* ------------------------------------------------------------------------ */\r\n\r\nGLboolean glewExperimental = GL_FALSE;\r\n\r\n#if !defined(GLEW_MX)\r\n\r\n#if defined(_WIN32)\r\nextern GLenum wglewContextInit (void);\r\n#elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX) /* _UNIX */\r\nextern GLenum glxewContextInit (void);\r\n#endif /* _WIN32 */\r\n\r\nGLenum glewInit ()\r\n{\r\n  GLenum r;\r\n  if ( (r = glewContextInit()) ) return r;\r\n#if defined(_WIN32)\r\n  return wglewContextInit();\r\n#elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX) /* _UNIX */\r\n  return glxewContextInit();\r\n#else\r\n  return r;\r\n#endif /* _WIN32 */\r\n}\r\n\r\n#endif /* !GLEW_MX */\r\n"
  },
  {
    "path": "libs/glew/auto/src/glew_init_wgl.c",
    "content": "/* ------------------------------------------------------------------------- */\r\n\r\nstatic PFNWGLGETEXTENSIONSSTRINGARBPROC _wglewGetExtensionsStringARB = NULL;\r\nstatic PFNWGLGETEXTENSIONSSTRINGEXTPROC _wglewGetExtensionsStringEXT = NULL;\r\n\r\nGLboolean wglewGetExtension (const char* name)\r\n{    \r\n  GLubyte* p;\r\n  GLubyte* end;\r\n  GLuint len = _glewStrLen((const GLubyte*)name);\r\n  if (_wglewGetExtensionsStringARB == NULL)\r\n    if (_wglewGetExtensionsStringEXT == NULL)\r\n      return GL_FALSE;\r\n    else\r\n      p = (GLubyte*)_wglewGetExtensionsStringEXT();\r\n  else\r\n    p = (GLubyte*)_wglewGetExtensionsStringARB(wglGetCurrentDC());\r\n  if (0 == p) return GL_FALSE;\r\n  end = p + _glewStrLen(p);\r\n  while (p < end)\r\n  {\r\n    GLuint n = _glewStrCLen(p, ' ');\r\n    if (len == n && _glewStrSame((const GLubyte*)name, p, n)) return GL_TRUE;\r\n    p += n+1;\r\n  }\r\n  return GL_FALSE;\r\n}\r\n\r\nGLenum wglewContextInit (WGLEW_CONTEXT_ARG_DEF_LIST)\r\n{\r\n  GLboolean crippled;\r\n  /* find wgl extension string query functions */\r\n  _wglewGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)glewGetProcAddress((const GLubyte*)\"wglGetExtensionsStringARB\");\r\n  _wglewGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)\"wglGetExtensionsStringEXT\");\r\n  /* initialize extensions */\r\n  crippled = _wglewGetExtensionsStringARB == NULL && _wglewGetExtensionsStringEXT == NULL;\r\n"
  },
  {
    "path": "libs/glew/auto/src/glew_license.h",
    "content": "/*\r\n** The OpenGL Extension Wrangler Library\r\n** Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>\r\n** Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>\r\n** Copyright (C) 2002, Lev Povalahev\r\n** All rights reserved.\r\n** \r\n** Redistribution and use in source and binary forms, with or without \r\n** modification, are permitted provided that the following conditions are met:\r\n** \r\n** * Redistributions of source code must retain the above copyright notice, \r\n**   this list of conditions and the following disclaimer.\r\n** * Redistributions in binary form must reproduce the above copyright notice, \r\n**   this list of conditions and the following disclaimer in the documentation \r\n**   and/or other materials provided with the distribution.\r\n** * The name of the author may be used to endorse or promote products \r\n**   derived from this software without specific prior written permission.\r\n**\r\n** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" \r\n** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r\n** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r\n** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE \r\n** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \r\n** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \r\n** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r\n** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r\n** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r\n** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\r\n** THE POSSIBILITY OF SUCH DAMAGE.\r\n*/\r\n\r\n"
  },
  {
    "path": "libs/glew/auto/src/glew_str_glx.c",
    "content": "    }\r\n    ret = (len == 0);\r\n  }\r\n  return ret;\r\n}\r\n\r\n#elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX)\r\n\r\n#if defined(GLEW_MX)\r\nGLboolean glxewContextIsSupported (GLXEWContext* ctx, const char* name)\r\n#else\r\nGLboolean glxewIsSupported (const char* name)\r\n#endif\r\n{\r\n  GLubyte* pos = (GLubyte*)name;\r\n  GLuint len = _glewStrLen(pos);\r\n  GLboolean ret = GL_TRUE;\r\n  while (ret && len > 0)\r\n  {\r\n    if(_glewStrSame1(&pos, &len, (const GLubyte*)\"GLX_\", 4))\r\n    {\r\n"
  },
  {
    "path": "libs/glew/auto/src/glew_str_head.c",
    "content": "#ifdef GLEW_MX\r\nGLboolean glewContextIsSupported (GLEWContext* ctx, const char* name)\r\n#else\r\nGLboolean glewIsSupported (const char* name)\r\n#endif\r\n{\r\n  GLubyte* pos = (GLubyte*)name;\r\n  GLuint len = _glewStrLen(pos);\r\n  GLboolean ret = GL_TRUE;\r\n  while (ret && len > 0)\r\n  {\r\n    if (_glewStrSame1(&pos, &len, (const GLubyte*)\"GL_\", 3))\r\n    {\r\n"
  },
  {
    "path": "libs/glew/auto/src/glew_str_tail.c",
    "content": "    }\r\n    ret = (len == 0);\r\n  }\r\n  return ret;\r\n}\r\n\r\n#endif /* _WIN32 */\r\n"
  },
  {
    "path": "libs/glew/auto/src/glew_str_wgl.c",
    "content": "    }\r\n    ret = (len == 0);\r\n  }\r\n  return ret;\r\n}\r\n\r\n#if defined(_WIN32)\r\n\r\n#if defined(GLEW_MX)\r\nGLboolean wglewContextIsSupported (WGLEWContext* ctx, const char* name)\r\n#else\r\nGLboolean wglewIsSupported (const char* name)\r\n#endif\r\n{\r\n  GLubyte* pos = (GLubyte*)name;\r\n  GLuint len = _glewStrLen(pos);\r\n  GLboolean ret = GL_TRUE;\r\n  while (ret && len > 0)\r\n  {\r\n    if (_glewStrSame1(&pos, &len, (const GLubyte*)\"WGL_\", 4))\r\n    {\r\n"
  },
  {
    "path": "libs/glew/auto/src/glew_tail.h",
    "content": "/* ------------------------------------------------------------------------- */\r\n\r\n/* error codes */\r\n#define GLEW_OK 0\r\n#define GLEW_NO_ERROR 0\r\n#define GLEW_ERROR_NO_GL_VERSION 1  /* missing GL version */\r\n#define GLEW_ERROR_GL_VERSION_10_ONLY 2  /* GL 1.1 and up are not supported */\r\n#define GLEW_ERROR_GLX_VERSION_11_ONLY 3  /* GLX 1.2 and up are not supported */\r\n\r\n/* string codes */\r\n#define GLEW_VERSION 1\r\n#define GLEW_VERSION_MAJOR 2\r\n#define GLEW_VERSION_MINOR 3\r\n#define GLEW_VERSION_MICRO 4\r\n\r\n/* API */\r\n#ifdef GLEW_MX\r\n\r\ntypedef struct GLEWContextStruct GLEWContext;\r\nGLEWAPI GLenum glewContextInit (GLEWContext* ctx);\r\nGLEWAPI GLboolean glewContextIsSupported (GLEWContext* ctx, const char* name);\r\n\r\n#define glewInit() glewContextInit(glewGetContext())\r\n#define glewIsSupported(x) glewContextIsSupported(glewGetContext(), x)\r\n#define glewIsExtensionSupported(x) glewIsSupported(x)\r\n\r\n#define GLEW_GET_VAR(x) (*(const GLboolean*)&(glewGetContext()->x))\r\n#ifdef _WIN32\r\n#  define GLEW_GET_FUN(x) glewGetContext()->x\r\n#else\r\n#  define GLEW_GET_FUN(x) x\r\n#endif\r\n\r\n#else /* GLEW_MX */\r\n\r\nGLEWAPI GLenum glewInit ();\r\nGLEWAPI GLboolean glewIsSupported (const char* name);\r\n#define glewIsExtensionSupported(x) glewIsSupported(x)\r\n\r\n#define GLEW_GET_VAR(x) (*(const GLboolean*)&x)\r\n#define GLEW_GET_FUN(x) x\r\n\r\n#endif /* GLEW_MX */\r\n\r\nGLEWAPI GLboolean glewExperimental;\r\nGLEWAPI GLboolean glewGetExtension (const char* name);\r\nGLEWAPI const GLubyte* glewGetErrorString (GLenum error);\r\nGLEWAPI const GLubyte* glewGetString (GLenum name);\r\n\r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#ifdef GLEW_APIENTRY_DEFINED\r\n#undef GLEW_APIENTRY_DEFINED\r\n#undef APIENTRY\r\n#undef GLAPIENTRY\r\n#define GLAPIENTRY\r\n#endif\r\n\r\n#ifdef GLEW_CALLBACK_DEFINED\r\n#undef GLEW_CALLBACK_DEFINED\r\n#undef CALLBACK\r\n#endif\r\n\r\n#ifdef GLEW_WINGDIAPI_DEFINED\r\n#undef GLEW_WINGDIAPI_DEFINED\r\n#undef WINGDIAPI\r\n#endif\r\n\r\n#undef GLAPI\r\n/* #undef GLEWAPI */\r\n\r\n#endif /* __glew_h__ */\r\n"
  },
  {
    "path": "libs/glew/auto/src/glew_utils.c",
    "content": "/*\r\n** The OpenGL Extension Wrangler Library\r\n** Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>\r\n** Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>\r\n** Copyright (C) 2002, Lev Povalahev\r\n** All rights reserved.\r\n** \r\n** Redistribution and use in source and binary forms, with or without \r\n** modification, are permitted provided that the following conditions are met:\r\n** \r\n** * Redistributions of source code must retain the above copyright notice, \r\n**   this list of conditions and the following disclaimer.\r\n** * Redistributions in binary form must reproduce the above copyright notice, \r\n**   this list of conditions and the following disclaimer in the documentation \r\n**   and/or other materials provided with the distribution.\r\n** * The name of the author may be used to endorse or promote products \r\n**   derived from this software without specific prior written permission.\r\n**\r\n** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" \r\n** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r\n** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r\n** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE \r\n** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \r\n** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \r\n** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r\n** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r\n** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r\n** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\r\n** THE POSSIBILITY OF SUCH DAMAGE.\r\n*/\r\n\r\n#include <GL/glew.h>\r\n#if defined(_WIN32)\r\n#  include <GL/wglew.h>\r\n#elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX)\r\n#  include <GL/glxew.h>\r\n#endif\r\n\r\n#include \"glew_utils.h\"\r\n\r\n#if defined(__APPLE__)\r\n#include <mach-o/dyld.h>\r\n#include <stdlib.h>\r\n#include <string.h>\r\n\r\nvoid* NSGLGetProcAddress (const GLubyte *name)\r\n{\r\n  NSSymbol symbol;\r\n  char* symbolName;\r\n  /* prepend a '_' for the Unix C symbol mangling convention */\r\n  symbolName = malloc(strlen((const char*)name) + 2);\r\n  strcpy(symbolName+1, (const char*)name);\r\n  symbolName[0] = '_';\r\n  symbol = NULL;\r\n  if (NSIsSymbolNameDefined(symbolName))\r\n    symbol = NSLookupAndBindSymbol(symbolName);\r\n  free(symbolName);\r\n  return symbol ? NSAddressOfSymbol(symbol) : NULL;\r\n}\r\n#endif /* __APPLE__ */\r\n\r\n#if defined(__sgi) || defined (__sun)\r\n#include <dlfcn.h>\r\n#include <stdio.h>\r\n#include <stdlib.h>\r\n\r\nvoid* dlGetProcAddress (const GLubyte* name)\r\n{\r\n  static void* h = NULL;\r\n  static void* gpa;\r\n\r\n  if (h == NULL)\r\n  {\r\n    if ((h = dlopen(NULL, RTLD_LAZY | RTLD_LOCAL)) == NULL) return NULL;\r\n    gpa = dlsym(h, \"glXGetProcAddress\");\r\n  }\r\n\r\n  if (gpa != NULL)\r\n    return ((void*(*)(const GLubyte*))gpa)(name);\r\n  else\r\n    return dlsym(h, (const char*)name);\r\n}\r\n#endif /* __sgi || __sun */\r\n\r\n/*\r\n * GLEW, just like OpenGL or GLU, does not rely on the standard C library.\r\n * These functions implement the functionality required in this file.\r\n */\r\n\r\nGLuint _glewStrLen (const GLubyte* s)\r\n{\r\n  GLuint i=0;\r\n  while (s+i != NULL && s[i] != '\\0') i++;\r\n  return i;\r\n}\r\n\r\nGLuint _glewStrCLen (const GLubyte* s, GLubyte c)\r\n{\r\n  GLuint i=0;\r\n  while (s+i != NULL && s[i] != '\\0' && s[i] != c) i++;\r\n  return i;\r\n}\r\n\r\nGLboolean _glewStrSame (const GLubyte* a, const GLubyte* b, GLuint n)\r\n{\r\n  GLuint i=0;\r\n  while (i < n && a+i != NULL && b+i != NULL && a[i] == b[i]) i++;\r\n  return i == n ? GL_TRUE : GL_FALSE;\r\n}\r\n\r\nGLboolean _glewStrSame1 (GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb)\r\n{\r\n  while (*na > 0 && (**a == ' ' || **a == '\\n' || **a == '\\r' || **a == '\\t'))\r\n  {\r\n    *a++;\r\n    *na--;\r\n  }\r\n  if(*na >= nb)\r\n  {\r\n    GLuint i=0;\r\n    while (i < nb && *a+i != NULL && b+i != NULL && *a[i] == b[i]) i++;\r\n\tif(i == nb)\r\n\t{\r\n\t\t*a = *a + nb;\r\n\t\t*na = *na - nb;\r\n\t\treturn GL_TRUE;\r\n\t}\r\n  }\r\n  return GL_FALSE;\r\n}\r\n\r\nGLboolean _glewStrSame2 (GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb)\r\n{\r\n  if(*na >= nb)\r\n  {\r\n    GLuint i=0;\r\n    while (i < nb && *a+i != NULL && b+i != NULL && *a[i] == b[i]) i++;\r\n\tif(i == nb)\r\n\t{\r\n\t\t*a = *a + nb;\r\n\t\t*na = *na - nb;\r\n\t\treturn GL_TRUE;\r\n\t}\r\n  }\r\n  return GL_FALSE;\r\n}\r\n\r\nGLboolean _glewStrSame3 (GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb)\r\n{\r\n  if(*na >= nb)\r\n  {\r\n    GLuint i=0;\r\n    while (i < nb && *a+i != NULL && b+i != NULL && *a[i] == b[i]) i++;\r\n    if (i == nb && (*na == nb || *a[i] == ' ' || *a[i] == '\\n' || *a[i] == '\\r' || *a[i] == '\\t'))\r\n    {\r\n      *a = *a + nb;\r\n      *na = *na - nb;\r\n      return GL_TRUE;\r\n    }\r\n  }\r\n  return GL_FALSE;\r\n}\r\n"
  },
  {
    "path": "libs/glew/auto/src/glew_utils.h",
    "content": "/*\r\n** The OpenGL Extension Wrangler Library\r\n** Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>\r\n** Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>\r\n** Copyright (C) 2002, Lev Povalahev\r\n** All rights reserved.\r\n** \r\n** Redistribution and use in source and binary forms, with or without \r\n** modification, are permitted provided that the following conditions are met:\r\n** \r\n** * Redistributions of source code must retain the above copyright notice, \r\n**   this list of conditions and the following disclaimer.\r\n** * Redistributions in binary form must reproduce the above copyright notice, \r\n**   this list of conditions and the following disclaimer in the documentation \r\n**   and/or other materials provided with the distribution.\r\n** * The name of the author may be used to endorse or promote products \r\n**   derived from this software without specific prior written permission.\r\n**\r\n** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" \r\n** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r\n** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r\n** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE \r\n** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \r\n** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \r\n** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r\n** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r\n** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r\n** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\r\n** THE POSSIBILITY OF SUCH DAMAGE.\r\n*/\r\n\r\n#ifndef __glew_utils_h__\r\n#define __glew_utils_h__\r\n\r\n#include <GL/glew.h>\r\n#if defined(_WIN32)\r\n#  include <GL/wglew.h>\r\n#elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX)\r\n#  include <GL/glxew.h>\r\n#endif\r\n\r\n/*\r\n * Define glewGetContext and related helper macros.\r\n */\r\n#ifdef GLEW_MX\r\n#  define glewGetContext() ctx\r\n#  ifdef _WIN32\r\n#    define GLEW_CONTEXT_ARG_DEF_INIT GLEWContext* ctx\r\n#    define GLEW_CONTEXT_ARG_VAR_INIT ctx\r\n#    define wglewGetContext() ctx\r\n#    define WGLEW_CONTEXT_ARG_DEF_INIT WGLEWContext* ctx\r\n#    define WGLEW_CONTEXT_ARG_DEF_LIST WGLEWContext* ctx\r\n#  else /* _WIN32 */\r\n#    define GLEW_CONTEXT_ARG_DEF_INIT void\r\n#    define GLEW_CONTEXT_ARG_VAR_INIT\r\n#    define glxewGetContext() ctx\r\n#    define GLXEW_CONTEXT_ARG_DEF_INIT void\r\n#    define GLXEW_CONTEXT_ARG_DEF_LIST GLXEWContext* ctx\r\n#  endif /* _WIN32 */\r\n#  define GLEW_CONTEXT_ARG_DEF_LIST GLEWContext* ctx\r\n#else /* GLEW_MX */\r\n#  define GLEW_CONTEXT_ARG_DEF_INIT void\r\n#  define GLEW_CONTEXT_ARG_VAR_INIT\r\n#  define GLEW_CONTEXT_ARG_DEF_LIST void\r\n#  define WGLEW_CONTEXT_ARG_DEF_INIT void\r\n#  define WGLEW_CONTEXT_ARG_DEF_LIST void\r\n#  define GLXEW_CONTEXT_ARG_DEF_INIT void\r\n#  define GLXEW_CONTEXT_ARG_DEF_LIST void\r\n#endif /* GLEW_MX */\r\n\r\n/*\r\n * Define glewGetProcAddress.\r\n */\r\n#if defined(_WIN32)\r\n#  define glewGetProcAddress(name) wglGetProcAddress((LPCSTR)name)\r\n#else\r\n#  if defined(__APPLE__)\r\n     extern void* NSGLGetProcAddress (const GLubyte* name);\r\n#    define glewGetProcAddress(name) NSGLGetProcAddress(name)\r\n#  else\r\n#    if defined(__sgi) || defined(__sun)\r\n       extern void* dlGetProcAddress (const GLubyte* name);\r\n#      define glewGetProcAddress(name) dlGetProcAddress(name)\r\n#    else /* __linux */\r\n#      define glewGetProcAddress(name) (*glXGetProcAddressARB)(name)\r\n#    endif\r\n#  endif\r\n#endif\r\n\r\n/*\r\n * GLEW, just like OpenGL or GLU, does not rely on the standard C library.\r\n * These functions implement the string processing functionality required in the library.\r\n */\r\nextern GLuint _glewStrLen (const GLubyte* s);\r\nextern GLuint _glewStrCLen (const GLubyte* s, GLubyte c);\r\nextern GLboolean _glewStrSame (const GLubyte* a, const GLubyte* b, GLuint n);\r\nextern GLboolean _glewStrSame1 (GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb);\r\nextern GLboolean _glewStrSame2 (GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb);\r\nextern GLboolean _glewStrSame3 (GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb)\r\n\r\n#endif /* __glew_utils_h__ */\r\n"
  },
  {
    "path": "libs/glew/auto/src/glewinfo.rc",
    "content": "\r\n#include <windows.h>\r\n\r\n#ifdef GLEW_MX\r\n#  ifdef _DEBUG\r\n#    define FILENAME \"glewinfo-mxd.exe\"\r\n#  else\r\n#    define FILENAME \"glewinfo-mx.exe\"\r\n#  endif\r\n#else\r\n#  ifdef _DEBUG\r\n#    define FILENAME \"glewinfod.exe\"\r\n#  else\r\n#    define FILENAME \"glewinfo.exe\"\r\n#  endif\r\n#endif\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Version\r\n//\r\nVS_VERSION_INFO VERSIONINFO \r\nFILEVERSION GLEW_MAJOR, GLEW_MINOR, GLEW_MICRO, 0\r\nPRODUCTVERSION GLEW_MAJOR, GLEW_MINOR, GLEW_MICRO, 0\r\nFILEFLAGSMASK VS_FFI_FILEFLAGSMASK\r\n#ifdef _DEBUG\r\nFILEFLAGS VS_FF_DEBUG\r\n#else\r\nFILEFLAGS 0x0L\r\n#endif\r\nFILEOS VOS__WINDOWS32\r\nFILETYPE VFT_APP\r\nFILESUBTYPE VFT2_UNKNOWN\r\nBEGIN\r\n    BLOCK \"StringFileInfo\"\r\n    BEGIN\r\n        BLOCK \"040904b0\"\r\n        BEGIN\r\n            VALUE \"Comments\", \"The OpenGL Extension Wrangler Library\\r\\nCopyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>\\r\\nCopyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>\\r\\nCopyright (C) 2002, Lev Povalahev\\r\\nAll rights reserved.\\r\\n \\r\\nRedistribution and use in source and binary forms, with or without \\r\\nmodification, are permitted provided that the following conditions are met:\\r\\n\\r\\n* Redistributions of source code must retain the above copyright notice, \\r\\n  this list of conditions and the following disclaimer.\\r\\n* Redistributions in binary form must reproduce the above copyright notice, \\r\\n  this list of conditions and the following disclaimer in the documentation \\r\\n  and/or other materials provided with the distribution.\\r\\n* The name of the author may be used to endorse or promote products \\r\\n  derived from this software without specific prior written permission.\\r\\n\\r\\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' \\r\\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \\r\\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\\r\\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE \\r\\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \\r\\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \\r\\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\\r\\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\\r\\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\\r\\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\\r\\nTHE POSSIBILITY OF SUCH DAMAGE.\\r\\n\\r\\nLicense Applicability. Except to the extent portions of this file are\\r\\nmade subject to an alternative license as permitted in the SGI Free\\r\\nSoftware License B, Version 1.1 (the 'License'), the contents of this\\r\\nfile are subject only to the provisions of the License. You may not use\\r\\nthis file except in compliance with the License. You may obtain a copy\\r\\nof the License at Silicon Graphics, Inc., attn: Legal Services, 1600\\r\\nAmphitheatre Parkway, Mountain View, CA 94043-1351, or at:\\r\\n\\r\\nhttp://oss.sgi.com/projects/FreeB\\r\\n\\r\\nNote that, as provided in the License, the Software is distributed on an\\r\\n'AS IS' basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS\\r\\nDISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND\\r\\nCONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A\\r\\nPARTICULAR PURPOSE, AND NON-INFRINGEMENT.\\r\\n\\r\\nOriginal Code. The Original Code is: OpenGL Sample Implementation,\\r\\nVersion 1.2.1, released January 26, 2000, developed by Silicon Graphics,\\r\\nInc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.\\r\\nCopyright in any portions created by third parties is as indicated\\r\\nelsewhere herein. All Rights Reserved.\\r\\n\\r\\nAdditional Notice Provisions: This software was created using the\\r\\nOpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has\\r\\nnot been independently verified as being compliant with the OpenGL(R)\\r\\nversion 1.2.1 Specification.\\0\"\r\n            VALUE \"CompanyName\", \"\\0\"\r\n            VALUE \"FileDescription\", \"Utility for verifying extension entry points\\0\"\r\n            VALUE \"FileVersion\", \"GLEW_MAJOR,GLEW_MINOR,GLEW_MICRO,0\\0\"\r\n            VALUE \"InternalName\", \"glewinfo\\0\"\r\n            VALUE \"LegalCopyright\", \" 2002-2008 Milan Ikits & Marcelo Magallon\\0\"\r\n            VALUE \"LegalTrademarks\", \"\\0\"\r\n            VALUE \"OriginalFilename\", FILENAME \"\\0\"\r\n            VALUE \"PrivateBuild\", \"\\0\"\r\n            VALUE \"ProductName\", \"The OpenGL Extension Wrangler Library\\0\"\r\n            VALUE \"ProductVersion\", \"GLEW_MAJOR,GLEW_MINOR,GLEW_MICRO,0\\0\"\r\n            VALUE \"SpecialBuild\", \"\\0\"\r\n        END\r\n    END\r\n    BLOCK \"VarFileInfo\"\r\n    BEGIN\r\n        VALUE \"Translation\", 0x409, 1200\r\n    END\r\nEND\r\n"
  },
  {
    "path": "libs/glew/auto/src/glewinfo_gl.c",
    "content": "/* ------------------------------------------------------------------------ */\r\n\r\nstatic void glewInfo (void)\r\n{\r\n#ifdef GL_VERSION_1_1\r\n  _glewInfo_GL_VERSION_1_1();\r\n#endif /* GL_VERSION_1_1 */\r\n"
  },
  {
    "path": "libs/glew/auto/src/glewinfo_glx.c",
    "content": "}\r\n\r\n#else /* _UNIX */\r\n\r\nstatic void glxewInfo ()\r\n{\r\n"
  },
  {
    "path": "libs/glew/auto/src/glewinfo_head.c",
    "content": "#include <stdio.h>\r\n#include <stdlib.h>\r\n#include <string.h>\r\n#include <GL/glew.h>\r\n#if defined(_WIN32)\r\n#include <GL/wglew.h>\r\n#elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX)\r\n#include <GL/glxew.h>\r\n#endif\r\n\r\nstatic FILE* f;\r\n\r\n#ifdef GLEW_MX\r\nGLEWContext _glewctx;\r\n#define glewGetContext() (&_glewctx)\r\n#ifdef _WIN32\r\nWGLEWContext _wglewctx;\r\n#define wglewGetContext() (&_wglewctx)\r\n#elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX)\r\nGLXEWContext _glxewctx;\r\n#define glxewGetContext() (&_glxewctx)\r\n#endif\r\n#endif\r\n\r\n#if defined(_WIN32)\r\nGLboolean glewCreateContext (int* pixelformat);\r\n#elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX)\r\nGLboolean glewCreateContext (const char* display, int* visual);\r\n#else\r\nGLboolean glewCreateContext ();\r\n#endif\r\n\r\n#if defined(_WIN32) || !defined(__APPLE__) || defined(GLEW_APPLE_GLX)\r\nGLboolean glewParseArgs (int argc, char** argv, char** display, int* visual);\r\n#endif\r\n\r\nvoid glewDestroyContext ();\r\n\r\n/* ------------------------------------------------------------------------- */\r\n\r\nstatic void glewPrintExt (const char* name, GLboolean def1, GLboolean def2, GLboolean def3)\r\n{\r\n  unsigned int i;\r\n  fprintf(f, \"\\n%s:\", name);\r\n  for (i=0; i<62-strlen(name); i++) fprintf(f, \" \");\r\n  fprintf(f, \"%s \", def1 ? \"OK\" : \"MISSING\");\r\n  if (def1 != def2)\r\n    fprintf(f, \"[%s] \", def2 ? \"OK\" : \"MISSING\");\r\n  if (def1 != def3)\r\n    fprintf(f, \"[%s]\\n\", def3 ? \"OK\" : \"MISSING\");\r\n  else\r\n    fprintf(f, \"\\n\");\r\n  for (i=0; i<strlen(name)+1; i++) fprintf(f, \"-\");\r\n  fprintf(f, \"\\n\");\r\n  fflush(f);\r\n}\r\n\r\nstatic void glewInfoFunc (const char* name, GLint undefined)\r\n{\r\n  unsigned int i;\r\n  fprintf(f, \"  %s:\", name);\r\n  for (i=0; i<60-strlen(name); i++) fprintf(f, \" \");\r\n  fprintf(f, \"%s\\n\", undefined ? \"MISSING\" : \"OK\");\r\n  fflush(f);\r\n}\r\n\r\n/* ----------------------------- GL_VERSION_1_1 ---------------------------- */\r\n\r\n#ifdef GL_VERSION_1_1\r\n\r\nstatic void _glewInfo_GL_VERSION_1_1 (void)\r\n{\r\n  glewPrintExt(\"GL_VERSION_1_1\", GLEW_VERSION_1_1, GLEW_VERSION_1_1, GLEW_VERSION_1_1);\r\n}\r\n\r\n#endif /* GL_VERSION_1_1 */\r\n\r\n"
  },
  {
    "path": "libs/glew/auto/src/glewinfo_tail.c",
    "content": "}\r\n\r\n#endif /* _WIN32 */\r\n\r\n/* ------------------------------------------------------------------------ */\r\n\r\n#if defined(_WIN32) || !defined(__APPLE__) || defined(GLEW_APPLE_GLX)\r\nint main (int argc, char** argv)\r\n#else\r\nint main (void)\r\n#endif\r\n{\r\n  GLuint err;\r\n\r\n#if defined(_WIN32) || !defined(__APPLE__) || defined(GLEW_APPLE_GLX)\r\n  char* display = NULL;\r\n  int visual = -1;\r\n\r\n  if (glewParseArgs(argc-1, argv+1, &display, &visual))\r\n  {\r\n#if defined(_WIN32)\r\n    fprintf(stderr, \"Usage: glewinfo [-pf <id>]\\n\");\r\n#else\r\n    fprintf(stderr, \"Usage: glewinfo [-display <display>] [-visual <id>]\\n\");\r\n#endif\r\n    return 1;\r\n  }\r\n#endif\r\n\r\n#if defined(_WIN32)\r\n  if (GL_TRUE == glewCreateContext(&visual))\r\n#elif defined(__APPLE__) && !defined(GLEW_APPLE_GLX)\r\n  if (GL_TRUE == glewCreateContext())\r\n#else\r\n  if (GL_TRUE == glewCreateContext(display, &visual))\r\n#endif\r\n  {\r\n    fprintf(stderr, \"Error: glewCreateContext failed\\n\");\r\n    glewDestroyContext();\r\n    return 1;\r\n  }\r\n  glewExperimental = GL_TRUE;\r\n#ifdef GLEW_MX\r\n  err = glewContextInit(glewGetContext());\r\n#ifdef _WIN32\r\n  err = err || wglewContextInit(wglewGetContext());\r\n#elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX)\r\n  err = err || glxewContextInit(glxewGetContext());\r\n#endif\r\n\r\n#else\r\n  err = glewInit();\r\n#endif\r\n  if (GLEW_OK != err)\r\n  {\r\n    fprintf(stderr, \"Error [main]: glewInit failed: %s\\n\", glewGetErrorString(err));\r\n    glewDestroyContext();\r\n    return 1;\r\n  }\r\n#if defined(_WIN32)\r\n  f = fopen(\"glewinfo.txt\", \"w\");\r\n  if (f == NULL) f = stdout;\r\n#else\r\n  f = stdout;\r\n#endif\r\n  fprintf(f, \"---------------------------\\n\");\r\n  fprintf(f, \"    GLEW Extension Info\\n\");\r\n  fprintf(f, \"---------------------------\\n\\n\");\r\n  fprintf(f, \"GLEW version %s\\n\", glewGetString(GLEW_VERSION));\r\n#if defined(_WIN32)\r\n  fprintf(f, \"Reporting capabilities of pixelformat %d\\n\", visual);\r\n#elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX)\r\n  fprintf(f, \"Reporting capabilities of display %s, visual 0x%x\\n\", \r\n    display == NULL ? getenv(\"DISPLAY\") : display, visual);\r\n#endif\r\n  fprintf(f, \"Running on a %s from %s\\n\", \r\n\t  glGetString(GL_RENDERER), glGetString(GL_VENDOR));\r\n  fprintf(f, \"OpenGL version %s is supported\\n\", glGetString(GL_VERSION));\r\n  glewInfo();\r\n#if defined(_WIN32)\r\n  wglewInfo();\r\n#else\r\n  glxewInfo();\r\n#endif\r\n  if (f != stdout) fclose(f);\r\n  glewDestroyContext();\r\n  return 0;\r\n}\r\n\r\n/* ------------------------------------------------------------------------ */\r\n\r\n#if defined(_WIN32) || !defined(__APPLE__) || defined(GLEW_APPLE_GLX)\r\nGLboolean glewParseArgs (int argc, char** argv, char** display, int* visual)\r\n{\r\n  int p = 0;\r\n  while (p < argc)\r\n  {\r\n#if defined(_WIN32)\r\n    if (!strcmp(argv[p], \"-pf\") || !strcmp(argv[p], \"-pixelformat\"))\r\n    {\r\n      if (++p >= argc) return GL_TRUE;\r\n      *display = 0;\r\n      *visual = strtol(argv[p++], NULL, 0);\r\n    }\r\n    else\r\n      return GL_TRUE;\r\n#else\r\n    if (!strcmp(argv[p], \"-display\"))\r\n    {\r\n      if (++p >= argc) return GL_TRUE;\r\n      *display = argv[p++];\r\n    }\r\n    else if (!strcmp(argv[p], \"-visual\"))\r\n    {\r\n      if (++p >= argc) return GL_TRUE;\r\n      *visual = (int)strtol(argv[p++], NULL, 0);\r\n    }\r\n    else\r\n      return GL_TRUE;\r\n#endif\r\n  }\r\n  return GL_FALSE;\r\n}\r\n#endif\r\n\r\n/* ------------------------------------------------------------------------ */\r\n\r\n#if defined(_WIN32)\r\n\r\nHWND wnd = NULL;\r\nHDC dc = NULL;\r\nHGLRC rc = NULL;\r\n\r\nGLboolean glewCreateContext (int* pixelformat)\r\n{\r\n  WNDCLASS wc;\r\n  PIXELFORMATDESCRIPTOR pfd;\r\n  /* register window class */\r\n  ZeroMemory(&wc, sizeof(WNDCLASS));\r\n  wc.hInstance = GetModuleHandle(NULL);\r\n  wc.lpfnWndProc = DefWindowProc;\r\n  wc.lpszClassName = \"GLEW\";\r\n  if (0 == RegisterClass(&wc)) return GL_TRUE;\r\n  /* create window */\r\n  wnd = CreateWindow(\"GLEW\", \"GLEW\", 0, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, \r\n                     CW_USEDEFAULT, NULL, NULL, GetModuleHandle(NULL), NULL);\r\n  if (NULL == wnd) return GL_TRUE;\r\n  /* get the device context */\r\n  dc = GetDC(wnd);\r\n  if (NULL == dc) return GL_TRUE;\r\n  /* find pixel format */\r\n  ZeroMemory(&pfd, sizeof(PIXELFORMATDESCRIPTOR));\r\n  if (*pixelformat == -1) /* find default */\r\n  {\r\n    pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);\r\n    pfd.nVersion = 1;\r\n    pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL;\r\n    *pixelformat = ChoosePixelFormat(dc, &pfd);\r\n    if (*pixelformat == 0) return GL_TRUE;\r\n  }\r\n  /* set the pixel format for the dc */\r\n  if (FALSE == SetPixelFormat(dc, *pixelformat, &pfd)) return GL_TRUE;\r\n  /* create rendering context */\r\n  rc = wglCreateContext(dc);\r\n  if (NULL == rc) return GL_TRUE;\r\n  if (FALSE == wglMakeCurrent(dc, rc)) return GL_TRUE;\r\n  return GL_FALSE;\r\n}\r\n\r\nvoid glewDestroyContext ()\r\n{\r\n  if (NULL != rc) wglMakeCurrent(NULL, NULL);\r\n  if (NULL != rc) wglDeleteContext(rc);\r\n  if (NULL != wnd && NULL != dc) ReleaseDC(wnd, dc);\r\n  if (NULL != wnd) DestroyWindow(wnd);\r\n  UnregisterClass(\"GLEW\", GetModuleHandle(NULL));\r\n}\r\n\r\n/* ------------------------------------------------------------------------ */\r\n\r\n#elif defined(__APPLE__) && !defined(GLEW_APPLE_GLX)\r\n\r\n#include <AGL/agl.h>\r\n\r\nAGLContext ctx, octx;\r\n\r\nGLboolean glewCreateContext ()\r\n{\r\n  int attrib[] = { AGL_RGBA, AGL_NONE };\r\n  AGLPixelFormat pf;\r\n  /*int major, minor;\r\n  SetPortWindowPort(wnd);\r\n  aglGetVersion(&major, &minor);\r\n  fprintf(stderr, \"GL %d.%d\\n\", major, minor);*/\r\n  pf = aglChoosePixelFormat(NULL, 0, attrib);\r\n  if (NULL == pf) return GL_TRUE;\r\n  ctx = aglCreateContext(pf, NULL);\r\n  if (NULL == ctx || AGL_NO_ERROR != aglGetError()) return GL_TRUE;\r\n  aglDestroyPixelFormat(pf);\r\n  /*aglSetDrawable(ctx, GetWindowPort(wnd));*/\r\n  octx = aglGetCurrentContext();\r\n  if (GL_FALSE == aglSetCurrentContext(ctx)) return GL_TRUE;\r\n  return GL_FALSE;\r\n}\r\n\r\nvoid glewDestroyContext ()\r\n{\r\n  aglSetCurrentContext(octx);\r\n  if (NULL != ctx) aglDestroyContext(ctx);\r\n}\r\n\r\n/* ------------------------------------------------------------------------ */\r\n\r\n#else /* __UNIX || (__APPLE__ && GLEW_APPLE_GLX) */\r\n\r\nDisplay* dpy = NULL;\r\nXVisualInfo* vi = NULL;\r\nXVisualInfo* vis = NULL;\r\nGLXContext ctx = NULL;\r\nWindow wnd = 0;\r\nColormap cmap = 0;\r\n\r\nGLboolean glewCreateContext (const char* display, int* visual)\r\n{\r\n  int attrib[] = { GLX_RGBA, GLX_DOUBLEBUFFER, None };\r\n  int erb, evb;\r\n  XSetWindowAttributes swa;\r\n  /* open display */\r\n  dpy = XOpenDisplay(display);\r\n  if (NULL == dpy) return GL_TRUE;\r\n  /* query for glx */\r\n  if (!glXQueryExtension(dpy, &erb, &evb)) return GL_TRUE;\r\n  /* choose visual */\r\n  if (*visual == -1)\r\n  {\r\n    vi = glXChooseVisual(dpy, DefaultScreen(dpy), attrib);\r\n    if (NULL == vi) return GL_TRUE;\r\n    *visual = (int)XVisualIDFromVisual(vi->visual);\r\n  }\r\n  else\r\n  {\r\n    int n_vis, i;\r\n    vis = XGetVisualInfo(dpy, 0, NULL, &n_vis);\r\n    for (i=0; i<n_vis; i++)\r\n    {\r\n      if ((int)XVisualIDFromVisual(vis[i].visual) == *visual)\r\n        vi = &vis[i];\r\n    }\r\n    if (vi == NULL) return GL_TRUE;\r\n  }\r\n  /* create context */\r\n  ctx = glXCreateContext(dpy, vi, None, True);\r\n  if (NULL == ctx) return GL_TRUE;\r\n  /* create window */\r\n  /*wnd = XCreateSimpleWindow(dpy, RootWindow(dpy, vi->screen), 0, 0, 1, 1, 1, 0, 0);*/\r\n  cmap = XCreateColormap(dpy, RootWindow(dpy, vi->screen), vi->visual, AllocNone);\r\n  swa.border_pixel = 0;\r\n  swa.colormap = cmap;\r\n  wnd = XCreateWindow(dpy, RootWindow(dpy, vi->screen), \r\n                      0, 0, 1, 1, 0, vi->depth, InputOutput, vi->visual, \r\n                      CWBorderPixel | CWColormap, &swa);\r\n  /* make context current */\r\n  if (!glXMakeCurrent(dpy, wnd, ctx)) return GL_TRUE;\r\n  return GL_FALSE;\r\n}\r\n\r\nvoid glewDestroyContext ()\r\n{\r\n  if (NULL != dpy && NULL != ctx) glXDestroyContext(dpy, ctx);\r\n  if (NULL != dpy && 0 != wnd) XDestroyWindow(dpy, wnd);\r\n  if (NULL != dpy && 0 != cmap) XFreeColormap(dpy, cmap);\r\n  if (NULL != vis)\r\n    XFree(vis);\r\n  else if (NULL != vi)\r\n    XFree(vi);\r\n  if (NULL != dpy) XCloseDisplay(dpy);\r\n}\r\n\r\n#endif /* __UNIX || (__APPLE__ && GLEW_APPLE_GLX) */\r\n"
  },
  {
    "path": "libs/glew/auto/src/glewinfo_wgl.c",
    "content": "}\r\n\r\n/* ------------------------------------------------------------------------ */\r\n\r\n#ifdef _WIN32\r\n\r\nstatic void wglewInfo ()\r\n{\r\n"
  },
  {
    "path": "libs/glew/auto/src/glxew_head.h",
    "content": "#ifndef __glxew_h__\r\n#define __glxew_h__\r\n#define __GLXEW_H__\r\n\r\n#ifdef __glxext_h_\r\n#error glxext.h included before glxew.h\r\n#endif\r\n#ifdef GLX_H\r\n#error glx.h included before glxew.h\r\n#endif\r\n\r\n#define __glxext_h_\r\n#define __GLX_glx_h__\r\n#define GLX_H\r\n\r\n#include <X11/Xlib.h>\r\n#include <X11/Xutil.h>\r\n#include <X11/Xmd.h>\r\n#include <GL/glew.h>\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/* ---------------------------- GLX_VERSION_1_0 --------------------------- */\r\n\r\n#ifndef GLX_VERSION_1_0\r\n#define GLX_VERSION_1_0 1\r\n\r\n#define GLX_USE_GL 1\r\n#define GLX_BUFFER_SIZE 2\r\n#define GLX_LEVEL 3\r\n#define GLX_RGBA 4\r\n#define GLX_DOUBLEBUFFER 5\r\n#define GLX_STEREO 6\r\n#define GLX_AUX_BUFFERS 7\r\n#define GLX_RED_SIZE 8\r\n#define GLX_GREEN_SIZE 9\r\n#define GLX_BLUE_SIZE 10\r\n#define GLX_ALPHA_SIZE 11\r\n#define GLX_DEPTH_SIZE 12\r\n#define GLX_STENCIL_SIZE 13\r\n#define GLX_ACCUM_RED_SIZE 14\r\n#define GLX_ACCUM_GREEN_SIZE 15\r\n#define GLX_ACCUM_BLUE_SIZE 16\r\n#define GLX_ACCUM_ALPHA_SIZE 17\r\n#define GLX_BAD_SCREEN 1\r\n#define GLX_BAD_ATTRIBUTE 2\r\n#define GLX_NO_EXTENSION 3\r\n#define GLX_BAD_VISUAL 4\r\n#define GLX_BAD_CONTEXT 5\r\n#define GLX_BAD_VALUE 6\r\n#define GLX_BAD_ENUM 7\r\n\r\ntypedef XID GLXDrawable;\r\ntypedef XID GLXPixmap;\r\n#ifdef __sun\r\ntypedef struct __glXContextRec *GLXContext;\r\n#else\r\ntypedef struct __GLXcontextRec *GLXContext;\r\n#endif\r\n\r\ntypedef unsigned int GLXVideoDeviceNV; \r\n\r\nextern Bool glXQueryExtension (Display *dpy, int *errorBase, int *eventBase);\r\nextern Bool glXQueryVersion (Display *dpy, int *major, int *minor);\r\nextern int glXGetConfig (Display *dpy, XVisualInfo *vis, int attrib, int *value);\r\nextern XVisualInfo* glXChooseVisual (Display *dpy, int screen, int *attribList);\r\nextern GLXPixmap glXCreateGLXPixmap (Display *dpy, XVisualInfo *vis, Pixmap pixmap);\r\nextern void glXDestroyGLXPixmap (Display *dpy, GLXPixmap pix);\r\nextern GLXContext glXCreateContext (Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct);\r\nextern void glXDestroyContext (Display *dpy, GLXContext ctx);\r\nextern Bool glXIsDirect (Display *dpy, GLXContext ctx);\r\nextern void glXCopyContext (Display *dpy, GLXContext src, GLXContext dst, GLulong mask);\r\nextern Bool glXMakeCurrent (Display *dpy, GLXDrawable drawable, GLXContext ctx);\r\nextern GLXContext glXGetCurrentContext (void);\r\nextern GLXDrawable glXGetCurrentDrawable (void);\r\nextern void glXWaitGL (void);\r\nextern void glXWaitX (void);\r\nextern void glXSwapBuffers (Display *dpy, GLXDrawable drawable);\r\nextern void glXUseXFont (Font font, int first, int count, int listBase);\r\n\r\n#define GLXEW_VERSION_1_0 GLXEW_GET_VAR(__GLXEW_VERSION_1_0)\r\n\r\n#endif /* GLX_VERSION_1_0 */\r\n\r\n/* ---------------------------- GLX_VERSION_1_1 --------------------------- */\r\n\r\n#ifndef GLX_VERSION_1_1\r\n#define GLX_VERSION_1_1\r\n\r\n#define GLX_VENDOR 0x1\r\n#define GLX_VERSION 0x2\r\n#define GLX_EXTENSIONS 0x3\r\n\r\nextern const char* glXQueryExtensionsString (Display *dpy, int screen);\r\nextern const char* glXGetClientString (Display *dpy, int name);\r\nextern const char* glXQueryServerString (Display *dpy, int screen, int name);\r\n\r\n#define GLXEW_VERSION_1_1 GLXEW_GET_VAR(__GLXEW_VERSION_1_1)\r\n\r\n#endif /* GLX_VERSION_1_1 */\r\n\r\n"
  },
  {
    "path": "libs/glew/auto/src/glxew_tail.h",
    "content": "/* ------------------------------------------------------------------------ */\r\n\r\n#ifdef GLEW_MX\r\n\r\ntypedef struct GLXEWContextStruct GLXEWContext;\r\nextern GLenum glxewContextInit (GLXEWContext* ctx);\r\nextern GLboolean glxewContextIsSupported (GLXEWContext* ctx, const char* name);\r\n\r\n#define glxewInit() glxewContextInit(glxewGetContext())\r\n#define glxewIsSupported(x) glxewContextIsSupported(glxewGetContext(), x)\r\n\r\n#define GLXEW_GET_VAR(x) (*(const GLboolean*)&(glxewGetContext()->x))\r\n#define GLXEW_GET_FUN(x) x\r\n\r\n#else /* GLEW_MX */\r\n\r\n#define GLXEW_GET_VAR(x) (*(const GLboolean*)&x)\r\n#define GLXEW_GET_FUN(x) x\r\n\r\nextern GLboolean glxewIsSupported (const char* name);\r\n\r\n#endif /* GLEW_MX */\r\n\r\nextern GLboolean glxewGetExtension (const char* name);\r\n\r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#endif /* __glxew_h__ */\r\n"
  },
  {
    "path": "libs/glew/auto/src/header.html",
    "content": "<!-- begin header.html -->\r\n<!--\r\nThe OpenGL Extension Wrangler Library\r\nCopyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>\r\nCopyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>\r\nCopyright (C) 2002, Lev Povalahev\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without \r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n* Redistributions of source code must retain the above copyright notice, \r\n  this list of conditions and the following disclaimer.\r\n* Redistributions in binary form must reproduce the above copyright notice, \r\n  this list of conditions and the following disclaimer in the documentation \r\n  and/or other materials provided with the distribution.\r\n* The name of the author may be used to endorse or promote products \r\n  derived from this software without specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" \r\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE \r\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \r\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \r\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\r\nTHE POSSIBILITY OF SUCH DAMAGE.\r\n-->\r\n<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html/4/loose.dtd\">\r\n<!-- &nbsp;<img src=\"new.png\" height=\"12\" alt=\"NEW!\"> -->\r\n<html>\r\n<head>\r\n<title>GLEW: The OpenGL Extension Wrangler Library</title>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=US-ASCII\"> \r\n<link href=\"glew.css\" type=\"text/css\" rel=\"stylesheet\">\r\n</head>\r\n<body bgcolor=\"#fff0d0\">\r\n<table border=\"0\" width=\"100%\" cellpadding=\"12\" cellspacing=\"8\" style=\"height:100%\">\r\n<tr>\r\n<td bgcolor=\"#ffffff\" align=\"left\" valign=\"top\" width=\"200\">\r\n<table border=\"0\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" align=\"left\">\r\n<tr>\r\n<td valign=\"top\">\r\n\r\n<table border=\"0\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" align=\"left\">\r\n<tr><td align=\"center\"><i>Latest Release: <a href=\"https://sourceforge.net/projects/glew/files/glew/1.5.3/\">1.5.3</a></i></td></tr>\r\n<tr><td align=\"center\"><br></td></tr>\r\n<tr><td align=\"center\"><img src=\"./glew.png\" alt=\"GLEW Logo\" width=\"97\" height=\"75\"></td></tr>\r\n<tr><td align=\"center\"><br></td></tr>\r\n<tr><td align=\"center\">\r\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\">\r\n<tr><td align=\"center\"><a href=\"index.html\">Download</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"install.html\">Installation</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"basic.html\">Basic Usage</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"advanced.html\">Advanced Usage</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"credits.html\">Credits & Copyright</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"log.html\">Change Log</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"http://sourceforge.net/projects/glew/\">Project Page</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"https://sourceforge.net/mail/?group_id=67586\">Mailing Lists</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"http://sourceforge.net/tracker/?group_id=67586\">Bug Tracker</a></td></tr>\r\n</table>\r\n<tr><td align=\"center\"><br></tr>\r\n</table>\r\n</td>\r\n</tr>\r\n<tr>\r\n\r\n<td valign=\"bottom\">\r\n<table border=\"0\" width=\"100%\" cellpadding=\"5\" cellspacing=\"0\" align=\"left\">\r\n<tr><td align=\"center\"><i>Last Update: 02-28-09</i></td></tr>\r\n<tr><td align=\"center\">\r\n<a href=\"http://www.opengl.org\"> <img src=\"./ogl_sm.jpg\" width=\"68\"\r\nheight=\"35\" border=\"0\" alt=\"OpenGL Logo\"></a>\r\n<a href=\"http://sourceforge.net\"> <img\r\nsrc=\"http://sourceforge.net/sflogo.php?group_id=67586&amp;type=1\"\r\nwidth=\"88\" height=\"31\" border=\"0\" alt=\"SourceForge Logo\"></a>\r\n</td>\r\n</tr>\r\n<!--- <tr><td align=\"center\"><a\r\nhref=\"http://sourceforge.net/donate/index.php?group_id=67586\"><img\r\nsrc=\"http://images.sourceforge.net/images/project-support.jpg\"\r\nwidth=\"88\" height=\"32\" border=\"0\" alt=\"Support This Project\"></a></td></tr> -->\r\n</table>\r\n</td>\r\n</tr>\r\n</table>\r\n</td>\r\n\r\n<td bgcolor=\"#ffffff\" align=\"left\" valign=\"top\">\r\n\r\n<h1>The OpenGL Extension Wrangler Library</h1>\r\n\r\n<!-- end header.html -->\r\n\r\n\r\n"
  },
  {
    "path": "libs/glew/auto/src/khronos_license.h",
    "content": "/*\r\n** Copyright (c) 2007 The Khronos Group Inc.\r\n** \r\n** Permission is hereby granted, free of charge, to any person obtaining a\r\n** copy of this software and/or associated documentation files (the\r\n** \"Materials\"), to deal in the Materials without restriction, including\r\n** without limitation the rights to use, copy, modify, merge, publish,\r\n** distribute, sublicense, and/or sell copies of the Materials, and to\r\n** permit persons to whom the Materials are furnished to do so, subject to\r\n** the following conditions:\r\n** \r\n** The above copyright notice and this permission notice shall be included\r\n** in all copies or substantial portions of the Materials.\r\n** \r\n** THE MATERIALS ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\r\n** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r\n** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\r\n** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\r\n** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\r\n** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\r\n** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.\r\n*/\r\n\r\n"
  },
  {
    "path": "libs/glew/auto/src/mesa_license.h",
    "content": "/*\r\n * Mesa 3-D graphics library\r\n * Version:  7.0\r\n *\r\n * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a\r\n * copy of this software and associated documentation files (the \"Software\"),\r\n * to deal in the Software without restriction, including without limitation\r\n * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r\n * and/or sell copies of the Software, and to permit persons to whom the\r\n * Software is furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included\r\n * in all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r\n * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r\n * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN\r\n * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n */\r\n\r\n"
  },
  {
    "path": "libs/glew/auto/src/visualinfo.rc",
    "content": "\r\n#include <windows.h>\r\n\r\n#ifdef GLEW_MX\r\n#  ifdef _DEBUG\r\n#    define FILENAME \"visualinfo-mxd.exe\"\r\n#  else\r\n#    define FILENAME \"visualinfo-mx.exe\"\r\n#  endif\r\n#else\r\n#  ifdef _DEBUG\r\n#    define FILENAME \"visualinfod.exe\"\r\n#  else\r\n#    define FILENAME \"visualinfo.exe\"\r\n#  endif\r\n#endif\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Version\r\n//\r\nVS_VERSION_INFO VERSIONINFO \r\nFILEVERSION GLEW_MAJOR, GLEW_MINOR, GLEW_MICRO, 0\r\nPRODUCTVERSION GLEW_MAJOR, GLEW_MINOR, GLEW_MICRO, 0\r\nFILEFLAGSMASK VS_FFI_FILEFLAGSMASK\r\n#ifdef _DEBUG\r\nFILEFLAGS VS_FF_DEBUG\r\n#else\r\nFILEFLAGS 0x0L\r\n#endif\r\nFILEOS VOS__WINDOWS32\r\nFILETYPE VFT_APP\r\nFILESUBTYPE VFT2_UNKNOWN\r\nBEGIN\r\n    BLOCK \"StringFileInfo\"\r\n    BEGIN\r\n        BLOCK \"040904b0\"\r\n        BEGIN\r\n            VALUE \"Comments\", \"The OpenGL Extension Wrangler Library\\r\\nCopyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>\\r\\nCopyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>\\r\\nCopyright (C) 2002, Lev Povalahev\\r\\nAll rights reserved.\\r\\n \\r\\nRedistribution and use in source and binary forms, with or without \\r\\nmodification, are permitted provided that the following conditions are met:\\r\\n\\r\\n* Redistributions of source code must retain the above copyright notice, \\r\\n  this list of conditions and the following disclaimer.\\r\\n* Redistributions in binary form must reproduce the above copyright notice, \\r\\n  this list of conditions and the following disclaimer in the documentation \\r\\n  and/or other materials provided with the distribution.\\r\\n* The name of the author may be used to endorse or promote products \\r\\n  derived from this software without specific prior written permission.\\r\\n\\r\\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' \\r\\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \\r\\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\\r\\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE \\r\\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \\r\\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \\r\\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\\r\\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\\r\\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\\r\\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\\r\\nTHE POSSIBILITY OF SUCH DAMAGE.\\r\\n\\r\\nLicense Applicability. Except to the extent portions of this file are\\r\\nmade subject to an alternative license as permitted in the SGI Free\\r\\nSoftware License B, Version 1.1 (the 'License'), the contents of this\\r\\nfile are subject only to the provisions of the License. You may not use\\r\\nthis file except in compliance with the License. You may obtain a copy\\r\\nof the License at Silicon Graphics, Inc., attn: Legal Services, 1600\\r\\nAmphitheatre Parkway, Mountain View, CA 94043-1351, or at:\\r\\n\\r\\nhttp://oss.sgi.com/projects/FreeB\\r\\n\\r\\nNote that, as provided in the License, the Software is distributed on an\\r\\n'AS IS' basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS\\r\\nDISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND\\r\\nCONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A\\r\\nPARTICULAR PURPOSE, AND NON-INFRINGEMENT.\\r\\n\\r\\nOriginal Code. The Original Code is: OpenGL Sample Implementation,\\r\\nVersion 1.2.1, released January 26, 2000, developed by Silicon Graphics,\\r\\nInc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.\\r\\nCopyright in any portions created by third parties is as indicated\\r\\nelsewhere herein. All Rights Reserved.\\r\\n\\r\\nAdditional Notice Provisions: This software was created using the\\r\\nOpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has\\r\\nnot been independently verified as being compliant with the OpenGL(R)\\r\\nversion 1.2.1 Specification.\\0\"\r\n            VALUE \"CompanyName\", \"\\0\"\r\n            VALUE \"FileDescription\", \"Utility for listing pixelformat capabilities\\0\"\r\n            VALUE \"FileVersion\", \"GLEW_MAJOR,GLEW_MINOR,GLEW_MICRO,0\\0\"\r\n            VALUE \"InternalName\", \"visualinfo\\0\"\r\n            VALUE \"LegalCopyright\", \" 2002-2008 Milan Ikits & Marcelo Magallon\\0\"\r\n            VALUE \"LegalTrademarks\", \"\\0\"\r\n            VALUE \"OriginalFilename\", FILENAME \"\\0\"\r\n            VALUE \"PrivateBuild\", \"\\0\"\r\n            VALUE \"ProductName\", \"The OpenGL Extension Wrangler Library\\0\"\r\n            VALUE \"ProductVersion\", \"GLEW_MAJOR,GLEW_MINOR,GLEW_MICRO,0\\0\"\r\n            VALUE \"SpecialBuild\", \"\\0\"\r\n        END\r\n    END\r\n    BLOCK \"VarFileInfo\"\r\n    BEGIN\r\n        VALUE \"Translation\", 0x409, 1200\r\n    END\r\nEND\r\n"
  },
  {
    "path": "libs/glew/auto/src/wglew_head.h",
    "content": "#ifndef __wglew_h__\r\n#define __wglew_h__\r\n#define __WGLEW_H__\r\n\r\n#ifdef __wglext_h_\r\n#error wglext.h included before wglew.h\r\n#endif\r\n\r\n#define __wglext_h_\r\n\r\n#if !defined(WINAPI)\r\n#  ifndef WIN32_LEAN_AND_MEAN\r\n#    define WIN32_LEAN_AND_MEAN 1\r\n#  endif\r\n#include <windows.h>\r\n#  undef WIN32_LEAN_AND_MEAN\r\n#endif\r\n\r\n/*\r\n * GLEW_STATIC needs to be set when using the static version.\r\n * GLEW_BUILD is set when building the DLL version.\r\n */\r\n#ifdef GLEW_STATIC\r\n#  define GLEWAPI extern\r\n#else\r\n#  ifdef GLEW_BUILD\r\n#    define GLEWAPI extern __declspec(dllexport)\r\n#  else\r\n#    define GLEWAPI extern __declspec(dllimport)\r\n#  endif\r\n#endif\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n"
  },
  {
    "path": "libs/glew/auto/src/wglew_tail.h",
    "content": "/* ------------------------------------------------------------------------- */\r\n\r\n#ifdef GLEW_MX\r\n\r\ntypedef struct WGLEWContextStruct WGLEWContext;\r\nGLEWAPI GLenum wglewContextInit (WGLEWContext* ctx);\r\nGLEWAPI GLboolean wglewContextIsSupported (WGLEWContext* ctx, const char* name);\r\n\r\n#define wglewInit() wglewContextInit(wglewGetContext())\r\n#define wglewIsSupported(x) wglewContextIsSupported(wglewGetContext(), x)\r\n\r\n#define WGLEW_GET_VAR(x) (*(const GLboolean*)&(wglewGetContext()->x))\r\n#define WGLEW_GET_FUN(x) wglewGetContext()->x\r\n\r\n#else /* GLEW_MX */\r\n\r\n#define WGLEW_GET_VAR(x) (*(const GLboolean*)&x)\r\n#define WGLEW_GET_FUN(x) x\r\n\r\nGLEWAPI GLboolean wglewIsSupported (const char* name);\r\n\r\n#endif /* GLEW_MX */\r\n\r\nGLEWAPI GLboolean wglewGetExtension (const char* name);\r\n\r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#undef GLEWAPI\r\n\r\n#endif /* __wglew_h__ */\r\n"
  },
  {
    "path": "libs/glew/config/Makefile.cygming",
    "content": "NAME = glew32\r\nGLEW_DEST = /usr\r\nBINDIR = /usr/bin\r\nLIBDIR = /usr/lib/mingw\r\nINCDIR = /usr/include/mingw/GL\r\nCC = gcc -mno-cygwin\r\n# use gcc for linking, with ld it does not work\r\nLD = gcc -mno-cygwin\r\nifneq (undefined, $(origin GLEW_MX))\r\nCFLAGS.EXTRA = -DGLEW_MX\r\nendif\r\nCFLAGS.SO = -DGLEW_BUILD\r\nLDFLAGS.SO = -shared -Wl,-soname,$(LIB.SONAME) -Wl,--out-implib,lib/$(LIB.DEVLNK)\r\nLDFLAGS.GL = -lglu32 -lopengl32 -lgdi32 -luser32 -lkernel32\r\nLDFLAGS.EXTRA = -L$(LIBDIR)\r\nWARN = -Wall -W\r\nPOPT = -O2\r\nBIN.SUFFIX = .exe\r\nLIB.SONAME = lib$(NAME).dll\r\nLIB.DEVLNK = lib$(NAME).dll.a    # for mingw this is the dll import lib\r\nLIB.SHARED = $(NAME).dll\r\nLIB.STATIC = lib$(NAME).a     # the static lib will be broken (see CFLAGS.SO)\r\n"
  },
  {
    "path": "libs/glew/config/Makefile.cygwin",
    "content": "NAME = GLEW\r\nGLEW_DEST ?= /usr/X11R6\r\nCC = cc\r\n# use gcc for linking, with ld it does not work\r\nLD = cc\r\nifneq (undefined, $(origin GLEW_MX))\r\nCFLAGS.EXTRA = -DGLEW_MX\r\nendif\r\nLDFLAGS.SO = -shared -Wl,-soname=$(LIB.SONAME)\r\nLDFLAGS.EXTRA = -L/usr/X11R6/lib\r\nLIBDIR = $(GLEW_DEST)/lib\r\nLDFLAGS.GL = -lXmu -lXi -lGLU -lGL -lXext -lX11\r\nLDFLAGS.STATIC = -Wl,-Bstatic\r\nLDFLAGS.DYNAMIC = -Wl,-Bdynamic\r\nWARN = -Wall -W\r\nPOPT = -O2\r\nBIN.SUFFIX =\r\nLIB.SONAME = lib$(NAME).so.$(SO_MAJOR)\r\nLIB.DEVLNK = lib$(NAME).so\r\nLIB.SHARED = lib$(NAME).so.$(SO_VERSION)\r\nLIB.STATIC = lib$(NAME).a\r\n"
  },
  {
    "path": "libs/glew/config/Makefile.darwin",
    "content": "NAME = $(GLEW_NAME)\r\nCC = cc\r\nLD = cc\r\nCFLAGS.EXTRA = -no-cpp-precomp -dynamic -fno-common\r\nifneq (undefined, $(origin GLEW_MX))\r\nCFLAGS.EXTRA += -DGLEW_MX\r\nendif\r\nPICFLAG = -fPIC\r\nLDFLAGS.SO = -dynamiclib -install_name $(GLEW_DEST)/lib/$(LIB.SHARED)\r\nLDFLAGS.EXTRA =\r\nifneq (undefined, $(origin GLEW_APPLE_GLX))\r\nCFLAGS.EXTRA += -I/usr/X11R6/include -D'GLEW_APPLE_GLX'\r\nLDFLAGS.GL = -L/usr/X11R6/lib -lXmu -lXi -lGLU -lGL -lXext -lX11\r\nelse\r\nLDFLAGS.GL = -framework AGL -framework OpenGL\r\nendif\r\nLDFLAGS.STATIC =\r\nLDFLAGS.DYNAMIC =\r\nWARN = -Wall -W\r\nPOPT = -O2\r\nBIN.SUFFIX =\r\nLIB.SONAME = lib$(NAME).$(SO_MAJOR).dylib\r\nLIB.DEVLNK = lib$(NAME).dylib\r\nLIB.SHARED = lib$(NAME).$(SO_VERSION).dylib\r\nLIB.STATIC = lib$(NAME).a\r\nSHARED_OBJ_EXT = pic_o\r\n"
  },
  {
    "path": "libs/glew/config/Makefile.freebsd",
    "content": "NAME = $(GLEW_NAME)\r\nCC = cc\r\nLD = ld\r\nifneq (undefined, $(origin GLEW_MX))\r\nCFLAGS.EXTRA = -DGLEW_MX\r\nendif\r\nLDFLAGS.SO = -shared -soname $(LIB.SONAME)\r\nLDFLAGS.EXTRA = -L/usr/X11R6/lib\r\nLDFLAGS.GL = -lXmu -lXi -lGLU -lGL -lXext -lX11\r\nLDFLAGS.STATIC = -Wl,-Bstatic\r\nLDFLAGS.DYNAMIC = -Wl,-Bdynamic\r\nCFLAGS.EXTRA += -I/usr/X11R6/include\r\nNAME = GLEW\r\nWARN = -Wall -W\r\nPOPT = -O2\r\nBIN.SUFFIX =\r\nLIB.SONAME = lib$(NAME).so.$(SO_MAJOR)\r\nLIB.DEVLNK = lib$(NAME).so\r\nLIB.SHARED = lib$(NAME).so.$(SO_VERSION)\r\nLIB.STATIC = lib$(NAME).a\r\n"
  },
  {
    "path": "libs/glew/config/Makefile.gnu",
    "content": "NAME = $(GLEW_NAME)\r\nCC = cc\r\nLD = cc\r\nifneq (undefined, $(origin GLEW_MX))\r\nCFLAGS.EXTRA = -DGLEW_MX\r\nendif\r\nPICFLAG = -fPIC\r\nLDFLAGS.SO = -shared -Wl,-soname=$(LIB.SONAME)\r\nLDFLAGS.EXTRA = -L/usr/X11R6/lib\r\nLDFLAGS.GL = -lXmu -lXi -lGLU -lGL -lXext -lX11\r\nLDFLAGS.STATIC = -Wl,-Bstatic\r\nLDFLAGS.DYNAMIC = -Wl,-Bdynamic\r\nNAME = GLEW\r\nWARN = -Wall -W\r\nPOPT = -O2\r\nBIN.SUFFIX =\r\nLIB.SONAME = lib$(NAME).so.$(SO_MAJOR)\r\nLIB.DEVLNK = lib$(NAME).so\r\nLIB.SHARED = lib$(NAME).so.$(SO_VERSION)\r\nLIB.STATIC = lib$(NAME).a\r\nSHARED_OBJ_EXT = pic_o\r\n"
  },
  {
    "path": "libs/glew/config/Makefile.irix",
    "content": "NAME = $(GLEW_NAME)\r\nCC = cc\r\nLD = ld\r\nABI = -64# -n32\r\nCC += $(ABI)\r\nLD += $(ABI)\r\nifneq (undefined, $(origin GLEW_MX))\r\nCFLAGS.EXTRA = -DGLEW_MX\r\nendif\r\nLDFLAGS.SO = -shared -soname $(LIB.SONAME)\r\nLDFLAGS.EXTRA =\r\nLDFLAGS.GL = -lGLU -lGL -lXext -lX11\r\nNAME = GLEW\r\nWARN = -fullwarn -woff 1110,1498\r\nPOPT = -O2 -OPT:Olimit=0\r\nBIN.SUFFIX =\r\nLIB.SONAME = lib$(NAME).so.$(SO_MAJOR)\r\nLIB.DEVLNK = lib$(NAME).so\r\nLIB.SHARED = lib$(NAME).so.$(SO_VERSION)\r\nLIB.STATIC = lib$(NAME).a\r\n"
  },
  {
    "path": "libs/glew/config/Makefile.kfreebsd",
    "content": "NAME = $(GLEW_NAME)\r\nCC = cc\r\nLD = cc\r\nifneq (undefined, $(origin GLEW_MX))\r\nCFLAGS.EXTRA = -DGLEW_MX\r\nendif\r\nPICFLAG = -fPIC\r\nLDFLAGS.SO = -shared -Wl,-soname $(LIB.SONAME)\r\nLDFLAGS.EXTRA = -L/usr/X11R6/lib\r\nLDFLAGS.GL = -lXmu -lXi -lGLU -lGL -lXext -lX11\r\nLDFLAGS.STATIC = -Wl,-Bstatic\r\nLDFLAGS.DYNAMIC = -Wl,-Bdynamic\r\nNAME = GLEW\r\nWARN = -Wall -W\r\nPOPT = -O2\r\nBIN.SUFFIX =\r\nLIB.SONAME = lib$(NAME).so.$(SO_MAJOR)\r\nLIB.DEVLNK = lib$(NAME).so\r\nLIB.SHARED = lib$(NAME).so.$(SO_VERSION)\r\nLIB.STATIC = lib$(NAME).a\r\nSHARED_OBJ_EXT = pic_o\r\n"
  },
  {
    "path": "libs/glew/config/Makefile.linux",
    "content": "NAME = $(GLEW_NAME)\r\nCC = cc\r\nLD = cc\r\nifneq (undefined, $(origin GLEW_MX))\r\nCFLAGS.EXTRA = -DGLEW_MX\r\nendif\r\nPICFLAG = -fPIC\r\nLDFLAGS.SO = -shared -Wl,-soname=$(LIB.SONAME)\r\nM_ARCH ?= $(shell uname -m)\r\nifeq (x86_64,${M_ARCH})\r\nLDFLAGS.EXTRA = -L/usr/X11R6/lib64\r\nLIBDIR = $(GLEW_DEST)/lib64\r\nelse\r\nLDFLAGS.EXTRA = -L/usr/X11R6/lib\r\nLIBDIR = $(GLEW_DEST)/lib\r\nendif\r\nLDFLAGS.GL = -lXmu -lXi -lGLU -lGL -lXext -lX11\r\nLDFLAGS.STATIC = -Wl,-Bstatic\r\nLDFLAGS.DYNAMIC = -Wl,-Bdynamic\r\nNAME = GLEW\r\nWARN = -Wall -W\r\nPOPT = -O2\r\nBIN.SUFFIX =\r\nLIB.SONAME = lib$(NAME).so.$(SO_MAJOR)\r\nLIB.DEVLNK = lib$(NAME).so\r\nLIB.SHARED = lib$(NAME).so.$(SO_VERSION)\r\nLIB.STATIC = lib$(NAME).a\r\nSHARED_OBJ_EXT = pic_o\r\n"
  },
  {
    "path": "libs/glew/config/Makefile.mingw",
    "content": "NAME = glew32\r\nCC = gcc\r\n# use gcc for linking, with ld it does not work\r\nLD = gcc\r\nifneq (undefined, $(origin GLEW_MX))\r\nCFLAGS.EXTRA = -DGLEW_MX\r\nendif\r\nCFLAGS.SO = -DGLEW_BUILD\r\n#LDFLAGS.SO = -shared -soname $(LIB.SONAME) --out-implib lib/$(LIB.DEVLNK)\r\nLDFLAGS.SO = -shared -Wl,-soname,$(LIB.SONAME) -Wl,--out-implib,lib/$(LIB.DEVLNK)\r\nLDFLAGS.GL = -lglu32 -lopengl32 -lgdi32 -luser32 -lkernel32\r\nLDFLAGS.EXTRA = -L/mingw/lib\r\nWARN = -Wall -W\r\nPOPT = -O2\r\nBIN.SUFFIX = .exe\r\nLIB.SONAME = lib$(NAME).dll\r\nLIB.DEVLNK = lib$(NAME).dll.a    # for mingw this is the dll import lib\r\nLIB.SHARED = $(NAME).dll\r\nLIB.STATIC = lib$(NAME).a     # the static lib will be broken (see CFLAGS.SO)\r\n"
  },
  {
    "path": "libs/glew/config/Makefile.solaris",
    "content": "NAME = $(GLEW_NAME)\r\nCC = cc\r\nLD = ld\r\nCFLAGS.EXTRA = -I/usr/openwin/include\r\nifneq (undefined, $(origin GLEW_MX))\r\nCFLAGS.EXTRA += -DGLEW_MX\r\nendif\r\nLDFLAGS.SO = -G\r\nLDFLAGS.EXTRA = -L/usr/openwin/lib\r\nLDFLAGS.GL = -lXmu -lXi -lGLU -lGL -lXext -lX11\r\nNAME = GLEW\r\nBIN.SUFFIX =\r\nPOPT = -xO2\r\nLIB.SONAME = lib$(NAME).so.$(SO_MAJOR)\r\nLIB.DEVLNK = lib$(NAME).so\r\nLIB.SHARED = lib$(NAME).so.$(SO_VERSION)\r\nLIB.STATIC = lib$(NAME).a\r\n"
  },
  {
    "path": "libs/glew/config/config.guess",
    "content": "#! /bin/sh\r\n# Attempt to guess a canonical system name.\r\n#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,\r\n#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008\r\n#   Free Software Foundation, Inc.\r\n\r\ntimestamp='2009-04-27'\r\n\r\n# This file is free software; you can redistribute it and/or modify it\r\n# under the terms of the GNU General Public License as published by\r\n# the Free Software Foundation; either version 2 of the License, or\r\n# (at your option) any later version.\r\n#\r\n# This program is distributed in the hope that it will be useful, but\r\n# WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n# General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU General Public License\r\n# along with this program; if not, write to the Free Software\r\n# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA\r\n# 02110-1301, USA.\r\n#\r\n# As a special exception to the GNU General Public License, if you\r\n# distribute this file as part of a program that contains a\r\n# configuration script generated by Autoconf, you may include it under\r\n# the same distribution terms that you use for the rest of that program.\r\n\r\n\r\n# Originally written by Per Bothner <per@bothner.com>.\r\n# Please send patches to <config-patches@gnu.org>.  Submit a context\r\n# diff and a properly formatted ChangeLog entry.\r\n#\r\n# This script attempts to guess a canonical system name similar to\r\n# config.sub.  If it succeeds, it prints the system name on stdout, and\r\n# exits with 0.  Otherwise, it exits with 1.\r\n#\r\n# The plan is that this can be called by configure scripts if you\r\n# don't specify an explicit build system type.\r\n\r\nme=`echo \"$0\" | sed -e 's,.*/,,'`\r\n\r\nusage=\"\\\r\nUsage: $0 [OPTION]\r\n\r\nOutput the configuration name of the system \\`$me' is run on.\r\n\r\nOperation modes:\r\n  -h, --help         print this help, then exit\r\n  -t, --time-stamp   print date of last modification, then exit\r\n  -v, --version      print version number, then exit\r\n\r\nReport bugs and patches to <config-patches@gnu.org>.\"\r\n\r\nversion=\"\\\r\nGNU config.guess ($timestamp)\r\n\r\nOriginally written by Per Bothner.\r\nCopyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,\r\n2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.\r\n\r\nThis is free software; see the source for copying conditions.  There is NO\r\nwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\"\r\n\r\nhelp=\"\r\nTry \\`$me --help' for more information.\"\r\n\r\n# Parse command line\r\nwhile test $# -gt 0 ; do\r\n  case $1 in\r\n    --time-stamp | --time* | -t )\r\n       echo \"$timestamp\" ; exit ;;\r\n    --version | -v )\r\n       echo \"$version\" ; exit ;;\r\n    --help | --h* | -h )\r\n       echo \"$usage\"; exit ;;\r\n    -- )     # Stop option processing\r\n       shift; break ;;\r\n    - )\t# Use stdin as input.\r\n       break ;;\r\n    -* )\r\n       echo \"$me: invalid option $1$help\" >&2\r\n       exit 1 ;;\r\n    * )\r\n       break ;;\r\n  esac\r\ndone\r\n\r\nif test $# != 0; then\r\n  echo \"$me: too many arguments$help\" >&2\r\n  exit 1\r\nfi\r\n\r\ntrap 'exit 1' 1 2 15\r\n\r\n# CC_FOR_BUILD -- compiler used by this script. Note that the use of a\r\n# compiler to aid in system detection is discouraged as it requires\r\n# temporary files to be created and, as you can see below, it is a\r\n# headache to deal with in a portable fashion.\r\n\r\n# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still\r\n# use `HOST_CC' if defined, but it is deprecated.\r\n\r\n# Portable tmp directory creation inspired by the Autoconf team.\r\n\r\nset_cc_for_build='\r\ntrap \"exitcode=\\$?; (rm -f \\$tmpfiles 2>/dev/null; rmdir \\$tmp 2>/dev/null) && exit \\$exitcode\" 0 ;\r\ntrap \"rm -f \\$tmpfiles 2>/dev/null; rmdir \\$tmp 2>/dev/null; exit 1\" 1 2 13 15 ;\r\n: ${TMPDIR=/tmp} ;\r\n { tmp=`(umask 077 && mktemp -d \"$TMPDIR/cgXXXXXX\") 2>/dev/null` && test -n \"$tmp\" && test -d \"$tmp\" ; } ||\r\n { test -n \"$RANDOM\" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||\r\n { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo \"Warning: creating insecure temp directory\" >&2 ; } ||\r\n { echo \"$me: cannot create a temporary directory in $TMPDIR\" >&2 ; exit 1 ; } ;\r\ndummy=$tmp/dummy ;\r\ntmpfiles=\"$dummy.c $dummy.o $dummy.rel $dummy\" ;\r\ncase $CC_FOR_BUILD,$HOST_CC,$CC in\r\n ,,)    echo \"int x;\" > $dummy.c ;\r\n\tfor c in cc gcc c89 c99 ; do\r\n\t  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then\r\n\t     CC_FOR_BUILD=\"$c\"; break ;\r\n\t  fi ;\r\n\tdone ;\r\n\tif test x\"$CC_FOR_BUILD\" = x ; then\r\n\t  CC_FOR_BUILD=no_compiler_found ;\r\n\tfi\r\n\t;;\r\n ,,*)   CC_FOR_BUILD=$CC ;;\r\n ,*,*)  CC_FOR_BUILD=$HOST_CC ;;\r\nesac ; set_cc_for_build= ;'\r\n\r\n# This is needed to find uname on a Pyramid OSx when run in the BSD universe.\r\n# (ghazi@noc.rutgers.edu 1994-08-24)\r\nif (test -f /.attbin/uname) >/dev/null 2>&1 ; then\r\n\tPATH=$PATH:/.attbin ; export PATH\r\nfi\r\n\r\nUNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown\r\nUNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown\r\nUNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown\r\nUNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown\r\n\r\n# Note: order is significant - the case branches are not exclusive.\r\n\r\ncase \"${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}\" in\r\n    *:NetBSD:*:*)\r\n\t# NetBSD (nbsd) targets should (where applicable) match one or\r\n\t# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,\r\n\t# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently\r\n\t# switched to ELF, *-*-netbsd* would select the old\r\n\t# object file format.  This provides both forward\r\n\t# compatibility and a consistent mechanism for selecting the\r\n\t# object file format.\r\n\t#\r\n\t# Note: NetBSD doesn't particularly care about the vendor\r\n\t# portion of the name.  We always set it to \"unknown\".\r\n\tsysctl=\"sysctl -n hw.machine_arch\"\r\n\tUNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \\\r\n\t    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`\r\n\tcase \"${UNAME_MACHINE_ARCH}\" in\r\n\t    armeb) machine=armeb-unknown ;;\r\n\t    arm*) machine=arm-unknown ;;\r\n\t    sh3el) machine=shl-unknown ;;\r\n\t    sh3eb) machine=sh-unknown ;;\r\n\t    sh5el) machine=sh5le-unknown ;;\r\n\t    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;\r\n\tesac\r\n\t# The Operating System including object format, if it has switched\r\n\t# to ELF recently, or will in the future.\r\n\tcase \"${UNAME_MACHINE_ARCH}\" in\r\n\t    arm*|i386|m68k|ns32k|sh3*|sparc|vax)\r\n\t\teval $set_cc_for_build\r\n\t\tif echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \\\r\n\t\t\t| grep __ELF__ >/dev/null\r\n\t\tthen\r\n\t\t    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).\r\n\t\t    # Return netbsd for either.  FIX?\r\n\t\t    os=netbsd\r\n\t\telse\r\n\t\t    os=netbsdelf\r\n\t\tfi\r\n\t\t;;\r\n\t    *)\r\n\t        os=netbsd\r\n\t\t;;\r\n\tesac\r\n\t# The OS release\r\n\t# Debian GNU/NetBSD machines have a different userland, and\r\n\t# thus, need a distinct triplet. However, they do not need\r\n\t# kernel version information, so it can be replaced with a\r\n\t# suitable tag, in the style of linux-gnu.\r\n\tcase \"${UNAME_VERSION}\" in\r\n\t    Debian*)\r\n\t\trelease='-gnu'\r\n\t\t;;\r\n\t    *)\r\n\t\trelease=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\\./'`\r\n\t\t;;\r\n\tesac\r\n\t# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:\r\n\t# contains redundant information, the shorter form:\r\n\t# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.\r\n\techo \"${machine}-${os}${release}\"\r\n\texit ;;\r\n    *:OpenBSD:*:*)\r\n\tUNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`\r\n\techo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}\r\n\texit ;;\r\n    *:ekkoBSD:*:*)\r\n\techo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}\r\n\texit ;;\r\n    *:SolidBSD:*:*)\r\n\techo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}\r\n\texit ;;\r\n    macppc:MirBSD:*:*)\r\n\techo powerpc-unknown-mirbsd${UNAME_RELEASE}\r\n\texit ;;\r\n    *:MirBSD:*:*)\r\n\techo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}\r\n\texit ;;\r\n    alpha:OSF1:*:*)\r\n\tcase $UNAME_RELEASE in\r\n\t*4.0)\r\n\t\tUNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`\r\n\t\t;;\r\n\t*5.*)\r\n\t        UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`\r\n\t\t;;\r\n\tesac\r\n\t# According to Compaq, /usr/sbin/psrinfo has been available on\r\n\t# OSF/1 and Tru64 systems produced since 1995.  I hope that\r\n\t# covers most systems running today.  This code pipes the CPU\r\n\t# types through head -n 1, so we only detect the type of CPU 0.\r\n\tALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \\(.*\\) processor.*$/\\1/p' | head -n 1`\r\n\tcase \"$ALPHA_CPU_TYPE\" in\r\n\t    \"EV4 (21064)\")\r\n\t\tUNAME_MACHINE=\"alpha\" ;;\r\n\t    \"EV4.5 (21064)\")\r\n\t\tUNAME_MACHINE=\"alpha\" ;;\r\n\t    \"LCA4 (21066/21068)\")\r\n\t\tUNAME_MACHINE=\"alpha\" ;;\r\n\t    \"EV5 (21164)\")\r\n\t\tUNAME_MACHINE=\"alphaev5\" ;;\r\n\t    \"EV5.6 (21164A)\")\r\n\t\tUNAME_MACHINE=\"alphaev56\" ;;\r\n\t    \"EV5.6 (21164PC)\")\r\n\t\tUNAME_MACHINE=\"alphapca56\" ;;\r\n\t    \"EV5.7 (21164PC)\")\r\n\t\tUNAME_MACHINE=\"alphapca57\" ;;\r\n\t    \"EV6 (21264)\")\r\n\t\tUNAME_MACHINE=\"alphaev6\" ;;\r\n\t    \"EV6.7 (21264A)\")\r\n\t\tUNAME_MACHINE=\"alphaev67\" ;;\r\n\t    \"EV6.8CB (21264C)\")\r\n\t\tUNAME_MACHINE=\"alphaev68\" ;;\r\n\t    \"EV6.8AL (21264B)\")\r\n\t\tUNAME_MACHINE=\"alphaev68\" ;;\r\n\t    \"EV6.8CX (21264D)\")\r\n\t\tUNAME_MACHINE=\"alphaev68\" ;;\r\n\t    \"EV6.9A (21264/EV69A)\")\r\n\t\tUNAME_MACHINE=\"alphaev69\" ;;\r\n\t    \"EV7 (21364)\")\r\n\t\tUNAME_MACHINE=\"alphaev7\" ;;\r\n\t    \"EV7.9 (21364A)\")\r\n\t\tUNAME_MACHINE=\"alphaev79\" ;;\r\n\tesac\r\n\t# A Pn.n version is a patched version.\r\n\t# A Vn.n version is a released version.\r\n\t# A Tn.n version is a released field test version.\r\n\t# A Xn.n version is an unreleased experimental baselevel.\r\n\t# 1.2 uses \"1.2\" for uname -r.\r\n\techo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`\r\n\texit ;;\r\n    Alpha\\ *:Windows_NT*:*)\r\n\t# How do we know it's Interix rather than the generic POSIX subsystem?\r\n\t# Should we change UNAME_MACHINE based on the output of uname instead\r\n\t# of the specific Alpha model?\r\n\techo alpha-pc-interix\r\n\texit ;;\r\n    21064:Windows_NT:50:3)\r\n\techo alpha-dec-winnt3.5\r\n\texit ;;\r\n    Amiga*:UNIX_System_V:4.0:*)\r\n\techo m68k-unknown-sysv4\r\n\texit ;;\r\n    *:[Aa]miga[Oo][Ss]:*:*)\r\n\techo ${UNAME_MACHINE}-unknown-amigaos\r\n\texit ;;\r\n    *:[Mm]orph[Oo][Ss]:*:*)\r\n\techo ${UNAME_MACHINE}-unknown-morphos\r\n\texit ;;\r\n    *:OS/390:*:*)\r\n\techo i370-ibm-openedition\r\n\texit ;;\r\n    *:z/VM:*:*)\r\n\techo s390-ibm-zvmoe\r\n\texit ;;\r\n    *:OS400:*:*)\r\n        echo powerpc-ibm-os400\r\n\texit ;;\r\n    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)\r\n\techo arm-acorn-riscix${UNAME_RELEASE}\r\n\texit ;;\r\n    arm:riscos:*:*|arm:RISCOS:*:*)\r\n\techo arm-unknown-riscos\r\n\texit ;;\r\n    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)\r\n\techo hppa1.1-hitachi-hiuxmpp\r\n\texit ;;\r\n    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)\r\n\t# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.\r\n\tif test \"`(/bin/universe) 2>/dev/null`\" = att ; then\r\n\t\techo pyramid-pyramid-sysv3\r\n\telse\r\n\t\techo pyramid-pyramid-bsd\r\n\tfi\r\n\texit ;;\r\n    NILE*:*:*:dcosx)\r\n\techo pyramid-pyramid-svr4\r\n\texit ;;\r\n    DRS?6000:unix:4.0:6*)\r\n\techo sparc-icl-nx6\r\n\texit ;;\r\n    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)\r\n\tcase `/usr/bin/uname -p` in\r\n\t    sparc) echo sparc-icl-nx7; exit ;;\r\n\tesac ;;\r\n    s390x:SunOS:*:*)\r\n\techo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\r\n\texit ;;\r\n    sun4H:SunOS:5.*:*)\r\n\techo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\r\n\texit ;;\r\n    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)\r\n\techo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\r\n\texit ;;\r\n    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)\r\n\teval $set_cc_for_build\r\n\tSUN_ARCH=\"i386\"\r\n\t# If there is a compiler, see if it is configured for 64-bit objects.\r\n\t# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.\r\n\t# This test works for both compilers.\r\n\tif [ \"$CC_FOR_BUILD\" != 'no_compiler_found' ]; then\r\n\t    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \\\r\n\t\t(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \\\r\n\t\tgrep IS_64BIT_ARCH >/dev/null\r\n\t    then\r\n\t\tSUN_ARCH=\"x86_64\"\r\n\t    fi\r\n\tfi\r\n\techo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\r\n\texit ;;\r\n    sun4*:SunOS:6*:*)\r\n\t# According to config.sub, this is the proper way to canonicalize\r\n\t# SunOS6.  Hard to guess exactly what SunOS6 will be like, but\r\n\t# it's likely to be more like Solaris than SunOS4.\r\n\techo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\r\n\texit ;;\r\n    sun4*:SunOS:*:*)\r\n\tcase \"`/usr/bin/arch -k`\" in\r\n\t    Series*|S4*)\r\n\t\tUNAME_RELEASE=`uname -v`\r\n\t\t;;\r\n\tesac\r\n\t# Japanese Language versions have a version number like `4.1.3-JL'.\r\n\techo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`\r\n\texit ;;\r\n    sun3*:SunOS:*:*)\r\n\techo m68k-sun-sunos${UNAME_RELEASE}\r\n\texit ;;\r\n    sun*:*:4.2BSD:*)\r\n\tUNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`\r\n\ttest \"x${UNAME_RELEASE}\" = \"x\" && UNAME_RELEASE=3\r\n\tcase \"`/bin/arch`\" in\r\n\t    sun3)\r\n\t\techo m68k-sun-sunos${UNAME_RELEASE}\r\n\t\t;;\r\n\t    sun4)\r\n\t\techo sparc-sun-sunos${UNAME_RELEASE}\r\n\t\t;;\r\n\tesac\r\n\texit ;;\r\n    aushp:SunOS:*:*)\r\n\techo sparc-auspex-sunos${UNAME_RELEASE}\r\n\texit ;;\r\n    # The situation for MiNT is a little confusing.  The machine name\r\n    # can be virtually everything (everything which is not\r\n    # \"atarist\" or \"atariste\" at least should have a processor\r\n    # > m68000).  The system name ranges from \"MiNT\" over \"FreeMiNT\"\r\n    # to the lowercase version \"mint\" (or \"freemint\").  Finally\r\n    # the system name \"TOS\" denotes a system which is actually not\r\n    # MiNT.  But MiNT is downward compatible to TOS, so this should\r\n    # be no problem.\r\n    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)\r\n        echo m68k-atari-mint${UNAME_RELEASE}\r\n\texit ;;\r\n    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)\r\n\techo m68k-atari-mint${UNAME_RELEASE}\r\n        exit ;;\r\n    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)\r\n        echo m68k-atari-mint${UNAME_RELEASE}\r\n\texit ;;\r\n    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)\r\n        echo m68k-milan-mint${UNAME_RELEASE}\r\n        exit ;;\r\n    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)\r\n        echo m68k-hades-mint${UNAME_RELEASE}\r\n        exit ;;\r\n    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)\r\n        echo m68k-unknown-mint${UNAME_RELEASE}\r\n        exit ;;\r\n    m68k:machten:*:*)\r\n\techo m68k-apple-machten${UNAME_RELEASE}\r\n\texit ;;\r\n    powerpc:machten:*:*)\r\n\techo powerpc-apple-machten${UNAME_RELEASE}\r\n\texit ;;\r\n    RISC*:Mach:*:*)\r\n\techo mips-dec-mach_bsd4.3\r\n\texit ;;\r\n    RISC*:ULTRIX:*:*)\r\n\techo mips-dec-ultrix${UNAME_RELEASE}\r\n\texit ;;\r\n    VAX*:ULTRIX*:*:*)\r\n\techo vax-dec-ultrix${UNAME_RELEASE}\r\n\texit ;;\r\n    2020:CLIX:*:* | 2430:CLIX:*:*)\r\n\techo clipper-intergraph-clix${UNAME_RELEASE}\r\n\texit ;;\r\n    mips:*:*:UMIPS | mips:*:*:RISCos)\r\n\teval $set_cc_for_build\r\n\tsed 's/^\t//' << EOF >$dummy.c\r\n#ifdef __cplusplus\r\n#include <stdio.h>  /* for printf() prototype */\r\n\tint main (int argc, char *argv[]) {\r\n#else\r\n\tint main (argc, argv) int argc; char *argv[]; {\r\n#endif\r\n\t#if defined (host_mips) && defined (MIPSEB)\r\n\t#if defined (SYSTYPE_SYSV)\r\n\t  printf (\"mips-mips-riscos%ssysv\\n\", argv[1]); exit (0);\r\n\t#endif\r\n\t#if defined (SYSTYPE_SVR4)\r\n\t  printf (\"mips-mips-riscos%ssvr4\\n\", argv[1]); exit (0);\r\n\t#endif\r\n\t#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)\r\n\t  printf (\"mips-mips-riscos%sbsd\\n\", argv[1]); exit (0);\r\n\t#endif\r\n\t#endif\r\n\t  exit (-1);\r\n\t}\r\nEOF\r\n\t$CC_FOR_BUILD -o $dummy $dummy.c &&\r\n\t  dummyarg=`echo \"${UNAME_RELEASE}\" | sed -n 's/\\([0-9]*\\).*/\\1/p'` &&\r\n\t  SYSTEM_NAME=`$dummy $dummyarg` &&\r\n\t    { echo \"$SYSTEM_NAME\"; exit; }\r\n\techo mips-mips-riscos${UNAME_RELEASE}\r\n\texit ;;\r\n    Motorola:PowerMAX_OS:*:*)\r\n\techo powerpc-motorola-powermax\r\n\texit ;;\r\n    Motorola:*:4.3:PL8-*)\r\n\techo powerpc-harris-powermax\r\n\texit ;;\r\n    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)\r\n\techo powerpc-harris-powermax\r\n\texit ;;\r\n    Night_Hawk:Power_UNIX:*:*)\r\n\techo powerpc-harris-powerunix\r\n\texit ;;\r\n    m88k:CX/UX:7*:*)\r\n\techo m88k-harris-cxux7\r\n\texit ;;\r\n    m88k:*:4*:R4*)\r\n\techo m88k-motorola-sysv4\r\n\texit ;;\r\n    m88k:*:3*:R3*)\r\n\techo m88k-motorola-sysv3\r\n\texit ;;\r\n    AViiON:dgux:*:*)\r\n        # DG/UX returns AViiON for all architectures\r\n        UNAME_PROCESSOR=`/usr/bin/uname -p`\r\n\tif [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]\r\n\tthen\r\n\t    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \\\r\n\t       [ ${TARGET_BINARY_INTERFACE}x = x ]\r\n\t    then\r\n\t\techo m88k-dg-dgux${UNAME_RELEASE}\r\n\t    else\r\n\t\techo m88k-dg-dguxbcs${UNAME_RELEASE}\r\n\t    fi\r\n\telse\r\n\t    echo i586-dg-dgux${UNAME_RELEASE}\r\n\tfi\r\n \texit ;;\r\n    M88*:DolphinOS:*:*)\t# DolphinOS (SVR3)\r\n\techo m88k-dolphin-sysv3\r\n\texit ;;\r\n    M88*:*:R3*:*)\r\n\t# Delta 88k system running SVR3\r\n\techo m88k-motorola-sysv3\r\n\texit ;;\r\n    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)\r\n\techo m88k-tektronix-sysv3\r\n\texit ;;\r\n    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)\r\n\techo m68k-tektronix-bsd\r\n\texit ;;\r\n    *:IRIX*:*:*)\r\n\techo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`\r\n\texit ;;\r\n    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.\r\n\techo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id\r\n\texit ;;               # Note that: echo \"'`uname -s`'\" gives 'AIX '\r\n    i*86:AIX:*:*)\r\n\techo i386-ibm-aix\r\n\texit ;;\r\n    ia64:AIX:*:*)\r\n\tif [ -x /usr/bin/oslevel ] ; then\r\n\t\tIBM_REV=`/usr/bin/oslevel`\r\n\telse\r\n\t\tIBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}\r\n\tfi\r\n\techo ${UNAME_MACHINE}-ibm-aix${IBM_REV}\r\n\texit ;;\r\n    *:AIX:2:3)\r\n\tif grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then\r\n\t\teval $set_cc_for_build\r\n\t\tsed 's/^\t\t//' << EOF >$dummy.c\r\n\t\t#include <sys/systemcfg.h>\r\n\r\n\t\tmain()\r\n\t\t\t{\r\n\t\t\tif (!__power_pc())\r\n\t\t\t\texit(1);\r\n\t\t\tputs(\"powerpc-ibm-aix3.2.5\");\r\n\t\t\texit(0);\r\n\t\t\t}\r\nEOF\r\n\t\tif $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`\r\n\t\tthen\r\n\t\t\techo \"$SYSTEM_NAME\"\r\n\t\telse\r\n\t\t\techo rs6000-ibm-aix3.2.5\r\n\t\tfi\r\n\telif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then\r\n\t\techo rs6000-ibm-aix3.2.4\r\n\telse\r\n\t\techo rs6000-ibm-aix3.2\r\n\tfi\r\n\texit ;;\r\n    *:AIX:*:[456])\r\n\tIBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`\r\n\tif /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then\r\n\t\tIBM_ARCH=rs6000\r\n\telse\r\n\t\tIBM_ARCH=powerpc\r\n\tfi\r\n\tif [ -x /usr/bin/oslevel ] ; then\r\n\t\tIBM_REV=`/usr/bin/oslevel`\r\n\telse\r\n\t\tIBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}\r\n\tfi\r\n\techo ${IBM_ARCH}-ibm-aix${IBM_REV}\r\n\texit ;;\r\n    *:AIX:*:*)\r\n\techo rs6000-ibm-aix\r\n\texit ;;\r\n    ibmrt:4.4BSD:*|romp-ibm:BSD:*)\r\n\techo romp-ibm-bsd4.4\r\n\texit ;;\r\n    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and\r\n\techo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to\r\n\texit ;;                             # report: romp-ibm BSD 4.3\r\n    *:BOSX:*:*)\r\n\techo rs6000-bull-bosx\r\n\texit ;;\r\n    DPX/2?00:B.O.S.:*:*)\r\n\techo m68k-bull-sysv3\r\n\texit ;;\r\n    9000/[34]??:4.3bsd:1.*:*)\r\n\techo m68k-hp-bsd\r\n\texit ;;\r\n    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)\r\n\techo m68k-hp-bsd4.4\r\n\texit ;;\r\n    9000/[34678]??:HP-UX:*:*)\r\n\tHPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`\r\n\tcase \"${UNAME_MACHINE}\" in\r\n\t    9000/31? )            HP_ARCH=m68000 ;;\r\n\t    9000/[34]?? )         HP_ARCH=m68k ;;\r\n\t    9000/[678][0-9][0-9])\r\n\t\tif [ -x /usr/bin/getconf ]; then\r\n\t\t    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`\r\n                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`\r\n                    case \"${sc_cpu_version}\" in\r\n                      523) HP_ARCH=\"hppa1.0\" ;; # CPU_PA_RISC1_0\r\n                      528) HP_ARCH=\"hppa1.1\" ;; # CPU_PA_RISC1_1\r\n                      532)                      # CPU_PA_RISC2_0\r\n                        case \"${sc_kernel_bits}\" in\r\n                          32) HP_ARCH=\"hppa2.0n\" ;;\r\n                          64) HP_ARCH=\"hppa2.0w\" ;;\r\n\t\t\t  '') HP_ARCH=\"hppa2.0\" ;;   # HP-UX 10.20\r\n                        esac ;;\r\n                    esac\r\n\t\tfi\r\n\t\tif [ \"${HP_ARCH}\" = \"\" ]; then\r\n\t\t    eval $set_cc_for_build\r\n\t\t    sed 's/^              //' << EOF >$dummy.c\r\n\r\n              #define _HPUX_SOURCE\r\n              #include <stdlib.h>\r\n              #include <unistd.h>\r\n\r\n              int main ()\r\n              {\r\n              #if defined(_SC_KERNEL_BITS)\r\n                  long bits = sysconf(_SC_KERNEL_BITS);\r\n              #endif\r\n                  long cpu  = sysconf (_SC_CPU_VERSION);\r\n\r\n                  switch (cpu)\r\n              \t{\r\n              \tcase CPU_PA_RISC1_0: puts (\"hppa1.0\"); break;\r\n              \tcase CPU_PA_RISC1_1: puts (\"hppa1.1\"); break;\r\n              \tcase CPU_PA_RISC2_0:\r\n              #if defined(_SC_KERNEL_BITS)\r\n              \t    switch (bits)\r\n              \t\t{\r\n              \t\tcase 64: puts (\"hppa2.0w\"); break;\r\n              \t\tcase 32: puts (\"hppa2.0n\"); break;\r\n              \t\tdefault: puts (\"hppa2.0\"); break;\r\n              \t\t} break;\r\n              #else  /* !defined(_SC_KERNEL_BITS) */\r\n              \t    puts (\"hppa2.0\"); break;\r\n              #endif\r\n              \tdefault: puts (\"hppa1.0\"); break;\r\n              \t}\r\n                  exit (0);\r\n              }\r\nEOF\r\n\t\t    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`\r\n\t\t    test -z \"$HP_ARCH\" && HP_ARCH=hppa\r\n\t\tfi ;;\r\n\tesac\r\n\tif [ ${HP_ARCH} = \"hppa2.0w\" ]\r\n\tthen\r\n\t    eval $set_cc_for_build\r\n\r\n\t    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating\r\n\t    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler\r\n\t    # generating 64-bit code.  GNU and HP use different nomenclature:\r\n\t    #\r\n\t    # $ CC_FOR_BUILD=cc ./config.guess\r\n\t    # => hppa2.0w-hp-hpux11.23\r\n\t    # $ CC_FOR_BUILD=\"cc +DA2.0w\" ./config.guess\r\n\t    # => hppa64-hp-hpux11.23\r\n\r\n\t    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |\r\n\t\tgrep __LP64__ >/dev/null\r\n\t    then\r\n\t\tHP_ARCH=\"hppa2.0w\"\r\n\t    else\r\n\t\tHP_ARCH=\"hppa64\"\r\n\t    fi\r\n\tfi\r\n\techo ${HP_ARCH}-hp-hpux${HPUX_REV}\r\n\texit ;;\r\n    ia64:HP-UX:*:*)\r\n\tHPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`\r\n\techo ia64-hp-hpux${HPUX_REV}\r\n\texit ;;\r\n    3050*:HI-UX:*:*)\r\n\teval $set_cc_for_build\r\n\tsed 's/^\t//' << EOF >$dummy.c\r\n\t#include <unistd.h>\r\n\tint\r\n\tmain ()\r\n\t{\r\n\t  long cpu = sysconf (_SC_CPU_VERSION);\r\n\t  /* The order matters, because CPU_IS_HP_MC68K erroneously returns\r\n\t     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct\r\n\t     results, however.  */\r\n\t  if (CPU_IS_PA_RISC (cpu))\r\n\t    {\r\n\t      switch (cpu)\r\n\t\t{\r\n\t\t  case CPU_PA_RISC1_0: puts (\"hppa1.0-hitachi-hiuxwe2\"); break;\r\n\t\t  case CPU_PA_RISC1_1: puts (\"hppa1.1-hitachi-hiuxwe2\"); break;\r\n\t\t  case CPU_PA_RISC2_0: puts (\"hppa2.0-hitachi-hiuxwe2\"); break;\r\n\t\t  default: puts (\"hppa-hitachi-hiuxwe2\"); break;\r\n\t\t}\r\n\t    }\r\n\t  else if (CPU_IS_HP_MC68K (cpu))\r\n\t    puts (\"m68k-hitachi-hiuxwe2\");\r\n\t  else puts (\"unknown-hitachi-hiuxwe2\");\r\n\t  exit (0);\r\n\t}\r\nEOF\r\n\t$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&\r\n\t\t{ echo \"$SYSTEM_NAME\"; exit; }\r\n\techo unknown-hitachi-hiuxwe2\r\n\texit ;;\r\n    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )\r\n\techo hppa1.1-hp-bsd\r\n\texit ;;\r\n    9000/8??:4.3bsd:*:*)\r\n\techo hppa1.0-hp-bsd\r\n\texit ;;\r\n    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)\r\n\techo hppa1.0-hp-mpeix\r\n\texit ;;\r\n    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )\r\n\techo hppa1.1-hp-osf\r\n\texit ;;\r\n    hp8??:OSF1:*:*)\r\n\techo hppa1.0-hp-osf\r\n\texit ;;\r\n    i*86:OSF1:*:*)\r\n\tif [ -x /usr/sbin/sysversion ] ; then\r\n\t    echo ${UNAME_MACHINE}-unknown-osf1mk\r\n\telse\r\n\t    echo ${UNAME_MACHINE}-unknown-osf1\r\n\tfi\r\n\texit ;;\r\n    parisc*:Lites*:*:*)\r\n\techo hppa1.1-hp-lites\r\n\texit ;;\r\n    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)\r\n\techo c1-convex-bsd\r\n        exit ;;\r\n    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)\r\n\tif getsysinfo -f scalar_acc\r\n\tthen echo c32-convex-bsd\r\n\telse echo c2-convex-bsd\r\n\tfi\r\n        exit ;;\r\n    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)\r\n\techo c34-convex-bsd\r\n        exit ;;\r\n    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)\r\n\techo c38-convex-bsd\r\n        exit ;;\r\n    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)\r\n\techo c4-convex-bsd\r\n        exit ;;\r\n    CRAY*Y-MP:*:*:*)\r\n\techo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\r\n\texit ;;\r\n    CRAY*[A-Z]90:*:*:*)\r\n\techo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \\\r\n\t| sed -e 's/CRAY.*\\([A-Z]90\\)/\\1/' \\\r\n\t      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \\\r\n\t      -e 's/\\.[^.]*$/.X/'\r\n\texit ;;\r\n    CRAY*TS:*:*:*)\r\n\techo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\r\n\texit ;;\r\n    CRAY*T3E:*:*:*)\r\n\techo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\r\n\texit ;;\r\n    CRAY*SV1:*:*:*)\r\n\techo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\r\n\texit ;;\r\n    *:UNICOS/mp:*:*)\r\n\techo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\r\n\texit ;;\r\n    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)\r\n\tFUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`\r\n        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\\///'`\r\n        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`\r\n        echo \"${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}\"\r\n        exit ;;\r\n    5000:UNIX_System_V:4.*:*)\r\n        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\\///'`\r\n        FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`\r\n        echo \"sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}\"\r\n\texit ;;\r\n    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\\ Embedded/OS:*:*)\r\n\techo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}\r\n\texit ;;\r\n    sparc*:BSD/OS:*:*)\r\n\techo sparc-unknown-bsdi${UNAME_RELEASE}\r\n\texit ;;\r\n    *:BSD/OS:*:*)\r\n\techo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}\r\n\texit ;;\r\n    *:FreeBSD:*:*)\r\n\tcase ${UNAME_MACHINE} in\r\n\t    pc98)\r\n\t\techo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;\r\n\t    amd64)\r\n\t\techo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;\r\n\t    *)\r\n\t\techo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;\r\n\tesac\r\n\texit ;;\r\n    i*:CYGWIN*:*)\r\n\techo ${UNAME_MACHINE}-pc-cygwin\r\n\texit ;;\r\n    *:MINGW*:*)\r\n\techo ${UNAME_MACHINE}-pc-mingw32\r\n\texit ;;\r\n    i*:windows32*:*)\r\n    \t# uname -m includes \"-pc\" on this system.\r\n    \techo ${UNAME_MACHINE}-mingw32\r\n\texit ;;\r\n    i*:PW*:*)\r\n\techo ${UNAME_MACHINE}-pc-pw32\r\n\texit ;;\r\n    *:Interix*:[3456]*)\r\n    \tcase ${UNAME_MACHINE} in\r\n\t    x86)\r\n\t\techo i586-pc-interix${UNAME_RELEASE}\r\n\t\texit ;;\r\n\t    EM64T | authenticamd | genuineintel)\r\n\t\techo x86_64-unknown-interix${UNAME_RELEASE}\r\n\t\texit ;;\r\n\t    IA64)\r\n\t\techo ia64-unknown-interix${UNAME_RELEASE}\r\n\t\texit ;;\r\n\tesac ;;\r\n    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)\r\n\techo i${UNAME_MACHINE}-pc-mks\r\n\texit ;;\r\n    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)\r\n\t# How do we know it's Interix rather than the generic POSIX subsystem?\r\n\t# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we\r\n\t# UNAME_MACHINE based on the output of uname instead of i386?\r\n\techo i586-pc-interix\r\n\texit ;;\r\n    i*:UWIN*:*)\r\n\techo ${UNAME_MACHINE}-pc-uwin\r\n\texit ;;\r\n    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)\r\n\techo x86_64-unknown-cygwin\r\n\texit ;;\r\n    p*:CYGWIN*:*)\r\n\techo powerpcle-unknown-cygwin\r\n\texit ;;\r\n    prep*:SunOS:5.*:*)\r\n\techo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\r\n\texit ;;\r\n    *:GNU:*:*)\r\n\t# the GNU system\r\n\techo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`\r\n\texit ;;\r\n    *:GNU/*:*:*)\r\n\t# other systems with GNU libc and userland\r\n\techo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu\r\n\texit ;;\r\n    i*86:Minix:*:*)\r\n\techo ${UNAME_MACHINE}-pc-minix\r\n\texit ;;\r\n    arm*:Linux:*:*)\r\n\teval $set_cc_for_build\r\n\tif echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \\\r\n\t    | grep -q __ARM_EABI__\r\n\tthen\r\n\t    echo ${UNAME_MACHINE}-unknown-linux-gnu\r\n\telse\r\n\t    echo ${UNAME_MACHINE}-unknown-linux-gnueabi\r\n\tfi\r\n\texit ;;\r\n    avr32*:Linux:*:*)\r\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\r\n\texit ;;\r\n    cris:Linux:*:*)\r\n\techo cris-axis-linux-gnu\r\n\texit ;;\r\n    crisv32:Linux:*:*)\r\n\techo crisv32-axis-linux-gnu\r\n\texit ;;\r\n    frv:Linux:*:*)\r\n    \techo frv-unknown-linux-gnu\r\n\texit ;;\r\n    ia64:Linux:*:*)\r\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\r\n\texit ;;\r\n    m32r*:Linux:*:*)\r\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\r\n\texit ;;\r\n    m68*:Linux:*:*)\r\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\r\n\texit ;;\r\n    mips:Linux:*:*)\r\n\teval $set_cc_for_build\r\n\tsed 's/^\t//' << EOF >$dummy.c\r\n\t#undef CPU\r\n\t#undef mips\r\n\t#undef mipsel\r\n\t#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)\r\n\tCPU=mipsel\r\n\t#else\r\n\t#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)\r\n\tCPU=mips\r\n\t#else\r\n\tCPU=\r\n\t#endif\r\n\t#endif\r\nEOF\r\n\teval \"`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '\r\n\t    /^CPU/{\r\n\t\ts: ::g\r\n\t\tp\r\n\t    }'`\"\r\n\ttest x\"${CPU}\" != x && { echo \"${CPU}-unknown-linux-gnu\"; exit; }\r\n\t;;\r\n    mips64:Linux:*:*)\r\n\teval $set_cc_for_build\r\n\tsed 's/^\t//' << EOF >$dummy.c\r\n\t#undef CPU\r\n\t#undef mips64\r\n\t#undef mips64el\r\n\t#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)\r\n\tCPU=mips64el\r\n\t#else\r\n\t#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)\r\n\tCPU=mips64\r\n\t#else\r\n\tCPU=\r\n\t#endif\r\n\t#endif\r\nEOF\r\n\teval \"`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '\r\n\t    /^CPU/{\r\n\t\ts: ::g\r\n\t\tp\r\n\t    }'`\"\r\n\ttest x\"${CPU}\" != x && { echo \"${CPU}-unknown-linux-gnu\"; exit; }\r\n\t;;\r\n    or32:Linux:*:*)\r\n\techo or32-unknown-linux-gnu\r\n\texit ;;\r\n    ppc:Linux:*:*)\r\n\techo powerpc-unknown-linux-gnu\r\n\texit ;;\r\n    ppc64:Linux:*:*)\r\n\techo powerpc64-unknown-linux-gnu\r\n\texit ;;\r\n    alpha:Linux:*:*)\r\n\tcase `sed -n '/^cpu model/s/^.*: \\(.*\\)/\\1/p' < /proc/cpuinfo` in\r\n\t  EV5)   UNAME_MACHINE=alphaev5 ;;\r\n\t  EV56)  UNAME_MACHINE=alphaev56 ;;\r\n\t  PCA56) UNAME_MACHINE=alphapca56 ;;\r\n\t  PCA57) UNAME_MACHINE=alphapca56 ;;\r\n\t  EV6)   UNAME_MACHINE=alphaev6 ;;\r\n\t  EV67)  UNAME_MACHINE=alphaev67 ;;\r\n\t  EV68*) UNAME_MACHINE=alphaev68 ;;\r\n        esac\r\n\tobjdump --private-headers /bin/sh | grep ld.so.1 >/dev/null\r\n\tif test \"$?\" = 0 ; then LIBC=\"libc1\" ; else LIBC=\"\" ; fi\r\n\techo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}\r\n\texit ;;\r\n    padre:Linux:*:*)\r\n\techo sparc-unknown-linux-gnu\r\n\texit ;;\r\n    parisc:Linux:*:* | hppa:Linux:*:*)\r\n\t# Look for CPU level\r\n\tcase `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in\r\n\t  PA7*) echo hppa1.1-unknown-linux-gnu ;;\r\n\t  PA8*) echo hppa2.0-unknown-linux-gnu ;;\r\n\t  *)    echo hppa-unknown-linux-gnu ;;\r\n\tesac\r\n\texit ;;\r\n    parisc64:Linux:*:* | hppa64:Linux:*:*)\r\n\techo hppa64-unknown-linux-gnu\r\n\texit ;;\r\n    s390:Linux:*:* | s390x:Linux:*:*)\r\n\techo ${UNAME_MACHINE}-ibm-linux\r\n\texit ;;\r\n    sh64*:Linux:*:*)\r\n    \techo ${UNAME_MACHINE}-unknown-linux-gnu\r\n\texit ;;\r\n    sh*:Linux:*:*)\r\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\r\n\texit ;;\r\n    sparc:Linux:*:* | sparc64:Linux:*:*)\r\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\r\n\texit ;;\r\n    vax:Linux:*:*)\r\n\techo ${UNAME_MACHINE}-dec-linux-gnu\r\n\texit ;;\r\n    x86_64:Linux:*:*)\r\n\techo x86_64-unknown-linux-gnu\r\n\texit ;;\r\n    xtensa*:Linux:*:*)\r\n    \techo ${UNAME_MACHINE}-unknown-linux-gnu\r\n\texit ;;\r\n    i*86:Linux:*:*)\r\n\t# The BFD linker knows what the default object file format is, so\r\n\t# first see if it will tell us. cd to the root directory to prevent\r\n\t# problems with other programs or directories called `ld' in the path.\r\n\t# Set LC_ALL=C to ensure ld outputs messages in English.\r\n\tld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \\\r\n\t\t\t | sed -ne '/supported targets:/!d\r\n\t\t\t\t    s/[ \t][ \t]*/ /g\r\n\t\t\t\t    s/.*supported targets: *//\r\n\t\t\t\t    s/ .*//\r\n\t\t\t\t    p'`\r\n        case \"$ld_supported_targets\" in\r\n\t  elf32-i386)\r\n\t\tTENTATIVE=\"${UNAME_MACHINE}-pc-linux-gnu\"\r\n\t\t;;\r\n\t  a.out-i386-linux)\r\n\t\techo \"${UNAME_MACHINE}-pc-linux-gnuaout\"\r\n\t\texit ;;\r\n\t  \"\")\r\n\t\t# Either a pre-BFD a.out linker (linux-gnuoldld) or\r\n\t\t# one that does not give us useful --help.\r\n\t\techo \"${UNAME_MACHINE}-pc-linux-gnuoldld\"\r\n\t\texit ;;\r\n\tesac\r\n\t# Determine whether the default compiler is a.out or elf\r\n\teval $set_cc_for_build\r\n\tsed 's/^\t//' << EOF >$dummy.c\r\n\t#include <features.h>\r\n\t#ifdef __ELF__\r\n\t# ifdef __GLIBC__\r\n\t#  if __GLIBC__ >= 2\r\n\tLIBC=gnu\r\n\t#  else\r\n\tLIBC=gnulibc1\r\n\t#  endif\r\n\t# else\r\n\tLIBC=gnulibc1\r\n\t# endif\r\n\t#else\r\n\t#if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)\r\n\tLIBC=gnu\r\n\t#else\r\n\tLIBC=gnuaout\r\n\t#endif\r\n\t#endif\r\n\t#ifdef __dietlibc__\r\n\tLIBC=dietlibc\r\n\t#endif\r\nEOF\r\n\teval \"`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '\r\n\t    /^LIBC/{\r\n\t\ts: ::g\r\n\t\tp\r\n\t    }'`\"\r\n\ttest x\"${LIBC}\" != x && {\r\n\t\techo \"${UNAME_MACHINE}-pc-linux-${LIBC}\"\r\n\t\texit\r\n\t}\r\n\ttest x\"${TENTATIVE}\" != x && { echo \"${TENTATIVE}\"; exit; }\r\n\t;;\r\n    i*86:DYNIX/ptx:4*:*)\r\n\t# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.\r\n\t# earlier versions are messed up and put the nodename in both\r\n\t# sysname and nodename.\r\n\techo i386-sequent-sysv4\r\n\texit ;;\r\n    i*86:UNIX_SV:4.2MP:2.*)\r\n        # Unixware is an offshoot of SVR4, but it has its own version\r\n        # number series starting with 2...\r\n        # I am not positive that other SVR4 systems won't match this,\r\n\t# I just have to hope.  -- rms.\r\n        # Use sysv4.2uw... so that sysv4* matches it.\r\n\techo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}\r\n\texit ;;\r\n    i*86:OS/2:*:*)\r\n\t# If we were able to find `uname', then EMX Unix compatibility\r\n\t# is probably installed.\r\n\techo ${UNAME_MACHINE}-pc-os2-emx\r\n\texit ;;\r\n    i*86:XTS-300:*:STOP)\r\n\techo ${UNAME_MACHINE}-unknown-stop\r\n\texit ;;\r\n    i*86:atheos:*:*)\r\n\techo ${UNAME_MACHINE}-unknown-atheos\r\n\texit ;;\r\n    i*86:syllable:*:*)\r\n\techo ${UNAME_MACHINE}-pc-syllable\r\n\texit ;;\r\n    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)\r\n\techo i386-unknown-lynxos${UNAME_RELEASE}\r\n\texit ;;\r\n    i*86:*DOS:*:*)\r\n\techo ${UNAME_MACHINE}-pc-msdosdjgpp\r\n\texit ;;\r\n    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)\r\n\tUNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\\/MP$//'`\r\n\tif grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then\r\n\t\techo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}\r\n\telse\r\n\t\techo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}\r\n\tfi\r\n\texit ;;\r\n    i*86:*:5:[678]*)\r\n    \t# UnixWare 7.x, OpenUNIX and OpenServer 6.\r\n\tcase `/bin/uname -X | grep \"^Machine\"` in\r\n\t    *486*)\t     UNAME_MACHINE=i486 ;;\r\n\t    *Pentium)\t     UNAME_MACHINE=i586 ;;\r\n\t    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;\r\n\tesac\r\n\techo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}\r\n\texit ;;\r\n    i*86:*:3.2:*)\r\n\tif test -f /usr/options/cb.name; then\r\n\t\tUNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`\r\n\t\techo ${UNAME_MACHINE}-pc-isc$UNAME_REL\r\n\telif /bin/uname -X 2>/dev/null >/dev/null ; then\r\n\t\tUNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`\r\n\t\t(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486\r\n\t\t(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \\\r\n\t\t\t&& UNAME_MACHINE=i586\r\n\t\t(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \\\r\n\t\t\t&& UNAME_MACHINE=i686\r\n\t\t(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \\\r\n\t\t\t&& UNAME_MACHINE=i686\r\n\t\techo ${UNAME_MACHINE}-pc-sco$UNAME_REL\r\n\telse\r\n\t\techo ${UNAME_MACHINE}-pc-sysv32\r\n\tfi\r\n\texit ;;\r\n    pc:*:*:*)\r\n\t# Left here for compatibility:\r\n        # uname -m prints for DJGPP always 'pc', but it prints nothing about\r\n        # the processor, so we play safe by assuming i586.\r\n\t# Note: whatever this is, it MUST be the same as what config.sub\r\n\t# prints for the \"djgpp\" host, or else GDB configury will decide that\r\n\t# this is a cross-build.\r\n\techo i586-pc-msdosdjgpp\r\n        exit ;;\r\n    Intel:Mach:3*:*)\r\n\techo i386-pc-mach3\r\n\texit ;;\r\n    paragon:*:*:*)\r\n\techo i860-intel-osf1\r\n\texit ;;\r\n    i860:*:4.*:*) # i860-SVR4\r\n\tif grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then\r\n\t  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4\r\n\telse # Add other i860-SVR4 vendors below as they are discovered.\r\n\t  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4\r\n\tfi\r\n\texit ;;\r\n    mini*:CTIX:SYS*5:*)\r\n\t# \"miniframe\"\r\n\techo m68010-convergent-sysv\r\n\texit ;;\r\n    mc68k:UNIX:SYSTEM5:3.51m)\r\n\techo m68k-convergent-sysv\r\n\texit ;;\r\n    M680?0:D-NIX:5.3:*)\r\n\techo m68k-diab-dnix\r\n\texit ;;\r\n    M68*:*:R3V[5678]*:*)\r\n\ttest -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;\r\n    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)\r\n\tOS_REL=''\r\n\ttest -r /etc/.relid \\\r\n\t&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \\([0-9][0-9]\\).*/\\1/p' < /etc/.relid`\r\n\t/bin/uname -p 2>/dev/null | grep 86 >/dev/null \\\r\n\t  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }\r\n\t/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \\\r\n\t  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;\r\n    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)\r\n        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \\\r\n          && { echo i486-ncr-sysv4; exit; } ;;\r\n    NCR*:*:4.2:* | MPRAS*:*:4.2:*)\r\n\tOS_REL='.3'\r\n\ttest -r /etc/.relid \\\r\n\t    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \\([0-9][0-9]\\).*/\\1/p' < /etc/.relid`\r\n\t/bin/uname -p 2>/dev/null | grep 86 >/dev/null \\\r\n\t    && { echo i486-ncr-sysv4.3${OS_REL}; exit; }\r\n\t/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \\\r\n\t    && { echo i586-ncr-sysv4.3${OS_REL}; exit; }\r\n\t/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \\\r\n\t    && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;\r\n    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)\r\n\techo m68k-unknown-lynxos${UNAME_RELEASE}\r\n\texit ;;\r\n    mc68030:UNIX_System_V:4.*:*)\r\n\techo m68k-atari-sysv4\r\n\texit ;;\r\n    TSUNAMI:LynxOS:2.*:*)\r\n\techo sparc-unknown-lynxos${UNAME_RELEASE}\r\n\texit ;;\r\n    rs6000:LynxOS:2.*:*)\r\n\techo rs6000-unknown-lynxos${UNAME_RELEASE}\r\n\texit ;;\r\n    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)\r\n\techo powerpc-unknown-lynxos${UNAME_RELEASE}\r\n\texit ;;\r\n    SM[BE]S:UNIX_SV:*:*)\r\n\techo mips-dde-sysv${UNAME_RELEASE}\r\n\texit ;;\r\n    RM*:ReliantUNIX-*:*:*)\r\n\techo mips-sni-sysv4\r\n\texit ;;\r\n    RM*:SINIX-*:*:*)\r\n\techo mips-sni-sysv4\r\n\texit ;;\r\n    *:SINIX-*:*:*)\r\n\tif uname -p 2>/dev/null >/dev/null ; then\r\n\t\tUNAME_MACHINE=`(uname -p) 2>/dev/null`\r\n\t\techo ${UNAME_MACHINE}-sni-sysv4\r\n\telse\r\n\t\techo ns32k-sni-sysv\r\n\tfi\r\n\texit ;;\r\n    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort\r\n                      # says <Richard.M.Bartel@ccMail.Census.GOV>\r\n        echo i586-unisys-sysv4\r\n        exit ;;\r\n    *:UNIX_System_V:4*:FTX*)\r\n\t# From Gerald Hewes <hewes@openmarket.com>.\r\n\t# How about differentiating between stratus architectures? -djm\r\n\techo hppa1.1-stratus-sysv4\r\n\texit ;;\r\n    *:*:*:FTX*)\r\n\t# From seanf@swdc.stratus.com.\r\n\techo i860-stratus-sysv4\r\n\texit ;;\r\n    i*86:VOS:*:*)\r\n\t# From Paul.Green@stratus.com.\r\n\techo ${UNAME_MACHINE}-stratus-vos\r\n\texit ;;\r\n    *:VOS:*:*)\r\n\t# From Paul.Green@stratus.com.\r\n\techo hppa1.1-stratus-vos\r\n\texit ;;\r\n    mc68*:A/UX:*:*)\r\n\techo m68k-apple-aux${UNAME_RELEASE}\r\n\texit ;;\r\n    news*:NEWS-OS:6*:*)\r\n\techo mips-sony-newsos6\r\n\texit ;;\r\n    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)\r\n\tif [ -d /usr/nec ]; then\r\n\t        echo mips-nec-sysv${UNAME_RELEASE}\r\n\telse\r\n\t        echo mips-unknown-sysv${UNAME_RELEASE}\r\n\tfi\r\n        exit ;;\r\n    BeBox:BeOS:*:*)\t# BeOS running on hardware made by Be, PPC only.\r\n\techo powerpc-be-beos\r\n\texit ;;\r\n    BeMac:BeOS:*:*)\t# BeOS running on Mac or Mac clone, PPC only.\r\n\techo powerpc-apple-beos\r\n\texit ;;\r\n    BePC:BeOS:*:*)\t# BeOS running on Intel PC compatible.\r\n\techo i586-pc-beos\r\n\texit ;;\r\n    BePC:Haiku:*:*)\t# Haiku running on Intel PC compatible.\r\n\techo i586-pc-haiku\r\n\texit ;;\r\n    SX-4:SUPER-UX:*:*)\r\n\techo sx4-nec-superux${UNAME_RELEASE}\r\n\texit ;;\r\n    SX-5:SUPER-UX:*:*)\r\n\techo sx5-nec-superux${UNAME_RELEASE}\r\n\texit ;;\r\n    SX-6:SUPER-UX:*:*)\r\n\techo sx6-nec-superux${UNAME_RELEASE}\r\n\texit ;;\r\n    SX-7:SUPER-UX:*:*)\r\n\techo sx7-nec-superux${UNAME_RELEASE}\r\n\texit ;;\r\n    SX-8:SUPER-UX:*:*)\r\n\techo sx8-nec-superux${UNAME_RELEASE}\r\n\texit ;;\r\n    SX-8R:SUPER-UX:*:*)\r\n\techo sx8r-nec-superux${UNAME_RELEASE}\r\n\texit ;;\r\n    Power*:Rhapsody:*:*)\r\n\techo powerpc-apple-rhapsody${UNAME_RELEASE}\r\n\texit ;;\r\n    *:Rhapsody:*:*)\r\n\techo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}\r\n\texit ;;\r\n    *:Darwin:*:*)\r\n\tUNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown\r\n\tcase $UNAME_PROCESSOR in\r\n\t    unknown) UNAME_PROCESSOR=powerpc ;;\r\n\tesac\r\n\techo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}\r\n\texit ;;\r\n    *:procnto*:*:* | *:QNX:[0123456789]*:*)\r\n\tUNAME_PROCESSOR=`uname -p`\r\n\tif test \"$UNAME_PROCESSOR\" = \"x86\"; then\r\n\t\tUNAME_PROCESSOR=i386\r\n\t\tUNAME_MACHINE=pc\r\n\tfi\r\n\techo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}\r\n\texit ;;\r\n    *:QNX:*:4*)\r\n\techo i386-pc-qnx\r\n\texit ;;\r\n    NSE-?:NONSTOP_KERNEL:*:*)\r\n\techo nse-tandem-nsk${UNAME_RELEASE}\r\n\texit ;;\r\n    NSR-?:NONSTOP_KERNEL:*:*)\r\n\techo nsr-tandem-nsk${UNAME_RELEASE}\r\n\texit ;;\r\n    *:NonStop-UX:*:*)\r\n\techo mips-compaq-nonstopux\r\n\texit ;;\r\n    BS2000:POSIX*:*:*)\r\n\techo bs2000-siemens-sysv\r\n\texit ;;\r\n    DS/*:UNIX_System_V:*:*)\r\n\techo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}\r\n\texit ;;\r\n    *:Plan9:*:*)\r\n\t# \"uname -m\" is not consistent, so use $cputype instead. 386\r\n\t# is converted to i386 for consistency with other x86\r\n\t# operating systems.\r\n\tif test \"$cputype\" = \"386\"; then\r\n\t    UNAME_MACHINE=i386\r\n\telse\r\n\t    UNAME_MACHINE=\"$cputype\"\r\n\tfi\r\n\techo ${UNAME_MACHINE}-unknown-plan9\r\n\texit ;;\r\n    *:TOPS-10:*:*)\r\n\techo pdp10-unknown-tops10\r\n\texit ;;\r\n    *:TENEX:*:*)\r\n\techo pdp10-unknown-tenex\r\n\texit ;;\r\n    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)\r\n\techo pdp10-dec-tops20\r\n\texit ;;\r\n    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)\r\n\techo pdp10-xkl-tops20\r\n\texit ;;\r\n    *:TOPS-20:*:*)\r\n\techo pdp10-unknown-tops20\r\n\texit ;;\r\n    *:ITS:*:*)\r\n\techo pdp10-unknown-its\r\n\texit ;;\r\n    SEI:*:*:SEIUX)\r\n        echo mips-sei-seiux${UNAME_RELEASE}\r\n\texit ;;\r\n    *:DragonFly:*:*)\r\n\techo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`\r\n\texit ;;\r\n    *:*VMS:*:*)\r\n    \tUNAME_MACHINE=`(uname -p) 2>/dev/null`\r\n\tcase \"${UNAME_MACHINE}\" in\r\n\t    A*) echo alpha-dec-vms ; exit ;;\r\n\t    I*) echo ia64-dec-vms ; exit ;;\r\n\t    V*) echo vax-dec-vms ; exit ;;\r\n\tesac ;;\r\n    *:XENIX:*:SysV)\r\n\techo i386-pc-xenix\r\n\texit ;;\r\n    i*86:skyos:*:*)\r\n\techo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'\r\n\texit ;;\r\n    i*86:rdos:*:*)\r\n\techo ${UNAME_MACHINE}-pc-rdos\r\n\texit ;;\r\n    i*86:AROS:*:*)\r\n\techo ${UNAME_MACHINE}-pc-aros\r\n\texit ;;\r\nesac\r\n\r\n#echo '(No uname command or uname output not recognized.)' 1>&2\r\n#echo \"${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}\" 1>&2\r\n\r\neval $set_cc_for_build\r\ncat >$dummy.c <<EOF\r\n#ifdef _SEQUENT_\r\n# include <sys/types.h>\r\n# include <sys/utsname.h>\r\n#endif\r\nmain ()\r\n{\r\n#if defined (sony)\r\n#if defined (MIPSEB)\r\n  /* BFD wants \"bsd\" instead of \"newsos\".  Perhaps BFD should be changed,\r\n     I don't know....  */\r\n  printf (\"mips-sony-bsd\\n\"); exit (0);\r\n#else\r\n#include <sys/param.h>\r\n  printf (\"m68k-sony-newsos%s\\n\",\r\n#ifdef NEWSOS4\r\n          \"4\"\r\n#else\r\n\t  \"\"\r\n#endif\r\n         ); exit (0);\r\n#endif\r\n#endif\r\n\r\n#if defined (__arm) && defined (__acorn) && defined (__unix)\r\n  printf (\"arm-acorn-riscix\\n\"); exit (0);\r\n#endif\r\n\r\n#if defined (hp300) && !defined (hpux)\r\n  printf (\"m68k-hp-bsd\\n\"); exit (0);\r\n#endif\r\n\r\n#if defined (NeXT)\r\n#if !defined (__ARCHITECTURE__)\r\n#define __ARCHITECTURE__ \"m68k\"\r\n#endif\r\n  int version;\r\n  version=`(hostinfo | sed -n 's/.*NeXT Mach \\([0-9]*\\).*/\\1/p') 2>/dev/null`;\r\n  if (version < 4)\r\n    printf (\"%s-next-nextstep%d\\n\", __ARCHITECTURE__, version);\r\n  else\r\n    printf (\"%s-next-openstep%d\\n\", __ARCHITECTURE__, version);\r\n  exit (0);\r\n#endif\r\n\r\n#if defined (MULTIMAX) || defined (n16)\r\n#if defined (UMAXV)\r\n  printf (\"ns32k-encore-sysv\\n\"); exit (0);\r\n#else\r\n#if defined (CMU)\r\n  printf (\"ns32k-encore-mach\\n\"); exit (0);\r\n#else\r\n  printf (\"ns32k-encore-bsd\\n\"); exit (0);\r\n#endif\r\n#endif\r\n#endif\r\n\r\n#if defined (__386BSD__)\r\n  printf (\"i386-pc-bsd\\n\"); exit (0);\r\n#endif\r\n\r\n#if defined (sequent)\r\n#if defined (i386)\r\n  printf (\"i386-sequent-dynix\\n\"); exit (0);\r\n#endif\r\n#if defined (ns32000)\r\n  printf (\"ns32k-sequent-dynix\\n\"); exit (0);\r\n#endif\r\n#endif\r\n\r\n#if defined (_SEQUENT_)\r\n    struct utsname un;\r\n\r\n    uname(&un);\r\n\r\n    if (strncmp(un.version, \"V2\", 2) == 0) {\r\n\tprintf (\"i386-sequent-ptx2\\n\"); exit (0);\r\n    }\r\n    if (strncmp(un.version, \"V1\", 2) == 0) { /* XXX is V1 correct? */\r\n\tprintf (\"i386-sequent-ptx1\\n\"); exit (0);\r\n    }\r\n    printf (\"i386-sequent-ptx\\n\"); exit (0);\r\n\r\n#endif\r\n\r\n#if defined (vax)\r\n# if !defined (ultrix)\r\n#  include <sys/param.h>\r\n#  if defined (BSD)\r\n#   if BSD == 43\r\n      printf (\"vax-dec-bsd4.3\\n\"); exit (0);\r\n#   else\r\n#    if BSD == 199006\r\n      printf (\"vax-dec-bsd4.3reno\\n\"); exit (0);\r\n#    else\r\n      printf (\"vax-dec-bsd\\n\"); exit (0);\r\n#    endif\r\n#   endif\r\n#  else\r\n    printf (\"vax-dec-bsd\\n\"); exit (0);\r\n#  endif\r\n# else\r\n    printf (\"vax-dec-ultrix\\n\"); exit (0);\r\n# endif\r\n#endif\r\n\r\n#if defined (alliant) && defined (i860)\r\n  printf (\"i860-alliant-bsd\\n\"); exit (0);\r\n#endif\r\n\r\n  exit (1);\r\n}\r\nEOF\r\n\r\n$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&\r\n\t{ echo \"$SYSTEM_NAME\"; exit; }\r\n\r\n# Apollos put the system type in the environment.\r\n\r\ntest -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }\r\n\r\n# Convex versions that predate uname can use getsysinfo(1)\r\n\r\nif [ -x /usr/convex/getsysinfo ]\r\nthen\r\n    case `getsysinfo -f cpu_type` in\r\n    c1*)\r\n\techo c1-convex-bsd\r\n\texit ;;\r\n    c2*)\r\n\tif getsysinfo -f scalar_acc\r\n\tthen echo c32-convex-bsd\r\n\telse echo c2-convex-bsd\r\n\tfi\r\n\texit ;;\r\n    c34*)\r\n\techo c34-convex-bsd\r\n\texit ;;\r\n    c38*)\r\n\techo c38-convex-bsd\r\n\texit ;;\r\n    c4*)\r\n\techo c4-convex-bsd\r\n\texit ;;\r\n    esac\r\nfi\r\n\r\ncat >&2 <<EOF\r\n$0: unable to guess system type\r\n\r\nThis script, last modified $timestamp, has failed to recognize\r\nthe operating system you are using. It is advised that you\r\ndownload the most up to date version of the config scripts from\r\n\r\n  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD\r\nand\r\n  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD\r\n\r\nIf the version you run ($0) is already up to date, please\r\nsend the following data and any information you think might be\r\npertinent to <config-patches@gnu.org> in order to provide the needed\r\ninformation to handle your system.\r\n\r\nconfig.guess timestamp = $timestamp\r\n\r\nuname -m = `(uname -m) 2>/dev/null || echo unknown`\r\nuname -r = `(uname -r) 2>/dev/null || echo unknown`\r\nuname -s = `(uname -s) 2>/dev/null || echo unknown`\r\nuname -v = `(uname -v) 2>/dev/null || echo unknown`\r\n\r\n/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`\r\n/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`\r\n\r\nhostinfo               = `(hostinfo) 2>/dev/null`\r\n/bin/universe          = `(/bin/universe) 2>/dev/null`\r\n/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`\r\n/bin/arch              = `(/bin/arch) 2>/dev/null`\r\n/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`\r\n/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`\r\n\r\nUNAME_MACHINE = ${UNAME_MACHINE}\r\nUNAME_RELEASE = ${UNAME_RELEASE}\r\nUNAME_SYSTEM  = ${UNAME_SYSTEM}\r\nUNAME_VERSION = ${UNAME_VERSION}\r\nEOF\r\n\r\nexit 1\r\n\r\n# Local variables:\r\n# eval: (add-hook 'write-file-hooks 'time-stamp)\r\n# time-stamp-start: \"timestamp='\"\r\n# time-stamp-format: \"%:y-%02m-%02d\"\r\n# time-stamp-end: \"'\"\r\n# End:\r\n"
  },
  {
    "path": "libs/glew/config/version",
    "content": "GLEW_MAJOR = 1\r\nGLEW_MINOR = 5\r\nGLEW_MICRO = 3\r\nGLEW_VERSION = $(GLEW_MAJOR).$(GLEW_MINOR).$(GLEW_MICRO)\r\nGLEW_NAME = GLEW\r\nSO_MAJOR = $(GLEW_MAJOR).$(GLEW_MINOR)\r\nSO_VERSION = $(GLEW_VERSION)\r\n"
  },
  {
    "path": "libs/glew/doc/advanced.html",
    "content": "<!-- begin header.html -->\r\n<!--\r\nThe OpenGL Extension Wrangler Library\r\nCopyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>\r\nCopyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>\r\nCopyright (C) 2002, Lev Povalahev\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without \r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n* Redistributions of source code must retain the above copyright notice, \r\n  this list of conditions and the following disclaimer.\r\n* Redistributions in binary form must reproduce the above copyright notice, \r\n  this list of conditions and the following disclaimer in the documentation \r\n  and/or other materials provided with the distribution.\r\n* The name of the author may be used to endorse or promote products \r\n  derived from this software without specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" \r\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE \r\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \r\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \r\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\r\nTHE POSSIBILITY OF SUCH DAMAGE.\r\n-->\r\n<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html/4/loose.dtd\">\r\n<!-- &nbsp;<img src=\"new.png\" height=\"12\" alt=\"NEW!\"> -->\r\n<html>\r\n<head>\r\n<title>GLEW: The OpenGL Extension Wrangler Library</title>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=US-ASCII\"> \r\n<link href=\"glew.css\" type=\"text/css\" rel=\"stylesheet\">\r\n</head>\r\n<body bgcolor=\"#fff0d0\">\r\n<table border=\"0\" width=\"100%\" cellpadding=\"12\" cellspacing=\"8\" style=\"height:100%\">\r\n<tr>\r\n<td bgcolor=\"#ffffff\" align=\"left\" valign=\"top\" width=\"200\">\r\n<table border=\"0\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" align=\"left\">\r\n<tr>\r\n<td valign=\"top\">\r\n\r\n<table border=\"0\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" align=\"left\">\r\n<tr><td align=\"center\"><i>Latest Release: <a href=\"https://sourceforge.net/projects/glew/files/glew/1.5.3/\">1.5.3</a></i></td></tr>\r\n<tr><td align=\"center\"><br></td></tr>\r\n<tr><td align=\"center\"><img src=\"./glew.png\" alt=\"GLEW Logo\" width=\"97\" height=\"75\"></td></tr>\r\n<tr><td align=\"center\"><br></td></tr>\r\n<tr><td align=\"center\">\r\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\">\r\n<tr><td align=\"center\"><a href=\"index.html\">Download</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"install.html\">Installation</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"basic.html\">Basic Usage</a></td></tr>\r\n<tr><td align=\"center\">Advanced Usage</td></tr>\r\n<tr><td align=\"center\"><a href=\"credits.html\">Credits & Copyright</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"log.html\">Change Log</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"http://sourceforge.net/projects/glew/\">Project Page</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"https://sourceforge.net/mail/?group_id=67586\">Mailing Lists</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"http://sourceforge.net/tracker/?group_id=67586\">Bug Tracker</a></td></tr>\r\n</table>\r\n<tr><td align=\"center\"><br></tr>\r\n</table>\r\n</td>\r\n</tr>\r\n<tr>\r\n\r\n<td valign=\"bottom\">\r\n<table border=\"0\" width=\"100%\" cellpadding=\"5\" cellspacing=\"0\" align=\"left\">\r\n<tr><td align=\"center\"><i>Last Update: 02-28-09</i></td></tr>\r\n<tr><td align=\"center\">\r\n<a href=\"http://www.opengl.org\"> <img src=\"./ogl_sm.jpg\" width=\"68\"\r\nheight=\"35\" border=\"0\" alt=\"OpenGL Logo\"></a>\r\n<a href=\"http://sourceforge.net\"> <img\r\nsrc=\"http://sourceforge.net/sflogo.php?group_id=67586&amp;type=1\"\r\nwidth=\"88\" height=\"31\" border=\"0\" alt=\"SourceForge Logo\"></a>\r\n</td>\r\n</tr>\r\n<!--- <tr><td align=\"center\"><a\r\nhref=\"http://sourceforge.net/donate/index.php?group_id=67586\"><img\r\nsrc=\"http://images.sourceforge.net/images/project-support.jpg\"\r\nwidth=\"88\" height=\"32\" border=\"0\" alt=\"Support This Project\"></a></td></tr> -->\r\n</table>\r\n</td>\r\n</tr>\r\n</table>\r\n</td>\r\n\r\n<td bgcolor=\"#ffffff\" align=\"left\" valign=\"top\">\r\n\r\n<h1>The OpenGL Extension Wrangler Library</h1>\r\n\r\n<!-- end header.html -->\r\n\r\n\r\n<h2>Automatic Code Generation</h2>\r\n\r\n<p>\r\nStarting from release 1.1.0, the source code and parts of the\r\ndocumentation are automatically generated from the extension\r\nspecifications in a two-step process.  In the first step,\r\nspecification files from the OpenGL registry are downloaded and\r\nparsed. Skeleton descriptors are created for each extension.  These\r\ndescriptors contain all necessary information for creating the source\r\ncode and documentation in a simple and compact format, including the\r\nname of the extension, url link to the specification, tokens, function\r\ndeclarations, typedefs and struct definitions.  In the second step,\r\nthe header files as well as the library and glewinfo source are\r\ngenerated from the descriptor files.  The code generation scripts are\r\nlocated in the <tt>auto</tt> subdirectory.\r\n</p>\r\n\r\n<p>\r\nThe code generation scripts require GNU make, wget, and perl. On\r\nWindows, the simplest way to get access to these tools is to install\r\n<a href=\"http://www.cygwin.com/\">Cygwin</a>, but make sure that the\r\nroot directory is mounted in binary mode. The makefile in the\r\n<tt>auto</tt> directory provides the following build targets:\r\n</p>\r\n\r\n<center>\r\n<table border=0 cellpadding=0 cellspacing=0> <!-- bgcolor=\"#f0f0f0\" -->\r\n<tr><td align=\"right\" valign=\"top\" width=\"25%\"><tt>make</tt></td>\r\n<td>&nbsp;&nbsp;&nbsp;&nbsp;</td>\r\n<td align=left>Create the source files from the descriptors. If the\r\ndescriptors do not exist, create them from the spec files. If the spec\r\nfiles do not exist, download them from the OpenGL repository.</td></tr>\r\n<tr><td align=\"right\" valign=\"top\"><tt>make clean</tt></td>\r\n<td>&nbsp;&nbsp;&nbsp;&nbsp;</td>\r\n<td align=left>Delete the source files.</td></tr>\r\n<tr><td align=\"right\" valign=\"top\"><tt>make clobber</tt></td>\r\n<td>&nbsp;&nbsp;&nbsp;&nbsp;</td>\r\n<td align=left>Delete the source files and the descriptors.</td></tr>\r\n<tr><td align=\"right\" valign=\"top\"><tt>make destroy</tt></td>\r\n<td>&nbsp;&nbsp;&nbsp;&nbsp;</td>\r\n<td align=left>Delete the source files, the descriptors, and the spec files.</td></tr>\r\n<tr><td align=\"right\" valign=\"top\"><tt>make custom</tt></td>\r\n<td>&nbsp;&nbsp;&nbsp;&nbsp;</td>\r\n<td align=left>Create the source files for the extensions\r\nlisted in <tt>auto/custom.txt</tt>. See \"Custom Code\r\nGeneration\" below for more details.</td></tr>\r\n</table>\r\n</center>\r\n\r\n<h3>Adding a New Extension</h3>\r\n\r\n<p>\r\nTo add a new extension, create a descriptor file for the extension in\r\n<tt>auto/core</tt> and rerun the code generation scripts by typing\r\n<tt>make clean; make</tt> in the <tt>auto</tt> directory.\r\n</p>\r\n\r\n<p>\r\nThe format of the descriptor file is given below. Items in\r\nbrackets are optional.\r\n</p>\r\n\r\n<p class=\"pre\">\r\n&lt;Extension Name&gt;<br>\r\n[&lt;URL of Specification File&gt;]<br>\r\n&nbsp;&nbsp;&nbsp;&nbsp;[&lt;Token Name&gt; &lt;Token Value&gt;]<br>\r\n&nbsp;&nbsp;&nbsp;&nbsp;[&lt;Token Name&gt; &lt;Token Value&gt;]<br>\r\n&nbsp;&nbsp;&nbsp;&nbsp;...<br>\r\n&nbsp;&nbsp;&nbsp;&nbsp;[&lt;Typedef&gt;]<br>\r\n&nbsp;&nbsp;&nbsp;&nbsp;[&lt;Typedef&gt;]<br>\r\n&nbsp;&nbsp;&nbsp;&nbsp;...<br>\r\n&nbsp;&nbsp;&nbsp;&nbsp;[&lt;Function Signature&gt;]<br>\r\n&nbsp;&nbsp;&nbsp;&nbsp;[&lt;Function Signature&gt;]<br>\r\n&nbsp;&nbsp;&nbsp;&nbsp;...<br>\r\n<!-- &nbsp;&nbsp;&nbsp;&nbsp;[&lt;Function Definition&gt;]<br>\r\n&nbsp;&nbsp;&nbsp;&nbsp;[&lt;Function Definition&gt;]<br>\r\n&nbsp;&nbsp;&nbsp;&nbsp;...<br> -->\r\n</p>\r\n\r\n<!--\r\n<p>\r\nNote that <tt>Function Definitions</tt> are copied to the header files\r\nwithout changes and have to be terminated with a semicolon. In\r\ncontrast, <tt>Tokens</tt>, <tt>Function signatures</tt>, and\r\n<tt>Typedefs</tt> should not be terminated with a semicolon.\r\n</p>\r\n-->\r\n\r\n<p>\r\nTake a look at one of the files in <tt>auto/core</tt> for an\r\nexample. Note that typedefs and function signatures should not be\r\nterminated with a semicolon.\r\n</p>\r\n\r\n<h3>Custom Code Generation</h3>\r\n<p>\r\nStarting from GLEW 1.3.0, it is possible to control which extensions\r\nto include in the libarary by specifying a list in\r\n<tt>auto/custom.txt</tt>. This is useful when you do not need all the\r\nextensions and would like to reduce the size of the source files.\r\nType <tt>make clean; make custom</tt> in the <tt>auto</tt> directory\r\nto rerun the scripts with the custom list of extensions.\r\n</p>\r\n\r\n<p>\r\nFor example, the following is the list of extensions needed to get GLEW and the\r\nutilities to compile.\r\n</p>\r\n\r\n<p class=\"pre\">\r\nWGL_ARB_extensions_string<br>\r\nWGL_ARB_multisample<br>\r\nWGL_ARB_pixel_format<br>\r\nWGL_ARB_pbuffer<br>\r\nWGL_EXT_extensions_string<br>\r\nWGL_ATI_pixel_format_float<br>\r\nWGL_NV_float_buffer<br>\r\n</p>\r\n\r\n<h2>Multiple Rendering Contexts (GLEW MX)</h2>\r\n\r\n<p>Starting with release 1.2.0, thread-safe support for multiple\r\nrendering contexts, possibly with different capabilities, is\r\navailable. Since this is not required by most users, it is not added\r\nto the binary releases to maintain compatibility between different\r\nversions. To include multi-context support, you have to do the\r\nfollowing:</p>\r\n<ol>\r\n<li>Compile and use GLEW with the <tt>GLEW_MX</tt> preprocessor token\r\ndefined.</li>\r\n<li>For each rendering context, create a <tt>GLEWContext</tt> object\r\nthat will be available as long as the rendering context exists.</li>\r\n<li>Define a macro or function called <tt>glewGetContext()</tt> that\r\nreturns a pointer to the <tt>GLEWContext</tt> object associated with\r\nthe rendering context from which OpenGL/WGL/GLX calls are issued. This\r\ndispatch mechanism is primitive, but generic.\r\n<li>Make sure that you call <tt>glewInit()</tt> after creating the\r\n<tt>GLEWContext</tt> object in each rendering context.  Note, that the\r\n<tt>GLEWContext</tt> pointer returned by <tt>glewGetContext()</tt> has\r\nto reside in global or thread-local memory.\r\n</ol>\r\n\r\n<p>Note that according to the <a\r\nhref=\"http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/ntopnglr_6yer.asp\">MSDN\r\nWGL documentation</a>, you have to initialize the entry points for\r\nevery rendering context that use pixel formats with different\r\ncapabilities For example, the pixel formats provided by the generic\r\nsoftware OpenGL implementation by Microsoft vs. the hardware\r\naccelerated pixel formats have different capabilities.  <b>GLEW by\r\ndefault ignores this requirement, and does not define per-context\r\nentry points (you can however do this using the steps described\r\nabove).</b> Assuming a global namespace for the entry points works in\r\nmost situations, because typically all hardware accelerated pixel\r\nformats provide the same entry points and capabilities. This means\r\nthat unless you use the multi-context version of GLEW, you need to\r\ncall <tt>glewInit()</tt> only once in your program, or more precisely,\r\nonce per process.</p>\r\n\r\n<h2>Separate Namespace</h2>\r\n\r\n<p>\r\nTo avoid name clashes when linking with libraries that include the\r\nsame symbols, extension entry points are declared in a separate\r\nnamespace (release 1.1.0 and up). This is achieved by aliasing OpenGL\r\nfunction names to their GLEW equivalents. For instance,\r\n<tt>glFancyFunction</tt> is simply an alias to\r\n<tt>glewFancyFunction</tt>.  The separate namespace does not effect\r\ntoken and function pointer definitions.\r\n</p>\r\n\r\n<h2>Known Issues</h2>\r\n\r\n<p>\r\nGLEW requires GLX 1.2 for compatibility with GLUT.\r\n</p>\r\n\r\n<!-- begin footer.html -->\r\n</td></tr></table></body>\r\n<!-- end footer.html -->\r\n\r\n"
  },
  {
    "path": "libs/glew/doc/basic.html",
    "content": "<!-- begin header.html -->\r\n<!--\r\nThe OpenGL Extension Wrangler Library\r\nCopyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>\r\nCopyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>\r\nCopyright (C) 2002, Lev Povalahev\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without \r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n* Redistributions of source code must retain the above copyright notice, \r\n  this list of conditions and the following disclaimer.\r\n* Redistributions in binary form must reproduce the above copyright notice, \r\n  this list of conditions and the following disclaimer in the documentation \r\n  and/or other materials provided with the distribution.\r\n* The name of the author may be used to endorse or promote products \r\n  derived from this software without specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" \r\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE \r\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \r\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \r\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\r\nTHE POSSIBILITY OF SUCH DAMAGE.\r\n-->\r\n<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html/4/loose.dtd\">\r\n<!-- &nbsp;<img src=\"new.png\" height=\"12\" alt=\"NEW!\"> -->\r\n<html>\r\n<head>\r\n<title>GLEW: The OpenGL Extension Wrangler Library</title>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=US-ASCII\"> \r\n<link href=\"glew.css\" type=\"text/css\" rel=\"stylesheet\">\r\n</head>\r\n<body bgcolor=\"#fff0d0\">\r\n<table border=\"0\" width=\"100%\" cellpadding=\"12\" cellspacing=\"8\" style=\"height:100%\">\r\n<tr>\r\n<td bgcolor=\"#ffffff\" align=\"left\" valign=\"top\" width=\"200\">\r\n<table border=\"0\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" align=\"left\">\r\n<tr>\r\n<td valign=\"top\">\r\n\r\n<table border=\"0\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" align=\"left\">\r\n<tr><td align=\"center\"><i>Latest Release: <a href=\"https://sourceforge.net/projects/glew/files/glew/1.5.3/\">1.5.3</a></i></td></tr>\r\n<tr><td align=\"center\"><br></td></tr>\r\n<tr><td align=\"center\"><img src=\"./glew.png\" alt=\"GLEW Logo\" width=\"97\" height=\"75\"></td></tr>\r\n<tr><td align=\"center\"><br></td></tr>\r\n<tr><td align=\"center\">\r\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\">\r\n<tr><td align=\"center\"><a href=\"index.html\">Download</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"install.html\">Installation</a></td></tr>\r\n<tr><td align=\"center\">Basic Usage</td></tr>\r\n<tr><td align=\"center\"><a href=\"advanced.html\">Advanced Usage</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"credits.html\">Credits & Copyright</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"log.html\">Change Log</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"http://sourceforge.net/projects/glew/\">Project Page</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"https://sourceforge.net/mail/?group_id=67586\">Mailing Lists</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"http://sourceforge.net/tracker/?group_id=67586\">Bug Tracker</a></td></tr>\r\n</table>\r\n<tr><td align=\"center\"><br></tr>\r\n</table>\r\n</td>\r\n</tr>\r\n<tr>\r\n\r\n<td valign=\"bottom\">\r\n<table border=\"0\" width=\"100%\" cellpadding=\"5\" cellspacing=\"0\" align=\"left\">\r\n<tr><td align=\"center\"><i>Last Update: 02-28-09</i></td></tr>\r\n<tr><td align=\"center\">\r\n<a href=\"http://www.opengl.org\"> <img src=\"./ogl_sm.jpg\" width=\"68\"\r\nheight=\"35\" border=\"0\" alt=\"OpenGL Logo\"></a>\r\n<a href=\"http://sourceforge.net\"> <img\r\nsrc=\"http://sourceforge.net/sflogo.php?group_id=67586&amp;type=1\"\r\nwidth=\"88\" height=\"31\" border=\"0\" alt=\"SourceForge Logo\"></a>\r\n</td>\r\n</tr>\r\n<!--- <tr><td align=\"center\"><a\r\nhref=\"http://sourceforge.net/donate/index.php?group_id=67586\"><img\r\nsrc=\"http://images.sourceforge.net/images/project-support.jpg\"\r\nwidth=\"88\" height=\"32\" border=\"0\" alt=\"Support This Project\"></a></td></tr> -->\r\n</table>\r\n</td>\r\n</tr>\r\n</table>\r\n</td>\r\n\r\n<td bgcolor=\"#ffffff\" align=\"left\" valign=\"top\">\r\n\r\n<h1>The OpenGL Extension Wrangler Library</h1>\r\n\r\n<!-- end header.html -->\r\n\r\n\r\n<h2>Initializing GLEW</h2>\r\n<p>\r\nFirst you need to create a valid OpenGL rendering context and call\r\n<tt>glewInit()</tt> to initialize the extension entry points.  If\r\n<tt>glewInit()</tt> returns <tt>GLEW_OK</tt>, the initialization\r\nsucceeded and you can use the available extensions as well as core\r\nOpenGL functionality. For example:\r\n</p>\r\n\r\n<p class=\"pre\">\r\n#include &lt;GL/glew.h&gt;<br>\r\n#include &lt;GL/glut.h&gt;<br>\r\n...<br>\r\nglutInit(&amp;argc, argv);<br>\r\nglutCreateWindow(\"GLEW Test\");<br>\r\nGLenum err = glewInit();<br>\r\nif (GLEW_OK != err)<br>\r\n{<br>\r\n&nbsp;&nbsp;/* Problem: glewInit failed, something is seriously wrong. */<br>\r\n&nbsp;&nbsp;fprintf(stderr, \"Error: %s\\n\", glewGetErrorString(err));<br>\r\n&nbsp;&nbsp;...<br>\r\n}<br>\r\nfprintf(stdout, \"Status: Using GLEW %s\\n\", glewGetString(GLEW_VERSION));<br>\r\n</p>\r\n\r\n<h2>Checking for Extensions</h2>\r\n\r\n<p>\r\nStarting from GLEW 1.1.0, you can find out if a particular extension\r\nis available on your platform by querying globally defined variables\r\nof the form <tt>GLEW_{extension_name}</tt>:\r\n</p>\r\n\r\n<p class=\"pre\">\r\nif (GLEW_ARB_vertex_program)<br>\r\n{<br>\r\n&nbsp;&nbsp;/* It is safe to use the ARB_vertex_program extension here. */<br>\r\n&nbsp;&nbsp;glGenProgramsARB(...);<br>\r\n}<br>\r\n</p>\r\n\r\n<p>\r\n<b>In GLEW 1.0.x, a global structure was used for this task. To ensure\r\nbinary compatibility between releases, the struct was replaced with a\r\nset of variables.</b>\r\n</p>\r\n\r\n<p>\r\nYou can also check for core OpenGL functionality.  For example, to\r\nsee if OpenGL 1.3 is supported, do the following:\r\n</p>\r\n\r\n<p class=\"pre\">\r\nif (GLEW_VERSION_1_3)<br>\r\n{<br>\r\n&nbsp;&nbsp;/* Yay! OpenGL 1.3 is supported! */<br>\r\n}<br>\r\n</p>\r\n\r\n<p>\r\nIn general, you can check if <tt>GLEW_{extension_name}</tt> or\r\n<tt>GLEW_VERSION_{version}</tt> is true or false.\r\n</p>\r\n\r\n<p>\r\nIt is also possible to perform extension checks from string\r\ninput. Starting from the 1.3.0 release, use <tt>glewIsSupported</tt>\r\nto check if the required core or extension functionality is\r\navailable:\r\n</p>\r\n\r\n<p class=\"pre\">\r\nif (glewIsSupported(\"GL_VERSION_1_4&nbsp;&nbsp;GL_ARB_point_sprite\"))<br>\r\n{<br>\r\n&nbsp;&nbsp;/* Great, we have OpenGL 1.4 + point sprites. */<br>\r\n}<br>\r\n</p>\r\n\r\n<p>\r\nFor extensions only, <tt>glewGetExtension</tt> provides a slower alternative\r\n(GLEW 1.0.x-1.2.x). <b>Note that in the 1.3.0 release </b>\r\n<tt>glewGetExtension</tt> <b>was replaced with </b>\r\n<tt>glewIsSupported</tt>.\r\n</p>\r\n\r\n<p class=\"pre\">\r\nif (glewGetExtension(\"GL_ARB_fragment_program\"))<br>\r\n{<br>\r\n&nbsp;&nbsp;/* Looks like ARB_fragment_program is supported. */<br>\r\n}<br>\r\n</p>\r\n\r\n<h2>Experimental Drivers</h2>\r\n\r\n<p>\r\nGLEW obtains information on the supported extensions from the graphics\r\ndriver.  Experimental or pre-release drivers, however, might not\r\nreport every available extension through the standard mechanism, in\r\nwhich case GLEW will report it unsupported.  To circumvent this\r\nsituation, the <tt>glewExperimental</tt> global switch can be turned\r\non by setting it to <tt>GL_TRUE</tt> before calling\r\n<tt>glewInit()</tt>, which ensures that all extensions with valid\r\nentry points will be exposed.\r\n</p>\r\n\r\n<h2>Platform Specific Extensions</h2>\r\n\r\n<p>\r\nPlatform specific extensions are separated into two header files:\r\n<tt>wglew.h</tt> and <tt>glxew.h</tt>, which define the available\r\n<tt>WGL</tt> and <tt>GLX</tt> extensions.  To determine if a certain\r\nextension is supported, query <tt>WGLEW_{extension name}</tt> or\r\n<tt>GLXEW_{extension_name}</tt>.  For example:\r\n</p>\r\n\r\n<p class=\"pre\">\r\n#include &lt;GL/wglew.h&gt;<br>\r\n<br>\r\nif (WGLEW_ARB_pbuffer)<br>\r\n{<br>\r\n&nbsp;&nbsp;/* OK, we can use pbuffers. */<br>\r\n}<br>\r\nelse<br>\r\n{<br>\r\n&nbsp;&nbsp;/* Sorry, pbuffers will not work on this platform. */<br>\r\n}<br>\r\n</p>\r\n\r\n<p>\r\nAlternatively, use <tt>wglewIsSupported</tt> or\r\n<tt>glxewIsSupported</tt> to check for extensions from a string:\r\n</p>\r\n\r\n<p class=\"pre\">\r\nif (wglewIsSupported(\"WGL_ARB_pbuffer\"))<br>\r\n{<br>\r\n&nbsp;&nbsp;/* OK, we can use pbuffers. */<br>\r\n}<br>\r\n</p>\r\n\r\n<h2>Utilities</h2>\r\n\r\n<p>\r\nGLEW provides two command-line utilities: one for creating a list of\r\navailable extensions and visuals; and another for verifying extension\r\nentry points.\r\n</p>\r\n\r\n<h3>visualinfo: extensions and visuals</h3>\r\n\r\n<p>\r\n<tt>visualinfo</tt> is an extended version of <tt>glxinfo</tt>. The\r\nWindows version creates a file called <tt>visualinfo.txt</tt>, which\r\ncontains a list of available OpenGL, WGL, and GLU extensions as well\r\nas a table of visuals aka. pixel formats. Pbuffer and MRT capable\r\nvisuals are also included. For additional usage information, type\r\n<tt>visualinfo -h</tt>.\r\n</p>\r\n\r\n<h3>glewinfo: extension verification utility</h3>\r\n\r\n<p>\r\n<tt>glewinfo</tt> allows you to verify the entry points for the\r\nextensions supported on your platform. The Windows version\r\nreports the results to a text file called <tt>glewinfo.txt</tt>. The\r\nUnix version prints the results to <tt>stdout</tt>.\r\n</p>\r\n\r\n<p>Windows usage:</p>\r\n <blockquote><pre>glewinfo [-pf &lt;id&gt;]</pre></blockquote>\r\n\r\n<p>where <tt>&lt;id&gt;</tt> is the pixel format id for which the\r\ncapabilities are displayed.</p>\r\n\r\n<p>Unix usage:</p>\r\n<blockquote><pre>glewinfo [-display &lt;dpy&gt;] [-visual &lt;id&gt;]</pre></blockquote>\r\n\r\n<p>where <tt>&lt;dpy&gt;</tt> is the X11 display and <tt>&lt;id&gt;</tt> is\r\nthe visual id for which the capabilities are displayed.</p>\r\n\r\n<!-- begin footer.html -->\r\n</td></tr></table></body>\r\n<!-- end footer.html -->\r\n\r\n"
  },
  {
    "path": "libs/glew/doc/credits.html",
    "content": "<!-- begin header.html -->\r\n<!--\r\nThe OpenGL Extension Wrangler Library\r\nCopyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>\r\nCopyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>\r\nCopyright (C) 2002, Lev Povalahev\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without \r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n* Redistributions of source code must retain the above copyright notice, \r\n  this list of conditions and the following disclaimer.\r\n* Redistributions in binary form must reproduce the above copyright notice, \r\n  this list of conditions and the following disclaimer in the documentation \r\n  and/or other materials provided with the distribution.\r\n* The name of the author may be used to endorse or promote products \r\n  derived from this software without specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" \r\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE \r\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \r\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \r\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\r\nTHE POSSIBILITY OF SUCH DAMAGE.\r\n-->\r\n<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html/4/loose.dtd\">\r\n<!-- &nbsp;<img src=\"new.png\" height=\"12\" alt=\"NEW!\"> -->\r\n<html>\r\n<head>\r\n<title>GLEW: The OpenGL Extension Wrangler Library</title>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=US-ASCII\"> \r\n<link href=\"glew.css\" type=\"text/css\" rel=\"stylesheet\">\r\n</head>\r\n<body bgcolor=\"#fff0d0\">\r\n<table border=\"0\" width=\"100%\" cellpadding=\"12\" cellspacing=\"8\" style=\"height:100%\">\r\n<tr>\r\n<td bgcolor=\"#ffffff\" align=\"left\" valign=\"top\" width=\"200\">\r\n<table border=\"0\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" align=\"left\">\r\n<tr>\r\n<td valign=\"top\">\r\n\r\n<table border=\"0\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" align=\"left\">\r\n<tr><td align=\"center\"><i>Latest Release: <a href=\"https://sourceforge.net/projects/glew/files/glew/1.5.3/\">1.5.3</a></i></td></tr>\r\n<tr><td align=\"center\"><br></td></tr>\r\n<tr><td align=\"center\"><img src=\"./glew.png\" alt=\"GLEW Logo\" width=\"97\" height=\"75\"></td></tr>\r\n<tr><td align=\"center\"><br></td></tr>\r\n<tr><td align=\"center\">\r\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\">\r\n<tr><td align=\"center\"><a href=\"index.html\">Download</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"install.html\">Installation</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"basic.html\">Basic Usage</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"advanced.html\">Advanced Usage</a></td></tr>\r\n<tr><td align=\"center\">Credits & Copyright</td></tr>\r\n<tr><td align=\"center\"><a href=\"log.html\">Change Log</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"http://sourceforge.net/projects/glew/\">Project Page</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"https://sourceforge.net/mail/?group_id=67586\">Mailing Lists</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"http://sourceforge.net/tracker/?group_id=67586\">Bug Tracker</a></td></tr>\r\n</table>\r\n<tr><td align=\"center\"><br></tr>\r\n</table>\r\n</td>\r\n</tr>\r\n<tr>\r\n\r\n<td valign=\"bottom\">\r\n<table border=\"0\" width=\"100%\" cellpadding=\"5\" cellspacing=\"0\" align=\"left\">\r\n<tr><td align=\"center\"><i>Last Update: 02-28-09</i></td></tr>\r\n<tr><td align=\"center\">\r\n<a href=\"http://www.opengl.org\"> <img src=\"./ogl_sm.jpg\" width=\"68\"\r\nheight=\"35\" border=\"0\" alt=\"OpenGL Logo\"></a>\r\n<a href=\"http://sourceforge.net\"> <img\r\nsrc=\"http://sourceforge.net/sflogo.php?group_id=67586&amp;type=1\"\r\nwidth=\"88\" height=\"31\" border=\"0\" alt=\"SourceForge Logo\"></a>\r\n</td>\r\n</tr>\r\n<!--- <tr><td align=\"center\"><a\r\nhref=\"http://sourceforge.net/donate/index.php?group_id=67586\"><img\r\nsrc=\"http://images.sourceforge.net/images/project-support.jpg\"\r\nwidth=\"88\" height=\"32\" border=\"0\" alt=\"Support This Project\"></a></td></tr> -->\r\n</table>\r\n</td>\r\n</tr>\r\n</table>\r\n</td>\r\n\r\n<td bgcolor=\"#ffffff\" align=\"left\" valign=\"top\">\r\n\r\n<h1>The OpenGL Extension Wrangler Library</h1>\r\n\r\n<!-- end header.html -->\r\n\r\n\r\n<h2>Credits</h2>\r\n\r\n<p>\r\nGLEW was developed by <a href=\"http://www.cs.utah.edu/~ikits/\">Milan\r\nIkits</a> and <a\r\nhref=\"http://wwwvis.informatik.uni-stuttgart.de/~magallon/\">Marcelo\r\nMagallon</a>.  They also perform occasional maintainance to make sure\r\nthat GLEW stays in mint condition.  Aaron Lefohn, Joe Kniss, and Chris\r\nWyman were the first users and also assisted with the design and\r\ndebugging process.  The acronym GLEW originates from Aaron Lefohn.\r\nPasi K&auml;rkk&auml;inen identified and fixed several problems with\r\nGLX and SDL.  Nate Robins created the <tt>wglinfo</tt> utility, to\r\nwhich modifications were made by Michael Wimmer.  \r\n</p>\r\n\r\n<h2>Copyright</h2>\r\n\r\n<p>\r\nGLEW is originally derived from the EXTGL project by Lev Povalahev.\r\nThe source code is licensed under the <a href=\"glew.txt\">Modified BSD\r\nLicense</a>, the <a href=\"mesa.txt\">Mesa 3-D License</a> (MIT\r\nLicense), and the <a href=\"khronos.txt\">Khronos License</a> (MIT\r\nLicense).  The automatic code generation scripts are released under\r\nthe <a href=\"gpl.txt\">GNU GPL</a>.\r\n</p>\r\n<!-- begin footer.html -->\r\n</td></tr></table></body>\r\n<!-- end footer.html -->\r\n\r\n"
  },
  {
    "path": "libs/glew/doc/glew.css",
    "content": "h1 \r\n{   \r\n  color: black;\r\n  font: 23px \"Verdana\", \"Arial\", \"Helvetica\", sans-serif;\r\n  font-weight: bold;\r\n  text-align: center;\r\n  margin-top: 12px;\r\n  margin-bottom: 18px;\r\n}\r\n\r\nh2\r\n{   \r\n  color: black;\r\n  font: 18px \"Verdana\", \"Arial\", \"Helvetica\", sans-serif;\r\n  font-weight: bold;\r\n  text-align: left;\r\n  padding-top: 0px;\r\n  padding-bottom: 0px;\r\n  margin-top: 18px;\r\n  margin-bottom: 12px;\r\n}\r\n\r\nh3\r\n{   \r\n  color: black;\r\n  font: 17px \"Verdana\", \"Arial\", \"Helvetica\", sans-serif;\r\n  text-align: left;\r\n  padding-top: 0px;\r\n  padding-bottom: 0px;\r\n  margin-top: 12px;\r\n  margin-bottom: 12px;\r\n}\r\n\r\nsmall\r\n{\r\n  font: 8pt \"Verdana\", \"Arial\", \"Helvetica\", sans-serif;\r\n}\r\n\r\nbody\r\n{\r\n  color: black;\r\n  font: 10pt \"Verdana\", \"Arial\", \"Helvetica\", sans-serif;\r\n  text-align: left;\r\n}\r\n\r\ntd\r\n{\r\n  color: black;\r\n  font: 10pt \"Verdana\", \"Arial\", \"Helvetica\", sans-serif;\r\n}\r\n\r\ntt\r\n{\r\n  color: rgb(0,120,0);\r\n}\r\n/* color: maroon; */\r\n\r\ntd.num\r\n{\r\n  color: lightgrey;\r\n  font: 10pt \"Verdana\", \"Arial\", \"Helvetica\", sans-serif;\r\n  text-align: right;\r\n}\r\n\r\nblockquote\r\n{\r\n  color: rgb(0,120,0);\r\n  background: #f0f0f0;\r\n  text-align: left;\r\n  margin-left: 40px;\r\n  margin-right: 40px;\r\n  margin-bottom: 6px;\r\n  padding-bottom: 0px;\r\n  margin-top: 0px;\r\n  padding-top: 0px;\r\n  border-top: 0px;\r\n  border-width: 0px;\r\n}\r\n\r\npre\r\n{\r\n  color: rgb(0,120,0);\r\n  background: #f0f0f0;\r\n  text-align: left;\r\n  margin-left: 40px;\r\n  margin-right: 40px;\r\n  margin-bottom: 6px;\r\n  padding-bottom: 0px;\r\n  margin-top: 0px;\r\n  padding-top: 0px;\r\n  border-top: 0px;\r\n  border-width: 0px;\r\n}\r\n\r\np\r\n{ \r\n  color: black;\r\n  font: 10pt \"Verdana\", \"Arial\", \"Helvetica\", sans-serif;\r\n  text-align: left;\r\n  margin-bottom: 0px;\r\n  padding-bottom: 6px;\r\n  margin-top: 0px;\r\n  padding-top: 0px;\r\n}\r\n\r\np.right\r\n{ \r\n  color: black;\r\n  font: 10pt \"Verdana\", \"Arial\", \"Helvetica\", sans-serif;\r\n  text-align: right;\r\n  margin-bottom: 0px;\r\n  padding-bottom: 6px;\r\n  margin-top: 0px;\r\n  padding-top: 0px;\r\n}\r\n\r\np.pre\r\n{\r\n  color: rgb(0,120,0);\r\n  font: 10pt \"Courier New\", \"Courier\", monospace;\r\n  background: #f0f0f0;\r\n  text-align: left;\r\n  margin-top: 0px;\r\n  margin-bottom: 6px;\r\n  margin-left: 40px;\r\n  margin-right: 40px;\r\n  padding-top: 0px;\r\n  padding-bottom: 6px;\r\n  padding-left: 6px;\r\n  padding-right: 6px;\r\n  border-top: 0px;\r\n  border-width: 0px;\r\n}\r\n\r\na:link\r\n{    \r\n  color: rgb(0,0,139);\r\n  text-decoration: none;\r\n}\r\n\r\na:visited\r\n{    \r\n  color: rgb(220,20,60);\r\n  text-decoration: none;\r\n}\r\n\r\na:hover\r\n{    \r\n  color: rgb(220,20,60);\r\n  text-decoration: underline;\r\n  background: \"#e8e8e8\";\r\n}\r\n\r\nul\r\n{\r\n  list-style-type: disc;\r\n  text-align: left;\r\n  margin-left: 40px;\r\n  margin-top: 0px;\r\n  padding-top: 0px;\r\n  margin-bottom: 0px;\r\n  padding-bottom: 3px;\r\n}\r\n\r\nul.none\r\n{\r\n  list-style-type: none;\r\n}\r\n\r\nol\r\n{\r\n  text-align: left;\r\n  margin-left: 40px;\r\n  margin-top: 0px;\r\n  padding-top: 0px;\r\n  margin-bottom: 0px;\r\n  padding-bottom: 12px;\r\n}\r\n\r\nhr\r\n{\r\n  color: maroon;\r\n  background-color: maroon;\r\n  height: 1px;\r\n  border: 0px;\r\n  width: 80%;\r\n}\r\n"
  },
  {
    "path": "libs/glew/doc/glew.html",
    "content": "<!-- begin header.html -->\r\n<!--\r\nThe OpenGL Extension Wrangler Library\r\nCopyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>\r\nCopyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>\r\nCopyright (C) 2002, Lev Povalahev\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without \r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n* Redistributions of source code must retain the above copyright notice, \r\n  this list of conditions and the following disclaimer.\r\n* Redistributions in binary form must reproduce the above copyright notice, \r\n  this list of conditions and the following disclaimer in the documentation \r\n  and/or other materials provided with the distribution.\r\n* The name of the author may be used to endorse or promote products \r\n  derived from this software without specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" \r\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE \r\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \r\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \r\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\r\nTHE POSSIBILITY OF SUCH DAMAGE.\r\n-->\r\n<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html/4/loose.dtd\">\r\n<!-- &nbsp;<img src=\"new.png\" height=\"12\" alt=\"NEW!\"> -->\r\n<html>\r\n<head>\r\n<title>GLEW: The OpenGL Extension Wrangler Library</title>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=US-ASCII\"> \r\n<link href=\"glew.css\" type=\"text/css\" rel=\"stylesheet\">\r\n</head>\r\n<body bgcolor=\"#fff0d0\">\r\n<table border=\"0\" width=\"100%\" cellpadding=\"12\" cellspacing=\"8\" style=\"height:100%\">\r\n<tr>\r\n<td bgcolor=\"#ffffff\" align=\"left\" valign=\"top\" width=\"200\">\r\n<table border=\"0\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" align=\"left\">\r\n<tr>\r\n<td valign=\"top\">\r\n\r\n<table border=\"0\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" align=\"left\">\r\n<tr><td align=\"center\"><i>Latest Release: <a href=\"https://sourceforge.net/projects/glew/files/glew/1.5.2/\">1.5.2</a></i></td></tr>\r\n<tr><td align=\"center\"><br></td></tr>\r\n<tr><td align=\"center\"><img src=\"./glew.png\" alt=\"GLEW Logo\" width=\"97\" height=\"75\"></td></tr>\r\n<tr><td align=\"center\"><br></td></tr>\r\n<tr><td align=\"center\">\r\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\">\r\n<tr><td align=\"center\"><a href=\"index.html\">Download</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"install.html\">Installation</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"basic.html\">Basic Usage</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"advanced.html\">Advanced Usage</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"credits.html\">Credits & Copyright</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"log.html\">Change Log</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"http://sourceforge.net/projects/glew/\">Project Page</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"https://sourceforge.net/mail/?group_id=67586\">Mailing Lists</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"http://sourceforge.net/tracker/?group_id=67586\">Bug Tracker</a></td></tr>\r\n</table>\r\n<tr><td align=\"center\"><br></tr>\r\n</table>\r\n</td>\r\n</tr>\r\n<tr>\r\n\r\n<td valign=\"bottom\">\r\n<table border=\"0\" width=\"100%\" cellpadding=\"5\" cellspacing=\"0\" align=\"left\">\r\n<tr><td align=\"center\"><i>Last Update: 12-31-09</i></td></tr>\r\n<tr><td align=\"center\">\r\n<a href=\"http://www.opengl.org\"> <img src=\"./ogl_sm.jpg\" width=\"68\"\r\nheight=\"35\" border=\"0\" alt=\"OpenGL Logo\"></a>\r\n<a href=\"http://sourceforge.net\"> <img\r\nsrc=\"http://sourceforge.net/sflogo.php?group_id=67586&amp;type=1\"\r\nwidth=\"88\" height=\"31\" border=\"0\" alt=\"SourceForge Logo\"></a>\r\n</td>\r\n</tr>\r\n<!--- <tr><td align=\"center\"><a\r\nhref=\"http://sourceforge.net/donate/index.php?group_id=67586\"><img\r\nsrc=\"http://images.sourceforge.net/images/project-support.jpg\"\r\nwidth=\"88\" height=\"32\" border=\"0\" alt=\"Support This Project\"></a></td></tr> -->\r\n</table>\r\n</td>\r\n</tr>\r\n</table>\r\n</td>\r\n\r\n<td bgcolor=\"#ffffff\" align=\"left\" valign=\"top\">\r\n\r\n<h1>The OpenGL Extension Wrangler Library</h1>\r\n\r\n<!-- end header.html -->\r\n\r\n\r\n<h2>Supported OpenGL Extensions</h2>\r\n\r\n<table border=\"0\" width=\"100%\" cellpadding=\"1\" cellspacing=\"0\" align=\"center\">\r\n<tr><td class=\"num\">1</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/3DFX/3dfx_multisample.txt\">3DFX_multisample</a></td></tr>\r\n<tr><td class=\"num\">2</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/3DFX/tbuffer.txt\">3DFX_tbuffer</a></td></tr>\r\n<tr><td class=\"num\">3</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/3DFX/texture_compression_FXT1.txt\">3DFX_texture_compression_FXT1</a></td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">4</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/AMD/draw_buffers_blend.txt\">AMD_draw_buffers_blend</a></td></tr>\r\n<tr><td class=\"num\">5</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/AMD/performance_monitor.txt\">AMD_performance_monitor</a></td></tr>\r\n<tr><td class=\"num\">6</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/AMD/seamless_cubemap_per_texture.txt\">AMD_seamless_cubemap_per_texture</a></td></tr>\r\n<tr><td class=\"num\">7</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/AMD/shader_stencil_export.txt\">AMD_shader_stencil_export</a></td></tr>\r\n<tr><td class=\"num\">8</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/AMD/texture_texture4.txt\">AMD_texture_texture4</a></td></tr>\r\n<tr><td class=\"num\">9</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/AMD/vertex_shader_tessellator.txt\">AMD_vertex_shader_tessellator</a></td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">10</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/APPLE/aux_depth_stencil.txt\">APPLE_aux_depth_stencil</a></td></tr>\r\n<tr><td class=\"num\">11</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/APPLE/client_storage.txt\">APPLE_client_storage</a></td></tr>\r\n<tr><td class=\"num\">12</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/APPLE/element_array.txt\">APPLE_element_array</a></td></tr>\r\n<tr><td class=\"num\">13</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/APPLE/fence.txt\">APPLE_fence</a></td></tr>\r\n<tr><td class=\"num\">14</td><td>&nbsp;</td><td><a href=\"http://developer.apple.com/opengl/extensions/apple_float_pixels.html\">APPLE_float_pixels</a></td></tr>\r\n<tr><td class=\"num\">15</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/APPLE/flush_buffer_range.txt\">APPLE_flush_buffer_range</a></td></tr>\r\n<tr><td class=\"num\">16</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/APPLE/object_purgeable.txt\">APPLE_object_purgeable</a></td></tr>\r\n<tr><td class=\"num\">17</td><td>&nbsp;</td><td>APPLE_pixel_buffer</td></tr>\r\n<tr><td class=\"num\">18</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/APPLE/rgb_422.txt\">APPLE_rgb_422</a></td></tr>\r\n<tr><td class=\"num\">19</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/APPLE/row_bytes.txt\">APPLE_row_bytes</a></td></tr>\r\n<tr><td class=\"num\">20</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/APPLE/specular_vector.txt\">APPLE_specular_vector</a></td></tr>\r\n<tr><td class=\"num\">21</td><td>&nbsp;</td><td><a href=\"http://developer.apple.com/opengl/extensions/apple_texture_range.html\">APPLE_texture_range</a></td></tr>\r\n<tr><td class=\"num\">22</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/APPLE/transform_hint.txt\">APPLE_transform_hint</a></td></tr>\r\n<tr><td class=\"num\">23</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/APPLE/vertex_array_object.txt\">APPLE_vertex_array_object</a></td></tr>\r\n<tr><td class=\"num\">24</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/APPLE/vertex_array_range.txt\">APPLE_vertex_array_range</a></td></tr>\r\n<tr><td class=\"num\">25</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/APPLE/vertex_program_evaluators.txt\">APPLE_vertex_program_evaluators</a></td></tr>\r\n<tr><td class=\"num\">26</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/APPLE/ycbcr_422.txt\">APPLE_ycbcr_422</a></td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">27</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/color_buffer_float.txt\">ARB_color_buffer_float</a></td></tr>\r\n<tr><td class=\"num\">28</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/compatibility.txt\">ARB_compatibility</a></td></tr>\r\n<tr><td class=\"num\">29</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/copy_buffer.txt\">ARB_copy_buffer</a></td></tr>\r\n<tr><td class=\"num\">30</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/depth_buffer_float.txt\">ARB_depth_buffer_float</a></td></tr>\r\n<tr><td class=\"num\">31</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/depth_clamp.txt\">ARB_depth_clamp</a></td></tr>\r\n<tr><td class=\"num\">32</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/depth_texture.txt\">ARB_depth_texture</a></td></tr>\r\n<tr><td class=\"num\">33</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/draw_buffers.txt\">ARB_draw_buffers</a></td></tr>\r\n<tr><td class=\"num\">34</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/draw_buffers_blend.txt\">ARB_draw_buffers_blend</a></td></tr>\r\n<tr><td class=\"num\">35</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/draw_elements_base_vertex.txt\">ARB_draw_elements_base_vertex</a></td></tr>\r\n<tr><td class=\"num\">36</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/draw_instanced.txt\">ARB_draw_instanced</a></td></tr>\r\n<tr><td class=\"num\">37</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/fragment_coord_conventions.txt\">ARB_fragment_coord_conventions</a></td></tr>\r\n<tr><td class=\"num\">38</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/fragment_program.txt\">ARB_fragment_program</a></td></tr>\r\n<tr><td class=\"num\">39</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/fragment_program_shadow.txt\">ARB_fragment_program_shadow</a></td></tr>\r\n<tr><td class=\"num\">40</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/fragment_shader.txt\">ARB_fragment_shader</a></td></tr>\r\n<tr><td class=\"num\">41</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/framebuffer_object.txt\">ARB_framebuffer_object</a></td></tr>\r\n<tr><td class=\"num\">42</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/framebuffer_sRGB.txt\">ARB_framebuffer_sRGB</a></td></tr>\r\n<tr><td class=\"num\">43</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/geometry_shader4.txt\">ARB_geometry_shader4</a></td></tr>\r\n<tr><td class=\"num\">44</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/half_float_pixel.txt\">ARB_half_float_pixel</a></td></tr>\r\n<tr><td class=\"num\">45</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/half_float_vertex.txt\">ARB_half_float_vertex</a></td></tr>\r\n<tr><td class=\"num\">46</td><td>&nbsp;</td><td>ARB_imaging</td></tr>\r\n<tr><td class=\"num\">47</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/instanced_arrays.txt\">ARB_instanced_arrays</a></td></tr>\r\n<tr><td class=\"num\">48</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/map_buffer_range.txt\">ARB_map_buffer_range</a></td></tr>\r\n<tr><td class=\"num\">49</td><td>&nbsp;</td><td><a href=\"http://oss.sgi.com/projects/ogl-sample/registry/ARB/matrix_palette.txt\">ARB_matrix_palette</a></td></tr>\r\n<tr><td class=\"num\">50</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/multisample.txt\">ARB_multisample</a></td></tr>\r\n<tr><td class=\"num\">51</td><td>&nbsp;</td><td><a href=\"http://oss.sgi.com/projects/ogl-sample/registry/ARB/multitexture.txt\">ARB_multitexture</a></td></tr>\r\n<tr><td class=\"num\">52</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/occlusion_query.txt\">ARB_occlusion_query</a></td></tr>\r\n<tr><td class=\"num\">53</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/pixel_buffer_object.txt\">ARB_pixel_buffer_object</a></td></tr>\r\n<tr><td class=\"num\">54</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/point_parameters.txt\">ARB_point_parameters</a></td></tr>\r\n<tr><td class=\"num\">55</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/point_sprite.txt\">ARB_point_sprite</a></td></tr>\r\n<tr><td class=\"num\">56</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/provoking_vertex.txt\">ARB_provoking_vertex</a></td></tr>\r\n<tr><td class=\"num\">57</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/sample_shading.txt\">ARB_sample_shading</a></td></tr>\r\n<tr><td class=\"num\">58</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/seamless_cube_map.txt\">ARB_seamless_cube_map</a></td></tr>\r\n<tr><td class=\"num\">59</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/shader_objects.txt\">ARB_shader_objects</a></td></tr>\r\n<tr><td class=\"num\">60</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/shader_texture_lod.txt\">ARB_shader_texture_lod</a></td></tr>\r\n<tr><td class=\"num\">61</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/shading_language_100.txt\">ARB_shading_language_100</a></td></tr>\r\n<tr><td class=\"num\">62</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/shadow.txt\">ARB_shadow</a></td></tr>\r\n<tr><td class=\"num\">63</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/shadow_ambient.txt\">ARB_shadow_ambient</a></td></tr>\r\n<tr><td class=\"num\">64</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/sync.txt\">ARB_sync</a></td></tr>\r\n<tr><td class=\"num\">65</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/texture_border_clamp.txt\">ARB_texture_border_clamp</a></td></tr>\r\n<tr><td class=\"num\">66</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/texture_buffer_object.txt\">ARB_texture_buffer_object</a></td></tr>\r\n<tr><td class=\"num\">67</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/texture_compression.txt\">ARB_texture_compression</a></td></tr>\r\n<tr><td class=\"num\">68</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/texture_compression_rgtc.txt\">ARB_texture_compression_rgtc</a></td></tr>\r\n<tr><td class=\"num\">69</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/texture_cube_map.txt\">ARB_texture_cube_map</a></td></tr>\r\n<tr><td class=\"num\">70</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/texture_cube_map_array.txt\">ARB_texture_cube_map_array</a></td></tr>\r\n<tr><td class=\"num\">71</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/texture_env_add.txt\">ARB_texture_env_add</a></td></tr>\r\n<tr><td class=\"num\">72</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/texture_env_combine.txt\">ARB_texture_env_combine</a></td></tr>\r\n<tr><td class=\"num\">73</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/texture_env_crossbar.txt\">ARB_texture_env_crossbar</a></td></tr>\r\n<tr><td class=\"num\">74</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/texture_env_dot3.txt\">ARB_texture_env_dot3</a></td></tr>\r\n<tr><td class=\"num\">75</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/texture_float.txt\">ARB_texture_float</a></td></tr>\r\n<tr><td class=\"num\">76</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/texture_gather.txt\">ARB_texture_gather</a></td></tr>\r\n<tr><td class=\"num\">77</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/texture_mirrored_repeat.txt\">ARB_texture_mirrored_repeat</a></td></tr>\r\n<tr><td class=\"num\">78</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/texture_multisample.txt\">ARB_texture_multisample</a></td></tr>\r\n<tr><td class=\"num\">79</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/texture_non_power_of_two.txt\">ARB_texture_non_power_of_two</a></td></tr>\r\n<tr><td class=\"num\">80</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/texture_query_lod.txt\">ARB_texture_query_lod</a></td></tr>\r\n<tr><td class=\"num\">81</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/texture_rectangle.txt\">ARB_texture_rectangle</a></td></tr>\r\n<tr><td class=\"num\">82</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/texture_rg.txt\">ARB_texture_rg</a></td></tr>\r\n<tr><td class=\"num\">83</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/transpose_matrix.txt\">ARB_transpose_matrix</a></td></tr>\r\n<tr><td class=\"num\">84</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/uniform_buffer_object.txt\">ARB_uniform_buffer_object</a></td></tr>\r\n<tr><td class=\"num\">85</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/vertex_array_bgra.txt\">ARB_vertex_array_bgra</a></td></tr>\r\n<tr><td class=\"num\">86</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/vertex_array_object.txt\">ARB_vertex_array_object</a></td></tr>\r\n<tr><td class=\"num\">87</td><td>&nbsp;</td><td><a href=\"http://oss.sgi.com/projects/ogl-sample/registry/ARB/vertex_blend.txt\">ARB_vertex_blend</a></td></tr>\r\n<tr><td class=\"num\">88</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/vertex_buffer_object.txt\">ARB_vertex_buffer_object</a></td></tr>\r\n<tr><td class=\"num\">89</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/vertex_program.txt\">ARB_vertex_program</a></td></tr>\r\n<tr><td class=\"num\">90</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/vertex_shader.txt\">ARB_vertex_shader</a></td></tr>\r\n<tr><td class=\"num\">91</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/window_pos.txt\">ARB_window_pos</a></td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">92</td><td>&nbsp;</td><td><a href=\"http://www.ati.com/developer/atiopengl.pdf\">ATIX_point_sprites</a></td></tr>\r\n<tr><td class=\"num\">93</td><td>&nbsp;</td><td><a href=\"http://www.ati.com/developer/atiopengl.pdf\">ATIX_texture_env_combine3</a></td></tr>\r\n<tr><td class=\"num\">94</td><td>&nbsp;</td><td><a href=\"http://www.ati.com/developer/sdk/RadeonSDK/Html/Info/ATIX_texture_env_route.txt\">ATIX_texture_env_route</a></td></tr>\r\n<tr><td class=\"num\">95</td><td>&nbsp;</td><td><a href=\"http://www.ati.com/developer/atiopengl.pdf\">ATIX_vertex_shader_output_point_size</a></td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">96</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ATI/draw_buffers.txt\">ATI_draw_buffers</a></td></tr>\r\n<tr><td class=\"num\">97</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ATI/element_array.txt\">ATI_element_array</a></td></tr>\r\n<tr><td class=\"num\">98</td><td>&nbsp;</td><td><a href=\"http://oss.sgi.com/projects/ogl-sample/registry/ATI/envmap_bumpmap.txt\">ATI_envmap_bumpmap</a></td></tr>\r\n<tr><td class=\"num\">99</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ATI/fragment_shader.txt\">ATI_fragment_shader</a></td></tr>\r\n<tr><td class=\"num\">100</td><td>&nbsp;</td><td><a href=\"http://www.ati.com/developer/sdk/RADEONSDK/Html/Info/ATI_map_object_buffer.txt\">ATI_map_object_buffer</a></td></tr>\r\n<tr><td class=\"num\">101</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ATI/meminfo.txt\">ATI_meminfo</a></td></tr>\r\n<tr><td class=\"num\">102</td><td>&nbsp;</td><td><a href=\"http://www.ati.com/developer/sdk/RADEONSDK/Html/Info/ati_pn_triangles.txt\">ATI_pn_triangles</a></td></tr>\r\n<tr><td class=\"num\">103</td><td>&nbsp;</td><td><a href=\"http://www.ati.com/developer/sdk/RadeonSDK/Html/Info/ATI_separate_stencil.txt\">ATI_separate_stencil</a></td></tr>\r\n<tr><td class=\"num\">104</td><td>&nbsp;</td><td>ATI_shader_texture_lod</td></tr>\r\n<tr><td class=\"num\">105</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ATI/text_fragment_shader.txt\">ATI_text_fragment_shader</a></td></tr>\r\n<tr><td class=\"num\">106</td><td>&nbsp;</td><td>ATI_texture_compression_3dc</td></tr>\r\n<tr><td class=\"num\">107</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ATI/texture_env_combine3.txt\">ATI_texture_env_combine3</a></td></tr>\r\n<tr><td class=\"num\">108</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ATI/texture_float.txt\">ATI_texture_float</a></td></tr>\r\n<tr><td class=\"num\">109</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ATI/texture_mirror_once.txt\">ATI_texture_mirror_once</a></td></tr>\r\n<tr><td class=\"num\">110</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ATI/vertex_array_object.txt\">ATI_vertex_array_object</a></td></tr>\r\n<tr><td class=\"num\">111</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ATI/vertex_attrib_array_object.txt\">ATI_vertex_attrib_array_object</a></td></tr>\r\n<tr><td class=\"num\">112</td><td>&nbsp;</td><td><a href=\"http://www.ati.com/developer/sdk/RADEONSDK/Html/Info/ATI_vertex_streams.txt\">ATI_vertex_streams</a></td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">113</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/422_pixels.txt\">EXT_422_pixels</a></td></tr>\r\n<tr><td class=\"num\">114</td><td>&nbsp;</td><td><a href=\"http://download.nvidia.com/developer/GLSL/GLSL%20Release%20Notes%20for%20Release%2060.pdf\">EXT_Cg_shader</a></td></tr>\r\n<tr><td class=\"num\">115</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/abgr.txt\">EXT_abgr</a></td></tr>\r\n<tr><td class=\"num\">116</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/bgra.txt\">EXT_bgra</a></td></tr>\r\n<tr><td class=\"num\">117</td><td>&nbsp;</td><td><a href=\"http://developer.download.nvidia.com/opengl/specs/GL_EXT_bindable_uniform.txt\">EXT_bindable_uniform</a></td></tr>\r\n<tr><td class=\"num\">118</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/blend_color.txt\">EXT_blend_color</a></td></tr>\r\n<tr><td class=\"num\">119</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/blend_equation_separate.txt\">EXT_blend_equation_separate</a></td></tr>\r\n<tr><td class=\"num\">120</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/blend_func_separate.txt\">EXT_blend_func_separate</a></td></tr>\r\n<tr><td class=\"num\">121</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/blend_logic_op.txt\">EXT_blend_logic_op</a></td></tr>\r\n<tr><td class=\"num\">122</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/blend_minmax.txt\">EXT_blend_minmax</a></td></tr>\r\n<tr><td class=\"num\">123</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/blend_subtract.txt\">EXT_blend_subtract</a></td></tr>\r\n<tr><td class=\"num\">124</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/clip_volume_hint.txt\">EXT_clip_volume_hint</a></td></tr>\r\n<tr><td class=\"num\">125</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/cmyka.txt\">EXT_cmyka</a></td></tr>\r\n<tr><td class=\"num\">126</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/color_subtable.txt\">EXT_color_subtable</a></td></tr>\r\n<tr><td class=\"num\">127</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/compiled_vertex_array.txt\">EXT_compiled_vertex_array</a></td></tr>\r\n<tr><td class=\"num\">128</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/convolution.txt\">EXT_convolution</a></td></tr>\r\n<tr><td class=\"num\">129</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/coordinate_frame.txt\">EXT_coordinate_frame</a></td></tr>\r\n<tr><td class=\"num\">130</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/copy_texture.txt\">EXT_copy_texture</a></td></tr>\r\n<tr><td class=\"num\">131</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/cull_vertex.txt\">EXT_cull_vertex</a></td></tr>\r\n<tr><td class=\"num\">132</td><td>&nbsp;</td><td><a href=\"http://www.nvidia.com/dev_content/nvopenglspecs/GL_EXT_depth_bounds_test.txt\">EXT_depth_bounds_test</a></td></tr>\r\n<tr><td class=\"num\">133</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/direct_state_access.txt\">EXT_direct_state_access</a></td></tr>\r\n<tr><td class=\"num\">134</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/draw_buffers2.txt\">EXT_draw_buffers2</a></td></tr>\r\n<tr><td class=\"num\">135</td><td>&nbsp;</td><td><a href=\"http://developer.download.nvidia.com/opengl/specs/GL_EXT_draw_instanced.txt\">EXT_draw_instanced</a></td></tr>\r\n<tr><td class=\"num\">136</td><td>&nbsp;</td><td><a href=\"http://oss.sgi.com/projects/ogl-sample/registry/EXT/draw_range_elements.txt\">EXT_draw_range_elements</a></td></tr>\r\n<tr><td class=\"num\">137</td><td>&nbsp;</td><td><a href=\"http://oss.sgi.com/projects/ogl-sample/registry/EXT/fog_coord.txt\">EXT_fog_coord</a></td></tr>\r\n<tr><td class=\"num\">138</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/fragment_lighting.txt\">EXT_fragment_lighting</a></td></tr>\r\n<tr><td class=\"num\">139</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/framebuffer_blit.txt\">EXT_framebuffer_blit</a></td></tr>\r\n<tr><td class=\"num\">140</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/framebuffer_multisample.txt\">EXT_framebuffer_multisample</a></td></tr>\r\n<tr><td class=\"num\">141</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/framebuffer_object.txt\">EXT_framebuffer_object</a></td></tr>\r\n<tr><td class=\"num\">142</td><td>&nbsp;</td><td><a href=\"http://developer.download.nvidia.com/opengl/specs/GL_EXT_framebuffer_sRGB.txt\">EXT_framebuffer_sRGB</a></td></tr>\r\n<tr><td class=\"num\">143</td><td>&nbsp;</td><td><a href=\"http://developer.download.nvidia.com/opengl/specs/GL_EXT_geometry_shader4.txt\">EXT_geometry_shader4</a></td></tr>\r\n<tr><td class=\"num\">144</td><td>&nbsp;</td><td><a href=\"http://developer.download.nvidia.com/opengl/specs/GL_EXT_gpu_program_parameters.txt\">EXT_gpu_program_parameters</a></td></tr>\r\n<tr><td class=\"num\">145</td><td>&nbsp;</td><td><a href=\"http://developer.download.nvidia.com/opengl/specs/GL_EXT_gpu_shader4.txt\">EXT_gpu_shader4</a></td></tr>\r\n<tr><td class=\"num\">146</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/histogram.txt\">EXT_histogram</a></td></tr>\r\n<tr><td class=\"num\">147</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/index_array_formats.txt\">EXT_index_array_formats</a></td></tr>\r\n<tr><td class=\"num\">148</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/index_func.txt\">EXT_index_func</a></td></tr>\r\n<tr><td class=\"num\">149</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/index_material.txt\">EXT_index_material</a></td></tr>\r\n<tr><td class=\"num\">150</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/index_texture.txt\">EXT_index_texture</a></td></tr>\r\n<tr><td class=\"num\">151</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/light_texture.txt\">EXT_light_texture</a></td></tr>\r\n<tr><td class=\"num\">152</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/misc_attribute.txt\">EXT_misc_attribute</a></td></tr>\r\n<tr><td class=\"num\">153</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/multi_draw_arrays.txt\">EXT_multi_draw_arrays</a></td></tr>\r\n<tr><td class=\"num\">154</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/wgl_multisample.txt\">EXT_multisample</a></td></tr>\r\n<tr><td class=\"num\">155</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/packed_depth_stencil.txt\">EXT_packed_depth_stencil</a></td></tr>\r\n<tr><td class=\"num\">156</td><td>&nbsp;</td><td><a href=\"http://developer.download.nvidia.com/opengl/specs/GL_EXT_packed_float.txt\">EXT_packed_float</a></td></tr>\r\n<tr><td class=\"num\">157</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/packed_pixels.txt\">EXT_packed_pixels</a></td></tr>\r\n<tr><td class=\"num\">158</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/paletted_texture.txt\">EXT_paletted_texture</a></td></tr>\r\n<tr><td class=\"num\">159</td><td>&nbsp;</td><td><a href=\"http://www.nvidia.com/dev_content/nvopenglspecs/GL_EXT_pixel_buffer_object.txt\">EXT_pixel_buffer_object</a></td></tr>\r\n<tr><td class=\"num\">160</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/pixel_transform.txt\">EXT_pixel_transform</a></td></tr>\r\n<tr><td class=\"num\">161</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/pixel_transform_color_table.txt\">EXT_pixel_transform_color_table</a></td></tr>\r\n<tr><td class=\"num\">162</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/point_parameters.txt\">EXT_point_parameters</a></td></tr>\r\n<tr><td class=\"num\">163</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/polygon_offset.txt\">EXT_polygon_offset</a></td></tr>\r\n<tr><td class=\"num\">164</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/provoking_vertex.txt\">EXT_provoking_vertex</a></td></tr>\r\n<tr><td class=\"num\">165</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/rescale_normal.txt\">EXT_rescale_normal</a></td></tr>\r\n<tr><td class=\"num\">166</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/scene_marker.txt\">EXT_scene_marker</a></td></tr>\r\n<tr><td class=\"num\">167</td><td>&nbsp;</td><td><a href=\"http://oss.sgi.com/projects/ogl-sample/registry/EXT/secondary_color.txt\">EXT_secondary_color</a></td></tr>\r\n<tr><td class=\"num\">168</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/separate_shader_objects.txt\">EXT_separate_shader_objects</a></td></tr>\r\n<tr><td class=\"num\">169</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/separate_specular_color.txt\">EXT_separate_specular_color</a></td></tr>\r\n<tr><td class=\"num\">170</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/shadow_funcs.txt\">EXT_shadow_funcs</a></td></tr>\r\n<tr><td class=\"num\">171</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/shared_texture_palette.txt\">EXT_shared_texture_palette</a></td></tr>\r\n<tr><td class=\"num\">172</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/stencil_clear_tag.txt\">EXT_stencil_clear_tag</a></td></tr>\r\n<tr><td class=\"num\">173</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/stencil_two_side.txt\">EXT_stencil_two_side</a></td></tr>\r\n<tr><td class=\"num\">174</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/stencil_wrap.txt\">EXT_stencil_wrap</a></td></tr>\r\n<tr><td class=\"num\">175</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/subtexture.txt\">EXT_subtexture</a></td></tr>\r\n<tr><td class=\"num\">176</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/texture.txt\">EXT_texture</a></td></tr>\r\n<tr><td class=\"num\">177</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/texture3D.txt\">EXT_texture3D</a></td></tr>\r\n<tr><td class=\"num\">178</td><td>&nbsp;</td><td><a href=\"http://developer.download.nvidia.com/opengl/specs/GL_EXT_texture_array.txt\">EXT_texture_array</a></td></tr>\r\n<tr><td class=\"num\">179</td><td>&nbsp;</td><td><a href=\"http://developer.download.nvidia.com/opengl/specs/GL_EXT_texture_buffer_object.txt\">EXT_texture_buffer_object</a></td></tr>\r\n<tr><td class=\"num\">180</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/texture_compression_dxt1.txt\">EXT_texture_compression_dxt1</a></td></tr>\r\n<tr><td class=\"num\">181</td><td>&nbsp;</td><td><a href=\"http://developer.download.nvidia.com/opengl/specs/GL_EXT_texture_compression_latc.txt\">EXT_texture_compression_latc</a></td></tr>\r\n<tr><td class=\"num\">182</td><td>&nbsp;</td><td><a href=\"http://developer.download.nvidia.com/opengl/specs/GL_EXT_texture_compression_rgtc.txt\">EXT_texture_compression_rgtc</a></td></tr>\r\n<tr><td class=\"num\">183</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/texture_compression_s3tc.txt\">EXT_texture_compression_s3tc</a></td></tr>\r\n<tr><td class=\"num\">184</td><td>&nbsp;</td><td><a href=\"http://www.nvidia.com/dev_content/nvopenglspecs/GL_EXT_texture_cube_map.txt\">EXT_texture_cube_map</a></td></tr>\r\n<tr><td class=\"num\">185</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/developers/documentation/Version1.2/1.2specs/texture_edge_clamp.txt\">EXT_texture_edge_clamp</a></td></tr>\r\n<tr><td class=\"num\">186</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/texture_env.txt\">EXT_texture_env</a></td></tr>\r\n<tr><td class=\"num\">187</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/texture_env_add.txt\">EXT_texture_env_add</a></td></tr>\r\n<tr><td class=\"num\">188</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/texture_env_combine.txt\">EXT_texture_env_combine</a></td></tr>\r\n<tr><td class=\"num\">189</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/texture_env_dot3.txt\">EXT_texture_env_dot3</a></td></tr>\r\n<tr><td class=\"num\">190</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/texture_filter_anisotropic.txt\">EXT_texture_filter_anisotropic</a></td></tr>\r\n<tr><td class=\"num\">191</td><td>&nbsp;</td><td><a href=\"http://developer.download.nvidia.com/opengl/specs/GL_EXT_texture_integer.txt\">EXT_texture_integer</a></td></tr>\r\n<tr><td class=\"num\">192</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/texture_lod_bias.txt\">EXT_texture_lod_bias</a></td></tr>\r\n<tr><td class=\"num\">193</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/texture_mirror_clamp.txt\">EXT_texture_mirror_clamp</a></td></tr>\r\n<tr><td class=\"num\">194</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/texture_object.txt\">EXT_texture_object</a></td></tr>\r\n<tr><td class=\"num\">195</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/texture_perturb_normal.txt\">EXT_texture_perturb_normal</a></td></tr>\r\n<tr><td class=\"num\">196</td><td>&nbsp;</td><td><a href=\"http://developer.apple.com/opengl/extensions/ext_texture_rectangle.html\">EXT_texture_rectangle</a></td></tr>\r\n<tr><td class=\"num\">197</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/texture_sRGB.txt\">EXT_texture_sRGB</a></td></tr>\r\n<tr><td class=\"num\">198</td><td>&nbsp;</td><td><a href=\"http://developer.download.nvidia.com/opengl/specs/GL_EXT_texture_shared_exponent.txt\">EXT_texture_shared_exponent</a></td></tr>\r\n<tr><td class=\"num\">199</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/texture_snorm.txt\">EXT_texture_snorm</a></td></tr>\r\n<tr><td class=\"num\">200</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/texture_swizzle.txt\">EXT_texture_swizzle</a></td></tr>\r\n<tr><td class=\"num\">201</td><td>&nbsp;</td><td><a href=\"http://www.nvidia.com/dev_content/nvopenglspecs/GL_EXT_timer_query.txt\">EXT_timer_query</a></td></tr>\r\n<tr><td class=\"num\">202</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/transform_feedback.txt\">EXT_transform_feedback</a></td></tr>\r\n<tr><td class=\"num\">203</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/vertex_array.txt\">EXT_vertex_array</a></td></tr>\r\n<tr><td class=\"num\">204</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/vertex_array_bgra.txt\">EXT_vertex_array_bgra</a></td></tr>\r\n<tr><td class=\"num\">205</td><td>&nbsp;</td><td><a href=\"http://oss.sgi.com/projects/ogl-sample/registry/EXT/vertex_shader.txt\">EXT_vertex_shader</a></td></tr>\r\n<tr><td class=\"num\">206</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/vertex_weighting.txt\">EXT_vertex_weighting</a></td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">207</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/GREMEDY/frame_terminator.txt\">GREMEDY_frame_terminator</a></td></tr>\r\n<tr><td class=\"num\">208</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/GREMEDY/string_marker.txt\">GREMEDY_string_marker</a></td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">209</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/HP/convolution_border_modes.txt\">HP_convolution_border_modes</a></td></tr>\r\n<tr><td class=\"num\">210</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/HP/image_transform.txt\">HP_image_transform</a></td></tr>\r\n<tr><td class=\"num\">211</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/HP/occlusion_test.txt\">HP_occlusion_test</a></td></tr>\r\n<tr><td class=\"num\">212</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/HP/texture_lighting.txt\">HP_texture_lighting</a></td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">213</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/IBM/cull_vertex.txt\">IBM_cull_vertex</a></td></tr>\r\n<tr><td class=\"num\">214</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/IBM/multimode_draw_arrays.txt\">IBM_multimode_draw_arrays</a></td></tr>\r\n<tr><td class=\"num\">215</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/IBM/rasterpos_clip.txt\">IBM_rasterpos_clip</a></td></tr>\r\n<tr><td class=\"num\">216</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/IBM/static_data.txt\">IBM_static_data</a></td></tr>\r\n<tr><td class=\"num\">217</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/IBM/texture_mirrored_repeat.txt\">IBM_texture_mirrored_repeat</a></td></tr>\r\n<tr><td class=\"num\">218</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/IBM/vertex_array_lists.txt\">IBM_vertex_array_lists</a></td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">219</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/INGR/color_clamp.txt\">INGR_color_clamp</a></td></tr>\r\n<tr><td class=\"num\">220</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/INGR/interlace_read.txt\">INGR_interlace_read</a></td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">221</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/INTEL/parallel_arrays.txt\">INTEL_parallel_arrays</a></td></tr>\r\n<tr><td class=\"num\">222</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/INTEL/texture_scissor.txt\">INTEL_texture_scissor</a></td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">223</td><td>&nbsp;</td><td>KTX_buffer_region</td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">224</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/MESAX/texture_stack.txt\">MESAX_texture_stack</a></td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">225</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/MESA/pack_invert.txt\">MESA_pack_invert</a></td></tr>\r\n<tr><td class=\"num\">226</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/MESA/resize_buffers.txt\">MESA_resize_buffers</a></td></tr>\r\n<tr><td class=\"num\">227</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/MESA/window_pos.txt\">MESA_window_pos</a></td></tr>\r\n<tr><td class=\"num\">228</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/MESA/ycbcr_texture.txt\">MESA_ycbcr_texture</a></td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">229</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/blend_square.txt\">NV_blend_square</a></td></tr>\r\n<tr><td class=\"num\">230</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/conditional_render.txt\">NV_conditional_render</a></td></tr>\r\n<tr><td class=\"num\">231</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/copy_depth_to_color.txt\">NV_copy_depth_to_color</a></td></tr>\r\n<tr><td class=\"num\">232</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/copy_image.txt\">NV_copy_image</a></td></tr>\r\n<tr><td class=\"num\">233</td><td>&nbsp;</td><td><a href=\"http://developer.download.nvidia.com/opengl/specs/GL_NV_depth_buffer_float.txt\">NV_depth_buffer_float</a></td></tr>\r\n<tr><td class=\"num\">234</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/depth_clamp.txt\">NV_depth_clamp</a></td></tr>\r\n<tr><td class=\"num\">235</td><td>&nbsp;</td><td>NV_depth_range_unclamped</td></tr>\r\n<tr><td class=\"num\">236</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/evaluators.txt\">NV_evaluators</a></td></tr>\r\n<tr><td class=\"num\">237</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/explicit_multisample.txt\">NV_explicit_multisample</a></td></tr>\r\n<tr><td class=\"num\">238</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/fence.txt\">NV_fence</a></td></tr>\r\n<tr><td class=\"num\">239</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/float_buffer.txt\">NV_float_buffer</a></td></tr>\r\n<tr><td class=\"num\">240</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/fog_distance.txt\">NV_fog_distance</a></td></tr>\r\n<tr><td class=\"num\">241</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/fragment_program.txt\">NV_fragment_program</a></td></tr>\r\n<tr><td class=\"num\">242</td><td>&nbsp;</td><td><a href=\"http://www.nvidia.com/dev_content/nvopenglspecs/GL_NV_fragment_program2.txt\">NV_fragment_program2</a></td></tr>\r\n<tr><td class=\"num\">243</td><td>&nbsp;</td><td><a href=\"http://developer.download.nvidia.com/opengl/specs/GL_NV_fragment_program4.txt\">NV_fragment_program4</a></td></tr>\r\n<tr><td class=\"num\">244</td><td>&nbsp;</td><td><a href=\"http://www.nvidia.com/dev_content/nvopenglspecs/GL_NV_fragment_program_option.txt\">NV_fragment_program_option</a></td></tr>\r\n<tr><td class=\"num\">245</td><td>&nbsp;</td><td><a href=\"http://developer.download.nvidia.com/opengl/specs/GL_NV_framebuffer_multisample_coverage.txt\">NV_framebuffer_multisample_coverage</a></td></tr>\r\n<tr><td class=\"num\">246</td><td>&nbsp;</td><td><a href=\"http://developer.download.nvidia.com/opengl/specs/GL_NV_geometry_program4.txt\">NV_geometry_program4</a></td></tr>\r\n<tr><td class=\"num\">247</td><td>&nbsp;</td><td><a href=\"http://developer.download.nvidia.com/opengl/specs/GL_NV_geometry_shader4.txt\">NV_geometry_shader4</a></td></tr>\r\n<tr><td class=\"num\">248</td><td>&nbsp;</td><td><a href=\"http://developer.download.nvidia.com/opengl/specs/GL_NV_gpu_program4.txt\">NV_gpu_program4</a></td></tr>\r\n<tr><td class=\"num\">249</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/half_float.txt\">NV_half_float</a></td></tr>\r\n<tr><td class=\"num\">250</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/light_max_exponent.txt\">NV_light_max_exponent</a></td></tr>\r\n<tr><td class=\"num\">251</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/multisample_filter_hint.txt\">NV_multisample_filter_hint</a></td></tr>\r\n<tr><td class=\"num\">252</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/occlusion_query.txt\">NV_occlusion_query</a></td></tr>\r\n<tr><td class=\"num\">253</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/packed_depth_stencil.txt\">NV_packed_depth_stencil</a></td></tr>\r\n<tr><td class=\"num\">254</td><td>&nbsp;</td><td><a href=\"http://developer.download.nvidia.com/opengl/specs/GL_NV_parameter_buffer_object.txt\">NV_parameter_buffer_object</a></td></tr>\r\n<tr><td class=\"num\">255</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/parameter_buffer_object2.txt\">NV_parameter_buffer_object2</a></td></tr>\r\n<tr><td class=\"num\">256</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/pixel_data_range.txt\">NV_pixel_data_range</a></td></tr>\r\n<tr><td class=\"num\">257</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/point_sprite.txt\">NV_point_sprite</a></td></tr>\r\n<tr><td class=\"num\">258</td><td>&nbsp;</td><td>NV_present_video</td></tr>\r\n<tr><td class=\"num\">259</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/primitive_restart.txt\">NV_primitive_restart</a></td></tr>\r\n<tr><td class=\"num\">260</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/register_combiners.txt\">NV_register_combiners</a></td></tr>\r\n<tr><td class=\"num\">261</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/register_combiners2.txt\">NV_register_combiners2</a></td></tr>\r\n<tr><td class=\"num\">262</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/shader_buffer_load.txt\">NV_shader_buffer_load</a></td></tr>\r\n<tr><td class=\"num\">263</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/texgen_emboss.txt\">NV_texgen_emboss</a></td></tr>\r\n<tr><td class=\"num\">264</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/texgen_reflection.txt\">NV_texgen_reflection</a></td></tr>\r\n<tr><td class=\"num\">265</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/texture_barrier.txt\">NV_texture_barrier</a></td></tr>\r\n<tr><td class=\"num\">266</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/texture_compression_vtc.txt\">NV_texture_compression_vtc</a></td></tr>\r\n<tr><td class=\"num\">267</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/texture_env_combine4.txt\">NV_texture_env_combine4</a></td></tr>\r\n<tr><td class=\"num\">268</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/texture_expand_normal.txt\">NV_texture_expand_normal</a></td></tr>\r\n<tr><td class=\"num\">269</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/texture_rectangle.txt\">NV_texture_rectangle</a></td></tr>\r\n<tr><td class=\"num\">270</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/texture_shader.txt\">NV_texture_shader</a></td></tr>\r\n<tr><td class=\"num\">271</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/texture_shader2.txt\">NV_texture_shader2</a></td></tr>\r\n<tr><td class=\"num\">272</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/texture_shader3.txt\">NV_texture_shader3</a></td></tr>\r\n<tr><td class=\"num\">273</td><td>&nbsp;</td><td><a href=\"http://developer.download.nvidia.com/opengl/specs/GL_NV_transform_feedback.txt\">NV_transform_feedback</a></td></tr>\r\n<tr><td class=\"num\">274</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/transform_feedback2.txt\">NV_transform_feedback2</a></td></tr>\r\n<tr><td class=\"num\">275</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/vertex_array_range.txt\">NV_vertex_array_range</a></td></tr>\r\n<tr><td class=\"num\">276</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/vertex_array_range2.txt\">NV_vertex_array_range2</a></td></tr>\r\n<tr><td class=\"num\">277</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/vertex_buffer_unified_memory.txt\">NV_vertex_buffer_unified_memory</a></td></tr>\r\n<tr><td class=\"num\">278</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/vertex_program.txt\">NV_vertex_program</a></td></tr>\r\n<tr><td class=\"num\">279</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/vertex_program1_1.txt\">NV_vertex_program1_1</a></td></tr>\r\n<tr><td class=\"num\">280</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/vertex_program2.txt\">NV_vertex_program2</a></td></tr>\r\n<tr><td class=\"num\">281</td><td>&nbsp;</td><td><a href=\"http://www.nvidia.com/dev_content/nvopenglspecs/GL_NV_vertex_program2_option.txt\">NV_vertex_program2_option</a></td></tr>\r\n<tr><td class=\"num\">282</td><td>&nbsp;</td><td><a href=\"http://www.nvidia.com/dev_content/nvopenglspecs/GL_NV_vertex_program3.txt\">NV_vertex_program3</a></td></tr>\r\n<tr><td class=\"num\">283</td><td>&nbsp;</td><td><a href=\"http://developer.download.nvidia.com/opengl/specs/GL_NV_vertex_program4.txt\">NV_vertex_program4</a></td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">284</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/OES/OES_byte_coordinates.txt\">OES_byte_coordinates</a></td></tr>\r\n<tr><td class=\"num\">285</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/OES/OES_compressed_paletted_texture.txt\">OES_compressed_paletted_texture</a></td></tr>\r\n<tr><td class=\"num\">286</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/OES/OES_read_format.txt\">OES_read_format</a></td></tr>\r\n<tr><td class=\"num\">287</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/OES/OES_single_precision.txt\">OES_single_precision</a></td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">288</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/OML/interlace.txt\">OML_interlace</a></td></tr>\r\n<tr><td class=\"num\">289</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/OML/resample.txt\">OML_resample</a></td></tr>\r\n<tr><td class=\"num\">290</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/OML/subsample.txt\">OML_subsample</a></td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">291</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/PGI/misc_hints.txt\">PGI_misc_hints</a></td></tr>\r\n<tr><td class=\"num\">292</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/PGI/vertex_hints.txt\">PGI_vertex_hints</a></td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">293</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/REND/screen_coordinates.txt\">REND_screen_coordinates</a></td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">294</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/S3/s3tc.txt\">S3_s3tc</a></td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">295</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIS/color_range.txt\">SGIS_color_range</a></td></tr>\r\n<tr><td class=\"num\">296</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIS/detail_texture.txt\">SGIS_detail_texture</a></td></tr>\r\n<tr><td class=\"num\">297</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIS/fog_func.txt\">SGIS_fog_function</a></td></tr>\r\n<tr><td class=\"num\">298</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIS/generate_mipmap.txt\">SGIS_generate_mipmap</a></td></tr>\r\n<tr><td class=\"num\">299</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIS/multisample.txt\">SGIS_multisample</a></td></tr>\r\n<tr><td class=\"num\">300</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIS/pixel_texture.txt\">SGIS_pixel_texture</a></td></tr>\r\n<tr><td class=\"num\">301</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIS/point_line_texgen.txt\">SGIS_point_line_texgen</a></td></tr>\r\n<tr><td class=\"num\">302</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIS/sharpen_texture.txt\">SGIS_sharpen_texture</a></td></tr>\r\n<tr><td class=\"num\">303</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIS/texture4D.txt\">SGIS_texture4D</a></td></tr>\r\n<tr><td class=\"num\">304</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIS/texture_border_clamp.txt\">SGIS_texture_border_clamp</a></td></tr>\r\n<tr><td class=\"num\">305</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIS/texture_edge_clamp.txt\">SGIS_texture_edge_clamp</a></td></tr>\r\n<tr><td class=\"num\">306</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIS/texture_filter4.txt\">SGIS_texture_filter4</a></td></tr>\r\n<tr><td class=\"num\">307</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIS/texture_lod.txt\">SGIS_texture_lod</a></td></tr>\r\n<tr><td class=\"num\">308</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIS/texture_select.txt\">SGIS_texture_select</a></td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">309</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIX/async.txt\">SGIX_async</a></td></tr>\r\n<tr><td class=\"num\">310</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIX/async_histogram.txt\">SGIX_async_histogram</a></td></tr>\r\n<tr><td class=\"num\">311</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIX/async_pixel.txt\">SGIX_async_pixel</a></td></tr>\r\n<tr><td class=\"num\">312</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIX/blend_alpha_minmax.txt\">SGIX_blend_alpha_minmax</a></td></tr>\r\n<tr><td class=\"num\">313</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIX/clipmap.txt\">SGIX_clipmap</a></td></tr>\r\n<tr><td class=\"num\">314</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIX/convolution_accuracy.txt\">SGIX_convolution_accuracy</a></td></tr>\r\n<tr><td class=\"num\">315</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIX/depth_texture.txt\">SGIX_depth_texture</a></td></tr>\r\n<tr><td class=\"num\">316</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIX/flush_raster.txt\">SGIX_flush_raster</a></td></tr>\r\n<tr><td class=\"num\">317</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIX/fog_offset.txt\">SGIX_fog_offset</a></td></tr>\r\n<tr><td class=\"num\">318</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIX/fog_texture.txt\">SGIX_fog_texture</a></td></tr>\r\n<tr><td class=\"num\">319</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIX/fragment_specular_lighting.txt\">SGIX_fragment_specular_lighting</a></td></tr>\r\n<tr><td class=\"num\">320</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIX/framezoom.txt\">SGIX_framezoom</a></td></tr>\r\n<tr><td class=\"num\">321</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIX/interlace.txt\">SGIX_interlace</a></td></tr>\r\n<tr><td class=\"num\">322</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIX/ir_instrument1.txt\">SGIX_ir_instrument1</a></td></tr>\r\n<tr><td class=\"num\">323</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIX/list_priority.txt\">SGIX_list_priority</a></td></tr>\r\n<tr><td class=\"num\">324</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIX/sgix_pixel_texture.txt\">SGIX_pixel_texture</a></td></tr>\r\n<tr><td class=\"num\">325</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIX/pixel_texture_bits.txt\">SGIX_pixel_texture_bits</a></td></tr>\r\n<tr><td class=\"num\">326</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIX/reference_plane.txt\">SGIX_reference_plane</a></td></tr>\r\n<tr><td class=\"num\">327</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIX/resample.txt\">SGIX_resample</a></td></tr>\r\n<tr><td class=\"num\">328</td><td>&nbsp;</td><td><a href=\"http://oss.sgi.com/projects/ogl-sample/registry/SGIX/shadow.txt\">SGIX_shadow</a></td></tr>\r\n<tr><td class=\"num\">329</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIX/shadow_ambient.txt\">SGIX_shadow_ambient</a></td></tr>\r\n<tr><td class=\"num\">330</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIX/sprite.txt\">SGIX_sprite</a></td></tr>\r\n<tr><td class=\"num\">331</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIX/tag_sample_buffer.txt\">SGIX_tag_sample_buffer</a></td></tr>\r\n<tr><td class=\"num\">332</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIX/texture_env_add.txt\">SGIX_texture_add_env</a></td></tr>\r\n<tr><td class=\"num\">333</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIX/texture_coordinate_clamp.txt\">SGIX_texture_coordinate_clamp</a></td></tr>\r\n<tr><td class=\"num\">334</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIX/texture_lod_bias.txt\">SGIX_texture_lod_bias</a></td></tr>\r\n<tr><td class=\"num\">335</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIX/texture_multi_buffer.txt\">SGIX_texture_multi_buffer</a></td></tr>\r\n<tr><td class=\"num\">336</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIX/texture_range.txt\">SGIX_texture_range</a></td></tr>\r\n<tr><td class=\"num\">337</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIX/texture_scale_bias.txt\">SGIX_texture_scale_bias</a></td></tr>\r\n<tr><td class=\"num\">338</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIX/vertex_preclip.txt\">SGIX_vertex_preclip</a></td></tr>\r\n<tr><td class=\"num\">339</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIX/vertex_preclip.txt\">SGIX_vertex_preclip_hint</a></td></tr>\r\n<tr><td class=\"num\">340</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIX/ycrcb.txt\">SGIX_ycrcb</a></td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">341</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGI/color_matrix.txt\">SGI_color_matrix</a></td></tr>\r\n<tr><td class=\"num\">342</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGI/color_table.txt\">SGI_color_table</a></td></tr>\r\n<tr><td class=\"num\">343</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGI/texture_color_table.txt\">SGI_texture_color_table</a></td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">344</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SUNX/constant_data.txt\">SUNX_constant_data</a></td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">345</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SUN/convolution_border_modes.txt\">SUN_convolution_border_modes</a></td></tr>\r\n<tr><td class=\"num\">346</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SUN/global_alpha.txt\">SUN_global_alpha</a></td></tr>\r\n<tr><td class=\"num\">347</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SUN/mesh_array.txt\">SUN_mesh_array</a></td></tr>\r\n<tr><td class=\"num\">348</td><td>&nbsp;</td><td><a href=\"http://wwws.sun.com/software/graphics/opengl/extensions/gl_sun_read_video_pixels.txt\">SUN_read_video_pixels</a></td></tr>\r\n<tr><td class=\"num\">349</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SUN/slice_accum.txt\">SUN_slice_accum</a></td></tr>\r\n<tr><td class=\"num\">350</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SUN/triangle_list.txt\">SUN_triangle_list</a></td></tr>\r\n<tr><td class=\"num\">351</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SUN/vertex.txt\">SUN_vertex</a></td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">352</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/WIN/phong_shading.txt\">WIN_phong_shading</a></td></tr>\r\n<tr><td class=\"num\">353</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/WIN/specular_fog.txt\">WIN_specular_fog</a></td></tr>\r\n<tr><td class=\"num\">354</td><td>&nbsp;</td><td><a href=\"http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/glfunc01_16zy.asp\">WIN_swap_hint</a></td></tr>\r\n</table>\r\n<!-- begin footer.html -->\r\n</td></tr></table></body>\r\n<!-- end footer.html -->\r\n\r\n"
  },
  {
    "path": "libs/glew/doc/glew.txt",
    "content": "The OpenGL Extension Wrangler Library\r\nCopyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>\r\nCopyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>\r\nCopyright (C) 2002, Lev Povalahev\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without \r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n* Redistributions of source code must retain the above copyright notice, \r\n  this list of conditions and the following disclaimer.\r\n* Redistributions in binary form must reproduce the above copyright notice, \r\n  this list of conditions and the following disclaimer in the documentation \r\n  and/or other materials provided with the distribution.\r\n* The name of the author may be used to endorse or promote products \r\n  derived from this software without specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" \r\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE \r\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \r\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \r\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\r\nTHE POSSIBILITY OF SUCH DAMAGE.\r\n"
  },
  {
    "path": "libs/glew/doc/glxew.html",
    "content": "<!-- begin header.html -->\r\n<!--\r\nThe OpenGL Extension Wrangler Library\r\nCopyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>\r\nCopyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>\r\nCopyright (C) 2002, Lev Povalahev\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without \r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n* Redistributions of source code must retain the above copyright notice, \r\n  this list of conditions and the following disclaimer.\r\n* Redistributions in binary form must reproduce the above copyright notice, \r\n  this list of conditions and the following disclaimer in the documentation \r\n  and/or other materials provided with the distribution.\r\n* The name of the author may be used to endorse or promote products \r\n  derived from this software without specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" \r\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE \r\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \r\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \r\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\r\nTHE POSSIBILITY OF SUCH DAMAGE.\r\n-->\r\n<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html/4/loose.dtd\">\r\n<!-- &nbsp;<img src=\"new.png\" height=\"12\" alt=\"NEW!\"> -->\r\n<html>\r\n<head>\r\n<title>GLEW: The OpenGL Extension Wrangler Library</title>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=US-ASCII\"> \r\n<link href=\"glew.css\" type=\"text/css\" rel=\"stylesheet\">\r\n</head>\r\n<body bgcolor=\"#fff0d0\">\r\n<table border=\"0\" width=\"100%\" cellpadding=\"12\" cellspacing=\"8\" style=\"height:100%\">\r\n<tr>\r\n<td bgcolor=\"#ffffff\" align=\"left\" valign=\"top\" width=\"200\">\r\n<table border=\"0\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" align=\"left\">\r\n<tr>\r\n<td valign=\"top\">\r\n\r\n<table border=\"0\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" align=\"left\">\r\n<tr><td align=\"center\"><i>Latest Release: <a href=\"https://sourceforge.net/projects/glew/files/glew/1.5.2/\">1.5.2</a></i></td></tr>\r\n<tr><td align=\"center\"><br></td></tr>\r\n<tr><td align=\"center\"><img src=\"./glew.png\" alt=\"GLEW Logo\" width=\"97\" height=\"75\"></td></tr>\r\n<tr><td align=\"center\"><br></td></tr>\r\n<tr><td align=\"center\">\r\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\">\r\n<tr><td align=\"center\"><a href=\"index.html\">Download</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"install.html\">Installation</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"basic.html\">Basic Usage</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"advanced.html\">Advanced Usage</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"credits.html\">Credits & Copyright</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"log.html\">Change Log</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"http://sourceforge.net/projects/glew/\">Project Page</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"https://sourceforge.net/mail/?group_id=67586\">Mailing Lists</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"http://sourceforge.net/tracker/?group_id=67586\">Bug Tracker</a></td></tr>\r\n</table>\r\n<tr><td align=\"center\"><br></tr>\r\n</table>\r\n</td>\r\n</tr>\r\n<tr>\r\n\r\n<td valign=\"bottom\">\r\n<table border=\"0\" width=\"100%\" cellpadding=\"5\" cellspacing=\"0\" align=\"left\">\r\n<tr><td align=\"center\"><i>Last Update: 12-31-09</i></td></tr>\r\n<tr><td align=\"center\">\r\n<a href=\"http://www.opengl.org\"> <img src=\"./ogl_sm.jpg\" width=\"68\"\r\nheight=\"35\" border=\"0\" alt=\"OpenGL Logo\"></a>\r\n<a href=\"http://sourceforge.net\"> <img\r\nsrc=\"http://sourceforge.net/sflogo.php?group_id=67586&amp;type=1\"\r\nwidth=\"88\" height=\"31\" border=\"0\" alt=\"SourceForge Logo\"></a>\r\n</td>\r\n</tr>\r\n<!--- <tr><td align=\"center\"><a\r\nhref=\"http://sourceforge.net/donate/index.php?group_id=67586\"><img\r\nsrc=\"http://images.sourceforge.net/images/project-support.jpg\"\r\nwidth=\"88\" height=\"32\" border=\"0\" alt=\"Support This Project\"></a></td></tr> -->\r\n</table>\r\n</td>\r\n</tr>\r\n</table>\r\n</td>\r\n\r\n<td bgcolor=\"#ffffff\" align=\"left\" valign=\"top\">\r\n\r\n<h1>The OpenGL Extension Wrangler Library</h1>\r\n\r\n<!-- end header.html -->\r\n\r\n\r\n<h2>Supported GLX Extensions</h2>\r\n\r\n<table border=\"0\" width=\"100%\" cellpadding=\"1\" cellspacing=\"0\" align=\"center\">\r\n<tr><td class=\"num\">1</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/3DFX/3dfx_multisample.txt\">3DFX_multisample</a></td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">2</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/glx_create_context.txt\">ARB_create_context</a></td></tr>\r\n<tr><td class=\"num\">3</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/glx_create_context.txt\">ARB_create_context_profile</a></td></tr>\r\n<tr><td class=\"num\">4</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/color_buffer_float.txt\">ARB_fbconfig_float</a></td></tr>\r\n<tr><td class=\"num\">5</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/framebuffer_sRGB.txt\">ARB_framebuffer_sRGB</a></td></tr>\r\n<tr><td class=\"num\">6</td><td>&nbsp;</td><td><a href=\"http://oss.sgi.com/projects/ogl-sample/registry/ARB/get_proc_address.txt\">ARB_get_proc_address</a></td></tr>\r\n<tr><td class=\"num\">7</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/multisample.txt\">ARB_multisample</a></td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">8</td><td>&nbsp;</td><td>ATI_pixel_format_float</td></tr>\r\n<tr><td class=\"num\">9</td><td>&nbsp;</td><td>ATI_render_texture</td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">10</td><td>&nbsp;</td><td><a href=\"http://developer.download.nvidia.com/opengl/specs/GL_EXT_packed_float.txt\">EXT_fbconfig_packed_float</a></td></tr>\r\n<tr><td class=\"num\">11</td><td>&nbsp;</td><td><a href=\"http://developer.download.nvidia.com/opengl/specs/GL_EXT_framebuffer_sRGB.txt\">EXT_framebuffer_sRGB</a></td></tr>\r\n<tr><td class=\"num\">12</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/import_context.txt\">EXT_import_context</a></td></tr>\r\n<tr><td class=\"num\">13</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/scene_marker.txt\">EXT_scene_marker</a></td></tr>\r\n<tr><td class=\"num\">14</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/swap_control.txt\">EXT_swap_control</a></td></tr>\r\n<tr><td class=\"num\">15</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/texture_from_pixmap.txt\">EXT_texture_from_pixmap</a></td></tr>\r\n<tr><td class=\"num\">16</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/visual_info.txt\">EXT_visual_info</a></td></tr>\r\n<tr><td class=\"num\">17</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/visual_rating.txt\">EXT_visual_rating</a></td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">18</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/INTEL/swap_event.txt\">INTEL_swap_event</a></td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">19</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/MESA/agp_offset.txt\">MESA_agp_offset</a></td></tr>\r\n<tr><td class=\"num\">20</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/MESA/copy_sub_buffer.txt\">MESA_copy_sub_buffer</a></td></tr>\r\n<tr><td class=\"num\">21</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/MESA/pixmap_colormap.txt\">MESA_pixmap_colormap</a></td></tr>\r\n<tr><td class=\"num\">22</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/MESA/release_buffers.txt\">MESA_release_buffers</a></td></tr>\r\n<tr><td class=\"num\">23</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/MESA/set_3dfx_mode.txt\">MESA_set_3dfx_mode</a></td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">24</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/copy_image.txt\">NV_copy_image</a></td></tr>\r\n<tr><td class=\"num\">25</td><td>&nbsp;</td><td><a href=\"http://cvs1.nvidia.com/inc/GL/glxtokens.h\">NV_float_buffer</a></td></tr>\r\n<tr><td class=\"num\">26</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/present_video.txt\">NV_present_video</a></td></tr>\r\n<tr><td class=\"num\">27</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/glx_swap_group.txt\">NV_swap_group</a></td></tr>\r\n<tr><td class=\"num\">28</td><td>&nbsp;</td><td><a href=\"http://oss.sgi.com/projects/ogl-sample/registry/NV/vertex_array_range.txt\">NV_vertex_array_range</a></td></tr>\r\n<tr><td class=\"num\">29</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/glx_video_out.txt\">NV_video_output</a></td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">30</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/OML/glx_swap_method.txt\">OML_swap_method</a></td></tr>\r\n<tr><td class=\"num\">31</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/OML/glx_sync_control.txt\">OML_sync_control</a></td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">32</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIS/blended_overlay.txt\">SGIS_blended_overlay</a></td></tr>\r\n<tr><td class=\"num\">33</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIS/color_range.txt\">SGIS_color_range</a></td></tr>\r\n<tr><td class=\"num\">34</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIS/multisample.txt\">SGIS_multisample</a></td></tr>\r\n<tr><td class=\"num\">35</td><td>&nbsp;</td><td>SGIS_shared_multisample</td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">36</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIX/fbconfig.txt\">SGIX_fbconfig</a></td></tr>\r\n<tr><td class=\"num\">37</td><td>&nbsp;</td><td><a href=\"http://oss.sgi.com/projects/ogl-sample/registry/SGIX/hyperpipe_group.txt\">SGIX_hyperpipe</a></td></tr>\r\n<tr><td class=\"num\">38</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIX/pbuffer.txt\">SGIX_pbuffer</a></td></tr>\r\n<tr><td class=\"num\">39</td><td>&nbsp;</td><td><a href=\"http://oss.sgi.com/projects/ogl-sample/registry/SGIX/swap_barrier.txt\">SGIX_swap_barrier</a></td></tr>\r\n<tr><td class=\"num\">40</td><td>&nbsp;</td><td><a href=\"http://oss.sgi.com/projects/ogl-sample/registry/SGIX/swap_group.txt\">SGIX_swap_group</a></td></tr>\r\n<tr><td class=\"num\">41</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIX/video_resize.txt\">SGIX_video_resize</a></td></tr>\r\n<tr><td class=\"num\">42</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGIX/visual_select_group.txt\">SGIX_visual_select_group</a></td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">43</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGI/cushion.txt\">SGI_cushion</a></td></tr>\r\n<tr><td class=\"num\">44</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGI/make_current_read.txt\">SGI_make_current_read</a></td></tr>\r\n<tr><td class=\"num\">45</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGI/swap_control.txt\">SGI_swap_control</a></td></tr>\r\n<tr><td class=\"num\">46</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SGI/video_sync.txt\">SGI_video_sync</a></td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">47</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/SUN/get_transparent_index.txt\">SUN_get_transparent_index</a></td></tr>\r\n<tr><td class=\"num\">48</td><td>&nbsp;</td><td><a href=\"http://wwws.sun.com/software/graphics/opengl/extensions/glx_sun_video_resize.txt\">SUN_video_resize</a></td></tr>\r\n</table>\r\n<!-- begin footer.html -->\r\n</td></tr></table></body>\r\n<!-- end footer.html -->\r\n\r\n"
  },
  {
    "path": "libs/glew/doc/gpl.txt",
    "content": "\t\t    GNU GENERAL PUBLIC LICENSE\r\n\t\t       Version 2, June 1991\r\n\r\n Copyright (C) 1989, 1991 Free Software Foundation, Inc.\r\n\t51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\r\n Everyone is permitted to copy and distribute verbatim copies\r\n of this license document, but changing it is not allowed.\r\n\r\n\t\t\t    Preamble\r\n\r\n  The licenses for most software are designed to take away your\r\nfreedom to share and change it.  By contrast, the GNU General Public\r\nLicense is intended to guarantee your freedom to share and change free\r\nsoftware--to make sure the software is free for all its users.  This\r\nGeneral Public License applies to most of the Free Software\r\nFoundation's software and to any other program whose authors commit to\r\nusing it.  (Some other Free Software Foundation software is covered by\r\nthe GNU Library General Public License instead.)  You can apply it to\r\nyour programs, too.\r\n\r\n  When we speak of free software, we are referring to freedom, not\r\nprice.  Our General Public Licenses are designed to make sure that you\r\nhave the freedom to distribute copies of free software (and charge for\r\nthis service if you wish), that you receive source code or can get it\r\nif you want it, that you can change the software or use pieces of it\r\nin new free programs; and that you know you can do these things.\r\n\r\n  To protect your rights, we need to make restrictions that forbid\r\nanyone to deny you these rights or to ask you to surrender the rights.\r\nThese restrictions translate to certain responsibilities for you if you\r\ndistribute copies of the software, or if you modify it.\r\n\r\n  For example, if you distribute copies of such a program, whether\r\ngratis or for a fee, you must give the recipients all the rights that\r\nyou have.  You must make sure that they, too, receive or can get the\r\nsource code.  And you must show them these terms so they know their\r\nrights.\r\n\r\n  We protect your rights with two steps: (1) copyright the software, and\r\n(2) offer you this license which gives you legal permission to copy,\r\ndistribute and/or modify the software.\r\n\r\n  Also, for each author's protection and ours, we want to make certain\r\nthat everyone understands that there is no warranty for this free\r\nsoftware.  If the software is modified by someone else and passed on, we\r\nwant its recipients to know that what they have is not the original, so\r\nthat any problems introduced by others will not reflect on the original\r\nauthors' reputations.\r\n\r\n  Finally, any free program is threatened constantly by software\r\npatents.  We wish to avoid the danger that redistributors of a free\r\nprogram will individually obtain patent licenses, in effect making the\r\nprogram proprietary.  To prevent this, we have made it clear that any\r\npatent must be licensed for everyone's free use or not licensed at all.\r\n\r\n  The precise terms and conditions for copying, distribution and\r\nmodification follow.\r\n\f\r\n\t\t    GNU GENERAL PUBLIC LICENSE\r\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\r\n\r\n  0. This License applies to any program or other work which contains\r\na notice placed by the copyright holder saying it may be distributed\r\nunder the terms of this General Public License.  The \"Program\", below,\r\nrefers to any such program or work, and a \"work based on the Program\"\r\nmeans either the Program or any derivative work under copyright law:\r\nthat is to say, a work containing the Program or a portion of it,\r\neither verbatim or with modifications and/or translated into another\r\nlanguage.  (Hereinafter, translation is included without limitation in\r\nthe term \"modification\".)  Each licensee is addressed as \"you\".\r\n\r\nActivities other than copying, distribution and modification are not\r\ncovered by this License; they are outside its scope.  The act of\r\nrunning the Program is not restricted, and the output from the Program\r\nis covered only if its contents constitute a work based on the\r\nProgram (independent of having been made by running the Program).\r\nWhether that is true depends on what the Program does.\r\n\r\n  1. You may copy and distribute verbatim copies of the Program's\r\nsource code as you receive it, in any medium, provided that you\r\nconspicuously and appropriately publish on each copy an appropriate\r\ncopyright notice and disclaimer of warranty; keep intact all the\r\nnotices that refer to this License and to the absence of any warranty;\r\nand give any other recipients of the Program a copy of this License\r\nalong with the Program.\r\n\r\nYou may charge a fee for the physical act of transferring a copy, and\r\nyou may at your option offer warranty protection in exchange for a fee.\r\n\r\n  2. You may modify your copy or copies of the Program or any portion\r\nof it, thus forming a work based on the Program, and copy and\r\ndistribute such modifications or work under the terms of Section 1\r\nabove, provided that you also meet all of these conditions:\r\n\r\n    a) You must cause the modified files to carry prominent notices\r\n    stating that you changed the files and the date of any change.\r\n\r\n    b) You must cause any work that you distribute or publish, that in\r\n    whole or in part contains or is derived from the Program or any\r\n    part thereof, to be licensed as a whole at no charge to all third\r\n    parties under the terms of this License.\r\n\r\n    c) If the modified program normally reads commands interactively\r\n    when run, you must cause it, when started running for such\r\n    interactive use in the most ordinary way, to print or display an\r\n    announcement including an appropriate copyright notice and a\r\n    notice that there is no warranty (or else, saying that you provide\r\n    a warranty) and that users may redistribute the program under\r\n    these conditions, and telling the user how to view a copy of this\r\n    License.  (Exception: if the Program itself is interactive but\r\n    does not normally print such an announcement, your work based on\r\n    the Program is not required to print an announcement.)\r\n\f\r\nThese requirements apply to the modified work as a whole.  If\r\nidentifiable sections of that work are not derived from the Program,\r\nand can be reasonably considered independent and separate works in\r\nthemselves, then this License, and its terms, do not apply to those\r\nsections when you distribute them as separate works.  But when you\r\ndistribute the same sections as part of a whole which is a work based\r\non the Program, the distribution of the whole must be on the terms of\r\nthis License, whose permissions for other licensees extend to the\r\nentire whole, and thus to each and every part regardless of who wrote it.\r\n\r\nThus, it is not the intent of this section to claim rights or contest\r\nyour rights to work written entirely by you; rather, the intent is to\r\nexercise the right to control the distribution of derivative or\r\ncollective works based on the Program.\r\n\r\nIn addition, mere aggregation of another work not based on the Program\r\nwith the Program (or with a work based on the Program) on a volume of\r\na storage or distribution medium does not bring the other work under\r\nthe scope of this License.\r\n\r\n  3. You may copy and distribute the Program (or a work based on it,\r\nunder Section 2) in object code or executable form under the terms of\r\nSections 1 and 2 above provided that you also do one of the following:\r\n\r\n    a) Accompany it with the complete corresponding machine-readable\r\n    source code, which must be distributed under the terms of Sections\r\n    1 and 2 above on a medium customarily used for software interchange; or,\r\n\r\n    b) Accompany it with a written offer, valid for at least three\r\n    years, to give any third party, for a charge no more than your\r\n    cost of physically performing source distribution, a complete\r\n    machine-readable copy of the corresponding source code, to be\r\n    distributed under the terms of Sections 1 and 2 above on a medium\r\n    customarily used for software interchange; or,\r\n\r\n    c) Accompany it with the information you received as to the offer\r\n    to distribute corresponding source code.  (This alternative is\r\n    allowed only for noncommercial distribution and only if you\r\n    received the program in object code or executable form with such\r\n    an offer, in accord with Subsection b above.)\r\n\r\nThe source code for a work means the preferred form of the work for\r\nmaking modifications to it.  For an executable work, complete source\r\ncode means all the source code for all modules it contains, plus any\r\nassociated interface definition files, plus the scripts used to\r\ncontrol compilation and installation of the executable.  However, as a\r\nspecial exception, the source code distributed need not include\r\nanything that is normally distributed (in either source or binary\r\nform) with the major components (compiler, kernel, and so on) of the\r\noperating system on which the executable runs, unless that component\r\nitself accompanies the executable.\r\n\r\nIf distribution of executable or object code is made by offering\r\naccess to copy from a designated place, then offering equivalent\r\naccess to copy the source code from the same place counts as\r\ndistribution of the source code, even though third parties are not\r\ncompelled to copy the source along with the object code.\r\n\f\r\n  4. You may not copy, modify, sublicense, or distribute the Program\r\nexcept as expressly provided under this License.  Any attempt\r\notherwise to copy, modify, sublicense or distribute the Program is\r\nvoid, and will automatically terminate your rights under this License.\r\nHowever, parties who have received copies, or rights, from you under\r\nthis License will not have their licenses terminated so long as such\r\nparties remain in full compliance.\r\n\r\n  5. You are not required to accept this License, since you have not\r\nsigned it.  However, nothing else grants you permission to modify or\r\ndistribute the Program or its derivative works.  These actions are\r\nprohibited by law if you do not accept this License.  Therefore, by\r\nmodifying or distributing the Program (or any work based on the\r\nProgram), you indicate your acceptance of this License to do so, and\r\nall its terms and conditions for copying, distributing or modifying\r\nthe Program or works based on it.\r\n\r\n  6. Each time you redistribute the Program (or any work based on the\r\nProgram), the recipient automatically receives a license from the\r\noriginal licensor to copy, distribute or modify the Program subject to\r\nthese terms and conditions.  You may not impose any further\r\nrestrictions on the recipients' exercise of the rights granted herein.\r\nYou are not responsible for enforcing compliance by third parties to\r\nthis License.\r\n\r\n  7. If, as a consequence of a court judgment or allegation of patent\r\ninfringement or for any other reason (not limited to patent issues),\r\nconditions are imposed on you (whether by court order, agreement or\r\notherwise) that contradict the conditions of this License, they do not\r\nexcuse you from the conditions of this License.  If you cannot\r\ndistribute so as to satisfy simultaneously your obligations under this\r\nLicense and any other pertinent obligations, then as a consequence you\r\nmay not distribute the Program at all.  For example, if a patent\r\nlicense would not permit royalty-free redistribution of the Program by\r\nall those who receive copies directly or indirectly through you, then\r\nthe only way you could satisfy both it and this License would be to\r\nrefrain entirely from distribution of the Program.\r\n\r\nIf any portion of this section is held invalid or unenforceable under\r\nany particular circumstance, the balance of the section is intended to\r\napply and the section as a whole is intended to apply in other\r\ncircumstances.\r\n\r\nIt is not the purpose of this section to induce you to infringe any\r\npatents or other property right claims or to contest validity of any\r\nsuch claims; this section has the sole purpose of protecting the\r\nintegrity of the free software distribution system, which is\r\nimplemented by public license practices.  Many people have made\r\ngenerous contributions to the wide range of software distributed\r\nthrough that system in reliance on consistent application of that\r\nsystem; it is up to the author/donor to decide if he or she is willing\r\nto distribute software through any other system and a licensee cannot\r\nimpose that choice.\r\n\r\nThis section is intended to make thoroughly clear what is believed to\r\nbe a consequence of the rest of this License.\r\n\f\r\n  8. If the distribution and/or use of the Program is restricted in\r\ncertain countries either by patents or by copyrighted interfaces, the\r\noriginal copyright holder who places the Program under this License\r\nmay add an explicit geographical distribution limitation excluding\r\nthose countries, so that distribution is permitted only in or among\r\ncountries not thus excluded.  In such case, this License incorporates\r\nthe limitation as if written in the body of this License.\r\n\r\n  9. The Free Software Foundation may publish revised and/or new versions\r\nof the General Public License from time to time.  Such new versions will\r\nbe similar in spirit to the present version, but may differ in detail to\r\naddress new problems or concerns.\r\n\r\nEach version is given a distinguishing version number.  If the Program\r\nspecifies a version number of this License which applies to it and \"any\r\nlater version\", you have the option of following the terms and conditions\r\neither of that version or of any later version published by the Free\r\nSoftware Foundation.  If the Program does not specify a version number of\r\nthis License, you may choose any version ever published by the Free Software\r\nFoundation.\r\n\r\n  10. If you wish to incorporate parts of the Program into other free\r\nprograms whose distribution conditions are different, write to the author\r\nto ask for permission.  For software which is copyrighted by the Free\r\nSoftware Foundation, write to the Free Software Foundation; we sometimes\r\nmake exceptions for this.  Our decision will be guided by the two goals\r\nof preserving the free status of all derivatives of our free software and\r\nof promoting the sharing and reuse of software generally.\r\n\r\n\t\t\t    NO WARRANTY\r\n\r\n  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\r\nFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\r\nOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\r\nPROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\r\nOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\r\nTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\r\nPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\r\nREPAIR OR CORRECTION.\r\n\r\n  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\r\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\r\nREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\r\nINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\r\nOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\r\nTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\r\nYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\r\nPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\r\nPOSSIBILITY OF SUCH DAMAGES.\r\n\r\n\t\t     END OF TERMS AND CONDITIONS\r\n\f\r\n\t    How to Apply These Terms to Your New Programs\r\n\r\n  If you develop a new program, and you want it to be of the greatest\r\npossible use to the public, the best way to achieve this is to make it\r\nfree software which everyone can redistribute and change under these terms.\r\n\r\n  To do so, attach the following notices to the program.  It is safest\r\nto attach them to the start of each source file to most effectively\r\nconvey the exclusion of warranty; and each file should have at least\r\nthe \"copyright\" line and a pointer to where the full notice is found.\r\n\r\n    <one line to give the program's name and a brief idea of what it does.>\r\n    Copyright (C) <year>  <name of author>\r\n\r\n    This program is free software; you can redistribute it and/or modify\r\n    it under the terms of the GNU General Public License as published by\r\n    the Free Software Foundation; either version 2 of the License, or\r\n    (at your option) any later version.\r\n\r\n    This program is distributed in the hope that it will be useful,\r\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n    GNU General Public License for more details.\r\n\r\n    You should have received a copy of the GNU General Public License\r\n    along with this program; if not, write to the Free Software\r\n    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA\r\n\r\n\r\nAlso add information on how to contact you by electronic and paper mail.\r\n\r\nIf the program is interactive, make it output a short notice like this\r\nwhen it starts in an interactive mode:\r\n\r\n    Gnomovision version 69, Copyright (C) year  name of author\r\n    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\r\n    This is free software, and you are welcome to redistribute it\r\n    under certain conditions; type `show c' for details.\r\n\r\nThe hypothetical commands `show w' and `show c' should show the appropriate\r\nparts of the General Public License.  Of course, the commands you use may\r\nbe called something other than `show w' and `show c'; they could even be\r\nmouse-clicks or menu items--whatever suits your program.\r\n\r\nYou should also get your employer (if you work as a programmer) or your\r\nschool, if any, to sign a \"copyright disclaimer\" for the program, if\r\nnecessary.  Here is a sample; alter the names:\r\n\r\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the program\r\n  `Gnomovision' (which makes passes at compilers) written by James Hacker.\r\n\r\n  <signature of Ty Coon>, 1 April 1989\r\n  Ty Coon, President of Vice\r\n\r\nThis General Public License does not permit incorporating your program into\r\nproprietary programs.  If your program is a subroutine library, you may\r\nconsider it more useful to permit linking proprietary applications with the\r\nlibrary.  If this is what you want to do, use the GNU Library General\r\nPublic License instead of this License.\r\n"
  },
  {
    "path": "libs/glew/doc/index.html",
    "content": "<!-- begin header.html -->\r\n<!--\r\nThe OpenGL Extension Wrangler Library\r\nCopyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>\r\nCopyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>\r\nCopyright (C) 2002, Lev Povalahev\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without \r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n* Redistributions of source code must retain the above copyright notice, \r\n  this list of conditions and the following disclaimer.\r\n* Redistributions in binary form must reproduce the above copyright notice, \r\n  this list of conditions and the following disclaimer in the documentation \r\n  and/or other materials provided with the distribution.\r\n* The name of the author may be used to endorse or promote products \r\n  derived from this software without specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" \r\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE \r\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \r\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \r\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\r\nTHE POSSIBILITY OF SUCH DAMAGE.\r\n-->\r\n<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html/4/loose.dtd\">\r\n<!-- &nbsp;<img src=\"new.png\" height=\"12\" alt=\"NEW!\"> -->\r\n<html>\r\n<head>\r\n<title>GLEW: The OpenGL Extension Wrangler Library</title>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=US-ASCII\"> \r\n<link href=\"glew.css\" type=\"text/css\" rel=\"stylesheet\">\r\n</head>\r\n<body bgcolor=\"#fff0d0\">\r\n<table border=\"0\" width=\"100%\" cellpadding=\"12\" cellspacing=\"8\" style=\"height:100%\">\r\n<tr>\r\n<td bgcolor=\"#ffffff\" align=\"left\" valign=\"top\" width=\"200\">\r\n<table border=\"0\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" align=\"left\">\r\n<tr>\r\n<td valign=\"top\">\r\n\r\n<table border=\"0\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" align=\"left\">\r\n<tr><td align=\"center\"><i>Latest Release: <a href=\"https://sourceforge.net/projects/glew/files/glew/1.5.3/\">1.5.3</a></i></td></tr>\r\n<tr><td align=\"center\"><br></td></tr>\r\n<tr><td align=\"center\"><img src=\"./glew.png\" alt=\"GLEW Logo\" width=\"97\" height=\"75\"></td></tr>\r\n<tr><td align=\"center\"><br></td></tr>\r\n<tr><td align=\"center\">\r\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\">\r\n<tr><td align=\"center\">Download</td></tr>\r\n<tr><td align=\"center\"><a href=\"install.html\">Installation</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"basic.html\">Basic Usage</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"advanced.html\">Advanced Usage</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"credits.html\">Credits & Copyright</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"log.html\">Change Log</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"http://sourceforge.net/projects/glew/\">Project Page</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"https://sourceforge.net/mail/?group_id=67586\">Mailing Lists</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"http://sourceforge.net/tracker/?group_id=67586\">Bug Tracker</a></td></tr>\r\n</table>\r\n<tr><td align=\"center\"><br></tr>\r\n</table>\r\n</td>\r\n</tr>\r\n<tr>\r\n\r\n<td valign=\"bottom\">\r\n<table border=\"0\" width=\"100%\" cellpadding=\"5\" cellspacing=\"0\" align=\"left\">\r\n<tr><td align=\"center\"><i>Last Update: 02-28-09</i></td></tr>\r\n<tr><td align=\"center\">\r\n<a href=\"http://www.opengl.org\"> <img src=\"./ogl_sm.jpg\" width=\"68\"\r\nheight=\"35\" border=\"0\" alt=\"OpenGL Logo\"></a>\r\n<a href=\"http://sourceforge.net\"> <img\r\nsrc=\"http://sourceforge.net/sflogo.php?group_id=67586&amp;type=1\"\r\nwidth=\"88\" height=\"31\" border=\"0\" alt=\"SourceForge Logo\"></a>\r\n</td>\r\n</tr>\r\n<!--- <tr><td align=\"center\"><a\r\nhref=\"http://sourceforge.net/donate/index.php?group_id=67586\"><img\r\nsrc=\"http://images.sourceforge.net/images/project-support.jpg\"\r\nwidth=\"88\" height=\"32\" border=\"0\" alt=\"Support This Project\"></a></td></tr> -->\r\n</table>\r\n</td>\r\n</tr>\r\n</table>\r\n</td>\r\n\r\n<td bgcolor=\"#ffffff\" align=\"left\" valign=\"top\">\r\n\r\n<h1>The OpenGL Extension Wrangler Library</h1>\r\n\r\n<!-- end header.html -->\r\n\r\n\r\n<p>\r\nThe OpenGL Extension Wrangler Library (GLEW) is a cross-platform\r\nopen-source C/C++ extension loading library.  GLEW provides efficient\r\nrun-time mechanisms for determining which OpenGL extensions are\r\nsupported on the target platform.  OpenGL core and extension\r\nfunctionality is exposed in a single header file.  GLEW has been\r\ntested on a variety of operating systems, including Windows, Linux,\r\nMac OS X, FreeBSD, Irix, and Solaris.\r\n</p>\r\n\r\n<h2>Download Center</h2>\r\n<p>\r\n<a href=\"http://sourceforge.net/projects/glew/\">GLEW</a> is distributed\r\nas source and precompiled binaries. The latest release is\r\n<a href=\"https://sourceforge.net/projects/glew/files/glew/1.5.3/\">1.5.3</a>\r\n[12-31-09]:\r\n</p>\r\n<p>\r\n</p>\r\n<p>\r\n<table border=\"1\" cellpadding=\"5\" cellspacing=\"0\" bgcolor=\"#f0f0f0\" align=\"center\">\r\n<tr>\r\n<td>\r\n<table border=\"0\" cellpadding=\"3\" cellspacing=\"0\">\r\n<tr>\r\n<td></td>\r\n<td align=\"right\"><b>Source</b></td>\r\n<td></td>\r\n<td align=\"left\">\r\n<a href=\"https://sourceforge.net/projects/glew/files/glew/1.5.3/glew-1.5.3.zip/download\">ZIP</a>&nbsp;|&nbsp;\r\n<a href=\"https://sourceforge.net/projects/glew/files/glew/1.5.3/glew-1.5.3.tgz/download\">TGZ</a></td>\r\n<td></td>\r\n</tr>\r\n<tr>\r\n<td></td>\r\n<td align=\"right\"><b>Binaries</b></td>\r\n<td></td>\r\n<td align=\"left\">\r\n<a href=\"https://sourceforge.net/projects/glew/files/glew/1.5.3/glew-1.5.3-win32.zip/download\">Windows 32-bit</a>&nbsp;|&nbsp;\r\n<a href=\"https://sourceforge.net/projects/glew/files/glew/1.5.3/glew-1.5.3-win64.zip/download\">64-bit</a>&nbsp;\r\n</td>\r\n<td></td>\r\n</tr>\r\n</table>\r\n</tr>\r\n</table>\r\n<p></p>\r\n<p>\r\nAn up-to-date copy is also available from the <a\r\nhref=\"http://glew.svn.sourceforge.net/svnroot/glew/trunk/glew/\">project\r\nrepository</a>:\r\n</p>\r\n<p>\r\n<tt>svn co https://glew.svn.sourceforge.net/svnroot/glew/trunk/glew glew</tt>\r\n</p>\r\n\r\n<h2>Supported Extensions</h2>\r\n<p>\r\nThe latest release contains support for OpenGL 3.2 and the following extensions:\r\n</p>\r\n<ul>\r\n<li><a href=\"glew.html\">OpenGL extensions</a>\r\n<li><a href=\"wglew.html\">WGL extensions</a>\r\n<li><a href=\"glxew.html\">GLX extensions</a>\r\n</ul>\r\n\r\n<h2>News</h2>\r\n<ul>\r\n<li>[02-28-10] <a href=\"https://sourceforge.net/projects/glew/files/glew/1.5.3/\">GLEW 1.5.3</a> fixes minor bugs and adds three new extensions</li>>\r\n<li>[12-31-09] <a href=\"https://sourceforge.net/projects/glew/files/glew/1.5.2/\">GLEW 1.5.2</a> adds support for OpenGL 3.1, OpenGL 3.2 and new extensions</li>\r\n<li>[11-03-08] <a href=\"https://sourceforge.net/project/showfiles.php?group_id=67586&amp;package_id=67942&amp;release_id=637800\">GLEW 1.5.1</a> adds support for OpenGL 3.0 and 31 new extensions</li>\r\n<li>[12-27-07] <a href=\"https://sourceforge.net/project/showfiles.php?group_id=67586&amp;package_id=67942&amp;release_id=564464\">GLEW 1.5.0</a> is released under less restrictive licenses</li>\r\n<li>[04-27-07] <a href=\"https://sourceforge.net/project/showfiles.php?group_id=67586&amp;package_id=67942&amp;release_id=504079\">GLEW 1.4.0</a> is released</li>\r\n<li>[03-08-07] GLEW is included in the <a href=\"http://developer.nvidia.com/object/sdk_home.html\">NVIDIA OpenGL SDK</a></li>\r\n<li>[03-04-07] <a href=\"https://sourceforge.net/project/showfiles.php?group_id=67586&amp;package_id=67942&amp;release_id=491113\">GLEW 1.3.6</a> is released</li>\r\n<li>[02-28-07] <a href=\"http://glew.svn.sourceforge.net/svnroot/glew/trunk/glew/\">Repository</a> is migrated to SVN</li>\r\n<li>[02-25-07] GLEW is included in the <a href=\"http://www.opengl.org/sdk/\">OpenGL SDK</a></li>\r\n<li>[11-21-06] <a href=\"https://sourceforge.net/project/showfiles.php?group_id=67586&amp;package_id=67942&amp;release_id=465334\">GLEW 1.3.5</a> adds OpenGL 2.1 and NVIDIA G80 extensions</li>\r\n<li>[03-04-06] <a href=\"https://sourceforge.net/project/showfiles.php?group_id=67586&amp;package_id=67942&amp;release_id=398455\">GLEW 1.3.4</a> adds support for five new extensions</li>\r\n<li>[05-16-05] <a href=\"https://sourceforge.net/project/showfiles.php?group_id=67586&amp;package_id=67942&amp;release_id=327647\">GLEW 1.3.3</a> is released</li>\r\n<li>[03-16-05] <a href=\"https://sourceforge.net/project/showfiles.php?group_id=67586&amp;package_id=67942&amp;release_id=313345\">GLEW 1.3.2</a> adds support for GL_APPLE_pixel_buffer</li>\r\n<li>[02-11-05] <a href=\"http://gljava.sourceforge.net/\">gljava</a> and <a href=\"http://sdljava.sourceforge.net/\">sdljava</a> provide a Java binding to OpenGL via GLEW</li>\r\n<li>[02-02-05] <a href=\"https://sourceforge.net/project/showfiles.php?group_id=67586&amp;package_id=67942&amp;release_id=302049\">GLEW 1.3.1</a> adds support for <a href=\"http://www.opengl.org/documentation/extensions/EXT_framebuffer_object.txt\">GL_EXT_framebuffer_object</a></li>\r\n<li>[01-04-05] <a href=\"https://sourceforge.net/project/showfiles.php?group_id=67586&amp;package_id=67942&amp;release_id=294527\">GLEW 1.3.0</a> adds core OpenGL 2.0 support plus many enhancements</li>\r\n<li>[12-22-04] <a href=\"http://glewpy.sf.net/\">GLEWpy</a> Python wrapper announced</li>\r\n<li>[12-12-04] <a href=\"https://sourceforge.net/mail/?group_id=67586\">Mailing lists</a> created on sourceforge</li>\r\n<li>[12-06-04] <a href=\"http://sourceforge.net/project/showfiles.php?group_id=67586&amp;package_id=67942&amp;release_id=287948\">GLEW 1.2.5</a> adds new extensions and support for FreeBSD</li>\r\n</ul>\r\n\r\n<h2>Links</h2>\r\n<ul>\r\n<li><a href=\"http://www.opengl.org/sdk/\">OpenGL Software Development Kit</a></li>\r\n<li><a href=\"http://www.opengl.org/resources/features/OGLextensions/\">All About OpenGL Extensions</a></li>\r\n<li><a href=\"http://www.opengl.org/registry/\">OpenGL Extension Registry</a></li>\r\n<li><a href=\"http://ati.amd.com/developer/sdk/radeonSDK/html/info/Prog3D.html\">ATI OpenGL Extension Specifications</a></li>\r\n<li><a href=\"http://developer.apple.com/graphicsimaging/opengl/extensions.html\">APPLE OpenGL Extensions Guide</a></li>\r\n<li><a href=\"http://developer.nvidia.com/object/nvidia_opengl_specs.html\">NVIDIA OpenGL Extension Specifications</a></li>\r\n</ul>\r\n\r\n<!-- begin footer.html -->\r\n</td></tr></table></body>\r\n<!-- end footer.html -->\r\n\r\n"
  },
  {
    "path": "libs/glew/doc/install.html",
    "content": "<!-- begin header.html -->\r\n<!--\r\nThe OpenGL Extension Wrangler Library\r\nCopyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>\r\nCopyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>\r\nCopyright (C) 2002, Lev Povalahev\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without \r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n* Redistributions of source code must retain the above copyright notice, \r\n  this list of conditions and the following disclaimer.\r\n* Redistributions in binary form must reproduce the above copyright notice, \r\n  this list of conditions and the following disclaimer in the documentation \r\n  and/or other materials provided with the distribution.\r\n* The name of the author may be used to endorse or promote products \r\n  derived from this software without specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" \r\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE \r\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \r\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \r\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\r\nTHE POSSIBILITY OF SUCH DAMAGE.\r\n-->\r\n<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html/4/loose.dtd\">\r\n<!-- &nbsp;<img src=\"new.png\" height=\"12\" alt=\"NEW!\"> -->\r\n<html>\r\n<head>\r\n<title>GLEW: The OpenGL Extension Wrangler Library</title>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=US-ASCII\"> \r\n<link href=\"glew.css\" type=\"text/css\" rel=\"stylesheet\">\r\n</head>\r\n<body bgcolor=\"#fff0d0\">\r\n<table border=\"0\" width=\"100%\" cellpadding=\"12\" cellspacing=\"8\" style=\"height:100%\">\r\n<tr>\r\n<td bgcolor=\"#ffffff\" align=\"left\" valign=\"top\" width=\"200\">\r\n<table border=\"0\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" align=\"left\">\r\n<tr>\r\n<td valign=\"top\">\r\n\r\n<table border=\"0\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" align=\"left\">\r\n<tr><td align=\"center\"><i>Latest Release: <a href=\"https://sourceforge.net/projects/glew/files/glew/1.5.3/\">1.5.3</a></i></td></tr>\r\n<tr><td align=\"center\"><br></td></tr>\r\n<tr><td align=\"center\"><img src=\"./glew.png\" alt=\"GLEW Logo\" width=\"97\" height=\"75\"></td></tr>\r\n<tr><td align=\"center\"><br></td></tr>\r\n<tr><td align=\"center\">\r\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\">\r\n<tr><td align=\"center\"><a href=\"index.html\">Download</a></td></tr>\r\n<tr><td align=\"center\">Installation</td></tr>\r\n<tr><td align=\"center\"><a href=\"basic.html\">Basic Usage</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"advanced.html\">Advanced Usage</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"credits.html\">Credits & Copyright</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"log.html\">Change Log</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"http://sourceforge.net/projects/glew/\">Project Page</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"https://sourceforge.net/mail/?group_id=67586\">Mailing Lists</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"http://sourceforge.net/tracker/?group_id=67586\">Bug Tracker</a></td></tr>\r\n</table>\r\n<tr><td align=\"center\"><br></tr>\r\n</table>\r\n</td>\r\n</tr>\r\n<tr>\r\n\r\n<td valign=\"bottom\">\r\n<table border=\"0\" width=\"100%\" cellpadding=\"5\" cellspacing=\"0\" align=\"left\">\r\n<tr><td align=\"center\"><i>Last Update: 02-28-09</i></td></tr>\r\n<tr><td align=\"center\">\r\n<a href=\"http://www.opengl.org\"> <img src=\"./ogl_sm.jpg\" width=\"68\"\r\nheight=\"35\" border=\"0\" alt=\"OpenGL Logo\"></a>\r\n<a href=\"http://sourceforge.net\"> <img\r\nsrc=\"http://sourceforge.net/sflogo.php?group_id=67586&amp;type=1\"\r\nwidth=\"88\" height=\"31\" border=\"0\" alt=\"SourceForge Logo\"></a>\r\n</td>\r\n</tr>\r\n<!--- <tr><td align=\"center\"><a\r\nhref=\"http://sourceforge.net/donate/index.php?group_id=67586\"><img\r\nsrc=\"http://images.sourceforge.net/images/project-support.jpg\"\r\nwidth=\"88\" height=\"32\" border=\"0\" alt=\"Support This Project\"></a></td></tr> -->\r\n</table>\r\n</td>\r\n</tr>\r\n</table>\r\n</td>\r\n\r\n<td bgcolor=\"#ffffff\" align=\"left\" valign=\"top\">\r\n\r\n<h1>The OpenGL Extension Wrangler Library</h1>\r\n\r\n<!-- end header.html -->\r\n\r\n\r\n<h2>Installation</h2>\r\n\r\n<p>\r\nTo use the shared library version of GLEW, you need to copy the\r\nheaders and libraries into their destination directories. On Windows\r\nthis typically boils down to copying:\r\n</p>\r\n\r\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\"> <!-- bgcolor=\"#f0f0f0\" -->\r\n<tr><td align=\"left\"><tt>bin/glew32.dll</tt></td><td>&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;&nbsp;&nbsp;&nbsp;</td>\r\n<td align=\"left\"><tt>%SystemRoot%/system32</tt></td></tr>\r\n<tr><td align=\"left\"><tt>lib/glew32.lib</tt></td><td>&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;&nbsp;&nbsp;&nbsp;</td>\r\n<td align=\"left\"><tt>{VC Root}/Lib</tt></td></tr>\r\n<tr><td align=\"left\"><tt>include/GL/glew.h</tt></td><td>&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;&nbsp;&nbsp;&nbsp;</td>\r\n<td align=\"left\"><tt>{VC Root}/Include/GL</tt></td></tr>\r\n<tr><td align=\"left\"><tt>include/GL/wglew.h</tt></td><td>&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;&nbsp;&nbsp;&nbsp;</td>\r\n<td align=\"left\"><tt>{VC Root}/Include/GL</tt></td></tr>\r\n</table>\r\n<p>\r\n</p>\r\n\r\n<p>\r\nwhere <tt>{VC Root}</tt> is the Visual C++ root directory, typically\r\n<tt>C:/Program Files/Microsoft Visual Studio/VC98</tt> for Visual\r\nStudio 6.0 or <tt>C:/Program Files/Microsoft Visual\r\nStudio .NET 2003/Vc7/PlatformSDK</tt> for Visual Studio .NET.\r\n</p>\r\n\r\n<p>\r\nOn Unix, typing <tt>make install</tt> will attempt to install GLEW\r\ninto <tt>/usr/include/GL</tt> and <tt>/usr/lib</tt>.  You can\r\ncustomize the installation target via the <tt>GLEW_DEST</tt>\r\nenvironment variable if you do not have write access to these\r\ndirectories.\r\n</p>\r\n\r\n<h2>Building Your Project with GLEW</h2>\r\n<p>\r\nThere are two ways to build your project with GLEW.\r\n</p>\r\n<h3>Including the source files / project file</h3>\r\n<p>\r\nThe simpler but less flexible way is to include <tt>glew.h</tt> and\r\n<tt>glew.c</tt> into your project.  On Windows, you also need to\r\ndefine the <tt>GLEW_STATIC</tt> preprocessor token when building a\r\nstatic library or executable, and the <tt>GLEW_BUILD</tt> preprocessor\r\ntoken when building a dll.  You also need to replace\r\n<tt>&lt;GL/gl.h&gt;</tt> and <tt>&lt;GL/glu.h&gt;</tt> with\r\n<tt>&lt;glew.h&gt;</tt> in your code and set the appropriate include\r\nflag (<tt>-I</tt>) to tell the compiler where to look for it.  For\r\nexample:\r\n</p>\r\n<p class=\"pre\">\r\n#include &lt;glew.h&gt;<br>\r\n#include &lt;GL/glut.h&gt;<br>\r\n&lt;gl, glu, and glut functionality is available here&gt;<br>\r\n</p>\r\n<p>\r\nDepending on where you put <tt>glew.h</tt> you may also need to change\r\nthe include directives in <tt>glew.c</tt>. Note that if you are using\r\nGLEW together with GLUT, you have to include <tt>glew.h</tt> first.\r\nIn addition, <tt>glew.h</tt> includes <tt>glu.h</tt>, so you do not\r\nneed to include it separately.\r\n</p>\r\n<p>\r\nOn Windows, you also have the option of adding the supplied project\r\nfile <tt>glew_static.dsp</tt> to your workspace (solution) and compile\r\nit together with your other projects.  In this case you also need to\r\nchange the <tt>GLEW_BUILD</tt> preprocessor constant to\r\n<tt>GLEW_STATIC</tt> when building a static library or executable,\r\notherwise you get build errors.\r\n</p>\r\n<p>\r\n<b>Note that GLEW does not use the C\r\nruntime library, so it does not matter which version (single-threaded,\r\nmulti-threaded or multi-threaded DLL) it is linked with (without\r\ndebugging information). It is, however, always a good idea to compile all\r\nyour projects including GLEW with the same C runtime settings.</b>\r\n</p>\r\n\r\n<h3>Using GLEW as a shared library</h3>\r\n\r\n<p>\r\nAlternatively, you can use the provided project files / makefile to\r\nbuild a separate shared library you can link your projects with later.\r\nIn this case the best practice is to install <tt>glew.h</tt>,\r\n<tt>glew32.lib</tt>, and <tt>glew32.dll</tt> / <tt>libGLEW.so</tt> to\r\nwhere the OpenGL equivalents <tt>gl.h</tt>, <tt>opengl32.lib</tt>, and\r\n<tt>opengl32.dll</tt> / <tt>libGL.so</tt> are located.  Note that you\r\nneed administrative privileges to do this.  If you do not have\r\nadministrator access and your system administrator will not do it for\r\nyou, you can install GLEW into your own lib and include subdirectories\r\nand tell the compiler where to find it. Then you can just replace\r\n<tt>&lt;GL/gl.h&gt;</tt> with <tt>&lt;GL/glew.h&gt;</tt> in your\r\nprogram:\r\n</p>\r\n\r\n<p class=\"pre\">\r\n#include &lt;GL/glew.h&gt;<br>\r\n#include &lt;GL/glut.h&gt;<br>\r\n&lt;gl, glu, and glut functionality is available here&gt;<br>\r\n</p>\r\n\r\n<p>\r\nor:\r\n</p>\r\n\r\n<p class=\"pre\">\r\n#include &lt;GL/glew.h&gt;<br>\r\n&lt;gl and glu functionality is available here&gt;<br>\r\n</p>\r\n\r\n<p>\r\nRemember to link your project with <tt>glew32.lib</tt>,\r\n<tt>glu32.lib</tt>, and <tt>opengl32.lib</tt> on Windows and\r\n<tt>libGLEW.so</tt>, <tt>libGLU.so</tt>, and <tt>libGL.so</tt> on\r\nUnix (<tt>-lGLEW -lGLU -lGL</tt>).\r\n</p>\r\n\r\n<p>\r\nIt is important to keep in mind that <tt>glew.h</tt> includes neither\r\n<tt>windows.h</tt> nor <tt>gl.h</tt>.  Also, GLEW will warn you by\r\nissuing a preprocessor error in case you have included <tt>gl.h</tt>,\r\n<tt>glext.h</tt>, or <tt>glATI.h</tt> before <tt>glew.h</tt>.\r\n</p>\r\n\r\n<!-- begin footer.html -->\r\n</td></tr></table></body>\r\n<!-- end footer.html -->\r\n\r\n"
  },
  {
    "path": "libs/glew/doc/khronos.txt",
    "content": "Copyright (c) 2007 The Khronos Group Inc.\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a\r\ncopy of this software and/or associated documentation files (the\r\n\"Materials\"), to deal in the Materials without restriction, including\r\nwithout limitation the rights to use, copy, modify, merge, publish,\r\ndistribute, sublicense, and/or sell copies of the Materials, and to\r\npermit persons to whom the Materials are furnished to do so, subject to\r\nthe following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included\r\nin all copies or substantial portions of the Materials.\r\n\r\nTHE MATERIALS ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\r\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\r\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\r\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\r\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\r\nMATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.\r\n"
  },
  {
    "path": "libs/glew/doc/log.html",
    "content": "<!-- begin header.html -->\r\n<!--\r\nThe OpenGL Extension Wrangler Library\r\nCopyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>\r\nCopyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>\r\nCopyright (C) 2002, Lev Povalahev\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without \r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n* Redistributions of source code must retain the above copyright notice, \r\n  this list of conditions and the following disclaimer.\r\n* Redistributions in binary form must reproduce the above copyright notice, \r\n  this list of conditions and the following disclaimer in the documentation \r\n  and/or other materials provided with the distribution.\r\n* The name of the author may be used to endorse or promote products \r\n  derived from this software without specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" \r\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE \r\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \r\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \r\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\r\nTHE POSSIBILITY OF SUCH DAMAGE.\r\n-->\r\n<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html/4/loose.dtd\">\r\n<!-- &nbsp;<img src=\"new.png\" height=\"12\" alt=\"NEW!\"> -->\r\n<html>\r\n<head>\r\n<title>GLEW: The OpenGL Extension Wrangler Library</title>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=US-ASCII\"> \r\n<link href=\"glew.css\" type=\"text/css\" rel=\"stylesheet\">\r\n</head>\r\n<body bgcolor=\"#fff0d0\">\r\n<table border=\"0\" width=\"100%\" cellpadding=\"12\" cellspacing=\"8\" style=\"height:100%\">\r\n<tr>\r\n<td bgcolor=\"#ffffff\" align=\"left\" valign=\"top\" width=\"200\">\r\n<table border=\"0\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" align=\"left\">\r\n<tr>\r\n<td valign=\"top\">\r\n\r\n<table border=\"0\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" align=\"left\">\r\n<tr><td align=\"center\"><i>Latest Release: <a href=\"https://sourceforge.net/projects/glew/files/glew/1.5.3/\">1.5.3</a></i></td></tr>\r\n<tr><td align=\"center\"><br></td></tr>\r\n<tr><td align=\"center\"><img src=\"./glew.png\" alt=\"GLEW Logo\" width=\"97\" height=\"75\"></td></tr>\r\n<tr><td align=\"center\"><br></td></tr>\r\n<tr><td align=\"center\">\r\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\">\r\n<tr><td align=\"center\"><a href=\"index.html\">Download</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"install.html\">Installation</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"basic.html\">Basic Usage</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"advanced.html\">Advanced Usage</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"credits.html\">Credits & Copyright</a></td></tr>\r\n<tr><td align=\"center\">Change Log</td></tr>\r\n<tr><td align=\"center\"><a href=\"http://sourceforge.net/projects/glew/\">Project Page</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"https://sourceforge.net/mail/?group_id=67586\">Mailing Lists</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"http://sourceforge.net/tracker/?group_id=67586\">Bug Tracker</a></td></tr>\r\n</table>\r\n<tr><td align=\"center\"><br></tr>\r\n</table>\r\n</td>\r\n</tr>\r\n<tr>\r\n\r\n<td valign=\"bottom\">\r\n<table border=\"0\" width=\"100%\" cellpadding=\"5\" cellspacing=\"0\" align=\"left\">\r\n<tr><td align=\"center\"><i>Last Update: 02-28-09</i></td></tr>\r\n<tr><td align=\"center\">\r\n<a href=\"http://www.opengl.org\"> <img src=\"./ogl_sm.jpg\" width=\"68\"\r\nheight=\"35\" border=\"0\" alt=\"OpenGL Logo\"></a>\r\n<a href=\"http://sourceforge.net\"> <img\r\nsrc=\"http://sourceforge.net/sflogo.php?group_id=67586&amp;type=1\"\r\nwidth=\"88\" height=\"31\" border=\"0\" alt=\"SourceForge Logo\"></a>\r\n</td>\r\n</tr>\r\n<!--- <tr><td align=\"center\"><a\r\nhref=\"http://sourceforge.net/donate/index.php?group_id=67586\"><img\r\nsrc=\"http://images.sourceforge.net/images/project-support.jpg\"\r\nwidth=\"88\" height=\"32\" border=\"0\" alt=\"Support This Project\"></a></td></tr> -->\r\n</table>\r\n</td>\r\n</tr>\r\n</table>\r\n</td>\r\n\r\n<td bgcolor=\"#ffffff\" align=\"left\" valign=\"top\">\r\n\r\n<h1>The OpenGL Extension Wrangler Library</h1>\r\n\r\n<!-- end header.html -->\r\n\r\n\r\n<h2>Change Log</h2>\r\n\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.5.3</b> [02-28-10]\r\n<ul>\r\n<li> New extensions:\r\n<ul>\r\n<li> GLX_INTEL_swap_event\r\n<li> GL_AMD_seamless_cubemap_per_texture\r\n<li> GL_AMD_shader_stencil_export\r\n</ul>\r\n<li> Bug fixes:\r\n<ul>\r\n<li> Correct version detection for GL 3.1 and 3.2\r\n<li> Missing 3.1 enumerants\r\n<li> Add glew.pc\r\n</ul>\r\n</ul>\r\n</ul>\r\n\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.5.2</b> [12-31-09]\r\n<ul>\r\n<li> New features:\r\n<ul>\r\n<li> Support for OpenGL 3.1\r\n<li> Support for OpenGL 3.2\r\n</ul>\r\n<li> New extensions:\r\n<ul>\r\n<li> GL_AMD_draw_buffers_blend\r\n<li> GL_AMD_performance_monitor\r\n<li> GL_AMD_texture_texture4\r\n<li> GL_AMD_vertex_shader_tessellator\r\n<li> GL_APPLE_aux_depth_stencil\r\n<li> GL_APPLE_object_purgeable\r\n<li> GL_APPLE_rgb_422\r\n<li> GL_APPLE_row_bytes\r\n<li> GL_APPLE_vertex_program_evaluators\r\n<li> GL_ARB_compatibility\r\n<li> GL_ARB_copy_buffer\r\n<li> GL_ARB_depth_clamp\r\n<li> GL_ARB_draw_buffers_blend\r\n<li> GL_ARB_draw_elements_base_vertex\r\n<li> GL_ARB_fragment_coord_conventions\r\n<li> GL_ARB_provoking_vertex\r\n<li> GL_ARB_sample_shading\r\n<li> GL_ARB_seamless_cube_map\r\n<li> GL_ARB_shader_texture_lod\r\n<li> GL_ARB_sync\r\n<li> GL_ARB_texture_cube_map_array\r\n<li> GL_ARB_texture_gather\r\n<li> GL_ARB_texture_multisample\r\n<li> GL_ARB_texture_query_lod\r\n<li> GL_ARB_uniform_buffer_object\r\n<li> GL_ARB_vertex_array_bgra\r\n<li> GL_ATI_meminfo\r\n<li> GL_EXT_provoking_vertex\r\n<li> GL_EXT_separate_shader_objects\r\n<li> GL_EXT_texture_snorm\r\n<li> GL_NV_copy_image\r\n<li> GL_NV_parameter_buffer_object2\r\n<li> GL_NV_shader_buffer_load\r\n<li> GL_NV_texture_barrier\r\n<li> GL_NV_transform_feedback2\r\n<li> GL_NV_vertex_buffer_unified_memory\r\n<li> WGL_AMD_gpu_association\r\n<li> WGL_ARB_create_context_profile\r\n<li> WGL_NV_copy_image\r\n<li> GLX_ARB_create_context_profile\r\n<li> GLX_EXT_swap_control\r\n<li> GLX_NV_copy_image\r\n</ul>\r\n<li> Bug fixes:\r\n<ul>\r\n<li> DOS line endings for windows .zip archives only.\r\n<li> glTransformFeedbackVaryings arguments.\r\n<li> Resource leak in glewinfo and visualinfo tools.\r\n<li> WIN32_LEAN_AND_MEAN preprocessor pollution.\r\n<li> Fixed version detection for GLEW_VERSION_2_1 and GLEW_VERSION_3_0.\r\n<li> MesaGLUT glut.h GLAPIENTRY dependency.\r\n<li> glFramebufferTextureLayer correction.\r\n<li> OSX compiler warnings resolved.\r\n<li> Cygwin linking to opengl32 by default, rather than X11 OpenGL.\r\n<li> SnowLeopard (OSX 10.6) gl.h detection.\r\n<li> Use $(STRIP) consistently.\r\n</ul>\r\n</ul>\r\n</ul>\r\n\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.5.1</b> [11-03-08]\r\n<ul>\r\n<li> New features:\r\n<ul>\r\n<li> Support for OpenGL 3.0\r\n</ul>\r\n<li> New extensions:\r\n<ul>\r\n<li> GL_ARB_depth_buffer_float\r\n<li> GL_ARB_draw_instance,\r\n<li> GL_ARB_framebuffer_object\r\n<li> GL_ARB_framebuffer_sRGB\r\n<li> GL_ARB_geometry_shader4\r\n<li> GL_ARB_half_float_pixel\r\n<li> GL_ARB_half_float_vertex\r\n<li> GL_ARB_instanced_arrays\r\n<li> GL_ARB_map_buffer_range\r\n<li> GL_ARB_texture_buffer_object\r\n<li> GL_ARB_texture_compression_rgtc\r\n<li> GL_ARB_vertex_array_object\r\n<li> GL_EXT_direct_state_access\r\n<li> GL_EXT_texture_swizzle\r\n<li> GL_EXT_transform_feedback\r\n<li> GL_EXT_vertex_array_bgra\r\n<li> GL_NV_conditional_render\r\n<li> GL_NV_explicit_multisample\r\n<li> GL_NV_present_video\r\n<li> GL_SGIS_point_line_texgen\r\n<li> GL_SGIX_convolution_accuracy\r\n<li> WGL_ARB_create_context\r\n<li> WGL_ARB_framebuffer_sRGB\r\n<li> WGL_NV_present_video\r\n<li> WGL_NV_swap_group\r\n<li> WGL_NV_video_output\r\n<li> GLX_ARB_create_context\r\n<li> GLX_ARB_framebuffer_sRGB\r\n<li> GLX_NV_present_video\r\n<li> GLX_NV_swap_group\r\n<li> GLX_NV_video_output\r\n</ul>\r\n<li> Bug fixes:\r\n<ul>\r\n<li> Licensing issues with documentation\r\n<li> Problems with long long and _MSC_VER on MINGW \r\n<li> Incorrect parameter for glGetUniformLocation\r\n<li> glewGetExtension fails on last entry \r\n<li> Incomplete GL_NV_texture_shader tokens\r\n<li> Scripting problems on Cygwin\r\n<li> Incorrect definition for GLint on OS X\r\n</ul> \r\n</ul>\r\n</ul>\r\n\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.5.0</b> [12-27-07]\r\n<ul>\r\n<li> New features:\r\n<ul>\r\n<li> Licensing change (BSD, Mesa 3-D, Khronos)\r\n<li> Switch to using registry on <a href=\"http://www.opengl.org/registry/\">www.opengl.org</a>\r\n<li> Support for major and minor version strings\r\n</ul>\r\n<li> New extensions:\r\n<ul>\r\n<li> GL_APPLE_flush_buffer_range\r\n<li> GL_GREMEDY_frame_terminator\r\n<li> GLX_EXT_texture_from_pixmap\r\n</ul>\r\n<li> Bug fixes:\r\n<ul>\r\n<li> Incorrent 64-bit type definitions\r\n<li> Do not strip static library on install\r\n<li> Missing tokens in GL_ATI_fragment_shader and WGL_{ARB,EXT}_make_current_read\r\n<li> Missing tokens in GL_VERSION_2_1\r\n<li> Missing functions in GL_VERSION_1_4\r\n<li> Incorrect parameter type for glXCopyContext\r\n</ul> \r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.4.0</b> [04-27-07]\r\n<ul>\r\n<li> New features:\r\n<ul>\r\n<li> Extension variables are declared const to avoid possible\r\ncorruption of their values\r\n</ul>\r\n<li> New extensions:\r\n<ul>\r\n<li> GL_NV_depth_range_unclamped\r\n</ul>\r\n<li> Bug fixes:\r\n<ul>\r\n<li> Incorrect tokens in GL_NV_transform_feedback and GL_NV_framebuffer_multisample_coverage\r\n<li> Incorrect function names in GL_EXT_gpu_program_parameters\r\n<li> Missing tokens in GL_EXT_framebuffer_multisample\r\n<li> GLEW_MX initialization problem for WGL_{ARB,EXT}_extensions_string\r\n</ul> \r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.3.6</b> [03-04-07]\r\n<ul>\r\n<li> New extensions:\r\n<ul>\r\n<li> GL_ATI_shader_texture_lod\r\n<li> GL_EXT_gpu_program_parameters\r\n<li> GL_NV_geometry_shader4\r\n<li> WGL_NV_gpu_affinity\r\n<li> GLX_SGIX_hyperpipe\r\n</ul>\r\n<li> Bug fixes:\r\n<ul>\r\n<li> Missing include guards in glxew.h\r\n<li> Makefile and install problems for Cygwin builds\r\n<li> Install problem for Linux AMD64 builds\r\n<li> Incorrent token in GL_ATI_texture_compression_3dc\r\n<li> Missing tokens from GL_ATIX_point_sprites\r\n</ul>\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.3.5</b> [11-21-06]\r\n<ul>\r\n<li> New features:\r\n<ul>\r\n<li> Support for core OpenGL 2.1\r\n<li> Debug support for glewIsSupported\r\n</ul>\r\n<li> New extensions:\r\n<ul>\r\n<li> GL_EXT_bindable_uniform\r\n<li> GL_EXT_draw_buffers2\r\n<li> GL_EXT_draw_instanced\r\n<li> GL_EXT_framebuffer_sRGB\r\n<li> GL_EXT_geometry_shader4\r\n<li> GL_EXT_gpu_shader4\r\n<li> GL_EXT_packed_float\r\n<li> GL_EXT_texture_array\r\n<li> GL_EXT_texture_buffer_object\r\n<li> GL_EXT_texture_compression_latc\r\n<li> GL_EXT_texture_compression_rgtc\r\n<li> GL_EXT_texture_integer\r\n<li> GL_EXT_texture_shared_exponent\r\n<li> GL_EXT_timer_query\r\n<li> GL_NV_depth_buffer_float\r\n<li> GL_NV_fragment_program4\r\n<li> GL_NV_framebuffer_multisample_coverage\r\n<li> GL_NV_geometry_program4\r\n<li> GL_NV_gpu_program4\r\n<li> GL_NV_parameter_buffer_object\r\n<li> GL_NV_transform_feedback\r\n<li> GL_NV_vertex_program4\r\n<li> GL_OES_byte_coordinates\r\n<li> GL_OES_compressed_paletted_texture\r\n<li> GL_OES_read_format\r\n<li> GL_OES_single_precision\r\n<li> WGL_EXT_pixel_format_packed_float\r\n<li> WGL_EXT_framebuffer_sRGB\r\n<li> GLX_EXT_fbconfig_packed_float\r\n<li> GLX_EXT_framebuffer_sRGB\r\n</ul>\r\n<li> Bug fixes:\r\n<ul>\r\n<li> Wrong GLXContext definition on Solaris\r\n<li> Makefile problem for parallel builds\r\n</ul>\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.3.4</b> [03-04-06]\r\n<ul>\r\n<li> New extensions:\r\n<ul>\r\n<li> GL_EXT_framebuffer_blit\r\n<li> GL_EXT_framebuffer_multisample\r\n<li> GL_EXT_packed_depth_stencil\r\n<li> GL_MESAX_texture_stack\r\n<li> WGL_3DL_stereo_control\r\n</ul>\r\n</ul>\r\n<ul>\r\n<li> Bug fixes:\r\n<ul>\r\n<li> glBlendEquation missing from GL_ARB_imaging\r\n<li> Wrong APIENTRY definition for Cygwin\r\n<li> Incorrect OS X OpenGL types\r\n<li> Unix 64-bit installation patch\r\n</ul>\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.3.3</b> [05-16-05]\r\n<ul>\r\n<li> New feature:\r\n<ul>\r\n<li> Code generation option to split source into multiple files\r\n</ul>\r\n</ul>\r\n<ul>\r\n<li> Bug fixes:\r\n<ul>\r\n<li> OpenGL 2.0 core initialization problems\r\n<li> Wrong value for token GL_SHADER_TYPE\r\n<li> Missing tokens in GL_ATI_fragment_shader\r\n<li> Missing entry points in GL_ARB_transpose_matrix\r\n</ul>\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.3.2</b> [03-16-05]\r\n<ul>\r\n<li> New extension:\r\n<ul>\r\n<li> GL_APPLE_pixel_buffer\r\n</ul>\r\n<li> Bug fixes:\r\n<ul>\r\n<li> Missing OpenGL 2.0 entry points\r\n<li> Missing tokens in GL_SGIX_shadow\r\n<li> MinGW makefile problem\r\n<li> Check for incorrect OpenGL version string on SiS hardware\r\n<li> Documentation update to meet the HTML 4.01 Transitional specification\r\n</ul>\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.3.1</b> [02-02-05]\r\n<ul>\r\n<li> New features:\r\n<ul>\r\n<li> Consistent Unix and Windows versioning\r\n</ul>\r\n<li> New extensions:\r\n<ul>\r\n<li> GL_EXT_framebuffer_object\r\n<li> GL_ARB_pixel_buffer_object\r\n</ul>\r\n<li> Bug fixes:\r\n<ul>\r\n<li> Missing OpenGL 2.0 tokens\r\n<li> Incorrect typedefs (GLhandleARB and GLhalf)\r\n<li> Borland compiler problems\r\n</ul>\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.3.0</b> [01-04-05]\r\n<ul>\r\n<li> New features:\r\n<ul>\r\n<li> Support for core OpenGL 2.0\r\n<li> <tt>glewIsSupported</tt> provides efficient string-based extension checks\r\n<li> Custom code generation from a list of extensions\r\n<li> Makefile changes\r\n</ul>\r\n<li> New extensions:\r\n<ul>\r\n<li> WGL_ATI_render_texture_rectangle\r\n</ul>\r\n<li> Bug fixes:\r\n<ul>\r\n<li> Incorrect function signature in OpenGL 1.5 core\r\n</ul>\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.2.5</b> [12-06-04]\r\n<ul>\r\n<li> New extensions:\r\n<ul>\r\n<li>GL_ATI_texture_compression_3dc\r\n<li>GL_EXT_Cg_shader\r\n<li>GL_EXT_draw_range_elements\r\n<li>GL_KTX_buffer_region\r\n</ul>\r\n<li> Bug fixes:\r\n<ul>\r\n<li> OpenGL version detection bug\r\n<li> Problems with wxWindows and MinGW compilation\r\n<li> <tt>visualinfo</tt> compilation problem with GLEW_MX specified\r\n<li> Wrong token name in OpenGL 1.5 core\r\n</ul>\r\n<li> Support for FreeBSD\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.2.4</b> [09-06-04]\r\n<ul>\r\n<li> Added ARB_draw_buffers and ARB_texture_rectangle\r\n<li> Fixed bug in ARB_shader_objects\r\n<li> Replaced <tt>wglinfo</tt> with <tt>visualinfo</tt>\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.2.3</b> [06-10-04]\r\n<ul>\r\n<li> Added GL_NV_fragment_program2, GL_NV_fragment_program_option, GL_NV_vertex_program2_option, GL_NV_vertex_program3\r\n<li> Bug fix in GL_ARB_vertex_blend\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.2.2</b> [05-08-04]\r\n<ul>\r\n<li> Added GL_EXT_pixel_buffer_object, removed GL_NV_element_array\r\n<li> Fixed GLEW_MX problems\r\n<li> Bug fix in GL_EXT_texture_rectangle and <tt>wglinfo</tt>\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.2.1</b> [03-18-04]\r\n<ul>\r\n<li> Bug fix in OpenGL version query (early release of 1.2.0 contained this bug)\r\n<li> Bug fix in GL_ARB_shader_objects and temporary bug fix in GL_ARB_vertex_shader\r\n<li> Added flags on GDI support and multisampling to <tt>wglinfo</tt>\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.2.0</b> [02-19-04]\r\n<ul>\r\n<li> Added full OpenGL 1.5 support\r\n<li> Added support for multiple rendering contexts with different capabilities\r\n<li> Added command line flags to <tt>glewinfo</tt> for selecting displays and visuals\r\n<li> Added GLX_SGIS_multisample, GLX_SUN_video_resize, and GL_SUN_read_video_pixels\r\n<li> Added MinGW/MSYS support\r\n<li> Bug fixes in GL_ARB_shader_objects and the OS X build\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.1.4</b> [12-15-03]\r\n<ul>\r\n<li> Added GL_APPLE_float_pixels, GL_APPLE_texture_range, \r\nGL_EXT_texture_cube_map, GL_EXT_texture_edge_clamp,\r\nGLX_ATI_pixel_format_float, and GLX_ATI_render_texture\r\n<li> Bug fixes in GL_ATI_map_object_buffer and GL_ATI_fragment_shader\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.1.3</b> [10-28-03]\r\n<ul>\r\n<li> Added Solaris and Darwin support\r\n<li> Added GL_ARB_fragment_shader, GL_ARB_shader_objects, and GL_ARB_vertex_shader\r\n<li> Fixed bug in GL_WIN_swap_hint\r\n<li> Removed <tt>glewinfo</tt>'s dependency on <tt>GLUT</tt>\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.1.2</b> [09-15-03]\r\n<ul>\r\n<li> Removed dependency on WGL_{ARB,EXT}_extensions_string to make GLEW run on Matrox cards\r\n<li> Added glewGetString for querying the GLEW version string\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.1.1</b> [08-11-03]\r\n<ul>\r\n<li> Added GLX_NV_float_buffer, GL_ARB_shading_language_100, and GL_ARB_texture_non_power_of_two\r\n<li> Fixed bug in GL_ARB_vertex_buffer_object\r\n<li> Minor updates in documentation\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.1.0</b> [07-08-03]\r\n<ul>\r\n<li> Added automatic code generation\r\n<li> Added almost every extension in the registry\r\n<li> Added separate namespace\r\n<li> Added Irix support\r\n<li> Updated documentation\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.0.7</b> [06-29-03]\r\n<ul>\r\n<li> Added GL_EXT_depth_bounds_test\r\n<li> Fixed typos\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.0.6</b> [05-05-03]\r\n<ul>\r\n<li> Added ARB_vertex_buffer_object and NV_half_float\r\n<li> Updated <tt>wglinfo</tt>\r\n<li> Temporary Linux bug fixes (problems with SDL and MESA)\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.0.5</b> [02-17-03]\r\n<ul>\r\n<li> Bug fixes\r\n<li> Added <tt>wglinfo</tt>\r\n<li> Updated documentation\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.0.4</b> [02-02-03]\r\n<ul>\r\n<li> Added NV_texture_expand_normal\r\n<li> Added mingw support\r\n<li> Updated documentation\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.0.3</b> [01-09-03]\r\n<ul>\r\n<li> Cleaned up ATI extensions\r\n<li> Changed function prototypes to match glext.h\r\n<li> Added EXT_texture3D\r\n<li> Fixed typos in ATI_vertex_attrib_array_object and ATI_draw_buffers\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.0.2</b> [12-21-02]\r\n<ul>\r\n<li> Added list of supported extensions to documentation\r\n<li> Added NV_half_float and NV_texgen_emboss\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.0.1</b> [12-17-02]\r\n<ul>\r\n<li> Bug fixes\r\n<li> Added glewGetExtension\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n<ul class=\"none\">\r\n<li><b>1.0.0</b> [12-12-02]\r\n<ul>\r\n<li> Initial release\r\n</ul>\r\n</ul>\r\n<hr align=\"center\">\r\n\r\n<!-- begin footer.html -->\r\n</td></tr></table></body>\r\n<!-- end footer.html -->\r\n\r\n"
  },
  {
    "path": "libs/glew/doc/mesa.txt",
    "content": "Mesa 3-D graphics library\r\nVersion:  7.0\r\n\r\nCopyright (C) 1999-2007  Brian Paul   All Rights Reserved.\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a\r\ncopy of this software and associated documentation files (the \"Software\"),\r\nto deal in the Software without restriction, including without limitation\r\nthe rights to use, copy, modify, merge, publish, distribute, sublicense,\r\nand/or sell copies of the Software, and to permit persons to whom the\r\nSoftware is furnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included\r\nin all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r\nBRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN\r\nAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n"
  },
  {
    "path": "libs/glew/doc/wglew.html",
    "content": "<!-- begin header.html -->\r\n<!--\r\nThe OpenGL Extension Wrangler Library\r\nCopyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>\r\nCopyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>\r\nCopyright (C) 2002, Lev Povalahev\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without \r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n* Redistributions of source code must retain the above copyright notice, \r\n  this list of conditions and the following disclaimer.\r\n* Redistributions in binary form must reproduce the above copyright notice, \r\n  this list of conditions and the following disclaimer in the documentation \r\n  and/or other materials provided with the distribution.\r\n* The name of the author may be used to endorse or promote products \r\n  derived from this software without specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" \r\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE \r\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \r\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \r\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\r\nTHE POSSIBILITY OF SUCH DAMAGE.\r\n-->\r\n<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html/4/loose.dtd\">\r\n<!-- &nbsp;<img src=\"new.png\" height=\"12\" alt=\"NEW!\"> -->\r\n<html>\r\n<head>\r\n<title>GLEW: The OpenGL Extension Wrangler Library</title>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=US-ASCII\"> \r\n<link href=\"glew.css\" type=\"text/css\" rel=\"stylesheet\">\r\n</head>\r\n<body bgcolor=\"#fff0d0\">\r\n<table border=\"0\" width=\"100%\" cellpadding=\"12\" cellspacing=\"8\" style=\"height:100%\">\r\n<tr>\r\n<td bgcolor=\"#ffffff\" align=\"left\" valign=\"top\" width=\"200\">\r\n<table border=\"0\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" align=\"left\">\r\n<tr>\r\n<td valign=\"top\">\r\n\r\n<table border=\"0\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" align=\"left\">\r\n<tr><td align=\"center\"><i>Latest Release: <a href=\"https://sourceforge.net/projects/glew/files/glew/1.5.2/\">1.5.2</a></i></td></tr>\r\n<tr><td align=\"center\"><br></td></tr>\r\n<tr><td align=\"center\"><img src=\"./glew.png\" alt=\"GLEW Logo\" width=\"97\" height=\"75\"></td></tr>\r\n<tr><td align=\"center\"><br></td></tr>\r\n<tr><td align=\"center\">\r\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\">\r\n<tr><td align=\"center\"><a href=\"index.html\">Download</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"install.html\">Installation</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"basic.html\">Basic Usage</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"advanced.html\">Advanced Usage</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"credits.html\">Credits & Copyright</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"log.html\">Change Log</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"http://sourceforge.net/projects/glew/\">Project Page</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"https://sourceforge.net/mail/?group_id=67586\">Mailing Lists</a></td></tr>\r\n<tr><td align=\"center\"><a href=\"http://sourceforge.net/tracker/?group_id=67586\">Bug Tracker</a></td></tr>\r\n</table>\r\n<tr><td align=\"center\"><br></tr>\r\n</table>\r\n</td>\r\n</tr>\r\n<tr>\r\n\r\n<td valign=\"bottom\">\r\n<table border=\"0\" width=\"100%\" cellpadding=\"5\" cellspacing=\"0\" align=\"left\">\r\n<tr><td align=\"center\"><i>Last Update: 12-31-09</i></td></tr>\r\n<tr><td align=\"center\">\r\n<a href=\"http://www.opengl.org\"> <img src=\"./ogl_sm.jpg\" width=\"68\"\r\nheight=\"35\" border=\"0\" alt=\"OpenGL Logo\"></a>\r\n<a href=\"http://sourceforge.net\"> <img\r\nsrc=\"http://sourceforge.net/sflogo.php?group_id=67586&amp;type=1\"\r\nwidth=\"88\" height=\"31\" border=\"0\" alt=\"SourceForge Logo\"></a>\r\n</td>\r\n</tr>\r\n<!--- <tr><td align=\"center\"><a\r\nhref=\"http://sourceforge.net/donate/index.php?group_id=67586\"><img\r\nsrc=\"http://images.sourceforge.net/images/project-support.jpg\"\r\nwidth=\"88\" height=\"32\" border=\"0\" alt=\"Support This Project\"></a></td></tr> -->\r\n</table>\r\n</td>\r\n</tr>\r\n</table>\r\n</td>\r\n\r\n<td bgcolor=\"#ffffff\" align=\"left\" valign=\"top\">\r\n\r\n<h1>The OpenGL Extension Wrangler Library</h1>\r\n\r\n<!-- end header.html -->\r\n\r\n\r\n<h2>Supported WGL Extensions</h2>\r\n\r\n<table border=\"0\" width=\"100%\" cellpadding=\"1\" cellspacing=\"0\" align=\"center\">\r\n<tr><td class=\"num\">1</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/3DFX/3dfx_multisample.txt\">3DFX_multisample</a></td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">2</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/3DL/stereo_control.txt\">3DL_stereo_control</a></td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">3</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/AMD/wgl_gpu_association.txt\">AMD_gpu_association</a></td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">4</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/wgl_buffer_region.txt\">ARB_buffer_region</a></td></tr>\r\n<tr><td class=\"num\">5</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/wgl_create_context.txt\">ARB_create_context</a></td></tr>\r\n<tr><td class=\"num\">6</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/wgl_create_context.txt\">ARB_create_context_profile</a></td></tr>\r\n<tr><td class=\"num\">7</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/wgl_extensions_string.txt\">ARB_extensions_string</a></td></tr>\r\n<tr><td class=\"num\">8</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/framebuffer_sRGB.txt\">ARB_framebuffer_sRGB</a></td></tr>\r\n<tr><td class=\"num\">9</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/wgl_make_current_read.txt\">ARB_make_current_read</a></td></tr>\r\n<tr><td class=\"num\">10</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/multisample.txt\">ARB_multisample</a></td></tr>\r\n<tr><td class=\"num\">11</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/wgl_pbuffer.txt\">ARB_pbuffer</a></td></tr>\r\n<tr><td class=\"num\">12</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/wgl_pixel_format.txt\">ARB_pixel_format</a></td></tr>\r\n<tr><td class=\"num\">13</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/color_buffer_float.txt\">ARB_pixel_format_float</a></td></tr>\r\n<tr><td class=\"num\">14</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ARB/wgl_render_texture.txt\">ARB_render_texture</a></td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">15</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/ATI/pixel_format_float.txt\">ATI_pixel_format_float</a></td></tr>\r\n<tr><td class=\"num\">16</td><td>&nbsp;</td><td>ATI_render_texture_rectangle</td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">17</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/wgl_depth_float.txt\">EXT_depth_float</a></td></tr>\r\n<tr><td class=\"num\">18</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/wgl_display_color_table.txt\">EXT_display_color_table</a></td></tr>\r\n<tr><td class=\"num\">19</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/wgl_extensions_string.txt\">EXT_extensions_string</a></td></tr>\r\n<tr><td class=\"num\">20</td><td>&nbsp;</td><td><a href=\"http://developer.download.nvidia.com/opengl/specs/GL_EXT_framebuffer_sRGB.txt\">EXT_framebuffer_sRGB</a></td></tr>\r\n<tr><td class=\"num\">21</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/wgl_make_current_read.txt\">EXT_make_current_read</a></td></tr>\r\n<tr><td class=\"num\">22</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/wgl_multisample.txt\">EXT_multisample</a></td></tr>\r\n<tr><td class=\"num\">23</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/wgl_pbuffer.txt\">EXT_pbuffer</a></td></tr>\r\n<tr><td class=\"num\">24</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/wgl_pixel_format.txt\">EXT_pixel_format</a></td></tr>\r\n<tr><td class=\"num\">25</td><td>&nbsp;</td><td><a href=\"http://developer.download.nvidia.com/opengl/specs/GL_EXT_packed_float.txt\">EXT_pixel_format_packed_float</a></td></tr>\r\n<tr><td class=\"num\">26</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/EXT/wgl_swap_control.txt\">EXT_swap_control</a></td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">27</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/I3D/wgl_digital_video_control.txt\">I3D_digital_video_control</a></td></tr>\r\n<tr><td class=\"num\">28</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/I3D/wgl_gamma.txt\">I3D_gamma</a></td></tr>\r\n<tr><td class=\"num\">29</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/I3D/wgl_genlock.txt\">I3D_genlock</a></td></tr>\r\n<tr><td class=\"num\">30</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/I3D/wgl_image_buffer.txt\">I3D_image_buffer</a></td></tr>\r\n<tr><td class=\"num\">31</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/I3D/wgl_swap_frame_lock.txt\">I3D_swap_frame_lock</a></td></tr>\r\n<tr><td class=\"num\">32</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/I3D/wgl_swap_frame_usage.txt\">I3D_swap_frame_usage</a></td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">33</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/copy_image.txt\">NV_copy_image</a></td></tr>\r\n<tr><td class=\"num\">34</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/float_buffer.txt\">NV_float_buffer</a></td></tr>\r\n<tr><td class=\"num\">35</td><td>&nbsp;</td><td><a href=\"http://developer.download.nvidia.com/opengl/specs/WGL_nv_gpu_affinity.txt\">NV_gpu_affinity</a></td></tr>\r\n<tr><td class=\"num\">36</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/present_video.txt\">NV_present_video</a></td></tr>\r\n<tr><td class=\"num\">37</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/render_depth_texture.txt\">NV_render_depth_texture</a></td></tr>\r\n<tr><td class=\"num\">38</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/render_texture_rectangle.txt\">NV_render_texture_rectangle</a></td></tr>\r\n<tr><td class=\"num\">39</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/wgl_swap_group.txt\">NV_swap_group</a></td></tr>\r\n<tr><td class=\"num\">40</td><td>&nbsp;</td><td><a href=\"http://oss.sgi.com/projects/ogl-sample/registry/NV/vertex_array_range.txt\">NV_vertex_array_range</a></td></tr>\r\n<tr><td class=\"num\">41</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/NV/wgl_video_out.txt\">NV_video_output</a></td></tr>\r\n<tr><td><br></td><td></td><td></td></tr>\r\n<tr><td class=\"num\">42</td><td>&nbsp;</td><td><a href=\"http://www.opengl.org/registry/specs/OML/wgl_sync_control.txt\">OML_sync_control</a></td></tr>\r\n</table>\r\n<!-- begin footer.html -->\r\n</td></tr></table></body>\r\n<!-- end footer.html -->\r\n\r\n"
  },
  {
    "path": "libs/glew/glew.pc",
    "content": "prefix=/usr\nexec_prefix=/usr/bin\nlibdir=/usr/lib\nincludedir=/usr/include/GL\n\nName: glew\nDescription: The OpenGL Extension Wrangler library\nVersion: 1.5.3\nCflags: -I${includedir}\nLibs: -L${libdir} -lGLEW\n"
  },
  {
    "path": "libs/glew/glew.pc.in",
    "content": "prefix=@prefix@\r\nexec_prefix=@exec_prefix@\r\nlibdir=@libdir@\r\nincludedir=@includedir@\r\n\r\nName: glew\r\nDescription: The OpenGL Extension Wrangler library\r\nVersion: @version@\r\nCflags: -I${includedir}\r\nLibs: -L${libdir} -lGLEW\r\n"
  },
  {
    "path": "libs/glew/include/GL/glew.h",
    "content": "/*\r\n** The OpenGL Extension Wrangler Library\r\n** Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>\r\n** Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>\r\n** Copyright (C) 2002, Lev Povalahev\r\n** All rights reserved.\r\n** \r\n** Redistribution and use in source and binary forms, with or without \r\n** modification, are permitted provided that the following conditions are met:\r\n** \r\n** * Redistributions of source code must retain the above copyright notice, \r\n**   this list of conditions and the following disclaimer.\r\n** * Redistributions in binary form must reproduce the above copyright notice, \r\n**   this list of conditions and the following disclaimer in the documentation \r\n**   and/or other materials provided with the distribution.\r\n** * The name of the author may be used to endorse or promote products \r\n**   derived from this software without specific prior written permission.\r\n**\r\n** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" \r\n** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r\n** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r\n** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE \r\n** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \r\n** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \r\n** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r\n** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r\n** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r\n** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\r\n** THE POSSIBILITY OF SUCH DAMAGE.\r\n*/\r\n\r\n/*\r\n * Mesa 3-D graphics library\r\n * Version:  7.0\r\n *\r\n * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a\r\n * copy of this software and associated documentation files (the \"Software\"),\r\n * to deal in the Software without restriction, including without limitation\r\n * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r\n * and/or sell copies of the Software, and to permit persons to whom the\r\n * Software is furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included\r\n * in all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r\n * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r\n * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN\r\n * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n */\r\n\r\n/*\r\n** Copyright (c) 2007 The Khronos Group Inc.\r\n** \r\n** Permission is hereby granted, free of charge, to any person obtaining a\r\n** copy of this software and/or associated documentation files (the\r\n** \"Materials\"), to deal in the Materials without restriction, including\r\n** without limitation the rights to use, copy, modify, merge, publish,\r\n** distribute, sublicense, and/or sell copies of the Materials, and to\r\n** permit persons to whom the Materials are furnished to do so, subject to\r\n** the following conditions:\r\n** \r\n** The above copyright notice and this permission notice shall be included\r\n** in all copies or substantial portions of the Materials.\r\n** \r\n** THE MATERIALS ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\r\n** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r\n** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\r\n** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\r\n** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\r\n** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\r\n** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.\r\n*/\r\n\r\n#ifndef __glew_h__\r\n#define __glew_h__\r\n#define __GLEW_H__\r\n\r\n#if defined(__gl_h_) || defined(__GL_H__) || defined(__X_GL_H)\r\n#error gl.h included before glew.h\r\n#endif\r\n#if defined(__glext_h_) || defined(__GLEXT_H_)\r\n#error glext.h included before glew.h\r\n#endif\r\n#if defined(__gl_ATI_h_)\r\n#error glATI.h included before glew.h\r\n#endif\r\n\r\n#define __gl_h_\r\n#define __GL_H__\r\n#define __X_GL_H\r\n#define __glext_h_\r\n#define __GLEXT_H_\r\n#define __gl_ATI_h_\r\n\r\n#if defined(_WIN32)\r\n\r\n/*\r\n * GLEW does not include <windows.h> to avoid name space pollution.\r\n * GL needs GLAPI and GLAPIENTRY, GLU needs APIENTRY, CALLBACK, and wchar_t\r\n * defined properly.\r\n */\r\n/* <windef.h> */\r\n#ifndef APIENTRY\r\n#define GLEW_APIENTRY_DEFINED\r\n#  if defined(__MINGW32__) || defined(__CYGWIN__)\r\n#    define APIENTRY __stdcall\r\n#  elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) || defined(__BORLANDC__)\r\n#    define APIENTRY __stdcall\r\n#  else\r\n#    define APIENTRY\r\n#  endif\r\n#endif\r\n#ifndef GLAPI\r\n#  if defined(__MINGW32__) || defined(__CYGWIN__)\r\n#    define GLAPI extern\r\n#  endif\r\n#endif\r\n/* <winnt.h> */\r\n#ifndef CALLBACK\r\n#define GLEW_CALLBACK_DEFINED\r\n#  if defined(__MINGW32__) || defined(__CYGWIN__)\r\n#    define CALLBACK __attribute__ ((__stdcall__))\r\n#  elif (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS)\r\n#    define CALLBACK __stdcall\r\n#  else\r\n#    define CALLBACK\r\n#  endif\r\n#endif\r\n/* <wingdi.h> and <winnt.h> */\r\n#ifndef WINGDIAPI\r\n#define GLEW_WINGDIAPI_DEFINED\r\n#define WINGDIAPI __declspec(dllimport)\r\n#endif\r\n/* <ctype.h> */\r\n#if (defined(_MSC_VER) || defined(__BORLANDC__)) && !defined(_WCHAR_T_DEFINED)\r\ntypedef unsigned short wchar_t;\r\n#  define _WCHAR_T_DEFINED\r\n#endif\r\n/* <stddef.h> */\r\n#if !defined(_W64)\r\n#  if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && defined(_MSC_VER) && _MSC_VER >= 1300\r\n#    define _W64 __w64\r\n#  else\r\n#    define _W64\r\n#  endif\r\n#endif\r\n#if !defined(_PTRDIFF_T_DEFINED) && !defined(_PTRDIFF_T_)\r\n#  ifdef _WIN64\r\ntypedef __int64 ptrdiff_t;\r\n#  else\r\ntypedef _W64 int ptrdiff_t;\r\n#  endif\r\n#  define _PTRDIFF_T_DEFINED\r\n#  define _PTRDIFF_T_\r\n#endif\r\n\r\n#ifndef GLAPI\r\n#  if defined(__MINGW32__) || defined(__CYGWIN__)\r\n#    define GLAPI extern\r\n#  else\r\n#    define GLAPI WINGDIAPI\r\n#  endif\r\n#endif\r\n\r\n#ifndef GLAPIENTRY\r\n#define GLAPIENTRY APIENTRY\r\n#endif\r\n\r\n/*\r\n * GLEW_STATIC needs to be set when using the static version.\r\n * GLEW_BUILD is set when building the DLL version.\r\n */\r\n#ifdef GLEW_STATIC\r\n#  define GLEWAPI extern\r\n#else\r\n#  ifdef GLEW_BUILD\r\n#    define GLEWAPI extern __declspec(dllexport)\r\n#  else\r\n#    define GLEWAPI extern __declspec(dllimport)\r\n#  endif\r\n#endif\r\n\r\n#else /* _UNIX */\r\n\r\n/*\r\n * Needed for ptrdiff_t in turn needed by VBO.  This is defined by ISO\r\n * C.  On my system, this amounts to _3 lines_ of included code, all of\r\n * them pretty much harmless.  If you know of a way of detecting 32 vs\r\n * 64 _targets_ at compile time you are free to replace this with\r\n * something that's portable.  For now, _this_ is the portable solution.\r\n * (mem, 2004-01-04)\r\n */\r\n\r\n#include <stddef.h>\r\n#include <stdint.h>\r\n\r\n#define GLEW_APIENTRY_DEFINED\r\n#define APIENTRY\r\n#define GLEWAPI extern\r\n\r\n/* <glu.h> */\r\n#ifndef GLAPI\r\n#define GLAPI extern\r\n#endif\r\n#ifndef GLAPIENTRY\r\n#define GLAPIENTRY\r\n#endif\r\n\r\n#endif /* _WIN32 */\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/* ----------------------------- GL_VERSION_1_1 ---------------------------- */\r\n\r\n#ifndef GL_VERSION_1_1\r\n#define GL_VERSION_1_1 1\r\n\r\ntypedef unsigned int GLenum;\r\ntypedef unsigned int GLbitfield;\r\ntypedef unsigned int GLuint;\r\ntypedef int GLint;\r\ntypedef int GLsizei;\r\ntypedef unsigned char GLboolean;\r\ntypedef signed char GLbyte;\r\ntypedef short GLshort;\r\ntypedef unsigned char GLubyte;\r\ntypedef unsigned short GLushort;\r\ntypedef unsigned long GLulong;\r\ntypedef float GLfloat;\r\ntypedef float GLclampf;\r\ntypedef double GLdouble;\r\ntypedef double GLclampd;\r\ntypedef void GLvoid;\r\n#if defined(_MSC_VER)\r\n#  if _MSC_VER < 1400\r\ntypedef __int64 GLint64EXT;\r\ntypedef unsigned __int64 GLuint64EXT;\r\n#  else\r\ntypedef signed long long GLint64EXT;\r\ntypedef unsigned long long GLuint64EXT;\r\n#  endif\r\n#else\r\n#  if defined(__MINGW32__) || defined(__CYGWIN__)\r\n#include <inttypes.h>\r\n#  endif\r\ntypedef int64_t GLint64EXT;\r\ntypedef uint64_t GLuint64EXT;\r\n#endif\r\ntypedef GLint64EXT  GLint64;\r\ntypedef GLuint64EXT GLuint64;\r\ntypedef struct __GLsync *GLsync;\r\n\r\n#define GL_ACCUM 0x0100\r\n#define GL_LOAD 0x0101\r\n#define GL_RETURN 0x0102\r\n#define GL_MULT 0x0103\r\n#define GL_ADD 0x0104\r\n#define GL_NEVER 0x0200\r\n#define GL_LESS 0x0201\r\n#define GL_EQUAL 0x0202\r\n#define GL_LEQUAL 0x0203\r\n#define GL_GREATER 0x0204\r\n#define GL_NOTEQUAL 0x0205\r\n#define GL_GEQUAL 0x0206\r\n#define GL_ALWAYS 0x0207\r\n#define GL_CURRENT_BIT 0x00000001\r\n#define GL_POINT_BIT 0x00000002\r\n#define GL_LINE_BIT 0x00000004\r\n#define GL_POLYGON_BIT 0x00000008\r\n#define GL_POLYGON_STIPPLE_BIT 0x00000010\r\n#define GL_PIXEL_MODE_BIT 0x00000020\r\n#define GL_LIGHTING_BIT 0x00000040\r\n#define GL_FOG_BIT 0x00000080\r\n#define GL_DEPTH_BUFFER_BIT 0x00000100\r\n#define GL_ACCUM_BUFFER_BIT 0x00000200\r\n#define GL_STENCIL_BUFFER_BIT 0x00000400\r\n#define GL_VIEWPORT_BIT 0x00000800\r\n#define GL_TRANSFORM_BIT 0x00001000\r\n#define GL_ENABLE_BIT 0x00002000\r\n#define GL_COLOR_BUFFER_BIT 0x00004000\r\n#define GL_HINT_BIT 0x00008000\r\n#define GL_EVAL_BIT 0x00010000\r\n#define GL_LIST_BIT 0x00020000\r\n#define GL_TEXTURE_BIT 0x00040000\r\n#define GL_SCISSOR_BIT 0x00080000\r\n#define GL_ALL_ATTRIB_BITS 0x000fffff\r\n#define GL_POINTS 0x0000\r\n#define GL_LINES 0x0001\r\n#define GL_LINE_LOOP 0x0002\r\n#define GL_LINE_STRIP 0x0003\r\n#define GL_TRIANGLES 0x0004\r\n#define GL_TRIANGLE_STRIP 0x0005\r\n#define GL_TRIANGLE_FAN 0x0006\r\n#define GL_QUADS 0x0007\r\n#define GL_QUAD_STRIP 0x0008\r\n#define GL_POLYGON 0x0009\r\n#define GL_ZERO 0\r\n#define GL_ONE 1\r\n#define GL_SRC_COLOR 0x0300\r\n#define GL_ONE_MINUS_SRC_COLOR 0x0301\r\n#define GL_SRC_ALPHA 0x0302\r\n#define GL_ONE_MINUS_SRC_ALPHA 0x0303\r\n#define GL_DST_ALPHA 0x0304\r\n#define GL_ONE_MINUS_DST_ALPHA 0x0305\r\n#define GL_DST_COLOR 0x0306\r\n#define GL_ONE_MINUS_DST_COLOR 0x0307\r\n#define GL_SRC_ALPHA_SATURATE 0x0308\r\n#define GL_TRUE 1\r\n#define GL_FALSE 0\r\n#define GL_CLIP_PLANE0 0x3000\r\n#define GL_CLIP_PLANE1 0x3001\r\n#define GL_CLIP_PLANE2 0x3002\r\n#define GL_CLIP_PLANE3 0x3003\r\n#define GL_CLIP_PLANE4 0x3004\r\n#define GL_CLIP_PLANE5 0x3005\r\n#define GL_BYTE 0x1400\r\n#define GL_UNSIGNED_BYTE 0x1401\r\n#define GL_SHORT 0x1402\r\n#define GL_UNSIGNED_SHORT 0x1403\r\n#define GL_INT 0x1404\r\n#define GL_UNSIGNED_INT 0x1405\r\n#define GL_FLOAT 0x1406\r\n#define GL_2_BYTES 0x1407\r\n#define GL_3_BYTES 0x1408\r\n#define GL_4_BYTES 0x1409\r\n#define GL_DOUBLE 0x140A\r\n#define GL_NONE 0\r\n#define GL_FRONT_LEFT 0x0400\r\n#define GL_FRONT_RIGHT 0x0401\r\n#define GL_BACK_LEFT 0x0402\r\n#define GL_BACK_RIGHT 0x0403\r\n#define GL_FRONT 0x0404\r\n#define GL_BACK 0x0405\r\n#define GL_LEFT 0x0406\r\n#define GL_RIGHT 0x0407\r\n#define GL_FRONT_AND_BACK 0x0408\r\n#define GL_AUX0 0x0409\r\n#define GL_AUX1 0x040A\r\n#define GL_AUX2 0x040B\r\n#define GL_AUX3 0x040C\r\n#define GL_NO_ERROR 0\r\n#define GL_INVALID_ENUM 0x0500\r\n#define GL_INVALID_VALUE 0x0501\r\n#define GL_INVALID_OPERATION 0x0502\r\n#define GL_STACK_OVERFLOW 0x0503\r\n#define GL_STACK_UNDERFLOW 0x0504\r\n#define GL_OUT_OF_MEMORY 0x0505\r\n#define GL_2D 0x0600\r\n#define GL_3D 0x0601\r\n#define GL_3D_COLOR 0x0602\r\n#define GL_3D_COLOR_TEXTURE 0x0603\r\n#define GL_4D_COLOR_TEXTURE 0x0604\r\n#define GL_PASS_THROUGH_TOKEN 0x0700\r\n#define GL_POINT_TOKEN 0x0701\r\n#define GL_LINE_TOKEN 0x0702\r\n#define GL_POLYGON_TOKEN 0x0703\r\n#define GL_BITMAP_TOKEN 0x0704\r\n#define GL_DRAW_PIXEL_TOKEN 0x0705\r\n#define GL_COPY_PIXEL_TOKEN 0x0706\r\n#define GL_LINE_RESET_TOKEN 0x0707\r\n#define GL_EXP 0x0800\r\n#define GL_EXP2 0x0801\r\n#define GL_CW 0x0900\r\n#define GL_CCW 0x0901\r\n#define GL_COEFF 0x0A00\r\n#define GL_ORDER 0x0A01\r\n#define GL_DOMAIN 0x0A02\r\n#define GL_CURRENT_COLOR 0x0B00\r\n#define GL_CURRENT_INDEX 0x0B01\r\n#define GL_CURRENT_NORMAL 0x0B02\r\n#define GL_CURRENT_TEXTURE_COORDS 0x0B03\r\n#define GL_CURRENT_RASTER_COLOR 0x0B04\r\n#define GL_CURRENT_RASTER_INDEX 0x0B05\r\n#define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06\r\n#define GL_CURRENT_RASTER_POSITION 0x0B07\r\n#define GL_CURRENT_RASTER_POSITION_VALID 0x0B08\r\n#define GL_CURRENT_RASTER_DISTANCE 0x0B09\r\n#define GL_POINT_SMOOTH 0x0B10\r\n#define GL_POINT_SIZE 0x0B11\r\n#define GL_POINT_SIZE_RANGE 0x0B12\r\n#define GL_POINT_SIZE_GRANULARITY 0x0B13\r\n#define GL_LINE_SMOOTH 0x0B20\r\n#define GL_LINE_WIDTH 0x0B21\r\n#define GL_LINE_WIDTH_RANGE 0x0B22\r\n#define GL_LINE_WIDTH_GRANULARITY 0x0B23\r\n#define GL_LINE_STIPPLE 0x0B24\r\n#define GL_LINE_STIPPLE_PATTERN 0x0B25\r\n#define GL_LINE_STIPPLE_REPEAT 0x0B26\r\n#define GL_LIST_MODE 0x0B30\r\n#define GL_MAX_LIST_NESTING 0x0B31\r\n#define GL_LIST_BASE 0x0B32\r\n#define GL_LIST_INDEX 0x0B33\r\n#define GL_POLYGON_MODE 0x0B40\r\n#define GL_POLYGON_SMOOTH 0x0B41\r\n#define GL_POLYGON_STIPPLE 0x0B42\r\n#define GL_EDGE_FLAG 0x0B43\r\n#define GL_CULL_FACE 0x0B44\r\n#define GL_CULL_FACE_MODE 0x0B45\r\n#define GL_FRONT_FACE 0x0B46\r\n#define GL_LIGHTING 0x0B50\r\n#define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51\r\n#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52\r\n#define GL_LIGHT_MODEL_AMBIENT 0x0B53\r\n#define GL_SHADE_MODEL 0x0B54\r\n#define GL_COLOR_MATERIAL_FACE 0x0B55\r\n#define GL_COLOR_MATERIAL_PARAMETER 0x0B56\r\n#define GL_COLOR_MATERIAL 0x0B57\r\n#define GL_FOG 0x0B60\r\n#define GL_FOG_INDEX 0x0B61\r\n#define GL_FOG_DENSITY 0x0B62\r\n#define GL_FOG_START 0x0B63\r\n#define GL_FOG_END 0x0B64\r\n#define GL_FOG_MODE 0x0B65\r\n#define GL_FOG_COLOR 0x0B66\r\n#define GL_DEPTH_RANGE 0x0B70\r\n#define GL_DEPTH_TEST 0x0B71\r\n#define GL_DEPTH_WRITEMASK 0x0B72\r\n#define GL_DEPTH_CLEAR_VALUE 0x0B73\r\n#define GL_DEPTH_FUNC 0x0B74\r\n#define GL_ACCUM_CLEAR_VALUE 0x0B80\r\n#define GL_STENCIL_TEST 0x0B90\r\n#define GL_STENCIL_CLEAR_VALUE 0x0B91\r\n#define GL_STENCIL_FUNC 0x0B92\r\n#define GL_STENCIL_VALUE_MASK 0x0B93\r\n#define GL_STENCIL_FAIL 0x0B94\r\n#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95\r\n#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96\r\n#define GL_STENCIL_REF 0x0B97\r\n#define GL_STENCIL_WRITEMASK 0x0B98\r\n#define GL_MATRIX_MODE 0x0BA0\r\n#define GL_NORMALIZE 0x0BA1\r\n#define GL_VIEWPORT 0x0BA2\r\n#define GL_MODELVIEW_STACK_DEPTH 0x0BA3\r\n#define GL_PROJECTION_STACK_DEPTH 0x0BA4\r\n#define GL_TEXTURE_STACK_DEPTH 0x0BA5\r\n#define GL_MODELVIEW_MATRIX 0x0BA6\r\n#define GL_PROJECTION_MATRIX 0x0BA7\r\n#define GL_TEXTURE_MATRIX 0x0BA8\r\n#define GL_ATTRIB_STACK_DEPTH 0x0BB0\r\n#define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1\r\n#define GL_ALPHA_TEST 0x0BC0\r\n#define GL_ALPHA_TEST_FUNC 0x0BC1\r\n#define GL_ALPHA_TEST_REF 0x0BC2\r\n#define GL_DITHER 0x0BD0\r\n#define GL_BLEND_DST 0x0BE0\r\n#define GL_BLEND_SRC 0x0BE1\r\n#define GL_BLEND 0x0BE2\r\n#define GL_LOGIC_OP_MODE 0x0BF0\r\n#define GL_INDEX_LOGIC_OP 0x0BF1\r\n#define GL_COLOR_LOGIC_OP 0x0BF2\r\n#define GL_AUX_BUFFERS 0x0C00\r\n#define GL_DRAW_BUFFER 0x0C01\r\n#define GL_READ_BUFFER 0x0C02\r\n#define GL_SCISSOR_BOX 0x0C10\r\n#define GL_SCISSOR_TEST 0x0C11\r\n#define GL_INDEX_CLEAR_VALUE 0x0C20\r\n#define GL_INDEX_WRITEMASK 0x0C21\r\n#define GL_COLOR_CLEAR_VALUE 0x0C22\r\n#define GL_COLOR_WRITEMASK 0x0C23\r\n#define GL_INDEX_MODE 0x0C30\r\n#define GL_RGBA_MODE 0x0C31\r\n#define GL_DOUBLEBUFFER 0x0C32\r\n#define GL_STEREO 0x0C33\r\n#define GL_RENDER_MODE 0x0C40\r\n#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50\r\n#define GL_POINT_SMOOTH_HINT 0x0C51\r\n#define GL_LINE_SMOOTH_HINT 0x0C52\r\n#define GL_POLYGON_SMOOTH_HINT 0x0C53\r\n#define GL_FOG_HINT 0x0C54\r\n#define GL_TEXTURE_GEN_S 0x0C60\r\n#define GL_TEXTURE_GEN_T 0x0C61\r\n#define GL_TEXTURE_GEN_R 0x0C62\r\n#define GL_TEXTURE_GEN_Q 0x0C63\r\n#define GL_PIXEL_MAP_I_TO_I 0x0C70\r\n#define GL_PIXEL_MAP_S_TO_S 0x0C71\r\n#define GL_PIXEL_MAP_I_TO_R 0x0C72\r\n#define GL_PIXEL_MAP_I_TO_G 0x0C73\r\n#define GL_PIXEL_MAP_I_TO_B 0x0C74\r\n#define GL_PIXEL_MAP_I_TO_A 0x0C75\r\n#define GL_PIXEL_MAP_R_TO_R 0x0C76\r\n#define GL_PIXEL_MAP_G_TO_G 0x0C77\r\n#define GL_PIXEL_MAP_B_TO_B 0x0C78\r\n#define GL_PIXEL_MAP_A_TO_A 0x0C79\r\n#define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0\r\n#define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1\r\n#define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2\r\n#define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3\r\n#define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4\r\n#define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5\r\n#define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6\r\n#define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7\r\n#define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8\r\n#define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9\r\n#define GL_UNPACK_SWAP_BYTES 0x0CF0\r\n#define GL_UNPACK_LSB_FIRST 0x0CF1\r\n#define GL_UNPACK_ROW_LENGTH 0x0CF2\r\n#define GL_UNPACK_SKIP_ROWS 0x0CF3\r\n#define GL_UNPACK_SKIP_PIXELS 0x0CF4\r\n#define GL_UNPACK_ALIGNMENT 0x0CF5\r\n#define GL_PACK_SWAP_BYTES 0x0D00\r\n#define GL_PACK_LSB_FIRST 0x0D01\r\n#define GL_PACK_ROW_LENGTH 0x0D02\r\n#define GL_PACK_SKIP_ROWS 0x0D03\r\n#define GL_PACK_SKIP_PIXELS 0x0D04\r\n#define GL_PACK_ALIGNMENT 0x0D05\r\n#define GL_MAP_COLOR 0x0D10\r\n#define GL_MAP_STENCIL 0x0D11\r\n#define GL_INDEX_SHIFT 0x0D12\r\n#define GL_INDEX_OFFSET 0x0D13\r\n#define GL_RED_SCALE 0x0D14\r\n#define GL_RED_BIAS 0x0D15\r\n#define GL_ZOOM_X 0x0D16\r\n#define GL_ZOOM_Y 0x0D17\r\n#define GL_GREEN_SCALE 0x0D18\r\n#define GL_GREEN_BIAS 0x0D19\r\n#define GL_BLUE_SCALE 0x0D1A\r\n#define GL_BLUE_BIAS 0x0D1B\r\n#define GL_ALPHA_SCALE 0x0D1C\r\n#define GL_ALPHA_BIAS 0x0D1D\r\n#define GL_DEPTH_SCALE 0x0D1E\r\n#define GL_DEPTH_BIAS 0x0D1F\r\n#define GL_MAX_EVAL_ORDER 0x0D30\r\n#define GL_MAX_LIGHTS 0x0D31\r\n#define GL_MAX_CLIP_PLANES 0x0D32\r\n#define GL_MAX_TEXTURE_SIZE 0x0D33\r\n#define GL_MAX_PIXEL_MAP_TABLE 0x0D34\r\n#define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35\r\n#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36\r\n#define GL_MAX_NAME_STACK_DEPTH 0x0D37\r\n#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38\r\n#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39\r\n#define GL_MAX_VIEWPORT_DIMS 0x0D3A\r\n#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B\r\n#define GL_SUBPIXEL_BITS 0x0D50\r\n#define GL_INDEX_BITS 0x0D51\r\n#define GL_RED_BITS 0x0D52\r\n#define GL_GREEN_BITS 0x0D53\r\n#define GL_BLUE_BITS 0x0D54\r\n#define GL_ALPHA_BITS 0x0D55\r\n#define GL_DEPTH_BITS 0x0D56\r\n#define GL_STENCIL_BITS 0x0D57\r\n#define GL_ACCUM_RED_BITS 0x0D58\r\n#define GL_ACCUM_GREEN_BITS 0x0D59\r\n#define GL_ACCUM_BLUE_BITS 0x0D5A\r\n#define GL_ACCUM_ALPHA_BITS 0x0D5B\r\n#define GL_NAME_STACK_DEPTH 0x0D70\r\n#define GL_AUTO_NORMAL 0x0D80\r\n#define GL_MAP1_COLOR_4 0x0D90\r\n#define GL_MAP1_INDEX 0x0D91\r\n#define GL_MAP1_NORMAL 0x0D92\r\n#define GL_MAP1_TEXTURE_COORD_1 0x0D93\r\n#define GL_MAP1_TEXTURE_COORD_2 0x0D94\r\n#define GL_MAP1_TEXTURE_COORD_3 0x0D95\r\n#define GL_MAP1_TEXTURE_COORD_4 0x0D96\r\n#define GL_MAP1_VERTEX_3 0x0D97\r\n#define GL_MAP1_VERTEX_4 0x0D98\r\n#define GL_MAP2_COLOR_4 0x0DB0\r\n#define GL_MAP2_INDEX 0x0DB1\r\n#define GL_MAP2_NORMAL 0x0DB2\r\n#define GL_MAP2_TEXTURE_COORD_1 0x0DB3\r\n#define GL_MAP2_TEXTURE_COORD_2 0x0DB4\r\n#define GL_MAP2_TEXTURE_COORD_3 0x0DB5\r\n#define GL_MAP2_TEXTURE_COORD_4 0x0DB6\r\n#define GL_MAP2_VERTEX_3 0x0DB7\r\n#define GL_MAP2_VERTEX_4 0x0DB8\r\n#define GL_MAP1_GRID_DOMAIN 0x0DD0\r\n#define GL_MAP1_GRID_SEGMENTS 0x0DD1\r\n#define GL_MAP2_GRID_DOMAIN 0x0DD2\r\n#define GL_MAP2_GRID_SEGMENTS 0x0DD3\r\n#define GL_TEXTURE_1D 0x0DE0\r\n#define GL_TEXTURE_2D 0x0DE1\r\n#define GL_FEEDBACK_BUFFER_POINTER 0x0DF0\r\n#define GL_FEEDBACK_BUFFER_SIZE 0x0DF1\r\n#define GL_FEEDBACK_BUFFER_TYPE 0x0DF2\r\n#define GL_SELECTION_BUFFER_POINTER 0x0DF3\r\n#define GL_SELECTION_BUFFER_SIZE 0x0DF4\r\n#define GL_TEXTURE_WIDTH 0x1000\r\n#define GL_TEXTURE_HEIGHT 0x1001\r\n#define GL_TEXTURE_INTERNAL_FORMAT 0x1003\r\n#define GL_TEXTURE_BORDER_COLOR 0x1004\r\n#define GL_TEXTURE_BORDER 0x1005\r\n#define GL_DONT_CARE 0x1100\r\n#define GL_FASTEST 0x1101\r\n#define GL_NICEST 0x1102\r\n#define GL_LIGHT0 0x4000\r\n#define GL_LIGHT1 0x4001\r\n#define GL_LIGHT2 0x4002\r\n#define GL_LIGHT3 0x4003\r\n#define GL_LIGHT4 0x4004\r\n#define GL_LIGHT5 0x4005\r\n#define GL_LIGHT6 0x4006\r\n#define GL_LIGHT7 0x4007\r\n#define GL_AMBIENT 0x1200\r\n#define GL_DIFFUSE 0x1201\r\n#define GL_SPECULAR 0x1202\r\n#define GL_POSITION 0x1203\r\n#define GL_SPOT_DIRECTION 0x1204\r\n#define GL_SPOT_EXPONENT 0x1205\r\n#define GL_SPOT_CUTOFF 0x1206\r\n#define GL_CONSTANT_ATTENUATION 0x1207\r\n#define GL_LINEAR_ATTENUATION 0x1208\r\n#define GL_QUADRATIC_ATTENUATION 0x1209\r\n#define GL_COMPILE 0x1300\r\n#define GL_COMPILE_AND_EXECUTE 0x1301\r\n#define GL_CLEAR 0x1500\r\n#define GL_AND 0x1501\r\n#define GL_AND_REVERSE 0x1502\r\n#define GL_COPY 0x1503\r\n#define GL_AND_INVERTED 0x1504\r\n#define GL_NOOP 0x1505\r\n#define GL_XOR 0x1506\r\n#define GL_OR 0x1507\r\n#define GL_NOR 0x1508\r\n#define GL_EQUIV 0x1509\r\n#define GL_INVERT 0x150A\r\n#define GL_OR_REVERSE 0x150B\r\n#define GL_COPY_INVERTED 0x150C\r\n#define GL_OR_INVERTED 0x150D\r\n#define GL_NAND 0x150E\r\n#define GL_SET 0x150F\r\n#define GL_EMISSION 0x1600\r\n#define GL_SHININESS 0x1601\r\n#define GL_AMBIENT_AND_DIFFUSE 0x1602\r\n#define GL_COLOR_INDEXES 0x1603\r\n#define GL_MODELVIEW 0x1700\r\n#define GL_PROJECTION 0x1701\r\n#define GL_TEXTURE 0x1702\r\n#define GL_COLOR 0x1800\r\n#define GL_DEPTH 0x1801\r\n#define GL_STENCIL 0x1802\r\n#define GL_COLOR_INDEX 0x1900\r\n#define GL_STENCIL_INDEX 0x1901\r\n#define GL_DEPTH_COMPONENT 0x1902\r\n#define GL_RED 0x1903\r\n#define GL_GREEN 0x1904\r\n#define GL_BLUE 0x1905\r\n#define GL_ALPHA 0x1906\r\n#define GL_RGB 0x1907\r\n#define GL_RGBA 0x1908\r\n#define GL_LUMINANCE 0x1909\r\n#define GL_LUMINANCE_ALPHA 0x190A\r\n#define GL_BITMAP 0x1A00\r\n#define GL_POINT 0x1B00\r\n#define GL_LINE 0x1B01\r\n#define GL_FILL 0x1B02\r\n#define GL_RENDER 0x1C00\r\n#define GL_FEEDBACK 0x1C01\r\n#define GL_SELECT 0x1C02\r\n#define GL_FLAT 0x1D00\r\n#define GL_SMOOTH 0x1D01\r\n#define GL_KEEP 0x1E00\r\n#define GL_REPLACE 0x1E01\r\n#define GL_INCR 0x1E02\r\n#define GL_DECR 0x1E03\r\n#define GL_VENDOR 0x1F00\r\n#define GL_RENDERER 0x1F01\r\n#define GL_VERSION 0x1F02\r\n#define GL_EXTENSIONS 0x1F03\r\n#define GL_S 0x2000\r\n#define GL_T 0x2001\r\n#define GL_R 0x2002\r\n#define GL_Q 0x2003\r\n#define GL_MODULATE 0x2100\r\n#define GL_DECAL 0x2101\r\n#define GL_TEXTURE_ENV_MODE 0x2200\r\n#define GL_TEXTURE_ENV_COLOR 0x2201\r\n#define GL_TEXTURE_ENV 0x2300\r\n#define GL_EYE_LINEAR 0x2400\r\n#define GL_OBJECT_LINEAR 0x2401\r\n#define GL_SPHERE_MAP 0x2402\r\n#define GL_TEXTURE_GEN_MODE 0x2500\r\n#define GL_OBJECT_PLANE 0x2501\r\n#define GL_EYE_PLANE 0x2502\r\n#define GL_NEAREST 0x2600\r\n#define GL_LINEAR 0x2601\r\n#define GL_NEAREST_MIPMAP_NEAREST 0x2700\r\n#define GL_LINEAR_MIPMAP_NEAREST 0x2701\r\n#define GL_NEAREST_MIPMAP_LINEAR 0x2702\r\n#define GL_LINEAR_MIPMAP_LINEAR 0x2703\r\n#define GL_TEXTURE_MAG_FILTER 0x2800\r\n#define GL_TEXTURE_MIN_FILTER 0x2801\r\n#define GL_TEXTURE_WRAP_S 0x2802\r\n#define GL_TEXTURE_WRAP_T 0x2803\r\n#define GL_CLAMP 0x2900\r\n#define GL_REPEAT 0x2901\r\n#define GL_CLIENT_PIXEL_STORE_BIT 0x00000001\r\n#define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002\r\n#define GL_CLIENT_ALL_ATTRIB_BITS 0xffffffff\r\n#define GL_POLYGON_OFFSET_FACTOR 0x8038\r\n#define GL_POLYGON_OFFSET_UNITS 0x2A00\r\n#define GL_POLYGON_OFFSET_POINT 0x2A01\r\n#define GL_POLYGON_OFFSET_LINE 0x2A02\r\n#define GL_POLYGON_OFFSET_FILL 0x8037\r\n#define GL_ALPHA4 0x803B\r\n#define GL_ALPHA8 0x803C\r\n#define GL_ALPHA12 0x803D\r\n#define GL_ALPHA16 0x803E\r\n#define GL_LUMINANCE4 0x803F\r\n#define GL_LUMINANCE8 0x8040\r\n#define GL_LUMINANCE12 0x8041\r\n#define GL_LUMINANCE16 0x8042\r\n#define GL_LUMINANCE4_ALPHA4 0x8043\r\n#define GL_LUMINANCE6_ALPHA2 0x8044\r\n#define GL_LUMINANCE8_ALPHA8 0x8045\r\n#define GL_LUMINANCE12_ALPHA4 0x8046\r\n#define GL_LUMINANCE12_ALPHA12 0x8047\r\n#define GL_LUMINANCE16_ALPHA16 0x8048\r\n#define GL_INTENSITY 0x8049\r\n#define GL_INTENSITY4 0x804A\r\n#define GL_INTENSITY8 0x804B\r\n#define GL_INTENSITY12 0x804C\r\n#define GL_INTENSITY16 0x804D\r\n#define GL_R3_G3_B2 0x2A10\r\n#define GL_RGB4 0x804F\r\n#define GL_RGB5 0x8050\r\n#define GL_RGB8 0x8051\r\n#define GL_RGB10 0x8052\r\n#define GL_RGB12 0x8053\r\n#define GL_RGB16 0x8054\r\n#define GL_RGBA2 0x8055\r\n#define GL_RGBA4 0x8056\r\n#define GL_RGB5_A1 0x8057\r\n#define GL_RGBA8 0x8058\r\n#define GL_RGB10_A2 0x8059\r\n#define GL_RGBA12 0x805A\r\n#define GL_RGBA16 0x805B\r\n#define GL_TEXTURE_RED_SIZE 0x805C\r\n#define GL_TEXTURE_GREEN_SIZE 0x805D\r\n#define GL_TEXTURE_BLUE_SIZE 0x805E\r\n#define GL_TEXTURE_ALPHA_SIZE 0x805F\r\n#define GL_TEXTURE_LUMINANCE_SIZE 0x8060\r\n#define GL_TEXTURE_INTENSITY_SIZE 0x8061\r\n#define GL_PROXY_TEXTURE_1D 0x8063\r\n#define GL_PROXY_TEXTURE_2D 0x8064\r\n#define GL_TEXTURE_PRIORITY 0x8066\r\n#define GL_TEXTURE_RESIDENT 0x8067\r\n#define GL_TEXTURE_BINDING_1D 0x8068\r\n#define GL_TEXTURE_BINDING_2D 0x8069\r\n#define GL_VERTEX_ARRAY 0x8074\r\n#define GL_NORMAL_ARRAY 0x8075\r\n#define GL_COLOR_ARRAY 0x8076\r\n#define GL_INDEX_ARRAY 0x8077\r\n#define GL_TEXTURE_COORD_ARRAY 0x8078\r\n#define GL_EDGE_FLAG_ARRAY 0x8079\r\n#define GL_VERTEX_ARRAY_SIZE 0x807A\r\n#define GL_VERTEX_ARRAY_TYPE 0x807B\r\n#define GL_VERTEX_ARRAY_STRIDE 0x807C\r\n#define GL_NORMAL_ARRAY_TYPE 0x807E\r\n#define GL_NORMAL_ARRAY_STRIDE 0x807F\r\n#define GL_COLOR_ARRAY_SIZE 0x8081\r\n#define GL_COLOR_ARRAY_TYPE 0x8082\r\n#define GL_COLOR_ARRAY_STRIDE 0x8083\r\n#define GL_INDEX_ARRAY_TYPE 0x8085\r\n#define GL_INDEX_ARRAY_STRIDE 0x8086\r\n#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088\r\n#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089\r\n#define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A\r\n#define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C\r\n#define GL_VERTEX_ARRAY_POINTER 0x808E\r\n#define GL_NORMAL_ARRAY_POINTER 0x808F\r\n#define GL_COLOR_ARRAY_POINTER 0x8090\r\n#define GL_INDEX_ARRAY_POINTER 0x8091\r\n#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092\r\n#define GL_EDGE_FLAG_ARRAY_POINTER 0x8093\r\n#define GL_V2F 0x2A20\r\n#define GL_V3F 0x2A21\r\n#define GL_C4UB_V2F 0x2A22\r\n#define GL_C4UB_V3F 0x2A23\r\n#define GL_C3F_V3F 0x2A24\r\n#define GL_N3F_V3F 0x2A25\r\n#define GL_C4F_N3F_V3F 0x2A26\r\n#define GL_T2F_V3F 0x2A27\r\n#define GL_T4F_V4F 0x2A28\r\n#define GL_T2F_C4UB_V3F 0x2A29\r\n#define GL_T2F_C3F_V3F 0x2A2A\r\n#define GL_T2F_N3F_V3F 0x2A2B\r\n#define GL_T2F_C4F_N3F_V3F 0x2A2C\r\n#define GL_T4F_C4F_N3F_V4F 0x2A2D\r\n#define GL_LOGIC_OP GL_INDEX_LOGIC_OP\r\n#define GL_TEXTURE_COMPONENTS GL_TEXTURE_INTERNAL_FORMAT\r\n#define GL_COLOR_INDEX1_EXT 0x80E2\r\n#define GL_COLOR_INDEX2_EXT 0x80E3\r\n#define GL_COLOR_INDEX4_EXT 0x80E4\r\n#define GL_COLOR_INDEX8_EXT 0x80E5\r\n#define GL_COLOR_INDEX12_EXT 0x80E6\r\n#define GL_COLOR_INDEX16_EXT 0x80E7\r\n\r\nGLAPI void GLAPIENTRY glAccum (GLenum op, GLfloat value);\r\nGLAPI void GLAPIENTRY glAlphaFunc (GLenum func, GLclampf ref);\r\nGLAPI GLboolean GLAPIENTRY glAreTexturesResident (GLsizei n, const GLuint *textures, GLboolean *residences);\r\nGLAPI void GLAPIENTRY glArrayElement (GLint i);\r\nGLAPI void GLAPIENTRY glBegin (GLenum mode);\r\nGLAPI void GLAPIENTRY glBindTexture (GLenum target, GLuint texture);\r\nGLAPI void GLAPIENTRY glBitmap (GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);\r\nGLAPI void GLAPIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor);\r\nGLAPI void GLAPIENTRY glCallList (GLuint list);\r\nGLAPI void GLAPIENTRY glCallLists (GLsizei n, GLenum type, const GLvoid *lists);\r\nGLAPI void GLAPIENTRY glClear (GLbitfield mask);\r\nGLAPI void GLAPIENTRY glClearAccum (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);\r\nGLAPI void GLAPIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);\r\nGLAPI void GLAPIENTRY glClearDepth (GLclampd depth);\r\nGLAPI void GLAPIENTRY glClearIndex (GLfloat c);\r\nGLAPI void GLAPIENTRY glClearStencil (GLint s);\r\nGLAPI void GLAPIENTRY glClipPlane (GLenum plane, const GLdouble *equation);\r\nGLAPI void GLAPIENTRY glColor3b (GLbyte red, GLbyte green, GLbyte blue);\r\nGLAPI void GLAPIENTRY glColor3bv (const GLbyte *v);\r\nGLAPI void GLAPIENTRY glColor3d (GLdouble red, GLdouble green, GLdouble blue);\r\nGLAPI void GLAPIENTRY glColor3dv (const GLdouble *v);\r\nGLAPI void GLAPIENTRY glColor3f (GLfloat red, GLfloat green, GLfloat blue);\r\nGLAPI void GLAPIENTRY glColor3fv (const GLfloat *v);\r\nGLAPI void GLAPIENTRY glColor3i (GLint red, GLint green, GLint blue);\r\nGLAPI void GLAPIENTRY glColor3iv (const GLint *v);\r\nGLAPI void GLAPIENTRY glColor3s (GLshort red, GLshort green, GLshort blue);\r\nGLAPI void GLAPIENTRY glColor3sv (const GLshort *v);\r\nGLAPI void GLAPIENTRY glColor3ub (GLubyte red, GLubyte green, GLubyte blue);\r\nGLAPI void GLAPIENTRY glColor3ubv (const GLubyte *v);\r\nGLAPI void GLAPIENTRY glColor3ui (GLuint red, GLuint green, GLuint blue);\r\nGLAPI void GLAPIENTRY glColor3uiv (const GLuint *v);\r\nGLAPI void GLAPIENTRY glColor3us (GLushort red, GLushort green, GLushort blue);\r\nGLAPI void GLAPIENTRY glColor3usv (const GLushort *v);\r\nGLAPI void GLAPIENTRY glColor4b (GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);\r\nGLAPI void GLAPIENTRY glColor4bv (const GLbyte *v);\r\nGLAPI void GLAPIENTRY glColor4d (GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);\r\nGLAPI void GLAPIENTRY glColor4dv (const GLdouble *v);\r\nGLAPI void GLAPIENTRY glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);\r\nGLAPI void GLAPIENTRY glColor4fv (const GLfloat *v);\r\nGLAPI void GLAPIENTRY glColor4i (GLint red, GLint green, GLint blue, GLint alpha);\r\nGLAPI void GLAPIENTRY glColor4iv (const GLint *v);\r\nGLAPI void GLAPIENTRY glColor4s (GLshort red, GLshort green, GLshort blue, GLshort alpha);\r\nGLAPI void GLAPIENTRY glColor4sv (const GLshort *v);\r\nGLAPI void GLAPIENTRY glColor4ub (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);\r\nGLAPI void GLAPIENTRY glColor4ubv (const GLubyte *v);\r\nGLAPI void GLAPIENTRY glColor4ui (GLuint red, GLuint green, GLuint blue, GLuint alpha);\r\nGLAPI void GLAPIENTRY glColor4uiv (const GLuint *v);\r\nGLAPI void GLAPIENTRY glColor4us (GLushort red, GLushort green, GLushort blue, GLushort alpha);\r\nGLAPI void GLAPIENTRY glColor4usv (const GLushort *v);\r\nGLAPI void GLAPIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);\r\nGLAPI void GLAPIENTRY glColorMaterial (GLenum face, GLenum mode);\r\nGLAPI void GLAPIENTRY glColorPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);\r\nGLAPI void GLAPIENTRY glCopyPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);\r\nGLAPI void GLAPIENTRY glCopyTexImage1D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border);\r\nGLAPI void GLAPIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);\r\nGLAPI void GLAPIENTRY glCopyTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);\r\nGLAPI void GLAPIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);\r\nGLAPI void GLAPIENTRY glCullFace (GLenum mode);\r\nGLAPI void GLAPIENTRY glDeleteLists (GLuint list, GLsizei range);\r\nGLAPI void GLAPIENTRY glDeleteTextures (GLsizei n, const GLuint *textures);\r\nGLAPI void GLAPIENTRY glDepthFunc (GLenum func);\r\nGLAPI void GLAPIENTRY glDepthMask (GLboolean flag);\r\nGLAPI void GLAPIENTRY glDepthRange (GLclampd zNear, GLclampd zFar);\r\nGLAPI void GLAPIENTRY glDisable (GLenum cap);\r\nGLAPI void GLAPIENTRY glDisableClientState (GLenum array);\r\nGLAPI void GLAPIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count);\r\nGLAPI void GLAPIENTRY glDrawBuffer (GLenum mode);\r\nGLAPI void GLAPIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);\r\nGLAPI void GLAPIENTRY glDrawPixels (GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);\r\nGLAPI void GLAPIENTRY glEdgeFlag (GLboolean flag);\r\nGLAPI void GLAPIENTRY glEdgeFlagPointer (GLsizei stride, const GLvoid *pointer);\r\nGLAPI void GLAPIENTRY glEdgeFlagv (const GLboolean *flag);\r\nGLAPI void GLAPIENTRY glEnable (GLenum cap);\r\nGLAPI void GLAPIENTRY glEnableClientState (GLenum array);\r\nGLAPI void GLAPIENTRY glEnd (void);\r\nGLAPI void GLAPIENTRY glEndList (void);\r\nGLAPI void GLAPIENTRY glEvalCoord1d (GLdouble u);\r\nGLAPI void GLAPIENTRY glEvalCoord1dv (const GLdouble *u);\r\nGLAPI void GLAPIENTRY glEvalCoord1f (GLfloat u);\r\nGLAPI void GLAPIENTRY glEvalCoord1fv (const GLfloat *u);\r\nGLAPI void GLAPIENTRY glEvalCoord2d (GLdouble u, GLdouble v);\r\nGLAPI void GLAPIENTRY glEvalCoord2dv (const GLdouble *u);\r\nGLAPI void GLAPIENTRY glEvalCoord2f (GLfloat u, GLfloat v);\r\nGLAPI void GLAPIENTRY glEvalCoord2fv (const GLfloat *u);\r\nGLAPI void GLAPIENTRY glEvalMesh1 (GLenum mode, GLint i1, GLint i2);\r\nGLAPI void GLAPIENTRY glEvalMesh2 (GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);\r\nGLAPI void GLAPIENTRY glEvalPoint1 (GLint i);\r\nGLAPI void GLAPIENTRY glEvalPoint2 (GLint i, GLint j);\r\nGLAPI void GLAPIENTRY glFeedbackBuffer (GLsizei size, GLenum type, GLfloat *buffer);\r\nGLAPI void GLAPIENTRY glFinish (void);\r\nGLAPI void GLAPIENTRY glFlush (void);\r\nGLAPI void GLAPIENTRY glFogf (GLenum pname, GLfloat param);\r\nGLAPI void GLAPIENTRY glFogfv (GLenum pname, const GLfloat *params);\r\nGLAPI void GLAPIENTRY glFogi (GLenum pname, GLint param);\r\nGLAPI void GLAPIENTRY glFogiv (GLenum pname, const GLint *params);\r\nGLAPI void GLAPIENTRY glFrontFace (GLenum mode);\r\nGLAPI void GLAPIENTRY glFrustum (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);\r\nGLAPI GLuint GLAPIENTRY glGenLists (GLsizei range);\r\nGLAPI void GLAPIENTRY glGenTextures (GLsizei n, GLuint *textures);\r\nGLAPI void GLAPIENTRY glGetBooleanv (GLenum pname, GLboolean *params);\r\nGLAPI void GLAPIENTRY glGetClipPlane (GLenum plane, GLdouble *equation);\r\nGLAPI void GLAPIENTRY glGetDoublev (GLenum pname, GLdouble *params);\r\nGLAPI GLenum GLAPIENTRY glGetError (void);\r\nGLAPI void GLAPIENTRY glGetFloatv (GLenum pname, GLfloat *params);\r\nGLAPI void GLAPIENTRY glGetIntegerv (GLenum pname, GLint *params);\r\nGLAPI void GLAPIENTRY glGetLightfv (GLenum light, GLenum pname, GLfloat *params);\r\nGLAPI void GLAPIENTRY glGetLightiv (GLenum light, GLenum pname, GLint *params);\r\nGLAPI void GLAPIENTRY glGetMapdv (GLenum target, GLenum query, GLdouble *v);\r\nGLAPI void GLAPIENTRY glGetMapfv (GLenum target, GLenum query, GLfloat *v);\r\nGLAPI void GLAPIENTRY glGetMapiv (GLenum target, GLenum query, GLint *v);\r\nGLAPI void GLAPIENTRY glGetMaterialfv (GLenum face, GLenum pname, GLfloat *params);\r\nGLAPI void GLAPIENTRY glGetMaterialiv (GLenum face, GLenum pname, GLint *params);\r\nGLAPI void GLAPIENTRY glGetPixelMapfv (GLenum map, GLfloat *values);\r\nGLAPI void GLAPIENTRY glGetPixelMapuiv (GLenum map, GLuint *values);\r\nGLAPI void GLAPIENTRY glGetPixelMapusv (GLenum map, GLushort *values);\r\nGLAPI void GLAPIENTRY glGetPointerv (GLenum pname, GLvoid* *params);\r\nGLAPI void GLAPIENTRY glGetPolygonStipple (GLubyte *mask);\r\nGLAPI const GLubyte * GLAPIENTRY glGetString (GLenum name);\r\nGLAPI void GLAPIENTRY glGetTexEnvfv (GLenum target, GLenum pname, GLfloat *params);\r\nGLAPI void GLAPIENTRY glGetTexEnviv (GLenum target, GLenum pname, GLint *params);\r\nGLAPI void GLAPIENTRY glGetTexGendv (GLenum coord, GLenum pname, GLdouble *params);\r\nGLAPI void GLAPIENTRY glGetTexGenfv (GLenum coord, GLenum pname, GLfloat *params);\r\nGLAPI void GLAPIENTRY glGetTexGeniv (GLenum coord, GLenum pname, GLint *params);\r\nGLAPI void GLAPIENTRY glGetTexImage (GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);\r\nGLAPI void GLAPIENTRY glGetTexLevelParameterfv (GLenum target, GLint level, GLenum pname, GLfloat *params);\r\nGLAPI void GLAPIENTRY glGetTexLevelParameteriv (GLenum target, GLint level, GLenum pname, GLint *params);\r\nGLAPI void GLAPIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params);\r\nGLAPI void GLAPIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params);\r\nGLAPI void GLAPIENTRY glHint (GLenum target, GLenum mode);\r\nGLAPI void GLAPIENTRY glIndexMask (GLuint mask);\r\nGLAPI void GLAPIENTRY glIndexPointer (GLenum type, GLsizei stride, const GLvoid *pointer);\r\nGLAPI void GLAPIENTRY glIndexd (GLdouble c);\r\nGLAPI void GLAPIENTRY glIndexdv (const GLdouble *c);\r\nGLAPI void GLAPIENTRY glIndexf (GLfloat c);\r\nGLAPI void GLAPIENTRY glIndexfv (const GLfloat *c);\r\nGLAPI void GLAPIENTRY glIndexi (GLint c);\r\nGLAPI void GLAPIENTRY glIndexiv (const GLint *c);\r\nGLAPI void GLAPIENTRY glIndexs (GLshort c);\r\nGLAPI void GLAPIENTRY glIndexsv (const GLshort *c);\r\nGLAPI void GLAPIENTRY glIndexub (GLubyte c);\r\nGLAPI void GLAPIENTRY glIndexubv (const GLubyte *c);\r\nGLAPI void GLAPIENTRY glInitNames (void);\r\nGLAPI void GLAPIENTRY glInterleavedArrays (GLenum format, GLsizei stride, const GLvoid *pointer);\r\nGLAPI GLboolean GLAPIENTRY glIsEnabled (GLenum cap);\r\nGLAPI GLboolean GLAPIENTRY glIsList (GLuint list);\r\nGLAPI GLboolean GLAPIENTRY glIsTexture (GLuint texture);\r\nGLAPI void GLAPIENTRY glLightModelf (GLenum pname, GLfloat param);\r\nGLAPI void GLAPIENTRY glLightModelfv (GLenum pname, const GLfloat *params);\r\nGLAPI void GLAPIENTRY glLightModeli (GLenum pname, GLint param);\r\nGLAPI void GLAPIENTRY glLightModeliv (GLenum pname, const GLint *params);\r\nGLAPI void GLAPIENTRY glLightf (GLenum light, GLenum pname, GLfloat param);\r\nGLAPI void GLAPIENTRY glLightfv (GLenum light, GLenum pname, const GLfloat *params);\r\nGLAPI void GLAPIENTRY glLighti (GLenum light, GLenum pname, GLint param);\r\nGLAPI void GLAPIENTRY glLightiv (GLenum light, GLenum pname, const GLint *params);\r\nGLAPI void GLAPIENTRY glLineStipple (GLint factor, GLushort pattern);\r\nGLAPI void GLAPIENTRY glLineWidth (GLfloat width);\r\nGLAPI void GLAPIENTRY glListBase (GLuint base);\r\nGLAPI void GLAPIENTRY glLoadIdentity (void);\r\nGLAPI void GLAPIENTRY glLoadMatrixd (const GLdouble *m);\r\nGLAPI void GLAPIENTRY glLoadMatrixf (const GLfloat *m);\r\nGLAPI void GLAPIENTRY glLoadName (GLuint name);\r\nGLAPI void GLAPIENTRY glLogicOp (GLenum opcode);\r\nGLAPI void GLAPIENTRY glMap1d (GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);\r\nGLAPI void GLAPIENTRY glMap1f (GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);\r\nGLAPI void GLAPIENTRY glMap2d (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);\r\nGLAPI void GLAPIENTRY glMap2f (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);\r\nGLAPI void GLAPIENTRY glMapGrid1d (GLint un, GLdouble u1, GLdouble u2);\r\nGLAPI void GLAPIENTRY glMapGrid1f (GLint un, GLfloat u1, GLfloat u2);\r\nGLAPI void GLAPIENTRY glMapGrid2d (GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);\r\nGLAPI void GLAPIENTRY glMapGrid2f (GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);\r\nGLAPI void GLAPIENTRY glMaterialf (GLenum face, GLenum pname, GLfloat param);\r\nGLAPI void GLAPIENTRY glMaterialfv (GLenum face, GLenum pname, const GLfloat *params);\r\nGLAPI void GLAPIENTRY glMateriali (GLenum face, GLenum pname, GLint param);\r\nGLAPI void GLAPIENTRY glMaterialiv (GLenum face, GLenum pname, const GLint *params);\r\nGLAPI void GLAPIENTRY glMatrixMode (GLenum mode);\r\nGLAPI void GLAPIENTRY glMultMatrixd (const GLdouble *m);\r\nGLAPI void GLAPIENTRY glMultMatrixf (const GLfloat *m);\r\nGLAPI void GLAPIENTRY glNewList (GLuint list, GLenum mode);\r\nGLAPI void GLAPIENTRY glNormal3b (GLbyte nx, GLbyte ny, GLbyte nz);\r\nGLAPI void GLAPIENTRY glNormal3bv (const GLbyte *v);\r\nGLAPI void GLAPIENTRY glNormal3d (GLdouble nx, GLdouble ny, GLdouble nz);\r\nGLAPI void GLAPIENTRY glNormal3dv (const GLdouble *v);\r\nGLAPI void GLAPIENTRY glNormal3f (GLfloat nx, GLfloat ny, GLfloat nz);\r\nGLAPI void GLAPIENTRY glNormal3fv (const GLfloat *v);\r\nGLAPI void GLAPIENTRY glNormal3i (GLint nx, GLint ny, GLint nz);\r\nGLAPI void GLAPIENTRY glNormal3iv (const GLint *v);\r\nGLAPI void GLAPIENTRY glNormal3s (GLshort nx, GLshort ny, GLshort nz);\r\nGLAPI void GLAPIENTRY glNormal3sv (const GLshort *v);\r\nGLAPI void GLAPIENTRY glNormalPointer (GLenum type, GLsizei stride, const GLvoid *pointer);\r\nGLAPI void GLAPIENTRY glOrtho (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);\r\nGLAPI void GLAPIENTRY glPassThrough (GLfloat token);\r\nGLAPI void GLAPIENTRY glPixelMapfv (GLenum map, GLsizei mapsize, const GLfloat *values);\r\nGLAPI void GLAPIENTRY glPixelMapuiv (GLenum map, GLsizei mapsize, const GLuint *values);\r\nGLAPI void GLAPIENTRY glPixelMapusv (GLenum map, GLsizei mapsize, const GLushort *values);\r\nGLAPI void GLAPIENTRY glPixelStoref (GLenum pname, GLfloat param);\r\nGLAPI void GLAPIENTRY glPixelStorei (GLenum pname, GLint param);\r\nGLAPI void GLAPIENTRY glPixelTransferf (GLenum pname, GLfloat param);\r\nGLAPI void GLAPIENTRY glPixelTransferi (GLenum pname, GLint param);\r\nGLAPI void GLAPIENTRY glPixelZoom (GLfloat xfactor, GLfloat yfactor);\r\nGLAPI void GLAPIENTRY glPointSize (GLfloat size);\r\nGLAPI void GLAPIENTRY glPolygonMode (GLenum face, GLenum mode);\r\nGLAPI void GLAPIENTRY glPolygonOffset (GLfloat factor, GLfloat units);\r\nGLAPI void GLAPIENTRY glPolygonStipple (const GLubyte *mask);\r\nGLAPI void GLAPIENTRY glPopAttrib (void);\r\nGLAPI void GLAPIENTRY glPopClientAttrib (void);\r\nGLAPI void GLAPIENTRY glPopMatrix (void);\r\nGLAPI void GLAPIENTRY glPopName (void);\r\nGLAPI void GLAPIENTRY glPrioritizeTextures (GLsizei n, const GLuint *textures, const GLclampf *priorities);\r\nGLAPI void GLAPIENTRY glPushAttrib (GLbitfield mask);\r\nGLAPI void GLAPIENTRY glPushClientAttrib (GLbitfield mask);\r\nGLAPI void GLAPIENTRY glPushMatrix (void);\r\nGLAPI void GLAPIENTRY glPushName (GLuint name);\r\nGLAPI void GLAPIENTRY glRasterPos2d (GLdouble x, GLdouble y);\r\nGLAPI void GLAPIENTRY glRasterPos2dv (const GLdouble *v);\r\nGLAPI void GLAPIENTRY glRasterPos2f (GLfloat x, GLfloat y);\r\nGLAPI void GLAPIENTRY glRasterPos2fv (const GLfloat *v);\r\nGLAPI void GLAPIENTRY glRasterPos2i (GLint x, GLint y);\r\nGLAPI void GLAPIENTRY glRasterPos2iv (const GLint *v);\r\nGLAPI void GLAPIENTRY glRasterPos2s (GLshort x, GLshort y);\r\nGLAPI void GLAPIENTRY glRasterPos2sv (const GLshort *v);\r\nGLAPI void GLAPIENTRY glRasterPos3d (GLdouble x, GLdouble y, GLdouble z);\r\nGLAPI void GLAPIENTRY glRasterPos3dv (const GLdouble *v);\r\nGLAPI void GLAPIENTRY glRasterPos3f (GLfloat x, GLfloat y, GLfloat z);\r\nGLAPI void GLAPIENTRY glRasterPos3fv (const GLfloat *v);\r\nGLAPI void GLAPIENTRY glRasterPos3i (GLint x, GLint y, GLint z);\r\nGLAPI void GLAPIENTRY glRasterPos3iv (const GLint *v);\r\nGLAPI void GLAPIENTRY glRasterPos3s (GLshort x, GLshort y, GLshort z);\r\nGLAPI void GLAPIENTRY glRasterPos3sv (const GLshort *v);\r\nGLAPI void GLAPIENTRY glRasterPos4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w);\r\nGLAPI void GLAPIENTRY glRasterPos4dv (const GLdouble *v);\r\nGLAPI void GLAPIENTRY glRasterPos4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w);\r\nGLAPI void GLAPIENTRY glRasterPos4fv (const GLfloat *v);\r\nGLAPI void GLAPIENTRY glRasterPos4i (GLint x, GLint y, GLint z, GLint w);\r\nGLAPI void GLAPIENTRY glRasterPos4iv (const GLint *v);\r\nGLAPI void GLAPIENTRY glRasterPos4s (GLshort x, GLshort y, GLshort z, GLshort w);\r\nGLAPI void GLAPIENTRY glRasterPos4sv (const GLshort *v);\r\nGLAPI void GLAPIENTRY glReadBuffer (GLenum mode);\r\nGLAPI void GLAPIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);\r\nGLAPI void GLAPIENTRY glRectd (GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);\r\nGLAPI void GLAPIENTRY glRectdv (const GLdouble *v1, const GLdouble *v2);\r\nGLAPI void GLAPIENTRY glRectf (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);\r\nGLAPI void GLAPIENTRY glRectfv (const GLfloat *v1, const GLfloat *v2);\r\nGLAPI void GLAPIENTRY glRecti (GLint x1, GLint y1, GLint x2, GLint y2);\r\nGLAPI void GLAPIENTRY glRectiv (const GLint *v1, const GLint *v2);\r\nGLAPI void GLAPIENTRY glRects (GLshort x1, GLshort y1, GLshort x2, GLshort y2);\r\nGLAPI void GLAPIENTRY glRectsv (const GLshort *v1, const GLshort *v2);\r\nGLAPI GLint GLAPIENTRY glRenderMode (GLenum mode);\r\nGLAPI void GLAPIENTRY glRotated (GLdouble angle, GLdouble x, GLdouble y, GLdouble z);\r\nGLAPI void GLAPIENTRY glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z);\r\nGLAPI void GLAPIENTRY glScaled (GLdouble x, GLdouble y, GLdouble z);\r\nGLAPI void GLAPIENTRY glScalef (GLfloat x, GLfloat y, GLfloat z);\r\nGLAPI void GLAPIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height);\r\nGLAPI void GLAPIENTRY glSelectBuffer (GLsizei size, GLuint *buffer);\r\nGLAPI void GLAPIENTRY glShadeModel (GLenum mode);\r\nGLAPI void GLAPIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask);\r\nGLAPI void GLAPIENTRY glStencilMask (GLuint mask);\r\nGLAPI void GLAPIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass);\r\nGLAPI void GLAPIENTRY glTexCoord1d (GLdouble s);\r\nGLAPI void GLAPIENTRY glTexCoord1dv (const GLdouble *v);\r\nGLAPI void GLAPIENTRY glTexCoord1f (GLfloat s);\r\nGLAPI void GLAPIENTRY glTexCoord1fv (const GLfloat *v);\r\nGLAPI void GLAPIENTRY glTexCoord1i (GLint s);\r\nGLAPI void GLAPIENTRY glTexCoord1iv (const GLint *v);\r\nGLAPI void GLAPIENTRY glTexCoord1s (GLshort s);\r\nGLAPI void GLAPIENTRY glTexCoord1sv (const GLshort *v);\r\nGLAPI void GLAPIENTRY glTexCoord2d (GLdouble s, GLdouble t);\r\nGLAPI void GLAPIENTRY glTexCoord2dv (const GLdouble *v);\r\nGLAPI void GLAPIENTRY glTexCoord2f (GLfloat s, GLfloat t);\r\nGLAPI void GLAPIENTRY glTexCoord2fv (const GLfloat *v);\r\nGLAPI void GLAPIENTRY glTexCoord2i (GLint s, GLint t);\r\nGLAPI void GLAPIENTRY glTexCoord2iv (const GLint *v);\r\nGLAPI void GLAPIENTRY glTexCoord2s (GLshort s, GLshort t);\r\nGLAPI void GLAPIENTRY glTexCoord2sv (const GLshort *v);\r\nGLAPI void GLAPIENTRY glTexCoord3d (GLdouble s, GLdouble t, GLdouble r);\r\nGLAPI void GLAPIENTRY glTexCoord3dv (const GLdouble *v);\r\nGLAPI void GLAPIENTRY glTexCoord3f (GLfloat s, GLfloat t, GLfloat r);\r\nGLAPI void GLAPIENTRY glTexCoord3fv (const GLfloat *v);\r\nGLAPI void GLAPIENTRY glTexCoord3i (GLint s, GLint t, GLint r);\r\nGLAPI void GLAPIENTRY glTexCoord3iv (const GLint *v);\r\nGLAPI void GLAPIENTRY glTexCoord3s (GLshort s, GLshort t, GLshort r);\r\nGLAPI void GLAPIENTRY glTexCoord3sv (const GLshort *v);\r\nGLAPI void GLAPIENTRY glTexCoord4d (GLdouble s, GLdouble t, GLdouble r, GLdouble q);\r\nGLAPI void GLAPIENTRY glTexCoord4dv (const GLdouble *v);\r\nGLAPI void GLAPIENTRY glTexCoord4f (GLfloat s, GLfloat t, GLfloat r, GLfloat q);\r\nGLAPI void GLAPIENTRY glTexCoord4fv (const GLfloat *v);\r\nGLAPI void GLAPIENTRY glTexCoord4i (GLint s, GLint t, GLint r, GLint q);\r\nGLAPI void GLAPIENTRY glTexCoord4iv (const GLint *v);\r\nGLAPI void GLAPIENTRY glTexCoord4s (GLshort s, GLshort t, GLshort r, GLshort q);\r\nGLAPI void GLAPIENTRY glTexCoord4sv (const GLshort *v);\r\nGLAPI void GLAPIENTRY glTexCoordPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);\r\nGLAPI void GLAPIENTRY glTexEnvf (GLenum target, GLenum pname, GLfloat param);\r\nGLAPI void GLAPIENTRY glTexEnvfv (GLenum target, GLenum pname, const GLfloat *params);\r\nGLAPI void GLAPIENTRY glTexEnvi (GLenum target, GLenum pname, GLint param);\r\nGLAPI void GLAPIENTRY glTexEnviv (GLenum target, GLenum pname, const GLint *params);\r\nGLAPI void GLAPIENTRY glTexGend (GLenum coord, GLenum pname, GLdouble param);\r\nGLAPI void GLAPIENTRY glTexGendv (GLenum coord, GLenum pname, const GLdouble *params);\r\nGLAPI void GLAPIENTRY glTexGenf (GLenum coord, GLenum pname, GLfloat param);\r\nGLAPI void GLAPIENTRY glTexGenfv (GLenum coord, GLenum pname, const GLfloat *params);\r\nGLAPI void GLAPIENTRY glTexGeni (GLenum coord, GLenum pname, GLint param);\r\nGLAPI void GLAPIENTRY glTexGeniv (GLenum coord, GLenum pname, const GLint *params);\r\nGLAPI void GLAPIENTRY glTexImage1D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);\r\nGLAPI void GLAPIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);\r\nGLAPI void GLAPIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param);\r\nGLAPI void GLAPIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params);\r\nGLAPI void GLAPIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param);\r\nGLAPI void GLAPIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params);\r\nGLAPI void GLAPIENTRY glTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);\r\nGLAPI void GLAPIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);\r\nGLAPI void GLAPIENTRY glTranslated (GLdouble x, GLdouble y, GLdouble z);\r\nGLAPI void GLAPIENTRY glTranslatef (GLfloat x, GLfloat y, GLfloat z);\r\nGLAPI void GLAPIENTRY glVertex2d (GLdouble x, GLdouble y);\r\nGLAPI void GLAPIENTRY glVertex2dv (const GLdouble *v);\r\nGLAPI void GLAPIENTRY glVertex2f (GLfloat x, GLfloat y);\r\nGLAPI void GLAPIENTRY glVertex2fv (const GLfloat *v);\r\nGLAPI void GLAPIENTRY glVertex2i (GLint x, GLint y);\r\nGLAPI void GLAPIENTRY glVertex2iv (const GLint *v);\r\nGLAPI void GLAPIENTRY glVertex2s (GLshort x, GLshort y);\r\nGLAPI void GLAPIENTRY glVertex2sv (const GLshort *v);\r\nGLAPI void GLAPIENTRY glVertex3d (GLdouble x, GLdouble y, GLdouble z);\r\nGLAPI void GLAPIENTRY glVertex3dv (const GLdouble *v);\r\nGLAPI void GLAPIENTRY glVertex3f (GLfloat x, GLfloat y, GLfloat z);\r\nGLAPI void GLAPIENTRY glVertex3fv (const GLfloat *v);\r\nGLAPI void GLAPIENTRY glVertex3i (GLint x, GLint y, GLint z);\r\nGLAPI void GLAPIENTRY glVertex3iv (const GLint *v);\r\nGLAPI void GLAPIENTRY glVertex3s (GLshort x, GLshort y, GLshort z);\r\nGLAPI void GLAPIENTRY glVertex3sv (const GLshort *v);\r\nGLAPI void GLAPIENTRY glVertex4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w);\r\nGLAPI void GLAPIENTRY glVertex4dv (const GLdouble *v);\r\nGLAPI void GLAPIENTRY glVertex4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w);\r\nGLAPI void GLAPIENTRY glVertex4fv (const GLfloat *v);\r\nGLAPI void GLAPIENTRY glVertex4i (GLint x, GLint y, GLint z, GLint w);\r\nGLAPI void GLAPIENTRY glVertex4iv (const GLint *v);\r\nGLAPI void GLAPIENTRY glVertex4s (GLshort x, GLshort y, GLshort z, GLshort w);\r\nGLAPI void GLAPIENTRY glVertex4sv (const GLshort *v);\r\nGLAPI void GLAPIENTRY glVertexPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);\r\nGLAPI void GLAPIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height);\r\n\r\n#define GLEW_VERSION_1_1 GLEW_GET_VAR(__GLEW_VERSION_1_1)\r\n\r\n#endif /* GL_VERSION_1_1 */\r\n\r\n/* ---------------------------------- GLU ---------------------------------- */\r\n\r\n/* this is where we can safely include GLU */\r\n#if defined(__APPLE__) && defined(__MACH__)\r\n#include <OpenGL/glu.h>\r\n#else\r\n#include <GL/glu.h>\r\n#endif\r\n\r\n/* ----------------------------- GL_VERSION_1_2 ---------------------------- */\r\n\r\n#ifndef GL_VERSION_1_2\r\n#define GL_VERSION_1_2 1\r\n\r\n#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12\r\n#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13\r\n#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22\r\n#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23\r\n#define GL_UNSIGNED_BYTE_3_3_2 0x8032\r\n#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033\r\n#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034\r\n#define GL_UNSIGNED_INT_8_8_8_8 0x8035\r\n#define GL_UNSIGNED_INT_10_10_10_2 0x8036\r\n#define GL_RESCALE_NORMAL 0x803A\r\n#define GL_TEXTURE_BINDING_3D 0x806A\r\n#define GL_PACK_SKIP_IMAGES 0x806B\r\n#define GL_PACK_IMAGE_HEIGHT 0x806C\r\n#define GL_UNPACK_SKIP_IMAGES 0x806D\r\n#define GL_UNPACK_IMAGE_HEIGHT 0x806E\r\n#define GL_TEXTURE_3D 0x806F\r\n#define GL_PROXY_TEXTURE_3D 0x8070\r\n#define GL_TEXTURE_DEPTH 0x8071\r\n#define GL_TEXTURE_WRAP_R 0x8072\r\n#define GL_MAX_3D_TEXTURE_SIZE 0x8073\r\n#define GL_BGR 0x80E0\r\n#define GL_BGRA 0x80E1\r\n#define GL_MAX_ELEMENTS_VERTICES 0x80E8\r\n#define GL_MAX_ELEMENTS_INDICES 0x80E9\r\n#define GL_CLAMP_TO_EDGE 0x812F\r\n#define GL_TEXTURE_MIN_LOD 0x813A\r\n#define GL_TEXTURE_MAX_LOD 0x813B\r\n#define GL_TEXTURE_BASE_LEVEL 0x813C\r\n#define GL_TEXTURE_MAX_LEVEL 0x813D\r\n#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8\r\n#define GL_SINGLE_COLOR 0x81F9\r\n#define GL_SEPARATE_SPECULAR_COLOR 0x81FA\r\n#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362\r\n#define GL_UNSIGNED_SHORT_5_6_5 0x8363\r\n#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364\r\n#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365\r\n#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366\r\n#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367\r\n#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368\r\n#define GL_ALIASED_POINT_SIZE_RANGE 0x846D\r\n#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E\r\n\r\ntypedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);\r\ntypedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);\r\ntypedef void (GLAPIENTRY * PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);\r\ntypedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);\r\n\r\n#define glCopyTexSubImage3D GLEW_GET_FUN(__glewCopyTexSubImage3D)\r\n#define glDrawRangeElements GLEW_GET_FUN(__glewDrawRangeElements)\r\n#define glTexImage3D GLEW_GET_FUN(__glewTexImage3D)\r\n#define glTexSubImage3D GLEW_GET_FUN(__glewTexSubImage3D)\r\n\r\n#define GLEW_VERSION_1_2 GLEW_GET_VAR(__GLEW_VERSION_1_2)\r\n\r\n#endif /* GL_VERSION_1_2 */\r\n\r\n/* ----------------------------- GL_VERSION_1_3 ---------------------------- */\r\n\r\n#ifndef GL_VERSION_1_3\r\n#define GL_VERSION_1_3 1\r\n\r\n#define GL_MULTISAMPLE 0x809D\r\n#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E\r\n#define GL_SAMPLE_ALPHA_TO_ONE 0x809F\r\n#define GL_SAMPLE_COVERAGE 0x80A0\r\n#define GL_SAMPLE_BUFFERS 0x80A8\r\n#define GL_SAMPLES 0x80A9\r\n#define GL_SAMPLE_COVERAGE_VALUE 0x80AA\r\n#define GL_SAMPLE_COVERAGE_INVERT 0x80AB\r\n#define GL_CLAMP_TO_BORDER 0x812D\r\n#define GL_TEXTURE0 0x84C0\r\n#define GL_TEXTURE1 0x84C1\r\n#define GL_TEXTURE2 0x84C2\r\n#define GL_TEXTURE3 0x84C3\r\n#define GL_TEXTURE4 0x84C4\r\n#define GL_TEXTURE5 0x84C5\r\n#define GL_TEXTURE6 0x84C6\r\n#define GL_TEXTURE7 0x84C7\r\n#define GL_TEXTURE8 0x84C8\r\n#define GL_TEXTURE9 0x84C9\r\n#define GL_TEXTURE10 0x84CA\r\n#define GL_TEXTURE11 0x84CB\r\n#define GL_TEXTURE12 0x84CC\r\n#define GL_TEXTURE13 0x84CD\r\n#define GL_TEXTURE14 0x84CE\r\n#define GL_TEXTURE15 0x84CF\r\n#define GL_TEXTURE16 0x84D0\r\n#define GL_TEXTURE17 0x84D1\r\n#define GL_TEXTURE18 0x84D2\r\n#define GL_TEXTURE19 0x84D3\r\n#define GL_TEXTURE20 0x84D4\r\n#define GL_TEXTURE21 0x84D5\r\n#define GL_TEXTURE22 0x84D6\r\n#define GL_TEXTURE23 0x84D7\r\n#define GL_TEXTURE24 0x84D8\r\n#define GL_TEXTURE25 0x84D9\r\n#define GL_TEXTURE26 0x84DA\r\n#define GL_TEXTURE27 0x84DB\r\n#define GL_TEXTURE28 0x84DC\r\n#define GL_TEXTURE29 0x84DD\r\n#define GL_TEXTURE30 0x84DE\r\n#define GL_TEXTURE31 0x84DF\r\n#define GL_ACTIVE_TEXTURE 0x84E0\r\n#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1\r\n#define GL_MAX_TEXTURE_UNITS 0x84E2\r\n#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3\r\n#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4\r\n#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5\r\n#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6\r\n#define GL_SUBTRACT 0x84E7\r\n#define GL_COMPRESSED_ALPHA 0x84E9\r\n#define GL_COMPRESSED_LUMINANCE 0x84EA\r\n#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB\r\n#define GL_COMPRESSED_INTENSITY 0x84EC\r\n#define GL_COMPRESSED_RGB 0x84ED\r\n#define GL_COMPRESSED_RGBA 0x84EE\r\n#define GL_TEXTURE_COMPRESSION_HINT 0x84EF\r\n#define GL_NORMAL_MAP 0x8511\r\n#define GL_REFLECTION_MAP 0x8512\r\n#define GL_TEXTURE_CUBE_MAP 0x8513\r\n#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514\r\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515\r\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516\r\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517\r\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518\r\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519\r\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A\r\n#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B\r\n#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C\r\n#define GL_COMBINE 0x8570\r\n#define GL_COMBINE_RGB 0x8571\r\n#define GL_COMBINE_ALPHA 0x8572\r\n#define GL_RGB_SCALE 0x8573\r\n#define GL_ADD_SIGNED 0x8574\r\n#define GL_INTERPOLATE 0x8575\r\n#define GL_CONSTANT 0x8576\r\n#define GL_PRIMARY_COLOR 0x8577\r\n#define GL_PREVIOUS 0x8578\r\n#define GL_SOURCE0_RGB 0x8580\r\n#define GL_SOURCE1_RGB 0x8581\r\n#define GL_SOURCE2_RGB 0x8582\r\n#define GL_SOURCE0_ALPHA 0x8588\r\n#define GL_SOURCE1_ALPHA 0x8589\r\n#define GL_SOURCE2_ALPHA 0x858A\r\n#define GL_OPERAND0_RGB 0x8590\r\n#define GL_OPERAND1_RGB 0x8591\r\n#define GL_OPERAND2_RGB 0x8592\r\n#define GL_OPERAND0_ALPHA 0x8598\r\n#define GL_OPERAND1_ALPHA 0x8599\r\n#define GL_OPERAND2_ALPHA 0x859A\r\n#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0\r\n#define GL_TEXTURE_COMPRESSED 0x86A1\r\n#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2\r\n#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3\r\n#define GL_DOT3_RGB 0x86AE\r\n#define GL_DOT3_RGBA 0x86AF\r\n#define GL_MULTISAMPLE_BIT 0x20000000\r\n\r\ntypedef void (GLAPIENTRY * PFNGLACTIVETEXTUREPROC) (GLenum texture);\r\ntypedef void (GLAPIENTRY * PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture);\r\ntypedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);\r\ntypedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);\r\ntypedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);\r\ntypedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);\r\ntypedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);\r\ntypedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);\r\ntypedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint lod, GLvoid *img);\r\ntypedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble m[16]);\r\ntypedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat m[16]);\r\ntypedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble m[16]);\r\ntypedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat m[16]);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v);\r\ntypedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert);\r\n\r\n#define glActiveTexture GLEW_GET_FUN(__glewActiveTexture)\r\n#define glClientActiveTexture GLEW_GET_FUN(__glewClientActiveTexture)\r\n#define glCompressedTexImage1D GLEW_GET_FUN(__glewCompressedTexImage1D)\r\n#define glCompressedTexImage2D GLEW_GET_FUN(__glewCompressedTexImage2D)\r\n#define glCompressedTexImage3D GLEW_GET_FUN(__glewCompressedTexImage3D)\r\n#define glCompressedTexSubImage1D GLEW_GET_FUN(__glewCompressedTexSubImage1D)\r\n#define glCompressedTexSubImage2D GLEW_GET_FUN(__glewCompressedTexSubImage2D)\r\n#define glCompressedTexSubImage3D GLEW_GET_FUN(__glewCompressedTexSubImage3D)\r\n#define glGetCompressedTexImage GLEW_GET_FUN(__glewGetCompressedTexImage)\r\n#define glLoadTransposeMatrixd GLEW_GET_FUN(__glewLoadTransposeMatrixd)\r\n#define glLoadTransposeMatrixf GLEW_GET_FUN(__glewLoadTransposeMatrixf)\r\n#define glMultTransposeMatrixd GLEW_GET_FUN(__glewMultTransposeMatrixd)\r\n#define glMultTransposeMatrixf GLEW_GET_FUN(__glewMultTransposeMatrixf)\r\n#define glMultiTexCoord1d GLEW_GET_FUN(__glewMultiTexCoord1d)\r\n#define glMultiTexCoord1dv GLEW_GET_FUN(__glewMultiTexCoord1dv)\r\n#define glMultiTexCoord1f GLEW_GET_FUN(__glewMultiTexCoord1f)\r\n#define glMultiTexCoord1fv GLEW_GET_FUN(__glewMultiTexCoord1fv)\r\n#define glMultiTexCoord1i GLEW_GET_FUN(__glewMultiTexCoord1i)\r\n#define glMultiTexCoord1iv GLEW_GET_FUN(__glewMultiTexCoord1iv)\r\n#define glMultiTexCoord1s GLEW_GET_FUN(__glewMultiTexCoord1s)\r\n#define glMultiTexCoord1sv GLEW_GET_FUN(__glewMultiTexCoord1sv)\r\n#define glMultiTexCoord2d GLEW_GET_FUN(__glewMultiTexCoord2d)\r\n#define glMultiTexCoord2dv GLEW_GET_FUN(__glewMultiTexCoord2dv)\r\n#define glMultiTexCoord2f GLEW_GET_FUN(__glewMultiTexCoord2f)\r\n#define glMultiTexCoord2fv GLEW_GET_FUN(__glewMultiTexCoord2fv)\r\n#define glMultiTexCoord2i GLEW_GET_FUN(__glewMultiTexCoord2i)\r\n#define glMultiTexCoord2iv GLEW_GET_FUN(__glewMultiTexCoord2iv)\r\n#define glMultiTexCoord2s GLEW_GET_FUN(__glewMultiTexCoord2s)\r\n#define glMultiTexCoord2sv GLEW_GET_FUN(__glewMultiTexCoord2sv)\r\n#define glMultiTexCoord3d GLEW_GET_FUN(__glewMultiTexCoord3d)\r\n#define glMultiTexCoord3dv GLEW_GET_FUN(__glewMultiTexCoord3dv)\r\n#define glMultiTexCoord3f GLEW_GET_FUN(__glewMultiTexCoord3f)\r\n#define glMultiTexCoord3fv GLEW_GET_FUN(__glewMultiTexCoord3fv)\r\n#define glMultiTexCoord3i GLEW_GET_FUN(__glewMultiTexCoord3i)\r\n#define glMultiTexCoord3iv GLEW_GET_FUN(__glewMultiTexCoord3iv)\r\n#define glMultiTexCoord3s GLEW_GET_FUN(__glewMultiTexCoord3s)\r\n#define glMultiTexCoord3sv GLEW_GET_FUN(__glewMultiTexCoord3sv)\r\n#define glMultiTexCoord4d GLEW_GET_FUN(__glewMultiTexCoord4d)\r\n#define glMultiTexCoord4dv GLEW_GET_FUN(__glewMultiTexCoord4dv)\r\n#define glMultiTexCoord4f GLEW_GET_FUN(__glewMultiTexCoord4f)\r\n#define glMultiTexCoord4fv GLEW_GET_FUN(__glewMultiTexCoord4fv)\r\n#define glMultiTexCoord4i GLEW_GET_FUN(__glewMultiTexCoord4i)\r\n#define glMultiTexCoord4iv GLEW_GET_FUN(__glewMultiTexCoord4iv)\r\n#define glMultiTexCoord4s GLEW_GET_FUN(__glewMultiTexCoord4s)\r\n#define glMultiTexCoord4sv GLEW_GET_FUN(__glewMultiTexCoord4sv)\r\n#define glSampleCoverage GLEW_GET_FUN(__glewSampleCoverage)\r\n\r\n#define GLEW_VERSION_1_3 GLEW_GET_VAR(__GLEW_VERSION_1_3)\r\n\r\n#endif /* GL_VERSION_1_3 */\r\n\r\n/* ----------------------------- GL_VERSION_1_4 ---------------------------- */\r\n\r\n#ifndef GL_VERSION_1_4\r\n#define GL_VERSION_1_4 1\r\n\r\n#define GL_BLEND_DST_RGB 0x80C8\r\n#define GL_BLEND_SRC_RGB 0x80C9\r\n#define GL_BLEND_DST_ALPHA 0x80CA\r\n#define GL_BLEND_SRC_ALPHA 0x80CB\r\n#define GL_POINT_SIZE_MIN 0x8126\r\n#define GL_POINT_SIZE_MAX 0x8127\r\n#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128\r\n#define GL_POINT_DISTANCE_ATTENUATION 0x8129\r\n#define GL_GENERATE_MIPMAP 0x8191\r\n#define GL_GENERATE_MIPMAP_HINT 0x8192\r\n#define GL_DEPTH_COMPONENT16 0x81A5\r\n#define GL_DEPTH_COMPONENT24 0x81A6\r\n#define GL_DEPTH_COMPONENT32 0x81A7\r\n#define GL_MIRRORED_REPEAT 0x8370\r\n#define GL_FOG_COORDINATE_SOURCE 0x8450\r\n#define GL_FOG_COORDINATE 0x8451\r\n#define GL_FRAGMENT_DEPTH 0x8452\r\n#define GL_CURRENT_FOG_COORDINATE 0x8453\r\n#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454\r\n#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455\r\n#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456\r\n#define GL_FOG_COORDINATE_ARRAY 0x8457\r\n#define GL_COLOR_SUM 0x8458\r\n#define GL_CURRENT_SECONDARY_COLOR 0x8459\r\n#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A\r\n#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B\r\n#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C\r\n#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D\r\n#define GL_SECONDARY_COLOR_ARRAY 0x845E\r\n#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD\r\n#define GL_TEXTURE_FILTER_CONTROL 0x8500\r\n#define GL_TEXTURE_LOD_BIAS 0x8501\r\n#define GL_INCR_WRAP 0x8507\r\n#define GL_DECR_WRAP 0x8508\r\n#define GL_TEXTURE_DEPTH_SIZE 0x884A\r\n#define GL_DEPTH_TEXTURE_MODE 0x884B\r\n#define GL_TEXTURE_COMPARE_MODE 0x884C\r\n#define GL_TEXTURE_COMPARE_FUNC 0x884D\r\n#define GL_COMPARE_R_TO_TEXTURE 0x884E\r\n\r\ntypedef void (GLAPIENTRY * PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);\r\ntypedef void (GLAPIENTRY * PFNGLBLENDEQUATIONPROC) (GLenum mode);\r\ntypedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);\r\ntypedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const GLvoid *pointer);\r\ntypedef void (GLAPIENTRY * PFNGLFOGCOORDDPROC) (GLdouble coord);\r\ntypedef void (GLAPIENTRY * PFNGLFOGCOORDDVPROC) (const GLdouble *coord);\r\ntypedef void (GLAPIENTRY * PFNGLFOGCOORDFPROC) (GLfloat coord);\r\ntypedef void (GLAPIENTRY * PFNGLFOGCOORDFVPROC) (const GLfloat *coord);\r\ntypedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount);\r\ntypedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, GLsizei *count, GLenum type, const GLvoid **indices, GLsizei primcount);\r\ntypedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param);\r\ntypedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVPROC) (GLenum pname, GLfloat *params);\r\ntypedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param);\r\ntypedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIVPROC) (GLenum pname, GLint *params);\r\ntypedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue);\r\ntypedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v);\r\ntypedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue);\r\ntypedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v);\r\ntypedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue);\r\ntypedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v);\r\ntypedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue);\r\ntypedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v);\r\ntypedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue);\r\ntypedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v);\r\ntypedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue);\r\ntypedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v);\r\ntypedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue);\r\ntypedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v);\r\ntypedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue);\r\ntypedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v);\r\ntypedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVPROC) (const GLdouble *p);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVPROC) (const GLfloat *p);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS2IPROC) (GLint x, GLint y);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVPROC) (const GLint *p);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVPROC) (const GLshort *p);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVPROC) (const GLdouble *p);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVPROC) (const GLfloat *p);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVPROC) (const GLint *p);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVPROC) (const GLshort *p);\r\n\r\n#define glBlendColor GLEW_GET_FUN(__glewBlendColor)\r\n#define glBlendEquation GLEW_GET_FUN(__glewBlendEquation)\r\n#define glBlendFuncSeparate GLEW_GET_FUN(__glewBlendFuncSeparate)\r\n#define glFogCoordPointer GLEW_GET_FUN(__glewFogCoordPointer)\r\n#define glFogCoordd GLEW_GET_FUN(__glewFogCoordd)\r\n#define glFogCoorddv GLEW_GET_FUN(__glewFogCoorddv)\r\n#define glFogCoordf GLEW_GET_FUN(__glewFogCoordf)\r\n#define glFogCoordfv GLEW_GET_FUN(__glewFogCoordfv)\r\n#define glMultiDrawArrays GLEW_GET_FUN(__glewMultiDrawArrays)\r\n#define glMultiDrawElements GLEW_GET_FUN(__glewMultiDrawElements)\r\n#define glPointParameterf GLEW_GET_FUN(__glewPointParameterf)\r\n#define glPointParameterfv GLEW_GET_FUN(__glewPointParameterfv)\r\n#define glPointParameteri GLEW_GET_FUN(__glewPointParameteri)\r\n#define glPointParameteriv GLEW_GET_FUN(__glewPointParameteriv)\r\n#define glSecondaryColor3b GLEW_GET_FUN(__glewSecondaryColor3b)\r\n#define glSecondaryColor3bv GLEW_GET_FUN(__glewSecondaryColor3bv)\r\n#define glSecondaryColor3d GLEW_GET_FUN(__glewSecondaryColor3d)\r\n#define glSecondaryColor3dv GLEW_GET_FUN(__glewSecondaryColor3dv)\r\n#define glSecondaryColor3f GLEW_GET_FUN(__glewSecondaryColor3f)\r\n#define glSecondaryColor3fv GLEW_GET_FUN(__glewSecondaryColor3fv)\r\n#define glSecondaryColor3i GLEW_GET_FUN(__glewSecondaryColor3i)\r\n#define glSecondaryColor3iv GLEW_GET_FUN(__glewSecondaryColor3iv)\r\n#define glSecondaryColor3s GLEW_GET_FUN(__glewSecondaryColor3s)\r\n#define glSecondaryColor3sv GLEW_GET_FUN(__glewSecondaryColor3sv)\r\n#define glSecondaryColor3ub GLEW_GET_FUN(__glewSecondaryColor3ub)\r\n#define glSecondaryColor3ubv GLEW_GET_FUN(__glewSecondaryColor3ubv)\r\n#define glSecondaryColor3ui GLEW_GET_FUN(__glewSecondaryColor3ui)\r\n#define glSecondaryColor3uiv GLEW_GET_FUN(__glewSecondaryColor3uiv)\r\n#define glSecondaryColor3us GLEW_GET_FUN(__glewSecondaryColor3us)\r\n#define glSecondaryColor3usv GLEW_GET_FUN(__glewSecondaryColor3usv)\r\n#define glSecondaryColorPointer GLEW_GET_FUN(__glewSecondaryColorPointer)\r\n#define glWindowPos2d GLEW_GET_FUN(__glewWindowPos2d)\r\n#define glWindowPos2dv GLEW_GET_FUN(__glewWindowPos2dv)\r\n#define glWindowPos2f GLEW_GET_FUN(__glewWindowPos2f)\r\n#define glWindowPos2fv GLEW_GET_FUN(__glewWindowPos2fv)\r\n#define glWindowPos2i GLEW_GET_FUN(__glewWindowPos2i)\r\n#define glWindowPos2iv GLEW_GET_FUN(__glewWindowPos2iv)\r\n#define glWindowPos2s GLEW_GET_FUN(__glewWindowPos2s)\r\n#define glWindowPos2sv GLEW_GET_FUN(__glewWindowPos2sv)\r\n#define glWindowPos3d GLEW_GET_FUN(__glewWindowPos3d)\r\n#define glWindowPos3dv GLEW_GET_FUN(__glewWindowPos3dv)\r\n#define glWindowPos3f GLEW_GET_FUN(__glewWindowPos3f)\r\n#define glWindowPos3fv GLEW_GET_FUN(__glewWindowPos3fv)\r\n#define glWindowPos3i GLEW_GET_FUN(__glewWindowPos3i)\r\n#define glWindowPos3iv GLEW_GET_FUN(__glewWindowPos3iv)\r\n#define glWindowPos3s GLEW_GET_FUN(__glewWindowPos3s)\r\n#define glWindowPos3sv GLEW_GET_FUN(__glewWindowPos3sv)\r\n\r\n#define GLEW_VERSION_1_4 GLEW_GET_VAR(__GLEW_VERSION_1_4)\r\n\r\n#endif /* GL_VERSION_1_4 */\r\n\r\n/* ----------------------------- GL_VERSION_1_5 ---------------------------- */\r\n\r\n#ifndef GL_VERSION_1_5\r\n#define GL_VERSION_1_5 1\r\n\r\n#define GL_FOG_COORD_SRC GL_FOG_COORDINATE_SOURCE\r\n#define GL_FOG_COORD GL_FOG_COORDINATE\r\n#define GL_FOG_COORD_ARRAY GL_FOG_COORDINATE_ARRAY\r\n#define GL_SRC0_RGB GL_SOURCE0_RGB\r\n#define GL_FOG_COORD_ARRAY_POINTER GL_FOG_COORDINATE_ARRAY_POINTER\r\n#define GL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE\r\n#define GL_SRC1_ALPHA GL_SOURCE1_ALPHA\r\n#define GL_CURRENT_FOG_COORD GL_CURRENT_FOG_COORDINATE\r\n#define GL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE\r\n#define GL_SRC0_ALPHA GL_SOURCE0_ALPHA\r\n#define GL_SRC1_RGB GL_SOURCE1_RGB\r\n#define GL_FOG_COORD_ARRAY_BUFFER_BINDING GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING\r\n#define GL_SRC2_ALPHA GL_SOURCE2_ALPHA\r\n#define GL_SRC2_RGB GL_SOURCE2_RGB\r\n#define GL_BUFFER_SIZE 0x8764\r\n#define GL_BUFFER_USAGE 0x8765\r\n#define GL_QUERY_COUNTER_BITS 0x8864\r\n#define GL_CURRENT_QUERY 0x8865\r\n#define GL_QUERY_RESULT 0x8866\r\n#define GL_QUERY_RESULT_AVAILABLE 0x8867\r\n#define GL_ARRAY_BUFFER 0x8892\r\n#define GL_ELEMENT_ARRAY_BUFFER 0x8893\r\n#define GL_ARRAY_BUFFER_BINDING 0x8894\r\n#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895\r\n#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896\r\n#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897\r\n#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898\r\n#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899\r\n#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A\r\n#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B\r\n#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C\r\n#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D\r\n#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E\r\n#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F\r\n#define GL_READ_ONLY 0x88B8\r\n#define GL_WRITE_ONLY 0x88B9\r\n#define GL_READ_WRITE 0x88BA\r\n#define GL_BUFFER_ACCESS 0x88BB\r\n#define GL_BUFFER_MAPPED 0x88BC\r\n#define GL_BUFFER_MAP_POINTER 0x88BD\r\n#define GL_STREAM_DRAW 0x88E0\r\n#define GL_STREAM_READ 0x88E1\r\n#define GL_STREAM_COPY 0x88E2\r\n#define GL_STATIC_DRAW 0x88E4\r\n#define GL_STATIC_READ 0x88E5\r\n#define GL_STATIC_COPY 0x88E6\r\n#define GL_DYNAMIC_DRAW 0x88E8\r\n#define GL_DYNAMIC_READ 0x88E9\r\n#define GL_DYNAMIC_COPY 0x88EA\r\n#define GL_SAMPLES_PASSED 0x8914\r\n\r\ntypedef ptrdiff_t GLsizeiptr;\r\ntypedef ptrdiff_t GLintptr;\r\n\r\ntypedef void (GLAPIENTRY * PFNGLBEGINQUERYPROC) (GLenum target, GLuint id);\r\ntypedef void (GLAPIENTRY * PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer);\r\ntypedef void (GLAPIENTRY * PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage);\r\ntypedef void (GLAPIENTRY * PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data);\r\ntypedef void (GLAPIENTRY * PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint* buffers);\r\ntypedef void (GLAPIENTRY * PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint* ids);\r\ntypedef void (GLAPIENTRY * PFNGLENDQUERYPROC) (GLenum target);\r\ntypedef void (GLAPIENTRY * PFNGLGENBUFFERSPROC) (GLsizei n, GLuint* buffers);\r\ntypedef void (GLAPIENTRY * PFNGLGENQUERIESPROC) (GLsizei n, GLuint* ids);\r\ntypedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, GLvoid** params);\r\ntypedef void (GLAPIENTRY * PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid* data);\r\ntypedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint* params);\r\ntypedef GLboolean (GLAPIENTRY * PFNGLISBUFFERPROC) (GLuint buffer);\r\ntypedef GLboolean (GLAPIENTRY * PFNGLISQUERYPROC) (GLuint id);\r\ntypedef GLvoid* (GLAPIENTRY * PFNGLMAPBUFFERPROC) (GLenum target, GLenum access);\r\ntypedef GLboolean (GLAPIENTRY * PFNGLUNMAPBUFFERPROC) (GLenum target);\r\n\r\n#define glBeginQuery GLEW_GET_FUN(__glewBeginQuery)\r\n#define glBindBuffer GLEW_GET_FUN(__glewBindBuffer)\r\n#define glBufferData GLEW_GET_FUN(__glewBufferData)\r\n#define glBufferSubData GLEW_GET_FUN(__glewBufferSubData)\r\n#define glDeleteBuffers GLEW_GET_FUN(__glewDeleteBuffers)\r\n#define glDeleteQueries GLEW_GET_FUN(__glewDeleteQueries)\r\n#define glEndQuery GLEW_GET_FUN(__glewEndQuery)\r\n#define glGenBuffers GLEW_GET_FUN(__glewGenBuffers)\r\n#define glGenQueries GLEW_GET_FUN(__glewGenQueries)\r\n#define glGetBufferParameteriv GLEW_GET_FUN(__glewGetBufferParameteriv)\r\n#define glGetBufferPointerv GLEW_GET_FUN(__glewGetBufferPointerv)\r\n#define glGetBufferSubData GLEW_GET_FUN(__glewGetBufferSubData)\r\n#define glGetQueryObjectiv GLEW_GET_FUN(__glewGetQueryObjectiv)\r\n#define glGetQueryObjectuiv GLEW_GET_FUN(__glewGetQueryObjectuiv)\r\n#define glGetQueryiv GLEW_GET_FUN(__glewGetQueryiv)\r\n#define glIsBuffer GLEW_GET_FUN(__glewIsBuffer)\r\n#define glIsQuery GLEW_GET_FUN(__glewIsQuery)\r\n#define glMapBuffer GLEW_GET_FUN(__glewMapBuffer)\r\n#define glUnmapBuffer GLEW_GET_FUN(__glewUnmapBuffer)\r\n\r\n#define GLEW_VERSION_1_5 GLEW_GET_VAR(__GLEW_VERSION_1_5)\r\n\r\n#endif /* GL_VERSION_1_5 */\r\n\r\n/* ----------------------------- GL_VERSION_2_0 ---------------------------- */\r\n\r\n#ifndef GL_VERSION_2_0\r\n#define GL_VERSION_2_0 1\r\n\r\n#define GL_BLEND_EQUATION_RGB GL_BLEND_EQUATION\r\n#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622\r\n#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623\r\n#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624\r\n#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625\r\n#define GL_CURRENT_VERTEX_ATTRIB 0x8626\r\n#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642\r\n#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643\r\n#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645\r\n#define GL_STENCIL_BACK_FUNC 0x8800\r\n#define GL_STENCIL_BACK_FAIL 0x8801\r\n#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802\r\n#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803\r\n#define GL_MAX_DRAW_BUFFERS 0x8824\r\n#define GL_DRAW_BUFFER0 0x8825\r\n#define GL_DRAW_BUFFER1 0x8826\r\n#define GL_DRAW_BUFFER2 0x8827\r\n#define GL_DRAW_BUFFER3 0x8828\r\n#define GL_DRAW_BUFFER4 0x8829\r\n#define GL_DRAW_BUFFER5 0x882A\r\n#define GL_DRAW_BUFFER6 0x882B\r\n#define GL_DRAW_BUFFER7 0x882C\r\n#define GL_DRAW_BUFFER8 0x882D\r\n#define GL_DRAW_BUFFER9 0x882E\r\n#define GL_DRAW_BUFFER10 0x882F\r\n#define GL_DRAW_BUFFER11 0x8830\r\n#define GL_DRAW_BUFFER12 0x8831\r\n#define GL_DRAW_BUFFER13 0x8832\r\n#define GL_DRAW_BUFFER14 0x8833\r\n#define GL_DRAW_BUFFER15 0x8834\r\n#define GL_BLEND_EQUATION_ALPHA 0x883D\r\n#define GL_POINT_SPRITE 0x8861\r\n#define GL_COORD_REPLACE 0x8862\r\n#define GL_MAX_VERTEX_ATTRIBS 0x8869\r\n#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A\r\n#define GL_MAX_TEXTURE_COORDS 0x8871\r\n#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872\r\n#define GL_FRAGMENT_SHADER 0x8B30\r\n#define GL_VERTEX_SHADER 0x8B31\r\n#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49\r\n#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A\r\n#define GL_MAX_VARYING_FLOATS 0x8B4B\r\n#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C\r\n#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D\r\n#define GL_SHADER_TYPE 0x8B4F\r\n#define GL_FLOAT_VEC2 0x8B50\r\n#define GL_FLOAT_VEC3 0x8B51\r\n#define GL_FLOAT_VEC4 0x8B52\r\n#define GL_INT_VEC2 0x8B53\r\n#define GL_INT_VEC3 0x8B54\r\n#define GL_INT_VEC4 0x8B55\r\n#define GL_BOOL 0x8B56\r\n#define GL_BOOL_VEC2 0x8B57\r\n#define GL_BOOL_VEC3 0x8B58\r\n#define GL_BOOL_VEC4 0x8B59\r\n#define GL_FLOAT_MAT2 0x8B5A\r\n#define GL_FLOAT_MAT3 0x8B5B\r\n#define GL_FLOAT_MAT4 0x8B5C\r\n#define GL_SAMPLER_1D 0x8B5D\r\n#define GL_SAMPLER_2D 0x8B5E\r\n#define GL_SAMPLER_3D 0x8B5F\r\n#define GL_SAMPLER_CUBE 0x8B60\r\n#define GL_SAMPLER_1D_SHADOW 0x8B61\r\n#define GL_SAMPLER_2D_SHADOW 0x8B62\r\n#define GL_DELETE_STATUS 0x8B80\r\n#define GL_COMPILE_STATUS 0x8B81\r\n#define GL_LINK_STATUS 0x8B82\r\n#define GL_VALIDATE_STATUS 0x8B83\r\n#define GL_INFO_LOG_LENGTH 0x8B84\r\n#define GL_ATTACHED_SHADERS 0x8B85\r\n#define GL_ACTIVE_UNIFORMS 0x8B86\r\n#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87\r\n#define GL_SHADER_SOURCE_LENGTH 0x8B88\r\n#define GL_ACTIVE_ATTRIBUTES 0x8B89\r\n#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A\r\n#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B\r\n#define GL_SHADING_LANGUAGE_VERSION 0x8B8C\r\n#define GL_CURRENT_PROGRAM 0x8B8D\r\n#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0\r\n#define GL_LOWER_LEFT 0x8CA1\r\n#define GL_UPPER_LEFT 0x8CA2\r\n#define GL_STENCIL_BACK_REF 0x8CA3\r\n#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4\r\n#define GL_STENCIL_BACK_WRITEMASK 0x8CA5\r\n\r\ntypedef char GLchar;\r\n\r\ntypedef void (GLAPIENTRY * PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader);\r\ntypedef void (GLAPIENTRY * PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar* name);\r\ntypedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum, GLenum);\r\ntypedef void (GLAPIENTRY * PFNGLCOMPILESHADERPROC) (GLuint shader);\r\ntypedef GLuint (GLAPIENTRY * PFNGLCREATEPROGRAMPROC) (void);\r\ntypedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROC) (GLenum type);\r\ntypedef void (GLAPIENTRY * PFNGLDELETEPROGRAMPROC) (GLuint program);\r\ntypedef void (GLAPIENTRY * PFNGLDELETESHADERPROC) (GLuint shader);\r\ntypedef void (GLAPIENTRY * PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader);\r\ntypedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint);\r\ntypedef void (GLAPIENTRY * PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum* bufs);\r\ntypedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint);\r\ntypedef void (GLAPIENTRY * PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name);\r\ntypedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name);\r\ntypedef void (GLAPIENTRY * PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei* count, GLuint* shaders);\r\ntypedef GLint (GLAPIENTRY * PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar* name);\r\ntypedef void (GLAPIENTRY * PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog);\r\ntypedef void (GLAPIENTRY * PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint* param);\r\ntypedef void (GLAPIENTRY * PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog);\r\ntypedef void (GLAPIENTRY * PFNGLGETSHADERSOURCEPROC) (GLint obj, GLsizei maxLength, GLsizei* length, GLchar* source);\r\ntypedef void (GLAPIENTRY * PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint* param);\r\ntypedef GLint (GLAPIENTRY * PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar* name);\r\ntypedef void (GLAPIENTRY * PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint, GLenum, GLvoid*);\r\ntypedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVPROC) (GLuint, GLenum, GLdouble*);\r\ntypedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVPROC) (GLuint, GLenum, GLfloat*);\r\ntypedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVPROC) (GLuint, GLenum, GLint*);\r\ntypedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMPROC) (GLuint program);\r\ntypedef GLboolean (GLAPIENTRY * PFNGLISSHADERPROC) (GLuint shader);\r\ntypedef void (GLAPIENTRY * PFNGLLINKPROGRAMPROC) (GLuint program);\r\ntypedef void (GLAPIENTRY * PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar** strings, const GLint* lengths);\r\ntypedef void (GLAPIENTRY * PFNGLSTENCILFUNCSEPARATEPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask);\r\ntypedef void (GLAPIENTRY * PFNGLSTENCILMASKSEPARATEPROC) (GLenum, GLuint);\r\ntypedef void (GLAPIENTRY * PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat* value);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM1IPROC) (GLint location, GLint v0);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint* value);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat* value);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint* value);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat* value);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint* value);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat* value);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint* value);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\r\ntypedef void (GLAPIENTRY * PFNGLUSEPROGRAMPROC) (GLuint program);\r\ntypedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMPROC) (GLuint program);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* pointer);\r\n\r\n#define glAttachShader GLEW_GET_FUN(__glewAttachShader)\r\n#define glBindAttribLocation GLEW_GET_FUN(__glewBindAttribLocation)\r\n#define glBlendEquationSeparate GLEW_GET_FUN(__glewBlendEquationSeparate)\r\n#define glCompileShader GLEW_GET_FUN(__glewCompileShader)\r\n#define glCreateProgram GLEW_GET_FUN(__glewCreateProgram)\r\n#define glCreateShader GLEW_GET_FUN(__glewCreateShader)\r\n#define glDeleteProgram GLEW_GET_FUN(__glewDeleteProgram)\r\n#define glDeleteShader GLEW_GET_FUN(__glewDeleteShader)\r\n#define glDetachShader GLEW_GET_FUN(__glewDetachShader)\r\n#define glDisableVertexAttribArray GLEW_GET_FUN(__glewDisableVertexAttribArray)\r\n#define glDrawBuffers GLEW_GET_FUN(__glewDrawBuffers)\r\n#define glEnableVertexAttribArray GLEW_GET_FUN(__glewEnableVertexAttribArray)\r\n#define glGetActiveAttrib GLEW_GET_FUN(__glewGetActiveAttrib)\r\n#define glGetActiveUniform GLEW_GET_FUN(__glewGetActiveUniform)\r\n#define glGetAttachedShaders GLEW_GET_FUN(__glewGetAttachedShaders)\r\n#define glGetAttribLocation GLEW_GET_FUN(__glewGetAttribLocation)\r\n#define glGetProgramInfoLog GLEW_GET_FUN(__glewGetProgramInfoLog)\r\n#define glGetProgramiv GLEW_GET_FUN(__glewGetProgramiv)\r\n#define glGetShaderInfoLog GLEW_GET_FUN(__glewGetShaderInfoLog)\r\n#define glGetShaderSource GLEW_GET_FUN(__glewGetShaderSource)\r\n#define glGetShaderiv GLEW_GET_FUN(__glewGetShaderiv)\r\n#define glGetUniformLocation GLEW_GET_FUN(__glewGetUniformLocation)\r\n#define glGetUniformfv GLEW_GET_FUN(__glewGetUniformfv)\r\n#define glGetUniformiv GLEW_GET_FUN(__glewGetUniformiv)\r\n#define glGetVertexAttribPointerv GLEW_GET_FUN(__glewGetVertexAttribPointerv)\r\n#define glGetVertexAttribdv GLEW_GET_FUN(__glewGetVertexAttribdv)\r\n#define glGetVertexAttribfv GLEW_GET_FUN(__glewGetVertexAttribfv)\r\n#define glGetVertexAttribiv GLEW_GET_FUN(__glewGetVertexAttribiv)\r\n#define glIsProgram GLEW_GET_FUN(__glewIsProgram)\r\n#define glIsShader GLEW_GET_FUN(__glewIsShader)\r\n#define glLinkProgram GLEW_GET_FUN(__glewLinkProgram)\r\n#define glShaderSource GLEW_GET_FUN(__glewShaderSource)\r\n#define glStencilFuncSeparate GLEW_GET_FUN(__glewStencilFuncSeparate)\r\n#define glStencilMaskSeparate GLEW_GET_FUN(__glewStencilMaskSeparate)\r\n#define glStencilOpSeparate GLEW_GET_FUN(__glewStencilOpSeparate)\r\n#define glUniform1f GLEW_GET_FUN(__glewUniform1f)\r\n#define glUniform1fv GLEW_GET_FUN(__glewUniform1fv)\r\n#define glUniform1i GLEW_GET_FUN(__glewUniform1i)\r\n#define glUniform1iv GLEW_GET_FUN(__glewUniform1iv)\r\n#define glUniform2f GLEW_GET_FUN(__glewUniform2f)\r\n#define glUniform2fv GLEW_GET_FUN(__glewUniform2fv)\r\n#define glUniform2i GLEW_GET_FUN(__glewUniform2i)\r\n#define glUniform2iv GLEW_GET_FUN(__glewUniform2iv)\r\n#define glUniform3f GLEW_GET_FUN(__glewUniform3f)\r\n#define glUniform3fv GLEW_GET_FUN(__glewUniform3fv)\r\n#define glUniform3i GLEW_GET_FUN(__glewUniform3i)\r\n#define glUniform3iv GLEW_GET_FUN(__glewUniform3iv)\r\n#define glUniform4f GLEW_GET_FUN(__glewUniform4f)\r\n#define glUniform4fv GLEW_GET_FUN(__glewUniform4fv)\r\n#define glUniform4i GLEW_GET_FUN(__glewUniform4i)\r\n#define glUniform4iv GLEW_GET_FUN(__glewUniform4iv)\r\n#define glUniformMatrix2fv GLEW_GET_FUN(__glewUniformMatrix2fv)\r\n#define glUniformMatrix3fv GLEW_GET_FUN(__glewUniformMatrix3fv)\r\n#define glUniformMatrix4fv GLEW_GET_FUN(__glewUniformMatrix4fv)\r\n#define glUseProgram GLEW_GET_FUN(__glewUseProgram)\r\n#define glValidateProgram GLEW_GET_FUN(__glewValidateProgram)\r\n#define glVertexAttrib1d GLEW_GET_FUN(__glewVertexAttrib1d)\r\n#define glVertexAttrib1dv GLEW_GET_FUN(__glewVertexAttrib1dv)\r\n#define glVertexAttrib1f GLEW_GET_FUN(__glewVertexAttrib1f)\r\n#define glVertexAttrib1fv GLEW_GET_FUN(__glewVertexAttrib1fv)\r\n#define glVertexAttrib1s GLEW_GET_FUN(__glewVertexAttrib1s)\r\n#define glVertexAttrib1sv GLEW_GET_FUN(__glewVertexAttrib1sv)\r\n#define glVertexAttrib2d GLEW_GET_FUN(__glewVertexAttrib2d)\r\n#define glVertexAttrib2dv GLEW_GET_FUN(__glewVertexAttrib2dv)\r\n#define glVertexAttrib2f GLEW_GET_FUN(__glewVertexAttrib2f)\r\n#define glVertexAttrib2fv GLEW_GET_FUN(__glewVertexAttrib2fv)\r\n#define glVertexAttrib2s GLEW_GET_FUN(__glewVertexAttrib2s)\r\n#define glVertexAttrib2sv GLEW_GET_FUN(__glewVertexAttrib2sv)\r\n#define glVertexAttrib3d GLEW_GET_FUN(__glewVertexAttrib3d)\r\n#define glVertexAttrib3dv GLEW_GET_FUN(__glewVertexAttrib3dv)\r\n#define glVertexAttrib3f GLEW_GET_FUN(__glewVertexAttrib3f)\r\n#define glVertexAttrib3fv GLEW_GET_FUN(__glewVertexAttrib3fv)\r\n#define glVertexAttrib3s GLEW_GET_FUN(__glewVertexAttrib3s)\r\n#define glVertexAttrib3sv GLEW_GET_FUN(__glewVertexAttrib3sv)\r\n#define glVertexAttrib4Nbv GLEW_GET_FUN(__glewVertexAttrib4Nbv)\r\n#define glVertexAttrib4Niv GLEW_GET_FUN(__glewVertexAttrib4Niv)\r\n#define glVertexAttrib4Nsv GLEW_GET_FUN(__glewVertexAttrib4Nsv)\r\n#define glVertexAttrib4Nub GLEW_GET_FUN(__glewVertexAttrib4Nub)\r\n#define glVertexAttrib4Nubv GLEW_GET_FUN(__glewVertexAttrib4Nubv)\r\n#define glVertexAttrib4Nuiv GLEW_GET_FUN(__glewVertexAttrib4Nuiv)\r\n#define glVertexAttrib4Nusv GLEW_GET_FUN(__glewVertexAttrib4Nusv)\r\n#define glVertexAttrib4bv GLEW_GET_FUN(__glewVertexAttrib4bv)\r\n#define glVertexAttrib4d GLEW_GET_FUN(__glewVertexAttrib4d)\r\n#define glVertexAttrib4dv GLEW_GET_FUN(__glewVertexAttrib4dv)\r\n#define glVertexAttrib4f GLEW_GET_FUN(__glewVertexAttrib4f)\r\n#define glVertexAttrib4fv GLEW_GET_FUN(__glewVertexAttrib4fv)\r\n#define glVertexAttrib4iv GLEW_GET_FUN(__glewVertexAttrib4iv)\r\n#define glVertexAttrib4s GLEW_GET_FUN(__glewVertexAttrib4s)\r\n#define glVertexAttrib4sv GLEW_GET_FUN(__glewVertexAttrib4sv)\r\n#define glVertexAttrib4ubv GLEW_GET_FUN(__glewVertexAttrib4ubv)\r\n#define glVertexAttrib4uiv GLEW_GET_FUN(__glewVertexAttrib4uiv)\r\n#define glVertexAttrib4usv GLEW_GET_FUN(__glewVertexAttrib4usv)\r\n#define glVertexAttribPointer GLEW_GET_FUN(__glewVertexAttribPointer)\r\n\r\n#define GLEW_VERSION_2_0 GLEW_GET_VAR(__GLEW_VERSION_2_0)\r\n\r\n#endif /* GL_VERSION_2_0 */\r\n\r\n/* ----------------------------- GL_VERSION_2_1 ---------------------------- */\r\n\r\n#ifndef GL_VERSION_2_1\r\n#define GL_VERSION_2_1 1\r\n\r\n#define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F\r\n#define GL_PIXEL_PACK_BUFFER 0x88EB\r\n#define GL_PIXEL_UNPACK_BUFFER 0x88EC\r\n#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED\r\n#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF\r\n#define GL_FLOAT_MAT2x3 0x8B65\r\n#define GL_FLOAT_MAT2x4 0x8B66\r\n#define GL_FLOAT_MAT3x2 0x8B67\r\n#define GL_FLOAT_MAT3x4 0x8B68\r\n#define GL_FLOAT_MAT4x2 0x8B69\r\n#define GL_FLOAT_MAT4x3 0x8B6A\r\n#define GL_SRGB 0x8C40\r\n#define GL_SRGB8 0x8C41\r\n#define GL_SRGB_ALPHA 0x8C42\r\n#define GL_SRGB8_ALPHA8 0x8C43\r\n#define GL_SLUMINANCE_ALPHA 0x8C44\r\n#define GL_SLUMINANCE8_ALPHA8 0x8C45\r\n#define GL_SLUMINANCE 0x8C46\r\n#define GL_SLUMINANCE8 0x8C47\r\n#define GL_COMPRESSED_SRGB 0x8C48\r\n#define GL_COMPRESSED_SRGB_ALPHA 0x8C49\r\n#define GL_COMPRESSED_SLUMINANCE 0x8C4A\r\n#define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B\r\n\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\r\n\r\n#define glUniformMatrix2x3fv GLEW_GET_FUN(__glewUniformMatrix2x3fv)\r\n#define glUniformMatrix2x4fv GLEW_GET_FUN(__glewUniformMatrix2x4fv)\r\n#define glUniformMatrix3x2fv GLEW_GET_FUN(__glewUniformMatrix3x2fv)\r\n#define glUniformMatrix3x4fv GLEW_GET_FUN(__glewUniformMatrix3x4fv)\r\n#define glUniformMatrix4x2fv GLEW_GET_FUN(__glewUniformMatrix4x2fv)\r\n#define glUniformMatrix4x3fv GLEW_GET_FUN(__glewUniformMatrix4x3fv)\r\n\r\n#define GLEW_VERSION_2_1 GLEW_GET_VAR(__GLEW_VERSION_2_1)\r\n\r\n#endif /* GL_VERSION_2_1 */\r\n\r\n/* ----------------------------- GL_VERSION_3_0 ---------------------------- */\r\n\r\n#ifndef GL_VERSION_3_0\r\n#define GL_VERSION_3_0 1\r\n\r\n#define GL_MAX_CLIP_DISTANCES GL_MAX_CLIP_PLANES\r\n#define GL_CLIP_DISTANCE5 GL_CLIP_PLANE5\r\n#define GL_CLIP_DISTANCE1 GL_CLIP_PLANE1\r\n#define GL_CLIP_DISTANCE3 GL_CLIP_PLANE3\r\n#define GL_COMPARE_REF_TO_TEXTURE GL_COMPARE_R_TO_TEXTURE_ARB\r\n#define GL_CLIP_DISTANCE0 GL_CLIP_PLANE0\r\n#define GL_CLIP_DISTANCE4 GL_CLIP_PLANE4\r\n#define GL_CLIP_DISTANCE2 GL_CLIP_PLANE2\r\n#define GL_MAX_VARYING_COMPONENTS GL_MAX_VARYING_FLOATS\r\n#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x0001\r\n#define GL_MAJOR_VERSION 0x821B\r\n#define GL_MINOR_VERSION 0x821C\r\n#define GL_NUM_EXTENSIONS 0x821D\r\n#define GL_CONTEXT_FLAGS 0x821E\r\n#define GL_DEPTH_BUFFER 0x8223\r\n#define GL_STENCIL_BUFFER 0x8224\r\n#define GL_COMPRESSED_RED 0x8225\r\n#define GL_COMPRESSED_RG 0x8226\r\n#define GL_RGBA32F 0x8814\r\n#define GL_RGB32F 0x8815\r\n#define GL_RGBA16F 0x881A\r\n#define GL_RGB16F 0x881B\r\n#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD\r\n#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF\r\n#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904\r\n#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905\r\n#define GL_CLAMP_VERTEX_COLOR 0x891A\r\n#define GL_CLAMP_FRAGMENT_COLOR 0x891B\r\n#define GL_CLAMP_READ_COLOR 0x891C\r\n#define GL_FIXED_ONLY 0x891D\r\n#define GL_TEXTURE_RED_TYPE 0x8C10\r\n#define GL_TEXTURE_GREEN_TYPE 0x8C11\r\n#define GL_TEXTURE_BLUE_TYPE 0x8C12\r\n#define GL_TEXTURE_ALPHA_TYPE 0x8C13\r\n#define GL_TEXTURE_LUMINANCE_TYPE 0x8C14\r\n#define GL_TEXTURE_INTENSITY_TYPE 0x8C15\r\n#define GL_TEXTURE_DEPTH_TYPE 0x8C16\r\n#define GL_UNSIGNED_NORMALIZED 0x8C17\r\n#define GL_TEXTURE_1D_ARRAY 0x8C18\r\n#define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19\r\n#define GL_TEXTURE_2D_ARRAY 0x8C1A\r\n#define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B\r\n#define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C\r\n#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D\r\n#define GL_R11F_G11F_B10F 0x8C3A\r\n#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B\r\n#define GL_RGB9_E5 0x8C3D\r\n#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E\r\n#define GL_TEXTURE_SHARED_SIZE 0x8C3F\r\n#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76\r\n#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F\r\n#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80\r\n#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83\r\n#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84\r\n#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85\r\n#define GL_PRIMITIVES_GENERATED 0x8C87\r\n#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88\r\n#define GL_RASTERIZER_DISCARD 0x8C89\r\n#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A\r\n#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B\r\n#define GL_INTERLEAVED_ATTRIBS 0x8C8C\r\n#define GL_SEPARATE_ATTRIBS 0x8C8D\r\n#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E\r\n#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F\r\n#define GL_RGBA32UI 0x8D70\r\n#define GL_RGB32UI 0x8D71\r\n#define GL_RGBA16UI 0x8D76\r\n#define GL_RGB16UI 0x8D77\r\n#define GL_RGBA8UI 0x8D7C\r\n#define GL_RGB8UI 0x8D7D\r\n#define GL_RGBA32I 0x8D82\r\n#define GL_RGB32I 0x8D83\r\n#define GL_RGBA16I 0x8D88\r\n#define GL_RGB16I 0x8D89\r\n#define GL_RGBA8I 0x8D8E\r\n#define GL_RGB8I 0x8D8F\r\n#define GL_RED_INTEGER 0x8D94\r\n#define GL_GREEN_INTEGER 0x8D95\r\n#define GL_BLUE_INTEGER 0x8D96\r\n#define GL_ALPHA_INTEGER 0x8D97\r\n#define GL_RGB_INTEGER 0x8D98\r\n#define GL_RGBA_INTEGER 0x8D99\r\n#define GL_BGR_INTEGER 0x8D9A\r\n#define GL_BGRA_INTEGER 0x8D9B\r\n#define GL_SAMPLER_1D_ARRAY 0x8DC0\r\n#define GL_SAMPLER_2D_ARRAY 0x8DC1\r\n#define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3\r\n#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4\r\n#define GL_SAMPLER_CUBE_SHADOW 0x8DC5\r\n#define GL_UNSIGNED_INT_VEC2 0x8DC6\r\n#define GL_UNSIGNED_INT_VEC3 0x8DC7\r\n#define GL_UNSIGNED_INT_VEC4 0x8DC8\r\n#define GL_INT_SAMPLER_1D 0x8DC9\r\n#define GL_INT_SAMPLER_2D 0x8DCA\r\n#define GL_INT_SAMPLER_3D 0x8DCB\r\n#define GL_INT_SAMPLER_CUBE 0x8DCC\r\n#define GL_INT_SAMPLER_1D_ARRAY 0x8DCE\r\n#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF\r\n#define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1\r\n#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2\r\n#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3\r\n#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4\r\n#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6\r\n#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7\r\n#define GL_QUERY_WAIT 0x8E13\r\n#define GL_QUERY_NO_WAIT 0x8E14\r\n#define GL_QUERY_BY_REGION_WAIT 0x8E15\r\n#define GL_QUERY_BY_REGION_NO_WAIT 0x8E16\r\n\r\ntypedef void (GLAPIENTRY * PFNGLBEGINCONDITIONALRENDERPROC) (GLuint, GLenum);\r\ntypedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum);\r\ntypedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONPROC) (GLuint, GLuint, const GLchar*);\r\ntypedef void (GLAPIENTRY * PFNGLCLAMPCOLORPROC) (GLenum, GLenum);\r\ntypedef void (GLAPIENTRY * PFNGLCLEARBUFFERFIPROC) (GLenum, GLint, GLfloat, GLint);\r\ntypedef void (GLAPIENTRY * PFNGLCLEARBUFFERFVPROC) (GLenum, GLint, const GLfloat*);\r\ntypedef void (GLAPIENTRY * PFNGLCLEARBUFFERIVPROC) (GLenum, GLint, const GLint*);\r\ntypedef void (GLAPIENTRY * PFNGLCLEARBUFFERUIVPROC) (GLenum, GLint, const GLuint*);\r\ntypedef void (GLAPIENTRY * PFNGLCOLORMASKIPROC) (GLuint, GLboolean, GLboolean, GLboolean, GLboolean);\r\ntypedef void (GLAPIENTRY * PFNGLDISABLEIPROC) (GLenum, GLuint);\r\ntypedef void (GLAPIENTRY * PFNGLENABLEIPROC) (GLenum, GLuint);\r\ntypedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERPROC) (void);\r\ntypedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKPROC) (void);\r\ntypedef void (GLAPIENTRY * PFNGLGETBOOLEANI_VPROC) (GLenum, GLuint, GLboolean*);\r\ntypedef GLint (GLAPIENTRY * PFNGLGETFRAGDATALOCATIONPROC) (GLuint, const GLchar*);\r\ntypedef const GLubyte* (GLAPIENTRY * PFNGLGETSTRINGIPROC) (GLenum, GLuint);\r\ntypedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIIVPROC) (GLenum, GLenum, GLint*);\r\ntypedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIUIVPROC) (GLenum, GLenum, GLuint*);\r\ntypedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint, GLuint, GLint*);\r\ntypedef void (GLAPIENTRY * PFNGLGETUNIFORMUIVPROC) (GLuint, GLint, GLuint*);\r\ntypedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIIVPROC) (GLuint, GLenum, GLint*);\r\ntypedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint, GLenum, GLuint*);\r\ntypedef GLboolean (GLAPIENTRY * PFNGLISENABLEDIPROC) (GLenum, GLuint);\r\ntypedef void (GLAPIENTRY * PFNGLTEXPARAMETERIIVPROC) (GLenum, GLenum, const GLint*);\r\ntypedef void (GLAPIENTRY * PFNGLTEXPARAMETERIUIVPROC) (GLenum, GLenum, const GLuint*);\r\ntypedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint, GLsizei, const GLchar **, GLenum);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM1UIPROC) (GLint, GLuint);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM1UIVPROC) (GLint, GLsizei, const GLuint*);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM2UIPROC) (GLint, GLuint, GLuint);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM2UIVPROC) (GLint, GLsizei, const GLuint*);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM3UIPROC) (GLint, GLuint, GLuint, GLuint);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM3UIVPROC) (GLint, GLsizei, const GLuint*);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM4UIPROC) (GLint, GLuint, GLuint, GLuint, GLuint);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM4UIVPROC) (GLint, GLsizei, const GLuint*);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IPROC) (GLuint, GLint);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IVPROC) (GLuint, const GLint*);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIPROC) (GLuint, GLuint);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIVPROC) (GLuint, const GLuint*);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IPROC) (GLuint, GLint, GLint);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IVPROC) (GLuint, const GLint*);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIPROC) (GLuint, GLuint, GLuint);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIVPROC) (GLuint, const GLuint*);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IPROC) (GLuint, GLint, GLint, GLint);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IVPROC) (GLuint, const GLint*);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIPROC) (GLuint, GLuint, GLuint, GLuint);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIVPROC) (GLuint, const GLuint*);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4BVPROC) (GLuint, const GLbyte*);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IPROC) (GLuint, GLint, GLint, GLint, GLint);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IVPROC) (GLuint, const GLint*);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4SVPROC) (GLuint, const GLshort*);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UBVPROC) (GLuint, const GLubyte*);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIPROC) (GLuint, GLuint, GLuint, GLuint, GLuint);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIVPROC) (GLuint, const GLuint*);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4USVPROC) (GLuint, const GLushort*);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint, GLint, GLenum, GLsizei, const GLvoid*);\r\n\r\n#define glBeginConditionalRender GLEW_GET_FUN(__glewBeginConditionalRender)\r\n#define glBeginTransformFeedback GLEW_GET_FUN(__glewBeginTransformFeedback)\r\n#define glBindFragDataLocation GLEW_GET_FUN(__glewBindFragDataLocation)\r\n#define glClampColor GLEW_GET_FUN(__glewClampColor)\r\n#define glClearBufferfi GLEW_GET_FUN(__glewClearBufferfi)\r\n#define glClearBufferfv GLEW_GET_FUN(__glewClearBufferfv)\r\n#define glClearBufferiv GLEW_GET_FUN(__glewClearBufferiv)\r\n#define glClearBufferuiv GLEW_GET_FUN(__glewClearBufferuiv)\r\n#define glColorMaski GLEW_GET_FUN(__glewColorMaski)\r\n#define glDisablei GLEW_GET_FUN(__glewDisablei)\r\n#define glEnablei GLEW_GET_FUN(__glewEnablei)\r\n#define glEndConditionalRender GLEW_GET_FUN(__glewEndConditionalRender)\r\n#define glEndTransformFeedback GLEW_GET_FUN(__glewEndTransformFeedback)\r\n#define glGetBooleani_v GLEW_GET_FUN(__glewGetBooleani_v)\r\n#define glGetFragDataLocation GLEW_GET_FUN(__glewGetFragDataLocation)\r\n#define glGetStringi GLEW_GET_FUN(__glewGetStringi)\r\n#define glGetTexParameterIiv GLEW_GET_FUN(__glewGetTexParameterIiv)\r\n#define glGetTexParameterIuiv GLEW_GET_FUN(__glewGetTexParameterIuiv)\r\n#define glGetTransformFeedbackVarying GLEW_GET_FUN(__glewGetTransformFeedbackVarying)\r\n#define glGetUniformuiv GLEW_GET_FUN(__glewGetUniformuiv)\r\n#define glGetVertexAttribIiv GLEW_GET_FUN(__glewGetVertexAttribIiv)\r\n#define glGetVertexAttribIuiv GLEW_GET_FUN(__glewGetVertexAttribIuiv)\r\n#define glIsEnabledi GLEW_GET_FUN(__glewIsEnabledi)\r\n#define glTexParameterIiv GLEW_GET_FUN(__glewTexParameterIiv)\r\n#define glTexParameterIuiv GLEW_GET_FUN(__glewTexParameterIuiv)\r\n#define glTransformFeedbackVaryings GLEW_GET_FUN(__glewTransformFeedbackVaryings)\r\n#define glUniform1ui GLEW_GET_FUN(__glewUniform1ui)\r\n#define glUniform1uiv GLEW_GET_FUN(__glewUniform1uiv)\r\n#define glUniform2ui GLEW_GET_FUN(__glewUniform2ui)\r\n#define glUniform2uiv GLEW_GET_FUN(__glewUniform2uiv)\r\n#define glUniform3ui GLEW_GET_FUN(__glewUniform3ui)\r\n#define glUniform3uiv GLEW_GET_FUN(__glewUniform3uiv)\r\n#define glUniform4ui GLEW_GET_FUN(__glewUniform4ui)\r\n#define glUniform4uiv GLEW_GET_FUN(__glewUniform4uiv)\r\n#define glVertexAttribI1i GLEW_GET_FUN(__glewVertexAttribI1i)\r\n#define glVertexAttribI1iv GLEW_GET_FUN(__glewVertexAttribI1iv)\r\n#define glVertexAttribI1ui GLEW_GET_FUN(__glewVertexAttribI1ui)\r\n#define glVertexAttribI1uiv GLEW_GET_FUN(__glewVertexAttribI1uiv)\r\n#define glVertexAttribI2i GLEW_GET_FUN(__glewVertexAttribI2i)\r\n#define glVertexAttribI2iv GLEW_GET_FUN(__glewVertexAttribI2iv)\r\n#define glVertexAttribI2ui GLEW_GET_FUN(__glewVertexAttribI2ui)\r\n#define glVertexAttribI2uiv GLEW_GET_FUN(__glewVertexAttribI2uiv)\r\n#define glVertexAttribI3i GLEW_GET_FUN(__glewVertexAttribI3i)\r\n#define glVertexAttribI3iv GLEW_GET_FUN(__glewVertexAttribI3iv)\r\n#define glVertexAttribI3ui GLEW_GET_FUN(__glewVertexAttribI3ui)\r\n#define glVertexAttribI3uiv GLEW_GET_FUN(__glewVertexAttribI3uiv)\r\n#define glVertexAttribI4bv GLEW_GET_FUN(__glewVertexAttribI4bv)\r\n#define glVertexAttribI4i GLEW_GET_FUN(__glewVertexAttribI4i)\r\n#define glVertexAttribI4iv GLEW_GET_FUN(__glewVertexAttribI4iv)\r\n#define glVertexAttribI4sv GLEW_GET_FUN(__glewVertexAttribI4sv)\r\n#define glVertexAttribI4ubv GLEW_GET_FUN(__glewVertexAttribI4ubv)\r\n#define glVertexAttribI4ui GLEW_GET_FUN(__glewVertexAttribI4ui)\r\n#define glVertexAttribI4uiv GLEW_GET_FUN(__glewVertexAttribI4uiv)\r\n#define glVertexAttribI4usv GLEW_GET_FUN(__glewVertexAttribI4usv)\r\n#define glVertexAttribIPointer GLEW_GET_FUN(__glewVertexAttribIPointer)\r\n\r\n#define GLEW_VERSION_3_0 GLEW_GET_VAR(__GLEW_VERSION_3_0)\r\n\r\n#endif /* GL_VERSION_3_0 */\r\n\r\n/* ----------------------------- GL_VERSION_3_1 ---------------------------- */\r\n\r\n#ifndef GL_VERSION_3_1\r\n#define GL_VERSION_3_1 1\r\n\r\n#define GL_TEXTURE_RECTANGLE 0x84F5\r\n#define GL_TEXTURE_BINDING_RECTANGLE 0x84F6\r\n#define GL_PROXY_TEXTURE_RECTANGLE 0x84F7\r\n#define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8\r\n#define GL_SAMPLER_2D_RECT 0x8B63\r\n#define GL_SAMPLER_2D_RECT_SHADOW 0x8B64\r\n#define GL_TEXTURE_BUFFER 0x8C2A\r\n#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B\r\n#define GL_TEXTURE_BINDING_BUFFER 0x8C2C\r\n#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D\r\n#define GL_TEXTURE_BUFFER_FORMAT 0x8C2E\r\n#define GL_SAMPLER_BUFFER 0x8DC2\r\n#define GL_INT_SAMPLER_2D_RECT 0x8DCD\r\n#define GL_INT_SAMPLER_BUFFER 0x8DD0\r\n#define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5\r\n#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8\r\n#define GL_RED_SNORM 0x8F90\r\n#define GL_RG_SNORM 0x8F91\r\n#define GL_RGB_SNORM 0x8F92\r\n#define GL_RGBA_SNORM 0x8F93\r\n#define GL_R8_SNORM 0x8F94\r\n#define GL_RG8_SNORM 0x8F95\r\n#define GL_RGB8_SNORM 0x8F96\r\n#define GL_RGBA8_SNORM 0x8F97\r\n#define GL_R16_SNORM 0x8F98\r\n#define GL_RG16_SNORM 0x8F99\r\n#define GL_RGB16_SNORM 0x8F9A\r\n#define GL_RGBA16_SNORM 0x8F9B\r\n#define GL_SIGNED_NORMALIZED 0x8F9C\r\n#define GL_PRIMITIVE_RESTART 0x8F9D\r\n#define GL_PRIMITIVE_RESTART_INDEX 0x8F9E\r\n#define GL_BUFFER_ACCESS_FLAGS 0x911F\r\n#define GL_BUFFER_MAP_LENGTH 0x9120\r\n#define GL_BUFFER_MAP_OFFSET 0x9121\r\n\r\ntypedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum, GLint, GLsizei, GLsizei);\r\ntypedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum, GLsizei, GLenum, const GLvoid*, GLsizei);\r\ntypedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTINDEXPROC) (GLuint);\r\ntypedef void (GLAPIENTRY * PFNGLTEXBUFFERPROC) (GLenum, GLenum, GLuint);\r\n\r\n#define glDrawArraysInstanced GLEW_GET_FUN(__glewDrawArraysInstanced)\r\n#define glDrawElementsInstanced GLEW_GET_FUN(__glewDrawElementsInstanced)\r\n#define glPrimitiveRestartIndex GLEW_GET_FUN(__glewPrimitiveRestartIndex)\r\n#define glTexBuffer GLEW_GET_FUN(__glewTexBuffer)\r\n\r\n#define GLEW_VERSION_3_1 GLEW_GET_VAR(__GLEW_VERSION_3_1)\r\n\r\n#endif /* GL_VERSION_3_1 */\r\n\r\n/* ----------------------------- GL_VERSION_3_2 ---------------------------- */\r\n\r\n#ifndef GL_VERSION_3_2\r\n#define GL_VERSION_3_2 1\r\n\r\n#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001\r\n#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002\r\n#define GL_LINES_ADJACENCY 0x000A\r\n#define GL_LINE_STRIP_ADJACENCY 0x000B\r\n#define GL_TRIANGLES_ADJACENCY 0x000C\r\n#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D\r\n#define GL_PROGRAM_POINT_SIZE 0x8642\r\n#define GL_GEOMETRY_VERTICES_OUT 0x8916\r\n#define GL_GEOMETRY_INPUT_TYPE 0x8917\r\n#define GL_GEOMETRY_OUTPUT_TYPE 0x8918\r\n#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29\r\n#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7\r\n#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8\r\n#define GL_GEOMETRY_SHADER 0x8DD9\r\n#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF\r\n#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0\r\n#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1\r\n#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122\r\n#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123\r\n#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124\r\n#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125\r\n#define GL_CONTEXT_PROFILE_MASK 0x9126\r\n\r\ntypedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREPROC) (GLenum, GLenum, GLuint, GLint);\r\ntypedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum, GLenum, GLint64 *);\r\ntypedef void (GLAPIENTRY * PFNGLGETINTEGER64I_VPROC) (GLenum, GLuint, GLint64 *);\r\n\r\n#define glFramebufferTexture GLEW_GET_FUN(__glewFramebufferTexture)\r\n#define glGetBufferParameteri64v GLEW_GET_FUN(__glewGetBufferParameteri64v)\r\n#define glGetInteger64i_v GLEW_GET_FUN(__glewGetInteger64i_v)\r\n\r\n#define GLEW_VERSION_3_2 GLEW_GET_VAR(__GLEW_VERSION_3_2)\r\n\r\n#endif /* GL_VERSION_3_2 */\r\n\r\n/* -------------------------- GL_3DFX_multisample -------------------------- */\r\n\r\n#ifndef GL_3DFX_multisample\r\n#define GL_3DFX_multisample 1\r\n\r\n#define GL_MULTISAMPLE_3DFX 0x86B2\r\n#define GL_SAMPLE_BUFFERS_3DFX 0x86B3\r\n#define GL_SAMPLES_3DFX 0x86B4\r\n#define GL_MULTISAMPLE_BIT_3DFX 0x20000000\r\n\r\n#define GLEW_3DFX_multisample GLEW_GET_VAR(__GLEW_3DFX_multisample)\r\n\r\n#endif /* GL_3DFX_multisample */\r\n\r\n/* ---------------------------- GL_3DFX_tbuffer ---------------------------- */\r\n\r\n#ifndef GL_3DFX_tbuffer\r\n#define GL_3DFX_tbuffer 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLTBUFFERMASK3DFXPROC) (GLuint mask);\r\n\r\n#define glTbufferMask3DFX GLEW_GET_FUN(__glewTbufferMask3DFX)\r\n\r\n#define GLEW_3DFX_tbuffer GLEW_GET_VAR(__GLEW_3DFX_tbuffer)\r\n\r\n#endif /* GL_3DFX_tbuffer */\r\n\r\n/* -------------------- GL_3DFX_texture_compression_FXT1 ------------------- */\r\n\r\n#ifndef GL_3DFX_texture_compression_FXT1\r\n#define GL_3DFX_texture_compression_FXT1 1\r\n\r\n#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0\r\n#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1\r\n\r\n#define GLEW_3DFX_texture_compression_FXT1 GLEW_GET_VAR(__GLEW_3DFX_texture_compression_FXT1)\r\n\r\n#endif /* GL_3DFX_texture_compression_FXT1 */\r\n\r\n/* ----------------------- GL_AMD_draw_buffers_blend ----------------------- */\r\n\r\n#ifndef GL_AMD_draw_buffers_blend\r\n#define GL_AMD_draw_buffers_blend 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLBLENDEQUATIONINDEXEDAMDPROC) (GLuint buf, GLenum mode);\r\ntypedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha);\r\ntypedef void (GLAPIENTRY * PFNGLBLENDFUNCINDEXEDAMDPROC) (GLuint buf, GLenum src, GLenum dst);\r\ntypedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);\r\n\r\n#define glBlendEquationIndexedAMD GLEW_GET_FUN(__glewBlendEquationIndexedAMD)\r\n#define glBlendEquationSeparateIndexedAMD GLEW_GET_FUN(__glewBlendEquationSeparateIndexedAMD)\r\n#define glBlendFuncIndexedAMD GLEW_GET_FUN(__glewBlendFuncIndexedAMD)\r\n#define glBlendFuncSeparateIndexedAMD GLEW_GET_FUN(__glewBlendFuncSeparateIndexedAMD)\r\n\r\n#define GLEW_AMD_draw_buffers_blend GLEW_GET_VAR(__GLEW_AMD_draw_buffers_blend)\r\n\r\n#endif /* GL_AMD_draw_buffers_blend */\r\n\r\n/* ----------------------- GL_AMD_performance_monitor ---------------------- */\r\n\r\n#ifndef GL_AMD_performance_monitor\r\n#define GL_AMD_performance_monitor 1\r\n\r\n#define GL_UNSIGNED_INT 0x1405\r\n#define GL_FLOAT 0x1406\r\n#define GL_COUNTER_TYPE_AMD 0x8BC0\r\n#define GL_COUNTER_RANGE_AMD 0x8BC1\r\n#define GL_UNSIGNED_INT64_AMD 0x8BC2\r\n#define GL_PERCENTAGE_AMD 0x8BC3\r\n#define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4\r\n#define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5\r\n#define GL_PERFMON_RESULT_AMD 0x8BC6\r\n\r\ntypedef void (GLAPIENTRY * PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor);\r\ntypedef void (GLAPIENTRY * PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint* monitors);\r\ntypedef void (GLAPIENTRY * PFNGLENDPERFMONITORAMDPROC) (GLuint monitor);\r\ntypedef void (GLAPIENTRY * PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint* monitors);\r\ntypedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint* data, GLint *bytesWritten);\r\ntypedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, void* data);\r\ntypedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei* length, char *counterString);\r\ntypedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint* numCounters, GLint *maxActiveCounters, GLsizei countersSize, GLuint *counters);\r\ntypedef void (GLAPIENTRY * PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei* length, char *groupString);\r\ntypedef void (GLAPIENTRY * PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint* numGroups, GLsizei groupsSize, GLuint *groups);\r\ntypedef void (GLAPIENTRY * PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint* counterList);\r\n\r\n#define glBeginPerfMonitorAMD GLEW_GET_FUN(__glewBeginPerfMonitorAMD)\r\n#define glDeletePerfMonitorsAMD GLEW_GET_FUN(__glewDeletePerfMonitorsAMD)\r\n#define glEndPerfMonitorAMD GLEW_GET_FUN(__glewEndPerfMonitorAMD)\r\n#define glGenPerfMonitorsAMD GLEW_GET_FUN(__glewGenPerfMonitorsAMD)\r\n#define glGetPerfMonitorCounterDataAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterDataAMD)\r\n#define glGetPerfMonitorCounterInfoAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterInfoAMD)\r\n#define glGetPerfMonitorCounterStringAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterStringAMD)\r\n#define glGetPerfMonitorCountersAMD GLEW_GET_FUN(__glewGetPerfMonitorCountersAMD)\r\n#define glGetPerfMonitorGroupStringAMD GLEW_GET_FUN(__glewGetPerfMonitorGroupStringAMD)\r\n#define glGetPerfMonitorGroupsAMD GLEW_GET_FUN(__glewGetPerfMonitorGroupsAMD)\r\n#define glSelectPerfMonitorCountersAMD GLEW_GET_FUN(__glewSelectPerfMonitorCountersAMD)\r\n\r\n#define GLEW_AMD_performance_monitor GLEW_GET_VAR(__GLEW_AMD_performance_monitor)\r\n\r\n#endif /* GL_AMD_performance_monitor */\r\n\r\n/* ------------------ GL_AMD_seamless_cubemap_per_texture ------------------ */\r\n\r\n#ifndef GL_AMD_seamless_cubemap_per_texture\r\n#define GL_AMD_seamless_cubemap_per_texture 1\r\n\r\n#define GL_TEXTURE_CUBE_MAP_SEAMLESS_ARB 0x884F\r\n\r\n#define GLEW_AMD_seamless_cubemap_per_texture GLEW_GET_VAR(__GLEW_AMD_seamless_cubemap_per_texture)\r\n\r\n#endif /* GL_AMD_seamless_cubemap_per_texture */\r\n\r\n/* ---------------------- GL_AMD_shader_stencil_export --------------------- */\r\n\r\n#ifndef GL_AMD_shader_stencil_export\r\n#define GL_AMD_shader_stencil_export 1\r\n\r\n#define GLEW_AMD_shader_stencil_export GLEW_GET_VAR(__GLEW_AMD_shader_stencil_export)\r\n\r\n#endif /* GL_AMD_shader_stencil_export */\r\n\r\n/* ------------------------ GL_AMD_texture_texture4 ------------------------ */\r\n\r\n#ifndef GL_AMD_texture_texture4\r\n#define GL_AMD_texture_texture4 1\r\n\r\n#define GLEW_AMD_texture_texture4 GLEW_GET_VAR(__GLEW_AMD_texture_texture4)\r\n\r\n#endif /* GL_AMD_texture_texture4 */\r\n\r\n/* -------------------- GL_AMD_vertex_shader_tessellator ------------------- */\r\n\r\n#ifndef GL_AMD_vertex_shader_tessellator\r\n#define GL_AMD_vertex_shader_tessellator 1\r\n\r\n#define GL_SAMPLER_BUFFER_AMD 0x9001\r\n#define GL_INT_SAMPLER_BUFFER_AMD 0x9002\r\n#define GL_UNSIGNED_INT_SAMPLER_BUFFER_AMD 0x9003\r\n#define GL_TESSELLATION_MODE_AMD 0x9004\r\n#define GL_TESSELLATION_FACTOR_AMD 0x9005\r\n#define GL_DISCRETE_AMD 0x9006\r\n#define GL_CONTINUOUS_AMD 0x9007\r\n\r\ntypedef void (GLAPIENTRY * PFNGLTESSELLATIONFACTORAMDPROC) (GLfloat factor);\r\ntypedef void (GLAPIENTRY * PFNGLTESSELLATIONMODEAMDPROC) (GLenum mode);\r\n\r\n#define glTessellationFactorAMD GLEW_GET_FUN(__glewTessellationFactorAMD)\r\n#define glTessellationModeAMD GLEW_GET_FUN(__glewTessellationModeAMD)\r\n\r\n#define GLEW_AMD_vertex_shader_tessellator GLEW_GET_VAR(__GLEW_AMD_vertex_shader_tessellator)\r\n\r\n#endif /* GL_AMD_vertex_shader_tessellator */\r\n\r\n/* ----------------------- GL_APPLE_aux_depth_stencil ---------------------- */\r\n\r\n#ifndef GL_APPLE_aux_depth_stencil\r\n#define GL_APPLE_aux_depth_stencil 1\r\n\r\n#define GL_AUX_DEPTH_STENCIL_APPLE 0x8A14\r\n\r\n#define GLEW_APPLE_aux_depth_stencil GLEW_GET_VAR(__GLEW_APPLE_aux_depth_stencil)\r\n\r\n#endif /* GL_APPLE_aux_depth_stencil */\r\n\r\n/* ------------------------ GL_APPLE_client_storage ------------------------ */\r\n\r\n#ifndef GL_APPLE_client_storage\r\n#define GL_APPLE_client_storage 1\r\n\r\n#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2\r\n\r\n#define GLEW_APPLE_client_storage GLEW_GET_VAR(__GLEW_APPLE_client_storage)\r\n\r\n#endif /* GL_APPLE_client_storage */\r\n\r\n/* ------------------------- GL_APPLE_element_array ------------------------ */\r\n\r\n#ifndef GL_APPLE_element_array\r\n#define GL_APPLE_element_array 1\r\n\r\n#define GL_ELEMENT_ARRAY_APPLE 0x8768\r\n#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8769\r\n#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x876A\r\n\r\ntypedef void (GLAPIENTRY * PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count);\r\ntypedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count);\r\ntypedef void (GLAPIENTRY * PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const void* pointer);\r\ntypedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint* first, const GLsizei *count, GLsizei primcount);\r\ntypedef void (GLAPIENTRY * PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint* first, const GLsizei *count, GLsizei primcount);\r\n\r\n#define glDrawElementArrayAPPLE GLEW_GET_FUN(__glewDrawElementArrayAPPLE)\r\n#define glDrawRangeElementArrayAPPLE GLEW_GET_FUN(__glewDrawRangeElementArrayAPPLE)\r\n#define glElementPointerAPPLE GLEW_GET_FUN(__glewElementPointerAPPLE)\r\n#define glMultiDrawElementArrayAPPLE GLEW_GET_FUN(__glewMultiDrawElementArrayAPPLE)\r\n#define glMultiDrawRangeElementArrayAPPLE GLEW_GET_FUN(__glewMultiDrawRangeElementArrayAPPLE)\r\n\r\n#define GLEW_APPLE_element_array GLEW_GET_VAR(__GLEW_APPLE_element_array)\r\n\r\n#endif /* GL_APPLE_element_array */\r\n\r\n/* ----------------------------- GL_APPLE_fence ---------------------------- */\r\n\r\n#ifndef GL_APPLE_fence\r\n#define GL_APPLE_fence 1\r\n\r\n#define GL_DRAW_PIXELS_APPLE 0x8A0A\r\n#define GL_FENCE_APPLE 0x8A0B\r\n\r\ntypedef void (GLAPIENTRY * PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint* fences);\r\ntypedef void (GLAPIENTRY * PFNGLFINISHFENCEAPPLEPROC) (GLuint fence);\r\ntypedef void (GLAPIENTRY * PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name);\r\ntypedef void (GLAPIENTRY * PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint* fences);\r\ntypedef GLboolean (GLAPIENTRY * PFNGLISFENCEAPPLEPROC) (GLuint fence);\r\ntypedef void (GLAPIENTRY * PFNGLSETFENCEAPPLEPROC) (GLuint fence);\r\ntypedef GLboolean (GLAPIENTRY * PFNGLTESTFENCEAPPLEPROC) (GLuint fence);\r\ntypedef GLboolean (GLAPIENTRY * PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name);\r\n\r\n#define glDeleteFencesAPPLE GLEW_GET_FUN(__glewDeleteFencesAPPLE)\r\n#define glFinishFenceAPPLE GLEW_GET_FUN(__glewFinishFenceAPPLE)\r\n#define glFinishObjectAPPLE GLEW_GET_FUN(__glewFinishObjectAPPLE)\r\n#define glGenFencesAPPLE GLEW_GET_FUN(__glewGenFencesAPPLE)\r\n#define glIsFenceAPPLE GLEW_GET_FUN(__glewIsFenceAPPLE)\r\n#define glSetFenceAPPLE GLEW_GET_FUN(__glewSetFenceAPPLE)\r\n#define glTestFenceAPPLE GLEW_GET_FUN(__glewTestFenceAPPLE)\r\n#define glTestObjectAPPLE GLEW_GET_FUN(__glewTestObjectAPPLE)\r\n\r\n#define GLEW_APPLE_fence GLEW_GET_VAR(__GLEW_APPLE_fence)\r\n\r\n#endif /* GL_APPLE_fence */\r\n\r\n/* ------------------------- GL_APPLE_float_pixels ------------------------- */\r\n\r\n#ifndef GL_APPLE_float_pixels\r\n#define GL_APPLE_float_pixels 1\r\n\r\n#define GL_HALF_APPLE 0x140B\r\n#define GL_RGBA_FLOAT32_APPLE 0x8814\r\n#define GL_RGB_FLOAT32_APPLE 0x8815\r\n#define GL_ALPHA_FLOAT32_APPLE 0x8816\r\n#define GL_INTENSITY_FLOAT32_APPLE 0x8817\r\n#define GL_LUMINANCE_FLOAT32_APPLE 0x8818\r\n#define GL_LUMINANCE_ALPHA_FLOAT32_APPLE 0x8819\r\n#define GL_RGBA_FLOAT16_APPLE 0x881A\r\n#define GL_RGB_FLOAT16_APPLE 0x881B\r\n#define GL_ALPHA_FLOAT16_APPLE 0x881C\r\n#define GL_INTENSITY_FLOAT16_APPLE 0x881D\r\n#define GL_LUMINANCE_FLOAT16_APPLE 0x881E\r\n#define GL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881F\r\n#define GL_COLOR_FLOAT_APPLE 0x8A0F\r\n\r\n#define GLEW_APPLE_float_pixels GLEW_GET_VAR(__GLEW_APPLE_float_pixels)\r\n\r\n#endif /* GL_APPLE_float_pixels */\r\n\r\n/* ---------------------- GL_APPLE_flush_buffer_range ---------------------- */\r\n\r\n#ifndef GL_APPLE_flush_buffer_range\r\n#define GL_APPLE_flush_buffer_range 1\r\n\r\n#define GL_BUFFER_SERIALIZED_MODIFY_APPLE 0x8A12\r\n#define GL_BUFFER_FLUSHING_UNMAP_APPLE 0x8A13\r\n\r\ntypedef void (GLAPIENTRY * PFNGLBUFFERPARAMETERIAPPLEPROC) (GLenum target, GLenum pname, GLint param);\r\ntypedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC) (GLenum target, GLintptr offset, GLsizeiptr size);\r\n\r\n#define glBufferParameteriAPPLE GLEW_GET_FUN(__glewBufferParameteriAPPLE)\r\n#define glFlushMappedBufferRangeAPPLE GLEW_GET_FUN(__glewFlushMappedBufferRangeAPPLE)\r\n\r\n#define GLEW_APPLE_flush_buffer_range GLEW_GET_VAR(__GLEW_APPLE_flush_buffer_range)\r\n\r\n#endif /* GL_APPLE_flush_buffer_range */\r\n\r\n/* ----------------------- GL_APPLE_object_purgeable ----------------------- */\r\n\r\n#ifndef GL_APPLE_object_purgeable\r\n#define GL_APPLE_object_purgeable 1\r\n\r\n#define GL_BUFFER_OBJECT_APPLE 0x85B3\r\n#define GL_RELEASED_APPLE 0x8A19\r\n#define GL_VOLATILE_APPLE 0x8A1A\r\n#define GL_RETAINED_APPLE 0x8A1B\r\n#define GL_UNDEFINED_APPLE 0x8A1C\r\n#define GL_PURGEABLE_APPLE 0x8A1D\r\n\r\ntypedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERIVAPPLEPROC) (GLenum objectType, GLuint name, GLenum pname, GLint* params);\r\ntypedef GLenum (GLAPIENTRY * PFNGLOBJECTPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option);\r\ntypedef GLenum (GLAPIENTRY * PFNGLOBJECTUNPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option);\r\n\r\n#define glGetObjectParameterivAPPLE GLEW_GET_FUN(__glewGetObjectParameterivAPPLE)\r\n#define glObjectPurgeableAPPLE GLEW_GET_FUN(__glewObjectPurgeableAPPLE)\r\n#define glObjectUnpurgeableAPPLE GLEW_GET_FUN(__glewObjectUnpurgeableAPPLE)\r\n\r\n#define GLEW_APPLE_object_purgeable GLEW_GET_VAR(__GLEW_APPLE_object_purgeable)\r\n\r\n#endif /* GL_APPLE_object_purgeable */\r\n\r\n/* ------------------------- GL_APPLE_pixel_buffer ------------------------- */\r\n\r\n#ifndef GL_APPLE_pixel_buffer\r\n#define GL_APPLE_pixel_buffer 1\r\n\r\n#define GL_MIN_PBUFFER_VIEWPORT_DIMS_APPLE 0x8A10\r\n\r\n#define GLEW_APPLE_pixel_buffer GLEW_GET_VAR(__GLEW_APPLE_pixel_buffer)\r\n\r\n#endif /* GL_APPLE_pixel_buffer */\r\n\r\n/* ---------------------------- GL_APPLE_rgb_422 --------------------------- */\r\n\r\n#ifndef GL_APPLE_rgb_422\r\n#define GL_APPLE_rgb_422 1\r\n\r\n#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA\r\n#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB\r\n#define GL_RGB_422_APPLE 0x8A1F\r\n\r\n#define GLEW_APPLE_rgb_422 GLEW_GET_VAR(__GLEW_APPLE_rgb_422)\r\n\r\n#endif /* GL_APPLE_rgb_422 */\r\n\r\n/* --------------------------- GL_APPLE_row_bytes -------------------------- */\r\n\r\n#ifndef GL_APPLE_row_bytes\r\n#define GL_APPLE_row_bytes 1\r\n\r\n#define GL_PACK_ROW_BYTES_APPLE 0x8A15\r\n#define GL_UNPACK_ROW_BYTES_APPLE 0x8A16\r\n\r\n#define GLEW_APPLE_row_bytes GLEW_GET_VAR(__GLEW_APPLE_row_bytes)\r\n\r\n#endif /* GL_APPLE_row_bytes */\r\n\r\n/* ------------------------ GL_APPLE_specular_vector ----------------------- */\r\n\r\n#ifndef GL_APPLE_specular_vector\r\n#define GL_APPLE_specular_vector 1\r\n\r\n#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0\r\n\r\n#define GLEW_APPLE_specular_vector GLEW_GET_VAR(__GLEW_APPLE_specular_vector)\r\n\r\n#endif /* GL_APPLE_specular_vector */\r\n\r\n/* ------------------------- GL_APPLE_texture_range ------------------------ */\r\n\r\n#ifndef GL_APPLE_texture_range\r\n#define GL_APPLE_texture_range 1\r\n\r\n#define GL_TEXTURE_RANGE_LENGTH_APPLE 0x85B7\r\n#define GL_TEXTURE_RANGE_POINTER_APPLE 0x85B8\r\n#define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC\r\n#define GL_STORAGE_PRIVATE_APPLE 0x85BD\r\n#define GL_STORAGE_CACHED_APPLE 0x85BE\r\n#define GL_STORAGE_SHARED_APPLE 0x85BF\r\n\r\ntypedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC) (GLenum target, GLenum pname, GLvoid **params);\r\ntypedef void (GLAPIENTRY * PFNGLTEXTURERANGEAPPLEPROC) (GLenum target, GLsizei length, GLvoid *pointer);\r\n\r\n#define glGetTexParameterPointervAPPLE GLEW_GET_FUN(__glewGetTexParameterPointervAPPLE)\r\n#define glTextureRangeAPPLE GLEW_GET_FUN(__glewTextureRangeAPPLE)\r\n\r\n#define GLEW_APPLE_texture_range GLEW_GET_VAR(__GLEW_APPLE_texture_range)\r\n\r\n#endif /* GL_APPLE_texture_range */\r\n\r\n/* ------------------------ GL_APPLE_transform_hint ------------------------ */\r\n\r\n#ifndef GL_APPLE_transform_hint\r\n#define GL_APPLE_transform_hint 1\r\n\r\n#define GL_TRANSFORM_HINT_APPLE 0x85B1\r\n\r\n#define GLEW_APPLE_transform_hint GLEW_GET_VAR(__GLEW_APPLE_transform_hint)\r\n\r\n#endif /* GL_APPLE_transform_hint */\r\n\r\n/* ---------------------- GL_APPLE_vertex_array_object --------------------- */\r\n\r\n#ifndef GL_APPLE_vertex_array_object\r\n#define GL_APPLE_vertex_array_object 1\r\n\r\n#define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5\r\n\r\ntypedef void (GLAPIENTRY * PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array);\r\ntypedef void (GLAPIENTRY * PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint* arrays);\r\ntypedef void (GLAPIENTRY * PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint* arrays);\r\ntypedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array);\r\n\r\n#define glBindVertexArrayAPPLE GLEW_GET_FUN(__glewBindVertexArrayAPPLE)\r\n#define glDeleteVertexArraysAPPLE GLEW_GET_FUN(__glewDeleteVertexArraysAPPLE)\r\n#define glGenVertexArraysAPPLE GLEW_GET_FUN(__glewGenVertexArraysAPPLE)\r\n#define glIsVertexArrayAPPLE GLEW_GET_FUN(__glewIsVertexArrayAPPLE)\r\n\r\n#define GLEW_APPLE_vertex_array_object GLEW_GET_VAR(__GLEW_APPLE_vertex_array_object)\r\n\r\n#endif /* GL_APPLE_vertex_array_object */\r\n\r\n/* ---------------------- GL_APPLE_vertex_array_range ---------------------- */\r\n\r\n#ifndef GL_APPLE_vertex_array_range\r\n#define GL_APPLE_vertex_array_range 1\r\n\r\n#define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D\r\n#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E\r\n#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F\r\n#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_APPLE 0x8520\r\n#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521\r\n#define GL_STORAGE_CACHED_APPLE 0x85BE\r\n#define GL_STORAGE_SHARED_APPLE 0x85BF\r\n\r\ntypedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void* pointer);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void* pointer);\r\n\r\n#define glFlushVertexArrayRangeAPPLE GLEW_GET_FUN(__glewFlushVertexArrayRangeAPPLE)\r\n#define glVertexArrayParameteriAPPLE GLEW_GET_FUN(__glewVertexArrayParameteriAPPLE)\r\n#define glVertexArrayRangeAPPLE GLEW_GET_FUN(__glewVertexArrayRangeAPPLE)\r\n\r\n#define GLEW_APPLE_vertex_array_range GLEW_GET_VAR(__GLEW_APPLE_vertex_array_range)\r\n\r\n#endif /* GL_APPLE_vertex_array_range */\r\n\r\n/* ------------------- GL_APPLE_vertex_program_evaluators ------------------ */\r\n\r\n#ifndef GL_APPLE_vertex_program_evaluators\r\n#define GL_APPLE_vertex_program_evaluators 1\r\n\r\n#define GL_VERTEX_ATTRIB_MAP1_APPLE 0x8A00\r\n#define GL_VERTEX_ATTRIB_MAP2_APPLE 0x8A01\r\n#define GL_VERTEX_ATTRIB_MAP1_SIZE_APPLE 0x8A02\r\n#define GL_VERTEX_ATTRIB_MAP1_COEFF_APPLE 0x8A03\r\n#define GL_VERTEX_ATTRIB_MAP1_ORDER_APPLE 0x8A04\r\n#define GL_VERTEX_ATTRIB_MAP1_DOMAIN_APPLE 0x8A05\r\n#define GL_VERTEX_ATTRIB_MAP2_SIZE_APPLE 0x8A06\r\n#define GL_VERTEX_ATTRIB_MAP2_COEFF_APPLE 0x8A07\r\n#define GL_VERTEX_ATTRIB_MAP2_ORDER_APPLE 0x8A08\r\n#define GL_VERTEX_ATTRIB_MAP2_DOMAIN_APPLE 0x8A09\r\n\r\ntypedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname);\r\ntypedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname);\r\ntypedef GLboolean (GLAPIENTRY * PFNGLISVERTEXATTRIBENABLEDAPPLEPROC) (GLuint index, GLenum pname);\r\ntypedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB1DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble* points);\r\ntypedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB1FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat* points);\r\ntypedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB2DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble* points);\r\ntypedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB2FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat* points);\r\n\r\n#define glDisableVertexAttribAPPLE GLEW_GET_FUN(__glewDisableVertexAttribAPPLE)\r\n#define glEnableVertexAttribAPPLE GLEW_GET_FUN(__glewEnableVertexAttribAPPLE)\r\n#define glIsVertexAttribEnabledAPPLE GLEW_GET_FUN(__glewIsVertexAttribEnabledAPPLE)\r\n#define glMapVertexAttrib1dAPPLE GLEW_GET_FUN(__glewMapVertexAttrib1dAPPLE)\r\n#define glMapVertexAttrib1fAPPLE GLEW_GET_FUN(__glewMapVertexAttrib1fAPPLE)\r\n#define glMapVertexAttrib2dAPPLE GLEW_GET_FUN(__glewMapVertexAttrib2dAPPLE)\r\n#define glMapVertexAttrib2fAPPLE GLEW_GET_FUN(__glewMapVertexAttrib2fAPPLE)\r\n\r\n#define GLEW_APPLE_vertex_program_evaluators GLEW_GET_VAR(__GLEW_APPLE_vertex_program_evaluators)\r\n\r\n#endif /* GL_APPLE_vertex_program_evaluators */\r\n\r\n/* --------------------------- GL_APPLE_ycbcr_422 -------------------------- */\r\n\r\n#ifndef GL_APPLE_ycbcr_422\r\n#define GL_APPLE_ycbcr_422 1\r\n\r\n#define GL_YCBCR_422_APPLE 0x85B9\r\n#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA\r\n#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB\r\n\r\n#define GLEW_APPLE_ycbcr_422 GLEW_GET_VAR(__GLEW_APPLE_ycbcr_422)\r\n\r\n#endif /* GL_APPLE_ycbcr_422 */\r\n\r\n/* ----------------------- GL_ARB_color_buffer_float ----------------------- */\r\n\r\n#ifndef GL_ARB_color_buffer_float\r\n#define GL_ARB_color_buffer_float 1\r\n\r\n#define GL_RGBA_FLOAT_MODE_ARB 0x8820\r\n#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A\r\n#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B\r\n#define GL_CLAMP_READ_COLOR_ARB 0x891C\r\n#define GL_FIXED_ONLY_ARB 0x891D\r\n\r\ntypedef void (GLAPIENTRY * PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp);\r\n\r\n#define glClampColorARB GLEW_GET_FUN(__glewClampColorARB)\r\n\r\n#define GLEW_ARB_color_buffer_float GLEW_GET_VAR(__GLEW_ARB_color_buffer_float)\r\n\r\n#endif /* GL_ARB_color_buffer_float */\r\n\r\n/* -------------------------- GL_ARB_compatibility ------------------------- */\r\n\r\n#ifndef GL_ARB_compatibility\r\n#define GL_ARB_compatibility 1\r\n\r\n#define GLEW_ARB_compatibility GLEW_GET_VAR(__GLEW_ARB_compatibility)\r\n\r\n#endif /* GL_ARB_compatibility */\r\n\r\n/* --------------------------- GL_ARB_copy_buffer -------------------------- */\r\n\r\n#ifndef GL_ARB_copy_buffer\r\n#define GL_ARB_copy_buffer 1\r\n\r\n#define GL_COPY_READ_BUFFER 0x8F36\r\n#define GL_COPY_WRITE_BUFFER 0x8F37\r\n\r\ntypedef void (GLAPIENTRY * PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size);\r\n\r\n#define glCopyBufferSubData GLEW_GET_FUN(__glewCopyBufferSubData)\r\n\r\n#define GLEW_ARB_copy_buffer GLEW_GET_VAR(__GLEW_ARB_copy_buffer)\r\n\r\n#endif /* GL_ARB_copy_buffer */\r\n\r\n/* ----------------------- GL_ARB_depth_buffer_float ----------------------- */\r\n\r\n#ifndef GL_ARB_depth_buffer_float\r\n#define GL_ARB_depth_buffer_float 1\r\n\r\n#define GL_DEPTH_COMPONENT32F 0x8CAC\r\n#define GL_DEPTH32F_STENCIL8 0x8CAD\r\n#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD\r\n\r\n#define GLEW_ARB_depth_buffer_float GLEW_GET_VAR(__GLEW_ARB_depth_buffer_float)\r\n\r\n#endif /* GL_ARB_depth_buffer_float */\r\n\r\n/* --------------------------- GL_ARB_depth_clamp -------------------------- */\r\n\r\n#ifndef GL_ARB_depth_clamp\r\n#define GL_ARB_depth_clamp 1\r\n\r\n#define GL_DEPTH_CLAMP 0x864F\r\n\r\n#define GLEW_ARB_depth_clamp GLEW_GET_VAR(__GLEW_ARB_depth_clamp)\r\n\r\n#endif /* GL_ARB_depth_clamp */\r\n\r\n/* -------------------------- GL_ARB_depth_texture ------------------------- */\r\n\r\n#ifndef GL_ARB_depth_texture\r\n#define GL_ARB_depth_texture 1\r\n\r\n#define GL_DEPTH_COMPONENT16_ARB 0x81A5\r\n#define GL_DEPTH_COMPONENT24_ARB 0x81A6\r\n#define GL_DEPTH_COMPONENT32_ARB 0x81A7\r\n#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A\r\n#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B\r\n\r\n#define GLEW_ARB_depth_texture GLEW_GET_VAR(__GLEW_ARB_depth_texture)\r\n\r\n#endif /* GL_ARB_depth_texture */\r\n\r\n/* -------------------------- GL_ARB_draw_buffers -------------------------- */\r\n\r\n#ifndef GL_ARB_draw_buffers\r\n#define GL_ARB_draw_buffers 1\r\n\r\n#define GL_MAX_DRAW_BUFFERS_ARB 0x8824\r\n#define GL_DRAW_BUFFER0_ARB 0x8825\r\n#define GL_DRAW_BUFFER1_ARB 0x8826\r\n#define GL_DRAW_BUFFER2_ARB 0x8827\r\n#define GL_DRAW_BUFFER3_ARB 0x8828\r\n#define GL_DRAW_BUFFER4_ARB 0x8829\r\n#define GL_DRAW_BUFFER5_ARB 0x882A\r\n#define GL_DRAW_BUFFER6_ARB 0x882B\r\n#define GL_DRAW_BUFFER7_ARB 0x882C\r\n#define GL_DRAW_BUFFER8_ARB 0x882D\r\n#define GL_DRAW_BUFFER9_ARB 0x882E\r\n#define GL_DRAW_BUFFER10_ARB 0x882F\r\n#define GL_DRAW_BUFFER11_ARB 0x8830\r\n#define GL_DRAW_BUFFER12_ARB 0x8831\r\n#define GL_DRAW_BUFFER13_ARB 0x8832\r\n#define GL_DRAW_BUFFER14_ARB 0x8833\r\n#define GL_DRAW_BUFFER15_ARB 0x8834\r\n\r\ntypedef void (GLAPIENTRY * PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum* bufs);\r\n\r\n#define glDrawBuffersARB GLEW_GET_FUN(__glewDrawBuffersARB)\r\n\r\n#define GLEW_ARB_draw_buffers GLEW_GET_VAR(__GLEW_ARB_draw_buffers)\r\n\r\n#endif /* GL_ARB_draw_buffers */\r\n\r\n/* ----------------------- GL_ARB_draw_buffers_blend ----------------------- */\r\n\r\n#ifndef GL_ARB_draw_buffers_blend\r\n#define GL_ARB_draw_buffers_blend 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEIARBPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha);\r\ntypedef void (GLAPIENTRY * PFNGLBLENDEQUATIONIARBPROC) (GLuint buf, GLenum mode);\r\ntypedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEIARBPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);\r\ntypedef void (GLAPIENTRY * PFNGLBLENDFUNCIARBPROC) (GLuint buf, GLenum src, GLenum dst);\r\n\r\n#define glBlendEquationSeparateiARB GLEW_GET_FUN(__glewBlendEquationSeparateiARB)\r\n#define glBlendEquationiARB GLEW_GET_FUN(__glewBlendEquationiARB)\r\n#define glBlendFuncSeparateiARB GLEW_GET_FUN(__glewBlendFuncSeparateiARB)\r\n#define glBlendFunciARB GLEW_GET_FUN(__glewBlendFunciARB)\r\n\r\n#define GLEW_ARB_draw_buffers_blend GLEW_GET_VAR(__GLEW_ARB_draw_buffers_blend)\r\n\r\n#endif /* GL_ARB_draw_buffers_blend */\r\n\r\n/* -------------------- GL_ARB_draw_elements_base_vertex ------------------- */\r\n\r\n#ifndef GL_ARB_draw_elements_base_vertex\r\n#define GL_ARB_draw_elements_base_vertex 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, void* indices, GLint basevertex);\r\ntypedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount, GLint basevertex);\r\ntypedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, void* indices, GLint basevertex);\r\ntypedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei* count, GLenum type, GLvoid**indices, GLsizei primcount, GLint *basevertex);\r\n\r\n#define glDrawElementsBaseVertex GLEW_GET_FUN(__glewDrawElementsBaseVertex)\r\n#define glDrawElementsInstancedBaseVertex GLEW_GET_FUN(__glewDrawElementsInstancedBaseVertex)\r\n#define glDrawRangeElementsBaseVertex GLEW_GET_FUN(__glewDrawRangeElementsBaseVertex)\r\n#define glMultiDrawElementsBaseVertex GLEW_GET_FUN(__glewMultiDrawElementsBaseVertex)\r\n\r\n#define GLEW_ARB_draw_elements_base_vertex GLEW_GET_VAR(__GLEW_ARB_draw_elements_base_vertex)\r\n\r\n#endif /* GL_ARB_draw_elements_base_vertex */\r\n\r\n/* ------------------------- GL_ARB_draw_instanced ------------------------- */\r\n\r\n#ifndef GL_ARB_draw_instanced\r\n#define GL_ARB_draw_instanced 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDARBPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount);\r\ntypedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDARBPROC) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount);\r\n\r\n#define glDrawArraysInstancedARB GLEW_GET_FUN(__glewDrawArraysInstancedARB)\r\n#define glDrawElementsInstancedARB GLEW_GET_FUN(__glewDrawElementsInstancedARB)\r\n\r\n#define GLEW_ARB_draw_instanced GLEW_GET_VAR(__GLEW_ARB_draw_instanced)\r\n\r\n#endif /* GL_ARB_draw_instanced */\r\n\r\n/* ------------------- GL_ARB_fragment_coord_conventions ------------------- */\r\n\r\n#ifndef GL_ARB_fragment_coord_conventions\r\n#define GL_ARB_fragment_coord_conventions 1\r\n\r\n#define GLEW_ARB_fragment_coord_conventions GLEW_GET_VAR(__GLEW_ARB_fragment_coord_conventions)\r\n\r\n#endif /* GL_ARB_fragment_coord_conventions */\r\n\r\n/* ------------------------ GL_ARB_fragment_program ------------------------ */\r\n\r\n#ifndef GL_ARB_fragment_program\r\n#define GL_ARB_fragment_program 1\r\n\r\n#define GL_FRAGMENT_PROGRAM_ARB 0x8804\r\n#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805\r\n#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806\r\n#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807\r\n#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808\r\n#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809\r\n#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A\r\n#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B\r\n#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C\r\n#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D\r\n#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E\r\n#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F\r\n#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810\r\n#define GL_MAX_TEXTURE_COORDS_ARB 0x8871\r\n#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872\r\n\r\n#define GLEW_ARB_fragment_program GLEW_GET_VAR(__GLEW_ARB_fragment_program)\r\n\r\n#endif /* GL_ARB_fragment_program */\r\n\r\n/* --------------------- GL_ARB_fragment_program_shadow -------------------- */\r\n\r\n#ifndef GL_ARB_fragment_program_shadow\r\n#define GL_ARB_fragment_program_shadow 1\r\n\r\n#define GLEW_ARB_fragment_program_shadow GLEW_GET_VAR(__GLEW_ARB_fragment_program_shadow)\r\n\r\n#endif /* GL_ARB_fragment_program_shadow */\r\n\r\n/* ------------------------- GL_ARB_fragment_shader ------------------------ */\r\n\r\n#ifndef GL_ARB_fragment_shader\r\n#define GL_ARB_fragment_shader 1\r\n\r\n#define GL_FRAGMENT_SHADER_ARB 0x8B30\r\n#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49\r\n#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B\r\n\r\n#define GLEW_ARB_fragment_shader GLEW_GET_VAR(__GLEW_ARB_fragment_shader)\r\n\r\n#endif /* GL_ARB_fragment_shader */\r\n\r\n/* ----------------------- GL_ARB_framebuffer_object ----------------------- */\r\n\r\n#ifndef GL_ARB_framebuffer_object\r\n#define GL_ARB_framebuffer_object 1\r\n\r\n#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506\r\n#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210\r\n#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211\r\n#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212\r\n#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213\r\n#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214\r\n#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215\r\n#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216\r\n#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217\r\n#define GL_FRAMEBUFFER_DEFAULT 0x8218\r\n#define GL_FRAMEBUFFER_UNDEFINED 0x8219\r\n#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A\r\n#define GL_INDEX 0x8222\r\n#define GL_MAX_RENDERBUFFER_SIZE 0x84E8\r\n#define GL_DEPTH_STENCIL 0x84F9\r\n#define GL_UNSIGNED_INT_24_8 0x84FA\r\n#define GL_DEPTH24_STENCIL8 0x88F0\r\n#define GL_TEXTURE_STENCIL_SIZE 0x88F1\r\n#define GL_UNSIGNED_NORMALIZED 0x8C17\r\n#define GL_SRGB 0x8C40\r\n#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6\r\n#define GL_FRAMEBUFFER_BINDING 0x8CA6\r\n#define GL_RENDERBUFFER_BINDING 0x8CA7\r\n#define GL_READ_FRAMEBUFFER 0x8CA8\r\n#define GL_DRAW_FRAMEBUFFER 0x8CA9\r\n#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA\r\n#define GL_RENDERBUFFER_SAMPLES 0x8CAB\r\n#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0\r\n#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1\r\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2\r\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3\r\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4\r\n#define GL_FRAMEBUFFER_COMPLETE 0x8CD5\r\n#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6\r\n#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7\r\n#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB\r\n#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC\r\n#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD\r\n#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF\r\n#define GL_COLOR_ATTACHMENT0 0x8CE0\r\n#define GL_COLOR_ATTACHMENT1 0x8CE1\r\n#define GL_COLOR_ATTACHMENT2 0x8CE2\r\n#define GL_COLOR_ATTACHMENT3 0x8CE3\r\n#define GL_COLOR_ATTACHMENT4 0x8CE4\r\n#define GL_COLOR_ATTACHMENT5 0x8CE5\r\n#define GL_COLOR_ATTACHMENT6 0x8CE6\r\n#define GL_COLOR_ATTACHMENT7 0x8CE7\r\n#define GL_COLOR_ATTACHMENT8 0x8CE8\r\n#define GL_COLOR_ATTACHMENT9 0x8CE9\r\n#define GL_COLOR_ATTACHMENT10 0x8CEA\r\n#define GL_COLOR_ATTACHMENT11 0x8CEB\r\n#define GL_COLOR_ATTACHMENT12 0x8CEC\r\n#define GL_COLOR_ATTACHMENT13 0x8CED\r\n#define GL_COLOR_ATTACHMENT14 0x8CEE\r\n#define GL_COLOR_ATTACHMENT15 0x8CEF\r\n#define GL_DEPTH_ATTACHMENT 0x8D00\r\n#define GL_STENCIL_ATTACHMENT 0x8D20\r\n#define GL_FRAMEBUFFER 0x8D40\r\n#define GL_RENDERBUFFER 0x8D41\r\n#define GL_RENDERBUFFER_WIDTH 0x8D42\r\n#define GL_RENDERBUFFER_HEIGHT 0x8D43\r\n#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44\r\n#define GL_STENCIL_INDEX1 0x8D46\r\n#define GL_STENCIL_INDEX4 0x8D47\r\n#define GL_STENCIL_INDEX8 0x8D48\r\n#define GL_STENCIL_INDEX16 0x8D49\r\n#define GL_RENDERBUFFER_RED_SIZE 0x8D50\r\n#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51\r\n#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52\r\n#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53\r\n#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54\r\n#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55\r\n#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56\r\n#define GL_MAX_SAMPLES 0x8D57\r\n\r\ntypedef void (GLAPIENTRY * PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer);\r\ntypedef void (GLAPIENTRY * PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer);\r\ntypedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);\r\ntypedef GLenum (GLAPIENTRY * PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target);\r\ntypedef void (GLAPIENTRY * PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint* framebuffers);\r\ntypedef void (GLAPIENTRY * PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint* renderbuffers);\r\ntypedef void (GLAPIENTRY * PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);\r\ntypedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE1DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\r\ntypedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\r\ntypedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE3DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint layer);\r\ntypedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target,GLenum attachment, GLuint texture,GLint level,GLint layer);\r\ntypedef void (GLAPIENTRY * PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint* framebuffers);\r\ntypedef void (GLAPIENTRY * PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint* renderbuffers);\r\ntypedef void (GLAPIENTRY * PFNGLGENERATEMIPMAPPROC) (GLenum target);\r\ntypedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params);\r\ntypedef GLboolean (GLAPIENTRY * PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer);\r\ntypedef GLboolean (GLAPIENTRY * PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer);\r\ntypedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);\r\ntypedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);\r\n\r\n#define glBindFramebuffer GLEW_GET_FUN(__glewBindFramebuffer)\r\n#define glBindRenderbuffer GLEW_GET_FUN(__glewBindRenderbuffer)\r\n#define glBlitFramebuffer GLEW_GET_FUN(__glewBlitFramebuffer)\r\n#define glCheckFramebufferStatus GLEW_GET_FUN(__glewCheckFramebufferStatus)\r\n#define glDeleteFramebuffers GLEW_GET_FUN(__glewDeleteFramebuffers)\r\n#define glDeleteRenderbuffers GLEW_GET_FUN(__glewDeleteRenderbuffers)\r\n#define glFramebufferRenderbuffer GLEW_GET_FUN(__glewFramebufferRenderbuffer)\r\n#define glFramebufferTexture1D GLEW_GET_FUN(__glewFramebufferTexture1D)\r\n#define glFramebufferTexture2D GLEW_GET_FUN(__glewFramebufferTexture2D)\r\n#define glFramebufferTexture3D GLEW_GET_FUN(__glewFramebufferTexture3D)\r\n#define glFramebufferTextureLayer GLEW_GET_FUN(__glewFramebufferTextureLayer)\r\n#define glGenFramebuffers GLEW_GET_FUN(__glewGenFramebuffers)\r\n#define glGenRenderbuffers GLEW_GET_FUN(__glewGenRenderbuffers)\r\n#define glGenerateMipmap GLEW_GET_FUN(__glewGenerateMipmap)\r\n#define glGetFramebufferAttachmentParameteriv GLEW_GET_FUN(__glewGetFramebufferAttachmentParameteriv)\r\n#define glGetRenderbufferParameteriv GLEW_GET_FUN(__glewGetRenderbufferParameteriv)\r\n#define glIsFramebuffer GLEW_GET_FUN(__glewIsFramebuffer)\r\n#define glIsRenderbuffer GLEW_GET_FUN(__glewIsRenderbuffer)\r\n#define glRenderbufferStorage GLEW_GET_FUN(__glewRenderbufferStorage)\r\n#define glRenderbufferStorageMultisample GLEW_GET_FUN(__glewRenderbufferStorageMultisample)\r\n\r\n#define GLEW_ARB_framebuffer_object GLEW_GET_VAR(__GLEW_ARB_framebuffer_object)\r\n\r\n#endif /* GL_ARB_framebuffer_object */\r\n\r\n/* ------------------------ GL_ARB_framebuffer_sRGB ------------------------ */\r\n\r\n#ifndef GL_ARB_framebuffer_sRGB\r\n#define GL_ARB_framebuffer_sRGB 1\r\n\r\n#define GL_FRAMEBUFFER_SRGB 0x8DB9\r\n\r\n#define GLEW_ARB_framebuffer_sRGB GLEW_GET_VAR(__GLEW_ARB_framebuffer_sRGB)\r\n\r\n#endif /* GL_ARB_framebuffer_sRGB */\r\n\r\n/* ------------------------ GL_ARB_geometry_shader4 ------------------------ */\r\n\r\n#ifndef GL_ARB_geometry_shader4\r\n#define GL_ARB_geometry_shader4 1\r\n\r\n#define GL_LINES_ADJACENCY_ARB 0xA\r\n#define GL_LINE_STRIP_ADJACENCY_ARB 0xB\r\n#define GL_TRIANGLES_ADJACENCY_ARB 0xC\r\n#define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0xD\r\n#define GL_PROGRAM_POINT_SIZE_ARB 0x8642\r\n#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8C29\r\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4\r\n#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8DA7\r\n#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8DA8\r\n#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8DA9\r\n#define GL_GEOMETRY_SHADER_ARB 0x8DD9\r\n#define GL_GEOMETRY_VERTICES_OUT_ARB 0x8DDA\r\n#define GL_GEOMETRY_INPUT_TYPE_ARB 0x8DDB\r\n#define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8DDC\r\n#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8DDD\r\n#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8DDE\r\n#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8DDF\r\n#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8DE0\r\n#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8DE1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level);\r\ntypedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face);\r\ntypedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYERARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIARBPROC) (GLuint program, GLenum pname, GLint value);\r\n\r\n#define glFramebufferTextureARB GLEW_GET_FUN(__glewFramebufferTextureARB)\r\n#define glFramebufferTextureFaceARB GLEW_GET_FUN(__glewFramebufferTextureFaceARB)\r\n#define glFramebufferTextureLayerARB GLEW_GET_FUN(__glewFramebufferTextureLayerARB)\r\n#define glProgramParameteriARB GLEW_GET_FUN(__glewProgramParameteriARB)\r\n\r\n#define GLEW_ARB_geometry_shader4 GLEW_GET_VAR(__GLEW_ARB_geometry_shader4)\r\n\r\n#endif /* GL_ARB_geometry_shader4 */\r\n\r\n/* ------------------------ GL_ARB_half_float_pixel ------------------------ */\r\n\r\n#ifndef GL_ARB_half_float_pixel\r\n#define GL_ARB_half_float_pixel 1\r\n\r\n#define GL_HALF_FLOAT_ARB 0x140B\r\n\r\n#define GLEW_ARB_half_float_pixel GLEW_GET_VAR(__GLEW_ARB_half_float_pixel)\r\n\r\n#endif /* GL_ARB_half_float_pixel */\r\n\r\n/* ------------------------ GL_ARB_half_float_vertex ----------------------- */\r\n\r\n#ifndef GL_ARB_half_float_vertex\r\n#define GL_ARB_half_float_vertex 1\r\n\r\n#define GL_HALF_FLOAT 0x140B\r\n\r\n#define GLEW_ARB_half_float_vertex GLEW_GET_VAR(__GLEW_ARB_half_float_vertex)\r\n\r\n#endif /* GL_ARB_half_float_vertex */\r\n\r\n/* ----------------------------- GL_ARB_imaging ---------------------------- */\r\n\r\n#ifndef GL_ARB_imaging\r\n#define GL_ARB_imaging 1\r\n\r\n#define GL_CONSTANT_COLOR 0x8001\r\n#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002\r\n#define GL_CONSTANT_ALPHA 0x8003\r\n#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004\r\n#define GL_BLEND_COLOR 0x8005\r\n#define GL_FUNC_ADD 0x8006\r\n#define GL_MIN 0x8007\r\n#define GL_MAX 0x8008\r\n#define GL_BLEND_EQUATION 0x8009\r\n#define GL_FUNC_SUBTRACT 0x800A\r\n#define GL_FUNC_REVERSE_SUBTRACT 0x800B\r\n#define GL_CONVOLUTION_1D 0x8010\r\n#define GL_CONVOLUTION_2D 0x8011\r\n#define GL_SEPARABLE_2D 0x8012\r\n#define GL_CONVOLUTION_BORDER_MODE 0x8013\r\n#define GL_CONVOLUTION_FILTER_SCALE 0x8014\r\n#define GL_CONVOLUTION_FILTER_BIAS 0x8015\r\n#define GL_REDUCE 0x8016\r\n#define GL_CONVOLUTION_FORMAT 0x8017\r\n#define GL_CONVOLUTION_WIDTH 0x8018\r\n#define GL_CONVOLUTION_HEIGHT 0x8019\r\n#define GL_MAX_CONVOLUTION_WIDTH 0x801A\r\n#define GL_MAX_CONVOLUTION_HEIGHT 0x801B\r\n#define GL_POST_CONVOLUTION_RED_SCALE 0x801C\r\n#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D\r\n#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E\r\n#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F\r\n#define GL_POST_CONVOLUTION_RED_BIAS 0x8020\r\n#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021\r\n#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022\r\n#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023\r\n#define GL_HISTOGRAM 0x8024\r\n#define GL_PROXY_HISTOGRAM 0x8025\r\n#define GL_HISTOGRAM_WIDTH 0x8026\r\n#define GL_HISTOGRAM_FORMAT 0x8027\r\n#define GL_HISTOGRAM_RED_SIZE 0x8028\r\n#define GL_HISTOGRAM_GREEN_SIZE 0x8029\r\n#define GL_HISTOGRAM_BLUE_SIZE 0x802A\r\n#define GL_HISTOGRAM_ALPHA_SIZE 0x802B\r\n#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C\r\n#define GL_HISTOGRAM_SINK 0x802D\r\n#define GL_MINMAX 0x802E\r\n#define GL_MINMAX_FORMAT 0x802F\r\n#define GL_MINMAX_SINK 0x8030\r\n#define GL_TABLE_TOO_LARGE 0x8031\r\n#define GL_COLOR_MATRIX 0x80B1\r\n#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2\r\n#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3\r\n#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4\r\n#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5\r\n#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6\r\n#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7\r\n#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8\r\n#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9\r\n#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA\r\n#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB\r\n#define GL_COLOR_TABLE 0x80D0\r\n#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1\r\n#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2\r\n#define GL_PROXY_COLOR_TABLE 0x80D3\r\n#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4\r\n#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5\r\n#define GL_COLOR_TABLE_SCALE 0x80D6\r\n#define GL_COLOR_TABLE_BIAS 0x80D7\r\n#define GL_COLOR_TABLE_FORMAT 0x80D8\r\n#define GL_COLOR_TABLE_WIDTH 0x80D9\r\n#define GL_COLOR_TABLE_RED_SIZE 0x80DA\r\n#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB\r\n#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC\r\n#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD\r\n#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE\r\n#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF\r\n#define GL_IGNORE_BORDER 0x8150\r\n#define GL_CONSTANT_BORDER 0x8151\r\n#define GL_WRAP_BORDER 0x8152\r\n#define GL_REPLICATE_BORDER 0x8153\r\n#define GL_CONVOLUTION_BORDER_COLOR 0x8154\r\n\r\ntypedef void (GLAPIENTRY * PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data);\r\ntypedef void (GLAPIENTRY * PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table);\r\ntypedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params);\r\ntypedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params);\r\ntypedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image);\r\ntypedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image);\r\ntypedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params);\r\ntypedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params);\r\ntypedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params);\r\ntypedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params);\r\ntypedef void (GLAPIENTRY * PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);\r\ntypedef void (GLAPIENTRY * PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);\r\ntypedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);\r\ntypedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);\r\ntypedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table);\r\ntypedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);\r\ntypedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);\r\ntypedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image);\r\ntypedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);\r\ntypedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);\r\ntypedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);\r\ntypedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);\r\ntypedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);\r\ntypedef void (GLAPIENTRY * PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum types, GLvoid *values);\r\ntypedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);\r\ntypedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);\r\ntypedef void (GLAPIENTRY * PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span);\r\ntypedef void (GLAPIENTRY * PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);\r\ntypedef void (GLAPIENTRY * PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink);\r\ntypedef void (GLAPIENTRY * PFNGLRESETHISTOGRAMPROC) (GLenum target);\r\ntypedef void (GLAPIENTRY * PFNGLRESETMINMAXPROC) (GLenum target);\r\ntypedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column);\r\n\r\n#define glColorSubTable GLEW_GET_FUN(__glewColorSubTable)\r\n#define glColorTable GLEW_GET_FUN(__glewColorTable)\r\n#define glColorTableParameterfv GLEW_GET_FUN(__glewColorTableParameterfv)\r\n#define glColorTableParameteriv GLEW_GET_FUN(__glewColorTableParameteriv)\r\n#define glConvolutionFilter1D GLEW_GET_FUN(__glewConvolutionFilter1D)\r\n#define glConvolutionFilter2D GLEW_GET_FUN(__glewConvolutionFilter2D)\r\n#define glConvolutionParameterf GLEW_GET_FUN(__glewConvolutionParameterf)\r\n#define glConvolutionParameterfv GLEW_GET_FUN(__glewConvolutionParameterfv)\r\n#define glConvolutionParameteri GLEW_GET_FUN(__glewConvolutionParameteri)\r\n#define glConvolutionParameteriv GLEW_GET_FUN(__glewConvolutionParameteriv)\r\n#define glCopyColorSubTable GLEW_GET_FUN(__glewCopyColorSubTable)\r\n#define glCopyColorTable GLEW_GET_FUN(__glewCopyColorTable)\r\n#define glCopyConvolutionFilter1D GLEW_GET_FUN(__glewCopyConvolutionFilter1D)\r\n#define glCopyConvolutionFilter2D GLEW_GET_FUN(__glewCopyConvolutionFilter2D)\r\n#define glGetColorTable GLEW_GET_FUN(__glewGetColorTable)\r\n#define glGetColorTableParameterfv GLEW_GET_FUN(__glewGetColorTableParameterfv)\r\n#define glGetColorTableParameteriv GLEW_GET_FUN(__glewGetColorTableParameteriv)\r\n#define glGetConvolutionFilter GLEW_GET_FUN(__glewGetConvolutionFilter)\r\n#define glGetConvolutionParameterfv GLEW_GET_FUN(__glewGetConvolutionParameterfv)\r\n#define glGetConvolutionParameteriv GLEW_GET_FUN(__glewGetConvolutionParameteriv)\r\n#define glGetHistogram GLEW_GET_FUN(__glewGetHistogram)\r\n#define glGetHistogramParameterfv GLEW_GET_FUN(__glewGetHistogramParameterfv)\r\n#define glGetHistogramParameteriv GLEW_GET_FUN(__glewGetHistogramParameteriv)\r\n#define glGetMinmax GLEW_GET_FUN(__glewGetMinmax)\r\n#define glGetMinmaxParameterfv GLEW_GET_FUN(__glewGetMinmaxParameterfv)\r\n#define glGetMinmaxParameteriv GLEW_GET_FUN(__glewGetMinmaxParameteriv)\r\n#define glGetSeparableFilter GLEW_GET_FUN(__glewGetSeparableFilter)\r\n#define glHistogram GLEW_GET_FUN(__glewHistogram)\r\n#define glMinmax GLEW_GET_FUN(__glewMinmax)\r\n#define glResetHistogram GLEW_GET_FUN(__glewResetHistogram)\r\n#define glResetMinmax GLEW_GET_FUN(__glewResetMinmax)\r\n#define glSeparableFilter2D GLEW_GET_FUN(__glewSeparableFilter2D)\r\n\r\n#define GLEW_ARB_imaging GLEW_GET_VAR(__GLEW_ARB_imaging)\r\n\r\n#endif /* GL_ARB_imaging */\r\n\r\n/* ------------------------ GL_ARB_instanced_arrays ------------------------ */\r\n\r\n#ifndef GL_ARB_instanced_arrays\r\n#define GL_ARB_instanced_arrays 1\r\n\r\n#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB 0x88FE\r\n\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORARBPROC) (GLuint index, GLuint divisor);\r\n\r\n#define glVertexAttribDivisorARB GLEW_GET_FUN(__glewVertexAttribDivisorARB)\r\n\r\n#define GLEW_ARB_instanced_arrays GLEW_GET_VAR(__GLEW_ARB_instanced_arrays)\r\n\r\n#endif /* GL_ARB_instanced_arrays */\r\n\r\n/* ------------------------ GL_ARB_map_buffer_range ------------------------ */\r\n\r\n#ifndef GL_ARB_map_buffer_range\r\n#define GL_ARB_map_buffer_range 1\r\n\r\n#define GL_MAP_READ_BIT 0x0001\r\n#define GL_MAP_WRITE_BIT 0x0002\r\n#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004\r\n#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008\r\n#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010\r\n#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020\r\n\r\ntypedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length);\r\ntypedef GLvoid * (GLAPIENTRY * PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);\r\n\r\n#define glFlushMappedBufferRange GLEW_GET_FUN(__glewFlushMappedBufferRange)\r\n#define glMapBufferRange GLEW_GET_FUN(__glewMapBufferRange)\r\n\r\n#define GLEW_ARB_map_buffer_range GLEW_GET_VAR(__GLEW_ARB_map_buffer_range)\r\n\r\n#endif /* GL_ARB_map_buffer_range */\r\n\r\n/* ------------------------- GL_ARB_matrix_palette ------------------------- */\r\n\r\n#ifndef GL_ARB_matrix_palette\r\n#define GL_ARB_matrix_palette 1\r\n\r\n#define GL_MATRIX_PALETTE_ARB 0x8840\r\n#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841\r\n#define GL_MAX_PALETTE_MATRICES_ARB 0x8842\r\n#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843\r\n#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844\r\n#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845\r\n#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846\r\n#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847\r\n#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848\r\n#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849\r\n\r\ntypedef void (GLAPIENTRY * PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index);\r\ntypedef void (GLAPIENTRY * PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer);\r\ntypedef void (GLAPIENTRY * PFNGLMATRIXINDEXUBVARBPROC) (GLint size, GLubyte *indices);\r\ntypedef void (GLAPIENTRY * PFNGLMATRIXINDEXUIVARBPROC) (GLint size, GLuint *indices);\r\ntypedef void (GLAPIENTRY * PFNGLMATRIXINDEXUSVARBPROC) (GLint size, GLushort *indices);\r\n\r\n#define glCurrentPaletteMatrixARB GLEW_GET_FUN(__glewCurrentPaletteMatrixARB)\r\n#define glMatrixIndexPointerARB GLEW_GET_FUN(__glewMatrixIndexPointerARB)\r\n#define glMatrixIndexubvARB GLEW_GET_FUN(__glewMatrixIndexubvARB)\r\n#define glMatrixIndexuivARB GLEW_GET_FUN(__glewMatrixIndexuivARB)\r\n#define glMatrixIndexusvARB GLEW_GET_FUN(__glewMatrixIndexusvARB)\r\n\r\n#define GLEW_ARB_matrix_palette GLEW_GET_VAR(__GLEW_ARB_matrix_palette)\r\n\r\n#endif /* GL_ARB_matrix_palette */\r\n\r\n/* --------------------------- GL_ARB_multisample -------------------------- */\r\n\r\n#ifndef GL_ARB_multisample\r\n#define GL_ARB_multisample 1\r\n\r\n#define GL_MULTISAMPLE_ARB 0x809D\r\n#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E\r\n#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F\r\n#define GL_SAMPLE_COVERAGE_ARB 0x80A0\r\n#define GL_SAMPLE_BUFFERS_ARB 0x80A8\r\n#define GL_SAMPLES_ARB 0x80A9\r\n#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA\r\n#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB\r\n#define GL_MULTISAMPLE_BIT_ARB 0x20000000\r\n\r\ntypedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert);\r\n\r\n#define glSampleCoverageARB GLEW_GET_FUN(__glewSampleCoverageARB)\r\n\r\n#define GLEW_ARB_multisample GLEW_GET_VAR(__GLEW_ARB_multisample)\r\n\r\n#endif /* GL_ARB_multisample */\r\n\r\n/* -------------------------- GL_ARB_multitexture -------------------------- */\r\n\r\n#ifndef GL_ARB_multitexture\r\n#define GL_ARB_multitexture 1\r\n\r\n#define GL_TEXTURE0_ARB 0x84C0\r\n#define GL_TEXTURE1_ARB 0x84C1\r\n#define GL_TEXTURE2_ARB 0x84C2\r\n#define GL_TEXTURE3_ARB 0x84C3\r\n#define GL_TEXTURE4_ARB 0x84C4\r\n#define GL_TEXTURE5_ARB 0x84C5\r\n#define GL_TEXTURE6_ARB 0x84C6\r\n#define GL_TEXTURE7_ARB 0x84C7\r\n#define GL_TEXTURE8_ARB 0x84C8\r\n#define GL_TEXTURE9_ARB 0x84C9\r\n#define GL_TEXTURE10_ARB 0x84CA\r\n#define GL_TEXTURE11_ARB 0x84CB\r\n#define GL_TEXTURE12_ARB 0x84CC\r\n#define GL_TEXTURE13_ARB 0x84CD\r\n#define GL_TEXTURE14_ARB 0x84CE\r\n#define GL_TEXTURE15_ARB 0x84CF\r\n#define GL_TEXTURE16_ARB 0x84D0\r\n#define GL_TEXTURE17_ARB 0x84D1\r\n#define GL_TEXTURE18_ARB 0x84D2\r\n#define GL_TEXTURE19_ARB 0x84D3\r\n#define GL_TEXTURE20_ARB 0x84D4\r\n#define GL_TEXTURE21_ARB 0x84D5\r\n#define GL_TEXTURE22_ARB 0x84D6\r\n#define GL_TEXTURE23_ARB 0x84D7\r\n#define GL_TEXTURE24_ARB 0x84D8\r\n#define GL_TEXTURE25_ARB 0x84D9\r\n#define GL_TEXTURE26_ARB 0x84DA\r\n#define GL_TEXTURE27_ARB 0x84DB\r\n#define GL_TEXTURE28_ARB 0x84DC\r\n#define GL_TEXTURE29_ARB 0x84DD\r\n#define GL_TEXTURE30_ARB 0x84DE\r\n#define GL_TEXTURE31_ARB 0x84DF\r\n#define GL_ACTIVE_TEXTURE_ARB 0x84E0\r\n#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1\r\n#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2\r\n\r\ntypedef void (GLAPIENTRY * PFNGLACTIVETEXTUREARBPROC) (GLenum texture);\r\ntypedef void (GLAPIENTRY * PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v);\r\n\r\n#define glActiveTextureARB GLEW_GET_FUN(__glewActiveTextureARB)\r\n#define glClientActiveTextureARB GLEW_GET_FUN(__glewClientActiveTextureARB)\r\n#define glMultiTexCoord1dARB GLEW_GET_FUN(__glewMultiTexCoord1dARB)\r\n#define glMultiTexCoord1dvARB GLEW_GET_FUN(__glewMultiTexCoord1dvARB)\r\n#define glMultiTexCoord1fARB GLEW_GET_FUN(__glewMultiTexCoord1fARB)\r\n#define glMultiTexCoord1fvARB GLEW_GET_FUN(__glewMultiTexCoord1fvARB)\r\n#define glMultiTexCoord1iARB GLEW_GET_FUN(__glewMultiTexCoord1iARB)\r\n#define glMultiTexCoord1ivARB GLEW_GET_FUN(__glewMultiTexCoord1ivARB)\r\n#define glMultiTexCoord1sARB GLEW_GET_FUN(__glewMultiTexCoord1sARB)\r\n#define glMultiTexCoord1svARB GLEW_GET_FUN(__glewMultiTexCoord1svARB)\r\n#define glMultiTexCoord2dARB GLEW_GET_FUN(__glewMultiTexCoord2dARB)\r\n#define glMultiTexCoord2dvARB GLEW_GET_FUN(__glewMultiTexCoord2dvARB)\r\n#define glMultiTexCoord2fARB GLEW_GET_FUN(__glewMultiTexCoord2fARB)\r\n#define glMultiTexCoord2fvARB GLEW_GET_FUN(__glewMultiTexCoord2fvARB)\r\n#define glMultiTexCoord2iARB GLEW_GET_FUN(__glewMultiTexCoord2iARB)\r\n#define glMultiTexCoord2ivARB GLEW_GET_FUN(__glewMultiTexCoord2ivARB)\r\n#define glMultiTexCoord2sARB GLEW_GET_FUN(__glewMultiTexCoord2sARB)\r\n#define glMultiTexCoord2svARB GLEW_GET_FUN(__glewMultiTexCoord2svARB)\r\n#define glMultiTexCoord3dARB GLEW_GET_FUN(__glewMultiTexCoord3dARB)\r\n#define glMultiTexCoord3dvARB GLEW_GET_FUN(__glewMultiTexCoord3dvARB)\r\n#define glMultiTexCoord3fARB GLEW_GET_FUN(__glewMultiTexCoord3fARB)\r\n#define glMultiTexCoord3fvARB GLEW_GET_FUN(__glewMultiTexCoord3fvARB)\r\n#define glMultiTexCoord3iARB GLEW_GET_FUN(__glewMultiTexCoord3iARB)\r\n#define glMultiTexCoord3ivARB GLEW_GET_FUN(__glewMultiTexCoord3ivARB)\r\n#define glMultiTexCoord3sARB GLEW_GET_FUN(__glewMultiTexCoord3sARB)\r\n#define glMultiTexCoord3svARB GLEW_GET_FUN(__glewMultiTexCoord3svARB)\r\n#define glMultiTexCoord4dARB GLEW_GET_FUN(__glewMultiTexCoord4dARB)\r\n#define glMultiTexCoord4dvARB GLEW_GET_FUN(__glewMultiTexCoord4dvARB)\r\n#define glMultiTexCoord4fARB GLEW_GET_FUN(__glewMultiTexCoord4fARB)\r\n#define glMultiTexCoord4fvARB GLEW_GET_FUN(__glewMultiTexCoord4fvARB)\r\n#define glMultiTexCoord4iARB GLEW_GET_FUN(__glewMultiTexCoord4iARB)\r\n#define glMultiTexCoord4ivARB GLEW_GET_FUN(__glewMultiTexCoord4ivARB)\r\n#define glMultiTexCoord4sARB GLEW_GET_FUN(__glewMultiTexCoord4sARB)\r\n#define glMultiTexCoord4svARB GLEW_GET_FUN(__glewMultiTexCoord4svARB)\r\n\r\n#define GLEW_ARB_multitexture GLEW_GET_VAR(__GLEW_ARB_multitexture)\r\n\r\n#endif /* GL_ARB_multitexture */\r\n\r\n/* ------------------------- GL_ARB_occlusion_query ------------------------ */\r\n\r\n#ifndef GL_ARB_occlusion_query\r\n#define GL_ARB_occlusion_query 1\r\n\r\n#define GL_QUERY_COUNTER_BITS_ARB 0x8864\r\n#define GL_CURRENT_QUERY_ARB 0x8865\r\n#define GL_QUERY_RESULT_ARB 0x8866\r\n#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867\r\n#define GL_SAMPLES_PASSED_ARB 0x8914\r\n\r\ntypedef void (GLAPIENTRY * PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id);\r\ntypedef void (GLAPIENTRY * PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint* ids);\r\ntypedef void (GLAPIENTRY * PFNGLENDQUERYARBPROC) (GLenum target);\r\ntypedef void (GLAPIENTRY * PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint* ids);\r\ntypedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint* params);\r\ntypedef GLboolean (GLAPIENTRY * PFNGLISQUERYARBPROC) (GLuint id);\r\n\r\n#define glBeginQueryARB GLEW_GET_FUN(__glewBeginQueryARB)\r\n#define glDeleteQueriesARB GLEW_GET_FUN(__glewDeleteQueriesARB)\r\n#define glEndQueryARB GLEW_GET_FUN(__glewEndQueryARB)\r\n#define glGenQueriesARB GLEW_GET_FUN(__glewGenQueriesARB)\r\n#define glGetQueryObjectivARB GLEW_GET_FUN(__glewGetQueryObjectivARB)\r\n#define glGetQueryObjectuivARB GLEW_GET_FUN(__glewGetQueryObjectuivARB)\r\n#define glGetQueryivARB GLEW_GET_FUN(__glewGetQueryivARB)\r\n#define glIsQueryARB GLEW_GET_FUN(__glewIsQueryARB)\r\n\r\n#define GLEW_ARB_occlusion_query GLEW_GET_VAR(__GLEW_ARB_occlusion_query)\r\n\r\n#endif /* GL_ARB_occlusion_query */\r\n\r\n/* ----------------------- GL_ARB_pixel_buffer_object ---------------------- */\r\n\r\n#ifndef GL_ARB_pixel_buffer_object\r\n#define GL_ARB_pixel_buffer_object 1\r\n\r\n#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB\r\n#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC\r\n#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED\r\n#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF\r\n\r\n#define GLEW_ARB_pixel_buffer_object GLEW_GET_VAR(__GLEW_ARB_pixel_buffer_object)\r\n\r\n#endif /* GL_ARB_pixel_buffer_object */\r\n\r\n/* ------------------------ GL_ARB_point_parameters ------------------------ */\r\n\r\n#ifndef GL_ARB_point_parameters\r\n#define GL_ARB_point_parameters 1\r\n\r\n#define GL_POINT_SIZE_MIN_ARB 0x8126\r\n#define GL_POINT_SIZE_MAX_ARB 0x8127\r\n#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128\r\n#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129\r\n\r\ntypedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param);\r\ntypedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, GLfloat* params);\r\n\r\n#define glPointParameterfARB GLEW_GET_FUN(__glewPointParameterfARB)\r\n#define glPointParameterfvARB GLEW_GET_FUN(__glewPointParameterfvARB)\r\n\r\n#define GLEW_ARB_point_parameters GLEW_GET_VAR(__GLEW_ARB_point_parameters)\r\n\r\n#endif /* GL_ARB_point_parameters */\r\n\r\n/* -------------------------- GL_ARB_point_sprite -------------------------- */\r\n\r\n#ifndef GL_ARB_point_sprite\r\n#define GL_ARB_point_sprite 1\r\n\r\n#define GL_POINT_SPRITE_ARB 0x8861\r\n#define GL_COORD_REPLACE_ARB 0x8862\r\n\r\n#define GLEW_ARB_point_sprite GLEW_GET_VAR(__GLEW_ARB_point_sprite)\r\n\r\n#endif /* GL_ARB_point_sprite */\r\n\r\n/* ------------------------ GL_ARB_provoking_vertex ------------------------ */\r\n\r\n#ifndef GL_ARB_provoking_vertex\r\n#define GL_ARB_provoking_vertex 1\r\n\r\n#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C\r\n#define GL_FIRST_VERTEX_CONVENTION 0x8E4D\r\n#define GL_LAST_VERTEX_CONVENTION 0x8E4E\r\n#define GL_PROVOKING_VERTEX 0x8E4F\r\n\r\ntypedef void (GLAPIENTRY * PFNGLPROVOKINGVERTEXPROC) (GLenum mode);\r\n\r\n#define glProvokingVertex GLEW_GET_FUN(__glewProvokingVertex)\r\n\r\n#define GLEW_ARB_provoking_vertex GLEW_GET_VAR(__GLEW_ARB_provoking_vertex)\r\n\r\n#endif /* GL_ARB_provoking_vertex */\r\n\r\n/* ------------------------- GL_ARB_sample_shading ------------------------- */\r\n\r\n#ifndef GL_ARB_sample_shading\r\n#define GL_ARB_sample_shading 1\r\n\r\n#define GL_SAMPLE_SHADING_ARB 0x8C36\r\n#define GL_MIN_SAMPLE_SHADING_VALUE_ARB 0x8C37\r\n\r\ntypedef void (GLAPIENTRY * PFNGLMINSAMPLESHADINGARBPROC) (GLclampf value);\r\n\r\n#define glMinSampleShadingARB GLEW_GET_FUN(__glewMinSampleShadingARB)\r\n\r\n#define GLEW_ARB_sample_shading GLEW_GET_VAR(__GLEW_ARB_sample_shading)\r\n\r\n#endif /* GL_ARB_sample_shading */\r\n\r\n/* ------------------------ GL_ARB_seamless_cube_map ----------------------- */\r\n\r\n#ifndef GL_ARB_seamless_cube_map\r\n#define GL_ARB_seamless_cube_map 1\r\n\r\n#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F\r\n\r\n#define GLEW_ARB_seamless_cube_map GLEW_GET_VAR(__GLEW_ARB_seamless_cube_map)\r\n\r\n#endif /* GL_ARB_seamless_cube_map */\r\n\r\n/* ------------------------- GL_ARB_shader_objects ------------------------- */\r\n\r\n#ifndef GL_ARB_shader_objects\r\n#define GL_ARB_shader_objects 1\r\n\r\n#define GL_PROGRAM_OBJECT_ARB 0x8B40\r\n#define GL_SHADER_OBJECT_ARB 0x8B48\r\n#define GL_OBJECT_TYPE_ARB 0x8B4E\r\n#define GL_OBJECT_SUBTYPE_ARB 0x8B4F\r\n#define GL_FLOAT_VEC2_ARB 0x8B50\r\n#define GL_FLOAT_VEC3_ARB 0x8B51\r\n#define GL_FLOAT_VEC4_ARB 0x8B52\r\n#define GL_INT_VEC2_ARB 0x8B53\r\n#define GL_INT_VEC3_ARB 0x8B54\r\n#define GL_INT_VEC4_ARB 0x8B55\r\n#define GL_BOOL_ARB 0x8B56\r\n#define GL_BOOL_VEC2_ARB 0x8B57\r\n#define GL_BOOL_VEC3_ARB 0x8B58\r\n#define GL_BOOL_VEC4_ARB 0x8B59\r\n#define GL_FLOAT_MAT2_ARB 0x8B5A\r\n#define GL_FLOAT_MAT3_ARB 0x8B5B\r\n#define GL_FLOAT_MAT4_ARB 0x8B5C\r\n#define GL_SAMPLER_1D_ARB 0x8B5D\r\n#define GL_SAMPLER_2D_ARB 0x8B5E\r\n#define GL_SAMPLER_3D_ARB 0x8B5F\r\n#define GL_SAMPLER_CUBE_ARB 0x8B60\r\n#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61\r\n#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62\r\n#define GL_SAMPLER_2D_RECT_ARB 0x8B63\r\n#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64\r\n#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80\r\n#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81\r\n#define GL_OBJECT_LINK_STATUS_ARB 0x8B82\r\n#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83\r\n#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84\r\n#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85\r\n#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86\r\n#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87\r\n#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88\r\n\r\ntypedef char GLcharARB;\r\ntypedef unsigned int GLhandleARB;\r\n\r\ntypedef void (GLAPIENTRY * PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj);\r\ntypedef void (GLAPIENTRY * PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj);\r\ntypedef GLhandleARB (GLAPIENTRY * PFNGLCREATEPROGRAMOBJECTARBPROC) (void);\r\ntypedef GLhandleARB (GLAPIENTRY * PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType);\r\ntypedef void (GLAPIENTRY * PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj);\r\ntypedef void (GLAPIENTRY * PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj);\r\ntypedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint *size, GLenum *type, GLcharARB *name);\r\ntypedef void (GLAPIENTRY * PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei* count, GLhandleARB *obj);\r\ntypedef GLhandleARB (GLAPIENTRY * PFNGLGETHANDLEARBPROC) (GLenum pname);\r\ntypedef void (GLAPIENTRY * PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB *infoLog);\r\ntypedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB *source);\r\ntypedef GLint (GLAPIENTRY * PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB* name);\r\ntypedef void (GLAPIENTRY * PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj);\r\ntypedef void (GLAPIENTRY * PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB ** string, const GLint *length);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat* value);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint* value);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat* value);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint* value);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat* value);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint* value);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat* value);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint* value);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\r\ntypedef void (GLAPIENTRY * PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj);\r\ntypedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj);\r\n\r\n#define glAttachObjectARB GLEW_GET_FUN(__glewAttachObjectARB)\r\n#define glCompileShaderARB GLEW_GET_FUN(__glewCompileShaderARB)\r\n#define glCreateProgramObjectARB GLEW_GET_FUN(__glewCreateProgramObjectARB)\r\n#define glCreateShaderObjectARB GLEW_GET_FUN(__glewCreateShaderObjectARB)\r\n#define glDeleteObjectARB GLEW_GET_FUN(__glewDeleteObjectARB)\r\n#define glDetachObjectARB GLEW_GET_FUN(__glewDetachObjectARB)\r\n#define glGetActiveUniformARB GLEW_GET_FUN(__glewGetActiveUniformARB)\r\n#define glGetAttachedObjectsARB GLEW_GET_FUN(__glewGetAttachedObjectsARB)\r\n#define glGetHandleARB GLEW_GET_FUN(__glewGetHandleARB)\r\n#define glGetInfoLogARB GLEW_GET_FUN(__glewGetInfoLogARB)\r\n#define glGetObjectParameterfvARB GLEW_GET_FUN(__glewGetObjectParameterfvARB)\r\n#define glGetObjectParameterivARB GLEW_GET_FUN(__glewGetObjectParameterivARB)\r\n#define glGetShaderSourceARB GLEW_GET_FUN(__glewGetShaderSourceARB)\r\n#define glGetUniformLocationARB GLEW_GET_FUN(__glewGetUniformLocationARB)\r\n#define glGetUniformfvARB GLEW_GET_FUN(__glewGetUniformfvARB)\r\n#define glGetUniformivARB GLEW_GET_FUN(__glewGetUniformivARB)\r\n#define glLinkProgramARB GLEW_GET_FUN(__glewLinkProgramARB)\r\n#define glShaderSourceARB GLEW_GET_FUN(__glewShaderSourceARB)\r\n#define glUniform1fARB GLEW_GET_FUN(__glewUniform1fARB)\r\n#define glUniform1fvARB GLEW_GET_FUN(__glewUniform1fvARB)\r\n#define glUniform1iARB GLEW_GET_FUN(__glewUniform1iARB)\r\n#define glUniform1ivARB GLEW_GET_FUN(__glewUniform1ivARB)\r\n#define glUniform2fARB GLEW_GET_FUN(__glewUniform2fARB)\r\n#define glUniform2fvARB GLEW_GET_FUN(__glewUniform2fvARB)\r\n#define glUniform2iARB GLEW_GET_FUN(__glewUniform2iARB)\r\n#define glUniform2ivARB GLEW_GET_FUN(__glewUniform2ivARB)\r\n#define glUniform3fARB GLEW_GET_FUN(__glewUniform3fARB)\r\n#define glUniform3fvARB GLEW_GET_FUN(__glewUniform3fvARB)\r\n#define glUniform3iARB GLEW_GET_FUN(__glewUniform3iARB)\r\n#define glUniform3ivARB GLEW_GET_FUN(__glewUniform3ivARB)\r\n#define glUniform4fARB GLEW_GET_FUN(__glewUniform4fARB)\r\n#define glUniform4fvARB GLEW_GET_FUN(__glewUniform4fvARB)\r\n#define glUniform4iARB GLEW_GET_FUN(__glewUniform4iARB)\r\n#define glUniform4ivARB GLEW_GET_FUN(__glewUniform4ivARB)\r\n#define glUniformMatrix2fvARB GLEW_GET_FUN(__glewUniformMatrix2fvARB)\r\n#define glUniformMatrix3fvARB GLEW_GET_FUN(__glewUniformMatrix3fvARB)\r\n#define glUniformMatrix4fvARB GLEW_GET_FUN(__glewUniformMatrix4fvARB)\r\n#define glUseProgramObjectARB GLEW_GET_FUN(__glewUseProgramObjectARB)\r\n#define glValidateProgramARB GLEW_GET_FUN(__glewValidateProgramARB)\r\n\r\n#define GLEW_ARB_shader_objects GLEW_GET_VAR(__GLEW_ARB_shader_objects)\r\n\r\n#endif /* GL_ARB_shader_objects */\r\n\r\n/* ----------------------- GL_ARB_shader_texture_lod ----------------------- */\r\n\r\n#ifndef GL_ARB_shader_texture_lod\r\n#define GL_ARB_shader_texture_lod 1\r\n\r\n#define GLEW_ARB_shader_texture_lod GLEW_GET_VAR(__GLEW_ARB_shader_texture_lod)\r\n\r\n#endif /* GL_ARB_shader_texture_lod */\r\n\r\n/* ---------------------- GL_ARB_shading_language_100 ---------------------- */\r\n\r\n#ifndef GL_ARB_shading_language_100\r\n#define GL_ARB_shading_language_100 1\r\n\r\n#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C\r\n\r\n#define GLEW_ARB_shading_language_100 GLEW_GET_VAR(__GLEW_ARB_shading_language_100)\r\n\r\n#endif /* GL_ARB_shading_language_100 */\r\n\r\n/* ----------------------------- GL_ARB_shadow ----------------------------- */\r\n\r\n#ifndef GL_ARB_shadow\r\n#define GL_ARB_shadow 1\r\n\r\n#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C\r\n#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D\r\n#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E\r\n\r\n#define GLEW_ARB_shadow GLEW_GET_VAR(__GLEW_ARB_shadow)\r\n\r\n#endif /* GL_ARB_shadow */\r\n\r\n/* ------------------------- GL_ARB_shadow_ambient ------------------------- */\r\n\r\n#ifndef GL_ARB_shadow_ambient\r\n#define GL_ARB_shadow_ambient 1\r\n\r\n#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF\r\n\r\n#define GLEW_ARB_shadow_ambient GLEW_GET_VAR(__GLEW_ARB_shadow_ambient)\r\n\r\n#endif /* GL_ARB_shadow_ambient */\r\n\r\n/* ------------------------------ GL_ARB_sync ------------------------------ */\r\n\r\n#ifndef GL_ARB_sync\r\n#define GL_ARB_sync 1\r\n\r\n#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001\r\n#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111\r\n#define GL_OBJECT_TYPE 0x9112\r\n#define GL_SYNC_CONDITION 0x9113\r\n#define GL_SYNC_STATUS 0x9114\r\n#define GL_SYNC_FLAGS 0x9115\r\n#define GL_SYNC_FENCE 0x9116\r\n#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117\r\n#define GL_UNSIGNALED 0x9118\r\n#define GL_SIGNALED 0x9119\r\n#define GL_ALREADY_SIGNALED 0x911A\r\n#define GL_TIMEOUT_EXPIRED 0x911B\r\n#define GL_CONDITION_SATISFIED 0x911C\r\n#define GL_WAIT_FAILED 0x911D\r\n#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFF\r\n\r\ntypedef GLenum (GLAPIENTRY * PFNGLCLIENTWAITSYNCPROC) (GLsync GLsync,GLbitfield flags,GLuint64 timeout);\r\ntypedef void (GLAPIENTRY * PFNGLDELETESYNCPROC) (GLsync GLsync);\r\ntypedef GLsync (GLAPIENTRY * PFNGLFENCESYNCPROC) (GLenum condition,GLbitfield flags);\r\ntypedef void (GLAPIENTRY * PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETSYNCIVPROC) (GLsync GLsync,GLenum pname,GLsizei bufSize,GLsizei* length, GLint *values);\r\ntypedef GLboolean (GLAPIENTRY * PFNGLISSYNCPROC) (GLsync GLsync);\r\ntypedef void (GLAPIENTRY * PFNGLWAITSYNCPROC) (GLsync GLsync,GLbitfield flags,GLuint64 timeout);\r\n\r\n#define glClientWaitSync GLEW_GET_FUN(__glewClientWaitSync)\r\n#define glDeleteSync GLEW_GET_FUN(__glewDeleteSync)\r\n#define glFenceSync GLEW_GET_FUN(__glewFenceSync)\r\n#define glGetInteger64v GLEW_GET_FUN(__glewGetInteger64v)\r\n#define glGetSynciv GLEW_GET_FUN(__glewGetSynciv)\r\n#define glIsSync GLEW_GET_FUN(__glewIsSync)\r\n#define glWaitSync GLEW_GET_FUN(__glewWaitSync)\r\n\r\n#define GLEW_ARB_sync GLEW_GET_VAR(__GLEW_ARB_sync)\r\n\r\n#endif /* GL_ARB_sync */\r\n\r\n/* ---------------------- GL_ARB_texture_border_clamp ---------------------- */\r\n\r\n#ifndef GL_ARB_texture_border_clamp\r\n#define GL_ARB_texture_border_clamp 1\r\n\r\n#define GL_CLAMP_TO_BORDER_ARB 0x812D\r\n\r\n#define GLEW_ARB_texture_border_clamp GLEW_GET_VAR(__GLEW_ARB_texture_border_clamp)\r\n\r\n#endif /* GL_ARB_texture_border_clamp */\r\n\r\n/* ---------------------- GL_ARB_texture_buffer_object --------------------- */\r\n\r\n#ifndef GL_ARB_texture_buffer_object\r\n#define GL_ARB_texture_buffer_object 1\r\n\r\n#define GL_TEXTURE_BUFFER_ARB 0x8C2A\r\n#define GL_MAX_TEXTURE_BUFFER_SIZE_ARB 0x8C2B\r\n#define GL_TEXTURE_BINDING_BUFFER_ARB 0x8C2C\r\n#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB 0x8C2D\r\n#define GL_TEXTURE_BUFFER_FORMAT_ARB 0x8C2E\r\n\r\ntypedef void (GLAPIENTRY * PFNGLTEXBUFFERARBPROC) (GLenum target, GLenum internalformat, GLuint buffer);\r\n\r\n#define glTexBufferARB GLEW_GET_FUN(__glewTexBufferARB)\r\n\r\n#define GLEW_ARB_texture_buffer_object GLEW_GET_VAR(__GLEW_ARB_texture_buffer_object)\r\n\r\n#endif /* GL_ARB_texture_buffer_object */\r\n\r\n/* ----------------------- GL_ARB_texture_compression ---------------------- */\r\n\r\n#ifndef GL_ARB_texture_compression\r\n#define GL_ARB_texture_compression 1\r\n\r\n#define GL_COMPRESSED_ALPHA_ARB 0x84E9\r\n#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA\r\n#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB\r\n#define GL_COMPRESSED_INTENSITY_ARB 0x84EC\r\n#define GL_COMPRESSED_RGB_ARB 0x84ED\r\n#define GL_COMPRESSED_RGBA_ARB 0x84EE\r\n#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF\r\n#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0\r\n#define GL_TEXTURE_COMPRESSED_ARB 0x86A1\r\n#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2\r\n#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3\r\n\r\ntypedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void* data);\r\ntypedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data);\r\ntypedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data);\r\ntypedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void* data);\r\ntypedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data);\r\ntypedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data);\r\ntypedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, void* img);\r\n\r\n#define glCompressedTexImage1DARB GLEW_GET_FUN(__glewCompressedTexImage1DARB)\r\n#define glCompressedTexImage2DARB GLEW_GET_FUN(__glewCompressedTexImage2DARB)\r\n#define glCompressedTexImage3DARB GLEW_GET_FUN(__glewCompressedTexImage3DARB)\r\n#define glCompressedTexSubImage1DARB GLEW_GET_FUN(__glewCompressedTexSubImage1DARB)\r\n#define glCompressedTexSubImage2DARB GLEW_GET_FUN(__glewCompressedTexSubImage2DARB)\r\n#define glCompressedTexSubImage3DARB GLEW_GET_FUN(__glewCompressedTexSubImage3DARB)\r\n#define glGetCompressedTexImageARB GLEW_GET_FUN(__glewGetCompressedTexImageARB)\r\n\r\n#define GLEW_ARB_texture_compression GLEW_GET_VAR(__GLEW_ARB_texture_compression)\r\n\r\n#endif /* GL_ARB_texture_compression */\r\n\r\n/* -------------------- GL_ARB_texture_compression_rgtc -------------------- */\r\n\r\n#ifndef GL_ARB_texture_compression_rgtc\r\n#define GL_ARB_texture_compression_rgtc 1\r\n\r\n#define GL_COMPRESSED_RED_RGTC1 0x8DBB\r\n#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC\r\n#define GL_COMPRESSED_RG_RGTC2 0x8DBD\r\n#define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE\r\n\r\n#define GLEW_ARB_texture_compression_rgtc GLEW_GET_VAR(__GLEW_ARB_texture_compression_rgtc)\r\n\r\n#endif /* GL_ARB_texture_compression_rgtc */\r\n\r\n/* ------------------------ GL_ARB_texture_cube_map ------------------------ */\r\n\r\n#ifndef GL_ARB_texture_cube_map\r\n#define GL_ARB_texture_cube_map 1\r\n\r\n#define GL_NORMAL_MAP_ARB 0x8511\r\n#define GL_REFLECTION_MAP_ARB 0x8512\r\n#define GL_TEXTURE_CUBE_MAP_ARB 0x8513\r\n#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514\r\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515\r\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516\r\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517\r\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518\r\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519\r\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A\r\n#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B\r\n#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C\r\n\r\n#define GLEW_ARB_texture_cube_map GLEW_GET_VAR(__GLEW_ARB_texture_cube_map)\r\n\r\n#endif /* GL_ARB_texture_cube_map */\r\n\r\n/* --------------------- GL_ARB_texture_cube_map_array --------------------- */\r\n\r\n#ifndef GL_ARB_texture_cube_map_array\r\n#define GL_ARB_texture_cube_map_array 1\r\n\r\n#define GL_TEXTURE_CUBE_MAP_ARRAY_ARB 0x9009\r\n#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB 0x900A\r\n#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB 0x900B\r\n#define GL_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900C\r\n#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D\r\n#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900E\r\n#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900F\r\n\r\n#define GLEW_ARB_texture_cube_map_array GLEW_GET_VAR(__GLEW_ARB_texture_cube_map_array)\r\n\r\n#endif /* GL_ARB_texture_cube_map_array */\r\n\r\n/* ------------------------- GL_ARB_texture_env_add ------------------------ */\r\n\r\n#ifndef GL_ARB_texture_env_add\r\n#define GL_ARB_texture_env_add 1\r\n\r\n#define GLEW_ARB_texture_env_add GLEW_GET_VAR(__GLEW_ARB_texture_env_add)\r\n\r\n#endif /* GL_ARB_texture_env_add */\r\n\r\n/* ----------------------- GL_ARB_texture_env_combine ---------------------- */\r\n\r\n#ifndef GL_ARB_texture_env_combine\r\n#define GL_ARB_texture_env_combine 1\r\n\r\n#define GL_SUBTRACT_ARB 0x84E7\r\n#define GL_COMBINE_ARB 0x8570\r\n#define GL_COMBINE_RGB_ARB 0x8571\r\n#define GL_COMBINE_ALPHA_ARB 0x8572\r\n#define GL_RGB_SCALE_ARB 0x8573\r\n#define GL_ADD_SIGNED_ARB 0x8574\r\n#define GL_INTERPOLATE_ARB 0x8575\r\n#define GL_CONSTANT_ARB 0x8576\r\n#define GL_PRIMARY_COLOR_ARB 0x8577\r\n#define GL_PREVIOUS_ARB 0x8578\r\n#define GL_SOURCE0_RGB_ARB 0x8580\r\n#define GL_SOURCE1_RGB_ARB 0x8581\r\n#define GL_SOURCE2_RGB_ARB 0x8582\r\n#define GL_SOURCE0_ALPHA_ARB 0x8588\r\n#define GL_SOURCE1_ALPHA_ARB 0x8589\r\n#define GL_SOURCE2_ALPHA_ARB 0x858A\r\n#define GL_OPERAND0_RGB_ARB 0x8590\r\n#define GL_OPERAND1_RGB_ARB 0x8591\r\n#define GL_OPERAND2_RGB_ARB 0x8592\r\n#define GL_OPERAND0_ALPHA_ARB 0x8598\r\n#define GL_OPERAND1_ALPHA_ARB 0x8599\r\n#define GL_OPERAND2_ALPHA_ARB 0x859A\r\n\r\n#define GLEW_ARB_texture_env_combine GLEW_GET_VAR(__GLEW_ARB_texture_env_combine)\r\n\r\n#endif /* GL_ARB_texture_env_combine */\r\n\r\n/* ---------------------- GL_ARB_texture_env_crossbar ---------------------- */\r\n\r\n#ifndef GL_ARB_texture_env_crossbar\r\n#define GL_ARB_texture_env_crossbar 1\r\n\r\n#define GLEW_ARB_texture_env_crossbar GLEW_GET_VAR(__GLEW_ARB_texture_env_crossbar)\r\n\r\n#endif /* GL_ARB_texture_env_crossbar */\r\n\r\n/* ------------------------ GL_ARB_texture_env_dot3 ------------------------ */\r\n\r\n#ifndef GL_ARB_texture_env_dot3\r\n#define GL_ARB_texture_env_dot3 1\r\n\r\n#define GL_DOT3_RGB_ARB 0x86AE\r\n#define GL_DOT3_RGBA_ARB 0x86AF\r\n\r\n#define GLEW_ARB_texture_env_dot3 GLEW_GET_VAR(__GLEW_ARB_texture_env_dot3)\r\n\r\n#endif /* GL_ARB_texture_env_dot3 */\r\n\r\n/* -------------------------- GL_ARB_texture_float ------------------------- */\r\n\r\n#ifndef GL_ARB_texture_float\r\n#define GL_ARB_texture_float 1\r\n\r\n#define GL_RGBA32F_ARB 0x8814\r\n#define GL_RGB32F_ARB 0x8815\r\n#define GL_ALPHA32F_ARB 0x8816\r\n#define GL_INTENSITY32F_ARB 0x8817\r\n#define GL_LUMINANCE32F_ARB 0x8818\r\n#define GL_LUMINANCE_ALPHA32F_ARB 0x8819\r\n#define GL_RGBA16F_ARB 0x881A\r\n#define GL_RGB16F_ARB 0x881B\r\n#define GL_ALPHA16F_ARB 0x881C\r\n#define GL_INTENSITY16F_ARB 0x881D\r\n#define GL_LUMINANCE16F_ARB 0x881E\r\n#define GL_LUMINANCE_ALPHA16F_ARB 0x881F\r\n#define GL_TEXTURE_RED_TYPE_ARB 0x8C10\r\n#define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11\r\n#define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12\r\n#define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13\r\n#define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14\r\n#define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15\r\n#define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16\r\n#define GL_UNSIGNED_NORMALIZED_ARB 0x8C17\r\n\r\n#define GLEW_ARB_texture_float GLEW_GET_VAR(__GLEW_ARB_texture_float)\r\n\r\n#endif /* GL_ARB_texture_float */\r\n\r\n/* ------------------------- GL_ARB_texture_gather ------------------------- */\r\n\r\n#ifndef GL_ARB_texture_gather\r\n#define GL_ARB_texture_gather 1\r\n\r\n#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5E\r\n#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5F\r\n#define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB 0x8F9F\r\n\r\n#define GLEW_ARB_texture_gather GLEW_GET_VAR(__GLEW_ARB_texture_gather)\r\n\r\n#endif /* GL_ARB_texture_gather */\r\n\r\n/* --------------------- GL_ARB_texture_mirrored_repeat -------------------- */\r\n\r\n#ifndef GL_ARB_texture_mirrored_repeat\r\n#define GL_ARB_texture_mirrored_repeat 1\r\n\r\n#define GL_MIRRORED_REPEAT_ARB 0x8370\r\n\r\n#define GLEW_ARB_texture_mirrored_repeat GLEW_GET_VAR(__GLEW_ARB_texture_mirrored_repeat)\r\n\r\n#endif /* GL_ARB_texture_mirrored_repeat */\r\n\r\n/* ----------------------- GL_ARB_texture_multisample ---------------------- */\r\n\r\n#ifndef GL_ARB_texture_multisample\r\n#define GL_ARB_texture_multisample 1\r\n\r\n#define GL_SAMPLE_POSITION 0x8E50\r\n#define GL_SAMPLE_MASK 0x8E51\r\n#define GL_SAMPLE_MASK_VALUE 0x8E52\r\n#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59\r\n#define GL_TEXTURE_2D_MULTISAMPLE 0x9100\r\n#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101\r\n#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102\r\n#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103\r\n#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104\r\n#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105\r\n#define GL_TEXTURE_SAMPLES 0x9106\r\n#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107\r\n#define GL_SAMPLER_2D_MULTISAMPLE 0x9108\r\n#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109\r\n#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A\r\n#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B\r\n#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C\r\n#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D\r\n#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E\r\n#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F\r\n#define GL_MAX_INTEGER_SAMPLES 0x9110\r\n\r\ntypedef void (GLAPIENTRY * PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat* val);\r\ntypedef void (GLAPIENTRY * PFNGLSAMPLEMASKIPROC) (GLuint index, GLbitfield mask);\r\ntypedef void (GLAPIENTRY * PFNGLTEXIMAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);\r\ntypedef void (GLAPIENTRY * PFNGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);\r\n\r\n#define glGetMultisamplefv GLEW_GET_FUN(__glewGetMultisamplefv)\r\n#define glSampleMaski GLEW_GET_FUN(__glewSampleMaski)\r\n#define glTexImage2DMultisample GLEW_GET_FUN(__glewTexImage2DMultisample)\r\n#define glTexImage3DMultisample GLEW_GET_FUN(__glewTexImage3DMultisample)\r\n\r\n#define GLEW_ARB_texture_multisample GLEW_GET_VAR(__GLEW_ARB_texture_multisample)\r\n\r\n#endif /* GL_ARB_texture_multisample */\r\n\r\n/* -------------------- GL_ARB_texture_non_power_of_two -------------------- */\r\n\r\n#ifndef GL_ARB_texture_non_power_of_two\r\n#define GL_ARB_texture_non_power_of_two 1\r\n\r\n#define GLEW_ARB_texture_non_power_of_two GLEW_GET_VAR(__GLEW_ARB_texture_non_power_of_two)\r\n\r\n#endif /* GL_ARB_texture_non_power_of_two */\r\n\r\n/* ------------------------ GL_ARB_texture_query_lod ----------------------- */\r\n\r\n#ifndef GL_ARB_texture_query_lod\r\n#define GL_ARB_texture_query_lod 1\r\n\r\n#define GLEW_ARB_texture_query_lod GLEW_GET_VAR(__GLEW_ARB_texture_query_lod)\r\n\r\n#endif /* GL_ARB_texture_query_lod */\r\n\r\n/* ------------------------ GL_ARB_texture_rectangle ----------------------- */\r\n\r\n#ifndef GL_ARB_texture_rectangle\r\n#define GL_ARB_texture_rectangle 1\r\n\r\n#define GL_TEXTURE_RECTANGLE_ARB 0x84F5\r\n#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6\r\n#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7\r\n#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8\r\n#define GL_SAMPLER_2D_RECT_ARB 0x8B63\r\n#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64\r\n\r\n#define GLEW_ARB_texture_rectangle GLEW_GET_VAR(__GLEW_ARB_texture_rectangle)\r\n\r\n#endif /* GL_ARB_texture_rectangle */\r\n\r\n/* --------------------------- GL_ARB_texture_rg --------------------------- */\r\n\r\n#ifndef GL_ARB_texture_rg\r\n#define GL_ARB_texture_rg 1\r\n\r\n#define GL_RED 0x1903\r\n#define GL_COMPRESSED_RED 0x8225\r\n#define GL_COMPRESSED_RG 0x8226\r\n#define GL_RG 0x8227\r\n#define GL_RG_INTEGER 0x8228\r\n#define GL_R8 0x8229\r\n#define GL_R16 0x822A\r\n#define GL_RG8 0x822B\r\n#define GL_RG16 0x822C\r\n#define GL_R16F 0x822D\r\n#define GL_R32F 0x822E\r\n#define GL_RG16F 0x822F\r\n#define GL_RG32F 0x8230\r\n#define GL_R8I 0x8231\r\n#define GL_R8UI 0x8232\r\n#define GL_R16I 0x8233\r\n#define GL_R16UI 0x8234\r\n#define GL_R32I 0x8235\r\n#define GL_R32UI 0x8236\r\n#define GL_RG8I 0x8237\r\n#define GL_RG8UI 0x8238\r\n#define GL_RG16I 0x8239\r\n#define GL_RG16UI 0x823A\r\n#define GL_RG32I 0x823B\r\n#define GL_RG32UI 0x823C\r\n\r\n#define GLEW_ARB_texture_rg GLEW_GET_VAR(__GLEW_ARB_texture_rg)\r\n\r\n#endif /* GL_ARB_texture_rg */\r\n\r\n/* ------------------------ GL_ARB_transpose_matrix ------------------------ */\r\n\r\n#ifndef GL_ARB_transpose_matrix\r\n#define GL_ARB_transpose_matrix 1\r\n\r\n#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3\r\n#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4\r\n#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5\r\n#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6\r\n\r\ntypedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXDARBPROC) (GLdouble m[16]);\r\ntypedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXFARBPROC) (GLfloat m[16]);\r\ntypedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXDARBPROC) (GLdouble m[16]);\r\ntypedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXFARBPROC) (GLfloat m[16]);\r\n\r\n#define glLoadTransposeMatrixdARB GLEW_GET_FUN(__glewLoadTransposeMatrixdARB)\r\n#define glLoadTransposeMatrixfARB GLEW_GET_FUN(__glewLoadTransposeMatrixfARB)\r\n#define glMultTransposeMatrixdARB GLEW_GET_FUN(__glewMultTransposeMatrixdARB)\r\n#define glMultTransposeMatrixfARB GLEW_GET_FUN(__glewMultTransposeMatrixfARB)\r\n\r\n#define GLEW_ARB_transpose_matrix GLEW_GET_VAR(__GLEW_ARB_transpose_matrix)\r\n\r\n#endif /* GL_ARB_transpose_matrix */\r\n\r\n/* ---------------------- GL_ARB_uniform_buffer_object --------------------- */\r\n\r\n#ifndef GL_ARB_uniform_buffer_object\r\n#define GL_ARB_uniform_buffer_object 1\r\n\r\n#define GL_UNIFORM_BUFFER 0x8A11\r\n#define GL_UNIFORM_BUFFER_BINDING 0x8A28\r\n#define GL_UNIFORM_BUFFER_START 0x8A29\r\n#define GL_UNIFORM_BUFFER_SIZE 0x8A2A\r\n#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B\r\n#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C\r\n#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D\r\n#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E\r\n#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F\r\n#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30\r\n#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31\r\n#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32\r\n#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33\r\n#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34\r\n#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35\r\n#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36\r\n#define GL_UNIFORM_TYPE 0x8A37\r\n#define GL_UNIFORM_SIZE 0x8A38\r\n#define GL_UNIFORM_NAME_LENGTH 0x8A39\r\n#define GL_UNIFORM_BLOCK_INDEX 0x8A3A\r\n#define GL_UNIFORM_OFFSET 0x8A3B\r\n#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C\r\n#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D\r\n#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E\r\n#define GL_UNIFORM_BLOCK_BINDING 0x8A3F\r\n#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40\r\n#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41\r\n#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42\r\n#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43\r\n#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44\r\n#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45\r\n#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46\r\n#define GL_INVALID_INDEX 0xFFFFFFFF\r\n\r\ntypedef void (GLAPIENTRY * PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer);\r\ntypedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);\r\ntypedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, char* uniformBlockName);\r\ntypedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMNAMEPROC) (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei* length, char* uniformName);\r\ntypedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint* data);\r\ntypedef GLuint (GLAPIENTRY * PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const char* uniformBlockName);\r\ntypedef void (GLAPIENTRY * PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const char** uniformNames, GLuint* uniformIndices);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);\r\n\r\n#define glBindBufferBase GLEW_GET_FUN(__glewBindBufferBase)\r\n#define glBindBufferRange GLEW_GET_FUN(__glewBindBufferRange)\r\n#define glGetActiveUniformBlockName GLEW_GET_FUN(__glewGetActiveUniformBlockName)\r\n#define glGetActiveUniformBlockiv GLEW_GET_FUN(__glewGetActiveUniformBlockiv)\r\n#define glGetActiveUniformName GLEW_GET_FUN(__glewGetActiveUniformName)\r\n#define glGetActiveUniformsiv GLEW_GET_FUN(__glewGetActiveUniformsiv)\r\n#define glGetIntegeri_v GLEW_GET_FUN(__glewGetIntegeri_v)\r\n#define glGetUniformBlockIndex GLEW_GET_FUN(__glewGetUniformBlockIndex)\r\n#define glGetUniformIndices GLEW_GET_FUN(__glewGetUniformIndices)\r\n#define glUniformBlockBinding GLEW_GET_FUN(__glewUniformBlockBinding)\r\n\r\n#define GLEW_ARB_uniform_buffer_object GLEW_GET_VAR(__GLEW_ARB_uniform_buffer_object)\r\n\r\n#endif /* GL_ARB_uniform_buffer_object */\r\n\r\n/* ------------------------ GL_ARB_vertex_array_bgra ----------------------- */\r\n\r\n#ifndef GL_ARB_vertex_array_bgra\r\n#define GL_ARB_vertex_array_bgra 1\r\n\r\n#define GL_BGRA 0x80E1\r\n\r\n#define GLEW_ARB_vertex_array_bgra GLEW_GET_VAR(__GLEW_ARB_vertex_array_bgra)\r\n\r\n#endif /* GL_ARB_vertex_array_bgra */\r\n\r\n/* ----------------------- GL_ARB_vertex_array_object ---------------------- */\r\n\r\n#ifndef GL_ARB_vertex_array_object\r\n#define GL_ARB_vertex_array_object 1\r\n\r\n#define GL_VERTEX_ARRAY_BINDING 0x85B5\r\n\r\ntypedef void (GLAPIENTRY * PFNGLBINDVERTEXARRAYPROC) (GLuint array);\r\ntypedef void (GLAPIENTRY * PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint* arrays);\r\ntypedef void (GLAPIENTRY * PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint* arrays);\r\ntypedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYPROC) (GLuint array);\r\n\r\n#define glBindVertexArray GLEW_GET_FUN(__glewBindVertexArray)\r\n#define glDeleteVertexArrays GLEW_GET_FUN(__glewDeleteVertexArrays)\r\n#define glGenVertexArrays GLEW_GET_FUN(__glewGenVertexArrays)\r\n#define glIsVertexArray GLEW_GET_FUN(__glewIsVertexArray)\r\n\r\n#define GLEW_ARB_vertex_array_object GLEW_GET_VAR(__GLEW_ARB_vertex_array_object)\r\n\r\n#endif /* GL_ARB_vertex_array_object */\r\n\r\n/* -------------------------- GL_ARB_vertex_blend -------------------------- */\r\n\r\n#ifndef GL_ARB_vertex_blend\r\n#define GL_ARB_vertex_blend 1\r\n\r\n#define GL_MODELVIEW0_ARB 0x1700\r\n#define GL_MODELVIEW1_ARB 0x850A\r\n#define GL_MAX_VERTEX_UNITS_ARB 0x86A4\r\n#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5\r\n#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6\r\n#define GL_VERTEX_BLEND_ARB 0x86A7\r\n#define GL_CURRENT_WEIGHT_ARB 0x86A8\r\n#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9\r\n#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA\r\n#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB\r\n#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC\r\n#define GL_WEIGHT_ARRAY_ARB 0x86AD\r\n#define GL_MODELVIEW2_ARB 0x8722\r\n#define GL_MODELVIEW3_ARB 0x8723\r\n#define GL_MODELVIEW4_ARB 0x8724\r\n#define GL_MODELVIEW5_ARB 0x8725\r\n#define GL_MODELVIEW6_ARB 0x8726\r\n#define GL_MODELVIEW7_ARB 0x8727\r\n#define GL_MODELVIEW8_ARB 0x8728\r\n#define GL_MODELVIEW9_ARB 0x8729\r\n#define GL_MODELVIEW10_ARB 0x872A\r\n#define GL_MODELVIEW11_ARB 0x872B\r\n#define GL_MODELVIEW12_ARB 0x872C\r\n#define GL_MODELVIEW13_ARB 0x872D\r\n#define GL_MODELVIEW14_ARB 0x872E\r\n#define GL_MODELVIEW15_ARB 0x872F\r\n#define GL_MODELVIEW16_ARB 0x8730\r\n#define GL_MODELVIEW17_ARB 0x8731\r\n#define GL_MODELVIEW18_ARB 0x8732\r\n#define GL_MODELVIEW19_ARB 0x8733\r\n#define GL_MODELVIEW20_ARB 0x8734\r\n#define GL_MODELVIEW21_ARB 0x8735\r\n#define GL_MODELVIEW22_ARB 0x8736\r\n#define GL_MODELVIEW23_ARB 0x8737\r\n#define GL_MODELVIEW24_ARB 0x8738\r\n#define GL_MODELVIEW25_ARB 0x8739\r\n#define GL_MODELVIEW26_ARB 0x873A\r\n#define GL_MODELVIEW27_ARB 0x873B\r\n#define GL_MODELVIEW28_ARB 0x873C\r\n#define GL_MODELVIEW29_ARB 0x873D\r\n#define GL_MODELVIEW30_ARB 0x873E\r\n#define GL_MODELVIEW31_ARB 0x873F\r\n\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXBLENDARBPROC) (GLint count);\r\ntypedef void (GLAPIENTRY * PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer);\r\ntypedef void (GLAPIENTRY * PFNGLWEIGHTBVARBPROC) (GLint size, GLbyte *weights);\r\ntypedef void (GLAPIENTRY * PFNGLWEIGHTDVARBPROC) (GLint size, GLdouble *weights);\r\ntypedef void (GLAPIENTRY * PFNGLWEIGHTFVARBPROC) (GLint size, GLfloat *weights);\r\ntypedef void (GLAPIENTRY * PFNGLWEIGHTIVARBPROC) (GLint size, GLint *weights);\r\ntypedef void (GLAPIENTRY * PFNGLWEIGHTSVARBPROC) (GLint size, GLshort *weights);\r\ntypedef void (GLAPIENTRY * PFNGLWEIGHTUBVARBPROC) (GLint size, GLubyte *weights);\r\ntypedef void (GLAPIENTRY * PFNGLWEIGHTUIVARBPROC) (GLint size, GLuint *weights);\r\ntypedef void (GLAPIENTRY * PFNGLWEIGHTUSVARBPROC) (GLint size, GLushort *weights);\r\n\r\n#define glVertexBlendARB GLEW_GET_FUN(__glewVertexBlendARB)\r\n#define glWeightPointerARB GLEW_GET_FUN(__glewWeightPointerARB)\r\n#define glWeightbvARB GLEW_GET_FUN(__glewWeightbvARB)\r\n#define glWeightdvARB GLEW_GET_FUN(__glewWeightdvARB)\r\n#define glWeightfvARB GLEW_GET_FUN(__glewWeightfvARB)\r\n#define glWeightivARB GLEW_GET_FUN(__glewWeightivARB)\r\n#define glWeightsvARB GLEW_GET_FUN(__glewWeightsvARB)\r\n#define glWeightubvARB GLEW_GET_FUN(__glewWeightubvARB)\r\n#define glWeightuivARB GLEW_GET_FUN(__glewWeightuivARB)\r\n#define glWeightusvARB GLEW_GET_FUN(__glewWeightusvARB)\r\n\r\n#define GLEW_ARB_vertex_blend GLEW_GET_VAR(__GLEW_ARB_vertex_blend)\r\n\r\n#endif /* GL_ARB_vertex_blend */\r\n\r\n/* ---------------------- GL_ARB_vertex_buffer_object ---------------------- */\r\n\r\n#ifndef GL_ARB_vertex_buffer_object\r\n#define GL_ARB_vertex_buffer_object 1\r\n\r\n#define GL_BUFFER_SIZE_ARB 0x8764\r\n#define GL_BUFFER_USAGE_ARB 0x8765\r\n#define GL_ARRAY_BUFFER_ARB 0x8892\r\n#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893\r\n#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894\r\n#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895\r\n#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896\r\n#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897\r\n#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898\r\n#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899\r\n#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A\r\n#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B\r\n#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C\r\n#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D\r\n#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E\r\n#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F\r\n#define GL_READ_ONLY_ARB 0x88B8\r\n#define GL_WRITE_ONLY_ARB 0x88B9\r\n#define GL_READ_WRITE_ARB 0x88BA\r\n#define GL_BUFFER_ACCESS_ARB 0x88BB\r\n#define GL_BUFFER_MAPPED_ARB 0x88BC\r\n#define GL_BUFFER_MAP_POINTER_ARB 0x88BD\r\n#define GL_STREAM_DRAW_ARB 0x88E0\r\n#define GL_STREAM_READ_ARB 0x88E1\r\n#define GL_STREAM_COPY_ARB 0x88E2\r\n#define GL_STATIC_DRAW_ARB 0x88E4\r\n#define GL_STATIC_READ_ARB 0x88E5\r\n#define GL_STATIC_COPY_ARB 0x88E6\r\n#define GL_DYNAMIC_DRAW_ARB 0x88E8\r\n#define GL_DYNAMIC_READ_ARB 0x88E9\r\n#define GL_DYNAMIC_COPY_ARB 0x88EA\r\n\r\ntypedef ptrdiff_t GLsizeiptrARB;\r\ntypedef ptrdiff_t GLintptrARB;\r\n\r\ntypedef void (GLAPIENTRY * PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer);\r\ntypedef void (GLAPIENTRY * PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const GLvoid* data, GLenum usage);\r\ntypedef void (GLAPIENTRY * PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid* data);\r\ntypedef void (GLAPIENTRY * PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint* buffers);\r\ntypedef void (GLAPIENTRY * PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint* buffers);\r\ntypedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, GLvoid** params);\r\ntypedef void (GLAPIENTRY * PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid* data);\r\ntypedef GLboolean (GLAPIENTRY * PFNGLISBUFFERARBPROC) (GLuint buffer);\r\ntypedef GLvoid * (GLAPIENTRY * PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access);\r\ntypedef GLboolean (GLAPIENTRY * PFNGLUNMAPBUFFERARBPROC) (GLenum target);\r\n\r\n#define glBindBufferARB GLEW_GET_FUN(__glewBindBufferARB)\r\n#define glBufferDataARB GLEW_GET_FUN(__glewBufferDataARB)\r\n#define glBufferSubDataARB GLEW_GET_FUN(__glewBufferSubDataARB)\r\n#define glDeleteBuffersARB GLEW_GET_FUN(__glewDeleteBuffersARB)\r\n#define glGenBuffersARB GLEW_GET_FUN(__glewGenBuffersARB)\r\n#define glGetBufferParameterivARB GLEW_GET_FUN(__glewGetBufferParameterivARB)\r\n#define glGetBufferPointervARB GLEW_GET_FUN(__glewGetBufferPointervARB)\r\n#define glGetBufferSubDataARB GLEW_GET_FUN(__glewGetBufferSubDataARB)\r\n#define glIsBufferARB GLEW_GET_FUN(__glewIsBufferARB)\r\n#define glMapBufferARB GLEW_GET_FUN(__glewMapBufferARB)\r\n#define glUnmapBufferARB GLEW_GET_FUN(__glewUnmapBufferARB)\r\n\r\n#define GLEW_ARB_vertex_buffer_object GLEW_GET_VAR(__GLEW_ARB_vertex_buffer_object)\r\n\r\n#endif /* GL_ARB_vertex_buffer_object */\r\n\r\n/* ------------------------- GL_ARB_vertex_program ------------------------- */\r\n\r\n#ifndef GL_ARB_vertex_program\r\n#define GL_ARB_vertex_program 1\r\n\r\n#define GL_COLOR_SUM_ARB 0x8458\r\n#define GL_VERTEX_PROGRAM_ARB 0x8620\r\n#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622\r\n#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623\r\n#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624\r\n#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625\r\n#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626\r\n#define GL_PROGRAM_LENGTH_ARB 0x8627\r\n#define GL_PROGRAM_STRING_ARB 0x8628\r\n#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E\r\n#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F\r\n#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640\r\n#define GL_CURRENT_MATRIX_ARB 0x8641\r\n#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642\r\n#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643\r\n#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645\r\n#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B\r\n#define GL_PROGRAM_BINDING_ARB 0x8677\r\n#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869\r\n#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A\r\n#define GL_PROGRAM_ERROR_STRING_ARB 0x8874\r\n#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875\r\n#define GL_PROGRAM_FORMAT_ARB 0x8876\r\n#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0\r\n#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1\r\n#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2\r\n#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3\r\n#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4\r\n#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5\r\n#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6\r\n#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7\r\n#define GL_PROGRAM_PARAMETERS_ARB 0x88A8\r\n#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9\r\n#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA\r\n#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB\r\n#define GL_PROGRAM_ATTRIBS_ARB 0x88AC\r\n#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD\r\n#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE\r\n#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF\r\n#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0\r\n#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1\r\n#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2\r\n#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3\r\n#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4\r\n#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5\r\n#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6\r\n#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7\r\n#define GL_MATRIX0_ARB 0x88C0\r\n#define GL_MATRIX1_ARB 0x88C1\r\n#define GL_MATRIX2_ARB 0x88C2\r\n#define GL_MATRIX3_ARB 0x88C3\r\n#define GL_MATRIX4_ARB 0x88C4\r\n#define GL_MATRIX5_ARB 0x88C5\r\n#define GL_MATRIX6_ARB 0x88C6\r\n#define GL_MATRIX7_ARB 0x88C7\r\n#define GL_MATRIX8_ARB 0x88C8\r\n#define GL_MATRIX9_ARB 0x88C9\r\n#define GL_MATRIX10_ARB 0x88CA\r\n#define GL_MATRIX11_ARB 0x88CB\r\n#define GL_MATRIX12_ARB 0x88CC\r\n#define GL_MATRIX13_ARB 0x88CD\r\n#define GL_MATRIX14_ARB 0x88CE\r\n#define GL_MATRIX15_ARB 0x88CF\r\n#define GL_MATRIX16_ARB 0x88D0\r\n#define GL_MATRIX17_ARB 0x88D1\r\n#define GL_MATRIX18_ARB 0x88D2\r\n#define GL_MATRIX19_ARB 0x88D3\r\n#define GL_MATRIX20_ARB 0x88D4\r\n#define GL_MATRIX21_ARB 0x88D5\r\n#define GL_MATRIX22_ARB 0x88D6\r\n#define GL_MATRIX23_ARB 0x88D7\r\n#define GL_MATRIX24_ARB 0x88D8\r\n#define GL_MATRIX25_ARB 0x88D9\r\n#define GL_MATRIX26_ARB 0x88DA\r\n#define GL_MATRIX27_ARB 0x88DB\r\n#define GL_MATRIX28_ARB 0x88DC\r\n#define GL_MATRIX29_ARB 0x88DD\r\n#define GL_MATRIX30_ARB 0x88DE\r\n#define GL_MATRIX31_ARB 0x88DF\r\n\r\ntypedef void (GLAPIENTRY * PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program);\r\ntypedef void (GLAPIENTRY * PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint* programs);\r\ntypedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index);\r\ntypedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index);\r\ntypedef void (GLAPIENTRY * PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint* programs);\r\ntypedef void (GLAPIENTRY * PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, void* string);\r\ntypedef void (GLAPIENTRY * PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, GLvoid** pointer);\r\ntypedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint* params);\r\ntypedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMARBPROC) (GLuint program);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble* params);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble* params);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const void* string);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* pointer);\r\n\r\n#define glBindProgramARB GLEW_GET_FUN(__glewBindProgramARB)\r\n#define glDeleteProgramsARB GLEW_GET_FUN(__glewDeleteProgramsARB)\r\n#define glDisableVertexAttribArrayARB GLEW_GET_FUN(__glewDisableVertexAttribArrayARB)\r\n#define glEnableVertexAttribArrayARB GLEW_GET_FUN(__glewEnableVertexAttribArrayARB)\r\n#define glGenProgramsARB GLEW_GET_FUN(__glewGenProgramsARB)\r\n#define glGetProgramEnvParameterdvARB GLEW_GET_FUN(__glewGetProgramEnvParameterdvARB)\r\n#define glGetProgramEnvParameterfvARB GLEW_GET_FUN(__glewGetProgramEnvParameterfvARB)\r\n#define glGetProgramLocalParameterdvARB GLEW_GET_FUN(__glewGetProgramLocalParameterdvARB)\r\n#define glGetProgramLocalParameterfvARB GLEW_GET_FUN(__glewGetProgramLocalParameterfvARB)\r\n#define glGetProgramStringARB GLEW_GET_FUN(__glewGetProgramStringARB)\r\n#define glGetProgramivARB GLEW_GET_FUN(__glewGetProgramivARB)\r\n#define glGetVertexAttribPointervARB GLEW_GET_FUN(__glewGetVertexAttribPointervARB)\r\n#define glGetVertexAttribdvARB GLEW_GET_FUN(__glewGetVertexAttribdvARB)\r\n#define glGetVertexAttribfvARB GLEW_GET_FUN(__glewGetVertexAttribfvARB)\r\n#define glGetVertexAttribivARB GLEW_GET_FUN(__glewGetVertexAttribivARB)\r\n#define glIsProgramARB GLEW_GET_FUN(__glewIsProgramARB)\r\n#define glProgramEnvParameter4dARB GLEW_GET_FUN(__glewProgramEnvParameter4dARB)\r\n#define glProgramEnvParameter4dvARB GLEW_GET_FUN(__glewProgramEnvParameter4dvARB)\r\n#define glProgramEnvParameter4fARB GLEW_GET_FUN(__glewProgramEnvParameter4fARB)\r\n#define glProgramEnvParameter4fvARB GLEW_GET_FUN(__glewProgramEnvParameter4fvARB)\r\n#define glProgramLocalParameter4dARB GLEW_GET_FUN(__glewProgramLocalParameter4dARB)\r\n#define glProgramLocalParameter4dvARB GLEW_GET_FUN(__glewProgramLocalParameter4dvARB)\r\n#define glProgramLocalParameter4fARB GLEW_GET_FUN(__glewProgramLocalParameter4fARB)\r\n#define glProgramLocalParameter4fvARB GLEW_GET_FUN(__glewProgramLocalParameter4fvARB)\r\n#define glProgramStringARB GLEW_GET_FUN(__glewProgramStringARB)\r\n#define glVertexAttrib1dARB GLEW_GET_FUN(__glewVertexAttrib1dARB)\r\n#define glVertexAttrib1dvARB GLEW_GET_FUN(__glewVertexAttrib1dvARB)\r\n#define glVertexAttrib1fARB GLEW_GET_FUN(__glewVertexAttrib1fARB)\r\n#define glVertexAttrib1fvARB GLEW_GET_FUN(__glewVertexAttrib1fvARB)\r\n#define glVertexAttrib1sARB GLEW_GET_FUN(__glewVertexAttrib1sARB)\r\n#define glVertexAttrib1svARB GLEW_GET_FUN(__glewVertexAttrib1svARB)\r\n#define glVertexAttrib2dARB GLEW_GET_FUN(__glewVertexAttrib2dARB)\r\n#define glVertexAttrib2dvARB GLEW_GET_FUN(__glewVertexAttrib2dvARB)\r\n#define glVertexAttrib2fARB GLEW_GET_FUN(__glewVertexAttrib2fARB)\r\n#define glVertexAttrib2fvARB GLEW_GET_FUN(__glewVertexAttrib2fvARB)\r\n#define glVertexAttrib2sARB GLEW_GET_FUN(__glewVertexAttrib2sARB)\r\n#define glVertexAttrib2svARB GLEW_GET_FUN(__glewVertexAttrib2svARB)\r\n#define glVertexAttrib3dARB GLEW_GET_FUN(__glewVertexAttrib3dARB)\r\n#define glVertexAttrib3dvARB GLEW_GET_FUN(__glewVertexAttrib3dvARB)\r\n#define glVertexAttrib3fARB GLEW_GET_FUN(__glewVertexAttrib3fARB)\r\n#define glVertexAttrib3fvARB GLEW_GET_FUN(__glewVertexAttrib3fvARB)\r\n#define glVertexAttrib3sARB GLEW_GET_FUN(__glewVertexAttrib3sARB)\r\n#define glVertexAttrib3svARB GLEW_GET_FUN(__glewVertexAttrib3svARB)\r\n#define glVertexAttrib4NbvARB GLEW_GET_FUN(__glewVertexAttrib4NbvARB)\r\n#define glVertexAttrib4NivARB GLEW_GET_FUN(__glewVertexAttrib4NivARB)\r\n#define glVertexAttrib4NsvARB GLEW_GET_FUN(__glewVertexAttrib4NsvARB)\r\n#define glVertexAttrib4NubARB GLEW_GET_FUN(__glewVertexAttrib4NubARB)\r\n#define glVertexAttrib4NubvARB GLEW_GET_FUN(__glewVertexAttrib4NubvARB)\r\n#define glVertexAttrib4NuivARB GLEW_GET_FUN(__glewVertexAttrib4NuivARB)\r\n#define glVertexAttrib4NusvARB GLEW_GET_FUN(__glewVertexAttrib4NusvARB)\r\n#define glVertexAttrib4bvARB GLEW_GET_FUN(__glewVertexAttrib4bvARB)\r\n#define glVertexAttrib4dARB GLEW_GET_FUN(__glewVertexAttrib4dARB)\r\n#define glVertexAttrib4dvARB GLEW_GET_FUN(__glewVertexAttrib4dvARB)\r\n#define glVertexAttrib4fARB GLEW_GET_FUN(__glewVertexAttrib4fARB)\r\n#define glVertexAttrib4fvARB GLEW_GET_FUN(__glewVertexAttrib4fvARB)\r\n#define glVertexAttrib4ivARB GLEW_GET_FUN(__glewVertexAttrib4ivARB)\r\n#define glVertexAttrib4sARB GLEW_GET_FUN(__glewVertexAttrib4sARB)\r\n#define glVertexAttrib4svARB GLEW_GET_FUN(__glewVertexAttrib4svARB)\r\n#define glVertexAttrib4ubvARB GLEW_GET_FUN(__glewVertexAttrib4ubvARB)\r\n#define glVertexAttrib4uivARB GLEW_GET_FUN(__glewVertexAttrib4uivARB)\r\n#define glVertexAttrib4usvARB GLEW_GET_FUN(__glewVertexAttrib4usvARB)\r\n#define glVertexAttribPointerARB GLEW_GET_FUN(__glewVertexAttribPointerARB)\r\n\r\n#define GLEW_ARB_vertex_program GLEW_GET_VAR(__GLEW_ARB_vertex_program)\r\n\r\n#endif /* GL_ARB_vertex_program */\r\n\r\n/* -------------------------- GL_ARB_vertex_shader ------------------------- */\r\n\r\n#ifndef GL_ARB_vertex_shader\r\n#define GL_ARB_vertex_shader 1\r\n\r\n#define GL_VERTEX_SHADER_ARB 0x8B31\r\n#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A\r\n#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B\r\n#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C\r\n#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D\r\n#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89\r\n#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A\r\n\r\ntypedef void (GLAPIENTRY * PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB* name);\r\ntypedef void (GLAPIENTRY * PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint *size, GLenum *type, GLcharARB *name);\r\ntypedef GLint (GLAPIENTRY * PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB* name);\r\n\r\n#define glBindAttribLocationARB GLEW_GET_FUN(__glewBindAttribLocationARB)\r\n#define glGetActiveAttribARB GLEW_GET_FUN(__glewGetActiveAttribARB)\r\n#define glGetAttribLocationARB GLEW_GET_FUN(__glewGetAttribLocationARB)\r\n\r\n#define GLEW_ARB_vertex_shader GLEW_GET_VAR(__GLEW_ARB_vertex_shader)\r\n\r\n#endif /* GL_ARB_vertex_shader */\r\n\r\n/* --------------------------- GL_ARB_window_pos --------------------------- */\r\n\r\n#ifndef GL_ARB_window_pos\r\n#define GL_ARB_window_pos 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVARBPROC) (const GLdouble* p);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVARBPROC) (const GLfloat* p);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVARBPROC) (const GLint* p);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVARBPROC) (const GLshort* p);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVARBPROC) (const GLdouble* p);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVARBPROC) (const GLfloat* p);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVARBPROC) (const GLint* p);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVARBPROC) (const GLshort* p);\r\n\r\n#define glWindowPos2dARB GLEW_GET_FUN(__glewWindowPos2dARB)\r\n#define glWindowPos2dvARB GLEW_GET_FUN(__glewWindowPos2dvARB)\r\n#define glWindowPos2fARB GLEW_GET_FUN(__glewWindowPos2fARB)\r\n#define glWindowPos2fvARB GLEW_GET_FUN(__glewWindowPos2fvARB)\r\n#define glWindowPos2iARB GLEW_GET_FUN(__glewWindowPos2iARB)\r\n#define glWindowPos2ivARB GLEW_GET_FUN(__glewWindowPos2ivARB)\r\n#define glWindowPos2sARB GLEW_GET_FUN(__glewWindowPos2sARB)\r\n#define glWindowPos2svARB GLEW_GET_FUN(__glewWindowPos2svARB)\r\n#define glWindowPos3dARB GLEW_GET_FUN(__glewWindowPos3dARB)\r\n#define glWindowPos3dvARB GLEW_GET_FUN(__glewWindowPos3dvARB)\r\n#define glWindowPos3fARB GLEW_GET_FUN(__glewWindowPos3fARB)\r\n#define glWindowPos3fvARB GLEW_GET_FUN(__glewWindowPos3fvARB)\r\n#define glWindowPos3iARB GLEW_GET_FUN(__glewWindowPos3iARB)\r\n#define glWindowPos3ivARB GLEW_GET_FUN(__glewWindowPos3ivARB)\r\n#define glWindowPos3sARB GLEW_GET_FUN(__glewWindowPos3sARB)\r\n#define glWindowPos3svARB GLEW_GET_FUN(__glewWindowPos3svARB)\r\n\r\n#define GLEW_ARB_window_pos GLEW_GET_VAR(__GLEW_ARB_window_pos)\r\n\r\n#endif /* GL_ARB_window_pos */\r\n\r\n/* ------------------------- GL_ATIX_point_sprites ------------------------- */\r\n\r\n#ifndef GL_ATIX_point_sprites\r\n#define GL_ATIX_point_sprites 1\r\n\r\n#define GL_TEXTURE_POINT_MODE_ATIX 0x60B0\r\n#define GL_TEXTURE_POINT_ONE_COORD_ATIX 0x60B1\r\n#define GL_TEXTURE_POINT_SPRITE_ATIX 0x60B2\r\n#define GL_POINT_SPRITE_CULL_MODE_ATIX 0x60B3\r\n#define GL_POINT_SPRITE_CULL_CENTER_ATIX 0x60B4\r\n#define GL_POINT_SPRITE_CULL_CLIP_ATIX 0x60B5\r\n\r\n#define GLEW_ATIX_point_sprites GLEW_GET_VAR(__GLEW_ATIX_point_sprites)\r\n\r\n#endif /* GL_ATIX_point_sprites */\r\n\r\n/* ---------------------- GL_ATIX_texture_env_combine3 --------------------- */\r\n\r\n#ifndef GL_ATIX_texture_env_combine3\r\n#define GL_ATIX_texture_env_combine3 1\r\n\r\n#define GL_MODULATE_ADD_ATIX 0x8744\r\n#define GL_MODULATE_SIGNED_ADD_ATIX 0x8745\r\n#define GL_MODULATE_SUBTRACT_ATIX 0x8746\r\n\r\n#define GLEW_ATIX_texture_env_combine3 GLEW_GET_VAR(__GLEW_ATIX_texture_env_combine3)\r\n\r\n#endif /* GL_ATIX_texture_env_combine3 */\r\n\r\n/* ----------------------- GL_ATIX_texture_env_route ----------------------- */\r\n\r\n#ifndef GL_ATIX_texture_env_route\r\n#define GL_ATIX_texture_env_route 1\r\n\r\n#define GL_SECONDARY_COLOR_ATIX 0x8747\r\n#define GL_TEXTURE_OUTPUT_RGB_ATIX 0x8748\r\n#define GL_TEXTURE_OUTPUT_ALPHA_ATIX 0x8749\r\n\r\n#define GLEW_ATIX_texture_env_route GLEW_GET_VAR(__GLEW_ATIX_texture_env_route)\r\n\r\n#endif /* GL_ATIX_texture_env_route */\r\n\r\n/* ---------------- GL_ATIX_vertex_shader_output_point_size ---------------- */\r\n\r\n#ifndef GL_ATIX_vertex_shader_output_point_size\r\n#define GL_ATIX_vertex_shader_output_point_size 1\r\n\r\n#define GL_OUTPUT_POINT_SIZE_ATIX 0x610E\r\n\r\n#define GLEW_ATIX_vertex_shader_output_point_size GLEW_GET_VAR(__GLEW_ATIX_vertex_shader_output_point_size)\r\n\r\n#endif /* GL_ATIX_vertex_shader_output_point_size */\r\n\r\n/* -------------------------- GL_ATI_draw_buffers -------------------------- */\r\n\r\n#ifndef GL_ATI_draw_buffers\r\n#define GL_ATI_draw_buffers 1\r\n\r\n#define GL_MAX_DRAW_BUFFERS_ATI 0x8824\r\n#define GL_DRAW_BUFFER0_ATI 0x8825\r\n#define GL_DRAW_BUFFER1_ATI 0x8826\r\n#define GL_DRAW_BUFFER2_ATI 0x8827\r\n#define GL_DRAW_BUFFER3_ATI 0x8828\r\n#define GL_DRAW_BUFFER4_ATI 0x8829\r\n#define GL_DRAW_BUFFER5_ATI 0x882A\r\n#define GL_DRAW_BUFFER6_ATI 0x882B\r\n#define GL_DRAW_BUFFER7_ATI 0x882C\r\n#define GL_DRAW_BUFFER8_ATI 0x882D\r\n#define GL_DRAW_BUFFER9_ATI 0x882E\r\n#define GL_DRAW_BUFFER10_ATI 0x882F\r\n#define GL_DRAW_BUFFER11_ATI 0x8830\r\n#define GL_DRAW_BUFFER12_ATI 0x8831\r\n#define GL_DRAW_BUFFER13_ATI 0x8832\r\n#define GL_DRAW_BUFFER14_ATI 0x8833\r\n#define GL_DRAW_BUFFER15_ATI 0x8834\r\n\r\ntypedef void (GLAPIENTRY * PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum* bufs);\r\n\r\n#define glDrawBuffersATI GLEW_GET_FUN(__glewDrawBuffersATI)\r\n\r\n#define GLEW_ATI_draw_buffers GLEW_GET_VAR(__GLEW_ATI_draw_buffers)\r\n\r\n#endif /* GL_ATI_draw_buffers */\r\n\r\n/* -------------------------- GL_ATI_element_array ------------------------- */\r\n\r\n#ifndef GL_ATI_element_array\r\n#define GL_ATI_element_array 1\r\n\r\n#define GL_ELEMENT_ARRAY_ATI 0x8768\r\n#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769\r\n#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A\r\n\r\ntypedef void (GLAPIENTRY * PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count);\r\ntypedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count);\r\ntypedef void (GLAPIENTRY * PFNGLELEMENTPOINTERATIPROC) (GLenum type, const void* pointer);\r\n\r\n#define glDrawElementArrayATI GLEW_GET_FUN(__glewDrawElementArrayATI)\r\n#define glDrawRangeElementArrayATI GLEW_GET_FUN(__glewDrawRangeElementArrayATI)\r\n#define glElementPointerATI GLEW_GET_FUN(__glewElementPointerATI)\r\n\r\n#define GLEW_ATI_element_array GLEW_GET_VAR(__GLEW_ATI_element_array)\r\n\r\n#endif /* GL_ATI_element_array */\r\n\r\n/* ------------------------- GL_ATI_envmap_bumpmap ------------------------- */\r\n\r\n#ifndef GL_ATI_envmap_bumpmap\r\n#define GL_ATI_envmap_bumpmap 1\r\n\r\n#define GL_BUMP_ROT_MATRIX_ATI 0x8775\r\n#define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776\r\n#define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777\r\n#define GL_BUMP_TEX_UNITS_ATI 0x8778\r\n#define GL_DUDV_ATI 0x8779\r\n#define GL_DU8DV8_ATI 0x877A\r\n#define GL_BUMP_ENVMAP_ATI 0x877B\r\n#define GL_BUMP_TARGET_ATI 0x877C\r\n\r\ntypedef void (GLAPIENTRY * PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param);\r\ntypedef void (GLAPIENTRY * PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param);\r\ntypedef void (GLAPIENTRY * PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param);\r\ntypedef void (GLAPIENTRY * PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param);\r\n\r\n#define glGetTexBumpParameterfvATI GLEW_GET_FUN(__glewGetTexBumpParameterfvATI)\r\n#define glGetTexBumpParameterivATI GLEW_GET_FUN(__glewGetTexBumpParameterivATI)\r\n#define glTexBumpParameterfvATI GLEW_GET_FUN(__glewTexBumpParameterfvATI)\r\n#define glTexBumpParameterivATI GLEW_GET_FUN(__glewTexBumpParameterivATI)\r\n\r\n#define GLEW_ATI_envmap_bumpmap GLEW_GET_VAR(__GLEW_ATI_envmap_bumpmap)\r\n\r\n#endif /* GL_ATI_envmap_bumpmap */\r\n\r\n/* ------------------------- GL_ATI_fragment_shader ------------------------ */\r\n\r\n#ifndef GL_ATI_fragment_shader\r\n#define GL_ATI_fragment_shader 1\r\n\r\n#define GL_RED_BIT_ATI 0x00000001\r\n#define GL_2X_BIT_ATI 0x00000001\r\n#define GL_4X_BIT_ATI 0x00000002\r\n#define GL_GREEN_BIT_ATI 0x00000002\r\n#define GL_COMP_BIT_ATI 0x00000002\r\n#define GL_BLUE_BIT_ATI 0x00000004\r\n#define GL_8X_BIT_ATI 0x00000004\r\n#define GL_NEGATE_BIT_ATI 0x00000004\r\n#define GL_BIAS_BIT_ATI 0x00000008\r\n#define GL_HALF_BIT_ATI 0x00000008\r\n#define GL_QUARTER_BIT_ATI 0x00000010\r\n#define GL_EIGHTH_BIT_ATI 0x00000020\r\n#define GL_SATURATE_BIT_ATI 0x00000040\r\n#define GL_FRAGMENT_SHADER_ATI 0x8920\r\n#define GL_REG_0_ATI 0x8921\r\n#define GL_REG_1_ATI 0x8922\r\n#define GL_REG_2_ATI 0x8923\r\n#define GL_REG_3_ATI 0x8924\r\n#define GL_REG_4_ATI 0x8925\r\n#define GL_REG_5_ATI 0x8926\r\n#define GL_CON_0_ATI 0x8941\r\n#define GL_CON_1_ATI 0x8942\r\n#define GL_CON_2_ATI 0x8943\r\n#define GL_CON_3_ATI 0x8944\r\n#define GL_CON_4_ATI 0x8945\r\n#define GL_CON_5_ATI 0x8946\r\n#define GL_CON_6_ATI 0x8947\r\n#define GL_CON_7_ATI 0x8948\r\n#define GL_MOV_ATI 0x8961\r\n#define GL_ADD_ATI 0x8963\r\n#define GL_MUL_ATI 0x8964\r\n#define GL_SUB_ATI 0x8965\r\n#define GL_DOT3_ATI 0x8966\r\n#define GL_DOT4_ATI 0x8967\r\n#define GL_MAD_ATI 0x8968\r\n#define GL_LERP_ATI 0x8969\r\n#define GL_CND_ATI 0x896A\r\n#define GL_CND0_ATI 0x896B\r\n#define GL_DOT2_ADD_ATI 0x896C\r\n#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D\r\n#define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E\r\n#define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F\r\n#define GL_NUM_PASSES_ATI 0x8970\r\n#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971\r\n#define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972\r\n#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973\r\n#define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974\r\n#define GL_COLOR_ALPHA_PAIRING_ATI 0x8975\r\n#define GL_SWIZZLE_STR_ATI 0x8976\r\n#define GL_SWIZZLE_STQ_ATI 0x8977\r\n#define GL_SWIZZLE_STR_DR_ATI 0x8978\r\n#define GL_SWIZZLE_STQ_DQ_ATI 0x8979\r\n#define GL_SWIZZLE_STRQ_ATI 0x897A\r\n#define GL_SWIZZLE_STRQ_DQ_ATI 0x897B\r\n\r\ntypedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod);\r\ntypedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod);\r\ntypedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod);\r\ntypedef void (GLAPIENTRY * PFNGLBEGINFRAGMENTSHADERATIPROC) (void);\r\ntypedef void (GLAPIENTRY * PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id);\r\ntypedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod);\r\ntypedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod);\r\ntypedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod);\r\ntypedef void (GLAPIENTRY * PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id);\r\ntypedef void (GLAPIENTRY * PFNGLENDFRAGMENTSHADERATIPROC) (void);\r\ntypedef GLuint (GLAPIENTRY * PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range);\r\ntypedef void (GLAPIENTRY * PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle);\r\ntypedef void (GLAPIENTRY * PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle);\r\ntypedef void (GLAPIENTRY * PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat* value);\r\n\r\n#define glAlphaFragmentOp1ATI GLEW_GET_FUN(__glewAlphaFragmentOp1ATI)\r\n#define glAlphaFragmentOp2ATI GLEW_GET_FUN(__glewAlphaFragmentOp2ATI)\r\n#define glAlphaFragmentOp3ATI GLEW_GET_FUN(__glewAlphaFragmentOp3ATI)\r\n#define glBeginFragmentShaderATI GLEW_GET_FUN(__glewBeginFragmentShaderATI)\r\n#define glBindFragmentShaderATI GLEW_GET_FUN(__glewBindFragmentShaderATI)\r\n#define glColorFragmentOp1ATI GLEW_GET_FUN(__glewColorFragmentOp1ATI)\r\n#define glColorFragmentOp2ATI GLEW_GET_FUN(__glewColorFragmentOp2ATI)\r\n#define glColorFragmentOp3ATI GLEW_GET_FUN(__glewColorFragmentOp3ATI)\r\n#define glDeleteFragmentShaderATI GLEW_GET_FUN(__glewDeleteFragmentShaderATI)\r\n#define glEndFragmentShaderATI GLEW_GET_FUN(__glewEndFragmentShaderATI)\r\n#define glGenFragmentShadersATI GLEW_GET_FUN(__glewGenFragmentShadersATI)\r\n#define glPassTexCoordATI GLEW_GET_FUN(__glewPassTexCoordATI)\r\n#define glSampleMapATI GLEW_GET_FUN(__glewSampleMapATI)\r\n#define glSetFragmentShaderConstantATI GLEW_GET_FUN(__glewSetFragmentShaderConstantATI)\r\n\r\n#define GLEW_ATI_fragment_shader GLEW_GET_VAR(__GLEW_ATI_fragment_shader)\r\n\r\n#endif /* GL_ATI_fragment_shader */\r\n\r\n/* ------------------------ GL_ATI_map_object_buffer ----------------------- */\r\n\r\n#ifndef GL_ATI_map_object_buffer\r\n#define GL_ATI_map_object_buffer 1\r\n\r\ntypedef void* (GLAPIENTRY * PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer);\r\ntypedef void (GLAPIENTRY * PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer);\r\n\r\n#define glMapObjectBufferATI GLEW_GET_FUN(__glewMapObjectBufferATI)\r\n#define glUnmapObjectBufferATI GLEW_GET_FUN(__glewUnmapObjectBufferATI)\r\n\r\n#define GLEW_ATI_map_object_buffer GLEW_GET_VAR(__GLEW_ATI_map_object_buffer)\r\n\r\n#endif /* GL_ATI_map_object_buffer */\r\n\r\n/* ----------------------------- GL_ATI_meminfo ---------------------------- */\r\n\r\n#ifndef GL_ATI_meminfo\r\n#define GL_ATI_meminfo 1\r\n\r\n#define GL_VBO_FREE_MEMORY_ATI 0x87FB\r\n#define GL_TEXTURE_FREE_MEMORY_ATI 0x87FC\r\n#define GL_RENDERBUFFER_FREE_MEMORY_ATI 0x87FD\r\n\r\n#define GLEW_ATI_meminfo GLEW_GET_VAR(__GLEW_ATI_meminfo)\r\n\r\n#endif /* GL_ATI_meminfo */\r\n\r\n/* -------------------------- GL_ATI_pn_triangles -------------------------- */\r\n\r\n#ifndef GL_ATI_pn_triangles\r\n#define GL_ATI_pn_triangles 1\r\n\r\n#define GL_PN_TRIANGLES_ATI 0x87F0\r\n#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1\r\n#define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2\r\n#define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3\r\n#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4\r\n#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5\r\n#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6\r\n#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7\r\n#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8\r\n\r\ntypedef void (GLAPIENTRY * PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param);\r\ntypedef void (GLAPIENTRY * PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param);\r\n\r\n#define glPNTrianglesfATI GLEW_GET_FUN(__glPNTrianglewesfATI)\r\n#define glPNTrianglesiATI GLEW_GET_FUN(__glPNTrianglewesiATI)\r\n\r\n#define GLEW_ATI_pn_triangles GLEW_GET_VAR(__GLEW_ATI_pn_triangles)\r\n\r\n#endif /* GL_ATI_pn_triangles */\r\n\r\n/* ------------------------ GL_ATI_separate_stencil ------------------------ */\r\n\r\n#ifndef GL_ATI_separate_stencil\r\n#define GL_ATI_separate_stencil 1\r\n\r\n#define GL_STENCIL_BACK_FUNC_ATI 0x8800\r\n#define GL_STENCIL_BACK_FAIL_ATI 0x8801\r\n#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802\r\n#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803\r\n\r\ntypedef void (GLAPIENTRY * PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask);\r\ntypedef void (GLAPIENTRY * PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);\r\n\r\n#define glStencilFuncSeparateATI GLEW_GET_FUN(__glewStencilFuncSeparateATI)\r\n#define glStencilOpSeparateATI GLEW_GET_FUN(__glewStencilOpSeparateATI)\r\n\r\n#define GLEW_ATI_separate_stencil GLEW_GET_VAR(__GLEW_ATI_separate_stencil)\r\n\r\n#endif /* GL_ATI_separate_stencil */\r\n\r\n/* ----------------------- GL_ATI_shader_texture_lod ----------------------- */\r\n\r\n#ifndef GL_ATI_shader_texture_lod\r\n#define GL_ATI_shader_texture_lod 1\r\n\r\n#define GLEW_ATI_shader_texture_lod GLEW_GET_VAR(__GLEW_ATI_shader_texture_lod)\r\n\r\n#endif /* GL_ATI_shader_texture_lod */\r\n\r\n/* ---------------------- GL_ATI_text_fragment_shader ---------------------- */\r\n\r\n#ifndef GL_ATI_text_fragment_shader\r\n#define GL_ATI_text_fragment_shader 1\r\n\r\n#define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200\r\n\r\n#define GLEW_ATI_text_fragment_shader GLEW_GET_VAR(__GLEW_ATI_text_fragment_shader)\r\n\r\n#endif /* GL_ATI_text_fragment_shader */\r\n\r\n/* --------------------- GL_ATI_texture_compression_3dc -------------------- */\r\n\r\n#ifndef GL_ATI_texture_compression_3dc\r\n#define GL_ATI_texture_compression_3dc 1\r\n\r\n#define GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI 0x8837\r\n\r\n#define GLEW_ATI_texture_compression_3dc GLEW_GET_VAR(__GLEW_ATI_texture_compression_3dc)\r\n\r\n#endif /* GL_ATI_texture_compression_3dc */\r\n\r\n/* ---------------------- GL_ATI_texture_env_combine3 ---------------------- */\r\n\r\n#ifndef GL_ATI_texture_env_combine3\r\n#define GL_ATI_texture_env_combine3 1\r\n\r\n#define GL_MODULATE_ADD_ATI 0x8744\r\n#define GL_MODULATE_SIGNED_ADD_ATI 0x8745\r\n#define GL_MODULATE_SUBTRACT_ATI 0x8746\r\n\r\n#define GLEW_ATI_texture_env_combine3 GLEW_GET_VAR(__GLEW_ATI_texture_env_combine3)\r\n\r\n#endif /* GL_ATI_texture_env_combine3 */\r\n\r\n/* -------------------------- GL_ATI_texture_float ------------------------- */\r\n\r\n#ifndef GL_ATI_texture_float\r\n#define GL_ATI_texture_float 1\r\n\r\n#define GL_RGBA_FLOAT32_ATI 0x8814\r\n#define GL_RGB_FLOAT32_ATI 0x8815\r\n#define GL_ALPHA_FLOAT32_ATI 0x8816\r\n#define GL_INTENSITY_FLOAT32_ATI 0x8817\r\n#define GL_LUMINANCE_FLOAT32_ATI 0x8818\r\n#define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819\r\n#define GL_RGBA_FLOAT16_ATI 0x881A\r\n#define GL_RGB_FLOAT16_ATI 0x881B\r\n#define GL_ALPHA_FLOAT16_ATI 0x881C\r\n#define GL_INTENSITY_FLOAT16_ATI 0x881D\r\n#define GL_LUMINANCE_FLOAT16_ATI 0x881E\r\n#define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F\r\n\r\n#define GLEW_ATI_texture_float GLEW_GET_VAR(__GLEW_ATI_texture_float)\r\n\r\n#endif /* GL_ATI_texture_float */\r\n\r\n/* ----------------------- GL_ATI_texture_mirror_once ---------------------- */\r\n\r\n#ifndef GL_ATI_texture_mirror_once\r\n#define GL_ATI_texture_mirror_once 1\r\n\r\n#define GL_MIRROR_CLAMP_ATI 0x8742\r\n#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743\r\n\r\n#define GLEW_ATI_texture_mirror_once GLEW_GET_VAR(__GLEW_ATI_texture_mirror_once)\r\n\r\n#endif /* GL_ATI_texture_mirror_once */\r\n\r\n/* ----------------------- GL_ATI_vertex_array_object ---------------------- */\r\n\r\n#ifndef GL_ATI_vertex_array_object\r\n#define GL_ATI_vertex_array_object 1\r\n\r\n#define GL_STATIC_ATI 0x8760\r\n#define GL_DYNAMIC_ATI 0x8761\r\n#define GL_PRESERVE_ATI 0x8762\r\n#define GL_DISCARD_ATI 0x8763\r\n#define GL_OBJECT_BUFFER_SIZE_ATI 0x8764\r\n#define GL_OBJECT_BUFFER_USAGE_ATI 0x8765\r\n#define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766\r\n#define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767\r\n\r\ntypedef void (GLAPIENTRY * PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset);\r\ntypedef void (GLAPIENTRY * PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer);\r\ntypedef void (GLAPIENTRY * PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint* params);\r\ntypedef GLboolean (GLAPIENTRY * PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer);\r\ntypedef GLuint (GLAPIENTRY * PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const void* pointer, GLenum usage);\r\ntypedef void (GLAPIENTRY * PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const void* pointer, GLenum preserve);\r\ntypedef void (GLAPIENTRY * PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset);\r\n\r\n#define glArrayObjectATI GLEW_GET_FUN(__glewArrayObjectATI)\r\n#define glFreeObjectBufferATI GLEW_GET_FUN(__glewFreeObjectBufferATI)\r\n#define glGetArrayObjectfvATI GLEW_GET_FUN(__glewGetArrayObjectfvATI)\r\n#define glGetArrayObjectivATI GLEW_GET_FUN(__glewGetArrayObjectivATI)\r\n#define glGetObjectBufferfvATI GLEW_GET_FUN(__glewGetObjectBufferfvATI)\r\n#define glGetObjectBufferivATI GLEW_GET_FUN(__glewGetObjectBufferivATI)\r\n#define glGetVariantArrayObjectfvATI GLEW_GET_FUN(__glewGetVariantArrayObjectfvATI)\r\n#define glGetVariantArrayObjectivATI GLEW_GET_FUN(__glewGetVariantArrayObjectivATI)\r\n#define glIsObjectBufferATI GLEW_GET_FUN(__glewIsObjectBufferATI)\r\n#define glNewObjectBufferATI GLEW_GET_FUN(__glewNewObjectBufferATI)\r\n#define glUpdateObjectBufferATI GLEW_GET_FUN(__glewUpdateObjectBufferATI)\r\n#define glVariantArrayObjectATI GLEW_GET_FUN(__glewVariantArrayObjectATI)\r\n\r\n#define GLEW_ATI_vertex_array_object GLEW_GET_VAR(__GLEW_ATI_vertex_array_object)\r\n\r\n#endif /* GL_ATI_vertex_array_object */\r\n\r\n/* ------------------- GL_ATI_vertex_attrib_array_object ------------------- */\r\n\r\n#ifndef GL_ATI_vertex_attrib_array_object\r\n#define GL_ATI_vertex_attrib_array_object 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset);\r\n\r\n#define glGetVertexAttribArrayObjectfvATI GLEW_GET_FUN(__glewGetVertexAttribArrayObjectfvATI)\r\n#define glGetVertexAttribArrayObjectivATI GLEW_GET_FUN(__glewGetVertexAttribArrayObjectivATI)\r\n#define glVertexAttribArrayObjectATI GLEW_GET_FUN(__glewVertexAttribArrayObjectATI)\r\n\r\n#define GLEW_ATI_vertex_attrib_array_object GLEW_GET_VAR(__GLEW_ATI_vertex_attrib_array_object)\r\n\r\n#endif /* GL_ATI_vertex_attrib_array_object */\r\n\r\n/* ------------------------- GL_ATI_vertex_streams ------------------------- */\r\n\r\n#ifndef GL_ATI_vertex_streams\r\n#define GL_ATI_vertex_streams 1\r\n\r\n#define GL_MAX_VERTEX_STREAMS_ATI 0x876B\r\n#define GL_VERTEX_SOURCE_ATI 0x876C\r\n#define GL_VERTEX_STREAM0_ATI 0x876D\r\n#define GL_VERTEX_STREAM1_ATI 0x876E\r\n#define GL_VERTEX_STREAM2_ATI 0x876F\r\n#define GL_VERTEX_STREAM3_ATI 0x8770\r\n#define GL_VERTEX_STREAM4_ATI 0x8771\r\n#define GL_VERTEX_STREAM5_ATI 0x8772\r\n#define GL_VERTEX_STREAM6_ATI 0x8773\r\n#define GL_VERTEX_STREAM7_ATI 0x8774\r\n\r\ntypedef void (GLAPIENTRY * PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream);\r\ntypedef void (GLAPIENTRY * PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte x, GLbyte y, GLbyte z);\r\ntypedef void (GLAPIENTRY * PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *v);\r\ntypedef void (GLAPIENTRY * PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z);\r\ntypedef void (GLAPIENTRY * PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *v);\r\ntypedef void (GLAPIENTRY * PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z);\r\ntypedef void (GLAPIENTRY * PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *v);\r\ntypedef void (GLAPIENTRY * PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z);\r\ntypedef void (GLAPIENTRY * PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *v);\r\ntypedef void (GLAPIENTRY * PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z);\r\ntypedef void (GLAPIENTRY * PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *v);\r\n\r\n#define glClientActiveVertexStreamATI GLEW_GET_FUN(__glewClientActiveVertexStreamATI)\r\n#define glNormalStream3bATI GLEW_GET_FUN(__glewNormalStream3bATI)\r\n#define glNormalStream3bvATI GLEW_GET_FUN(__glewNormalStream3bvATI)\r\n#define glNormalStream3dATI GLEW_GET_FUN(__glewNormalStream3dATI)\r\n#define glNormalStream3dvATI GLEW_GET_FUN(__glewNormalStream3dvATI)\r\n#define glNormalStream3fATI GLEW_GET_FUN(__glewNormalStream3fATI)\r\n#define glNormalStream3fvATI GLEW_GET_FUN(__glewNormalStream3fvATI)\r\n#define glNormalStream3iATI GLEW_GET_FUN(__glewNormalStream3iATI)\r\n#define glNormalStream3ivATI GLEW_GET_FUN(__glewNormalStream3ivATI)\r\n#define glNormalStream3sATI GLEW_GET_FUN(__glewNormalStream3sATI)\r\n#define glNormalStream3svATI GLEW_GET_FUN(__glewNormalStream3svATI)\r\n#define glVertexBlendEnvfATI GLEW_GET_FUN(__glewVertexBlendEnvfATI)\r\n#define glVertexBlendEnviATI GLEW_GET_FUN(__glewVertexBlendEnviATI)\r\n#define glVertexStream2dATI GLEW_GET_FUN(__glewVertexStream2dATI)\r\n#define glVertexStream2dvATI GLEW_GET_FUN(__glewVertexStream2dvATI)\r\n#define glVertexStream2fATI GLEW_GET_FUN(__glewVertexStream2fATI)\r\n#define glVertexStream2fvATI GLEW_GET_FUN(__glewVertexStream2fvATI)\r\n#define glVertexStream2iATI GLEW_GET_FUN(__glewVertexStream2iATI)\r\n#define glVertexStream2ivATI GLEW_GET_FUN(__glewVertexStream2ivATI)\r\n#define glVertexStream2sATI GLEW_GET_FUN(__glewVertexStream2sATI)\r\n#define glVertexStream2svATI GLEW_GET_FUN(__glewVertexStream2svATI)\r\n#define glVertexStream3dATI GLEW_GET_FUN(__glewVertexStream3dATI)\r\n#define glVertexStream3dvATI GLEW_GET_FUN(__glewVertexStream3dvATI)\r\n#define glVertexStream3fATI GLEW_GET_FUN(__glewVertexStream3fATI)\r\n#define glVertexStream3fvATI GLEW_GET_FUN(__glewVertexStream3fvATI)\r\n#define glVertexStream3iATI GLEW_GET_FUN(__glewVertexStream3iATI)\r\n#define glVertexStream3ivATI GLEW_GET_FUN(__glewVertexStream3ivATI)\r\n#define glVertexStream3sATI GLEW_GET_FUN(__glewVertexStream3sATI)\r\n#define glVertexStream3svATI GLEW_GET_FUN(__glewVertexStream3svATI)\r\n#define glVertexStream4dATI GLEW_GET_FUN(__glewVertexStream4dATI)\r\n#define glVertexStream4dvATI GLEW_GET_FUN(__glewVertexStream4dvATI)\r\n#define glVertexStream4fATI GLEW_GET_FUN(__glewVertexStream4fATI)\r\n#define glVertexStream4fvATI GLEW_GET_FUN(__glewVertexStream4fvATI)\r\n#define glVertexStream4iATI GLEW_GET_FUN(__glewVertexStream4iATI)\r\n#define glVertexStream4ivATI GLEW_GET_FUN(__glewVertexStream4ivATI)\r\n#define glVertexStream4sATI GLEW_GET_FUN(__glewVertexStream4sATI)\r\n#define glVertexStream4svATI GLEW_GET_FUN(__glewVertexStream4svATI)\r\n\r\n#define GLEW_ATI_vertex_streams GLEW_GET_VAR(__GLEW_ATI_vertex_streams)\r\n\r\n#endif /* GL_ATI_vertex_streams */\r\n\r\n/* --------------------------- GL_EXT_422_pixels --------------------------- */\r\n\r\n#ifndef GL_EXT_422_pixels\r\n#define GL_EXT_422_pixels 1\r\n\r\n#define GL_422_EXT 0x80CC\r\n#define GL_422_REV_EXT 0x80CD\r\n#define GL_422_AVERAGE_EXT 0x80CE\r\n#define GL_422_REV_AVERAGE_EXT 0x80CF\r\n\r\n#define GLEW_EXT_422_pixels GLEW_GET_VAR(__GLEW_EXT_422_pixels)\r\n\r\n#endif /* GL_EXT_422_pixels */\r\n\r\n/* ---------------------------- GL_EXT_Cg_shader --------------------------- */\r\n\r\n#ifndef GL_EXT_Cg_shader\r\n#define GL_EXT_Cg_shader 1\r\n\r\n#define GL_CG_VERTEX_SHADER_EXT 0x890E\r\n#define GL_CG_FRAGMENT_SHADER_EXT 0x890F\r\n\r\n#define GLEW_EXT_Cg_shader GLEW_GET_VAR(__GLEW_EXT_Cg_shader)\r\n\r\n#endif /* GL_EXT_Cg_shader */\r\n\r\n/* ------------------------------ GL_EXT_abgr ------------------------------ */\r\n\r\n#ifndef GL_EXT_abgr\r\n#define GL_EXT_abgr 1\r\n\r\n#define GL_ABGR_EXT 0x8000\r\n\r\n#define GLEW_EXT_abgr GLEW_GET_VAR(__GLEW_EXT_abgr)\r\n\r\n#endif /* GL_EXT_abgr */\r\n\r\n/* ------------------------------ GL_EXT_bgra ------------------------------ */\r\n\r\n#ifndef GL_EXT_bgra\r\n#define GL_EXT_bgra 1\r\n\r\n#define GL_BGR_EXT 0x80E0\r\n#define GL_BGRA_EXT 0x80E1\r\n\r\n#define GLEW_EXT_bgra GLEW_GET_VAR(__GLEW_EXT_bgra)\r\n\r\n#endif /* GL_EXT_bgra */\r\n\r\n/* ------------------------ GL_EXT_bindable_uniform ------------------------ */\r\n\r\n#ifndef GL_EXT_bindable_uniform\r\n#define GL_EXT_bindable_uniform 1\r\n\r\n#define GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT 0x8DE2\r\n#define GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT 0x8DE3\r\n#define GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT 0x8DE4\r\n#define GL_MAX_BINDABLE_UNIFORM_SIZE_EXT 0x8DED\r\n#define GL_UNIFORM_BUFFER_EXT 0x8DEE\r\n#define GL_UNIFORM_BUFFER_BINDING_EXT 0x8DEF\r\n\r\ntypedef GLint (GLAPIENTRY * PFNGLGETUNIFORMBUFFERSIZEEXTPROC) (GLuint program, GLint location);\r\ntypedef GLintptr (GLAPIENTRY * PFNGLGETUNIFORMOFFSETEXTPROC) (GLuint program, GLint location);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORMBUFFEREXTPROC) (GLuint program, GLint location, GLuint buffer);\r\n\r\n#define glGetUniformBufferSizeEXT GLEW_GET_FUN(__glewGetUniformBufferSizeEXT)\r\n#define glGetUniformOffsetEXT GLEW_GET_FUN(__glewGetUniformOffsetEXT)\r\n#define glUniformBufferEXT GLEW_GET_FUN(__glewUniformBufferEXT)\r\n\r\n#define GLEW_EXT_bindable_uniform GLEW_GET_VAR(__GLEW_EXT_bindable_uniform)\r\n\r\n#endif /* GL_EXT_bindable_uniform */\r\n\r\n/* --------------------------- GL_EXT_blend_color -------------------------- */\r\n\r\n#ifndef GL_EXT_blend_color\r\n#define GL_EXT_blend_color 1\r\n\r\n#define GL_CONSTANT_COLOR_EXT 0x8001\r\n#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002\r\n#define GL_CONSTANT_ALPHA_EXT 0x8003\r\n#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004\r\n#define GL_BLEND_COLOR_EXT 0x8005\r\n\r\ntypedef void (GLAPIENTRY * PFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);\r\n\r\n#define glBlendColorEXT GLEW_GET_FUN(__glewBlendColorEXT)\r\n\r\n#define GLEW_EXT_blend_color GLEW_GET_VAR(__GLEW_EXT_blend_color)\r\n\r\n#endif /* GL_EXT_blend_color */\r\n\r\n/* --------------------- GL_EXT_blend_equation_separate -------------------- */\r\n\r\n#ifndef GL_EXT_blend_equation_separate\r\n#define GL_EXT_blend_equation_separate 1\r\n\r\n#define GL_BLEND_EQUATION_RGB_EXT 0x8009\r\n#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D\r\n\r\ntypedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha);\r\n\r\n#define glBlendEquationSeparateEXT GLEW_GET_FUN(__glewBlendEquationSeparateEXT)\r\n\r\n#define GLEW_EXT_blend_equation_separate GLEW_GET_VAR(__GLEW_EXT_blend_equation_separate)\r\n\r\n#endif /* GL_EXT_blend_equation_separate */\r\n\r\n/* ----------------------- GL_EXT_blend_func_separate ---------------------- */\r\n\r\n#ifndef GL_EXT_blend_func_separate\r\n#define GL_EXT_blend_func_separate 1\r\n\r\n#define GL_BLEND_DST_RGB_EXT 0x80C8\r\n#define GL_BLEND_SRC_RGB_EXT 0x80C9\r\n#define GL_BLEND_DST_ALPHA_EXT 0x80CA\r\n#define GL_BLEND_SRC_ALPHA_EXT 0x80CB\r\n\r\ntypedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);\r\n\r\n#define glBlendFuncSeparateEXT GLEW_GET_FUN(__glewBlendFuncSeparateEXT)\r\n\r\n#define GLEW_EXT_blend_func_separate GLEW_GET_VAR(__GLEW_EXT_blend_func_separate)\r\n\r\n#endif /* GL_EXT_blend_func_separate */\r\n\r\n/* ------------------------- GL_EXT_blend_logic_op ------------------------- */\r\n\r\n#ifndef GL_EXT_blend_logic_op\r\n#define GL_EXT_blend_logic_op 1\r\n\r\n#define GLEW_EXT_blend_logic_op GLEW_GET_VAR(__GLEW_EXT_blend_logic_op)\r\n\r\n#endif /* GL_EXT_blend_logic_op */\r\n\r\n/* -------------------------- GL_EXT_blend_minmax -------------------------- */\r\n\r\n#ifndef GL_EXT_blend_minmax\r\n#define GL_EXT_blend_minmax 1\r\n\r\n#define GL_FUNC_ADD_EXT 0x8006\r\n#define GL_MIN_EXT 0x8007\r\n#define GL_MAX_EXT 0x8008\r\n#define GL_BLEND_EQUATION_EXT 0x8009\r\n\r\ntypedef void (GLAPIENTRY * PFNGLBLENDEQUATIONEXTPROC) (GLenum mode);\r\n\r\n#define glBlendEquationEXT GLEW_GET_FUN(__glewBlendEquationEXT)\r\n\r\n#define GLEW_EXT_blend_minmax GLEW_GET_VAR(__GLEW_EXT_blend_minmax)\r\n\r\n#endif /* GL_EXT_blend_minmax */\r\n\r\n/* ------------------------- GL_EXT_blend_subtract ------------------------- */\r\n\r\n#ifndef GL_EXT_blend_subtract\r\n#define GL_EXT_blend_subtract 1\r\n\r\n#define GL_FUNC_SUBTRACT_EXT 0x800A\r\n#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B\r\n\r\n#define GLEW_EXT_blend_subtract GLEW_GET_VAR(__GLEW_EXT_blend_subtract)\r\n\r\n#endif /* GL_EXT_blend_subtract */\r\n\r\n/* ------------------------ GL_EXT_clip_volume_hint ------------------------ */\r\n\r\n#ifndef GL_EXT_clip_volume_hint\r\n#define GL_EXT_clip_volume_hint 1\r\n\r\n#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0\r\n\r\n#define GLEW_EXT_clip_volume_hint GLEW_GET_VAR(__GLEW_EXT_clip_volume_hint)\r\n\r\n#endif /* GL_EXT_clip_volume_hint */\r\n\r\n/* ------------------------------ GL_EXT_cmyka ----------------------------- */\r\n\r\n#ifndef GL_EXT_cmyka\r\n#define GL_EXT_cmyka 1\r\n\r\n#define GL_CMYK_EXT 0x800C\r\n#define GL_CMYKA_EXT 0x800D\r\n#define GL_PACK_CMYK_HINT_EXT 0x800E\r\n#define GL_UNPACK_CMYK_HINT_EXT 0x800F\r\n\r\n#define GLEW_EXT_cmyka GLEW_GET_VAR(__GLEW_EXT_cmyka)\r\n\r\n#endif /* GL_EXT_cmyka */\r\n\r\n/* ------------------------- GL_EXT_color_subtable ------------------------- */\r\n\r\n#ifndef GL_EXT_color_subtable\r\n#define GL_EXT_color_subtable 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void* data);\r\ntypedef void (GLAPIENTRY * PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);\r\n\r\n#define glColorSubTableEXT GLEW_GET_FUN(__glewColorSubTableEXT)\r\n#define glCopyColorSubTableEXT GLEW_GET_FUN(__glewCopyColorSubTableEXT)\r\n\r\n#define GLEW_EXT_color_subtable GLEW_GET_VAR(__GLEW_EXT_color_subtable)\r\n\r\n#endif /* GL_EXT_color_subtable */\r\n\r\n/* ---------------------- GL_EXT_compiled_vertex_array --------------------- */\r\n\r\n#ifndef GL_EXT_compiled_vertex_array\r\n#define GL_EXT_compiled_vertex_array 1\r\n\r\n#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8\r\n#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9\r\n\r\ntypedef void (GLAPIENTRY * PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count);\r\ntypedef void (GLAPIENTRY * PFNGLUNLOCKARRAYSEXTPROC) (void);\r\n\r\n#define glLockArraysEXT GLEW_GET_FUN(__glewLockArraysEXT)\r\n#define glUnlockArraysEXT GLEW_GET_FUN(__glewUnlockArraysEXT)\r\n\r\n#define GLEW_EXT_compiled_vertex_array GLEW_GET_VAR(__GLEW_EXT_compiled_vertex_array)\r\n\r\n#endif /* GL_EXT_compiled_vertex_array */\r\n\r\n/* --------------------------- GL_EXT_convolution -------------------------- */\r\n\r\n#ifndef GL_EXT_convolution\r\n#define GL_EXT_convolution 1\r\n\r\n#define GL_CONVOLUTION_1D_EXT 0x8010\r\n#define GL_CONVOLUTION_2D_EXT 0x8011\r\n#define GL_SEPARABLE_2D_EXT 0x8012\r\n#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013\r\n#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014\r\n#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015\r\n#define GL_REDUCE_EXT 0x8016\r\n#define GL_CONVOLUTION_FORMAT_EXT 0x8017\r\n#define GL_CONVOLUTION_WIDTH_EXT 0x8018\r\n#define GL_CONVOLUTION_HEIGHT_EXT 0x8019\r\n#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A\r\n#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B\r\n#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C\r\n#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D\r\n#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E\r\n#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F\r\n#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020\r\n#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021\r\n#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022\r\n#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023\r\n\r\ntypedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void* image);\r\ntypedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* image);\r\ntypedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param);\r\ntypedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param);\r\ntypedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);\r\ntypedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);\r\ntypedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void* image);\r\ntypedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void* row, void* column, void* span);\r\ntypedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* row, const void* column);\r\n\r\n#define glConvolutionFilter1DEXT GLEW_GET_FUN(__glewConvolutionFilter1DEXT)\r\n#define glConvolutionFilter2DEXT GLEW_GET_FUN(__glewConvolutionFilter2DEXT)\r\n#define glConvolutionParameterfEXT GLEW_GET_FUN(__glewConvolutionParameterfEXT)\r\n#define glConvolutionParameterfvEXT GLEW_GET_FUN(__glewConvolutionParameterfvEXT)\r\n#define glConvolutionParameteriEXT GLEW_GET_FUN(__glewConvolutionParameteriEXT)\r\n#define glConvolutionParameterivEXT GLEW_GET_FUN(__glewConvolutionParameterivEXT)\r\n#define glCopyConvolutionFilter1DEXT GLEW_GET_FUN(__glewCopyConvolutionFilter1DEXT)\r\n#define glCopyConvolutionFilter2DEXT GLEW_GET_FUN(__glewCopyConvolutionFilter2DEXT)\r\n#define glGetConvolutionFilterEXT GLEW_GET_FUN(__glewGetConvolutionFilterEXT)\r\n#define glGetConvolutionParameterfvEXT GLEW_GET_FUN(__glewGetConvolutionParameterfvEXT)\r\n#define glGetConvolutionParameterivEXT GLEW_GET_FUN(__glewGetConvolutionParameterivEXT)\r\n#define glGetSeparableFilterEXT GLEW_GET_FUN(__glewGetSeparableFilterEXT)\r\n#define glSeparableFilter2DEXT GLEW_GET_FUN(__glewSeparableFilter2DEXT)\r\n\r\n#define GLEW_EXT_convolution GLEW_GET_VAR(__GLEW_EXT_convolution)\r\n\r\n#endif /* GL_EXT_convolution */\r\n\r\n/* ------------------------ GL_EXT_coordinate_frame ------------------------ */\r\n\r\n#ifndef GL_EXT_coordinate_frame\r\n#define GL_EXT_coordinate_frame 1\r\n\r\n#define GL_TANGENT_ARRAY_EXT 0x8439\r\n#define GL_BINORMAL_ARRAY_EXT 0x843A\r\n#define GL_CURRENT_TANGENT_EXT 0x843B\r\n#define GL_CURRENT_BINORMAL_EXT 0x843C\r\n#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E\r\n#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F\r\n#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440\r\n#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441\r\n#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442\r\n#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443\r\n#define GL_MAP1_TANGENT_EXT 0x8444\r\n#define GL_MAP2_TANGENT_EXT 0x8445\r\n#define GL_MAP1_BINORMAL_EXT 0x8446\r\n#define GL_MAP2_BINORMAL_EXT 0x8447\r\n\r\ntypedef void (GLAPIENTRY * PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, void* pointer);\r\ntypedef void (GLAPIENTRY * PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, void* pointer);\r\n\r\n#define glBinormalPointerEXT GLEW_GET_FUN(__glewBinormalPointerEXT)\r\n#define glTangentPointerEXT GLEW_GET_FUN(__glewTangentPointerEXT)\r\n\r\n#define GLEW_EXT_coordinate_frame GLEW_GET_VAR(__GLEW_EXT_coordinate_frame)\r\n\r\n#endif /* GL_EXT_coordinate_frame */\r\n\r\n/* -------------------------- GL_EXT_copy_texture -------------------------- */\r\n\r\n#ifndef GL_EXT_copy_texture\r\n#define GL_EXT_copy_texture 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);\r\ntypedef void (GLAPIENTRY * PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);\r\ntypedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);\r\ntypedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);\r\ntypedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);\r\n\r\n#define glCopyTexImage1DEXT GLEW_GET_FUN(__glewCopyTexImage1DEXT)\r\n#define glCopyTexImage2DEXT GLEW_GET_FUN(__glewCopyTexImage2DEXT)\r\n#define glCopyTexSubImage1DEXT GLEW_GET_FUN(__glewCopyTexSubImage1DEXT)\r\n#define glCopyTexSubImage2DEXT GLEW_GET_FUN(__glewCopyTexSubImage2DEXT)\r\n#define glCopyTexSubImage3DEXT GLEW_GET_FUN(__glewCopyTexSubImage3DEXT)\r\n\r\n#define GLEW_EXT_copy_texture GLEW_GET_VAR(__GLEW_EXT_copy_texture)\r\n\r\n#endif /* GL_EXT_copy_texture */\r\n\r\n/* --------------------------- GL_EXT_cull_vertex -------------------------- */\r\n\r\n#ifndef GL_EXT_cull_vertex\r\n#define GL_EXT_cull_vertex 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble* params);\r\ntypedef void (GLAPIENTRY * PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat* params);\r\n\r\n#define glCullParameterdvEXT GLEW_GET_FUN(__glewCullParameterdvEXT)\r\n#define glCullParameterfvEXT GLEW_GET_FUN(__glewCullParameterfvEXT)\r\n\r\n#define GLEW_EXT_cull_vertex GLEW_GET_VAR(__GLEW_EXT_cull_vertex)\r\n\r\n#endif /* GL_EXT_cull_vertex */\r\n\r\n/* ------------------------ GL_EXT_depth_bounds_test ----------------------- */\r\n\r\n#ifndef GL_EXT_depth_bounds_test\r\n#define GL_EXT_depth_bounds_test 1\r\n\r\n#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890\r\n#define GL_DEPTH_BOUNDS_EXT 0x8891\r\n\r\ntypedef void (GLAPIENTRY * PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax);\r\n\r\n#define glDepthBoundsEXT GLEW_GET_FUN(__glewDepthBoundsEXT)\r\n\r\n#define GLEW_EXT_depth_bounds_test GLEW_GET_VAR(__GLEW_EXT_depth_bounds_test)\r\n\r\n#endif /* GL_EXT_depth_bounds_test */\r\n\r\n/* ----------------------- GL_EXT_direct_state_access ---------------------- */\r\n\r\n#ifndef GL_EXT_direct_state_access\r\n#define GL_EXT_direct_state_access 1\r\n\r\n#define GL_PROGRAM_MATRIX_EXT 0x8E2D\r\n#define GL_TRANSPOSE_PROGRAM_MATRIX_EXT 0x8E2E\r\n#define GL_PROGRAM_MATRIX_STACK_DEPTH_EXT 0x8E2F\r\n\r\ntypedef void (GLAPIENTRY * PFNGLBINDMULTITEXTUREEXTPROC) (GLenum texunit, GLenum target, GLuint texture);\r\ntypedef GLenum (GLAPIENTRY * PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC) (GLuint framebuffer, GLenum target);\r\ntypedef void (GLAPIENTRY * PFNGLCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask);\r\ntypedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void* data);\r\ntypedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data);\r\ntypedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data);\r\ntypedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void* data);\r\ntypedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data);\r\ntypedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data);\r\ntypedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void* data);\r\ntypedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data);\r\ntypedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data);\r\ntypedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void* data);\r\ntypedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data);\r\ntypedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data);\r\ntypedef void (GLAPIENTRY * PFNGLCOPYMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);\r\ntypedef void (GLAPIENTRY * PFNGLCOPYMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);\r\ntypedef void (GLAPIENTRY * PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);\r\ntypedef void (GLAPIENTRY * PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);\r\ntypedef void (GLAPIENTRY * PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);\r\ntypedef void (GLAPIENTRY * PFNGLCOPYTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);\r\ntypedef void (GLAPIENTRY * PFNGLCOPYTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);\r\ntypedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);\r\ntypedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);\r\ntypedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);\r\ntypedef void (GLAPIENTRY * PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index);\r\ntypedef void (GLAPIENTRY * PFNGLDISABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index);\r\ntypedef void (GLAPIENTRY * PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index);\r\ntypedef void (GLAPIENTRY * PFNGLDISABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array);\r\ntypedef void (GLAPIENTRY * PFNGLENABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index);\r\ntypedef void (GLAPIENTRY * PFNGLENABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index);\r\ntypedef void (GLAPIENTRY * PFNGLENABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index);\r\ntypedef void (GLAPIENTRY * PFNGLENABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array);\r\ntypedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length);\r\ntypedef void (GLAPIENTRY * PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC) (GLuint framebuffer, GLenum mode);\r\ntypedef void (GLAPIENTRY * PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC) (GLuint framebuffer, GLsizei n, const GLenum* bufs);\r\ntypedef void (GLAPIENTRY * PFNGLFRAMEBUFFERREADBUFFEREXTPROC) (GLuint framebuffer, GLenum mode);\r\ntypedef void (GLAPIENTRY * PFNGLGENERATEMULTITEXMIPMAPEXTPROC) (GLenum texunit, GLenum target);\r\ntypedef void (GLAPIENTRY * PFNGLGENERATETEXTUREMIPMAPEXTPROC) (GLuint texture, GLenum target);\r\ntypedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, void* img);\r\ntypedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, void* img);\r\ntypedef void (GLAPIENTRY * PFNGLGETDOUBLEINDEXEDVEXTPROC) (GLenum target, GLuint index, GLdouble* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETDOUBLEI_VEXTPROC) (GLenum pname, GLuint index, GLdouble* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETFLOATINDEXEDVEXTPROC) (GLenum target, GLuint index, GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETFLOATI_VEXTPROC) (GLenum pname, GLuint index, GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint* param);\r\ntypedef void (GLAPIENTRY * PFNGLGETMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void* pixels);\r\ntypedef void (GLAPIENTRY * PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLuint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC) (GLuint buffer, GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPOINTERVEXTPROC) (GLuint buffer, GLenum pname, void** params);\r\ntypedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void* data);\r\ntypedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum pname, void* string);\r\ntypedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMIVEXTPROC) (GLuint program, GLenum target, GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC) (GLuint renderbuffer, GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETPOINTERINDEXEDVEXTPROC) (GLenum target, GLuint index, GLvoid** params);\r\ntypedef void (GLAPIENTRY * PFNGLGETPOINTERI_VEXTPROC) (GLenum pname, GLuint index, GLvoid** params);\r\ntypedef void (GLAPIENTRY * PFNGLGETTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void* pixels);\r\ntypedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLuint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint* param);\r\ntypedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINTEGERVEXTPROC) (GLuint vaobj, GLenum pname, GLint* param);\r\ntypedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, GLvoid** param);\r\ntypedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYPOINTERVEXTPROC) (GLuint vaobj, GLenum pname, GLvoid** param);\r\ntypedef GLvoid * (GLAPIENTRY * PFNGLMAPNAMEDBUFFEREXTPROC) (GLuint buffer, GLenum access);\r\ntypedef GLvoid * (GLAPIENTRY * PFNGLMAPNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access);\r\ntypedef void (GLAPIENTRY * PFNGLMATRIXFRUSTUMEXTPROC) (GLenum matrixMode, GLdouble l, GLdouble r, GLdouble b, GLdouble t, GLdouble n, GLdouble f);\r\ntypedef void (GLAPIENTRY * PFNGLMATRIXLOADIDENTITYEXTPROC) (GLenum matrixMode);\r\ntypedef void (GLAPIENTRY * PFNGLMATRIXLOADTRANSPOSEDEXTPROC) (GLenum matrixMode, const GLdouble* m);\r\ntypedef void (GLAPIENTRY * PFNGLMATRIXLOADTRANSPOSEFEXTPROC) (GLenum matrixMode, const GLfloat* m);\r\ntypedef void (GLAPIENTRY * PFNGLMATRIXLOADDEXTPROC) (GLenum matrixMode, const GLdouble* m);\r\ntypedef void (GLAPIENTRY * PFNGLMATRIXLOADFEXTPROC) (GLenum matrixMode, const GLfloat* m);\r\ntypedef void (GLAPIENTRY * PFNGLMATRIXMULTTRANSPOSEDEXTPROC) (GLenum matrixMode, const GLdouble* m);\r\ntypedef void (GLAPIENTRY * PFNGLMATRIXMULTTRANSPOSEFEXTPROC) (GLenum matrixMode, const GLfloat* m);\r\ntypedef void (GLAPIENTRY * PFNGLMATRIXMULTDEXTPROC) (GLenum matrixMode, const GLdouble* m);\r\ntypedef void (GLAPIENTRY * PFNGLMATRIXMULTFEXTPROC) (GLenum matrixMode, const GLfloat* m);\r\ntypedef void (GLAPIENTRY * PFNGLMATRIXORTHOEXTPROC) (GLenum matrixMode, GLdouble l, GLdouble r, GLdouble b, GLdouble t, GLdouble n, GLdouble f);\r\ntypedef void (GLAPIENTRY * PFNGLMATRIXPOPEXTPROC) (GLenum matrixMode);\r\ntypedef void (GLAPIENTRY * PFNGLMATRIXPUSHEXTPROC) (GLenum matrixMode);\r\ntypedef void (GLAPIENTRY * PFNGLMATRIXROTATEDEXTPROC) (GLenum matrixMode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z);\r\ntypedef void (GLAPIENTRY * PFNGLMATRIXROTATEFEXTPROC) (GLenum matrixMode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z);\r\ntypedef void (GLAPIENTRY * PFNGLMATRIXSCALEDEXTPROC) (GLenum matrixMode, GLdouble x, GLdouble y, GLdouble z);\r\ntypedef void (GLAPIENTRY * PFNGLMATRIXSCALEFEXTPROC) (GLenum matrixMode, GLfloat x, GLfloat y, GLfloat z);\r\ntypedef void (GLAPIENTRY * PFNGLMATRIXTRANSLATEDEXTPROC) (GLenum matrixMode, GLdouble x, GLdouble y, GLdouble z);\r\ntypedef void (GLAPIENTRY * PFNGLMATRIXTRANSLATEFEXTPROC) (GLenum matrixMode, GLfloat x, GLfloat y, GLfloat z);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXBUFFEREXTPROC) (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORDPOINTEREXTPROC) (GLenum texunit, GLint size, GLenum type, GLsizei stride, const void* pointer);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXENVFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXENVIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXGENDEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble param);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLdouble* params);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXGENFEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat param);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXGENIEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint param);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void* pixels);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLuint* params);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat* param);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* param);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXRENDERBUFFEREXTPROC) (GLenum texunit, GLenum target, GLuint renderbuffer);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void* pixels);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels);\r\ntypedef void (GLAPIENTRY * PFNGLNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLsizeiptr size, const void* data, GLenum usage);\r\ntypedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data);\r\ntypedef void (GLAPIENTRY * PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);\r\ntypedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);\r\ntypedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\r\ntypedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\r\ntypedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);\r\ntypedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level);\r\ntypedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face);\r\ntypedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer);\r\ntypedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\r\ntypedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLdouble* params);\r\ntypedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\r\ntypedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC) (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w);\r\ntypedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);\r\ntypedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLuint* params);\r\ntypedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint* params);\r\ntypedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum format, GLsizei len, const void* string);\r\ntypedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height);\r\ntypedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC) (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height);\r\ntypedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\r\ntypedef void (GLAPIENTRY * PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask);\r\ntypedef void (GLAPIENTRY * PFNGLTEXTUREBUFFEREXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer);\r\ntypedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void* pixels);\r\ntypedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels);\r\ntypedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels);\r\ntypedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLuint* params);\r\ntypedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat param);\r\ntypedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLfloat* param);\r\ntypedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint param);\r\ntypedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint* param);\r\ntypedef void (GLAPIENTRY * PFNGLTEXTURERENDERBUFFEREXTPROC) (GLuint texture, GLenum target, GLuint renderbuffer);\r\ntypedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void* pixels);\r\ntypedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels);\r\ntypedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels);\r\ntypedef GLboolean (GLAPIENTRY * PFNGLUNMAPNAMEDBUFFEREXTPROC) (GLuint buffer);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXARRAYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXARRAYINDEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXARRAYNORMALOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset);\r\n\r\n#define glBindMultiTextureEXT GLEW_GET_FUN(__glewBindMultiTextureEXT)\r\n#define glCheckNamedFramebufferStatusEXT GLEW_GET_FUN(__glewCheckNamedFramebufferStatusEXT)\r\n#define glClientAttribDefaultEXT GLEW_GET_FUN(__glewClientAttribDefaultEXT)\r\n#define glCompressedMultiTexImage1DEXT GLEW_GET_FUN(__glewCompressedMultiTexImage1DEXT)\r\n#define glCompressedMultiTexImage2DEXT GLEW_GET_FUN(__glewCompressedMultiTexImage2DEXT)\r\n#define glCompressedMultiTexImage3DEXT GLEW_GET_FUN(__glewCompressedMultiTexImage3DEXT)\r\n#define glCompressedMultiTexSubImage1DEXT GLEW_GET_FUN(__glewCompressedMultiTexSubImage1DEXT)\r\n#define glCompressedMultiTexSubImage2DEXT GLEW_GET_FUN(__glewCompressedMultiTexSubImage2DEXT)\r\n#define glCompressedMultiTexSubImage3DEXT GLEW_GET_FUN(__glewCompressedMultiTexSubImage3DEXT)\r\n#define glCompressedTextureImage1DEXT GLEW_GET_FUN(__glewCompressedTextureImage1DEXT)\r\n#define glCompressedTextureImage2DEXT GLEW_GET_FUN(__glewCompressedTextureImage2DEXT)\r\n#define glCompressedTextureImage3DEXT GLEW_GET_FUN(__glewCompressedTextureImage3DEXT)\r\n#define glCompressedTextureSubImage1DEXT GLEW_GET_FUN(__glewCompressedTextureSubImage1DEXT)\r\n#define glCompressedTextureSubImage2DEXT GLEW_GET_FUN(__glewCompressedTextureSubImage2DEXT)\r\n#define glCompressedTextureSubImage3DEXT GLEW_GET_FUN(__glewCompressedTextureSubImage3DEXT)\r\n#define glCopyMultiTexImage1DEXT GLEW_GET_FUN(__glewCopyMultiTexImage1DEXT)\r\n#define glCopyMultiTexImage2DEXT GLEW_GET_FUN(__glewCopyMultiTexImage2DEXT)\r\n#define glCopyMultiTexSubImage1DEXT GLEW_GET_FUN(__glewCopyMultiTexSubImage1DEXT)\r\n#define glCopyMultiTexSubImage2DEXT GLEW_GET_FUN(__glewCopyMultiTexSubImage2DEXT)\r\n#define glCopyMultiTexSubImage3DEXT GLEW_GET_FUN(__glewCopyMultiTexSubImage3DEXT)\r\n#define glCopyTextureImage1DEXT GLEW_GET_FUN(__glewCopyTextureImage1DEXT)\r\n#define glCopyTextureImage2DEXT GLEW_GET_FUN(__glewCopyTextureImage2DEXT)\r\n#define glCopyTextureSubImage1DEXT GLEW_GET_FUN(__glewCopyTextureSubImage1DEXT)\r\n#define glCopyTextureSubImage2DEXT GLEW_GET_FUN(__glewCopyTextureSubImage2DEXT)\r\n#define glCopyTextureSubImage3DEXT GLEW_GET_FUN(__glewCopyTextureSubImage3DEXT)\r\n#define glDisableClientStateIndexedEXT GLEW_GET_FUN(__glewDisableClientStateIndexedEXT)\r\n#define glDisableClientStateiEXT GLEW_GET_FUN(__glewDisableClientStateiEXT)\r\n#define glDisableVertexArrayAttribEXT GLEW_GET_FUN(__glewDisableVertexArrayAttribEXT)\r\n#define glDisableVertexArrayEXT GLEW_GET_FUN(__glewDisableVertexArrayEXT)\r\n#define glEnableClientStateIndexedEXT GLEW_GET_FUN(__glewEnableClientStateIndexedEXT)\r\n#define glEnableClientStateiEXT GLEW_GET_FUN(__glewEnableClientStateiEXT)\r\n#define glEnableVertexArrayAttribEXT GLEW_GET_FUN(__glewEnableVertexArrayAttribEXT)\r\n#define glEnableVertexArrayEXT GLEW_GET_FUN(__glewEnableVertexArrayEXT)\r\n#define glFlushMappedNamedBufferRangeEXT GLEW_GET_FUN(__glewFlushMappedNamedBufferRangeEXT)\r\n#define glFramebufferDrawBufferEXT GLEW_GET_FUN(__glewFramebufferDrawBufferEXT)\r\n#define glFramebufferDrawBuffersEXT GLEW_GET_FUN(__glewFramebufferDrawBuffersEXT)\r\n#define glFramebufferReadBufferEXT GLEW_GET_FUN(__glewFramebufferReadBufferEXT)\r\n#define glGenerateMultiTexMipmapEXT GLEW_GET_FUN(__glewGenerateMultiTexMipmapEXT)\r\n#define glGenerateTextureMipmapEXT GLEW_GET_FUN(__glewGenerateTextureMipmapEXT)\r\n#define glGetCompressedMultiTexImageEXT GLEW_GET_FUN(__glewGetCompressedMultiTexImageEXT)\r\n#define glGetCompressedTextureImageEXT GLEW_GET_FUN(__glewGetCompressedTextureImageEXT)\r\n#define glGetDoubleIndexedvEXT GLEW_GET_FUN(__glewGetDoubleIndexedvEXT)\r\n#define glGetDoublei_vEXT GLEW_GET_FUN(__glewGetDoublei_vEXT)\r\n#define glGetFloatIndexedvEXT GLEW_GET_FUN(__glewGetFloatIndexedvEXT)\r\n#define glGetFloati_vEXT GLEW_GET_FUN(__glewGetFloati_vEXT)\r\n#define glGetFramebufferParameterivEXT GLEW_GET_FUN(__glewGetFramebufferParameterivEXT)\r\n#define glGetMultiTexEnvfvEXT GLEW_GET_FUN(__glewGetMultiTexEnvfvEXT)\r\n#define glGetMultiTexEnvivEXT GLEW_GET_FUN(__glewGetMultiTexEnvivEXT)\r\n#define glGetMultiTexGendvEXT GLEW_GET_FUN(__glewGetMultiTexGendvEXT)\r\n#define glGetMultiTexGenfvEXT GLEW_GET_FUN(__glewGetMultiTexGenfvEXT)\r\n#define glGetMultiTexGenivEXT GLEW_GET_FUN(__glewGetMultiTexGenivEXT)\r\n#define glGetMultiTexImageEXT GLEW_GET_FUN(__glewGetMultiTexImageEXT)\r\n#define glGetMultiTexLevelParameterfvEXT GLEW_GET_FUN(__glewGetMultiTexLevelParameterfvEXT)\r\n#define glGetMultiTexLevelParameterivEXT GLEW_GET_FUN(__glewGetMultiTexLevelParameterivEXT)\r\n#define glGetMultiTexParameterIivEXT GLEW_GET_FUN(__glewGetMultiTexParameterIivEXT)\r\n#define glGetMultiTexParameterIuivEXT GLEW_GET_FUN(__glewGetMultiTexParameterIuivEXT)\r\n#define glGetMultiTexParameterfvEXT GLEW_GET_FUN(__glewGetMultiTexParameterfvEXT)\r\n#define glGetMultiTexParameterivEXT GLEW_GET_FUN(__glewGetMultiTexParameterivEXT)\r\n#define glGetNamedBufferParameterivEXT GLEW_GET_FUN(__glewGetNamedBufferParameterivEXT)\r\n#define glGetNamedBufferPointervEXT GLEW_GET_FUN(__glewGetNamedBufferPointervEXT)\r\n#define glGetNamedBufferSubDataEXT GLEW_GET_FUN(__glewGetNamedBufferSubDataEXT)\r\n#define glGetNamedFramebufferAttachmentParameterivEXT GLEW_GET_FUN(__glewGetNamedFramebufferAttachmentParameterivEXT)\r\n#define glGetNamedProgramLocalParameterIivEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterIivEXT)\r\n#define glGetNamedProgramLocalParameterIuivEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterIuivEXT)\r\n#define glGetNamedProgramLocalParameterdvEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterdvEXT)\r\n#define glGetNamedProgramLocalParameterfvEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterfvEXT)\r\n#define glGetNamedProgramStringEXT GLEW_GET_FUN(__glewGetNamedProgramStringEXT)\r\n#define glGetNamedProgramivEXT GLEW_GET_FUN(__glewGetNamedProgramivEXT)\r\n#define glGetNamedRenderbufferParameterivEXT GLEW_GET_FUN(__glewGetNamedRenderbufferParameterivEXT)\r\n#define glGetPointerIndexedvEXT GLEW_GET_FUN(__glewGetPointerIndexedvEXT)\r\n#define glGetPointeri_vEXT GLEW_GET_FUN(__glewGetPointeri_vEXT)\r\n#define glGetTextureImageEXT GLEW_GET_FUN(__glewGetTextureImageEXT)\r\n#define glGetTextureLevelParameterfvEXT GLEW_GET_FUN(__glewGetTextureLevelParameterfvEXT)\r\n#define glGetTextureLevelParameterivEXT GLEW_GET_FUN(__glewGetTextureLevelParameterivEXT)\r\n#define glGetTextureParameterIivEXT GLEW_GET_FUN(__glewGetTextureParameterIivEXT)\r\n#define glGetTextureParameterIuivEXT GLEW_GET_FUN(__glewGetTextureParameterIuivEXT)\r\n#define glGetTextureParameterfvEXT GLEW_GET_FUN(__glewGetTextureParameterfvEXT)\r\n#define glGetTextureParameterivEXT GLEW_GET_FUN(__glewGetTextureParameterivEXT)\r\n#define glGetVertexArrayIntegeri_vEXT GLEW_GET_FUN(__glewGetVertexArrayIntegeri_vEXT)\r\n#define glGetVertexArrayIntegervEXT GLEW_GET_FUN(__glewGetVertexArrayIntegervEXT)\r\n#define glGetVertexArrayPointeri_vEXT GLEW_GET_FUN(__glewGetVertexArrayPointeri_vEXT)\r\n#define glGetVertexArrayPointervEXT GLEW_GET_FUN(__glewGetVertexArrayPointervEXT)\r\n#define glMapNamedBufferEXT GLEW_GET_FUN(__glewMapNamedBufferEXT)\r\n#define glMapNamedBufferRangeEXT GLEW_GET_FUN(__glewMapNamedBufferRangeEXT)\r\n#define glMatrixFrustumEXT GLEW_GET_FUN(__glewMatrixFrustumEXT)\r\n#define glMatrixLoadIdentityEXT GLEW_GET_FUN(__glewMatrixLoadIdentityEXT)\r\n#define glMatrixLoadTransposedEXT GLEW_GET_FUN(__glewMatrixLoadTransposedEXT)\r\n#define glMatrixLoadTransposefEXT GLEW_GET_FUN(__glewMatrixLoadTransposefEXT)\r\n#define glMatrixLoaddEXT GLEW_GET_FUN(__glewMatrixLoaddEXT)\r\n#define glMatrixLoadfEXT GLEW_GET_FUN(__glewMatrixLoadfEXT)\r\n#define glMatrixMultTransposedEXT GLEW_GET_FUN(__glewMatrixMultTransposedEXT)\r\n#define glMatrixMultTransposefEXT GLEW_GET_FUN(__glewMatrixMultTransposefEXT)\r\n#define glMatrixMultdEXT GLEW_GET_FUN(__glewMatrixMultdEXT)\r\n#define glMatrixMultfEXT GLEW_GET_FUN(__glewMatrixMultfEXT)\r\n#define glMatrixOrthoEXT GLEW_GET_FUN(__glewMatrixOrthoEXT)\r\n#define glMatrixPopEXT GLEW_GET_FUN(__glewMatrixPopEXT)\r\n#define glMatrixPushEXT GLEW_GET_FUN(__glewMatrixPushEXT)\r\n#define glMatrixRotatedEXT GLEW_GET_FUN(__glewMatrixRotatedEXT)\r\n#define glMatrixRotatefEXT GLEW_GET_FUN(__glewMatrixRotatefEXT)\r\n#define glMatrixScaledEXT GLEW_GET_FUN(__glewMatrixScaledEXT)\r\n#define glMatrixScalefEXT GLEW_GET_FUN(__glewMatrixScalefEXT)\r\n#define glMatrixTranslatedEXT GLEW_GET_FUN(__glewMatrixTranslatedEXT)\r\n#define glMatrixTranslatefEXT GLEW_GET_FUN(__glewMatrixTranslatefEXT)\r\n#define glMultiTexBufferEXT GLEW_GET_FUN(__glewMultiTexBufferEXT)\r\n#define glMultiTexCoordPointerEXT GLEW_GET_FUN(__glewMultiTexCoordPointerEXT)\r\n#define glMultiTexEnvfEXT GLEW_GET_FUN(__glewMultiTexEnvfEXT)\r\n#define glMultiTexEnvfvEXT GLEW_GET_FUN(__glewMultiTexEnvfvEXT)\r\n#define glMultiTexEnviEXT GLEW_GET_FUN(__glewMultiTexEnviEXT)\r\n#define glMultiTexEnvivEXT GLEW_GET_FUN(__glewMultiTexEnvivEXT)\r\n#define glMultiTexGendEXT GLEW_GET_FUN(__glewMultiTexGendEXT)\r\n#define glMultiTexGendvEXT GLEW_GET_FUN(__glewMultiTexGendvEXT)\r\n#define glMultiTexGenfEXT GLEW_GET_FUN(__glewMultiTexGenfEXT)\r\n#define glMultiTexGenfvEXT GLEW_GET_FUN(__glewMultiTexGenfvEXT)\r\n#define glMultiTexGeniEXT GLEW_GET_FUN(__glewMultiTexGeniEXT)\r\n#define glMultiTexGenivEXT GLEW_GET_FUN(__glewMultiTexGenivEXT)\r\n#define glMultiTexImage1DEXT GLEW_GET_FUN(__glewMultiTexImage1DEXT)\r\n#define glMultiTexImage2DEXT GLEW_GET_FUN(__glewMultiTexImage2DEXT)\r\n#define glMultiTexImage3DEXT GLEW_GET_FUN(__glewMultiTexImage3DEXT)\r\n#define glMultiTexParameterIivEXT GLEW_GET_FUN(__glewMultiTexParameterIivEXT)\r\n#define glMultiTexParameterIuivEXT GLEW_GET_FUN(__glewMultiTexParameterIuivEXT)\r\n#define glMultiTexParameterfEXT GLEW_GET_FUN(__glewMultiTexParameterfEXT)\r\n#define glMultiTexParameterfvEXT GLEW_GET_FUN(__glewMultiTexParameterfvEXT)\r\n#define glMultiTexParameteriEXT GLEW_GET_FUN(__glewMultiTexParameteriEXT)\r\n#define glMultiTexParameterivEXT GLEW_GET_FUN(__glewMultiTexParameterivEXT)\r\n#define glMultiTexRenderbufferEXT GLEW_GET_FUN(__glewMultiTexRenderbufferEXT)\r\n#define glMultiTexSubImage1DEXT GLEW_GET_FUN(__glewMultiTexSubImage1DEXT)\r\n#define glMultiTexSubImage2DEXT GLEW_GET_FUN(__glewMultiTexSubImage2DEXT)\r\n#define glMultiTexSubImage3DEXT GLEW_GET_FUN(__glewMultiTexSubImage3DEXT)\r\n#define glNamedBufferDataEXT GLEW_GET_FUN(__glewNamedBufferDataEXT)\r\n#define glNamedBufferSubDataEXT GLEW_GET_FUN(__glewNamedBufferSubDataEXT)\r\n#define glNamedCopyBufferSubDataEXT GLEW_GET_FUN(__glewNamedCopyBufferSubDataEXT)\r\n#define glNamedFramebufferRenderbufferEXT GLEW_GET_FUN(__glewNamedFramebufferRenderbufferEXT)\r\n#define glNamedFramebufferTexture1DEXT GLEW_GET_FUN(__glewNamedFramebufferTexture1DEXT)\r\n#define glNamedFramebufferTexture2DEXT GLEW_GET_FUN(__glewNamedFramebufferTexture2DEXT)\r\n#define glNamedFramebufferTexture3DEXT GLEW_GET_FUN(__glewNamedFramebufferTexture3DEXT)\r\n#define glNamedFramebufferTextureEXT GLEW_GET_FUN(__glewNamedFramebufferTextureEXT)\r\n#define glNamedFramebufferTextureFaceEXT GLEW_GET_FUN(__glewNamedFramebufferTextureFaceEXT)\r\n#define glNamedFramebufferTextureLayerEXT GLEW_GET_FUN(__glewNamedFramebufferTextureLayerEXT)\r\n#define glNamedProgramLocalParameter4dEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4dEXT)\r\n#define glNamedProgramLocalParameter4dvEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4dvEXT)\r\n#define glNamedProgramLocalParameter4fEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4fEXT)\r\n#define glNamedProgramLocalParameter4fvEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4fvEXT)\r\n#define glNamedProgramLocalParameterI4iEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4iEXT)\r\n#define glNamedProgramLocalParameterI4ivEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4ivEXT)\r\n#define glNamedProgramLocalParameterI4uiEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4uiEXT)\r\n#define glNamedProgramLocalParameterI4uivEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4uivEXT)\r\n#define glNamedProgramLocalParameters4fvEXT GLEW_GET_FUN(__glewNamedProgramLocalParameters4fvEXT)\r\n#define glNamedProgramLocalParametersI4ivEXT GLEW_GET_FUN(__glewNamedProgramLocalParametersI4ivEXT)\r\n#define glNamedProgramLocalParametersI4uivEXT GLEW_GET_FUN(__glewNamedProgramLocalParametersI4uivEXT)\r\n#define glNamedProgramStringEXT GLEW_GET_FUN(__glewNamedProgramStringEXT)\r\n#define glNamedRenderbufferStorageEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageEXT)\r\n#define glNamedRenderbufferStorageMultisampleCoverageEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageMultisampleCoverageEXT)\r\n#define glNamedRenderbufferStorageMultisampleEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageMultisampleEXT)\r\n#define glProgramUniform1fEXT GLEW_GET_FUN(__glewProgramUniform1fEXT)\r\n#define glProgramUniform1fvEXT GLEW_GET_FUN(__glewProgramUniform1fvEXT)\r\n#define glProgramUniform1iEXT GLEW_GET_FUN(__glewProgramUniform1iEXT)\r\n#define glProgramUniform1ivEXT GLEW_GET_FUN(__glewProgramUniform1ivEXT)\r\n#define glProgramUniform1uiEXT GLEW_GET_FUN(__glewProgramUniform1uiEXT)\r\n#define glProgramUniform1uivEXT GLEW_GET_FUN(__glewProgramUniform1uivEXT)\r\n#define glProgramUniform2fEXT GLEW_GET_FUN(__glewProgramUniform2fEXT)\r\n#define glProgramUniform2fvEXT GLEW_GET_FUN(__glewProgramUniform2fvEXT)\r\n#define glProgramUniform2iEXT GLEW_GET_FUN(__glewProgramUniform2iEXT)\r\n#define glProgramUniform2ivEXT GLEW_GET_FUN(__glewProgramUniform2ivEXT)\r\n#define glProgramUniform2uiEXT GLEW_GET_FUN(__glewProgramUniform2uiEXT)\r\n#define glProgramUniform2uivEXT GLEW_GET_FUN(__glewProgramUniform2uivEXT)\r\n#define glProgramUniform3fEXT GLEW_GET_FUN(__glewProgramUniform3fEXT)\r\n#define glProgramUniform3fvEXT GLEW_GET_FUN(__glewProgramUniform3fvEXT)\r\n#define glProgramUniform3iEXT GLEW_GET_FUN(__glewProgramUniform3iEXT)\r\n#define glProgramUniform3ivEXT GLEW_GET_FUN(__glewProgramUniform3ivEXT)\r\n#define glProgramUniform3uiEXT GLEW_GET_FUN(__glewProgramUniform3uiEXT)\r\n#define glProgramUniform3uivEXT GLEW_GET_FUN(__glewProgramUniform3uivEXT)\r\n#define glProgramUniform4fEXT GLEW_GET_FUN(__glewProgramUniform4fEXT)\r\n#define glProgramUniform4fvEXT GLEW_GET_FUN(__glewProgramUniform4fvEXT)\r\n#define glProgramUniform4iEXT GLEW_GET_FUN(__glewProgramUniform4iEXT)\r\n#define glProgramUniform4ivEXT GLEW_GET_FUN(__glewProgramUniform4ivEXT)\r\n#define glProgramUniform4uiEXT GLEW_GET_FUN(__glewProgramUniform4uiEXT)\r\n#define glProgramUniform4uivEXT GLEW_GET_FUN(__glewProgramUniform4uivEXT)\r\n#define glProgramUniformMatrix2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2fvEXT)\r\n#define glProgramUniformMatrix2x3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x3fvEXT)\r\n#define glProgramUniformMatrix2x4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x4fvEXT)\r\n#define glProgramUniformMatrix3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3fvEXT)\r\n#define glProgramUniformMatrix3x2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x2fvEXT)\r\n#define glProgramUniformMatrix3x4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x4fvEXT)\r\n#define glProgramUniformMatrix4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4fvEXT)\r\n#define glProgramUniformMatrix4x2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x2fvEXT)\r\n#define glProgramUniformMatrix4x3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x3fvEXT)\r\n#define glPushClientAttribDefaultEXT GLEW_GET_FUN(__glewPushClientAttribDefaultEXT)\r\n#define glTextureBufferEXT GLEW_GET_FUN(__glewTextureBufferEXT)\r\n#define glTextureImage1DEXT GLEW_GET_FUN(__glewTextureImage1DEXT)\r\n#define glTextureImage2DEXT GLEW_GET_FUN(__glewTextureImage2DEXT)\r\n#define glTextureImage3DEXT GLEW_GET_FUN(__glewTextureImage3DEXT)\r\n#define glTextureParameterIivEXT GLEW_GET_FUN(__glewTextureParameterIivEXT)\r\n#define glTextureParameterIuivEXT GLEW_GET_FUN(__glewTextureParameterIuivEXT)\r\n#define glTextureParameterfEXT GLEW_GET_FUN(__glewTextureParameterfEXT)\r\n#define glTextureParameterfvEXT GLEW_GET_FUN(__glewTextureParameterfvEXT)\r\n#define glTextureParameteriEXT GLEW_GET_FUN(__glewTextureParameteriEXT)\r\n#define glTextureParameterivEXT GLEW_GET_FUN(__glewTextureParameterivEXT)\r\n#define glTextureRenderbufferEXT GLEW_GET_FUN(__glewTextureRenderbufferEXT)\r\n#define glTextureSubImage1DEXT GLEW_GET_FUN(__glewTextureSubImage1DEXT)\r\n#define glTextureSubImage2DEXT GLEW_GET_FUN(__glewTextureSubImage2DEXT)\r\n#define glTextureSubImage3DEXT GLEW_GET_FUN(__glewTextureSubImage3DEXT)\r\n#define glUnmapNamedBufferEXT GLEW_GET_FUN(__glewUnmapNamedBufferEXT)\r\n#define glVertexArrayColorOffsetEXT GLEW_GET_FUN(__glewVertexArrayColorOffsetEXT)\r\n#define glVertexArrayEdgeFlagOffsetEXT GLEW_GET_FUN(__glewVertexArrayEdgeFlagOffsetEXT)\r\n#define glVertexArrayFogCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayFogCoordOffsetEXT)\r\n#define glVertexArrayIndexOffsetEXT GLEW_GET_FUN(__glewVertexArrayIndexOffsetEXT)\r\n#define glVertexArrayMultiTexCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayMultiTexCoordOffsetEXT)\r\n#define glVertexArrayNormalOffsetEXT GLEW_GET_FUN(__glewVertexArrayNormalOffsetEXT)\r\n#define glVertexArraySecondaryColorOffsetEXT GLEW_GET_FUN(__glewVertexArraySecondaryColorOffsetEXT)\r\n#define glVertexArrayTexCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayTexCoordOffsetEXT)\r\n#define glVertexArrayVertexAttribIOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribIOffsetEXT)\r\n#define glVertexArrayVertexAttribOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribOffsetEXT)\r\n#define glVertexArrayVertexOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexOffsetEXT)\r\n\r\n#define GLEW_EXT_direct_state_access GLEW_GET_VAR(__GLEW_EXT_direct_state_access)\r\n\r\n#endif /* GL_EXT_direct_state_access */\r\n\r\n/* -------------------------- GL_EXT_draw_buffers2 ------------------------- */\r\n\r\n#ifndef GL_EXT_draw_buffers2\r\n#define GL_EXT_draw_buffers2 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLCOLORMASKINDEXEDEXTPROC) (GLuint buf, GLboolean r, GLboolean g, GLboolean b, GLboolean a);\r\ntypedef void (GLAPIENTRY * PFNGLDISABLEINDEXEDEXTPROC) (GLenum target, GLuint index);\r\ntypedef void (GLAPIENTRY * PFNGLENABLEINDEXEDEXTPROC) (GLenum target, GLuint index);\r\ntypedef void (GLAPIENTRY * PFNGLGETBOOLEANINDEXEDVEXTPROC) (GLenum value, GLuint index, GLboolean* data);\r\ntypedef void (GLAPIENTRY * PFNGLGETINTEGERINDEXEDVEXTPROC) (GLenum value, GLuint index, GLint* data);\r\ntypedef GLboolean (GLAPIENTRY * PFNGLISENABLEDINDEXEDEXTPROC) (GLenum target, GLuint index);\r\n\r\n#define glColorMaskIndexedEXT GLEW_GET_FUN(__glewColorMaskIndexedEXT)\r\n#define glDisableIndexedEXT GLEW_GET_FUN(__glewDisableIndexedEXT)\r\n#define glEnableIndexedEXT GLEW_GET_FUN(__glewEnableIndexedEXT)\r\n#define glGetBooleanIndexedvEXT GLEW_GET_FUN(__glewGetBooleanIndexedvEXT)\r\n#define glGetIntegerIndexedvEXT GLEW_GET_FUN(__glewGetIntegerIndexedvEXT)\r\n#define glIsEnabledIndexedEXT GLEW_GET_FUN(__glewIsEnabledIndexedEXT)\r\n\r\n#define GLEW_EXT_draw_buffers2 GLEW_GET_VAR(__GLEW_EXT_draw_buffers2)\r\n\r\n#endif /* GL_EXT_draw_buffers2 */\r\n\r\n/* ------------------------- GL_EXT_draw_instanced ------------------------- */\r\n\r\n#ifndef GL_EXT_draw_instanced\r\n#define GL_EXT_draw_instanced 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount);\r\ntypedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount);\r\n\r\n#define glDrawArraysInstancedEXT GLEW_GET_FUN(__glewDrawArraysInstancedEXT)\r\n#define glDrawElementsInstancedEXT GLEW_GET_FUN(__glewDrawElementsInstancedEXT)\r\n\r\n#define GLEW_EXT_draw_instanced GLEW_GET_VAR(__GLEW_EXT_draw_instanced)\r\n\r\n#endif /* GL_EXT_draw_instanced */\r\n\r\n/* ----------------------- GL_EXT_draw_range_elements ---------------------- */\r\n\r\n#ifndef GL_EXT_draw_range_elements\r\n#define GL_EXT_draw_range_elements 1\r\n\r\n#define GL_MAX_ELEMENTS_VERTICES 0x80E8\r\n#define GL_MAX_ELEMENTS_INDICES 0x80E9\r\n\r\ntypedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);\r\n\r\n#define glDrawRangeElementsEXT GLEW_GET_FUN(__glewDrawRangeElementsEXT)\r\n\r\n#define GLEW_EXT_draw_range_elements GLEW_GET_VAR(__GLEW_EXT_draw_range_elements)\r\n\r\n#endif /* GL_EXT_draw_range_elements */\r\n\r\n/* ---------------------------- GL_EXT_fog_coord --------------------------- */\r\n\r\n#ifndef GL_EXT_fog_coord\r\n#define GL_EXT_fog_coord 1\r\n\r\n#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450\r\n#define GL_FOG_COORDINATE_EXT 0x8451\r\n#define GL_FRAGMENT_DEPTH_EXT 0x8452\r\n#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453\r\n#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454\r\n#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455\r\n#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456\r\n#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457\r\n\r\ntypedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer);\r\ntypedef void (GLAPIENTRY * PFNGLFOGCOORDDEXTPROC) (GLdouble coord);\r\ntypedef void (GLAPIENTRY * PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord);\r\ntypedef void (GLAPIENTRY * PFNGLFOGCOORDFEXTPROC) (GLfloat coord);\r\ntypedef void (GLAPIENTRY * PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord);\r\n\r\n#define glFogCoordPointerEXT GLEW_GET_FUN(__glewFogCoordPointerEXT)\r\n#define glFogCoorddEXT GLEW_GET_FUN(__glewFogCoorddEXT)\r\n#define glFogCoorddvEXT GLEW_GET_FUN(__glewFogCoorddvEXT)\r\n#define glFogCoordfEXT GLEW_GET_FUN(__glewFogCoordfEXT)\r\n#define glFogCoordfvEXT GLEW_GET_FUN(__glewFogCoordfvEXT)\r\n\r\n#define GLEW_EXT_fog_coord GLEW_GET_VAR(__GLEW_EXT_fog_coord)\r\n\r\n#endif /* GL_EXT_fog_coord */\r\n\r\n/* ------------------------ GL_EXT_fragment_lighting ----------------------- */\r\n\r\n#ifndef GL_EXT_fragment_lighting\r\n#define GL_EXT_fragment_lighting 1\r\n\r\n#define GL_FRAGMENT_LIGHTING_EXT 0x8400\r\n#define GL_FRAGMENT_COLOR_MATERIAL_EXT 0x8401\r\n#define GL_FRAGMENT_COLOR_MATERIAL_FACE_EXT 0x8402\r\n#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_EXT 0x8403\r\n#define GL_MAX_FRAGMENT_LIGHTS_EXT 0x8404\r\n#define GL_MAX_ACTIVE_LIGHTS_EXT 0x8405\r\n#define GL_CURRENT_RASTER_NORMAL_EXT 0x8406\r\n#define GL_LIGHT_ENV_MODE_EXT 0x8407\r\n#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_EXT 0x8408\r\n#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_EXT 0x8409\r\n#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_EXT 0x840A\r\n#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_EXT 0x840B\r\n#define GL_FRAGMENT_LIGHT0_EXT 0x840C\r\n#define GL_FRAGMENT_LIGHT7_EXT 0x8413\r\n\r\ntypedef void (GLAPIENTRY * PFNGLFRAGMENTCOLORMATERIALEXTPROC) (GLenum face, GLenum mode);\r\ntypedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFEXTPROC) (GLenum pname, GLfloat param);\r\ntypedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFVEXTPROC) (GLenum pname, GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIEXTPROC) (GLenum pname, GLint param);\r\ntypedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIVEXTPROC) (GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFEXTPROC) (GLenum light, GLenum pname, GLfloat param);\r\ntypedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIEXTPROC) (GLenum light, GLenum pname, GLint param);\r\ntypedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFEXTPROC) (GLenum face, GLenum pname, const GLfloat param);\r\ntypedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIEXTPROC) (GLenum face, GLenum pname, const GLint param);\r\ntypedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLLIGHTENVIEXTPROC) (GLenum pname, GLint param);\r\n\r\n#define glFragmentColorMaterialEXT GLEW_GET_FUN(__glewFragmentColorMaterialEXT)\r\n#define glFragmentLightModelfEXT GLEW_GET_FUN(__glewFragmentLightModelfEXT)\r\n#define glFragmentLightModelfvEXT GLEW_GET_FUN(__glewFragmentLightModelfvEXT)\r\n#define glFragmentLightModeliEXT GLEW_GET_FUN(__glewFragmentLightModeliEXT)\r\n#define glFragmentLightModelivEXT GLEW_GET_FUN(__glewFragmentLightModelivEXT)\r\n#define glFragmentLightfEXT GLEW_GET_FUN(__glewFragmentLightfEXT)\r\n#define glFragmentLightfvEXT GLEW_GET_FUN(__glewFragmentLightfvEXT)\r\n#define glFragmentLightiEXT GLEW_GET_FUN(__glewFragmentLightiEXT)\r\n#define glFragmentLightivEXT GLEW_GET_FUN(__glewFragmentLightivEXT)\r\n#define glFragmentMaterialfEXT GLEW_GET_FUN(__glewFragmentMaterialfEXT)\r\n#define glFragmentMaterialfvEXT GLEW_GET_FUN(__glewFragmentMaterialfvEXT)\r\n#define glFragmentMaterialiEXT GLEW_GET_FUN(__glewFragmentMaterialiEXT)\r\n#define glFragmentMaterialivEXT GLEW_GET_FUN(__glewFragmentMaterialivEXT)\r\n#define glGetFragmentLightfvEXT GLEW_GET_FUN(__glewGetFragmentLightfvEXT)\r\n#define glGetFragmentLightivEXT GLEW_GET_FUN(__glewGetFragmentLightivEXT)\r\n#define glGetFragmentMaterialfvEXT GLEW_GET_FUN(__glewGetFragmentMaterialfvEXT)\r\n#define glGetFragmentMaterialivEXT GLEW_GET_FUN(__glewGetFragmentMaterialivEXT)\r\n#define glLightEnviEXT GLEW_GET_FUN(__glewLightEnviEXT)\r\n\r\n#define GLEW_EXT_fragment_lighting GLEW_GET_VAR(__GLEW_EXT_fragment_lighting)\r\n\r\n#endif /* GL_EXT_fragment_lighting */\r\n\r\n/* ------------------------ GL_EXT_framebuffer_blit ------------------------ */\r\n\r\n#ifndef GL_EXT_framebuffer_blit\r\n#define GL_EXT_framebuffer_blit 1\r\n\r\n#define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6\r\n#define GL_READ_FRAMEBUFFER_EXT 0x8CA8\r\n#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9\r\n#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA\r\n\r\ntypedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);\r\n\r\n#define glBlitFramebufferEXT GLEW_GET_FUN(__glewBlitFramebufferEXT)\r\n\r\n#define GLEW_EXT_framebuffer_blit GLEW_GET_VAR(__GLEW_EXT_framebuffer_blit)\r\n\r\n#endif /* GL_EXT_framebuffer_blit */\r\n\r\n/* --------------------- GL_EXT_framebuffer_multisample -------------------- */\r\n\r\n#ifndef GL_EXT_framebuffer_multisample\r\n#define GL_EXT_framebuffer_multisample 1\r\n\r\n#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB\r\n#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56\r\n#define GL_MAX_SAMPLES_EXT 0x8D57\r\n\r\ntypedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);\r\n\r\n#define glRenderbufferStorageMultisampleEXT GLEW_GET_FUN(__glewRenderbufferStorageMultisampleEXT)\r\n\r\n#define GLEW_EXT_framebuffer_multisample GLEW_GET_VAR(__GLEW_EXT_framebuffer_multisample)\r\n\r\n#endif /* GL_EXT_framebuffer_multisample */\r\n\r\n/* ----------------------- GL_EXT_framebuffer_object ----------------------- */\r\n\r\n#ifndef GL_EXT_framebuffer_object\r\n#define GL_EXT_framebuffer_object 1\r\n\r\n#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506\r\n#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8\r\n#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6\r\n#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7\r\n#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0\r\n#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1\r\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2\r\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3\r\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4\r\n#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5\r\n#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6\r\n#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7\r\n#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9\r\n#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA\r\n#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB\r\n#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC\r\n#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD\r\n#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF\r\n#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0\r\n#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1\r\n#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2\r\n#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3\r\n#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4\r\n#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5\r\n#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6\r\n#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7\r\n#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8\r\n#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9\r\n#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA\r\n#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB\r\n#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC\r\n#define GL_COLOR_ATTACHMENT13_EXT 0x8CED\r\n#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE\r\n#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF\r\n#define GL_DEPTH_ATTACHMENT_EXT 0x8D00\r\n#define GL_STENCIL_ATTACHMENT_EXT 0x8D20\r\n#define GL_FRAMEBUFFER_EXT 0x8D40\r\n#define GL_RENDERBUFFER_EXT 0x8D41\r\n#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42\r\n#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43\r\n#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44\r\n#define GL_STENCIL_INDEX1_EXT 0x8D46\r\n#define GL_STENCIL_INDEX4_EXT 0x8D47\r\n#define GL_STENCIL_INDEX8_EXT 0x8D48\r\n#define GL_STENCIL_INDEX16_EXT 0x8D49\r\n#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50\r\n#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51\r\n#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52\r\n#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53\r\n#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54\r\n#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55\r\n\r\ntypedef void (GLAPIENTRY * PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer);\r\ntypedef void (GLAPIENTRY * PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer);\r\ntypedef GLenum (GLAPIENTRY * PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target);\r\ntypedef void (GLAPIENTRY * PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint* framebuffers);\r\ntypedef void (GLAPIENTRY * PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint* renderbuffers);\r\ntypedef void (GLAPIENTRY * PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);\r\ntypedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\r\ntypedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\r\ntypedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);\r\ntypedef void (GLAPIENTRY * PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint* framebuffers);\r\ntypedef void (GLAPIENTRY * PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint* renderbuffers);\r\ntypedef void (GLAPIENTRY * PFNGLGENERATEMIPMAPEXTPROC) (GLenum target);\r\ntypedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params);\r\ntypedef GLboolean (GLAPIENTRY * PFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer);\r\ntypedef GLboolean (GLAPIENTRY * PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer);\r\ntypedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);\r\n\r\n#define glBindFramebufferEXT GLEW_GET_FUN(__glewBindFramebufferEXT)\r\n#define glBindRenderbufferEXT GLEW_GET_FUN(__glewBindRenderbufferEXT)\r\n#define glCheckFramebufferStatusEXT GLEW_GET_FUN(__glewCheckFramebufferStatusEXT)\r\n#define glDeleteFramebuffersEXT GLEW_GET_FUN(__glewDeleteFramebuffersEXT)\r\n#define glDeleteRenderbuffersEXT GLEW_GET_FUN(__glewDeleteRenderbuffersEXT)\r\n#define glFramebufferRenderbufferEXT GLEW_GET_FUN(__glewFramebufferRenderbufferEXT)\r\n#define glFramebufferTexture1DEXT GLEW_GET_FUN(__glewFramebufferTexture1DEXT)\r\n#define glFramebufferTexture2DEXT GLEW_GET_FUN(__glewFramebufferTexture2DEXT)\r\n#define glFramebufferTexture3DEXT GLEW_GET_FUN(__glewFramebufferTexture3DEXT)\r\n#define glGenFramebuffersEXT GLEW_GET_FUN(__glewGenFramebuffersEXT)\r\n#define glGenRenderbuffersEXT GLEW_GET_FUN(__glewGenRenderbuffersEXT)\r\n#define glGenerateMipmapEXT GLEW_GET_FUN(__glewGenerateMipmapEXT)\r\n#define glGetFramebufferAttachmentParameterivEXT GLEW_GET_FUN(__glewGetFramebufferAttachmentParameterivEXT)\r\n#define glGetRenderbufferParameterivEXT GLEW_GET_FUN(__glewGetRenderbufferParameterivEXT)\r\n#define glIsFramebufferEXT GLEW_GET_FUN(__glewIsFramebufferEXT)\r\n#define glIsRenderbufferEXT GLEW_GET_FUN(__glewIsRenderbufferEXT)\r\n#define glRenderbufferStorageEXT GLEW_GET_FUN(__glewRenderbufferStorageEXT)\r\n\r\n#define GLEW_EXT_framebuffer_object GLEW_GET_VAR(__GLEW_EXT_framebuffer_object)\r\n\r\n#endif /* GL_EXT_framebuffer_object */\r\n\r\n/* ------------------------ GL_EXT_framebuffer_sRGB ------------------------ */\r\n\r\n#ifndef GL_EXT_framebuffer_sRGB\r\n#define GL_EXT_framebuffer_sRGB 1\r\n\r\n#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9\r\n#define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA\r\n\r\n#define GLEW_EXT_framebuffer_sRGB GLEW_GET_VAR(__GLEW_EXT_framebuffer_sRGB)\r\n\r\n#endif /* GL_EXT_framebuffer_sRGB */\r\n\r\n/* ------------------------ GL_EXT_geometry_shader4 ------------------------ */\r\n\r\n#ifndef GL_EXT_geometry_shader4\r\n#define GL_EXT_geometry_shader4 1\r\n\r\n#define GL_LINES_ADJACENCY_EXT 0xA\r\n#define GL_LINE_STRIP_ADJACENCY_EXT 0xB\r\n#define GL_TRIANGLES_ADJACENCY_EXT 0xC\r\n#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0xD\r\n#define GL_PROGRAM_POINT_SIZE_EXT 0x8642\r\n#define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B\r\n#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29\r\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4\r\n#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7\r\n#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8\r\n#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9\r\n#define GL_GEOMETRY_SHADER_EXT 0x8DD9\r\n#define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA\r\n#define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB\r\n#define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC\r\n#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD\r\n#define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE\r\n#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF\r\n#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0\r\n#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level);\r\ntypedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face);\r\ntypedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value);\r\n\r\n#define glFramebufferTextureEXT GLEW_GET_FUN(__glewFramebufferTextureEXT)\r\n#define glFramebufferTextureFaceEXT GLEW_GET_FUN(__glewFramebufferTextureFaceEXT)\r\n#define glFramebufferTextureLayerEXT GLEW_GET_FUN(__glewFramebufferTextureLayerEXT)\r\n#define glProgramParameteriEXT GLEW_GET_FUN(__glewProgramParameteriEXT)\r\n\r\n#define GLEW_EXT_geometry_shader4 GLEW_GET_VAR(__GLEW_EXT_geometry_shader4)\r\n\r\n#endif /* GL_EXT_geometry_shader4 */\r\n\r\n/* --------------------- GL_EXT_gpu_program_parameters --------------------- */\r\n\r\n#ifndef GL_EXT_gpu_program_parameters\r\n#define GL_EXT_gpu_program_parameters 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat* params);\r\n\r\n#define glProgramEnvParameters4fvEXT GLEW_GET_FUN(__glewProgramEnvParameters4fvEXT)\r\n#define glProgramLocalParameters4fvEXT GLEW_GET_FUN(__glewProgramLocalParameters4fvEXT)\r\n\r\n#define GLEW_EXT_gpu_program_parameters GLEW_GET_VAR(__GLEW_EXT_gpu_program_parameters)\r\n\r\n#endif /* GL_EXT_gpu_program_parameters */\r\n\r\n/* --------------------------- GL_EXT_gpu_shader4 -------------------------- */\r\n\r\n#ifndef GL_EXT_gpu_shader4\r\n#define GL_EXT_gpu_shader4 1\r\n\r\n#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT 0x88FD\r\n#define GL_SAMPLER_1D_ARRAY_EXT 0x8DC0\r\n#define GL_SAMPLER_2D_ARRAY_EXT 0x8DC1\r\n#define GL_SAMPLER_BUFFER_EXT 0x8DC2\r\n#define GL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8DC3\r\n#define GL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8DC4\r\n#define GL_SAMPLER_CUBE_SHADOW_EXT 0x8DC5\r\n#define GL_UNSIGNED_INT_VEC2_EXT 0x8DC6\r\n#define GL_UNSIGNED_INT_VEC3_EXT 0x8DC7\r\n#define GL_UNSIGNED_INT_VEC4_EXT 0x8DC8\r\n#define GL_INT_SAMPLER_1D_EXT 0x8DC9\r\n#define GL_INT_SAMPLER_2D_EXT 0x8DCA\r\n#define GL_INT_SAMPLER_3D_EXT 0x8DCB\r\n#define GL_INT_SAMPLER_CUBE_EXT 0x8DCC\r\n#define GL_INT_SAMPLER_2D_RECT_EXT 0x8DCD\r\n#define GL_INT_SAMPLER_1D_ARRAY_EXT 0x8DCE\r\n#define GL_INT_SAMPLER_2D_ARRAY_EXT 0x8DCF\r\n#define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0\r\n#define GL_UNSIGNED_INT_SAMPLER_1D_EXT 0x8DD1\r\n#define GL_UNSIGNED_INT_SAMPLER_2D_EXT 0x8DD2\r\n#define GL_UNSIGNED_INT_SAMPLER_3D_EXT 0x8DD3\r\n#define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT 0x8DD4\r\n#define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8DD5\r\n#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8DD6\r\n#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8DD7\r\n#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8\r\n\r\ntypedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name);\r\ntypedef GLint (GLAPIENTRY * PFNGLGETFRAGDATALOCATIONEXTPROC) (GLuint program, const GLchar *name);\r\ntypedef void (GLAPIENTRY * PFNGLGETUNIFORMUIVEXTPROC) (GLuint program, GLint location, GLuint *params);\r\ntypedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIIVEXTPROC) (GLuint index, GLenum pname, GLint *params);\r\ntypedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIUIVEXTPROC) (GLuint index, GLenum pname, GLuint *params);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM1UIEXTPROC) (GLint location, GLuint v0);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM1UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM2UIEXTPROC) (GLint location, GLuint v0, GLuint v1);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM2UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM3UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM3UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM4UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORM4UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IEXTPROC) (GLuint index, GLint x);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IVEXTPROC) (GLuint index, const GLint *v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIEXTPROC) (GLuint index, GLuint x);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIVEXTPROC) (GLuint index, const GLuint *v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IEXTPROC) (GLuint index, GLint x, GLint y);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IVEXTPROC) (GLuint index, const GLint *v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIEXTPROC) (GLuint index, GLuint x, GLuint y);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIVEXTPROC) (GLuint index, const GLuint *v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IEXTPROC) (GLuint index, GLint x, GLint y, GLint z);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IVEXTPROC) (GLuint index, const GLint *v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIVEXTPROC) (GLuint index, const GLuint *v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4BVEXTPROC) (GLuint index, const GLbyte *v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IEXTPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IVEXTPROC) (GLuint index, const GLint *v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4SVEXTPROC) (GLuint index, const GLshort *v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UBVEXTPROC) (GLuint index, const GLubyte *v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIVEXTPROC) (GLuint index, const GLuint *v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4USVEXTPROC) (GLuint index, const GLushort *v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);\r\n\r\n#define glBindFragDataLocationEXT GLEW_GET_FUN(__glewBindFragDataLocationEXT)\r\n#define glGetFragDataLocationEXT GLEW_GET_FUN(__glewGetFragDataLocationEXT)\r\n#define glGetUniformuivEXT GLEW_GET_FUN(__glewGetUniformuivEXT)\r\n#define glGetVertexAttribIivEXT GLEW_GET_FUN(__glewGetVertexAttribIivEXT)\r\n#define glGetVertexAttribIuivEXT GLEW_GET_FUN(__glewGetVertexAttribIuivEXT)\r\n#define glUniform1uiEXT GLEW_GET_FUN(__glewUniform1uiEXT)\r\n#define glUniform1uivEXT GLEW_GET_FUN(__glewUniform1uivEXT)\r\n#define glUniform2uiEXT GLEW_GET_FUN(__glewUniform2uiEXT)\r\n#define glUniform2uivEXT GLEW_GET_FUN(__glewUniform2uivEXT)\r\n#define glUniform3uiEXT GLEW_GET_FUN(__glewUniform3uiEXT)\r\n#define glUniform3uivEXT GLEW_GET_FUN(__glewUniform3uivEXT)\r\n#define glUniform4uiEXT GLEW_GET_FUN(__glewUniform4uiEXT)\r\n#define glUniform4uivEXT GLEW_GET_FUN(__glewUniform4uivEXT)\r\n#define glVertexAttribI1iEXT GLEW_GET_FUN(__glewVertexAttribI1iEXT)\r\n#define glVertexAttribI1ivEXT GLEW_GET_FUN(__glewVertexAttribI1ivEXT)\r\n#define glVertexAttribI1uiEXT GLEW_GET_FUN(__glewVertexAttribI1uiEXT)\r\n#define glVertexAttribI1uivEXT GLEW_GET_FUN(__glewVertexAttribI1uivEXT)\r\n#define glVertexAttribI2iEXT GLEW_GET_FUN(__glewVertexAttribI2iEXT)\r\n#define glVertexAttribI2ivEXT GLEW_GET_FUN(__glewVertexAttribI2ivEXT)\r\n#define glVertexAttribI2uiEXT GLEW_GET_FUN(__glewVertexAttribI2uiEXT)\r\n#define glVertexAttribI2uivEXT GLEW_GET_FUN(__glewVertexAttribI2uivEXT)\r\n#define glVertexAttribI3iEXT GLEW_GET_FUN(__glewVertexAttribI3iEXT)\r\n#define glVertexAttribI3ivEXT GLEW_GET_FUN(__glewVertexAttribI3ivEXT)\r\n#define glVertexAttribI3uiEXT GLEW_GET_FUN(__glewVertexAttribI3uiEXT)\r\n#define glVertexAttribI3uivEXT GLEW_GET_FUN(__glewVertexAttribI3uivEXT)\r\n#define glVertexAttribI4bvEXT GLEW_GET_FUN(__glewVertexAttribI4bvEXT)\r\n#define glVertexAttribI4iEXT GLEW_GET_FUN(__glewVertexAttribI4iEXT)\r\n#define glVertexAttribI4ivEXT GLEW_GET_FUN(__glewVertexAttribI4ivEXT)\r\n#define glVertexAttribI4svEXT GLEW_GET_FUN(__glewVertexAttribI4svEXT)\r\n#define glVertexAttribI4ubvEXT GLEW_GET_FUN(__glewVertexAttribI4ubvEXT)\r\n#define glVertexAttribI4uiEXT GLEW_GET_FUN(__glewVertexAttribI4uiEXT)\r\n#define glVertexAttribI4uivEXT GLEW_GET_FUN(__glewVertexAttribI4uivEXT)\r\n#define glVertexAttribI4usvEXT GLEW_GET_FUN(__glewVertexAttribI4usvEXT)\r\n#define glVertexAttribIPointerEXT GLEW_GET_FUN(__glewVertexAttribIPointerEXT)\r\n\r\n#define GLEW_EXT_gpu_shader4 GLEW_GET_VAR(__GLEW_EXT_gpu_shader4)\r\n\r\n#endif /* GL_EXT_gpu_shader4 */\r\n\r\n/* ---------------------------- GL_EXT_histogram --------------------------- */\r\n\r\n#ifndef GL_EXT_histogram\r\n#define GL_EXT_histogram 1\r\n\r\n#define GL_HISTOGRAM_EXT 0x8024\r\n#define GL_PROXY_HISTOGRAM_EXT 0x8025\r\n#define GL_HISTOGRAM_WIDTH_EXT 0x8026\r\n#define GL_HISTOGRAM_FORMAT_EXT 0x8027\r\n#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028\r\n#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029\r\n#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A\r\n#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B\r\n#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C\r\n#define GL_HISTOGRAM_SINK_EXT 0x802D\r\n#define GL_MINMAX_EXT 0x802E\r\n#define GL_MINMAX_FORMAT_EXT 0x802F\r\n#define GL_MINMAX_SINK_EXT 0x8030\r\n\r\ntypedef void (GLAPIENTRY * PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void* values);\r\ntypedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void* values);\r\ntypedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);\r\ntypedef void (GLAPIENTRY * PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink);\r\ntypedef void (GLAPIENTRY * PFNGLRESETHISTOGRAMEXTPROC) (GLenum target);\r\ntypedef void (GLAPIENTRY * PFNGLRESETMINMAXEXTPROC) (GLenum target);\r\n\r\n#define glGetHistogramEXT GLEW_GET_FUN(__glewGetHistogramEXT)\r\n#define glGetHistogramParameterfvEXT GLEW_GET_FUN(__glewGetHistogramParameterfvEXT)\r\n#define glGetHistogramParameterivEXT GLEW_GET_FUN(__glewGetHistogramParameterivEXT)\r\n#define glGetMinmaxEXT GLEW_GET_FUN(__glewGetMinmaxEXT)\r\n#define glGetMinmaxParameterfvEXT GLEW_GET_FUN(__glewGetMinmaxParameterfvEXT)\r\n#define glGetMinmaxParameterivEXT GLEW_GET_FUN(__glewGetMinmaxParameterivEXT)\r\n#define glHistogramEXT GLEW_GET_FUN(__glewHistogramEXT)\r\n#define glMinmaxEXT GLEW_GET_FUN(__glewMinmaxEXT)\r\n#define glResetHistogramEXT GLEW_GET_FUN(__glewResetHistogramEXT)\r\n#define glResetMinmaxEXT GLEW_GET_FUN(__glewResetMinmaxEXT)\r\n\r\n#define GLEW_EXT_histogram GLEW_GET_VAR(__GLEW_EXT_histogram)\r\n\r\n#endif /* GL_EXT_histogram */\r\n\r\n/* ----------------------- GL_EXT_index_array_formats ---------------------- */\r\n\r\n#ifndef GL_EXT_index_array_formats\r\n#define GL_EXT_index_array_formats 1\r\n\r\n#define GLEW_EXT_index_array_formats GLEW_GET_VAR(__GLEW_EXT_index_array_formats)\r\n\r\n#endif /* GL_EXT_index_array_formats */\r\n\r\n/* --------------------------- GL_EXT_index_func --------------------------- */\r\n\r\n#ifndef GL_EXT_index_func\r\n#define GL_EXT_index_func 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLINDEXFUNCEXTPROC) (GLenum func, GLfloat ref);\r\n\r\n#define glIndexFuncEXT GLEW_GET_FUN(__glewIndexFuncEXT)\r\n\r\n#define GLEW_EXT_index_func GLEW_GET_VAR(__GLEW_EXT_index_func)\r\n\r\n#endif /* GL_EXT_index_func */\r\n\r\n/* ------------------------- GL_EXT_index_material ------------------------- */\r\n\r\n#ifndef GL_EXT_index_material\r\n#define GL_EXT_index_material 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode);\r\n\r\n#define glIndexMaterialEXT GLEW_GET_FUN(__glewIndexMaterialEXT)\r\n\r\n#define GLEW_EXT_index_material GLEW_GET_VAR(__GLEW_EXT_index_material)\r\n\r\n#endif /* GL_EXT_index_material */\r\n\r\n/* -------------------------- GL_EXT_index_texture ------------------------- */\r\n\r\n#ifndef GL_EXT_index_texture\r\n#define GL_EXT_index_texture 1\r\n\r\n#define GLEW_EXT_index_texture GLEW_GET_VAR(__GLEW_EXT_index_texture)\r\n\r\n#endif /* GL_EXT_index_texture */\r\n\r\n/* -------------------------- GL_EXT_light_texture ------------------------- */\r\n\r\n#ifndef GL_EXT_light_texture\r\n#define GL_EXT_light_texture 1\r\n\r\n#define GL_FRAGMENT_MATERIAL_EXT 0x8349\r\n#define GL_FRAGMENT_NORMAL_EXT 0x834A\r\n#define GL_FRAGMENT_COLOR_EXT 0x834C\r\n#define GL_ATTENUATION_EXT 0x834D\r\n#define GL_SHADOW_ATTENUATION_EXT 0x834E\r\n#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F\r\n#define GL_TEXTURE_LIGHT_EXT 0x8350\r\n#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351\r\n#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352\r\n#define GL_FRAGMENT_DEPTH_EXT 0x8452\r\n\r\ntypedef void (GLAPIENTRY * PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode);\r\ntypedef void (GLAPIENTRY * PFNGLTEXTURELIGHTEXTPROC) (GLenum pname);\r\ntypedef void (GLAPIENTRY * PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode);\r\n\r\n#define glApplyTextureEXT GLEW_GET_FUN(__glewApplyTextureEXT)\r\n#define glTextureLightEXT GLEW_GET_FUN(__glewTextureLightEXT)\r\n#define glTextureMaterialEXT GLEW_GET_FUN(__glewTextureMaterialEXT)\r\n\r\n#define GLEW_EXT_light_texture GLEW_GET_VAR(__GLEW_EXT_light_texture)\r\n\r\n#endif /* GL_EXT_light_texture */\r\n\r\n/* ------------------------- GL_EXT_misc_attribute ------------------------- */\r\n\r\n#ifndef GL_EXT_misc_attribute\r\n#define GL_EXT_misc_attribute 1\r\n\r\n#define GLEW_EXT_misc_attribute GLEW_GET_VAR(__GLEW_EXT_misc_attribute)\r\n\r\n#endif /* GL_EXT_misc_attribute */\r\n\r\n/* ------------------------ GL_EXT_multi_draw_arrays ----------------------- */\r\n\r\n#ifndef GL_EXT_multi_draw_arrays\r\n#define GL_EXT_multi_draw_arrays 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, GLint* first, GLsizei *count, GLsizei primcount);\r\ntypedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, GLsizei* count, GLenum type, const GLvoid **indices, GLsizei primcount);\r\n\r\n#define glMultiDrawArraysEXT GLEW_GET_FUN(__glewMultiDrawArraysEXT)\r\n#define glMultiDrawElementsEXT GLEW_GET_FUN(__glewMultiDrawElementsEXT)\r\n\r\n#define GLEW_EXT_multi_draw_arrays GLEW_GET_VAR(__GLEW_EXT_multi_draw_arrays)\r\n\r\n#endif /* GL_EXT_multi_draw_arrays */\r\n\r\n/* --------------------------- GL_EXT_multisample -------------------------- */\r\n\r\n#ifndef GL_EXT_multisample\r\n#define GL_EXT_multisample 1\r\n\r\n#define GL_MULTISAMPLE_EXT 0x809D\r\n#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E\r\n#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F\r\n#define GL_SAMPLE_MASK_EXT 0x80A0\r\n#define GL_1PASS_EXT 0x80A1\r\n#define GL_2PASS_0_EXT 0x80A2\r\n#define GL_2PASS_1_EXT 0x80A3\r\n#define GL_4PASS_0_EXT 0x80A4\r\n#define GL_4PASS_1_EXT 0x80A5\r\n#define GL_4PASS_2_EXT 0x80A6\r\n#define GL_4PASS_3_EXT 0x80A7\r\n#define GL_SAMPLE_BUFFERS_EXT 0x80A8\r\n#define GL_SAMPLES_EXT 0x80A9\r\n#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA\r\n#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB\r\n#define GL_SAMPLE_PATTERN_EXT 0x80AC\r\n#define GL_MULTISAMPLE_BIT_EXT 0x20000000\r\n\r\ntypedef void (GLAPIENTRY * PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert);\r\ntypedef void (GLAPIENTRY * PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern);\r\n\r\n#define glSampleMaskEXT GLEW_GET_FUN(__glewSampleMaskEXT)\r\n#define glSamplePatternEXT GLEW_GET_FUN(__glewSamplePatternEXT)\r\n\r\n#define GLEW_EXT_multisample GLEW_GET_VAR(__GLEW_EXT_multisample)\r\n\r\n#endif /* GL_EXT_multisample */\r\n\r\n/* ---------------------- GL_EXT_packed_depth_stencil ---------------------- */\r\n\r\n#ifndef GL_EXT_packed_depth_stencil\r\n#define GL_EXT_packed_depth_stencil 1\r\n\r\n#define GL_DEPTH_STENCIL_EXT 0x84F9\r\n#define GL_UNSIGNED_INT_24_8_EXT 0x84FA\r\n#define GL_DEPTH24_STENCIL8_EXT 0x88F0\r\n#define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1\r\n\r\n#define GLEW_EXT_packed_depth_stencil GLEW_GET_VAR(__GLEW_EXT_packed_depth_stencil)\r\n\r\n#endif /* GL_EXT_packed_depth_stencil */\r\n\r\n/* -------------------------- GL_EXT_packed_float -------------------------- */\r\n\r\n#ifndef GL_EXT_packed_float\r\n#define GL_EXT_packed_float 1\r\n\r\n#define GL_R11F_G11F_B10F_EXT 0x8C3A\r\n#define GL_UNSIGNED_INT_10F_11F_11F_REV_EXT 0x8C3B\r\n#define GL_RGBA_SIGNED_COMPONENTS_EXT 0x8C3C\r\n\r\n#define GLEW_EXT_packed_float GLEW_GET_VAR(__GLEW_EXT_packed_float)\r\n\r\n#endif /* GL_EXT_packed_float */\r\n\r\n/* -------------------------- GL_EXT_packed_pixels ------------------------- */\r\n\r\n#ifndef GL_EXT_packed_pixels\r\n#define GL_EXT_packed_pixels 1\r\n\r\n#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032\r\n#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033\r\n#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034\r\n#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035\r\n#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036\r\n\r\n#define GLEW_EXT_packed_pixels GLEW_GET_VAR(__GLEW_EXT_packed_pixels)\r\n\r\n#endif /* GL_EXT_packed_pixels */\r\n\r\n/* ------------------------ GL_EXT_paletted_texture ------------------------ */\r\n\r\n#ifndef GL_EXT_paletted_texture\r\n#define GL_EXT_paletted_texture 1\r\n\r\n#define GL_TEXTURE_1D 0x0DE0\r\n#define GL_TEXTURE_2D 0x0DE1\r\n#define GL_PROXY_TEXTURE_1D 0x8063\r\n#define GL_PROXY_TEXTURE_2D 0x8064\r\n#define GL_TEXTURE_3D_EXT 0x806F\r\n#define GL_PROXY_TEXTURE_3D_EXT 0x8070\r\n#define GL_COLOR_TABLE_FORMAT_EXT 0x80D8\r\n#define GL_COLOR_TABLE_WIDTH_EXT 0x80D9\r\n#define GL_COLOR_TABLE_RED_SIZE_EXT 0x80DA\r\n#define GL_COLOR_TABLE_GREEN_SIZE_EXT 0x80DB\r\n#define GL_COLOR_TABLE_BLUE_SIZE_EXT 0x80DC\r\n#define GL_COLOR_TABLE_ALPHA_SIZE_EXT 0x80DD\r\n#define GL_COLOR_TABLE_LUMINANCE_SIZE_EXT 0x80DE\r\n#define GL_COLOR_TABLE_INTENSITY_SIZE_EXT 0x80DF\r\n#define GL_COLOR_INDEX1_EXT 0x80E2\r\n#define GL_COLOR_INDEX2_EXT 0x80E3\r\n#define GL_COLOR_INDEX4_EXT 0x80E4\r\n#define GL_COLOR_INDEX8_EXT 0x80E5\r\n#define GL_COLOR_INDEX12_EXT 0x80E6\r\n#define GL_COLOR_INDEX16_EXT 0x80E7\r\n#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED\r\n#define GL_TEXTURE_CUBE_MAP_ARB 0x8513\r\n#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B\r\n\r\ntypedef void (GLAPIENTRY * PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void* data);\r\ntypedef void (GLAPIENTRY * PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, void* data);\r\ntypedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params);\r\n\r\n#define glColorTableEXT GLEW_GET_FUN(__glewColorTableEXT)\r\n#define glGetColorTableEXT GLEW_GET_FUN(__glewGetColorTableEXT)\r\n#define glGetColorTableParameterfvEXT GLEW_GET_FUN(__glewGetColorTableParameterfvEXT)\r\n#define glGetColorTableParameterivEXT GLEW_GET_FUN(__glewGetColorTableParameterivEXT)\r\n\r\n#define GLEW_EXT_paletted_texture GLEW_GET_VAR(__GLEW_EXT_paletted_texture)\r\n\r\n#endif /* GL_EXT_paletted_texture */\r\n\r\n/* ----------------------- GL_EXT_pixel_buffer_object ---------------------- */\r\n\r\n#ifndef GL_EXT_pixel_buffer_object\r\n#define GL_EXT_pixel_buffer_object 1\r\n\r\n#define GL_PIXEL_PACK_BUFFER_EXT 0x88EB\r\n#define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC\r\n#define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED\r\n#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF\r\n\r\n#define GLEW_EXT_pixel_buffer_object GLEW_GET_VAR(__GLEW_EXT_pixel_buffer_object)\r\n\r\n#endif /* GL_EXT_pixel_buffer_object */\r\n\r\n/* ------------------------- GL_EXT_pixel_transform ------------------------ */\r\n\r\n#ifndef GL_EXT_pixel_transform\r\n#define GL_EXT_pixel_transform 1\r\n\r\n#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330\r\n#define GL_PIXEL_MAG_FILTER_EXT 0x8331\r\n#define GL_PIXEL_MIN_FILTER_EXT 0x8332\r\n#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333\r\n#define GL_CUBIC_EXT 0x8334\r\n#define GL_AVERAGE_EXT 0x8335\r\n#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336\r\n#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337\r\n#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338\r\n\r\ntypedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, const GLfloat param);\r\ntypedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, const GLint param);\r\ntypedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params);\r\n\r\n#define glGetPixelTransformParameterfvEXT GLEW_GET_FUN(__glewGetPixelTransformParameterfvEXT)\r\n#define glGetPixelTransformParameterivEXT GLEW_GET_FUN(__glewGetPixelTransformParameterivEXT)\r\n#define glPixelTransformParameterfEXT GLEW_GET_FUN(__glewPixelTransformParameterfEXT)\r\n#define glPixelTransformParameterfvEXT GLEW_GET_FUN(__glewPixelTransformParameterfvEXT)\r\n#define glPixelTransformParameteriEXT GLEW_GET_FUN(__glewPixelTransformParameteriEXT)\r\n#define glPixelTransformParameterivEXT GLEW_GET_FUN(__glewPixelTransformParameterivEXT)\r\n\r\n#define GLEW_EXT_pixel_transform GLEW_GET_VAR(__GLEW_EXT_pixel_transform)\r\n\r\n#endif /* GL_EXT_pixel_transform */\r\n\r\n/* ------------------- GL_EXT_pixel_transform_color_table ------------------ */\r\n\r\n#ifndef GL_EXT_pixel_transform_color_table\r\n#define GL_EXT_pixel_transform_color_table 1\r\n\r\n#define GLEW_EXT_pixel_transform_color_table GLEW_GET_VAR(__GLEW_EXT_pixel_transform_color_table)\r\n\r\n#endif /* GL_EXT_pixel_transform_color_table */\r\n\r\n/* ------------------------ GL_EXT_point_parameters ------------------------ */\r\n\r\n#ifndef GL_EXT_point_parameters\r\n#define GL_EXT_point_parameters 1\r\n\r\n#define GL_POINT_SIZE_MIN_EXT 0x8126\r\n#define GL_POINT_SIZE_MAX_EXT 0x8127\r\n#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128\r\n#define GL_DISTANCE_ATTENUATION_EXT 0x8129\r\n\r\ntypedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param);\r\ntypedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, GLfloat* params);\r\n\r\n#define glPointParameterfEXT GLEW_GET_FUN(__glewPointParameterfEXT)\r\n#define glPointParameterfvEXT GLEW_GET_FUN(__glewPointParameterfvEXT)\r\n\r\n#define GLEW_EXT_point_parameters GLEW_GET_VAR(__GLEW_EXT_point_parameters)\r\n\r\n#endif /* GL_EXT_point_parameters */\r\n\r\n/* ------------------------- GL_EXT_polygon_offset ------------------------- */\r\n\r\n#ifndef GL_EXT_polygon_offset\r\n#define GL_EXT_polygon_offset 1\r\n\r\n#define GL_POLYGON_OFFSET_EXT 0x8037\r\n#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038\r\n#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039\r\n\r\ntypedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias);\r\n\r\n#define glPolygonOffsetEXT GLEW_GET_FUN(__glewPolygonOffsetEXT)\r\n\r\n#define GLEW_EXT_polygon_offset GLEW_GET_VAR(__GLEW_EXT_polygon_offset)\r\n\r\n#endif /* GL_EXT_polygon_offset */\r\n\r\n/* ------------------------ GL_EXT_provoking_vertex ------------------------ */\r\n\r\n#ifndef GL_EXT_provoking_vertex\r\n#define GL_EXT_provoking_vertex 1\r\n\r\n#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT 0x8E4C\r\n#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D\r\n#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E\r\n#define GL_PROVOKING_VERTEX_EXT 0x8E4F\r\n\r\ntypedef void (GLAPIENTRY * PFNGLPROVOKINGVERTEXEXTPROC) (GLenum mode);\r\n\r\n#define glProvokingVertexEXT GLEW_GET_FUN(__glewProvokingVertexEXT)\r\n\r\n#define GLEW_EXT_provoking_vertex GLEW_GET_VAR(__GLEW_EXT_provoking_vertex)\r\n\r\n#endif /* GL_EXT_provoking_vertex */\r\n\r\n/* ------------------------- GL_EXT_rescale_normal ------------------------- */\r\n\r\n#ifndef GL_EXT_rescale_normal\r\n#define GL_EXT_rescale_normal 1\r\n\r\n#define GL_RESCALE_NORMAL_EXT 0x803A\r\n\r\n#define GLEW_EXT_rescale_normal GLEW_GET_VAR(__GLEW_EXT_rescale_normal)\r\n\r\n#endif /* GL_EXT_rescale_normal */\r\n\r\n/* -------------------------- GL_EXT_scene_marker -------------------------- */\r\n\r\n#ifndef GL_EXT_scene_marker\r\n#define GL_EXT_scene_marker 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLBEGINSCENEEXTPROC) (void);\r\ntypedef void (GLAPIENTRY * PFNGLENDSCENEEXTPROC) (void);\r\n\r\n#define glBeginSceneEXT GLEW_GET_FUN(__glewBeginSceneEXT)\r\n#define glEndSceneEXT GLEW_GET_FUN(__glewEndSceneEXT)\r\n\r\n#define GLEW_EXT_scene_marker GLEW_GET_VAR(__GLEW_EXT_scene_marker)\r\n\r\n#endif /* GL_EXT_scene_marker */\r\n\r\n/* ------------------------- GL_EXT_secondary_color ------------------------ */\r\n\r\n#ifndef GL_EXT_secondary_color\r\n#define GL_EXT_secondary_color 1\r\n\r\n#define GL_COLOR_SUM_EXT 0x8458\r\n#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459\r\n#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A\r\n#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B\r\n#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C\r\n#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D\r\n#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E\r\n\r\ntypedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue);\r\ntypedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v);\r\ntypedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue);\r\ntypedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v);\r\ntypedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue);\r\ntypedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v);\r\ntypedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue);\r\ntypedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v);\r\ntypedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue);\r\ntypedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v);\r\ntypedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue);\r\ntypedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v);\r\ntypedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue);\r\ntypedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v);\r\ntypedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue);\r\ntypedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v);\r\ntypedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer);\r\n\r\n#define glSecondaryColor3bEXT GLEW_GET_FUN(__glewSecondaryColor3bEXT)\r\n#define glSecondaryColor3bvEXT GLEW_GET_FUN(__glewSecondaryColor3bvEXT)\r\n#define glSecondaryColor3dEXT GLEW_GET_FUN(__glewSecondaryColor3dEXT)\r\n#define glSecondaryColor3dvEXT GLEW_GET_FUN(__glewSecondaryColor3dvEXT)\r\n#define glSecondaryColor3fEXT GLEW_GET_FUN(__glewSecondaryColor3fEXT)\r\n#define glSecondaryColor3fvEXT GLEW_GET_FUN(__glewSecondaryColor3fvEXT)\r\n#define glSecondaryColor3iEXT GLEW_GET_FUN(__glewSecondaryColor3iEXT)\r\n#define glSecondaryColor3ivEXT GLEW_GET_FUN(__glewSecondaryColor3ivEXT)\r\n#define glSecondaryColor3sEXT GLEW_GET_FUN(__glewSecondaryColor3sEXT)\r\n#define glSecondaryColor3svEXT GLEW_GET_FUN(__glewSecondaryColor3svEXT)\r\n#define glSecondaryColor3ubEXT GLEW_GET_FUN(__glewSecondaryColor3ubEXT)\r\n#define glSecondaryColor3ubvEXT GLEW_GET_FUN(__glewSecondaryColor3ubvEXT)\r\n#define glSecondaryColor3uiEXT GLEW_GET_FUN(__glewSecondaryColor3uiEXT)\r\n#define glSecondaryColor3uivEXT GLEW_GET_FUN(__glewSecondaryColor3uivEXT)\r\n#define glSecondaryColor3usEXT GLEW_GET_FUN(__glewSecondaryColor3usEXT)\r\n#define glSecondaryColor3usvEXT GLEW_GET_FUN(__glewSecondaryColor3usvEXT)\r\n#define glSecondaryColorPointerEXT GLEW_GET_FUN(__glewSecondaryColorPointerEXT)\r\n\r\n#define GLEW_EXT_secondary_color GLEW_GET_VAR(__GLEW_EXT_secondary_color)\r\n\r\n#endif /* GL_EXT_secondary_color */\r\n\r\n/* --------------------- GL_EXT_separate_shader_objects -------------------- */\r\n\r\n#ifndef GL_EXT_separate_shader_objects\r\n#define GL_EXT_separate_shader_objects 1\r\n\r\n#define GL_ACTIVE_PROGRAM_EXT 0x8B8D\r\n\r\ntypedef void (GLAPIENTRY * PFNGLACTIVEPROGRAMEXTPROC) (GLuint program);\r\ntypedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROGRAMEXTPROC) (GLenum type, const char* string);\r\ntypedef void (GLAPIENTRY * PFNGLUSESHADERPROGRAMEXTPROC) (GLenum type, GLuint program);\r\n\r\n#define glActiveProgramEXT GLEW_GET_FUN(__glewActiveProgramEXT)\r\n#define glCreateShaderProgramEXT GLEW_GET_FUN(__glewCreateShaderProgramEXT)\r\n#define glUseShaderProgramEXT GLEW_GET_FUN(__glewUseShaderProgramEXT)\r\n\r\n#define GLEW_EXT_separate_shader_objects GLEW_GET_VAR(__GLEW_EXT_separate_shader_objects)\r\n\r\n#endif /* GL_EXT_separate_shader_objects */\r\n\r\n/* --------------------- GL_EXT_separate_specular_color -------------------- */\r\n\r\n#ifndef GL_EXT_separate_specular_color\r\n#define GL_EXT_separate_specular_color 1\r\n\r\n#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8\r\n#define GL_SINGLE_COLOR_EXT 0x81F9\r\n#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA\r\n\r\n#define GLEW_EXT_separate_specular_color GLEW_GET_VAR(__GLEW_EXT_separate_specular_color)\r\n\r\n#endif /* GL_EXT_separate_specular_color */\r\n\r\n/* -------------------------- GL_EXT_shadow_funcs -------------------------- */\r\n\r\n#ifndef GL_EXT_shadow_funcs\r\n#define GL_EXT_shadow_funcs 1\r\n\r\n#define GLEW_EXT_shadow_funcs GLEW_GET_VAR(__GLEW_EXT_shadow_funcs)\r\n\r\n#endif /* GL_EXT_shadow_funcs */\r\n\r\n/* --------------------- GL_EXT_shared_texture_palette --------------------- */\r\n\r\n#ifndef GL_EXT_shared_texture_palette\r\n#define GL_EXT_shared_texture_palette 1\r\n\r\n#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB\r\n\r\n#define GLEW_EXT_shared_texture_palette GLEW_GET_VAR(__GLEW_EXT_shared_texture_palette)\r\n\r\n#endif /* GL_EXT_shared_texture_palette */\r\n\r\n/* ------------------------ GL_EXT_stencil_clear_tag ----------------------- */\r\n\r\n#ifndef GL_EXT_stencil_clear_tag\r\n#define GL_EXT_stencil_clear_tag 1\r\n\r\n#define GL_STENCIL_TAG_BITS_EXT 0x88F2\r\n#define GL_STENCIL_CLEAR_TAG_VALUE_EXT 0x88F3\r\n\r\n#define GLEW_EXT_stencil_clear_tag GLEW_GET_VAR(__GLEW_EXT_stencil_clear_tag)\r\n\r\n#endif /* GL_EXT_stencil_clear_tag */\r\n\r\n/* ------------------------ GL_EXT_stencil_two_side ------------------------ */\r\n\r\n#ifndef GL_EXT_stencil_two_side\r\n#define GL_EXT_stencil_two_side 1\r\n\r\n#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910\r\n#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911\r\n\r\ntypedef void (GLAPIENTRY * PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face);\r\n\r\n#define glActiveStencilFaceEXT GLEW_GET_FUN(__glewActiveStencilFaceEXT)\r\n\r\n#define GLEW_EXT_stencil_two_side GLEW_GET_VAR(__GLEW_EXT_stencil_two_side)\r\n\r\n#endif /* GL_EXT_stencil_two_side */\r\n\r\n/* -------------------------- GL_EXT_stencil_wrap -------------------------- */\r\n\r\n#ifndef GL_EXT_stencil_wrap\r\n#define GL_EXT_stencil_wrap 1\r\n\r\n#define GL_INCR_WRAP_EXT 0x8507\r\n#define GL_DECR_WRAP_EXT 0x8508\r\n\r\n#define GLEW_EXT_stencil_wrap GLEW_GET_VAR(__GLEW_EXT_stencil_wrap)\r\n\r\n#endif /* GL_EXT_stencil_wrap */\r\n\r\n/* --------------------------- GL_EXT_subtexture --------------------------- */\r\n\r\n#ifndef GL_EXT_subtexture\r\n#define GL_EXT_subtexture 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void* pixels);\r\ntypedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels);\r\ntypedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels);\r\n\r\n#define glTexSubImage1DEXT GLEW_GET_FUN(__glewTexSubImage1DEXT)\r\n#define glTexSubImage2DEXT GLEW_GET_FUN(__glewTexSubImage2DEXT)\r\n#define glTexSubImage3DEXT GLEW_GET_FUN(__glewTexSubImage3DEXT)\r\n\r\n#define GLEW_EXT_subtexture GLEW_GET_VAR(__GLEW_EXT_subtexture)\r\n\r\n#endif /* GL_EXT_subtexture */\r\n\r\n/* ----------------------------- GL_EXT_texture ---------------------------- */\r\n\r\n#ifndef GL_EXT_texture\r\n#define GL_EXT_texture 1\r\n\r\n#define GL_ALPHA4_EXT 0x803B\r\n#define GL_ALPHA8_EXT 0x803C\r\n#define GL_ALPHA12_EXT 0x803D\r\n#define GL_ALPHA16_EXT 0x803E\r\n#define GL_LUMINANCE4_EXT 0x803F\r\n#define GL_LUMINANCE8_EXT 0x8040\r\n#define GL_LUMINANCE12_EXT 0x8041\r\n#define GL_LUMINANCE16_EXT 0x8042\r\n#define GL_LUMINANCE4_ALPHA4_EXT 0x8043\r\n#define GL_LUMINANCE6_ALPHA2_EXT 0x8044\r\n#define GL_LUMINANCE8_ALPHA8_EXT 0x8045\r\n#define GL_LUMINANCE12_ALPHA4_EXT 0x8046\r\n#define GL_LUMINANCE12_ALPHA12_EXT 0x8047\r\n#define GL_LUMINANCE16_ALPHA16_EXT 0x8048\r\n#define GL_INTENSITY_EXT 0x8049\r\n#define GL_INTENSITY4_EXT 0x804A\r\n#define GL_INTENSITY8_EXT 0x804B\r\n#define GL_INTENSITY12_EXT 0x804C\r\n#define GL_INTENSITY16_EXT 0x804D\r\n#define GL_RGB2_EXT 0x804E\r\n#define GL_RGB4_EXT 0x804F\r\n#define GL_RGB5_EXT 0x8050\r\n#define GL_RGB8_EXT 0x8051\r\n#define GL_RGB10_EXT 0x8052\r\n#define GL_RGB12_EXT 0x8053\r\n#define GL_RGB16_EXT 0x8054\r\n#define GL_RGBA2_EXT 0x8055\r\n#define GL_RGBA4_EXT 0x8056\r\n#define GL_RGB5_A1_EXT 0x8057\r\n#define GL_RGBA8_EXT 0x8058\r\n#define GL_RGB10_A2_EXT 0x8059\r\n#define GL_RGBA12_EXT 0x805A\r\n#define GL_RGBA16_EXT 0x805B\r\n#define GL_TEXTURE_RED_SIZE_EXT 0x805C\r\n#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D\r\n#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E\r\n#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F\r\n#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060\r\n#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061\r\n#define GL_REPLACE_EXT 0x8062\r\n#define GL_PROXY_TEXTURE_1D_EXT 0x8063\r\n#define GL_PROXY_TEXTURE_2D_EXT 0x8064\r\n\r\n#define GLEW_EXT_texture GLEW_GET_VAR(__GLEW_EXT_texture)\r\n\r\n#endif /* GL_EXT_texture */\r\n\r\n/* ---------------------------- GL_EXT_texture3D --------------------------- */\r\n\r\n#ifndef GL_EXT_texture3D\r\n#define GL_EXT_texture3D 1\r\n\r\n#define GL_PACK_SKIP_IMAGES_EXT 0x806B\r\n#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C\r\n#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D\r\n#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E\r\n#define GL_TEXTURE_3D_EXT 0x806F\r\n#define GL_PROXY_TEXTURE_3D_EXT 0x8070\r\n#define GL_TEXTURE_DEPTH_EXT 0x8071\r\n#define GL_TEXTURE_WRAP_R_EXT 0x8072\r\n#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073\r\n\r\ntypedef void (GLAPIENTRY * PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels);\r\n\r\n#define glTexImage3DEXT GLEW_GET_FUN(__glewTexImage3DEXT)\r\n\r\n#define GLEW_EXT_texture3D GLEW_GET_VAR(__GLEW_EXT_texture3D)\r\n\r\n#endif /* GL_EXT_texture3D */\r\n\r\n/* -------------------------- GL_EXT_texture_array ------------------------- */\r\n\r\n#ifndef GL_EXT_texture_array\r\n#define GL_EXT_texture_array 1\r\n\r\n#define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E\r\n#define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF\r\n#define GL_TEXTURE_1D_ARRAY_EXT 0x8C18\r\n#define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19\r\n#define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A\r\n#define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B\r\n#define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C\r\n#define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D\r\n\r\n#define GLEW_EXT_texture_array GLEW_GET_VAR(__GLEW_EXT_texture_array)\r\n\r\n#endif /* GL_EXT_texture_array */\r\n\r\n/* ---------------------- GL_EXT_texture_buffer_object --------------------- */\r\n\r\n#ifndef GL_EXT_texture_buffer_object\r\n#define GL_EXT_texture_buffer_object 1\r\n\r\n#define GL_TEXTURE_BUFFER_EXT 0x8C2A\r\n#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B\r\n#define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C\r\n#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D\r\n#define GL_TEXTURE_BUFFER_FORMAT_EXT 0x8C2E\r\n\r\ntypedef void (GLAPIENTRY * PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer);\r\n\r\n#define glTexBufferEXT GLEW_GET_FUN(__glewTexBufferEXT)\r\n\r\n#define GLEW_EXT_texture_buffer_object GLEW_GET_VAR(__GLEW_EXT_texture_buffer_object)\r\n\r\n#endif /* GL_EXT_texture_buffer_object */\r\n\r\n/* -------------------- GL_EXT_texture_compression_dxt1 -------------------- */\r\n\r\n#ifndef GL_EXT_texture_compression_dxt1\r\n#define GL_EXT_texture_compression_dxt1 1\r\n\r\n#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0\r\n#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1\r\n\r\n#define GLEW_EXT_texture_compression_dxt1 GLEW_GET_VAR(__GLEW_EXT_texture_compression_dxt1)\r\n\r\n#endif /* GL_EXT_texture_compression_dxt1 */\r\n\r\n/* -------------------- GL_EXT_texture_compression_latc -------------------- */\r\n\r\n#ifndef GL_EXT_texture_compression_latc\r\n#define GL_EXT_texture_compression_latc 1\r\n\r\n#define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70\r\n#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT 0x8C71\r\n#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72\r\n#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT 0x8C73\r\n\r\n#define GLEW_EXT_texture_compression_latc GLEW_GET_VAR(__GLEW_EXT_texture_compression_latc)\r\n\r\n#endif /* GL_EXT_texture_compression_latc */\r\n\r\n/* -------------------- GL_EXT_texture_compression_rgtc -------------------- */\r\n\r\n#ifndef GL_EXT_texture_compression_rgtc\r\n#define GL_EXT_texture_compression_rgtc 1\r\n\r\n#define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB\r\n#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC\r\n#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD\r\n#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE\r\n\r\n#define GLEW_EXT_texture_compression_rgtc GLEW_GET_VAR(__GLEW_EXT_texture_compression_rgtc)\r\n\r\n#endif /* GL_EXT_texture_compression_rgtc */\r\n\r\n/* -------------------- GL_EXT_texture_compression_s3tc -------------------- */\r\n\r\n#ifndef GL_EXT_texture_compression_s3tc\r\n#define GL_EXT_texture_compression_s3tc 1\r\n\r\n#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0\r\n#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1\r\n#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2\r\n#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3\r\n\r\n#define GLEW_EXT_texture_compression_s3tc GLEW_GET_VAR(__GLEW_EXT_texture_compression_s3tc)\r\n\r\n#endif /* GL_EXT_texture_compression_s3tc */\r\n\r\n/* ------------------------ GL_EXT_texture_cube_map ------------------------ */\r\n\r\n#ifndef GL_EXT_texture_cube_map\r\n#define GL_EXT_texture_cube_map 1\r\n\r\n#define GL_NORMAL_MAP_EXT 0x8511\r\n#define GL_REFLECTION_MAP_EXT 0x8512\r\n#define GL_TEXTURE_CUBE_MAP_EXT 0x8513\r\n#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514\r\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515\r\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516\r\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517\r\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518\r\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519\r\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A\r\n#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B\r\n#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C\r\n\r\n#define GLEW_EXT_texture_cube_map GLEW_GET_VAR(__GLEW_EXT_texture_cube_map)\r\n\r\n#endif /* GL_EXT_texture_cube_map */\r\n\r\n/* ----------------------- GL_EXT_texture_edge_clamp ----------------------- */\r\n\r\n#ifndef GL_EXT_texture_edge_clamp\r\n#define GL_EXT_texture_edge_clamp 1\r\n\r\n#define GL_CLAMP_TO_EDGE_EXT 0x812F\r\n\r\n#define GLEW_EXT_texture_edge_clamp GLEW_GET_VAR(__GLEW_EXT_texture_edge_clamp)\r\n\r\n#endif /* GL_EXT_texture_edge_clamp */\r\n\r\n/* --------------------------- GL_EXT_texture_env -------------------------- */\r\n\r\n#ifndef GL_EXT_texture_env\r\n#define GL_EXT_texture_env 1\r\n\r\n#define GL_TEXTURE_ENV0_EXT 0\r\n#define GL_ENV_BLEND_EXT 0\r\n#define GL_TEXTURE_ENV_SHIFT_EXT 0\r\n#define GL_ENV_REPLACE_EXT 0\r\n#define GL_ENV_ADD_EXT 0\r\n#define GL_ENV_SUBTRACT_EXT 0\r\n#define GL_TEXTURE_ENV_MODE_ALPHA_EXT 0\r\n#define GL_ENV_REVERSE_SUBTRACT_EXT 0\r\n#define GL_ENV_REVERSE_BLEND_EXT 0\r\n#define GL_ENV_COPY_EXT 0\r\n#define GL_ENV_MODULATE_EXT 0\r\n\r\n#define GLEW_EXT_texture_env GLEW_GET_VAR(__GLEW_EXT_texture_env)\r\n\r\n#endif /* GL_EXT_texture_env */\r\n\r\n/* ------------------------- GL_EXT_texture_env_add ------------------------ */\r\n\r\n#ifndef GL_EXT_texture_env_add\r\n#define GL_EXT_texture_env_add 1\r\n\r\n#define GLEW_EXT_texture_env_add GLEW_GET_VAR(__GLEW_EXT_texture_env_add)\r\n\r\n#endif /* GL_EXT_texture_env_add */\r\n\r\n/* ----------------------- GL_EXT_texture_env_combine ---------------------- */\r\n\r\n#ifndef GL_EXT_texture_env_combine\r\n#define GL_EXT_texture_env_combine 1\r\n\r\n#define GL_COMBINE_EXT 0x8570\r\n#define GL_COMBINE_RGB_EXT 0x8571\r\n#define GL_COMBINE_ALPHA_EXT 0x8572\r\n#define GL_RGB_SCALE_EXT 0x8573\r\n#define GL_ADD_SIGNED_EXT 0x8574\r\n#define GL_INTERPOLATE_EXT 0x8575\r\n#define GL_CONSTANT_EXT 0x8576\r\n#define GL_PRIMARY_COLOR_EXT 0x8577\r\n#define GL_PREVIOUS_EXT 0x8578\r\n#define GL_SOURCE0_RGB_EXT 0x8580\r\n#define GL_SOURCE1_RGB_EXT 0x8581\r\n#define GL_SOURCE2_RGB_EXT 0x8582\r\n#define GL_SOURCE0_ALPHA_EXT 0x8588\r\n#define GL_SOURCE1_ALPHA_EXT 0x8589\r\n#define GL_SOURCE2_ALPHA_EXT 0x858A\r\n#define GL_OPERAND0_RGB_EXT 0x8590\r\n#define GL_OPERAND1_RGB_EXT 0x8591\r\n#define GL_OPERAND2_RGB_EXT 0x8592\r\n#define GL_OPERAND0_ALPHA_EXT 0x8598\r\n#define GL_OPERAND1_ALPHA_EXT 0x8599\r\n#define GL_OPERAND2_ALPHA_EXT 0x859A\r\n\r\n#define GLEW_EXT_texture_env_combine GLEW_GET_VAR(__GLEW_EXT_texture_env_combine)\r\n\r\n#endif /* GL_EXT_texture_env_combine */\r\n\r\n/* ------------------------ GL_EXT_texture_env_dot3 ------------------------ */\r\n\r\n#ifndef GL_EXT_texture_env_dot3\r\n#define GL_EXT_texture_env_dot3 1\r\n\r\n#define GL_DOT3_RGB_EXT 0x8740\r\n#define GL_DOT3_RGBA_EXT 0x8741\r\n\r\n#define GLEW_EXT_texture_env_dot3 GLEW_GET_VAR(__GLEW_EXT_texture_env_dot3)\r\n\r\n#endif /* GL_EXT_texture_env_dot3 */\r\n\r\n/* ------------------- GL_EXT_texture_filter_anisotropic ------------------- */\r\n\r\n#ifndef GL_EXT_texture_filter_anisotropic\r\n#define GL_EXT_texture_filter_anisotropic 1\r\n\r\n#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE\r\n#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF\r\n\r\n#define GLEW_EXT_texture_filter_anisotropic GLEW_GET_VAR(__GLEW_EXT_texture_filter_anisotropic)\r\n\r\n#endif /* GL_EXT_texture_filter_anisotropic */\r\n\r\n/* ------------------------- GL_EXT_texture_integer ------------------------ */\r\n\r\n#ifndef GL_EXT_texture_integer\r\n#define GL_EXT_texture_integer 1\r\n\r\n#define GL_RGBA32UI_EXT 0x8D70\r\n#define GL_RGB32UI_EXT 0x8D71\r\n#define GL_ALPHA32UI_EXT 0x8D72\r\n#define GL_INTENSITY32UI_EXT 0x8D73\r\n#define GL_LUMINANCE32UI_EXT 0x8D74\r\n#define GL_LUMINANCE_ALPHA32UI_EXT 0x8D75\r\n#define GL_RGBA16UI_EXT 0x8D76\r\n#define GL_RGB16UI_EXT 0x8D77\r\n#define GL_ALPHA16UI_EXT 0x8D78\r\n#define GL_INTENSITY16UI_EXT 0x8D79\r\n#define GL_LUMINANCE16UI_EXT 0x8D7A\r\n#define GL_LUMINANCE_ALPHA16UI_EXT 0x8D7B\r\n#define GL_RGBA8UI_EXT 0x8D7C\r\n#define GL_RGB8UI_EXT 0x8D7D\r\n#define GL_ALPHA8UI_EXT 0x8D7E\r\n#define GL_INTENSITY8UI_EXT 0x8D7F\r\n#define GL_LUMINANCE8UI_EXT 0x8D80\r\n#define GL_LUMINANCE_ALPHA8UI_EXT 0x8D81\r\n#define GL_RGBA32I_EXT 0x8D82\r\n#define GL_RGB32I_EXT 0x8D83\r\n#define GL_ALPHA32I_EXT 0x8D84\r\n#define GL_INTENSITY32I_EXT 0x8D85\r\n#define GL_LUMINANCE32I_EXT 0x8D86\r\n#define GL_LUMINANCE_ALPHA32I_EXT 0x8D87\r\n#define GL_RGBA16I_EXT 0x8D88\r\n#define GL_RGB16I_EXT 0x8D89\r\n#define GL_ALPHA16I_EXT 0x8D8A\r\n#define GL_INTENSITY16I_EXT 0x8D8B\r\n#define GL_LUMINANCE16I_EXT 0x8D8C\r\n#define GL_LUMINANCE_ALPHA16I_EXT 0x8D8D\r\n#define GL_RGBA8I_EXT 0x8D8E\r\n#define GL_RGB8I_EXT 0x8D8F\r\n#define GL_ALPHA8I_EXT 0x8D90\r\n#define GL_INTENSITY8I_EXT 0x8D91\r\n#define GL_LUMINANCE8I_EXT 0x8D92\r\n#define GL_LUMINANCE_ALPHA8I_EXT 0x8D93\r\n#define GL_RED_INTEGER_EXT 0x8D94\r\n#define GL_GREEN_INTEGER_EXT 0x8D95\r\n#define GL_BLUE_INTEGER_EXT 0x8D96\r\n#define GL_ALPHA_INTEGER_EXT 0x8D97\r\n#define GL_RGB_INTEGER_EXT 0x8D98\r\n#define GL_RGBA_INTEGER_EXT 0x8D99\r\n#define GL_BGR_INTEGER_EXT 0x8D9A\r\n#define GL_BGRA_INTEGER_EXT 0x8D9B\r\n#define GL_LUMINANCE_INTEGER_EXT 0x8D9C\r\n#define GL_LUMINANCE_ALPHA_INTEGER_EXT 0x8D9D\r\n#define GL_RGBA_INTEGER_MODE_EXT 0x8D9E\r\n\r\ntypedef void (GLAPIENTRY * PFNGLCLEARCOLORIIEXTPROC) (GLint red, GLint green, GLint blue, GLint alpha);\r\ntypedef void (GLAPIENTRY * PFNGLCLEARCOLORIUIEXTPROC) (GLuint red, GLuint green, GLuint blue, GLuint alpha);\r\ntypedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint *params);\r\ntypedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint *params);\r\ntypedef void (GLAPIENTRY * PFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params);\r\ntypedef void (GLAPIENTRY * PFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params);\r\n\r\n#define glClearColorIiEXT GLEW_GET_FUN(__glewClearColorIiEXT)\r\n#define glClearColorIuiEXT GLEW_GET_FUN(__glewClearColorIuiEXT)\r\n#define glGetTexParameterIivEXT GLEW_GET_FUN(__glewGetTexParameterIivEXT)\r\n#define glGetTexParameterIuivEXT GLEW_GET_FUN(__glewGetTexParameterIuivEXT)\r\n#define glTexParameterIivEXT GLEW_GET_FUN(__glewTexParameterIivEXT)\r\n#define glTexParameterIuivEXT GLEW_GET_FUN(__glewTexParameterIuivEXT)\r\n\r\n#define GLEW_EXT_texture_integer GLEW_GET_VAR(__GLEW_EXT_texture_integer)\r\n\r\n#endif /* GL_EXT_texture_integer */\r\n\r\n/* ------------------------ GL_EXT_texture_lod_bias ------------------------ */\r\n\r\n#ifndef GL_EXT_texture_lod_bias\r\n#define GL_EXT_texture_lod_bias 1\r\n\r\n#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD\r\n#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500\r\n#define GL_TEXTURE_LOD_BIAS_EXT 0x8501\r\n\r\n#define GLEW_EXT_texture_lod_bias GLEW_GET_VAR(__GLEW_EXT_texture_lod_bias)\r\n\r\n#endif /* GL_EXT_texture_lod_bias */\r\n\r\n/* ---------------------- GL_EXT_texture_mirror_clamp ---------------------- */\r\n\r\n#ifndef GL_EXT_texture_mirror_clamp\r\n#define GL_EXT_texture_mirror_clamp 1\r\n\r\n#define GL_MIRROR_CLAMP_EXT 0x8742\r\n#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743\r\n#define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912\r\n\r\n#define GLEW_EXT_texture_mirror_clamp GLEW_GET_VAR(__GLEW_EXT_texture_mirror_clamp)\r\n\r\n#endif /* GL_EXT_texture_mirror_clamp */\r\n\r\n/* ------------------------- GL_EXT_texture_object ------------------------- */\r\n\r\n#ifndef GL_EXT_texture_object\r\n#define GL_EXT_texture_object 1\r\n\r\n#define GL_TEXTURE_PRIORITY_EXT 0x8066\r\n#define GL_TEXTURE_RESIDENT_EXT 0x8067\r\n#define GL_TEXTURE_1D_BINDING_EXT 0x8068\r\n#define GL_TEXTURE_2D_BINDING_EXT 0x8069\r\n#define GL_TEXTURE_3D_BINDING_EXT 0x806A\r\n\r\ntypedef GLboolean (GLAPIENTRY * PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint* textures, GLboolean* residences);\r\ntypedef void (GLAPIENTRY * PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture);\r\ntypedef void (GLAPIENTRY * PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint* textures);\r\ntypedef void (GLAPIENTRY * PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint* textures);\r\ntypedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREEXTPROC) (GLuint texture);\r\ntypedef void (GLAPIENTRY * PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint* textures, const GLclampf* priorities);\r\n\r\n#define glAreTexturesResidentEXT GLEW_GET_FUN(__glewAreTexturesResidentEXT)\r\n#define glBindTextureEXT GLEW_GET_FUN(__glewBindTextureEXT)\r\n#define glDeleteTexturesEXT GLEW_GET_FUN(__glewDeleteTexturesEXT)\r\n#define glGenTexturesEXT GLEW_GET_FUN(__glewGenTexturesEXT)\r\n#define glIsTextureEXT GLEW_GET_FUN(__glewIsTextureEXT)\r\n#define glPrioritizeTexturesEXT GLEW_GET_FUN(__glewPrioritizeTexturesEXT)\r\n\r\n#define GLEW_EXT_texture_object GLEW_GET_VAR(__GLEW_EXT_texture_object)\r\n\r\n#endif /* GL_EXT_texture_object */\r\n\r\n/* --------------------- GL_EXT_texture_perturb_normal --------------------- */\r\n\r\n#ifndef GL_EXT_texture_perturb_normal\r\n#define GL_EXT_texture_perturb_normal 1\r\n\r\n#define GL_PERTURB_EXT 0x85AE\r\n#define GL_TEXTURE_NORMAL_EXT 0x85AF\r\n\r\ntypedef void (GLAPIENTRY * PFNGLTEXTURENORMALEXTPROC) (GLenum mode);\r\n\r\n#define glTextureNormalEXT GLEW_GET_FUN(__glewTextureNormalEXT)\r\n\r\n#define GLEW_EXT_texture_perturb_normal GLEW_GET_VAR(__GLEW_EXT_texture_perturb_normal)\r\n\r\n#endif /* GL_EXT_texture_perturb_normal */\r\n\r\n/* ------------------------ GL_EXT_texture_rectangle ----------------------- */\r\n\r\n#ifndef GL_EXT_texture_rectangle\r\n#define GL_EXT_texture_rectangle 1\r\n\r\n#define GL_TEXTURE_RECTANGLE_EXT 0x84F5\r\n#define GL_TEXTURE_BINDING_RECTANGLE_EXT 0x84F6\r\n#define GL_PROXY_TEXTURE_RECTANGLE_EXT 0x84F7\r\n#define GL_MAX_RECTANGLE_TEXTURE_SIZE_EXT 0x84F8\r\n\r\n#define GLEW_EXT_texture_rectangle GLEW_GET_VAR(__GLEW_EXT_texture_rectangle)\r\n\r\n#endif /* GL_EXT_texture_rectangle */\r\n\r\n/* -------------------------- GL_EXT_texture_sRGB -------------------------- */\r\n\r\n#ifndef GL_EXT_texture_sRGB\r\n#define GL_EXT_texture_sRGB 1\r\n\r\n#define GL_SRGB_EXT 0x8C40\r\n#define GL_SRGB8_EXT 0x8C41\r\n#define GL_SRGB_ALPHA_EXT 0x8C42\r\n#define GL_SRGB8_ALPHA8_EXT 0x8C43\r\n#define GL_SLUMINANCE_ALPHA_EXT 0x8C44\r\n#define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45\r\n#define GL_SLUMINANCE_EXT 0x8C46\r\n#define GL_SLUMINANCE8_EXT 0x8C47\r\n#define GL_COMPRESSED_SRGB_EXT 0x8C48\r\n#define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49\r\n#define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A\r\n#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B\r\n#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C\r\n#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D\r\n#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E\r\n#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F\r\n\r\n#define GLEW_EXT_texture_sRGB GLEW_GET_VAR(__GLEW_EXT_texture_sRGB)\r\n\r\n#endif /* GL_EXT_texture_sRGB */\r\n\r\n/* --------------------- GL_EXT_texture_shared_exponent -------------------- */\r\n\r\n#ifndef GL_EXT_texture_shared_exponent\r\n#define GL_EXT_texture_shared_exponent 1\r\n\r\n#define GL_RGB9_E5_EXT 0x8C3D\r\n#define GL_UNSIGNED_INT_5_9_9_9_REV_EXT 0x8C3E\r\n#define GL_TEXTURE_SHARED_SIZE_EXT 0x8C3F\r\n\r\n#define GLEW_EXT_texture_shared_exponent GLEW_GET_VAR(__GLEW_EXT_texture_shared_exponent)\r\n\r\n#endif /* GL_EXT_texture_shared_exponent */\r\n\r\n/* -------------------------- GL_EXT_texture_snorm ------------------------- */\r\n\r\n#ifndef GL_EXT_texture_snorm\r\n#define GL_EXT_texture_snorm 1\r\n\r\n#define GL_RED_SNORM 0x8F90\r\n#define GL_RG_SNORM 0x8F91\r\n#define GL_RGB_SNORM 0x8F92\r\n#define GL_RGBA_SNORM 0x8F93\r\n#define GL_R8_SNORM 0x8F94\r\n#define GL_RG8_SNORM 0x8F95\r\n#define GL_RGB8_SNORM 0x8F96\r\n#define GL_RGBA8_SNORM 0x8F97\r\n#define GL_R16_SNORM 0x8F98\r\n#define GL_RG16_SNORM 0x8F99\r\n#define GL_RGB16_SNORM 0x8F9A\r\n#define GL_RGBA16_SNORM 0x8F9B\r\n#define GL_SIGNED_NORMALIZED 0x8F9C\r\n#define GL_ALPHA_SNORM 0x9010\r\n#define GL_LUMINANCE_SNORM 0x9011\r\n#define GL_LUMINANCE_ALPHA_SNORM 0x9012\r\n#define GL_INTENSITY_SNORM 0x9013\r\n#define GL_ALPHA8_SNORM 0x9014\r\n#define GL_LUMINANCE8_SNORM 0x9015\r\n#define GL_LUMINANCE8_ALPHA8_SNORM 0x9016\r\n#define GL_INTENSITY8_SNORM 0x9017\r\n#define GL_ALPHA16_SNORM 0x9018\r\n#define GL_LUMINANCE16_SNORM 0x9019\r\n#define GL_LUMINANCE16_ALPHA16_SNORM 0x901A\r\n#define GL_INTENSITY16_SNORM 0x901B\r\n\r\n#define GLEW_EXT_texture_snorm GLEW_GET_VAR(__GLEW_EXT_texture_snorm)\r\n\r\n#endif /* GL_EXT_texture_snorm */\r\n\r\n/* ------------------------- GL_EXT_texture_swizzle ------------------------ */\r\n\r\n#ifndef GL_EXT_texture_swizzle\r\n#define GL_EXT_texture_swizzle 1\r\n\r\n#define GL_TEXTURE_SWIZZLE_R_EXT 0x8E42\r\n#define GL_TEXTURE_SWIZZLE_G_EXT 0x8E43\r\n#define GL_TEXTURE_SWIZZLE_B_EXT 0x8E44\r\n#define GL_TEXTURE_SWIZZLE_A_EXT 0x8E45\r\n#define GL_TEXTURE_SWIZZLE_RGBA_EXT 0x8E46\r\n\r\n#define GLEW_EXT_texture_swizzle GLEW_GET_VAR(__GLEW_EXT_texture_swizzle)\r\n\r\n#endif /* GL_EXT_texture_swizzle */\r\n\r\n/* --------------------------- GL_EXT_timer_query -------------------------- */\r\n\r\n#ifndef GL_EXT_timer_query\r\n#define GL_EXT_timer_query 1\r\n\r\n#define GL_TIME_ELAPSED_EXT 0x88BF\r\n\r\ntypedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64EXT *params);\r\ntypedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64EXT *params);\r\n\r\n#define glGetQueryObjecti64vEXT GLEW_GET_FUN(__glewGetQueryObjecti64vEXT)\r\n#define glGetQueryObjectui64vEXT GLEW_GET_FUN(__glewGetQueryObjectui64vEXT)\r\n\r\n#define GLEW_EXT_timer_query GLEW_GET_VAR(__GLEW_EXT_timer_query)\r\n\r\n#endif /* GL_EXT_timer_query */\r\n\r\n/* ----------------------- GL_EXT_transform_feedback ----------------------- */\r\n\r\n#ifndef GL_EXT_transform_feedback\r\n#define GL_EXT_transform_feedback 1\r\n\r\n#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT 0x8C76\r\n#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT 0x8C7F\r\n#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT 0x8C80\r\n#define GL_TRANSFORM_FEEDBACK_VARYINGS_EXT 0x8C83\r\n#define GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT 0x8C84\r\n#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT 0x8C85\r\n#define GL_PRIMITIVES_GENERATED_EXT 0x8C87\r\n#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT 0x8C88\r\n#define GL_RASTERIZER_DISCARD_EXT 0x8C89\r\n#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT 0x8C8A\r\n#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT 0x8C8B\r\n#define GL_INTERLEAVED_ATTRIBS_EXT 0x8C8C\r\n#define GL_SEPARATE_ATTRIBS_EXT 0x8C8D\r\n#define GL_TRANSFORM_FEEDBACK_BUFFER_EXT 0x8C8E\r\n#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT 0x8C8F\r\n\r\ntypedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKEXTPROC) (GLenum primitiveMode);\r\ntypedef void (GLAPIENTRY * PFNGLBINDBUFFERBASEEXTPROC) (GLenum target, GLuint index, GLuint buffer);\r\ntypedef void (GLAPIENTRY * PFNGLBINDBUFFEROFFSETEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset);\r\ntypedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGEEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);\r\ntypedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKEXTPROC) (void);\r\ntypedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei *size, GLenum *type, char *name);\r\ntypedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) (GLuint program, GLsizei count, const char ** varyings, GLenum bufferMode);\r\n\r\n#define glBeginTransformFeedbackEXT GLEW_GET_FUN(__glewBeginTransformFeedbackEXT)\r\n#define glBindBufferBaseEXT GLEW_GET_FUN(__glewBindBufferBaseEXT)\r\n#define glBindBufferOffsetEXT GLEW_GET_FUN(__glewBindBufferOffsetEXT)\r\n#define glBindBufferRangeEXT GLEW_GET_FUN(__glewBindBufferRangeEXT)\r\n#define glEndTransformFeedbackEXT GLEW_GET_FUN(__glewEndTransformFeedbackEXT)\r\n#define glGetTransformFeedbackVaryingEXT GLEW_GET_FUN(__glewGetTransformFeedbackVaryingEXT)\r\n#define glTransformFeedbackVaryingsEXT GLEW_GET_FUN(__glewTransformFeedbackVaryingsEXT)\r\n\r\n#define GLEW_EXT_transform_feedback GLEW_GET_VAR(__GLEW_EXT_transform_feedback)\r\n\r\n#endif /* GL_EXT_transform_feedback */\r\n\r\n/* -------------------------- GL_EXT_vertex_array -------------------------- */\r\n\r\n#ifndef GL_EXT_vertex_array\r\n#define GL_EXT_vertex_array 1\r\n\r\n#define GL_DOUBLE_EXT 0x140A\r\n#define GL_VERTEX_ARRAY_EXT 0x8074\r\n#define GL_NORMAL_ARRAY_EXT 0x8075\r\n#define GL_COLOR_ARRAY_EXT 0x8076\r\n#define GL_INDEX_ARRAY_EXT 0x8077\r\n#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078\r\n#define GL_EDGE_FLAG_ARRAY_EXT 0x8079\r\n#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A\r\n#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B\r\n#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C\r\n#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D\r\n#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E\r\n#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F\r\n#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080\r\n#define GL_COLOR_ARRAY_SIZE_EXT 0x8081\r\n#define GL_COLOR_ARRAY_TYPE_EXT 0x8082\r\n#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083\r\n#define GL_COLOR_ARRAY_COUNT_EXT 0x8084\r\n#define GL_INDEX_ARRAY_TYPE_EXT 0x8085\r\n#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086\r\n#define GL_INDEX_ARRAY_COUNT_EXT 0x8087\r\n#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088\r\n#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089\r\n#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A\r\n#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B\r\n#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C\r\n#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D\r\n#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E\r\n#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F\r\n#define GL_COLOR_ARRAY_POINTER_EXT 0x8090\r\n#define GL_INDEX_ARRAY_POINTER_EXT 0x8091\r\n#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092\r\n#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093\r\n\r\ntypedef void (GLAPIENTRY * PFNGLARRAYELEMENTEXTPROC) (GLint i);\r\ntypedef void (GLAPIENTRY * PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void* pointer);\r\ntypedef void (GLAPIENTRY * PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count);\r\ntypedef void (GLAPIENTRY * PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean* pointer);\r\ntypedef void (GLAPIENTRY * PFNGLGETPOINTERVEXTPROC) (GLenum pname, void** params);\r\ntypedef void (GLAPIENTRY * PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void* pointer);\r\ntypedef void (GLAPIENTRY * PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void* pointer);\r\ntypedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void* pointer);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void* pointer);\r\n\r\n#define glArrayElementEXT GLEW_GET_FUN(__glewArrayElementEXT)\r\n#define glColorPointerEXT GLEW_GET_FUN(__glewColorPointerEXT)\r\n#define glDrawArraysEXT GLEW_GET_FUN(__glewDrawArraysEXT)\r\n#define glEdgeFlagPointerEXT GLEW_GET_FUN(__glewEdgeFlagPointerEXT)\r\n#define glGetPointervEXT GLEW_GET_FUN(__glewGetPointervEXT)\r\n#define glIndexPointerEXT GLEW_GET_FUN(__glewIndexPointerEXT)\r\n#define glNormalPointerEXT GLEW_GET_FUN(__glewNormalPointerEXT)\r\n#define glTexCoordPointerEXT GLEW_GET_FUN(__glewTexCoordPointerEXT)\r\n#define glVertexPointerEXT GLEW_GET_FUN(__glewVertexPointerEXT)\r\n\r\n#define GLEW_EXT_vertex_array GLEW_GET_VAR(__GLEW_EXT_vertex_array)\r\n\r\n#endif /* GL_EXT_vertex_array */\r\n\r\n/* ------------------------ GL_EXT_vertex_array_bgra ----------------------- */\r\n\r\n#ifndef GL_EXT_vertex_array_bgra\r\n#define GL_EXT_vertex_array_bgra 1\r\n\r\n#define GL_BGRA 0x80E1\r\n\r\n#define GLEW_EXT_vertex_array_bgra GLEW_GET_VAR(__GLEW_EXT_vertex_array_bgra)\r\n\r\n#endif /* GL_EXT_vertex_array_bgra */\r\n\r\n/* -------------------------- GL_EXT_vertex_shader ------------------------- */\r\n\r\n#ifndef GL_EXT_vertex_shader\r\n#define GL_EXT_vertex_shader 1\r\n\r\n#define GL_VERTEX_SHADER_EXT 0x8780\r\n#define GL_VERTEX_SHADER_BINDING_EXT 0x8781\r\n#define GL_OP_INDEX_EXT 0x8782\r\n#define GL_OP_NEGATE_EXT 0x8783\r\n#define GL_OP_DOT3_EXT 0x8784\r\n#define GL_OP_DOT4_EXT 0x8785\r\n#define GL_OP_MUL_EXT 0x8786\r\n#define GL_OP_ADD_EXT 0x8787\r\n#define GL_OP_MADD_EXT 0x8788\r\n#define GL_OP_FRAC_EXT 0x8789\r\n#define GL_OP_MAX_EXT 0x878A\r\n#define GL_OP_MIN_EXT 0x878B\r\n#define GL_OP_SET_GE_EXT 0x878C\r\n#define GL_OP_SET_LT_EXT 0x878D\r\n#define GL_OP_CLAMP_EXT 0x878E\r\n#define GL_OP_FLOOR_EXT 0x878F\r\n#define GL_OP_ROUND_EXT 0x8790\r\n#define GL_OP_EXP_BASE_2_EXT 0x8791\r\n#define GL_OP_LOG_BASE_2_EXT 0x8792\r\n#define GL_OP_POWER_EXT 0x8793\r\n#define GL_OP_RECIP_EXT 0x8794\r\n#define GL_OP_RECIP_SQRT_EXT 0x8795\r\n#define GL_OP_SUB_EXT 0x8796\r\n#define GL_OP_CROSS_PRODUCT_EXT 0x8797\r\n#define GL_OP_MULTIPLY_MATRIX_EXT 0x8798\r\n#define GL_OP_MOV_EXT 0x8799\r\n#define GL_OUTPUT_VERTEX_EXT 0x879A\r\n#define GL_OUTPUT_COLOR0_EXT 0x879B\r\n#define GL_OUTPUT_COLOR1_EXT 0x879C\r\n#define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D\r\n#define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E\r\n#define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F\r\n#define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0\r\n#define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1\r\n#define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2\r\n#define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3\r\n#define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4\r\n#define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5\r\n#define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6\r\n#define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7\r\n#define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8\r\n#define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9\r\n#define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA\r\n#define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB\r\n#define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC\r\n#define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD\r\n#define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE\r\n#define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF\r\n#define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0\r\n#define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1\r\n#define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2\r\n#define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3\r\n#define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4\r\n#define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5\r\n#define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6\r\n#define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7\r\n#define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8\r\n#define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9\r\n#define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA\r\n#define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB\r\n#define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC\r\n#define GL_OUTPUT_FOG_EXT 0x87BD\r\n#define GL_SCALAR_EXT 0x87BE\r\n#define GL_VECTOR_EXT 0x87BF\r\n#define GL_MATRIX_EXT 0x87C0\r\n#define GL_VARIANT_EXT 0x87C1\r\n#define GL_INVARIANT_EXT 0x87C2\r\n#define GL_LOCAL_CONSTANT_EXT 0x87C3\r\n#define GL_LOCAL_EXT 0x87C4\r\n#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5\r\n#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6\r\n#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7\r\n#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8\r\n#define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9\r\n#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA\r\n#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB\r\n#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CC\r\n#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CD\r\n#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE\r\n#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF\r\n#define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0\r\n#define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1\r\n#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2\r\n#define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3\r\n#define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4\r\n#define GL_X_EXT 0x87D5\r\n#define GL_Y_EXT 0x87D6\r\n#define GL_Z_EXT 0x87D7\r\n#define GL_W_EXT 0x87D8\r\n#define GL_NEGATIVE_X_EXT 0x87D9\r\n#define GL_NEGATIVE_Y_EXT 0x87DA\r\n#define GL_NEGATIVE_Z_EXT 0x87DB\r\n#define GL_NEGATIVE_W_EXT 0x87DC\r\n#define GL_ZERO_EXT 0x87DD\r\n#define GL_ONE_EXT 0x87DE\r\n#define GL_NEGATIVE_ONE_EXT 0x87DF\r\n#define GL_NORMALIZED_RANGE_EXT 0x87E0\r\n#define GL_FULL_RANGE_EXT 0x87E1\r\n#define GL_CURRENT_VERTEX_EXT 0x87E2\r\n#define GL_MVP_MATRIX_EXT 0x87E3\r\n#define GL_VARIANT_VALUE_EXT 0x87E4\r\n#define GL_VARIANT_DATATYPE_EXT 0x87E5\r\n#define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6\r\n#define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7\r\n#define GL_VARIANT_ARRAY_EXT 0x87E8\r\n#define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9\r\n#define GL_INVARIANT_VALUE_EXT 0x87EA\r\n#define GL_INVARIANT_DATATYPE_EXT 0x87EB\r\n#define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC\r\n#define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED\r\n\r\ntypedef void (GLAPIENTRY * PFNGLBEGINVERTEXSHADEREXTPROC) (void);\r\ntypedef GLuint (GLAPIENTRY * PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value);\r\ntypedef GLuint (GLAPIENTRY * PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value);\r\ntypedef GLuint (GLAPIENTRY * PFNGLBINDPARAMETEREXTPROC) (GLenum value);\r\ntypedef GLuint (GLAPIENTRY * PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value);\r\ntypedef GLuint (GLAPIENTRY * PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value);\r\ntypedef void (GLAPIENTRY * PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id);\r\ntypedef void (GLAPIENTRY * PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id);\r\ntypedef void (GLAPIENTRY * PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id);\r\ntypedef void (GLAPIENTRY * PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id);\r\ntypedef void (GLAPIENTRY * PFNGLENDVERTEXSHADEREXTPROC) (void);\r\ntypedef void (GLAPIENTRY * PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num);\r\ntypedef GLuint (GLAPIENTRY * PFNGLGENSYMBOLSEXTPROC) (GLenum dataType, GLenum storageType, GLenum range, GLuint components);\r\ntypedef GLuint (GLAPIENTRY * PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range);\r\ntypedef void (GLAPIENTRY * PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data);\r\ntypedef void (GLAPIENTRY * PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data);\r\ntypedef void (GLAPIENTRY * PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data);\r\ntypedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data);\r\ntypedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data);\r\ntypedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data);\r\ntypedef void (GLAPIENTRY * PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data);\r\ntypedef void (GLAPIENTRY * PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data);\r\ntypedef void (GLAPIENTRY * PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data);\r\ntypedef void (GLAPIENTRY * PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, GLvoid **data);\r\ntypedef void (GLAPIENTRY * PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num);\r\ntypedef GLboolean (GLAPIENTRY * PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap);\r\ntypedef void (GLAPIENTRY * PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, GLvoid *addr);\r\ntypedef void (GLAPIENTRY * PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, GLvoid *addr);\r\ntypedef void (GLAPIENTRY * PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1);\r\ntypedef void (GLAPIENTRY * PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2);\r\ntypedef void (GLAPIENTRY * PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3);\r\ntypedef void (GLAPIENTRY * PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW);\r\ntypedef void (GLAPIENTRY * PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, GLvoid *addr);\r\ntypedef void (GLAPIENTRY * PFNGLVARIANTBVEXTPROC) (GLuint id, GLbyte *addr);\r\ntypedef void (GLAPIENTRY * PFNGLVARIANTDVEXTPROC) (GLuint id, GLdouble *addr);\r\ntypedef void (GLAPIENTRY * PFNGLVARIANTFVEXTPROC) (GLuint id, GLfloat *addr);\r\ntypedef void (GLAPIENTRY * PFNGLVARIANTIVEXTPROC) (GLuint id, GLint *addr);\r\ntypedef void (GLAPIENTRY * PFNGLVARIANTSVEXTPROC) (GLuint id, GLshort *addr);\r\ntypedef void (GLAPIENTRY * PFNGLVARIANTUBVEXTPROC) (GLuint id, GLubyte *addr);\r\ntypedef void (GLAPIENTRY * PFNGLVARIANTUIVEXTPROC) (GLuint id, GLuint *addr);\r\ntypedef void (GLAPIENTRY * PFNGLVARIANTUSVEXTPROC) (GLuint id, GLushort *addr);\r\ntypedef void (GLAPIENTRY * PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW);\r\n\r\n#define glBeginVertexShaderEXT GLEW_GET_FUN(__glewBeginVertexShaderEXT)\r\n#define glBindLightParameterEXT GLEW_GET_FUN(__glewBindLightParameterEXT)\r\n#define glBindMaterialParameterEXT GLEW_GET_FUN(__glewBindMaterialParameterEXT)\r\n#define glBindParameterEXT GLEW_GET_FUN(__glewBindParameterEXT)\r\n#define glBindTexGenParameterEXT GLEW_GET_FUN(__glewBindTexGenParameterEXT)\r\n#define glBindTextureUnitParameterEXT GLEW_GET_FUN(__glewBindTextureUnitParameterEXT)\r\n#define glBindVertexShaderEXT GLEW_GET_FUN(__glewBindVertexShaderEXT)\r\n#define glDeleteVertexShaderEXT GLEW_GET_FUN(__glewDeleteVertexShaderEXT)\r\n#define glDisableVariantClientStateEXT GLEW_GET_FUN(__glewDisableVariantClientStateEXT)\r\n#define glEnableVariantClientStateEXT GLEW_GET_FUN(__glewEnableVariantClientStateEXT)\r\n#define glEndVertexShaderEXT GLEW_GET_FUN(__glewEndVertexShaderEXT)\r\n#define glExtractComponentEXT GLEW_GET_FUN(__glewExtractComponentEXT)\r\n#define glGenSymbolsEXT GLEW_GET_FUN(__glewGenSymbolsEXT)\r\n#define glGenVertexShadersEXT GLEW_GET_FUN(__glewGenVertexShadersEXT)\r\n#define glGetInvariantBooleanvEXT GLEW_GET_FUN(__glewGetInvariantBooleanvEXT)\r\n#define glGetInvariantFloatvEXT GLEW_GET_FUN(__glewGetInvariantFloatvEXT)\r\n#define glGetInvariantIntegervEXT GLEW_GET_FUN(__glewGetInvariantIntegervEXT)\r\n#define glGetLocalConstantBooleanvEXT GLEW_GET_FUN(__glewGetLocalConstantBooleanvEXT)\r\n#define glGetLocalConstantFloatvEXT GLEW_GET_FUN(__glewGetLocalConstantFloatvEXT)\r\n#define glGetLocalConstantIntegervEXT GLEW_GET_FUN(__glewGetLocalConstantIntegervEXT)\r\n#define glGetVariantBooleanvEXT GLEW_GET_FUN(__glewGetVariantBooleanvEXT)\r\n#define glGetVariantFloatvEXT GLEW_GET_FUN(__glewGetVariantFloatvEXT)\r\n#define glGetVariantIntegervEXT GLEW_GET_FUN(__glewGetVariantIntegervEXT)\r\n#define glGetVariantPointervEXT GLEW_GET_FUN(__glewGetVariantPointervEXT)\r\n#define glInsertComponentEXT GLEW_GET_FUN(__glewInsertComponentEXT)\r\n#define glIsVariantEnabledEXT GLEW_GET_FUN(__glewIsVariantEnabledEXT)\r\n#define glSetInvariantEXT GLEW_GET_FUN(__glewSetInvariantEXT)\r\n#define glSetLocalConstantEXT GLEW_GET_FUN(__glewSetLocalConstantEXT)\r\n#define glShaderOp1EXT GLEW_GET_FUN(__glewShaderOp1EXT)\r\n#define glShaderOp2EXT GLEW_GET_FUN(__glewShaderOp2EXT)\r\n#define glShaderOp3EXT GLEW_GET_FUN(__glewShaderOp3EXT)\r\n#define glSwizzleEXT GLEW_GET_FUN(__glewSwizzleEXT)\r\n#define glVariantPointerEXT GLEW_GET_FUN(__glewVariantPointerEXT)\r\n#define glVariantbvEXT GLEW_GET_FUN(__glewVariantbvEXT)\r\n#define glVariantdvEXT GLEW_GET_FUN(__glewVariantdvEXT)\r\n#define glVariantfvEXT GLEW_GET_FUN(__glewVariantfvEXT)\r\n#define glVariantivEXT GLEW_GET_FUN(__glewVariantivEXT)\r\n#define glVariantsvEXT GLEW_GET_FUN(__glewVariantsvEXT)\r\n#define glVariantubvEXT GLEW_GET_FUN(__glewVariantubvEXT)\r\n#define glVariantuivEXT GLEW_GET_FUN(__glewVariantuivEXT)\r\n#define glVariantusvEXT GLEW_GET_FUN(__glewVariantusvEXT)\r\n#define glWriteMaskEXT GLEW_GET_FUN(__glewWriteMaskEXT)\r\n\r\n#define GLEW_EXT_vertex_shader GLEW_GET_VAR(__GLEW_EXT_vertex_shader)\r\n\r\n#endif /* GL_EXT_vertex_shader */\r\n\r\n/* ------------------------ GL_EXT_vertex_weighting ------------------------ */\r\n\r\n#ifndef GL_EXT_vertex_weighting\r\n#define GL_EXT_vertex_weighting 1\r\n\r\n#define GL_MODELVIEW0_STACK_DEPTH_EXT 0x0BA3\r\n#define GL_MODELVIEW0_MATRIX_EXT 0x0BA6\r\n#define GL_MODELVIEW0_EXT 0x1700\r\n#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502\r\n#define GL_MODELVIEW1_MATRIX_EXT 0x8506\r\n#define GL_VERTEX_WEIGHTING_EXT 0x8509\r\n#define GL_MODELVIEW1_EXT 0x850A\r\n#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B\r\n#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C\r\n#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D\r\n#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E\r\n#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F\r\n#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510\r\n\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, void* pointer);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTFVEXTPROC) (GLfloat* weight);\r\n\r\n#define glVertexWeightPointerEXT GLEW_GET_FUN(__glewVertexWeightPointerEXT)\r\n#define glVertexWeightfEXT GLEW_GET_FUN(__glewVertexWeightfEXT)\r\n#define glVertexWeightfvEXT GLEW_GET_FUN(__glewVertexWeightfvEXT)\r\n\r\n#define GLEW_EXT_vertex_weighting GLEW_GET_VAR(__GLEW_EXT_vertex_weighting)\r\n\r\n#endif /* GL_EXT_vertex_weighting */\r\n\r\n/* ---------------------- GL_GREMEDY_frame_terminator ---------------------- */\r\n\r\n#ifndef GL_GREMEDY_frame_terminator\r\n#define GL_GREMEDY_frame_terminator 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLFRAMETERMINATORGREMEDYPROC) (void);\r\n\r\n#define glFrameTerminatorGREMEDY GLEW_GET_FUN(__glewFrameTerminatorGREMEDY)\r\n\r\n#define GLEW_GREMEDY_frame_terminator GLEW_GET_VAR(__GLEW_GREMEDY_frame_terminator)\r\n\r\n#endif /* GL_GREMEDY_frame_terminator */\r\n\r\n/* ------------------------ GL_GREMEDY_string_marker ----------------------- */\r\n\r\n#ifndef GL_GREMEDY_string_marker\r\n#define GL_GREMEDY_string_marker 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const void* string);\r\n\r\n#define glStringMarkerGREMEDY GLEW_GET_FUN(__glewStringMarkerGREMEDY)\r\n\r\n#define GLEW_GREMEDY_string_marker GLEW_GET_VAR(__GLEW_GREMEDY_string_marker)\r\n\r\n#endif /* GL_GREMEDY_string_marker */\r\n\r\n/* --------------------- GL_HP_convolution_border_modes -------------------- */\r\n\r\n#ifndef GL_HP_convolution_border_modes\r\n#define GL_HP_convolution_border_modes 1\r\n\r\n#define GLEW_HP_convolution_border_modes GLEW_GET_VAR(__GLEW_HP_convolution_border_modes)\r\n\r\n#endif /* GL_HP_convolution_border_modes */\r\n\r\n/* ------------------------- GL_HP_image_transform ------------------------- */\r\n\r\n#ifndef GL_HP_image_transform\r\n#define GL_HP_image_transform 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, const GLfloat param);\r\ntypedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, const GLint param);\r\ntypedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint* params);\r\n\r\n#define glGetImageTransformParameterfvHP GLEW_GET_FUN(__glewGetImageTransformParameterfvHP)\r\n#define glGetImageTransformParameterivHP GLEW_GET_FUN(__glewGetImageTransformParameterivHP)\r\n#define glImageTransformParameterfHP GLEW_GET_FUN(__glewImageTransformParameterfHP)\r\n#define glImageTransformParameterfvHP GLEW_GET_FUN(__glewImageTransformParameterfvHP)\r\n#define glImageTransformParameteriHP GLEW_GET_FUN(__glewImageTransformParameteriHP)\r\n#define glImageTransformParameterivHP GLEW_GET_FUN(__glewImageTransformParameterivHP)\r\n\r\n#define GLEW_HP_image_transform GLEW_GET_VAR(__GLEW_HP_image_transform)\r\n\r\n#endif /* GL_HP_image_transform */\r\n\r\n/* -------------------------- GL_HP_occlusion_test ------------------------- */\r\n\r\n#ifndef GL_HP_occlusion_test\r\n#define GL_HP_occlusion_test 1\r\n\r\n#define GL_OCCLUSION_TEST_HP 0x8165\r\n#define GL_OCCLUSION_TEST_RESULT_HP 0x8166\r\n\r\n#define GLEW_HP_occlusion_test GLEW_GET_VAR(__GLEW_HP_occlusion_test)\r\n\r\n#endif /* GL_HP_occlusion_test */\r\n\r\n/* ------------------------- GL_HP_texture_lighting ------------------------ */\r\n\r\n#ifndef GL_HP_texture_lighting\r\n#define GL_HP_texture_lighting 1\r\n\r\n#define GLEW_HP_texture_lighting GLEW_GET_VAR(__GLEW_HP_texture_lighting)\r\n\r\n#endif /* GL_HP_texture_lighting */\r\n\r\n/* --------------------------- GL_IBM_cull_vertex -------------------------- */\r\n\r\n#ifndef GL_IBM_cull_vertex\r\n#define GL_IBM_cull_vertex 1\r\n\r\n#define GL_CULL_VERTEX_IBM 103050\r\n\r\n#define GLEW_IBM_cull_vertex GLEW_GET_VAR(__GLEW_IBM_cull_vertex)\r\n\r\n#endif /* GL_IBM_cull_vertex */\r\n\r\n/* ---------------------- GL_IBM_multimode_draw_arrays --------------------- */\r\n\r\n#ifndef GL_IBM_multimode_draw_arrays\r\n#define GL_IBM_multimode_draw_arrays 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum* mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride);\r\ntypedef void (GLAPIENTRY * PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum* mode, const GLsizei *count, GLenum type, const GLvoid * const *indices, GLsizei primcount, GLint modestride);\r\n\r\n#define glMultiModeDrawArraysIBM GLEW_GET_FUN(__glewMultiModeDrawArraysIBM)\r\n#define glMultiModeDrawElementsIBM GLEW_GET_FUN(__glewMultiModeDrawElementsIBM)\r\n\r\n#define GLEW_IBM_multimode_draw_arrays GLEW_GET_VAR(__GLEW_IBM_multimode_draw_arrays)\r\n\r\n#endif /* GL_IBM_multimode_draw_arrays */\r\n\r\n/* ------------------------- GL_IBM_rasterpos_clip ------------------------- */\r\n\r\n#ifndef GL_IBM_rasterpos_clip\r\n#define GL_IBM_rasterpos_clip 1\r\n\r\n#define GL_RASTER_POSITION_UNCLIPPED_IBM 103010\r\n\r\n#define GLEW_IBM_rasterpos_clip GLEW_GET_VAR(__GLEW_IBM_rasterpos_clip)\r\n\r\n#endif /* GL_IBM_rasterpos_clip */\r\n\r\n/* --------------------------- GL_IBM_static_data -------------------------- */\r\n\r\n#ifndef GL_IBM_static_data\r\n#define GL_IBM_static_data 1\r\n\r\n#define GL_ALL_STATIC_DATA_IBM 103060\r\n#define GL_STATIC_VERTEX_ARRAY_IBM 103061\r\n\r\n#define GLEW_IBM_static_data GLEW_GET_VAR(__GLEW_IBM_static_data)\r\n\r\n#endif /* GL_IBM_static_data */\r\n\r\n/* --------------------- GL_IBM_texture_mirrored_repeat -------------------- */\r\n\r\n#ifndef GL_IBM_texture_mirrored_repeat\r\n#define GL_IBM_texture_mirrored_repeat 1\r\n\r\n#define GL_MIRRORED_REPEAT_IBM 0x8370\r\n\r\n#define GLEW_IBM_texture_mirrored_repeat GLEW_GET_VAR(__GLEW_IBM_texture_mirrored_repeat)\r\n\r\n#endif /* GL_IBM_texture_mirrored_repeat */\r\n\r\n/* ----------------------- GL_IBM_vertex_array_lists ----------------------- */\r\n\r\n#ifndef GL_IBM_vertex_array_lists\r\n#define GL_IBM_vertex_array_lists 1\r\n\r\n#define GL_VERTEX_ARRAY_LIST_IBM 103070\r\n#define GL_NORMAL_ARRAY_LIST_IBM 103071\r\n#define GL_COLOR_ARRAY_LIST_IBM 103072\r\n#define GL_INDEX_ARRAY_LIST_IBM 103073\r\n#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074\r\n#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075\r\n#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076\r\n#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077\r\n#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080\r\n#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081\r\n#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082\r\n#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083\r\n#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084\r\n#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085\r\n#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086\r\n#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087\r\n\r\ntypedef void (GLAPIENTRY * PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride);\r\ntypedef void (GLAPIENTRY * PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean ** pointer, GLint ptrstride);\r\ntypedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride);\r\ntypedef void (GLAPIENTRY * PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride);\r\ntypedef void (GLAPIENTRY * PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride);\r\ntypedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride);\r\ntypedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride);\r\n\r\n#define glColorPointerListIBM GLEW_GET_FUN(__glewColorPointerListIBM)\r\n#define glEdgeFlagPointerListIBM GLEW_GET_FUN(__glewEdgeFlagPointerListIBM)\r\n#define glFogCoordPointerListIBM GLEW_GET_FUN(__glewFogCoordPointerListIBM)\r\n#define glIndexPointerListIBM GLEW_GET_FUN(__glewIndexPointerListIBM)\r\n#define glNormalPointerListIBM GLEW_GET_FUN(__glewNormalPointerListIBM)\r\n#define glSecondaryColorPointerListIBM GLEW_GET_FUN(__glewSecondaryColorPointerListIBM)\r\n#define glTexCoordPointerListIBM GLEW_GET_FUN(__glewTexCoordPointerListIBM)\r\n#define glVertexPointerListIBM GLEW_GET_FUN(__glewVertexPointerListIBM)\r\n\r\n#define GLEW_IBM_vertex_array_lists GLEW_GET_VAR(__GLEW_IBM_vertex_array_lists)\r\n\r\n#endif /* GL_IBM_vertex_array_lists */\r\n\r\n/* -------------------------- GL_INGR_color_clamp -------------------------- */\r\n\r\n#ifndef GL_INGR_color_clamp\r\n#define GL_INGR_color_clamp 1\r\n\r\n#define GL_RED_MIN_CLAMP_INGR 0x8560\r\n#define GL_GREEN_MIN_CLAMP_INGR 0x8561\r\n#define GL_BLUE_MIN_CLAMP_INGR 0x8562\r\n#define GL_ALPHA_MIN_CLAMP_INGR 0x8563\r\n#define GL_RED_MAX_CLAMP_INGR 0x8564\r\n#define GL_GREEN_MAX_CLAMP_INGR 0x8565\r\n#define GL_BLUE_MAX_CLAMP_INGR 0x8566\r\n#define GL_ALPHA_MAX_CLAMP_INGR 0x8567\r\n\r\n#define GLEW_INGR_color_clamp GLEW_GET_VAR(__GLEW_INGR_color_clamp)\r\n\r\n#endif /* GL_INGR_color_clamp */\r\n\r\n/* ------------------------- GL_INGR_interlace_read ------------------------ */\r\n\r\n#ifndef GL_INGR_interlace_read\r\n#define GL_INGR_interlace_read 1\r\n\r\n#define GL_INTERLACE_READ_INGR 0x8568\r\n\r\n#define GLEW_INGR_interlace_read GLEW_GET_VAR(__GLEW_INGR_interlace_read)\r\n\r\n#endif /* GL_INGR_interlace_read */\r\n\r\n/* ------------------------ GL_INTEL_parallel_arrays ----------------------- */\r\n\r\n#ifndef GL_INTEL_parallel_arrays\r\n#define GL_INTEL_parallel_arrays 1\r\n\r\n#define GL_PARALLEL_ARRAYS_INTEL 0x83F4\r\n#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5\r\n#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6\r\n#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7\r\n#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8\r\n\r\ntypedef void (GLAPIENTRY * PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer);\r\ntypedef void (GLAPIENTRY * PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const void** pointer);\r\ntypedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer);\r\n\r\n#define glColorPointervINTEL GLEW_GET_FUN(__glewColorPointervINTEL)\r\n#define glNormalPointervINTEL GLEW_GET_FUN(__glewNormalPointervINTEL)\r\n#define glTexCoordPointervINTEL GLEW_GET_FUN(__glewTexCoordPointervINTEL)\r\n#define glVertexPointervINTEL GLEW_GET_FUN(__glewVertexPointervINTEL)\r\n\r\n#define GLEW_INTEL_parallel_arrays GLEW_GET_VAR(__GLEW_INTEL_parallel_arrays)\r\n\r\n#endif /* GL_INTEL_parallel_arrays */\r\n\r\n/* ------------------------ GL_INTEL_texture_scissor ----------------------- */\r\n\r\n#ifndef GL_INTEL_texture_scissor\r\n#define GL_INTEL_texture_scissor 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLTEXSCISSORFUNCINTELPROC) (GLenum target, GLenum lfunc, GLenum hfunc);\r\ntypedef void (GLAPIENTRY * PFNGLTEXSCISSORINTELPROC) (GLenum target, GLclampf tlow, GLclampf thigh);\r\n\r\n#define glTexScissorFuncINTEL GLEW_GET_FUN(__glewTexScissorFuncINTEL)\r\n#define glTexScissorINTEL GLEW_GET_FUN(__glewTexScissorINTEL)\r\n\r\n#define GLEW_INTEL_texture_scissor GLEW_GET_VAR(__GLEW_INTEL_texture_scissor)\r\n\r\n#endif /* GL_INTEL_texture_scissor */\r\n\r\n/* -------------------------- GL_KTX_buffer_region ------------------------- */\r\n\r\n#ifndef GL_KTX_buffer_region\r\n#define GL_KTX_buffer_region 1\r\n\r\n#define GL_KTX_FRONT_REGION 0x0\r\n#define GL_KTX_BACK_REGION 0x1\r\n#define GL_KTX_Z_REGION 0x2\r\n#define GL_KTX_STENCIL_REGION 0x3\r\n\r\ntypedef GLuint (GLAPIENTRY * PFNGLBUFFERREGIONENABLEDEXTPROC) (void);\r\ntypedef void (GLAPIENTRY * PFNGLDELETEBUFFERREGIONEXTPROC) (GLenum region);\r\ntypedef void (GLAPIENTRY * PFNGLDRAWBUFFERREGIONEXTPROC) (GLuint region, GLint x, GLint y, GLsizei width, GLsizei height, GLint xDest, GLint yDest);\r\ntypedef GLuint (GLAPIENTRY * PFNGLNEWBUFFERREGIONEXTPROC) (GLenum region);\r\ntypedef void (GLAPIENTRY * PFNGLREADBUFFERREGIONEXTPROC) (GLuint region, GLint x, GLint y, GLsizei width, GLsizei height);\r\n\r\n#define glBufferRegionEnabledEXT GLEW_GET_FUN(__glewBufferRegionEnabledEXT)\r\n#define glDeleteBufferRegionEXT GLEW_GET_FUN(__glewDeleteBufferRegionEXT)\r\n#define glDrawBufferRegionEXT GLEW_GET_FUN(__glewDrawBufferRegionEXT)\r\n#define glNewBufferRegionEXT GLEW_GET_FUN(__glewNewBufferRegionEXT)\r\n#define glReadBufferRegionEXT GLEW_GET_FUN(__glewReadBufferRegionEXT)\r\n\r\n#define GLEW_KTX_buffer_region GLEW_GET_VAR(__GLEW_KTX_buffer_region)\r\n\r\n#endif /* GL_KTX_buffer_region */\r\n\r\n/* ------------------------- GL_MESAX_texture_stack ------------------------ */\r\n\r\n#ifndef GL_MESAX_texture_stack\r\n#define GL_MESAX_texture_stack 1\r\n\r\n#define GL_TEXTURE_1D_STACK_MESAX 0x8759\r\n#define GL_TEXTURE_2D_STACK_MESAX 0x875A\r\n#define GL_PROXY_TEXTURE_1D_STACK_MESAX 0x875B\r\n#define GL_PROXY_TEXTURE_2D_STACK_MESAX 0x875C\r\n#define GL_TEXTURE_1D_STACK_BINDING_MESAX 0x875D\r\n#define GL_TEXTURE_2D_STACK_BINDING_MESAX 0x875E\r\n\r\n#define GLEW_MESAX_texture_stack GLEW_GET_VAR(__GLEW_MESAX_texture_stack)\r\n\r\n#endif /* GL_MESAX_texture_stack */\r\n\r\n/* -------------------------- GL_MESA_pack_invert -------------------------- */\r\n\r\n#ifndef GL_MESA_pack_invert\r\n#define GL_MESA_pack_invert 1\r\n\r\n#define GL_PACK_INVERT_MESA 0x8758\r\n\r\n#define GLEW_MESA_pack_invert GLEW_GET_VAR(__GLEW_MESA_pack_invert)\r\n\r\n#endif /* GL_MESA_pack_invert */\r\n\r\n/* ------------------------- GL_MESA_resize_buffers ------------------------ */\r\n\r\n#ifndef GL_MESA_resize_buffers\r\n#define GL_MESA_resize_buffers 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLRESIZEBUFFERSMESAPROC) (void);\r\n\r\n#define glResizeBuffersMESA GLEW_GET_FUN(__glewResizeBuffersMESA)\r\n\r\n#define GLEW_MESA_resize_buffers GLEW_GET_VAR(__GLEW_MESA_resize_buffers)\r\n\r\n#endif /* GL_MESA_resize_buffers */\r\n\r\n/* --------------------------- GL_MESA_window_pos -------------------------- */\r\n\r\n#ifndef GL_MESA_window_pos\r\n#define GL_MESA_window_pos 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble* p);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat* p);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVMESAPROC) (const GLint* p);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVMESAPROC) (const GLshort* p);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble* p);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat* p);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVMESAPROC) (const GLint* p);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVMESAPROC) (const GLshort* p);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble* p);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat* p);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS4IVMESAPROC) (const GLint* p);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w);\r\ntypedef void (GLAPIENTRY * PFNGLWINDOWPOS4SVMESAPROC) (const GLshort* p);\r\n\r\n#define glWindowPos2dMESA GLEW_GET_FUN(__glewWindowPos2dMESA)\r\n#define glWindowPos2dvMESA GLEW_GET_FUN(__glewWindowPos2dvMESA)\r\n#define glWindowPos2fMESA GLEW_GET_FUN(__glewWindowPos2fMESA)\r\n#define glWindowPos2fvMESA GLEW_GET_FUN(__glewWindowPos2fvMESA)\r\n#define glWindowPos2iMESA GLEW_GET_FUN(__glewWindowPos2iMESA)\r\n#define glWindowPos2ivMESA GLEW_GET_FUN(__glewWindowPos2ivMESA)\r\n#define glWindowPos2sMESA GLEW_GET_FUN(__glewWindowPos2sMESA)\r\n#define glWindowPos2svMESA GLEW_GET_FUN(__glewWindowPos2svMESA)\r\n#define glWindowPos3dMESA GLEW_GET_FUN(__glewWindowPos3dMESA)\r\n#define glWindowPos3dvMESA GLEW_GET_FUN(__glewWindowPos3dvMESA)\r\n#define glWindowPos3fMESA GLEW_GET_FUN(__glewWindowPos3fMESA)\r\n#define glWindowPos3fvMESA GLEW_GET_FUN(__glewWindowPos3fvMESA)\r\n#define glWindowPos3iMESA GLEW_GET_FUN(__glewWindowPos3iMESA)\r\n#define glWindowPos3ivMESA GLEW_GET_FUN(__glewWindowPos3ivMESA)\r\n#define glWindowPos3sMESA GLEW_GET_FUN(__glewWindowPos3sMESA)\r\n#define glWindowPos3svMESA GLEW_GET_FUN(__glewWindowPos3svMESA)\r\n#define glWindowPos4dMESA GLEW_GET_FUN(__glewWindowPos4dMESA)\r\n#define glWindowPos4dvMESA GLEW_GET_FUN(__glewWindowPos4dvMESA)\r\n#define glWindowPos4fMESA GLEW_GET_FUN(__glewWindowPos4fMESA)\r\n#define glWindowPos4fvMESA GLEW_GET_FUN(__glewWindowPos4fvMESA)\r\n#define glWindowPos4iMESA GLEW_GET_FUN(__glewWindowPos4iMESA)\r\n#define glWindowPos4ivMESA GLEW_GET_FUN(__glewWindowPos4ivMESA)\r\n#define glWindowPos4sMESA GLEW_GET_FUN(__glewWindowPos4sMESA)\r\n#define glWindowPos4svMESA GLEW_GET_FUN(__glewWindowPos4svMESA)\r\n\r\n#define GLEW_MESA_window_pos GLEW_GET_VAR(__GLEW_MESA_window_pos)\r\n\r\n#endif /* GL_MESA_window_pos */\r\n\r\n/* ------------------------- GL_MESA_ycbcr_texture ------------------------- */\r\n\r\n#ifndef GL_MESA_ycbcr_texture\r\n#define GL_MESA_ycbcr_texture 1\r\n\r\n#define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA\r\n#define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB\r\n#define GL_YCBCR_MESA 0x8757\r\n\r\n#define GLEW_MESA_ycbcr_texture GLEW_GET_VAR(__GLEW_MESA_ycbcr_texture)\r\n\r\n#endif /* GL_MESA_ycbcr_texture */\r\n\r\n/* --------------------------- GL_NV_blend_square -------------------------- */\r\n\r\n#ifndef GL_NV_blend_square\r\n#define GL_NV_blend_square 1\r\n\r\n#define GLEW_NV_blend_square GLEW_GET_VAR(__GLEW_NV_blend_square)\r\n\r\n#endif /* GL_NV_blend_square */\r\n\r\n/* ------------------------ GL_NV_conditional_render ----------------------- */\r\n\r\n#ifndef GL_NV_conditional_render\r\n#define GL_NV_conditional_render 1\r\n\r\n#define GL_QUERY_WAIT_NV 0x8E13\r\n#define GL_QUERY_NO_WAIT_NV 0x8E14\r\n#define GL_QUERY_BY_REGION_WAIT_NV 0x8E15\r\n#define GL_QUERY_BY_REGION_NO_WAIT_NV 0x8E16\r\n\r\ntypedef void (GLAPIENTRY * PFNGLBEGINCONDITIONALRENDERNVPROC) (GLuint id, GLenum mode);\r\ntypedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERNVPROC) (void);\r\n\r\n#define glBeginConditionalRenderNV GLEW_GET_FUN(__glewBeginConditionalRenderNV)\r\n#define glEndConditionalRenderNV GLEW_GET_FUN(__glewEndConditionalRenderNV)\r\n\r\n#define GLEW_NV_conditional_render GLEW_GET_VAR(__GLEW_NV_conditional_render)\r\n\r\n#endif /* GL_NV_conditional_render */\r\n\r\n/* ----------------------- GL_NV_copy_depth_to_color ----------------------- */\r\n\r\n#ifndef GL_NV_copy_depth_to_color\r\n#define GL_NV_copy_depth_to_color 1\r\n\r\n#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E\r\n#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F\r\n\r\n#define GLEW_NV_copy_depth_to_color GLEW_GET_VAR(__GLEW_NV_copy_depth_to_color)\r\n\r\n#endif /* GL_NV_copy_depth_to_color */\r\n\r\n/* ---------------------------- GL_NV_copy_image --------------------------- */\r\n\r\n#ifndef GL_NV_copy_image\r\n#define GL_NV_copy_image 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLCOPYIMAGESUBDATANVPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth);\r\n\r\n#define glCopyImageSubDataNV GLEW_GET_FUN(__glewCopyImageSubDataNV)\r\n\r\n#define GLEW_NV_copy_image GLEW_GET_VAR(__GLEW_NV_copy_image)\r\n\r\n#endif /* GL_NV_copy_image */\r\n\r\n/* ------------------------ GL_NV_depth_buffer_float ----------------------- */\r\n\r\n#ifndef GL_NV_depth_buffer_float\r\n#define GL_NV_depth_buffer_float 1\r\n\r\n#define GL_DEPTH_COMPONENT32F_NV 0x8DAB\r\n#define GL_DEPTH32F_STENCIL8_NV 0x8DAC\r\n#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV 0x8DAD\r\n#define GL_DEPTH_BUFFER_FLOAT_MODE_NV 0x8DAF\r\n\r\ntypedef void (GLAPIENTRY * PFNGLCLEARDEPTHDNVPROC) (GLdouble depth);\r\ntypedef void (GLAPIENTRY * PFNGLDEPTHBOUNDSDNVPROC) (GLdouble zmin, GLdouble zmax);\r\ntypedef void (GLAPIENTRY * PFNGLDEPTHRANGEDNVPROC) (GLdouble zNear, GLdouble zFar);\r\n\r\n#define glClearDepthdNV GLEW_GET_FUN(__glewClearDepthdNV)\r\n#define glDepthBoundsdNV GLEW_GET_FUN(__glewDepthBoundsdNV)\r\n#define glDepthRangedNV GLEW_GET_FUN(__glewDepthRangedNV)\r\n\r\n#define GLEW_NV_depth_buffer_float GLEW_GET_VAR(__GLEW_NV_depth_buffer_float)\r\n\r\n#endif /* GL_NV_depth_buffer_float */\r\n\r\n/* --------------------------- GL_NV_depth_clamp --------------------------- */\r\n\r\n#ifndef GL_NV_depth_clamp\r\n#define GL_NV_depth_clamp 1\r\n\r\n#define GL_DEPTH_CLAMP_NV 0x864F\r\n\r\n#define GLEW_NV_depth_clamp GLEW_GET_VAR(__GLEW_NV_depth_clamp)\r\n\r\n#endif /* GL_NV_depth_clamp */\r\n\r\n/* ---------------------- GL_NV_depth_range_unclamped ---------------------- */\r\n\r\n#ifndef GL_NV_depth_range_unclamped\r\n#define GL_NV_depth_range_unclamped 1\r\n\r\n#define GL_SAMPLE_COUNT_BITS_NV 0x8864\r\n#define GL_CURRENT_SAMPLE_COUNT_QUERY_NV 0x8865\r\n#define GL_QUERY_RESULT_NV 0x8866\r\n#define GL_QUERY_RESULT_AVAILABLE_NV 0x8867\r\n#define GL_SAMPLE_COUNT_NV 0x8914\r\n\r\n#define GLEW_NV_depth_range_unclamped GLEW_GET_VAR(__GLEW_NV_depth_range_unclamped)\r\n\r\n#endif /* GL_NV_depth_range_unclamped */\r\n\r\n/* ---------------------------- GL_NV_evaluators --------------------------- */\r\n\r\n#ifndef GL_NV_evaluators\r\n#define GL_NV_evaluators 1\r\n\r\n#define GL_EVAL_2D_NV 0x86C0\r\n#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1\r\n#define GL_MAP_TESSELLATION_NV 0x86C2\r\n#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3\r\n#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4\r\n#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5\r\n#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6\r\n#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7\r\n#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8\r\n#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9\r\n#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA\r\n#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB\r\n#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC\r\n#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD\r\n#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE\r\n#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF\r\n#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0\r\n#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1\r\n#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2\r\n#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3\r\n#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4\r\n#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5\r\n#define GL_MAX_MAP_TESSELLATION_NV 0x86D6\r\n#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7\r\n\r\ntypedef void (GLAPIENTRY * PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode);\r\ntypedef void (GLAPIENTRY * PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void* points);\r\ntypedef void (GLAPIENTRY * PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void* points);\r\ntypedef void (GLAPIENTRY * PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint* params);\r\n\r\n#define glEvalMapsNV GLEW_GET_FUN(__glewEvalMapsNV)\r\n#define glGetMapAttribParameterfvNV GLEW_GET_FUN(__glewGetMapAttribParameterfvNV)\r\n#define glGetMapAttribParameterivNV GLEW_GET_FUN(__glewGetMapAttribParameterivNV)\r\n#define glGetMapControlPointsNV GLEW_GET_FUN(__glewGetMapControlPointsNV)\r\n#define glGetMapParameterfvNV GLEW_GET_FUN(__glewGetMapParameterfvNV)\r\n#define glGetMapParameterivNV GLEW_GET_FUN(__glewGetMapParameterivNV)\r\n#define glMapControlPointsNV GLEW_GET_FUN(__glewMapControlPointsNV)\r\n#define glMapParameterfvNV GLEW_GET_FUN(__glewMapParameterfvNV)\r\n#define glMapParameterivNV GLEW_GET_FUN(__glewMapParameterivNV)\r\n\r\n#define GLEW_NV_evaluators GLEW_GET_VAR(__GLEW_NV_evaluators)\r\n\r\n#endif /* GL_NV_evaluators */\r\n\r\n/* ----------------------- GL_NV_explicit_multisample ---------------------- */\r\n\r\n#ifndef GL_NV_explicit_multisample\r\n#define GL_NV_explicit_multisample 1\r\n\r\n#define GL_SAMPLE_POSITION_NV 0x8E50\r\n#define GL_SAMPLE_MASK_NV 0x8E51\r\n#define GL_SAMPLE_MASK_VALUE_NV 0x8E52\r\n#define GL_TEXTURE_BINDING_RENDERBUFFER_NV 0x8E53\r\n#define GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV 0x8E54\r\n#define GL_TEXTURE_RENDERBUFFER_NV 0x8E55\r\n#define GL_SAMPLER_RENDERBUFFER_NV 0x8E56\r\n#define GL_INT_SAMPLER_RENDERBUFFER_NV 0x8E57\r\n#define GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV 0x8E58\r\n#define GL_MAX_SAMPLE_MASK_WORDS_NV 0x8E59\r\n\r\ntypedef void (GLAPIENTRY * PFNGLGETMULTISAMPLEFVNVPROC) (GLenum pname, GLuint index, GLfloat* val);\r\ntypedef void (GLAPIENTRY * PFNGLSAMPLEMASKINDEXEDNVPROC) (GLuint index, GLbitfield mask);\r\ntypedef void (GLAPIENTRY * PFNGLTEXRENDERBUFFERNVPROC) (GLenum target, GLuint renderbuffer);\r\n\r\n#define glGetMultisamplefvNV GLEW_GET_FUN(__glewGetMultisamplefvNV)\r\n#define glSampleMaskIndexedNV GLEW_GET_FUN(__glewSampleMaskIndexedNV)\r\n#define glTexRenderbufferNV GLEW_GET_FUN(__glewTexRenderbufferNV)\r\n\r\n#define GLEW_NV_explicit_multisample GLEW_GET_VAR(__GLEW_NV_explicit_multisample)\r\n\r\n#endif /* GL_NV_explicit_multisample */\r\n\r\n/* ------------------------------ GL_NV_fence ------------------------------ */\r\n\r\n#ifndef GL_NV_fence\r\n#define GL_NV_fence 1\r\n\r\n#define GL_ALL_COMPLETED_NV 0x84F2\r\n#define GL_FENCE_STATUS_NV 0x84F3\r\n#define GL_FENCE_CONDITION_NV 0x84F4\r\n\r\ntypedef void (GLAPIENTRY * PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint* fences);\r\ntypedef void (GLAPIENTRY * PFNGLFINISHFENCENVPROC) (GLuint fence);\r\ntypedef void (GLAPIENTRY * PFNGLGENFENCESNVPROC) (GLsizei n, GLuint* fences);\r\ntypedef void (GLAPIENTRY * PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint* params);\r\ntypedef GLboolean (GLAPIENTRY * PFNGLISFENCENVPROC) (GLuint fence);\r\ntypedef void (GLAPIENTRY * PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition);\r\ntypedef GLboolean (GLAPIENTRY * PFNGLTESTFENCENVPROC) (GLuint fence);\r\n\r\n#define glDeleteFencesNV GLEW_GET_FUN(__glewDeleteFencesNV)\r\n#define glFinishFenceNV GLEW_GET_FUN(__glewFinishFenceNV)\r\n#define glGenFencesNV GLEW_GET_FUN(__glewGenFencesNV)\r\n#define glGetFenceivNV GLEW_GET_FUN(__glewGetFenceivNV)\r\n#define glIsFenceNV GLEW_GET_FUN(__glewIsFenceNV)\r\n#define glSetFenceNV GLEW_GET_FUN(__glewSetFenceNV)\r\n#define glTestFenceNV GLEW_GET_FUN(__glewTestFenceNV)\r\n\r\n#define GLEW_NV_fence GLEW_GET_VAR(__GLEW_NV_fence)\r\n\r\n#endif /* GL_NV_fence */\r\n\r\n/* --------------------------- GL_NV_float_buffer -------------------------- */\r\n\r\n#ifndef GL_NV_float_buffer\r\n#define GL_NV_float_buffer 1\r\n\r\n#define GL_FLOAT_R_NV 0x8880\r\n#define GL_FLOAT_RG_NV 0x8881\r\n#define GL_FLOAT_RGB_NV 0x8882\r\n#define GL_FLOAT_RGBA_NV 0x8883\r\n#define GL_FLOAT_R16_NV 0x8884\r\n#define GL_FLOAT_R32_NV 0x8885\r\n#define GL_FLOAT_RG16_NV 0x8886\r\n#define GL_FLOAT_RG32_NV 0x8887\r\n#define GL_FLOAT_RGB16_NV 0x8888\r\n#define GL_FLOAT_RGB32_NV 0x8889\r\n#define GL_FLOAT_RGBA16_NV 0x888A\r\n#define GL_FLOAT_RGBA32_NV 0x888B\r\n#define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C\r\n#define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D\r\n#define GL_FLOAT_RGBA_MODE_NV 0x888E\r\n\r\n#define GLEW_NV_float_buffer GLEW_GET_VAR(__GLEW_NV_float_buffer)\r\n\r\n#endif /* GL_NV_float_buffer */\r\n\r\n/* --------------------------- GL_NV_fog_distance -------------------------- */\r\n\r\n#ifndef GL_NV_fog_distance\r\n#define GL_NV_fog_distance 1\r\n\r\n#define GL_FOG_DISTANCE_MODE_NV 0x855A\r\n#define GL_EYE_RADIAL_NV 0x855B\r\n#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C\r\n\r\n#define GLEW_NV_fog_distance GLEW_GET_VAR(__GLEW_NV_fog_distance)\r\n\r\n#endif /* GL_NV_fog_distance */\r\n\r\n/* ------------------------- GL_NV_fragment_program ------------------------ */\r\n\r\n#ifndef GL_NV_fragment_program\r\n#define GL_NV_fragment_program 1\r\n\r\n#define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868\r\n#define GL_FRAGMENT_PROGRAM_NV 0x8870\r\n#define GL_MAX_TEXTURE_COORDS_NV 0x8871\r\n#define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872\r\n#define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873\r\n#define GL_PROGRAM_ERROR_STRING_NV 0x8874\r\n\r\ntypedef void (GLAPIENTRY * PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLdouble *params);\r\ntypedef void (GLAPIENTRY * PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLfloat *params);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, const GLdouble v[]);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, const GLfloat v[]);\r\n\r\n#define glGetProgramNamedParameterdvNV GLEW_GET_FUN(__glewGetProgramNamedParameterdvNV)\r\n#define glGetProgramNamedParameterfvNV GLEW_GET_FUN(__glewGetProgramNamedParameterfvNV)\r\n#define glProgramNamedParameter4dNV GLEW_GET_FUN(__glewProgramNamedParameter4dNV)\r\n#define glProgramNamedParameter4dvNV GLEW_GET_FUN(__glewProgramNamedParameter4dvNV)\r\n#define glProgramNamedParameter4fNV GLEW_GET_FUN(__glewProgramNamedParameter4fNV)\r\n#define glProgramNamedParameter4fvNV GLEW_GET_FUN(__glewProgramNamedParameter4fvNV)\r\n\r\n#define GLEW_NV_fragment_program GLEW_GET_VAR(__GLEW_NV_fragment_program)\r\n\r\n#endif /* GL_NV_fragment_program */\r\n\r\n/* ------------------------ GL_NV_fragment_program2 ------------------------ */\r\n\r\n#ifndef GL_NV_fragment_program2\r\n#define GL_NV_fragment_program2 1\r\n\r\n#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4\r\n#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5\r\n#define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6\r\n#define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7\r\n#define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8\r\n\r\n#define GLEW_NV_fragment_program2 GLEW_GET_VAR(__GLEW_NV_fragment_program2)\r\n\r\n#endif /* GL_NV_fragment_program2 */\r\n\r\n/* ------------------------ GL_NV_fragment_program4 ------------------------ */\r\n\r\n#ifndef GL_NV_fragment_program4\r\n#define GL_NV_fragment_program4 1\r\n\r\n#define GLEW_NV_fragment_program4 GLEW_GET_VAR(__GLEW_NV_fragment_program4)\r\n\r\n#endif /* GL_NV_fragment_program4 */\r\n\r\n/* --------------------- GL_NV_fragment_program_option --------------------- */\r\n\r\n#ifndef GL_NV_fragment_program_option\r\n#define GL_NV_fragment_program_option 1\r\n\r\n#define GLEW_NV_fragment_program_option GLEW_GET_VAR(__GLEW_NV_fragment_program_option)\r\n\r\n#endif /* GL_NV_fragment_program_option */\r\n\r\n/* ----------------- GL_NV_framebuffer_multisample_coverage ---------------- */\r\n\r\n#ifndef GL_NV_framebuffer_multisample_coverage\r\n#define GL_NV_framebuffer_multisample_coverage 1\r\n\r\n#define GL_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB\r\n#define GL_RENDERBUFFER_COLOR_SAMPLES_NV 0x8E10\r\n#define GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E11\r\n#define GL_MULTISAMPLE_COVERAGE_MODES_NV 0x8E12\r\n\r\ntypedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height);\r\n\r\n#define glRenderbufferStorageMultisampleCoverageNV GLEW_GET_FUN(__glewRenderbufferStorageMultisampleCoverageNV)\r\n\r\n#define GLEW_NV_framebuffer_multisample_coverage GLEW_GET_VAR(__GLEW_NV_framebuffer_multisample_coverage)\r\n\r\n#endif /* GL_NV_framebuffer_multisample_coverage */\r\n\r\n/* ------------------------ GL_NV_geometry_program4 ------------------------ */\r\n\r\n#ifndef GL_NV_geometry_program4\r\n#define GL_NV_geometry_program4 1\r\n\r\n#define GL_GEOMETRY_PROGRAM_NV 0x8C26\r\n#define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27\r\n#define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28\r\n\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMVERTEXLIMITNVPROC) (GLenum target, GLint limit);\r\n\r\n#define glProgramVertexLimitNV GLEW_GET_FUN(__glewProgramVertexLimitNV)\r\n\r\n#define GLEW_NV_geometry_program4 GLEW_GET_VAR(__GLEW_NV_geometry_program4)\r\n\r\n#endif /* GL_NV_geometry_program4 */\r\n\r\n/* ------------------------- GL_NV_geometry_shader4 ------------------------ */\r\n\r\n#ifndef GL_NV_geometry_shader4\r\n#define GL_NV_geometry_shader4 1\r\n\r\n#define GLEW_NV_geometry_shader4 GLEW_GET_VAR(__GLEW_NV_geometry_shader4)\r\n\r\n#endif /* GL_NV_geometry_shader4 */\r\n\r\n/* --------------------------- GL_NV_gpu_program4 -------------------------- */\r\n\r\n#ifndef GL_NV_gpu_program4\r\n#define GL_NV_gpu_program4 1\r\n\r\n#define GL_MIN_PROGRAM_TEXEL_OFFSET_NV 0x8904\r\n#define GL_MAX_PROGRAM_TEXEL_OFFSET_NV 0x8905\r\n#define GL_PROGRAM_ATTRIB_COMPONENTS_NV 0x8906\r\n#define GL_PROGRAM_RESULT_COMPONENTS_NV 0x8907\r\n#define GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV 0x8908\r\n#define GL_MAX_PROGRAM_RESULT_COMPONENTS_NV 0x8909\r\n#define GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV 0x8DA5\r\n#define GL_MAX_PROGRAM_GENERIC_RESULTS_NV 0x8DA6\r\n\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params);\r\n\r\n#define glProgramEnvParameterI4iNV GLEW_GET_FUN(__glewProgramEnvParameterI4iNV)\r\n#define glProgramEnvParameterI4ivNV GLEW_GET_FUN(__glewProgramEnvParameterI4ivNV)\r\n#define glProgramEnvParameterI4uiNV GLEW_GET_FUN(__glewProgramEnvParameterI4uiNV)\r\n#define glProgramEnvParameterI4uivNV GLEW_GET_FUN(__glewProgramEnvParameterI4uivNV)\r\n#define glProgramEnvParametersI4ivNV GLEW_GET_FUN(__glewProgramEnvParametersI4ivNV)\r\n#define glProgramEnvParametersI4uivNV GLEW_GET_FUN(__glewProgramEnvParametersI4uivNV)\r\n#define glProgramLocalParameterI4iNV GLEW_GET_FUN(__glewProgramLocalParameterI4iNV)\r\n#define glProgramLocalParameterI4ivNV GLEW_GET_FUN(__glewProgramLocalParameterI4ivNV)\r\n#define glProgramLocalParameterI4uiNV GLEW_GET_FUN(__glewProgramLocalParameterI4uiNV)\r\n#define glProgramLocalParameterI4uivNV GLEW_GET_FUN(__glewProgramLocalParameterI4uivNV)\r\n#define glProgramLocalParametersI4ivNV GLEW_GET_FUN(__glewProgramLocalParametersI4ivNV)\r\n#define glProgramLocalParametersI4uivNV GLEW_GET_FUN(__glewProgramLocalParametersI4uivNV)\r\n\r\n#define GLEW_NV_gpu_program4 GLEW_GET_VAR(__GLEW_NV_gpu_program4)\r\n\r\n#endif /* GL_NV_gpu_program4 */\r\n\r\n/* ---------------------------- GL_NV_half_float --------------------------- */\r\n\r\n#ifndef GL_NV_half_float\r\n#define GL_NV_half_float 1\r\n\r\n#define GL_HALF_FLOAT_NV 0x140B\r\n\r\ntypedef unsigned short GLhalf;\r\n\r\ntypedef void (GLAPIENTRY * PFNGLCOLOR3HNVPROC) (GLhalf red, GLhalf green, GLhalf blue);\r\ntypedef void (GLAPIENTRY * PFNGLCOLOR3HVNVPROC) (const GLhalf* v);\r\ntypedef void (GLAPIENTRY * PFNGLCOLOR4HNVPROC) (GLhalf red, GLhalf green, GLhalf blue, GLhalf alpha);\r\ntypedef void (GLAPIENTRY * PFNGLCOLOR4HVNVPROC) (const GLhalf* v);\r\ntypedef void (GLAPIENTRY * PFNGLFOGCOORDHNVPROC) (GLhalf fog);\r\ntypedef void (GLAPIENTRY * PFNGLFOGCOORDHVNVPROC) (const GLhalf* fog);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalf s);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalf* v);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalf s, GLhalf t);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalf* v);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalf s, GLhalf t, GLhalf r);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalf* v);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalf s, GLhalf t, GLhalf r, GLhalf q);\r\ntypedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalf* v);\r\ntypedef void (GLAPIENTRY * PFNGLNORMAL3HNVPROC) (GLhalf nx, GLhalf ny, GLhalf nz);\r\ntypedef void (GLAPIENTRY * PFNGLNORMAL3HVNVPROC) (const GLhalf* v);\r\ntypedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3HNVPROC) (GLhalf red, GLhalf green, GLhalf blue);\r\ntypedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalf* v);\r\ntypedef void (GLAPIENTRY * PFNGLTEXCOORD1HNVPROC) (GLhalf s);\r\ntypedef void (GLAPIENTRY * PFNGLTEXCOORD1HVNVPROC) (const GLhalf* v);\r\ntypedef void (GLAPIENTRY * PFNGLTEXCOORD2HNVPROC) (GLhalf s, GLhalf t);\r\ntypedef void (GLAPIENTRY * PFNGLTEXCOORD2HVNVPROC) (const GLhalf* v);\r\ntypedef void (GLAPIENTRY * PFNGLTEXCOORD3HNVPROC) (GLhalf s, GLhalf t, GLhalf r);\r\ntypedef void (GLAPIENTRY * PFNGLTEXCOORD3HVNVPROC) (const GLhalf* v);\r\ntypedef void (GLAPIENTRY * PFNGLTEXCOORD4HNVPROC) (GLhalf s, GLhalf t, GLhalf r, GLhalf q);\r\ntypedef void (GLAPIENTRY * PFNGLTEXCOORD4HVNVPROC) (const GLhalf* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEX2HNVPROC) (GLhalf x, GLhalf y);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEX2HVNVPROC) (const GLhalf* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEX3HNVPROC) (GLhalf x, GLhalf y, GLhalf z);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEX3HVNVPROC) (const GLhalf* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEX4HNVPROC) (GLhalf x, GLhalf y, GLhalf z, GLhalf w);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEX4HVNVPROC) (const GLhalf* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalf x);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalf* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalf x, GLhalf y);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalf* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalf x, GLhalf y, GLhalf z);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalf* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalf x, GLhalf y, GLhalf z, GLhalf w);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalf* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTHNVPROC) (GLhalf weight);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalf* weight);\r\n\r\n#define glColor3hNV GLEW_GET_FUN(__glewColor3hNV)\r\n#define glColor3hvNV GLEW_GET_FUN(__glewColor3hvNV)\r\n#define glColor4hNV GLEW_GET_FUN(__glewColor4hNV)\r\n#define glColor4hvNV GLEW_GET_FUN(__glewColor4hvNV)\r\n#define glFogCoordhNV GLEW_GET_FUN(__glewFogCoordhNV)\r\n#define glFogCoordhvNV GLEW_GET_FUN(__glewFogCoordhvNV)\r\n#define glMultiTexCoord1hNV GLEW_GET_FUN(__glewMultiTexCoord1hNV)\r\n#define glMultiTexCoord1hvNV GLEW_GET_FUN(__glewMultiTexCoord1hvNV)\r\n#define glMultiTexCoord2hNV GLEW_GET_FUN(__glewMultiTexCoord2hNV)\r\n#define glMultiTexCoord2hvNV GLEW_GET_FUN(__glewMultiTexCoord2hvNV)\r\n#define glMultiTexCoord3hNV GLEW_GET_FUN(__glewMultiTexCoord3hNV)\r\n#define glMultiTexCoord3hvNV GLEW_GET_FUN(__glewMultiTexCoord3hvNV)\r\n#define glMultiTexCoord4hNV GLEW_GET_FUN(__glewMultiTexCoord4hNV)\r\n#define glMultiTexCoord4hvNV GLEW_GET_FUN(__glewMultiTexCoord4hvNV)\r\n#define glNormal3hNV GLEW_GET_FUN(__glewNormal3hNV)\r\n#define glNormal3hvNV GLEW_GET_FUN(__glewNormal3hvNV)\r\n#define glSecondaryColor3hNV GLEW_GET_FUN(__glewSecondaryColor3hNV)\r\n#define glSecondaryColor3hvNV GLEW_GET_FUN(__glewSecondaryColor3hvNV)\r\n#define glTexCoord1hNV GLEW_GET_FUN(__glewTexCoord1hNV)\r\n#define glTexCoord1hvNV GLEW_GET_FUN(__glewTexCoord1hvNV)\r\n#define glTexCoord2hNV GLEW_GET_FUN(__glewTexCoord2hNV)\r\n#define glTexCoord2hvNV GLEW_GET_FUN(__glewTexCoord2hvNV)\r\n#define glTexCoord3hNV GLEW_GET_FUN(__glewTexCoord3hNV)\r\n#define glTexCoord3hvNV GLEW_GET_FUN(__glewTexCoord3hvNV)\r\n#define glTexCoord4hNV GLEW_GET_FUN(__glewTexCoord4hNV)\r\n#define glTexCoord4hvNV GLEW_GET_FUN(__glewTexCoord4hvNV)\r\n#define glVertex2hNV GLEW_GET_FUN(__glewVertex2hNV)\r\n#define glVertex2hvNV GLEW_GET_FUN(__glewVertex2hvNV)\r\n#define glVertex3hNV GLEW_GET_FUN(__glewVertex3hNV)\r\n#define glVertex3hvNV GLEW_GET_FUN(__glewVertex3hvNV)\r\n#define glVertex4hNV GLEW_GET_FUN(__glewVertex4hNV)\r\n#define glVertex4hvNV GLEW_GET_FUN(__glewVertex4hvNV)\r\n#define glVertexAttrib1hNV GLEW_GET_FUN(__glewVertexAttrib1hNV)\r\n#define glVertexAttrib1hvNV GLEW_GET_FUN(__glewVertexAttrib1hvNV)\r\n#define glVertexAttrib2hNV GLEW_GET_FUN(__glewVertexAttrib2hNV)\r\n#define glVertexAttrib2hvNV GLEW_GET_FUN(__glewVertexAttrib2hvNV)\r\n#define glVertexAttrib3hNV GLEW_GET_FUN(__glewVertexAttrib3hNV)\r\n#define glVertexAttrib3hvNV GLEW_GET_FUN(__glewVertexAttrib3hvNV)\r\n#define glVertexAttrib4hNV GLEW_GET_FUN(__glewVertexAttrib4hNV)\r\n#define glVertexAttrib4hvNV GLEW_GET_FUN(__glewVertexAttrib4hvNV)\r\n#define glVertexAttribs1hvNV GLEW_GET_FUN(__glewVertexAttribs1hvNV)\r\n#define glVertexAttribs2hvNV GLEW_GET_FUN(__glewVertexAttribs2hvNV)\r\n#define glVertexAttribs3hvNV GLEW_GET_FUN(__glewVertexAttribs3hvNV)\r\n#define glVertexAttribs4hvNV GLEW_GET_FUN(__glewVertexAttribs4hvNV)\r\n#define glVertexWeighthNV GLEW_GET_FUN(__glewVertexWeighthNV)\r\n#define glVertexWeighthvNV GLEW_GET_FUN(__glewVertexWeighthvNV)\r\n\r\n#define GLEW_NV_half_float GLEW_GET_VAR(__GLEW_NV_half_float)\r\n\r\n#endif /* GL_NV_half_float */\r\n\r\n/* ------------------------ GL_NV_light_max_exponent ----------------------- */\r\n\r\n#ifndef GL_NV_light_max_exponent\r\n#define GL_NV_light_max_exponent 1\r\n\r\n#define GL_MAX_SHININESS_NV 0x8504\r\n#define GL_MAX_SPOT_EXPONENT_NV 0x8505\r\n\r\n#define GLEW_NV_light_max_exponent GLEW_GET_VAR(__GLEW_NV_light_max_exponent)\r\n\r\n#endif /* GL_NV_light_max_exponent */\r\n\r\n/* --------------------- GL_NV_multisample_filter_hint --------------------- */\r\n\r\n#ifndef GL_NV_multisample_filter_hint\r\n#define GL_NV_multisample_filter_hint 1\r\n\r\n#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534\r\n\r\n#define GLEW_NV_multisample_filter_hint GLEW_GET_VAR(__GLEW_NV_multisample_filter_hint)\r\n\r\n#endif /* GL_NV_multisample_filter_hint */\r\n\r\n/* ------------------------- GL_NV_occlusion_query ------------------------- */\r\n\r\n#ifndef GL_NV_occlusion_query\r\n#define GL_NV_occlusion_query 1\r\n\r\n#define GL_PIXEL_COUNTER_BITS_NV 0x8864\r\n#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865\r\n#define GL_PIXEL_COUNT_NV 0x8866\r\n#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867\r\n\r\ntypedef void (GLAPIENTRY * PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id);\r\ntypedef void (GLAPIENTRY * PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint* ids);\r\ntypedef void (GLAPIENTRY * PFNGLENDOCCLUSIONQUERYNVPROC) (void);\r\ntypedef void (GLAPIENTRY * PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint* ids);\r\ntypedef void (GLAPIENTRY * PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint* params);\r\ntypedef GLboolean (GLAPIENTRY * PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id);\r\n\r\n#define glBeginOcclusionQueryNV GLEW_GET_FUN(__glewBeginOcclusionQueryNV)\r\n#define glDeleteOcclusionQueriesNV GLEW_GET_FUN(__glewDeleteOcclusionQueriesNV)\r\n#define glEndOcclusionQueryNV GLEW_GET_FUN(__glewEndOcclusionQueryNV)\r\n#define glGenOcclusionQueriesNV GLEW_GET_FUN(__glewGenOcclusionQueriesNV)\r\n#define glGetOcclusionQueryivNV GLEW_GET_FUN(__glewGetOcclusionQueryivNV)\r\n#define glGetOcclusionQueryuivNV GLEW_GET_FUN(__glewGetOcclusionQueryuivNV)\r\n#define glIsOcclusionQueryNV GLEW_GET_FUN(__glewIsOcclusionQueryNV)\r\n\r\n#define GLEW_NV_occlusion_query GLEW_GET_VAR(__GLEW_NV_occlusion_query)\r\n\r\n#endif /* GL_NV_occlusion_query */\r\n\r\n/* ----------------------- GL_NV_packed_depth_stencil ---------------------- */\r\n\r\n#ifndef GL_NV_packed_depth_stencil\r\n#define GL_NV_packed_depth_stencil 1\r\n\r\n#define GL_DEPTH_STENCIL_NV 0x84F9\r\n#define GL_UNSIGNED_INT_24_8_NV 0x84FA\r\n\r\n#define GLEW_NV_packed_depth_stencil GLEW_GET_VAR(__GLEW_NV_packed_depth_stencil)\r\n\r\n#endif /* GL_NV_packed_depth_stencil */\r\n\r\n/* --------------------- GL_NV_parameter_buffer_object --------------------- */\r\n\r\n#ifndef GL_NV_parameter_buffer_object\r\n#define GL_NV_parameter_buffer_object 1\r\n\r\n#define GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV 0x8DA0\r\n#define GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV 0x8DA1\r\n#define GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV 0x8DA2\r\n#define GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV 0x8DA3\r\n#define GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV 0x8DA4\r\n\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLint *params);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLuint *params);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLfloat *params);\r\n\r\n#define glProgramBufferParametersIivNV GLEW_GET_FUN(__glewProgramBufferParametersIivNV)\r\n#define glProgramBufferParametersIuivNV GLEW_GET_FUN(__glewProgramBufferParametersIuivNV)\r\n#define glProgramBufferParametersfvNV GLEW_GET_FUN(__glewProgramBufferParametersfvNV)\r\n\r\n#define GLEW_NV_parameter_buffer_object GLEW_GET_VAR(__GLEW_NV_parameter_buffer_object)\r\n\r\n#endif /* GL_NV_parameter_buffer_object */\r\n\r\n/* --------------------- GL_NV_parameter_buffer_object2 -------------------- */\r\n\r\n#ifndef GL_NV_parameter_buffer_object2\r\n#define GL_NV_parameter_buffer_object2 1\r\n\r\n#define GLEW_NV_parameter_buffer_object2 GLEW_GET_VAR(__GLEW_NV_parameter_buffer_object2)\r\n\r\n#endif /* GL_NV_parameter_buffer_object2 */\r\n\r\n/* ------------------------- GL_NV_pixel_data_range ------------------------ */\r\n\r\n#ifndef GL_NV_pixel_data_range\r\n#define GL_NV_pixel_data_range 1\r\n\r\n#define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878\r\n#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879\r\n#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A\r\n#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B\r\n#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C\r\n#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D\r\n\r\ntypedef void (GLAPIENTRY * PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target);\r\ntypedef void (GLAPIENTRY * PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, void* pointer);\r\n\r\n#define glFlushPixelDataRangeNV GLEW_GET_FUN(__glewFlushPixelDataRangeNV)\r\n#define glPixelDataRangeNV GLEW_GET_FUN(__glewPixelDataRangeNV)\r\n\r\n#define GLEW_NV_pixel_data_range GLEW_GET_VAR(__GLEW_NV_pixel_data_range)\r\n\r\n#endif /* GL_NV_pixel_data_range */\r\n\r\n/* --------------------------- GL_NV_point_sprite -------------------------- */\r\n\r\n#ifndef GL_NV_point_sprite\r\n#define GL_NV_point_sprite 1\r\n\r\n#define GL_POINT_SPRITE_NV 0x8861\r\n#define GL_COORD_REPLACE_NV 0x8862\r\n#define GL_POINT_SPRITE_R_MODE_NV 0x8863\r\n\r\ntypedef void (GLAPIENTRY * PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param);\r\ntypedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint* params);\r\n\r\n#define glPointParameteriNV GLEW_GET_FUN(__glewPointParameteriNV)\r\n#define glPointParameterivNV GLEW_GET_FUN(__glewPointParameterivNV)\r\n\r\n#define GLEW_NV_point_sprite GLEW_GET_VAR(__GLEW_NV_point_sprite)\r\n\r\n#endif /* GL_NV_point_sprite */\r\n\r\n/* -------------------------- GL_NV_present_video -------------------------- */\r\n\r\n#ifndef GL_NV_present_video\r\n#define GL_NV_present_video 1\r\n\r\n#define GL_FRAME_NV 0x8E26\r\n#define GL_FIELDS_NV 0x8E27\r\n#define GL_CURRENT_TIME_NV 0x8E28\r\n#define GL_NUM_FILL_STREAMS_NV 0x8E29\r\n#define GL_PRESENT_TIME_NV 0x8E2A\r\n#define GL_PRESENT_DURATION_NV 0x8E2B\r\n\r\ntypedef void (GLAPIENTRY * PFNGLGETVIDEOI64VNVPROC) (GLuint video_slot, GLenum pname, GLint64EXT* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETVIDEOIVNVPROC) (GLuint video_slot, GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETVIDEOUI64VNVPROC) (GLuint video_slot, GLenum pname, GLuint64EXT* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETVIDEOUIVNVPROC) (GLuint video_slot, GLenum pname, GLuint* params);\r\ntypedef void (GLAPIENTRY * PFNGLPRESENTFRAMEDUALFILLNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3);\r\ntypedef void (GLAPIENTRY * PFNGLPRESENTFRAMEKEYEDNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1);\r\n\r\n#define glGetVideoi64vNV GLEW_GET_FUN(__glewGetVideoi64vNV)\r\n#define glGetVideoivNV GLEW_GET_FUN(__glewGetVideoivNV)\r\n#define glGetVideoui64vNV GLEW_GET_FUN(__glewGetVideoui64vNV)\r\n#define glGetVideouivNV GLEW_GET_FUN(__glewGetVideouivNV)\r\n#define glPresentFrameDualFillNV GLEW_GET_FUN(__glewPresentFrameDualFillNV)\r\n#define glPresentFrameKeyedNV GLEW_GET_FUN(__glewPresentFrameKeyedNV)\r\n\r\n#define GLEW_NV_present_video GLEW_GET_VAR(__GLEW_NV_present_video)\r\n\r\n#endif /* GL_NV_present_video */\r\n\r\n/* ------------------------ GL_NV_primitive_restart ------------------------ */\r\n\r\n#ifndef GL_NV_primitive_restart\r\n#define GL_NV_primitive_restart 1\r\n\r\n#define GL_PRIMITIVE_RESTART_NV 0x8558\r\n#define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559\r\n\r\ntypedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index);\r\ntypedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTNVPROC) (void);\r\n\r\n#define glPrimitiveRestartIndexNV GLEW_GET_FUN(__glewPrimitiveRestartIndexNV)\r\n#define glPrimitiveRestartNV GLEW_GET_FUN(__glewPrimitiveRestartNV)\r\n\r\n#define GLEW_NV_primitive_restart GLEW_GET_VAR(__GLEW_NV_primitive_restart)\r\n\r\n#endif /* GL_NV_primitive_restart */\r\n\r\n/* ------------------------ GL_NV_register_combiners ----------------------- */\r\n\r\n#ifndef GL_NV_register_combiners\r\n#define GL_NV_register_combiners 1\r\n\r\n#define GL_REGISTER_COMBINERS_NV 0x8522\r\n#define GL_VARIABLE_A_NV 0x8523\r\n#define GL_VARIABLE_B_NV 0x8524\r\n#define GL_VARIABLE_C_NV 0x8525\r\n#define GL_VARIABLE_D_NV 0x8526\r\n#define GL_VARIABLE_E_NV 0x8527\r\n#define GL_VARIABLE_F_NV 0x8528\r\n#define GL_VARIABLE_G_NV 0x8529\r\n#define GL_CONSTANT_COLOR0_NV 0x852A\r\n#define GL_CONSTANT_COLOR1_NV 0x852B\r\n#define GL_PRIMARY_COLOR_NV 0x852C\r\n#define GL_SECONDARY_COLOR_NV 0x852D\r\n#define GL_SPARE0_NV 0x852E\r\n#define GL_SPARE1_NV 0x852F\r\n#define GL_DISCARD_NV 0x8530\r\n#define GL_E_TIMES_F_NV 0x8531\r\n#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532\r\n#define GL_UNSIGNED_IDENTITY_NV 0x8536\r\n#define GL_UNSIGNED_INVERT_NV 0x8537\r\n#define GL_EXPAND_NORMAL_NV 0x8538\r\n#define GL_EXPAND_NEGATE_NV 0x8539\r\n#define GL_HALF_BIAS_NORMAL_NV 0x853A\r\n#define GL_HALF_BIAS_NEGATE_NV 0x853B\r\n#define GL_SIGNED_IDENTITY_NV 0x853C\r\n#define GL_SIGNED_NEGATE_NV 0x853D\r\n#define GL_SCALE_BY_TWO_NV 0x853E\r\n#define GL_SCALE_BY_FOUR_NV 0x853F\r\n#define GL_SCALE_BY_ONE_HALF_NV 0x8540\r\n#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541\r\n#define GL_COMBINER_INPUT_NV 0x8542\r\n#define GL_COMBINER_MAPPING_NV 0x8543\r\n#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544\r\n#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545\r\n#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546\r\n#define GL_COMBINER_MUX_SUM_NV 0x8547\r\n#define GL_COMBINER_SCALE_NV 0x8548\r\n#define GL_COMBINER_BIAS_NV 0x8549\r\n#define GL_COMBINER_AB_OUTPUT_NV 0x854A\r\n#define GL_COMBINER_CD_OUTPUT_NV 0x854B\r\n#define GL_COMBINER_SUM_OUTPUT_NV 0x854C\r\n#define GL_MAX_GENERAL_COMBINERS_NV 0x854D\r\n#define GL_NUM_GENERAL_COMBINERS_NV 0x854E\r\n#define GL_COLOR_SUM_CLAMP_NV 0x854F\r\n#define GL_COMBINER0_NV 0x8550\r\n#define GL_COMBINER1_NV 0x8551\r\n#define GL_COMBINER2_NV 0x8552\r\n#define GL_COMBINER3_NV 0x8553\r\n#define GL_COMBINER4_NV 0x8554\r\n#define GL_COMBINER5_NV 0x8555\r\n#define GL_COMBINER6_NV 0x8556\r\n#define GL_COMBINER7_NV 0x8557\r\n\r\ntypedef void (GLAPIENTRY * PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage);\r\ntypedef void (GLAPIENTRY * PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum);\r\ntypedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param);\r\ntypedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param);\r\ntypedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage);\r\ntypedef void (GLAPIENTRY * PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint* params);\r\n\r\n#define glCombinerInputNV GLEW_GET_FUN(__glewCombinerInputNV)\r\n#define glCombinerOutputNV GLEW_GET_FUN(__glewCombinerOutputNV)\r\n#define glCombinerParameterfNV GLEW_GET_FUN(__glewCombinerParameterfNV)\r\n#define glCombinerParameterfvNV GLEW_GET_FUN(__glewCombinerParameterfvNV)\r\n#define glCombinerParameteriNV GLEW_GET_FUN(__glewCombinerParameteriNV)\r\n#define glCombinerParameterivNV GLEW_GET_FUN(__glewCombinerParameterivNV)\r\n#define glFinalCombinerInputNV GLEW_GET_FUN(__glewFinalCombinerInputNV)\r\n#define glGetCombinerInputParameterfvNV GLEW_GET_FUN(__glewGetCombinerInputParameterfvNV)\r\n#define glGetCombinerInputParameterivNV GLEW_GET_FUN(__glewGetCombinerInputParameterivNV)\r\n#define glGetCombinerOutputParameterfvNV GLEW_GET_FUN(__glewGetCombinerOutputParameterfvNV)\r\n#define glGetCombinerOutputParameterivNV GLEW_GET_FUN(__glewGetCombinerOutputParameterivNV)\r\n#define glGetFinalCombinerInputParameterfvNV GLEW_GET_FUN(__glewGetFinalCombinerInputParameterfvNV)\r\n#define glGetFinalCombinerInputParameterivNV GLEW_GET_FUN(__glewGetFinalCombinerInputParameterivNV)\r\n\r\n#define GLEW_NV_register_combiners GLEW_GET_VAR(__GLEW_NV_register_combiners)\r\n\r\n#endif /* GL_NV_register_combiners */\r\n\r\n/* ----------------------- GL_NV_register_combiners2 ----------------------- */\r\n\r\n#ifndef GL_NV_register_combiners2\r\n#define GL_NV_register_combiners2 1\r\n\r\n#define GL_PER_STAGE_CONSTANTS_NV 0x8535\r\n\r\ntypedef void (GLAPIENTRY * PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat* params);\r\n\r\n#define glCombinerStageParameterfvNV GLEW_GET_FUN(__glewCombinerStageParameterfvNV)\r\n#define glGetCombinerStageParameterfvNV GLEW_GET_FUN(__glewGetCombinerStageParameterfvNV)\r\n\r\n#define GLEW_NV_register_combiners2 GLEW_GET_VAR(__GLEW_NV_register_combiners2)\r\n\r\n#endif /* GL_NV_register_combiners2 */\r\n\r\n/* ------------------------ GL_NV_shader_buffer_load ----------------------- */\r\n\r\n#ifndef GL_NV_shader_buffer_load\r\n#define GL_NV_shader_buffer_load 1\r\n\r\n#define GL_BUFFER_GPU_ADDRESS_NV 0x8F1D\r\n#define GL_GPU_ADDRESS_NV 0x8F34\r\n#define GL_MAX_SHADER_BUFFER_ADDRESS_NV 0x8F35\r\n\r\ntypedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERUI64VNVPROC) (GLenum target, GLenum pname, GLuint64EXT* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETINTEGERUI64VNVPROC) (GLenum value, GLuint64EXT* result);\r\ntypedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC) (GLuint buffer, GLenum pname, GLuint64EXT* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLuint64EXT* params);\r\ntypedef GLboolean (GLAPIENTRY * PFNGLISBUFFERRESIDENTNVPROC) (GLenum target);\r\ntypedef GLboolean (GLAPIENTRY * PFNGLISNAMEDBUFFERRESIDENTNVPROC) (GLuint buffer);\r\ntypedef void (GLAPIENTRY * PFNGLMAKEBUFFERNONRESIDENTNVPROC) (GLenum target);\r\ntypedef void (GLAPIENTRY * PFNGLMAKEBUFFERRESIDENTNVPROC) (GLenum target, GLenum access);\r\ntypedef void (GLAPIENTRY * PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC) (GLuint buffer);\r\ntypedef void (GLAPIENTRY * PFNGLMAKENAMEDBUFFERRESIDENTNVPROC) (GLuint buffer, GLenum access);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMUI64NVPROC) (GLuint program, GLint location, GLuint64EXT value);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORMUI64NVPROC) (GLint location, GLuint64EXT value);\r\ntypedef void (GLAPIENTRY * PFNGLUNIFORMUI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value);\r\n\r\n#define glGetBufferParameterui64vNV GLEW_GET_FUN(__glewGetBufferParameterui64vNV)\r\n#define glGetIntegerui64vNV GLEW_GET_FUN(__glewGetIntegerui64vNV)\r\n#define glGetNamedBufferParameterui64vNV GLEW_GET_FUN(__glewGetNamedBufferParameterui64vNV)\r\n#define glGetUniformui64vNV GLEW_GET_FUN(__glewGetUniformui64vNV)\r\n#define glIsBufferResidentNV GLEW_GET_FUN(__glewIsBufferResidentNV)\r\n#define glIsNamedBufferResidentNV GLEW_GET_FUN(__glewIsNamedBufferResidentNV)\r\n#define glMakeBufferNonResidentNV GLEW_GET_FUN(__glewMakeBufferNonResidentNV)\r\n#define glMakeBufferResidentNV GLEW_GET_FUN(__glewMakeBufferResidentNV)\r\n#define glMakeNamedBufferNonResidentNV GLEW_GET_FUN(__glewMakeNamedBufferNonResidentNV)\r\n#define glMakeNamedBufferResidentNV GLEW_GET_FUN(__glewMakeNamedBufferResidentNV)\r\n#define glProgramUniformui64NV GLEW_GET_FUN(__glewProgramUniformui64NV)\r\n#define glProgramUniformui64vNV GLEW_GET_FUN(__glewProgramUniformui64vNV)\r\n#define glUniformui64NV GLEW_GET_FUN(__glewUniformui64NV)\r\n#define glUniformui64vNV GLEW_GET_FUN(__glewUniformui64vNV)\r\n\r\n#define GLEW_NV_shader_buffer_load GLEW_GET_VAR(__GLEW_NV_shader_buffer_load)\r\n\r\n#endif /* GL_NV_shader_buffer_load */\r\n\r\n/* -------------------------- GL_NV_texgen_emboss -------------------------- */\r\n\r\n#ifndef GL_NV_texgen_emboss\r\n#define GL_NV_texgen_emboss 1\r\n\r\n#define GL_EMBOSS_LIGHT_NV 0x855D\r\n#define GL_EMBOSS_CONSTANT_NV 0x855E\r\n#define GL_EMBOSS_MAP_NV 0x855F\r\n\r\n#define GLEW_NV_texgen_emboss GLEW_GET_VAR(__GLEW_NV_texgen_emboss)\r\n\r\n#endif /* GL_NV_texgen_emboss */\r\n\r\n/* ------------------------ GL_NV_texgen_reflection ------------------------ */\r\n\r\n#ifndef GL_NV_texgen_reflection\r\n#define GL_NV_texgen_reflection 1\r\n\r\n#define GL_NORMAL_MAP_NV 0x8511\r\n#define GL_REFLECTION_MAP_NV 0x8512\r\n\r\n#define GLEW_NV_texgen_reflection GLEW_GET_VAR(__GLEW_NV_texgen_reflection)\r\n\r\n#endif /* GL_NV_texgen_reflection */\r\n\r\n/* ------------------------- GL_NV_texture_barrier ------------------------- */\r\n\r\n#ifndef GL_NV_texture_barrier\r\n#define GL_NV_texture_barrier 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLTEXTUREBARRIERNVPROC) (void);\r\n\r\n#define glTextureBarrierNV GLEW_GET_FUN(__glewTextureBarrierNV)\r\n\r\n#define GLEW_NV_texture_barrier GLEW_GET_VAR(__GLEW_NV_texture_barrier)\r\n\r\n#endif /* GL_NV_texture_barrier */\r\n\r\n/* --------------------- GL_NV_texture_compression_vtc --------------------- */\r\n\r\n#ifndef GL_NV_texture_compression_vtc\r\n#define GL_NV_texture_compression_vtc 1\r\n\r\n#define GLEW_NV_texture_compression_vtc GLEW_GET_VAR(__GLEW_NV_texture_compression_vtc)\r\n\r\n#endif /* GL_NV_texture_compression_vtc */\r\n\r\n/* ----------------------- GL_NV_texture_env_combine4 ---------------------- */\r\n\r\n#ifndef GL_NV_texture_env_combine4\r\n#define GL_NV_texture_env_combine4 1\r\n\r\n#define GL_COMBINE4_NV 0x8503\r\n#define GL_SOURCE3_RGB_NV 0x8583\r\n#define GL_SOURCE3_ALPHA_NV 0x858B\r\n#define GL_OPERAND3_RGB_NV 0x8593\r\n#define GL_OPERAND3_ALPHA_NV 0x859B\r\n\r\n#define GLEW_NV_texture_env_combine4 GLEW_GET_VAR(__GLEW_NV_texture_env_combine4)\r\n\r\n#endif /* GL_NV_texture_env_combine4 */\r\n\r\n/* ---------------------- GL_NV_texture_expand_normal ---------------------- */\r\n\r\n#ifndef GL_NV_texture_expand_normal\r\n#define GL_NV_texture_expand_normal 1\r\n\r\n#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F\r\n\r\n#define GLEW_NV_texture_expand_normal GLEW_GET_VAR(__GLEW_NV_texture_expand_normal)\r\n\r\n#endif /* GL_NV_texture_expand_normal */\r\n\r\n/* ------------------------ GL_NV_texture_rectangle ------------------------ */\r\n\r\n#ifndef GL_NV_texture_rectangle\r\n#define GL_NV_texture_rectangle 1\r\n\r\n#define GL_TEXTURE_RECTANGLE_NV 0x84F5\r\n#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6\r\n#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7\r\n#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8\r\n\r\n#define GLEW_NV_texture_rectangle GLEW_GET_VAR(__GLEW_NV_texture_rectangle)\r\n\r\n#endif /* GL_NV_texture_rectangle */\r\n\r\n/* -------------------------- GL_NV_texture_shader ------------------------- */\r\n\r\n#ifndef GL_NV_texture_shader\r\n#define GL_NV_texture_shader 1\r\n\r\n#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C\r\n#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D\r\n#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E\r\n#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9\r\n#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA\r\n#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB\r\n#define GL_DSDT_MAG_INTENSITY_NV 0x86DC\r\n#define GL_SHADER_CONSISTENT_NV 0x86DD\r\n#define GL_TEXTURE_SHADER_NV 0x86DE\r\n#define GL_SHADER_OPERATION_NV 0x86DF\r\n#define GL_CULL_MODES_NV 0x86E0\r\n#define GL_OFFSET_TEXTURE_2D_MATRIX_NV 0x86E1\r\n#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1\r\n#define GL_OFFSET_TEXTURE_2D_SCALE_NV 0x86E2\r\n#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2\r\n#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3\r\n#define GL_OFFSET_TEXTURE_2D_BIAS_NV 0x86E3\r\n#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4\r\n#define GL_CONST_EYE_NV 0x86E5\r\n#define GL_PASS_THROUGH_NV 0x86E6\r\n#define GL_CULL_FRAGMENT_NV 0x86E7\r\n#define GL_OFFSET_TEXTURE_2D_NV 0x86E8\r\n#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9\r\n#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA\r\n#define GL_DOT_PRODUCT_NV 0x86EC\r\n#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED\r\n#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE\r\n#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0\r\n#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1\r\n#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2\r\n#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3\r\n#define GL_HILO_NV 0x86F4\r\n#define GL_DSDT_NV 0x86F5\r\n#define GL_DSDT_MAG_NV 0x86F6\r\n#define GL_DSDT_MAG_VIB_NV 0x86F7\r\n#define GL_HILO16_NV 0x86F8\r\n#define GL_SIGNED_HILO_NV 0x86F9\r\n#define GL_SIGNED_HILO16_NV 0x86FA\r\n#define GL_SIGNED_RGBA_NV 0x86FB\r\n#define GL_SIGNED_RGBA8_NV 0x86FC\r\n#define GL_SIGNED_RGB_NV 0x86FE\r\n#define GL_SIGNED_RGB8_NV 0x86FF\r\n#define GL_SIGNED_LUMINANCE_NV 0x8701\r\n#define GL_SIGNED_LUMINANCE8_NV 0x8702\r\n#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703\r\n#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704\r\n#define GL_SIGNED_ALPHA_NV 0x8705\r\n#define GL_SIGNED_ALPHA8_NV 0x8706\r\n#define GL_SIGNED_INTENSITY_NV 0x8707\r\n#define GL_SIGNED_INTENSITY8_NV 0x8708\r\n#define GL_DSDT8_NV 0x8709\r\n#define GL_DSDT8_MAG8_NV 0x870A\r\n#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B\r\n#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C\r\n#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D\r\n#define GL_HI_SCALE_NV 0x870E\r\n#define GL_LO_SCALE_NV 0x870F\r\n#define GL_DS_SCALE_NV 0x8710\r\n#define GL_DT_SCALE_NV 0x8711\r\n#define GL_MAGNITUDE_SCALE_NV 0x8712\r\n#define GL_VIBRANCE_SCALE_NV 0x8713\r\n#define GL_HI_BIAS_NV 0x8714\r\n#define GL_LO_BIAS_NV 0x8715\r\n#define GL_DS_BIAS_NV 0x8716\r\n#define GL_DT_BIAS_NV 0x8717\r\n#define GL_MAGNITUDE_BIAS_NV 0x8718\r\n#define GL_VIBRANCE_BIAS_NV 0x8719\r\n#define GL_TEXTURE_BORDER_VALUES_NV 0x871A\r\n#define GL_TEXTURE_HI_SIZE_NV 0x871B\r\n#define GL_TEXTURE_LO_SIZE_NV 0x871C\r\n#define GL_TEXTURE_DS_SIZE_NV 0x871D\r\n#define GL_TEXTURE_DT_SIZE_NV 0x871E\r\n#define GL_TEXTURE_MAG_SIZE_NV 0x871F\r\n\r\n#define GLEW_NV_texture_shader GLEW_GET_VAR(__GLEW_NV_texture_shader)\r\n\r\n#endif /* GL_NV_texture_shader */\r\n\r\n/* ------------------------- GL_NV_texture_shader2 ------------------------- */\r\n\r\n#ifndef GL_NV_texture_shader2\r\n#define GL_NV_texture_shader2 1\r\n\r\n#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA\r\n#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB\r\n#define GL_DSDT_MAG_INTENSITY_NV 0x86DC\r\n#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF\r\n#define GL_HILO_NV 0x86F4\r\n#define GL_DSDT_NV 0x86F5\r\n#define GL_DSDT_MAG_NV 0x86F6\r\n#define GL_DSDT_MAG_VIB_NV 0x86F7\r\n#define GL_HILO16_NV 0x86F8\r\n#define GL_SIGNED_HILO_NV 0x86F9\r\n#define GL_SIGNED_HILO16_NV 0x86FA\r\n#define GL_SIGNED_RGBA_NV 0x86FB\r\n#define GL_SIGNED_RGBA8_NV 0x86FC\r\n#define GL_SIGNED_RGB_NV 0x86FE\r\n#define GL_SIGNED_RGB8_NV 0x86FF\r\n#define GL_SIGNED_LUMINANCE_NV 0x8701\r\n#define GL_SIGNED_LUMINANCE8_NV 0x8702\r\n#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703\r\n#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704\r\n#define GL_SIGNED_ALPHA_NV 0x8705\r\n#define GL_SIGNED_ALPHA8_NV 0x8706\r\n#define GL_SIGNED_INTENSITY_NV 0x8707\r\n#define GL_SIGNED_INTENSITY8_NV 0x8708\r\n#define GL_DSDT8_NV 0x8709\r\n#define GL_DSDT8_MAG8_NV 0x870A\r\n#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B\r\n#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C\r\n#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D\r\n\r\n#define GLEW_NV_texture_shader2 GLEW_GET_VAR(__GLEW_NV_texture_shader2)\r\n\r\n#endif /* GL_NV_texture_shader2 */\r\n\r\n/* ------------------------- GL_NV_texture_shader3 ------------------------- */\r\n\r\n#ifndef GL_NV_texture_shader3\r\n#define GL_NV_texture_shader3 1\r\n\r\n#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850\r\n#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851\r\n#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852\r\n#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853\r\n#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854\r\n#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855\r\n#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856\r\n#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857\r\n#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858\r\n#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859\r\n#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A\r\n#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B\r\n#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C\r\n#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D\r\n#define GL_HILO8_NV 0x885E\r\n#define GL_SIGNED_HILO8_NV 0x885F\r\n#define GL_FORCE_BLUE_TO_ONE_NV 0x8860\r\n\r\n#define GLEW_NV_texture_shader3 GLEW_GET_VAR(__GLEW_NV_texture_shader3)\r\n\r\n#endif /* GL_NV_texture_shader3 */\r\n\r\n/* ------------------------ GL_NV_transform_feedback ----------------------- */\r\n\r\n#ifndef GL_NV_transform_feedback\r\n#define GL_NV_transform_feedback 1\r\n\r\n#define GL_BACK_PRIMARY_COLOR_NV 0x8C77\r\n#define GL_BACK_SECONDARY_COLOR_NV 0x8C78\r\n#define GL_TEXTURE_COORD_NV 0x8C79\r\n#define GL_CLIP_DISTANCE_NV 0x8C7A\r\n#define GL_VERTEX_ID_NV 0x8C7B\r\n#define GL_PRIMITIVE_ID_NV 0x8C7C\r\n#define GL_GENERIC_ATTRIB_NV 0x8C7D\r\n#define GL_TRANSFORM_FEEDBACK_ATTRIBS_NV 0x8C7E\r\n#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV 0x8C7F\r\n#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV 0x8C80\r\n#define GL_ACTIVE_VARYINGS_NV 0x8C81\r\n#define GL_ACTIVE_VARYING_MAX_LENGTH_NV 0x8C82\r\n#define GL_TRANSFORM_FEEDBACK_VARYINGS_NV 0x8C83\r\n#define GL_TRANSFORM_FEEDBACK_BUFFER_START_NV 0x8C84\r\n#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV 0x8C85\r\n#define GL_TRANSFORM_FEEDBACK_RECORD_NV 0x8C86\r\n#define GL_PRIMITIVES_GENERATED_NV 0x8C87\r\n#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV 0x8C88\r\n#define GL_RASTERIZER_DISCARD_NV 0x8C89\r\n#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV 0x8C8A\r\n#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV 0x8C8B\r\n#define GL_INTERLEAVED_ATTRIBS_NV 0x8C8C\r\n#define GL_SEPARATE_ATTRIBS_NV 0x8C8D\r\n#define GL_TRANSFORM_FEEDBACK_BUFFER_NV 0x8C8E\r\n#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV 0x8C8F\r\n\r\ntypedef void (GLAPIENTRY * PFNGLACTIVEVARYINGNVPROC) (GLuint program, const GLchar *name);\r\ntypedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKNVPROC) (GLenum primitiveMode);\r\ntypedef void (GLAPIENTRY * PFNGLBINDBUFFERBASENVPROC) (GLenum target, GLuint index, GLuint buffer);\r\ntypedef void (GLAPIENTRY * PFNGLBINDBUFFEROFFSETNVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset);\r\ntypedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGENVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);\r\ntypedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKNVPROC) (void);\r\ntypedef void (GLAPIENTRY * PFNGLGETACTIVEVARYINGNVPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);\r\ntypedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) (GLuint program, GLuint index, GLint *location);\r\ntypedef GLint (GLAPIENTRY * PFNGLGETVARYINGLOCATIONNVPROC) (GLuint program, const GLchar *name);\r\ntypedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) (GLuint count, const GLint *attribs, GLenum bufferMode);\r\ntypedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode);\r\n\r\n#define glActiveVaryingNV GLEW_GET_FUN(__glewActiveVaryingNV)\r\n#define glBeginTransformFeedbackNV GLEW_GET_FUN(__glewBeginTransformFeedbackNV)\r\n#define glBindBufferBaseNV GLEW_GET_FUN(__glewBindBufferBaseNV)\r\n#define glBindBufferOffsetNV GLEW_GET_FUN(__glewBindBufferOffsetNV)\r\n#define glBindBufferRangeNV GLEW_GET_FUN(__glewBindBufferRangeNV)\r\n#define glEndTransformFeedbackNV GLEW_GET_FUN(__glewEndTransformFeedbackNV)\r\n#define glGetActiveVaryingNV GLEW_GET_FUN(__glewGetActiveVaryingNV)\r\n#define glGetTransformFeedbackVaryingNV GLEW_GET_FUN(__glewGetTransformFeedbackVaryingNV)\r\n#define glGetVaryingLocationNV GLEW_GET_FUN(__glewGetVaryingLocationNV)\r\n#define glTransformFeedbackAttribsNV GLEW_GET_FUN(__glewTransformFeedbackAttribsNV)\r\n#define glTransformFeedbackVaryingsNV GLEW_GET_FUN(__glewTransformFeedbackVaryingsNV)\r\n\r\n#define GLEW_NV_transform_feedback GLEW_GET_VAR(__GLEW_NV_transform_feedback)\r\n\r\n#endif /* GL_NV_transform_feedback */\r\n\r\n/* ----------------------- GL_NV_transform_feedback2 ----------------------- */\r\n\r\n#ifndef GL_NV_transform_feedback2\r\n#define GL_NV_transform_feedback2 1\r\n\r\n#define GL_TRANSFORM_FEEDBACK_NV 0x8E22\r\n#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV 0x8E23\r\n#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV 0x8E24\r\n#define GL_TRANSFORM_FEEDBACK_BINDING_NV 0x8E25\r\n\r\ntypedef void (GLAPIENTRY * PFNGLBINDTRANSFORMFEEDBACKNVPROC) (GLenum target, GLuint id);\r\ntypedef void (GLAPIENTRY * PFNGLDELETETRANSFORMFEEDBACKSNVPROC) (GLsizei n, const GLuint* ids);\r\ntypedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKNVPROC) (GLenum mode, GLuint id);\r\ntypedef void (GLAPIENTRY * PFNGLGENTRANSFORMFEEDBACKSNVPROC) (GLsizei n, GLuint* ids);\r\ntypedef GLboolean (GLAPIENTRY * PFNGLISTRANSFORMFEEDBACKNVPROC) (GLuint id);\r\ntypedef void (GLAPIENTRY * PFNGLPAUSETRANSFORMFEEDBACKNVPROC) (void);\r\ntypedef void (GLAPIENTRY * PFNGLRESUMETRANSFORMFEEDBACKNVPROC) (void);\r\n\r\n#define glBindTransformFeedbackNV GLEW_GET_FUN(__glewBindTransformFeedbackNV)\r\n#define glDeleteTransformFeedbacksNV GLEW_GET_FUN(__glewDeleteTransformFeedbacksNV)\r\n#define glDrawTransformFeedbackNV GLEW_GET_FUN(__glewDrawTransformFeedbackNV)\r\n#define glGenTransformFeedbacksNV GLEW_GET_FUN(__glewGenTransformFeedbacksNV)\r\n#define glIsTransformFeedbackNV GLEW_GET_FUN(__glewIsTransformFeedbackNV)\r\n#define glPauseTransformFeedbackNV GLEW_GET_FUN(__glewPauseTransformFeedbackNV)\r\n#define glResumeTransformFeedbackNV GLEW_GET_FUN(__glewResumeTransformFeedbackNV)\r\n\r\n#define GLEW_NV_transform_feedback2 GLEW_GET_VAR(__GLEW_NV_transform_feedback2)\r\n\r\n#endif /* GL_NV_transform_feedback2 */\r\n\r\n/* ------------------------ GL_NV_vertex_array_range ----------------------- */\r\n\r\n#ifndef GL_NV_vertex_array_range\r\n#define GL_NV_vertex_array_range 1\r\n\r\n#define GL_VERTEX_ARRAY_RANGE_NV 0x851D\r\n#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E\r\n#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F\r\n#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520\r\n#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521\r\n\r\ntypedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, void* pointer);\r\n\r\n#define glFlushVertexArrayRangeNV GLEW_GET_FUN(__glewFlushVertexArrayRangeNV)\r\n#define glVertexArrayRangeNV GLEW_GET_FUN(__glewVertexArrayRangeNV)\r\n\r\n#define GLEW_NV_vertex_array_range GLEW_GET_VAR(__GLEW_NV_vertex_array_range)\r\n\r\n#endif /* GL_NV_vertex_array_range */\r\n\r\n/* ----------------------- GL_NV_vertex_array_range2 ----------------------- */\r\n\r\n#ifndef GL_NV_vertex_array_range2\r\n#define GL_NV_vertex_array_range2 1\r\n\r\n#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533\r\n\r\n#define GLEW_NV_vertex_array_range2 GLEW_GET_VAR(__GLEW_NV_vertex_array_range2)\r\n\r\n#endif /* GL_NV_vertex_array_range2 */\r\n\r\n/* ------------------- GL_NV_vertex_buffer_unified_memory ------------------ */\r\n\r\n#ifndef GL_NV_vertex_buffer_unified_memory\r\n#define GL_NV_vertex_buffer_unified_memory 1\r\n\r\n#define GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV 0x8F1E\r\n#define GL_ELEMENT_ARRAY_UNIFIED_NV 0x8F1F\r\n#define GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV 0x8F20\r\n#define GL_VERTEX_ARRAY_ADDRESS_NV 0x8F21\r\n#define GL_NORMAL_ARRAY_ADDRESS_NV 0x8F22\r\n#define GL_COLOR_ARRAY_ADDRESS_NV 0x8F23\r\n#define GL_INDEX_ARRAY_ADDRESS_NV 0x8F24\r\n#define GL_TEXTURE_COORD_ARRAY_ADDRESS_NV 0x8F25\r\n#define GL_EDGE_FLAG_ARRAY_ADDRESS_NV 0x8F26\r\n#define GL_SECONDARY_COLOR_ARRAY_ADDRESS_NV 0x8F27\r\n#define GL_FOG_COORD_ARRAY_ADDRESS_NV 0x8F28\r\n#define GL_ELEMENT_ARRAY_ADDRESS_NV 0x8F29\r\n#define GL_VERTEX_ATTRIB_ARRAY_LENGTH_NV 0x8F2A\r\n#define GL_VERTEX_ARRAY_LENGTH_NV 0x8F2B\r\n#define GL_NORMAL_ARRAY_LENGTH_NV 0x8F2C\r\n#define GL_COLOR_ARRAY_LENGTH_NV 0x8F2D\r\n#define GL_INDEX_ARRAY_LENGTH_NV 0x8F2E\r\n#define GL_TEXTURE_COORD_ARRAY_LENGTH_NV 0x8F2F\r\n#define GL_EDGE_FLAG_ARRAY_LENGTH_NV 0x8F30\r\n#define GL_SECONDARY_COLOR_ARRAY_LENGTH_NV 0x8F31\r\n#define GL_FOG_COORD_ARRAY_LENGTH_NV 0x8F32\r\n#define GL_ELEMENT_ARRAY_LENGTH_NV 0x8F33\r\n\r\ntypedef void (GLAPIENTRY * PFNGLBUFFERADDRESSRANGENVPROC) (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length);\r\ntypedef void (GLAPIENTRY * PFNGLCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride);\r\ntypedef void (GLAPIENTRY * PFNGLEDGEFLAGFORMATNVPROC) (GLsizei stride);\r\ntypedef void (GLAPIENTRY * PFNGLFOGCOORDFORMATNVPROC) (GLenum type, GLsizei stride);\r\ntypedef void (GLAPIENTRY * PFNGLGETINTEGERUI64I_VNVPROC) (GLenum value, GLuint index, GLuint64EXT result[]);\r\ntypedef void (GLAPIENTRY * PFNGLINDEXFORMATNVPROC) (GLenum type, GLsizei stride);\r\ntypedef void (GLAPIENTRY * PFNGLNORMALFORMATNVPROC) (GLenum type, GLsizei stride);\r\ntypedef void (GLAPIENTRY * PFNGLSECONDARYCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride);\r\ntypedef void (GLAPIENTRY * PFNGLTEXCOORDFORMATNVPROC) (GLint size, GLenum type, GLsizei stride);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXFORMATNVPROC) (GLint size, GLenum type, GLsizei stride);\r\n\r\n#define glBufferAddressRangeNV GLEW_GET_FUN(__glewBufferAddressRangeNV)\r\n#define glColorFormatNV GLEW_GET_FUN(__glewColorFormatNV)\r\n#define glEdgeFlagFormatNV GLEW_GET_FUN(__glewEdgeFlagFormatNV)\r\n#define glFogCoordFormatNV GLEW_GET_FUN(__glewFogCoordFormatNV)\r\n#define glGetIntegerui64i_vNV GLEW_GET_FUN(__glewGetIntegerui64i_vNV)\r\n#define glIndexFormatNV GLEW_GET_FUN(__glewIndexFormatNV)\r\n#define glNormalFormatNV GLEW_GET_FUN(__glewNormalFormatNV)\r\n#define glSecondaryColorFormatNV GLEW_GET_FUN(__glewSecondaryColorFormatNV)\r\n#define glTexCoordFormatNV GLEW_GET_FUN(__glewTexCoordFormatNV)\r\n#define glVertexAttribFormatNV GLEW_GET_FUN(__glewVertexAttribFormatNV)\r\n#define glVertexAttribIFormatNV GLEW_GET_FUN(__glewVertexAttribIFormatNV)\r\n#define glVertexFormatNV GLEW_GET_FUN(__glewVertexFormatNV)\r\n\r\n#define GLEW_NV_vertex_buffer_unified_memory GLEW_GET_VAR(__GLEW_NV_vertex_buffer_unified_memory)\r\n\r\n#endif /* GL_NV_vertex_buffer_unified_memory */\r\n\r\n/* -------------------------- GL_NV_vertex_program ------------------------- */\r\n\r\n#ifndef GL_NV_vertex_program\r\n#define GL_NV_vertex_program 1\r\n\r\n#define GL_VERTEX_PROGRAM_NV 0x8620\r\n#define GL_VERTEX_STATE_PROGRAM_NV 0x8621\r\n#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623\r\n#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624\r\n#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625\r\n#define GL_CURRENT_ATTRIB_NV 0x8626\r\n#define GL_PROGRAM_LENGTH_NV 0x8627\r\n#define GL_PROGRAM_STRING_NV 0x8628\r\n#define GL_MODELVIEW_PROJECTION_NV 0x8629\r\n#define GL_IDENTITY_NV 0x862A\r\n#define GL_INVERSE_NV 0x862B\r\n#define GL_TRANSPOSE_NV 0x862C\r\n#define GL_INVERSE_TRANSPOSE_NV 0x862D\r\n#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E\r\n#define GL_MAX_TRACK_MATRICES_NV 0x862F\r\n#define GL_MATRIX0_NV 0x8630\r\n#define GL_MATRIX1_NV 0x8631\r\n#define GL_MATRIX2_NV 0x8632\r\n#define GL_MATRIX3_NV 0x8633\r\n#define GL_MATRIX4_NV 0x8634\r\n#define GL_MATRIX5_NV 0x8635\r\n#define GL_MATRIX6_NV 0x8636\r\n#define GL_MATRIX7_NV 0x8637\r\n#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640\r\n#define GL_CURRENT_MATRIX_NV 0x8641\r\n#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642\r\n#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643\r\n#define GL_PROGRAM_PARAMETER_NV 0x8644\r\n#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645\r\n#define GL_PROGRAM_TARGET_NV 0x8646\r\n#define GL_PROGRAM_RESIDENT_NV 0x8647\r\n#define GL_TRACK_MATRIX_NV 0x8648\r\n#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649\r\n#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A\r\n#define GL_PROGRAM_ERROR_POSITION_NV 0x864B\r\n#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650\r\n#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651\r\n#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652\r\n#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653\r\n#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654\r\n#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655\r\n#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656\r\n#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657\r\n#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658\r\n#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659\r\n#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A\r\n#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B\r\n#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C\r\n#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D\r\n#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E\r\n#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F\r\n#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660\r\n#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661\r\n#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662\r\n#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663\r\n#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664\r\n#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665\r\n#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666\r\n#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667\r\n#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668\r\n#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669\r\n#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A\r\n#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B\r\n#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C\r\n#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D\r\n#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E\r\n#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F\r\n#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670\r\n#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671\r\n#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672\r\n#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673\r\n#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674\r\n#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675\r\n#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676\r\n#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677\r\n#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678\r\n#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679\r\n#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A\r\n#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B\r\n#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C\r\n#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D\r\n#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E\r\n#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F\r\n\r\ntypedef GLboolean (GLAPIENTRY * PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint* ids, GLboolean *residences);\r\ntypedef void (GLAPIENTRY * PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id);\r\ntypedef void (GLAPIENTRY * PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint* ids);\r\ntypedef void (GLAPIENTRY * PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint* ids);\r\ntypedef void (GLAPIENTRY * PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte* program);\r\ntypedef void (GLAPIENTRY * PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, GLvoid** pointer);\r\ntypedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint* params);\r\ntypedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMNVPROC) (GLuint id);\r\ntypedef void (GLAPIENTRY * PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte* program);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble* params);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLuint num, const GLdouble* params);\r\ntypedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLuint num, const GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, GLuint* ids);\r\ntypedef void (GLAPIENTRY * PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei n, const GLshort* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei n, const GLshort* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei n, const GLshort* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei n, const GLshort* v);\r\ntypedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei n, const GLubyte* v);\r\n\r\n#define glAreProgramsResidentNV GLEW_GET_FUN(__glewAreProgramsResidentNV)\r\n#define glBindProgramNV GLEW_GET_FUN(__glewBindProgramNV)\r\n#define glDeleteProgramsNV GLEW_GET_FUN(__glewDeleteProgramsNV)\r\n#define glExecuteProgramNV GLEW_GET_FUN(__glewExecuteProgramNV)\r\n#define glGenProgramsNV GLEW_GET_FUN(__glewGenProgramsNV)\r\n#define glGetProgramParameterdvNV GLEW_GET_FUN(__glewGetProgramParameterdvNV)\r\n#define glGetProgramParameterfvNV GLEW_GET_FUN(__glewGetProgramParameterfvNV)\r\n#define glGetProgramStringNV GLEW_GET_FUN(__glewGetProgramStringNV)\r\n#define glGetProgramivNV GLEW_GET_FUN(__glewGetProgramivNV)\r\n#define glGetTrackMatrixivNV GLEW_GET_FUN(__glewGetTrackMatrixivNV)\r\n#define glGetVertexAttribPointervNV GLEW_GET_FUN(__glewGetVertexAttribPointervNV)\r\n#define glGetVertexAttribdvNV GLEW_GET_FUN(__glewGetVertexAttribdvNV)\r\n#define glGetVertexAttribfvNV GLEW_GET_FUN(__glewGetVertexAttribfvNV)\r\n#define glGetVertexAttribivNV GLEW_GET_FUN(__glewGetVertexAttribivNV)\r\n#define glIsProgramNV GLEW_GET_FUN(__glewIsProgramNV)\r\n#define glLoadProgramNV GLEW_GET_FUN(__glewLoadProgramNV)\r\n#define glProgramParameter4dNV GLEW_GET_FUN(__glewProgramParameter4dNV)\r\n#define glProgramParameter4dvNV GLEW_GET_FUN(__glewProgramParameter4dvNV)\r\n#define glProgramParameter4fNV GLEW_GET_FUN(__glewProgramParameter4fNV)\r\n#define glProgramParameter4fvNV GLEW_GET_FUN(__glewProgramParameter4fvNV)\r\n#define glProgramParameters4dvNV GLEW_GET_FUN(__glewProgramParameters4dvNV)\r\n#define glProgramParameters4fvNV GLEW_GET_FUN(__glewProgramParameters4fvNV)\r\n#define glRequestResidentProgramsNV GLEW_GET_FUN(__glewRequestResidentProgramsNV)\r\n#define glTrackMatrixNV GLEW_GET_FUN(__glewTrackMatrixNV)\r\n#define glVertexAttrib1dNV GLEW_GET_FUN(__glewVertexAttrib1dNV)\r\n#define glVertexAttrib1dvNV GLEW_GET_FUN(__glewVertexAttrib1dvNV)\r\n#define glVertexAttrib1fNV GLEW_GET_FUN(__glewVertexAttrib1fNV)\r\n#define glVertexAttrib1fvNV GLEW_GET_FUN(__glewVertexAttrib1fvNV)\r\n#define glVertexAttrib1sNV GLEW_GET_FUN(__glewVertexAttrib1sNV)\r\n#define glVertexAttrib1svNV GLEW_GET_FUN(__glewVertexAttrib1svNV)\r\n#define glVertexAttrib2dNV GLEW_GET_FUN(__glewVertexAttrib2dNV)\r\n#define glVertexAttrib2dvNV GLEW_GET_FUN(__glewVertexAttrib2dvNV)\r\n#define glVertexAttrib2fNV GLEW_GET_FUN(__glewVertexAttrib2fNV)\r\n#define glVertexAttrib2fvNV GLEW_GET_FUN(__glewVertexAttrib2fvNV)\r\n#define glVertexAttrib2sNV GLEW_GET_FUN(__glewVertexAttrib2sNV)\r\n#define glVertexAttrib2svNV GLEW_GET_FUN(__glewVertexAttrib2svNV)\r\n#define glVertexAttrib3dNV GLEW_GET_FUN(__glewVertexAttrib3dNV)\r\n#define glVertexAttrib3dvNV GLEW_GET_FUN(__glewVertexAttrib3dvNV)\r\n#define glVertexAttrib3fNV GLEW_GET_FUN(__glewVertexAttrib3fNV)\r\n#define glVertexAttrib3fvNV GLEW_GET_FUN(__glewVertexAttrib3fvNV)\r\n#define glVertexAttrib3sNV GLEW_GET_FUN(__glewVertexAttrib3sNV)\r\n#define glVertexAttrib3svNV GLEW_GET_FUN(__glewVertexAttrib3svNV)\r\n#define glVertexAttrib4dNV GLEW_GET_FUN(__glewVertexAttrib4dNV)\r\n#define glVertexAttrib4dvNV GLEW_GET_FUN(__glewVertexAttrib4dvNV)\r\n#define glVertexAttrib4fNV GLEW_GET_FUN(__glewVertexAttrib4fNV)\r\n#define glVertexAttrib4fvNV GLEW_GET_FUN(__glewVertexAttrib4fvNV)\r\n#define glVertexAttrib4sNV GLEW_GET_FUN(__glewVertexAttrib4sNV)\r\n#define glVertexAttrib4svNV GLEW_GET_FUN(__glewVertexAttrib4svNV)\r\n#define glVertexAttrib4ubNV GLEW_GET_FUN(__glewVertexAttrib4ubNV)\r\n#define glVertexAttrib4ubvNV GLEW_GET_FUN(__glewVertexAttrib4ubvNV)\r\n#define glVertexAttribPointerNV GLEW_GET_FUN(__glewVertexAttribPointerNV)\r\n#define glVertexAttribs1dvNV GLEW_GET_FUN(__glewVertexAttribs1dvNV)\r\n#define glVertexAttribs1fvNV GLEW_GET_FUN(__glewVertexAttribs1fvNV)\r\n#define glVertexAttribs1svNV GLEW_GET_FUN(__glewVertexAttribs1svNV)\r\n#define glVertexAttribs2dvNV GLEW_GET_FUN(__glewVertexAttribs2dvNV)\r\n#define glVertexAttribs2fvNV GLEW_GET_FUN(__glewVertexAttribs2fvNV)\r\n#define glVertexAttribs2svNV GLEW_GET_FUN(__glewVertexAttribs2svNV)\r\n#define glVertexAttribs3dvNV GLEW_GET_FUN(__glewVertexAttribs3dvNV)\r\n#define glVertexAttribs3fvNV GLEW_GET_FUN(__glewVertexAttribs3fvNV)\r\n#define glVertexAttribs3svNV GLEW_GET_FUN(__glewVertexAttribs3svNV)\r\n#define glVertexAttribs4dvNV GLEW_GET_FUN(__glewVertexAttribs4dvNV)\r\n#define glVertexAttribs4fvNV GLEW_GET_FUN(__glewVertexAttribs4fvNV)\r\n#define glVertexAttribs4svNV GLEW_GET_FUN(__glewVertexAttribs4svNV)\r\n#define glVertexAttribs4ubvNV GLEW_GET_FUN(__glewVertexAttribs4ubvNV)\r\n\r\n#define GLEW_NV_vertex_program GLEW_GET_VAR(__GLEW_NV_vertex_program)\r\n\r\n#endif /* GL_NV_vertex_program */\r\n\r\n/* ------------------------ GL_NV_vertex_program1_1 ------------------------ */\r\n\r\n#ifndef GL_NV_vertex_program1_1\r\n#define GL_NV_vertex_program1_1 1\r\n\r\n#define GLEW_NV_vertex_program1_1 GLEW_GET_VAR(__GLEW_NV_vertex_program1_1)\r\n\r\n#endif /* GL_NV_vertex_program1_1 */\r\n\r\n/* ------------------------- GL_NV_vertex_program2 ------------------------- */\r\n\r\n#ifndef GL_NV_vertex_program2\r\n#define GL_NV_vertex_program2 1\r\n\r\n#define GLEW_NV_vertex_program2 GLEW_GET_VAR(__GLEW_NV_vertex_program2)\r\n\r\n#endif /* GL_NV_vertex_program2 */\r\n\r\n/* ---------------------- GL_NV_vertex_program2_option --------------------- */\r\n\r\n#ifndef GL_NV_vertex_program2_option\r\n#define GL_NV_vertex_program2_option 1\r\n\r\n#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4\r\n#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5\r\n\r\n#define GLEW_NV_vertex_program2_option GLEW_GET_VAR(__GLEW_NV_vertex_program2_option)\r\n\r\n#endif /* GL_NV_vertex_program2_option */\r\n\r\n/* ------------------------- GL_NV_vertex_program3 ------------------------- */\r\n\r\n#ifndef GL_NV_vertex_program3\r\n#define GL_NV_vertex_program3 1\r\n\r\n#define MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C\r\n\r\n#define GLEW_NV_vertex_program3 GLEW_GET_VAR(__GLEW_NV_vertex_program3)\r\n\r\n#endif /* GL_NV_vertex_program3 */\r\n\r\n/* ------------------------- GL_NV_vertex_program4 ------------------------- */\r\n\r\n#ifndef GL_NV_vertex_program4\r\n#define GL_NV_vertex_program4 1\r\n\r\n#define GLEW_NV_vertex_program4 GLEW_GET_VAR(__GLEW_NV_vertex_program4)\r\n\r\n#endif /* GL_NV_vertex_program4 */\r\n\r\n/* ------------------------ GL_OES_byte_coordinates ------------------------ */\r\n\r\n#ifndef GL_OES_byte_coordinates\r\n#define GL_OES_byte_coordinates 1\r\n\r\n#define GL_BYTE 0x1400\r\n\r\n#define GLEW_OES_byte_coordinates GLEW_GET_VAR(__GLEW_OES_byte_coordinates)\r\n\r\n#endif /* GL_OES_byte_coordinates */\r\n\r\n/* ------------------- GL_OES_compressed_paletted_texture ------------------ */\r\n\r\n#ifndef GL_OES_compressed_paletted_texture\r\n#define GL_OES_compressed_paletted_texture 1\r\n\r\n#define GL_PALETTE4_RGB8_OES 0x8B90\r\n#define GL_PALETTE4_RGBA8_OES 0x8B91\r\n#define GL_PALETTE4_R5_G6_B5_OES 0x8B92\r\n#define GL_PALETTE4_RGBA4_OES 0x8B93\r\n#define GL_PALETTE4_RGB5_A1_OES 0x8B94\r\n#define GL_PALETTE8_RGB8_OES 0x8B95\r\n#define GL_PALETTE8_RGBA8_OES 0x8B96\r\n#define GL_PALETTE8_R5_G6_B5_OES 0x8B97\r\n#define GL_PALETTE8_RGBA4_OES 0x8B98\r\n#define GL_PALETTE8_RGB5_A1_OES 0x8B99\r\n\r\n#define GLEW_OES_compressed_paletted_texture GLEW_GET_VAR(__GLEW_OES_compressed_paletted_texture)\r\n\r\n#endif /* GL_OES_compressed_paletted_texture */\r\n\r\n/* --------------------------- GL_OES_read_format -------------------------- */\r\n\r\n#ifndef GL_OES_read_format\r\n#define GL_OES_read_format 1\r\n\r\n#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A\r\n#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B\r\n\r\n#define GLEW_OES_read_format GLEW_GET_VAR(__GLEW_OES_read_format)\r\n\r\n#endif /* GL_OES_read_format */\r\n\r\n/* ------------------------ GL_OES_single_precision ------------------------ */\r\n\r\n#ifndef GL_OES_single_precision\r\n#define GL_OES_single_precision 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLCLEARDEPTHFOESPROC) (GLclampd depth);\r\ntypedef void (GLAPIENTRY * PFNGLCLIPPLANEFOESPROC) (GLenum plane, const GLfloat* equation);\r\ntypedef void (GLAPIENTRY * PFNGLDEPTHRANGEFOESPROC) (GLclampf n, GLclampf f);\r\ntypedef void (GLAPIENTRY * PFNGLFRUSTUMFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f);\r\ntypedef void (GLAPIENTRY * PFNGLGETCLIPPLANEFOESPROC) (GLenum plane, GLfloat* equation);\r\ntypedef void (GLAPIENTRY * PFNGLORTHOFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f);\r\n\r\n#define glClearDepthfOES GLEW_GET_FUN(__glewClearDepthfOES)\r\n#define glClipPlanefOES GLEW_GET_FUN(__glewClipPlanefOES)\r\n#define glDepthRangefOES GLEW_GET_FUN(__glewDepthRangefOES)\r\n#define glFrustumfOES GLEW_GET_FUN(__glewFrustumfOES)\r\n#define glGetClipPlanefOES GLEW_GET_FUN(__glewGetClipPlanefOES)\r\n#define glOrthofOES GLEW_GET_FUN(__glewOrthofOES)\r\n\r\n#define GLEW_OES_single_precision GLEW_GET_VAR(__GLEW_OES_single_precision)\r\n\r\n#endif /* GL_OES_single_precision */\r\n\r\n/* ---------------------------- GL_OML_interlace --------------------------- */\r\n\r\n#ifndef GL_OML_interlace\r\n#define GL_OML_interlace 1\r\n\r\n#define GL_INTERLACE_OML 0x8980\r\n#define GL_INTERLACE_READ_OML 0x8981\r\n\r\n#define GLEW_OML_interlace GLEW_GET_VAR(__GLEW_OML_interlace)\r\n\r\n#endif /* GL_OML_interlace */\r\n\r\n/* ---------------------------- GL_OML_resample ---------------------------- */\r\n\r\n#ifndef GL_OML_resample\r\n#define GL_OML_resample 1\r\n\r\n#define GL_PACK_RESAMPLE_OML 0x8984\r\n#define GL_UNPACK_RESAMPLE_OML 0x8985\r\n#define GL_RESAMPLE_REPLICATE_OML 0x8986\r\n#define GL_RESAMPLE_ZERO_FILL_OML 0x8987\r\n#define GL_RESAMPLE_AVERAGE_OML 0x8988\r\n#define GL_RESAMPLE_DECIMATE_OML 0x8989\r\n\r\n#define GLEW_OML_resample GLEW_GET_VAR(__GLEW_OML_resample)\r\n\r\n#endif /* GL_OML_resample */\r\n\r\n/* ---------------------------- GL_OML_subsample --------------------------- */\r\n\r\n#ifndef GL_OML_subsample\r\n#define GL_OML_subsample 1\r\n\r\n#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982\r\n#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983\r\n\r\n#define GLEW_OML_subsample GLEW_GET_VAR(__GLEW_OML_subsample)\r\n\r\n#endif /* GL_OML_subsample */\r\n\r\n/* --------------------------- GL_PGI_misc_hints --------------------------- */\r\n\r\n#ifndef GL_PGI_misc_hints\r\n#define GL_PGI_misc_hints 1\r\n\r\n#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 107000\r\n#define GL_CONSERVE_MEMORY_HINT_PGI 107005\r\n#define GL_RECLAIM_MEMORY_HINT_PGI 107006\r\n#define GL_NATIVE_GRAPHICS_HANDLE_PGI 107010\r\n#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 107011\r\n#define GL_NATIVE_GRAPHICS_END_HINT_PGI 107012\r\n#define GL_ALWAYS_FAST_HINT_PGI 107020\r\n#define GL_ALWAYS_SOFT_HINT_PGI 107021\r\n#define GL_ALLOW_DRAW_OBJ_HINT_PGI 107022\r\n#define GL_ALLOW_DRAW_WIN_HINT_PGI 107023\r\n#define GL_ALLOW_DRAW_FRG_HINT_PGI 107024\r\n#define GL_ALLOW_DRAW_MEM_HINT_PGI 107025\r\n#define GL_STRICT_DEPTHFUNC_HINT_PGI 107030\r\n#define GL_STRICT_LIGHTING_HINT_PGI 107031\r\n#define GL_STRICT_SCISSOR_HINT_PGI 107032\r\n#define GL_FULL_STIPPLE_HINT_PGI 107033\r\n#define GL_CLIP_NEAR_HINT_PGI 107040\r\n#define GL_CLIP_FAR_HINT_PGI 107041\r\n#define GL_WIDE_LINE_HINT_PGI 107042\r\n#define GL_BACK_NORMALS_HINT_PGI 107043\r\n\r\n#define GLEW_PGI_misc_hints GLEW_GET_VAR(__GLEW_PGI_misc_hints)\r\n\r\n#endif /* GL_PGI_misc_hints */\r\n\r\n/* -------------------------- GL_PGI_vertex_hints -------------------------- */\r\n\r\n#ifndef GL_PGI_vertex_hints\r\n#define GL_PGI_vertex_hints 1\r\n\r\n#define GL_VERTEX23_BIT_PGI 0x00000004\r\n#define GL_VERTEX4_BIT_PGI 0x00000008\r\n#define GL_COLOR3_BIT_PGI 0x00010000\r\n#define GL_COLOR4_BIT_PGI 0x00020000\r\n#define GL_EDGEFLAG_BIT_PGI 0x00040000\r\n#define GL_INDEX_BIT_PGI 0x00080000\r\n#define GL_MAT_AMBIENT_BIT_PGI 0x00100000\r\n#define GL_VERTEX_DATA_HINT_PGI 107050\r\n#define GL_VERTEX_CONSISTENT_HINT_PGI 107051\r\n#define GL_MATERIAL_SIDE_HINT_PGI 107052\r\n#define GL_MAX_VERTEX_HINT_PGI 107053\r\n#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000\r\n#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000\r\n#define GL_MAT_EMISSION_BIT_PGI 0x00800000\r\n#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000\r\n#define GL_MAT_SHININESS_BIT_PGI 0x02000000\r\n#define GL_MAT_SPECULAR_BIT_PGI 0x04000000\r\n#define GL_NORMAL_BIT_PGI 0x08000000\r\n#define GL_TEXCOORD1_BIT_PGI 0x10000000\r\n#define GL_TEXCOORD2_BIT_PGI 0x20000000\r\n#define GL_TEXCOORD3_BIT_PGI 0x40000000\r\n#define GL_TEXCOORD4_BIT_PGI 0x80000000\r\n\r\n#define GLEW_PGI_vertex_hints GLEW_GET_VAR(__GLEW_PGI_vertex_hints)\r\n\r\n#endif /* GL_PGI_vertex_hints */\r\n\r\n/* ----------------------- GL_REND_screen_coordinates ---------------------- */\r\n\r\n#ifndef GL_REND_screen_coordinates\r\n#define GL_REND_screen_coordinates 1\r\n\r\n#define GL_SCREEN_COORDINATES_REND 0x8490\r\n#define GL_INVERTED_SCREEN_W_REND 0x8491\r\n\r\n#define GLEW_REND_screen_coordinates GLEW_GET_VAR(__GLEW_REND_screen_coordinates)\r\n\r\n#endif /* GL_REND_screen_coordinates */\r\n\r\n/* ------------------------------- GL_S3_s3tc ------------------------------ */\r\n\r\n#ifndef GL_S3_s3tc\r\n#define GL_S3_s3tc 1\r\n\r\n#define GL_RGB_S3TC 0x83A0\r\n#define GL_RGB4_S3TC 0x83A1\r\n#define GL_RGBA_S3TC 0x83A2\r\n#define GL_RGBA4_S3TC 0x83A3\r\n#define GL_RGBA_DXT5_S3TC 0x83A4\r\n#define GL_RGBA4_DXT5_S3TC 0x83A5\r\n\r\n#define GLEW_S3_s3tc GLEW_GET_VAR(__GLEW_S3_s3tc)\r\n\r\n#endif /* GL_S3_s3tc */\r\n\r\n/* -------------------------- GL_SGIS_color_range -------------------------- */\r\n\r\n#ifndef GL_SGIS_color_range\r\n#define GL_SGIS_color_range 1\r\n\r\n#define GL_EXTENDED_RANGE_SGIS 0x85A5\r\n#define GL_MIN_RED_SGIS 0x85A6\r\n#define GL_MAX_RED_SGIS 0x85A7\r\n#define GL_MIN_GREEN_SGIS 0x85A8\r\n#define GL_MAX_GREEN_SGIS 0x85A9\r\n#define GL_MIN_BLUE_SGIS 0x85AA\r\n#define GL_MAX_BLUE_SGIS 0x85AB\r\n#define GL_MIN_ALPHA_SGIS 0x85AC\r\n#define GL_MAX_ALPHA_SGIS 0x85AD\r\n\r\n#define GLEW_SGIS_color_range GLEW_GET_VAR(__GLEW_SGIS_color_range)\r\n\r\n#endif /* GL_SGIS_color_range */\r\n\r\n/* ------------------------- GL_SGIS_detail_texture ------------------------ */\r\n\r\n#ifndef GL_SGIS_detail_texture\r\n#define GL_SGIS_detail_texture 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat* points);\r\ntypedef void (GLAPIENTRY * PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat* points);\r\n\r\n#define glDetailTexFuncSGIS GLEW_GET_FUN(__glewDetailTexFuncSGIS)\r\n#define glGetDetailTexFuncSGIS GLEW_GET_FUN(__glewGetDetailTexFuncSGIS)\r\n\r\n#define GLEW_SGIS_detail_texture GLEW_GET_VAR(__GLEW_SGIS_detail_texture)\r\n\r\n#endif /* GL_SGIS_detail_texture */\r\n\r\n/* -------------------------- GL_SGIS_fog_function ------------------------- */\r\n\r\n#ifndef GL_SGIS_fog_function\r\n#define GL_SGIS_fog_function 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat* points);\r\ntypedef void (GLAPIENTRY * PFNGLGETFOGFUNCSGISPROC) (GLfloat* points);\r\n\r\n#define glFogFuncSGIS GLEW_GET_FUN(__glewFogFuncSGIS)\r\n#define glGetFogFuncSGIS GLEW_GET_FUN(__glewGetFogFuncSGIS)\r\n\r\n#define GLEW_SGIS_fog_function GLEW_GET_VAR(__GLEW_SGIS_fog_function)\r\n\r\n#endif /* GL_SGIS_fog_function */\r\n\r\n/* ------------------------ GL_SGIS_generate_mipmap ------------------------ */\r\n\r\n#ifndef GL_SGIS_generate_mipmap\r\n#define GL_SGIS_generate_mipmap 1\r\n\r\n#define GL_GENERATE_MIPMAP_SGIS 0x8191\r\n#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192\r\n\r\n#define GLEW_SGIS_generate_mipmap GLEW_GET_VAR(__GLEW_SGIS_generate_mipmap)\r\n\r\n#endif /* GL_SGIS_generate_mipmap */\r\n\r\n/* -------------------------- GL_SGIS_multisample -------------------------- */\r\n\r\n#ifndef GL_SGIS_multisample\r\n#define GL_SGIS_multisample 1\r\n\r\n#define GL_MULTISAMPLE_SGIS 0x809D\r\n#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E\r\n#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F\r\n#define GL_SAMPLE_MASK_SGIS 0x80A0\r\n#define GL_1PASS_SGIS 0x80A1\r\n#define GL_2PASS_0_SGIS 0x80A2\r\n#define GL_2PASS_1_SGIS 0x80A3\r\n#define GL_4PASS_0_SGIS 0x80A4\r\n#define GL_4PASS_1_SGIS 0x80A5\r\n#define GL_4PASS_2_SGIS 0x80A6\r\n#define GL_4PASS_3_SGIS 0x80A7\r\n#define GL_SAMPLE_BUFFERS_SGIS 0x80A8\r\n#define GL_SAMPLES_SGIS 0x80A9\r\n#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA\r\n#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB\r\n#define GL_SAMPLE_PATTERN_SGIS 0x80AC\r\n#define GL_MULTISAMPLE_BIT_EXT 0x20000000\r\n\r\ntypedef void (GLAPIENTRY * PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert);\r\ntypedef void (GLAPIENTRY * PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern);\r\n\r\n#define glSampleMaskSGIS GLEW_GET_FUN(__glewSampleMaskSGIS)\r\n#define glSamplePatternSGIS GLEW_GET_FUN(__glewSamplePatternSGIS)\r\n\r\n#define GLEW_SGIS_multisample GLEW_GET_VAR(__GLEW_SGIS_multisample)\r\n\r\n#endif /* GL_SGIS_multisample */\r\n\r\n/* ------------------------- GL_SGIS_pixel_texture ------------------------- */\r\n\r\n#ifndef GL_SGIS_pixel_texture\r\n#define GL_SGIS_pixel_texture 1\r\n\r\n#define GLEW_SGIS_pixel_texture GLEW_GET_VAR(__GLEW_SGIS_pixel_texture)\r\n\r\n#endif /* GL_SGIS_pixel_texture */\r\n\r\n/* ----------------------- GL_SGIS_point_line_texgen ----------------------- */\r\n\r\n#ifndef GL_SGIS_point_line_texgen\r\n#define GL_SGIS_point_line_texgen 1\r\n\r\n#define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0\r\n#define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1\r\n#define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2\r\n#define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3\r\n#define GL_EYE_POINT_SGIS 0x81F4\r\n#define GL_OBJECT_POINT_SGIS 0x81F5\r\n#define GL_EYE_LINE_SGIS 0x81F6\r\n#define GL_OBJECT_LINE_SGIS 0x81F7\r\n\r\n#define GLEW_SGIS_point_line_texgen GLEW_GET_VAR(__GLEW_SGIS_point_line_texgen)\r\n\r\n#endif /* GL_SGIS_point_line_texgen */\r\n\r\n/* ------------------------ GL_SGIS_sharpen_texture ------------------------ */\r\n\r\n#ifndef GL_SGIS_sharpen_texture\r\n#define GL_SGIS_sharpen_texture 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat* points);\r\ntypedef void (GLAPIENTRY * PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat* points);\r\n\r\n#define glGetSharpenTexFuncSGIS GLEW_GET_FUN(__glewGetSharpenTexFuncSGIS)\r\n#define glSharpenTexFuncSGIS GLEW_GET_FUN(__glewSharpenTexFuncSGIS)\r\n\r\n#define GLEW_SGIS_sharpen_texture GLEW_GET_VAR(__GLEW_SGIS_sharpen_texture)\r\n\r\n#endif /* GL_SGIS_sharpen_texture */\r\n\r\n/* --------------------------- GL_SGIS_texture4D --------------------------- */\r\n\r\n#ifndef GL_SGIS_texture4D\r\n#define GL_SGIS_texture4D 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei extent, GLint border, GLenum format, GLenum type, const void* pixels);\r\ntypedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei extent, GLenum format, GLenum type, const void* pixels);\r\n\r\n#define glTexImage4DSGIS GLEW_GET_FUN(__glewTexImage4DSGIS)\r\n#define glTexSubImage4DSGIS GLEW_GET_FUN(__glewTexSubImage4DSGIS)\r\n\r\n#define GLEW_SGIS_texture4D GLEW_GET_VAR(__GLEW_SGIS_texture4D)\r\n\r\n#endif /* GL_SGIS_texture4D */\r\n\r\n/* ---------------------- GL_SGIS_texture_border_clamp --------------------- */\r\n\r\n#ifndef GL_SGIS_texture_border_clamp\r\n#define GL_SGIS_texture_border_clamp 1\r\n\r\n#define GL_CLAMP_TO_BORDER_SGIS 0x812D\r\n\r\n#define GLEW_SGIS_texture_border_clamp GLEW_GET_VAR(__GLEW_SGIS_texture_border_clamp)\r\n\r\n#endif /* GL_SGIS_texture_border_clamp */\r\n\r\n/* ----------------------- GL_SGIS_texture_edge_clamp ---------------------- */\r\n\r\n#ifndef GL_SGIS_texture_edge_clamp\r\n#define GL_SGIS_texture_edge_clamp 1\r\n\r\n#define GL_CLAMP_TO_EDGE_SGIS 0x812F\r\n\r\n#define GLEW_SGIS_texture_edge_clamp GLEW_GET_VAR(__GLEW_SGIS_texture_edge_clamp)\r\n\r\n#endif /* GL_SGIS_texture_edge_clamp */\r\n\r\n/* ------------------------ GL_SGIS_texture_filter4 ------------------------ */\r\n\r\n#ifndef GL_SGIS_texture_filter4\r\n#define GL_SGIS_texture_filter4 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat* weights);\r\ntypedef void (GLAPIENTRY * PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat* weights);\r\n\r\n#define glGetTexFilterFuncSGIS GLEW_GET_FUN(__glewGetTexFilterFuncSGIS)\r\n#define glTexFilterFuncSGIS GLEW_GET_FUN(__glewTexFilterFuncSGIS)\r\n\r\n#define GLEW_SGIS_texture_filter4 GLEW_GET_VAR(__GLEW_SGIS_texture_filter4)\r\n\r\n#endif /* GL_SGIS_texture_filter4 */\r\n\r\n/* -------------------------- GL_SGIS_texture_lod -------------------------- */\r\n\r\n#ifndef GL_SGIS_texture_lod\r\n#define GL_SGIS_texture_lod 1\r\n\r\n#define GL_TEXTURE_MIN_LOD_SGIS 0x813A\r\n#define GL_TEXTURE_MAX_LOD_SGIS 0x813B\r\n#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C\r\n#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D\r\n\r\n#define GLEW_SGIS_texture_lod GLEW_GET_VAR(__GLEW_SGIS_texture_lod)\r\n\r\n#endif /* GL_SGIS_texture_lod */\r\n\r\n/* ------------------------- GL_SGIS_texture_select ------------------------ */\r\n\r\n#ifndef GL_SGIS_texture_select\r\n#define GL_SGIS_texture_select 1\r\n\r\n#define GLEW_SGIS_texture_select GLEW_GET_VAR(__GLEW_SGIS_texture_select)\r\n\r\n#endif /* GL_SGIS_texture_select */\r\n\r\n/* ----------------------------- GL_SGIX_async ----------------------------- */\r\n\r\n#ifndef GL_SGIX_async\r\n#define GL_SGIX_async 1\r\n\r\n#define GL_ASYNC_MARKER_SGIX 0x8329\r\n\r\ntypedef void (GLAPIENTRY * PFNGLASYNCMARKERSGIXPROC) (GLuint marker);\r\ntypedef void (GLAPIENTRY * PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range);\r\ntypedef GLint (GLAPIENTRY * PFNGLFINISHASYNCSGIXPROC) (GLuint* markerp);\r\ntypedef GLuint (GLAPIENTRY * PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range);\r\ntypedef GLboolean (GLAPIENTRY * PFNGLISASYNCMARKERSGIXPROC) (GLuint marker);\r\ntypedef GLint (GLAPIENTRY * PFNGLPOLLASYNCSGIXPROC) (GLuint* markerp);\r\n\r\n#define glAsyncMarkerSGIX GLEW_GET_FUN(__glewAsyncMarkerSGIX)\r\n#define glDeleteAsyncMarkersSGIX GLEW_GET_FUN(__glewDeleteAsyncMarkersSGIX)\r\n#define glFinishAsyncSGIX GLEW_GET_FUN(__glewFinishAsyncSGIX)\r\n#define glGenAsyncMarkersSGIX GLEW_GET_FUN(__glewGenAsyncMarkersSGIX)\r\n#define glIsAsyncMarkerSGIX GLEW_GET_FUN(__glewIsAsyncMarkerSGIX)\r\n#define glPollAsyncSGIX GLEW_GET_FUN(__glewPollAsyncSGIX)\r\n\r\n#define GLEW_SGIX_async GLEW_GET_VAR(__GLEW_SGIX_async)\r\n\r\n#endif /* GL_SGIX_async */\r\n\r\n/* ------------------------ GL_SGIX_async_histogram ------------------------ */\r\n\r\n#ifndef GL_SGIX_async_histogram\r\n#define GL_SGIX_async_histogram 1\r\n\r\n#define GL_ASYNC_HISTOGRAM_SGIX 0x832C\r\n#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D\r\n\r\n#define GLEW_SGIX_async_histogram GLEW_GET_VAR(__GLEW_SGIX_async_histogram)\r\n\r\n#endif /* GL_SGIX_async_histogram */\r\n\r\n/* -------------------------- GL_SGIX_async_pixel -------------------------- */\r\n\r\n#ifndef GL_SGIX_async_pixel\r\n#define GL_SGIX_async_pixel 1\r\n\r\n#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C\r\n#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D\r\n#define GL_ASYNC_READ_PIXELS_SGIX 0x835E\r\n#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F\r\n#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360\r\n#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361\r\n\r\n#define GLEW_SGIX_async_pixel GLEW_GET_VAR(__GLEW_SGIX_async_pixel)\r\n\r\n#endif /* GL_SGIX_async_pixel */\r\n\r\n/* ----------------------- GL_SGIX_blend_alpha_minmax ---------------------- */\r\n\r\n#ifndef GL_SGIX_blend_alpha_minmax\r\n#define GL_SGIX_blend_alpha_minmax 1\r\n\r\n#define GL_ALPHA_MIN_SGIX 0x8320\r\n#define GL_ALPHA_MAX_SGIX 0x8321\r\n\r\n#define GLEW_SGIX_blend_alpha_minmax GLEW_GET_VAR(__GLEW_SGIX_blend_alpha_minmax)\r\n\r\n#endif /* GL_SGIX_blend_alpha_minmax */\r\n\r\n/* ---------------------------- GL_SGIX_clipmap ---------------------------- */\r\n\r\n#ifndef GL_SGIX_clipmap\r\n#define GL_SGIX_clipmap 1\r\n\r\n#define GLEW_SGIX_clipmap GLEW_GET_VAR(__GLEW_SGIX_clipmap)\r\n\r\n#endif /* GL_SGIX_clipmap */\r\n\r\n/* ---------------------- GL_SGIX_convolution_accuracy --------------------- */\r\n\r\n#ifndef GL_SGIX_convolution_accuracy\r\n#define GL_SGIX_convolution_accuracy 1\r\n\r\n#define GL_CONVOLUTION_HINT_SGIX 0x8316\r\n\r\n#define GLEW_SGIX_convolution_accuracy GLEW_GET_VAR(__GLEW_SGIX_convolution_accuracy)\r\n\r\n#endif /* GL_SGIX_convolution_accuracy */\r\n\r\n/* ------------------------- GL_SGIX_depth_texture ------------------------- */\r\n\r\n#ifndef GL_SGIX_depth_texture\r\n#define GL_SGIX_depth_texture 1\r\n\r\n#define GL_DEPTH_COMPONENT16_SGIX 0x81A5\r\n#define GL_DEPTH_COMPONENT24_SGIX 0x81A6\r\n#define GL_DEPTH_COMPONENT32_SGIX 0x81A7\r\n\r\n#define GLEW_SGIX_depth_texture GLEW_GET_VAR(__GLEW_SGIX_depth_texture)\r\n\r\n#endif /* GL_SGIX_depth_texture */\r\n\r\n/* -------------------------- GL_SGIX_flush_raster ------------------------- */\r\n\r\n#ifndef GL_SGIX_flush_raster\r\n#define GL_SGIX_flush_raster 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLFLUSHRASTERSGIXPROC) (void);\r\n\r\n#define glFlushRasterSGIX GLEW_GET_FUN(__glewFlushRasterSGIX)\r\n\r\n#define GLEW_SGIX_flush_raster GLEW_GET_VAR(__GLEW_SGIX_flush_raster)\r\n\r\n#endif /* GL_SGIX_flush_raster */\r\n\r\n/* --------------------------- GL_SGIX_fog_offset -------------------------- */\r\n\r\n#ifndef GL_SGIX_fog_offset\r\n#define GL_SGIX_fog_offset 1\r\n\r\n#define GL_FOG_OFFSET_SGIX 0x8198\r\n#define GL_FOG_OFFSET_VALUE_SGIX 0x8199\r\n\r\n#define GLEW_SGIX_fog_offset GLEW_GET_VAR(__GLEW_SGIX_fog_offset)\r\n\r\n#endif /* GL_SGIX_fog_offset */\r\n\r\n/* -------------------------- GL_SGIX_fog_texture -------------------------- */\r\n\r\n#ifndef GL_SGIX_fog_texture\r\n#define GL_SGIX_fog_texture 1\r\n\r\n#define GL_TEXTURE_FOG_SGIX 0\r\n#define GL_FOG_PATCHY_FACTOR_SGIX 0\r\n#define GL_FRAGMENT_FOG_SGIX 0\r\n\r\ntypedef void (GLAPIENTRY * PFNGLTEXTUREFOGSGIXPROC) (GLenum pname);\r\n\r\n#define glTextureFogSGIX GLEW_GET_FUN(__glewTextureFogSGIX)\r\n\r\n#define GLEW_SGIX_fog_texture GLEW_GET_VAR(__GLEW_SGIX_fog_texture)\r\n\r\n#endif /* GL_SGIX_fog_texture */\r\n\r\n/* ------------------- GL_SGIX_fragment_specular_lighting ------------------ */\r\n\r\n#ifndef GL_SGIX_fragment_specular_lighting\r\n#define GL_SGIX_fragment_specular_lighting 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode);\r\ntypedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param);\r\ntypedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param);\r\ntypedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param);\r\ntypedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param);\r\ntypedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, const GLfloat param);\r\ntypedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, const GLint param);\r\ntypedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum value, GLfloat* data);\r\ntypedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum value, GLint* data);\r\ntypedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat* data);\r\ntypedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint* data);\r\n\r\n#define glFragmentColorMaterialSGIX GLEW_GET_FUN(__glewFragmentColorMaterialSGIX)\r\n#define glFragmentLightModelfSGIX GLEW_GET_FUN(__glewFragmentLightModelfSGIX)\r\n#define glFragmentLightModelfvSGIX GLEW_GET_FUN(__glewFragmentLightModelfvSGIX)\r\n#define glFragmentLightModeliSGIX GLEW_GET_FUN(__glewFragmentLightModeliSGIX)\r\n#define glFragmentLightModelivSGIX GLEW_GET_FUN(__glewFragmentLightModelivSGIX)\r\n#define glFragmentLightfSGIX GLEW_GET_FUN(__glewFragmentLightfSGIX)\r\n#define glFragmentLightfvSGIX GLEW_GET_FUN(__glewFragmentLightfvSGIX)\r\n#define glFragmentLightiSGIX GLEW_GET_FUN(__glewFragmentLightiSGIX)\r\n#define glFragmentLightivSGIX GLEW_GET_FUN(__glewFragmentLightivSGIX)\r\n#define glFragmentMaterialfSGIX GLEW_GET_FUN(__glewFragmentMaterialfSGIX)\r\n#define glFragmentMaterialfvSGIX GLEW_GET_FUN(__glewFragmentMaterialfvSGIX)\r\n#define glFragmentMaterialiSGIX GLEW_GET_FUN(__glewFragmentMaterialiSGIX)\r\n#define glFragmentMaterialivSGIX GLEW_GET_FUN(__glewFragmentMaterialivSGIX)\r\n#define glGetFragmentLightfvSGIX GLEW_GET_FUN(__glewGetFragmentLightfvSGIX)\r\n#define glGetFragmentLightivSGIX GLEW_GET_FUN(__glewGetFragmentLightivSGIX)\r\n#define glGetFragmentMaterialfvSGIX GLEW_GET_FUN(__glewGetFragmentMaterialfvSGIX)\r\n#define glGetFragmentMaterialivSGIX GLEW_GET_FUN(__glewGetFragmentMaterialivSGIX)\r\n\r\n#define GLEW_SGIX_fragment_specular_lighting GLEW_GET_VAR(__GLEW_SGIX_fragment_specular_lighting)\r\n\r\n#endif /* GL_SGIX_fragment_specular_lighting */\r\n\r\n/* --------------------------- GL_SGIX_framezoom --------------------------- */\r\n\r\n#ifndef GL_SGIX_framezoom\r\n#define GL_SGIX_framezoom 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLFRAMEZOOMSGIXPROC) (GLint factor);\r\n\r\n#define glFrameZoomSGIX GLEW_GET_FUN(__glewFrameZoomSGIX)\r\n\r\n#define GLEW_SGIX_framezoom GLEW_GET_VAR(__GLEW_SGIX_framezoom)\r\n\r\n#endif /* GL_SGIX_framezoom */\r\n\r\n/* --------------------------- GL_SGIX_interlace --------------------------- */\r\n\r\n#ifndef GL_SGIX_interlace\r\n#define GL_SGIX_interlace 1\r\n\r\n#define GL_INTERLACE_SGIX 0x8094\r\n\r\n#define GLEW_SGIX_interlace GLEW_GET_VAR(__GLEW_SGIX_interlace)\r\n\r\n#endif /* GL_SGIX_interlace */\r\n\r\n/* ------------------------- GL_SGIX_ir_instrument1 ------------------------ */\r\n\r\n#ifndef GL_SGIX_ir_instrument1\r\n#define GL_SGIX_ir_instrument1 1\r\n\r\n#define GLEW_SGIX_ir_instrument1 GLEW_GET_VAR(__GLEW_SGIX_ir_instrument1)\r\n\r\n#endif /* GL_SGIX_ir_instrument1 */\r\n\r\n/* ------------------------- GL_SGIX_list_priority ------------------------- */\r\n\r\n#ifndef GL_SGIX_list_priority\r\n#define GL_SGIX_list_priority 1\r\n\r\n#define GLEW_SGIX_list_priority GLEW_GET_VAR(__GLEW_SGIX_list_priority)\r\n\r\n#endif /* GL_SGIX_list_priority */\r\n\r\n/* ------------------------- GL_SGIX_pixel_texture ------------------------- */\r\n\r\n#ifndef GL_SGIX_pixel_texture\r\n#define GL_SGIX_pixel_texture 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLPIXELTEXGENSGIXPROC) (GLenum mode);\r\n\r\n#define glPixelTexGenSGIX GLEW_GET_FUN(__glewPixelTexGenSGIX)\r\n\r\n#define GLEW_SGIX_pixel_texture GLEW_GET_VAR(__GLEW_SGIX_pixel_texture)\r\n\r\n#endif /* GL_SGIX_pixel_texture */\r\n\r\n/* ----------------------- GL_SGIX_pixel_texture_bits ---------------------- */\r\n\r\n#ifndef GL_SGIX_pixel_texture_bits\r\n#define GL_SGIX_pixel_texture_bits 1\r\n\r\n#define GLEW_SGIX_pixel_texture_bits GLEW_GET_VAR(__GLEW_SGIX_pixel_texture_bits)\r\n\r\n#endif /* GL_SGIX_pixel_texture_bits */\r\n\r\n/* ------------------------ GL_SGIX_reference_plane ------------------------ */\r\n\r\n#ifndef GL_SGIX_reference_plane\r\n#define GL_SGIX_reference_plane 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLREFERENCEPLANESGIXPROC) (const GLdouble* equation);\r\n\r\n#define glReferencePlaneSGIX GLEW_GET_FUN(__glewReferencePlaneSGIX)\r\n\r\n#define GLEW_SGIX_reference_plane GLEW_GET_VAR(__GLEW_SGIX_reference_plane)\r\n\r\n#endif /* GL_SGIX_reference_plane */\r\n\r\n/* ---------------------------- GL_SGIX_resample --------------------------- */\r\n\r\n#ifndef GL_SGIX_resample\r\n#define GL_SGIX_resample 1\r\n\r\n#define GL_PACK_RESAMPLE_SGIX 0x842E\r\n#define GL_UNPACK_RESAMPLE_SGIX 0x842F\r\n#define GL_RESAMPLE_DECIMATE_SGIX 0x8430\r\n#define GL_RESAMPLE_REPLICATE_SGIX 0x8433\r\n#define GL_RESAMPLE_ZERO_FILL_SGIX 0x8434\r\n\r\n#define GLEW_SGIX_resample GLEW_GET_VAR(__GLEW_SGIX_resample)\r\n\r\n#endif /* GL_SGIX_resample */\r\n\r\n/* ----------------------------- GL_SGIX_shadow ---------------------------- */\r\n\r\n#ifndef GL_SGIX_shadow\r\n#define GL_SGIX_shadow 1\r\n\r\n#define GL_TEXTURE_COMPARE_SGIX 0x819A\r\n#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B\r\n#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C\r\n#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D\r\n\r\n#define GLEW_SGIX_shadow GLEW_GET_VAR(__GLEW_SGIX_shadow)\r\n\r\n#endif /* GL_SGIX_shadow */\r\n\r\n/* ------------------------- GL_SGIX_shadow_ambient ------------------------ */\r\n\r\n#ifndef GL_SGIX_shadow_ambient\r\n#define GL_SGIX_shadow_ambient 1\r\n\r\n#define GL_SHADOW_AMBIENT_SGIX 0x80BF\r\n\r\n#define GLEW_SGIX_shadow_ambient GLEW_GET_VAR(__GLEW_SGIX_shadow_ambient)\r\n\r\n#endif /* GL_SGIX_shadow_ambient */\r\n\r\n/* ----------------------------- GL_SGIX_sprite ---------------------------- */\r\n\r\n#ifndef GL_SGIX_sprite\r\n#define GL_SGIX_sprite 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param);\r\ntypedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param);\r\ntypedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, GLint* params);\r\n\r\n#define glSpriteParameterfSGIX GLEW_GET_FUN(__glewSpriteParameterfSGIX)\r\n#define glSpriteParameterfvSGIX GLEW_GET_FUN(__glewSpriteParameterfvSGIX)\r\n#define glSpriteParameteriSGIX GLEW_GET_FUN(__glewSpriteParameteriSGIX)\r\n#define glSpriteParameterivSGIX GLEW_GET_FUN(__glewSpriteParameterivSGIX)\r\n\r\n#define GLEW_SGIX_sprite GLEW_GET_VAR(__GLEW_SGIX_sprite)\r\n\r\n#endif /* GL_SGIX_sprite */\r\n\r\n/* ----------------------- GL_SGIX_tag_sample_buffer ----------------------- */\r\n\r\n#ifndef GL_SGIX_tag_sample_buffer\r\n#define GL_SGIX_tag_sample_buffer 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLTAGSAMPLEBUFFERSGIXPROC) (void);\r\n\r\n#define glTagSampleBufferSGIX GLEW_GET_FUN(__glewTagSampleBufferSGIX)\r\n\r\n#define GLEW_SGIX_tag_sample_buffer GLEW_GET_VAR(__GLEW_SGIX_tag_sample_buffer)\r\n\r\n#endif /* GL_SGIX_tag_sample_buffer */\r\n\r\n/* ------------------------ GL_SGIX_texture_add_env ------------------------ */\r\n\r\n#ifndef GL_SGIX_texture_add_env\r\n#define GL_SGIX_texture_add_env 1\r\n\r\n#define GLEW_SGIX_texture_add_env GLEW_GET_VAR(__GLEW_SGIX_texture_add_env)\r\n\r\n#endif /* GL_SGIX_texture_add_env */\r\n\r\n/* -------------------- GL_SGIX_texture_coordinate_clamp ------------------- */\r\n\r\n#ifndef GL_SGIX_texture_coordinate_clamp\r\n#define GL_SGIX_texture_coordinate_clamp 1\r\n\r\n#define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369\r\n#define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A\r\n#define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B\r\n\r\n#define GLEW_SGIX_texture_coordinate_clamp GLEW_GET_VAR(__GLEW_SGIX_texture_coordinate_clamp)\r\n\r\n#endif /* GL_SGIX_texture_coordinate_clamp */\r\n\r\n/* ------------------------ GL_SGIX_texture_lod_bias ----------------------- */\r\n\r\n#ifndef GL_SGIX_texture_lod_bias\r\n#define GL_SGIX_texture_lod_bias 1\r\n\r\n#define GLEW_SGIX_texture_lod_bias GLEW_GET_VAR(__GLEW_SGIX_texture_lod_bias)\r\n\r\n#endif /* GL_SGIX_texture_lod_bias */\r\n\r\n/* ---------------------- GL_SGIX_texture_multi_buffer --------------------- */\r\n\r\n#ifndef GL_SGIX_texture_multi_buffer\r\n#define GL_SGIX_texture_multi_buffer 1\r\n\r\n#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E\r\n\r\n#define GLEW_SGIX_texture_multi_buffer GLEW_GET_VAR(__GLEW_SGIX_texture_multi_buffer)\r\n\r\n#endif /* GL_SGIX_texture_multi_buffer */\r\n\r\n/* ------------------------- GL_SGIX_texture_range ------------------------- */\r\n\r\n#ifndef GL_SGIX_texture_range\r\n#define GL_SGIX_texture_range 1\r\n\r\n#define GL_RGB_SIGNED_SGIX 0x85E0\r\n#define GL_RGBA_SIGNED_SGIX 0x85E1\r\n#define GL_ALPHA_SIGNED_SGIX 0x85E2\r\n#define GL_LUMINANCE_SIGNED_SGIX 0x85E3\r\n#define GL_INTENSITY_SIGNED_SGIX 0x85E4\r\n#define GL_LUMINANCE_ALPHA_SIGNED_SGIX 0x85E5\r\n#define GL_RGB16_SIGNED_SGIX 0x85E6\r\n#define GL_RGBA16_SIGNED_SGIX 0x85E7\r\n#define GL_ALPHA16_SIGNED_SGIX 0x85E8\r\n#define GL_LUMINANCE16_SIGNED_SGIX 0x85E9\r\n#define GL_INTENSITY16_SIGNED_SGIX 0x85EA\r\n#define GL_LUMINANCE16_ALPHA16_SIGNED_SGIX 0x85EB\r\n#define GL_RGB_EXTENDED_RANGE_SGIX 0x85EC\r\n#define GL_RGBA_EXTENDED_RANGE_SGIX 0x85ED\r\n#define GL_ALPHA_EXTENDED_RANGE_SGIX 0x85EE\r\n#define GL_LUMINANCE_EXTENDED_RANGE_SGIX 0x85EF\r\n#define GL_INTENSITY_EXTENDED_RANGE_SGIX 0x85F0\r\n#define GL_LUMINANCE_ALPHA_EXTENDED_RANGE_SGIX 0x85F1\r\n#define GL_RGB16_EXTENDED_RANGE_SGIX 0x85F2\r\n#define GL_RGBA16_EXTENDED_RANGE_SGIX 0x85F3\r\n#define GL_ALPHA16_EXTENDED_RANGE_SGIX 0x85F4\r\n#define GL_LUMINANCE16_EXTENDED_RANGE_SGIX 0x85F5\r\n#define GL_INTENSITY16_EXTENDED_RANGE_SGIX 0x85F6\r\n#define GL_LUMINANCE16_ALPHA16_EXTENDED_RANGE_SGIX 0x85F7\r\n#define GL_MIN_LUMINANCE_SGIS 0x85F8\r\n#define GL_MAX_LUMINANCE_SGIS 0x85F9\r\n#define GL_MIN_INTENSITY_SGIS 0x85FA\r\n#define GL_MAX_INTENSITY_SGIS 0x85FB\r\n\r\n#define GLEW_SGIX_texture_range GLEW_GET_VAR(__GLEW_SGIX_texture_range)\r\n\r\n#endif /* GL_SGIX_texture_range */\r\n\r\n/* ----------------------- GL_SGIX_texture_scale_bias ---------------------- */\r\n\r\n#ifndef GL_SGIX_texture_scale_bias\r\n#define GL_SGIX_texture_scale_bias 1\r\n\r\n#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179\r\n#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A\r\n#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B\r\n#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C\r\n\r\n#define GLEW_SGIX_texture_scale_bias GLEW_GET_VAR(__GLEW_SGIX_texture_scale_bias)\r\n\r\n#endif /* GL_SGIX_texture_scale_bias */\r\n\r\n/* ------------------------- GL_SGIX_vertex_preclip ------------------------ */\r\n\r\n#ifndef GL_SGIX_vertex_preclip\r\n#define GL_SGIX_vertex_preclip 1\r\n\r\n#define GL_VERTEX_PRECLIP_SGIX 0x83EE\r\n#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF\r\n\r\n#define GLEW_SGIX_vertex_preclip GLEW_GET_VAR(__GLEW_SGIX_vertex_preclip)\r\n\r\n#endif /* GL_SGIX_vertex_preclip */\r\n\r\n/* ---------------------- GL_SGIX_vertex_preclip_hint ---------------------- */\r\n\r\n#ifndef GL_SGIX_vertex_preclip_hint\r\n#define GL_SGIX_vertex_preclip_hint 1\r\n\r\n#define GL_VERTEX_PRECLIP_SGIX 0x83EE\r\n#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF\r\n\r\n#define GLEW_SGIX_vertex_preclip_hint GLEW_GET_VAR(__GLEW_SGIX_vertex_preclip_hint)\r\n\r\n#endif /* GL_SGIX_vertex_preclip_hint */\r\n\r\n/* ----------------------------- GL_SGIX_ycrcb ----------------------------- */\r\n\r\n#ifndef GL_SGIX_ycrcb\r\n#define GL_SGIX_ycrcb 1\r\n\r\n#define GLEW_SGIX_ycrcb GLEW_GET_VAR(__GLEW_SGIX_ycrcb)\r\n\r\n#endif /* GL_SGIX_ycrcb */\r\n\r\n/* -------------------------- GL_SGI_color_matrix -------------------------- */\r\n\r\n#ifndef GL_SGI_color_matrix\r\n#define GL_SGI_color_matrix 1\r\n\r\n#define GL_COLOR_MATRIX_SGI 0x80B1\r\n#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2\r\n#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3\r\n#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4\r\n#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5\r\n#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6\r\n#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7\r\n#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8\r\n#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9\r\n#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA\r\n#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB\r\n\r\n#define GLEW_SGI_color_matrix GLEW_GET_VAR(__GLEW_SGI_color_matrix)\r\n\r\n#endif /* GL_SGI_color_matrix */\r\n\r\n/* --------------------------- GL_SGI_color_table -------------------------- */\r\n\r\n#ifndef GL_SGI_color_table\r\n#define GL_SGI_color_table 1\r\n\r\n#define GL_COLOR_TABLE_SGI 0x80D0\r\n#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1\r\n#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2\r\n#define GL_PROXY_COLOR_TABLE_SGI 0x80D3\r\n#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4\r\n#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5\r\n#define GL_COLOR_TABLE_SCALE_SGI 0x80D6\r\n#define GL_COLOR_TABLE_BIAS_SGI 0x80D7\r\n#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8\r\n#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9\r\n#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA\r\n#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB\r\n#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC\r\n#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD\r\n#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE\r\n#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF\r\n\r\ntypedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void* table);\r\ntypedef void (GLAPIENTRY * PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);\r\ntypedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint* params);\r\ntypedef void (GLAPIENTRY * PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, void* table);\r\n\r\n#define glColorTableParameterfvSGI GLEW_GET_FUN(__glewColorTableParameterfvSGI)\r\n#define glColorTableParameterivSGI GLEW_GET_FUN(__glewColorTableParameterivSGI)\r\n#define glColorTableSGI GLEW_GET_FUN(__glewColorTableSGI)\r\n#define glCopyColorTableSGI GLEW_GET_FUN(__glewCopyColorTableSGI)\r\n#define glGetColorTableParameterfvSGI GLEW_GET_FUN(__glewGetColorTableParameterfvSGI)\r\n#define glGetColorTableParameterivSGI GLEW_GET_FUN(__glewGetColorTableParameterivSGI)\r\n#define glGetColorTableSGI GLEW_GET_FUN(__glewGetColorTableSGI)\r\n\r\n#define GLEW_SGI_color_table GLEW_GET_VAR(__GLEW_SGI_color_table)\r\n\r\n#endif /* GL_SGI_color_table */\r\n\r\n/* ----------------------- GL_SGI_texture_color_table ---------------------- */\r\n\r\n#ifndef GL_SGI_texture_color_table\r\n#define GL_SGI_texture_color_table 1\r\n\r\n#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC\r\n#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD\r\n\r\n#define GLEW_SGI_texture_color_table GLEW_GET_VAR(__GLEW_SGI_texture_color_table)\r\n\r\n#endif /* GL_SGI_texture_color_table */\r\n\r\n/* ------------------------- GL_SUNX_constant_data ------------------------- */\r\n\r\n#ifndef GL_SUNX_constant_data\r\n#define GL_SUNX_constant_data 1\r\n\r\n#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5\r\n#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6\r\n\r\ntypedef void (GLAPIENTRY * PFNGLFINISHTEXTURESUNXPROC) (void);\r\n\r\n#define glFinishTextureSUNX GLEW_GET_FUN(__glewFinishTextureSUNX)\r\n\r\n#define GLEW_SUNX_constant_data GLEW_GET_VAR(__GLEW_SUNX_constant_data)\r\n\r\n#endif /* GL_SUNX_constant_data */\r\n\r\n/* -------------------- GL_SUN_convolution_border_modes -------------------- */\r\n\r\n#ifndef GL_SUN_convolution_border_modes\r\n#define GL_SUN_convolution_border_modes 1\r\n\r\n#define GL_WRAP_BORDER_SUN 0x81D4\r\n\r\n#define GLEW_SUN_convolution_border_modes GLEW_GET_VAR(__GLEW_SUN_convolution_border_modes)\r\n\r\n#endif /* GL_SUN_convolution_border_modes */\r\n\r\n/* -------------------------- GL_SUN_global_alpha -------------------------- */\r\n\r\n#ifndef GL_SUN_global_alpha\r\n#define GL_SUN_global_alpha 1\r\n\r\n#define GL_GLOBAL_ALPHA_SUN 0x81D9\r\n#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA\r\n\r\ntypedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor);\r\ntypedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor);\r\ntypedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor);\r\ntypedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor);\r\ntypedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor);\r\ntypedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor);\r\ntypedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor);\r\ntypedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor);\r\n\r\n#define glGlobalAlphaFactorbSUN GLEW_GET_FUN(__glewGlobalAlphaFactorbSUN)\r\n#define glGlobalAlphaFactordSUN GLEW_GET_FUN(__glewGlobalAlphaFactordSUN)\r\n#define glGlobalAlphaFactorfSUN GLEW_GET_FUN(__glewGlobalAlphaFactorfSUN)\r\n#define glGlobalAlphaFactoriSUN GLEW_GET_FUN(__glewGlobalAlphaFactoriSUN)\r\n#define glGlobalAlphaFactorsSUN GLEW_GET_FUN(__glewGlobalAlphaFactorsSUN)\r\n#define glGlobalAlphaFactorubSUN GLEW_GET_FUN(__glewGlobalAlphaFactorubSUN)\r\n#define glGlobalAlphaFactoruiSUN GLEW_GET_FUN(__glewGlobalAlphaFactoruiSUN)\r\n#define glGlobalAlphaFactorusSUN GLEW_GET_FUN(__glewGlobalAlphaFactorusSUN)\r\n\r\n#define GLEW_SUN_global_alpha GLEW_GET_VAR(__GLEW_SUN_global_alpha)\r\n\r\n#endif /* GL_SUN_global_alpha */\r\n\r\n/* --------------------------- GL_SUN_mesh_array --------------------------- */\r\n\r\n#ifndef GL_SUN_mesh_array\r\n#define GL_SUN_mesh_array 1\r\n\r\n#define GL_QUAD_MESH_SUN 0x8614\r\n#define GL_TRIANGLE_MESH_SUN 0x8615\r\n\r\n#define GLEW_SUN_mesh_array GLEW_GET_VAR(__GLEW_SUN_mesh_array)\r\n\r\n#endif /* GL_SUN_mesh_array */\r\n\r\n/* ------------------------ GL_SUN_read_video_pixels ----------------------- */\r\n\r\n#ifndef GL_SUN_read_video_pixels\r\n#define GL_SUN_read_video_pixels 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLREADVIDEOPIXELSSUNPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels);\r\n\r\n#define glReadVideoPixelsSUN GLEW_GET_FUN(__glewReadVideoPixelsSUN)\r\n\r\n#define GLEW_SUN_read_video_pixels GLEW_GET_VAR(__GLEW_SUN_read_video_pixels)\r\n\r\n#endif /* GL_SUN_read_video_pixels */\r\n\r\n/* --------------------------- GL_SUN_slice_accum -------------------------- */\r\n\r\n#ifndef GL_SUN_slice_accum\r\n#define GL_SUN_slice_accum 1\r\n\r\n#define GL_SLICE_ACCUM_SUN 0x85CC\r\n\r\n#define GLEW_SUN_slice_accum GLEW_GET_VAR(__GLEW_SUN_slice_accum)\r\n\r\n#endif /* GL_SUN_slice_accum */\r\n\r\n/* -------------------------- GL_SUN_triangle_list ------------------------- */\r\n\r\n#ifndef GL_SUN_triangle_list\r\n#define GL_SUN_triangle_list 1\r\n\r\n#define GL_RESTART_SUN 0x01\r\n#define GL_REPLACE_MIDDLE_SUN 0x02\r\n#define GL_REPLACE_OLDEST_SUN 0x03\r\n#define GL_TRIANGLE_LIST_SUN 0x81D7\r\n#define GL_REPLACEMENT_CODE_SUN 0x81D8\r\n#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0\r\n#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1\r\n#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2\r\n#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3\r\n#define GL_R1UI_V3F_SUN 0x85C4\r\n#define GL_R1UI_C4UB_V3F_SUN 0x85C5\r\n#define GL_R1UI_C3F_V3F_SUN 0x85C6\r\n#define GL_R1UI_N3F_V3F_SUN 0x85C7\r\n#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8\r\n#define GL_R1UI_T2F_V3F_SUN 0x85C9\r\n#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA\r\n#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB\r\n\r\ntypedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const void* pointer);\r\ntypedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code);\r\ntypedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte* code);\r\ntypedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code);\r\ntypedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint* code);\r\ntypedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code);\r\ntypedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort* code);\r\n\r\n#define glReplacementCodePointerSUN GLEW_GET_FUN(__glewReplacementCodePointerSUN)\r\n#define glReplacementCodeubSUN GLEW_GET_FUN(__glewReplacementCodeubSUN)\r\n#define glReplacementCodeubvSUN GLEW_GET_FUN(__glewReplacementCodeubvSUN)\r\n#define glReplacementCodeuiSUN GLEW_GET_FUN(__glewReplacementCodeuiSUN)\r\n#define glReplacementCodeuivSUN GLEW_GET_FUN(__glewReplacementCodeuivSUN)\r\n#define glReplacementCodeusSUN GLEW_GET_FUN(__glewReplacementCodeusSUN)\r\n#define glReplacementCodeusvSUN GLEW_GET_FUN(__glewReplacementCodeusvSUN)\r\n\r\n#define GLEW_SUN_triangle_list GLEW_GET_VAR(__GLEW_SUN_triangle_list)\r\n\r\n#endif /* GL_SUN_triangle_list */\r\n\r\n/* ----------------------------- GL_SUN_vertex ----------------------------- */\r\n\r\n#ifndef GL_SUN_vertex\r\n#define GL_SUN_vertex 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z);\r\ntypedef void (GLAPIENTRY * PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat* c, const GLfloat *v);\r\ntypedef void (GLAPIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);\r\ntypedef void (GLAPIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* c, const GLfloat *n, const GLfloat *v);\r\ntypedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y);\r\ntypedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte* c, const GLfloat *v);\r\ntypedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z);\r\ntypedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte* c, const GLfloat *v);\r\ntypedef void (GLAPIENTRY * PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);\r\ntypedef void (GLAPIENTRY * PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* n, const GLfloat *v);\r\ntypedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z);\r\ntypedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *c, const GLfloat *v);\r\ntypedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);\r\ntypedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *c, const GLfloat *n, const GLfloat *v);\r\ntypedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z);\r\ntypedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint* rc, const GLubyte *c, const GLfloat *v);\r\ntypedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);\r\ntypedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *n, const GLfloat *v);\r\ntypedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);\r\ntypedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v);\r\ntypedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);\r\ntypedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v);\r\ntypedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z);\r\ntypedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *v);\r\ntypedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z);\r\ntypedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *v);\r\ntypedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z);\r\ntypedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *v);\r\ntypedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);\r\ntypedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *n, const GLfloat *v);\r\ntypedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z);\r\ntypedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat* tc, const GLubyte *c, const GLfloat *v);\r\ntypedef void (GLAPIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);\r\ntypedef void (GLAPIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *n, const GLfloat *v);\r\ntypedef void (GLAPIENTRY * PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z);\r\ntypedef void (GLAPIENTRY * PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *v);\r\ntypedef void (GLAPIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\r\ntypedef void (GLAPIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *n, const GLfloat *v);\r\ntypedef void (GLAPIENTRY * PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\r\ntypedef void (GLAPIENTRY * PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat* tc, const GLfloat *v);\r\n\r\n#define glColor3fVertex3fSUN GLEW_GET_FUN(__glewColor3fVertex3fSUN)\r\n#define glColor3fVertex3fvSUN GLEW_GET_FUN(__glewColor3fVertex3fvSUN)\r\n#define glColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewColor4fNormal3fVertex3fSUN)\r\n#define glColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewColor4fNormal3fVertex3fvSUN)\r\n#define glColor4ubVertex2fSUN GLEW_GET_FUN(__glewColor4ubVertex2fSUN)\r\n#define glColor4ubVertex2fvSUN GLEW_GET_FUN(__glewColor4ubVertex2fvSUN)\r\n#define glColor4ubVertex3fSUN GLEW_GET_FUN(__glewColor4ubVertex3fSUN)\r\n#define glColor4ubVertex3fvSUN GLEW_GET_FUN(__glewColor4ubVertex3fvSUN)\r\n#define glNormal3fVertex3fSUN GLEW_GET_FUN(__glewNormal3fVertex3fSUN)\r\n#define glNormal3fVertex3fvSUN GLEW_GET_FUN(__glewNormal3fVertex3fvSUN)\r\n#define glReplacementCodeuiColor3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor3fVertex3fSUN)\r\n#define glReplacementCodeuiColor3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor3fVertex3fvSUN)\r\n#define glReplacementCodeuiColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4fNormal3fVertex3fSUN)\r\n#define glReplacementCodeuiColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4fNormal3fVertex3fvSUN)\r\n#define glReplacementCodeuiColor4ubVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4ubVertex3fSUN)\r\n#define glReplacementCodeuiColor4ubVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4ubVertex3fvSUN)\r\n#define glReplacementCodeuiNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiNormal3fVertex3fSUN)\r\n#define glReplacementCodeuiNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiNormal3fVertex3fvSUN)\r\n#define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN)\r\n#define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN)\r\n#define glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN)\r\n#define glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN)\r\n#define glReplacementCodeuiTexCoord2fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fVertex3fSUN)\r\n#define glReplacementCodeuiTexCoord2fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fVertex3fvSUN)\r\n#define glReplacementCodeuiVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiVertex3fSUN)\r\n#define glReplacementCodeuiVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiVertex3fvSUN)\r\n#define glTexCoord2fColor3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor3fVertex3fSUN)\r\n#define glTexCoord2fColor3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor3fVertex3fvSUN)\r\n#define glTexCoord2fColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor4fNormal3fVertex3fSUN)\r\n#define glTexCoord2fColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor4fNormal3fVertex3fvSUN)\r\n#define glTexCoord2fColor4ubVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor4ubVertex3fSUN)\r\n#define glTexCoord2fColor4ubVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor4ubVertex3fvSUN)\r\n#define glTexCoord2fNormal3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fNormal3fVertex3fSUN)\r\n#define glTexCoord2fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fNormal3fVertex3fvSUN)\r\n#define glTexCoord2fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fVertex3fSUN)\r\n#define glTexCoord2fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fVertex3fvSUN)\r\n#define glTexCoord4fColor4fNormal3fVertex4fSUN GLEW_GET_FUN(__glewTexCoord4fColor4fNormal3fVertex4fSUN)\r\n#define glTexCoord4fColor4fNormal3fVertex4fvSUN GLEW_GET_FUN(__glewTexCoord4fColor4fNormal3fVertex4fvSUN)\r\n#define glTexCoord4fVertex4fSUN GLEW_GET_FUN(__glewTexCoord4fVertex4fSUN)\r\n#define glTexCoord4fVertex4fvSUN GLEW_GET_FUN(__glewTexCoord4fVertex4fvSUN)\r\n\r\n#define GLEW_SUN_vertex GLEW_GET_VAR(__GLEW_SUN_vertex)\r\n\r\n#endif /* GL_SUN_vertex */\r\n\r\n/* -------------------------- GL_WIN_phong_shading ------------------------- */\r\n\r\n#ifndef GL_WIN_phong_shading\r\n#define GL_WIN_phong_shading 1\r\n\r\n#define GL_PHONG_WIN 0x80EA\r\n#define GL_PHONG_HINT_WIN 0x80EB\r\n\r\n#define GLEW_WIN_phong_shading GLEW_GET_VAR(__GLEW_WIN_phong_shading)\r\n\r\n#endif /* GL_WIN_phong_shading */\r\n\r\n/* -------------------------- GL_WIN_specular_fog -------------------------- */\r\n\r\n#ifndef GL_WIN_specular_fog\r\n#define GL_WIN_specular_fog 1\r\n\r\n#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC\r\n\r\n#define GLEW_WIN_specular_fog GLEW_GET_VAR(__GLEW_WIN_specular_fog)\r\n\r\n#endif /* GL_WIN_specular_fog */\r\n\r\n/* ---------------------------- GL_WIN_swap_hint --------------------------- */\r\n\r\n#ifndef GL_WIN_swap_hint\r\n#define GL_WIN_swap_hint 1\r\n\r\ntypedef void (GLAPIENTRY * PFNGLADDSWAPHINTRECTWINPROC) (GLint x, GLint y, GLsizei width, GLsizei height);\r\n\r\n#define glAddSwapHintRectWIN GLEW_GET_FUN(__glewAddSwapHintRectWIN)\r\n\r\n#define GLEW_WIN_swap_hint GLEW_GET_VAR(__GLEW_WIN_swap_hint)\r\n\r\n#endif /* GL_WIN_swap_hint */\r\n\r\n/* ------------------------------------------------------------------------- */\r\n\r\n#if defined(GLEW_MX) && defined(_WIN32)\r\n#define GLEW_FUN_EXPORT\r\n#else\r\n#define GLEW_FUN_EXPORT GLEWAPI\r\n#endif /* GLEW_MX */\r\n\r\n#if defined(GLEW_MX)\r\n#define GLEW_VAR_EXPORT\r\n#else\r\n#define GLEW_VAR_EXPORT GLEWAPI\r\n#endif /* GLEW_MX */\r\n\r\n#if defined(GLEW_MX) && defined(_WIN32)\r\nstruct GLEWContextStruct\r\n{\r\n#endif /* GLEW_MX */\r\n\r\nGLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DPROC __glewCopyTexSubImage3D;\r\nGLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSPROC __glewDrawRangeElements;\r\nGLEW_FUN_EXPORT PFNGLTEXIMAGE3DPROC __glewTexImage3D;\r\nGLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DPROC __glewTexSubImage3D;\r\n\r\nGLEW_FUN_EXPORT PFNGLACTIVETEXTUREPROC __glewActiveTexture;\r\nGLEW_FUN_EXPORT PFNGLCLIENTACTIVETEXTUREPROC __glewClientActiveTexture;\r\nGLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE1DPROC __glewCompressedTexImage1D;\r\nGLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE2DPROC __glewCompressedTexImage2D;\r\nGLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DPROC __glewCompressedTexImage3D;\r\nGLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC __glewCompressedTexSubImage1D;\r\nGLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC __glewCompressedTexSubImage2D;\r\nGLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC __glewCompressedTexSubImage3D;\r\nGLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXIMAGEPROC __glewGetCompressedTexImage;\r\nGLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXDPROC __glewLoadTransposeMatrixd;\r\nGLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXFPROC __glewLoadTransposeMatrixf;\r\nGLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXDPROC __glewMultTransposeMatrixd;\r\nGLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXFPROC __glewMultTransposeMatrixf;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DPROC __glewMultiTexCoord1d;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DVPROC __glewMultiTexCoord1dv;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FPROC __glewMultiTexCoord1f;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FVPROC __glewMultiTexCoord1fv;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IPROC __glewMultiTexCoord1i;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IVPROC __glewMultiTexCoord1iv;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SPROC __glewMultiTexCoord1s;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SVPROC __glewMultiTexCoord1sv;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DPROC __glewMultiTexCoord2d;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DVPROC __glewMultiTexCoord2dv;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FPROC __glewMultiTexCoord2f;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FVPROC __glewMultiTexCoord2fv;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IPROC __glewMultiTexCoord2i;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IVPROC __glewMultiTexCoord2iv;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SPROC __glewMultiTexCoord2s;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SVPROC __glewMultiTexCoord2sv;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DPROC __glewMultiTexCoord3d;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DVPROC __glewMultiTexCoord3dv;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FPROC __glewMultiTexCoord3f;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FVPROC __glewMultiTexCoord3fv;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IPROC __glewMultiTexCoord3i;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IVPROC __glewMultiTexCoord3iv;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SPROC __glewMultiTexCoord3s;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SVPROC __glewMultiTexCoord3sv;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DPROC __glewMultiTexCoord4d;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DVPROC __glewMultiTexCoord4dv;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FPROC __glewMultiTexCoord4f;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FVPROC __glewMultiTexCoord4fv;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IPROC __glewMultiTexCoord4i;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IVPROC __glewMultiTexCoord4iv;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SPROC __glewMultiTexCoord4s;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SVPROC __glewMultiTexCoord4sv;\r\nGLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEPROC __glewSampleCoverage;\r\n\r\nGLEW_FUN_EXPORT PFNGLBLENDCOLORPROC __glewBlendColor;\r\nGLEW_FUN_EXPORT PFNGLBLENDEQUATIONPROC __glewBlendEquation;\r\nGLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEPROC __glewBlendFuncSeparate;\r\nGLEW_FUN_EXPORT PFNGLFOGCOORDPOINTERPROC __glewFogCoordPointer;\r\nGLEW_FUN_EXPORT PFNGLFOGCOORDDPROC __glewFogCoordd;\r\nGLEW_FUN_EXPORT PFNGLFOGCOORDDVPROC __glewFogCoorddv;\r\nGLEW_FUN_EXPORT PFNGLFOGCOORDFPROC __glewFogCoordf;\r\nGLEW_FUN_EXPORT PFNGLFOGCOORDFVPROC __glewFogCoordfv;\r\nGLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSPROC __glewMultiDrawArrays;\r\nGLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSPROC __glewMultiDrawElements;\r\nGLEW_FUN_EXPORT PFNGLPOINTPARAMETERFPROC __glewPointParameterf;\r\nGLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVPROC __glewPointParameterfv;\r\nGLEW_FUN_EXPORT PFNGLPOINTPARAMETERIPROC __glewPointParameteri;\r\nGLEW_FUN_EXPORT PFNGLPOINTPARAMETERIVPROC __glewPointParameteriv;\r\nGLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BPROC __glewSecondaryColor3b;\r\nGLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BVPROC __glewSecondaryColor3bv;\r\nGLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DPROC __glewSecondaryColor3d;\r\nGLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DVPROC __glewSecondaryColor3dv;\r\nGLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FPROC __glewSecondaryColor3f;\r\nGLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FVPROC __glewSecondaryColor3fv;\r\nGLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IPROC __glewSecondaryColor3i;\r\nGLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IVPROC __glewSecondaryColor3iv;\r\nGLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SPROC __glewSecondaryColor3s;\r\nGLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SVPROC __glewSecondaryColor3sv;\r\nGLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBPROC __glewSecondaryColor3ub;\r\nGLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBVPROC __glewSecondaryColor3ubv;\r\nGLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIPROC __glewSecondaryColor3ui;\r\nGLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIVPROC __glewSecondaryColor3uiv;\r\nGLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USPROC __glewSecondaryColor3us;\r\nGLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USVPROC __glewSecondaryColor3usv;\r\nGLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTERPROC __glewSecondaryColorPointer;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS2DPROC __glewWindowPos2d;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS2DVPROC __glewWindowPos2dv;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS2FPROC __glewWindowPos2f;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS2FVPROC __glewWindowPos2fv;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS2IPROC __glewWindowPos2i;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS2IVPROC __glewWindowPos2iv;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS2SPROC __glewWindowPos2s;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS2SVPROC __glewWindowPos2sv;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS3DPROC __glewWindowPos3d;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS3DVPROC __glewWindowPos3dv;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS3FPROC __glewWindowPos3f;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS3FVPROC __glewWindowPos3fv;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS3IPROC __glewWindowPos3i;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS3IVPROC __glewWindowPos3iv;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS3SPROC __glewWindowPos3s;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS3SVPROC __glewWindowPos3sv;\r\n\r\nGLEW_FUN_EXPORT PFNGLBEGINQUERYPROC __glewBeginQuery;\r\nGLEW_FUN_EXPORT PFNGLBINDBUFFERPROC __glewBindBuffer;\r\nGLEW_FUN_EXPORT PFNGLBUFFERDATAPROC __glewBufferData;\r\nGLEW_FUN_EXPORT PFNGLBUFFERSUBDATAPROC __glewBufferSubData;\r\nGLEW_FUN_EXPORT PFNGLDELETEBUFFERSPROC __glewDeleteBuffers;\r\nGLEW_FUN_EXPORT PFNGLDELETEQUERIESPROC __glewDeleteQueries;\r\nGLEW_FUN_EXPORT PFNGLENDQUERYPROC __glewEndQuery;\r\nGLEW_FUN_EXPORT PFNGLGENBUFFERSPROC __glewGenBuffers;\r\nGLEW_FUN_EXPORT PFNGLGENQUERIESPROC __glewGenQueries;\r\nGLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERIVPROC __glewGetBufferParameteriv;\r\nGLEW_FUN_EXPORT PFNGLGETBUFFERPOINTERVPROC __glewGetBufferPointerv;\r\nGLEW_FUN_EXPORT PFNGLGETBUFFERSUBDATAPROC __glewGetBufferSubData;\r\nGLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVPROC __glewGetQueryObjectiv;\r\nGLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVPROC __glewGetQueryObjectuiv;\r\nGLEW_FUN_EXPORT PFNGLGETQUERYIVPROC __glewGetQueryiv;\r\nGLEW_FUN_EXPORT PFNGLISBUFFERPROC __glewIsBuffer;\r\nGLEW_FUN_EXPORT PFNGLISQUERYPROC __glewIsQuery;\r\nGLEW_FUN_EXPORT PFNGLMAPBUFFERPROC __glewMapBuffer;\r\nGLEW_FUN_EXPORT PFNGLUNMAPBUFFERPROC __glewUnmapBuffer;\r\n\r\nGLEW_FUN_EXPORT PFNGLATTACHSHADERPROC __glewAttachShader;\r\nGLEW_FUN_EXPORT PFNGLBINDATTRIBLOCATIONPROC __glewBindAttribLocation;\r\nGLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEPROC __glewBlendEquationSeparate;\r\nGLEW_FUN_EXPORT PFNGLCOMPILESHADERPROC __glewCompileShader;\r\nGLEW_FUN_EXPORT PFNGLCREATEPROGRAMPROC __glewCreateProgram;\r\nGLEW_FUN_EXPORT PFNGLCREATESHADERPROC __glewCreateShader;\r\nGLEW_FUN_EXPORT PFNGLDELETEPROGRAMPROC __glewDeleteProgram;\r\nGLEW_FUN_EXPORT PFNGLDELETESHADERPROC __glewDeleteShader;\r\nGLEW_FUN_EXPORT PFNGLDETACHSHADERPROC __glewDetachShader;\r\nGLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBARRAYPROC __glewDisableVertexAttribArray;\r\nGLEW_FUN_EXPORT PFNGLDRAWBUFFERSPROC __glewDrawBuffers;\r\nGLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBARRAYPROC __glewEnableVertexAttribArray;\r\nGLEW_FUN_EXPORT PFNGLGETACTIVEATTRIBPROC __glewGetActiveAttrib;\r\nGLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMPROC __glewGetActiveUniform;\r\nGLEW_FUN_EXPORT PFNGLGETATTACHEDSHADERSPROC __glewGetAttachedShaders;\r\nGLEW_FUN_EXPORT PFNGLGETATTRIBLOCATIONPROC __glewGetAttribLocation;\r\nGLEW_FUN_EXPORT PFNGLGETPROGRAMINFOLOGPROC __glewGetProgramInfoLog;\r\nGLEW_FUN_EXPORT PFNGLGETPROGRAMIVPROC __glewGetProgramiv;\r\nGLEW_FUN_EXPORT PFNGLGETSHADERINFOLOGPROC __glewGetShaderInfoLog;\r\nGLEW_FUN_EXPORT PFNGLGETSHADERSOURCEPROC __glewGetShaderSource;\r\nGLEW_FUN_EXPORT PFNGLGETSHADERIVPROC __glewGetShaderiv;\r\nGLEW_FUN_EXPORT PFNGLGETUNIFORMLOCATIONPROC __glewGetUniformLocation;\r\nGLEW_FUN_EXPORT PFNGLGETUNIFORMFVPROC __glewGetUniformfv;\r\nGLEW_FUN_EXPORT PFNGLGETUNIFORMIVPROC __glewGetUniformiv;\r\nGLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVPROC __glewGetVertexAttribPointerv;\r\nGLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVPROC __glewGetVertexAttribdv;\r\nGLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVPROC __glewGetVertexAttribfv;\r\nGLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVPROC __glewGetVertexAttribiv;\r\nGLEW_FUN_EXPORT PFNGLISPROGRAMPROC __glewIsProgram;\r\nGLEW_FUN_EXPORT PFNGLISSHADERPROC __glewIsShader;\r\nGLEW_FUN_EXPORT PFNGLLINKPROGRAMPROC __glewLinkProgram;\r\nGLEW_FUN_EXPORT PFNGLSHADERSOURCEPROC __glewShaderSource;\r\nGLEW_FUN_EXPORT PFNGLSTENCILFUNCSEPARATEPROC __glewStencilFuncSeparate;\r\nGLEW_FUN_EXPORT PFNGLSTENCILMASKSEPARATEPROC __glewStencilMaskSeparate;\r\nGLEW_FUN_EXPORT PFNGLSTENCILOPSEPARATEPROC __glewStencilOpSeparate;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM1FPROC __glewUniform1f;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM1FVPROC __glewUniform1fv;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM1IPROC __glewUniform1i;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM1IVPROC __glewUniform1iv;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM2FPROC __glewUniform2f;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM2FVPROC __glewUniform2fv;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM2IPROC __glewUniform2i;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM2IVPROC __glewUniform2iv;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM3FPROC __glewUniform3f;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM3FVPROC __glewUniform3fv;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM3IPROC __glewUniform3i;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM3IVPROC __glewUniform3iv;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM4FPROC __glewUniform4f;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM4FVPROC __glewUniform4fv;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM4IPROC __glewUniform4i;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM4IVPROC __glewUniform4iv;\r\nGLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2FVPROC __glewUniformMatrix2fv;\r\nGLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3FVPROC __glewUniformMatrix3fv;\r\nGLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4FVPROC __glewUniformMatrix4fv;\r\nGLEW_FUN_EXPORT PFNGLUSEPROGRAMPROC __glewUseProgram;\r\nGLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMPROC __glewValidateProgram;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DPROC __glewVertexAttrib1d;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVPROC __glewVertexAttrib1dv;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FPROC __glewVertexAttrib1f;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVPROC __glewVertexAttrib1fv;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SPROC __glewVertexAttrib1s;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVPROC __glewVertexAttrib1sv;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DPROC __glewVertexAttrib2d;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVPROC __glewVertexAttrib2dv;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FPROC __glewVertexAttrib2f;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVPROC __glewVertexAttrib2fv;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SPROC __glewVertexAttrib2s;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVPROC __glewVertexAttrib2sv;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DPROC __glewVertexAttrib3d;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVPROC __glewVertexAttrib3dv;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FPROC __glewVertexAttrib3f;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVPROC __glewVertexAttrib3fv;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SPROC __glewVertexAttrib3s;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVPROC __glewVertexAttrib3sv;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NBVPROC __glewVertexAttrib4Nbv;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NIVPROC __glewVertexAttrib4Niv;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NSVPROC __glewVertexAttrib4Nsv;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBPROC __glewVertexAttrib4Nub;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBVPROC __glewVertexAttrib4Nubv;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUIVPROC __glewVertexAttrib4Nuiv;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUSVPROC __glewVertexAttrib4Nusv;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4BVPROC __glewVertexAttrib4bv;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DPROC __glewVertexAttrib4d;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVPROC __glewVertexAttrib4dv;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FPROC __glewVertexAttrib4f;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVPROC __glewVertexAttrib4fv;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4IVPROC __glewVertexAttrib4iv;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SPROC __glewVertexAttrib4s;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVPROC __glewVertexAttrib4sv;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVPROC __glewVertexAttrib4ubv;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UIVPROC __glewVertexAttrib4uiv;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4USVPROC __glewVertexAttrib4usv;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERPROC __glewVertexAttribPointer;\r\n\r\nGLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X3FVPROC __glewUniformMatrix2x3fv;\r\nGLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X4FVPROC __glewUniformMatrix2x4fv;\r\nGLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X2FVPROC __glewUniformMatrix3x2fv;\r\nGLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X4FVPROC __glewUniformMatrix3x4fv;\r\nGLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X2FVPROC __glewUniformMatrix4x2fv;\r\nGLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X3FVPROC __glewUniformMatrix4x3fv;\r\n\r\nGLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERPROC __glewBeginConditionalRender;\r\nGLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKPROC __glewBeginTransformFeedback;\r\nGLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONPROC __glewBindFragDataLocation;\r\nGLEW_FUN_EXPORT PFNGLCLAMPCOLORPROC __glewClampColor;\r\nGLEW_FUN_EXPORT PFNGLCLEARBUFFERFIPROC __glewClearBufferfi;\r\nGLEW_FUN_EXPORT PFNGLCLEARBUFFERFVPROC __glewClearBufferfv;\r\nGLEW_FUN_EXPORT PFNGLCLEARBUFFERIVPROC __glewClearBufferiv;\r\nGLEW_FUN_EXPORT PFNGLCLEARBUFFERUIVPROC __glewClearBufferuiv;\r\nGLEW_FUN_EXPORT PFNGLCOLORMASKIPROC __glewColorMaski;\r\nGLEW_FUN_EXPORT PFNGLDISABLEIPROC __glewDisablei;\r\nGLEW_FUN_EXPORT PFNGLENABLEIPROC __glewEnablei;\r\nGLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERPROC __glewEndConditionalRender;\r\nGLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKPROC __glewEndTransformFeedback;\r\nGLEW_FUN_EXPORT PFNGLGETBOOLEANI_VPROC __glewGetBooleani_v;\r\nGLEW_FUN_EXPORT PFNGLGETFRAGDATALOCATIONPROC __glewGetFragDataLocation;\r\nGLEW_FUN_EXPORT PFNGLGETSTRINGIPROC __glewGetStringi;\r\nGLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIIVPROC __glewGetTexParameterIiv;\r\nGLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIUIVPROC __glewGetTexParameterIuiv;\r\nGLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGPROC __glewGetTransformFeedbackVarying;\r\nGLEW_FUN_EXPORT PFNGLGETUNIFORMUIVPROC __glewGetUniformuiv;\r\nGLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIIVPROC __glewGetVertexAttribIiv;\r\nGLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIUIVPROC __glewGetVertexAttribIuiv;\r\nGLEW_FUN_EXPORT PFNGLISENABLEDIPROC __glewIsEnabledi;\r\nGLEW_FUN_EXPORT PFNGLTEXPARAMETERIIVPROC __glewTexParameterIiv;\r\nGLEW_FUN_EXPORT PFNGLTEXPARAMETERIUIVPROC __glewTexParameterIuiv;\r\nGLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSPROC __glewTransformFeedbackVaryings;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM1UIPROC __glewUniform1ui;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM1UIVPROC __glewUniform1uiv;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM2UIPROC __glewUniform2ui;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM2UIVPROC __glewUniform2uiv;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM3UIPROC __glewUniform3ui;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM3UIVPROC __glewUniform3uiv;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM4UIPROC __glewUniform4ui;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM4UIVPROC __glewUniform4uiv;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IPROC __glewVertexAttribI1i;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IVPROC __glewVertexAttribI1iv;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIPROC __glewVertexAttribI1ui;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIVPROC __glewVertexAttribI1uiv;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IPROC __glewVertexAttribI2i;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IVPROC __glewVertexAttribI2iv;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIPROC __glewVertexAttribI2ui;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIVPROC __glewVertexAttribI2uiv;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IPROC __glewVertexAttribI3i;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IVPROC __glewVertexAttribI3iv;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIPROC __glewVertexAttribI3ui;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIVPROC __glewVertexAttribI3uiv;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4BVPROC __glewVertexAttribI4bv;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IPROC __glewVertexAttribI4i;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IVPROC __glewVertexAttribI4iv;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4SVPROC __glewVertexAttribI4sv;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UBVPROC __glewVertexAttribI4ubv;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIPROC __glewVertexAttribI4ui;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIVPROC __glewVertexAttribI4uiv;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4USVPROC __glewVertexAttribI4usv;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBIPOINTERPROC __glewVertexAttribIPointer;\r\n\r\nGLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDPROC __glewDrawArraysInstanced;\r\nGLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDPROC __glewDrawElementsInstanced;\r\nGLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTINDEXPROC __glewPrimitiveRestartIndex;\r\nGLEW_FUN_EXPORT PFNGLTEXBUFFERPROC __glewTexBuffer;\r\n\r\nGLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREPROC __glewFramebufferTexture;\r\nGLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERI64VPROC __glewGetBufferParameteri64v;\r\nGLEW_FUN_EXPORT PFNGLGETINTEGER64I_VPROC __glewGetInteger64i_v;\r\n\r\nGLEW_FUN_EXPORT PFNGLTBUFFERMASK3DFXPROC __glewTbufferMask3DFX;\r\n\r\nGLEW_FUN_EXPORT PFNGLBLENDEQUATIONINDEXEDAMDPROC __glewBlendEquationIndexedAMD;\r\nGLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC __glewBlendEquationSeparateIndexedAMD;\r\nGLEW_FUN_EXPORT PFNGLBLENDFUNCINDEXEDAMDPROC __glewBlendFuncIndexedAMD;\r\nGLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC __glewBlendFuncSeparateIndexedAMD;\r\n\r\nGLEW_FUN_EXPORT PFNGLBEGINPERFMONITORAMDPROC __glewBeginPerfMonitorAMD;\r\nGLEW_FUN_EXPORT PFNGLDELETEPERFMONITORSAMDPROC __glewDeletePerfMonitorsAMD;\r\nGLEW_FUN_EXPORT PFNGLENDPERFMONITORAMDPROC __glewEndPerfMonitorAMD;\r\nGLEW_FUN_EXPORT PFNGLGENPERFMONITORSAMDPROC __glewGenPerfMonitorsAMD;\r\nGLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERDATAAMDPROC __glewGetPerfMonitorCounterDataAMD;\r\nGLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERINFOAMDPROC __glewGetPerfMonitorCounterInfoAMD;\r\nGLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC __glewGetPerfMonitorCounterStringAMD;\r\nGLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERSAMDPROC __glewGetPerfMonitorCountersAMD;\r\nGLEW_FUN_EXPORT PFNGLGETPERFMONITORGROUPSTRINGAMDPROC __glewGetPerfMonitorGroupStringAMD;\r\nGLEW_FUN_EXPORT PFNGLGETPERFMONITORGROUPSAMDPROC __glewGetPerfMonitorGroupsAMD;\r\nGLEW_FUN_EXPORT PFNGLSELECTPERFMONITORCOUNTERSAMDPROC __glewSelectPerfMonitorCountersAMD;\r\n\r\nGLEW_FUN_EXPORT PFNGLTESSELLATIONFACTORAMDPROC __glewTessellationFactorAMD;\r\nGLEW_FUN_EXPORT PFNGLTESSELLATIONMODEAMDPROC __glewTessellationModeAMD;\r\n\r\nGLEW_FUN_EXPORT PFNGLDRAWELEMENTARRAYAPPLEPROC __glewDrawElementArrayAPPLE;\r\nGLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC __glewDrawRangeElementArrayAPPLE;\r\nGLEW_FUN_EXPORT PFNGLELEMENTPOINTERAPPLEPROC __glewElementPointerAPPLE;\r\nGLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC __glewMultiDrawElementArrayAPPLE;\r\nGLEW_FUN_EXPORT PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC __glewMultiDrawRangeElementArrayAPPLE;\r\n\r\nGLEW_FUN_EXPORT PFNGLDELETEFENCESAPPLEPROC __glewDeleteFencesAPPLE;\r\nGLEW_FUN_EXPORT PFNGLFINISHFENCEAPPLEPROC __glewFinishFenceAPPLE;\r\nGLEW_FUN_EXPORT PFNGLFINISHOBJECTAPPLEPROC __glewFinishObjectAPPLE;\r\nGLEW_FUN_EXPORT PFNGLGENFENCESAPPLEPROC __glewGenFencesAPPLE;\r\nGLEW_FUN_EXPORT PFNGLISFENCEAPPLEPROC __glewIsFenceAPPLE;\r\nGLEW_FUN_EXPORT PFNGLSETFENCEAPPLEPROC __glewSetFenceAPPLE;\r\nGLEW_FUN_EXPORT PFNGLTESTFENCEAPPLEPROC __glewTestFenceAPPLE;\r\nGLEW_FUN_EXPORT PFNGLTESTOBJECTAPPLEPROC __glewTestObjectAPPLE;\r\n\r\nGLEW_FUN_EXPORT PFNGLBUFFERPARAMETERIAPPLEPROC __glewBufferParameteriAPPLE;\r\nGLEW_FUN_EXPORT PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC __glewFlushMappedBufferRangeAPPLE;\r\n\r\nGLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERIVAPPLEPROC __glewGetObjectParameterivAPPLE;\r\nGLEW_FUN_EXPORT PFNGLOBJECTPURGEABLEAPPLEPROC __glewObjectPurgeableAPPLE;\r\nGLEW_FUN_EXPORT PFNGLOBJECTUNPURGEABLEAPPLEPROC __glewObjectUnpurgeableAPPLE;\r\n\r\nGLEW_FUN_EXPORT PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC __glewGetTexParameterPointervAPPLE;\r\nGLEW_FUN_EXPORT PFNGLTEXTURERANGEAPPLEPROC __glewTextureRangeAPPLE;\r\n\r\nGLEW_FUN_EXPORT PFNGLBINDVERTEXARRAYAPPLEPROC __glewBindVertexArrayAPPLE;\r\nGLEW_FUN_EXPORT PFNGLDELETEVERTEXARRAYSAPPLEPROC __glewDeleteVertexArraysAPPLE;\r\nGLEW_FUN_EXPORT PFNGLGENVERTEXARRAYSAPPLEPROC __glewGenVertexArraysAPPLE;\r\nGLEW_FUN_EXPORT PFNGLISVERTEXARRAYAPPLEPROC __glewIsVertexArrayAPPLE;\r\n\r\nGLEW_FUN_EXPORT PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC __glewFlushVertexArrayRangeAPPLE;\r\nGLEW_FUN_EXPORT PFNGLVERTEXARRAYPARAMETERIAPPLEPROC __glewVertexArrayParameteriAPPLE;\r\nGLEW_FUN_EXPORT PFNGLVERTEXARRAYRANGEAPPLEPROC __glewVertexArrayRangeAPPLE;\r\n\r\nGLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBAPPLEPROC __glewDisableVertexAttribAPPLE;\r\nGLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBAPPLEPROC __glewEnableVertexAttribAPPLE;\r\nGLEW_FUN_EXPORT PFNGLISVERTEXATTRIBENABLEDAPPLEPROC __glewIsVertexAttribEnabledAPPLE;\r\nGLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB1DAPPLEPROC __glewMapVertexAttrib1dAPPLE;\r\nGLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB1FAPPLEPROC __glewMapVertexAttrib1fAPPLE;\r\nGLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB2DAPPLEPROC __glewMapVertexAttrib2dAPPLE;\r\nGLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB2FAPPLEPROC __glewMapVertexAttrib2fAPPLE;\r\n\r\nGLEW_FUN_EXPORT PFNGLCLAMPCOLORARBPROC __glewClampColorARB;\r\n\r\nGLEW_FUN_EXPORT PFNGLCOPYBUFFERSUBDATAPROC __glewCopyBufferSubData;\r\n\r\nGLEW_FUN_EXPORT PFNGLDRAWBUFFERSARBPROC __glewDrawBuffersARB;\r\n\r\nGLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEIARBPROC __glewBlendEquationSeparateiARB;\r\nGLEW_FUN_EXPORT PFNGLBLENDEQUATIONIARBPROC __glewBlendEquationiARB;\r\nGLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEIARBPROC __glewBlendFuncSeparateiARB;\r\nGLEW_FUN_EXPORT PFNGLBLENDFUNCIARBPROC __glewBlendFunciARB;\r\n\r\nGLEW_FUN_EXPORT PFNGLDRAWELEMENTSBASEVERTEXPROC __glewDrawElementsBaseVertex;\r\nGLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC __glewDrawElementsInstancedBaseVertex;\r\nGLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC __glewDrawRangeElementsBaseVertex;\r\nGLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC __glewMultiDrawElementsBaseVertex;\r\n\r\nGLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDARBPROC __glewDrawArraysInstancedARB;\r\nGLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDARBPROC __glewDrawElementsInstancedARB;\r\n\r\nGLEW_FUN_EXPORT PFNGLBINDFRAMEBUFFERPROC __glewBindFramebuffer;\r\nGLEW_FUN_EXPORT PFNGLBINDRENDERBUFFERPROC __glewBindRenderbuffer;\r\nGLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFERPROC __glewBlitFramebuffer;\r\nGLEW_FUN_EXPORT PFNGLCHECKFRAMEBUFFERSTATUSPROC __glewCheckFramebufferStatus;\r\nGLEW_FUN_EXPORT PFNGLDELETEFRAMEBUFFERSPROC __glewDeleteFramebuffers;\r\nGLEW_FUN_EXPORT PFNGLDELETERENDERBUFFERSPROC __glewDeleteRenderbuffers;\r\nGLEW_FUN_EXPORT PFNGLFRAMEBUFFERRENDERBUFFERPROC __glewFramebufferRenderbuffer;\r\nGLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE1DPROC __glewFramebufferTexture1D;\r\nGLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DPROC __glewFramebufferTexture2D;\r\nGLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE3DPROC __glewFramebufferTexture3D;\r\nGLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYERPROC __glewFramebufferTextureLayer;\r\nGLEW_FUN_EXPORT PFNGLGENFRAMEBUFFERSPROC __glewGenFramebuffers;\r\nGLEW_FUN_EXPORT PFNGLGENRENDERBUFFERSPROC __glewGenRenderbuffers;\r\nGLEW_FUN_EXPORT PFNGLGENERATEMIPMAPPROC __glewGenerateMipmap;\r\nGLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC __glewGetFramebufferAttachmentParameteriv;\r\nGLEW_FUN_EXPORT PFNGLGETRENDERBUFFERPARAMETERIVPROC __glewGetRenderbufferParameteriv;\r\nGLEW_FUN_EXPORT PFNGLISFRAMEBUFFERPROC __glewIsFramebuffer;\r\nGLEW_FUN_EXPORT PFNGLISRENDERBUFFERPROC __glewIsRenderbuffer;\r\nGLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEPROC __glewRenderbufferStorage;\r\nGLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC __glewRenderbufferStorageMultisample;\r\n\r\nGLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREARBPROC __glewFramebufferTextureARB;\r\nGLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREFACEARBPROC __glewFramebufferTextureFaceARB;\r\nGLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYERARBPROC __glewFramebufferTextureLayerARB;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIARBPROC __glewProgramParameteriARB;\r\n\r\nGLEW_FUN_EXPORT PFNGLCOLORSUBTABLEPROC __glewColorSubTable;\r\nGLEW_FUN_EXPORT PFNGLCOLORTABLEPROC __glewColorTable;\r\nGLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERFVPROC __glewColorTableParameterfv;\r\nGLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERIVPROC __glewColorTableParameteriv;\r\nGLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER1DPROC __glewConvolutionFilter1D;\r\nGLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER2DPROC __glewConvolutionFilter2D;\r\nGLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFPROC __glewConvolutionParameterf;\r\nGLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFVPROC __glewConvolutionParameterfv;\r\nGLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIPROC __glewConvolutionParameteri;\r\nGLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIVPROC __glewConvolutionParameteriv;\r\nGLEW_FUN_EXPORT PFNGLCOPYCOLORSUBTABLEPROC __glewCopyColorSubTable;\r\nGLEW_FUN_EXPORT PFNGLCOPYCOLORTABLEPROC __glewCopyColorTable;\r\nGLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER1DPROC __glewCopyConvolutionFilter1D;\r\nGLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER2DPROC __glewCopyConvolutionFilter2D;\r\nGLEW_FUN_EXPORT PFNGLGETCOLORTABLEPROC __glewGetColorTable;\r\nGLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVPROC __glewGetColorTableParameterfv;\r\nGLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVPROC __glewGetColorTableParameteriv;\r\nGLEW_FUN_EXPORT PFNGLGETCONVOLUTIONFILTERPROC __glewGetConvolutionFilter;\r\nGLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERFVPROC __glewGetConvolutionParameterfv;\r\nGLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERIVPROC __glewGetConvolutionParameteriv;\r\nGLEW_FUN_EXPORT PFNGLGETHISTOGRAMPROC __glewGetHistogram;\r\nGLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERFVPROC __glewGetHistogramParameterfv;\r\nGLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERIVPROC __glewGetHistogramParameteriv;\r\nGLEW_FUN_EXPORT PFNGLGETMINMAXPROC __glewGetMinmax;\r\nGLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERFVPROC __glewGetMinmaxParameterfv;\r\nGLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERIVPROC __glewGetMinmaxParameteriv;\r\nGLEW_FUN_EXPORT PFNGLGETSEPARABLEFILTERPROC __glewGetSeparableFilter;\r\nGLEW_FUN_EXPORT PFNGLHISTOGRAMPROC __glewHistogram;\r\nGLEW_FUN_EXPORT PFNGLMINMAXPROC __glewMinmax;\r\nGLEW_FUN_EXPORT PFNGLRESETHISTOGRAMPROC __glewResetHistogram;\r\nGLEW_FUN_EXPORT PFNGLRESETMINMAXPROC __glewResetMinmax;\r\nGLEW_FUN_EXPORT PFNGLSEPARABLEFILTER2DPROC __glewSeparableFilter2D;\r\n\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORARBPROC __glewVertexAttribDivisorARB;\r\n\r\nGLEW_FUN_EXPORT PFNGLFLUSHMAPPEDBUFFERRANGEPROC __glewFlushMappedBufferRange;\r\nGLEW_FUN_EXPORT PFNGLMAPBUFFERRANGEPROC __glewMapBufferRange;\r\n\r\nGLEW_FUN_EXPORT PFNGLCURRENTPALETTEMATRIXARBPROC __glewCurrentPaletteMatrixARB;\r\nGLEW_FUN_EXPORT PFNGLMATRIXINDEXPOINTERARBPROC __glewMatrixIndexPointerARB;\r\nGLEW_FUN_EXPORT PFNGLMATRIXINDEXUBVARBPROC __glewMatrixIndexubvARB;\r\nGLEW_FUN_EXPORT PFNGLMATRIXINDEXUIVARBPROC __glewMatrixIndexuivARB;\r\nGLEW_FUN_EXPORT PFNGLMATRIXINDEXUSVARBPROC __glewMatrixIndexusvARB;\r\n\r\nGLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEARBPROC __glewSampleCoverageARB;\r\n\r\nGLEW_FUN_EXPORT PFNGLACTIVETEXTUREARBPROC __glewActiveTextureARB;\r\nGLEW_FUN_EXPORT PFNGLCLIENTACTIVETEXTUREARBPROC __glewClientActiveTextureARB;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DARBPROC __glewMultiTexCoord1dARB;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DVARBPROC __glewMultiTexCoord1dvARB;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FARBPROC __glewMultiTexCoord1fARB;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FVARBPROC __glewMultiTexCoord1fvARB;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IARBPROC __glewMultiTexCoord1iARB;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IVARBPROC __glewMultiTexCoord1ivARB;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SARBPROC __glewMultiTexCoord1sARB;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SVARBPROC __glewMultiTexCoord1svARB;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DARBPROC __glewMultiTexCoord2dARB;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DVARBPROC __glewMultiTexCoord2dvARB;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FARBPROC __glewMultiTexCoord2fARB;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FVARBPROC __glewMultiTexCoord2fvARB;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IARBPROC __glewMultiTexCoord2iARB;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IVARBPROC __glewMultiTexCoord2ivARB;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SARBPROC __glewMultiTexCoord2sARB;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SVARBPROC __glewMultiTexCoord2svARB;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DARBPROC __glewMultiTexCoord3dARB;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DVARBPROC __glewMultiTexCoord3dvARB;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FARBPROC __glewMultiTexCoord3fARB;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FVARBPROC __glewMultiTexCoord3fvARB;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IARBPROC __glewMultiTexCoord3iARB;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IVARBPROC __glewMultiTexCoord3ivARB;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SARBPROC __glewMultiTexCoord3sARB;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SVARBPROC __glewMultiTexCoord3svARB;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DARBPROC __glewMultiTexCoord4dARB;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DVARBPROC __glewMultiTexCoord4dvARB;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FARBPROC __glewMultiTexCoord4fARB;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FVARBPROC __glewMultiTexCoord4fvARB;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IARBPROC __glewMultiTexCoord4iARB;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IVARBPROC __glewMultiTexCoord4ivARB;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SARBPROC __glewMultiTexCoord4sARB;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SVARBPROC __glewMultiTexCoord4svARB;\r\n\r\nGLEW_FUN_EXPORT PFNGLBEGINQUERYARBPROC __glewBeginQueryARB;\r\nGLEW_FUN_EXPORT PFNGLDELETEQUERIESARBPROC __glewDeleteQueriesARB;\r\nGLEW_FUN_EXPORT PFNGLENDQUERYARBPROC __glewEndQueryARB;\r\nGLEW_FUN_EXPORT PFNGLGENQUERIESARBPROC __glewGenQueriesARB;\r\nGLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVARBPROC __glewGetQueryObjectivARB;\r\nGLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVARBPROC __glewGetQueryObjectuivARB;\r\nGLEW_FUN_EXPORT PFNGLGETQUERYIVARBPROC __glewGetQueryivARB;\r\nGLEW_FUN_EXPORT PFNGLISQUERYARBPROC __glewIsQueryARB;\r\n\r\nGLEW_FUN_EXPORT PFNGLPOINTPARAMETERFARBPROC __glewPointParameterfARB;\r\nGLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVARBPROC __glewPointParameterfvARB;\r\n\r\nGLEW_FUN_EXPORT PFNGLPROVOKINGVERTEXPROC __glewProvokingVertex;\r\n\r\nGLEW_FUN_EXPORT PFNGLMINSAMPLESHADINGARBPROC __glewMinSampleShadingARB;\r\n\r\nGLEW_FUN_EXPORT PFNGLATTACHOBJECTARBPROC __glewAttachObjectARB;\r\nGLEW_FUN_EXPORT PFNGLCOMPILESHADERARBPROC __glewCompileShaderARB;\r\nGLEW_FUN_EXPORT PFNGLCREATEPROGRAMOBJECTARBPROC __glewCreateProgramObjectARB;\r\nGLEW_FUN_EXPORT PFNGLCREATESHADEROBJECTARBPROC __glewCreateShaderObjectARB;\r\nGLEW_FUN_EXPORT PFNGLDELETEOBJECTARBPROC __glewDeleteObjectARB;\r\nGLEW_FUN_EXPORT PFNGLDETACHOBJECTARBPROC __glewDetachObjectARB;\r\nGLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMARBPROC __glewGetActiveUniformARB;\r\nGLEW_FUN_EXPORT PFNGLGETATTACHEDOBJECTSARBPROC __glewGetAttachedObjectsARB;\r\nGLEW_FUN_EXPORT PFNGLGETHANDLEARBPROC __glewGetHandleARB;\r\nGLEW_FUN_EXPORT PFNGLGETINFOLOGARBPROC __glewGetInfoLogARB;\r\nGLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERFVARBPROC __glewGetObjectParameterfvARB;\r\nGLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERIVARBPROC __glewGetObjectParameterivARB;\r\nGLEW_FUN_EXPORT PFNGLGETSHADERSOURCEARBPROC __glewGetShaderSourceARB;\r\nGLEW_FUN_EXPORT PFNGLGETUNIFORMLOCATIONARBPROC __glewGetUniformLocationARB;\r\nGLEW_FUN_EXPORT PFNGLGETUNIFORMFVARBPROC __glewGetUniformfvARB;\r\nGLEW_FUN_EXPORT PFNGLGETUNIFORMIVARBPROC __glewGetUniformivARB;\r\nGLEW_FUN_EXPORT PFNGLLINKPROGRAMARBPROC __glewLinkProgramARB;\r\nGLEW_FUN_EXPORT PFNGLSHADERSOURCEARBPROC __glewShaderSourceARB;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM1FARBPROC __glewUniform1fARB;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM1FVARBPROC __glewUniform1fvARB;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM1IARBPROC __glewUniform1iARB;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM1IVARBPROC __glewUniform1ivARB;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM2FARBPROC __glewUniform2fARB;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM2FVARBPROC __glewUniform2fvARB;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM2IARBPROC __glewUniform2iARB;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM2IVARBPROC __glewUniform2ivARB;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM3FARBPROC __glewUniform3fARB;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM3FVARBPROC __glewUniform3fvARB;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM3IARBPROC __glewUniform3iARB;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM3IVARBPROC __glewUniform3ivARB;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM4FARBPROC __glewUniform4fARB;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM4FVARBPROC __glewUniform4fvARB;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM4IARBPROC __glewUniform4iARB;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM4IVARBPROC __glewUniform4ivARB;\r\nGLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2FVARBPROC __glewUniformMatrix2fvARB;\r\nGLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3FVARBPROC __glewUniformMatrix3fvARB;\r\nGLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4FVARBPROC __glewUniformMatrix4fvARB;\r\nGLEW_FUN_EXPORT PFNGLUSEPROGRAMOBJECTARBPROC __glewUseProgramObjectARB;\r\nGLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMARBPROC __glewValidateProgramARB;\r\n\r\nGLEW_FUN_EXPORT PFNGLCLIENTWAITSYNCPROC __glewClientWaitSync;\r\nGLEW_FUN_EXPORT PFNGLDELETESYNCPROC __glewDeleteSync;\r\nGLEW_FUN_EXPORT PFNGLFENCESYNCPROC __glewFenceSync;\r\nGLEW_FUN_EXPORT PFNGLGETINTEGER64VPROC __glewGetInteger64v;\r\nGLEW_FUN_EXPORT PFNGLGETSYNCIVPROC __glewGetSynciv;\r\nGLEW_FUN_EXPORT PFNGLISSYNCPROC __glewIsSync;\r\nGLEW_FUN_EXPORT PFNGLWAITSYNCPROC __glewWaitSync;\r\n\r\nGLEW_FUN_EXPORT PFNGLTEXBUFFERARBPROC __glewTexBufferARB;\r\n\r\nGLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE1DARBPROC __glewCompressedTexImage1DARB;\r\nGLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE2DARBPROC __glewCompressedTexImage2DARB;\r\nGLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DARBPROC __glewCompressedTexImage3DARB;\r\nGLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC __glewCompressedTexSubImage1DARB;\r\nGLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC __glewCompressedTexSubImage2DARB;\r\nGLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC __glewCompressedTexSubImage3DARB;\r\nGLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXIMAGEARBPROC __glewGetCompressedTexImageARB;\r\n\r\nGLEW_FUN_EXPORT PFNGLGETMULTISAMPLEFVPROC __glewGetMultisamplefv;\r\nGLEW_FUN_EXPORT PFNGLSAMPLEMASKIPROC __glewSampleMaski;\r\nGLEW_FUN_EXPORT PFNGLTEXIMAGE2DMULTISAMPLEPROC __glewTexImage2DMultisample;\r\nGLEW_FUN_EXPORT PFNGLTEXIMAGE3DMULTISAMPLEPROC __glewTexImage3DMultisample;\r\n\r\nGLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXDARBPROC __glewLoadTransposeMatrixdARB;\r\nGLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXFARBPROC __glewLoadTransposeMatrixfARB;\r\nGLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXDARBPROC __glewMultTransposeMatrixdARB;\r\nGLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXFARBPROC __glewMultTransposeMatrixfARB;\r\n\r\nGLEW_FUN_EXPORT PFNGLBINDBUFFERBASEPROC __glewBindBufferBase;\r\nGLEW_FUN_EXPORT PFNGLBINDBUFFERRANGEPROC __glewBindBufferRange;\r\nGLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC __glewGetActiveUniformBlockName;\r\nGLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMBLOCKIVPROC __glewGetActiveUniformBlockiv;\r\nGLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMNAMEPROC __glewGetActiveUniformName;\r\nGLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMSIVPROC __glewGetActiveUniformsiv;\r\nGLEW_FUN_EXPORT PFNGLGETINTEGERI_VPROC __glewGetIntegeri_v;\r\nGLEW_FUN_EXPORT PFNGLGETUNIFORMBLOCKINDEXPROC __glewGetUniformBlockIndex;\r\nGLEW_FUN_EXPORT PFNGLGETUNIFORMINDICESPROC __glewGetUniformIndices;\r\nGLEW_FUN_EXPORT PFNGLUNIFORMBLOCKBINDINGPROC __glewUniformBlockBinding;\r\n\r\nGLEW_FUN_EXPORT PFNGLBINDVERTEXARRAYPROC __glewBindVertexArray;\r\nGLEW_FUN_EXPORT PFNGLDELETEVERTEXARRAYSPROC __glewDeleteVertexArrays;\r\nGLEW_FUN_EXPORT PFNGLGENVERTEXARRAYSPROC __glewGenVertexArrays;\r\nGLEW_FUN_EXPORT PFNGLISVERTEXARRAYPROC __glewIsVertexArray;\r\n\r\nGLEW_FUN_EXPORT PFNGLVERTEXBLENDARBPROC __glewVertexBlendARB;\r\nGLEW_FUN_EXPORT PFNGLWEIGHTPOINTERARBPROC __glewWeightPointerARB;\r\nGLEW_FUN_EXPORT PFNGLWEIGHTBVARBPROC __glewWeightbvARB;\r\nGLEW_FUN_EXPORT PFNGLWEIGHTDVARBPROC __glewWeightdvARB;\r\nGLEW_FUN_EXPORT PFNGLWEIGHTFVARBPROC __glewWeightfvARB;\r\nGLEW_FUN_EXPORT PFNGLWEIGHTIVARBPROC __glewWeightivARB;\r\nGLEW_FUN_EXPORT PFNGLWEIGHTSVARBPROC __glewWeightsvARB;\r\nGLEW_FUN_EXPORT PFNGLWEIGHTUBVARBPROC __glewWeightubvARB;\r\nGLEW_FUN_EXPORT PFNGLWEIGHTUIVARBPROC __glewWeightuivARB;\r\nGLEW_FUN_EXPORT PFNGLWEIGHTUSVARBPROC __glewWeightusvARB;\r\n\r\nGLEW_FUN_EXPORT PFNGLBINDBUFFERARBPROC __glewBindBufferARB;\r\nGLEW_FUN_EXPORT PFNGLBUFFERDATAARBPROC __glewBufferDataARB;\r\nGLEW_FUN_EXPORT PFNGLBUFFERSUBDATAARBPROC __glewBufferSubDataARB;\r\nGLEW_FUN_EXPORT PFNGLDELETEBUFFERSARBPROC __glewDeleteBuffersARB;\r\nGLEW_FUN_EXPORT PFNGLGENBUFFERSARBPROC __glewGenBuffersARB;\r\nGLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERIVARBPROC __glewGetBufferParameterivARB;\r\nGLEW_FUN_EXPORT PFNGLGETBUFFERPOINTERVARBPROC __glewGetBufferPointervARB;\r\nGLEW_FUN_EXPORT PFNGLGETBUFFERSUBDATAARBPROC __glewGetBufferSubDataARB;\r\nGLEW_FUN_EXPORT PFNGLISBUFFERARBPROC __glewIsBufferARB;\r\nGLEW_FUN_EXPORT PFNGLMAPBUFFERARBPROC __glewMapBufferARB;\r\nGLEW_FUN_EXPORT PFNGLUNMAPBUFFERARBPROC __glewUnmapBufferARB;\r\n\r\nGLEW_FUN_EXPORT PFNGLBINDPROGRAMARBPROC __glewBindProgramARB;\r\nGLEW_FUN_EXPORT PFNGLDELETEPROGRAMSARBPROC __glewDeleteProgramsARB;\r\nGLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBARRAYARBPROC __glewDisableVertexAttribArrayARB;\r\nGLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBARRAYARBPROC __glewEnableVertexAttribArrayARB;\r\nGLEW_FUN_EXPORT PFNGLGENPROGRAMSARBPROC __glewGenProgramsARB;\r\nGLEW_FUN_EXPORT PFNGLGETPROGRAMENVPARAMETERDVARBPROC __glewGetProgramEnvParameterdvARB;\r\nGLEW_FUN_EXPORT PFNGLGETPROGRAMENVPARAMETERFVARBPROC __glewGetProgramEnvParameterfvARB;\r\nGLEW_FUN_EXPORT PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC __glewGetProgramLocalParameterdvARB;\r\nGLEW_FUN_EXPORT PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC __glewGetProgramLocalParameterfvARB;\r\nGLEW_FUN_EXPORT PFNGLGETPROGRAMSTRINGARBPROC __glewGetProgramStringARB;\r\nGLEW_FUN_EXPORT PFNGLGETPROGRAMIVARBPROC __glewGetProgramivARB;\r\nGLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVARBPROC __glewGetVertexAttribPointervARB;\r\nGLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVARBPROC __glewGetVertexAttribdvARB;\r\nGLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVARBPROC __glewGetVertexAttribfvARB;\r\nGLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVARBPROC __glewGetVertexAttribivARB;\r\nGLEW_FUN_EXPORT PFNGLISPROGRAMARBPROC __glewIsProgramARB;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4DARBPROC __glewProgramEnvParameter4dARB;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4DVARBPROC __glewProgramEnvParameter4dvARB;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4FARBPROC __glewProgramEnvParameter4fARB;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4FVARBPROC __glewProgramEnvParameter4fvARB;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4DARBPROC __glewProgramLocalParameter4dARB;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4DVARBPROC __glewProgramLocalParameter4dvARB;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4FARBPROC __glewProgramLocalParameter4fARB;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4FVARBPROC __glewProgramLocalParameter4fvARB;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMSTRINGARBPROC __glewProgramStringARB;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DARBPROC __glewVertexAttrib1dARB;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVARBPROC __glewVertexAttrib1dvARB;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FARBPROC __glewVertexAttrib1fARB;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVARBPROC __glewVertexAttrib1fvARB;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SARBPROC __glewVertexAttrib1sARB;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVARBPROC __glewVertexAttrib1svARB;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DARBPROC __glewVertexAttrib2dARB;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVARBPROC __glewVertexAttrib2dvARB;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FARBPROC __glewVertexAttrib2fARB;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVARBPROC __glewVertexAttrib2fvARB;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SARBPROC __glewVertexAttrib2sARB;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVARBPROC __glewVertexAttrib2svARB;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DARBPROC __glewVertexAttrib3dARB;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVARBPROC __glewVertexAttrib3dvARB;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FARBPROC __glewVertexAttrib3fARB;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVARBPROC __glewVertexAttrib3fvARB;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SARBPROC __glewVertexAttrib3sARB;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVARBPROC __glewVertexAttrib3svARB;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NBVARBPROC __glewVertexAttrib4NbvARB;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NIVARBPROC __glewVertexAttrib4NivARB;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NSVARBPROC __glewVertexAttrib4NsvARB;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBARBPROC __glewVertexAttrib4NubARB;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBVARBPROC __glewVertexAttrib4NubvARB;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUIVARBPROC __glewVertexAttrib4NuivARB;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUSVARBPROC __glewVertexAttrib4NusvARB;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4BVARBPROC __glewVertexAttrib4bvARB;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DARBPROC __glewVertexAttrib4dARB;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVARBPROC __glewVertexAttrib4dvARB;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FARBPROC __glewVertexAttrib4fARB;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVARBPROC __glewVertexAttrib4fvARB;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4IVARBPROC __glewVertexAttrib4ivARB;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SARBPROC __glewVertexAttrib4sARB;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVARBPROC __glewVertexAttrib4svARB;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVARBPROC __glewVertexAttrib4ubvARB;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UIVARBPROC __glewVertexAttrib4uivARB;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4USVARBPROC __glewVertexAttrib4usvARB;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERARBPROC __glewVertexAttribPointerARB;\r\n\r\nGLEW_FUN_EXPORT PFNGLBINDATTRIBLOCATIONARBPROC __glewBindAttribLocationARB;\r\nGLEW_FUN_EXPORT PFNGLGETACTIVEATTRIBARBPROC __glewGetActiveAttribARB;\r\nGLEW_FUN_EXPORT PFNGLGETATTRIBLOCATIONARBPROC __glewGetAttribLocationARB;\r\n\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS2DARBPROC __glewWindowPos2dARB;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS2DVARBPROC __glewWindowPos2dvARB;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS2FARBPROC __glewWindowPos2fARB;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS2FVARBPROC __glewWindowPos2fvARB;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS2IARBPROC __glewWindowPos2iARB;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS2IVARBPROC __glewWindowPos2ivARB;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS2SARBPROC __glewWindowPos2sARB;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS2SVARBPROC __glewWindowPos2svARB;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS3DARBPROC __glewWindowPos3dARB;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS3DVARBPROC __glewWindowPos3dvARB;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS3FARBPROC __glewWindowPos3fARB;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS3FVARBPROC __glewWindowPos3fvARB;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS3IARBPROC __glewWindowPos3iARB;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS3IVARBPROC __glewWindowPos3ivARB;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS3SARBPROC __glewWindowPos3sARB;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS3SVARBPROC __glewWindowPos3svARB;\r\n\r\nGLEW_FUN_EXPORT PFNGLDRAWBUFFERSATIPROC __glewDrawBuffersATI;\r\n\r\nGLEW_FUN_EXPORT PFNGLDRAWELEMENTARRAYATIPROC __glewDrawElementArrayATI;\r\nGLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTARRAYATIPROC __glewDrawRangeElementArrayATI;\r\nGLEW_FUN_EXPORT PFNGLELEMENTPOINTERATIPROC __glewElementPointerATI;\r\n\r\nGLEW_FUN_EXPORT PFNGLGETTEXBUMPPARAMETERFVATIPROC __glewGetTexBumpParameterfvATI;\r\nGLEW_FUN_EXPORT PFNGLGETTEXBUMPPARAMETERIVATIPROC __glewGetTexBumpParameterivATI;\r\nGLEW_FUN_EXPORT PFNGLTEXBUMPPARAMETERFVATIPROC __glewTexBumpParameterfvATI;\r\nGLEW_FUN_EXPORT PFNGLTEXBUMPPARAMETERIVATIPROC __glewTexBumpParameterivATI;\r\n\r\nGLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP1ATIPROC __glewAlphaFragmentOp1ATI;\r\nGLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP2ATIPROC __glewAlphaFragmentOp2ATI;\r\nGLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP3ATIPROC __glewAlphaFragmentOp3ATI;\r\nGLEW_FUN_EXPORT PFNGLBEGINFRAGMENTSHADERATIPROC __glewBeginFragmentShaderATI;\r\nGLEW_FUN_EXPORT PFNGLBINDFRAGMENTSHADERATIPROC __glewBindFragmentShaderATI;\r\nGLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP1ATIPROC __glewColorFragmentOp1ATI;\r\nGLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP2ATIPROC __glewColorFragmentOp2ATI;\r\nGLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP3ATIPROC __glewColorFragmentOp3ATI;\r\nGLEW_FUN_EXPORT PFNGLDELETEFRAGMENTSHADERATIPROC __glewDeleteFragmentShaderATI;\r\nGLEW_FUN_EXPORT PFNGLENDFRAGMENTSHADERATIPROC __glewEndFragmentShaderATI;\r\nGLEW_FUN_EXPORT PFNGLGENFRAGMENTSHADERSATIPROC __glewGenFragmentShadersATI;\r\nGLEW_FUN_EXPORT PFNGLPASSTEXCOORDATIPROC __glewPassTexCoordATI;\r\nGLEW_FUN_EXPORT PFNGLSAMPLEMAPATIPROC __glewSampleMapATI;\r\nGLEW_FUN_EXPORT PFNGLSETFRAGMENTSHADERCONSTANTATIPROC __glewSetFragmentShaderConstantATI;\r\n\r\nGLEW_FUN_EXPORT PFNGLMAPOBJECTBUFFERATIPROC __glewMapObjectBufferATI;\r\nGLEW_FUN_EXPORT PFNGLUNMAPOBJECTBUFFERATIPROC __glewUnmapObjectBufferATI;\r\n\r\nGLEW_FUN_EXPORT PFNGLPNTRIANGLESFATIPROC __glPNTrianglewesfATI;\r\nGLEW_FUN_EXPORT PFNGLPNTRIANGLESIATIPROC __glPNTrianglewesiATI;\r\n\r\nGLEW_FUN_EXPORT PFNGLSTENCILFUNCSEPARATEATIPROC __glewStencilFuncSeparateATI;\r\nGLEW_FUN_EXPORT PFNGLSTENCILOPSEPARATEATIPROC __glewStencilOpSeparateATI;\r\n\r\nGLEW_FUN_EXPORT PFNGLARRAYOBJECTATIPROC __glewArrayObjectATI;\r\nGLEW_FUN_EXPORT PFNGLFREEOBJECTBUFFERATIPROC __glewFreeObjectBufferATI;\r\nGLEW_FUN_EXPORT PFNGLGETARRAYOBJECTFVATIPROC __glewGetArrayObjectfvATI;\r\nGLEW_FUN_EXPORT PFNGLGETARRAYOBJECTIVATIPROC __glewGetArrayObjectivATI;\r\nGLEW_FUN_EXPORT PFNGLGETOBJECTBUFFERFVATIPROC __glewGetObjectBufferfvATI;\r\nGLEW_FUN_EXPORT PFNGLGETOBJECTBUFFERIVATIPROC __glewGetObjectBufferivATI;\r\nGLEW_FUN_EXPORT PFNGLGETVARIANTARRAYOBJECTFVATIPROC __glewGetVariantArrayObjectfvATI;\r\nGLEW_FUN_EXPORT PFNGLGETVARIANTARRAYOBJECTIVATIPROC __glewGetVariantArrayObjectivATI;\r\nGLEW_FUN_EXPORT PFNGLISOBJECTBUFFERATIPROC __glewIsObjectBufferATI;\r\nGLEW_FUN_EXPORT PFNGLNEWOBJECTBUFFERATIPROC __glewNewObjectBufferATI;\r\nGLEW_FUN_EXPORT PFNGLUPDATEOBJECTBUFFERATIPROC __glewUpdateObjectBufferATI;\r\nGLEW_FUN_EXPORT PFNGLVARIANTARRAYOBJECTATIPROC __glewVariantArrayObjectATI;\r\n\r\nGLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC __glewGetVertexAttribArrayObjectfvATI;\r\nGLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC __glewGetVertexAttribArrayObjectivATI;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBARRAYOBJECTATIPROC __glewVertexAttribArrayObjectATI;\r\n\r\nGLEW_FUN_EXPORT PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC __glewClientActiveVertexStreamATI;\r\nGLEW_FUN_EXPORT PFNGLNORMALSTREAM3BATIPROC __glewNormalStream3bATI;\r\nGLEW_FUN_EXPORT PFNGLNORMALSTREAM3BVATIPROC __glewNormalStream3bvATI;\r\nGLEW_FUN_EXPORT PFNGLNORMALSTREAM3DATIPROC __glewNormalStream3dATI;\r\nGLEW_FUN_EXPORT PFNGLNORMALSTREAM3DVATIPROC __glewNormalStream3dvATI;\r\nGLEW_FUN_EXPORT PFNGLNORMALSTREAM3FATIPROC __glewNormalStream3fATI;\r\nGLEW_FUN_EXPORT PFNGLNORMALSTREAM3FVATIPROC __glewNormalStream3fvATI;\r\nGLEW_FUN_EXPORT PFNGLNORMALSTREAM3IATIPROC __glewNormalStream3iATI;\r\nGLEW_FUN_EXPORT PFNGLNORMALSTREAM3IVATIPROC __glewNormalStream3ivATI;\r\nGLEW_FUN_EXPORT PFNGLNORMALSTREAM3SATIPROC __glewNormalStream3sATI;\r\nGLEW_FUN_EXPORT PFNGLNORMALSTREAM3SVATIPROC __glewNormalStream3svATI;\r\nGLEW_FUN_EXPORT PFNGLVERTEXBLENDENVFATIPROC __glewVertexBlendEnvfATI;\r\nGLEW_FUN_EXPORT PFNGLVERTEXBLENDENVIATIPROC __glewVertexBlendEnviATI;\r\nGLEW_FUN_EXPORT PFNGLVERTEXSTREAM2DATIPROC __glewVertexStream2dATI;\r\nGLEW_FUN_EXPORT PFNGLVERTEXSTREAM2DVATIPROC __glewVertexStream2dvATI;\r\nGLEW_FUN_EXPORT PFNGLVERTEXSTREAM2FATIPROC __glewVertexStream2fATI;\r\nGLEW_FUN_EXPORT PFNGLVERTEXSTREAM2FVATIPROC __glewVertexStream2fvATI;\r\nGLEW_FUN_EXPORT PFNGLVERTEXSTREAM2IATIPROC __glewVertexStream2iATI;\r\nGLEW_FUN_EXPORT PFNGLVERTEXSTREAM2IVATIPROC __glewVertexStream2ivATI;\r\nGLEW_FUN_EXPORT PFNGLVERTEXSTREAM2SATIPROC __glewVertexStream2sATI;\r\nGLEW_FUN_EXPORT PFNGLVERTEXSTREAM2SVATIPROC __glewVertexStream2svATI;\r\nGLEW_FUN_EXPORT PFNGLVERTEXSTREAM3DATIPROC __glewVertexStream3dATI;\r\nGLEW_FUN_EXPORT PFNGLVERTEXSTREAM3DVATIPROC __glewVertexStream3dvATI;\r\nGLEW_FUN_EXPORT PFNGLVERTEXSTREAM3FATIPROC __glewVertexStream3fATI;\r\nGLEW_FUN_EXPORT PFNGLVERTEXSTREAM3FVATIPROC __glewVertexStream3fvATI;\r\nGLEW_FUN_EXPORT PFNGLVERTEXSTREAM3IATIPROC __glewVertexStream3iATI;\r\nGLEW_FUN_EXPORT PFNGLVERTEXSTREAM3IVATIPROC __glewVertexStream3ivATI;\r\nGLEW_FUN_EXPORT PFNGLVERTEXSTREAM3SATIPROC __glewVertexStream3sATI;\r\nGLEW_FUN_EXPORT PFNGLVERTEXSTREAM3SVATIPROC __glewVertexStream3svATI;\r\nGLEW_FUN_EXPORT PFNGLVERTEXSTREAM4DATIPROC __glewVertexStream4dATI;\r\nGLEW_FUN_EXPORT PFNGLVERTEXSTREAM4DVATIPROC __glewVertexStream4dvATI;\r\nGLEW_FUN_EXPORT PFNGLVERTEXSTREAM4FATIPROC __glewVertexStream4fATI;\r\nGLEW_FUN_EXPORT PFNGLVERTEXSTREAM4FVATIPROC __glewVertexStream4fvATI;\r\nGLEW_FUN_EXPORT PFNGLVERTEXSTREAM4IATIPROC __glewVertexStream4iATI;\r\nGLEW_FUN_EXPORT PFNGLVERTEXSTREAM4IVATIPROC __glewVertexStream4ivATI;\r\nGLEW_FUN_EXPORT PFNGLVERTEXSTREAM4SATIPROC __glewVertexStream4sATI;\r\nGLEW_FUN_EXPORT PFNGLVERTEXSTREAM4SVATIPROC __glewVertexStream4svATI;\r\n\r\nGLEW_FUN_EXPORT PFNGLGETUNIFORMBUFFERSIZEEXTPROC __glewGetUniformBufferSizeEXT;\r\nGLEW_FUN_EXPORT PFNGLGETUNIFORMOFFSETEXTPROC __glewGetUniformOffsetEXT;\r\nGLEW_FUN_EXPORT PFNGLUNIFORMBUFFEREXTPROC __glewUniformBufferEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLBLENDCOLOREXTPROC __glewBlendColorEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEEXTPROC __glewBlendEquationSeparateEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEEXTPROC __glewBlendFuncSeparateEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLBLENDEQUATIONEXTPROC __glewBlendEquationEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLCOLORSUBTABLEEXTPROC __glewColorSubTableEXT;\r\nGLEW_FUN_EXPORT PFNGLCOPYCOLORSUBTABLEEXTPROC __glewCopyColorSubTableEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLLOCKARRAYSEXTPROC __glewLockArraysEXT;\r\nGLEW_FUN_EXPORT PFNGLUNLOCKARRAYSEXTPROC __glewUnlockArraysEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER1DEXTPROC __glewConvolutionFilter1DEXT;\r\nGLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER2DEXTPROC __glewConvolutionFilter2DEXT;\r\nGLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFEXTPROC __glewConvolutionParameterfEXT;\r\nGLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFVEXTPROC __glewConvolutionParameterfvEXT;\r\nGLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIEXTPROC __glewConvolutionParameteriEXT;\r\nGLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIVEXTPROC __glewConvolutionParameterivEXT;\r\nGLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC __glewCopyConvolutionFilter1DEXT;\r\nGLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC __glewCopyConvolutionFilter2DEXT;\r\nGLEW_FUN_EXPORT PFNGLGETCONVOLUTIONFILTEREXTPROC __glewGetConvolutionFilterEXT;\r\nGLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC __glewGetConvolutionParameterfvEXT;\r\nGLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC __glewGetConvolutionParameterivEXT;\r\nGLEW_FUN_EXPORT PFNGLGETSEPARABLEFILTEREXTPROC __glewGetSeparableFilterEXT;\r\nGLEW_FUN_EXPORT PFNGLSEPARABLEFILTER2DEXTPROC __glewSeparableFilter2DEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLBINORMALPOINTEREXTPROC __glewBinormalPointerEXT;\r\nGLEW_FUN_EXPORT PFNGLTANGENTPOINTEREXTPROC __glewTangentPointerEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLCOPYTEXIMAGE1DEXTPROC __glewCopyTexImage1DEXT;\r\nGLEW_FUN_EXPORT PFNGLCOPYTEXIMAGE2DEXTPROC __glewCopyTexImage2DEXT;\r\nGLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE1DEXTPROC __glewCopyTexSubImage1DEXT;\r\nGLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE2DEXTPROC __glewCopyTexSubImage2DEXT;\r\nGLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DEXTPROC __glewCopyTexSubImage3DEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLCULLPARAMETERDVEXTPROC __glewCullParameterdvEXT;\r\nGLEW_FUN_EXPORT PFNGLCULLPARAMETERFVEXTPROC __glewCullParameterfvEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLDEPTHBOUNDSEXTPROC __glewDepthBoundsEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLBINDMULTITEXTUREEXTPROC __glewBindMultiTextureEXT;\r\nGLEW_FUN_EXPORT PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC __glewCheckNamedFramebufferStatusEXT;\r\nGLEW_FUN_EXPORT PFNGLCLIENTATTRIBDEFAULTEXTPROC __glewClientAttribDefaultEXT;\r\nGLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC __glewCompressedMultiTexImage1DEXT;\r\nGLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC __glewCompressedMultiTexImage2DEXT;\r\nGLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC __glewCompressedMultiTexImage3DEXT;\r\nGLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC __glewCompressedMultiTexSubImage1DEXT;\r\nGLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC __glewCompressedMultiTexSubImage2DEXT;\r\nGLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC __glewCompressedMultiTexSubImage3DEXT;\r\nGLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC __glewCompressedTextureImage1DEXT;\r\nGLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC __glewCompressedTextureImage2DEXT;\r\nGLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC __glewCompressedTextureImage3DEXT;\r\nGLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC __glewCompressedTextureSubImage1DEXT;\r\nGLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC __glewCompressedTextureSubImage2DEXT;\r\nGLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC __glewCompressedTextureSubImage3DEXT;\r\nGLEW_FUN_EXPORT PFNGLCOPYMULTITEXIMAGE1DEXTPROC __glewCopyMultiTexImage1DEXT;\r\nGLEW_FUN_EXPORT PFNGLCOPYMULTITEXIMAGE2DEXTPROC __glewCopyMultiTexImage2DEXT;\r\nGLEW_FUN_EXPORT PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC __glewCopyMultiTexSubImage1DEXT;\r\nGLEW_FUN_EXPORT PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC __glewCopyMultiTexSubImage2DEXT;\r\nGLEW_FUN_EXPORT PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC __glewCopyMultiTexSubImage3DEXT;\r\nGLEW_FUN_EXPORT PFNGLCOPYTEXTUREIMAGE1DEXTPROC __glewCopyTextureImage1DEXT;\r\nGLEW_FUN_EXPORT PFNGLCOPYTEXTUREIMAGE2DEXTPROC __glewCopyTextureImage2DEXT;\r\nGLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC __glewCopyTextureSubImage1DEXT;\r\nGLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC __glewCopyTextureSubImage2DEXT;\r\nGLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC __glewCopyTextureSubImage3DEXT;\r\nGLEW_FUN_EXPORT PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC __glewDisableClientStateIndexedEXT;\r\nGLEW_FUN_EXPORT PFNGLDISABLECLIENTSTATEIEXTPROC __glewDisableClientStateiEXT;\r\nGLEW_FUN_EXPORT PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC __glewDisableVertexArrayAttribEXT;\r\nGLEW_FUN_EXPORT PFNGLDISABLEVERTEXARRAYEXTPROC __glewDisableVertexArrayEXT;\r\nGLEW_FUN_EXPORT PFNGLENABLECLIENTSTATEINDEXEDEXTPROC __glewEnableClientStateIndexedEXT;\r\nGLEW_FUN_EXPORT PFNGLENABLECLIENTSTATEIEXTPROC __glewEnableClientStateiEXT;\r\nGLEW_FUN_EXPORT PFNGLENABLEVERTEXARRAYATTRIBEXTPROC __glewEnableVertexArrayAttribEXT;\r\nGLEW_FUN_EXPORT PFNGLENABLEVERTEXARRAYEXTPROC __glewEnableVertexArrayEXT;\r\nGLEW_FUN_EXPORT PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC __glewFlushMappedNamedBufferRangeEXT;\r\nGLEW_FUN_EXPORT PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC __glewFramebufferDrawBufferEXT;\r\nGLEW_FUN_EXPORT PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC __glewFramebufferDrawBuffersEXT;\r\nGLEW_FUN_EXPORT PFNGLFRAMEBUFFERREADBUFFEREXTPROC __glewFramebufferReadBufferEXT;\r\nGLEW_FUN_EXPORT PFNGLGENERATEMULTITEXMIPMAPEXTPROC __glewGenerateMultiTexMipmapEXT;\r\nGLEW_FUN_EXPORT PFNGLGENERATETEXTUREMIPMAPEXTPROC __glewGenerateTextureMipmapEXT;\r\nGLEW_FUN_EXPORT PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC __glewGetCompressedMultiTexImageEXT;\r\nGLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC __glewGetCompressedTextureImageEXT;\r\nGLEW_FUN_EXPORT PFNGLGETDOUBLEINDEXEDVEXTPROC __glewGetDoubleIndexedvEXT;\r\nGLEW_FUN_EXPORT PFNGLGETDOUBLEI_VEXTPROC __glewGetDoublei_vEXT;\r\nGLEW_FUN_EXPORT PFNGLGETFLOATINDEXEDVEXTPROC __glewGetFloatIndexedvEXT;\r\nGLEW_FUN_EXPORT PFNGLGETFLOATI_VEXTPROC __glewGetFloati_vEXT;\r\nGLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC __glewGetFramebufferParameterivEXT;\r\nGLEW_FUN_EXPORT PFNGLGETMULTITEXENVFVEXTPROC __glewGetMultiTexEnvfvEXT;\r\nGLEW_FUN_EXPORT PFNGLGETMULTITEXENVIVEXTPROC __glewGetMultiTexEnvivEXT;\r\nGLEW_FUN_EXPORT PFNGLGETMULTITEXGENDVEXTPROC __glewGetMultiTexGendvEXT;\r\nGLEW_FUN_EXPORT PFNGLGETMULTITEXGENFVEXTPROC __glewGetMultiTexGenfvEXT;\r\nGLEW_FUN_EXPORT PFNGLGETMULTITEXGENIVEXTPROC __glewGetMultiTexGenivEXT;\r\nGLEW_FUN_EXPORT PFNGLGETMULTITEXIMAGEEXTPROC __glewGetMultiTexImageEXT;\r\nGLEW_FUN_EXPORT PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC __glewGetMultiTexLevelParameterfvEXT;\r\nGLEW_FUN_EXPORT PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC __glewGetMultiTexLevelParameterivEXT;\r\nGLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERIIVEXTPROC __glewGetMultiTexParameterIivEXT;\r\nGLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERIUIVEXTPROC __glewGetMultiTexParameterIuivEXT;\r\nGLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERFVEXTPROC __glewGetMultiTexParameterfvEXT;\r\nGLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERIVEXTPROC __glewGetMultiTexParameterivEXT;\r\nGLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC __glewGetNamedBufferParameterivEXT;\r\nGLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPOINTERVEXTPROC __glewGetNamedBufferPointervEXT;\r\nGLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERSUBDATAEXTPROC __glewGetNamedBufferSubDataEXT;\r\nGLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetNamedFramebufferAttachmentParameterivEXT;\r\nGLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC __glewGetNamedProgramLocalParameterIivEXT;\r\nGLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC __glewGetNamedProgramLocalParameterIuivEXT;\r\nGLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC __glewGetNamedProgramLocalParameterdvEXT;\r\nGLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC __glewGetNamedProgramLocalParameterfvEXT;\r\nGLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMSTRINGEXTPROC __glewGetNamedProgramStringEXT;\r\nGLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMIVEXTPROC __glewGetNamedProgramivEXT;\r\nGLEW_FUN_EXPORT PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC __glewGetNamedRenderbufferParameterivEXT;\r\nGLEW_FUN_EXPORT PFNGLGETPOINTERINDEXEDVEXTPROC __glewGetPointerIndexedvEXT;\r\nGLEW_FUN_EXPORT PFNGLGETPOINTERI_VEXTPROC __glewGetPointeri_vEXT;\r\nGLEW_FUN_EXPORT PFNGLGETTEXTUREIMAGEEXTPROC __glewGetTextureImageEXT;\r\nGLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC __glewGetTextureLevelParameterfvEXT;\r\nGLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC __glewGetTextureLevelParameterivEXT;\r\nGLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIIVEXTPROC __glewGetTextureParameterIivEXT;\r\nGLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIUIVEXTPROC __glewGetTextureParameterIuivEXT;\r\nGLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERFVEXTPROC __glewGetTextureParameterfvEXT;\r\nGLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIVEXTPROC __glewGetTextureParameterivEXT;\r\nGLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC __glewGetVertexArrayIntegeri_vEXT;\r\nGLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINTEGERVEXTPROC __glewGetVertexArrayIntegervEXT;\r\nGLEW_FUN_EXPORT PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC __glewGetVertexArrayPointeri_vEXT;\r\nGLEW_FUN_EXPORT PFNGLGETVERTEXARRAYPOINTERVEXTPROC __glewGetVertexArrayPointervEXT;\r\nGLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFEREXTPROC __glewMapNamedBufferEXT;\r\nGLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFERRANGEEXTPROC __glewMapNamedBufferRangeEXT;\r\nGLEW_FUN_EXPORT PFNGLMATRIXFRUSTUMEXTPROC __glewMatrixFrustumEXT;\r\nGLEW_FUN_EXPORT PFNGLMATRIXLOADIDENTITYEXTPROC __glewMatrixLoadIdentityEXT;\r\nGLEW_FUN_EXPORT PFNGLMATRIXLOADTRANSPOSEDEXTPROC __glewMatrixLoadTransposedEXT;\r\nGLEW_FUN_EXPORT PFNGLMATRIXLOADTRANSPOSEFEXTPROC __glewMatrixLoadTransposefEXT;\r\nGLEW_FUN_EXPORT PFNGLMATRIXLOADDEXTPROC __glewMatrixLoaddEXT;\r\nGLEW_FUN_EXPORT PFNGLMATRIXLOADFEXTPROC __glewMatrixLoadfEXT;\r\nGLEW_FUN_EXPORT PFNGLMATRIXMULTTRANSPOSEDEXTPROC __glewMatrixMultTransposedEXT;\r\nGLEW_FUN_EXPORT PFNGLMATRIXMULTTRANSPOSEFEXTPROC __glewMatrixMultTransposefEXT;\r\nGLEW_FUN_EXPORT PFNGLMATRIXMULTDEXTPROC __glewMatrixMultdEXT;\r\nGLEW_FUN_EXPORT PFNGLMATRIXMULTFEXTPROC __glewMatrixMultfEXT;\r\nGLEW_FUN_EXPORT PFNGLMATRIXORTHOEXTPROC __glewMatrixOrthoEXT;\r\nGLEW_FUN_EXPORT PFNGLMATRIXPOPEXTPROC __glewMatrixPopEXT;\r\nGLEW_FUN_EXPORT PFNGLMATRIXPUSHEXTPROC __glewMatrixPushEXT;\r\nGLEW_FUN_EXPORT PFNGLMATRIXROTATEDEXTPROC __glewMatrixRotatedEXT;\r\nGLEW_FUN_EXPORT PFNGLMATRIXROTATEFEXTPROC __glewMatrixRotatefEXT;\r\nGLEW_FUN_EXPORT PFNGLMATRIXSCALEDEXTPROC __glewMatrixScaledEXT;\r\nGLEW_FUN_EXPORT PFNGLMATRIXSCALEFEXTPROC __glewMatrixScalefEXT;\r\nGLEW_FUN_EXPORT PFNGLMATRIXTRANSLATEDEXTPROC __glewMatrixTranslatedEXT;\r\nGLEW_FUN_EXPORT PFNGLMATRIXTRANSLATEFEXTPROC __glewMatrixTranslatefEXT;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXBUFFEREXTPROC __glewMultiTexBufferEXT;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORDPOINTEREXTPROC __glewMultiTexCoordPointerEXT;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXENVFEXTPROC __glewMultiTexEnvfEXT;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXENVFVEXTPROC __glewMultiTexEnvfvEXT;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXENVIEXTPROC __glewMultiTexEnviEXT;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXENVIVEXTPROC __glewMultiTexEnvivEXT;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXGENDEXTPROC __glewMultiTexGendEXT;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXGENDVEXTPROC __glewMultiTexGendvEXT;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXGENFEXTPROC __glewMultiTexGenfEXT;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXGENFVEXTPROC __glewMultiTexGenfvEXT;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXGENIEXTPROC __glewMultiTexGeniEXT;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXGENIVEXTPROC __glewMultiTexGenivEXT;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXIMAGE1DEXTPROC __glewMultiTexImage1DEXT;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXIMAGE2DEXTPROC __glewMultiTexImage2DEXT;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXIMAGE3DEXTPROC __glewMultiTexImage3DEXT;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIIVEXTPROC __glewMultiTexParameterIivEXT;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIUIVEXTPROC __glewMultiTexParameterIuivEXT;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERFEXTPROC __glewMultiTexParameterfEXT;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERFVEXTPROC __glewMultiTexParameterfvEXT;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIEXTPROC __glewMultiTexParameteriEXT;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIVEXTPROC __glewMultiTexParameterivEXT;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXRENDERBUFFEREXTPROC __glewMultiTexRenderbufferEXT;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXSUBIMAGE1DEXTPROC __glewMultiTexSubImage1DEXT;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXSUBIMAGE2DEXTPROC __glewMultiTexSubImage2DEXT;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXSUBIMAGE3DEXTPROC __glewMultiTexSubImage3DEXT;\r\nGLEW_FUN_EXPORT PFNGLNAMEDBUFFERDATAEXTPROC __glewNamedBufferDataEXT;\r\nGLEW_FUN_EXPORT PFNGLNAMEDBUFFERSUBDATAEXTPROC __glewNamedBufferSubDataEXT;\r\nGLEW_FUN_EXPORT PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC __glewNamedCopyBufferSubDataEXT;\r\nGLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC __glewNamedFramebufferRenderbufferEXT;\r\nGLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC __glewNamedFramebufferTexture1DEXT;\r\nGLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC __glewNamedFramebufferTexture2DEXT;\r\nGLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC __glewNamedFramebufferTexture3DEXT;\r\nGLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC __glewNamedFramebufferTextureEXT;\r\nGLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC __glewNamedFramebufferTextureFaceEXT;\r\nGLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC __glewNamedFramebufferTextureLayerEXT;\r\nGLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC __glewNamedProgramLocalParameter4dEXT;\r\nGLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC __glewNamedProgramLocalParameter4dvEXT;\r\nGLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC __glewNamedProgramLocalParameter4fEXT;\r\nGLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC __glewNamedProgramLocalParameter4fvEXT;\r\nGLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC __glewNamedProgramLocalParameterI4iEXT;\r\nGLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC __glewNamedProgramLocalParameterI4ivEXT;\r\nGLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC __glewNamedProgramLocalParameterI4uiEXT;\r\nGLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC __glewNamedProgramLocalParameterI4uivEXT;\r\nGLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC __glewNamedProgramLocalParameters4fvEXT;\r\nGLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC __glewNamedProgramLocalParametersI4ivEXT;\r\nGLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC __glewNamedProgramLocalParametersI4uivEXT;\r\nGLEW_FUN_EXPORT PFNGLNAMEDPROGRAMSTRINGEXTPROC __glewNamedProgramStringEXT;\r\nGLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC __glewNamedRenderbufferStorageEXT;\r\nGLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC __glewNamedRenderbufferStorageMultisampleCoverageEXT;\r\nGLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewNamedRenderbufferStorageMultisampleEXT;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FEXTPROC __glewProgramUniform1fEXT;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FVEXTPROC __glewProgramUniform1fvEXT;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IEXTPROC __glewProgramUniform1iEXT;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IVEXTPROC __glewProgramUniform1ivEXT;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIEXTPROC __glewProgramUniform1uiEXT;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIVEXTPROC __glewProgramUniform1uivEXT;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FEXTPROC __glewProgramUniform2fEXT;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FVEXTPROC __glewProgramUniform2fvEXT;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IEXTPROC __glewProgramUniform2iEXT;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IVEXTPROC __glewProgramUniform2ivEXT;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIEXTPROC __glewProgramUniform2uiEXT;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIVEXTPROC __glewProgramUniform2uivEXT;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FEXTPROC __glewProgramUniform3fEXT;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FVEXTPROC __glewProgramUniform3fvEXT;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IEXTPROC __glewProgramUniform3iEXT;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IVEXTPROC __glewProgramUniform3ivEXT;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIEXTPROC __glewProgramUniform3uiEXT;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIVEXTPROC __glewProgramUniform3uivEXT;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FEXTPROC __glewProgramUniform4fEXT;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FVEXTPROC __glewProgramUniform4fvEXT;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IEXTPROC __glewProgramUniform4iEXT;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IVEXTPROC __glewProgramUniform4ivEXT;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIEXTPROC __glewProgramUniform4uiEXT;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIVEXTPROC __glewProgramUniform4uivEXT;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC __glewProgramUniformMatrix2fvEXT;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC __glewProgramUniformMatrix2x3fvEXT;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC __glewProgramUniformMatrix2x4fvEXT;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC __glewProgramUniformMatrix3fvEXT;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC __glewProgramUniformMatrix3x2fvEXT;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC __glewProgramUniformMatrix3x4fvEXT;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC __glewProgramUniformMatrix4fvEXT;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC __glewProgramUniformMatrix4x2fvEXT;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC __glewProgramUniformMatrix4x3fvEXT;\r\nGLEW_FUN_EXPORT PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC __glewPushClientAttribDefaultEXT;\r\nGLEW_FUN_EXPORT PFNGLTEXTUREBUFFEREXTPROC __glewTextureBufferEXT;\r\nGLEW_FUN_EXPORT PFNGLTEXTUREIMAGE1DEXTPROC __glewTextureImage1DEXT;\r\nGLEW_FUN_EXPORT PFNGLTEXTUREIMAGE2DEXTPROC __glewTextureImage2DEXT;\r\nGLEW_FUN_EXPORT PFNGLTEXTUREIMAGE3DEXTPROC __glewTextureImage3DEXT;\r\nGLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIIVEXTPROC __glewTextureParameterIivEXT;\r\nGLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIUIVEXTPROC __glewTextureParameterIuivEXT;\r\nGLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFEXTPROC __glewTextureParameterfEXT;\r\nGLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFVEXTPROC __glewTextureParameterfvEXT;\r\nGLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIEXTPROC __glewTextureParameteriEXT;\r\nGLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIVEXTPROC __glewTextureParameterivEXT;\r\nGLEW_FUN_EXPORT PFNGLTEXTURERENDERBUFFEREXTPROC __glewTextureRenderbufferEXT;\r\nGLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE1DEXTPROC __glewTextureSubImage1DEXT;\r\nGLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE2DEXTPROC __glewTextureSubImage2DEXT;\r\nGLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE3DEXTPROC __glewTextureSubImage3DEXT;\r\nGLEW_FUN_EXPORT PFNGLUNMAPNAMEDBUFFEREXTPROC __glewUnmapNamedBufferEXT;\r\nGLEW_FUN_EXPORT PFNGLVERTEXARRAYCOLOROFFSETEXTPROC __glewVertexArrayColorOffsetEXT;\r\nGLEW_FUN_EXPORT PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC __glewVertexArrayEdgeFlagOffsetEXT;\r\nGLEW_FUN_EXPORT PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC __glewVertexArrayFogCoordOffsetEXT;\r\nGLEW_FUN_EXPORT PFNGLVERTEXARRAYINDEXOFFSETEXTPROC __glewVertexArrayIndexOffsetEXT;\r\nGLEW_FUN_EXPORT PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC __glewVertexArrayMultiTexCoordOffsetEXT;\r\nGLEW_FUN_EXPORT PFNGLVERTEXARRAYNORMALOFFSETEXTPROC __glewVertexArrayNormalOffsetEXT;\r\nGLEW_FUN_EXPORT PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC __glewVertexArraySecondaryColorOffsetEXT;\r\nGLEW_FUN_EXPORT PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC __glewVertexArrayTexCoordOffsetEXT;\r\nGLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC __glewVertexArrayVertexAttribIOffsetEXT;\r\nGLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC __glewVertexArrayVertexAttribOffsetEXT;\r\nGLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC __glewVertexArrayVertexOffsetEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLCOLORMASKINDEXEDEXTPROC __glewColorMaskIndexedEXT;\r\nGLEW_FUN_EXPORT PFNGLDISABLEINDEXEDEXTPROC __glewDisableIndexedEXT;\r\nGLEW_FUN_EXPORT PFNGLENABLEINDEXEDEXTPROC __glewEnableIndexedEXT;\r\nGLEW_FUN_EXPORT PFNGLGETBOOLEANINDEXEDVEXTPROC __glewGetBooleanIndexedvEXT;\r\nGLEW_FUN_EXPORT PFNGLGETINTEGERINDEXEDVEXTPROC __glewGetIntegerIndexedvEXT;\r\nGLEW_FUN_EXPORT PFNGLISENABLEDINDEXEDEXTPROC __glewIsEnabledIndexedEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDEXTPROC __glewDrawArraysInstancedEXT;\r\nGLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDEXTPROC __glewDrawElementsInstancedEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSEXTPROC __glewDrawRangeElementsEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLFOGCOORDPOINTEREXTPROC __glewFogCoordPointerEXT;\r\nGLEW_FUN_EXPORT PFNGLFOGCOORDDEXTPROC __glewFogCoorddEXT;\r\nGLEW_FUN_EXPORT PFNGLFOGCOORDDVEXTPROC __glewFogCoorddvEXT;\r\nGLEW_FUN_EXPORT PFNGLFOGCOORDFEXTPROC __glewFogCoordfEXT;\r\nGLEW_FUN_EXPORT PFNGLFOGCOORDFVEXTPROC __glewFogCoordfvEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLFRAGMENTCOLORMATERIALEXTPROC __glewFragmentColorMaterialEXT;\r\nGLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFEXTPROC __glewFragmentLightModelfEXT;\r\nGLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFVEXTPROC __glewFragmentLightModelfvEXT;\r\nGLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIEXTPROC __glewFragmentLightModeliEXT;\r\nGLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIVEXTPROC __glewFragmentLightModelivEXT;\r\nGLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFEXTPROC __glewFragmentLightfEXT;\r\nGLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFVEXTPROC __glewFragmentLightfvEXT;\r\nGLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIEXTPROC __glewFragmentLightiEXT;\r\nGLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIVEXTPROC __glewFragmentLightivEXT;\r\nGLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFEXTPROC __glewFragmentMaterialfEXT;\r\nGLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFVEXTPROC __glewFragmentMaterialfvEXT;\r\nGLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIEXTPROC __glewFragmentMaterialiEXT;\r\nGLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIVEXTPROC __glewFragmentMaterialivEXT;\r\nGLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTFVEXTPROC __glewGetFragmentLightfvEXT;\r\nGLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTIVEXTPROC __glewGetFragmentLightivEXT;\r\nGLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALFVEXTPROC __glewGetFragmentMaterialfvEXT;\r\nGLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALIVEXTPROC __glewGetFragmentMaterialivEXT;\r\nGLEW_FUN_EXPORT PFNGLLIGHTENVIEXTPROC __glewLightEnviEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFEREXTPROC __glewBlitFramebufferEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewRenderbufferStorageMultisampleEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLBINDFRAMEBUFFEREXTPROC __glewBindFramebufferEXT;\r\nGLEW_FUN_EXPORT PFNGLBINDRENDERBUFFEREXTPROC __glewBindRenderbufferEXT;\r\nGLEW_FUN_EXPORT PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC __glewCheckFramebufferStatusEXT;\r\nGLEW_FUN_EXPORT PFNGLDELETEFRAMEBUFFERSEXTPROC __glewDeleteFramebuffersEXT;\r\nGLEW_FUN_EXPORT PFNGLDELETERENDERBUFFERSEXTPROC __glewDeleteRenderbuffersEXT;\r\nGLEW_FUN_EXPORT PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC __glewFramebufferRenderbufferEXT;\r\nGLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE1DEXTPROC __glewFramebufferTexture1DEXT;\r\nGLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DEXTPROC __glewFramebufferTexture2DEXT;\r\nGLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE3DEXTPROC __glewFramebufferTexture3DEXT;\r\nGLEW_FUN_EXPORT PFNGLGENFRAMEBUFFERSEXTPROC __glewGenFramebuffersEXT;\r\nGLEW_FUN_EXPORT PFNGLGENRENDERBUFFERSEXTPROC __glewGenRenderbuffersEXT;\r\nGLEW_FUN_EXPORT PFNGLGENERATEMIPMAPEXTPROC __glewGenerateMipmapEXT;\r\nGLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetFramebufferAttachmentParameterivEXT;\r\nGLEW_FUN_EXPORT PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC __glewGetRenderbufferParameterivEXT;\r\nGLEW_FUN_EXPORT PFNGLISFRAMEBUFFEREXTPROC __glewIsFramebufferEXT;\r\nGLEW_FUN_EXPORT PFNGLISRENDERBUFFEREXTPROC __glewIsRenderbufferEXT;\r\nGLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEEXTPROC __glewRenderbufferStorageEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREEXTPROC __glewFramebufferTextureEXT;\r\nGLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC __glewFramebufferTextureFaceEXT;\r\nGLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC __glewFramebufferTextureLayerEXT;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIEXTPROC __glewProgramParameteriEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERS4FVEXTPROC __glewProgramEnvParameters4fvEXT;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC __glewProgramLocalParameters4fvEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONEXTPROC __glewBindFragDataLocationEXT;\r\nGLEW_FUN_EXPORT PFNGLGETFRAGDATALOCATIONEXTPROC __glewGetFragDataLocationEXT;\r\nGLEW_FUN_EXPORT PFNGLGETUNIFORMUIVEXTPROC __glewGetUniformuivEXT;\r\nGLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIIVEXTPROC __glewGetVertexAttribIivEXT;\r\nGLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIUIVEXTPROC __glewGetVertexAttribIuivEXT;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM1UIEXTPROC __glewUniform1uiEXT;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM1UIVEXTPROC __glewUniform1uivEXT;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM2UIEXTPROC __glewUniform2uiEXT;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM2UIVEXTPROC __glewUniform2uivEXT;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM3UIEXTPROC __glewUniform3uiEXT;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM3UIVEXTPROC __glewUniform3uivEXT;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM4UIEXTPROC __glewUniform4uiEXT;\r\nGLEW_FUN_EXPORT PFNGLUNIFORM4UIVEXTPROC __glewUniform4uivEXT;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IEXTPROC __glewVertexAttribI1iEXT;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IVEXTPROC __glewVertexAttribI1ivEXT;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIEXTPROC __glewVertexAttribI1uiEXT;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIVEXTPROC __glewVertexAttribI1uivEXT;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IEXTPROC __glewVertexAttribI2iEXT;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IVEXTPROC __glewVertexAttribI2ivEXT;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIEXTPROC __glewVertexAttribI2uiEXT;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIVEXTPROC __glewVertexAttribI2uivEXT;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IEXTPROC __glewVertexAttribI3iEXT;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IVEXTPROC __glewVertexAttribI3ivEXT;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIEXTPROC __glewVertexAttribI3uiEXT;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIVEXTPROC __glewVertexAttribI3uivEXT;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4BVEXTPROC __glewVertexAttribI4bvEXT;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IEXTPROC __glewVertexAttribI4iEXT;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IVEXTPROC __glewVertexAttribI4ivEXT;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4SVEXTPROC __glewVertexAttribI4svEXT;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UBVEXTPROC __glewVertexAttribI4ubvEXT;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIEXTPROC __glewVertexAttribI4uiEXT;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIVEXTPROC __glewVertexAttribI4uivEXT;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4USVEXTPROC __glewVertexAttribI4usvEXT;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBIPOINTEREXTPROC __glewVertexAttribIPointerEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLGETHISTOGRAMEXTPROC __glewGetHistogramEXT;\r\nGLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERFVEXTPROC __glewGetHistogramParameterfvEXT;\r\nGLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERIVEXTPROC __glewGetHistogramParameterivEXT;\r\nGLEW_FUN_EXPORT PFNGLGETMINMAXEXTPROC __glewGetMinmaxEXT;\r\nGLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERFVEXTPROC __glewGetMinmaxParameterfvEXT;\r\nGLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERIVEXTPROC __glewGetMinmaxParameterivEXT;\r\nGLEW_FUN_EXPORT PFNGLHISTOGRAMEXTPROC __glewHistogramEXT;\r\nGLEW_FUN_EXPORT PFNGLMINMAXEXTPROC __glewMinmaxEXT;\r\nGLEW_FUN_EXPORT PFNGLRESETHISTOGRAMEXTPROC __glewResetHistogramEXT;\r\nGLEW_FUN_EXPORT PFNGLRESETMINMAXEXTPROC __glewResetMinmaxEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLINDEXFUNCEXTPROC __glewIndexFuncEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLINDEXMATERIALEXTPROC __glewIndexMaterialEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLAPPLYTEXTUREEXTPROC __glewApplyTextureEXT;\r\nGLEW_FUN_EXPORT PFNGLTEXTURELIGHTEXTPROC __glewTextureLightEXT;\r\nGLEW_FUN_EXPORT PFNGLTEXTUREMATERIALEXTPROC __glewTextureMaterialEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSEXTPROC __glewMultiDrawArraysEXT;\r\nGLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSEXTPROC __glewMultiDrawElementsEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLSAMPLEMASKEXTPROC __glewSampleMaskEXT;\r\nGLEW_FUN_EXPORT PFNGLSAMPLEPATTERNEXTPROC __glewSamplePatternEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLCOLORTABLEEXTPROC __glewColorTableEXT;\r\nGLEW_FUN_EXPORT PFNGLGETCOLORTABLEEXTPROC __glewGetColorTableEXT;\r\nGLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVEXTPROC __glewGetColorTableParameterfvEXT;\r\nGLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVEXTPROC __glewGetColorTableParameterivEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC __glewGetPixelTransformParameterfvEXT;\r\nGLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC __glewGetPixelTransformParameterivEXT;\r\nGLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFEXTPROC __glewPixelTransformParameterfEXT;\r\nGLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC __glewPixelTransformParameterfvEXT;\r\nGLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIEXTPROC __glewPixelTransformParameteriEXT;\r\nGLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC __glewPixelTransformParameterivEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLPOINTPARAMETERFEXTPROC __glewPointParameterfEXT;\r\nGLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVEXTPROC __glewPointParameterfvEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLPOLYGONOFFSETEXTPROC __glewPolygonOffsetEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLPROVOKINGVERTEXEXTPROC __glewProvokingVertexEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLBEGINSCENEEXTPROC __glewBeginSceneEXT;\r\nGLEW_FUN_EXPORT PFNGLENDSCENEEXTPROC __glewEndSceneEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BEXTPROC __glewSecondaryColor3bEXT;\r\nGLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BVEXTPROC __glewSecondaryColor3bvEXT;\r\nGLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DEXTPROC __glewSecondaryColor3dEXT;\r\nGLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DVEXTPROC __glewSecondaryColor3dvEXT;\r\nGLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FEXTPROC __glewSecondaryColor3fEXT;\r\nGLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FVEXTPROC __glewSecondaryColor3fvEXT;\r\nGLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IEXTPROC __glewSecondaryColor3iEXT;\r\nGLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IVEXTPROC __glewSecondaryColor3ivEXT;\r\nGLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SEXTPROC __glewSecondaryColor3sEXT;\r\nGLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SVEXTPROC __glewSecondaryColor3svEXT;\r\nGLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBEXTPROC __glewSecondaryColor3ubEXT;\r\nGLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBVEXTPROC __glewSecondaryColor3ubvEXT;\r\nGLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIEXTPROC __glewSecondaryColor3uiEXT;\r\nGLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIVEXTPROC __glewSecondaryColor3uivEXT;\r\nGLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USEXTPROC __glewSecondaryColor3usEXT;\r\nGLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USVEXTPROC __glewSecondaryColor3usvEXT;\r\nGLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTEREXTPROC __glewSecondaryColorPointerEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLACTIVEPROGRAMEXTPROC __glewActiveProgramEXT;\r\nGLEW_FUN_EXPORT PFNGLCREATESHADERPROGRAMEXTPROC __glewCreateShaderProgramEXT;\r\nGLEW_FUN_EXPORT PFNGLUSESHADERPROGRAMEXTPROC __glewUseShaderProgramEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLACTIVESTENCILFACEEXTPROC __glewActiveStencilFaceEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLTEXSUBIMAGE1DEXTPROC __glewTexSubImage1DEXT;\r\nGLEW_FUN_EXPORT PFNGLTEXSUBIMAGE2DEXTPROC __glewTexSubImage2DEXT;\r\nGLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DEXTPROC __glewTexSubImage3DEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLTEXIMAGE3DEXTPROC __glewTexImage3DEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLTEXBUFFEREXTPROC __glewTexBufferEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLCLEARCOLORIIEXTPROC __glewClearColorIiEXT;\r\nGLEW_FUN_EXPORT PFNGLCLEARCOLORIUIEXTPROC __glewClearColorIuiEXT;\r\nGLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIIVEXTPROC __glewGetTexParameterIivEXT;\r\nGLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIUIVEXTPROC __glewGetTexParameterIuivEXT;\r\nGLEW_FUN_EXPORT PFNGLTEXPARAMETERIIVEXTPROC __glewTexParameterIivEXT;\r\nGLEW_FUN_EXPORT PFNGLTEXPARAMETERIUIVEXTPROC __glewTexParameterIuivEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLARETEXTURESRESIDENTEXTPROC __glewAreTexturesResidentEXT;\r\nGLEW_FUN_EXPORT PFNGLBINDTEXTUREEXTPROC __glewBindTextureEXT;\r\nGLEW_FUN_EXPORT PFNGLDELETETEXTURESEXTPROC __glewDeleteTexturesEXT;\r\nGLEW_FUN_EXPORT PFNGLGENTEXTURESEXTPROC __glewGenTexturesEXT;\r\nGLEW_FUN_EXPORT PFNGLISTEXTUREEXTPROC __glewIsTextureEXT;\r\nGLEW_FUN_EXPORT PFNGLPRIORITIZETEXTURESEXTPROC __glewPrioritizeTexturesEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLTEXTURENORMALEXTPROC __glewTextureNormalEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VEXTPROC __glewGetQueryObjecti64vEXT;\r\nGLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VEXTPROC __glewGetQueryObjectui64vEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKEXTPROC __glewBeginTransformFeedbackEXT;\r\nGLEW_FUN_EXPORT PFNGLBINDBUFFERBASEEXTPROC __glewBindBufferBaseEXT;\r\nGLEW_FUN_EXPORT PFNGLBINDBUFFEROFFSETEXTPROC __glewBindBufferOffsetEXT;\r\nGLEW_FUN_EXPORT PFNGLBINDBUFFERRANGEEXTPROC __glewBindBufferRangeEXT;\r\nGLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKEXTPROC __glewEndTransformFeedbackEXT;\r\nGLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC __glewGetTransformFeedbackVaryingEXT;\r\nGLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC __glewTransformFeedbackVaryingsEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLARRAYELEMENTEXTPROC __glewArrayElementEXT;\r\nGLEW_FUN_EXPORT PFNGLCOLORPOINTEREXTPROC __glewColorPointerEXT;\r\nGLEW_FUN_EXPORT PFNGLDRAWARRAYSEXTPROC __glewDrawArraysEXT;\r\nGLEW_FUN_EXPORT PFNGLEDGEFLAGPOINTEREXTPROC __glewEdgeFlagPointerEXT;\r\nGLEW_FUN_EXPORT PFNGLGETPOINTERVEXTPROC __glewGetPointervEXT;\r\nGLEW_FUN_EXPORT PFNGLINDEXPOINTEREXTPROC __glewIndexPointerEXT;\r\nGLEW_FUN_EXPORT PFNGLNORMALPOINTEREXTPROC __glewNormalPointerEXT;\r\nGLEW_FUN_EXPORT PFNGLTEXCOORDPOINTEREXTPROC __glewTexCoordPointerEXT;\r\nGLEW_FUN_EXPORT PFNGLVERTEXPOINTEREXTPROC __glewVertexPointerEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLBEGINVERTEXSHADEREXTPROC __glewBeginVertexShaderEXT;\r\nGLEW_FUN_EXPORT PFNGLBINDLIGHTPARAMETEREXTPROC __glewBindLightParameterEXT;\r\nGLEW_FUN_EXPORT PFNGLBINDMATERIALPARAMETEREXTPROC __glewBindMaterialParameterEXT;\r\nGLEW_FUN_EXPORT PFNGLBINDPARAMETEREXTPROC __glewBindParameterEXT;\r\nGLEW_FUN_EXPORT PFNGLBINDTEXGENPARAMETEREXTPROC __glewBindTexGenParameterEXT;\r\nGLEW_FUN_EXPORT PFNGLBINDTEXTUREUNITPARAMETEREXTPROC __glewBindTextureUnitParameterEXT;\r\nGLEW_FUN_EXPORT PFNGLBINDVERTEXSHADEREXTPROC __glewBindVertexShaderEXT;\r\nGLEW_FUN_EXPORT PFNGLDELETEVERTEXSHADEREXTPROC __glewDeleteVertexShaderEXT;\r\nGLEW_FUN_EXPORT PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC __glewDisableVariantClientStateEXT;\r\nGLEW_FUN_EXPORT PFNGLENABLEVARIANTCLIENTSTATEEXTPROC __glewEnableVariantClientStateEXT;\r\nGLEW_FUN_EXPORT PFNGLENDVERTEXSHADEREXTPROC __glewEndVertexShaderEXT;\r\nGLEW_FUN_EXPORT PFNGLEXTRACTCOMPONENTEXTPROC __glewExtractComponentEXT;\r\nGLEW_FUN_EXPORT PFNGLGENSYMBOLSEXTPROC __glewGenSymbolsEXT;\r\nGLEW_FUN_EXPORT PFNGLGENVERTEXSHADERSEXTPROC __glewGenVertexShadersEXT;\r\nGLEW_FUN_EXPORT PFNGLGETINVARIANTBOOLEANVEXTPROC __glewGetInvariantBooleanvEXT;\r\nGLEW_FUN_EXPORT PFNGLGETINVARIANTFLOATVEXTPROC __glewGetInvariantFloatvEXT;\r\nGLEW_FUN_EXPORT PFNGLGETINVARIANTINTEGERVEXTPROC __glewGetInvariantIntegervEXT;\r\nGLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC __glewGetLocalConstantBooleanvEXT;\r\nGLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTFLOATVEXTPROC __glewGetLocalConstantFloatvEXT;\r\nGLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTINTEGERVEXTPROC __glewGetLocalConstantIntegervEXT;\r\nGLEW_FUN_EXPORT PFNGLGETVARIANTBOOLEANVEXTPROC __glewGetVariantBooleanvEXT;\r\nGLEW_FUN_EXPORT PFNGLGETVARIANTFLOATVEXTPROC __glewGetVariantFloatvEXT;\r\nGLEW_FUN_EXPORT PFNGLGETVARIANTINTEGERVEXTPROC __glewGetVariantIntegervEXT;\r\nGLEW_FUN_EXPORT PFNGLGETVARIANTPOINTERVEXTPROC __glewGetVariantPointervEXT;\r\nGLEW_FUN_EXPORT PFNGLINSERTCOMPONENTEXTPROC __glewInsertComponentEXT;\r\nGLEW_FUN_EXPORT PFNGLISVARIANTENABLEDEXTPROC __glewIsVariantEnabledEXT;\r\nGLEW_FUN_EXPORT PFNGLSETINVARIANTEXTPROC __glewSetInvariantEXT;\r\nGLEW_FUN_EXPORT PFNGLSETLOCALCONSTANTEXTPROC __glewSetLocalConstantEXT;\r\nGLEW_FUN_EXPORT PFNGLSHADEROP1EXTPROC __glewShaderOp1EXT;\r\nGLEW_FUN_EXPORT PFNGLSHADEROP2EXTPROC __glewShaderOp2EXT;\r\nGLEW_FUN_EXPORT PFNGLSHADEROP3EXTPROC __glewShaderOp3EXT;\r\nGLEW_FUN_EXPORT PFNGLSWIZZLEEXTPROC __glewSwizzleEXT;\r\nGLEW_FUN_EXPORT PFNGLVARIANTPOINTEREXTPROC __glewVariantPointerEXT;\r\nGLEW_FUN_EXPORT PFNGLVARIANTBVEXTPROC __glewVariantbvEXT;\r\nGLEW_FUN_EXPORT PFNGLVARIANTDVEXTPROC __glewVariantdvEXT;\r\nGLEW_FUN_EXPORT PFNGLVARIANTFVEXTPROC __glewVariantfvEXT;\r\nGLEW_FUN_EXPORT PFNGLVARIANTIVEXTPROC __glewVariantivEXT;\r\nGLEW_FUN_EXPORT PFNGLVARIANTSVEXTPROC __glewVariantsvEXT;\r\nGLEW_FUN_EXPORT PFNGLVARIANTUBVEXTPROC __glewVariantubvEXT;\r\nGLEW_FUN_EXPORT PFNGLVARIANTUIVEXTPROC __glewVariantuivEXT;\r\nGLEW_FUN_EXPORT PFNGLVARIANTUSVEXTPROC __glewVariantusvEXT;\r\nGLEW_FUN_EXPORT PFNGLWRITEMASKEXTPROC __glewWriteMaskEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLVERTEXWEIGHTPOINTEREXTPROC __glewVertexWeightPointerEXT;\r\nGLEW_FUN_EXPORT PFNGLVERTEXWEIGHTFEXTPROC __glewVertexWeightfEXT;\r\nGLEW_FUN_EXPORT PFNGLVERTEXWEIGHTFVEXTPROC __glewVertexWeightfvEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLFRAMETERMINATORGREMEDYPROC __glewFrameTerminatorGREMEDY;\r\n\r\nGLEW_FUN_EXPORT PFNGLSTRINGMARKERGREMEDYPROC __glewStringMarkerGREMEDY;\r\n\r\nGLEW_FUN_EXPORT PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC __glewGetImageTransformParameterfvHP;\r\nGLEW_FUN_EXPORT PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC __glewGetImageTransformParameterivHP;\r\nGLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERFHPPROC __glewImageTransformParameterfHP;\r\nGLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERFVHPPROC __glewImageTransformParameterfvHP;\r\nGLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERIHPPROC __glewImageTransformParameteriHP;\r\nGLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERIVHPPROC __glewImageTransformParameterivHP;\r\n\r\nGLEW_FUN_EXPORT PFNGLMULTIMODEDRAWARRAYSIBMPROC __glewMultiModeDrawArraysIBM;\r\nGLEW_FUN_EXPORT PFNGLMULTIMODEDRAWELEMENTSIBMPROC __glewMultiModeDrawElementsIBM;\r\n\r\nGLEW_FUN_EXPORT PFNGLCOLORPOINTERLISTIBMPROC __glewColorPointerListIBM;\r\nGLEW_FUN_EXPORT PFNGLEDGEFLAGPOINTERLISTIBMPROC __glewEdgeFlagPointerListIBM;\r\nGLEW_FUN_EXPORT PFNGLFOGCOORDPOINTERLISTIBMPROC __glewFogCoordPointerListIBM;\r\nGLEW_FUN_EXPORT PFNGLINDEXPOINTERLISTIBMPROC __glewIndexPointerListIBM;\r\nGLEW_FUN_EXPORT PFNGLNORMALPOINTERLISTIBMPROC __glewNormalPointerListIBM;\r\nGLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTERLISTIBMPROC __glewSecondaryColorPointerListIBM;\r\nGLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERLISTIBMPROC __glewTexCoordPointerListIBM;\r\nGLEW_FUN_EXPORT PFNGLVERTEXPOINTERLISTIBMPROC __glewVertexPointerListIBM;\r\n\r\nGLEW_FUN_EXPORT PFNGLCOLORPOINTERVINTELPROC __glewColorPointervINTEL;\r\nGLEW_FUN_EXPORT PFNGLNORMALPOINTERVINTELPROC __glewNormalPointervINTEL;\r\nGLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERVINTELPROC __glewTexCoordPointervINTEL;\r\nGLEW_FUN_EXPORT PFNGLVERTEXPOINTERVINTELPROC __glewVertexPointervINTEL;\r\n\r\nGLEW_FUN_EXPORT PFNGLTEXSCISSORFUNCINTELPROC __glewTexScissorFuncINTEL;\r\nGLEW_FUN_EXPORT PFNGLTEXSCISSORINTELPROC __glewTexScissorINTEL;\r\n\r\nGLEW_FUN_EXPORT PFNGLBUFFERREGIONENABLEDEXTPROC __glewBufferRegionEnabledEXT;\r\nGLEW_FUN_EXPORT PFNGLDELETEBUFFERREGIONEXTPROC __glewDeleteBufferRegionEXT;\r\nGLEW_FUN_EXPORT PFNGLDRAWBUFFERREGIONEXTPROC __glewDrawBufferRegionEXT;\r\nGLEW_FUN_EXPORT PFNGLNEWBUFFERREGIONEXTPROC __glewNewBufferRegionEXT;\r\nGLEW_FUN_EXPORT PFNGLREADBUFFERREGIONEXTPROC __glewReadBufferRegionEXT;\r\n\r\nGLEW_FUN_EXPORT PFNGLRESIZEBUFFERSMESAPROC __glewResizeBuffersMESA;\r\n\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS2DMESAPROC __glewWindowPos2dMESA;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS2DVMESAPROC __glewWindowPos2dvMESA;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS2FMESAPROC __glewWindowPos2fMESA;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS2FVMESAPROC __glewWindowPos2fvMESA;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS2IMESAPROC __glewWindowPos2iMESA;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS2IVMESAPROC __glewWindowPos2ivMESA;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS2SMESAPROC __glewWindowPos2sMESA;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS2SVMESAPROC __glewWindowPos2svMESA;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS3DMESAPROC __glewWindowPos3dMESA;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS3DVMESAPROC __glewWindowPos3dvMESA;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS3FMESAPROC __glewWindowPos3fMESA;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS3FVMESAPROC __glewWindowPos3fvMESA;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS3IMESAPROC __glewWindowPos3iMESA;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS3IVMESAPROC __glewWindowPos3ivMESA;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS3SMESAPROC __glewWindowPos3sMESA;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS3SVMESAPROC __glewWindowPos3svMESA;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS4DMESAPROC __glewWindowPos4dMESA;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS4DVMESAPROC __glewWindowPos4dvMESA;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS4FMESAPROC __glewWindowPos4fMESA;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS4FVMESAPROC __glewWindowPos4fvMESA;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS4IMESAPROC __glewWindowPos4iMESA;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS4IVMESAPROC __glewWindowPos4ivMESA;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS4SMESAPROC __glewWindowPos4sMESA;\r\nGLEW_FUN_EXPORT PFNGLWINDOWPOS4SVMESAPROC __glewWindowPos4svMESA;\r\n\r\nGLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERNVPROC __glewBeginConditionalRenderNV;\r\nGLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERNVPROC __glewEndConditionalRenderNV;\r\n\r\nGLEW_FUN_EXPORT PFNGLCOPYIMAGESUBDATANVPROC __glewCopyImageSubDataNV;\r\n\r\nGLEW_FUN_EXPORT PFNGLCLEARDEPTHDNVPROC __glewClearDepthdNV;\r\nGLEW_FUN_EXPORT PFNGLDEPTHBOUNDSDNVPROC __glewDepthBoundsdNV;\r\nGLEW_FUN_EXPORT PFNGLDEPTHRANGEDNVPROC __glewDepthRangedNV;\r\n\r\nGLEW_FUN_EXPORT PFNGLEVALMAPSNVPROC __glewEvalMapsNV;\r\nGLEW_FUN_EXPORT PFNGLGETMAPATTRIBPARAMETERFVNVPROC __glewGetMapAttribParameterfvNV;\r\nGLEW_FUN_EXPORT PFNGLGETMAPATTRIBPARAMETERIVNVPROC __glewGetMapAttribParameterivNV;\r\nGLEW_FUN_EXPORT PFNGLGETMAPCONTROLPOINTSNVPROC __glewGetMapControlPointsNV;\r\nGLEW_FUN_EXPORT PFNGLGETMAPPARAMETERFVNVPROC __glewGetMapParameterfvNV;\r\nGLEW_FUN_EXPORT PFNGLGETMAPPARAMETERIVNVPROC __glewGetMapParameterivNV;\r\nGLEW_FUN_EXPORT PFNGLMAPCONTROLPOINTSNVPROC __glewMapControlPointsNV;\r\nGLEW_FUN_EXPORT PFNGLMAPPARAMETERFVNVPROC __glewMapParameterfvNV;\r\nGLEW_FUN_EXPORT PFNGLMAPPARAMETERIVNVPROC __glewMapParameterivNV;\r\n\r\nGLEW_FUN_EXPORT PFNGLGETMULTISAMPLEFVNVPROC __glewGetMultisamplefvNV;\r\nGLEW_FUN_EXPORT PFNGLSAMPLEMASKINDEXEDNVPROC __glewSampleMaskIndexedNV;\r\nGLEW_FUN_EXPORT PFNGLTEXRENDERBUFFERNVPROC __glewTexRenderbufferNV;\r\n\r\nGLEW_FUN_EXPORT PFNGLDELETEFENCESNVPROC __glewDeleteFencesNV;\r\nGLEW_FUN_EXPORT PFNGLFINISHFENCENVPROC __glewFinishFenceNV;\r\nGLEW_FUN_EXPORT PFNGLGENFENCESNVPROC __glewGenFencesNV;\r\nGLEW_FUN_EXPORT PFNGLGETFENCEIVNVPROC __glewGetFenceivNV;\r\nGLEW_FUN_EXPORT PFNGLISFENCENVPROC __glewIsFenceNV;\r\nGLEW_FUN_EXPORT PFNGLSETFENCENVPROC __glewSetFenceNV;\r\nGLEW_FUN_EXPORT PFNGLTESTFENCENVPROC __glewTestFenceNV;\r\n\r\nGLEW_FUN_EXPORT PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC __glewGetProgramNamedParameterdvNV;\r\nGLEW_FUN_EXPORT PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC __glewGetProgramNamedParameterfvNV;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4DNVPROC __glewProgramNamedParameter4dNV;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC __glewProgramNamedParameter4dvNV;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4FNVPROC __glewProgramNamedParameter4fNV;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC __glewProgramNamedParameter4fvNV;\r\n\r\nGLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC __glewRenderbufferStorageMultisampleCoverageNV;\r\n\r\nGLEW_FUN_EXPORT PFNGLPROGRAMVERTEXLIMITNVPROC __glewProgramVertexLimitNV;\r\n\r\nGLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4INVPROC __glewProgramEnvParameterI4iNV;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4IVNVPROC __glewProgramEnvParameterI4ivNV;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4UINVPROC __glewProgramEnvParameterI4uiNV;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4UIVNVPROC __glewProgramEnvParameterI4uivNV;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERSI4IVNVPROC __glewProgramEnvParametersI4ivNV;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC __glewProgramEnvParametersI4uivNV;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4INVPROC __glewProgramLocalParameterI4iNV;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC __glewProgramLocalParameterI4ivNV;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4UINVPROC __glewProgramLocalParameterI4uiNV;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC __glewProgramLocalParameterI4uivNV;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC __glewProgramLocalParametersI4ivNV;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC __glewProgramLocalParametersI4uivNV;\r\n\r\nGLEW_FUN_EXPORT PFNGLCOLOR3HNVPROC __glewColor3hNV;\r\nGLEW_FUN_EXPORT PFNGLCOLOR3HVNVPROC __glewColor3hvNV;\r\nGLEW_FUN_EXPORT PFNGLCOLOR4HNVPROC __glewColor4hNV;\r\nGLEW_FUN_EXPORT PFNGLCOLOR4HVNVPROC __glewColor4hvNV;\r\nGLEW_FUN_EXPORT PFNGLFOGCOORDHNVPROC __glewFogCoordhNV;\r\nGLEW_FUN_EXPORT PFNGLFOGCOORDHVNVPROC __glewFogCoordhvNV;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD1HNVPROC __glewMultiTexCoord1hNV;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD1HVNVPROC __glewMultiTexCoord1hvNV;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD2HNVPROC __glewMultiTexCoord2hNV;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD2HVNVPROC __glewMultiTexCoord2hvNV;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD3HNVPROC __glewMultiTexCoord3hNV;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD3HVNVPROC __glewMultiTexCoord3hvNV;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD4HNVPROC __glewMultiTexCoord4hNV;\r\nGLEW_FUN_EXPORT PFNGLMULTITEXCOORD4HVNVPROC __glewMultiTexCoord4hvNV;\r\nGLEW_FUN_EXPORT PFNGLNORMAL3HNVPROC __glewNormal3hNV;\r\nGLEW_FUN_EXPORT PFNGLNORMAL3HVNVPROC __glewNormal3hvNV;\r\nGLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3HNVPROC __glewSecondaryColor3hNV;\r\nGLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3HVNVPROC __glewSecondaryColor3hvNV;\r\nGLEW_FUN_EXPORT PFNGLTEXCOORD1HNVPROC __glewTexCoord1hNV;\r\nGLEW_FUN_EXPORT PFNGLTEXCOORD1HVNVPROC __glewTexCoord1hvNV;\r\nGLEW_FUN_EXPORT PFNGLTEXCOORD2HNVPROC __glewTexCoord2hNV;\r\nGLEW_FUN_EXPORT PFNGLTEXCOORD2HVNVPROC __glewTexCoord2hvNV;\r\nGLEW_FUN_EXPORT PFNGLTEXCOORD3HNVPROC __glewTexCoord3hNV;\r\nGLEW_FUN_EXPORT PFNGLTEXCOORD3HVNVPROC __glewTexCoord3hvNV;\r\nGLEW_FUN_EXPORT PFNGLTEXCOORD4HNVPROC __glewTexCoord4hNV;\r\nGLEW_FUN_EXPORT PFNGLTEXCOORD4HVNVPROC __glewTexCoord4hvNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEX2HNVPROC __glewVertex2hNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEX2HVNVPROC __glewVertex2hvNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEX3HNVPROC __glewVertex3hNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEX3HVNVPROC __glewVertex3hvNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEX4HNVPROC __glewVertex4hNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEX4HVNVPROC __glewVertex4hvNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB1HNVPROC __glewVertexAttrib1hNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB1HVNVPROC __glewVertexAttrib1hvNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB2HNVPROC __glewVertexAttrib2hNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB2HVNVPROC __glewVertexAttrib2hvNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB3HNVPROC __glewVertexAttrib3hNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB3HVNVPROC __glewVertexAttrib3hvNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4HNVPROC __glewVertexAttrib4hNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4HVNVPROC __glewVertexAttrib4hvNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1HVNVPROC __glewVertexAttribs1hvNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2HVNVPROC __glewVertexAttribs2hvNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3HVNVPROC __glewVertexAttribs3hvNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4HVNVPROC __glewVertexAttribs4hvNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXWEIGHTHNVPROC __glewVertexWeighthNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXWEIGHTHVNVPROC __glewVertexWeighthvNV;\r\n\r\nGLEW_FUN_EXPORT PFNGLBEGINOCCLUSIONQUERYNVPROC __glewBeginOcclusionQueryNV;\r\nGLEW_FUN_EXPORT PFNGLDELETEOCCLUSIONQUERIESNVPROC __glewDeleteOcclusionQueriesNV;\r\nGLEW_FUN_EXPORT PFNGLENDOCCLUSIONQUERYNVPROC __glewEndOcclusionQueryNV;\r\nGLEW_FUN_EXPORT PFNGLGENOCCLUSIONQUERIESNVPROC __glewGenOcclusionQueriesNV;\r\nGLEW_FUN_EXPORT PFNGLGETOCCLUSIONQUERYIVNVPROC __glewGetOcclusionQueryivNV;\r\nGLEW_FUN_EXPORT PFNGLGETOCCLUSIONQUERYUIVNVPROC __glewGetOcclusionQueryuivNV;\r\nGLEW_FUN_EXPORT PFNGLISOCCLUSIONQUERYNVPROC __glewIsOcclusionQueryNV;\r\n\r\nGLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC __glewProgramBufferParametersIivNV;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC __glewProgramBufferParametersIuivNV;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC __glewProgramBufferParametersfvNV;\r\n\r\nGLEW_FUN_EXPORT PFNGLFLUSHPIXELDATARANGENVPROC __glewFlushPixelDataRangeNV;\r\nGLEW_FUN_EXPORT PFNGLPIXELDATARANGENVPROC __glewPixelDataRangeNV;\r\n\r\nGLEW_FUN_EXPORT PFNGLPOINTPARAMETERINVPROC __glewPointParameteriNV;\r\nGLEW_FUN_EXPORT PFNGLPOINTPARAMETERIVNVPROC __glewPointParameterivNV;\r\n\r\nGLEW_FUN_EXPORT PFNGLGETVIDEOI64VNVPROC __glewGetVideoi64vNV;\r\nGLEW_FUN_EXPORT PFNGLGETVIDEOIVNVPROC __glewGetVideoivNV;\r\nGLEW_FUN_EXPORT PFNGLGETVIDEOUI64VNVPROC __glewGetVideoui64vNV;\r\nGLEW_FUN_EXPORT PFNGLGETVIDEOUIVNVPROC __glewGetVideouivNV;\r\nGLEW_FUN_EXPORT PFNGLPRESENTFRAMEDUALFILLNVPROC __glewPresentFrameDualFillNV;\r\nGLEW_FUN_EXPORT PFNGLPRESENTFRAMEKEYEDNVPROC __glewPresentFrameKeyedNV;\r\n\r\nGLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTINDEXNVPROC __glewPrimitiveRestartIndexNV;\r\nGLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTNVPROC __glewPrimitiveRestartNV;\r\n\r\nGLEW_FUN_EXPORT PFNGLCOMBINERINPUTNVPROC __glewCombinerInputNV;\r\nGLEW_FUN_EXPORT PFNGLCOMBINEROUTPUTNVPROC __glewCombinerOutputNV;\r\nGLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERFNVPROC __glewCombinerParameterfNV;\r\nGLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERFVNVPROC __glewCombinerParameterfvNV;\r\nGLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERINVPROC __glewCombinerParameteriNV;\r\nGLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERIVNVPROC __glewCombinerParameterivNV;\r\nGLEW_FUN_EXPORT PFNGLFINALCOMBINERINPUTNVPROC __glewFinalCombinerInputNV;\r\nGLEW_FUN_EXPORT PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC __glewGetCombinerInputParameterfvNV;\r\nGLEW_FUN_EXPORT PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC __glewGetCombinerInputParameterivNV;\r\nGLEW_FUN_EXPORT PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC __glewGetCombinerOutputParameterfvNV;\r\nGLEW_FUN_EXPORT PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC __glewGetCombinerOutputParameterivNV;\r\nGLEW_FUN_EXPORT PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC __glewGetFinalCombinerInputParameterfvNV;\r\nGLEW_FUN_EXPORT PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC __glewGetFinalCombinerInputParameterivNV;\r\n\r\nGLEW_FUN_EXPORT PFNGLCOMBINERSTAGEPARAMETERFVNVPROC __glewCombinerStageParameterfvNV;\r\nGLEW_FUN_EXPORT PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC __glewGetCombinerStageParameterfvNV;\r\n\r\nGLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERUI64VNVPROC __glewGetBufferParameterui64vNV;\r\nGLEW_FUN_EXPORT PFNGLGETINTEGERUI64VNVPROC __glewGetIntegerui64vNV;\r\nGLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC __glewGetNamedBufferParameterui64vNV;\r\nGLEW_FUN_EXPORT PFNGLGETUNIFORMUI64VNVPROC __glewGetUniformui64vNV;\r\nGLEW_FUN_EXPORT PFNGLISBUFFERRESIDENTNVPROC __glewIsBufferResidentNV;\r\nGLEW_FUN_EXPORT PFNGLISNAMEDBUFFERRESIDENTNVPROC __glewIsNamedBufferResidentNV;\r\nGLEW_FUN_EXPORT PFNGLMAKEBUFFERNONRESIDENTNVPROC __glewMakeBufferNonResidentNV;\r\nGLEW_FUN_EXPORT PFNGLMAKEBUFFERRESIDENTNVPROC __glewMakeBufferResidentNV;\r\nGLEW_FUN_EXPORT PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC __glewMakeNamedBufferNonResidentNV;\r\nGLEW_FUN_EXPORT PFNGLMAKENAMEDBUFFERRESIDENTNVPROC __glewMakeNamedBufferResidentNV;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMUI64NVPROC __glewProgramUniformui64NV;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMUI64VNVPROC __glewProgramUniformui64vNV;\r\nGLEW_FUN_EXPORT PFNGLUNIFORMUI64NVPROC __glewUniformui64NV;\r\nGLEW_FUN_EXPORT PFNGLUNIFORMUI64VNVPROC __glewUniformui64vNV;\r\n\r\nGLEW_FUN_EXPORT PFNGLTEXTUREBARRIERNVPROC __glewTextureBarrierNV;\r\n\r\nGLEW_FUN_EXPORT PFNGLACTIVEVARYINGNVPROC __glewActiveVaryingNV;\r\nGLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKNVPROC __glewBeginTransformFeedbackNV;\r\nGLEW_FUN_EXPORT PFNGLBINDBUFFERBASENVPROC __glewBindBufferBaseNV;\r\nGLEW_FUN_EXPORT PFNGLBINDBUFFEROFFSETNVPROC __glewBindBufferOffsetNV;\r\nGLEW_FUN_EXPORT PFNGLBINDBUFFERRANGENVPROC __glewBindBufferRangeNV;\r\nGLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKNVPROC __glewEndTransformFeedbackNV;\r\nGLEW_FUN_EXPORT PFNGLGETACTIVEVARYINGNVPROC __glewGetActiveVaryingNV;\r\nGLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC __glewGetTransformFeedbackVaryingNV;\r\nGLEW_FUN_EXPORT PFNGLGETVARYINGLOCATIONNVPROC __glewGetVaryingLocationNV;\r\nGLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC __glewTransformFeedbackAttribsNV;\r\nGLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC __glewTransformFeedbackVaryingsNV;\r\n\r\nGLEW_FUN_EXPORT PFNGLBINDTRANSFORMFEEDBACKNVPROC __glewBindTransformFeedbackNV;\r\nGLEW_FUN_EXPORT PFNGLDELETETRANSFORMFEEDBACKSNVPROC __glewDeleteTransformFeedbacksNV;\r\nGLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKNVPROC __glewDrawTransformFeedbackNV;\r\nGLEW_FUN_EXPORT PFNGLGENTRANSFORMFEEDBACKSNVPROC __glewGenTransformFeedbacksNV;\r\nGLEW_FUN_EXPORT PFNGLISTRANSFORMFEEDBACKNVPROC __glewIsTransformFeedbackNV;\r\nGLEW_FUN_EXPORT PFNGLPAUSETRANSFORMFEEDBACKNVPROC __glewPauseTransformFeedbackNV;\r\nGLEW_FUN_EXPORT PFNGLRESUMETRANSFORMFEEDBACKNVPROC __glewResumeTransformFeedbackNV;\r\n\r\nGLEW_FUN_EXPORT PFNGLFLUSHVERTEXARRAYRANGENVPROC __glewFlushVertexArrayRangeNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXARRAYRANGENVPROC __glewVertexArrayRangeNV;\r\n\r\nGLEW_FUN_EXPORT PFNGLBUFFERADDRESSRANGENVPROC __glewBufferAddressRangeNV;\r\nGLEW_FUN_EXPORT PFNGLCOLORFORMATNVPROC __glewColorFormatNV;\r\nGLEW_FUN_EXPORT PFNGLEDGEFLAGFORMATNVPROC __glewEdgeFlagFormatNV;\r\nGLEW_FUN_EXPORT PFNGLFOGCOORDFORMATNVPROC __glewFogCoordFormatNV;\r\nGLEW_FUN_EXPORT PFNGLGETINTEGERUI64I_VNVPROC __glewGetIntegerui64i_vNV;\r\nGLEW_FUN_EXPORT PFNGLINDEXFORMATNVPROC __glewIndexFormatNV;\r\nGLEW_FUN_EXPORT PFNGLNORMALFORMATNVPROC __glewNormalFormatNV;\r\nGLEW_FUN_EXPORT PFNGLSECONDARYCOLORFORMATNVPROC __glewSecondaryColorFormatNV;\r\nGLEW_FUN_EXPORT PFNGLTEXCOORDFORMATNVPROC __glewTexCoordFormatNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBFORMATNVPROC __glewVertexAttribFormatNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBIFORMATNVPROC __glewVertexAttribIFormatNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXFORMATNVPROC __glewVertexFormatNV;\r\n\r\nGLEW_FUN_EXPORT PFNGLAREPROGRAMSRESIDENTNVPROC __glewAreProgramsResidentNV;\r\nGLEW_FUN_EXPORT PFNGLBINDPROGRAMNVPROC __glewBindProgramNV;\r\nGLEW_FUN_EXPORT PFNGLDELETEPROGRAMSNVPROC __glewDeleteProgramsNV;\r\nGLEW_FUN_EXPORT PFNGLEXECUTEPROGRAMNVPROC __glewExecuteProgramNV;\r\nGLEW_FUN_EXPORT PFNGLGENPROGRAMSNVPROC __glewGenProgramsNV;\r\nGLEW_FUN_EXPORT PFNGLGETPROGRAMPARAMETERDVNVPROC __glewGetProgramParameterdvNV;\r\nGLEW_FUN_EXPORT PFNGLGETPROGRAMPARAMETERFVNVPROC __glewGetProgramParameterfvNV;\r\nGLEW_FUN_EXPORT PFNGLGETPROGRAMSTRINGNVPROC __glewGetProgramStringNV;\r\nGLEW_FUN_EXPORT PFNGLGETPROGRAMIVNVPROC __glewGetProgramivNV;\r\nGLEW_FUN_EXPORT PFNGLGETTRACKMATRIXIVNVPROC __glewGetTrackMatrixivNV;\r\nGLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVNVPROC __glewGetVertexAttribPointervNV;\r\nGLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVNVPROC __glewGetVertexAttribdvNV;\r\nGLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVNVPROC __glewGetVertexAttribfvNV;\r\nGLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVNVPROC __glewGetVertexAttribivNV;\r\nGLEW_FUN_EXPORT PFNGLISPROGRAMNVPROC __glewIsProgramNV;\r\nGLEW_FUN_EXPORT PFNGLLOADPROGRAMNVPROC __glewLoadProgramNV;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4DNVPROC __glewProgramParameter4dNV;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4DVNVPROC __glewProgramParameter4dvNV;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4FNVPROC __glewProgramParameter4fNV;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4FVNVPROC __glewProgramParameter4fvNV;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERS4DVNVPROC __glewProgramParameters4dvNV;\r\nGLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERS4FVNVPROC __glewProgramParameters4fvNV;\r\nGLEW_FUN_EXPORT PFNGLREQUESTRESIDENTPROGRAMSNVPROC __glewRequestResidentProgramsNV;\r\nGLEW_FUN_EXPORT PFNGLTRACKMATRIXNVPROC __glewTrackMatrixNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DNVPROC __glewVertexAttrib1dNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVNVPROC __glewVertexAttrib1dvNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FNVPROC __glewVertexAttrib1fNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVNVPROC __glewVertexAttrib1fvNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SNVPROC __glewVertexAttrib1sNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVNVPROC __glewVertexAttrib1svNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DNVPROC __glewVertexAttrib2dNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVNVPROC __glewVertexAttrib2dvNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FNVPROC __glewVertexAttrib2fNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVNVPROC __glewVertexAttrib2fvNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SNVPROC __glewVertexAttrib2sNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVNVPROC __glewVertexAttrib2svNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DNVPROC __glewVertexAttrib3dNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVNVPROC __glewVertexAttrib3dvNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FNVPROC __glewVertexAttrib3fNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVNVPROC __glewVertexAttrib3fvNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SNVPROC __glewVertexAttrib3sNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVNVPROC __glewVertexAttrib3svNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DNVPROC __glewVertexAttrib4dNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVNVPROC __glewVertexAttrib4dvNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FNVPROC __glewVertexAttrib4fNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVNVPROC __glewVertexAttrib4fvNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SNVPROC __glewVertexAttrib4sNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVNVPROC __glewVertexAttrib4svNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBNVPROC __glewVertexAttrib4ubNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVNVPROC __glewVertexAttrib4ubvNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERNVPROC __glewVertexAttribPointerNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1DVNVPROC __glewVertexAttribs1dvNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1FVNVPROC __glewVertexAttribs1fvNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1SVNVPROC __glewVertexAttribs1svNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2DVNVPROC __glewVertexAttribs2dvNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2FVNVPROC __glewVertexAttribs2fvNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2SVNVPROC __glewVertexAttribs2svNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3DVNVPROC __glewVertexAttribs3dvNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3FVNVPROC __glewVertexAttribs3fvNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3SVNVPROC __glewVertexAttribs3svNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4DVNVPROC __glewVertexAttribs4dvNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4FVNVPROC __glewVertexAttribs4fvNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4SVNVPROC __glewVertexAttribs4svNV;\r\nGLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4UBVNVPROC __glewVertexAttribs4ubvNV;\r\n\r\nGLEW_FUN_EXPORT PFNGLCLEARDEPTHFOESPROC __glewClearDepthfOES;\r\nGLEW_FUN_EXPORT PFNGLCLIPPLANEFOESPROC __glewClipPlanefOES;\r\nGLEW_FUN_EXPORT PFNGLDEPTHRANGEFOESPROC __glewDepthRangefOES;\r\nGLEW_FUN_EXPORT PFNGLFRUSTUMFOESPROC __glewFrustumfOES;\r\nGLEW_FUN_EXPORT PFNGLGETCLIPPLANEFOESPROC __glewGetClipPlanefOES;\r\nGLEW_FUN_EXPORT PFNGLORTHOFOESPROC __glewOrthofOES;\r\n\r\nGLEW_FUN_EXPORT PFNGLDETAILTEXFUNCSGISPROC __glewDetailTexFuncSGIS;\r\nGLEW_FUN_EXPORT PFNGLGETDETAILTEXFUNCSGISPROC __glewGetDetailTexFuncSGIS;\r\n\r\nGLEW_FUN_EXPORT PFNGLFOGFUNCSGISPROC __glewFogFuncSGIS;\r\nGLEW_FUN_EXPORT PFNGLGETFOGFUNCSGISPROC __glewGetFogFuncSGIS;\r\n\r\nGLEW_FUN_EXPORT PFNGLSAMPLEMASKSGISPROC __glewSampleMaskSGIS;\r\nGLEW_FUN_EXPORT PFNGLSAMPLEPATTERNSGISPROC __glewSamplePatternSGIS;\r\n\r\nGLEW_FUN_EXPORT PFNGLGETSHARPENTEXFUNCSGISPROC __glewGetSharpenTexFuncSGIS;\r\nGLEW_FUN_EXPORT PFNGLSHARPENTEXFUNCSGISPROC __glewSharpenTexFuncSGIS;\r\n\r\nGLEW_FUN_EXPORT PFNGLTEXIMAGE4DSGISPROC __glewTexImage4DSGIS;\r\nGLEW_FUN_EXPORT PFNGLTEXSUBIMAGE4DSGISPROC __glewTexSubImage4DSGIS;\r\n\r\nGLEW_FUN_EXPORT PFNGLGETTEXFILTERFUNCSGISPROC __glewGetTexFilterFuncSGIS;\r\nGLEW_FUN_EXPORT PFNGLTEXFILTERFUNCSGISPROC __glewTexFilterFuncSGIS;\r\n\r\nGLEW_FUN_EXPORT PFNGLASYNCMARKERSGIXPROC __glewAsyncMarkerSGIX;\r\nGLEW_FUN_EXPORT PFNGLDELETEASYNCMARKERSSGIXPROC __glewDeleteAsyncMarkersSGIX;\r\nGLEW_FUN_EXPORT PFNGLFINISHASYNCSGIXPROC __glewFinishAsyncSGIX;\r\nGLEW_FUN_EXPORT PFNGLGENASYNCMARKERSSGIXPROC __glewGenAsyncMarkersSGIX;\r\nGLEW_FUN_EXPORT PFNGLISASYNCMARKERSGIXPROC __glewIsAsyncMarkerSGIX;\r\nGLEW_FUN_EXPORT PFNGLPOLLASYNCSGIXPROC __glewPollAsyncSGIX;\r\n\r\nGLEW_FUN_EXPORT PFNGLFLUSHRASTERSGIXPROC __glewFlushRasterSGIX;\r\n\r\nGLEW_FUN_EXPORT PFNGLTEXTUREFOGSGIXPROC __glewTextureFogSGIX;\r\n\r\nGLEW_FUN_EXPORT PFNGLFRAGMENTCOLORMATERIALSGIXPROC __glewFragmentColorMaterialSGIX;\r\nGLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFSGIXPROC __glewFragmentLightModelfSGIX;\r\nGLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFVSGIXPROC __glewFragmentLightModelfvSGIX;\r\nGLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELISGIXPROC __glewFragmentLightModeliSGIX;\r\nGLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIVSGIXPROC __glewFragmentLightModelivSGIX;\r\nGLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFSGIXPROC __glewFragmentLightfSGIX;\r\nGLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFVSGIXPROC __glewFragmentLightfvSGIX;\r\nGLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTISGIXPROC __glewFragmentLightiSGIX;\r\nGLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIVSGIXPROC __glewFragmentLightivSGIX;\r\nGLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFSGIXPROC __glewFragmentMaterialfSGIX;\r\nGLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFVSGIXPROC __glewFragmentMaterialfvSGIX;\r\nGLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALISGIXPROC __glewFragmentMaterialiSGIX;\r\nGLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIVSGIXPROC __glewFragmentMaterialivSGIX;\r\nGLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTFVSGIXPROC __glewGetFragmentLightfvSGIX;\r\nGLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTIVSGIXPROC __glewGetFragmentLightivSGIX;\r\nGLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALFVSGIXPROC __glewGetFragmentMaterialfvSGIX;\r\nGLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALIVSGIXPROC __glewGetFragmentMaterialivSGIX;\r\n\r\nGLEW_FUN_EXPORT PFNGLFRAMEZOOMSGIXPROC __glewFrameZoomSGIX;\r\n\r\nGLEW_FUN_EXPORT PFNGLPIXELTEXGENSGIXPROC __glewPixelTexGenSGIX;\r\n\r\nGLEW_FUN_EXPORT PFNGLREFERENCEPLANESGIXPROC __glewReferencePlaneSGIX;\r\n\r\nGLEW_FUN_EXPORT PFNGLSPRITEPARAMETERFSGIXPROC __glewSpriteParameterfSGIX;\r\nGLEW_FUN_EXPORT PFNGLSPRITEPARAMETERFVSGIXPROC __glewSpriteParameterfvSGIX;\r\nGLEW_FUN_EXPORT PFNGLSPRITEPARAMETERISGIXPROC __glewSpriteParameteriSGIX;\r\nGLEW_FUN_EXPORT PFNGLSPRITEPARAMETERIVSGIXPROC __glewSpriteParameterivSGIX;\r\n\r\nGLEW_FUN_EXPORT PFNGLTAGSAMPLEBUFFERSGIXPROC __glewTagSampleBufferSGIX;\r\n\r\nGLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERFVSGIPROC __glewColorTableParameterfvSGI;\r\nGLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERIVSGIPROC __glewColorTableParameterivSGI;\r\nGLEW_FUN_EXPORT PFNGLCOLORTABLESGIPROC __glewColorTableSGI;\r\nGLEW_FUN_EXPORT PFNGLCOPYCOLORTABLESGIPROC __glewCopyColorTableSGI;\r\nGLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVSGIPROC __glewGetColorTableParameterfvSGI;\r\nGLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVSGIPROC __glewGetColorTableParameterivSGI;\r\nGLEW_FUN_EXPORT PFNGLGETCOLORTABLESGIPROC __glewGetColorTableSGI;\r\n\r\nGLEW_FUN_EXPORT PFNGLFINISHTEXTURESUNXPROC __glewFinishTextureSUNX;\r\n\r\nGLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORBSUNPROC __glewGlobalAlphaFactorbSUN;\r\nGLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORDSUNPROC __glewGlobalAlphaFactordSUN;\r\nGLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORFSUNPROC __glewGlobalAlphaFactorfSUN;\r\nGLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORISUNPROC __glewGlobalAlphaFactoriSUN;\r\nGLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORSSUNPROC __glewGlobalAlphaFactorsSUN;\r\nGLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUBSUNPROC __glewGlobalAlphaFactorubSUN;\r\nGLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUISUNPROC __glewGlobalAlphaFactoruiSUN;\r\nGLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUSSUNPROC __glewGlobalAlphaFactorusSUN;\r\n\r\nGLEW_FUN_EXPORT PFNGLREADVIDEOPIXELSSUNPROC __glewReadVideoPixelsSUN;\r\n\r\nGLEW_FUN_EXPORT PFNGLREPLACEMENTCODEPOINTERSUNPROC __glewReplacementCodePointerSUN;\r\nGLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUBSUNPROC __glewReplacementCodeubSUN;\r\nGLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUBVSUNPROC __glewReplacementCodeubvSUN;\r\nGLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUISUNPROC __glewReplacementCodeuiSUN;\r\nGLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVSUNPROC __glewReplacementCodeuivSUN;\r\nGLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUSSUNPROC __glewReplacementCodeusSUN;\r\nGLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUSVSUNPROC __glewReplacementCodeusvSUN;\r\n\r\nGLEW_FUN_EXPORT PFNGLCOLOR3FVERTEX3FSUNPROC __glewColor3fVertex3fSUN;\r\nGLEW_FUN_EXPORT PFNGLCOLOR3FVERTEX3FVSUNPROC __glewColor3fVertex3fvSUN;\r\nGLEW_FUN_EXPORT PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewColor4fNormal3fVertex3fSUN;\r\nGLEW_FUN_EXPORT PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewColor4fNormal3fVertex3fvSUN;\r\nGLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX2FSUNPROC __glewColor4ubVertex2fSUN;\r\nGLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX2FVSUNPROC __glewColor4ubVertex2fvSUN;\r\nGLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX3FSUNPROC __glewColor4ubVertex3fSUN;\r\nGLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX3FVSUNPROC __glewColor4ubVertex3fvSUN;\r\nGLEW_FUN_EXPORT PFNGLNORMAL3FVERTEX3FSUNPROC __glewNormal3fVertex3fSUN;\r\nGLEW_FUN_EXPORT PFNGLNORMAL3FVERTEX3FVSUNPROC __glewNormal3fVertex3fvSUN;\r\nGLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC __glewReplacementCodeuiColor3fVertex3fSUN;\r\nGLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor3fVertex3fvSUN;\r\nGLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fSUN;\r\nGLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fvSUN;\r\nGLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC __glewReplacementCodeuiColor4ubVertex3fSUN;\r\nGLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC __glewReplacementCodeuiColor4ubVertex3fvSUN;\r\nGLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiNormal3fVertex3fSUN;\r\nGLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiNormal3fVertex3fvSUN;\r\nGLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN;\r\nGLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN;\r\nGLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN;\r\nGLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN;\r\nGLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fSUN;\r\nGLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fvSUN;\r\nGLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC __glewReplacementCodeuiVertex3fSUN;\r\nGLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC __glewReplacementCodeuiVertex3fvSUN;\r\nGLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC __glewTexCoord2fColor3fVertex3fSUN;\r\nGLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC __glewTexCoord2fColor3fVertex3fvSUN;\r\nGLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fSUN;\r\nGLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fvSUN;\r\nGLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC __glewTexCoord2fColor4ubVertex3fSUN;\r\nGLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC __glewTexCoord2fColor4ubVertex3fvSUN;\r\nGLEW_FUN_EXPORT PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fNormal3fVertex3fSUN;\r\nGLEW_FUN_EXPORT PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fNormal3fVertex3fvSUN;\r\nGLEW_FUN_EXPORT PFNGLTEXCOORD2FVERTEX3FSUNPROC __glewTexCoord2fVertex3fSUN;\r\nGLEW_FUN_EXPORT PFNGLTEXCOORD2FVERTEX3FVSUNPROC __glewTexCoord2fVertex3fvSUN;\r\nGLEW_FUN_EXPORT PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fSUN;\r\nGLEW_FUN_EXPORT PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fvSUN;\r\nGLEW_FUN_EXPORT PFNGLTEXCOORD4FVERTEX4FSUNPROC __glewTexCoord4fVertex4fSUN;\r\nGLEW_FUN_EXPORT PFNGLTEXCOORD4FVERTEX4FVSUNPROC __glewTexCoord4fVertex4fvSUN;\r\n\r\nGLEW_FUN_EXPORT PFNGLADDSWAPHINTRECTWINPROC __glewAddSwapHintRectWIN;\r\n\r\n#if defined(GLEW_MX) && !defined(_WIN32)\r\nstruct GLEWContextStruct\r\n{\r\n#endif /* GLEW_MX */\r\n\r\nGLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_1;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_2;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_3;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_4;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_5;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_VERSION_2_0;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_VERSION_2_1;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_0;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_1;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_2;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_3DFX_multisample;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_3DFX_tbuffer;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_3DFX_texture_compression_FXT1;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_AMD_draw_buffers_blend;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_AMD_performance_monitor;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_AMD_seamless_cubemap_per_texture;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_stencil_export;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_AMD_texture_texture4;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_tessellator;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_APPLE_aux_depth_stencil;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_APPLE_client_storage;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_APPLE_element_array;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_APPLE_fence;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_APPLE_float_pixels;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_APPLE_flush_buffer_range;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_APPLE_object_purgeable;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_APPLE_pixel_buffer;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_APPLE_rgb_422;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_APPLE_row_bytes;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_APPLE_specular_vector;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_range;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_APPLE_transform_hint;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_array_object;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_array_range;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_program_evaluators;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_APPLE_ycbcr_422;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_color_buffer_float;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_compatibility;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_copy_buffer;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_buffer_float;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_clamp;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_texture;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_buffers;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_buffers_blend;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_elements_base_vertex;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_instanced;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_coord_conventions;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_program;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_program_shadow;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_shader;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_framebuffer_object;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_framebuffer_sRGB;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_geometry_shader4;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_half_float_pixel;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_half_float_vertex;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_imaging;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_instanced_arrays;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_map_buffer_range;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_matrix_palette;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_multisample;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_multitexture;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_occlusion_query;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_pixel_buffer_object;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_parameters;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_sprite;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_provoking_vertex;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_sample_shading;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_seamless_cube_map;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_objects;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_texture_lod;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_100;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow_ambient;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_sync;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_border_clamp;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_buffer_object;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression_rgtc;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_cube_map;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_cube_map_array;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_add;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_combine;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_crossbar;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_dot3;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_float;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_gather;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_mirrored_repeat;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_multisample;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_non_power_of_two;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_query_lod;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rectangle;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rg;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_transpose_matrix;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_uniform_buffer_object;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_array_bgra;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_array_object;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_blend;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_buffer_object;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_program;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_shader;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ARB_window_pos;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ATIX_point_sprites;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ATIX_texture_env_combine3;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ATIX_texture_env_route;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ATIX_vertex_shader_output_point_size;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ATI_draw_buffers;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ATI_element_array;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ATI_envmap_bumpmap;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ATI_fragment_shader;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ATI_map_object_buffer;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ATI_meminfo;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ATI_pn_triangles;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ATI_separate_stencil;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ATI_shader_texture_lod;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ATI_text_fragment_shader;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_compression_3dc;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_env_combine3;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_float;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_mirror_once;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_array_object;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_attrib_array_object;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_streams;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_422_pixels;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_Cg_shader;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_abgr;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_bgra;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_bindable_uniform;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_color;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_equation_separate;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_func_separate;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_logic_op;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_minmax;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_subtract;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_clip_volume_hint;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_cmyka;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_color_subtable;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_compiled_vertex_array;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_convolution;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_coordinate_frame;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_copy_texture;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_cull_vertex;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_depth_bounds_test;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_direct_state_access;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_buffers2;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_instanced;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_range_elements;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_fog_coord;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_fragment_lighting;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_blit;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_multisample;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_object;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_sRGB;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_geometry_shader4;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_gpu_program_parameters;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_gpu_shader4;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_histogram;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_array_formats;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_func;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_material;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_texture;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_light_texture;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_misc_attribute;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_multi_draw_arrays;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_multisample;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_depth_stencil;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_float;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_pixels;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_paletted_texture;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_buffer_object;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_transform;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_transform_color_table;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_point_parameters;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_polygon_offset;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_provoking_vertex;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_rescale_normal;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_scene_marker;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_secondary_color;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_separate_shader_objects;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_separate_specular_color;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_shadow_funcs;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_shared_texture_palette;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_clear_tag;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_two_side;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_wrap;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_subtexture;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture3D;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_array;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_buffer_object;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_dxt1;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_latc;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_rgtc;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_s3tc;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_cube_map;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_edge_clamp;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_add;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_combine;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_dot3;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_filter_anisotropic;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_integer;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_lod_bias;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_mirror_clamp;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_object;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_perturb_normal;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_rectangle;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_shared_exponent;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_snorm;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_swizzle;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_timer_query;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_transform_feedback;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_array;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_array_bgra;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_shader;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_weighting;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_GREMEDY_frame_terminator;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_GREMEDY_string_marker;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_HP_convolution_border_modes;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_HP_image_transform;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_HP_occlusion_test;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_HP_texture_lighting;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_IBM_cull_vertex;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_IBM_multimode_draw_arrays;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_IBM_rasterpos_clip;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_IBM_static_data;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_IBM_texture_mirrored_repeat;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_IBM_vertex_array_lists;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_INGR_color_clamp;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_INGR_interlace_read;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_INTEL_parallel_arrays;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_INTEL_texture_scissor;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_KTX_buffer_region;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_MESAX_texture_stack;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_MESA_pack_invert;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_MESA_resize_buffers;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_MESA_window_pos;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_MESA_ycbcr_texture;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_square;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_conditional_render;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_depth_to_color;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_image;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_buffer_float;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_clamp;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_range_unclamped;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_evaluators;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_explicit_multisample;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_fence;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_float_buffer;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_fog_distance;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program2;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program4;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program_option;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_framebuffer_multisample_coverage;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_program4;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_shader4;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program4;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_half_float;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_light_max_exponent;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_multisample_filter_hint;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_occlusion_query;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_packed_depth_stencil;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_parameter_buffer_object;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_parameter_buffer_object2;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_pixel_data_range;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_point_sprite;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_present_video;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_primitive_restart;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners2;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_buffer_load;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_emboss;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_reflection;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_barrier;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_compression_vtc;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_env_combine4;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_expand_normal;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_rectangle;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader2;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader3;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_transform_feedback;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_transform_feedback2;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_array_range;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_array_range2;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_buffer_unified_memory;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program1_1;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program2;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program2_option;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program3;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program4;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_OES_byte_coordinates;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_OES_compressed_paletted_texture;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_OES_read_format;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_OES_single_precision;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_OML_interlace;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_OML_resample;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_OML_subsample;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_PGI_misc_hints;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_PGI_vertex_hints;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_REND_screen_coordinates;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_S3_s3tc;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIS_color_range;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIS_detail_texture;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIS_fog_function;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIS_generate_mipmap;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIS_multisample;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIS_pixel_texture;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIS_point_line_texgen;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIS_sharpen_texture;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture4D;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_border_clamp;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_edge_clamp;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_filter4;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_lod;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_select;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async_histogram;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async_pixel;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIX_blend_alpha_minmax;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIX_clipmap;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIX_convolution_accuracy;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIX_depth_texture;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIX_flush_raster;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_offset;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_texture;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fragment_specular_lighting;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIX_framezoom;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIX_interlace;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ir_instrument1;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIX_list_priority;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture_bits;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIX_reference_plane;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIX_resample;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIX_shadow;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIX_shadow_ambient;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIX_sprite;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIX_tag_sample_buffer;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_add_env;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_coordinate_clamp;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_lod_bias;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_multi_buffer;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_range;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_scale_bias;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_preclip;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_preclip_hint;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ycrcb;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGI_color_matrix;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGI_color_table;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SGI_texture_color_table;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SUNX_constant_data;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SUN_convolution_border_modes;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SUN_global_alpha;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SUN_mesh_array;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SUN_read_video_pixels;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SUN_slice_accum;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SUN_triangle_list;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_SUN_vertex;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_WIN_phong_shading;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_WIN_specular_fog;\r\nGLEW_VAR_EXPORT GLboolean __GLEW_WIN_swap_hint;\r\n\r\n#ifdef GLEW_MX\r\n}; /* GLEWContextStruct */\r\n#endif /* GLEW_MX */\r\n\r\n/* ------------------------------------------------------------------------- */\r\n\r\n/* error codes */\r\n#define GLEW_OK 0\r\n#define GLEW_NO_ERROR 0\r\n#define GLEW_ERROR_NO_GL_VERSION 1  /* missing GL version */\r\n#define GLEW_ERROR_GL_VERSION_10_ONLY 2  /* GL 1.1 and up are not supported */\r\n#define GLEW_ERROR_GLX_VERSION_11_ONLY 3  /* GLX 1.2 and up are not supported */\r\n\r\n/* string codes */\r\n#define GLEW_VERSION 1\r\n#define GLEW_VERSION_MAJOR 2\r\n#define GLEW_VERSION_MINOR 3\r\n#define GLEW_VERSION_MICRO 4\r\n\r\n/* API */\r\n#ifdef GLEW_MX\r\n\r\ntypedef struct GLEWContextStruct GLEWContext;\r\nGLEWAPI GLenum glewContextInit (GLEWContext* ctx);\r\nGLEWAPI GLboolean glewContextIsSupported (GLEWContext* ctx, const char* name);\r\n\r\n#define glewInit() glewContextInit(glewGetContext())\r\n#define glewIsSupported(x) glewContextIsSupported(glewGetContext(), x)\r\n#define glewIsExtensionSupported(x) glewIsSupported(x)\r\n\r\n#define GLEW_GET_VAR(x) (*(const GLboolean*)&(glewGetContext()->x))\r\n#ifdef _WIN32\r\n#  define GLEW_GET_FUN(x) glewGetContext()->x\r\n#else\r\n#  define GLEW_GET_FUN(x) x\r\n#endif\r\n\r\n#else /* GLEW_MX */\r\n\r\nGLEWAPI GLenum glewInit ();\r\nGLEWAPI GLboolean glewIsSupported (const char* name);\r\n#define glewIsExtensionSupported(x) glewIsSupported(x)\r\n\r\n#define GLEW_GET_VAR(x) (*(const GLboolean*)&x)\r\n#define GLEW_GET_FUN(x) x\r\n\r\n#endif /* GLEW_MX */\r\n\r\nGLEWAPI GLboolean glewExperimental;\r\nGLEWAPI GLboolean glewGetExtension (const char* name);\r\nGLEWAPI const GLubyte* glewGetErrorString (GLenum error);\r\nGLEWAPI const GLubyte* glewGetString (GLenum name);\r\n\r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#ifdef GLEW_APIENTRY_DEFINED\r\n#undef GLEW_APIENTRY_DEFINED\r\n#undef APIENTRY\r\n#undef GLAPIENTRY\r\n#define GLAPIENTRY\r\n#endif\r\n\r\n#ifdef GLEW_CALLBACK_DEFINED\r\n#undef GLEW_CALLBACK_DEFINED\r\n#undef CALLBACK\r\n#endif\r\n\r\n#ifdef GLEW_WINGDIAPI_DEFINED\r\n#undef GLEW_WINGDIAPI_DEFINED\r\n#undef WINGDIAPI\r\n#endif\r\n\r\n#undef GLAPI\r\n/* #undef GLEWAPI */\r\n\r\n#endif /* __glew_h__ */\r\n"
  },
  {
    "path": "libs/glew/include/GL/glxew.h",
    "content": "/*\r\n** The OpenGL Extension Wrangler Library\r\n** Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>\r\n** Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>\r\n** Copyright (C) 2002, Lev Povalahev\r\n** All rights reserved.\r\n** \r\n** Redistribution and use in source and binary forms, with or without \r\n** modification, are permitted provided that the following conditions are met:\r\n** \r\n** * Redistributions of source code must retain the above copyright notice, \r\n**   this list of conditions and the following disclaimer.\r\n** * Redistributions in binary form must reproduce the above copyright notice, \r\n**   this list of conditions and the following disclaimer in the documentation \r\n**   and/or other materials provided with the distribution.\r\n** * The name of the author may be used to endorse or promote products \r\n**   derived from this software without specific prior written permission.\r\n**\r\n** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" \r\n** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r\n** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r\n** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE \r\n** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \r\n** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \r\n** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r\n** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r\n** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r\n** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\r\n** THE POSSIBILITY OF SUCH DAMAGE.\r\n*/\r\n\r\n/*\r\n * Mesa 3-D graphics library\r\n * Version:  7.0\r\n *\r\n * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a\r\n * copy of this software and associated documentation files (the \"Software\"),\r\n * to deal in the Software without restriction, including without limitation\r\n * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r\n * and/or sell copies of the Software, and to permit persons to whom the\r\n * Software is furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included\r\n * in all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r\n * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r\n * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN\r\n * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n */\r\n\r\n/*\r\n** Copyright (c) 2007 The Khronos Group Inc.\r\n** \r\n** Permission is hereby granted, free of charge, to any person obtaining a\r\n** copy of this software and/or associated documentation files (the\r\n** \"Materials\"), to deal in the Materials without restriction, including\r\n** without limitation the rights to use, copy, modify, merge, publish,\r\n** distribute, sublicense, and/or sell copies of the Materials, and to\r\n** permit persons to whom the Materials are furnished to do so, subject to\r\n** the following conditions:\r\n** \r\n** The above copyright notice and this permission notice shall be included\r\n** in all copies or substantial portions of the Materials.\r\n** \r\n** THE MATERIALS ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\r\n** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r\n** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\r\n** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\r\n** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\r\n** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\r\n** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.\r\n*/\r\n\r\n#ifndef __glxew_h__\r\n#define __glxew_h__\r\n#define __GLXEW_H__\r\n\r\n#ifdef __glxext_h_\r\n#error glxext.h included before glxew.h\r\n#endif\r\n#ifdef GLX_H\r\n#error glx.h included before glxew.h\r\n#endif\r\n\r\n#define __glxext_h_\r\n#define __GLX_glx_h__\r\n#define GLX_H\r\n\r\n#include <X11/Xlib.h>\r\n#include <X11/Xutil.h>\r\n#include <X11/Xmd.h>\r\n#include <GL/glew.h>\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/* ---------------------------- GLX_VERSION_1_0 --------------------------- */\r\n\r\n#ifndef GLX_VERSION_1_0\r\n#define GLX_VERSION_1_0 1\r\n\r\n#define GLX_USE_GL 1\r\n#define GLX_BUFFER_SIZE 2\r\n#define GLX_LEVEL 3\r\n#define GLX_RGBA 4\r\n#define GLX_DOUBLEBUFFER 5\r\n#define GLX_STEREO 6\r\n#define GLX_AUX_BUFFERS 7\r\n#define GLX_RED_SIZE 8\r\n#define GLX_GREEN_SIZE 9\r\n#define GLX_BLUE_SIZE 10\r\n#define GLX_ALPHA_SIZE 11\r\n#define GLX_DEPTH_SIZE 12\r\n#define GLX_STENCIL_SIZE 13\r\n#define GLX_ACCUM_RED_SIZE 14\r\n#define GLX_ACCUM_GREEN_SIZE 15\r\n#define GLX_ACCUM_BLUE_SIZE 16\r\n#define GLX_ACCUM_ALPHA_SIZE 17\r\n#define GLX_BAD_SCREEN 1\r\n#define GLX_BAD_ATTRIBUTE 2\r\n#define GLX_NO_EXTENSION 3\r\n#define GLX_BAD_VISUAL 4\r\n#define GLX_BAD_CONTEXT 5\r\n#define GLX_BAD_VALUE 6\r\n#define GLX_BAD_ENUM 7\r\n\r\ntypedef XID GLXDrawable;\r\ntypedef XID GLXPixmap;\r\n#ifdef __sun\r\ntypedef struct __glXContextRec *GLXContext;\r\n#else\r\ntypedef struct __GLXcontextRec *GLXContext;\r\n#endif\r\n\r\ntypedef unsigned int GLXVideoDeviceNV; \r\n\r\nextern Bool glXQueryExtension (Display *dpy, int *errorBase, int *eventBase);\r\nextern Bool glXQueryVersion (Display *dpy, int *major, int *minor);\r\nextern int glXGetConfig (Display *dpy, XVisualInfo *vis, int attrib, int *value);\r\nextern XVisualInfo* glXChooseVisual (Display *dpy, int screen, int *attribList);\r\nextern GLXPixmap glXCreateGLXPixmap (Display *dpy, XVisualInfo *vis, Pixmap pixmap);\r\nextern void glXDestroyGLXPixmap (Display *dpy, GLXPixmap pix);\r\nextern GLXContext glXCreateContext (Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct);\r\nextern void glXDestroyContext (Display *dpy, GLXContext ctx);\r\nextern Bool glXIsDirect (Display *dpy, GLXContext ctx);\r\nextern void glXCopyContext (Display *dpy, GLXContext src, GLXContext dst, GLulong mask);\r\nextern Bool glXMakeCurrent (Display *dpy, GLXDrawable drawable, GLXContext ctx);\r\nextern GLXContext glXGetCurrentContext (void);\r\nextern GLXDrawable glXGetCurrentDrawable (void);\r\nextern void glXWaitGL (void);\r\nextern void glXWaitX (void);\r\nextern void glXSwapBuffers (Display *dpy, GLXDrawable drawable);\r\nextern void glXUseXFont (Font font, int first, int count, int listBase);\r\n\r\n#define GLXEW_VERSION_1_0 GLXEW_GET_VAR(__GLXEW_VERSION_1_0)\r\n\r\n#endif /* GLX_VERSION_1_0 */\r\n\r\n/* ---------------------------- GLX_VERSION_1_1 --------------------------- */\r\n\r\n#ifndef GLX_VERSION_1_1\r\n#define GLX_VERSION_1_1\r\n\r\n#define GLX_VENDOR 0x1\r\n#define GLX_VERSION 0x2\r\n#define GLX_EXTENSIONS 0x3\r\n\r\nextern const char* glXQueryExtensionsString (Display *dpy, int screen);\r\nextern const char* glXGetClientString (Display *dpy, int name);\r\nextern const char* glXQueryServerString (Display *dpy, int screen, int name);\r\n\r\n#define GLXEW_VERSION_1_1 GLXEW_GET_VAR(__GLXEW_VERSION_1_1)\r\n\r\n#endif /* GLX_VERSION_1_1 */\r\n\r\n/* ---------------------------- GLX_VERSION_1_2 ---------------------------- */\r\n\r\n#ifndef GLX_VERSION_1_2\r\n#define GLX_VERSION_1_2 1\r\n\r\ntypedef Display* ( * PFNGLXGETCURRENTDISPLAYPROC) (void);\r\n\r\n#define glXGetCurrentDisplay GLXEW_GET_FUN(__glewXGetCurrentDisplay)\r\n\r\n#define GLXEW_VERSION_1_2 GLXEW_GET_VAR(__GLXEW_VERSION_1_2)\r\n\r\n#endif /* GLX_VERSION_1_2 */\r\n\r\n/* ---------------------------- GLX_VERSION_1_3 ---------------------------- */\r\n\r\n#ifndef GLX_VERSION_1_3\r\n#define GLX_VERSION_1_3 1\r\n\r\n#define GLX_RGBA_BIT 0x00000001\r\n#define GLX_FRONT_LEFT_BUFFER_BIT 0x00000001\r\n#define GLX_WINDOW_BIT 0x00000001\r\n#define GLX_COLOR_INDEX_BIT 0x00000002\r\n#define GLX_PIXMAP_BIT 0x00000002\r\n#define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002\r\n#define GLX_BACK_LEFT_BUFFER_BIT 0x00000004\r\n#define GLX_PBUFFER_BIT 0x00000004\r\n#define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008\r\n#define GLX_AUX_BUFFERS_BIT 0x00000010\r\n#define GLX_CONFIG_CAVEAT 0x20\r\n#define GLX_DEPTH_BUFFER_BIT 0x00000020\r\n#define GLX_X_VISUAL_TYPE 0x22\r\n#define GLX_TRANSPARENT_TYPE 0x23\r\n#define GLX_TRANSPARENT_INDEX_VALUE 0x24\r\n#define GLX_TRANSPARENT_RED_VALUE 0x25\r\n#define GLX_TRANSPARENT_GREEN_VALUE 0x26\r\n#define GLX_TRANSPARENT_BLUE_VALUE 0x27\r\n#define GLX_TRANSPARENT_ALPHA_VALUE 0x28\r\n#define GLX_STENCIL_BUFFER_BIT 0x00000040\r\n#define GLX_ACCUM_BUFFER_BIT 0x00000080\r\n#define GLX_NONE 0x8000\r\n#define GLX_SLOW_CONFIG 0x8001\r\n#define GLX_TRUE_COLOR 0x8002\r\n#define GLX_DIRECT_COLOR 0x8003\r\n#define GLX_PSEUDO_COLOR 0x8004\r\n#define GLX_STATIC_COLOR 0x8005\r\n#define GLX_GRAY_SCALE 0x8006\r\n#define GLX_STATIC_GRAY 0x8007\r\n#define GLX_TRANSPARENT_RGB 0x8008\r\n#define GLX_TRANSPARENT_INDEX 0x8009\r\n#define GLX_VISUAL_ID 0x800B\r\n#define GLX_SCREEN 0x800C\r\n#define GLX_NON_CONFORMANT_CONFIG 0x800D\r\n#define GLX_DRAWABLE_TYPE 0x8010\r\n#define GLX_RENDER_TYPE 0x8011\r\n#define GLX_X_RENDERABLE 0x8012\r\n#define GLX_FBCONFIG_ID 0x8013\r\n#define GLX_RGBA_TYPE 0x8014\r\n#define GLX_COLOR_INDEX_TYPE 0x8015\r\n#define GLX_MAX_PBUFFER_WIDTH 0x8016\r\n#define GLX_MAX_PBUFFER_HEIGHT 0x8017\r\n#define GLX_MAX_PBUFFER_PIXELS 0x8018\r\n#define GLX_PRESERVED_CONTENTS 0x801B\r\n#define GLX_LARGEST_PBUFFER 0x801C\r\n#define GLX_WIDTH 0x801D\r\n#define GLX_HEIGHT 0x801E\r\n#define GLX_EVENT_MASK 0x801F\r\n#define GLX_DAMAGED 0x8020\r\n#define GLX_SAVED 0x8021\r\n#define GLX_WINDOW 0x8022\r\n#define GLX_PBUFFER 0x8023\r\n#define GLX_PBUFFER_HEIGHT 0x8040\r\n#define GLX_PBUFFER_WIDTH 0x8041\r\n#define GLX_PBUFFER_CLOBBER_MASK 0x08000000\r\n#define GLX_DONT_CARE 0xFFFFFFFF\r\n\r\ntypedef XID GLXFBConfigID;\r\ntypedef XID GLXWindow;\r\ntypedef XID GLXPbuffer;\r\ntypedef struct __GLXFBConfigRec *GLXFBConfig;\r\n\r\ntypedef struct {\r\n  int event_type; \r\n  int draw_type; \r\n  unsigned long serial; \r\n  Bool send_event; \r\n  Display *display; \r\n  GLXDrawable drawable; \r\n  unsigned int buffer_mask; \r\n  unsigned int aux_buffer; \r\n  int x, y; \r\n  int width, height; \r\n  int count; \r\n} GLXPbufferClobberEvent;\r\ntypedef union __GLXEvent {\r\n  GLXPbufferClobberEvent glxpbufferclobber; \r\n  long pad[24]; \r\n} GLXEvent;\r\n\r\ntypedef GLXFBConfig* ( * PFNGLXCHOOSEFBCONFIGPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements);\r\ntypedef GLXContext ( * PFNGLXCREATENEWCONTEXTPROC) (Display *dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct);\r\ntypedef GLXPbuffer ( * PFNGLXCREATEPBUFFERPROC) (Display *dpy, GLXFBConfig config, const int *attrib_list);\r\ntypedef GLXPixmap ( * PFNGLXCREATEPIXMAPPROC) (Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attrib_list);\r\ntypedef GLXWindow ( * PFNGLXCREATEWINDOWPROC) (Display *dpy, GLXFBConfig config, Window win, const int *attrib_list);\r\ntypedef void ( * PFNGLXDESTROYPBUFFERPROC) (Display *dpy, GLXPbuffer pbuf);\r\ntypedef void ( * PFNGLXDESTROYPIXMAPPROC) (Display *dpy, GLXPixmap pixmap);\r\ntypedef void ( * PFNGLXDESTROYWINDOWPROC) (Display *dpy, GLXWindow win);\r\ntypedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLEPROC) (void);\r\ntypedef int ( * PFNGLXGETFBCONFIGATTRIBPROC) (Display *dpy, GLXFBConfig config, int attribute, int *value);\r\ntypedef GLXFBConfig* ( * PFNGLXGETFBCONFIGSPROC) (Display *dpy, int screen, int *nelements);\r\ntypedef void ( * PFNGLXGETSELECTEDEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long *event_mask);\r\ntypedef XVisualInfo* ( * PFNGLXGETVISUALFROMFBCONFIGPROC) (Display *dpy, GLXFBConfig config);\r\ntypedef Bool ( * PFNGLXMAKECONTEXTCURRENTPROC) (Display *display, GLXDrawable draw, GLXDrawable read, GLXContext ctx);\r\ntypedef int ( * PFNGLXQUERYCONTEXTPROC) (Display *dpy, GLXContext ctx, int attribute, int *value);\r\ntypedef void ( * PFNGLXQUERYDRAWABLEPROC) (Display *dpy, GLXDrawable draw, int attribute, unsigned int *value);\r\ntypedef void ( * PFNGLXSELECTEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long event_mask);\r\n\r\n#define glXChooseFBConfig GLXEW_GET_FUN(__glewXChooseFBConfig)\r\n#define glXCreateNewContext GLXEW_GET_FUN(__glewXCreateNewContext)\r\n#define glXCreatePbuffer GLXEW_GET_FUN(__glewXCreatePbuffer)\r\n#define glXCreatePixmap GLXEW_GET_FUN(__glewXCreatePixmap)\r\n#define glXCreateWindow GLXEW_GET_FUN(__glewXCreateWindow)\r\n#define glXDestroyPbuffer GLXEW_GET_FUN(__glewXDestroyPbuffer)\r\n#define glXDestroyPixmap GLXEW_GET_FUN(__glewXDestroyPixmap)\r\n#define glXDestroyWindow GLXEW_GET_FUN(__glewXDestroyWindow)\r\n#define glXGetCurrentReadDrawable GLXEW_GET_FUN(__glewXGetCurrentReadDrawable)\r\n#define glXGetFBConfigAttrib GLXEW_GET_FUN(__glewXGetFBConfigAttrib)\r\n#define glXGetFBConfigs GLXEW_GET_FUN(__glewXGetFBConfigs)\r\n#define glXGetSelectedEvent GLXEW_GET_FUN(__glewXGetSelectedEvent)\r\n#define glXGetVisualFromFBConfig GLXEW_GET_FUN(__glewXGetVisualFromFBConfig)\r\n#define glXMakeContextCurrent GLXEW_GET_FUN(__glewXMakeContextCurrent)\r\n#define glXQueryContext GLXEW_GET_FUN(__glewXQueryContext)\r\n#define glXQueryDrawable GLXEW_GET_FUN(__glewXQueryDrawable)\r\n#define glXSelectEvent GLXEW_GET_FUN(__glewXSelectEvent)\r\n\r\n#define GLXEW_VERSION_1_3 GLXEW_GET_VAR(__GLXEW_VERSION_1_3)\r\n\r\n#endif /* GLX_VERSION_1_3 */\r\n\r\n/* ---------------------------- GLX_VERSION_1_4 ---------------------------- */\r\n\r\n#ifndef GLX_VERSION_1_4\r\n#define GLX_VERSION_1_4 1\r\n\r\n#define GLX_SAMPLE_BUFFERS 100000\r\n#define GLX_SAMPLES 100001\r\n\r\nextern void ( * glXGetProcAddress (const GLubyte *procName)) (void);\r\n\r\n#define GLXEW_VERSION_1_4 GLXEW_GET_VAR(__GLXEW_VERSION_1_4)\r\n\r\n#endif /* GLX_VERSION_1_4 */\r\n\r\n/* -------------------------- GLX_3DFX_multisample ------------------------- */\r\n\r\n#ifndef GLX_3DFX_multisample\r\n#define GLX_3DFX_multisample 1\r\n\r\n#define GLX_SAMPLE_BUFFERS_3DFX 0x8050\r\n#define GLX_SAMPLES_3DFX 0x8051\r\n\r\n#define GLXEW_3DFX_multisample GLXEW_GET_VAR(__GLXEW_3DFX_multisample)\r\n\r\n#endif /* GLX_3DFX_multisample */\r\n\r\n/* ------------------------- GLX_ARB_create_context ------------------------ */\r\n\r\n#ifndef GLX_ARB_create_context\r\n#define GLX_ARB_create_context 1\r\n\r\n#define GLX_CONTEXT_DEBUG_BIT_ARB 0x0001\r\n#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002\r\n#define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091\r\n#define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092\r\n#define GLX_CONTEXT_FLAGS_ARB 0x2094\r\n\r\ntypedef GLXContext ( * PFNGLXCREATECONTEXTATTRIBSARBPROC) (Display* dpy, GLXFBConfig config, GLXContext share_context, Bool direct, const int *attrib_list);\r\n\r\n#define glXCreateContextAttribsARB GLXEW_GET_FUN(__glewXCreateContextAttribsARB)\r\n\r\n#define GLXEW_ARB_create_context GLXEW_GET_VAR(__GLXEW_ARB_create_context)\r\n\r\n#endif /* GLX_ARB_create_context */\r\n\r\n/* --------------------- GLX_ARB_create_context_profile -------------------- */\r\n\r\n#ifndef GLX_ARB_create_context_profile\r\n#define GLX_ARB_create_context_profile 1\r\n\r\n#define GLX_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001\r\n#define GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002\r\n#define GLX_CONTEXT_PROFILE_MASK_ARB 0x9126\r\n\r\n#define GLXEW_ARB_create_context_profile GLXEW_GET_VAR(__GLXEW_ARB_create_context_profile)\r\n\r\n#endif /* GLX_ARB_create_context_profile */\r\n\r\n/* ------------------------- GLX_ARB_fbconfig_float ------------------------ */\r\n\r\n#ifndef GLX_ARB_fbconfig_float\r\n#define GLX_ARB_fbconfig_float 1\r\n\r\n#define GLX_RGBA_FLOAT_BIT 0x00000004\r\n#define GLX_RGBA_FLOAT_TYPE 0x20B9\r\n\r\n#define GLXEW_ARB_fbconfig_float GLXEW_GET_VAR(__GLXEW_ARB_fbconfig_float)\r\n\r\n#endif /* GLX_ARB_fbconfig_float */\r\n\r\n/* ------------------------ GLX_ARB_framebuffer_sRGB ----------------------- */\r\n\r\n#ifndef GLX_ARB_framebuffer_sRGB\r\n#define GLX_ARB_framebuffer_sRGB 1\r\n\r\n#define GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20B2\r\n\r\n#define GLXEW_ARB_framebuffer_sRGB GLXEW_GET_VAR(__GLXEW_ARB_framebuffer_sRGB)\r\n\r\n#endif /* GLX_ARB_framebuffer_sRGB */\r\n\r\n/* ------------------------ GLX_ARB_get_proc_address ----------------------- */\r\n\r\n#ifndef GLX_ARB_get_proc_address\r\n#define GLX_ARB_get_proc_address 1\r\n\r\nextern void ( * glXGetProcAddressARB (const GLubyte *procName)) (void);\r\n\r\n#define GLXEW_ARB_get_proc_address GLXEW_GET_VAR(__GLXEW_ARB_get_proc_address)\r\n\r\n#endif /* GLX_ARB_get_proc_address */\r\n\r\n/* -------------------------- GLX_ARB_multisample -------------------------- */\r\n\r\n#ifndef GLX_ARB_multisample\r\n#define GLX_ARB_multisample 1\r\n\r\n#define GLX_SAMPLE_BUFFERS_ARB 100000\r\n#define GLX_SAMPLES_ARB 100001\r\n\r\n#define GLXEW_ARB_multisample GLXEW_GET_VAR(__GLXEW_ARB_multisample)\r\n\r\n#endif /* GLX_ARB_multisample */\r\n\r\n/* ----------------------- GLX_ATI_pixel_format_float ---------------------- */\r\n\r\n#ifndef GLX_ATI_pixel_format_float\r\n#define GLX_ATI_pixel_format_float 1\r\n\r\n#define GLX_RGBA_FLOAT_ATI_BIT 0x00000100\r\n\r\n#define GLXEW_ATI_pixel_format_float GLXEW_GET_VAR(__GLXEW_ATI_pixel_format_float)\r\n\r\n#endif /* GLX_ATI_pixel_format_float */\r\n\r\n/* ------------------------- GLX_ATI_render_texture ------------------------ */\r\n\r\n#ifndef GLX_ATI_render_texture\r\n#define GLX_ATI_render_texture 1\r\n\r\n#define GLX_BIND_TO_TEXTURE_RGB_ATI 0x9800\r\n#define GLX_BIND_TO_TEXTURE_RGBA_ATI 0x9801\r\n#define GLX_TEXTURE_FORMAT_ATI 0x9802\r\n#define GLX_TEXTURE_TARGET_ATI 0x9803\r\n#define GLX_MIPMAP_TEXTURE_ATI 0x9804\r\n#define GLX_TEXTURE_RGB_ATI 0x9805\r\n#define GLX_TEXTURE_RGBA_ATI 0x9806\r\n#define GLX_NO_TEXTURE_ATI 0x9807\r\n#define GLX_TEXTURE_CUBE_MAP_ATI 0x9808\r\n#define GLX_TEXTURE_1D_ATI 0x9809\r\n#define GLX_TEXTURE_2D_ATI 0x980A\r\n#define GLX_MIPMAP_LEVEL_ATI 0x980B\r\n#define GLX_CUBE_MAP_FACE_ATI 0x980C\r\n#define GLX_TEXTURE_CUBE_MAP_POSITIVE_X_ATI 0x980D\r\n#define GLX_TEXTURE_CUBE_MAP_NEGATIVE_X_ATI 0x980E\r\n#define GLX_TEXTURE_CUBE_MAP_POSITIVE_Y_ATI 0x980F\r\n#define GLX_TEXTURE_CUBE_MAP_NEGATIVE_Y_ATI 0x9810\r\n#define GLX_TEXTURE_CUBE_MAP_POSITIVE_Z_ATI 0x9811\r\n#define GLX_TEXTURE_CUBE_MAP_NEGATIVE_Z_ATI 0x9812\r\n#define GLX_FRONT_LEFT_ATI 0x9813\r\n#define GLX_FRONT_RIGHT_ATI 0x9814\r\n#define GLX_BACK_LEFT_ATI 0x9815\r\n#define GLX_BACK_RIGHT_ATI 0x9816\r\n#define GLX_AUX0_ATI 0x9817\r\n#define GLX_AUX1_ATI 0x9818\r\n#define GLX_AUX2_ATI 0x9819\r\n#define GLX_AUX3_ATI 0x981A\r\n#define GLX_AUX4_ATI 0x981B\r\n#define GLX_AUX5_ATI 0x981C\r\n#define GLX_AUX6_ATI 0x981D\r\n#define GLX_AUX7_ATI 0x981E\r\n#define GLX_AUX8_ATI 0x981F\r\n#define GLX_AUX9_ATI 0x9820\r\n#define GLX_BIND_TO_TEXTURE_LUMINANCE_ATI 0x9821\r\n#define GLX_BIND_TO_TEXTURE_INTENSITY_ATI 0x9822\r\n\r\ntypedef void ( * PFNGLXBINDTEXIMAGEATIPROC) (Display *dpy, GLXPbuffer pbuf, int buffer);\r\ntypedef void ( * PFNGLXDRAWABLEATTRIBATIPROC) (Display *dpy, GLXDrawable draw, const int *attrib_list);\r\ntypedef void ( * PFNGLXRELEASETEXIMAGEATIPROC) (Display *dpy, GLXPbuffer pbuf, int buffer);\r\n\r\n#define glXBindTexImageATI GLXEW_GET_FUN(__glewXBindTexImageATI)\r\n#define glXDrawableAttribATI GLXEW_GET_FUN(__glewXDrawableAttribATI)\r\n#define glXReleaseTexImageATI GLXEW_GET_FUN(__glewXReleaseTexImageATI)\r\n\r\n#define GLXEW_ATI_render_texture GLXEW_GET_VAR(__GLXEW_ATI_render_texture)\r\n\r\n#endif /* GLX_ATI_render_texture */\r\n\r\n/* --------------------- GLX_EXT_fbconfig_packed_float --------------------- */\r\n\r\n#ifndef GLX_EXT_fbconfig_packed_float\r\n#define GLX_EXT_fbconfig_packed_float 1\r\n\r\n#define GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT 0x00000008\r\n#define GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT 0x20B1\r\n\r\n#define GLXEW_EXT_fbconfig_packed_float GLXEW_GET_VAR(__GLXEW_EXT_fbconfig_packed_float)\r\n\r\n#endif /* GLX_EXT_fbconfig_packed_float */\r\n\r\n/* ------------------------ GLX_EXT_framebuffer_sRGB ----------------------- */\r\n\r\n#ifndef GLX_EXT_framebuffer_sRGB\r\n#define GLX_EXT_framebuffer_sRGB 1\r\n\r\n#define GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20B2\r\n\r\n#define GLXEW_EXT_framebuffer_sRGB GLXEW_GET_VAR(__GLXEW_EXT_framebuffer_sRGB)\r\n\r\n#endif /* GLX_EXT_framebuffer_sRGB */\r\n\r\n/* ------------------------- GLX_EXT_import_context ------------------------ */\r\n\r\n#ifndef GLX_EXT_import_context\r\n#define GLX_EXT_import_context 1\r\n\r\n#define GLX_SHARE_CONTEXT_EXT 0x800A\r\n#define GLX_VISUAL_ID_EXT 0x800B\r\n#define GLX_SCREEN_EXT 0x800C\r\n\r\ntypedef XID GLXContextID;\r\n\r\ntypedef void ( * PFNGLXFREECONTEXTEXTPROC) (Display* dpy, GLXContext context);\r\ntypedef GLXContextID ( * PFNGLXGETCONTEXTIDEXTPROC) (const GLXContext context);\r\ntypedef GLXContext ( * PFNGLXIMPORTCONTEXTEXTPROC) (Display* dpy, GLXContextID contextID);\r\ntypedef int ( * PFNGLXQUERYCONTEXTINFOEXTPROC) (Display* dpy, GLXContext context, int attribute,int *value);\r\n\r\n#define glXFreeContextEXT GLXEW_GET_FUN(__glewXFreeContextEXT)\r\n#define glXGetContextIDEXT GLXEW_GET_FUN(__glewXGetContextIDEXT)\r\n#define glXImportContextEXT GLXEW_GET_FUN(__glewXImportContextEXT)\r\n#define glXQueryContextInfoEXT GLXEW_GET_FUN(__glewXQueryContextInfoEXT)\r\n\r\n#define GLXEW_EXT_import_context GLXEW_GET_VAR(__GLXEW_EXT_import_context)\r\n\r\n#endif /* GLX_EXT_import_context */\r\n\r\n/* -------------------------- GLX_EXT_scene_marker ------------------------- */\r\n\r\n#ifndef GLX_EXT_scene_marker\r\n#define GLX_EXT_scene_marker 1\r\n\r\n#define GLXEW_EXT_scene_marker GLXEW_GET_VAR(__GLXEW_EXT_scene_marker)\r\n\r\n#endif /* GLX_EXT_scene_marker */\r\n\r\n/* -------------------------- GLX_EXT_swap_control ------------------------- */\r\n\r\n#ifndef GLX_EXT_swap_control\r\n#define GLX_EXT_swap_control 1\r\n\r\n#define GLX_SWAP_INTERVAL_EXT 0x20F1\r\n#define GLX_MAX_SWAP_INTERVAL_EXT 0x20F2\r\n\r\ntypedef void ( * PFNGLXSWAPINTERVALEXTPROC) (Display* dpy, GLXDrawable drawable, int interval);\r\n\r\n#define glXSwapIntervalEXT GLXEW_GET_FUN(__glewXSwapIntervalEXT)\r\n\r\n#define GLXEW_EXT_swap_control GLXEW_GET_VAR(__GLXEW_EXT_swap_control)\r\n\r\n#endif /* GLX_EXT_swap_control */\r\n\r\n/* ---------------------- GLX_EXT_texture_from_pixmap ---------------------- */\r\n\r\n#ifndef GLX_EXT_texture_from_pixmap\r\n#define GLX_EXT_texture_from_pixmap 1\r\n\r\n#define GLX_TEXTURE_1D_BIT_EXT 0x00000001\r\n#define GLX_TEXTURE_2D_BIT_EXT 0x00000002\r\n#define GLX_TEXTURE_RECTANGLE_BIT_EXT 0x00000004\r\n#define GLX_BIND_TO_TEXTURE_RGB_EXT 0x20D0\r\n#define GLX_BIND_TO_TEXTURE_RGBA_EXT 0x20D1\r\n#define GLX_BIND_TO_MIPMAP_TEXTURE_EXT 0x20D2\r\n#define GLX_BIND_TO_TEXTURE_TARGETS_EXT 0x20D3\r\n#define GLX_Y_INVERTED_EXT 0x20D4\r\n#define GLX_TEXTURE_FORMAT_EXT 0x20D5\r\n#define GLX_TEXTURE_TARGET_EXT 0x20D6\r\n#define GLX_MIPMAP_TEXTURE_EXT 0x20D7\r\n#define GLX_TEXTURE_FORMAT_NONE_EXT 0x20D8\r\n#define GLX_TEXTURE_FORMAT_RGB_EXT 0x20D9\r\n#define GLX_TEXTURE_FORMAT_RGBA_EXT 0x20DA\r\n#define GLX_TEXTURE_1D_EXT 0x20DB\r\n#define GLX_TEXTURE_2D_EXT 0x20DC\r\n#define GLX_TEXTURE_RECTANGLE_EXT 0x20DD\r\n#define GLX_FRONT_LEFT_EXT 0x20DE\r\n#define GLX_FRONT_RIGHT_EXT 0x20DF\r\n#define GLX_BACK_LEFT_EXT 0x20E0\r\n#define GLX_BACK_RIGHT_EXT 0x20E1\r\n#define GLX_AUX0_EXT 0x20E2\r\n#define GLX_AUX1_EXT 0x20E3\r\n#define GLX_AUX2_EXT 0x20E4\r\n#define GLX_AUX3_EXT 0x20E5\r\n#define GLX_AUX4_EXT 0x20E6\r\n#define GLX_AUX5_EXT 0x20E7\r\n#define GLX_AUX6_EXT 0x20E8\r\n#define GLX_AUX7_EXT 0x20E9\r\n#define GLX_AUX8_EXT 0x20EA\r\n#define GLX_AUX9_EXT 0x20EB\r\n\r\ntypedef void ( * PFNGLXBINDTEXIMAGEEXTPROC) (Display* display, GLXDrawable drawable, int buffer, const int *attrib_list);\r\ntypedef void ( * PFNGLXRELEASETEXIMAGEEXTPROC) (Display* display, GLXDrawable drawable, int buffer);\r\n\r\n#define glXBindTexImageEXT GLXEW_GET_FUN(__glewXBindTexImageEXT)\r\n#define glXReleaseTexImageEXT GLXEW_GET_FUN(__glewXReleaseTexImageEXT)\r\n\r\n#define GLXEW_EXT_texture_from_pixmap GLXEW_GET_VAR(__GLXEW_EXT_texture_from_pixmap)\r\n\r\n#endif /* GLX_EXT_texture_from_pixmap */\r\n\r\n/* -------------------------- GLX_EXT_visual_info -------------------------- */\r\n\r\n#ifndef GLX_EXT_visual_info\r\n#define GLX_EXT_visual_info 1\r\n\r\n#define GLX_X_VISUAL_TYPE_EXT 0x22\r\n#define GLX_TRANSPARENT_TYPE_EXT 0x23\r\n#define GLX_TRANSPARENT_INDEX_VALUE_EXT 0x24\r\n#define GLX_TRANSPARENT_RED_VALUE_EXT 0x25\r\n#define GLX_TRANSPARENT_GREEN_VALUE_EXT 0x26\r\n#define GLX_TRANSPARENT_BLUE_VALUE_EXT 0x27\r\n#define GLX_TRANSPARENT_ALPHA_VALUE_EXT 0x28\r\n#define GLX_NONE_EXT 0x8000\r\n#define GLX_TRUE_COLOR_EXT 0x8002\r\n#define GLX_DIRECT_COLOR_EXT 0x8003\r\n#define GLX_PSEUDO_COLOR_EXT 0x8004\r\n#define GLX_STATIC_COLOR_EXT 0x8005\r\n#define GLX_GRAY_SCALE_EXT 0x8006\r\n#define GLX_STATIC_GRAY_EXT 0x8007\r\n#define GLX_TRANSPARENT_RGB_EXT 0x8008\r\n#define GLX_TRANSPARENT_INDEX_EXT 0x8009\r\n\r\n#define GLXEW_EXT_visual_info GLXEW_GET_VAR(__GLXEW_EXT_visual_info)\r\n\r\n#endif /* GLX_EXT_visual_info */\r\n\r\n/* ------------------------- GLX_EXT_visual_rating ------------------------- */\r\n\r\n#ifndef GLX_EXT_visual_rating\r\n#define GLX_EXT_visual_rating 1\r\n\r\n#define GLX_VISUAL_CAVEAT_EXT 0x20\r\n#define GLX_SLOW_VISUAL_EXT 0x8001\r\n#define GLX_NON_CONFORMANT_VISUAL_EXT 0x800D\r\n\r\n#define GLXEW_EXT_visual_rating GLXEW_GET_VAR(__GLXEW_EXT_visual_rating)\r\n\r\n#endif /* GLX_EXT_visual_rating */\r\n\r\n/* -------------------------- GLX_INTEL_swap_event ------------------------- */\r\n\r\n#ifndef GLX_INTEL_swap_event\r\n#define GLX_INTEL_swap_event 1\r\n\r\n#define GLX_EXCHANGE_COMPLETE_INTEL 0x8180\r\n#define GLX_COPY_COMPLETE_INTEL 0x8181\r\n#define GLX_FLIP_COMPLETE_INTEL 0x8182\r\n#define GLX_BUFFER_SWAP_COMPLETE_INTEL_MASK 0x04000000\r\n\r\n#define GLXEW_INTEL_swap_event GLXEW_GET_VAR(__GLXEW_INTEL_swap_event)\r\n\r\n#endif /* GLX_INTEL_swap_event */\r\n\r\n/* -------------------------- GLX_MESA_agp_offset -------------------------- */\r\n\r\n#ifndef GLX_MESA_agp_offset\r\n#define GLX_MESA_agp_offset 1\r\n\r\ntypedef unsigned int ( * PFNGLXGETAGPOFFSETMESAPROC) (const void* pointer);\r\n\r\n#define glXGetAGPOffsetMESA GLXEW_GET_FUN(__glewXGetAGPOffsetMESA)\r\n\r\n#define GLXEW_MESA_agp_offset GLXEW_GET_VAR(__GLXEW_MESA_agp_offset)\r\n\r\n#endif /* GLX_MESA_agp_offset */\r\n\r\n/* ------------------------ GLX_MESA_copy_sub_buffer ----------------------- */\r\n\r\n#ifndef GLX_MESA_copy_sub_buffer\r\n#define GLX_MESA_copy_sub_buffer 1\r\n\r\ntypedef void ( * PFNGLXCOPYSUBBUFFERMESAPROC) (Display* dpy, GLXDrawable drawable, int x, int y, int width, int height);\r\n\r\n#define glXCopySubBufferMESA GLXEW_GET_FUN(__glewXCopySubBufferMESA)\r\n\r\n#define GLXEW_MESA_copy_sub_buffer GLXEW_GET_VAR(__GLXEW_MESA_copy_sub_buffer)\r\n\r\n#endif /* GLX_MESA_copy_sub_buffer */\r\n\r\n/* ------------------------ GLX_MESA_pixmap_colormap ----------------------- */\r\n\r\n#ifndef GLX_MESA_pixmap_colormap\r\n#define GLX_MESA_pixmap_colormap 1\r\n\r\ntypedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPMESAPROC) (Display* dpy, XVisualInfo *visual, Pixmap pixmap, Colormap cmap);\r\n\r\n#define glXCreateGLXPixmapMESA GLXEW_GET_FUN(__glewXCreateGLXPixmapMESA)\r\n\r\n#define GLXEW_MESA_pixmap_colormap GLXEW_GET_VAR(__GLXEW_MESA_pixmap_colormap)\r\n\r\n#endif /* GLX_MESA_pixmap_colormap */\r\n\r\n/* ------------------------ GLX_MESA_release_buffers ----------------------- */\r\n\r\n#ifndef GLX_MESA_release_buffers\r\n#define GLX_MESA_release_buffers 1\r\n\r\ntypedef Bool ( * PFNGLXRELEASEBUFFERSMESAPROC) (Display* dpy, GLXDrawable d);\r\n\r\n#define glXReleaseBuffersMESA GLXEW_GET_FUN(__glewXReleaseBuffersMESA)\r\n\r\n#define GLXEW_MESA_release_buffers GLXEW_GET_VAR(__GLXEW_MESA_release_buffers)\r\n\r\n#endif /* GLX_MESA_release_buffers */\r\n\r\n/* ------------------------- GLX_MESA_set_3dfx_mode ------------------------ */\r\n\r\n#ifndef GLX_MESA_set_3dfx_mode\r\n#define GLX_MESA_set_3dfx_mode 1\r\n\r\n#define GLX_3DFX_WINDOW_MODE_MESA 0x1\r\n#define GLX_3DFX_FULLSCREEN_MODE_MESA 0x2\r\n\r\ntypedef GLboolean ( * PFNGLXSET3DFXMODEMESAPROC) (GLint mode);\r\n\r\n#define glXSet3DfxModeMESA GLXEW_GET_FUN(__glewXSet3DfxModeMESA)\r\n\r\n#define GLXEW_MESA_set_3dfx_mode GLXEW_GET_VAR(__GLXEW_MESA_set_3dfx_mode)\r\n\r\n#endif /* GLX_MESA_set_3dfx_mode */\r\n\r\n/* --------------------------- GLX_NV_copy_image --------------------------- */\r\n\r\n#ifndef GLX_NV_copy_image\r\n#define GLX_NV_copy_image 1\r\n\r\ntypedef void ( * PFNGLXCOPYIMAGESUBDATANVPROC) (Display *dpy, GLXContext srcCtx, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLXContext dstCtx, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth);\r\n\r\n#define glXCopyImageSubDataNV GLXEW_GET_FUN(__glewXCopyImageSubDataNV)\r\n\r\n#define GLXEW_NV_copy_image GLXEW_GET_VAR(__GLXEW_NV_copy_image)\r\n\r\n#endif /* GLX_NV_copy_image */\r\n\r\n/* -------------------------- GLX_NV_float_buffer -------------------------- */\r\n\r\n#ifndef GLX_NV_float_buffer\r\n#define GLX_NV_float_buffer 1\r\n\r\n#define GLX_FLOAT_COMPONENTS_NV 0x20B0\r\n\r\n#define GLXEW_NV_float_buffer GLXEW_GET_VAR(__GLXEW_NV_float_buffer)\r\n\r\n#endif /* GLX_NV_float_buffer */\r\n\r\n/* -------------------------- GLX_NV_present_video ------------------------- */\r\n\r\n#ifndef GLX_NV_present_video\r\n#define GLX_NV_present_video 1\r\n\r\n#define GLX_NUM_VIDEO_SLOTS_NV 0x20F0\r\n\r\ntypedef int ( * PFNGLXBINDVIDEODEVICENVPROC) (Display* dpy, unsigned int video_slot, unsigned int video_device, const int *attrib_list);\r\ntypedef unsigned int* ( * PFNGLXENUMERATEVIDEODEVICESNVPROC) (Display *dpy, int screen, int *nelements);\r\n\r\n#define glXBindVideoDeviceNV GLXEW_GET_FUN(__glewXBindVideoDeviceNV)\r\n#define glXEnumerateVideoDevicesNV GLXEW_GET_FUN(__glewXEnumerateVideoDevicesNV)\r\n\r\n#define GLXEW_NV_present_video GLXEW_GET_VAR(__GLXEW_NV_present_video)\r\n\r\n#endif /* GLX_NV_present_video */\r\n\r\n/* --------------------------- GLX_NV_swap_group --------------------------- */\r\n\r\n#ifndef GLX_NV_swap_group\r\n#define GLX_NV_swap_group 1\r\n\r\ntypedef Bool ( * PFNGLXBINDSWAPBARRIERNVPROC) (Display* dpy, GLuint group, GLuint barrier);\r\ntypedef Bool ( * PFNGLXJOINSWAPGROUPNVPROC) (Display* dpy, GLXDrawable drawable, GLuint group);\r\ntypedef Bool ( * PFNGLXQUERYFRAMECOUNTNVPROC) (Display* dpy, int screen, GLuint *count);\r\ntypedef Bool ( * PFNGLXQUERYMAXSWAPGROUPSNVPROC) (Display* dpy, int screen, GLuint *maxGroups, GLuint *maxBarriers);\r\ntypedef Bool ( * PFNGLXQUERYSWAPGROUPNVPROC) (Display* dpy, GLXDrawable drawable, GLuint *group, GLuint *barrier);\r\ntypedef Bool ( * PFNGLXRESETFRAMECOUNTNVPROC) (Display* dpy, int screen);\r\n\r\n#define glXBindSwapBarrierNV GLXEW_GET_FUN(__glewXBindSwapBarrierNV)\r\n#define glXJoinSwapGroupNV GLXEW_GET_FUN(__glewXJoinSwapGroupNV)\r\n#define glXQueryFrameCountNV GLXEW_GET_FUN(__glewXQueryFrameCountNV)\r\n#define glXQueryMaxSwapGroupsNV GLXEW_GET_FUN(__glewXQueryMaxSwapGroupsNV)\r\n#define glXQuerySwapGroupNV GLXEW_GET_FUN(__glewXQuerySwapGroupNV)\r\n#define glXResetFrameCountNV GLXEW_GET_FUN(__glewXResetFrameCountNV)\r\n\r\n#define GLXEW_NV_swap_group GLXEW_GET_VAR(__GLXEW_NV_swap_group)\r\n\r\n#endif /* GLX_NV_swap_group */\r\n\r\n/* ----------------------- GLX_NV_vertex_array_range ----------------------- */\r\n\r\n#ifndef GLX_NV_vertex_array_range\r\n#define GLX_NV_vertex_array_range 1\r\n\r\ntypedef void * ( * PFNGLXALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority);\r\ntypedef void ( * PFNGLXFREEMEMORYNVPROC) (void *pointer);\r\n\r\n#define glXAllocateMemoryNV GLXEW_GET_FUN(__glewXAllocateMemoryNV)\r\n#define glXFreeMemoryNV GLXEW_GET_FUN(__glewXFreeMemoryNV)\r\n\r\n#define GLXEW_NV_vertex_array_range GLXEW_GET_VAR(__GLXEW_NV_vertex_array_range)\r\n\r\n#endif /* GLX_NV_vertex_array_range */\r\n\r\n/* -------------------------- GLX_NV_video_output -------------------------- */\r\n\r\n#ifndef GLX_NV_video_output\r\n#define GLX_NV_video_output 1\r\n\r\n#define GLX_VIDEO_OUT_COLOR_NV 0x20C3\r\n#define GLX_VIDEO_OUT_ALPHA_NV 0x20C4\r\n#define GLX_VIDEO_OUT_DEPTH_NV 0x20C5\r\n#define GLX_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6\r\n#define GLX_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7\r\n#define GLX_VIDEO_OUT_FRAME_NV 0x20C8\r\n#define GLX_VIDEO_OUT_FIELD_1_NV 0x20C9\r\n#define GLX_VIDEO_OUT_FIELD_2_NV 0x20CA\r\n#define GLX_VIDEO_OUT_STACKED_FIELDS_1_2_NV 0x20CB\r\n#define GLX_VIDEO_OUT_STACKED_FIELDS_2_1_NV 0x20CC\r\n\r\ntypedef int ( * PFNGLXBINDVIDEOIMAGENVPROC) (Display* dpy, GLXVideoDeviceNV VideoDevice, GLXPbuffer pbuf, int iVideoBuffer);\r\ntypedef int ( * PFNGLXGETVIDEODEVICENVPROC) (Display* dpy, int screen, int numVideoDevices, GLXVideoDeviceNV *pVideoDevice);\r\ntypedef int ( * PFNGLXGETVIDEOINFONVPROC) (Display* dpy, int screen, GLXVideoDeviceNV VideoDevice, unsigned long *pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo);\r\ntypedef int ( * PFNGLXRELEASEVIDEODEVICENVPROC) (Display* dpy, int screen, GLXVideoDeviceNV VideoDevice);\r\ntypedef int ( * PFNGLXRELEASEVIDEOIMAGENVPROC) (Display* dpy, GLXPbuffer pbuf);\r\ntypedef int ( * PFNGLXSENDPBUFFERTOVIDEONVPROC) (Display* dpy, GLXPbuffer pbuf, int iBufferType, unsigned long *pulCounterPbuffer, GLboolean bBlock);\r\n\r\n#define glXBindVideoImageNV GLXEW_GET_FUN(__glewXBindVideoImageNV)\r\n#define glXGetVideoDeviceNV GLXEW_GET_FUN(__glewXGetVideoDeviceNV)\r\n#define glXGetVideoInfoNV GLXEW_GET_FUN(__glewXGetVideoInfoNV)\r\n#define glXReleaseVideoDeviceNV GLXEW_GET_FUN(__glewXReleaseVideoDeviceNV)\r\n#define glXReleaseVideoImageNV GLXEW_GET_FUN(__glewXReleaseVideoImageNV)\r\n#define glXSendPbufferToVideoNV GLXEW_GET_FUN(__glewXSendPbufferToVideoNV)\r\n\r\n#define GLXEW_NV_video_output GLXEW_GET_VAR(__GLXEW_NV_video_output)\r\n\r\n#endif /* GLX_NV_video_output */\r\n\r\n/* -------------------------- GLX_OML_swap_method -------------------------- */\r\n\r\n#ifndef GLX_OML_swap_method\r\n#define GLX_OML_swap_method 1\r\n\r\n#define GLX_SWAP_METHOD_OML 0x8060\r\n#define GLX_SWAP_EXCHANGE_OML 0x8061\r\n#define GLX_SWAP_COPY_OML 0x8062\r\n#define GLX_SWAP_UNDEFINED_OML 0x8063\r\n\r\n#define GLXEW_OML_swap_method GLXEW_GET_VAR(__GLXEW_OML_swap_method)\r\n\r\n#endif /* GLX_OML_swap_method */\r\n\r\n/* -------------------------- GLX_OML_sync_control ------------------------- */\r\n\r\n#if !defined(GLX_OML_sync_control) && defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)\r\n#include <inttypes.h>\r\n#define GLX_OML_sync_control 1\r\n\r\ntypedef Bool ( * PFNGLXGETMSCRATEOMLPROC) (Display* dpy, GLXDrawable drawable, int32_t* numerator, int32_t* denominator);\r\ntypedef Bool ( * PFNGLXGETSYNCVALUESOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t* ust, int64_t* msc, int64_t* sbc);\r\ntypedef int64_t ( * PFNGLXSWAPBUFFERSMSCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder);\r\ntypedef Bool ( * PFNGLXWAITFORMSCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder, int64_t* ust, int64_t* msc, int64_t* sbc);\r\ntypedef Bool ( * PFNGLXWAITFORSBCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_sbc, int64_t* ust, int64_t* msc, int64_t* sbc);\r\n\r\n#define glXGetMscRateOML GLXEW_GET_FUN(__glewXGetMscRateOML)\r\n#define glXGetSyncValuesOML GLXEW_GET_FUN(__glewXGetSyncValuesOML)\r\n#define glXSwapBuffersMscOML GLXEW_GET_FUN(__glewXSwapBuffersMscOML)\r\n#define glXWaitForMscOML GLXEW_GET_FUN(__glewXWaitForMscOML)\r\n#define glXWaitForSbcOML GLXEW_GET_FUN(__glewXWaitForSbcOML)\r\n\r\n#define GLXEW_OML_sync_control GLXEW_GET_VAR(__GLXEW_OML_sync_control)\r\n\r\n#endif /* GLX_OML_sync_control */\r\n\r\n/* ------------------------ GLX_SGIS_blended_overlay ----------------------- */\r\n\r\n#ifndef GLX_SGIS_blended_overlay\r\n#define GLX_SGIS_blended_overlay 1\r\n\r\n#define GLX_BLENDED_RGBA_SGIS 0x8025\r\n\r\n#define GLXEW_SGIS_blended_overlay GLXEW_GET_VAR(__GLXEW_SGIS_blended_overlay)\r\n\r\n#endif /* GLX_SGIS_blended_overlay */\r\n\r\n/* -------------------------- GLX_SGIS_color_range ------------------------- */\r\n\r\n#ifndef GLX_SGIS_color_range\r\n#define GLX_SGIS_color_range 1\r\n\r\n#define GLX_MIN_RED_SGIS 0\r\n#define GLX_MAX_GREEN_SGIS 0\r\n#define GLX_MIN_BLUE_SGIS 0\r\n#define GLX_MAX_ALPHA_SGIS 0\r\n#define GLX_MIN_GREEN_SGIS 0\r\n#define GLX_MIN_ALPHA_SGIS 0\r\n#define GLX_MAX_RED_SGIS 0\r\n#define GLX_EXTENDED_RANGE_SGIS 0\r\n#define GLX_MAX_BLUE_SGIS 0\r\n\r\n#define GLXEW_SGIS_color_range GLXEW_GET_VAR(__GLXEW_SGIS_color_range)\r\n\r\n#endif /* GLX_SGIS_color_range */\r\n\r\n/* -------------------------- GLX_SGIS_multisample ------------------------- */\r\n\r\n#ifndef GLX_SGIS_multisample\r\n#define GLX_SGIS_multisample 1\r\n\r\n#define GLX_SAMPLE_BUFFERS_SGIS 100000\r\n#define GLX_SAMPLES_SGIS 100001\r\n\r\n#define GLXEW_SGIS_multisample GLXEW_GET_VAR(__GLXEW_SGIS_multisample)\r\n\r\n#endif /* GLX_SGIS_multisample */\r\n\r\n/* ---------------------- GLX_SGIS_shared_multisample ---------------------- */\r\n\r\n#ifndef GLX_SGIS_shared_multisample\r\n#define GLX_SGIS_shared_multisample 1\r\n\r\n#define GLX_MULTISAMPLE_SUB_RECT_WIDTH_SGIS 0x8026\r\n#define GLX_MULTISAMPLE_SUB_RECT_HEIGHT_SGIS 0x8027\r\n\r\n#define GLXEW_SGIS_shared_multisample GLXEW_GET_VAR(__GLXEW_SGIS_shared_multisample)\r\n\r\n#endif /* GLX_SGIS_shared_multisample */\r\n\r\n/* --------------------------- GLX_SGIX_fbconfig --------------------------- */\r\n\r\n#ifndef GLX_SGIX_fbconfig\r\n#define GLX_SGIX_fbconfig 1\r\n\r\n#define GLX_WINDOW_BIT_SGIX 0x00000001\r\n#define GLX_RGBA_BIT_SGIX 0x00000001\r\n#define GLX_PIXMAP_BIT_SGIX 0x00000002\r\n#define GLX_COLOR_INDEX_BIT_SGIX 0x00000002\r\n#define GLX_SCREEN_EXT 0x800C\r\n#define GLX_DRAWABLE_TYPE_SGIX 0x8010\r\n#define GLX_RENDER_TYPE_SGIX 0x8011\r\n#define GLX_X_RENDERABLE_SGIX 0x8012\r\n#define GLX_FBCONFIG_ID_SGIX 0x8013\r\n#define GLX_RGBA_TYPE_SGIX 0x8014\r\n#define GLX_COLOR_INDEX_TYPE_SGIX 0x8015\r\n\r\ntypedef XID GLXFBConfigIDSGIX;\r\ntypedef struct __GLXFBConfigRec *GLXFBConfigSGIX;\r\n\r\ntypedef GLXFBConfigSGIX* ( * PFNGLXCHOOSEFBCONFIGSGIXPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements);\r\ntypedef GLXContext ( * PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) (Display* dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct);\r\ntypedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC) (Display* dpy, GLXFBConfig config, Pixmap pixmap);\r\ntypedef int ( * PFNGLXGETFBCONFIGATTRIBSGIXPROC) (Display* dpy, GLXFBConfigSGIX config, int attribute, int *value);\r\ntypedef GLXFBConfigSGIX ( * PFNGLXGETFBCONFIGFROMVISUALSGIXPROC) (Display* dpy, XVisualInfo *vis);\r\ntypedef XVisualInfo* ( * PFNGLXGETVISUALFROMFBCONFIGSGIXPROC) (Display *dpy, GLXFBConfig config);\r\n\r\n#define glXChooseFBConfigSGIX GLXEW_GET_FUN(__glewXChooseFBConfigSGIX)\r\n#define glXCreateContextWithConfigSGIX GLXEW_GET_FUN(__glewXCreateContextWithConfigSGIX)\r\n#define glXCreateGLXPixmapWithConfigSGIX GLXEW_GET_FUN(__glewXCreateGLXPixmapWithConfigSGIX)\r\n#define glXGetFBConfigAttribSGIX GLXEW_GET_FUN(__glewXGetFBConfigAttribSGIX)\r\n#define glXGetFBConfigFromVisualSGIX GLXEW_GET_FUN(__glewXGetFBConfigFromVisualSGIX)\r\n#define glXGetVisualFromFBConfigSGIX GLXEW_GET_FUN(__glewXGetVisualFromFBConfigSGIX)\r\n\r\n#define GLXEW_SGIX_fbconfig GLXEW_GET_VAR(__GLXEW_SGIX_fbconfig)\r\n\r\n#endif /* GLX_SGIX_fbconfig */\r\n\r\n/* --------------------------- GLX_SGIX_hyperpipe -------------------------- */\r\n\r\n#ifndef GLX_SGIX_hyperpipe\r\n#define GLX_SGIX_hyperpipe 1\r\n\r\n#define GLX_HYPERPIPE_DISPLAY_PIPE_SGIX 0x00000001\r\n#define GLX_PIPE_RECT_SGIX 0x00000001\r\n#define GLX_PIPE_RECT_LIMITS_SGIX 0x00000002\r\n#define GLX_HYPERPIPE_RENDER_PIPE_SGIX 0x00000002\r\n#define GLX_HYPERPIPE_STEREO_SGIX 0x00000003\r\n#define GLX_HYPERPIPE_PIXEL_AVERAGE_SGIX 0x00000004\r\n#define GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX 80\r\n#define GLX_BAD_HYPERPIPE_CONFIG_SGIX 91\r\n#define GLX_BAD_HYPERPIPE_SGIX 92\r\n#define GLX_HYPERPIPE_ID_SGIX 0x8030\r\n\r\ntypedef struct {\r\n  char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; \r\n  int  networkId; \r\n} GLXHyperpipeNetworkSGIX;\r\ntypedef struct {\r\n  char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; \r\n  int XOrigin; \r\n  int YOrigin; \r\n  int maxHeight; \r\n  int maxWidth; \r\n} GLXPipeRectLimits;\r\ntypedef struct {\r\n  char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; \r\n  int channel; \r\n  unsigned int participationType; \r\n  int timeSlice; \r\n} GLXHyperpipeConfigSGIX;\r\ntypedef struct {\r\n  char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; \r\n  int srcXOrigin; \r\n  int srcYOrigin; \r\n  int srcWidth; \r\n  int srcHeight; \r\n  int destXOrigin; \r\n  int destYOrigin; \r\n  int destWidth; \r\n  int destHeight; \r\n} GLXPipeRect;\r\n\r\ntypedef int ( * PFNGLXBINDHYPERPIPESGIXPROC) (Display *dpy, int hpId);\r\ntypedef int ( * PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC) (Display *dpy, int hpId);\r\ntypedef int ( * PFNGLXHYPERPIPEATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *attribList);\r\ntypedef int ( * PFNGLXHYPERPIPECONFIGSGIXPROC) (Display *dpy, int networkId, int npipes, GLXHyperpipeConfigSGIX *cfg, int *hpId);\r\ntypedef int ( * PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *returnAttribList);\r\ntypedef int ( * PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *attribList, void *returnAttribList);\r\ntypedef GLXHyperpipeConfigSGIX * ( * PFNGLXQUERYHYPERPIPECONFIGSGIXPROC) (Display *dpy, int hpId, int *npipes);\r\ntypedef GLXHyperpipeNetworkSGIX * ( * PFNGLXQUERYHYPERPIPENETWORKSGIXPROC) (Display *dpy, int *npipes);\r\n\r\n#define glXBindHyperpipeSGIX GLXEW_GET_FUN(__glewXBindHyperpipeSGIX)\r\n#define glXDestroyHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXDestroyHyperpipeConfigSGIX)\r\n#define glXHyperpipeAttribSGIX GLXEW_GET_FUN(__glewXHyperpipeAttribSGIX)\r\n#define glXHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXHyperpipeConfigSGIX)\r\n#define glXQueryHyperpipeAttribSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeAttribSGIX)\r\n#define glXQueryHyperpipeBestAttribSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeBestAttribSGIX)\r\n#define glXQueryHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeConfigSGIX)\r\n#define glXQueryHyperpipeNetworkSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeNetworkSGIX)\r\n\r\n#define GLXEW_SGIX_hyperpipe GLXEW_GET_VAR(__GLXEW_SGIX_hyperpipe)\r\n\r\n#endif /* GLX_SGIX_hyperpipe */\r\n\r\n/* ---------------------------- GLX_SGIX_pbuffer --------------------------- */\r\n\r\n#ifndef GLX_SGIX_pbuffer\r\n#define GLX_SGIX_pbuffer 1\r\n\r\n#define GLX_FRONT_LEFT_BUFFER_BIT_SGIX 0x00000001\r\n#define GLX_FRONT_RIGHT_BUFFER_BIT_SGIX 0x00000002\r\n#define GLX_PBUFFER_BIT_SGIX 0x00000004\r\n#define GLX_BACK_LEFT_BUFFER_BIT_SGIX 0x00000004\r\n#define GLX_BACK_RIGHT_BUFFER_BIT_SGIX 0x00000008\r\n#define GLX_AUX_BUFFERS_BIT_SGIX 0x00000010\r\n#define GLX_DEPTH_BUFFER_BIT_SGIX 0x00000020\r\n#define GLX_STENCIL_BUFFER_BIT_SGIX 0x00000040\r\n#define GLX_ACCUM_BUFFER_BIT_SGIX 0x00000080\r\n#define GLX_SAMPLE_BUFFERS_BIT_SGIX 0x00000100\r\n#define GLX_MAX_PBUFFER_WIDTH_SGIX 0x8016\r\n#define GLX_MAX_PBUFFER_HEIGHT_SGIX 0x8017\r\n#define GLX_MAX_PBUFFER_PIXELS_SGIX 0x8018\r\n#define GLX_OPTIMAL_PBUFFER_WIDTH_SGIX 0x8019\r\n#define GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX 0x801A\r\n#define GLX_PRESERVED_CONTENTS_SGIX 0x801B\r\n#define GLX_LARGEST_PBUFFER_SGIX 0x801C\r\n#define GLX_WIDTH_SGIX 0x801D\r\n#define GLX_HEIGHT_SGIX 0x801E\r\n#define GLX_EVENT_MASK_SGIX 0x801F\r\n#define GLX_DAMAGED_SGIX 0x8020\r\n#define GLX_SAVED_SGIX 0x8021\r\n#define GLX_WINDOW_SGIX 0x8022\r\n#define GLX_PBUFFER_SGIX 0x8023\r\n#define GLX_BUFFER_CLOBBER_MASK_SGIX 0x08000000\r\n\r\ntypedef XID GLXPbufferSGIX;\r\ntypedef struct { int type; unsigned long serial; Bool send_event; Display *display; GLXDrawable drawable; int event_type; int draw_type; unsigned int mask; int x, y; int width, height; int count; } GLXBufferClobberEventSGIX;\r\n\r\ntypedef GLXPbuffer ( * PFNGLXCREATEGLXPBUFFERSGIXPROC) (Display* dpy, GLXFBConfig config, unsigned int width, unsigned int height, int *attrib_list);\r\ntypedef void ( * PFNGLXDESTROYGLXPBUFFERSGIXPROC) (Display* dpy, GLXPbuffer pbuf);\r\ntypedef void ( * PFNGLXGETSELECTEDEVENTSGIXPROC) (Display* dpy, GLXDrawable drawable, unsigned long *mask);\r\ntypedef void ( * PFNGLXQUERYGLXPBUFFERSGIXPROC) (Display* dpy, GLXPbuffer pbuf, int attribute, unsigned int *value);\r\ntypedef void ( * PFNGLXSELECTEVENTSGIXPROC) (Display* dpy, GLXDrawable drawable, unsigned long mask);\r\n\r\n#define glXCreateGLXPbufferSGIX GLXEW_GET_FUN(__glewXCreateGLXPbufferSGIX)\r\n#define glXDestroyGLXPbufferSGIX GLXEW_GET_FUN(__glewXDestroyGLXPbufferSGIX)\r\n#define glXGetSelectedEventSGIX GLXEW_GET_FUN(__glewXGetSelectedEventSGIX)\r\n#define glXQueryGLXPbufferSGIX GLXEW_GET_FUN(__glewXQueryGLXPbufferSGIX)\r\n#define glXSelectEventSGIX GLXEW_GET_FUN(__glewXSelectEventSGIX)\r\n\r\n#define GLXEW_SGIX_pbuffer GLXEW_GET_VAR(__GLXEW_SGIX_pbuffer)\r\n\r\n#endif /* GLX_SGIX_pbuffer */\r\n\r\n/* ------------------------- GLX_SGIX_swap_barrier ------------------------- */\r\n\r\n#ifndef GLX_SGIX_swap_barrier\r\n#define GLX_SGIX_swap_barrier 1\r\n\r\ntypedef void ( * PFNGLXBINDSWAPBARRIERSGIXPROC) (Display *dpy, GLXDrawable drawable, int barrier);\r\ntypedef Bool ( * PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC) (Display *dpy, int screen, int *max);\r\n\r\n#define glXBindSwapBarrierSGIX GLXEW_GET_FUN(__glewXBindSwapBarrierSGIX)\r\n#define glXQueryMaxSwapBarriersSGIX GLXEW_GET_FUN(__glewXQueryMaxSwapBarriersSGIX)\r\n\r\n#define GLXEW_SGIX_swap_barrier GLXEW_GET_VAR(__GLXEW_SGIX_swap_barrier)\r\n\r\n#endif /* GLX_SGIX_swap_barrier */\r\n\r\n/* -------------------------- GLX_SGIX_swap_group -------------------------- */\r\n\r\n#ifndef GLX_SGIX_swap_group\r\n#define GLX_SGIX_swap_group 1\r\n\r\ntypedef void ( * PFNGLXJOINSWAPGROUPSGIXPROC) (Display *dpy, GLXDrawable drawable, GLXDrawable member);\r\n\r\n#define glXJoinSwapGroupSGIX GLXEW_GET_FUN(__glewXJoinSwapGroupSGIX)\r\n\r\n#define GLXEW_SGIX_swap_group GLXEW_GET_VAR(__GLXEW_SGIX_swap_group)\r\n\r\n#endif /* GLX_SGIX_swap_group */\r\n\r\n/* ------------------------- GLX_SGIX_video_resize ------------------------- */\r\n\r\n#ifndef GLX_SGIX_video_resize\r\n#define GLX_SGIX_video_resize 1\r\n\r\n#define GLX_SYNC_FRAME_SGIX 0x00000000\r\n#define GLX_SYNC_SWAP_SGIX 0x00000001\r\n\r\ntypedef int ( * PFNGLXBINDCHANNELTOWINDOWSGIXPROC) (Display* display, int screen, int channel, Window window);\r\ntypedef int ( * PFNGLXCHANNELRECTSGIXPROC) (Display* display, int screen, int channel, int x, int y, int w, int h);\r\ntypedef int ( * PFNGLXCHANNELRECTSYNCSGIXPROC) (Display* display, int screen, int channel, GLenum synctype);\r\ntypedef int ( * PFNGLXQUERYCHANNELDELTASSGIXPROC) (Display* display, int screen, int channel, int *x, int *y, int *w, int *h);\r\ntypedef int ( * PFNGLXQUERYCHANNELRECTSGIXPROC) (Display* display, int screen, int channel, int *dx, int *dy, int *dw, int *dh);\r\n\r\n#define glXBindChannelToWindowSGIX GLXEW_GET_FUN(__glewXBindChannelToWindowSGIX)\r\n#define glXChannelRectSGIX GLXEW_GET_FUN(__glewXChannelRectSGIX)\r\n#define glXChannelRectSyncSGIX GLXEW_GET_FUN(__glewXChannelRectSyncSGIX)\r\n#define glXQueryChannelDeltasSGIX GLXEW_GET_FUN(__glewXQueryChannelDeltasSGIX)\r\n#define glXQueryChannelRectSGIX GLXEW_GET_FUN(__glewXQueryChannelRectSGIX)\r\n\r\n#define GLXEW_SGIX_video_resize GLXEW_GET_VAR(__GLXEW_SGIX_video_resize)\r\n\r\n#endif /* GLX_SGIX_video_resize */\r\n\r\n/* ---------------------- GLX_SGIX_visual_select_group --------------------- */\r\n\r\n#ifndef GLX_SGIX_visual_select_group\r\n#define GLX_SGIX_visual_select_group 1\r\n\r\n#define GLX_VISUAL_SELECT_GROUP_SGIX 0x8028\r\n\r\n#define GLXEW_SGIX_visual_select_group GLXEW_GET_VAR(__GLXEW_SGIX_visual_select_group)\r\n\r\n#endif /* GLX_SGIX_visual_select_group */\r\n\r\n/* ---------------------------- GLX_SGI_cushion ---------------------------- */\r\n\r\n#ifndef GLX_SGI_cushion\r\n#define GLX_SGI_cushion 1\r\n\r\ntypedef void ( * PFNGLXCUSHIONSGIPROC) (Display* dpy, Window window, float cushion);\r\n\r\n#define glXCushionSGI GLXEW_GET_FUN(__glewXCushionSGI)\r\n\r\n#define GLXEW_SGI_cushion GLXEW_GET_VAR(__GLXEW_SGI_cushion)\r\n\r\n#endif /* GLX_SGI_cushion */\r\n\r\n/* ----------------------- GLX_SGI_make_current_read ----------------------- */\r\n\r\n#ifndef GLX_SGI_make_current_read\r\n#define GLX_SGI_make_current_read 1\r\n\r\ntypedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLESGIPROC) (void);\r\ntypedef Bool ( * PFNGLXMAKECURRENTREADSGIPROC) (Display* dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx);\r\n\r\n#define glXGetCurrentReadDrawableSGI GLXEW_GET_FUN(__glewXGetCurrentReadDrawableSGI)\r\n#define glXMakeCurrentReadSGI GLXEW_GET_FUN(__glewXMakeCurrentReadSGI)\r\n\r\n#define GLXEW_SGI_make_current_read GLXEW_GET_VAR(__GLXEW_SGI_make_current_read)\r\n\r\n#endif /* GLX_SGI_make_current_read */\r\n\r\n/* -------------------------- GLX_SGI_swap_control ------------------------- */\r\n\r\n#ifndef GLX_SGI_swap_control\r\n#define GLX_SGI_swap_control 1\r\n\r\ntypedef int ( * PFNGLXSWAPINTERVALSGIPROC) (int interval);\r\n\r\n#define glXSwapIntervalSGI GLXEW_GET_FUN(__glewXSwapIntervalSGI)\r\n\r\n#define GLXEW_SGI_swap_control GLXEW_GET_VAR(__GLXEW_SGI_swap_control)\r\n\r\n#endif /* GLX_SGI_swap_control */\r\n\r\n/* --------------------------- GLX_SGI_video_sync -------------------------- */\r\n\r\n#ifndef GLX_SGI_video_sync\r\n#define GLX_SGI_video_sync 1\r\n\r\ntypedef int ( * PFNGLXGETVIDEOSYNCSGIPROC) (uint* count);\r\ntypedef int ( * PFNGLXWAITVIDEOSYNCSGIPROC) (int divisor, int remainder, unsigned int* count);\r\n\r\n#define glXGetVideoSyncSGI GLXEW_GET_FUN(__glewXGetVideoSyncSGI)\r\n#define glXWaitVideoSyncSGI GLXEW_GET_FUN(__glewXWaitVideoSyncSGI)\r\n\r\n#define GLXEW_SGI_video_sync GLXEW_GET_VAR(__GLXEW_SGI_video_sync)\r\n\r\n#endif /* GLX_SGI_video_sync */\r\n\r\n/* --------------------- GLX_SUN_get_transparent_index --------------------- */\r\n\r\n#ifndef GLX_SUN_get_transparent_index\r\n#define GLX_SUN_get_transparent_index 1\r\n\r\ntypedef Status ( * PFNGLXGETTRANSPARENTINDEXSUNPROC) (Display* dpy, Window overlay, Window underlay, unsigned long *pTransparentIndex);\r\n\r\n#define glXGetTransparentIndexSUN GLXEW_GET_FUN(__glewXGetTransparentIndexSUN)\r\n\r\n#define GLXEW_SUN_get_transparent_index GLXEW_GET_VAR(__GLXEW_SUN_get_transparent_index)\r\n\r\n#endif /* GLX_SUN_get_transparent_index */\r\n\r\n/* -------------------------- GLX_SUN_video_resize ------------------------- */\r\n\r\n#ifndef GLX_SUN_video_resize\r\n#define GLX_SUN_video_resize 1\r\n\r\n#define GLX_VIDEO_RESIZE_SUN 0x8171\r\n#define GL_VIDEO_RESIZE_COMPENSATION_SUN 0x85CD\r\n\r\ntypedef int ( * PFNGLXGETVIDEORESIZESUNPROC) (Display* display, GLXDrawable window, float* factor);\r\ntypedef int ( * PFNGLXVIDEORESIZESUNPROC) (Display* display, GLXDrawable window, float factor);\r\n\r\n#define glXGetVideoResizeSUN GLXEW_GET_FUN(__glewXGetVideoResizeSUN)\r\n#define glXVideoResizeSUN GLXEW_GET_FUN(__glewXVideoResizeSUN)\r\n\r\n#define GLXEW_SUN_video_resize GLXEW_GET_VAR(__GLXEW_SUN_video_resize)\r\n\r\n#endif /* GLX_SUN_video_resize */\r\n\r\n/* ------------------------------------------------------------------------- */\r\n\r\n#ifdef GLEW_MX\r\n#define GLXEW_EXPORT\r\n#else\r\n#define GLXEW_EXPORT extern\r\n#endif /* GLEW_MX */\r\n\r\nextern PFNGLXGETCURRENTDISPLAYPROC __glewXGetCurrentDisplay;\r\n\r\nextern PFNGLXCHOOSEFBCONFIGPROC __glewXChooseFBConfig;\r\nextern PFNGLXCREATENEWCONTEXTPROC __glewXCreateNewContext;\r\nextern PFNGLXCREATEPBUFFERPROC __glewXCreatePbuffer;\r\nextern PFNGLXCREATEPIXMAPPROC __glewXCreatePixmap;\r\nextern PFNGLXCREATEWINDOWPROC __glewXCreateWindow;\r\nextern PFNGLXDESTROYPBUFFERPROC __glewXDestroyPbuffer;\r\nextern PFNGLXDESTROYPIXMAPPROC __glewXDestroyPixmap;\r\nextern PFNGLXDESTROYWINDOWPROC __glewXDestroyWindow;\r\nextern PFNGLXGETCURRENTREADDRAWABLEPROC __glewXGetCurrentReadDrawable;\r\nextern PFNGLXGETFBCONFIGATTRIBPROC __glewXGetFBConfigAttrib;\r\nextern PFNGLXGETFBCONFIGSPROC __glewXGetFBConfigs;\r\nextern PFNGLXGETSELECTEDEVENTPROC __glewXGetSelectedEvent;\r\nextern PFNGLXGETVISUALFROMFBCONFIGPROC __glewXGetVisualFromFBConfig;\r\nextern PFNGLXMAKECONTEXTCURRENTPROC __glewXMakeContextCurrent;\r\nextern PFNGLXQUERYCONTEXTPROC __glewXQueryContext;\r\nextern PFNGLXQUERYDRAWABLEPROC __glewXQueryDrawable;\r\nextern PFNGLXSELECTEVENTPROC __glewXSelectEvent;\r\n\r\nextern PFNGLXCREATECONTEXTATTRIBSARBPROC __glewXCreateContextAttribsARB;\r\n\r\nextern PFNGLXBINDTEXIMAGEATIPROC __glewXBindTexImageATI;\r\nextern PFNGLXDRAWABLEATTRIBATIPROC __glewXDrawableAttribATI;\r\nextern PFNGLXRELEASETEXIMAGEATIPROC __glewXReleaseTexImageATI;\r\n\r\nextern PFNGLXFREECONTEXTEXTPROC __glewXFreeContextEXT;\r\nextern PFNGLXGETCONTEXTIDEXTPROC __glewXGetContextIDEXT;\r\nextern PFNGLXIMPORTCONTEXTEXTPROC __glewXImportContextEXT;\r\nextern PFNGLXQUERYCONTEXTINFOEXTPROC __glewXQueryContextInfoEXT;\r\n\r\nextern PFNGLXSWAPINTERVALEXTPROC __glewXSwapIntervalEXT;\r\n\r\nextern PFNGLXBINDTEXIMAGEEXTPROC __glewXBindTexImageEXT;\r\nextern PFNGLXRELEASETEXIMAGEEXTPROC __glewXReleaseTexImageEXT;\r\n\r\nextern PFNGLXGETAGPOFFSETMESAPROC __glewXGetAGPOffsetMESA;\r\n\r\nextern PFNGLXCOPYSUBBUFFERMESAPROC __glewXCopySubBufferMESA;\r\n\r\nextern PFNGLXCREATEGLXPIXMAPMESAPROC __glewXCreateGLXPixmapMESA;\r\n\r\nextern PFNGLXRELEASEBUFFERSMESAPROC __glewXReleaseBuffersMESA;\r\n\r\nextern PFNGLXSET3DFXMODEMESAPROC __glewXSet3DfxModeMESA;\r\n\r\nextern PFNGLXCOPYIMAGESUBDATANVPROC __glewXCopyImageSubDataNV;\r\n\r\nextern PFNGLXBINDVIDEODEVICENVPROC __glewXBindVideoDeviceNV;\r\nextern PFNGLXENUMERATEVIDEODEVICESNVPROC __glewXEnumerateVideoDevicesNV;\r\n\r\nextern PFNGLXBINDSWAPBARRIERNVPROC __glewXBindSwapBarrierNV;\r\nextern PFNGLXJOINSWAPGROUPNVPROC __glewXJoinSwapGroupNV;\r\nextern PFNGLXQUERYFRAMECOUNTNVPROC __glewXQueryFrameCountNV;\r\nextern PFNGLXQUERYMAXSWAPGROUPSNVPROC __glewXQueryMaxSwapGroupsNV;\r\nextern PFNGLXQUERYSWAPGROUPNVPROC __glewXQuerySwapGroupNV;\r\nextern PFNGLXRESETFRAMECOUNTNVPROC __glewXResetFrameCountNV;\r\n\r\nextern PFNGLXALLOCATEMEMORYNVPROC __glewXAllocateMemoryNV;\r\nextern PFNGLXFREEMEMORYNVPROC __glewXFreeMemoryNV;\r\n\r\nextern PFNGLXBINDVIDEOIMAGENVPROC __glewXBindVideoImageNV;\r\nextern PFNGLXGETVIDEODEVICENVPROC __glewXGetVideoDeviceNV;\r\nextern PFNGLXGETVIDEOINFONVPROC __glewXGetVideoInfoNV;\r\nextern PFNGLXRELEASEVIDEODEVICENVPROC __glewXReleaseVideoDeviceNV;\r\nextern PFNGLXRELEASEVIDEOIMAGENVPROC __glewXReleaseVideoImageNV;\r\nextern PFNGLXSENDPBUFFERTOVIDEONVPROC __glewXSendPbufferToVideoNV;\r\n\r\n#ifdef GLX_OML_sync_control\r\nextern PFNGLXGETMSCRATEOMLPROC __glewXGetMscRateOML;\r\nextern PFNGLXGETSYNCVALUESOMLPROC __glewXGetSyncValuesOML;\r\nextern PFNGLXSWAPBUFFERSMSCOMLPROC __glewXSwapBuffersMscOML;\r\nextern PFNGLXWAITFORMSCOMLPROC __glewXWaitForMscOML;\r\nextern PFNGLXWAITFORSBCOMLPROC __glewXWaitForSbcOML;\r\n#endif\r\n\r\nextern PFNGLXCHOOSEFBCONFIGSGIXPROC __glewXChooseFBConfigSGIX;\r\nextern PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC __glewXCreateContextWithConfigSGIX;\r\nextern PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC __glewXCreateGLXPixmapWithConfigSGIX;\r\nextern PFNGLXGETFBCONFIGATTRIBSGIXPROC __glewXGetFBConfigAttribSGIX;\r\nextern PFNGLXGETFBCONFIGFROMVISUALSGIXPROC __glewXGetFBConfigFromVisualSGIX;\r\nextern PFNGLXGETVISUALFROMFBCONFIGSGIXPROC __glewXGetVisualFromFBConfigSGIX;\r\n\r\nextern PFNGLXBINDHYPERPIPESGIXPROC __glewXBindHyperpipeSGIX;\r\nextern PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC __glewXDestroyHyperpipeConfigSGIX;\r\nextern PFNGLXHYPERPIPEATTRIBSGIXPROC __glewXHyperpipeAttribSGIX;\r\nextern PFNGLXHYPERPIPECONFIGSGIXPROC __glewXHyperpipeConfigSGIX;\r\nextern PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC __glewXQueryHyperpipeAttribSGIX;\r\nextern PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC __glewXQueryHyperpipeBestAttribSGIX;\r\nextern PFNGLXQUERYHYPERPIPECONFIGSGIXPROC __glewXQueryHyperpipeConfigSGIX;\r\nextern PFNGLXQUERYHYPERPIPENETWORKSGIXPROC __glewXQueryHyperpipeNetworkSGIX;\r\n\r\nextern PFNGLXCREATEGLXPBUFFERSGIXPROC __glewXCreateGLXPbufferSGIX;\r\nextern PFNGLXDESTROYGLXPBUFFERSGIXPROC __glewXDestroyGLXPbufferSGIX;\r\nextern PFNGLXGETSELECTEDEVENTSGIXPROC __glewXGetSelectedEventSGIX;\r\nextern PFNGLXQUERYGLXPBUFFERSGIXPROC __glewXQueryGLXPbufferSGIX;\r\nextern PFNGLXSELECTEVENTSGIXPROC __glewXSelectEventSGIX;\r\n\r\nextern PFNGLXBINDSWAPBARRIERSGIXPROC __glewXBindSwapBarrierSGIX;\r\nextern PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC __glewXQueryMaxSwapBarriersSGIX;\r\n\r\nextern PFNGLXJOINSWAPGROUPSGIXPROC __glewXJoinSwapGroupSGIX;\r\n\r\nextern PFNGLXBINDCHANNELTOWINDOWSGIXPROC __glewXBindChannelToWindowSGIX;\r\nextern PFNGLXCHANNELRECTSGIXPROC __glewXChannelRectSGIX;\r\nextern PFNGLXCHANNELRECTSYNCSGIXPROC __glewXChannelRectSyncSGIX;\r\nextern PFNGLXQUERYCHANNELDELTASSGIXPROC __glewXQueryChannelDeltasSGIX;\r\nextern PFNGLXQUERYCHANNELRECTSGIXPROC __glewXQueryChannelRectSGIX;\r\n\r\nextern PFNGLXCUSHIONSGIPROC __glewXCushionSGI;\r\n\r\nextern PFNGLXGETCURRENTREADDRAWABLESGIPROC __glewXGetCurrentReadDrawableSGI;\r\nextern PFNGLXMAKECURRENTREADSGIPROC __glewXMakeCurrentReadSGI;\r\n\r\nextern PFNGLXSWAPINTERVALSGIPROC __glewXSwapIntervalSGI;\r\n\r\nextern PFNGLXGETVIDEOSYNCSGIPROC __glewXGetVideoSyncSGI;\r\nextern PFNGLXWAITVIDEOSYNCSGIPROC __glewXWaitVideoSyncSGI;\r\n\r\nextern PFNGLXGETTRANSPARENTINDEXSUNPROC __glewXGetTransparentIndexSUN;\r\n\r\nextern PFNGLXGETVIDEORESIZESUNPROC __glewXGetVideoResizeSUN;\r\nextern PFNGLXVIDEORESIZESUNPROC __glewXVideoResizeSUN;\r\n\r\n#if defined(GLEW_MX)\r\nstruct GLXEWContextStruct\r\n{\r\n#endif /* GLEW_MX */\r\n\r\nGLXEW_EXPORT GLboolean __GLXEW_VERSION_1_0;\r\nGLXEW_EXPORT GLboolean __GLXEW_VERSION_1_1;\r\nGLXEW_EXPORT GLboolean __GLXEW_VERSION_1_2;\r\nGLXEW_EXPORT GLboolean __GLXEW_VERSION_1_3;\r\nGLXEW_EXPORT GLboolean __GLXEW_VERSION_1_4;\r\nGLXEW_EXPORT GLboolean __GLXEW_3DFX_multisample;\r\nGLXEW_EXPORT GLboolean __GLXEW_ARB_create_context;\r\nGLXEW_EXPORT GLboolean __GLXEW_ARB_create_context_profile;\r\nGLXEW_EXPORT GLboolean __GLXEW_ARB_fbconfig_float;\r\nGLXEW_EXPORT GLboolean __GLXEW_ARB_framebuffer_sRGB;\r\nGLXEW_EXPORT GLboolean __GLXEW_ARB_get_proc_address;\r\nGLXEW_EXPORT GLboolean __GLXEW_ARB_multisample;\r\nGLXEW_EXPORT GLboolean __GLXEW_ATI_pixel_format_float;\r\nGLXEW_EXPORT GLboolean __GLXEW_ATI_render_texture;\r\nGLXEW_EXPORT GLboolean __GLXEW_EXT_fbconfig_packed_float;\r\nGLXEW_EXPORT GLboolean __GLXEW_EXT_framebuffer_sRGB;\r\nGLXEW_EXPORT GLboolean __GLXEW_EXT_import_context;\r\nGLXEW_EXPORT GLboolean __GLXEW_EXT_scene_marker;\r\nGLXEW_EXPORT GLboolean __GLXEW_EXT_swap_control;\r\nGLXEW_EXPORT GLboolean __GLXEW_EXT_texture_from_pixmap;\r\nGLXEW_EXPORT GLboolean __GLXEW_EXT_visual_info;\r\nGLXEW_EXPORT GLboolean __GLXEW_EXT_visual_rating;\r\nGLXEW_EXPORT GLboolean __GLXEW_INTEL_swap_event;\r\nGLXEW_EXPORT GLboolean __GLXEW_MESA_agp_offset;\r\nGLXEW_EXPORT GLboolean __GLXEW_MESA_copy_sub_buffer;\r\nGLXEW_EXPORT GLboolean __GLXEW_MESA_pixmap_colormap;\r\nGLXEW_EXPORT GLboolean __GLXEW_MESA_release_buffers;\r\nGLXEW_EXPORT GLboolean __GLXEW_MESA_set_3dfx_mode;\r\nGLXEW_EXPORT GLboolean __GLXEW_NV_copy_image;\r\nGLXEW_EXPORT GLboolean __GLXEW_NV_float_buffer;\r\nGLXEW_EXPORT GLboolean __GLXEW_NV_present_video;\r\nGLXEW_EXPORT GLboolean __GLXEW_NV_swap_group;\r\nGLXEW_EXPORT GLboolean __GLXEW_NV_vertex_array_range;\r\nGLXEW_EXPORT GLboolean __GLXEW_NV_video_output;\r\nGLXEW_EXPORT GLboolean __GLXEW_OML_swap_method;\r\nGLXEW_EXPORT GLboolean __GLXEW_OML_sync_control;\r\nGLXEW_EXPORT GLboolean __GLXEW_SGIS_blended_overlay;\r\nGLXEW_EXPORT GLboolean __GLXEW_SGIS_color_range;\r\nGLXEW_EXPORT GLboolean __GLXEW_SGIS_multisample;\r\nGLXEW_EXPORT GLboolean __GLXEW_SGIS_shared_multisample;\r\nGLXEW_EXPORT GLboolean __GLXEW_SGIX_fbconfig;\r\nGLXEW_EXPORT GLboolean __GLXEW_SGIX_hyperpipe;\r\nGLXEW_EXPORT GLboolean __GLXEW_SGIX_pbuffer;\r\nGLXEW_EXPORT GLboolean __GLXEW_SGIX_swap_barrier;\r\nGLXEW_EXPORT GLboolean __GLXEW_SGIX_swap_group;\r\nGLXEW_EXPORT GLboolean __GLXEW_SGIX_video_resize;\r\nGLXEW_EXPORT GLboolean __GLXEW_SGIX_visual_select_group;\r\nGLXEW_EXPORT GLboolean __GLXEW_SGI_cushion;\r\nGLXEW_EXPORT GLboolean __GLXEW_SGI_make_current_read;\r\nGLXEW_EXPORT GLboolean __GLXEW_SGI_swap_control;\r\nGLXEW_EXPORT GLboolean __GLXEW_SGI_video_sync;\r\nGLXEW_EXPORT GLboolean __GLXEW_SUN_get_transparent_index;\r\nGLXEW_EXPORT GLboolean __GLXEW_SUN_video_resize;\r\n\r\n#ifdef GLEW_MX\r\n}; /* GLXEWContextStruct */\r\n#endif /* GLEW_MX */\r\n\r\n/* ------------------------------------------------------------------------ */\r\n\r\n#ifdef GLEW_MX\r\n\r\ntypedef struct GLXEWContextStruct GLXEWContext;\r\nextern GLenum glxewContextInit (GLXEWContext* ctx);\r\nextern GLboolean glxewContextIsSupported (GLXEWContext* ctx, const char* name);\r\n\r\n#define glxewInit() glxewContextInit(glxewGetContext())\r\n#define glxewIsSupported(x) glxewContextIsSupported(glxewGetContext(), x)\r\n\r\n#define GLXEW_GET_VAR(x) (*(const GLboolean*)&(glxewGetContext()->x))\r\n#define GLXEW_GET_FUN(x) x\r\n\r\n#else /* GLEW_MX */\r\n\r\n#define GLXEW_GET_VAR(x) (*(const GLboolean*)&x)\r\n#define GLXEW_GET_FUN(x) x\r\n\r\nextern GLboolean glxewIsSupported (const char* name);\r\n\r\n#endif /* GLEW_MX */\r\n\r\nextern GLboolean glxewGetExtension (const char* name);\r\n\r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#endif /* __glxew_h__ */\r\n"
  },
  {
    "path": "libs/glew/include/GL/wglew.h",
    "content": "/*\r\n** The OpenGL Extension Wrangler Library\r\n** Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>\r\n** Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>\r\n** Copyright (C) 2002, Lev Povalahev\r\n** All rights reserved.\r\n** \r\n** Redistribution and use in source and binary forms, with or without \r\n** modification, are permitted provided that the following conditions are met:\r\n** \r\n** * Redistributions of source code must retain the above copyright notice, \r\n**   this list of conditions and the following disclaimer.\r\n** * Redistributions in binary form must reproduce the above copyright notice, \r\n**   this list of conditions and the following disclaimer in the documentation \r\n**   and/or other materials provided with the distribution.\r\n** * The name of the author may be used to endorse or promote products \r\n**   derived from this software without specific prior written permission.\r\n**\r\n** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" \r\n** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r\n** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r\n** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE \r\n** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \r\n** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \r\n** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r\n** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r\n** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r\n** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\r\n** THE POSSIBILITY OF SUCH DAMAGE.\r\n*/\r\n\r\n/*\r\n** Copyright (c) 2007 The Khronos Group Inc.\r\n** \r\n** Permission is hereby granted, free of charge, to any person obtaining a\r\n** copy of this software and/or associated documentation files (the\r\n** \"Materials\"), to deal in the Materials without restriction, including\r\n** without limitation the rights to use, copy, modify, merge, publish,\r\n** distribute, sublicense, and/or sell copies of the Materials, and to\r\n** permit persons to whom the Materials are furnished to do so, subject to\r\n** the following conditions:\r\n** \r\n** The above copyright notice and this permission notice shall be included\r\n** in all copies or substantial portions of the Materials.\r\n** \r\n** THE MATERIALS ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\r\n** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r\n** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\r\n** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\r\n** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\r\n** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\r\n** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.\r\n*/\r\n\r\n#ifndef __wglew_h__\r\n#define __wglew_h__\r\n#define __WGLEW_H__\r\n\r\n#ifdef __wglext_h_\r\n#error wglext.h included before wglew.h\r\n#endif\r\n\r\n#define __wglext_h_\r\n\r\n#if !defined(WINAPI)\r\n#  ifndef WIN32_LEAN_AND_MEAN\r\n#    define WIN32_LEAN_AND_MEAN 1\r\n#  endif\r\n#include <windows.h>\r\n#  undef WIN32_LEAN_AND_MEAN\r\n#endif\r\n\r\n/*\r\n * GLEW_STATIC needs to be set when using the static version.\r\n * GLEW_BUILD is set when building the DLL version.\r\n */\r\n#ifdef GLEW_STATIC\r\n#  define GLEWAPI extern\r\n#else\r\n#  ifdef GLEW_BUILD\r\n#    define GLEWAPI extern __declspec(dllexport)\r\n#  else\r\n#    define GLEWAPI extern __declspec(dllimport)\r\n#  endif\r\n#endif\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/* -------------------------- WGL_3DFX_multisample ------------------------- */\r\n\r\n#ifndef WGL_3DFX_multisample\r\n#define WGL_3DFX_multisample 1\r\n\r\n#define WGL_SAMPLE_BUFFERS_3DFX 0x2060\r\n#define WGL_SAMPLES_3DFX 0x2061\r\n\r\n#define WGLEW_3DFX_multisample WGLEW_GET_VAR(__WGLEW_3DFX_multisample)\r\n\r\n#endif /* WGL_3DFX_multisample */\r\n\r\n/* ------------------------- WGL_3DL_stereo_control ------------------------ */\r\n\r\n#ifndef WGL_3DL_stereo_control\r\n#define WGL_3DL_stereo_control 1\r\n\r\n#define WGL_STEREO_EMITTER_ENABLE_3DL 0x2055\r\n#define WGL_STEREO_EMITTER_DISABLE_3DL 0x2056\r\n#define WGL_STEREO_POLARITY_NORMAL_3DL 0x2057\r\n#define WGL_STEREO_POLARITY_INVERT_3DL 0x2058\r\n\r\ntypedef BOOL (WINAPI * PFNWGLSETSTEREOEMITTERSTATE3DLPROC) (HDC hDC, UINT uState);\r\n\r\n#define wglSetStereoEmitterState3DL WGLEW_GET_FUN(__wglewSetStereoEmitterState3DL)\r\n\r\n#define WGLEW_3DL_stereo_control WGLEW_GET_VAR(__WGLEW_3DL_stereo_control)\r\n\r\n#endif /* WGL_3DL_stereo_control */\r\n\r\n/* ------------------------ WGL_AMD_gpu_association ------------------------ */\r\n\r\n#ifndef WGL_AMD_gpu_association\r\n#define WGL_AMD_gpu_association 1\r\n\r\n#define WGL_GPU_VENDOR_AMD 0x1F00\r\n#define WGL_GPU_RENDERER_STRING_AMD 0x1F01\r\n#define WGL_GPU_OPENGL_VERSION_STRING_AMD 0x1F02\r\n#define WGL_GPU_FASTEST_TARGET_GPUS_AMD 0x21A2\r\n#define WGL_GPU_RAM_AMD 0x21A3\r\n#define WGL_GPU_CLOCK_AMD 0x21A4\r\n#define WGL_GPU_NUM_PIPES_AMD 0x21A5\r\n#define WGL_GPU_NUM_SIMD_AMD 0x21A6\r\n#define WGL_GPU_NUM_RB_AMD 0x21A7\r\n#define WGL_GPU_NUM_SPI_AMD 0x21A8\r\n\r\ntypedef VOID (WINAPI * PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC) (HGLRC dstCtx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);\r\ntypedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC) (UINT id);\r\ntypedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC) (UINT id, HGLRC hShareContext, const int* attribList);\r\ntypedef BOOL (WINAPI * PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC) (HGLRC hglrc);\r\ntypedef UINT (WINAPI * PFNWGLGETCONTEXTGPUIDAMDPROC) (HGLRC hglrc);\r\ntypedef HGLRC (WINAPI * PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC) (void);\r\ntypedef UINT (WINAPI * PFNWGLGETGPUIDSAMDPROC) (UINT maxCount, UINT* ids);\r\ntypedef INT (WINAPI * PFNWGLGETGPUINFOAMDPROC) (UINT id, INT property, GLenum dataType, UINT size, void* data);\r\ntypedef BOOL (WINAPI * PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC) (HGLRC hglrc);\r\n\r\n#define wglBlitContextFramebufferAMD WGLEW_GET_FUN(__wglewBlitContextFramebufferAMD)\r\n#define wglCreateAssociatedContextAMD WGLEW_GET_FUN(__wglewCreateAssociatedContextAMD)\r\n#define wglCreateAssociatedContextAttribsAMD WGLEW_GET_FUN(__wglewCreateAssociatedContextAttribsAMD)\r\n#define wglDeleteAssociatedContextAMD WGLEW_GET_FUN(__wglewDeleteAssociatedContextAMD)\r\n#define wglGetContextGPUIDAMD WGLEW_GET_FUN(__wglewGetContextGPUIDAMD)\r\n#define wglGetCurrentAssociatedContextAMD WGLEW_GET_FUN(__wglewGetCurrentAssociatedContextAMD)\r\n#define wglGetGPUIDsAMD WGLEW_GET_FUN(__wglewGetGPUIDsAMD)\r\n#define wglGetGPUInfoAMD WGLEW_GET_FUN(__wglewGetGPUInfoAMD)\r\n#define wglMakeAssociatedContextCurrentAMD WGLEW_GET_FUN(__wglewMakeAssociatedContextCurrentAMD)\r\n\r\n#define WGLEW_AMD_gpu_association WGLEW_GET_VAR(__WGLEW_AMD_gpu_association)\r\n\r\n#endif /* WGL_AMD_gpu_association */\r\n\r\n/* ------------------------- WGL_ARB_buffer_region ------------------------- */\r\n\r\n#ifndef WGL_ARB_buffer_region\r\n#define WGL_ARB_buffer_region 1\r\n\r\n#define WGL_FRONT_COLOR_BUFFER_BIT_ARB 0x00000001\r\n#define WGL_BACK_COLOR_BUFFER_BIT_ARB 0x00000002\r\n#define WGL_DEPTH_BUFFER_BIT_ARB 0x00000004\r\n#define WGL_STENCIL_BUFFER_BIT_ARB 0x00000008\r\n\r\ntypedef HANDLE (WINAPI * PFNWGLCREATEBUFFERREGIONARBPROC) (HDC hDC, int iLayerPlane, UINT uType);\r\ntypedef VOID (WINAPI * PFNWGLDELETEBUFFERREGIONARBPROC) (HANDLE hRegion);\r\ntypedef BOOL (WINAPI * PFNWGLRESTOREBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc);\r\ntypedef BOOL (WINAPI * PFNWGLSAVEBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height);\r\n\r\n#define wglCreateBufferRegionARB WGLEW_GET_FUN(__wglewCreateBufferRegionARB)\r\n#define wglDeleteBufferRegionARB WGLEW_GET_FUN(__wglewDeleteBufferRegionARB)\r\n#define wglRestoreBufferRegionARB WGLEW_GET_FUN(__wglewRestoreBufferRegionARB)\r\n#define wglSaveBufferRegionARB WGLEW_GET_FUN(__wglewSaveBufferRegionARB)\r\n\r\n#define WGLEW_ARB_buffer_region WGLEW_GET_VAR(__WGLEW_ARB_buffer_region)\r\n\r\n#endif /* WGL_ARB_buffer_region */\r\n\r\n/* ------------------------- WGL_ARB_create_context ------------------------ */\r\n\r\n#ifndef WGL_ARB_create_context\r\n#define WGL_ARB_create_context 1\r\n\r\n#define WGL_CONTEXT_DEBUG_BIT_ARB 0x0001\r\n#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002\r\n#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091\r\n#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092\r\n#define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093\r\n#define WGL_CONTEXT_FLAGS_ARB 0x2094\r\n\r\ntypedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC hDC, HGLRC hShareContext, const int* attribList);\r\n\r\n#define wglCreateContextAttribsARB WGLEW_GET_FUN(__wglewCreateContextAttribsARB)\r\n\r\n#define WGLEW_ARB_create_context WGLEW_GET_VAR(__WGLEW_ARB_create_context)\r\n\r\n#endif /* WGL_ARB_create_context */\r\n\r\n/* --------------------- WGL_ARB_create_context_profile -------------------- */\r\n\r\n#ifndef WGL_ARB_create_context_profile\r\n#define WGL_ARB_create_context_profile 1\r\n\r\n#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001\r\n#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002\r\n#define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126\r\n\r\n#define WGLEW_ARB_create_context_profile WGLEW_GET_VAR(__WGLEW_ARB_create_context_profile)\r\n\r\n#endif /* WGL_ARB_create_context_profile */\r\n\r\n/* ----------------------- WGL_ARB_extensions_string ----------------------- */\r\n\r\n#ifndef WGL_ARB_extensions_string\r\n#define WGL_ARB_extensions_string 1\r\n\r\ntypedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc);\r\n\r\n#define wglGetExtensionsStringARB WGLEW_GET_FUN(__wglewGetExtensionsStringARB)\r\n\r\n#define WGLEW_ARB_extensions_string WGLEW_GET_VAR(__WGLEW_ARB_extensions_string)\r\n\r\n#endif /* WGL_ARB_extensions_string */\r\n\r\n/* ------------------------ WGL_ARB_framebuffer_sRGB ----------------------- */\r\n\r\n#ifndef WGL_ARB_framebuffer_sRGB\r\n#define WGL_ARB_framebuffer_sRGB 1\r\n\r\n#define WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20A9\r\n\r\n#define WGLEW_ARB_framebuffer_sRGB WGLEW_GET_VAR(__WGLEW_ARB_framebuffer_sRGB)\r\n\r\n#endif /* WGL_ARB_framebuffer_sRGB */\r\n\r\n/* ----------------------- WGL_ARB_make_current_read ----------------------- */\r\n\r\n#ifndef WGL_ARB_make_current_read\r\n#define WGL_ARB_make_current_read 1\r\n\r\n#define ERROR_INVALID_PIXEL_TYPE_ARB 0x2043\r\n#define ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054\r\n\r\ntypedef HDC (WINAPI * PFNWGLGETCURRENTREADDCARBPROC) (VOID);\r\ntypedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTARBPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc);\r\n\r\n#define wglGetCurrentReadDCARB WGLEW_GET_FUN(__wglewGetCurrentReadDCARB)\r\n#define wglMakeContextCurrentARB WGLEW_GET_FUN(__wglewMakeContextCurrentARB)\r\n\r\n#define WGLEW_ARB_make_current_read WGLEW_GET_VAR(__WGLEW_ARB_make_current_read)\r\n\r\n#endif /* WGL_ARB_make_current_read */\r\n\r\n/* -------------------------- WGL_ARB_multisample -------------------------- */\r\n\r\n#ifndef WGL_ARB_multisample\r\n#define WGL_ARB_multisample 1\r\n\r\n#define WGL_SAMPLE_BUFFERS_ARB 0x2041\r\n#define WGL_SAMPLES_ARB 0x2042\r\n\r\n#define WGLEW_ARB_multisample WGLEW_GET_VAR(__WGLEW_ARB_multisample)\r\n\r\n#endif /* WGL_ARB_multisample */\r\n\r\n/* ---------------------------- WGL_ARB_pbuffer ---------------------------- */\r\n\r\n#ifndef WGL_ARB_pbuffer\r\n#define WGL_ARB_pbuffer 1\r\n\r\n#define WGL_DRAW_TO_PBUFFER_ARB 0x202D\r\n#define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E\r\n#define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F\r\n#define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030\r\n#define WGL_PBUFFER_LARGEST_ARB 0x2033\r\n#define WGL_PBUFFER_WIDTH_ARB 0x2034\r\n#define WGL_PBUFFER_HEIGHT_ARB 0x2035\r\n#define WGL_PBUFFER_LOST_ARB 0x2036\r\n\r\nDECLARE_HANDLE(HPBUFFERARB);\r\n\r\ntypedef HPBUFFERARB (WINAPI * PFNWGLCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList);\r\ntypedef BOOL (WINAPI * PFNWGLDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer);\r\ntypedef HDC (WINAPI * PFNWGLGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer);\r\ntypedef BOOL (WINAPI * PFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int* piValue);\r\ntypedef int (WINAPI * PFNWGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC);\r\n\r\n#define wglCreatePbufferARB WGLEW_GET_FUN(__wglewCreatePbufferARB)\r\n#define wglDestroyPbufferARB WGLEW_GET_FUN(__wglewDestroyPbufferARB)\r\n#define wglGetPbufferDCARB WGLEW_GET_FUN(__wglewGetPbufferDCARB)\r\n#define wglQueryPbufferARB WGLEW_GET_FUN(__wglewQueryPbufferARB)\r\n#define wglReleasePbufferDCARB WGLEW_GET_FUN(__wglewReleasePbufferDCARB)\r\n\r\n#define WGLEW_ARB_pbuffer WGLEW_GET_VAR(__WGLEW_ARB_pbuffer)\r\n\r\n#endif /* WGL_ARB_pbuffer */\r\n\r\n/* -------------------------- WGL_ARB_pixel_format ------------------------- */\r\n\r\n#ifndef WGL_ARB_pixel_format\r\n#define WGL_ARB_pixel_format 1\r\n\r\n#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000\r\n#define WGL_DRAW_TO_WINDOW_ARB 0x2001\r\n#define WGL_DRAW_TO_BITMAP_ARB 0x2002\r\n#define WGL_ACCELERATION_ARB 0x2003\r\n#define WGL_NEED_PALETTE_ARB 0x2004\r\n#define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005\r\n#define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006\r\n#define WGL_SWAP_METHOD_ARB 0x2007\r\n#define WGL_NUMBER_OVERLAYS_ARB 0x2008\r\n#define WGL_NUMBER_UNDERLAYS_ARB 0x2009\r\n#define WGL_TRANSPARENT_ARB 0x200A\r\n#define WGL_SHARE_DEPTH_ARB 0x200C\r\n#define WGL_SHARE_STENCIL_ARB 0x200D\r\n#define WGL_SHARE_ACCUM_ARB 0x200E\r\n#define WGL_SUPPORT_GDI_ARB 0x200F\r\n#define WGL_SUPPORT_OPENGL_ARB 0x2010\r\n#define WGL_DOUBLE_BUFFER_ARB 0x2011\r\n#define WGL_STEREO_ARB 0x2012\r\n#define WGL_PIXEL_TYPE_ARB 0x2013\r\n#define WGL_COLOR_BITS_ARB 0x2014\r\n#define WGL_RED_BITS_ARB 0x2015\r\n#define WGL_RED_SHIFT_ARB 0x2016\r\n#define WGL_GREEN_BITS_ARB 0x2017\r\n#define WGL_GREEN_SHIFT_ARB 0x2018\r\n#define WGL_BLUE_BITS_ARB 0x2019\r\n#define WGL_BLUE_SHIFT_ARB 0x201A\r\n#define WGL_ALPHA_BITS_ARB 0x201B\r\n#define WGL_ALPHA_SHIFT_ARB 0x201C\r\n#define WGL_ACCUM_BITS_ARB 0x201D\r\n#define WGL_ACCUM_RED_BITS_ARB 0x201E\r\n#define WGL_ACCUM_GREEN_BITS_ARB 0x201F\r\n#define WGL_ACCUM_BLUE_BITS_ARB 0x2020\r\n#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021\r\n#define WGL_DEPTH_BITS_ARB 0x2022\r\n#define WGL_STENCIL_BITS_ARB 0x2023\r\n#define WGL_AUX_BUFFERS_ARB 0x2024\r\n#define WGL_NO_ACCELERATION_ARB 0x2025\r\n#define WGL_GENERIC_ACCELERATION_ARB 0x2026\r\n#define WGL_FULL_ACCELERATION_ARB 0x2027\r\n#define WGL_SWAP_EXCHANGE_ARB 0x2028\r\n#define WGL_SWAP_COPY_ARB 0x2029\r\n#define WGL_SWAP_UNDEFINED_ARB 0x202A\r\n#define WGL_TYPE_RGBA_ARB 0x202B\r\n#define WGL_TYPE_COLORINDEX_ARB 0x202C\r\n#define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037\r\n#define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038\r\n#define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039\r\n#define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A\r\n#define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B\r\n\r\ntypedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int* piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats);\r\ntypedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, FLOAT *pfValues);\r\ntypedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, int *piValues);\r\n\r\n#define wglChoosePixelFormatARB WGLEW_GET_FUN(__wglewChoosePixelFormatARB)\r\n#define wglGetPixelFormatAttribfvARB WGLEW_GET_FUN(__wglewGetPixelFormatAttribfvARB)\r\n#define wglGetPixelFormatAttribivARB WGLEW_GET_FUN(__wglewGetPixelFormatAttribivARB)\r\n\r\n#define WGLEW_ARB_pixel_format WGLEW_GET_VAR(__WGLEW_ARB_pixel_format)\r\n\r\n#endif /* WGL_ARB_pixel_format */\r\n\r\n/* ----------------------- WGL_ARB_pixel_format_float ---------------------- */\r\n\r\n#ifndef WGL_ARB_pixel_format_float\r\n#define WGL_ARB_pixel_format_float 1\r\n\r\n#define WGL_TYPE_RGBA_FLOAT_ARB 0x21A0\r\n\r\n#define WGLEW_ARB_pixel_format_float WGLEW_GET_VAR(__WGLEW_ARB_pixel_format_float)\r\n\r\n#endif /* WGL_ARB_pixel_format_float */\r\n\r\n/* ------------------------- WGL_ARB_render_texture ------------------------ */\r\n\r\n#ifndef WGL_ARB_render_texture\r\n#define WGL_ARB_render_texture 1\r\n\r\n#define WGL_BIND_TO_TEXTURE_RGB_ARB 0x2070\r\n#define WGL_BIND_TO_TEXTURE_RGBA_ARB 0x2071\r\n#define WGL_TEXTURE_FORMAT_ARB 0x2072\r\n#define WGL_TEXTURE_TARGET_ARB 0x2073\r\n#define WGL_MIPMAP_TEXTURE_ARB 0x2074\r\n#define WGL_TEXTURE_RGB_ARB 0x2075\r\n#define WGL_TEXTURE_RGBA_ARB 0x2076\r\n#define WGL_NO_TEXTURE_ARB 0x2077\r\n#define WGL_TEXTURE_CUBE_MAP_ARB 0x2078\r\n#define WGL_TEXTURE_1D_ARB 0x2079\r\n#define WGL_TEXTURE_2D_ARB 0x207A\r\n#define WGL_MIPMAP_LEVEL_ARB 0x207B\r\n#define WGL_CUBE_MAP_FACE_ARB 0x207C\r\n#define WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x207D\r\n#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x207E\r\n#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x207F\r\n#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x2080\r\n#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x2081\r\n#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x2082\r\n#define WGL_FRONT_LEFT_ARB 0x2083\r\n#define WGL_FRONT_RIGHT_ARB 0x2084\r\n#define WGL_BACK_LEFT_ARB 0x2085\r\n#define WGL_BACK_RIGHT_ARB 0x2086\r\n#define WGL_AUX0_ARB 0x2087\r\n#define WGL_AUX1_ARB 0x2088\r\n#define WGL_AUX2_ARB 0x2089\r\n#define WGL_AUX3_ARB 0x208A\r\n#define WGL_AUX4_ARB 0x208B\r\n#define WGL_AUX5_ARB 0x208C\r\n#define WGL_AUX6_ARB 0x208D\r\n#define WGL_AUX7_ARB 0x208E\r\n#define WGL_AUX8_ARB 0x208F\r\n#define WGL_AUX9_ARB 0x2090\r\n\r\ntypedef BOOL (WINAPI * PFNWGLBINDTEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer);\r\ntypedef BOOL (WINAPI * PFNWGLRELEASETEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer);\r\ntypedef BOOL (WINAPI * PFNWGLSETPBUFFERATTRIBARBPROC) (HPBUFFERARB hPbuffer, const int* piAttribList);\r\n\r\n#define wglBindTexImageARB WGLEW_GET_FUN(__wglewBindTexImageARB)\r\n#define wglReleaseTexImageARB WGLEW_GET_FUN(__wglewReleaseTexImageARB)\r\n#define wglSetPbufferAttribARB WGLEW_GET_FUN(__wglewSetPbufferAttribARB)\r\n\r\n#define WGLEW_ARB_render_texture WGLEW_GET_VAR(__WGLEW_ARB_render_texture)\r\n\r\n#endif /* WGL_ARB_render_texture */\r\n\r\n/* ----------------------- WGL_ATI_pixel_format_float ---------------------- */\r\n\r\n#ifndef WGL_ATI_pixel_format_float\r\n#define WGL_ATI_pixel_format_float 1\r\n\r\n#define WGL_TYPE_RGBA_FLOAT_ATI 0x21A0\r\n#define GL_RGBA_FLOAT_MODE_ATI 0x8820\r\n#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835\r\n\r\n#define WGLEW_ATI_pixel_format_float WGLEW_GET_VAR(__WGLEW_ATI_pixel_format_float)\r\n\r\n#endif /* WGL_ATI_pixel_format_float */\r\n\r\n/* -------------------- WGL_ATI_render_texture_rectangle ------------------- */\r\n\r\n#ifndef WGL_ATI_render_texture_rectangle\r\n#define WGL_ATI_render_texture_rectangle 1\r\n\r\n#define WGL_TEXTURE_RECTANGLE_ATI 0x21A5\r\n\r\n#define WGLEW_ATI_render_texture_rectangle WGLEW_GET_VAR(__WGLEW_ATI_render_texture_rectangle)\r\n\r\n#endif /* WGL_ATI_render_texture_rectangle */\r\n\r\n/* -------------------------- WGL_EXT_depth_float -------------------------- */\r\n\r\n#ifndef WGL_EXT_depth_float\r\n#define WGL_EXT_depth_float 1\r\n\r\n#define WGL_DEPTH_FLOAT_EXT 0x2040\r\n\r\n#define WGLEW_EXT_depth_float WGLEW_GET_VAR(__WGLEW_EXT_depth_float)\r\n\r\n#endif /* WGL_EXT_depth_float */\r\n\r\n/* ---------------------- WGL_EXT_display_color_table ---------------------- */\r\n\r\n#ifndef WGL_EXT_display_color_table\r\n#define WGL_EXT_display_color_table 1\r\n\r\ntypedef GLboolean (WINAPI * PFNWGLBINDDISPLAYCOLORTABLEEXTPROC) (GLushort id);\r\ntypedef GLboolean (WINAPI * PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC) (GLushort id);\r\ntypedef void (WINAPI * PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC) (GLushort id);\r\ntypedef GLboolean (WINAPI * PFNWGLLOADDISPLAYCOLORTABLEEXTPROC) (GLushort* table, GLuint length);\r\n\r\n#define wglBindDisplayColorTableEXT WGLEW_GET_FUN(__wglewBindDisplayColorTableEXT)\r\n#define wglCreateDisplayColorTableEXT WGLEW_GET_FUN(__wglewCreateDisplayColorTableEXT)\r\n#define wglDestroyDisplayColorTableEXT WGLEW_GET_FUN(__wglewDestroyDisplayColorTableEXT)\r\n#define wglLoadDisplayColorTableEXT WGLEW_GET_FUN(__wglewLoadDisplayColorTableEXT)\r\n\r\n#define WGLEW_EXT_display_color_table WGLEW_GET_VAR(__WGLEW_EXT_display_color_table)\r\n\r\n#endif /* WGL_EXT_display_color_table */\r\n\r\n/* ----------------------- WGL_EXT_extensions_string ----------------------- */\r\n\r\n#ifndef WGL_EXT_extensions_string\r\n#define WGL_EXT_extensions_string 1\r\n\r\ntypedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGEXTPROC) (void);\r\n\r\n#define wglGetExtensionsStringEXT WGLEW_GET_FUN(__wglewGetExtensionsStringEXT)\r\n\r\n#define WGLEW_EXT_extensions_string WGLEW_GET_VAR(__WGLEW_EXT_extensions_string)\r\n\r\n#endif /* WGL_EXT_extensions_string */\r\n\r\n/* ------------------------ WGL_EXT_framebuffer_sRGB ----------------------- */\r\n\r\n#ifndef WGL_EXT_framebuffer_sRGB\r\n#define WGL_EXT_framebuffer_sRGB 1\r\n\r\n#define WGL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20A9\r\n\r\n#define WGLEW_EXT_framebuffer_sRGB WGLEW_GET_VAR(__WGLEW_EXT_framebuffer_sRGB)\r\n\r\n#endif /* WGL_EXT_framebuffer_sRGB */\r\n\r\n/* ----------------------- WGL_EXT_make_current_read ----------------------- */\r\n\r\n#ifndef WGL_EXT_make_current_read\r\n#define WGL_EXT_make_current_read 1\r\n\r\n#define ERROR_INVALID_PIXEL_TYPE_EXT 0x2043\r\n\r\ntypedef HDC (WINAPI * PFNWGLGETCURRENTREADDCEXTPROC) (VOID);\r\ntypedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTEXTPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc);\r\n\r\n#define wglGetCurrentReadDCEXT WGLEW_GET_FUN(__wglewGetCurrentReadDCEXT)\r\n#define wglMakeContextCurrentEXT WGLEW_GET_FUN(__wglewMakeContextCurrentEXT)\r\n\r\n#define WGLEW_EXT_make_current_read WGLEW_GET_VAR(__WGLEW_EXT_make_current_read)\r\n\r\n#endif /* WGL_EXT_make_current_read */\r\n\r\n/* -------------------------- WGL_EXT_multisample -------------------------- */\r\n\r\n#ifndef WGL_EXT_multisample\r\n#define WGL_EXT_multisample 1\r\n\r\n#define WGL_SAMPLE_BUFFERS_EXT 0x2041\r\n#define WGL_SAMPLES_EXT 0x2042\r\n\r\n#define WGLEW_EXT_multisample WGLEW_GET_VAR(__WGLEW_EXT_multisample)\r\n\r\n#endif /* WGL_EXT_multisample */\r\n\r\n/* ---------------------------- WGL_EXT_pbuffer ---------------------------- */\r\n\r\n#ifndef WGL_EXT_pbuffer\r\n#define WGL_EXT_pbuffer 1\r\n\r\n#define WGL_DRAW_TO_PBUFFER_EXT 0x202D\r\n#define WGL_MAX_PBUFFER_PIXELS_EXT 0x202E\r\n#define WGL_MAX_PBUFFER_WIDTH_EXT 0x202F\r\n#define WGL_MAX_PBUFFER_HEIGHT_EXT 0x2030\r\n#define WGL_OPTIMAL_PBUFFER_WIDTH_EXT 0x2031\r\n#define WGL_OPTIMAL_PBUFFER_HEIGHT_EXT 0x2032\r\n#define WGL_PBUFFER_LARGEST_EXT 0x2033\r\n#define WGL_PBUFFER_WIDTH_EXT 0x2034\r\n#define WGL_PBUFFER_HEIGHT_EXT 0x2035\r\n\r\nDECLARE_HANDLE(HPBUFFEREXT);\r\n\r\ntypedef HPBUFFEREXT (WINAPI * PFNWGLCREATEPBUFFEREXTPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList);\r\ntypedef BOOL (WINAPI * PFNWGLDESTROYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer);\r\ntypedef HDC (WINAPI * PFNWGLGETPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer);\r\ntypedef BOOL (WINAPI * PFNWGLQUERYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer, int iAttribute, int* piValue);\r\ntypedef int (WINAPI * PFNWGLRELEASEPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer, HDC hDC);\r\n\r\n#define wglCreatePbufferEXT WGLEW_GET_FUN(__wglewCreatePbufferEXT)\r\n#define wglDestroyPbufferEXT WGLEW_GET_FUN(__wglewDestroyPbufferEXT)\r\n#define wglGetPbufferDCEXT WGLEW_GET_FUN(__wglewGetPbufferDCEXT)\r\n#define wglQueryPbufferEXT WGLEW_GET_FUN(__wglewQueryPbufferEXT)\r\n#define wglReleasePbufferDCEXT WGLEW_GET_FUN(__wglewReleasePbufferDCEXT)\r\n\r\n#define WGLEW_EXT_pbuffer WGLEW_GET_VAR(__WGLEW_EXT_pbuffer)\r\n\r\n#endif /* WGL_EXT_pbuffer */\r\n\r\n/* -------------------------- WGL_EXT_pixel_format ------------------------- */\r\n\r\n#ifndef WGL_EXT_pixel_format\r\n#define WGL_EXT_pixel_format 1\r\n\r\n#define WGL_NUMBER_PIXEL_FORMATS_EXT 0x2000\r\n#define WGL_DRAW_TO_WINDOW_EXT 0x2001\r\n#define WGL_DRAW_TO_BITMAP_EXT 0x2002\r\n#define WGL_ACCELERATION_EXT 0x2003\r\n#define WGL_NEED_PALETTE_EXT 0x2004\r\n#define WGL_NEED_SYSTEM_PALETTE_EXT 0x2005\r\n#define WGL_SWAP_LAYER_BUFFERS_EXT 0x2006\r\n#define WGL_SWAP_METHOD_EXT 0x2007\r\n#define WGL_NUMBER_OVERLAYS_EXT 0x2008\r\n#define WGL_NUMBER_UNDERLAYS_EXT 0x2009\r\n#define WGL_TRANSPARENT_EXT 0x200A\r\n#define WGL_TRANSPARENT_VALUE_EXT 0x200B\r\n#define WGL_SHARE_DEPTH_EXT 0x200C\r\n#define WGL_SHARE_STENCIL_EXT 0x200D\r\n#define WGL_SHARE_ACCUM_EXT 0x200E\r\n#define WGL_SUPPORT_GDI_EXT 0x200F\r\n#define WGL_SUPPORT_OPENGL_EXT 0x2010\r\n#define WGL_DOUBLE_BUFFER_EXT 0x2011\r\n#define WGL_STEREO_EXT 0x2012\r\n#define WGL_PIXEL_TYPE_EXT 0x2013\r\n#define WGL_COLOR_BITS_EXT 0x2014\r\n#define WGL_RED_BITS_EXT 0x2015\r\n#define WGL_RED_SHIFT_EXT 0x2016\r\n#define WGL_GREEN_BITS_EXT 0x2017\r\n#define WGL_GREEN_SHIFT_EXT 0x2018\r\n#define WGL_BLUE_BITS_EXT 0x2019\r\n#define WGL_BLUE_SHIFT_EXT 0x201A\r\n#define WGL_ALPHA_BITS_EXT 0x201B\r\n#define WGL_ALPHA_SHIFT_EXT 0x201C\r\n#define WGL_ACCUM_BITS_EXT 0x201D\r\n#define WGL_ACCUM_RED_BITS_EXT 0x201E\r\n#define WGL_ACCUM_GREEN_BITS_EXT 0x201F\r\n#define WGL_ACCUM_BLUE_BITS_EXT 0x2020\r\n#define WGL_ACCUM_ALPHA_BITS_EXT 0x2021\r\n#define WGL_DEPTH_BITS_EXT 0x2022\r\n#define WGL_STENCIL_BITS_EXT 0x2023\r\n#define WGL_AUX_BUFFERS_EXT 0x2024\r\n#define WGL_NO_ACCELERATION_EXT 0x2025\r\n#define WGL_GENERIC_ACCELERATION_EXT 0x2026\r\n#define WGL_FULL_ACCELERATION_EXT 0x2027\r\n#define WGL_SWAP_EXCHANGE_EXT 0x2028\r\n#define WGL_SWAP_COPY_EXT 0x2029\r\n#define WGL_SWAP_UNDEFINED_EXT 0x202A\r\n#define WGL_TYPE_RGBA_EXT 0x202B\r\n#define WGL_TYPE_COLORINDEX_EXT 0x202C\r\n\r\ntypedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATEXTPROC) (HDC hdc, const int* piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats);\r\ntypedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, FLOAT *pfValues);\r\ntypedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, int *piValues);\r\n\r\n#define wglChoosePixelFormatEXT WGLEW_GET_FUN(__wglewChoosePixelFormatEXT)\r\n#define wglGetPixelFormatAttribfvEXT WGLEW_GET_FUN(__wglewGetPixelFormatAttribfvEXT)\r\n#define wglGetPixelFormatAttribivEXT WGLEW_GET_FUN(__wglewGetPixelFormatAttribivEXT)\r\n\r\n#define WGLEW_EXT_pixel_format WGLEW_GET_VAR(__WGLEW_EXT_pixel_format)\r\n\r\n#endif /* WGL_EXT_pixel_format */\r\n\r\n/* ------------------- WGL_EXT_pixel_format_packed_float ------------------- */\r\n\r\n#ifndef WGL_EXT_pixel_format_packed_float\r\n#define WGL_EXT_pixel_format_packed_float 1\r\n\r\n#define WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT 0x20A8\r\n\r\n#define WGLEW_EXT_pixel_format_packed_float WGLEW_GET_VAR(__WGLEW_EXT_pixel_format_packed_float)\r\n\r\n#endif /* WGL_EXT_pixel_format_packed_float */\r\n\r\n/* -------------------------- WGL_EXT_swap_control ------------------------- */\r\n\r\n#ifndef WGL_EXT_swap_control\r\n#define WGL_EXT_swap_control 1\r\n\r\ntypedef int (WINAPI * PFNWGLGETSWAPINTERVALEXTPROC) (void);\r\ntypedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC) (int interval);\r\n\r\n#define wglGetSwapIntervalEXT WGLEW_GET_FUN(__wglewGetSwapIntervalEXT)\r\n#define wglSwapIntervalEXT WGLEW_GET_FUN(__wglewSwapIntervalEXT)\r\n\r\n#define WGLEW_EXT_swap_control WGLEW_GET_VAR(__WGLEW_EXT_swap_control)\r\n\r\n#endif /* WGL_EXT_swap_control */\r\n\r\n/* --------------------- WGL_I3D_digital_video_control --------------------- */\r\n\r\n#ifndef WGL_I3D_digital_video_control\r\n#define WGL_I3D_digital_video_control 1\r\n\r\n#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_FRAMEBUFFER_I3D 0x2050\r\n#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_VALUE_I3D 0x2051\r\n#define WGL_DIGITAL_VIDEO_CURSOR_INCLUDED_I3D 0x2052\r\n#define WGL_DIGITAL_VIDEO_GAMMA_CORRECTED_I3D 0x2053\r\n\r\ntypedef BOOL (WINAPI * PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int* piValue);\r\ntypedef BOOL (WINAPI * PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int* piValue);\r\n\r\n#define wglGetDigitalVideoParametersI3D WGLEW_GET_FUN(__wglewGetDigitalVideoParametersI3D)\r\n#define wglSetDigitalVideoParametersI3D WGLEW_GET_FUN(__wglewSetDigitalVideoParametersI3D)\r\n\r\n#define WGLEW_I3D_digital_video_control WGLEW_GET_VAR(__WGLEW_I3D_digital_video_control)\r\n\r\n#endif /* WGL_I3D_digital_video_control */\r\n\r\n/* ----------------------------- WGL_I3D_gamma ----------------------------- */\r\n\r\n#ifndef WGL_I3D_gamma\r\n#define WGL_I3D_gamma 1\r\n\r\n#define WGL_GAMMA_TABLE_SIZE_I3D 0x204E\r\n#define WGL_GAMMA_EXCLUDE_DESKTOP_I3D 0x204F\r\n\r\ntypedef BOOL (WINAPI * PFNWGLGETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, USHORT* puRed, USHORT *puGreen, USHORT *puBlue);\r\ntypedef BOOL (WINAPI * PFNWGLGETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int* piValue);\r\ntypedef BOOL (WINAPI * PFNWGLSETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, const USHORT* puRed, const USHORT *puGreen, const USHORT *puBlue);\r\ntypedef BOOL (WINAPI * PFNWGLSETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int* piValue);\r\n\r\n#define wglGetGammaTableI3D WGLEW_GET_FUN(__wglewGetGammaTableI3D)\r\n#define wglGetGammaTableParametersI3D WGLEW_GET_FUN(__wglewGetGammaTableParametersI3D)\r\n#define wglSetGammaTableI3D WGLEW_GET_FUN(__wglewSetGammaTableI3D)\r\n#define wglSetGammaTableParametersI3D WGLEW_GET_FUN(__wglewSetGammaTableParametersI3D)\r\n\r\n#define WGLEW_I3D_gamma WGLEW_GET_VAR(__WGLEW_I3D_gamma)\r\n\r\n#endif /* WGL_I3D_gamma */\r\n\r\n/* ---------------------------- WGL_I3D_genlock ---------------------------- */\r\n\r\n#ifndef WGL_I3D_genlock\r\n#define WGL_I3D_genlock 1\r\n\r\n#define WGL_GENLOCK_SOURCE_MULTIVIEW_I3D 0x2044\r\n#define WGL_GENLOCK_SOURCE_EXTERNAL_SYNC_I3D 0x2045\r\n#define WGL_GENLOCK_SOURCE_EXTERNAL_FIELD_I3D 0x2046\r\n#define WGL_GENLOCK_SOURCE_EXTERNAL_TTL_I3D 0x2047\r\n#define WGL_GENLOCK_SOURCE_DIGITAL_SYNC_I3D 0x2048\r\n#define WGL_GENLOCK_SOURCE_DIGITAL_FIELD_I3D 0x2049\r\n#define WGL_GENLOCK_SOURCE_EDGE_FALLING_I3D 0x204A\r\n#define WGL_GENLOCK_SOURCE_EDGE_RISING_I3D 0x204B\r\n#define WGL_GENLOCK_SOURCE_EDGE_BOTH_I3D 0x204C\r\n\r\ntypedef BOOL (WINAPI * PFNWGLDISABLEGENLOCKI3DPROC) (HDC hDC);\r\ntypedef BOOL (WINAPI * PFNWGLENABLEGENLOCKI3DPROC) (HDC hDC);\r\ntypedef BOOL (WINAPI * PFNWGLGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT uRate);\r\ntypedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT uDelay);\r\ntypedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT uEdge);\r\ntypedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEI3DPROC) (HDC hDC, UINT uSource);\r\ntypedef BOOL (WINAPI * PFNWGLGETGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT* uRate);\r\ntypedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT* uDelay);\r\ntypedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT* uEdge);\r\ntypedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEI3DPROC) (HDC hDC, UINT* uSource);\r\ntypedef BOOL (WINAPI * PFNWGLISENABLEDGENLOCKI3DPROC) (HDC hDC, BOOL* pFlag);\r\ntypedef BOOL (WINAPI * PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC) (HDC hDC, UINT* uMaxLineDelay, UINT *uMaxPixelDelay);\r\n\r\n#define wglDisableGenlockI3D WGLEW_GET_FUN(__wglewDisableGenlockI3D)\r\n#define wglEnableGenlockI3D WGLEW_GET_FUN(__wglewEnableGenlockI3D)\r\n#define wglGenlockSampleRateI3D WGLEW_GET_FUN(__wglewGenlockSampleRateI3D)\r\n#define wglGenlockSourceDelayI3D WGLEW_GET_FUN(__wglewGenlockSourceDelayI3D)\r\n#define wglGenlockSourceEdgeI3D WGLEW_GET_FUN(__wglewGenlockSourceEdgeI3D)\r\n#define wglGenlockSourceI3D WGLEW_GET_FUN(__wglewGenlockSourceI3D)\r\n#define wglGetGenlockSampleRateI3D WGLEW_GET_FUN(__wglewGetGenlockSampleRateI3D)\r\n#define wglGetGenlockSourceDelayI3D WGLEW_GET_FUN(__wglewGetGenlockSourceDelayI3D)\r\n#define wglGetGenlockSourceEdgeI3D WGLEW_GET_FUN(__wglewGetGenlockSourceEdgeI3D)\r\n#define wglGetGenlockSourceI3D WGLEW_GET_FUN(__wglewGetGenlockSourceI3D)\r\n#define wglIsEnabledGenlockI3D WGLEW_GET_FUN(__wglewIsEnabledGenlockI3D)\r\n#define wglQueryGenlockMaxSourceDelayI3D WGLEW_GET_FUN(__wglewQueryGenlockMaxSourceDelayI3D)\r\n\r\n#define WGLEW_I3D_genlock WGLEW_GET_VAR(__WGLEW_I3D_genlock)\r\n\r\n#endif /* WGL_I3D_genlock */\r\n\r\n/* -------------------------- WGL_I3D_image_buffer ------------------------- */\r\n\r\n#ifndef WGL_I3D_image_buffer\r\n#define WGL_I3D_image_buffer 1\r\n\r\n#define WGL_IMAGE_BUFFER_MIN_ACCESS_I3D 0x00000001\r\n#define WGL_IMAGE_BUFFER_LOCK_I3D 0x00000002\r\n\r\ntypedef BOOL (WINAPI * PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC) (HDC hdc, HANDLE* pEvent, LPVOID *pAddress, DWORD *pSize, UINT count);\r\ntypedef LPVOID (WINAPI * PFNWGLCREATEIMAGEBUFFERI3DPROC) (HDC hDC, DWORD dwSize, UINT uFlags);\r\ntypedef BOOL (WINAPI * PFNWGLDESTROYIMAGEBUFFERI3DPROC) (HDC hDC, LPVOID pAddress);\r\ntypedef BOOL (WINAPI * PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC) (HDC hdc, LPVOID* pAddress, UINT count);\r\n\r\n#define wglAssociateImageBufferEventsI3D WGLEW_GET_FUN(__wglewAssociateImageBufferEventsI3D)\r\n#define wglCreateImageBufferI3D WGLEW_GET_FUN(__wglewCreateImageBufferI3D)\r\n#define wglDestroyImageBufferI3D WGLEW_GET_FUN(__wglewDestroyImageBufferI3D)\r\n#define wglReleaseImageBufferEventsI3D WGLEW_GET_FUN(__wglewReleaseImageBufferEventsI3D)\r\n\r\n#define WGLEW_I3D_image_buffer WGLEW_GET_VAR(__WGLEW_I3D_image_buffer)\r\n\r\n#endif /* WGL_I3D_image_buffer */\r\n\r\n/* ------------------------ WGL_I3D_swap_frame_lock ------------------------ */\r\n\r\n#ifndef WGL_I3D_swap_frame_lock\r\n#define WGL_I3D_swap_frame_lock 1\r\n\r\ntypedef BOOL (WINAPI * PFNWGLDISABLEFRAMELOCKI3DPROC) (VOID);\r\ntypedef BOOL (WINAPI * PFNWGLENABLEFRAMELOCKI3DPROC) (VOID);\r\ntypedef BOOL (WINAPI * PFNWGLISENABLEDFRAMELOCKI3DPROC) (BOOL* pFlag);\r\ntypedef BOOL (WINAPI * PFNWGLQUERYFRAMELOCKMASTERI3DPROC) (BOOL* pFlag);\r\n\r\n#define wglDisableFrameLockI3D WGLEW_GET_FUN(__wglewDisableFrameLockI3D)\r\n#define wglEnableFrameLockI3D WGLEW_GET_FUN(__wglewEnableFrameLockI3D)\r\n#define wglIsEnabledFrameLockI3D WGLEW_GET_FUN(__wglewIsEnabledFrameLockI3D)\r\n#define wglQueryFrameLockMasterI3D WGLEW_GET_FUN(__wglewQueryFrameLockMasterI3D)\r\n\r\n#define WGLEW_I3D_swap_frame_lock WGLEW_GET_VAR(__WGLEW_I3D_swap_frame_lock)\r\n\r\n#endif /* WGL_I3D_swap_frame_lock */\r\n\r\n/* ------------------------ WGL_I3D_swap_frame_usage ----------------------- */\r\n\r\n#ifndef WGL_I3D_swap_frame_usage\r\n#define WGL_I3D_swap_frame_usage 1\r\n\r\ntypedef BOOL (WINAPI * PFNWGLBEGINFRAMETRACKINGI3DPROC) (void);\r\ntypedef BOOL (WINAPI * PFNWGLENDFRAMETRACKINGI3DPROC) (void);\r\ntypedef BOOL (WINAPI * PFNWGLGETFRAMEUSAGEI3DPROC) (float* pUsage);\r\ntypedef BOOL (WINAPI * PFNWGLQUERYFRAMETRACKINGI3DPROC) (DWORD* pFrameCount, DWORD *pMissedFrames, float *pLastMissedUsage);\r\n\r\n#define wglBeginFrameTrackingI3D WGLEW_GET_FUN(__wglewBeginFrameTrackingI3D)\r\n#define wglEndFrameTrackingI3D WGLEW_GET_FUN(__wglewEndFrameTrackingI3D)\r\n#define wglGetFrameUsageI3D WGLEW_GET_FUN(__wglewGetFrameUsageI3D)\r\n#define wglQueryFrameTrackingI3D WGLEW_GET_FUN(__wglewQueryFrameTrackingI3D)\r\n\r\n#define WGLEW_I3D_swap_frame_usage WGLEW_GET_VAR(__WGLEW_I3D_swap_frame_usage)\r\n\r\n#endif /* WGL_I3D_swap_frame_usage */\r\n\r\n/* --------------------------- WGL_NV_copy_image --------------------------- */\r\n\r\n#ifndef WGL_NV_copy_image\r\n#define WGL_NV_copy_image 1\r\n\r\ntypedef BOOL (WINAPI * PFNWGLCOPYIMAGESUBDATANVPROC) (HGLRC hSrcRC, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, HGLRC hDstRC, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth);\r\n\r\n#define wglCopyImageSubDataNV WGLEW_GET_FUN(__wglewCopyImageSubDataNV)\r\n\r\n#define WGLEW_NV_copy_image WGLEW_GET_VAR(__WGLEW_NV_copy_image)\r\n\r\n#endif /* WGL_NV_copy_image */\r\n\r\n/* -------------------------- WGL_NV_float_buffer -------------------------- */\r\n\r\n#ifndef WGL_NV_float_buffer\r\n#define WGL_NV_float_buffer 1\r\n\r\n#define WGL_FLOAT_COMPONENTS_NV 0x20B0\r\n#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV 0x20B1\r\n#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV 0x20B2\r\n#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV 0x20B3\r\n#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV 0x20B4\r\n#define WGL_TEXTURE_FLOAT_R_NV 0x20B5\r\n#define WGL_TEXTURE_FLOAT_RG_NV 0x20B6\r\n#define WGL_TEXTURE_FLOAT_RGB_NV 0x20B7\r\n#define WGL_TEXTURE_FLOAT_RGBA_NV 0x20B8\r\n\r\n#define WGLEW_NV_float_buffer WGLEW_GET_VAR(__WGLEW_NV_float_buffer)\r\n\r\n#endif /* WGL_NV_float_buffer */\r\n\r\n/* -------------------------- WGL_NV_gpu_affinity -------------------------- */\r\n\r\n#ifndef WGL_NV_gpu_affinity\r\n#define WGL_NV_gpu_affinity 1\r\n\r\n#define WGL_ERROR_INCOMPATIBLE_AFFINITY_MASKS_NV 0x20D0\r\n#define WGL_ERROR_MISSING_AFFINITY_MASK_NV 0x20D1\r\n\r\nDECLARE_HANDLE(HGPUNV);\r\ntypedef struct _GPU_DEVICE {\r\n  DWORD cb; \r\n  CHAR DeviceName[32]; \r\n  CHAR DeviceString[128]; \r\n  DWORD Flags; \r\n  RECT rcVirtualScreen; \r\n} GPU_DEVICE, *PGPU_DEVICE;\r\n\r\ntypedef HDC (WINAPI * PFNWGLCREATEAFFINITYDCNVPROC) (const HGPUNV *phGpuList);\r\ntypedef BOOL (WINAPI * PFNWGLDELETEDCNVPROC) (HDC hdc);\r\ntypedef BOOL (WINAPI * PFNWGLENUMGPUDEVICESNVPROC) (HGPUNV hGpu, UINT iDeviceIndex, PGPU_DEVICE lpGpuDevice);\r\ntypedef BOOL (WINAPI * PFNWGLENUMGPUSFROMAFFINITYDCNVPROC) (HDC hAffinityDC, UINT iGpuIndex, HGPUNV *hGpu);\r\ntypedef BOOL (WINAPI * PFNWGLENUMGPUSNVPROC) (UINT iGpuIndex, HGPUNV *phGpu);\r\n\r\n#define wglCreateAffinityDCNV WGLEW_GET_FUN(__wglewCreateAffinityDCNV)\r\n#define wglDeleteDCNV WGLEW_GET_FUN(__wglewDeleteDCNV)\r\n#define wglEnumGpuDevicesNV WGLEW_GET_FUN(__wglewEnumGpuDevicesNV)\r\n#define wglEnumGpusFromAffinityDCNV WGLEW_GET_FUN(__wglewEnumGpusFromAffinityDCNV)\r\n#define wglEnumGpusNV WGLEW_GET_FUN(__wglewEnumGpusNV)\r\n\r\n#define WGLEW_NV_gpu_affinity WGLEW_GET_VAR(__WGLEW_NV_gpu_affinity)\r\n\r\n#endif /* WGL_NV_gpu_affinity */\r\n\r\n/* -------------------------- WGL_NV_present_video ------------------------- */\r\n\r\n#ifndef WGL_NV_present_video\r\n#define WGL_NV_present_video 1\r\n\r\n#define WGL_NUM_VIDEO_SLOTS_NV 0x20F0\r\n\r\nDECLARE_HANDLE(HVIDEOOUTPUTDEVICENV);\r\n\r\ntypedef BOOL (WINAPI * PFNWGLBINDVIDEODEVICENVPROC) (HDC hDc, unsigned int uVideoSlot, HVIDEOOUTPUTDEVICENV hVideoDevice, const int* piAttribList);\r\ntypedef int (WINAPI * PFNWGLENUMERATEVIDEODEVICESNVPROC) (HDC hDc, HVIDEOOUTPUTDEVICENV* phDeviceList);\r\ntypedef BOOL (WINAPI * PFNWGLQUERYCURRENTCONTEXTNVPROC) (int iAttribute, int* piValue);\r\n\r\n#define wglBindVideoDeviceNV WGLEW_GET_FUN(__wglewBindVideoDeviceNV)\r\n#define wglEnumerateVideoDevicesNV WGLEW_GET_FUN(__wglewEnumerateVideoDevicesNV)\r\n#define wglQueryCurrentContextNV WGLEW_GET_FUN(__wglewQueryCurrentContextNV)\r\n\r\n#define WGLEW_NV_present_video WGLEW_GET_VAR(__WGLEW_NV_present_video)\r\n\r\n#endif /* WGL_NV_present_video */\r\n\r\n/* ---------------------- WGL_NV_render_depth_texture ---------------------- */\r\n\r\n#ifndef WGL_NV_render_depth_texture\r\n#define WGL_NV_render_depth_texture 1\r\n\r\n#define WGL_NO_TEXTURE_ARB 0x2077\r\n#define WGL_BIND_TO_TEXTURE_DEPTH_NV 0x20A3\r\n#define WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV 0x20A4\r\n#define WGL_DEPTH_TEXTURE_FORMAT_NV 0x20A5\r\n#define WGL_TEXTURE_DEPTH_COMPONENT_NV 0x20A6\r\n#define WGL_DEPTH_COMPONENT_NV 0x20A7\r\n\r\n#define WGLEW_NV_render_depth_texture WGLEW_GET_VAR(__WGLEW_NV_render_depth_texture)\r\n\r\n#endif /* WGL_NV_render_depth_texture */\r\n\r\n/* -------------------- WGL_NV_render_texture_rectangle -------------------- */\r\n\r\n#ifndef WGL_NV_render_texture_rectangle\r\n#define WGL_NV_render_texture_rectangle 1\r\n\r\n#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV 0x20A0\r\n#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV 0x20A1\r\n#define WGL_TEXTURE_RECTANGLE_NV 0x20A2\r\n\r\n#define WGLEW_NV_render_texture_rectangle WGLEW_GET_VAR(__WGLEW_NV_render_texture_rectangle)\r\n\r\n#endif /* WGL_NV_render_texture_rectangle */\r\n\r\n/* --------------------------- WGL_NV_swap_group --------------------------- */\r\n\r\n#ifndef WGL_NV_swap_group\r\n#define WGL_NV_swap_group 1\r\n\r\ntypedef BOOL (WINAPI * PFNWGLBINDSWAPBARRIERNVPROC) (GLuint group, GLuint barrier);\r\ntypedef BOOL (WINAPI * PFNWGLJOINSWAPGROUPNVPROC) (HDC hDC, GLuint group);\r\ntypedef BOOL (WINAPI * PFNWGLQUERYFRAMECOUNTNVPROC) (HDC hDC, GLuint* count);\r\ntypedef BOOL (WINAPI * PFNWGLQUERYMAXSWAPGROUPSNVPROC) (HDC hDC, GLuint* maxGroups, GLuint *maxBarriers);\r\ntypedef BOOL (WINAPI * PFNWGLQUERYSWAPGROUPNVPROC) (HDC hDC, GLuint* group, GLuint *barrier);\r\ntypedef BOOL (WINAPI * PFNWGLRESETFRAMECOUNTNVPROC) (HDC hDC);\r\n\r\n#define wglBindSwapBarrierNV WGLEW_GET_FUN(__wglewBindSwapBarrierNV)\r\n#define wglJoinSwapGroupNV WGLEW_GET_FUN(__wglewJoinSwapGroupNV)\r\n#define wglQueryFrameCountNV WGLEW_GET_FUN(__wglewQueryFrameCountNV)\r\n#define wglQueryMaxSwapGroupsNV WGLEW_GET_FUN(__wglewQueryMaxSwapGroupsNV)\r\n#define wglQuerySwapGroupNV WGLEW_GET_FUN(__wglewQuerySwapGroupNV)\r\n#define wglResetFrameCountNV WGLEW_GET_FUN(__wglewResetFrameCountNV)\r\n\r\n#define WGLEW_NV_swap_group WGLEW_GET_VAR(__WGLEW_NV_swap_group)\r\n\r\n#endif /* WGL_NV_swap_group */\r\n\r\n/* ----------------------- WGL_NV_vertex_array_range ----------------------- */\r\n\r\n#ifndef WGL_NV_vertex_array_range\r\n#define WGL_NV_vertex_array_range 1\r\n\r\ntypedef void * (WINAPI * PFNWGLALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority);\r\ntypedef void (WINAPI * PFNWGLFREEMEMORYNVPROC) (void *pointer);\r\n\r\n#define wglAllocateMemoryNV WGLEW_GET_FUN(__wglewAllocateMemoryNV)\r\n#define wglFreeMemoryNV WGLEW_GET_FUN(__wglewFreeMemoryNV)\r\n\r\n#define WGLEW_NV_vertex_array_range WGLEW_GET_VAR(__WGLEW_NV_vertex_array_range)\r\n\r\n#endif /* WGL_NV_vertex_array_range */\r\n\r\n/* -------------------------- WGL_NV_video_output -------------------------- */\r\n\r\n#ifndef WGL_NV_video_output\r\n#define WGL_NV_video_output 1\r\n\r\n#define WGL_BIND_TO_VIDEO_RGB_NV 0x20C0\r\n#define WGL_BIND_TO_VIDEO_RGBA_NV 0x20C1\r\n#define WGL_BIND_TO_VIDEO_RGB_AND_DEPTH_NV 0x20C2\r\n#define WGL_VIDEO_OUT_COLOR_NV 0x20C3\r\n#define WGL_VIDEO_OUT_ALPHA_NV 0x20C4\r\n#define WGL_VIDEO_OUT_DEPTH_NV 0x20C5\r\n#define WGL_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6\r\n#define WGL_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7\r\n#define WGL_VIDEO_OUT_FRAME 0x20C8\r\n#define WGL_VIDEO_OUT_FIELD_1 0x20C9\r\n#define WGL_VIDEO_OUT_FIELD_2 0x20CA\r\n#define WGL_VIDEO_OUT_STACKED_FIELDS_1_2 0x20CB\r\n#define WGL_VIDEO_OUT_STACKED_FIELDS_2_1 0x20CC\r\n\r\nDECLARE_HANDLE(HPVIDEODEV);\r\n\r\ntypedef BOOL (WINAPI * PFNWGLBINDVIDEOIMAGENVPROC) (HPVIDEODEV hVideoDevice, HPBUFFERARB hPbuffer, int iVideoBuffer);\r\ntypedef BOOL (WINAPI * PFNWGLGETVIDEODEVICENVPROC) (HDC hDC, int numDevices, HPVIDEODEV* hVideoDevice);\r\ntypedef BOOL (WINAPI * PFNWGLGETVIDEOINFONVPROC) (HPVIDEODEV hpVideoDevice, unsigned long* pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo);\r\ntypedef BOOL (WINAPI * PFNWGLRELEASEVIDEODEVICENVPROC) (HPVIDEODEV hVideoDevice);\r\ntypedef BOOL (WINAPI * PFNWGLRELEASEVIDEOIMAGENVPROC) (HPBUFFERARB hPbuffer, int iVideoBuffer);\r\ntypedef BOOL (WINAPI * PFNWGLSENDPBUFFERTOVIDEONVPROC) (HPBUFFERARB hPbuffer, int iBufferType, unsigned long* pulCounterPbuffer, BOOL bBlock);\r\n\r\n#define wglBindVideoImageNV WGLEW_GET_FUN(__wglewBindVideoImageNV)\r\n#define wglGetVideoDeviceNV WGLEW_GET_FUN(__wglewGetVideoDeviceNV)\r\n#define wglGetVideoInfoNV WGLEW_GET_FUN(__wglewGetVideoInfoNV)\r\n#define wglReleaseVideoDeviceNV WGLEW_GET_FUN(__wglewReleaseVideoDeviceNV)\r\n#define wglReleaseVideoImageNV WGLEW_GET_FUN(__wglewReleaseVideoImageNV)\r\n#define wglSendPbufferToVideoNV WGLEW_GET_FUN(__wglewSendPbufferToVideoNV)\r\n\r\n#define WGLEW_NV_video_output WGLEW_GET_VAR(__WGLEW_NV_video_output)\r\n\r\n#endif /* WGL_NV_video_output */\r\n\r\n/* -------------------------- WGL_OML_sync_control ------------------------- */\r\n\r\n#ifndef WGL_OML_sync_control\r\n#define WGL_OML_sync_control 1\r\n\r\ntypedef BOOL (WINAPI * PFNWGLGETMSCRATEOMLPROC) (HDC hdc, INT32* numerator, INT32 *denominator);\r\ntypedef BOOL (WINAPI * PFNWGLGETSYNCVALUESOMLPROC) (HDC hdc, INT64* ust, INT64 *msc, INT64 *sbc);\r\ntypedef INT64 (WINAPI * PFNWGLSWAPBUFFERSMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder);\r\ntypedef INT64 (WINAPI * PFNWGLSWAPLAYERBUFFERSMSCOMLPROC) (HDC hdc, INT fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder);\r\ntypedef BOOL (WINAPI * PFNWGLWAITFORMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64* ust, INT64 *msc, INT64 *sbc);\r\ntypedef BOOL (WINAPI * PFNWGLWAITFORSBCOMLPROC) (HDC hdc, INT64 target_sbc, INT64* ust, INT64 *msc, INT64 *sbc);\r\n\r\n#define wglGetMscRateOML WGLEW_GET_FUN(__wglewGetMscRateOML)\r\n#define wglGetSyncValuesOML WGLEW_GET_FUN(__wglewGetSyncValuesOML)\r\n#define wglSwapBuffersMscOML WGLEW_GET_FUN(__wglewSwapBuffersMscOML)\r\n#define wglSwapLayerBuffersMscOML WGLEW_GET_FUN(__wglewSwapLayerBuffersMscOML)\r\n#define wglWaitForMscOML WGLEW_GET_FUN(__wglewWaitForMscOML)\r\n#define wglWaitForSbcOML WGLEW_GET_FUN(__wglewWaitForSbcOML)\r\n\r\n#define WGLEW_OML_sync_control WGLEW_GET_VAR(__WGLEW_OML_sync_control)\r\n\r\n#endif /* WGL_OML_sync_control */\r\n\r\n/* ------------------------------------------------------------------------- */\r\n\r\n#ifdef GLEW_MX\r\n#define WGLEW_EXPORT\r\n#else\r\n#define WGLEW_EXPORT GLEWAPI\r\n#endif /* GLEW_MX */\r\n\r\n#ifdef GLEW_MX\r\nstruct WGLEWContextStruct\r\n{\r\n#endif /* GLEW_MX */\r\n\r\nWGLEW_EXPORT PFNWGLSETSTEREOEMITTERSTATE3DLPROC __wglewSetStereoEmitterState3DL;\r\n\r\nWGLEW_EXPORT PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC __wglewBlitContextFramebufferAMD;\r\nWGLEW_EXPORT PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC __wglewCreateAssociatedContextAMD;\r\nWGLEW_EXPORT PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __wglewCreateAssociatedContextAttribsAMD;\r\nWGLEW_EXPORT PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC __wglewDeleteAssociatedContextAMD;\r\nWGLEW_EXPORT PFNWGLGETCONTEXTGPUIDAMDPROC __wglewGetContextGPUIDAMD;\r\nWGLEW_EXPORT PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC __wglewGetCurrentAssociatedContextAMD;\r\nWGLEW_EXPORT PFNWGLGETGPUIDSAMDPROC __wglewGetGPUIDsAMD;\r\nWGLEW_EXPORT PFNWGLGETGPUINFOAMDPROC __wglewGetGPUInfoAMD;\r\nWGLEW_EXPORT PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __wglewMakeAssociatedContextCurrentAMD;\r\n\r\nWGLEW_EXPORT PFNWGLCREATEBUFFERREGIONARBPROC __wglewCreateBufferRegionARB;\r\nWGLEW_EXPORT PFNWGLDELETEBUFFERREGIONARBPROC __wglewDeleteBufferRegionARB;\r\nWGLEW_EXPORT PFNWGLRESTOREBUFFERREGIONARBPROC __wglewRestoreBufferRegionARB;\r\nWGLEW_EXPORT PFNWGLSAVEBUFFERREGIONARBPROC __wglewSaveBufferRegionARB;\r\n\r\nWGLEW_EXPORT PFNWGLCREATECONTEXTATTRIBSARBPROC __wglewCreateContextAttribsARB;\r\n\r\nWGLEW_EXPORT PFNWGLGETEXTENSIONSSTRINGARBPROC __wglewGetExtensionsStringARB;\r\n\r\nWGLEW_EXPORT PFNWGLGETCURRENTREADDCARBPROC __wglewGetCurrentReadDCARB;\r\nWGLEW_EXPORT PFNWGLMAKECONTEXTCURRENTARBPROC __wglewMakeContextCurrentARB;\r\n\r\nWGLEW_EXPORT PFNWGLCREATEPBUFFERARBPROC __wglewCreatePbufferARB;\r\nWGLEW_EXPORT PFNWGLDESTROYPBUFFERARBPROC __wglewDestroyPbufferARB;\r\nWGLEW_EXPORT PFNWGLGETPBUFFERDCARBPROC __wglewGetPbufferDCARB;\r\nWGLEW_EXPORT PFNWGLQUERYPBUFFERARBPROC __wglewQueryPbufferARB;\r\nWGLEW_EXPORT PFNWGLRELEASEPBUFFERDCARBPROC __wglewReleasePbufferDCARB;\r\n\r\nWGLEW_EXPORT PFNWGLCHOOSEPIXELFORMATARBPROC __wglewChoosePixelFormatARB;\r\nWGLEW_EXPORT PFNWGLGETPIXELFORMATATTRIBFVARBPROC __wglewGetPixelFormatAttribfvARB;\r\nWGLEW_EXPORT PFNWGLGETPIXELFORMATATTRIBIVARBPROC __wglewGetPixelFormatAttribivARB;\r\n\r\nWGLEW_EXPORT PFNWGLBINDTEXIMAGEARBPROC __wglewBindTexImageARB;\r\nWGLEW_EXPORT PFNWGLRELEASETEXIMAGEARBPROC __wglewReleaseTexImageARB;\r\nWGLEW_EXPORT PFNWGLSETPBUFFERATTRIBARBPROC __wglewSetPbufferAttribARB;\r\n\r\nWGLEW_EXPORT PFNWGLBINDDISPLAYCOLORTABLEEXTPROC __wglewBindDisplayColorTableEXT;\r\nWGLEW_EXPORT PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC __wglewCreateDisplayColorTableEXT;\r\nWGLEW_EXPORT PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC __wglewDestroyDisplayColorTableEXT;\r\nWGLEW_EXPORT PFNWGLLOADDISPLAYCOLORTABLEEXTPROC __wglewLoadDisplayColorTableEXT;\r\n\r\nWGLEW_EXPORT PFNWGLGETEXTENSIONSSTRINGEXTPROC __wglewGetExtensionsStringEXT;\r\n\r\nWGLEW_EXPORT PFNWGLGETCURRENTREADDCEXTPROC __wglewGetCurrentReadDCEXT;\r\nWGLEW_EXPORT PFNWGLMAKECONTEXTCURRENTEXTPROC __wglewMakeContextCurrentEXT;\r\n\r\nWGLEW_EXPORT PFNWGLCREATEPBUFFEREXTPROC __wglewCreatePbufferEXT;\r\nWGLEW_EXPORT PFNWGLDESTROYPBUFFEREXTPROC __wglewDestroyPbufferEXT;\r\nWGLEW_EXPORT PFNWGLGETPBUFFERDCEXTPROC __wglewGetPbufferDCEXT;\r\nWGLEW_EXPORT PFNWGLQUERYPBUFFEREXTPROC __wglewQueryPbufferEXT;\r\nWGLEW_EXPORT PFNWGLRELEASEPBUFFERDCEXTPROC __wglewReleasePbufferDCEXT;\r\n\r\nWGLEW_EXPORT PFNWGLCHOOSEPIXELFORMATEXTPROC __wglewChoosePixelFormatEXT;\r\nWGLEW_EXPORT PFNWGLGETPIXELFORMATATTRIBFVEXTPROC __wglewGetPixelFormatAttribfvEXT;\r\nWGLEW_EXPORT PFNWGLGETPIXELFORMATATTRIBIVEXTPROC __wglewGetPixelFormatAttribivEXT;\r\n\r\nWGLEW_EXPORT PFNWGLGETSWAPINTERVALEXTPROC __wglewGetSwapIntervalEXT;\r\nWGLEW_EXPORT PFNWGLSWAPINTERVALEXTPROC __wglewSwapIntervalEXT;\r\n\r\nWGLEW_EXPORT PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC __wglewGetDigitalVideoParametersI3D;\r\nWGLEW_EXPORT PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC __wglewSetDigitalVideoParametersI3D;\r\n\r\nWGLEW_EXPORT PFNWGLGETGAMMATABLEI3DPROC __wglewGetGammaTableI3D;\r\nWGLEW_EXPORT PFNWGLGETGAMMATABLEPARAMETERSI3DPROC __wglewGetGammaTableParametersI3D;\r\nWGLEW_EXPORT PFNWGLSETGAMMATABLEI3DPROC __wglewSetGammaTableI3D;\r\nWGLEW_EXPORT PFNWGLSETGAMMATABLEPARAMETERSI3DPROC __wglewSetGammaTableParametersI3D;\r\n\r\nWGLEW_EXPORT PFNWGLDISABLEGENLOCKI3DPROC __wglewDisableGenlockI3D;\r\nWGLEW_EXPORT PFNWGLENABLEGENLOCKI3DPROC __wglewEnableGenlockI3D;\r\nWGLEW_EXPORT PFNWGLGENLOCKSAMPLERATEI3DPROC __wglewGenlockSampleRateI3D;\r\nWGLEW_EXPORT PFNWGLGENLOCKSOURCEDELAYI3DPROC __wglewGenlockSourceDelayI3D;\r\nWGLEW_EXPORT PFNWGLGENLOCKSOURCEEDGEI3DPROC __wglewGenlockSourceEdgeI3D;\r\nWGLEW_EXPORT PFNWGLGENLOCKSOURCEI3DPROC __wglewGenlockSourceI3D;\r\nWGLEW_EXPORT PFNWGLGETGENLOCKSAMPLERATEI3DPROC __wglewGetGenlockSampleRateI3D;\r\nWGLEW_EXPORT PFNWGLGETGENLOCKSOURCEDELAYI3DPROC __wglewGetGenlockSourceDelayI3D;\r\nWGLEW_EXPORT PFNWGLGETGENLOCKSOURCEEDGEI3DPROC __wglewGetGenlockSourceEdgeI3D;\r\nWGLEW_EXPORT PFNWGLGETGENLOCKSOURCEI3DPROC __wglewGetGenlockSourceI3D;\r\nWGLEW_EXPORT PFNWGLISENABLEDGENLOCKI3DPROC __wglewIsEnabledGenlockI3D;\r\nWGLEW_EXPORT PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC __wglewQueryGenlockMaxSourceDelayI3D;\r\n\r\nWGLEW_EXPORT PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC __wglewAssociateImageBufferEventsI3D;\r\nWGLEW_EXPORT PFNWGLCREATEIMAGEBUFFERI3DPROC __wglewCreateImageBufferI3D;\r\nWGLEW_EXPORT PFNWGLDESTROYIMAGEBUFFERI3DPROC __wglewDestroyImageBufferI3D;\r\nWGLEW_EXPORT PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC __wglewReleaseImageBufferEventsI3D;\r\n\r\nWGLEW_EXPORT PFNWGLDISABLEFRAMELOCKI3DPROC __wglewDisableFrameLockI3D;\r\nWGLEW_EXPORT PFNWGLENABLEFRAMELOCKI3DPROC __wglewEnableFrameLockI3D;\r\nWGLEW_EXPORT PFNWGLISENABLEDFRAMELOCKI3DPROC __wglewIsEnabledFrameLockI3D;\r\nWGLEW_EXPORT PFNWGLQUERYFRAMELOCKMASTERI3DPROC __wglewQueryFrameLockMasterI3D;\r\n\r\nWGLEW_EXPORT PFNWGLBEGINFRAMETRACKINGI3DPROC __wglewBeginFrameTrackingI3D;\r\nWGLEW_EXPORT PFNWGLENDFRAMETRACKINGI3DPROC __wglewEndFrameTrackingI3D;\r\nWGLEW_EXPORT PFNWGLGETFRAMEUSAGEI3DPROC __wglewGetFrameUsageI3D;\r\nWGLEW_EXPORT PFNWGLQUERYFRAMETRACKINGI3DPROC __wglewQueryFrameTrackingI3D;\r\n\r\nWGLEW_EXPORT PFNWGLCOPYIMAGESUBDATANVPROC __wglewCopyImageSubDataNV;\r\n\r\nWGLEW_EXPORT PFNWGLCREATEAFFINITYDCNVPROC __wglewCreateAffinityDCNV;\r\nWGLEW_EXPORT PFNWGLDELETEDCNVPROC __wglewDeleteDCNV;\r\nWGLEW_EXPORT PFNWGLENUMGPUDEVICESNVPROC __wglewEnumGpuDevicesNV;\r\nWGLEW_EXPORT PFNWGLENUMGPUSFROMAFFINITYDCNVPROC __wglewEnumGpusFromAffinityDCNV;\r\nWGLEW_EXPORT PFNWGLENUMGPUSNVPROC __wglewEnumGpusNV;\r\n\r\nWGLEW_EXPORT PFNWGLBINDVIDEODEVICENVPROC __wglewBindVideoDeviceNV;\r\nWGLEW_EXPORT PFNWGLENUMERATEVIDEODEVICESNVPROC __wglewEnumerateVideoDevicesNV;\r\nWGLEW_EXPORT PFNWGLQUERYCURRENTCONTEXTNVPROC __wglewQueryCurrentContextNV;\r\n\r\nWGLEW_EXPORT PFNWGLBINDSWAPBARRIERNVPROC __wglewBindSwapBarrierNV;\r\nWGLEW_EXPORT PFNWGLJOINSWAPGROUPNVPROC __wglewJoinSwapGroupNV;\r\nWGLEW_EXPORT PFNWGLQUERYFRAMECOUNTNVPROC __wglewQueryFrameCountNV;\r\nWGLEW_EXPORT PFNWGLQUERYMAXSWAPGROUPSNVPROC __wglewQueryMaxSwapGroupsNV;\r\nWGLEW_EXPORT PFNWGLQUERYSWAPGROUPNVPROC __wglewQuerySwapGroupNV;\r\nWGLEW_EXPORT PFNWGLRESETFRAMECOUNTNVPROC __wglewResetFrameCountNV;\r\n\r\nWGLEW_EXPORT PFNWGLALLOCATEMEMORYNVPROC __wglewAllocateMemoryNV;\r\nWGLEW_EXPORT PFNWGLFREEMEMORYNVPROC __wglewFreeMemoryNV;\r\n\r\nWGLEW_EXPORT PFNWGLBINDVIDEOIMAGENVPROC __wglewBindVideoImageNV;\r\nWGLEW_EXPORT PFNWGLGETVIDEODEVICENVPROC __wglewGetVideoDeviceNV;\r\nWGLEW_EXPORT PFNWGLGETVIDEOINFONVPROC __wglewGetVideoInfoNV;\r\nWGLEW_EXPORT PFNWGLRELEASEVIDEODEVICENVPROC __wglewReleaseVideoDeviceNV;\r\nWGLEW_EXPORT PFNWGLRELEASEVIDEOIMAGENVPROC __wglewReleaseVideoImageNV;\r\nWGLEW_EXPORT PFNWGLSENDPBUFFERTOVIDEONVPROC __wglewSendPbufferToVideoNV;\r\n\r\nWGLEW_EXPORT PFNWGLGETMSCRATEOMLPROC __wglewGetMscRateOML;\r\nWGLEW_EXPORT PFNWGLGETSYNCVALUESOMLPROC __wglewGetSyncValuesOML;\r\nWGLEW_EXPORT PFNWGLSWAPBUFFERSMSCOMLPROC __wglewSwapBuffersMscOML;\r\nWGLEW_EXPORT PFNWGLSWAPLAYERBUFFERSMSCOMLPROC __wglewSwapLayerBuffersMscOML;\r\nWGLEW_EXPORT PFNWGLWAITFORMSCOMLPROC __wglewWaitForMscOML;\r\nWGLEW_EXPORT PFNWGLWAITFORSBCOMLPROC __wglewWaitForSbcOML;\r\nWGLEW_EXPORT GLboolean __WGLEW_3DFX_multisample;\r\nWGLEW_EXPORT GLboolean __WGLEW_3DL_stereo_control;\r\nWGLEW_EXPORT GLboolean __WGLEW_AMD_gpu_association;\r\nWGLEW_EXPORT GLboolean __WGLEW_ARB_buffer_region;\r\nWGLEW_EXPORT GLboolean __WGLEW_ARB_create_context;\r\nWGLEW_EXPORT GLboolean __WGLEW_ARB_create_context_profile;\r\nWGLEW_EXPORT GLboolean __WGLEW_ARB_extensions_string;\r\nWGLEW_EXPORT GLboolean __WGLEW_ARB_framebuffer_sRGB;\r\nWGLEW_EXPORT GLboolean __WGLEW_ARB_make_current_read;\r\nWGLEW_EXPORT GLboolean __WGLEW_ARB_multisample;\r\nWGLEW_EXPORT GLboolean __WGLEW_ARB_pbuffer;\r\nWGLEW_EXPORT GLboolean __WGLEW_ARB_pixel_format;\r\nWGLEW_EXPORT GLboolean __WGLEW_ARB_pixel_format_float;\r\nWGLEW_EXPORT GLboolean __WGLEW_ARB_render_texture;\r\nWGLEW_EXPORT GLboolean __WGLEW_ATI_pixel_format_float;\r\nWGLEW_EXPORT GLboolean __WGLEW_ATI_render_texture_rectangle;\r\nWGLEW_EXPORT GLboolean __WGLEW_EXT_depth_float;\r\nWGLEW_EXPORT GLboolean __WGLEW_EXT_display_color_table;\r\nWGLEW_EXPORT GLboolean __WGLEW_EXT_extensions_string;\r\nWGLEW_EXPORT GLboolean __WGLEW_EXT_framebuffer_sRGB;\r\nWGLEW_EXPORT GLboolean __WGLEW_EXT_make_current_read;\r\nWGLEW_EXPORT GLboolean __WGLEW_EXT_multisample;\r\nWGLEW_EXPORT GLboolean __WGLEW_EXT_pbuffer;\r\nWGLEW_EXPORT GLboolean __WGLEW_EXT_pixel_format;\r\nWGLEW_EXPORT GLboolean __WGLEW_EXT_pixel_format_packed_float;\r\nWGLEW_EXPORT GLboolean __WGLEW_EXT_swap_control;\r\nWGLEW_EXPORT GLboolean __WGLEW_I3D_digital_video_control;\r\nWGLEW_EXPORT GLboolean __WGLEW_I3D_gamma;\r\nWGLEW_EXPORT GLboolean __WGLEW_I3D_genlock;\r\nWGLEW_EXPORT GLboolean __WGLEW_I3D_image_buffer;\r\nWGLEW_EXPORT GLboolean __WGLEW_I3D_swap_frame_lock;\r\nWGLEW_EXPORT GLboolean __WGLEW_I3D_swap_frame_usage;\r\nWGLEW_EXPORT GLboolean __WGLEW_NV_copy_image;\r\nWGLEW_EXPORT GLboolean __WGLEW_NV_float_buffer;\r\nWGLEW_EXPORT GLboolean __WGLEW_NV_gpu_affinity;\r\nWGLEW_EXPORT GLboolean __WGLEW_NV_present_video;\r\nWGLEW_EXPORT GLboolean __WGLEW_NV_render_depth_texture;\r\nWGLEW_EXPORT GLboolean __WGLEW_NV_render_texture_rectangle;\r\nWGLEW_EXPORT GLboolean __WGLEW_NV_swap_group;\r\nWGLEW_EXPORT GLboolean __WGLEW_NV_vertex_array_range;\r\nWGLEW_EXPORT GLboolean __WGLEW_NV_video_output;\r\nWGLEW_EXPORT GLboolean __WGLEW_OML_sync_control;\r\n\r\n#ifdef GLEW_MX\r\n}; /* WGLEWContextStruct */\r\n#endif /* GLEW_MX */\r\n\r\n/* ------------------------------------------------------------------------- */\r\n\r\n#ifdef GLEW_MX\r\n\r\ntypedef struct WGLEWContextStruct WGLEWContext;\r\nGLEWAPI GLenum wglewContextInit (WGLEWContext* ctx);\r\nGLEWAPI GLboolean wglewContextIsSupported (WGLEWContext* ctx, const char* name);\r\n\r\n#define wglewInit() wglewContextInit(wglewGetContext())\r\n#define wglewIsSupported(x) wglewContextIsSupported(wglewGetContext(), x)\r\n\r\n#define WGLEW_GET_VAR(x) (*(const GLboolean*)&(wglewGetContext()->x))\r\n#define WGLEW_GET_FUN(x) wglewGetContext()->x\r\n\r\n#else /* GLEW_MX */\r\n\r\n#define WGLEW_GET_VAR(x) (*(const GLboolean*)&x)\r\n#define WGLEW_GET_FUN(x) x\r\n\r\nGLEWAPI GLboolean wglewIsSupported (const char* name);\r\n\r\n#endif /* GLEW_MX */\r\n\r\nGLEWAPI GLboolean wglewGetExtension (const char* name);\r\n\r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#undef GLEWAPI\r\n\r\n#endif /* __wglew_h__ */\r\n"
  },
  {
    "path": "libs/glew/src/glew.c",
    "content": "/*\r\n** The OpenGL Extension Wrangler Library\r\n** Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>\r\n** Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>\r\n** Copyright (C) 2002, Lev Povalahev\r\n** All rights reserved.\r\n** \r\n** Redistribution and use in source and binary forms, with or without \r\n** modification, are permitted provided that the following conditions are met:\r\n** \r\n** * Redistributions of source code must retain the above copyright notice, \r\n**   this list of conditions and the following disclaimer.\r\n** * Redistributions in binary form must reproduce the above copyright notice, \r\n**   this list of conditions and the following disclaimer in the documentation \r\n**   and/or other materials provided with the distribution.\r\n** * The name of the author may be used to endorse or promote products \r\n**   derived from this software without specific prior written permission.\r\n**\r\n** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" \r\n** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r\n** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r\n** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE \r\n** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \r\n** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \r\n** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r\n** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r\n** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r\n** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\r\n** THE POSSIBILITY OF SUCH DAMAGE.\r\n*/\r\n\r\n#include <GL/glew.h>\r\n#if defined(_WIN32)\r\n#  include <GL/wglew.h>\r\n#elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX)\r\n#  include <GL/glxew.h>\r\n#endif\r\n\r\n/*\r\n * Define glewGetContext and related helper macros.\r\n */\r\n#ifdef GLEW_MX\r\n#  define glewGetContext() ctx\r\n#  ifdef _WIN32\r\n#    define GLEW_CONTEXT_ARG_DEF_INIT GLEWContext* ctx\r\n#    define GLEW_CONTEXT_ARG_VAR_INIT ctx\r\n#    define wglewGetContext() ctx\r\n#    define WGLEW_CONTEXT_ARG_DEF_INIT WGLEWContext* ctx\r\n#    define WGLEW_CONTEXT_ARG_DEF_LIST WGLEWContext* ctx\r\n#  else /* _WIN32 */\r\n#    define GLEW_CONTEXT_ARG_DEF_INIT void\r\n#    define GLEW_CONTEXT_ARG_VAR_INIT\r\n#    define glxewGetContext() ctx\r\n#    define GLXEW_CONTEXT_ARG_DEF_INIT void\r\n#    define GLXEW_CONTEXT_ARG_DEF_LIST GLXEWContext* ctx\r\n#  endif /* _WIN32 */\r\n#  define GLEW_CONTEXT_ARG_DEF_LIST GLEWContext* ctx\r\n#else /* GLEW_MX */\r\n#  define GLEW_CONTEXT_ARG_DEF_INIT void\r\n#  define GLEW_CONTEXT_ARG_VAR_INIT\r\n#  define GLEW_CONTEXT_ARG_DEF_LIST void\r\n#  define WGLEW_CONTEXT_ARG_DEF_INIT void\r\n#  define WGLEW_CONTEXT_ARG_DEF_LIST void\r\n#  define GLXEW_CONTEXT_ARG_DEF_INIT void\r\n#  define GLXEW_CONTEXT_ARG_DEF_LIST void\r\n#endif /* GLEW_MX */\r\n\r\n#if defined(__APPLE__)\r\n#include <stdlib.h>\r\n#include <string.h>\r\n#include <AvailabilityMacros.h>\r\n\r\n#ifdef MAC_OS_X_VERSION_10_3\r\n\r\n#include <dlfcn.h>\r\n\r\nvoid* NSGLGetProcAddress (const GLubyte *name)\r\n{\r\n  static void* image = NULL;\r\n  if (NULL == image) \r\n  {\r\n    image = dlopen(\"/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL\", RTLD_LAZY);\r\n  }\r\n  return image ? dlsym(image, (const char*)name) : NULL;\r\n}\r\n#else\r\n\r\n#include <mach-o/dyld.h>\r\n\r\nvoid* NSGLGetProcAddress (const GLubyte *name)\r\n{\r\n  static const struct mach_header* image = NULL;\r\n  NSSymbol symbol;\r\n  char* symbolName;\r\n  if (NULL == image)\r\n  {\r\n    image = NSAddImage(\"/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL\", NSADDIMAGE_OPTION_RETURN_ON_ERROR);\r\n  }\r\n  /* prepend a '_' for the Unix C symbol mangling convention */\r\n  symbolName = malloc(strlen((const char*)name) + 2);\r\n  strcpy(symbolName+1, (const char*)name);\r\n  symbolName[0] = '_';\r\n  symbol = NULL;\r\n  /* if (NSIsSymbolNameDefined(symbolName))\r\n\t symbol = NSLookupAndBindSymbol(symbolName); */\r\n  symbol = image ? NSLookupSymbolInImage(image, symbolName, NSLOOKUPSYMBOLINIMAGE_OPTION_BIND | NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR) : NULL;\r\n  free(symbolName);\r\n  return symbol ? NSAddressOfSymbol(symbol) : NULL;\r\n}\r\n#endif /* MAC_OS_X_VERSION_10_3 */\r\n#endif /* __APPLE__ */\r\n\r\n#if defined(__sgi) || defined (__sun)\r\n#include <dlfcn.h>\r\n#include <stdio.h>\r\n#include <stdlib.h>\r\n\r\nvoid* dlGetProcAddress (const GLubyte* name)\r\n{\r\n  static void* h = NULL;\r\n  static void* gpa;\r\n\r\n  if (h == NULL)\r\n  {\r\n    if ((h = dlopen(NULL, RTLD_LAZY | RTLD_LOCAL)) == NULL) return NULL;\r\n    gpa = dlsym(h, \"glXGetProcAddress\");\r\n  }\r\n\r\n  if (gpa != NULL)\r\n    return ((void*(*)(const GLubyte*))gpa)(name);\r\n  else\r\n    return dlsym(h, (const char*)name);\r\n}\r\n#endif /* __sgi || __sun */\r\n\r\n/*\r\n * Define glewGetProcAddress.\r\n */\r\n#if defined(_WIN32)\r\n#  define glewGetProcAddress(name) wglGetProcAddress((LPCSTR)name)\r\n#else\r\n#  if defined(__APPLE__)\r\n#    define glewGetProcAddress(name) NSGLGetProcAddress(name)\r\n#  else\r\n#    if defined(__sgi) || defined(__sun)\r\n#      define glewGetProcAddress(name) dlGetProcAddress(name)\r\n#    else /* __linux */\r\n#      define glewGetProcAddress(name) (*glXGetProcAddressARB)(name)\r\n#    endif\r\n#  endif\r\n#endif\r\n\r\n/*\r\n * Define GLboolean const cast.\r\n */\r\n#define CONST_CAST(x) (*(GLboolean*)&x)\r\n\r\n/*\r\n * GLEW, just like OpenGL or GLU, does not rely on the standard C library.\r\n * These functions implement the functionality required in this file.\r\n */\r\nstatic GLuint _glewStrLen (const GLubyte* s)\r\n{\r\n  GLuint i=0;\r\n  if (s == NULL) return 0;\r\n  while (s[i] != '\\0') i++;\r\n  return i;\r\n}\r\n\r\nstatic GLuint _glewStrCLen (const GLubyte* s, GLubyte c)\r\n{\r\n  GLuint i=0;\r\n  if (s == NULL) return 0;\r\n  while (s[i] != '\\0' && s[i] != c) i++;\r\n  return (s[i] == '\\0' || s[i] == c) ? i : 0;\r\n}\r\n\r\nstatic GLboolean _glewStrSame (const GLubyte* a, const GLubyte* b, GLuint n)\r\n{\r\n  GLuint i=0;\r\n  if(a == NULL || b == NULL)\r\n    return (a == NULL && b == NULL && n == 0) ? GL_TRUE : GL_FALSE;\r\n  while (i < n && a[i] != '\\0' && b[i] != '\\0' && a[i] == b[i]) i++;\r\n  return i == n ? GL_TRUE : GL_FALSE;\r\n}\r\n\r\nstatic GLboolean _glewStrSame1 (GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb)\r\n{\r\n  while (*na > 0 && (**a == ' ' || **a == '\\n' || **a == '\\r' || **a == '\\t'))\r\n  {\r\n    (*a)++;\r\n    (*na)--;\r\n  }\r\n  if(*na >= nb)\r\n  {\r\n    GLuint i=0;\r\n    while (i < nb && (*a)+i != NULL && b+i != NULL && (*a)[i] == b[i]) i++;\r\n\tif(i == nb)\r\n\t{\r\n\t\t*a = *a + nb;\r\n\t\t*na = *na - nb;\r\n\t\treturn GL_TRUE;\r\n\t}\r\n  }\r\n  return GL_FALSE;\r\n}\r\n\r\nstatic GLboolean _glewStrSame2 (GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb)\r\n{\r\n  if(*na >= nb)\r\n  {\r\n    GLuint i=0;\r\n    while (i < nb && (*a)+i != NULL && b+i != NULL && (*a)[i] == b[i]) i++;\r\n\tif(i == nb)\r\n\t{\r\n\t\t*a = *a + nb;\r\n\t\t*na = *na - nb;\r\n\t\treturn GL_TRUE;\r\n\t}\r\n  }\r\n  return GL_FALSE;\r\n}\r\n\r\nstatic GLboolean _glewStrSame3 (GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb)\r\n{\r\n  if(*na >= nb)\r\n  {\r\n    GLuint i=0;\r\n    while (i < nb && (*a)+i != NULL && b+i != NULL && (*a)[i] == b[i]) i++;\r\n    if (i == nb && (*na == nb || (*a)[i] == ' ' || (*a)[i] == '\\n' || (*a)[i] == '\\r' || (*a)[i] == '\\t'))\r\n    {\r\n      *a = *a + nb;\r\n      *na = *na - nb;\r\n      return GL_TRUE;\r\n    }\r\n  }\r\n  return GL_FALSE;\r\n}\r\n\r\n#if !defined(_WIN32) || !defined(GLEW_MX)\r\n\r\nPFNGLCOPYTEXSUBIMAGE3DPROC __glewCopyTexSubImage3D = NULL;\r\nPFNGLDRAWRANGEELEMENTSPROC __glewDrawRangeElements = NULL;\r\nPFNGLTEXIMAGE3DPROC __glewTexImage3D = NULL;\r\nPFNGLTEXSUBIMAGE3DPROC __glewTexSubImage3D = NULL;\r\n\r\nPFNGLACTIVETEXTUREPROC __glewActiveTexture = NULL;\r\nPFNGLCLIENTACTIVETEXTUREPROC __glewClientActiveTexture = NULL;\r\nPFNGLCOMPRESSEDTEXIMAGE1DPROC __glewCompressedTexImage1D = NULL;\r\nPFNGLCOMPRESSEDTEXIMAGE2DPROC __glewCompressedTexImage2D = NULL;\r\nPFNGLCOMPRESSEDTEXIMAGE3DPROC __glewCompressedTexImage3D = NULL;\r\nPFNGLCOMPRESSEDTEXSUBIMAGE1DPROC __glewCompressedTexSubImage1D = NULL;\r\nPFNGLCOMPRESSEDTEXSUBIMAGE2DPROC __glewCompressedTexSubImage2D = NULL;\r\nPFNGLCOMPRESSEDTEXSUBIMAGE3DPROC __glewCompressedTexSubImage3D = NULL;\r\nPFNGLGETCOMPRESSEDTEXIMAGEPROC __glewGetCompressedTexImage = NULL;\r\nPFNGLLOADTRANSPOSEMATRIXDPROC __glewLoadTransposeMatrixd = NULL;\r\nPFNGLLOADTRANSPOSEMATRIXFPROC __glewLoadTransposeMatrixf = NULL;\r\nPFNGLMULTTRANSPOSEMATRIXDPROC __glewMultTransposeMatrixd = NULL;\r\nPFNGLMULTTRANSPOSEMATRIXFPROC __glewMultTransposeMatrixf = NULL;\r\nPFNGLMULTITEXCOORD1DPROC __glewMultiTexCoord1d = NULL;\r\nPFNGLMULTITEXCOORD1DVPROC __glewMultiTexCoord1dv = NULL;\r\nPFNGLMULTITEXCOORD1FPROC __glewMultiTexCoord1f = NULL;\r\nPFNGLMULTITEXCOORD1FVPROC __glewMultiTexCoord1fv = NULL;\r\nPFNGLMULTITEXCOORD1IPROC __glewMultiTexCoord1i = NULL;\r\nPFNGLMULTITEXCOORD1IVPROC __glewMultiTexCoord1iv = NULL;\r\nPFNGLMULTITEXCOORD1SPROC __glewMultiTexCoord1s = NULL;\r\nPFNGLMULTITEXCOORD1SVPROC __glewMultiTexCoord1sv = NULL;\r\nPFNGLMULTITEXCOORD2DPROC __glewMultiTexCoord2d = NULL;\r\nPFNGLMULTITEXCOORD2DVPROC __glewMultiTexCoord2dv = NULL;\r\nPFNGLMULTITEXCOORD2FPROC __glewMultiTexCoord2f = NULL;\r\nPFNGLMULTITEXCOORD2FVPROC __glewMultiTexCoord2fv = NULL;\r\nPFNGLMULTITEXCOORD2IPROC __glewMultiTexCoord2i = NULL;\r\nPFNGLMULTITEXCOORD2IVPROC __glewMultiTexCoord2iv = NULL;\r\nPFNGLMULTITEXCOORD2SPROC __glewMultiTexCoord2s = NULL;\r\nPFNGLMULTITEXCOORD2SVPROC __glewMultiTexCoord2sv = NULL;\r\nPFNGLMULTITEXCOORD3DPROC __glewMultiTexCoord3d = NULL;\r\nPFNGLMULTITEXCOORD3DVPROC __glewMultiTexCoord3dv = NULL;\r\nPFNGLMULTITEXCOORD3FPROC __glewMultiTexCoord3f = NULL;\r\nPFNGLMULTITEXCOORD3FVPROC __glewMultiTexCoord3fv = NULL;\r\nPFNGLMULTITEXCOORD3IPROC __glewMultiTexCoord3i = NULL;\r\nPFNGLMULTITEXCOORD3IVPROC __glewMultiTexCoord3iv = NULL;\r\nPFNGLMULTITEXCOORD3SPROC __glewMultiTexCoord3s = NULL;\r\nPFNGLMULTITEXCOORD3SVPROC __glewMultiTexCoord3sv = NULL;\r\nPFNGLMULTITEXCOORD4DPROC __glewMultiTexCoord4d = NULL;\r\nPFNGLMULTITEXCOORD4DVPROC __glewMultiTexCoord4dv = NULL;\r\nPFNGLMULTITEXCOORD4FPROC __glewMultiTexCoord4f = NULL;\r\nPFNGLMULTITEXCOORD4FVPROC __glewMultiTexCoord4fv = NULL;\r\nPFNGLMULTITEXCOORD4IPROC __glewMultiTexCoord4i = NULL;\r\nPFNGLMULTITEXCOORD4IVPROC __glewMultiTexCoord4iv = NULL;\r\nPFNGLMULTITEXCOORD4SPROC __glewMultiTexCoord4s = NULL;\r\nPFNGLMULTITEXCOORD4SVPROC __glewMultiTexCoord4sv = NULL;\r\nPFNGLSAMPLECOVERAGEPROC __glewSampleCoverage = NULL;\r\n\r\nPFNGLBLENDCOLORPROC __glewBlendColor = NULL;\r\nPFNGLBLENDEQUATIONPROC __glewBlendEquation = NULL;\r\nPFNGLBLENDFUNCSEPARATEPROC __glewBlendFuncSeparate = NULL;\r\nPFNGLFOGCOORDPOINTERPROC __glewFogCoordPointer = NULL;\r\nPFNGLFOGCOORDDPROC __glewFogCoordd = NULL;\r\nPFNGLFOGCOORDDVPROC __glewFogCoorddv = NULL;\r\nPFNGLFOGCOORDFPROC __glewFogCoordf = NULL;\r\nPFNGLFOGCOORDFVPROC __glewFogCoordfv = NULL;\r\nPFNGLMULTIDRAWARRAYSPROC __glewMultiDrawArrays = NULL;\r\nPFNGLMULTIDRAWELEMENTSPROC __glewMultiDrawElements = NULL;\r\nPFNGLPOINTPARAMETERFPROC __glewPointParameterf = NULL;\r\nPFNGLPOINTPARAMETERFVPROC __glewPointParameterfv = NULL;\r\nPFNGLPOINTPARAMETERIPROC __glewPointParameteri = NULL;\r\nPFNGLPOINTPARAMETERIVPROC __glewPointParameteriv = NULL;\r\nPFNGLSECONDARYCOLOR3BPROC __glewSecondaryColor3b = NULL;\r\nPFNGLSECONDARYCOLOR3BVPROC __glewSecondaryColor3bv = NULL;\r\nPFNGLSECONDARYCOLOR3DPROC __glewSecondaryColor3d = NULL;\r\nPFNGLSECONDARYCOLOR3DVPROC __glewSecondaryColor3dv = NULL;\r\nPFNGLSECONDARYCOLOR3FPROC __glewSecondaryColor3f = NULL;\r\nPFNGLSECONDARYCOLOR3FVPROC __glewSecondaryColor3fv = NULL;\r\nPFNGLSECONDARYCOLOR3IPROC __glewSecondaryColor3i = NULL;\r\nPFNGLSECONDARYCOLOR3IVPROC __glewSecondaryColor3iv = NULL;\r\nPFNGLSECONDARYCOLOR3SPROC __glewSecondaryColor3s = NULL;\r\nPFNGLSECONDARYCOLOR3SVPROC __glewSecondaryColor3sv = NULL;\r\nPFNGLSECONDARYCOLOR3UBPROC __glewSecondaryColor3ub = NULL;\r\nPFNGLSECONDARYCOLOR3UBVPROC __glewSecondaryColor3ubv = NULL;\r\nPFNGLSECONDARYCOLOR3UIPROC __glewSecondaryColor3ui = NULL;\r\nPFNGLSECONDARYCOLOR3UIVPROC __glewSecondaryColor3uiv = NULL;\r\nPFNGLSECONDARYCOLOR3USPROC __glewSecondaryColor3us = NULL;\r\nPFNGLSECONDARYCOLOR3USVPROC __glewSecondaryColor3usv = NULL;\r\nPFNGLSECONDARYCOLORPOINTERPROC __glewSecondaryColorPointer = NULL;\r\nPFNGLWINDOWPOS2DPROC __glewWindowPos2d = NULL;\r\nPFNGLWINDOWPOS2DVPROC __glewWindowPos2dv = NULL;\r\nPFNGLWINDOWPOS2FPROC __glewWindowPos2f = NULL;\r\nPFNGLWINDOWPOS2FVPROC __glewWindowPos2fv = NULL;\r\nPFNGLWINDOWPOS2IPROC __glewWindowPos2i = NULL;\r\nPFNGLWINDOWPOS2IVPROC __glewWindowPos2iv = NULL;\r\nPFNGLWINDOWPOS2SPROC __glewWindowPos2s = NULL;\r\nPFNGLWINDOWPOS2SVPROC __glewWindowPos2sv = NULL;\r\nPFNGLWINDOWPOS3DPROC __glewWindowPos3d = NULL;\r\nPFNGLWINDOWPOS3DVPROC __glewWindowPos3dv = NULL;\r\nPFNGLWINDOWPOS3FPROC __glewWindowPos3f = NULL;\r\nPFNGLWINDOWPOS3FVPROC __glewWindowPos3fv = NULL;\r\nPFNGLWINDOWPOS3IPROC __glewWindowPos3i = NULL;\r\nPFNGLWINDOWPOS3IVPROC __glewWindowPos3iv = NULL;\r\nPFNGLWINDOWPOS3SPROC __glewWindowPos3s = NULL;\r\nPFNGLWINDOWPOS3SVPROC __glewWindowPos3sv = NULL;\r\n\r\nPFNGLBEGINQUERYPROC __glewBeginQuery = NULL;\r\nPFNGLBINDBUFFERPROC __glewBindBuffer = NULL;\r\nPFNGLBUFFERDATAPROC __glewBufferData = NULL;\r\nPFNGLBUFFERSUBDATAPROC __glewBufferSubData = NULL;\r\nPFNGLDELETEBUFFERSPROC __glewDeleteBuffers = NULL;\r\nPFNGLDELETEQUERIESPROC __glewDeleteQueries = NULL;\r\nPFNGLENDQUERYPROC __glewEndQuery = NULL;\r\nPFNGLGENBUFFERSPROC __glewGenBuffers = NULL;\r\nPFNGLGENQUERIESPROC __glewGenQueries = NULL;\r\nPFNGLGETBUFFERPARAMETERIVPROC __glewGetBufferParameteriv = NULL;\r\nPFNGLGETBUFFERPOINTERVPROC __glewGetBufferPointerv = NULL;\r\nPFNGLGETBUFFERSUBDATAPROC __glewGetBufferSubData = NULL;\r\nPFNGLGETQUERYOBJECTIVPROC __glewGetQueryObjectiv = NULL;\r\nPFNGLGETQUERYOBJECTUIVPROC __glewGetQueryObjectuiv = NULL;\r\nPFNGLGETQUERYIVPROC __glewGetQueryiv = NULL;\r\nPFNGLISBUFFERPROC __glewIsBuffer = NULL;\r\nPFNGLISQUERYPROC __glewIsQuery = NULL;\r\nPFNGLMAPBUFFERPROC __glewMapBuffer = NULL;\r\nPFNGLUNMAPBUFFERPROC __glewUnmapBuffer = NULL;\r\n\r\nPFNGLATTACHSHADERPROC __glewAttachShader = NULL;\r\nPFNGLBINDATTRIBLOCATIONPROC __glewBindAttribLocation = NULL;\r\nPFNGLBLENDEQUATIONSEPARATEPROC __glewBlendEquationSeparate = NULL;\r\nPFNGLCOMPILESHADERPROC __glewCompileShader = NULL;\r\nPFNGLCREATEPROGRAMPROC __glewCreateProgram = NULL;\r\nPFNGLCREATESHADERPROC __glewCreateShader = NULL;\r\nPFNGLDELETEPROGRAMPROC __glewDeleteProgram = NULL;\r\nPFNGLDELETESHADERPROC __glewDeleteShader = NULL;\r\nPFNGLDETACHSHADERPROC __glewDetachShader = NULL;\r\nPFNGLDISABLEVERTEXATTRIBARRAYPROC __glewDisableVertexAttribArray = NULL;\r\nPFNGLDRAWBUFFERSPROC __glewDrawBuffers = NULL;\r\nPFNGLENABLEVERTEXATTRIBARRAYPROC __glewEnableVertexAttribArray = NULL;\r\nPFNGLGETACTIVEATTRIBPROC __glewGetActiveAttrib = NULL;\r\nPFNGLGETACTIVEUNIFORMPROC __glewGetActiveUniform = NULL;\r\nPFNGLGETATTACHEDSHADERSPROC __glewGetAttachedShaders = NULL;\r\nPFNGLGETATTRIBLOCATIONPROC __glewGetAttribLocation = NULL;\r\nPFNGLGETPROGRAMINFOLOGPROC __glewGetProgramInfoLog = NULL;\r\nPFNGLGETPROGRAMIVPROC __glewGetProgramiv = NULL;\r\nPFNGLGETSHADERINFOLOGPROC __glewGetShaderInfoLog = NULL;\r\nPFNGLGETSHADERSOURCEPROC __glewGetShaderSource = NULL;\r\nPFNGLGETSHADERIVPROC __glewGetShaderiv = NULL;\r\nPFNGLGETUNIFORMLOCATIONPROC __glewGetUniformLocation = NULL;\r\nPFNGLGETUNIFORMFVPROC __glewGetUniformfv = NULL;\r\nPFNGLGETUNIFORMIVPROC __glewGetUniformiv = NULL;\r\nPFNGLGETVERTEXATTRIBPOINTERVPROC __glewGetVertexAttribPointerv = NULL;\r\nPFNGLGETVERTEXATTRIBDVPROC __glewGetVertexAttribdv = NULL;\r\nPFNGLGETVERTEXATTRIBFVPROC __glewGetVertexAttribfv = NULL;\r\nPFNGLGETVERTEXATTRIBIVPROC __glewGetVertexAttribiv = NULL;\r\nPFNGLISPROGRAMPROC __glewIsProgram = NULL;\r\nPFNGLISSHADERPROC __glewIsShader = NULL;\r\nPFNGLLINKPROGRAMPROC __glewLinkProgram = NULL;\r\nPFNGLSHADERSOURCEPROC __glewShaderSource = NULL;\r\nPFNGLSTENCILFUNCSEPARATEPROC __glewStencilFuncSeparate = NULL;\r\nPFNGLSTENCILMASKSEPARATEPROC __glewStencilMaskSeparate = NULL;\r\nPFNGLSTENCILOPSEPARATEPROC __glewStencilOpSeparate = NULL;\r\nPFNGLUNIFORM1FPROC __glewUniform1f = NULL;\r\nPFNGLUNIFORM1FVPROC __glewUniform1fv = NULL;\r\nPFNGLUNIFORM1IPROC __glewUniform1i = NULL;\r\nPFNGLUNIFORM1IVPROC __glewUniform1iv = NULL;\r\nPFNGLUNIFORM2FPROC __glewUniform2f = NULL;\r\nPFNGLUNIFORM2FVPROC __glewUniform2fv = NULL;\r\nPFNGLUNIFORM2IPROC __glewUniform2i = NULL;\r\nPFNGLUNIFORM2IVPROC __glewUniform2iv = NULL;\r\nPFNGLUNIFORM3FPROC __glewUniform3f = NULL;\r\nPFNGLUNIFORM3FVPROC __glewUniform3fv = NULL;\r\nPFNGLUNIFORM3IPROC __glewUniform3i = NULL;\r\nPFNGLUNIFORM3IVPROC __glewUniform3iv = NULL;\r\nPFNGLUNIFORM4FPROC __glewUniform4f = NULL;\r\nPFNGLUNIFORM4FVPROC __glewUniform4fv = NULL;\r\nPFNGLUNIFORM4IPROC __glewUniform4i = NULL;\r\nPFNGLUNIFORM4IVPROC __glewUniform4iv = NULL;\r\nPFNGLUNIFORMMATRIX2FVPROC __glewUniformMatrix2fv = NULL;\r\nPFNGLUNIFORMMATRIX3FVPROC __glewUniformMatrix3fv = NULL;\r\nPFNGLUNIFORMMATRIX4FVPROC __glewUniformMatrix4fv = NULL;\r\nPFNGLUSEPROGRAMPROC __glewUseProgram = NULL;\r\nPFNGLVALIDATEPROGRAMPROC __glewValidateProgram = NULL;\r\nPFNGLVERTEXATTRIB1DPROC __glewVertexAttrib1d = NULL;\r\nPFNGLVERTEXATTRIB1DVPROC __glewVertexAttrib1dv = NULL;\r\nPFNGLVERTEXATTRIB1FPROC __glewVertexAttrib1f = NULL;\r\nPFNGLVERTEXATTRIB1FVPROC __glewVertexAttrib1fv = NULL;\r\nPFNGLVERTEXATTRIB1SPROC __glewVertexAttrib1s = NULL;\r\nPFNGLVERTEXATTRIB1SVPROC __glewVertexAttrib1sv = NULL;\r\nPFNGLVERTEXATTRIB2DPROC __glewVertexAttrib2d = NULL;\r\nPFNGLVERTEXATTRIB2DVPROC __glewVertexAttrib2dv = NULL;\r\nPFNGLVERTEXATTRIB2FPROC __glewVertexAttrib2f = NULL;\r\nPFNGLVERTEXATTRIB2FVPROC __glewVertexAttrib2fv = NULL;\r\nPFNGLVERTEXATTRIB2SPROC __glewVertexAttrib2s = NULL;\r\nPFNGLVERTEXATTRIB2SVPROC __glewVertexAttrib2sv = NULL;\r\nPFNGLVERTEXATTRIB3DPROC __glewVertexAttrib3d = NULL;\r\nPFNGLVERTEXATTRIB3DVPROC __glewVertexAttrib3dv = NULL;\r\nPFNGLVERTEXATTRIB3FPROC __glewVertexAttrib3f = NULL;\r\nPFNGLVERTEXATTRIB3FVPROC __glewVertexAttrib3fv = NULL;\r\nPFNGLVERTEXATTRIB3SPROC __glewVertexAttrib3s = NULL;\r\nPFNGLVERTEXATTRIB3SVPROC __glewVertexAttrib3sv = NULL;\r\nPFNGLVERTEXATTRIB4NBVPROC __glewVertexAttrib4Nbv = NULL;\r\nPFNGLVERTEXATTRIB4NIVPROC __glewVertexAttrib4Niv = NULL;\r\nPFNGLVERTEXATTRIB4NSVPROC __glewVertexAttrib4Nsv = NULL;\r\nPFNGLVERTEXATTRIB4NUBPROC __glewVertexAttrib4Nub = NULL;\r\nPFNGLVERTEXATTRIB4NUBVPROC __glewVertexAttrib4Nubv = NULL;\r\nPFNGLVERTEXATTRIB4NUIVPROC __glewVertexAttrib4Nuiv = NULL;\r\nPFNGLVERTEXATTRIB4NUSVPROC __glewVertexAttrib4Nusv = NULL;\r\nPFNGLVERTEXATTRIB4BVPROC __glewVertexAttrib4bv = NULL;\r\nPFNGLVERTEXATTRIB4DPROC __glewVertexAttrib4d = NULL;\r\nPFNGLVERTEXATTRIB4DVPROC __glewVertexAttrib4dv = NULL;\r\nPFNGLVERTEXATTRIB4FPROC __glewVertexAttrib4f = NULL;\r\nPFNGLVERTEXATTRIB4FVPROC __glewVertexAttrib4fv = NULL;\r\nPFNGLVERTEXATTRIB4IVPROC __glewVertexAttrib4iv = NULL;\r\nPFNGLVERTEXATTRIB4SPROC __glewVertexAttrib4s = NULL;\r\nPFNGLVERTEXATTRIB4SVPROC __glewVertexAttrib4sv = NULL;\r\nPFNGLVERTEXATTRIB4UBVPROC __glewVertexAttrib4ubv = NULL;\r\nPFNGLVERTEXATTRIB4UIVPROC __glewVertexAttrib4uiv = NULL;\r\nPFNGLVERTEXATTRIB4USVPROC __glewVertexAttrib4usv = NULL;\r\nPFNGLVERTEXATTRIBPOINTERPROC __glewVertexAttribPointer = NULL;\r\n\r\nPFNGLUNIFORMMATRIX2X3FVPROC __glewUniformMatrix2x3fv = NULL;\r\nPFNGLUNIFORMMATRIX2X4FVPROC __glewUniformMatrix2x4fv = NULL;\r\nPFNGLUNIFORMMATRIX3X2FVPROC __glewUniformMatrix3x2fv = NULL;\r\nPFNGLUNIFORMMATRIX3X4FVPROC __glewUniformMatrix3x4fv = NULL;\r\nPFNGLUNIFORMMATRIX4X2FVPROC __glewUniformMatrix4x2fv = NULL;\r\nPFNGLUNIFORMMATRIX4X3FVPROC __glewUniformMatrix4x3fv = NULL;\r\n\r\nPFNGLBEGINCONDITIONALRENDERPROC __glewBeginConditionalRender = NULL;\r\nPFNGLBEGINTRANSFORMFEEDBACKPROC __glewBeginTransformFeedback = NULL;\r\nPFNGLBINDFRAGDATALOCATIONPROC __glewBindFragDataLocation = NULL;\r\nPFNGLCLAMPCOLORPROC __glewClampColor = NULL;\r\nPFNGLCLEARBUFFERFIPROC __glewClearBufferfi = NULL;\r\nPFNGLCLEARBUFFERFVPROC __glewClearBufferfv = NULL;\r\nPFNGLCLEARBUFFERIVPROC __glewClearBufferiv = NULL;\r\nPFNGLCLEARBUFFERUIVPROC __glewClearBufferuiv = NULL;\r\nPFNGLCOLORMASKIPROC __glewColorMaski = NULL;\r\nPFNGLDISABLEIPROC __glewDisablei = NULL;\r\nPFNGLENABLEIPROC __glewEnablei = NULL;\r\nPFNGLENDCONDITIONALRENDERPROC __glewEndConditionalRender = NULL;\r\nPFNGLENDTRANSFORMFEEDBACKPROC __glewEndTransformFeedback = NULL;\r\nPFNGLGETBOOLEANI_VPROC __glewGetBooleani_v = NULL;\r\nPFNGLGETFRAGDATALOCATIONPROC __glewGetFragDataLocation = NULL;\r\nPFNGLGETSTRINGIPROC __glewGetStringi = NULL;\r\nPFNGLGETTEXPARAMETERIIVPROC __glewGetTexParameterIiv = NULL;\r\nPFNGLGETTEXPARAMETERIUIVPROC __glewGetTexParameterIuiv = NULL;\r\nPFNGLGETTRANSFORMFEEDBACKVARYINGPROC __glewGetTransformFeedbackVarying = NULL;\r\nPFNGLGETUNIFORMUIVPROC __glewGetUniformuiv = NULL;\r\nPFNGLGETVERTEXATTRIBIIVPROC __glewGetVertexAttribIiv = NULL;\r\nPFNGLGETVERTEXATTRIBIUIVPROC __glewGetVertexAttribIuiv = NULL;\r\nPFNGLISENABLEDIPROC __glewIsEnabledi = NULL;\r\nPFNGLTEXPARAMETERIIVPROC __glewTexParameterIiv = NULL;\r\nPFNGLTEXPARAMETERIUIVPROC __glewTexParameterIuiv = NULL;\r\nPFNGLTRANSFORMFEEDBACKVARYINGSPROC __glewTransformFeedbackVaryings = NULL;\r\nPFNGLUNIFORM1UIPROC __glewUniform1ui = NULL;\r\nPFNGLUNIFORM1UIVPROC __glewUniform1uiv = NULL;\r\nPFNGLUNIFORM2UIPROC __glewUniform2ui = NULL;\r\nPFNGLUNIFORM2UIVPROC __glewUniform2uiv = NULL;\r\nPFNGLUNIFORM3UIPROC __glewUniform3ui = NULL;\r\nPFNGLUNIFORM3UIVPROC __glewUniform3uiv = NULL;\r\nPFNGLUNIFORM4UIPROC __glewUniform4ui = NULL;\r\nPFNGLUNIFORM4UIVPROC __glewUniform4uiv = NULL;\r\nPFNGLVERTEXATTRIBI1IPROC __glewVertexAttribI1i = NULL;\r\nPFNGLVERTEXATTRIBI1IVPROC __glewVertexAttribI1iv = NULL;\r\nPFNGLVERTEXATTRIBI1UIPROC __glewVertexAttribI1ui = NULL;\r\nPFNGLVERTEXATTRIBI1UIVPROC __glewVertexAttribI1uiv = NULL;\r\nPFNGLVERTEXATTRIBI2IPROC __glewVertexAttribI2i = NULL;\r\nPFNGLVERTEXATTRIBI2IVPROC __glewVertexAttribI2iv = NULL;\r\nPFNGLVERTEXATTRIBI2UIPROC __glewVertexAttribI2ui = NULL;\r\nPFNGLVERTEXATTRIBI2UIVPROC __glewVertexAttribI2uiv = NULL;\r\nPFNGLVERTEXATTRIBI3IPROC __glewVertexAttribI3i = NULL;\r\nPFNGLVERTEXATTRIBI3IVPROC __glewVertexAttribI3iv = NULL;\r\nPFNGLVERTEXATTRIBI3UIPROC __glewVertexAttribI3ui = NULL;\r\nPFNGLVERTEXATTRIBI3UIVPROC __glewVertexAttribI3uiv = NULL;\r\nPFNGLVERTEXATTRIBI4BVPROC __glewVertexAttribI4bv = NULL;\r\nPFNGLVERTEXATTRIBI4IPROC __glewVertexAttribI4i = NULL;\r\nPFNGLVERTEXATTRIBI4IVPROC __glewVertexAttribI4iv = NULL;\r\nPFNGLVERTEXATTRIBI4SVPROC __glewVertexAttribI4sv = NULL;\r\nPFNGLVERTEXATTRIBI4UBVPROC __glewVertexAttribI4ubv = NULL;\r\nPFNGLVERTEXATTRIBI4UIPROC __glewVertexAttribI4ui = NULL;\r\nPFNGLVERTEXATTRIBI4UIVPROC __glewVertexAttribI4uiv = NULL;\r\nPFNGLVERTEXATTRIBI4USVPROC __glewVertexAttribI4usv = NULL;\r\nPFNGLVERTEXATTRIBIPOINTERPROC __glewVertexAttribIPointer = NULL;\r\n\r\nPFNGLDRAWARRAYSINSTANCEDPROC __glewDrawArraysInstanced = NULL;\r\nPFNGLDRAWELEMENTSINSTANCEDPROC __glewDrawElementsInstanced = NULL;\r\nPFNGLPRIMITIVERESTARTINDEXPROC __glewPrimitiveRestartIndex = NULL;\r\nPFNGLTEXBUFFERPROC __glewTexBuffer = NULL;\r\n\r\nPFNGLFRAMEBUFFERTEXTUREPROC __glewFramebufferTexture = NULL;\r\nPFNGLGETBUFFERPARAMETERI64VPROC __glewGetBufferParameteri64v = NULL;\r\nPFNGLGETINTEGER64I_VPROC __glewGetInteger64i_v = NULL;\r\n\r\nPFNGLTBUFFERMASK3DFXPROC __glewTbufferMask3DFX = NULL;\r\n\r\nPFNGLBLENDEQUATIONINDEXEDAMDPROC __glewBlendEquationIndexedAMD = NULL;\r\nPFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC __glewBlendEquationSeparateIndexedAMD = NULL;\r\nPFNGLBLENDFUNCINDEXEDAMDPROC __glewBlendFuncIndexedAMD = NULL;\r\nPFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC __glewBlendFuncSeparateIndexedAMD = NULL;\r\n\r\nPFNGLBEGINPERFMONITORAMDPROC __glewBeginPerfMonitorAMD = NULL;\r\nPFNGLDELETEPERFMONITORSAMDPROC __glewDeletePerfMonitorsAMD = NULL;\r\nPFNGLENDPERFMONITORAMDPROC __glewEndPerfMonitorAMD = NULL;\r\nPFNGLGENPERFMONITORSAMDPROC __glewGenPerfMonitorsAMD = NULL;\r\nPFNGLGETPERFMONITORCOUNTERDATAAMDPROC __glewGetPerfMonitorCounterDataAMD = NULL;\r\nPFNGLGETPERFMONITORCOUNTERINFOAMDPROC __glewGetPerfMonitorCounterInfoAMD = NULL;\r\nPFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC __glewGetPerfMonitorCounterStringAMD = NULL;\r\nPFNGLGETPERFMONITORCOUNTERSAMDPROC __glewGetPerfMonitorCountersAMD = NULL;\r\nPFNGLGETPERFMONITORGROUPSTRINGAMDPROC __glewGetPerfMonitorGroupStringAMD = NULL;\r\nPFNGLGETPERFMONITORGROUPSAMDPROC __glewGetPerfMonitorGroupsAMD = NULL;\r\nPFNGLSELECTPERFMONITORCOUNTERSAMDPROC __glewSelectPerfMonitorCountersAMD = NULL;\r\n\r\nPFNGLTESSELLATIONFACTORAMDPROC __glewTessellationFactorAMD = NULL;\r\nPFNGLTESSELLATIONMODEAMDPROC __glewTessellationModeAMD = NULL;\r\n\r\nPFNGLDRAWELEMENTARRAYAPPLEPROC __glewDrawElementArrayAPPLE = NULL;\r\nPFNGLDRAWRANGEELEMENTARRAYAPPLEPROC __glewDrawRangeElementArrayAPPLE = NULL;\r\nPFNGLELEMENTPOINTERAPPLEPROC __glewElementPointerAPPLE = NULL;\r\nPFNGLMULTIDRAWELEMENTARRAYAPPLEPROC __glewMultiDrawElementArrayAPPLE = NULL;\r\nPFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC __glewMultiDrawRangeElementArrayAPPLE = NULL;\r\n\r\nPFNGLDELETEFENCESAPPLEPROC __glewDeleteFencesAPPLE = NULL;\r\nPFNGLFINISHFENCEAPPLEPROC __glewFinishFenceAPPLE = NULL;\r\nPFNGLFINISHOBJECTAPPLEPROC __glewFinishObjectAPPLE = NULL;\r\nPFNGLGENFENCESAPPLEPROC __glewGenFencesAPPLE = NULL;\r\nPFNGLISFENCEAPPLEPROC __glewIsFenceAPPLE = NULL;\r\nPFNGLSETFENCEAPPLEPROC __glewSetFenceAPPLE = NULL;\r\nPFNGLTESTFENCEAPPLEPROC __glewTestFenceAPPLE = NULL;\r\nPFNGLTESTOBJECTAPPLEPROC __glewTestObjectAPPLE = NULL;\r\n\r\nPFNGLBUFFERPARAMETERIAPPLEPROC __glewBufferParameteriAPPLE = NULL;\r\nPFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC __glewFlushMappedBufferRangeAPPLE = NULL;\r\n\r\nPFNGLGETOBJECTPARAMETERIVAPPLEPROC __glewGetObjectParameterivAPPLE = NULL;\r\nPFNGLOBJECTPURGEABLEAPPLEPROC __glewObjectPurgeableAPPLE = NULL;\r\nPFNGLOBJECTUNPURGEABLEAPPLEPROC __glewObjectUnpurgeableAPPLE = NULL;\r\n\r\nPFNGLGETTEXPARAMETERPOINTERVAPPLEPROC __glewGetTexParameterPointervAPPLE = NULL;\r\nPFNGLTEXTURERANGEAPPLEPROC __glewTextureRangeAPPLE = NULL;\r\n\r\nPFNGLBINDVERTEXARRAYAPPLEPROC __glewBindVertexArrayAPPLE = NULL;\r\nPFNGLDELETEVERTEXARRAYSAPPLEPROC __glewDeleteVertexArraysAPPLE = NULL;\r\nPFNGLGENVERTEXARRAYSAPPLEPROC __glewGenVertexArraysAPPLE = NULL;\r\nPFNGLISVERTEXARRAYAPPLEPROC __glewIsVertexArrayAPPLE = NULL;\r\n\r\nPFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC __glewFlushVertexArrayRangeAPPLE = NULL;\r\nPFNGLVERTEXARRAYPARAMETERIAPPLEPROC __glewVertexArrayParameteriAPPLE = NULL;\r\nPFNGLVERTEXARRAYRANGEAPPLEPROC __glewVertexArrayRangeAPPLE = NULL;\r\n\r\nPFNGLDISABLEVERTEXATTRIBAPPLEPROC __glewDisableVertexAttribAPPLE = NULL;\r\nPFNGLENABLEVERTEXATTRIBAPPLEPROC __glewEnableVertexAttribAPPLE = NULL;\r\nPFNGLISVERTEXATTRIBENABLEDAPPLEPROC __glewIsVertexAttribEnabledAPPLE = NULL;\r\nPFNGLMAPVERTEXATTRIB1DAPPLEPROC __glewMapVertexAttrib1dAPPLE = NULL;\r\nPFNGLMAPVERTEXATTRIB1FAPPLEPROC __glewMapVertexAttrib1fAPPLE = NULL;\r\nPFNGLMAPVERTEXATTRIB2DAPPLEPROC __glewMapVertexAttrib2dAPPLE = NULL;\r\nPFNGLMAPVERTEXATTRIB2FAPPLEPROC __glewMapVertexAttrib2fAPPLE = NULL;\r\n\r\nPFNGLCLAMPCOLORARBPROC __glewClampColorARB = NULL;\r\n\r\nPFNGLCOPYBUFFERSUBDATAPROC __glewCopyBufferSubData = NULL;\r\n\r\nPFNGLDRAWBUFFERSARBPROC __glewDrawBuffersARB = NULL;\r\n\r\nPFNGLBLENDEQUATIONSEPARATEIARBPROC __glewBlendEquationSeparateiARB = NULL;\r\nPFNGLBLENDEQUATIONIARBPROC __glewBlendEquationiARB = NULL;\r\nPFNGLBLENDFUNCSEPARATEIARBPROC __glewBlendFuncSeparateiARB = NULL;\r\nPFNGLBLENDFUNCIARBPROC __glewBlendFunciARB = NULL;\r\n\r\nPFNGLDRAWELEMENTSBASEVERTEXPROC __glewDrawElementsBaseVertex = NULL;\r\nPFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC __glewDrawElementsInstancedBaseVertex = NULL;\r\nPFNGLDRAWRANGEELEMENTSBASEVERTEXPROC __glewDrawRangeElementsBaseVertex = NULL;\r\nPFNGLMULTIDRAWELEMENTSBASEVERTEXPROC __glewMultiDrawElementsBaseVertex = NULL;\r\n\r\nPFNGLDRAWARRAYSINSTANCEDARBPROC __glewDrawArraysInstancedARB = NULL;\r\nPFNGLDRAWELEMENTSINSTANCEDARBPROC __glewDrawElementsInstancedARB = NULL;\r\n\r\nPFNGLBINDFRAMEBUFFERPROC __glewBindFramebuffer = NULL;\r\nPFNGLBINDRENDERBUFFERPROC __glewBindRenderbuffer = NULL;\r\nPFNGLBLITFRAMEBUFFERPROC __glewBlitFramebuffer = NULL;\r\nPFNGLCHECKFRAMEBUFFERSTATUSPROC __glewCheckFramebufferStatus = NULL;\r\nPFNGLDELETEFRAMEBUFFERSPROC __glewDeleteFramebuffers = NULL;\r\nPFNGLDELETERENDERBUFFERSPROC __glewDeleteRenderbuffers = NULL;\r\nPFNGLFRAMEBUFFERRENDERBUFFERPROC __glewFramebufferRenderbuffer = NULL;\r\nPFNGLFRAMEBUFFERTEXTURE1DPROC __glewFramebufferTexture1D = NULL;\r\nPFNGLFRAMEBUFFERTEXTURE2DPROC __glewFramebufferTexture2D = NULL;\r\nPFNGLFRAMEBUFFERTEXTURE3DPROC __glewFramebufferTexture3D = NULL;\r\nPFNGLFRAMEBUFFERTEXTURELAYERPROC __glewFramebufferTextureLayer = NULL;\r\nPFNGLGENFRAMEBUFFERSPROC __glewGenFramebuffers = NULL;\r\nPFNGLGENRENDERBUFFERSPROC __glewGenRenderbuffers = NULL;\r\nPFNGLGENERATEMIPMAPPROC __glewGenerateMipmap = NULL;\r\nPFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC __glewGetFramebufferAttachmentParameteriv = NULL;\r\nPFNGLGETRENDERBUFFERPARAMETERIVPROC __glewGetRenderbufferParameteriv = NULL;\r\nPFNGLISFRAMEBUFFERPROC __glewIsFramebuffer = NULL;\r\nPFNGLISRENDERBUFFERPROC __glewIsRenderbuffer = NULL;\r\nPFNGLRENDERBUFFERSTORAGEPROC __glewRenderbufferStorage = NULL;\r\nPFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC __glewRenderbufferStorageMultisample = NULL;\r\n\r\nPFNGLFRAMEBUFFERTEXTUREARBPROC __glewFramebufferTextureARB = NULL;\r\nPFNGLFRAMEBUFFERTEXTUREFACEARBPROC __glewFramebufferTextureFaceARB = NULL;\r\nPFNGLFRAMEBUFFERTEXTURELAYERARBPROC __glewFramebufferTextureLayerARB = NULL;\r\nPFNGLPROGRAMPARAMETERIARBPROC __glewProgramParameteriARB = NULL;\r\n\r\nPFNGLCOLORSUBTABLEPROC __glewColorSubTable = NULL;\r\nPFNGLCOLORTABLEPROC __glewColorTable = NULL;\r\nPFNGLCOLORTABLEPARAMETERFVPROC __glewColorTableParameterfv = NULL;\r\nPFNGLCOLORTABLEPARAMETERIVPROC __glewColorTableParameteriv = NULL;\r\nPFNGLCONVOLUTIONFILTER1DPROC __glewConvolutionFilter1D = NULL;\r\nPFNGLCONVOLUTIONFILTER2DPROC __glewConvolutionFilter2D = NULL;\r\nPFNGLCONVOLUTIONPARAMETERFPROC __glewConvolutionParameterf = NULL;\r\nPFNGLCONVOLUTIONPARAMETERFVPROC __glewConvolutionParameterfv = NULL;\r\nPFNGLCONVOLUTIONPARAMETERIPROC __glewConvolutionParameteri = NULL;\r\nPFNGLCONVOLUTIONPARAMETERIVPROC __glewConvolutionParameteriv = NULL;\r\nPFNGLCOPYCOLORSUBTABLEPROC __glewCopyColorSubTable = NULL;\r\nPFNGLCOPYCOLORTABLEPROC __glewCopyColorTable = NULL;\r\nPFNGLCOPYCONVOLUTIONFILTER1DPROC __glewCopyConvolutionFilter1D = NULL;\r\nPFNGLCOPYCONVOLUTIONFILTER2DPROC __glewCopyConvolutionFilter2D = NULL;\r\nPFNGLGETCOLORTABLEPROC __glewGetColorTable = NULL;\r\nPFNGLGETCOLORTABLEPARAMETERFVPROC __glewGetColorTableParameterfv = NULL;\r\nPFNGLGETCOLORTABLEPARAMETERIVPROC __glewGetColorTableParameteriv = NULL;\r\nPFNGLGETCONVOLUTIONFILTERPROC __glewGetConvolutionFilter = NULL;\r\nPFNGLGETCONVOLUTIONPARAMETERFVPROC __glewGetConvolutionParameterfv = NULL;\r\nPFNGLGETCONVOLUTIONPARAMETERIVPROC __glewGetConvolutionParameteriv = NULL;\r\nPFNGLGETHISTOGRAMPROC __glewGetHistogram = NULL;\r\nPFNGLGETHISTOGRAMPARAMETERFVPROC __glewGetHistogramParameterfv = NULL;\r\nPFNGLGETHISTOGRAMPARAMETERIVPROC __glewGetHistogramParameteriv = NULL;\r\nPFNGLGETMINMAXPROC __glewGetMinmax = NULL;\r\nPFNGLGETMINMAXPARAMETERFVPROC __glewGetMinmaxParameterfv = NULL;\r\nPFNGLGETMINMAXPARAMETERIVPROC __glewGetMinmaxParameteriv = NULL;\r\nPFNGLGETSEPARABLEFILTERPROC __glewGetSeparableFilter = NULL;\r\nPFNGLHISTOGRAMPROC __glewHistogram = NULL;\r\nPFNGLMINMAXPROC __glewMinmax = NULL;\r\nPFNGLRESETHISTOGRAMPROC __glewResetHistogram = NULL;\r\nPFNGLRESETMINMAXPROC __glewResetMinmax = NULL;\r\nPFNGLSEPARABLEFILTER2DPROC __glewSeparableFilter2D = NULL;\r\n\r\nPFNGLVERTEXATTRIBDIVISORARBPROC __glewVertexAttribDivisorARB = NULL;\r\n\r\nPFNGLFLUSHMAPPEDBUFFERRANGEPROC __glewFlushMappedBufferRange = NULL;\r\nPFNGLMAPBUFFERRANGEPROC __glewMapBufferRange = NULL;\r\n\r\nPFNGLCURRENTPALETTEMATRIXARBPROC __glewCurrentPaletteMatrixARB = NULL;\r\nPFNGLMATRIXINDEXPOINTERARBPROC __glewMatrixIndexPointerARB = NULL;\r\nPFNGLMATRIXINDEXUBVARBPROC __glewMatrixIndexubvARB = NULL;\r\nPFNGLMATRIXINDEXUIVARBPROC __glewMatrixIndexuivARB = NULL;\r\nPFNGLMATRIXINDEXUSVARBPROC __glewMatrixIndexusvARB = NULL;\r\n\r\nPFNGLSAMPLECOVERAGEARBPROC __glewSampleCoverageARB = NULL;\r\n\r\nPFNGLACTIVETEXTUREARBPROC __glewActiveTextureARB = NULL;\r\nPFNGLCLIENTACTIVETEXTUREARBPROC __glewClientActiveTextureARB = NULL;\r\nPFNGLMULTITEXCOORD1DARBPROC __glewMultiTexCoord1dARB = NULL;\r\nPFNGLMULTITEXCOORD1DVARBPROC __glewMultiTexCoord1dvARB = NULL;\r\nPFNGLMULTITEXCOORD1FARBPROC __glewMultiTexCoord1fARB = NULL;\r\nPFNGLMULTITEXCOORD1FVARBPROC __glewMultiTexCoord1fvARB = NULL;\r\nPFNGLMULTITEXCOORD1IARBPROC __glewMultiTexCoord1iARB = NULL;\r\nPFNGLMULTITEXCOORD1IVARBPROC __glewMultiTexCoord1ivARB = NULL;\r\nPFNGLMULTITEXCOORD1SARBPROC __glewMultiTexCoord1sARB = NULL;\r\nPFNGLMULTITEXCOORD1SVARBPROC __glewMultiTexCoord1svARB = NULL;\r\nPFNGLMULTITEXCOORD2DARBPROC __glewMultiTexCoord2dARB = NULL;\r\nPFNGLMULTITEXCOORD2DVARBPROC __glewMultiTexCoord2dvARB = NULL;\r\nPFNGLMULTITEXCOORD2FARBPROC __glewMultiTexCoord2fARB = NULL;\r\nPFNGLMULTITEXCOORD2FVARBPROC __glewMultiTexCoord2fvARB = NULL;\r\nPFNGLMULTITEXCOORD2IARBPROC __glewMultiTexCoord2iARB = NULL;\r\nPFNGLMULTITEXCOORD2IVARBPROC __glewMultiTexCoord2ivARB = NULL;\r\nPFNGLMULTITEXCOORD2SARBPROC __glewMultiTexCoord2sARB = NULL;\r\nPFNGLMULTITEXCOORD2SVARBPROC __glewMultiTexCoord2svARB = NULL;\r\nPFNGLMULTITEXCOORD3DARBPROC __glewMultiTexCoord3dARB = NULL;\r\nPFNGLMULTITEXCOORD3DVARBPROC __glewMultiTexCoord3dvARB = NULL;\r\nPFNGLMULTITEXCOORD3FARBPROC __glewMultiTexCoord3fARB = NULL;\r\nPFNGLMULTITEXCOORD3FVARBPROC __glewMultiTexCoord3fvARB = NULL;\r\nPFNGLMULTITEXCOORD3IARBPROC __glewMultiTexCoord3iARB = NULL;\r\nPFNGLMULTITEXCOORD3IVARBPROC __glewMultiTexCoord3ivARB = NULL;\r\nPFNGLMULTITEXCOORD3SARBPROC __glewMultiTexCoord3sARB = NULL;\r\nPFNGLMULTITEXCOORD3SVARBPROC __glewMultiTexCoord3svARB = NULL;\r\nPFNGLMULTITEXCOORD4DARBPROC __glewMultiTexCoord4dARB = NULL;\r\nPFNGLMULTITEXCOORD4DVARBPROC __glewMultiTexCoord4dvARB = NULL;\r\nPFNGLMULTITEXCOORD4FARBPROC __glewMultiTexCoord4fARB = NULL;\r\nPFNGLMULTITEXCOORD4FVARBPROC __glewMultiTexCoord4fvARB = NULL;\r\nPFNGLMULTITEXCOORD4IARBPROC __glewMultiTexCoord4iARB = NULL;\r\nPFNGLMULTITEXCOORD4IVARBPROC __glewMultiTexCoord4ivARB = NULL;\r\nPFNGLMULTITEXCOORD4SARBPROC __glewMultiTexCoord4sARB = NULL;\r\nPFNGLMULTITEXCOORD4SVARBPROC __glewMultiTexCoord4svARB = NULL;\r\n\r\nPFNGLBEGINQUERYARBPROC __glewBeginQueryARB = NULL;\r\nPFNGLDELETEQUERIESARBPROC __glewDeleteQueriesARB = NULL;\r\nPFNGLENDQUERYARBPROC __glewEndQueryARB = NULL;\r\nPFNGLGENQUERIESARBPROC __glewGenQueriesARB = NULL;\r\nPFNGLGETQUERYOBJECTIVARBPROC __glewGetQueryObjectivARB = NULL;\r\nPFNGLGETQUERYOBJECTUIVARBPROC __glewGetQueryObjectuivARB = NULL;\r\nPFNGLGETQUERYIVARBPROC __glewGetQueryivARB = NULL;\r\nPFNGLISQUERYARBPROC __glewIsQueryARB = NULL;\r\n\r\nPFNGLPOINTPARAMETERFARBPROC __glewPointParameterfARB = NULL;\r\nPFNGLPOINTPARAMETERFVARBPROC __glewPointParameterfvARB = NULL;\r\n\r\nPFNGLPROVOKINGVERTEXPROC __glewProvokingVertex = NULL;\r\n\r\nPFNGLMINSAMPLESHADINGARBPROC __glewMinSampleShadingARB = NULL;\r\n\r\nPFNGLATTACHOBJECTARBPROC __glewAttachObjectARB = NULL;\r\nPFNGLCOMPILESHADERARBPROC __glewCompileShaderARB = NULL;\r\nPFNGLCREATEPROGRAMOBJECTARBPROC __glewCreateProgramObjectARB = NULL;\r\nPFNGLCREATESHADEROBJECTARBPROC __glewCreateShaderObjectARB = NULL;\r\nPFNGLDELETEOBJECTARBPROC __glewDeleteObjectARB = NULL;\r\nPFNGLDETACHOBJECTARBPROC __glewDetachObjectARB = NULL;\r\nPFNGLGETACTIVEUNIFORMARBPROC __glewGetActiveUniformARB = NULL;\r\nPFNGLGETATTACHEDOBJECTSARBPROC __glewGetAttachedObjectsARB = NULL;\r\nPFNGLGETHANDLEARBPROC __glewGetHandleARB = NULL;\r\nPFNGLGETINFOLOGARBPROC __glewGetInfoLogARB = NULL;\r\nPFNGLGETOBJECTPARAMETERFVARBPROC __glewGetObjectParameterfvARB = NULL;\r\nPFNGLGETOBJECTPARAMETERIVARBPROC __glewGetObjectParameterivARB = NULL;\r\nPFNGLGETSHADERSOURCEARBPROC __glewGetShaderSourceARB = NULL;\r\nPFNGLGETUNIFORMLOCATIONARBPROC __glewGetUniformLocationARB = NULL;\r\nPFNGLGETUNIFORMFVARBPROC __glewGetUniformfvARB = NULL;\r\nPFNGLGETUNIFORMIVARBPROC __glewGetUniformivARB = NULL;\r\nPFNGLLINKPROGRAMARBPROC __glewLinkProgramARB = NULL;\r\nPFNGLSHADERSOURCEARBPROC __glewShaderSourceARB = NULL;\r\nPFNGLUNIFORM1FARBPROC __glewUniform1fARB = NULL;\r\nPFNGLUNIFORM1FVARBPROC __glewUniform1fvARB = NULL;\r\nPFNGLUNIFORM1IARBPROC __glewUniform1iARB = NULL;\r\nPFNGLUNIFORM1IVARBPROC __glewUniform1ivARB = NULL;\r\nPFNGLUNIFORM2FARBPROC __glewUniform2fARB = NULL;\r\nPFNGLUNIFORM2FVARBPROC __glewUniform2fvARB = NULL;\r\nPFNGLUNIFORM2IARBPROC __glewUniform2iARB = NULL;\r\nPFNGLUNIFORM2IVARBPROC __glewUniform2ivARB = NULL;\r\nPFNGLUNIFORM3FARBPROC __glewUniform3fARB = NULL;\r\nPFNGLUNIFORM3FVARBPROC __glewUniform3fvARB = NULL;\r\nPFNGLUNIFORM3IARBPROC __glewUniform3iARB = NULL;\r\nPFNGLUNIFORM3IVARBPROC __glewUniform3ivARB = NULL;\r\nPFNGLUNIFORM4FARBPROC __glewUniform4fARB = NULL;\r\nPFNGLUNIFORM4FVARBPROC __glewUniform4fvARB = NULL;\r\nPFNGLUNIFORM4IARBPROC __glewUniform4iARB = NULL;\r\nPFNGLUNIFORM4IVARBPROC __glewUniform4ivARB = NULL;\r\nPFNGLUNIFORMMATRIX2FVARBPROC __glewUniformMatrix2fvARB = NULL;\r\nPFNGLUNIFORMMATRIX3FVARBPROC __glewUniformMatrix3fvARB = NULL;\r\nPFNGLUNIFORMMATRIX4FVARBPROC __glewUniformMatrix4fvARB = NULL;\r\nPFNGLUSEPROGRAMOBJECTARBPROC __glewUseProgramObjectARB = NULL;\r\nPFNGLVALIDATEPROGRAMARBPROC __glewValidateProgramARB = NULL;\r\n\r\nPFNGLCLIENTWAITSYNCPROC __glewClientWaitSync = NULL;\r\nPFNGLDELETESYNCPROC __glewDeleteSync = NULL;\r\nPFNGLFENCESYNCPROC __glewFenceSync = NULL;\r\nPFNGLGETINTEGER64VPROC __glewGetInteger64v = NULL;\r\nPFNGLGETSYNCIVPROC __glewGetSynciv = NULL;\r\nPFNGLISSYNCPROC __glewIsSync = NULL;\r\nPFNGLWAITSYNCPROC __glewWaitSync = NULL;\r\n\r\nPFNGLTEXBUFFERARBPROC __glewTexBufferARB = NULL;\r\n\r\nPFNGLCOMPRESSEDTEXIMAGE1DARBPROC __glewCompressedTexImage1DARB = NULL;\r\nPFNGLCOMPRESSEDTEXIMAGE2DARBPROC __glewCompressedTexImage2DARB = NULL;\r\nPFNGLCOMPRESSEDTEXIMAGE3DARBPROC __glewCompressedTexImage3DARB = NULL;\r\nPFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC __glewCompressedTexSubImage1DARB = NULL;\r\nPFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC __glewCompressedTexSubImage2DARB = NULL;\r\nPFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC __glewCompressedTexSubImage3DARB = NULL;\r\nPFNGLGETCOMPRESSEDTEXIMAGEARBPROC __glewGetCompressedTexImageARB = NULL;\r\n\r\nPFNGLGETMULTISAMPLEFVPROC __glewGetMultisamplefv = NULL;\r\nPFNGLSAMPLEMASKIPROC __glewSampleMaski = NULL;\r\nPFNGLTEXIMAGE2DMULTISAMPLEPROC __glewTexImage2DMultisample = NULL;\r\nPFNGLTEXIMAGE3DMULTISAMPLEPROC __glewTexImage3DMultisample = NULL;\r\n\r\nPFNGLLOADTRANSPOSEMATRIXDARBPROC __glewLoadTransposeMatrixdARB = NULL;\r\nPFNGLLOADTRANSPOSEMATRIXFARBPROC __glewLoadTransposeMatrixfARB = NULL;\r\nPFNGLMULTTRANSPOSEMATRIXDARBPROC __glewMultTransposeMatrixdARB = NULL;\r\nPFNGLMULTTRANSPOSEMATRIXFARBPROC __glewMultTransposeMatrixfARB = NULL;\r\n\r\nPFNGLBINDBUFFERBASEPROC __glewBindBufferBase = NULL;\r\nPFNGLBINDBUFFERRANGEPROC __glewBindBufferRange = NULL;\r\nPFNGLGETACTIVEUNIFORMBLOCKNAMEPROC __glewGetActiveUniformBlockName = NULL;\r\nPFNGLGETACTIVEUNIFORMBLOCKIVPROC __glewGetActiveUniformBlockiv = NULL;\r\nPFNGLGETACTIVEUNIFORMNAMEPROC __glewGetActiveUniformName = NULL;\r\nPFNGLGETACTIVEUNIFORMSIVPROC __glewGetActiveUniformsiv = NULL;\r\nPFNGLGETINTEGERI_VPROC __glewGetIntegeri_v = NULL;\r\nPFNGLGETUNIFORMBLOCKINDEXPROC __glewGetUniformBlockIndex = NULL;\r\nPFNGLGETUNIFORMINDICESPROC __glewGetUniformIndices = NULL;\r\nPFNGLUNIFORMBLOCKBINDINGPROC __glewUniformBlockBinding = NULL;\r\n\r\nPFNGLBINDVERTEXARRAYPROC __glewBindVertexArray = NULL;\r\nPFNGLDELETEVERTEXARRAYSPROC __glewDeleteVertexArrays = NULL;\r\nPFNGLGENVERTEXARRAYSPROC __glewGenVertexArrays = NULL;\r\nPFNGLISVERTEXARRAYPROC __glewIsVertexArray = NULL;\r\n\r\nPFNGLVERTEXBLENDARBPROC __glewVertexBlendARB = NULL;\r\nPFNGLWEIGHTPOINTERARBPROC __glewWeightPointerARB = NULL;\r\nPFNGLWEIGHTBVARBPROC __glewWeightbvARB = NULL;\r\nPFNGLWEIGHTDVARBPROC __glewWeightdvARB = NULL;\r\nPFNGLWEIGHTFVARBPROC __glewWeightfvARB = NULL;\r\nPFNGLWEIGHTIVARBPROC __glewWeightivARB = NULL;\r\nPFNGLWEIGHTSVARBPROC __glewWeightsvARB = NULL;\r\nPFNGLWEIGHTUBVARBPROC __glewWeightubvARB = NULL;\r\nPFNGLWEIGHTUIVARBPROC __glewWeightuivARB = NULL;\r\nPFNGLWEIGHTUSVARBPROC __glewWeightusvARB = NULL;\r\n\r\nPFNGLBINDBUFFERARBPROC __glewBindBufferARB = NULL;\r\nPFNGLBUFFERDATAARBPROC __glewBufferDataARB = NULL;\r\nPFNGLBUFFERSUBDATAARBPROC __glewBufferSubDataARB = NULL;\r\nPFNGLDELETEBUFFERSARBPROC __glewDeleteBuffersARB = NULL;\r\nPFNGLGENBUFFERSARBPROC __glewGenBuffersARB = NULL;\r\nPFNGLGETBUFFERPARAMETERIVARBPROC __glewGetBufferParameterivARB = NULL;\r\nPFNGLGETBUFFERPOINTERVARBPROC __glewGetBufferPointervARB = NULL;\r\nPFNGLGETBUFFERSUBDATAARBPROC __glewGetBufferSubDataARB = NULL;\r\nPFNGLISBUFFERARBPROC __glewIsBufferARB = NULL;\r\nPFNGLMAPBUFFERARBPROC __glewMapBufferARB = NULL;\r\nPFNGLUNMAPBUFFERARBPROC __glewUnmapBufferARB = NULL;\r\n\r\nPFNGLBINDPROGRAMARBPROC __glewBindProgramARB = NULL;\r\nPFNGLDELETEPROGRAMSARBPROC __glewDeleteProgramsARB = NULL;\r\nPFNGLDISABLEVERTEXATTRIBARRAYARBPROC __glewDisableVertexAttribArrayARB = NULL;\r\nPFNGLENABLEVERTEXATTRIBARRAYARBPROC __glewEnableVertexAttribArrayARB = NULL;\r\nPFNGLGENPROGRAMSARBPROC __glewGenProgramsARB = NULL;\r\nPFNGLGETPROGRAMENVPARAMETERDVARBPROC __glewGetProgramEnvParameterdvARB = NULL;\r\nPFNGLGETPROGRAMENVPARAMETERFVARBPROC __glewGetProgramEnvParameterfvARB = NULL;\r\nPFNGLGETPROGRAMLOCALPARAMETERDVARBPROC __glewGetProgramLocalParameterdvARB = NULL;\r\nPFNGLGETPROGRAMLOCALPARAMETERFVARBPROC __glewGetProgramLocalParameterfvARB = NULL;\r\nPFNGLGETPROGRAMSTRINGARBPROC __glewGetProgramStringARB = NULL;\r\nPFNGLGETPROGRAMIVARBPROC __glewGetProgramivARB = NULL;\r\nPFNGLGETVERTEXATTRIBPOINTERVARBPROC __glewGetVertexAttribPointervARB = NULL;\r\nPFNGLGETVERTEXATTRIBDVARBPROC __glewGetVertexAttribdvARB = NULL;\r\nPFNGLGETVERTEXATTRIBFVARBPROC __glewGetVertexAttribfvARB = NULL;\r\nPFNGLGETVERTEXATTRIBIVARBPROC __glewGetVertexAttribivARB = NULL;\r\nPFNGLISPROGRAMARBPROC __glewIsProgramARB = NULL;\r\nPFNGLPROGRAMENVPARAMETER4DARBPROC __glewProgramEnvParameter4dARB = NULL;\r\nPFNGLPROGRAMENVPARAMETER4DVARBPROC __glewProgramEnvParameter4dvARB = NULL;\r\nPFNGLPROGRAMENVPARAMETER4FARBPROC __glewProgramEnvParameter4fARB = NULL;\r\nPFNGLPROGRAMENVPARAMETER4FVARBPROC __glewProgramEnvParameter4fvARB = NULL;\r\nPFNGLPROGRAMLOCALPARAMETER4DARBPROC __glewProgramLocalParameter4dARB = NULL;\r\nPFNGLPROGRAMLOCALPARAMETER4DVARBPROC __glewProgramLocalParameter4dvARB = NULL;\r\nPFNGLPROGRAMLOCALPARAMETER4FARBPROC __glewProgramLocalParameter4fARB = NULL;\r\nPFNGLPROGRAMLOCALPARAMETER4FVARBPROC __glewProgramLocalParameter4fvARB = NULL;\r\nPFNGLPROGRAMSTRINGARBPROC __glewProgramStringARB = NULL;\r\nPFNGLVERTEXATTRIB1DARBPROC __glewVertexAttrib1dARB = NULL;\r\nPFNGLVERTEXATTRIB1DVARBPROC __glewVertexAttrib1dvARB = NULL;\r\nPFNGLVERTEXATTRIB1FARBPROC __glewVertexAttrib1fARB = NULL;\r\nPFNGLVERTEXATTRIB1FVARBPROC __glewVertexAttrib1fvARB = NULL;\r\nPFNGLVERTEXATTRIB1SARBPROC __glewVertexAttrib1sARB = NULL;\r\nPFNGLVERTEXATTRIB1SVARBPROC __glewVertexAttrib1svARB = NULL;\r\nPFNGLVERTEXATTRIB2DARBPROC __glewVertexAttrib2dARB = NULL;\r\nPFNGLVERTEXATTRIB2DVARBPROC __glewVertexAttrib2dvARB = NULL;\r\nPFNGLVERTEXATTRIB2FARBPROC __glewVertexAttrib2fARB = NULL;\r\nPFNGLVERTEXATTRIB2FVARBPROC __glewVertexAttrib2fvARB = NULL;\r\nPFNGLVERTEXATTRIB2SARBPROC __glewVertexAttrib2sARB = NULL;\r\nPFNGLVERTEXATTRIB2SVARBPROC __glewVertexAttrib2svARB = NULL;\r\nPFNGLVERTEXATTRIB3DARBPROC __glewVertexAttrib3dARB = NULL;\r\nPFNGLVERTEXATTRIB3DVARBPROC __glewVertexAttrib3dvARB = NULL;\r\nPFNGLVERTEXATTRIB3FARBPROC __glewVertexAttrib3fARB = NULL;\r\nPFNGLVERTEXATTRIB3FVARBPROC __glewVertexAttrib3fvARB = NULL;\r\nPFNGLVERTEXATTRIB3SARBPROC __glewVertexAttrib3sARB = NULL;\r\nPFNGLVERTEXATTRIB3SVARBPROC __glewVertexAttrib3svARB = NULL;\r\nPFNGLVERTEXATTRIB4NBVARBPROC __glewVertexAttrib4NbvARB = NULL;\r\nPFNGLVERTEXATTRIB4NIVARBPROC __glewVertexAttrib4NivARB = NULL;\r\nPFNGLVERTEXATTRIB4NSVARBPROC __glewVertexAttrib4NsvARB = NULL;\r\nPFNGLVERTEXATTRIB4NUBARBPROC __glewVertexAttrib4NubARB = NULL;\r\nPFNGLVERTEXATTRIB4NUBVARBPROC __glewVertexAttrib4NubvARB = NULL;\r\nPFNGLVERTEXATTRIB4NUIVARBPROC __glewVertexAttrib4NuivARB = NULL;\r\nPFNGLVERTEXATTRIB4NUSVARBPROC __glewVertexAttrib4NusvARB = NULL;\r\nPFNGLVERTEXATTRIB4BVARBPROC __glewVertexAttrib4bvARB = NULL;\r\nPFNGLVERTEXATTRIB4DARBPROC __glewVertexAttrib4dARB = NULL;\r\nPFNGLVERTEXATTRIB4DVARBPROC __glewVertexAttrib4dvARB = NULL;\r\nPFNGLVERTEXATTRIB4FARBPROC __glewVertexAttrib4fARB = NULL;\r\nPFNGLVERTEXATTRIB4FVARBPROC __glewVertexAttrib4fvARB = NULL;\r\nPFNGLVERTEXATTRIB4IVARBPROC __glewVertexAttrib4ivARB = NULL;\r\nPFNGLVERTEXATTRIB4SARBPROC __glewVertexAttrib4sARB = NULL;\r\nPFNGLVERTEXATTRIB4SVARBPROC __glewVertexAttrib4svARB = NULL;\r\nPFNGLVERTEXATTRIB4UBVARBPROC __glewVertexAttrib4ubvARB = NULL;\r\nPFNGLVERTEXATTRIB4UIVARBPROC __glewVertexAttrib4uivARB = NULL;\r\nPFNGLVERTEXATTRIB4USVARBPROC __glewVertexAttrib4usvARB = NULL;\r\nPFNGLVERTEXATTRIBPOINTERARBPROC __glewVertexAttribPointerARB = NULL;\r\n\r\nPFNGLBINDATTRIBLOCATIONARBPROC __glewBindAttribLocationARB = NULL;\r\nPFNGLGETACTIVEATTRIBARBPROC __glewGetActiveAttribARB = NULL;\r\nPFNGLGETATTRIBLOCATIONARBPROC __glewGetAttribLocationARB = NULL;\r\n\r\nPFNGLWINDOWPOS2DARBPROC __glewWindowPos2dARB = NULL;\r\nPFNGLWINDOWPOS2DVARBPROC __glewWindowPos2dvARB = NULL;\r\nPFNGLWINDOWPOS2FARBPROC __glewWindowPos2fARB = NULL;\r\nPFNGLWINDOWPOS2FVARBPROC __glewWindowPos2fvARB = NULL;\r\nPFNGLWINDOWPOS2IARBPROC __glewWindowPos2iARB = NULL;\r\nPFNGLWINDOWPOS2IVARBPROC __glewWindowPos2ivARB = NULL;\r\nPFNGLWINDOWPOS2SARBPROC __glewWindowPos2sARB = NULL;\r\nPFNGLWINDOWPOS2SVARBPROC __glewWindowPos2svARB = NULL;\r\nPFNGLWINDOWPOS3DARBPROC __glewWindowPos3dARB = NULL;\r\nPFNGLWINDOWPOS3DVARBPROC __glewWindowPos3dvARB = NULL;\r\nPFNGLWINDOWPOS3FARBPROC __glewWindowPos3fARB = NULL;\r\nPFNGLWINDOWPOS3FVARBPROC __glewWindowPos3fvARB = NULL;\r\nPFNGLWINDOWPOS3IARBPROC __glewWindowPos3iARB = NULL;\r\nPFNGLWINDOWPOS3IVARBPROC __glewWindowPos3ivARB = NULL;\r\nPFNGLWINDOWPOS3SARBPROC __glewWindowPos3sARB = NULL;\r\nPFNGLWINDOWPOS3SVARBPROC __glewWindowPos3svARB = NULL;\r\n\r\nPFNGLDRAWBUFFERSATIPROC __glewDrawBuffersATI = NULL;\r\n\r\nPFNGLDRAWELEMENTARRAYATIPROC __glewDrawElementArrayATI = NULL;\r\nPFNGLDRAWRANGEELEMENTARRAYATIPROC __glewDrawRangeElementArrayATI = NULL;\r\nPFNGLELEMENTPOINTERATIPROC __glewElementPointerATI = NULL;\r\n\r\nPFNGLGETTEXBUMPPARAMETERFVATIPROC __glewGetTexBumpParameterfvATI = NULL;\r\nPFNGLGETTEXBUMPPARAMETERIVATIPROC __glewGetTexBumpParameterivATI = NULL;\r\nPFNGLTEXBUMPPARAMETERFVATIPROC __glewTexBumpParameterfvATI = NULL;\r\nPFNGLTEXBUMPPARAMETERIVATIPROC __glewTexBumpParameterivATI = NULL;\r\n\r\nPFNGLALPHAFRAGMENTOP1ATIPROC __glewAlphaFragmentOp1ATI = NULL;\r\nPFNGLALPHAFRAGMENTOP2ATIPROC __glewAlphaFragmentOp2ATI = NULL;\r\nPFNGLALPHAFRAGMENTOP3ATIPROC __glewAlphaFragmentOp3ATI = NULL;\r\nPFNGLBEGINFRAGMENTSHADERATIPROC __glewBeginFragmentShaderATI = NULL;\r\nPFNGLBINDFRAGMENTSHADERATIPROC __glewBindFragmentShaderATI = NULL;\r\nPFNGLCOLORFRAGMENTOP1ATIPROC __glewColorFragmentOp1ATI = NULL;\r\nPFNGLCOLORFRAGMENTOP2ATIPROC __glewColorFragmentOp2ATI = NULL;\r\nPFNGLCOLORFRAGMENTOP3ATIPROC __glewColorFragmentOp3ATI = NULL;\r\nPFNGLDELETEFRAGMENTSHADERATIPROC __glewDeleteFragmentShaderATI = NULL;\r\nPFNGLENDFRAGMENTSHADERATIPROC __glewEndFragmentShaderATI = NULL;\r\nPFNGLGENFRAGMENTSHADERSATIPROC __glewGenFragmentShadersATI = NULL;\r\nPFNGLPASSTEXCOORDATIPROC __glewPassTexCoordATI = NULL;\r\nPFNGLSAMPLEMAPATIPROC __glewSampleMapATI = NULL;\r\nPFNGLSETFRAGMENTSHADERCONSTANTATIPROC __glewSetFragmentShaderConstantATI = NULL;\r\n\r\nPFNGLMAPOBJECTBUFFERATIPROC __glewMapObjectBufferATI = NULL;\r\nPFNGLUNMAPOBJECTBUFFERATIPROC __glewUnmapObjectBufferATI = NULL;\r\n\r\nPFNGLPNTRIANGLESFATIPROC __glPNTrianglewesfATI = NULL;\r\nPFNGLPNTRIANGLESIATIPROC __glPNTrianglewesiATI = NULL;\r\n\r\nPFNGLSTENCILFUNCSEPARATEATIPROC __glewStencilFuncSeparateATI = NULL;\r\nPFNGLSTENCILOPSEPARATEATIPROC __glewStencilOpSeparateATI = NULL;\r\n\r\nPFNGLARRAYOBJECTATIPROC __glewArrayObjectATI = NULL;\r\nPFNGLFREEOBJECTBUFFERATIPROC __glewFreeObjectBufferATI = NULL;\r\nPFNGLGETARRAYOBJECTFVATIPROC __glewGetArrayObjectfvATI = NULL;\r\nPFNGLGETARRAYOBJECTIVATIPROC __glewGetArrayObjectivATI = NULL;\r\nPFNGLGETOBJECTBUFFERFVATIPROC __glewGetObjectBufferfvATI = NULL;\r\nPFNGLGETOBJECTBUFFERIVATIPROC __glewGetObjectBufferivATI = NULL;\r\nPFNGLGETVARIANTARRAYOBJECTFVATIPROC __glewGetVariantArrayObjectfvATI = NULL;\r\nPFNGLGETVARIANTARRAYOBJECTIVATIPROC __glewGetVariantArrayObjectivATI = NULL;\r\nPFNGLISOBJECTBUFFERATIPROC __glewIsObjectBufferATI = NULL;\r\nPFNGLNEWOBJECTBUFFERATIPROC __glewNewObjectBufferATI = NULL;\r\nPFNGLUPDATEOBJECTBUFFERATIPROC __glewUpdateObjectBufferATI = NULL;\r\nPFNGLVARIANTARRAYOBJECTATIPROC __glewVariantArrayObjectATI = NULL;\r\n\r\nPFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC __glewGetVertexAttribArrayObjectfvATI = NULL;\r\nPFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC __glewGetVertexAttribArrayObjectivATI = NULL;\r\nPFNGLVERTEXATTRIBARRAYOBJECTATIPROC __glewVertexAttribArrayObjectATI = NULL;\r\n\r\nPFNGLCLIENTACTIVEVERTEXSTREAMATIPROC __glewClientActiveVertexStreamATI = NULL;\r\nPFNGLNORMALSTREAM3BATIPROC __glewNormalStream3bATI = NULL;\r\nPFNGLNORMALSTREAM3BVATIPROC __glewNormalStream3bvATI = NULL;\r\nPFNGLNORMALSTREAM3DATIPROC __glewNormalStream3dATI = NULL;\r\nPFNGLNORMALSTREAM3DVATIPROC __glewNormalStream3dvATI = NULL;\r\nPFNGLNORMALSTREAM3FATIPROC __glewNormalStream3fATI = NULL;\r\nPFNGLNORMALSTREAM3FVATIPROC __glewNormalStream3fvATI = NULL;\r\nPFNGLNORMALSTREAM3IATIPROC __glewNormalStream3iATI = NULL;\r\nPFNGLNORMALSTREAM3IVATIPROC __glewNormalStream3ivATI = NULL;\r\nPFNGLNORMALSTREAM3SATIPROC __glewNormalStream3sATI = NULL;\r\nPFNGLNORMALSTREAM3SVATIPROC __glewNormalStream3svATI = NULL;\r\nPFNGLVERTEXBLENDENVFATIPROC __glewVertexBlendEnvfATI = NULL;\r\nPFNGLVERTEXBLENDENVIATIPROC __glewVertexBlendEnviATI = NULL;\r\nPFNGLVERTEXSTREAM2DATIPROC __glewVertexStream2dATI = NULL;\r\nPFNGLVERTEXSTREAM2DVATIPROC __glewVertexStream2dvATI = NULL;\r\nPFNGLVERTEXSTREAM2FATIPROC __glewVertexStream2fATI = NULL;\r\nPFNGLVERTEXSTREAM2FVATIPROC __glewVertexStream2fvATI = NULL;\r\nPFNGLVERTEXSTREAM2IATIPROC __glewVertexStream2iATI = NULL;\r\nPFNGLVERTEXSTREAM2IVATIPROC __glewVertexStream2ivATI = NULL;\r\nPFNGLVERTEXSTREAM2SATIPROC __glewVertexStream2sATI = NULL;\r\nPFNGLVERTEXSTREAM2SVATIPROC __glewVertexStream2svATI = NULL;\r\nPFNGLVERTEXSTREAM3DATIPROC __glewVertexStream3dATI = NULL;\r\nPFNGLVERTEXSTREAM3DVATIPROC __glewVertexStream3dvATI = NULL;\r\nPFNGLVERTEXSTREAM3FATIPROC __glewVertexStream3fATI = NULL;\r\nPFNGLVERTEXSTREAM3FVATIPROC __glewVertexStream3fvATI = NULL;\r\nPFNGLVERTEXSTREAM3IATIPROC __glewVertexStream3iATI = NULL;\r\nPFNGLVERTEXSTREAM3IVATIPROC __glewVertexStream3ivATI = NULL;\r\nPFNGLVERTEXSTREAM3SATIPROC __glewVertexStream3sATI = NULL;\r\nPFNGLVERTEXSTREAM3SVATIPROC __glewVertexStream3svATI = NULL;\r\nPFNGLVERTEXSTREAM4DATIPROC __glewVertexStream4dATI = NULL;\r\nPFNGLVERTEXSTREAM4DVATIPROC __glewVertexStream4dvATI = NULL;\r\nPFNGLVERTEXSTREAM4FATIPROC __glewVertexStream4fATI = NULL;\r\nPFNGLVERTEXSTREAM4FVATIPROC __glewVertexStream4fvATI = NULL;\r\nPFNGLVERTEXSTREAM4IATIPROC __glewVertexStream4iATI = NULL;\r\nPFNGLVERTEXSTREAM4IVATIPROC __glewVertexStream4ivATI = NULL;\r\nPFNGLVERTEXSTREAM4SATIPROC __glewVertexStream4sATI = NULL;\r\nPFNGLVERTEXSTREAM4SVATIPROC __glewVertexStream4svATI = NULL;\r\n\r\nPFNGLGETUNIFORMBUFFERSIZEEXTPROC __glewGetUniformBufferSizeEXT = NULL;\r\nPFNGLGETUNIFORMOFFSETEXTPROC __glewGetUniformOffsetEXT = NULL;\r\nPFNGLUNIFORMBUFFEREXTPROC __glewUniformBufferEXT = NULL;\r\n\r\nPFNGLBLENDCOLOREXTPROC __glewBlendColorEXT = NULL;\r\n\r\nPFNGLBLENDEQUATIONSEPARATEEXTPROC __glewBlendEquationSeparateEXT = NULL;\r\n\r\nPFNGLBLENDFUNCSEPARATEEXTPROC __glewBlendFuncSeparateEXT = NULL;\r\n\r\nPFNGLBLENDEQUATIONEXTPROC __glewBlendEquationEXT = NULL;\r\n\r\nPFNGLCOLORSUBTABLEEXTPROC __glewColorSubTableEXT = NULL;\r\nPFNGLCOPYCOLORSUBTABLEEXTPROC __glewCopyColorSubTableEXT = NULL;\r\n\r\nPFNGLLOCKARRAYSEXTPROC __glewLockArraysEXT = NULL;\r\nPFNGLUNLOCKARRAYSEXTPROC __glewUnlockArraysEXT = NULL;\r\n\r\nPFNGLCONVOLUTIONFILTER1DEXTPROC __glewConvolutionFilter1DEXT = NULL;\r\nPFNGLCONVOLUTIONFILTER2DEXTPROC __glewConvolutionFilter2DEXT = NULL;\r\nPFNGLCONVOLUTIONPARAMETERFEXTPROC __glewConvolutionParameterfEXT = NULL;\r\nPFNGLCONVOLUTIONPARAMETERFVEXTPROC __glewConvolutionParameterfvEXT = NULL;\r\nPFNGLCONVOLUTIONPARAMETERIEXTPROC __glewConvolutionParameteriEXT = NULL;\r\nPFNGLCONVOLUTIONPARAMETERIVEXTPROC __glewConvolutionParameterivEXT = NULL;\r\nPFNGLCOPYCONVOLUTIONFILTER1DEXTPROC __glewCopyConvolutionFilter1DEXT = NULL;\r\nPFNGLCOPYCONVOLUTIONFILTER2DEXTPROC __glewCopyConvolutionFilter2DEXT = NULL;\r\nPFNGLGETCONVOLUTIONFILTEREXTPROC __glewGetConvolutionFilterEXT = NULL;\r\nPFNGLGETCONVOLUTIONPARAMETERFVEXTPROC __glewGetConvolutionParameterfvEXT = NULL;\r\nPFNGLGETCONVOLUTIONPARAMETERIVEXTPROC __glewGetConvolutionParameterivEXT = NULL;\r\nPFNGLGETSEPARABLEFILTEREXTPROC __glewGetSeparableFilterEXT = NULL;\r\nPFNGLSEPARABLEFILTER2DEXTPROC __glewSeparableFilter2DEXT = NULL;\r\n\r\nPFNGLBINORMALPOINTEREXTPROC __glewBinormalPointerEXT = NULL;\r\nPFNGLTANGENTPOINTEREXTPROC __glewTangentPointerEXT = NULL;\r\n\r\nPFNGLCOPYTEXIMAGE1DEXTPROC __glewCopyTexImage1DEXT = NULL;\r\nPFNGLCOPYTEXIMAGE2DEXTPROC __glewCopyTexImage2DEXT = NULL;\r\nPFNGLCOPYTEXSUBIMAGE1DEXTPROC __glewCopyTexSubImage1DEXT = NULL;\r\nPFNGLCOPYTEXSUBIMAGE2DEXTPROC __glewCopyTexSubImage2DEXT = NULL;\r\nPFNGLCOPYTEXSUBIMAGE3DEXTPROC __glewCopyTexSubImage3DEXT = NULL;\r\n\r\nPFNGLCULLPARAMETERDVEXTPROC __glewCullParameterdvEXT = NULL;\r\nPFNGLCULLPARAMETERFVEXTPROC __glewCullParameterfvEXT = NULL;\r\n\r\nPFNGLDEPTHBOUNDSEXTPROC __glewDepthBoundsEXT = NULL;\r\n\r\nPFNGLBINDMULTITEXTUREEXTPROC __glewBindMultiTextureEXT = NULL;\r\nPFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC __glewCheckNamedFramebufferStatusEXT = NULL;\r\nPFNGLCLIENTATTRIBDEFAULTEXTPROC __glewClientAttribDefaultEXT = NULL;\r\nPFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC __glewCompressedMultiTexImage1DEXT = NULL;\r\nPFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC __glewCompressedMultiTexImage2DEXT = NULL;\r\nPFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC __glewCompressedMultiTexImage3DEXT = NULL;\r\nPFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC __glewCompressedMultiTexSubImage1DEXT = NULL;\r\nPFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC __glewCompressedMultiTexSubImage2DEXT = NULL;\r\nPFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC __glewCompressedMultiTexSubImage3DEXT = NULL;\r\nPFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC __glewCompressedTextureImage1DEXT = NULL;\r\nPFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC __glewCompressedTextureImage2DEXT = NULL;\r\nPFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC __glewCompressedTextureImage3DEXT = NULL;\r\nPFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC __glewCompressedTextureSubImage1DEXT = NULL;\r\nPFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC __glewCompressedTextureSubImage2DEXT = NULL;\r\nPFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC __glewCompressedTextureSubImage3DEXT = NULL;\r\nPFNGLCOPYMULTITEXIMAGE1DEXTPROC __glewCopyMultiTexImage1DEXT = NULL;\r\nPFNGLCOPYMULTITEXIMAGE2DEXTPROC __glewCopyMultiTexImage2DEXT = NULL;\r\nPFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC __glewCopyMultiTexSubImage1DEXT = NULL;\r\nPFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC __glewCopyMultiTexSubImage2DEXT = NULL;\r\nPFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC __glewCopyMultiTexSubImage3DEXT = NULL;\r\nPFNGLCOPYTEXTUREIMAGE1DEXTPROC __glewCopyTextureImage1DEXT = NULL;\r\nPFNGLCOPYTEXTUREIMAGE2DEXTPROC __glewCopyTextureImage2DEXT = NULL;\r\nPFNGLCOPYTEXTURESUBIMAGE1DEXTPROC __glewCopyTextureSubImage1DEXT = NULL;\r\nPFNGLCOPYTEXTURESUBIMAGE2DEXTPROC __glewCopyTextureSubImage2DEXT = NULL;\r\nPFNGLCOPYTEXTURESUBIMAGE3DEXTPROC __glewCopyTextureSubImage3DEXT = NULL;\r\nPFNGLDISABLECLIENTSTATEINDEXEDEXTPROC __glewDisableClientStateIndexedEXT = NULL;\r\nPFNGLDISABLECLIENTSTATEIEXTPROC __glewDisableClientStateiEXT = NULL;\r\nPFNGLDISABLEVERTEXARRAYATTRIBEXTPROC __glewDisableVertexArrayAttribEXT = NULL;\r\nPFNGLDISABLEVERTEXARRAYEXTPROC __glewDisableVertexArrayEXT = NULL;\r\nPFNGLENABLECLIENTSTATEINDEXEDEXTPROC __glewEnableClientStateIndexedEXT = NULL;\r\nPFNGLENABLECLIENTSTATEIEXTPROC __glewEnableClientStateiEXT = NULL;\r\nPFNGLENABLEVERTEXARRAYATTRIBEXTPROC __glewEnableVertexArrayAttribEXT = NULL;\r\nPFNGLENABLEVERTEXARRAYEXTPROC __glewEnableVertexArrayEXT = NULL;\r\nPFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC __glewFlushMappedNamedBufferRangeEXT = NULL;\r\nPFNGLFRAMEBUFFERDRAWBUFFEREXTPROC __glewFramebufferDrawBufferEXT = NULL;\r\nPFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC __glewFramebufferDrawBuffersEXT = NULL;\r\nPFNGLFRAMEBUFFERREADBUFFEREXTPROC __glewFramebufferReadBufferEXT = NULL;\r\nPFNGLGENERATEMULTITEXMIPMAPEXTPROC __glewGenerateMultiTexMipmapEXT = NULL;\r\nPFNGLGENERATETEXTUREMIPMAPEXTPROC __glewGenerateTextureMipmapEXT = NULL;\r\nPFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC __glewGetCompressedMultiTexImageEXT = NULL;\r\nPFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC __glewGetCompressedTextureImageEXT = NULL;\r\nPFNGLGETDOUBLEINDEXEDVEXTPROC __glewGetDoubleIndexedvEXT = NULL;\r\nPFNGLGETDOUBLEI_VEXTPROC __glewGetDoublei_vEXT = NULL;\r\nPFNGLGETFLOATINDEXEDVEXTPROC __glewGetFloatIndexedvEXT = NULL;\r\nPFNGLGETFLOATI_VEXTPROC __glewGetFloati_vEXT = NULL;\r\nPFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC __glewGetFramebufferParameterivEXT = NULL;\r\nPFNGLGETMULTITEXENVFVEXTPROC __glewGetMultiTexEnvfvEXT = NULL;\r\nPFNGLGETMULTITEXENVIVEXTPROC __glewGetMultiTexEnvivEXT = NULL;\r\nPFNGLGETMULTITEXGENDVEXTPROC __glewGetMultiTexGendvEXT = NULL;\r\nPFNGLGETMULTITEXGENFVEXTPROC __glewGetMultiTexGenfvEXT = NULL;\r\nPFNGLGETMULTITEXGENIVEXTPROC __glewGetMultiTexGenivEXT = NULL;\r\nPFNGLGETMULTITEXIMAGEEXTPROC __glewGetMultiTexImageEXT = NULL;\r\nPFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC __glewGetMultiTexLevelParameterfvEXT = NULL;\r\nPFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC __glewGetMultiTexLevelParameterivEXT = NULL;\r\nPFNGLGETMULTITEXPARAMETERIIVEXTPROC __glewGetMultiTexParameterIivEXT = NULL;\r\nPFNGLGETMULTITEXPARAMETERIUIVEXTPROC __glewGetMultiTexParameterIuivEXT = NULL;\r\nPFNGLGETMULTITEXPARAMETERFVEXTPROC __glewGetMultiTexParameterfvEXT = NULL;\r\nPFNGLGETMULTITEXPARAMETERIVEXTPROC __glewGetMultiTexParameterivEXT = NULL;\r\nPFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC __glewGetNamedBufferParameterivEXT = NULL;\r\nPFNGLGETNAMEDBUFFERPOINTERVEXTPROC __glewGetNamedBufferPointervEXT = NULL;\r\nPFNGLGETNAMEDBUFFERSUBDATAEXTPROC __glewGetNamedBufferSubDataEXT = NULL;\r\nPFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetNamedFramebufferAttachmentParameterivEXT = NULL;\r\nPFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC __glewGetNamedProgramLocalParameterIivEXT = NULL;\r\nPFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC __glewGetNamedProgramLocalParameterIuivEXT = NULL;\r\nPFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC __glewGetNamedProgramLocalParameterdvEXT = NULL;\r\nPFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC __glewGetNamedProgramLocalParameterfvEXT = NULL;\r\nPFNGLGETNAMEDPROGRAMSTRINGEXTPROC __glewGetNamedProgramStringEXT = NULL;\r\nPFNGLGETNAMEDPROGRAMIVEXTPROC __glewGetNamedProgramivEXT = NULL;\r\nPFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC __glewGetNamedRenderbufferParameterivEXT = NULL;\r\nPFNGLGETPOINTERINDEXEDVEXTPROC __glewGetPointerIndexedvEXT = NULL;\r\nPFNGLGETPOINTERI_VEXTPROC __glewGetPointeri_vEXT = NULL;\r\nPFNGLGETTEXTUREIMAGEEXTPROC __glewGetTextureImageEXT = NULL;\r\nPFNGLGETTEXTURELEVELPARAMETERFVEXTPROC __glewGetTextureLevelParameterfvEXT = NULL;\r\nPFNGLGETTEXTURELEVELPARAMETERIVEXTPROC __glewGetTextureLevelParameterivEXT = NULL;\r\nPFNGLGETTEXTUREPARAMETERIIVEXTPROC __glewGetTextureParameterIivEXT = NULL;\r\nPFNGLGETTEXTUREPARAMETERIUIVEXTPROC __glewGetTextureParameterIuivEXT = NULL;\r\nPFNGLGETTEXTUREPARAMETERFVEXTPROC __glewGetTextureParameterfvEXT = NULL;\r\nPFNGLGETTEXTUREPARAMETERIVEXTPROC __glewGetTextureParameterivEXT = NULL;\r\nPFNGLGETVERTEXARRAYINTEGERI_VEXTPROC __glewGetVertexArrayIntegeri_vEXT = NULL;\r\nPFNGLGETVERTEXARRAYINTEGERVEXTPROC __glewGetVertexArrayIntegervEXT = NULL;\r\nPFNGLGETVERTEXARRAYPOINTERI_VEXTPROC __glewGetVertexArrayPointeri_vEXT = NULL;\r\nPFNGLGETVERTEXARRAYPOINTERVEXTPROC __glewGetVertexArrayPointervEXT = NULL;\r\nPFNGLMAPNAMEDBUFFEREXTPROC __glewMapNamedBufferEXT = NULL;\r\nPFNGLMAPNAMEDBUFFERRANGEEXTPROC __glewMapNamedBufferRangeEXT = NULL;\r\nPFNGLMATRIXFRUSTUMEXTPROC __glewMatrixFrustumEXT = NULL;\r\nPFNGLMATRIXLOADIDENTITYEXTPROC __glewMatrixLoadIdentityEXT = NULL;\r\nPFNGLMATRIXLOADTRANSPOSEDEXTPROC __glewMatrixLoadTransposedEXT = NULL;\r\nPFNGLMATRIXLOADTRANSPOSEFEXTPROC __glewMatrixLoadTransposefEXT = NULL;\r\nPFNGLMATRIXLOADDEXTPROC __glewMatrixLoaddEXT = NULL;\r\nPFNGLMATRIXLOADFEXTPROC __glewMatrixLoadfEXT = NULL;\r\nPFNGLMATRIXMULTTRANSPOSEDEXTPROC __glewMatrixMultTransposedEXT = NULL;\r\nPFNGLMATRIXMULTTRANSPOSEFEXTPROC __glewMatrixMultTransposefEXT = NULL;\r\nPFNGLMATRIXMULTDEXTPROC __glewMatrixMultdEXT = NULL;\r\nPFNGLMATRIXMULTFEXTPROC __glewMatrixMultfEXT = NULL;\r\nPFNGLMATRIXORTHOEXTPROC __glewMatrixOrthoEXT = NULL;\r\nPFNGLMATRIXPOPEXTPROC __glewMatrixPopEXT = NULL;\r\nPFNGLMATRIXPUSHEXTPROC __glewMatrixPushEXT = NULL;\r\nPFNGLMATRIXROTATEDEXTPROC __glewMatrixRotatedEXT = NULL;\r\nPFNGLMATRIXROTATEFEXTPROC __glewMatrixRotatefEXT = NULL;\r\nPFNGLMATRIXSCALEDEXTPROC __glewMatrixScaledEXT = NULL;\r\nPFNGLMATRIXSCALEFEXTPROC __glewMatrixScalefEXT = NULL;\r\nPFNGLMATRIXTRANSLATEDEXTPROC __glewMatrixTranslatedEXT = NULL;\r\nPFNGLMATRIXTRANSLATEFEXTPROC __glewMatrixTranslatefEXT = NULL;\r\nPFNGLMULTITEXBUFFEREXTPROC __glewMultiTexBufferEXT = NULL;\r\nPFNGLMULTITEXCOORDPOINTEREXTPROC __glewMultiTexCoordPointerEXT = NULL;\r\nPFNGLMULTITEXENVFEXTPROC __glewMultiTexEnvfEXT = NULL;\r\nPFNGLMULTITEXENVFVEXTPROC __glewMultiTexEnvfvEXT = NULL;\r\nPFNGLMULTITEXENVIEXTPROC __glewMultiTexEnviEXT = NULL;\r\nPFNGLMULTITEXENVIVEXTPROC __glewMultiTexEnvivEXT = NULL;\r\nPFNGLMULTITEXGENDEXTPROC __glewMultiTexGendEXT = NULL;\r\nPFNGLMULTITEXGENDVEXTPROC __glewMultiTexGendvEXT = NULL;\r\nPFNGLMULTITEXGENFEXTPROC __glewMultiTexGenfEXT = NULL;\r\nPFNGLMULTITEXGENFVEXTPROC __glewMultiTexGenfvEXT = NULL;\r\nPFNGLMULTITEXGENIEXTPROC __glewMultiTexGeniEXT = NULL;\r\nPFNGLMULTITEXGENIVEXTPROC __glewMultiTexGenivEXT = NULL;\r\nPFNGLMULTITEXIMAGE1DEXTPROC __glewMultiTexImage1DEXT = NULL;\r\nPFNGLMULTITEXIMAGE2DEXTPROC __glewMultiTexImage2DEXT = NULL;\r\nPFNGLMULTITEXIMAGE3DEXTPROC __glewMultiTexImage3DEXT = NULL;\r\nPFNGLMULTITEXPARAMETERIIVEXTPROC __glewMultiTexParameterIivEXT = NULL;\r\nPFNGLMULTITEXPARAMETERIUIVEXTPROC __glewMultiTexParameterIuivEXT = NULL;\r\nPFNGLMULTITEXPARAMETERFEXTPROC __glewMultiTexParameterfEXT = NULL;\r\nPFNGLMULTITEXPARAMETERFVEXTPROC __glewMultiTexParameterfvEXT = NULL;\r\nPFNGLMULTITEXPARAMETERIEXTPROC __glewMultiTexParameteriEXT = NULL;\r\nPFNGLMULTITEXPARAMETERIVEXTPROC __glewMultiTexParameterivEXT = NULL;\r\nPFNGLMULTITEXRENDERBUFFEREXTPROC __glewMultiTexRenderbufferEXT = NULL;\r\nPFNGLMULTITEXSUBIMAGE1DEXTPROC __glewMultiTexSubImage1DEXT = NULL;\r\nPFNGLMULTITEXSUBIMAGE2DEXTPROC __glewMultiTexSubImage2DEXT = NULL;\r\nPFNGLMULTITEXSUBIMAGE3DEXTPROC __glewMultiTexSubImage3DEXT = NULL;\r\nPFNGLNAMEDBUFFERDATAEXTPROC __glewNamedBufferDataEXT = NULL;\r\nPFNGLNAMEDBUFFERSUBDATAEXTPROC __glewNamedBufferSubDataEXT = NULL;\r\nPFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC __glewNamedCopyBufferSubDataEXT = NULL;\r\nPFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC __glewNamedFramebufferRenderbufferEXT = NULL;\r\nPFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC __glewNamedFramebufferTexture1DEXT = NULL;\r\nPFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC __glewNamedFramebufferTexture2DEXT = NULL;\r\nPFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC __glewNamedFramebufferTexture3DEXT = NULL;\r\nPFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC __glewNamedFramebufferTextureEXT = NULL;\r\nPFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC __glewNamedFramebufferTextureFaceEXT = NULL;\r\nPFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC __glewNamedFramebufferTextureLayerEXT = NULL;\r\nPFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC __glewNamedProgramLocalParameter4dEXT = NULL;\r\nPFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC __glewNamedProgramLocalParameter4dvEXT = NULL;\r\nPFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC __glewNamedProgramLocalParameter4fEXT = NULL;\r\nPFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC __glewNamedProgramLocalParameter4fvEXT = NULL;\r\nPFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC __glewNamedProgramLocalParameterI4iEXT = NULL;\r\nPFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC __glewNamedProgramLocalParameterI4ivEXT = NULL;\r\nPFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC __glewNamedProgramLocalParameterI4uiEXT = NULL;\r\nPFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC __glewNamedProgramLocalParameterI4uivEXT = NULL;\r\nPFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC __glewNamedProgramLocalParameters4fvEXT = NULL;\r\nPFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC __glewNamedProgramLocalParametersI4ivEXT = NULL;\r\nPFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC __glewNamedProgramLocalParametersI4uivEXT = NULL;\r\nPFNGLNAMEDPROGRAMSTRINGEXTPROC __glewNamedProgramStringEXT = NULL;\r\nPFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC __glewNamedRenderbufferStorageEXT = NULL;\r\nPFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC __glewNamedRenderbufferStorageMultisampleCoverageEXT = NULL;\r\nPFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewNamedRenderbufferStorageMultisampleEXT = NULL;\r\nPFNGLPROGRAMUNIFORM1FEXTPROC __glewProgramUniform1fEXT = NULL;\r\nPFNGLPROGRAMUNIFORM1FVEXTPROC __glewProgramUniform1fvEXT = NULL;\r\nPFNGLPROGRAMUNIFORM1IEXTPROC __glewProgramUniform1iEXT = NULL;\r\nPFNGLPROGRAMUNIFORM1IVEXTPROC __glewProgramUniform1ivEXT = NULL;\r\nPFNGLPROGRAMUNIFORM1UIEXTPROC __glewProgramUniform1uiEXT = NULL;\r\nPFNGLPROGRAMUNIFORM1UIVEXTPROC __glewProgramUniform1uivEXT = NULL;\r\nPFNGLPROGRAMUNIFORM2FEXTPROC __glewProgramUniform2fEXT = NULL;\r\nPFNGLPROGRAMUNIFORM2FVEXTPROC __glewProgramUniform2fvEXT = NULL;\r\nPFNGLPROGRAMUNIFORM2IEXTPROC __glewProgramUniform2iEXT = NULL;\r\nPFNGLPROGRAMUNIFORM2IVEXTPROC __glewProgramUniform2ivEXT = NULL;\r\nPFNGLPROGRAMUNIFORM2UIEXTPROC __glewProgramUniform2uiEXT = NULL;\r\nPFNGLPROGRAMUNIFORM2UIVEXTPROC __glewProgramUniform2uivEXT = NULL;\r\nPFNGLPROGRAMUNIFORM3FEXTPROC __glewProgramUniform3fEXT = NULL;\r\nPFNGLPROGRAMUNIFORM3FVEXTPROC __glewProgramUniform3fvEXT = NULL;\r\nPFNGLPROGRAMUNIFORM3IEXTPROC __glewProgramUniform3iEXT = NULL;\r\nPFNGLPROGRAMUNIFORM3IVEXTPROC __glewProgramUniform3ivEXT = NULL;\r\nPFNGLPROGRAMUNIFORM3UIEXTPROC __glewProgramUniform3uiEXT = NULL;\r\nPFNGLPROGRAMUNIFORM3UIVEXTPROC __glewProgramUniform3uivEXT = NULL;\r\nPFNGLPROGRAMUNIFORM4FEXTPROC __glewProgramUniform4fEXT = NULL;\r\nPFNGLPROGRAMUNIFORM4FVEXTPROC __glewProgramUniform4fvEXT = NULL;\r\nPFNGLPROGRAMUNIFORM4IEXTPROC __glewProgramUniform4iEXT = NULL;\r\nPFNGLPROGRAMUNIFORM4IVEXTPROC __glewProgramUniform4ivEXT = NULL;\r\nPFNGLPROGRAMUNIFORM4UIEXTPROC __glewProgramUniform4uiEXT = NULL;\r\nPFNGLPROGRAMUNIFORM4UIVEXTPROC __glewProgramUniform4uivEXT = NULL;\r\nPFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC __glewProgramUniformMatrix2fvEXT = NULL;\r\nPFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC __glewProgramUniformMatrix2x3fvEXT = NULL;\r\nPFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC __glewProgramUniformMatrix2x4fvEXT = NULL;\r\nPFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC __glewProgramUniformMatrix3fvEXT = NULL;\r\nPFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC __glewProgramUniformMatrix3x2fvEXT = NULL;\r\nPFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC __glewProgramUniformMatrix3x4fvEXT = NULL;\r\nPFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC __glewProgramUniformMatrix4fvEXT = NULL;\r\nPFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC __glewProgramUniformMatrix4x2fvEXT = NULL;\r\nPFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC __glewProgramUniformMatrix4x3fvEXT = NULL;\r\nPFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC __glewPushClientAttribDefaultEXT = NULL;\r\nPFNGLTEXTUREBUFFEREXTPROC __glewTextureBufferEXT = NULL;\r\nPFNGLTEXTUREIMAGE1DEXTPROC __glewTextureImage1DEXT = NULL;\r\nPFNGLTEXTUREIMAGE2DEXTPROC __glewTextureImage2DEXT = NULL;\r\nPFNGLTEXTUREIMAGE3DEXTPROC __glewTextureImage3DEXT = NULL;\r\nPFNGLTEXTUREPARAMETERIIVEXTPROC __glewTextureParameterIivEXT = NULL;\r\nPFNGLTEXTUREPARAMETERIUIVEXTPROC __glewTextureParameterIuivEXT = NULL;\r\nPFNGLTEXTUREPARAMETERFEXTPROC __glewTextureParameterfEXT = NULL;\r\nPFNGLTEXTUREPARAMETERFVEXTPROC __glewTextureParameterfvEXT = NULL;\r\nPFNGLTEXTUREPARAMETERIEXTPROC __glewTextureParameteriEXT = NULL;\r\nPFNGLTEXTUREPARAMETERIVEXTPROC __glewTextureParameterivEXT = NULL;\r\nPFNGLTEXTURERENDERBUFFEREXTPROC __glewTextureRenderbufferEXT = NULL;\r\nPFNGLTEXTURESUBIMAGE1DEXTPROC __glewTextureSubImage1DEXT = NULL;\r\nPFNGLTEXTURESUBIMAGE2DEXTPROC __glewTextureSubImage2DEXT = NULL;\r\nPFNGLTEXTURESUBIMAGE3DEXTPROC __glewTextureSubImage3DEXT = NULL;\r\nPFNGLUNMAPNAMEDBUFFEREXTPROC __glewUnmapNamedBufferEXT = NULL;\r\nPFNGLVERTEXARRAYCOLOROFFSETEXTPROC __glewVertexArrayColorOffsetEXT = NULL;\r\nPFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC __glewVertexArrayEdgeFlagOffsetEXT = NULL;\r\nPFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC __glewVertexArrayFogCoordOffsetEXT = NULL;\r\nPFNGLVERTEXARRAYINDEXOFFSETEXTPROC __glewVertexArrayIndexOffsetEXT = NULL;\r\nPFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC __glewVertexArrayMultiTexCoordOffsetEXT = NULL;\r\nPFNGLVERTEXARRAYNORMALOFFSETEXTPROC __glewVertexArrayNormalOffsetEXT = NULL;\r\nPFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC __glewVertexArraySecondaryColorOffsetEXT = NULL;\r\nPFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC __glewVertexArrayTexCoordOffsetEXT = NULL;\r\nPFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC __glewVertexArrayVertexAttribIOffsetEXT = NULL;\r\nPFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC __glewVertexArrayVertexAttribOffsetEXT = NULL;\r\nPFNGLVERTEXARRAYVERTEXOFFSETEXTPROC __glewVertexArrayVertexOffsetEXT = NULL;\r\n\r\nPFNGLCOLORMASKINDEXEDEXTPROC __glewColorMaskIndexedEXT = NULL;\r\nPFNGLDISABLEINDEXEDEXTPROC __glewDisableIndexedEXT = NULL;\r\nPFNGLENABLEINDEXEDEXTPROC __glewEnableIndexedEXT = NULL;\r\nPFNGLGETBOOLEANINDEXEDVEXTPROC __glewGetBooleanIndexedvEXT = NULL;\r\nPFNGLGETINTEGERINDEXEDVEXTPROC __glewGetIntegerIndexedvEXT = NULL;\r\nPFNGLISENABLEDINDEXEDEXTPROC __glewIsEnabledIndexedEXT = NULL;\r\n\r\nPFNGLDRAWARRAYSINSTANCEDEXTPROC __glewDrawArraysInstancedEXT = NULL;\r\nPFNGLDRAWELEMENTSINSTANCEDEXTPROC __glewDrawElementsInstancedEXT = NULL;\r\n\r\nPFNGLDRAWRANGEELEMENTSEXTPROC __glewDrawRangeElementsEXT = NULL;\r\n\r\nPFNGLFOGCOORDPOINTEREXTPROC __glewFogCoordPointerEXT = NULL;\r\nPFNGLFOGCOORDDEXTPROC __glewFogCoorddEXT = NULL;\r\nPFNGLFOGCOORDDVEXTPROC __glewFogCoorddvEXT = NULL;\r\nPFNGLFOGCOORDFEXTPROC __glewFogCoordfEXT = NULL;\r\nPFNGLFOGCOORDFVEXTPROC __glewFogCoordfvEXT = NULL;\r\n\r\nPFNGLFRAGMENTCOLORMATERIALEXTPROC __glewFragmentColorMaterialEXT = NULL;\r\nPFNGLFRAGMENTLIGHTMODELFEXTPROC __glewFragmentLightModelfEXT = NULL;\r\nPFNGLFRAGMENTLIGHTMODELFVEXTPROC __glewFragmentLightModelfvEXT = NULL;\r\nPFNGLFRAGMENTLIGHTMODELIEXTPROC __glewFragmentLightModeliEXT = NULL;\r\nPFNGLFRAGMENTLIGHTMODELIVEXTPROC __glewFragmentLightModelivEXT = NULL;\r\nPFNGLFRAGMENTLIGHTFEXTPROC __glewFragmentLightfEXT = NULL;\r\nPFNGLFRAGMENTLIGHTFVEXTPROC __glewFragmentLightfvEXT = NULL;\r\nPFNGLFRAGMENTLIGHTIEXTPROC __glewFragmentLightiEXT = NULL;\r\nPFNGLFRAGMENTLIGHTIVEXTPROC __glewFragmentLightivEXT = NULL;\r\nPFNGLFRAGMENTMATERIALFEXTPROC __glewFragmentMaterialfEXT = NULL;\r\nPFNGLFRAGMENTMATERIALFVEXTPROC __glewFragmentMaterialfvEXT = NULL;\r\nPFNGLFRAGMENTMATERIALIEXTPROC __glewFragmentMaterialiEXT = NULL;\r\nPFNGLFRAGMENTMATERIALIVEXTPROC __glewFragmentMaterialivEXT = NULL;\r\nPFNGLGETFRAGMENTLIGHTFVEXTPROC __glewGetFragmentLightfvEXT = NULL;\r\nPFNGLGETFRAGMENTLIGHTIVEXTPROC __glewGetFragmentLightivEXT = NULL;\r\nPFNGLGETFRAGMENTMATERIALFVEXTPROC __glewGetFragmentMaterialfvEXT = NULL;\r\nPFNGLGETFRAGMENTMATERIALIVEXTPROC __glewGetFragmentMaterialivEXT = NULL;\r\nPFNGLLIGHTENVIEXTPROC __glewLightEnviEXT = NULL;\r\n\r\nPFNGLBLITFRAMEBUFFEREXTPROC __glewBlitFramebufferEXT = NULL;\r\n\r\nPFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewRenderbufferStorageMultisampleEXT = NULL;\r\n\r\nPFNGLBINDFRAMEBUFFEREXTPROC __glewBindFramebufferEXT = NULL;\r\nPFNGLBINDRENDERBUFFEREXTPROC __glewBindRenderbufferEXT = NULL;\r\nPFNGLCHECKFRAMEBUFFERSTATUSEXTPROC __glewCheckFramebufferStatusEXT = NULL;\r\nPFNGLDELETEFRAMEBUFFERSEXTPROC __glewDeleteFramebuffersEXT = NULL;\r\nPFNGLDELETERENDERBUFFERSEXTPROC __glewDeleteRenderbuffersEXT = NULL;\r\nPFNGLFRAMEBUFFERRENDERBUFFEREXTPROC __glewFramebufferRenderbufferEXT = NULL;\r\nPFNGLFRAMEBUFFERTEXTURE1DEXTPROC __glewFramebufferTexture1DEXT = NULL;\r\nPFNGLFRAMEBUFFERTEXTURE2DEXTPROC __glewFramebufferTexture2DEXT = NULL;\r\nPFNGLFRAMEBUFFERTEXTURE3DEXTPROC __glewFramebufferTexture3DEXT = NULL;\r\nPFNGLGENFRAMEBUFFERSEXTPROC __glewGenFramebuffersEXT = NULL;\r\nPFNGLGENRENDERBUFFERSEXTPROC __glewGenRenderbuffersEXT = NULL;\r\nPFNGLGENERATEMIPMAPEXTPROC __glewGenerateMipmapEXT = NULL;\r\nPFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetFramebufferAttachmentParameterivEXT = NULL;\r\nPFNGLGETRENDERBUFFERPARAMETERIVEXTPROC __glewGetRenderbufferParameterivEXT = NULL;\r\nPFNGLISFRAMEBUFFEREXTPROC __glewIsFramebufferEXT = NULL;\r\nPFNGLISRENDERBUFFEREXTPROC __glewIsRenderbufferEXT = NULL;\r\nPFNGLRENDERBUFFERSTORAGEEXTPROC __glewRenderbufferStorageEXT = NULL;\r\n\r\nPFNGLFRAMEBUFFERTEXTUREEXTPROC __glewFramebufferTextureEXT = NULL;\r\nPFNGLFRAMEBUFFERTEXTUREFACEEXTPROC __glewFramebufferTextureFaceEXT = NULL;\r\nPFNGLFRAMEBUFFERTEXTURELAYEREXTPROC __glewFramebufferTextureLayerEXT = NULL;\r\nPFNGLPROGRAMPARAMETERIEXTPROC __glewProgramParameteriEXT = NULL;\r\n\r\nPFNGLPROGRAMENVPARAMETERS4FVEXTPROC __glewProgramEnvParameters4fvEXT = NULL;\r\nPFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC __glewProgramLocalParameters4fvEXT = NULL;\r\n\r\nPFNGLBINDFRAGDATALOCATIONEXTPROC __glewBindFragDataLocationEXT = NULL;\r\nPFNGLGETFRAGDATALOCATIONEXTPROC __glewGetFragDataLocationEXT = NULL;\r\nPFNGLGETUNIFORMUIVEXTPROC __glewGetUniformuivEXT = NULL;\r\nPFNGLGETVERTEXATTRIBIIVEXTPROC __glewGetVertexAttribIivEXT = NULL;\r\nPFNGLGETVERTEXATTRIBIUIVEXTPROC __glewGetVertexAttribIuivEXT = NULL;\r\nPFNGLUNIFORM1UIEXTPROC __glewUniform1uiEXT = NULL;\r\nPFNGLUNIFORM1UIVEXTPROC __glewUniform1uivEXT = NULL;\r\nPFNGLUNIFORM2UIEXTPROC __glewUniform2uiEXT = NULL;\r\nPFNGLUNIFORM2UIVEXTPROC __glewUniform2uivEXT = NULL;\r\nPFNGLUNIFORM3UIEXTPROC __glewUniform3uiEXT = NULL;\r\nPFNGLUNIFORM3UIVEXTPROC __glewUniform3uivEXT = NULL;\r\nPFNGLUNIFORM4UIEXTPROC __glewUniform4uiEXT = NULL;\r\nPFNGLUNIFORM4UIVEXTPROC __glewUniform4uivEXT = NULL;\r\nPFNGLVERTEXATTRIBI1IEXTPROC __glewVertexAttribI1iEXT = NULL;\r\nPFNGLVERTEXATTRIBI1IVEXTPROC __glewVertexAttribI1ivEXT = NULL;\r\nPFNGLVERTEXATTRIBI1UIEXTPROC __glewVertexAttribI1uiEXT = NULL;\r\nPFNGLVERTEXATTRIBI1UIVEXTPROC __glewVertexAttribI1uivEXT = NULL;\r\nPFNGLVERTEXATTRIBI2IEXTPROC __glewVertexAttribI2iEXT = NULL;\r\nPFNGLVERTEXATTRIBI2IVEXTPROC __glewVertexAttribI2ivEXT = NULL;\r\nPFNGLVERTEXATTRIBI2UIEXTPROC __glewVertexAttribI2uiEXT = NULL;\r\nPFNGLVERTEXATTRIBI2UIVEXTPROC __glewVertexAttribI2uivEXT = NULL;\r\nPFNGLVERTEXATTRIBI3IEXTPROC __glewVertexAttribI3iEXT = NULL;\r\nPFNGLVERTEXATTRIBI3IVEXTPROC __glewVertexAttribI3ivEXT = NULL;\r\nPFNGLVERTEXATTRIBI3UIEXTPROC __glewVertexAttribI3uiEXT = NULL;\r\nPFNGLVERTEXATTRIBI3UIVEXTPROC __glewVertexAttribI3uivEXT = NULL;\r\nPFNGLVERTEXATTRIBI4BVEXTPROC __glewVertexAttribI4bvEXT = NULL;\r\nPFNGLVERTEXATTRIBI4IEXTPROC __glewVertexAttribI4iEXT = NULL;\r\nPFNGLVERTEXATTRIBI4IVEXTPROC __glewVertexAttribI4ivEXT = NULL;\r\nPFNGLVERTEXATTRIBI4SVEXTPROC __glewVertexAttribI4svEXT = NULL;\r\nPFNGLVERTEXATTRIBI4UBVEXTPROC __glewVertexAttribI4ubvEXT = NULL;\r\nPFNGLVERTEXATTRIBI4UIEXTPROC __glewVertexAttribI4uiEXT = NULL;\r\nPFNGLVERTEXATTRIBI4UIVEXTPROC __glewVertexAttribI4uivEXT = NULL;\r\nPFNGLVERTEXATTRIBI4USVEXTPROC __glewVertexAttribI4usvEXT = NULL;\r\nPFNGLVERTEXATTRIBIPOINTEREXTPROC __glewVertexAttribIPointerEXT = NULL;\r\n\r\nPFNGLGETHISTOGRAMEXTPROC __glewGetHistogramEXT = NULL;\r\nPFNGLGETHISTOGRAMPARAMETERFVEXTPROC __glewGetHistogramParameterfvEXT = NULL;\r\nPFNGLGETHISTOGRAMPARAMETERIVEXTPROC __glewGetHistogramParameterivEXT = NULL;\r\nPFNGLGETMINMAXEXTPROC __glewGetMinmaxEXT = NULL;\r\nPFNGLGETMINMAXPARAMETERFVEXTPROC __glewGetMinmaxParameterfvEXT = NULL;\r\nPFNGLGETMINMAXPARAMETERIVEXTPROC __glewGetMinmaxParameterivEXT = NULL;\r\nPFNGLHISTOGRAMEXTPROC __glewHistogramEXT = NULL;\r\nPFNGLMINMAXEXTPROC __glewMinmaxEXT = NULL;\r\nPFNGLRESETHISTOGRAMEXTPROC __glewResetHistogramEXT = NULL;\r\nPFNGLRESETMINMAXEXTPROC __glewResetMinmaxEXT = NULL;\r\n\r\nPFNGLINDEXFUNCEXTPROC __glewIndexFuncEXT = NULL;\r\n\r\nPFNGLINDEXMATERIALEXTPROC __glewIndexMaterialEXT = NULL;\r\n\r\nPFNGLAPPLYTEXTUREEXTPROC __glewApplyTextureEXT = NULL;\r\nPFNGLTEXTURELIGHTEXTPROC __glewTextureLightEXT = NULL;\r\nPFNGLTEXTUREMATERIALEXTPROC __glewTextureMaterialEXT = NULL;\r\n\r\nPFNGLMULTIDRAWARRAYSEXTPROC __glewMultiDrawArraysEXT = NULL;\r\nPFNGLMULTIDRAWELEMENTSEXTPROC __glewMultiDrawElementsEXT = NULL;\r\n\r\nPFNGLSAMPLEMASKEXTPROC __glewSampleMaskEXT = NULL;\r\nPFNGLSAMPLEPATTERNEXTPROC __glewSamplePatternEXT = NULL;\r\n\r\nPFNGLCOLORTABLEEXTPROC __glewColorTableEXT = NULL;\r\nPFNGLGETCOLORTABLEEXTPROC __glewGetColorTableEXT = NULL;\r\nPFNGLGETCOLORTABLEPARAMETERFVEXTPROC __glewGetColorTableParameterfvEXT = NULL;\r\nPFNGLGETCOLORTABLEPARAMETERIVEXTPROC __glewGetColorTableParameterivEXT = NULL;\r\n\r\nPFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC __glewGetPixelTransformParameterfvEXT = NULL;\r\nPFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC __glewGetPixelTransformParameterivEXT = NULL;\r\nPFNGLPIXELTRANSFORMPARAMETERFEXTPROC __glewPixelTransformParameterfEXT = NULL;\r\nPFNGLPIXELTRANSFORMPARAMETERFVEXTPROC __glewPixelTransformParameterfvEXT = NULL;\r\nPFNGLPIXELTRANSFORMPARAMETERIEXTPROC __glewPixelTransformParameteriEXT = NULL;\r\nPFNGLPIXELTRANSFORMPARAMETERIVEXTPROC __glewPixelTransformParameterivEXT = NULL;\r\n\r\nPFNGLPOINTPARAMETERFEXTPROC __glewPointParameterfEXT = NULL;\r\nPFNGLPOINTPARAMETERFVEXTPROC __glewPointParameterfvEXT = NULL;\r\n\r\nPFNGLPOLYGONOFFSETEXTPROC __glewPolygonOffsetEXT = NULL;\r\n\r\nPFNGLPROVOKINGVERTEXEXTPROC __glewProvokingVertexEXT = NULL;\r\n\r\nPFNGLBEGINSCENEEXTPROC __glewBeginSceneEXT = NULL;\r\nPFNGLENDSCENEEXTPROC __glewEndSceneEXT = NULL;\r\n\r\nPFNGLSECONDARYCOLOR3BEXTPROC __glewSecondaryColor3bEXT = NULL;\r\nPFNGLSECONDARYCOLOR3BVEXTPROC __glewSecondaryColor3bvEXT = NULL;\r\nPFNGLSECONDARYCOLOR3DEXTPROC __glewSecondaryColor3dEXT = NULL;\r\nPFNGLSECONDARYCOLOR3DVEXTPROC __glewSecondaryColor3dvEXT = NULL;\r\nPFNGLSECONDARYCOLOR3FEXTPROC __glewSecondaryColor3fEXT = NULL;\r\nPFNGLSECONDARYCOLOR3FVEXTPROC __glewSecondaryColor3fvEXT = NULL;\r\nPFNGLSECONDARYCOLOR3IEXTPROC __glewSecondaryColor3iEXT = NULL;\r\nPFNGLSECONDARYCOLOR3IVEXTPROC __glewSecondaryColor3ivEXT = NULL;\r\nPFNGLSECONDARYCOLOR3SEXTPROC __glewSecondaryColor3sEXT = NULL;\r\nPFNGLSECONDARYCOLOR3SVEXTPROC __glewSecondaryColor3svEXT = NULL;\r\nPFNGLSECONDARYCOLOR3UBEXTPROC __glewSecondaryColor3ubEXT = NULL;\r\nPFNGLSECONDARYCOLOR3UBVEXTPROC __glewSecondaryColor3ubvEXT = NULL;\r\nPFNGLSECONDARYCOLOR3UIEXTPROC __glewSecondaryColor3uiEXT = NULL;\r\nPFNGLSECONDARYCOLOR3UIVEXTPROC __glewSecondaryColor3uivEXT = NULL;\r\nPFNGLSECONDARYCOLOR3USEXTPROC __glewSecondaryColor3usEXT = NULL;\r\nPFNGLSECONDARYCOLOR3USVEXTPROC __glewSecondaryColor3usvEXT = NULL;\r\nPFNGLSECONDARYCOLORPOINTEREXTPROC __glewSecondaryColorPointerEXT = NULL;\r\n\r\nPFNGLACTIVEPROGRAMEXTPROC __glewActiveProgramEXT = NULL;\r\nPFNGLCREATESHADERPROGRAMEXTPROC __glewCreateShaderProgramEXT = NULL;\r\nPFNGLUSESHADERPROGRAMEXTPROC __glewUseShaderProgramEXT = NULL;\r\n\r\nPFNGLACTIVESTENCILFACEEXTPROC __glewActiveStencilFaceEXT = NULL;\r\n\r\nPFNGLTEXSUBIMAGE1DEXTPROC __glewTexSubImage1DEXT = NULL;\r\nPFNGLTEXSUBIMAGE2DEXTPROC __glewTexSubImage2DEXT = NULL;\r\nPFNGLTEXSUBIMAGE3DEXTPROC __glewTexSubImage3DEXT = NULL;\r\n\r\nPFNGLTEXIMAGE3DEXTPROC __glewTexImage3DEXT = NULL;\r\n\r\nPFNGLTEXBUFFEREXTPROC __glewTexBufferEXT = NULL;\r\n\r\nPFNGLCLEARCOLORIIEXTPROC __glewClearColorIiEXT = NULL;\r\nPFNGLCLEARCOLORIUIEXTPROC __glewClearColorIuiEXT = NULL;\r\nPFNGLGETTEXPARAMETERIIVEXTPROC __glewGetTexParameterIivEXT = NULL;\r\nPFNGLGETTEXPARAMETERIUIVEXTPROC __glewGetTexParameterIuivEXT = NULL;\r\nPFNGLTEXPARAMETERIIVEXTPROC __glewTexParameterIivEXT = NULL;\r\nPFNGLTEXPARAMETERIUIVEXTPROC __glewTexParameterIuivEXT = NULL;\r\n\r\nPFNGLARETEXTURESRESIDENTEXTPROC __glewAreTexturesResidentEXT = NULL;\r\nPFNGLBINDTEXTUREEXTPROC __glewBindTextureEXT = NULL;\r\nPFNGLDELETETEXTURESEXTPROC __glewDeleteTexturesEXT = NULL;\r\nPFNGLGENTEXTURESEXTPROC __glewGenTexturesEXT = NULL;\r\nPFNGLISTEXTUREEXTPROC __glewIsTextureEXT = NULL;\r\nPFNGLPRIORITIZETEXTURESEXTPROC __glewPrioritizeTexturesEXT = NULL;\r\n\r\nPFNGLTEXTURENORMALEXTPROC __glewTextureNormalEXT = NULL;\r\n\r\nPFNGLGETQUERYOBJECTI64VEXTPROC __glewGetQueryObjecti64vEXT = NULL;\r\nPFNGLGETQUERYOBJECTUI64VEXTPROC __glewGetQueryObjectui64vEXT = NULL;\r\n\r\nPFNGLBEGINTRANSFORMFEEDBACKEXTPROC __glewBeginTransformFeedbackEXT = NULL;\r\nPFNGLBINDBUFFERBASEEXTPROC __glewBindBufferBaseEXT = NULL;\r\nPFNGLBINDBUFFEROFFSETEXTPROC __glewBindBufferOffsetEXT = NULL;\r\nPFNGLBINDBUFFERRANGEEXTPROC __glewBindBufferRangeEXT = NULL;\r\nPFNGLENDTRANSFORMFEEDBACKEXTPROC __glewEndTransformFeedbackEXT = NULL;\r\nPFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC __glewGetTransformFeedbackVaryingEXT = NULL;\r\nPFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC __glewTransformFeedbackVaryingsEXT = NULL;\r\n\r\nPFNGLARRAYELEMENTEXTPROC __glewArrayElementEXT = NULL;\r\nPFNGLCOLORPOINTEREXTPROC __glewColorPointerEXT = NULL;\r\nPFNGLDRAWARRAYSEXTPROC __glewDrawArraysEXT = NULL;\r\nPFNGLEDGEFLAGPOINTEREXTPROC __glewEdgeFlagPointerEXT = NULL;\r\nPFNGLGETPOINTERVEXTPROC __glewGetPointervEXT = NULL;\r\nPFNGLINDEXPOINTEREXTPROC __glewIndexPointerEXT = NULL;\r\nPFNGLNORMALPOINTEREXTPROC __glewNormalPointerEXT = NULL;\r\nPFNGLTEXCOORDPOINTEREXTPROC __glewTexCoordPointerEXT = NULL;\r\nPFNGLVERTEXPOINTEREXTPROC __glewVertexPointerEXT = NULL;\r\n\r\nPFNGLBEGINVERTEXSHADEREXTPROC __glewBeginVertexShaderEXT = NULL;\r\nPFNGLBINDLIGHTPARAMETEREXTPROC __glewBindLightParameterEXT = NULL;\r\nPFNGLBINDMATERIALPARAMETEREXTPROC __glewBindMaterialParameterEXT = NULL;\r\nPFNGLBINDPARAMETEREXTPROC __glewBindParameterEXT = NULL;\r\nPFNGLBINDTEXGENPARAMETEREXTPROC __glewBindTexGenParameterEXT = NULL;\r\nPFNGLBINDTEXTUREUNITPARAMETEREXTPROC __glewBindTextureUnitParameterEXT = NULL;\r\nPFNGLBINDVERTEXSHADEREXTPROC __glewBindVertexShaderEXT = NULL;\r\nPFNGLDELETEVERTEXSHADEREXTPROC __glewDeleteVertexShaderEXT = NULL;\r\nPFNGLDISABLEVARIANTCLIENTSTATEEXTPROC __glewDisableVariantClientStateEXT = NULL;\r\nPFNGLENABLEVARIANTCLIENTSTATEEXTPROC __glewEnableVariantClientStateEXT = NULL;\r\nPFNGLENDVERTEXSHADEREXTPROC __glewEndVertexShaderEXT = NULL;\r\nPFNGLEXTRACTCOMPONENTEXTPROC __glewExtractComponentEXT = NULL;\r\nPFNGLGENSYMBOLSEXTPROC __glewGenSymbolsEXT = NULL;\r\nPFNGLGENVERTEXSHADERSEXTPROC __glewGenVertexShadersEXT = NULL;\r\nPFNGLGETINVARIANTBOOLEANVEXTPROC __glewGetInvariantBooleanvEXT = NULL;\r\nPFNGLGETINVARIANTFLOATVEXTPROC __glewGetInvariantFloatvEXT = NULL;\r\nPFNGLGETINVARIANTINTEGERVEXTPROC __glewGetInvariantIntegervEXT = NULL;\r\nPFNGLGETLOCALCONSTANTBOOLEANVEXTPROC __glewGetLocalConstantBooleanvEXT = NULL;\r\nPFNGLGETLOCALCONSTANTFLOATVEXTPROC __glewGetLocalConstantFloatvEXT = NULL;\r\nPFNGLGETLOCALCONSTANTINTEGERVEXTPROC __glewGetLocalConstantIntegervEXT = NULL;\r\nPFNGLGETVARIANTBOOLEANVEXTPROC __glewGetVariantBooleanvEXT = NULL;\r\nPFNGLGETVARIANTFLOATVEXTPROC __glewGetVariantFloatvEXT = NULL;\r\nPFNGLGETVARIANTINTEGERVEXTPROC __glewGetVariantIntegervEXT = NULL;\r\nPFNGLGETVARIANTPOINTERVEXTPROC __glewGetVariantPointervEXT = NULL;\r\nPFNGLINSERTCOMPONENTEXTPROC __glewInsertComponentEXT = NULL;\r\nPFNGLISVARIANTENABLEDEXTPROC __glewIsVariantEnabledEXT = NULL;\r\nPFNGLSETINVARIANTEXTPROC __glewSetInvariantEXT = NULL;\r\nPFNGLSETLOCALCONSTANTEXTPROC __glewSetLocalConstantEXT = NULL;\r\nPFNGLSHADEROP1EXTPROC __glewShaderOp1EXT = NULL;\r\nPFNGLSHADEROP2EXTPROC __glewShaderOp2EXT = NULL;\r\nPFNGLSHADEROP3EXTPROC __glewShaderOp3EXT = NULL;\r\nPFNGLSWIZZLEEXTPROC __glewSwizzleEXT = NULL;\r\nPFNGLVARIANTPOINTEREXTPROC __glewVariantPointerEXT = NULL;\r\nPFNGLVARIANTBVEXTPROC __glewVariantbvEXT = NULL;\r\nPFNGLVARIANTDVEXTPROC __glewVariantdvEXT = NULL;\r\nPFNGLVARIANTFVEXTPROC __glewVariantfvEXT = NULL;\r\nPFNGLVARIANTIVEXTPROC __glewVariantivEXT = NULL;\r\nPFNGLVARIANTSVEXTPROC __glewVariantsvEXT = NULL;\r\nPFNGLVARIANTUBVEXTPROC __glewVariantubvEXT = NULL;\r\nPFNGLVARIANTUIVEXTPROC __glewVariantuivEXT = NULL;\r\nPFNGLVARIANTUSVEXTPROC __glewVariantusvEXT = NULL;\r\nPFNGLWRITEMASKEXTPROC __glewWriteMaskEXT = NULL;\r\n\r\nPFNGLVERTEXWEIGHTPOINTEREXTPROC __glewVertexWeightPointerEXT = NULL;\r\nPFNGLVERTEXWEIGHTFEXTPROC __glewVertexWeightfEXT = NULL;\r\nPFNGLVERTEXWEIGHTFVEXTPROC __glewVertexWeightfvEXT = NULL;\r\n\r\nPFNGLFRAMETERMINATORGREMEDYPROC __glewFrameTerminatorGREMEDY = NULL;\r\n\r\nPFNGLSTRINGMARKERGREMEDYPROC __glewStringMarkerGREMEDY = NULL;\r\n\r\nPFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC __glewGetImageTransformParameterfvHP = NULL;\r\nPFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC __glewGetImageTransformParameterivHP = NULL;\r\nPFNGLIMAGETRANSFORMPARAMETERFHPPROC __glewImageTransformParameterfHP = NULL;\r\nPFNGLIMAGETRANSFORMPARAMETERFVHPPROC __glewImageTransformParameterfvHP = NULL;\r\nPFNGLIMAGETRANSFORMPARAMETERIHPPROC __glewImageTransformParameteriHP = NULL;\r\nPFNGLIMAGETRANSFORMPARAMETERIVHPPROC __glewImageTransformParameterivHP = NULL;\r\n\r\nPFNGLMULTIMODEDRAWARRAYSIBMPROC __glewMultiModeDrawArraysIBM = NULL;\r\nPFNGLMULTIMODEDRAWELEMENTSIBMPROC __glewMultiModeDrawElementsIBM = NULL;\r\n\r\nPFNGLCOLORPOINTERLISTIBMPROC __glewColorPointerListIBM = NULL;\r\nPFNGLEDGEFLAGPOINTERLISTIBMPROC __glewEdgeFlagPointerListIBM = NULL;\r\nPFNGLFOGCOORDPOINTERLISTIBMPROC __glewFogCoordPointerListIBM = NULL;\r\nPFNGLINDEXPOINTERLISTIBMPROC __glewIndexPointerListIBM = NULL;\r\nPFNGLNORMALPOINTERLISTIBMPROC __glewNormalPointerListIBM = NULL;\r\nPFNGLSECONDARYCOLORPOINTERLISTIBMPROC __glewSecondaryColorPointerListIBM = NULL;\r\nPFNGLTEXCOORDPOINTERLISTIBMPROC __glewTexCoordPointerListIBM = NULL;\r\nPFNGLVERTEXPOINTERLISTIBMPROC __glewVertexPointerListIBM = NULL;\r\n\r\nPFNGLCOLORPOINTERVINTELPROC __glewColorPointervINTEL = NULL;\r\nPFNGLNORMALPOINTERVINTELPROC __glewNormalPointervINTEL = NULL;\r\nPFNGLTEXCOORDPOINTERVINTELPROC __glewTexCoordPointervINTEL = NULL;\r\nPFNGLVERTEXPOINTERVINTELPROC __glewVertexPointervINTEL = NULL;\r\n\r\nPFNGLTEXSCISSORFUNCINTELPROC __glewTexScissorFuncINTEL = NULL;\r\nPFNGLTEXSCISSORINTELPROC __glewTexScissorINTEL = NULL;\r\n\r\nPFNGLBUFFERREGIONENABLEDEXTPROC __glewBufferRegionEnabledEXT = NULL;\r\nPFNGLDELETEBUFFERREGIONEXTPROC __glewDeleteBufferRegionEXT = NULL;\r\nPFNGLDRAWBUFFERREGIONEXTPROC __glewDrawBufferRegionEXT = NULL;\r\nPFNGLNEWBUFFERREGIONEXTPROC __glewNewBufferRegionEXT = NULL;\r\nPFNGLREADBUFFERREGIONEXTPROC __glewReadBufferRegionEXT = NULL;\r\n\r\nPFNGLRESIZEBUFFERSMESAPROC __glewResizeBuffersMESA = NULL;\r\n\r\nPFNGLWINDOWPOS2DMESAPROC __glewWindowPos2dMESA = NULL;\r\nPFNGLWINDOWPOS2DVMESAPROC __glewWindowPos2dvMESA = NULL;\r\nPFNGLWINDOWPOS2FMESAPROC __glewWindowPos2fMESA = NULL;\r\nPFNGLWINDOWPOS2FVMESAPROC __glewWindowPos2fvMESA = NULL;\r\nPFNGLWINDOWPOS2IMESAPROC __glewWindowPos2iMESA = NULL;\r\nPFNGLWINDOWPOS2IVMESAPROC __glewWindowPos2ivMESA = NULL;\r\nPFNGLWINDOWPOS2SMESAPROC __glewWindowPos2sMESA = NULL;\r\nPFNGLWINDOWPOS2SVMESAPROC __glewWindowPos2svMESA = NULL;\r\nPFNGLWINDOWPOS3DMESAPROC __glewWindowPos3dMESA = NULL;\r\nPFNGLWINDOWPOS3DVMESAPROC __glewWindowPos3dvMESA = NULL;\r\nPFNGLWINDOWPOS3FMESAPROC __glewWindowPos3fMESA = NULL;\r\nPFNGLWINDOWPOS3FVMESAPROC __glewWindowPos3fvMESA = NULL;\r\nPFNGLWINDOWPOS3IMESAPROC __glewWindowPos3iMESA = NULL;\r\nPFNGLWINDOWPOS3IVMESAPROC __glewWindowPos3ivMESA = NULL;\r\nPFNGLWINDOWPOS3SMESAPROC __glewWindowPos3sMESA = NULL;\r\nPFNGLWINDOWPOS3SVMESAPROC __glewWindowPos3svMESA = NULL;\r\nPFNGLWINDOWPOS4DMESAPROC __glewWindowPos4dMESA = NULL;\r\nPFNGLWINDOWPOS4DVMESAPROC __glewWindowPos4dvMESA = NULL;\r\nPFNGLWINDOWPOS4FMESAPROC __glewWindowPos4fMESA = NULL;\r\nPFNGLWINDOWPOS4FVMESAPROC __glewWindowPos4fvMESA = NULL;\r\nPFNGLWINDOWPOS4IMESAPROC __glewWindowPos4iMESA = NULL;\r\nPFNGLWINDOWPOS4IVMESAPROC __glewWindowPos4ivMESA = NULL;\r\nPFNGLWINDOWPOS4SMESAPROC __glewWindowPos4sMESA = NULL;\r\nPFNGLWINDOWPOS4SVMESAPROC __glewWindowPos4svMESA = NULL;\r\n\r\nPFNGLBEGINCONDITIONALRENDERNVPROC __glewBeginConditionalRenderNV = NULL;\r\nPFNGLENDCONDITIONALRENDERNVPROC __glewEndConditionalRenderNV = NULL;\r\n\r\nPFNGLCOPYIMAGESUBDATANVPROC __glewCopyImageSubDataNV = NULL;\r\n\r\nPFNGLCLEARDEPTHDNVPROC __glewClearDepthdNV = NULL;\r\nPFNGLDEPTHBOUNDSDNVPROC __glewDepthBoundsdNV = NULL;\r\nPFNGLDEPTHRANGEDNVPROC __glewDepthRangedNV = NULL;\r\n\r\nPFNGLEVALMAPSNVPROC __glewEvalMapsNV = NULL;\r\nPFNGLGETMAPATTRIBPARAMETERFVNVPROC __glewGetMapAttribParameterfvNV = NULL;\r\nPFNGLGETMAPATTRIBPARAMETERIVNVPROC __glewGetMapAttribParameterivNV = NULL;\r\nPFNGLGETMAPCONTROLPOINTSNVPROC __glewGetMapControlPointsNV = NULL;\r\nPFNGLGETMAPPARAMETERFVNVPROC __glewGetMapParameterfvNV = NULL;\r\nPFNGLGETMAPPARAMETERIVNVPROC __glewGetMapParameterivNV = NULL;\r\nPFNGLMAPCONTROLPOINTSNVPROC __glewMapControlPointsNV = NULL;\r\nPFNGLMAPPARAMETERFVNVPROC __glewMapParameterfvNV = NULL;\r\nPFNGLMAPPARAMETERIVNVPROC __glewMapParameterivNV = NULL;\r\n\r\nPFNGLGETMULTISAMPLEFVNVPROC __glewGetMultisamplefvNV = NULL;\r\nPFNGLSAMPLEMASKINDEXEDNVPROC __glewSampleMaskIndexedNV = NULL;\r\nPFNGLTEXRENDERBUFFERNVPROC __glewTexRenderbufferNV = NULL;\r\n\r\nPFNGLDELETEFENCESNVPROC __glewDeleteFencesNV = NULL;\r\nPFNGLFINISHFENCENVPROC __glewFinishFenceNV = NULL;\r\nPFNGLGENFENCESNVPROC __glewGenFencesNV = NULL;\r\nPFNGLGETFENCEIVNVPROC __glewGetFenceivNV = NULL;\r\nPFNGLISFENCENVPROC __glewIsFenceNV = NULL;\r\nPFNGLSETFENCENVPROC __glewSetFenceNV = NULL;\r\nPFNGLTESTFENCENVPROC __glewTestFenceNV = NULL;\r\n\r\nPFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC __glewGetProgramNamedParameterdvNV = NULL;\r\nPFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC __glewGetProgramNamedParameterfvNV = NULL;\r\nPFNGLPROGRAMNAMEDPARAMETER4DNVPROC __glewProgramNamedParameter4dNV = NULL;\r\nPFNGLPROGRAMNAMEDPARAMETER4DVNVPROC __glewProgramNamedParameter4dvNV = NULL;\r\nPFNGLPROGRAMNAMEDPARAMETER4FNVPROC __glewProgramNamedParameter4fNV = NULL;\r\nPFNGLPROGRAMNAMEDPARAMETER4FVNVPROC __glewProgramNamedParameter4fvNV = NULL;\r\n\r\nPFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC __glewRenderbufferStorageMultisampleCoverageNV = NULL;\r\n\r\nPFNGLPROGRAMVERTEXLIMITNVPROC __glewProgramVertexLimitNV = NULL;\r\n\r\nPFNGLPROGRAMENVPARAMETERI4INVPROC __glewProgramEnvParameterI4iNV = NULL;\r\nPFNGLPROGRAMENVPARAMETERI4IVNVPROC __glewProgramEnvParameterI4ivNV = NULL;\r\nPFNGLPROGRAMENVPARAMETERI4UINVPROC __glewProgramEnvParameterI4uiNV = NULL;\r\nPFNGLPROGRAMENVPARAMETERI4UIVNVPROC __glewProgramEnvParameterI4uivNV = NULL;\r\nPFNGLPROGRAMENVPARAMETERSI4IVNVPROC __glewProgramEnvParametersI4ivNV = NULL;\r\nPFNGLPROGRAMENVPARAMETERSI4UIVNVPROC __glewProgramEnvParametersI4uivNV = NULL;\r\nPFNGLPROGRAMLOCALPARAMETERI4INVPROC __glewProgramLocalParameterI4iNV = NULL;\r\nPFNGLPROGRAMLOCALPARAMETERI4IVNVPROC __glewProgramLocalParameterI4ivNV = NULL;\r\nPFNGLPROGRAMLOCALPARAMETERI4UINVPROC __glewProgramLocalParameterI4uiNV = NULL;\r\nPFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC __glewProgramLocalParameterI4uivNV = NULL;\r\nPFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC __glewProgramLocalParametersI4ivNV = NULL;\r\nPFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC __glewProgramLocalParametersI4uivNV = NULL;\r\n\r\nPFNGLCOLOR3HNVPROC __glewColor3hNV = NULL;\r\nPFNGLCOLOR3HVNVPROC __glewColor3hvNV = NULL;\r\nPFNGLCOLOR4HNVPROC __glewColor4hNV = NULL;\r\nPFNGLCOLOR4HVNVPROC __glewColor4hvNV = NULL;\r\nPFNGLFOGCOORDHNVPROC __glewFogCoordhNV = NULL;\r\nPFNGLFOGCOORDHVNVPROC __glewFogCoordhvNV = NULL;\r\nPFNGLMULTITEXCOORD1HNVPROC __glewMultiTexCoord1hNV = NULL;\r\nPFNGLMULTITEXCOORD1HVNVPROC __glewMultiTexCoord1hvNV = NULL;\r\nPFNGLMULTITEXCOORD2HNVPROC __glewMultiTexCoord2hNV = NULL;\r\nPFNGLMULTITEXCOORD2HVNVPROC __glewMultiTexCoord2hvNV = NULL;\r\nPFNGLMULTITEXCOORD3HNVPROC __glewMultiTexCoord3hNV = NULL;\r\nPFNGLMULTITEXCOORD3HVNVPROC __glewMultiTexCoord3hvNV = NULL;\r\nPFNGLMULTITEXCOORD4HNVPROC __glewMultiTexCoord4hNV = NULL;\r\nPFNGLMULTITEXCOORD4HVNVPROC __glewMultiTexCoord4hvNV = NULL;\r\nPFNGLNORMAL3HNVPROC __glewNormal3hNV = NULL;\r\nPFNGLNORMAL3HVNVPROC __glewNormal3hvNV = NULL;\r\nPFNGLSECONDARYCOLOR3HNVPROC __glewSecondaryColor3hNV = NULL;\r\nPFNGLSECONDARYCOLOR3HVNVPROC __glewSecondaryColor3hvNV = NULL;\r\nPFNGLTEXCOORD1HNVPROC __glewTexCoord1hNV = NULL;\r\nPFNGLTEXCOORD1HVNVPROC __glewTexCoord1hvNV = NULL;\r\nPFNGLTEXCOORD2HNVPROC __glewTexCoord2hNV = NULL;\r\nPFNGLTEXCOORD2HVNVPROC __glewTexCoord2hvNV = NULL;\r\nPFNGLTEXCOORD3HNVPROC __glewTexCoord3hNV = NULL;\r\nPFNGLTEXCOORD3HVNVPROC __glewTexCoord3hvNV = NULL;\r\nPFNGLTEXCOORD4HNVPROC __glewTexCoord4hNV = NULL;\r\nPFNGLTEXCOORD4HVNVPROC __glewTexCoord4hvNV = NULL;\r\nPFNGLVERTEX2HNVPROC __glewVertex2hNV = NULL;\r\nPFNGLVERTEX2HVNVPROC __glewVertex2hvNV = NULL;\r\nPFNGLVERTEX3HNVPROC __glewVertex3hNV = NULL;\r\nPFNGLVERTEX3HVNVPROC __glewVertex3hvNV = NULL;\r\nPFNGLVERTEX4HNVPROC __glewVertex4hNV = NULL;\r\nPFNGLVERTEX4HVNVPROC __glewVertex4hvNV = NULL;\r\nPFNGLVERTEXATTRIB1HNVPROC __glewVertexAttrib1hNV = NULL;\r\nPFNGLVERTEXATTRIB1HVNVPROC __glewVertexAttrib1hvNV = NULL;\r\nPFNGLVERTEXATTRIB2HNVPROC __glewVertexAttrib2hNV = NULL;\r\nPFNGLVERTEXATTRIB2HVNVPROC __glewVertexAttrib2hvNV = NULL;\r\nPFNGLVERTEXATTRIB3HNVPROC __glewVertexAttrib3hNV = NULL;\r\nPFNGLVERTEXATTRIB3HVNVPROC __glewVertexAttrib3hvNV = NULL;\r\nPFNGLVERTEXATTRIB4HNVPROC __glewVertexAttrib4hNV = NULL;\r\nPFNGLVERTEXATTRIB4HVNVPROC __glewVertexAttrib4hvNV = NULL;\r\nPFNGLVERTEXATTRIBS1HVNVPROC __glewVertexAttribs1hvNV = NULL;\r\nPFNGLVERTEXATTRIBS2HVNVPROC __glewVertexAttribs2hvNV = NULL;\r\nPFNGLVERTEXATTRIBS3HVNVPROC __glewVertexAttribs3hvNV = NULL;\r\nPFNGLVERTEXATTRIBS4HVNVPROC __glewVertexAttribs4hvNV = NULL;\r\nPFNGLVERTEXWEIGHTHNVPROC __glewVertexWeighthNV = NULL;\r\nPFNGLVERTEXWEIGHTHVNVPROC __glewVertexWeighthvNV = NULL;\r\n\r\nPFNGLBEGINOCCLUSIONQUERYNVPROC __glewBeginOcclusionQueryNV = NULL;\r\nPFNGLDELETEOCCLUSIONQUERIESNVPROC __glewDeleteOcclusionQueriesNV = NULL;\r\nPFNGLENDOCCLUSIONQUERYNVPROC __glewEndOcclusionQueryNV = NULL;\r\nPFNGLGENOCCLUSIONQUERIESNVPROC __glewGenOcclusionQueriesNV = NULL;\r\nPFNGLGETOCCLUSIONQUERYIVNVPROC __glewGetOcclusionQueryivNV = NULL;\r\nPFNGLGETOCCLUSIONQUERYUIVNVPROC __glewGetOcclusionQueryuivNV = NULL;\r\nPFNGLISOCCLUSIONQUERYNVPROC __glewIsOcclusionQueryNV = NULL;\r\n\r\nPFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC __glewProgramBufferParametersIivNV = NULL;\r\nPFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC __glewProgramBufferParametersIuivNV = NULL;\r\nPFNGLPROGRAMBUFFERPARAMETERSFVNVPROC __glewProgramBufferParametersfvNV = NULL;\r\n\r\nPFNGLFLUSHPIXELDATARANGENVPROC __glewFlushPixelDataRangeNV = NULL;\r\nPFNGLPIXELDATARANGENVPROC __glewPixelDataRangeNV = NULL;\r\n\r\nPFNGLPOINTPARAMETERINVPROC __glewPointParameteriNV = NULL;\r\nPFNGLPOINTPARAMETERIVNVPROC __glewPointParameterivNV = NULL;\r\n\r\nPFNGLGETVIDEOI64VNVPROC __glewGetVideoi64vNV = NULL;\r\nPFNGLGETVIDEOIVNVPROC __glewGetVideoivNV = NULL;\r\nPFNGLGETVIDEOUI64VNVPROC __glewGetVideoui64vNV = NULL;\r\nPFNGLGETVIDEOUIVNVPROC __glewGetVideouivNV = NULL;\r\nPFNGLPRESENTFRAMEDUALFILLNVPROC __glewPresentFrameDualFillNV = NULL;\r\nPFNGLPRESENTFRAMEKEYEDNVPROC __glewPresentFrameKeyedNV = NULL;\r\n\r\nPFNGLPRIMITIVERESTARTINDEXNVPROC __glewPrimitiveRestartIndexNV = NULL;\r\nPFNGLPRIMITIVERESTARTNVPROC __glewPrimitiveRestartNV = NULL;\r\n\r\nPFNGLCOMBINERINPUTNVPROC __glewCombinerInputNV = NULL;\r\nPFNGLCOMBINEROUTPUTNVPROC __glewCombinerOutputNV = NULL;\r\nPFNGLCOMBINERPARAMETERFNVPROC __glewCombinerParameterfNV = NULL;\r\nPFNGLCOMBINERPARAMETERFVNVPROC __glewCombinerParameterfvNV = NULL;\r\nPFNGLCOMBINERPARAMETERINVPROC __glewCombinerParameteriNV = NULL;\r\nPFNGLCOMBINERPARAMETERIVNVPROC __glewCombinerParameterivNV = NULL;\r\nPFNGLFINALCOMBINERINPUTNVPROC __glewFinalCombinerInputNV = NULL;\r\nPFNGLGETCOMBINERINPUTPARAMETERFVNVPROC __glewGetCombinerInputParameterfvNV = NULL;\r\nPFNGLGETCOMBINERINPUTPARAMETERIVNVPROC __glewGetCombinerInputParameterivNV = NULL;\r\nPFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC __glewGetCombinerOutputParameterfvNV = NULL;\r\nPFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC __glewGetCombinerOutputParameterivNV = NULL;\r\nPFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC __glewGetFinalCombinerInputParameterfvNV = NULL;\r\nPFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC __glewGetFinalCombinerInputParameterivNV = NULL;\r\n\r\nPFNGLCOMBINERSTAGEPARAMETERFVNVPROC __glewCombinerStageParameterfvNV = NULL;\r\nPFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC __glewGetCombinerStageParameterfvNV = NULL;\r\n\r\nPFNGLGETBUFFERPARAMETERUI64VNVPROC __glewGetBufferParameterui64vNV = NULL;\r\nPFNGLGETINTEGERUI64VNVPROC __glewGetIntegerui64vNV = NULL;\r\nPFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC __glewGetNamedBufferParameterui64vNV = NULL;\r\nPFNGLGETUNIFORMUI64VNVPROC __glewGetUniformui64vNV = NULL;\r\nPFNGLISBUFFERRESIDENTNVPROC __glewIsBufferResidentNV = NULL;\r\nPFNGLISNAMEDBUFFERRESIDENTNVPROC __glewIsNamedBufferResidentNV = NULL;\r\nPFNGLMAKEBUFFERNONRESIDENTNVPROC __glewMakeBufferNonResidentNV = NULL;\r\nPFNGLMAKEBUFFERRESIDENTNVPROC __glewMakeBufferResidentNV = NULL;\r\nPFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC __glewMakeNamedBufferNonResidentNV = NULL;\r\nPFNGLMAKENAMEDBUFFERRESIDENTNVPROC __glewMakeNamedBufferResidentNV = NULL;\r\nPFNGLPROGRAMUNIFORMUI64NVPROC __glewProgramUniformui64NV = NULL;\r\nPFNGLPROGRAMUNIFORMUI64VNVPROC __glewProgramUniformui64vNV = NULL;\r\nPFNGLUNIFORMUI64NVPROC __glewUniformui64NV = NULL;\r\nPFNGLUNIFORMUI64VNVPROC __glewUniformui64vNV = NULL;\r\n\r\nPFNGLTEXTUREBARRIERNVPROC __glewTextureBarrierNV = NULL;\r\n\r\nPFNGLACTIVEVARYINGNVPROC __glewActiveVaryingNV = NULL;\r\nPFNGLBEGINTRANSFORMFEEDBACKNVPROC __glewBeginTransformFeedbackNV = NULL;\r\nPFNGLBINDBUFFERBASENVPROC __glewBindBufferBaseNV = NULL;\r\nPFNGLBINDBUFFEROFFSETNVPROC __glewBindBufferOffsetNV = NULL;\r\nPFNGLBINDBUFFERRANGENVPROC __glewBindBufferRangeNV = NULL;\r\nPFNGLENDTRANSFORMFEEDBACKNVPROC __glewEndTransformFeedbackNV = NULL;\r\nPFNGLGETACTIVEVARYINGNVPROC __glewGetActiveVaryingNV = NULL;\r\nPFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC __glewGetTransformFeedbackVaryingNV = NULL;\r\nPFNGLGETVARYINGLOCATIONNVPROC __glewGetVaryingLocationNV = NULL;\r\nPFNGLTRANSFORMFEEDBACKATTRIBSNVPROC __glewTransformFeedbackAttribsNV = NULL;\r\nPFNGLTRANSFORMFEEDBACKVARYINGSNVPROC __glewTransformFeedbackVaryingsNV = NULL;\r\n\r\nPFNGLBINDTRANSFORMFEEDBACKNVPROC __glewBindTransformFeedbackNV = NULL;\r\nPFNGLDELETETRANSFORMFEEDBACKSNVPROC __glewDeleteTransformFeedbacksNV = NULL;\r\nPFNGLDRAWTRANSFORMFEEDBACKNVPROC __glewDrawTransformFeedbackNV = NULL;\r\nPFNGLGENTRANSFORMFEEDBACKSNVPROC __glewGenTransformFeedbacksNV = NULL;\r\nPFNGLISTRANSFORMFEEDBACKNVPROC __glewIsTransformFeedbackNV = NULL;\r\nPFNGLPAUSETRANSFORMFEEDBACKNVPROC __glewPauseTransformFeedbackNV = NULL;\r\nPFNGLRESUMETRANSFORMFEEDBACKNVPROC __glewResumeTransformFeedbackNV = NULL;\r\n\r\nPFNGLFLUSHVERTEXARRAYRANGENVPROC __glewFlushVertexArrayRangeNV = NULL;\r\nPFNGLVERTEXARRAYRANGENVPROC __glewVertexArrayRangeNV = NULL;\r\n\r\nPFNGLBUFFERADDRESSRANGENVPROC __glewBufferAddressRangeNV = NULL;\r\nPFNGLCOLORFORMATNVPROC __glewColorFormatNV = NULL;\r\nPFNGLEDGEFLAGFORMATNVPROC __glewEdgeFlagFormatNV = NULL;\r\nPFNGLFOGCOORDFORMATNVPROC __glewFogCoordFormatNV = NULL;\r\nPFNGLGETINTEGERUI64I_VNVPROC __glewGetIntegerui64i_vNV = NULL;\r\nPFNGLINDEXFORMATNVPROC __glewIndexFormatNV = NULL;\r\nPFNGLNORMALFORMATNVPROC __glewNormalFormatNV = NULL;\r\nPFNGLSECONDARYCOLORFORMATNVPROC __glewSecondaryColorFormatNV = NULL;\r\nPFNGLTEXCOORDFORMATNVPROC __glewTexCoordFormatNV = NULL;\r\nPFNGLVERTEXATTRIBFORMATNVPROC __glewVertexAttribFormatNV = NULL;\r\nPFNGLVERTEXATTRIBIFORMATNVPROC __glewVertexAttribIFormatNV = NULL;\r\nPFNGLVERTEXFORMATNVPROC __glewVertexFormatNV = NULL;\r\n\r\nPFNGLAREPROGRAMSRESIDENTNVPROC __glewAreProgramsResidentNV = NULL;\r\nPFNGLBINDPROGRAMNVPROC __glewBindProgramNV = NULL;\r\nPFNGLDELETEPROGRAMSNVPROC __glewDeleteProgramsNV = NULL;\r\nPFNGLEXECUTEPROGRAMNVPROC __glewExecuteProgramNV = NULL;\r\nPFNGLGENPROGRAMSNVPROC __glewGenProgramsNV = NULL;\r\nPFNGLGETPROGRAMPARAMETERDVNVPROC __glewGetProgramParameterdvNV = NULL;\r\nPFNGLGETPROGRAMPARAMETERFVNVPROC __glewGetProgramParameterfvNV = NULL;\r\nPFNGLGETPROGRAMSTRINGNVPROC __glewGetProgramStringNV = NULL;\r\nPFNGLGETPROGRAMIVNVPROC __glewGetProgramivNV = NULL;\r\nPFNGLGETTRACKMATRIXIVNVPROC __glewGetTrackMatrixivNV = NULL;\r\nPFNGLGETVERTEXATTRIBPOINTERVNVPROC __glewGetVertexAttribPointervNV = NULL;\r\nPFNGLGETVERTEXATTRIBDVNVPROC __glewGetVertexAttribdvNV = NULL;\r\nPFNGLGETVERTEXATTRIBFVNVPROC __glewGetVertexAttribfvNV = NULL;\r\nPFNGLGETVERTEXATTRIBIVNVPROC __glewGetVertexAttribivNV = NULL;\r\nPFNGLISPROGRAMNVPROC __glewIsProgramNV = NULL;\r\nPFNGLLOADPROGRAMNVPROC __glewLoadProgramNV = NULL;\r\nPFNGLPROGRAMPARAMETER4DNVPROC __glewProgramParameter4dNV = NULL;\r\nPFNGLPROGRAMPARAMETER4DVNVPROC __glewProgramParameter4dvNV = NULL;\r\nPFNGLPROGRAMPARAMETER4FNVPROC __glewProgramParameter4fNV = NULL;\r\nPFNGLPROGRAMPARAMETER4FVNVPROC __glewProgramParameter4fvNV = NULL;\r\nPFNGLPROGRAMPARAMETERS4DVNVPROC __glewProgramParameters4dvNV = NULL;\r\nPFNGLPROGRAMPARAMETERS4FVNVPROC __glewProgramParameters4fvNV = NULL;\r\nPFNGLREQUESTRESIDENTPROGRAMSNVPROC __glewRequestResidentProgramsNV = NULL;\r\nPFNGLTRACKMATRIXNVPROC __glewTrackMatrixNV = NULL;\r\nPFNGLVERTEXATTRIB1DNVPROC __glewVertexAttrib1dNV = NULL;\r\nPFNGLVERTEXATTRIB1DVNVPROC __glewVertexAttrib1dvNV = NULL;\r\nPFNGLVERTEXATTRIB1FNVPROC __glewVertexAttrib1fNV = NULL;\r\nPFNGLVERTEXATTRIB1FVNVPROC __glewVertexAttrib1fvNV = NULL;\r\nPFNGLVERTEXATTRIB1SNVPROC __glewVertexAttrib1sNV = NULL;\r\nPFNGLVERTEXATTRIB1SVNVPROC __glewVertexAttrib1svNV = NULL;\r\nPFNGLVERTEXATTRIB2DNVPROC __glewVertexAttrib2dNV = NULL;\r\nPFNGLVERTEXATTRIB2DVNVPROC __glewVertexAttrib2dvNV = NULL;\r\nPFNGLVERTEXATTRIB2FNVPROC __glewVertexAttrib2fNV = NULL;\r\nPFNGLVERTEXATTRIB2FVNVPROC __glewVertexAttrib2fvNV = NULL;\r\nPFNGLVERTEXATTRIB2SNVPROC __glewVertexAttrib2sNV = NULL;\r\nPFNGLVERTEXATTRIB2SVNVPROC __glewVertexAttrib2svNV = NULL;\r\nPFNGLVERTEXATTRIB3DNVPROC __glewVertexAttrib3dNV = NULL;\r\nPFNGLVERTEXATTRIB3DVNVPROC __glewVertexAttrib3dvNV = NULL;\r\nPFNGLVERTEXATTRIB3FNVPROC __glewVertexAttrib3fNV = NULL;\r\nPFNGLVERTEXATTRIB3FVNVPROC __glewVertexAttrib3fvNV = NULL;\r\nPFNGLVERTEXATTRIB3SNVPROC __glewVertexAttrib3sNV = NULL;\r\nPFNGLVERTEXATTRIB3SVNVPROC __glewVertexAttrib3svNV = NULL;\r\nPFNGLVERTEXATTRIB4DNVPROC __glewVertexAttrib4dNV = NULL;\r\nPFNGLVERTEXATTRIB4DVNVPROC __glewVertexAttrib4dvNV = NULL;\r\nPFNGLVERTEXATTRIB4FNVPROC __glewVertexAttrib4fNV = NULL;\r\nPFNGLVERTEXATTRIB4FVNVPROC __glewVertexAttrib4fvNV = NULL;\r\nPFNGLVERTEXATTRIB4SNVPROC __glewVertexAttrib4sNV = NULL;\r\nPFNGLVERTEXATTRIB4SVNVPROC __glewVertexAttrib4svNV = NULL;\r\nPFNGLVERTEXATTRIB4UBNVPROC __glewVertexAttrib4ubNV = NULL;\r\nPFNGLVERTEXATTRIB4UBVNVPROC __glewVertexAttrib4ubvNV = NULL;\r\nPFNGLVERTEXATTRIBPOINTERNVPROC __glewVertexAttribPointerNV = NULL;\r\nPFNGLVERTEXATTRIBS1DVNVPROC __glewVertexAttribs1dvNV = NULL;\r\nPFNGLVERTEXATTRIBS1FVNVPROC __glewVertexAttribs1fvNV = NULL;\r\nPFNGLVERTEXATTRIBS1SVNVPROC __glewVertexAttribs1svNV = NULL;\r\nPFNGLVERTEXATTRIBS2DVNVPROC __glewVertexAttribs2dvNV = NULL;\r\nPFNGLVERTEXATTRIBS2FVNVPROC __glewVertexAttribs2fvNV = NULL;\r\nPFNGLVERTEXATTRIBS2SVNVPROC __glewVertexAttribs2svNV = NULL;\r\nPFNGLVERTEXATTRIBS3DVNVPROC __glewVertexAttribs3dvNV = NULL;\r\nPFNGLVERTEXATTRIBS3FVNVPROC __glewVertexAttribs3fvNV = NULL;\r\nPFNGLVERTEXATTRIBS3SVNVPROC __glewVertexAttribs3svNV = NULL;\r\nPFNGLVERTEXATTRIBS4DVNVPROC __glewVertexAttribs4dvNV = NULL;\r\nPFNGLVERTEXATTRIBS4FVNVPROC __glewVertexAttribs4fvNV = NULL;\r\nPFNGLVERTEXATTRIBS4SVNVPROC __glewVertexAttribs4svNV = NULL;\r\nPFNGLVERTEXATTRIBS4UBVNVPROC __glewVertexAttribs4ubvNV = NULL;\r\n\r\nPFNGLCLEARDEPTHFOESPROC __glewClearDepthfOES = NULL;\r\nPFNGLCLIPPLANEFOESPROC __glewClipPlanefOES = NULL;\r\nPFNGLDEPTHRANGEFOESPROC __glewDepthRangefOES = NULL;\r\nPFNGLFRUSTUMFOESPROC __glewFrustumfOES = NULL;\r\nPFNGLGETCLIPPLANEFOESPROC __glewGetClipPlanefOES = NULL;\r\nPFNGLORTHOFOESPROC __glewOrthofOES = NULL;\r\n\r\nPFNGLDETAILTEXFUNCSGISPROC __glewDetailTexFuncSGIS = NULL;\r\nPFNGLGETDETAILTEXFUNCSGISPROC __glewGetDetailTexFuncSGIS = NULL;\r\n\r\nPFNGLFOGFUNCSGISPROC __glewFogFuncSGIS = NULL;\r\nPFNGLGETFOGFUNCSGISPROC __glewGetFogFuncSGIS = NULL;\r\n\r\nPFNGLSAMPLEMASKSGISPROC __glewSampleMaskSGIS = NULL;\r\nPFNGLSAMPLEPATTERNSGISPROC __glewSamplePatternSGIS = NULL;\r\n\r\nPFNGLGETSHARPENTEXFUNCSGISPROC __glewGetSharpenTexFuncSGIS = NULL;\r\nPFNGLSHARPENTEXFUNCSGISPROC __glewSharpenTexFuncSGIS = NULL;\r\n\r\nPFNGLTEXIMAGE4DSGISPROC __glewTexImage4DSGIS = NULL;\r\nPFNGLTEXSUBIMAGE4DSGISPROC __glewTexSubImage4DSGIS = NULL;\r\n\r\nPFNGLGETTEXFILTERFUNCSGISPROC __glewGetTexFilterFuncSGIS = NULL;\r\nPFNGLTEXFILTERFUNCSGISPROC __glewTexFilterFuncSGIS = NULL;\r\n\r\nPFNGLASYNCMARKERSGIXPROC __glewAsyncMarkerSGIX = NULL;\r\nPFNGLDELETEASYNCMARKERSSGIXPROC __glewDeleteAsyncMarkersSGIX = NULL;\r\nPFNGLFINISHASYNCSGIXPROC __glewFinishAsyncSGIX = NULL;\r\nPFNGLGENASYNCMARKERSSGIXPROC __glewGenAsyncMarkersSGIX = NULL;\r\nPFNGLISASYNCMARKERSGIXPROC __glewIsAsyncMarkerSGIX = NULL;\r\nPFNGLPOLLASYNCSGIXPROC __glewPollAsyncSGIX = NULL;\r\n\r\nPFNGLFLUSHRASTERSGIXPROC __glewFlushRasterSGIX = NULL;\r\n\r\nPFNGLTEXTUREFOGSGIXPROC __glewTextureFogSGIX = NULL;\r\n\r\nPFNGLFRAGMENTCOLORMATERIALSGIXPROC __glewFragmentColorMaterialSGIX = NULL;\r\nPFNGLFRAGMENTLIGHTMODELFSGIXPROC __glewFragmentLightModelfSGIX = NULL;\r\nPFNGLFRAGMENTLIGHTMODELFVSGIXPROC __glewFragmentLightModelfvSGIX = NULL;\r\nPFNGLFRAGMENTLIGHTMODELISGIXPROC __glewFragmentLightModeliSGIX = NULL;\r\nPFNGLFRAGMENTLIGHTMODELIVSGIXPROC __glewFragmentLightModelivSGIX = NULL;\r\nPFNGLFRAGMENTLIGHTFSGIXPROC __glewFragmentLightfSGIX = NULL;\r\nPFNGLFRAGMENTLIGHTFVSGIXPROC __glewFragmentLightfvSGIX = NULL;\r\nPFNGLFRAGMENTLIGHTISGIXPROC __glewFragmentLightiSGIX = NULL;\r\nPFNGLFRAGMENTLIGHTIVSGIXPROC __glewFragmentLightivSGIX = NULL;\r\nPFNGLFRAGMENTMATERIALFSGIXPROC __glewFragmentMaterialfSGIX = NULL;\r\nPFNGLFRAGMENTMATERIALFVSGIXPROC __glewFragmentMaterialfvSGIX = NULL;\r\nPFNGLFRAGMENTMATERIALISGIXPROC __glewFragmentMaterialiSGIX = NULL;\r\nPFNGLFRAGMENTMATERIALIVSGIXPROC __glewFragmentMaterialivSGIX = NULL;\r\nPFNGLGETFRAGMENTLIGHTFVSGIXPROC __glewGetFragmentLightfvSGIX = NULL;\r\nPFNGLGETFRAGMENTLIGHTIVSGIXPROC __glewGetFragmentLightivSGIX = NULL;\r\nPFNGLGETFRAGMENTMATERIALFVSGIXPROC __glewGetFragmentMaterialfvSGIX = NULL;\r\nPFNGLGETFRAGMENTMATERIALIVSGIXPROC __glewGetFragmentMaterialivSGIX = NULL;\r\n\r\nPFNGLFRAMEZOOMSGIXPROC __glewFrameZoomSGIX = NULL;\r\n\r\nPFNGLPIXELTEXGENSGIXPROC __glewPixelTexGenSGIX = NULL;\r\n\r\nPFNGLREFERENCEPLANESGIXPROC __glewReferencePlaneSGIX = NULL;\r\n\r\nPFNGLSPRITEPARAMETERFSGIXPROC __glewSpriteParameterfSGIX = NULL;\r\nPFNGLSPRITEPARAMETERFVSGIXPROC __glewSpriteParameterfvSGIX = NULL;\r\nPFNGLSPRITEPARAMETERISGIXPROC __glewSpriteParameteriSGIX = NULL;\r\nPFNGLSPRITEPARAMETERIVSGIXPROC __glewSpriteParameterivSGIX = NULL;\r\n\r\nPFNGLTAGSAMPLEBUFFERSGIXPROC __glewTagSampleBufferSGIX = NULL;\r\n\r\nPFNGLCOLORTABLEPARAMETERFVSGIPROC __glewColorTableParameterfvSGI = NULL;\r\nPFNGLCOLORTABLEPARAMETERIVSGIPROC __glewColorTableParameterivSGI = NULL;\r\nPFNGLCOLORTABLESGIPROC __glewColorTableSGI = NULL;\r\nPFNGLCOPYCOLORTABLESGIPROC __glewCopyColorTableSGI = NULL;\r\nPFNGLGETCOLORTABLEPARAMETERFVSGIPROC __glewGetColorTableParameterfvSGI = NULL;\r\nPFNGLGETCOLORTABLEPARAMETERIVSGIPROC __glewGetColorTableParameterivSGI = NULL;\r\nPFNGLGETCOLORTABLESGIPROC __glewGetColorTableSGI = NULL;\r\n\r\nPFNGLFINISHTEXTURESUNXPROC __glewFinishTextureSUNX = NULL;\r\n\r\nPFNGLGLOBALALPHAFACTORBSUNPROC __glewGlobalAlphaFactorbSUN = NULL;\r\nPFNGLGLOBALALPHAFACTORDSUNPROC __glewGlobalAlphaFactordSUN = NULL;\r\nPFNGLGLOBALALPHAFACTORFSUNPROC __glewGlobalAlphaFactorfSUN = NULL;\r\nPFNGLGLOBALALPHAFACTORISUNPROC __glewGlobalAlphaFactoriSUN = NULL;\r\nPFNGLGLOBALALPHAFACTORSSUNPROC __glewGlobalAlphaFactorsSUN = NULL;\r\nPFNGLGLOBALALPHAFACTORUBSUNPROC __glewGlobalAlphaFactorubSUN = NULL;\r\nPFNGLGLOBALALPHAFACTORUISUNPROC __glewGlobalAlphaFactoruiSUN = NULL;\r\nPFNGLGLOBALALPHAFACTORUSSUNPROC __glewGlobalAlphaFactorusSUN = NULL;\r\n\r\nPFNGLREADVIDEOPIXELSSUNPROC __glewReadVideoPixelsSUN = NULL;\r\n\r\nPFNGLREPLACEMENTCODEPOINTERSUNPROC __glewReplacementCodePointerSUN = NULL;\r\nPFNGLREPLACEMENTCODEUBSUNPROC __glewReplacementCodeubSUN = NULL;\r\nPFNGLREPLACEMENTCODEUBVSUNPROC __glewReplacementCodeubvSUN = NULL;\r\nPFNGLREPLACEMENTCODEUISUNPROC __glewReplacementCodeuiSUN = NULL;\r\nPFNGLREPLACEMENTCODEUIVSUNPROC __glewReplacementCodeuivSUN = NULL;\r\nPFNGLREPLACEMENTCODEUSSUNPROC __glewReplacementCodeusSUN = NULL;\r\nPFNGLREPLACEMENTCODEUSVSUNPROC __glewReplacementCodeusvSUN = NULL;\r\n\r\nPFNGLCOLOR3FVERTEX3FSUNPROC __glewColor3fVertex3fSUN = NULL;\r\nPFNGLCOLOR3FVERTEX3FVSUNPROC __glewColor3fVertex3fvSUN = NULL;\r\nPFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewColor4fNormal3fVertex3fSUN = NULL;\r\nPFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewColor4fNormal3fVertex3fvSUN = NULL;\r\nPFNGLCOLOR4UBVERTEX2FSUNPROC __glewColor4ubVertex2fSUN = NULL;\r\nPFNGLCOLOR4UBVERTEX2FVSUNPROC __glewColor4ubVertex2fvSUN = NULL;\r\nPFNGLCOLOR4UBVERTEX3FSUNPROC __glewColor4ubVertex3fSUN = NULL;\r\nPFNGLCOLOR4UBVERTEX3FVSUNPROC __glewColor4ubVertex3fvSUN = NULL;\r\nPFNGLNORMAL3FVERTEX3FSUNPROC __glewNormal3fVertex3fSUN = NULL;\r\nPFNGLNORMAL3FVERTEX3FVSUNPROC __glewNormal3fVertex3fvSUN = NULL;\r\nPFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC __glewReplacementCodeuiColor3fVertex3fSUN = NULL;\r\nPFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor3fVertex3fvSUN = NULL;\r\nPFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fSUN = NULL;\r\nPFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fvSUN = NULL;\r\nPFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC __glewReplacementCodeuiColor4ubVertex3fSUN = NULL;\r\nPFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC __glewReplacementCodeuiColor4ubVertex3fvSUN = NULL;\r\nPFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiNormal3fVertex3fSUN = NULL;\r\nPFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiNormal3fVertex3fvSUN = NULL;\r\nPFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN = NULL;\r\nPFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN = NULL;\r\nPFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN = NULL;\r\nPFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN = NULL;\r\nPFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fSUN = NULL;\r\nPFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fvSUN = NULL;\r\nPFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC __glewReplacementCodeuiVertex3fSUN = NULL;\r\nPFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC __glewReplacementCodeuiVertex3fvSUN = NULL;\r\nPFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC __glewTexCoord2fColor3fVertex3fSUN = NULL;\r\nPFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC __glewTexCoord2fColor3fVertex3fvSUN = NULL;\r\nPFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fSUN = NULL;\r\nPFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fvSUN = NULL;\r\nPFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC __glewTexCoord2fColor4ubVertex3fSUN = NULL;\r\nPFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC __glewTexCoord2fColor4ubVertex3fvSUN = NULL;\r\nPFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fNormal3fVertex3fSUN = NULL;\r\nPFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fNormal3fVertex3fvSUN = NULL;\r\nPFNGLTEXCOORD2FVERTEX3FSUNPROC __glewTexCoord2fVertex3fSUN = NULL;\r\nPFNGLTEXCOORD2FVERTEX3FVSUNPROC __glewTexCoord2fVertex3fvSUN = NULL;\r\nPFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fSUN = NULL;\r\nPFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fvSUN = NULL;\r\nPFNGLTEXCOORD4FVERTEX4FSUNPROC __glewTexCoord4fVertex4fSUN = NULL;\r\nPFNGLTEXCOORD4FVERTEX4FVSUNPROC __glewTexCoord4fVertex4fvSUN = NULL;\r\n\r\nPFNGLADDSWAPHINTRECTWINPROC __glewAddSwapHintRectWIN = NULL;\r\n\r\n#endif /* !WIN32 || !GLEW_MX */\r\n\r\n#if !defined(GLEW_MX)\r\n\r\nGLboolean __GLEW_VERSION_1_1 = GL_FALSE;\r\nGLboolean __GLEW_VERSION_1_2 = GL_FALSE;\r\nGLboolean __GLEW_VERSION_1_3 = GL_FALSE;\r\nGLboolean __GLEW_VERSION_1_4 = GL_FALSE;\r\nGLboolean __GLEW_VERSION_1_5 = GL_FALSE;\r\nGLboolean __GLEW_VERSION_2_0 = GL_FALSE;\r\nGLboolean __GLEW_VERSION_2_1 = GL_FALSE;\r\nGLboolean __GLEW_VERSION_3_0 = GL_FALSE;\r\nGLboolean __GLEW_VERSION_3_1 = GL_FALSE;\r\nGLboolean __GLEW_VERSION_3_2 = GL_FALSE;\r\nGLboolean __GLEW_3DFX_multisample = GL_FALSE;\r\nGLboolean __GLEW_3DFX_tbuffer = GL_FALSE;\r\nGLboolean __GLEW_3DFX_texture_compression_FXT1 = GL_FALSE;\r\nGLboolean __GLEW_AMD_draw_buffers_blend = GL_FALSE;\r\nGLboolean __GLEW_AMD_performance_monitor = GL_FALSE;\r\nGLboolean __GLEW_AMD_seamless_cubemap_per_texture = GL_FALSE;\r\nGLboolean __GLEW_AMD_shader_stencil_export = GL_FALSE;\r\nGLboolean __GLEW_AMD_texture_texture4 = GL_FALSE;\r\nGLboolean __GLEW_AMD_vertex_shader_tessellator = GL_FALSE;\r\nGLboolean __GLEW_APPLE_aux_depth_stencil = GL_FALSE;\r\nGLboolean __GLEW_APPLE_client_storage = GL_FALSE;\r\nGLboolean __GLEW_APPLE_element_array = GL_FALSE;\r\nGLboolean __GLEW_APPLE_fence = GL_FALSE;\r\nGLboolean __GLEW_APPLE_float_pixels = GL_FALSE;\r\nGLboolean __GLEW_APPLE_flush_buffer_range = GL_FALSE;\r\nGLboolean __GLEW_APPLE_object_purgeable = GL_FALSE;\r\nGLboolean __GLEW_APPLE_pixel_buffer = GL_FALSE;\r\nGLboolean __GLEW_APPLE_rgb_422 = GL_FALSE;\r\nGLboolean __GLEW_APPLE_row_bytes = GL_FALSE;\r\nGLboolean __GLEW_APPLE_specular_vector = GL_FALSE;\r\nGLboolean __GLEW_APPLE_texture_range = GL_FALSE;\r\nGLboolean __GLEW_APPLE_transform_hint = GL_FALSE;\r\nGLboolean __GLEW_APPLE_vertex_array_object = GL_FALSE;\r\nGLboolean __GLEW_APPLE_vertex_array_range = GL_FALSE;\r\nGLboolean __GLEW_APPLE_vertex_program_evaluators = GL_FALSE;\r\nGLboolean __GLEW_APPLE_ycbcr_422 = GL_FALSE;\r\nGLboolean __GLEW_ARB_color_buffer_float = GL_FALSE;\r\nGLboolean __GLEW_ARB_compatibility = GL_FALSE;\r\nGLboolean __GLEW_ARB_copy_buffer = GL_FALSE;\r\nGLboolean __GLEW_ARB_depth_buffer_float = GL_FALSE;\r\nGLboolean __GLEW_ARB_depth_clamp = GL_FALSE;\r\nGLboolean __GLEW_ARB_depth_texture = GL_FALSE;\r\nGLboolean __GLEW_ARB_draw_buffers = GL_FALSE;\r\nGLboolean __GLEW_ARB_draw_buffers_blend = GL_FALSE;\r\nGLboolean __GLEW_ARB_draw_elements_base_vertex = GL_FALSE;\r\nGLboolean __GLEW_ARB_draw_instanced = GL_FALSE;\r\nGLboolean __GLEW_ARB_fragment_coord_conventions = GL_FALSE;\r\nGLboolean __GLEW_ARB_fragment_program = GL_FALSE;\r\nGLboolean __GLEW_ARB_fragment_program_shadow = GL_FALSE;\r\nGLboolean __GLEW_ARB_fragment_shader = GL_FALSE;\r\nGLboolean __GLEW_ARB_framebuffer_object = GL_FALSE;\r\nGLboolean __GLEW_ARB_framebuffer_sRGB = GL_FALSE;\r\nGLboolean __GLEW_ARB_geometry_shader4 = GL_FALSE;\r\nGLboolean __GLEW_ARB_half_float_pixel = GL_FALSE;\r\nGLboolean __GLEW_ARB_half_float_vertex = GL_FALSE;\r\nGLboolean __GLEW_ARB_imaging = GL_FALSE;\r\nGLboolean __GLEW_ARB_instanced_arrays = GL_FALSE;\r\nGLboolean __GLEW_ARB_map_buffer_range = GL_FALSE;\r\nGLboolean __GLEW_ARB_matrix_palette = GL_FALSE;\r\nGLboolean __GLEW_ARB_multisample = GL_FALSE;\r\nGLboolean __GLEW_ARB_multitexture = GL_FALSE;\r\nGLboolean __GLEW_ARB_occlusion_query = GL_FALSE;\r\nGLboolean __GLEW_ARB_pixel_buffer_object = GL_FALSE;\r\nGLboolean __GLEW_ARB_point_parameters = GL_FALSE;\r\nGLboolean __GLEW_ARB_point_sprite = GL_FALSE;\r\nGLboolean __GLEW_ARB_provoking_vertex = GL_FALSE;\r\nGLboolean __GLEW_ARB_sample_shading = GL_FALSE;\r\nGLboolean __GLEW_ARB_seamless_cube_map = GL_FALSE;\r\nGLboolean __GLEW_ARB_shader_objects = GL_FALSE;\r\nGLboolean __GLEW_ARB_shader_texture_lod = GL_FALSE;\r\nGLboolean __GLEW_ARB_shading_language_100 = GL_FALSE;\r\nGLboolean __GLEW_ARB_shadow = GL_FALSE;\r\nGLboolean __GLEW_ARB_shadow_ambient = GL_FALSE;\r\nGLboolean __GLEW_ARB_sync = GL_FALSE;\r\nGLboolean __GLEW_ARB_texture_border_clamp = GL_FALSE;\r\nGLboolean __GLEW_ARB_texture_buffer_object = GL_FALSE;\r\nGLboolean __GLEW_ARB_texture_compression = GL_FALSE;\r\nGLboolean __GLEW_ARB_texture_compression_rgtc = GL_FALSE;\r\nGLboolean __GLEW_ARB_texture_cube_map = GL_FALSE;\r\nGLboolean __GLEW_ARB_texture_cube_map_array = GL_FALSE;\r\nGLboolean __GLEW_ARB_texture_env_add = GL_FALSE;\r\nGLboolean __GLEW_ARB_texture_env_combine = GL_FALSE;\r\nGLboolean __GLEW_ARB_texture_env_crossbar = GL_FALSE;\r\nGLboolean __GLEW_ARB_texture_env_dot3 = GL_FALSE;\r\nGLboolean __GLEW_ARB_texture_float = GL_FALSE;\r\nGLboolean __GLEW_ARB_texture_gather = GL_FALSE;\r\nGLboolean __GLEW_ARB_texture_mirrored_repeat = GL_FALSE;\r\nGLboolean __GLEW_ARB_texture_multisample = GL_FALSE;\r\nGLboolean __GLEW_ARB_texture_non_power_of_two = GL_FALSE;\r\nGLboolean __GLEW_ARB_texture_query_lod = GL_FALSE;\r\nGLboolean __GLEW_ARB_texture_rectangle = GL_FALSE;\r\nGLboolean __GLEW_ARB_texture_rg = GL_FALSE;\r\nGLboolean __GLEW_ARB_transpose_matrix = GL_FALSE;\r\nGLboolean __GLEW_ARB_uniform_buffer_object = GL_FALSE;\r\nGLboolean __GLEW_ARB_vertex_array_bgra = GL_FALSE;\r\nGLboolean __GLEW_ARB_vertex_array_object = GL_FALSE;\r\nGLboolean __GLEW_ARB_vertex_blend = GL_FALSE;\r\nGLboolean __GLEW_ARB_vertex_buffer_object = GL_FALSE;\r\nGLboolean __GLEW_ARB_vertex_program = GL_FALSE;\r\nGLboolean __GLEW_ARB_vertex_shader = GL_FALSE;\r\nGLboolean __GLEW_ARB_window_pos = GL_FALSE;\r\nGLboolean __GLEW_ATIX_point_sprites = GL_FALSE;\r\nGLboolean __GLEW_ATIX_texture_env_combine3 = GL_FALSE;\r\nGLboolean __GLEW_ATIX_texture_env_route = GL_FALSE;\r\nGLboolean __GLEW_ATIX_vertex_shader_output_point_size = GL_FALSE;\r\nGLboolean __GLEW_ATI_draw_buffers = GL_FALSE;\r\nGLboolean __GLEW_ATI_element_array = GL_FALSE;\r\nGLboolean __GLEW_ATI_envmap_bumpmap = GL_FALSE;\r\nGLboolean __GLEW_ATI_fragment_shader = GL_FALSE;\r\nGLboolean __GLEW_ATI_map_object_buffer = GL_FALSE;\r\nGLboolean __GLEW_ATI_meminfo = GL_FALSE;\r\nGLboolean __GLEW_ATI_pn_triangles = GL_FALSE;\r\nGLboolean __GLEW_ATI_separate_stencil = GL_FALSE;\r\nGLboolean __GLEW_ATI_shader_texture_lod = GL_FALSE;\r\nGLboolean __GLEW_ATI_text_fragment_shader = GL_FALSE;\r\nGLboolean __GLEW_ATI_texture_compression_3dc = GL_FALSE;\r\nGLboolean __GLEW_ATI_texture_env_combine3 = GL_FALSE;\r\nGLboolean __GLEW_ATI_texture_float = GL_FALSE;\r\nGLboolean __GLEW_ATI_texture_mirror_once = GL_FALSE;\r\nGLboolean __GLEW_ATI_vertex_array_object = GL_FALSE;\r\nGLboolean __GLEW_ATI_vertex_attrib_array_object = GL_FALSE;\r\nGLboolean __GLEW_ATI_vertex_streams = GL_FALSE;\r\nGLboolean __GLEW_EXT_422_pixels = GL_FALSE;\r\nGLboolean __GLEW_EXT_Cg_shader = GL_FALSE;\r\nGLboolean __GLEW_EXT_abgr = GL_FALSE;\r\nGLboolean __GLEW_EXT_bgra = GL_FALSE;\r\nGLboolean __GLEW_EXT_bindable_uniform = GL_FALSE;\r\nGLboolean __GLEW_EXT_blend_color = GL_FALSE;\r\nGLboolean __GLEW_EXT_blend_equation_separate = GL_FALSE;\r\nGLboolean __GLEW_EXT_blend_func_separate = GL_FALSE;\r\nGLboolean __GLEW_EXT_blend_logic_op = GL_FALSE;\r\nGLboolean __GLEW_EXT_blend_minmax = GL_FALSE;\r\nGLboolean __GLEW_EXT_blend_subtract = GL_FALSE;\r\nGLboolean __GLEW_EXT_clip_volume_hint = GL_FALSE;\r\nGLboolean __GLEW_EXT_cmyka = GL_FALSE;\r\nGLboolean __GLEW_EXT_color_subtable = GL_FALSE;\r\nGLboolean __GLEW_EXT_compiled_vertex_array = GL_FALSE;\r\nGLboolean __GLEW_EXT_convolution = GL_FALSE;\r\nGLboolean __GLEW_EXT_coordinate_frame = GL_FALSE;\r\nGLboolean __GLEW_EXT_copy_texture = GL_FALSE;\r\nGLboolean __GLEW_EXT_cull_vertex = GL_FALSE;\r\nGLboolean __GLEW_EXT_depth_bounds_test = GL_FALSE;\r\nGLboolean __GLEW_EXT_direct_state_access = GL_FALSE;\r\nGLboolean __GLEW_EXT_draw_buffers2 = GL_FALSE;\r\nGLboolean __GLEW_EXT_draw_instanced = GL_FALSE;\r\nGLboolean __GLEW_EXT_draw_range_elements = GL_FALSE;\r\nGLboolean __GLEW_EXT_fog_coord = GL_FALSE;\r\nGLboolean __GLEW_EXT_fragment_lighting = GL_FALSE;\r\nGLboolean __GLEW_EXT_framebuffer_blit = GL_FALSE;\r\nGLboolean __GLEW_EXT_framebuffer_multisample = GL_FALSE;\r\nGLboolean __GLEW_EXT_framebuffer_object = GL_FALSE;\r\nGLboolean __GLEW_EXT_framebuffer_sRGB = GL_FALSE;\r\nGLboolean __GLEW_EXT_geometry_shader4 = GL_FALSE;\r\nGLboolean __GLEW_EXT_gpu_program_parameters = GL_FALSE;\r\nGLboolean __GLEW_EXT_gpu_shader4 = GL_FALSE;\r\nGLboolean __GLEW_EXT_histogram = GL_FALSE;\r\nGLboolean __GLEW_EXT_index_array_formats = GL_FALSE;\r\nGLboolean __GLEW_EXT_index_func = GL_FALSE;\r\nGLboolean __GLEW_EXT_index_material = GL_FALSE;\r\nGLboolean __GLEW_EXT_index_texture = GL_FALSE;\r\nGLboolean __GLEW_EXT_light_texture = GL_FALSE;\r\nGLboolean __GLEW_EXT_misc_attribute = GL_FALSE;\r\nGLboolean __GLEW_EXT_multi_draw_arrays = GL_FALSE;\r\nGLboolean __GLEW_EXT_multisample = GL_FALSE;\r\nGLboolean __GLEW_EXT_packed_depth_stencil = GL_FALSE;\r\nGLboolean __GLEW_EXT_packed_float = GL_FALSE;\r\nGLboolean __GLEW_EXT_packed_pixels = GL_FALSE;\r\nGLboolean __GLEW_EXT_paletted_texture = GL_FALSE;\r\nGLboolean __GLEW_EXT_pixel_buffer_object = GL_FALSE;\r\nGLboolean __GLEW_EXT_pixel_transform = GL_FALSE;\r\nGLboolean __GLEW_EXT_pixel_transform_color_table = GL_FALSE;\r\nGLboolean __GLEW_EXT_point_parameters = GL_FALSE;\r\nGLboolean __GLEW_EXT_polygon_offset = GL_FALSE;\r\nGLboolean __GLEW_EXT_provoking_vertex = GL_FALSE;\r\nGLboolean __GLEW_EXT_rescale_normal = GL_FALSE;\r\nGLboolean __GLEW_EXT_scene_marker = GL_FALSE;\r\nGLboolean __GLEW_EXT_secondary_color = GL_FALSE;\r\nGLboolean __GLEW_EXT_separate_shader_objects = GL_FALSE;\r\nGLboolean __GLEW_EXT_separate_specular_color = GL_FALSE;\r\nGLboolean __GLEW_EXT_shadow_funcs = GL_FALSE;\r\nGLboolean __GLEW_EXT_shared_texture_palette = GL_FALSE;\r\nGLboolean __GLEW_EXT_stencil_clear_tag = GL_FALSE;\r\nGLboolean __GLEW_EXT_stencil_two_side = GL_FALSE;\r\nGLboolean __GLEW_EXT_stencil_wrap = GL_FALSE;\r\nGLboolean __GLEW_EXT_subtexture = GL_FALSE;\r\nGLboolean __GLEW_EXT_texture = GL_FALSE;\r\nGLboolean __GLEW_EXT_texture3D = GL_FALSE;\r\nGLboolean __GLEW_EXT_texture_array = GL_FALSE;\r\nGLboolean __GLEW_EXT_texture_buffer_object = GL_FALSE;\r\nGLboolean __GLEW_EXT_texture_compression_dxt1 = GL_FALSE;\r\nGLboolean __GLEW_EXT_texture_compression_latc = GL_FALSE;\r\nGLboolean __GLEW_EXT_texture_compression_rgtc = GL_FALSE;\r\nGLboolean __GLEW_EXT_texture_compression_s3tc = GL_FALSE;\r\nGLboolean __GLEW_EXT_texture_cube_map = GL_FALSE;\r\nGLboolean __GLEW_EXT_texture_edge_clamp = GL_FALSE;\r\nGLboolean __GLEW_EXT_texture_env = GL_FALSE;\r\nGLboolean __GLEW_EXT_texture_env_add = GL_FALSE;\r\nGLboolean __GLEW_EXT_texture_env_combine = GL_FALSE;\r\nGLboolean __GLEW_EXT_texture_env_dot3 = GL_FALSE;\r\nGLboolean __GLEW_EXT_texture_filter_anisotropic = GL_FALSE;\r\nGLboolean __GLEW_EXT_texture_integer = GL_FALSE;\r\nGLboolean __GLEW_EXT_texture_lod_bias = GL_FALSE;\r\nGLboolean __GLEW_EXT_texture_mirror_clamp = GL_FALSE;\r\nGLboolean __GLEW_EXT_texture_object = GL_FALSE;\r\nGLboolean __GLEW_EXT_texture_perturb_normal = GL_FALSE;\r\nGLboolean __GLEW_EXT_texture_rectangle = GL_FALSE;\r\nGLboolean __GLEW_EXT_texture_sRGB = GL_FALSE;\r\nGLboolean __GLEW_EXT_texture_shared_exponent = GL_FALSE;\r\nGLboolean __GLEW_EXT_texture_snorm = GL_FALSE;\r\nGLboolean __GLEW_EXT_texture_swizzle = GL_FALSE;\r\nGLboolean __GLEW_EXT_timer_query = GL_FALSE;\r\nGLboolean __GLEW_EXT_transform_feedback = GL_FALSE;\r\nGLboolean __GLEW_EXT_vertex_array = GL_FALSE;\r\nGLboolean __GLEW_EXT_vertex_array_bgra = GL_FALSE;\r\nGLboolean __GLEW_EXT_vertex_shader = GL_FALSE;\r\nGLboolean __GLEW_EXT_vertex_weighting = GL_FALSE;\r\nGLboolean __GLEW_GREMEDY_frame_terminator = GL_FALSE;\r\nGLboolean __GLEW_GREMEDY_string_marker = GL_FALSE;\r\nGLboolean __GLEW_HP_convolution_border_modes = GL_FALSE;\r\nGLboolean __GLEW_HP_image_transform = GL_FALSE;\r\nGLboolean __GLEW_HP_occlusion_test = GL_FALSE;\r\nGLboolean __GLEW_HP_texture_lighting = GL_FALSE;\r\nGLboolean __GLEW_IBM_cull_vertex = GL_FALSE;\r\nGLboolean __GLEW_IBM_multimode_draw_arrays = GL_FALSE;\r\nGLboolean __GLEW_IBM_rasterpos_clip = GL_FALSE;\r\nGLboolean __GLEW_IBM_static_data = GL_FALSE;\r\nGLboolean __GLEW_IBM_texture_mirrored_repeat = GL_FALSE;\r\nGLboolean __GLEW_IBM_vertex_array_lists = GL_FALSE;\r\nGLboolean __GLEW_INGR_color_clamp = GL_FALSE;\r\nGLboolean __GLEW_INGR_interlace_read = GL_FALSE;\r\nGLboolean __GLEW_INTEL_parallel_arrays = GL_FALSE;\r\nGLboolean __GLEW_INTEL_texture_scissor = GL_FALSE;\r\nGLboolean __GLEW_KTX_buffer_region = GL_FALSE;\r\nGLboolean __GLEW_MESAX_texture_stack = GL_FALSE;\r\nGLboolean __GLEW_MESA_pack_invert = GL_FALSE;\r\nGLboolean __GLEW_MESA_resize_buffers = GL_FALSE;\r\nGLboolean __GLEW_MESA_window_pos = GL_FALSE;\r\nGLboolean __GLEW_MESA_ycbcr_texture = GL_FALSE;\r\nGLboolean __GLEW_NV_blend_square = GL_FALSE;\r\nGLboolean __GLEW_NV_conditional_render = GL_FALSE;\r\nGLboolean __GLEW_NV_copy_depth_to_color = GL_FALSE;\r\nGLboolean __GLEW_NV_copy_image = GL_FALSE;\r\nGLboolean __GLEW_NV_depth_buffer_float = GL_FALSE;\r\nGLboolean __GLEW_NV_depth_clamp = GL_FALSE;\r\nGLboolean __GLEW_NV_depth_range_unclamped = GL_FALSE;\r\nGLboolean __GLEW_NV_evaluators = GL_FALSE;\r\nGLboolean __GLEW_NV_explicit_multisample = GL_FALSE;\r\nGLboolean __GLEW_NV_fence = GL_FALSE;\r\nGLboolean __GLEW_NV_float_buffer = GL_FALSE;\r\nGLboolean __GLEW_NV_fog_distance = GL_FALSE;\r\nGLboolean __GLEW_NV_fragment_program = GL_FALSE;\r\nGLboolean __GLEW_NV_fragment_program2 = GL_FALSE;\r\nGLboolean __GLEW_NV_fragment_program4 = GL_FALSE;\r\nGLboolean __GLEW_NV_fragment_program_option = GL_FALSE;\r\nGLboolean __GLEW_NV_framebuffer_multisample_coverage = GL_FALSE;\r\nGLboolean __GLEW_NV_geometry_program4 = GL_FALSE;\r\nGLboolean __GLEW_NV_geometry_shader4 = GL_FALSE;\r\nGLboolean __GLEW_NV_gpu_program4 = GL_FALSE;\r\nGLboolean __GLEW_NV_half_float = GL_FALSE;\r\nGLboolean __GLEW_NV_light_max_exponent = GL_FALSE;\r\nGLboolean __GLEW_NV_multisample_filter_hint = GL_FALSE;\r\nGLboolean __GLEW_NV_occlusion_query = GL_FALSE;\r\nGLboolean __GLEW_NV_packed_depth_stencil = GL_FALSE;\r\nGLboolean __GLEW_NV_parameter_buffer_object = GL_FALSE;\r\nGLboolean __GLEW_NV_parameter_buffer_object2 = GL_FALSE;\r\nGLboolean __GLEW_NV_pixel_data_range = GL_FALSE;\r\nGLboolean __GLEW_NV_point_sprite = GL_FALSE;\r\nGLboolean __GLEW_NV_present_video = GL_FALSE;\r\nGLboolean __GLEW_NV_primitive_restart = GL_FALSE;\r\nGLboolean __GLEW_NV_register_combiners = GL_FALSE;\r\nGLboolean __GLEW_NV_register_combiners2 = GL_FALSE;\r\nGLboolean __GLEW_NV_shader_buffer_load = GL_FALSE;\r\nGLboolean __GLEW_NV_texgen_emboss = GL_FALSE;\r\nGLboolean __GLEW_NV_texgen_reflection = GL_FALSE;\r\nGLboolean __GLEW_NV_texture_barrier = GL_FALSE;\r\nGLboolean __GLEW_NV_texture_compression_vtc = GL_FALSE;\r\nGLboolean __GLEW_NV_texture_env_combine4 = GL_FALSE;\r\nGLboolean __GLEW_NV_texture_expand_normal = GL_FALSE;\r\nGLboolean __GLEW_NV_texture_rectangle = GL_FALSE;\r\nGLboolean __GLEW_NV_texture_shader = GL_FALSE;\r\nGLboolean __GLEW_NV_texture_shader2 = GL_FALSE;\r\nGLboolean __GLEW_NV_texture_shader3 = GL_FALSE;\r\nGLboolean __GLEW_NV_transform_feedback = GL_FALSE;\r\nGLboolean __GLEW_NV_transform_feedback2 = GL_FALSE;\r\nGLboolean __GLEW_NV_vertex_array_range = GL_FALSE;\r\nGLboolean __GLEW_NV_vertex_array_range2 = GL_FALSE;\r\nGLboolean __GLEW_NV_vertex_buffer_unified_memory = GL_FALSE;\r\nGLboolean __GLEW_NV_vertex_program = GL_FALSE;\r\nGLboolean __GLEW_NV_vertex_program1_1 = GL_FALSE;\r\nGLboolean __GLEW_NV_vertex_program2 = GL_FALSE;\r\nGLboolean __GLEW_NV_vertex_program2_option = GL_FALSE;\r\nGLboolean __GLEW_NV_vertex_program3 = GL_FALSE;\r\nGLboolean __GLEW_NV_vertex_program4 = GL_FALSE;\r\nGLboolean __GLEW_OES_byte_coordinates = GL_FALSE;\r\nGLboolean __GLEW_OES_compressed_paletted_texture = GL_FALSE;\r\nGLboolean __GLEW_OES_read_format = GL_FALSE;\r\nGLboolean __GLEW_OES_single_precision = GL_FALSE;\r\nGLboolean __GLEW_OML_interlace = GL_FALSE;\r\nGLboolean __GLEW_OML_resample = GL_FALSE;\r\nGLboolean __GLEW_OML_subsample = GL_FALSE;\r\nGLboolean __GLEW_PGI_misc_hints = GL_FALSE;\r\nGLboolean __GLEW_PGI_vertex_hints = GL_FALSE;\r\nGLboolean __GLEW_REND_screen_coordinates = GL_FALSE;\r\nGLboolean __GLEW_S3_s3tc = GL_FALSE;\r\nGLboolean __GLEW_SGIS_color_range = GL_FALSE;\r\nGLboolean __GLEW_SGIS_detail_texture = GL_FALSE;\r\nGLboolean __GLEW_SGIS_fog_function = GL_FALSE;\r\nGLboolean __GLEW_SGIS_generate_mipmap = GL_FALSE;\r\nGLboolean __GLEW_SGIS_multisample = GL_FALSE;\r\nGLboolean __GLEW_SGIS_pixel_texture = GL_FALSE;\r\nGLboolean __GLEW_SGIS_point_line_texgen = GL_FALSE;\r\nGLboolean __GLEW_SGIS_sharpen_texture = GL_FALSE;\r\nGLboolean __GLEW_SGIS_texture4D = GL_FALSE;\r\nGLboolean __GLEW_SGIS_texture_border_clamp = GL_FALSE;\r\nGLboolean __GLEW_SGIS_texture_edge_clamp = GL_FALSE;\r\nGLboolean __GLEW_SGIS_texture_filter4 = GL_FALSE;\r\nGLboolean __GLEW_SGIS_texture_lod = GL_FALSE;\r\nGLboolean __GLEW_SGIS_texture_select = GL_FALSE;\r\nGLboolean __GLEW_SGIX_async = GL_FALSE;\r\nGLboolean __GLEW_SGIX_async_histogram = GL_FALSE;\r\nGLboolean __GLEW_SGIX_async_pixel = GL_FALSE;\r\nGLboolean __GLEW_SGIX_blend_alpha_minmax = GL_FALSE;\r\nGLboolean __GLEW_SGIX_clipmap = GL_FALSE;\r\nGLboolean __GLEW_SGIX_convolution_accuracy = GL_FALSE;\r\nGLboolean __GLEW_SGIX_depth_texture = GL_FALSE;\r\nGLboolean __GLEW_SGIX_flush_raster = GL_FALSE;\r\nGLboolean __GLEW_SGIX_fog_offset = GL_FALSE;\r\nGLboolean __GLEW_SGIX_fog_texture = GL_FALSE;\r\nGLboolean __GLEW_SGIX_fragment_specular_lighting = GL_FALSE;\r\nGLboolean __GLEW_SGIX_framezoom = GL_FALSE;\r\nGLboolean __GLEW_SGIX_interlace = GL_FALSE;\r\nGLboolean __GLEW_SGIX_ir_instrument1 = GL_FALSE;\r\nGLboolean __GLEW_SGIX_list_priority = GL_FALSE;\r\nGLboolean __GLEW_SGIX_pixel_texture = GL_FALSE;\r\nGLboolean __GLEW_SGIX_pixel_texture_bits = GL_FALSE;\r\nGLboolean __GLEW_SGIX_reference_plane = GL_FALSE;\r\nGLboolean __GLEW_SGIX_resample = GL_FALSE;\r\nGLboolean __GLEW_SGIX_shadow = GL_FALSE;\r\nGLboolean __GLEW_SGIX_shadow_ambient = GL_FALSE;\r\nGLboolean __GLEW_SGIX_sprite = GL_FALSE;\r\nGLboolean __GLEW_SGIX_tag_sample_buffer = GL_FALSE;\r\nGLboolean __GLEW_SGIX_texture_add_env = GL_FALSE;\r\nGLboolean __GLEW_SGIX_texture_coordinate_clamp = GL_FALSE;\r\nGLboolean __GLEW_SGIX_texture_lod_bias = GL_FALSE;\r\nGLboolean __GLEW_SGIX_texture_multi_buffer = GL_FALSE;\r\nGLboolean __GLEW_SGIX_texture_range = GL_FALSE;\r\nGLboolean __GLEW_SGIX_texture_scale_bias = GL_FALSE;\r\nGLboolean __GLEW_SGIX_vertex_preclip = GL_FALSE;\r\nGLboolean __GLEW_SGIX_vertex_preclip_hint = GL_FALSE;\r\nGLboolean __GLEW_SGIX_ycrcb = GL_FALSE;\r\nGLboolean __GLEW_SGI_color_matrix = GL_FALSE;\r\nGLboolean __GLEW_SGI_color_table = GL_FALSE;\r\nGLboolean __GLEW_SGI_texture_color_table = GL_FALSE;\r\nGLboolean __GLEW_SUNX_constant_data = GL_FALSE;\r\nGLboolean __GLEW_SUN_convolution_border_modes = GL_FALSE;\r\nGLboolean __GLEW_SUN_global_alpha = GL_FALSE;\r\nGLboolean __GLEW_SUN_mesh_array = GL_FALSE;\r\nGLboolean __GLEW_SUN_read_video_pixels = GL_FALSE;\r\nGLboolean __GLEW_SUN_slice_accum = GL_FALSE;\r\nGLboolean __GLEW_SUN_triangle_list = GL_FALSE;\r\nGLboolean __GLEW_SUN_vertex = GL_FALSE;\r\nGLboolean __GLEW_WIN_phong_shading = GL_FALSE;\r\nGLboolean __GLEW_WIN_specular_fog = GL_FALSE;\r\nGLboolean __GLEW_WIN_swap_hint = GL_FALSE;\r\n\r\n#endif /* !GLEW_MX */\r\n\r\n#ifdef GL_VERSION_1_2\r\n\r\nstatic GLboolean _glewInit_GL_VERSION_1_2 (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)\"glCopyTexSubImage3D\")) == NULL) || r;\r\n  r = ((glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC)glewGetProcAddress((const GLubyte*)\"glDrawRangeElements\")) == NULL) || r;\r\n  r = ((glTexImage3D = (PFNGLTEXIMAGE3DPROC)glewGetProcAddress((const GLubyte*)\"glTexImage3D\")) == NULL) || r;\r\n  r = ((glTexSubImage3D = (PFNGLTEXSUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)\"glTexSubImage3D\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_VERSION_1_2 */\r\n\r\n#ifdef GL_VERSION_1_3\r\n\r\nstatic GLboolean _glewInit_GL_VERSION_1_3 (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glActiveTexture = (PFNGLACTIVETEXTUREPROC)glewGetProcAddress((const GLubyte*)\"glActiveTexture\")) == NULL) || r;\r\n  r = ((glClientActiveTexture = (PFNGLCLIENTACTIVETEXTUREPROC)glewGetProcAddress((const GLubyte*)\"glClientActiveTexture\")) == NULL) || r;\r\n  r = ((glCompressedTexImage1D = (PFNGLCOMPRESSEDTEXIMAGE1DPROC)glewGetProcAddress((const GLubyte*)\"glCompressedTexImage1D\")) == NULL) || r;\r\n  r = ((glCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC)glewGetProcAddress((const GLubyte*)\"glCompressedTexImage2D\")) == NULL) || r;\r\n  r = ((glCompressedTexImage3D = (PFNGLCOMPRESSEDTEXIMAGE3DPROC)glewGetProcAddress((const GLubyte*)\"glCompressedTexImage3D\")) == NULL) || r;\r\n  r = ((glCompressedTexSubImage1D = (PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC)glewGetProcAddress((const GLubyte*)\"glCompressedTexSubImage1D\")) == NULL) || r;\r\n  r = ((glCompressedTexSubImage2D = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)glewGetProcAddress((const GLubyte*)\"glCompressedTexSubImage2D\")) == NULL) || r;\r\n  r = ((glCompressedTexSubImage3D = (PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)\"glCompressedTexSubImage3D\")) == NULL) || r;\r\n  r = ((glGetCompressedTexImage = (PFNGLGETCOMPRESSEDTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)\"glGetCompressedTexImage\")) == NULL) || r;\r\n  r = ((glLoadTransposeMatrixd = (PFNGLLOADTRANSPOSEMATRIXDPROC)glewGetProcAddress((const GLubyte*)\"glLoadTransposeMatrixd\")) == NULL) || r;\r\n  r = ((glLoadTransposeMatrixf = (PFNGLLOADTRANSPOSEMATRIXFPROC)glewGetProcAddress((const GLubyte*)\"glLoadTransposeMatrixf\")) == NULL) || r;\r\n  r = ((glMultTransposeMatrixd = (PFNGLMULTTRANSPOSEMATRIXDPROC)glewGetProcAddress((const GLubyte*)\"glMultTransposeMatrixd\")) == NULL) || r;\r\n  r = ((glMultTransposeMatrixf = (PFNGLMULTTRANSPOSEMATRIXFPROC)glewGetProcAddress((const GLubyte*)\"glMultTransposeMatrixf\")) == NULL) || r;\r\n  r = ((glMultiTexCoord1d = (PFNGLMULTITEXCOORD1DPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord1d\")) == NULL) || r;\r\n  r = ((glMultiTexCoord1dv = (PFNGLMULTITEXCOORD1DVPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord1dv\")) == NULL) || r;\r\n  r = ((glMultiTexCoord1f = (PFNGLMULTITEXCOORD1FPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord1f\")) == NULL) || r;\r\n  r = ((glMultiTexCoord1fv = (PFNGLMULTITEXCOORD1FVPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord1fv\")) == NULL) || r;\r\n  r = ((glMultiTexCoord1i = (PFNGLMULTITEXCOORD1IPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord1i\")) == NULL) || r;\r\n  r = ((glMultiTexCoord1iv = (PFNGLMULTITEXCOORD1IVPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord1iv\")) == NULL) || r;\r\n  r = ((glMultiTexCoord1s = (PFNGLMULTITEXCOORD1SPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord1s\")) == NULL) || r;\r\n  r = ((glMultiTexCoord1sv = (PFNGLMULTITEXCOORD1SVPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord1sv\")) == NULL) || r;\r\n  r = ((glMultiTexCoord2d = (PFNGLMULTITEXCOORD2DPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord2d\")) == NULL) || r;\r\n  r = ((glMultiTexCoord2dv = (PFNGLMULTITEXCOORD2DVPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord2dv\")) == NULL) || r;\r\n  r = ((glMultiTexCoord2f = (PFNGLMULTITEXCOORD2FPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord2f\")) == NULL) || r;\r\n  r = ((glMultiTexCoord2fv = (PFNGLMULTITEXCOORD2FVPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord2fv\")) == NULL) || r;\r\n  r = ((glMultiTexCoord2i = (PFNGLMULTITEXCOORD2IPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord2i\")) == NULL) || r;\r\n  r = ((glMultiTexCoord2iv = (PFNGLMULTITEXCOORD2IVPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord2iv\")) == NULL) || r;\r\n  r = ((glMultiTexCoord2s = (PFNGLMULTITEXCOORD2SPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord2s\")) == NULL) || r;\r\n  r = ((glMultiTexCoord2sv = (PFNGLMULTITEXCOORD2SVPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord2sv\")) == NULL) || r;\r\n  r = ((glMultiTexCoord3d = (PFNGLMULTITEXCOORD3DPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord3d\")) == NULL) || r;\r\n  r = ((glMultiTexCoord3dv = (PFNGLMULTITEXCOORD3DVPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord3dv\")) == NULL) || r;\r\n  r = ((glMultiTexCoord3f = (PFNGLMULTITEXCOORD3FPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord3f\")) == NULL) || r;\r\n  r = ((glMultiTexCoord3fv = (PFNGLMULTITEXCOORD3FVPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord3fv\")) == NULL) || r;\r\n  r = ((glMultiTexCoord3i = (PFNGLMULTITEXCOORD3IPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord3i\")) == NULL) || r;\r\n  r = ((glMultiTexCoord3iv = (PFNGLMULTITEXCOORD3IVPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord3iv\")) == NULL) || r;\r\n  r = ((glMultiTexCoord3s = (PFNGLMULTITEXCOORD3SPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord3s\")) == NULL) || r;\r\n  r = ((glMultiTexCoord3sv = (PFNGLMULTITEXCOORD3SVPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord3sv\")) == NULL) || r;\r\n  r = ((glMultiTexCoord4d = (PFNGLMULTITEXCOORD4DPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord4d\")) == NULL) || r;\r\n  r = ((glMultiTexCoord4dv = (PFNGLMULTITEXCOORD4DVPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord4dv\")) == NULL) || r;\r\n  r = ((glMultiTexCoord4f = (PFNGLMULTITEXCOORD4FPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord4f\")) == NULL) || r;\r\n  r = ((glMultiTexCoord4fv = (PFNGLMULTITEXCOORD4FVPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord4fv\")) == NULL) || r;\r\n  r = ((glMultiTexCoord4i = (PFNGLMULTITEXCOORD4IPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord4i\")) == NULL) || r;\r\n  r = ((glMultiTexCoord4iv = (PFNGLMULTITEXCOORD4IVPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord4iv\")) == NULL) || r;\r\n  r = ((glMultiTexCoord4s = (PFNGLMULTITEXCOORD4SPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord4s\")) == NULL) || r;\r\n  r = ((glMultiTexCoord4sv = (PFNGLMULTITEXCOORD4SVPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord4sv\")) == NULL) || r;\r\n  r = ((glSampleCoverage = (PFNGLSAMPLECOVERAGEPROC)glewGetProcAddress((const GLubyte*)\"glSampleCoverage\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_VERSION_1_3 */\r\n\r\n#ifdef GL_VERSION_1_4\r\n\r\nstatic GLboolean _glewInit_GL_VERSION_1_4 (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glBlendColor = (PFNGLBLENDCOLORPROC)glewGetProcAddress((const GLubyte*)\"glBlendColor\")) == NULL) || r;\r\n  r = ((glBlendEquation = (PFNGLBLENDEQUATIONPROC)glewGetProcAddress((const GLubyte*)\"glBlendEquation\")) == NULL) || r;\r\n  r = ((glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC)glewGetProcAddress((const GLubyte*)\"glBlendFuncSeparate\")) == NULL) || r;\r\n  r = ((glFogCoordPointer = (PFNGLFOGCOORDPOINTERPROC)glewGetProcAddress((const GLubyte*)\"glFogCoordPointer\")) == NULL) || r;\r\n  r = ((glFogCoordd = (PFNGLFOGCOORDDPROC)glewGetProcAddress((const GLubyte*)\"glFogCoordd\")) == NULL) || r;\r\n  r = ((glFogCoorddv = (PFNGLFOGCOORDDVPROC)glewGetProcAddress((const GLubyte*)\"glFogCoorddv\")) == NULL) || r;\r\n  r = ((glFogCoordf = (PFNGLFOGCOORDFPROC)glewGetProcAddress((const GLubyte*)\"glFogCoordf\")) == NULL) || r;\r\n  r = ((glFogCoordfv = (PFNGLFOGCOORDFVPROC)glewGetProcAddress((const GLubyte*)\"glFogCoordfv\")) == NULL) || r;\r\n  r = ((glMultiDrawArrays = (PFNGLMULTIDRAWARRAYSPROC)glewGetProcAddress((const GLubyte*)\"glMultiDrawArrays\")) == NULL) || r;\r\n  r = ((glMultiDrawElements = (PFNGLMULTIDRAWELEMENTSPROC)glewGetProcAddress((const GLubyte*)\"glMultiDrawElements\")) == NULL) || r;\r\n  r = ((glPointParameterf = (PFNGLPOINTPARAMETERFPROC)glewGetProcAddress((const GLubyte*)\"glPointParameterf\")) == NULL) || r;\r\n  r = ((glPointParameterfv = (PFNGLPOINTPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)\"glPointParameterfv\")) == NULL) || r;\r\n  r = ((glPointParameteri = (PFNGLPOINTPARAMETERIPROC)glewGetProcAddress((const GLubyte*)\"glPointParameteri\")) == NULL) || r;\r\n  r = ((glPointParameteriv = (PFNGLPOINTPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)\"glPointParameteriv\")) == NULL) || r;\r\n  r = ((glSecondaryColor3b = (PFNGLSECONDARYCOLOR3BPROC)glewGetProcAddress((const GLubyte*)\"glSecondaryColor3b\")) == NULL) || r;\r\n  r = ((glSecondaryColor3bv = (PFNGLSECONDARYCOLOR3BVPROC)glewGetProcAddress((const GLubyte*)\"glSecondaryColor3bv\")) == NULL) || r;\r\n  r = ((glSecondaryColor3d = (PFNGLSECONDARYCOLOR3DPROC)glewGetProcAddress((const GLubyte*)\"glSecondaryColor3d\")) == NULL) || r;\r\n  r = ((glSecondaryColor3dv = (PFNGLSECONDARYCOLOR3DVPROC)glewGetProcAddress((const GLubyte*)\"glSecondaryColor3dv\")) == NULL) || r;\r\n  r = ((glSecondaryColor3f = (PFNGLSECONDARYCOLOR3FPROC)glewGetProcAddress((const GLubyte*)\"glSecondaryColor3f\")) == NULL) || r;\r\n  r = ((glSecondaryColor3fv = (PFNGLSECONDARYCOLOR3FVPROC)glewGetProcAddress((const GLubyte*)\"glSecondaryColor3fv\")) == NULL) || r;\r\n  r = ((glSecondaryColor3i = (PFNGLSECONDARYCOLOR3IPROC)glewGetProcAddress((const GLubyte*)\"glSecondaryColor3i\")) == NULL) || r;\r\n  r = ((glSecondaryColor3iv = (PFNGLSECONDARYCOLOR3IVPROC)glewGetProcAddress((const GLubyte*)\"glSecondaryColor3iv\")) == NULL) || r;\r\n  r = ((glSecondaryColor3s = (PFNGLSECONDARYCOLOR3SPROC)glewGetProcAddress((const GLubyte*)\"glSecondaryColor3s\")) == NULL) || r;\r\n  r = ((glSecondaryColor3sv = (PFNGLSECONDARYCOLOR3SVPROC)glewGetProcAddress((const GLubyte*)\"glSecondaryColor3sv\")) == NULL) || r;\r\n  r = ((glSecondaryColor3ub = (PFNGLSECONDARYCOLOR3UBPROC)glewGetProcAddress((const GLubyte*)\"glSecondaryColor3ub\")) == NULL) || r;\r\n  r = ((glSecondaryColor3ubv = (PFNGLSECONDARYCOLOR3UBVPROC)glewGetProcAddress((const GLubyte*)\"glSecondaryColor3ubv\")) == NULL) || r;\r\n  r = ((glSecondaryColor3ui = (PFNGLSECONDARYCOLOR3UIPROC)glewGetProcAddress((const GLubyte*)\"glSecondaryColor3ui\")) == NULL) || r;\r\n  r = ((glSecondaryColor3uiv = (PFNGLSECONDARYCOLOR3UIVPROC)glewGetProcAddress((const GLubyte*)\"glSecondaryColor3uiv\")) == NULL) || r;\r\n  r = ((glSecondaryColor3us = (PFNGLSECONDARYCOLOR3USPROC)glewGetProcAddress((const GLubyte*)\"glSecondaryColor3us\")) == NULL) || r;\r\n  r = ((glSecondaryColor3usv = (PFNGLSECONDARYCOLOR3USVPROC)glewGetProcAddress((const GLubyte*)\"glSecondaryColor3usv\")) == NULL) || r;\r\n  r = ((glSecondaryColorPointer = (PFNGLSECONDARYCOLORPOINTERPROC)glewGetProcAddress((const GLubyte*)\"glSecondaryColorPointer\")) == NULL) || r;\r\n  r = ((glWindowPos2d = (PFNGLWINDOWPOS2DPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos2d\")) == NULL) || r;\r\n  r = ((glWindowPos2dv = (PFNGLWINDOWPOS2DVPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos2dv\")) == NULL) || r;\r\n  r = ((glWindowPos2f = (PFNGLWINDOWPOS2FPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos2f\")) == NULL) || r;\r\n  r = ((glWindowPos2fv = (PFNGLWINDOWPOS2FVPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos2fv\")) == NULL) || r;\r\n  r = ((glWindowPos2i = (PFNGLWINDOWPOS2IPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos2i\")) == NULL) || r;\r\n  r = ((glWindowPos2iv = (PFNGLWINDOWPOS2IVPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos2iv\")) == NULL) || r;\r\n  r = ((glWindowPos2s = (PFNGLWINDOWPOS2SPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos2s\")) == NULL) || r;\r\n  r = ((glWindowPos2sv = (PFNGLWINDOWPOS2SVPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos2sv\")) == NULL) || r;\r\n  r = ((glWindowPos3d = (PFNGLWINDOWPOS3DPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos3d\")) == NULL) || r;\r\n  r = ((glWindowPos3dv = (PFNGLWINDOWPOS3DVPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos3dv\")) == NULL) || r;\r\n  r = ((glWindowPos3f = (PFNGLWINDOWPOS3FPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos3f\")) == NULL) || r;\r\n  r = ((glWindowPos3fv = (PFNGLWINDOWPOS3FVPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos3fv\")) == NULL) || r;\r\n  r = ((glWindowPos3i = (PFNGLWINDOWPOS3IPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos3i\")) == NULL) || r;\r\n  r = ((glWindowPos3iv = (PFNGLWINDOWPOS3IVPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos3iv\")) == NULL) || r;\r\n  r = ((glWindowPos3s = (PFNGLWINDOWPOS3SPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos3s\")) == NULL) || r;\r\n  r = ((glWindowPos3sv = (PFNGLWINDOWPOS3SVPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos3sv\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_VERSION_1_4 */\r\n\r\n#ifdef GL_VERSION_1_5\r\n\r\nstatic GLboolean _glewInit_GL_VERSION_1_5 (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glBeginQuery = (PFNGLBEGINQUERYPROC)glewGetProcAddress((const GLubyte*)\"glBeginQuery\")) == NULL) || r;\r\n  r = ((glBindBuffer = (PFNGLBINDBUFFERPROC)glewGetProcAddress((const GLubyte*)\"glBindBuffer\")) == NULL) || r;\r\n  r = ((glBufferData = (PFNGLBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)\"glBufferData\")) == NULL) || r;\r\n  r = ((glBufferSubData = (PFNGLBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)\"glBufferSubData\")) == NULL) || r;\r\n  r = ((glDeleteBuffers = (PFNGLDELETEBUFFERSPROC)glewGetProcAddress((const GLubyte*)\"glDeleteBuffers\")) == NULL) || r;\r\n  r = ((glDeleteQueries = (PFNGLDELETEQUERIESPROC)glewGetProcAddress((const GLubyte*)\"glDeleteQueries\")) == NULL) || r;\r\n  r = ((glEndQuery = (PFNGLENDQUERYPROC)glewGetProcAddress((const GLubyte*)\"glEndQuery\")) == NULL) || r;\r\n  r = ((glGenBuffers = (PFNGLGENBUFFERSPROC)glewGetProcAddress((const GLubyte*)\"glGenBuffers\")) == NULL) || r;\r\n  r = ((glGenQueries = (PFNGLGENQUERIESPROC)glewGetProcAddress((const GLubyte*)\"glGenQueries\")) == NULL) || r;\r\n  r = ((glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)\"glGetBufferParameteriv\")) == NULL) || r;\r\n  r = ((glGetBufferPointerv = (PFNGLGETBUFFERPOINTERVPROC)glewGetProcAddress((const GLubyte*)\"glGetBufferPointerv\")) == NULL) || r;\r\n  r = ((glGetBufferSubData = (PFNGLGETBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)\"glGetBufferSubData\")) == NULL) || r;\r\n  r = ((glGetQueryObjectiv = (PFNGLGETQUERYOBJECTIVPROC)glewGetProcAddress((const GLubyte*)\"glGetQueryObjectiv\")) == NULL) || r;\r\n  r = ((glGetQueryObjectuiv = (PFNGLGETQUERYOBJECTUIVPROC)glewGetProcAddress((const GLubyte*)\"glGetQueryObjectuiv\")) == NULL) || r;\r\n  r = ((glGetQueryiv = (PFNGLGETQUERYIVPROC)glewGetProcAddress((const GLubyte*)\"glGetQueryiv\")) == NULL) || r;\r\n  r = ((glIsBuffer = (PFNGLISBUFFERPROC)glewGetProcAddress((const GLubyte*)\"glIsBuffer\")) == NULL) || r;\r\n  r = ((glIsQuery = (PFNGLISQUERYPROC)glewGetProcAddress((const GLubyte*)\"glIsQuery\")) == NULL) || r;\r\n  r = ((glMapBuffer = (PFNGLMAPBUFFERPROC)glewGetProcAddress((const GLubyte*)\"glMapBuffer\")) == NULL) || r;\r\n  r = ((glUnmapBuffer = (PFNGLUNMAPBUFFERPROC)glewGetProcAddress((const GLubyte*)\"glUnmapBuffer\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_VERSION_1_5 */\r\n\r\n#ifdef GL_VERSION_2_0\r\n\r\nstatic GLboolean _glewInit_GL_VERSION_2_0 (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glAttachShader = (PFNGLATTACHSHADERPROC)glewGetProcAddress((const GLubyte*)\"glAttachShader\")) == NULL) || r;\r\n  r = ((glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC)glewGetProcAddress((const GLubyte*)\"glBindAttribLocation\")) == NULL) || r;\r\n  r = ((glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC)glewGetProcAddress((const GLubyte*)\"glBlendEquationSeparate\")) == NULL) || r;\r\n  r = ((glCompileShader = (PFNGLCOMPILESHADERPROC)glewGetProcAddress((const GLubyte*)\"glCompileShader\")) == NULL) || r;\r\n  r = ((glCreateProgram = (PFNGLCREATEPROGRAMPROC)glewGetProcAddress((const GLubyte*)\"glCreateProgram\")) == NULL) || r;\r\n  r = ((glCreateShader = (PFNGLCREATESHADERPROC)glewGetProcAddress((const GLubyte*)\"glCreateShader\")) == NULL) || r;\r\n  r = ((glDeleteProgram = (PFNGLDELETEPROGRAMPROC)glewGetProcAddress((const GLubyte*)\"glDeleteProgram\")) == NULL) || r;\r\n  r = ((glDeleteShader = (PFNGLDELETESHADERPROC)glewGetProcAddress((const GLubyte*)\"glDeleteShader\")) == NULL) || r;\r\n  r = ((glDetachShader = (PFNGLDETACHSHADERPROC)glewGetProcAddress((const GLubyte*)\"glDetachShader\")) == NULL) || r;\r\n  r = ((glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC)glewGetProcAddress((const GLubyte*)\"glDisableVertexAttribArray\")) == NULL) || r;\r\n  r = ((glDrawBuffers = (PFNGLDRAWBUFFERSPROC)glewGetProcAddress((const GLubyte*)\"glDrawBuffers\")) == NULL) || r;\r\n  r = ((glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)glewGetProcAddress((const GLubyte*)\"glEnableVertexAttribArray\")) == NULL) || r;\r\n  r = ((glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC)glewGetProcAddress((const GLubyte*)\"glGetActiveAttrib\")) == NULL) || r;\r\n  r = ((glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC)glewGetProcAddress((const GLubyte*)\"glGetActiveUniform\")) == NULL) || r;\r\n  r = ((glGetAttachedShaders = (PFNGLGETATTACHEDSHADERSPROC)glewGetProcAddress((const GLubyte*)\"glGetAttachedShaders\")) == NULL) || r;\r\n  r = ((glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)glewGetProcAddress((const GLubyte*)\"glGetAttribLocation\")) == NULL) || r;\r\n  r = ((glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC)glewGetProcAddress((const GLubyte*)\"glGetProgramInfoLog\")) == NULL) || r;\r\n  r = ((glGetProgramiv = (PFNGLGETPROGRAMIVPROC)glewGetProcAddress((const GLubyte*)\"glGetProgramiv\")) == NULL) || r;\r\n  r = ((glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)glewGetProcAddress((const GLubyte*)\"glGetShaderInfoLog\")) == NULL) || r;\r\n  r = ((glGetShaderSource = (PFNGLGETSHADERSOURCEPROC)glewGetProcAddress((const GLubyte*)\"glGetShaderSource\")) == NULL) || r;\r\n  r = ((glGetShaderiv = (PFNGLGETSHADERIVPROC)glewGetProcAddress((const GLubyte*)\"glGetShaderiv\")) == NULL) || r;\r\n  r = ((glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)glewGetProcAddress((const GLubyte*)\"glGetUniformLocation\")) == NULL) || r;\r\n  r = ((glGetUniformfv = (PFNGLGETUNIFORMFVPROC)glewGetProcAddress((const GLubyte*)\"glGetUniformfv\")) == NULL) || r;\r\n  r = ((glGetUniformiv = (PFNGLGETUNIFORMIVPROC)glewGetProcAddress((const GLubyte*)\"glGetUniformiv\")) == NULL) || r;\r\n  r = ((glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC)glewGetProcAddress((const GLubyte*)\"glGetVertexAttribPointerv\")) == NULL) || r;\r\n  r = ((glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC)glewGetProcAddress((const GLubyte*)\"glGetVertexAttribdv\")) == NULL) || r;\r\n  r = ((glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC)glewGetProcAddress((const GLubyte*)\"glGetVertexAttribfv\")) == NULL) || r;\r\n  r = ((glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC)glewGetProcAddress((const GLubyte*)\"glGetVertexAttribiv\")) == NULL) || r;\r\n  r = ((glIsProgram = (PFNGLISPROGRAMPROC)glewGetProcAddress((const GLubyte*)\"glIsProgram\")) == NULL) || r;\r\n  r = ((glIsShader = (PFNGLISSHADERPROC)glewGetProcAddress((const GLubyte*)\"glIsShader\")) == NULL) || r;\r\n  r = ((glLinkProgram = (PFNGLLINKPROGRAMPROC)glewGetProcAddress((const GLubyte*)\"glLinkProgram\")) == NULL) || r;\r\n  r = ((glShaderSource = (PFNGLSHADERSOURCEPROC)glewGetProcAddress((const GLubyte*)\"glShaderSource\")) == NULL) || r;\r\n  r = ((glStencilFuncSeparate = (PFNGLSTENCILFUNCSEPARATEPROC)glewGetProcAddress((const GLubyte*)\"glStencilFuncSeparate\")) == NULL) || r;\r\n  r = ((glStencilMaskSeparate = (PFNGLSTENCILMASKSEPARATEPROC)glewGetProcAddress((const GLubyte*)\"glStencilMaskSeparate\")) == NULL) || r;\r\n  r = ((glStencilOpSeparate = (PFNGLSTENCILOPSEPARATEPROC)glewGetProcAddress((const GLubyte*)\"glStencilOpSeparate\")) == NULL) || r;\r\n  r = ((glUniform1f = (PFNGLUNIFORM1FPROC)glewGetProcAddress((const GLubyte*)\"glUniform1f\")) == NULL) || r;\r\n  r = ((glUniform1fv = (PFNGLUNIFORM1FVPROC)glewGetProcAddress((const GLubyte*)\"glUniform1fv\")) == NULL) || r;\r\n  r = ((glUniform1i = (PFNGLUNIFORM1IPROC)glewGetProcAddress((const GLubyte*)\"glUniform1i\")) == NULL) || r;\r\n  r = ((glUniform1iv = (PFNGLUNIFORM1IVPROC)glewGetProcAddress((const GLubyte*)\"glUniform1iv\")) == NULL) || r;\r\n  r = ((glUniform2f = (PFNGLUNIFORM2FPROC)glewGetProcAddress((const GLubyte*)\"glUniform2f\")) == NULL) || r;\r\n  r = ((glUniform2fv = (PFNGLUNIFORM2FVPROC)glewGetProcAddress((const GLubyte*)\"glUniform2fv\")) == NULL) || r;\r\n  r = ((glUniform2i = (PFNGLUNIFORM2IPROC)glewGetProcAddress((const GLubyte*)\"glUniform2i\")) == NULL) || r;\r\n  r = ((glUniform2iv = (PFNGLUNIFORM2IVPROC)glewGetProcAddress((const GLubyte*)\"glUniform2iv\")) == NULL) || r;\r\n  r = ((glUniform3f = (PFNGLUNIFORM3FPROC)glewGetProcAddress((const GLubyte*)\"glUniform3f\")) == NULL) || r;\r\n  r = ((glUniform3fv = (PFNGLUNIFORM3FVPROC)glewGetProcAddress((const GLubyte*)\"glUniform3fv\")) == NULL) || r;\r\n  r = ((glUniform3i = (PFNGLUNIFORM3IPROC)glewGetProcAddress((const GLubyte*)\"glUniform3i\")) == NULL) || r;\r\n  r = ((glUniform3iv = (PFNGLUNIFORM3IVPROC)glewGetProcAddress((const GLubyte*)\"glUniform3iv\")) == NULL) || r;\r\n  r = ((glUniform4f = (PFNGLUNIFORM4FPROC)glewGetProcAddress((const GLubyte*)\"glUniform4f\")) == NULL) || r;\r\n  r = ((glUniform4fv = (PFNGLUNIFORM4FVPROC)glewGetProcAddress((const GLubyte*)\"glUniform4fv\")) == NULL) || r;\r\n  r = ((glUniform4i = (PFNGLUNIFORM4IPROC)glewGetProcAddress((const GLubyte*)\"glUniform4i\")) == NULL) || r;\r\n  r = ((glUniform4iv = (PFNGLUNIFORM4IVPROC)glewGetProcAddress((const GLubyte*)\"glUniform4iv\")) == NULL) || r;\r\n  r = ((glUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC)glewGetProcAddress((const GLubyte*)\"glUniformMatrix2fv\")) == NULL) || r;\r\n  r = ((glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC)glewGetProcAddress((const GLubyte*)\"glUniformMatrix3fv\")) == NULL) || r;\r\n  r = ((glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC)glewGetProcAddress((const GLubyte*)\"glUniformMatrix4fv\")) == NULL) || r;\r\n  r = ((glUseProgram = (PFNGLUSEPROGRAMPROC)glewGetProcAddress((const GLubyte*)\"glUseProgram\")) == NULL) || r;\r\n  r = ((glValidateProgram = (PFNGLVALIDATEPROGRAMPROC)glewGetProcAddress((const GLubyte*)\"glValidateProgram\")) == NULL) || r;\r\n  r = ((glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib1d\")) == NULL) || r;\r\n  r = ((glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib1dv\")) == NULL) || r;\r\n  r = ((glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib1f\")) == NULL) || r;\r\n  r = ((glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib1fv\")) == NULL) || r;\r\n  r = ((glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib1s\")) == NULL) || r;\r\n  r = ((glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib1sv\")) == NULL) || r;\r\n  r = ((glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib2d\")) == NULL) || r;\r\n  r = ((glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib2dv\")) == NULL) || r;\r\n  r = ((glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib2f\")) == NULL) || r;\r\n  r = ((glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib2fv\")) == NULL) || r;\r\n  r = ((glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib2s\")) == NULL) || r;\r\n  r = ((glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib2sv\")) == NULL) || r;\r\n  r = ((glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib3d\")) == NULL) || r;\r\n  r = ((glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib3dv\")) == NULL) || r;\r\n  r = ((glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib3f\")) == NULL) || r;\r\n  r = ((glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib3fv\")) == NULL) || r;\r\n  r = ((glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib3s\")) == NULL) || r;\r\n  r = ((glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib3sv\")) == NULL) || r;\r\n  r = ((glVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4Nbv\")) == NULL) || r;\r\n  r = ((glVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4Niv\")) == NULL) || r;\r\n  r = ((glVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4Nsv\")) == NULL) || r;\r\n  r = ((glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4Nub\")) == NULL) || r;\r\n  r = ((glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4Nubv\")) == NULL) || r;\r\n  r = ((glVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4Nuiv\")) == NULL) || r;\r\n  r = ((glVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4Nusv\")) == NULL) || r;\r\n  r = ((glVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4bv\")) == NULL) || r;\r\n  r = ((glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4d\")) == NULL) || r;\r\n  r = ((glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4dv\")) == NULL) || r;\r\n  r = ((glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4f\")) == NULL) || r;\r\n  r = ((glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4fv\")) == NULL) || r;\r\n  r = ((glVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4iv\")) == NULL) || r;\r\n  r = ((glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4s\")) == NULL) || r;\r\n  r = ((glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4sv\")) == NULL) || r;\r\n  r = ((glVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4ubv\")) == NULL) || r;\r\n  r = ((glVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4uiv\")) == NULL) || r;\r\n  r = ((glVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4usv\")) == NULL) || r;\r\n  r = ((glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribPointer\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_VERSION_2_0 */\r\n\r\n#ifdef GL_VERSION_2_1\r\n\r\nstatic GLboolean _glewInit_GL_VERSION_2_1 (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glUniformMatrix2x3fv = (PFNGLUNIFORMMATRIX2X3FVPROC)glewGetProcAddress((const GLubyte*)\"glUniformMatrix2x3fv\")) == NULL) || r;\r\n  r = ((glUniformMatrix2x4fv = (PFNGLUNIFORMMATRIX2X4FVPROC)glewGetProcAddress((const GLubyte*)\"glUniformMatrix2x4fv\")) == NULL) || r;\r\n  r = ((glUniformMatrix3x2fv = (PFNGLUNIFORMMATRIX3X2FVPROC)glewGetProcAddress((const GLubyte*)\"glUniformMatrix3x2fv\")) == NULL) || r;\r\n  r = ((glUniformMatrix3x4fv = (PFNGLUNIFORMMATRIX3X4FVPROC)glewGetProcAddress((const GLubyte*)\"glUniformMatrix3x4fv\")) == NULL) || r;\r\n  r = ((glUniformMatrix4x2fv = (PFNGLUNIFORMMATRIX4X2FVPROC)glewGetProcAddress((const GLubyte*)\"glUniformMatrix4x2fv\")) == NULL) || r;\r\n  r = ((glUniformMatrix4x3fv = (PFNGLUNIFORMMATRIX4X3FVPROC)glewGetProcAddress((const GLubyte*)\"glUniformMatrix4x3fv\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_VERSION_2_1 */\r\n\r\n#ifdef GL_VERSION_3_0\r\n\r\nstatic GLboolean _glewInit_GL_VERSION_3_0 (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glBeginConditionalRender = (PFNGLBEGINCONDITIONALRENDERPROC)glewGetProcAddress((const GLubyte*)\"glBeginConditionalRender\")) == NULL) || r;\r\n  r = ((glBeginTransformFeedback = (PFNGLBEGINTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)\"glBeginTransformFeedback\")) == NULL) || r;\r\n  r = ((glBindFragDataLocation = (PFNGLBINDFRAGDATALOCATIONPROC)glewGetProcAddress((const GLubyte*)\"glBindFragDataLocation\")) == NULL) || r;\r\n  r = ((glClampColor = (PFNGLCLAMPCOLORPROC)glewGetProcAddress((const GLubyte*)\"glClampColor\")) == NULL) || r;\r\n  r = ((glClearBufferfi = (PFNGLCLEARBUFFERFIPROC)glewGetProcAddress((const GLubyte*)\"glClearBufferfi\")) == NULL) || r;\r\n  r = ((glClearBufferfv = (PFNGLCLEARBUFFERFVPROC)glewGetProcAddress((const GLubyte*)\"glClearBufferfv\")) == NULL) || r;\r\n  r = ((glClearBufferiv = (PFNGLCLEARBUFFERIVPROC)glewGetProcAddress((const GLubyte*)\"glClearBufferiv\")) == NULL) || r;\r\n  r = ((glClearBufferuiv = (PFNGLCLEARBUFFERUIVPROC)glewGetProcAddress((const GLubyte*)\"glClearBufferuiv\")) == NULL) || r;\r\n  r = ((glColorMaski = (PFNGLCOLORMASKIPROC)glewGetProcAddress((const GLubyte*)\"glColorMaski\")) == NULL) || r;\r\n  r = ((glDisablei = (PFNGLDISABLEIPROC)glewGetProcAddress((const GLubyte*)\"glDisablei\")) == NULL) || r;\r\n  r = ((glEnablei = (PFNGLENABLEIPROC)glewGetProcAddress((const GLubyte*)\"glEnablei\")) == NULL) || r;\r\n  r = ((glEndConditionalRender = (PFNGLENDCONDITIONALRENDERPROC)glewGetProcAddress((const GLubyte*)\"glEndConditionalRender\")) == NULL) || r;\r\n  r = ((glEndTransformFeedback = (PFNGLENDTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)\"glEndTransformFeedback\")) == NULL) || r;\r\n  r = ((glGetBooleani_v = (PFNGLGETBOOLEANI_VPROC)glewGetProcAddress((const GLubyte*)\"glGetBooleani_v\")) == NULL) || r;\r\n  r = ((glGetFragDataLocation = (PFNGLGETFRAGDATALOCATIONPROC)glewGetProcAddress((const GLubyte*)\"glGetFragDataLocation\")) == NULL) || r;\r\n  r = ((glGetStringi = (PFNGLGETSTRINGIPROC)glewGetProcAddress((const GLubyte*)\"glGetStringi\")) == NULL) || r;\r\n  r = ((glGetTexParameterIiv = (PFNGLGETTEXPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)\"glGetTexParameterIiv\")) == NULL) || r;\r\n  r = ((glGetTexParameterIuiv = (PFNGLGETTEXPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)\"glGetTexParameterIuiv\")) == NULL) || r;\r\n  r = ((glGetTransformFeedbackVarying = (PFNGLGETTRANSFORMFEEDBACKVARYINGPROC)glewGetProcAddress((const GLubyte*)\"glGetTransformFeedbackVarying\")) == NULL) || r;\r\n  r = ((glGetUniformuiv = (PFNGLGETUNIFORMUIVPROC)glewGetProcAddress((const GLubyte*)\"glGetUniformuiv\")) == NULL) || r;\r\n  r = ((glGetVertexAttribIiv = (PFNGLGETVERTEXATTRIBIIVPROC)glewGetProcAddress((const GLubyte*)\"glGetVertexAttribIiv\")) == NULL) || r;\r\n  r = ((glGetVertexAttribIuiv = (PFNGLGETVERTEXATTRIBIUIVPROC)glewGetProcAddress((const GLubyte*)\"glGetVertexAttribIuiv\")) == NULL) || r;\r\n  r = ((glIsEnabledi = (PFNGLISENABLEDIPROC)glewGetProcAddress((const GLubyte*)\"glIsEnabledi\")) == NULL) || r;\r\n  r = ((glTexParameterIiv = (PFNGLTEXPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)\"glTexParameterIiv\")) == NULL) || r;\r\n  r = ((glTexParameterIuiv = (PFNGLTEXPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)\"glTexParameterIuiv\")) == NULL) || r;\r\n  r = ((glTransformFeedbackVaryings = (PFNGLTRANSFORMFEEDBACKVARYINGSPROC)glewGetProcAddress((const GLubyte*)\"glTransformFeedbackVaryings\")) == NULL) || r;\r\n  r = ((glUniform1ui = (PFNGLUNIFORM1UIPROC)glewGetProcAddress((const GLubyte*)\"glUniform1ui\")) == NULL) || r;\r\n  r = ((glUniform1uiv = (PFNGLUNIFORM1UIVPROC)glewGetProcAddress((const GLubyte*)\"glUniform1uiv\")) == NULL) || r;\r\n  r = ((glUniform2ui = (PFNGLUNIFORM2UIPROC)glewGetProcAddress((const GLubyte*)\"glUniform2ui\")) == NULL) || r;\r\n  r = ((glUniform2uiv = (PFNGLUNIFORM2UIVPROC)glewGetProcAddress((const GLubyte*)\"glUniform2uiv\")) == NULL) || r;\r\n  r = ((glUniform3ui = (PFNGLUNIFORM3UIPROC)glewGetProcAddress((const GLubyte*)\"glUniform3ui\")) == NULL) || r;\r\n  r = ((glUniform3uiv = (PFNGLUNIFORM3UIVPROC)glewGetProcAddress((const GLubyte*)\"glUniform3uiv\")) == NULL) || r;\r\n  r = ((glUniform4ui = (PFNGLUNIFORM4UIPROC)glewGetProcAddress((const GLubyte*)\"glUniform4ui\")) == NULL) || r;\r\n  r = ((glUniform4uiv = (PFNGLUNIFORM4UIVPROC)glewGetProcAddress((const GLubyte*)\"glUniform4uiv\")) == NULL) || r;\r\n  r = ((glVertexAttribI1i = (PFNGLVERTEXATTRIBI1IPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribI1i\")) == NULL) || r;\r\n  r = ((glVertexAttribI1iv = (PFNGLVERTEXATTRIBI1IVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribI1iv\")) == NULL) || r;\r\n  r = ((glVertexAttribI1ui = (PFNGLVERTEXATTRIBI1UIPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribI1ui\")) == NULL) || r;\r\n  r = ((glVertexAttribI1uiv = (PFNGLVERTEXATTRIBI1UIVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribI1uiv\")) == NULL) || r;\r\n  r = ((glVertexAttribI2i = (PFNGLVERTEXATTRIBI2IPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribI2i\")) == NULL) || r;\r\n  r = ((glVertexAttribI2iv = (PFNGLVERTEXATTRIBI2IVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribI2iv\")) == NULL) || r;\r\n  r = ((glVertexAttribI2ui = (PFNGLVERTEXATTRIBI2UIPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribI2ui\")) == NULL) || r;\r\n  r = ((glVertexAttribI2uiv = (PFNGLVERTEXATTRIBI2UIVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribI2uiv\")) == NULL) || r;\r\n  r = ((glVertexAttribI3i = (PFNGLVERTEXATTRIBI3IPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribI3i\")) == NULL) || r;\r\n  r = ((glVertexAttribI3iv = (PFNGLVERTEXATTRIBI3IVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribI3iv\")) == NULL) || r;\r\n  r = ((glVertexAttribI3ui = (PFNGLVERTEXATTRIBI3UIPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribI3ui\")) == NULL) || r;\r\n  r = ((glVertexAttribI3uiv = (PFNGLVERTEXATTRIBI3UIVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribI3uiv\")) == NULL) || r;\r\n  r = ((glVertexAttribI4bv = (PFNGLVERTEXATTRIBI4BVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribI4bv\")) == NULL) || r;\r\n  r = ((glVertexAttribI4i = (PFNGLVERTEXATTRIBI4IPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribI4i\")) == NULL) || r;\r\n  r = ((glVertexAttribI4iv = (PFNGLVERTEXATTRIBI4IVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribI4iv\")) == NULL) || r;\r\n  r = ((glVertexAttribI4sv = (PFNGLVERTEXATTRIBI4SVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribI4sv\")) == NULL) || r;\r\n  r = ((glVertexAttribI4ubv = (PFNGLVERTEXATTRIBI4UBVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribI4ubv\")) == NULL) || r;\r\n  r = ((glVertexAttribI4ui = (PFNGLVERTEXATTRIBI4UIPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribI4ui\")) == NULL) || r;\r\n  r = ((glVertexAttribI4uiv = (PFNGLVERTEXATTRIBI4UIVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribI4uiv\")) == NULL) || r;\r\n  r = ((glVertexAttribI4usv = (PFNGLVERTEXATTRIBI4USVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribI4usv\")) == NULL) || r;\r\n  r = ((glVertexAttribIPointer = (PFNGLVERTEXATTRIBIPOINTERPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribIPointer\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_VERSION_3_0 */\r\n\r\n#ifdef GL_VERSION_3_1\r\n\r\nstatic GLboolean _glewInit_GL_VERSION_3_1 (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDPROC)glewGetProcAddress((const GLubyte*)\"glDrawArraysInstanced\")) == NULL) || r;\r\n  r = ((glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDPROC)glewGetProcAddress((const GLubyte*)\"glDrawElementsInstanced\")) == NULL) || r;\r\n  r = ((glPrimitiveRestartIndex = (PFNGLPRIMITIVERESTARTINDEXPROC)glewGetProcAddress((const GLubyte*)\"glPrimitiveRestartIndex\")) == NULL) || r;\r\n  r = ((glTexBuffer = (PFNGLTEXBUFFERPROC)glewGetProcAddress((const GLubyte*)\"glTexBuffer\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_VERSION_3_1 */\r\n\r\n#ifdef GL_VERSION_3_2\r\n\r\nstatic GLboolean _glewInit_GL_VERSION_3_2 (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC)glewGetProcAddress((const GLubyte*)\"glFramebufferTexture\")) == NULL) || r;\r\n  r = ((glGetBufferParameteri64v = (PFNGLGETBUFFERPARAMETERI64VPROC)glewGetProcAddress((const GLubyte*)\"glGetBufferParameteri64v\")) == NULL) || r;\r\n  r = ((glGetInteger64i_v = (PFNGLGETINTEGER64I_VPROC)glewGetProcAddress((const GLubyte*)\"glGetInteger64i_v\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_VERSION_3_2 */\r\n\r\n#ifdef GL_3DFX_multisample\r\n\r\n#endif /* GL_3DFX_multisample */\r\n\r\n#ifdef GL_3DFX_tbuffer\r\n\r\nstatic GLboolean _glewInit_GL_3DFX_tbuffer (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glTbufferMask3DFX = (PFNGLTBUFFERMASK3DFXPROC)glewGetProcAddress((const GLubyte*)\"glTbufferMask3DFX\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_3DFX_tbuffer */\r\n\r\n#ifdef GL_3DFX_texture_compression_FXT1\r\n\r\n#endif /* GL_3DFX_texture_compression_FXT1 */\r\n\r\n#ifdef GL_AMD_draw_buffers_blend\r\n\r\nstatic GLboolean _glewInit_GL_AMD_draw_buffers_blend (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glBlendEquationIndexedAMD = (PFNGLBLENDEQUATIONINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)\"glBlendEquationIndexedAMD\")) == NULL) || r;\r\n  r = ((glBlendEquationSeparateIndexedAMD = (PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)\"glBlendEquationSeparateIndexedAMD\")) == NULL) || r;\r\n  r = ((glBlendFuncIndexedAMD = (PFNGLBLENDFUNCINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)\"glBlendFuncIndexedAMD\")) == NULL) || r;\r\n  r = ((glBlendFuncSeparateIndexedAMD = (PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)\"glBlendFuncSeparateIndexedAMD\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_AMD_draw_buffers_blend */\r\n\r\n#ifdef GL_AMD_performance_monitor\r\n\r\nstatic GLboolean _glewInit_GL_AMD_performance_monitor (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glBeginPerfMonitorAMD = (PFNGLBEGINPERFMONITORAMDPROC)glewGetProcAddress((const GLubyte*)\"glBeginPerfMonitorAMD\")) == NULL) || r;\r\n  r = ((glDeletePerfMonitorsAMD = (PFNGLDELETEPERFMONITORSAMDPROC)glewGetProcAddress((const GLubyte*)\"glDeletePerfMonitorsAMD\")) == NULL) || r;\r\n  r = ((glEndPerfMonitorAMD = (PFNGLENDPERFMONITORAMDPROC)glewGetProcAddress((const GLubyte*)\"glEndPerfMonitorAMD\")) == NULL) || r;\r\n  r = ((glGenPerfMonitorsAMD = (PFNGLGENPERFMONITORSAMDPROC)glewGetProcAddress((const GLubyte*)\"glGenPerfMonitorsAMD\")) == NULL) || r;\r\n  r = ((glGetPerfMonitorCounterDataAMD = (PFNGLGETPERFMONITORCOUNTERDATAAMDPROC)glewGetProcAddress((const GLubyte*)\"glGetPerfMonitorCounterDataAMD\")) == NULL) || r;\r\n  r = ((glGetPerfMonitorCounterInfoAMD = (PFNGLGETPERFMONITORCOUNTERINFOAMDPROC)glewGetProcAddress((const GLubyte*)\"glGetPerfMonitorCounterInfoAMD\")) == NULL) || r;\r\n  r = ((glGetPerfMonitorCounterStringAMD = (PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC)glewGetProcAddress((const GLubyte*)\"glGetPerfMonitorCounterStringAMD\")) == NULL) || r;\r\n  r = ((glGetPerfMonitorCountersAMD = (PFNGLGETPERFMONITORCOUNTERSAMDPROC)glewGetProcAddress((const GLubyte*)\"glGetPerfMonitorCountersAMD\")) == NULL) || r;\r\n  r = ((glGetPerfMonitorGroupStringAMD = (PFNGLGETPERFMONITORGROUPSTRINGAMDPROC)glewGetProcAddress((const GLubyte*)\"glGetPerfMonitorGroupStringAMD\")) == NULL) || r;\r\n  r = ((glGetPerfMonitorGroupsAMD = (PFNGLGETPERFMONITORGROUPSAMDPROC)glewGetProcAddress((const GLubyte*)\"glGetPerfMonitorGroupsAMD\")) == NULL) || r;\r\n  r = ((glSelectPerfMonitorCountersAMD = (PFNGLSELECTPERFMONITORCOUNTERSAMDPROC)glewGetProcAddress((const GLubyte*)\"glSelectPerfMonitorCountersAMD\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_AMD_performance_monitor */\r\n\r\n#ifdef GL_AMD_seamless_cubemap_per_texture\r\n\r\n#endif /* GL_AMD_seamless_cubemap_per_texture */\r\n\r\n#ifdef GL_AMD_shader_stencil_export\r\n\r\n#endif /* GL_AMD_shader_stencil_export */\r\n\r\n#ifdef GL_AMD_texture_texture4\r\n\r\n#endif /* GL_AMD_texture_texture4 */\r\n\r\n#ifdef GL_AMD_vertex_shader_tessellator\r\n\r\nstatic GLboolean _glewInit_GL_AMD_vertex_shader_tessellator (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glTessellationFactorAMD = (PFNGLTESSELLATIONFACTORAMDPROC)glewGetProcAddress((const GLubyte*)\"glTessellationFactorAMD\")) == NULL) || r;\r\n  r = ((glTessellationModeAMD = (PFNGLTESSELLATIONMODEAMDPROC)glewGetProcAddress((const GLubyte*)\"glTessellationModeAMD\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_AMD_vertex_shader_tessellator */\r\n\r\n#ifdef GL_APPLE_aux_depth_stencil\r\n\r\n#endif /* GL_APPLE_aux_depth_stencil */\r\n\r\n#ifdef GL_APPLE_client_storage\r\n\r\n#endif /* GL_APPLE_client_storage */\r\n\r\n#ifdef GL_APPLE_element_array\r\n\r\nstatic GLboolean _glewInit_GL_APPLE_element_array (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glDrawElementArrayAPPLE = (PFNGLDRAWELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)\"glDrawElementArrayAPPLE\")) == NULL) || r;\r\n  r = ((glDrawRangeElementArrayAPPLE = (PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)\"glDrawRangeElementArrayAPPLE\")) == NULL) || r;\r\n  r = ((glElementPointerAPPLE = (PFNGLELEMENTPOINTERAPPLEPROC)glewGetProcAddress((const GLubyte*)\"glElementPointerAPPLE\")) == NULL) || r;\r\n  r = ((glMultiDrawElementArrayAPPLE = (PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)\"glMultiDrawElementArrayAPPLE\")) == NULL) || r;\r\n  r = ((glMultiDrawRangeElementArrayAPPLE = (PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)\"glMultiDrawRangeElementArrayAPPLE\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_APPLE_element_array */\r\n\r\n#ifdef GL_APPLE_fence\r\n\r\nstatic GLboolean _glewInit_GL_APPLE_fence (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glDeleteFencesAPPLE = (PFNGLDELETEFENCESAPPLEPROC)glewGetProcAddress((const GLubyte*)\"glDeleteFencesAPPLE\")) == NULL) || r;\r\n  r = ((glFinishFenceAPPLE = (PFNGLFINISHFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)\"glFinishFenceAPPLE\")) == NULL) || r;\r\n  r = ((glFinishObjectAPPLE = (PFNGLFINISHOBJECTAPPLEPROC)glewGetProcAddress((const GLubyte*)\"glFinishObjectAPPLE\")) == NULL) || r;\r\n  r = ((glGenFencesAPPLE = (PFNGLGENFENCESAPPLEPROC)glewGetProcAddress((const GLubyte*)\"glGenFencesAPPLE\")) == NULL) || r;\r\n  r = ((glIsFenceAPPLE = (PFNGLISFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)\"glIsFenceAPPLE\")) == NULL) || r;\r\n  r = ((glSetFenceAPPLE = (PFNGLSETFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)\"glSetFenceAPPLE\")) == NULL) || r;\r\n  r = ((glTestFenceAPPLE = (PFNGLTESTFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)\"glTestFenceAPPLE\")) == NULL) || r;\r\n  r = ((glTestObjectAPPLE = (PFNGLTESTOBJECTAPPLEPROC)glewGetProcAddress((const GLubyte*)\"glTestObjectAPPLE\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_APPLE_fence */\r\n\r\n#ifdef GL_APPLE_float_pixels\r\n\r\n#endif /* GL_APPLE_float_pixels */\r\n\r\n#ifdef GL_APPLE_flush_buffer_range\r\n\r\nstatic GLboolean _glewInit_GL_APPLE_flush_buffer_range (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glBufferParameteriAPPLE = (PFNGLBUFFERPARAMETERIAPPLEPROC)glewGetProcAddress((const GLubyte*)\"glBufferParameteriAPPLE\")) == NULL) || r;\r\n  r = ((glFlushMappedBufferRangeAPPLE = (PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)\"glFlushMappedBufferRangeAPPLE\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_APPLE_flush_buffer_range */\r\n\r\n#ifdef GL_APPLE_object_purgeable\r\n\r\nstatic GLboolean _glewInit_GL_APPLE_object_purgeable (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glGetObjectParameterivAPPLE = (PFNGLGETOBJECTPARAMETERIVAPPLEPROC)glewGetProcAddress((const GLubyte*)\"glGetObjectParameterivAPPLE\")) == NULL) || r;\r\n  r = ((glObjectPurgeableAPPLE = (PFNGLOBJECTPURGEABLEAPPLEPROC)glewGetProcAddress((const GLubyte*)\"glObjectPurgeableAPPLE\")) == NULL) || r;\r\n  r = ((glObjectUnpurgeableAPPLE = (PFNGLOBJECTUNPURGEABLEAPPLEPROC)glewGetProcAddress((const GLubyte*)\"glObjectUnpurgeableAPPLE\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_APPLE_object_purgeable */\r\n\r\n#ifdef GL_APPLE_pixel_buffer\r\n\r\n#endif /* GL_APPLE_pixel_buffer */\r\n\r\n#ifdef GL_APPLE_rgb_422\r\n\r\n#endif /* GL_APPLE_rgb_422 */\r\n\r\n#ifdef GL_APPLE_row_bytes\r\n\r\n#endif /* GL_APPLE_row_bytes */\r\n\r\n#ifdef GL_APPLE_specular_vector\r\n\r\n#endif /* GL_APPLE_specular_vector */\r\n\r\n#ifdef GL_APPLE_texture_range\r\n\r\nstatic GLboolean _glewInit_GL_APPLE_texture_range (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glGetTexParameterPointervAPPLE = (PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC)glewGetProcAddress((const GLubyte*)\"glGetTexParameterPointervAPPLE\")) == NULL) || r;\r\n  r = ((glTextureRangeAPPLE = (PFNGLTEXTURERANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)\"glTextureRangeAPPLE\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_APPLE_texture_range */\r\n\r\n#ifdef GL_APPLE_transform_hint\r\n\r\n#endif /* GL_APPLE_transform_hint */\r\n\r\n#ifdef GL_APPLE_vertex_array_object\r\n\r\nstatic GLboolean _glewInit_GL_APPLE_vertex_array_object (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glBindVertexArrayAPPLE = (PFNGLBINDVERTEXARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)\"glBindVertexArrayAPPLE\")) == NULL) || r;\r\n  r = ((glDeleteVertexArraysAPPLE = (PFNGLDELETEVERTEXARRAYSAPPLEPROC)glewGetProcAddress((const GLubyte*)\"glDeleteVertexArraysAPPLE\")) == NULL) || r;\r\n  r = ((glGenVertexArraysAPPLE = (PFNGLGENVERTEXARRAYSAPPLEPROC)glewGetProcAddress((const GLubyte*)\"glGenVertexArraysAPPLE\")) == NULL) || r;\r\n  r = ((glIsVertexArrayAPPLE = (PFNGLISVERTEXARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)\"glIsVertexArrayAPPLE\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_APPLE_vertex_array_object */\r\n\r\n#ifdef GL_APPLE_vertex_array_range\r\n\r\nstatic GLboolean _glewInit_GL_APPLE_vertex_array_range (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glFlushVertexArrayRangeAPPLE = (PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)\"glFlushVertexArrayRangeAPPLE\")) == NULL) || r;\r\n  r = ((glVertexArrayParameteriAPPLE = (PFNGLVERTEXARRAYPARAMETERIAPPLEPROC)glewGetProcAddress((const GLubyte*)\"glVertexArrayParameteriAPPLE\")) == NULL) || r;\r\n  r = ((glVertexArrayRangeAPPLE = (PFNGLVERTEXARRAYRANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)\"glVertexArrayRangeAPPLE\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_APPLE_vertex_array_range */\r\n\r\n#ifdef GL_APPLE_vertex_program_evaluators\r\n\r\nstatic GLboolean _glewInit_GL_APPLE_vertex_program_evaluators (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glDisableVertexAttribAPPLE = (PFNGLDISABLEVERTEXATTRIBAPPLEPROC)glewGetProcAddress((const GLubyte*)\"glDisableVertexAttribAPPLE\")) == NULL) || r;\r\n  r = ((glEnableVertexAttribAPPLE = (PFNGLENABLEVERTEXATTRIBAPPLEPROC)glewGetProcAddress((const GLubyte*)\"glEnableVertexAttribAPPLE\")) == NULL) || r;\r\n  r = ((glIsVertexAttribEnabledAPPLE = (PFNGLISVERTEXATTRIBENABLEDAPPLEPROC)glewGetProcAddress((const GLubyte*)\"glIsVertexAttribEnabledAPPLE\")) == NULL) || r;\r\n  r = ((glMapVertexAttrib1dAPPLE = (PFNGLMAPVERTEXATTRIB1DAPPLEPROC)glewGetProcAddress((const GLubyte*)\"glMapVertexAttrib1dAPPLE\")) == NULL) || r;\r\n  r = ((glMapVertexAttrib1fAPPLE = (PFNGLMAPVERTEXATTRIB1FAPPLEPROC)glewGetProcAddress((const GLubyte*)\"glMapVertexAttrib1fAPPLE\")) == NULL) || r;\r\n  r = ((glMapVertexAttrib2dAPPLE = (PFNGLMAPVERTEXATTRIB2DAPPLEPROC)glewGetProcAddress((const GLubyte*)\"glMapVertexAttrib2dAPPLE\")) == NULL) || r;\r\n  r = ((glMapVertexAttrib2fAPPLE = (PFNGLMAPVERTEXATTRIB2FAPPLEPROC)glewGetProcAddress((const GLubyte*)\"glMapVertexAttrib2fAPPLE\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_APPLE_vertex_program_evaluators */\r\n\r\n#ifdef GL_APPLE_ycbcr_422\r\n\r\n#endif /* GL_APPLE_ycbcr_422 */\r\n\r\n#ifdef GL_ARB_color_buffer_float\r\n\r\nstatic GLboolean _glewInit_GL_ARB_color_buffer_float (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glClampColorARB = (PFNGLCLAMPCOLORARBPROC)glewGetProcAddress((const GLubyte*)\"glClampColorARB\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_ARB_color_buffer_float */\r\n\r\n#ifdef GL_ARB_compatibility\r\n\r\n#endif /* GL_ARB_compatibility */\r\n\r\n#ifdef GL_ARB_copy_buffer\r\n\r\nstatic GLboolean _glewInit_GL_ARB_copy_buffer (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glCopyBufferSubData = (PFNGLCOPYBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)\"glCopyBufferSubData\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_ARB_copy_buffer */\r\n\r\n#ifdef GL_ARB_depth_buffer_float\r\n\r\n#endif /* GL_ARB_depth_buffer_float */\r\n\r\n#ifdef GL_ARB_depth_clamp\r\n\r\n#endif /* GL_ARB_depth_clamp */\r\n\r\n#ifdef GL_ARB_depth_texture\r\n\r\n#endif /* GL_ARB_depth_texture */\r\n\r\n#ifdef GL_ARB_draw_buffers\r\n\r\nstatic GLboolean _glewInit_GL_ARB_draw_buffers (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glDrawBuffersARB = (PFNGLDRAWBUFFERSARBPROC)glewGetProcAddress((const GLubyte*)\"glDrawBuffersARB\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_ARB_draw_buffers */\r\n\r\n#ifdef GL_ARB_draw_buffers_blend\r\n\r\nstatic GLboolean _glewInit_GL_ARB_draw_buffers_blend (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glBlendEquationSeparateiARB = (PFNGLBLENDEQUATIONSEPARATEIARBPROC)glewGetProcAddress((const GLubyte*)\"glBlendEquationSeparateiARB\")) == NULL) || r;\r\n  r = ((glBlendEquationiARB = (PFNGLBLENDEQUATIONIARBPROC)glewGetProcAddress((const GLubyte*)\"glBlendEquationiARB\")) == NULL) || r;\r\n  r = ((glBlendFuncSeparateiARB = (PFNGLBLENDFUNCSEPARATEIARBPROC)glewGetProcAddress((const GLubyte*)\"glBlendFuncSeparateiARB\")) == NULL) || r;\r\n  r = ((glBlendFunciARB = (PFNGLBLENDFUNCIARBPROC)glewGetProcAddress((const GLubyte*)\"glBlendFunciARB\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_ARB_draw_buffers_blend */\r\n\r\n#ifdef GL_ARB_draw_elements_base_vertex\r\n\r\nstatic GLboolean _glewInit_GL_ARB_draw_elements_base_vertex (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glDrawElementsBaseVertex = (PFNGLDRAWELEMENTSBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)\"glDrawElementsBaseVertex\")) == NULL) || r;\r\n  r = ((glDrawElementsInstancedBaseVertex = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)\"glDrawElementsInstancedBaseVertex\")) == NULL) || r;\r\n  r = ((glDrawRangeElementsBaseVertex = (PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)\"glDrawRangeElementsBaseVertex\")) == NULL) || r;\r\n  r = ((glMultiDrawElementsBaseVertex = (PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)\"glMultiDrawElementsBaseVertex\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_ARB_draw_elements_base_vertex */\r\n\r\n#ifdef GL_ARB_draw_instanced\r\n\r\nstatic GLboolean _glewInit_GL_ARB_draw_instanced (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glDrawArraysInstancedARB = (PFNGLDRAWARRAYSINSTANCEDARBPROC)glewGetProcAddress((const GLubyte*)\"glDrawArraysInstancedARB\")) == NULL) || r;\r\n  r = ((glDrawElementsInstancedARB = (PFNGLDRAWELEMENTSINSTANCEDARBPROC)glewGetProcAddress((const GLubyte*)\"glDrawElementsInstancedARB\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_ARB_draw_instanced */\r\n\r\n#ifdef GL_ARB_fragment_coord_conventions\r\n\r\n#endif /* GL_ARB_fragment_coord_conventions */\r\n\r\n#ifdef GL_ARB_fragment_program\r\n\r\n#endif /* GL_ARB_fragment_program */\r\n\r\n#ifdef GL_ARB_fragment_program_shadow\r\n\r\n#endif /* GL_ARB_fragment_program_shadow */\r\n\r\n#ifdef GL_ARB_fragment_shader\r\n\r\n#endif /* GL_ARB_fragment_shader */\r\n\r\n#ifdef GL_ARB_framebuffer_object\r\n\r\nstatic GLboolean _glewInit_GL_ARB_framebuffer_object (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)\"glBindFramebuffer\")) == NULL) || r;\r\n  r = ((glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC)glewGetProcAddress((const GLubyte*)\"glBindRenderbuffer\")) == NULL) || r;\r\n  r = ((glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)\"glBlitFramebuffer\")) == NULL) || r;\r\n  r = ((glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC)glewGetProcAddress((const GLubyte*)\"glCheckFramebufferStatus\")) == NULL) || r;\r\n  r = ((glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)glewGetProcAddress((const GLubyte*)\"glDeleteFramebuffers\")) == NULL) || r;\r\n  r = ((glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)glewGetProcAddress((const GLubyte*)\"glDeleteRenderbuffers\")) == NULL) || r;\r\n  r = ((glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)glewGetProcAddress((const GLubyte*)\"glFramebufferRenderbuffer\")) == NULL) || r;\r\n  r = ((glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC)glewGetProcAddress((const GLubyte*)\"glFramebufferTexture1D\")) == NULL) || r;\r\n  r = ((glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)glewGetProcAddress((const GLubyte*)\"glFramebufferTexture2D\")) == NULL) || r;\r\n  r = ((glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC)glewGetProcAddress((const GLubyte*)\"glFramebufferTexture3D\")) == NULL) || r;\r\n  r = ((glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC)glewGetProcAddress((const GLubyte*)\"glFramebufferTextureLayer\")) == NULL) || r;\r\n  r = ((glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)glewGetProcAddress((const GLubyte*)\"glGenFramebuffers\")) == NULL) || r;\r\n  r = ((glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)glewGetProcAddress((const GLubyte*)\"glGenRenderbuffers\")) == NULL) || r;\r\n  r = ((glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC)glewGetProcAddress((const GLubyte*)\"glGenerateMipmap\")) == NULL) || r;\r\n  r = ((glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)\"glGetFramebufferAttachmentParameteriv\")) == NULL) || r;\r\n  r = ((glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)\"glGetRenderbufferParameteriv\")) == NULL) || r;\r\n  r = ((glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)\"glIsFramebuffer\")) == NULL) || r;\r\n  r = ((glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC)glewGetProcAddress((const GLubyte*)\"glIsRenderbuffer\")) == NULL) || r;\r\n  r = ((glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)glewGetProcAddress((const GLubyte*)\"glRenderbufferStorage\")) == NULL) || r;\r\n  r = ((glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)\"glRenderbufferStorageMultisample\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_ARB_framebuffer_object */\r\n\r\n#ifdef GL_ARB_framebuffer_sRGB\r\n\r\n#endif /* GL_ARB_framebuffer_sRGB */\r\n\r\n#ifdef GL_ARB_geometry_shader4\r\n\r\nstatic GLboolean _glewInit_GL_ARB_geometry_shader4 (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glFramebufferTextureARB = (PFNGLFRAMEBUFFERTEXTUREARBPROC)glewGetProcAddress((const GLubyte*)\"glFramebufferTextureARB\")) == NULL) || r;\r\n  r = ((glFramebufferTextureFaceARB = (PFNGLFRAMEBUFFERTEXTUREFACEARBPROC)glewGetProcAddress((const GLubyte*)\"glFramebufferTextureFaceARB\")) == NULL) || r;\r\n  r = ((glFramebufferTextureLayerARB = (PFNGLFRAMEBUFFERTEXTURELAYERARBPROC)glewGetProcAddress((const GLubyte*)\"glFramebufferTextureLayerARB\")) == NULL) || r;\r\n  r = ((glProgramParameteriARB = (PFNGLPROGRAMPARAMETERIARBPROC)glewGetProcAddress((const GLubyte*)\"glProgramParameteriARB\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_ARB_geometry_shader4 */\r\n\r\n#ifdef GL_ARB_half_float_pixel\r\n\r\n#endif /* GL_ARB_half_float_pixel */\r\n\r\n#ifdef GL_ARB_half_float_vertex\r\n\r\n#endif /* GL_ARB_half_float_vertex */\r\n\r\n#ifdef GL_ARB_imaging\r\n\r\nstatic GLboolean _glewInit_GL_ARB_imaging (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glBlendEquation = (PFNGLBLENDEQUATIONPROC)glewGetProcAddress((const GLubyte*)\"glBlendEquation\")) == NULL) || r;\r\n  r = ((glColorSubTable = (PFNGLCOLORSUBTABLEPROC)glewGetProcAddress((const GLubyte*)\"glColorSubTable\")) == NULL) || r;\r\n  r = ((glColorTable = (PFNGLCOLORTABLEPROC)glewGetProcAddress((const GLubyte*)\"glColorTable\")) == NULL) || r;\r\n  r = ((glColorTableParameterfv = (PFNGLCOLORTABLEPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)\"glColorTableParameterfv\")) == NULL) || r;\r\n  r = ((glColorTableParameteriv = (PFNGLCOLORTABLEPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)\"glColorTableParameteriv\")) == NULL) || r;\r\n  r = ((glConvolutionFilter1D = (PFNGLCONVOLUTIONFILTER1DPROC)glewGetProcAddress((const GLubyte*)\"glConvolutionFilter1D\")) == NULL) || r;\r\n  r = ((glConvolutionFilter2D = (PFNGLCONVOLUTIONFILTER2DPROC)glewGetProcAddress((const GLubyte*)\"glConvolutionFilter2D\")) == NULL) || r;\r\n  r = ((glConvolutionParameterf = (PFNGLCONVOLUTIONPARAMETERFPROC)glewGetProcAddress((const GLubyte*)\"glConvolutionParameterf\")) == NULL) || r;\r\n  r = ((glConvolutionParameterfv = (PFNGLCONVOLUTIONPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)\"glConvolutionParameterfv\")) == NULL) || r;\r\n  r = ((glConvolutionParameteri = (PFNGLCONVOLUTIONPARAMETERIPROC)glewGetProcAddress((const GLubyte*)\"glConvolutionParameteri\")) == NULL) || r;\r\n  r = ((glConvolutionParameteriv = (PFNGLCONVOLUTIONPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)\"glConvolutionParameteriv\")) == NULL) || r;\r\n  r = ((glCopyColorSubTable = (PFNGLCOPYCOLORSUBTABLEPROC)glewGetProcAddress((const GLubyte*)\"glCopyColorSubTable\")) == NULL) || r;\r\n  r = ((glCopyColorTable = (PFNGLCOPYCOLORTABLEPROC)glewGetProcAddress((const GLubyte*)\"glCopyColorTable\")) == NULL) || r;\r\n  r = ((glCopyConvolutionFilter1D = (PFNGLCOPYCONVOLUTIONFILTER1DPROC)glewGetProcAddress((const GLubyte*)\"glCopyConvolutionFilter1D\")) == NULL) || r;\r\n  r = ((glCopyConvolutionFilter2D = (PFNGLCOPYCONVOLUTIONFILTER2DPROC)glewGetProcAddress((const GLubyte*)\"glCopyConvolutionFilter2D\")) == NULL) || r;\r\n  r = ((glGetColorTable = (PFNGLGETCOLORTABLEPROC)glewGetProcAddress((const GLubyte*)\"glGetColorTable\")) == NULL) || r;\r\n  r = ((glGetColorTableParameterfv = (PFNGLGETCOLORTABLEPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)\"glGetColorTableParameterfv\")) == NULL) || r;\r\n  r = ((glGetColorTableParameteriv = (PFNGLGETCOLORTABLEPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)\"glGetColorTableParameteriv\")) == NULL) || r;\r\n  r = ((glGetConvolutionFilter = (PFNGLGETCONVOLUTIONFILTERPROC)glewGetProcAddress((const GLubyte*)\"glGetConvolutionFilter\")) == NULL) || r;\r\n  r = ((glGetConvolutionParameterfv = (PFNGLGETCONVOLUTIONPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)\"glGetConvolutionParameterfv\")) == NULL) || r;\r\n  r = ((glGetConvolutionParameteriv = (PFNGLGETCONVOLUTIONPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)\"glGetConvolutionParameteriv\")) == NULL) || r;\r\n  r = ((glGetHistogram = (PFNGLGETHISTOGRAMPROC)glewGetProcAddress((const GLubyte*)\"glGetHistogram\")) == NULL) || r;\r\n  r = ((glGetHistogramParameterfv = (PFNGLGETHISTOGRAMPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)\"glGetHistogramParameterfv\")) == NULL) || r;\r\n  r = ((glGetHistogramParameteriv = (PFNGLGETHISTOGRAMPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)\"glGetHistogramParameteriv\")) == NULL) || r;\r\n  r = ((glGetMinmax = (PFNGLGETMINMAXPROC)glewGetProcAddress((const GLubyte*)\"glGetMinmax\")) == NULL) || r;\r\n  r = ((glGetMinmaxParameterfv = (PFNGLGETMINMAXPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)\"glGetMinmaxParameterfv\")) == NULL) || r;\r\n  r = ((glGetMinmaxParameteriv = (PFNGLGETMINMAXPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)\"glGetMinmaxParameteriv\")) == NULL) || r;\r\n  r = ((glGetSeparableFilter = (PFNGLGETSEPARABLEFILTERPROC)glewGetProcAddress((const GLubyte*)\"glGetSeparableFilter\")) == NULL) || r;\r\n  r = ((glHistogram = (PFNGLHISTOGRAMPROC)glewGetProcAddress((const GLubyte*)\"glHistogram\")) == NULL) || r;\r\n  r = ((glMinmax = (PFNGLMINMAXPROC)glewGetProcAddress((const GLubyte*)\"glMinmax\")) == NULL) || r;\r\n  r = ((glResetHistogram = (PFNGLRESETHISTOGRAMPROC)glewGetProcAddress((const GLubyte*)\"glResetHistogram\")) == NULL) || r;\r\n  r = ((glResetMinmax = (PFNGLRESETMINMAXPROC)glewGetProcAddress((const GLubyte*)\"glResetMinmax\")) == NULL) || r;\r\n  r = ((glSeparableFilter2D = (PFNGLSEPARABLEFILTER2DPROC)glewGetProcAddress((const GLubyte*)\"glSeparableFilter2D\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_ARB_imaging */\r\n\r\n#ifdef GL_ARB_instanced_arrays\r\n\r\nstatic GLboolean _glewInit_GL_ARB_instanced_arrays (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glVertexAttribDivisorARB = (PFNGLVERTEXATTRIBDIVISORARBPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribDivisorARB\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_ARB_instanced_arrays */\r\n\r\n#ifdef GL_ARB_map_buffer_range\r\n\r\nstatic GLboolean _glewInit_GL_ARB_map_buffer_range (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glFlushMappedBufferRange = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)\"glFlushMappedBufferRange\")) == NULL) || r;\r\n  r = ((glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)\"glMapBufferRange\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_ARB_map_buffer_range */\r\n\r\n#ifdef GL_ARB_matrix_palette\r\n\r\nstatic GLboolean _glewInit_GL_ARB_matrix_palette (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glCurrentPaletteMatrixARB = (PFNGLCURRENTPALETTEMATRIXARBPROC)glewGetProcAddress((const GLubyte*)\"glCurrentPaletteMatrixARB\")) == NULL) || r;\r\n  r = ((glMatrixIndexPointerARB = (PFNGLMATRIXINDEXPOINTERARBPROC)glewGetProcAddress((const GLubyte*)\"glMatrixIndexPointerARB\")) == NULL) || r;\r\n  r = ((glMatrixIndexubvARB = (PFNGLMATRIXINDEXUBVARBPROC)glewGetProcAddress((const GLubyte*)\"glMatrixIndexubvARB\")) == NULL) || r;\r\n  r = ((glMatrixIndexuivARB = (PFNGLMATRIXINDEXUIVARBPROC)glewGetProcAddress((const GLubyte*)\"glMatrixIndexuivARB\")) == NULL) || r;\r\n  r = ((glMatrixIndexusvARB = (PFNGLMATRIXINDEXUSVARBPROC)glewGetProcAddress((const GLubyte*)\"glMatrixIndexusvARB\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_ARB_matrix_palette */\r\n\r\n#ifdef GL_ARB_multisample\r\n\r\nstatic GLboolean _glewInit_GL_ARB_multisample (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glSampleCoverageARB = (PFNGLSAMPLECOVERAGEARBPROC)glewGetProcAddress((const GLubyte*)\"glSampleCoverageARB\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_ARB_multisample */\r\n\r\n#ifdef GL_ARB_multitexture\r\n\r\nstatic GLboolean _glewInit_GL_ARB_multitexture (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC)glewGetProcAddress((const GLubyte*)\"glActiveTextureARB\")) == NULL) || r;\r\n  r = ((glClientActiveTextureARB = (PFNGLCLIENTACTIVETEXTUREARBPROC)glewGetProcAddress((const GLubyte*)\"glClientActiveTextureARB\")) == NULL) || r;\r\n  r = ((glMultiTexCoord1dARB = (PFNGLMULTITEXCOORD1DARBPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord1dARB\")) == NULL) || r;\r\n  r = ((glMultiTexCoord1dvARB = (PFNGLMULTITEXCOORD1DVARBPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord1dvARB\")) == NULL) || r;\r\n  r = ((glMultiTexCoord1fARB = (PFNGLMULTITEXCOORD1FARBPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord1fARB\")) == NULL) || r;\r\n  r = ((glMultiTexCoord1fvARB = (PFNGLMULTITEXCOORD1FVARBPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord1fvARB\")) == NULL) || r;\r\n  r = ((glMultiTexCoord1iARB = (PFNGLMULTITEXCOORD1IARBPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord1iARB\")) == NULL) || r;\r\n  r = ((glMultiTexCoord1ivARB = (PFNGLMULTITEXCOORD1IVARBPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord1ivARB\")) == NULL) || r;\r\n  r = ((glMultiTexCoord1sARB = (PFNGLMULTITEXCOORD1SARBPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord1sARB\")) == NULL) || r;\r\n  r = ((glMultiTexCoord1svARB = (PFNGLMULTITEXCOORD1SVARBPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord1svARB\")) == NULL) || r;\r\n  r = ((glMultiTexCoord2dARB = (PFNGLMULTITEXCOORD2DARBPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord2dARB\")) == NULL) || r;\r\n  r = ((glMultiTexCoord2dvARB = (PFNGLMULTITEXCOORD2DVARBPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord2dvARB\")) == NULL) || r;\r\n  r = ((glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord2fARB\")) == NULL) || r;\r\n  r = ((glMultiTexCoord2fvARB = (PFNGLMULTITEXCOORD2FVARBPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord2fvARB\")) == NULL) || r;\r\n  r = ((glMultiTexCoord2iARB = (PFNGLMULTITEXCOORD2IARBPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord2iARB\")) == NULL) || r;\r\n  r = ((glMultiTexCoord2ivARB = (PFNGLMULTITEXCOORD2IVARBPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord2ivARB\")) == NULL) || r;\r\n  r = ((glMultiTexCoord2sARB = (PFNGLMULTITEXCOORD2SARBPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord2sARB\")) == NULL) || r;\r\n  r = ((glMultiTexCoord2svARB = (PFNGLMULTITEXCOORD2SVARBPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord2svARB\")) == NULL) || r;\r\n  r = ((glMultiTexCoord3dARB = (PFNGLMULTITEXCOORD3DARBPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord3dARB\")) == NULL) || r;\r\n  r = ((glMultiTexCoord3dvARB = (PFNGLMULTITEXCOORD3DVARBPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord3dvARB\")) == NULL) || r;\r\n  r = ((glMultiTexCoord3fARB = (PFNGLMULTITEXCOORD3FARBPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord3fARB\")) == NULL) || r;\r\n  r = ((glMultiTexCoord3fvARB = (PFNGLMULTITEXCOORD3FVARBPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord3fvARB\")) == NULL) || r;\r\n  r = ((glMultiTexCoord3iARB = (PFNGLMULTITEXCOORD3IARBPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord3iARB\")) == NULL) || r;\r\n  r = ((glMultiTexCoord3ivARB = (PFNGLMULTITEXCOORD3IVARBPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord3ivARB\")) == NULL) || r;\r\n  r = ((glMultiTexCoord3sARB = (PFNGLMULTITEXCOORD3SARBPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord3sARB\")) == NULL) || r;\r\n  r = ((glMultiTexCoord3svARB = (PFNGLMULTITEXCOORD3SVARBPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord3svARB\")) == NULL) || r;\r\n  r = ((glMultiTexCoord4dARB = (PFNGLMULTITEXCOORD4DARBPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord4dARB\")) == NULL) || r;\r\n  r = ((glMultiTexCoord4dvARB = (PFNGLMULTITEXCOORD4DVARBPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord4dvARB\")) == NULL) || r;\r\n  r = ((glMultiTexCoord4fARB = (PFNGLMULTITEXCOORD4FARBPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord4fARB\")) == NULL) || r;\r\n  r = ((glMultiTexCoord4fvARB = (PFNGLMULTITEXCOORD4FVARBPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord4fvARB\")) == NULL) || r;\r\n  r = ((glMultiTexCoord4iARB = (PFNGLMULTITEXCOORD4IARBPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord4iARB\")) == NULL) || r;\r\n  r = ((glMultiTexCoord4ivARB = (PFNGLMULTITEXCOORD4IVARBPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord4ivARB\")) == NULL) || r;\r\n  r = ((glMultiTexCoord4sARB = (PFNGLMULTITEXCOORD4SARBPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord4sARB\")) == NULL) || r;\r\n  r = ((glMultiTexCoord4svARB = (PFNGLMULTITEXCOORD4SVARBPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord4svARB\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_ARB_multitexture */\r\n\r\n#ifdef GL_ARB_occlusion_query\r\n\r\nstatic GLboolean _glewInit_GL_ARB_occlusion_query (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glBeginQueryARB = (PFNGLBEGINQUERYARBPROC)glewGetProcAddress((const GLubyte*)\"glBeginQueryARB\")) == NULL) || r;\r\n  r = ((glDeleteQueriesARB = (PFNGLDELETEQUERIESARBPROC)glewGetProcAddress((const GLubyte*)\"glDeleteQueriesARB\")) == NULL) || r;\r\n  r = ((glEndQueryARB = (PFNGLENDQUERYARBPROC)glewGetProcAddress((const GLubyte*)\"glEndQueryARB\")) == NULL) || r;\r\n  r = ((glGenQueriesARB = (PFNGLGENQUERIESARBPROC)glewGetProcAddress((const GLubyte*)\"glGenQueriesARB\")) == NULL) || r;\r\n  r = ((glGetQueryObjectivARB = (PFNGLGETQUERYOBJECTIVARBPROC)glewGetProcAddress((const GLubyte*)\"glGetQueryObjectivARB\")) == NULL) || r;\r\n  r = ((glGetQueryObjectuivARB = (PFNGLGETQUERYOBJECTUIVARBPROC)glewGetProcAddress((const GLubyte*)\"glGetQueryObjectuivARB\")) == NULL) || r;\r\n  r = ((glGetQueryivARB = (PFNGLGETQUERYIVARBPROC)glewGetProcAddress((const GLubyte*)\"glGetQueryivARB\")) == NULL) || r;\r\n  r = ((glIsQueryARB = (PFNGLISQUERYARBPROC)glewGetProcAddress((const GLubyte*)\"glIsQueryARB\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_ARB_occlusion_query */\r\n\r\n#ifdef GL_ARB_pixel_buffer_object\r\n\r\n#endif /* GL_ARB_pixel_buffer_object */\r\n\r\n#ifdef GL_ARB_point_parameters\r\n\r\nstatic GLboolean _glewInit_GL_ARB_point_parameters (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glPointParameterfARB = (PFNGLPOINTPARAMETERFARBPROC)glewGetProcAddress((const GLubyte*)\"glPointParameterfARB\")) == NULL) || r;\r\n  r = ((glPointParameterfvARB = (PFNGLPOINTPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)\"glPointParameterfvARB\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_ARB_point_parameters */\r\n\r\n#ifdef GL_ARB_point_sprite\r\n\r\n#endif /* GL_ARB_point_sprite */\r\n\r\n#ifdef GL_ARB_provoking_vertex\r\n\r\nstatic GLboolean _glewInit_GL_ARB_provoking_vertex (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glProvokingVertex = (PFNGLPROVOKINGVERTEXPROC)glewGetProcAddress((const GLubyte*)\"glProvokingVertex\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_ARB_provoking_vertex */\r\n\r\n#ifdef GL_ARB_sample_shading\r\n\r\nstatic GLboolean _glewInit_GL_ARB_sample_shading (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glMinSampleShadingARB = (PFNGLMINSAMPLESHADINGARBPROC)glewGetProcAddress((const GLubyte*)\"glMinSampleShadingARB\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_ARB_sample_shading */\r\n\r\n#ifdef GL_ARB_seamless_cube_map\r\n\r\n#endif /* GL_ARB_seamless_cube_map */\r\n\r\n#ifdef GL_ARB_shader_objects\r\n\r\nstatic GLboolean _glewInit_GL_ARB_shader_objects (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)glewGetProcAddress((const GLubyte*)\"glAttachObjectARB\")) == NULL) || r;\r\n  r = ((glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)glewGetProcAddress((const GLubyte*)\"glCompileShaderARB\")) == NULL) || r;\r\n  r = ((glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)glewGetProcAddress((const GLubyte*)\"glCreateProgramObjectARB\")) == NULL) || r;\r\n  r = ((glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)glewGetProcAddress((const GLubyte*)\"glCreateShaderObjectARB\")) == NULL) || r;\r\n  r = ((glDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC)glewGetProcAddress((const GLubyte*)\"glDeleteObjectARB\")) == NULL) || r;\r\n  r = ((glDetachObjectARB = (PFNGLDETACHOBJECTARBPROC)glewGetProcAddress((const GLubyte*)\"glDetachObjectARB\")) == NULL) || r;\r\n  r = ((glGetActiveUniformARB = (PFNGLGETACTIVEUNIFORMARBPROC)glewGetProcAddress((const GLubyte*)\"glGetActiveUniformARB\")) == NULL) || r;\r\n  r = ((glGetAttachedObjectsARB = (PFNGLGETATTACHEDOBJECTSARBPROC)glewGetProcAddress((const GLubyte*)\"glGetAttachedObjectsARB\")) == NULL) || r;\r\n  r = ((glGetHandleARB = (PFNGLGETHANDLEARBPROC)glewGetProcAddress((const GLubyte*)\"glGetHandleARB\")) == NULL) || r;\r\n  r = ((glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC)glewGetProcAddress((const GLubyte*)\"glGetInfoLogARB\")) == NULL) || r;\r\n  r = ((glGetObjectParameterfvARB = (PFNGLGETOBJECTPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)\"glGetObjectParameterfvARB\")) == NULL) || r;\r\n  r = ((glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC)glewGetProcAddress((const GLubyte*)\"glGetObjectParameterivARB\")) == NULL) || r;\r\n  r = ((glGetShaderSourceARB = (PFNGLGETSHADERSOURCEARBPROC)glewGetProcAddress((const GLubyte*)\"glGetShaderSourceARB\")) == NULL) || r;\r\n  r = ((glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)glewGetProcAddress((const GLubyte*)\"glGetUniformLocationARB\")) == NULL) || r;\r\n  r = ((glGetUniformfvARB = (PFNGLGETUNIFORMFVARBPROC)glewGetProcAddress((const GLubyte*)\"glGetUniformfvARB\")) == NULL) || r;\r\n  r = ((glGetUniformivARB = (PFNGLGETUNIFORMIVARBPROC)glewGetProcAddress((const GLubyte*)\"glGetUniformivARB\")) == NULL) || r;\r\n  r = ((glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)\"glLinkProgramARB\")) == NULL) || r;\r\n  r = ((glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)glewGetProcAddress((const GLubyte*)\"glShaderSourceARB\")) == NULL) || r;\r\n  r = ((glUniform1fARB = (PFNGLUNIFORM1FARBPROC)glewGetProcAddress((const GLubyte*)\"glUniform1fARB\")) == NULL) || r;\r\n  r = ((glUniform1fvARB = (PFNGLUNIFORM1FVARBPROC)glewGetProcAddress((const GLubyte*)\"glUniform1fvARB\")) == NULL) || r;\r\n  r = ((glUniform1iARB = (PFNGLUNIFORM1IARBPROC)glewGetProcAddress((const GLubyte*)\"glUniform1iARB\")) == NULL) || r;\r\n  r = ((glUniform1ivARB = (PFNGLUNIFORM1IVARBPROC)glewGetProcAddress((const GLubyte*)\"glUniform1ivARB\")) == NULL) || r;\r\n  r = ((glUniform2fARB = (PFNGLUNIFORM2FARBPROC)glewGetProcAddress((const GLubyte*)\"glUniform2fARB\")) == NULL) || r;\r\n  r = ((glUniform2fvARB = (PFNGLUNIFORM2FVARBPROC)glewGetProcAddress((const GLubyte*)\"glUniform2fvARB\")) == NULL) || r;\r\n  r = ((glUniform2iARB = (PFNGLUNIFORM2IARBPROC)glewGetProcAddress((const GLubyte*)\"glUniform2iARB\")) == NULL) || r;\r\n  r = ((glUniform2ivARB = (PFNGLUNIFORM2IVARBPROC)glewGetProcAddress((const GLubyte*)\"glUniform2ivARB\")) == NULL) || r;\r\n  r = ((glUniform3fARB = (PFNGLUNIFORM3FARBPROC)glewGetProcAddress((const GLubyte*)\"glUniform3fARB\")) == NULL) || r;\r\n  r = ((glUniform3fvARB = (PFNGLUNIFORM3FVARBPROC)glewGetProcAddress((const GLubyte*)\"glUniform3fvARB\")) == NULL) || r;\r\n  r = ((glUniform3iARB = (PFNGLUNIFORM3IARBPROC)glewGetProcAddress((const GLubyte*)\"glUniform3iARB\")) == NULL) || r;\r\n  r = ((glUniform3ivARB = (PFNGLUNIFORM3IVARBPROC)glewGetProcAddress((const GLubyte*)\"glUniform3ivARB\")) == NULL) || r;\r\n  r = ((glUniform4fARB = (PFNGLUNIFORM4FARBPROC)glewGetProcAddress((const GLubyte*)\"glUniform4fARB\")) == NULL) || r;\r\n  r = ((glUniform4fvARB = (PFNGLUNIFORM4FVARBPROC)glewGetProcAddress((const GLubyte*)\"glUniform4fvARB\")) == NULL) || r;\r\n  r = ((glUniform4iARB = (PFNGLUNIFORM4IARBPROC)glewGetProcAddress((const GLubyte*)\"glUniform4iARB\")) == NULL) || r;\r\n  r = ((glUniform4ivARB = (PFNGLUNIFORM4IVARBPROC)glewGetProcAddress((const GLubyte*)\"glUniform4ivARB\")) == NULL) || r;\r\n  r = ((glUniformMatrix2fvARB = (PFNGLUNIFORMMATRIX2FVARBPROC)glewGetProcAddress((const GLubyte*)\"glUniformMatrix2fvARB\")) == NULL) || r;\r\n  r = ((glUniformMatrix3fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC)glewGetProcAddress((const GLubyte*)\"glUniformMatrix3fvARB\")) == NULL) || r;\r\n  r = ((glUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC)glewGetProcAddress((const GLubyte*)\"glUniformMatrix4fvARB\")) == NULL) || r;\r\n  r = ((glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)glewGetProcAddress((const GLubyte*)\"glUseProgramObjectARB\")) == NULL) || r;\r\n  r = ((glValidateProgramARB = (PFNGLVALIDATEPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)\"glValidateProgramARB\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_ARB_shader_objects */\r\n\r\n#ifdef GL_ARB_shader_texture_lod\r\n\r\n#endif /* GL_ARB_shader_texture_lod */\r\n\r\n#ifdef GL_ARB_shading_language_100\r\n\r\n#endif /* GL_ARB_shading_language_100 */\r\n\r\n#ifdef GL_ARB_shadow\r\n\r\n#endif /* GL_ARB_shadow */\r\n\r\n#ifdef GL_ARB_shadow_ambient\r\n\r\n#endif /* GL_ARB_shadow_ambient */\r\n\r\n#ifdef GL_ARB_sync\r\n\r\nstatic GLboolean _glewInit_GL_ARB_sync (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glClientWaitSync = (PFNGLCLIENTWAITSYNCPROC)glewGetProcAddress((const GLubyte*)\"glClientWaitSync\")) == NULL) || r;\r\n  r = ((glDeleteSync = (PFNGLDELETESYNCPROC)glewGetProcAddress((const GLubyte*)\"glDeleteSync\")) == NULL) || r;\r\n  r = ((glFenceSync = (PFNGLFENCESYNCPROC)glewGetProcAddress((const GLubyte*)\"glFenceSync\")) == NULL) || r;\r\n  r = ((glGetInteger64v = (PFNGLGETINTEGER64VPROC)glewGetProcAddress((const GLubyte*)\"glGetInteger64v\")) == NULL) || r;\r\n  r = ((glGetSynciv = (PFNGLGETSYNCIVPROC)glewGetProcAddress((const GLubyte*)\"glGetSynciv\")) == NULL) || r;\r\n  r = ((glIsSync = (PFNGLISSYNCPROC)glewGetProcAddress((const GLubyte*)\"glIsSync\")) == NULL) || r;\r\n  r = ((glWaitSync = (PFNGLWAITSYNCPROC)glewGetProcAddress((const GLubyte*)\"glWaitSync\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_ARB_sync */\r\n\r\n#ifdef GL_ARB_texture_border_clamp\r\n\r\n#endif /* GL_ARB_texture_border_clamp */\r\n\r\n#ifdef GL_ARB_texture_buffer_object\r\n\r\nstatic GLboolean _glewInit_GL_ARB_texture_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glTexBufferARB = (PFNGLTEXBUFFERARBPROC)glewGetProcAddress((const GLubyte*)\"glTexBufferARB\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_ARB_texture_buffer_object */\r\n\r\n#ifdef GL_ARB_texture_compression\r\n\r\nstatic GLboolean _glewInit_GL_ARB_texture_compression (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glCompressedTexImage1DARB = (PFNGLCOMPRESSEDTEXIMAGE1DARBPROC)glewGetProcAddress((const GLubyte*)\"glCompressedTexImage1DARB\")) == NULL) || r;\r\n  r = ((glCompressedTexImage2DARB = (PFNGLCOMPRESSEDTEXIMAGE2DARBPROC)glewGetProcAddress((const GLubyte*)\"glCompressedTexImage2DARB\")) == NULL) || r;\r\n  r = ((glCompressedTexImage3DARB = (PFNGLCOMPRESSEDTEXIMAGE3DARBPROC)glewGetProcAddress((const GLubyte*)\"glCompressedTexImage3DARB\")) == NULL) || r;\r\n  r = ((glCompressedTexSubImage1DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC)glewGetProcAddress((const GLubyte*)\"glCompressedTexSubImage1DARB\")) == NULL) || r;\r\n  r = ((glCompressedTexSubImage2DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC)glewGetProcAddress((const GLubyte*)\"glCompressedTexSubImage2DARB\")) == NULL) || r;\r\n  r = ((glCompressedTexSubImage3DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC)glewGetProcAddress((const GLubyte*)\"glCompressedTexSubImage3DARB\")) == NULL) || r;\r\n  r = ((glGetCompressedTexImageARB = (PFNGLGETCOMPRESSEDTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)\"glGetCompressedTexImageARB\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_ARB_texture_compression */\r\n\r\n#ifdef GL_ARB_texture_compression_rgtc\r\n\r\n#endif /* GL_ARB_texture_compression_rgtc */\r\n\r\n#ifdef GL_ARB_texture_cube_map\r\n\r\n#endif /* GL_ARB_texture_cube_map */\r\n\r\n#ifdef GL_ARB_texture_cube_map_array\r\n\r\n#endif /* GL_ARB_texture_cube_map_array */\r\n\r\n#ifdef GL_ARB_texture_env_add\r\n\r\n#endif /* GL_ARB_texture_env_add */\r\n\r\n#ifdef GL_ARB_texture_env_combine\r\n\r\n#endif /* GL_ARB_texture_env_combine */\r\n\r\n#ifdef GL_ARB_texture_env_crossbar\r\n\r\n#endif /* GL_ARB_texture_env_crossbar */\r\n\r\n#ifdef GL_ARB_texture_env_dot3\r\n\r\n#endif /* GL_ARB_texture_env_dot3 */\r\n\r\n#ifdef GL_ARB_texture_float\r\n\r\n#endif /* GL_ARB_texture_float */\r\n\r\n#ifdef GL_ARB_texture_gather\r\n\r\n#endif /* GL_ARB_texture_gather */\r\n\r\n#ifdef GL_ARB_texture_mirrored_repeat\r\n\r\n#endif /* GL_ARB_texture_mirrored_repeat */\r\n\r\n#ifdef GL_ARB_texture_multisample\r\n\r\nstatic GLboolean _glewInit_GL_ARB_texture_multisample (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glGetMultisamplefv = (PFNGLGETMULTISAMPLEFVPROC)glewGetProcAddress((const GLubyte*)\"glGetMultisamplefv\")) == NULL) || r;\r\n  r = ((glSampleMaski = (PFNGLSAMPLEMASKIPROC)glewGetProcAddress((const GLubyte*)\"glSampleMaski\")) == NULL) || r;\r\n  r = ((glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)\"glTexImage2DMultisample\")) == NULL) || r;\r\n  r = ((glTexImage3DMultisample = (PFNGLTEXIMAGE3DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)\"glTexImage3DMultisample\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_ARB_texture_multisample */\r\n\r\n#ifdef GL_ARB_texture_non_power_of_two\r\n\r\n#endif /* GL_ARB_texture_non_power_of_two */\r\n\r\n#ifdef GL_ARB_texture_query_lod\r\n\r\n#endif /* GL_ARB_texture_query_lod */\r\n\r\n#ifdef GL_ARB_texture_rectangle\r\n\r\n#endif /* GL_ARB_texture_rectangle */\r\n\r\n#ifdef GL_ARB_texture_rg\r\n\r\n#endif /* GL_ARB_texture_rg */\r\n\r\n#ifdef GL_ARB_transpose_matrix\r\n\r\nstatic GLboolean _glewInit_GL_ARB_transpose_matrix (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glLoadTransposeMatrixdARB = (PFNGLLOADTRANSPOSEMATRIXDARBPROC)glewGetProcAddress((const GLubyte*)\"glLoadTransposeMatrixdARB\")) == NULL) || r;\r\n  r = ((glLoadTransposeMatrixfARB = (PFNGLLOADTRANSPOSEMATRIXFARBPROC)glewGetProcAddress((const GLubyte*)\"glLoadTransposeMatrixfARB\")) == NULL) || r;\r\n  r = ((glMultTransposeMatrixdARB = (PFNGLMULTTRANSPOSEMATRIXDARBPROC)glewGetProcAddress((const GLubyte*)\"glMultTransposeMatrixdARB\")) == NULL) || r;\r\n  r = ((glMultTransposeMatrixfARB = (PFNGLMULTTRANSPOSEMATRIXFARBPROC)glewGetProcAddress((const GLubyte*)\"glMultTransposeMatrixfARB\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_ARB_transpose_matrix */\r\n\r\n#ifdef GL_ARB_uniform_buffer_object\r\n\r\nstatic GLboolean _glewInit_GL_ARB_uniform_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glBindBufferBase = (PFNGLBINDBUFFERBASEPROC)glewGetProcAddress((const GLubyte*)\"glBindBufferBase\")) == NULL) || r;\r\n  r = ((glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)\"glBindBufferRange\")) == NULL) || r;\r\n  r = ((glGetActiveUniformBlockName = (PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC)glewGetProcAddress((const GLubyte*)\"glGetActiveUniformBlockName\")) == NULL) || r;\r\n  r = ((glGetActiveUniformBlockiv = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC)glewGetProcAddress((const GLubyte*)\"glGetActiveUniformBlockiv\")) == NULL) || r;\r\n  r = ((glGetActiveUniformName = (PFNGLGETACTIVEUNIFORMNAMEPROC)glewGetProcAddress((const GLubyte*)\"glGetActiveUniformName\")) == NULL) || r;\r\n  r = ((glGetActiveUniformsiv = (PFNGLGETACTIVEUNIFORMSIVPROC)glewGetProcAddress((const GLubyte*)\"glGetActiveUniformsiv\")) == NULL) || r;\r\n  r = ((glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC)glewGetProcAddress((const GLubyte*)\"glGetIntegeri_v\")) == NULL) || r;\r\n  r = ((glGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC)glewGetProcAddress((const GLubyte*)\"glGetUniformBlockIndex\")) == NULL) || r;\r\n  r = ((glGetUniformIndices = (PFNGLGETUNIFORMINDICESPROC)glewGetProcAddress((const GLubyte*)\"glGetUniformIndices\")) == NULL) || r;\r\n  r = ((glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC)glewGetProcAddress((const GLubyte*)\"glUniformBlockBinding\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_ARB_uniform_buffer_object */\r\n\r\n#ifdef GL_ARB_vertex_array_bgra\r\n\r\n#endif /* GL_ARB_vertex_array_bgra */\r\n\r\n#ifdef GL_ARB_vertex_array_object\r\n\r\nstatic GLboolean _glewInit_GL_ARB_vertex_array_object (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC)glewGetProcAddress((const GLubyte*)\"glBindVertexArray\")) == NULL) || r;\r\n  r = ((glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC)glewGetProcAddress((const GLubyte*)\"glDeleteVertexArrays\")) == NULL) || r;\r\n  r = ((glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC)glewGetProcAddress((const GLubyte*)\"glGenVertexArrays\")) == NULL) || r;\r\n  r = ((glIsVertexArray = (PFNGLISVERTEXARRAYPROC)glewGetProcAddress((const GLubyte*)\"glIsVertexArray\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_ARB_vertex_array_object */\r\n\r\n#ifdef GL_ARB_vertex_blend\r\n\r\nstatic GLboolean _glewInit_GL_ARB_vertex_blend (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glVertexBlendARB = (PFNGLVERTEXBLENDARBPROC)glewGetProcAddress((const GLubyte*)\"glVertexBlendARB\")) == NULL) || r;\r\n  r = ((glWeightPointerARB = (PFNGLWEIGHTPOINTERARBPROC)glewGetProcAddress((const GLubyte*)\"glWeightPointerARB\")) == NULL) || r;\r\n  r = ((glWeightbvARB = (PFNGLWEIGHTBVARBPROC)glewGetProcAddress((const GLubyte*)\"glWeightbvARB\")) == NULL) || r;\r\n  r = ((glWeightdvARB = (PFNGLWEIGHTDVARBPROC)glewGetProcAddress((const GLubyte*)\"glWeightdvARB\")) == NULL) || r;\r\n  r = ((glWeightfvARB = (PFNGLWEIGHTFVARBPROC)glewGetProcAddress((const GLubyte*)\"glWeightfvARB\")) == NULL) || r;\r\n  r = ((glWeightivARB = (PFNGLWEIGHTIVARBPROC)glewGetProcAddress((const GLubyte*)\"glWeightivARB\")) == NULL) || r;\r\n  r = ((glWeightsvARB = (PFNGLWEIGHTSVARBPROC)glewGetProcAddress((const GLubyte*)\"glWeightsvARB\")) == NULL) || r;\r\n  r = ((glWeightubvARB = (PFNGLWEIGHTUBVARBPROC)glewGetProcAddress((const GLubyte*)\"glWeightubvARB\")) == NULL) || r;\r\n  r = ((glWeightuivARB = (PFNGLWEIGHTUIVARBPROC)glewGetProcAddress((const GLubyte*)\"glWeightuivARB\")) == NULL) || r;\r\n  r = ((glWeightusvARB = (PFNGLWEIGHTUSVARBPROC)glewGetProcAddress((const GLubyte*)\"glWeightusvARB\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_ARB_vertex_blend */\r\n\r\n#ifdef GL_ARB_vertex_buffer_object\r\n\r\nstatic GLboolean _glewInit_GL_ARB_vertex_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glBindBufferARB = (PFNGLBINDBUFFERARBPROC)glewGetProcAddress((const GLubyte*)\"glBindBufferARB\")) == NULL) || r;\r\n  r = ((glBufferDataARB = (PFNGLBUFFERDATAARBPROC)glewGetProcAddress((const GLubyte*)\"glBufferDataARB\")) == NULL) || r;\r\n  r = ((glBufferSubDataARB = (PFNGLBUFFERSUBDATAARBPROC)glewGetProcAddress((const GLubyte*)\"glBufferSubDataARB\")) == NULL) || r;\r\n  r = ((glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC)glewGetProcAddress((const GLubyte*)\"glDeleteBuffersARB\")) == NULL) || r;\r\n  r = ((glGenBuffersARB = (PFNGLGENBUFFERSARBPROC)glewGetProcAddress((const GLubyte*)\"glGenBuffersARB\")) == NULL) || r;\r\n  r = ((glGetBufferParameterivARB = (PFNGLGETBUFFERPARAMETERIVARBPROC)glewGetProcAddress((const GLubyte*)\"glGetBufferParameterivARB\")) == NULL) || r;\r\n  r = ((glGetBufferPointervARB = (PFNGLGETBUFFERPOINTERVARBPROC)glewGetProcAddress((const GLubyte*)\"glGetBufferPointervARB\")) == NULL) || r;\r\n  r = ((glGetBufferSubDataARB = (PFNGLGETBUFFERSUBDATAARBPROC)glewGetProcAddress((const GLubyte*)\"glGetBufferSubDataARB\")) == NULL) || r;\r\n  r = ((glIsBufferARB = (PFNGLISBUFFERARBPROC)glewGetProcAddress((const GLubyte*)\"glIsBufferARB\")) == NULL) || r;\r\n  r = ((glMapBufferARB = (PFNGLMAPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)\"glMapBufferARB\")) == NULL) || r;\r\n  r = ((glUnmapBufferARB = (PFNGLUNMAPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)\"glUnmapBufferARB\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_ARB_vertex_buffer_object */\r\n\r\n#ifdef GL_ARB_vertex_program\r\n\r\nstatic GLboolean _glewInit_GL_ARB_vertex_program (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glBindProgramARB = (PFNGLBINDPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)\"glBindProgramARB\")) == NULL) || r;\r\n  r = ((glDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC)glewGetProcAddress((const GLubyte*)\"glDeleteProgramsARB\")) == NULL) || r;\r\n  r = ((glDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC)glewGetProcAddress((const GLubyte*)\"glDisableVertexAttribArrayARB\")) == NULL) || r;\r\n  r = ((glEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC)glewGetProcAddress((const GLubyte*)\"glEnableVertexAttribArrayARB\")) == NULL) || r;\r\n  r = ((glGenProgramsARB = (PFNGLGENPROGRAMSARBPROC)glewGetProcAddress((const GLubyte*)\"glGenProgramsARB\")) == NULL) || r;\r\n  r = ((glGetProgramEnvParameterdvARB = (PFNGLGETPROGRAMENVPARAMETERDVARBPROC)glewGetProcAddress((const GLubyte*)\"glGetProgramEnvParameterdvARB\")) == NULL) || r;\r\n  r = ((glGetProgramEnvParameterfvARB = (PFNGLGETPROGRAMENVPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)\"glGetProgramEnvParameterfvARB\")) == NULL) || r;\r\n  r = ((glGetProgramLocalParameterdvARB = (PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC)glewGetProcAddress((const GLubyte*)\"glGetProgramLocalParameterdvARB\")) == NULL) || r;\r\n  r = ((glGetProgramLocalParameterfvARB = (PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)\"glGetProgramLocalParameterfvARB\")) == NULL) || r;\r\n  r = ((glGetProgramStringARB = (PFNGLGETPROGRAMSTRINGARBPROC)glewGetProcAddress((const GLubyte*)\"glGetProgramStringARB\")) == NULL) || r;\r\n  r = ((glGetProgramivARB = (PFNGLGETPROGRAMIVARBPROC)glewGetProcAddress((const GLubyte*)\"glGetProgramivARB\")) == NULL) || r;\r\n  r = ((glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC)glewGetProcAddress((const GLubyte*)\"glGetVertexAttribPointervARB\")) == NULL) || r;\r\n  r = ((glGetVertexAttribdvARB = (PFNGLGETVERTEXATTRIBDVARBPROC)glewGetProcAddress((const GLubyte*)\"glGetVertexAttribdvARB\")) == NULL) || r;\r\n  r = ((glGetVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC)glewGetProcAddress((const GLubyte*)\"glGetVertexAttribfvARB\")) == NULL) || r;\r\n  r = ((glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC)glewGetProcAddress((const GLubyte*)\"glGetVertexAttribivARB\")) == NULL) || r;\r\n  r = ((glIsProgramARB = (PFNGLISPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)\"glIsProgramARB\")) == NULL) || r;\r\n  r = ((glProgramEnvParameter4dARB = (PFNGLPROGRAMENVPARAMETER4DARBPROC)glewGetProcAddress((const GLubyte*)\"glProgramEnvParameter4dARB\")) == NULL) || r;\r\n  r = ((glProgramEnvParameter4dvARB = (PFNGLPROGRAMENVPARAMETER4DVARBPROC)glewGetProcAddress((const GLubyte*)\"glProgramEnvParameter4dvARB\")) == NULL) || r;\r\n  r = ((glProgramEnvParameter4fARB = (PFNGLPROGRAMENVPARAMETER4FARBPROC)glewGetProcAddress((const GLubyte*)\"glProgramEnvParameter4fARB\")) == NULL) || r;\r\n  r = ((glProgramEnvParameter4fvARB = (PFNGLPROGRAMENVPARAMETER4FVARBPROC)glewGetProcAddress((const GLubyte*)\"glProgramEnvParameter4fvARB\")) == NULL) || r;\r\n  r = ((glProgramLocalParameter4dARB = (PFNGLPROGRAMLOCALPARAMETER4DARBPROC)glewGetProcAddress((const GLubyte*)\"glProgramLocalParameter4dARB\")) == NULL) || r;\r\n  r = ((glProgramLocalParameter4dvARB = (PFNGLPROGRAMLOCALPARAMETER4DVARBPROC)glewGetProcAddress((const GLubyte*)\"glProgramLocalParameter4dvARB\")) == NULL) || r;\r\n  r = ((glProgramLocalParameter4fARB = (PFNGLPROGRAMLOCALPARAMETER4FARBPROC)glewGetProcAddress((const GLubyte*)\"glProgramLocalParameter4fARB\")) == NULL) || r;\r\n  r = ((glProgramLocalParameter4fvARB = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC)glewGetProcAddress((const GLubyte*)\"glProgramLocalParameter4fvARB\")) == NULL) || r;\r\n  r = ((glProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC)glewGetProcAddress((const GLubyte*)\"glProgramStringARB\")) == NULL) || r;\r\n  r = ((glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib1dARB\")) == NULL) || r;\r\n  r = ((glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib1dvARB\")) == NULL) || r;\r\n  r = ((glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib1fARB\")) == NULL) || r;\r\n  r = ((glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib1fvARB\")) == NULL) || r;\r\n  r = ((glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib1sARB\")) == NULL) || r;\r\n  r = ((glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib1svARB\")) == NULL) || r;\r\n  r = ((glVertexAttrib2dARB = (PFNGLVERTEXATTRIB2DARBPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib2dARB\")) == NULL) || r;\r\n  r = ((glVertexAttrib2dvARB = (PFNGLVERTEXATTRIB2DVARBPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib2dvARB\")) == NULL) || r;\r\n  r = ((glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib2fARB\")) == NULL) || r;\r\n  r = ((glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib2fvARB\")) == NULL) || r;\r\n  r = ((glVertexAttrib2sARB = (PFNGLVERTEXATTRIB2SARBPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib2sARB\")) == NULL) || r;\r\n  r = ((glVertexAttrib2svARB = (PFNGLVERTEXATTRIB2SVARBPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib2svARB\")) == NULL) || r;\r\n  r = ((glVertexAttrib3dARB = (PFNGLVERTEXATTRIB3DARBPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib3dARB\")) == NULL) || r;\r\n  r = ((glVertexAttrib3dvARB = (PFNGLVERTEXATTRIB3DVARBPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib3dvARB\")) == NULL) || r;\r\n  r = ((glVertexAttrib3fARB = (PFNGLVERTEXATTRIB3FARBPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib3fARB\")) == NULL) || r;\r\n  r = ((glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib3fvARB\")) == NULL) || r;\r\n  r = ((glVertexAttrib3sARB = (PFNGLVERTEXATTRIB3SARBPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib3sARB\")) == NULL) || r;\r\n  r = ((glVertexAttrib3svARB = (PFNGLVERTEXATTRIB3SVARBPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib3svARB\")) == NULL) || r;\r\n  r = ((glVertexAttrib4NbvARB = (PFNGLVERTEXATTRIB4NBVARBPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4NbvARB\")) == NULL) || r;\r\n  r = ((glVertexAttrib4NivARB = (PFNGLVERTEXATTRIB4NIVARBPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4NivARB\")) == NULL) || r;\r\n  r = ((glVertexAttrib4NsvARB = (PFNGLVERTEXATTRIB4NSVARBPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4NsvARB\")) == NULL) || r;\r\n  r = ((glVertexAttrib4NubARB = (PFNGLVERTEXATTRIB4NUBARBPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4NubARB\")) == NULL) || r;\r\n  r = ((glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4NubvARB\")) == NULL) || r;\r\n  r = ((glVertexAttrib4NuivARB = (PFNGLVERTEXATTRIB4NUIVARBPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4NuivARB\")) == NULL) || r;\r\n  r = ((glVertexAttrib4NusvARB = (PFNGLVERTEXATTRIB4NUSVARBPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4NusvARB\")) == NULL) || r;\r\n  r = ((glVertexAttrib4bvARB = (PFNGLVERTEXATTRIB4BVARBPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4bvARB\")) == NULL) || r;\r\n  r = ((glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4dARB\")) == NULL) || r;\r\n  r = ((glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4dvARB\")) == NULL) || r;\r\n  r = ((glVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4fARB\")) == NULL) || r;\r\n  r = ((glVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4fvARB\")) == NULL) || r;\r\n  r = ((glVertexAttrib4ivARB = (PFNGLVERTEXATTRIB4IVARBPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4ivARB\")) == NULL) || r;\r\n  r = ((glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4sARB\")) == NULL) || r;\r\n  r = ((glVertexAttrib4svARB = (PFNGLVERTEXATTRIB4SVARBPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4svARB\")) == NULL) || r;\r\n  r = ((glVertexAttrib4ubvARB = (PFNGLVERTEXATTRIB4UBVARBPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4ubvARB\")) == NULL) || r;\r\n  r = ((glVertexAttrib4uivARB = (PFNGLVERTEXATTRIB4UIVARBPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4uivARB\")) == NULL) || r;\r\n  r = ((glVertexAttrib4usvARB = (PFNGLVERTEXATTRIB4USVARBPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4usvARB\")) == NULL) || r;\r\n  r = ((glVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribPointerARB\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_ARB_vertex_program */\r\n\r\n#ifdef GL_ARB_vertex_shader\r\n\r\nstatic GLboolean _glewInit_GL_ARB_vertex_shader (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glBindAttribLocationARB = (PFNGLBINDATTRIBLOCATIONARBPROC)glewGetProcAddress((const GLubyte*)\"glBindAttribLocationARB\")) == NULL) || r;\r\n  r = ((glGetActiveAttribARB = (PFNGLGETACTIVEATTRIBARBPROC)glewGetProcAddress((const GLubyte*)\"glGetActiveAttribARB\")) == NULL) || r;\r\n  r = ((glGetAttribLocationARB = (PFNGLGETATTRIBLOCATIONARBPROC)glewGetProcAddress((const GLubyte*)\"glGetAttribLocationARB\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_ARB_vertex_shader */\r\n\r\n#ifdef GL_ARB_window_pos\r\n\r\nstatic GLboolean _glewInit_GL_ARB_window_pos (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glWindowPos2dARB = (PFNGLWINDOWPOS2DARBPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos2dARB\")) == NULL) || r;\r\n  r = ((glWindowPos2dvARB = (PFNGLWINDOWPOS2DVARBPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos2dvARB\")) == NULL) || r;\r\n  r = ((glWindowPos2fARB = (PFNGLWINDOWPOS2FARBPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos2fARB\")) == NULL) || r;\r\n  r = ((glWindowPos2fvARB = (PFNGLWINDOWPOS2FVARBPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos2fvARB\")) == NULL) || r;\r\n  r = ((glWindowPos2iARB = (PFNGLWINDOWPOS2IARBPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos2iARB\")) == NULL) || r;\r\n  r = ((glWindowPos2ivARB = (PFNGLWINDOWPOS2IVARBPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos2ivARB\")) == NULL) || r;\r\n  r = ((glWindowPos2sARB = (PFNGLWINDOWPOS2SARBPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos2sARB\")) == NULL) || r;\r\n  r = ((glWindowPos2svARB = (PFNGLWINDOWPOS2SVARBPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos2svARB\")) == NULL) || r;\r\n  r = ((glWindowPos3dARB = (PFNGLWINDOWPOS3DARBPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos3dARB\")) == NULL) || r;\r\n  r = ((glWindowPos3dvARB = (PFNGLWINDOWPOS3DVARBPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos3dvARB\")) == NULL) || r;\r\n  r = ((glWindowPos3fARB = (PFNGLWINDOWPOS3FARBPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos3fARB\")) == NULL) || r;\r\n  r = ((glWindowPos3fvARB = (PFNGLWINDOWPOS3FVARBPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos3fvARB\")) == NULL) || r;\r\n  r = ((glWindowPos3iARB = (PFNGLWINDOWPOS3IARBPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos3iARB\")) == NULL) || r;\r\n  r = ((glWindowPos3ivARB = (PFNGLWINDOWPOS3IVARBPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos3ivARB\")) == NULL) || r;\r\n  r = ((glWindowPos3sARB = (PFNGLWINDOWPOS3SARBPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos3sARB\")) == NULL) || r;\r\n  r = ((glWindowPos3svARB = (PFNGLWINDOWPOS3SVARBPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos3svARB\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_ARB_window_pos */\r\n\r\n#ifdef GL_ATIX_point_sprites\r\n\r\n#endif /* GL_ATIX_point_sprites */\r\n\r\n#ifdef GL_ATIX_texture_env_combine3\r\n\r\n#endif /* GL_ATIX_texture_env_combine3 */\r\n\r\n#ifdef GL_ATIX_texture_env_route\r\n\r\n#endif /* GL_ATIX_texture_env_route */\r\n\r\n#ifdef GL_ATIX_vertex_shader_output_point_size\r\n\r\n#endif /* GL_ATIX_vertex_shader_output_point_size */\r\n\r\n#ifdef GL_ATI_draw_buffers\r\n\r\nstatic GLboolean _glewInit_GL_ATI_draw_buffers (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glDrawBuffersATI = (PFNGLDRAWBUFFERSATIPROC)glewGetProcAddress((const GLubyte*)\"glDrawBuffersATI\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_ATI_draw_buffers */\r\n\r\n#ifdef GL_ATI_element_array\r\n\r\nstatic GLboolean _glewInit_GL_ATI_element_array (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glDrawElementArrayATI = (PFNGLDRAWELEMENTARRAYATIPROC)glewGetProcAddress((const GLubyte*)\"glDrawElementArrayATI\")) == NULL) || r;\r\n  r = ((glDrawRangeElementArrayATI = (PFNGLDRAWRANGEELEMENTARRAYATIPROC)glewGetProcAddress((const GLubyte*)\"glDrawRangeElementArrayATI\")) == NULL) || r;\r\n  r = ((glElementPointerATI = (PFNGLELEMENTPOINTERATIPROC)glewGetProcAddress((const GLubyte*)\"glElementPointerATI\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_ATI_element_array */\r\n\r\n#ifdef GL_ATI_envmap_bumpmap\r\n\r\nstatic GLboolean _glewInit_GL_ATI_envmap_bumpmap (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glGetTexBumpParameterfvATI = (PFNGLGETTEXBUMPPARAMETERFVATIPROC)glewGetProcAddress((const GLubyte*)\"glGetTexBumpParameterfvATI\")) == NULL) || r;\r\n  r = ((glGetTexBumpParameterivATI = (PFNGLGETTEXBUMPPARAMETERIVATIPROC)glewGetProcAddress((const GLubyte*)\"glGetTexBumpParameterivATI\")) == NULL) || r;\r\n  r = ((glTexBumpParameterfvATI = (PFNGLTEXBUMPPARAMETERFVATIPROC)glewGetProcAddress((const GLubyte*)\"glTexBumpParameterfvATI\")) == NULL) || r;\r\n  r = ((glTexBumpParameterivATI = (PFNGLTEXBUMPPARAMETERIVATIPROC)glewGetProcAddress((const GLubyte*)\"glTexBumpParameterivATI\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_ATI_envmap_bumpmap */\r\n\r\n#ifdef GL_ATI_fragment_shader\r\n\r\nstatic GLboolean _glewInit_GL_ATI_fragment_shader (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glAlphaFragmentOp1ATI = (PFNGLALPHAFRAGMENTOP1ATIPROC)glewGetProcAddress((const GLubyte*)\"glAlphaFragmentOp1ATI\")) == NULL) || r;\r\n  r = ((glAlphaFragmentOp2ATI = (PFNGLALPHAFRAGMENTOP2ATIPROC)glewGetProcAddress((const GLubyte*)\"glAlphaFragmentOp2ATI\")) == NULL) || r;\r\n  r = ((glAlphaFragmentOp3ATI = (PFNGLALPHAFRAGMENTOP3ATIPROC)glewGetProcAddress((const GLubyte*)\"glAlphaFragmentOp3ATI\")) == NULL) || r;\r\n  r = ((glBeginFragmentShaderATI = (PFNGLBEGINFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)\"glBeginFragmentShaderATI\")) == NULL) || r;\r\n  r = ((glBindFragmentShaderATI = (PFNGLBINDFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)\"glBindFragmentShaderATI\")) == NULL) || r;\r\n  r = ((glColorFragmentOp1ATI = (PFNGLCOLORFRAGMENTOP1ATIPROC)glewGetProcAddress((const GLubyte*)\"glColorFragmentOp1ATI\")) == NULL) || r;\r\n  r = ((glColorFragmentOp2ATI = (PFNGLCOLORFRAGMENTOP2ATIPROC)glewGetProcAddress((const GLubyte*)\"glColorFragmentOp2ATI\")) == NULL) || r;\r\n  r = ((glColorFragmentOp3ATI = (PFNGLCOLORFRAGMENTOP3ATIPROC)glewGetProcAddress((const GLubyte*)\"glColorFragmentOp3ATI\")) == NULL) || r;\r\n  r = ((glDeleteFragmentShaderATI = (PFNGLDELETEFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)\"glDeleteFragmentShaderATI\")) == NULL) || r;\r\n  r = ((glEndFragmentShaderATI = (PFNGLENDFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)\"glEndFragmentShaderATI\")) == NULL) || r;\r\n  r = ((glGenFragmentShadersATI = (PFNGLGENFRAGMENTSHADERSATIPROC)glewGetProcAddress((const GLubyte*)\"glGenFragmentShadersATI\")) == NULL) || r;\r\n  r = ((glPassTexCoordATI = (PFNGLPASSTEXCOORDATIPROC)glewGetProcAddress((const GLubyte*)\"glPassTexCoordATI\")) == NULL) || r;\r\n  r = ((glSampleMapATI = (PFNGLSAMPLEMAPATIPROC)glewGetProcAddress((const GLubyte*)\"glSampleMapATI\")) == NULL) || r;\r\n  r = ((glSetFragmentShaderConstantATI = (PFNGLSETFRAGMENTSHADERCONSTANTATIPROC)glewGetProcAddress((const GLubyte*)\"glSetFragmentShaderConstantATI\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_ATI_fragment_shader */\r\n\r\n#ifdef GL_ATI_map_object_buffer\r\n\r\nstatic GLboolean _glewInit_GL_ATI_map_object_buffer (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glMapObjectBufferATI = (PFNGLMAPOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)\"glMapObjectBufferATI\")) == NULL) || r;\r\n  r = ((glUnmapObjectBufferATI = (PFNGLUNMAPOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)\"glUnmapObjectBufferATI\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_ATI_map_object_buffer */\r\n\r\n#ifdef GL_ATI_meminfo\r\n\r\n#endif /* GL_ATI_meminfo */\r\n\r\n#ifdef GL_ATI_pn_triangles\r\n\r\nstatic GLboolean _glewInit_GL_ATI_pn_triangles (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glPNTrianglesfATI = (PFNGLPNTRIANGLESFATIPROC)glewGetProcAddress((const GLubyte*)\"glPNTrianglesfATI\")) == NULL) || r;\r\n  r = ((glPNTrianglesiATI = (PFNGLPNTRIANGLESIATIPROC)glewGetProcAddress((const GLubyte*)\"glPNTrianglesiATI\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_ATI_pn_triangles */\r\n\r\n#ifdef GL_ATI_separate_stencil\r\n\r\nstatic GLboolean _glewInit_GL_ATI_separate_stencil (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glStencilFuncSeparateATI = (PFNGLSTENCILFUNCSEPARATEATIPROC)glewGetProcAddress((const GLubyte*)\"glStencilFuncSeparateATI\")) == NULL) || r;\r\n  r = ((glStencilOpSeparateATI = (PFNGLSTENCILOPSEPARATEATIPROC)glewGetProcAddress((const GLubyte*)\"glStencilOpSeparateATI\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_ATI_separate_stencil */\r\n\r\n#ifdef GL_ATI_shader_texture_lod\r\n\r\n#endif /* GL_ATI_shader_texture_lod */\r\n\r\n#ifdef GL_ATI_text_fragment_shader\r\n\r\n#endif /* GL_ATI_text_fragment_shader */\r\n\r\n#ifdef GL_ATI_texture_compression_3dc\r\n\r\n#endif /* GL_ATI_texture_compression_3dc */\r\n\r\n#ifdef GL_ATI_texture_env_combine3\r\n\r\n#endif /* GL_ATI_texture_env_combine3 */\r\n\r\n#ifdef GL_ATI_texture_float\r\n\r\n#endif /* GL_ATI_texture_float */\r\n\r\n#ifdef GL_ATI_texture_mirror_once\r\n\r\n#endif /* GL_ATI_texture_mirror_once */\r\n\r\n#ifdef GL_ATI_vertex_array_object\r\n\r\nstatic GLboolean _glewInit_GL_ATI_vertex_array_object (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glArrayObjectATI = (PFNGLARRAYOBJECTATIPROC)glewGetProcAddress((const GLubyte*)\"glArrayObjectATI\")) == NULL) || r;\r\n  r = ((glFreeObjectBufferATI = (PFNGLFREEOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)\"glFreeObjectBufferATI\")) == NULL) || r;\r\n  r = ((glGetArrayObjectfvATI = (PFNGLGETARRAYOBJECTFVATIPROC)glewGetProcAddress((const GLubyte*)\"glGetArrayObjectfvATI\")) == NULL) || r;\r\n  r = ((glGetArrayObjectivATI = (PFNGLGETARRAYOBJECTIVATIPROC)glewGetProcAddress((const GLubyte*)\"glGetArrayObjectivATI\")) == NULL) || r;\r\n  r = ((glGetObjectBufferfvATI = (PFNGLGETOBJECTBUFFERFVATIPROC)glewGetProcAddress((const GLubyte*)\"glGetObjectBufferfvATI\")) == NULL) || r;\r\n  r = ((glGetObjectBufferivATI = (PFNGLGETOBJECTBUFFERIVATIPROC)glewGetProcAddress((const GLubyte*)\"glGetObjectBufferivATI\")) == NULL) || r;\r\n  r = ((glGetVariantArrayObjectfvATI = (PFNGLGETVARIANTARRAYOBJECTFVATIPROC)glewGetProcAddress((const GLubyte*)\"glGetVariantArrayObjectfvATI\")) == NULL) || r;\r\n  r = ((glGetVariantArrayObjectivATI = (PFNGLGETVARIANTARRAYOBJECTIVATIPROC)glewGetProcAddress((const GLubyte*)\"glGetVariantArrayObjectivATI\")) == NULL) || r;\r\n  r = ((glIsObjectBufferATI = (PFNGLISOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)\"glIsObjectBufferATI\")) == NULL) || r;\r\n  r = ((glNewObjectBufferATI = (PFNGLNEWOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)\"glNewObjectBufferATI\")) == NULL) || r;\r\n  r = ((glUpdateObjectBufferATI = (PFNGLUPDATEOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)\"glUpdateObjectBufferATI\")) == NULL) || r;\r\n  r = ((glVariantArrayObjectATI = (PFNGLVARIANTARRAYOBJECTATIPROC)glewGetProcAddress((const GLubyte*)\"glVariantArrayObjectATI\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_ATI_vertex_array_object */\r\n\r\n#ifdef GL_ATI_vertex_attrib_array_object\r\n\r\nstatic GLboolean _glewInit_GL_ATI_vertex_attrib_array_object (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glGetVertexAttribArrayObjectfvATI = (PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC)glewGetProcAddress((const GLubyte*)\"glGetVertexAttribArrayObjectfvATI\")) == NULL) || r;\r\n  r = ((glGetVertexAttribArrayObjectivATI = (PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC)glewGetProcAddress((const GLubyte*)\"glGetVertexAttribArrayObjectivATI\")) == NULL) || r;\r\n  r = ((glVertexAttribArrayObjectATI = (PFNGLVERTEXATTRIBARRAYOBJECTATIPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribArrayObjectATI\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_ATI_vertex_attrib_array_object */\r\n\r\n#ifdef GL_ATI_vertex_streams\r\n\r\nstatic GLboolean _glewInit_GL_ATI_vertex_streams (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glClientActiveVertexStreamATI = (PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC)glewGetProcAddress((const GLubyte*)\"glClientActiveVertexStreamATI\")) == NULL) || r;\r\n  r = ((glNormalStream3bATI = (PFNGLNORMALSTREAM3BATIPROC)glewGetProcAddress((const GLubyte*)\"glNormalStream3bATI\")) == NULL) || r;\r\n  r = ((glNormalStream3bvATI = (PFNGLNORMALSTREAM3BVATIPROC)glewGetProcAddress((const GLubyte*)\"glNormalStream3bvATI\")) == NULL) || r;\r\n  r = ((glNormalStream3dATI = (PFNGLNORMALSTREAM3DATIPROC)glewGetProcAddress((const GLubyte*)\"glNormalStream3dATI\")) == NULL) || r;\r\n  r = ((glNormalStream3dvATI = (PFNGLNORMALSTREAM3DVATIPROC)glewGetProcAddress((const GLubyte*)\"glNormalStream3dvATI\")) == NULL) || r;\r\n  r = ((glNormalStream3fATI = (PFNGLNORMALSTREAM3FATIPROC)glewGetProcAddress((const GLubyte*)\"glNormalStream3fATI\")) == NULL) || r;\r\n  r = ((glNormalStream3fvATI = (PFNGLNORMALSTREAM3FVATIPROC)glewGetProcAddress((const GLubyte*)\"glNormalStream3fvATI\")) == NULL) || r;\r\n  r = ((glNormalStream3iATI = (PFNGLNORMALSTREAM3IATIPROC)glewGetProcAddress((const GLubyte*)\"glNormalStream3iATI\")) == NULL) || r;\r\n  r = ((glNormalStream3ivATI = (PFNGLNORMALSTREAM3IVATIPROC)glewGetProcAddress((const GLubyte*)\"glNormalStream3ivATI\")) == NULL) || r;\r\n  r = ((glNormalStream3sATI = (PFNGLNORMALSTREAM3SATIPROC)glewGetProcAddress((const GLubyte*)\"glNormalStream3sATI\")) == NULL) || r;\r\n  r = ((glNormalStream3svATI = (PFNGLNORMALSTREAM3SVATIPROC)glewGetProcAddress((const GLubyte*)\"glNormalStream3svATI\")) == NULL) || r;\r\n  r = ((glVertexBlendEnvfATI = (PFNGLVERTEXBLENDENVFATIPROC)glewGetProcAddress((const GLubyte*)\"glVertexBlendEnvfATI\")) == NULL) || r;\r\n  r = ((glVertexBlendEnviATI = (PFNGLVERTEXBLENDENVIATIPROC)glewGetProcAddress((const GLubyte*)\"glVertexBlendEnviATI\")) == NULL) || r;\r\n  r = ((glVertexStream2dATI = (PFNGLVERTEXSTREAM2DATIPROC)glewGetProcAddress((const GLubyte*)\"glVertexStream2dATI\")) == NULL) || r;\r\n  r = ((glVertexStream2dvATI = (PFNGLVERTEXSTREAM2DVATIPROC)glewGetProcAddress((const GLubyte*)\"glVertexStream2dvATI\")) == NULL) || r;\r\n  r = ((glVertexStream2fATI = (PFNGLVERTEXSTREAM2FATIPROC)glewGetProcAddress((const GLubyte*)\"glVertexStream2fATI\")) == NULL) || r;\r\n  r = ((glVertexStream2fvATI = (PFNGLVERTEXSTREAM2FVATIPROC)glewGetProcAddress((const GLubyte*)\"glVertexStream2fvATI\")) == NULL) || r;\r\n  r = ((glVertexStream2iATI = (PFNGLVERTEXSTREAM2IATIPROC)glewGetProcAddress((const GLubyte*)\"glVertexStream2iATI\")) == NULL) || r;\r\n  r = ((glVertexStream2ivATI = (PFNGLVERTEXSTREAM2IVATIPROC)glewGetProcAddress((const GLubyte*)\"glVertexStream2ivATI\")) == NULL) || r;\r\n  r = ((glVertexStream2sATI = (PFNGLVERTEXSTREAM2SATIPROC)glewGetProcAddress((const GLubyte*)\"glVertexStream2sATI\")) == NULL) || r;\r\n  r = ((glVertexStream2svATI = (PFNGLVERTEXSTREAM2SVATIPROC)glewGetProcAddress((const GLubyte*)\"glVertexStream2svATI\")) == NULL) || r;\r\n  r = ((glVertexStream3dATI = (PFNGLVERTEXSTREAM3DATIPROC)glewGetProcAddress((const GLubyte*)\"glVertexStream3dATI\")) == NULL) || r;\r\n  r = ((glVertexStream3dvATI = (PFNGLVERTEXSTREAM3DVATIPROC)glewGetProcAddress((const GLubyte*)\"glVertexStream3dvATI\")) == NULL) || r;\r\n  r = ((glVertexStream3fATI = (PFNGLVERTEXSTREAM3FATIPROC)glewGetProcAddress((const GLubyte*)\"glVertexStream3fATI\")) == NULL) || r;\r\n  r = ((glVertexStream3fvATI = (PFNGLVERTEXSTREAM3FVATIPROC)glewGetProcAddress((const GLubyte*)\"glVertexStream3fvATI\")) == NULL) || r;\r\n  r = ((glVertexStream3iATI = (PFNGLVERTEXSTREAM3IATIPROC)glewGetProcAddress((const GLubyte*)\"glVertexStream3iATI\")) == NULL) || r;\r\n  r = ((glVertexStream3ivATI = (PFNGLVERTEXSTREAM3IVATIPROC)glewGetProcAddress((const GLubyte*)\"glVertexStream3ivATI\")) == NULL) || r;\r\n  r = ((glVertexStream3sATI = (PFNGLVERTEXSTREAM3SATIPROC)glewGetProcAddress((const GLubyte*)\"glVertexStream3sATI\")) == NULL) || r;\r\n  r = ((glVertexStream3svATI = (PFNGLVERTEXSTREAM3SVATIPROC)glewGetProcAddress((const GLubyte*)\"glVertexStream3svATI\")) == NULL) || r;\r\n  r = ((glVertexStream4dATI = (PFNGLVERTEXSTREAM4DATIPROC)glewGetProcAddress((const GLubyte*)\"glVertexStream4dATI\")) == NULL) || r;\r\n  r = ((glVertexStream4dvATI = (PFNGLVERTEXSTREAM4DVATIPROC)glewGetProcAddress((const GLubyte*)\"glVertexStream4dvATI\")) == NULL) || r;\r\n  r = ((glVertexStream4fATI = (PFNGLVERTEXSTREAM4FATIPROC)glewGetProcAddress((const GLubyte*)\"glVertexStream4fATI\")) == NULL) || r;\r\n  r = ((glVertexStream4fvATI = (PFNGLVERTEXSTREAM4FVATIPROC)glewGetProcAddress((const GLubyte*)\"glVertexStream4fvATI\")) == NULL) || r;\r\n  r = ((glVertexStream4iATI = (PFNGLVERTEXSTREAM4IATIPROC)glewGetProcAddress((const GLubyte*)\"glVertexStream4iATI\")) == NULL) || r;\r\n  r = ((glVertexStream4ivATI = (PFNGLVERTEXSTREAM4IVATIPROC)glewGetProcAddress((const GLubyte*)\"glVertexStream4ivATI\")) == NULL) || r;\r\n  r = ((glVertexStream4sATI = (PFNGLVERTEXSTREAM4SATIPROC)glewGetProcAddress((const GLubyte*)\"glVertexStream4sATI\")) == NULL) || r;\r\n  r = ((glVertexStream4svATI = (PFNGLVERTEXSTREAM4SVATIPROC)glewGetProcAddress((const GLubyte*)\"glVertexStream4svATI\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_ATI_vertex_streams */\r\n\r\n#ifdef GL_EXT_422_pixels\r\n\r\n#endif /* GL_EXT_422_pixels */\r\n\r\n#ifdef GL_EXT_Cg_shader\r\n\r\n#endif /* GL_EXT_Cg_shader */\r\n\r\n#ifdef GL_EXT_abgr\r\n\r\n#endif /* GL_EXT_abgr */\r\n\r\n#ifdef GL_EXT_bgra\r\n\r\n#endif /* GL_EXT_bgra */\r\n\r\n#ifdef GL_EXT_bindable_uniform\r\n\r\nstatic GLboolean _glewInit_GL_EXT_bindable_uniform (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glGetUniformBufferSizeEXT = (PFNGLGETUNIFORMBUFFERSIZEEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetUniformBufferSizeEXT\")) == NULL) || r;\r\n  r = ((glGetUniformOffsetEXT = (PFNGLGETUNIFORMOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetUniformOffsetEXT\")) == NULL) || r;\r\n  r = ((glUniformBufferEXT = (PFNGLUNIFORMBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)\"glUniformBufferEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_bindable_uniform */\r\n\r\n#ifdef GL_EXT_blend_color\r\n\r\nstatic GLboolean _glewInit_GL_EXT_blend_color (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glBlendColorEXT = (PFNGLBLENDCOLOREXTPROC)glewGetProcAddress((const GLubyte*)\"glBlendColorEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_blend_color */\r\n\r\n#ifdef GL_EXT_blend_equation_separate\r\n\r\nstatic GLboolean _glewInit_GL_EXT_blend_equation_separate (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glBlendEquationSeparateEXT = (PFNGLBLENDEQUATIONSEPARATEEXTPROC)glewGetProcAddress((const GLubyte*)\"glBlendEquationSeparateEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_blend_equation_separate */\r\n\r\n#ifdef GL_EXT_blend_func_separate\r\n\r\nstatic GLboolean _glewInit_GL_EXT_blend_func_separate (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC)glewGetProcAddress((const GLubyte*)\"glBlendFuncSeparateEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_blend_func_separate */\r\n\r\n#ifdef GL_EXT_blend_logic_op\r\n\r\n#endif /* GL_EXT_blend_logic_op */\r\n\r\n#ifdef GL_EXT_blend_minmax\r\n\r\nstatic GLboolean _glewInit_GL_EXT_blend_minmax (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glBlendEquationEXT = (PFNGLBLENDEQUATIONEXTPROC)glewGetProcAddress((const GLubyte*)\"glBlendEquationEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_blend_minmax */\r\n\r\n#ifdef GL_EXT_blend_subtract\r\n\r\n#endif /* GL_EXT_blend_subtract */\r\n\r\n#ifdef GL_EXT_clip_volume_hint\r\n\r\n#endif /* GL_EXT_clip_volume_hint */\r\n\r\n#ifdef GL_EXT_cmyka\r\n\r\n#endif /* GL_EXT_cmyka */\r\n\r\n#ifdef GL_EXT_color_subtable\r\n\r\nstatic GLboolean _glewInit_GL_EXT_color_subtable (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glColorSubTableEXT = (PFNGLCOLORSUBTABLEEXTPROC)glewGetProcAddress((const GLubyte*)\"glColorSubTableEXT\")) == NULL) || r;\r\n  r = ((glCopyColorSubTableEXT = (PFNGLCOPYCOLORSUBTABLEEXTPROC)glewGetProcAddress((const GLubyte*)\"glCopyColorSubTableEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_color_subtable */\r\n\r\n#ifdef GL_EXT_compiled_vertex_array\r\n\r\nstatic GLboolean _glewInit_GL_EXT_compiled_vertex_array (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glLockArraysEXT = (PFNGLLOCKARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)\"glLockArraysEXT\")) == NULL) || r;\r\n  r = ((glUnlockArraysEXT = (PFNGLUNLOCKARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)\"glUnlockArraysEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_compiled_vertex_array */\r\n\r\n#ifdef GL_EXT_convolution\r\n\r\nstatic GLboolean _glewInit_GL_EXT_convolution (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glConvolutionFilter1DEXT = (PFNGLCONVOLUTIONFILTER1DEXTPROC)glewGetProcAddress((const GLubyte*)\"glConvolutionFilter1DEXT\")) == NULL) || r;\r\n  r = ((glConvolutionFilter2DEXT = (PFNGLCONVOLUTIONFILTER2DEXTPROC)glewGetProcAddress((const GLubyte*)\"glConvolutionFilter2DEXT\")) == NULL) || r;\r\n  r = ((glConvolutionParameterfEXT = (PFNGLCONVOLUTIONPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)\"glConvolutionParameterfEXT\")) == NULL) || r;\r\n  r = ((glConvolutionParameterfvEXT = (PFNGLCONVOLUTIONPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)\"glConvolutionParameterfvEXT\")) == NULL) || r;\r\n  r = ((glConvolutionParameteriEXT = (PFNGLCONVOLUTIONPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)\"glConvolutionParameteriEXT\")) == NULL) || r;\r\n  r = ((glConvolutionParameterivEXT = (PFNGLCONVOLUTIONPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glConvolutionParameterivEXT\")) == NULL) || r;\r\n  r = ((glCopyConvolutionFilter1DEXT = (PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC)glewGetProcAddress((const GLubyte*)\"glCopyConvolutionFilter1DEXT\")) == NULL) || r;\r\n  r = ((glCopyConvolutionFilter2DEXT = (PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC)glewGetProcAddress((const GLubyte*)\"glCopyConvolutionFilter2DEXT\")) == NULL) || r;\r\n  r = ((glGetConvolutionFilterEXT = (PFNGLGETCONVOLUTIONFILTEREXTPROC)glewGetProcAddress((const GLubyte*)\"glGetConvolutionFilterEXT\")) == NULL) || r;\r\n  r = ((glGetConvolutionParameterfvEXT = (PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetConvolutionParameterfvEXT\")) == NULL) || r;\r\n  r = ((glGetConvolutionParameterivEXT = (PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetConvolutionParameterivEXT\")) == NULL) || r;\r\n  r = ((glGetSeparableFilterEXT = (PFNGLGETSEPARABLEFILTEREXTPROC)glewGetProcAddress((const GLubyte*)\"glGetSeparableFilterEXT\")) == NULL) || r;\r\n  r = ((glSeparableFilter2DEXT = (PFNGLSEPARABLEFILTER2DEXTPROC)glewGetProcAddress((const GLubyte*)\"glSeparableFilter2DEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_convolution */\r\n\r\n#ifdef GL_EXT_coordinate_frame\r\n\r\nstatic GLboolean _glewInit_GL_EXT_coordinate_frame (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glBinormalPointerEXT = (PFNGLBINORMALPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)\"glBinormalPointerEXT\")) == NULL) || r;\r\n  r = ((glTangentPointerEXT = (PFNGLTANGENTPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)\"glTangentPointerEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_coordinate_frame */\r\n\r\n#ifdef GL_EXT_copy_texture\r\n\r\nstatic GLboolean _glewInit_GL_EXT_copy_texture (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glCopyTexImage1DEXT = (PFNGLCOPYTEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)\"glCopyTexImage1DEXT\")) == NULL) || r;\r\n  r = ((glCopyTexImage2DEXT = (PFNGLCOPYTEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)\"glCopyTexImage2DEXT\")) == NULL) || r;\r\n  r = ((glCopyTexSubImage1DEXT = (PFNGLCOPYTEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)\"glCopyTexSubImage1DEXT\")) == NULL) || r;\r\n  r = ((glCopyTexSubImage2DEXT = (PFNGLCOPYTEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)\"glCopyTexSubImage2DEXT\")) == NULL) || r;\r\n  r = ((glCopyTexSubImage3DEXT = (PFNGLCOPYTEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)\"glCopyTexSubImage3DEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_copy_texture */\r\n\r\n#ifdef GL_EXT_cull_vertex\r\n\r\nstatic GLboolean _glewInit_GL_EXT_cull_vertex (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glCullParameterdvEXT = (PFNGLCULLPARAMETERDVEXTPROC)glewGetProcAddress((const GLubyte*)\"glCullParameterdvEXT\")) == NULL) || r;\r\n  r = ((glCullParameterfvEXT = (PFNGLCULLPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)\"glCullParameterfvEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_cull_vertex */\r\n\r\n#ifdef GL_EXT_depth_bounds_test\r\n\r\nstatic GLboolean _glewInit_GL_EXT_depth_bounds_test (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glDepthBoundsEXT = (PFNGLDEPTHBOUNDSEXTPROC)glewGetProcAddress((const GLubyte*)\"glDepthBoundsEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_depth_bounds_test */\r\n\r\n#ifdef GL_EXT_direct_state_access\r\n\r\nstatic GLboolean _glewInit_GL_EXT_direct_state_access (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glBindMultiTextureEXT = (PFNGLBINDMULTITEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)\"glBindMultiTextureEXT\")) == NULL) || r;\r\n  r = ((glCheckNamedFramebufferStatusEXT = (PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC)glewGetProcAddress((const GLubyte*)\"glCheckNamedFramebufferStatusEXT\")) == NULL) || r;\r\n  r = ((glClientAttribDefaultEXT = (PFNGLCLIENTATTRIBDEFAULTEXTPROC)glewGetProcAddress((const GLubyte*)\"glClientAttribDefaultEXT\")) == NULL) || r;\r\n  r = ((glCompressedMultiTexImage1DEXT = (PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)\"glCompressedMultiTexImage1DEXT\")) == NULL) || r;\r\n  r = ((glCompressedMultiTexImage2DEXT = (PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)\"glCompressedMultiTexImage2DEXT\")) == NULL) || r;\r\n  r = ((glCompressedMultiTexImage3DEXT = (PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)\"glCompressedMultiTexImage3DEXT\")) == NULL) || r;\r\n  r = ((glCompressedMultiTexSubImage1DEXT = (PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)\"glCompressedMultiTexSubImage1DEXT\")) == NULL) || r;\r\n  r = ((glCompressedMultiTexSubImage2DEXT = (PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)\"glCompressedMultiTexSubImage2DEXT\")) == NULL) || r;\r\n  r = ((glCompressedMultiTexSubImage3DEXT = (PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)\"glCompressedMultiTexSubImage3DEXT\")) == NULL) || r;\r\n  r = ((glCompressedTextureImage1DEXT = (PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)\"glCompressedTextureImage1DEXT\")) == NULL) || r;\r\n  r = ((glCompressedTextureImage2DEXT = (PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)\"glCompressedTextureImage2DEXT\")) == NULL) || r;\r\n  r = ((glCompressedTextureImage3DEXT = (PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)\"glCompressedTextureImage3DEXT\")) == NULL) || r;\r\n  r = ((glCompressedTextureSubImage1DEXT = (PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)\"glCompressedTextureSubImage1DEXT\")) == NULL) || r;\r\n  r = ((glCompressedTextureSubImage2DEXT = (PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)\"glCompressedTextureSubImage2DEXT\")) == NULL) || r;\r\n  r = ((glCompressedTextureSubImage3DEXT = (PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)\"glCompressedTextureSubImage3DEXT\")) == NULL) || r;\r\n  r = ((glCopyMultiTexImage1DEXT = (PFNGLCOPYMULTITEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)\"glCopyMultiTexImage1DEXT\")) == NULL) || r;\r\n  r = ((glCopyMultiTexImage2DEXT = (PFNGLCOPYMULTITEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)\"glCopyMultiTexImage2DEXT\")) == NULL) || r;\r\n  r = ((glCopyMultiTexSubImage1DEXT = (PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)\"glCopyMultiTexSubImage1DEXT\")) == NULL) || r;\r\n  r = ((glCopyMultiTexSubImage2DEXT = (PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)\"glCopyMultiTexSubImage2DEXT\")) == NULL) || r;\r\n  r = ((glCopyMultiTexSubImage3DEXT = (PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)\"glCopyMultiTexSubImage3DEXT\")) == NULL) || r;\r\n  r = ((glCopyTextureImage1DEXT = (PFNGLCOPYTEXTUREIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)\"glCopyTextureImage1DEXT\")) == NULL) || r;\r\n  r = ((glCopyTextureImage2DEXT = (PFNGLCOPYTEXTUREIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)\"glCopyTextureImage2DEXT\")) == NULL) || r;\r\n  r = ((glCopyTextureSubImage1DEXT = (PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)\"glCopyTextureSubImage1DEXT\")) == NULL) || r;\r\n  r = ((glCopyTextureSubImage2DEXT = (PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)\"glCopyTextureSubImage2DEXT\")) == NULL) || r;\r\n  r = ((glCopyTextureSubImage3DEXT = (PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)\"glCopyTextureSubImage3DEXT\")) == NULL) || r;\r\n  r = ((glDisableClientStateIndexedEXT = (PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)\"glDisableClientStateIndexedEXT\")) == NULL) || r;\r\n  r = ((glDisableClientStateiEXT = (PFNGLDISABLECLIENTSTATEIEXTPROC)glewGetProcAddress((const GLubyte*)\"glDisableClientStateiEXT\")) == NULL) || r;\r\n  r = ((glDisableVertexArrayAttribEXT = (PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)\"glDisableVertexArrayAttribEXT\")) == NULL) || r;\r\n  r = ((glDisableVertexArrayEXT = (PFNGLDISABLEVERTEXARRAYEXTPROC)glewGetProcAddress((const GLubyte*)\"glDisableVertexArrayEXT\")) == NULL) || r;\r\n  r = ((glEnableClientStateIndexedEXT = (PFNGLENABLECLIENTSTATEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)\"glEnableClientStateIndexedEXT\")) == NULL) || r;\r\n  r = ((glEnableClientStateiEXT = (PFNGLENABLECLIENTSTATEIEXTPROC)glewGetProcAddress((const GLubyte*)\"glEnableClientStateiEXT\")) == NULL) || r;\r\n  r = ((glEnableVertexArrayAttribEXT = (PFNGLENABLEVERTEXARRAYATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)\"glEnableVertexArrayAttribEXT\")) == NULL) || r;\r\n  r = ((glEnableVertexArrayEXT = (PFNGLENABLEVERTEXARRAYEXTPROC)glewGetProcAddress((const GLubyte*)\"glEnableVertexArrayEXT\")) == NULL) || r;\r\n  r = ((glFlushMappedNamedBufferRangeEXT = (PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)\"glFlushMappedNamedBufferRangeEXT\")) == NULL) || r;\r\n  r = ((glFramebufferDrawBufferEXT = (PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)\"glFramebufferDrawBufferEXT\")) == NULL) || r;\r\n  r = ((glFramebufferDrawBuffersEXT = (PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)\"glFramebufferDrawBuffersEXT\")) == NULL) || r;\r\n  r = ((glFramebufferReadBufferEXT = (PFNGLFRAMEBUFFERREADBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)\"glFramebufferReadBufferEXT\")) == NULL) || r;\r\n  r = ((glGenerateMultiTexMipmapEXT = (PFNGLGENERATEMULTITEXMIPMAPEXTPROC)glewGetProcAddress((const GLubyte*)\"glGenerateMultiTexMipmapEXT\")) == NULL) || r;\r\n  r = ((glGenerateTextureMipmapEXT = (PFNGLGENERATETEXTUREMIPMAPEXTPROC)glewGetProcAddress((const GLubyte*)\"glGenerateTextureMipmapEXT\")) == NULL) || r;\r\n  r = ((glGetCompressedMultiTexImageEXT = (PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetCompressedMultiTexImageEXT\")) == NULL) || r;\r\n  r = ((glGetCompressedTextureImageEXT = (PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetCompressedTextureImageEXT\")) == NULL) || r;\r\n  r = ((glGetDoubleIndexedvEXT = (PFNGLGETDOUBLEINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetDoubleIndexedvEXT\")) == NULL) || r;\r\n  r = ((glGetDoublei_vEXT = (PFNGLGETDOUBLEI_VEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetDoublei_vEXT\")) == NULL) || r;\r\n  r = ((glGetFloatIndexedvEXT = (PFNGLGETFLOATINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetFloatIndexedvEXT\")) == NULL) || r;\r\n  r = ((glGetFloati_vEXT = (PFNGLGETFLOATI_VEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetFloati_vEXT\")) == NULL) || r;\r\n  r = ((glGetFramebufferParameterivEXT = (PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetFramebufferParameterivEXT\")) == NULL) || r;\r\n  r = ((glGetMultiTexEnvfvEXT = (PFNGLGETMULTITEXENVFVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetMultiTexEnvfvEXT\")) == NULL) || r;\r\n  r = ((glGetMultiTexEnvivEXT = (PFNGLGETMULTITEXENVIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetMultiTexEnvivEXT\")) == NULL) || r;\r\n  r = ((glGetMultiTexGendvEXT = (PFNGLGETMULTITEXGENDVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetMultiTexGendvEXT\")) == NULL) || r;\r\n  r = ((glGetMultiTexGenfvEXT = (PFNGLGETMULTITEXGENFVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetMultiTexGenfvEXT\")) == NULL) || r;\r\n  r = ((glGetMultiTexGenivEXT = (PFNGLGETMULTITEXGENIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetMultiTexGenivEXT\")) == NULL) || r;\r\n  r = ((glGetMultiTexImageEXT = (PFNGLGETMULTITEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetMultiTexImageEXT\")) == NULL) || r;\r\n  r = ((glGetMultiTexLevelParameterfvEXT = (PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetMultiTexLevelParameterfvEXT\")) == NULL) || r;\r\n  r = ((glGetMultiTexLevelParameterivEXT = (PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetMultiTexLevelParameterivEXT\")) == NULL) || r;\r\n  r = ((glGetMultiTexParameterIivEXT = (PFNGLGETMULTITEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetMultiTexParameterIivEXT\")) == NULL) || r;\r\n  r = ((glGetMultiTexParameterIuivEXT = (PFNGLGETMULTITEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetMultiTexParameterIuivEXT\")) == NULL) || r;\r\n  r = ((glGetMultiTexParameterfvEXT = (PFNGLGETMULTITEXPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetMultiTexParameterfvEXT\")) == NULL) || r;\r\n  r = ((glGetMultiTexParameterivEXT = (PFNGLGETMULTITEXPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetMultiTexParameterivEXT\")) == NULL) || r;\r\n  r = ((glGetNamedBufferParameterivEXT = (PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetNamedBufferParameterivEXT\")) == NULL) || r;\r\n  r = ((glGetNamedBufferPointervEXT = (PFNGLGETNAMEDBUFFERPOINTERVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetNamedBufferPointervEXT\")) == NULL) || r;\r\n  r = ((glGetNamedBufferSubDataEXT = (PFNGLGETNAMEDBUFFERSUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetNamedBufferSubDataEXT\")) == NULL) || r;\r\n  r = ((glGetNamedFramebufferAttachmentParameterivEXT = (PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetNamedFramebufferAttachmentParameterivEXT\")) == NULL) || r;\r\n  r = ((glGetNamedProgramLocalParameterIivEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetNamedProgramLocalParameterIivEXT\")) == NULL) || r;\r\n  r = ((glGetNamedProgramLocalParameterIuivEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetNamedProgramLocalParameterIuivEXT\")) == NULL) || r;\r\n  r = ((glGetNamedProgramLocalParameterdvEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetNamedProgramLocalParameterdvEXT\")) == NULL) || r;\r\n  r = ((glGetNamedProgramLocalParameterfvEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetNamedProgramLocalParameterfvEXT\")) == NULL) || r;\r\n  r = ((glGetNamedProgramStringEXT = (PFNGLGETNAMEDPROGRAMSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetNamedProgramStringEXT\")) == NULL) || r;\r\n  r = ((glGetNamedProgramivEXT = (PFNGLGETNAMEDPROGRAMIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetNamedProgramivEXT\")) == NULL) || r;\r\n  r = ((glGetNamedRenderbufferParameterivEXT = (PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetNamedRenderbufferParameterivEXT\")) == NULL) || r;\r\n  r = ((glGetPointerIndexedvEXT = (PFNGLGETPOINTERINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetPointerIndexedvEXT\")) == NULL) || r;\r\n  r = ((glGetPointeri_vEXT = (PFNGLGETPOINTERI_VEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetPointeri_vEXT\")) == NULL) || r;\r\n  r = ((glGetTextureImageEXT = (PFNGLGETTEXTUREIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetTextureImageEXT\")) == NULL) || r;\r\n  r = ((glGetTextureLevelParameterfvEXT = (PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetTextureLevelParameterfvEXT\")) == NULL) || r;\r\n  r = ((glGetTextureLevelParameterivEXT = (PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetTextureLevelParameterivEXT\")) == NULL) || r;\r\n  r = ((glGetTextureParameterIivEXT = (PFNGLGETTEXTUREPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetTextureParameterIivEXT\")) == NULL) || r;\r\n  r = ((glGetTextureParameterIuivEXT = (PFNGLGETTEXTUREPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetTextureParameterIuivEXT\")) == NULL) || r;\r\n  r = ((glGetTextureParameterfvEXT = (PFNGLGETTEXTUREPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetTextureParameterfvEXT\")) == NULL) || r;\r\n  r = ((glGetTextureParameterivEXT = (PFNGLGETTEXTUREPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetTextureParameterivEXT\")) == NULL) || r;\r\n  r = ((glGetVertexArrayIntegeri_vEXT = (PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetVertexArrayIntegeri_vEXT\")) == NULL) || r;\r\n  r = ((glGetVertexArrayIntegervEXT = (PFNGLGETVERTEXARRAYINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetVertexArrayIntegervEXT\")) == NULL) || r;\r\n  r = ((glGetVertexArrayPointeri_vEXT = (PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetVertexArrayPointeri_vEXT\")) == NULL) || r;\r\n  r = ((glGetVertexArrayPointervEXT = (PFNGLGETVERTEXARRAYPOINTERVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetVertexArrayPointervEXT\")) == NULL) || r;\r\n  r = ((glMapNamedBufferEXT = (PFNGLMAPNAMEDBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)\"glMapNamedBufferEXT\")) == NULL) || r;\r\n  r = ((glMapNamedBufferRangeEXT = (PFNGLMAPNAMEDBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)\"glMapNamedBufferRangeEXT\")) == NULL) || r;\r\n  r = ((glMatrixFrustumEXT = (PFNGLMATRIXFRUSTUMEXTPROC)glewGetProcAddress((const GLubyte*)\"glMatrixFrustumEXT\")) == NULL) || r;\r\n  r = ((glMatrixLoadIdentityEXT = (PFNGLMATRIXLOADIDENTITYEXTPROC)glewGetProcAddress((const GLubyte*)\"glMatrixLoadIdentityEXT\")) == NULL) || r;\r\n  r = ((glMatrixLoadTransposedEXT = (PFNGLMATRIXLOADTRANSPOSEDEXTPROC)glewGetProcAddress((const GLubyte*)\"glMatrixLoadTransposedEXT\")) == NULL) || r;\r\n  r = ((glMatrixLoadTransposefEXT = (PFNGLMATRIXLOADTRANSPOSEFEXTPROC)glewGetProcAddress((const GLubyte*)\"glMatrixLoadTransposefEXT\")) == NULL) || r;\r\n  r = ((glMatrixLoaddEXT = (PFNGLMATRIXLOADDEXTPROC)glewGetProcAddress((const GLubyte*)\"glMatrixLoaddEXT\")) == NULL) || r;\r\n  r = ((glMatrixLoadfEXT = (PFNGLMATRIXLOADFEXTPROC)glewGetProcAddress((const GLubyte*)\"glMatrixLoadfEXT\")) == NULL) || r;\r\n  r = ((glMatrixMultTransposedEXT = (PFNGLMATRIXMULTTRANSPOSEDEXTPROC)glewGetProcAddress((const GLubyte*)\"glMatrixMultTransposedEXT\")) == NULL) || r;\r\n  r = ((glMatrixMultTransposefEXT = (PFNGLMATRIXMULTTRANSPOSEFEXTPROC)glewGetProcAddress((const GLubyte*)\"glMatrixMultTransposefEXT\")) == NULL) || r;\r\n  r = ((glMatrixMultdEXT = (PFNGLMATRIXMULTDEXTPROC)glewGetProcAddress((const GLubyte*)\"glMatrixMultdEXT\")) == NULL) || r;\r\n  r = ((glMatrixMultfEXT = (PFNGLMATRIXMULTFEXTPROC)glewGetProcAddress((const GLubyte*)\"glMatrixMultfEXT\")) == NULL) || r;\r\n  r = ((glMatrixOrthoEXT = (PFNGLMATRIXORTHOEXTPROC)glewGetProcAddress((const GLubyte*)\"glMatrixOrthoEXT\")) == NULL) || r;\r\n  r = ((glMatrixPopEXT = (PFNGLMATRIXPOPEXTPROC)glewGetProcAddress((const GLubyte*)\"glMatrixPopEXT\")) == NULL) || r;\r\n  r = ((glMatrixPushEXT = (PFNGLMATRIXPUSHEXTPROC)glewGetProcAddress((const GLubyte*)\"glMatrixPushEXT\")) == NULL) || r;\r\n  r = ((glMatrixRotatedEXT = (PFNGLMATRIXROTATEDEXTPROC)glewGetProcAddress((const GLubyte*)\"glMatrixRotatedEXT\")) == NULL) || r;\r\n  r = ((glMatrixRotatefEXT = (PFNGLMATRIXROTATEFEXTPROC)glewGetProcAddress((const GLubyte*)\"glMatrixRotatefEXT\")) == NULL) || r;\r\n  r = ((glMatrixScaledEXT = (PFNGLMATRIXSCALEDEXTPROC)glewGetProcAddress((const GLubyte*)\"glMatrixScaledEXT\")) == NULL) || r;\r\n  r = ((glMatrixScalefEXT = (PFNGLMATRIXSCALEFEXTPROC)glewGetProcAddress((const GLubyte*)\"glMatrixScalefEXT\")) == NULL) || r;\r\n  r = ((glMatrixTranslatedEXT = (PFNGLMATRIXTRANSLATEDEXTPROC)glewGetProcAddress((const GLubyte*)\"glMatrixTranslatedEXT\")) == NULL) || r;\r\n  r = ((glMatrixTranslatefEXT = (PFNGLMATRIXTRANSLATEFEXTPROC)glewGetProcAddress((const GLubyte*)\"glMatrixTranslatefEXT\")) == NULL) || r;\r\n  r = ((glMultiTexBufferEXT = (PFNGLMULTITEXBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexBufferEXT\")) == NULL) || r;\r\n  r = ((glMultiTexCoordPointerEXT = (PFNGLMULTITEXCOORDPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoordPointerEXT\")) == NULL) || r;\r\n  r = ((glMultiTexEnvfEXT = (PFNGLMULTITEXENVFEXTPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexEnvfEXT\")) == NULL) || r;\r\n  r = ((glMultiTexEnvfvEXT = (PFNGLMULTITEXENVFVEXTPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexEnvfvEXT\")) == NULL) || r;\r\n  r = ((glMultiTexEnviEXT = (PFNGLMULTITEXENVIEXTPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexEnviEXT\")) == NULL) || r;\r\n  r = ((glMultiTexEnvivEXT = (PFNGLMULTITEXENVIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexEnvivEXT\")) == NULL) || r;\r\n  r = ((glMultiTexGendEXT = (PFNGLMULTITEXGENDEXTPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexGendEXT\")) == NULL) || r;\r\n  r = ((glMultiTexGendvEXT = (PFNGLMULTITEXGENDVEXTPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexGendvEXT\")) == NULL) || r;\r\n  r = ((glMultiTexGenfEXT = (PFNGLMULTITEXGENFEXTPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexGenfEXT\")) == NULL) || r;\r\n  r = ((glMultiTexGenfvEXT = (PFNGLMULTITEXGENFVEXTPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexGenfvEXT\")) == NULL) || r;\r\n  r = ((glMultiTexGeniEXT = (PFNGLMULTITEXGENIEXTPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexGeniEXT\")) == NULL) || r;\r\n  r = ((glMultiTexGenivEXT = (PFNGLMULTITEXGENIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexGenivEXT\")) == NULL) || r;\r\n  r = ((glMultiTexImage1DEXT = (PFNGLMULTITEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexImage1DEXT\")) == NULL) || r;\r\n  r = ((glMultiTexImage2DEXT = (PFNGLMULTITEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexImage2DEXT\")) == NULL) || r;\r\n  r = ((glMultiTexImage3DEXT = (PFNGLMULTITEXIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexImage3DEXT\")) == NULL) || r;\r\n  r = ((glMultiTexParameterIivEXT = (PFNGLMULTITEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexParameterIivEXT\")) == NULL) || r;\r\n  r = ((glMultiTexParameterIuivEXT = (PFNGLMULTITEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexParameterIuivEXT\")) == NULL) || r;\r\n  r = ((glMultiTexParameterfEXT = (PFNGLMULTITEXPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexParameterfEXT\")) == NULL) || r;\r\n  r = ((glMultiTexParameterfvEXT = (PFNGLMULTITEXPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexParameterfvEXT\")) == NULL) || r;\r\n  r = ((glMultiTexParameteriEXT = (PFNGLMULTITEXPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexParameteriEXT\")) == NULL) || r;\r\n  r = ((glMultiTexParameterivEXT = (PFNGLMULTITEXPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexParameterivEXT\")) == NULL) || r;\r\n  r = ((glMultiTexRenderbufferEXT = (PFNGLMULTITEXRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexRenderbufferEXT\")) == NULL) || r;\r\n  r = ((glMultiTexSubImage1DEXT = (PFNGLMULTITEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexSubImage1DEXT\")) == NULL) || r;\r\n  r = ((glMultiTexSubImage2DEXT = (PFNGLMULTITEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexSubImage2DEXT\")) == NULL) || r;\r\n  r = ((glMultiTexSubImage3DEXT = (PFNGLMULTITEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexSubImage3DEXT\")) == NULL) || r;\r\n  r = ((glNamedBufferDataEXT = (PFNGLNAMEDBUFFERDATAEXTPROC)glewGetProcAddress((const GLubyte*)\"glNamedBufferDataEXT\")) == NULL) || r;\r\n  r = ((glNamedBufferSubDataEXT = (PFNGLNAMEDBUFFERSUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)\"glNamedBufferSubDataEXT\")) == NULL) || r;\r\n  r = ((glNamedCopyBufferSubDataEXT = (PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)\"glNamedCopyBufferSubDataEXT\")) == NULL) || r;\r\n  r = ((glNamedFramebufferRenderbufferEXT = (PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)\"glNamedFramebufferRenderbufferEXT\")) == NULL) || r;\r\n  r = ((glNamedFramebufferTexture1DEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC)glewGetProcAddress((const GLubyte*)\"glNamedFramebufferTexture1DEXT\")) == NULL) || r;\r\n  r = ((glNamedFramebufferTexture2DEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC)glewGetProcAddress((const GLubyte*)\"glNamedFramebufferTexture2DEXT\")) == NULL) || r;\r\n  r = ((glNamedFramebufferTexture3DEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC)glewGetProcAddress((const GLubyte*)\"glNamedFramebufferTexture3DEXT\")) == NULL) || r;\r\n  r = ((glNamedFramebufferTextureEXT = (PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)\"glNamedFramebufferTextureEXT\")) == NULL) || r;\r\n  r = ((glNamedFramebufferTextureFaceEXT = (PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC)glewGetProcAddress((const GLubyte*)\"glNamedFramebufferTextureFaceEXT\")) == NULL) || r;\r\n  r = ((glNamedFramebufferTextureLayerEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC)glewGetProcAddress((const GLubyte*)\"glNamedFramebufferTextureLayerEXT\")) == NULL) || r;\r\n  r = ((glNamedProgramLocalParameter4dEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC)glewGetProcAddress((const GLubyte*)\"glNamedProgramLocalParameter4dEXT\")) == NULL) || r;\r\n  r = ((glNamedProgramLocalParameter4dvEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC)glewGetProcAddress((const GLubyte*)\"glNamedProgramLocalParameter4dvEXT\")) == NULL) || r;\r\n  r = ((glNamedProgramLocalParameter4fEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC)glewGetProcAddress((const GLubyte*)\"glNamedProgramLocalParameter4fEXT\")) == NULL) || r;\r\n  r = ((glNamedProgramLocalParameter4fvEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC)glewGetProcAddress((const GLubyte*)\"glNamedProgramLocalParameter4fvEXT\")) == NULL) || r;\r\n  r = ((glNamedProgramLocalParameterI4iEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC)glewGetProcAddress((const GLubyte*)\"glNamedProgramLocalParameterI4iEXT\")) == NULL) || r;\r\n  r = ((glNamedProgramLocalParameterI4ivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC)glewGetProcAddress((const GLubyte*)\"glNamedProgramLocalParameterI4ivEXT\")) == NULL) || r;\r\n  r = ((glNamedProgramLocalParameterI4uiEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC)glewGetProcAddress((const GLubyte*)\"glNamedProgramLocalParameterI4uiEXT\")) == NULL) || r;\r\n  r = ((glNamedProgramLocalParameterI4uivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glNamedProgramLocalParameterI4uivEXT\")) == NULL) || r;\r\n  r = ((glNamedProgramLocalParameters4fvEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC)glewGetProcAddress((const GLubyte*)\"glNamedProgramLocalParameters4fvEXT\")) == NULL) || r;\r\n  r = ((glNamedProgramLocalParametersI4ivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC)glewGetProcAddress((const GLubyte*)\"glNamedProgramLocalParametersI4ivEXT\")) == NULL) || r;\r\n  r = ((glNamedProgramLocalParametersI4uivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glNamedProgramLocalParametersI4uivEXT\")) == NULL) || r;\r\n  r = ((glNamedProgramStringEXT = (PFNGLNAMEDPROGRAMSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)\"glNamedProgramStringEXT\")) == NULL) || r;\r\n  r = ((glNamedRenderbufferStorageEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC)glewGetProcAddress((const GLubyte*)\"glNamedRenderbufferStorageEXT\")) == NULL) || r;\r\n  r = ((glNamedRenderbufferStorageMultisampleCoverageEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC)glewGetProcAddress((const GLubyte*)\"glNamedRenderbufferStorageMultisampleCoverageEXT\")) == NULL) || r;\r\n  r = ((glNamedRenderbufferStorageMultisampleEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)\"glNamedRenderbufferStorageMultisampleEXT\")) == NULL) || r;\r\n  r = ((glProgramUniform1fEXT = (PFNGLPROGRAMUNIFORM1FEXTPROC)glewGetProcAddress((const GLubyte*)\"glProgramUniform1fEXT\")) == NULL) || r;\r\n  r = ((glProgramUniform1fvEXT = (PFNGLPROGRAMUNIFORM1FVEXTPROC)glewGetProcAddress((const GLubyte*)\"glProgramUniform1fvEXT\")) == NULL) || r;\r\n  r = ((glProgramUniform1iEXT = (PFNGLPROGRAMUNIFORM1IEXTPROC)glewGetProcAddress((const GLubyte*)\"glProgramUniform1iEXT\")) == NULL) || r;\r\n  r = ((glProgramUniform1ivEXT = (PFNGLPROGRAMUNIFORM1IVEXTPROC)glewGetProcAddress((const GLubyte*)\"glProgramUniform1ivEXT\")) == NULL) || r;\r\n  r = ((glProgramUniform1uiEXT = (PFNGLPROGRAMUNIFORM1UIEXTPROC)glewGetProcAddress((const GLubyte*)\"glProgramUniform1uiEXT\")) == NULL) || r;\r\n  r = ((glProgramUniform1uivEXT = (PFNGLPROGRAMUNIFORM1UIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glProgramUniform1uivEXT\")) == NULL) || r;\r\n  r = ((glProgramUniform2fEXT = (PFNGLPROGRAMUNIFORM2FEXTPROC)glewGetProcAddress((const GLubyte*)\"glProgramUniform2fEXT\")) == NULL) || r;\r\n  r = ((glProgramUniform2fvEXT = (PFNGLPROGRAMUNIFORM2FVEXTPROC)glewGetProcAddress((const GLubyte*)\"glProgramUniform2fvEXT\")) == NULL) || r;\r\n  r = ((glProgramUniform2iEXT = (PFNGLPROGRAMUNIFORM2IEXTPROC)glewGetProcAddress((const GLubyte*)\"glProgramUniform2iEXT\")) == NULL) || r;\r\n  r = ((glProgramUniform2ivEXT = (PFNGLPROGRAMUNIFORM2IVEXTPROC)glewGetProcAddress((const GLubyte*)\"glProgramUniform2ivEXT\")) == NULL) || r;\r\n  r = ((glProgramUniform2uiEXT = (PFNGLPROGRAMUNIFORM2UIEXTPROC)glewGetProcAddress((const GLubyte*)\"glProgramUniform2uiEXT\")) == NULL) || r;\r\n  r = ((glProgramUniform2uivEXT = (PFNGLPROGRAMUNIFORM2UIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glProgramUniform2uivEXT\")) == NULL) || r;\r\n  r = ((glProgramUniform3fEXT = (PFNGLPROGRAMUNIFORM3FEXTPROC)glewGetProcAddress((const GLubyte*)\"glProgramUniform3fEXT\")) == NULL) || r;\r\n  r = ((glProgramUniform3fvEXT = (PFNGLPROGRAMUNIFORM3FVEXTPROC)glewGetProcAddress((const GLubyte*)\"glProgramUniform3fvEXT\")) == NULL) || r;\r\n  r = ((glProgramUniform3iEXT = (PFNGLPROGRAMUNIFORM3IEXTPROC)glewGetProcAddress((const GLubyte*)\"glProgramUniform3iEXT\")) == NULL) || r;\r\n  r = ((glProgramUniform3ivEXT = (PFNGLPROGRAMUNIFORM3IVEXTPROC)glewGetProcAddress((const GLubyte*)\"glProgramUniform3ivEXT\")) == NULL) || r;\r\n  r = ((glProgramUniform3uiEXT = (PFNGLPROGRAMUNIFORM3UIEXTPROC)glewGetProcAddress((const GLubyte*)\"glProgramUniform3uiEXT\")) == NULL) || r;\r\n  r = ((glProgramUniform3uivEXT = (PFNGLPROGRAMUNIFORM3UIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glProgramUniform3uivEXT\")) == NULL) || r;\r\n  r = ((glProgramUniform4fEXT = (PFNGLPROGRAMUNIFORM4FEXTPROC)glewGetProcAddress((const GLubyte*)\"glProgramUniform4fEXT\")) == NULL) || r;\r\n  r = ((glProgramUniform4fvEXT = (PFNGLPROGRAMUNIFORM4FVEXTPROC)glewGetProcAddress((const GLubyte*)\"glProgramUniform4fvEXT\")) == NULL) || r;\r\n  r = ((glProgramUniform4iEXT = (PFNGLPROGRAMUNIFORM4IEXTPROC)glewGetProcAddress((const GLubyte*)\"glProgramUniform4iEXT\")) == NULL) || r;\r\n  r = ((glProgramUniform4ivEXT = (PFNGLPROGRAMUNIFORM4IVEXTPROC)glewGetProcAddress((const GLubyte*)\"glProgramUniform4ivEXT\")) == NULL) || r;\r\n  r = ((glProgramUniform4uiEXT = (PFNGLPROGRAMUNIFORM4UIEXTPROC)glewGetProcAddress((const GLubyte*)\"glProgramUniform4uiEXT\")) == NULL) || r;\r\n  r = ((glProgramUniform4uivEXT = (PFNGLPROGRAMUNIFORM4UIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glProgramUniform4uivEXT\")) == NULL) || r;\r\n  r = ((glProgramUniformMatrix2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC)glewGetProcAddress((const GLubyte*)\"glProgramUniformMatrix2fvEXT\")) == NULL) || r;\r\n  r = ((glProgramUniformMatrix2x3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC)glewGetProcAddress((const GLubyte*)\"glProgramUniformMatrix2x3fvEXT\")) == NULL) || r;\r\n  r = ((glProgramUniformMatrix2x4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC)glewGetProcAddress((const GLubyte*)\"glProgramUniformMatrix2x4fvEXT\")) == NULL) || r;\r\n  r = ((glProgramUniformMatrix3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC)glewGetProcAddress((const GLubyte*)\"glProgramUniformMatrix3fvEXT\")) == NULL) || r;\r\n  r = ((glProgramUniformMatrix3x2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC)glewGetProcAddress((const GLubyte*)\"glProgramUniformMatrix3x2fvEXT\")) == NULL) || r;\r\n  r = ((glProgramUniformMatrix3x4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC)glewGetProcAddress((const GLubyte*)\"glProgramUniformMatrix3x4fvEXT\")) == NULL) || r;\r\n  r = ((glProgramUniformMatrix4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC)glewGetProcAddress((const GLubyte*)\"glProgramUniformMatrix4fvEXT\")) == NULL) || r;\r\n  r = ((glProgramUniformMatrix4x2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC)glewGetProcAddress((const GLubyte*)\"glProgramUniformMatrix4x2fvEXT\")) == NULL) || r;\r\n  r = ((glProgramUniformMatrix4x3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC)glewGetProcAddress((const GLubyte*)\"glProgramUniformMatrix4x3fvEXT\")) == NULL) || r;\r\n  r = ((glPushClientAttribDefaultEXT = (PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC)glewGetProcAddress((const GLubyte*)\"glPushClientAttribDefaultEXT\")) == NULL) || r;\r\n  r = ((glTextureBufferEXT = (PFNGLTEXTUREBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)\"glTextureBufferEXT\")) == NULL) || r;\r\n  r = ((glTextureImage1DEXT = (PFNGLTEXTUREIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)\"glTextureImage1DEXT\")) == NULL) || r;\r\n  r = ((glTextureImage2DEXT = (PFNGLTEXTUREIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)\"glTextureImage2DEXT\")) == NULL) || r;\r\n  r = ((glTextureImage3DEXT = (PFNGLTEXTUREIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)\"glTextureImage3DEXT\")) == NULL) || r;\r\n  r = ((glTextureParameterIivEXT = (PFNGLTEXTUREPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glTextureParameterIivEXT\")) == NULL) || r;\r\n  r = ((glTextureParameterIuivEXT = (PFNGLTEXTUREPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glTextureParameterIuivEXT\")) == NULL) || r;\r\n  r = ((glTextureParameterfEXT = (PFNGLTEXTUREPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)\"glTextureParameterfEXT\")) == NULL) || r;\r\n  r = ((glTextureParameterfvEXT = (PFNGLTEXTUREPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)\"glTextureParameterfvEXT\")) == NULL) || r;\r\n  r = ((glTextureParameteriEXT = (PFNGLTEXTUREPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)\"glTextureParameteriEXT\")) == NULL) || r;\r\n  r = ((glTextureParameterivEXT = (PFNGLTEXTUREPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glTextureParameterivEXT\")) == NULL) || r;\r\n  r = ((glTextureRenderbufferEXT = (PFNGLTEXTURERENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)\"glTextureRenderbufferEXT\")) == NULL) || r;\r\n  r = ((glTextureSubImage1DEXT = (PFNGLTEXTURESUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)\"glTextureSubImage1DEXT\")) == NULL) || r;\r\n  r = ((glTextureSubImage2DEXT = (PFNGLTEXTURESUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)\"glTextureSubImage2DEXT\")) == NULL) || r;\r\n  r = ((glTextureSubImage3DEXT = (PFNGLTEXTURESUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)\"glTextureSubImage3DEXT\")) == NULL) || r;\r\n  r = ((glUnmapNamedBufferEXT = (PFNGLUNMAPNAMEDBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)\"glUnmapNamedBufferEXT\")) == NULL) || r;\r\n  r = ((glVertexArrayColorOffsetEXT = (PFNGLVERTEXARRAYCOLOROFFSETEXTPROC)glewGetProcAddress((const GLubyte*)\"glVertexArrayColorOffsetEXT\")) == NULL) || r;\r\n  r = ((glVertexArrayEdgeFlagOffsetEXT = (PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)\"glVertexArrayEdgeFlagOffsetEXT\")) == NULL) || r;\r\n  r = ((glVertexArrayFogCoordOffsetEXT = (PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)\"glVertexArrayFogCoordOffsetEXT\")) == NULL) || r;\r\n  r = ((glVertexArrayIndexOffsetEXT = (PFNGLVERTEXARRAYINDEXOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)\"glVertexArrayIndexOffsetEXT\")) == NULL) || r;\r\n  r = ((glVertexArrayMultiTexCoordOffsetEXT = (PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)\"glVertexArrayMultiTexCoordOffsetEXT\")) == NULL) || r;\r\n  r = ((glVertexArrayNormalOffsetEXT = (PFNGLVERTEXARRAYNORMALOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)\"glVertexArrayNormalOffsetEXT\")) == NULL) || r;\r\n  r = ((glVertexArraySecondaryColorOffsetEXT = (PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC)glewGetProcAddress((const GLubyte*)\"glVertexArraySecondaryColorOffsetEXT\")) == NULL) || r;\r\n  r = ((glVertexArrayTexCoordOffsetEXT = (PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)\"glVertexArrayTexCoordOffsetEXT\")) == NULL) || r;\r\n  r = ((glVertexArrayVertexAttribIOffsetEXT = (PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)\"glVertexArrayVertexAttribIOffsetEXT\")) == NULL) || r;\r\n  r = ((glVertexArrayVertexAttribOffsetEXT = (PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)\"glVertexArrayVertexAttribOffsetEXT\")) == NULL) || r;\r\n  r = ((glVertexArrayVertexOffsetEXT = (PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)\"glVertexArrayVertexOffsetEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_direct_state_access */\r\n\r\n#ifdef GL_EXT_draw_buffers2\r\n\r\nstatic GLboolean _glewInit_GL_EXT_draw_buffers2 (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glColorMaskIndexedEXT = (PFNGLCOLORMASKINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)\"glColorMaskIndexedEXT\")) == NULL) || r;\r\n  r = ((glDisableIndexedEXT = (PFNGLDISABLEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)\"glDisableIndexedEXT\")) == NULL) || r;\r\n  r = ((glEnableIndexedEXT = (PFNGLENABLEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)\"glEnableIndexedEXT\")) == NULL) || r;\r\n  r = ((glGetBooleanIndexedvEXT = (PFNGLGETBOOLEANINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetBooleanIndexedvEXT\")) == NULL) || r;\r\n  r = ((glGetIntegerIndexedvEXT = (PFNGLGETINTEGERINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetIntegerIndexedvEXT\")) == NULL) || r;\r\n  r = ((glIsEnabledIndexedEXT = (PFNGLISENABLEDINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)\"glIsEnabledIndexedEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_draw_buffers2 */\r\n\r\n#ifdef GL_EXT_draw_instanced\r\n\r\nstatic GLboolean _glewInit_GL_EXT_draw_instanced (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glDrawArraysInstancedEXT = (PFNGLDRAWARRAYSINSTANCEDEXTPROC)glewGetProcAddress((const GLubyte*)\"glDrawArraysInstancedEXT\")) == NULL) || r;\r\n  r = ((glDrawElementsInstancedEXT = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC)glewGetProcAddress((const GLubyte*)\"glDrawElementsInstancedEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_draw_instanced */\r\n\r\n#ifdef GL_EXT_draw_range_elements\r\n\r\nstatic GLboolean _glewInit_GL_EXT_draw_range_elements (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glDrawRangeElementsEXT = (PFNGLDRAWRANGEELEMENTSEXTPROC)glewGetProcAddress((const GLubyte*)\"glDrawRangeElementsEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_draw_range_elements */\r\n\r\n#ifdef GL_EXT_fog_coord\r\n\r\nstatic GLboolean _glewInit_GL_EXT_fog_coord (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glFogCoordPointerEXT = (PFNGLFOGCOORDPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)\"glFogCoordPointerEXT\")) == NULL) || r;\r\n  r = ((glFogCoorddEXT = (PFNGLFOGCOORDDEXTPROC)glewGetProcAddress((const GLubyte*)\"glFogCoorddEXT\")) == NULL) || r;\r\n  r = ((glFogCoorddvEXT = (PFNGLFOGCOORDDVEXTPROC)glewGetProcAddress((const GLubyte*)\"glFogCoorddvEXT\")) == NULL) || r;\r\n  r = ((glFogCoordfEXT = (PFNGLFOGCOORDFEXTPROC)glewGetProcAddress((const GLubyte*)\"glFogCoordfEXT\")) == NULL) || r;\r\n  r = ((glFogCoordfvEXT = (PFNGLFOGCOORDFVEXTPROC)glewGetProcAddress((const GLubyte*)\"glFogCoordfvEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_fog_coord */\r\n\r\n#ifdef GL_EXT_fragment_lighting\r\n\r\nstatic GLboolean _glewInit_GL_EXT_fragment_lighting (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glFragmentColorMaterialEXT = (PFNGLFRAGMENTCOLORMATERIALEXTPROC)glewGetProcAddress((const GLubyte*)\"glFragmentColorMaterialEXT\")) == NULL) || r;\r\n  r = ((glFragmentLightModelfEXT = (PFNGLFRAGMENTLIGHTMODELFEXTPROC)glewGetProcAddress((const GLubyte*)\"glFragmentLightModelfEXT\")) == NULL) || r;\r\n  r = ((glFragmentLightModelfvEXT = (PFNGLFRAGMENTLIGHTMODELFVEXTPROC)glewGetProcAddress((const GLubyte*)\"glFragmentLightModelfvEXT\")) == NULL) || r;\r\n  r = ((glFragmentLightModeliEXT = (PFNGLFRAGMENTLIGHTMODELIEXTPROC)glewGetProcAddress((const GLubyte*)\"glFragmentLightModeliEXT\")) == NULL) || r;\r\n  r = ((glFragmentLightModelivEXT = (PFNGLFRAGMENTLIGHTMODELIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glFragmentLightModelivEXT\")) == NULL) || r;\r\n  r = ((glFragmentLightfEXT = (PFNGLFRAGMENTLIGHTFEXTPROC)glewGetProcAddress((const GLubyte*)\"glFragmentLightfEXT\")) == NULL) || r;\r\n  r = ((glFragmentLightfvEXT = (PFNGLFRAGMENTLIGHTFVEXTPROC)glewGetProcAddress((const GLubyte*)\"glFragmentLightfvEXT\")) == NULL) || r;\r\n  r = ((glFragmentLightiEXT = (PFNGLFRAGMENTLIGHTIEXTPROC)glewGetProcAddress((const GLubyte*)\"glFragmentLightiEXT\")) == NULL) || r;\r\n  r = ((glFragmentLightivEXT = (PFNGLFRAGMENTLIGHTIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glFragmentLightivEXT\")) == NULL) || r;\r\n  r = ((glFragmentMaterialfEXT = (PFNGLFRAGMENTMATERIALFEXTPROC)glewGetProcAddress((const GLubyte*)\"glFragmentMaterialfEXT\")) == NULL) || r;\r\n  r = ((glFragmentMaterialfvEXT = (PFNGLFRAGMENTMATERIALFVEXTPROC)glewGetProcAddress((const GLubyte*)\"glFragmentMaterialfvEXT\")) == NULL) || r;\r\n  r = ((glFragmentMaterialiEXT = (PFNGLFRAGMENTMATERIALIEXTPROC)glewGetProcAddress((const GLubyte*)\"glFragmentMaterialiEXT\")) == NULL) || r;\r\n  r = ((glFragmentMaterialivEXT = (PFNGLFRAGMENTMATERIALIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glFragmentMaterialivEXT\")) == NULL) || r;\r\n  r = ((glGetFragmentLightfvEXT = (PFNGLGETFRAGMENTLIGHTFVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetFragmentLightfvEXT\")) == NULL) || r;\r\n  r = ((glGetFragmentLightivEXT = (PFNGLGETFRAGMENTLIGHTIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetFragmentLightivEXT\")) == NULL) || r;\r\n  r = ((glGetFragmentMaterialfvEXT = (PFNGLGETFRAGMENTMATERIALFVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetFragmentMaterialfvEXT\")) == NULL) || r;\r\n  r = ((glGetFragmentMaterialivEXT = (PFNGLGETFRAGMENTMATERIALIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetFragmentMaterialivEXT\")) == NULL) || r;\r\n  r = ((glLightEnviEXT = (PFNGLLIGHTENVIEXTPROC)glewGetProcAddress((const GLubyte*)\"glLightEnviEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_fragment_lighting */\r\n\r\n#ifdef GL_EXT_framebuffer_blit\r\n\r\nstatic GLboolean _glewInit_GL_EXT_framebuffer_blit (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glBlitFramebufferEXT = (PFNGLBLITFRAMEBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)\"glBlitFramebufferEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_framebuffer_blit */\r\n\r\n#ifdef GL_EXT_framebuffer_multisample\r\n\r\nstatic GLboolean _glewInit_GL_EXT_framebuffer_multisample (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glRenderbufferStorageMultisampleEXT = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)\"glRenderbufferStorageMultisampleEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_framebuffer_multisample */\r\n\r\n#ifdef GL_EXT_framebuffer_object\r\n\r\nstatic GLboolean _glewInit_GL_EXT_framebuffer_object (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)\"glBindFramebufferEXT\")) == NULL) || r;\r\n  r = ((glBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)\"glBindRenderbufferEXT\")) == NULL) || r;\r\n  r = ((glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)glewGetProcAddress((const GLubyte*)\"glCheckFramebufferStatusEXT\")) == NULL) || r;\r\n  r = ((glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)\"glDeleteFramebuffersEXT\")) == NULL) || r;\r\n  r = ((glDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)\"glDeleteRenderbuffersEXT\")) == NULL) || r;\r\n  r = ((glFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)\"glFramebufferRenderbufferEXT\")) == NULL) || r;\r\n  r = ((glFramebufferTexture1DEXT = (PFNGLFRAMEBUFFERTEXTURE1DEXTPROC)glewGetProcAddress((const GLubyte*)\"glFramebufferTexture1DEXT\")) == NULL) || r;\r\n  r = ((glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)glewGetProcAddress((const GLubyte*)\"glFramebufferTexture2DEXT\")) == NULL) || r;\r\n  r = ((glFramebufferTexture3DEXT = (PFNGLFRAMEBUFFERTEXTURE3DEXTPROC)glewGetProcAddress((const GLubyte*)\"glFramebufferTexture3DEXT\")) == NULL) || r;\r\n  r = ((glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)\"glGenFramebuffersEXT\")) == NULL) || r;\r\n  r = ((glGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)\"glGenRenderbuffersEXT\")) == NULL) || r;\r\n  r = ((glGenerateMipmapEXT = (PFNGLGENERATEMIPMAPEXTPROC)glewGetProcAddress((const GLubyte*)\"glGenerateMipmapEXT\")) == NULL) || r;\r\n  r = ((glGetFramebufferAttachmentParameterivEXT = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetFramebufferAttachmentParameterivEXT\")) == NULL) || r;\r\n  r = ((glGetRenderbufferParameterivEXT = (PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetRenderbufferParameterivEXT\")) == NULL) || r;\r\n  r = ((glIsFramebufferEXT = (PFNGLISFRAMEBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)\"glIsFramebufferEXT\")) == NULL) || r;\r\n  r = ((glIsRenderbufferEXT = (PFNGLISRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)\"glIsRenderbufferEXT\")) == NULL) || r;\r\n  r = ((glRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC)glewGetProcAddress((const GLubyte*)\"glRenderbufferStorageEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_framebuffer_object */\r\n\r\n#ifdef GL_EXT_framebuffer_sRGB\r\n\r\n#endif /* GL_EXT_framebuffer_sRGB */\r\n\r\n#ifdef GL_EXT_geometry_shader4\r\n\r\nstatic GLboolean _glewInit_GL_EXT_geometry_shader4 (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glFramebufferTextureEXT = (PFNGLFRAMEBUFFERTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)\"glFramebufferTextureEXT\")) == NULL) || r;\r\n  r = ((glFramebufferTextureFaceEXT = (PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC)glewGetProcAddress((const GLubyte*)\"glFramebufferTextureFaceEXT\")) == NULL) || r;\r\n  r = ((glFramebufferTextureLayerEXT = (PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC)glewGetProcAddress((const GLubyte*)\"glFramebufferTextureLayerEXT\")) == NULL) || r;\r\n  r = ((glProgramParameteriEXT = (PFNGLPROGRAMPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)\"glProgramParameteriEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_geometry_shader4 */\r\n\r\n#ifdef GL_EXT_gpu_program_parameters\r\n\r\nstatic GLboolean _glewInit_GL_EXT_gpu_program_parameters (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glProgramEnvParameters4fvEXT = (PFNGLPROGRAMENVPARAMETERS4FVEXTPROC)glewGetProcAddress((const GLubyte*)\"glProgramEnvParameters4fvEXT\")) == NULL) || r;\r\n  r = ((glProgramLocalParameters4fvEXT = (PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC)glewGetProcAddress((const GLubyte*)\"glProgramLocalParameters4fvEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_gpu_program_parameters */\r\n\r\n#ifdef GL_EXT_gpu_shader4\r\n\r\nstatic GLboolean _glewInit_GL_EXT_gpu_shader4 (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glBindFragDataLocationEXT = (PFNGLBINDFRAGDATALOCATIONEXTPROC)glewGetProcAddress((const GLubyte*)\"glBindFragDataLocationEXT\")) == NULL) || r;\r\n  r = ((glGetFragDataLocationEXT = (PFNGLGETFRAGDATALOCATIONEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetFragDataLocationEXT\")) == NULL) || r;\r\n  r = ((glGetUniformuivEXT = (PFNGLGETUNIFORMUIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetUniformuivEXT\")) == NULL) || r;\r\n  r = ((glGetVertexAttribIivEXT = (PFNGLGETVERTEXATTRIBIIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetVertexAttribIivEXT\")) == NULL) || r;\r\n  r = ((glGetVertexAttribIuivEXT = (PFNGLGETVERTEXATTRIBIUIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetVertexAttribIuivEXT\")) == NULL) || r;\r\n  r = ((glUniform1uiEXT = (PFNGLUNIFORM1UIEXTPROC)glewGetProcAddress((const GLubyte*)\"glUniform1uiEXT\")) == NULL) || r;\r\n  r = ((glUniform1uivEXT = (PFNGLUNIFORM1UIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glUniform1uivEXT\")) == NULL) || r;\r\n  r = ((glUniform2uiEXT = (PFNGLUNIFORM2UIEXTPROC)glewGetProcAddress((const GLubyte*)\"glUniform2uiEXT\")) == NULL) || r;\r\n  r = ((glUniform2uivEXT = (PFNGLUNIFORM2UIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glUniform2uivEXT\")) == NULL) || r;\r\n  r = ((glUniform3uiEXT = (PFNGLUNIFORM3UIEXTPROC)glewGetProcAddress((const GLubyte*)\"glUniform3uiEXT\")) == NULL) || r;\r\n  r = ((glUniform3uivEXT = (PFNGLUNIFORM3UIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glUniform3uivEXT\")) == NULL) || r;\r\n  r = ((glUniform4uiEXT = (PFNGLUNIFORM4UIEXTPROC)glewGetProcAddress((const GLubyte*)\"glUniform4uiEXT\")) == NULL) || r;\r\n  r = ((glUniform4uivEXT = (PFNGLUNIFORM4UIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glUniform4uivEXT\")) == NULL) || r;\r\n  r = ((glVertexAttribI1iEXT = (PFNGLVERTEXATTRIBI1IEXTPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribI1iEXT\")) == NULL) || r;\r\n  r = ((glVertexAttribI1ivEXT = (PFNGLVERTEXATTRIBI1IVEXTPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribI1ivEXT\")) == NULL) || r;\r\n  r = ((glVertexAttribI1uiEXT = (PFNGLVERTEXATTRIBI1UIEXTPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribI1uiEXT\")) == NULL) || r;\r\n  r = ((glVertexAttribI1uivEXT = (PFNGLVERTEXATTRIBI1UIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribI1uivEXT\")) == NULL) || r;\r\n  r = ((glVertexAttribI2iEXT = (PFNGLVERTEXATTRIBI2IEXTPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribI2iEXT\")) == NULL) || r;\r\n  r = ((glVertexAttribI2ivEXT = (PFNGLVERTEXATTRIBI2IVEXTPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribI2ivEXT\")) == NULL) || r;\r\n  r = ((glVertexAttribI2uiEXT = (PFNGLVERTEXATTRIBI2UIEXTPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribI2uiEXT\")) == NULL) || r;\r\n  r = ((glVertexAttribI2uivEXT = (PFNGLVERTEXATTRIBI2UIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribI2uivEXT\")) == NULL) || r;\r\n  r = ((glVertexAttribI3iEXT = (PFNGLVERTEXATTRIBI3IEXTPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribI3iEXT\")) == NULL) || r;\r\n  r = ((glVertexAttribI3ivEXT = (PFNGLVERTEXATTRIBI3IVEXTPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribI3ivEXT\")) == NULL) || r;\r\n  r = ((glVertexAttribI3uiEXT = (PFNGLVERTEXATTRIBI3UIEXTPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribI3uiEXT\")) == NULL) || r;\r\n  r = ((glVertexAttribI3uivEXT = (PFNGLVERTEXATTRIBI3UIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribI3uivEXT\")) == NULL) || r;\r\n  r = ((glVertexAttribI4bvEXT = (PFNGLVERTEXATTRIBI4BVEXTPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribI4bvEXT\")) == NULL) || r;\r\n  r = ((glVertexAttribI4iEXT = (PFNGLVERTEXATTRIBI4IEXTPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribI4iEXT\")) == NULL) || r;\r\n  r = ((glVertexAttribI4ivEXT = (PFNGLVERTEXATTRIBI4IVEXTPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribI4ivEXT\")) == NULL) || r;\r\n  r = ((glVertexAttribI4svEXT = (PFNGLVERTEXATTRIBI4SVEXTPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribI4svEXT\")) == NULL) || r;\r\n  r = ((glVertexAttribI4ubvEXT = (PFNGLVERTEXATTRIBI4UBVEXTPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribI4ubvEXT\")) == NULL) || r;\r\n  r = ((glVertexAttribI4uiEXT = (PFNGLVERTEXATTRIBI4UIEXTPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribI4uiEXT\")) == NULL) || r;\r\n  r = ((glVertexAttribI4uivEXT = (PFNGLVERTEXATTRIBI4UIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribI4uivEXT\")) == NULL) || r;\r\n  r = ((glVertexAttribI4usvEXT = (PFNGLVERTEXATTRIBI4USVEXTPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribI4usvEXT\")) == NULL) || r;\r\n  r = ((glVertexAttribIPointerEXT = (PFNGLVERTEXATTRIBIPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribIPointerEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_gpu_shader4 */\r\n\r\n#ifdef GL_EXT_histogram\r\n\r\nstatic GLboolean _glewInit_GL_EXT_histogram (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glGetHistogramEXT = (PFNGLGETHISTOGRAMEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetHistogramEXT\")) == NULL) || r;\r\n  r = ((glGetHistogramParameterfvEXT = (PFNGLGETHISTOGRAMPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetHistogramParameterfvEXT\")) == NULL) || r;\r\n  r = ((glGetHistogramParameterivEXT = (PFNGLGETHISTOGRAMPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetHistogramParameterivEXT\")) == NULL) || r;\r\n  r = ((glGetMinmaxEXT = (PFNGLGETMINMAXEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetMinmaxEXT\")) == NULL) || r;\r\n  r = ((glGetMinmaxParameterfvEXT = (PFNGLGETMINMAXPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetMinmaxParameterfvEXT\")) == NULL) || r;\r\n  r = ((glGetMinmaxParameterivEXT = (PFNGLGETMINMAXPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetMinmaxParameterivEXT\")) == NULL) || r;\r\n  r = ((glHistogramEXT = (PFNGLHISTOGRAMEXTPROC)glewGetProcAddress((const GLubyte*)\"glHistogramEXT\")) == NULL) || r;\r\n  r = ((glMinmaxEXT = (PFNGLMINMAXEXTPROC)glewGetProcAddress((const GLubyte*)\"glMinmaxEXT\")) == NULL) || r;\r\n  r = ((glResetHistogramEXT = (PFNGLRESETHISTOGRAMEXTPROC)glewGetProcAddress((const GLubyte*)\"glResetHistogramEXT\")) == NULL) || r;\r\n  r = ((glResetMinmaxEXT = (PFNGLRESETMINMAXEXTPROC)glewGetProcAddress((const GLubyte*)\"glResetMinmaxEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_histogram */\r\n\r\n#ifdef GL_EXT_index_array_formats\r\n\r\n#endif /* GL_EXT_index_array_formats */\r\n\r\n#ifdef GL_EXT_index_func\r\n\r\nstatic GLboolean _glewInit_GL_EXT_index_func (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glIndexFuncEXT = (PFNGLINDEXFUNCEXTPROC)glewGetProcAddress((const GLubyte*)\"glIndexFuncEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_index_func */\r\n\r\n#ifdef GL_EXT_index_material\r\n\r\nstatic GLboolean _glewInit_GL_EXT_index_material (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glIndexMaterialEXT = (PFNGLINDEXMATERIALEXTPROC)glewGetProcAddress((const GLubyte*)\"glIndexMaterialEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_index_material */\r\n\r\n#ifdef GL_EXT_index_texture\r\n\r\n#endif /* GL_EXT_index_texture */\r\n\r\n#ifdef GL_EXT_light_texture\r\n\r\nstatic GLboolean _glewInit_GL_EXT_light_texture (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glApplyTextureEXT = (PFNGLAPPLYTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)\"glApplyTextureEXT\")) == NULL) || r;\r\n  r = ((glTextureLightEXT = (PFNGLTEXTURELIGHTEXTPROC)glewGetProcAddress((const GLubyte*)\"glTextureLightEXT\")) == NULL) || r;\r\n  r = ((glTextureMaterialEXT = (PFNGLTEXTUREMATERIALEXTPROC)glewGetProcAddress((const GLubyte*)\"glTextureMaterialEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_light_texture */\r\n\r\n#ifdef GL_EXT_misc_attribute\r\n\r\n#endif /* GL_EXT_misc_attribute */\r\n\r\n#ifdef GL_EXT_multi_draw_arrays\r\n\r\nstatic GLboolean _glewInit_GL_EXT_multi_draw_arrays (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glMultiDrawArraysEXT = (PFNGLMULTIDRAWARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)\"glMultiDrawArraysEXT\")) == NULL) || r;\r\n  r = ((glMultiDrawElementsEXT = (PFNGLMULTIDRAWELEMENTSEXTPROC)glewGetProcAddress((const GLubyte*)\"glMultiDrawElementsEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_multi_draw_arrays */\r\n\r\n#ifdef GL_EXT_multisample\r\n\r\nstatic GLboolean _glewInit_GL_EXT_multisample (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glSampleMaskEXT = (PFNGLSAMPLEMASKEXTPROC)glewGetProcAddress((const GLubyte*)\"glSampleMaskEXT\")) == NULL) || r;\r\n  r = ((glSamplePatternEXT = (PFNGLSAMPLEPATTERNEXTPROC)glewGetProcAddress((const GLubyte*)\"glSamplePatternEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_multisample */\r\n\r\n#ifdef GL_EXT_packed_depth_stencil\r\n\r\n#endif /* GL_EXT_packed_depth_stencil */\r\n\r\n#ifdef GL_EXT_packed_float\r\n\r\n#endif /* GL_EXT_packed_float */\r\n\r\n#ifdef GL_EXT_packed_pixels\r\n\r\n#endif /* GL_EXT_packed_pixels */\r\n\r\n#ifdef GL_EXT_paletted_texture\r\n\r\nstatic GLboolean _glewInit_GL_EXT_paletted_texture (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glColorTableEXT = (PFNGLCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)\"glColorTableEXT\")) == NULL) || r;\r\n  r = ((glGetColorTableEXT = (PFNGLGETCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetColorTableEXT\")) == NULL) || r;\r\n  r = ((glGetColorTableParameterfvEXT = (PFNGLGETCOLORTABLEPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetColorTableParameterfvEXT\")) == NULL) || r;\r\n  r = ((glGetColorTableParameterivEXT = (PFNGLGETCOLORTABLEPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetColorTableParameterivEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_paletted_texture */\r\n\r\n#ifdef GL_EXT_pixel_buffer_object\r\n\r\n#endif /* GL_EXT_pixel_buffer_object */\r\n\r\n#ifdef GL_EXT_pixel_transform\r\n\r\nstatic GLboolean _glewInit_GL_EXT_pixel_transform (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glGetPixelTransformParameterfvEXT = (PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetPixelTransformParameterfvEXT\")) == NULL) || r;\r\n  r = ((glGetPixelTransformParameterivEXT = (PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetPixelTransformParameterivEXT\")) == NULL) || r;\r\n  r = ((glPixelTransformParameterfEXT = (PFNGLPIXELTRANSFORMPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)\"glPixelTransformParameterfEXT\")) == NULL) || r;\r\n  r = ((glPixelTransformParameterfvEXT = (PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)\"glPixelTransformParameterfvEXT\")) == NULL) || r;\r\n  r = ((glPixelTransformParameteriEXT = (PFNGLPIXELTRANSFORMPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)\"glPixelTransformParameteriEXT\")) == NULL) || r;\r\n  r = ((glPixelTransformParameterivEXT = (PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glPixelTransformParameterivEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_pixel_transform */\r\n\r\n#ifdef GL_EXT_pixel_transform_color_table\r\n\r\n#endif /* GL_EXT_pixel_transform_color_table */\r\n\r\n#ifdef GL_EXT_point_parameters\r\n\r\nstatic GLboolean _glewInit_GL_EXT_point_parameters (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glPointParameterfEXT = (PFNGLPOINTPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)\"glPointParameterfEXT\")) == NULL) || r;\r\n  r = ((glPointParameterfvEXT = (PFNGLPOINTPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)\"glPointParameterfvEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_point_parameters */\r\n\r\n#ifdef GL_EXT_polygon_offset\r\n\r\nstatic GLboolean _glewInit_GL_EXT_polygon_offset (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glPolygonOffsetEXT = (PFNGLPOLYGONOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)\"glPolygonOffsetEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_polygon_offset */\r\n\r\n#ifdef GL_EXT_provoking_vertex\r\n\r\nstatic GLboolean _glewInit_GL_EXT_provoking_vertex (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glProvokingVertexEXT = (PFNGLPROVOKINGVERTEXEXTPROC)glewGetProcAddress((const GLubyte*)\"glProvokingVertexEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_provoking_vertex */\r\n\r\n#ifdef GL_EXT_rescale_normal\r\n\r\n#endif /* GL_EXT_rescale_normal */\r\n\r\n#ifdef GL_EXT_scene_marker\r\n\r\nstatic GLboolean _glewInit_GL_EXT_scene_marker (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glBeginSceneEXT = (PFNGLBEGINSCENEEXTPROC)glewGetProcAddress((const GLubyte*)\"glBeginSceneEXT\")) == NULL) || r;\r\n  r = ((glEndSceneEXT = (PFNGLENDSCENEEXTPROC)glewGetProcAddress((const GLubyte*)\"glEndSceneEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_scene_marker */\r\n\r\n#ifdef GL_EXT_secondary_color\r\n\r\nstatic GLboolean _glewInit_GL_EXT_secondary_color (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glSecondaryColor3bEXT = (PFNGLSECONDARYCOLOR3BEXTPROC)glewGetProcAddress((const GLubyte*)\"glSecondaryColor3bEXT\")) == NULL) || r;\r\n  r = ((glSecondaryColor3bvEXT = (PFNGLSECONDARYCOLOR3BVEXTPROC)glewGetProcAddress((const GLubyte*)\"glSecondaryColor3bvEXT\")) == NULL) || r;\r\n  r = ((glSecondaryColor3dEXT = (PFNGLSECONDARYCOLOR3DEXTPROC)glewGetProcAddress((const GLubyte*)\"glSecondaryColor3dEXT\")) == NULL) || r;\r\n  r = ((glSecondaryColor3dvEXT = (PFNGLSECONDARYCOLOR3DVEXTPROC)glewGetProcAddress((const GLubyte*)\"glSecondaryColor3dvEXT\")) == NULL) || r;\r\n  r = ((glSecondaryColor3fEXT = (PFNGLSECONDARYCOLOR3FEXTPROC)glewGetProcAddress((const GLubyte*)\"glSecondaryColor3fEXT\")) == NULL) || r;\r\n  r = ((glSecondaryColor3fvEXT = (PFNGLSECONDARYCOLOR3FVEXTPROC)glewGetProcAddress((const GLubyte*)\"glSecondaryColor3fvEXT\")) == NULL) || r;\r\n  r = ((glSecondaryColor3iEXT = (PFNGLSECONDARYCOLOR3IEXTPROC)glewGetProcAddress((const GLubyte*)\"glSecondaryColor3iEXT\")) == NULL) || r;\r\n  r = ((glSecondaryColor3ivEXT = (PFNGLSECONDARYCOLOR3IVEXTPROC)glewGetProcAddress((const GLubyte*)\"glSecondaryColor3ivEXT\")) == NULL) || r;\r\n  r = ((glSecondaryColor3sEXT = (PFNGLSECONDARYCOLOR3SEXTPROC)glewGetProcAddress((const GLubyte*)\"glSecondaryColor3sEXT\")) == NULL) || r;\r\n  r = ((glSecondaryColor3svEXT = (PFNGLSECONDARYCOLOR3SVEXTPROC)glewGetProcAddress((const GLubyte*)\"glSecondaryColor3svEXT\")) == NULL) || r;\r\n  r = ((glSecondaryColor3ubEXT = (PFNGLSECONDARYCOLOR3UBEXTPROC)glewGetProcAddress((const GLubyte*)\"glSecondaryColor3ubEXT\")) == NULL) || r;\r\n  r = ((glSecondaryColor3ubvEXT = (PFNGLSECONDARYCOLOR3UBVEXTPROC)glewGetProcAddress((const GLubyte*)\"glSecondaryColor3ubvEXT\")) == NULL) || r;\r\n  r = ((glSecondaryColor3uiEXT = (PFNGLSECONDARYCOLOR3UIEXTPROC)glewGetProcAddress((const GLubyte*)\"glSecondaryColor3uiEXT\")) == NULL) || r;\r\n  r = ((glSecondaryColor3uivEXT = (PFNGLSECONDARYCOLOR3UIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glSecondaryColor3uivEXT\")) == NULL) || r;\r\n  r = ((glSecondaryColor3usEXT = (PFNGLSECONDARYCOLOR3USEXTPROC)glewGetProcAddress((const GLubyte*)\"glSecondaryColor3usEXT\")) == NULL) || r;\r\n  r = ((glSecondaryColor3usvEXT = (PFNGLSECONDARYCOLOR3USVEXTPROC)glewGetProcAddress((const GLubyte*)\"glSecondaryColor3usvEXT\")) == NULL) || r;\r\n  r = ((glSecondaryColorPointerEXT = (PFNGLSECONDARYCOLORPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)\"glSecondaryColorPointerEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_secondary_color */\r\n\r\n#ifdef GL_EXT_separate_shader_objects\r\n\r\nstatic GLboolean _glewInit_GL_EXT_separate_shader_objects (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glActiveProgramEXT = (PFNGLACTIVEPROGRAMEXTPROC)glewGetProcAddress((const GLubyte*)\"glActiveProgramEXT\")) == NULL) || r;\r\n  r = ((glCreateShaderProgramEXT = (PFNGLCREATESHADERPROGRAMEXTPROC)glewGetProcAddress((const GLubyte*)\"glCreateShaderProgramEXT\")) == NULL) || r;\r\n  r = ((glUseShaderProgramEXT = (PFNGLUSESHADERPROGRAMEXTPROC)glewGetProcAddress((const GLubyte*)\"glUseShaderProgramEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_separate_shader_objects */\r\n\r\n#ifdef GL_EXT_separate_specular_color\r\n\r\n#endif /* GL_EXT_separate_specular_color */\r\n\r\n#ifdef GL_EXT_shadow_funcs\r\n\r\n#endif /* GL_EXT_shadow_funcs */\r\n\r\n#ifdef GL_EXT_shared_texture_palette\r\n\r\n#endif /* GL_EXT_shared_texture_palette */\r\n\r\n#ifdef GL_EXT_stencil_clear_tag\r\n\r\n#endif /* GL_EXT_stencil_clear_tag */\r\n\r\n#ifdef GL_EXT_stencil_two_side\r\n\r\nstatic GLboolean _glewInit_GL_EXT_stencil_two_side (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glActiveStencilFaceEXT = (PFNGLACTIVESTENCILFACEEXTPROC)glewGetProcAddress((const GLubyte*)\"glActiveStencilFaceEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_stencil_two_side */\r\n\r\n#ifdef GL_EXT_stencil_wrap\r\n\r\n#endif /* GL_EXT_stencil_wrap */\r\n\r\n#ifdef GL_EXT_subtexture\r\n\r\nstatic GLboolean _glewInit_GL_EXT_subtexture (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glTexSubImage1DEXT = (PFNGLTEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)\"glTexSubImage1DEXT\")) == NULL) || r;\r\n  r = ((glTexSubImage2DEXT = (PFNGLTEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)\"glTexSubImage2DEXT\")) == NULL) || r;\r\n  r = ((glTexSubImage3DEXT = (PFNGLTEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)\"glTexSubImage3DEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_subtexture */\r\n\r\n#ifdef GL_EXT_texture\r\n\r\n#endif /* GL_EXT_texture */\r\n\r\n#ifdef GL_EXT_texture3D\r\n\r\nstatic GLboolean _glewInit_GL_EXT_texture3D (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glTexImage3DEXT = (PFNGLTEXIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)\"glTexImage3DEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_texture3D */\r\n\r\n#ifdef GL_EXT_texture_array\r\n\r\n#endif /* GL_EXT_texture_array */\r\n\r\n#ifdef GL_EXT_texture_buffer_object\r\n\r\nstatic GLboolean _glewInit_GL_EXT_texture_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glTexBufferEXT = (PFNGLTEXBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)\"glTexBufferEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_texture_buffer_object */\r\n\r\n#ifdef GL_EXT_texture_compression_dxt1\r\n\r\n#endif /* GL_EXT_texture_compression_dxt1 */\r\n\r\n#ifdef GL_EXT_texture_compression_latc\r\n\r\n#endif /* GL_EXT_texture_compression_latc */\r\n\r\n#ifdef GL_EXT_texture_compression_rgtc\r\n\r\n#endif /* GL_EXT_texture_compression_rgtc */\r\n\r\n#ifdef GL_EXT_texture_compression_s3tc\r\n\r\n#endif /* GL_EXT_texture_compression_s3tc */\r\n\r\n#ifdef GL_EXT_texture_cube_map\r\n\r\n#endif /* GL_EXT_texture_cube_map */\r\n\r\n#ifdef GL_EXT_texture_edge_clamp\r\n\r\n#endif /* GL_EXT_texture_edge_clamp */\r\n\r\n#ifdef GL_EXT_texture_env\r\n\r\n#endif /* GL_EXT_texture_env */\r\n\r\n#ifdef GL_EXT_texture_env_add\r\n\r\n#endif /* GL_EXT_texture_env_add */\r\n\r\n#ifdef GL_EXT_texture_env_combine\r\n\r\n#endif /* GL_EXT_texture_env_combine */\r\n\r\n#ifdef GL_EXT_texture_env_dot3\r\n\r\n#endif /* GL_EXT_texture_env_dot3 */\r\n\r\n#ifdef GL_EXT_texture_filter_anisotropic\r\n\r\n#endif /* GL_EXT_texture_filter_anisotropic */\r\n\r\n#ifdef GL_EXT_texture_integer\r\n\r\nstatic GLboolean _glewInit_GL_EXT_texture_integer (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glClearColorIiEXT = (PFNGLCLEARCOLORIIEXTPROC)glewGetProcAddress((const GLubyte*)\"glClearColorIiEXT\")) == NULL) || r;\r\n  r = ((glClearColorIuiEXT = (PFNGLCLEARCOLORIUIEXTPROC)glewGetProcAddress((const GLubyte*)\"glClearColorIuiEXT\")) == NULL) || r;\r\n  r = ((glGetTexParameterIivEXT = (PFNGLGETTEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetTexParameterIivEXT\")) == NULL) || r;\r\n  r = ((glGetTexParameterIuivEXT = (PFNGLGETTEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetTexParameterIuivEXT\")) == NULL) || r;\r\n  r = ((glTexParameterIivEXT = (PFNGLTEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glTexParameterIivEXT\")) == NULL) || r;\r\n  r = ((glTexParameterIuivEXT = (PFNGLTEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glTexParameterIuivEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_texture_integer */\r\n\r\n#ifdef GL_EXT_texture_lod_bias\r\n\r\n#endif /* GL_EXT_texture_lod_bias */\r\n\r\n#ifdef GL_EXT_texture_mirror_clamp\r\n\r\n#endif /* GL_EXT_texture_mirror_clamp */\r\n\r\n#ifdef GL_EXT_texture_object\r\n\r\nstatic GLboolean _glewInit_GL_EXT_texture_object (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glAreTexturesResidentEXT = (PFNGLARETEXTURESRESIDENTEXTPROC)glewGetProcAddress((const GLubyte*)\"glAreTexturesResidentEXT\")) == NULL) || r;\r\n  r = ((glBindTextureEXT = (PFNGLBINDTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)\"glBindTextureEXT\")) == NULL) || r;\r\n  r = ((glDeleteTexturesEXT = (PFNGLDELETETEXTURESEXTPROC)glewGetProcAddress((const GLubyte*)\"glDeleteTexturesEXT\")) == NULL) || r;\r\n  r = ((glGenTexturesEXT = (PFNGLGENTEXTURESEXTPROC)glewGetProcAddress((const GLubyte*)\"glGenTexturesEXT\")) == NULL) || r;\r\n  r = ((glIsTextureEXT = (PFNGLISTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)\"glIsTextureEXT\")) == NULL) || r;\r\n  r = ((glPrioritizeTexturesEXT = (PFNGLPRIORITIZETEXTURESEXTPROC)glewGetProcAddress((const GLubyte*)\"glPrioritizeTexturesEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_texture_object */\r\n\r\n#ifdef GL_EXT_texture_perturb_normal\r\n\r\nstatic GLboolean _glewInit_GL_EXT_texture_perturb_normal (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glTextureNormalEXT = (PFNGLTEXTURENORMALEXTPROC)glewGetProcAddress((const GLubyte*)\"glTextureNormalEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_texture_perturb_normal */\r\n\r\n#ifdef GL_EXT_texture_rectangle\r\n\r\n#endif /* GL_EXT_texture_rectangle */\r\n\r\n#ifdef GL_EXT_texture_sRGB\r\n\r\n#endif /* GL_EXT_texture_sRGB */\r\n\r\n#ifdef GL_EXT_texture_shared_exponent\r\n\r\n#endif /* GL_EXT_texture_shared_exponent */\r\n\r\n#ifdef GL_EXT_texture_snorm\r\n\r\n#endif /* GL_EXT_texture_snorm */\r\n\r\n#ifdef GL_EXT_texture_swizzle\r\n\r\n#endif /* GL_EXT_texture_swizzle */\r\n\r\n#ifdef GL_EXT_timer_query\r\n\r\nstatic GLboolean _glewInit_GL_EXT_timer_query (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glGetQueryObjecti64vEXT = (PFNGLGETQUERYOBJECTI64VEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetQueryObjecti64vEXT\")) == NULL) || r;\r\n  r = ((glGetQueryObjectui64vEXT = (PFNGLGETQUERYOBJECTUI64VEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetQueryObjectui64vEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_timer_query */\r\n\r\n#ifdef GL_EXT_transform_feedback\r\n\r\nstatic GLboolean _glewInit_GL_EXT_transform_feedback (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glBeginTransformFeedbackEXT = (PFNGLBEGINTRANSFORMFEEDBACKEXTPROC)glewGetProcAddress((const GLubyte*)\"glBeginTransformFeedbackEXT\")) == NULL) || r;\r\n  r = ((glBindBufferBaseEXT = (PFNGLBINDBUFFERBASEEXTPROC)glewGetProcAddress((const GLubyte*)\"glBindBufferBaseEXT\")) == NULL) || r;\r\n  r = ((glBindBufferOffsetEXT = (PFNGLBINDBUFFEROFFSETEXTPROC)glewGetProcAddress((const GLubyte*)\"glBindBufferOffsetEXT\")) == NULL) || r;\r\n  r = ((glBindBufferRangeEXT = (PFNGLBINDBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)\"glBindBufferRangeEXT\")) == NULL) || r;\r\n  r = ((glEndTransformFeedbackEXT = (PFNGLENDTRANSFORMFEEDBACKEXTPROC)glewGetProcAddress((const GLubyte*)\"glEndTransformFeedbackEXT\")) == NULL) || r;\r\n  r = ((glGetTransformFeedbackVaryingEXT = (PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetTransformFeedbackVaryingEXT\")) == NULL) || r;\r\n  r = ((glTransformFeedbackVaryingsEXT = (PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC)glewGetProcAddress((const GLubyte*)\"glTransformFeedbackVaryingsEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_transform_feedback */\r\n\r\n#ifdef GL_EXT_vertex_array\r\n\r\nstatic GLboolean _glewInit_GL_EXT_vertex_array (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glArrayElementEXT = (PFNGLARRAYELEMENTEXTPROC)glewGetProcAddress((const GLubyte*)\"glArrayElementEXT\")) == NULL) || r;\r\n  r = ((glColorPointerEXT = (PFNGLCOLORPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)\"glColorPointerEXT\")) == NULL) || r;\r\n  r = ((glDrawArraysEXT = (PFNGLDRAWARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)\"glDrawArraysEXT\")) == NULL) || r;\r\n  r = ((glEdgeFlagPointerEXT = (PFNGLEDGEFLAGPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)\"glEdgeFlagPointerEXT\")) == NULL) || r;\r\n  r = ((glGetPointervEXT = (PFNGLGETPOINTERVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetPointervEXT\")) == NULL) || r;\r\n  r = ((glIndexPointerEXT = (PFNGLINDEXPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)\"glIndexPointerEXT\")) == NULL) || r;\r\n  r = ((glNormalPointerEXT = (PFNGLNORMALPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)\"glNormalPointerEXT\")) == NULL) || r;\r\n  r = ((glTexCoordPointerEXT = (PFNGLTEXCOORDPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)\"glTexCoordPointerEXT\")) == NULL) || r;\r\n  r = ((glVertexPointerEXT = (PFNGLVERTEXPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)\"glVertexPointerEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_vertex_array */\r\n\r\n#ifdef GL_EXT_vertex_array_bgra\r\n\r\n#endif /* GL_EXT_vertex_array_bgra */\r\n\r\n#ifdef GL_EXT_vertex_shader\r\n\r\nstatic GLboolean _glewInit_GL_EXT_vertex_shader (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glBeginVertexShaderEXT = (PFNGLBEGINVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)\"glBeginVertexShaderEXT\")) == NULL) || r;\r\n  r = ((glBindLightParameterEXT = (PFNGLBINDLIGHTPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)\"glBindLightParameterEXT\")) == NULL) || r;\r\n  r = ((glBindMaterialParameterEXT = (PFNGLBINDMATERIALPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)\"glBindMaterialParameterEXT\")) == NULL) || r;\r\n  r = ((glBindParameterEXT = (PFNGLBINDPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)\"glBindParameterEXT\")) == NULL) || r;\r\n  r = ((glBindTexGenParameterEXT = (PFNGLBINDTEXGENPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)\"glBindTexGenParameterEXT\")) == NULL) || r;\r\n  r = ((glBindTextureUnitParameterEXT = (PFNGLBINDTEXTUREUNITPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)\"glBindTextureUnitParameterEXT\")) == NULL) || r;\r\n  r = ((glBindVertexShaderEXT = (PFNGLBINDVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)\"glBindVertexShaderEXT\")) == NULL) || r;\r\n  r = ((glDeleteVertexShaderEXT = (PFNGLDELETEVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)\"glDeleteVertexShaderEXT\")) == NULL) || r;\r\n  r = ((glDisableVariantClientStateEXT = (PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC)glewGetProcAddress((const GLubyte*)\"glDisableVariantClientStateEXT\")) == NULL) || r;\r\n  r = ((glEnableVariantClientStateEXT = (PFNGLENABLEVARIANTCLIENTSTATEEXTPROC)glewGetProcAddress((const GLubyte*)\"glEnableVariantClientStateEXT\")) == NULL) || r;\r\n  r = ((glEndVertexShaderEXT = (PFNGLENDVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)\"glEndVertexShaderEXT\")) == NULL) || r;\r\n  r = ((glExtractComponentEXT = (PFNGLEXTRACTCOMPONENTEXTPROC)glewGetProcAddress((const GLubyte*)\"glExtractComponentEXT\")) == NULL) || r;\r\n  r = ((glGenSymbolsEXT = (PFNGLGENSYMBOLSEXTPROC)glewGetProcAddress((const GLubyte*)\"glGenSymbolsEXT\")) == NULL) || r;\r\n  r = ((glGenVertexShadersEXT = (PFNGLGENVERTEXSHADERSEXTPROC)glewGetProcAddress((const GLubyte*)\"glGenVertexShadersEXT\")) == NULL) || r;\r\n  r = ((glGetInvariantBooleanvEXT = (PFNGLGETINVARIANTBOOLEANVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetInvariantBooleanvEXT\")) == NULL) || r;\r\n  r = ((glGetInvariantFloatvEXT = (PFNGLGETINVARIANTFLOATVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetInvariantFloatvEXT\")) == NULL) || r;\r\n  r = ((glGetInvariantIntegervEXT = (PFNGLGETINVARIANTINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetInvariantIntegervEXT\")) == NULL) || r;\r\n  r = ((glGetLocalConstantBooleanvEXT = (PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetLocalConstantBooleanvEXT\")) == NULL) || r;\r\n  r = ((glGetLocalConstantFloatvEXT = (PFNGLGETLOCALCONSTANTFLOATVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetLocalConstantFloatvEXT\")) == NULL) || r;\r\n  r = ((glGetLocalConstantIntegervEXT = (PFNGLGETLOCALCONSTANTINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetLocalConstantIntegervEXT\")) == NULL) || r;\r\n  r = ((glGetVariantBooleanvEXT = (PFNGLGETVARIANTBOOLEANVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetVariantBooleanvEXT\")) == NULL) || r;\r\n  r = ((glGetVariantFloatvEXT = (PFNGLGETVARIANTFLOATVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetVariantFloatvEXT\")) == NULL) || r;\r\n  r = ((glGetVariantIntegervEXT = (PFNGLGETVARIANTINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetVariantIntegervEXT\")) == NULL) || r;\r\n  r = ((glGetVariantPointervEXT = (PFNGLGETVARIANTPOINTERVEXTPROC)glewGetProcAddress((const GLubyte*)\"glGetVariantPointervEXT\")) == NULL) || r;\r\n  r = ((glInsertComponentEXT = (PFNGLINSERTCOMPONENTEXTPROC)glewGetProcAddress((const GLubyte*)\"glInsertComponentEXT\")) == NULL) || r;\r\n  r = ((glIsVariantEnabledEXT = (PFNGLISVARIANTENABLEDEXTPROC)glewGetProcAddress((const GLubyte*)\"glIsVariantEnabledEXT\")) == NULL) || r;\r\n  r = ((glSetInvariantEXT = (PFNGLSETINVARIANTEXTPROC)glewGetProcAddress((const GLubyte*)\"glSetInvariantEXT\")) == NULL) || r;\r\n  r = ((glSetLocalConstantEXT = (PFNGLSETLOCALCONSTANTEXTPROC)glewGetProcAddress((const GLubyte*)\"glSetLocalConstantEXT\")) == NULL) || r;\r\n  r = ((glShaderOp1EXT = (PFNGLSHADEROP1EXTPROC)glewGetProcAddress((const GLubyte*)\"glShaderOp1EXT\")) == NULL) || r;\r\n  r = ((glShaderOp2EXT = (PFNGLSHADEROP2EXTPROC)glewGetProcAddress((const GLubyte*)\"glShaderOp2EXT\")) == NULL) || r;\r\n  r = ((glShaderOp3EXT = (PFNGLSHADEROP3EXTPROC)glewGetProcAddress((const GLubyte*)\"glShaderOp3EXT\")) == NULL) || r;\r\n  r = ((glSwizzleEXT = (PFNGLSWIZZLEEXTPROC)glewGetProcAddress((const GLubyte*)\"glSwizzleEXT\")) == NULL) || r;\r\n  r = ((glVariantPointerEXT = (PFNGLVARIANTPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)\"glVariantPointerEXT\")) == NULL) || r;\r\n  r = ((glVariantbvEXT = (PFNGLVARIANTBVEXTPROC)glewGetProcAddress((const GLubyte*)\"glVariantbvEXT\")) == NULL) || r;\r\n  r = ((glVariantdvEXT = (PFNGLVARIANTDVEXTPROC)glewGetProcAddress((const GLubyte*)\"glVariantdvEXT\")) == NULL) || r;\r\n  r = ((glVariantfvEXT = (PFNGLVARIANTFVEXTPROC)glewGetProcAddress((const GLubyte*)\"glVariantfvEXT\")) == NULL) || r;\r\n  r = ((glVariantivEXT = (PFNGLVARIANTIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glVariantivEXT\")) == NULL) || r;\r\n  r = ((glVariantsvEXT = (PFNGLVARIANTSVEXTPROC)glewGetProcAddress((const GLubyte*)\"glVariantsvEXT\")) == NULL) || r;\r\n  r = ((glVariantubvEXT = (PFNGLVARIANTUBVEXTPROC)glewGetProcAddress((const GLubyte*)\"glVariantubvEXT\")) == NULL) || r;\r\n  r = ((glVariantuivEXT = (PFNGLVARIANTUIVEXTPROC)glewGetProcAddress((const GLubyte*)\"glVariantuivEXT\")) == NULL) || r;\r\n  r = ((glVariantusvEXT = (PFNGLVARIANTUSVEXTPROC)glewGetProcAddress((const GLubyte*)\"glVariantusvEXT\")) == NULL) || r;\r\n  r = ((glWriteMaskEXT = (PFNGLWRITEMASKEXTPROC)glewGetProcAddress((const GLubyte*)\"glWriteMaskEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_vertex_shader */\r\n\r\n#ifdef GL_EXT_vertex_weighting\r\n\r\nstatic GLboolean _glewInit_GL_EXT_vertex_weighting (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glVertexWeightPointerEXT = (PFNGLVERTEXWEIGHTPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)\"glVertexWeightPointerEXT\")) == NULL) || r;\r\n  r = ((glVertexWeightfEXT = (PFNGLVERTEXWEIGHTFEXTPROC)glewGetProcAddress((const GLubyte*)\"glVertexWeightfEXT\")) == NULL) || r;\r\n  r = ((glVertexWeightfvEXT = (PFNGLVERTEXWEIGHTFVEXTPROC)glewGetProcAddress((const GLubyte*)\"glVertexWeightfvEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_EXT_vertex_weighting */\r\n\r\n#ifdef GL_GREMEDY_frame_terminator\r\n\r\nstatic GLboolean _glewInit_GL_GREMEDY_frame_terminator (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glFrameTerminatorGREMEDY = (PFNGLFRAMETERMINATORGREMEDYPROC)glewGetProcAddress((const GLubyte*)\"glFrameTerminatorGREMEDY\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_GREMEDY_frame_terminator */\r\n\r\n#ifdef GL_GREMEDY_string_marker\r\n\r\nstatic GLboolean _glewInit_GL_GREMEDY_string_marker (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glStringMarkerGREMEDY = (PFNGLSTRINGMARKERGREMEDYPROC)glewGetProcAddress((const GLubyte*)\"glStringMarkerGREMEDY\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_GREMEDY_string_marker */\r\n\r\n#ifdef GL_HP_convolution_border_modes\r\n\r\n#endif /* GL_HP_convolution_border_modes */\r\n\r\n#ifdef GL_HP_image_transform\r\n\r\nstatic GLboolean _glewInit_GL_HP_image_transform (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glGetImageTransformParameterfvHP = (PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC)glewGetProcAddress((const GLubyte*)\"glGetImageTransformParameterfvHP\")) == NULL) || r;\r\n  r = ((glGetImageTransformParameterivHP = (PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC)glewGetProcAddress((const GLubyte*)\"glGetImageTransformParameterivHP\")) == NULL) || r;\r\n  r = ((glImageTransformParameterfHP = (PFNGLIMAGETRANSFORMPARAMETERFHPPROC)glewGetProcAddress((const GLubyte*)\"glImageTransformParameterfHP\")) == NULL) || r;\r\n  r = ((glImageTransformParameterfvHP = (PFNGLIMAGETRANSFORMPARAMETERFVHPPROC)glewGetProcAddress((const GLubyte*)\"glImageTransformParameterfvHP\")) == NULL) || r;\r\n  r = ((glImageTransformParameteriHP = (PFNGLIMAGETRANSFORMPARAMETERIHPPROC)glewGetProcAddress((const GLubyte*)\"glImageTransformParameteriHP\")) == NULL) || r;\r\n  r = ((glImageTransformParameterivHP = (PFNGLIMAGETRANSFORMPARAMETERIVHPPROC)glewGetProcAddress((const GLubyte*)\"glImageTransformParameterivHP\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_HP_image_transform */\r\n\r\n#ifdef GL_HP_occlusion_test\r\n\r\n#endif /* GL_HP_occlusion_test */\r\n\r\n#ifdef GL_HP_texture_lighting\r\n\r\n#endif /* GL_HP_texture_lighting */\r\n\r\n#ifdef GL_IBM_cull_vertex\r\n\r\n#endif /* GL_IBM_cull_vertex */\r\n\r\n#ifdef GL_IBM_multimode_draw_arrays\r\n\r\nstatic GLboolean _glewInit_GL_IBM_multimode_draw_arrays (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glMultiModeDrawArraysIBM = (PFNGLMULTIMODEDRAWARRAYSIBMPROC)glewGetProcAddress((const GLubyte*)\"glMultiModeDrawArraysIBM\")) == NULL) || r;\r\n  r = ((glMultiModeDrawElementsIBM = (PFNGLMULTIMODEDRAWELEMENTSIBMPROC)glewGetProcAddress((const GLubyte*)\"glMultiModeDrawElementsIBM\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_IBM_multimode_draw_arrays */\r\n\r\n#ifdef GL_IBM_rasterpos_clip\r\n\r\n#endif /* GL_IBM_rasterpos_clip */\r\n\r\n#ifdef GL_IBM_static_data\r\n\r\n#endif /* GL_IBM_static_data */\r\n\r\n#ifdef GL_IBM_texture_mirrored_repeat\r\n\r\n#endif /* GL_IBM_texture_mirrored_repeat */\r\n\r\n#ifdef GL_IBM_vertex_array_lists\r\n\r\nstatic GLboolean _glewInit_GL_IBM_vertex_array_lists (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glColorPointerListIBM = (PFNGLCOLORPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)\"glColorPointerListIBM\")) == NULL) || r;\r\n  r = ((glEdgeFlagPointerListIBM = (PFNGLEDGEFLAGPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)\"glEdgeFlagPointerListIBM\")) == NULL) || r;\r\n  r = ((glFogCoordPointerListIBM = (PFNGLFOGCOORDPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)\"glFogCoordPointerListIBM\")) == NULL) || r;\r\n  r = ((glIndexPointerListIBM = (PFNGLINDEXPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)\"glIndexPointerListIBM\")) == NULL) || r;\r\n  r = ((glNormalPointerListIBM = (PFNGLNORMALPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)\"glNormalPointerListIBM\")) == NULL) || r;\r\n  r = ((glSecondaryColorPointerListIBM = (PFNGLSECONDARYCOLORPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)\"glSecondaryColorPointerListIBM\")) == NULL) || r;\r\n  r = ((glTexCoordPointerListIBM = (PFNGLTEXCOORDPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)\"glTexCoordPointerListIBM\")) == NULL) || r;\r\n  r = ((glVertexPointerListIBM = (PFNGLVERTEXPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)\"glVertexPointerListIBM\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_IBM_vertex_array_lists */\r\n\r\n#ifdef GL_INGR_color_clamp\r\n\r\n#endif /* GL_INGR_color_clamp */\r\n\r\n#ifdef GL_INGR_interlace_read\r\n\r\n#endif /* GL_INGR_interlace_read */\r\n\r\n#ifdef GL_INTEL_parallel_arrays\r\n\r\nstatic GLboolean _glewInit_GL_INTEL_parallel_arrays (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glColorPointervINTEL = (PFNGLCOLORPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)\"glColorPointervINTEL\")) == NULL) || r;\r\n  r = ((glNormalPointervINTEL = (PFNGLNORMALPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)\"glNormalPointervINTEL\")) == NULL) || r;\r\n  r = ((glTexCoordPointervINTEL = (PFNGLTEXCOORDPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)\"glTexCoordPointervINTEL\")) == NULL) || r;\r\n  r = ((glVertexPointervINTEL = (PFNGLVERTEXPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)\"glVertexPointervINTEL\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_INTEL_parallel_arrays */\r\n\r\n#ifdef GL_INTEL_texture_scissor\r\n\r\nstatic GLboolean _glewInit_GL_INTEL_texture_scissor (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glTexScissorFuncINTEL = (PFNGLTEXSCISSORFUNCINTELPROC)glewGetProcAddress((const GLubyte*)\"glTexScissorFuncINTEL\")) == NULL) || r;\r\n  r = ((glTexScissorINTEL = (PFNGLTEXSCISSORINTELPROC)glewGetProcAddress((const GLubyte*)\"glTexScissorINTEL\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_INTEL_texture_scissor */\r\n\r\n#ifdef GL_KTX_buffer_region\r\n\r\nstatic GLboolean _glewInit_GL_KTX_buffer_region (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glBufferRegionEnabledEXT = (PFNGLBUFFERREGIONENABLEDEXTPROC)glewGetProcAddress((const GLubyte*)\"glBufferRegionEnabledEXT\")) == NULL) || r;\r\n  r = ((glDeleteBufferRegionEXT = (PFNGLDELETEBUFFERREGIONEXTPROC)glewGetProcAddress((const GLubyte*)\"glDeleteBufferRegionEXT\")) == NULL) || r;\r\n  r = ((glDrawBufferRegionEXT = (PFNGLDRAWBUFFERREGIONEXTPROC)glewGetProcAddress((const GLubyte*)\"glDrawBufferRegionEXT\")) == NULL) || r;\r\n  r = ((glNewBufferRegionEXT = (PFNGLNEWBUFFERREGIONEXTPROC)glewGetProcAddress((const GLubyte*)\"glNewBufferRegionEXT\")) == NULL) || r;\r\n  r = ((glReadBufferRegionEXT = (PFNGLREADBUFFERREGIONEXTPROC)glewGetProcAddress((const GLubyte*)\"glReadBufferRegionEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_KTX_buffer_region */\r\n\r\n#ifdef GL_MESAX_texture_stack\r\n\r\n#endif /* GL_MESAX_texture_stack */\r\n\r\n#ifdef GL_MESA_pack_invert\r\n\r\n#endif /* GL_MESA_pack_invert */\r\n\r\n#ifdef GL_MESA_resize_buffers\r\n\r\nstatic GLboolean _glewInit_GL_MESA_resize_buffers (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glResizeBuffersMESA = (PFNGLRESIZEBUFFERSMESAPROC)glewGetProcAddress((const GLubyte*)\"glResizeBuffersMESA\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_MESA_resize_buffers */\r\n\r\n#ifdef GL_MESA_window_pos\r\n\r\nstatic GLboolean _glewInit_GL_MESA_window_pos (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glWindowPos2dMESA = (PFNGLWINDOWPOS2DMESAPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos2dMESA\")) == NULL) || r;\r\n  r = ((glWindowPos2dvMESA = (PFNGLWINDOWPOS2DVMESAPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos2dvMESA\")) == NULL) || r;\r\n  r = ((glWindowPos2fMESA = (PFNGLWINDOWPOS2FMESAPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos2fMESA\")) == NULL) || r;\r\n  r = ((glWindowPos2fvMESA = (PFNGLWINDOWPOS2FVMESAPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos2fvMESA\")) == NULL) || r;\r\n  r = ((glWindowPos2iMESA = (PFNGLWINDOWPOS2IMESAPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos2iMESA\")) == NULL) || r;\r\n  r = ((glWindowPos2ivMESA = (PFNGLWINDOWPOS2IVMESAPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos2ivMESA\")) == NULL) || r;\r\n  r = ((glWindowPos2sMESA = (PFNGLWINDOWPOS2SMESAPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos2sMESA\")) == NULL) || r;\r\n  r = ((glWindowPos2svMESA = (PFNGLWINDOWPOS2SVMESAPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos2svMESA\")) == NULL) || r;\r\n  r = ((glWindowPos3dMESA = (PFNGLWINDOWPOS3DMESAPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos3dMESA\")) == NULL) || r;\r\n  r = ((glWindowPos3dvMESA = (PFNGLWINDOWPOS3DVMESAPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos3dvMESA\")) == NULL) || r;\r\n  r = ((glWindowPos3fMESA = (PFNGLWINDOWPOS3FMESAPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos3fMESA\")) == NULL) || r;\r\n  r = ((glWindowPos3fvMESA = (PFNGLWINDOWPOS3FVMESAPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos3fvMESA\")) == NULL) || r;\r\n  r = ((glWindowPos3iMESA = (PFNGLWINDOWPOS3IMESAPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos3iMESA\")) == NULL) || r;\r\n  r = ((glWindowPos3ivMESA = (PFNGLWINDOWPOS3IVMESAPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos3ivMESA\")) == NULL) || r;\r\n  r = ((glWindowPos3sMESA = (PFNGLWINDOWPOS3SMESAPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos3sMESA\")) == NULL) || r;\r\n  r = ((glWindowPos3svMESA = (PFNGLWINDOWPOS3SVMESAPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos3svMESA\")) == NULL) || r;\r\n  r = ((glWindowPos4dMESA = (PFNGLWINDOWPOS4DMESAPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos4dMESA\")) == NULL) || r;\r\n  r = ((glWindowPos4dvMESA = (PFNGLWINDOWPOS4DVMESAPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos4dvMESA\")) == NULL) || r;\r\n  r = ((glWindowPos4fMESA = (PFNGLWINDOWPOS4FMESAPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos4fMESA\")) == NULL) || r;\r\n  r = ((glWindowPos4fvMESA = (PFNGLWINDOWPOS4FVMESAPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos4fvMESA\")) == NULL) || r;\r\n  r = ((glWindowPos4iMESA = (PFNGLWINDOWPOS4IMESAPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos4iMESA\")) == NULL) || r;\r\n  r = ((glWindowPos4ivMESA = (PFNGLWINDOWPOS4IVMESAPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos4ivMESA\")) == NULL) || r;\r\n  r = ((glWindowPos4sMESA = (PFNGLWINDOWPOS4SMESAPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos4sMESA\")) == NULL) || r;\r\n  r = ((glWindowPos4svMESA = (PFNGLWINDOWPOS4SVMESAPROC)glewGetProcAddress((const GLubyte*)\"glWindowPos4svMESA\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_MESA_window_pos */\r\n\r\n#ifdef GL_MESA_ycbcr_texture\r\n\r\n#endif /* GL_MESA_ycbcr_texture */\r\n\r\n#ifdef GL_NV_blend_square\r\n\r\n#endif /* GL_NV_blend_square */\r\n\r\n#ifdef GL_NV_conditional_render\r\n\r\nstatic GLboolean _glewInit_GL_NV_conditional_render (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glBeginConditionalRenderNV = (PFNGLBEGINCONDITIONALRENDERNVPROC)glewGetProcAddress((const GLubyte*)\"glBeginConditionalRenderNV\")) == NULL) || r;\r\n  r = ((glEndConditionalRenderNV = (PFNGLENDCONDITIONALRENDERNVPROC)glewGetProcAddress((const GLubyte*)\"glEndConditionalRenderNV\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_NV_conditional_render */\r\n\r\n#ifdef GL_NV_copy_depth_to_color\r\n\r\n#endif /* GL_NV_copy_depth_to_color */\r\n\r\n#ifdef GL_NV_copy_image\r\n\r\nstatic GLboolean _glewInit_GL_NV_copy_image (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glCopyImageSubDataNV = (PFNGLCOPYIMAGESUBDATANVPROC)glewGetProcAddress((const GLubyte*)\"glCopyImageSubDataNV\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_NV_copy_image */\r\n\r\n#ifdef GL_NV_depth_buffer_float\r\n\r\nstatic GLboolean _glewInit_GL_NV_depth_buffer_float (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glClearDepthdNV = (PFNGLCLEARDEPTHDNVPROC)glewGetProcAddress((const GLubyte*)\"glClearDepthdNV\")) == NULL) || r;\r\n  r = ((glDepthBoundsdNV = (PFNGLDEPTHBOUNDSDNVPROC)glewGetProcAddress((const GLubyte*)\"glDepthBoundsdNV\")) == NULL) || r;\r\n  r = ((glDepthRangedNV = (PFNGLDEPTHRANGEDNVPROC)glewGetProcAddress((const GLubyte*)\"glDepthRangedNV\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_NV_depth_buffer_float */\r\n\r\n#ifdef GL_NV_depth_clamp\r\n\r\n#endif /* GL_NV_depth_clamp */\r\n\r\n#ifdef GL_NV_depth_range_unclamped\r\n\r\n#endif /* GL_NV_depth_range_unclamped */\r\n\r\n#ifdef GL_NV_evaluators\r\n\r\nstatic GLboolean _glewInit_GL_NV_evaluators (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glEvalMapsNV = (PFNGLEVALMAPSNVPROC)glewGetProcAddress((const GLubyte*)\"glEvalMapsNV\")) == NULL) || r;\r\n  r = ((glGetMapAttribParameterfvNV = (PFNGLGETMAPATTRIBPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)\"glGetMapAttribParameterfvNV\")) == NULL) || r;\r\n  r = ((glGetMapAttribParameterivNV = (PFNGLGETMAPATTRIBPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)\"glGetMapAttribParameterivNV\")) == NULL) || r;\r\n  r = ((glGetMapControlPointsNV = (PFNGLGETMAPCONTROLPOINTSNVPROC)glewGetProcAddress((const GLubyte*)\"glGetMapControlPointsNV\")) == NULL) || r;\r\n  r = ((glGetMapParameterfvNV = (PFNGLGETMAPPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)\"glGetMapParameterfvNV\")) == NULL) || r;\r\n  r = ((glGetMapParameterivNV = (PFNGLGETMAPPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)\"glGetMapParameterivNV\")) == NULL) || r;\r\n  r = ((glMapControlPointsNV = (PFNGLMAPCONTROLPOINTSNVPROC)glewGetProcAddress((const GLubyte*)\"glMapControlPointsNV\")) == NULL) || r;\r\n  r = ((glMapParameterfvNV = (PFNGLMAPPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)\"glMapParameterfvNV\")) == NULL) || r;\r\n  r = ((glMapParameterivNV = (PFNGLMAPPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)\"glMapParameterivNV\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_NV_evaluators */\r\n\r\n#ifdef GL_NV_explicit_multisample\r\n\r\nstatic GLboolean _glewInit_GL_NV_explicit_multisample (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glGetMultisamplefvNV = (PFNGLGETMULTISAMPLEFVNVPROC)glewGetProcAddress((const GLubyte*)\"glGetMultisamplefvNV\")) == NULL) || r;\r\n  r = ((glSampleMaskIndexedNV = (PFNGLSAMPLEMASKINDEXEDNVPROC)glewGetProcAddress((const GLubyte*)\"glSampleMaskIndexedNV\")) == NULL) || r;\r\n  r = ((glTexRenderbufferNV = (PFNGLTEXRENDERBUFFERNVPROC)glewGetProcAddress((const GLubyte*)\"glTexRenderbufferNV\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_NV_explicit_multisample */\r\n\r\n#ifdef GL_NV_fence\r\n\r\nstatic GLboolean _glewInit_GL_NV_fence (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glDeleteFencesNV = (PFNGLDELETEFENCESNVPROC)glewGetProcAddress((const GLubyte*)\"glDeleteFencesNV\")) == NULL) || r;\r\n  r = ((glFinishFenceNV = (PFNGLFINISHFENCENVPROC)glewGetProcAddress((const GLubyte*)\"glFinishFenceNV\")) == NULL) || r;\r\n  r = ((glGenFencesNV = (PFNGLGENFENCESNVPROC)glewGetProcAddress((const GLubyte*)\"glGenFencesNV\")) == NULL) || r;\r\n  r = ((glGetFenceivNV = (PFNGLGETFENCEIVNVPROC)glewGetProcAddress((const GLubyte*)\"glGetFenceivNV\")) == NULL) || r;\r\n  r = ((glIsFenceNV = (PFNGLISFENCENVPROC)glewGetProcAddress((const GLubyte*)\"glIsFenceNV\")) == NULL) || r;\r\n  r = ((glSetFenceNV = (PFNGLSETFENCENVPROC)glewGetProcAddress((const GLubyte*)\"glSetFenceNV\")) == NULL) || r;\r\n  r = ((glTestFenceNV = (PFNGLTESTFENCENVPROC)glewGetProcAddress((const GLubyte*)\"glTestFenceNV\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_NV_fence */\r\n\r\n#ifdef GL_NV_float_buffer\r\n\r\n#endif /* GL_NV_float_buffer */\r\n\r\n#ifdef GL_NV_fog_distance\r\n\r\n#endif /* GL_NV_fog_distance */\r\n\r\n#ifdef GL_NV_fragment_program\r\n\r\nstatic GLboolean _glewInit_GL_NV_fragment_program (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glGetProgramNamedParameterdvNV = (PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC)glewGetProcAddress((const GLubyte*)\"glGetProgramNamedParameterdvNV\")) == NULL) || r;\r\n  r = ((glGetProgramNamedParameterfvNV = (PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)\"glGetProgramNamedParameterfvNV\")) == NULL) || r;\r\n  r = ((glProgramNamedParameter4dNV = (PFNGLPROGRAMNAMEDPARAMETER4DNVPROC)glewGetProcAddress((const GLubyte*)\"glProgramNamedParameter4dNV\")) == NULL) || r;\r\n  r = ((glProgramNamedParameter4dvNV = (PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC)glewGetProcAddress((const GLubyte*)\"glProgramNamedParameter4dvNV\")) == NULL) || r;\r\n  r = ((glProgramNamedParameter4fNV = (PFNGLPROGRAMNAMEDPARAMETER4FNVPROC)glewGetProcAddress((const GLubyte*)\"glProgramNamedParameter4fNV\")) == NULL) || r;\r\n  r = ((glProgramNamedParameter4fvNV = (PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC)glewGetProcAddress((const GLubyte*)\"glProgramNamedParameter4fvNV\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_NV_fragment_program */\r\n\r\n#ifdef GL_NV_fragment_program2\r\n\r\n#endif /* GL_NV_fragment_program2 */\r\n\r\n#ifdef GL_NV_fragment_program4\r\n\r\n#endif /* GL_NV_fragment_program4 */\r\n\r\n#ifdef GL_NV_fragment_program_option\r\n\r\n#endif /* GL_NV_fragment_program_option */\r\n\r\n#ifdef GL_NV_framebuffer_multisample_coverage\r\n\r\nstatic GLboolean _glewInit_GL_NV_framebuffer_multisample_coverage (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glRenderbufferStorageMultisampleCoverageNV = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)\"glRenderbufferStorageMultisampleCoverageNV\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_NV_framebuffer_multisample_coverage */\r\n\r\n#ifdef GL_NV_geometry_program4\r\n\r\nstatic GLboolean _glewInit_GL_NV_geometry_program4 (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glProgramVertexLimitNV = (PFNGLPROGRAMVERTEXLIMITNVPROC)glewGetProcAddress((const GLubyte*)\"glProgramVertexLimitNV\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_NV_geometry_program4 */\r\n\r\n#ifdef GL_NV_geometry_shader4\r\n\r\n#endif /* GL_NV_geometry_shader4 */\r\n\r\n#ifdef GL_NV_gpu_program4\r\n\r\nstatic GLboolean _glewInit_GL_NV_gpu_program4 (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glProgramEnvParameterI4iNV = (PFNGLPROGRAMENVPARAMETERI4INVPROC)glewGetProcAddress((const GLubyte*)\"glProgramEnvParameterI4iNV\")) == NULL) || r;\r\n  r = ((glProgramEnvParameterI4ivNV = (PFNGLPROGRAMENVPARAMETERI4IVNVPROC)glewGetProcAddress((const GLubyte*)\"glProgramEnvParameterI4ivNV\")) == NULL) || r;\r\n  r = ((glProgramEnvParameterI4uiNV = (PFNGLPROGRAMENVPARAMETERI4UINVPROC)glewGetProcAddress((const GLubyte*)\"glProgramEnvParameterI4uiNV\")) == NULL) || r;\r\n  r = ((glProgramEnvParameterI4uivNV = (PFNGLPROGRAMENVPARAMETERI4UIVNVPROC)glewGetProcAddress((const GLubyte*)\"glProgramEnvParameterI4uivNV\")) == NULL) || r;\r\n  r = ((glProgramEnvParametersI4ivNV = (PFNGLPROGRAMENVPARAMETERSI4IVNVPROC)glewGetProcAddress((const GLubyte*)\"glProgramEnvParametersI4ivNV\")) == NULL) || r;\r\n  r = ((glProgramEnvParametersI4uivNV = (PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC)glewGetProcAddress((const GLubyte*)\"glProgramEnvParametersI4uivNV\")) == NULL) || r;\r\n  r = ((glProgramLocalParameterI4iNV = (PFNGLPROGRAMLOCALPARAMETERI4INVPROC)glewGetProcAddress((const GLubyte*)\"glProgramLocalParameterI4iNV\")) == NULL) || r;\r\n  r = ((glProgramLocalParameterI4ivNV = (PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC)glewGetProcAddress((const GLubyte*)\"glProgramLocalParameterI4ivNV\")) == NULL) || r;\r\n  r = ((glProgramLocalParameterI4uiNV = (PFNGLPROGRAMLOCALPARAMETERI4UINVPROC)glewGetProcAddress((const GLubyte*)\"glProgramLocalParameterI4uiNV\")) == NULL) || r;\r\n  r = ((glProgramLocalParameterI4uivNV = (PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC)glewGetProcAddress((const GLubyte*)\"glProgramLocalParameterI4uivNV\")) == NULL) || r;\r\n  r = ((glProgramLocalParametersI4ivNV = (PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC)glewGetProcAddress((const GLubyte*)\"glProgramLocalParametersI4ivNV\")) == NULL) || r;\r\n  r = ((glProgramLocalParametersI4uivNV = (PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC)glewGetProcAddress((const GLubyte*)\"glProgramLocalParametersI4uivNV\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_NV_gpu_program4 */\r\n\r\n#ifdef GL_NV_half_float\r\n\r\nstatic GLboolean _glewInit_GL_NV_half_float (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glColor3hNV = (PFNGLCOLOR3HNVPROC)glewGetProcAddress((const GLubyte*)\"glColor3hNV\")) == NULL) || r;\r\n  r = ((glColor3hvNV = (PFNGLCOLOR3HVNVPROC)glewGetProcAddress((const GLubyte*)\"glColor3hvNV\")) == NULL) || r;\r\n  r = ((glColor4hNV = (PFNGLCOLOR4HNVPROC)glewGetProcAddress((const GLubyte*)\"glColor4hNV\")) == NULL) || r;\r\n  r = ((glColor4hvNV = (PFNGLCOLOR4HVNVPROC)glewGetProcAddress((const GLubyte*)\"glColor4hvNV\")) == NULL) || r;\r\n  r = ((glFogCoordhNV = (PFNGLFOGCOORDHNVPROC)glewGetProcAddress((const GLubyte*)\"glFogCoordhNV\")) == NULL) || r;\r\n  r = ((glFogCoordhvNV = (PFNGLFOGCOORDHVNVPROC)glewGetProcAddress((const GLubyte*)\"glFogCoordhvNV\")) == NULL) || r;\r\n  r = ((glMultiTexCoord1hNV = (PFNGLMULTITEXCOORD1HNVPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord1hNV\")) == NULL) || r;\r\n  r = ((glMultiTexCoord1hvNV = (PFNGLMULTITEXCOORD1HVNVPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord1hvNV\")) == NULL) || r;\r\n  r = ((glMultiTexCoord2hNV = (PFNGLMULTITEXCOORD2HNVPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord2hNV\")) == NULL) || r;\r\n  r = ((glMultiTexCoord2hvNV = (PFNGLMULTITEXCOORD2HVNVPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord2hvNV\")) == NULL) || r;\r\n  r = ((glMultiTexCoord3hNV = (PFNGLMULTITEXCOORD3HNVPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord3hNV\")) == NULL) || r;\r\n  r = ((glMultiTexCoord3hvNV = (PFNGLMULTITEXCOORD3HVNVPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord3hvNV\")) == NULL) || r;\r\n  r = ((glMultiTexCoord4hNV = (PFNGLMULTITEXCOORD4HNVPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord4hNV\")) == NULL) || r;\r\n  r = ((glMultiTexCoord4hvNV = (PFNGLMULTITEXCOORD4HVNVPROC)glewGetProcAddress((const GLubyte*)\"glMultiTexCoord4hvNV\")) == NULL) || r;\r\n  r = ((glNormal3hNV = (PFNGLNORMAL3HNVPROC)glewGetProcAddress((const GLubyte*)\"glNormal3hNV\")) == NULL) || r;\r\n  r = ((glNormal3hvNV = (PFNGLNORMAL3HVNVPROC)glewGetProcAddress((const GLubyte*)\"glNormal3hvNV\")) == NULL) || r;\r\n  r = ((glSecondaryColor3hNV = (PFNGLSECONDARYCOLOR3HNVPROC)glewGetProcAddress((const GLubyte*)\"glSecondaryColor3hNV\")) == NULL) || r;\r\n  r = ((glSecondaryColor3hvNV = (PFNGLSECONDARYCOLOR3HVNVPROC)glewGetProcAddress((const GLubyte*)\"glSecondaryColor3hvNV\")) == NULL) || r;\r\n  r = ((glTexCoord1hNV = (PFNGLTEXCOORD1HNVPROC)glewGetProcAddress((const GLubyte*)\"glTexCoord1hNV\")) == NULL) || r;\r\n  r = ((glTexCoord1hvNV = (PFNGLTEXCOORD1HVNVPROC)glewGetProcAddress((const GLubyte*)\"glTexCoord1hvNV\")) == NULL) || r;\r\n  r = ((glTexCoord2hNV = (PFNGLTEXCOORD2HNVPROC)glewGetProcAddress((const GLubyte*)\"glTexCoord2hNV\")) == NULL) || r;\r\n  r = ((glTexCoord2hvNV = (PFNGLTEXCOORD2HVNVPROC)glewGetProcAddress((const GLubyte*)\"glTexCoord2hvNV\")) == NULL) || r;\r\n  r = ((glTexCoord3hNV = (PFNGLTEXCOORD3HNVPROC)glewGetProcAddress((const GLubyte*)\"glTexCoord3hNV\")) == NULL) || r;\r\n  r = ((glTexCoord3hvNV = (PFNGLTEXCOORD3HVNVPROC)glewGetProcAddress((const GLubyte*)\"glTexCoord3hvNV\")) == NULL) || r;\r\n  r = ((glTexCoord4hNV = (PFNGLTEXCOORD4HNVPROC)glewGetProcAddress((const GLubyte*)\"glTexCoord4hNV\")) == NULL) || r;\r\n  r = ((glTexCoord4hvNV = (PFNGLTEXCOORD4HVNVPROC)glewGetProcAddress((const GLubyte*)\"glTexCoord4hvNV\")) == NULL) || r;\r\n  r = ((glVertex2hNV = (PFNGLVERTEX2HNVPROC)glewGetProcAddress((const GLubyte*)\"glVertex2hNV\")) == NULL) || r;\r\n  r = ((glVertex2hvNV = (PFNGLVERTEX2HVNVPROC)glewGetProcAddress((const GLubyte*)\"glVertex2hvNV\")) == NULL) || r;\r\n  r = ((glVertex3hNV = (PFNGLVERTEX3HNVPROC)glewGetProcAddress((const GLubyte*)\"glVertex3hNV\")) == NULL) || r;\r\n  r = ((glVertex3hvNV = (PFNGLVERTEX3HVNVPROC)glewGetProcAddress((const GLubyte*)\"glVertex3hvNV\")) == NULL) || r;\r\n  r = ((glVertex4hNV = (PFNGLVERTEX4HNVPROC)glewGetProcAddress((const GLubyte*)\"glVertex4hNV\")) == NULL) || r;\r\n  r = ((glVertex4hvNV = (PFNGLVERTEX4HVNVPROC)glewGetProcAddress((const GLubyte*)\"glVertex4hvNV\")) == NULL) || r;\r\n  r = ((glVertexAttrib1hNV = (PFNGLVERTEXATTRIB1HNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib1hNV\")) == NULL) || r;\r\n  r = ((glVertexAttrib1hvNV = (PFNGLVERTEXATTRIB1HVNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib1hvNV\")) == NULL) || r;\r\n  r = ((glVertexAttrib2hNV = (PFNGLVERTEXATTRIB2HNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib2hNV\")) == NULL) || r;\r\n  r = ((glVertexAttrib2hvNV = (PFNGLVERTEXATTRIB2HVNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib2hvNV\")) == NULL) || r;\r\n  r = ((glVertexAttrib3hNV = (PFNGLVERTEXATTRIB3HNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib3hNV\")) == NULL) || r;\r\n  r = ((glVertexAttrib3hvNV = (PFNGLVERTEXATTRIB3HVNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib3hvNV\")) == NULL) || r;\r\n  r = ((glVertexAttrib4hNV = (PFNGLVERTEXATTRIB4HNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4hNV\")) == NULL) || r;\r\n  r = ((glVertexAttrib4hvNV = (PFNGLVERTEXATTRIB4HVNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4hvNV\")) == NULL) || r;\r\n  r = ((glVertexAttribs1hvNV = (PFNGLVERTEXATTRIBS1HVNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribs1hvNV\")) == NULL) || r;\r\n  r = ((glVertexAttribs2hvNV = (PFNGLVERTEXATTRIBS2HVNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribs2hvNV\")) == NULL) || r;\r\n  r = ((glVertexAttribs3hvNV = (PFNGLVERTEXATTRIBS3HVNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribs3hvNV\")) == NULL) || r;\r\n  r = ((glVertexAttribs4hvNV = (PFNGLVERTEXATTRIBS4HVNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribs4hvNV\")) == NULL) || r;\r\n  r = ((glVertexWeighthNV = (PFNGLVERTEXWEIGHTHNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexWeighthNV\")) == NULL) || r;\r\n  r = ((glVertexWeighthvNV = (PFNGLVERTEXWEIGHTHVNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexWeighthvNV\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_NV_half_float */\r\n\r\n#ifdef GL_NV_light_max_exponent\r\n\r\n#endif /* GL_NV_light_max_exponent */\r\n\r\n#ifdef GL_NV_multisample_filter_hint\r\n\r\n#endif /* GL_NV_multisample_filter_hint */\r\n\r\n#ifdef GL_NV_occlusion_query\r\n\r\nstatic GLboolean _glewInit_GL_NV_occlusion_query (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glBeginOcclusionQueryNV = (PFNGLBEGINOCCLUSIONQUERYNVPROC)glewGetProcAddress((const GLubyte*)\"glBeginOcclusionQueryNV\")) == NULL) || r;\r\n  r = ((glDeleteOcclusionQueriesNV = (PFNGLDELETEOCCLUSIONQUERIESNVPROC)glewGetProcAddress((const GLubyte*)\"glDeleteOcclusionQueriesNV\")) == NULL) || r;\r\n  r = ((glEndOcclusionQueryNV = (PFNGLENDOCCLUSIONQUERYNVPROC)glewGetProcAddress((const GLubyte*)\"glEndOcclusionQueryNV\")) == NULL) || r;\r\n  r = ((glGenOcclusionQueriesNV = (PFNGLGENOCCLUSIONQUERIESNVPROC)glewGetProcAddress((const GLubyte*)\"glGenOcclusionQueriesNV\")) == NULL) || r;\r\n  r = ((glGetOcclusionQueryivNV = (PFNGLGETOCCLUSIONQUERYIVNVPROC)glewGetProcAddress((const GLubyte*)\"glGetOcclusionQueryivNV\")) == NULL) || r;\r\n  r = ((glGetOcclusionQueryuivNV = (PFNGLGETOCCLUSIONQUERYUIVNVPROC)glewGetProcAddress((const GLubyte*)\"glGetOcclusionQueryuivNV\")) == NULL) || r;\r\n  r = ((glIsOcclusionQueryNV = (PFNGLISOCCLUSIONQUERYNVPROC)glewGetProcAddress((const GLubyte*)\"glIsOcclusionQueryNV\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_NV_occlusion_query */\r\n\r\n#ifdef GL_NV_packed_depth_stencil\r\n\r\n#endif /* GL_NV_packed_depth_stencil */\r\n\r\n#ifdef GL_NV_parameter_buffer_object\r\n\r\nstatic GLboolean _glewInit_GL_NV_parameter_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glProgramBufferParametersIivNV = (PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC)glewGetProcAddress((const GLubyte*)\"glProgramBufferParametersIivNV\")) == NULL) || r;\r\n  r = ((glProgramBufferParametersIuivNV = (PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC)glewGetProcAddress((const GLubyte*)\"glProgramBufferParametersIuivNV\")) == NULL) || r;\r\n  r = ((glProgramBufferParametersfvNV = (PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC)glewGetProcAddress((const GLubyte*)\"glProgramBufferParametersfvNV\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_NV_parameter_buffer_object */\r\n\r\n#ifdef GL_NV_parameter_buffer_object2\r\n\r\n#endif /* GL_NV_parameter_buffer_object2 */\r\n\r\n#ifdef GL_NV_pixel_data_range\r\n\r\nstatic GLboolean _glewInit_GL_NV_pixel_data_range (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glFlushPixelDataRangeNV = (PFNGLFLUSHPIXELDATARANGENVPROC)glewGetProcAddress((const GLubyte*)\"glFlushPixelDataRangeNV\")) == NULL) || r;\r\n  r = ((glPixelDataRangeNV = (PFNGLPIXELDATARANGENVPROC)glewGetProcAddress((const GLubyte*)\"glPixelDataRangeNV\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_NV_pixel_data_range */\r\n\r\n#ifdef GL_NV_point_sprite\r\n\r\nstatic GLboolean _glewInit_GL_NV_point_sprite (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glPointParameteriNV = (PFNGLPOINTPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)\"glPointParameteriNV\")) == NULL) || r;\r\n  r = ((glPointParameterivNV = (PFNGLPOINTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)\"glPointParameterivNV\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_NV_point_sprite */\r\n\r\n#ifdef GL_NV_present_video\r\n\r\nstatic GLboolean _glewInit_GL_NV_present_video (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glGetVideoi64vNV = (PFNGLGETVIDEOI64VNVPROC)glewGetProcAddress((const GLubyte*)\"glGetVideoi64vNV\")) == NULL) || r;\r\n  r = ((glGetVideoivNV = (PFNGLGETVIDEOIVNVPROC)glewGetProcAddress((const GLubyte*)\"glGetVideoivNV\")) == NULL) || r;\r\n  r = ((glGetVideoui64vNV = (PFNGLGETVIDEOUI64VNVPROC)glewGetProcAddress((const GLubyte*)\"glGetVideoui64vNV\")) == NULL) || r;\r\n  r = ((glGetVideouivNV = (PFNGLGETVIDEOUIVNVPROC)glewGetProcAddress((const GLubyte*)\"glGetVideouivNV\")) == NULL) || r;\r\n  r = ((glPresentFrameDualFillNV = (PFNGLPRESENTFRAMEDUALFILLNVPROC)glewGetProcAddress((const GLubyte*)\"glPresentFrameDualFillNV\")) == NULL) || r;\r\n  r = ((glPresentFrameKeyedNV = (PFNGLPRESENTFRAMEKEYEDNVPROC)glewGetProcAddress((const GLubyte*)\"glPresentFrameKeyedNV\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_NV_present_video */\r\n\r\n#ifdef GL_NV_primitive_restart\r\n\r\nstatic GLboolean _glewInit_GL_NV_primitive_restart (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glPrimitiveRestartIndexNV = (PFNGLPRIMITIVERESTARTINDEXNVPROC)glewGetProcAddress((const GLubyte*)\"glPrimitiveRestartIndexNV\")) == NULL) || r;\r\n  r = ((glPrimitiveRestartNV = (PFNGLPRIMITIVERESTARTNVPROC)glewGetProcAddress((const GLubyte*)\"glPrimitiveRestartNV\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_NV_primitive_restart */\r\n\r\n#ifdef GL_NV_register_combiners\r\n\r\nstatic GLboolean _glewInit_GL_NV_register_combiners (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glCombinerInputNV = (PFNGLCOMBINERINPUTNVPROC)glewGetProcAddress((const GLubyte*)\"glCombinerInputNV\")) == NULL) || r;\r\n  r = ((glCombinerOutputNV = (PFNGLCOMBINEROUTPUTNVPROC)glewGetProcAddress((const GLubyte*)\"glCombinerOutputNV\")) == NULL) || r;\r\n  r = ((glCombinerParameterfNV = (PFNGLCOMBINERPARAMETERFNVPROC)glewGetProcAddress((const GLubyte*)\"glCombinerParameterfNV\")) == NULL) || r;\r\n  r = ((glCombinerParameterfvNV = (PFNGLCOMBINERPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)\"glCombinerParameterfvNV\")) == NULL) || r;\r\n  r = ((glCombinerParameteriNV = (PFNGLCOMBINERPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)\"glCombinerParameteriNV\")) == NULL) || r;\r\n  r = ((glCombinerParameterivNV = (PFNGLCOMBINERPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)\"glCombinerParameterivNV\")) == NULL) || r;\r\n  r = ((glFinalCombinerInputNV = (PFNGLFINALCOMBINERINPUTNVPROC)glewGetProcAddress((const GLubyte*)\"glFinalCombinerInputNV\")) == NULL) || r;\r\n  r = ((glGetCombinerInputParameterfvNV = (PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)\"glGetCombinerInputParameterfvNV\")) == NULL) || r;\r\n  r = ((glGetCombinerInputParameterivNV = (PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)\"glGetCombinerInputParameterivNV\")) == NULL) || r;\r\n  r = ((glGetCombinerOutputParameterfvNV = (PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)\"glGetCombinerOutputParameterfvNV\")) == NULL) || r;\r\n  r = ((glGetCombinerOutputParameterivNV = (PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)\"glGetCombinerOutputParameterivNV\")) == NULL) || r;\r\n  r = ((glGetFinalCombinerInputParameterfvNV = (PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)\"glGetFinalCombinerInputParameterfvNV\")) == NULL) || r;\r\n  r = ((glGetFinalCombinerInputParameterivNV = (PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)\"glGetFinalCombinerInputParameterivNV\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_NV_register_combiners */\r\n\r\n#ifdef GL_NV_register_combiners2\r\n\r\nstatic GLboolean _glewInit_GL_NV_register_combiners2 (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glCombinerStageParameterfvNV = (PFNGLCOMBINERSTAGEPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)\"glCombinerStageParameterfvNV\")) == NULL) || r;\r\n  r = ((glGetCombinerStageParameterfvNV = (PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)\"glGetCombinerStageParameterfvNV\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_NV_register_combiners2 */\r\n\r\n#ifdef GL_NV_shader_buffer_load\r\n\r\nstatic GLboolean _glewInit_GL_NV_shader_buffer_load (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glGetBufferParameterui64vNV = (PFNGLGETBUFFERPARAMETERUI64VNVPROC)glewGetProcAddress((const GLubyte*)\"glGetBufferParameterui64vNV\")) == NULL) || r;\r\n  r = ((glGetIntegerui64vNV = (PFNGLGETINTEGERUI64VNVPROC)glewGetProcAddress((const GLubyte*)\"glGetIntegerui64vNV\")) == NULL) || r;\r\n  r = ((glGetNamedBufferParameterui64vNV = (PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC)glewGetProcAddress((const GLubyte*)\"glGetNamedBufferParameterui64vNV\")) == NULL) || r;\r\n  r = ((glGetUniformui64vNV = (PFNGLGETUNIFORMUI64VNVPROC)glewGetProcAddress((const GLubyte*)\"glGetUniformui64vNV\")) == NULL) || r;\r\n  r = ((glIsBufferResidentNV = (PFNGLISBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)\"glIsBufferResidentNV\")) == NULL) || r;\r\n  r = ((glIsNamedBufferResidentNV = (PFNGLISNAMEDBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)\"glIsNamedBufferResidentNV\")) == NULL) || r;\r\n  r = ((glMakeBufferNonResidentNV = (PFNGLMAKEBUFFERNONRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)\"glMakeBufferNonResidentNV\")) == NULL) || r;\r\n  r = ((glMakeBufferResidentNV = (PFNGLMAKEBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)\"glMakeBufferResidentNV\")) == NULL) || r;\r\n  r = ((glMakeNamedBufferNonResidentNV = (PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)\"glMakeNamedBufferNonResidentNV\")) == NULL) || r;\r\n  r = ((glMakeNamedBufferResidentNV = (PFNGLMAKENAMEDBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)\"glMakeNamedBufferResidentNV\")) == NULL) || r;\r\n  r = ((glProgramUniformui64NV = (PFNGLPROGRAMUNIFORMUI64NVPROC)glewGetProcAddress((const GLubyte*)\"glProgramUniformui64NV\")) == NULL) || r;\r\n  r = ((glProgramUniformui64vNV = (PFNGLPROGRAMUNIFORMUI64VNVPROC)glewGetProcAddress((const GLubyte*)\"glProgramUniformui64vNV\")) == NULL) || r;\r\n  r = ((glUniformui64NV = (PFNGLUNIFORMUI64NVPROC)glewGetProcAddress((const GLubyte*)\"glUniformui64NV\")) == NULL) || r;\r\n  r = ((glUniformui64vNV = (PFNGLUNIFORMUI64VNVPROC)glewGetProcAddress((const GLubyte*)\"glUniformui64vNV\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_NV_shader_buffer_load */\r\n\r\n#ifdef GL_NV_texgen_emboss\r\n\r\n#endif /* GL_NV_texgen_emboss */\r\n\r\n#ifdef GL_NV_texgen_reflection\r\n\r\n#endif /* GL_NV_texgen_reflection */\r\n\r\n#ifdef GL_NV_texture_barrier\r\n\r\nstatic GLboolean _glewInit_GL_NV_texture_barrier (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glTextureBarrierNV = (PFNGLTEXTUREBARRIERNVPROC)glewGetProcAddress((const GLubyte*)\"glTextureBarrierNV\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_NV_texture_barrier */\r\n\r\n#ifdef GL_NV_texture_compression_vtc\r\n\r\n#endif /* GL_NV_texture_compression_vtc */\r\n\r\n#ifdef GL_NV_texture_env_combine4\r\n\r\n#endif /* GL_NV_texture_env_combine4 */\r\n\r\n#ifdef GL_NV_texture_expand_normal\r\n\r\n#endif /* GL_NV_texture_expand_normal */\r\n\r\n#ifdef GL_NV_texture_rectangle\r\n\r\n#endif /* GL_NV_texture_rectangle */\r\n\r\n#ifdef GL_NV_texture_shader\r\n\r\n#endif /* GL_NV_texture_shader */\r\n\r\n#ifdef GL_NV_texture_shader2\r\n\r\n#endif /* GL_NV_texture_shader2 */\r\n\r\n#ifdef GL_NV_texture_shader3\r\n\r\n#endif /* GL_NV_texture_shader3 */\r\n\r\n#ifdef GL_NV_transform_feedback\r\n\r\nstatic GLboolean _glewInit_GL_NV_transform_feedback (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glActiveVaryingNV = (PFNGLACTIVEVARYINGNVPROC)glewGetProcAddress((const GLubyte*)\"glActiveVaryingNV\")) == NULL) || r;\r\n  r = ((glBeginTransformFeedbackNV = (PFNGLBEGINTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)\"glBeginTransformFeedbackNV\")) == NULL) || r;\r\n  r = ((glBindBufferBaseNV = (PFNGLBINDBUFFERBASENVPROC)glewGetProcAddress((const GLubyte*)\"glBindBufferBaseNV\")) == NULL) || r;\r\n  r = ((glBindBufferOffsetNV = (PFNGLBINDBUFFEROFFSETNVPROC)glewGetProcAddress((const GLubyte*)\"glBindBufferOffsetNV\")) == NULL) || r;\r\n  r = ((glBindBufferRangeNV = (PFNGLBINDBUFFERRANGENVPROC)glewGetProcAddress((const GLubyte*)\"glBindBufferRangeNV\")) == NULL) || r;\r\n  r = ((glEndTransformFeedbackNV = (PFNGLENDTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)\"glEndTransformFeedbackNV\")) == NULL) || r;\r\n  r = ((glGetActiveVaryingNV = (PFNGLGETACTIVEVARYINGNVPROC)glewGetProcAddress((const GLubyte*)\"glGetActiveVaryingNV\")) == NULL) || r;\r\n  r = ((glGetTransformFeedbackVaryingNV = (PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC)glewGetProcAddress((const GLubyte*)\"glGetTransformFeedbackVaryingNV\")) == NULL) || r;\r\n  r = ((glGetVaryingLocationNV = (PFNGLGETVARYINGLOCATIONNVPROC)glewGetProcAddress((const GLubyte*)\"glGetVaryingLocationNV\")) == NULL) || r;\r\n  r = ((glTransformFeedbackAttribsNV = (PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC)glewGetProcAddress((const GLubyte*)\"glTransformFeedbackAttribsNV\")) == NULL) || r;\r\n  r = ((glTransformFeedbackVaryingsNV = (PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC)glewGetProcAddress((const GLubyte*)\"glTransformFeedbackVaryingsNV\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_NV_transform_feedback */\r\n\r\n#ifdef GL_NV_transform_feedback2\r\n\r\nstatic GLboolean _glewInit_GL_NV_transform_feedback2 (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glBindTransformFeedbackNV = (PFNGLBINDTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)\"glBindTransformFeedbackNV\")) == NULL) || r;\r\n  r = ((glDeleteTransformFeedbacksNV = (PFNGLDELETETRANSFORMFEEDBACKSNVPROC)glewGetProcAddress((const GLubyte*)\"glDeleteTransformFeedbacksNV\")) == NULL) || r;\r\n  r = ((glDrawTransformFeedbackNV = (PFNGLDRAWTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)\"glDrawTransformFeedbackNV\")) == NULL) || r;\r\n  r = ((glGenTransformFeedbacksNV = (PFNGLGENTRANSFORMFEEDBACKSNVPROC)glewGetProcAddress((const GLubyte*)\"glGenTransformFeedbacksNV\")) == NULL) || r;\r\n  r = ((glIsTransformFeedbackNV = (PFNGLISTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)\"glIsTransformFeedbackNV\")) == NULL) || r;\r\n  r = ((glPauseTransformFeedbackNV = (PFNGLPAUSETRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)\"glPauseTransformFeedbackNV\")) == NULL) || r;\r\n  r = ((glResumeTransformFeedbackNV = (PFNGLRESUMETRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)\"glResumeTransformFeedbackNV\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_NV_transform_feedback2 */\r\n\r\n#ifdef GL_NV_vertex_array_range\r\n\r\nstatic GLboolean _glewInit_GL_NV_vertex_array_range (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glFlushVertexArrayRangeNV = (PFNGLFLUSHVERTEXARRAYRANGENVPROC)glewGetProcAddress((const GLubyte*)\"glFlushVertexArrayRangeNV\")) == NULL) || r;\r\n  r = ((glVertexArrayRangeNV = (PFNGLVERTEXARRAYRANGENVPROC)glewGetProcAddress((const GLubyte*)\"glVertexArrayRangeNV\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_NV_vertex_array_range */\r\n\r\n#ifdef GL_NV_vertex_array_range2\r\n\r\n#endif /* GL_NV_vertex_array_range2 */\r\n\r\n#ifdef GL_NV_vertex_buffer_unified_memory\r\n\r\nstatic GLboolean _glewInit_GL_NV_vertex_buffer_unified_memory (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glBufferAddressRangeNV = (PFNGLBUFFERADDRESSRANGENVPROC)glewGetProcAddress((const GLubyte*)\"glBufferAddressRangeNV\")) == NULL) || r;\r\n  r = ((glColorFormatNV = (PFNGLCOLORFORMATNVPROC)glewGetProcAddress((const GLubyte*)\"glColorFormatNV\")) == NULL) || r;\r\n  r = ((glEdgeFlagFormatNV = (PFNGLEDGEFLAGFORMATNVPROC)glewGetProcAddress((const GLubyte*)\"glEdgeFlagFormatNV\")) == NULL) || r;\r\n  r = ((glFogCoordFormatNV = (PFNGLFOGCOORDFORMATNVPROC)glewGetProcAddress((const GLubyte*)\"glFogCoordFormatNV\")) == NULL) || r;\r\n  r = ((glGetIntegerui64i_vNV = (PFNGLGETINTEGERUI64I_VNVPROC)glewGetProcAddress((const GLubyte*)\"glGetIntegerui64i_vNV\")) == NULL) || r;\r\n  r = ((glIndexFormatNV = (PFNGLINDEXFORMATNVPROC)glewGetProcAddress((const GLubyte*)\"glIndexFormatNV\")) == NULL) || r;\r\n  r = ((glNormalFormatNV = (PFNGLNORMALFORMATNVPROC)glewGetProcAddress((const GLubyte*)\"glNormalFormatNV\")) == NULL) || r;\r\n  r = ((glSecondaryColorFormatNV = (PFNGLSECONDARYCOLORFORMATNVPROC)glewGetProcAddress((const GLubyte*)\"glSecondaryColorFormatNV\")) == NULL) || r;\r\n  r = ((glTexCoordFormatNV = (PFNGLTEXCOORDFORMATNVPROC)glewGetProcAddress((const GLubyte*)\"glTexCoordFormatNV\")) == NULL) || r;\r\n  r = ((glVertexAttribFormatNV = (PFNGLVERTEXATTRIBFORMATNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribFormatNV\")) == NULL) || r;\r\n  r = ((glVertexAttribIFormatNV = (PFNGLVERTEXATTRIBIFORMATNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribIFormatNV\")) == NULL) || r;\r\n  r = ((glVertexFormatNV = (PFNGLVERTEXFORMATNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexFormatNV\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_NV_vertex_buffer_unified_memory */\r\n\r\n#ifdef GL_NV_vertex_program\r\n\r\nstatic GLboolean _glewInit_GL_NV_vertex_program (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glAreProgramsResidentNV = (PFNGLAREPROGRAMSRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)\"glAreProgramsResidentNV\")) == NULL) || r;\r\n  r = ((glBindProgramNV = (PFNGLBINDPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)\"glBindProgramNV\")) == NULL) || r;\r\n  r = ((glDeleteProgramsNV = (PFNGLDELETEPROGRAMSNVPROC)glewGetProcAddress((const GLubyte*)\"glDeleteProgramsNV\")) == NULL) || r;\r\n  r = ((glExecuteProgramNV = (PFNGLEXECUTEPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)\"glExecuteProgramNV\")) == NULL) || r;\r\n  r = ((glGenProgramsNV = (PFNGLGENPROGRAMSNVPROC)glewGetProcAddress((const GLubyte*)\"glGenProgramsNV\")) == NULL) || r;\r\n  r = ((glGetProgramParameterdvNV = (PFNGLGETPROGRAMPARAMETERDVNVPROC)glewGetProcAddress((const GLubyte*)\"glGetProgramParameterdvNV\")) == NULL) || r;\r\n  r = ((glGetProgramParameterfvNV = (PFNGLGETPROGRAMPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)\"glGetProgramParameterfvNV\")) == NULL) || r;\r\n  r = ((glGetProgramStringNV = (PFNGLGETPROGRAMSTRINGNVPROC)glewGetProcAddress((const GLubyte*)\"glGetProgramStringNV\")) == NULL) || r;\r\n  r = ((glGetProgramivNV = (PFNGLGETPROGRAMIVNVPROC)glewGetProcAddress((const GLubyte*)\"glGetProgramivNV\")) == NULL) || r;\r\n  r = ((glGetTrackMatrixivNV = (PFNGLGETTRACKMATRIXIVNVPROC)glewGetProcAddress((const GLubyte*)\"glGetTrackMatrixivNV\")) == NULL) || r;\r\n  r = ((glGetVertexAttribPointervNV = (PFNGLGETVERTEXATTRIBPOINTERVNVPROC)glewGetProcAddress((const GLubyte*)\"glGetVertexAttribPointervNV\")) == NULL) || r;\r\n  r = ((glGetVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC)glewGetProcAddress((const GLubyte*)\"glGetVertexAttribdvNV\")) == NULL) || r;\r\n  r = ((glGetVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC)glewGetProcAddress((const GLubyte*)\"glGetVertexAttribfvNV\")) == NULL) || r;\r\n  r = ((glGetVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC)glewGetProcAddress((const GLubyte*)\"glGetVertexAttribivNV\")) == NULL) || r;\r\n  r = ((glIsProgramNV = (PFNGLISPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)\"glIsProgramNV\")) == NULL) || r;\r\n  r = ((glLoadProgramNV = (PFNGLLOADPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)\"glLoadProgramNV\")) == NULL) || r;\r\n  r = ((glProgramParameter4dNV = (PFNGLPROGRAMPARAMETER4DNVPROC)glewGetProcAddress((const GLubyte*)\"glProgramParameter4dNV\")) == NULL) || r;\r\n  r = ((glProgramParameter4dvNV = (PFNGLPROGRAMPARAMETER4DVNVPROC)glewGetProcAddress((const GLubyte*)\"glProgramParameter4dvNV\")) == NULL) || r;\r\n  r = ((glProgramParameter4fNV = (PFNGLPROGRAMPARAMETER4FNVPROC)glewGetProcAddress((const GLubyte*)\"glProgramParameter4fNV\")) == NULL) || r;\r\n  r = ((glProgramParameter4fvNV = (PFNGLPROGRAMPARAMETER4FVNVPROC)glewGetProcAddress((const GLubyte*)\"glProgramParameter4fvNV\")) == NULL) || r;\r\n  r = ((glProgramParameters4dvNV = (PFNGLPROGRAMPARAMETERS4DVNVPROC)glewGetProcAddress((const GLubyte*)\"glProgramParameters4dvNV\")) == NULL) || r;\r\n  r = ((glProgramParameters4fvNV = (PFNGLPROGRAMPARAMETERS4FVNVPROC)glewGetProcAddress((const GLubyte*)\"glProgramParameters4fvNV\")) == NULL) || r;\r\n  r = ((glRequestResidentProgramsNV = (PFNGLREQUESTRESIDENTPROGRAMSNVPROC)glewGetProcAddress((const GLubyte*)\"glRequestResidentProgramsNV\")) == NULL) || r;\r\n  r = ((glTrackMatrixNV = (PFNGLTRACKMATRIXNVPROC)glewGetProcAddress((const GLubyte*)\"glTrackMatrixNV\")) == NULL) || r;\r\n  r = ((glVertexAttrib1dNV = (PFNGLVERTEXATTRIB1DNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib1dNV\")) == NULL) || r;\r\n  r = ((glVertexAttrib1dvNV = (PFNGLVERTEXATTRIB1DVNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib1dvNV\")) == NULL) || r;\r\n  r = ((glVertexAttrib1fNV = (PFNGLVERTEXATTRIB1FNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib1fNV\")) == NULL) || r;\r\n  r = ((glVertexAttrib1fvNV = (PFNGLVERTEXATTRIB1FVNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib1fvNV\")) == NULL) || r;\r\n  r = ((glVertexAttrib1sNV = (PFNGLVERTEXATTRIB1SNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib1sNV\")) == NULL) || r;\r\n  r = ((glVertexAttrib1svNV = (PFNGLVERTEXATTRIB1SVNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib1svNV\")) == NULL) || r;\r\n  r = ((glVertexAttrib2dNV = (PFNGLVERTEXATTRIB2DNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib2dNV\")) == NULL) || r;\r\n  r = ((glVertexAttrib2dvNV = (PFNGLVERTEXATTRIB2DVNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib2dvNV\")) == NULL) || r;\r\n  r = ((glVertexAttrib2fNV = (PFNGLVERTEXATTRIB2FNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib2fNV\")) == NULL) || r;\r\n  r = ((glVertexAttrib2fvNV = (PFNGLVERTEXATTRIB2FVNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib2fvNV\")) == NULL) || r;\r\n  r = ((glVertexAttrib2sNV = (PFNGLVERTEXATTRIB2SNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib2sNV\")) == NULL) || r;\r\n  r = ((glVertexAttrib2svNV = (PFNGLVERTEXATTRIB2SVNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib2svNV\")) == NULL) || r;\r\n  r = ((glVertexAttrib3dNV = (PFNGLVERTEXATTRIB3DNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib3dNV\")) == NULL) || r;\r\n  r = ((glVertexAttrib3dvNV = (PFNGLVERTEXATTRIB3DVNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib3dvNV\")) == NULL) || r;\r\n  r = ((glVertexAttrib3fNV = (PFNGLVERTEXATTRIB3FNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib3fNV\")) == NULL) || r;\r\n  r = ((glVertexAttrib3fvNV = (PFNGLVERTEXATTRIB3FVNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib3fvNV\")) == NULL) || r;\r\n  r = ((glVertexAttrib3sNV = (PFNGLVERTEXATTRIB3SNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib3sNV\")) == NULL) || r;\r\n  r = ((glVertexAttrib3svNV = (PFNGLVERTEXATTRIB3SVNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib3svNV\")) == NULL) || r;\r\n  r = ((glVertexAttrib4dNV = (PFNGLVERTEXATTRIB4DNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4dNV\")) == NULL) || r;\r\n  r = ((glVertexAttrib4dvNV = (PFNGLVERTEXATTRIB4DVNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4dvNV\")) == NULL) || r;\r\n  r = ((glVertexAttrib4fNV = (PFNGLVERTEXATTRIB4FNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4fNV\")) == NULL) || r;\r\n  r = ((glVertexAttrib4fvNV = (PFNGLVERTEXATTRIB4FVNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4fvNV\")) == NULL) || r;\r\n  r = ((glVertexAttrib4sNV = (PFNGLVERTEXATTRIB4SNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4sNV\")) == NULL) || r;\r\n  r = ((glVertexAttrib4svNV = (PFNGLVERTEXATTRIB4SVNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4svNV\")) == NULL) || r;\r\n  r = ((glVertexAttrib4ubNV = (PFNGLVERTEXATTRIB4UBNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4ubNV\")) == NULL) || r;\r\n  r = ((glVertexAttrib4ubvNV = (PFNGLVERTEXATTRIB4UBVNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttrib4ubvNV\")) == NULL) || r;\r\n  r = ((glVertexAttribPointerNV = (PFNGLVERTEXATTRIBPOINTERNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribPointerNV\")) == NULL) || r;\r\n  r = ((glVertexAttribs1dvNV = (PFNGLVERTEXATTRIBS1DVNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribs1dvNV\")) == NULL) || r;\r\n  r = ((glVertexAttribs1fvNV = (PFNGLVERTEXATTRIBS1FVNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribs1fvNV\")) == NULL) || r;\r\n  r = ((glVertexAttribs1svNV = (PFNGLVERTEXATTRIBS1SVNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribs1svNV\")) == NULL) || r;\r\n  r = ((glVertexAttribs2dvNV = (PFNGLVERTEXATTRIBS2DVNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribs2dvNV\")) == NULL) || r;\r\n  r = ((glVertexAttribs2fvNV = (PFNGLVERTEXATTRIBS2FVNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribs2fvNV\")) == NULL) || r;\r\n  r = ((glVertexAttribs2svNV = (PFNGLVERTEXATTRIBS2SVNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribs2svNV\")) == NULL) || r;\r\n  r = ((glVertexAttribs3dvNV = (PFNGLVERTEXATTRIBS3DVNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribs3dvNV\")) == NULL) || r;\r\n  r = ((glVertexAttribs3fvNV = (PFNGLVERTEXATTRIBS3FVNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribs3fvNV\")) == NULL) || r;\r\n  r = ((glVertexAttribs3svNV = (PFNGLVERTEXATTRIBS3SVNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribs3svNV\")) == NULL) || r;\r\n  r = ((glVertexAttribs4dvNV = (PFNGLVERTEXATTRIBS4DVNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribs4dvNV\")) == NULL) || r;\r\n  r = ((glVertexAttribs4fvNV = (PFNGLVERTEXATTRIBS4FVNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribs4fvNV\")) == NULL) || r;\r\n  r = ((glVertexAttribs4svNV = (PFNGLVERTEXATTRIBS4SVNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribs4svNV\")) == NULL) || r;\r\n  r = ((glVertexAttribs4ubvNV = (PFNGLVERTEXATTRIBS4UBVNVPROC)glewGetProcAddress((const GLubyte*)\"glVertexAttribs4ubvNV\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_NV_vertex_program */\r\n\r\n#ifdef GL_NV_vertex_program1_1\r\n\r\n#endif /* GL_NV_vertex_program1_1 */\r\n\r\n#ifdef GL_NV_vertex_program2\r\n\r\n#endif /* GL_NV_vertex_program2 */\r\n\r\n#ifdef GL_NV_vertex_program2_option\r\n\r\n#endif /* GL_NV_vertex_program2_option */\r\n\r\n#ifdef GL_NV_vertex_program3\r\n\r\n#endif /* GL_NV_vertex_program3 */\r\n\r\n#ifdef GL_NV_vertex_program4\r\n\r\n#endif /* GL_NV_vertex_program4 */\r\n\r\n#ifdef GL_OES_byte_coordinates\r\n\r\n#endif /* GL_OES_byte_coordinates */\r\n\r\n#ifdef GL_OES_compressed_paletted_texture\r\n\r\n#endif /* GL_OES_compressed_paletted_texture */\r\n\r\n#ifdef GL_OES_read_format\r\n\r\n#endif /* GL_OES_read_format */\r\n\r\n#ifdef GL_OES_single_precision\r\n\r\nstatic GLboolean _glewInit_GL_OES_single_precision (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glClearDepthfOES = (PFNGLCLEARDEPTHFOESPROC)glewGetProcAddress((const GLubyte*)\"glClearDepthfOES\")) == NULL) || r;\r\n  r = ((glClipPlanefOES = (PFNGLCLIPPLANEFOESPROC)glewGetProcAddress((const GLubyte*)\"glClipPlanefOES\")) == NULL) || r;\r\n  r = ((glDepthRangefOES = (PFNGLDEPTHRANGEFOESPROC)glewGetProcAddress((const GLubyte*)\"glDepthRangefOES\")) == NULL) || r;\r\n  r = ((glFrustumfOES = (PFNGLFRUSTUMFOESPROC)glewGetProcAddress((const GLubyte*)\"glFrustumfOES\")) == NULL) || r;\r\n  r = ((glGetClipPlanefOES = (PFNGLGETCLIPPLANEFOESPROC)glewGetProcAddress((const GLubyte*)\"glGetClipPlanefOES\")) == NULL) || r;\r\n  r = ((glOrthofOES = (PFNGLORTHOFOESPROC)glewGetProcAddress((const GLubyte*)\"glOrthofOES\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_OES_single_precision */\r\n\r\n#ifdef GL_OML_interlace\r\n\r\n#endif /* GL_OML_interlace */\r\n\r\n#ifdef GL_OML_resample\r\n\r\n#endif /* GL_OML_resample */\r\n\r\n#ifdef GL_OML_subsample\r\n\r\n#endif /* GL_OML_subsample */\r\n\r\n#ifdef GL_PGI_misc_hints\r\n\r\n#endif /* GL_PGI_misc_hints */\r\n\r\n#ifdef GL_PGI_vertex_hints\r\n\r\n#endif /* GL_PGI_vertex_hints */\r\n\r\n#ifdef GL_REND_screen_coordinates\r\n\r\n#endif /* GL_REND_screen_coordinates */\r\n\r\n#ifdef GL_S3_s3tc\r\n\r\n#endif /* GL_S3_s3tc */\r\n\r\n#ifdef GL_SGIS_color_range\r\n\r\n#endif /* GL_SGIS_color_range */\r\n\r\n#ifdef GL_SGIS_detail_texture\r\n\r\nstatic GLboolean _glewInit_GL_SGIS_detail_texture (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glDetailTexFuncSGIS = (PFNGLDETAILTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)\"glDetailTexFuncSGIS\")) == NULL) || r;\r\n  r = ((glGetDetailTexFuncSGIS = (PFNGLGETDETAILTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)\"glGetDetailTexFuncSGIS\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_SGIS_detail_texture */\r\n\r\n#ifdef GL_SGIS_fog_function\r\n\r\nstatic GLboolean _glewInit_GL_SGIS_fog_function (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glFogFuncSGIS = (PFNGLFOGFUNCSGISPROC)glewGetProcAddress((const GLubyte*)\"glFogFuncSGIS\")) == NULL) || r;\r\n  r = ((glGetFogFuncSGIS = (PFNGLGETFOGFUNCSGISPROC)glewGetProcAddress((const GLubyte*)\"glGetFogFuncSGIS\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_SGIS_fog_function */\r\n\r\n#ifdef GL_SGIS_generate_mipmap\r\n\r\n#endif /* GL_SGIS_generate_mipmap */\r\n\r\n#ifdef GL_SGIS_multisample\r\n\r\nstatic GLboolean _glewInit_GL_SGIS_multisample (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glSampleMaskSGIS = (PFNGLSAMPLEMASKSGISPROC)glewGetProcAddress((const GLubyte*)\"glSampleMaskSGIS\")) == NULL) || r;\r\n  r = ((glSamplePatternSGIS = (PFNGLSAMPLEPATTERNSGISPROC)glewGetProcAddress((const GLubyte*)\"glSamplePatternSGIS\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_SGIS_multisample */\r\n\r\n#ifdef GL_SGIS_pixel_texture\r\n\r\n#endif /* GL_SGIS_pixel_texture */\r\n\r\n#ifdef GL_SGIS_point_line_texgen\r\n\r\n#endif /* GL_SGIS_point_line_texgen */\r\n\r\n#ifdef GL_SGIS_sharpen_texture\r\n\r\nstatic GLboolean _glewInit_GL_SGIS_sharpen_texture (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glGetSharpenTexFuncSGIS = (PFNGLGETSHARPENTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)\"glGetSharpenTexFuncSGIS\")) == NULL) || r;\r\n  r = ((glSharpenTexFuncSGIS = (PFNGLSHARPENTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)\"glSharpenTexFuncSGIS\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_SGIS_sharpen_texture */\r\n\r\n#ifdef GL_SGIS_texture4D\r\n\r\nstatic GLboolean _glewInit_GL_SGIS_texture4D (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glTexImage4DSGIS = (PFNGLTEXIMAGE4DSGISPROC)glewGetProcAddress((const GLubyte*)\"glTexImage4DSGIS\")) == NULL) || r;\r\n  r = ((glTexSubImage4DSGIS = (PFNGLTEXSUBIMAGE4DSGISPROC)glewGetProcAddress((const GLubyte*)\"glTexSubImage4DSGIS\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_SGIS_texture4D */\r\n\r\n#ifdef GL_SGIS_texture_border_clamp\r\n\r\n#endif /* GL_SGIS_texture_border_clamp */\r\n\r\n#ifdef GL_SGIS_texture_edge_clamp\r\n\r\n#endif /* GL_SGIS_texture_edge_clamp */\r\n\r\n#ifdef GL_SGIS_texture_filter4\r\n\r\nstatic GLboolean _glewInit_GL_SGIS_texture_filter4 (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glGetTexFilterFuncSGIS = (PFNGLGETTEXFILTERFUNCSGISPROC)glewGetProcAddress((const GLubyte*)\"glGetTexFilterFuncSGIS\")) == NULL) || r;\r\n  r = ((glTexFilterFuncSGIS = (PFNGLTEXFILTERFUNCSGISPROC)glewGetProcAddress((const GLubyte*)\"glTexFilterFuncSGIS\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_SGIS_texture_filter4 */\r\n\r\n#ifdef GL_SGIS_texture_lod\r\n\r\n#endif /* GL_SGIS_texture_lod */\r\n\r\n#ifdef GL_SGIS_texture_select\r\n\r\n#endif /* GL_SGIS_texture_select */\r\n\r\n#ifdef GL_SGIX_async\r\n\r\nstatic GLboolean _glewInit_GL_SGIX_async (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glAsyncMarkerSGIX = (PFNGLASYNCMARKERSGIXPROC)glewGetProcAddress((const GLubyte*)\"glAsyncMarkerSGIX\")) == NULL) || r;\r\n  r = ((glDeleteAsyncMarkersSGIX = (PFNGLDELETEASYNCMARKERSSGIXPROC)glewGetProcAddress((const GLubyte*)\"glDeleteAsyncMarkersSGIX\")) == NULL) || r;\r\n  r = ((glFinishAsyncSGIX = (PFNGLFINISHASYNCSGIXPROC)glewGetProcAddress((const GLubyte*)\"glFinishAsyncSGIX\")) == NULL) || r;\r\n  r = ((glGenAsyncMarkersSGIX = (PFNGLGENASYNCMARKERSSGIXPROC)glewGetProcAddress((const GLubyte*)\"glGenAsyncMarkersSGIX\")) == NULL) || r;\r\n  r = ((glIsAsyncMarkerSGIX = (PFNGLISASYNCMARKERSGIXPROC)glewGetProcAddress((const GLubyte*)\"glIsAsyncMarkerSGIX\")) == NULL) || r;\r\n  r = ((glPollAsyncSGIX = (PFNGLPOLLASYNCSGIXPROC)glewGetProcAddress((const GLubyte*)\"glPollAsyncSGIX\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_SGIX_async */\r\n\r\n#ifdef GL_SGIX_async_histogram\r\n\r\n#endif /* GL_SGIX_async_histogram */\r\n\r\n#ifdef GL_SGIX_async_pixel\r\n\r\n#endif /* GL_SGIX_async_pixel */\r\n\r\n#ifdef GL_SGIX_blend_alpha_minmax\r\n\r\n#endif /* GL_SGIX_blend_alpha_minmax */\r\n\r\n#ifdef GL_SGIX_clipmap\r\n\r\n#endif /* GL_SGIX_clipmap */\r\n\r\n#ifdef GL_SGIX_convolution_accuracy\r\n\r\n#endif /* GL_SGIX_convolution_accuracy */\r\n\r\n#ifdef GL_SGIX_depth_texture\r\n\r\n#endif /* GL_SGIX_depth_texture */\r\n\r\n#ifdef GL_SGIX_flush_raster\r\n\r\nstatic GLboolean _glewInit_GL_SGIX_flush_raster (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glFlushRasterSGIX = (PFNGLFLUSHRASTERSGIXPROC)glewGetProcAddress((const GLubyte*)\"glFlushRasterSGIX\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_SGIX_flush_raster */\r\n\r\n#ifdef GL_SGIX_fog_offset\r\n\r\n#endif /* GL_SGIX_fog_offset */\r\n\r\n#ifdef GL_SGIX_fog_texture\r\n\r\nstatic GLboolean _glewInit_GL_SGIX_fog_texture (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glTextureFogSGIX = (PFNGLTEXTUREFOGSGIXPROC)glewGetProcAddress((const GLubyte*)\"glTextureFogSGIX\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_SGIX_fog_texture */\r\n\r\n#ifdef GL_SGIX_fragment_specular_lighting\r\n\r\nstatic GLboolean _glewInit_GL_SGIX_fragment_specular_lighting (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glFragmentColorMaterialSGIX = (PFNGLFRAGMENTCOLORMATERIALSGIXPROC)glewGetProcAddress((const GLubyte*)\"glFragmentColorMaterialSGIX\")) == NULL) || r;\r\n  r = ((glFragmentLightModelfSGIX = (PFNGLFRAGMENTLIGHTMODELFSGIXPROC)glewGetProcAddress((const GLubyte*)\"glFragmentLightModelfSGIX\")) == NULL) || r;\r\n  r = ((glFragmentLightModelfvSGIX = (PFNGLFRAGMENTLIGHTMODELFVSGIXPROC)glewGetProcAddress((const GLubyte*)\"glFragmentLightModelfvSGIX\")) == NULL) || r;\r\n  r = ((glFragmentLightModeliSGIX = (PFNGLFRAGMENTLIGHTMODELISGIXPROC)glewGetProcAddress((const GLubyte*)\"glFragmentLightModeliSGIX\")) == NULL) || r;\r\n  r = ((glFragmentLightModelivSGIX = (PFNGLFRAGMENTLIGHTMODELIVSGIXPROC)glewGetProcAddress((const GLubyte*)\"glFragmentLightModelivSGIX\")) == NULL) || r;\r\n  r = ((glFragmentLightfSGIX = (PFNGLFRAGMENTLIGHTFSGIXPROC)glewGetProcAddress((const GLubyte*)\"glFragmentLightfSGIX\")) == NULL) || r;\r\n  r = ((glFragmentLightfvSGIX = (PFNGLFRAGMENTLIGHTFVSGIXPROC)glewGetProcAddress((const GLubyte*)\"glFragmentLightfvSGIX\")) == NULL) || r;\r\n  r = ((glFragmentLightiSGIX = (PFNGLFRAGMENTLIGHTISGIXPROC)glewGetProcAddress((const GLubyte*)\"glFragmentLightiSGIX\")) == NULL) || r;\r\n  r = ((glFragmentLightivSGIX = (PFNGLFRAGMENTLIGHTIVSGIXPROC)glewGetProcAddress((const GLubyte*)\"glFragmentLightivSGIX\")) == NULL) || r;\r\n  r = ((glFragmentMaterialfSGIX = (PFNGLFRAGMENTMATERIALFSGIXPROC)glewGetProcAddress((const GLubyte*)\"glFragmentMaterialfSGIX\")) == NULL) || r;\r\n  r = ((glFragmentMaterialfvSGIX = (PFNGLFRAGMENTMATERIALFVSGIXPROC)glewGetProcAddress((const GLubyte*)\"glFragmentMaterialfvSGIX\")) == NULL) || r;\r\n  r = ((glFragmentMaterialiSGIX = (PFNGLFRAGMENTMATERIALISGIXPROC)glewGetProcAddress((const GLubyte*)\"glFragmentMaterialiSGIX\")) == NULL) || r;\r\n  r = ((glFragmentMaterialivSGIX = (PFNGLFRAGMENTMATERIALIVSGIXPROC)glewGetProcAddress((const GLubyte*)\"glFragmentMaterialivSGIX\")) == NULL) || r;\r\n  r = ((glGetFragmentLightfvSGIX = (PFNGLGETFRAGMENTLIGHTFVSGIXPROC)glewGetProcAddress((const GLubyte*)\"glGetFragmentLightfvSGIX\")) == NULL) || r;\r\n  r = ((glGetFragmentLightivSGIX = (PFNGLGETFRAGMENTLIGHTIVSGIXPROC)glewGetProcAddress((const GLubyte*)\"glGetFragmentLightivSGIX\")) == NULL) || r;\r\n  r = ((glGetFragmentMaterialfvSGIX = (PFNGLGETFRAGMENTMATERIALFVSGIXPROC)glewGetProcAddress((const GLubyte*)\"glGetFragmentMaterialfvSGIX\")) == NULL) || r;\r\n  r = ((glGetFragmentMaterialivSGIX = (PFNGLGETFRAGMENTMATERIALIVSGIXPROC)glewGetProcAddress((const GLubyte*)\"glGetFragmentMaterialivSGIX\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_SGIX_fragment_specular_lighting */\r\n\r\n#ifdef GL_SGIX_framezoom\r\n\r\nstatic GLboolean _glewInit_GL_SGIX_framezoom (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glFrameZoomSGIX = (PFNGLFRAMEZOOMSGIXPROC)glewGetProcAddress((const GLubyte*)\"glFrameZoomSGIX\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_SGIX_framezoom */\r\n\r\n#ifdef GL_SGIX_interlace\r\n\r\n#endif /* GL_SGIX_interlace */\r\n\r\n#ifdef GL_SGIX_ir_instrument1\r\n\r\n#endif /* GL_SGIX_ir_instrument1 */\r\n\r\n#ifdef GL_SGIX_list_priority\r\n\r\n#endif /* GL_SGIX_list_priority */\r\n\r\n#ifdef GL_SGIX_pixel_texture\r\n\r\nstatic GLboolean _glewInit_GL_SGIX_pixel_texture (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glPixelTexGenSGIX = (PFNGLPIXELTEXGENSGIXPROC)glewGetProcAddress((const GLubyte*)\"glPixelTexGenSGIX\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_SGIX_pixel_texture */\r\n\r\n#ifdef GL_SGIX_pixel_texture_bits\r\n\r\n#endif /* GL_SGIX_pixel_texture_bits */\r\n\r\n#ifdef GL_SGIX_reference_plane\r\n\r\nstatic GLboolean _glewInit_GL_SGIX_reference_plane (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glReferencePlaneSGIX = (PFNGLREFERENCEPLANESGIXPROC)glewGetProcAddress((const GLubyte*)\"glReferencePlaneSGIX\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_SGIX_reference_plane */\r\n\r\n#ifdef GL_SGIX_resample\r\n\r\n#endif /* GL_SGIX_resample */\r\n\r\n#ifdef GL_SGIX_shadow\r\n\r\n#endif /* GL_SGIX_shadow */\r\n\r\n#ifdef GL_SGIX_shadow_ambient\r\n\r\n#endif /* GL_SGIX_shadow_ambient */\r\n\r\n#ifdef GL_SGIX_sprite\r\n\r\nstatic GLboolean _glewInit_GL_SGIX_sprite (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glSpriteParameterfSGIX = (PFNGLSPRITEPARAMETERFSGIXPROC)glewGetProcAddress((const GLubyte*)\"glSpriteParameterfSGIX\")) == NULL) || r;\r\n  r = ((glSpriteParameterfvSGIX = (PFNGLSPRITEPARAMETERFVSGIXPROC)glewGetProcAddress((const GLubyte*)\"glSpriteParameterfvSGIX\")) == NULL) || r;\r\n  r = ((glSpriteParameteriSGIX = (PFNGLSPRITEPARAMETERISGIXPROC)glewGetProcAddress((const GLubyte*)\"glSpriteParameteriSGIX\")) == NULL) || r;\r\n  r = ((glSpriteParameterivSGIX = (PFNGLSPRITEPARAMETERIVSGIXPROC)glewGetProcAddress((const GLubyte*)\"glSpriteParameterivSGIX\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_SGIX_sprite */\r\n\r\n#ifdef GL_SGIX_tag_sample_buffer\r\n\r\nstatic GLboolean _glewInit_GL_SGIX_tag_sample_buffer (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glTagSampleBufferSGIX = (PFNGLTAGSAMPLEBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)\"glTagSampleBufferSGIX\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_SGIX_tag_sample_buffer */\r\n\r\n#ifdef GL_SGIX_texture_add_env\r\n\r\n#endif /* GL_SGIX_texture_add_env */\r\n\r\n#ifdef GL_SGIX_texture_coordinate_clamp\r\n\r\n#endif /* GL_SGIX_texture_coordinate_clamp */\r\n\r\n#ifdef GL_SGIX_texture_lod_bias\r\n\r\n#endif /* GL_SGIX_texture_lod_bias */\r\n\r\n#ifdef GL_SGIX_texture_multi_buffer\r\n\r\n#endif /* GL_SGIX_texture_multi_buffer */\r\n\r\n#ifdef GL_SGIX_texture_range\r\n\r\n#endif /* GL_SGIX_texture_range */\r\n\r\n#ifdef GL_SGIX_texture_scale_bias\r\n\r\n#endif /* GL_SGIX_texture_scale_bias */\r\n\r\n#ifdef GL_SGIX_vertex_preclip\r\n\r\n#endif /* GL_SGIX_vertex_preclip */\r\n\r\n#ifdef GL_SGIX_vertex_preclip_hint\r\n\r\n#endif /* GL_SGIX_vertex_preclip_hint */\r\n\r\n#ifdef GL_SGIX_ycrcb\r\n\r\n#endif /* GL_SGIX_ycrcb */\r\n\r\n#ifdef GL_SGI_color_matrix\r\n\r\n#endif /* GL_SGI_color_matrix */\r\n\r\n#ifdef GL_SGI_color_table\r\n\r\nstatic GLboolean _glewInit_GL_SGI_color_table (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glColorTableParameterfvSGI = (PFNGLCOLORTABLEPARAMETERFVSGIPROC)glewGetProcAddress((const GLubyte*)\"glColorTableParameterfvSGI\")) == NULL) || r;\r\n  r = ((glColorTableParameterivSGI = (PFNGLCOLORTABLEPARAMETERIVSGIPROC)glewGetProcAddress((const GLubyte*)\"glColorTableParameterivSGI\")) == NULL) || r;\r\n  r = ((glColorTableSGI = (PFNGLCOLORTABLESGIPROC)glewGetProcAddress((const GLubyte*)\"glColorTableSGI\")) == NULL) || r;\r\n  r = ((glCopyColorTableSGI = (PFNGLCOPYCOLORTABLESGIPROC)glewGetProcAddress((const GLubyte*)\"glCopyColorTableSGI\")) == NULL) || r;\r\n  r = ((glGetColorTableParameterfvSGI = (PFNGLGETCOLORTABLEPARAMETERFVSGIPROC)glewGetProcAddress((const GLubyte*)\"glGetColorTableParameterfvSGI\")) == NULL) || r;\r\n  r = ((glGetColorTableParameterivSGI = (PFNGLGETCOLORTABLEPARAMETERIVSGIPROC)glewGetProcAddress((const GLubyte*)\"glGetColorTableParameterivSGI\")) == NULL) || r;\r\n  r = ((glGetColorTableSGI = (PFNGLGETCOLORTABLESGIPROC)glewGetProcAddress((const GLubyte*)\"glGetColorTableSGI\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_SGI_color_table */\r\n\r\n#ifdef GL_SGI_texture_color_table\r\n\r\n#endif /* GL_SGI_texture_color_table */\r\n\r\n#ifdef GL_SUNX_constant_data\r\n\r\nstatic GLboolean _glewInit_GL_SUNX_constant_data (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glFinishTextureSUNX = (PFNGLFINISHTEXTURESUNXPROC)glewGetProcAddress((const GLubyte*)\"glFinishTextureSUNX\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_SUNX_constant_data */\r\n\r\n#ifdef GL_SUN_convolution_border_modes\r\n\r\n#endif /* GL_SUN_convolution_border_modes */\r\n\r\n#ifdef GL_SUN_global_alpha\r\n\r\nstatic GLboolean _glewInit_GL_SUN_global_alpha (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glGlobalAlphaFactorbSUN = (PFNGLGLOBALALPHAFACTORBSUNPROC)glewGetProcAddress((const GLubyte*)\"glGlobalAlphaFactorbSUN\")) == NULL) || r;\r\n  r = ((glGlobalAlphaFactordSUN = (PFNGLGLOBALALPHAFACTORDSUNPROC)glewGetProcAddress((const GLubyte*)\"glGlobalAlphaFactordSUN\")) == NULL) || r;\r\n  r = ((glGlobalAlphaFactorfSUN = (PFNGLGLOBALALPHAFACTORFSUNPROC)glewGetProcAddress((const GLubyte*)\"glGlobalAlphaFactorfSUN\")) == NULL) || r;\r\n  r = ((glGlobalAlphaFactoriSUN = (PFNGLGLOBALALPHAFACTORISUNPROC)glewGetProcAddress((const GLubyte*)\"glGlobalAlphaFactoriSUN\")) == NULL) || r;\r\n  r = ((glGlobalAlphaFactorsSUN = (PFNGLGLOBALALPHAFACTORSSUNPROC)glewGetProcAddress((const GLubyte*)\"glGlobalAlphaFactorsSUN\")) == NULL) || r;\r\n  r = ((glGlobalAlphaFactorubSUN = (PFNGLGLOBALALPHAFACTORUBSUNPROC)glewGetProcAddress((const GLubyte*)\"glGlobalAlphaFactorubSUN\")) == NULL) || r;\r\n  r = ((glGlobalAlphaFactoruiSUN = (PFNGLGLOBALALPHAFACTORUISUNPROC)glewGetProcAddress((const GLubyte*)\"glGlobalAlphaFactoruiSUN\")) == NULL) || r;\r\n  r = ((glGlobalAlphaFactorusSUN = (PFNGLGLOBALALPHAFACTORUSSUNPROC)glewGetProcAddress((const GLubyte*)\"glGlobalAlphaFactorusSUN\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_SUN_global_alpha */\r\n\r\n#ifdef GL_SUN_mesh_array\r\n\r\n#endif /* GL_SUN_mesh_array */\r\n\r\n#ifdef GL_SUN_read_video_pixels\r\n\r\nstatic GLboolean _glewInit_GL_SUN_read_video_pixels (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glReadVideoPixelsSUN = (PFNGLREADVIDEOPIXELSSUNPROC)glewGetProcAddress((const GLubyte*)\"glReadVideoPixelsSUN\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_SUN_read_video_pixels */\r\n\r\n#ifdef GL_SUN_slice_accum\r\n\r\n#endif /* GL_SUN_slice_accum */\r\n\r\n#ifdef GL_SUN_triangle_list\r\n\r\nstatic GLboolean _glewInit_GL_SUN_triangle_list (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glReplacementCodePointerSUN = (PFNGLREPLACEMENTCODEPOINTERSUNPROC)glewGetProcAddress((const GLubyte*)\"glReplacementCodePointerSUN\")) == NULL) || r;\r\n  r = ((glReplacementCodeubSUN = (PFNGLREPLACEMENTCODEUBSUNPROC)glewGetProcAddress((const GLubyte*)\"glReplacementCodeubSUN\")) == NULL) || r;\r\n  r = ((glReplacementCodeubvSUN = (PFNGLREPLACEMENTCODEUBVSUNPROC)glewGetProcAddress((const GLubyte*)\"glReplacementCodeubvSUN\")) == NULL) || r;\r\n  r = ((glReplacementCodeuiSUN = (PFNGLREPLACEMENTCODEUISUNPROC)glewGetProcAddress((const GLubyte*)\"glReplacementCodeuiSUN\")) == NULL) || r;\r\n  r = ((glReplacementCodeuivSUN = (PFNGLREPLACEMENTCODEUIVSUNPROC)glewGetProcAddress((const GLubyte*)\"glReplacementCodeuivSUN\")) == NULL) || r;\r\n  r = ((glReplacementCodeusSUN = (PFNGLREPLACEMENTCODEUSSUNPROC)glewGetProcAddress((const GLubyte*)\"glReplacementCodeusSUN\")) == NULL) || r;\r\n  r = ((glReplacementCodeusvSUN = (PFNGLREPLACEMENTCODEUSVSUNPROC)glewGetProcAddress((const GLubyte*)\"glReplacementCodeusvSUN\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_SUN_triangle_list */\r\n\r\n#ifdef GL_SUN_vertex\r\n\r\nstatic GLboolean _glewInit_GL_SUN_vertex (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glColor3fVertex3fSUN = (PFNGLCOLOR3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)\"glColor3fVertex3fSUN\")) == NULL) || r;\r\n  r = ((glColor3fVertex3fvSUN = (PFNGLCOLOR3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)\"glColor3fVertex3fvSUN\")) == NULL) || r;\r\n  r = ((glColor4fNormal3fVertex3fSUN = (PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)\"glColor4fNormal3fVertex3fSUN\")) == NULL) || r;\r\n  r = ((glColor4fNormal3fVertex3fvSUN = (PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)\"glColor4fNormal3fVertex3fvSUN\")) == NULL) || r;\r\n  r = ((glColor4ubVertex2fSUN = (PFNGLCOLOR4UBVERTEX2FSUNPROC)glewGetProcAddress((const GLubyte*)\"glColor4ubVertex2fSUN\")) == NULL) || r;\r\n  r = ((glColor4ubVertex2fvSUN = (PFNGLCOLOR4UBVERTEX2FVSUNPROC)glewGetProcAddress((const GLubyte*)\"glColor4ubVertex2fvSUN\")) == NULL) || r;\r\n  r = ((glColor4ubVertex3fSUN = (PFNGLCOLOR4UBVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)\"glColor4ubVertex3fSUN\")) == NULL) || r;\r\n  r = ((glColor4ubVertex3fvSUN = (PFNGLCOLOR4UBVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)\"glColor4ubVertex3fvSUN\")) == NULL) || r;\r\n  r = ((glNormal3fVertex3fSUN = (PFNGLNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)\"glNormal3fVertex3fSUN\")) == NULL) || r;\r\n  r = ((glNormal3fVertex3fvSUN = (PFNGLNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)\"glNormal3fVertex3fvSUN\")) == NULL) || r;\r\n  r = ((glReplacementCodeuiColor3fVertex3fSUN = (PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)\"glReplacementCodeuiColor3fVertex3fSUN\")) == NULL) || r;\r\n  r = ((glReplacementCodeuiColor3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)\"glReplacementCodeuiColor3fVertex3fvSUN\")) == NULL) || r;\r\n  r = ((glReplacementCodeuiColor4fNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)\"glReplacementCodeuiColor4fNormal3fVertex3fSUN\")) == NULL) || r;\r\n  r = ((glReplacementCodeuiColor4fNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)\"glReplacementCodeuiColor4fNormal3fVertex3fvSUN\")) == NULL) || r;\r\n  r = ((glReplacementCodeuiColor4ubVertex3fSUN = (PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)\"glReplacementCodeuiColor4ubVertex3fSUN\")) == NULL) || r;\r\n  r = ((glReplacementCodeuiColor4ubVertex3fvSUN = (PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)\"glReplacementCodeuiColor4ubVertex3fvSUN\")) == NULL) || r;\r\n  r = ((glReplacementCodeuiNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)\"glReplacementCodeuiNormal3fVertex3fSUN\")) == NULL) || r;\r\n  r = ((glReplacementCodeuiNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)\"glReplacementCodeuiNormal3fVertex3fvSUN\")) == NULL) || r;\r\n  r = ((glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)\"glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN\")) == NULL) || r;\r\n  r = ((glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)\"glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN\")) == NULL) || r;\r\n  r = ((glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)\"glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN\")) == NULL) || r;\r\n  r = ((glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)\"glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN\")) == NULL) || r;\r\n  r = ((glReplacementCodeuiTexCoord2fVertex3fSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)\"glReplacementCodeuiTexCoord2fVertex3fSUN\")) == NULL) || r;\r\n  r = ((glReplacementCodeuiTexCoord2fVertex3fvSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)\"glReplacementCodeuiTexCoord2fVertex3fvSUN\")) == NULL) || r;\r\n  r = ((glReplacementCodeuiVertex3fSUN = (PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)\"glReplacementCodeuiVertex3fSUN\")) == NULL) || r;\r\n  r = ((glReplacementCodeuiVertex3fvSUN = (PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)\"glReplacementCodeuiVertex3fvSUN\")) == NULL) || r;\r\n  r = ((glTexCoord2fColor3fVertex3fSUN = (PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)\"glTexCoord2fColor3fVertex3fSUN\")) == NULL) || r;\r\n  r = ((glTexCoord2fColor3fVertex3fvSUN = (PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)\"glTexCoord2fColor3fVertex3fvSUN\")) == NULL) || r;\r\n  r = ((glTexCoord2fColor4fNormal3fVertex3fSUN = (PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)\"glTexCoord2fColor4fNormal3fVertex3fSUN\")) == NULL) || r;\r\n  r = ((glTexCoord2fColor4fNormal3fVertex3fvSUN = (PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)\"glTexCoord2fColor4fNormal3fVertex3fvSUN\")) == NULL) || r;\r\n  r = ((glTexCoord2fColor4ubVertex3fSUN = (PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)\"glTexCoord2fColor4ubVertex3fSUN\")) == NULL) || r;\r\n  r = ((glTexCoord2fColor4ubVertex3fvSUN = (PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)\"glTexCoord2fColor4ubVertex3fvSUN\")) == NULL) || r;\r\n  r = ((glTexCoord2fNormal3fVertex3fSUN = (PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)\"glTexCoord2fNormal3fVertex3fSUN\")) == NULL) || r;\r\n  r = ((glTexCoord2fNormal3fVertex3fvSUN = (PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)\"glTexCoord2fNormal3fVertex3fvSUN\")) == NULL) || r;\r\n  r = ((glTexCoord2fVertex3fSUN = (PFNGLTEXCOORD2FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)\"glTexCoord2fVertex3fSUN\")) == NULL) || r;\r\n  r = ((glTexCoord2fVertex3fvSUN = (PFNGLTEXCOORD2FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)\"glTexCoord2fVertex3fvSUN\")) == NULL) || r;\r\n  r = ((glTexCoord4fColor4fNormal3fVertex4fSUN = (PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC)glewGetProcAddress((const GLubyte*)\"glTexCoord4fColor4fNormal3fVertex4fSUN\")) == NULL) || r;\r\n  r = ((glTexCoord4fColor4fNormal3fVertex4fvSUN = (PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC)glewGetProcAddress((const GLubyte*)\"glTexCoord4fColor4fNormal3fVertex4fvSUN\")) == NULL) || r;\r\n  r = ((glTexCoord4fVertex4fSUN = (PFNGLTEXCOORD4FVERTEX4FSUNPROC)glewGetProcAddress((const GLubyte*)\"glTexCoord4fVertex4fSUN\")) == NULL) || r;\r\n  r = ((glTexCoord4fVertex4fvSUN = (PFNGLTEXCOORD4FVERTEX4FVSUNPROC)glewGetProcAddress((const GLubyte*)\"glTexCoord4fVertex4fvSUN\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_SUN_vertex */\r\n\r\n#ifdef GL_WIN_phong_shading\r\n\r\n#endif /* GL_WIN_phong_shading */\r\n\r\n#ifdef GL_WIN_specular_fog\r\n\r\n#endif /* GL_WIN_specular_fog */\r\n\r\n#ifdef GL_WIN_swap_hint\r\n\r\nstatic GLboolean _glewInit_GL_WIN_swap_hint (GLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glAddSwapHintRectWIN = (PFNGLADDSWAPHINTRECTWINPROC)glewGetProcAddress((const GLubyte*)\"glAddSwapHintRectWIN\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GL_WIN_swap_hint */\r\n\r\n/* ------------------------------------------------------------------------- */\r\n\r\n/* \r\n * Search for name in the extensions string. Use of strstr()\r\n * is not sufficient because extension names can be prefixes of\r\n * other extension names. Could use strtok() but the constant\r\n * string returned by glGetString might be in read-only memory.\r\n */\r\nGLboolean glewGetExtension (const char* name)\r\n{    \r\n  GLubyte* p;\r\n  GLubyte* end;\r\n  GLuint len = _glewStrLen((const GLubyte*)name);\r\n  p = (GLubyte*)glGetString(GL_EXTENSIONS);\r\n  if (0 == p) return GL_FALSE;\r\n  end = p + _glewStrLen(p);\r\n  while (p < end)\r\n  {\r\n    GLuint n = _glewStrCLen(p, ' ');\r\n    if (len == n && _glewStrSame((const GLubyte*)name, p, n)) return GL_TRUE;\r\n    p += n+1;\r\n  }\r\n  return GL_FALSE;\r\n}\r\n\r\n/* ------------------------------------------------------------------------- */\r\n\r\n#ifndef GLEW_MX\r\nstatic\r\n#endif\r\nGLenum glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST)\r\n{\r\n  const GLubyte* s;\r\n  GLuint dot;\r\n  GLint major, minor;\r\n  /* query opengl version */\r\n  s = glGetString(GL_VERSION);\r\n  dot = _glewStrCLen(s, '.');\r\n  if (dot == 0)\r\n    return GLEW_ERROR_NO_GL_VERSION;\r\n  \r\n  major = s[dot-1]-'0';\r\n  minor = s[dot+1]-'0';\r\n\r\n  if (minor < 0 || minor > 9)\r\n    minor = 0;\r\n  if (major<0 || major>9)\r\n    return GLEW_ERROR_NO_GL_VERSION;\r\n  \r\n\r\n  if (major == 1 && minor == 0)\r\n  {\r\n    return GLEW_ERROR_GL_VERSION_10_ONLY;\r\n  }\r\n  else\r\n  {\r\n    CONST_CAST(GLEW_VERSION_3_2) = ( major > 3 )               || ( major == 3 && minor >= 2 ) ? GL_TRUE : GL_FALSE;\r\n    CONST_CAST(GLEW_VERSION_3_1) = GLEW_VERSION_3_2 == GL_TRUE || ( major == 3 && minor >= 1 ) ? GL_TRUE : GL_FALSE;\r\n    CONST_CAST(GLEW_VERSION_3_0) = GLEW_VERSION_3_1 == GL_TRUE || ( major == 3               ) ? GL_TRUE : GL_FALSE;\r\n    CONST_CAST(GLEW_VERSION_2_1) = GLEW_VERSION_3_0 == GL_TRUE || ( major == 2 && minor >= 1 ) ? GL_TRUE : GL_FALSE;    \r\n    CONST_CAST(GLEW_VERSION_2_0) = GLEW_VERSION_2_1 == GL_TRUE || ( major == 2               ) ? GL_TRUE : GL_FALSE;\r\n    CONST_CAST(GLEW_VERSION_1_5) = GLEW_VERSION_2_0 == GL_TRUE || ( major == 1 && minor >= 5 ) ? GL_TRUE : GL_FALSE;\r\n    CONST_CAST(GLEW_VERSION_1_4) = GLEW_VERSION_1_5 == GL_TRUE || ( major == 1 && minor >= 4 ) ? GL_TRUE : GL_FALSE;\r\n    CONST_CAST(GLEW_VERSION_1_3) = GLEW_VERSION_1_4 == GL_TRUE || ( major == 1 && minor >= 3 ) ? GL_TRUE : GL_FALSE;\r\n    CONST_CAST(GLEW_VERSION_1_2) = GLEW_VERSION_1_3 == GL_TRUE || ( major == 1 && minor >= 2 ) ? GL_TRUE : GL_FALSE;\r\n    CONST_CAST(GLEW_VERSION_1_1) = GLEW_VERSION_1_2 == GL_TRUE || ( major == 1 && minor >= 1 ) ? GL_TRUE : GL_FALSE;\r\n  }\r\n  /* initialize extensions */\r\n#ifdef GL_VERSION_1_2\r\n  if (glewExperimental || GLEW_VERSION_1_2) CONST_CAST(GLEW_VERSION_1_2) = !_glewInit_GL_VERSION_1_2(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_VERSION_1_2 */\r\n#ifdef GL_VERSION_1_3\r\n  if (glewExperimental || GLEW_VERSION_1_3) CONST_CAST(GLEW_VERSION_1_3) = !_glewInit_GL_VERSION_1_3(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_VERSION_1_3 */\r\n#ifdef GL_VERSION_1_4\r\n  if (glewExperimental || GLEW_VERSION_1_4) CONST_CAST(GLEW_VERSION_1_4) = !_glewInit_GL_VERSION_1_4(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_VERSION_1_4 */\r\n#ifdef GL_VERSION_1_5\r\n  if (glewExperimental || GLEW_VERSION_1_5) CONST_CAST(GLEW_VERSION_1_5) = !_glewInit_GL_VERSION_1_5(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_VERSION_1_5 */\r\n#ifdef GL_VERSION_2_0\r\n  if (glewExperimental || GLEW_VERSION_2_0) CONST_CAST(GLEW_VERSION_2_0) = !_glewInit_GL_VERSION_2_0(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_VERSION_2_0 */\r\n#ifdef GL_VERSION_2_1\r\n  if (glewExperimental || GLEW_VERSION_2_1) CONST_CAST(GLEW_VERSION_2_1) = !_glewInit_GL_VERSION_2_1(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_VERSION_2_1 */\r\n#ifdef GL_VERSION_3_0\r\n  if (glewExperimental || GLEW_VERSION_3_0) CONST_CAST(GLEW_VERSION_3_0) = !_glewInit_GL_VERSION_3_0(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_VERSION_3_0 */\r\n#ifdef GL_VERSION_3_1\r\n  if (glewExperimental || GLEW_VERSION_3_1) CONST_CAST(GLEW_VERSION_3_1) = !_glewInit_GL_VERSION_3_1(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_VERSION_3_1 */\r\n#ifdef GL_VERSION_3_2\r\n  if (glewExperimental || GLEW_VERSION_3_2) CONST_CAST(GLEW_VERSION_3_2) = !_glewInit_GL_VERSION_3_2(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_VERSION_3_2 */\r\n#ifdef GL_3DFX_multisample\r\n  CONST_CAST(GLEW_3DFX_multisample) = glewGetExtension(\"GL_3DFX_multisample\");\r\n#endif /* GL_3DFX_multisample */\r\n#ifdef GL_3DFX_tbuffer\r\n  CONST_CAST(GLEW_3DFX_tbuffer) = glewGetExtension(\"GL_3DFX_tbuffer\");\r\n  if (glewExperimental || GLEW_3DFX_tbuffer) CONST_CAST(GLEW_3DFX_tbuffer) = !_glewInit_GL_3DFX_tbuffer(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_3DFX_tbuffer */\r\n#ifdef GL_3DFX_texture_compression_FXT1\r\n  CONST_CAST(GLEW_3DFX_texture_compression_FXT1) = glewGetExtension(\"GL_3DFX_texture_compression_FXT1\");\r\n#endif /* GL_3DFX_texture_compression_FXT1 */\r\n#ifdef GL_AMD_draw_buffers_blend\r\n  CONST_CAST(GLEW_AMD_draw_buffers_blend) = glewGetExtension(\"GL_AMD_draw_buffers_blend\");\r\n  if (glewExperimental || GLEW_AMD_draw_buffers_blend) CONST_CAST(GLEW_AMD_draw_buffers_blend) = !_glewInit_GL_AMD_draw_buffers_blend(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_AMD_draw_buffers_blend */\r\n#ifdef GL_AMD_performance_monitor\r\n  CONST_CAST(GLEW_AMD_performance_monitor) = glewGetExtension(\"GL_AMD_performance_monitor\");\r\n  if (glewExperimental || GLEW_AMD_performance_monitor) CONST_CAST(GLEW_AMD_performance_monitor) = !_glewInit_GL_AMD_performance_monitor(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_AMD_performance_monitor */\r\n#ifdef GL_AMD_seamless_cubemap_per_texture\r\n  CONST_CAST(GLEW_AMD_seamless_cubemap_per_texture) = glewGetExtension(\"GL_AMD_seamless_cubemap_per_texture\");\r\n#endif /* GL_AMD_seamless_cubemap_per_texture */\r\n#ifdef GL_AMD_shader_stencil_export\r\n  CONST_CAST(GLEW_AMD_shader_stencil_export) = glewGetExtension(\"GL_AMD_shader_stencil_export\");\r\n#endif /* GL_AMD_shader_stencil_export */\r\n#ifdef GL_AMD_texture_texture4\r\n  CONST_CAST(GLEW_AMD_texture_texture4) = glewGetExtension(\"GL_AMD_texture_texture4\");\r\n#endif /* GL_AMD_texture_texture4 */\r\n#ifdef GL_AMD_vertex_shader_tessellator\r\n  CONST_CAST(GLEW_AMD_vertex_shader_tessellator) = glewGetExtension(\"GL_AMD_vertex_shader_tessellator\");\r\n  if (glewExperimental || GLEW_AMD_vertex_shader_tessellator) CONST_CAST(GLEW_AMD_vertex_shader_tessellator) = !_glewInit_GL_AMD_vertex_shader_tessellator(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_AMD_vertex_shader_tessellator */\r\n#ifdef GL_APPLE_aux_depth_stencil\r\n  CONST_CAST(GLEW_APPLE_aux_depth_stencil) = glewGetExtension(\"GL_APPLE_aux_depth_stencil\");\r\n#endif /* GL_APPLE_aux_depth_stencil */\r\n#ifdef GL_APPLE_client_storage\r\n  CONST_CAST(GLEW_APPLE_client_storage) = glewGetExtension(\"GL_APPLE_client_storage\");\r\n#endif /* GL_APPLE_client_storage */\r\n#ifdef GL_APPLE_element_array\r\n  CONST_CAST(GLEW_APPLE_element_array) = glewGetExtension(\"GL_APPLE_element_array\");\r\n  if (glewExperimental || GLEW_APPLE_element_array) CONST_CAST(GLEW_APPLE_element_array) = !_glewInit_GL_APPLE_element_array(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_APPLE_element_array */\r\n#ifdef GL_APPLE_fence\r\n  CONST_CAST(GLEW_APPLE_fence) = glewGetExtension(\"GL_APPLE_fence\");\r\n  if (glewExperimental || GLEW_APPLE_fence) CONST_CAST(GLEW_APPLE_fence) = !_glewInit_GL_APPLE_fence(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_APPLE_fence */\r\n#ifdef GL_APPLE_float_pixels\r\n  CONST_CAST(GLEW_APPLE_float_pixels) = glewGetExtension(\"GL_APPLE_float_pixels\");\r\n#endif /* GL_APPLE_float_pixels */\r\n#ifdef GL_APPLE_flush_buffer_range\r\n  CONST_CAST(GLEW_APPLE_flush_buffer_range) = glewGetExtension(\"GL_APPLE_flush_buffer_range\");\r\n  if (glewExperimental || GLEW_APPLE_flush_buffer_range) CONST_CAST(GLEW_APPLE_flush_buffer_range) = !_glewInit_GL_APPLE_flush_buffer_range(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_APPLE_flush_buffer_range */\r\n#ifdef GL_APPLE_object_purgeable\r\n  CONST_CAST(GLEW_APPLE_object_purgeable) = glewGetExtension(\"GL_APPLE_object_purgeable\");\r\n  if (glewExperimental || GLEW_APPLE_object_purgeable) CONST_CAST(GLEW_APPLE_object_purgeable) = !_glewInit_GL_APPLE_object_purgeable(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_APPLE_object_purgeable */\r\n#ifdef GL_APPLE_pixel_buffer\r\n  CONST_CAST(GLEW_APPLE_pixel_buffer) = glewGetExtension(\"GL_APPLE_pixel_buffer\");\r\n#endif /* GL_APPLE_pixel_buffer */\r\n#ifdef GL_APPLE_rgb_422\r\n  CONST_CAST(GLEW_APPLE_rgb_422) = glewGetExtension(\"GL_APPLE_rgb_422\");\r\n#endif /* GL_APPLE_rgb_422 */\r\n#ifdef GL_APPLE_row_bytes\r\n  CONST_CAST(GLEW_APPLE_row_bytes) = glewGetExtension(\"GL_APPLE_row_bytes\");\r\n#endif /* GL_APPLE_row_bytes */\r\n#ifdef GL_APPLE_specular_vector\r\n  CONST_CAST(GLEW_APPLE_specular_vector) = glewGetExtension(\"GL_APPLE_specular_vector\");\r\n#endif /* GL_APPLE_specular_vector */\r\n#ifdef GL_APPLE_texture_range\r\n  CONST_CAST(GLEW_APPLE_texture_range) = glewGetExtension(\"GL_APPLE_texture_range\");\r\n  if (glewExperimental || GLEW_APPLE_texture_range) CONST_CAST(GLEW_APPLE_texture_range) = !_glewInit_GL_APPLE_texture_range(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_APPLE_texture_range */\r\n#ifdef GL_APPLE_transform_hint\r\n  CONST_CAST(GLEW_APPLE_transform_hint) = glewGetExtension(\"GL_APPLE_transform_hint\");\r\n#endif /* GL_APPLE_transform_hint */\r\n#ifdef GL_APPLE_vertex_array_object\r\n  CONST_CAST(GLEW_APPLE_vertex_array_object) = glewGetExtension(\"GL_APPLE_vertex_array_object\");\r\n  if (glewExperimental || GLEW_APPLE_vertex_array_object) CONST_CAST(GLEW_APPLE_vertex_array_object) = !_glewInit_GL_APPLE_vertex_array_object(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_APPLE_vertex_array_object */\r\n#ifdef GL_APPLE_vertex_array_range\r\n  CONST_CAST(GLEW_APPLE_vertex_array_range) = glewGetExtension(\"GL_APPLE_vertex_array_range\");\r\n  if (glewExperimental || GLEW_APPLE_vertex_array_range) CONST_CAST(GLEW_APPLE_vertex_array_range) = !_glewInit_GL_APPLE_vertex_array_range(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_APPLE_vertex_array_range */\r\n#ifdef GL_APPLE_vertex_program_evaluators\r\n  CONST_CAST(GLEW_APPLE_vertex_program_evaluators) = glewGetExtension(\"GL_APPLE_vertex_program_evaluators\");\r\n  if (glewExperimental || GLEW_APPLE_vertex_program_evaluators) CONST_CAST(GLEW_APPLE_vertex_program_evaluators) = !_glewInit_GL_APPLE_vertex_program_evaluators(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_APPLE_vertex_program_evaluators */\r\n#ifdef GL_APPLE_ycbcr_422\r\n  CONST_CAST(GLEW_APPLE_ycbcr_422) = glewGetExtension(\"GL_APPLE_ycbcr_422\");\r\n#endif /* GL_APPLE_ycbcr_422 */\r\n#ifdef GL_ARB_color_buffer_float\r\n  CONST_CAST(GLEW_ARB_color_buffer_float) = glewGetExtension(\"GL_ARB_color_buffer_float\");\r\n  if (glewExperimental || GLEW_ARB_color_buffer_float) CONST_CAST(GLEW_ARB_color_buffer_float) = !_glewInit_GL_ARB_color_buffer_float(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_ARB_color_buffer_float */\r\n#ifdef GL_ARB_compatibility\r\n  CONST_CAST(GLEW_ARB_compatibility) = glewGetExtension(\"GL_ARB_compatibility\");\r\n#endif /* GL_ARB_compatibility */\r\n#ifdef GL_ARB_copy_buffer\r\n  CONST_CAST(GLEW_ARB_copy_buffer) = glewGetExtension(\"GL_ARB_copy_buffer\");\r\n  if (glewExperimental || GLEW_ARB_copy_buffer) CONST_CAST(GLEW_ARB_copy_buffer) = !_glewInit_GL_ARB_copy_buffer(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_ARB_copy_buffer */\r\n#ifdef GL_ARB_depth_buffer_float\r\n  CONST_CAST(GLEW_ARB_depth_buffer_float) = glewGetExtension(\"GL_ARB_depth_buffer_float\");\r\n#endif /* GL_ARB_depth_buffer_float */\r\n#ifdef GL_ARB_depth_clamp\r\n  CONST_CAST(GLEW_ARB_depth_clamp) = glewGetExtension(\"GL_ARB_depth_clamp\");\r\n#endif /* GL_ARB_depth_clamp */\r\n#ifdef GL_ARB_depth_texture\r\n  CONST_CAST(GLEW_ARB_depth_texture) = glewGetExtension(\"GL_ARB_depth_texture\");\r\n#endif /* GL_ARB_depth_texture */\r\n#ifdef GL_ARB_draw_buffers\r\n  CONST_CAST(GLEW_ARB_draw_buffers) = glewGetExtension(\"GL_ARB_draw_buffers\");\r\n  if (glewExperimental || GLEW_ARB_draw_buffers) CONST_CAST(GLEW_ARB_draw_buffers) = !_glewInit_GL_ARB_draw_buffers(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_ARB_draw_buffers */\r\n#ifdef GL_ARB_draw_buffers_blend\r\n  CONST_CAST(GLEW_ARB_draw_buffers_blend) = glewGetExtension(\"GL_ARB_draw_buffers_blend\");\r\n  if (glewExperimental || GLEW_ARB_draw_buffers_blend) CONST_CAST(GLEW_ARB_draw_buffers_blend) = !_glewInit_GL_ARB_draw_buffers_blend(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_ARB_draw_buffers_blend */\r\n#ifdef GL_ARB_draw_elements_base_vertex\r\n  CONST_CAST(GLEW_ARB_draw_elements_base_vertex) = glewGetExtension(\"GL_ARB_draw_elements_base_vertex\");\r\n  if (glewExperimental || GLEW_ARB_draw_elements_base_vertex) CONST_CAST(GLEW_ARB_draw_elements_base_vertex) = !_glewInit_GL_ARB_draw_elements_base_vertex(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_ARB_draw_elements_base_vertex */\r\n#ifdef GL_ARB_draw_instanced\r\n  CONST_CAST(GLEW_ARB_draw_instanced) = glewGetExtension(\"GL_ARB_draw_instanced\");\r\n  if (glewExperimental || GLEW_ARB_draw_instanced) CONST_CAST(GLEW_ARB_draw_instanced) = !_glewInit_GL_ARB_draw_instanced(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_ARB_draw_instanced */\r\n#ifdef GL_ARB_fragment_coord_conventions\r\n  CONST_CAST(GLEW_ARB_fragment_coord_conventions) = glewGetExtension(\"GL_ARB_fragment_coord_conventions\");\r\n#endif /* GL_ARB_fragment_coord_conventions */\r\n#ifdef GL_ARB_fragment_program\r\n  CONST_CAST(GLEW_ARB_fragment_program) = glewGetExtension(\"GL_ARB_fragment_program\");\r\n#endif /* GL_ARB_fragment_program */\r\n#ifdef GL_ARB_fragment_program_shadow\r\n  CONST_CAST(GLEW_ARB_fragment_program_shadow) = glewGetExtension(\"GL_ARB_fragment_program_shadow\");\r\n#endif /* GL_ARB_fragment_program_shadow */\r\n#ifdef GL_ARB_fragment_shader\r\n  CONST_CAST(GLEW_ARB_fragment_shader) = glewGetExtension(\"GL_ARB_fragment_shader\");\r\n#endif /* GL_ARB_fragment_shader */\r\n#ifdef GL_ARB_framebuffer_object\r\n  CONST_CAST(GLEW_ARB_framebuffer_object) = glewGetExtension(\"GL_ARB_framebuffer_object\");\r\n  if (glewExperimental || GLEW_ARB_framebuffer_object) CONST_CAST(GLEW_ARB_framebuffer_object) = !_glewInit_GL_ARB_framebuffer_object(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_ARB_framebuffer_object */\r\n#ifdef GL_ARB_framebuffer_sRGB\r\n  CONST_CAST(GLEW_ARB_framebuffer_sRGB) = glewGetExtension(\"GL_ARB_framebuffer_sRGB\");\r\n#endif /* GL_ARB_framebuffer_sRGB */\r\n#ifdef GL_ARB_geometry_shader4\r\n  CONST_CAST(GLEW_ARB_geometry_shader4) = glewGetExtension(\"GL_ARB_geometry_shader4\");\r\n  if (glewExperimental || GLEW_ARB_geometry_shader4) CONST_CAST(GLEW_ARB_geometry_shader4) = !_glewInit_GL_ARB_geometry_shader4(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_ARB_geometry_shader4 */\r\n#ifdef GL_ARB_half_float_pixel\r\n  CONST_CAST(GLEW_ARB_half_float_pixel) = glewGetExtension(\"GL_ARB_half_float_pixel\");\r\n#endif /* GL_ARB_half_float_pixel */\r\n#ifdef GL_ARB_half_float_vertex\r\n  CONST_CAST(GLEW_ARB_half_float_vertex) = glewGetExtension(\"GL_ARB_half_float_vertex\");\r\n#endif /* GL_ARB_half_float_vertex */\r\n#ifdef GL_ARB_imaging\r\n  CONST_CAST(GLEW_ARB_imaging) = glewGetExtension(\"GL_ARB_imaging\");\r\n  if (glewExperimental || GLEW_ARB_imaging) CONST_CAST(GLEW_ARB_imaging) = !_glewInit_GL_ARB_imaging(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_ARB_imaging */\r\n#ifdef GL_ARB_instanced_arrays\r\n  CONST_CAST(GLEW_ARB_instanced_arrays) = glewGetExtension(\"GL_ARB_instanced_arrays\");\r\n  if (glewExperimental || GLEW_ARB_instanced_arrays) CONST_CAST(GLEW_ARB_instanced_arrays) = !_glewInit_GL_ARB_instanced_arrays(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_ARB_instanced_arrays */\r\n#ifdef GL_ARB_map_buffer_range\r\n  CONST_CAST(GLEW_ARB_map_buffer_range) = glewGetExtension(\"GL_ARB_map_buffer_range\");\r\n  if (glewExperimental || GLEW_ARB_map_buffer_range) CONST_CAST(GLEW_ARB_map_buffer_range) = !_glewInit_GL_ARB_map_buffer_range(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_ARB_map_buffer_range */\r\n#ifdef GL_ARB_matrix_palette\r\n  CONST_CAST(GLEW_ARB_matrix_palette) = glewGetExtension(\"GL_ARB_matrix_palette\");\r\n  if (glewExperimental || GLEW_ARB_matrix_palette) CONST_CAST(GLEW_ARB_matrix_palette) = !_glewInit_GL_ARB_matrix_palette(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_ARB_matrix_palette */\r\n#ifdef GL_ARB_multisample\r\n  CONST_CAST(GLEW_ARB_multisample) = glewGetExtension(\"GL_ARB_multisample\");\r\n  if (glewExperimental || GLEW_ARB_multisample) CONST_CAST(GLEW_ARB_multisample) = !_glewInit_GL_ARB_multisample(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_ARB_multisample */\r\n#ifdef GL_ARB_multitexture\r\n  CONST_CAST(GLEW_ARB_multitexture) = glewGetExtension(\"GL_ARB_multitexture\");\r\n  if (glewExperimental || GLEW_ARB_multitexture) CONST_CAST(GLEW_ARB_multitexture) = !_glewInit_GL_ARB_multitexture(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_ARB_multitexture */\r\n#ifdef GL_ARB_occlusion_query\r\n  CONST_CAST(GLEW_ARB_occlusion_query) = glewGetExtension(\"GL_ARB_occlusion_query\");\r\n  if (glewExperimental || GLEW_ARB_occlusion_query) CONST_CAST(GLEW_ARB_occlusion_query) = !_glewInit_GL_ARB_occlusion_query(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_ARB_occlusion_query */\r\n#ifdef GL_ARB_pixel_buffer_object\r\n  CONST_CAST(GLEW_ARB_pixel_buffer_object) = glewGetExtension(\"GL_ARB_pixel_buffer_object\");\r\n#endif /* GL_ARB_pixel_buffer_object */\r\n#ifdef GL_ARB_point_parameters\r\n  CONST_CAST(GLEW_ARB_point_parameters) = glewGetExtension(\"GL_ARB_point_parameters\");\r\n  if (glewExperimental || GLEW_ARB_point_parameters) CONST_CAST(GLEW_ARB_point_parameters) = !_glewInit_GL_ARB_point_parameters(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_ARB_point_parameters */\r\n#ifdef GL_ARB_point_sprite\r\n  CONST_CAST(GLEW_ARB_point_sprite) = glewGetExtension(\"GL_ARB_point_sprite\");\r\n#endif /* GL_ARB_point_sprite */\r\n#ifdef GL_ARB_provoking_vertex\r\n  CONST_CAST(GLEW_ARB_provoking_vertex) = glewGetExtension(\"GL_ARB_provoking_vertex\");\r\n  if (glewExperimental || GLEW_ARB_provoking_vertex) CONST_CAST(GLEW_ARB_provoking_vertex) = !_glewInit_GL_ARB_provoking_vertex(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_ARB_provoking_vertex */\r\n#ifdef GL_ARB_sample_shading\r\n  CONST_CAST(GLEW_ARB_sample_shading) = glewGetExtension(\"GL_ARB_sample_shading\");\r\n  if (glewExperimental || GLEW_ARB_sample_shading) CONST_CAST(GLEW_ARB_sample_shading) = !_glewInit_GL_ARB_sample_shading(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_ARB_sample_shading */\r\n#ifdef GL_ARB_seamless_cube_map\r\n  CONST_CAST(GLEW_ARB_seamless_cube_map) = glewGetExtension(\"GL_ARB_seamless_cube_map\");\r\n#endif /* GL_ARB_seamless_cube_map */\r\n#ifdef GL_ARB_shader_objects\r\n  CONST_CAST(GLEW_ARB_shader_objects) = glewGetExtension(\"GL_ARB_shader_objects\");\r\n  if (glewExperimental || GLEW_ARB_shader_objects) CONST_CAST(GLEW_ARB_shader_objects) = !_glewInit_GL_ARB_shader_objects(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_ARB_shader_objects */\r\n#ifdef GL_ARB_shader_texture_lod\r\n  CONST_CAST(GLEW_ARB_shader_texture_lod) = glewGetExtension(\"GL_ARB_shader_texture_lod\");\r\n#endif /* GL_ARB_shader_texture_lod */\r\n#ifdef GL_ARB_shading_language_100\r\n  CONST_CAST(GLEW_ARB_shading_language_100) = glewGetExtension(\"GL_ARB_shading_language_100\");\r\n#endif /* GL_ARB_shading_language_100 */\r\n#ifdef GL_ARB_shadow\r\n  CONST_CAST(GLEW_ARB_shadow) = glewGetExtension(\"GL_ARB_shadow\");\r\n#endif /* GL_ARB_shadow */\r\n#ifdef GL_ARB_shadow_ambient\r\n  CONST_CAST(GLEW_ARB_shadow_ambient) = glewGetExtension(\"GL_ARB_shadow_ambient\");\r\n#endif /* GL_ARB_shadow_ambient */\r\n#ifdef GL_ARB_sync\r\n  CONST_CAST(GLEW_ARB_sync) = glewGetExtension(\"GL_ARB_sync\");\r\n  if (glewExperimental || GLEW_ARB_sync) CONST_CAST(GLEW_ARB_sync) = !_glewInit_GL_ARB_sync(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_ARB_sync */\r\n#ifdef GL_ARB_texture_border_clamp\r\n  CONST_CAST(GLEW_ARB_texture_border_clamp) = glewGetExtension(\"GL_ARB_texture_border_clamp\");\r\n#endif /* GL_ARB_texture_border_clamp */\r\n#ifdef GL_ARB_texture_buffer_object\r\n  CONST_CAST(GLEW_ARB_texture_buffer_object) = glewGetExtension(\"GL_ARB_texture_buffer_object\");\r\n  if (glewExperimental || GLEW_ARB_texture_buffer_object) CONST_CAST(GLEW_ARB_texture_buffer_object) = !_glewInit_GL_ARB_texture_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_ARB_texture_buffer_object */\r\n#ifdef GL_ARB_texture_compression\r\n  CONST_CAST(GLEW_ARB_texture_compression) = glewGetExtension(\"GL_ARB_texture_compression\");\r\n  if (glewExperimental || GLEW_ARB_texture_compression) CONST_CAST(GLEW_ARB_texture_compression) = !_glewInit_GL_ARB_texture_compression(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_ARB_texture_compression */\r\n#ifdef GL_ARB_texture_compression_rgtc\r\n  CONST_CAST(GLEW_ARB_texture_compression_rgtc) = glewGetExtension(\"GL_ARB_texture_compression_rgtc\");\r\n#endif /* GL_ARB_texture_compression_rgtc */\r\n#ifdef GL_ARB_texture_cube_map\r\n  CONST_CAST(GLEW_ARB_texture_cube_map) = glewGetExtension(\"GL_ARB_texture_cube_map\");\r\n#endif /* GL_ARB_texture_cube_map */\r\n#ifdef GL_ARB_texture_cube_map_array\r\n  CONST_CAST(GLEW_ARB_texture_cube_map_array) = glewGetExtension(\"GL_ARB_texture_cube_map_array\");\r\n#endif /* GL_ARB_texture_cube_map_array */\r\n#ifdef GL_ARB_texture_env_add\r\n  CONST_CAST(GLEW_ARB_texture_env_add) = glewGetExtension(\"GL_ARB_texture_env_add\");\r\n#endif /* GL_ARB_texture_env_add */\r\n#ifdef GL_ARB_texture_env_combine\r\n  CONST_CAST(GLEW_ARB_texture_env_combine) = glewGetExtension(\"GL_ARB_texture_env_combine\");\r\n#endif /* GL_ARB_texture_env_combine */\r\n#ifdef GL_ARB_texture_env_crossbar\r\n  CONST_CAST(GLEW_ARB_texture_env_crossbar) = glewGetExtension(\"GL_ARB_texture_env_crossbar\");\r\n#endif /* GL_ARB_texture_env_crossbar */\r\n#ifdef GL_ARB_texture_env_dot3\r\n  CONST_CAST(GLEW_ARB_texture_env_dot3) = glewGetExtension(\"GL_ARB_texture_env_dot3\");\r\n#endif /* GL_ARB_texture_env_dot3 */\r\n#ifdef GL_ARB_texture_float\r\n  CONST_CAST(GLEW_ARB_texture_float) = glewGetExtension(\"GL_ARB_texture_float\");\r\n#endif /* GL_ARB_texture_float */\r\n#ifdef GL_ARB_texture_gather\r\n  CONST_CAST(GLEW_ARB_texture_gather) = glewGetExtension(\"GL_ARB_texture_gather\");\r\n#endif /* GL_ARB_texture_gather */\r\n#ifdef GL_ARB_texture_mirrored_repeat\r\n  CONST_CAST(GLEW_ARB_texture_mirrored_repeat) = glewGetExtension(\"GL_ARB_texture_mirrored_repeat\");\r\n#endif /* GL_ARB_texture_mirrored_repeat */\r\n#ifdef GL_ARB_texture_multisample\r\n  CONST_CAST(GLEW_ARB_texture_multisample) = glewGetExtension(\"GL_ARB_texture_multisample\");\r\n  if (glewExperimental || GLEW_ARB_texture_multisample) CONST_CAST(GLEW_ARB_texture_multisample) = !_glewInit_GL_ARB_texture_multisample(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_ARB_texture_multisample */\r\n#ifdef GL_ARB_texture_non_power_of_two\r\n  CONST_CAST(GLEW_ARB_texture_non_power_of_two) = glewGetExtension(\"GL_ARB_texture_non_power_of_two\");\r\n#endif /* GL_ARB_texture_non_power_of_two */\r\n#ifdef GL_ARB_texture_query_lod\r\n  CONST_CAST(GLEW_ARB_texture_query_lod) = glewGetExtension(\"GL_ARB_texture_query_lod\");\r\n#endif /* GL_ARB_texture_query_lod */\r\n#ifdef GL_ARB_texture_rectangle\r\n  CONST_CAST(GLEW_ARB_texture_rectangle) = glewGetExtension(\"GL_ARB_texture_rectangle\");\r\n#endif /* GL_ARB_texture_rectangle */\r\n#ifdef GL_ARB_texture_rg\r\n  CONST_CAST(GLEW_ARB_texture_rg) = glewGetExtension(\"GL_ARB_texture_rg\");\r\n#endif /* GL_ARB_texture_rg */\r\n#ifdef GL_ARB_transpose_matrix\r\n  CONST_CAST(GLEW_ARB_transpose_matrix) = glewGetExtension(\"GL_ARB_transpose_matrix\");\r\n  if (glewExperimental || GLEW_ARB_transpose_matrix) CONST_CAST(GLEW_ARB_transpose_matrix) = !_glewInit_GL_ARB_transpose_matrix(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_ARB_transpose_matrix */\r\n#ifdef GL_ARB_uniform_buffer_object\r\n  CONST_CAST(GLEW_ARB_uniform_buffer_object) = glewGetExtension(\"GL_ARB_uniform_buffer_object\");\r\n  if (glewExperimental || GLEW_ARB_uniform_buffer_object) CONST_CAST(GLEW_ARB_uniform_buffer_object) = !_glewInit_GL_ARB_uniform_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_ARB_uniform_buffer_object */\r\n#ifdef GL_ARB_vertex_array_bgra\r\n  CONST_CAST(GLEW_ARB_vertex_array_bgra) = glewGetExtension(\"GL_ARB_vertex_array_bgra\");\r\n#endif /* GL_ARB_vertex_array_bgra */\r\n#ifdef GL_ARB_vertex_array_object\r\n  CONST_CAST(GLEW_ARB_vertex_array_object) = glewGetExtension(\"GL_ARB_vertex_array_object\");\r\n  if (glewExperimental || GLEW_ARB_vertex_array_object) CONST_CAST(GLEW_ARB_vertex_array_object) = !_glewInit_GL_ARB_vertex_array_object(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_ARB_vertex_array_object */\r\n#ifdef GL_ARB_vertex_blend\r\n  CONST_CAST(GLEW_ARB_vertex_blend) = glewGetExtension(\"GL_ARB_vertex_blend\");\r\n  if (glewExperimental || GLEW_ARB_vertex_blend) CONST_CAST(GLEW_ARB_vertex_blend) = !_glewInit_GL_ARB_vertex_blend(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_ARB_vertex_blend */\r\n#ifdef GL_ARB_vertex_buffer_object\r\n  CONST_CAST(GLEW_ARB_vertex_buffer_object) = glewGetExtension(\"GL_ARB_vertex_buffer_object\");\r\n  if (glewExperimental || GLEW_ARB_vertex_buffer_object) CONST_CAST(GLEW_ARB_vertex_buffer_object) = !_glewInit_GL_ARB_vertex_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_ARB_vertex_buffer_object */\r\n#ifdef GL_ARB_vertex_program\r\n  CONST_CAST(GLEW_ARB_vertex_program) = glewGetExtension(\"GL_ARB_vertex_program\");\r\n  if (glewExperimental || GLEW_ARB_vertex_program) CONST_CAST(GLEW_ARB_vertex_program) = !_glewInit_GL_ARB_vertex_program(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_ARB_vertex_program */\r\n#ifdef GL_ARB_vertex_shader\r\n  CONST_CAST(GLEW_ARB_vertex_shader) = glewGetExtension(\"GL_ARB_vertex_shader\");\r\n  if (glewExperimental || GLEW_ARB_vertex_shader) CONST_CAST(GLEW_ARB_vertex_shader) = !_glewInit_GL_ARB_vertex_shader(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_ARB_vertex_shader */\r\n#ifdef GL_ARB_window_pos\r\n  CONST_CAST(GLEW_ARB_window_pos) = glewGetExtension(\"GL_ARB_window_pos\");\r\n  if (glewExperimental || GLEW_ARB_window_pos) CONST_CAST(GLEW_ARB_window_pos) = !_glewInit_GL_ARB_window_pos(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_ARB_window_pos */\r\n#ifdef GL_ATIX_point_sprites\r\n  CONST_CAST(GLEW_ATIX_point_sprites) = glewGetExtension(\"GL_ATIX_point_sprites\");\r\n#endif /* GL_ATIX_point_sprites */\r\n#ifdef GL_ATIX_texture_env_combine3\r\n  CONST_CAST(GLEW_ATIX_texture_env_combine3) = glewGetExtension(\"GL_ATIX_texture_env_combine3\");\r\n#endif /* GL_ATIX_texture_env_combine3 */\r\n#ifdef GL_ATIX_texture_env_route\r\n  CONST_CAST(GLEW_ATIX_texture_env_route) = glewGetExtension(\"GL_ATIX_texture_env_route\");\r\n#endif /* GL_ATIX_texture_env_route */\r\n#ifdef GL_ATIX_vertex_shader_output_point_size\r\n  CONST_CAST(GLEW_ATIX_vertex_shader_output_point_size) = glewGetExtension(\"GL_ATIX_vertex_shader_output_point_size\");\r\n#endif /* GL_ATIX_vertex_shader_output_point_size */\r\n#ifdef GL_ATI_draw_buffers\r\n  CONST_CAST(GLEW_ATI_draw_buffers) = glewGetExtension(\"GL_ATI_draw_buffers\");\r\n  if (glewExperimental || GLEW_ATI_draw_buffers) CONST_CAST(GLEW_ATI_draw_buffers) = !_glewInit_GL_ATI_draw_buffers(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_ATI_draw_buffers */\r\n#ifdef GL_ATI_element_array\r\n  CONST_CAST(GLEW_ATI_element_array) = glewGetExtension(\"GL_ATI_element_array\");\r\n  if (glewExperimental || GLEW_ATI_element_array) CONST_CAST(GLEW_ATI_element_array) = !_glewInit_GL_ATI_element_array(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_ATI_element_array */\r\n#ifdef GL_ATI_envmap_bumpmap\r\n  CONST_CAST(GLEW_ATI_envmap_bumpmap) = glewGetExtension(\"GL_ATI_envmap_bumpmap\");\r\n  if (glewExperimental || GLEW_ATI_envmap_bumpmap) CONST_CAST(GLEW_ATI_envmap_bumpmap) = !_glewInit_GL_ATI_envmap_bumpmap(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_ATI_envmap_bumpmap */\r\n#ifdef GL_ATI_fragment_shader\r\n  CONST_CAST(GLEW_ATI_fragment_shader) = glewGetExtension(\"GL_ATI_fragment_shader\");\r\n  if (glewExperimental || GLEW_ATI_fragment_shader) CONST_CAST(GLEW_ATI_fragment_shader) = !_glewInit_GL_ATI_fragment_shader(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_ATI_fragment_shader */\r\n#ifdef GL_ATI_map_object_buffer\r\n  CONST_CAST(GLEW_ATI_map_object_buffer) = glewGetExtension(\"GL_ATI_map_object_buffer\");\r\n  if (glewExperimental || GLEW_ATI_map_object_buffer) CONST_CAST(GLEW_ATI_map_object_buffer) = !_glewInit_GL_ATI_map_object_buffer(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_ATI_map_object_buffer */\r\n#ifdef GL_ATI_meminfo\r\n  CONST_CAST(GLEW_ATI_meminfo) = glewGetExtension(\"GL_ATI_meminfo\");\r\n#endif /* GL_ATI_meminfo */\r\n#ifdef GL_ATI_pn_triangles\r\n  CONST_CAST(GLEW_ATI_pn_triangles) = glewGetExtension(\"GL_ATI_pn_triangles\");\r\n  if (glewExperimental || GLEW_ATI_pn_triangles) CONST_CAST(GLEW_ATI_pn_triangles) = !_glewInit_GL_ATI_pn_triangles(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_ATI_pn_triangles */\r\n#ifdef GL_ATI_separate_stencil\r\n  CONST_CAST(GLEW_ATI_separate_stencil) = glewGetExtension(\"GL_ATI_separate_stencil\");\r\n  if (glewExperimental || GLEW_ATI_separate_stencil) CONST_CAST(GLEW_ATI_separate_stencil) = !_glewInit_GL_ATI_separate_stencil(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_ATI_separate_stencil */\r\n#ifdef GL_ATI_shader_texture_lod\r\n  CONST_CAST(GLEW_ATI_shader_texture_lod) = glewGetExtension(\"GL_ATI_shader_texture_lod\");\r\n#endif /* GL_ATI_shader_texture_lod */\r\n#ifdef GL_ATI_text_fragment_shader\r\n  CONST_CAST(GLEW_ATI_text_fragment_shader) = glewGetExtension(\"GL_ATI_text_fragment_shader\");\r\n#endif /* GL_ATI_text_fragment_shader */\r\n#ifdef GL_ATI_texture_compression_3dc\r\n  CONST_CAST(GLEW_ATI_texture_compression_3dc) = glewGetExtension(\"GL_ATI_texture_compression_3dc\");\r\n#endif /* GL_ATI_texture_compression_3dc */\r\n#ifdef GL_ATI_texture_env_combine3\r\n  CONST_CAST(GLEW_ATI_texture_env_combine3) = glewGetExtension(\"GL_ATI_texture_env_combine3\");\r\n#endif /* GL_ATI_texture_env_combine3 */\r\n#ifdef GL_ATI_texture_float\r\n  CONST_CAST(GLEW_ATI_texture_float) = glewGetExtension(\"GL_ATI_texture_float\");\r\n#endif /* GL_ATI_texture_float */\r\n#ifdef GL_ATI_texture_mirror_once\r\n  CONST_CAST(GLEW_ATI_texture_mirror_once) = glewGetExtension(\"GL_ATI_texture_mirror_once\");\r\n#endif /* GL_ATI_texture_mirror_once */\r\n#ifdef GL_ATI_vertex_array_object\r\n  CONST_CAST(GLEW_ATI_vertex_array_object) = glewGetExtension(\"GL_ATI_vertex_array_object\");\r\n  if (glewExperimental || GLEW_ATI_vertex_array_object) CONST_CAST(GLEW_ATI_vertex_array_object) = !_glewInit_GL_ATI_vertex_array_object(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_ATI_vertex_array_object */\r\n#ifdef GL_ATI_vertex_attrib_array_object\r\n  CONST_CAST(GLEW_ATI_vertex_attrib_array_object) = glewGetExtension(\"GL_ATI_vertex_attrib_array_object\");\r\n  if (glewExperimental || GLEW_ATI_vertex_attrib_array_object) CONST_CAST(GLEW_ATI_vertex_attrib_array_object) = !_glewInit_GL_ATI_vertex_attrib_array_object(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_ATI_vertex_attrib_array_object */\r\n#ifdef GL_ATI_vertex_streams\r\n  CONST_CAST(GLEW_ATI_vertex_streams) = glewGetExtension(\"GL_ATI_vertex_streams\");\r\n  if (glewExperimental || GLEW_ATI_vertex_streams) CONST_CAST(GLEW_ATI_vertex_streams) = !_glewInit_GL_ATI_vertex_streams(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_ATI_vertex_streams */\r\n#ifdef GL_EXT_422_pixels\r\n  CONST_CAST(GLEW_EXT_422_pixels) = glewGetExtension(\"GL_EXT_422_pixels\");\r\n#endif /* GL_EXT_422_pixels */\r\n#ifdef GL_EXT_Cg_shader\r\n  CONST_CAST(GLEW_EXT_Cg_shader) = glewGetExtension(\"GL_EXT_Cg_shader\");\r\n#endif /* GL_EXT_Cg_shader */\r\n#ifdef GL_EXT_abgr\r\n  CONST_CAST(GLEW_EXT_abgr) = glewGetExtension(\"GL_EXT_abgr\");\r\n#endif /* GL_EXT_abgr */\r\n#ifdef GL_EXT_bgra\r\n  CONST_CAST(GLEW_EXT_bgra) = glewGetExtension(\"GL_EXT_bgra\");\r\n#endif /* GL_EXT_bgra */\r\n#ifdef GL_EXT_bindable_uniform\r\n  CONST_CAST(GLEW_EXT_bindable_uniform) = glewGetExtension(\"GL_EXT_bindable_uniform\");\r\n  if (glewExperimental || GLEW_EXT_bindable_uniform) CONST_CAST(GLEW_EXT_bindable_uniform) = !_glewInit_GL_EXT_bindable_uniform(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_bindable_uniform */\r\n#ifdef GL_EXT_blend_color\r\n  CONST_CAST(GLEW_EXT_blend_color) = glewGetExtension(\"GL_EXT_blend_color\");\r\n  if (glewExperimental || GLEW_EXT_blend_color) CONST_CAST(GLEW_EXT_blend_color) = !_glewInit_GL_EXT_blend_color(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_blend_color */\r\n#ifdef GL_EXT_blend_equation_separate\r\n  CONST_CAST(GLEW_EXT_blend_equation_separate) = glewGetExtension(\"GL_EXT_blend_equation_separate\");\r\n  if (glewExperimental || GLEW_EXT_blend_equation_separate) CONST_CAST(GLEW_EXT_blend_equation_separate) = !_glewInit_GL_EXT_blend_equation_separate(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_blend_equation_separate */\r\n#ifdef GL_EXT_blend_func_separate\r\n  CONST_CAST(GLEW_EXT_blend_func_separate) = glewGetExtension(\"GL_EXT_blend_func_separate\");\r\n  if (glewExperimental || GLEW_EXT_blend_func_separate) CONST_CAST(GLEW_EXT_blend_func_separate) = !_glewInit_GL_EXT_blend_func_separate(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_blend_func_separate */\r\n#ifdef GL_EXT_blend_logic_op\r\n  CONST_CAST(GLEW_EXT_blend_logic_op) = glewGetExtension(\"GL_EXT_blend_logic_op\");\r\n#endif /* GL_EXT_blend_logic_op */\r\n#ifdef GL_EXT_blend_minmax\r\n  CONST_CAST(GLEW_EXT_blend_minmax) = glewGetExtension(\"GL_EXT_blend_minmax\");\r\n  if (glewExperimental || GLEW_EXT_blend_minmax) CONST_CAST(GLEW_EXT_blend_minmax) = !_glewInit_GL_EXT_blend_minmax(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_blend_minmax */\r\n#ifdef GL_EXT_blend_subtract\r\n  CONST_CAST(GLEW_EXT_blend_subtract) = glewGetExtension(\"GL_EXT_blend_subtract\");\r\n#endif /* GL_EXT_blend_subtract */\r\n#ifdef GL_EXT_clip_volume_hint\r\n  CONST_CAST(GLEW_EXT_clip_volume_hint) = glewGetExtension(\"GL_EXT_clip_volume_hint\");\r\n#endif /* GL_EXT_clip_volume_hint */\r\n#ifdef GL_EXT_cmyka\r\n  CONST_CAST(GLEW_EXT_cmyka) = glewGetExtension(\"GL_EXT_cmyka\");\r\n#endif /* GL_EXT_cmyka */\r\n#ifdef GL_EXT_color_subtable\r\n  CONST_CAST(GLEW_EXT_color_subtable) = glewGetExtension(\"GL_EXT_color_subtable\");\r\n  if (glewExperimental || GLEW_EXT_color_subtable) CONST_CAST(GLEW_EXT_color_subtable) = !_glewInit_GL_EXT_color_subtable(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_color_subtable */\r\n#ifdef GL_EXT_compiled_vertex_array\r\n  CONST_CAST(GLEW_EXT_compiled_vertex_array) = glewGetExtension(\"GL_EXT_compiled_vertex_array\");\r\n  if (glewExperimental || GLEW_EXT_compiled_vertex_array) CONST_CAST(GLEW_EXT_compiled_vertex_array) = !_glewInit_GL_EXT_compiled_vertex_array(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_compiled_vertex_array */\r\n#ifdef GL_EXT_convolution\r\n  CONST_CAST(GLEW_EXT_convolution) = glewGetExtension(\"GL_EXT_convolution\");\r\n  if (glewExperimental || GLEW_EXT_convolution) CONST_CAST(GLEW_EXT_convolution) = !_glewInit_GL_EXT_convolution(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_convolution */\r\n#ifdef GL_EXT_coordinate_frame\r\n  CONST_CAST(GLEW_EXT_coordinate_frame) = glewGetExtension(\"GL_EXT_coordinate_frame\");\r\n  if (glewExperimental || GLEW_EXT_coordinate_frame) CONST_CAST(GLEW_EXT_coordinate_frame) = !_glewInit_GL_EXT_coordinate_frame(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_coordinate_frame */\r\n#ifdef GL_EXT_copy_texture\r\n  CONST_CAST(GLEW_EXT_copy_texture) = glewGetExtension(\"GL_EXT_copy_texture\");\r\n  if (glewExperimental || GLEW_EXT_copy_texture) CONST_CAST(GLEW_EXT_copy_texture) = !_glewInit_GL_EXT_copy_texture(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_copy_texture */\r\n#ifdef GL_EXT_cull_vertex\r\n  CONST_CAST(GLEW_EXT_cull_vertex) = glewGetExtension(\"GL_EXT_cull_vertex\");\r\n  if (glewExperimental || GLEW_EXT_cull_vertex) CONST_CAST(GLEW_EXT_cull_vertex) = !_glewInit_GL_EXT_cull_vertex(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_cull_vertex */\r\n#ifdef GL_EXT_depth_bounds_test\r\n  CONST_CAST(GLEW_EXT_depth_bounds_test) = glewGetExtension(\"GL_EXT_depth_bounds_test\");\r\n  if (glewExperimental || GLEW_EXT_depth_bounds_test) CONST_CAST(GLEW_EXT_depth_bounds_test) = !_glewInit_GL_EXT_depth_bounds_test(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_depth_bounds_test */\r\n#ifdef GL_EXT_direct_state_access\r\n  CONST_CAST(GLEW_EXT_direct_state_access) = glewGetExtension(\"GL_EXT_direct_state_access\");\r\n  if (glewExperimental || GLEW_EXT_direct_state_access) CONST_CAST(GLEW_EXT_direct_state_access) = !_glewInit_GL_EXT_direct_state_access(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_direct_state_access */\r\n#ifdef GL_EXT_draw_buffers2\r\n  CONST_CAST(GLEW_EXT_draw_buffers2) = glewGetExtension(\"GL_EXT_draw_buffers2\");\r\n  if (glewExperimental || GLEW_EXT_draw_buffers2) CONST_CAST(GLEW_EXT_draw_buffers2) = !_glewInit_GL_EXT_draw_buffers2(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_draw_buffers2 */\r\n#ifdef GL_EXT_draw_instanced\r\n  CONST_CAST(GLEW_EXT_draw_instanced) = glewGetExtension(\"GL_EXT_draw_instanced\");\r\n  if (glewExperimental || GLEW_EXT_draw_instanced) CONST_CAST(GLEW_EXT_draw_instanced) = !_glewInit_GL_EXT_draw_instanced(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_draw_instanced */\r\n#ifdef GL_EXT_draw_range_elements\r\n  CONST_CAST(GLEW_EXT_draw_range_elements) = glewGetExtension(\"GL_EXT_draw_range_elements\");\r\n  if (glewExperimental || GLEW_EXT_draw_range_elements) CONST_CAST(GLEW_EXT_draw_range_elements) = !_glewInit_GL_EXT_draw_range_elements(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_draw_range_elements */\r\n#ifdef GL_EXT_fog_coord\r\n  CONST_CAST(GLEW_EXT_fog_coord) = glewGetExtension(\"GL_EXT_fog_coord\");\r\n  if (glewExperimental || GLEW_EXT_fog_coord) CONST_CAST(GLEW_EXT_fog_coord) = !_glewInit_GL_EXT_fog_coord(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_fog_coord */\r\n#ifdef GL_EXT_fragment_lighting\r\n  CONST_CAST(GLEW_EXT_fragment_lighting) = glewGetExtension(\"GL_EXT_fragment_lighting\");\r\n  if (glewExperimental || GLEW_EXT_fragment_lighting) CONST_CAST(GLEW_EXT_fragment_lighting) = !_glewInit_GL_EXT_fragment_lighting(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_fragment_lighting */\r\n#ifdef GL_EXT_framebuffer_blit\r\n  CONST_CAST(GLEW_EXT_framebuffer_blit) = glewGetExtension(\"GL_EXT_framebuffer_blit\");\r\n  if (glewExperimental || GLEW_EXT_framebuffer_blit) CONST_CAST(GLEW_EXT_framebuffer_blit) = !_glewInit_GL_EXT_framebuffer_blit(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_framebuffer_blit */\r\n#ifdef GL_EXT_framebuffer_multisample\r\n  CONST_CAST(GLEW_EXT_framebuffer_multisample) = glewGetExtension(\"GL_EXT_framebuffer_multisample\");\r\n  if (glewExperimental || GLEW_EXT_framebuffer_multisample) CONST_CAST(GLEW_EXT_framebuffer_multisample) = !_glewInit_GL_EXT_framebuffer_multisample(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_framebuffer_multisample */\r\n#ifdef GL_EXT_framebuffer_object\r\n  CONST_CAST(GLEW_EXT_framebuffer_object) = glewGetExtension(\"GL_EXT_framebuffer_object\");\r\n  if (glewExperimental || GLEW_EXT_framebuffer_object) CONST_CAST(GLEW_EXT_framebuffer_object) = !_glewInit_GL_EXT_framebuffer_object(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_framebuffer_object */\r\n#ifdef GL_EXT_framebuffer_sRGB\r\n  CONST_CAST(GLEW_EXT_framebuffer_sRGB) = glewGetExtension(\"GL_EXT_framebuffer_sRGB\");\r\n#endif /* GL_EXT_framebuffer_sRGB */\r\n#ifdef GL_EXT_geometry_shader4\r\n  CONST_CAST(GLEW_EXT_geometry_shader4) = glewGetExtension(\"GL_EXT_geometry_shader4\");\r\n  if (glewExperimental || GLEW_EXT_geometry_shader4) CONST_CAST(GLEW_EXT_geometry_shader4) = !_glewInit_GL_EXT_geometry_shader4(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_geometry_shader4 */\r\n#ifdef GL_EXT_gpu_program_parameters\r\n  CONST_CAST(GLEW_EXT_gpu_program_parameters) = glewGetExtension(\"GL_EXT_gpu_program_parameters\");\r\n  if (glewExperimental || GLEW_EXT_gpu_program_parameters) CONST_CAST(GLEW_EXT_gpu_program_parameters) = !_glewInit_GL_EXT_gpu_program_parameters(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_gpu_program_parameters */\r\n#ifdef GL_EXT_gpu_shader4\r\n  CONST_CAST(GLEW_EXT_gpu_shader4) = glewGetExtension(\"GL_EXT_gpu_shader4\");\r\n  if (glewExperimental || GLEW_EXT_gpu_shader4) CONST_CAST(GLEW_EXT_gpu_shader4) = !_glewInit_GL_EXT_gpu_shader4(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_gpu_shader4 */\r\n#ifdef GL_EXT_histogram\r\n  CONST_CAST(GLEW_EXT_histogram) = glewGetExtension(\"GL_EXT_histogram\");\r\n  if (glewExperimental || GLEW_EXT_histogram) CONST_CAST(GLEW_EXT_histogram) = !_glewInit_GL_EXT_histogram(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_histogram */\r\n#ifdef GL_EXT_index_array_formats\r\n  CONST_CAST(GLEW_EXT_index_array_formats) = glewGetExtension(\"GL_EXT_index_array_formats\");\r\n#endif /* GL_EXT_index_array_formats */\r\n#ifdef GL_EXT_index_func\r\n  CONST_CAST(GLEW_EXT_index_func) = glewGetExtension(\"GL_EXT_index_func\");\r\n  if (glewExperimental || GLEW_EXT_index_func) CONST_CAST(GLEW_EXT_index_func) = !_glewInit_GL_EXT_index_func(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_index_func */\r\n#ifdef GL_EXT_index_material\r\n  CONST_CAST(GLEW_EXT_index_material) = glewGetExtension(\"GL_EXT_index_material\");\r\n  if (glewExperimental || GLEW_EXT_index_material) CONST_CAST(GLEW_EXT_index_material) = !_glewInit_GL_EXT_index_material(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_index_material */\r\n#ifdef GL_EXT_index_texture\r\n  CONST_CAST(GLEW_EXT_index_texture) = glewGetExtension(\"GL_EXT_index_texture\");\r\n#endif /* GL_EXT_index_texture */\r\n#ifdef GL_EXT_light_texture\r\n  CONST_CAST(GLEW_EXT_light_texture) = glewGetExtension(\"GL_EXT_light_texture\");\r\n  if (glewExperimental || GLEW_EXT_light_texture) CONST_CAST(GLEW_EXT_light_texture) = !_glewInit_GL_EXT_light_texture(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_light_texture */\r\n#ifdef GL_EXT_misc_attribute\r\n  CONST_CAST(GLEW_EXT_misc_attribute) = glewGetExtension(\"GL_EXT_misc_attribute\");\r\n#endif /* GL_EXT_misc_attribute */\r\n#ifdef GL_EXT_multi_draw_arrays\r\n  CONST_CAST(GLEW_EXT_multi_draw_arrays) = glewGetExtension(\"GL_EXT_multi_draw_arrays\");\r\n  if (glewExperimental || GLEW_EXT_multi_draw_arrays) CONST_CAST(GLEW_EXT_multi_draw_arrays) = !_glewInit_GL_EXT_multi_draw_arrays(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_multi_draw_arrays */\r\n#ifdef GL_EXT_multisample\r\n  CONST_CAST(GLEW_EXT_multisample) = glewGetExtension(\"GL_EXT_multisample\");\r\n  if (glewExperimental || GLEW_EXT_multisample) CONST_CAST(GLEW_EXT_multisample) = !_glewInit_GL_EXT_multisample(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_multisample */\r\n#ifdef GL_EXT_packed_depth_stencil\r\n  CONST_CAST(GLEW_EXT_packed_depth_stencil) = glewGetExtension(\"GL_EXT_packed_depth_stencil\");\r\n#endif /* GL_EXT_packed_depth_stencil */\r\n#ifdef GL_EXT_packed_float\r\n  CONST_CAST(GLEW_EXT_packed_float) = glewGetExtension(\"GL_EXT_packed_float\");\r\n#endif /* GL_EXT_packed_float */\r\n#ifdef GL_EXT_packed_pixels\r\n  CONST_CAST(GLEW_EXT_packed_pixels) = glewGetExtension(\"GL_EXT_packed_pixels\");\r\n#endif /* GL_EXT_packed_pixels */\r\n#ifdef GL_EXT_paletted_texture\r\n  CONST_CAST(GLEW_EXT_paletted_texture) = glewGetExtension(\"GL_EXT_paletted_texture\");\r\n  if (glewExperimental || GLEW_EXT_paletted_texture) CONST_CAST(GLEW_EXT_paletted_texture) = !_glewInit_GL_EXT_paletted_texture(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_paletted_texture */\r\n#ifdef GL_EXT_pixel_buffer_object\r\n  CONST_CAST(GLEW_EXT_pixel_buffer_object) = glewGetExtension(\"GL_EXT_pixel_buffer_object\");\r\n#endif /* GL_EXT_pixel_buffer_object */\r\n#ifdef GL_EXT_pixel_transform\r\n  CONST_CAST(GLEW_EXT_pixel_transform) = glewGetExtension(\"GL_EXT_pixel_transform\");\r\n  if (glewExperimental || GLEW_EXT_pixel_transform) CONST_CAST(GLEW_EXT_pixel_transform) = !_glewInit_GL_EXT_pixel_transform(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_pixel_transform */\r\n#ifdef GL_EXT_pixel_transform_color_table\r\n  CONST_CAST(GLEW_EXT_pixel_transform_color_table) = glewGetExtension(\"GL_EXT_pixel_transform_color_table\");\r\n#endif /* GL_EXT_pixel_transform_color_table */\r\n#ifdef GL_EXT_point_parameters\r\n  CONST_CAST(GLEW_EXT_point_parameters) = glewGetExtension(\"GL_EXT_point_parameters\");\r\n  if (glewExperimental || GLEW_EXT_point_parameters) CONST_CAST(GLEW_EXT_point_parameters) = !_glewInit_GL_EXT_point_parameters(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_point_parameters */\r\n#ifdef GL_EXT_polygon_offset\r\n  CONST_CAST(GLEW_EXT_polygon_offset) = glewGetExtension(\"GL_EXT_polygon_offset\");\r\n  if (glewExperimental || GLEW_EXT_polygon_offset) CONST_CAST(GLEW_EXT_polygon_offset) = !_glewInit_GL_EXT_polygon_offset(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_polygon_offset */\r\n#ifdef GL_EXT_provoking_vertex\r\n  CONST_CAST(GLEW_EXT_provoking_vertex) = glewGetExtension(\"GL_EXT_provoking_vertex\");\r\n  if (glewExperimental || GLEW_EXT_provoking_vertex) CONST_CAST(GLEW_EXT_provoking_vertex) = !_glewInit_GL_EXT_provoking_vertex(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_provoking_vertex */\r\n#ifdef GL_EXT_rescale_normal\r\n  CONST_CAST(GLEW_EXT_rescale_normal) = glewGetExtension(\"GL_EXT_rescale_normal\");\r\n#endif /* GL_EXT_rescale_normal */\r\n#ifdef GL_EXT_scene_marker\r\n  CONST_CAST(GLEW_EXT_scene_marker) = glewGetExtension(\"GL_EXT_scene_marker\");\r\n  if (glewExperimental || GLEW_EXT_scene_marker) CONST_CAST(GLEW_EXT_scene_marker) = !_glewInit_GL_EXT_scene_marker(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_scene_marker */\r\n#ifdef GL_EXT_secondary_color\r\n  CONST_CAST(GLEW_EXT_secondary_color) = glewGetExtension(\"GL_EXT_secondary_color\");\r\n  if (glewExperimental || GLEW_EXT_secondary_color) CONST_CAST(GLEW_EXT_secondary_color) = !_glewInit_GL_EXT_secondary_color(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_secondary_color */\r\n#ifdef GL_EXT_separate_shader_objects\r\n  CONST_CAST(GLEW_EXT_separate_shader_objects) = glewGetExtension(\"GL_EXT_separate_shader_objects\");\r\n  if (glewExperimental || GLEW_EXT_separate_shader_objects) CONST_CAST(GLEW_EXT_separate_shader_objects) = !_glewInit_GL_EXT_separate_shader_objects(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_separate_shader_objects */\r\n#ifdef GL_EXT_separate_specular_color\r\n  CONST_CAST(GLEW_EXT_separate_specular_color) = glewGetExtension(\"GL_EXT_separate_specular_color\");\r\n#endif /* GL_EXT_separate_specular_color */\r\n#ifdef GL_EXT_shadow_funcs\r\n  CONST_CAST(GLEW_EXT_shadow_funcs) = glewGetExtension(\"GL_EXT_shadow_funcs\");\r\n#endif /* GL_EXT_shadow_funcs */\r\n#ifdef GL_EXT_shared_texture_palette\r\n  CONST_CAST(GLEW_EXT_shared_texture_palette) = glewGetExtension(\"GL_EXT_shared_texture_palette\");\r\n#endif /* GL_EXT_shared_texture_palette */\r\n#ifdef GL_EXT_stencil_clear_tag\r\n  CONST_CAST(GLEW_EXT_stencil_clear_tag) = glewGetExtension(\"GL_EXT_stencil_clear_tag\");\r\n#endif /* GL_EXT_stencil_clear_tag */\r\n#ifdef GL_EXT_stencil_two_side\r\n  CONST_CAST(GLEW_EXT_stencil_two_side) = glewGetExtension(\"GL_EXT_stencil_two_side\");\r\n  if (glewExperimental || GLEW_EXT_stencil_two_side) CONST_CAST(GLEW_EXT_stencil_two_side) = !_glewInit_GL_EXT_stencil_two_side(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_stencil_two_side */\r\n#ifdef GL_EXT_stencil_wrap\r\n  CONST_CAST(GLEW_EXT_stencil_wrap) = glewGetExtension(\"GL_EXT_stencil_wrap\");\r\n#endif /* GL_EXT_stencil_wrap */\r\n#ifdef GL_EXT_subtexture\r\n  CONST_CAST(GLEW_EXT_subtexture) = glewGetExtension(\"GL_EXT_subtexture\");\r\n  if (glewExperimental || GLEW_EXT_subtexture) CONST_CAST(GLEW_EXT_subtexture) = !_glewInit_GL_EXT_subtexture(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_subtexture */\r\n#ifdef GL_EXT_texture\r\n  CONST_CAST(GLEW_EXT_texture) = glewGetExtension(\"GL_EXT_texture\");\r\n#endif /* GL_EXT_texture */\r\n#ifdef GL_EXT_texture3D\r\n  CONST_CAST(GLEW_EXT_texture3D) = glewGetExtension(\"GL_EXT_texture3D\");\r\n  if (glewExperimental || GLEW_EXT_texture3D) CONST_CAST(GLEW_EXT_texture3D) = !_glewInit_GL_EXT_texture3D(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_texture3D */\r\n#ifdef GL_EXT_texture_array\r\n  CONST_CAST(GLEW_EXT_texture_array) = glewGetExtension(\"GL_EXT_texture_array\");\r\n#endif /* GL_EXT_texture_array */\r\n#ifdef GL_EXT_texture_buffer_object\r\n  CONST_CAST(GLEW_EXT_texture_buffer_object) = glewGetExtension(\"GL_EXT_texture_buffer_object\");\r\n  if (glewExperimental || GLEW_EXT_texture_buffer_object) CONST_CAST(GLEW_EXT_texture_buffer_object) = !_glewInit_GL_EXT_texture_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_texture_buffer_object */\r\n#ifdef GL_EXT_texture_compression_dxt1\r\n  CONST_CAST(GLEW_EXT_texture_compression_dxt1) = glewGetExtension(\"GL_EXT_texture_compression_dxt1\");\r\n#endif /* GL_EXT_texture_compression_dxt1 */\r\n#ifdef GL_EXT_texture_compression_latc\r\n  CONST_CAST(GLEW_EXT_texture_compression_latc) = glewGetExtension(\"GL_EXT_texture_compression_latc\");\r\n#endif /* GL_EXT_texture_compression_latc */\r\n#ifdef GL_EXT_texture_compression_rgtc\r\n  CONST_CAST(GLEW_EXT_texture_compression_rgtc) = glewGetExtension(\"GL_EXT_texture_compression_rgtc\");\r\n#endif /* GL_EXT_texture_compression_rgtc */\r\n#ifdef GL_EXT_texture_compression_s3tc\r\n  CONST_CAST(GLEW_EXT_texture_compression_s3tc) = glewGetExtension(\"GL_EXT_texture_compression_s3tc\");\r\n#endif /* GL_EXT_texture_compression_s3tc */\r\n#ifdef GL_EXT_texture_cube_map\r\n  CONST_CAST(GLEW_EXT_texture_cube_map) = glewGetExtension(\"GL_EXT_texture_cube_map\");\r\n#endif /* GL_EXT_texture_cube_map */\r\n#ifdef GL_EXT_texture_edge_clamp\r\n  CONST_CAST(GLEW_EXT_texture_edge_clamp) = glewGetExtension(\"GL_EXT_texture_edge_clamp\");\r\n#endif /* GL_EXT_texture_edge_clamp */\r\n#ifdef GL_EXT_texture_env\r\n  CONST_CAST(GLEW_EXT_texture_env) = glewGetExtension(\"GL_EXT_texture_env\");\r\n#endif /* GL_EXT_texture_env */\r\n#ifdef GL_EXT_texture_env_add\r\n  CONST_CAST(GLEW_EXT_texture_env_add) = glewGetExtension(\"GL_EXT_texture_env_add\");\r\n#endif /* GL_EXT_texture_env_add */\r\n#ifdef GL_EXT_texture_env_combine\r\n  CONST_CAST(GLEW_EXT_texture_env_combine) = glewGetExtension(\"GL_EXT_texture_env_combine\");\r\n#endif /* GL_EXT_texture_env_combine */\r\n#ifdef GL_EXT_texture_env_dot3\r\n  CONST_CAST(GLEW_EXT_texture_env_dot3) = glewGetExtension(\"GL_EXT_texture_env_dot3\");\r\n#endif /* GL_EXT_texture_env_dot3 */\r\n#ifdef GL_EXT_texture_filter_anisotropic\r\n  CONST_CAST(GLEW_EXT_texture_filter_anisotropic) = glewGetExtension(\"GL_EXT_texture_filter_anisotropic\");\r\n#endif /* GL_EXT_texture_filter_anisotropic */\r\n#ifdef GL_EXT_texture_integer\r\n  CONST_CAST(GLEW_EXT_texture_integer) = glewGetExtension(\"GL_EXT_texture_integer\");\r\n  if (glewExperimental || GLEW_EXT_texture_integer) CONST_CAST(GLEW_EXT_texture_integer) = !_glewInit_GL_EXT_texture_integer(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_texture_integer */\r\n#ifdef GL_EXT_texture_lod_bias\r\n  CONST_CAST(GLEW_EXT_texture_lod_bias) = glewGetExtension(\"GL_EXT_texture_lod_bias\");\r\n#endif /* GL_EXT_texture_lod_bias */\r\n#ifdef GL_EXT_texture_mirror_clamp\r\n  CONST_CAST(GLEW_EXT_texture_mirror_clamp) = glewGetExtension(\"GL_EXT_texture_mirror_clamp\");\r\n#endif /* GL_EXT_texture_mirror_clamp */\r\n#ifdef GL_EXT_texture_object\r\n  CONST_CAST(GLEW_EXT_texture_object) = glewGetExtension(\"GL_EXT_texture_object\");\r\n  if (glewExperimental || GLEW_EXT_texture_object) CONST_CAST(GLEW_EXT_texture_object) = !_glewInit_GL_EXT_texture_object(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_texture_object */\r\n#ifdef GL_EXT_texture_perturb_normal\r\n  CONST_CAST(GLEW_EXT_texture_perturb_normal) = glewGetExtension(\"GL_EXT_texture_perturb_normal\");\r\n  if (glewExperimental || GLEW_EXT_texture_perturb_normal) CONST_CAST(GLEW_EXT_texture_perturb_normal) = !_glewInit_GL_EXT_texture_perturb_normal(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_texture_perturb_normal */\r\n#ifdef GL_EXT_texture_rectangle\r\n  CONST_CAST(GLEW_EXT_texture_rectangle) = glewGetExtension(\"GL_EXT_texture_rectangle\");\r\n#endif /* GL_EXT_texture_rectangle */\r\n#ifdef GL_EXT_texture_sRGB\r\n  CONST_CAST(GLEW_EXT_texture_sRGB) = glewGetExtension(\"GL_EXT_texture_sRGB\");\r\n#endif /* GL_EXT_texture_sRGB */\r\n#ifdef GL_EXT_texture_shared_exponent\r\n  CONST_CAST(GLEW_EXT_texture_shared_exponent) = glewGetExtension(\"GL_EXT_texture_shared_exponent\");\r\n#endif /* GL_EXT_texture_shared_exponent */\r\n#ifdef GL_EXT_texture_snorm\r\n  CONST_CAST(GLEW_EXT_texture_snorm) = glewGetExtension(\"GL_EXT_texture_snorm\");\r\n#endif /* GL_EXT_texture_snorm */\r\n#ifdef GL_EXT_texture_swizzle\r\n  CONST_CAST(GLEW_EXT_texture_swizzle) = glewGetExtension(\"GL_EXT_texture_swizzle\");\r\n#endif /* GL_EXT_texture_swizzle */\r\n#ifdef GL_EXT_timer_query\r\n  CONST_CAST(GLEW_EXT_timer_query) = glewGetExtension(\"GL_EXT_timer_query\");\r\n  if (glewExperimental || GLEW_EXT_timer_query) CONST_CAST(GLEW_EXT_timer_query) = !_glewInit_GL_EXT_timer_query(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_timer_query */\r\n#ifdef GL_EXT_transform_feedback\r\n  CONST_CAST(GLEW_EXT_transform_feedback) = glewGetExtension(\"GL_EXT_transform_feedback\");\r\n  if (glewExperimental || GLEW_EXT_transform_feedback) CONST_CAST(GLEW_EXT_transform_feedback) = !_glewInit_GL_EXT_transform_feedback(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_transform_feedback */\r\n#ifdef GL_EXT_vertex_array\r\n  CONST_CAST(GLEW_EXT_vertex_array) = glewGetExtension(\"GL_EXT_vertex_array\");\r\n  if (glewExperimental || GLEW_EXT_vertex_array) CONST_CAST(GLEW_EXT_vertex_array) = !_glewInit_GL_EXT_vertex_array(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_vertex_array */\r\n#ifdef GL_EXT_vertex_array_bgra\r\n  CONST_CAST(GLEW_EXT_vertex_array_bgra) = glewGetExtension(\"GL_EXT_vertex_array_bgra\");\r\n#endif /* GL_EXT_vertex_array_bgra */\r\n#ifdef GL_EXT_vertex_shader\r\n  CONST_CAST(GLEW_EXT_vertex_shader) = glewGetExtension(\"GL_EXT_vertex_shader\");\r\n  if (glewExperimental || GLEW_EXT_vertex_shader) CONST_CAST(GLEW_EXT_vertex_shader) = !_glewInit_GL_EXT_vertex_shader(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_vertex_shader */\r\n#ifdef GL_EXT_vertex_weighting\r\n  CONST_CAST(GLEW_EXT_vertex_weighting) = glewGetExtension(\"GL_EXT_vertex_weighting\");\r\n  if (glewExperimental || GLEW_EXT_vertex_weighting) CONST_CAST(GLEW_EXT_vertex_weighting) = !_glewInit_GL_EXT_vertex_weighting(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_EXT_vertex_weighting */\r\n#ifdef GL_GREMEDY_frame_terminator\r\n  CONST_CAST(GLEW_GREMEDY_frame_terminator) = glewGetExtension(\"GL_GREMEDY_frame_terminator\");\r\n  if (glewExperimental || GLEW_GREMEDY_frame_terminator) CONST_CAST(GLEW_GREMEDY_frame_terminator) = !_glewInit_GL_GREMEDY_frame_terminator(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_GREMEDY_frame_terminator */\r\n#ifdef GL_GREMEDY_string_marker\r\n  CONST_CAST(GLEW_GREMEDY_string_marker) = glewGetExtension(\"GL_GREMEDY_string_marker\");\r\n  if (glewExperimental || GLEW_GREMEDY_string_marker) CONST_CAST(GLEW_GREMEDY_string_marker) = !_glewInit_GL_GREMEDY_string_marker(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_GREMEDY_string_marker */\r\n#ifdef GL_HP_convolution_border_modes\r\n  CONST_CAST(GLEW_HP_convolution_border_modes) = glewGetExtension(\"GL_HP_convolution_border_modes\");\r\n#endif /* GL_HP_convolution_border_modes */\r\n#ifdef GL_HP_image_transform\r\n  CONST_CAST(GLEW_HP_image_transform) = glewGetExtension(\"GL_HP_image_transform\");\r\n  if (glewExperimental || GLEW_HP_image_transform) CONST_CAST(GLEW_HP_image_transform) = !_glewInit_GL_HP_image_transform(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_HP_image_transform */\r\n#ifdef GL_HP_occlusion_test\r\n  CONST_CAST(GLEW_HP_occlusion_test) = glewGetExtension(\"GL_HP_occlusion_test\");\r\n#endif /* GL_HP_occlusion_test */\r\n#ifdef GL_HP_texture_lighting\r\n  CONST_CAST(GLEW_HP_texture_lighting) = glewGetExtension(\"GL_HP_texture_lighting\");\r\n#endif /* GL_HP_texture_lighting */\r\n#ifdef GL_IBM_cull_vertex\r\n  CONST_CAST(GLEW_IBM_cull_vertex) = glewGetExtension(\"GL_IBM_cull_vertex\");\r\n#endif /* GL_IBM_cull_vertex */\r\n#ifdef GL_IBM_multimode_draw_arrays\r\n  CONST_CAST(GLEW_IBM_multimode_draw_arrays) = glewGetExtension(\"GL_IBM_multimode_draw_arrays\");\r\n  if (glewExperimental || GLEW_IBM_multimode_draw_arrays) CONST_CAST(GLEW_IBM_multimode_draw_arrays) = !_glewInit_GL_IBM_multimode_draw_arrays(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_IBM_multimode_draw_arrays */\r\n#ifdef GL_IBM_rasterpos_clip\r\n  CONST_CAST(GLEW_IBM_rasterpos_clip) = glewGetExtension(\"GL_IBM_rasterpos_clip\");\r\n#endif /* GL_IBM_rasterpos_clip */\r\n#ifdef GL_IBM_static_data\r\n  CONST_CAST(GLEW_IBM_static_data) = glewGetExtension(\"GL_IBM_static_data\");\r\n#endif /* GL_IBM_static_data */\r\n#ifdef GL_IBM_texture_mirrored_repeat\r\n  CONST_CAST(GLEW_IBM_texture_mirrored_repeat) = glewGetExtension(\"GL_IBM_texture_mirrored_repeat\");\r\n#endif /* GL_IBM_texture_mirrored_repeat */\r\n#ifdef GL_IBM_vertex_array_lists\r\n  CONST_CAST(GLEW_IBM_vertex_array_lists) = glewGetExtension(\"GL_IBM_vertex_array_lists\");\r\n  if (glewExperimental || GLEW_IBM_vertex_array_lists) CONST_CAST(GLEW_IBM_vertex_array_lists) = !_glewInit_GL_IBM_vertex_array_lists(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_IBM_vertex_array_lists */\r\n#ifdef GL_INGR_color_clamp\r\n  CONST_CAST(GLEW_INGR_color_clamp) = glewGetExtension(\"GL_INGR_color_clamp\");\r\n#endif /* GL_INGR_color_clamp */\r\n#ifdef GL_INGR_interlace_read\r\n  CONST_CAST(GLEW_INGR_interlace_read) = glewGetExtension(\"GL_INGR_interlace_read\");\r\n#endif /* GL_INGR_interlace_read */\r\n#ifdef GL_INTEL_parallel_arrays\r\n  CONST_CAST(GLEW_INTEL_parallel_arrays) = glewGetExtension(\"GL_INTEL_parallel_arrays\");\r\n  if (glewExperimental || GLEW_INTEL_parallel_arrays) CONST_CAST(GLEW_INTEL_parallel_arrays) = !_glewInit_GL_INTEL_parallel_arrays(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_INTEL_parallel_arrays */\r\n#ifdef GL_INTEL_texture_scissor\r\n  CONST_CAST(GLEW_INTEL_texture_scissor) = glewGetExtension(\"GL_INTEL_texture_scissor\");\r\n  if (glewExperimental || GLEW_INTEL_texture_scissor) CONST_CAST(GLEW_INTEL_texture_scissor) = !_glewInit_GL_INTEL_texture_scissor(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_INTEL_texture_scissor */\r\n#ifdef GL_KTX_buffer_region\r\n  CONST_CAST(GLEW_KTX_buffer_region) = glewGetExtension(\"GL_KTX_buffer_region\");\r\n  if (glewExperimental || GLEW_KTX_buffer_region) CONST_CAST(GLEW_KTX_buffer_region) = !_glewInit_GL_KTX_buffer_region(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_KTX_buffer_region */\r\n#ifdef GL_MESAX_texture_stack\r\n  CONST_CAST(GLEW_MESAX_texture_stack) = glewGetExtension(\"GL_MESAX_texture_stack\");\r\n#endif /* GL_MESAX_texture_stack */\r\n#ifdef GL_MESA_pack_invert\r\n  CONST_CAST(GLEW_MESA_pack_invert) = glewGetExtension(\"GL_MESA_pack_invert\");\r\n#endif /* GL_MESA_pack_invert */\r\n#ifdef GL_MESA_resize_buffers\r\n  CONST_CAST(GLEW_MESA_resize_buffers) = glewGetExtension(\"GL_MESA_resize_buffers\");\r\n  if (glewExperimental || GLEW_MESA_resize_buffers) CONST_CAST(GLEW_MESA_resize_buffers) = !_glewInit_GL_MESA_resize_buffers(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_MESA_resize_buffers */\r\n#ifdef GL_MESA_window_pos\r\n  CONST_CAST(GLEW_MESA_window_pos) = glewGetExtension(\"GL_MESA_window_pos\");\r\n  if (glewExperimental || GLEW_MESA_window_pos) CONST_CAST(GLEW_MESA_window_pos) = !_glewInit_GL_MESA_window_pos(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_MESA_window_pos */\r\n#ifdef GL_MESA_ycbcr_texture\r\n  CONST_CAST(GLEW_MESA_ycbcr_texture) = glewGetExtension(\"GL_MESA_ycbcr_texture\");\r\n#endif /* GL_MESA_ycbcr_texture */\r\n#ifdef GL_NV_blend_square\r\n  CONST_CAST(GLEW_NV_blend_square) = glewGetExtension(\"GL_NV_blend_square\");\r\n#endif /* GL_NV_blend_square */\r\n#ifdef GL_NV_conditional_render\r\n  CONST_CAST(GLEW_NV_conditional_render) = glewGetExtension(\"GL_NV_conditional_render\");\r\n  if (glewExperimental || GLEW_NV_conditional_render) CONST_CAST(GLEW_NV_conditional_render) = !_glewInit_GL_NV_conditional_render(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_NV_conditional_render */\r\n#ifdef GL_NV_copy_depth_to_color\r\n  CONST_CAST(GLEW_NV_copy_depth_to_color) = glewGetExtension(\"GL_NV_copy_depth_to_color\");\r\n#endif /* GL_NV_copy_depth_to_color */\r\n#ifdef GL_NV_copy_image\r\n  CONST_CAST(GLEW_NV_copy_image) = glewGetExtension(\"GL_NV_copy_image\");\r\n  if (glewExperimental || GLEW_NV_copy_image) CONST_CAST(GLEW_NV_copy_image) = !_glewInit_GL_NV_copy_image(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_NV_copy_image */\r\n#ifdef GL_NV_depth_buffer_float\r\n  CONST_CAST(GLEW_NV_depth_buffer_float) = glewGetExtension(\"GL_NV_depth_buffer_float\");\r\n  if (glewExperimental || GLEW_NV_depth_buffer_float) CONST_CAST(GLEW_NV_depth_buffer_float) = !_glewInit_GL_NV_depth_buffer_float(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_NV_depth_buffer_float */\r\n#ifdef GL_NV_depth_clamp\r\n  CONST_CAST(GLEW_NV_depth_clamp) = glewGetExtension(\"GL_NV_depth_clamp\");\r\n#endif /* GL_NV_depth_clamp */\r\n#ifdef GL_NV_depth_range_unclamped\r\n  CONST_CAST(GLEW_NV_depth_range_unclamped) = glewGetExtension(\"GL_NV_depth_range_unclamped\");\r\n#endif /* GL_NV_depth_range_unclamped */\r\n#ifdef GL_NV_evaluators\r\n  CONST_CAST(GLEW_NV_evaluators) = glewGetExtension(\"GL_NV_evaluators\");\r\n  if (glewExperimental || GLEW_NV_evaluators) CONST_CAST(GLEW_NV_evaluators) = !_glewInit_GL_NV_evaluators(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_NV_evaluators */\r\n#ifdef GL_NV_explicit_multisample\r\n  CONST_CAST(GLEW_NV_explicit_multisample) = glewGetExtension(\"GL_NV_explicit_multisample\");\r\n  if (glewExperimental || GLEW_NV_explicit_multisample) CONST_CAST(GLEW_NV_explicit_multisample) = !_glewInit_GL_NV_explicit_multisample(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_NV_explicit_multisample */\r\n#ifdef GL_NV_fence\r\n  CONST_CAST(GLEW_NV_fence) = glewGetExtension(\"GL_NV_fence\");\r\n  if (glewExperimental || GLEW_NV_fence) CONST_CAST(GLEW_NV_fence) = !_glewInit_GL_NV_fence(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_NV_fence */\r\n#ifdef GL_NV_float_buffer\r\n  CONST_CAST(GLEW_NV_float_buffer) = glewGetExtension(\"GL_NV_float_buffer\");\r\n#endif /* GL_NV_float_buffer */\r\n#ifdef GL_NV_fog_distance\r\n  CONST_CAST(GLEW_NV_fog_distance) = glewGetExtension(\"GL_NV_fog_distance\");\r\n#endif /* GL_NV_fog_distance */\r\n#ifdef GL_NV_fragment_program\r\n  CONST_CAST(GLEW_NV_fragment_program) = glewGetExtension(\"GL_NV_fragment_program\");\r\n  if (glewExperimental || GLEW_NV_fragment_program) CONST_CAST(GLEW_NV_fragment_program) = !_glewInit_GL_NV_fragment_program(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_NV_fragment_program */\r\n#ifdef GL_NV_fragment_program2\r\n  CONST_CAST(GLEW_NV_fragment_program2) = glewGetExtension(\"GL_NV_fragment_program2\");\r\n#endif /* GL_NV_fragment_program2 */\r\n#ifdef GL_NV_fragment_program4\r\n  CONST_CAST(GLEW_NV_fragment_program4) = glewGetExtension(\"GL_NV_fragment_program4\");\r\n#endif /* GL_NV_fragment_program4 */\r\n#ifdef GL_NV_fragment_program_option\r\n  CONST_CAST(GLEW_NV_fragment_program_option) = glewGetExtension(\"GL_NV_fragment_program_option\");\r\n#endif /* GL_NV_fragment_program_option */\r\n#ifdef GL_NV_framebuffer_multisample_coverage\r\n  CONST_CAST(GLEW_NV_framebuffer_multisample_coverage) = glewGetExtension(\"GL_NV_framebuffer_multisample_coverage\");\r\n  if (glewExperimental || GLEW_NV_framebuffer_multisample_coverage) CONST_CAST(GLEW_NV_framebuffer_multisample_coverage) = !_glewInit_GL_NV_framebuffer_multisample_coverage(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_NV_framebuffer_multisample_coverage */\r\n#ifdef GL_NV_geometry_program4\r\n  CONST_CAST(GLEW_NV_geometry_program4) = glewGetExtension(\"GL_NV_geometry_program4\");\r\n  if (glewExperimental || GLEW_NV_geometry_program4) CONST_CAST(GLEW_NV_geometry_program4) = !_glewInit_GL_NV_geometry_program4(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_NV_geometry_program4 */\r\n#ifdef GL_NV_geometry_shader4\r\n  CONST_CAST(GLEW_NV_geometry_shader4) = glewGetExtension(\"GL_NV_geometry_shader4\");\r\n#endif /* GL_NV_geometry_shader4 */\r\n#ifdef GL_NV_gpu_program4\r\n  CONST_CAST(GLEW_NV_gpu_program4) = glewGetExtension(\"GL_NV_gpu_program4\");\r\n  if (glewExperimental || GLEW_NV_gpu_program4) CONST_CAST(GLEW_NV_gpu_program4) = !_glewInit_GL_NV_gpu_program4(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_NV_gpu_program4 */\r\n#ifdef GL_NV_half_float\r\n  CONST_CAST(GLEW_NV_half_float) = glewGetExtension(\"GL_NV_half_float\");\r\n  if (glewExperimental || GLEW_NV_half_float) CONST_CAST(GLEW_NV_half_float) = !_glewInit_GL_NV_half_float(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_NV_half_float */\r\n#ifdef GL_NV_light_max_exponent\r\n  CONST_CAST(GLEW_NV_light_max_exponent) = glewGetExtension(\"GL_NV_light_max_exponent\");\r\n#endif /* GL_NV_light_max_exponent */\r\n#ifdef GL_NV_multisample_filter_hint\r\n  CONST_CAST(GLEW_NV_multisample_filter_hint) = glewGetExtension(\"GL_NV_multisample_filter_hint\");\r\n#endif /* GL_NV_multisample_filter_hint */\r\n#ifdef GL_NV_occlusion_query\r\n  CONST_CAST(GLEW_NV_occlusion_query) = glewGetExtension(\"GL_NV_occlusion_query\");\r\n  if (glewExperimental || GLEW_NV_occlusion_query) CONST_CAST(GLEW_NV_occlusion_query) = !_glewInit_GL_NV_occlusion_query(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_NV_occlusion_query */\r\n#ifdef GL_NV_packed_depth_stencil\r\n  CONST_CAST(GLEW_NV_packed_depth_stencil) = glewGetExtension(\"GL_NV_packed_depth_stencil\");\r\n#endif /* GL_NV_packed_depth_stencil */\r\n#ifdef GL_NV_parameter_buffer_object\r\n  CONST_CAST(GLEW_NV_parameter_buffer_object) = glewGetExtension(\"GL_NV_parameter_buffer_object\");\r\n  if (glewExperimental || GLEW_NV_parameter_buffer_object) CONST_CAST(GLEW_NV_parameter_buffer_object) = !_glewInit_GL_NV_parameter_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_NV_parameter_buffer_object */\r\n#ifdef GL_NV_parameter_buffer_object2\r\n  CONST_CAST(GLEW_NV_parameter_buffer_object2) = glewGetExtension(\"GL_NV_parameter_buffer_object2\");\r\n#endif /* GL_NV_parameter_buffer_object2 */\r\n#ifdef GL_NV_pixel_data_range\r\n  CONST_CAST(GLEW_NV_pixel_data_range) = glewGetExtension(\"GL_NV_pixel_data_range\");\r\n  if (glewExperimental || GLEW_NV_pixel_data_range) CONST_CAST(GLEW_NV_pixel_data_range) = !_glewInit_GL_NV_pixel_data_range(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_NV_pixel_data_range */\r\n#ifdef GL_NV_point_sprite\r\n  CONST_CAST(GLEW_NV_point_sprite) = glewGetExtension(\"GL_NV_point_sprite\");\r\n  if (glewExperimental || GLEW_NV_point_sprite) CONST_CAST(GLEW_NV_point_sprite) = !_glewInit_GL_NV_point_sprite(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_NV_point_sprite */\r\n#ifdef GL_NV_present_video\r\n  CONST_CAST(GLEW_NV_present_video) = glewGetExtension(\"GL_NV_present_video\");\r\n  if (glewExperimental || GLEW_NV_present_video) CONST_CAST(GLEW_NV_present_video) = !_glewInit_GL_NV_present_video(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_NV_present_video */\r\n#ifdef GL_NV_primitive_restart\r\n  CONST_CAST(GLEW_NV_primitive_restart) = glewGetExtension(\"GL_NV_primitive_restart\");\r\n  if (glewExperimental || GLEW_NV_primitive_restart) CONST_CAST(GLEW_NV_primitive_restart) = !_glewInit_GL_NV_primitive_restart(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_NV_primitive_restart */\r\n#ifdef GL_NV_register_combiners\r\n  CONST_CAST(GLEW_NV_register_combiners) = glewGetExtension(\"GL_NV_register_combiners\");\r\n  if (glewExperimental || GLEW_NV_register_combiners) CONST_CAST(GLEW_NV_register_combiners) = !_glewInit_GL_NV_register_combiners(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_NV_register_combiners */\r\n#ifdef GL_NV_register_combiners2\r\n  CONST_CAST(GLEW_NV_register_combiners2) = glewGetExtension(\"GL_NV_register_combiners2\");\r\n  if (glewExperimental || GLEW_NV_register_combiners2) CONST_CAST(GLEW_NV_register_combiners2) = !_glewInit_GL_NV_register_combiners2(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_NV_register_combiners2 */\r\n#ifdef GL_NV_shader_buffer_load\r\n  CONST_CAST(GLEW_NV_shader_buffer_load) = glewGetExtension(\"GL_NV_shader_buffer_load\");\r\n  if (glewExperimental || GLEW_NV_shader_buffer_load) CONST_CAST(GLEW_NV_shader_buffer_load) = !_glewInit_GL_NV_shader_buffer_load(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_NV_shader_buffer_load */\r\n#ifdef GL_NV_texgen_emboss\r\n  CONST_CAST(GLEW_NV_texgen_emboss) = glewGetExtension(\"GL_NV_texgen_emboss\");\r\n#endif /* GL_NV_texgen_emboss */\r\n#ifdef GL_NV_texgen_reflection\r\n  CONST_CAST(GLEW_NV_texgen_reflection) = glewGetExtension(\"GL_NV_texgen_reflection\");\r\n#endif /* GL_NV_texgen_reflection */\r\n#ifdef GL_NV_texture_barrier\r\n  CONST_CAST(GLEW_NV_texture_barrier) = glewGetExtension(\"GL_NV_texture_barrier\");\r\n  if (glewExperimental || GLEW_NV_texture_barrier) CONST_CAST(GLEW_NV_texture_barrier) = !_glewInit_GL_NV_texture_barrier(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_NV_texture_barrier */\r\n#ifdef GL_NV_texture_compression_vtc\r\n  CONST_CAST(GLEW_NV_texture_compression_vtc) = glewGetExtension(\"GL_NV_texture_compression_vtc\");\r\n#endif /* GL_NV_texture_compression_vtc */\r\n#ifdef GL_NV_texture_env_combine4\r\n  CONST_CAST(GLEW_NV_texture_env_combine4) = glewGetExtension(\"GL_NV_texture_env_combine4\");\r\n#endif /* GL_NV_texture_env_combine4 */\r\n#ifdef GL_NV_texture_expand_normal\r\n  CONST_CAST(GLEW_NV_texture_expand_normal) = glewGetExtension(\"GL_NV_texture_expand_normal\");\r\n#endif /* GL_NV_texture_expand_normal */\r\n#ifdef GL_NV_texture_rectangle\r\n  CONST_CAST(GLEW_NV_texture_rectangle) = glewGetExtension(\"GL_NV_texture_rectangle\");\r\n#endif /* GL_NV_texture_rectangle */\r\n#ifdef GL_NV_texture_shader\r\n  CONST_CAST(GLEW_NV_texture_shader) = glewGetExtension(\"GL_NV_texture_shader\");\r\n#endif /* GL_NV_texture_shader */\r\n#ifdef GL_NV_texture_shader2\r\n  CONST_CAST(GLEW_NV_texture_shader2) = glewGetExtension(\"GL_NV_texture_shader2\");\r\n#endif /* GL_NV_texture_shader2 */\r\n#ifdef GL_NV_texture_shader3\r\n  CONST_CAST(GLEW_NV_texture_shader3) = glewGetExtension(\"GL_NV_texture_shader3\");\r\n#endif /* GL_NV_texture_shader3 */\r\n#ifdef GL_NV_transform_feedback\r\n  CONST_CAST(GLEW_NV_transform_feedback) = glewGetExtension(\"GL_NV_transform_feedback\");\r\n  if (glewExperimental || GLEW_NV_transform_feedback) CONST_CAST(GLEW_NV_transform_feedback) = !_glewInit_GL_NV_transform_feedback(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_NV_transform_feedback */\r\n#ifdef GL_NV_transform_feedback2\r\n  CONST_CAST(GLEW_NV_transform_feedback2) = glewGetExtension(\"GL_NV_transform_feedback2\");\r\n  if (glewExperimental || GLEW_NV_transform_feedback2) CONST_CAST(GLEW_NV_transform_feedback2) = !_glewInit_GL_NV_transform_feedback2(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_NV_transform_feedback2 */\r\n#ifdef GL_NV_vertex_array_range\r\n  CONST_CAST(GLEW_NV_vertex_array_range) = glewGetExtension(\"GL_NV_vertex_array_range\");\r\n  if (glewExperimental || GLEW_NV_vertex_array_range) CONST_CAST(GLEW_NV_vertex_array_range) = !_glewInit_GL_NV_vertex_array_range(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_NV_vertex_array_range */\r\n#ifdef GL_NV_vertex_array_range2\r\n  CONST_CAST(GLEW_NV_vertex_array_range2) = glewGetExtension(\"GL_NV_vertex_array_range2\");\r\n#endif /* GL_NV_vertex_array_range2 */\r\n#ifdef GL_NV_vertex_buffer_unified_memory\r\n  CONST_CAST(GLEW_NV_vertex_buffer_unified_memory) = glewGetExtension(\"GL_NV_vertex_buffer_unified_memory\");\r\n  if (glewExperimental || GLEW_NV_vertex_buffer_unified_memory) CONST_CAST(GLEW_NV_vertex_buffer_unified_memory) = !_glewInit_GL_NV_vertex_buffer_unified_memory(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_NV_vertex_buffer_unified_memory */\r\n#ifdef GL_NV_vertex_program\r\n  CONST_CAST(GLEW_NV_vertex_program) = glewGetExtension(\"GL_NV_vertex_program\");\r\n  if (glewExperimental || GLEW_NV_vertex_program) CONST_CAST(GLEW_NV_vertex_program) = !_glewInit_GL_NV_vertex_program(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_NV_vertex_program */\r\n#ifdef GL_NV_vertex_program1_1\r\n  CONST_CAST(GLEW_NV_vertex_program1_1) = glewGetExtension(\"GL_NV_vertex_program1_1\");\r\n#endif /* GL_NV_vertex_program1_1 */\r\n#ifdef GL_NV_vertex_program2\r\n  CONST_CAST(GLEW_NV_vertex_program2) = glewGetExtension(\"GL_NV_vertex_program2\");\r\n#endif /* GL_NV_vertex_program2 */\r\n#ifdef GL_NV_vertex_program2_option\r\n  CONST_CAST(GLEW_NV_vertex_program2_option) = glewGetExtension(\"GL_NV_vertex_program2_option\");\r\n#endif /* GL_NV_vertex_program2_option */\r\n#ifdef GL_NV_vertex_program3\r\n  CONST_CAST(GLEW_NV_vertex_program3) = glewGetExtension(\"GL_NV_vertex_program3\");\r\n#endif /* GL_NV_vertex_program3 */\r\n#ifdef GL_NV_vertex_program4\r\n  CONST_CAST(GLEW_NV_vertex_program4) = glewGetExtension(\"GL_NV_vertex_program4\");\r\n#endif /* GL_NV_vertex_program4 */\r\n#ifdef GL_OES_byte_coordinates\r\n  CONST_CAST(GLEW_OES_byte_coordinates) = glewGetExtension(\"GL_OES_byte_coordinates\");\r\n#endif /* GL_OES_byte_coordinates */\r\n#ifdef GL_OES_compressed_paletted_texture\r\n  CONST_CAST(GLEW_OES_compressed_paletted_texture) = glewGetExtension(\"GL_OES_compressed_paletted_texture\");\r\n#endif /* GL_OES_compressed_paletted_texture */\r\n#ifdef GL_OES_read_format\r\n  CONST_CAST(GLEW_OES_read_format) = glewGetExtension(\"GL_OES_read_format\");\r\n#endif /* GL_OES_read_format */\r\n#ifdef GL_OES_single_precision\r\n  CONST_CAST(GLEW_OES_single_precision) = glewGetExtension(\"GL_OES_single_precision\");\r\n  if (glewExperimental || GLEW_OES_single_precision) CONST_CAST(GLEW_OES_single_precision) = !_glewInit_GL_OES_single_precision(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_OES_single_precision */\r\n#ifdef GL_OML_interlace\r\n  CONST_CAST(GLEW_OML_interlace) = glewGetExtension(\"GL_OML_interlace\");\r\n#endif /* GL_OML_interlace */\r\n#ifdef GL_OML_resample\r\n  CONST_CAST(GLEW_OML_resample) = glewGetExtension(\"GL_OML_resample\");\r\n#endif /* GL_OML_resample */\r\n#ifdef GL_OML_subsample\r\n  CONST_CAST(GLEW_OML_subsample) = glewGetExtension(\"GL_OML_subsample\");\r\n#endif /* GL_OML_subsample */\r\n#ifdef GL_PGI_misc_hints\r\n  CONST_CAST(GLEW_PGI_misc_hints) = glewGetExtension(\"GL_PGI_misc_hints\");\r\n#endif /* GL_PGI_misc_hints */\r\n#ifdef GL_PGI_vertex_hints\r\n  CONST_CAST(GLEW_PGI_vertex_hints) = glewGetExtension(\"GL_PGI_vertex_hints\");\r\n#endif /* GL_PGI_vertex_hints */\r\n#ifdef GL_REND_screen_coordinates\r\n  CONST_CAST(GLEW_REND_screen_coordinates) = glewGetExtension(\"GL_REND_screen_coordinates\");\r\n#endif /* GL_REND_screen_coordinates */\r\n#ifdef GL_S3_s3tc\r\n  CONST_CAST(GLEW_S3_s3tc) = glewGetExtension(\"GL_S3_s3tc\");\r\n#endif /* GL_S3_s3tc */\r\n#ifdef GL_SGIS_color_range\r\n  CONST_CAST(GLEW_SGIS_color_range) = glewGetExtension(\"GL_SGIS_color_range\");\r\n#endif /* GL_SGIS_color_range */\r\n#ifdef GL_SGIS_detail_texture\r\n  CONST_CAST(GLEW_SGIS_detail_texture) = glewGetExtension(\"GL_SGIS_detail_texture\");\r\n  if (glewExperimental || GLEW_SGIS_detail_texture) CONST_CAST(GLEW_SGIS_detail_texture) = !_glewInit_GL_SGIS_detail_texture(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_SGIS_detail_texture */\r\n#ifdef GL_SGIS_fog_function\r\n  CONST_CAST(GLEW_SGIS_fog_function) = glewGetExtension(\"GL_SGIS_fog_function\");\r\n  if (glewExperimental || GLEW_SGIS_fog_function) CONST_CAST(GLEW_SGIS_fog_function) = !_glewInit_GL_SGIS_fog_function(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_SGIS_fog_function */\r\n#ifdef GL_SGIS_generate_mipmap\r\n  CONST_CAST(GLEW_SGIS_generate_mipmap) = glewGetExtension(\"GL_SGIS_generate_mipmap\");\r\n#endif /* GL_SGIS_generate_mipmap */\r\n#ifdef GL_SGIS_multisample\r\n  CONST_CAST(GLEW_SGIS_multisample) = glewGetExtension(\"GL_SGIS_multisample\");\r\n  if (glewExperimental || GLEW_SGIS_multisample) CONST_CAST(GLEW_SGIS_multisample) = !_glewInit_GL_SGIS_multisample(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_SGIS_multisample */\r\n#ifdef GL_SGIS_pixel_texture\r\n  CONST_CAST(GLEW_SGIS_pixel_texture) = glewGetExtension(\"GL_SGIS_pixel_texture\");\r\n#endif /* GL_SGIS_pixel_texture */\r\n#ifdef GL_SGIS_point_line_texgen\r\n  CONST_CAST(GLEW_SGIS_point_line_texgen) = glewGetExtension(\"GL_SGIS_point_line_texgen\");\r\n#endif /* GL_SGIS_point_line_texgen */\r\n#ifdef GL_SGIS_sharpen_texture\r\n  CONST_CAST(GLEW_SGIS_sharpen_texture) = glewGetExtension(\"GL_SGIS_sharpen_texture\");\r\n  if (glewExperimental || GLEW_SGIS_sharpen_texture) CONST_CAST(GLEW_SGIS_sharpen_texture) = !_glewInit_GL_SGIS_sharpen_texture(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_SGIS_sharpen_texture */\r\n#ifdef GL_SGIS_texture4D\r\n  CONST_CAST(GLEW_SGIS_texture4D) = glewGetExtension(\"GL_SGIS_texture4D\");\r\n  if (glewExperimental || GLEW_SGIS_texture4D) CONST_CAST(GLEW_SGIS_texture4D) = !_glewInit_GL_SGIS_texture4D(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_SGIS_texture4D */\r\n#ifdef GL_SGIS_texture_border_clamp\r\n  CONST_CAST(GLEW_SGIS_texture_border_clamp) = glewGetExtension(\"GL_SGIS_texture_border_clamp\");\r\n#endif /* GL_SGIS_texture_border_clamp */\r\n#ifdef GL_SGIS_texture_edge_clamp\r\n  CONST_CAST(GLEW_SGIS_texture_edge_clamp) = glewGetExtension(\"GL_SGIS_texture_edge_clamp\");\r\n#endif /* GL_SGIS_texture_edge_clamp */\r\n#ifdef GL_SGIS_texture_filter4\r\n  CONST_CAST(GLEW_SGIS_texture_filter4) = glewGetExtension(\"GL_SGIS_texture_filter4\");\r\n  if (glewExperimental || GLEW_SGIS_texture_filter4) CONST_CAST(GLEW_SGIS_texture_filter4) = !_glewInit_GL_SGIS_texture_filter4(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_SGIS_texture_filter4 */\r\n#ifdef GL_SGIS_texture_lod\r\n  CONST_CAST(GLEW_SGIS_texture_lod) = glewGetExtension(\"GL_SGIS_texture_lod\");\r\n#endif /* GL_SGIS_texture_lod */\r\n#ifdef GL_SGIS_texture_select\r\n  CONST_CAST(GLEW_SGIS_texture_select) = glewGetExtension(\"GL_SGIS_texture_select\");\r\n#endif /* GL_SGIS_texture_select */\r\n#ifdef GL_SGIX_async\r\n  CONST_CAST(GLEW_SGIX_async) = glewGetExtension(\"GL_SGIX_async\");\r\n  if (glewExperimental || GLEW_SGIX_async) CONST_CAST(GLEW_SGIX_async) = !_glewInit_GL_SGIX_async(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_SGIX_async */\r\n#ifdef GL_SGIX_async_histogram\r\n  CONST_CAST(GLEW_SGIX_async_histogram) = glewGetExtension(\"GL_SGIX_async_histogram\");\r\n#endif /* GL_SGIX_async_histogram */\r\n#ifdef GL_SGIX_async_pixel\r\n  CONST_CAST(GLEW_SGIX_async_pixel) = glewGetExtension(\"GL_SGIX_async_pixel\");\r\n#endif /* GL_SGIX_async_pixel */\r\n#ifdef GL_SGIX_blend_alpha_minmax\r\n  CONST_CAST(GLEW_SGIX_blend_alpha_minmax) = glewGetExtension(\"GL_SGIX_blend_alpha_minmax\");\r\n#endif /* GL_SGIX_blend_alpha_minmax */\r\n#ifdef GL_SGIX_clipmap\r\n  CONST_CAST(GLEW_SGIX_clipmap) = glewGetExtension(\"GL_SGIX_clipmap\");\r\n#endif /* GL_SGIX_clipmap */\r\n#ifdef GL_SGIX_convolution_accuracy\r\n  CONST_CAST(GLEW_SGIX_convolution_accuracy) = glewGetExtension(\"GL_SGIX_convolution_accuracy\");\r\n#endif /* GL_SGIX_convolution_accuracy */\r\n#ifdef GL_SGIX_depth_texture\r\n  CONST_CAST(GLEW_SGIX_depth_texture) = glewGetExtension(\"GL_SGIX_depth_texture\");\r\n#endif /* GL_SGIX_depth_texture */\r\n#ifdef GL_SGIX_flush_raster\r\n  CONST_CAST(GLEW_SGIX_flush_raster) = glewGetExtension(\"GL_SGIX_flush_raster\");\r\n  if (glewExperimental || GLEW_SGIX_flush_raster) CONST_CAST(GLEW_SGIX_flush_raster) = !_glewInit_GL_SGIX_flush_raster(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_SGIX_flush_raster */\r\n#ifdef GL_SGIX_fog_offset\r\n  CONST_CAST(GLEW_SGIX_fog_offset) = glewGetExtension(\"GL_SGIX_fog_offset\");\r\n#endif /* GL_SGIX_fog_offset */\r\n#ifdef GL_SGIX_fog_texture\r\n  CONST_CAST(GLEW_SGIX_fog_texture) = glewGetExtension(\"GL_SGIX_fog_texture\");\r\n  if (glewExperimental || GLEW_SGIX_fog_texture) CONST_CAST(GLEW_SGIX_fog_texture) = !_glewInit_GL_SGIX_fog_texture(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_SGIX_fog_texture */\r\n#ifdef GL_SGIX_fragment_specular_lighting\r\n  CONST_CAST(GLEW_SGIX_fragment_specular_lighting) = glewGetExtension(\"GL_SGIX_fragment_specular_lighting\");\r\n  if (glewExperimental || GLEW_SGIX_fragment_specular_lighting) CONST_CAST(GLEW_SGIX_fragment_specular_lighting) = !_glewInit_GL_SGIX_fragment_specular_lighting(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_SGIX_fragment_specular_lighting */\r\n#ifdef GL_SGIX_framezoom\r\n  CONST_CAST(GLEW_SGIX_framezoom) = glewGetExtension(\"GL_SGIX_framezoom\");\r\n  if (glewExperimental || GLEW_SGIX_framezoom) CONST_CAST(GLEW_SGIX_framezoom) = !_glewInit_GL_SGIX_framezoom(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_SGIX_framezoom */\r\n#ifdef GL_SGIX_interlace\r\n  CONST_CAST(GLEW_SGIX_interlace) = glewGetExtension(\"GL_SGIX_interlace\");\r\n#endif /* GL_SGIX_interlace */\r\n#ifdef GL_SGIX_ir_instrument1\r\n  CONST_CAST(GLEW_SGIX_ir_instrument1) = glewGetExtension(\"GL_SGIX_ir_instrument1\");\r\n#endif /* GL_SGIX_ir_instrument1 */\r\n#ifdef GL_SGIX_list_priority\r\n  CONST_CAST(GLEW_SGIX_list_priority) = glewGetExtension(\"GL_SGIX_list_priority\");\r\n#endif /* GL_SGIX_list_priority */\r\n#ifdef GL_SGIX_pixel_texture\r\n  CONST_CAST(GLEW_SGIX_pixel_texture) = glewGetExtension(\"GL_SGIX_pixel_texture\");\r\n  if (glewExperimental || GLEW_SGIX_pixel_texture) CONST_CAST(GLEW_SGIX_pixel_texture) = !_glewInit_GL_SGIX_pixel_texture(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_SGIX_pixel_texture */\r\n#ifdef GL_SGIX_pixel_texture_bits\r\n  CONST_CAST(GLEW_SGIX_pixel_texture_bits) = glewGetExtension(\"GL_SGIX_pixel_texture_bits\");\r\n#endif /* GL_SGIX_pixel_texture_bits */\r\n#ifdef GL_SGIX_reference_plane\r\n  CONST_CAST(GLEW_SGIX_reference_plane) = glewGetExtension(\"GL_SGIX_reference_plane\");\r\n  if (glewExperimental || GLEW_SGIX_reference_plane) CONST_CAST(GLEW_SGIX_reference_plane) = !_glewInit_GL_SGIX_reference_plane(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_SGIX_reference_plane */\r\n#ifdef GL_SGIX_resample\r\n  CONST_CAST(GLEW_SGIX_resample) = glewGetExtension(\"GL_SGIX_resample\");\r\n#endif /* GL_SGIX_resample */\r\n#ifdef GL_SGIX_shadow\r\n  CONST_CAST(GLEW_SGIX_shadow) = glewGetExtension(\"GL_SGIX_shadow\");\r\n#endif /* GL_SGIX_shadow */\r\n#ifdef GL_SGIX_shadow_ambient\r\n  CONST_CAST(GLEW_SGIX_shadow_ambient) = glewGetExtension(\"GL_SGIX_shadow_ambient\");\r\n#endif /* GL_SGIX_shadow_ambient */\r\n#ifdef GL_SGIX_sprite\r\n  CONST_CAST(GLEW_SGIX_sprite) = glewGetExtension(\"GL_SGIX_sprite\");\r\n  if (glewExperimental || GLEW_SGIX_sprite) CONST_CAST(GLEW_SGIX_sprite) = !_glewInit_GL_SGIX_sprite(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_SGIX_sprite */\r\n#ifdef GL_SGIX_tag_sample_buffer\r\n  CONST_CAST(GLEW_SGIX_tag_sample_buffer) = glewGetExtension(\"GL_SGIX_tag_sample_buffer\");\r\n  if (glewExperimental || GLEW_SGIX_tag_sample_buffer) CONST_CAST(GLEW_SGIX_tag_sample_buffer) = !_glewInit_GL_SGIX_tag_sample_buffer(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_SGIX_tag_sample_buffer */\r\n#ifdef GL_SGIX_texture_add_env\r\n  CONST_CAST(GLEW_SGIX_texture_add_env) = glewGetExtension(\"GL_SGIX_texture_add_env\");\r\n#endif /* GL_SGIX_texture_add_env */\r\n#ifdef GL_SGIX_texture_coordinate_clamp\r\n  CONST_CAST(GLEW_SGIX_texture_coordinate_clamp) = glewGetExtension(\"GL_SGIX_texture_coordinate_clamp\");\r\n#endif /* GL_SGIX_texture_coordinate_clamp */\r\n#ifdef GL_SGIX_texture_lod_bias\r\n  CONST_CAST(GLEW_SGIX_texture_lod_bias) = glewGetExtension(\"GL_SGIX_texture_lod_bias\");\r\n#endif /* GL_SGIX_texture_lod_bias */\r\n#ifdef GL_SGIX_texture_multi_buffer\r\n  CONST_CAST(GLEW_SGIX_texture_multi_buffer) = glewGetExtension(\"GL_SGIX_texture_multi_buffer\");\r\n#endif /* GL_SGIX_texture_multi_buffer */\r\n#ifdef GL_SGIX_texture_range\r\n  CONST_CAST(GLEW_SGIX_texture_range) = glewGetExtension(\"GL_SGIX_texture_range\");\r\n#endif /* GL_SGIX_texture_range */\r\n#ifdef GL_SGIX_texture_scale_bias\r\n  CONST_CAST(GLEW_SGIX_texture_scale_bias) = glewGetExtension(\"GL_SGIX_texture_scale_bias\");\r\n#endif /* GL_SGIX_texture_scale_bias */\r\n#ifdef GL_SGIX_vertex_preclip\r\n  CONST_CAST(GLEW_SGIX_vertex_preclip) = glewGetExtension(\"GL_SGIX_vertex_preclip\");\r\n#endif /* GL_SGIX_vertex_preclip */\r\n#ifdef GL_SGIX_vertex_preclip_hint\r\n  CONST_CAST(GLEW_SGIX_vertex_preclip_hint) = glewGetExtension(\"GL_SGIX_vertex_preclip_hint\");\r\n#endif /* GL_SGIX_vertex_preclip_hint */\r\n#ifdef GL_SGIX_ycrcb\r\n  CONST_CAST(GLEW_SGIX_ycrcb) = glewGetExtension(\"GL_SGIX_ycrcb\");\r\n#endif /* GL_SGIX_ycrcb */\r\n#ifdef GL_SGI_color_matrix\r\n  CONST_CAST(GLEW_SGI_color_matrix) = glewGetExtension(\"GL_SGI_color_matrix\");\r\n#endif /* GL_SGI_color_matrix */\r\n#ifdef GL_SGI_color_table\r\n  CONST_CAST(GLEW_SGI_color_table) = glewGetExtension(\"GL_SGI_color_table\");\r\n  if (glewExperimental || GLEW_SGI_color_table) CONST_CAST(GLEW_SGI_color_table) = !_glewInit_GL_SGI_color_table(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_SGI_color_table */\r\n#ifdef GL_SGI_texture_color_table\r\n  CONST_CAST(GLEW_SGI_texture_color_table) = glewGetExtension(\"GL_SGI_texture_color_table\");\r\n#endif /* GL_SGI_texture_color_table */\r\n#ifdef GL_SUNX_constant_data\r\n  CONST_CAST(GLEW_SUNX_constant_data) = glewGetExtension(\"GL_SUNX_constant_data\");\r\n  if (glewExperimental || GLEW_SUNX_constant_data) CONST_CAST(GLEW_SUNX_constant_data) = !_glewInit_GL_SUNX_constant_data(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_SUNX_constant_data */\r\n#ifdef GL_SUN_convolution_border_modes\r\n  CONST_CAST(GLEW_SUN_convolution_border_modes) = glewGetExtension(\"GL_SUN_convolution_border_modes\");\r\n#endif /* GL_SUN_convolution_border_modes */\r\n#ifdef GL_SUN_global_alpha\r\n  CONST_CAST(GLEW_SUN_global_alpha) = glewGetExtension(\"GL_SUN_global_alpha\");\r\n  if (glewExperimental || GLEW_SUN_global_alpha) CONST_CAST(GLEW_SUN_global_alpha) = !_glewInit_GL_SUN_global_alpha(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_SUN_global_alpha */\r\n#ifdef GL_SUN_mesh_array\r\n  CONST_CAST(GLEW_SUN_mesh_array) = glewGetExtension(\"GL_SUN_mesh_array\");\r\n#endif /* GL_SUN_mesh_array */\r\n#ifdef GL_SUN_read_video_pixels\r\n  CONST_CAST(GLEW_SUN_read_video_pixels) = glewGetExtension(\"GL_SUN_read_video_pixels\");\r\n  if (glewExperimental || GLEW_SUN_read_video_pixels) CONST_CAST(GLEW_SUN_read_video_pixels) = !_glewInit_GL_SUN_read_video_pixels(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_SUN_read_video_pixels */\r\n#ifdef GL_SUN_slice_accum\r\n  CONST_CAST(GLEW_SUN_slice_accum) = glewGetExtension(\"GL_SUN_slice_accum\");\r\n#endif /* GL_SUN_slice_accum */\r\n#ifdef GL_SUN_triangle_list\r\n  CONST_CAST(GLEW_SUN_triangle_list) = glewGetExtension(\"GL_SUN_triangle_list\");\r\n  if (glewExperimental || GLEW_SUN_triangle_list) CONST_CAST(GLEW_SUN_triangle_list) = !_glewInit_GL_SUN_triangle_list(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_SUN_triangle_list */\r\n#ifdef GL_SUN_vertex\r\n  CONST_CAST(GLEW_SUN_vertex) = glewGetExtension(\"GL_SUN_vertex\");\r\n  if (glewExperimental || GLEW_SUN_vertex) CONST_CAST(GLEW_SUN_vertex) = !_glewInit_GL_SUN_vertex(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_SUN_vertex */\r\n#ifdef GL_WIN_phong_shading\r\n  CONST_CAST(GLEW_WIN_phong_shading) = glewGetExtension(\"GL_WIN_phong_shading\");\r\n#endif /* GL_WIN_phong_shading */\r\n#ifdef GL_WIN_specular_fog\r\n  CONST_CAST(GLEW_WIN_specular_fog) = glewGetExtension(\"GL_WIN_specular_fog\");\r\n#endif /* GL_WIN_specular_fog */\r\n#ifdef GL_WIN_swap_hint\r\n  CONST_CAST(GLEW_WIN_swap_hint) = glewGetExtension(\"GL_WIN_swap_hint\");\r\n  if (glewExperimental || GLEW_WIN_swap_hint) CONST_CAST(GLEW_WIN_swap_hint) = !_glewInit_GL_WIN_swap_hint(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GL_WIN_swap_hint */\r\n\r\n  return GLEW_OK;\r\n}\r\n\r\n\r\n#if defined(_WIN32)\r\n\r\n#if !defined(GLEW_MX)\r\n\r\nPFNWGLSETSTEREOEMITTERSTATE3DLPROC __wglewSetStereoEmitterState3DL = NULL;\r\n\r\nPFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC __wglewBlitContextFramebufferAMD = NULL;\r\nPFNWGLCREATEASSOCIATEDCONTEXTAMDPROC __wglewCreateAssociatedContextAMD = NULL;\r\nPFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __wglewCreateAssociatedContextAttribsAMD = NULL;\r\nPFNWGLDELETEASSOCIATEDCONTEXTAMDPROC __wglewDeleteAssociatedContextAMD = NULL;\r\nPFNWGLGETCONTEXTGPUIDAMDPROC __wglewGetContextGPUIDAMD = NULL;\r\nPFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC __wglewGetCurrentAssociatedContextAMD = NULL;\r\nPFNWGLGETGPUIDSAMDPROC __wglewGetGPUIDsAMD = NULL;\r\nPFNWGLGETGPUINFOAMDPROC __wglewGetGPUInfoAMD = NULL;\r\nPFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __wglewMakeAssociatedContextCurrentAMD = NULL;\r\n\r\nPFNWGLCREATEBUFFERREGIONARBPROC __wglewCreateBufferRegionARB = NULL;\r\nPFNWGLDELETEBUFFERREGIONARBPROC __wglewDeleteBufferRegionARB = NULL;\r\nPFNWGLRESTOREBUFFERREGIONARBPROC __wglewRestoreBufferRegionARB = NULL;\r\nPFNWGLSAVEBUFFERREGIONARBPROC __wglewSaveBufferRegionARB = NULL;\r\n\r\nPFNWGLCREATECONTEXTATTRIBSARBPROC __wglewCreateContextAttribsARB = NULL;\r\n\r\nPFNWGLGETEXTENSIONSSTRINGARBPROC __wglewGetExtensionsStringARB = NULL;\r\n\r\nPFNWGLGETCURRENTREADDCARBPROC __wglewGetCurrentReadDCARB = NULL;\r\nPFNWGLMAKECONTEXTCURRENTARBPROC __wglewMakeContextCurrentARB = NULL;\r\n\r\nPFNWGLCREATEPBUFFERARBPROC __wglewCreatePbufferARB = NULL;\r\nPFNWGLDESTROYPBUFFERARBPROC __wglewDestroyPbufferARB = NULL;\r\nPFNWGLGETPBUFFERDCARBPROC __wglewGetPbufferDCARB = NULL;\r\nPFNWGLQUERYPBUFFERARBPROC __wglewQueryPbufferARB = NULL;\r\nPFNWGLRELEASEPBUFFERDCARBPROC __wglewReleasePbufferDCARB = NULL;\r\n\r\nPFNWGLCHOOSEPIXELFORMATARBPROC __wglewChoosePixelFormatARB = NULL;\r\nPFNWGLGETPIXELFORMATATTRIBFVARBPROC __wglewGetPixelFormatAttribfvARB = NULL;\r\nPFNWGLGETPIXELFORMATATTRIBIVARBPROC __wglewGetPixelFormatAttribivARB = NULL;\r\n\r\nPFNWGLBINDTEXIMAGEARBPROC __wglewBindTexImageARB = NULL;\r\nPFNWGLRELEASETEXIMAGEARBPROC __wglewReleaseTexImageARB = NULL;\r\nPFNWGLSETPBUFFERATTRIBARBPROC __wglewSetPbufferAttribARB = NULL;\r\n\r\nPFNWGLBINDDISPLAYCOLORTABLEEXTPROC __wglewBindDisplayColorTableEXT = NULL;\r\nPFNWGLCREATEDISPLAYCOLORTABLEEXTPROC __wglewCreateDisplayColorTableEXT = NULL;\r\nPFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC __wglewDestroyDisplayColorTableEXT = NULL;\r\nPFNWGLLOADDISPLAYCOLORTABLEEXTPROC __wglewLoadDisplayColorTableEXT = NULL;\r\n\r\nPFNWGLGETEXTENSIONSSTRINGEXTPROC __wglewGetExtensionsStringEXT = NULL;\r\n\r\nPFNWGLGETCURRENTREADDCEXTPROC __wglewGetCurrentReadDCEXT = NULL;\r\nPFNWGLMAKECONTEXTCURRENTEXTPROC __wglewMakeContextCurrentEXT = NULL;\r\n\r\nPFNWGLCREATEPBUFFEREXTPROC __wglewCreatePbufferEXT = NULL;\r\nPFNWGLDESTROYPBUFFEREXTPROC __wglewDestroyPbufferEXT = NULL;\r\nPFNWGLGETPBUFFERDCEXTPROC __wglewGetPbufferDCEXT = NULL;\r\nPFNWGLQUERYPBUFFEREXTPROC __wglewQueryPbufferEXT = NULL;\r\nPFNWGLRELEASEPBUFFERDCEXTPROC __wglewReleasePbufferDCEXT = NULL;\r\n\r\nPFNWGLCHOOSEPIXELFORMATEXTPROC __wglewChoosePixelFormatEXT = NULL;\r\nPFNWGLGETPIXELFORMATATTRIBFVEXTPROC __wglewGetPixelFormatAttribfvEXT = NULL;\r\nPFNWGLGETPIXELFORMATATTRIBIVEXTPROC __wglewGetPixelFormatAttribivEXT = NULL;\r\n\r\nPFNWGLGETSWAPINTERVALEXTPROC __wglewGetSwapIntervalEXT = NULL;\r\nPFNWGLSWAPINTERVALEXTPROC __wglewSwapIntervalEXT = NULL;\r\n\r\nPFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC __wglewGetDigitalVideoParametersI3D = NULL;\r\nPFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC __wglewSetDigitalVideoParametersI3D = NULL;\r\n\r\nPFNWGLGETGAMMATABLEI3DPROC __wglewGetGammaTableI3D = NULL;\r\nPFNWGLGETGAMMATABLEPARAMETERSI3DPROC __wglewGetGammaTableParametersI3D = NULL;\r\nPFNWGLSETGAMMATABLEI3DPROC __wglewSetGammaTableI3D = NULL;\r\nPFNWGLSETGAMMATABLEPARAMETERSI3DPROC __wglewSetGammaTableParametersI3D = NULL;\r\n\r\nPFNWGLDISABLEGENLOCKI3DPROC __wglewDisableGenlockI3D = NULL;\r\nPFNWGLENABLEGENLOCKI3DPROC __wglewEnableGenlockI3D = NULL;\r\nPFNWGLGENLOCKSAMPLERATEI3DPROC __wglewGenlockSampleRateI3D = NULL;\r\nPFNWGLGENLOCKSOURCEDELAYI3DPROC __wglewGenlockSourceDelayI3D = NULL;\r\nPFNWGLGENLOCKSOURCEEDGEI3DPROC __wglewGenlockSourceEdgeI3D = NULL;\r\nPFNWGLGENLOCKSOURCEI3DPROC __wglewGenlockSourceI3D = NULL;\r\nPFNWGLGETGENLOCKSAMPLERATEI3DPROC __wglewGetGenlockSampleRateI3D = NULL;\r\nPFNWGLGETGENLOCKSOURCEDELAYI3DPROC __wglewGetGenlockSourceDelayI3D = NULL;\r\nPFNWGLGETGENLOCKSOURCEEDGEI3DPROC __wglewGetGenlockSourceEdgeI3D = NULL;\r\nPFNWGLGETGENLOCKSOURCEI3DPROC __wglewGetGenlockSourceI3D = NULL;\r\nPFNWGLISENABLEDGENLOCKI3DPROC __wglewIsEnabledGenlockI3D = NULL;\r\nPFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC __wglewQueryGenlockMaxSourceDelayI3D = NULL;\r\n\r\nPFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC __wglewAssociateImageBufferEventsI3D = NULL;\r\nPFNWGLCREATEIMAGEBUFFERI3DPROC __wglewCreateImageBufferI3D = NULL;\r\nPFNWGLDESTROYIMAGEBUFFERI3DPROC __wglewDestroyImageBufferI3D = NULL;\r\nPFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC __wglewReleaseImageBufferEventsI3D = NULL;\r\n\r\nPFNWGLDISABLEFRAMELOCKI3DPROC __wglewDisableFrameLockI3D = NULL;\r\nPFNWGLENABLEFRAMELOCKI3DPROC __wglewEnableFrameLockI3D = NULL;\r\nPFNWGLISENABLEDFRAMELOCKI3DPROC __wglewIsEnabledFrameLockI3D = NULL;\r\nPFNWGLQUERYFRAMELOCKMASTERI3DPROC __wglewQueryFrameLockMasterI3D = NULL;\r\n\r\nPFNWGLBEGINFRAMETRACKINGI3DPROC __wglewBeginFrameTrackingI3D = NULL;\r\nPFNWGLENDFRAMETRACKINGI3DPROC __wglewEndFrameTrackingI3D = NULL;\r\nPFNWGLGETFRAMEUSAGEI3DPROC __wglewGetFrameUsageI3D = NULL;\r\nPFNWGLQUERYFRAMETRACKINGI3DPROC __wglewQueryFrameTrackingI3D = NULL;\r\n\r\nPFNWGLCOPYIMAGESUBDATANVPROC __wglewCopyImageSubDataNV = NULL;\r\n\r\nPFNWGLCREATEAFFINITYDCNVPROC __wglewCreateAffinityDCNV = NULL;\r\nPFNWGLDELETEDCNVPROC __wglewDeleteDCNV = NULL;\r\nPFNWGLENUMGPUDEVICESNVPROC __wglewEnumGpuDevicesNV = NULL;\r\nPFNWGLENUMGPUSFROMAFFINITYDCNVPROC __wglewEnumGpusFromAffinityDCNV = NULL;\r\nPFNWGLENUMGPUSNVPROC __wglewEnumGpusNV = NULL;\r\n\r\nPFNWGLBINDVIDEODEVICENVPROC __wglewBindVideoDeviceNV = NULL;\r\nPFNWGLENUMERATEVIDEODEVICESNVPROC __wglewEnumerateVideoDevicesNV = NULL;\r\nPFNWGLQUERYCURRENTCONTEXTNVPROC __wglewQueryCurrentContextNV = NULL;\r\n\r\nPFNWGLBINDSWAPBARRIERNVPROC __wglewBindSwapBarrierNV = NULL;\r\nPFNWGLJOINSWAPGROUPNVPROC __wglewJoinSwapGroupNV = NULL;\r\nPFNWGLQUERYFRAMECOUNTNVPROC __wglewQueryFrameCountNV = NULL;\r\nPFNWGLQUERYMAXSWAPGROUPSNVPROC __wglewQueryMaxSwapGroupsNV = NULL;\r\nPFNWGLQUERYSWAPGROUPNVPROC __wglewQuerySwapGroupNV = NULL;\r\nPFNWGLRESETFRAMECOUNTNVPROC __wglewResetFrameCountNV = NULL;\r\n\r\nPFNWGLALLOCATEMEMORYNVPROC __wglewAllocateMemoryNV = NULL;\r\nPFNWGLFREEMEMORYNVPROC __wglewFreeMemoryNV = NULL;\r\n\r\nPFNWGLBINDVIDEOIMAGENVPROC __wglewBindVideoImageNV = NULL;\r\nPFNWGLGETVIDEODEVICENVPROC __wglewGetVideoDeviceNV = NULL;\r\nPFNWGLGETVIDEOINFONVPROC __wglewGetVideoInfoNV = NULL;\r\nPFNWGLRELEASEVIDEODEVICENVPROC __wglewReleaseVideoDeviceNV = NULL;\r\nPFNWGLRELEASEVIDEOIMAGENVPROC __wglewReleaseVideoImageNV = NULL;\r\nPFNWGLSENDPBUFFERTOVIDEONVPROC __wglewSendPbufferToVideoNV = NULL;\r\n\r\nPFNWGLGETMSCRATEOMLPROC __wglewGetMscRateOML = NULL;\r\nPFNWGLGETSYNCVALUESOMLPROC __wglewGetSyncValuesOML = NULL;\r\nPFNWGLSWAPBUFFERSMSCOMLPROC __wglewSwapBuffersMscOML = NULL;\r\nPFNWGLSWAPLAYERBUFFERSMSCOMLPROC __wglewSwapLayerBuffersMscOML = NULL;\r\nPFNWGLWAITFORMSCOMLPROC __wglewWaitForMscOML = NULL;\r\nPFNWGLWAITFORSBCOMLPROC __wglewWaitForSbcOML = NULL;\r\nGLboolean __WGLEW_3DFX_multisample = GL_FALSE;\r\nGLboolean __WGLEW_3DL_stereo_control = GL_FALSE;\r\nGLboolean __WGLEW_AMD_gpu_association = GL_FALSE;\r\nGLboolean __WGLEW_ARB_buffer_region = GL_FALSE;\r\nGLboolean __WGLEW_ARB_create_context = GL_FALSE;\r\nGLboolean __WGLEW_ARB_create_context_profile = GL_FALSE;\r\nGLboolean __WGLEW_ARB_extensions_string = GL_FALSE;\r\nGLboolean __WGLEW_ARB_framebuffer_sRGB = GL_FALSE;\r\nGLboolean __WGLEW_ARB_make_current_read = GL_FALSE;\r\nGLboolean __WGLEW_ARB_multisample = GL_FALSE;\r\nGLboolean __WGLEW_ARB_pbuffer = GL_FALSE;\r\nGLboolean __WGLEW_ARB_pixel_format = GL_FALSE;\r\nGLboolean __WGLEW_ARB_pixel_format_float = GL_FALSE;\r\nGLboolean __WGLEW_ARB_render_texture = GL_FALSE;\r\nGLboolean __WGLEW_ATI_pixel_format_float = GL_FALSE;\r\nGLboolean __WGLEW_ATI_render_texture_rectangle = GL_FALSE;\r\nGLboolean __WGLEW_EXT_depth_float = GL_FALSE;\r\nGLboolean __WGLEW_EXT_display_color_table = GL_FALSE;\r\nGLboolean __WGLEW_EXT_extensions_string = GL_FALSE;\r\nGLboolean __WGLEW_EXT_framebuffer_sRGB = GL_FALSE;\r\nGLboolean __WGLEW_EXT_make_current_read = GL_FALSE;\r\nGLboolean __WGLEW_EXT_multisample = GL_FALSE;\r\nGLboolean __WGLEW_EXT_pbuffer = GL_FALSE;\r\nGLboolean __WGLEW_EXT_pixel_format = GL_FALSE;\r\nGLboolean __WGLEW_EXT_pixel_format_packed_float = GL_FALSE;\r\nGLboolean __WGLEW_EXT_swap_control = GL_FALSE;\r\nGLboolean __WGLEW_I3D_digital_video_control = GL_FALSE;\r\nGLboolean __WGLEW_I3D_gamma = GL_FALSE;\r\nGLboolean __WGLEW_I3D_genlock = GL_FALSE;\r\nGLboolean __WGLEW_I3D_image_buffer = GL_FALSE;\r\nGLboolean __WGLEW_I3D_swap_frame_lock = GL_FALSE;\r\nGLboolean __WGLEW_I3D_swap_frame_usage = GL_FALSE;\r\nGLboolean __WGLEW_NV_copy_image = GL_FALSE;\r\nGLboolean __WGLEW_NV_float_buffer = GL_FALSE;\r\nGLboolean __WGLEW_NV_gpu_affinity = GL_FALSE;\r\nGLboolean __WGLEW_NV_present_video = GL_FALSE;\r\nGLboolean __WGLEW_NV_render_depth_texture = GL_FALSE;\r\nGLboolean __WGLEW_NV_render_texture_rectangle = GL_FALSE;\r\nGLboolean __WGLEW_NV_swap_group = GL_FALSE;\r\nGLboolean __WGLEW_NV_vertex_array_range = GL_FALSE;\r\nGLboolean __WGLEW_NV_video_output = GL_FALSE;\r\nGLboolean __WGLEW_OML_sync_control = GL_FALSE;\r\n\r\n#endif /* !GLEW_MX */\r\n\r\n#ifdef WGL_3DFX_multisample\r\n\r\n#endif /* WGL_3DFX_multisample */\r\n\r\n#ifdef WGL_3DL_stereo_control\r\n\r\nstatic GLboolean _glewInit_WGL_3DL_stereo_control (WGLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((wglSetStereoEmitterState3DL = (PFNWGLSETSTEREOEMITTERSTATE3DLPROC)glewGetProcAddress((const GLubyte*)\"wglSetStereoEmitterState3DL\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* WGL_3DL_stereo_control */\r\n\r\n#ifdef WGL_AMD_gpu_association\r\n\r\nstatic GLboolean _glewInit_WGL_AMD_gpu_association (WGLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((wglBlitContextFramebufferAMD = (PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC)glewGetProcAddress((const GLubyte*)\"wglBlitContextFramebufferAMD\")) == NULL) || r;\r\n  r = ((wglCreateAssociatedContextAMD = (PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)\"wglCreateAssociatedContextAMD\")) == NULL) || r;\r\n  r = ((wglCreateAssociatedContextAttribsAMD = (PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC)glewGetProcAddress((const GLubyte*)\"wglCreateAssociatedContextAttribsAMD\")) == NULL) || r;\r\n  r = ((wglDeleteAssociatedContextAMD = (PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)\"wglDeleteAssociatedContextAMD\")) == NULL) || r;\r\n  r = ((wglGetContextGPUIDAMD = (PFNWGLGETCONTEXTGPUIDAMDPROC)glewGetProcAddress((const GLubyte*)\"wglGetContextGPUIDAMD\")) == NULL) || r;\r\n  r = ((wglGetCurrentAssociatedContextAMD = (PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)\"wglGetCurrentAssociatedContextAMD\")) == NULL) || r;\r\n  r = ((wglGetGPUIDsAMD = (PFNWGLGETGPUIDSAMDPROC)glewGetProcAddress((const GLubyte*)\"wglGetGPUIDsAMD\")) == NULL) || r;\r\n  r = ((wglGetGPUInfoAMD = (PFNWGLGETGPUINFOAMDPROC)glewGetProcAddress((const GLubyte*)\"wglGetGPUInfoAMD\")) == NULL) || r;\r\n  r = ((wglMakeAssociatedContextCurrentAMD = (PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC)glewGetProcAddress((const GLubyte*)\"wglMakeAssociatedContextCurrentAMD\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* WGL_AMD_gpu_association */\r\n\r\n#ifdef WGL_ARB_buffer_region\r\n\r\nstatic GLboolean _glewInit_WGL_ARB_buffer_region (WGLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((wglCreateBufferRegionARB = (PFNWGLCREATEBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)\"wglCreateBufferRegionARB\")) == NULL) || r;\r\n  r = ((wglDeleteBufferRegionARB = (PFNWGLDELETEBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)\"wglDeleteBufferRegionARB\")) == NULL) || r;\r\n  r = ((wglRestoreBufferRegionARB = (PFNWGLRESTOREBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)\"wglRestoreBufferRegionARB\")) == NULL) || r;\r\n  r = ((wglSaveBufferRegionARB = (PFNWGLSAVEBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)\"wglSaveBufferRegionARB\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* WGL_ARB_buffer_region */\r\n\r\n#ifdef WGL_ARB_create_context\r\n\r\nstatic GLboolean _glewInit_WGL_ARB_create_context (WGLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)glewGetProcAddress((const GLubyte*)\"wglCreateContextAttribsARB\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* WGL_ARB_create_context */\r\n\r\n#ifdef WGL_ARB_create_context_profile\r\n\r\n#endif /* WGL_ARB_create_context_profile */\r\n\r\n#ifdef WGL_ARB_extensions_string\r\n\r\nstatic GLboolean _glewInit_WGL_ARB_extensions_string (WGLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)glewGetProcAddress((const GLubyte*)\"wglGetExtensionsStringARB\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* WGL_ARB_extensions_string */\r\n\r\n#ifdef WGL_ARB_framebuffer_sRGB\r\n\r\n#endif /* WGL_ARB_framebuffer_sRGB */\r\n\r\n#ifdef WGL_ARB_make_current_read\r\n\r\nstatic GLboolean _glewInit_WGL_ARB_make_current_read (WGLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((wglGetCurrentReadDCARB = (PFNWGLGETCURRENTREADDCARBPROC)glewGetProcAddress((const GLubyte*)\"wglGetCurrentReadDCARB\")) == NULL) || r;\r\n  r = ((wglMakeContextCurrentARB = (PFNWGLMAKECONTEXTCURRENTARBPROC)glewGetProcAddress((const GLubyte*)\"wglMakeContextCurrentARB\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* WGL_ARB_make_current_read */\r\n\r\n#ifdef WGL_ARB_multisample\r\n\r\n#endif /* WGL_ARB_multisample */\r\n\r\n#ifdef WGL_ARB_pbuffer\r\n\r\nstatic GLboolean _glewInit_WGL_ARB_pbuffer (WGLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((wglCreatePbufferARB = (PFNWGLCREATEPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)\"wglCreatePbufferARB\")) == NULL) || r;\r\n  r = ((wglDestroyPbufferARB = (PFNWGLDESTROYPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)\"wglDestroyPbufferARB\")) == NULL) || r;\r\n  r = ((wglGetPbufferDCARB = (PFNWGLGETPBUFFERDCARBPROC)glewGetProcAddress((const GLubyte*)\"wglGetPbufferDCARB\")) == NULL) || r;\r\n  r = ((wglQueryPbufferARB = (PFNWGLQUERYPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)\"wglQueryPbufferARB\")) == NULL) || r;\r\n  r = ((wglReleasePbufferDCARB = (PFNWGLRELEASEPBUFFERDCARBPROC)glewGetProcAddress((const GLubyte*)\"wglReleasePbufferDCARB\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* WGL_ARB_pbuffer */\r\n\r\n#ifdef WGL_ARB_pixel_format\r\n\r\nstatic GLboolean _glewInit_WGL_ARB_pixel_format (WGLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((wglChoosePixelFormatARB = (PFNWGLCHOOSEPIXELFORMATARBPROC)glewGetProcAddress((const GLubyte*)\"wglChoosePixelFormatARB\")) == NULL) || r;\r\n  r = ((wglGetPixelFormatAttribfvARB = (PFNWGLGETPIXELFORMATATTRIBFVARBPROC)glewGetProcAddress((const GLubyte*)\"wglGetPixelFormatAttribfvARB\")) == NULL) || r;\r\n  r = ((wglGetPixelFormatAttribivARB = (PFNWGLGETPIXELFORMATATTRIBIVARBPROC)glewGetProcAddress((const GLubyte*)\"wglGetPixelFormatAttribivARB\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* WGL_ARB_pixel_format */\r\n\r\n#ifdef WGL_ARB_pixel_format_float\r\n\r\n#endif /* WGL_ARB_pixel_format_float */\r\n\r\n#ifdef WGL_ARB_render_texture\r\n\r\nstatic GLboolean _glewInit_WGL_ARB_render_texture (WGLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((wglBindTexImageARB = (PFNWGLBINDTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)\"wglBindTexImageARB\")) == NULL) || r;\r\n  r = ((wglReleaseTexImageARB = (PFNWGLRELEASETEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)\"wglReleaseTexImageARB\")) == NULL) || r;\r\n  r = ((wglSetPbufferAttribARB = (PFNWGLSETPBUFFERATTRIBARBPROC)glewGetProcAddress((const GLubyte*)\"wglSetPbufferAttribARB\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* WGL_ARB_render_texture */\r\n\r\n#ifdef WGL_ATI_pixel_format_float\r\n\r\n#endif /* WGL_ATI_pixel_format_float */\r\n\r\n#ifdef WGL_ATI_render_texture_rectangle\r\n\r\n#endif /* WGL_ATI_render_texture_rectangle */\r\n\r\n#ifdef WGL_EXT_depth_float\r\n\r\n#endif /* WGL_EXT_depth_float */\r\n\r\n#ifdef WGL_EXT_display_color_table\r\n\r\nstatic GLboolean _glewInit_WGL_EXT_display_color_table (WGLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((wglBindDisplayColorTableEXT = (PFNWGLBINDDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)\"wglBindDisplayColorTableEXT\")) == NULL) || r;\r\n  r = ((wglCreateDisplayColorTableEXT = (PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)\"wglCreateDisplayColorTableEXT\")) == NULL) || r;\r\n  r = ((wglDestroyDisplayColorTableEXT = (PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)\"wglDestroyDisplayColorTableEXT\")) == NULL) || r;\r\n  r = ((wglLoadDisplayColorTableEXT = (PFNWGLLOADDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)\"wglLoadDisplayColorTableEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* WGL_EXT_display_color_table */\r\n\r\n#ifdef WGL_EXT_extensions_string\r\n\r\nstatic GLboolean _glewInit_WGL_EXT_extensions_string (WGLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((wglGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)\"wglGetExtensionsStringEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* WGL_EXT_extensions_string */\r\n\r\n#ifdef WGL_EXT_framebuffer_sRGB\r\n\r\n#endif /* WGL_EXT_framebuffer_sRGB */\r\n\r\n#ifdef WGL_EXT_make_current_read\r\n\r\nstatic GLboolean _glewInit_WGL_EXT_make_current_read (WGLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((wglGetCurrentReadDCEXT = (PFNWGLGETCURRENTREADDCEXTPROC)glewGetProcAddress((const GLubyte*)\"wglGetCurrentReadDCEXT\")) == NULL) || r;\r\n  r = ((wglMakeContextCurrentEXT = (PFNWGLMAKECONTEXTCURRENTEXTPROC)glewGetProcAddress((const GLubyte*)\"wglMakeContextCurrentEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* WGL_EXT_make_current_read */\r\n\r\n#ifdef WGL_EXT_multisample\r\n\r\n#endif /* WGL_EXT_multisample */\r\n\r\n#ifdef WGL_EXT_pbuffer\r\n\r\nstatic GLboolean _glewInit_WGL_EXT_pbuffer (WGLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((wglCreatePbufferEXT = (PFNWGLCREATEPBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)\"wglCreatePbufferEXT\")) == NULL) || r;\r\n  r = ((wglDestroyPbufferEXT = (PFNWGLDESTROYPBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)\"wglDestroyPbufferEXT\")) == NULL) || r;\r\n  r = ((wglGetPbufferDCEXT = (PFNWGLGETPBUFFERDCEXTPROC)glewGetProcAddress((const GLubyte*)\"wglGetPbufferDCEXT\")) == NULL) || r;\r\n  r = ((wglQueryPbufferEXT = (PFNWGLQUERYPBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)\"wglQueryPbufferEXT\")) == NULL) || r;\r\n  r = ((wglReleasePbufferDCEXT = (PFNWGLRELEASEPBUFFERDCEXTPROC)glewGetProcAddress((const GLubyte*)\"wglReleasePbufferDCEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* WGL_EXT_pbuffer */\r\n\r\n#ifdef WGL_EXT_pixel_format\r\n\r\nstatic GLboolean _glewInit_WGL_EXT_pixel_format (WGLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((wglChoosePixelFormatEXT = (PFNWGLCHOOSEPIXELFORMATEXTPROC)glewGetProcAddress((const GLubyte*)\"wglChoosePixelFormatEXT\")) == NULL) || r;\r\n  r = ((wglGetPixelFormatAttribfvEXT = (PFNWGLGETPIXELFORMATATTRIBFVEXTPROC)glewGetProcAddress((const GLubyte*)\"wglGetPixelFormatAttribfvEXT\")) == NULL) || r;\r\n  r = ((wglGetPixelFormatAttribivEXT = (PFNWGLGETPIXELFORMATATTRIBIVEXTPROC)glewGetProcAddress((const GLubyte*)\"wglGetPixelFormatAttribivEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* WGL_EXT_pixel_format */\r\n\r\n#ifdef WGL_EXT_pixel_format_packed_float\r\n\r\n#endif /* WGL_EXT_pixel_format_packed_float */\r\n\r\n#ifdef WGL_EXT_swap_control\r\n\r\nstatic GLboolean _glewInit_WGL_EXT_swap_control (WGLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((wglGetSwapIntervalEXT = (PFNWGLGETSWAPINTERVALEXTPROC)glewGetProcAddress((const GLubyte*)\"wglGetSwapIntervalEXT\")) == NULL) || r;\r\n  r = ((wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC)glewGetProcAddress((const GLubyte*)\"wglSwapIntervalEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* WGL_EXT_swap_control */\r\n\r\n#ifdef WGL_I3D_digital_video_control\r\n\r\nstatic GLboolean _glewInit_WGL_I3D_digital_video_control (WGLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((wglGetDigitalVideoParametersI3D = (PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)\"wglGetDigitalVideoParametersI3D\")) == NULL) || r;\r\n  r = ((wglSetDigitalVideoParametersI3D = (PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)\"wglSetDigitalVideoParametersI3D\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* WGL_I3D_digital_video_control */\r\n\r\n#ifdef WGL_I3D_gamma\r\n\r\nstatic GLboolean _glewInit_WGL_I3D_gamma (WGLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((wglGetGammaTableI3D = (PFNWGLGETGAMMATABLEI3DPROC)glewGetProcAddress((const GLubyte*)\"wglGetGammaTableI3D\")) == NULL) || r;\r\n  r = ((wglGetGammaTableParametersI3D = (PFNWGLGETGAMMATABLEPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)\"wglGetGammaTableParametersI3D\")) == NULL) || r;\r\n  r = ((wglSetGammaTableI3D = (PFNWGLSETGAMMATABLEI3DPROC)glewGetProcAddress((const GLubyte*)\"wglSetGammaTableI3D\")) == NULL) || r;\r\n  r = ((wglSetGammaTableParametersI3D = (PFNWGLSETGAMMATABLEPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)\"wglSetGammaTableParametersI3D\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* WGL_I3D_gamma */\r\n\r\n#ifdef WGL_I3D_genlock\r\n\r\nstatic GLboolean _glewInit_WGL_I3D_genlock (WGLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((wglDisableGenlockI3D = (PFNWGLDISABLEGENLOCKI3DPROC)glewGetProcAddress((const GLubyte*)\"wglDisableGenlockI3D\")) == NULL) || r;\r\n  r = ((wglEnableGenlockI3D = (PFNWGLENABLEGENLOCKI3DPROC)glewGetProcAddress((const GLubyte*)\"wglEnableGenlockI3D\")) == NULL) || r;\r\n  r = ((wglGenlockSampleRateI3D = (PFNWGLGENLOCKSAMPLERATEI3DPROC)glewGetProcAddress((const GLubyte*)\"wglGenlockSampleRateI3D\")) == NULL) || r;\r\n  r = ((wglGenlockSourceDelayI3D = (PFNWGLGENLOCKSOURCEDELAYI3DPROC)glewGetProcAddress((const GLubyte*)\"wglGenlockSourceDelayI3D\")) == NULL) || r;\r\n  r = ((wglGenlockSourceEdgeI3D = (PFNWGLGENLOCKSOURCEEDGEI3DPROC)glewGetProcAddress((const GLubyte*)\"wglGenlockSourceEdgeI3D\")) == NULL) || r;\r\n  r = ((wglGenlockSourceI3D = (PFNWGLGENLOCKSOURCEI3DPROC)glewGetProcAddress((const GLubyte*)\"wglGenlockSourceI3D\")) == NULL) || r;\r\n  r = ((wglGetGenlockSampleRateI3D = (PFNWGLGETGENLOCKSAMPLERATEI3DPROC)glewGetProcAddress((const GLubyte*)\"wglGetGenlockSampleRateI3D\")) == NULL) || r;\r\n  r = ((wglGetGenlockSourceDelayI3D = (PFNWGLGETGENLOCKSOURCEDELAYI3DPROC)glewGetProcAddress((const GLubyte*)\"wglGetGenlockSourceDelayI3D\")) == NULL) || r;\r\n  r = ((wglGetGenlockSourceEdgeI3D = (PFNWGLGETGENLOCKSOURCEEDGEI3DPROC)glewGetProcAddress((const GLubyte*)\"wglGetGenlockSourceEdgeI3D\")) == NULL) || r;\r\n  r = ((wglGetGenlockSourceI3D = (PFNWGLGETGENLOCKSOURCEI3DPROC)glewGetProcAddress((const GLubyte*)\"wglGetGenlockSourceI3D\")) == NULL) || r;\r\n  r = ((wglIsEnabledGenlockI3D = (PFNWGLISENABLEDGENLOCKI3DPROC)glewGetProcAddress((const GLubyte*)\"wglIsEnabledGenlockI3D\")) == NULL) || r;\r\n  r = ((wglQueryGenlockMaxSourceDelayI3D = (PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC)glewGetProcAddress((const GLubyte*)\"wglQueryGenlockMaxSourceDelayI3D\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* WGL_I3D_genlock */\r\n\r\n#ifdef WGL_I3D_image_buffer\r\n\r\nstatic GLboolean _glewInit_WGL_I3D_image_buffer (WGLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((wglAssociateImageBufferEventsI3D = (PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC)glewGetProcAddress((const GLubyte*)\"wglAssociateImageBufferEventsI3D\")) == NULL) || r;\r\n  r = ((wglCreateImageBufferI3D = (PFNWGLCREATEIMAGEBUFFERI3DPROC)glewGetProcAddress((const GLubyte*)\"wglCreateImageBufferI3D\")) == NULL) || r;\r\n  r = ((wglDestroyImageBufferI3D = (PFNWGLDESTROYIMAGEBUFFERI3DPROC)glewGetProcAddress((const GLubyte*)\"wglDestroyImageBufferI3D\")) == NULL) || r;\r\n  r = ((wglReleaseImageBufferEventsI3D = (PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC)glewGetProcAddress((const GLubyte*)\"wglReleaseImageBufferEventsI3D\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* WGL_I3D_image_buffer */\r\n\r\n#ifdef WGL_I3D_swap_frame_lock\r\n\r\nstatic GLboolean _glewInit_WGL_I3D_swap_frame_lock (WGLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((wglDisableFrameLockI3D = (PFNWGLDISABLEFRAMELOCKI3DPROC)glewGetProcAddress((const GLubyte*)\"wglDisableFrameLockI3D\")) == NULL) || r;\r\n  r = ((wglEnableFrameLockI3D = (PFNWGLENABLEFRAMELOCKI3DPROC)glewGetProcAddress((const GLubyte*)\"wglEnableFrameLockI3D\")) == NULL) || r;\r\n  r = ((wglIsEnabledFrameLockI3D = (PFNWGLISENABLEDFRAMELOCKI3DPROC)glewGetProcAddress((const GLubyte*)\"wglIsEnabledFrameLockI3D\")) == NULL) || r;\r\n  r = ((wglQueryFrameLockMasterI3D = (PFNWGLQUERYFRAMELOCKMASTERI3DPROC)glewGetProcAddress((const GLubyte*)\"wglQueryFrameLockMasterI3D\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* WGL_I3D_swap_frame_lock */\r\n\r\n#ifdef WGL_I3D_swap_frame_usage\r\n\r\nstatic GLboolean _glewInit_WGL_I3D_swap_frame_usage (WGLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((wglBeginFrameTrackingI3D = (PFNWGLBEGINFRAMETRACKINGI3DPROC)glewGetProcAddress((const GLubyte*)\"wglBeginFrameTrackingI3D\")) == NULL) || r;\r\n  r = ((wglEndFrameTrackingI3D = (PFNWGLENDFRAMETRACKINGI3DPROC)glewGetProcAddress((const GLubyte*)\"wglEndFrameTrackingI3D\")) == NULL) || r;\r\n  r = ((wglGetFrameUsageI3D = (PFNWGLGETFRAMEUSAGEI3DPROC)glewGetProcAddress((const GLubyte*)\"wglGetFrameUsageI3D\")) == NULL) || r;\r\n  r = ((wglQueryFrameTrackingI3D = (PFNWGLQUERYFRAMETRACKINGI3DPROC)glewGetProcAddress((const GLubyte*)\"wglQueryFrameTrackingI3D\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* WGL_I3D_swap_frame_usage */\r\n\r\n#ifdef WGL_NV_copy_image\r\n\r\nstatic GLboolean _glewInit_WGL_NV_copy_image (WGLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((wglCopyImageSubDataNV = (PFNWGLCOPYIMAGESUBDATANVPROC)glewGetProcAddress((const GLubyte*)\"wglCopyImageSubDataNV\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* WGL_NV_copy_image */\r\n\r\n#ifdef WGL_NV_float_buffer\r\n\r\n#endif /* WGL_NV_float_buffer */\r\n\r\n#ifdef WGL_NV_gpu_affinity\r\n\r\nstatic GLboolean _glewInit_WGL_NV_gpu_affinity (WGLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((wglCreateAffinityDCNV = (PFNWGLCREATEAFFINITYDCNVPROC)glewGetProcAddress((const GLubyte*)\"wglCreateAffinityDCNV\")) == NULL) || r;\r\n  r = ((wglDeleteDCNV = (PFNWGLDELETEDCNVPROC)glewGetProcAddress((const GLubyte*)\"wglDeleteDCNV\")) == NULL) || r;\r\n  r = ((wglEnumGpuDevicesNV = (PFNWGLENUMGPUDEVICESNVPROC)glewGetProcAddress((const GLubyte*)\"wglEnumGpuDevicesNV\")) == NULL) || r;\r\n  r = ((wglEnumGpusFromAffinityDCNV = (PFNWGLENUMGPUSFROMAFFINITYDCNVPROC)glewGetProcAddress((const GLubyte*)\"wglEnumGpusFromAffinityDCNV\")) == NULL) || r;\r\n  r = ((wglEnumGpusNV = (PFNWGLENUMGPUSNVPROC)glewGetProcAddress((const GLubyte*)\"wglEnumGpusNV\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* WGL_NV_gpu_affinity */\r\n\r\n#ifdef WGL_NV_present_video\r\n\r\nstatic GLboolean _glewInit_WGL_NV_present_video (WGLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((wglBindVideoDeviceNV = (PFNWGLBINDVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)\"wglBindVideoDeviceNV\")) == NULL) || r;\r\n  r = ((wglEnumerateVideoDevicesNV = (PFNWGLENUMERATEVIDEODEVICESNVPROC)glewGetProcAddress((const GLubyte*)\"wglEnumerateVideoDevicesNV\")) == NULL) || r;\r\n  r = ((wglQueryCurrentContextNV = (PFNWGLQUERYCURRENTCONTEXTNVPROC)glewGetProcAddress((const GLubyte*)\"wglQueryCurrentContextNV\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* WGL_NV_present_video */\r\n\r\n#ifdef WGL_NV_render_depth_texture\r\n\r\n#endif /* WGL_NV_render_depth_texture */\r\n\r\n#ifdef WGL_NV_render_texture_rectangle\r\n\r\n#endif /* WGL_NV_render_texture_rectangle */\r\n\r\n#ifdef WGL_NV_swap_group\r\n\r\nstatic GLboolean _glewInit_WGL_NV_swap_group (WGLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((wglBindSwapBarrierNV = (PFNWGLBINDSWAPBARRIERNVPROC)glewGetProcAddress((const GLubyte*)\"wglBindSwapBarrierNV\")) == NULL) || r;\r\n  r = ((wglJoinSwapGroupNV = (PFNWGLJOINSWAPGROUPNVPROC)glewGetProcAddress((const GLubyte*)\"wglJoinSwapGroupNV\")) == NULL) || r;\r\n  r = ((wglQueryFrameCountNV = (PFNWGLQUERYFRAMECOUNTNVPROC)glewGetProcAddress((const GLubyte*)\"wglQueryFrameCountNV\")) == NULL) || r;\r\n  r = ((wglQueryMaxSwapGroupsNV = (PFNWGLQUERYMAXSWAPGROUPSNVPROC)glewGetProcAddress((const GLubyte*)\"wglQueryMaxSwapGroupsNV\")) == NULL) || r;\r\n  r = ((wglQuerySwapGroupNV = (PFNWGLQUERYSWAPGROUPNVPROC)glewGetProcAddress((const GLubyte*)\"wglQuerySwapGroupNV\")) == NULL) || r;\r\n  r = ((wglResetFrameCountNV = (PFNWGLRESETFRAMECOUNTNVPROC)glewGetProcAddress((const GLubyte*)\"wglResetFrameCountNV\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* WGL_NV_swap_group */\r\n\r\n#ifdef WGL_NV_vertex_array_range\r\n\r\nstatic GLboolean _glewInit_WGL_NV_vertex_array_range (WGLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((wglAllocateMemoryNV = (PFNWGLALLOCATEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)\"wglAllocateMemoryNV\")) == NULL) || r;\r\n  r = ((wglFreeMemoryNV = (PFNWGLFREEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)\"wglFreeMemoryNV\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* WGL_NV_vertex_array_range */\r\n\r\n#ifdef WGL_NV_video_output\r\n\r\nstatic GLboolean _glewInit_WGL_NV_video_output (WGLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((wglBindVideoImageNV = (PFNWGLBINDVIDEOIMAGENVPROC)glewGetProcAddress((const GLubyte*)\"wglBindVideoImageNV\")) == NULL) || r;\r\n  r = ((wglGetVideoDeviceNV = (PFNWGLGETVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)\"wglGetVideoDeviceNV\")) == NULL) || r;\r\n  r = ((wglGetVideoInfoNV = (PFNWGLGETVIDEOINFONVPROC)glewGetProcAddress((const GLubyte*)\"wglGetVideoInfoNV\")) == NULL) || r;\r\n  r = ((wglReleaseVideoDeviceNV = (PFNWGLRELEASEVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)\"wglReleaseVideoDeviceNV\")) == NULL) || r;\r\n  r = ((wglReleaseVideoImageNV = (PFNWGLRELEASEVIDEOIMAGENVPROC)glewGetProcAddress((const GLubyte*)\"wglReleaseVideoImageNV\")) == NULL) || r;\r\n  r = ((wglSendPbufferToVideoNV = (PFNWGLSENDPBUFFERTOVIDEONVPROC)glewGetProcAddress((const GLubyte*)\"wglSendPbufferToVideoNV\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* WGL_NV_video_output */\r\n\r\n#ifdef WGL_OML_sync_control\r\n\r\nstatic GLboolean _glewInit_WGL_OML_sync_control (WGLEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((wglGetMscRateOML = (PFNWGLGETMSCRATEOMLPROC)glewGetProcAddress((const GLubyte*)\"wglGetMscRateOML\")) == NULL) || r;\r\n  r = ((wglGetSyncValuesOML = (PFNWGLGETSYNCVALUESOMLPROC)glewGetProcAddress((const GLubyte*)\"wglGetSyncValuesOML\")) == NULL) || r;\r\n  r = ((wglSwapBuffersMscOML = (PFNWGLSWAPBUFFERSMSCOMLPROC)glewGetProcAddress((const GLubyte*)\"wglSwapBuffersMscOML\")) == NULL) || r;\r\n  r = ((wglSwapLayerBuffersMscOML = (PFNWGLSWAPLAYERBUFFERSMSCOMLPROC)glewGetProcAddress((const GLubyte*)\"wglSwapLayerBuffersMscOML\")) == NULL) || r;\r\n  r = ((wglWaitForMscOML = (PFNWGLWAITFORMSCOMLPROC)glewGetProcAddress((const GLubyte*)\"wglWaitForMscOML\")) == NULL) || r;\r\n  r = ((wglWaitForSbcOML = (PFNWGLWAITFORSBCOMLPROC)glewGetProcAddress((const GLubyte*)\"wglWaitForSbcOML\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* WGL_OML_sync_control */\r\n\r\n/* ------------------------------------------------------------------------- */\r\n\r\nstatic PFNWGLGETEXTENSIONSSTRINGARBPROC _wglewGetExtensionsStringARB = NULL;\r\nstatic PFNWGLGETEXTENSIONSSTRINGEXTPROC _wglewGetExtensionsStringEXT = NULL;\r\n\r\nGLboolean wglewGetExtension (const char* name)\r\n{    \r\n  GLubyte* p;\r\n  GLubyte* end;\r\n  GLuint len = _glewStrLen((const GLubyte*)name);\r\n  if (_wglewGetExtensionsStringARB == NULL)\r\n    if (_wglewGetExtensionsStringEXT == NULL)\r\n      return GL_FALSE;\r\n    else\r\n      p = (GLubyte*)_wglewGetExtensionsStringEXT();\r\n  else\r\n    p = (GLubyte*)_wglewGetExtensionsStringARB(wglGetCurrentDC());\r\n  if (0 == p) return GL_FALSE;\r\n  end = p + _glewStrLen(p);\r\n  while (p < end)\r\n  {\r\n    GLuint n = _glewStrCLen(p, ' ');\r\n    if (len == n && _glewStrSame((const GLubyte*)name, p, n)) return GL_TRUE;\r\n    p += n+1;\r\n  }\r\n  return GL_FALSE;\r\n}\r\n\r\nGLenum wglewContextInit (WGLEW_CONTEXT_ARG_DEF_LIST)\r\n{\r\n  GLboolean crippled;\r\n  /* find wgl extension string query functions */\r\n  _wglewGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)glewGetProcAddress((const GLubyte*)\"wglGetExtensionsStringARB\");\r\n  _wglewGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)\"wglGetExtensionsStringEXT\");\r\n  /* initialize extensions */\r\n  crippled = _wglewGetExtensionsStringARB == NULL && _wglewGetExtensionsStringEXT == NULL;\r\n#ifdef WGL_3DFX_multisample\r\n  CONST_CAST(WGLEW_3DFX_multisample) = wglewGetExtension(\"WGL_3DFX_multisample\");\r\n#endif /* WGL_3DFX_multisample */\r\n#ifdef WGL_3DL_stereo_control\r\n  CONST_CAST(WGLEW_3DL_stereo_control) = wglewGetExtension(\"WGL_3DL_stereo_control\");\r\n  if (glewExperimental || WGLEW_3DL_stereo_control|| crippled) CONST_CAST(WGLEW_3DL_stereo_control)= !_glewInit_WGL_3DL_stereo_control(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* WGL_3DL_stereo_control */\r\n#ifdef WGL_AMD_gpu_association\r\n  CONST_CAST(WGLEW_AMD_gpu_association) = wglewGetExtension(\"WGL_AMD_gpu_association\");\r\n  if (glewExperimental || WGLEW_AMD_gpu_association|| crippled) CONST_CAST(WGLEW_AMD_gpu_association)= !_glewInit_WGL_AMD_gpu_association(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* WGL_AMD_gpu_association */\r\n#ifdef WGL_ARB_buffer_region\r\n  CONST_CAST(WGLEW_ARB_buffer_region) = wglewGetExtension(\"WGL_ARB_buffer_region\");\r\n  if (glewExperimental || WGLEW_ARB_buffer_region|| crippled) CONST_CAST(WGLEW_ARB_buffer_region)= !_glewInit_WGL_ARB_buffer_region(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* WGL_ARB_buffer_region */\r\n#ifdef WGL_ARB_create_context\r\n  CONST_CAST(WGLEW_ARB_create_context) = wglewGetExtension(\"WGL_ARB_create_context\");\r\n  if (glewExperimental || WGLEW_ARB_create_context|| crippled) CONST_CAST(WGLEW_ARB_create_context)= !_glewInit_WGL_ARB_create_context(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* WGL_ARB_create_context */\r\n#ifdef WGL_ARB_create_context_profile\r\n  CONST_CAST(WGLEW_ARB_create_context_profile) = wglewGetExtension(\"WGL_ARB_create_context_profile\");\r\n#endif /* WGL_ARB_create_context_profile */\r\n#ifdef WGL_ARB_extensions_string\r\n  CONST_CAST(WGLEW_ARB_extensions_string) = wglewGetExtension(\"WGL_ARB_extensions_string\");\r\n  if (glewExperimental || WGLEW_ARB_extensions_string|| crippled) CONST_CAST(WGLEW_ARB_extensions_string)= !_glewInit_WGL_ARB_extensions_string(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* WGL_ARB_extensions_string */\r\n#ifdef WGL_ARB_framebuffer_sRGB\r\n  CONST_CAST(WGLEW_ARB_framebuffer_sRGB) = wglewGetExtension(\"WGL_ARB_framebuffer_sRGB\");\r\n#endif /* WGL_ARB_framebuffer_sRGB */\r\n#ifdef WGL_ARB_make_current_read\r\n  CONST_CAST(WGLEW_ARB_make_current_read) = wglewGetExtension(\"WGL_ARB_make_current_read\");\r\n  if (glewExperimental || WGLEW_ARB_make_current_read|| crippled) CONST_CAST(WGLEW_ARB_make_current_read)= !_glewInit_WGL_ARB_make_current_read(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* WGL_ARB_make_current_read */\r\n#ifdef WGL_ARB_multisample\r\n  CONST_CAST(WGLEW_ARB_multisample) = wglewGetExtension(\"WGL_ARB_multisample\");\r\n#endif /* WGL_ARB_multisample */\r\n#ifdef WGL_ARB_pbuffer\r\n  CONST_CAST(WGLEW_ARB_pbuffer) = wglewGetExtension(\"WGL_ARB_pbuffer\");\r\n  if (glewExperimental || WGLEW_ARB_pbuffer|| crippled) CONST_CAST(WGLEW_ARB_pbuffer)= !_glewInit_WGL_ARB_pbuffer(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* WGL_ARB_pbuffer */\r\n#ifdef WGL_ARB_pixel_format\r\n  CONST_CAST(WGLEW_ARB_pixel_format) = wglewGetExtension(\"WGL_ARB_pixel_format\");\r\n  if (glewExperimental || WGLEW_ARB_pixel_format|| crippled) CONST_CAST(WGLEW_ARB_pixel_format)= !_glewInit_WGL_ARB_pixel_format(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* WGL_ARB_pixel_format */\r\n#ifdef WGL_ARB_pixel_format_float\r\n  CONST_CAST(WGLEW_ARB_pixel_format_float) = wglewGetExtension(\"WGL_ARB_pixel_format_float\");\r\n#endif /* WGL_ARB_pixel_format_float */\r\n#ifdef WGL_ARB_render_texture\r\n  CONST_CAST(WGLEW_ARB_render_texture) = wglewGetExtension(\"WGL_ARB_render_texture\");\r\n  if (glewExperimental || WGLEW_ARB_render_texture|| crippled) CONST_CAST(WGLEW_ARB_render_texture)= !_glewInit_WGL_ARB_render_texture(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* WGL_ARB_render_texture */\r\n#ifdef WGL_ATI_pixel_format_float\r\n  CONST_CAST(WGLEW_ATI_pixel_format_float) = wglewGetExtension(\"WGL_ATI_pixel_format_float\");\r\n#endif /* WGL_ATI_pixel_format_float */\r\n#ifdef WGL_ATI_render_texture_rectangle\r\n  CONST_CAST(WGLEW_ATI_render_texture_rectangle) = wglewGetExtension(\"WGL_ATI_render_texture_rectangle\");\r\n#endif /* WGL_ATI_render_texture_rectangle */\r\n#ifdef WGL_EXT_depth_float\r\n  CONST_CAST(WGLEW_EXT_depth_float) = wglewGetExtension(\"WGL_EXT_depth_float\");\r\n#endif /* WGL_EXT_depth_float */\r\n#ifdef WGL_EXT_display_color_table\r\n  CONST_CAST(WGLEW_EXT_display_color_table) = wglewGetExtension(\"WGL_EXT_display_color_table\");\r\n  if (glewExperimental || WGLEW_EXT_display_color_table|| crippled) CONST_CAST(WGLEW_EXT_display_color_table)= !_glewInit_WGL_EXT_display_color_table(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* WGL_EXT_display_color_table */\r\n#ifdef WGL_EXT_extensions_string\r\n  CONST_CAST(WGLEW_EXT_extensions_string) = wglewGetExtension(\"WGL_EXT_extensions_string\");\r\n  if (glewExperimental || WGLEW_EXT_extensions_string|| crippled) CONST_CAST(WGLEW_EXT_extensions_string)= !_glewInit_WGL_EXT_extensions_string(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* WGL_EXT_extensions_string */\r\n#ifdef WGL_EXT_framebuffer_sRGB\r\n  CONST_CAST(WGLEW_EXT_framebuffer_sRGB) = wglewGetExtension(\"WGL_EXT_framebuffer_sRGB\");\r\n#endif /* WGL_EXT_framebuffer_sRGB */\r\n#ifdef WGL_EXT_make_current_read\r\n  CONST_CAST(WGLEW_EXT_make_current_read) = wglewGetExtension(\"WGL_EXT_make_current_read\");\r\n  if (glewExperimental || WGLEW_EXT_make_current_read|| crippled) CONST_CAST(WGLEW_EXT_make_current_read)= !_glewInit_WGL_EXT_make_current_read(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* WGL_EXT_make_current_read */\r\n#ifdef WGL_EXT_multisample\r\n  CONST_CAST(WGLEW_EXT_multisample) = wglewGetExtension(\"WGL_EXT_multisample\");\r\n#endif /* WGL_EXT_multisample */\r\n#ifdef WGL_EXT_pbuffer\r\n  CONST_CAST(WGLEW_EXT_pbuffer) = wglewGetExtension(\"WGL_EXT_pbuffer\");\r\n  if (glewExperimental || WGLEW_EXT_pbuffer|| crippled) CONST_CAST(WGLEW_EXT_pbuffer)= !_glewInit_WGL_EXT_pbuffer(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* WGL_EXT_pbuffer */\r\n#ifdef WGL_EXT_pixel_format\r\n  CONST_CAST(WGLEW_EXT_pixel_format) = wglewGetExtension(\"WGL_EXT_pixel_format\");\r\n  if (glewExperimental || WGLEW_EXT_pixel_format|| crippled) CONST_CAST(WGLEW_EXT_pixel_format)= !_glewInit_WGL_EXT_pixel_format(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* WGL_EXT_pixel_format */\r\n#ifdef WGL_EXT_pixel_format_packed_float\r\n  CONST_CAST(WGLEW_EXT_pixel_format_packed_float) = wglewGetExtension(\"WGL_EXT_pixel_format_packed_float\");\r\n#endif /* WGL_EXT_pixel_format_packed_float */\r\n#ifdef WGL_EXT_swap_control\r\n  CONST_CAST(WGLEW_EXT_swap_control) = wglewGetExtension(\"WGL_EXT_swap_control\");\r\n  if (glewExperimental || WGLEW_EXT_swap_control|| crippled) CONST_CAST(WGLEW_EXT_swap_control)= !_glewInit_WGL_EXT_swap_control(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* WGL_EXT_swap_control */\r\n#ifdef WGL_I3D_digital_video_control\r\n  CONST_CAST(WGLEW_I3D_digital_video_control) = wglewGetExtension(\"WGL_I3D_digital_video_control\");\r\n  if (glewExperimental || WGLEW_I3D_digital_video_control|| crippled) CONST_CAST(WGLEW_I3D_digital_video_control)= !_glewInit_WGL_I3D_digital_video_control(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* WGL_I3D_digital_video_control */\r\n#ifdef WGL_I3D_gamma\r\n  CONST_CAST(WGLEW_I3D_gamma) = wglewGetExtension(\"WGL_I3D_gamma\");\r\n  if (glewExperimental || WGLEW_I3D_gamma|| crippled) CONST_CAST(WGLEW_I3D_gamma)= !_glewInit_WGL_I3D_gamma(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* WGL_I3D_gamma */\r\n#ifdef WGL_I3D_genlock\r\n  CONST_CAST(WGLEW_I3D_genlock) = wglewGetExtension(\"WGL_I3D_genlock\");\r\n  if (glewExperimental || WGLEW_I3D_genlock|| crippled) CONST_CAST(WGLEW_I3D_genlock)= !_glewInit_WGL_I3D_genlock(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* WGL_I3D_genlock */\r\n#ifdef WGL_I3D_image_buffer\r\n  CONST_CAST(WGLEW_I3D_image_buffer) = wglewGetExtension(\"WGL_I3D_image_buffer\");\r\n  if (glewExperimental || WGLEW_I3D_image_buffer|| crippled) CONST_CAST(WGLEW_I3D_image_buffer)= !_glewInit_WGL_I3D_image_buffer(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* WGL_I3D_image_buffer */\r\n#ifdef WGL_I3D_swap_frame_lock\r\n  CONST_CAST(WGLEW_I3D_swap_frame_lock) = wglewGetExtension(\"WGL_I3D_swap_frame_lock\");\r\n  if (glewExperimental || WGLEW_I3D_swap_frame_lock|| crippled) CONST_CAST(WGLEW_I3D_swap_frame_lock)= !_glewInit_WGL_I3D_swap_frame_lock(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* WGL_I3D_swap_frame_lock */\r\n#ifdef WGL_I3D_swap_frame_usage\r\n  CONST_CAST(WGLEW_I3D_swap_frame_usage) = wglewGetExtension(\"WGL_I3D_swap_frame_usage\");\r\n  if (glewExperimental || WGLEW_I3D_swap_frame_usage|| crippled) CONST_CAST(WGLEW_I3D_swap_frame_usage)= !_glewInit_WGL_I3D_swap_frame_usage(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* WGL_I3D_swap_frame_usage */\r\n#ifdef WGL_NV_copy_image\r\n  CONST_CAST(WGLEW_NV_copy_image) = wglewGetExtension(\"WGL_NV_copy_image\");\r\n  if (glewExperimental || WGLEW_NV_copy_image|| crippled) CONST_CAST(WGLEW_NV_copy_image)= !_glewInit_WGL_NV_copy_image(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* WGL_NV_copy_image */\r\n#ifdef WGL_NV_float_buffer\r\n  CONST_CAST(WGLEW_NV_float_buffer) = wglewGetExtension(\"WGL_NV_float_buffer\");\r\n#endif /* WGL_NV_float_buffer */\r\n#ifdef WGL_NV_gpu_affinity\r\n  CONST_CAST(WGLEW_NV_gpu_affinity) = wglewGetExtension(\"WGL_NV_gpu_affinity\");\r\n  if (glewExperimental || WGLEW_NV_gpu_affinity|| crippled) CONST_CAST(WGLEW_NV_gpu_affinity)= !_glewInit_WGL_NV_gpu_affinity(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* WGL_NV_gpu_affinity */\r\n#ifdef WGL_NV_present_video\r\n  CONST_CAST(WGLEW_NV_present_video) = wglewGetExtension(\"WGL_NV_present_video\");\r\n  if (glewExperimental || WGLEW_NV_present_video|| crippled) CONST_CAST(WGLEW_NV_present_video)= !_glewInit_WGL_NV_present_video(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* WGL_NV_present_video */\r\n#ifdef WGL_NV_render_depth_texture\r\n  CONST_CAST(WGLEW_NV_render_depth_texture) = wglewGetExtension(\"WGL_NV_render_depth_texture\");\r\n#endif /* WGL_NV_render_depth_texture */\r\n#ifdef WGL_NV_render_texture_rectangle\r\n  CONST_CAST(WGLEW_NV_render_texture_rectangle) = wglewGetExtension(\"WGL_NV_render_texture_rectangle\");\r\n#endif /* WGL_NV_render_texture_rectangle */\r\n#ifdef WGL_NV_swap_group\r\n  CONST_CAST(WGLEW_NV_swap_group) = wglewGetExtension(\"WGL_NV_swap_group\");\r\n  if (glewExperimental || WGLEW_NV_swap_group|| crippled) CONST_CAST(WGLEW_NV_swap_group)= !_glewInit_WGL_NV_swap_group(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* WGL_NV_swap_group */\r\n#ifdef WGL_NV_vertex_array_range\r\n  CONST_CAST(WGLEW_NV_vertex_array_range) = wglewGetExtension(\"WGL_NV_vertex_array_range\");\r\n  if (glewExperimental || WGLEW_NV_vertex_array_range|| crippled) CONST_CAST(WGLEW_NV_vertex_array_range)= !_glewInit_WGL_NV_vertex_array_range(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* WGL_NV_vertex_array_range */\r\n#ifdef WGL_NV_video_output\r\n  CONST_CAST(WGLEW_NV_video_output) = wglewGetExtension(\"WGL_NV_video_output\");\r\n  if (glewExperimental || WGLEW_NV_video_output|| crippled) CONST_CAST(WGLEW_NV_video_output)= !_glewInit_WGL_NV_video_output(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* WGL_NV_video_output */\r\n#ifdef WGL_OML_sync_control\r\n  CONST_CAST(WGLEW_OML_sync_control) = wglewGetExtension(\"WGL_OML_sync_control\");\r\n  if (glewExperimental || WGLEW_OML_sync_control|| crippled) CONST_CAST(WGLEW_OML_sync_control)= !_glewInit_WGL_OML_sync_control(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* WGL_OML_sync_control */\r\n\r\n  return GLEW_OK;\r\n}\r\n\r\n#elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX)\r\n\r\nPFNGLXGETCURRENTDISPLAYPROC __glewXGetCurrentDisplay = NULL;\r\n\r\nPFNGLXCHOOSEFBCONFIGPROC __glewXChooseFBConfig = NULL;\r\nPFNGLXCREATENEWCONTEXTPROC __glewXCreateNewContext = NULL;\r\nPFNGLXCREATEPBUFFERPROC __glewXCreatePbuffer = NULL;\r\nPFNGLXCREATEPIXMAPPROC __glewXCreatePixmap = NULL;\r\nPFNGLXCREATEWINDOWPROC __glewXCreateWindow = NULL;\r\nPFNGLXDESTROYPBUFFERPROC __glewXDestroyPbuffer = NULL;\r\nPFNGLXDESTROYPIXMAPPROC __glewXDestroyPixmap = NULL;\r\nPFNGLXDESTROYWINDOWPROC __glewXDestroyWindow = NULL;\r\nPFNGLXGETCURRENTREADDRAWABLEPROC __glewXGetCurrentReadDrawable = NULL;\r\nPFNGLXGETFBCONFIGATTRIBPROC __glewXGetFBConfigAttrib = NULL;\r\nPFNGLXGETFBCONFIGSPROC __glewXGetFBConfigs = NULL;\r\nPFNGLXGETSELECTEDEVENTPROC __glewXGetSelectedEvent = NULL;\r\nPFNGLXGETVISUALFROMFBCONFIGPROC __glewXGetVisualFromFBConfig = NULL;\r\nPFNGLXMAKECONTEXTCURRENTPROC __glewXMakeContextCurrent = NULL;\r\nPFNGLXQUERYCONTEXTPROC __glewXQueryContext = NULL;\r\nPFNGLXQUERYDRAWABLEPROC __glewXQueryDrawable = NULL;\r\nPFNGLXSELECTEVENTPROC __glewXSelectEvent = NULL;\r\n\r\nPFNGLXCREATECONTEXTATTRIBSARBPROC __glewXCreateContextAttribsARB = NULL;\r\n\r\nPFNGLXBINDTEXIMAGEATIPROC __glewXBindTexImageATI = NULL;\r\nPFNGLXDRAWABLEATTRIBATIPROC __glewXDrawableAttribATI = NULL;\r\nPFNGLXRELEASETEXIMAGEATIPROC __glewXReleaseTexImageATI = NULL;\r\n\r\nPFNGLXFREECONTEXTEXTPROC __glewXFreeContextEXT = NULL;\r\nPFNGLXGETCONTEXTIDEXTPROC __glewXGetContextIDEXT = NULL;\r\nPFNGLXIMPORTCONTEXTEXTPROC __glewXImportContextEXT = NULL;\r\nPFNGLXQUERYCONTEXTINFOEXTPROC __glewXQueryContextInfoEXT = NULL;\r\n\r\nPFNGLXSWAPINTERVALEXTPROC __glewXSwapIntervalEXT = NULL;\r\n\r\nPFNGLXBINDTEXIMAGEEXTPROC __glewXBindTexImageEXT = NULL;\r\nPFNGLXRELEASETEXIMAGEEXTPROC __glewXReleaseTexImageEXT = NULL;\r\n\r\nPFNGLXGETAGPOFFSETMESAPROC __glewXGetAGPOffsetMESA = NULL;\r\n\r\nPFNGLXCOPYSUBBUFFERMESAPROC __glewXCopySubBufferMESA = NULL;\r\n\r\nPFNGLXCREATEGLXPIXMAPMESAPROC __glewXCreateGLXPixmapMESA = NULL;\r\n\r\nPFNGLXRELEASEBUFFERSMESAPROC __glewXReleaseBuffersMESA = NULL;\r\n\r\nPFNGLXSET3DFXMODEMESAPROC __glewXSet3DfxModeMESA = NULL;\r\n\r\nPFNGLXCOPYIMAGESUBDATANVPROC __glewXCopyImageSubDataNV = NULL;\r\n\r\nPFNGLXBINDVIDEODEVICENVPROC __glewXBindVideoDeviceNV = NULL;\r\nPFNGLXENUMERATEVIDEODEVICESNVPROC __glewXEnumerateVideoDevicesNV = NULL;\r\n\r\nPFNGLXBINDSWAPBARRIERNVPROC __glewXBindSwapBarrierNV = NULL;\r\nPFNGLXJOINSWAPGROUPNVPROC __glewXJoinSwapGroupNV = NULL;\r\nPFNGLXQUERYFRAMECOUNTNVPROC __glewXQueryFrameCountNV = NULL;\r\nPFNGLXQUERYMAXSWAPGROUPSNVPROC __glewXQueryMaxSwapGroupsNV = NULL;\r\nPFNGLXQUERYSWAPGROUPNVPROC __glewXQuerySwapGroupNV = NULL;\r\nPFNGLXRESETFRAMECOUNTNVPROC __glewXResetFrameCountNV = NULL;\r\n\r\nPFNGLXALLOCATEMEMORYNVPROC __glewXAllocateMemoryNV = NULL;\r\nPFNGLXFREEMEMORYNVPROC __glewXFreeMemoryNV = NULL;\r\n\r\nPFNGLXBINDVIDEOIMAGENVPROC __glewXBindVideoImageNV = NULL;\r\nPFNGLXGETVIDEODEVICENVPROC __glewXGetVideoDeviceNV = NULL;\r\nPFNGLXGETVIDEOINFONVPROC __glewXGetVideoInfoNV = NULL;\r\nPFNGLXRELEASEVIDEODEVICENVPROC __glewXReleaseVideoDeviceNV = NULL;\r\nPFNGLXRELEASEVIDEOIMAGENVPROC __glewXReleaseVideoImageNV = NULL;\r\nPFNGLXSENDPBUFFERTOVIDEONVPROC __glewXSendPbufferToVideoNV = NULL;\r\n\r\n#ifdef GLX_OML_sync_control\r\nPFNGLXGETMSCRATEOMLPROC __glewXGetMscRateOML = NULL;\r\nPFNGLXGETSYNCVALUESOMLPROC __glewXGetSyncValuesOML = NULL;\r\nPFNGLXSWAPBUFFERSMSCOMLPROC __glewXSwapBuffersMscOML = NULL;\r\nPFNGLXWAITFORMSCOMLPROC __glewXWaitForMscOML = NULL;\r\nPFNGLXWAITFORSBCOMLPROC __glewXWaitForSbcOML = NULL;\r\n#endif\r\n\r\nPFNGLXCHOOSEFBCONFIGSGIXPROC __glewXChooseFBConfigSGIX = NULL;\r\nPFNGLXCREATECONTEXTWITHCONFIGSGIXPROC __glewXCreateContextWithConfigSGIX = NULL;\r\nPFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC __glewXCreateGLXPixmapWithConfigSGIX = NULL;\r\nPFNGLXGETFBCONFIGATTRIBSGIXPROC __glewXGetFBConfigAttribSGIX = NULL;\r\nPFNGLXGETFBCONFIGFROMVISUALSGIXPROC __glewXGetFBConfigFromVisualSGIX = NULL;\r\nPFNGLXGETVISUALFROMFBCONFIGSGIXPROC __glewXGetVisualFromFBConfigSGIX = NULL;\r\n\r\nPFNGLXBINDHYPERPIPESGIXPROC __glewXBindHyperpipeSGIX = NULL;\r\nPFNGLXDESTROYHYPERPIPECONFIGSGIXPROC __glewXDestroyHyperpipeConfigSGIX = NULL;\r\nPFNGLXHYPERPIPEATTRIBSGIXPROC __glewXHyperpipeAttribSGIX = NULL;\r\nPFNGLXHYPERPIPECONFIGSGIXPROC __glewXHyperpipeConfigSGIX = NULL;\r\nPFNGLXQUERYHYPERPIPEATTRIBSGIXPROC __glewXQueryHyperpipeAttribSGIX = NULL;\r\nPFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC __glewXQueryHyperpipeBestAttribSGIX = NULL;\r\nPFNGLXQUERYHYPERPIPECONFIGSGIXPROC __glewXQueryHyperpipeConfigSGIX = NULL;\r\nPFNGLXQUERYHYPERPIPENETWORKSGIXPROC __glewXQueryHyperpipeNetworkSGIX = NULL;\r\n\r\nPFNGLXCREATEGLXPBUFFERSGIXPROC __glewXCreateGLXPbufferSGIX = NULL;\r\nPFNGLXDESTROYGLXPBUFFERSGIXPROC __glewXDestroyGLXPbufferSGIX = NULL;\r\nPFNGLXGETSELECTEDEVENTSGIXPROC __glewXGetSelectedEventSGIX = NULL;\r\nPFNGLXQUERYGLXPBUFFERSGIXPROC __glewXQueryGLXPbufferSGIX = NULL;\r\nPFNGLXSELECTEVENTSGIXPROC __glewXSelectEventSGIX = NULL;\r\n\r\nPFNGLXBINDSWAPBARRIERSGIXPROC __glewXBindSwapBarrierSGIX = NULL;\r\nPFNGLXQUERYMAXSWAPBARRIERSSGIXPROC __glewXQueryMaxSwapBarriersSGIX = NULL;\r\n\r\nPFNGLXJOINSWAPGROUPSGIXPROC __glewXJoinSwapGroupSGIX = NULL;\r\n\r\nPFNGLXBINDCHANNELTOWINDOWSGIXPROC __glewXBindChannelToWindowSGIX = NULL;\r\nPFNGLXCHANNELRECTSGIXPROC __glewXChannelRectSGIX = NULL;\r\nPFNGLXCHANNELRECTSYNCSGIXPROC __glewXChannelRectSyncSGIX = NULL;\r\nPFNGLXQUERYCHANNELDELTASSGIXPROC __glewXQueryChannelDeltasSGIX = NULL;\r\nPFNGLXQUERYCHANNELRECTSGIXPROC __glewXQueryChannelRectSGIX = NULL;\r\n\r\nPFNGLXCUSHIONSGIPROC __glewXCushionSGI = NULL;\r\n\r\nPFNGLXGETCURRENTREADDRAWABLESGIPROC __glewXGetCurrentReadDrawableSGI = NULL;\r\nPFNGLXMAKECURRENTREADSGIPROC __glewXMakeCurrentReadSGI = NULL;\r\n\r\nPFNGLXSWAPINTERVALSGIPROC __glewXSwapIntervalSGI = NULL;\r\n\r\nPFNGLXGETVIDEOSYNCSGIPROC __glewXGetVideoSyncSGI = NULL;\r\nPFNGLXWAITVIDEOSYNCSGIPROC __glewXWaitVideoSyncSGI = NULL;\r\n\r\nPFNGLXGETTRANSPARENTINDEXSUNPROC __glewXGetTransparentIndexSUN = NULL;\r\n\r\nPFNGLXGETVIDEORESIZESUNPROC __glewXGetVideoResizeSUN = NULL;\r\nPFNGLXVIDEORESIZESUNPROC __glewXVideoResizeSUN = NULL;\r\n\r\n#if !defined(GLEW_MX)\r\n\r\nGLboolean __GLXEW_VERSION_1_0 = GL_FALSE;\r\nGLboolean __GLXEW_VERSION_1_1 = GL_FALSE;\r\nGLboolean __GLXEW_VERSION_1_2 = GL_FALSE;\r\nGLboolean __GLXEW_VERSION_1_3 = GL_FALSE;\r\nGLboolean __GLXEW_VERSION_1_4 = GL_FALSE;\r\nGLboolean __GLXEW_3DFX_multisample = GL_FALSE;\r\nGLboolean __GLXEW_ARB_create_context = GL_FALSE;\r\nGLboolean __GLXEW_ARB_create_context_profile = GL_FALSE;\r\nGLboolean __GLXEW_ARB_fbconfig_float = GL_FALSE;\r\nGLboolean __GLXEW_ARB_framebuffer_sRGB = GL_FALSE;\r\nGLboolean __GLXEW_ARB_get_proc_address = GL_FALSE;\r\nGLboolean __GLXEW_ARB_multisample = GL_FALSE;\r\nGLboolean __GLXEW_ATI_pixel_format_float = GL_FALSE;\r\nGLboolean __GLXEW_ATI_render_texture = GL_FALSE;\r\nGLboolean __GLXEW_EXT_fbconfig_packed_float = GL_FALSE;\r\nGLboolean __GLXEW_EXT_framebuffer_sRGB = GL_FALSE;\r\nGLboolean __GLXEW_EXT_import_context = GL_FALSE;\r\nGLboolean __GLXEW_EXT_scene_marker = GL_FALSE;\r\nGLboolean __GLXEW_EXT_swap_control = GL_FALSE;\r\nGLboolean __GLXEW_EXT_texture_from_pixmap = GL_FALSE;\r\nGLboolean __GLXEW_EXT_visual_info = GL_FALSE;\r\nGLboolean __GLXEW_EXT_visual_rating = GL_FALSE;\r\nGLboolean __GLXEW_INTEL_swap_event = GL_FALSE;\r\nGLboolean __GLXEW_MESA_agp_offset = GL_FALSE;\r\nGLboolean __GLXEW_MESA_copy_sub_buffer = GL_FALSE;\r\nGLboolean __GLXEW_MESA_pixmap_colormap = GL_FALSE;\r\nGLboolean __GLXEW_MESA_release_buffers = GL_FALSE;\r\nGLboolean __GLXEW_MESA_set_3dfx_mode = GL_FALSE;\r\nGLboolean __GLXEW_NV_copy_image = GL_FALSE;\r\nGLboolean __GLXEW_NV_float_buffer = GL_FALSE;\r\nGLboolean __GLXEW_NV_present_video = GL_FALSE;\r\nGLboolean __GLXEW_NV_swap_group = GL_FALSE;\r\nGLboolean __GLXEW_NV_vertex_array_range = GL_FALSE;\r\nGLboolean __GLXEW_NV_video_output = GL_FALSE;\r\nGLboolean __GLXEW_OML_swap_method = GL_FALSE;\r\n#ifdef GLX_OML_sync_control\r\nGLboolean __GLXEW_OML_sync_control = GL_FALSE;\r\n#endif\r\nGLboolean __GLXEW_SGIS_blended_overlay = GL_FALSE;\r\nGLboolean __GLXEW_SGIS_color_range = GL_FALSE;\r\nGLboolean __GLXEW_SGIS_multisample = GL_FALSE;\r\nGLboolean __GLXEW_SGIS_shared_multisample = GL_FALSE;\r\nGLboolean __GLXEW_SGIX_fbconfig = GL_FALSE;\r\nGLboolean __GLXEW_SGIX_hyperpipe = GL_FALSE;\r\nGLboolean __GLXEW_SGIX_pbuffer = GL_FALSE;\r\nGLboolean __GLXEW_SGIX_swap_barrier = GL_FALSE;\r\nGLboolean __GLXEW_SGIX_swap_group = GL_FALSE;\r\nGLboolean __GLXEW_SGIX_video_resize = GL_FALSE;\r\nGLboolean __GLXEW_SGIX_visual_select_group = GL_FALSE;\r\nGLboolean __GLXEW_SGI_cushion = GL_FALSE;\r\nGLboolean __GLXEW_SGI_make_current_read = GL_FALSE;\r\nGLboolean __GLXEW_SGI_swap_control = GL_FALSE;\r\nGLboolean __GLXEW_SGI_video_sync = GL_FALSE;\r\nGLboolean __GLXEW_SUN_get_transparent_index = GL_FALSE;\r\nGLboolean __GLXEW_SUN_video_resize = GL_FALSE;\r\n\r\n#endif /* !GLEW_MX */\r\n\r\n#ifdef GLX_VERSION_1_2\r\n\r\nstatic GLboolean _glewInit_GLX_VERSION_1_2 (GLXEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glXGetCurrentDisplay = (PFNGLXGETCURRENTDISPLAYPROC)glewGetProcAddress((const GLubyte*)\"glXGetCurrentDisplay\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GLX_VERSION_1_2 */\r\n\r\n#ifdef GLX_VERSION_1_3\r\n\r\nstatic GLboolean _glewInit_GLX_VERSION_1_3 (GLXEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glXChooseFBConfig = (PFNGLXCHOOSEFBCONFIGPROC)glewGetProcAddress((const GLubyte*)\"glXChooseFBConfig\")) == NULL) || r;\r\n  r = ((glXCreateNewContext = (PFNGLXCREATENEWCONTEXTPROC)glewGetProcAddress((const GLubyte*)\"glXCreateNewContext\")) == NULL) || r;\r\n  r = ((glXCreatePbuffer = (PFNGLXCREATEPBUFFERPROC)glewGetProcAddress((const GLubyte*)\"glXCreatePbuffer\")) == NULL) || r;\r\n  r = ((glXCreatePixmap = (PFNGLXCREATEPIXMAPPROC)glewGetProcAddress((const GLubyte*)\"glXCreatePixmap\")) == NULL) || r;\r\n  r = ((glXCreateWindow = (PFNGLXCREATEWINDOWPROC)glewGetProcAddress((const GLubyte*)\"glXCreateWindow\")) == NULL) || r;\r\n  r = ((glXDestroyPbuffer = (PFNGLXDESTROYPBUFFERPROC)glewGetProcAddress((const GLubyte*)\"glXDestroyPbuffer\")) == NULL) || r;\r\n  r = ((glXDestroyPixmap = (PFNGLXDESTROYPIXMAPPROC)glewGetProcAddress((const GLubyte*)\"glXDestroyPixmap\")) == NULL) || r;\r\n  r = ((glXDestroyWindow = (PFNGLXDESTROYWINDOWPROC)glewGetProcAddress((const GLubyte*)\"glXDestroyWindow\")) == NULL) || r;\r\n  r = ((glXGetCurrentReadDrawable = (PFNGLXGETCURRENTREADDRAWABLEPROC)glewGetProcAddress((const GLubyte*)\"glXGetCurrentReadDrawable\")) == NULL) || r;\r\n  r = ((glXGetFBConfigAttrib = (PFNGLXGETFBCONFIGATTRIBPROC)glewGetProcAddress((const GLubyte*)\"glXGetFBConfigAttrib\")) == NULL) || r;\r\n  r = ((glXGetFBConfigs = (PFNGLXGETFBCONFIGSPROC)glewGetProcAddress((const GLubyte*)\"glXGetFBConfigs\")) == NULL) || r;\r\n  r = ((glXGetSelectedEvent = (PFNGLXGETSELECTEDEVENTPROC)glewGetProcAddress((const GLubyte*)\"glXGetSelectedEvent\")) == NULL) || r;\r\n  r = ((glXGetVisualFromFBConfig = (PFNGLXGETVISUALFROMFBCONFIGPROC)glewGetProcAddress((const GLubyte*)\"glXGetVisualFromFBConfig\")) == NULL) || r;\r\n  r = ((glXMakeContextCurrent = (PFNGLXMAKECONTEXTCURRENTPROC)glewGetProcAddress((const GLubyte*)\"glXMakeContextCurrent\")) == NULL) || r;\r\n  r = ((glXQueryContext = (PFNGLXQUERYCONTEXTPROC)glewGetProcAddress((const GLubyte*)\"glXQueryContext\")) == NULL) || r;\r\n  r = ((glXQueryDrawable = (PFNGLXQUERYDRAWABLEPROC)glewGetProcAddress((const GLubyte*)\"glXQueryDrawable\")) == NULL) || r;\r\n  r = ((glXSelectEvent = (PFNGLXSELECTEVENTPROC)glewGetProcAddress((const GLubyte*)\"glXSelectEvent\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GLX_VERSION_1_3 */\r\n\r\n#ifdef GLX_VERSION_1_4\r\n\r\n#endif /* GLX_VERSION_1_4 */\r\n\r\n#ifdef GLX_3DFX_multisample\r\n\r\n#endif /* GLX_3DFX_multisample */\r\n\r\n#ifdef GLX_ARB_create_context\r\n\r\nstatic GLboolean _glewInit_GLX_ARB_create_context (GLXEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glXCreateContextAttribsARB = (PFNGLXCREATECONTEXTATTRIBSARBPROC)glewGetProcAddress((const GLubyte*)\"glXCreateContextAttribsARB\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GLX_ARB_create_context */\r\n\r\n#ifdef GLX_ARB_create_context_profile\r\n\r\n#endif /* GLX_ARB_create_context_profile */\r\n\r\n#ifdef GLX_ARB_fbconfig_float\r\n\r\n#endif /* GLX_ARB_fbconfig_float */\r\n\r\n#ifdef GLX_ARB_framebuffer_sRGB\r\n\r\n#endif /* GLX_ARB_framebuffer_sRGB */\r\n\r\n#ifdef GLX_ARB_get_proc_address\r\n\r\n#endif /* GLX_ARB_get_proc_address */\r\n\r\n#ifdef GLX_ARB_multisample\r\n\r\n#endif /* GLX_ARB_multisample */\r\n\r\n#ifdef GLX_ATI_pixel_format_float\r\n\r\n#endif /* GLX_ATI_pixel_format_float */\r\n\r\n#ifdef GLX_ATI_render_texture\r\n\r\nstatic GLboolean _glewInit_GLX_ATI_render_texture (GLXEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glXBindTexImageATI = (PFNGLXBINDTEXIMAGEATIPROC)glewGetProcAddress((const GLubyte*)\"glXBindTexImageATI\")) == NULL) || r;\r\n  r = ((glXDrawableAttribATI = (PFNGLXDRAWABLEATTRIBATIPROC)glewGetProcAddress((const GLubyte*)\"glXDrawableAttribATI\")) == NULL) || r;\r\n  r = ((glXReleaseTexImageATI = (PFNGLXRELEASETEXIMAGEATIPROC)glewGetProcAddress((const GLubyte*)\"glXReleaseTexImageATI\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GLX_ATI_render_texture */\r\n\r\n#ifdef GLX_EXT_fbconfig_packed_float\r\n\r\n#endif /* GLX_EXT_fbconfig_packed_float */\r\n\r\n#ifdef GLX_EXT_framebuffer_sRGB\r\n\r\n#endif /* GLX_EXT_framebuffer_sRGB */\r\n\r\n#ifdef GLX_EXT_import_context\r\n\r\nstatic GLboolean _glewInit_GLX_EXT_import_context (GLXEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glXFreeContextEXT = (PFNGLXFREECONTEXTEXTPROC)glewGetProcAddress((const GLubyte*)\"glXFreeContextEXT\")) == NULL) || r;\r\n  r = ((glXGetContextIDEXT = (PFNGLXGETCONTEXTIDEXTPROC)glewGetProcAddress((const GLubyte*)\"glXGetContextIDEXT\")) == NULL) || r;\r\n  r = ((glXImportContextEXT = (PFNGLXIMPORTCONTEXTEXTPROC)glewGetProcAddress((const GLubyte*)\"glXImportContextEXT\")) == NULL) || r;\r\n  r = ((glXQueryContextInfoEXT = (PFNGLXQUERYCONTEXTINFOEXTPROC)glewGetProcAddress((const GLubyte*)\"glXQueryContextInfoEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GLX_EXT_import_context */\r\n\r\n#ifdef GLX_EXT_scene_marker\r\n\r\n#endif /* GLX_EXT_scene_marker */\r\n\r\n#ifdef GLX_EXT_swap_control\r\n\r\nstatic GLboolean _glewInit_GLX_EXT_swap_control (GLXEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glXSwapIntervalEXT = (PFNGLXSWAPINTERVALEXTPROC)glewGetProcAddress((const GLubyte*)\"glXSwapIntervalEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GLX_EXT_swap_control */\r\n\r\n#ifdef GLX_EXT_texture_from_pixmap\r\n\r\nstatic GLboolean _glewInit_GLX_EXT_texture_from_pixmap (GLXEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glXBindTexImageEXT = (PFNGLXBINDTEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)\"glXBindTexImageEXT\")) == NULL) || r;\r\n  r = ((glXReleaseTexImageEXT = (PFNGLXRELEASETEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)\"glXReleaseTexImageEXT\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GLX_EXT_texture_from_pixmap */\r\n\r\n#ifdef GLX_EXT_visual_info\r\n\r\n#endif /* GLX_EXT_visual_info */\r\n\r\n#ifdef GLX_EXT_visual_rating\r\n\r\n#endif /* GLX_EXT_visual_rating */\r\n\r\n#ifdef GLX_INTEL_swap_event\r\n\r\n#endif /* GLX_INTEL_swap_event */\r\n\r\n#ifdef GLX_MESA_agp_offset\r\n\r\nstatic GLboolean _glewInit_GLX_MESA_agp_offset (GLXEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glXGetAGPOffsetMESA = (PFNGLXGETAGPOFFSETMESAPROC)glewGetProcAddress((const GLubyte*)\"glXGetAGPOffsetMESA\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GLX_MESA_agp_offset */\r\n\r\n#ifdef GLX_MESA_copy_sub_buffer\r\n\r\nstatic GLboolean _glewInit_GLX_MESA_copy_sub_buffer (GLXEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glXCopySubBufferMESA = (PFNGLXCOPYSUBBUFFERMESAPROC)glewGetProcAddress((const GLubyte*)\"glXCopySubBufferMESA\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GLX_MESA_copy_sub_buffer */\r\n\r\n#ifdef GLX_MESA_pixmap_colormap\r\n\r\nstatic GLboolean _glewInit_GLX_MESA_pixmap_colormap (GLXEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glXCreateGLXPixmapMESA = (PFNGLXCREATEGLXPIXMAPMESAPROC)glewGetProcAddress((const GLubyte*)\"glXCreateGLXPixmapMESA\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GLX_MESA_pixmap_colormap */\r\n\r\n#ifdef GLX_MESA_release_buffers\r\n\r\nstatic GLboolean _glewInit_GLX_MESA_release_buffers (GLXEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glXReleaseBuffersMESA = (PFNGLXRELEASEBUFFERSMESAPROC)glewGetProcAddress((const GLubyte*)\"glXReleaseBuffersMESA\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GLX_MESA_release_buffers */\r\n\r\n#ifdef GLX_MESA_set_3dfx_mode\r\n\r\nstatic GLboolean _glewInit_GLX_MESA_set_3dfx_mode (GLXEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glXSet3DfxModeMESA = (PFNGLXSET3DFXMODEMESAPROC)glewGetProcAddress((const GLubyte*)\"glXSet3DfxModeMESA\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GLX_MESA_set_3dfx_mode */\r\n\r\n#ifdef GLX_NV_copy_image\r\n\r\nstatic GLboolean _glewInit_GLX_NV_copy_image (GLXEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glXCopyImageSubDataNV = (PFNGLXCOPYIMAGESUBDATANVPROC)glewGetProcAddress((const GLubyte*)\"glXCopyImageSubDataNV\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GLX_NV_copy_image */\r\n\r\n#ifdef GLX_NV_float_buffer\r\n\r\n#endif /* GLX_NV_float_buffer */\r\n\r\n#ifdef GLX_NV_present_video\r\n\r\nstatic GLboolean _glewInit_GLX_NV_present_video (GLXEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glXBindVideoDeviceNV = (PFNGLXBINDVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)\"glXBindVideoDeviceNV\")) == NULL) || r;\r\n  r = ((glXEnumerateVideoDevicesNV = (PFNGLXENUMERATEVIDEODEVICESNVPROC)glewGetProcAddress((const GLubyte*)\"glXEnumerateVideoDevicesNV\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GLX_NV_present_video */\r\n\r\n#ifdef GLX_NV_swap_group\r\n\r\nstatic GLboolean _glewInit_GLX_NV_swap_group (GLXEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glXBindSwapBarrierNV = (PFNGLXBINDSWAPBARRIERNVPROC)glewGetProcAddress((const GLubyte*)\"glXBindSwapBarrierNV\")) == NULL) || r;\r\n  r = ((glXJoinSwapGroupNV = (PFNGLXJOINSWAPGROUPNVPROC)glewGetProcAddress((const GLubyte*)\"glXJoinSwapGroupNV\")) == NULL) || r;\r\n  r = ((glXQueryFrameCountNV = (PFNGLXQUERYFRAMECOUNTNVPROC)glewGetProcAddress((const GLubyte*)\"glXQueryFrameCountNV\")) == NULL) || r;\r\n  r = ((glXQueryMaxSwapGroupsNV = (PFNGLXQUERYMAXSWAPGROUPSNVPROC)glewGetProcAddress((const GLubyte*)\"glXQueryMaxSwapGroupsNV\")) == NULL) || r;\r\n  r = ((glXQuerySwapGroupNV = (PFNGLXQUERYSWAPGROUPNVPROC)glewGetProcAddress((const GLubyte*)\"glXQuerySwapGroupNV\")) == NULL) || r;\r\n  r = ((glXResetFrameCountNV = (PFNGLXRESETFRAMECOUNTNVPROC)glewGetProcAddress((const GLubyte*)\"glXResetFrameCountNV\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GLX_NV_swap_group */\r\n\r\n#ifdef GLX_NV_vertex_array_range\r\n\r\nstatic GLboolean _glewInit_GLX_NV_vertex_array_range (GLXEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glXAllocateMemoryNV = (PFNGLXALLOCATEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)\"glXAllocateMemoryNV\")) == NULL) || r;\r\n  r = ((glXFreeMemoryNV = (PFNGLXFREEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)\"glXFreeMemoryNV\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GLX_NV_vertex_array_range */\r\n\r\n#ifdef GLX_NV_video_output\r\n\r\nstatic GLboolean _glewInit_GLX_NV_video_output (GLXEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glXBindVideoImageNV = (PFNGLXBINDVIDEOIMAGENVPROC)glewGetProcAddress((const GLubyte*)\"glXBindVideoImageNV\")) == NULL) || r;\r\n  r = ((glXGetVideoDeviceNV = (PFNGLXGETVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)\"glXGetVideoDeviceNV\")) == NULL) || r;\r\n  r = ((glXGetVideoInfoNV = (PFNGLXGETVIDEOINFONVPROC)glewGetProcAddress((const GLubyte*)\"glXGetVideoInfoNV\")) == NULL) || r;\r\n  r = ((glXReleaseVideoDeviceNV = (PFNGLXRELEASEVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)\"glXReleaseVideoDeviceNV\")) == NULL) || r;\r\n  r = ((glXReleaseVideoImageNV = (PFNGLXRELEASEVIDEOIMAGENVPROC)glewGetProcAddress((const GLubyte*)\"glXReleaseVideoImageNV\")) == NULL) || r;\r\n  r = ((glXSendPbufferToVideoNV = (PFNGLXSENDPBUFFERTOVIDEONVPROC)glewGetProcAddress((const GLubyte*)\"glXSendPbufferToVideoNV\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GLX_NV_video_output */\r\n\r\n#ifdef GLX_OML_swap_method\r\n\r\n#endif /* GLX_OML_swap_method */\r\n\r\n#if defined(GLX_OML_sync_control) && defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)\r\n#include <inttypes.h>\r\n\r\nstatic GLboolean _glewInit_GLX_OML_sync_control (GLXEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glXGetMscRateOML = (PFNGLXGETMSCRATEOMLPROC)glewGetProcAddress((const GLubyte*)\"glXGetMscRateOML\")) == NULL) || r;\r\n  r = ((glXGetSyncValuesOML = (PFNGLXGETSYNCVALUESOMLPROC)glewGetProcAddress((const GLubyte*)\"glXGetSyncValuesOML\")) == NULL) || r;\r\n  r = ((glXSwapBuffersMscOML = (PFNGLXSWAPBUFFERSMSCOMLPROC)glewGetProcAddress((const GLubyte*)\"glXSwapBuffersMscOML\")) == NULL) || r;\r\n  r = ((glXWaitForMscOML = (PFNGLXWAITFORMSCOMLPROC)glewGetProcAddress((const GLubyte*)\"glXWaitForMscOML\")) == NULL) || r;\r\n  r = ((glXWaitForSbcOML = (PFNGLXWAITFORSBCOMLPROC)glewGetProcAddress((const GLubyte*)\"glXWaitForSbcOML\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GLX_OML_sync_control */\r\n\r\n#ifdef GLX_SGIS_blended_overlay\r\n\r\n#endif /* GLX_SGIS_blended_overlay */\r\n\r\n#ifdef GLX_SGIS_color_range\r\n\r\n#endif /* GLX_SGIS_color_range */\r\n\r\n#ifdef GLX_SGIS_multisample\r\n\r\n#endif /* GLX_SGIS_multisample */\r\n\r\n#ifdef GLX_SGIS_shared_multisample\r\n\r\n#endif /* GLX_SGIS_shared_multisample */\r\n\r\n#ifdef GLX_SGIX_fbconfig\r\n\r\nstatic GLboolean _glewInit_GLX_SGIX_fbconfig (GLXEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glXChooseFBConfigSGIX = (PFNGLXCHOOSEFBCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)\"glXChooseFBConfigSGIX\")) == NULL) || r;\r\n  r = ((glXCreateContextWithConfigSGIX = (PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)\"glXCreateContextWithConfigSGIX\")) == NULL) || r;\r\n  r = ((glXCreateGLXPixmapWithConfigSGIX = (PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)\"glXCreateGLXPixmapWithConfigSGIX\")) == NULL) || r;\r\n  r = ((glXGetFBConfigAttribSGIX = (PFNGLXGETFBCONFIGATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)\"glXGetFBConfigAttribSGIX\")) == NULL) || r;\r\n  r = ((glXGetFBConfigFromVisualSGIX = (PFNGLXGETFBCONFIGFROMVISUALSGIXPROC)glewGetProcAddress((const GLubyte*)\"glXGetFBConfigFromVisualSGIX\")) == NULL) || r;\r\n  r = ((glXGetVisualFromFBConfigSGIX = (PFNGLXGETVISUALFROMFBCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)\"glXGetVisualFromFBConfigSGIX\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GLX_SGIX_fbconfig */\r\n\r\n#ifdef GLX_SGIX_hyperpipe\r\n\r\nstatic GLboolean _glewInit_GLX_SGIX_hyperpipe (GLXEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glXBindHyperpipeSGIX = (PFNGLXBINDHYPERPIPESGIXPROC)glewGetProcAddress((const GLubyte*)\"glXBindHyperpipeSGIX\")) == NULL) || r;\r\n  r = ((glXDestroyHyperpipeConfigSGIX = (PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)\"glXDestroyHyperpipeConfigSGIX\")) == NULL) || r;\r\n  r = ((glXHyperpipeAttribSGIX = (PFNGLXHYPERPIPEATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)\"glXHyperpipeAttribSGIX\")) == NULL) || r;\r\n  r = ((glXHyperpipeConfigSGIX = (PFNGLXHYPERPIPECONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)\"glXHyperpipeConfigSGIX\")) == NULL) || r;\r\n  r = ((glXQueryHyperpipeAttribSGIX = (PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)\"glXQueryHyperpipeAttribSGIX\")) == NULL) || r;\r\n  r = ((glXQueryHyperpipeBestAttribSGIX = (PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)\"glXQueryHyperpipeBestAttribSGIX\")) == NULL) || r;\r\n  r = ((glXQueryHyperpipeConfigSGIX = (PFNGLXQUERYHYPERPIPECONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)\"glXQueryHyperpipeConfigSGIX\")) == NULL) || r;\r\n  r = ((glXQueryHyperpipeNetworkSGIX = (PFNGLXQUERYHYPERPIPENETWORKSGIXPROC)glewGetProcAddress((const GLubyte*)\"glXQueryHyperpipeNetworkSGIX\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GLX_SGIX_hyperpipe */\r\n\r\n#ifdef GLX_SGIX_pbuffer\r\n\r\nstatic GLboolean _glewInit_GLX_SGIX_pbuffer (GLXEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glXCreateGLXPbufferSGIX = (PFNGLXCREATEGLXPBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)\"glXCreateGLXPbufferSGIX\")) == NULL) || r;\r\n  r = ((glXDestroyGLXPbufferSGIX = (PFNGLXDESTROYGLXPBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)\"glXDestroyGLXPbufferSGIX\")) == NULL) || r;\r\n  r = ((glXGetSelectedEventSGIX = (PFNGLXGETSELECTEDEVENTSGIXPROC)glewGetProcAddress((const GLubyte*)\"glXGetSelectedEventSGIX\")) == NULL) || r;\r\n  r = ((glXQueryGLXPbufferSGIX = (PFNGLXQUERYGLXPBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)\"glXQueryGLXPbufferSGIX\")) == NULL) || r;\r\n  r = ((glXSelectEventSGIX = (PFNGLXSELECTEVENTSGIXPROC)glewGetProcAddress((const GLubyte*)\"glXSelectEventSGIX\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GLX_SGIX_pbuffer */\r\n\r\n#ifdef GLX_SGIX_swap_barrier\r\n\r\nstatic GLboolean _glewInit_GLX_SGIX_swap_barrier (GLXEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glXBindSwapBarrierSGIX = (PFNGLXBINDSWAPBARRIERSGIXPROC)glewGetProcAddress((const GLubyte*)\"glXBindSwapBarrierSGIX\")) == NULL) || r;\r\n  r = ((glXQueryMaxSwapBarriersSGIX = (PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC)glewGetProcAddress((const GLubyte*)\"glXQueryMaxSwapBarriersSGIX\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GLX_SGIX_swap_barrier */\r\n\r\n#ifdef GLX_SGIX_swap_group\r\n\r\nstatic GLboolean _glewInit_GLX_SGIX_swap_group (GLXEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glXJoinSwapGroupSGIX = (PFNGLXJOINSWAPGROUPSGIXPROC)glewGetProcAddress((const GLubyte*)\"glXJoinSwapGroupSGIX\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GLX_SGIX_swap_group */\r\n\r\n#ifdef GLX_SGIX_video_resize\r\n\r\nstatic GLboolean _glewInit_GLX_SGIX_video_resize (GLXEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glXBindChannelToWindowSGIX = (PFNGLXBINDCHANNELTOWINDOWSGIXPROC)glewGetProcAddress((const GLubyte*)\"glXBindChannelToWindowSGIX\")) == NULL) || r;\r\n  r = ((glXChannelRectSGIX = (PFNGLXCHANNELRECTSGIXPROC)glewGetProcAddress((const GLubyte*)\"glXChannelRectSGIX\")) == NULL) || r;\r\n  r = ((glXChannelRectSyncSGIX = (PFNGLXCHANNELRECTSYNCSGIXPROC)glewGetProcAddress((const GLubyte*)\"glXChannelRectSyncSGIX\")) == NULL) || r;\r\n  r = ((glXQueryChannelDeltasSGIX = (PFNGLXQUERYCHANNELDELTASSGIXPROC)glewGetProcAddress((const GLubyte*)\"glXQueryChannelDeltasSGIX\")) == NULL) || r;\r\n  r = ((glXQueryChannelRectSGIX = (PFNGLXQUERYCHANNELRECTSGIXPROC)glewGetProcAddress((const GLubyte*)\"glXQueryChannelRectSGIX\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GLX_SGIX_video_resize */\r\n\r\n#ifdef GLX_SGIX_visual_select_group\r\n\r\n#endif /* GLX_SGIX_visual_select_group */\r\n\r\n#ifdef GLX_SGI_cushion\r\n\r\nstatic GLboolean _glewInit_GLX_SGI_cushion (GLXEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glXCushionSGI = (PFNGLXCUSHIONSGIPROC)glewGetProcAddress((const GLubyte*)\"glXCushionSGI\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GLX_SGI_cushion */\r\n\r\n#ifdef GLX_SGI_make_current_read\r\n\r\nstatic GLboolean _glewInit_GLX_SGI_make_current_read (GLXEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glXGetCurrentReadDrawableSGI = (PFNGLXGETCURRENTREADDRAWABLESGIPROC)glewGetProcAddress((const GLubyte*)\"glXGetCurrentReadDrawableSGI\")) == NULL) || r;\r\n  r = ((glXMakeCurrentReadSGI = (PFNGLXMAKECURRENTREADSGIPROC)glewGetProcAddress((const GLubyte*)\"glXMakeCurrentReadSGI\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GLX_SGI_make_current_read */\r\n\r\n#ifdef GLX_SGI_swap_control\r\n\r\nstatic GLboolean _glewInit_GLX_SGI_swap_control (GLXEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glXSwapIntervalSGI = (PFNGLXSWAPINTERVALSGIPROC)glewGetProcAddress((const GLubyte*)\"glXSwapIntervalSGI\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GLX_SGI_swap_control */\r\n\r\n#ifdef GLX_SGI_video_sync\r\n\r\nstatic GLboolean _glewInit_GLX_SGI_video_sync (GLXEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glXGetVideoSyncSGI = (PFNGLXGETVIDEOSYNCSGIPROC)glewGetProcAddress((const GLubyte*)\"glXGetVideoSyncSGI\")) == NULL) || r;\r\n  r = ((glXWaitVideoSyncSGI = (PFNGLXWAITVIDEOSYNCSGIPROC)glewGetProcAddress((const GLubyte*)\"glXWaitVideoSyncSGI\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GLX_SGI_video_sync */\r\n\r\n#ifdef GLX_SUN_get_transparent_index\r\n\r\nstatic GLboolean _glewInit_GLX_SUN_get_transparent_index (GLXEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glXGetTransparentIndexSUN = (PFNGLXGETTRANSPARENTINDEXSUNPROC)glewGetProcAddress((const GLubyte*)\"glXGetTransparentIndexSUN\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GLX_SUN_get_transparent_index */\r\n\r\n#ifdef GLX_SUN_video_resize\r\n\r\nstatic GLboolean _glewInit_GLX_SUN_video_resize (GLXEW_CONTEXT_ARG_DEF_INIT)\r\n{\r\n  GLboolean r = GL_FALSE;\r\n\r\n  r = ((glXGetVideoResizeSUN = (PFNGLXGETVIDEORESIZESUNPROC)glewGetProcAddress((const GLubyte*)\"glXGetVideoResizeSUN\")) == NULL) || r;\r\n  r = ((glXVideoResizeSUN = (PFNGLXVIDEORESIZESUNPROC)glewGetProcAddress((const GLubyte*)\"glXVideoResizeSUN\")) == NULL) || r;\r\n\r\n  return r;\r\n}\r\n\r\n#endif /* GLX_SUN_video_resize */\r\n\r\n/* ------------------------------------------------------------------------ */\r\n\r\nGLboolean glxewGetExtension (const char* name)\r\n{    \r\n  GLubyte* p;\r\n  GLubyte* end;\r\n  GLuint len;\r\n\r\n  if (glXGetCurrentDisplay == NULL) return GL_FALSE;\r\n  len = _glewStrLen((const GLubyte*)name);\r\n  p = (GLubyte*)glXGetClientString(glXGetCurrentDisplay(), GLX_EXTENSIONS);\r\n  if (0 == p) return GL_FALSE;\r\n  end = p + _glewStrLen(p);\r\n  while (p < end)\r\n  {\r\n    GLuint n = _glewStrCLen(p, ' ');\r\n    if (len == n && _glewStrSame((const GLubyte*)name, p, n)) return GL_TRUE;\r\n    p += n+1;\r\n  }\r\n  return GL_FALSE;\r\n}\r\n\r\nGLenum glxewContextInit (GLXEW_CONTEXT_ARG_DEF_LIST)\r\n{\r\n  int major, minor;\r\n  /* initialize core GLX 1.2 */\r\n  if (_glewInit_GLX_VERSION_1_2(GLEW_CONTEXT_ARG_VAR_INIT)) return GLEW_ERROR_GLX_VERSION_11_ONLY;\r\n  /* initialize flags */\r\n  CONST_CAST(GLXEW_VERSION_1_0) = GL_TRUE;\r\n  CONST_CAST(GLXEW_VERSION_1_1) = GL_TRUE;\r\n  CONST_CAST(GLXEW_VERSION_1_2) = GL_TRUE;\r\n  CONST_CAST(GLXEW_VERSION_1_3) = GL_TRUE;\r\n  CONST_CAST(GLXEW_VERSION_1_4) = GL_TRUE;\r\n  /* query GLX version */\r\n  glXQueryVersion(glXGetCurrentDisplay(), &major, &minor);\r\n  if (major == 1 && minor <= 3)\r\n  {\r\n    switch (minor)\r\n    {\r\n      case 3:\r\n      CONST_CAST(GLXEW_VERSION_1_4) = GL_FALSE;\r\n      break;\r\n      case 2:\r\n      CONST_CAST(GLXEW_VERSION_1_4) = GL_FALSE;\r\n      CONST_CAST(GLXEW_VERSION_1_3) = GL_FALSE;\r\n      break;\r\n      default:\r\n      return GLEW_ERROR_GLX_VERSION_11_ONLY;\r\n      break;\r\n    }\r\n  }\r\n  /* initialize extensions */\r\n#ifdef GLX_VERSION_1_3\r\n  if (glewExperimental || GLXEW_VERSION_1_3) CONST_CAST(GLXEW_VERSION_1_3) = !_glewInit_GLX_VERSION_1_3(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GLX_VERSION_1_3 */\r\n#ifdef GLX_3DFX_multisample\r\n  CONST_CAST(GLXEW_3DFX_multisample) = glxewGetExtension(\"GLX_3DFX_multisample\");\r\n#endif /* GLX_3DFX_multisample */\r\n#ifdef GLX_ARB_create_context\r\n  CONST_CAST(GLXEW_ARB_create_context) = glxewGetExtension(\"GLX_ARB_create_context\");\r\n  if (glewExperimental || GLXEW_ARB_create_context) CONST_CAST(GLXEW_ARB_create_context) = !_glewInit_GLX_ARB_create_context(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GLX_ARB_create_context */\r\n#ifdef GLX_ARB_create_context_profile\r\n  CONST_CAST(GLXEW_ARB_create_context_profile) = glxewGetExtension(\"GLX_ARB_create_context_profile\");\r\n#endif /* GLX_ARB_create_context_profile */\r\n#ifdef GLX_ARB_fbconfig_float\r\n  CONST_CAST(GLXEW_ARB_fbconfig_float) = glxewGetExtension(\"GLX_ARB_fbconfig_float\");\r\n#endif /* GLX_ARB_fbconfig_float */\r\n#ifdef GLX_ARB_framebuffer_sRGB\r\n  CONST_CAST(GLXEW_ARB_framebuffer_sRGB) = glxewGetExtension(\"GLX_ARB_framebuffer_sRGB\");\r\n#endif /* GLX_ARB_framebuffer_sRGB */\r\n#ifdef GLX_ARB_get_proc_address\r\n  CONST_CAST(GLXEW_ARB_get_proc_address) = glxewGetExtension(\"GLX_ARB_get_proc_address\");\r\n#endif /* GLX_ARB_get_proc_address */\r\n#ifdef GLX_ARB_multisample\r\n  CONST_CAST(GLXEW_ARB_multisample) = glxewGetExtension(\"GLX_ARB_multisample\");\r\n#endif /* GLX_ARB_multisample */\r\n#ifdef GLX_ATI_pixel_format_float\r\n  CONST_CAST(GLXEW_ATI_pixel_format_float) = glxewGetExtension(\"GLX_ATI_pixel_format_float\");\r\n#endif /* GLX_ATI_pixel_format_float */\r\n#ifdef GLX_ATI_render_texture\r\n  CONST_CAST(GLXEW_ATI_render_texture) = glxewGetExtension(\"GLX_ATI_render_texture\");\r\n  if (glewExperimental || GLXEW_ATI_render_texture) CONST_CAST(GLXEW_ATI_render_texture) = !_glewInit_GLX_ATI_render_texture(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GLX_ATI_render_texture */\r\n#ifdef GLX_EXT_fbconfig_packed_float\r\n  CONST_CAST(GLXEW_EXT_fbconfig_packed_float) = glxewGetExtension(\"GLX_EXT_fbconfig_packed_float\");\r\n#endif /* GLX_EXT_fbconfig_packed_float */\r\n#ifdef GLX_EXT_framebuffer_sRGB\r\n  CONST_CAST(GLXEW_EXT_framebuffer_sRGB) = glxewGetExtension(\"GLX_EXT_framebuffer_sRGB\");\r\n#endif /* GLX_EXT_framebuffer_sRGB */\r\n#ifdef GLX_EXT_import_context\r\n  CONST_CAST(GLXEW_EXT_import_context) = glxewGetExtension(\"GLX_EXT_import_context\");\r\n  if (glewExperimental || GLXEW_EXT_import_context) CONST_CAST(GLXEW_EXT_import_context) = !_glewInit_GLX_EXT_import_context(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GLX_EXT_import_context */\r\n#ifdef GLX_EXT_scene_marker\r\n  CONST_CAST(GLXEW_EXT_scene_marker) = glxewGetExtension(\"GLX_EXT_scene_marker\");\r\n#endif /* GLX_EXT_scene_marker */\r\n#ifdef GLX_EXT_swap_control\r\n  CONST_CAST(GLXEW_EXT_swap_control) = glxewGetExtension(\"GLX_EXT_swap_control\");\r\n  if (glewExperimental || GLXEW_EXT_swap_control) CONST_CAST(GLXEW_EXT_swap_control) = !_glewInit_GLX_EXT_swap_control(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GLX_EXT_swap_control */\r\n#ifdef GLX_EXT_texture_from_pixmap\r\n  CONST_CAST(GLXEW_EXT_texture_from_pixmap) = glxewGetExtension(\"GLX_EXT_texture_from_pixmap\");\r\n  if (glewExperimental || GLXEW_EXT_texture_from_pixmap) CONST_CAST(GLXEW_EXT_texture_from_pixmap) = !_glewInit_GLX_EXT_texture_from_pixmap(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GLX_EXT_texture_from_pixmap */\r\n#ifdef GLX_EXT_visual_info\r\n  CONST_CAST(GLXEW_EXT_visual_info) = glxewGetExtension(\"GLX_EXT_visual_info\");\r\n#endif /* GLX_EXT_visual_info */\r\n#ifdef GLX_EXT_visual_rating\r\n  CONST_CAST(GLXEW_EXT_visual_rating) = glxewGetExtension(\"GLX_EXT_visual_rating\");\r\n#endif /* GLX_EXT_visual_rating */\r\n#ifdef GLX_INTEL_swap_event\r\n  CONST_CAST(GLXEW_INTEL_swap_event) = glxewGetExtension(\"GLX_INTEL_swap_event\");\r\n#endif /* GLX_INTEL_swap_event */\r\n#ifdef GLX_MESA_agp_offset\r\n  CONST_CAST(GLXEW_MESA_agp_offset) = glxewGetExtension(\"GLX_MESA_agp_offset\");\r\n  if (glewExperimental || GLXEW_MESA_agp_offset) CONST_CAST(GLXEW_MESA_agp_offset) = !_glewInit_GLX_MESA_agp_offset(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GLX_MESA_agp_offset */\r\n#ifdef GLX_MESA_copy_sub_buffer\r\n  CONST_CAST(GLXEW_MESA_copy_sub_buffer) = glxewGetExtension(\"GLX_MESA_copy_sub_buffer\");\r\n  if (glewExperimental || GLXEW_MESA_copy_sub_buffer) CONST_CAST(GLXEW_MESA_copy_sub_buffer) = !_glewInit_GLX_MESA_copy_sub_buffer(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GLX_MESA_copy_sub_buffer */\r\n#ifdef GLX_MESA_pixmap_colormap\r\n  CONST_CAST(GLXEW_MESA_pixmap_colormap) = glxewGetExtension(\"GLX_MESA_pixmap_colormap\");\r\n  if (glewExperimental || GLXEW_MESA_pixmap_colormap) CONST_CAST(GLXEW_MESA_pixmap_colormap) = !_glewInit_GLX_MESA_pixmap_colormap(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GLX_MESA_pixmap_colormap */\r\n#ifdef GLX_MESA_release_buffers\r\n  CONST_CAST(GLXEW_MESA_release_buffers) = glxewGetExtension(\"GLX_MESA_release_buffers\");\r\n  if (glewExperimental || GLXEW_MESA_release_buffers) CONST_CAST(GLXEW_MESA_release_buffers) = !_glewInit_GLX_MESA_release_buffers(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GLX_MESA_release_buffers */\r\n#ifdef GLX_MESA_set_3dfx_mode\r\n  CONST_CAST(GLXEW_MESA_set_3dfx_mode) = glxewGetExtension(\"GLX_MESA_set_3dfx_mode\");\r\n  if (glewExperimental || GLXEW_MESA_set_3dfx_mode) CONST_CAST(GLXEW_MESA_set_3dfx_mode) = !_glewInit_GLX_MESA_set_3dfx_mode(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GLX_MESA_set_3dfx_mode */\r\n#ifdef GLX_NV_copy_image\r\n  CONST_CAST(GLXEW_NV_copy_image) = glxewGetExtension(\"GLX_NV_copy_image\");\r\n  if (glewExperimental || GLXEW_NV_copy_image) CONST_CAST(GLXEW_NV_copy_image) = !_glewInit_GLX_NV_copy_image(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GLX_NV_copy_image */\r\n#ifdef GLX_NV_float_buffer\r\n  CONST_CAST(GLXEW_NV_float_buffer) = glxewGetExtension(\"GLX_NV_float_buffer\");\r\n#endif /* GLX_NV_float_buffer */\r\n#ifdef GLX_NV_present_video\r\n  CONST_CAST(GLXEW_NV_present_video) = glxewGetExtension(\"GLX_NV_present_video\");\r\n  if (glewExperimental || GLXEW_NV_present_video) CONST_CAST(GLXEW_NV_present_video) = !_glewInit_GLX_NV_present_video(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GLX_NV_present_video */\r\n#ifdef GLX_NV_swap_group\r\n  CONST_CAST(GLXEW_NV_swap_group) = glxewGetExtension(\"GLX_NV_swap_group\");\r\n  if (glewExperimental || GLXEW_NV_swap_group) CONST_CAST(GLXEW_NV_swap_group) = !_glewInit_GLX_NV_swap_group(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GLX_NV_swap_group */\r\n#ifdef GLX_NV_vertex_array_range\r\n  CONST_CAST(GLXEW_NV_vertex_array_range) = glxewGetExtension(\"GLX_NV_vertex_array_range\");\r\n  if (glewExperimental || GLXEW_NV_vertex_array_range) CONST_CAST(GLXEW_NV_vertex_array_range) = !_glewInit_GLX_NV_vertex_array_range(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GLX_NV_vertex_array_range */\r\n#ifdef GLX_NV_video_output\r\n  CONST_CAST(GLXEW_NV_video_output) = glxewGetExtension(\"GLX_NV_video_output\");\r\n  if (glewExperimental || GLXEW_NV_video_output) CONST_CAST(GLXEW_NV_video_output) = !_glewInit_GLX_NV_video_output(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GLX_NV_video_output */\r\n#ifdef GLX_OML_swap_method\r\n  CONST_CAST(GLXEW_OML_swap_method) = glxewGetExtension(\"GLX_OML_swap_method\");\r\n#endif /* GLX_OML_swap_method */\r\n#if defined(GLX_OML_sync_control) && defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)\r\n#include <inttypes.h>\r\n  CONST_CAST(GLXEW_OML_sync_control) = glxewGetExtension(\"GLX_OML_sync_control\");\r\n  if (glewExperimental || GLXEW_OML_sync_control) CONST_CAST(GLXEW_OML_sync_control) = !_glewInit_GLX_OML_sync_control(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GLX_OML_sync_control */\r\n#ifdef GLX_SGIS_blended_overlay\r\n  CONST_CAST(GLXEW_SGIS_blended_overlay) = glxewGetExtension(\"GLX_SGIS_blended_overlay\");\r\n#endif /* GLX_SGIS_blended_overlay */\r\n#ifdef GLX_SGIS_color_range\r\n  CONST_CAST(GLXEW_SGIS_color_range) = glxewGetExtension(\"GLX_SGIS_color_range\");\r\n#endif /* GLX_SGIS_color_range */\r\n#ifdef GLX_SGIS_multisample\r\n  CONST_CAST(GLXEW_SGIS_multisample) = glxewGetExtension(\"GLX_SGIS_multisample\");\r\n#endif /* GLX_SGIS_multisample */\r\n#ifdef GLX_SGIS_shared_multisample\r\n  CONST_CAST(GLXEW_SGIS_shared_multisample) = glxewGetExtension(\"GLX_SGIS_shared_multisample\");\r\n#endif /* GLX_SGIS_shared_multisample */\r\n#ifdef GLX_SGIX_fbconfig\r\n  CONST_CAST(GLXEW_SGIX_fbconfig) = glxewGetExtension(\"GLX_SGIX_fbconfig\");\r\n  if (glewExperimental || GLXEW_SGIX_fbconfig) CONST_CAST(GLXEW_SGIX_fbconfig) = !_glewInit_GLX_SGIX_fbconfig(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GLX_SGIX_fbconfig */\r\n#ifdef GLX_SGIX_hyperpipe\r\n  CONST_CAST(GLXEW_SGIX_hyperpipe) = glxewGetExtension(\"GLX_SGIX_hyperpipe\");\r\n  if (glewExperimental || GLXEW_SGIX_hyperpipe) CONST_CAST(GLXEW_SGIX_hyperpipe) = !_glewInit_GLX_SGIX_hyperpipe(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GLX_SGIX_hyperpipe */\r\n#ifdef GLX_SGIX_pbuffer\r\n  CONST_CAST(GLXEW_SGIX_pbuffer) = glxewGetExtension(\"GLX_SGIX_pbuffer\");\r\n  if (glewExperimental || GLXEW_SGIX_pbuffer) CONST_CAST(GLXEW_SGIX_pbuffer) = !_glewInit_GLX_SGIX_pbuffer(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GLX_SGIX_pbuffer */\r\n#ifdef GLX_SGIX_swap_barrier\r\n  CONST_CAST(GLXEW_SGIX_swap_barrier) = glxewGetExtension(\"GLX_SGIX_swap_barrier\");\r\n  if (glewExperimental || GLXEW_SGIX_swap_barrier) CONST_CAST(GLXEW_SGIX_swap_barrier) = !_glewInit_GLX_SGIX_swap_barrier(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GLX_SGIX_swap_barrier */\r\n#ifdef GLX_SGIX_swap_group\r\n  CONST_CAST(GLXEW_SGIX_swap_group) = glxewGetExtension(\"GLX_SGIX_swap_group\");\r\n  if (glewExperimental || GLXEW_SGIX_swap_group) CONST_CAST(GLXEW_SGIX_swap_group) = !_glewInit_GLX_SGIX_swap_group(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GLX_SGIX_swap_group */\r\n#ifdef GLX_SGIX_video_resize\r\n  CONST_CAST(GLXEW_SGIX_video_resize) = glxewGetExtension(\"GLX_SGIX_video_resize\");\r\n  if (glewExperimental || GLXEW_SGIX_video_resize) CONST_CAST(GLXEW_SGIX_video_resize) = !_glewInit_GLX_SGIX_video_resize(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GLX_SGIX_video_resize */\r\n#ifdef GLX_SGIX_visual_select_group\r\n  CONST_CAST(GLXEW_SGIX_visual_select_group) = glxewGetExtension(\"GLX_SGIX_visual_select_group\");\r\n#endif /* GLX_SGIX_visual_select_group */\r\n#ifdef GLX_SGI_cushion\r\n  CONST_CAST(GLXEW_SGI_cushion) = glxewGetExtension(\"GLX_SGI_cushion\");\r\n  if (glewExperimental || GLXEW_SGI_cushion) CONST_CAST(GLXEW_SGI_cushion) = !_glewInit_GLX_SGI_cushion(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GLX_SGI_cushion */\r\n#ifdef GLX_SGI_make_current_read\r\n  CONST_CAST(GLXEW_SGI_make_current_read) = glxewGetExtension(\"GLX_SGI_make_current_read\");\r\n  if (glewExperimental || GLXEW_SGI_make_current_read) CONST_CAST(GLXEW_SGI_make_current_read) = !_glewInit_GLX_SGI_make_current_read(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GLX_SGI_make_current_read */\r\n#ifdef GLX_SGI_swap_control\r\n  CONST_CAST(GLXEW_SGI_swap_control) = glxewGetExtension(\"GLX_SGI_swap_control\");\r\n  if (glewExperimental || GLXEW_SGI_swap_control) CONST_CAST(GLXEW_SGI_swap_control) = !_glewInit_GLX_SGI_swap_control(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GLX_SGI_swap_control */\r\n#ifdef GLX_SGI_video_sync\r\n  CONST_CAST(GLXEW_SGI_video_sync) = glxewGetExtension(\"GLX_SGI_video_sync\");\r\n  if (glewExperimental || GLXEW_SGI_video_sync) CONST_CAST(GLXEW_SGI_video_sync) = !_glewInit_GLX_SGI_video_sync(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GLX_SGI_video_sync */\r\n#ifdef GLX_SUN_get_transparent_index\r\n  CONST_CAST(GLXEW_SUN_get_transparent_index) = glxewGetExtension(\"GLX_SUN_get_transparent_index\");\r\n  if (glewExperimental || GLXEW_SUN_get_transparent_index) CONST_CAST(GLXEW_SUN_get_transparent_index) = !_glewInit_GLX_SUN_get_transparent_index(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GLX_SUN_get_transparent_index */\r\n#ifdef GLX_SUN_video_resize\r\n  CONST_CAST(GLXEW_SUN_video_resize) = glxewGetExtension(\"GLX_SUN_video_resize\");\r\n  if (glewExperimental || GLXEW_SUN_video_resize) CONST_CAST(GLXEW_SUN_video_resize) = !_glewInit_GLX_SUN_video_resize(GLEW_CONTEXT_ARG_VAR_INIT);\r\n#endif /* GLX_SUN_video_resize */\r\n\r\n  return GLEW_OK;\r\n}\r\n\r\n#endif /* !__APPLE__ || GLEW_APPLE_GLX */\r\n\r\n/* ------------------------------------------------------------------------ */\r\n\r\nconst GLubyte* glewGetErrorString (GLenum error)\r\n{\r\n  static const GLubyte* _glewErrorString[] =\r\n  {\r\n    (const GLubyte*)\"No error\",\r\n    (const GLubyte*)\"Missing GL version\",\r\n    (const GLubyte*)\"GL 1.1 and up are not supported\",\r\n    (const GLubyte*)\"GLX 1.2 and up are not supported\",\r\n    (const GLubyte*)\"Unknown error\"\r\n  };\r\n  const int max_error = sizeof(_glewErrorString)/sizeof(*_glewErrorString) - 1;\r\n  return _glewErrorString[(int)error > max_error ? max_error : (int)error];\r\n}\r\n\r\nconst GLubyte* glewGetString (GLenum name)\r\n{\r\n  static const GLubyte* _glewString[] =\r\n  {\r\n    (const GLubyte*)NULL,\r\n    (const GLubyte*)\"1.5.3\",\r\n    (const GLubyte*)\"1\",\r\n    (const GLubyte*)\"5\",\r\n    (const GLubyte*)\"3\"\r\n  };\r\n  const int max_string = sizeof(_glewString)/sizeof(*_glewString) - 1;\r\n  return _glewString[(int)name > max_string ? 0 : (int)name];\r\n}\r\n\r\n/* ------------------------------------------------------------------------ */\r\n\r\nGLboolean glewExperimental = GL_FALSE;\r\n\r\n#if !defined(GLEW_MX)\r\n\r\n#if defined(_WIN32)\r\nextern GLenum wglewContextInit (void);\r\n#elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX) /* _UNIX */\r\nextern GLenum glxewContextInit (void);\r\n#endif /* _WIN32 */\r\n\r\nGLenum glewInit ()\r\n{\r\n  GLenum r;\r\n  if ( (r = glewContextInit()) ) return r;\r\n#if defined(_WIN32)\r\n  return wglewContextInit();\r\n#elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX) /* _UNIX */\r\n  return glxewContextInit();\r\n#else\r\n  return r;\r\n#endif /* _WIN32 */\r\n}\r\n\r\n#endif /* !GLEW_MX */\r\n#ifdef GLEW_MX\r\nGLboolean glewContextIsSupported (GLEWContext* ctx, const char* name)\r\n#else\r\nGLboolean glewIsSupported (const char* name)\r\n#endif\r\n{\r\n  GLubyte* pos = (GLubyte*)name;\r\n  GLuint len = _glewStrLen(pos);\r\n  GLboolean ret = GL_TRUE;\r\n  while (ret && len > 0)\r\n  {\r\n    if (_glewStrSame1(&pos, &len, (const GLubyte*)\"GL_\", 3))\r\n    {\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"VERSION_\", 8))\r\n      {\r\n#ifdef GL_VERSION_1_2\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"1_2\", 3))\r\n        {\r\n          ret = GLEW_VERSION_1_2;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_VERSION_1_3\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"1_3\", 3))\r\n        {\r\n          ret = GLEW_VERSION_1_3;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_VERSION_1_4\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"1_4\", 3))\r\n        {\r\n          ret = GLEW_VERSION_1_4;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_VERSION_1_5\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"1_5\", 3))\r\n        {\r\n          ret = GLEW_VERSION_1_5;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_VERSION_2_0\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"2_0\", 3))\r\n        {\r\n          ret = GLEW_VERSION_2_0;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_VERSION_2_1\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"2_1\", 3))\r\n        {\r\n          ret = GLEW_VERSION_2_1;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_VERSION_3_0\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"3_0\", 3))\r\n        {\r\n          ret = GLEW_VERSION_3_0;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_VERSION_3_1\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"3_1\", 3))\r\n        {\r\n          ret = GLEW_VERSION_3_1;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_VERSION_3_2\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"3_2\", 3))\r\n        {\r\n          ret = GLEW_VERSION_3_2;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"3DFX_\", 5))\r\n      {\r\n#ifdef GL_3DFX_multisample\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"multisample\", 11))\r\n        {\r\n          ret = GLEW_3DFX_multisample;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_3DFX_tbuffer\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"tbuffer\", 7))\r\n        {\r\n          ret = GLEW_3DFX_tbuffer;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_3DFX_texture_compression_FXT1\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_compression_FXT1\", 24))\r\n        {\r\n          ret = GLEW_3DFX_texture_compression_FXT1;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"AMD_\", 4))\r\n      {\r\n#ifdef GL_AMD_draw_buffers_blend\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"draw_buffers_blend\", 18))\r\n        {\r\n          ret = GLEW_AMD_draw_buffers_blend;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_AMD_performance_monitor\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"performance_monitor\", 19))\r\n        {\r\n          ret = GLEW_AMD_performance_monitor;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_AMD_seamless_cubemap_per_texture\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"seamless_cubemap_per_texture\", 28))\r\n        {\r\n          ret = GLEW_AMD_seamless_cubemap_per_texture;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_AMD_shader_stencil_export\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"shader_stencil_export\", 21))\r\n        {\r\n          ret = GLEW_AMD_shader_stencil_export;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_AMD_texture_texture4\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_texture4\", 16))\r\n        {\r\n          ret = GLEW_AMD_texture_texture4;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_AMD_vertex_shader_tessellator\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"vertex_shader_tessellator\", 25))\r\n        {\r\n          ret = GLEW_AMD_vertex_shader_tessellator;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"APPLE_\", 6))\r\n      {\r\n#ifdef GL_APPLE_aux_depth_stencil\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"aux_depth_stencil\", 17))\r\n        {\r\n          ret = GLEW_APPLE_aux_depth_stencil;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_APPLE_client_storage\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"client_storage\", 14))\r\n        {\r\n          ret = GLEW_APPLE_client_storage;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_APPLE_element_array\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"element_array\", 13))\r\n        {\r\n          ret = GLEW_APPLE_element_array;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_APPLE_fence\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"fence\", 5))\r\n        {\r\n          ret = GLEW_APPLE_fence;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_APPLE_float_pixels\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"float_pixels\", 12))\r\n        {\r\n          ret = GLEW_APPLE_float_pixels;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_APPLE_flush_buffer_range\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"flush_buffer_range\", 18))\r\n        {\r\n          ret = GLEW_APPLE_flush_buffer_range;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_APPLE_object_purgeable\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"object_purgeable\", 16))\r\n        {\r\n          ret = GLEW_APPLE_object_purgeable;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_APPLE_pixel_buffer\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"pixel_buffer\", 12))\r\n        {\r\n          ret = GLEW_APPLE_pixel_buffer;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_APPLE_rgb_422\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"rgb_422\", 7))\r\n        {\r\n          ret = GLEW_APPLE_rgb_422;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_APPLE_row_bytes\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"row_bytes\", 9))\r\n        {\r\n          ret = GLEW_APPLE_row_bytes;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_APPLE_specular_vector\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"specular_vector\", 15))\r\n        {\r\n          ret = GLEW_APPLE_specular_vector;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_APPLE_texture_range\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_range\", 13))\r\n        {\r\n          ret = GLEW_APPLE_texture_range;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_APPLE_transform_hint\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"transform_hint\", 14))\r\n        {\r\n          ret = GLEW_APPLE_transform_hint;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_APPLE_vertex_array_object\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"vertex_array_object\", 19))\r\n        {\r\n          ret = GLEW_APPLE_vertex_array_object;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_APPLE_vertex_array_range\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"vertex_array_range\", 18))\r\n        {\r\n          ret = GLEW_APPLE_vertex_array_range;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_APPLE_vertex_program_evaluators\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"vertex_program_evaluators\", 25))\r\n        {\r\n          ret = GLEW_APPLE_vertex_program_evaluators;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_APPLE_ycbcr_422\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"ycbcr_422\", 9))\r\n        {\r\n          ret = GLEW_APPLE_ycbcr_422;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"ARB_\", 4))\r\n      {\r\n#ifdef GL_ARB_color_buffer_float\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"color_buffer_float\", 18))\r\n        {\r\n          ret = GLEW_ARB_color_buffer_float;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_compatibility\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"compatibility\", 13))\r\n        {\r\n          ret = GLEW_ARB_compatibility;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_copy_buffer\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"copy_buffer\", 11))\r\n        {\r\n          ret = GLEW_ARB_copy_buffer;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_depth_buffer_float\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"depth_buffer_float\", 18))\r\n        {\r\n          ret = GLEW_ARB_depth_buffer_float;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_depth_clamp\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"depth_clamp\", 11))\r\n        {\r\n          ret = GLEW_ARB_depth_clamp;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_depth_texture\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"depth_texture\", 13))\r\n        {\r\n          ret = GLEW_ARB_depth_texture;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_draw_buffers\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"draw_buffers\", 12))\r\n        {\r\n          ret = GLEW_ARB_draw_buffers;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_draw_buffers_blend\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"draw_buffers_blend\", 18))\r\n        {\r\n          ret = GLEW_ARB_draw_buffers_blend;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_draw_elements_base_vertex\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"draw_elements_base_vertex\", 25))\r\n        {\r\n          ret = GLEW_ARB_draw_elements_base_vertex;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_draw_instanced\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"draw_instanced\", 14))\r\n        {\r\n          ret = GLEW_ARB_draw_instanced;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_fragment_coord_conventions\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"fragment_coord_conventions\", 26))\r\n        {\r\n          ret = GLEW_ARB_fragment_coord_conventions;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_fragment_program\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"fragment_program\", 16))\r\n        {\r\n          ret = GLEW_ARB_fragment_program;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_fragment_program_shadow\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"fragment_program_shadow\", 23))\r\n        {\r\n          ret = GLEW_ARB_fragment_program_shadow;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_fragment_shader\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"fragment_shader\", 15))\r\n        {\r\n          ret = GLEW_ARB_fragment_shader;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_framebuffer_object\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"framebuffer_object\", 18))\r\n        {\r\n          ret = GLEW_ARB_framebuffer_object;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_framebuffer_sRGB\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"framebuffer_sRGB\", 16))\r\n        {\r\n          ret = GLEW_ARB_framebuffer_sRGB;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_geometry_shader4\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"geometry_shader4\", 16))\r\n        {\r\n          ret = GLEW_ARB_geometry_shader4;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_half_float_pixel\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"half_float_pixel\", 16))\r\n        {\r\n          ret = GLEW_ARB_half_float_pixel;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_half_float_vertex\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"half_float_vertex\", 17))\r\n        {\r\n          ret = GLEW_ARB_half_float_vertex;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_imaging\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"imaging\", 7))\r\n        {\r\n          ret = GLEW_ARB_imaging;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_instanced_arrays\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"instanced_arrays\", 16))\r\n        {\r\n          ret = GLEW_ARB_instanced_arrays;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_map_buffer_range\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"map_buffer_range\", 16))\r\n        {\r\n          ret = GLEW_ARB_map_buffer_range;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_matrix_palette\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"matrix_palette\", 14))\r\n        {\r\n          ret = GLEW_ARB_matrix_palette;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_multisample\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"multisample\", 11))\r\n        {\r\n          ret = GLEW_ARB_multisample;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_multitexture\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"multitexture\", 12))\r\n        {\r\n          ret = GLEW_ARB_multitexture;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_occlusion_query\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"occlusion_query\", 15))\r\n        {\r\n          ret = GLEW_ARB_occlusion_query;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_pixel_buffer_object\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"pixel_buffer_object\", 19))\r\n        {\r\n          ret = GLEW_ARB_pixel_buffer_object;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_point_parameters\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"point_parameters\", 16))\r\n        {\r\n          ret = GLEW_ARB_point_parameters;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_point_sprite\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"point_sprite\", 12))\r\n        {\r\n          ret = GLEW_ARB_point_sprite;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_provoking_vertex\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"provoking_vertex\", 16))\r\n        {\r\n          ret = GLEW_ARB_provoking_vertex;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_sample_shading\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"sample_shading\", 14))\r\n        {\r\n          ret = GLEW_ARB_sample_shading;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_seamless_cube_map\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"seamless_cube_map\", 17))\r\n        {\r\n          ret = GLEW_ARB_seamless_cube_map;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_shader_objects\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"shader_objects\", 14))\r\n        {\r\n          ret = GLEW_ARB_shader_objects;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_shader_texture_lod\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"shader_texture_lod\", 18))\r\n        {\r\n          ret = GLEW_ARB_shader_texture_lod;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_shading_language_100\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"shading_language_100\", 20))\r\n        {\r\n          ret = GLEW_ARB_shading_language_100;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_shadow\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"shadow\", 6))\r\n        {\r\n          ret = GLEW_ARB_shadow;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_shadow_ambient\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"shadow_ambient\", 14))\r\n        {\r\n          ret = GLEW_ARB_shadow_ambient;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_sync\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"sync\", 4))\r\n        {\r\n          ret = GLEW_ARB_sync;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_texture_border_clamp\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_border_clamp\", 20))\r\n        {\r\n          ret = GLEW_ARB_texture_border_clamp;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_texture_buffer_object\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_buffer_object\", 21))\r\n        {\r\n          ret = GLEW_ARB_texture_buffer_object;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_texture_compression\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_compression\", 19))\r\n        {\r\n          ret = GLEW_ARB_texture_compression;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_texture_compression_rgtc\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_compression_rgtc\", 24))\r\n        {\r\n          ret = GLEW_ARB_texture_compression_rgtc;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_texture_cube_map\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_cube_map\", 16))\r\n        {\r\n          ret = GLEW_ARB_texture_cube_map;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_texture_cube_map_array\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_cube_map_array\", 22))\r\n        {\r\n          ret = GLEW_ARB_texture_cube_map_array;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_texture_env_add\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_env_add\", 15))\r\n        {\r\n          ret = GLEW_ARB_texture_env_add;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_texture_env_combine\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_env_combine\", 19))\r\n        {\r\n          ret = GLEW_ARB_texture_env_combine;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_texture_env_crossbar\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_env_crossbar\", 20))\r\n        {\r\n          ret = GLEW_ARB_texture_env_crossbar;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_texture_env_dot3\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_env_dot3\", 16))\r\n        {\r\n          ret = GLEW_ARB_texture_env_dot3;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_texture_float\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_float\", 13))\r\n        {\r\n          ret = GLEW_ARB_texture_float;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_texture_gather\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_gather\", 14))\r\n        {\r\n          ret = GLEW_ARB_texture_gather;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_texture_mirrored_repeat\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_mirrored_repeat\", 23))\r\n        {\r\n          ret = GLEW_ARB_texture_mirrored_repeat;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_texture_multisample\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_multisample\", 19))\r\n        {\r\n          ret = GLEW_ARB_texture_multisample;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_texture_non_power_of_two\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_non_power_of_two\", 24))\r\n        {\r\n          ret = GLEW_ARB_texture_non_power_of_two;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_texture_query_lod\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_query_lod\", 17))\r\n        {\r\n          ret = GLEW_ARB_texture_query_lod;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_texture_rectangle\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_rectangle\", 17))\r\n        {\r\n          ret = GLEW_ARB_texture_rectangle;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_texture_rg\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_rg\", 10))\r\n        {\r\n          ret = GLEW_ARB_texture_rg;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_transpose_matrix\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"transpose_matrix\", 16))\r\n        {\r\n          ret = GLEW_ARB_transpose_matrix;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_uniform_buffer_object\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"uniform_buffer_object\", 21))\r\n        {\r\n          ret = GLEW_ARB_uniform_buffer_object;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_vertex_array_bgra\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"vertex_array_bgra\", 17))\r\n        {\r\n          ret = GLEW_ARB_vertex_array_bgra;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_vertex_array_object\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"vertex_array_object\", 19))\r\n        {\r\n          ret = GLEW_ARB_vertex_array_object;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_vertex_blend\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"vertex_blend\", 12))\r\n        {\r\n          ret = GLEW_ARB_vertex_blend;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_vertex_buffer_object\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"vertex_buffer_object\", 20))\r\n        {\r\n          ret = GLEW_ARB_vertex_buffer_object;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_vertex_program\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"vertex_program\", 14))\r\n        {\r\n          ret = GLEW_ARB_vertex_program;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_vertex_shader\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"vertex_shader\", 13))\r\n        {\r\n          ret = GLEW_ARB_vertex_shader;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ARB_window_pos\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"window_pos\", 10))\r\n        {\r\n          ret = GLEW_ARB_window_pos;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"ATIX_\", 5))\r\n      {\r\n#ifdef GL_ATIX_point_sprites\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"point_sprites\", 13))\r\n        {\r\n          ret = GLEW_ATIX_point_sprites;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ATIX_texture_env_combine3\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_env_combine3\", 20))\r\n        {\r\n          ret = GLEW_ATIX_texture_env_combine3;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ATIX_texture_env_route\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_env_route\", 17))\r\n        {\r\n          ret = GLEW_ATIX_texture_env_route;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ATIX_vertex_shader_output_point_size\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"vertex_shader_output_point_size\", 31))\r\n        {\r\n          ret = GLEW_ATIX_vertex_shader_output_point_size;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"ATI_\", 4))\r\n      {\r\n#ifdef GL_ATI_draw_buffers\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"draw_buffers\", 12))\r\n        {\r\n          ret = GLEW_ATI_draw_buffers;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ATI_element_array\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"element_array\", 13))\r\n        {\r\n          ret = GLEW_ATI_element_array;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ATI_envmap_bumpmap\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"envmap_bumpmap\", 14))\r\n        {\r\n          ret = GLEW_ATI_envmap_bumpmap;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ATI_fragment_shader\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"fragment_shader\", 15))\r\n        {\r\n          ret = GLEW_ATI_fragment_shader;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ATI_map_object_buffer\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"map_object_buffer\", 17))\r\n        {\r\n          ret = GLEW_ATI_map_object_buffer;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ATI_meminfo\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"meminfo\", 7))\r\n        {\r\n          ret = GLEW_ATI_meminfo;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ATI_pn_triangles\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"pn_triangles\", 12))\r\n        {\r\n          ret = GLEW_ATI_pn_triangles;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ATI_separate_stencil\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"separate_stencil\", 16))\r\n        {\r\n          ret = GLEW_ATI_separate_stencil;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ATI_shader_texture_lod\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"shader_texture_lod\", 18))\r\n        {\r\n          ret = GLEW_ATI_shader_texture_lod;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ATI_text_fragment_shader\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"text_fragment_shader\", 20))\r\n        {\r\n          ret = GLEW_ATI_text_fragment_shader;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ATI_texture_compression_3dc\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_compression_3dc\", 23))\r\n        {\r\n          ret = GLEW_ATI_texture_compression_3dc;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ATI_texture_env_combine3\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_env_combine3\", 20))\r\n        {\r\n          ret = GLEW_ATI_texture_env_combine3;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ATI_texture_float\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_float\", 13))\r\n        {\r\n          ret = GLEW_ATI_texture_float;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ATI_texture_mirror_once\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_mirror_once\", 19))\r\n        {\r\n          ret = GLEW_ATI_texture_mirror_once;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ATI_vertex_array_object\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"vertex_array_object\", 19))\r\n        {\r\n          ret = GLEW_ATI_vertex_array_object;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ATI_vertex_attrib_array_object\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"vertex_attrib_array_object\", 26))\r\n        {\r\n          ret = GLEW_ATI_vertex_attrib_array_object;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_ATI_vertex_streams\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"vertex_streams\", 14))\r\n        {\r\n          ret = GLEW_ATI_vertex_streams;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"EXT_\", 4))\r\n      {\r\n#ifdef GL_EXT_422_pixels\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"422_pixels\", 10))\r\n        {\r\n          ret = GLEW_EXT_422_pixels;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_Cg_shader\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"Cg_shader\", 9))\r\n        {\r\n          ret = GLEW_EXT_Cg_shader;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_abgr\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"abgr\", 4))\r\n        {\r\n          ret = GLEW_EXT_abgr;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_bgra\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"bgra\", 4))\r\n        {\r\n          ret = GLEW_EXT_bgra;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_bindable_uniform\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"bindable_uniform\", 16))\r\n        {\r\n          ret = GLEW_EXT_bindable_uniform;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_blend_color\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"blend_color\", 11))\r\n        {\r\n          ret = GLEW_EXT_blend_color;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_blend_equation_separate\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"blend_equation_separate\", 23))\r\n        {\r\n          ret = GLEW_EXT_blend_equation_separate;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_blend_func_separate\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"blend_func_separate\", 19))\r\n        {\r\n          ret = GLEW_EXT_blend_func_separate;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_blend_logic_op\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"blend_logic_op\", 14))\r\n        {\r\n          ret = GLEW_EXT_blend_logic_op;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_blend_minmax\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"blend_minmax\", 12))\r\n        {\r\n          ret = GLEW_EXT_blend_minmax;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_blend_subtract\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"blend_subtract\", 14))\r\n        {\r\n          ret = GLEW_EXT_blend_subtract;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_clip_volume_hint\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"clip_volume_hint\", 16))\r\n        {\r\n          ret = GLEW_EXT_clip_volume_hint;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_cmyka\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"cmyka\", 5))\r\n        {\r\n          ret = GLEW_EXT_cmyka;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_color_subtable\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"color_subtable\", 14))\r\n        {\r\n          ret = GLEW_EXT_color_subtable;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_compiled_vertex_array\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"compiled_vertex_array\", 21))\r\n        {\r\n          ret = GLEW_EXT_compiled_vertex_array;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_convolution\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"convolution\", 11))\r\n        {\r\n          ret = GLEW_EXT_convolution;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_coordinate_frame\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"coordinate_frame\", 16))\r\n        {\r\n          ret = GLEW_EXT_coordinate_frame;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_copy_texture\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"copy_texture\", 12))\r\n        {\r\n          ret = GLEW_EXT_copy_texture;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_cull_vertex\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"cull_vertex\", 11))\r\n        {\r\n          ret = GLEW_EXT_cull_vertex;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_depth_bounds_test\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"depth_bounds_test\", 17))\r\n        {\r\n          ret = GLEW_EXT_depth_bounds_test;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_direct_state_access\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"direct_state_access\", 19))\r\n        {\r\n          ret = GLEW_EXT_direct_state_access;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_draw_buffers2\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"draw_buffers2\", 13))\r\n        {\r\n          ret = GLEW_EXT_draw_buffers2;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_draw_instanced\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"draw_instanced\", 14))\r\n        {\r\n          ret = GLEW_EXT_draw_instanced;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_draw_range_elements\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"draw_range_elements\", 19))\r\n        {\r\n          ret = GLEW_EXT_draw_range_elements;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_fog_coord\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"fog_coord\", 9))\r\n        {\r\n          ret = GLEW_EXT_fog_coord;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_fragment_lighting\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"fragment_lighting\", 17))\r\n        {\r\n          ret = GLEW_EXT_fragment_lighting;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_framebuffer_blit\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"framebuffer_blit\", 16))\r\n        {\r\n          ret = GLEW_EXT_framebuffer_blit;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_framebuffer_multisample\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"framebuffer_multisample\", 23))\r\n        {\r\n          ret = GLEW_EXT_framebuffer_multisample;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_framebuffer_object\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"framebuffer_object\", 18))\r\n        {\r\n          ret = GLEW_EXT_framebuffer_object;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_framebuffer_sRGB\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"framebuffer_sRGB\", 16))\r\n        {\r\n          ret = GLEW_EXT_framebuffer_sRGB;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_geometry_shader4\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"geometry_shader4\", 16))\r\n        {\r\n          ret = GLEW_EXT_geometry_shader4;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_gpu_program_parameters\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"gpu_program_parameters\", 22))\r\n        {\r\n          ret = GLEW_EXT_gpu_program_parameters;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_gpu_shader4\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"gpu_shader4\", 11))\r\n        {\r\n          ret = GLEW_EXT_gpu_shader4;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_histogram\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"histogram\", 9))\r\n        {\r\n          ret = GLEW_EXT_histogram;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_index_array_formats\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"index_array_formats\", 19))\r\n        {\r\n          ret = GLEW_EXT_index_array_formats;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_index_func\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"index_func\", 10))\r\n        {\r\n          ret = GLEW_EXT_index_func;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_index_material\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"index_material\", 14))\r\n        {\r\n          ret = GLEW_EXT_index_material;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_index_texture\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"index_texture\", 13))\r\n        {\r\n          ret = GLEW_EXT_index_texture;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_light_texture\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"light_texture\", 13))\r\n        {\r\n          ret = GLEW_EXT_light_texture;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_misc_attribute\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"misc_attribute\", 14))\r\n        {\r\n          ret = GLEW_EXT_misc_attribute;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_multi_draw_arrays\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"multi_draw_arrays\", 17))\r\n        {\r\n          ret = GLEW_EXT_multi_draw_arrays;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_multisample\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"multisample\", 11))\r\n        {\r\n          ret = GLEW_EXT_multisample;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_packed_depth_stencil\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"packed_depth_stencil\", 20))\r\n        {\r\n          ret = GLEW_EXT_packed_depth_stencil;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_packed_float\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"packed_float\", 12))\r\n        {\r\n          ret = GLEW_EXT_packed_float;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_packed_pixels\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"packed_pixels\", 13))\r\n        {\r\n          ret = GLEW_EXT_packed_pixels;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_paletted_texture\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"paletted_texture\", 16))\r\n        {\r\n          ret = GLEW_EXT_paletted_texture;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_pixel_buffer_object\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"pixel_buffer_object\", 19))\r\n        {\r\n          ret = GLEW_EXT_pixel_buffer_object;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_pixel_transform\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"pixel_transform\", 15))\r\n        {\r\n          ret = GLEW_EXT_pixel_transform;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_pixel_transform_color_table\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"pixel_transform_color_table\", 27))\r\n        {\r\n          ret = GLEW_EXT_pixel_transform_color_table;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_point_parameters\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"point_parameters\", 16))\r\n        {\r\n          ret = GLEW_EXT_point_parameters;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_polygon_offset\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"polygon_offset\", 14))\r\n        {\r\n          ret = GLEW_EXT_polygon_offset;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_provoking_vertex\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"provoking_vertex\", 16))\r\n        {\r\n          ret = GLEW_EXT_provoking_vertex;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_rescale_normal\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"rescale_normal\", 14))\r\n        {\r\n          ret = GLEW_EXT_rescale_normal;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_scene_marker\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"scene_marker\", 12))\r\n        {\r\n          ret = GLEW_EXT_scene_marker;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_secondary_color\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"secondary_color\", 15))\r\n        {\r\n          ret = GLEW_EXT_secondary_color;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_separate_shader_objects\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"separate_shader_objects\", 23))\r\n        {\r\n          ret = GLEW_EXT_separate_shader_objects;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_separate_specular_color\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"separate_specular_color\", 23))\r\n        {\r\n          ret = GLEW_EXT_separate_specular_color;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_shadow_funcs\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"shadow_funcs\", 12))\r\n        {\r\n          ret = GLEW_EXT_shadow_funcs;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_shared_texture_palette\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"shared_texture_palette\", 22))\r\n        {\r\n          ret = GLEW_EXT_shared_texture_palette;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_stencil_clear_tag\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"stencil_clear_tag\", 17))\r\n        {\r\n          ret = GLEW_EXT_stencil_clear_tag;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_stencil_two_side\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"stencil_two_side\", 16))\r\n        {\r\n          ret = GLEW_EXT_stencil_two_side;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_stencil_wrap\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"stencil_wrap\", 12))\r\n        {\r\n          ret = GLEW_EXT_stencil_wrap;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_subtexture\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"subtexture\", 10))\r\n        {\r\n          ret = GLEW_EXT_subtexture;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_texture\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture\", 7))\r\n        {\r\n          ret = GLEW_EXT_texture;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_texture3D\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture3D\", 9))\r\n        {\r\n          ret = GLEW_EXT_texture3D;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_texture_array\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_array\", 13))\r\n        {\r\n          ret = GLEW_EXT_texture_array;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_texture_buffer_object\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_buffer_object\", 21))\r\n        {\r\n          ret = GLEW_EXT_texture_buffer_object;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_texture_compression_dxt1\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_compression_dxt1\", 24))\r\n        {\r\n          ret = GLEW_EXT_texture_compression_dxt1;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_texture_compression_latc\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_compression_latc\", 24))\r\n        {\r\n          ret = GLEW_EXT_texture_compression_latc;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_texture_compression_rgtc\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_compression_rgtc\", 24))\r\n        {\r\n          ret = GLEW_EXT_texture_compression_rgtc;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_texture_compression_s3tc\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_compression_s3tc\", 24))\r\n        {\r\n          ret = GLEW_EXT_texture_compression_s3tc;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_texture_cube_map\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_cube_map\", 16))\r\n        {\r\n          ret = GLEW_EXT_texture_cube_map;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_texture_edge_clamp\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_edge_clamp\", 18))\r\n        {\r\n          ret = GLEW_EXT_texture_edge_clamp;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_texture_env\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_env\", 11))\r\n        {\r\n          ret = GLEW_EXT_texture_env;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_texture_env_add\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_env_add\", 15))\r\n        {\r\n          ret = GLEW_EXT_texture_env_add;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_texture_env_combine\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_env_combine\", 19))\r\n        {\r\n          ret = GLEW_EXT_texture_env_combine;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_texture_env_dot3\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_env_dot3\", 16))\r\n        {\r\n          ret = GLEW_EXT_texture_env_dot3;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_texture_filter_anisotropic\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_filter_anisotropic\", 26))\r\n        {\r\n          ret = GLEW_EXT_texture_filter_anisotropic;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_texture_integer\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_integer\", 15))\r\n        {\r\n          ret = GLEW_EXT_texture_integer;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_texture_lod_bias\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_lod_bias\", 16))\r\n        {\r\n          ret = GLEW_EXT_texture_lod_bias;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_texture_mirror_clamp\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_mirror_clamp\", 20))\r\n        {\r\n          ret = GLEW_EXT_texture_mirror_clamp;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_texture_object\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_object\", 14))\r\n        {\r\n          ret = GLEW_EXT_texture_object;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_texture_perturb_normal\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_perturb_normal\", 22))\r\n        {\r\n          ret = GLEW_EXT_texture_perturb_normal;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_texture_rectangle\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_rectangle\", 17))\r\n        {\r\n          ret = GLEW_EXT_texture_rectangle;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_texture_sRGB\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_sRGB\", 12))\r\n        {\r\n          ret = GLEW_EXT_texture_sRGB;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_texture_shared_exponent\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_shared_exponent\", 23))\r\n        {\r\n          ret = GLEW_EXT_texture_shared_exponent;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_texture_snorm\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_snorm\", 13))\r\n        {\r\n          ret = GLEW_EXT_texture_snorm;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_texture_swizzle\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_swizzle\", 15))\r\n        {\r\n          ret = GLEW_EXT_texture_swizzle;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_timer_query\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"timer_query\", 11))\r\n        {\r\n          ret = GLEW_EXT_timer_query;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_transform_feedback\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"transform_feedback\", 18))\r\n        {\r\n          ret = GLEW_EXT_transform_feedback;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_vertex_array\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"vertex_array\", 12))\r\n        {\r\n          ret = GLEW_EXT_vertex_array;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_vertex_array_bgra\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"vertex_array_bgra\", 17))\r\n        {\r\n          ret = GLEW_EXT_vertex_array_bgra;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_vertex_shader\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"vertex_shader\", 13))\r\n        {\r\n          ret = GLEW_EXT_vertex_shader;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_EXT_vertex_weighting\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"vertex_weighting\", 16))\r\n        {\r\n          ret = GLEW_EXT_vertex_weighting;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"GREMEDY_\", 8))\r\n      {\r\n#ifdef GL_GREMEDY_frame_terminator\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"frame_terminator\", 16))\r\n        {\r\n          ret = GLEW_GREMEDY_frame_terminator;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_GREMEDY_string_marker\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"string_marker\", 13))\r\n        {\r\n          ret = GLEW_GREMEDY_string_marker;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"HP_\", 3))\r\n      {\r\n#ifdef GL_HP_convolution_border_modes\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"convolution_border_modes\", 24))\r\n        {\r\n          ret = GLEW_HP_convolution_border_modes;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_HP_image_transform\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"image_transform\", 15))\r\n        {\r\n          ret = GLEW_HP_image_transform;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_HP_occlusion_test\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"occlusion_test\", 14))\r\n        {\r\n          ret = GLEW_HP_occlusion_test;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_HP_texture_lighting\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_lighting\", 16))\r\n        {\r\n          ret = GLEW_HP_texture_lighting;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"IBM_\", 4))\r\n      {\r\n#ifdef GL_IBM_cull_vertex\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"cull_vertex\", 11))\r\n        {\r\n          ret = GLEW_IBM_cull_vertex;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_IBM_multimode_draw_arrays\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"multimode_draw_arrays\", 21))\r\n        {\r\n          ret = GLEW_IBM_multimode_draw_arrays;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_IBM_rasterpos_clip\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"rasterpos_clip\", 14))\r\n        {\r\n          ret = GLEW_IBM_rasterpos_clip;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_IBM_static_data\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"static_data\", 11))\r\n        {\r\n          ret = GLEW_IBM_static_data;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_IBM_texture_mirrored_repeat\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_mirrored_repeat\", 23))\r\n        {\r\n          ret = GLEW_IBM_texture_mirrored_repeat;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_IBM_vertex_array_lists\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"vertex_array_lists\", 18))\r\n        {\r\n          ret = GLEW_IBM_vertex_array_lists;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"INGR_\", 5))\r\n      {\r\n#ifdef GL_INGR_color_clamp\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"color_clamp\", 11))\r\n        {\r\n          ret = GLEW_INGR_color_clamp;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_INGR_interlace_read\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"interlace_read\", 14))\r\n        {\r\n          ret = GLEW_INGR_interlace_read;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"INTEL_\", 6))\r\n      {\r\n#ifdef GL_INTEL_parallel_arrays\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"parallel_arrays\", 15))\r\n        {\r\n          ret = GLEW_INTEL_parallel_arrays;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_INTEL_texture_scissor\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_scissor\", 15))\r\n        {\r\n          ret = GLEW_INTEL_texture_scissor;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"KTX_\", 4))\r\n      {\r\n#ifdef GL_KTX_buffer_region\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"buffer_region\", 13))\r\n        {\r\n          ret = GLEW_KTX_buffer_region;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"MESAX_\", 6))\r\n      {\r\n#ifdef GL_MESAX_texture_stack\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_stack\", 13))\r\n        {\r\n          ret = GLEW_MESAX_texture_stack;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"MESA_\", 5))\r\n      {\r\n#ifdef GL_MESA_pack_invert\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"pack_invert\", 11))\r\n        {\r\n          ret = GLEW_MESA_pack_invert;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_MESA_resize_buffers\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"resize_buffers\", 14))\r\n        {\r\n          ret = GLEW_MESA_resize_buffers;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_MESA_window_pos\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"window_pos\", 10))\r\n        {\r\n          ret = GLEW_MESA_window_pos;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_MESA_ycbcr_texture\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"ycbcr_texture\", 13))\r\n        {\r\n          ret = GLEW_MESA_ycbcr_texture;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"NV_\", 3))\r\n      {\r\n#ifdef GL_NV_blend_square\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"blend_square\", 12))\r\n        {\r\n          ret = GLEW_NV_blend_square;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_conditional_render\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"conditional_render\", 18))\r\n        {\r\n          ret = GLEW_NV_conditional_render;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_copy_depth_to_color\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"copy_depth_to_color\", 19))\r\n        {\r\n          ret = GLEW_NV_copy_depth_to_color;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_copy_image\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"copy_image\", 10))\r\n        {\r\n          ret = GLEW_NV_copy_image;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_depth_buffer_float\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"depth_buffer_float\", 18))\r\n        {\r\n          ret = GLEW_NV_depth_buffer_float;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_depth_clamp\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"depth_clamp\", 11))\r\n        {\r\n          ret = GLEW_NV_depth_clamp;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_depth_range_unclamped\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"depth_range_unclamped\", 21))\r\n        {\r\n          ret = GLEW_NV_depth_range_unclamped;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_evaluators\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"evaluators\", 10))\r\n        {\r\n          ret = GLEW_NV_evaluators;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_explicit_multisample\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"explicit_multisample\", 20))\r\n        {\r\n          ret = GLEW_NV_explicit_multisample;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_fence\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"fence\", 5))\r\n        {\r\n          ret = GLEW_NV_fence;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_float_buffer\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"float_buffer\", 12))\r\n        {\r\n          ret = GLEW_NV_float_buffer;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_fog_distance\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"fog_distance\", 12))\r\n        {\r\n          ret = GLEW_NV_fog_distance;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_fragment_program\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"fragment_program\", 16))\r\n        {\r\n          ret = GLEW_NV_fragment_program;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_fragment_program2\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"fragment_program2\", 17))\r\n        {\r\n          ret = GLEW_NV_fragment_program2;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_fragment_program4\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"fragment_program4\", 17))\r\n        {\r\n          ret = GLEW_NV_fragment_program4;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_fragment_program_option\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"fragment_program_option\", 23))\r\n        {\r\n          ret = GLEW_NV_fragment_program_option;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_framebuffer_multisample_coverage\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"framebuffer_multisample_coverage\", 32))\r\n        {\r\n          ret = GLEW_NV_framebuffer_multisample_coverage;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_geometry_program4\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"geometry_program4\", 17))\r\n        {\r\n          ret = GLEW_NV_geometry_program4;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_geometry_shader4\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"geometry_shader4\", 16))\r\n        {\r\n          ret = GLEW_NV_geometry_shader4;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_gpu_program4\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"gpu_program4\", 12))\r\n        {\r\n          ret = GLEW_NV_gpu_program4;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_half_float\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"half_float\", 10))\r\n        {\r\n          ret = GLEW_NV_half_float;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_light_max_exponent\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"light_max_exponent\", 18))\r\n        {\r\n          ret = GLEW_NV_light_max_exponent;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_multisample_filter_hint\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"multisample_filter_hint\", 23))\r\n        {\r\n          ret = GLEW_NV_multisample_filter_hint;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_occlusion_query\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"occlusion_query\", 15))\r\n        {\r\n          ret = GLEW_NV_occlusion_query;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_packed_depth_stencil\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"packed_depth_stencil\", 20))\r\n        {\r\n          ret = GLEW_NV_packed_depth_stencil;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_parameter_buffer_object\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"parameter_buffer_object\", 23))\r\n        {\r\n          ret = GLEW_NV_parameter_buffer_object;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_parameter_buffer_object2\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"parameter_buffer_object2\", 24))\r\n        {\r\n          ret = GLEW_NV_parameter_buffer_object2;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_pixel_data_range\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"pixel_data_range\", 16))\r\n        {\r\n          ret = GLEW_NV_pixel_data_range;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_point_sprite\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"point_sprite\", 12))\r\n        {\r\n          ret = GLEW_NV_point_sprite;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_present_video\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"present_video\", 13))\r\n        {\r\n          ret = GLEW_NV_present_video;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_primitive_restart\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"primitive_restart\", 17))\r\n        {\r\n          ret = GLEW_NV_primitive_restart;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_register_combiners\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"register_combiners\", 18))\r\n        {\r\n          ret = GLEW_NV_register_combiners;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_register_combiners2\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"register_combiners2\", 19))\r\n        {\r\n          ret = GLEW_NV_register_combiners2;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_shader_buffer_load\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"shader_buffer_load\", 18))\r\n        {\r\n          ret = GLEW_NV_shader_buffer_load;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_texgen_emboss\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texgen_emboss\", 13))\r\n        {\r\n          ret = GLEW_NV_texgen_emboss;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_texgen_reflection\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texgen_reflection\", 17))\r\n        {\r\n          ret = GLEW_NV_texgen_reflection;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_texture_barrier\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_barrier\", 15))\r\n        {\r\n          ret = GLEW_NV_texture_barrier;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_texture_compression_vtc\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_compression_vtc\", 23))\r\n        {\r\n          ret = GLEW_NV_texture_compression_vtc;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_texture_env_combine4\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_env_combine4\", 20))\r\n        {\r\n          ret = GLEW_NV_texture_env_combine4;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_texture_expand_normal\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_expand_normal\", 21))\r\n        {\r\n          ret = GLEW_NV_texture_expand_normal;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_texture_rectangle\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_rectangle\", 17))\r\n        {\r\n          ret = GLEW_NV_texture_rectangle;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_texture_shader\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_shader\", 14))\r\n        {\r\n          ret = GLEW_NV_texture_shader;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_texture_shader2\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_shader2\", 15))\r\n        {\r\n          ret = GLEW_NV_texture_shader2;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_texture_shader3\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_shader3\", 15))\r\n        {\r\n          ret = GLEW_NV_texture_shader3;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_transform_feedback\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"transform_feedback\", 18))\r\n        {\r\n          ret = GLEW_NV_transform_feedback;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_transform_feedback2\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"transform_feedback2\", 19))\r\n        {\r\n          ret = GLEW_NV_transform_feedback2;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_vertex_array_range\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"vertex_array_range\", 18))\r\n        {\r\n          ret = GLEW_NV_vertex_array_range;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_vertex_array_range2\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"vertex_array_range2\", 19))\r\n        {\r\n          ret = GLEW_NV_vertex_array_range2;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_vertex_buffer_unified_memory\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"vertex_buffer_unified_memory\", 28))\r\n        {\r\n          ret = GLEW_NV_vertex_buffer_unified_memory;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_vertex_program\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"vertex_program\", 14))\r\n        {\r\n          ret = GLEW_NV_vertex_program;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_vertex_program1_1\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"vertex_program1_1\", 17))\r\n        {\r\n          ret = GLEW_NV_vertex_program1_1;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_vertex_program2\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"vertex_program2\", 15))\r\n        {\r\n          ret = GLEW_NV_vertex_program2;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_vertex_program2_option\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"vertex_program2_option\", 22))\r\n        {\r\n          ret = GLEW_NV_vertex_program2_option;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_vertex_program3\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"vertex_program3\", 15))\r\n        {\r\n          ret = GLEW_NV_vertex_program3;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_NV_vertex_program4\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"vertex_program4\", 15))\r\n        {\r\n          ret = GLEW_NV_vertex_program4;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"OES_\", 4))\r\n      {\r\n#ifdef GL_OES_byte_coordinates\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"byte_coordinates\", 16))\r\n        {\r\n          ret = GLEW_OES_byte_coordinates;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_OES_compressed_paletted_texture\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"compressed_paletted_texture\", 27))\r\n        {\r\n          ret = GLEW_OES_compressed_paletted_texture;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_OES_read_format\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"read_format\", 11))\r\n        {\r\n          ret = GLEW_OES_read_format;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_OES_single_precision\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"single_precision\", 16))\r\n        {\r\n          ret = GLEW_OES_single_precision;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"OML_\", 4))\r\n      {\r\n#ifdef GL_OML_interlace\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"interlace\", 9))\r\n        {\r\n          ret = GLEW_OML_interlace;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_OML_resample\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"resample\", 8))\r\n        {\r\n          ret = GLEW_OML_resample;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_OML_subsample\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"subsample\", 9))\r\n        {\r\n          ret = GLEW_OML_subsample;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"PGI_\", 4))\r\n      {\r\n#ifdef GL_PGI_misc_hints\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"misc_hints\", 10))\r\n        {\r\n          ret = GLEW_PGI_misc_hints;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_PGI_vertex_hints\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"vertex_hints\", 12))\r\n        {\r\n          ret = GLEW_PGI_vertex_hints;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"REND_\", 5))\r\n      {\r\n#ifdef GL_REND_screen_coordinates\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"screen_coordinates\", 18))\r\n        {\r\n          ret = GLEW_REND_screen_coordinates;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"S3_\", 3))\r\n      {\r\n#ifdef GL_S3_s3tc\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"s3tc\", 4))\r\n        {\r\n          ret = GLEW_S3_s3tc;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"SGIS_\", 5))\r\n      {\r\n#ifdef GL_SGIS_color_range\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"color_range\", 11))\r\n        {\r\n          ret = GLEW_SGIS_color_range;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIS_detail_texture\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"detail_texture\", 14))\r\n        {\r\n          ret = GLEW_SGIS_detail_texture;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIS_fog_function\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"fog_function\", 12))\r\n        {\r\n          ret = GLEW_SGIS_fog_function;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIS_generate_mipmap\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"generate_mipmap\", 15))\r\n        {\r\n          ret = GLEW_SGIS_generate_mipmap;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIS_multisample\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"multisample\", 11))\r\n        {\r\n          ret = GLEW_SGIS_multisample;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIS_pixel_texture\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"pixel_texture\", 13))\r\n        {\r\n          ret = GLEW_SGIS_pixel_texture;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIS_point_line_texgen\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"point_line_texgen\", 17))\r\n        {\r\n          ret = GLEW_SGIS_point_line_texgen;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIS_sharpen_texture\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"sharpen_texture\", 15))\r\n        {\r\n          ret = GLEW_SGIS_sharpen_texture;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIS_texture4D\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture4D\", 9))\r\n        {\r\n          ret = GLEW_SGIS_texture4D;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIS_texture_border_clamp\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_border_clamp\", 20))\r\n        {\r\n          ret = GLEW_SGIS_texture_border_clamp;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIS_texture_edge_clamp\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_edge_clamp\", 18))\r\n        {\r\n          ret = GLEW_SGIS_texture_edge_clamp;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIS_texture_filter4\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_filter4\", 15))\r\n        {\r\n          ret = GLEW_SGIS_texture_filter4;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIS_texture_lod\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_lod\", 11))\r\n        {\r\n          ret = GLEW_SGIS_texture_lod;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIS_texture_select\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_select\", 14))\r\n        {\r\n          ret = GLEW_SGIS_texture_select;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"SGIX_\", 5))\r\n      {\r\n#ifdef GL_SGIX_async\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"async\", 5))\r\n        {\r\n          ret = GLEW_SGIX_async;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIX_async_histogram\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"async_histogram\", 15))\r\n        {\r\n          ret = GLEW_SGIX_async_histogram;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIX_async_pixel\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"async_pixel\", 11))\r\n        {\r\n          ret = GLEW_SGIX_async_pixel;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIX_blend_alpha_minmax\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"blend_alpha_minmax\", 18))\r\n        {\r\n          ret = GLEW_SGIX_blend_alpha_minmax;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIX_clipmap\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"clipmap\", 7))\r\n        {\r\n          ret = GLEW_SGIX_clipmap;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIX_convolution_accuracy\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"convolution_accuracy\", 20))\r\n        {\r\n          ret = GLEW_SGIX_convolution_accuracy;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIX_depth_texture\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"depth_texture\", 13))\r\n        {\r\n          ret = GLEW_SGIX_depth_texture;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIX_flush_raster\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"flush_raster\", 12))\r\n        {\r\n          ret = GLEW_SGIX_flush_raster;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIX_fog_offset\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"fog_offset\", 10))\r\n        {\r\n          ret = GLEW_SGIX_fog_offset;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIX_fog_texture\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"fog_texture\", 11))\r\n        {\r\n          ret = GLEW_SGIX_fog_texture;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIX_fragment_specular_lighting\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"fragment_specular_lighting\", 26))\r\n        {\r\n          ret = GLEW_SGIX_fragment_specular_lighting;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIX_framezoom\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"framezoom\", 9))\r\n        {\r\n          ret = GLEW_SGIX_framezoom;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIX_interlace\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"interlace\", 9))\r\n        {\r\n          ret = GLEW_SGIX_interlace;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIX_ir_instrument1\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"ir_instrument1\", 14))\r\n        {\r\n          ret = GLEW_SGIX_ir_instrument1;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIX_list_priority\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"list_priority\", 13))\r\n        {\r\n          ret = GLEW_SGIX_list_priority;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIX_pixel_texture\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"pixel_texture\", 13))\r\n        {\r\n          ret = GLEW_SGIX_pixel_texture;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIX_pixel_texture_bits\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"pixel_texture_bits\", 18))\r\n        {\r\n          ret = GLEW_SGIX_pixel_texture_bits;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIX_reference_plane\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"reference_plane\", 15))\r\n        {\r\n          ret = GLEW_SGIX_reference_plane;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIX_resample\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"resample\", 8))\r\n        {\r\n          ret = GLEW_SGIX_resample;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIX_shadow\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"shadow\", 6))\r\n        {\r\n          ret = GLEW_SGIX_shadow;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIX_shadow_ambient\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"shadow_ambient\", 14))\r\n        {\r\n          ret = GLEW_SGIX_shadow_ambient;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIX_sprite\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"sprite\", 6))\r\n        {\r\n          ret = GLEW_SGIX_sprite;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIX_tag_sample_buffer\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"tag_sample_buffer\", 17))\r\n        {\r\n          ret = GLEW_SGIX_tag_sample_buffer;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIX_texture_add_env\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_add_env\", 15))\r\n        {\r\n          ret = GLEW_SGIX_texture_add_env;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIX_texture_coordinate_clamp\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_coordinate_clamp\", 24))\r\n        {\r\n          ret = GLEW_SGIX_texture_coordinate_clamp;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIX_texture_lod_bias\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_lod_bias\", 16))\r\n        {\r\n          ret = GLEW_SGIX_texture_lod_bias;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIX_texture_multi_buffer\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_multi_buffer\", 20))\r\n        {\r\n          ret = GLEW_SGIX_texture_multi_buffer;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIX_texture_range\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_range\", 13))\r\n        {\r\n          ret = GLEW_SGIX_texture_range;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIX_texture_scale_bias\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_scale_bias\", 18))\r\n        {\r\n          ret = GLEW_SGIX_texture_scale_bias;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIX_vertex_preclip\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"vertex_preclip\", 14))\r\n        {\r\n          ret = GLEW_SGIX_vertex_preclip;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIX_vertex_preclip_hint\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"vertex_preclip_hint\", 19))\r\n        {\r\n          ret = GLEW_SGIX_vertex_preclip_hint;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGIX_ycrcb\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"ycrcb\", 5))\r\n        {\r\n          ret = GLEW_SGIX_ycrcb;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"SGI_\", 4))\r\n      {\r\n#ifdef GL_SGI_color_matrix\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"color_matrix\", 12))\r\n        {\r\n          ret = GLEW_SGI_color_matrix;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGI_color_table\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"color_table\", 11))\r\n        {\r\n          ret = GLEW_SGI_color_table;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SGI_texture_color_table\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_color_table\", 19))\r\n        {\r\n          ret = GLEW_SGI_texture_color_table;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"SUNX_\", 5))\r\n      {\r\n#ifdef GL_SUNX_constant_data\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"constant_data\", 13))\r\n        {\r\n          ret = GLEW_SUNX_constant_data;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"SUN_\", 4))\r\n      {\r\n#ifdef GL_SUN_convolution_border_modes\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"convolution_border_modes\", 24))\r\n        {\r\n          ret = GLEW_SUN_convolution_border_modes;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SUN_global_alpha\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"global_alpha\", 12))\r\n        {\r\n          ret = GLEW_SUN_global_alpha;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SUN_mesh_array\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"mesh_array\", 10))\r\n        {\r\n          ret = GLEW_SUN_mesh_array;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SUN_read_video_pixels\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"read_video_pixels\", 17))\r\n        {\r\n          ret = GLEW_SUN_read_video_pixels;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SUN_slice_accum\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"slice_accum\", 11))\r\n        {\r\n          ret = GLEW_SUN_slice_accum;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SUN_triangle_list\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"triangle_list\", 13))\r\n        {\r\n          ret = GLEW_SUN_triangle_list;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_SUN_vertex\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"vertex\", 6))\r\n        {\r\n          ret = GLEW_SUN_vertex;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"WIN_\", 4))\r\n      {\r\n#ifdef GL_WIN_phong_shading\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"phong_shading\", 13))\r\n        {\r\n          ret = GLEW_WIN_phong_shading;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_WIN_specular_fog\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"specular_fog\", 12))\r\n        {\r\n          ret = GLEW_WIN_specular_fog;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GL_WIN_swap_hint\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"swap_hint\", 9))\r\n        {\r\n          ret = GLEW_WIN_swap_hint;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n    }\r\n    ret = (len == 0);\r\n  }\r\n  return ret;\r\n}\r\n\r\n#if defined(_WIN32)\r\n\r\n#if defined(GLEW_MX)\r\nGLboolean wglewContextIsSupported (WGLEWContext* ctx, const char* name)\r\n#else\r\nGLboolean wglewIsSupported (const char* name)\r\n#endif\r\n{\r\n  GLubyte* pos = (GLubyte*)name;\r\n  GLuint len = _glewStrLen(pos);\r\n  GLboolean ret = GL_TRUE;\r\n  while (ret && len > 0)\r\n  {\r\n    if (_glewStrSame1(&pos, &len, (const GLubyte*)\"WGL_\", 4))\r\n    {\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"3DFX_\", 5))\r\n      {\r\n#ifdef WGL_3DFX_multisample\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"multisample\", 11))\r\n        {\r\n          ret = WGLEW_3DFX_multisample;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"3DL_\", 4))\r\n      {\r\n#ifdef WGL_3DL_stereo_control\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"stereo_control\", 14))\r\n        {\r\n          ret = WGLEW_3DL_stereo_control;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"AMD_\", 4))\r\n      {\r\n#ifdef WGL_AMD_gpu_association\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"gpu_association\", 15))\r\n        {\r\n          ret = WGLEW_AMD_gpu_association;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"ARB_\", 4))\r\n      {\r\n#ifdef WGL_ARB_buffer_region\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"buffer_region\", 13))\r\n        {\r\n          ret = WGLEW_ARB_buffer_region;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef WGL_ARB_create_context\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"create_context\", 14))\r\n        {\r\n          ret = WGLEW_ARB_create_context;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef WGL_ARB_create_context_profile\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"create_context_profile\", 22))\r\n        {\r\n          ret = WGLEW_ARB_create_context_profile;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef WGL_ARB_extensions_string\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"extensions_string\", 17))\r\n        {\r\n          ret = WGLEW_ARB_extensions_string;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef WGL_ARB_framebuffer_sRGB\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"framebuffer_sRGB\", 16))\r\n        {\r\n          ret = WGLEW_ARB_framebuffer_sRGB;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef WGL_ARB_make_current_read\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"make_current_read\", 17))\r\n        {\r\n          ret = WGLEW_ARB_make_current_read;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef WGL_ARB_multisample\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"multisample\", 11))\r\n        {\r\n          ret = WGLEW_ARB_multisample;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef WGL_ARB_pbuffer\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"pbuffer\", 7))\r\n        {\r\n          ret = WGLEW_ARB_pbuffer;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef WGL_ARB_pixel_format\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"pixel_format\", 12))\r\n        {\r\n          ret = WGLEW_ARB_pixel_format;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef WGL_ARB_pixel_format_float\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"pixel_format_float\", 18))\r\n        {\r\n          ret = WGLEW_ARB_pixel_format_float;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef WGL_ARB_render_texture\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"render_texture\", 14))\r\n        {\r\n          ret = WGLEW_ARB_render_texture;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"ATI_\", 4))\r\n      {\r\n#ifdef WGL_ATI_pixel_format_float\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"pixel_format_float\", 18))\r\n        {\r\n          ret = WGLEW_ATI_pixel_format_float;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef WGL_ATI_render_texture_rectangle\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"render_texture_rectangle\", 24))\r\n        {\r\n          ret = WGLEW_ATI_render_texture_rectangle;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"EXT_\", 4))\r\n      {\r\n#ifdef WGL_EXT_depth_float\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"depth_float\", 11))\r\n        {\r\n          ret = WGLEW_EXT_depth_float;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef WGL_EXT_display_color_table\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"display_color_table\", 19))\r\n        {\r\n          ret = WGLEW_EXT_display_color_table;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef WGL_EXT_extensions_string\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"extensions_string\", 17))\r\n        {\r\n          ret = WGLEW_EXT_extensions_string;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef WGL_EXT_framebuffer_sRGB\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"framebuffer_sRGB\", 16))\r\n        {\r\n          ret = WGLEW_EXT_framebuffer_sRGB;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef WGL_EXT_make_current_read\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"make_current_read\", 17))\r\n        {\r\n          ret = WGLEW_EXT_make_current_read;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef WGL_EXT_multisample\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"multisample\", 11))\r\n        {\r\n          ret = WGLEW_EXT_multisample;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef WGL_EXT_pbuffer\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"pbuffer\", 7))\r\n        {\r\n          ret = WGLEW_EXT_pbuffer;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef WGL_EXT_pixel_format\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"pixel_format\", 12))\r\n        {\r\n          ret = WGLEW_EXT_pixel_format;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef WGL_EXT_pixel_format_packed_float\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"pixel_format_packed_float\", 25))\r\n        {\r\n          ret = WGLEW_EXT_pixel_format_packed_float;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef WGL_EXT_swap_control\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"swap_control\", 12))\r\n        {\r\n          ret = WGLEW_EXT_swap_control;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"I3D_\", 4))\r\n      {\r\n#ifdef WGL_I3D_digital_video_control\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"digital_video_control\", 21))\r\n        {\r\n          ret = WGLEW_I3D_digital_video_control;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef WGL_I3D_gamma\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"gamma\", 5))\r\n        {\r\n          ret = WGLEW_I3D_gamma;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef WGL_I3D_genlock\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"genlock\", 7))\r\n        {\r\n          ret = WGLEW_I3D_genlock;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef WGL_I3D_image_buffer\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"image_buffer\", 12))\r\n        {\r\n          ret = WGLEW_I3D_image_buffer;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef WGL_I3D_swap_frame_lock\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"swap_frame_lock\", 15))\r\n        {\r\n          ret = WGLEW_I3D_swap_frame_lock;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef WGL_I3D_swap_frame_usage\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"swap_frame_usage\", 16))\r\n        {\r\n          ret = WGLEW_I3D_swap_frame_usage;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"NV_\", 3))\r\n      {\r\n#ifdef WGL_NV_copy_image\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"copy_image\", 10))\r\n        {\r\n          ret = WGLEW_NV_copy_image;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef WGL_NV_float_buffer\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"float_buffer\", 12))\r\n        {\r\n          ret = WGLEW_NV_float_buffer;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef WGL_NV_gpu_affinity\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"gpu_affinity\", 12))\r\n        {\r\n          ret = WGLEW_NV_gpu_affinity;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef WGL_NV_present_video\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"present_video\", 13))\r\n        {\r\n          ret = WGLEW_NV_present_video;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef WGL_NV_render_depth_texture\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"render_depth_texture\", 20))\r\n        {\r\n          ret = WGLEW_NV_render_depth_texture;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef WGL_NV_render_texture_rectangle\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"render_texture_rectangle\", 24))\r\n        {\r\n          ret = WGLEW_NV_render_texture_rectangle;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef WGL_NV_swap_group\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"swap_group\", 10))\r\n        {\r\n          ret = WGLEW_NV_swap_group;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef WGL_NV_vertex_array_range\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"vertex_array_range\", 18))\r\n        {\r\n          ret = WGLEW_NV_vertex_array_range;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef WGL_NV_video_output\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"video_output\", 12))\r\n        {\r\n          ret = WGLEW_NV_video_output;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"OML_\", 4))\r\n      {\r\n#ifdef WGL_OML_sync_control\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"sync_control\", 12))\r\n        {\r\n          ret = WGLEW_OML_sync_control;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n    }\r\n    ret = (len == 0);\r\n  }\r\n  return ret;\r\n}\r\n\r\n#elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX)\r\n\r\n#if defined(GLEW_MX)\r\nGLboolean glxewContextIsSupported (GLXEWContext* ctx, const char* name)\r\n#else\r\nGLboolean glxewIsSupported (const char* name)\r\n#endif\r\n{\r\n  GLubyte* pos = (GLubyte*)name;\r\n  GLuint len = _glewStrLen(pos);\r\n  GLboolean ret = GL_TRUE;\r\n  while (ret && len > 0)\r\n  {\r\n    if(_glewStrSame1(&pos, &len, (const GLubyte*)\"GLX_\", 4))\r\n    {\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"VERSION_\", 8))\r\n      {\r\n#ifdef GLX_VERSION_1_2\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"1_2\", 3))\r\n        {\r\n          ret = GLXEW_VERSION_1_2;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GLX_VERSION_1_3\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"1_3\", 3))\r\n        {\r\n          ret = GLXEW_VERSION_1_3;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GLX_VERSION_1_4\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"1_4\", 3))\r\n        {\r\n          ret = GLXEW_VERSION_1_4;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"3DFX_\", 5))\r\n      {\r\n#ifdef GLX_3DFX_multisample\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"multisample\", 11))\r\n        {\r\n          ret = GLXEW_3DFX_multisample;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"ARB_\", 4))\r\n      {\r\n#ifdef GLX_ARB_create_context\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"create_context\", 14))\r\n        {\r\n          ret = GLXEW_ARB_create_context;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GLX_ARB_create_context_profile\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"create_context_profile\", 22))\r\n        {\r\n          ret = GLXEW_ARB_create_context_profile;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GLX_ARB_fbconfig_float\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"fbconfig_float\", 14))\r\n        {\r\n          ret = GLXEW_ARB_fbconfig_float;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GLX_ARB_framebuffer_sRGB\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"framebuffer_sRGB\", 16))\r\n        {\r\n          ret = GLXEW_ARB_framebuffer_sRGB;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GLX_ARB_get_proc_address\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"get_proc_address\", 16))\r\n        {\r\n          ret = GLXEW_ARB_get_proc_address;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GLX_ARB_multisample\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"multisample\", 11))\r\n        {\r\n          ret = GLXEW_ARB_multisample;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"ATI_\", 4))\r\n      {\r\n#ifdef GLX_ATI_pixel_format_float\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"pixel_format_float\", 18))\r\n        {\r\n          ret = GLXEW_ATI_pixel_format_float;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GLX_ATI_render_texture\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"render_texture\", 14))\r\n        {\r\n          ret = GLXEW_ATI_render_texture;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"EXT_\", 4))\r\n      {\r\n#ifdef GLX_EXT_fbconfig_packed_float\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"fbconfig_packed_float\", 21))\r\n        {\r\n          ret = GLXEW_EXT_fbconfig_packed_float;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GLX_EXT_framebuffer_sRGB\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"framebuffer_sRGB\", 16))\r\n        {\r\n          ret = GLXEW_EXT_framebuffer_sRGB;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GLX_EXT_import_context\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"import_context\", 14))\r\n        {\r\n          ret = GLXEW_EXT_import_context;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GLX_EXT_scene_marker\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"scene_marker\", 12))\r\n        {\r\n          ret = GLXEW_EXT_scene_marker;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GLX_EXT_swap_control\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"swap_control\", 12))\r\n        {\r\n          ret = GLXEW_EXT_swap_control;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GLX_EXT_texture_from_pixmap\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"texture_from_pixmap\", 19))\r\n        {\r\n          ret = GLXEW_EXT_texture_from_pixmap;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GLX_EXT_visual_info\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"visual_info\", 11))\r\n        {\r\n          ret = GLXEW_EXT_visual_info;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GLX_EXT_visual_rating\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"visual_rating\", 13))\r\n        {\r\n          ret = GLXEW_EXT_visual_rating;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"INTEL_\", 6))\r\n      {\r\n#ifdef GLX_INTEL_swap_event\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"swap_event\", 10))\r\n        {\r\n          ret = GLXEW_INTEL_swap_event;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"MESA_\", 5))\r\n      {\r\n#ifdef GLX_MESA_agp_offset\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"agp_offset\", 10))\r\n        {\r\n          ret = GLXEW_MESA_agp_offset;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GLX_MESA_copy_sub_buffer\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"copy_sub_buffer\", 15))\r\n        {\r\n          ret = GLXEW_MESA_copy_sub_buffer;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GLX_MESA_pixmap_colormap\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"pixmap_colormap\", 15))\r\n        {\r\n          ret = GLXEW_MESA_pixmap_colormap;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GLX_MESA_release_buffers\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"release_buffers\", 15))\r\n        {\r\n          ret = GLXEW_MESA_release_buffers;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GLX_MESA_set_3dfx_mode\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"set_3dfx_mode\", 13))\r\n        {\r\n          ret = GLXEW_MESA_set_3dfx_mode;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"NV_\", 3))\r\n      {\r\n#ifdef GLX_NV_copy_image\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"copy_image\", 10))\r\n        {\r\n          ret = GLXEW_NV_copy_image;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GLX_NV_float_buffer\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"float_buffer\", 12))\r\n        {\r\n          ret = GLXEW_NV_float_buffer;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GLX_NV_present_video\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"present_video\", 13))\r\n        {\r\n          ret = GLXEW_NV_present_video;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GLX_NV_swap_group\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"swap_group\", 10))\r\n        {\r\n          ret = GLXEW_NV_swap_group;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GLX_NV_vertex_array_range\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"vertex_array_range\", 18))\r\n        {\r\n          ret = GLXEW_NV_vertex_array_range;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GLX_NV_video_output\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"video_output\", 12))\r\n        {\r\n          ret = GLXEW_NV_video_output;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"OML_\", 4))\r\n      {\r\n#ifdef GLX_OML_swap_method\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"swap_method\", 11))\r\n        {\r\n          ret = GLXEW_OML_swap_method;\r\n          continue;\r\n        }\r\n#endif\r\n#if defined(GLX_OML_sync_control) && defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)\r\n#include <inttypes.h>\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"sync_control\", 12))\r\n        {\r\n          ret = GLXEW_OML_sync_control;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"SGIS_\", 5))\r\n      {\r\n#ifdef GLX_SGIS_blended_overlay\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"blended_overlay\", 15))\r\n        {\r\n          ret = GLXEW_SGIS_blended_overlay;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GLX_SGIS_color_range\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"color_range\", 11))\r\n        {\r\n          ret = GLXEW_SGIS_color_range;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GLX_SGIS_multisample\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"multisample\", 11))\r\n        {\r\n          ret = GLXEW_SGIS_multisample;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GLX_SGIS_shared_multisample\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"shared_multisample\", 18))\r\n        {\r\n          ret = GLXEW_SGIS_shared_multisample;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"SGIX_\", 5))\r\n      {\r\n#ifdef GLX_SGIX_fbconfig\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"fbconfig\", 8))\r\n        {\r\n          ret = GLXEW_SGIX_fbconfig;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GLX_SGIX_hyperpipe\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"hyperpipe\", 9))\r\n        {\r\n          ret = GLXEW_SGIX_hyperpipe;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GLX_SGIX_pbuffer\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"pbuffer\", 7))\r\n        {\r\n          ret = GLXEW_SGIX_pbuffer;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GLX_SGIX_swap_barrier\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"swap_barrier\", 12))\r\n        {\r\n          ret = GLXEW_SGIX_swap_barrier;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GLX_SGIX_swap_group\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"swap_group\", 10))\r\n        {\r\n          ret = GLXEW_SGIX_swap_group;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GLX_SGIX_video_resize\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"video_resize\", 12))\r\n        {\r\n          ret = GLXEW_SGIX_video_resize;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GLX_SGIX_visual_select_group\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"visual_select_group\", 19))\r\n        {\r\n          ret = GLXEW_SGIX_visual_select_group;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"SGI_\", 4))\r\n      {\r\n#ifdef GLX_SGI_cushion\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"cushion\", 7))\r\n        {\r\n          ret = GLXEW_SGI_cushion;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GLX_SGI_make_current_read\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"make_current_read\", 17))\r\n        {\r\n          ret = GLXEW_SGI_make_current_read;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GLX_SGI_swap_control\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"swap_control\", 12))\r\n        {\r\n          ret = GLXEW_SGI_swap_control;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GLX_SGI_video_sync\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"video_sync\", 10))\r\n        {\r\n          ret = GLXEW_SGI_video_sync;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n      if (_glewStrSame2(&pos, &len, (const GLubyte*)\"SUN_\", 4))\r\n      {\r\n#ifdef GLX_SUN_get_transparent_index\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"get_transparent_index\", 21))\r\n        {\r\n          ret = GLXEW_SUN_get_transparent_index;\r\n          continue;\r\n        }\r\n#endif\r\n#ifdef GLX_SUN_video_resize\r\n        if (_glewStrSame3(&pos, &len, (const GLubyte*)\"video_resize\", 12))\r\n        {\r\n          ret = GLXEW_SUN_video_resize;\r\n          continue;\r\n        }\r\n#endif\r\n      }\r\n    }\r\n    ret = (len == 0);\r\n  }\r\n  return ret;\r\n}\r\n\r\n#endif /* _WIN32 */\r\n"
  },
  {
    "path": "libs/glew/src/glewinfo.c",
    "content": "/*\r\n** The OpenGL Extension Wrangler Library\r\n** Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>\r\n** Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>\r\n** Copyright (C) 2002, Lev Povalahev\r\n** All rights reserved.\r\n** \r\n** Redistribution and use in source and binary forms, with or without \r\n** modification, are permitted provided that the following conditions are met:\r\n** \r\n** * Redistributions of source code must retain the above copyright notice, \r\n**   this list of conditions and the following disclaimer.\r\n** * Redistributions in binary form must reproduce the above copyright notice, \r\n**   this list of conditions and the following disclaimer in the documentation \r\n**   and/or other materials provided with the distribution.\r\n** * The name of the author may be used to endorse or promote products \r\n**   derived from this software without specific prior written permission.\r\n**\r\n** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" \r\n** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r\n** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r\n** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE \r\n** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \r\n** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \r\n** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r\n** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r\n** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r\n** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\r\n** THE POSSIBILITY OF SUCH DAMAGE.\r\n*/\r\n\r\n#include <stdio.h>\r\n#include <stdlib.h>\r\n#include <string.h>\r\n#include <GL/glew.h>\r\n#if defined(_WIN32)\r\n#include <GL/wglew.h>\r\n#elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX)\r\n#include <GL/glxew.h>\r\n#endif\r\n\r\nstatic FILE* f;\r\n\r\n#ifdef GLEW_MX\r\nGLEWContext _glewctx;\r\n#define glewGetContext() (&_glewctx)\r\n#ifdef _WIN32\r\nWGLEWContext _wglewctx;\r\n#define wglewGetContext() (&_wglewctx)\r\n#elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX)\r\nGLXEWContext _glxewctx;\r\n#define glxewGetContext() (&_glxewctx)\r\n#endif\r\n#endif\r\n\r\n#if defined(_WIN32)\r\nGLboolean glewCreateContext (int* pixelformat);\r\n#elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX)\r\nGLboolean glewCreateContext (const char* display, int* visual);\r\n#else\r\nGLboolean glewCreateContext ();\r\n#endif\r\n\r\n#if defined(_WIN32) || !defined(__APPLE__) || defined(GLEW_APPLE_GLX)\r\nGLboolean glewParseArgs (int argc, char** argv, char** display, int* visual);\r\n#endif\r\n\r\nvoid glewDestroyContext ();\r\n\r\n/* ------------------------------------------------------------------------- */\r\n\r\nstatic void glewPrintExt (const char* name, GLboolean def1, GLboolean def2, GLboolean def3)\r\n{\r\n  unsigned int i;\r\n  fprintf(f, \"\\n%s:\", name);\r\n  for (i=0; i<62-strlen(name); i++) fprintf(f, \" \");\r\n  fprintf(f, \"%s \", def1 ? \"OK\" : \"MISSING\");\r\n  if (def1 != def2)\r\n    fprintf(f, \"[%s] \", def2 ? \"OK\" : \"MISSING\");\r\n  if (def1 != def3)\r\n    fprintf(f, \"[%s]\\n\", def3 ? \"OK\" : \"MISSING\");\r\n  else\r\n    fprintf(f, \"\\n\");\r\n  for (i=0; i<strlen(name)+1; i++) fprintf(f, \"-\");\r\n  fprintf(f, \"\\n\");\r\n  fflush(f);\r\n}\r\n\r\nstatic void glewInfoFunc (const char* name, GLint undefined)\r\n{\r\n  unsigned int i;\r\n  fprintf(f, \"  %s:\", name);\r\n  for (i=0; i<60-strlen(name); i++) fprintf(f, \" \");\r\n  fprintf(f, \"%s\\n\", undefined ? \"MISSING\" : \"OK\");\r\n  fflush(f);\r\n}\r\n\r\n/* ----------------------------- GL_VERSION_1_1 ---------------------------- */\r\n\r\n#ifdef GL_VERSION_1_1\r\n\r\nstatic void _glewInfo_GL_VERSION_1_1 (void)\r\n{\r\n  glewPrintExt(\"GL_VERSION_1_1\", GLEW_VERSION_1_1, GLEW_VERSION_1_1, GLEW_VERSION_1_1);\r\n}\r\n\r\n#endif /* GL_VERSION_1_1 */\r\n\r\n#ifdef GL_VERSION_1_2\r\n\r\nstatic void _glewInfo_GL_VERSION_1_2 (void)\r\n{\r\n  glewPrintExt(\"GL_VERSION_1_2\", GLEW_VERSION_1_2, GLEW_VERSION_1_2, GLEW_VERSION_1_2);\r\n\r\n  glewInfoFunc(\"glCopyTexSubImage3D\", glCopyTexSubImage3D == NULL);\r\n  glewInfoFunc(\"glDrawRangeElements\", glDrawRangeElements == NULL);\r\n  glewInfoFunc(\"glTexImage3D\", glTexImage3D == NULL);\r\n  glewInfoFunc(\"glTexSubImage3D\", glTexSubImage3D == NULL);\r\n}\r\n\r\n#endif /* GL_VERSION_1_2 */\r\n\r\n#ifdef GL_VERSION_1_3\r\n\r\nstatic void _glewInfo_GL_VERSION_1_3 (void)\r\n{\r\n  glewPrintExt(\"GL_VERSION_1_3\", GLEW_VERSION_1_3, GLEW_VERSION_1_3, GLEW_VERSION_1_3);\r\n\r\n  glewInfoFunc(\"glActiveTexture\", glActiveTexture == NULL);\r\n  glewInfoFunc(\"glClientActiveTexture\", glClientActiveTexture == NULL);\r\n  glewInfoFunc(\"glCompressedTexImage1D\", glCompressedTexImage1D == NULL);\r\n  glewInfoFunc(\"glCompressedTexImage2D\", glCompressedTexImage2D == NULL);\r\n  glewInfoFunc(\"glCompressedTexImage3D\", glCompressedTexImage3D == NULL);\r\n  glewInfoFunc(\"glCompressedTexSubImage1D\", glCompressedTexSubImage1D == NULL);\r\n  glewInfoFunc(\"glCompressedTexSubImage2D\", glCompressedTexSubImage2D == NULL);\r\n  glewInfoFunc(\"glCompressedTexSubImage3D\", glCompressedTexSubImage3D == NULL);\r\n  glewInfoFunc(\"glGetCompressedTexImage\", glGetCompressedTexImage == NULL);\r\n  glewInfoFunc(\"glLoadTransposeMatrixd\", glLoadTransposeMatrixd == NULL);\r\n  glewInfoFunc(\"glLoadTransposeMatrixf\", glLoadTransposeMatrixf == NULL);\r\n  glewInfoFunc(\"glMultTransposeMatrixd\", glMultTransposeMatrixd == NULL);\r\n  glewInfoFunc(\"glMultTransposeMatrixf\", glMultTransposeMatrixf == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord1d\", glMultiTexCoord1d == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord1dv\", glMultiTexCoord1dv == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord1f\", glMultiTexCoord1f == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord1fv\", glMultiTexCoord1fv == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord1i\", glMultiTexCoord1i == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord1iv\", glMultiTexCoord1iv == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord1s\", glMultiTexCoord1s == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord1sv\", glMultiTexCoord1sv == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord2d\", glMultiTexCoord2d == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord2dv\", glMultiTexCoord2dv == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord2f\", glMultiTexCoord2f == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord2fv\", glMultiTexCoord2fv == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord2i\", glMultiTexCoord2i == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord2iv\", glMultiTexCoord2iv == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord2s\", glMultiTexCoord2s == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord2sv\", glMultiTexCoord2sv == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord3d\", glMultiTexCoord3d == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord3dv\", glMultiTexCoord3dv == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord3f\", glMultiTexCoord3f == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord3fv\", glMultiTexCoord3fv == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord3i\", glMultiTexCoord3i == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord3iv\", glMultiTexCoord3iv == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord3s\", glMultiTexCoord3s == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord3sv\", glMultiTexCoord3sv == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord4d\", glMultiTexCoord4d == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord4dv\", glMultiTexCoord4dv == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord4f\", glMultiTexCoord4f == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord4fv\", glMultiTexCoord4fv == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord4i\", glMultiTexCoord4i == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord4iv\", glMultiTexCoord4iv == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord4s\", glMultiTexCoord4s == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord4sv\", glMultiTexCoord4sv == NULL);\r\n  glewInfoFunc(\"glSampleCoverage\", glSampleCoverage == NULL);\r\n}\r\n\r\n#endif /* GL_VERSION_1_3 */\r\n\r\n#ifdef GL_VERSION_1_4\r\n\r\nstatic void _glewInfo_GL_VERSION_1_4 (void)\r\n{\r\n  glewPrintExt(\"GL_VERSION_1_4\", GLEW_VERSION_1_4, GLEW_VERSION_1_4, GLEW_VERSION_1_4);\r\n\r\n  glewInfoFunc(\"glBlendColor\", glBlendColor == NULL);\r\n  glewInfoFunc(\"glBlendEquation\", glBlendEquation == NULL);\r\n  glewInfoFunc(\"glBlendFuncSeparate\", glBlendFuncSeparate == NULL);\r\n  glewInfoFunc(\"glFogCoordPointer\", glFogCoordPointer == NULL);\r\n  glewInfoFunc(\"glFogCoordd\", glFogCoordd == NULL);\r\n  glewInfoFunc(\"glFogCoorddv\", glFogCoorddv == NULL);\r\n  glewInfoFunc(\"glFogCoordf\", glFogCoordf == NULL);\r\n  glewInfoFunc(\"glFogCoordfv\", glFogCoordfv == NULL);\r\n  glewInfoFunc(\"glMultiDrawArrays\", glMultiDrawArrays == NULL);\r\n  glewInfoFunc(\"glMultiDrawElements\", glMultiDrawElements == NULL);\r\n  glewInfoFunc(\"glPointParameterf\", glPointParameterf == NULL);\r\n  glewInfoFunc(\"glPointParameterfv\", glPointParameterfv == NULL);\r\n  glewInfoFunc(\"glPointParameteri\", glPointParameteri == NULL);\r\n  glewInfoFunc(\"glPointParameteriv\", glPointParameteriv == NULL);\r\n  glewInfoFunc(\"glSecondaryColor3b\", glSecondaryColor3b == NULL);\r\n  glewInfoFunc(\"glSecondaryColor3bv\", glSecondaryColor3bv == NULL);\r\n  glewInfoFunc(\"glSecondaryColor3d\", glSecondaryColor3d == NULL);\r\n  glewInfoFunc(\"glSecondaryColor3dv\", glSecondaryColor3dv == NULL);\r\n  glewInfoFunc(\"glSecondaryColor3f\", glSecondaryColor3f == NULL);\r\n  glewInfoFunc(\"glSecondaryColor3fv\", glSecondaryColor3fv == NULL);\r\n  glewInfoFunc(\"glSecondaryColor3i\", glSecondaryColor3i == NULL);\r\n  glewInfoFunc(\"glSecondaryColor3iv\", glSecondaryColor3iv == NULL);\r\n  glewInfoFunc(\"glSecondaryColor3s\", glSecondaryColor3s == NULL);\r\n  glewInfoFunc(\"glSecondaryColor3sv\", glSecondaryColor3sv == NULL);\r\n  glewInfoFunc(\"glSecondaryColor3ub\", glSecondaryColor3ub == NULL);\r\n  glewInfoFunc(\"glSecondaryColor3ubv\", glSecondaryColor3ubv == NULL);\r\n  glewInfoFunc(\"glSecondaryColor3ui\", glSecondaryColor3ui == NULL);\r\n  glewInfoFunc(\"glSecondaryColor3uiv\", glSecondaryColor3uiv == NULL);\r\n  glewInfoFunc(\"glSecondaryColor3us\", glSecondaryColor3us == NULL);\r\n  glewInfoFunc(\"glSecondaryColor3usv\", glSecondaryColor3usv == NULL);\r\n  glewInfoFunc(\"glSecondaryColorPointer\", glSecondaryColorPointer == NULL);\r\n  glewInfoFunc(\"glWindowPos2d\", glWindowPos2d == NULL);\r\n  glewInfoFunc(\"glWindowPos2dv\", glWindowPos2dv == NULL);\r\n  glewInfoFunc(\"glWindowPos2f\", glWindowPos2f == NULL);\r\n  glewInfoFunc(\"glWindowPos2fv\", glWindowPos2fv == NULL);\r\n  glewInfoFunc(\"glWindowPos2i\", glWindowPos2i == NULL);\r\n  glewInfoFunc(\"glWindowPos2iv\", glWindowPos2iv == NULL);\r\n  glewInfoFunc(\"glWindowPos2s\", glWindowPos2s == NULL);\r\n  glewInfoFunc(\"glWindowPos2sv\", glWindowPos2sv == NULL);\r\n  glewInfoFunc(\"glWindowPos3d\", glWindowPos3d == NULL);\r\n  glewInfoFunc(\"glWindowPos3dv\", glWindowPos3dv == NULL);\r\n  glewInfoFunc(\"glWindowPos3f\", glWindowPos3f == NULL);\r\n  glewInfoFunc(\"glWindowPos3fv\", glWindowPos3fv == NULL);\r\n  glewInfoFunc(\"glWindowPos3i\", glWindowPos3i == NULL);\r\n  glewInfoFunc(\"glWindowPos3iv\", glWindowPos3iv == NULL);\r\n  glewInfoFunc(\"glWindowPos3s\", glWindowPos3s == NULL);\r\n  glewInfoFunc(\"glWindowPos3sv\", glWindowPos3sv == NULL);\r\n}\r\n\r\n#endif /* GL_VERSION_1_4 */\r\n\r\n#ifdef GL_VERSION_1_5\r\n\r\nstatic void _glewInfo_GL_VERSION_1_5 (void)\r\n{\r\n  glewPrintExt(\"GL_VERSION_1_5\", GLEW_VERSION_1_5, GLEW_VERSION_1_5, GLEW_VERSION_1_5);\r\n\r\n  glewInfoFunc(\"glBeginQuery\", glBeginQuery == NULL);\r\n  glewInfoFunc(\"glBindBuffer\", glBindBuffer == NULL);\r\n  glewInfoFunc(\"glBufferData\", glBufferData == NULL);\r\n  glewInfoFunc(\"glBufferSubData\", glBufferSubData == NULL);\r\n  glewInfoFunc(\"glDeleteBuffers\", glDeleteBuffers == NULL);\r\n  glewInfoFunc(\"glDeleteQueries\", glDeleteQueries == NULL);\r\n  glewInfoFunc(\"glEndQuery\", glEndQuery == NULL);\r\n  glewInfoFunc(\"glGenBuffers\", glGenBuffers == NULL);\r\n  glewInfoFunc(\"glGenQueries\", glGenQueries == NULL);\r\n  glewInfoFunc(\"glGetBufferParameteriv\", glGetBufferParameteriv == NULL);\r\n  glewInfoFunc(\"glGetBufferPointerv\", glGetBufferPointerv == NULL);\r\n  glewInfoFunc(\"glGetBufferSubData\", glGetBufferSubData == NULL);\r\n  glewInfoFunc(\"glGetQueryObjectiv\", glGetQueryObjectiv == NULL);\r\n  glewInfoFunc(\"glGetQueryObjectuiv\", glGetQueryObjectuiv == NULL);\r\n  glewInfoFunc(\"glGetQueryiv\", glGetQueryiv == NULL);\r\n  glewInfoFunc(\"glIsBuffer\", glIsBuffer == NULL);\r\n  glewInfoFunc(\"glIsQuery\", glIsQuery == NULL);\r\n  glewInfoFunc(\"glMapBuffer\", glMapBuffer == NULL);\r\n  glewInfoFunc(\"glUnmapBuffer\", glUnmapBuffer == NULL);\r\n}\r\n\r\n#endif /* GL_VERSION_1_5 */\r\n\r\n#ifdef GL_VERSION_2_0\r\n\r\nstatic void _glewInfo_GL_VERSION_2_0 (void)\r\n{\r\n  glewPrintExt(\"GL_VERSION_2_0\", GLEW_VERSION_2_0, GLEW_VERSION_2_0, GLEW_VERSION_2_0);\r\n\r\n  glewInfoFunc(\"glAttachShader\", glAttachShader == NULL);\r\n  glewInfoFunc(\"glBindAttribLocation\", glBindAttribLocation == NULL);\r\n  glewInfoFunc(\"glBlendEquationSeparate\", glBlendEquationSeparate == NULL);\r\n  glewInfoFunc(\"glCompileShader\", glCompileShader == NULL);\r\n  glewInfoFunc(\"glCreateProgram\", glCreateProgram == NULL);\r\n  glewInfoFunc(\"glCreateShader\", glCreateShader == NULL);\r\n  glewInfoFunc(\"glDeleteProgram\", glDeleteProgram == NULL);\r\n  glewInfoFunc(\"glDeleteShader\", glDeleteShader == NULL);\r\n  glewInfoFunc(\"glDetachShader\", glDetachShader == NULL);\r\n  glewInfoFunc(\"glDisableVertexAttribArray\", glDisableVertexAttribArray == NULL);\r\n  glewInfoFunc(\"glDrawBuffers\", glDrawBuffers == NULL);\r\n  glewInfoFunc(\"glEnableVertexAttribArray\", glEnableVertexAttribArray == NULL);\r\n  glewInfoFunc(\"glGetActiveAttrib\", glGetActiveAttrib == NULL);\r\n  glewInfoFunc(\"glGetActiveUniform\", glGetActiveUniform == NULL);\r\n  glewInfoFunc(\"glGetAttachedShaders\", glGetAttachedShaders == NULL);\r\n  glewInfoFunc(\"glGetAttribLocation\", glGetAttribLocation == NULL);\r\n  glewInfoFunc(\"glGetProgramInfoLog\", glGetProgramInfoLog == NULL);\r\n  glewInfoFunc(\"glGetProgramiv\", glGetProgramiv == NULL);\r\n  glewInfoFunc(\"glGetShaderInfoLog\", glGetShaderInfoLog == NULL);\r\n  glewInfoFunc(\"glGetShaderSource\", glGetShaderSource == NULL);\r\n  glewInfoFunc(\"glGetShaderiv\", glGetShaderiv == NULL);\r\n  glewInfoFunc(\"glGetUniformLocation\", glGetUniformLocation == NULL);\r\n  glewInfoFunc(\"glGetUniformfv\", glGetUniformfv == NULL);\r\n  glewInfoFunc(\"glGetUniformiv\", glGetUniformiv == NULL);\r\n  glewInfoFunc(\"glGetVertexAttribPointerv\", glGetVertexAttribPointerv == NULL);\r\n  glewInfoFunc(\"glGetVertexAttribdv\", glGetVertexAttribdv == NULL);\r\n  glewInfoFunc(\"glGetVertexAttribfv\", glGetVertexAttribfv == NULL);\r\n  glewInfoFunc(\"glGetVertexAttribiv\", glGetVertexAttribiv == NULL);\r\n  glewInfoFunc(\"glIsProgram\", glIsProgram == NULL);\r\n  glewInfoFunc(\"glIsShader\", glIsShader == NULL);\r\n  glewInfoFunc(\"glLinkProgram\", glLinkProgram == NULL);\r\n  glewInfoFunc(\"glShaderSource\", glShaderSource == NULL);\r\n  glewInfoFunc(\"glStencilFuncSeparate\", glStencilFuncSeparate == NULL);\r\n  glewInfoFunc(\"glStencilMaskSeparate\", glStencilMaskSeparate == NULL);\r\n  glewInfoFunc(\"glStencilOpSeparate\", glStencilOpSeparate == NULL);\r\n  glewInfoFunc(\"glUniform1f\", glUniform1f == NULL);\r\n  glewInfoFunc(\"glUniform1fv\", glUniform1fv == NULL);\r\n  glewInfoFunc(\"glUniform1i\", glUniform1i == NULL);\r\n  glewInfoFunc(\"glUniform1iv\", glUniform1iv == NULL);\r\n  glewInfoFunc(\"glUniform2f\", glUniform2f == NULL);\r\n  glewInfoFunc(\"glUniform2fv\", glUniform2fv == NULL);\r\n  glewInfoFunc(\"glUniform2i\", glUniform2i == NULL);\r\n  glewInfoFunc(\"glUniform2iv\", glUniform2iv == NULL);\r\n  glewInfoFunc(\"glUniform3f\", glUniform3f == NULL);\r\n  glewInfoFunc(\"glUniform3fv\", glUniform3fv == NULL);\r\n  glewInfoFunc(\"glUniform3i\", glUniform3i == NULL);\r\n  glewInfoFunc(\"glUniform3iv\", glUniform3iv == NULL);\r\n  glewInfoFunc(\"glUniform4f\", glUniform4f == NULL);\r\n  glewInfoFunc(\"glUniform4fv\", glUniform4fv == NULL);\r\n  glewInfoFunc(\"glUniform4i\", glUniform4i == NULL);\r\n  glewInfoFunc(\"glUniform4iv\", glUniform4iv == NULL);\r\n  glewInfoFunc(\"glUniformMatrix2fv\", glUniformMatrix2fv == NULL);\r\n  glewInfoFunc(\"glUniformMatrix3fv\", glUniformMatrix3fv == NULL);\r\n  glewInfoFunc(\"glUniformMatrix4fv\", glUniformMatrix4fv == NULL);\r\n  glewInfoFunc(\"glUseProgram\", glUseProgram == NULL);\r\n  glewInfoFunc(\"glValidateProgram\", glValidateProgram == NULL);\r\n  glewInfoFunc(\"glVertexAttrib1d\", glVertexAttrib1d == NULL);\r\n  glewInfoFunc(\"glVertexAttrib1dv\", glVertexAttrib1dv == NULL);\r\n  glewInfoFunc(\"glVertexAttrib1f\", glVertexAttrib1f == NULL);\r\n  glewInfoFunc(\"glVertexAttrib1fv\", glVertexAttrib1fv == NULL);\r\n  glewInfoFunc(\"glVertexAttrib1s\", glVertexAttrib1s == NULL);\r\n  glewInfoFunc(\"glVertexAttrib1sv\", glVertexAttrib1sv == NULL);\r\n  glewInfoFunc(\"glVertexAttrib2d\", glVertexAttrib2d == NULL);\r\n  glewInfoFunc(\"glVertexAttrib2dv\", glVertexAttrib2dv == NULL);\r\n  glewInfoFunc(\"glVertexAttrib2f\", glVertexAttrib2f == NULL);\r\n  glewInfoFunc(\"glVertexAttrib2fv\", glVertexAttrib2fv == NULL);\r\n  glewInfoFunc(\"glVertexAttrib2s\", glVertexAttrib2s == NULL);\r\n  glewInfoFunc(\"glVertexAttrib2sv\", glVertexAttrib2sv == NULL);\r\n  glewInfoFunc(\"glVertexAttrib3d\", glVertexAttrib3d == NULL);\r\n  glewInfoFunc(\"glVertexAttrib3dv\", glVertexAttrib3dv == NULL);\r\n  glewInfoFunc(\"glVertexAttrib3f\", glVertexAttrib3f == NULL);\r\n  glewInfoFunc(\"glVertexAttrib3fv\", glVertexAttrib3fv == NULL);\r\n  glewInfoFunc(\"glVertexAttrib3s\", glVertexAttrib3s == NULL);\r\n  glewInfoFunc(\"glVertexAttrib3sv\", glVertexAttrib3sv == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4Nbv\", glVertexAttrib4Nbv == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4Niv\", glVertexAttrib4Niv == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4Nsv\", glVertexAttrib4Nsv == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4Nub\", glVertexAttrib4Nub == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4Nubv\", glVertexAttrib4Nubv == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4Nuiv\", glVertexAttrib4Nuiv == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4Nusv\", glVertexAttrib4Nusv == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4bv\", glVertexAttrib4bv == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4d\", glVertexAttrib4d == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4dv\", glVertexAttrib4dv == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4f\", glVertexAttrib4f == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4fv\", glVertexAttrib4fv == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4iv\", glVertexAttrib4iv == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4s\", glVertexAttrib4s == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4sv\", glVertexAttrib4sv == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4ubv\", glVertexAttrib4ubv == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4uiv\", glVertexAttrib4uiv == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4usv\", glVertexAttrib4usv == NULL);\r\n  glewInfoFunc(\"glVertexAttribPointer\", glVertexAttribPointer == NULL);\r\n}\r\n\r\n#endif /* GL_VERSION_2_0 */\r\n\r\n#ifdef GL_VERSION_2_1\r\n\r\nstatic void _glewInfo_GL_VERSION_2_1 (void)\r\n{\r\n  glewPrintExt(\"GL_VERSION_2_1\", GLEW_VERSION_2_1, GLEW_VERSION_2_1, GLEW_VERSION_2_1);\r\n\r\n  glewInfoFunc(\"glUniformMatrix2x3fv\", glUniformMatrix2x3fv == NULL);\r\n  glewInfoFunc(\"glUniformMatrix2x4fv\", glUniformMatrix2x4fv == NULL);\r\n  glewInfoFunc(\"glUniformMatrix3x2fv\", glUniformMatrix3x2fv == NULL);\r\n  glewInfoFunc(\"glUniformMatrix3x4fv\", glUniformMatrix3x4fv == NULL);\r\n  glewInfoFunc(\"glUniformMatrix4x2fv\", glUniformMatrix4x2fv == NULL);\r\n  glewInfoFunc(\"glUniformMatrix4x3fv\", glUniformMatrix4x3fv == NULL);\r\n}\r\n\r\n#endif /* GL_VERSION_2_1 */\r\n\r\n#ifdef GL_VERSION_3_0\r\n\r\nstatic void _glewInfo_GL_VERSION_3_0 (void)\r\n{\r\n  glewPrintExt(\"GL_VERSION_3_0\", GLEW_VERSION_3_0, GLEW_VERSION_3_0, GLEW_VERSION_3_0);\r\n\r\n  glewInfoFunc(\"glBeginConditionalRender\", glBeginConditionalRender == NULL);\r\n  glewInfoFunc(\"glBeginTransformFeedback\", glBeginTransformFeedback == NULL);\r\n  glewInfoFunc(\"glBindFragDataLocation\", glBindFragDataLocation == NULL);\r\n  glewInfoFunc(\"glClampColor\", glClampColor == NULL);\r\n  glewInfoFunc(\"glClearBufferfi\", glClearBufferfi == NULL);\r\n  glewInfoFunc(\"glClearBufferfv\", glClearBufferfv == NULL);\r\n  glewInfoFunc(\"glClearBufferiv\", glClearBufferiv == NULL);\r\n  glewInfoFunc(\"glClearBufferuiv\", glClearBufferuiv == NULL);\r\n  glewInfoFunc(\"glColorMaski\", glColorMaski == NULL);\r\n  glewInfoFunc(\"glDisablei\", glDisablei == NULL);\r\n  glewInfoFunc(\"glEnablei\", glEnablei == NULL);\r\n  glewInfoFunc(\"glEndConditionalRender\", glEndConditionalRender == NULL);\r\n  glewInfoFunc(\"glEndTransformFeedback\", glEndTransformFeedback == NULL);\r\n  glewInfoFunc(\"glGetBooleani_v\", glGetBooleani_v == NULL);\r\n  glewInfoFunc(\"glGetFragDataLocation\", glGetFragDataLocation == NULL);\r\n  glewInfoFunc(\"glGetStringi\", glGetStringi == NULL);\r\n  glewInfoFunc(\"glGetTexParameterIiv\", glGetTexParameterIiv == NULL);\r\n  glewInfoFunc(\"glGetTexParameterIuiv\", glGetTexParameterIuiv == NULL);\r\n  glewInfoFunc(\"glGetTransformFeedbackVarying\", glGetTransformFeedbackVarying == NULL);\r\n  glewInfoFunc(\"glGetUniformuiv\", glGetUniformuiv == NULL);\r\n  glewInfoFunc(\"glGetVertexAttribIiv\", glGetVertexAttribIiv == NULL);\r\n  glewInfoFunc(\"glGetVertexAttribIuiv\", glGetVertexAttribIuiv == NULL);\r\n  glewInfoFunc(\"glIsEnabledi\", glIsEnabledi == NULL);\r\n  glewInfoFunc(\"glTexParameterIiv\", glTexParameterIiv == NULL);\r\n  glewInfoFunc(\"glTexParameterIuiv\", glTexParameterIuiv == NULL);\r\n  glewInfoFunc(\"glTransformFeedbackVaryings\", glTransformFeedbackVaryings == NULL);\r\n  glewInfoFunc(\"glUniform1ui\", glUniform1ui == NULL);\r\n  glewInfoFunc(\"glUniform1uiv\", glUniform1uiv == NULL);\r\n  glewInfoFunc(\"glUniform2ui\", glUniform2ui == NULL);\r\n  glewInfoFunc(\"glUniform2uiv\", glUniform2uiv == NULL);\r\n  glewInfoFunc(\"glUniform3ui\", glUniform3ui == NULL);\r\n  glewInfoFunc(\"glUniform3uiv\", glUniform3uiv == NULL);\r\n  glewInfoFunc(\"glUniform4ui\", glUniform4ui == NULL);\r\n  glewInfoFunc(\"glUniform4uiv\", glUniform4uiv == NULL);\r\n  glewInfoFunc(\"glVertexAttribI1i\", glVertexAttribI1i == NULL);\r\n  glewInfoFunc(\"glVertexAttribI1iv\", glVertexAttribI1iv == NULL);\r\n  glewInfoFunc(\"glVertexAttribI1ui\", glVertexAttribI1ui == NULL);\r\n  glewInfoFunc(\"glVertexAttribI1uiv\", glVertexAttribI1uiv == NULL);\r\n  glewInfoFunc(\"glVertexAttribI2i\", glVertexAttribI2i == NULL);\r\n  glewInfoFunc(\"glVertexAttribI2iv\", glVertexAttribI2iv == NULL);\r\n  glewInfoFunc(\"glVertexAttribI2ui\", glVertexAttribI2ui == NULL);\r\n  glewInfoFunc(\"glVertexAttribI2uiv\", glVertexAttribI2uiv == NULL);\r\n  glewInfoFunc(\"glVertexAttribI3i\", glVertexAttribI3i == NULL);\r\n  glewInfoFunc(\"glVertexAttribI3iv\", glVertexAttribI3iv == NULL);\r\n  glewInfoFunc(\"glVertexAttribI3ui\", glVertexAttribI3ui == NULL);\r\n  glewInfoFunc(\"glVertexAttribI3uiv\", glVertexAttribI3uiv == NULL);\r\n  glewInfoFunc(\"glVertexAttribI4bv\", glVertexAttribI4bv == NULL);\r\n  glewInfoFunc(\"glVertexAttribI4i\", glVertexAttribI4i == NULL);\r\n  glewInfoFunc(\"glVertexAttribI4iv\", glVertexAttribI4iv == NULL);\r\n  glewInfoFunc(\"glVertexAttribI4sv\", glVertexAttribI4sv == NULL);\r\n  glewInfoFunc(\"glVertexAttribI4ubv\", glVertexAttribI4ubv == NULL);\r\n  glewInfoFunc(\"glVertexAttribI4ui\", glVertexAttribI4ui == NULL);\r\n  glewInfoFunc(\"glVertexAttribI4uiv\", glVertexAttribI4uiv == NULL);\r\n  glewInfoFunc(\"glVertexAttribI4usv\", glVertexAttribI4usv == NULL);\r\n  glewInfoFunc(\"glVertexAttribIPointer\", glVertexAttribIPointer == NULL);\r\n}\r\n\r\n#endif /* GL_VERSION_3_0 */\r\n\r\n#ifdef GL_VERSION_3_1\r\n\r\nstatic void _glewInfo_GL_VERSION_3_1 (void)\r\n{\r\n  glewPrintExt(\"GL_VERSION_3_1\", GLEW_VERSION_3_1, GLEW_VERSION_3_1, GLEW_VERSION_3_1);\r\n\r\n  glewInfoFunc(\"glDrawArraysInstanced\", glDrawArraysInstanced == NULL);\r\n  glewInfoFunc(\"glDrawElementsInstanced\", glDrawElementsInstanced == NULL);\r\n  glewInfoFunc(\"glPrimitiveRestartIndex\", glPrimitiveRestartIndex == NULL);\r\n  glewInfoFunc(\"glTexBuffer\", glTexBuffer == NULL);\r\n}\r\n\r\n#endif /* GL_VERSION_3_1 */\r\n\r\n#ifdef GL_VERSION_3_2\r\n\r\nstatic void _glewInfo_GL_VERSION_3_2 (void)\r\n{\r\n  glewPrintExt(\"GL_VERSION_3_2\", GLEW_VERSION_3_2, GLEW_VERSION_3_2, GLEW_VERSION_3_2);\r\n\r\n  glewInfoFunc(\"glFramebufferTexture\", glFramebufferTexture == NULL);\r\n  glewInfoFunc(\"glGetBufferParameteri64v\", glGetBufferParameteri64v == NULL);\r\n  glewInfoFunc(\"glGetInteger64i_v\", glGetInteger64i_v == NULL);\r\n}\r\n\r\n#endif /* GL_VERSION_3_2 */\r\n\r\n#ifdef GL_3DFX_multisample\r\n\r\nstatic void _glewInfo_GL_3DFX_multisample (void)\r\n{\r\n  glewPrintExt(\"GL_3DFX_multisample\", GLEW_3DFX_multisample, glewIsSupported(\"GL_3DFX_multisample\"), glewGetExtension(\"GL_3DFX_multisample\"));\r\n}\r\n\r\n#endif /* GL_3DFX_multisample */\r\n\r\n#ifdef GL_3DFX_tbuffer\r\n\r\nstatic void _glewInfo_GL_3DFX_tbuffer (void)\r\n{\r\n  glewPrintExt(\"GL_3DFX_tbuffer\", GLEW_3DFX_tbuffer, glewIsSupported(\"GL_3DFX_tbuffer\"), glewGetExtension(\"GL_3DFX_tbuffer\"));\r\n\r\n  glewInfoFunc(\"glTbufferMask3DFX\", glTbufferMask3DFX == NULL);\r\n}\r\n\r\n#endif /* GL_3DFX_tbuffer */\r\n\r\n#ifdef GL_3DFX_texture_compression_FXT1\r\n\r\nstatic void _glewInfo_GL_3DFX_texture_compression_FXT1 (void)\r\n{\r\n  glewPrintExt(\"GL_3DFX_texture_compression_FXT1\", GLEW_3DFX_texture_compression_FXT1, glewIsSupported(\"GL_3DFX_texture_compression_FXT1\"), glewGetExtension(\"GL_3DFX_texture_compression_FXT1\"));\r\n}\r\n\r\n#endif /* GL_3DFX_texture_compression_FXT1 */\r\n\r\n#ifdef GL_AMD_draw_buffers_blend\r\n\r\nstatic void _glewInfo_GL_AMD_draw_buffers_blend (void)\r\n{\r\n  glewPrintExt(\"GL_AMD_draw_buffers_blend\", GLEW_AMD_draw_buffers_blend, glewIsSupported(\"GL_AMD_draw_buffers_blend\"), glewGetExtension(\"GL_AMD_draw_buffers_blend\"));\r\n\r\n  glewInfoFunc(\"glBlendEquationIndexedAMD\", glBlendEquationIndexedAMD == NULL);\r\n  glewInfoFunc(\"glBlendEquationSeparateIndexedAMD\", glBlendEquationSeparateIndexedAMD == NULL);\r\n  glewInfoFunc(\"glBlendFuncIndexedAMD\", glBlendFuncIndexedAMD == NULL);\r\n  glewInfoFunc(\"glBlendFuncSeparateIndexedAMD\", glBlendFuncSeparateIndexedAMD == NULL);\r\n}\r\n\r\n#endif /* GL_AMD_draw_buffers_blend */\r\n\r\n#ifdef GL_AMD_performance_monitor\r\n\r\nstatic void _glewInfo_GL_AMD_performance_monitor (void)\r\n{\r\n  glewPrintExt(\"GL_AMD_performance_monitor\", GLEW_AMD_performance_monitor, glewIsSupported(\"GL_AMD_performance_monitor\"), glewGetExtension(\"GL_AMD_performance_monitor\"));\r\n\r\n  glewInfoFunc(\"glBeginPerfMonitorAMD\", glBeginPerfMonitorAMD == NULL);\r\n  glewInfoFunc(\"glDeletePerfMonitorsAMD\", glDeletePerfMonitorsAMD == NULL);\r\n  glewInfoFunc(\"glEndPerfMonitorAMD\", glEndPerfMonitorAMD == NULL);\r\n  glewInfoFunc(\"glGenPerfMonitorsAMD\", glGenPerfMonitorsAMD == NULL);\r\n  glewInfoFunc(\"glGetPerfMonitorCounterDataAMD\", glGetPerfMonitorCounterDataAMD == NULL);\r\n  glewInfoFunc(\"glGetPerfMonitorCounterInfoAMD\", glGetPerfMonitorCounterInfoAMD == NULL);\r\n  glewInfoFunc(\"glGetPerfMonitorCounterStringAMD\", glGetPerfMonitorCounterStringAMD == NULL);\r\n  glewInfoFunc(\"glGetPerfMonitorCountersAMD\", glGetPerfMonitorCountersAMD == NULL);\r\n  glewInfoFunc(\"glGetPerfMonitorGroupStringAMD\", glGetPerfMonitorGroupStringAMD == NULL);\r\n  glewInfoFunc(\"glGetPerfMonitorGroupsAMD\", glGetPerfMonitorGroupsAMD == NULL);\r\n  glewInfoFunc(\"glSelectPerfMonitorCountersAMD\", glSelectPerfMonitorCountersAMD == NULL);\r\n}\r\n\r\n#endif /* GL_AMD_performance_monitor */\r\n\r\n#ifdef GL_AMD_seamless_cubemap_per_texture\r\n\r\nstatic void _glewInfo_GL_AMD_seamless_cubemap_per_texture (void)\r\n{\r\n  glewPrintExt(\"GL_AMD_seamless_cubemap_per_texture\", GLEW_AMD_seamless_cubemap_per_texture, glewIsSupported(\"GL_AMD_seamless_cubemap_per_texture\"), glewGetExtension(\"GL_AMD_seamless_cubemap_per_texture\"));\r\n}\r\n\r\n#endif /* GL_AMD_seamless_cubemap_per_texture */\r\n\r\n#ifdef GL_AMD_shader_stencil_export\r\n\r\nstatic void _glewInfo_GL_AMD_shader_stencil_export (void)\r\n{\r\n  glewPrintExt(\"GL_AMD_shader_stencil_export\", GLEW_AMD_shader_stencil_export, glewIsSupported(\"GL_AMD_shader_stencil_export\"), glewGetExtension(\"GL_AMD_shader_stencil_export\"));\r\n}\r\n\r\n#endif /* GL_AMD_shader_stencil_export */\r\n\r\n#ifdef GL_AMD_texture_texture4\r\n\r\nstatic void _glewInfo_GL_AMD_texture_texture4 (void)\r\n{\r\n  glewPrintExt(\"GL_AMD_texture_texture4\", GLEW_AMD_texture_texture4, glewIsSupported(\"GL_AMD_texture_texture4\"), glewGetExtension(\"GL_AMD_texture_texture4\"));\r\n}\r\n\r\n#endif /* GL_AMD_texture_texture4 */\r\n\r\n#ifdef GL_AMD_vertex_shader_tessellator\r\n\r\nstatic void _glewInfo_GL_AMD_vertex_shader_tessellator (void)\r\n{\r\n  glewPrintExt(\"GL_AMD_vertex_shader_tessellator\", GLEW_AMD_vertex_shader_tessellator, glewIsSupported(\"GL_AMD_vertex_shader_tessellator\"), glewGetExtension(\"GL_AMD_vertex_shader_tessellator\"));\r\n\r\n  glewInfoFunc(\"glTessellationFactorAMD\", glTessellationFactorAMD == NULL);\r\n  glewInfoFunc(\"glTessellationModeAMD\", glTessellationModeAMD == NULL);\r\n}\r\n\r\n#endif /* GL_AMD_vertex_shader_tessellator */\r\n\r\n#ifdef GL_APPLE_aux_depth_stencil\r\n\r\nstatic void _glewInfo_GL_APPLE_aux_depth_stencil (void)\r\n{\r\n  glewPrintExt(\"GL_APPLE_aux_depth_stencil\", GLEW_APPLE_aux_depth_stencil, glewIsSupported(\"GL_APPLE_aux_depth_stencil\"), glewGetExtension(\"GL_APPLE_aux_depth_stencil\"));\r\n}\r\n\r\n#endif /* GL_APPLE_aux_depth_stencil */\r\n\r\n#ifdef GL_APPLE_client_storage\r\n\r\nstatic void _glewInfo_GL_APPLE_client_storage (void)\r\n{\r\n  glewPrintExt(\"GL_APPLE_client_storage\", GLEW_APPLE_client_storage, glewIsSupported(\"GL_APPLE_client_storage\"), glewGetExtension(\"GL_APPLE_client_storage\"));\r\n}\r\n\r\n#endif /* GL_APPLE_client_storage */\r\n\r\n#ifdef GL_APPLE_element_array\r\n\r\nstatic void _glewInfo_GL_APPLE_element_array (void)\r\n{\r\n  glewPrintExt(\"GL_APPLE_element_array\", GLEW_APPLE_element_array, glewIsSupported(\"GL_APPLE_element_array\"), glewGetExtension(\"GL_APPLE_element_array\"));\r\n\r\n  glewInfoFunc(\"glDrawElementArrayAPPLE\", glDrawElementArrayAPPLE == NULL);\r\n  glewInfoFunc(\"glDrawRangeElementArrayAPPLE\", glDrawRangeElementArrayAPPLE == NULL);\r\n  glewInfoFunc(\"glElementPointerAPPLE\", glElementPointerAPPLE == NULL);\r\n  glewInfoFunc(\"glMultiDrawElementArrayAPPLE\", glMultiDrawElementArrayAPPLE == NULL);\r\n  glewInfoFunc(\"glMultiDrawRangeElementArrayAPPLE\", glMultiDrawRangeElementArrayAPPLE == NULL);\r\n}\r\n\r\n#endif /* GL_APPLE_element_array */\r\n\r\n#ifdef GL_APPLE_fence\r\n\r\nstatic void _glewInfo_GL_APPLE_fence (void)\r\n{\r\n  glewPrintExt(\"GL_APPLE_fence\", GLEW_APPLE_fence, glewIsSupported(\"GL_APPLE_fence\"), glewGetExtension(\"GL_APPLE_fence\"));\r\n\r\n  glewInfoFunc(\"glDeleteFencesAPPLE\", glDeleteFencesAPPLE == NULL);\r\n  glewInfoFunc(\"glFinishFenceAPPLE\", glFinishFenceAPPLE == NULL);\r\n  glewInfoFunc(\"glFinishObjectAPPLE\", glFinishObjectAPPLE == NULL);\r\n  glewInfoFunc(\"glGenFencesAPPLE\", glGenFencesAPPLE == NULL);\r\n  glewInfoFunc(\"glIsFenceAPPLE\", glIsFenceAPPLE == NULL);\r\n  glewInfoFunc(\"glSetFenceAPPLE\", glSetFenceAPPLE == NULL);\r\n  glewInfoFunc(\"glTestFenceAPPLE\", glTestFenceAPPLE == NULL);\r\n  glewInfoFunc(\"glTestObjectAPPLE\", glTestObjectAPPLE == NULL);\r\n}\r\n\r\n#endif /* GL_APPLE_fence */\r\n\r\n#ifdef GL_APPLE_float_pixels\r\n\r\nstatic void _glewInfo_GL_APPLE_float_pixels (void)\r\n{\r\n  glewPrintExt(\"GL_APPLE_float_pixels\", GLEW_APPLE_float_pixels, glewIsSupported(\"GL_APPLE_float_pixels\"), glewGetExtension(\"GL_APPLE_float_pixels\"));\r\n}\r\n\r\n#endif /* GL_APPLE_float_pixels */\r\n\r\n#ifdef GL_APPLE_flush_buffer_range\r\n\r\nstatic void _glewInfo_GL_APPLE_flush_buffer_range (void)\r\n{\r\n  glewPrintExt(\"GL_APPLE_flush_buffer_range\", GLEW_APPLE_flush_buffer_range, glewIsSupported(\"GL_APPLE_flush_buffer_range\"), glewGetExtension(\"GL_APPLE_flush_buffer_range\"));\r\n\r\n  glewInfoFunc(\"glBufferParameteriAPPLE\", glBufferParameteriAPPLE == NULL);\r\n  glewInfoFunc(\"glFlushMappedBufferRangeAPPLE\", glFlushMappedBufferRangeAPPLE == NULL);\r\n}\r\n\r\n#endif /* GL_APPLE_flush_buffer_range */\r\n\r\n#ifdef GL_APPLE_object_purgeable\r\n\r\nstatic void _glewInfo_GL_APPLE_object_purgeable (void)\r\n{\r\n  glewPrintExt(\"GL_APPLE_object_purgeable\", GLEW_APPLE_object_purgeable, glewIsSupported(\"GL_APPLE_object_purgeable\"), glewGetExtension(\"GL_APPLE_object_purgeable\"));\r\n\r\n  glewInfoFunc(\"glGetObjectParameterivAPPLE\", glGetObjectParameterivAPPLE == NULL);\r\n  glewInfoFunc(\"glObjectPurgeableAPPLE\", glObjectPurgeableAPPLE == NULL);\r\n  glewInfoFunc(\"glObjectUnpurgeableAPPLE\", glObjectUnpurgeableAPPLE == NULL);\r\n}\r\n\r\n#endif /* GL_APPLE_object_purgeable */\r\n\r\n#ifdef GL_APPLE_pixel_buffer\r\n\r\nstatic void _glewInfo_GL_APPLE_pixel_buffer (void)\r\n{\r\n  glewPrintExt(\"GL_APPLE_pixel_buffer\", GLEW_APPLE_pixel_buffer, glewIsSupported(\"GL_APPLE_pixel_buffer\"), glewGetExtension(\"GL_APPLE_pixel_buffer\"));\r\n}\r\n\r\n#endif /* GL_APPLE_pixel_buffer */\r\n\r\n#ifdef GL_APPLE_rgb_422\r\n\r\nstatic void _glewInfo_GL_APPLE_rgb_422 (void)\r\n{\r\n  glewPrintExt(\"GL_APPLE_rgb_422\", GLEW_APPLE_rgb_422, glewIsSupported(\"GL_APPLE_rgb_422\"), glewGetExtension(\"GL_APPLE_rgb_422\"));\r\n}\r\n\r\n#endif /* GL_APPLE_rgb_422 */\r\n\r\n#ifdef GL_APPLE_row_bytes\r\n\r\nstatic void _glewInfo_GL_APPLE_row_bytes (void)\r\n{\r\n  glewPrintExt(\"GL_APPLE_row_bytes\", GLEW_APPLE_row_bytes, glewIsSupported(\"GL_APPLE_row_bytes\"), glewGetExtension(\"GL_APPLE_row_bytes\"));\r\n}\r\n\r\n#endif /* GL_APPLE_row_bytes */\r\n\r\n#ifdef GL_APPLE_specular_vector\r\n\r\nstatic void _glewInfo_GL_APPLE_specular_vector (void)\r\n{\r\n  glewPrintExt(\"GL_APPLE_specular_vector\", GLEW_APPLE_specular_vector, glewIsSupported(\"GL_APPLE_specular_vector\"), glewGetExtension(\"GL_APPLE_specular_vector\"));\r\n}\r\n\r\n#endif /* GL_APPLE_specular_vector */\r\n\r\n#ifdef GL_APPLE_texture_range\r\n\r\nstatic void _glewInfo_GL_APPLE_texture_range (void)\r\n{\r\n  glewPrintExt(\"GL_APPLE_texture_range\", GLEW_APPLE_texture_range, glewIsSupported(\"GL_APPLE_texture_range\"), glewGetExtension(\"GL_APPLE_texture_range\"));\r\n\r\n  glewInfoFunc(\"glGetTexParameterPointervAPPLE\", glGetTexParameterPointervAPPLE == NULL);\r\n  glewInfoFunc(\"glTextureRangeAPPLE\", glTextureRangeAPPLE == NULL);\r\n}\r\n\r\n#endif /* GL_APPLE_texture_range */\r\n\r\n#ifdef GL_APPLE_transform_hint\r\n\r\nstatic void _glewInfo_GL_APPLE_transform_hint (void)\r\n{\r\n  glewPrintExt(\"GL_APPLE_transform_hint\", GLEW_APPLE_transform_hint, glewIsSupported(\"GL_APPLE_transform_hint\"), glewGetExtension(\"GL_APPLE_transform_hint\"));\r\n}\r\n\r\n#endif /* GL_APPLE_transform_hint */\r\n\r\n#ifdef GL_APPLE_vertex_array_object\r\n\r\nstatic void _glewInfo_GL_APPLE_vertex_array_object (void)\r\n{\r\n  glewPrintExt(\"GL_APPLE_vertex_array_object\", GLEW_APPLE_vertex_array_object, glewIsSupported(\"GL_APPLE_vertex_array_object\"), glewGetExtension(\"GL_APPLE_vertex_array_object\"));\r\n\r\n  glewInfoFunc(\"glBindVertexArrayAPPLE\", glBindVertexArrayAPPLE == NULL);\r\n  glewInfoFunc(\"glDeleteVertexArraysAPPLE\", glDeleteVertexArraysAPPLE == NULL);\r\n  glewInfoFunc(\"glGenVertexArraysAPPLE\", glGenVertexArraysAPPLE == NULL);\r\n  glewInfoFunc(\"glIsVertexArrayAPPLE\", glIsVertexArrayAPPLE == NULL);\r\n}\r\n\r\n#endif /* GL_APPLE_vertex_array_object */\r\n\r\n#ifdef GL_APPLE_vertex_array_range\r\n\r\nstatic void _glewInfo_GL_APPLE_vertex_array_range (void)\r\n{\r\n  glewPrintExt(\"GL_APPLE_vertex_array_range\", GLEW_APPLE_vertex_array_range, glewIsSupported(\"GL_APPLE_vertex_array_range\"), glewGetExtension(\"GL_APPLE_vertex_array_range\"));\r\n\r\n  glewInfoFunc(\"glFlushVertexArrayRangeAPPLE\", glFlushVertexArrayRangeAPPLE == NULL);\r\n  glewInfoFunc(\"glVertexArrayParameteriAPPLE\", glVertexArrayParameteriAPPLE == NULL);\r\n  glewInfoFunc(\"glVertexArrayRangeAPPLE\", glVertexArrayRangeAPPLE == NULL);\r\n}\r\n\r\n#endif /* GL_APPLE_vertex_array_range */\r\n\r\n#ifdef GL_APPLE_vertex_program_evaluators\r\n\r\nstatic void _glewInfo_GL_APPLE_vertex_program_evaluators (void)\r\n{\r\n  glewPrintExt(\"GL_APPLE_vertex_program_evaluators\", GLEW_APPLE_vertex_program_evaluators, glewIsSupported(\"GL_APPLE_vertex_program_evaluators\"), glewGetExtension(\"GL_APPLE_vertex_program_evaluators\"));\r\n\r\n  glewInfoFunc(\"glDisableVertexAttribAPPLE\", glDisableVertexAttribAPPLE == NULL);\r\n  glewInfoFunc(\"glEnableVertexAttribAPPLE\", glEnableVertexAttribAPPLE == NULL);\r\n  glewInfoFunc(\"glIsVertexAttribEnabledAPPLE\", glIsVertexAttribEnabledAPPLE == NULL);\r\n  glewInfoFunc(\"glMapVertexAttrib1dAPPLE\", glMapVertexAttrib1dAPPLE == NULL);\r\n  glewInfoFunc(\"glMapVertexAttrib1fAPPLE\", glMapVertexAttrib1fAPPLE == NULL);\r\n  glewInfoFunc(\"glMapVertexAttrib2dAPPLE\", glMapVertexAttrib2dAPPLE == NULL);\r\n  glewInfoFunc(\"glMapVertexAttrib2fAPPLE\", glMapVertexAttrib2fAPPLE == NULL);\r\n}\r\n\r\n#endif /* GL_APPLE_vertex_program_evaluators */\r\n\r\n#ifdef GL_APPLE_ycbcr_422\r\n\r\nstatic void _glewInfo_GL_APPLE_ycbcr_422 (void)\r\n{\r\n  glewPrintExt(\"GL_APPLE_ycbcr_422\", GLEW_APPLE_ycbcr_422, glewIsSupported(\"GL_APPLE_ycbcr_422\"), glewGetExtension(\"GL_APPLE_ycbcr_422\"));\r\n}\r\n\r\n#endif /* GL_APPLE_ycbcr_422 */\r\n\r\n#ifdef GL_ARB_color_buffer_float\r\n\r\nstatic void _glewInfo_GL_ARB_color_buffer_float (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_color_buffer_float\", GLEW_ARB_color_buffer_float, glewIsSupported(\"GL_ARB_color_buffer_float\"), glewGetExtension(\"GL_ARB_color_buffer_float\"));\r\n\r\n  glewInfoFunc(\"glClampColorARB\", glClampColorARB == NULL);\r\n}\r\n\r\n#endif /* GL_ARB_color_buffer_float */\r\n\r\n#ifdef GL_ARB_compatibility\r\n\r\nstatic void _glewInfo_GL_ARB_compatibility (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_compatibility\", GLEW_ARB_compatibility, glewIsSupported(\"GL_ARB_compatibility\"), glewGetExtension(\"GL_ARB_compatibility\"));\r\n}\r\n\r\n#endif /* GL_ARB_compatibility */\r\n\r\n#ifdef GL_ARB_copy_buffer\r\n\r\nstatic void _glewInfo_GL_ARB_copy_buffer (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_copy_buffer\", GLEW_ARB_copy_buffer, glewIsSupported(\"GL_ARB_copy_buffer\"), glewGetExtension(\"GL_ARB_copy_buffer\"));\r\n\r\n  glewInfoFunc(\"glCopyBufferSubData\", glCopyBufferSubData == NULL);\r\n}\r\n\r\n#endif /* GL_ARB_copy_buffer */\r\n\r\n#ifdef GL_ARB_depth_buffer_float\r\n\r\nstatic void _glewInfo_GL_ARB_depth_buffer_float (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_depth_buffer_float\", GLEW_ARB_depth_buffer_float, glewIsSupported(\"GL_ARB_depth_buffer_float\"), glewGetExtension(\"GL_ARB_depth_buffer_float\"));\r\n}\r\n\r\n#endif /* GL_ARB_depth_buffer_float */\r\n\r\n#ifdef GL_ARB_depth_clamp\r\n\r\nstatic void _glewInfo_GL_ARB_depth_clamp (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_depth_clamp\", GLEW_ARB_depth_clamp, glewIsSupported(\"GL_ARB_depth_clamp\"), glewGetExtension(\"GL_ARB_depth_clamp\"));\r\n}\r\n\r\n#endif /* GL_ARB_depth_clamp */\r\n\r\n#ifdef GL_ARB_depth_texture\r\n\r\nstatic void _glewInfo_GL_ARB_depth_texture (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_depth_texture\", GLEW_ARB_depth_texture, glewIsSupported(\"GL_ARB_depth_texture\"), glewGetExtension(\"GL_ARB_depth_texture\"));\r\n}\r\n\r\n#endif /* GL_ARB_depth_texture */\r\n\r\n#ifdef GL_ARB_draw_buffers\r\n\r\nstatic void _glewInfo_GL_ARB_draw_buffers (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_draw_buffers\", GLEW_ARB_draw_buffers, glewIsSupported(\"GL_ARB_draw_buffers\"), glewGetExtension(\"GL_ARB_draw_buffers\"));\r\n\r\n  glewInfoFunc(\"glDrawBuffersARB\", glDrawBuffersARB == NULL);\r\n}\r\n\r\n#endif /* GL_ARB_draw_buffers */\r\n\r\n#ifdef GL_ARB_draw_buffers_blend\r\n\r\nstatic void _glewInfo_GL_ARB_draw_buffers_blend (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_draw_buffers_blend\", GLEW_ARB_draw_buffers_blend, glewIsSupported(\"GL_ARB_draw_buffers_blend\"), glewGetExtension(\"GL_ARB_draw_buffers_blend\"));\r\n\r\n  glewInfoFunc(\"glBlendEquationSeparateiARB\", glBlendEquationSeparateiARB == NULL);\r\n  glewInfoFunc(\"glBlendEquationiARB\", glBlendEquationiARB == NULL);\r\n  glewInfoFunc(\"glBlendFuncSeparateiARB\", glBlendFuncSeparateiARB == NULL);\r\n  glewInfoFunc(\"glBlendFunciARB\", glBlendFunciARB == NULL);\r\n}\r\n\r\n#endif /* GL_ARB_draw_buffers_blend */\r\n\r\n#ifdef GL_ARB_draw_elements_base_vertex\r\n\r\nstatic void _glewInfo_GL_ARB_draw_elements_base_vertex (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_draw_elements_base_vertex\", GLEW_ARB_draw_elements_base_vertex, glewIsSupported(\"GL_ARB_draw_elements_base_vertex\"), glewGetExtension(\"GL_ARB_draw_elements_base_vertex\"));\r\n\r\n  glewInfoFunc(\"glDrawElementsBaseVertex\", glDrawElementsBaseVertex == NULL);\r\n  glewInfoFunc(\"glDrawElementsInstancedBaseVertex\", glDrawElementsInstancedBaseVertex == NULL);\r\n  glewInfoFunc(\"glDrawRangeElementsBaseVertex\", glDrawRangeElementsBaseVertex == NULL);\r\n  glewInfoFunc(\"glMultiDrawElementsBaseVertex\", glMultiDrawElementsBaseVertex == NULL);\r\n}\r\n\r\n#endif /* GL_ARB_draw_elements_base_vertex */\r\n\r\n#ifdef GL_ARB_draw_instanced\r\n\r\nstatic void _glewInfo_GL_ARB_draw_instanced (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_draw_instanced\", GLEW_ARB_draw_instanced, glewIsSupported(\"GL_ARB_draw_instanced\"), glewGetExtension(\"GL_ARB_draw_instanced\"));\r\n\r\n  glewInfoFunc(\"glDrawArraysInstancedARB\", glDrawArraysInstancedARB == NULL);\r\n  glewInfoFunc(\"glDrawElementsInstancedARB\", glDrawElementsInstancedARB == NULL);\r\n}\r\n\r\n#endif /* GL_ARB_draw_instanced */\r\n\r\n#ifdef GL_ARB_fragment_coord_conventions\r\n\r\nstatic void _glewInfo_GL_ARB_fragment_coord_conventions (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_fragment_coord_conventions\", GLEW_ARB_fragment_coord_conventions, glewIsSupported(\"GL_ARB_fragment_coord_conventions\"), glewGetExtension(\"GL_ARB_fragment_coord_conventions\"));\r\n}\r\n\r\n#endif /* GL_ARB_fragment_coord_conventions */\r\n\r\n#ifdef GL_ARB_fragment_program\r\n\r\nstatic void _glewInfo_GL_ARB_fragment_program (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_fragment_program\", GLEW_ARB_fragment_program, glewIsSupported(\"GL_ARB_fragment_program\"), glewGetExtension(\"GL_ARB_fragment_program\"));\r\n}\r\n\r\n#endif /* GL_ARB_fragment_program */\r\n\r\n#ifdef GL_ARB_fragment_program_shadow\r\n\r\nstatic void _glewInfo_GL_ARB_fragment_program_shadow (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_fragment_program_shadow\", GLEW_ARB_fragment_program_shadow, glewIsSupported(\"GL_ARB_fragment_program_shadow\"), glewGetExtension(\"GL_ARB_fragment_program_shadow\"));\r\n}\r\n\r\n#endif /* GL_ARB_fragment_program_shadow */\r\n\r\n#ifdef GL_ARB_fragment_shader\r\n\r\nstatic void _glewInfo_GL_ARB_fragment_shader (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_fragment_shader\", GLEW_ARB_fragment_shader, glewIsSupported(\"GL_ARB_fragment_shader\"), glewGetExtension(\"GL_ARB_fragment_shader\"));\r\n}\r\n\r\n#endif /* GL_ARB_fragment_shader */\r\n\r\n#ifdef GL_ARB_framebuffer_object\r\n\r\nstatic void _glewInfo_GL_ARB_framebuffer_object (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_framebuffer_object\", GLEW_ARB_framebuffer_object, glewIsSupported(\"GL_ARB_framebuffer_object\"), glewGetExtension(\"GL_ARB_framebuffer_object\"));\r\n\r\n  glewInfoFunc(\"glBindFramebuffer\", glBindFramebuffer == NULL);\r\n  glewInfoFunc(\"glBindRenderbuffer\", glBindRenderbuffer == NULL);\r\n  glewInfoFunc(\"glBlitFramebuffer\", glBlitFramebuffer == NULL);\r\n  glewInfoFunc(\"glCheckFramebufferStatus\", glCheckFramebufferStatus == NULL);\r\n  glewInfoFunc(\"glDeleteFramebuffers\", glDeleteFramebuffers == NULL);\r\n  glewInfoFunc(\"glDeleteRenderbuffers\", glDeleteRenderbuffers == NULL);\r\n  glewInfoFunc(\"glFramebufferRenderbuffer\", glFramebufferRenderbuffer == NULL);\r\n  glewInfoFunc(\"glFramebufferTexture1D\", glFramebufferTexture1D == NULL);\r\n  glewInfoFunc(\"glFramebufferTexture2D\", glFramebufferTexture2D == NULL);\r\n  glewInfoFunc(\"glFramebufferTexture3D\", glFramebufferTexture3D == NULL);\r\n  glewInfoFunc(\"glFramebufferTextureLayer\", glFramebufferTextureLayer == NULL);\r\n  glewInfoFunc(\"glGenFramebuffers\", glGenFramebuffers == NULL);\r\n  glewInfoFunc(\"glGenRenderbuffers\", glGenRenderbuffers == NULL);\r\n  glewInfoFunc(\"glGenerateMipmap\", glGenerateMipmap == NULL);\r\n  glewInfoFunc(\"glGetFramebufferAttachmentParameteriv\", glGetFramebufferAttachmentParameteriv == NULL);\r\n  glewInfoFunc(\"glGetRenderbufferParameteriv\", glGetRenderbufferParameteriv == NULL);\r\n  glewInfoFunc(\"glIsFramebuffer\", glIsFramebuffer == NULL);\r\n  glewInfoFunc(\"glIsRenderbuffer\", glIsRenderbuffer == NULL);\r\n  glewInfoFunc(\"glRenderbufferStorage\", glRenderbufferStorage == NULL);\r\n  glewInfoFunc(\"glRenderbufferStorageMultisample\", glRenderbufferStorageMultisample == NULL);\r\n}\r\n\r\n#endif /* GL_ARB_framebuffer_object */\r\n\r\n#ifdef GL_ARB_framebuffer_sRGB\r\n\r\nstatic void _glewInfo_GL_ARB_framebuffer_sRGB (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_framebuffer_sRGB\", GLEW_ARB_framebuffer_sRGB, glewIsSupported(\"GL_ARB_framebuffer_sRGB\"), glewGetExtension(\"GL_ARB_framebuffer_sRGB\"));\r\n}\r\n\r\n#endif /* GL_ARB_framebuffer_sRGB */\r\n\r\n#ifdef GL_ARB_geometry_shader4\r\n\r\nstatic void _glewInfo_GL_ARB_geometry_shader4 (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_geometry_shader4\", GLEW_ARB_geometry_shader4, glewIsSupported(\"GL_ARB_geometry_shader4\"), glewGetExtension(\"GL_ARB_geometry_shader4\"));\r\n\r\n  glewInfoFunc(\"glFramebufferTextureARB\", glFramebufferTextureARB == NULL);\r\n  glewInfoFunc(\"glFramebufferTextureFaceARB\", glFramebufferTextureFaceARB == NULL);\r\n  glewInfoFunc(\"glFramebufferTextureLayerARB\", glFramebufferTextureLayerARB == NULL);\r\n  glewInfoFunc(\"glProgramParameteriARB\", glProgramParameteriARB == NULL);\r\n}\r\n\r\n#endif /* GL_ARB_geometry_shader4 */\r\n\r\n#ifdef GL_ARB_half_float_pixel\r\n\r\nstatic void _glewInfo_GL_ARB_half_float_pixel (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_half_float_pixel\", GLEW_ARB_half_float_pixel, glewIsSupported(\"GL_ARB_half_float_pixel\"), glewGetExtension(\"GL_ARB_half_float_pixel\"));\r\n}\r\n\r\n#endif /* GL_ARB_half_float_pixel */\r\n\r\n#ifdef GL_ARB_half_float_vertex\r\n\r\nstatic void _glewInfo_GL_ARB_half_float_vertex (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_half_float_vertex\", GLEW_ARB_half_float_vertex, glewIsSupported(\"GL_ARB_half_float_vertex\"), glewGetExtension(\"GL_ARB_half_float_vertex\"));\r\n}\r\n\r\n#endif /* GL_ARB_half_float_vertex */\r\n\r\n#ifdef GL_ARB_imaging\r\n\r\nstatic void _glewInfo_GL_ARB_imaging (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_imaging\", GLEW_ARB_imaging, glewIsSupported(\"GL_ARB_imaging\"), glewGetExtension(\"GL_ARB_imaging\"));\r\n\r\n  glewInfoFunc(\"glBlendEquation\", glBlendEquation == NULL);\r\n  glewInfoFunc(\"glColorSubTable\", glColorSubTable == NULL);\r\n  glewInfoFunc(\"glColorTable\", glColorTable == NULL);\r\n  glewInfoFunc(\"glColorTableParameterfv\", glColorTableParameterfv == NULL);\r\n  glewInfoFunc(\"glColorTableParameteriv\", glColorTableParameteriv == NULL);\r\n  glewInfoFunc(\"glConvolutionFilter1D\", glConvolutionFilter1D == NULL);\r\n  glewInfoFunc(\"glConvolutionFilter2D\", glConvolutionFilter2D == NULL);\r\n  glewInfoFunc(\"glConvolutionParameterf\", glConvolutionParameterf == NULL);\r\n  glewInfoFunc(\"glConvolutionParameterfv\", glConvolutionParameterfv == NULL);\r\n  glewInfoFunc(\"glConvolutionParameteri\", glConvolutionParameteri == NULL);\r\n  glewInfoFunc(\"glConvolutionParameteriv\", glConvolutionParameteriv == NULL);\r\n  glewInfoFunc(\"glCopyColorSubTable\", glCopyColorSubTable == NULL);\r\n  glewInfoFunc(\"glCopyColorTable\", glCopyColorTable == NULL);\r\n  glewInfoFunc(\"glCopyConvolutionFilter1D\", glCopyConvolutionFilter1D == NULL);\r\n  glewInfoFunc(\"glCopyConvolutionFilter2D\", glCopyConvolutionFilter2D == NULL);\r\n  glewInfoFunc(\"glGetColorTable\", glGetColorTable == NULL);\r\n  glewInfoFunc(\"glGetColorTableParameterfv\", glGetColorTableParameterfv == NULL);\r\n  glewInfoFunc(\"glGetColorTableParameteriv\", glGetColorTableParameteriv == NULL);\r\n  glewInfoFunc(\"glGetConvolutionFilter\", glGetConvolutionFilter == NULL);\r\n  glewInfoFunc(\"glGetConvolutionParameterfv\", glGetConvolutionParameterfv == NULL);\r\n  glewInfoFunc(\"glGetConvolutionParameteriv\", glGetConvolutionParameteriv == NULL);\r\n  glewInfoFunc(\"glGetHistogram\", glGetHistogram == NULL);\r\n  glewInfoFunc(\"glGetHistogramParameterfv\", glGetHistogramParameterfv == NULL);\r\n  glewInfoFunc(\"glGetHistogramParameteriv\", glGetHistogramParameteriv == NULL);\r\n  glewInfoFunc(\"glGetMinmax\", glGetMinmax == NULL);\r\n  glewInfoFunc(\"glGetMinmaxParameterfv\", glGetMinmaxParameterfv == NULL);\r\n  glewInfoFunc(\"glGetMinmaxParameteriv\", glGetMinmaxParameteriv == NULL);\r\n  glewInfoFunc(\"glGetSeparableFilter\", glGetSeparableFilter == NULL);\r\n  glewInfoFunc(\"glHistogram\", glHistogram == NULL);\r\n  glewInfoFunc(\"glMinmax\", glMinmax == NULL);\r\n  glewInfoFunc(\"glResetHistogram\", glResetHistogram == NULL);\r\n  glewInfoFunc(\"glResetMinmax\", glResetMinmax == NULL);\r\n  glewInfoFunc(\"glSeparableFilter2D\", glSeparableFilter2D == NULL);\r\n}\r\n\r\n#endif /* GL_ARB_imaging */\r\n\r\n#ifdef GL_ARB_instanced_arrays\r\n\r\nstatic void _glewInfo_GL_ARB_instanced_arrays (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_instanced_arrays\", GLEW_ARB_instanced_arrays, glewIsSupported(\"GL_ARB_instanced_arrays\"), glewGetExtension(\"GL_ARB_instanced_arrays\"));\r\n\r\n  glewInfoFunc(\"glVertexAttribDivisorARB\", glVertexAttribDivisorARB == NULL);\r\n}\r\n\r\n#endif /* GL_ARB_instanced_arrays */\r\n\r\n#ifdef GL_ARB_map_buffer_range\r\n\r\nstatic void _glewInfo_GL_ARB_map_buffer_range (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_map_buffer_range\", GLEW_ARB_map_buffer_range, glewIsSupported(\"GL_ARB_map_buffer_range\"), glewGetExtension(\"GL_ARB_map_buffer_range\"));\r\n\r\n  glewInfoFunc(\"glFlushMappedBufferRange\", glFlushMappedBufferRange == NULL);\r\n  glewInfoFunc(\"glMapBufferRange\", glMapBufferRange == NULL);\r\n}\r\n\r\n#endif /* GL_ARB_map_buffer_range */\r\n\r\n#ifdef GL_ARB_matrix_palette\r\n\r\nstatic void _glewInfo_GL_ARB_matrix_palette (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_matrix_palette\", GLEW_ARB_matrix_palette, glewIsSupported(\"GL_ARB_matrix_palette\"), glewGetExtension(\"GL_ARB_matrix_palette\"));\r\n\r\n  glewInfoFunc(\"glCurrentPaletteMatrixARB\", glCurrentPaletteMatrixARB == NULL);\r\n  glewInfoFunc(\"glMatrixIndexPointerARB\", glMatrixIndexPointerARB == NULL);\r\n  glewInfoFunc(\"glMatrixIndexubvARB\", glMatrixIndexubvARB == NULL);\r\n  glewInfoFunc(\"glMatrixIndexuivARB\", glMatrixIndexuivARB == NULL);\r\n  glewInfoFunc(\"glMatrixIndexusvARB\", glMatrixIndexusvARB == NULL);\r\n}\r\n\r\n#endif /* GL_ARB_matrix_palette */\r\n\r\n#ifdef GL_ARB_multisample\r\n\r\nstatic void _glewInfo_GL_ARB_multisample (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_multisample\", GLEW_ARB_multisample, glewIsSupported(\"GL_ARB_multisample\"), glewGetExtension(\"GL_ARB_multisample\"));\r\n\r\n  glewInfoFunc(\"glSampleCoverageARB\", glSampleCoverageARB == NULL);\r\n}\r\n\r\n#endif /* GL_ARB_multisample */\r\n\r\n#ifdef GL_ARB_multitexture\r\n\r\nstatic void _glewInfo_GL_ARB_multitexture (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_multitexture\", GLEW_ARB_multitexture, glewIsSupported(\"GL_ARB_multitexture\"), glewGetExtension(\"GL_ARB_multitexture\"));\r\n\r\n  glewInfoFunc(\"glActiveTextureARB\", glActiveTextureARB == NULL);\r\n  glewInfoFunc(\"glClientActiveTextureARB\", glClientActiveTextureARB == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord1dARB\", glMultiTexCoord1dARB == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord1dvARB\", glMultiTexCoord1dvARB == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord1fARB\", glMultiTexCoord1fARB == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord1fvARB\", glMultiTexCoord1fvARB == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord1iARB\", glMultiTexCoord1iARB == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord1ivARB\", glMultiTexCoord1ivARB == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord1sARB\", glMultiTexCoord1sARB == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord1svARB\", glMultiTexCoord1svARB == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord2dARB\", glMultiTexCoord2dARB == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord2dvARB\", glMultiTexCoord2dvARB == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord2fARB\", glMultiTexCoord2fARB == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord2fvARB\", glMultiTexCoord2fvARB == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord2iARB\", glMultiTexCoord2iARB == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord2ivARB\", glMultiTexCoord2ivARB == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord2sARB\", glMultiTexCoord2sARB == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord2svARB\", glMultiTexCoord2svARB == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord3dARB\", glMultiTexCoord3dARB == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord3dvARB\", glMultiTexCoord3dvARB == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord3fARB\", glMultiTexCoord3fARB == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord3fvARB\", glMultiTexCoord3fvARB == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord3iARB\", glMultiTexCoord3iARB == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord3ivARB\", glMultiTexCoord3ivARB == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord3sARB\", glMultiTexCoord3sARB == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord3svARB\", glMultiTexCoord3svARB == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord4dARB\", glMultiTexCoord4dARB == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord4dvARB\", glMultiTexCoord4dvARB == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord4fARB\", glMultiTexCoord4fARB == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord4fvARB\", glMultiTexCoord4fvARB == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord4iARB\", glMultiTexCoord4iARB == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord4ivARB\", glMultiTexCoord4ivARB == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord4sARB\", glMultiTexCoord4sARB == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord4svARB\", glMultiTexCoord4svARB == NULL);\r\n}\r\n\r\n#endif /* GL_ARB_multitexture */\r\n\r\n#ifdef GL_ARB_occlusion_query\r\n\r\nstatic void _glewInfo_GL_ARB_occlusion_query (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_occlusion_query\", GLEW_ARB_occlusion_query, glewIsSupported(\"GL_ARB_occlusion_query\"), glewGetExtension(\"GL_ARB_occlusion_query\"));\r\n\r\n  glewInfoFunc(\"glBeginQueryARB\", glBeginQueryARB == NULL);\r\n  glewInfoFunc(\"glDeleteQueriesARB\", glDeleteQueriesARB == NULL);\r\n  glewInfoFunc(\"glEndQueryARB\", glEndQueryARB == NULL);\r\n  glewInfoFunc(\"glGenQueriesARB\", glGenQueriesARB == NULL);\r\n  glewInfoFunc(\"glGetQueryObjectivARB\", glGetQueryObjectivARB == NULL);\r\n  glewInfoFunc(\"glGetQueryObjectuivARB\", glGetQueryObjectuivARB == NULL);\r\n  glewInfoFunc(\"glGetQueryivARB\", glGetQueryivARB == NULL);\r\n  glewInfoFunc(\"glIsQueryARB\", glIsQueryARB == NULL);\r\n}\r\n\r\n#endif /* GL_ARB_occlusion_query */\r\n\r\n#ifdef GL_ARB_pixel_buffer_object\r\n\r\nstatic void _glewInfo_GL_ARB_pixel_buffer_object (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_pixel_buffer_object\", GLEW_ARB_pixel_buffer_object, glewIsSupported(\"GL_ARB_pixel_buffer_object\"), glewGetExtension(\"GL_ARB_pixel_buffer_object\"));\r\n}\r\n\r\n#endif /* GL_ARB_pixel_buffer_object */\r\n\r\n#ifdef GL_ARB_point_parameters\r\n\r\nstatic void _glewInfo_GL_ARB_point_parameters (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_point_parameters\", GLEW_ARB_point_parameters, glewIsSupported(\"GL_ARB_point_parameters\"), glewGetExtension(\"GL_ARB_point_parameters\"));\r\n\r\n  glewInfoFunc(\"glPointParameterfARB\", glPointParameterfARB == NULL);\r\n  glewInfoFunc(\"glPointParameterfvARB\", glPointParameterfvARB == NULL);\r\n}\r\n\r\n#endif /* GL_ARB_point_parameters */\r\n\r\n#ifdef GL_ARB_point_sprite\r\n\r\nstatic void _glewInfo_GL_ARB_point_sprite (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_point_sprite\", GLEW_ARB_point_sprite, glewIsSupported(\"GL_ARB_point_sprite\"), glewGetExtension(\"GL_ARB_point_sprite\"));\r\n}\r\n\r\n#endif /* GL_ARB_point_sprite */\r\n\r\n#ifdef GL_ARB_provoking_vertex\r\n\r\nstatic void _glewInfo_GL_ARB_provoking_vertex (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_provoking_vertex\", GLEW_ARB_provoking_vertex, glewIsSupported(\"GL_ARB_provoking_vertex\"), glewGetExtension(\"GL_ARB_provoking_vertex\"));\r\n\r\n  glewInfoFunc(\"glProvokingVertex\", glProvokingVertex == NULL);\r\n}\r\n\r\n#endif /* GL_ARB_provoking_vertex */\r\n\r\n#ifdef GL_ARB_sample_shading\r\n\r\nstatic void _glewInfo_GL_ARB_sample_shading (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_sample_shading\", GLEW_ARB_sample_shading, glewIsSupported(\"GL_ARB_sample_shading\"), glewGetExtension(\"GL_ARB_sample_shading\"));\r\n\r\n  glewInfoFunc(\"glMinSampleShadingARB\", glMinSampleShadingARB == NULL);\r\n}\r\n\r\n#endif /* GL_ARB_sample_shading */\r\n\r\n#ifdef GL_ARB_seamless_cube_map\r\n\r\nstatic void _glewInfo_GL_ARB_seamless_cube_map (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_seamless_cube_map\", GLEW_ARB_seamless_cube_map, glewIsSupported(\"GL_ARB_seamless_cube_map\"), glewGetExtension(\"GL_ARB_seamless_cube_map\"));\r\n}\r\n\r\n#endif /* GL_ARB_seamless_cube_map */\r\n\r\n#ifdef GL_ARB_shader_objects\r\n\r\nstatic void _glewInfo_GL_ARB_shader_objects (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_shader_objects\", GLEW_ARB_shader_objects, glewIsSupported(\"GL_ARB_shader_objects\"), glewGetExtension(\"GL_ARB_shader_objects\"));\r\n\r\n  glewInfoFunc(\"glAttachObjectARB\", glAttachObjectARB == NULL);\r\n  glewInfoFunc(\"glCompileShaderARB\", glCompileShaderARB == NULL);\r\n  glewInfoFunc(\"glCreateProgramObjectARB\", glCreateProgramObjectARB == NULL);\r\n  glewInfoFunc(\"glCreateShaderObjectARB\", glCreateShaderObjectARB == NULL);\r\n  glewInfoFunc(\"glDeleteObjectARB\", glDeleteObjectARB == NULL);\r\n  glewInfoFunc(\"glDetachObjectARB\", glDetachObjectARB == NULL);\r\n  glewInfoFunc(\"glGetActiveUniformARB\", glGetActiveUniformARB == NULL);\r\n  glewInfoFunc(\"glGetAttachedObjectsARB\", glGetAttachedObjectsARB == NULL);\r\n  glewInfoFunc(\"glGetHandleARB\", glGetHandleARB == NULL);\r\n  glewInfoFunc(\"glGetInfoLogARB\", glGetInfoLogARB == NULL);\r\n  glewInfoFunc(\"glGetObjectParameterfvARB\", glGetObjectParameterfvARB == NULL);\r\n  glewInfoFunc(\"glGetObjectParameterivARB\", glGetObjectParameterivARB == NULL);\r\n  glewInfoFunc(\"glGetShaderSourceARB\", glGetShaderSourceARB == NULL);\r\n  glewInfoFunc(\"glGetUniformLocationARB\", glGetUniformLocationARB == NULL);\r\n  glewInfoFunc(\"glGetUniformfvARB\", glGetUniformfvARB == NULL);\r\n  glewInfoFunc(\"glGetUniformivARB\", glGetUniformivARB == NULL);\r\n  glewInfoFunc(\"glLinkProgramARB\", glLinkProgramARB == NULL);\r\n  glewInfoFunc(\"glShaderSourceARB\", glShaderSourceARB == NULL);\r\n  glewInfoFunc(\"glUniform1fARB\", glUniform1fARB == NULL);\r\n  glewInfoFunc(\"glUniform1fvARB\", glUniform1fvARB == NULL);\r\n  glewInfoFunc(\"glUniform1iARB\", glUniform1iARB == NULL);\r\n  glewInfoFunc(\"glUniform1ivARB\", glUniform1ivARB == NULL);\r\n  glewInfoFunc(\"glUniform2fARB\", glUniform2fARB == NULL);\r\n  glewInfoFunc(\"glUniform2fvARB\", glUniform2fvARB == NULL);\r\n  glewInfoFunc(\"glUniform2iARB\", glUniform2iARB == NULL);\r\n  glewInfoFunc(\"glUniform2ivARB\", glUniform2ivARB == NULL);\r\n  glewInfoFunc(\"glUniform3fARB\", glUniform3fARB == NULL);\r\n  glewInfoFunc(\"glUniform3fvARB\", glUniform3fvARB == NULL);\r\n  glewInfoFunc(\"glUniform3iARB\", glUniform3iARB == NULL);\r\n  glewInfoFunc(\"glUniform3ivARB\", glUniform3ivARB == NULL);\r\n  glewInfoFunc(\"glUniform4fARB\", glUniform4fARB == NULL);\r\n  glewInfoFunc(\"glUniform4fvARB\", glUniform4fvARB == NULL);\r\n  glewInfoFunc(\"glUniform4iARB\", glUniform4iARB == NULL);\r\n  glewInfoFunc(\"glUniform4ivARB\", glUniform4ivARB == NULL);\r\n  glewInfoFunc(\"glUniformMatrix2fvARB\", glUniformMatrix2fvARB == NULL);\r\n  glewInfoFunc(\"glUniformMatrix3fvARB\", glUniformMatrix3fvARB == NULL);\r\n  glewInfoFunc(\"glUniformMatrix4fvARB\", glUniformMatrix4fvARB == NULL);\r\n  glewInfoFunc(\"glUseProgramObjectARB\", glUseProgramObjectARB == NULL);\r\n  glewInfoFunc(\"glValidateProgramARB\", glValidateProgramARB == NULL);\r\n}\r\n\r\n#endif /* GL_ARB_shader_objects */\r\n\r\n#ifdef GL_ARB_shader_texture_lod\r\n\r\nstatic void _glewInfo_GL_ARB_shader_texture_lod (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_shader_texture_lod\", GLEW_ARB_shader_texture_lod, glewIsSupported(\"GL_ARB_shader_texture_lod\"), glewGetExtension(\"GL_ARB_shader_texture_lod\"));\r\n}\r\n\r\n#endif /* GL_ARB_shader_texture_lod */\r\n\r\n#ifdef GL_ARB_shading_language_100\r\n\r\nstatic void _glewInfo_GL_ARB_shading_language_100 (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_shading_language_100\", GLEW_ARB_shading_language_100, glewIsSupported(\"GL_ARB_shading_language_100\"), glewGetExtension(\"GL_ARB_shading_language_100\"));\r\n}\r\n\r\n#endif /* GL_ARB_shading_language_100 */\r\n\r\n#ifdef GL_ARB_shadow\r\n\r\nstatic void _glewInfo_GL_ARB_shadow (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_shadow\", GLEW_ARB_shadow, glewIsSupported(\"GL_ARB_shadow\"), glewGetExtension(\"GL_ARB_shadow\"));\r\n}\r\n\r\n#endif /* GL_ARB_shadow */\r\n\r\n#ifdef GL_ARB_shadow_ambient\r\n\r\nstatic void _glewInfo_GL_ARB_shadow_ambient (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_shadow_ambient\", GLEW_ARB_shadow_ambient, glewIsSupported(\"GL_ARB_shadow_ambient\"), glewGetExtension(\"GL_ARB_shadow_ambient\"));\r\n}\r\n\r\n#endif /* GL_ARB_shadow_ambient */\r\n\r\n#ifdef GL_ARB_sync\r\n\r\nstatic void _glewInfo_GL_ARB_sync (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_sync\", GLEW_ARB_sync, glewIsSupported(\"GL_ARB_sync\"), glewGetExtension(\"GL_ARB_sync\"));\r\n\r\n  glewInfoFunc(\"glClientWaitSync\", glClientWaitSync == NULL);\r\n  glewInfoFunc(\"glDeleteSync\", glDeleteSync == NULL);\r\n  glewInfoFunc(\"glFenceSync\", glFenceSync == NULL);\r\n  glewInfoFunc(\"glGetInteger64v\", glGetInteger64v == NULL);\r\n  glewInfoFunc(\"glGetSynciv\", glGetSynciv == NULL);\r\n  glewInfoFunc(\"glIsSync\", glIsSync == NULL);\r\n  glewInfoFunc(\"glWaitSync\", glWaitSync == NULL);\r\n}\r\n\r\n#endif /* GL_ARB_sync */\r\n\r\n#ifdef GL_ARB_texture_border_clamp\r\n\r\nstatic void _glewInfo_GL_ARB_texture_border_clamp (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_texture_border_clamp\", GLEW_ARB_texture_border_clamp, glewIsSupported(\"GL_ARB_texture_border_clamp\"), glewGetExtension(\"GL_ARB_texture_border_clamp\"));\r\n}\r\n\r\n#endif /* GL_ARB_texture_border_clamp */\r\n\r\n#ifdef GL_ARB_texture_buffer_object\r\n\r\nstatic void _glewInfo_GL_ARB_texture_buffer_object (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_texture_buffer_object\", GLEW_ARB_texture_buffer_object, glewIsSupported(\"GL_ARB_texture_buffer_object\"), glewGetExtension(\"GL_ARB_texture_buffer_object\"));\r\n\r\n  glewInfoFunc(\"glTexBufferARB\", glTexBufferARB == NULL);\r\n}\r\n\r\n#endif /* GL_ARB_texture_buffer_object */\r\n\r\n#ifdef GL_ARB_texture_compression\r\n\r\nstatic void _glewInfo_GL_ARB_texture_compression (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_texture_compression\", GLEW_ARB_texture_compression, glewIsSupported(\"GL_ARB_texture_compression\"), glewGetExtension(\"GL_ARB_texture_compression\"));\r\n\r\n  glewInfoFunc(\"glCompressedTexImage1DARB\", glCompressedTexImage1DARB == NULL);\r\n  glewInfoFunc(\"glCompressedTexImage2DARB\", glCompressedTexImage2DARB == NULL);\r\n  glewInfoFunc(\"glCompressedTexImage3DARB\", glCompressedTexImage3DARB == NULL);\r\n  glewInfoFunc(\"glCompressedTexSubImage1DARB\", glCompressedTexSubImage1DARB == NULL);\r\n  glewInfoFunc(\"glCompressedTexSubImage2DARB\", glCompressedTexSubImage2DARB == NULL);\r\n  glewInfoFunc(\"glCompressedTexSubImage3DARB\", glCompressedTexSubImage3DARB == NULL);\r\n  glewInfoFunc(\"glGetCompressedTexImageARB\", glGetCompressedTexImageARB == NULL);\r\n}\r\n\r\n#endif /* GL_ARB_texture_compression */\r\n\r\n#ifdef GL_ARB_texture_compression_rgtc\r\n\r\nstatic void _glewInfo_GL_ARB_texture_compression_rgtc (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_texture_compression_rgtc\", GLEW_ARB_texture_compression_rgtc, glewIsSupported(\"GL_ARB_texture_compression_rgtc\"), glewGetExtension(\"GL_ARB_texture_compression_rgtc\"));\r\n}\r\n\r\n#endif /* GL_ARB_texture_compression_rgtc */\r\n\r\n#ifdef GL_ARB_texture_cube_map\r\n\r\nstatic void _glewInfo_GL_ARB_texture_cube_map (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_texture_cube_map\", GLEW_ARB_texture_cube_map, glewIsSupported(\"GL_ARB_texture_cube_map\"), glewGetExtension(\"GL_ARB_texture_cube_map\"));\r\n}\r\n\r\n#endif /* GL_ARB_texture_cube_map */\r\n\r\n#ifdef GL_ARB_texture_cube_map_array\r\n\r\nstatic void _glewInfo_GL_ARB_texture_cube_map_array (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_texture_cube_map_array\", GLEW_ARB_texture_cube_map_array, glewIsSupported(\"GL_ARB_texture_cube_map_array\"), glewGetExtension(\"GL_ARB_texture_cube_map_array\"));\r\n}\r\n\r\n#endif /* GL_ARB_texture_cube_map_array */\r\n\r\n#ifdef GL_ARB_texture_env_add\r\n\r\nstatic void _glewInfo_GL_ARB_texture_env_add (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_texture_env_add\", GLEW_ARB_texture_env_add, glewIsSupported(\"GL_ARB_texture_env_add\"), glewGetExtension(\"GL_ARB_texture_env_add\"));\r\n}\r\n\r\n#endif /* GL_ARB_texture_env_add */\r\n\r\n#ifdef GL_ARB_texture_env_combine\r\n\r\nstatic void _glewInfo_GL_ARB_texture_env_combine (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_texture_env_combine\", GLEW_ARB_texture_env_combine, glewIsSupported(\"GL_ARB_texture_env_combine\"), glewGetExtension(\"GL_ARB_texture_env_combine\"));\r\n}\r\n\r\n#endif /* GL_ARB_texture_env_combine */\r\n\r\n#ifdef GL_ARB_texture_env_crossbar\r\n\r\nstatic void _glewInfo_GL_ARB_texture_env_crossbar (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_texture_env_crossbar\", GLEW_ARB_texture_env_crossbar, glewIsSupported(\"GL_ARB_texture_env_crossbar\"), glewGetExtension(\"GL_ARB_texture_env_crossbar\"));\r\n}\r\n\r\n#endif /* GL_ARB_texture_env_crossbar */\r\n\r\n#ifdef GL_ARB_texture_env_dot3\r\n\r\nstatic void _glewInfo_GL_ARB_texture_env_dot3 (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_texture_env_dot3\", GLEW_ARB_texture_env_dot3, glewIsSupported(\"GL_ARB_texture_env_dot3\"), glewGetExtension(\"GL_ARB_texture_env_dot3\"));\r\n}\r\n\r\n#endif /* GL_ARB_texture_env_dot3 */\r\n\r\n#ifdef GL_ARB_texture_float\r\n\r\nstatic void _glewInfo_GL_ARB_texture_float (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_texture_float\", GLEW_ARB_texture_float, glewIsSupported(\"GL_ARB_texture_float\"), glewGetExtension(\"GL_ARB_texture_float\"));\r\n}\r\n\r\n#endif /* GL_ARB_texture_float */\r\n\r\n#ifdef GL_ARB_texture_gather\r\n\r\nstatic void _glewInfo_GL_ARB_texture_gather (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_texture_gather\", GLEW_ARB_texture_gather, glewIsSupported(\"GL_ARB_texture_gather\"), glewGetExtension(\"GL_ARB_texture_gather\"));\r\n}\r\n\r\n#endif /* GL_ARB_texture_gather */\r\n\r\n#ifdef GL_ARB_texture_mirrored_repeat\r\n\r\nstatic void _glewInfo_GL_ARB_texture_mirrored_repeat (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_texture_mirrored_repeat\", GLEW_ARB_texture_mirrored_repeat, glewIsSupported(\"GL_ARB_texture_mirrored_repeat\"), glewGetExtension(\"GL_ARB_texture_mirrored_repeat\"));\r\n}\r\n\r\n#endif /* GL_ARB_texture_mirrored_repeat */\r\n\r\n#ifdef GL_ARB_texture_multisample\r\n\r\nstatic void _glewInfo_GL_ARB_texture_multisample (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_texture_multisample\", GLEW_ARB_texture_multisample, glewIsSupported(\"GL_ARB_texture_multisample\"), glewGetExtension(\"GL_ARB_texture_multisample\"));\r\n\r\n  glewInfoFunc(\"glGetMultisamplefv\", glGetMultisamplefv == NULL);\r\n  glewInfoFunc(\"glSampleMaski\", glSampleMaski == NULL);\r\n  glewInfoFunc(\"glTexImage2DMultisample\", glTexImage2DMultisample == NULL);\r\n  glewInfoFunc(\"glTexImage3DMultisample\", glTexImage3DMultisample == NULL);\r\n}\r\n\r\n#endif /* GL_ARB_texture_multisample */\r\n\r\n#ifdef GL_ARB_texture_non_power_of_two\r\n\r\nstatic void _glewInfo_GL_ARB_texture_non_power_of_two (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_texture_non_power_of_two\", GLEW_ARB_texture_non_power_of_two, glewIsSupported(\"GL_ARB_texture_non_power_of_two\"), glewGetExtension(\"GL_ARB_texture_non_power_of_two\"));\r\n}\r\n\r\n#endif /* GL_ARB_texture_non_power_of_two */\r\n\r\n#ifdef GL_ARB_texture_query_lod\r\n\r\nstatic void _glewInfo_GL_ARB_texture_query_lod (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_texture_query_lod\", GLEW_ARB_texture_query_lod, glewIsSupported(\"GL_ARB_texture_query_lod\"), glewGetExtension(\"GL_ARB_texture_query_lod\"));\r\n}\r\n\r\n#endif /* GL_ARB_texture_query_lod */\r\n\r\n#ifdef GL_ARB_texture_rectangle\r\n\r\nstatic void _glewInfo_GL_ARB_texture_rectangle (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_texture_rectangle\", GLEW_ARB_texture_rectangle, glewIsSupported(\"GL_ARB_texture_rectangle\"), glewGetExtension(\"GL_ARB_texture_rectangle\"));\r\n}\r\n\r\n#endif /* GL_ARB_texture_rectangle */\r\n\r\n#ifdef GL_ARB_texture_rg\r\n\r\nstatic void _glewInfo_GL_ARB_texture_rg (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_texture_rg\", GLEW_ARB_texture_rg, glewIsSupported(\"GL_ARB_texture_rg\"), glewGetExtension(\"GL_ARB_texture_rg\"));\r\n}\r\n\r\n#endif /* GL_ARB_texture_rg */\r\n\r\n#ifdef GL_ARB_transpose_matrix\r\n\r\nstatic void _glewInfo_GL_ARB_transpose_matrix (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_transpose_matrix\", GLEW_ARB_transpose_matrix, glewIsSupported(\"GL_ARB_transpose_matrix\"), glewGetExtension(\"GL_ARB_transpose_matrix\"));\r\n\r\n  glewInfoFunc(\"glLoadTransposeMatrixdARB\", glLoadTransposeMatrixdARB == NULL);\r\n  glewInfoFunc(\"glLoadTransposeMatrixfARB\", glLoadTransposeMatrixfARB == NULL);\r\n  glewInfoFunc(\"glMultTransposeMatrixdARB\", glMultTransposeMatrixdARB == NULL);\r\n  glewInfoFunc(\"glMultTransposeMatrixfARB\", glMultTransposeMatrixfARB == NULL);\r\n}\r\n\r\n#endif /* GL_ARB_transpose_matrix */\r\n\r\n#ifdef GL_ARB_uniform_buffer_object\r\n\r\nstatic void _glewInfo_GL_ARB_uniform_buffer_object (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_uniform_buffer_object\", GLEW_ARB_uniform_buffer_object, glewIsSupported(\"GL_ARB_uniform_buffer_object\"), glewGetExtension(\"GL_ARB_uniform_buffer_object\"));\r\n\r\n  glewInfoFunc(\"glBindBufferBase\", glBindBufferBase == NULL);\r\n  glewInfoFunc(\"glBindBufferRange\", glBindBufferRange == NULL);\r\n  glewInfoFunc(\"glGetActiveUniformBlockName\", glGetActiveUniformBlockName == NULL);\r\n  glewInfoFunc(\"glGetActiveUniformBlockiv\", glGetActiveUniformBlockiv == NULL);\r\n  glewInfoFunc(\"glGetActiveUniformName\", glGetActiveUniformName == NULL);\r\n  glewInfoFunc(\"glGetActiveUniformsiv\", glGetActiveUniformsiv == NULL);\r\n  glewInfoFunc(\"glGetIntegeri_v\", glGetIntegeri_v == NULL);\r\n  glewInfoFunc(\"glGetUniformBlockIndex\", glGetUniformBlockIndex == NULL);\r\n  glewInfoFunc(\"glGetUniformIndices\", glGetUniformIndices == NULL);\r\n  glewInfoFunc(\"glUniformBlockBinding\", glUniformBlockBinding == NULL);\r\n}\r\n\r\n#endif /* GL_ARB_uniform_buffer_object */\r\n\r\n#ifdef GL_ARB_vertex_array_bgra\r\n\r\nstatic void _glewInfo_GL_ARB_vertex_array_bgra (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_vertex_array_bgra\", GLEW_ARB_vertex_array_bgra, glewIsSupported(\"GL_ARB_vertex_array_bgra\"), glewGetExtension(\"GL_ARB_vertex_array_bgra\"));\r\n}\r\n\r\n#endif /* GL_ARB_vertex_array_bgra */\r\n\r\n#ifdef GL_ARB_vertex_array_object\r\n\r\nstatic void _glewInfo_GL_ARB_vertex_array_object (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_vertex_array_object\", GLEW_ARB_vertex_array_object, glewIsSupported(\"GL_ARB_vertex_array_object\"), glewGetExtension(\"GL_ARB_vertex_array_object\"));\r\n\r\n  glewInfoFunc(\"glBindVertexArray\", glBindVertexArray == NULL);\r\n  glewInfoFunc(\"glDeleteVertexArrays\", glDeleteVertexArrays == NULL);\r\n  glewInfoFunc(\"glGenVertexArrays\", glGenVertexArrays == NULL);\r\n  glewInfoFunc(\"glIsVertexArray\", glIsVertexArray == NULL);\r\n}\r\n\r\n#endif /* GL_ARB_vertex_array_object */\r\n\r\n#ifdef GL_ARB_vertex_blend\r\n\r\nstatic void _glewInfo_GL_ARB_vertex_blend (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_vertex_blend\", GLEW_ARB_vertex_blend, glewIsSupported(\"GL_ARB_vertex_blend\"), glewGetExtension(\"GL_ARB_vertex_blend\"));\r\n\r\n  glewInfoFunc(\"glVertexBlendARB\", glVertexBlendARB == NULL);\r\n  glewInfoFunc(\"glWeightPointerARB\", glWeightPointerARB == NULL);\r\n  glewInfoFunc(\"glWeightbvARB\", glWeightbvARB == NULL);\r\n  glewInfoFunc(\"glWeightdvARB\", glWeightdvARB == NULL);\r\n  glewInfoFunc(\"glWeightfvARB\", glWeightfvARB == NULL);\r\n  glewInfoFunc(\"glWeightivARB\", glWeightivARB == NULL);\r\n  glewInfoFunc(\"glWeightsvARB\", glWeightsvARB == NULL);\r\n  glewInfoFunc(\"glWeightubvARB\", glWeightubvARB == NULL);\r\n  glewInfoFunc(\"glWeightuivARB\", glWeightuivARB == NULL);\r\n  glewInfoFunc(\"glWeightusvARB\", glWeightusvARB == NULL);\r\n}\r\n\r\n#endif /* GL_ARB_vertex_blend */\r\n\r\n#ifdef GL_ARB_vertex_buffer_object\r\n\r\nstatic void _glewInfo_GL_ARB_vertex_buffer_object (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_vertex_buffer_object\", GLEW_ARB_vertex_buffer_object, glewIsSupported(\"GL_ARB_vertex_buffer_object\"), glewGetExtension(\"GL_ARB_vertex_buffer_object\"));\r\n\r\n  glewInfoFunc(\"glBindBufferARB\", glBindBufferARB == NULL);\r\n  glewInfoFunc(\"glBufferDataARB\", glBufferDataARB == NULL);\r\n  glewInfoFunc(\"glBufferSubDataARB\", glBufferSubDataARB == NULL);\r\n  glewInfoFunc(\"glDeleteBuffersARB\", glDeleteBuffersARB == NULL);\r\n  glewInfoFunc(\"glGenBuffersARB\", glGenBuffersARB == NULL);\r\n  glewInfoFunc(\"glGetBufferParameterivARB\", glGetBufferParameterivARB == NULL);\r\n  glewInfoFunc(\"glGetBufferPointervARB\", glGetBufferPointervARB == NULL);\r\n  glewInfoFunc(\"glGetBufferSubDataARB\", glGetBufferSubDataARB == NULL);\r\n  glewInfoFunc(\"glIsBufferARB\", glIsBufferARB == NULL);\r\n  glewInfoFunc(\"glMapBufferARB\", glMapBufferARB == NULL);\r\n  glewInfoFunc(\"glUnmapBufferARB\", glUnmapBufferARB == NULL);\r\n}\r\n\r\n#endif /* GL_ARB_vertex_buffer_object */\r\n\r\n#ifdef GL_ARB_vertex_program\r\n\r\nstatic void _glewInfo_GL_ARB_vertex_program (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_vertex_program\", GLEW_ARB_vertex_program, glewIsSupported(\"GL_ARB_vertex_program\"), glewGetExtension(\"GL_ARB_vertex_program\"));\r\n\r\n  glewInfoFunc(\"glBindProgramARB\", glBindProgramARB == NULL);\r\n  glewInfoFunc(\"glDeleteProgramsARB\", glDeleteProgramsARB == NULL);\r\n  glewInfoFunc(\"glDisableVertexAttribArrayARB\", glDisableVertexAttribArrayARB == NULL);\r\n  glewInfoFunc(\"glEnableVertexAttribArrayARB\", glEnableVertexAttribArrayARB == NULL);\r\n  glewInfoFunc(\"glGenProgramsARB\", glGenProgramsARB == NULL);\r\n  glewInfoFunc(\"glGetProgramEnvParameterdvARB\", glGetProgramEnvParameterdvARB == NULL);\r\n  glewInfoFunc(\"glGetProgramEnvParameterfvARB\", glGetProgramEnvParameterfvARB == NULL);\r\n  glewInfoFunc(\"glGetProgramLocalParameterdvARB\", glGetProgramLocalParameterdvARB == NULL);\r\n  glewInfoFunc(\"glGetProgramLocalParameterfvARB\", glGetProgramLocalParameterfvARB == NULL);\r\n  glewInfoFunc(\"glGetProgramStringARB\", glGetProgramStringARB == NULL);\r\n  glewInfoFunc(\"glGetProgramivARB\", glGetProgramivARB == NULL);\r\n  glewInfoFunc(\"glGetVertexAttribPointervARB\", glGetVertexAttribPointervARB == NULL);\r\n  glewInfoFunc(\"glGetVertexAttribdvARB\", glGetVertexAttribdvARB == NULL);\r\n  glewInfoFunc(\"glGetVertexAttribfvARB\", glGetVertexAttribfvARB == NULL);\r\n  glewInfoFunc(\"glGetVertexAttribivARB\", glGetVertexAttribivARB == NULL);\r\n  glewInfoFunc(\"glIsProgramARB\", glIsProgramARB == NULL);\r\n  glewInfoFunc(\"glProgramEnvParameter4dARB\", glProgramEnvParameter4dARB == NULL);\r\n  glewInfoFunc(\"glProgramEnvParameter4dvARB\", glProgramEnvParameter4dvARB == NULL);\r\n  glewInfoFunc(\"glProgramEnvParameter4fARB\", glProgramEnvParameter4fARB == NULL);\r\n  glewInfoFunc(\"glProgramEnvParameter4fvARB\", glProgramEnvParameter4fvARB == NULL);\r\n  glewInfoFunc(\"glProgramLocalParameter4dARB\", glProgramLocalParameter4dARB == NULL);\r\n  glewInfoFunc(\"glProgramLocalParameter4dvARB\", glProgramLocalParameter4dvARB == NULL);\r\n  glewInfoFunc(\"glProgramLocalParameter4fARB\", glProgramLocalParameter4fARB == NULL);\r\n  glewInfoFunc(\"glProgramLocalParameter4fvARB\", glProgramLocalParameter4fvARB == NULL);\r\n  glewInfoFunc(\"glProgramStringARB\", glProgramStringARB == NULL);\r\n  glewInfoFunc(\"glVertexAttrib1dARB\", glVertexAttrib1dARB == NULL);\r\n  glewInfoFunc(\"glVertexAttrib1dvARB\", glVertexAttrib1dvARB == NULL);\r\n  glewInfoFunc(\"glVertexAttrib1fARB\", glVertexAttrib1fARB == NULL);\r\n  glewInfoFunc(\"glVertexAttrib1fvARB\", glVertexAttrib1fvARB == NULL);\r\n  glewInfoFunc(\"glVertexAttrib1sARB\", glVertexAttrib1sARB == NULL);\r\n  glewInfoFunc(\"glVertexAttrib1svARB\", glVertexAttrib1svARB == NULL);\r\n  glewInfoFunc(\"glVertexAttrib2dARB\", glVertexAttrib2dARB == NULL);\r\n  glewInfoFunc(\"glVertexAttrib2dvARB\", glVertexAttrib2dvARB == NULL);\r\n  glewInfoFunc(\"glVertexAttrib2fARB\", glVertexAttrib2fARB == NULL);\r\n  glewInfoFunc(\"glVertexAttrib2fvARB\", glVertexAttrib2fvARB == NULL);\r\n  glewInfoFunc(\"glVertexAttrib2sARB\", glVertexAttrib2sARB == NULL);\r\n  glewInfoFunc(\"glVertexAttrib2svARB\", glVertexAttrib2svARB == NULL);\r\n  glewInfoFunc(\"glVertexAttrib3dARB\", glVertexAttrib3dARB == NULL);\r\n  glewInfoFunc(\"glVertexAttrib3dvARB\", glVertexAttrib3dvARB == NULL);\r\n  glewInfoFunc(\"glVertexAttrib3fARB\", glVertexAttrib3fARB == NULL);\r\n  glewInfoFunc(\"glVertexAttrib3fvARB\", glVertexAttrib3fvARB == NULL);\r\n  glewInfoFunc(\"glVertexAttrib3sARB\", glVertexAttrib3sARB == NULL);\r\n  glewInfoFunc(\"glVertexAttrib3svARB\", glVertexAttrib3svARB == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4NbvARB\", glVertexAttrib4NbvARB == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4NivARB\", glVertexAttrib4NivARB == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4NsvARB\", glVertexAttrib4NsvARB == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4NubARB\", glVertexAttrib4NubARB == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4NubvARB\", glVertexAttrib4NubvARB == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4NuivARB\", glVertexAttrib4NuivARB == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4NusvARB\", glVertexAttrib4NusvARB == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4bvARB\", glVertexAttrib4bvARB == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4dARB\", glVertexAttrib4dARB == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4dvARB\", glVertexAttrib4dvARB == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4fARB\", glVertexAttrib4fARB == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4fvARB\", glVertexAttrib4fvARB == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4ivARB\", glVertexAttrib4ivARB == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4sARB\", glVertexAttrib4sARB == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4svARB\", glVertexAttrib4svARB == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4ubvARB\", glVertexAttrib4ubvARB == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4uivARB\", glVertexAttrib4uivARB == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4usvARB\", glVertexAttrib4usvARB == NULL);\r\n  glewInfoFunc(\"glVertexAttribPointerARB\", glVertexAttribPointerARB == NULL);\r\n}\r\n\r\n#endif /* GL_ARB_vertex_program */\r\n\r\n#ifdef GL_ARB_vertex_shader\r\n\r\nstatic void _glewInfo_GL_ARB_vertex_shader (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_vertex_shader\", GLEW_ARB_vertex_shader, glewIsSupported(\"GL_ARB_vertex_shader\"), glewGetExtension(\"GL_ARB_vertex_shader\"));\r\n\r\n  glewInfoFunc(\"glBindAttribLocationARB\", glBindAttribLocationARB == NULL);\r\n  glewInfoFunc(\"glGetActiveAttribARB\", glGetActiveAttribARB == NULL);\r\n  glewInfoFunc(\"glGetAttribLocationARB\", glGetAttribLocationARB == NULL);\r\n}\r\n\r\n#endif /* GL_ARB_vertex_shader */\r\n\r\n#ifdef GL_ARB_window_pos\r\n\r\nstatic void _glewInfo_GL_ARB_window_pos (void)\r\n{\r\n  glewPrintExt(\"GL_ARB_window_pos\", GLEW_ARB_window_pos, glewIsSupported(\"GL_ARB_window_pos\"), glewGetExtension(\"GL_ARB_window_pos\"));\r\n\r\n  glewInfoFunc(\"glWindowPos2dARB\", glWindowPos2dARB == NULL);\r\n  glewInfoFunc(\"glWindowPos2dvARB\", glWindowPos2dvARB == NULL);\r\n  glewInfoFunc(\"glWindowPos2fARB\", glWindowPos2fARB == NULL);\r\n  glewInfoFunc(\"glWindowPos2fvARB\", glWindowPos2fvARB == NULL);\r\n  glewInfoFunc(\"glWindowPos2iARB\", glWindowPos2iARB == NULL);\r\n  glewInfoFunc(\"glWindowPos2ivARB\", glWindowPos2ivARB == NULL);\r\n  glewInfoFunc(\"glWindowPos2sARB\", glWindowPos2sARB == NULL);\r\n  glewInfoFunc(\"glWindowPos2svARB\", glWindowPos2svARB == NULL);\r\n  glewInfoFunc(\"glWindowPos3dARB\", glWindowPos3dARB == NULL);\r\n  glewInfoFunc(\"glWindowPos3dvARB\", glWindowPos3dvARB == NULL);\r\n  glewInfoFunc(\"glWindowPos3fARB\", glWindowPos3fARB == NULL);\r\n  glewInfoFunc(\"glWindowPos3fvARB\", glWindowPos3fvARB == NULL);\r\n  glewInfoFunc(\"glWindowPos3iARB\", glWindowPos3iARB == NULL);\r\n  glewInfoFunc(\"glWindowPos3ivARB\", glWindowPos3ivARB == NULL);\r\n  glewInfoFunc(\"glWindowPos3sARB\", glWindowPos3sARB == NULL);\r\n  glewInfoFunc(\"glWindowPos3svARB\", glWindowPos3svARB == NULL);\r\n}\r\n\r\n#endif /* GL_ARB_window_pos */\r\n\r\n#ifdef GL_ATIX_point_sprites\r\n\r\nstatic void _glewInfo_GL_ATIX_point_sprites (void)\r\n{\r\n  glewPrintExt(\"GL_ATIX_point_sprites\", GLEW_ATIX_point_sprites, glewIsSupported(\"GL_ATIX_point_sprites\"), glewGetExtension(\"GL_ATIX_point_sprites\"));\r\n}\r\n\r\n#endif /* GL_ATIX_point_sprites */\r\n\r\n#ifdef GL_ATIX_texture_env_combine3\r\n\r\nstatic void _glewInfo_GL_ATIX_texture_env_combine3 (void)\r\n{\r\n  glewPrintExt(\"GL_ATIX_texture_env_combine3\", GLEW_ATIX_texture_env_combine3, glewIsSupported(\"GL_ATIX_texture_env_combine3\"), glewGetExtension(\"GL_ATIX_texture_env_combine3\"));\r\n}\r\n\r\n#endif /* GL_ATIX_texture_env_combine3 */\r\n\r\n#ifdef GL_ATIX_texture_env_route\r\n\r\nstatic void _glewInfo_GL_ATIX_texture_env_route (void)\r\n{\r\n  glewPrintExt(\"GL_ATIX_texture_env_route\", GLEW_ATIX_texture_env_route, glewIsSupported(\"GL_ATIX_texture_env_route\"), glewGetExtension(\"GL_ATIX_texture_env_route\"));\r\n}\r\n\r\n#endif /* GL_ATIX_texture_env_route */\r\n\r\n#ifdef GL_ATIX_vertex_shader_output_point_size\r\n\r\nstatic void _glewInfo_GL_ATIX_vertex_shader_output_point_size (void)\r\n{\r\n  glewPrintExt(\"GL_ATIX_vertex_shader_output_point_size\", GLEW_ATIX_vertex_shader_output_point_size, glewIsSupported(\"GL_ATIX_vertex_shader_output_point_size\"), glewGetExtension(\"GL_ATIX_vertex_shader_output_point_size\"));\r\n}\r\n\r\n#endif /* GL_ATIX_vertex_shader_output_point_size */\r\n\r\n#ifdef GL_ATI_draw_buffers\r\n\r\nstatic void _glewInfo_GL_ATI_draw_buffers (void)\r\n{\r\n  glewPrintExt(\"GL_ATI_draw_buffers\", GLEW_ATI_draw_buffers, glewIsSupported(\"GL_ATI_draw_buffers\"), glewGetExtension(\"GL_ATI_draw_buffers\"));\r\n\r\n  glewInfoFunc(\"glDrawBuffersATI\", glDrawBuffersATI == NULL);\r\n}\r\n\r\n#endif /* GL_ATI_draw_buffers */\r\n\r\n#ifdef GL_ATI_element_array\r\n\r\nstatic void _glewInfo_GL_ATI_element_array (void)\r\n{\r\n  glewPrintExt(\"GL_ATI_element_array\", GLEW_ATI_element_array, glewIsSupported(\"GL_ATI_element_array\"), glewGetExtension(\"GL_ATI_element_array\"));\r\n\r\n  glewInfoFunc(\"glDrawElementArrayATI\", glDrawElementArrayATI == NULL);\r\n  glewInfoFunc(\"glDrawRangeElementArrayATI\", glDrawRangeElementArrayATI == NULL);\r\n  glewInfoFunc(\"glElementPointerATI\", glElementPointerATI == NULL);\r\n}\r\n\r\n#endif /* GL_ATI_element_array */\r\n\r\n#ifdef GL_ATI_envmap_bumpmap\r\n\r\nstatic void _glewInfo_GL_ATI_envmap_bumpmap (void)\r\n{\r\n  glewPrintExt(\"GL_ATI_envmap_bumpmap\", GLEW_ATI_envmap_bumpmap, glewIsSupported(\"GL_ATI_envmap_bumpmap\"), glewGetExtension(\"GL_ATI_envmap_bumpmap\"));\r\n\r\n  glewInfoFunc(\"glGetTexBumpParameterfvATI\", glGetTexBumpParameterfvATI == NULL);\r\n  glewInfoFunc(\"glGetTexBumpParameterivATI\", glGetTexBumpParameterivATI == NULL);\r\n  glewInfoFunc(\"glTexBumpParameterfvATI\", glTexBumpParameterfvATI == NULL);\r\n  glewInfoFunc(\"glTexBumpParameterivATI\", glTexBumpParameterivATI == NULL);\r\n}\r\n\r\n#endif /* GL_ATI_envmap_bumpmap */\r\n\r\n#ifdef GL_ATI_fragment_shader\r\n\r\nstatic void _glewInfo_GL_ATI_fragment_shader (void)\r\n{\r\n  glewPrintExt(\"GL_ATI_fragment_shader\", GLEW_ATI_fragment_shader, glewIsSupported(\"GL_ATI_fragment_shader\"), glewGetExtension(\"GL_ATI_fragment_shader\"));\r\n\r\n  glewInfoFunc(\"glAlphaFragmentOp1ATI\", glAlphaFragmentOp1ATI == NULL);\r\n  glewInfoFunc(\"glAlphaFragmentOp2ATI\", glAlphaFragmentOp2ATI == NULL);\r\n  glewInfoFunc(\"glAlphaFragmentOp3ATI\", glAlphaFragmentOp3ATI == NULL);\r\n  glewInfoFunc(\"glBeginFragmentShaderATI\", glBeginFragmentShaderATI == NULL);\r\n  glewInfoFunc(\"glBindFragmentShaderATI\", glBindFragmentShaderATI == NULL);\r\n  glewInfoFunc(\"glColorFragmentOp1ATI\", glColorFragmentOp1ATI == NULL);\r\n  glewInfoFunc(\"glColorFragmentOp2ATI\", glColorFragmentOp2ATI == NULL);\r\n  glewInfoFunc(\"glColorFragmentOp3ATI\", glColorFragmentOp3ATI == NULL);\r\n  glewInfoFunc(\"glDeleteFragmentShaderATI\", glDeleteFragmentShaderATI == NULL);\r\n  glewInfoFunc(\"glEndFragmentShaderATI\", glEndFragmentShaderATI == NULL);\r\n  glewInfoFunc(\"glGenFragmentShadersATI\", glGenFragmentShadersATI == NULL);\r\n  glewInfoFunc(\"glPassTexCoordATI\", glPassTexCoordATI == NULL);\r\n  glewInfoFunc(\"glSampleMapATI\", glSampleMapATI == NULL);\r\n  glewInfoFunc(\"glSetFragmentShaderConstantATI\", glSetFragmentShaderConstantATI == NULL);\r\n}\r\n\r\n#endif /* GL_ATI_fragment_shader */\r\n\r\n#ifdef GL_ATI_map_object_buffer\r\n\r\nstatic void _glewInfo_GL_ATI_map_object_buffer (void)\r\n{\r\n  glewPrintExt(\"GL_ATI_map_object_buffer\", GLEW_ATI_map_object_buffer, glewIsSupported(\"GL_ATI_map_object_buffer\"), glewGetExtension(\"GL_ATI_map_object_buffer\"));\r\n\r\n  glewInfoFunc(\"glMapObjectBufferATI\", glMapObjectBufferATI == NULL);\r\n  glewInfoFunc(\"glUnmapObjectBufferATI\", glUnmapObjectBufferATI == NULL);\r\n}\r\n\r\n#endif /* GL_ATI_map_object_buffer */\r\n\r\n#ifdef GL_ATI_meminfo\r\n\r\nstatic void _glewInfo_GL_ATI_meminfo (void)\r\n{\r\n  glewPrintExt(\"GL_ATI_meminfo\", GLEW_ATI_meminfo, glewIsSupported(\"GL_ATI_meminfo\"), glewGetExtension(\"GL_ATI_meminfo\"));\r\n}\r\n\r\n#endif /* GL_ATI_meminfo */\r\n\r\n#ifdef GL_ATI_pn_triangles\r\n\r\nstatic void _glewInfo_GL_ATI_pn_triangles (void)\r\n{\r\n  glewPrintExt(\"GL_ATI_pn_triangles\", GLEW_ATI_pn_triangles, glewIsSupported(\"GL_ATI_pn_triangles\"), glewGetExtension(\"GL_ATI_pn_triangles\"));\r\n\r\n  glewInfoFunc(\"glPNTrianglesfATI\", glPNTrianglesfATI == NULL);\r\n  glewInfoFunc(\"glPNTrianglesiATI\", glPNTrianglesiATI == NULL);\r\n}\r\n\r\n#endif /* GL_ATI_pn_triangles */\r\n\r\n#ifdef GL_ATI_separate_stencil\r\n\r\nstatic void _glewInfo_GL_ATI_separate_stencil (void)\r\n{\r\n  glewPrintExt(\"GL_ATI_separate_stencil\", GLEW_ATI_separate_stencil, glewIsSupported(\"GL_ATI_separate_stencil\"), glewGetExtension(\"GL_ATI_separate_stencil\"));\r\n\r\n  glewInfoFunc(\"glStencilFuncSeparateATI\", glStencilFuncSeparateATI == NULL);\r\n  glewInfoFunc(\"glStencilOpSeparateATI\", glStencilOpSeparateATI == NULL);\r\n}\r\n\r\n#endif /* GL_ATI_separate_stencil */\r\n\r\n#ifdef GL_ATI_shader_texture_lod\r\n\r\nstatic void _glewInfo_GL_ATI_shader_texture_lod (void)\r\n{\r\n  glewPrintExt(\"GL_ATI_shader_texture_lod\", GLEW_ATI_shader_texture_lod, glewIsSupported(\"GL_ATI_shader_texture_lod\"), glewGetExtension(\"GL_ATI_shader_texture_lod\"));\r\n}\r\n\r\n#endif /* GL_ATI_shader_texture_lod */\r\n\r\n#ifdef GL_ATI_text_fragment_shader\r\n\r\nstatic void _glewInfo_GL_ATI_text_fragment_shader (void)\r\n{\r\n  glewPrintExt(\"GL_ATI_text_fragment_shader\", GLEW_ATI_text_fragment_shader, glewIsSupported(\"GL_ATI_text_fragment_shader\"), glewGetExtension(\"GL_ATI_text_fragment_shader\"));\r\n}\r\n\r\n#endif /* GL_ATI_text_fragment_shader */\r\n\r\n#ifdef GL_ATI_texture_compression_3dc\r\n\r\nstatic void _glewInfo_GL_ATI_texture_compression_3dc (void)\r\n{\r\n  glewPrintExt(\"GL_ATI_texture_compression_3dc\", GLEW_ATI_texture_compression_3dc, glewIsSupported(\"GL_ATI_texture_compression_3dc\"), glewGetExtension(\"GL_ATI_texture_compression_3dc\"));\r\n}\r\n\r\n#endif /* GL_ATI_texture_compression_3dc */\r\n\r\n#ifdef GL_ATI_texture_env_combine3\r\n\r\nstatic void _glewInfo_GL_ATI_texture_env_combine3 (void)\r\n{\r\n  glewPrintExt(\"GL_ATI_texture_env_combine3\", GLEW_ATI_texture_env_combine3, glewIsSupported(\"GL_ATI_texture_env_combine3\"), glewGetExtension(\"GL_ATI_texture_env_combine3\"));\r\n}\r\n\r\n#endif /* GL_ATI_texture_env_combine3 */\r\n\r\n#ifdef GL_ATI_texture_float\r\n\r\nstatic void _glewInfo_GL_ATI_texture_float (void)\r\n{\r\n  glewPrintExt(\"GL_ATI_texture_float\", GLEW_ATI_texture_float, glewIsSupported(\"GL_ATI_texture_float\"), glewGetExtension(\"GL_ATI_texture_float\"));\r\n}\r\n\r\n#endif /* GL_ATI_texture_float */\r\n\r\n#ifdef GL_ATI_texture_mirror_once\r\n\r\nstatic void _glewInfo_GL_ATI_texture_mirror_once (void)\r\n{\r\n  glewPrintExt(\"GL_ATI_texture_mirror_once\", GLEW_ATI_texture_mirror_once, glewIsSupported(\"GL_ATI_texture_mirror_once\"), glewGetExtension(\"GL_ATI_texture_mirror_once\"));\r\n}\r\n\r\n#endif /* GL_ATI_texture_mirror_once */\r\n\r\n#ifdef GL_ATI_vertex_array_object\r\n\r\nstatic void _glewInfo_GL_ATI_vertex_array_object (void)\r\n{\r\n  glewPrintExt(\"GL_ATI_vertex_array_object\", GLEW_ATI_vertex_array_object, glewIsSupported(\"GL_ATI_vertex_array_object\"), glewGetExtension(\"GL_ATI_vertex_array_object\"));\r\n\r\n  glewInfoFunc(\"glArrayObjectATI\", glArrayObjectATI == NULL);\r\n  glewInfoFunc(\"glFreeObjectBufferATI\", glFreeObjectBufferATI == NULL);\r\n  glewInfoFunc(\"glGetArrayObjectfvATI\", glGetArrayObjectfvATI == NULL);\r\n  glewInfoFunc(\"glGetArrayObjectivATI\", glGetArrayObjectivATI == NULL);\r\n  glewInfoFunc(\"glGetObjectBufferfvATI\", glGetObjectBufferfvATI == NULL);\r\n  glewInfoFunc(\"glGetObjectBufferivATI\", glGetObjectBufferivATI == NULL);\r\n  glewInfoFunc(\"glGetVariantArrayObjectfvATI\", glGetVariantArrayObjectfvATI == NULL);\r\n  glewInfoFunc(\"glGetVariantArrayObjectivATI\", glGetVariantArrayObjectivATI == NULL);\r\n  glewInfoFunc(\"glIsObjectBufferATI\", glIsObjectBufferATI == NULL);\r\n  glewInfoFunc(\"glNewObjectBufferATI\", glNewObjectBufferATI == NULL);\r\n  glewInfoFunc(\"glUpdateObjectBufferATI\", glUpdateObjectBufferATI == NULL);\r\n  glewInfoFunc(\"glVariantArrayObjectATI\", glVariantArrayObjectATI == NULL);\r\n}\r\n\r\n#endif /* GL_ATI_vertex_array_object */\r\n\r\n#ifdef GL_ATI_vertex_attrib_array_object\r\n\r\nstatic void _glewInfo_GL_ATI_vertex_attrib_array_object (void)\r\n{\r\n  glewPrintExt(\"GL_ATI_vertex_attrib_array_object\", GLEW_ATI_vertex_attrib_array_object, glewIsSupported(\"GL_ATI_vertex_attrib_array_object\"), glewGetExtension(\"GL_ATI_vertex_attrib_array_object\"));\r\n\r\n  glewInfoFunc(\"glGetVertexAttribArrayObjectfvATI\", glGetVertexAttribArrayObjectfvATI == NULL);\r\n  glewInfoFunc(\"glGetVertexAttribArrayObjectivATI\", glGetVertexAttribArrayObjectivATI == NULL);\r\n  glewInfoFunc(\"glVertexAttribArrayObjectATI\", glVertexAttribArrayObjectATI == NULL);\r\n}\r\n\r\n#endif /* GL_ATI_vertex_attrib_array_object */\r\n\r\n#ifdef GL_ATI_vertex_streams\r\n\r\nstatic void _glewInfo_GL_ATI_vertex_streams (void)\r\n{\r\n  glewPrintExt(\"GL_ATI_vertex_streams\", GLEW_ATI_vertex_streams, glewIsSupported(\"GL_ATI_vertex_streams\"), glewGetExtension(\"GL_ATI_vertex_streams\"));\r\n\r\n  glewInfoFunc(\"glClientActiveVertexStreamATI\", glClientActiveVertexStreamATI == NULL);\r\n  glewInfoFunc(\"glNormalStream3bATI\", glNormalStream3bATI == NULL);\r\n  glewInfoFunc(\"glNormalStream3bvATI\", glNormalStream3bvATI == NULL);\r\n  glewInfoFunc(\"glNormalStream3dATI\", glNormalStream3dATI == NULL);\r\n  glewInfoFunc(\"glNormalStream3dvATI\", glNormalStream3dvATI == NULL);\r\n  glewInfoFunc(\"glNormalStream3fATI\", glNormalStream3fATI == NULL);\r\n  glewInfoFunc(\"glNormalStream3fvATI\", glNormalStream3fvATI == NULL);\r\n  glewInfoFunc(\"glNormalStream3iATI\", glNormalStream3iATI == NULL);\r\n  glewInfoFunc(\"glNormalStream3ivATI\", glNormalStream3ivATI == NULL);\r\n  glewInfoFunc(\"glNormalStream3sATI\", glNormalStream3sATI == NULL);\r\n  glewInfoFunc(\"glNormalStream3svATI\", glNormalStream3svATI == NULL);\r\n  glewInfoFunc(\"glVertexBlendEnvfATI\", glVertexBlendEnvfATI == NULL);\r\n  glewInfoFunc(\"glVertexBlendEnviATI\", glVertexBlendEnviATI == NULL);\r\n  glewInfoFunc(\"glVertexStream2dATI\", glVertexStream2dATI == NULL);\r\n  glewInfoFunc(\"glVertexStream2dvATI\", glVertexStream2dvATI == NULL);\r\n  glewInfoFunc(\"glVertexStream2fATI\", glVertexStream2fATI == NULL);\r\n  glewInfoFunc(\"glVertexStream2fvATI\", glVertexStream2fvATI == NULL);\r\n  glewInfoFunc(\"glVertexStream2iATI\", glVertexStream2iATI == NULL);\r\n  glewInfoFunc(\"glVertexStream2ivATI\", glVertexStream2ivATI == NULL);\r\n  glewInfoFunc(\"glVertexStream2sATI\", glVertexStream2sATI == NULL);\r\n  glewInfoFunc(\"glVertexStream2svATI\", glVertexStream2svATI == NULL);\r\n  glewInfoFunc(\"glVertexStream3dATI\", glVertexStream3dATI == NULL);\r\n  glewInfoFunc(\"glVertexStream3dvATI\", glVertexStream3dvATI == NULL);\r\n  glewInfoFunc(\"glVertexStream3fATI\", glVertexStream3fATI == NULL);\r\n  glewInfoFunc(\"glVertexStream3fvATI\", glVertexStream3fvATI == NULL);\r\n  glewInfoFunc(\"glVertexStream3iATI\", glVertexStream3iATI == NULL);\r\n  glewInfoFunc(\"glVertexStream3ivATI\", glVertexStream3ivATI == NULL);\r\n  glewInfoFunc(\"glVertexStream3sATI\", glVertexStream3sATI == NULL);\r\n  glewInfoFunc(\"glVertexStream3svATI\", glVertexStream3svATI == NULL);\r\n  glewInfoFunc(\"glVertexStream4dATI\", glVertexStream4dATI == NULL);\r\n  glewInfoFunc(\"glVertexStream4dvATI\", glVertexStream4dvATI == NULL);\r\n  glewInfoFunc(\"glVertexStream4fATI\", glVertexStream4fATI == NULL);\r\n  glewInfoFunc(\"glVertexStream4fvATI\", glVertexStream4fvATI == NULL);\r\n  glewInfoFunc(\"glVertexStream4iATI\", glVertexStream4iATI == NULL);\r\n  glewInfoFunc(\"glVertexStream4ivATI\", glVertexStream4ivATI == NULL);\r\n  glewInfoFunc(\"glVertexStream4sATI\", glVertexStream4sATI == NULL);\r\n  glewInfoFunc(\"glVertexStream4svATI\", glVertexStream4svATI == NULL);\r\n}\r\n\r\n#endif /* GL_ATI_vertex_streams */\r\n\r\n#ifdef GL_EXT_422_pixels\r\n\r\nstatic void _glewInfo_GL_EXT_422_pixels (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_422_pixels\", GLEW_EXT_422_pixels, glewIsSupported(\"GL_EXT_422_pixels\"), glewGetExtension(\"GL_EXT_422_pixels\"));\r\n}\r\n\r\n#endif /* GL_EXT_422_pixels */\r\n\r\n#ifdef GL_EXT_Cg_shader\r\n\r\nstatic void _glewInfo_GL_EXT_Cg_shader (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_Cg_shader\", GLEW_EXT_Cg_shader, glewIsSupported(\"GL_EXT_Cg_shader\"), glewGetExtension(\"GL_EXT_Cg_shader\"));\r\n}\r\n\r\n#endif /* GL_EXT_Cg_shader */\r\n\r\n#ifdef GL_EXT_abgr\r\n\r\nstatic void _glewInfo_GL_EXT_abgr (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_abgr\", GLEW_EXT_abgr, glewIsSupported(\"GL_EXT_abgr\"), glewGetExtension(\"GL_EXT_abgr\"));\r\n}\r\n\r\n#endif /* GL_EXT_abgr */\r\n\r\n#ifdef GL_EXT_bgra\r\n\r\nstatic void _glewInfo_GL_EXT_bgra (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_bgra\", GLEW_EXT_bgra, glewIsSupported(\"GL_EXT_bgra\"), glewGetExtension(\"GL_EXT_bgra\"));\r\n}\r\n\r\n#endif /* GL_EXT_bgra */\r\n\r\n#ifdef GL_EXT_bindable_uniform\r\n\r\nstatic void _glewInfo_GL_EXT_bindable_uniform (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_bindable_uniform\", GLEW_EXT_bindable_uniform, glewIsSupported(\"GL_EXT_bindable_uniform\"), glewGetExtension(\"GL_EXT_bindable_uniform\"));\r\n\r\n  glewInfoFunc(\"glGetUniformBufferSizeEXT\", glGetUniformBufferSizeEXT == NULL);\r\n  glewInfoFunc(\"glGetUniformOffsetEXT\", glGetUniformOffsetEXT == NULL);\r\n  glewInfoFunc(\"glUniformBufferEXT\", glUniformBufferEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_bindable_uniform */\r\n\r\n#ifdef GL_EXT_blend_color\r\n\r\nstatic void _glewInfo_GL_EXT_blend_color (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_blend_color\", GLEW_EXT_blend_color, glewIsSupported(\"GL_EXT_blend_color\"), glewGetExtension(\"GL_EXT_blend_color\"));\r\n\r\n  glewInfoFunc(\"glBlendColorEXT\", glBlendColorEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_blend_color */\r\n\r\n#ifdef GL_EXT_blend_equation_separate\r\n\r\nstatic void _glewInfo_GL_EXT_blend_equation_separate (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_blend_equation_separate\", GLEW_EXT_blend_equation_separate, glewIsSupported(\"GL_EXT_blend_equation_separate\"), glewGetExtension(\"GL_EXT_blend_equation_separate\"));\r\n\r\n  glewInfoFunc(\"glBlendEquationSeparateEXT\", glBlendEquationSeparateEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_blend_equation_separate */\r\n\r\n#ifdef GL_EXT_blend_func_separate\r\n\r\nstatic void _glewInfo_GL_EXT_blend_func_separate (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_blend_func_separate\", GLEW_EXT_blend_func_separate, glewIsSupported(\"GL_EXT_blend_func_separate\"), glewGetExtension(\"GL_EXT_blend_func_separate\"));\r\n\r\n  glewInfoFunc(\"glBlendFuncSeparateEXT\", glBlendFuncSeparateEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_blend_func_separate */\r\n\r\n#ifdef GL_EXT_blend_logic_op\r\n\r\nstatic void _glewInfo_GL_EXT_blend_logic_op (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_blend_logic_op\", GLEW_EXT_blend_logic_op, glewIsSupported(\"GL_EXT_blend_logic_op\"), glewGetExtension(\"GL_EXT_blend_logic_op\"));\r\n}\r\n\r\n#endif /* GL_EXT_blend_logic_op */\r\n\r\n#ifdef GL_EXT_blend_minmax\r\n\r\nstatic void _glewInfo_GL_EXT_blend_minmax (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_blend_minmax\", GLEW_EXT_blend_minmax, glewIsSupported(\"GL_EXT_blend_minmax\"), glewGetExtension(\"GL_EXT_blend_minmax\"));\r\n\r\n  glewInfoFunc(\"glBlendEquationEXT\", glBlendEquationEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_blend_minmax */\r\n\r\n#ifdef GL_EXT_blend_subtract\r\n\r\nstatic void _glewInfo_GL_EXT_blend_subtract (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_blend_subtract\", GLEW_EXT_blend_subtract, glewIsSupported(\"GL_EXT_blend_subtract\"), glewGetExtension(\"GL_EXT_blend_subtract\"));\r\n}\r\n\r\n#endif /* GL_EXT_blend_subtract */\r\n\r\n#ifdef GL_EXT_clip_volume_hint\r\n\r\nstatic void _glewInfo_GL_EXT_clip_volume_hint (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_clip_volume_hint\", GLEW_EXT_clip_volume_hint, glewIsSupported(\"GL_EXT_clip_volume_hint\"), glewGetExtension(\"GL_EXT_clip_volume_hint\"));\r\n}\r\n\r\n#endif /* GL_EXT_clip_volume_hint */\r\n\r\n#ifdef GL_EXT_cmyka\r\n\r\nstatic void _glewInfo_GL_EXT_cmyka (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_cmyka\", GLEW_EXT_cmyka, glewIsSupported(\"GL_EXT_cmyka\"), glewGetExtension(\"GL_EXT_cmyka\"));\r\n}\r\n\r\n#endif /* GL_EXT_cmyka */\r\n\r\n#ifdef GL_EXT_color_subtable\r\n\r\nstatic void _glewInfo_GL_EXT_color_subtable (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_color_subtable\", GLEW_EXT_color_subtable, glewIsSupported(\"GL_EXT_color_subtable\"), glewGetExtension(\"GL_EXT_color_subtable\"));\r\n\r\n  glewInfoFunc(\"glColorSubTableEXT\", glColorSubTableEXT == NULL);\r\n  glewInfoFunc(\"glCopyColorSubTableEXT\", glCopyColorSubTableEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_color_subtable */\r\n\r\n#ifdef GL_EXT_compiled_vertex_array\r\n\r\nstatic void _glewInfo_GL_EXT_compiled_vertex_array (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_compiled_vertex_array\", GLEW_EXT_compiled_vertex_array, glewIsSupported(\"GL_EXT_compiled_vertex_array\"), glewGetExtension(\"GL_EXT_compiled_vertex_array\"));\r\n\r\n  glewInfoFunc(\"glLockArraysEXT\", glLockArraysEXT == NULL);\r\n  glewInfoFunc(\"glUnlockArraysEXT\", glUnlockArraysEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_compiled_vertex_array */\r\n\r\n#ifdef GL_EXT_convolution\r\n\r\nstatic void _glewInfo_GL_EXT_convolution (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_convolution\", GLEW_EXT_convolution, glewIsSupported(\"GL_EXT_convolution\"), glewGetExtension(\"GL_EXT_convolution\"));\r\n\r\n  glewInfoFunc(\"glConvolutionFilter1DEXT\", glConvolutionFilter1DEXT == NULL);\r\n  glewInfoFunc(\"glConvolutionFilter2DEXT\", glConvolutionFilter2DEXT == NULL);\r\n  glewInfoFunc(\"glConvolutionParameterfEXT\", glConvolutionParameterfEXT == NULL);\r\n  glewInfoFunc(\"glConvolutionParameterfvEXT\", glConvolutionParameterfvEXT == NULL);\r\n  glewInfoFunc(\"glConvolutionParameteriEXT\", glConvolutionParameteriEXT == NULL);\r\n  glewInfoFunc(\"glConvolutionParameterivEXT\", glConvolutionParameterivEXT == NULL);\r\n  glewInfoFunc(\"glCopyConvolutionFilter1DEXT\", glCopyConvolutionFilter1DEXT == NULL);\r\n  glewInfoFunc(\"glCopyConvolutionFilter2DEXT\", glCopyConvolutionFilter2DEXT == NULL);\r\n  glewInfoFunc(\"glGetConvolutionFilterEXT\", glGetConvolutionFilterEXT == NULL);\r\n  glewInfoFunc(\"glGetConvolutionParameterfvEXT\", glGetConvolutionParameterfvEXT == NULL);\r\n  glewInfoFunc(\"glGetConvolutionParameterivEXT\", glGetConvolutionParameterivEXT == NULL);\r\n  glewInfoFunc(\"glGetSeparableFilterEXT\", glGetSeparableFilterEXT == NULL);\r\n  glewInfoFunc(\"glSeparableFilter2DEXT\", glSeparableFilter2DEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_convolution */\r\n\r\n#ifdef GL_EXT_coordinate_frame\r\n\r\nstatic void _glewInfo_GL_EXT_coordinate_frame (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_coordinate_frame\", GLEW_EXT_coordinate_frame, glewIsSupported(\"GL_EXT_coordinate_frame\"), glewGetExtension(\"GL_EXT_coordinate_frame\"));\r\n\r\n  glewInfoFunc(\"glBinormalPointerEXT\", glBinormalPointerEXT == NULL);\r\n  glewInfoFunc(\"glTangentPointerEXT\", glTangentPointerEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_coordinate_frame */\r\n\r\n#ifdef GL_EXT_copy_texture\r\n\r\nstatic void _glewInfo_GL_EXT_copy_texture (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_copy_texture\", GLEW_EXT_copy_texture, glewIsSupported(\"GL_EXT_copy_texture\"), glewGetExtension(\"GL_EXT_copy_texture\"));\r\n\r\n  glewInfoFunc(\"glCopyTexImage1DEXT\", glCopyTexImage1DEXT == NULL);\r\n  glewInfoFunc(\"glCopyTexImage2DEXT\", glCopyTexImage2DEXT == NULL);\r\n  glewInfoFunc(\"glCopyTexSubImage1DEXT\", glCopyTexSubImage1DEXT == NULL);\r\n  glewInfoFunc(\"glCopyTexSubImage2DEXT\", glCopyTexSubImage2DEXT == NULL);\r\n  glewInfoFunc(\"glCopyTexSubImage3DEXT\", glCopyTexSubImage3DEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_copy_texture */\r\n\r\n#ifdef GL_EXT_cull_vertex\r\n\r\nstatic void _glewInfo_GL_EXT_cull_vertex (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_cull_vertex\", GLEW_EXT_cull_vertex, glewIsSupported(\"GL_EXT_cull_vertex\"), glewGetExtension(\"GL_EXT_cull_vertex\"));\r\n\r\n  glewInfoFunc(\"glCullParameterdvEXT\", glCullParameterdvEXT == NULL);\r\n  glewInfoFunc(\"glCullParameterfvEXT\", glCullParameterfvEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_cull_vertex */\r\n\r\n#ifdef GL_EXT_depth_bounds_test\r\n\r\nstatic void _glewInfo_GL_EXT_depth_bounds_test (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_depth_bounds_test\", GLEW_EXT_depth_bounds_test, glewIsSupported(\"GL_EXT_depth_bounds_test\"), glewGetExtension(\"GL_EXT_depth_bounds_test\"));\r\n\r\n  glewInfoFunc(\"glDepthBoundsEXT\", glDepthBoundsEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_depth_bounds_test */\r\n\r\n#ifdef GL_EXT_direct_state_access\r\n\r\nstatic void _glewInfo_GL_EXT_direct_state_access (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_direct_state_access\", GLEW_EXT_direct_state_access, glewIsSupported(\"GL_EXT_direct_state_access\"), glewGetExtension(\"GL_EXT_direct_state_access\"));\r\n\r\n  glewInfoFunc(\"glBindMultiTextureEXT\", glBindMultiTextureEXT == NULL);\r\n  glewInfoFunc(\"glCheckNamedFramebufferStatusEXT\", glCheckNamedFramebufferStatusEXT == NULL);\r\n  glewInfoFunc(\"glClientAttribDefaultEXT\", glClientAttribDefaultEXT == NULL);\r\n  glewInfoFunc(\"glCompressedMultiTexImage1DEXT\", glCompressedMultiTexImage1DEXT == NULL);\r\n  glewInfoFunc(\"glCompressedMultiTexImage2DEXT\", glCompressedMultiTexImage2DEXT == NULL);\r\n  glewInfoFunc(\"glCompressedMultiTexImage3DEXT\", glCompressedMultiTexImage3DEXT == NULL);\r\n  glewInfoFunc(\"glCompressedMultiTexSubImage1DEXT\", glCompressedMultiTexSubImage1DEXT == NULL);\r\n  glewInfoFunc(\"glCompressedMultiTexSubImage2DEXT\", glCompressedMultiTexSubImage2DEXT == NULL);\r\n  glewInfoFunc(\"glCompressedMultiTexSubImage3DEXT\", glCompressedMultiTexSubImage3DEXT == NULL);\r\n  glewInfoFunc(\"glCompressedTextureImage1DEXT\", glCompressedTextureImage1DEXT == NULL);\r\n  glewInfoFunc(\"glCompressedTextureImage2DEXT\", glCompressedTextureImage2DEXT == NULL);\r\n  glewInfoFunc(\"glCompressedTextureImage3DEXT\", glCompressedTextureImage3DEXT == NULL);\r\n  glewInfoFunc(\"glCompressedTextureSubImage1DEXT\", glCompressedTextureSubImage1DEXT == NULL);\r\n  glewInfoFunc(\"glCompressedTextureSubImage2DEXT\", glCompressedTextureSubImage2DEXT == NULL);\r\n  glewInfoFunc(\"glCompressedTextureSubImage3DEXT\", glCompressedTextureSubImage3DEXT == NULL);\r\n  glewInfoFunc(\"glCopyMultiTexImage1DEXT\", glCopyMultiTexImage1DEXT == NULL);\r\n  glewInfoFunc(\"glCopyMultiTexImage2DEXT\", glCopyMultiTexImage2DEXT == NULL);\r\n  glewInfoFunc(\"glCopyMultiTexSubImage1DEXT\", glCopyMultiTexSubImage1DEXT == NULL);\r\n  glewInfoFunc(\"glCopyMultiTexSubImage2DEXT\", glCopyMultiTexSubImage2DEXT == NULL);\r\n  glewInfoFunc(\"glCopyMultiTexSubImage3DEXT\", glCopyMultiTexSubImage3DEXT == NULL);\r\n  glewInfoFunc(\"glCopyTextureImage1DEXT\", glCopyTextureImage1DEXT == NULL);\r\n  glewInfoFunc(\"glCopyTextureImage2DEXT\", glCopyTextureImage2DEXT == NULL);\r\n  glewInfoFunc(\"glCopyTextureSubImage1DEXT\", glCopyTextureSubImage1DEXT == NULL);\r\n  glewInfoFunc(\"glCopyTextureSubImage2DEXT\", glCopyTextureSubImage2DEXT == NULL);\r\n  glewInfoFunc(\"glCopyTextureSubImage3DEXT\", glCopyTextureSubImage3DEXT == NULL);\r\n  glewInfoFunc(\"glDisableClientStateIndexedEXT\", glDisableClientStateIndexedEXT == NULL);\r\n  glewInfoFunc(\"glDisableClientStateiEXT\", glDisableClientStateiEXT == NULL);\r\n  glewInfoFunc(\"glDisableVertexArrayAttribEXT\", glDisableVertexArrayAttribEXT == NULL);\r\n  glewInfoFunc(\"glDisableVertexArrayEXT\", glDisableVertexArrayEXT == NULL);\r\n  glewInfoFunc(\"glEnableClientStateIndexedEXT\", glEnableClientStateIndexedEXT == NULL);\r\n  glewInfoFunc(\"glEnableClientStateiEXT\", glEnableClientStateiEXT == NULL);\r\n  glewInfoFunc(\"glEnableVertexArrayAttribEXT\", glEnableVertexArrayAttribEXT == NULL);\r\n  glewInfoFunc(\"glEnableVertexArrayEXT\", glEnableVertexArrayEXT == NULL);\r\n  glewInfoFunc(\"glFlushMappedNamedBufferRangeEXT\", glFlushMappedNamedBufferRangeEXT == NULL);\r\n  glewInfoFunc(\"glFramebufferDrawBufferEXT\", glFramebufferDrawBufferEXT == NULL);\r\n  glewInfoFunc(\"glFramebufferDrawBuffersEXT\", glFramebufferDrawBuffersEXT == NULL);\r\n  glewInfoFunc(\"glFramebufferReadBufferEXT\", glFramebufferReadBufferEXT == NULL);\r\n  glewInfoFunc(\"glGenerateMultiTexMipmapEXT\", glGenerateMultiTexMipmapEXT == NULL);\r\n  glewInfoFunc(\"glGenerateTextureMipmapEXT\", glGenerateTextureMipmapEXT == NULL);\r\n  glewInfoFunc(\"glGetCompressedMultiTexImageEXT\", glGetCompressedMultiTexImageEXT == NULL);\r\n  glewInfoFunc(\"glGetCompressedTextureImageEXT\", glGetCompressedTextureImageEXT == NULL);\r\n  glewInfoFunc(\"glGetDoubleIndexedvEXT\", glGetDoubleIndexedvEXT == NULL);\r\n  glewInfoFunc(\"glGetDoublei_vEXT\", glGetDoublei_vEXT == NULL);\r\n  glewInfoFunc(\"glGetFloatIndexedvEXT\", glGetFloatIndexedvEXT == NULL);\r\n  glewInfoFunc(\"glGetFloati_vEXT\", glGetFloati_vEXT == NULL);\r\n  glewInfoFunc(\"glGetFramebufferParameterivEXT\", glGetFramebufferParameterivEXT == NULL);\r\n  glewInfoFunc(\"glGetMultiTexEnvfvEXT\", glGetMultiTexEnvfvEXT == NULL);\r\n  glewInfoFunc(\"glGetMultiTexEnvivEXT\", glGetMultiTexEnvivEXT == NULL);\r\n  glewInfoFunc(\"glGetMultiTexGendvEXT\", glGetMultiTexGendvEXT == NULL);\r\n  glewInfoFunc(\"glGetMultiTexGenfvEXT\", glGetMultiTexGenfvEXT == NULL);\r\n  glewInfoFunc(\"glGetMultiTexGenivEXT\", glGetMultiTexGenivEXT == NULL);\r\n  glewInfoFunc(\"glGetMultiTexImageEXT\", glGetMultiTexImageEXT == NULL);\r\n  glewInfoFunc(\"glGetMultiTexLevelParameterfvEXT\", glGetMultiTexLevelParameterfvEXT == NULL);\r\n  glewInfoFunc(\"glGetMultiTexLevelParameterivEXT\", glGetMultiTexLevelParameterivEXT == NULL);\r\n  glewInfoFunc(\"glGetMultiTexParameterIivEXT\", glGetMultiTexParameterIivEXT == NULL);\r\n  glewInfoFunc(\"glGetMultiTexParameterIuivEXT\", glGetMultiTexParameterIuivEXT == NULL);\r\n  glewInfoFunc(\"glGetMultiTexParameterfvEXT\", glGetMultiTexParameterfvEXT == NULL);\r\n  glewInfoFunc(\"glGetMultiTexParameterivEXT\", glGetMultiTexParameterivEXT == NULL);\r\n  glewInfoFunc(\"glGetNamedBufferParameterivEXT\", glGetNamedBufferParameterivEXT == NULL);\r\n  glewInfoFunc(\"glGetNamedBufferPointervEXT\", glGetNamedBufferPointervEXT == NULL);\r\n  glewInfoFunc(\"glGetNamedBufferSubDataEXT\", glGetNamedBufferSubDataEXT == NULL);\r\n  glewInfoFunc(\"glGetNamedFramebufferAttachmentParameterivEXT\", glGetNamedFramebufferAttachmentParameterivEXT == NULL);\r\n  glewInfoFunc(\"glGetNamedProgramLocalParameterIivEXT\", glGetNamedProgramLocalParameterIivEXT == NULL);\r\n  glewInfoFunc(\"glGetNamedProgramLocalParameterIuivEXT\", glGetNamedProgramLocalParameterIuivEXT == NULL);\r\n  glewInfoFunc(\"glGetNamedProgramLocalParameterdvEXT\", glGetNamedProgramLocalParameterdvEXT == NULL);\r\n  glewInfoFunc(\"glGetNamedProgramLocalParameterfvEXT\", glGetNamedProgramLocalParameterfvEXT == NULL);\r\n  glewInfoFunc(\"glGetNamedProgramStringEXT\", glGetNamedProgramStringEXT == NULL);\r\n  glewInfoFunc(\"glGetNamedProgramivEXT\", glGetNamedProgramivEXT == NULL);\r\n  glewInfoFunc(\"glGetNamedRenderbufferParameterivEXT\", glGetNamedRenderbufferParameterivEXT == NULL);\r\n  glewInfoFunc(\"glGetPointerIndexedvEXT\", glGetPointerIndexedvEXT == NULL);\r\n  glewInfoFunc(\"glGetPointeri_vEXT\", glGetPointeri_vEXT == NULL);\r\n  glewInfoFunc(\"glGetTextureImageEXT\", glGetTextureImageEXT == NULL);\r\n  glewInfoFunc(\"glGetTextureLevelParameterfvEXT\", glGetTextureLevelParameterfvEXT == NULL);\r\n  glewInfoFunc(\"glGetTextureLevelParameterivEXT\", glGetTextureLevelParameterivEXT == NULL);\r\n  glewInfoFunc(\"glGetTextureParameterIivEXT\", glGetTextureParameterIivEXT == NULL);\r\n  glewInfoFunc(\"glGetTextureParameterIuivEXT\", glGetTextureParameterIuivEXT == NULL);\r\n  glewInfoFunc(\"glGetTextureParameterfvEXT\", glGetTextureParameterfvEXT == NULL);\r\n  glewInfoFunc(\"glGetTextureParameterivEXT\", glGetTextureParameterivEXT == NULL);\r\n  glewInfoFunc(\"glGetVertexArrayIntegeri_vEXT\", glGetVertexArrayIntegeri_vEXT == NULL);\r\n  glewInfoFunc(\"glGetVertexArrayIntegervEXT\", glGetVertexArrayIntegervEXT == NULL);\r\n  glewInfoFunc(\"glGetVertexArrayPointeri_vEXT\", glGetVertexArrayPointeri_vEXT == NULL);\r\n  glewInfoFunc(\"glGetVertexArrayPointervEXT\", glGetVertexArrayPointervEXT == NULL);\r\n  glewInfoFunc(\"glMapNamedBufferEXT\", glMapNamedBufferEXT == NULL);\r\n  glewInfoFunc(\"glMapNamedBufferRangeEXT\", glMapNamedBufferRangeEXT == NULL);\r\n  glewInfoFunc(\"glMatrixFrustumEXT\", glMatrixFrustumEXT == NULL);\r\n  glewInfoFunc(\"glMatrixLoadIdentityEXT\", glMatrixLoadIdentityEXT == NULL);\r\n  glewInfoFunc(\"glMatrixLoadTransposedEXT\", glMatrixLoadTransposedEXT == NULL);\r\n  glewInfoFunc(\"glMatrixLoadTransposefEXT\", glMatrixLoadTransposefEXT == NULL);\r\n  glewInfoFunc(\"glMatrixLoaddEXT\", glMatrixLoaddEXT == NULL);\r\n  glewInfoFunc(\"glMatrixLoadfEXT\", glMatrixLoadfEXT == NULL);\r\n  glewInfoFunc(\"glMatrixMultTransposedEXT\", glMatrixMultTransposedEXT == NULL);\r\n  glewInfoFunc(\"glMatrixMultTransposefEXT\", glMatrixMultTransposefEXT == NULL);\r\n  glewInfoFunc(\"glMatrixMultdEXT\", glMatrixMultdEXT == NULL);\r\n  glewInfoFunc(\"glMatrixMultfEXT\", glMatrixMultfEXT == NULL);\r\n  glewInfoFunc(\"glMatrixOrthoEXT\", glMatrixOrthoEXT == NULL);\r\n  glewInfoFunc(\"glMatrixPopEXT\", glMatrixPopEXT == NULL);\r\n  glewInfoFunc(\"glMatrixPushEXT\", glMatrixPushEXT == NULL);\r\n  glewInfoFunc(\"glMatrixRotatedEXT\", glMatrixRotatedEXT == NULL);\r\n  glewInfoFunc(\"glMatrixRotatefEXT\", glMatrixRotatefEXT == NULL);\r\n  glewInfoFunc(\"glMatrixScaledEXT\", glMatrixScaledEXT == NULL);\r\n  glewInfoFunc(\"glMatrixScalefEXT\", glMatrixScalefEXT == NULL);\r\n  glewInfoFunc(\"glMatrixTranslatedEXT\", glMatrixTranslatedEXT == NULL);\r\n  glewInfoFunc(\"glMatrixTranslatefEXT\", glMatrixTranslatefEXT == NULL);\r\n  glewInfoFunc(\"glMultiTexBufferEXT\", glMultiTexBufferEXT == NULL);\r\n  glewInfoFunc(\"glMultiTexCoordPointerEXT\", glMultiTexCoordPointerEXT == NULL);\r\n  glewInfoFunc(\"glMultiTexEnvfEXT\", glMultiTexEnvfEXT == NULL);\r\n  glewInfoFunc(\"glMultiTexEnvfvEXT\", glMultiTexEnvfvEXT == NULL);\r\n  glewInfoFunc(\"glMultiTexEnviEXT\", glMultiTexEnviEXT == NULL);\r\n  glewInfoFunc(\"glMultiTexEnvivEXT\", glMultiTexEnvivEXT == NULL);\r\n  glewInfoFunc(\"glMultiTexGendEXT\", glMultiTexGendEXT == NULL);\r\n  glewInfoFunc(\"glMultiTexGendvEXT\", glMultiTexGendvEXT == NULL);\r\n  glewInfoFunc(\"glMultiTexGenfEXT\", glMultiTexGenfEXT == NULL);\r\n  glewInfoFunc(\"glMultiTexGenfvEXT\", glMultiTexGenfvEXT == NULL);\r\n  glewInfoFunc(\"glMultiTexGeniEXT\", glMultiTexGeniEXT == NULL);\r\n  glewInfoFunc(\"glMultiTexGenivEXT\", glMultiTexGenivEXT == NULL);\r\n  glewInfoFunc(\"glMultiTexImage1DEXT\", glMultiTexImage1DEXT == NULL);\r\n  glewInfoFunc(\"glMultiTexImage2DEXT\", glMultiTexImage2DEXT == NULL);\r\n  glewInfoFunc(\"glMultiTexImage3DEXT\", glMultiTexImage3DEXT == NULL);\r\n  glewInfoFunc(\"glMultiTexParameterIivEXT\", glMultiTexParameterIivEXT == NULL);\r\n  glewInfoFunc(\"glMultiTexParameterIuivEXT\", glMultiTexParameterIuivEXT == NULL);\r\n  glewInfoFunc(\"glMultiTexParameterfEXT\", glMultiTexParameterfEXT == NULL);\r\n  glewInfoFunc(\"glMultiTexParameterfvEXT\", glMultiTexParameterfvEXT == NULL);\r\n  glewInfoFunc(\"glMultiTexParameteriEXT\", glMultiTexParameteriEXT == NULL);\r\n  glewInfoFunc(\"glMultiTexParameterivEXT\", glMultiTexParameterivEXT == NULL);\r\n  glewInfoFunc(\"glMultiTexRenderbufferEXT\", glMultiTexRenderbufferEXT == NULL);\r\n  glewInfoFunc(\"glMultiTexSubImage1DEXT\", glMultiTexSubImage1DEXT == NULL);\r\n  glewInfoFunc(\"glMultiTexSubImage2DEXT\", glMultiTexSubImage2DEXT == NULL);\r\n  glewInfoFunc(\"glMultiTexSubImage3DEXT\", glMultiTexSubImage3DEXT == NULL);\r\n  glewInfoFunc(\"glNamedBufferDataEXT\", glNamedBufferDataEXT == NULL);\r\n  glewInfoFunc(\"glNamedBufferSubDataEXT\", glNamedBufferSubDataEXT == NULL);\r\n  glewInfoFunc(\"glNamedCopyBufferSubDataEXT\", glNamedCopyBufferSubDataEXT == NULL);\r\n  glewInfoFunc(\"glNamedFramebufferRenderbufferEXT\", glNamedFramebufferRenderbufferEXT == NULL);\r\n  glewInfoFunc(\"glNamedFramebufferTexture1DEXT\", glNamedFramebufferTexture1DEXT == NULL);\r\n  glewInfoFunc(\"glNamedFramebufferTexture2DEXT\", glNamedFramebufferTexture2DEXT == NULL);\r\n  glewInfoFunc(\"glNamedFramebufferTexture3DEXT\", glNamedFramebufferTexture3DEXT == NULL);\r\n  glewInfoFunc(\"glNamedFramebufferTextureEXT\", glNamedFramebufferTextureEXT == NULL);\r\n  glewInfoFunc(\"glNamedFramebufferTextureFaceEXT\", glNamedFramebufferTextureFaceEXT == NULL);\r\n  glewInfoFunc(\"glNamedFramebufferTextureLayerEXT\", glNamedFramebufferTextureLayerEXT == NULL);\r\n  glewInfoFunc(\"glNamedProgramLocalParameter4dEXT\", glNamedProgramLocalParameter4dEXT == NULL);\r\n  glewInfoFunc(\"glNamedProgramLocalParameter4dvEXT\", glNamedProgramLocalParameter4dvEXT == NULL);\r\n  glewInfoFunc(\"glNamedProgramLocalParameter4fEXT\", glNamedProgramLocalParameter4fEXT == NULL);\r\n  glewInfoFunc(\"glNamedProgramLocalParameter4fvEXT\", glNamedProgramLocalParameter4fvEXT == NULL);\r\n  glewInfoFunc(\"glNamedProgramLocalParameterI4iEXT\", glNamedProgramLocalParameterI4iEXT == NULL);\r\n  glewInfoFunc(\"glNamedProgramLocalParameterI4ivEXT\", glNamedProgramLocalParameterI4ivEXT == NULL);\r\n  glewInfoFunc(\"glNamedProgramLocalParameterI4uiEXT\", glNamedProgramLocalParameterI4uiEXT == NULL);\r\n  glewInfoFunc(\"glNamedProgramLocalParameterI4uivEXT\", glNamedProgramLocalParameterI4uivEXT == NULL);\r\n  glewInfoFunc(\"glNamedProgramLocalParameters4fvEXT\", glNamedProgramLocalParameters4fvEXT == NULL);\r\n  glewInfoFunc(\"glNamedProgramLocalParametersI4ivEXT\", glNamedProgramLocalParametersI4ivEXT == NULL);\r\n  glewInfoFunc(\"glNamedProgramLocalParametersI4uivEXT\", glNamedProgramLocalParametersI4uivEXT == NULL);\r\n  glewInfoFunc(\"glNamedProgramStringEXT\", glNamedProgramStringEXT == NULL);\r\n  glewInfoFunc(\"glNamedRenderbufferStorageEXT\", glNamedRenderbufferStorageEXT == NULL);\r\n  glewInfoFunc(\"glNamedRenderbufferStorageMultisampleCoverageEXT\", glNamedRenderbufferStorageMultisampleCoverageEXT == NULL);\r\n  glewInfoFunc(\"glNamedRenderbufferStorageMultisampleEXT\", glNamedRenderbufferStorageMultisampleEXT == NULL);\r\n  glewInfoFunc(\"glProgramUniform1fEXT\", glProgramUniform1fEXT == NULL);\r\n  glewInfoFunc(\"glProgramUniform1fvEXT\", glProgramUniform1fvEXT == NULL);\r\n  glewInfoFunc(\"glProgramUniform1iEXT\", glProgramUniform1iEXT == NULL);\r\n  glewInfoFunc(\"glProgramUniform1ivEXT\", glProgramUniform1ivEXT == NULL);\r\n  glewInfoFunc(\"glProgramUniform1uiEXT\", glProgramUniform1uiEXT == NULL);\r\n  glewInfoFunc(\"glProgramUniform1uivEXT\", glProgramUniform1uivEXT == NULL);\r\n  glewInfoFunc(\"glProgramUniform2fEXT\", glProgramUniform2fEXT == NULL);\r\n  glewInfoFunc(\"glProgramUniform2fvEXT\", glProgramUniform2fvEXT == NULL);\r\n  glewInfoFunc(\"glProgramUniform2iEXT\", glProgramUniform2iEXT == NULL);\r\n  glewInfoFunc(\"glProgramUniform2ivEXT\", glProgramUniform2ivEXT == NULL);\r\n  glewInfoFunc(\"glProgramUniform2uiEXT\", glProgramUniform2uiEXT == NULL);\r\n  glewInfoFunc(\"glProgramUniform2uivEXT\", glProgramUniform2uivEXT == NULL);\r\n  glewInfoFunc(\"glProgramUniform3fEXT\", glProgramUniform3fEXT == NULL);\r\n  glewInfoFunc(\"glProgramUniform3fvEXT\", glProgramUniform3fvEXT == NULL);\r\n  glewInfoFunc(\"glProgramUniform3iEXT\", glProgramUniform3iEXT == NULL);\r\n  glewInfoFunc(\"glProgramUniform3ivEXT\", glProgramUniform3ivEXT == NULL);\r\n  glewInfoFunc(\"glProgramUniform3uiEXT\", glProgramUniform3uiEXT == NULL);\r\n  glewInfoFunc(\"glProgramUniform3uivEXT\", glProgramUniform3uivEXT == NULL);\r\n  glewInfoFunc(\"glProgramUniform4fEXT\", glProgramUniform4fEXT == NULL);\r\n  glewInfoFunc(\"glProgramUniform4fvEXT\", glProgramUniform4fvEXT == NULL);\r\n  glewInfoFunc(\"glProgramUniform4iEXT\", glProgramUniform4iEXT == NULL);\r\n  glewInfoFunc(\"glProgramUniform4ivEXT\", glProgramUniform4ivEXT == NULL);\r\n  glewInfoFunc(\"glProgramUniform4uiEXT\", glProgramUniform4uiEXT == NULL);\r\n  glewInfoFunc(\"glProgramUniform4uivEXT\", glProgramUniform4uivEXT == NULL);\r\n  glewInfoFunc(\"glProgramUniformMatrix2fvEXT\", glProgramUniformMatrix2fvEXT == NULL);\r\n  glewInfoFunc(\"glProgramUniformMatrix2x3fvEXT\", glProgramUniformMatrix2x3fvEXT == NULL);\r\n  glewInfoFunc(\"glProgramUniformMatrix2x4fvEXT\", glProgramUniformMatrix2x4fvEXT == NULL);\r\n  glewInfoFunc(\"glProgramUniformMatrix3fvEXT\", glProgramUniformMatrix3fvEXT == NULL);\r\n  glewInfoFunc(\"glProgramUniformMatrix3x2fvEXT\", glProgramUniformMatrix3x2fvEXT == NULL);\r\n  glewInfoFunc(\"glProgramUniformMatrix3x4fvEXT\", glProgramUniformMatrix3x4fvEXT == NULL);\r\n  glewInfoFunc(\"glProgramUniformMatrix4fvEXT\", glProgramUniformMatrix4fvEXT == NULL);\r\n  glewInfoFunc(\"glProgramUniformMatrix4x2fvEXT\", glProgramUniformMatrix4x2fvEXT == NULL);\r\n  glewInfoFunc(\"glProgramUniformMatrix4x3fvEXT\", glProgramUniformMatrix4x3fvEXT == NULL);\r\n  glewInfoFunc(\"glPushClientAttribDefaultEXT\", glPushClientAttribDefaultEXT == NULL);\r\n  glewInfoFunc(\"glTextureBufferEXT\", glTextureBufferEXT == NULL);\r\n  glewInfoFunc(\"glTextureImage1DEXT\", glTextureImage1DEXT == NULL);\r\n  glewInfoFunc(\"glTextureImage2DEXT\", glTextureImage2DEXT == NULL);\r\n  glewInfoFunc(\"glTextureImage3DEXT\", glTextureImage3DEXT == NULL);\r\n  glewInfoFunc(\"glTextureParameterIivEXT\", glTextureParameterIivEXT == NULL);\r\n  glewInfoFunc(\"glTextureParameterIuivEXT\", glTextureParameterIuivEXT == NULL);\r\n  glewInfoFunc(\"glTextureParameterfEXT\", glTextureParameterfEXT == NULL);\r\n  glewInfoFunc(\"glTextureParameterfvEXT\", glTextureParameterfvEXT == NULL);\r\n  glewInfoFunc(\"glTextureParameteriEXT\", glTextureParameteriEXT == NULL);\r\n  glewInfoFunc(\"glTextureParameterivEXT\", glTextureParameterivEXT == NULL);\r\n  glewInfoFunc(\"glTextureRenderbufferEXT\", glTextureRenderbufferEXT == NULL);\r\n  glewInfoFunc(\"glTextureSubImage1DEXT\", glTextureSubImage1DEXT == NULL);\r\n  glewInfoFunc(\"glTextureSubImage2DEXT\", glTextureSubImage2DEXT == NULL);\r\n  glewInfoFunc(\"glTextureSubImage3DEXT\", glTextureSubImage3DEXT == NULL);\r\n  glewInfoFunc(\"glUnmapNamedBufferEXT\", glUnmapNamedBufferEXT == NULL);\r\n  glewInfoFunc(\"glVertexArrayColorOffsetEXT\", glVertexArrayColorOffsetEXT == NULL);\r\n  glewInfoFunc(\"glVertexArrayEdgeFlagOffsetEXT\", glVertexArrayEdgeFlagOffsetEXT == NULL);\r\n  glewInfoFunc(\"glVertexArrayFogCoordOffsetEXT\", glVertexArrayFogCoordOffsetEXT == NULL);\r\n  glewInfoFunc(\"glVertexArrayIndexOffsetEXT\", glVertexArrayIndexOffsetEXT == NULL);\r\n  glewInfoFunc(\"glVertexArrayMultiTexCoordOffsetEXT\", glVertexArrayMultiTexCoordOffsetEXT == NULL);\r\n  glewInfoFunc(\"glVertexArrayNormalOffsetEXT\", glVertexArrayNormalOffsetEXT == NULL);\r\n  glewInfoFunc(\"glVertexArraySecondaryColorOffsetEXT\", glVertexArraySecondaryColorOffsetEXT == NULL);\r\n  glewInfoFunc(\"glVertexArrayTexCoordOffsetEXT\", glVertexArrayTexCoordOffsetEXT == NULL);\r\n  glewInfoFunc(\"glVertexArrayVertexAttribIOffsetEXT\", glVertexArrayVertexAttribIOffsetEXT == NULL);\r\n  glewInfoFunc(\"glVertexArrayVertexAttribOffsetEXT\", glVertexArrayVertexAttribOffsetEXT == NULL);\r\n  glewInfoFunc(\"glVertexArrayVertexOffsetEXT\", glVertexArrayVertexOffsetEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_direct_state_access */\r\n\r\n#ifdef GL_EXT_draw_buffers2\r\n\r\nstatic void _glewInfo_GL_EXT_draw_buffers2 (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_draw_buffers2\", GLEW_EXT_draw_buffers2, glewIsSupported(\"GL_EXT_draw_buffers2\"), glewGetExtension(\"GL_EXT_draw_buffers2\"));\r\n\r\n  glewInfoFunc(\"glColorMaskIndexedEXT\", glColorMaskIndexedEXT == NULL);\r\n  glewInfoFunc(\"glDisableIndexedEXT\", glDisableIndexedEXT == NULL);\r\n  glewInfoFunc(\"glEnableIndexedEXT\", glEnableIndexedEXT == NULL);\r\n  glewInfoFunc(\"glGetBooleanIndexedvEXT\", glGetBooleanIndexedvEXT == NULL);\r\n  glewInfoFunc(\"glGetIntegerIndexedvEXT\", glGetIntegerIndexedvEXT == NULL);\r\n  glewInfoFunc(\"glIsEnabledIndexedEXT\", glIsEnabledIndexedEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_draw_buffers2 */\r\n\r\n#ifdef GL_EXT_draw_instanced\r\n\r\nstatic void _glewInfo_GL_EXT_draw_instanced (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_draw_instanced\", GLEW_EXT_draw_instanced, glewIsSupported(\"GL_EXT_draw_instanced\"), glewGetExtension(\"GL_EXT_draw_instanced\"));\r\n\r\n  glewInfoFunc(\"glDrawArraysInstancedEXT\", glDrawArraysInstancedEXT == NULL);\r\n  glewInfoFunc(\"glDrawElementsInstancedEXT\", glDrawElementsInstancedEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_draw_instanced */\r\n\r\n#ifdef GL_EXT_draw_range_elements\r\n\r\nstatic void _glewInfo_GL_EXT_draw_range_elements (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_draw_range_elements\", GLEW_EXT_draw_range_elements, glewIsSupported(\"GL_EXT_draw_range_elements\"), glewGetExtension(\"GL_EXT_draw_range_elements\"));\r\n\r\n  glewInfoFunc(\"glDrawRangeElementsEXT\", glDrawRangeElementsEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_draw_range_elements */\r\n\r\n#ifdef GL_EXT_fog_coord\r\n\r\nstatic void _glewInfo_GL_EXT_fog_coord (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_fog_coord\", GLEW_EXT_fog_coord, glewIsSupported(\"GL_EXT_fog_coord\"), glewGetExtension(\"GL_EXT_fog_coord\"));\r\n\r\n  glewInfoFunc(\"glFogCoordPointerEXT\", glFogCoordPointerEXT == NULL);\r\n  glewInfoFunc(\"glFogCoorddEXT\", glFogCoorddEXT == NULL);\r\n  glewInfoFunc(\"glFogCoorddvEXT\", glFogCoorddvEXT == NULL);\r\n  glewInfoFunc(\"glFogCoordfEXT\", glFogCoordfEXT == NULL);\r\n  glewInfoFunc(\"glFogCoordfvEXT\", glFogCoordfvEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_fog_coord */\r\n\r\n#ifdef GL_EXT_fragment_lighting\r\n\r\nstatic void _glewInfo_GL_EXT_fragment_lighting (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_fragment_lighting\", GLEW_EXT_fragment_lighting, glewIsSupported(\"GL_EXT_fragment_lighting\"), glewGetExtension(\"GL_EXT_fragment_lighting\"));\r\n\r\n  glewInfoFunc(\"glFragmentColorMaterialEXT\", glFragmentColorMaterialEXT == NULL);\r\n  glewInfoFunc(\"glFragmentLightModelfEXT\", glFragmentLightModelfEXT == NULL);\r\n  glewInfoFunc(\"glFragmentLightModelfvEXT\", glFragmentLightModelfvEXT == NULL);\r\n  glewInfoFunc(\"glFragmentLightModeliEXT\", glFragmentLightModeliEXT == NULL);\r\n  glewInfoFunc(\"glFragmentLightModelivEXT\", glFragmentLightModelivEXT == NULL);\r\n  glewInfoFunc(\"glFragmentLightfEXT\", glFragmentLightfEXT == NULL);\r\n  glewInfoFunc(\"glFragmentLightfvEXT\", glFragmentLightfvEXT == NULL);\r\n  glewInfoFunc(\"glFragmentLightiEXT\", glFragmentLightiEXT == NULL);\r\n  glewInfoFunc(\"glFragmentLightivEXT\", glFragmentLightivEXT == NULL);\r\n  glewInfoFunc(\"glFragmentMaterialfEXT\", glFragmentMaterialfEXT == NULL);\r\n  glewInfoFunc(\"glFragmentMaterialfvEXT\", glFragmentMaterialfvEXT == NULL);\r\n  glewInfoFunc(\"glFragmentMaterialiEXT\", glFragmentMaterialiEXT == NULL);\r\n  glewInfoFunc(\"glFragmentMaterialivEXT\", glFragmentMaterialivEXT == NULL);\r\n  glewInfoFunc(\"glGetFragmentLightfvEXT\", glGetFragmentLightfvEXT == NULL);\r\n  glewInfoFunc(\"glGetFragmentLightivEXT\", glGetFragmentLightivEXT == NULL);\r\n  glewInfoFunc(\"glGetFragmentMaterialfvEXT\", glGetFragmentMaterialfvEXT == NULL);\r\n  glewInfoFunc(\"glGetFragmentMaterialivEXT\", glGetFragmentMaterialivEXT == NULL);\r\n  glewInfoFunc(\"glLightEnviEXT\", glLightEnviEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_fragment_lighting */\r\n\r\n#ifdef GL_EXT_framebuffer_blit\r\n\r\nstatic void _glewInfo_GL_EXT_framebuffer_blit (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_framebuffer_blit\", GLEW_EXT_framebuffer_blit, glewIsSupported(\"GL_EXT_framebuffer_blit\"), glewGetExtension(\"GL_EXT_framebuffer_blit\"));\r\n\r\n  glewInfoFunc(\"glBlitFramebufferEXT\", glBlitFramebufferEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_framebuffer_blit */\r\n\r\n#ifdef GL_EXT_framebuffer_multisample\r\n\r\nstatic void _glewInfo_GL_EXT_framebuffer_multisample (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_framebuffer_multisample\", GLEW_EXT_framebuffer_multisample, glewIsSupported(\"GL_EXT_framebuffer_multisample\"), glewGetExtension(\"GL_EXT_framebuffer_multisample\"));\r\n\r\n  glewInfoFunc(\"glRenderbufferStorageMultisampleEXT\", glRenderbufferStorageMultisampleEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_framebuffer_multisample */\r\n\r\n#ifdef GL_EXT_framebuffer_object\r\n\r\nstatic void _glewInfo_GL_EXT_framebuffer_object (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_framebuffer_object\", GLEW_EXT_framebuffer_object, glewIsSupported(\"GL_EXT_framebuffer_object\"), glewGetExtension(\"GL_EXT_framebuffer_object\"));\r\n\r\n  glewInfoFunc(\"glBindFramebufferEXT\", glBindFramebufferEXT == NULL);\r\n  glewInfoFunc(\"glBindRenderbufferEXT\", glBindRenderbufferEXT == NULL);\r\n  glewInfoFunc(\"glCheckFramebufferStatusEXT\", glCheckFramebufferStatusEXT == NULL);\r\n  glewInfoFunc(\"glDeleteFramebuffersEXT\", glDeleteFramebuffersEXT == NULL);\r\n  glewInfoFunc(\"glDeleteRenderbuffersEXT\", glDeleteRenderbuffersEXT == NULL);\r\n  glewInfoFunc(\"glFramebufferRenderbufferEXT\", glFramebufferRenderbufferEXT == NULL);\r\n  glewInfoFunc(\"glFramebufferTexture1DEXT\", glFramebufferTexture1DEXT == NULL);\r\n  glewInfoFunc(\"glFramebufferTexture2DEXT\", glFramebufferTexture2DEXT == NULL);\r\n  glewInfoFunc(\"glFramebufferTexture3DEXT\", glFramebufferTexture3DEXT == NULL);\r\n  glewInfoFunc(\"glGenFramebuffersEXT\", glGenFramebuffersEXT == NULL);\r\n  glewInfoFunc(\"glGenRenderbuffersEXT\", glGenRenderbuffersEXT == NULL);\r\n  glewInfoFunc(\"glGenerateMipmapEXT\", glGenerateMipmapEXT == NULL);\r\n  glewInfoFunc(\"glGetFramebufferAttachmentParameterivEXT\", glGetFramebufferAttachmentParameterivEXT == NULL);\r\n  glewInfoFunc(\"glGetRenderbufferParameterivEXT\", glGetRenderbufferParameterivEXT == NULL);\r\n  glewInfoFunc(\"glIsFramebufferEXT\", glIsFramebufferEXT == NULL);\r\n  glewInfoFunc(\"glIsRenderbufferEXT\", glIsRenderbufferEXT == NULL);\r\n  glewInfoFunc(\"glRenderbufferStorageEXT\", glRenderbufferStorageEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_framebuffer_object */\r\n\r\n#ifdef GL_EXT_framebuffer_sRGB\r\n\r\nstatic void _glewInfo_GL_EXT_framebuffer_sRGB (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_framebuffer_sRGB\", GLEW_EXT_framebuffer_sRGB, glewIsSupported(\"GL_EXT_framebuffer_sRGB\"), glewGetExtension(\"GL_EXT_framebuffer_sRGB\"));\r\n}\r\n\r\n#endif /* GL_EXT_framebuffer_sRGB */\r\n\r\n#ifdef GL_EXT_geometry_shader4\r\n\r\nstatic void _glewInfo_GL_EXT_geometry_shader4 (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_geometry_shader4\", GLEW_EXT_geometry_shader4, glewIsSupported(\"GL_EXT_geometry_shader4\"), glewGetExtension(\"GL_EXT_geometry_shader4\"));\r\n\r\n  glewInfoFunc(\"glFramebufferTextureEXT\", glFramebufferTextureEXT == NULL);\r\n  glewInfoFunc(\"glFramebufferTextureFaceEXT\", glFramebufferTextureFaceEXT == NULL);\r\n  glewInfoFunc(\"glFramebufferTextureLayerEXT\", glFramebufferTextureLayerEXT == NULL);\r\n  glewInfoFunc(\"glProgramParameteriEXT\", glProgramParameteriEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_geometry_shader4 */\r\n\r\n#ifdef GL_EXT_gpu_program_parameters\r\n\r\nstatic void _glewInfo_GL_EXT_gpu_program_parameters (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_gpu_program_parameters\", GLEW_EXT_gpu_program_parameters, glewIsSupported(\"GL_EXT_gpu_program_parameters\"), glewGetExtension(\"GL_EXT_gpu_program_parameters\"));\r\n\r\n  glewInfoFunc(\"glProgramEnvParameters4fvEXT\", glProgramEnvParameters4fvEXT == NULL);\r\n  glewInfoFunc(\"glProgramLocalParameters4fvEXT\", glProgramLocalParameters4fvEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_gpu_program_parameters */\r\n\r\n#ifdef GL_EXT_gpu_shader4\r\n\r\nstatic void _glewInfo_GL_EXT_gpu_shader4 (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_gpu_shader4\", GLEW_EXT_gpu_shader4, glewIsSupported(\"GL_EXT_gpu_shader4\"), glewGetExtension(\"GL_EXT_gpu_shader4\"));\r\n\r\n  glewInfoFunc(\"glBindFragDataLocationEXT\", glBindFragDataLocationEXT == NULL);\r\n  glewInfoFunc(\"glGetFragDataLocationEXT\", glGetFragDataLocationEXT == NULL);\r\n  glewInfoFunc(\"glGetUniformuivEXT\", glGetUniformuivEXT == NULL);\r\n  glewInfoFunc(\"glGetVertexAttribIivEXT\", glGetVertexAttribIivEXT == NULL);\r\n  glewInfoFunc(\"glGetVertexAttribIuivEXT\", glGetVertexAttribIuivEXT == NULL);\r\n  glewInfoFunc(\"glUniform1uiEXT\", glUniform1uiEXT == NULL);\r\n  glewInfoFunc(\"glUniform1uivEXT\", glUniform1uivEXT == NULL);\r\n  glewInfoFunc(\"glUniform2uiEXT\", glUniform2uiEXT == NULL);\r\n  glewInfoFunc(\"glUniform2uivEXT\", glUniform2uivEXT == NULL);\r\n  glewInfoFunc(\"glUniform3uiEXT\", glUniform3uiEXT == NULL);\r\n  glewInfoFunc(\"glUniform3uivEXT\", glUniform3uivEXT == NULL);\r\n  glewInfoFunc(\"glUniform4uiEXT\", glUniform4uiEXT == NULL);\r\n  glewInfoFunc(\"glUniform4uivEXT\", glUniform4uivEXT == NULL);\r\n  glewInfoFunc(\"glVertexAttribI1iEXT\", glVertexAttribI1iEXT == NULL);\r\n  glewInfoFunc(\"glVertexAttribI1ivEXT\", glVertexAttribI1ivEXT == NULL);\r\n  glewInfoFunc(\"glVertexAttribI1uiEXT\", glVertexAttribI1uiEXT == NULL);\r\n  glewInfoFunc(\"glVertexAttribI1uivEXT\", glVertexAttribI1uivEXT == NULL);\r\n  glewInfoFunc(\"glVertexAttribI2iEXT\", glVertexAttribI2iEXT == NULL);\r\n  glewInfoFunc(\"glVertexAttribI2ivEXT\", glVertexAttribI2ivEXT == NULL);\r\n  glewInfoFunc(\"glVertexAttribI2uiEXT\", glVertexAttribI2uiEXT == NULL);\r\n  glewInfoFunc(\"glVertexAttribI2uivEXT\", glVertexAttribI2uivEXT == NULL);\r\n  glewInfoFunc(\"glVertexAttribI3iEXT\", glVertexAttribI3iEXT == NULL);\r\n  glewInfoFunc(\"glVertexAttribI3ivEXT\", glVertexAttribI3ivEXT == NULL);\r\n  glewInfoFunc(\"glVertexAttribI3uiEXT\", glVertexAttribI3uiEXT == NULL);\r\n  glewInfoFunc(\"glVertexAttribI3uivEXT\", glVertexAttribI3uivEXT == NULL);\r\n  glewInfoFunc(\"glVertexAttribI4bvEXT\", glVertexAttribI4bvEXT == NULL);\r\n  glewInfoFunc(\"glVertexAttribI4iEXT\", glVertexAttribI4iEXT == NULL);\r\n  glewInfoFunc(\"glVertexAttribI4ivEXT\", glVertexAttribI4ivEXT == NULL);\r\n  glewInfoFunc(\"glVertexAttribI4svEXT\", glVertexAttribI4svEXT == NULL);\r\n  glewInfoFunc(\"glVertexAttribI4ubvEXT\", glVertexAttribI4ubvEXT == NULL);\r\n  glewInfoFunc(\"glVertexAttribI4uiEXT\", glVertexAttribI4uiEXT == NULL);\r\n  glewInfoFunc(\"glVertexAttribI4uivEXT\", glVertexAttribI4uivEXT == NULL);\r\n  glewInfoFunc(\"glVertexAttribI4usvEXT\", glVertexAttribI4usvEXT == NULL);\r\n  glewInfoFunc(\"glVertexAttribIPointerEXT\", glVertexAttribIPointerEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_gpu_shader4 */\r\n\r\n#ifdef GL_EXT_histogram\r\n\r\nstatic void _glewInfo_GL_EXT_histogram (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_histogram\", GLEW_EXT_histogram, glewIsSupported(\"GL_EXT_histogram\"), glewGetExtension(\"GL_EXT_histogram\"));\r\n\r\n  glewInfoFunc(\"glGetHistogramEXT\", glGetHistogramEXT == NULL);\r\n  glewInfoFunc(\"glGetHistogramParameterfvEXT\", glGetHistogramParameterfvEXT == NULL);\r\n  glewInfoFunc(\"glGetHistogramParameterivEXT\", glGetHistogramParameterivEXT == NULL);\r\n  glewInfoFunc(\"glGetMinmaxEXT\", glGetMinmaxEXT == NULL);\r\n  glewInfoFunc(\"glGetMinmaxParameterfvEXT\", glGetMinmaxParameterfvEXT == NULL);\r\n  glewInfoFunc(\"glGetMinmaxParameterivEXT\", glGetMinmaxParameterivEXT == NULL);\r\n  glewInfoFunc(\"glHistogramEXT\", glHistogramEXT == NULL);\r\n  glewInfoFunc(\"glMinmaxEXT\", glMinmaxEXT == NULL);\r\n  glewInfoFunc(\"glResetHistogramEXT\", glResetHistogramEXT == NULL);\r\n  glewInfoFunc(\"glResetMinmaxEXT\", glResetMinmaxEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_histogram */\r\n\r\n#ifdef GL_EXT_index_array_formats\r\n\r\nstatic void _glewInfo_GL_EXT_index_array_formats (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_index_array_formats\", GLEW_EXT_index_array_formats, glewIsSupported(\"GL_EXT_index_array_formats\"), glewGetExtension(\"GL_EXT_index_array_formats\"));\r\n}\r\n\r\n#endif /* GL_EXT_index_array_formats */\r\n\r\n#ifdef GL_EXT_index_func\r\n\r\nstatic void _glewInfo_GL_EXT_index_func (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_index_func\", GLEW_EXT_index_func, glewIsSupported(\"GL_EXT_index_func\"), glewGetExtension(\"GL_EXT_index_func\"));\r\n\r\n  glewInfoFunc(\"glIndexFuncEXT\", glIndexFuncEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_index_func */\r\n\r\n#ifdef GL_EXT_index_material\r\n\r\nstatic void _glewInfo_GL_EXT_index_material (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_index_material\", GLEW_EXT_index_material, glewIsSupported(\"GL_EXT_index_material\"), glewGetExtension(\"GL_EXT_index_material\"));\r\n\r\n  glewInfoFunc(\"glIndexMaterialEXT\", glIndexMaterialEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_index_material */\r\n\r\n#ifdef GL_EXT_index_texture\r\n\r\nstatic void _glewInfo_GL_EXT_index_texture (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_index_texture\", GLEW_EXT_index_texture, glewIsSupported(\"GL_EXT_index_texture\"), glewGetExtension(\"GL_EXT_index_texture\"));\r\n}\r\n\r\n#endif /* GL_EXT_index_texture */\r\n\r\n#ifdef GL_EXT_light_texture\r\n\r\nstatic void _glewInfo_GL_EXT_light_texture (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_light_texture\", GLEW_EXT_light_texture, glewIsSupported(\"GL_EXT_light_texture\"), glewGetExtension(\"GL_EXT_light_texture\"));\r\n\r\n  glewInfoFunc(\"glApplyTextureEXT\", glApplyTextureEXT == NULL);\r\n  glewInfoFunc(\"glTextureLightEXT\", glTextureLightEXT == NULL);\r\n  glewInfoFunc(\"glTextureMaterialEXT\", glTextureMaterialEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_light_texture */\r\n\r\n#ifdef GL_EXT_misc_attribute\r\n\r\nstatic void _glewInfo_GL_EXT_misc_attribute (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_misc_attribute\", GLEW_EXT_misc_attribute, glewIsSupported(\"GL_EXT_misc_attribute\"), glewGetExtension(\"GL_EXT_misc_attribute\"));\r\n}\r\n\r\n#endif /* GL_EXT_misc_attribute */\r\n\r\n#ifdef GL_EXT_multi_draw_arrays\r\n\r\nstatic void _glewInfo_GL_EXT_multi_draw_arrays (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_multi_draw_arrays\", GLEW_EXT_multi_draw_arrays, glewIsSupported(\"GL_EXT_multi_draw_arrays\"), glewGetExtension(\"GL_EXT_multi_draw_arrays\"));\r\n\r\n  glewInfoFunc(\"glMultiDrawArraysEXT\", glMultiDrawArraysEXT == NULL);\r\n  glewInfoFunc(\"glMultiDrawElementsEXT\", glMultiDrawElementsEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_multi_draw_arrays */\r\n\r\n#ifdef GL_EXT_multisample\r\n\r\nstatic void _glewInfo_GL_EXT_multisample (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_multisample\", GLEW_EXT_multisample, glewIsSupported(\"GL_EXT_multisample\"), glewGetExtension(\"GL_EXT_multisample\"));\r\n\r\n  glewInfoFunc(\"glSampleMaskEXT\", glSampleMaskEXT == NULL);\r\n  glewInfoFunc(\"glSamplePatternEXT\", glSamplePatternEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_multisample */\r\n\r\n#ifdef GL_EXT_packed_depth_stencil\r\n\r\nstatic void _glewInfo_GL_EXT_packed_depth_stencil (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_packed_depth_stencil\", GLEW_EXT_packed_depth_stencil, glewIsSupported(\"GL_EXT_packed_depth_stencil\"), glewGetExtension(\"GL_EXT_packed_depth_stencil\"));\r\n}\r\n\r\n#endif /* GL_EXT_packed_depth_stencil */\r\n\r\n#ifdef GL_EXT_packed_float\r\n\r\nstatic void _glewInfo_GL_EXT_packed_float (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_packed_float\", GLEW_EXT_packed_float, glewIsSupported(\"GL_EXT_packed_float\"), glewGetExtension(\"GL_EXT_packed_float\"));\r\n}\r\n\r\n#endif /* GL_EXT_packed_float */\r\n\r\n#ifdef GL_EXT_packed_pixels\r\n\r\nstatic void _glewInfo_GL_EXT_packed_pixels (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_packed_pixels\", GLEW_EXT_packed_pixels, glewIsSupported(\"GL_EXT_packed_pixels\"), glewGetExtension(\"GL_EXT_packed_pixels\"));\r\n}\r\n\r\n#endif /* GL_EXT_packed_pixels */\r\n\r\n#ifdef GL_EXT_paletted_texture\r\n\r\nstatic void _glewInfo_GL_EXT_paletted_texture (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_paletted_texture\", GLEW_EXT_paletted_texture, glewIsSupported(\"GL_EXT_paletted_texture\"), glewGetExtension(\"GL_EXT_paletted_texture\"));\r\n\r\n  glewInfoFunc(\"glColorTableEXT\", glColorTableEXT == NULL);\r\n  glewInfoFunc(\"glGetColorTableEXT\", glGetColorTableEXT == NULL);\r\n  glewInfoFunc(\"glGetColorTableParameterfvEXT\", glGetColorTableParameterfvEXT == NULL);\r\n  glewInfoFunc(\"glGetColorTableParameterivEXT\", glGetColorTableParameterivEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_paletted_texture */\r\n\r\n#ifdef GL_EXT_pixel_buffer_object\r\n\r\nstatic void _glewInfo_GL_EXT_pixel_buffer_object (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_pixel_buffer_object\", GLEW_EXT_pixel_buffer_object, glewIsSupported(\"GL_EXT_pixel_buffer_object\"), glewGetExtension(\"GL_EXT_pixel_buffer_object\"));\r\n}\r\n\r\n#endif /* GL_EXT_pixel_buffer_object */\r\n\r\n#ifdef GL_EXT_pixel_transform\r\n\r\nstatic void _glewInfo_GL_EXT_pixel_transform (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_pixel_transform\", GLEW_EXT_pixel_transform, glewIsSupported(\"GL_EXT_pixel_transform\"), glewGetExtension(\"GL_EXT_pixel_transform\"));\r\n\r\n  glewInfoFunc(\"glGetPixelTransformParameterfvEXT\", glGetPixelTransformParameterfvEXT == NULL);\r\n  glewInfoFunc(\"glGetPixelTransformParameterivEXT\", glGetPixelTransformParameterivEXT == NULL);\r\n  glewInfoFunc(\"glPixelTransformParameterfEXT\", glPixelTransformParameterfEXT == NULL);\r\n  glewInfoFunc(\"glPixelTransformParameterfvEXT\", glPixelTransformParameterfvEXT == NULL);\r\n  glewInfoFunc(\"glPixelTransformParameteriEXT\", glPixelTransformParameteriEXT == NULL);\r\n  glewInfoFunc(\"glPixelTransformParameterivEXT\", glPixelTransformParameterivEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_pixel_transform */\r\n\r\n#ifdef GL_EXT_pixel_transform_color_table\r\n\r\nstatic void _glewInfo_GL_EXT_pixel_transform_color_table (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_pixel_transform_color_table\", GLEW_EXT_pixel_transform_color_table, glewIsSupported(\"GL_EXT_pixel_transform_color_table\"), glewGetExtension(\"GL_EXT_pixel_transform_color_table\"));\r\n}\r\n\r\n#endif /* GL_EXT_pixel_transform_color_table */\r\n\r\n#ifdef GL_EXT_point_parameters\r\n\r\nstatic void _glewInfo_GL_EXT_point_parameters (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_point_parameters\", GLEW_EXT_point_parameters, glewIsSupported(\"GL_EXT_point_parameters\"), glewGetExtension(\"GL_EXT_point_parameters\"));\r\n\r\n  glewInfoFunc(\"glPointParameterfEXT\", glPointParameterfEXT == NULL);\r\n  glewInfoFunc(\"glPointParameterfvEXT\", glPointParameterfvEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_point_parameters */\r\n\r\n#ifdef GL_EXT_polygon_offset\r\n\r\nstatic void _glewInfo_GL_EXT_polygon_offset (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_polygon_offset\", GLEW_EXT_polygon_offset, glewIsSupported(\"GL_EXT_polygon_offset\"), glewGetExtension(\"GL_EXT_polygon_offset\"));\r\n\r\n  glewInfoFunc(\"glPolygonOffsetEXT\", glPolygonOffsetEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_polygon_offset */\r\n\r\n#ifdef GL_EXT_provoking_vertex\r\n\r\nstatic void _glewInfo_GL_EXT_provoking_vertex (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_provoking_vertex\", GLEW_EXT_provoking_vertex, glewIsSupported(\"GL_EXT_provoking_vertex\"), glewGetExtension(\"GL_EXT_provoking_vertex\"));\r\n\r\n  glewInfoFunc(\"glProvokingVertexEXT\", glProvokingVertexEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_provoking_vertex */\r\n\r\n#ifdef GL_EXT_rescale_normal\r\n\r\nstatic void _glewInfo_GL_EXT_rescale_normal (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_rescale_normal\", GLEW_EXT_rescale_normal, glewIsSupported(\"GL_EXT_rescale_normal\"), glewGetExtension(\"GL_EXT_rescale_normal\"));\r\n}\r\n\r\n#endif /* GL_EXT_rescale_normal */\r\n\r\n#ifdef GL_EXT_scene_marker\r\n\r\nstatic void _glewInfo_GL_EXT_scene_marker (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_scene_marker\", GLEW_EXT_scene_marker, glewIsSupported(\"GL_EXT_scene_marker\"), glewGetExtension(\"GL_EXT_scene_marker\"));\r\n\r\n  glewInfoFunc(\"glBeginSceneEXT\", glBeginSceneEXT == NULL);\r\n  glewInfoFunc(\"glEndSceneEXT\", glEndSceneEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_scene_marker */\r\n\r\n#ifdef GL_EXT_secondary_color\r\n\r\nstatic void _glewInfo_GL_EXT_secondary_color (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_secondary_color\", GLEW_EXT_secondary_color, glewIsSupported(\"GL_EXT_secondary_color\"), glewGetExtension(\"GL_EXT_secondary_color\"));\r\n\r\n  glewInfoFunc(\"glSecondaryColor3bEXT\", glSecondaryColor3bEXT == NULL);\r\n  glewInfoFunc(\"glSecondaryColor3bvEXT\", glSecondaryColor3bvEXT == NULL);\r\n  glewInfoFunc(\"glSecondaryColor3dEXT\", glSecondaryColor3dEXT == NULL);\r\n  glewInfoFunc(\"glSecondaryColor3dvEXT\", glSecondaryColor3dvEXT == NULL);\r\n  glewInfoFunc(\"glSecondaryColor3fEXT\", glSecondaryColor3fEXT == NULL);\r\n  glewInfoFunc(\"glSecondaryColor3fvEXT\", glSecondaryColor3fvEXT == NULL);\r\n  glewInfoFunc(\"glSecondaryColor3iEXT\", glSecondaryColor3iEXT == NULL);\r\n  glewInfoFunc(\"glSecondaryColor3ivEXT\", glSecondaryColor3ivEXT == NULL);\r\n  glewInfoFunc(\"glSecondaryColor3sEXT\", glSecondaryColor3sEXT == NULL);\r\n  glewInfoFunc(\"glSecondaryColor3svEXT\", glSecondaryColor3svEXT == NULL);\r\n  glewInfoFunc(\"glSecondaryColor3ubEXT\", glSecondaryColor3ubEXT == NULL);\r\n  glewInfoFunc(\"glSecondaryColor3ubvEXT\", glSecondaryColor3ubvEXT == NULL);\r\n  glewInfoFunc(\"glSecondaryColor3uiEXT\", glSecondaryColor3uiEXT == NULL);\r\n  glewInfoFunc(\"glSecondaryColor3uivEXT\", glSecondaryColor3uivEXT == NULL);\r\n  glewInfoFunc(\"glSecondaryColor3usEXT\", glSecondaryColor3usEXT == NULL);\r\n  glewInfoFunc(\"glSecondaryColor3usvEXT\", glSecondaryColor3usvEXT == NULL);\r\n  glewInfoFunc(\"glSecondaryColorPointerEXT\", glSecondaryColorPointerEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_secondary_color */\r\n\r\n#ifdef GL_EXT_separate_shader_objects\r\n\r\nstatic void _glewInfo_GL_EXT_separate_shader_objects (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_separate_shader_objects\", GLEW_EXT_separate_shader_objects, glewIsSupported(\"GL_EXT_separate_shader_objects\"), glewGetExtension(\"GL_EXT_separate_shader_objects\"));\r\n\r\n  glewInfoFunc(\"glActiveProgramEXT\", glActiveProgramEXT == NULL);\r\n  glewInfoFunc(\"glCreateShaderProgramEXT\", glCreateShaderProgramEXT == NULL);\r\n  glewInfoFunc(\"glUseShaderProgramEXT\", glUseShaderProgramEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_separate_shader_objects */\r\n\r\n#ifdef GL_EXT_separate_specular_color\r\n\r\nstatic void _glewInfo_GL_EXT_separate_specular_color (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_separate_specular_color\", GLEW_EXT_separate_specular_color, glewIsSupported(\"GL_EXT_separate_specular_color\"), glewGetExtension(\"GL_EXT_separate_specular_color\"));\r\n}\r\n\r\n#endif /* GL_EXT_separate_specular_color */\r\n\r\n#ifdef GL_EXT_shadow_funcs\r\n\r\nstatic void _glewInfo_GL_EXT_shadow_funcs (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_shadow_funcs\", GLEW_EXT_shadow_funcs, glewIsSupported(\"GL_EXT_shadow_funcs\"), glewGetExtension(\"GL_EXT_shadow_funcs\"));\r\n}\r\n\r\n#endif /* GL_EXT_shadow_funcs */\r\n\r\n#ifdef GL_EXT_shared_texture_palette\r\n\r\nstatic void _glewInfo_GL_EXT_shared_texture_palette (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_shared_texture_palette\", GLEW_EXT_shared_texture_palette, glewIsSupported(\"GL_EXT_shared_texture_palette\"), glewGetExtension(\"GL_EXT_shared_texture_palette\"));\r\n}\r\n\r\n#endif /* GL_EXT_shared_texture_palette */\r\n\r\n#ifdef GL_EXT_stencil_clear_tag\r\n\r\nstatic void _glewInfo_GL_EXT_stencil_clear_tag (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_stencil_clear_tag\", GLEW_EXT_stencil_clear_tag, glewIsSupported(\"GL_EXT_stencil_clear_tag\"), glewGetExtension(\"GL_EXT_stencil_clear_tag\"));\r\n}\r\n\r\n#endif /* GL_EXT_stencil_clear_tag */\r\n\r\n#ifdef GL_EXT_stencil_two_side\r\n\r\nstatic void _glewInfo_GL_EXT_stencil_two_side (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_stencil_two_side\", GLEW_EXT_stencil_two_side, glewIsSupported(\"GL_EXT_stencil_two_side\"), glewGetExtension(\"GL_EXT_stencil_two_side\"));\r\n\r\n  glewInfoFunc(\"glActiveStencilFaceEXT\", glActiveStencilFaceEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_stencil_two_side */\r\n\r\n#ifdef GL_EXT_stencil_wrap\r\n\r\nstatic void _glewInfo_GL_EXT_stencil_wrap (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_stencil_wrap\", GLEW_EXT_stencil_wrap, glewIsSupported(\"GL_EXT_stencil_wrap\"), glewGetExtension(\"GL_EXT_stencil_wrap\"));\r\n}\r\n\r\n#endif /* GL_EXT_stencil_wrap */\r\n\r\n#ifdef GL_EXT_subtexture\r\n\r\nstatic void _glewInfo_GL_EXT_subtexture (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_subtexture\", GLEW_EXT_subtexture, glewIsSupported(\"GL_EXT_subtexture\"), glewGetExtension(\"GL_EXT_subtexture\"));\r\n\r\n  glewInfoFunc(\"glTexSubImage1DEXT\", glTexSubImage1DEXT == NULL);\r\n  glewInfoFunc(\"glTexSubImage2DEXT\", glTexSubImage2DEXT == NULL);\r\n  glewInfoFunc(\"glTexSubImage3DEXT\", glTexSubImage3DEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_subtexture */\r\n\r\n#ifdef GL_EXT_texture\r\n\r\nstatic void _glewInfo_GL_EXT_texture (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_texture\", GLEW_EXT_texture, glewIsSupported(\"GL_EXT_texture\"), glewGetExtension(\"GL_EXT_texture\"));\r\n}\r\n\r\n#endif /* GL_EXT_texture */\r\n\r\n#ifdef GL_EXT_texture3D\r\n\r\nstatic void _glewInfo_GL_EXT_texture3D (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_texture3D\", GLEW_EXT_texture3D, glewIsSupported(\"GL_EXT_texture3D\"), glewGetExtension(\"GL_EXT_texture3D\"));\r\n\r\n  glewInfoFunc(\"glTexImage3DEXT\", glTexImage3DEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_texture3D */\r\n\r\n#ifdef GL_EXT_texture_array\r\n\r\nstatic void _glewInfo_GL_EXT_texture_array (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_texture_array\", GLEW_EXT_texture_array, glewIsSupported(\"GL_EXT_texture_array\"), glewGetExtension(\"GL_EXT_texture_array\"));\r\n}\r\n\r\n#endif /* GL_EXT_texture_array */\r\n\r\n#ifdef GL_EXT_texture_buffer_object\r\n\r\nstatic void _glewInfo_GL_EXT_texture_buffer_object (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_texture_buffer_object\", GLEW_EXT_texture_buffer_object, glewIsSupported(\"GL_EXT_texture_buffer_object\"), glewGetExtension(\"GL_EXT_texture_buffer_object\"));\r\n\r\n  glewInfoFunc(\"glTexBufferEXT\", glTexBufferEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_texture_buffer_object */\r\n\r\n#ifdef GL_EXT_texture_compression_dxt1\r\n\r\nstatic void _glewInfo_GL_EXT_texture_compression_dxt1 (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_texture_compression_dxt1\", GLEW_EXT_texture_compression_dxt1, glewIsSupported(\"GL_EXT_texture_compression_dxt1\"), glewGetExtension(\"GL_EXT_texture_compression_dxt1\"));\r\n}\r\n\r\n#endif /* GL_EXT_texture_compression_dxt1 */\r\n\r\n#ifdef GL_EXT_texture_compression_latc\r\n\r\nstatic void _glewInfo_GL_EXT_texture_compression_latc (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_texture_compression_latc\", GLEW_EXT_texture_compression_latc, glewIsSupported(\"GL_EXT_texture_compression_latc\"), glewGetExtension(\"GL_EXT_texture_compression_latc\"));\r\n}\r\n\r\n#endif /* GL_EXT_texture_compression_latc */\r\n\r\n#ifdef GL_EXT_texture_compression_rgtc\r\n\r\nstatic void _glewInfo_GL_EXT_texture_compression_rgtc (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_texture_compression_rgtc\", GLEW_EXT_texture_compression_rgtc, glewIsSupported(\"GL_EXT_texture_compression_rgtc\"), glewGetExtension(\"GL_EXT_texture_compression_rgtc\"));\r\n}\r\n\r\n#endif /* GL_EXT_texture_compression_rgtc */\r\n\r\n#ifdef GL_EXT_texture_compression_s3tc\r\n\r\nstatic void _glewInfo_GL_EXT_texture_compression_s3tc (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_texture_compression_s3tc\", GLEW_EXT_texture_compression_s3tc, glewIsSupported(\"GL_EXT_texture_compression_s3tc\"), glewGetExtension(\"GL_EXT_texture_compression_s3tc\"));\r\n}\r\n\r\n#endif /* GL_EXT_texture_compression_s3tc */\r\n\r\n#ifdef GL_EXT_texture_cube_map\r\n\r\nstatic void _glewInfo_GL_EXT_texture_cube_map (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_texture_cube_map\", GLEW_EXT_texture_cube_map, glewIsSupported(\"GL_EXT_texture_cube_map\"), glewGetExtension(\"GL_EXT_texture_cube_map\"));\r\n}\r\n\r\n#endif /* GL_EXT_texture_cube_map */\r\n\r\n#ifdef GL_EXT_texture_edge_clamp\r\n\r\nstatic void _glewInfo_GL_EXT_texture_edge_clamp (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_texture_edge_clamp\", GLEW_EXT_texture_edge_clamp, glewIsSupported(\"GL_EXT_texture_edge_clamp\"), glewGetExtension(\"GL_EXT_texture_edge_clamp\"));\r\n}\r\n\r\n#endif /* GL_EXT_texture_edge_clamp */\r\n\r\n#ifdef GL_EXT_texture_env\r\n\r\nstatic void _glewInfo_GL_EXT_texture_env (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_texture_env\", GLEW_EXT_texture_env, glewIsSupported(\"GL_EXT_texture_env\"), glewGetExtension(\"GL_EXT_texture_env\"));\r\n}\r\n\r\n#endif /* GL_EXT_texture_env */\r\n\r\n#ifdef GL_EXT_texture_env_add\r\n\r\nstatic void _glewInfo_GL_EXT_texture_env_add (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_texture_env_add\", GLEW_EXT_texture_env_add, glewIsSupported(\"GL_EXT_texture_env_add\"), glewGetExtension(\"GL_EXT_texture_env_add\"));\r\n}\r\n\r\n#endif /* GL_EXT_texture_env_add */\r\n\r\n#ifdef GL_EXT_texture_env_combine\r\n\r\nstatic void _glewInfo_GL_EXT_texture_env_combine (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_texture_env_combine\", GLEW_EXT_texture_env_combine, glewIsSupported(\"GL_EXT_texture_env_combine\"), glewGetExtension(\"GL_EXT_texture_env_combine\"));\r\n}\r\n\r\n#endif /* GL_EXT_texture_env_combine */\r\n\r\n#ifdef GL_EXT_texture_env_dot3\r\n\r\nstatic void _glewInfo_GL_EXT_texture_env_dot3 (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_texture_env_dot3\", GLEW_EXT_texture_env_dot3, glewIsSupported(\"GL_EXT_texture_env_dot3\"), glewGetExtension(\"GL_EXT_texture_env_dot3\"));\r\n}\r\n\r\n#endif /* GL_EXT_texture_env_dot3 */\r\n\r\n#ifdef GL_EXT_texture_filter_anisotropic\r\n\r\nstatic void _glewInfo_GL_EXT_texture_filter_anisotropic (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_texture_filter_anisotropic\", GLEW_EXT_texture_filter_anisotropic, glewIsSupported(\"GL_EXT_texture_filter_anisotropic\"), glewGetExtension(\"GL_EXT_texture_filter_anisotropic\"));\r\n}\r\n\r\n#endif /* GL_EXT_texture_filter_anisotropic */\r\n\r\n#ifdef GL_EXT_texture_integer\r\n\r\nstatic void _glewInfo_GL_EXT_texture_integer (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_texture_integer\", GLEW_EXT_texture_integer, glewIsSupported(\"GL_EXT_texture_integer\"), glewGetExtension(\"GL_EXT_texture_integer\"));\r\n\r\n  glewInfoFunc(\"glClearColorIiEXT\", glClearColorIiEXT == NULL);\r\n  glewInfoFunc(\"glClearColorIuiEXT\", glClearColorIuiEXT == NULL);\r\n  glewInfoFunc(\"glGetTexParameterIivEXT\", glGetTexParameterIivEXT == NULL);\r\n  glewInfoFunc(\"glGetTexParameterIuivEXT\", glGetTexParameterIuivEXT == NULL);\r\n  glewInfoFunc(\"glTexParameterIivEXT\", glTexParameterIivEXT == NULL);\r\n  glewInfoFunc(\"glTexParameterIuivEXT\", glTexParameterIuivEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_texture_integer */\r\n\r\n#ifdef GL_EXT_texture_lod_bias\r\n\r\nstatic void _glewInfo_GL_EXT_texture_lod_bias (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_texture_lod_bias\", GLEW_EXT_texture_lod_bias, glewIsSupported(\"GL_EXT_texture_lod_bias\"), glewGetExtension(\"GL_EXT_texture_lod_bias\"));\r\n}\r\n\r\n#endif /* GL_EXT_texture_lod_bias */\r\n\r\n#ifdef GL_EXT_texture_mirror_clamp\r\n\r\nstatic void _glewInfo_GL_EXT_texture_mirror_clamp (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_texture_mirror_clamp\", GLEW_EXT_texture_mirror_clamp, glewIsSupported(\"GL_EXT_texture_mirror_clamp\"), glewGetExtension(\"GL_EXT_texture_mirror_clamp\"));\r\n}\r\n\r\n#endif /* GL_EXT_texture_mirror_clamp */\r\n\r\n#ifdef GL_EXT_texture_object\r\n\r\nstatic void _glewInfo_GL_EXT_texture_object (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_texture_object\", GLEW_EXT_texture_object, glewIsSupported(\"GL_EXT_texture_object\"), glewGetExtension(\"GL_EXT_texture_object\"));\r\n\r\n  glewInfoFunc(\"glAreTexturesResidentEXT\", glAreTexturesResidentEXT == NULL);\r\n  glewInfoFunc(\"glBindTextureEXT\", glBindTextureEXT == NULL);\r\n  glewInfoFunc(\"glDeleteTexturesEXT\", glDeleteTexturesEXT == NULL);\r\n  glewInfoFunc(\"glGenTexturesEXT\", glGenTexturesEXT == NULL);\r\n  glewInfoFunc(\"glIsTextureEXT\", glIsTextureEXT == NULL);\r\n  glewInfoFunc(\"glPrioritizeTexturesEXT\", glPrioritizeTexturesEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_texture_object */\r\n\r\n#ifdef GL_EXT_texture_perturb_normal\r\n\r\nstatic void _glewInfo_GL_EXT_texture_perturb_normal (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_texture_perturb_normal\", GLEW_EXT_texture_perturb_normal, glewIsSupported(\"GL_EXT_texture_perturb_normal\"), glewGetExtension(\"GL_EXT_texture_perturb_normal\"));\r\n\r\n  glewInfoFunc(\"glTextureNormalEXT\", glTextureNormalEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_texture_perturb_normal */\r\n\r\n#ifdef GL_EXT_texture_rectangle\r\n\r\nstatic void _glewInfo_GL_EXT_texture_rectangle (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_texture_rectangle\", GLEW_EXT_texture_rectangle, glewIsSupported(\"GL_EXT_texture_rectangle\"), glewGetExtension(\"GL_EXT_texture_rectangle\"));\r\n}\r\n\r\n#endif /* GL_EXT_texture_rectangle */\r\n\r\n#ifdef GL_EXT_texture_sRGB\r\n\r\nstatic void _glewInfo_GL_EXT_texture_sRGB (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_texture_sRGB\", GLEW_EXT_texture_sRGB, glewIsSupported(\"GL_EXT_texture_sRGB\"), glewGetExtension(\"GL_EXT_texture_sRGB\"));\r\n}\r\n\r\n#endif /* GL_EXT_texture_sRGB */\r\n\r\n#ifdef GL_EXT_texture_shared_exponent\r\n\r\nstatic void _glewInfo_GL_EXT_texture_shared_exponent (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_texture_shared_exponent\", GLEW_EXT_texture_shared_exponent, glewIsSupported(\"GL_EXT_texture_shared_exponent\"), glewGetExtension(\"GL_EXT_texture_shared_exponent\"));\r\n}\r\n\r\n#endif /* GL_EXT_texture_shared_exponent */\r\n\r\n#ifdef GL_EXT_texture_snorm\r\n\r\nstatic void _glewInfo_GL_EXT_texture_snorm (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_texture_snorm\", GLEW_EXT_texture_snorm, glewIsSupported(\"GL_EXT_texture_snorm\"), glewGetExtension(\"GL_EXT_texture_snorm\"));\r\n}\r\n\r\n#endif /* GL_EXT_texture_snorm */\r\n\r\n#ifdef GL_EXT_texture_swizzle\r\n\r\nstatic void _glewInfo_GL_EXT_texture_swizzle (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_texture_swizzle\", GLEW_EXT_texture_swizzle, glewIsSupported(\"GL_EXT_texture_swizzle\"), glewGetExtension(\"GL_EXT_texture_swizzle\"));\r\n}\r\n\r\n#endif /* GL_EXT_texture_swizzle */\r\n\r\n#ifdef GL_EXT_timer_query\r\n\r\nstatic void _glewInfo_GL_EXT_timer_query (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_timer_query\", GLEW_EXT_timer_query, glewIsSupported(\"GL_EXT_timer_query\"), glewGetExtension(\"GL_EXT_timer_query\"));\r\n\r\n  glewInfoFunc(\"glGetQueryObjecti64vEXT\", glGetQueryObjecti64vEXT == NULL);\r\n  glewInfoFunc(\"glGetQueryObjectui64vEXT\", glGetQueryObjectui64vEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_timer_query */\r\n\r\n#ifdef GL_EXT_transform_feedback\r\n\r\nstatic void _glewInfo_GL_EXT_transform_feedback (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_transform_feedback\", GLEW_EXT_transform_feedback, glewIsSupported(\"GL_EXT_transform_feedback\"), glewGetExtension(\"GL_EXT_transform_feedback\"));\r\n\r\n  glewInfoFunc(\"glBeginTransformFeedbackEXT\", glBeginTransformFeedbackEXT == NULL);\r\n  glewInfoFunc(\"glBindBufferBaseEXT\", glBindBufferBaseEXT == NULL);\r\n  glewInfoFunc(\"glBindBufferOffsetEXT\", glBindBufferOffsetEXT == NULL);\r\n  glewInfoFunc(\"glBindBufferRangeEXT\", glBindBufferRangeEXT == NULL);\r\n  glewInfoFunc(\"glEndTransformFeedbackEXT\", glEndTransformFeedbackEXT == NULL);\r\n  glewInfoFunc(\"glGetTransformFeedbackVaryingEXT\", glGetTransformFeedbackVaryingEXT == NULL);\r\n  glewInfoFunc(\"glTransformFeedbackVaryingsEXT\", glTransformFeedbackVaryingsEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_transform_feedback */\r\n\r\n#ifdef GL_EXT_vertex_array\r\n\r\nstatic void _glewInfo_GL_EXT_vertex_array (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_vertex_array\", GLEW_EXT_vertex_array, glewIsSupported(\"GL_EXT_vertex_array\"), glewGetExtension(\"GL_EXT_vertex_array\"));\r\n\r\n  glewInfoFunc(\"glArrayElementEXT\", glArrayElementEXT == NULL);\r\n  glewInfoFunc(\"glColorPointerEXT\", glColorPointerEXT == NULL);\r\n  glewInfoFunc(\"glDrawArraysEXT\", glDrawArraysEXT == NULL);\r\n  glewInfoFunc(\"glEdgeFlagPointerEXT\", glEdgeFlagPointerEXT == NULL);\r\n  glewInfoFunc(\"glGetPointervEXT\", glGetPointervEXT == NULL);\r\n  glewInfoFunc(\"glIndexPointerEXT\", glIndexPointerEXT == NULL);\r\n  glewInfoFunc(\"glNormalPointerEXT\", glNormalPointerEXT == NULL);\r\n  glewInfoFunc(\"glTexCoordPointerEXT\", glTexCoordPointerEXT == NULL);\r\n  glewInfoFunc(\"glVertexPointerEXT\", glVertexPointerEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_vertex_array */\r\n\r\n#ifdef GL_EXT_vertex_array_bgra\r\n\r\nstatic void _glewInfo_GL_EXT_vertex_array_bgra (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_vertex_array_bgra\", GLEW_EXT_vertex_array_bgra, glewIsSupported(\"GL_EXT_vertex_array_bgra\"), glewGetExtension(\"GL_EXT_vertex_array_bgra\"));\r\n}\r\n\r\n#endif /* GL_EXT_vertex_array_bgra */\r\n\r\n#ifdef GL_EXT_vertex_shader\r\n\r\nstatic void _glewInfo_GL_EXT_vertex_shader (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_vertex_shader\", GLEW_EXT_vertex_shader, glewIsSupported(\"GL_EXT_vertex_shader\"), glewGetExtension(\"GL_EXT_vertex_shader\"));\r\n\r\n  glewInfoFunc(\"glBeginVertexShaderEXT\", glBeginVertexShaderEXT == NULL);\r\n  glewInfoFunc(\"glBindLightParameterEXT\", glBindLightParameterEXT == NULL);\r\n  glewInfoFunc(\"glBindMaterialParameterEXT\", glBindMaterialParameterEXT == NULL);\r\n  glewInfoFunc(\"glBindParameterEXT\", glBindParameterEXT == NULL);\r\n  glewInfoFunc(\"glBindTexGenParameterEXT\", glBindTexGenParameterEXT == NULL);\r\n  glewInfoFunc(\"glBindTextureUnitParameterEXT\", glBindTextureUnitParameterEXT == NULL);\r\n  glewInfoFunc(\"glBindVertexShaderEXT\", glBindVertexShaderEXT == NULL);\r\n  glewInfoFunc(\"glDeleteVertexShaderEXT\", glDeleteVertexShaderEXT == NULL);\r\n  glewInfoFunc(\"glDisableVariantClientStateEXT\", glDisableVariantClientStateEXT == NULL);\r\n  glewInfoFunc(\"glEnableVariantClientStateEXT\", glEnableVariantClientStateEXT == NULL);\r\n  glewInfoFunc(\"glEndVertexShaderEXT\", glEndVertexShaderEXT == NULL);\r\n  glewInfoFunc(\"glExtractComponentEXT\", glExtractComponentEXT == NULL);\r\n  glewInfoFunc(\"glGenSymbolsEXT\", glGenSymbolsEXT == NULL);\r\n  glewInfoFunc(\"glGenVertexShadersEXT\", glGenVertexShadersEXT == NULL);\r\n  glewInfoFunc(\"glGetInvariantBooleanvEXT\", glGetInvariantBooleanvEXT == NULL);\r\n  glewInfoFunc(\"glGetInvariantFloatvEXT\", glGetInvariantFloatvEXT == NULL);\r\n  glewInfoFunc(\"glGetInvariantIntegervEXT\", glGetInvariantIntegervEXT == NULL);\r\n  glewInfoFunc(\"glGetLocalConstantBooleanvEXT\", glGetLocalConstantBooleanvEXT == NULL);\r\n  glewInfoFunc(\"glGetLocalConstantFloatvEXT\", glGetLocalConstantFloatvEXT == NULL);\r\n  glewInfoFunc(\"glGetLocalConstantIntegervEXT\", glGetLocalConstantIntegervEXT == NULL);\r\n  glewInfoFunc(\"glGetVariantBooleanvEXT\", glGetVariantBooleanvEXT == NULL);\r\n  glewInfoFunc(\"glGetVariantFloatvEXT\", glGetVariantFloatvEXT == NULL);\r\n  glewInfoFunc(\"glGetVariantIntegervEXT\", glGetVariantIntegervEXT == NULL);\r\n  glewInfoFunc(\"glGetVariantPointervEXT\", glGetVariantPointervEXT == NULL);\r\n  glewInfoFunc(\"glInsertComponentEXT\", glInsertComponentEXT == NULL);\r\n  glewInfoFunc(\"glIsVariantEnabledEXT\", glIsVariantEnabledEXT == NULL);\r\n  glewInfoFunc(\"glSetInvariantEXT\", glSetInvariantEXT == NULL);\r\n  glewInfoFunc(\"glSetLocalConstantEXT\", glSetLocalConstantEXT == NULL);\r\n  glewInfoFunc(\"glShaderOp1EXT\", glShaderOp1EXT == NULL);\r\n  glewInfoFunc(\"glShaderOp2EXT\", glShaderOp2EXT == NULL);\r\n  glewInfoFunc(\"glShaderOp3EXT\", glShaderOp3EXT == NULL);\r\n  glewInfoFunc(\"glSwizzleEXT\", glSwizzleEXT == NULL);\r\n  glewInfoFunc(\"glVariantPointerEXT\", glVariantPointerEXT == NULL);\r\n  glewInfoFunc(\"glVariantbvEXT\", glVariantbvEXT == NULL);\r\n  glewInfoFunc(\"glVariantdvEXT\", glVariantdvEXT == NULL);\r\n  glewInfoFunc(\"glVariantfvEXT\", glVariantfvEXT == NULL);\r\n  glewInfoFunc(\"glVariantivEXT\", glVariantivEXT == NULL);\r\n  glewInfoFunc(\"glVariantsvEXT\", glVariantsvEXT == NULL);\r\n  glewInfoFunc(\"glVariantubvEXT\", glVariantubvEXT == NULL);\r\n  glewInfoFunc(\"glVariantuivEXT\", glVariantuivEXT == NULL);\r\n  glewInfoFunc(\"glVariantusvEXT\", glVariantusvEXT == NULL);\r\n  glewInfoFunc(\"glWriteMaskEXT\", glWriteMaskEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_vertex_shader */\r\n\r\n#ifdef GL_EXT_vertex_weighting\r\n\r\nstatic void _glewInfo_GL_EXT_vertex_weighting (void)\r\n{\r\n  glewPrintExt(\"GL_EXT_vertex_weighting\", GLEW_EXT_vertex_weighting, glewIsSupported(\"GL_EXT_vertex_weighting\"), glewGetExtension(\"GL_EXT_vertex_weighting\"));\r\n\r\n  glewInfoFunc(\"glVertexWeightPointerEXT\", glVertexWeightPointerEXT == NULL);\r\n  glewInfoFunc(\"glVertexWeightfEXT\", glVertexWeightfEXT == NULL);\r\n  glewInfoFunc(\"glVertexWeightfvEXT\", glVertexWeightfvEXT == NULL);\r\n}\r\n\r\n#endif /* GL_EXT_vertex_weighting */\r\n\r\n#ifdef GL_GREMEDY_frame_terminator\r\n\r\nstatic void _glewInfo_GL_GREMEDY_frame_terminator (void)\r\n{\r\n  glewPrintExt(\"GL_GREMEDY_frame_terminator\", GLEW_GREMEDY_frame_terminator, glewIsSupported(\"GL_GREMEDY_frame_terminator\"), glewGetExtension(\"GL_GREMEDY_frame_terminator\"));\r\n\r\n  glewInfoFunc(\"glFrameTerminatorGREMEDY\", glFrameTerminatorGREMEDY == NULL);\r\n}\r\n\r\n#endif /* GL_GREMEDY_frame_terminator */\r\n\r\n#ifdef GL_GREMEDY_string_marker\r\n\r\nstatic void _glewInfo_GL_GREMEDY_string_marker (void)\r\n{\r\n  glewPrintExt(\"GL_GREMEDY_string_marker\", GLEW_GREMEDY_string_marker, glewIsSupported(\"GL_GREMEDY_string_marker\"), glewGetExtension(\"GL_GREMEDY_string_marker\"));\r\n\r\n  glewInfoFunc(\"glStringMarkerGREMEDY\", glStringMarkerGREMEDY == NULL);\r\n}\r\n\r\n#endif /* GL_GREMEDY_string_marker */\r\n\r\n#ifdef GL_HP_convolution_border_modes\r\n\r\nstatic void _glewInfo_GL_HP_convolution_border_modes (void)\r\n{\r\n  glewPrintExt(\"GL_HP_convolution_border_modes\", GLEW_HP_convolution_border_modes, glewIsSupported(\"GL_HP_convolution_border_modes\"), glewGetExtension(\"GL_HP_convolution_border_modes\"));\r\n}\r\n\r\n#endif /* GL_HP_convolution_border_modes */\r\n\r\n#ifdef GL_HP_image_transform\r\n\r\nstatic void _glewInfo_GL_HP_image_transform (void)\r\n{\r\n  glewPrintExt(\"GL_HP_image_transform\", GLEW_HP_image_transform, glewIsSupported(\"GL_HP_image_transform\"), glewGetExtension(\"GL_HP_image_transform\"));\r\n\r\n  glewInfoFunc(\"glGetImageTransformParameterfvHP\", glGetImageTransformParameterfvHP == NULL);\r\n  glewInfoFunc(\"glGetImageTransformParameterivHP\", glGetImageTransformParameterivHP == NULL);\r\n  glewInfoFunc(\"glImageTransformParameterfHP\", glImageTransformParameterfHP == NULL);\r\n  glewInfoFunc(\"glImageTransformParameterfvHP\", glImageTransformParameterfvHP == NULL);\r\n  glewInfoFunc(\"glImageTransformParameteriHP\", glImageTransformParameteriHP == NULL);\r\n  glewInfoFunc(\"glImageTransformParameterivHP\", glImageTransformParameterivHP == NULL);\r\n}\r\n\r\n#endif /* GL_HP_image_transform */\r\n\r\n#ifdef GL_HP_occlusion_test\r\n\r\nstatic void _glewInfo_GL_HP_occlusion_test (void)\r\n{\r\n  glewPrintExt(\"GL_HP_occlusion_test\", GLEW_HP_occlusion_test, glewIsSupported(\"GL_HP_occlusion_test\"), glewGetExtension(\"GL_HP_occlusion_test\"));\r\n}\r\n\r\n#endif /* GL_HP_occlusion_test */\r\n\r\n#ifdef GL_HP_texture_lighting\r\n\r\nstatic void _glewInfo_GL_HP_texture_lighting (void)\r\n{\r\n  glewPrintExt(\"GL_HP_texture_lighting\", GLEW_HP_texture_lighting, glewIsSupported(\"GL_HP_texture_lighting\"), glewGetExtension(\"GL_HP_texture_lighting\"));\r\n}\r\n\r\n#endif /* GL_HP_texture_lighting */\r\n\r\n#ifdef GL_IBM_cull_vertex\r\n\r\nstatic void _glewInfo_GL_IBM_cull_vertex (void)\r\n{\r\n  glewPrintExt(\"GL_IBM_cull_vertex\", GLEW_IBM_cull_vertex, glewIsSupported(\"GL_IBM_cull_vertex\"), glewGetExtension(\"GL_IBM_cull_vertex\"));\r\n}\r\n\r\n#endif /* GL_IBM_cull_vertex */\r\n\r\n#ifdef GL_IBM_multimode_draw_arrays\r\n\r\nstatic void _glewInfo_GL_IBM_multimode_draw_arrays (void)\r\n{\r\n  glewPrintExt(\"GL_IBM_multimode_draw_arrays\", GLEW_IBM_multimode_draw_arrays, glewIsSupported(\"GL_IBM_multimode_draw_arrays\"), glewGetExtension(\"GL_IBM_multimode_draw_arrays\"));\r\n\r\n  glewInfoFunc(\"glMultiModeDrawArraysIBM\", glMultiModeDrawArraysIBM == NULL);\r\n  glewInfoFunc(\"glMultiModeDrawElementsIBM\", glMultiModeDrawElementsIBM == NULL);\r\n}\r\n\r\n#endif /* GL_IBM_multimode_draw_arrays */\r\n\r\n#ifdef GL_IBM_rasterpos_clip\r\n\r\nstatic void _glewInfo_GL_IBM_rasterpos_clip (void)\r\n{\r\n  glewPrintExt(\"GL_IBM_rasterpos_clip\", GLEW_IBM_rasterpos_clip, glewIsSupported(\"GL_IBM_rasterpos_clip\"), glewGetExtension(\"GL_IBM_rasterpos_clip\"));\r\n}\r\n\r\n#endif /* GL_IBM_rasterpos_clip */\r\n\r\n#ifdef GL_IBM_static_data\r\n\r\nstatic void _glewInfo_GL_IBM_static_data (void)\r\n{\r\n  glewPrintExt(\"GL_IBM_static_data\", GLEW_IBM_static_data, glewIsSupported(\"GL_IBM_static_data\"), glewGetExtension(\"GL_IBM_static_data\"));\r\n}\r\n\r\n#endif /* GL_IBM_static_data */\r\n\r\n#ifdef GL_IBM_texture_mirrored_repeat\r\n\r\nstatic void _glewInfo_GL_IBM_texture_mirrored_repeat (void)\r\n{\r\n  glewPrintExt(\"GL_IBM_texture_mirrored_repeat\", GLEW_IBM_texture_mirrored_repeat, glewIsSupported(\"GL_IBM_texture_mirrored_repeat\"), glewGetExtension(\"GL_IBM_texture_mirrored_repeat\"));\r\n}\r\n\r\n#endif /* GL_IBM_texture_mirrored_repeat */\r\n\r\n#ifdef GL_IBM_vertex_array_lists\r\n\r\nstatic void _glewInfo_GL_IBM_vertex_array_lists (void)\r\n{\r\n  glewPrintExt(\"GL_IBM_vertex_array_lists\", GLEW_IBM_vertex_array_lists, glewIsSupported(\"GL_IBM_vertex_array_lists\"), glewGetExtension(\"GL_IBM_vertex_array_lists\"));\r\n\r\n  glewInfoFunc(\"glColorPointerListIBM\", glColorPointerListIBM == NULL);\r\n  glewInfoFunc(\"glEdgeFlagPointerListIBM\", glEdgeFlagPointerListIBM == NULL);\r\n  glewInfoFunc(\"glFogCoordPointerListIBM\", glFogCoordPointerListIBM == NULL);\r\n  glewInfoFunc(\"glIndexPointerListIBM\", glIndexPointerListIBM == NULL);\r\n  glewInfoFunc(\"glNormalPointerListIBM\", glNormalPointerListIBM == NULL);\r\n  glewInfoFunc(\"glSecondaryColorPointerListIBM\", glSecondaryColorPointerListIBM == NULL);\r\n  glewInfoFunc(\"glTexCoordPointerListIBM\", glTexCoordPointerListIBM == NULL);\r\n  glewInfoFunc(\"glVertexPointerListIBM\", glVertexPointerListIBM == NULL);\r\n}\r\n\r\n#endif /* GL_IBM_vertex_array_lists */\r\n\r\n#ifdef GL_INGR_color_clamp\r\n\r\nstatic void _glewInfo_GL_INGR_color_clamp (void)\r\n{\r\n  glewPrintExt(\"GL_INGR_color_clamp\", GLEW_INGR_color_clamp, glewIsSupported(\"GL_INGR_color_clamp\"), glewGetExtension(\"GL_INGR_color_clamp\"));\r\n}\r\n\r\n#endif /* GL_INGR_color_clamp */\r\n\r\n#ifdef GL_INGR_interlace_read\r\n\r\nstatic void _glewInfo_GL_INGR_interlace_read (void)\r\n{\r\n  glewPrintExt(\"GL_INGR_interlace_read\", GLEW_INGR_interlace_read, glewIsSupported(\"GL_INGR_interlace_read\"), glewGetExtension(\"GL_INGR_interlace_read\"));\r\n}\r\n\r\n#endif /* GL_INGR_interlace_read */\r\n\r\n#ifdef GL_INTEL_parallel_arrays\r\n\r\nstatic void _glewInfo_GL_INTEL_parallel_arrays (void)\r\n{\r\n  glewPrintExt(\"GL_INTEL_parallel_arrays\", GLEW_INTEL_parallel_arrays, glewIsSupported(\"GL_INTEL_parallel_arrays\"), glewGetExtension(\"GL_INTEL_parallel_arrays\"));\r\n\r\n  glewInfoFunc(\"glColorPointervINTEL\", glColorPointervINTEL == NULL);\r\n  glewInfoFunc(\"glNormalPointervINTEL\", glNormalPointervINTEL == NULL);\r\n  glewInfoFunc(\"glTexCoordPointervINTEL\", glTexCoordPointervINTEL == NULL);\r\n  glewInfoFunc(\"glVertexPointervINTEL\", glVertexPointervINTEL == NULL);\r\n}\r\n\r\n#endif /* GL_INTEL_parallel_arrays */\r\n\r\n#ifdef GL_INTEL_texture_scissor\r\n\r\nstatic void _glewInfo_GL_INTEL_texture_scissor (void)\r\n{\r\n  glewPrintExt(\"GL_INTEL_texture_scissor\", GLEW_INTEL_texture_scissor, glewIsSupported(\"GL_INTEL_texture_scissor\"), glewGetExtension(\"GL_INTEL_texture_scissor\"));\r\n\r\n  glewInfoFunc(\"glTexScissorFuncINTEL\", glTexScissorFuncINTEL == NULL);\r\n  glewInfoFunc(\"glTexScissorINTEL\", glTexScissorINTEL == NULL);\r\n}\r\n\r\n#endif /* GL_INTEL_texture_scissor */\r\n\r\n#ifdef GL_KTX_buffer_region\r\n\r\nstatic void _glewInfo_GL_KTX_buffer_region (void)\r\n{\r\n  glewPrintExt(\"GL_KTX_buffer_region\", GLEW_KTX_buffer_region, glewIsSupported(\"GL_KTX_buffer_region\"), glewGetExtension(\"GL_KTX_buffer_region\"));\r\n\r\n  glewInfoFunc(\"glBufferRegionEnabledEXT\", glBufferRegionEnabledEXT == NULL);\r\n  glewInfoFunc(\"glDeleteBufferRegionEXT\", glDeleteBufferRegionEXT == NULL);\r\n  glewInfoFunc(\"glDrawBufferRegionEXT\", glDrawBufferRegionEXT == NULL);\r\n  glewInfoFunc(\"glNewBufferRegionEXT\", glNewBufferRegionEXT == NULL);\r\n  glewInfoFunc(\"glReadBufferRegionEXT\", glReadBufferRegionEXT == NULL);\r\n}\r\n\r\n#endif /* GL_KTX_buffer_region */\r\n\r\n#ifdef GL_MESAX_texture_stack\r\n\r\nstatic void _glewInfo_GL_MESAX_texture_stack (void)\r\n{\r\n  glewPrintExt(\"GL_MESAX_texture_stack\", GLEW_MESAX_texture_stack, glewIsSupported(\"GL_MESAX_texture_stack\"), glewGetExtension(\"GL_MESAX_texture_stack\"));\r\n}\r\n\r\n#endif /* GL_MESAX_texture_stack */\r\n\r\n#ifdef GL_MESA_pack_invert\r\n\r\nstatic void _glewInfo_GL_MESA_pack_invert (void)\r\n{\r\n  glewPrintExt(\"GL_MESA_pack_invert\", GLEW_MESA_pack_invert, glewIsSupported(\"GL_MESA_pack_invert\"), glewGetExtension(\"GL_MESA_pack_invert\"));\r\n}\r\n\r\n#endif /* GL_MESA_pack_invert */\r\n\r\n#ifdef GL_MESA_resize_buffers\r\n\r\nstatic void _glewInfo_GL_MESA_resize_buffers (void)\r\n{\r\n  glewPrintExt(\"GL_MESA_resize_buffers\", GLEW_MESA_resize_buffers, glewIsSupported(\"GL_MESA_resize_buffers\"), glewGetExtension(\"GL_MESA_resize_buffers\"));\r\n\r\n  glewInfoFunc(\"glResizeBuffersMESA\", glResizeBuffersMESA == NULL);\r\n}\r\n\r\n#endif /* GL_MESA_resize_buffers */\r\n\r\n#ifdef GL_MESA_window_pos\r\n\r\nstatic void _glewInfo_GL_MESA_window_pos (void)\r\n{\r\n  glewPrintExt(\"GL_MESA_window_pos\", GLEW_MESA_window_pos, glewIsSupported(\"GL_MESA_window_pos\"), glewGetExtension(\"GL_MESA_window_pos\"));\r\n\r\n  glewInfoFunc(\"glWindowPos2dMESA\", glWindowPos2dMESA == NULL);\r\n  glewInfoFunc(\"glWindowPos2dvMESA\", glWindowPos2dvMESA == NULL);\r\n  glewInfoFunc(\"glWindowPos2fMESA\", glWindowPos2fMESA == NULL);\r\n  glewInfoFunc(\"glWindowPos2fvMESA\", glWindowPos2fvMESA == NULL);\r\n  glewInfoFunc(\"glWindowPos2iMESA\", glWindowPos2iMESA == NULL);\r\n  glewInfoFunc(\"glWindowPos2ivMESA\", glWindowPos2ivMESA == NULL);\r\n  glewInfoFunc(\"glWindowPos2sMESA\", glWindowPos2sMESA == NULL);\r\n  glewInfoFunc(\"glWindowPos2svMESA\", glWindowPos2svMESA == NULL);\r\n  glewInfoFunc(\"glWindowPos3dMESA\", glWindowPos3dMESA == NULL);\r\n  glewInfoFunc(\"glWindowPos3dvMESA\", glWindowPos3dvMESA == NULL);\r\n  glewInfoFunc(\"glWindowPos3fMESA\", glWindowPos3fMESA == NULL);\r\n  glewInfoFunc(\"glWindowPos3fvMESA\", glWindowPos3fvMESA == NULL);\r\n  glewInfoFunc(\"glWindowPos3iMESA\", glWindowPos3iMESA == NULL);\r\n  glewInfoFunc(\"glWindowPos3ivMESA\", glWindowPos3ivMESA == NULL);\r\n  glewInfoFunc(\"glWindowPos3sMESA\", glWindowPos3sMESA == NULL);\r\n  glewInfoFunc(\"glWindowPos3svMESA\", glWindowPos3svMESA == NULL);\r\n  glewInfoFunc(\"glWindowPos4dMESA\", glWindowPos4dMESA == NULL);\r\n  glewInfoFunc(\"glWindowPos4dvMESA\", glWindowPos4dvMESA == NULL);\r\n  glewInfoFunc(\"glWindowPos4fMESA\", glWindowPos4fMESA == NULL);\r\n  glewInfoFunc(\"glWindowPos4fvMESA\", glWindowPos4fvMESA == NULL);\r\n  glewInfoFunc(\"glWindowPos4iMESA\", glWindowPos4iMESA == NULL);\r\n  glewInfoFunc(\"glWindowPos4ivMESA\", glWindowPos4ivMESA == NULL);\r\n  glewInfoFunc(\"glWindowPos4sMESA\", glWindowPos4sMESA == NULL);\r\n  glewInfoFunc(\"glWindowPos4svMESA\", glWindowPos4svMESA == NULL);\r\n}\r\n\r\n#endif /* GL_MESA_window_pos */\r\n\r\n#ifdef GL_MESA_ycbcr_texture\r\n\r\nstatic void _glewInfo_GL_MESA_ycbcr_texture (void)\r\n{\r\n  glewPrintExt(\"GL_MESA_ycbcr_texture\", GLEW_MESA_ycbcr_texture, glewIsSupported(\"GL_MESA_ycbcr_texture\"), glewGetExtension(\"GL_MESA_ycbcr_texture\"));\r\n}\r\n\r\n#endif /* GL_MESA_ycbcr_texture */\r\n\r\n#ifdef GL_NV_blend_square\r\n\r\nstatic void _glewInfo_GL_NV_blend_square (void)\r\n{\r\n  glewPrintExt(\"GL_NV_blend_square\", GLEW_NV_blend_square, glewIsSupported(\"GL_NV_blend_square\"), glewGetExtension(\"GL_NV_blend_square\"));\r\n}\r\n\r\n#endif /* GL_NV_blend_square */\r\n\r\n#ifdef GL_NV_conditional_render\r\n\r\nstatic void _glewInfo_GL_NV_conditional_render (void)\r\n{\r\n  glewPrintExt(\"GL_NV_conditional_render\", GLEW_NV_conditional_render, glewIsSupported(\"GL_NV_conditional_render\"), glewGetExtension(\"GL_NV_conditional_render\"));\r\n\r\n  glewInfoFunc(\"glBeginConditionalRenderNV\", glBeginConditionalRenderNV == NULL);\r\n  glewInfoFunc(\"glEndConditionalRenderNV\", glEndConditionalRenderNV == NULL);\r\n}\r\n\r\n#endif /* GL_NV_conditional_render */\r\n\r\n#ifdef GL_NV_copy_depth_to_color\r\n\r\nstatic void _glewInfo_GL_NV_copy_depth_to_color (void)\r\n{\r\n  glewPrintExt(\"GL_NV_copy_depth_to_color\", GLEW_NV_copy_depth_to_color, glewIsSupported(\"GL_NV_copy_depth_to_color\"), glewGetExtension(\"GL_NV_copy_depth_to_color\"));\r\n}\r\n\r\n#endif /* GL_NV_copy_depth_to_color */\r\n\r\n#ifdef GL_NV_copy_image\r\n\r\nstatic void _glewInfo_GL_NV_copy_image (void)\r\n{\r\n  glewPrintExt(\"GL_NV_copy_image\", GLEW_NV_copy_image, glewIsSupported(\"GL_NV_copy_image\"), glewGetExtension(\"GL_NV_copy_image\"));\r\n\r\n  glewInfoFunc(\"glCopyImageSubDataNV\", glCopyImageSubDataNV == NULL);\r\n}\r\n\r\n#endif /* GL_NV_copy_image */\r\n\r\n#ifdef GL_NV_depth_buffer_float\r\n\r\nstatic void _glewInfo_GL_NV_depth_buffer_float (void)\r\n{\r\n  glewPrintExt(\"GL_NV_depth_buffer_float\", GLEW_NV_depth_buffer_float, glewIsSupported(\"GL_NV_depth_buffer_float\"), glewGetExtension(\"GL_NV_depth_buffer_float\"));\r\n\r\n  glewInfoFunc(\"glClearDepthdNV\", glClearDepthdNV == NULL);\r\n  glewInfoFunc(\"glDepthBoundsdNV\", glDepthBoundsdNV == NULL);\r\n  glewInfoFunc(\"glDepthRangedNV\", glDepthRangedNV == NULL);\r\n}\r\n\r\n#endif /* GL_NV_depth_buffer_float */\r\n\r\n#ifdef GL_NV_depth_clamp\r\n\r\nstatic void _glewInfo_GL_NV_depth_clamp (void)\r\n{\r\n  glewPrintExt(\"GL_NV_depth_clamp\", GLEW_NV_depth_clamp, glewIsSupported(\"GL_NV_depth_clamp\"), glewGetExtension(\"GL_NV_depth_clamp\"));\r\n}\r\n\r\n#endif /* GL_NV_depth_clamp */\r\n\r\n#ifdef GL_NV_depth_range_unclamped\r\n\r\nstatic void _glewInfo_GL_NV_depth_range_unclamped (void)\r\n{\r\n  glewPrintExt(\"GL_NV_depth_range_unclamped\", GLEW_NV_depth_range_unclamped, glewIsSupported(\"GL_NV_depth_range_unclamped\"), glewGetExtension(\"GL_NV_depth_range_unclamped\"));\r\n}\r\n\r\n#endif /* GL_NV_depth_range_unclamped */\r\n\r\n#ifdef GL_NV_evaluators\r\n\r\nstatic void _glewInfo_GL_NV_evaluators (void)\r\n{\r\n  glewPrintExt(\"GL_NV_evaluators\", GLEW_NV_evaluators, glewIsSupported(\"GL_NV_evaluators\"), glewGetExtension(\"GL_NV_evaluators\"));\r\n\r\n  glewInfoFunc(\"glEvalMapsNV\", glEvalMapsNV == NULL);\r\n  glewInfoFunc(\"glGetMapAttribParameterfvNV\", glGetMapAttribParameterfvNV == NULL);\r\n  glewInfoFunc(\"glGetMapAttribParameterivNV\", glGetMapAttribParameterivNV == NULL);\r\n  glewInfoFunc(\"glGetMapControlPointsNV\", glGetMapControlPointsNV == NULL);\r\n  glewInfoFunc(\"glGetMapParameterfvNV\", glGetMapParameterfvNV == NULL);\r\n  glewInfoFunc(\"glGetMapParameterivNV\", glGetMapParameterivNV == NULL);\r\n  glewInfoFunc(\"glMapControlPointsNV\", glMapControlPointsNV == NULL);\r\n  glewInfoFunc(\"glMapParameterfvNV\", glMapParameterfvNV == NULL);\r\n  glewInfoFunc(\"glMapParameterivNV\", glMapParameterivNV == NULL);\r\n}\r\n\r\n#endif /* GL_NV_evaluators */\r\n\r\n#ifdef GL_NV_explicit_multisample\r\n\r\nstatic void _glewInfo_GL_NV_explicit_multisample (void)\r\n{\r\n  glewPrintExt(\"GL_NV_explicit_multisample\", GLEW_NV_explicit_multisample, glewIsSupported(\"GL_NV_explicit_multisample\"), glewGetExtension(\"GL_NV_explicit_multisample\"));\r\n\r\n  glewInfoFunc(\"glGetMultisamplefvNV\", glGetMultisamplefvNV == NULL);\r\n  glewInfoFunc(\"glSampleMaskIndexedNV\", glSampleMaskIndexedNV == NULL);\r\n  glewInfoFunc(\"glTexRenderbufferNV\", glTexRenderbufferNV == NULL);\r\n}\r\n\r\n#endif /* GL_NV_explicit_multisample */\r\n\r\n#ifdef GL_NV_fence\r\n\r\nstatic void _glewInfo_GL_NV_fence (void)\r\n{\r\n  glewPrintExt(\"GL_NV_fence\", GLEW_NV_fence, glewIsSupported(\"GL_NV_fence\"), glewGetExtension(\"GL_NV_fence\"));\r\n\r\n  glewInfoFunc(\"glDeleteFencesNV\", glDeleteFencesNV == NULL);\r\n  glewInfoFunc(\"glFinishFenceNV\", glFinishFenceNV == NULL);\r\n  glewInfoFunc(\"glGenFencesNV\", glGenFencesNV == NULL);\r\n  glewInfoFunc(\"glGetFenceivNV\", glGetFenceivNV == NULL);\r\n  glewInfoFunc(\"glIsFenceNV\", glIsFenceNV == NULL);\r\n  glewInfoFunc(\"glSetFenceNV\", glSetFenceNV == NULL);\r\n  glewInfoFunc(\"glTestFenceNV\", glTestFenceNV == NULL);\r\n}\r\n\r\n#endif /* GL_NV_fence */\r\n\r\n#ifdef GL_NV_float_buffer\r\n\r\nstatic void _glewInfo_GL_NV_float_buffer (void)\r\n{\r\n  glewPrintExt(\"GL_NV_float_buffer\", GLEW_NV_float_buffer, glewIsSupported(\"GL_NV_float_buffer\"), glewGetExtension(\"GL_NV_float_buffer\"));\r\n}\r\n\r\n#endif /* GL_NV_float_buffer */\r\n\r\n#ifdef GL_NV_fog_distance\r\n\r\nstatic void _glewInfo_GL_NV_fog_distance (void)\r\n{\r\n  glewPrintExt(\"GL_NV_fog_distance\", GLEW_NV_fog_distance, glewIsSupported(\"GL_NV_fog_distance\"), glewGetExtension(\"GL_NV_fog_distance\"));\r\n}\r\n\r\n#endif /* GL_NV_fog_distance */\r\n\r\n#ifdef GL_NV_fragment_program\r\n\r\nstatic void _glewInfo_GL_NV_fragment_program (void)\r\n{\r\n  glewPrintExt(\"GL_NV_fragment_program\", GLEW_NV_fragment_program, glewIsSupported(\"GL_NV_fragment_program\"), glewGetExtension(\"GL_NV_fragment_program\"));\r\n\r\n  glewInfoFunc(\"glGetProgramNamedParameterdvNV\", glGetProgramNamedParameterdvNV == NULL);\r\n  glewInfoFunc(\"glGetProgramNamedParameterfvNV\", glGetProgramNamedParameterfvNV == NULL);\r\n  glewInfoFunc(\"glProgramNamedParameter4dNV\", glProgramNamedParameter4dNV == NULL);\r\n  glewInfoFunc(\"glProgramNamedParameter4dvNV\", glProgramNamedParameter4dvNV == NULL);\r\n  glewInfoFunc(\"glProgramNamedParameter4fNV\", glProgramNamedParameter4fNV == NULL);\r\n  glewInfoFunc(\"glProgramNamedParameter4fvNV\", glProgramNamedParameter4fvNV == NULL);\r\n}\r\n\r\n#endif /* GL_NV_fragment_program */\r\n\r\n#ifdef GL_NV_fragment_program2\r\n\r\nstatic void _glewInfo_GL_NV_fragment_program2 (void)\r\n{\r\n  glewPrintExt(\"GL_NV_fragment_program2\", GLEW_NV_fragment_program2, glewIsSupported(\"GL_NV_fragment_program2\"), glewGetExtension(\"GL_NV_fragment_program2\"));\r\n}\r\n\r\n#endif /* GL_NV_fragment_program2 */\r\n\r\n#ifdef GL_NV_fragment_program4\r\n\r\nstatic void _glewInfo_GL_NV_fragment_program4 (void)\r\n{\r\n  glewPrintExt(\"GL_NV_fragment_program4\", GLEW_NV_fragment_program4, glewIsSupported(\"GL_NV_fragment_program4\"), glewGetExtension(\"GL_NV_fragment_program4\"));\r\n}\r\n\r\n#endif /* GL_NV_fragment_program4 */\r\n\r\n#ifdef GL_NV_fragment_program_option\r\n\r\nstatic void _glewInfo_GL_NV_fragment_program_option (void)\r\n{\r\n  glewPrintExt(\"GL_NV_fragment_program_option\", GLEW_NV_fragment_program_option, glewIsSupported(\"GL_NV_fragment_program_option\"), glewGetExtension(\"GL_NV_fragment_program_option\"));\r\n}\r\n\r\n#endif /* GL_NV_fragment_program_option */\r\n\r\n#ifdef GL_NV_framebuffer_multisample_coverage\r\n\r\nstatic void _glewInfo_GL_NV_framebuffer_multisample_coverage (void)\r\n{\r\n  glewPrintExt(\"GL_NV_framebuffer_multisample_coverage\", GLEW_NV_framebuffer_multisample_coverage, glewIsSupported(\"GL_NV_framebuffer_multisample_coverage\"), glewGetExtension(\"GL_NV_framebuffer_multisample_coverage\"));\r\n\r\n  glewInfoFunc(\"glRenderbufferStorageMultisampleCoverageNV\", glRenderbufferStorageMultisampleCoverageNV == NULL);\r\n}\r\n\r\n#endif /* GL_NV_framebuffer_multisample_coverage */\r\n\r\n#ifdef GL_NV_geometry_program4\r\n\r\nstatic void _glewInfo_GL_NV_geometry_program4 (void)\r\n{\r\n  glewPrintExt(\"GL_NV_geometry_program4\", GLEW_NV_geometry_program4, glewIsSupported(\"GL_NV_geometry_program4\"), glewGetExtension(\"GL_NV_geometry_program4\"));\r\n\r\n  glewInfoFunc(\"glProgramVertexLimitNV\", glProgramVertexLimitNV == NULL);\r\n}\r\n\r\n#endif /* GL_NV_geometry_program4 */\r\n\r\n#ifdef GL_NV_geometry_shader4\r\n\r\nstatic void _glewInfo_GL_NV_geometry_shader4 (void)\r\n{\r\n  glewPrintExt(\"GL_NV_geometry_shader4\", GLEW_NV_geometry_shader4, glewIsSupported(\"GL_NV_geometry_shader4\"), glewGetExtension(\"GL_NV_geometry_shader4\"));\r\n}\r\n\r\n#endif /* GL_NV_geometry_shader4 */\r\n\r\n#ifdef GL_NV_gpu_program4\r\n\r\nstatic void _glewInfo_GL_NV_gpu_program4 (void)\r\n{\r\n  glewPrintExt(\"GL_NV_gpu_program4\", GLEW_NV_gpu_program4, glewIsSupported(\"GL_NV_gpu_program4\"), glewGetExtension(\"GL_NV_gpu_program4\"));\r\n\r\n  glewInfoFunc(\"glProgramEnvParameterI4iNV\", glProgramEnvParameterI4iNV == NULL);\r\n  glewInfoFunc(\"glProgramEnvParameterI4ivNV\", glProgramEnvParameterI4ivNV == NULL);\r\n  glewInfoFunc(\"glProgramEnvParameterI4uiNV\", glProgramEnvParameterI4uiNV == NULL);\r\n  glewInfoFunc(\"glProgramEnvParameterI4uivNV\", glProgramEnvParameterI4uivNV == NULL);\r\n  glewInfoFunc(\"glProgramEnvParametersI4ivNV\", glProgramEnvParametersI4ivNV == NULL);\r\n  glewInfoFunc(\"glProgramEnvParametersI4uivNV\", glProgramEnvParametersI4uivNV == NULL);\r\n  glewInfoFunc(\"glProgramLocalParameterI4iNV\", glProgramLocalParameterI4iNV == NULL);\r\n  glewInfoFunc(\"glProgramLocalParameterI4ivNV\", glProgramLocalParameterI4ivNV == NULL);\r\n  glewInfoFunc(\"glProgramLocalParameterI4uiNV\", glProgramLocalParameterI4uiNV == NULL);\r\n  glewInfoFunc(\"glProgramLocalParameterI4uivNV\", glProgramLocalParameterI4uivNV == NULL);\r\n  glewInfoFunc(\"glProgramLocalParametersI4ivNV\", glProgramLocalParametersI4ivNV == NULL);\r\n  glewInfoFunc(\"glProgramLocalParametersI4uivNV\", glProgramLocalParametersI4uivNV == NULL);\r\n}\r\n\r\n#endif /* GL_NV_gpu_program4 */\r\n\r\n#ifdef GL_NV_half_float\r\n\r\nstatic void _glewInfo_GL_NV_half_float (void)\r\n{\r\n  glewPrintExt(\"GL_NV_half_float\", GLEW_NV_half_float, glewIsSupported(\"GL_NV_half_float\"), glewGetExtension(\"GL_NV_half_float\"));\r\n\r\n  glewInfoFunc(\"glColor3hNV\", glColor3hNV == NULL);\r\n  glewInfoFunc(\"glColor3hvNV\", glColor3hvNV == NULL);\r\n  glewInfoFunc(\"glColor4hNV\", glColor4hNV == NULL);\r\n  glewInfoFunc(\"glColor4hvNV\", glColor4hvNV == NULL);\r\n  glewInfoFunc(\"glFogCoordhNV\", glFogCoordhNV == NULL);\r\n  glewInfoFunc(\"glFogCoordhvNV\", glFogCoordhvNV == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord1hNV\", glMultiTexCoord1hNV == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord1hvNV\", glMultiTexCoord1hvNV == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord2hNV\", glMultiTexCoord2hNV == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord2hvNV\", glMultiTexCoord2hvNV == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord3hNV\", glMultiTexCoord3hNV == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord3hvNV\", glMultiTexCoord3hvNV == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord4hNV\", glMultiTexCoord4hNV == NULL);\r\n  glewInfoFunc(\"glMultiTexCoord4hvNV\", glMultiTexCoord4hvNV == NULL);\r\n  glewInfoFunc(\"glNormal3hNV\", glNormal3hNV == NULL);\r\n  glewInfoFunc(\"glNormal3hvNV\", glNormal3hvNV == NULL);\r\n  glewInfoFunc(\"glSecondaryColor3hNV\", glSecondaryColor3hNV == NULL);\r\n  glewInfoFunc(\"glSecondaryColor3hvNV\", glSecondaryColor3hvNV == NULL);\r\n  glewInfoFunc(\"glTexCoord1hNV\", glTexCoord1hNV == NULL);\r\n  glewInfoFunc(\"glTexCoord1hvNV\", glTexCoord1hvNV == NULL);\r\n  glewInfoFunc(\"glTexCoord2hNV\", glTexCoord2hNV == NULL);\r\n  glewInfoFunc(\"glTexCoord2hvNV\", glTexCoord2hvNV == NULL);\r\n  glewInfoFunc(\"glTexCoord3hNV\", glTexCoord3hNV == NULL);\r\n  glewInfoFunc(\"glTexCoord3hvNV\", glTexCoord3hvNV == NULL);\r\n  glewInfoFunc(\"glTexCoord4hNV\", glTexCoord4hNV == NULL);\r\n  glewInfoFunc(\"glTexCoord4hvNV\", glTexCoord4hvNV == NULL);\r\n  glewInfoFunc(\"glVertex2hNV\", glVertex2hNV == NULL);\r\n  glewInfoFunc(\"glVertex2hvNV\", glVertex2hvNV == NULL);\r\n  glewInfoFunc(\"glVertex3hNV\", glVertex3hNV == NULL);\r\n  glewInfoFunc(\"glVertex3hvNV\", glVertex3hvNV == NULL);\r\n  glewInfoFunc(\"glVertex4hNV\", glVertex4hNV == NULL);\r\n  glewInfoFunc(\"glVertex4hvNV\", glVertex4hvNV == NULL);\r\n  glewInfoFunc(\"glVertexAttrib1hNV\", glVertexAttrib1hNV == NULL);\r\n  glewInfoFunc(\"glVertexAttrib1hvNV\", glVertexAttrib1hvNV == NULL);\r\n  glewInfoFunc(\"glVertexAttrib2hNV\", glVertexAttrib2hNV == NULL);\r\n  glewInfoFunc(\"glVertexAttrib2hvNV\", glVertexAttrib2hvNV == NULL);\r\n  glewInfoFunc(\"glVertexAttrib3hNV\", glVertexAttrib3hNV == NULL);\r\n  glewInfoFunc(\"glVertexAttrib3hvNV\", glVertexAttrib3hvNV == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4hNV\", glVertexAttrib4hNV == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4hvNV\", glVertexAttrib4hvNV == NULL);\r\n  glewInfoFunc(\"glVertexAttribs1hvNV\", glVertexAttribs1hvNV == NULL);\r\n  glewInfoFunc(\"glVertexAttribs2hvNV\", glVertexAttribs2hvNV == NULL);\r\n  glewInfoFunc(\"glVertexAttribs3hvNV\", glVertexAttribs3hvNV == NULL);\r\n  glewInfoFunc(\"glVertexAttribs4hvNV\", glVertexAttribs4hvNV == NULL);\r\n  glewInfoFunc(\"glVertexWeighthNV\", glVertexWeighthNV == NULL);\r\n  glewInfoFunc(\"glVertexWeighthvNV\", glVertexWeighthvNV == NULL);\r\n}\r\n\r\n#endif /* GL_NV_half_float */\r\n\r\n#ifdef GL_NV_light_max_exponent\r\n\r\nstatic void _glewInfo_GL_NV_light_max_exponent (void)\r\n{\r\n  glewPrintExt(\"GL_NV_light_max_exponent\", GLEW_NV_light_max_exponent, glewIsSupported(\"GL_NV_light_max_exponent\"), glewGetExtension(\"GL_NV_light_max_exponent\"));\r\n}\r\n\r\n#endif /* GL_NV_light_max_exponent */\r\n\r\n#ifdef GL_NV_multisample_filter_hint\r\n\r\nstatic void _glewInfo_GL_NV_multisample_filter_hint (void)\r\n{\r\n  glewPrintExt(\"GL_NV_multisample_filter_hint\", GLEW_NV_multisample_filter_hint, glewIsSupported(\"GL_NV_multisample_filter_hint\"), glewGetExtension(\"GL_NV_multisample_filter_hint\"));\r\n}\r\n\r\n#endif /* GL_NV_multisample_filter_hint */\r\n\r\n#ifdef GL_NV_occlusion_query\r\n\r\nstatic void _glewInfo_GL_NV_occlusion_query (void)\r\n{\r\n  glewPrintExt(\"GL_NV_occlusion_query\", GLEW_NV_occlusion_query, glewIsSupported(\"GL_NV_occlusion_query\"), glewGetExtension(\"GL_NV_occlusion_query\"));\r\n\r\n  glewInfoFunc(\"glBeginOcclusionQueryNV\", glBeginOcclusionQueryNV == NULL);\r\n  glewInfoFunc(\"glDeleteOcclusionQueriesNV\", glDeleteOcclusionQueriesNV == NULL);\r\n  glewInfoFunc(\"glEndOcclusionQueryNV\", glEndOcclusionQueryNV == NULL);\r\n  glewInfoFunc(\"glGenOcclusionQueriesNV\", glGenOcclusionQueriesNV == NULL);\r\n  glewInfoFunc(\"glGetOcclusionQueryivNV\", glGetOcclusionQueryivNV == NULL);\r\n  glewInfoFunc(\"glGetOcclusionQueryuivNV\", glGetOcclusionQueryuivNV == NULL);\r\n  glewInfoFunc(\"glIsOcclusionQueryNV\", glIsOcclusionQueryNV == NULL);\r\n}\r\n\r\n#endif /* GL_NV_occlusion_query */\r\n\r\n#ifdef GL_NV_packed_depth_stencil\r\n\r\nstatic void _glewInfo_GL_NV_packed_depth_stencil (void)\r\n{\r\n  glewPrintExt(\"GL_NV_packed_depth_stencil\", GLEW_NV_packed_depth_stencil, glewIsSupported(\"GL_NV_packed_depth_stencil\"), glewGetExtension(\"GL_NV_packed_depth_stencil\"));\r\n}\r\n\r\n#endif /* GL_NV_packed_depth_stencil */\r\n\r\n#ifdef GL_NV_parameter_buffer_object\r\n\r\nstatic void _glewInfo_GL_NV_parameter_buffer_object (void)\r\n{\r\n  glewPrintExt(\"GL_NV_parameter_buffer_object\", GLEW_NV_parameter_buffer_object, glewIsSupported(\"GL_NV_parameter_buffer_object\"), glewGetExtension(\"GL_NV_parameter_buffer_object\"));\r\n\r\n  glewInfoFunc(\"glProgramBufferParametersIivNV\", glProgramBufferParametersIivNV == NULL);\r\n  glewInfoFunc(\"glProgramBufferParametersIuivNV\", glProgramBufferParametersIuivNV == NULL);\r\n  glewInfoFunc(\"glProgramBufferParametersfvNV\", glProgramBufferParametersfvNV == NULL);\r\n}\r\n\r\n#endif /* GL_NV_parameter_buffer_object */\r\n\r\n#ifdef GL_NV_parameter_buffer_object2\r\n\r\nstatic void _glewInfo_GL_NV_parameter_buffer_object2 (void)\r\n{\r\n  glewPrintExt(\"GL_NV_parameter_buffer_object2\", GLEW_NV_parameter_buffer_object2, glewIsSupported(\"GL_NV_parameter_buffer_object2\"), glewGetExtension(\"GL_NV_parameter_buffer_object2\"));\r\n}\r\n\r\n#endif /* GL_NV_parameter_buffer_object2 */\r\n\r\n#ifdef GL_NV_pixel_data_range\r\n\r\nstatic void _glewInfo_GL_NV_pixel_data_range (void)\r\n{\r\n  glewPrintExt(\"GL_NV_pixel_data_range\", GLEW_NV_pixel_data_range, glewIsSupported(\"GL_NV_pixel_data_range\"), glewGetExtension(\"GL_NV_pixel_data_range\"));\r\n\r\n  glewInfoFunc(\"glFlushPixelDataRangeNV\", glFlushPixelDataRangeNV == NULL);\r\n  glewInfoFunc(\"glPixelDataRangeNV\", glPixelDataRangeNV == NULL);\r\n}\r\n\r\n#endif /* GL_NV_pixel_data_range */\r\n\r\n#ifdef GL_NV_point_sprite\r\n\r\nstatic void _glewInfo_GL_NV_point_sprite (void)\r\n{\r\n  glewPrintExt(\"GL_NV_point_sprite\", GLEW_NV_point_sprite, glewIsSupported(\"GL_NV_point_sprite\"), glewGetExtension(\"GL_NV_point_sprite\"));\r\n\r\n  glewInfoFunc(\"glPointParameteriNV\", glPointParameteriNV == NULL);\r\n  glewInfoFunc(\"glPointParameterivNV\", glPointParameterivNV == NULL);\r\n}\r\n\r\n#endif /* GL_NV_point_sprite */\r\n\r\n#ifdef GL_NV_present_video\r\n\r\nstatic void _glewInfo_GL_NV_present_video (void)\r\n{\r\n  glewPrintExt(\"GL_NV_present_video\", GLEW_NV_present_video, glewIsSupported(\"GL_NV_present_video\"), glewGetExtension(\"GL_NV_present_video\"));\r\n\r\n  glewInfoFunc(\"glGetVideoi64vNV\", glGetVideoi64vNV == NULL);\r\n  glewInfoFunc(\"glGetVideoivNV\", glGetVideoivNV == NULL);\r\n  glewInfoFunc(\"glGetVideoui64vNV\", glGetVideoui64vNV == NULL);\r\n  glewInfoFunc(\"glGetVideouivNV\", glGetVideouivNV == NULL);\r\n  glewInfoFunc(\"glPresentFrameDualFillNV\", glPresentFrameDualFillNV == NULL);\r\n  glewInfoFunc(\"glPresentFrameKeyedNV\", glPresentFrameKeyedNV == NULL);\r\n}\r\n\r\n#endif /* GL_NV_present_video */\r\n\r\n#ifdef GL_NV_primitive_restart\r\n\r\nstatic void _glewInfo_GL_NV_primitive_restart (void)\r\n{\r\n  glewPrintExt(\"GL_NV_primitive_restart\", GLEW_NV_primitive_restart, glewIsSupported(\"GL_NV_primitive_restart\"), glewGetExtension(\"GL_NV_primitive_restart\"));\r\n\r\n  glewInfoFunc(\"glPrimitiveRestartIndexNV\", glPrimitiveRestartIndexNV == NULL);\r\n  glewInfoFunc(\"glPrimitiveRestartNV\", glPrimitiveRestartNV == NULL);\r\n}\r\n\r\n#endif /* GL_NV_primitive_restart */\r\n\r\n#ifdef GL_NV_register_combiners\r\n\r\nstatic void _glewInfo_GL_NV_register_combiners (void)\r\n{\r\n  glewPrintExt(\"GL_NV_register_combiners\", GLEW_NV_register_combiners, glewIsSupported(\"GL_NV_register_combiners\"), glewGetExtension(\"GL_NV_register_combiners\"));\r\n\r\n  glewInfoFunc(\"glCombinerInputNV\", glCombinerInputNV == NULL);\r\n  glewInfoFunc(\"glCombinerOutputNV\", glCombinerOutputNV == NULL);\r\n  glewInfoFunc(\"glCombinerParameterfNV\", glCombinerParameterfNV == NULL);\r\n  glewInfoFunc(\"glCombinerParameterfvNV\", glCombinerParameterfvNV == NULL);\r\n  glewInfoFunc(\"glCombinerParameteriNV\", glCombinerParameteriNV == NULL);\r\n  glewInfoFunc(\"glCombinerParameterivNV\", glCombinerParameterivNV == NULL);\r\n  glewInfoFunc(\"glFinalCombinerInputNV\", glFinalCombinerInputNV == NULL);\r\n  glewInfoFunc(\"glGetCombinerInputParameterfvNV\", glGetCombinerInputParameterfvNV == NULL);\r\n  glewInfoFunc(\"glGetCombinerInputParameterivNV\", glGetCombinerInputParameterivNV == NULL);\r\n  glewInfoFunc(\"glGetCombinerOutputParameterfvNV\", glGetCombinerOutputParameterfvNV == NULL);\r\n  glewInfoFunc(\"glGetCombinerOutputParameterivNV\", glGetCombinerOutputParameterivNV == NULL);\r\n  glewInfoFunc(\"glGetFinalCombinerInputParameterfvNV\", glGetFinalCombinerInputParameterfvNV == NULL);\r\n  glewInfoFunc(\"glGetFinalCombinerInputParameterivNV\", glGetFinalCombinerInputParameterivNV == NULL);\r\n}\r\n\r\n#endif /* GL_NV_register_combiners */\r\n\r\n#ifdef GL_NV_register_combiners2\r\n\r\nstatic void _glewInfo_GL_NV_register_combiners2 (void)\r\n{\r\n  glewPrintExt(\"GL_NV_register_combiners2\", GLEW_NV_register_combiners2, glewIsSupported(\"GL_NV_register_combiners2\"), glewGetExtension(\"GL_NV_register_combiners2\"));\r\n\r\n  glewInfoFunc(\"glCombinerStageParameterfvNV\", glCombinerStageParameterfvNV == NULL);\r\n  glewInfoFunc(\"glGetCombinerStageParameterfvNV\", glGetCombinerStageParameterfvNV == NULL);\r\n}\r\n\r\n#endif /* GL_NV_register_combiners2 */\r\n\r\n#ifdef GL_NV_shader_buffer_load\r\n\r\nstatic void _glewInfo_GL_NV_shader_buffer_load (void)\r\n{\r\n  glewPrintExt(\"GL_NV_shader_buffer_load\", GLEW_NV_shader_buffer_load, glewIsSupported(\"GL_NV_shader_buffer_load\"), glewGetExtension(\"GL_NV_shader_buffer_load\"));\r\n\r\n  glewInfoFunc(\"glGetBufferParameterui64vNV\", glGetBufferParameterui64vNV == NULL);\r\n  glewInfoFunc(\"glGetIntegerui64vNV\", glGetIntegerui64vNV == NULL);\r\n  glewInfoFunc(\"glGetNamedBufferParameterui64vNV\", glGetNamedBufferParameterui64vNV == NULL);\r\n  glewInfoFunc(\"glGetUniformui64vNV\", glGetUniformui64vNV == NULL);\r\n  glewInfoFunc(\"glIsBufferResidentNV\", glIsBufferResidentNV == NULL);\r\n  glewInfoFunc(\"glIsNamedBufferResidentNV\", glIsNamedBufferResidentNV == NULL);\r\n  glewInfoFunc(\"glMakeBufferNonResidentNV\", glMakeBufferNonResidentNV == NULL);\r\n  glewInfoFunc(\"glMakeBufferResidentNV\", glMakeBufferResidentNV == NULL);\r\n  glewInfoFunc(\"glMakeNamedBufferNonResidentNV\", glMakeNamedBufferNonResidentNV == NULL);\r\n  glewInfoFunc(\"glMakeNamedBufferResidentNV\", glMakeNamedBufferResidentNV == NULL);\r\n  glewInfoFunc(\"glProgramUniformui64NV\", glProgramUniformui64NV == NULL);\r\n  glewInfoFunc(\"glProgramUniformui64vNV\", glProgramUniformui64vNV == NULL);\r\n  glewInfoFunc(\"glUniformui64NV\", glUniformui64NV == NULL);\r\n  glewInfoFunc(\"glUniformui64vNV\", glUniformui64vNV == NULL);\r\n}\r\n\r\n#endif /* GL_NV_shader_buffer_load */\r\n\r\n#ifdef GL_NV_texgen_emboss\r\n\r\nstatic void _glewInfo_GL_NV_texgen_emboss (void)\r\n{\r\n  glewPrintExt(\"GL_NV_texgen_emboss\", GLEW_NV_texgen_emboss, glewIsSupported(\"GL_NV_texgen_emboss\"), glewGetExtension(\"GL_NV_texgen_emboss\"));\r\n}\r\n\r\n#endif /* GL_NV_texgen_emboss */\r\n\r\n#ifdef GL_NV_texgen_reflection\r\n\r\nstatic void _glewInfo_GL_NV_texgen_reflection (void)\r\n{\r\n  glewPrintExt(\"GL_NV_texgen_reflection\", GLEW_NV_texgen_reflection, glewIsSupported(\"GL_NV_texgen_reflection\"), glewGetExtension(\"GL_NV_texgen_reflection\"));\r\n}\r\n\r\n#endif /* GL_NV_texgen_reflection */\r\n\r\n#ifdef GL_NV_texture_barrier\r\n\r\nstatic void _glewInfo_GL_NV_texture_barrier (void)\r\n{\r\n  glewPrintExt(\"GL_NV_texture_barrier\", GLEW_NV_texture_barrier, glewIsSupported(\"GL_NV_texture_barrier\"), glewGetExtension(\"GL_NV_texture_barrier\"));\r\n\r\n  glewInfoFunc(\"glTextureBarrierNV\", glTextureBarrierNV == NULL);\r\n}\r\n\r\n#endif /* GL_NV_texture_barrier */\r\n\r\n#ifdef GL_NV_texture_compression_vtc\r\n\r\nstatic void _glewInfo_GL_NV_texture_compression_vtc (void)\r\n{\r\n  glewPrintExt(\"GL_NV_texture_compression_vtc\", GLEW_NV_texture_compression_vtc, glewIsSupported(\"GL_NV_texture_compression_vtc\"), glewGetExtension(\"GL_NV_texture_compression_vtc\"));\r\n}\r\n\r\n#endif /* GL_NV_texture_compression_vtc */\r\n\r\n#ifdef GL_NV_texture_env_combine4\r\n\r\nstatic void _glewInfo_GL_NV_texture_env_combine4 (void)\r\n{\r\n  glewPrintExt(\"GL_NV_texture_env_combine4\", GLEW_NV_texture_env_combine4, glewIsSupported(\"GL_NV_texture_env_combine4\"), glewGetExtension(\"GL_NV_texture_env_combine4\"));\r\n}\r\n\r\n#endif /* GL_NV_texture_env_combine4 */\r\n\r\n#ifdef GL_NV_texture_expand_normal\r\n\r\nstatic void _glewInfo_GL_NV_texture_expand_normal (void)\r\n{\r\n  glewPrintExt(\"GL_NV_texture_expand_normal\", GLEW_NV_texture_expand_normal, glewIsSupported(\"GL_NV_texture_expand_normal\"), glewGetExtension(\"GL_NV_texture_expand_normal\"));\r\n}\r\n\r\n#endif /* GL_NV_texture_expand_normal */\r\n\r\n#ifdef GL_NV_texture_rectangle\r\n\r\nstatic void _glewInfo_GL_NV_texture_rectangle (void)\r\n{\r\n  glewPrintExt(\"GL_NV_texture_rectangle\", GLEW_NV_texture_rectangle, glewIsSupported(\"GL_NV_texture_rectangle\"), glewGetExtension(\"GL_NV_texture_rectangle\"));\r\n}\r\n\r\n#endif /* GL_NV_texture_rectangle */\r\n\r\n#ifdef GL_NV_texture_shader\r\n\r\nstatic void _glewInfo_GL_NV_texture_shader (void)\r\n{\r\n  glewPrintExt(\"GL_NV_texture_shader\", GLEW_NV_texture_shader, glewIsSupported(\"GL_NV_texture_shader\"), glewGetExtension(\"GL_NV_texture_shader\"));\r\n}\r\n\r\n#endif /* GL_NV_texture_shader */\r\n\r\n#ifdef GL_NV_texture_shader2\r\n\r\nstatic void _glewInfo_GL_NV_texture_shader2 (void)\r\n{\r\n  glewPrintExt(\"GL_NV_texture_shader2\", GLEW_NV_texture_shader2, glewIsSupported(\"GL_NV_texture_shader2\"), glewGetExtension(\"GL_NV_texture_shader2\"));\r\n}\r\n\r\n#endif /* GL_NV_texture_shader2 */\r\n\r\n#ifdef GL_NV_texture_shader3\r\n\r\nstatic void _glewInfo_GL_NV_texture_shader3 (void)\r\n{\r\n  glewPrintExt(\"GL_NV_texture_shader3\", GLEW_NV_texture_shader3, glewIsSupported(\"GL_NV_texture_shader3\"), glewGetExtension(\"GL_NV_texture_shader3\"));\r\n}\r\n\r\n#endif /* GL_NV_texture_shader3 */\r\n\r\n#ifdef GL_NV_transform_feedback\r\n\r\nstatic void _glewInfo_GL_NV_transform_feedback (void)\r\n{\r\n  glewPrintExt(\"GL_NV_transform_feedback\", GLEW_NV_transform_feedback, glewIsSupported(\"GL_NV_transform_feedback\"), glewGetExtension(\"GL_NV_transform_feedback\"));\r\n\r\n  glewInfoFunc(\"glActiveVaryingNV\", glActiveVaryingNV == NULL);\r\n  glewInfoFunc(\"glBeginTransformFeedbackNV\", glBeginTransformFeedbackNV == NULL);\r\n  glewInfoFunc(\"glBindBufferBaseNV\", glBindBufferBaseNV == NULL);\r\n  glewInfoFunc(\"glBindBufferOffsetNV\", glBindBufferOffsetNV == NULL);\r\n  glewInfoFunc(\"glBindBufferRangeNV\", glBindBufferRangeNV == NULL);\r\n  glewInfoFunc(\"glEndTransformFeedbackNV\", glEndTransformFeedbackNV == NULL);\r\n  glewInfoFunc(\"glGetActiveVaryingNV\", glGetActiveVaryingNV == NULL);\r\n  glewInfoFunc(\"glGetTransformFeedbackVaryingNV\", glGetTransformFeedbackVaryingNV == NULL);\r\n  glewInfoFunc(\"glGetVaryingLocationNV\", glGetVaryingLocationNV == NULL);\r\n  glewInfoFunc(\"glTransformFeedbackAttribsNV\", glTransformFeedbackAttribsNV == NULL);\r\n  glewInfoFunc(\"glTransformFeedbackVaryingsNV\", glTransformFeedbackVaryingsNV == NULL);\r\n}\r\n\r\n#endif /* GL_NV_transform_feedback */\r\n\r\n#ifdef GL_NV_transform_feedback2\r\n\r\nstatic void _glewInfo_GL_NV_transform_feedback2 (void)\r\n{\r\n  glewPrintExt(\"GL_NV_transform_feedback2\", GLEW_NV_transform_feedback2, glewIsSupported(\"GL_NV_transform_feedback2\"), glewGetExtension(\"GL_NV_transform_feedback2\"));\r\n\r\n  glewInfoFunc(\"glBindTransformFeedbackNV\", glBindTransformFeedbackNV == NULL);\r\n  glewInfoFunc(\"glDeleteTransformFeedbacksNV\", glDeleteTransformFeedbacksNV == NULL);\r\n  glewInfoFunc(\"glDrawTransformFeedbackNV\", glDrawTransformFeedbackNV == NULL);\r\n  glewInfoFunc(\"glGenTransformFeedbacksNV\", glGenTransformFeedbacksNV == NULL);\r\n  glewInfoFunc(\"glIsTransformFeedbackNV\", glIsTransformFeedbackNV == NULL);\r\n  glewInfoFunc(\"glPauseTransformFeedbackNV\", glPauseTransformFeedbackNV == NULL);\r\n  glewInfoFunc(\"glResumeTransformFeedbackNV\", glResumeTransformFeedbackNV == NULL);\r\n}\r\n\r\n#endif /* GL_NV_transform_feedback2 */\r\n\r\n#ifdef GL_NV_vertex_array_range\r\n\r\nstatic void _glewInfo_GL_NV_vertex_array_range (void)\r\n{\r\n  glewPrintExt(\"GL_NV_vertex_array_range\", GLEW_NV_vertex_array_range, glewIsSupported(\"GL_NV_vertex_array_range\"), glewGetExtension(\"GL_NV_vertex_array_range\"));\r\n\r\n  glewInfoFunc(\"glFlushVertexArrayRangeNV\", glFlushVertexArrayRangeNV == NULL);\r\n  glewInfoFunc(\"glVertexArrayRangeNV\", glVertexArrayRangeNV == NULL);\r\n}\r\n\r\n#endif /* GL_NV_vertex_array_range */\r\n\r\n#ifdef GL_NV_vertex_array_range2\r\n\r\nstatic void _glewInfo_GL_NV_vertex_array_range2 (void)\r\n{\r\n  glewPrintExt(\"GL_NV_vertex_array_range2\", GLEW_NV_vertex_array_range2, glewIsSupported(\"GL_NV_vertex_array_range2\"), glewGetExtension(\"GL_NV_vertex_array_range2\"));\r\n}\r\n\r\n#endif /* GL_NV_vertex_array_range2 */\r\n\r\n#ifdef GL_NV_vertex_buffer_unified_memory\r\n\r\nstatic void _glewInfo_GL_NV_vertex_buffer_unified_memory (void)\r\n{\r\n  glewPrintExt(\"GL_NV_vertex_buffer_unified_memory\", GLEW_NV_vertex_buffer_unified_memory, glewIsSupported(\"GL_NV_vertex_buffer_unified_memory\"), glewGetExtension(\"GL_NV_vertex_buffer_unified_memory\"));\r\n\r\n  glewInfoFunc(\"glBufferAddressRangeNV\", glBufferAddressRangeNV == NULL);\r\n  glewInfoFunc(\"glColorFormatNV\", glColorFormatNV == NULL);\r\n  glewInfoFunc(\"glEdgeFlagFormatNV\", glEdgeFlagFormatNV == NULL);\r\n  glewInfoFunc(\"glFogCoordFormatNV\", glFogCoordFormatNV == NULL);\r\n  glewInfoFunc(\"glGetIntegerui64i_vNV\", glGetIntegerui64i_vNV == NULL);\r\n  glewInfoFunc(\"glIndexFormatNV\", glIndexFormatNV == NULL);\r\n  glewInfoFunc(\"glNormalFormatNV\", glNormalFormatNV == NULL);\r\n  glewInfoFunc(\"glSecondaryColorFormatNV\", glSecondaryColorFormatNV == NULL);\r\n  glewInfoFunc(\"glTexCoordFormatNV\", glTexCoordFormatNV == NULL);\r\n  glewInfoFunc(\"glVertexAttribFormatNV\", glVertexAttribFormatNV == NULL);\r\n  glewInfoFunc(\"glVertexAttribIFormatNV\", glVertexAttribIFormatNV == NULL);\r\n  glewInfoFunc(\"glVertexFormatNV\", glVertexFormatNV == NULL);\r\n}\r\n\r\n#endif /* GL_NV_vertex_buffer_unified_memory */\r\n\r\n#ifdef GL_NV_vertex_program\r\n\r\nstatic void _glewInfo_GL_NV_vertex_program (void)\r\n{\r\n  glewPrintExt(\"GL_NV_vertex_program\", GLEW_NV_vertex_program, glewIsSupported(\"GL_NV_vertex_program\"), glewGetExtension(\"GL_NV_vertex_program\"));\r\n\r\n  glewInfoFunc(\"glAreProgramsResidentNV\", glAreProgramsResidentNV == NULL);\r\n  glewInfoFunc(\"glBindProgramNV\", glBindProgramNV == NULL);\r\n  glewInfoFunc(\"glDeleteProgramsNV\", glDeleteProgramsNV == NULL);\r\n  glewInfoFunc(\"glExecuteProgramNV\", glExecuteProgramNV == NULL);\r\n  glewInfoFunc(\"glGenProgramsNV\", glGenProgramsNV == NULL);\r\n  glewInfoFunc(\"glGetProgramParameterdvNV\", glGetProgramParameterdvNV == NULL);\r\n  glewInfoFunc(\"glGetProgramParameterfvNV\", glGetProgramParameterfvNV == NULL);\r\n  glewInfoFunc(\"glGetProgramStringNV\", glGetProgramStringNV == NULL);\r\n  glewInfoFunc(\"glGetProgramivNV\", glGetProgramivNV == NULL);\r\n  glewInfoFunc(\"glGetTrackMatrixivNV\", glGetTrackMatrixivNV == NULL);\r\n  glewInfoFunc(\"glGetVertexAttribPointervNV\", glGetVertexAttribPointervNV == NULL);\r\n  glewInfoFunc(\"glGetVertexAttribdvNV\", glGetVertexAttribdvNV == NULL);\r\n  glewInfoFunc(\"glGetVertexAttribfvNV\", glGetVertexAttribfvNV == NULL);\r\n  glewInfoFunc(\"glGetVertexAttribivNV\", glGetVertexAttribivNV == NULL);\r\n  glewInfoFunc(\"glIsProgramNV\", glIsProgramNV == NULL);\r\n  glewInfoFunc(\"glLoadProgramNV\", glLoadProgramNV == NULL);\r\n  glewInfoFunc(\"glProgramParameter4dNV\", glProgramParameter4dNV == NULL);\r\n  glewInfoFunc(\"glProgramParameter4dvNV\", glProgramParameter4dvNV == NULL);\r\n  glewInfoFunc(\"glProgramParameter4fNV\", glProgramParameter4fNV == NULL);\r\n  glewInfoFunc(\"glProgramParameter4fvNV\", glProgramParameter4fvNV == NULL);\r\n  glewInfoFunc(\"glProgramParameters4dvNV\", glProgramParameters4dvNV == NULL);\r\n  glewInfoFunc(\"glProgramParameters4fvNV\", glProgramParameters4fvNV == NULL);\r\n  glewInfoFunc(\"glRequestResidentProgramsNV\", glRequestResidentProgramsNV == NULL);\r\n  glewInfoFunc(\"glTrackMatrixNV\", glTrackMatrixNV == NULL);\r\n  glewInfoFunc(\"glVertexAttrib1dNV\", glVertexAttrib1dNV == NULL);\r\n  glewInfoFunc(\"glVertexAttrib1dvNV\", glVertexAttrib1dvNV == NULL);\r\n  glewInfoFunc(\"glVertexAttrib1fNV\", glVertexAttrib1fNV == NULL);\r\n  glewInfoFunc(\"glVertexAttrib1fvNV\", glVertexAttrib1fvNV == NULL);\r\n  glewInfoFunc(\"glVertexAttrib1sNV\", glVertexAttrib1sNV == NULL);\r\n  glewInfoFunc(\"glVertexAttrib1svNV\", glVertexAttrib1svNV == NULL);\r\n  glewInfoFunc(\"glVertexAttrib2dNV\", glVertexAttrib2dNV == NULL);\r\n  glewInfoFunc(\"glVertexAttrib2dvNV\", glVertexAttrib2dvNV == NULL);\r\n  glewInfoFunc(\"glVertexAttrib2fNV\", glVertexAttrib2fNV == NULL);\r\n  glewInfoFunc(\"glVertexAttrib2fvNV\", glVertexAttrib2fvNV == NULL);\r\n  glewInfoFunc(\"glVertexAttrib2sNV\", glVertexAttrib2sNV == NULL);\r\n  glewInfoFunc(\"glVertexAttrib2svNV\", glVertexAttrib2svNV == NULL);\r\n  glewInfoFunc(\"glVertexAttrib3dNV\", glVertexAttrib3dNV == NULL);\r\n  glewInfoFunc(\"glVertexAttrib3dvNV\", glVertexAttrib3dvNV == NULL);\r\n  glewInfoFunc(\"glVertexAttrib3fNV\", glVertexAttrib3fNV == NULL);\r\n  glewInfoFunc(\"glVertexAttrib3fvNV\", glVertexAttrib3fvNV == NULL);\r\n  glewInfoFunc(\"glVertexAttrib3sNV\", glVertexAttrib3sNV == NULL);\r\n  glewInfoFunc(\"glVertexAttrib3svNV\", glVertexAttrib3svNV == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4dNV\", glVertexAttrib4dNV == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4dvNV\", glVertexAttrib4dvNV == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4fNV\", glVertexAttrib4fNV == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4fvNV\", glVertexAttrib4fvNV == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4sNV\", glVertexAttrib4sNV == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4svNV\", glVertexAttrib4svNV == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4ubNV\", glVertexAttrib4ubNV == NULL);\r\n  glewInfoFunc(\"glVertexAttrib4ubvNV\", glVertexAttrib4ubvNV == NULL);\r\n  glewInfoFunc(\"glVertexAttribPointerNV\", glVertexAttribPointerNV == NULL);\r\n  glewInfoFunc(\"glVertexAttribs1dvNV\", glVertexAttribs1dvNV == NULL);\r\n  glewInfoFunc(\"glVertexAttribs1fvNV\", glVertexAttribs1fvNV == NULL);\r\n  glewInfoFunc(\"glVertexAttribs1svNV\", glVertexAttribs1svNV == NULL);\r\n  glewInfoFunc(\"glVertexAttribs2dvNV\", glVertexAttribs2dvNV == NULL);\r\n  glewInfoFunc(\"glVertexAttribs2fvNV\", glVertexAttribs2fvNV == NULL);\r\n  glewInfoFunc(\"glVertexAttribs2svNV\", glVertexAttribs2svNV == NULL);\r\n  glewInfoFunc(\"glVertexAttribs3dvNV\", glVertexAttribs3dvNV == NULL);\r\n  glewInfoFunc(\"glVertexAttribs3fvNV\", glVertexAttribs3fvNV == NULL);\r\n  glewInfoFunc(\"glVertexAttribs3svNV\", glVertexAttribs3svNV == NULL);\r\n  glewInfoFunc(\"glVertexAttribs4dvNV\", glVertexAttribs4dvNV == NULL);\r\n  glewInfoFunc(\"glVertexAttribs4fvNV\", glVertexAttribs4fvNV == NULL);\r\n  glewInfoFunc(\"glVertexAttribs4svNV\", glVertexAttribs4svNV == NULL);\r\n  glewInfoFunc(\"glVertexAttribs4ubvNV\", glVertexAttribs4ubvNV == NULL);\r\n}\r\n\r\n#endif /* GL_NV_vertex_program */\r\n\r\n#ifdef GL_NV_vertex_program1_1\r\n\r\nstatic void _glewInfo_GL_NV_vertex_program1_1 (void)\r\n{\r\n  glewPrintExt(\"GL_NV_vertex_program1_1\", GLEW_NV_vertex_program1_1, glewIsSupported(\"GL_NV_vertex_program1_1\"), glewGetExtension(\"GL_NV_vertex_program1_1\"));\r\n}\r\n\r\n#endif /* GL_NV_vertex_program1_1 */\r\n\r\n#ifdef GL_NV_vertex_program2\r\n\r\nstatic void _glewInfo_GL_NV_vertex_program2 (void)\r\n{\r\n  glewPrintExt(\"GL_NV_vertex_program2\", GLEW_NV_vertex_program2, glewIsSupported(\"GL_NV_vertex_program2\"), glewGetExtension(\"GL_NV_vertex_program2\"));\r\n}\r\n\r\n#endif /* GL_NV_vertex_program2 */\r\n\r\n#ifdef GL_NV_vertex_program2_option\r\n\r\nstatic void _glewInfo_GL_NV_vertex_program2_option (void)\r\n{\r\n  glewPrintExt(\"GL_NV_vertex_program2_option\", GLEW_NV_vertex_program2_option, glewIsSupported(\"GL_NV_vertex_program2_option\"), glewGetExtension(\"GL_NV_vertex_program2_option\"));\r\n}\r\n\r\n#endif /* GL_NV_vertex_program2_option */\r\n\r\n#ifdef GL_NV_vertex_program3\r\n\r\nstatic void _glewInfo_GL_NV_vertex_program3 (void)\r\n{\r\n  glewPrintExt(\"GL_NV_vertex_program3\", GLEW_NV_vertex_program3, glewIsSupported(\"GL_NV_vertex_program3\"), glewGetExtension(\"GL_NV_vertex_program3\"));\r\n}\r\n\r\n#endif /* GL_NV_vertex_program3 */\r\n\r\n#ifdef GL_NV_vertex_program4\r\n\r\nstatic void _glewInfo_GL_NV_vertex_program4 (void)\r\n{\r\n  glewPrintExt(\"GL_NV_vertex_program4\", GLEW_NV_vertex_program4, glewIsSupported(\"GL_NV_vertex_program4\"), glewGetExtension(\"GL_NV_vertex_program4\"));\r\n}\r\n\r\n#endif /* GL_NV_vertex_program4 */\r\n\r\n#ifdef GL_OES_byte_coordinates\r\n\r\nstatic void _glewInfo_GL_OES_byte_coordinates (void)\r\n{\r\n  glewPrintExt(\"GL_OES_byte_coordinates\", GLEW_OES_byte_coordinates, glewIsSupported(\"GL_OES_byte_coordinates\"), glewGetExtension(\"GL_OES_byte_coordinates\"));\r\n}\r\n\r\n#endif /* GL_OES_byte_coordinates */\r\n\r\n#ifdef GL_OES_compressed_paletted_texture\r\n\r\nstatic void _glewInfo_GL_OES_compressed_paletted_texture (void)\r\n{\r\n  glewPrintExt(\"GL_OES_compressed_paletted_texture\", GLEW_OES_compressed_paletted_texture, glewIsSupported(\"GL_OES_compressed_paletted_texture\"), glewGetExtension(\"GL_OES_compressed_paletted_texture\"));\r\n}\r\n\r\n#endif /* GL_OES_compressed_paletted_texture */\r\n\r\n#ifdef GL_OES_read_format\r\n\r\nstatic void _glewInfo_GL_OES_read_format (void)\r\n{\r\n  glewPrintExt(\"GL_OES_read_format\", GLEW_OES_read_format, glewIsSupported(\"GL_OES_read_format\"), glewGetExtension(\"GL_OES_read_format\"));\r\n}\r\n\r\n#endif /* GL_OES_read_format */\r\n\r\n#ifdef GL_OES_single_precision\r\n\r\nstatic void _glewInfo_GL_OES_single_precision (void)\r\n{\r\n  glewPrintExt(\"GL_OES_single_precision\", GLEW_OES_single_precision, glewIsSupported(\"GL_OES_single_precision\"), glewGetExtension(\"GL_OES_single_precision\"));\r\n\r\n  glewInfoFunc(\"glClearDepthfOES\", glClearDepthfOES == NULL);\r\n  glewInfoFunc(\"glClipPlanefOES\", glClipPlanefOES == NULL);\r\n  glewInfoFunc(\"glDepthRangefOES\", glDepthRangefOES == NULL);\r\n  glewInfoFunc(\"glFrustumfOES\", glFrustumfOES == NULL);\r\n  glewInfoFunc(\"glGetClipPlanefOES\", glGetClipPlanefOES == NULL);\r\n  glewInfoFunc(\"glOrthofOES\", glOrthofOES == NULL);\r\n}\r\n\r\n#endif /* GL_OES_single_precision */\r\n\r\n#ifdef GL_OML_interlace\r\n\r\nstatic void _glewInfo_GL_OML_interlace (void)\r\n{\r\n  glewPrintExt(\"GL_OML_interlace\", GLEW_OML_interlace, glewIsSupported(\"GL_OML_interlace\"), glewGetExtension(\"GL_OML_interlace\"));\r\n}\r\n\r\n#endif /* GL_OML_interlace */\r\n\r\n#ifdef GL_OML_resample\r\n\r\nstatic void _glewInfo_GL_OML_resample (void)\r\n{\r\n  glewPrintExt(\"GL_OML_resample\", GLEW_OML_resample, glewIsSupported(\"GL_OML_resample\"), glewGetExtension(\"GL_OML_resample\"));\r\n}\r\n\r\n#endif /* GL_OML_resample */\r\n\r\n#ifdef GL_OML_subsample\r\n\r\nstatic void _glewInfo_GL_OML_subsample (void)\r\n{\r\n  glewPrintExt(\"GL_OML_subsample\", GLEW_OML_subsample, glewIsSupported(\"GL_OML_subsample\"), glewGetExtension(\"GL_OML_subsample\"));\r\n}\r\n\r\n#endif /* GL_OML_subsample */\r\n\r\n#ifdef GL_PGI_misc_hints\r\n\r\nstatic void _glewInfo_GL_PGI_misc_hints (void)\r\n{\r\n  glewPrintExt(\"GL_PGI_misc_hints\", GLEW_PGI_misc_hints, glewIsSupported(\"GL_PGI_misc_hints\"), glewGetExtension(\"GL_PGI_misc_hints\"));\r\n}\r\n\r\n#endif /* GL_PGI_misc_hints */\r\n\r\n#ifdef GL_PGI_vertex_hints\r\n\r\nstatic void _glewInfo_GL_PGI_vertex_hints (void)\r\n{\r\n  glewPrintExt(\"GL_PGI_vertex_hints\", GLEW_PGI_vertex_hints, glewIsSupported(\"GL_PGI_vertex_hints\"), glewGetExtension(\"GL_PGI_vertex_hints\"));\r\n}\r\n\r\n#endif /* GL_PGI_vertex_hints */\r\n\r\n#ifdef GL_REND_screen_coordinates\r\n\r\nstatic void _glewInfo_GL_REND_screen_coordinates (void)\r\n{\r\n  glewPrintExt(\"GL_REND_screen_coordinates\", GLEW_REND_screen_coordinates, glewIsSupported(\"GL_REND_screen_coordinates\"), glewGetExtension(\"GL_REND_screen_coordinates\"));\r\n}\r\n\r\n#endif /* GL_REND_screen_coordinates */\r\n\r\n#ifdef GL_S3_s3tc\r\n\r\nstatic void _glewInfo_GL_S3_s3tc (void)\r\n{\r\n  glewPrintExt(\"GL_S3_s3tc\", GLEW_S3_s3tc, glewIsSupported(\"GL_S3_s3tc\"), glewGetExtension(\"GL_S3_s3tc\"));\r\n}\r\n\r\n#endif /* GL_S3_s3tc */\r\n\r\n#ifdef GL_SGIS_color_range\r\n\r\nstatic void _glewInfo_GL_SGIS_color_range (void)\r\n{\r\n  glewPrintExt(\"GL_SGIS_color_range\", GLEW_SGIS_color_range, glewIsSupported(\"GL_SGIS_color_range\"), glewGetExtension(\"GL_SGIS_color_range\"));\r\n}\r\n\r\n#endif /* GL_SGIS_color_range */\r\n\r\n#ifdef GL_SGIS_detail_texture\r\n\r\nstatic void _glewInfo_GL_SGIS_detail_texture (void)\r\n{\r\n  glewPrintExt(\"GL_SGIS_detail_texture\", GLEW_SGIS_detail_texture, glewIsSupported(\"GL_SGIS_detail_texture\"), glewGetExtension(\"GL_SGIS_detail_texture\"));\r\n\r\n  glewInfoFunc(\"glDetailTexFuncSGIS\", glDetailTexFuncSGIS == NULL);\r\n  glewInfoFunc(\"glGetDetailTexFuncSGIS\", glGetDetailTexFuncSGIS == NULL);\r\n}\r\n\r\n#endif /* GL_SGIS_detail_texture */\r\n\r\n#ifdef GL_SGIS_fog_function\r\n\r\nstatic void _glewInfo_GL_SGIS_fog_function (void)\r\n{\r\n  glewPrintExt(\"GL_SGIS_fog_function\", GLEW_SGIS_fog_function, glewIsSupported(\"GL_SGIS_fog_function\"), glewGetExtension(\"GL_SGIS_fog_function\"));\r\n\r\n  glewInfoFunc(\"glFogFuncSGIS\", glFogFuncSGIS == NULL);\r\n  glewInfoFunc(\"glGetFogFuncSGIS\", glGetFogFuncSGIS == NULL);\r\n}\r\n\r\n#endif /* GL_SGIS_fog_function */\r\n\r\n#ifdef GL_SGIS_generate_mipmap\r\n\r\nstatic void _glewInfo_GL_SGIS_generate_mipmap (void)\r\n{\r\n  glewPrintExt(\"GL_SGIS_generate_mipmap\", GLEW_SGIS_generate_mipmap, glewIsSupported(\"GL_SGIS_generate_mipmap\"), glewGetExtension(\"GL_SGIS_generate_mipmap\"));\r\n}\r\n\r\n#endif /* GL_SGIS_generate_mipmap */\r\n\r\n#ifdef GL_SGIS_multisample\r\n\r\nstatic void _glewInfo_GL_SGIS_multisample (void)\r\n{\r\n  glewPrintExt(\"GL_SGIS_multisample\", GLEW_SGIS_multisample, glewIsSupported(\"GL_SGIS_multisample\"), glewGetExtension(\"GL_SGIS_multisample\"));\r\n\r\n  glewInfoFunc(\"glSampleMaskSGIS\", glSampleMaskSGIS == NULL);\r\n  glewInfoFunc(\"glSamplePatternSGIS\", glSamplePatternSGIS == NULL);\r\n}\r\n\r\n#endif /* GL_SGIS_multisample */\r\n\r\n#ifdef GL_SGIS_pixel_texture\r\n\r\nstatic void _glewInfo_GL_SGIS_pixel_texture (void)\r\n{\r\n  glewPrintExt(\"GL_SGIS_pixel_texture\", GLEW_SGIS_pixel_texture, glewIsSupported(\"GL_SGIS_pixel_texture\"), glewGetExtension(\"GL_SGIS_pixel_texture\"));\r\n}\r\n\r\n#endif /* GL_SGIS_pixel_texture */\r\n\r\n#ifdef GL_SGIS_point_line_texgen\r\n\r\nstatic void _glewInfo_GL_SGIS_point_line_texgen (void)\r\n{\r\n  glewPrintExt(\"GL_SGIS_point_line_texgen\", GLEW_SGIS_point_line_texgen, glewIsSupported(\"GL_SGIS_point_line_texgen\"), glewGetExtension(\"GL_SGIS_point_line_texgen\"));\r\n}\r\n\r\n#endif /* GL_SGIS_point_line_texgen */\r\n\r\n#ifdef GL_SGIS_sharpen_texture\r\n\r\nstatic void _glewInfo_GL_SGIS_sharpen_texture (void)\r\n{\r\n  glewPrintExt(\"GL_SGIS_sharpen_texture\", GLEW_SGIS_sharpen_texture, glewIsSupported(\"GL_SGIS_sharpen_texture\"), glewGetExtension(\"GL_SGIS_sharpen_texture\"));\r\n\r\n  glewInfoFunc(\"glGetSharpenTexFuncSGIS\", glGetSharpenTexFuncSGIS == NULL);\r\n  glewInfoFunc(\"glSharpenTexFuncSGIS\", glSharpenTexFuncSGIS == NULL);\r\n}\r\n\r\n#endif /* GL_SGIS_sharpen_texture */\r\n\r\n#ifdef GL_SGIS_texture4D\r\n\r\nstatic void _glewInfo_GL_SGIS_texture4D (void)\r\n{\r\n  glewPrintExt(\"GL_SGIS_texture4D\", GLEW_SGIS_texture4D, glewIsSupported(\"GL_SGIS_texture4D\"), glewGetExtension(\"GL_SGIS_texture4D\"));\r\n\r\n  glewInfoFunc(\"glTexImage4DSGIS\", glTexImage4DSGIS == NULL);\r\n  glewInfoFunc(\"glTexSubImage4DSGIS\", glTexSubImage4DSGIS == NULL);\r\n}\r\n\r\n#endif /* GL_SGIS_texture4D */\r\n\r\n#ifdef GL_SGIS_texture_border_clamp\r\n\r\nstatic void _glewInfo_GL_SGIS_texture_border_clamp (void)\r\n{\r\n  glewPrintExt(\"GL_SGIS_texture_border_clamp\", GLEW_SGIS_texture_border_clamp, glewIsSupported(\"GL_SGIS_texture_border_clamp\"), glewGetExtension(\"GL_SGIS_texture_border_clamp\"));\r\n}\r\n\r\n#endif /* GL_SGIS_texture_border_clamp */\r\n\r\n#ifdef GL_SGIS_texture_edge_clamp\r\n\r\nstatic void _glewInfo_GL_SGIS_texture_edge_clamp (void)\r\n{\r\n  glewPrintExt(\"GL_SGIS_texture_edge_clamp\", GLEW_SGIS_texture_edge_clamp, glewIsSupported(\"GL_SGIS_texture_edge_clamp\"), glewGetExtension(\"GL_SGIS_texture_edge_clamp\"));\r\n}\r\n\r\n#endif /* GL_SGIS_texture_edge_clamp */\r\n\r\n#ifdef GL_SGIS_texture_filter4\r\n\r\nstatic void _glewInfo_GL_SGIS_texture_filter4 (void)\r\n{\r\n  glewPrintExt(\"GL_SGIS_texture_filter4\", GLEW_SGIS_texture_filter4, glewIsSupported(\"GL_SGIS_texture_filter4\"), glewGetExtension(\"GL_SGIS_texture_filter4\"));\r\n\r\n  glewInfoFunc(\"glGetTexFilterFuncSGIS\", glGetTexFilterFuncSGIS == NULL);\r\n  glewInfoFunc(\"glTexFilterFuncSGIS\", glTexFilterFuncSGIS == NULL);\r\n}\r\n\r\n#endif /* GL_SGIS_texture_filter4 */\r\n\r\n#ifdef GL_SGIS_texture_lod\r\n\r\nstatic void _glewInfo_GL_SGIS_texture_lod (void)\r\n{\r\n  glewPrintExt(\"GL_SGIS_texture_lod\", GLEW_SGIS_texture_lod, glewIsSupported(\"GL_SGIS_texture_lod\"), glewGetExtension(\"GL_SGIS_texture_lod\"));\r\n}\r\n\r\n#endif /* GL_SGIS_texture_lod */\r\n\r\n#ifdef GL_SGIS_texture_select\r\n\r\nstatic void _glewInfo_GL_SGIS_texture_select (void)\r\n{\r\n  glewPrintExt(\"GL_SGIS_texture_select\", GLEW_SGIS_texture_select, glewIsSupported(\"GL_SGIS_texture_select\"), glewGetExtension(\"GL_SGIS_texture_select\"));\r\n}\r\n\r\n#endif /* GL_SGIS_texture_select */\r\n\r\n#ifdef GL_SGIX_async\r\n\r\nstatic void _glewInfo_GL_SGIX_async (void)\r\n{\r\n  glewPrintExt(\"GL_SGIX_async\", GLEW_SGIX_async, glewIsSupported(\"GL_SGIX_async\"), glewGetExtension(\"GL_SGIX_async\"));\r\n\r\n  glewInfoFunc(\"glAsyncMarkerSGIX\", glAsyncMarkerSGIX == NULL);\r\n  glewInfoFunc(\"glDeleteAsyncMarkersSGIX\", glDeleteAsyncMarkersSGIX == NULL);\r\n  glewInfoFunc(\"glFinishAsyncSGIX\", glFinishAsyncSGIX == NULL);\r\n  glewInfoFunc(\"glGenAsyncMarkersSGIX\", glGenAsyncMarkersSGIX == NULL);\r\n  glewInfoFunc(\"glIsAsyncMarkerSGIX\", glIsAsyncMarkerSGIX == NULL);\r\n  glewInfoFunc(\"glPollAsyncSGIX\", glPollAsyncSGIX == NULL);\r\n}\r\n\r\n#endif /* GL_SGIX_async */\r\n\r\n#ifdef GL_SGIX_async_histogram\r\n\r\nstatic void _glewInfo_GL_SGIX_async_histogram (void)\r\n{\r\n  glewPrintExt(\"GL_SGIX_async_histogram\", GLEW_SGIX_async_histogram, glewIsSupported(\"GL_SGIX_async_histogram\"), glewGetExtension(\"GL_SGIX_async_histogram\"));\r\n}\r\n\r\n#endif /* GL_SGIX_async_histogram */\r\n\r\n#ifdef GL_SGIX_async_pixel\r\n\r\nstatic void _glewInfo_GL_SGIX_async_pixel (void)\r\n{\r\n  glewPrintExt(\"GL_SGIX_async_pixel\", GLEW_SGIX_async_pixel, glewIsSupported(\"GL_SGIX_async_pixel\"), glewGetExtension(\"GL_SGIX_async_pixel\"));\r\n}\r\n\r\n#endif /* GL_SGIX_async_pixel */\r\n\r\n#ifdef GL_SGIX_blend_alpha_minmax\r\n\r\nstatic void _glewInfo_GL_SGIX_blend_alpha_minmax (void)\r\n{\r\n  glewPrintExt(\"GL_SGIX_blend_alpha_minmax\", GLEW_SGIX_blend_alpha_minmax, glewIsSupported(\"GL_SGIX_blend_alpha_minmax\"), glewGetExtension(\"GL_SGIX_blend_alpha_minmax\"));\r\n}\r\n\r\n#endif /* GL_SGIX_blend_alpha_minmax */\r\n\r\n#ifdef GL_SGIX_clipmap\r\n\r\nstatic void _glewInfo_GL_SGIX_clipmap (void)\r\n{\r\n  glewPrintExt(\"GL_SGIX_clipmap\", GLEW_SGIX_clipmap, glewIsSupported(\"GL_SGIX_clipmap\"), glewGetExtension(\"GL_SGIX_clipmap\"));\r\n}\r\n\r\n#endif /* GL_SGIX_clipmap */\r\n\r\n#ifdef GL_SGIX_convolution_accuracy\r\n\r\nstatic void _glewInfo_GL_SGIX_convolution_accuracy (void)\r\n{\r\n  glewPrintExt(\"GL_SGIX_convolution_accuracy\", GLEW_SGIX_convolution_accuracy, glewIsSupported(\"GL_SGIX_convolution_accuracy\"), glewGetExtension(\"GL_SGIX_convolution_accuracy\"));\r\n}\r\n\r\n#endif /* GL_SGIX_convolution_accuracy */\r\n\r\n#ifdef GL_SGIX_depth_texture\r\n\r\nstatic void _glewInfo_GL_SGIX_depth_texture (void)\r\n{\r\n  glewPrintExt(\"GL_SGIX_depth_texture\", GLEW_SGIX_depth_texture, glewIsSupported(\"GL_SGIX_depth_texture\"), glewGetExtension(\"GL_SGIX_depth_texture\"));\r\n}\r\n\r\n#endif /* GL_SGIX_depth_texture */\r\n\r\n#ifdef GL_SGIX_flush_raster\r\n\r\nstatic void _glewInfo_GL_SGIX_flush_raster (void)\r\n{\r\n  glewPrintExt(\"GL_SGIX_flush_raster\", GLEW_SGIX_flush_raster, glewIsSupported(\"GL_SGIX_flush_raster\"), glewGetExtension(\"GL_SGIX_flush_raster\"));\r\n\r\n  glewInfoFunc(\"glFlushRasterSGIX\", glFlushRasterSGIX == NULL);\r\n}\r\n\r\n#endif /* GL_SGIX_flush_raster */\r\n\r\n#ifdef GL_SGIX_fog_offset\r\n\r\nstatic void _glewInfo_GL_SGIX_fog_offset (void)\r\n{\r\n  glewPrintExt(\"GL_SGIX_fog_offset\", GLEW_SGIX_fog_offset, glewIsSupported(\"GL_SGIX_fog_offset\"), glewGetExtension(\"GL_SGIX_fog_offset\"));\r\n}\r\n\r\n#endif /* GL_SGIX_fog_offset */\r\n\r\n#ifdef GL_SGIX_fog_texture\r\n\r\nstatic void _glewInfo_GL_SGIX_fog_texture (void)\r\n{\r\n  glewPrintExt(\"GL_SGIX_fog_texture\", GLEW_SGIX_fog_texture, glewIsSupported(\"GL_SGIX_fog_texture\"), glewGetExtension(\"GL_SGIX_fog_texture\"));\r\n\r\n  glewInfoFunc(\"glTextureFogSGIX\", glTextureFogSGIX == NULL);\r\n}\r\n\r\n#endif /* GL_SGIX_fog_texture */\r\n\r\n#ifdef GL_SGIX_fragment_specular_lighting\r\n\r\nstatic void _glewInfo_GL_SGIX_fragment_specular_lighting (void)\r\n{\r\n  glewPrintExt(\"GL_SGIX_fragment_specular_lighting\", GLEW_SGIX_fragment_specular_lighting, glewIsSupported(\"GL_SGIX_fragment_specular_lighting\"), glewGetExtension(\"GL_SGIX_fragment_specular_lighting\"));\r\n\r\n  glewInfoFunc(\"glFragmentColorMaterialSGIX\", glFragmentColorMaterialSGIX == NULL);\r\n  glewInfoFunc(\"glFragmentLightModelfSGIX\", glFragmentLightModelfSGIX == NULL);\r\n  glewInfoFunc(\"glFragmentLightModelfvSGIX\", glFragmentLightModelfvSGIX == NULL);\r\n  glewInfoFunc(\"glFragmentLightModeliSGIX\", glFragmentLightModeliSGIX == NULL);\r\n  glewInfoFunc(\"glFragmentLightModelivSGIX\", glFragmentLightModelivSGIX == NULL);\r\n  glewInfoFunc(\"glFragmentLightfSGIX\", glFragmentLightfSGIX == NULL);\r\n  glewInfoFunc(\"glFragmentLightfvSGIX\", glFragmentLightfvSGIX == NULL);\r\n  glewInfoFunc(\"glFragmentLightiSGIX\", glFragmentLightiSGIX == NULL);\r\n  glewInfoFunc(\"glFragmentLightivSGIX\", glFragmentLightivSGIX == NULL);\r\n  glewInfoFunc(\"glFragmentMaterialfSGIX\", glFragmentMaterialfSGIX == NULL);\r\n  glewInfoFunc(\"glFragmentMaterialfvSGIX\", glFragmentMaterialfvSGIX == NULL);\r\n  glewInfoFunc(\"glFragmentMaterialiSGIX\", glFragmentMaterialiSGIX == NULL);\r\n  glewInfoFunc(\"glFragmentMaterialivSGIX\", glFragmentMaterialivSGIX == NULL);\r\n  glewInfoFunc(\"glGetFragmentLightfvSGIX\", glGetFragmentLightfvSGIX == NULL);\r\n  glewInfoFunc(\"glGetFragmentLightivSGIX\", glGetFragmentLightivSGIX == NULL);\r\n  glewInfoFunc(\"glGetFragmentMaterialfvSGIX\", glGetFragmentMaterialfvSGIX == NULL);\r\n  glewInfoFunc(\"glGetFragmentMaterialivSGIX\", glGetFragmentMaterialivSGIX == NULL);\r\n}\r\n\r\n#endif /* GL_SGIX_fragment_specular_lighting */\r\n\r\n#ifdef GL_SGIX_framezoom\r\n\r\nstatic void _glewInfo_GL_SGIX_framezoom (void)\r\n{\r\n  glewPrintExt(\"GL_SGIX_framezoom\", GLEW_SGIX_framezoom, glewIsSupported(\"GL_SGIX_framezoom\"), glewGetExtension(\"GL_SGIX_framezoom\"));\r\n\r\n  glewInfoFunc(\"glFrameZoomSGIX\", glFrameZoomSGIX == NULL);\r\n}\r\n\r\n#endif /* GL_SGIX_framezoom */\r\n\r\n#ifdef GL_SGIX_interlace\r\n\r\nstatic void _glewInfo_GL_SGIX_interlace (void)\r\n{\r\n  glewPrintExt(\"GL_SGIX_interlace\", GLEW_SGIX_interlace, glewIsSupported(\"GL_SGIX_interlace\"), glewGetExtension(\"GL_SGIX_interlace\"));\r\n}\r\n\r\n#endif /* GL_SGIX_interlace */\r\n\r\n#ifdef GL_SGIX_ir_instrument1\r\n\r\nstatic void _glewInfo_GL_SGIX_ir_instrument1 (void)\r\n{\r\n  glewPrintExt(\"GL_SGIX_ir_instrument1\", GLEW_SGIX_ir_instrument1, glewIsSupported(\"GL_SGIX_ir_instrument1\"), glewGetExtension(\"GL_SGIX_ir_instrument1\"));\r\n}\r\n\r\n#endif /* GL_SGIX_ir_instrument1 */\r\n\r\n#ifdef GL_SGIX_list_priority\r\n\r\nstatic void _glewInfo_GL_SGIX_list_priority (void)\r\n{\r\n  glewPrintExt(\"GL_SGIX_list_priority\", GLEW_SGIX_list_priority, glewIsSupported(\"GL_SGIX_list_priority\"), glewGetExtension(\"GL_SGIX_list_priority\"));\r\n}\r\n\r\n#endif /* GL_SGIX_list_priority */\r\n\r\n#ifdef GL_SGIX_pixel_texture\r\n\r\nstatic void _glewInfo_GL_SGIX_pixel_texture (void)\r\n{\r\n  glewPrintExt(\"GL_SGIX_pixel_texture\", GLEW_SGIX_pixel_texture, glewIsSupported(\"GL_SGIX_pixel_texture\"), glewGetExtension(\"GL_SGIX_pixel_texture\"));\r\n\r\n  glewInfoFunc(\"glPixelTexGenSGIX\", glPixelTexGenSGIX == NULL);\r\n}\r\n\r\n#endif /* GL_SGIX_pixel_texture */\r\n\r\n#ifdef GL_SGIX_pixel_texture_bits\r\n\r\nstatic void _glewInfo_GL_SGIX_pixel_texture_bits (void)\r\n{\r\n  glewPrintExt(\"GL_SGIX_pixel_texture_bits\", GLEW_SGIX_pixel_texture_bits, glewIsSupported(\"GL_SGIX_pixel_texture_bits\"), glewGetExtension(\"GL_SGIX_pixel_texture_bits\"));\r\n}\r\n\r\n#endif /* GL_SGIX_pixel_texture_bits */\r\n\r\n#ifdef GL_SGIX_reference_plane\r\n\r\nstatic void _glewInfo_GL_SGIX_reference_plane (void)\r\n{\r\n  glewPrintExt(\"GL_SGIX_reference_plane\", GLEW_SGIX_reference_plane, glewIsSupported(\"GL_SGIX_reference_plane\"), glewGetExtension(\"GL_SGIX_reference_plane\"));\r\n\r\n  glewInfoFunc(\"glReferencePlaneSGIX\", glReferencePlaneSGIX == NULL);\r\n}\r\n\r\n#endif /* GL_SGIX_reference_plane */\r\n\r\n#ifdef GL_SGIX_resample\r\n\r\nstatic void _glewInfo_GL_SGIX_resample (void)\r\n{\r\n  glewPrintExt(\"GL_SGIX_resample\", GLEW_SGIX_resample, glewIsSupported(\"GL_SGIX_resample\"), glewGetExtension(\"GL_SGIX_resample\"));\r\n}\r\n\r\n#endif /* GL_SGIX_resample */\r\n\r\n#ifdef GL_SGIX_shadow\r\n\r\nstatic void _glewInfo_GL_SGIX_shadow (void)\r\n{\r\n  glewPrintExt(\"GL_SGIX_shadow\", GLEW_SGIX_shadow, glewIsSupported(\"GL_SGIX_shadow\"), glewGetExtension(\"GL_SGIX_shadow\"));\r\n}\r\n\r\n#endif /* GL_SGIX_shadow */\r\n\r\n#ifdef GL_SGIX_shadow_ambient\r\n\r\nstatic void _glewInfo_GL_SGIX_shadow_ambient (void)\r\n{\r\n  glewPrintExt(\"GL_SGIX_shadow_ambient\", GLEW_SGIX_shadow_ambient, glewIsSupported(\"GL_SGIX_shadow_ambient\"), glewGetExtension(\"GL_SGIX_shadow_ambient\"));\r\n}\r\n\r\n#endif /* GL_SGIX_shadow_ambient */\r\n\r\n#ifdef GL_SGIX_sprite\r\n\r\nstatic void _glewInfo_GL_SGIX_sprite (void)\r\n{\r\n  glewPrintExt(\"GL_SGIX_sprite\", GLEW_SGIX_sprite, glewIsSupported(\"GL_SGIX_sprite\"), glewGetExtension(\"GL_SGIX_sprite\"));\r\n\r\n  glewInfoFunc(\"glSpriteParameterfSGIX\", glSpriteParameterfSGIX == NULL);\r\n  glewInfoFunc(\"glSpriteParameterfvSGIX\", glSpriteParameterfvSGIX == NULL);\r\n  glewInfoFunc(\"glSpriteParameteriSGIX\", glSpriteParameteriSGIX == NULL);\r\n  glewInfoFunc(\"glSpriteParameterivSGIX\", glSpriteParameterivSGIX == NULL);\r\n}\r\n\r\n#endif /* GL_SGIX_sprite */\r\n\r\n#ifdef GL_SGIX_tag_sample_buffer\r\n\r\nstatic void _glewInfo_GL_SGIX_tag_sample_buffer (void)\r\n{\r\n  glewPrintExt(\"GL_SGIX_tag_sample_buffer\", GLEW_SGIX_tag_sample_buffer, glewIsSupported(\"GL_SGIX_tag_sample_buffer\"), glewGetExtension(\"GL_SGIX_tag_sample_buffer\"));\r\n\r\n  glewInfoFunc(\"glTagSampleBufferSGIX\", glTagSampleBufferSGIX == NULL);\r\n}\r\n\r\n#endif /* GL_SGIX_tag_sample_buffer */\r\n\r\n#ifdef GL_SGIX_texture_add_env\r\n\r\nstatic void _glewInfo_GL_SGIX_texture_add_env (void)\r\n{\r\n  glewPrintExt(\"GL_SGIX_texture_add_env\", GLEW_SGIX_texture_add_env, glewIsSupported(\"GL_SGIX_texture_add_env\"), glewGetExtension(\"GL_SGIX_texture_add_env\"));\r\n}\r\n\r\n#endif /* GL_SGIX_texture_add_env */\r\n\r\n#ifdef GL_SGIX_texture_coordinate_clamp\r\n\r\nstatic void _glewInfo_GL_SGIX_texture_coordinate_clamp (void)\r\n{\r\n  glewPrintExt(\"GL_SGIX_texture_coordinate_clamp\", GLEW_SGIX_texture_coordinate_clamp, glewIsSupported(\"GL_SGIX_texture_coordinate_clamp\"), glewGetExtension(\"GL_SGIX_texture_coordinate_clamp\"));\r\n}\r\n\r\n#endif /* GL_SGIX_texture_coordinate_clamp */\r\n\r\n#ifdef GL_SGIX_texture_lod_bias\r\n\r\nstatic void _glewInfo_GL_SGIX_texture_lod_bias (void)\r\n{\r\n  glewPrintExt(\"GL_SGIX_texture_lod_bias\", GLEW_SGIX_texture_lod_bias, glewIsSupported(\"GL_SGIX_texture_lod_bias\"), glewGetExtension(\"GL_SGIX_texture_lod_bias\"));\r\n}\r\n\r\n#endif /* GL_SGIX_texture_lod_bias */\r\n\r\n#ifdef GL_SGIX_texture_multi_buffer\r\n\r\nstatic void _glewInfo_GL_SGIX_texture_multi_buffer (void)\r\n{\r\n  glewPrintExt(\"GL_SGIX_texture_multi_buffer\", GLEW_SGIX_texture_multi_buffer, glewIsSupported(\"GL_SGIX_texture_multi_buffer\"), glewGetExtension(\"GL_SGIX_texture_multi_buffer\"));\r\n}\r\n\r\n#endif /* GL_SGIX_texture_multi_buffer */\r\n\r\n#ifdef GL_SGIX_texture_range\r\n\r\nstatic void _glewInfo_GL_SGIX_texture_range (void)\r\n{\r\n  glewPrintExt(\"GL_SGIX_texture_range\", GLEW_SGIX_texture_range, glewIsSupported(\"GL_SGIX_texture_range\"), glewGetExtension(\"GL_SGIX_texture_range\"));\r\n}\r\n\r\n#endif /* GL_SGIX_texture_range */\r\n\r\n#ifdef GL_SGIX_texture_scale_bias\r\n\r\nstatic void _glewInfo_GL_SGIX_texture_scale_bias (void)\r\n{\r\n  glewPrintExt(\"GL_SGIX_texture_scale_bias\", GLEW_SGIX_texture_scale_bias, glewIsSupported(\"GL_SGIX_texture_scale_bias\"), glewGetExtension(\"GL_SGIX_texture_scale_bias\"));\r\n}\r\n\r\n#endif /* GL_SGIX_texture_scale_bias */\r\n\r\n#ifdef GL_SGIX_vertex_preclip\r\n\r\nstatic void _glewInfo_GL_SGIX_vertex_preclip (void)\r\n{\r\n  glewPrintExt(\"GL_SGIX_vertex_preclip\", GLEW_SGIX_vertex_preclip, glewIsSupported(\"GL_SGIX_vertex_preclip\"), glewGetExtension(\"GL_SGIX_vertex_preclip\"));\r\n}\r\n\r\n#endif /* GL_SGIX_vertex_preclip */\r\n\r\n#ifdef GL_SGIX_vertex_preclip_hint\r\n\r\nstatic void _glewInfo_GL_SGIX_vertex_preclip_hint (void)\r\n{\r\n  glewPrintExt(\"GL_SGIX_vertex_preclip_hint\", GLEW_SGIX_vertex_preclip_hint, glewIsSupported(\"GL_SGIX_vertex_preclip_hint\"), glewGetExtension(\"GL_SGIX_vertex_preclip_hint\"));\r\n}\r\n\r\n#endif /* GL_SGIX_vertex_preclip_hint */\r\n\r\n#ifdef GL_SGIX_ycrcb\r\n\r\nstatic void _glewInfo_GL_SGIX_ycrcb (void)\r\n{\r\n  glewPrintExt(\"GL_SGIX_ycrcb\", GLEW_SGIX_ycrcb, glewIsSupported(\"GL_SGIX_ycrcb\"), glewGetExtension(\"GL_SGIX_ycrcb\"));\r\n}\r\n\r\n#endif /* GL_SGIX_ycrcb */\r\n\r\n#ifdef GL_SGI_color_matrix\r\n\r\nstatic void _glewInfo_GL_SGI_color_matrix (void)\r\n{\r\n  glewPrintExt(\"GL_SGI_color_matrix\", GLEW_SGI_color_matrix, glewIsSupported(\"GL_SGI_color_matrix\"), glewGetExtension(\"GL_SGI_color_matrix\"));\r\n}\r\n\r\n#endif /* GL_SGI_color_matrix */\r\n\r\n#ifdef GL_SGI_color_table\r\n\r\nstatic void _glewInfo_GL_SGI_color_table (void)\r\n{\r\n  glewPrintExt(\"GL_SGI_color_table\", GLEW_SGI_color_table, glewIsSupported(\"GL_SGI_color_table\"), glewGetExtension(\"GL_SGI_color_table\"));\r\n\r\n  glewInfoFunc(\"glColorTableParameterfvSGI\", glColorTableParameterfvSGI == NULL);\r\n  glewInfoFunc(\"glColorTableParameterivSGI\", glColorTableParameterivSGI == NULL);\r\n  glewInfoFunc(\"glColorTableSGI\", glColorTableSGI == NULL);\r\n  glewInfoFunc(\"glCopyColorTableSGI\", glCopyColorTableSGI == NULL);\r\n  glewInfoFunc(\"glGetColorTableParameterfvSGI\", glGetColorTableParameterfvSGI == NULL);\r\n  glewInfoFunc(\"glGetColorTableParameterivSGI\", glGetColorTableParameterivSGI == NULL);\r\n  glewInfoFunc(\"glGetColorTableSGI\", glGetColorTableSGI == NULL);\r\n}\r\n\r\n#endif /* GL_SGI_color_table */\r\n\r\n#ifdef GL_SGI_texture_color_table\r\n\r\nstatic void _glewInfo_GL_SGI_texture_color_table (void)\r\n{\r\n  glewPrintExt(\"GL_SGI_texture_color_table\", GLEW_SGI_texture_color_table, glewIsSupported(\"GL_SGI_texture_color_table\"), glewGetExtension(\"GL_SGI_texture_color_table\"));\r\n}\r\n\r\n#endif /* GL_SGI_texture_color_table */\r\n\r\n#ifdef GL_SUNX_constant_data\r\n\r\nstatic void _glewInfo_GL_SUNX_constant_data (void)\r\n{\r\n  glewPrintExt(\"GL_SUNX_constant_data\", GLEW_SUNX_constant_data, glewIsSupported(\"GL_SUNX_constant_data\"), glewGetExtension(\"GL_SUNX_constant_data\"));\r\n\r\n  glewInfoFunc(\"glFinishTextureSUNX\", glFinishTextureSUNX == NULL);\r\n}\r\n\r\n#endif /* GL_SUNX_constant_data */\r\n\r\n#ifdef GL_SUN_convolution_border_modes\r\n\r\nstatic void _glewInfo_GL_SUN_convolution_border_modes (void)\r\n{\r\n  glewPrintExt(\"GL_SUN_convolution_border_modes\", GLEW_SUN_convolution_border_modes, glewIsSupported(\"GL_SUN_convolution_border_modes\"), glewGetExtension(\"GL_SUN_convolution_border_modes\"));\r\n}\r\n\r\n#endif /* GL_SUN_convolution_border_modes */\r\n\r\n#ifdef GL_SUN_global_alpha\r\n\r\nstatic void _glewInfo_GL_SUN_global_alpha (void)\r\n{\r\n  glewPrintExt(\"GL_SUN_global_alpha\", GLEW_SUN_global_alpha, glewIsSupported(\"GL_SUN_global_alpha\"), glewGetExtension(\"GL_SUN_global_alpha\"));\r\n\r\n  glewInfoFunc(\"glGlobalAlphaFactorbSUN\", glGlobalAlphaFactorbSUN == NULL);\r\n  glewInfoFunc(\"glGlobalAlphaFactordSUN\", glGlobalAlphaFactordSUN == NULL);\r\n  glewInfoFunc(\"glGlobalAlphaFactorfSUN\", glGlobalAlphaFactorfSUN == NULL);\r\n  glewInfoFunc(\"glGlobalAlphaFactoriSUN\", glGlobalAlphaFactoriSUN == NULL);\r\n  glewInfoFunc(\"glGlobalAlphaFactorsSUN\", glGlobalAlphaFactorsSUN == NULL);\r\n  glewInfoFunc(\"glGlobalAlphaFactorubSUN\", glGlobalAlphaFactorubSUN == NULL);\r\n  glewInfoFunc(\"glGlobalAlphaFactoruiSUN\", glGlobalAlphaFactoruiSUN == NULL);\r\n  glewInfoFunc(\"glGlobalAlphaFactorusSUN\", glGlobalAlphaFactorusSUN == NULL);\r\n}\r\n\r\n#endif /* GL_SUN_global_alpha */\r\n\r\n#ifdef GL_SUN_mesh_array\r\n\r\nstatic void _glewInfo_GL_SUN_mesh_array (void)\r\n{\r\n  glewPrintExt(\"GL_SUN_mesh_array\", GLEW_SUN_mesh_array, glewIsSupported(\"GL_SUN_mesh_array\"), glewGetExtension(\"GL_SUN_mesh_array\"));\r\n}\r\n\r\n#endif /* GL_SUN_mesh_array */\r\n\r\n#ifdef GL_SUN_read_video_pixels\r\n\r\nstatic void _glewInfo_GL_SUN_read_video_pixels (void)\r\n{\r\n  glewPrintExt(\"GL_SUN_read_video_pixels\", GLEW_SUN_read_video_pixels, glewIsSupported(\"GL_SUN_read_video_pixels\"), glewGetExtension(\"GL_SUN_read_video_pixels\"));\r\n\r\n  glewInfoFunc(\"glReadVideoPixelsSUN\", glReadVideoPixelsSUN == NULL);\r\n}\r\n\r\n#endif /* GL_SUN_read_video_pixels */\r\n\r\n#ifdef GL_SUN_slice_accum\r\n\r\nstatic void _glewInfo_GL_SUN_slice_accum (void)\r\n{\r\n  glewPrintExt(\"GL_SUN_slice_accum\", GLEW_SUN_slice_accum, glewIsSupported(\"GL_SUN_slice_accum\"), glewGetExtension(\"GL_SUN_slice_accum\"));\r\n}\r\n\r\n#endif /* GL_SUN_slice_accum */\r\n\r\n#ifdef GL_SUN_triangle_list\r\n\r\nstatic void _glewInfo_GL_SUN_triangle_list (void)\r\n{\r\n  glewPrintExt(\"GL_SUN_triangle_list\", GLEW_SUN_triangle_list, glewIsSupported(\"GL_SUN_triangle_list\"), glewGetExtension(\"GL_SUN_triangle_list\"));\r\n\r\n  glewInfoFunc(\"glReplacementCodePointerSUN\", glReplacementCodePointerSUN == NULL);\r\n  glewInfoFunc(\"glReplacementCodeubSUN\", glReplacementCodeubSUN == NULL);\r\n  glewInfoFunc(\"glReplacementCodeubvSUN\", glReplacementCodeubvSUN == NULL);\r\n  glewInfoFunc(\"glReplacementCodeuiSUN\", glReplacementCodeuiSUN == NULL);\r\n  glewInfoFunc(\"glReplacementCodeuivSUN\", glReplacementCodeuivSUN == NULL);\r\n  glewInfoFunc(\"glReplacementCodeusSUN\", glReplacementCodeusSUN == NULL);\r\n  glewInfoFunc(\"glReplacementCodeusvSUN\", glReplacementCodeusvSUN == NULL);\r\n}\r\n\r\n#endif /* GL_SUN_triangle_list */\r\n\r\n#ifdef GL_SUN_vertex\r\n\r\nstatic void _glewInfo_GL_SUN_vertex (void)\r\n{\r\n  glewPrintExt(\"GL_SUN_vertex\", GLEW_SUN_vertex, glewIsSupported(\"GL_SUN_vertex\"), glewGetExtension(\"GL_SUN_vertex\"));\r\n\r\n  glewInfoFunc(\"glColor3fVertex3fSUN\", glColor3fVertex3fSUN == NULL);\r\n  glewInfoFunc(\"glColor3fVertex3fvSUN\", glColor3fVertex3fvSUN == NULL);\r\n  glewInfoFunc(\"glColor4fNormal3fVertex3fSUN\", glColor4fNormal3fVertex3fSUN == NULL);\r\n  glewInfoFunc(\"glColor4fNormal3fVertex3fvSUN\", glColor4fNormal3fVertex3fvSUN == NULL);\r\n  glewInfoFunc(\"glColor4ubVertex2fSUN\", glColor4ubVertex2fSUN == NULL);\r\n  glewInfoFunc(\"glColor4ubVertex2fvSUN\", glColor4ubVertex2fvSUN == NULL);\r\n  glewInfoFunc(\"glColor4ubVertex3fSUN\", glColor4ubVertex3fSUN == NULL);\r\n  glewInfoFunc(\"glColor4ubVertex3fvSUN\", glColor4ubVertex3fvSUN == NULL);\r\n  glewInfoFunc(\"glNormal3fVertex3fSUN\", glNormal3fVertex3fSUN == NULL);\r\n  glewInfoFunc(\"glNormal3fVertex3fvSUN\", glNormal3fVertex3fvSUN == NULL);\r\n  glewInfoFunc(\"glReplacementCodeuiColor3fVertex3fSUN\", glReplacementCodeuiColor3fVertex3fSUN == NULL);\r\n  glewInfoFunc(\"glReplacementCodeuiColor3fVertex3fvSUN\", glReplacementCodeuiColor3fVertex3fvSUN == NULL);\r\n  glewInfoFunc(\"glReplacementCodeuiColor4fNormal3fVertex3fSUN\", glReplacementCodeuiColor4fNormal3fVertex3fSUN == NULL);\r\n  glewInfoFunc(\"glReplacementCodeuiColor4fNormal3fVertex3fvSUN\", glReplacementCodeuiColor4fNormal3fVertex3fvSUN == NULL);\r\n  glewInfoFunc(\"glReplacementCodeuiColor4ubVertex3fSUN\", glReplacementCodeuiColor4ubVertex3fSUN == NULL);\r\n  glewInfoFunc(\"glReplacementCodeuiColor4ubVertex3fvSUN\", glReplacementCodeuiColor4ubVertex3fvSUN == NULL);\r\n  glewInfoFunc(\"glReplacementCodeuiNormal3fVertex3fSUN\", glReplacementCodeuiNormal3fVertex3fSUN == NULL);\r\n  glewInfoFunc(\"glReplacementCodeuiNormal3fVertex3fvSUN\", glReplacementCodeuiNormal3fVertex3fvSUN == NULL);\r\n  glewInfoFunc(\"glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN\", glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN == NULL);\r\n  glewInfoFunc(\"glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN\", glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN == NULL);\r\n  glewInfoFunc(\"glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN\", glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN == NULL);\r\n  glewInfoFunc(\"glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN\", glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN == NULL);\r\n  glewInfoFunc(\"glReplacementCodeuiTexCoord2fVertex3fSUN\", glReplacementCodeuiTexCoord2fVertex3fSUN == NULL);\r\n  glewInfoFunc(\"glReplacementCodeuiTexCoord2fVertex3fvSUN\", glReplacementCodeuiTexCoord2fVertex3fvSUN == NULL);\r\n  glewInfoFunc(\"glReplacementCodeuiVertex3fSUN\", glReplacementCodeuiVertex3fSUN == NULL);\r\n  glewInfoFunc(\"glReplacementCodeuiVertex3fvSUN\", glReplacementCodeuiVertex3fvSUN == NULL);\r\n  glewInfoFunc(\"glTexCoord2fColor3fVertex3fSUN\", glTexCoord2fColor3fVertex3fSUN == NULL);\r\n  glewInfoFunc(\"glTexCoord2fColor3fVertex3fvSUN\", glTexCoord2fColor3fVertex3fvSUN == NULL);\r\n  glewInfoFunc(\"glTexCoord2fColor4fNormal3fVertex3fSUN\", glTexCoord2fColor4fNormal3fVertex3fSUN == NULL);\r\n  glewInfoFunc(\"glTexCoord2fColor4fNormal3fVertex3fvSUN\", glTexCoord2fColor4fNormal3fVertex3fvSUN == NULL);\r\n  glewInfoFunc(\"glTexCoord2fColor4ubVertex3fSUN\", glTexCoord2fColor4ubVertex3fSUN == NULL);\r\n  glewInfoFunc(\"glTexCoord2fColor4ubVertex3fvSUN\", glTexCoord2fColor4ubVertex3fvSUN == NULL);\r\n  glewInfoFunc(\"glTexCoord2fNormal3fVertex3fSUN\", glTexCoord2fNormal3fVertex3fSUN == NULL);\r\n  glewInfoFunc(\"glTexCoord2fNormal3fVertex3fvSUN\", glTexCoord2fNormal3fVertex3fvSUN == NULL);\r\n  glewInfoFunc(\"glTexCoord2fVertex3fSUN\", glTexCoord2fVertex3fSUN == NULL);\r\n  glewInfoFunc(\"glTexCoord2fVertex3fvSUN\", glTexCoord2fVertex3fvSUN == NULL);\r\n  glewInfoFunc(\"glTexCoord4fColor4fNormal3fVertex4fSUN\", glTexCoord4fColor4fNormal3fVertex4fSUN == NULL);\r\n  glewInfoFunc(\"glTexCoord4fColor4fNormal3fVertex4fvSUN\", glTexCoord4fColor4fNormal3fVertex4fvSUN == NULL);\r\n  glewInfoFunc(\"glTexCoord4fVertex4fSUN\", glTexCoord4fVertex4fSUN == NULL);\r\n  glewInfoFunc(\"glTexCoord4fVertex4fvSUN\", glTexCoord4fVertex4fvSUN == NULL);\r\n}\r\n\r\n#endif /* GL_SUN_vertex */\r\n\r\n#ifdef GL_WIN_phong_shading\r\n\r\nstatic void _glewInfo_GL_WIN_phong_shading (void)\r\n{\r\n  glewPrintExt(\"GL_WIN_phong_shading\", GLEW_WIN_phong_shading, glewIsSupported(\"GL_WIN_phong_shading\"), glewGetExtension(\"GL_WIN_phong_shading\"));\r\n}\r\n\r\n#endif /* GL_WIN_phong_shading */\r\n\r\n#ifdef GL_WIN_specular_fog\r\n\r\nstatic void _glewInfo_GL_WIN_specular_fog (void)\r\n{\r\n  glewPrintExt(\"GL_WIN_specular_fog\", GLEW_WIN_specular_fog, glewIsSupported(\"GL_WIN_specular_fog\"), glewGetExtension(\"GL_WIN_specular_fog\"));\r\n}\r\n\r\n#endif /* GL_WIN_specular_fog */\r\n\r\n#ifdef GL_WIN_swap_hint\r\n\r\nstatic void _glewInfo_GL_WIN_swap_hint (void)\r\n{\r\n  glewPrintExt(\"GL_WIN_swap_hint\", GLEW_WIN_swap_hint, glewIsSupported(\"GL_WIN_swap_hint\"), glewGetExtension(\"GL_WIN_swap_hint\"));\r\n\r\n  glewInfoFunc(\"glAddSwapHintRectWIN\", glAddSwapHintRectWIN == NULL);\r\n}\r\n\r\n#endif /* GL_WIN_swap_hint */\r\n\r\n#ifdef _WIN32\r\n\r\n#ifdef WGL_3DFX_multisample\r\n\r\nstatic void _glewInfo_WGL_3DFX_multisample (void)\r\n{\r\n  glewPrintExt(\"WGL_3DFX_multisample\", WGLEW_3DFX_multisample, wglewIsSupported(\"WGL_3DFX_multisample\"), wglewGetExtension(\"WGL_3DFX_multisample\"));\r\n}\r\n\r\n#endif /* WGL_3DFX_multisample */\r\n\r\n#ifdef WGL_3DL_stereo_control\r\n\r\nstatic void _glewInfo_WGL_3DL_stereo_control (void)\r\n{\r\n  glewPrintExt(\"WGL_3DL_stereo_control\", WGLEW_3DL_stereo_control, wglewIsSupported(\"WGL_3DL_stereo_control\"), wglewGetExtension(\"WGL_3DL_stereo_control\"));\r\n\r\n  glewInfoFunc(\"wglSetStereoEmitterState3DL\", wglSetStereoEmitterState3DL == NULL);\r\n}\r\n\r\n#endif /* WGL_3DL_stereo_control */\r\n\r\n#ifdef WGL_AMD_gpu_association\r\n\r\nstatic void _glewInfo_WGL_AMD_gpu_association (void)\r\n{\r\n  glewPrintExt(\"WGL_AMD_gpu_association\", WGLEW_AMD_gpu_association, wglewIsSupported(\"WGL_AMD_gpu_association\"), wglewGetExtension(\"WGL_AMD_gpu_association\"));\r\n\r\n  glewInfoFunc(\"wglBlitContextFramebufferAMD\", wglBlitContextFramebufferAMD == NULL);\r\n  glewInfoFunc(\"wglCreateAssociatedContextAMD\", wglCreateAssociatedContextAMD == NULL);\r\n  glewInfoFunc(\"wglCreateAssociatedContextAttribsAMD\", wglCreateAssociatedContextAttribsAMD == NULL);\r\n  glewInfoFunc(\"wglDeleteAssociatedContextAMD\", wglDeleteAssociatedContextAMD == NULL);\r\n  glewInfoFunc(\"wglGetContextGPUIDAMD\", wglGetContextGPUIDAMD == NULL);\r\n  glewInfoFunc(\"wglGetCurrentAssociatedContextAMD\", wglGetCurrentAssociatedContextAMD == NULL);\r\n  glewInfoFunc(\"wglGetGPUIDsAMD\", wglGetGPUIDsAMD == NULL);\r\n  glewInfoFunc(\"wglGetGPUInfoAMD\", wglGetGPUInfoAMD == NULL);\r\n  glewInfoFunc(\"wglMakeAssociatedContextCurrentAMD\", wglMakeAssociatedContextCurrentAMD == NULL);\r\n}\r\n\r\n#endif /* WGL_AMD_gpu_association */\r\n\r\n#ifdef WGL_ARB_buffer_region\r\n\r\nstatic void _glewInfo_WGL_ARB_buffer_region (void)\r\n{\r\n  glewPrintExt(\"WGL_ARB_buffer_region\", WGLEW_ARB_buffer_region, wglewIsSupported(\"WGL_ARB_buffer_region\"), wglewGetExtension(\"WGL_ARB_buffer_region\"));\r\n\r\n  glewInfoFunc(\"wglCreateBufferRegionARB\", wglCreateBufferRegionARB == NULL);\r\n  glewInfoFunc(\"wglDeleteBufferRegionARB\", wglDeleteBufferRegionARB == NULL);\r\n  glewInfoFunc(\"wglRestoreBufferRegionARB\", wglRestoreBufferRegionARB == NULL);\r\n  glewInfoFunc(\"wglSaveBufferRegionARB\", wglSaveBufferRegionARB == NULL);\r\n}\r\n\r\n#endif /* WGL_ARB_buffer_region */\r\n\r\n#ifdef WGL_ARB_create_context\r\n\r\nstatic void _glewInfo_WGL_ARB_create_context (void)\r\n{\r\n  glewPrintExt(\"WGL_ARB_create_context\", WGLEW_ARB_create_context, wglewIsSupported(\"WGL_ARB_create_context\"), wglewGetExtension(\"WGL_ARB_create_context\"));\r\n\r\n  glewInfoFunc(\"wglCreateContextAttribsARB\", wglCreateContextAttribsARB == NULL);\r\n}\r\n\r\n#endif /* WGL_ARB_create_context */\r\n\r\n#ifdef WGL_ARB_create_context_profile\r\n\r\nstatic void _glewInfo_WGL_ARB_create_context_profile (void)\r\n{\r\n  glewPrintExt(\"WGL_ARB_create_context_profile\", WGLEW_ARB_create_context_profile, wglewIsSupported(\"WGL_ARB_create_context_profile\"), wglewGetExtension(\"WGL_ARB_create_context_profile\"));\r\n}\r\n\r\n#endif /* WGL_ARB_create_context_profile */\r\n\r\n#ifdef WGL_ARB_extensions_string\r\n\r\nstatic void _glewInfo_WGL_ARB_extensions_string (void)\r\n{\r\n  glewPrintExt(\"WGL_ARB_extensions_string\", WGLEW_ARB_extensions_string, wglewIsSupported(\"WGL_ARB_extensions_string\"), wglewGetExtension(\"WGL_ARB_extensions_string\"));\r\n\r\n  glewInfoFunc(\"wglGetExtensionsStringARB\", wglGetExtensionsStringARB == NULL);\r\n}\r\n\r\n#endif /* WGL_ARB_extensions_string */\r\n\r\n#ifdef WGL_ARB_framebuffer_sRGB\r\n\r\nstatic void _glewInfo_WGL_ARB_framebuffer_sRGB (void)\r\n{\r\n  glewPrintExt(\"WGL_ARB_framebuffer_sRGB\", WGLEW_ARB_framebuffer_sRGB, wglewIsSupported(\"WGL_ARB_framebuffer_sRGB\"), wglewGetExtension(\"WGL_ARB_framebuffer_sRGB\"));\r\n}\r\n\r\n#endif /* WGL_ARB_framebuffer_sRGB */\r\n\r\n#ifdef WGL_ARB_make_current_read\r\n\r\nstatic void _glewInfo_WGL_ARB_make_current_read (void)\r\n{\r\n  glewPrintExt(\"WGL_ARB_make_current_read\", WGLEW_ARB_make_current_read, wglewIsSupported(\"WGL_ARB_make_current_read\"), wglewGetExtension(\"WGL_ARB_make_current_read\"));\r\n\r\n  glewInfoFunc(\"wglGetCurrentReadDCARB\", wglGetCurrentReadDCARB == NULL);\r\n  glewInfoFunc(\"wglMakeContextCurrentARB\", wglMakeContextCurrentARB == NULL);\r\n}\r\n\r\n#endif /* WGL_ARB_make_current_read */\r\n\r\n#ifdef WGL_ARB_multisample\r\n\r\nstatic void _glewInfo_WGL_ARB_multisample (void)\r\n{\r\n  glewPrintExt(\"WGL_ARB_multisample\", WGLEW_ARB_multisample, wglewIsSupported(\"WGL_ARB_multisample\"), wglewGetExtension(\"WGL_ARB_multisample\"));\r\n}\r\n\r\n#endif /* WGL_ARB_multisample */\r\n\r\n#ifdef WGL_ARB_pbuffer\r\n\r\nstatic void _glewInfo_WGL_ARB_pbuffer (void)\r\n{\r\n  glewPrintExt(\"WGL_ARB_pbuffer\", WGLEW_ARB_pbuffer, wglewIsSupported(\"WGL_ARB_pbuffer\"), wglewGetExtension(\"WGL_ARB_pbuffer\"));\r\n\r\n  glewInfoFunc(\"wglCreatePbufferARB\", wglCreatePbufferARB == NULL);\r\n  glewInfoFunc(\"wglDestroyPbufferARB\", wglDestroyPbufferARB == NULL);\r\n  glewInfoFunc(\"wglGetPbufferDCARB\", wglGetPbufferDCARB == NULL);\r\n  glewInfoFunc(\"wglQueryPbufferARB\", wglQueryPbufferARB == NULL);\r\n  glewInfoFunc(\"wglReleasePbufferDCARB\", wglReleasePbufferDCARB == NULL);\r\n}\r\n\r\n#endif /* WGL_ARB_pbuffer */\r\n\r\n#ifdef WGL_ARB_pixel_format\r\n\r\nstatic void _glewInfo_WGL_ARB_pixel_format (void)\r\n{\r\n  glewPrintExt(\"WGL_ARB_pixel_format\", WGLEW_ARB_pixel_format, wglewIsSupported(\"WGL_ARB_pixel_format\"), wglewGetExtension(\"WGL_ARB_pixel_format\"));\r\n\r\n  glewInfoFunc(\"wglChoosePixelFormatARB\", wglChoosePixelFormatARB == NULL);\r\n  glewInfoFunc(\"wglGetPixelFormatAttribfvARB\", wglGetPixelFormatAttribfvARB == NULL);\r\n  glewInfoFunc(\"wglGetPixelFormatAttribivARB\", wglGetPixelFormatAttribivARB == NULL);\r\n}\r\n\r\n#endif /* WGL_ARB_pixel_format */\r\n\r\n#ifdef WGL_ARB_pixel_format_float\r\n\r\nstatic void _glewInfo_WGL_ARB_pixel_format_float (void)\r\n{\r\n  glewPrintExt(\"WGL_ARB_pixel_format_float\", WGLEW_ARB_pixel_format_float, wglewIsSupported(\"WGL_ARB_pixel_format_float\"), wglewGetExtension(\"WGL_ARB_pixel_format_float\"));\r\n}\r\n\r\n#endif /* WGL_ARB_pixel_format_float */\r\n\r\n#ifdef WGL_ARB_render_texture\r\n\r\nstatic void _glewInfo_WGL_ARB_render_texture (void)\r\n{\r\n  glewPrintExt(\"WGL_ARB_render_texture\", WGLEW_ARB_render_texture, wglewIsSupported(\"WGL_ARB_render_texture\"), wglewGetExtension(\"WGL_ARB_render_texture\"));\r\n\r\n  glewInfoFunc(\"wglBindTexImageARB\", wglBindTexImageARB == NULL);\r\n  glewInfoFunc(\"wglReleaseTexImageARB\", wglReleaseTexImageARB == NULL);\r\n  glewInfoFunc(\"wglSetPbufferAttribARB\", wglSetPbufferAttribARB == NULL);\r\n}\r\n\r\n#endif /* WGL_ARB_render_texture */\r\n\r\n#ifdef WGL_ATI_pixel_format_float\r\n\r\nstatic void _glewInfo_WGL_ATI_pixel_format_float (void)\r\n{\r\n  glewPrintExt(\"WGL_ATI_pixel_format_float\", WGLEW_ATI_pixel_format_float, wglewIsSupported(\"WGL_ATI_pixel_format_float\"), wglewGetExtension(\"WGL_ATI_pixel_format_float\"));\r\n}\r\n\r\n#endif /* WGL_ATI_pixel_format_float */\r\n\r\n#ifdef WGL_ATI_render_texture_rectangle\r\n\r\nstatic void _glewInfo_WGL_ATI_render_texture_rectangle (void)\r\n{\r\n  glewPrintExt(\"WGL_ATI_render_texture_rectangle\", WGLEW_ATI_render_texture_rectangle, wglewIsSupported(\"WGL_ATI_render_texture_rectangle\"), wglewGetExtension(\"WGL_ATI_render_texture_rectangle\"));\r\n}\r\n\r\n#endif /* WGL_ATI_render_texture_rectangle */\r\n\r\n#ifdef WGL_EXT_depth_float\r\n\r\nstatic void _glewInfo_WGL_EXT_depth_float (void)\r\n{\r\n  glewPrintExt(\"WGL_EXT_depth_float\", WGLEW_EXT_depth_float, wglewIsSupported(\"WGL_EXT_depth_float\"), wglewGetExtension(\"WGL_EXT_depth_float\"));\r\n}\r\n\r\n#endif /* WGL_EXT_depth_float */\r\n\r\n#ifdef WGL_EXT_display_color_table\r\n\r\nstatic void _glewInfo_WGL_EXT_display_color_table (void)\r\n{\r\n  glewPrintExt(\"WGL_EXT_display_color_table\", WGLEW_EXT_display_color_table, wglewIsSupported(\"WGL_EXT_display_color_table\"), wglewGetExtension(\"WGL_EXT_display_color_table\"));\r\n\r\n  glewInfoFunc(\"wglBindDisplayColorTableEXT\", wglBindDisplayColorTableEXT == NULL);\r\n  glewInfoFunc(\"wglCreateDisplayColorTableEXT\", wglCreateDisplayColorTableEXT == NULL);\r\n  glewInfoFunc(\"wglDestroyDisplayColorTableEXT\", wglDestroyDisplayColorTableEXT == NULL);\r\n  glewInfoFunc(\"wglLoadDisplayColorTableEXT\", wglLoadDisplayColorTableEXT == NULL);\r\n}\r\n\r\n#endif /* WGL_EXT_display_color_table */\r\n\r\n#ifdef WGL_EXT_extensions_string\r\n\r\nstatic void _glewInfo_WGL_EXT_extensions_string (void)\r\n{\r\n  glewPrintExt(\"WGL_EXT_extensions_string\", WGLEW_EXT_extensions_string, wglewIsSupported(\"WGL_EXT_extensions_string\"), wglewGetExtension(\"WGL_EXT_extensions_string\"));\r\n\r\n  glewInfoFunc(\"wglGetExtensionsStringEXT\", wglGetExtensionsStringEXT == NULL);\r\n}\r\n\r\n#endif /* WGL_EXT_extensions_string */\r\n\r\n#ifdef WGL_EXT_framebuffer_sRGB\r\n\r\nstatic void _glewInfo_WGL_EXT_framebuffer_sRGB (void)\r\n{\r\n  glewPrintExt(\"WGL_EXT_framebuffer_sRGB\", WGLEW_EXT_framebuffer_sRGB, wglewIsSupported(\"WGL_EXT_framebuffer_sRGB\"), wglewGetExtension(\"WGL_EXT_framebuffer_sRGB\"));\r\n}\r\n\r\n#endif /* WGL_EXT_framebuffer_sRGB */\r\n\r\n#ifdef WGL_EXT_make_current_read\r\n\r\nstatic void _glewInfo_WGL_EXT_make_current_read (void)\r\n{\r\n  glewPrintExt(\"WGL_EXT_make_current_read\", WGLEW_EXT_make_current_read, wglewIsSupported(\"WGL_EXT_make_current_read\"), wglewGetExtension(\"WGL_EXT_make_current_read\"));\r\n\r\n  glewInfoFunc(\"wglGetCurrentReadDCEXT\", wglGetCurrentReadDCEXT == NULL);\r\n  glewInfoFunc(\"wglMakeContextCurrentEXT\", wglMakeContextCurrentEXT == NULL);\r\n}\r\n\r\n#endif /* WGL_EXT_make_current_read */\r\n\r\n#ifdef WGL_EXT_multisample\r\n\r\nstatic void _glewInfo_WGL_EXT_multisample (void)\r\n{\r\n  glewPrintExt(\"WGL_EXT_multisample\", WGLEW_EXT_multisample, wglewIsSupported(\"WGL_EXT_multisample\"), wglewGetExtension(\"WGL_EXT_multisample\"));\r\n}\r\n\r\n#endif /* WGL_EXT_multisample */\r\n\r\n#ifdef WGL_EXT_pbuffer\r\n\r\nstatic void _glewInfo_WGL_EXT_pbuffer (void)\r\n{\r\n  glewPrintExt(\"WGL_EXT_pbuffer\", WGLEW_EXT_pbuffer, wglewIsSupported(\"WGL_EXT_pbuffer\"), wglewGetExtension(\"WGL_EXT_pbuffer\"));\r\n\r\n  glewInfoFunc(\"wglCreatePbufferEXT\", wglCreatePbufferEXT == NULL);\r\n  glewInfoFunc(\"wglDestroyPbufferEXT\", wglDestroyPbufferEXT == NULL);\r\n  glewInfoFunc(\"wglGetPbufferDCEXT\", wglGetPbufferDCEXT == NULL);\r\n  glewInfoFunc(\"wglQueryPbufferEXT\", wglQueryPbufferEXT == NULL);\r\n  glewInfoFunc(\"wglReleasePbufferDCEXT\", wglReleasePbufferDCEXT == NULL);\r\n}\r\n\r\n#endif /* WGL_EXT_pbuffer */\r\n\r\n#ifdef WGL_EXT_pixel_format\r\n\r\nstatic void _glewInfo_WGL_EXT_pixel_format (void)\r\n{\r\n  glewPrintExt(\"WGL_EXT_pixel_format\", WGLEW_EXT_pixel_format, wglewIsSupported(\"WGL_EXT_pixel_format\"), wglewGetExtension(\"WGL_EXT_pixel_format\"));\r\n\r\n  glewInfoFunc(\"wglChoosePixelFormatEXT\", wglChoosePixelFormatEXT == NULL);\r\n  glewInfoFunc(\"wglGetPixelFormatAttribfvEXT\", wglGetPixelFormatAttribfvEXT == NULL);\r\n  glewInfoFunc(\"wglGetPixelFormatAttribivEXT\", wglGetPixelFormatAttribivEXT == NULL);\r\n}\r\n\r\n#endif /* WGL_EXT_pixel_format */\r\n\r\n#ifdef WGL_EXT_pixel_format_packed_float\r\n\r\nstatic void _glewInfo_WGL_EXT_pixel_format_packed_float (void)\r\n{\r\n  glewPrintExt(\"WGL_EXT_pixel_format_packed_float\", WGLEW_EXT_pixel_format_packed_float, wglewIsSupported(\"WGL_EXT_pixel_format_packed_float\"), wglewGetExtension(\"WGL_EXT_pixel_format_packed_float\"));\r\n}\r\n\r\n#endif /* WGL_EXT_pixel_format_packed_float */\r\n\r\n#ifdef WGL_EXT_swap_control\r\n\r\nstatic void _glewInfo_WGL_EXT_swap_control (void)\r\n{\r\n  glewPrintExt(\"WGL_EXT_swap_control\", WGLEW_EXT_swap_control, wglewIsSupported(\"WGL_EXT_swap_control\"), wglewGetExtension(\"WGL_EXT_swap_control\"));\r\n\r\n  glewInfoFunc(\"wglGetSwapIntervalEXT\", wglGetSwapIntervalEXT == NULL);\r\n  glewInfoFunc(\"wglSwapIntervalEXT\", wglSwapIntervalEXT == NULL);\r\n}\r\n\r\n#endif /* WGL_EXT_swap_control */\r\n\r\n#ifdef WGL_I3D_digital_video_control\r\n\r\nstatic void _glewInfo_WGL_I3D_digital_video_control (void)\r\n{\r\n  glewPrintExt(\"WGL_I3D_digital_video_control\", WGLEW_I3D_digital_video_control, wglewIsSupported(\"WGL_I3D_digital_video_control\"), wglewGetExtension(\"WGL_I3D_digital_video_control\"));\r\n\r\n  glewInfoFunc(\"wglGetDigitalVideoParametersI3D\", wglGetDigitalVideoParametersI3D == NULL);\r\n  glewInfoFunc(\"wglSetDigitalVideoParametersI3D\", wglSetDigitalVideoParametersI3D == NULL);\r\n}\r\n\r\n#endif /* WGL_I3D_digital_video_control */\r\n\r\n#ifdef WGL_I3D_gamma\r\n\r\nstatic void _glewInfo_WGL_I3D_gamma (void)\r\n{\r\n  glewPrintExt(\"WGL_I3D_gamma\", WGLEW_I3D_gamma, wglewIsSupported(\"WGL_I3D_gamma\"), wglewGetExtension(\"WGL_I3D_gamma\"));\r\n\r\n  glewInfoFunc(\"wglGetGammaTableI3D\", wglGetGammaTableI3D == NULL);\r\n  glewInfoFunc(\"wglGetGammaTableParametersI3D\", wglGetGammaTableParametersI3D == NULL);\r\n  glewInfoFunc(\"wglSetGammaTableI3D\", wglSetGammaTableI3D == NULL);\r\n  glewInfoFunc(\"wglSetGammaTableParametersI3D\", wglSetGammaTableParametersI3D == NULL);\r\n}\r\n\r\n#endif /* WGL_I3D_gamma */\r\n\r\n#ifdef WGL_I3D_genlock\r\n\r\nstatic void _glewInfo_WGL_I3D_genlock (void)\r\n{\r\n  glewPrintExt(\"WGL_I3D_genlock\", WGLEW_I3D_genlock, wglewIsSupported(\"WGL_I3D_genlock\"), wglewGetExtension(\"WGL_I3D_genlock\"));\r\n\r\n  glewInfoFunc(\"wglDisableGenlockI3D\", wglDisableGenlockI3D == NULL);\r\n  glewInfoFunc(\"wglEnableGenlockI3D\", wglEnableGenlockI3D == NULL);\r\n  glewInfoFunc(\"wglGenlockSampleRateI3D\", wglGenlockSampleRateI3D == NULL);\r\n  glewInfoFunc(\"wglGenlockSourceDelayI3D\", wglGenlockSourceDelayI3D == NULL);\r\n  glewInfoFunc(\"wglGenlockSourceEdgeI3D\", wglGenlockSourceEdgeI3D == NULL);\r\n  glewInfoFunc(\"wglGenlockSourceI3D\", wglGenlockSourceI3D == NULL);\r\n  glewInfoFunc(\"wglGetGenlockSampleRateI3D\", wglGetGenlockSampleRateI3D == NULL);\r\n  glewInfoFunc(\"wglGetGenlockSourceDelayI3D\", wglGetGenlockSourceDelayI3D == NULL);\r\n  glewInfoFunc(\"wglGetGenlockSourceEdgeI3D\", wglGetGenlockSourceEdgeI3D == NULL);\r\n  glewInfoFunc(\"wglGetGenlockSourceI3D\", wglGetGenlockSourceI3D == NULL);\r\n  glewInfoFunc(\"wglIsEnabledGenlockI3D\", wglIsEnabledGenlockI3D == NULL);\r\n  glewInfoFunc(\"wglQueryGenlockMaxSourceDelayI3D\", wglQueryGenlockMaxSourceDelayI3D == NULL);\r\n}\r\n\r\n#endif /* WGL_I3D_genlock */\r\n\r\n#ifdef WGL_I3D_image_buffer\r\n\r\nstatic void _glewInfo_WGL_I3D_image_buffer (void)\r\n{\r\n  glewPrintExt(\"WGL_I3D_image_buffer\", WGLEW_I3D_image_buffer, wglewIsSupported(\"WGL_I3D_image_buffer\"), wglewGetExtension(\"WGL_I3D_image_buffer\"));\r\n\r\n  glewInfoFunc(\"wglAssociateImageBufferEventsI3D\", wglAssociateImageBufferEventsI3D == NULL);\r\n  glewInfoFunc(\"wglCreateImageBufferI3D\", wglCreateImageBufferI3D == NULL);\r\n  glewInfoFunc(\"wglDestroyImageBufferI3D\", wglDestroyImageBufferI3D == NULL);\r\n  glewInfoFunc(\"wglReleaseImageBufferEventsI3D\", wglReleaseImageBufferEventsI3D == NULL);\r\n}\r\n\r\n#endif /* WGL_I3D_image_buffer */\r\n\r\n#ifdef WGL_I3D_swap_frame_lock\r\n\r\nstatic void _glewInfo_WGL_I3D_swap_frame_lock (void)\r\n{\r\n  glewPrintExt(\"WGL_I3D_swap_frame_lock\", WGLEW_I3D_swap_frame_lock, wglewIsSupported(\"WGL_I3D_swap_frame_lock\"), wglewGetExtension(\"WGL_I3D_swap_frame_lock\"));\r\n\r\n  glewInfoFunc(\"wglDisableFrameLockI3D\", wglDisableFrameLockI3D == NULL);\r\n  glewInfoFunc(\"wglEnableFrameLockI3D\", wglEnableFrameLockI3D == NULL);\r\n  glewInfoFunc(\"wglIsEnabledFrameLockI3D\", wglIsEnabledFrameLockI3D == NULL);\r\n  glewInfoFunc(\"wglQueryFrameLockMasterI3D\", wglQueryFrameLockMasterI3D == NULL);\r\n}\r\n\r\n#endif /* WGL_I3D_swap_frame_lock */\r\n\r\n#ifdef WGL_I3D_swap_frame_usage\r\n\r\nstatic void _glewInfo_WGL_I3D_swap_frame_usage (void)\r\n{\r\n  glewPrintExt(\"WGL_I3D_swap_frame_usage\", WGLEW_I3D_swap_frame_usage, wglewIsSupported(\"WGL_I3D_swap_frame_usage\"), wglewGetExtension(\"WGL_I3D_swap_frame_usage\"));\r\n\r\n  glewInfoFunc(\"wglBeginFrameTrackingI3D\", wglBeginFrameTrackingI3D == NULL);\r\n  glewInfoFunc(\"wglEndFrameTrackingI3D\", wglEndFrameTrackingI3D == NULL);\r\n  glewInfoFunc(\"wglGetFrameUsageI3D\", wglGetFrameUsageI3D == NULL);\r\n  glewInfoFunc(\"wglQueryFrameTrackingI3D\", wglQueryFrameTrackingI3D == NULL);\r\n}\r\n\r\n#endif /* WGL_I3D_swap_frame_usage */\r\n\r\n#ifdef WGL_NV_copy_image\r\n\r\nstatic void _glewInfo_WGL_NV_copy_image (void)\r\n{\r\n  glewPrintExt(\"WGL_NV_copy_image\", WGLEW_NV_copy_image, wglewIsSupported(\"WGL_NV_copy_image\"), wglewGetExtension(\"WGL_NV_copy_image\"));\r\n\r\n  glewInfoFunc(\"wglCopyImageSubDataNV\", wglCopyImageSubDataNV == NULL);\r\n}\r\n\r\n#endif /* WGL_NV_copy_image */\r\n\r\n#ifdef WGL_NV_float_buffer\r\n\r\nstatic void _glewInfo_WGL_NV_float_buffer (void)\r\n{\r\n  glewPrintExt(\"WGL_NV_float_buffer\", WGLEW_NV_float_buffer, wglewIsSupported(\"WGL_NV_float_buffer\"), wglewGetExtension(\"WGL_NV_float_buffer\"));\r\n}\r\n\r\n#endif /* WGL_NV_float_buffer */\r\n\r\n#ifdef WGL_NV_gpu_affinity\r\n\r\nstatic void _glewInfo_WGL_NV_gpu_affinity (void)\r\n{\r\n  glewPrintExt(\"WGL_NV_gpu_affinity\", WGLEW_NV_gpu_affinity, wglewIsSupported(\"WGL_NV_gpu_affinity\"), wglewGetExtension(\"WGL_NV_gpu_affinity\"));\r\n\r\n  glewInfoFunc(\"wglCreateAffinityDCNV\", wglCreateAffinityDCNV == NULL);\r\n  glewInfoFunc(\"wglDeleteDCNV\", wglDeleteDCNV == NULL);\r\n  glewInfoFunc(\"wglEnumGpuDevicesNV\", wglEnumGpuDevicesNV == NULL);\r\n  glewInfoFunc(\"wglEnumGpusFromAffinityDCNV\", wglEnumGpusFromAffinityDCNV == NULL);\r\n  glewInfoFunc(\"wglEnumGpusNV\", wglEnumGpusNV == NULL);\r\n}\r\n\r\n#endif /* WGL_NV_gpu_affinity */\r\n\r\n#ifdef WGL_NV_present_video\r\n\r\nstatic void _glewInfo_WGL_NV_present_video (void)\r\n{\r\n  glewPrintExt(\"WGL_NV_present_video\", WGLEW_NV_present_video, wglewIsSupported(\"WGL_NV_present_video\"), wglewGetExtension(\"WGL_NV_present_video\"));\r\n\r\n  glewInfoFunc(\"wglBindVideoDeviceNV\", wglBindVideoDeviceNV == NULL);\r\n  glewInfoFunc(\"wglEnumerateVideoDevicesNV\", wglEnumerateVideoDevicesNV == NULL);\r\n  glewInfoFunc(\"wglQueryCurrentContextNV\", wglQueryCurrentContextNV == NULL);\r\n}\r\n\r\n#endif /* WGL_NV_present_video */\r\n\r\n#ifdef WGL_NV_render_depth_texture\r\n\r\nstatic void _glewInfo_WGL_NV_render_depth_texture (void)\r\n{\r\n  glewPrintExt(\"WGL_NV_render_depth_texture\", WGLEW_NV_render_depth_texture, wglewIsSupported(\"WGL_NV_render_depth_texture\"), wglewGetExtension(\"WGL_NV_render_depth_texture\"));\r\n}\r\n\r\n#endif /* WGL_NV_render_depth_texture */\r\n\r\n#ifdef WGL_NV_render_texture_rectangle\r\n\r\nstatic void _glewInfo_WGL_NV_render_texture_rectangle (void)\r\n{\r\n  glewPrintExt(\"WGL_NV_render_texture_rectangle\", WGLEW_NV_render_texture_rectangle, wglewIsSupported(\"WGL_NV_render_texture_rectangle\"), wglewGetExtension(\"WGL_NV_render_texture_rectangle\"));\r\n}\r\n\r\n#endif /* WGL_NV_render_texture_rectangle */\r\n\r\n#ifdef WGL_NV_swap_group\r\n\r\nstatic void _glewInfo_WGL_NV_swap_group (void)\r\n{\r\n  glewPrintExt(\"WGL_NV_swap_group\", WGLEW_NV_swap_group, wglewIsSupported(\"WGL_NV_swap_group\"), wglewGetExtension(\"WGL_NV_swap_group\"));\r\n\r\n  glewInfoFunc(\"wglBindSwapBarrierNV\", wglBindSwapBarrierNV == NULL);\r\n  glewInfoFunc(\"wglJoinSwapGroupNV\", wglJoinSwapGroupNV == NULL);\r\n  glewInfoFunc(\"wglQueryFrameCountNV\", wglQueryFrameCountNV == NULL);\r\n  glewInfoFunc(\"wglQueryMaxSwapGroupsNV\", wglQueryMaxSwapGroupsNV == NULL);\r\n  glewInfoFunc(\"wglQuerySwapGroupNV\", wglQuerySwapGroupNV == NULL);\r\n  glewInfoFunc(\"wglResetFrameCountNV\", wglResetFrameCountNV == NULL);\r\n}\r\n\r\n#endif /* WGL_NV_swap_group */\r\n\r\n#ifdef WGL_NV_vertex_array_range\r\n\r\nstatic void _glewInfo_WGL_NV_vertex_array_range (void)\r\n{\r\n  glewPrintExt(\"WGL_NV_vertex_array_range\", WGLEW_NV_vertex_array_range, wglewIsSupported(\"WGL_NV_vertex_array_range\"), wglewGetExtension(\"WGL_NV_vertex_array_range\"));\r\n\r\n  glewInfoFunc(\"wglAllocateMemoryNV\", wglAllocateMemoryNV == NULL);\r\n  glewInfoFunc(\"wglFreeMemoryNV\", wglFreeMemoryNV == NULL);\r\n}\r\n\r\n#endif /* WGL_NV_vertex_array_range */\r\n\r\n#ifdef WGL_NV_video_output\r\n\r\nstatic void _glewInfo_WGL_NV_video_output (void)\r\n{\r\n  glewPrintExt(\"WGL_NV_video_output\", WGLEW_NV_video_output, wglewIsSupported(\"WGL_NV_video_output\"), wglewGetExtension(\"WGL_NV_video_output\"));\r\n\r\n  glewInfoFunc(\"wglBindVideoImageNV\", wglBindVideoImageNV == NULL);\r\n  glewInfoFunc(\"wglGetVideoDeviceNV\", wglGetVideoDeviceNV == NULL);\r\n  glewInfoFunc(\"wglGetVideoInfoNV\", wglGetVideoInfoNV == NULL);\r\n  glewInfoFunc(\"wglReleaseVideoDeviceNV\", wglReleaseVideoDeviceNV == NULL);\r\n  glewInfoFunc(\"wglReleaseVideoImageNV\", wglReleaseVideoImageNV == NULL);\r\n  glewInfoFunc(\"wglSendPbufferToVideoNV\", wglSendPbufferToVideoNV == NULL);\r\n}\r\n\r\n#endif /* WGL_NV_video_output */\r\n\r\n#ifdef WGL_OML_sync_control\r\n\r\nstatic void _glewInfo_WGL_OML_sync_control (void)\r\n{\r\n  glewPrintExt(\"WGL_OML_sync_control\", WGLEW_OML_sync_control, wglewIsSupported(\"WGL_OML_sync_control\"), wglewGetExtension(\"WGL_OML_sync_control\"));\r\n\r\n  glewInfoFunc(\"wglGetMscRateOML\", wglGetMscRateOML == NULL);\r\n  glewInfoFunc(\"wglGetSyncValuesOML\", wglGetSyncValuesOML == NULL);\r\n  glewInfoFunc(\"wglSwapBuffersMscOML\", wglSwapBuffersMscOML == NULL);\r\n  glewInfoFunc(\"wglSwapLayerBuffersMscOML\", wglSwapLayerBuffersMscOML == NULL);\r\n  glewInfoFunc(\"wglWaitForMscOML\", wglWaitForMscOML == NULL);\r\n  glewInfoFunc(\"wglWaitForSbcOML\", wglWaitForSbcOML == NULL);\r\n}\r\n\r\n#endif /* WGL_OML_sync_control */\r\n\r\n#else /* _UNIX */\r\n\r\n#ifdef GLX_VERSION_1_2\r\n\r\nstatic void _glewInfo_GLX_VERSION_1_2 (void)\r\n{\r\n  glewPrintExt(\"GLX_VERSION_1_2\", GLXEW_VERSION_1_2, GLXEW_VERSION_1_2, GLXEW_VERSION_1_2);\r\n\r\n  glewInfoFunc(\"glXGetCurrentDisplay\", glXGetCurrentDisplay == NULL);\r\n}\r\n\r\n#endif /* GLX_VERSION_1_2 */\r\n\r\n#ifdef GLX_VERSION_1_3\r\n\r\nstatic void _glewInfo_GLX_VERSION_1_3 (void)\r\n{\r\n  glewPrintExt(\"GLX_VERSION_1_3\", GLXEW_VERSION_1_3, GLXEW_VERSION_1_3, GLXEW_VERSION_1_3);\r\n\r\n  glewInfoFunc(\"glXChooseFBConfig\", glXChooseFBConfig == NULL);\r\n  glewInfoFunc(\"glXCreateNewContext\", glXCreateNewContext == NULL);\r\n  glewInfoFunc(\"glXCreatePbuffer\", glXCreatePbuffer == NULL);\r\n  glewInfoFunc(\"glXCreatePixmap\", glXCreatePixmap == NULL);\r\n  glewInfoFunc(\"glXCreateWindow\", glXCreateWindow == NULL);\r\n  glewInfoFunc(\"glXDestroyPbuffer\", glXDestroyPbuffer == NULL);\r\n  glewInfoFunc(\"glXDestroyPixmap\", glXDestroyPixmap == NULL);\r\n  glewInfoFunc(\"glXDestroyWindow\", glXDestroyWindow == NULL);\r\n  glewInfoFunc(\"glXGetCurrentReadDrawable\", glXGetCurrentReadDrawable == NULL);\r\n  glewInfoFunc(\"glXGetFBConfigAttrib\", glXGetFBConfigAttrib == NULL);\r\n  glewInfoFunc(\"glXGetFBConfigs\", glXGetFBConfigs == NULL);\r\n  glewInfoFunc(\"glXGetSelectedEvent\", glXGetSelectedEvent == NULL);\r\n  glewInfoFunc(\"glXGetVisualFromFBConfig\", glXGetVisualFromFBConfig == NULL);\r\n  glewInfoFunc(\"glXMakeContextCurrent\", glXMakeContextCurrent == NULL);\r\n  glewInfoFunc(\"glXQueryContext\", glXQueryContext == NULL);\r\n  glewInfoFunc(\"glXQueryDrawable\", glXQueryDrawable == NULL);\r\n  glewInfoFunc(\"glXSelectEvent\", glXSelectEvent == NULL);\r\n}\r\n\r\n#endif /* GLX_VERSION_1_3 */\r\n\r\n#ifdef GLX_VERSION_1_4\r\n\r\nstatic void _glewInfo_GLX_VERSION_1_4 (void)\r\n{\r\n  glewPrintExt(\"GLX_VERSION_1_4\", GLXEW_VERSION_1_4, GLXEW_VERSION_1_4, GLXEW_VERSION_1_4);\r\n}\r\n\r\n#endif /* GLX_VERSION_1_4 */\r\n\r\n#ifdef GLX_3DFX_multisample\r\n\r\nstatic void _glewInfo_GLX_3DFX_multisample (void)\r\n{\r\n  glewPrintExt(\"GLX_3DFX_multisample\", GLXEW_3DFX_multisample, glxewIsSupported(\"GLX_3DFX_multisample\"), glxewGetExtension(\"GLX_3DFX_multisample\"));\r\n}\r\n\r\n#endif /* GLX_3DFX_multisample */\r\n\r\n#ifdef GLX_ARB_create_context\r\n\r\nstatic void _glewInfo_GLX_ARB_create_context (void)\r\n{\r\n  glewPrintExt(\"GLX_ARB_create_context\", GLXEW_ARB_create_context, glxewIsSupported(\"GLX_ARB_create_context\"), glxewGetExtension(\"GLX_ARB_create_context\"));\r\n\r\n  glewInfoFunc(\"glXCreateContextAttribsARB\", glXCreateContextAttribsARB == NULL);\r\n}\r\n\r\n#endif /* GLX_ARB_create_context */\r\n\r\n#ifdef GLX_ARB_create_context_profile\r\n\r\nstatic void _glewInfo_GLX_ARB_create_context_profile (void)\r\n{\r\n  glewPrintExt(\"GLX_ARB_create_context_profile\", GLXEW_ARB_create_context_profile, glxewIsSupported(\"GLX_ARB_create_context_profile\"), glxewGetExtension(\"GLX_ARB_create_context_profile\"));\r\n}\r\n\r\n#endif /* GLX_ARB_create_context_profile */\r\n\r\n#ifdef GLX_ARB_fbconfig_float\r\n\r\nstatic void _glewInfo_GLX_ARB_fbconfig_float (void)\r\n{\r\n  glewPrintExt(\"GLX_ARB_fbconfig_float\", GLXEW_ARB_fbconfig_float, glxewIsSupported(\"GLX_ARB_fbconfig_float\"), glxewGetExtension(\"GLX_ARB_fbconfig_float\"));\r\n}\r\n\r\n#endif /* GLX_ARB_fbconfig_float */\r\n\r\n#ifdef GLX_ARB_framebuffer_sRGB\r\n\r\nstatic void _glewInfo_GLX_ARB_framebuffer_sRGB (void)\r\n{\r\n  glewPrintExt(\"GLX_ARB_framebuffer_sRGB\", GLXEW_ARB_framebuffer_sRGB, glxewIsSupported(\"GLX_ARB_framebuffer_sRGB\"), glxewGetExtension(\"GLX_ARB_framebuffer_sRGB\"));\r\n}\r\n\r\n#endif /* GLX_ARB_framebuffer_sRGB */\r\n\r\n#ifdef GLX_ARB_get_proc_address\r\n\r\nstatic void _glewInfo_GLX_ARB_get_proc_address (void)\r\n{\r\n  glewPrintExt(\"GLX_ARB_get_proc_address\", GLXEW_ARB_get_proc_address, glxewIsSupported(\"GLX_ARB_get_proc_address\"), glxewGetExtension(\"GLX_ARB_get_proc_address\"));\r\n}\r\n\r\n#endif /* GLX_ARB_get_proc_address */\r\n\r\n#ifdef GLX_ARB_multisample\r\n\r\nstatic void _glewInfo_GLX_ARB_multisample (void)\r\n{\r\n  glewPrintExt(\"GLX_ARB_multisample\", GLXEW_ARB_multisample, glxewIsSupported(\"GLX_ARB_multisample\"), glxewGetExtension(\"GLX_ARB_multisample\"));\r\n}\r\n\r\n#endif /* GLX_ARB_multisample */\r\n\r\n#ifdef GLX_ATI_pixel_format_float\r\n\r\nstatic void _glewInfo_GLX_ATI_pixel_format_float (void)\r\n{\r\n  glewPrintExt(\"GLX_ATI_pixel_format_float\", GLXEW_ATI_pixel_format_float, glxewIsSupported(\"GLX_ATI_pixel_format_float\"), glxewGetExtension(\"GLX_ATI_pixel_format_float\"));\r\n}\r\n\r\n#endif /* GLX_ATI_pixel_format_float */\r\n\r\n#ifdef GLX_ATI_render_texture\r\n\r\nstatic void _glewInfo_GLX_ATI_render_texture (void)\r\n{\r\n  glewPrintExt(\"GLX_ATI_render_texture\", GLXEW_ATI_render_texture, glxewIsSupported(\"GLX_ATI_render_texture\"), glxewGetExtension(\"GLX_ATI_render_texture\"));\r\n\r\n  glewInfoFunc(\"glXBindTexImageATI\", glXBindTexImageATI == NULL);\r\n  glewInfoFunc(\"glXDrawableAttribATI\", glXDrawableAttribATI == NULL);\r\n  glewInfoFunc(\"glXReleaseTexImageATI\", glXReleaseTexImageATI == NULL);\r\n}\r\n\r\n#endif /* GLX_ATI_render_texture */\r\n\r\n#ifdef GLX_EXT_fbconfig_packed_float\r\n\r\nstatic void _glewInfo_GLX_EXT_fbconfig_packed_float (void)\r\n{\r\n  glewPrintExt(\"GLX_EXT_fbconfig_packed_float\", GLXEW_EXT_fbconfig_packed_float, glxewIsSupported(\"GLX_EXT_fbconfig_packed_float\"), glxewGetExtension(\"GLX_EXT_fbconfig_packed_float\"));\r\n}\r\n\r\n#endif /* GLX_EXT_fbconfig_packed_float */\r\n\r\n#ifdef GLX_EXT_framebuffer_sRGB\r\n\r\nstatic void _glewInfo_GLX_EXT_framebuffer_sRGB (void)\r\n{\r\n  glewPrintExt(\"GLX_EXT_framebuffer_sRGB\", GLXEW_EXT_framebuffer_sRGB, glxewIsSupported(\"GLX_EXT_framebuffer_sRGB\"), glxewGetExtension(\"GLX_EXT_framebuffer_sRGB\"));\r\n}\r\n\r\n#endif /* GLX_EXT_framebuffer_sRGB */\r\n\r\n#ifdef GLX_EXT_import_context\r\n\r\nstatic void _glewInfo_GLX_EXT_import_context (void)\r\n{\r\n  glewPrintExt(\"GLX_EXT_import_context\", GLXEW_EXT_import_context, glxewIsSupported(\"GLX_EXT_import_context\"), glxewGetExtension(\"GLX_EXT_import_context\"));\r\n\r\n  glewInfoFunc(\"glXFreeContextEXT\", glXFreeContextEXT == NULL);\r\n  glewInfoFunc(\"glXGetContextIDEXT\", glXGetContextIDEXT == NULL);\r\n  glewInfoFunc(\"glXImportContextEXT\", glXImportContextEXT == NULL);\r\n  glewInfoFunc(\"glXQueryContextInfoEXT\", glXQueryContextInfoEXT == NULL);\r\n}\r\n\r\n#endif /* GLX_EXT_import_context */\r\n\r\n#ifdef GLX_EXT_scene_marker\r\n\r\nstatic void _glewInfo_GLX_EXT_scene_marker (void)\r\n{\r\n  glewPrintExt(\"GLX_EXT_scene_marker\", GLXEW_EXT_scene_marker, glxewIsSupported(\"GLX_EXT_scene_marker\"), glxewGetExtension(\"GLX_EXT_scene_marker\"));\r\n}\r\n\r\n#endif /* GLX_EXT_scene_marker */\r\n\r\n#ifdef GLX_EXT_swap_control\r\n\r\nstatic void _glewInfo_GLX_EXT_swap_control (void)\r\n{\r\n  glewPrintExt(\"GLX_EXT_swap_control\", GLXEW_EXT_swap_control, glxewIsSupported(\"GLX_EXT_swap_control\"), glxewGetExtension(\"GLX_EXT_swap_control\"));\r\n\r\n  glewInfoFunc(\"glXSwapIntervalEXT\", glXSwapIntervalEXT == NULL);\r\n}\r\n\r\n#endif /* GLX_EXT_swap_control */\r\n\r\n#ifdef GLX_EXT_texture_from_pixmap\r\n\r\nstatic void _glewInfo_GLX_EXT_texture_from_pixmap (void)\r\n{\r\n  glewPrintExt(\"GLX_EXT_texture_from_pixmap\", GLXEW_EXT_texture_from_pixmap, glxewIsSupported(\"GLX_EXT_texture_from_pixmap\"), glxewGetExtension(\"GLX_EXT_texture_from_pixmap\"));\r\n\r\n  glewInfoFunc(\"glXBindTexImageEXT\", glXBindTexImageEXT == NULL);\r\n  glewInfoFunc(\"glXReleaseTexImageEXT\", glXReleaseTexImageEXT == NULL);\r\n}\r\n\r\n#endif /* GLX_EXT_texture_from_pixmap */\r\n\r\n#ifdef GLX_EXT_visual_info\r\n\r\nstatic void _glewInfo_GLX_EXT_visual_info (void)\r\n{\r\n  glewPrintExt(\"GLX_EXT_visual_info\", GLXEW_EXT_visual_info, glxewIsSupported(\"GLX_EXT_visual_info\"), glxewGetExtension(\"GLX_EXT_visual_info\"));\r\n}\r\n\r\n#endif /* GLX_EXT_visual_info */\r\n\r\n#ifdef GLX_EXT_visual_rating\r\n\r\nstatic void _glewInfo_GLX_EXT_visual_rating (void)\r\n{\r\n  glewPrintExt(\"GLX_EXT_visual_rating\", GLXEW_EXT_visual_rating, glxewIsSupported(\"GLX_EXT_visual_rating\"), glxewGetExtension(\"GLX_EXT_visual_rating\"));\r\n}\r\n\r\n#endif /* GLX_EXT_visual_rating */\r\n\r\n#ifdef GLX_INTEL_swap_event\r\n\r\nstatic void _glewInfo_GLX_INTEL_swap_event (void)\r\n{\r\n  glewPrintExt(\"GLX_INTEL_swap_event\", GLXEW_INTEL_swap_event, glxewIsSupported(\"GLX_INTEL_swap_event\"), glxewGetExtension(\"GLX_INTEL_swap_event\"));\r\n}\r\n\r\n#endif /* GLX_INTEL_swap_event */\r\n\r\n#ifdef GLX_MESA_agp_offset\r\n\r\nstatic void _glewInfo_GLX_MESA_agp_offset (void)\r\n{\r\n  glewPrintExt(\"GLX_MESA_agp_offset\", GLXEW_MESA_agp_offset, glxewIsSupported(\"GLX_MESA_agp_offset\"), glxewGetExtension(\"GLX_MESA_agp_offset\"));\r\n\r\n  glewInfoFunc(\"glXGetAGPOffsetMESA\", glXGetAGPOffsetMESA == NULL);\r\n}\r\n\r\n#endif /* GLX_MESA_agp_offset */\r\n\r\n#ifdef GLX_MESA_copy_sub_buffer\r\n\r\nstatic void _glewInfo_GLX_MESA_copy_sub_buffer (void)\r\n{\r\n  glewPrintExt(\"GLX_MESA_copy_sub_buffer\", GLXEW_MESA_copy_sub_buffer, glxewIsSupported(\"GLX_MESA_copy_sub_buffer\"), glxewGetExtension(\"GLX_MESA_copy_sub_buffer\"));\r\n\r\n  glewInfoFunc(\"glXCopySubBufferMESA\", glXCopySubBufferMESA == NULL);\r\n}\r\n\r\n#endif /* GLX_MESA_copy_sub_buffer */\r\n\r\n#ifdef GLX_MESA_pixmap_colormap\r\n\r\nstatic void _glewInfo_GLX_MESA_pixmap_colormap (void)\r\n{\r\n  glewPrintExt(\"GLX_MESA_pixmap_colormap\", GLXEW_MESA_pixmap_colormap, glxewIsSupported(\"GLX_MESA_pixmap_colormap\"), glxewGetExtension(\"GLX_MESA_pixmap_colormap\"));\r\n\r\n  glewInfoFunc(\"glXCreateGLXPixmapMESA\", glXCreateGLXPixmapMESA == NULL);\r\n}\r\n\r\n#endif /* GLX_MESA_pixmap_colormap */\r\n\r\n#ifdef GLX_MESA_release_buffers\r\n\r\nstatic void _glewInfo_GLX_MESA_release_buffers (void)\r\n{\r\n  glewPrintExt(\"GLX_MESA_release_buffers\", GLXEW_MESA_release_buffers, glxewIsSupported(\"GLX_MESA_release_buffers\"), glxewGetExtension(\"GLX_MESA_release_buffers\"));\r\n\r\n  glewInfoFunc(\"glXReleaseBuffersMESA\", glXReleaseBuffersMESA == NULL);\r\n}\r\n\r\n#endif /* GLX_MESA_release_buffers */\r\n\r\n#ifdef GLX_MESA_set_3dfx_mode\r\n\r\nstatic void _glewInfo_GLX_MESA_set_3dfx_mode (void)\r\n{\r\n  glewPrintExt(\"GLX_MESA_set_3dfx_mode\", GLXEW_MESA_set_3dfx_mode, glxewIsSupported(\"GLX_MESA_set_3dfx_mode\"), glxewGetExtension(\"GLX_MESA_set_3dfx_mode\"));\r\n\r\n  glewInfoFunc(\"glXSet3DfxModeMESA\", glXSet3DfxModeMESA == NULL);\r\n}\r\n\r\n#endif /* GLX_MESA_set_3dfx_mode */\r\n\r\n#ifdef GLX_NV_copy_image\r\n\r\nstatic void _glewInfo_GLX_NV_copy_image (void)\r\n{\r\n  glewPrintExt(\"GLX_NV_copy_image\", GLXEW_NV_copy_image, glxewIsSupported(\"GLX_NV_copy_image\"), glxewGetExtension(\"GLX_NV_copy_image\"));\r\n\r\n  glewInfoFunc(\"glXCopyImageSubDataNV\", glXCopyImageSubDataNV == NULL);\r\n}\r\n\r\n#endif /* GLX_NV_copy_image */\r\n\r\n#ifdef GLX_NV_float_buffer\r\n\r\nstatic void _glewInfo_GLX_NV_float_buffer (void)\r\n{\r\n  glewPrintExt(\"GLX_NV_float_buffer\", GLXEW_NV_float_buffer, glxewIsSupported(\"GLX_NV_float_buffer\"), glxewGetExtension(\"GLX_NV_float_buffer\"));\r\n}\r\n\r\n#endif /* GLX_NV_float_buffer */\r\n\r\n#ifdef GLX_NV_present_video\r\n\r\nstatic void _glewInfo_GLX_NV_present_video (void)\r\n{\r\n  glewPrintExt(\"GLX_NV_present_video\", GLXEW_NV_present_video, glxewIsSupported(\"GLX_NV_present_video\"), glxewGetExtension(\"GLX_NV_present_video\"));\r\n\r\n  glewInfoFunc(\"glXBindVideoDeviceNV\", glXBindVideoDeviceNV == NULL);\r\n  glewInfoFunc(\"glXEnumerateVideoDevicesNV\", glXEnumerateVideoDevicesNV == NULL);\r\n}\r\n\r\n#endif /* GLX_NV_present_video */\r\n\r\n#ifdef GLX_NV_swap_group\r\n\r\nstatic void _glewInfo_GLX_NV_swap_group (void)\r\n{\r\n  glewPrintExt(\"GLX_NV_swap_group\", GLXEW_NV_swap_group, glxewIsSupported(\"GLX_NV_swap_group\"), glxewGetExtension(\"GLX_NV_swap_group\"));\r\n\r\n  glewInfoFunc(\"glXBindSwapBarrierNV\", glXBindSwapBarrierNV == NULL);\r\n  glewInfoFunc(\"glXJoinSwapGroupNV\", glXJoinSwapGroupNV == NULL);\r\n  glewInfoFunc(\"glXQueryFrameCountNV\", glXQueryFrameCountNV == NULL);\r\n  glewInfoFunc(\"glXQueryMaxSwapGroupsNV\", glXQueryMaxSwapGroupsNV == NULL);\r\n  glewInfoFunc(\"glXQuerySwapGroupNV\", glXQuerySwapGroupNV == NULL);\r\n  glewInfoFunc(\"glXResetFrameCountNV\", glXResetFrameCountNV == NULL);\r\n}\r\n\r\n#endif /* GLX_NV_swap_group */\r\n\r\n#ifdef GLX_NV_vertex_array_range\r\n\r\nstatic void _glewInfo_GLX_NV_vertex_array_range (void)\r\n{\r\n  glewPrintExt(\"GLX_NV_vertex_array_range\", GLXEW_NV_vertex_array_range, glxewIsSupported(\"GLX_NV_vertex_array_range\"), glxewGetExtension(\"GLX_NV_vertex_array_range\"));\r\n\r\n  glewInfoFunc(\"glXAllocateMemoryNV\", glXAllocateMemoryNV == NULL);\r\n  glewInfoFunc(\"glXFreeMemoryNV\", glXFreeMemoryNV == NULL);\r\n}\r\n\r\n#endif /* GLX_NV_vertex_array_range */\r\n\r\n#ifdef GLX_NV_video_output\r\n\r\nstatic void _glewInfo_GLX_NV_video_output (void)\r\n{\r\n  glewPrintExt(\"GLX_NV_video_output\", GLXEW_NV_video_output, glxewIsSupported(\"GLX_NV_video_output\"), glxewGetExtension(\"GLX_NV_video_output\"));\r\n\r\n  glewInfoFunc(\"glXBindVideoImageNV\", glXBindVideoImageNV == NULL);\r\n  glewInfoFunc(\"glXGetVideoDeviceNV\", glXGetVideoDeviceNV == NULL);\r\n  glewInfoFunc(\"glXGetVideoInfoNV\", glXGetVideoInfoNV == NULL);\r\n  glewInfoFunc(\"glXReleaseVideoDeviceNV\", glXReleaseVideoDeviceNV == NULL);\r\n  glewInfoFunc(\"glXReleaseVideoImageNV\", glXReleaseVideoImageNV == NULL);\r\n  glewInfoFunc(\"glXSendPbufferToVideoNV\", glXSendPbufferToVideoNV == NULL);\r\n}\r\n\r\n#endif /* GLX_NV_video_output */\r\n\r\n#ifdef GLX_OML_swap_method\r\n\r\nstatic void _glewInfo_GLX_OML_swap_method (void)\r\n{\r\n  glewPrintExt(\"GLX_OML_swap_method\", GLXEW_OML_swap_method, glxewIsSupported(\"GLX_OML_swap_method\"), glxewGetExtension(\"GLX_OML_swap_method\"));\r\n}\r\n\r\n#endif /* GLX_OML_swap_method */\r\n\r\n#if defined(GLX_OML_sync_control) && defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)\r\n#include <inttypes.h>\r\n\r\nstatic void _glewInfo_GLX_OML_sync_control (void)\r\n{\r\n  glewPrintExt(\"GLX_OML_sync_control\", GLXEW_OML_sync_control, glxewIsSupported(\"GLX_OML_sync_control\"), glxewGetExtension(\"GLX_OML_sync_control\"));\r\n\r\n  glewInfoFunc(\"glXGetMscRateOML\", glXGetMscRateOML == NULL);\r\n  glewInfoFunc(\"glXGetSyncValuesOML\", glXGetSyncValuesOML == NULL);\r\n  glewInfoFunc(\"glXSwapBuffersMscOML\", glXSwapBuffersMscOML == NULL);\r\n  glewInfoFunc(\"glXWaitForMscOML\", glXWaitForMscOML == NULL);\r\n  glewInfoFunc(\"glXWaitForSbcOML\", glXWaitForSbcOML == NULL);\r\n}\r\n\r\n#endif /* GLX_OML_sync_control */\r\n\r\n#ifdef GLX_SGIS_blended_overlay\r\n\r\nstatic void _glewInfo_GLX_SGIS_blended_overlay (void)\r\n{\r\n  glewPrintExt(\"GLX_SGIS_blended_overlay\", GLXEW_SGIS_blended_overlay, glxewIsSupported(\"GLX_SGIS_blended_overlay\"), glxewGetExtension(\"GLX_SGIS_blended_overlay\"));\r\n}\r\n\r\n#endif /* GLX_SGIS_blended_overlay */\r\n\r\n#ifdef GLX_SGIS_color_range\r\n\r\nstatic void _glewInfo_GLX_SGIS_color_range (void)\r\n{\r\n  glewPrintExt(\"GLX_SGIS_color_range\", GLXEW_SGIS_color_range, glxewIsSupported(\"GLX_SGIS_color_range\"), glxewGetExtension(\"GLX_SGIS_color_range\"));\r\n}\r\n\r\n#endif /* GLX_SGIS_color_range */\r\n\r\n#ifdef GLX_SGIS_multisample\r\n\r\nstatic void _glewInfo_GLX_SGIS_multisample (void)\r\n{\r\n  glewPrintExt(\"GLX_SGIS_multisample\", GLXEW_SGIS_multisample, glxewIsSupported(\"GLX_SGIS_multisample\"), glxewGetExtension(\"GLX_SGIS_multisample\"));\r\n}\r\n\r\n#endif /* GLX_SGIS_multisample */\r\n\r\n#ifdef GLX_SGIS_shared_multisample\r\n\r\nstatic void _glewInfo_GLX_SGIS_shared_multisample (void)\r\n{\r\n  glewPrintExt(\"GLX_SGIS_shared_multisample\", GLXEW_SGIS_shared_multisample, glxewIsSupported(\"GLX_SGIS_shared_multisample\"), glxewGetExtension(\"GLX_SGIS_shared_multisample\"));\r\n}\r\n\r\n#endif /* GLX_SGIS_shared_multisample */\r\n\r\n#ifdef GLX_SGIX_fbconfig\r\n\r\nstatic void _glewInfo_GLX_SGIX_fbconfig (void)\r\n{\r\n  glewPrintExt(\"GLX_SGIX_fbconfig\", GLXEW_SGIX_fbconfig, glxewIsSupported(\"GLX_SGIX_fbconfig\"), glxewGetExtension(\"GLX_SGIX_fbconfig\"));\r\n\r\n  glewInfoFunc(\"glXChooseFBConfigSGIX\", glXChooseFBConfigSGIX == NULL);\r\n  glewInfoFunc(\"glXCreateContextWithConfigSGIX\", glXCreateContextWithConfigSGIX == NULL);\r\n  glewInfoFunc(\"glXCreateGLXPixmapWithConfigSGIX\", glXCreateGLXPixmapWithConfigSGIX == NULL);\r\n  glewInfoFunc(\"glXGetFBConfigAttribSGIX\", glXGetFBConfigAttribSGIX == NULL);\r\n  glewInfoFunc(\"glXGetFBConfigFromVisualSGIX\", glXGetFBConfigFromVisualSGIX == NULL);\r\n  glewInfoFunc(\"glXGetVisualFromFBConfigSGIX\", glXGetVisualFromFBConfigSGIX == NULL);\r\n}\r\n\r\n#endif /* GLX_SGIX_fbconfig */\r\n\r\n#ifdef GLX_SGIX_hyperpipe\r\n\r\nstatic void _glewInfo_GLX_SGIX_hyperpipe (void)\r\n{\r\n  glewPrintExt(\"GLX_SGIX_hyperpipe\", GLXEW_SGIX_hyperpipe, glxewIsSupported(\"GLX_SGIX_hyperpipe\"), glxewGetExtension(\"GLX_SGIX_hyperpipe\"));\r\n\r\n  glewInfoFunc(\"glXBindHyperpipeSGIX\", glXBindHyperpipeSGIX == NULL);\r\n  glewInfoFunc(\"glXDestroyHyperpipeConfigSGIX\", glXDestroyHyperpipeConfigSGIX == NULL);\r\n  glewInfoFunc(\"glXHyperpipeAttribSGIX\", glXHyperpipeAttribSGIX == NULL);\r\n  glewInfoFunc(\"glXHyperpipeConfigSGIX\", glXHyperpipeConfigSGIX == NULL);\r\n  glewInfoFunc(\"glXQueryHyperpipeAttribSGIX\", glXQueryHyperpipeAttribSGIX == NULL);\r\n  glewInfoFunc(\"glXQueryHyperpipeBestAttribSGIX\", glXQueryHyperpipeBestAttribSGIX == NULL);\r\n  glewInfoFunc(\"glXQueryHyperpipeConfigSGIX\", glXQueryHyperpipeConfigSGIX == NULL);\r\n  glewInfoFunc(\"glXQueryHyperpipeNetworkSGIX\", glXQueryHyperpipeNetworkSGIX == NULL);\r\n}\r\n\r\n#endif /* GLX_SGIX_hyperpipe */\r\n\r\n#ifdef GLX_SGIX_pbuffer\r\n\r\nstatic void _glewInfo_GLX_SGIX_pbuffer (void)\r\n{\r\n  glewPrintExt(\"GLX_SGIX_pbuffer\", GLXEW_SGIX_pbuffer, glxewIsSupported(\"GLX_SGIX_pbuffer\"), glxewGetExtension(\"GLX_SGIX_pbuffer\"));\r\n\r\n  glewInfoFunc(\"glXCreateGLXPbufferSGIX\", glXCreateGLXPbufferSGIX == NULL);\r\n  glewInfoFunc(\"glXDestroyGLXPbufferSGIX\", glXDestroyGLXPbufferSGIX == NULL);\r\n  glewInfoFunc(\"glXGetSelectedEventSGIX\", glXGetSelectedEventSGIX == NULL);\r\n  glewInfoFunc(\"glXQueryGLXPbufferSGIX\", glXQueryGLXPbufferSGIX == NULL);\r\n  glewInfoFunc(\"glXSelectEventSGIX\", glXSelectEventSGIX == NULL);\r\n}\r\n\r\n#endif /* GLX_SGIX_pbuffer */\r\n\r\n#ifdef GLX_SGIX_swap_barrier\r\n\r\nstatic void _glewInfo_GLX_SGIX_swap_barrier (void)\r\n{\r\n  glewPrintExt(\"GLX_SGIX_swap_barrier\", GLXEW_SGIX_swap_barrier, glxewIsSupported(\"GLX_SGIX_swap_barrier\"), glxewGetExtension(\"GLX_SGIX_swap_barrier\"));\r\n\r\n  glewInfoFunc(\"glXBindSwapBarrierSGIX\", glXBindSwapBarrierSGIX == NULL);\r\n  glewInfoFunc(\"glXQueryMaxSwapBarriersSGIX\", glXQueryMaxSwapBarriersSGIX == NULL);\r\n}\r\n\r\n#endif /* GLX_SGIX_swap_barrier */\r\n\r\n#ifdef GLX_SGIX_swap_group\r\n\r\nstatic void _glewInfo_GLX_SGIX_swap_group (void)\r\n{\r\n  glewPrintExt(\"GLX_SGIX_swap_group\", GLXEW_SGIX_swap_group, glxewIsSupported(\"GLX_SGIX_swap_group\"), glxewGetExtension(\"GLX_SGIX_swap_group\"));\r\n\r\n  glewInfoFunc(\"glXJoinSwapGroupSGIX\", glXJoinSwapGroupSGIX == NULL);\r\n}\r\n\r\n#endif /* GLX_SGIX_swap_group */\r\n\r\n#ifdef GLX_SGIX_video_resize\r\n\r\nstatic void _glewInfo_GLX_SGIX_video_resize (void)\r\n{\r\n  glewPrintExt(\"GLX_SGIX_video_resize\", GLXEW_SGIX_video_resize, glxewIsSupported(\"GLX_SGIX_video_resize\"), glxewGetExtension(\"GLX_SGIX_video_resize\"));\r\n\r\n  glewInfoFunc(\"glXBindChannelToWindowSGIX\", glXBindChannelToWindowSGIX == NULL);\r\n  glewInfoFunc(\"glXChannelRectSGIX\", glXChannelRectSGIX == NULL);\r\n  glewInfoFunc(\"glXChannelRectSyncSGIX\", glXChannelRectSyncSGIX == NULL);\r\n  glewInfoFunc(\"glXQueryChannelDeltasSGIX\", glXQueryChannelDeltasSGIX == NULL);\r\n  glewInfoFunc(\"glXQueryChannelRectSGIX\", glXQueryChannelRectSGIX == NULL);\r\n}\r\n\r\n#endif /* GLX_SGIX_video_resize */\r\n\r\n#ifdef GLX_SGIX_visual_select_group\r\n\r\nstatic void _glewInfo_GLX_SGIX_visual_select_group (void)\r\n{\r\n  glewPrintExt(\"GLX_SGIX_visual_select_group\", GLXEW_SGIX_visual_select_group, glxewIsSupported(\"GLX_SGIX_visual_select_group\"), glxewGetExtension(\"GLX_SGIX_visual_select_group\"));\r\n}\r\n\r\n#endif /* GLX_SGIX_visual_select_group */\r\n\r\n#ifdef GLX_SGI_cushion\r\n\r\nstatic void _glewInfo_GLX_SGI_cushion (void)\r\n{\r\n  glewPrintExt(\"GLX_SGI_cushion\", GLXEW_SGI_cushion, glxewIsSupported(\"GLX_SGI_cushion\"), glxewGetExtension(\"GLX_SGI_cushion\"));\r\n\r\n  glewInfoFunc(\"glXCushionSGI\", glXCushionSGI == NULL);\r\n}\r\n\r\n#endif /* GLX_SGI_cushion */\r\n\r\n#ifdef GLX_SGI_make_current_read\r\n\r\nstatic void _glewInfo_GLX_SGI_make_current_read (void)\r\n{\r\n  glewPrintExt(\"GLX_SGI_make_current_read\", GLXEW_SGI_make_current_read, glxewIsSupported(\"GLX_SGI_make_current_read\"), glxewGetExtension(\"GLX_SGI_make_current_read\"));\r\n\r\n  glewInfoFunc(\"glXGetCurrentReadDrawableSGI\", glXGetCurrentReadDrawableSGI == NULL);\r\n  glewInfoFunc(\"glXMakeCurrentReadSGI\", glXMakeCurrentReadSGI == NULL);\r\n}\r\n\r\n#endif /* GLX_SGI_make_current_read */\r\n\r\n#ifdef GLX_SGI_swap_control\r\n\r\nstatic void _glewInfo_GLX_SGI_swap_control (void)\r\n{\r\n  glewPrintExt(\"GLX_SGI_swap_control\", GLXEW_SGI_swap_control, glxewIsSupported(\"GLX_SGI_swap_control\"), glxewGetExtension(\"GLX_SGI_swap_control\"));\r\n\r\n  glewInfoFunc(\"glXSwapIntervalSGI\", glXSwapIntervalSGI == NULL);\r\n}\r\n\r\n#endif /* GLX_SGI_swap_control */\r\n\r\n#ifdef GLX_SGI_video_sync\r\n\r\nstatic void _glewInfo_GLX_SGI_video_sync (void)\r\n{\r\n  glewPrintExt(\"GLX_SGI_video_sync\", GLXEW_SGI_video_sync, glxewIsSupported(\"GLX_SGI_video_sync\"), glxewGetExtension(\"GLX_SGI_video_sync\"));\r\n\r\n  glewInfoFunc(\"glXGetVideoSyncSGI\", glXGetVideoSyncSGI == NULL);\r\n  glewInfoFunc(\"glXWaitVideoSyncSGI\", glXWaitVideoSyncSGI == NULL);\r\n}\r\n\r\n#endif /* GLX_SGI_video_sync */\r\n\r\n#ifdef GLX_SUN_get_transparent_index\r\n\r\nstatic void _glewInfo_GLX_SUN_get_transparent_index (void)\r\n{\r\n  glewPrintExt(\"GLX_SUN_get_transparent_index\", GLXEW_SUN_get_transparent_index, glxewIsSupported(\"GLX_SUN_get_transparent_index\"), glxewGetExtension(\"GLX_SUN_get_transparent_index\"));\r\n\r\n  glewInfoFunc(\"glXGetTransparentIndexSUN\", glXGetTransparentIndexSUN == NULL);\r\n}\r\n\r\n#endif /* GLX_SUN_get_transparent_index */\r\n\r\n#ifdef GLX_SUN_video_resize\r\n\r\nstatic void _glewInfo_GLX_SUN_video_resize (void)\r\n{\r\n  glewPrintExt(\"GLX_SUN_video_resize\", GLXEW_SUN_video_resize, glxewIsSupported(\"GLX_SUN_video_resize\"), glxewGetExtension(\"GLX_SUN_video_resize\"));\r\n\r\n  glewInfoFunc(\"glXGetVideoResizeSUN\", glXGetVideoResizeSUN == NULL);\r\n  glewInfoFunc(\"glXVideoResizeSUN\", glXVideoResizeSUN == NULL);\r\n}\r\n\r\n#endif /* GLX_SUN_video_resize */\r\n\r\n#endif /* _WIN32 */\r\n\r\n/* ------------------------------------------------------------------------ */\r\n\r\nstatic void glewInfo (void)\r\n{\r\n#ifdef GL_VERSION_1_1\r\n  _glewInfo_GL_VERSION_1_1();\r\n#endif /* GL_VERSION_1_1 */\r\n#ifdef GL_VERSION_1_2\r\n  _glewInfo_GL_VERSION_1_2();\r\n#endif /* GL_VERSION_1_2 */\r\n#ifdef GL_VERSION_1_3\r\n  _glewInfo_GL_VERSION_1_3();\r\n#endif /* GL_VERSION_1_3 */\r\n#ifdef GL_VERSION_1_4\r\n  _glewInfo_GL_VERSION_1_4();\r\n#endif /* GL_VERSION_1_4 */\r\n#ifdef GL_VERSION_1_5\r\n  _glewInfo_GL_VERSION_1_5();\r\n#endif /* GL_VERSION_1_5 */\r\n#ifdef GL_VERSION_2_0\r\n  _glewInfo_GL_VERSION_2_0();\r\n#endif /* GL_VERSION_2_0 */\r\n#ifdef GL_VERSION_2_1\r\n  _glewInfo_GL_VERSION_2_1();\r\n#endif /* GL_VERSION_2_1 */\r\n#ifdef GL_VERSION_3_0\r\n  _glewInfo_GL_VERSION_3_0();\r\n#endif /* GL_VERSION_3_0 */\r\n#ifdef GL_VERSION_3_1\r\n  _glewInfo_GL_VERSION_3_1();\r\n#endif /* GL_VERSION_3_1 */\r\n#ifdef GL_VERSION_3_2\r\n  _glewInfo_GL_VERSION_3_2();\r\n#endif /* GL_VERSION_3_2 */\r\n#ifdef GL_3DFX_multisample\r\n  _glewInfo_GL_3DFX_multisample();\r\n#endif /* GL_3DFX_multisample */\r\n#ifdef GL_3DFX_tbuffer\r\n  _glewInfo_GL_3DFX_tbuffer();\r\n#endif /* GL_3DFX_tbuffer */\r\n#ifdef GL_3DFX_texture_compression_FXT1\r\n  _glewInfo_GL_3DFX_texture_compression_FXT1();\r\n#endif /* GL_3DFX_texture_compression_FXT1 */\r\n#ifdef GL_AMD_draw_buffers_blend\r\n  _glewInfo_GL_AMD_draw_buffers_blend();\r\n#endif /* GL_AMD_draw_buffers_blend */\r\n#ifdef GL_AMD_performance_monitor\r\n  _glewInfo_GL_AMD_performance_monitor();\r\n#endif /* GL_AMD_performance_monitor */\r\n#ifdef GL_AMD_seamless_cubemap_per_texture\r\n  _glewInfo_GL_AMD_seamless_cubemap_per_texture();\r\n#endif /* GL_AMD_seamless_cubemap_per_texture */\r\n#ifdef GL_AMD_shader_stencil_export\r\n  _glewInfo_GL_AMD_shader_stencil_export();\r\n#endif /* GL_AMD_shader_stencil_export */\r\n#ifdef GL_AMD_texture_texture4\r\n  _glewInfo_GL_AMD_texture_texture4();\r\n#endif /* GL_AMD_texture_texture4 */\r\n#ifdef GL_AMD_vertex_shader_tessellator\r\n  _glewInfo_GL_AMD_vertex_shader_tessellator();\r\n#endif /* GL_AMD_vertex_shader_tessellator */\r\n#ifdef GL_APPLE_aux_depth_stencil\r\n  _glewInfo_GL_APPLE_aux_depth_stencil();\r\n#endif /* GL_APPLE_aux_depth_stencil */\r\n#ifdef GL_APPLE_client_storage\r\n  _glewInfo_GL_APPLE_client_storage();\r\n#endif /* GL_APPLE_client_storage */\r\n#ifdef GL_APPLE_element_array\r\n  _glewInfo_GL_APPLE_element_array();\r\n#endif /* GL_APPLE_element_array */\r\n#ifdef GL_APPLE_fence\r\n  _glewInfo_GL_APPLE_fence();\r\n#endif /* GL_APPLE_fence */\r\n#ifdef GL_APPLE_float_pixels\r\n  _glewInfo_GL_APPLE_float_pixels();\r\n#endif /* GL_APPLE_float_pixels */\r\n#ifdef GL_APPLE_flush_buffer_range\r\n  _glewInfo_GL_APPLE_flush_buffer_range();\r\n#endif /* GL_APPLE_flush_buffer_range */\r\n#ifdef GL_APPLE_object_purgeable\r\n  _glewInfo_GL_APPLE_object_purgeable();\r\n#endif /* GL_APPLE_object_purgeable */\r\n#ifdef GL_APPLE_pixel_buffer\r\n  _glewInfo_GL_APPLE_pixel_buffer();\r\n#endif /* GL_APPLE_pixel_buffer */\r\n#ifdef GL_APPLE_rgb_422\r\n  _glewInfo_GL_APPLE_rgb_422();\r\n#endif /* GL_APPLE_rgb_422 */\r\n#ifdef GL_APPLE_row_bytes\r\n  _glewInfo_GL_APPLE_row_bytes();\r\n#endif /* GL_APPLE_row_bytes */\r\n#ifdef GL_APPLE_specular_vector\r\n  _glewInfo_GL_APPLE_specular_vector();\r\n#endif /* GL_APPLE_specular_vector */\r\n#ifdef GL_APPLE_texture_range\r\n  _glewInfo_GL_APPLE_texture_range();\r\n#endif /* GL_APPLE_texture_range */\r\n#ifdef GL_APPLE_transform_hint\r\n  _glewInfo_GL_APPLE_transform_hint();\r\n#endif /* GL_APPLE_transform_hint */\r\n#ifdef GL_APPLE_vertex_array_object\r\n  _glewInfo_GL_APPLE_vertex_array_object();\r\n#endif /* GL_APPLE_vertex_array_object */\r\n#ifdef GL_APPLE_vertex_array_range\r\n  _glewInfo_GL_APPLE_vertex_array_range();\r\n#endif /* GL_APPLE_vertex_array_range */\r\n#ifdef GL_APPLE_vertex_program_evaluators\r\n  _glewInfo_GL_APPLE_vertex_program_evaluators();\r\n#endif /* GL_APPLE_vertex_program_evaluators */\r\n#ifdef GL_APPLE_ycbcr_422\r\n  _glewInfo_GL_APPLE_ycbcr_422();\r\n#endif /* GL_APPLE_ycbcr_422 */\r\n#ifdef GL_ARB_color_buffer_float\r\n  _glewInfo_GL_ARB_color_buffer_float();\r\n#endif /* GL_ARB_color_buffer_float */\r\n#ifdef GL_ARB_compatibility\r\n  _glewInfo_GL_ARB_compatibility();\r\n#endif /* GL_ARB_compatibility */\r\n#ifdef GL_ARB_copy_buffer\r\n  _glewInfo_GL_ARB_copy_buffer();\r\n#endif /* GL_ARB_copy_buffer */\r\n#ifdef GL_ARB_depth_buffer_float\r\n  _glewInfo_GL_ARB_depth_buffer_float();\r\n#endif /* GL_ARB_depth_buffer_float */\r\n#ifdef GL_ARB_depth_clamp\r\n  _glewInfo_GL_ARB_depth_clamp();\r\n#endif /* GL_ARB_depth_clamp */\r\n#ifdef GL_ARB_depth_texture\r\n  _glewInfo_GL_ARB_depth_texture();\r\n#endif /* GL_ARB_depth_texture */\r\n#ifdef GL_ARB_draw_buffers\r\n  _glewInfo_GL_ARB_draw_buffers();\r\n#endif /* GL_ARB_draw_buffers */\r\n#ifdef GL_ARB_draw_buffers_blend\r\n  _glewInfo_GL_ARB_draw_buffers_blend();\r\n#endif /* GL_ARB_draw_buffers_blend */\r\n#ifdef GL_ARB_draw_elements_base_vertex\r\n  _glewInfo_GL_ARB_draw_elements_base_vertex();\r\n#endif /* GL_ARB_draw_elements_base_vertex */\r\n#ifdef GL_ARB_draw_instanced\r\n  _glewInfo_GL_ARB_draw_instanced();\r\n#endif /* GL_ARB_draw_instanced */\r\n#ifdef GL_ARB_fragment_coord_conventions\r\n  _glewInfo_GL_ARB_fragment_coord_conventions();\r\n#endif /* GL_ARB_fragment_coord_conventions */\r\n#ifdef GL_ARB_fragment_program\r\n  _glewInfo_GL_ARB_fragment_program();\r\n#endif /* GL_ARB_fragment_program */\r\n#ifdef GL_ARB_fragment_program_shadow\r\n  _glewInfo_GL_ARB_fragment_program_shadow();\r\n#endif /* GL_ARB_fragment_program_shadow */\r\n#ifdef GL_ARB_fragment_shader\r\n  _glewInfo_GL_ARB_fragment_shader();\r\n#endif /* GL_ARB_fragment_shader */\r\n#ifdef GL_ARB_framebuffer_object\r\n  _glewInfo_GL_ARB_framebuffer_object();\r\n#endif /* GL_ARB_framebuffer_object */\r\n#ifdef GL_ARB_framebuffer_sRGB\r\n  _glewInfo_GL_ARB_framebuffer_sRGB();\r\n#endif /* GL_ARB_framebuffer_sRGB */\r\n#ifdef GL_ARB_geometry_shader4\r\n  _glewInfo_GL_ARB_geometry_shader4();\r\n#endif /* GL_ARB_geometry_shader4 */\r\n#ifdef GL_ARB_half_float_pixel\r\n  _glewInfo_GL_ARB_half_float_pixel();\r\n#endif /* GL_ARB_half_float_pixel */\r\n#ifdef GL_ARB_half_float_vertex\r\n  _glewInfo_GL_ARB_half_float_vertex();\r\n#endif /* GL_ARB_half_float_vertex */\r\n#ifdef GL_ARB_imaging\r\n  _glewInfo_GL_ARB_imaging();\r\n#endif /* GL_ARB_imaging */\r\n#ifdef GL_ARB_instanced_arrays\r\n  _glewInfo_GL_ARB_instanced_arrays();\r\n#endif /* GL_ARB_instanced_arrays */\r\n#ifdef GL_ARB_map_buffer_range\r\n  _glewInfo_GL_ARB_map_buffer_range();\r\n#endif /* GL_ARB_map_buffer_range */\r\n#ifdef GL_ARB_matrix_palette\r\n  _glewInfo_GL_ARB_matrix_palette();\r\n#endif /* GL_ARB_matrix_palette */\r\n#ifdef GL_ARB_multisample\r\n  _glewInfo_GL_ARB_multisample();\r\n#endif /* GL_ARB_multisample */\r\n#ifdef GL_ARB_multitexture\r\n  _glewInfo_GL_ARB_multitexture();\r\n#endif /* GL_ARB_multitexture */\r\n#ifdef GL_ARB_occlusion_query\r\n  _glewInfo_GL_ARB_occlusion_query();\r\n#endif /* GL_ARB_occlusion_query */\r\n#ifdef GL_ARB_pixel_buffer_object\r\n  _glewInfo_GL_ARB_pixel_buffer_object();\r\n#endif /* GL_ARB_pixel_buffer_object */\r\n#ifdef GL_ARB_point_parameters\r\n  _glewInfo_GL_ARB_point_parameters();\r\n#endif /* GL_ARB_point_parameters */\r\n#ifdef GL_ARB_point_sprite\r\n  _glewInfo_GL_ARB_point_sprite();\r\n#endif /* GL_ARB_point_sprite */\r\n#ifdef GL_ARB_provoking_vertex\r\n  _glewInfo_GL_ARB_provoking_vertex();\r\n#endif /* GL_ARB_provoking_vertex */\r\n#ifdef GL_ARB_sample_shading\r\n  _glewInfo_GL_ARB_sample_shading();\r\n#endif /* GL_ARB_sample_shading */\r\n#ifdef GL_ARB_seamless_cube_map\r\n  _glewInfo_GL_ARB_seamless_cube_map();\r\n#endif /* GL_ARB_seamless_cube_map */\r\n#ifdef GL_ARB_shader_objects\r\n  _glewInfo_GL_ARB_shader_objects();\r\n#endif /* GL_ARB_shader_objects */\r\n#ifdef GL_ARB_shader_texture_lod\r\n  _glewInfo_GL_ARB_shader_texture_lod();\r\n#endif /* GL_ARB_shader_texture_lod */\r\n#ifdef GL_ARB_shading_language_100\r\n  _glewInfo_GL_ARB_shading_language_100();\r\n#endif /* GL_ARB_shading_language_100 */\r\n#ifdef GL_ARB_shadow\r\n  _glewInfo_GL_ARB_shadow();\r\n#endif /* GL_ARB_shadow */\r\n#ifdef GL_ARB_shadow_ambient\r\n  _glewInfo_GL_ARB_shadow_ambient();\r\n#endif /* GL_ARB_shadow_ambient */\r\n#ifdef GL_ARB_sync\r\n  _glewInfo_GL_ARB_sync();\r\n#endif /* GL_ARB_sync */\r\n#ifdef GL_ARB_texture_border_clamp\r\n  _glewInfo_GL_ARB_texture_border_clamp();\r\n#endif /* GL_ARB_texture_border_clamp */\r\n#ifdef GL_ARB_texture_buffer_object\r\n  _glewInfo_GL_ARB_texture_buffer_object();\r\n#endif /* GL_ARB_texture_buffer_object */\r\n#ifdef GL_ARB_texture_compression\r\n  _glewInfo_GL_ARB_texture_compression();\r\n#endif /* GL_ARB_texture_compression */\r\n#ifdef GL_ARB_texture_compression_rgtc\r\n  _glewInfo_GL_ARB_texture_compression_rgtc();\r\n#endif /* GL_ARB_texture_compression_rgtc */\r\n#ifdef GL_ARB_texture_cube_map\r\n  _glewInfo_GL_ARB_texture_cube_map();\r\n#endif /* GL_ARB_texture_cube_map */\r\n#ifdef GL_ARB_texture_cube_map_array\r\n  _glewInfo_GL_ARB_texture_cube_map_array();\r\n#endif /* GL_ARB_texture_cube_map_array */\r\n#ifdef GL_ARB_texture_env_add\r\n  _glewInfo_GL_ARB_texture_env_add();\r\n#endif /* GL_ARB_texture_env_add */\r\n#ifdef GL_ARB_texture_env_combine\r\n  _glewInfo_GL_ARB_texture_env_combine();\r\n#endif /* GL_ARB_texture_env_combine */\r\n#ifdef GL_ARB_texture_env_crossbar\r\n  _glewInfo_GL_ARB_texture_env_crossbar();\r\n#endif /* GL_ARB_texture_env_crossbar */\r\n#ifdef GL_ARB_texture_env_dot3\r\n  _glewInfo_GL_ARB_texture_env_dot3();\r\n#endif /* GL_ARB_texture_env_dot3 */\r\n#ifdef GL_ARB_texture_float\r\n  _glewInfo_GL_ARB_texture_float();\r\n#endif /* GL_ARB_texture_float */\r\n#ifdef GL_ARB_texture_gather\r\n  _glewInfo_GL_ARB_texture_gather();\r\n#endif /* GL_ARB_texture_gather */\r\n#ifdef GL_ARB_texture_mirrored_repeat\r\n  _glewInfo_GL_ARB_texture_mirrored_repeat();\r\n#endif /* GL_ARB_texture_mirrored_repeat */\r\n#ifdef GL_ARB_texture_multisample\r\n  _glewInfo_GL_ARB_texture_multisample();\r\n#endif /* GL_ARB_texture_multisample */\r\n#ifdef GL_ARB_texture_non_power_of_two\r\n  _glewInfo_GL_ARB_texture_non_power_of_two();\r\n#endif /* GL_ARB_texture_non_power_of_two */\r\n#ifdef GL_ARB_texture_query_lod\r\n  _glewInfo_GL_ARB_texture_query_lod();\r\n#endif /* GL_ARB_texture_query_lod */\r\n#ifdef GL_ARB_texture_rectangle\r\n  _glewInfo_GL_ARB_texture_rectangle();\r\n#endif /* GL_ARB_texture_rectangle */\r\n#ifdef GL_ARB_texture_rg\r\n  _glewInfo_GL_ARB_texture_rg();\r\n#endif /* GL_ARB_texture_rg */\r\n#ifdef GL_ARB_transpose_matrix\r\n  _glewInfo_GL_ARB_transpose_matrix();\r\n#endif /* GL_ARB_transpose_matrix */\r\n#ifdef GL_ARB_uniform_buffer_object\r\n  _glewInfo_GL_ARB_uniform_buffer_object();\r\n#endif /* GL_ARB_uniform_buffer_object */\r\n#ifdef GL_ARB_vertex_array_bgra\r\n  _glewInfo_GL_ARB_vertex_array_bgra();\r\n#endif /* GL_ARB_vertex_array_bgra */\r\n#ifdef GL_ARB_vertex_array_object\r\n  _glewInfo_GL_ARB_vertex_array_object();\r\n#endif /* GL_ARB_vertex_array_object */\r\n#ifdef GL_ARB_vertex_blend\r\n  _glewInfo_GL_ARB_vertex_blend();\r\n#endif /* GL_ARB_vertex_blend */\r\n#ifdef GL_ARB_vertex_buffer_object\r\n  _glewInfo_GL_ARB_vertex_buffer_object();\r\n#endif /* GL_ARB_vertex_buffer_object */\r\n#ifdef GL_ARB_vertex_program\r\n  _glewInfo_GL_ARB_vertex_program();\r\n#endif /* GL_ARB_vertex_program */\r\n#ifdef GL_ARB_vertex_shader\r\n  _glewInfo_GL_ARB_vertex_shader();\r\n#endif /* GL_ARB_vertex_shader */\r\n#ifdef GL_ARB_window_pos\r\n  _glewInfo_GL_ARB_window_pos();\r\n#endif /* GL_ARB_window_pos */\r\n#ifdef GL_ATIX_point_sprites\r\n  _glewInfo_GL_ATIX_point_sprites();\r\n#endif /* GL_ATIX_point_sprites */\r\n#ifdef GL_ATIX_texture_env_combine3\r\n  _glewInfo_GL_ATIX_texture_env_combine3();\r\n#endif /* GL_ATIX_texture_env_combine3 */\r\n#ifdef GL_ATIX_texture_env_route\r\n  _glewInfo_GL_ATIX_texture_env_route();\r\n#endif /* GL_ATIX_texture_env_route */\r\n#ifdef GL_ATIX_vertex_shader_output_point_size\r\n  _glewInfo_GL_ATIX_vertex_shader_output_point_size();\r\n#endif /* GL_ATIX_vertex_shader_output_point_size */\r\n#ifdef GL_ATI_draw_buffers\r\n  _glewInfo_GL_ATI_draw_buffers();\r\n#endif /* GL_ATI_draw_buffers */\r\n#ifdef GL_ATI_element_array\r\n  _glewInfo_GL_ATI_element_array();\r\n#endif /* GL_ATI_element_array */\r\n#ifdef GL_ATI_envmap_bumpmap\r\n  _glewInfo_GL_ATI_envmap_bumpmap();\r\n#endif /* GL_ATI_envmap_bumpmap */\r\n#ifdef GL_ATI_fragment_shader\r\n  _glewInfo_GL_ATI_fragment_shader();\r\n#endif /* GL_ATI_fragment_shader */\r\n#ifdef GL_ATI_map_object_buffer\r\n  _glewInfo_GL_ATI_map_object_buffer();\r\n#endif /* GL_ATI_map_object_buffer */\r\n#ifdef GL_ATI_meminfo\r\n  _glewInfo_GL_ATI_meminfo();\r\n#endif /* GL_ATI_meminfo */\r\n#ifdef GL_ATI_pn_triangles\r\n  _glewInfo_GL_ATI_pn_triangles();\r\n#endif /* GL_ATI_pn_triangles */\r\n#ifdef GL_ATI_separate_stencil\r\n  _glewInfo_GL_ATI_separate_stencil();\r\n#endif /* GL_ATI_separate_stencil */\r\n#ifdef GL_ATI_shader_texture_lod\r\n  _glewInfo_GL_ATI_shader_texture_lod();\r\n#endif /* GL_ATI_shader_texture_lod */\r\n#ifdef GL_ATI_text_fragment_shader\r\n  _glewInfo_GL_ATI_text_fragment_shader();\r\n#endif /* GL_ATI_text_fragment_shader */\r\n#ifdef GL_ATI_texture_compression_3dc\r\n  _glewInfo_GL_ATI_texture_compression_3dc();\r\n#endif /* GL_ATI_texture_compression_3dc */\r\n#ifdef GL_ATI_texture_env_combine3\r\n  _glewInfo_GL_ATI_texture_env_combine3();\r\n#endif /* GL_ATI_texture_env_combine3 */\r\n#ifdef GL_ATI_texture_float\r\n  _glewInfo_GL_ATI_texture_float();\r\n#endif /* GL_ATI_texture_float */\r\n#ifdef GL_ATI_texture_mirror_once\r\n  _glewInfo_GL_ATI_texture_mirror_once();\r\n#endif /* GL_ATI_texture_mirror_once */\r\n#ifdef GL_ATI_vertex_array_object\r\n  _glewInfo_GL_ATI_vertex_array_object();\r\n#endif /* GL_ATI_vertex_array_object */\r\n#ifdef GL_ATI_vertex_attrib_array_object\r\n  _glewInfo_GL_ATI_vertex_attrib_array_object();\r\n#endif /* GL_ATI_vertex_attrib_array_object */\r\n#ifdef GL_ATI_vertex_streams\r\n  _glewInfo_GL_ATI_vertex_streams();\r\n#endif /* GL_ATI_vertex_streams */\r\n#ifdef GL_EXT_422_pixels\r\n  _glewInfo_GL_EXT_422_pixels();\r\n#endif /* GL_EXT_422_pixels */\r\n#ifdef GL_EXT_Cg_shader\r\n  _glewInfo_GL_EXT_Cg_shader();\r\n#endif /* GL_EXT_Cg_shader */\r\n#ifdef GL_EXT_abgr\r\n  _glewInfo_GL_EXT_abgr();\r\n#endif /* GL_EXT_abgr */\r\n#ifdef GL_EXT_bgra\r\n  _glewInfo_GL_EXT_bgra();\r\n#endif /* GL_EXT_bgra */\r\n#ifdef GL_EXT_bindable_uniform\r\n  _glewInfo_GL_EXT_bindable_uniform();\r\n#endif /* GL_EXT_bindable_uniform */\r\n#ifdef GL_EXT_blend_color\r\n  _glewInfo_GL_EXT_blend_color();\r\n#endif /* GL_EXT_blend_color */\r\n#ifdef GL_EXT_blend_equation_separate\r\n  _glewInfo_GL_EXT_blend_equation_separate();\r\n#endif /* GL_EXT_blend_equation_separate */\r\n#ifdef GL_EXT_blend_func_separate\r\n  _glewInfo_GL_EXT_blend_func_separate();\r\n#endif /* GL_EXT_blend_func_separate */\r\n#ifdef GL_EXT_blend_logic_op\r\n  _glewInfo_GL_EXT_blend_logic_op();\r\n#endif /* GL_EXT_blend_logic_op */\r\n#ifdef GL_EXT_blend_minmax\r\n  _glewInfo_GL_EXT_blend_minmax();\r\n#endif /* GL_EXT_blend_minmax */\r\n#ifdef GL_EXT_blend_subtract\r\n  _glewInfo_GL_EXT_blend_subtract();\r\n#endif /* GL_EXT_blend_subtract */\r\n#ifdef GL_EXT_clip_volume_hint\r\n  _glewInfo_GL_EXT_clip_volume_hint();\r\n#endif /* GL_EXT_clip_volume_hint */\r\n#ifdef GL_EXT_cmyka\r\n  _glewInfo_GL_EXT_cmyka();\r\n#endif /* GL_EXT_cmyka */\r\n#ifdef GL_EXT_color_subtable\r\n  _glewInfo_GL_EXT_color_subtable();\r\n#endif /* GL_EXT_color_subtable */\r\n#ifdef GL_EXT_compiled_vertex_array\r\n  _glewInfo_GL_EXT_compiled_vertex_array();\r\n#endif /* GL_EXT_compiled_vertex_array */\r\n#ifdef GL_EXT_convolution\r\n  _glewInfo_GL_EXT_convolution();\r\n#endif /* GL_EXT_convolution */\r\n#ifdef GL_EXT_coordinate_frame\r\n  _glewInfo_GL_EXT_coordinate_frame();\r\n#endif /* GL_EXT_coordinate_frame */\r\n#ifdef GL_EXT_copy_texture\r\n  _glewInfo_GL_EXT_copy_texture();\r\n#endif /* GL_EXT_copy_texture */\r\n#ifdef GL_EXT_cull_vertex\r\n  _glewInfo_GL_EXT_cull_vertex();\r\n#endif /* GL_EXT_cull_vertex */\r\n#ifdef GL_EXT_depth_bounds_test\r\n  _glewInfo_GL_EXT_depth_bounds_test();\r\n#endif /* GL_EXT_depth_bounds_test */\r\n#ifdef GL_EXT_direct_state_access\r\n  _glewInfo_GL_EXT_direct_state_access();\r\n#endif /* GL_EXT_direct_state_access */\r\n#ifdef GL_EXT_draw_buffers2\r\n  _glewInfo_GL_EXT_draw_buffers2();\r\n#endif /* GL_EXT_draw_buffers2 */\r\n#ifdef GL_EXT_draw_instanced\r\n  _glewInfo_GL_EXT_draw_instanced();\r\n#endif /* GL_EXT_draw_instanced */\r\n#ifdef GL_EXT_draw_range_elements\r\n  _glewInfo_GL_EXT_draw_range_elements();\r\n#endif /* GL_EXT_draw_range_elements */\r\n#ifdef GL_EXT_fog_coord\r\n  _glewInfo_GL_EXT_fog_coord();\r\n#endif /* GL_EXT_fog_coord */\r\n#ifdef GL_EXT_fragment_lighting\r\n  _glewInfo_GL_EXT_fragment_lighting();\r\n#endif /* GL_EXT_fragment_lighting */\r\n#ifdef GL_EXT_framebuffer_blit\r\n  _glewInfo_GL_EXT_framebuffer_blit();\r\n#endif /* GL_EXT_framebuffer_blit */\r\n#ifdef GL_EXT_framebuffer_multisample\r\n  _glewInfo_GL_EXT_framebuffer_multisample();\r\n#endif /* GL_EXT_framebuffer_multisample */\r\n#ifdef GL_EXT_framebuffer_object\r\n  _glewInfo_GL_EXT_framebuffer_object();\r\n#endif /* GL_EXT_framebuffer_object */\r\n#ifdef GL_EXT_framebuffer_sRGB\r\n  _glewInfo_GL_EXT_framebuffer_sRGB();\r\n#endif /* GL_EXT_framebuffer_sRGB */\r\n#ifdef GL_EXT_geometry_shader4\r\n  _glewInfo_GL_EXT_geometry_shader4();\r\n#endif /* GL_EXT_geometry_shader4 */\r\n#ifdef GL_EXT_gpu_program_parameters\r\n  _glewInfo_GL_EXT_gpu_program_parameters();\r\n#endif /* GL_EXT_gpu_program_parameters */\r\n#ifdef GL_EXT_gpu_shader4\r\n  _glewInfo_GL_EXT_gpu_shader4();\r\n#endif /* GL_EXT_gpu_shader4 */\r\n#ifdef GL_EXT_histogram\r\n  _glewInfo_GL_EXT_histogram();\r\n#endif /* GL_EXT_histogram */\r\n#ifdef GL_EXT_index_array_formats\r\n  _glewInfo_GL_EXT_index_array_formats();\r\n#endif /* GL_EXT_index_array_formats */\r\n#ifdef GL_EXT_index_func\r\n  _glewInfo_GL_EXT_index_func();\r\n#endif /* GL_EXT_index_func */\r\n#ifdef GL_EXT_index_material\r\n  _glewInfo_GL_EXT_index_material();\r\n#endif /* GL_EXT_index_material */\r\n#ifdef GL_EXT_index_texture\r\n  _glewInfo_GL_EXT_index_texture();\r\n#endif /* GL_EXT_index_texture */\r\n#ifdef GL_EXT_light_texture\r\n  _glewInfo_GL_EXT_light_texture();\r\n#endif /* GL_EXT_light_texture */\r\n#ifdef GL_EXT_misc_attribute\r\n  _glewInfo_GL_EXT_misc_attribute();\r\n#endif /* GL_EXT_misc_attribute */\r\n#ifdef GL_EXT_multi_draw_arrays\r\n  _glewInfo_GL_EXT_multi_draw_arrays();\r\n#endif /* GL_EXT_multi_draw_arrays */\r\n#ifdef GL_EXT_multisample\r\n  _glewInfo_GL_EXT_multisample();\r\n#endif /* GL_EXT_multisample */\r\n#ifdef GL_EXT_packed_depth_stencil\r\n  _glewInfo_GL_EXT_packed_depth_stencil();\r\n#endif /* GL_EXT_packed_depth_stencil */\r\n#ifdef GL_EXT_packed_float\r\n  _glewInfo_GL_EXT_packed_float();\r\n#endif /* GL_EXT_packed_float */\r\n#ifdef GL_EXT_packed_pixels\r\n  _glewInfo_GL_EXT_packed_pixels();\r\n#endif /* GL_EXT_packed_pixels */\r\n#ifdef GL_EXT_paletted_texture\r\n  _glewInfo_GL_EXT_paletted_texture();\r\n#endif /* GL_EXT_paletted_texture */\r\n#ifdef GL_EXT_pixel_buffer_object\r\n  _glewInfo_GL_EXT_pixel_buffer_object();\r\n#endif /* GL_EXT_pixel_buffer_object */\r\n#ifdef GL_EXT_pixel_transform\r\n  _glewInfo_GL_EXT_pixel_transform();\r\n#endif /* GL_EXT_pixel_transform */\r\n#ifdef GL_EXT_pixel_transform_color_table\r\n  _glewInfo_GL_EXT_pixel_transform_color_table();\r\n#endif /* GL_EXT_pixel_transform_color_table */\r\n#ifdef GL_EXT_point_parameters\r\n  _glewInfo_GL_EXT_point_parameters();\r\n#endif /* GL_EXT_point_parameters */\r\n#ifdef GL_EXT_polygon_offset\r\n  _glewInfo_GL_EXT_polygon_offset();\r\n#endif /* GL_EXT_polygon_offset */\r\n#ifdef GL_EXT_provoking_vertex\r\n  _glewInfo_GL_EXT_provoking_vertex();\r\n#endif /* GL_EXT_provoking_vertex */\r\n#ifdef GL_EXT_rescale_normal\r\n  _glewInfo_GL_EXT_rescale_normal();\r\n#endif /* GL_EXT_rescale_normal */\r\n#ifdef GL_EXT_scene_marker\r\n  _glewInfo_GL_EXT_scene_marker();\r\n#endif /* GL_EXT_scene_marker */\r\n#ifdef GL_EXT_secondary_color\r\n  _glewInfo_GL_EXT_secondary_color();\r\n#endif /* GL_EXT_secondary_color */\r\n#ifdef GL_EXT_separate_shader_objects\r\n  _glewInfo_GL_EXT_separate_shader_objects();\r\n#endif /* GL_EXT_separate_shader_objects */\r\n#ifdef GL_EXT_separate_specular_color\r\n  _glewInfo_GL_EXT_separate_specular_color();\r\n#endif /* GL_EXT_separate_specular_color */\r\n#ifdef GL_EXT_shadow_funcs\r\n  _glewInfo_GL_EXT_shadow_funcs();\r\n#endif /* GL_EXT_shadow_funcs */\r\n#ifdef GL_EXT_shared_texture_palette\r\n  _glewInfo_GL_EXT_shared_texture_palette();\r\n#endif /* GL_EXT_shared_texture_palette */\r\n#ifdef GL_EXT_stencil_clear_tag\r\n  _glewInfo_GL_EXT_stencil_clear_tag();\r\n#endif /* GL_EXT_stencil_clear_tag */\r\n#ifdef GL_EXT_stencil_two_side\r\n  _glewInfo_GL_EXT_stencil_two_side();\r\n#endif /* GL_EXT_stencil_two_side */\r\n#ifdef GL_EXT_stencil_wrap\r\n  _glewInfo_GL_EXT_stencil_wrap();\r\n#endif /* GL_EXT_stencil_wrap */\r\n#ifdef GL_EXT_subtexture\r\n  _glewInfo_GL_EXT_subtexture();\r\n#endif /* GL_EXT_subtexture */\r\n#ifdef GL_EXT_texture\r\n  _glewInfo_GL_EXT_texture();\r\n#endif /* GL_EXT_texture */\r\n#ifdef GL_EXT_texture3D\r\n  _glewInfo_GL_EXT_texture3D();\r\n#endif /* GL_EXT_texture3D */\r\n#ifdef GL_EXT_texture_array\r\n  _glewInfo_GL_EXT_texture_array();\r\n#endif /* GL_EXT_texture_array */\r\n#ifdef GL_EXT_texture_buffer_object\r\n  _glewInfo_GL_EXT_texture_buffer_object();\r\n#endif /* GL_EXT_texture_buffer_object */\r\n#ifdef GL_EXT_texture_compression_dxt1\r\n  _glewInfo_GL_EXT_texture_compression_dxt1();\r\n#endif /* GL_EXT_texture_compression_dxt1 */\r\n#ifdef GL_EXT_texture_compression_latc\r\n  _glewInfo_GL_EXT_texture_compression_latc();\r\n#endif /* GL_EXT_texture_compression_latc */\r\n#ifdef GL_EXT_texture_compression_rgtc\r\n  _glewInfo_GL_EXT_texture_compression_rgtc();\r\n#endif /* GL_EXT_texture_compression_rgtc */\r\n#ifdef GL_EXT_texture_compression_s3tc\r\n  _glewInfo_GL_EXT_texture_compression_s3tc();\r\n#endif /* GL_EXT_texture_compression_s3tc */\r\n#ifdef GL_EXT_texture_cube_map\r\n  _glewInfo_GL_EXT_texture_cube_map();\r\n#endif /* GL_EXT_texture_cube_map */\r\n#ifdef GL_EXT_texture_edge_clamp\r\n  _glewInfo_GL_EXT_texture_edge_clamp();\r\n#endif /* GL_EXT_texture_edge_clamp */\r\n#ifdef GL_EXT_texture_env\r\n  _glewInfo_GL_EXT_texture_env();\r\n#endif /* GL_EXT_texture_env */\r\n#ifdef GL_EXT_texture_env_add\r\n  _glewInfo_GL_EXT_texture_env_add();\r\n#endif /* GL_EXT_texture_env_add */\r\n#ifdef GL_EXT_texture_env_combine\r\n  _glewInfo_GL_EXT_texture_env_combine();\r\n#endif /* GL_EXT_texture_env_combine */\r\n#ifdef GL_EXT_texture_env_dot3\r\n  _glewInfo_GL_EXT_texture_env_dot3();\r\n#endif /* GL_EXT_texture_env_dot3 */\r\n#ifdef GL_EXT_texture_filter_anisotropic\r\n  _glewInfo_GL_EXT_texture_filter_anisotropic();\r\n#endif /* GL_EXT_texture_filter_anisotropic */\r\n#ifdef GL_EXT_texture_integer\r\n  _glewInfo_GL_EXT_texture_integer();\r\n#endif /* GL_EXT_texture_integer */\r\n#ifdef GL_EXT_texture_lod_bias\r\n  _glewInfo_GL_EXT_texture_lod_bias();\r\n#endif /* GL_EXT_texture_lod_bias */\r\n#ifdef GL_EXT_texture_mirror_clamp\r\n  _glewInfo_GL_EXT_texture_mirror_clamp();\r\n#endif /* GL_EXT_texture_mirror_clamp */\r\n#ifdef GL_EXT_texture_object\r\n  _glewInfo_GL_EXT_texture_object();\r\n#endif /* GL_EXT_texture_object */\r\n#ifdef GL_EXT_texture_perturb_normal\r\n  _glewInfo_GL_EXT_texture_perturb_normal();\r\n#endif /* GL_EXT_texture_perturb_normal */\r\n#ifdef GL_EXT_texture_rectangle\r\n  _glewInfo_GL_EXT_texture_rectangle();\r\n#endif /* GL_EXT_texture_rectangle */\r\n#ifdef GL_EXT_texture_sRGB\r\n  _glewInfo_GL_EXT_texture_sRGB();\r\n#endif /* GL_EXT_texture_sRGB */\r\n#ifdef GL_EXT_texture_shared_exponent\r\n  _glewInfo_GL_EXT_texture_shared_exponent();\r\n#endif /* GL_EXT_texture_shared_exponent */\r\n#ifdef GL_EXT_texture_snorm\r\n  _glewInfo_GL_EXT_texture_snorm();\r\n#endif /* GL_EXT_texture_snorm */\r\n#ifdef GL_EXT_texture_swizzle\r\n  _glewInfo_GL_EXT_texture_swizzle();\r\n#endif /* GL_EXT_texture_swizzle */\r\n#ifdef GL_EXT_timer_query\r\n  _glewInfo_GL_EXT_timer_query();\r\n#endif /* GL_EXT_timer_query */\r\n#ifdef GL_EXT_transform_feedback\r\n  _glewInfo_GL_EXT_transform_feedback();\r\n#endif /* GL_EXT_transform_feedback */\r\n#ifdef GL_EXT_vertex_array\r\n  _glewInfo_GL_EXT_vertex_array();\r\n#endif /* GL_EXT_vertex_array */\r\n#ifdef GL_EXT_vertex_array_bgra\r\n  _glewInfo_GL_EXT_vertex_array_bgra();\r\n#endif /* GL_EXT_vertex_array_bgra */\r\n#ifdef GL_EXT_vertex_shader\r\n  _glewInfo_GL_EXT_vertex_shader();\r\n#endif /* GL_EXT_vertex_shader */\r\n#ifdef GL_EXT_vertex_weighting\r\n  _glewInfo_GL_EXT_vertex_weighting();\r\n#endif /* GL_EXT_vertex_weighting */\r\n#ifdef GL_GREMEDY_frame_terminator\r\n  _glewInfo_GL_GREMEDY_frame_terminator();\r\n#endif /* GL_GREMEDY_frame_terminator */\r\n#ifdef GL_GREMEDY_string_marker\r\n  _glewInfo_GL_GREMEDY_string_marker();\r\n#endif /* GL_GREMEDY_string_marker */\r\n#ifdef GL_HP_convolution_border_modes\r\n  _glewInfo_GL_HP_convolution_border_modes();\r\n#endif /* GL_HP_convolution_border_modes */\r\n#ifdef GL_HP_image_transform\r\n  _glewInfo_GL_HP_image_transform();\r\n#endif /* GL_HP_image_transform */\r\n#ifdef GL_HP_occlusion_test\r\n  _glewInfo_GL_HP_occlusion_test();\r\n#endif /* GL_HP_occlusion_test */\r\n#ifdef GL_HP_texture_lighting\r\n  _glewInfo_GL_HP_texture_lighting();\r\n#endif /* GL_HP_texture_lighting */\r\n#ifdef GL_IBM_cull_vertex\r\n  _glewInfo_GL_IBM_cull_vertex();\r\n#endif /* GL_IBM_cull_vertex */\r\n#ifdef GL_IBM_multimode_draw_arrays\r\n  _glewInfo_GL_IBM_multimode_draw_arrays();\r\n#endif /* GL_IBM_multimode_draw_arrays */\r\n#ifdef GL_IBM_rasterpos_clip\r\n  _glewInfo_GL_IBM_rasterpos_clip();\r\n#endif /* GL_IBM_rasterpos_clip */\r\n#ifdef GL_IBM_static_data\r\n  _glewInfo_GL_IBM_static_data();\r\n#endif /* GL_IBM_static_data */\r\n#ifdef GL_IBM_texture_mirrored_repeat\r\n  _glewInfo_GL_IBM_texture_mirrored_repeat();\r\n#endif /* GL_IBM_texture_mirrored_repeat */\r\n#ifdef GL_IBM_vertex_array_lists\r\n  _glewInfo_GL_IBM_vertex_array_lists();\r\n#endif /* GL_IBM_vertex_array_lists */\r\n#ifdef GL_INGR_color_clamp\r\n  _glewInfo_GL_INGR_color_clamp();\r\n#endif /* GL_INGR_color_clamp */\r\n#ifdef GL_INGR_interlace_read\r\n  _glewInfo_GL_INGR_interlace_read();\r\n#endif /* GL_INGR_interlace_read */\r\n#ifdef GL_INTEL_parallel_arrays\r\n  _glewInfo_GL_INTEL_parallel_arrays();\r\n#endif /* GL_INTEL_parallel_arrays */\r\n#ifdef GL_INTEL_texture_scissor\r\n  _glewInfo_GL_INTEL_texture_scissor();\r\n#endif /* GL_INTEL_texture_scissor */\r\n#ifdef GL_KTX_buffer_region\r\n  _glewInfo_GL_KTX_buffer_region();\r\n#endif /* GL_KTX_buffer_region */\r\n#ifdef GL_MESAX_texture_stack\r\n  _glewInfo_GL_MESAX_texture_stack();\r\n#endif /* GL_MESAX_texture_stack */\r\n#ifdef GL_MESA_pack_invert\r\n  _glewInfo_GL_MESA_pack_invert();\r\n#endif /* GL_MESA_pack_invert */\r\n#ifdef GL_MESA_resize_buffers\r\n  _glewInfo_GL_MESA_resize_buffers();\r\n#endif /* GL_MESA_resize_buffers */\r\n#ifdef GL_MESA_window_pos\r\n  _glewInfo_GL_MESA_window_pos();\r\n#endif /* GL_MESA_window_pos */\r\n#ifdef GL_MESA_ycbcr_texture\r\n  _glewInfo_GL_MESA_ycbcr_texture();\r\n#endif /* GL_MESA_ycbcr_texture */\r\n#ifdef GL_NV_blend_square\r\n  _glewInfo_GL_NV_blend_square();\r\n#endif /* GL_NV_blend_square */\r\n#ifdef GL_NV_conditional_render\r\n  _glewInfo_GL_NV_conditional_render();\r\n#endif /* GL_NV_conditional_render */\r\n#ifdef GL_NV_copy_depth_to_color\r\n  _glewInfo_GL_NV_copy_depth_to_color();\r\n#endif /* GL_NV_copy_depth_to_color */\r\n#ifdef GL_NV_copy_image\r\n  _glewInfo_GL_NV_copy_image();\r\n#endif /* GL_NV_copy_image */\r\n#ifdef GL_NV_depth_buffer_float\r\n  _glewInfo_GL_NV_depth_buffer_float();\r\n#endif /* GL_NV_depth_buffer_float */\r\n#ifdef GL_NV_depth_clamp\r\n  _glewInfo_GL_NV_depth_clamp();\r\n#endif /* GL_NV_depth_clamp */\r\n#ifdef GL_NV_depth_range_unclamped\r\n  _glewInfo_GL_NV_depth_range_unclamped();\r\n#endif /* GL_NV_depth_range_unclamped */\r\n#ifdef GL_NV_evaluators\r\n  _glewInfo_GL_NV_evaluators();\r\n#endif /* GL_NV_evaluators */\r\n#ifdef GL_NV_explicit_multisample\r\n  _glewInfo_GL_NV_explicit_multisample();\r\n#endif /* GL_NV_explicit_multisample */\r\n#ifdef GL_NV_fence\r\n  _glewInfo_GL_NV_fence();\r\n#endif /* GL_NV_fence */\r\n#ifdef GL_NV_float_buffer\r\n  _glewInfo_GL_NV_float_buffer();\r\n#endif /* GL_NV_float_buffer */\r\n#ifdef GL_NV_fog_distance\r\n  _glewInfo_GL_NV_fog_distance();\r\n#endif /* GL_NV_fog_distance */\r\n#ifdef GL_NV_fragment_program\r\n  _glewInfo_GL_NV_fragment_program();\r\n#endif /* GL_NV_fragment_program */\r\n#ifdef GL_NV_fragment_program2\r\n  _glewInfo_GL_NV_fragment_program2();\r\n#endif /* GL_NV_fragment_program2 */\r\n#ifdef GL_NV_fragment_program4\r\n  _glewInfo_GL_NV_fragment_program4();\r\n#endif /* GL_NV_fragment_program4 */\r\n#ifdef GL_NV_fragment_program_option\r\n  _glewInfo_GL_NV_fragment_program_option();\r\n#endif /* GL_NV_fragment_program_option */\r\n#ifdef GL_NV_framebuffer_multisample_coverage\r\n  _glewInfo_GL_NV_framebuffer_multisample_coverage();\r\n#endif /* GL_NV_framebuffer_multisample_coverage */\r\n#ifdef GL_NV_geometry_program4\r\n  _glewInfo_GL_NV_geometry_program4();\r\n#endif /* GL_NV_geometry_program4 */\r\n#ifdef GL_NV_geometry_shader4\r\n  _glewInfo_GL_NV_geometry_shader4();\r\n#endif /* GL_NV_geometry_shader4 */\r\n#ifdef GL_NV_gpu_program4\r\n  _glewInfo_GL_NV_gpu_program4();\r\n#endif /* GL_NV_gpu_program4 */\r\n#ifdef GL_NV_half_float\r\n  _glewInfo_GL_NV_half_float();\r\n#endif /* GL_NV_half_float */\r\n#ifdef GL_NV_light_max_exponent\r\n  _glewInfo_GL_NV_light_max_exponent();\r\n#endif /* GL_NV_light_max_exponent */\r\n#ifdef GL_NV_multisample_filter_hint\r\n  _glewInfo_GL_NV_multisample_filter_hint();\r\n#endif /* GL_NV_multisample_filter_hint */\r\n#ifdef GL_NV_occlusion_query\r\n  _glewInfo_GL_NV_occlusion_query();\r\n#endif /* GL_NV_occlusion_query */\r\n#ifdef GL_NV_packed_depth_stencil\r\n  _glewInfo_GL_NV_packed_depth_stencil();\r\n#endif /* GL_NV_packed_depth_stencil */\r\n#ifdef GL_NV_parameter_buffer_object\r\n  _glewInfo_GL_NV_parameter_buffer_object();\r\n#endif /* GL_NV_parameter_buffer_object */\r\n#ifdef GL_NV_parameter_buffer_object2\r\n  _glewInfo_GL_NV_parameter_buffer_object2();\r\n#endif /* GL_NV_parameter_buffer_object2 */\r\n#ifdef GL_NV_pixel_data_range\r\n  _glewInfo_GL_NV_pixel_data_range();\r\n#endif /* GL_NV_pixel_data_range */\r\n#ifdef GL_NV_point_sprite\r\n  _glewInfo_GL_NV_point_sprite();\r\n#endif /* GL_NV_point_sprite */\r\n#ifdef GL_NV_present_video\r\n  _glewInfo_GL_NV_present_video();\r\n#endif /* GL_NV_present_video */\r\n#ifdef GL_NV_primitive_restart\r\n  _glewInfo_GL_NV_primitive_restart();\r\n#endif /* GL_NV_primitive_restart */\r\n#ifdef GL_NV_register_combiners\r\n  _glewInfo_GL_NV_register_combiners();\r\n#endif /* GL_NV_register_combiners */\r\n#ifdef GL_NV_register_combiners2\r\n  _glewInfo_GL_NV_register_combiners2();\r\n#endif /* GL_NV_register_combiners2 */\r\n#ifdef GL_NV_shader_buffer_load\r\n  _glewInfo_GL_NV_shader_buffer_load();\r\n#endif /* GL_NV_shader_buffer_load */\r\n#ifdef GL_NV_texgen_emboss\r\n  _glewInfo_GL_NV_texgen_emboss();\r\n#endif /* GL_NV_texgen_emboss */\r\n#ifdef GL_NV_texgen_reflection\r\n  _glewInfo_GL_NV_texgen_reflection();\r\n#endif /* GL_NV_texgen_reflection */\r\n#ifdef GL_NV_texture_barrier\r\n  _glewInfo_GL_NV_texture_barrier();\r\n#endif /* GL_NV_texture_barrier */\r\n#ifdef GL_NV_texture_compression_vtc\r\n  _glewInfo_GL_NV_texture_compression_vtc();\r\n#endif /* GL_NV_texture_compression_vtc */\r\n#ifdef GL_NV_texture_env_combine4\r\n  _glewInfo_GL_NV_texture_env_combine4();\r\n#endif /* GL_NV_texture_env_combine4 */\r\n#ifdef GL_NV_texture_expand_normal\r\n  _glewInfo_GL_NV_texture_expand_normal();\r\n#endif /* GL_NV_texture_expand_normal */\r\n#ifdef GL_NV_texture_rectangle\r\n  _glewInfo_GL_NV_texture_rectangle();\r\n#endif /* GL_NV_texture_rectangle */\r\n#ifdef GL_NV_texture_shader\r\n  _glewInfo_GL_NV_texture_shader();\r\n#endif /* GL_NV_texture_shader */\r\n#ifdef GL_NV_texture_shader2\r\n  _glewInfo_GL_NV_texture_shader2();\r\n#endif /* GL_NV_texture_shader2 */\r\n#ifdef GL_NV_texture_shader3\r\n  _glewInfo_GL_NV_texture_shader3();\r\n#endif /* GL_NV_texture_shader3 */\r\n#ifdef GL_NV_transform_feedback\r\n  _glewInfo_GL_NV_transform_feedback();\r\n#endif /* GL_NV_transform_feedback */\r\n#ifdef GL_NV_transform_feedback2\r\n  _glewInfo_GL_NV_transform_feedback2();\r\n#endif /* GL_NV_transform_feedback2 */\r\n#ifdef GL_NV_vertex_array_range\r\n  _glewInfo_GL_NV_vertex_array_range();\r\n#endif /* GL_NV_vertex_array_range */\r\n#ifdef GL_NV_vertex_array_range2\r\n  _glewInfo_GL_NV_vertex_array_range2();\r\n#endif /* GL_NV_vertex_array_range2 */\r\n#ifdef GL_NV_vertex_buffer_unified_memory\r\n  _glewInfo_GL_NV_vertex_buffer_unified_memory();\r\n#endif /* GL_NV_vertex_buffer_unified_memory */\r\n#ifdef GL_NV_vertex_program\r\n  _glewInfo_GL_NV_vertex_program();\r\n#endif /* GL_NV_vertex_program */\r\n#ifdef GL_NV_vertex_program1_1\r\n  _glewInfo_GL_NV_vertex_program1_1();\r\n#endif /* GL_NV_vertex_program1_1 */\r\n#ifdef GL_NV_vertex_program2\r\n  _glewInfo_GL_NV_vertex_program2();\r\n#endif /* GL_NV_vertex_program2 */\r\n#ifdef GL_NV_vertex_program2_option\r\n  _glewInfo_GL_NV_vertex_program2_option();\r\n#endif /* GL_NV_vertex_program2_option */\r\n#ifdef GL_NV_vertex_program3\r\n  _glewInfo_GL_NV_vertex_program3();\r\n#endif /* GL_NV_vertex_program3 */\r\n#ifdef GL_NV_vertex_program4\r\n  _glewInfo_GL_NV_vertex_program4();\r\n#endif /* GL_NV_vertex_program4 */\r\n#ifdef GL_OES_byte_coordinates\r\n  _glewInfo_GL_OES_byte_coordinates();\r\n#endif /* GL_OES_byte_coordinates */\r\n#ifdef GL_OES_compressed_paletted_texture\r\n  _glewInfo_GL_OES_compressed_paletted_texture();\r\n#endif /* GL_OES_compressed_paletted_texture */\r\n#ifdef GL_OES_read_format\r\n  _glewInfo_GL_OES_read_format();\r\n#endif /* GL_OES_read_format */\r\n#ifdef GL_OES_single_precision\r\n  _glewInfo_GL_OES_single_precision();\r\n#endif /* GL_OES_single_precision */\r\n#ifdef GL_OML_interlace\r\n  _glewInfo_GL_OML_interlace();\r\n#endif /* GL_OML_interlace */\r\n#ifdef GL_OML_resample\r\n  _glewInfo_GL_OML_resample();\r\n#endif /* GL_OML_resample */\r\n#ifdef GL_OML_subsample\r\n  _glewInfo_GL_OML_subsample();\r\n#endif /* GL_OML_subsample */\r\n#ifdef GL_PGI_misc_hints\r\n  _glewInfo_GL_PGI_misc_hints();\r\n#endif /* GL_PGI_misc_hints */\r\n#ifdef GL_PGI_vertex_hints\r\n  _glewInfo_GL_PGI_vertex_hints();\r\n#endif /* GL_PGI_vertex_hints */\r\n#ifdef GL_REND_screen_coordinates\r\n  _glewInfo_GL_REND_screen_coordinates();\r\n#endif /* GL_REND_screen_coordinates */\r\n#ifdef GL_S3_s3tc\r\n  _glewInfo_GL_S3_s3tc();\r\n#endif /* GL_S3_s3tc */\r\n#ifdef GL_SGIS_color_range\r\n  _glewInfo_GL_SGIS_color_range();\r\n#endif /* GL_SGIS_color_range */\r\n#ifdef GL_SGIS_detail_texture\r\n  _glewInfo_GL_SGIS_detail_texture();\r\n#endif /* GL_SGIS_detail_texture */\r\n#ifdef GL_SGIS_fog_function\r\n  _glewInfo_GL_SGIS_fog_function();\r\n#endif /* GL_SGIS_fog_function */\r\n#ifdef GL_SGIS_generate_mipmap\r\n  _glewInfo_GL_SGIS_generate_mipmap();\r\n#endif /* GL_SGIS_generate_mipmap */\r\n#ifdef GL_SGIS_multisample\r\n  _glewInfo_GL_SGIS_multisample();\r\n#endif /* GL_SGIS_multisample */\r\n#ifdef GL_SGIS_pixel_texture\r\n  _glewInfo_GL_SGIS_pixel_texture();\r\n#endif /* GL_SGIS_pixel_texture */\r\n#ifdef GL_SGIS_point_line_texgen\r\n  _glewInfo_GL_SGIS_point_line_texgen();\r\n#endif /* GL_SGIS_point_line_texgen */\r\n#ifdef GL_SGIS_sharpen_texture\r\n  _glewInfo_GL_SGIS_sharpen_texture();\r\n#endif /* GL_SGIS_sharpen_texture */\r\n#ifdef GL_SGIS_texture4D\r\n  _glewInfo_GL_SGIS_texture4D();\r\n#endif /* GL_SGIS_texture4D */\r\n#ifdef GL_SGIS_texture_border_clamp\r\n  _glewInfo_GL_SGIS_texture_border_clamp();\r\n#endif /* GL_SGIS_texture_border_clamp */\r\n#ifdef GL_SGIS_texture_edge_clamp\r\n  _glewInfo_GL_SGIS_texture_edge_clamp();\r\n#endif /* GL_SGIS_texture_edge_clamp */\r\n#ifdef GL_SGIS_texture_filter4\r\n  _glewInfo_GL_SGIS_texture_filter4();\r\n#endif /* GL_SGIS_texture_filter4 */\r\n#ifdef GL_SGIS_texture_lod\r\n  _glewInfo_GL_SGIS_texture_lod();\r\n#endif /* GL_SGIS_texture_lod */\r\n#ifdef GL_SGIS_texture_select\r\n  _glewInfo_GL_SGIS_texture_select();\r\n#endif /* GL_SGIS_texture_select */\r\n#ifdef GL_SGIX_async\r\n  _glewInfo_GL_SGIX_async();\r\n#endif /* GL_SGIX_async */\r\n#ifdef GL_SGIX_async_histogram\r\n  _glewInfo_GL_SGIX_async_histogram();\r\n#endif /* GL_SGIX_async_histogram */\r\n#ifdef GL_SGIX_async_pixel\r\n  _glewInfo_GL_SGIX_async_pixel();\r\n#endif /* GL_SGIX_async_pixel */\r\n#ifdef GL_SGIX_blend_alpha_minmax\r\n  _glewInfo_GL_SGIX_blend_alpha_minmax();\r\n#endif /* GL_SGIX_blend_alpha_minmax */\r\n#ifdef GL_SGIX_clipmap\r\n  _glewInfo_GL_SGIX_clipmap();\r\n#endif /* GL_SGIX_clipmap */\r\n#ifdef GL_SGIX_convolution_accuracy\r\n  _glewInfo_GL_SGIX_convolution_accuracy();\r\n#endif /* GL_SGIX_convolution_accuracy */\r\n#ifdef GL_SGIX_depth_texture\r\n  _glewInfo_GL_SGIX_depth_texture();\r\n#endif /* GL_SGIX_depth_texture */\r\n#ifdef GL_SGIX_flush_raster\r\n  _glewInfo_GL_SGIX_flush_raster();\r\n#endif /* GL_SGIX_flush_raster */\r\n#ifdef GL_SGIX_fog_offset\r\n  _glewInfo_GL_SGIX_fog_offset();\r\n#endif /* GL_SGIX_fog_offset */\r\n#ifdef GL_SGIX_fog_texture\r\n  _glewInfo_GL_SGIX_fog_texture();\r\n#endif /* GL_SGIX_fog_texture */\r\n#ifdef GL_SGIX_fragment_specular_lighting\r\n  _glewInfo_GL_SGIX_fragment_specular_lighting();\r\n#endif /* GL_SGIX_fragment_specular_lighting */\r\n#ifdef GL_SGIX_framezoom\r\n  _glewInfo_GL_SGIX_framezoom();\r\n#endif /* GL_SGIX_framezoom */\r\n#ifdef GL_SGIX_interlace\r\n  _glewInfo_GL_SGIX_interlace();\r\n#endif /* GL_SGIX_interlace */\r\n#ifdef GL_SGIX_ir_instrument1\r\n  _glewInfo_GL_SGIX_ir_instrument1();\r\n#endif /* GL_SGIX_ir_instrument1 */\r\n#ifdef GL_SGIX_list_priority\r\n  _glewInfo_GL_SGIX_list_priority();\r\n#endif /* GL_SGIX_list_priority */\r\n#ifdef GL_SGIX_pixel_texture\r\n  _glewInfo_GL_SGIX_pixel_texture();\r\n#endif /* GL_SGIX_pixel_texture */\r\n#ifdef GL_SGIX_pixel_texture_bits\r\n  _glewInfo_GL_SGIX_pixel_texture_bits();\r\n#endif /* GL_SGIX_pixel_texture_bits */\r\n#ifdef GL_SGIX_reference_plane\r\n  _glewInfo_GL_SGIX_reference_plane();\r\n#endif /* GL_SGIX_reference_plane */\r\n#ifdef GL_SGIX_resample\r\n  _glewInfo_GL_SGIX_resample();\r\n#endif /* GL_SGIX_resample */\r\n#ifdef GL_SGIX_shadow\r\n  _glewInfo_GL_SGIX_shadow();\r\n#endif /* GL_SGIX_shadow */\r\n#ifdef GL_SGIX_shadow_ambient\r\n  _glewInfo_GL_SGIX_shadow_ambient();\r\n#endif /* GL_SGIX_shadow_ambient */\r\n#ifdef GL_SGIX_sprite\r\n  _glewInfo_GL_SGIX_sprite();\r\n#endif /* GL_SGIX_sprite */\r\n#ifdef GL_SGIX_tag_sample_buffer\r\n  _glewInfo_GL_SGIX_tag_sample_buffer();\r\n#endif /* GL_SGIX_tag_sample_buffer */\r\n#ifdef GL_SGIX_texture_add_env\r\n  _glewInfo_GL_SGIX_texture_add_env();\r\n#endif /* GL_SGIX_texture_add_env */\r\n#ifdef GL_SGIX_texture_coordinate_clamp\r\n  _glewInfo_GL_SGIX_texture_coordinate_clamp();\r\n#endif /* GL_SGIX_texture_coordinate_clamp */\r\n#ifdef GL_SGIX_texture_lod_bias\r\n  _glewInfo_GL_SGIX_texture_lod_bias();\r\n#endif /* GL_SGIX_texture_lod_bias */\r\n#ifdef GL_SGIX_texture_multi_buffer\r\n  _glewInfo_GL_SGIX_texture_multi_buffer();\r\n#endif /* GL_SGIX_texture_multi_buffer */\r\n#ifdef GL_SGIX_texture_range\r\n  _glewInfo_GL_SGIX_texture_range();\r\n#endif /* GL_SGIX_texture_range */\r\n#ifdef GL_SGIX_texture_scale_bias\r\n  _glewInfo_GL_SGIX_texture_scale_bias();\r\n#endif /* GL_SGIX_texture_scale_bias */\r\n#ifdef GL_SGIX_vertex_preclip\r\n  _glewInfo_GL_SGIX_vertex_preclip();\r\n#endif /* GL_SGIX_vertex_preclip */\r\n#ifdef GL_SGIX_vertex_preclip_hint\r\n  _glewInfo_GL_SGIX_vertex_preclip_hint();\r\n#endif /* GL_SGIX_vertex_preclip_hint */\r\n#ifdef GL_SGIX_ycrcb\r\n  _glewInfo_GL_SGIX_ycrcb();\r\n#endif /* GL_SGIX_ycrcb */\r\n#ifdef GL_SGI_color_matrix\r\n  _glewInfo_GL_SGI_color_matrix();\r\n#endif /* GL_SGI_color_matrix */\r\n#ifdef GL_SGI_color_table\r\n  _glewInfo_GL_SGI_color_table();\r\n#endif /* GL_SGI_color_table */\r\n#ifdef GL_SGI_texture_color_table\r\n  _glewInfo_GL_SGI_texture_color_table();\r\n#endif /* GL_SGI_texture_color_table */\r\n#ifdef GL_SUNX_constant_data\r\n  _glewInfo_GL_SUNX_constant_data();\r\n#endif /* GL_SUNX_constant_data */\r\n#ifdef GL_SUN_convolution_border_modes\r\n  _glewInfo_GL_SUN_convolution_border_modes();\r\n#endif /* GL_SUN_convolution_border_modes */\r\n#ifdef GL_SUN_global_alpha\r\n  _glewInfo_GL_SUN_global_alpha();\r\n#endif /* GL_SUN_global_alpha */\r\n#ifdef GL_SUN_mesh_array\r\n  _glewInfo_GL_SUN_mesh_array();\r\n#endif /* GL_SUN_mesh_array */\r\n#ifdef GL_SUN_read_video_pixels\r\n  _glewInfo_GL_SUN_read_video_pixels();\r\n#endif /* GL_SUN_read_video_pixels */\r\n#ifdef GL_SUN_slice_accum\r\n  _glewInfo_GL_SUN_slice_accum();\r\n#endif /* GL_SUN_slice_accum */\r\n#ifdef GL_SUN_triangle_list\r\n  _glewInfo_GL_SUN_triangle_list();\r\n#endif /* GL_SUN_triangle_list */\r\n#ifdef GL_SUN_vertex\r\n  _glewInfo_GL_SUN_vertex();\r\n#endif /* GL_SUN_vertex */\r\n#ifdef GL_WIN_phong_shading\r\n  _glewInfo_GL_WIN_phong_shading();\r\n#endif /* GL_WIN_phong_shading */\r\n#ifdef GL_WIN_specular_fog\r\n  _glewInfo_GL_WIN_specular_fog();\r\n#endif /* GL_WIN_specular_fog */\r\n#ifdef GL_WIN_swap_hint\r\n  _glewInfo_GL_WIN_swap_hint();\r\n#endif /* GL_WIN_swap_hint */\r\n}\r\n\r\n/* ------------------------------------------------------------------------ */\r\n\r\n#ifdef _WIN32\r\n\r\nstatic void wglewInfo ()\r\n{\r\n#ifdef WGL_3DFX_multisample\r\n  _glewInfo_WGL_3DFX_multisample();\r\n#endif /* WGL_3DFX_multisample */\r\n#ifdef WGL_3DL_stereo_control\r\n  _glewInfo_WGL_3DL_stereo_control();\r\n#endif /* WGL_3DL_stereo_control */\r\n#ifdef WGL_AMD_gpu_association\r\n  _glewInfo_WGL_AMD_gpu_association();\r\n#endif /* WGL_AMD_gpu_association */\r\n#ifdef WGL_ARB_buffer_region\r\n  _glewInfo_WGL_ARB_buffer_region();\r\n#endif /* WGL_ARB_buffer_region */\r\n#ifdef WGL_ARB_create_context\r\n  _glewInfo_WGL_ARB_create_context();\r\n#endif /* WGL_ARB_create_context */\r\n#ifdef WGL_ARB_create_context_profile\r\n  _glewInfo_WGL_ARB_create_context_profile();\r\n#endif /* WGL_ARB_create_context_profile */\r\n#ifdef WGL_ARB_extensions_string\r\n  _glewInfo_WGL_ARB_extensions_string();\r\n#endif /* WGL_ARB_extensions_string */\r\n#ifdef WGL_ARB_framebuffer_sRGB\r\n  _glewInfo_WGL_ARB_framebuffer_sRGB();\r\n#endif /* WGL_ARB_framebuffer_sRGB */\r\n#ifdef WGL_ARB_make_current_read\r\n  _glewInfo_WGL_ARB_make_current_read();\r\n#endif /* WGL_ARB_make_current_read */\r\n#ifdef WGL_ARB_multisample\r\n  _glewInfo_WGL_ARB_multisample();\r\n#endif /* WGL_ARB_multisample */\r\n#ifdef WGL_ARB_pbuffer\r\n  _glewInfo_WGL_ARB_pbuffer();\r\n#endif /* WGL_ARB_pbuffer */\r\n#ifdef WGL_ARB_pixel_format\r\n  _glewInfo_WGL_ARB_pixel_format();\r\n#endif /* WGL_ARB_pixel_format */\r\n#ifdef WGL_ARB_pixel_format_float\r\n  _glewInfo_WGL_ARB_pixel_format_float();\r\n#endif /* WGL_ARB_pixel_format_float */\r\n#ifdef WGL_ARB_render_texture\r\n  _glewInfo_WGL_ARB_render_texture();\r\n#endif /* WGL_ARB_render_texture */\r\n#ifdef WGL_ATI_pixel_format_float\r\n  _glewInfo_WGL_ATI_pixel_format_float();\r\n#endif /* WGL_ATI_pixel_format_float */\r\n#ifdef WGL_ATI_render_texture_rectangle\r\n  _glewInfo_WGL_ATI_render_texture_rectangle();\r\n#endif /* WGL_ATI_render_texture_rectangle */\r\n#ifdef WGL_EXT_depth_float\r\n  _glewInfo_WGL_EXT_depth_float();\r\n#endif /* WGL_EXT_depth_float */\r\n#ifdef WGL_EXT_display_color_table\r\n  _glewInfo_WGL_EXT_display_color_table();\r\n#endif /* WGL_EXT_display_color_table */\r\n#ifdef WGL_EXT_extensions_string\r\n  _glewInfo_WGL_EXT_extensions_string();\r\n#endif /* WGL_EXT_extensions_string */\r\n#ifdef WGL_EXT_framebuffer_sRGB\r\n  _glewInfo_WGL_EXT_framebuffer_sRGB();\r\n#endif /* WGL_EXT_framebuffer_sRGB */\r\n#ifdef WGL_EXT_make_current_read\r\n  _glewInfo_WGL_EXT_make_current_read();\r\n#endif /* WGL_EXT_make_current_read */\r\n#ifdef WGL_EXT_multisample\r\n  _glewInfo_WGL_EXT_multisample();\r\n#endif /* WGL_EXT_multisample */\r\n#ifdef WGL_EXT_pbuffer\r\n  _glewInfo_WGL_EXT_pbuffer();\r\n#endif /* WGL_EXT_pbuffer */\r\n#ifdef WGL_EXT_pixel_format\r\n  _glewInfo_WGL_EXT_pixel_format();\r\n#endif /* WGL_EXT_pixel_format */\r\n#ifdef WGL_EXT_pixel_format_packed_float\r\n  _glewInfo_WGL_EXT_pixel_format_packed_float();\r\n#endif /* WGL_EXT_pixel_format_packed_float */\r\n#ifdef WGL_EXT_swap_control\r\n  _glewInfo_WGL_EXT_swap_control();\r\n#endif /* WGL_EXT_swap_control */\r\n#ifdef WGL_I3D_digital_video_control\r\n  _glewInfo_WGL_I3D_digital_video_control();\r\n#endif /* WGL_I3D_digital_video_control */\r\n#ifdef WGL_I3D_gamma\r\n  _glewInfo_WGL_I3D_gamma();\r\n#endif /* WGL_I3D_gamma */\r\n#ifdef WGL_I3D_genlock\r\n  _glewInfo_WGL_I3D_genlock();\r\n#endif /* WGL_I3D_genlock */\r\n#ifdef WGL_I3D_image_buffer\r\n  _glewInfo_WGL_I3D_image_buffer();\r\n#endif /* WGL_I3D_image_buffer */\r\n#ifdef WGL_I3D_swap_frame_lock\r\n  _glewInfo_WGL_I3D_swap_frame_lock();\r\n#endif /* WGL_I3D_swap_frame_lock */\r\n#ifdef WGL_I3D_swap_frame_usage\r\n  _glewInfo_WGL_I3D_swap_frame_usage();\r\n#endif /* WGL_I3D_swap_frame_usage */\r\n#ifdef WGL_NV_copy_image\r\n  _glewInfo_WGL_NV_copy_image();\r\n#endif /* WGL_NV_copy_image */\r\n#ifdef WGL_NV_float_buffer\r\n  _glewInfo_WGL_NV_float_buffer();\r\n#endif /* WGL_NV_float_buffer */\r\n#ifdef WGL_NV_gpu_affinity\r\n  _glewInfo_WGL_NV_gpu_affinity();\r\n#endif /* WGL_NV_gpu_affinity */\r\n#ifdef WGL_NV_present_video\r\n  _glewInfo_WGL_NV_present_video();\r\n#endif /* WGL_NV_present_video */\r\n#ifdef WGL_NV_render_depth_texture\r\n  _glewInfo_WGL_NV_render_depth_texture();\r\n#endif /* WGL_NV_render_depth_texture */\r\n#ifdef WGL_NV_render_texture_rectangle\r\n  _glewInfo_WGL_NV_render_texture_rectangle();\r\n#endif /* WGL_NV_render_texture_rectangle */\r\n#ifdef WGL_NV_swap_group\r\n  _glewInfo_WGL_NV_swap_group();\r\n#endif /* WGL_NV_swap_group */\r\n#ifdef WGL_NV_vertex_array_range\r\n  _glewInfo_WGL_NV_vertex_array_range();\r\n#endif /* WGL_NV_vertex_array_range */\r\n#ifdef WGL_NV_video_output\r\n  _glewInfo_WGL_NV_video_output();\r\n#endif /* WGL_NV_video_output */\r\n#ifdef WGL_OML_sync_control\r\n  _glewInfo_WGL_OML_sync_control();\r\n#endif /* WGL_OML_sync_control */\r\n}\r\n\r\n#else /* _UNIX */\r\n\r\nstatic void glxewInfo ()\r\n{\r\n#ifdef GLX_VERSION_1_2\r\n  _glewInfo_GLX_VERSION_1_2();\r\n#endif /* GLX_VERSION_1_2 */\r\n#ifdef GLX_VERSION_1_3\r\n  _glewInfo_GLX_VERSION_1_3();\r\n#endif /* GLX_VERSION_1_3 */\r\n#ifdef GLX_VERSION_1_4\r\n  _glewInfo_GLX_VERSION_1_4();\r\n#endif /* GLX_VERSION_1_4 */\r\n#ifdef GLX_3DFX_multisample\r\n  _glewInfo_GLX_3DFX_multisample();\r\n#endif /* GLX_3DFX_multisample */\r\n#ifdef GLX_ARB_create_context\r\n  _glewInfo_GLX_ARB_create_context();\r\n#endif /* GLX_ARB_create_context */\r\n#ifdef GLX_ARB_create_context_profile\r\n  _glewInfo_GLX_ARB_create_context_profile();\r\n#endif /* GLX_ARB_create_context_profile */\r\n#ifdef GLX_ARB_fbconfig_float\r\n  _glewInfo_GLX_ARB_fbconfig_float();\r\n#endif /* GLX_ARB_fbconfig_float */\r\n#ifdef GLX_ARB_framebuffer_sRGB\r\n  _glewInfo_GLX_ARB_framebuffer_sRGB();\r\n#endif /* GLX_ARB_framebuffer_sRGB */\r\n#ifdef GLX_ARB_get_proc_address\r\n  _glewInfo_GLX_ARB_get_proc_address();\r\n#endif /* GLX_ARB_get_proc_address */\r\n#ifdef GLX_ARB_multisample\r\n  _glewInfo_GLX_ARB_multisample();\r\n#endif /* GLX_ARB_multisample */\r\n#ifdef GLX_ATI_pixel_format_float\r\n  _glewInfo_GLX_ATI_pixel_format_float();\r\n#endif /* GLX_ATI_pixel_format_float */\r\n#ifdef GLX_ATI_render_texture\r\n  _glewInfo_GLX_ATI_render_texture();\r\n#endif /* GLX_ATI_render_texture */\r\n#ifdef GLX_EXT_fbconfig_packed_float\r\n  _glewInfo_GLX_EXT_fbconfig_packed_float();\r\n#endif /* GLX_EXT_fbconfig_packed_float */\r\n#ifdef GLX_EXT_framebuffer_sRGB\r\n  _glewInfo_GLX_EXT_framebuffer_sRGB();\r\n#endif /* GLX_EXT_framebuffer_sRGB */\r\n#ifdef GLX_EXT_import_context\r\n  _glewInfo_GLX_EXT_import_context();\r\n#endif /* GLX_EXT_import_context */\r\n#ifdef GLX_EXT_scene_marker\r\n  _glewInfo_GLX_EXT_scene_marker();\r\n#endif /* GLX_EXT_scene_marker */\r\n#ifdef GLX_EXT_swap_control\r\n  _glewInfo_GLX_EXT_swap_control();\r\n#endif /* GLX_EXT_swap_control */\r\n#ifdef GLX_EXT_texture_from_pixmap\r\n  _glewInfo_GLX_EXT_texture_from_pixmap();\r\n#endif /* GLX_EXT_texture_from_pixmap */\r\n#ifdef GLX_EXT_visual_info\r\n  _glewInfo_GLX_EXT_visual_info();\r\n#endif /* GLX_EXT_visual_info */\r\n#ifdef GLX_EXT_visual_rating\r\n  _glewInfo_GLX_EXT_visual_rating();\r\n#endif /* GLX_EXT_visual_rating */\r\n#ifdef GLX_INTEL_swap_event\r\n  _glewInfo_GLX_INTEL_swap_event();\r\n#endif /* GLX_INTEL_swap_event */\r\n#ifdef GLX_MESA_agp_offset\r\n  _glewInfo_GLX_MESA_agp_offset();\r\n#endif /* GLX_MESA_agp_offset */\r\n#ifdef GLX_MESA_copy_sub_buffer\r\n  _glewInfo_GLX_MESA_copy_sub_buffer();\r\n#endif /* GLX_MESA_copy_sub_buffer */\r\n#ifdef GLX_MESA_pixmap_colormap\r\n  _glewInfo_GLX_MESA_pixmap_colormap();\r\n#endif /* GLX_MESA_pixmap_colormap */\r\n#ifdef GLX_MESA_release_buffers\r\n  _glewInfo_GLX_MESA_release_buffers();\r\n#endif /* GLX_MESA_release_buffers */\r\n#ifdef GLX_MESA_set_3dfx_mode\r\n  _glewInfo_GLX_MESA_set_3dfx_mode();\r\n#endif /* GLX_MESA_set_3dfx_mode */\r\n#ifdef GLX_NV_copy_image\r\n  _glewInfo_GLX_NV_copy_image();\r\n#endif /* GLX_NV_copy_image */\r\n#ifdef GLX_NV_float_buffer\r\n  _glewInfo_GLX_NV_float_buffer();\r\n#endif /* GLX_NV_float_buffer */\r\n#ifdef GLX_NV_present_video\r\n  _glewInfo_GLX_NV_present_video();\r\n#endif /* GLX_NV_present_video */\r\n#ifdef GLX_NV_swap_group\r\n  _glewInfo_GLX_NV_swap_group();\r\n#endif /* GLX_NV_swap_group */\r\n#ifdef GLX_NV_vertex_array_range\r\n  _glewInfo_GLX_NV_vertex_array_range();\r\n#endif /* GLX_NV_vertex_array_range */\r\n#ifdef GLX_NV_video_output\r\n  _glewInfo_GLX_NV_video_output();\r\n#endif /* GLX_NV_video_output */\r\n#ifdef GLX_OML_swap_method\r\n  _glewInfo_GLX_OML_swap_method();\r\n#endif /* GLX_OML_swap_method */\r\n#if defined(GLX_OML_sync_control) && defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)\r\n#include <inttypes.h>\r\n  _glewInfo_GLX_OML_sync_control();\r\n#endif /* GLX_OML_sync_control */\r\n#ifdef GLX_SGIS_blended_overlay\r\n  _glewInfo_GLX_SGIS_blended_overlay();\r\n#endif /* GLX_SGIS_blended_overlay */\r\n#ifdef GLX_SGIS_color_range\r\n  _glewInfo_GLX_SGIS_color_range();\r\n#endif /* GLX_SGIS_color_range */\r\n#ifdef GLX_SGIS_multisample\r\n  _glewInfo_GLX_SGIS_multisample();\r\n#endif /* GLX_SGIS_multisample */\r\n#ifdef GLX_SGIS_shared_multisample\r\n  _glewInfo_GLX_SGIS_shared_multisample();\r\n#endif /* GLX_SGIS_shared_multisample */\r\n#ifdef GLX_SGIX_fbconfig\r\n  _glewInfo_GLX_SGIX_fbconfig();\r\n#endif /* GLX_SGIX_fbconfig */\r\n#ifdef GLX_SGIX_hyperpipe\r\n  _glewInfo_GLX_SGIX_hyperpipe();\r\n#endif /* GLX_SGIX_hyperpipe */\r\n#ifdef GLX_SGIX_pbuffer\r\n  _glewInfo_GLX_SGIX_pbuffer();\r\n#endif /* GLX_SGIX_pbuffer */\r\n#ifdef GLX_SGIX_swap_barrier\r\n  _glewInfo_GLX_SGIX_swap_barrier();\r\n#endif /* GLX_SGIX_swap_barrier */\r\n#ifdef GLX_SGIX_swap_group\r\n  _glewInfo_GLX_SGIX_swap_group();\r\n#endif /* GLX_SGIX_swap_group */\r\n#ifdef GLX_SGIX_video_resize\r\n  _glewInfo_GLX_SGIX_video_resize();\r\n#endif /* GLX_SGIX_video_resize */\r\n#ifdef GLX_SGIX_visual_select_group\r\n  _glewInfo_GLX_SGIX_visual_select_group();\r\n#endif /* GLX_SGIX_visual_select_group */\r\n#ifdef GLX_SGI_cushion\r\n  _glewInfo_GLX_SGI_cushion();\r\n#endif /* GLX_SGI_cushion */\r\n#ifdef GLX_SGI_make_current_read\r\n  _glewInfo_GLX_SGI_make_current_read();\r\n#endif /* GLX_SGI_make_current_read */\r\n#ifdef GLX_SGI_swap_control\r\n  _glewInfo_GLX_SGI_swap_control();\r\n#endif /* GLX_SGI_swap_control */\r\n#ifdef GLX_SGI_video_sync\r\n  _glewInfo_GLX_SGI_video_sync();\r\n#endif /* GLX_SGI_video_sync */\r\n#ifdef GLX_SUN_get_transparent_index\r\n  _glewInfo_GLX_SUN_get_transparent_index();\r\n#endif /* GLX_SUN_get_transparent_index */\r\n#ifdef GLX_SUN_video_resize\r\n  _glewInfo_GLX_SUN_video_resize();\r\n#endif /* GLX_SUN_video_resize */\r\n}\r\n\r\n#endif /* _WIN32 */\r\n\r\n/* ------------------------------------------------------------------------ */\r\n\r\n#if defined(_WIN32) || !defined(__APPLE__) || defined(GLEW_APPLE_GLX)\r\nint main (int argc, char** argv)\r\n#else\r\nint main (void)\r\n#endif\r\n{\r\n  GLuint err;\r\n\r\n#if defined(_WIN32) || !defined(__APPLE__) || defined(GLEW_APPLE_GLX)\r\n  char* display = NULL;\r\n  int visual = -1;\r\n\r\n  if (glewParseArgs(argc-1, argv+1, &display, &visual))\r\n  {\r\n#if defined(_WIN32)\r\n    fprintf(stderr, \"Usage: glewinfo [-pf <id>]\\n\");\r\n#else\r\n    fprintf(stderr, \"Usage: glewinfo [-display <display>] [-visual <id>]\\n\");\r\n#endif\r\n    return 1;\r\n  }\r\n#endif\r\n\r\n#if defined(_WIN32)\r\n  if (GL_TRUE == glewCreateContext(&visual))\r\n#elif defined(__APPLE__) && !defined(GLEW_APPLE_GLX)\r\n  if (GL_TRUE == glewCreateContext())\r\n#else\r\n  if (GL_TRUE == glewCreateContext(display, &visual))\r\n#endif\r\n  {\r\n    fprintf(stderr, \"Error: glewCreateContext failed\\n\");\r\n    glewDestroyContext();\r\n    return 1;\r\n  }\r\n  glewExperimental = GL_TRUE;\r\n#ifdef GLEW_MX\r\n  err = glewContextInit(glewGetContext());\r\n#ifdef _WIN32\r\n  err = err || wglewContextInit(wglewGetContext());\r\n#elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX)\r\n  err = err || glxewContextInit(glxewGetContext());\r\n#endif\r\n\r\n#else\r\n  err = glewInit();\r\n#endif\r\n  if (GLEW_OK != err)\r\n  {\r\n    fprintf(stderr, \"Error [main]: glewInit failed: %s\\n\", glewGetErrorString(err));\r\n    glewDestroyContext();\r\n    return 1;\r\n  }\r\n#if defined(_WIN32)\r\n  f = fopen(\"glewinfo.txt\", \"w\");\r\n  if (f == NULL) f = stdout;\r\n#else\r\n  f = stdout;\r\n#endif\r\n  fprintf(f, \"---------------------------\\n\");\r\n  fprintf(f, \"    GLEW Extension Info\\n\");\r\n  fprintf(f, \"---------------------------\\n\\n\");\r\n  fprintf(f, \"GLEW version %s\\n\", glewGetString(GLEW_VERSION));\r\n#if defined(_WIN32)\r\n  fprintf(f, \"Reporting capabilities of pixelformat %d\\n\", visual);\r\n#elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX)\r\n  fprintf(f, \"Reporting capabilities of display %s, visual 0x%x\\n\", \r\n    display == NULL ? getenv(\"DISPLAY\") : display, visual);\r\n#endif\r\n  fprintf(f, \"Running on a %s from %s\\n\", \r\n\t  glGetString(GL_RENDERER), glGetString(GL_VENDOR));\r\n  fprintf(f, \"OpenGL version %s is supported\\n\", glGetString(GL_VERSION));\r\n  glewInfo();\r\n#if defined(_WIN32)\r\n  wglewInfo();\r\n#else\r\n  glxewInfo();\r\n#endif\r\n  if (f != stdout) fclose(f);\r\n  glewDestroyContext();\r\n  return 0;\r\n}\r\n\r\n/* ------------------------------------------------------------------------ */\r\n\r\n#if defined(_WIN32) || !defined(__APPLE__) || defined(GLEW_APPLE_GLX)\r\nGLboolean glewParseArgs (int argc, char** argv, char** display, int* visual)\r\n{\r\n  int p = 0;\r\n  while (p < argc)\r\n  {\r\n#if defined(_WIN32)\r\n    if (!strcmp(argv[p], \"-pf\") || !strcmp(argv[p], \"-pixelformat\"))\r\n    {\r\n      if (++p >= argc) return GL_TRUE;\r\n      *display = 0;\r\n      *visual = strtol(argv[p++], NULL, 0);\r\n    }\r\n    else\r\n      return GL_TRUE;\r\n#else\r\n    if (!strcmp(argv[p], \"-display\"))\r\n    {\r\n      if (++p >= argc) return GL_TRUE;\r\n      *display = argv[p++];\r\n    }\r\n    else if (!strcmp(argv[p], \"-visual\"))\r\n    {\r\n      if (++p >= argc) return GL_TRUE;\r\n      *visual = (int)strtol(argv[p++], NULL, 0);\r\n    }\r\n    else\r\n      return GL_TRUE;\r\n#endif\r\n  }\r\n  return GL_FALSE;\r\n}\r\n#endif\r\n\r\n/* ------------------------------------------------------------------------ */\r\n\r\n#if defined(_WIN32)\r\n\r\nHWND wnd = NULL;\r\nHDC dc = NULL;\r\nHGLRC rc = NULL;\r\n\r\nGLboolean glewCreateContext (int* pixelformat)\r\n{\r\n  WNDCLASS wc;\r\n  PIXELFORMATDESCRIPTOR pfd;\r\n  /* register window class */\r\n  ZeroMemory(&wc, sizeof(WNDCLASS));\r\n  wc.hInstance = GetModuleHandle(NULL);\r\n  wc.lpfnWndProc = DefWindowProc;\r\n  wc.lpszClassName = \"GLEW\";\r\n  if (0 == RegisterClass(&wc)) return GL_TRUE;\r\n  /* create window */\r\n  wnd = CreateWindow(\"GLEW\", \"GLEW\", 0, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, \r\n                     CW_USEDEFAULT, NULL, NULL, GetModuleHandle(NULL), NULL);\r\n  if (NULL == wnd) return GL_TRUE;\r\n  /* get the device context */\r\n  dc = GetDC(wnd);\r\n  if (NULL == dc) return GL_TRUE;\r\n  /* find pixel format */\r\n  ZeroMemory(&pfd, sizeof(PIXELFORMATDESCRIPTOR));\r\n  if (*pixelformat == -1) /* find default */\r\n  {\r\n    pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);\r\n    pfd.nVersion = 1;\r\n    pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL;\r\n    *pixelformat = ChoosePixelFormat(dc, &pfd);\r\n    if (*pixelformat == 0) return GL_TRUE;\r\n  }\r\n  /* set the pixel format for the dc */\r\n  if (FALSE == SetPixelFormat(dc, *pixelformat, &pfd)) return GL_TRUE;\r\n  /* create rendering context */\r\n  rc = wglCreateContext(dc);\r\n  if (NULL == rc) return GL_TRUE;\r\n  if (FALSE == wglMakeCurrent(dc, rc)) return GL_TRUE;\r\n  return GL_FALSE;\r\n}\r\n\r\nvoid glewDestroyContext ()\r\n{\r\n  if (NULL != rc) wglMakeCurrent(NULL, NULL);\r\n  if (NULL != rc) wglDeleteContext(rc);\r\n  if (NULL != wnd && NULL != dc) ReleaseDC(wnd, dc);\r\n  if (NULL != wnd) DestroyWindow(wnd);\r\n  UnregisterClass(\"GLEW\", GetModuleHandle(NULL));\r\n}\r\n\r\n/* ------------------------------------------------------------------------ */\r\n\r\n#elif defined(__APPLE__) && !defined(GLEW_APPLE_GLX)\r\n\r\n#include <AGL/agl.h>\r\n\r\nAGLContext ctx, octx;\r\n\r\nGLboolean glewCreateContext ()\r\n{\r\n  int attrib[] = { AGL_RGBA, AGL_NONE };\r\n  AGLPixelFormat pf;\r\n  /*int major, minor;\r\n  SetPortWindowPort(wnd);\r\n  aglGetVersion(&major, &minor);\r\n  fprintf(stderr, \"GL %d.%d\\n\", major, minor);*/\r\n  pf = aglChoosePixelFormat(NULL, 0, attrib);\r\n  if (NULL == pf) return GL_TRUE;\r\n  ctx = aglCreateContext(pf, NULL);\r\n  if (NULL == ctx || AGL_NO_ERROR != aglGetError()) return GL_TRUE;\r\n  aglDestroyPixelFormat(pf);\r\n  /*aglSetDrawable(ctx, GetWindowPort(wnd));*/\r\n  octx = aglGetCurrentContext();\r\n  if (GL_FALSE == aglSetCurrentContext(ctx)) return GL_TRUE;\r\n  return GL_FALSE;\r\n}\r\n\r\nvoid glewDestroyContext ()\r\n{\r\n  aglSetCurrentContext(octx);\r\n  if (NULL != ctx) aglDestroyContext(ctx);\r\n}\r\n\r\n/* ------------------------------------------------------------------------ */\r\n\r\n#else /* __UNIX || (__APPLE__ && GLEW_APPLE_GLX) */\r\n\r\nDisplay* dpy = NULL;\r\nXVisualInfo* vi = NULL;\r\nXVisualInfo* vis = NULL;\r\nGLXContext ctx = NULL;\r\nWindow wnd = 0;\r\nColormap cmap = 0;\r\n\r\nGLboolean glewCreateContext (const char* display, int* visual)\r\n{\r\n  int attrib[] = { GLX_RGBA, GLX_DOUBLEBUFFER, None };\r\n  int erb, evb;\r\n  XSetWindowAttributes swa;\r\n  /* open display */\r\n  dpy = XOpenDisplay(display);\r\n  if (NULL == dpy) return GL_TRUE;\r\n  /* query for glx */\r\n  if (!glXQueryExtension(dpy, &erb, &evb)) return GL_TRUE;\r\n  /* choose visual */\r\n  if (*visual == -1)\r\n  {\r\n    vi = glXChooseVisual(dpy, DefaultScreen(dpy), attrib);\r\n    if (NULL == vi) return GL_TRUE;\r\n    *visual = (int)XVisualIDFromVisual(vi->visual);\r\n  }\r\n  else\r\n  {\r\n    int n_vis, i;\r\n    vis = XGetVisualInfo(dpy, 0, NULL, &n_vis);\r\n    for (i=0; i<n_vis; i++)\r\n    {\r\n      if ((int)XVisualIDFromVisual(vis[i].visual) == *visual)\r\n        vi = &vis[i];\r\n    }\r\n    if (vi == NULL) return GL_TRUE;\r\n  }\r\n  /* create context */\r\n  ctx = glXCreateContext(dpy, vi, None, True);\r\n  if (NULL == ctx) return GL_TRUE;\r\n  /* create window */\r\n  /*wnd = XCreateSimpleWindow(dpy, RootWindow(dpy, vi->screen), 0, 0, 1, 1, 1, 0, 0);*/\r\n  cmap = XCreateColormap(dpy, RootWindow(dpy, vi->screen), vi->visual, AllocNone);\r\n  swa.border_pixel = 0;\r\n  swa.colormap = cmap;\r\n  wnd = XCreateWindow(dpy, RootWindow(dpy, vi->screen), \r\n                      0, 0, 1, 1, 0, vi->depth, InputOutput, vi->visual, \r\n                      CWBorderPixel | CWColormap, &swa);\r\n  /* make context current */\r\n  if (!glXMakeCurrent(dpy, wnd, ctx)) return GL_TRUE;\r\n  return GL_FALSE;\r\n}\r\n\r\nvoid glewDestroyContext ()\r\n{\r\n  if (NULL != dpy && NULL != ctx) glXDestroyContext(dpy, ctx);\r\n  if (NULL != dpy && 0 != wnd) XDestroyWindow(dpy, wnd);\r\n  if (NULL != dpy && 0 != cmap) XFreeColormap(dpy, cmap);\r\n  if (NULL != vis)\r\n    XFree(vis);\r\n  else if (NULL != vi)\r\n    XFree(vi);\r\n  if (NULL != dpy) XCloseDisplay(dpy);\r\n}\r\n\r\n#endif /* __UNIX || (__APPLE__ && GLEW_APPLE_GLX) */\r\n"
  },
  {
    "path": "libs/glew/src/visualinfo.c",
    "content": "/*\r\n** visualinfo.c\r\n**\r\n** Copyright (C) Nate Robins, 1997\r\n**               Michael Wimmer, 1999\r\n**               Milan Ikits, 2002-2008\r\n**\r\n** visualinfo is a small utility that displays all available visuals,\r\n** aka. pixelformats, in an OpenGL system along with renderer version\r\n** information. It shows a table of all the visuals that support OpenGL\r\n** along with their capabilities. The format of the table is similar to\r\n** that of glxinfo on Unix systems:\r\n**\r\n** visual ~= pixel format descriptor\r\n** id       = visual id (integer from 1 - max visuals)\r\n** tp       = type (wn: window, pb: pbuffer, wp: window & pbuffer, bm: bitmap)\r\n** ac\t    = acceleration (ge: generic, fu: full, no: none)\r\n** fm\t    = format (i: integer, f: float, c: color index)\r\n** db\t    = double buffer (y = yes)\r\n** sw       = swap method (x: exchange, c: copy, u: undefined)\r\n** st\t    = stereo (y = yes)\r\n** sz       = total # bits\r\n** r        = # bits of red\r\n** g        = # bits of green\r\n** b        = # bits of blue\r\n** a        = # bits of alpha\r\n** axbf     = # aux buffers\r\n** dpth     = # bits of depth\r\n** stcl     = # bits of stencil\r\n*/\r\n\r\n#include <stdio.h>\r\n#include <stdlib.h>\r\n#include <string.h>\r\n#include <GL/glew.h>\r\n#if defined(_WIN32)\r\n#include <GL/wglew.h>\r\n#elif defined(__APPLE__) && !defined(GLEW_APPLE_GLX)\r\n#include <AGL/agl.h>\r\n#else\r\n#include <GL/glxew.h>\r\n#endif\r\n\r\n#ifdef GLEW_MX\r\nGLEWContext _glewctx;\r\n#  define glewGetContext() (&_glewctx)\r\n#  ifdef _WIN32\r\nWGLEWContext _wglewctx;\r\n#    define wglewGetContext() (&_wglewctx)\r\n#  elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX)\r\nGLXEWContext _glxewctx;\r\n#    define glxewGetContext() (&_glxewctx)\r\n#  endif\r\n#endif /* GLEW_MX */\r\n\r\ntypedef struct GLContextStruct\r\n{\r\n#ifdef _WIN32\r\n  HWND wnd;\r\n  HDC dc;\r\n  HGLRC rc;\r\n#elif defined(__APPLE__) && !defined(GLEW_APPLE_GLX)\r\n  AGLContext ctx, octx;\r\n#else\r\n  Display* dpy;\r\n  XVisualInfo* vi;\r\n  GLXContext ctx;\r\n  Window wnd;\r\n  Colormap cmap;\r\n#endif\r\n} GLContext;\r\n\r\nvoid InitContext (GLContext* ctx);\r\nGLboolean CreateContext (GLContext* ctx);\r\nvoid DestroyContext (GLContext* ctx);\r\nvoid VisualInfo (GLContext* ctx);\r\nvoid PrintExtensions (const char* s);\r\nGLboolean ParseArgs (int argc, char** argv);\r\n\r\nint showall = 0;\r\nint displaystdout = 0;\r\nint verbose = 0;\r\nint drawableonly = 0;\r\n\r\nchar* display = NULL;\r\nint visual = -1;\r\n\r\nFILE* file = 0;\r\nGLContext ctx;\r\n\r\nint \r\nmain (int argc, char** argv)\r\n{\r\n  GLenum err;\r\n\r\n  /* ---------------------------------------------------------------------- */\r\n  /* parse arguments */\r\n  if (GL_TRUE == ParseArgs(argc-1, argv+1))\r\n  {\r\n#if defined(_WIN32)\r\n    fprintf(stderr, \"Usage: visualinfo [-a] [-s] [-h] [-pf <id>]\\n\");\r\n    fprintf(stderr, \"        -a: show all visuals\\n\");\r\n    fprintf(stderr, \"        -s: display to stdout instead of visualinfo.txt\\n\");\r\n    fprintf(stderr, \"        -pf <id>: use given pixelformat\\n\");\r\n    fprintf(stderr, \"        -h: this screen\\n\");\r\n#else\r\n    fprintf(stderr, \"Usage: visualinfo [-h] [-display <display>] [-visual <id>]\\n\");\r\n    fprintf(stderr, \"        -h: this screen\\n\");\r\n    fprintf(stderr, \"        -display <display>: use given display\\n\");\r\n    fprintf(stderr, \"        -visual <id>: use given visual\\n\");\r\n#endif\r\n    return 1;\r\n  }\r\n\r\n  /* ---------------------------------------------------------------------- */\r\n  /* create OpenGL rendering context */\r\n  InitContext(&ctx);\r\n  if (GL_TRUE == CreateContext(&ctx))\r\n  {\r\n    fprintf(stderr, \"Error: CreateContext failed\\n\");\r\n    DestroyContext(&ctx);\r\n    return 1;\r\n  }\r\n\r\n  /* ---------------------------------------------------------------------- */\r\n  /* initialize GLEW */\r\n  glewExperimental = GL_TRUE;\r\n#ifdef GLEW_MX\r\n  err = glewContextInit(glewGetContext());\r\n#  ifdef _WIN32\r\n  err = err || wglewContextInit(wglewGetContext());\r\n#  elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX)\r\n  err = err || glxewContextInit(glxewGetContext());\r\n#  endif\r\n#else\r\n  err = glewInit();\r\n#endif\r\n  if (GLEW_OK != err)\r\n  {\r\n    fprintf(stderr, \"Error [main]: glewInit failed: %s\\n\", glewGetErrorString(err));\r\n    DestroyContext(&ctx);\r\n    return 1;\r\n  }\r\n\r\n  /* ---------------------------------------------------------------------- */\r\n  /* open file */\r\n#if defined(_WIN32)\r\n  if (!displaystdout) \r\n    file = fopen(\"visualinfo.txt\", \"w\");\r\n  if (file == NULL)\r\n    file = stdout;\r\n#else\r\n  file = stdout;\r\n#endif\r\n\r\n  /* ---------------------------------------------------------------------- */\r\n  /* output header information */\r\n  /* OpenGL extensions */\r\n  fprintf(file, \"OpenGL vendor string: %s\\n\", glGetString(GL_VENDOR));\r\n  fprintf(file, \"OpenGL renderer string: %s\\n\", glGetString(GL_RENDERER));\r\n  fprintf(file, \"OpenGL version string: %s\\n\", glGetString(GL_VERSION));\r\n  fprintf(file, \"OpenGL extensions (GL_): \\n\");\r\n  PrintExtensions((char*)glGetString(GL_EXTENSIONS));\r\n  /* GLU extensions */\r\n  fprintf(file, \"GLU version string: %s\\n\", gluGetString(GLU_VERSION));\r\n  fprintf(file, \"GLU extensions (GLU_): \\n\");\r\n  PrintExtensions((char*)gluGetString(GLU_EXTENSIONS));\r\n\r\n  /* ---------------------------------------------------------------------- */\r\n  /* extensions string */\r\n#if defined(_WIN32)\r\n  /* WGL extensions */\r\n  if (WGLEW_ARB_extensions_string || WGLEW_EXT_extensions_string)\r\n  {\r\n    fprintf(file, \"WGL extensions (WGL_): \\n\");\r\n    PrintExtensions(wglGetExtensionsStringARB ? \r\n                    (char*)wglGetExtensionsStringARB(ctx.dc) :\r\n\t\t    (char*)wglGetExtensionsStringEXT());\r\n  }\r\n#elif defined(__APPLE__) && !defined(GLEW_APPLE_GLX)\r\n  \r\n#else\r\n  /* GLX extensions */\r\n  fprintf(file, \"GLX extensions (GLX_): \\n\");\r\n  PrintExtensions(glXQueryExtensionsString(glXGetCurrentDisplay(), \r\n                                           DefaultScreen(glXGetCurrentDisplay())));\r\n#endif\r\n\r\n  /* ---------------------------------------------------------------------- */\r\n  /* enumerate all the formats */\r\n  VisualInfo(&ctx);\r\n\r\n  /* ---------------------------------------------------------------------- */\r\n  /* release resources */\r\n  DestroyContext(&ctx);\r\n  if (file != stdout)\r\n    fclose(file);\r\n  return 0;\r\n}\r\n\r\n/* do the magic to separate all extensions with comma's, except\r\n   for the last one that _may_ terminate in a space. */\r\nvoid PrintExtensions (const char* s)\r\n{\r\n  char t[80];\r\n  int i=0;\r\n  char* p=0;\r\n\r\n  t[79] = '\\0';\r\n  while (*s)\r\n  {\r\n    t[i++] = *s;\r\n    if(*s == ' ')\r\n    {\r\n      if (*(s+1) != '\\0') {\r\n\tt[i-1] = ',';\r\n\tt[i] = ' ';\r\n\tp = &t[i++];\r\n      }\r\n      else /* zoinks! last one terminated in a space! */\r\n      {\r\n\tt[i-1] = '\\0';\r\n      }\r\n    }\r\n    if(i > 80 - 5)\r\n    {\r\n      *p = t[i] = '\\0';\r\n      fprintf(file, \"    %s\\n\", t);\r\n      p++;\r\n      i = (int)strlen(p);\r\n      strcpy(t, p);\r\n    }\r\n    s++;\r\n  }\r\n  t[i] = '\\0';\r\n  fprintf(file, \"    %s.\\n\", t);\r\n}\r\n\r\n/* ---------------------------------------------------------------------- */\r\n\r\n#if defined(_WIN32)\r\n\r\nvoid\r\nVisualInfoARB (GLContext* ctx)\r\n{\r\n  int attrib[32], value[32], n_attrib, n_pbuffer=0, n_float=0;\r\n  int i, pf, maxpf;\r\n  unsigned int c;\r\n\r\n  /* to get pbuffer capable pixel formats */\r\n  attrib[0] = WGL_DRAW_TO_PBUFFER_ARB;\r\n  attrib[1] = GL_TRUE;\r\n  attrib[2] = 0;\r\n  wglChoosePixelFormatARB(ctx->dc, attrib, 0, 1, &pf, &c);\r\n  /* query number of pixel formats */\r\n  attrib[0] = WGL_NUMBER_PIXEL_FORMATS_ARB;\r\n  wglGetPixelFormatAttribivARB(ctx->dc, 0, 0, 1, attrib, value);\r\n  maxpf = value[0];\r\n  for (i=0; i<32; i++)\r\n    value[i] = 0;\r\n\r\n  attrib[0] = WGL_SUPPORT_OPENGL_ARB;\r\n  attrib[1] = WGL_DRAW_TO_WINDOW_ARB;\r\n  attrib[2] = WGL_DRAW_TO_BITMAP_ARB;\r\n  attrib[3] = WGL_ACCELERATION_ARB;\r\n  /* WGL_NO_ACCELERATION_ARB, WGL_GENERIC_ACCELERATION_ARB, WGL_FULL_ACCELERATION_ARB */\r\n  attrib[4] = WGL_SWAP_METHOD_ARB;\r\n  /* WGL_SWAP_EXCHANGE_ARB, WGL_SWAP_COPY_ARB, WGL_SWAP_UNDEFINED_ARB */\r\n  attrib[5] = WGL_DOUBLE_BUFFER_ARB;\r\n  attrib[6] = WGL_STEREO_ARB;\r\n  attrib[7] = WGL_PIXEL_TYPE_ARB;\r\n  /* WGL_TYPE_RGBA_ARB, WGL_TYPE_COLORINDEX_ARB,\r\n     WGL_TYPE_RGBA_FLOAT_ATI (WGL_ATI_pixel_format_float) */\r\n  /* Color buffer information */\r\n  attrib[8] = WGL_COLOR_BITS_ARB;\r\n  attrib[9] = WGL_RED_BITS_ARB;\r\n  attrib[10] = WGL_GREEN_BITS_ARB;\r\n  attrib[11] = WGL_BLUE_BITS_ARB;\r\n  attrib[12] = WGL_ALPHA_BITS_ARB;\r\n  /* Accumulation buffer information */\r\n  attrib[13] = WGL_ACCUM_BITS_ARB;\r\n  attrib[14] = WGL_ACCUM_RED_BITS_ARB;\r\n  attrib[15] = WGL_ACCUM_GREEN_BITS_ARB;\r\n  attrib[16] = WGL_ACCUM_BLUE_BITS_ARB;\r\n  attrib[17] = WGL_ACCUM_ALPHA_BITS_ARB;\r\n  /* Depth, stencil, and aux buffer information */\r\n  attrib[18] = WGL_DEPTH_BITS_ARB;\r\n  attrib[19] = WGL_STENCIL_BITS_ARB;\r\n  attrib[20] = WGL_AUX_BUFFERS_ARB;\r\n  /* Layer information */\r\n  attrib[21] = WGL_NUMBER_OVERLAYS_ARB;\r\n  attrib[22] = WGL_NUMBER_UNDERLAYS_ARB;\r\n  attrib[23] = WGL_SWAP_LAYER_BUFFERS_ARB;\r\n  attrib[24] = WGL_SAMPLES_ARB;\r\n  attrib[25] = WGL_SUPPORT_GDI_ARB;\r\n  n_attrib = 26;\r\n  if (WGLEW_ARB_pbuffer)\r\n  {\r\n    attrib[n_attrib] = WGL_DRAW_TO_PBUFFER_ARB;\r\n    n_pbuffer = n_attrib;\r\n    n_attrib++;\r\n  }\r\n  if (WGLEW_NV_float_buffer)\r\n  {\r\n    attrib[n_attrib] = WGL_FLOAT_COMPONENTS_NV;\r\n    n_float = n_attrib;\r\n    n_attrib++;\r\n  }\r\n  \r\n  if (!verbose)\r\n  {\r\n    /* print table header */\r\n    fprintf(file, \" +-----+-------------------------+-----------------+----------+-----------------+----------+\\n\");\r\n    fprintf(file, \" |     |          visual         |      color      | ax dp st |      accum      |   layer  |\\n\");\r\n    fprintf(file, \" |  id | tp ac gd fm db sw st ms |  sz  r  g  b  a | bf th cl |  sz  r  g  b  a | ov un sw |\\n\");\r\n    fprintf(file, \" +-----+-------------------------+-----------------+----------+-----------------+----------+\\n\");\r\n    /* loop through all the pixel formats */\r\n    for(i = 1; i <= maxpf; i++)\r\n    {\r\n      wglGetPixelFormatAttribivARB(ctx->dc, i, 0, n_attrib, attrib, value);\r\n      /* only describe this format if it supports OpenGL */\r\n      if (!value[0]) continue;\r\n      /* by default show only fully accelerated window or pbuffer capable visuals */\r\n      if (!showall\r\n\t  && ((value[2] && !value[1])\r\n\t  || (!WGLEW_ARB_pbuffer || !value[n_pbuffer])\r\n\t  || (value[3] != WGL_FULL_ACCELERATION_ARB))) continue;\r\n      /* print out the information for this visual */\r\n      /* visual id */\r\n      fprintf(file, \" |% 4d | \", i);\r\n      /* visual type */\r\n      if (value[1])\r\n      {\r\n\tif (WGLEW_ARB_pbuffer && value[n_pbuffer]) fprintf(file, \"wp \");\r\n\telse fprintf(file, \"wn \");\r\n      }\r\n      else\r\n      {\r\n\tif (value[2]) fprintf(file, \"bm \");\r\n\telse if (WGLEW_ARB_pbuffer && value[n_pbuffer]) fprintf(file, \"pb \");\r\n      }\r\n      /* acceleration */\r\n      fprintf(file, \"%s \", value[3] == WGL_FULL_ACCELERATION_ARB ? \"fu\" : \r\n\t      value[3] == WGL_GENERIC_ACCELERATION_ARB ? \"ge\" :\r\n\t      value[3] == WGL_NO_ACCELERATION_ARB ? \"no\" : \". \");\r\n      /* gdi support */\r\n      fprintf(file, \" %c \", value[25] ? 'y' : '.');\r\n      /* format */\r\n      if (WGLEW_NV_float_buffer && value[n_float]) fprintf(file, \" f \");\r\n      else if (WGLEW_ATI_pixel_format_float && value[7] == WGL_TYPE_RGBA_FLOAT_ATI) fprintf(file, \" f \");\r\n      else if (value[7] == WGL_TYPE_RGBA_ARB) fprintf(file, \" i \");\r\n      else if (value[7] == WGL_TYPE_COLORINDEX_ARB) fprintf(file, \" c \");\r\n      /* double buffer */\r\n      fprintf(file, \" %c \", value[5] ? 'y' : '.');\r\n      /* swap method */\r\n      if (value[4] == WGL_SWAP_EXCHANGE_ARB) fprintf(file, \" x \");\r\n      else if (value[4] == WGL_SWAP_COPY_ARB) fprintf(file, \" c \");\r\n      else if (value[4] == WGL_SWAP_UNDEFINED_ARB) fprintf(file, \" . \");\r\n      else fprintf(file, \" . \");\r\n      /* stereo */\r\n      fprintf(file, \" %c \", value[6] ? 'y' : '.');\r\n      /* multisample */\r\n      if (value[24] > 0)\r\n\tfprintf(file, \"%2d | \", value[24]);\r\n      else\r\n\tfprintf(file, \" . | \");\r\n      /* color size */\r\n      if (value[8]) fprintf(file, \"%3d \", value[8]);\r\n      else fprintf(file, \"  . \");\r\n      /* red */\r\n      if (value[9]) fprintf(file, \"%2d \", value[9]); \r\n      else fprintf(file, \" . \");\r\n      /* green */\r\n      if (value[10]) fprintf(file, \"%2d \", value[10]); \r\n      else fprintf(file, \" . \");\r\n      /* blue */\r\n      if (value[11]) fprintf(file, \"%2d \", value[11]);\r\n      else fprintf(file, \" . \");\r\n      /* alpha */\r\n      if (value[12]) fprintf(file, \"%2d | \", value[12]); \r\n      else fprintf(file, \" . | \");\r\n      /* aux buffers */\r\n      if (value[20]) fprintf(file, \"%2d \", value[20]);\r\n      else fprintf(file, \" . \");\r\n      /* depth */\r\n      if (value[18]) fprintf(file, \"%2d \", value[18]);\r\n      else fprintf(file, \" . \");\r\n      /* stencil */\r\n      if (value[19]) fprintf(file, \"%2d | \", value[19]);\r\n      else fprintf(file, \" . | \");\r\n      /* accum size */\r\n      if (value[13]) fprintf(file, \"%3d \", value[13]);\r\n      else fprintf(file, \"  . \");\r\n      /* accum red */\r\n      if (value[14]) fprintf(file, \"%2d \", value[14]);\r\n      else fprintf(file, \" . \");\r\n      /* accum green */\r\n      if (value[15]) fprintf(file, \"%2d \", value[15]);\r\n      else fprintf(file, \" . \");\r\n      /* accum blue */\r\n      if (value[16]) fprintf(file, \"%2d \", value[16]);\r\n      else fprintf(file, \" . \");\r\n      /* accum alpha */\r\n      if (value[17]) fprintf(file, \"%2d | \", value[17]);\r\n      else fprintf(file, \" . | \");\r\n      /* overlay */\r\n      if (value[21]) fprintf(file, \"%2d \", value[21]);\r\n      else fprintf(file, \" . \");\r\n      /* underlay */\r\n      if (value[22]) fprintf(file, \"%2d \", value[22]);\r\n      else fprintf(file, \" . \");\r\n      /* layer swap */\r\n      if (value[23]) fprintf(file, \"y \");\r\n      else fprintf(file, \" . \");\r\n      fprintf(file, \"|\\n\");\r\n    }\r\n    /* print table footer */\r\n    fprintf(file, \" +-----+-------------------------+-----------------+----------+-----------------+----------+\\n\");\r\n    fprintf(file, \" |     |          visual         |      color      | ax dp st |      accum      |   layer  |\\n\");\r\n    fprintf(file, \" |  id | tp ac gd fm db sw st ms |  sz  r  g  b  a | bf th cl |  sz  r  g  b  a | ov un sw |\\n\");\r\n    fprintf(file, \" +-----+-------------------------+-----------------+----------+-----------------+----------+\\n\");\r\n  }\r\n  else /* verbose */\r\n  {\r\n#if 0\r\n    fprintf(file, \"\\n\");\r\n    /* loop through all the pixel formats */\r\n    for(i = 1; i <= maxpf; i++)\r\n    {\t    \r\n      DescribePixelFormat(ctx->dc, i, sizeof(PIXELFORMATDESCRIPTOR), &pfd);\r\n      /* only describe this format if it supports OpenGL */\r\n      if(!(pfd.dwFlags & PFD_SUPPORT_OPENGL)\r\n\t || (drawableonly && !(pfd.dwFlags & PFD_DRAW_TO_WINDOW))) continue;\r\n      fprintf(file, \"Visual ID: %2d  depth=%d  class=%s\\n\", i, pfd.cDepthBits, \r\n\t     pfd.cColorBits <= 8 ? \"PseudoColor\" : \"TrueColor\");\r\n      fprintf(file, \"    bufferSize=%d level=%d renderType=%s doubleBuffer=%d stereo=%d\\n\", pfd.cColorBits, pfd.bReserved, pfd.iPixelType == PFD_TYPE_RGBA ? \"rgba\" : \"ci\", pfd.dwFlags & PFD_DOUBLEBUFFER, pfd.dwFlags & PFD_STEREO);\r\n      fprintf(file, \"    generic=%d generic accelerated=%d\\n\", (pfd.dwFlags & PFD_GENERIC_FORMAT) == PFD_GENERIC_FORMAT, (pfd.dwFlags & PFD_GENERIC_ACCELERATED) == PFD_GENERIC_ACCELERATED);\r\n      fprintf(file, \"    rgba: redSize=%d greenSize=%d blueSize=%d alphaSize=%d\\n\", pfd.cRedBits, pfd.cGreenBits, pfd.cBlueBits, pfd.cAlphaBits);\r\n      fprintf(file, \"    auxBuffers=%d depthSize=%d stencilSize=%d\\n\", pfd.cAuxBuffers, pfd.cDepthBits, pfd.cStencilBits);\r\n      fprintf(file, \"    accum: redSize=%d greenSize=%d blueSize=%d alphaSize=%d\\n\", pfd.cAccumRedBits, pfd.cAccumGreenBits, pfd.cAccumBlueBits, pfd.cAccumAlphaBits);\r\n      fprintf(file, \"    multiSample=%d multisampleBuffers=%d\\n\", 0, 0);\r\n      fprintf(file, \"    Opaque.\\n\");\r\n    }\r\n#endif\r\n  }\r\n}\r\n\r\nvoid\r\nVisualInfoGDI (GLContext* ctx)\r\n{\r\n  int i, maxpf;\r\n  PIXELFORMATDESCRIPTOR pfd;\r\n\r\n  /* calling DescribePixelFormat() with NULL pfd (!!!) return maximum\r\n     number of pixel formats */\r\n  maxpf = DescribePixelFormat(ctx->dc, 1, 0, NULL);\r\n\r\n  if (!verbose)\r\n  {\r\n    fprintf(file, \"-----------------------------------------------------------------------------\\n\");\r\n    fprintf(file, \"   visual   x  bf  lv rg d st ge ge  r  g  b a  ax dp st   accum buffs    ms \\n\");\r\n    fprintf(file, \" id  dep tp sp sz  l  ci b ro ne ac sz sz sz sz bf th cl  sz  r  g  b  a ns b\\n\");\r\n    fprintf(file, \"-----------------------------------------------------------------------------\\n\");\r\n\r\n    /* loop through all the pixel formats */\r\n    for(i = 1; i <= maxpf; i++)\r\n    {\r\n      DescribePixelFormat(ctx->dc, i, sizeof(PIXELFORMATDESCRIPTOR), &pfd);\r\n      /* only describe this format if it supports OpenGL */\r\n      if(!(pfd.dwFlags & PFD_SUPPORT_OPENGL)\r\n\t || (drawableonly && (pfd.dwFlags & PFD_DRAW_TO_BITMAP))) continue;\r\n      /* other criteria could be tested here for actual pixel format\r\n\t choosing in an application:\r\n\t   \r\n\t for (...each pixel format...) {\r\n\t if (pfd.dwFlags & PFD_SUPPORT_OPENGL &&\r\n\t pfd.dwFlags & PFD_DOUBLEBUFFER &&\r\n\t pfd.cDepthBits >= 24 &&\r\n\t pfd.cColorBits >= 24)\r\n\t {\r\n\t goto found;\r\n\t }\r\n\t }\r\n\t ... not found so exit ...\r\n\t found:\r\n\t ... found so use it ...\r\n      */\r\n      /* print out the information for this pixel format */\r\n      fprintf(file, \"0x%02x \", i);\r\n      fprintf(file, \"%3d \", pfd.cColorBits);\r\n      if(pfd.dwFlags & PFD_DRAW_TO_WINDOW) fprintf(file, \"wn \");\r\n      else if(pfd.dwFlags & PFD_DRAW_TO_BITMAP) fprintf(file, \"bm \");\r\n      else fprintf(file, \"pb \");\r\n      /* should find transparent pixel from LAYERPLANEDESCRIPTOR */\r\n      fprintf(file, \" . \"); \r\n      fprintf(file, \"%3d \", pfd.cColorBits);\r\n      /* bReserved field indicates number of over/underlays */\r\n      if(pfd.bReserved) fprintf(file, \" %d \", pfd.bReserved);\r\n      else fprintf(file, \" . \"); \r\n      fprintf(file, \" %c \", pfd.iPixelType == PFD_TYPE_RGBA ? 'r' : 'c');\r\n      fprintf(file, \"%c \", pfd.dwFlags & PFD_DOUBLEBUFFER ? 'y' : '.');\r\n      fprintf(file, \" %c \", pfd.dwFlags & PFD_STEREO ? 'y' : '.');\r\n      /* added: */\r\n      fprintf(file, \" %c \", pfd.dwFlags & PFD_GENERIC_FORMAT ? 'y' : '.');\r\n      fprintf(file, \" %c \", pfd.dwFlags & PFD_GENERIC_ACCELERATED ? 'y' : '.');\r\n      if(pfd.cRedBits && pfd.iPixelType == PFD_TYPE_RGBA) \r\n\tfprintf(file, \"%2d \", pfd.cRedBits);\r\n      else fprintf(file, \" . \");\r\n      if(pfd.cGreenBits && pfd.iPixelType == PFD_TYPE_RGBA) \r\n\tfprintf(file, \"%2d \", pfd.cGreenBits);\r\n      else fprintf(file, \" . \");\r\n      if(pfd.cBlueBits && pfd.iPixelType == PFD_TYPE_RGBA) \r\n\tfprintf(file, \"%2d \", pfd.cBlueBits);\r\n      else fprintf(file, \" . \");\r\n      if(pfd.cAlphaBits && pfd.iPixelType == PFD_TYPE_RGBA) \r\n\tfprintf(file, \"%2d \", pfd.cAlphaBits);\r\n      else fprintf(file, \" . \");\r\n      if(pfd.cAuxBuffers)     fprintf(file, \"%2d \", pfd.cAuxBuffers);\r\n      else fprintf(file, \" . \");\r\n      if(pfd.cDepthBits)      fprintf(file, \"%2d \", pfd.cDepthBits);\r\n      else fprintf(file, \" . \");\r\n      if(pfd.cStencilBits)    fprintf(file, \"%2d \", pfd.cStencilBits);\r\n      else fprintf(file, \" . \");\r\n      if(pfd.cAccumBits)   fprintf(file, \"%3d \", pfd.cAccumBits);\r\n      else fprintf(file, \"  . \");\r\n      if(pfd.cAccumRedBits)   fprintf(file, \"%2d \", pfd.cAccumRedBits);\r\n      else fprintf(file, \" . \");\r\n      if(pfd.cAccumGreenBits) fprintf(file, \"%2d \", pfd.cAccumGreenBits);\r\n      else fprintf(file, \" . \");\r\n      if(pfd.cAccumBlueBits)  fprintf(file, \"%2d \", pfd.cAccumBlueBits);\r\n      else fprintf(file, \" . \");\r\n      if(pfd.cAccumAlphaBits) fprintf(file, \"%2d \", pfd.cAccumAlphaBits);\r\n      else fprintf(file, \" . \");\r\n      /* no multisample in win32 */\r\n      fprintf(file, \" . .\\n\");\r\n    }\r\n    /* print table footer */\r\n    fprintf(file, \"-----------------------------------------------------------------------------\\n\");\r\n    fprintf(file, \"   visual   x  bf  lv rg d st ge ge  r  g  b a  ax dp st   accum buffs    ms \\n\");\r\n    fprintf(file, \" id  dep tp sp sz  l  ci b ro ne ac sz sz sz sz bf th cl  sz  r  g  b  a ns b\\n\");\r\n    fprintf(file, \"-----------------------------------------------------------------------------\\n\");\r\n  }\r\n  else /* verbose */\r\n  {\r\n    fprintf(file, \"\\n\");\r\n    /* loop through all the pixel formats */\r\n    for(i = 1; i <= maxpf; i++)\r\n    {\t    \r\n      DescribePixelFormat(ctx->dc, i, sizeof(PIXELFORMATDESCRIPTOR), &pfd);\r\n      /* only describe this format if it supports OpenGL */\r\n      if(!(pfd.dwFlags & PFD_SUPPORT_OPENGL)\r\n\t || (drawableonly && !(pfd.dwFlags & PFD_DRAW_TO_WINDOW))) continue;\r\n      fprintf(file, \"Visual ID: %2d  depth=%d  class=%s\\n\", i, pfd.cDepthBits, \r\n\t     pfd.cColorBits <= 8 ? \"PseudoColor\" : \"TrueColor\");\r\n      fprintf(file, \"    bufferSize=%d level=%d renderType=%s doubleBuffer=%ld stereo=%ld\\n\", pfd.cColorBits, pfd.bReserved, pfd.iPixelType == PFD_TYPE_RGBA ? \"rgba\" : \"ci\", pfd.dwFlags & PFD_DOUBLEBUFFER, pfd.dwFlags & PFD_STEREO);\r\n      fprintf(file, \"    generic=%d generic accelerated=%d\\n\", (pfd.dwFlags & PFD_GENERIC_FORMAT) == PFD_GENERIC_FORMAT, (pfd.dwFlags & PFD_GENERIC_ACCELERATED) == PFD_GENERIC_ACCELERATED);\r\n      fprintf(file, \"    rgba: redSize=%d greenSize=%d blueSize=%d alphaSize=%d\\n\", pfd.cRedBits, pfd.cGreenBits, pfd.cBlueBits, pfd.cAlphaBits);\r\n      fprintf(file, \"    auxBuffers=%d depthSize=%d stencilSize=%d\\n\", pfd.cAuxBuffers, pfd.cDepthBits, pfd.cStencilBits);\r\n      fprintf(file, \"    accum: redSize=%d greenSize=%d blueSize=%d alphaSize=%d\\n\", pfd.cAccumRedBits, pfd.cAccumGreenBits, pfd.cAccumBlueBits, pfd.cAccumAlphaBits);\r\n      fprintf(file, \"    multiSample=%d multisampleBuffers=%d\\n\", 0, 0);\r\n      fprintf(file, \"    Opaque.\\n\");\r\n    }\r\n  }\r\n}\r\n\r\nvoid\r\nVisualInfo (GLContext* ctx)\r\n{\r\n  if (WGLEW_ARB_pixel_format)\r\n    VisualInfoARB(ctx);\r\n  else\r\n    VisualInfoGDI(ctx);\r\n}\r\n\r\n/* ---------------------------------------------------------------------- */\r\n\r\n#elif defined(__APPLE__) && !defined(GLEW_APPLE_GLX)\r\n\r\nvoid\r\nVisualInfo (GLContext* ctx)\r\n{\r\n/*\r\n  int attrib[] = { AGL_RGBA, AGL_NONE };\r\n  AGLPixelFormat pf;\r\n  GLint value;\r\n  pf = aglChoosePixelFormat(NULL, 0, attrib);\r\n  while (pf != NULL)\r\n  {\r\n    aglDescribePixelFormat(pf, GL_RGBA, &value);\r\n    fprintf(stderr, \"%d\\n\", value);\r\n    pf = aglNextPixelFormat(pf);\r\n  }\r\n*/\r\n}\r\n\r\n#else /* GLX */\r\n\r\nvoid\r\nVisualInfo (GLContext* ctx)\r\n{\r\n  int n_fbc;\r\n  GLXFBConfig* fbc;\r\n  int value, ret, i;\r\n\r\n  fbc = glXGetFBConfigs(ctx->dpy, DefaultScreen(ctx->dpy), &n_fbc);\r\n\r\n  if (fbc)\r\n  {\r\n    if (!verbose)\r\n    {\r\n      /* print table header */\r\n      fprintf(file, \" +-----+-------------------------+-----------------+----------+-------------+-------+------+\\n\");\r\n      fprintf(file, \" |     |        visual           |      color      | ax dp st |    accum    |   ms  |  cav |\\n\");\r\n      fprintf(file, \" |  id | tp xr cl fm db st lv xp |  sz  r  g  b  a | bf th cl | r  g  b  a  | ns  b |  eat |\\n\");\r\n      fprintf(file, \" +-----+-------------------------+-----------------+----------+-------------+-------+------+\\n\");\r\n      /* loop through all the fbcs */\r\n      for (i=0; i<n_fbc; i++)\r\n      {\r\n        /* print out the information for this fbc */\r\n        /* visual id */\r\n        ret = glXGetFBConfigAttrib(ctx->dpy, fbc[i], GLX_FBCONFIG_ID, &value);\r\n        if (ret != Success)\r\n        {\r\n          fprintf(file, \"|  ?  |\");\r\n        }\r\n        else\r\n        {\r\n          fprintf(file, \" |% 4d | \", value);\r\n        }\r\n        /* visual type */\r\n        ret = glXGetFBConfigAttrib(ctx->dpy, fbc[i], GLX_DRAWABLE_TYPE, &value);\r\n        if (ret != Success)\r\n        {\r\n          fprintf(file, \" ? \");\r\n        }\r\n        else\r\n        {\r\n          if (value & GLX_WINDOW_BIT)\r\n          {\r\n            if (value & GLX_PBUFFER_BIT)\r\n            {\r\n              fprintf(file, \"wp \");\r\n            }\r\n            else\r\n            {\r\n              fprintf(file, \"wn \");\r\n            }\r\n          }\r\n          else\r\n          {\r\n            if (value & GLX_PBUFFER_BIT)\r\n            {\r\n              fprintf(file, \"pb \");\r\n            }\r\n            else if (value & GLX_PIXMAP_BIT)\r\n            {\r\n              fprintf(file, \"pm \");\r\n            }\r\n            else\r\n            {\r\n              fprintf(file, \" ? \");\r\n            }\r\n          }\r\n        }\r\n        /* x renderable */\r\n        ret = glXGetFBConfigAttrib(ctx->dpy, fbc[i], GLX_X_RENDERABLE, &value);\r\n        if (ret != Success)\r\n        {\r\n          fprintf(file, \" ? \");\r\n        }\r\n        else\r\n        {\r\n          fprintf(file, value ? \" y \" : \" n \");\r\n        }\r\n        /* class */\r\n        ret = glXGetFBConfigAttrib(ctx->dpy, fbc[i], GLX_X_VISUAL_TYPE, &value);\r\n        if (ret != Success)\r\n        {\r\n          fprintf(file, \" ? \");\r\n        }\r\n        else\r\n        {\r\n          if (GLX_TRUE_COLOR == value)\r\n            fprintf(file, \"tc \");\r\n          else if (GLX_DIRECT_COLOR == value)\r\n            fprintf(file, \"dc \");\r\n          else if (GLX_PSEUDO_COLOR == value)\r\n            fprintf(file, \"pc \");\r\n          else if (GLX_STATIC_COLOR == value)\r\n            fprintf(file, \"sc \");\r\n          else if (GLX_GRAY_SCALE == value)\r\n            fprintf(file, \"gs \");\r\n          else if (GLX_STATIC_GRAY == value)\r\n            fprintf(file, \"sg \");\r\n          else if (GLX_X_VISUAL_TYPE == value)\r\n            fprintf(file, \" . \");\r\n          else\r\n            fprintf(file, \" ? \");\r\n        }\r\n        /* format */\r\n        ret = glXGetFBConfigAttrib(ctx->dpy, fbc[i], GLX_RENDER_TYPE, &value);\r\n        if (ret != Success)\r\n        {\r\n          fprintf(file, \" ? \");\r\n        }\r\n        else\r\n        {\r\n          if (GLXEW_NV_float_buffer)\r\n          {\r\n            int ret2, value2;\r\n            ret2 = glXGetFBConfigAttrib(ctx->dpy, fbc[i], GLX_FLOAT_COMPONENTS_NV, &value2);\r\n            if (Success == ret2 && GL_TRUE == value2)\r\n            {\r\n              fprintf(file, \" f \");\r\n            }\r\n            else if (value & GLX_RGBA_BIT)\r\n              fprintf(file, \" i \");\r\n            else if (value & GLX_COLOR_INDEX_BIT)\r\n              fprintf(file, \" c \");\r\n            else\r\n              fprintf(file, \" ? \");\r\n          }\r\n          else\r\n          {\r\n            if (value & GLX_RGBA_FLOAT_ATI_BIT)\r\n              fprintf(file, \" f \");\r\n            else if (value & GLX_RGBA_BIT)\r\n              fprintf(file, \" i \");\r\n            else if (value & GLX_COLOR_INDEX_BIT)\r\n              fprintf(file, \" c \");\r\n            else\r\n              fprintf(file, \" ? \");\r\n          }\r\n        }\r\n        /* double buffer */\r\n        ret = glXGetFBConfigAttrib(ctx->dpy, fbc[i], GLX_DOUBLEBUFFER, &value);\r\n        fprintf(file, \" %c \", Success != ret ? '?' : (value ? 'y' : '.'));\r\n        /* stereo */\r\n        ret = glXGetFBConfigAttrib(ctx->dpy, fbc[i], GLX_STEREO, &value);\r\n        fprintf(file, \" %c \", Success != ret ? '?' : (value ? 'y' : '.'));\r\n        /* level */\r\n        ret = glXGetFBConfigAttrib(ctx->dpy, fbc[i], GLX_LEVEL, &value);\r\n        if (Success != ret)\r\n        {\r\n          fprintf(file, \" ? \");\r\n        }\r\n        else\r\n        {\r\n          fprintf(file, \"%2d \", value);\r\n        }\r\n        /* transparency */\r\n        ret = glXGetFBConfigAttrib(ctx->dpy, fbc[i], GLX_TRANSPARENT_TYPE, &value);\r\n        if (Success != ret)\r\n        {\r\n          fprintf(file, \" ? | \");\r\n        }\r\n        else\r\n        {\r\n          if (GLX_TRANSPARENT_RGB == value)\r\n            fprintf(file, \" r | \");\r\n          else if (GLX_TRANSPARENT_INDEX == value)\r\n            fprintf(file, \" i | \");\r\n          else if (GLX_NONE == value)\r\n            fprintf(file, \" . | \");\r\n          else\r\n            fprintf(file, \" ? | \");\r\n        }\r\n        /* color size */\r\n        ret = glXGetFBConfigAttrib(ctx->dpy, fbc[i], GLX_BUFFER_SIZE, &value);\r\n        if (Success != ret)\r\n        {\r\n          fprintf(file, \"  ? \");\r\n        }\r\n        else\r\n        {\r\n          if (value)\r\n            fprintf(file, \"%3d \", value);\r\n          else\r\n            fprintf(file, \"  . \");\r\n        }\r\n        /* red size */\r\n        ret = glXGetFBConfigAttrib(ctx->dpy, fbc[i], GLX_RED_SIZE, &value);\r\n        if (Success != ret)\r\n        {\r\n          fprintf(file, \" ? \");\r\n        }\r\n        else\r\n        {\r\n          if (value)\r\n            fprintf(file, \"%2d \", value);\r\n          else\r\n            fprintf(file, \" . \");\r\n        }\r\n        /* green size */\r\n        ret = glXGetFBConfigAttrib(ctx->dpy, fbc[i], GLX_GREEN_SIZE, &value);\r\n        if (Success != ret)\r\n        {\r\n          fprintf(file, \" ? \");\r\n        }\r\n        else\r\n        {\r\n          if (value)\r\n            fprintf(file, \"%2d \", value);\r\n          else\r\n            fprintf(file, \" . \");\r\n        }\r\n        /* blue size */\r\n        ret = glXGetFBConfigAttrib(ctx->dpy, fbc[i], GLX_BLUE_SIZE, &value);\r\n        if (Success != ret)\r\n        {\r\n          fprintf(file, \" ? \");\r\n        }\r\n        else\r\n        {\r\n          if (value)\r\n            fprintf(file, \"%2d \", value);\r\n          else\r\n            fprintf(file, \" . \");\r\n        }\r\n        /* alpha size */\r\n        ret = glXGetFBConfigAttrib(ctx->dpy, fbc[i], GLX_ALPHA_SIZE, &value);\r\n        if (Success != ret)\r\n        {\r\n          fprintf(file, \" ? | \");\r\n        }\r\n        else\r\n        {\r\n          if (value)\r\n            fprintf(file, \"%2d | \", value);\r\n          else\r\n            fprintf(file, \" . | \");\r\n        }\r\n        /* aux buffers */\r\n        ret = glXGetFBConfigAttrib(ctx->dpy, fbc[i], GLX_AUX_BUFFERS, &value);\r\n        if (Success != ret)\r\n        {\r\n          fprintf(file, \" ? \");\r\n        }\r\n        else\r\n        {\r\n          if (value)\r\n            fprintf(file, \"%2d \", value);\r\n          else\r\n            fprintf(file, \" . \");\r\n        }\r\n        /* depth size */\r\n        ret = glXGetFBConfigAttrib(ctx->dpy, fbc[i], GLX_DEPTH_SIZE, &value);\r\n        if (Success != ret)\r\n        {\r\n          fprintf(file, \" ? \");\r\n        }\r\n        else\r\n        {\r\n          if (value)\r\n            fprintf(file, \"%2d \", value);\r\n          else\r\n            fprintf(file, \" . \");\r\n        }\r\n        /* stencil size */\r\n        ret = glXGetFBConfigAttrib(ctx->dpy, fbc[i], GLX_STENCIL_SIZE, &value);\r\n        if (Success != ret)\r\n        {\r\n          fprintf(file, \" ? | \");\r\n        }\r\n        else\r\n        {\r\n          if (value)\r\n            fprintf(file, \"%2d | \", value);\r\n          else\r\n            fprintf(file, \" . | \");\r\n        }\r\n        /* accum red size */\r\n        ret = glXGetFBConfigAttrib(ctx->dpy, fbc[i], GLX_ACCUM_RED_SIZE, &value);\r\n        if (Success != ret)\r\n        {\r\n          fprintf(file, \" ? \");\r\n        }\r\n        else\r\n        {\r\n          if (value)\r\n            fprintf(file, \"%2d \", value);\r\n          else\r\n            fprintf(file, \" . \");\r\n        }\r\n        /* accum green size */\r\n        ret = glXGetFBConfigAttrib(ctx->dpy, fbc[i], GLX_ACCUM_GREEN_SIZE, &value);\r\n        if (Success != ret)\r\n        {\r\n          fprintf(file, \" ? \");\r\n        }\r\n        else\r\n        {\r\n          if (value)\r\n            fprintf(file, \"%2d \", value);\r\n          else\r\n            fprintf(file, \" . \");\r\n        }\r\n        /* accum blue size */\r\n        ret = glXGetFBConfigAttrib(ctx->dpy, fbc[i], GLX_ACCUM_BLUE_SIZE, &value);\r\n        if (Success != ret)\r\n        {\r\n          fprintf(file, \" ? \");\r\n        }\r\n        else\r\n        {\r\n          if (value)\r\n            fprintf(file, \"%2d \", value);\r\n          else\r\n            fprintf(file, \" . \");\r\n        }\r\n        /* accum alpha size */\r\n        ret = glXGetFBConfigAttrib(ctx->dpy, fbc[i], GLX_ACCUM_ALPHA_SIZE, &value);\r\n        if (Success != ret)\r\n        {\r\n          fprintf(file, \" ? | \");\r\n        }\r\n        else\r\n        {\r\n          if (value)\r\n            fprintf(file, \"%2d | \", value);\r\n          else\r\n            fprintf(file, \" . | \");\r\n        }\r\n        /* multisample */\r\n        ret = glXGetFBConfigAttrib(ctx->dpy, fbc[i], GLX_SAMPLES, &value);\r\n        if (Success != ret)\r\n        {\r\n          fprintf(file, \" ? \");\r\n        }\r\n        else\r\n        {\r\n          fprintf(file, \"%2d \", value);\r\n        }\r\n        ret = glXGetFBConfigAttrib(ctx->dpy, fbc[i], GLX_SAMPLE_BUFFERS, &value);\r\n        if (Success != ret)\r\n        {\r\n          fprintf(file, \" ? | \");\r\n        }\r\n        else\r\n        {\r\n          fprintf(file, \"%2d | \", value);\r\n        }\r\n        /* caveat */\r\n        ret = glXGetFBConfigAttrib(ctx->dpy, fbc[i], GLX_CONFIG_CAVEAT, &value);\r\n        if (Success != ret)\r\n        {\r\n          fprintf(file, \"???? |\");\r\n        }\r\n        else\r\n        {\r\n          if (GLX_NONE == value)\r\n            fprintf(file, \"none |\\n\");\r\n          else if (GLX_SLOW_CONFIG == value)\r\n            fprintf(file, \"slow |\\n\");\r\n          else if (GLX_NON_CONFORMANT_CONFIG == value)\r\n            fprintf(file, \"ncft |\\n\");\r\n          else\r\n            fprintf(file, \"???? |\\n\");\r\n        }\r\n      }\r\n      /* print table footer */\r\n      fprintf(file, \" +-----+-------------------------+-----------------+----------+-------------+-------+------+\\n\");\r\n      fprintf(file, \" |  id | tp xr cl fm db st lv xp |  sz  r  g  b  a | bf th cl | r  g  b  a  | ns  b |  eat |\\n\");\r\n      fprintf(file, \" |     |        visual           |      color      | ax dp st |    accum    |   ms  |  cav |\\n\");\r\n      fprintf(file, \" +-----+-------------------------+-----------------+----------+-------------+-------+------+\\n\");\r\n    }\r\n  }\r\n}\r\n\r\n#endif\r\n\r\n/* ------------------------------------------------------------------------ */\r\n\r\n#if defined(_WIN32)\r\n\r\nvoid InitContext (GLContext* ctx)\r\n{\r\n  ctx->wnd = NULL;\r\n  ctx->dc = NULL;\r\n  ctx->rc = NULL;\r\n}\r\n\r\nGLboolean CreateContext (GLContext* ctx)\r\n{\r\n  WNDCLASS wc;\r\n  PIXELFORMATDESCRIPTOR pfd;\r\n  /* check for input */\r\n  if (NULL == ctx) return GL_TRUE;\r\n  /* register window class */\r\n  ZeroMemory(&wc, sizeof(WNDCLASS));\r\n  wc.hInstance = GetModuleHandle(NULL);\r\n  wc.lpfnWndProc = DefWindowProc;\r\n  wc.lpszClassName = \"GLEW\";\r\n  if (0 == RegisterClass(&wc)) return GL_TRUE;\r\n  /* create window */\r\n  ctx->wnd = CreateWindow(\"GLEW\", \"GLEW\", 0, CW_USEDEFAULT, CW_USEDEFAULT, \r\n                          CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, \r\n                          GetModuleHandle(NULL), NULL);\r\n  if (NULL == ctx->wnd) return GL_TRUE;\r\n  /* get the device context */\r\n  ctx->dc = GetDC(ctx->wnd);\r\n  if (NULL == ctx->dc) return GL_TRUE;\r\n  /* find pixel format */\r\n  ZeroMemory(&pfd, sizeof(PIXELFORMATDESCRIPTOR));\r\n  if (visual == -1) /* find default */\r\n  {\r\n    pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);\r\n    pfd.nVersion = 1;\r\n    pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL;\r\n    visual = ChoosePixelFormat(ctx->dc, &pfd);\r\n    if (0 == visual) return GL_TRUE;\r\n  }\r\n  /* set the pixel format for the dc */\r\n  if (FALSE == SetPixelFormat(ctx->dc, visual, &pfd)) return GL_TRUE;\r\n  /* create rendering context */\r\n  ctx->rc = wglCreateContext(ctx->dc);\r\n  if (NULL == ctx->rc) return GL_TRUE;\r\n  if (FALSE == wglMakeCurrent(ctx->dc, ctx->rc)) return GL_TRUE;\r\n  return GL_FALSE;\r\n}\r\n\r\nvoid DestroyContext (GLContext* ctx)\r\n{\r\n  if (NULL == ctx) return;\r\n  if (NULL != ctx->rc) wglMakeCurrent(NULL, NULL);\r\n  if (NULL != ctx->rc) wglDeleteContext(wglGetCurrentContext());\r\n  if (NULL != ctx->wnd && NULL != ctx->dc) ReleaseDC(ctx->wnd, ctx->dc);\r\n  if (NULL != ctx->wnd) DestroyWindow(ctx->wnd);\r\n  UnregisterClass(\"GLEW\", GetModuleHandle(NULL));\r\n}\r\n\r\n/* ------------------------------------------------------------------------ */\r\n\r\n#elif defined(__APPLE__) && !defined(GLEW_APPLE_GLX)\r\n\r\nvoid InitContext (GLContext* ctx)\r\n{\r\n  ctx->ctx = NULL;\r\n  ctx->octx = NULL;\r\n}\r\n\r\nGLboolean CreateContext (GLContext* ctx)\r\n{\r\n  int attrib[] = { AGL_RGBA, AGL_NONE };\r\n  AGLPixelFormat pf;\r\n  /* check input */\r\n  if (NULL == ctx) return GL_TRUE;\r\n  /*int major, minor;\r\n  SetPortWindowPort(wnd);\r\n  aglGetVersion(&major, &minor);\r\n  fprintf(stderr, \"GL %d.%d\\n\", major, minor);*/\r\n  pf = aglChoosePixelFormat(NULL, 0, attrib);\r\n  if (NULL == pf) return GL_TRUE;\r\n  ctx->ctx = aglCreateContext(pf, NULL);\r\n  if (NULL == ctx->ctx || AGL_NO_ERROR != aglGetError()) return GL_TRUE;\r\n  aglDestroyPixelFormat(pf);\r\n  /*aglSetDrawable(ctx, GetWindowPort(wnd));*/\r\n  ctx->octx = aglGetCurrentContext();\r\n  if (GL_FALSE == aglSetCurrentContext(ctx->ctx)) return GL_TRUE;\r\n  return GL_FALSE;\r\n}\r\n\r\nvoid DestroyContext (GLContext* ctx)\r\n{\r\n  if (NULL == ctx) return;\r\n  aglSetCurrentContext(ctx->octx);\r\n  if (NULL != ctx->ctx) aglDestroyContext(ctx->ctx);\r\n}\r\n\r\n/* ------------------------------------------------------------------------ */\r\n\r\n#else /* __UNIX || (__APPLE__ && GLEW_APPLE_GLX) */\r\n\r\nvoid InitContext (GLContext* ctx)\r\n{\r\n  ctx->dpy = NULL;\r\n  ctx->vi = NULL;\r\n  ctx->ctx = NULL;\r\n  ctx->wnd = 0;\r\n  ctx->cmap = 0;\r\n}\r\n\r\nGLboolean CreateContext (GLContext* ctx)\r\n{\r\n  int attrib[] = { GLX_RGBA, GLX_DOUBLEBUFFER, None };\r\n  int erb, evb;\r\n  XSetWindowAttributes swa;\r\n  /* check input */\r\n  if (NULL == ctx) return GL_TRUE;\r\n  /* open display */\r\n  ctx->dpy = XOpenDisplay(display);\r\n  if (NULL == ctx->dpy) return GL_TRUE;\r\n  /* query for glx */\r\n  if (!glXQueryExtension(ctx->dpy, &erb, &evb)) return GL_TRUE;\r\n  /* choose visual */\r\n  ctx->vi = glXChooseVisual(ctx->dpy, DefaultScreen(ctx->dpy), attrib);\r\n  if (NULL == ctx->vi) return GL_TRUE;\r\n  /* create context */\r\n  ctx->ctx = glXCreateContext(ctx->dpy, ctx->vi, None, True);\r\n  if (NULL == ctx->ctx) return GL_TRUE;\r\n  /* create window */\r\n  /*wnd = XCreateSimpleWindow(dpy, RootWindow(dpy, vi->screen), 0, 0, 1, 1, 1, 0, 0);*/\r\n  ctx->cmap = XCreateColormap(ctx->dpy, RootWindow(ctx->dpy, ctx->vi->screen),\r\n                              ctx->vi->visual, AllocNone);\r\n  swa.border_pixel = 0;\r\n  swa.colormap = ctx->cmap;\r\n  ctx->wnd = XCreateWindow(ctx->dpy, RootWindow(ctx->dpy, ctx->vi->screen), \r\n                           0, 0, 1, 1, 0, ctx->vi->depth, InputOutput, ctx->vi->visual, \r\n                           CWBorderPixel | CWColormap, &swa);\r\n  /* make context current */\r\n  if (!glXMakeCurrent(ctx->dpy, ctx->wnd, ctx->ctx)) return GL_TRUE;\r\n  return GL_FALSE;\r\n}\r\n\r\nvoid DestroyContext (GLContext* ctx)\r\n{\r\n  if (NULL != ctx->dpy && NULL != ctx->ctx) glXDestroyContext(ctx->dpy, ctx->ctx);\r\n  if (NULL != ctx->dpy && 0 != ctx->wnd) XDestroyWindow(ctx->dpy, ctx->wnd);\r\n  if (NULL != ctx->dpy && 0 != ctx->cmap) XFreeColormap(ctx->dpy, ctx->cmap);\r\n  if (NULL != ctx->vi) XFree(ctx->vi);\r\n  if (NULL != ctx->dpy) XCloseDisplay(ctx->dpy);\r\n}\r\n\r\n#endif /* __UNIX || (__APPLE__ && GLEW_APPLE_GLX) */\r\n\r\nGLboolean ParseArgs (int argc, char** argv)\r\n{\r\n  int p = 0;\r\n  while (p < argc)\r\n  {\r\n#if defined(_WIN32)\r\n    if (!strcmp(argv[p], \"-pf\") || !strcmp(argv[p], \"-pixelformat\"))\r\n    {\r\n      if (++p >= argc) return GL_TRUE;\r\n      display = NULL;\r\n      visual = strtol(argv[p], NULL, 0);\r\n    }\r\n    else if (!strcmp(argv[p], \"-a\"))\r\n    {\r\n      showall = 1;\r\n    }\r\n    else if (!strcmp(argv[p], \"-s\"))\r\n    {\r\n      displaystdout = 1;\r\n    }\r\n    else if (!strcmp(argv[p], \"-h\"))\r\n    {\r\n      return GL_TRUE;\r\n    }\r\n    else\r\n      return GL_TRUE;\r\n#else\r\n    if (!strcmp(argv[p], \"-display\"))\r\n    {\r\n      if (++p >= argc) return GL_TRUE;\r\n      display = argv[p];\r\n    }\r\n    else if (!strcmp(argv[p], \"-visual\"))\r\n    {\r\n      if (++p >= argc) return GL_TRUE;\r\n      visual = (int)strtol(argv[p], NULL, 0);\r\n    }\r\n    else if (!strcmp(argv[p], \"-h\"))\r\n    {\r\n      return GL_TRUE;\r\n    }\r\n    else\r\n      return GL_TRUE;\r\n#endif\r\n    p++;\r\n  }\r\n  return GL_FALSE;\r\n}\r\n"
  },
  {
    "path": "libs/libigl/ACKNOWLEDGEMENTS",
    "content": "Qiong Wu (pointing out compilation errors in Windows)\nGaurav Bharaj (pointing out bug in remove_duplicate_vertices.cpp)\n"
  },
  {
    "path": "libs/libigl/LICENSE",
    "content": "Libigl is primarily licensed under MPL2\n  - http://www.mozilla.org/MPL/2.0/\n  - http://www.mozilla.org/MPL/2.0/FAQ.html\n\nSome files contain third-party code under other licenses:\n\n  - tga.h/tga.cpp GNU GPL\n"
  },
  {
    "path": "libs/libigl/LICENSE.GPL",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://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 <http://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<http://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<http://www.gnu.org/philosophy/why-not-lgpl.html>.\n"
  },
  {
    "path": "libs/libigl/LICENSE.MPL2",
    "content": "Mozilla Public License Version 2.0\n==================================\n\n1. Definitions\n--------------\n\n1.1. \"Contributor\"\n    means each individual or legal entity that creates, contributes to\n    the creation of, or owns Covered Software.\n\n1.2. \"Contributor Version\"\n    means the combination of the Contributions of others (if any) used\n    by a Contributor and that particular Contributor's Contribution.\n\n1.3. \"Contribution\"\n    means Covered Software of a particular Contributor.\n\n1.4. \"Covered Software\"\n    means Source Code Form to which the initial Contributor has attached\n    the notice in Exhibit A, the Executable Form of such Source Code\n    Form, and Modifications of such Source Code Form, in each case\n    including portions thereof.\n\n1.5. \"Incompatible With Secondary Licenses\"\n    means\n\n    (a) that the initial Contributor has attached the notice described\n        in Exhibit B to the Covered Software; or\n\n    (b) that the Covered Software was made available under the terms of\n        version 1.1 or earlier of the License, but not also under the\n        terms of a Secondary License.\n\n1.6. \"Executable Form\"\n    means any form of the work other than Source Code Form.\n\n1.7. \"Larger Work\"\n    means a work that combines Covered Software with other material, in \n    a separate file or files, that is not Covered Software.\n\n1.8. \"License\"\n    means this document.\n\n1.9. \"Licensable\"\n    means having the right to grant, to the maximum extent possible,\n    whether at the time of the initial grant or subsequently, any and\n    all of the rights conveyed by this License.\n\n1.10. \"Modifications\"\n    means any of the following:\n\n    (a) any file in Source Code Form that results from an addition to,\n        deletion from, or modification of the contents of Covered\n        Software; or\n\n    (b) any new file in Source Code Form that contains any Covered\n        Software.\n\n1.11. \"Patent Claims\" of a Contributor\n    means any patent claim(s), including without limitation, method,\n    process, and apparatus claims, in any patent Licensable by such\n    Contributor that would be infringed, but for the grant of the\n    License, by the making, using, selling, offering for sale, having\n    made, import, or transfer of either its Contributions or its\n    Contributor Version.\n\n1.12. \"Secondary License\"\n    means either the GNU General Public License, Version 2.0, the GNU\n    Lesser General Public License, Version 2.1, the GNU Affero General\n    Public License, Version 3.0, or any later versions of those\n    licenses.\n\n1.13. \"Source Code Form\"\n    means the form of the work preferred for making modifications.\n\n1.14. \"You\" (or \"Your\")\n    means an individual or a legal entity exercising rights under this\n    License. For legal entities, \"You\" includes any entity that\n    controls, is controlled by, or is under common control with You. For\n    purposes of this definition, \"control\" means (a) the power, direct\n    or indirect, to cause the direction or management of such entity,\n    whether by contract or otherwise, or (b) ownership of more than\n    fifty percent (50%) of the outstanding shares or beneficial\n    ownership of such entity.\n\n2. License Grants and Conditions\n--------------------------------\n\n2.1. Grants\n\nEach Contributor hereby grants You a world-wide, royalty-free,\nnon-exclusive license:\n\n(a) under intellectual property rights (other than patent or trademark)\n    Licensable by such Contributor to use, reproduce, make available,\n    modify, display, perform, distribute, and otherwise exploit its\n    Contributions, either on an unmodified basis, with Modifications, or\n    as part of a Larger Work; and\n\n(b) under Patent Claims of such Contributor to make, use, sell, offer\n    for sale, have made, import, and otherwise transfer either its\n    Contributions or its Contributor Version.\n\n2.2. Effective Date\n\nThe licenses granted in Section 2.1 with respect to any Contribution\nbecome effective for each Contribution on the date the Contributor first\ndistributes such Contribution.\n\n2.3. Limitations on Grant Scope\n\nThe licenses granted in this Section 2 are the only rights granted under\nthis License. No additional rights or licenses will be implied from the\ndistribution or licensing of Covered Software under this License.\nNotwithstanding Section 2.1(b) above, no patent license is granted by a\nContributor:\n\n(a) for any code that a Contributor has removed from Covered Software;\n    or\n\n(b) for infringements caused by: (i) Your and any other third party's\n    modifications of Covered Software, or (ii) the combination of its\n    Contributions with other software (except as part of its Contributor\n    Version); or\n\n(c) under Patent Claims infringed by Covered Software in the absence of\n    its Contributions.\n\nThis License does not grant any rights in the trademarks, service marks,\nor logos of any Contributor (except as may be necessary to comply with\nthe notice requirements in Section 3.4).\n\n2.4. Subsequent Licenses\n\nNo Contributor makes additional grants as a result of Your choice to\ndistribute the Covered Software under a subsequent version of this\nLicense (see Section 10.2) or under the terms of a Secondary License (if\npermitted under the terms of Section 3.3).\n\n2.5. Representation\n\nEach Contributor represents that the Contributor believes its\nContributions are its original creation(s) or it has sufficient rights\nto grant the rights to its Contributions conveyed by this License.\n\n2.6. Fair Use\n\nThis License is not intended to limit any rights You have under\napplicable copyright doctrines of fair use, fair dealing, or other\nequivalents.\n\n2.7. Conditions\n\nSections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted\nin Section 2.1.\n\n3. Responsibilities\n-------------------\n\n3.1. Distribution of Source Form\n\nAll distribution of Covered Software in Source Code Form, including any\nModifications that You create or to which You contribute, must be under\nthe terms of this License. You must inform recipients that the Source\nCode Form of the Covered Software is governed by the terms of this\nLicense, and how they can obtain a copy of this License. You may not\nattempt to alter or restrict the recipients' rights in the Source Code\nForm.\n\n3.2. Distribution of Executable Form\n\nIf You distribute Covered Software in Executable Form then:\n\n(a) such Covered Software must also be made available in Source Code\n    Form, as described in Section 3.1, and You must inform recipients of\n    the Executable Form how they can obtain a copy of such Source Code\n    Form by reasonable means in a timely manner, at a charge no more\n    than the cost of distribution to the recipient; and\n\n(b) You may distribute such Executable Form under the terms of this\n    License, or sublicense it under different terms, provided that the\n    license for the Executable Form does not attempt to limit or alter\n    the recipients' rights in the Source Code Form under this License.\n\n3.3. Distribution of a Larger Work\n\nYou may create and distribute a Larger Work under terms of Your choice,\nprovided that You also comply with the requirements of this License for\nthe Covered Software. If the Larger Work is a combination of Covered\nSoftware with a work governed by one or more Secondary Licenses, and the\nCovered Software is not Incompatible With Secondary Licenses, this\nLicense permits You to additionally distribute such Covered Software\nunder the terms of such Secondary License(s), so that the recipient of\nthe Larger Work may, at their option, further distribute the Covered\nSoftware under the terms of either this License or such Secondary\nLicense(s).\n\n3.4. Notices\n\nYou may not remove or alter the substance of any license notices\n(including copyright notices, patent notices, disclaimers of warranty,\nor limitations of liability) contained within the Source Code Form of\nthe Covered Software, except that You may alter any license notices to\nthe extent required to remedy known factual inaccuracies.\n\n3.5. Application of Additional Terms\n\nYou may choose to offer, and to charge a fee for, warranty, support,\nindemnity or liability obligations to one or more recipients of Covered\nSoftware. However, You may do so only on Your own behalf, and not on\nbehalf of any Contributor. You must make it absolutely clear that any\nsuch warranty, support, indemnity, or liability obligation is offered by\nYou alone, and You hereby agree to indemnify every Contributor for any\nliability incurred by such Contributor as a result of warranty, support,\nindemnity or liability terms You offer. You may include additional\ndisclaimers of warranty and limitations of liability specific to any\njurisdiction.\n\n4. Inability to Comply Due to Statute or Regulation\n---------------------------------------------------\n\nIf it is impossible for You to comply with any of the terms of this\nLicense with respect to some or all of the Covered Software due to\nstatute, judicial order, or regulation then You must: (a) comply with\nthe terms of this License to the maximum extent possible; and (b)\ndescribe the limitations and the code they affect. Such description must\nbe placed in a text file included with all distributions of the Covered\nSoftware under this License. Except to the extent prohibited by statute\nor regulation, such description must be sufficiently detailed for a\nrecipient of ordinary skill to be able to understand it.\n\n5. Termination\n--------------\n\n5.1. The rights granted under this License will terminate automatically\nif You fail to comply with any of its terms. However, if You become\ncompliant, then the rights granted under this License from a particular\nContributor are reinstated (a) provisionally, unless and until such\nContributor explicitly and finally terminates Your grants, and (b) on an\nongoing basis, if such Contributor fails to notify You of the\nnon-compliance by some reasonable means prior to 60 days after You have\ncome back into compliance. Moreover, Your grants from a particular\nContributor are reinstated on an ongoing basis if such Contributor\nnotifies You of the non-compliance by some reasonable means, this is the\nfirst time You have received notice of non-compliance with this License\nfrom such Contributor, and You become compliant prior to 30 days after\nYour receipt of the notice.\n\n5.2. If You initiate litigation against any entity by asserting a patent\ninfringement claim (excluding declaratory judgment actions,\ncounter-claims, and cross-claims) alleging that a Contributor Version\ndirectly or indirectly infringes any patent, then the rights granted to\nYou by any and all Contributors for the Covered Software under Section\n2.1 of this License shall terminate.\n\n5.3. In the event of termination under Sections 5.1 or 5.2 above, all\nend user license agreements (excluding distributors and resellers) which\nhave been validly granted by You or Your distributors under this License\nprior to termination shall survive termination.\n\n************************************************************************\n*                                                                      *\n*  6. Disclaimer of Warranty                                           *\n*  -------------------------                                           *\n*                                                                      *\n*  Covered Software is provided under this License on an \"as is\"       *\n*  basis, without warranty of any kind, either expressed, implied, or  *\n*  statutory, including, without limitation, warranties that the       *\n*  Covered Software is free of defects, merchantable, fit for a        *\n*  particular purpose or non-infringing. The entire risk as to the     *\n*  quality and performance of the Covered Software is with You.        *\n*  Should any Covered Software prove defective in any respect, You     *\n*  (not any Contributor) assume the cost of any necessary servicing,   *\n*  repair, or correction. This disclaimer of warranty constitutes an   *\n*  essential part of this License. No use of any Covered Software is   *\n*  authorized under this License except under this disclaimer.         *\n*                                                                      *\n************************************************************************\n\n************************************************************************\n*                                                                      *\n*  7. Limitation of Liability                                          *\n*  --------------------------                                          *\n*                                                                      *\n*  Under no circumstances and under no legal theory, whether tort      *\n*  (including negligence), contract, or otherwise, shall any           *\n*  Contributor, or anyone who distributes Covered Software as          *\n*  permitted above, be liable to You for any direct, indirect,         *\n*  special, incidental, or consequential damages of any character      *\n*  including, without limitation, damages for lost profits, loss of    *\n*  goodwill, work stoppage, computer failure or malfunction, or any    *\n*  and all other commercial damages or losses, even if such party      *\n*  shall have been informed of the possibility of such damages. This   *\n*  limitation of liability shall not apply to liability for death or   *\n*  personal injury resulting from such party's negligence to the       *\n*  extent applicable law prohibits such limitation. Some               *\n*  jurisdictions do not allow the exclusion or limitation of           *\n*  incidental or consequential damages, so this exclusion and          *\n*  limitation may not apply to You.                                    *\n*                                                                      *\n************************************************************************\n\n8. Litigation\n-------------\n\nAny litigation relating to this License may be brought only in the\ncourts of a jurisdiction where the defendant maintains its principal\nplace of business and such litigation shall be governed by laws of that\njurisdiction, without reference to its conflict-of-law provisions.\nNothing in this Section shall prevent a party's ability to bring\ncross-claims or counter-claims.\n\n9. Miscellaneous\n----------------\n\nThis License represents the complete agreement concerning the subject\nmatter hereof. If any provision of this License is held to be\nunenforceable, such provision shall be reformed only to the extent\nnecessary to make it enforceable. Any law or regulation which provides\nthat the language of a contract shall be construed against the drafter\nshall not be used to construe this License against a Contributor.\n\n10. Versions of the License\n---------------------------\n\n10.1. New Versions\n\nMozilla Foundation is the license steward. Except as provided in Section\n10.3, no one other than the license steward has the right to modify or\npublish new versions of this License. Each version will be given a\ndistinguishing version number.\n\n10.2. Effect of New Versions\n\nYou may distribute the Covered Software under the terms of the version\nof the License under which You originally received the Covered Software,\nor under the terms of any subsequent version published by the license\nsteward.\n\n10.3. Modified Versions\n\nIf you create software not governed by this License, and you want to\ncreate a new license for such software, you may create and use a\nmodified version of this License if you rename the license and remove\nany references to the name of the license steward (except to note that\nsuch modified license differs from this License).\n\n10.4. Distributing Source Code Form that is Incompatible With Secondary\nLicenses\n\nIf You choose to distribute Source Code Form that is Incompatible With\nSecondary Licenses under the terms of this version of the License, the\nnotice described in Exhibit B of this License must be attached.\n\nExhibit A - Source Code Form License Notice\n-------------------------------------------\n\n  This Source Code Form is subject to the terms of the Mozilla Public\n  License, v. 2.0. If a copy of the MPL was not distributed with this\n  file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\nIf it is not possible or desirable to put the notice in a particular\nfile, then You may include the notice in a location (such as a LICENSE\nfile in a relevant directory) where a recipient would be likely to look\nfor such a notice.\n\nYou may add additional accurate notices of copyright ownership.\n\nExhibit B - \"Incompatible With Secondary Licenses\" Notice\n---------------------------------------------------------\n\n  This Source Code Form is \"Incompatible With Secondary Licenses\", as\n  defined by the Mozilla Public License, v. 2.0.\n"
  },
  {
    "path": "libs/libigl/VERSION.txt",
    "content": "# This file should contain the current version number of libigl\n# World.Major.Minor\n# Anyone may increment Minor to indicate a small change.\n# Major indicates a large change or large number of changes (upload to website)\n# World indicates a substantial change or release\n1.2.1\n"
  },
  {
    "path": "libs/libigl/include/igl/AABB.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"AABB.h\"\n#include \"EPS.h\"\n#include \"barycenter.h\"\n#include \"barycentric_coordinates.h\"\n#include \"colon.h\"\n#include \"doublearea.h\"\n#include \"point_simplex_squared_distance.h\"\n#include \"project_to_line_segment.h\"\n#include \"sort.h\"\n#include \"volume.h\"\n#include \"ray_box_intersect.h\"\n#include \"ray_mesh_intersect.h\"\n#include <iostream>\n#include <iomanip>\n#include <limits>\n#include <list>\n#include <queue>\n#include <stack>\n\ntemplate <typename DerivedV, int DIM>\n  template <typename Derivedbb_mins, typename Derivedbb_maxs>\nIGL_INLINE void igl::AABB<DerivedV,DIM>::init(\n    const Eigen::PlainObjectBase<DerivedV> & V,\n    const Eigen::MatrixXi & Ele, \n    const Eigen::PlainObjectBase<Derivedbb_mins> & bb_mins,\n    const Eigen::PlainObjectBase<Derivedbb_maxs> & bb_maxs,\n    const Eigen::VectorXi & elements,\n    const int i)\n{\n  using namespace std;\n  using namespace Eigen;\n  deinit();\n  if(bb_mins.size() > 0)\n  {\n    assert(bb_mins.rows() == bb_maxs.rows() && \"Serial tree arrays must match\");\n    assert(bb_mins.cols() == V.cols() && \"Serial tree array dim must match V\");\n    assert(bb_mins.cols() == bb_maxs.cols() && \"Serial tree arrays must match\");\n    assert(bb_mins.rows() == elements.rows() &&\n        \"Serial tree arrays must match\");\n    // construct from serialization\n    m_box.extend(bb_mins.row(i).transpose());\n    m_box.extend(bb_maxs.row(i).transpose());\n    m_primitive = elements(i);\n    // Not leaf then recurse\n    if(m_primitive == -1)\n    {\n      m_left = new AABB();\n      m_left->init( V,Ele,bb_mins,bb_maxs,elements,2*i+1);\n      m_right = new AABB();\n      m_right->init( V,Ele,bb_mins,bb_maxs,elements,2*i+2);\n      //m_depth = std::max( m_left->m_depth, m_right->m_depth)+1;\n    }\n  }else\n  {\n    VectorXi allI = colon<int>(0,Ele.rows()-1);\n    MatrixXDIMS BC;\n    if(Ele.cols() == 1)\n    {\n      // points\n      BC = V;\n    }else\n    {\n      // Simplices\n      barycenter(V,Ele,BC);\n    }\n    MatrixXi SI(BC.rows(),BC.cols());\n    {\n      MatrixXDIMS _;\n      MatrixXi IS;\n      igl::sort(BC,1,true,_,IS);\n      // Need SI(i) to tell which place i would be sorted into\n      const int dim = IS.cols();\n      for(int i = 0;i<IS.rows();i++)\n      {\n        for(int d = 0;d<dim;d++)\n        {\n          SI(IS(i,d),d) = i;\n        }\n      }\n    }\n    init(V,Ele,SI,allI);\n  }\n}\n\n  template <typename DerivedV, int DIM>\nvoid igl::AABB<DerivedV,DIM>::init(\n    const Eigen::PlainObjectBase<DerivedV> & V,\n    const Eigen::MatrixXi & Ele)\n{\n  using namespace Eigen;\n  // deinit will be immediately called...\n  return init(V,Ele,MatrixXDIMS(),MatrixXDIMS(),VectorXi(),0);\n}\n\n  template <typename DerivedV, int DIM>\nIGL_INLINE void igl::AABB<DerivedV,DIM>::init(\n    const Eigen::PlainObjectBase<DerivedV> & V,\n    const Eigen::MatrixXi & Ele, \n    const Eigen::MatrixXi & SI,\n    const Eigen::VectorXi & I)\n{\n  using namespace Eigen;\n  using namespace std;\n  deinit();\n  if(V.size() == 0 || Ele.size() == 0 || I.size() == 0)\n  {\n    return;\n  }\n  assert(DIM == V.cols() && \"V.cols() should matched declared dimension\");\n  //const Scalar inf = numeric_limits<Scalar>::infinity();\n  m_box = AlignedBox<Scalar,DIM>();\n  // Compute bounding box\n  for(int i = 0;i<I.rows();i++)\n  {\n    for(int c = 0;c<Ele.cols();c++)\n    {\n      m_box.extend(V.row(Ele(I(i),c)).transpose());\n      m_box.extend(V.row(Ele(I(i),c)).transpose());\n    }\n  }\n  switch(I.size())\n  {\n    case 0:\n      {\n        assert(false);\n      }\n    case 1:\n      {\n        m_primitive = I(0);\n        break;\n      }\n    default:\n      {\n        // Compute longest direction\n        int max_d = -1;\n        m_box.diagonal().maxCoeff(&max_d);\n        // Can't use median on BC directly because many may have same value,\n        // but can use median on sorted BC indices\n        VectorXi SIdI(I.rows());\n        for(int i = 0;i<I.rows();i++)\n        {\n          SIdI(i) = SI(I(i),max_d);\n        }\n        // Since later I use <= I think I don't need to worry about odd/even\n        // Pass by copy to avoid changing input\n        const auto median = [](VectorXi A)->Scalar\n        {\n          size_t n = A.size()/2;\n          nth_element(A.data(),A.data()+n,A.data()+A.size());\n          if(A.rows() % 2 == 1)\n          {\n            return A(n);\n          }else\n          {\n            nth_element(A.data(),A.data()+n-1,A.data()+A.size());\n            return 0.5*(A(n)+A(n-1));\n          }\n        };\n        const Scalar med = median(SIdI);\n        VectorXi LI((I.rows()+1)/2),RI(I.rows()/2);\n        assert(LI.rows()+RI.rows() == I.rows());\n        // Distribute left and right\n        {\n          int li = 0;\n          int ri = 0;\n          for(int i = 0;i<I.rows();i++)\n          {\n            if(SIdI(i)<=med)\n            {\n              LI(li++) = I(i);\n            }else\n            {\n              RI(ri++) = I(i);\n            }\n          }\n        }\n        //m_depth = 0;\n        if(LI.rows()>0)\n        {\n          m_left = new AABB();\n          m_left->init(V,Ele,SI,LI);\n          //m_depth = std::max(m_depth, m_left->m_depth+1);\n        }\n        if(RI.rows()>0)\n        {\n          m_right = new AABB();\n          m_right->init(V,Ele,SI,RI);\n          //m_depth = std::max(m_depth, m_right->m_depth+1);\n        }\n      }\n  }\n}\n\ntemplate <typename DerivedV, int DIM>\nIGL_INLINE bool igl::AABB<DerivedV,DIM>::is_leaf() const\n{\n  return m_primitive != -1;\n}\n\ntemplate <typename DerivedV, int DIM>\ntemplate <typename Derivedq>\nIGL_INLINE std::vector<int> igl::AABB<DerivedV,DIM>::find(\n    const Eigen::PlainObjectBase<DerivedV> & V,\n    const Eigen::MatrixXi & Ele, \n    const Eigen::PlainObjectBase<Derivedq> & q,\n    const bool first) const\n{\n  using namespace std;\n  using namespace Eigen;\n  assert(q.size() == DIM && \n      \"Query dimension should match aabb dimension\");\n  assert(Ele.cols() == V.cols()+1 && \n      \"AABB::find only makes sense for (d+1)-simplices\");\n  const Scalar epsilon = igl::EPS<Scalar>();\n  // Check if outside bounding box\n  bool inside = m_box.contains(q.transpose());\n  if(!inside)\n  {\n    return std::vector<int>();\n  }\n  assert(m_primitive==-1 || (m_left == NULL && m_right == NULL));\n  if(is_leaf())\n  {\n    // Initialize to some value > -epsilon\n    Scalar a1=0,a2=0,a3=0,a4=0;\n    switch(DIM)\n    {\n      case 3:\n        {\n          // Barycentric coordinates\n          typedef Eigen::Matrix<Scalar,1,3> RowVector3S;\n          const RowVector3S V1 = V.row(Ele(m_primitive,0));\n          const RowVector3S V2 = V.row(Ele(m_primitive,1));\n          const RowVector3S V3 = V.row(Ele(m_primitive,2));\n          const RowVector3S V4 = V.row(Ele(m_primitive,3));\n          a1 = volume_single(V2,V4,V3,(RowVector3S)q);\n          a2 = volume_single(V1,V3,V4,(RowVector3S)q);\n          a3 = volume_single(V1,V4,V2,(RowVector3S)q);\n          a4 = volume_single(V1,V2,V3,(RowVector3S)q);\n          break;\n        }\n      case 2:\n        {\n          // Barycentric coordinates\n          typedef Eigen::Matrix<Scalar,2,1> Vector2S;\n          const Vector2S V1 = V.row(Ele(m_primitive,0));\n          const Vector2S V2 = V.row(Ele(m_primitive,1));\n          const Vector2S V3 = V.row(Ele(m_primitive,2));\n          // Hack for now to keep templates simple. If becomes bottleneck\n          // consider using std::enable_if_t \n          const Vector2S q2 = q.head(2);\n          a1 = doublearea_single(V1,V2,q2);\n          a2 = doublearea_single(V2,V3,q2);\n          a3 = doublearea_single(V3,V1,q2);\n          break;\n        }\n      default:assert(false);\n    }\n    // Normalization is important for correcting sign\n    Scalar sum = a1+a2+a3+a4;\n    a1 /= sum;\n    a2 /= sum;\n    a3 /= sum;\n    a4 /= sum;\n    if(\n        a1>=-epsilon && \n        a2>=-epsilon && \n        a3>=-epsilon && \n        a4>=-epsilon)\n    {\n      return std::vector<int>(1,m_primitive);\n    }else\n    {\n      return std::vector<int>();\n    }\n  }\n  std::vector<int> left = m_left->find(V,Ele,q,first);\n  if(first && !left.empty())\n  {\n    return left;\n  }\n  std::vector<int> right = m_right->find(V,Ele,q,first);\n  if(first)\n  {\n    return right;\n  }\n  left.insert(left.end(),right.begin(),right.end());\n  return left;\n}\n\ntemplate <typename DerivedV, int DIM>\nIGL_INLINE int igl::AABB<DerivedV,DIM>::subtree_size() const\n{\n  // 1 for self\n  int n = 1;\n  int n_left = 0,n_right = 0;\n  if(m_left != NULL)\n  {\n    n_left = m_left->subtree_size();\n  }\n  if(m_right != NULL)\n  {\n    n_right = m_right->subtree_size();\n  }\n  n += 2*std::max(n_left,n_right);\n  return n;\n}\n\n\ntemplate <typename DerivedV, int DIM>\ntemplate <typename Derivedbb_mins, typename Derivedbb_maxs>\nIGL_INLINE void igl::AABB<DerivedV,DIM>::serialize(\n    Eigen::PlainObjectBase<Derivedbb_mins> & bb_mins,\n    Eigen::PlainObjectBase<Derivedbb_maxs> & bb_maxs,\n    Eigen::VectorXi & elements,\n    const int i) const\n{\n  using namespace std;\n  using namespace Eigen;\n  // Calling for root then resize output\n  if(i==0)\n  {\n    const int m = subtree_size();\n    //cout<<\"m: \"<<m<<endl;\n    bb_mins.resize(m,DIM);\n    bb_maxs.resize(m,DIM);\n    elements.resize(m,1);\n  }\n  //cout<<i<<\" \";\n  bb_mins.row(i) = m_box.min();\n  bb_maxs.row(i) = m_box.max();\n  elements(i) = m_primitive;\n  if(m_left != NULL)\n  {\n    m_left->serialize(bb_mins,bb_maxs,elements,2*i+1);\n  }\n  if(m_right != NULL)\n  {\n    m_right->serialize(bb_mins,bb_maxs,elements,2*i+2);\n  }\n}\n\ntemplate <typename DerivedV, int DIM>\nIGL_INLINE typename igl::AABB<DerivedV,DIM>::Scalar \nigl::AABB<DerivedV,DIM>::squared_distance(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::MatrixXi & Ele, \n  const RowVectorDIMS & p,\n  int & i,\n  RowVectorDIMS & c) const\n{\n  return squared_distance(V,Ele,p,std::numeric_limits<Scalar>::infinity(),i,c);\n}\n\n\ntemplate <typename DerivedV, int DIM>\nIGL_INLINE typename igl::AABB<DerivedV,DIM>::Scalar \nigl::AABB<DerivedV,DIM>::squared_distance(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::MatrixXi & Ele, \n  const RowVectorDIMS & p,\n  Scalar min_sqr_d,\n  int & i,\n  RowVectorDIMS & c) const\n{\n  using namespace Eigen;\n  using namespace std;\n  Scalar sqr_d = min_sqr_d;\n  //assert(DIM == 3 && \"Code has only been tested for DIM == 3\");\n  assert((Ele.cols() == 3 || Ele.cols() == 2 || Ele.cols() == 1)\n    && \"Code has only been tested for simplex sizes 3,2,1\");\n\n  assert(m_primitive==-1 || (m_left == NULL && m_right == NULL));\n  if(is_leaf())\n  {\n    leaf_squared_distance(V,Ele,p,sqr_d,i,c);\n  }else\n  {\n    bool looked_left = false;\n    bool looked_right = false;\n    const auto & look_left = [&]()\n    {\n      int i_left;\n      RowVectorDIMS c_left = c;\n      Scalar sqr_d_left = m_left->squared_distance(V,Ele,p,sqr_d,i_left,c_left);\n      this->set_min(p,sqr_d_left,i_left,c_left,sqr_d,i,c);\n      looked_left = true;\n    };\n    const auto & look_right = [&]()\n    {\n      int i_right;\n      RowVectorDIMS c_right = c;\n      Scalar sqr_d_right = \n        m_right->squared_distance(V,Ele,p,sqr_d,i_right,c_right);\n      this->set_min(p,sqr_d_right,i_right,c_right,sqr_d,i,c);\n      looked_right = true;\n    };\n\n    // must look left or right if in box\n    if(m_left->m_box.contains(p.transpose()))\n    {\n      look_left();\n    }\n    if(m_right->m_box.contains(p.transpose()))\n    {\n      look_right();\n    }\n    // if haven't looked left and could be less than current min, then look\n    Scalar left_min_sqr_d = \n      m_left->m_box.squaredExteriorDistance(p.transpose());\n    Scalar right_min_sqr_d = \n      m_right->m_box.squaredExteriorDistance(p.transpose());\n    if(left_min_sqr_d < right_min_sqr_d)\n    {\n      if(!looked_left && left_min_sqr_d<sqr_d)\n      {\n        look_left();\n      }\n      if( !looked_right && right_min_sqr_d<sqr_d)\n      {\n        look_right();\n      }\n    }else\n    {\n      if( !looked_right && right_min_sqr_d<sqr_d)\n      {\n        look_right();\n      }\n      if(!looked_left && left_min_sqr_d<sqr_d)\n      {\n        look_left();\n      }\n    }\n  }\n  return sqr_d;\n}\n\ntemplate <typename DerivedV, int DIM>\ntemplate <\n  typename DerivedP, \n  typename DerivedsqrD, \n  typename DerivedI, \n  typename DerivedC>\nIGL_INLINE void igl::AABB<DerivedV,DIM>::squared_distance(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::MatrixXi & Ele, \n  const Eigen::PlainObjectBase<DerivedP> & P,\n  Eigen::PlainObjectBase<DerivedsqrD> & sqrD,\n  Eigen::PlainObjectBase<DerivedI> & I,\n  Eigen::PlainObjectBase<DerivedC> & C) const\n{\n  assert(P.cols() == V.cols() && \"cols in P should match dim of cols in V\");\n  sqrD.resize(P.rows(),1);\n  I.resize(P.rows(),1);\n  C.resizeLike(P);\n  // O( #P * log #Ele ), where log #Ele is really the depth of this AABB\n  // hierarchy\n  for(int p = 0;p<P.rows();p++)\n  {\n    RowVectorDIMS Pp = P.row(p), c;\n    int Ip;\n    sqrD(p) = squared_distance(V,Ele,Pp,Ip,c);\n    I(p) = Ip;\n    C.row(p).head(DIM) = c;\n  }\n}\n\ntemplate <typename DerivedV, int DIM>\ntemplate < \n  typename Derivedother_V,\n  typename DerivedsqrD, \n  typename DerivedI, \n  typename DerivedC>\nIGL_INLINE void igl::AABB<DerivedV,DIM>::squared_distance(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::MatrixXi & Ele, \n  const AABB<Derivedother_V,DIM> & other,\n  const Eigen::PlainObjectBase<Derivedother_V> & other_V,\n  const Eigen::MatrixXi & other_Ele, \n  Eigen::PlainObjectBase<DerivedsqrD> & sqrD,\n  Eigen::PlainObjectBase<DerivedI> & I,\n  Eigen::PlainObjectBase<DerivedC> & C) const\n{\n  assert(other_Ele.cols() == 1 && \n    \"Only implemented for other as list of points\");\n  assert(other_V.cols() == V.cols() && \"other must match this dimension\");\n  sqrD.setConstant(other_Ele.rows(),1,std::numeric_limits<double>::infinity());\n  I.resize(other_Ele.rows(),1);\n  C.resize(other_Ele.rows(),other_V.cols());\n  // All points in other_V currently think they need to check against root of\n  // this. The point of using another AABB is to quickly prune chunks of\n  // other_V so that most points just check some subtree of this.\n\n  // This holds a conservative estimate of max(sqr_D) where sqr_D is the\n  // current best minimum squared distance for all points in this subtree\n  double min_sqr_d = std::numeric_limits<double>::infinity();\n  squared_distance_helper(\n    V,Ele,&other,other_V,other_Ele,min_sqr_d,sqrD,I,C);\n}\n\ntemplate <typename DerivedV, int DIM>\ntemplate < \n  typename Derivedother_V,\n  typename DerivedsqrD, \n  typename DerivedI, \n  typename DerivedC>\nIGL_INLINE typename igl::AABB<DerivedV,DIM>::Scalar \n  igl::AABB<DerivedV,DIM>::squared_distance_helper(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::MatrixXi & Ele, \n  const AABB<Derivedother_V,DIM> * other,\n  const Eigen::PlainObjectBase<Derivedother_V> & other_V,\n  const Eigen::MatrixXi & other_Ele, \n  const Scalar /*min_sqr_d*/,\n  Eigen::PlainObjectBase<DerivedsqrD> & sqrD,\n  Eigen::PlainObjectBase<DerivedI> & I,\n  Eigen::PlainObjectBase<DerivedC> & C) const\n{\n  using namespace std;\n  using namespace Eigen;\n\n  // This implementation is a bit disappointing. There's no major speed up. Any\n  // performance gains seem to come from accidental cache coherency and\n  // diminish for larger \"other\" (the opposite of what was intended).\n\n  // Base case\n  if(other->is_leaf() && this->is_leaf())\n  {\n    Scalar sqr_d = sqrD(other->m_primitive);\n    int i = I(other->m_primitive);\n    RowVectorDIMS c = C.row(      other->m_primitive);\n    RowVectorDIMS p = other_V.row(other->m_primitive);\n    leaf_squared_distance(V,Ele,p,sqr_d,i,c);\n    sqrD( other->m_primitive) = sqr_d;\n    I(    other->m_primitive) = i;\n    C.row(other->m_primitive) = c;\n    //cout<<\"leaf: \"<<sqr_d<<endl;\n    //other->m_max_sqr_d = sqr_d;\n    return sqr_d;\n  }\n\n  if(other->is_leaf())\n  {\n    Scalar sqr_d = sqrD(other->m_primitive);\n    int i = I(other->m_primitive);\n    RowVectorDIMS c = C.row(      other->m_primitive);\n    RowVectorDIMS p = other_V.row(other->m_primitive);\n    sqr_d = squared_distance(V,Ele,p,sqr_d,i,c);\n    sqrD( other->m_primitive) = sqr_d;\n    I(    other->m_primitive) = i;\n    C.row(other->m_primitive) = c;\n    //other->m_max_sqr_d = sqr_d;\n    return sqr_d;\n  }\n\n  //// Exact minimum squared distance between arbitary primitives inside this and\n  //// othre's bounding boxes\n  //const auto & min_squared_distance = [&](\n  //  const AABB<DerivedV,DIM> * A,\n  //  const AABB<Derivedother_V,DIM> * B)->Scalar\n  //{\n  //  return A->m_box.squaredExteriorDistance(B->m_box);\n  //};\n\n  if(this->is_leaf())\n  {\n    //if(min_squared_distance(this,other) < other->m_max_sqr_d)\n    if(true)\n    {\n      this->squared_distance_helper(\n        V,Ele,other->m_left,other_V,other_Ele,0,sqrD,I,C);\n      this->squared_distance_helper(\n        V,Ele,other->m_right,other_V,other_Ele,0,sqrD,I,C);\n    }else\n    {\n      // This is never reached...\n    }\n    //// we know other is not a leaf\n    //other->m_max_sqr_d = std::max(other->m_left->m_max_sqr_d,other->m_right->m_max_sqr_d);\n    return 0;\n  }\n\n  // FORCE DOWN TO OTHER LEAF EVAL\n  //if(min_squared_distance(this,other) < other->m_max_sqr_d)\n  if(true)\n  {\n    if(true)\n    {\n      this->squared_distance_helper(\n        V,Ele,other->m_left,other_V,other_Ele,0,sqrD,I,C);\n      this->squared_distance_helper(\n        V,Ele,other->m_right,other_V,other_Ele,0,sqrD,I,C);\n    }else // this direction never seems to be faster\n    {\n      this->m_left->squared_distance_helper(\n        V,Ele,other,other_V,other_Ele,0,sqrD,I,C);\n      this->m_right->squared_distance_helper(\n        V,Ele,other,other_V,other_Ele,0,sqrD,I,C);\n    }\n  }else\n  {\n    // this is never reached ... :-(\n  }\n  //// we know other is not a leaf\n  //other->m_max_sqr_d = std::max(other->m_left->m_max_sqr_d,other->m_right->m_max_sqr_d);\n\n  return 0;\n#if 0 // False\n\n  // _Very_ conservative approximation of maximum squared distance between\n  // primitives inside this and other's bounding boxes\n  const auto & max_squared_distance = [](\n    const AABB<DerivedV,DIM> * A,\n    const AABB<Derivedother_V,DIM> * B)->Scalar\n  {\n    AlignedBox<Scalar,DIM> combo = A->m_box;\n    combo.extend(B->m_box);\n    return combo.diagonal().squaredNorm();\n  };\n\n  //// other base-case\n  //if(other->is_leaf())\n  //{\n  //  double sqr_d = sqrD(other->m_primitive);\n  //  int i = I(other->m_primitive);\n  //  RowVectorDIMS c = C.row(m_primitive);\n  //  RowVectorDIMS p = other_V.row(m_primitive);\n  //  leaf_squared_distance(V,Ele,p,sqr_d,i,c);\n  //  sqrD(other->m_primitive) = sqr_d;\n  //  I(other->m_primitive) = i;\n  //  C.row(m_primitive) = c;\n  //  return;\n  //}\n  std::vector<const AABB<DerivedV,DIM> * > this_list;\n  if(this->is_leaf())\n  {\n    this_list.push_back(this);\n  }else\n  {\n    assert(this->m_left);\n    this_list.push_back(this->m_left);\n    assert(this->m_right);\n    this_list.push_back(this->m_right);\n  }\n  std::vector<AABB<Derivedother_V,DIM> *> other_list;\n  if(other->is_leaf())\n  {\n    other_list.push_back(other);\n  }else\n  {\n    assert(other->m_left);\n    other_list.push_back(other->m_left);\n    assert(other->m_right);\n    other_list.push_back(other->m_right);\n  }\n\n  //const std::function<Scalar(\n  //  const AABB<Derivedother_V,DIM> * other)\n  //    > max_sqr_d = [&sqrD,&max_sqr_d](const AABB<Derivedother_V,DIM> * other)->Scalar\n  //  {\n  //    if(other->is_leaf())\n  //    {\n  //      return sqrD(other->m_primitive);\n  //    }else\n  //    {\n  //      return std::max(max_sqr_d(other->m_left),max_sqr_d(other->m_right));\n  //    }\n  //  };\n\n  //// Potentially recurse on all pairs, if minimum distance is less than running\n  //// bound\n  //Eigen::Matrix<Scalar,Eigen::Dynamic,1> other_max_sqr_d =\n  //  Eigen::Matrix<Scalar,Eigen::Dynamic,1>::Constant(other_list.size(),1,min_sqr_d);\n  for(size_t child = 0;child<other_list.size();child++)\n  {\n    auto other_tree = other_list[child];\n\n    Eigen::Matrix<Scalar,Eigen::Dynamic,1> this_max_sqr_d(this_list.size(),1);\n    for(size_t t = 0;t<this_list.size();t++)\n    {\n      const auto this_tree = this_list[t];\n      this_max_sqr_d(t) = max_squared_distance(this_tree,other_tree);\n    }\n    if(this_list.size() ==2 &&\n      ( this_max_sqr_d(0) > this_max_sqr_d(1))\n      )\n    {\n      std::swap(this_list[0],this_list[1]);\n      //std::swap(this_max_sqr_d(0),this_max_sqr_d(1));\n    }\n    const Scalar sqr_d = this_max_sqr_d.minCoeff();\n\n\n    for(size_t t = 0;t<this_list.size();t++)\n    {\n      const auto this_tree = this_list[t];\n\n      //const auto mm = max_sqr_d(other_tree);\n      //const Scalar mc = other_max_sqr_d(child);\n      //assert(mc == mm);\n      // Only look left/right in this_list if can possible decrease somebody's\n      // distance in this_tree.\n      const Scalar min_this_other = min_squared_distance(this_tree,other_tree); \n      if(\n          min_this_other < sqr_d && \n          min_this_other < other_tree->m_max_sqr_d)\n      {\n        //cout<<\"before: \"<<other_max_sqr_d(child)<<endl;\n        //other_max_sqr_d(child) = std::min(\n        //  other_max_sqr_d(child),\n        //  this_tree->squared_distance_helper(\n        //    V,Ele,other_tree,other_V,other_Ele,other_max_sqr_d(child),sqrD,I,C));\n        //cout<<\"after: \"<<other_max_sqr_d(child)<<endl;\n          this_tree->squared_distance_helper(\n            V,Ele,other_tree,other_V,other_Ele,0,sqrD,I,C);\n      }\n    }\n  }\n  //const Scalar ret = other_max_sqr_d.maxCoeff();\n  //const auto mm = max_sqr_d(other);\n  //assert(mm == ret);\n  //cout<<\"non-leaf: \"<<ret<<endl;\n  //return ret;\n  if(!other->is_leaf())\n  {\n    other->m_max_sqr_d = std::max(other->m_left->m_max_sqr_d,other->m_right->m_max_sqr_d);\n  }\n  return 0;\n#endif\n}\n\ntemplate <typename DerivedV, int DIM>\nIGL_INLINE void igl::AABB<DerivedV,DIM>::leaf_squared_distance(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::MatrixXi & Ele, \n  const RowVectorDIMS & p,\n  Scalar & sqr_d,\n  int & i,\n  RowVectorDIMS & c) const\n{\n  using namespace Eigen;\n  using namespace std;\n  RowVectorDIMS c_candidate;\n  Scalar sqr_d_candidate;\n  igl::point_simplex_squared_distance<DIM>(\n    p,V,Ele,m_primitive,sqr_d_candidate,c_candidate);\n  set_min(p,sqr_d_candidate,m_primitive,c_candidate,sqr_d,i,c);\n}\n\n\ntemplate <typename DerivedV, int DIM>\nIGL_INLINE void igl::AABB<DerivedV,DIM>::set_min(\n  const RowVectorDIMS & \n#ifndef NDEBUG\n  p\n#endif\n  ,\n  const Scalar sqr_d_candidate,\n  const int i_candidate,\n  const RowVectorDIMS & c_candidate,\n  Scalar & sqr_d,\n  int & i,\n  RowVectorDIMS & c) const\n{\n#ifndef NDEBUG\n  //std::cout<<matlab_format(c_candidate,\"c_candidate\")<<std::endl;\n  const Scalar pc_norm = (p-c_candidate).squaredNorm();\n  const Scalar diff = fabs(sqr_d_candidate - pc_norm);\n  assert(diff<=1e-10 && \"distance should match norm of difference\");\n#endif\n  if(sqr_d_candidate < sqr_d)\n  {\n    i = i_candidate;\n    c = c_candidate;\n    sqr_d = sqr_d_candidate;\n  }\n}\n\n\ntemplate <typename DerivedV, int DIM>\nIGL_INLINE bool \nigl::AABB<DerivedV,DIM>::intersect_ray(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::MatrixXi & Ele, \n  const RowVectorDIMS & origin,\n  const RowVectorDIMS & dir,\n  std::vector<igl::Hit> & hits) const\n{\n  hits.clear();\n  const Scalar t0 = 0;\n  const Scalar t1 = std::numeric_limits<Scalar>::infinity();\n  {\n    Scalar _1,_2;\n    if(!ray_box_intersect(origin,dir,m_box,t0,t1,_1,_2))\n    {\n      return false;\n    }\n  }\n  if(this->is_leaf())\n  {\n    // Actually process elements\n    assert((Ele.size() == 0 || Ele.cols() == 3) && \"Elements should be triangles\");\n    // Cheesecake way of hitting element\n    bool ret = ray_mesh_intersect(origin,dir,V,Ele.row(m_primitive),hits);\n    // Since we only gave ray_mesh_intersect a single face, it will have set\n    // any hits to id=0. Set these to this primitive's id\n    for(auto & hit : hits)\n    {\n      hit.id = m_primitive;\n    }\n    return ret;\n  }\n  std::vector<igl::Hit> left_hits;\n  std::vector<igl::Hit> right_hits;\n  const bool left_ret = m_left->intersect_ray(V,Ele,origin,dir,left_hits);\n  const bool right_ret = m_right->intersect_ray(V,Ele,origin,dir,right_hits);\n  hits.insert(hits.end(),left_hits.begin(),left_hits.end());\n  hits.insert(hits.end(),right_hits.begin(),right_hits.end());\n  return left_ret || right_ret;\n}\n\ntemplate <typename DerivedV, int DIM>\nIGL_INLINE bool \nigl::AABB<DerivedV,DIM>::intersect_ray(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::MatrixXi & Ele, \n  const RowVectorDIMS & origin,\n  const RowVectorDIMS & dir,\n  igl::Hit & hit) const\n{\n#if false\n  // BFS\n  std::queue<const AABB *> Q;\n  // Or DFS\n  //std::stack<const AABB *> Q;\n  Q.push(this);\n  bool any_hit = false;\n  hit.t = std::numeric_limits<Scalar>::infinity();\n  while(!Q.empty())\n  {\n    const AABB * tree = Q.front();\n    //const AABB * tree = Q.top();\n    Q.pop();\n    {\n      Scalar _1,_2;\n      if(!ray_box_intersect(\n        origin,dir,tree->m_box,Scalar(0),Scalar(hit.t),_1,_2))\n      {\n        continue;\n      }\n    }\n    if(tree->is_leaf())\n    {\n      // Actually process elements\n      assert((Ele.size() == 0 || Ele.cols() == 3) && \"Elements should be triangles\");\n      igl::Hit leaf_hit;\n      if(\n        ray_mesh_intersect(origin,dir,V,Ele.row(tree->m_primitive),leaf_hit)&&\n        leaf_hit.t < hit.t)\n      {\n        // correct the id\n        leaf_hit.id = tree->m_primitive;\n        hit = leaf_hit;\n      }\n      continue;\n    }\n    // Add children to queue\n    Q.push(tree->m_left);\n    Q.push(tree->m_right);\n  }\n  return any_hit;\n#else\n  // DFS\n  return intersect_ray(\n    V,Ele,origin,dir,std::numeric_limits<Scalar>::infinity(),hit);\n#endif\n}\n\ntemplate <typename DerivedV, int DIM>\nIGL_INLINE bool \nigl::AABB<DerivedV,DIM>::intersect_ray(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::MatrixXi & Ele, \n  const RowVectorDIMS & origin,\n  const RowVectorDIMS & dir,\n  const Scalar _min_t,\n  igl::Hit & hit) const\n{\n  //// Naive, slow\n  //std::vector<igl::Hit> hits;\n  //intersect_ray(V,Ele,origin,dir,hits);\n  //if(hits.size() > 0)\n  //{\n  //  hit = hits.front();\n  //  return true;\n  //}else\n  //{\n  //  return false;\n  //}\n  Scalar min_t = _min_t;\n  const Scalar t0 = 0;\n  {\n    Scalar _1,_2;\n    if(!ray_box_intersect(origin,dir,m_box,t0,min_t,_1,_2))\n    {\n      return false;\n    }\n  }\n  if(this->is_leaf())\n  {\n    // Actually process elements\n    assert((Ele.size() == 0 || Ele.cols() == 3) && \"Elements should be triangles\");\n    // Cheesecake way of hitting element\n    bool ret = ray_mesh_intersect(origin,dir,V,Ele.row(m_primitive),hit);\n    hit.id = m_primitive;\n    return ret;\n  }\n\n  // Doesn't seem like smartly choosing left before/after right makes a\n  // differnce\n  igl::Hit left_hit;\n  igl::Hit right_hit;\n  bool left_ret = m_left->intersect_ray(V,Ele,origin,dir,min_t,left_hit);\n  if(left_ret && left_hit.t<min_t)\n  {\n    // It's scary that this line doesn't seem to matter....\n    min_t = left_hit.t;\n    hit = left_hit;\n    left_ret = true;\n  }else\n  {\n    left_ret = false;\n  }\n  bool right_ret = m_right->intersect_ray(V,Ele,origin,dir,min_t,right_hit);\n  if(right_ret && right_hit.t<min_t)\n  {\n    min_t = right_hit.t;\n    hit = right_hit;\n    right_ret = true;\n  }else\n  {\n    right_ret = false;\n  }\n  return left_ret || right_ret;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 3>::squared_distance<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&) const;\n// generated by autoexplicit.sh\ntemplate void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 3>::squared_distance<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&) const;\n// generated by autoexplicit.sh\ntemplate void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 2>::squared_distance<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&) const;\n// generated by autoexplicit.sh\ntemplate void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 3>::init(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&);\ntemplate void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 2>::init(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&);\ntemplate void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 3>::squared_distance<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&) const;\ntemplate void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 2>::squared_distance<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&) const;\ntemplate double igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 3>::squared_distance(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, Eigen::Matrix<double, 1, 3, 1, 1, 3> const&, int&, Eigen::Matrix<double, 1, 3, 1, 1, 3>&) const;\ntemplate double igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 2>::squared_distance(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, Eigen::Matrix<double, 1, 2, 1, 1, 2> const&, int&, Eigen::Matrix<double, 1, 2, 1, 1, 2>&) const;\ntemplate void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 2>::squared_distance<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&) const;\ntemplate void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 3>::squared_distance<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&) const;\ntemplate void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 2>::init<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, int);\ntemplate void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 3>::init<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, int);\ntemplate std::vector<int, std::allocator<int> > igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 2>::find<Eigen::Matrix<double, 1, -1, 1, 1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, -1, 1, 1, -1> > const&, bool) const;\ntemplate void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 2>::serialize<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::Matrix<int, -1, 1, 0, -1, 1>&, int) const;\ntemplate std::vector<int, std::allocator<int> > igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 3>::find<Eigen::Matrix<double, 1, -1, 1, 1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, -1, 1, 1, -1> > const&, bool) const;\ntemplate void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 3>::serialize<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::Matrix<int, -1, 1, 0, -1, 1>&, int) const;\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/AABB.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_AABB_H\n#define IGL_AABB_H\n\n#include \"Hit.h\"\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <Eigen/Geometry>\n#include <vector>\nnamespace igl\n{\n  // Implementation of semi-general purpose axis-aligned bounding box hierarchy.\n  // The mesh (V,Ele) is stored and managed by the caller and each routine here\n  // simply takes it as references (it better not change between calls).\n  //\n  // It's a little annoying that the Dimension is a template parameter and not\n  // picked up at run time from V. This leads to duplicated code for 2d/3d (up to\n  // dim).\n  template <typename DerivedV, int DIM>\n    class AABB \n    {\npublic:\n      typedef typename DerivedV::Scalar Scalar;\n      typedef Eigen::Matrix<Scalar,1,DIM> RowVectorDIMS;\n      typedef Eigen::Matrix<Scalar,DIM,1> VectorDIMS;\n      typedef Eigen::Matrix<Scalar,Eigen::Dynamic,DIM> MatrixXDIMS;\n      // Shared pointers are slower...\n      AABB * m_left;\n      AABB * m_right;\n      Eigen::AlignedBox<Scalar,DIM> m_box;\n      // -1 non-leaf\n      int m_primitive;\n      //Scalar m_max_sqr_d;\n      //int m_depth;\n      AABB():\n        m_left(NULL), m_right(NULL),\n        m_box(), m_primitive(-1)\n        //m_max_sqr_d(std::numeric_limits<double>::infinity()),\n        //m_depth(0)\n    {}\n      // http://stackoverflow.com/a/3279550/148668\n      AABB(const AABB& other):\n        m_left(other.m_left ? new AABB(*other.m_left) : NULL),\n        m_right(other.m_right ? new AABB(*other.m_right) : NULL),\n        m_box(other.m_box),\n        m_primitive(other.m_primitive)\n        //m_max_sqr_d(other.m_max_sqr_d),\n        //m_depth(std::max(\n        //   m_left ? m_left->m_depth + 1 : 0,\n        //   m_right ? m_right->m_depth + 1 : 0))\n        {\n        }\n      // copy-swap idiom\n      friend void swap(AABB& first, AABB& second)\n      {\n        // Enable ADL\n        using std::swap;\n        swap(first.m_left,second.m_left);\n        swap(first.m_right,second.m_right);\n        swap(first.m_box,second.m_box);\n        swap(first.m_primitive,second.m_primitive);\n        //swap(first.m_max_sqr_d,second.m_max_sqr_d);\n        //swap(first.m_depth,second.m_depth);\n      }\n      // Pass-by-value (aka copy)\n      AABB& operator=(AABB other)\n      {\n        swap(*this,other);\n        return *this;\n      }\n      AABB(AABB&& other):\n        // initialize via default constructor\n        AABB() \n      {\n        swap(*this,other);\n      }\n      // Seems like there should have been an elegant solution to this using\n      // the copy-swap idiom above:\n      IGL_INLINE void deinit()\n      {\n        m_primitive = -1;\n        m_box = Eigen::AlignedBox<Scalar,DIM>();\n        delete m_left;\n        m_left = NULL;\n        delete m_right;\n        m_right = NULL;\n      }\n      ~AABB()\n      {\n        deinit();\n      }\n      // Build an Axis-Aligned Bounding Box tree for a given mesh and given\n      // serialization of a previous AABB tree.\n      //\n      // Inputs:\n      //   V  #V by dim list of mesh vertex positions. \n      //   Ele  #Ele by dim+1 list of mesh indices into #V. \n      //   bb_mins  max_tree by dim list of bounding box min corner positions\n      //   bb_maxs  max_tree by dim list of bounding box max corner positions\n      //   elements  max_tree list of element or (not leaf id) indices into Ele\n      //   i  recursive call index {0}\n      template <typename Derivedbb_mins, typename Derivedbb_maxs>\n        IGL_INLINE void init(\n            const Eigen::PlainObjectBase<DerivedV> & V,\n            const Eigen::MatrixXi & Ele, \n            const Eigen::PlainObjectBase<Derivedbb_mins> & bb_mins,\n            const Eigen::PlainObjectBase<Derivedbb_maxs> & bb_maxs,\n            const Eigen::VectorXi & elements,\n            const int i = 0);\n      // Wrapper for root with empty serialization\n      IGL_INLINE void init(\n          const Eigen::PlainObjectBase<DerivedV> & V,\n          const Eigen::MatrixXi & Ele);\n      // Build an Axis-Aligned Bounding Box tree for a given mesh.\n      //\n      // Inputs:\n      //   V  #V by dim list of mesh vertex positions. \n      //   Ele  #Ele by dim+1 list of mesh indices into #V. \n      //   SI  #Ele by dim list revealing for each coordinate where Ele's\n      //     barycenters would be sorted: SI(e,d) = i --> the dth coordinate of\n      //     the barycenter of the eth element would be placed at position i in a\n      //     sorted list.\n      //   I  #I list of indices into Ele of elements to include (for recursive\n      //     calls)\n      // \n      IGL_INLINE void init(\n          const Eigen::PlainObjectBase<DerivedV> & V,\n          const Eigen::MatrixXi & Ele, \n          const Eigen::MatrixXi & SI,\n          const Eigen::VectorXi & I);\n      // Return whether at leaf node\n      IGL_INLINE bool is_leaf() const;\n      // Find the indices of elements containing given point: this makes sense\n      // when Ele is a co-dimension 0 simplex (tets in 3D, triangles in 2D).\n      //\n      // Inputs:\n      //   V  #V by dim list of mesh vertex positions. **Should be same as used to\n      //     construct mesh.**\n      //   Ele  #Ele by dim+1 list of mesh indices into #V. **Should be same as used to\n      //     construct mesh.**\n      //   q  dim row-vector query position\n      //   first  whether to only return first element containing q\n      // Returns:\n      //   list of indices of elements containing q\n      template <typename Derivedq>\n      IGL_INLINE std::vector<int> find(\n          const Eigen::PlainObjectBase<DerivedV> & V,\n          const Eigen::MatrixXi & Ele, \n          const Eigen::PlainObjectBase<Derivedq> & q,\n          const bool first=false) const;\n\n      // If number of elements m then total tree size should be 2*h where h is\n      // the deepest depth 2^ceil(log(#Ele*2-1))\n      IGL_INLINE int subtree_size() const;\n\n      // Serialize this class into 3 arrays (so we can pass it pack to matlab)\n      //\n      // Outputs:\n      //   bb_mins  max_tree by dim list of bounding box min corner positions\n      //   bb_maxs  max_tree by dim list of bounding box max corner positions\n      //   elements  max_tree list of element or (not leaf id) indices into Ele\n      //   i  recursive call index into these arrays {0}\n      template <typename Derivedbb_mins, typename Derivedbb_maxs>\n        IGL_INLINE void serialize(\n            Eigen::PlainObjectBase<Derivedbb_mins> & bb_mins,\n            Eigen::PlainObjectBase<Derivedbb_maxs> & bb_maxs,\n            Eigen::VectorXi & elements,\n            const int i = 0) const;\n      // Compute squared distance to a query point\n      //\n      // Inputs:\n      //   V  #V by dim list of vertex positions\n      //   Ele  #Ele by dim list of simplex indices\n      //   p  dim-long query point \n      // Outputs:\n      //   i  facet index corresponding to smallest distances\n      //   c  closest point\n      // Returns squared distance\n      //\n      // Known bugs: currently assumes Elements are triangles regardless of\n      // dimension.\n      IGL_INLINE Scalar squared_distance(\n        const Eigen::PlainObjectBase<DerivedV> & V,\n        const Eigen::MatrixXi & Ele, \n        const RowVectorDIMS & p,\n        int & i,\n        RowVectorDIMS & c) const;\n//private:\n      // Compute squared distance to a query point\n      //\n      // Inputs:\n      //   V  #V by dim list of vertex positions\n      //   Ele  #Ele by dim list of simplex indices\n      //   p  dim-long query point \n      //   min_sqr_d  current minimum squared distance (only consider distances\n      //     less than this), see output.\n      // Outputs:\n      //   min_sqr_d  updated current minimum squared distance\n      //   i  facet index corresponding to smallest distances\n      //   c  closest point\n      // Returns squared distance\n      //\n      // Known bugs: currently assumes Elements are triangles regardless of\n      // dimension.\n      IGL_INLINE Scalar squared_distance(\n        const Eigen::PlainObjectBase<DerivedV> & V,\n        const Eigen::MatrixXi & Ele, \n        const RowVectorDIMS & p,\n        const Scalar min_sqr_d,\n        int & i,\n        RowVectorDIMS & c) const;\n      // All hits\n      IGL_INLINE bool intersect_ray(\n        const Eigen::PlainObjectBase<DerivedV> & V,\n        const Eigen::MatrixXi & Ele, \n        const RowVectorDIMS & origin,\n        const RowVectorDIMS & dir,\n        std::vector<igl::Hit> & hits) const;\n      // First hit\n      IGL_INLINE bool intersect_ray(\n        const Eigen::PlainObjectBase<DerivedV> & V,\n        const Eigen::MatrixXi & Ele, \n        const RowVectorDIMS & origin,\n        const RowVectorDIMS & dir,\n        igl::Hit & hit) const;\n//private:\n      IGL_INLINE bool intersect_ray(\n        const Eigen::PlainObjectBase<DerivedV> & V,\n        const Eigen::MatrixXi & Ele, \n        const RowVectorDIMS & origin,\n        const RowVectorDIMS & dir,\n        const Scalar min_t,\n        igl::Hit & hit) const;\n\n\npublic:\n      // Compute the squared distance from all query points in P to the\n      // _closest_ points on the primitives stored in the AABB hierarchy for\n      // the mesh (V,Ele).\n      //\n      // Inputs:\n      //   V  #V by dim list of vertex positions\n      //   Ele  #Ele by dim list of simplex indices\n      //   P  #P by dim list of query points\n      // Outputs:\n      //   sqrD  #P list of squared distances\n      //   I  #P list of indices into Ele of closest primitives\n      //   C  #P by dim list of closest points\n      template <\n        typename DerivedP, \n        typename DerivedsqrD, \n        typename DerivedI, \n        typename DerivedC>\n      IGL_INLINE void squared_distance(\n        const Eigen::PlainObjectBase<DerivedV> & V,\n        const Eigen::MatrixXi & Ele, \n        const Eigen::PlainObjectBase<DerivedP> & P,\n        Eigen::PlainObjectBase<DerivedsqrD> & sqrD,\n        Eigen::PlainObjectBase<DerivedI> & I,\n        Eigen::PlainObjectBase<DerivedC> & C) const;\n\n      // Compute the squared distance from all query points in P already stored\n      // in its own AABB hierarchy to the _closest_ points on the primitives\n      // stored in the AABB hierarchy for the mesh (V,Ele).\n      //\n      // Inputs:\n      //   V  #V by dim list of vertex positions\n      //   Ele  #Ele by dim list of simplex indices\n      //   other  AABB hierarchy of another set of primitives (must be points)\n      //   other_V  #other_V by dim list of query points\n      //   other_Ele  #other_Ele by ss list of simplex indices into other_V\n      //     (must be simple list of points: ss == 1)\n      // Outputs:\n      //   sqrD  #P list of squared distances\n      //   I  #P list of indices into Ele of closest primitives\n      //   C  #P by dim list of closest points\n      template < \n        typename Derivedother_V,\n        typename DerivedsqrD, \n        typename DerivedI, \n        typename DerivedC>\n      IGL_INLINE void squared_distance(\n        const Eigen::PlainObjectBase<DerivedV> & V,\n        const Eigen::MatrixXi & Ele, \n        const AABB<Derivedother_V,DIM> & other,\n        const Eigen::PlainObjectBase<Derivedother_V> & other_V,\n        const Eigen::MatrixXi & other_Ele, \n        Eigen::PlainObjectBase<DerivedsqrD> & sqrD,\n        Eigen::PlainObjectBase<DerivedI> & I,\n        Eigen::PlainObjectBase<DerivedC> & C) const;\nprivate:\n      template < \n        typename Derivedother_V,\n        typename DerivedsqrD, \n        typename DerivedI, \n        typename DerivedC>\n      IGL_INLINE Scalar squared_distance_helper(\n        const Eigen::PlainObjectBase<DerivedV> & V,\n        const Eigen::MatrixXi & Ele, \n        const AABB<Derivedother_V,DIM> * other,\n        const Eigen::PlainObjectBase<Derivedother_V> & other_V,\n        const Eigen::MatrixXi & other_Ele, \n        const Scalar min_sqr_d,\n        Eigen::PlainObjectBase<DerivedsqrD> & sqrD,\n        Eigen::PlainObjectBase<DerivedI> & I,\n        Eigen::PlainObjectBase<DerivedC> & C) const;\n      // Compute the squared distance to the primitive in this node: assumes\n      // that this is indeed a leaf node.\n      //\n      // Inputs:\n      //   V  #V by dim list of vertex positions\n      //   Ele  #Ele by dim list of simplex indices\n      //   p  dim-long query point\n      //   sqr_d  current minimum distance for this query, see output\n      //   i  current index into Ele of closest point, see output\n      //   c  dim-long current closest point, see output\n      // Outputs:\n      //   sqr_d   minimum of initial value and squared distance to this\n      //     primitive\n      //   i  possibly updated index into Ele of closest point\n      //   c  dim-long possibly updated closest point\n      IGL_INLINE void leaf_squared_distance(\n        const Eigen::PlainObjectBase<DerivedV> & V,\n        const Eigen::MatrixXi & Ele, \n        const RowVectorDIMS & p,\n        Scalar & sqr_d,\n        int & i,\n        RowVectorDIMS & c) const;\n      // If new distance (sqr_d_candidate) is less than current distance\n      // (sqr_d), then update this distance and its associated values\n      // _in-place_:\n      //\n      // Inputs:\n      //   p  dim-long query point (only used in DEBUG mode)\n      //   sqr_d  candidate minimum distance for this query, see output\n      //   i  candidate index into Ele of closest point, see output\n      //   c  dim-long candidate closest point, see output\n      //   sqr_d  current minimum distance for this query, see output\n      //   i  current index into Ele of closest point, see output\n      //   c  dim-long current closest point, see output\n      // Outputs:\n      //   sqr_d   minimum of initial value and squared distance to this\n      //     primitive\n      //   i  possibly updated index into Ele of closest point\n      //   c  dim-long possibly updated closest point\n      IGL_INLINE void set_min(\n        const RowVectorDIMS & p,\n        const Scalar sqr_d_candidate,\n        const int i_candidate,\n        const RowVectorDIMS & c_candidate,\n        Scalar & sqr_d,\n        int & i,\n        RowVectorDIMS & c) const;\npublic:\n      EIGEN_MAKE_ALIGNED_OPERATOR_NEW\n    };\n}\n\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"AABB.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/ARAPEnergyType.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_ARAPENERGYTYPE_H\n#define IGL_ARAPENERGYTYPE_H\nnamespace igl\n{\n  //     ARAP_ENERGY_TYPE_SPOKES  \"As-rigid-as-possible Surface Modeling\" by [Sorkine and\n  //       Alexa 2007], rotations defined at vertices affecting incident edges,\n  //       default\n  //     ARAP_ENERGY_TYPE_SPOKES-AND-RIMS  Adapted version of \"As-rigid-as-possible Surface\n  //       Modeling\" by [Sorkine and Alexa 2007] presented in section 4.2 of or\n  //       \"A simple geometric model for elastic deformation\" by [Chao et al.\n  //       2010], rotations defined at vertices affecting incident edges and\n  //       opposite edges\n  //     ARAP_ENERGY_TYPE_ELEMENTS  \"A local-global approach to mesh parameterization\" by\n  //       [Liu et al.  2010] or \"A simple geometric model for elastic\n  //       deformation\" by [Chao et al.  2010], rotations defined at elements\n  //       (triangles or tets) \n  //     ARAP_ENERGY_TYPE_DEFAULT  Choose one automatically: spokes and rims\n  //       for surfaces, elements for planar meshes and tets (not fully\n  //       supported)\n  enum ARAPEnergyType\n  {\n    ARAP_ENERGY_TYPE_SPOKES = 0,\n    ARAP_ENERGY_TYPE_SPOKES_AND_RIMS = 1,\n    ARAP_ENERGY_TYPE_ELEMENTS = 2,\n    ARAP_ENERGY_TYPE_DEFAULT = 3,\n    NUM_ARAP_ENERGY_TYPES = 4\n  };\n}\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/C_STR.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_C_STR_H\n#define IGL_C_STR_H\n// http://stackoverflow.com/a/2433143/148668\n// Suppose you have a function:\n//   void func(const char * c);\n// Then you can write:\n//   func(C_STR(\"foo\"<<1<<\"bar\"));\n#include <sstream>\n#include <string>\n#define C_STR(X) static_cast<std::ostringstream&>(std::ostringstream().flush() << X).str().c_str()\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/Camera.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_CAMERA_H\n#define IGL_CAMERA_H\n\n// you're idiot, M$!\n#if defined(_WIN32)\n#undef far\n#undef near\n#endif\n\n#include <Eigen/Geometry>\n#include <Eigen/Core>\n\n#define IGL_CAMERA_MIN_ANGLE 5.0\nnamespace igl\n{\n\n  // A simple camera class. The camera stores projection parameters (field of\n  // view angle, aspect ratio, near and far clips) as well as a rigid\n  // tranformation *of the camera as if it were also a scene object*. Thus, the\n  // **inverse** of this rigid transformation is the modelview transformation.\n  class Camera\n  {\n    public:\n      // On windows you might need: -fno-delayed-template-parsing\n      //static constexpr double IGL_CAMERA_MIN_ANGLE = 5.;\n      //  m_angle  Field of view angle in degrees {45}\n      //  m_aspect  Aspect ratio {1}\n      //  m_near  near clipping plane {1e-2}\n      //  m_far  far clipping plane {100}\n      //  m_at_dist  distance of looking at point {1}\n      //  m_orthographic  whether to use othrographic projection {false}\n      //  m_rotation_conj  Conjugate of rotation part of rigid transformation of\n      //    camera {identity}. Note: we purposefully store the conjugate because\n      //    this is what TW_TYPE_QUAT4D is expecting.\n      //  m_translation  Translation part of rigid transformation of camera\n      //    {(0,0,1)}\n      double m_angle, m_aspect, m_near, m_far, m_at_dist;\n      bool m_orthographic;\n      Eigen::Quaterniond m_rotation_conj;\n      Eigen::Vector3d m_translation;\n    public:\n      inline Camera();\n      inline virtual ~Camera(){}\n      // Return projection matrix that takes relative camera coordinates and\n      // transforms it to viewport coordinates\n      //\n      // Note:\n      //\n      //     if(m_angle > 0)\n      //     {\n      //       gluPerspective(m_angle,m_aspect,m_near,m_at_dist+m_far);\n      //     }else\n      //     {\n      //       gluOrtho(-0.5*aspect,0.5*aspect,-0.5,0.5,m_at_dist+m_near,m_far);\n      //     }\n      //\n      // Is equivalent to\n      //\n      //     glMultMatrixd(projection().data());\n      //\n      inline Eigen::Matrix4d projection() const;\n      // Return an Affine transformation (rigid actually) that \n      // takes relative coordinates and tramsforms them into world 3d\n      // coordinates: moves the camera into the scene.\n      inline Eigen::Affine3d affine() const;\n      // Return an Affine transformation (rigid actually) that puts the takes a\n      // world 3d coordinate and transforms it into the relative camera\n      // coordinates: moves the scene in front of the camera.\n      //\n      // Note:\n      //\n      //     gluLookAt(\n      //       eye()(0), eye()(1), eye()(2),\n      //       at()(0), at()(1), at()(2),\n      //       up()(0), up()(1), up()(2));\n      //\n      // Is equivalent to\n      //\n      //     glMultMatrixd(camera.inverse().matrix().data());\n      //\n      // See also: affine, eye, at, up\n      inline Eigen::Affine3d inverse() const;\n      // Returns world coordinates position of center or \"eye\" of camera.\n      inline Eigen::Vector3d eye() const;\n      // Returns world coordinate position of a point \"eye\" is looking at.\n      inline Eigen::Vector3d at() const;\n      // Returns world coordinate unit vector of \"up\" vector\n      inline Eigen::Vector3d up() const;\n      // Return top right corner of unit plane in relative coordinates, that is\n      // (w/2,h/2,1)\n      inline Eigen::Vector3d unit_plane() const;\n      // Move dv in the relative coordinate frame of the camera (move the FPS)\n      //\n      // Inputs:\n      //   dv  (x,y,z) displacement vector\n      //\n      inline void dolly(const Eigen::Vector3d & dv);\n      // \"Scale zoom\": Move `eye`, but leave `at`\n      //\n      // Input:\n      //   s  amount to scale distance to at\n      inline void push_away(const double s);\n      // Aka \"Hitchcock\", \"Vertigo\", \"Spielberg\" or \"Trombone\" zoom:\n      // simultaneously dolly while changing angle so that `at` not only stays\n      // put in relative coordinates but also projected coordinates. That is\n      //\n      // Inputs:\n      //   da  change in angle in degrees\n      inline void dolly_zoom(const double da);\n      // Turn around eye so that rotation is now q\n      //\n      // Inputs:\n      //   q  new rotation as quaternion\n      inline void turn_eye(const Eigen::Quaterniond & q);\n      // Orbit around at so that rotation is now q\n      //\n      // Inputs:\n      //   q  new rotation as quaternion\n      inline void orbit(const Eigen::Quaterniond & q);\n      // Rotate and translate so that camera is situated at \"eye\" looking at \"at\"\n      // with \"up\" pointing up.\n      //\n      // Inputs:\n      //   eye  (x,y,z) coordinates of eye position\n      //   at   (x,y,z) coordinates of at position\n      //   up   (x,y,z) coordinates of up vector\n      inline void look_at(\n        const Eigen::Vector3d & eye,\n        const Eigen::Vector3d & at,\n        const Eigen::Vector3d & up);\n    // Needed any time Eigen Structures are used as class members\n    // http://eigen.tuxfamily.org/dox-devel/group__TopicStructHavingEigenMembers.html\n    public:\n        EIGEN_MAKE_ALIGNED_OPERATOR_NEW\n  };\n}\n\n// Implementation\n#include \"PI.h\"\n#include \"EPS.h\"\n#include <cmath>\n#include <iostream>\n#include <cassert>\n\ninline igl::Camera::Camera():\n  m_angle(45.0),m_aspect(1),m_near(1e-2),m_far(100),m_at_dist(1),\n  m_orthographic(false),\n  m_rotation_conj(1,0,0,0),\n  m_translation(0,0,1)\n{\n}\n\ninline Eigen::Matrix4d igl::Camera::projection() const\n{\n  Eigen::Matrix4d P;\n  using namespace std;\n  const double far = m_at_dist + m_far;\n  const double near = m_near;\n  // http://stackoverflow.com/a/3738696/148668\n  if(m_orthographic)\n  {\n    const double f = 0.5;\n    const double left = -f*m_aspect;\n    const double right = f*m_aspect;\n    const double bottom = -f;\n    const double top = f;\n    const double tx = (right+left)/(right-left);\n    const double ty = (top+bottom)/(top-bottom);\n    const double tz = (far+near)/(far-near);\n    const double z_fix = 0.5 /m_at_dist / tan(m_angle*0.5 * (M_PI/180.) );\n    P<<\n      z_fix*2./(right-left), 0, 0, -tx,\n      0, z_fix*2./(top-bottom), 0, -ty,\n      0, 0, -z_fix*2./(far-near),  -tz,\n      0, 0, 0, 1;\n  }else\n  {\n    const double yScale = tan(PI*0.5 - 0.5*m_angle*PI/180.);\n    // http://stackoverflow.com/a/14975139/148668\n    const double xScale = yScale/m_aspect;\n    P<< \n      xScale, 0, 0, 0,\n      0, yScale, 0, 0,\n      0, 0, -(far+near)/(far-near), -1,\n      0, 0, -2.*near*far/(far-near), 0;\n    P = P.transpose().eval();\n  }\n  return P;\n}\n\ninline Eigen::Affine3d igl::Camera::affine() const\n{\n  using namespace Eigen;\n  Affine3d t = Affine3d::Identity();\n  t.rotate(m_rotation_conj.conjugate());\n  t.translate(m_translation);\n  return t;\n}\n\ninline Eigen::Affine3d igl::Camera::inverse() const\n{\n  using namespace Eigen;\n  Affine3d t = Affine3d::Identity();\n  t.translate(-m_translation);\n  t.rotate(m_rotation_conj);\n  return t;\n}\n\ninline Eigen::Vector3d igl::Camera::eye() const\n{\n  using namespace Eigen;\n  return affine() * Vector3d(0,0,0);\n}\n\ninline Eigen::Vector3d igl::Camera::at() const\n{\n  using namespace Eigen;\n  return affine() * (Vector3d(0,0,-1)*m_at_dist);\n}\n\ninline Eigen::Vector3d igl::Camera::up() const\n{\n  using namespace Eigen;\n  Affine3d t = Affine3d::Identity();\n  t.rotate(m_rotation_conj.conjugate());\n  return t * Vector3d(0,1,0);\n}\n\ninline Eigen::Vector3d igl::Camera::unit_plane() const\n{\n  // Distance of center pixel to eye\n  const double d = 1.0;\n  const double a = m_aspect;\n  const double theta = m_angle*PI/180.;\n  const double w =\n    2.*sqrt(-d*d/(a*a*pow(tan(0.5*theta),2.)-1.))*a*tan(0.5*theta);\n  const double h = w/a;\n  return Eigen::Vector3d(w*0.5,h*0.5,-d);\n}\n\ninline void igl::Camera::dolly(const Eigen::Vector3d & dv)\n{\n  m_translation += dv;\n}\n\ninline void igl::Camera::push_away(const double s)\n{\n  using namespace Eigen;\n#ifndef NDEBUG\n  Vector3d old_at = at();\n#endif\n  const double old_at_dist = m_at_dist;\n  m_at_dist = old_at_dist * s;\n  dolly(Vector3d(0,0,1)*(m_at_dist - old_at_dist));\n  assert((old_at-at()).squaredNorm() < DOUBLE_EPS);\n}\n\ninline void igl::Camera::dolly_zoom(const double da)\n{\n  using namespace std;\n  using namespace Eigen;\n#ifndef NDEBUG\n  Vector3d old_at = at();\n#endif\n  const double old_angle = m_angle;\n  if(old_angle + da < IGL_CAMERA_MIN_ANGLE)\n  {\n    m_orthographic = true;\n  }else if(old_angle + da > IGL_CAMERA_MIN_ANGLE)\n  {\n    m_orthographic = false;\n  }\n  if(!m_orthographic)\n  {\n    m_angle += da;\n    m_angle = min(89.,max(IGL_CAMERA_MIN_ANGLE,m_angle));\n    // change in distance\n    const double s = \n      (2.*tan(old_angle/2./180.*M_PI)) /\n      (2.*tan(m_angle/2./180.*M_PI)) ;\n    const double old_at_dist = m_at_dist;\n    m_at_dist = old_at_dist * s;\n    dolly(Vector3d(0,0,1)*(m_at_dist - old_at_dist));\n    assert((old_at-at()).squaredNorm() < DOUBLE_EPS);\n  }\n}\n\ninline void igl::Camera::turn_eye(const Eigen::Quaterniond & q)\n{\n  using namespace Eigen;\n  Vector3d old_eye = eye();\n  // eye should be fixed\n  //\n  // eye_1 = R_1 * t_1 = eye_0\n  // t_1 = R_1' * eye_0\n  m_rotation_conj = q.conjugate();\n  m_translation = m_rotation_conj * old_eye;\n  assert((old_eye - eye()).squaredNorm() < DOUBLE_EPS);\n}\n\ninline void igl::Camera::orbit(const Eigen::Quaterniond & q)\n{\n  using namespace Eigen;\n  Vector3d old_at = at();\n  // at should be fixed\n  //\n  // at_1 = R_1 * t_1 - R_1 * z = at_0\n  // t_1 = R_1' * (at_0 + R_1 * z)\n  m_rotation_conj = q.conjugate();\n  m_translation = \n    m_rotation_conj * \n      (old_at + \n         m_rotation_conj.conjugate() * Vector3d(0,0,1) * m_at_dist);\n  assert((old_at - at()).squaredNorm() < DOUBLE_EPS);\n}\n\ninline void igl::Camera::look_at(\n  const Eigen::Vector3d & eye,\n  const Eigen::Vector3d & at,\n  const Eigen::Vector3d & up)\n{\n  using namespace Eigen;\n  using namespace std;\n  // http://www.opengl.org/sdk/docs/man2/xhtml/gluLookAt.xml\n  // Normalize vector from at to eye\n  Vector3d F = eye-at;\n  m_at_dist = F.norm();\n  F.normalize();\n  // Project up onto plane orthogonal to F and normalize\n  assert(up.cross(F).norm() > DOUBLE_EPS && \"(eye-at) x up ≈ 0\");\n  const Vector3d proj_up = (up-(up.dot(F))*F).normalized();\n  Quaterniond a,b;\n  a.setFromTwoVectors(Vector3d(0,0,-1),-F);\n  b.setFromTwoVectors(a*Vector3d(0,1,0),proj_up);\n  m_rotation_conj = (b*a).conjugate();\n  m_translation = m_rotation_conj * eye;\n  //cout<<\"m_at_dist: \"<<m_at_dist<<endl;\n  //cout<<\"proj_up: \"<<proj_up.transpose()<<endl;\n  //cout<<\"F: \"<<F.transpose()<<endl;\n  //cout<<\"eye(): \"<<this->eye().transpose()<<endl;\n  //cout<<\"at(): \"<<this->at().transpose()<<endl;\n  //cout<<\"eye()-at(): \"<<(this->eye()-this->at()).normalized().transpose()<<endl;\n  //cout<<\"eye-this->eye(): \"<<(eye-this->eye()).squaredNorm()<<endl;\n  assert(           (eye-this->eye()).squaredNorm() < DOUBLE_EPS);\n  //assert((F-(this->eye()-this->at()).normalized()).squaredNorm() < \n  //  DOUBLE_EPS);\n  assert(           (at-this->at()).squaredNorm() < DOUBLE_EPS);\n  //assert(        (proj_up-this->up()).squaredNorm() < DOUBLE_EPS);\n}\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/ConjugateFFSolverData.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Olga Diamanti, 2015 Alec Jacobson\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_CONJUGATE_FF_SOLVER_DATA_H\n#define IGL_CONJUGATE_FF_SOLVER_DATA_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <Eigen/Sparse>\n#include <igl/matlab_format.h>\n#include <iostream>\nusing namespace std;\nnamespace igl \n{\n  // Data class for the Conjugate Frame Field Solver\n  template <typename DerivedV, typename DerivedF>\n  class ConjugateFFSolverData\n  {\n    public:\n      const Eigen::PlainObjectBase<DerivedV> &V; int numV;\n      const Eigen::PlainObjectBase<DerivedF> &F; int numF;\n\n      Eigen::MatrixXi EV; int numE;\n      Eigen::MatrixXi F2E;\n      Eigen::MatrixXi E2F;\n      Eigen::VectorXd K;\n\n      Eigen::VectorXi isBorderEdge;\n      int numInteriorEdges;\n      Eigen::Matrix<int,Eigen::Dynamic,2> E2F_int;\n      Eigen::VectorXi indInteriorToFull;\n      Eigen::VectorXi indFullToInterior;\n\n      DerivedV B1, B2, FN;\n\n\n      Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic,1> kmin, kmax;\n      Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic,2> dmin, dmax;\n      Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic,3> dmin3, dmax3;\n\n      Eigen::VectorXd nonPlanarityMeasure;\n      Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > planarityWeight;\n\n      //conjugacy matrix\n      std::vector<Eigen::Matrix<typename DerivedV::Scalar, 4,4> > H;\n\n      //conjugacy matrix eigenvectors and (scaled) eigenvalues\n      std::vector<Eigen::Matrix<typename DerivedV::Scalar, 4,4> > UH;\n      std::vector<Eigen::Matrix<typename DerivedV::Scalar, 4,1> > s;\n\n      //laplacians\n      Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar>> DDA, DDB;\n\n  private:\n    IGL_INLINE void computeCurvatureAndPrincipals();\n    IGL_INLINE void precomputeConjugacyStuff();\n    IGL_INLINE void computeLaplacians();\n    IGL_INLINE void computek();\n    IGL_INLINE void computeCoefficientLaplacian(int n, Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > &D);\n\n    IGL_INLINE void precomputeInteriorEdges();\n\npublic:\n    IGL_INLINE ConjugateFFSolverData(const Eigen::PlainObjectBase<DerivedV> &_V,\n                                   const Eigen::PlainObjectBase<DerivedF> &_F);\n    IGL_INLINE void evaluateConjugacy(const Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 2> &pvU,\n                                      const Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 2> &pvV,\n                                      Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 1> &conjValues) const ;\n  };\n}\n\n#include <igl/colon.h>\n#include <igl/edge_topology.h>\n#include <igl/false_barycentric_subdivision.h>\n#include <igl/local_basis.h>\n#include <igl/principal_curvature.h>\n#include <igl/sparse.h>\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE igl::ConjugateFFSolverData<DerivedV, DerivedF>::\nConjugateFFSolverData(const Eigen::PlainObjectBase<DerivedV> &_V,\n                  const Eigen::PlainObjectBase<DerivedF> &_F):\nV(_V),\nnumV(_V.rows()),\nF(_F),\nnumF(_F.rows())\n{\n  igl::edge_topology(V,F,EV,F2E,E2F);\n  numE = EV.rows();\n\n  precomputeInteriorEdges();\n\n  igl::local_basis(V,F,B1,B2,FN);\n\n  computek();\n\n  computeLaplacians();\n\n  computeCurvatureAndPrincipals();\n  precomputeConjugacyStuff();\n\n};\n\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::ConjugateFFSolverData<DerivedV, DerivedF>::computeCurvatureAndPrincipals()\n{\n  Eigen::MatrixXd VCBary;\n  Eigen::MatrixXi FCBary;\n\n  VCBary.setZero(numV+numF,3);\n  FCBary.setZero(3*numF,3);\n  igl::false_barycentric_subdivision(V, F, VCBary, FCBary);\n\n  Eigen::MatrixXd dmax3_,dmin3_;\n  igl::principal_curvature(VCBary, FCBary, dmax3_, dmin3_, kmax, kmin, 5,true);\n\n  dmax3 = dmax3_.bottomRows(numF);\n  dmin3 = dmin3_.bottomRows(numF);\n\n  kmax = kmax.bottomRows(numF);\n  kmin = kmin.bottomRows(numF);\n\n  cerr<<igl::matlab_format(kmax,\"kmax\")<<endl;\n  cerr<<igl::matlab_format(kmin,\"kmin\")<<endl;\n  //  kmax = dmax3.rowwise().norm();\n  //  kmin = dmin3.rowwise().norm();\n\n  dmin3.rowwise().normalize();\n  dmax3.rowwise().normalize();\n  dmax.setZero(numF,2);\n  dmin.setZero(numF,2);\n  for (int i= 0; i <numF; ++i)\n  {\n    if(kmin[i] != kmin[i] || kmax[i] != kmax[i] || (dmin3.row(i).array() != dmin3.row(i).array()).any() || (dmax3.row(i).array() != dmax3.row(i).array()).any())\n    {\n      kmin[i] = 0;\n      kmax[i] = 0;\n      dmin3.row(i) = B1.row(i);\n      dmax3.row(i) = B2.row(i);\n    }\n    else\n    {\n      dmax3.row(i) = (dmax3.row(i) - (dmax3.row(i).dot(FN.row(i)))*FN.row(i)).normalized();\n      dmin3.row(i) = dmin3.row(i) - (dmin3.row(i).dot(FN.row(i)))*FN.row(i);\n      dmin3.row(i) = (dmin3.row(i) - (dmin3.row(i).dot(dmax3.row(i)))*dmax3.row(i)).normalized();\n      if ((dmin3.row(i).cross(dmax3.row(i))).dot(FN.row(i))<0)\n        dmin3.row(i) = -dmin3.row(i);\n    }\n    dmax.row(i) << dmax3.row(i).dot(B1.row(i)), dmax3.row(i).dot(B2.row(i));\n    dmax.row(i).normalize();\n    dmin.row(i) << dmin3.row(i).dot(B1.row(i)), dmin3.row(i).dot(B2.row(i));\n    dmin.row(i).normalize();\n\n  }\n\n  nonPlanarityMeasure = kmax.cwiseAbs().array()*kmin.cwiseAbs().array();\n  typename DerivedV::Scalar minP = nonPlanarityMeasure.minCoeff();\n  typename DerivedV::Scalar maxP = nonPlanarityMeasure.maxCoeff();\n  nonPlanarityMeasure = (nonPlanarityMeasure.array()-minP)/(maxP-minP);\n  Eigen::VectorXi I = igl::colon<typename DerivedF::Scalar>(0, numF-1);\n  igl::sparse(I, I, nonPlanarityMeasure, numF, numF, planarityWeight);\n\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::ConjugateFFSolverData<DerivedV, DerivedF>::precomputeConjugacyStuff()\n{\n  H.resize(numF);\n  UH.resize(numF);\n  s.resize(numF);\n\n  for (int i = 0; i<numF; ++i)\n  {\n    //compute conjugacy matrix\n    typename DerivedV::Scalar e1x = dmin(i,0), e1y = dmin(i,1), e2x = dmax(i,0), e2y = dmax(i,1), k1 = kmin[i], k2 = kmax[i];\n\n    H[i]<<\n    0,          0, k1*e1x*e1x, k1*e1x*e1y,\n    0,          0, k1*e1x*e1y, k1*e1y*e1y,\n    k2*e2x*e2x, k2*e2x*e2y,          0,          0,\n    k2*e2x*e2y, k2*e2y*e2y,          0,          0;\n    Eigen::Matrix<typename DerivedV::Scalar, 4, 4> Ht = H[i].transpose();\n    H[i] = .5*(H[i]+Ht);\n\n    Eigen::EigenSolver<Eigen::Matrix<typename DerivedV::Scalar, 4, 4> > es(H[i]);\n    s[i] = es.eigenvalues().real();//ok to do this because H symmetric\n    //scale\n    s[i] = s[i]/(s[i].cwiseAbs().minCoeff());\n    UH[i] = es.eigenvectors().real();\n\n\n  }\n}\n\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::ConjugateFFSolverData<DerivedV, DerivedF>::computeLaplacians()\n{\n  computeCoefficientLaplacian(2, DDA);\n\n  computeCoefficientLaplacian(4, DDB);\n}\n\ntemplate<typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::ConjugateFFSolverData<DerivedV, DerivedF>::\nprecomputeInteriorEdges()\n{\n  // Flag border edges\n  numInteriorEdges = 0;\n  isBorderEdge.setZero(numE,1);\n  indFullToInterior = -1*Eigen::VectorXi::Ones(numE,1);\n\n  for(unsigned i=0; i<numE; ++i)\n  {\n    if ((E2F(i,0) == -1) || ((E2F(i,1) == -1)))\n      isBorderEdge[i] = 1;\n    else\n    {\n      indFullToInterior[i] = numInteriorEdges;\n      numInteriorEdges++;\n    }\n  }\n\n  E2F_int.resize(numInteriorEdges, 2);\n  indInteriorToFull.setZero(numInteriorEdges,1);\n  int ii = 0;\n  for (int k=0; k<numE; ++k)\n  {\n    if (isBorderEdge[k])\n      continue;\n    E2F_int.row(ii) = E2F.row(k);\n    indInteriorToFull[ii] = k;\n    ii++;\n  }\n\n}\n\n\n\ntemplate<typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::ConjugateFFSolverData<DerivedV, DerivedF>::\ncomputeCoefficientLaplacian(int n, Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > &D)\n{\n  std::vector<Eigen::Triplet<std::complex<typename DerivedV::Scalar> >> tripletList;\n\n  // For every non-border edge\n  for (unsigned eid=0; eid<numE; ++eid)\n  {\n    if (!isBorderEdge[eid])\n    {\n      int fid0 = E2F(eid,0);\n      int fid1 = E2F(eid,1);\n\n      tripletList.push_back(Eigen::Triplet<std::complex<typename DerivedV::Scalar> >(fid0,\n                                                                                     fid0,\n                                                                                     std::complex<typename DerivedV::Scalar>(1.)));\n      tripletList.push_back(Eigen::Triplet<std::complex<typename DerivedV::Scalar> >(fid1,\n                                                                                     fid1,\n                                                                                     std::complex<typename DerivedV::Scalar>(1.)));\n      tripletList.push_back(Eigen::Triplet<std::complex<typename DerivedV::Scalar> >(fid0,\n                                                                                     fid1,\n                                                                                     -1.*std::polar(1.,-1.*n*K[eid])));\n      tripletList.push_back(Eigen::Triplet<std::complex<typename DerivedV::Scalar> >(fid1,\n                                                                                     fid0,\n                                                                                     -1.*std::polar(1.,1.*n*K[eid])));\n\n    }\n  }\n  D.resize(numF,numF);\n  D.setFromTriplets(tripletList.begin(), tripletList.end());\n\n\n}\n\ntemplate<typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::ConjugateFFSolverData<DerivedV, DerivedF>::\ncomputek()\n{\n  K.setZero(numE);\n  // For every non-border edge\n  for (unsigned eid=0; eid<numE; ++eid)\n  {\n    if (!isBorderEdge[eid])\n    {\n      int fid0 = E2F(eid,0);\n      int fid1 = E2F(eid,1);\n\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> N0 = FN.row(fid0);\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> N1 = FN.row(fid1);\n\n      // find common edge on triangle 0 and 1\n      int fid0_vc = -1;\n      int fid1_vc = -1;\n      for (unsigned i=0;i<3;++i)\n      {\n        if (F2E(fid0,i) == eid)\n          fid0_vc = i;\n        if (F2E(fid1,i) == eid)\n          fid1_vc = i;\n      }\n      assert(fid0_vc != -1);\n      assert(fid1_vc != -1);\n\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> common_edge = V.row(F(fid0,(fid0_vc+1)%3)) - V.row(F(fid0,fid0_vc));\n      common_edge.normalize();\n\n      // Map the two triangles in a new space where the common edge is the x axis and the N0 the z axis\n      Eigen::Matrix<typename DerivedV::Scalar, 3, 3> P;\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> o = V.row(F(fid0,fid0_vc));\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> tmp = -N0.cross(common_edge);\n      P << common_edge, tmp, N0;\n      //      P.transposeInPlace();\n\n\n      Eigen::Matrix<typename DerivedV::Scalar, 3, 3> V0;\n      V0.row(0) = V.row(F(fid0,0)) -o;\n      V0.row(1) = V.row(F(fid0,1)) -o;\n      V0.row(2) = V.row(F(fid0,2)) -o;\n\n      V0 = (P*V0.transpose()).transpose();\n\n      Eigen::Matrix<typename DerivedV::Scalar, 3, 3> V1;\n      V1.row(0) = V.row(F(fid1,0)) -o;\n      V1.row(1) = V.row(F(fid1,1)) -o;\n      V1.row(2) = V.row(F(fid1,2)) -o;\n      V1 = (P*V1.transpose()).transpose();\n\n      // compute rotation R such that R * N1 = N0\n      // i.e. map both triangles to the same plane\n      double alpha = -atan2(V1((fid1_vc+2)%3,2),V1((fid1_vc+2)%3,1));\n\n      Eigen::Matrix<typename DerivedV::Scalar, 3, 3> R;\n      R << 1,          0,            0,\n      0, cos(alpha), -sin(alpha) ,\n      0, sin(alpha),  cos(alpha);\n      V1 = (R*V1.transpose()).transpose();\n\n      // measure the angle between the reference frames\n      // k_ij is the angle between the triangle on the left and the one on the right\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> ref0 = V0.row(1) - V0.row(0);\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> ref1 = V1.row(1) - V1.row(0);\n\n      ref0.normalize();\n      ref1.normalize();\n\n      double ktemp = atan2(ref1(1),ref1(0)) - atan2(ref0(1),ref0(0));\n\n      // just to be sure, rotate ref0 using angle ktemp...\n      Eigen::Matrix<typename DerivedV::Scalar, 2, 2> R2;\n      R2 << cos(ktemp), -sin(ktemp), sin(ktemp), cos(ktemp);\n\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 2> tmp1 = R2*(ref0.head(2)).transpose();\n\n      K[eid] = ktemp;\n    }\n  }\n\n}\n\ntemplate<typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::ConjugateFFSolverData<DerivedV, DerivedF>::\nevaluateConjugacy(const Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 2> &pvU,\n                   const Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 2> &pvV,\n                  Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 1> &conjValues) const \n{\n  conjValues.resize(numF,1);\n  for (int j =0; j<numF; ++j)\n  {\n    Eigen::Matrix<typename DerivedV::Scalar, 4, 1> x; x<<pvU.row(j).transpose(), pvV.row(j).transpose();\n    conjValues[j] = x.transpose()*H[j]*x;\n  }\n}\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/EPS.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"EPS.h\"\n\ntemplate <> IGL_INLINE float igl::EPS()\n{\n  return igl::FLOAT_EPS;\n}\ntemplate <> IGL_INLINE double igl::EPS()\n{\n  return igl::DOUBLE_EPS;\n}\n\ntemplate <> IGL_INLINE float igl::EPS_SQ()\n{\n  return igl::FLOAT_EPS_SQ;\n}\ntemplate <> IGL_INLINE double igl::EPS_SQ()\n{\n  return igl::DOUBLE_EPS_SQ;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/EPS.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_EPS_H\n#define IGL_EPS_H\n#include \"igl_inline.h\"\nnamespace igl\n{\n  // Define a standard value for double epsilon\n  const double DOUBLE_EPS    = 1.0e-14;\n  const double DOUBLE_EPS_SQ = 1.0e-28;\n  const float FLOAT_EPS    = 1.0e-7;\n  const float FLOAT_EPS_SQ = 1.0e-14;\n  // Function returning EPS for corresponding type\n  template <typename S_type> IGL_INLINE S_type EPS();\n  template <typename S_type> IGL_INLINE S_type EPS_SQ();\n  // Template specializations for float and double\n  template <> IGL_INLINE float EPS<float>();\n  template <> IGL_INLINE double EPS<double>();\n  template <> IGL_INLINE float EPS_SQ<float>();\n  template <> IGL_INLINE double EPS_SQ<double>();\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"EPS.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/HalfEdgeIterator.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_HALFEDGEITERATOR_H\n#define IGL_HALFEDGEITERATOR_H\n\n#include <Eigen/Core>\n\n#include <vector>\n#include <igl/igl_inline.h>\n\nnamespace igl\n{\n  // HalfEdgeIterator - Fake halfedge for fast and easy navigation on triangle meshes with vertex_triangle_adjacency and\n  // triangle_triangle adjacency\n  template <typename DerivedF>\n  class HalfEdgeIterator\n  {\n  public:\n    // Init the HalfEdgeIterator by specifying Face,Edge Index and Orientation\n    IGL_INLINE HalfEdgeIterator(\n        const Eigen::PlainObjectBase<DerivedF>& _F,\n        const Eigen::PlainObjectBase<DerivedF>& _FF,\n        const Eigen::PlainObjectBase<DerivedF>& _FFi,\n        int _fi,\n        int _ei,\n        bool _reverse = false\n        )\n    : fi(_fi), ei(_ei), reverse(_reverse), F(_F), FF(_FF), FFi(_FFi)\n    {}\n\n    // Change Face\n    IGL_INLINE void flipF()\n    {\n      if (isBorder())\n        return;\n\n      int fin = (FF)(fi,ei);\n      int ein = (FFi)(fi,ei);\n      int reversen = !reverse;\n\n      fi = fin;\n      ei = ein;\n      reverse = reversen;\n    }\n\n    // Change Edge\n    IGL_INLINE void flipE()\n    {\n      if (!reverse)\n        ei = (ei+2)%3; // ei-1\n      else\n        ei = (ei+1)%3;\n\n      reverse = !reverse;\n    }\n\n    // Change Vertex\n    IGL_INLINE void flipV()\n    {\n      reverse = !reverse;\n    }\n\n    IGL_INLINE bool isBorder()\n    {\n      return (FF)(fi,ei) == -1;\n    }\n\n    /*!\n     * Returns the next edge skipping the border\n     *      _________\n     *     /\\ c | b /\\\n     *    /  \\  |  /  \\\n     *   / d  \\ | / a  \\\n     *  /______\\|/______\\\n     *          v\n     * In this example, if a and d are of-border and the pos is iterating counterclockwise, this method iterate through the faces incident on vertex v,\n     * producing the sequence a, b, c, d, a, b, c, ...\n     */\n    IGL_INLINE bool NextFE()\n    {\n      if ( isBorder() ) // we are on a border\n      {\n        do\n        {\n          flipF();\n          flipE();\n        } while (!isBorder());\n        flipE();\n        return false;\n      }\n      else\n      {\n        flipF();\n        flipE();\n        return true;\n      }\n    }\n\n    // Get vertex index\n    IGL_INLINE int Vi()\n    {\n      assert(fi >= 0);\n      assert(fi < F.rows());\n      assert(ei >= 0);\n      assert(ei <= 2);\n\n      if (!reverse)\n        return (*F)(fi,ei);\n      else\n        return (*F)(fi,(ei+1)%3);\n    }\n\n    // Get face index\n    IGL_INLINE int Fi()\n    {\n      return fi;\n    }\n\n    // Get edge index\n    IGL_INLINE int Ei()\n    {\n      return ei;\n    }\n\n\n    IGL_INLINE bool operator==(HalfEdgeIterator& p2)\n    {\n      return\n      (\n       (fi == p2.fi) &&\n       (ei == p2.ei) &&\n       (reverse == p2.reverse) &&\n       (F   == p2.F) &&\n       (FF  == p2.FF) &&\n       (FFi == p2.FFi)\n       );\n    }\n\n  private:\n    int fi;\n    int ei;\n    bool reverse;\n\n    const Eigen::PlainObjectBase<DerivedF>& F;\n    const Eigen::PlainObjectBase<DerivedF>& FF;\n    const Eigen::PlainObjectBase<DerivedF>& FFi;\n  };\n\n}\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/Hit.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n//               2014 Christian Schüller <schuellchr@gmail.com> \n//\n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_HIT_H\n#define IGL_HIT_H\n\nnamespace igl\n{\n  // Reimplementation of the embree::Hit struct from embree1.0\n  // \n  // TODO: template on floating point type\n  struct Hit\n  {\n    int id; // primitive id\n    int gid; // geometry id\n    float u,v; // barycentric coordinates\n    float t; // distance = direction*t to intersection\n  };\n}\n#endif \n"
  },
  {
    "path": "libs/libigl/include/igl/IO",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_IO\n#define IGL_IO\n// Input and output functions\n#include \"read_triangle_mesh.h\"\n#include \"readDMAT.h\"\n#include \"readMESH.h\"\n#include \"readNODE.h\"\n#include \"readOBJ.h\"\n#include \"readOFF.h\"\n#include \"readTGF.h\"\n#include \"readWRL.h\"\n#include \"readCSV.h\"\n#include \"file_contents_as_string.h\"\n#include \"write_triangle_mesh.h\"\n#include \"writeDMAT.h\"\n#include \"writeMESH.h\"\n#include \"writeOBJ.h\"\n#include \"writeOFF.h\"\n#include \"writeTGF.h\"\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/IndexComparison.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_INDEXCOMPARISON_H\n#define IGL_INDEXCOMPARISON_H\n#include <iostream>\nnamespace igl{\n  // Comparison struct used by sort\n  // http://bytes.com/topic/c/answers/132045-sort-get-index\n\n  // For use with functions like std::sort\n  template<class T> struct IndexLessThan\n  {\n    IndexLessThan(const T arr) : arr(arr) {}\n    bool operator()(const size_t a, const size_t b) const\n    {\n      return arr[a] < arr[b];\n    }\n    const T arr;\n  };\n\n  // For use with functions like std::unique\n  template<class T> struct IndexEquals\n  {\n    IndexEquals(const T arr) : arr(arr) {}\n    bool operator()(const size_t a, const size_t b) const\n    {\n      return arr[a] == arr[b];\n    }\n    const T arr;\n  };\n\n  // For use with functions like std::sort\n  template<class T> struct IndexVectorLessThan\n  {\n    IndexVectorLessThan(const T & vec) : vec ( vec) {}\n    bool operator()(const size_t a, const size_t b) const\n    {\n      return vec(a) < vec(b);\n    }\n    const T & vec;\n  };\n\n  // For use with functions like std::sort\n  template<class T> struct IndexDimLessThan\n  {\n    IndexDimLessThan(const T & mat,const int & dim, const int & j) : \n      mat(mat),\n      dim(dim),\n      j(j)\n    {}\n    bool operator()(const size_t a, const size_t b) const\n    {\n      if(dim == 1)\n      {\n        return mat(a,j) < mat(b,j);\n      }else\n      {\n        return mat(j,a) < mat(j,b);\n      }\n    }\n    const T & mat;\n    const int & dim;\n    const int & j;\n  };\n\n  // For use with functions like std::sort\n  template<class T> struct IndexRowLessThan\n  {\n    IndexRowLessThan(const T & mat) : mat ( mat) {}\n    bool operator()(const size_t a, const size_t b) const\n    {\n      const int cols = mat.cols();\n      // Lexicographical order\n      for(int j = 0;j<cols;j++)\n      {\n        if(mat(a,j) > mat(b,j))\n        {\n          return false;\n        } else if(mat(a,j) < mat(b,j))\n        {\n          return true;\n        }\n      }\n      // equality is false\n      return false;\n    }\n    const T & mat;\n  };\n\n  // For use with functions like std::sort\n  template<class T> struct IndexRowEquals\n  {\n    IndexRowEquals(const T & mat) : mat ( mat) {}\n    bool operator()(const size_t a, const size_t b) const\n    {\n      const int cols = mat.cols();\n      // Lexicographical order\n      for(int j = 0;j<cols;j++)\n      {\n        if(mat(a,j) !=  mat(b,j))\n        {\n          return false;\n        }\n      }\n      return true;\n    }\n    const T & mat;\n  };\n\n}\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/LinSpaced.h",
    "content": "#ifndef IGL_LINSPACED_H\n#define IGL_LINSPACED_H\n#include <Eigen/Core>\n// This function is not intended to be a permanent function of libigl. Rather\n// it is a \"drop-in\" workaround for documented bug in Eigen:\n// http://eigen.tuxfamily.org/bz/show_bug.cgi?id=1383\n//\n// Replace: \n//\n//     Eigen::VectorXi::LinSpaced(size,low,high);\n//\n// With:\n//\n//     igl::LinSpaced<Eigen::VectorXi>(size,low,high);\n//\n// Specifcally, this version will _always_ return an empty vector if size==0,\n// regardless of the values for low and high. If size != 0, then this simply\n// returns the result of Eigen::Derived::LinSpaced.\n//\n// Until this bug is fixed, we should also avoid calls to the member function\n// `.setLinSpaced`. This means replacing:\n//\n//     a.setLinSpaced(size,low,high);\n//\n// with\n//\n//     a = igl::LinSpaced<decltype(a) >(size,low,high);\n//\nnamespace igl\n{\n  template <typename Derived>\n  inline typename Eigen::DenseBase< Derived >::RandomAccessLinSpacedReturnType LinSpaced(\n    typename Derived::Index size,\n    const typename Derived::Scalar & low,\n    const typename Derived::Scalar & high);\n}\n\n// Implementation\n\ntemplate <typename Derived>\ninline typename Eigen::DenseBase< Derived >::RandomAccessLinSpacedReturnType \nigl::LinSpaced(\n  typename Derived::Index size,\n  const typename Derived::Scalar & low,\n  const typename Derived::Scalar & high)\n{\n  if(size == 0)\n  {\n    // Force empty vector with correct \"RandomAccessLinSpacedReturnType\" type.\n    return Derived::LinSpaced(0,0,1);\n  }else\n  {\n    return Derived::LinSpaced(size,low,high);\n  }\n}\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/MCTables.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                                IsoEx                                      *\n *        Copyright (C) 2002 by Computer Graphics Group, RWTH Aachen         *\n *                         www.rwth-graphics.de                              *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *                                                                           *\n *                                License                                    *\n *                                                                           *\n *  This library is free software; you can redistribute it and/or modify it  *\n *  under the terms of the GNU Library General Public License as published   *\n *  by the Free Software Foundation, version 2.                              *\n *                                                                           *\n *  This library is distributed in the hope that it will be useful, but      *\n *  WITHOUT ANY WARRANTY; without even the implied warranty of               *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU        *\n *  Library General Public License for more details.                         *\n *                                                                           *\n *  You should have received a copy of the GNU Library General Public        *\n *  License along with this library; if not, write to the Free Software      *\n *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.                *\n *                                                                           *\n \\*===========================================================================*/\n\n//=============================================================================\n#ifndef IGL_ISOEX_MC_TABLES_HH\n#define IGL_ISOEX_MC_TABLES_HH\n//=============================================================================\n\n\n//int edgeTable[256];\n//int triTable[256][2][17];\n//int polyTable[8][16];\n\nint edgeTable[256]=\n{\n  0x0  , 0x109, 0x203, 0x30a, 0x406, 0x50f, 0x605, 0x70c,\n  0x80c, 0x905, 0xa0f, 0xb06, 0xc0a, 0xd03, 0xe09, 0xf00,\n  0x190, 0x99 , 0x393, 0x29a, 0x596, 0x49f, 0x795, 0x69c,\n  0x99c, 0x895, 0xb9f, 0xa96, 0xd9a, 0xc93, 0xf99, 0xe90,\n  0x230, 0x339, 0x33 , 0x13a, 0x636, 0x73f, 0x435, 0x53c,\n  0xa3c, 0xb35, 0x83f, 0x936, 0xe3a, 0xf33, 0xc39, 0xd30,\n  0x3a0, 0x2a9, 0x1a3, 0xaa , 0x7a6, 0x6af, 0x5a5, 0x4ac,\n  0xbac, 0xaa5, 0x9af, 0x8a6, 0xfaa, 0xea3, 0xda9, 0xca0,\n  0x460, 0x569, 0x663, 0x76a, 0x66 , 0x16f, 0x265, 0x36c,\n  0xc6c, 0xd65, 0xe6f, 0xf66, 0x86a, 0x963, 0xa69, 0xb60,\n  0x5f0, 0x4f9, 0x7f3, 0x6fa, 0x1f6, 0xff , 0x3f5, 0x2fc,\n  0xdfc, 0xcf5, 0xfff, 0xef6, 0x9fa, 0x8f3, 0xbf9, 0xaf0,\n  0x650, 0x759, 0x453, 0x55a, 0x256, 0x35f, 0x55 , 0x15c,\n  0xe5c, 0xf55, 0xc5f, 0xd56, 0xa5a, 0xb53, 0x859, 0x950,\n  0x7c0, 0x6c9, 0x5c3, 0x4ca, 0x3c6, 0x2cf, 0x1c5, 0xcc ,\n  0xfcc, 0xec5, 0xdcf, 0xcc6, 0xbca, 0xac3, 0x9c9, 0x8c0,\n  0x8c0, 0x9c9, 0xac3, 0xbca, 0xcc6, 0xdcf, 0xec5, 0xfcc,\n  0xcc , 0x1c5, 0x2cf, 0x3c6, 0x4ca, 0x5c3, 0x6c9, 0x7c0,\n  0x950, 0x859, 0xb53, 0xa5a, 0xd56, 0xc5f, 0xf55, 0xe5c,\n  0x15c, 0x55 , 0x35f, 0x256, 0x55a, 0x453, 0x759, 0x650,\n  0xaf0, 0xbf9, 0x8f3, 0x9fa, 0xef6, 0xfff, 0xcf5, 0xdfc,\n  0x2fc, 0x3f5, 0xff , 0x1f6, 0x6fa, 0x7f3, 0x4f9, 0x5f0,\n  0xb60, 0xa69, 0x963, 0x86a, 0xf66, 0xe6f, 0xd65, 0xc6c,\n  0x36c, 0x265, 0x16f, 0x66 , 0x76a, 0x663, 0x569, 0x460,\n  0xca0, 0xda9, 0xea3, 0xfaa, 0x8a6, 0x9af, 0xaa5, 0xbac,\n  0x4ac, 0x5a5, 0x6af, 0x7a6, 0xaa , 0x1a3, 0x2a9, 0x3a0,\n  0xd30, 0xc39, 0xf33, 0xe3a, 0x936, 0x83f, 0xb35, 0xa3c,\n  0x53c, 0x435, 0x73f, 0x636, 0x13a, 0x33 , 0x339, 0x230,\n  0xe90, 0xf99, 0xc93, 0xd9a, 0xa96, 0xb9f, 0x895, 0x99c,\n  0x69c, 0x795, 0x49f, 0x596, 0x29a, 0x393, 0x99 , 0x190,\n  0xf00, 0xe09, 0xd03, 0xc0a, 0xb06, 0xa0f, 0x905, 0x80c,\n  0x70c, 0x605, 0x50f, 0x406, 0x30a, 0x203, 0x109, 0x0   \n};\n\n\n//-----------------------------------------------------------------------------\n\n\nint triTable[256][2][17] =\n{{{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n  { 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 3, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 3, 0,  1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 8, 3, 9, 8, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4, 1, 9, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 3, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 8, 3, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 3, 3, 0, 8,  3,  1,  2, 10, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 2, 10, 0, 2, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4, 2, 10, 9, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{2, 8, 3, 2, 10, 8, 10, 9, 8, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 10,  9, 8,  3, 2 , -1,-1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1,  3, 3, 11,  2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 11, 2, 8, 11, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1,  4, 0, 8, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 10 */\n  {{1, 9, 0, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 3, 3, 1, 9, 0, 2, 3,11, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 11, 2, 1, 9, 11, 9, 8, 11, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1,  5, 9, 8, 11, 2, 1,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{3, 10, 1, 11, 10, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1,  4, 3, 11,10, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 10, 1, 0, 8, 10, 8, 11, 10, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1,  5, 8, 11, 10, 1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{3, 9, 0, 3, 11, 9, 11, 10, 9, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 11,10,  9, 0, 3, -1,-1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 15 */\n  {{9, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4,  8, 11, 10, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 3, 4,  7,  8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{4, 3, 0, 7, 3, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4, 4, 7, 3, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 1, 9, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 3, 3, 0, 1, 9,  8,  4,  7, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{4, 1, 9, 4, 7, 1, 7, 3, 1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 7, 3, 1, 9, 4,  -1,-1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 20 */\n  {{1, 2, 10, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 3,  3, 1, 2,10,  8,  4,  7, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{3, 4, 7, 3, 0, 4, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 4, 3, 3, 0, 4, 7, 1,  2, 10, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 2, 10, 9, 0, 2, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 4,  3, 2,10, 9, 0, 8, 4,  7, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{2, 10, 9, 2, 9, 7, 2, 7, 3, 7, 9, 4, -1, -1, -1, -1, -1},\n    {1,  6, 7, 3, 2,10, 9, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{8, 4, 7, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 3, 3, 8,  4, 7,  3, 11,  2, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 25 */\n  {{11, 4, 7, 11, 2, 4, 2, 0, 4, -1, -1, -1, -1, -1, -1, -1, -1},\n    { 1, 5, 2, 0,  4, 7,11,-1,-1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 0, 1, 8, 4, 7, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1},\n    {3, 3, 3, 3, 9, 0, 1, 8,  4,  7,  2,  3, 11, -1, -1, -1, -1}},\n  \n  {{4, 7, 11, 9, 4, 11, 9, 11, 2, 9, 2, 1, -1, -1, -1, -1, -1},\n    {2, 4, 4, 2, 1, 9, 11, 11,9,4,7, -1, -1, -1, -1, -1 ,-1}},\n  \n  {{3, 10, 1, 3, 11, 10, 7, 8, 4, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2,  4, 3, 3, 11,10, 1,  7, 8,  4, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 11, 10, 1, 4, 11, 1, 0, 4, 7, 11, 4, -1, -1, -1, -1, -1},\n    {1,  6,  1, 0, 4,  7,11,10, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 30 */\n  {{4, 7, 8, 9, 0, 11, 9, 11, 10, 11, 0, 3, -1, -1, -1, -1, -1},\n    {2, 3, 5, 4, 7,  8, 0,  3, 11, 10, 9, -1, -1, -1, -1, -1, -1}},\n  \n  {{4, 7, 11, 4, 11, 9, 9, 11, 10, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5,  4,  7,11,10, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 3, 9,  5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 5, 4, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 3, 3, 9, 5, 4,  0,  8,  3, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 5, 4, 1, 5, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4, 0, 1, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 35 */\n  {{8, 5, 4, 8, 3, 5, 3, 1, 5, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 3, 1, 5, 4, 8,-1,-1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 2, 10, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 3,  3, 1, 2,10,  9,  5,  4, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{3, 0, 8, 1, 2, 10, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1, -1},\n    {3, 3, 3, 3, 3,  0, 8, 1, 2, 10,  4,  9,  5, -1, -1, -1, -1}},\n  \n  {{5, 2, 10, 5, 4, 2, 4, 0, 2, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5,  4, 0, 2,10, 5,-1,-1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{2, 10, 5, 3, 2, 5, 3, 5, 4, 3, 4, 8, -1, -1, -1, -1, -1},\n    {2,  4, 4, 2, 10, 5, 3, 4, 8, 3, 5, -1, -1, -1, -1, -1, -1}},\n  \n  /* 40 */\n  {{9, 5, 4, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 3, 3, 9, 5,  4,  2,  3, 11, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 11, 2, 0, 8, 11, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2,  4, 3, 0, 8, 11, 2, 4, 9,  5, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 5, 4, 0, 1, 5, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 4, 3, 0, 1, 5, 4, 2,  3, 11, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{2, 1, 5, 2, 5, 8, 2, 8, 11, 4, 8, 5, -1, -1, -1, -1, -1},\n    {1, 6, 2, 1, 5, 4, 8,11, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{10, 3, 11, 10, 1, 3, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1},\n    { 2, 4,  3,  3,11,10, 1, 9, 5,  4, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 45 */\n  {{4, 9, 5, 0, 8, 1, 8, 10, 1, 8, 11, 10, -1, -1, -1, -1, -1},\n    {2, 3, 5, 4, 9, 5, 1,  0, 8,11, 10, -1, -1, -1, -1, -1, -1}},\n  \n  {{5, 4, 0, 5, 0, 11, 5, 11, 10, 11, 0, 3, -1, -1, -1, -1, -1},\n    {1, 6, 5, 4, 0,  3,11, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{5, 4, 8, 5, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 5, 4, 8, 11, 10,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 7, 8, 5, 7, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4, 7, 8, 9, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 3, 0, 9, 5, 3, 5, 7, 3, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 5, 7, 3, 0, 9,-1,-1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 50 */\n  {{0, 7, 8, 0, 1, 7, 1, 5, 7, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 1, 5, 7, 8, 0,-1,-1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4, 3, 1, 5, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 7, 8, 9, 5, 7, 10, 1, 2, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 4, 3, 7, 8, 9,  5,10, 1,  2, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{10, 1, 2, 9, 5, 0, 5, 3, 0, 5, 7, 3, -1, -1, -1, -1, -1},\n    { 2, 3, 5,10, 1, 2, 0, 9, 5, 7, 3,-1, -1, -1, -1, -1, -1}},\n  \n  {{8, 0, 2, 8, 2, 5, 8, 5, 7, 10, 5, 2, -1, -1, -1, -1, -1},\n    {1, 6, 2,10, 5, 7, 8, 0,-1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 55 */\n  {{2, 10, 5, 2, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1,  5, 2,10, 5, 7, 3,-1,-1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{7, 9, 5, 7, 8, 9, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 4, 3, 7, 8, 9, 5,  3,11,  2, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 5, 7, 9, 7, 2, 9, 2, 0, 2, 7, 11, -1, -1, -1, -1, -1},\n    {1, 6, 2, 0, 9, 5, 7,11, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{2, 3, 11, 0, 1, 8, 1, 7, 8, 1, 5, 7, -1, -1, -1, -1, -1},\n    {2, 3,  5, 2, 3,11, 8, 0, 1, 5, 7, -1, -1, -1, -1, -1, -1}},\n  \n  {{11, 2, 1, 11, 1, 7, 7, 1, 5, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1,  5,11, 2, 1, 5, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 60 */\n  {{9, 5, 8, 8, 5, 7, 10, 1, 3, 10, 3, 11, -1, -1, -1, -1, -1},\n    {2, 4, 4, 3,11, 10, 1, 5, 7,  8, 9, -1, -1, -1, -1, -1, -1}},\n  \n  {{5, 7, 0, 5, 0, 9, 7, 11, 0, 1, 0, 10, 11, 10, 0, -1, -1},\n    {1, 7, 5, 7, 11,10, 1, 0, 9, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{11, 10, 0, 11, 0, 3, 10, 5, 0, 8, 0, 7, 5, 7, 0, -1, -1},\n    {1, 7, 11,10,5, 7, 8, 0,3, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{11, 10, 5, 7, 11, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    { 1,  4, 5, 7, 11,10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    { 1, 3,10,  6,  5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 65 */\n  {{0, 8, 3, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 3, 3, 0,  8, 3,  5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 0, 1, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 3, 3, 9,  0, 1,  5, 10,  6, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 8, 3, 1, 9, 8, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 4, 3, 1, 9, 8, 3,  5,10,  6, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 6, 5, 2, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4, 1, 2, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 6, 5, 1, 2, 6, 3, 0, 8, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 4, 3, 1, 2, 6, 5, 3, 0,  8, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 70 */\n  {{9, 6, 5, 9, 0, 6, 0, 2, 6, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 0, 2, 6, 5, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{5, 9, 8, 5, 8, 2, 5, 2, 6, 3, 2, 8, -1, -1, -1, -1, -1},\n    {1, 6, 2, 6, 5, 9, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{2, 3, 11, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 3,  3,  2, 3,11, 10,  6,  5, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{11, 0, 8, 11, 2, 0, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1},\n    { 2, 4, 3,  0, 8, 11, 2, 10, 6,  5, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 1, 9, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1},\n    {3, 3, 3, 3, 0,  1, 9,  2, 3, 11,  5, 10,  6, -1, -1, -1, -1}},\n  \n  /* 75 */\n  {{5, 10, 6, 1, 9, 2, 9, 11, 2, 9, 8, 11, -1, -1, -1, -1, -1},\n    {2, 3,  5, 5,10, 6, 2,  1, 9, 8,11, -1, -1, -1, -1, -1, -1}},\n  \n  {{6, 3, 11, 6, 5, 3, 5, 1, 3, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5,  5, 1, 3, 11,6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 8, 11, 0, 11, 5, 0, 5, 1, 5, 11, 6, -1, -1, -1, -1, -1},\n    {1, 6,  5, 1,  0, 8,11, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{3, 11, 6, 0, 3, 6, 0, 6, 5, 0, 5, 9, -1, -1, -1, -1, -1},\n    {2,  4, 4, 3, 11, 6, 0, 5, 9, 0, 6, -1, -1, -1, -1}},\n  \n  {{6, 5, 9, 6, 9, 11, 11, 9, 8, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 6, 5, 9,  8, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 80 */\n  {{5, 10, 6, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2,  3, 3, 5,10, 6,  4,  7,  8, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{4, 3, 0, 4, 7, 3, 6, 5, 10, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 4, 3, 4, 7, 3, 0, 6,  5, 10, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 9, 0, 5, 10, 6, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1},\n    {3, 3, 3, 3,  1, 9, 0, 5,10,  6,  8,  4,  7, -1, -1, -1, -1}},\n  \n  {{10, 6, 5, 1, 9, 7, 1, 7, 3, 7, 9, 4, -1, -1, -1, -1, -1},\n    { 2, 3, 5,10, 6, 5, 9, 4, 7, 3, 1,-1, -1, -1, -1, -1, -1}},\n  \n  {{6, 1, 2, 6, 5, 1, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 4, 3, 1, 2, 6, 5, 4, 7,  8, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 85 */\n  {{1, 2, 5, 5, 2, 6, 3, 0, 4, 3, 4, 7, -1, -1, -1, -1, -1},\n    {2, 4, 4, 2, 6, 5, 1, 3, 0, 4, 7, -1, -1, -1, -1, -1, -1}},\n  \n  {{8, 4, 7, 9, 0, 5, 0, 6, 5, 0, 2, 6, -1, -1, -1, -1, -1},\n    {2, 3, 5, 8, 4, 7, 5, 9, 0, 2, 6, -1, -1, -1, -1, -1, -1}},\n  \n  {{7, 3, 9, 7, 9, 4, 3, 2, 9, 5, 9, 6, 2, 6, 9, -1, -1},\n    {1, 7, 7, 3, 2, 6, 5, 9, 4,-1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{3, 11, 2, 7, 8, 4, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1},\n    {3,  3, 3, 3, 3,11,  2, 7, 8,  4, 10,  6,  5, -1, -1, -1, -1}},\n  \n  {{5, 10, 6, 4, 7, 2, 4, 2, 0, 2, 7, 11, -1, -1, -1, -1, -1},\n    {2,  3, 5, 5,10, 6, 7,11, 2, 0, 4, -1, -1, -1, -1, -1, -1}},\n  \n  /* 90 */\n  {{0, 1, 9, 4, 7, 8, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1, -1},\n    {4, 3, 3, 3, 3, 0, 1, 9,  4, 7,  8, 2,  3, 11, 5, 10, 6}},\n  \n  {{9, 2, 1, 9, 11, 2, 9, 4, 11, 7, 11, 4, 5, 10, 6, -1, -1},\n    {3, 4, 4, 3, 2, 1,  9,11, 4, 7, 11, 9, 5, 10, 6,  -1, -1}},\n  \n  {{8, 4, 7, 3, 11, 5, 3, 5, 1, 5, 11, 6, -1, -1, -1, -1, -1},\n    {2, 3, 5, 8,  4, 7, 11, 6, 5, 1, 3, -1, -1, -1, -1, -1, -1}},\n  \n  {{5, 1, 11, 5, 11, 6, 1, 0, 11, 7, 11, 4, 0, 4, 11, -1, -1},\n    {1, 7,  5, 1, 0,  4, 7,11, 6,  -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 5, 9, 0, 6, 5, 0, 3, 6, 11, 6, 3, 8, 4, 7, -1, -1},\n    {3, 4, 4, 3, 0, 6, 5, 9, 3, 11, 6, 0, 8, 4, 7, -1, -1}},\n  \n  /* 95 */\n  {{6, 5, 9, 6, 9, 11, 4, 7, 9, 7, 11, 9, -1, -1, -1, -1, -1},\n    {2, 4, 4, 9, 4, 7, 11, 6, 5, 9, 11,-1, -1, -1, -1, -1, -1}},\n  \n  {{10, 4, 9, 6, 4, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    { 1, 4, 4, 9, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{4, 10, 6, 4, 9, 10, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2,  4, 3, 4,  9,10, 6, 0, 8,  3, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{10, 0,  1, 10, 6, 0, 6, 4, 0, -1, -1, -1, -1, -1, -1, -1, -1},\n    { 1, 5,  6, 4, 0, 1, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{8, 3, 1, 8, 1, 6, 8, 6, 4, 6, 1, 10, -1, -1, -1, -1, -1},\n    {1, 6, 1,10, 6, 4, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 100 */\n  {{1, 4, 9, 1, 2, 4, 2, 6, 4, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 2, 6, 4, 9, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{3, 0, 8, 1, 2, 9, 2, 4, 9, 2, 6, 4, -1, -1, -1, -1, -1},\n    {2, 3, 5, 3, 0, 8, 9, 1, 2, 6, 4, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4, 2, 6, 4, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{8, 3, 2, 8, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 8, 3, 2, 6, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{10, 4, 9, 10, 6, 4, 11, 2, 3, -1, -1, -1, -1, -1, -1, -1, -1},\n    { 2, 4, 3, 10, 6, 4,  9,11, 2,  3, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 105 */\n  {{0, 8, 2, 2, 8, 11, 4, 9, 10, 4, 10, 6, -1, -1, -1, -1, -1},\n    {2, 4, 4, 2, 11, 8, 0, 10,  6, 4,  9, -1, -1, -1, -1, -1, -1}},\n  \n  {{3, 11, 2, 0, 1, 6, 0, 6, 4, 6, 1, 10, -1, -1, -1, -1, -1},\n    {2,  3, 5, 3,11, 2, 1, 10,6, 4, 0, -1, -1, -1, -1, -1, -1}},\n  \n  {{6, 4, 1, 6, 1, 10, 4, 8, 1, 2, 1, 11, 8, 11, 1, -1, -1},\n    {1, 7, 6, 4, 8,11, 2,  1,10, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 6, 4, 9, 3, 6, 9, 1, 3, 11, 6, 3, -1, -1, -1, -1, -1},\n    {1, 6, 3,11, 6, 4, 9, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{8, 11, 1, 8, 1, 0, 11, 6, 1, 9, 1, 4, 6, 4, 1, -1, -1},\n    {1,  7, 8,11, 6, 4,  9, 1, 0, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 110 */\n  {{3, 11, 6, 3, 6, 0, 0, 6, 4, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1,  5, 3,11, 6, 4, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{6, 4, 8, 11, 6, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4, 8, 11, 6, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{7, 10, 6, 7, 8, 10, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1,  5, 8,  9,10, 6, 7,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 7, 3, 0, 10,  7, 0, 9, 10, 6, 7, 10, -1, -1, -1, -1, -1},\n    {1, 6, 0, 9, 10,  6, 7, 3, -1,-1,-1, -1, -1, -1, -1, -1, -1}},\n  \n  {{10, 6, 7, 1, 10, 7, 1, 7,  8, 1, 8, 0, -1, -1, -1, -1, -1},\n    { 2, 4, 4, 8, 0, 1,  7, 10, 6, 7, 1,-1, -1, -1, -1, -1, -1}},\n  \n  /* 115 */\n  {{10, 6, 7, 10, 7, 1, 1, 7, 3, -1, -1, -1, -1, -1, -1, -1, -1},\n    { 1, 5, 10, 6, 7, 3, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 2, 6, 1, 6, 8, 1, 8, 9, 8, 6, 7, -1, -1, -1, -1, -1},\n    {1, 6, 1, 2, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{2, 6, 9, 2, 9, 1, 6, 7, 9, 0, 9, 3, 7, 3, 9, -1, -1},\n    {1, 7, 2, 6, 7, 3, 0, 9, 1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{7, 8, 0, 7, 0, 6, 6, 0, 2, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 7, 8, 0, 2, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{7, 3, 2, 6, 7, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4, 7, 3, 2, 6,  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 120 */\n  {{2, 3, 11, 10, 6, 8, 10, 8, 9, 8, 6, 7, -1, -1, -1, -1, -1},\n    {2, 3,  5,  2, 3,11,  6, 7, 8, 9,10, -1, -1, -1, -1, -1, -1}},\n  \n  {{2, 0, 7, 2, 7, 11, 0, 9, 7, 6, 7, 10, 9, 10, 7, -1, -1},\n    {1, 7, 2, 0, 9,10,6, 7, 11, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 8, 0, 1, 7, 8, 1, 10, 7, 6, 7, 10, 2, 3, 11, -1, -1},\n    {3, 4, 4, 3, 8, 0, 1, 7, 10, 6, 7, 1, 11, 2, 3, -1, -1}},\n  \n  {{11, 2, 1, 11, 1, 7, 10, 6, 1, 6, 7, 1, -1, -1, -1, -1, -1},\n    { 2, 4, 4, 11, 2,  1,7, 1, 10, 6, 7,-1, -1, -1, -1, -1, -1}},\n  \n  {{8, 9, 6, 8, 6, 7, 9, 1, 6, 11, 6, 3, 1, 3, 6, -1, -1},\n    {1, 7, 8, 9, 1, 3, 11, 6, 7,-1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 125 */\n  {{0, 9, 1, 11, 6, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 3, 3,  0, 9, 1, 11,  6,  7, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{7, 8, 0, 7, 0, 6, 3, 11, 0, 11, 6, 0, -1, -1, -1, -1, -1},\n    {2, 4, 4, 0, 3,11, 6, 7,  8, 0, 6, -1, -1, -1, -1, -1, -1}},\n  \n  {{7, 11, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 3,  7, 11,  6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 3,  7,  6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{3, 0, 8, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 3, 3,  3, 0, 8, 11,  7,  6, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 130 */\n  {{0, 1, 9, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 3, 3,  0, 1, 9, 11,  7,  6, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{8, 1, 9, 8, 3, 1, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 4, 3, 1, 9,  8, 3,11, 7,  6, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{10, 1, 2, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    { 2, 3, 3,10,  1, 2,  6, 11,  7, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 2, 10, 3, 0, 8, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1, -1},\n    {3, 3,  3, 3, 1, 2,10,  3, 0,  8,  6, 11,  7, -1, -1, -1, -1}},\n  \n  {{2, 9, 0, 2, 10, 9, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 4, 3, 2, 10, 9, 0, 6, 11,  7, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 135 */\n  {{6, 11, 7, 2, 10, 3, 10, 8, 3, 10, 9, 8, -1, -1, -1, -1, -1},\n    {2,  3, 5, 6, 11, 7,  3, 2,10,  9, 8, -1, -1, -1, -1, -1, -1}},\n  \n  {{7, 2, 3, 6, 2, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4, 2, 3, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{7, 0, 8, 7, 6, 0, 6, 2, 0, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 6, 2, 0, 8, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{2, 7, 6, 2, 3, 7, 0, 1, 9, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 4, 3, 2, 3, 7, 6, 0, 1,  9, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 6, 2, 1, 8, 6, 1, 9, 8, 8, 7, 6, -1, -1, -1, -1, -1},\n    {1, 6, 6, 2, 1, 9, 8, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 140 */\n  {{10, 7, 6, 10, 1, 7, 1, 3, 7, -1, -1, -1, -1, -1, -1, -1, -1},\n    { 1, 5, 1,  3, 7, 6,10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{10, 7, 6, 1, 7, 10, 1, 8, 7, 1, 0, 8, -1, -1, -1, -1, -1},\n    { 2, 4, 4, 10, 1, 7, 6,  8, 7, 1, 0,-1, -1, -1, -1, -1, -1}},\n  \n  {{0, 3, 7, 0, 7, 10, 0, 10, 9, 6, 10, 7, -1, -1, -1, -1, -1},\n    {1, 6,10, 9, 0, 3,  7, 6,-1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{7, 6, 10, 7, 10, 8, 8, 10, 9, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5,  7, 6, 10, 9, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{6, 8, 4, 11, 8, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4, 6, 11, 8, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 145 */\n  {{3, 6, 11, 3, 0, 6, 0, 4, 6, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5,  0, 4, 6,11, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{8, 6, 11, 8, 4, 6, 9, 0, 1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 4,  3, 6,11, 8, 4, 9, 0,  1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 4, 6, 9, 6, 3, 9, 3, 1, 11, 3, 6, -1, -1, -1, -1, -1},\n    {1, 6, 6,11, 3, 1, 9, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{6, 8, 4, 6, 11, 8, 2, 10,  1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 4, 3, 6, 11, 8, 4,  2, 10,  1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 2, 10, 3, 0, 11, 0, 6, 11, 0, 4, 6, -1, -1, -1, -1, -1},\n    {2, 3,  5, 1, 2, 10,11, 3,0,4, 6, -1, -1, -1, -1, -1, -1}},\n  \n  /* 150 */\n  {{4, 11, 8, 4, 6, 11, 0, 2, 9, 2, 10, 9, -1, -1, -1, -1, -1},\n    {2,  4, 4, 4, 6, 11, 8, 2,10, 9,  0, -1, -1, -1, -1, -1, -1}},\n  \n  {{10, 9, 3, 10, 3, 2, 9, 4, 3, 11, 3, 6, 4, 6, 3, -1, -1},\n    {1,  7, 10,9, 4, 6, 11, 3, 2, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{8, 2, 3, 8, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 4, 6, 2, 3, 8,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4, 4, 6, 2, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 9, 0, 2, 3, 4, 2, 4, 6, 4, 3, 8, -1, -1, -1, -1, -1},\n    {2, 3, 5, 1, 9, 0, 3, 8, 4, 6, 2, -1, -1, -1, -1, -1, -1}},\n  \n  /* 155 */\n  {{1, 9, 4, 1, 4, 2, 2, 4, 6, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 1, 9, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{8, 1, 3, 8, 6, 1, 8, 4, 6, 6, 10, 1, -1, -1, -1, -1, -1},\n    {1, 6, 1, 3, 8, 4, 6,10, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{10, 1, 0, 10, 0, 6, 6, 0, 4, -1, -1, -1, -1, -1, -1, -1, -1},\n    { 1, 5,10, 1,0,4,6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{4, 6, 3, 4, 3, 8, 6, 10, 3, 0, 3, 9, 10, 9, 3, -1, -1},\n    {1, 7, 4, 6, 10, 9, 0,3, 8, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{10, 9, 4, 6, 10, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    { 1, 4, 4, 6, 10, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 160 */\n  {{4, 9, 5, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 3, 3, 4, 9,  5,  7,  6, 11, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 8, 3, 4, 9, 5, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1},\n    {3, 3, 3, 3, 0, 8,  3, 4, 9,  5, 11,  7,  6, -1, -1, -1, -1}},\n  \n  {{5, 0, 1, 5, 4, 0, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 4, 3, 0, 1, 5, 4, 7,  6, 11, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{11, 7, 6, 8, 3, 4, 3, 5, 4, 3, 1, 5, -1, -1, -1, -1, -1},\n    { 2, 3, 5,11, 7, 6, 4, 8, 3, 1, 5,-1, -1, -1, -1, -1, -1}},\n  \n  {{9, 5, 4, 10, 1, 2, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1},\n    {3, 3, 3,  3, 9, 5, 4,10,  1,  2,  7,  6, 11, -1, -1, -1, -1}},\n  \n  /* 165 */\n  {{6, 11, 7, 1, 2, 10, 0, 8, 3, 4, 9, 5, -1, -1, -1, -1, -1},\n    {4,  3, 3, 3, 3,  6,11, 7, 1, 2,10, 0,  8,  3,  4,  9, 5}},\n  \n  {{7, 6, 11, 5, 4, 10, 4, 2, 10, 4, 0, 2, -1, -1, -1, -1, -1},\n    {2, 3, 5,  7, 6, 11, 10, 5, 4, 0, 2,-1, -1, -1, -1, -1, -1}},\n  \n  {{3, 4, 8, 3, 5, 4, 3, 2, 5, 10, 5, 2, 11, 7, 6, -1, -1},\n    {3, 4, 4, 3, 5, 3, 2,10, 4, 8, 3, 5, 6, 11, 7, 6, -1}},\n  \n  {{7, 2, 3, 7, 6, 2, 5, 4, 9, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 4, 3, 2, 3, 7, 6, 5, 4,  9, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 5, 4, 0, 8, 6, 0, 6, 2, 6, 8, 7, -1, -1, -1, -1, -1},\n    {2, 3, 5, 9, 5, 4, 8, 7, 6, 2, 0, -1, -1, -1, -1, -1, -1}},\n  \n  /* 170 */\n  {{3, 6, 2, 3, 7, 6, 1, 5, 0, 5, 4, 0, -1, -1, -1, -1, -1},\n    {2, 4, 4, 3, 7, 6, 2, 0, 1, 5, 4, -1, -1, -1, -1, -1, -1}},\n  \n  {{6, 2, 8, 6, 8, 7, 2, 1, 8, 4, 8, 5, 1, 5, 8, -1, -1},\n    {1, 7, 6, 2, 1, 5, 4, 8, 7,-1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 5, 4, 10, 1, 6, 1, 7, 6, 1, 3, 7, -1, -1, -1, -1, -1},\n    {2, 3, 5,  9, 5, 4, 6,10, 1, 3, 7,-1, -1, -1, -1, -1, -1}},\n  \n  {{1, 6, 10, 1, 7, 6, 1, 0, 7, 8, 7, 0, 9, 5, 4, -1, -1},\n    {3, 4, 4, 3, 0, 8, 7, 1, 6, 10, 1, 7, 9, 5, 4, -1, -1}},\n  \n  {{4, 0, 10, 4, 10, 5, 0, 3, 10, 6, 10, 7, 3, 7, 10, -1, -1},\n    {1, 7,  4, 0, 3, 7, 6, 10, 5, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 175 */\n  {{7, 6, 10, 7, 10, 8, 5, 4, 10, 4, 8, 10, -1, -1, -1, -1, -1},\n    {2, 4, 4, 4,  8, 10, 5, 7,  6,10, 8, -1, -1, -1, -1, -1, -1}},\n  \n  {{6, 9, 5, 6, 11, 9, 11, 8, 9, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5,11, 8, 9, 5, 6,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{3, 6, 11, 0, 6, 3, 0, 5, 6, 0, 9, 5, -1, -1, -1, -1, -1},\n    {2, 4, 4,  0, 9, 5, 6, 6,11, 3, 0, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 11, 8, 0, 5, 11, 0, 1, 5, 5, 6, 11, -1, -1, -1, -1, -1},\n    {1,  6, 0, 1, 5,  6,11, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{6, 11, 3, 6, 3, 5, 5, 3, 1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1,  5, 6,11, 3, 1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /*180 */\n  {{1, 2, 10, 9, 5, 11, 9, 11, 8, 11, 5, 6, -1, -1, -1, -1, -1},\n    {2, 3,  5, 1, 2, 10, 5,  6,11,  8, 9, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 11, 3, 0, 6, 11, 0, 9, 6, 5, 6, 9, 1, 2, 10, -1, -1},\n    {3,  4, 4, 3, 11, 3,0, 6, 9, 5, 6, 0, 2, 10, 1, 2, 10}},\n  \n  {{11, 8, 5, 11, 5, 6, 8, 0, 5, 10, 5, 2, 0, 2, 5, -1, -1},\n    { 1, 7,11, 8, 0, 2,10, 5, 6,-1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{6, 11, 3, 6, 3, 5, 2, 10, 3, 10, 5, 3, -1, -1, -1, -1, -1},\n    {2, 4,  4, 6,11, 3, 5, 10, 5,  3, 2, -1, -1, -1, -1, -1, -1}},\n  \n  {{5, 8, 9, 5, 2, 8, 5, 6, 2, 3, 8, 2, -1, -1, -1, -1, -1},\n    {1, 6, 2, 3, 8, 9, 5, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 185 */\n  {{9, 5, 6, 9, 6, 0, 0, 6, 2, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 9, 5, 6, 2, 0,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 5, 8, 1, 8, 0, 5, 6, 8, 3, 8, 2, 6, 2, 8, -1, -1},\n    {1, 7, 1, 5, 6, 2, 3, 8, 0, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 5, 6, 2, 1, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4, 1, 5, 6, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 3, 6, 1, 6, 10, 3, 8, 6, 5, 6, 9, 8, 9, 6, -1, -1},\n    {1, 7, 1, 3, 8,  9, 5, 6,10, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{10, 1, 0, 10, 0, 6, 9, 5, 0, 5, 6, 0, -1, -1, -1, -1, -1},\n    { 2, 4, 4, 5,  6, 0, 9, 10, 1, 0, 6, -1, -1, -1, -1, -1, -1}},\n  \n  /* 190 */\n  {{0, 3, 8, 5, 6, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 3, 3, 0, 3,  8,  5,  6, 10, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{10, 5, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    { 1, 3,10,  5,  6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{11, 5, 10, 7, 5, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    { 1, 4,  5,10, 11, 7,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{11, 5, 10, 11, 7, 5, 8, 3, 0, -1, -1, -1, -1, -1, -1, -1, -1},\n    { 2, 4,  3,  5,10,11, 7, 8, 3,  0, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{5, 11, 7, 5, 10, 11, 1, 9, 0, -1, -1, -1, -1, -1, -1, -1, -1},\n    { 2, 4, 3, 5, 10, 11, 7, 1, 9,  0, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 195 */\n  {{10, 7, 5, 10, 11, 7, 9, 8, 1, 8, 3, 1, -1, -1, -1, -1, -1},\n    { 2, 4, 4, 10, 11, 7, 5, 1, 9, 8, 3, -1, -1, -1, -1, -1, -1}},\n  \n  {{11, 1, 2, 11, 7, 1, 7, 5, 1, -1, -1, -1, -1, -1, -1, -1, -1},\n    { 1, 5, 7, 5, 1, 2,11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 8, 3, 1, 2, 7, 1, 7, 5, 7, 2, 11, -1, -1, -1, -1, -1},\n    {2, 3, 5, 0, 8, 3, 2,11, 7, 5,1, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 7, 5, 9, 2, 7, 9, 0, 2, 2, 11, 7, -1, -1, -1, -1, -1},\n    {1, 6, 2,11, 7, 5, 9, 0,-1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{7, 5, 2, 7, 2, 11, 5, 9, 2, 3, 2, 8, 9, 8, 2, -1, -1},\n    {1, 7, 7, 5, 9, 8, 3, 2,11,-1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 200 */\n  {{2, 5, 10, 2, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5,  3, 7, 5,10, 2,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{8, 2, 0, 8, 5, 2, 8, 7, 5, 10, 2, 5, -1, -1, -1, -1, -1},\n    {1, 6, 5,10, 2, 0, 8, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 0, 1, 5, 10, 3, 5, 3, 7, 3, 10, 2, -1, -1, -1, -1, -1},\n    {2, 3, 5, 9,  0, 1, 10, 2, 3, 7, 5, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 8, 2, 9, 2, 1, 8, 7, 2, 10, 2, 5, 7, 5, 2, -1, -1},\n    {1, 7, 9, 8, 7, 5,10, 2, 1,-1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4, 3, 7, 5, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 205 */\n  {{0, 8, 7, 0, 7, 1, 1, 7, 5, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 0, 8, 7, 5, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 0, 3, 9, 3, 5, 5, 3, 7, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 9, 0, 3, 7, 5,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 8, 7, 5, 9, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4, 7, 5, 9, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{5, 8, 4, 5, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 10,11, 8, 4, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{5, 0, 4, 5, 11, 0, 5, 10, 11, 11, 3, 0, -1, -1, -1, -1, -1},\n    {1, 6, 0, 4,  5,10,11,  3, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 210 */\n  {{0, 1, 9, 8, 4, 10, 8, 10, 11, 10, 4, 5, -1, -1, -1, -1, -1},\n    {2, 3, 5, 0, 1,  9, 4,  5, 10, 11, 8, -1, -1, -1, -1, -1, -1}},\n  \n  {{10, 11, 4, 10, 4, 5, 11, 3, 4, 9, 4, 1, 3, 1, 4, -1, -1},\n    { 1,  7,10, 11, 3, 1, 9,4, 5,-1, -1, -1, -1, -1, -1, -1}},\n  \n  {{2, 5, 1, 2, 8, 5, 2, 11, 8, 4, 5, 8, -1, -1, -1, -1, -1},\n    {1, 6, 2,11, 8, 4,  5, 1,-1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 4, 11, 0, 11, 3, 4, 5, 11, 2, 11, 1, 5, 1, 11, -1, -1},\n    {1, 7,  0, 4, 5, 1,  2, 11, 3,-1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 2, 5, 0, 5, 9, 2, 11, 5, 4, 5, 8, 11, 8, 5, -1, -1},\n    {1, 7, 0, 2,11, 8, 4,  5, 9, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 215 */\n  {{9, 4, 5, 2, 11, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 3, 3, 9,  4, 5,  2, 11,  3, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{2, 5, 10, 3, 5, 2, 3, 4, 5, 3, 8, 4, -1, -1, -1, -1, -1},\n    {2, 4, 4, 2, 3, 5, 10, 4, 5, 3, 8,-1, -1, -1, -1, -1, -1}},\n  \n  {{5, 10, 2, 5, 2, 4, 4, 2, 0, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1,  5, 5,10, 2, 0, 4,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{3, 10, 2, 3, 5, 10, 3, 8, 5, 4, 5, 8, 0, 1, 9, -1, -1},\n    {3,  4, 4, 3, 3, 5, 10, 2, 8, 4, 5, 3, 0, 1, 9, -1, -1}},\n  \n  {{5, 10, 2, 5, 2, 4, 1, 9, 2, 9, 4, 2, -1, -1, -1, -1, -1},\n    {1,  6,10, 2, 1, 9, 4, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 220 */\n  {{8, 4, 5, 8, 5, 3, 3, 5, 1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 8, 4, 5, 1, 3,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 4, 5, 1, 0, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4, 0, 4, 5, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{8, 4, 5, 8, 5, 3, 9, 0, 5, 0, 3, 5, -1, -1, -1, -1, -1},\n    {2, 4, 4, 0, 3, 5, 9, 8, 4, 5, 3, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 4, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 3, 9,  4,  5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{4, 11, 7, 4, 9, 11, 9, 10, 11, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1,  5, 9,10, 11, 7, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 225 */\n  {{0, 8, 3, 4, 9, 7, 9, 11, 7, 9, 10, 11, -1, -1, -1, -1, -1},\n    {2, 3, 5, 0, 8, 3, 7, 4, 9, 10, 11, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 10, 11, 1, 11, 4, 1, 4, 0, 7, 4, 11, -1, -1, -1, -1, -1},\n    {1,  6,  1, 10,11, 7, 4, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{3, 1, 4, 3, 4, 8, 1, 10, 4, 7, 4, 11, 10, 11, 4, -1, -1},\n    {1, 7, 3, 1,10,11, 7,  4, 8, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{4, 11, 7, 9, 11, 4, 9, 2, 11, 9, 1, 2, -1, -1, -1, -1, -1},\n    {2,  4, 4, 2, 11, 9, 1, 4, 9, 11, 7, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 7, 4, 9, 11, 7, 9, 1, 11, 2, 11, 1, 0, 8, 3, -1, -1},\n    {3, 4, 4, 3, 1, 2, 11, 9, 7, 4,  9,11,  8, 3, 0, 8, 3}},\n  \n  /* 230 */\n  {{11, 7, 4, 11, 4, 2, 2, 4, 0, -1, -1, -1, -1, -1, -1, -1, -1},\n    { 1, 5, 11, 7, 4, 0, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{11, 7, 4, 11, 4, 2, 8, 3, 4, 3, 2, 4, -1, -1, -1, -1, -1},\n    { 2, 4, 4, 11, 7, 4, 2, 3, 2, 4, 8,-1, -1, -1, -1, -1, -1}},\n  \n  {{2, 9, 10, 2, 7, 9, 2, 3, 7, 7, 4, 9, -1, -1, -1, -1, -1},\n    {1, 6,  2, 3, 7, 4, 9,10, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 10, 7, 9, 7, 4, 10, 2, 7, 8, 7, 0, 2, 0, 7, -1, -1},\n    {1,  7, 9,10, 2, 0, 8, 7, 4,-1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{3, 7, 10, 3, 10, 2, 7, 4, 10, 1, 10, 0, 4, 0, 10, -1, -1},\n    {1, 7,  3, 7, 4, 0, 1,10, 2, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 235 */\n  {{1, 10, 2, 8, 7, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2,  3, 3, 1,10, 2,  8,  7,  4, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{4, 9, 1, 4, 1, 7, 7, 1, 3, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 4, 9, 1, 3, 7,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{4, 9, 1, 4, 1, 7, 0, 8, 1, 8, 7, 1, -1, -1, -1, -1, -1},\n    {2, 4, 4, 8, 7, 1, 0, 4, 9, 1, 7, -1, -1, -1, -1, -1, -1}},\n  \n  {{4, 0, 3, 7, 4, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4, 3, 7, 4, 0,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{4, 8, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 3, 4,  8,  7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 240 */\n  {{9, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1,  4, 8,  9, 10,11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{3, 0, 9, 3, 9, 11, 11, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 3, 0, 9, 10, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 1, 10, 0, 10, 8, 8, 10, 11, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5,  0, 1, 10,11, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{3, 1, 10, 11, 3, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4,  3,  1,10, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 2, 11, 1, 11, 9, 9, 11, 8, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5,  1, 2, 11, 8, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 245 */\n  {{3, 0, 9, 3, 9, 11, 1, 2, 9, 2, 11, 9, -1, -1, -1, -1, -1},\n    {2, 4, 4, 2,11,  9, 1, 3, 0, 9, 11, -1, -1, -1, -1, -1,-1}},\n  \n  {{0, 2, 11, 8, 0, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4,  0, 2,11,  8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{3, 2, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 3,  3,  2, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{2, 3, 8, 2, 8, 10, 10, 8, 9, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 2, 3, 8,  9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 10, 2, 0, 9, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1,  4, 2, 0, 9,10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 250 */\n  {{2, 3, 8, 2, 8, 10, 0, 1, 8, 1, 10, 8, -1, -1, -1, -1, -1},\n    {2, 4, 4, 2, 3, 8, 10, 1, 10, 8, 0, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 10, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1,  3, 1, 10,  2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 3, 8, 9, 1, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4, 1, 3, 8, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 9, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 3, 0,  9,  1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 3, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 3, 0,  3,  8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    { 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}}\n};\n\n\n//-----------------------------------------------------------------------------\n\n\nint polyTable[8][16] =\n{\n  {-1},\n  {-1},\n  {-1},\n  {0, 1, 2, -1},\n  {0, 1, 2, 2, 3, 0, -1},\n  {0, 1, 2, 0, 2, 4, 4, 2, 3, -1},\n  {0, 1, 2, 2, 3, 4, 4, 5, 0, 0, 2, 4, -1},\n  {0, 1, 5, 0, 5, 6, 1, 2, 5, 4, 5, 3, 2, 3, 5, -1}\n};\n\n\n//=============================================================================\n\n\n//=============================================================================\n#endif // ISOEX_MC_TABLES_HH defined\n//=============================================================================\n"
  },
  {
    "path": "libs/libigl/include/igl/MeshBooleanType.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_MESH_BOOLEAN_TYPE_H\n#define IGL_MESH_BOOLEAN_TYPE_H\nnamespace igl\n{\n  enum MeshBooleanType\n  {\n    MESH_BOOLEAN_TYPE_UNION = 0,\n    MESH_BOOLEAN_TYPE_INTERSECT = 1,\n    MESH_BOOLEAN_TYPE_MINUS = 2,\n    MESH_BOOLEAN_TYPE_XOR = 3,\n    MESH_BOOLEAN_TYPE_RESOLVE = 4,\n    NUM_MESH_BOOLEAN_TYPES = 5\n  };\n};\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/MouseController.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_MOUSECONTROLLER_H\n#define IGL_MOUSECONTROLLER_H\n// Needs to be included before others\n#include <Eigen/StdVector>\n#include <igl/RotateWidget.h>\n#include <Eigen/Core>\n#include <Eigen/Geometry>\n#include <vector>\n\n// Class for control a skeletal FK rig with the mouse.\nnamespace igl\n{\n  class MouseController\n  {\n    public:\n      typedef Eigen::VectorXi VectorXb;\n      // Propogate selection to descendants so that selected bones and their\n      // subtrees are all selected.\n      //\n      // Input:\n      //   S  #S list of whether selected\n      //   P  #S list of bone parents\n      // Output:\n      //   T  #S list of whether selected\n      static inline void propogate_to_descendants_if(\n        const VectorXb & S,\n        const Eigen::VectorXi & P,\n        VectorXb & T);\n      // Create a matrix of colors for the selection and their descendants.\n      //\n      // Inputs:\n      //   selection  #S list of whether a bone is selected\n      //   selected_color  color for selected bones\n      //   unselected_color  color for unselected bones\n      // Outputs:\n      //   C  #P by 4 list of colors\n      static inline void color_if(\n        const VectorXb & S,\n        const Eigen::Vector4f & selected_color,\n        const Eigen::Vector4f & unselected_color,\n        Eigen::MatrixXf & C);\n    private:\n      // m_is_selecting  whether currently selecting \n      // m_selection  #m_rotations list of whether a bone is selected\n      // m_down_x  x-coordinate of mouse location at down\n      // m_down_y  y-coordinate 〃\n      // m_drag_x  x-coordinate of mouse location at drag\n      // m_drag_y  y-coordinate 〃\n      // m_widget  rotation widget for selected bone\n      // m_width  width of containing window\n      // m_height  height 〃\n      // m_rotations  list of rotations for each bone\n      // m_rotations_at_selection  list of rotations for each bone at time of\n      //   selection\n      // m_fk_rotations_at_selection  list of rotations for each bone at time of\n      //   selection\n      // m_root_enabled  Whether root is enabled\n      bool m_is_selecting;\n      VectorXb m_selection;\n      int m_down_x,m_down_y,m_drag_x,m_drag_y;\n      int m_width,m_height;\n      igl::RotateWidget m_widget;\n      Eigen::Quaterniond m_widget_rot_at_selection;\n      typedef std::vector<\n        Eigen::Quaterniond,\n        Eigen::aligned_allocator<Eigen::Quaterniond> > RotationList;\n      RotationList \n        m_rotations,m_rotations_at_selection,m_fk_rotations_at_selection;\n      bool m_root_enabled;\n    public:\n      MouseController();\n      // Returns const reference to m_selection\n      inline const VectorXb & selection() const{return m_selection;};\n      //                          〃 m_is_selecting\n      inline const bool & is_selecting() const{return m_is_selecting;}\n      inline bool is_widget_down() const{return m_widget.is_down();}\n      //                          〃 m_rotations\n      inline const RotationList & rotations() const{return m_rotations;}\n      // Returns non-const reference to m_root_enabled\n      inline bool & root_enabled(){ return m_root_enabled;}\n      inline void reshape(const int w, const int h);\n      // Process down, drag, up mouse events\n      //\n      // Inputs:\n      //   x  x-coordinate of mouse click with respect to container\n      //   y  y-coordinate 〃 \n      // Returns true if accepted (action taken).\n      inline bool down(const int x, const int y);\n      inline bool drag(const int x, const int y);\n      inline bool up(const int x, const int y);\n      // Draw selection box and widget\n      inline void draw() const;\n      // Set `m_selection` based on the last drag selection and initialize\n      // widget.\n      //\n      // Inputs:\n      //   C  #C by dim list of joint positions at rest\n      //   BE  #BE by 2 list of bone indices at rest\n      //   P  #P list of bone parents\n      inline void set_selection_from_last_drag(\n        const Eigen::MatrixXd & C,\n        const Eigen::MatrixXi & BE,\n        const Eigen::VectorXi & P,\n        const Eigen::VectorXi & RP);\n      // Set from explicit selection\n      inline void set_selection(\n        const Eigen::VectorXi & S,\n        const Eigen::MatrixXd & C,\n        const Eigen::MatrixXi & BE,\n        const Eigen::VectorXi & P,\n        const Eigen::VectorXi & RP);\n      // Set size of skeleton\n      //\n      // Inputs:\n      //  n  number of bones\n      inline void set_size(const int n);\n      // Resets m_rotation elements to identity\n      inline void reset_rotations();\n      inline void reset_selected_rotations();\n      inline bool set_rotations(const RotationList & vQ);\n      // Sets all entries in m_selection to false\n      inline void clear_selection();\n      // Returns true iff some element in m_selection is true\n      inline bool any_selection() const;\n    public:\n        EIGEN_MAKE_ALIGNED_OPERATOR_NEW\n  };\n}\n\n// Implementation\n#include <igl/line_segment_in_rectangle.h>\n#include <igl/draw_rectangular_marquee.h>\n#include <igl/project.h>\n#include <igl/forward_kinematics.h>\n#include <igl/matlab_format.h>\n#include <igl/any_of.h>\n#include <iostream>\n#include <algorithm>\n#include <functional>\n\ninline void igl::MouseController::propogate_to_descendants_if(\n  const VectorXb & S,\n  const Eigen::VectorXi & P,\n  VectorXb & T)\n{\n  using namespace std;\n  const int n = S.rows();\n  assert(P.rows() == n);\n  // dynamic programming\n  T = S;\n  vector<bool> seen(n,false);\n  // Recursively look up chain and see if ancestor is selected\n  const function<bool(int)> look_up = [&](int e) -> bool\n  {\n    if(e==-1)\n    {\n      return false;\n    }\n    if(!seen[e])\n    {\n      seen[e] = true;\n      T(e) |= look_up(P(e));\n    }\n    return T(e);\n  };\n  for(int e = 0;e<n;e++)\n  {\n    if(!seen[e])\n    {\n      T(e) = look_up(e);\n    }\n  }\n}\n\ninline void igl::MouseController::color_if(\n  const VectorXb & S,\n  const Eigen::Vector4f & selected_color,\n  const Eigen::Vector4f & unselected_color,\n  Eigen::MatrixXf & C)\n{\n  C.resize(S.rows(),4);\n  for(int e=0;e<S.rows();e++)\n  {\n    C.row(e) = S(e)?selected_color:unselected_color;\n  }\n}\n\ninline igl::MouseController::MouseController():\n  m_is_selecting(false),\n  m_selection(),\n  m_down_x(-1),m_down_y(-1),m_drag_x(-1),m_drag_y(-1),\n  m_width(-1),m_height(-1),\n  m_widget(),\n  m_widget_rot_at_selection(),\n  m_rotations(),\n  m_rotations_at_selection(),\n  m_root_enabled(true)\n{\n}\n\ninline void igl::MouseController::reshape(const int w, const int h)\n{\n  m_width = w;\n  m_height = h;\n}\n\ninline bool igl::MouseController::down(const int x, const int y)\n{\n  using namespace std;\n  m_down_x = m_drag_x =x;\n  m_down_y = m_drag_y =y;\n  const bool widget_down = any_selection() && m_widget.down(x,m_height-y);\n  if(!widget_down)\n  {\n    m_is_selecting = true;\n  }\n  return m_is_selecting || widget_down;\n}\n\ninline bool igl::MouseController::drag(const int x, const int y)\n{\n  using namespace std;\n  using namespace Eigen;\n  m_drag_x = x;\n  m_drag_y = y;\n  if(m_is_selecting)\n  {\n    return m_is_selecting;\n  }else\n  {\n    if(!m_widget.drag(x,m_height-y))\n    {\n      return false;\n    }\n    assert(any_selection());\n    assert(m_selection.size() == (int)m_rotations.size());\n    for(int e = 0;e<m_selection.size();e++)\n    {\n      if(m_selection(e))\n      {\n        // Let:\n        //     w.θr = w.θ ⋅ w.θ₀*  \n        // w.θr takes (absolute) frame of w.θ₀ to w.θ:\n        //     w.θ = w.θr ⋅ w.θ₀ \n        // Define:\n        //     w.θ₀ = θfk ⋅ θx,\n        // the absolute rotation of the x axis to the deformed bone at\n        // selection. Likewise,\n        //     w.θ = θfk' ⋅ θx,\n        // the current absolute rotation of the x axis to the deformed bone.\n        // Define recursively:\n        //     θfk = θfk(p) ⋅ Θr,\n        // then because we're only changeing this relative rotation\n        //     θfk' = θfk(p) ⋅ Θr ⋅ θr* ⋅ θr'\n        //     θfk' = θfk ⋅ θr* ⋅ θr'\n        //     w.θ ⋅ θx* = θfk ⋅ θr* ⋅ θr'\n        //     θr ⋅ θfk* ⋅ w.θ ⋅ θx* = θr'\n        //     θr ⋅ θfk* ⋅ w.θr ⋅ w.θ₀ ⋅ θx* = θr'\n        //     θr ⋅ θfk* ⋅ w.θr ⋅ θfk ⋅θx ⋅ θx* = θr'\n        //     θr ⋅ θfk* ⋅ w.θr ⋅ θfk = θr'\n        // which I guess is the right multiply change after being changed to\n        // the bases of θfk, the rotation of the bone relative to its rest\n        // frame.\n        //\n        const Quaterniond & frame = m_fk_rotations_at_selection[e];\n        m_rotations[e] = \n          m_rotations_at_selection[e] *\n          frame.conjugate() * \n          (m_widget.rot*m_widget_rot_at_selection.conjugate()) *\n          frame;\n      }\n    }\n    return true;\n  }\n}\n\ninline bool igl::MouseController::up(const int x, const int y)\n{\n  m_is_selecting = false;\n  m_widget.up(x,m_height-y);\n  return false;\n}\n\ninline void igl::MouseController::draw() const\n{\n  using namespace igl;\n  if(any_selection())\n  {\n    m_widget.draw();\n  }\n  if(m_is_selecting)\n  {\n    // Remember settings\n    GLboolean dt;\n    glGetBooleanv(GL_DEPTH_TEST,&dt);\n    int old_vp[4];\n    glGetIntegerv(GL_VIEWPORT,old_vp);\n\n    // True screen space\n    glViewport(0,0,m_width,m_height);\n    glMatrixMode(GL_PROJECTION);\n    glPushMatrix();\n    glLoadIdentity();\n    gluOrtho2D(0,m_width,0,m_height);\n    glMatrixMode(GL_MODELVIEW);\n    glPushMatrix();\n    glLoadIdentity();\n\n    glDisable(GL_DEPTH_TEST);\n    draw_rectangular_marquee(\n      m_down_x,\n      m_height-m_down_y,\n      m_drag_x,\n      m_height-m_drag_y);\n\n    // Restore settings\n    glMatrixMode(GL_PROJECTION);\n    glPopMatrix();\n    glMatrixMode(GL_MODELVIEW);\n    glPopMatrix();\n    glViewport(old_vp[0],old_vp[1],old_vp[2],old_vp[3]);\n    dt?glEnable(GL_DEPTH_TEST):glDisable(GL_DEPTH_TEST);\n\n  }\n}\n\ninline void igl::MouseController::set_selection_from_last_drag(\n  const Eigen::MatrixXd & C,\n  const Eigen::MatrixXi & BE,\n  const Eigen::VectorXi & P,\n  const Eigen::VectorXi & RP)\n{\n  using namespace Eigen;\n  using namespace std;\n  using namespace igl;\n  m_rotations_at_selection = m_rotations;\n  assert(BE.rows() == P.rows());\n  m_selection = VectorXb::Zero(BE.rows());\n  // m_rotation[e]  is the relative rotation stored at bone e (as seen by the\n  //   joint traveling with its parent)\n  // vQ[e]  is the absolute rotation of a bone at rest to its current position:\n  //   vQ[e] = vQ[p(e)] * m_rotation[e]\n  vector<Quaterniond,aligned_allocator<Quaterniond> > vQ;\n  vector<Vector3d> vT;\n  forward_kinematics(C,BE,P,m_rotations,vQ,vT);\n  // Loop over deformed bones\n  for(int e = 0;e<BE.rows();e++)\n  {\n    Affine3d a = Affine3d::Identity();\n    a.translate(vT[e]);\n    a.rotate(vQ[e]);\n    Vector3d s = a * (Vector3d)C.row(BE(e,0));\n    Vector3d d = a * (Vector3d)C.row(BE(e,1));\n    Vector3d projs = project(s);\n    Vector3d projd = project(d);\n    m_selection(e) = line_segment_in_rectangle(\n      projs.head(2),projd.head(2),\n      Vector2d(m_down_x,m_height-m_down_y),\n      Vector2d(m_drag_x,m_height-m_drag_y));\n  }\n  return set_selection(m_selection,C,BE,P,RP);\n}\n\ninline void igl::MouseController::set_selection(\n    const Eigen::VectorXi & S,\n    const Eigen::MatrixXd & C,\n    const Eigen::MatrixXi & BE,\n    const Eigen::VectorXi & P,\n    const Eigen::VectorXi & RP)\n{\n  using namespace igl;\n  using namespace Eigen;\n  using namespace std;\n  vector<Quaterniond,aligned_allocator<Quaterniond> > & vQ = \n    m_fk_rotations_at_selection;\n  vector<Vector3d> vT;\n  forward_kinematics(C,BE,P,m_rotations,vQ,vT);\n  if(&m_selection != &S)\n  {\n    m_selection = S;\n  }\n  assert(m_selection.rows() == BE.rows());\n  assert(BE.rows() == P.rows());\n  assert(BE.rows() == RP.rows());\n  // Zero-out S up a path of ones from e\n  auto propagate = [&](const int e, const VectorXb & S, VectorXb & N)\n  {\n    if(S(e))\n    {\n      int f = e;\n      while(true)\n      {\n        int p = P(f);\n        if(p==-1||!S(p))\n        {\n          break;\n        }\n        N(f) = false;\n        f = p;\n      }\n    }\n  };\n  VectorXb prev_selection = m_selection;\n  // Combine upward, group rigid parts, repeat\n  while(true)\n  {\n    // Spread selection accross rigid pieces\n    VectorXb SRP(VectorXb::Zero(RP.maxCoeff()+1));\n    for(int e = 0;e<BE.rows();e++)\n    {\n      SRP(RP(e)) |= m_selection(e);\n    }\n    for(int e = 0;e<BE.rows();e++)\n    {\n      m_selection(e) = SRP(RP(e));\n    }\n    // Clear selections below m_selection ancestors\n    VectorXb new_selection = m_selection;\n    for(int e = 0;e<P.rows();e++)\n    {\n      propagate(e,m_selection,new_selection);\n    }\n    m_selection = new_selection;\n    if(m_selection==prev_selection)\n    {\n      break;\n    }\n    prev_selection = m_selection;\n  }\n\n  // Now selection should contain just bone roots of m_selection subtrees\n  if(any_of(m_selection))\n  {\n    // Taking average \n    m_widget.pos.setConstant(0);\n    m_widget_rot_at_selection.coeffs().setConstant(0);\n    m_widget.rot.coeffs().array().setConstant(0);\n    Quaterniond cur_rot(0,0,0,0);\n    int num_selection = 0;\n    // Compute average widget for selection\n    for(int e = 0;e<BE.rows();e++)\n    {\n      if(m_selection(e))\n      {\n        Vector3d s = C.row(BE(e,0));\n        Vector3d d = C.row(BE(e,1));\n        auto b = (d-s).transpose().eval();\n        {\n          Affine3d a = Affine3d::Identity();\n          a.translate(vT[e]);\n          a.rotate(vQ[e]);\n          m_widget.pos += a*s;\n        }\n        // Rotation of x axis to this bone\n        Quaterniond rot_at_bind;\n        rot_at_bind.setFromTwoVectors(Vector3d(1,0,0),b);\n        const Quaterniond abs_rot = vQ[e] * rot_at_bind;\n        m_widget_rot_at_selection.coeffs() += abs_rot.coeffs();\n        num_selection++;\n      }\n    }\n    // Take average\n    m_widget.pos.array() /= (double)num_selection;\n    m_widget_rot_at_selection.coeffs().array() /= (double)num_selection;\n    m_widget_rot_at_selection.normalize();\n    m_widget.rot = m_widget_rot_at_selection;\n  }\n  m_widget.m_is_enabled = true;\n  for(int s = 0;s<m_selection.rows();s++)\n  {\n    // a root is selected then disable.\n    if(!m_root_enabled && m_selection(s) && P(s) == -1)\n    {\n      m_widget.m_is_enabled = false;\n      break;\n    }\n  }\n}\n\ninline void igl::MouseController::set_size(const int n)\n{\n  using namespace Eigen;\n  clear_selection();\n  m_rotations.clear();\n  m_rotations.resize(n,Quaterniond::Identity());\n  m_selection = VectorXb::Zero(n);\n}\n\ninline void igl::MouseController::reset_rotations()\n{\n  using namespace Eigen;\n  using namespace std;\n  fill(m_rotations.begin(),m_rotations.end(),Quaterniond::Identity());\n  // cop out. just clear selection\n  clear_selection();\n}\n\ninline void igl::MouseController::reset_selected_rotations()\n{\n  using namespace Eigen;\n  for(int e = 0;e<m_selection.size();e++)\n  {\n    if(m_selection(e))\n    {\n      m_rotations[e] = Quaterniond::Identity();\n    }\n  }\n}\n\ninline bool igl::MouseController::set_rotations(const RotationList & vQ)\n{\n  if(vQ.size() != m_rotations.size())\n  {\n    return false;\n  }\n  assert(!any_selection());\n  m_rotations = vQ;\n  return true;\n}\n\ninline void igl::MouseController::clear_selection()\n{\n  m_selection.setConstant(false);\n}\n\ninline bool igl::MouseController::any_selection() const\n{\n  return igl::any_of(m_selection);\n}\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/NormalType.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_NORMALTYPE_H\n#define IGL_NORMALTYPE_H\n\nnamespace igl\n{\n  // PER_VERTEX_NORMALS  Normals computed per vertex based on incident faces\n  // PER_FACE_NORMALS  Normals computed per face\n  // PER_CORNER_NORMALS  Normals computed per corner (aka wedge) based on\n  //   incident faces without sharp edge\n  enum NormalType\n  {\n    PER_VERTEX_NORMALS,\n    PER_FACE_NORMALS,\n    PER_CORNER_NORMALS\n  };\n#  define NUM_NORMAL_TYPE 3\n}\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/ONE.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_ONE_H\n#define IGL_ONE_H\nnamespace igl\n{\n  // Often one needs a reference to a dummy variable containing one as its\n  // value, for example when using AntTweakBar's\n  // TwSetParam( \"3D View\", \"opened\", TW_PARAM_INT32, 1, &INT_ONE);\n  const char CHAR_ONE = 1;\n  const int INT_ONE = 1;\n  const unsigned int UNSIGNED_INT_ONE = 1;\n  const double DOUBLE_ONE = 1;\n  const float FLOAT_ONE = 1;\n}\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/OpenGL_convenience.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL_CONVENIENCE_H\n#define IGL_OPENGL_CONVENIENCE_H\n#ifndef IGL_NO_OPENGL\n\n// Always use this:\n//     #include \"OpenGL_convenience.h\"\n// Convenience includer for opengl.\n\n// For now this includes glu, glew and glext (perhaps these should be\n// separated)\n#if __APPLE__\n#  include <OpenGL/gl.h>\n#  include <OpenGL/glu.h>\n#  include <OpenGL/glext.h>\n#elif defined(_WIN32)\n#    define NOMINMAX\n#    include <Windows.h>\n#    undef NOMINMAX\n#    include <GL/glew.h>\n#    include <GL/gl.h>\n#else\n#  define GL_GLEXT_PROTOTYPES\n#  include <GL/gl.h>\n#  include <GL/glext.h>\n#  include <GL/glu.h>\n#endif\n\n#endif\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/PI.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_PI_H\n#define IGL_PI_H\nnamespace igl\n{\n  // Use standard mathematical constants' M_PI if available\n#ifdef M_PI\n  const double PI = M_PI;\n#else\n  const double PI = 3.1415926535897932384626433832795;\n#endif\n}\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/REDRUM.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_REDRUM_H\n#define IGL_REDRUM_H\n\n// Q: These should probably be inside the igl namespace. What's the correct\n// way to do that?\n// A: I guess the right way is to not use a macro but a proper function with\n// streams as input and output.\n\n// ANSI color codes for formating iostream style output\n\n#ifdef IGL_REDRUM_NOOP\n\n// Bold Red, etc.\n#define NORUM(X)     X\n#define REDRUM(X)     X\n#define GREENRUM(X)   X\n#define YELLOWRUM(X)  X\n#define BLUERUM(X)    X\n#define MAGENTARUM(X) X\n#define CYANRUM(X)    X\n// Regular Red, etc.\n#define REDGIN(X)     X\n#define GREENGIN(X)   X\n#define YELLOWGIN(X)  X\n#define BLUEGIN(X)    X\n#define MAGENTAGIN(X) X\n#define CYANGIN(X)    X\n\n#else\n\n// Bold Red, etc.\n#define NORUM(X)       \"\"<<X<<\"\"\n#define REDRUM(X)      \"\\e[1m\\e[31m\"<<X<<\"\\e[m\"\n#define GREENRUM(X)    \"\\e[1m\\e[32m\"<<X<<\"\\e[m\"\n#define YELLOWRUM(X)   \"\\e[1m\\e[33m\"<<X<<\"\\e[m\"\n#define BLUERUM(X)     \"\\e[1m\\e[34m\"<<X<<\"\\e[m\"\n#define MAGENTARUM(X)  \"\\e[1m\\e[35m\"<<X<<\"\\e[m\"\n#define CYANRUM(X)     \"\\e[1m\\e[36m\"<<X<<\"\\e[m\"\n// Regular Red, etc.\n#define REDGIN(X)      \"\\e[31m\"<<X<<\"\\e[m\"\n#define GREENGIN(X)    \"\\e[32m\"<<X<<\"\\e[m\"\n#define YELLOWGIN(X)   \"\\e[33m\"<<X<<\"\\e[m\"\n#define BLUEGIN(X)     \"\\e[34m\"<<X<<\"\\e[m\"\n#define MAGENTAGIN(X)  \"\\e[35m\"<<X<<\"\\e[m\"\n#define CYANGIN(X)     \"\\e[36m\"<<X<<\"\\e[m\"\n#endif\n\n#endif \n"
  },
  {
    "path": "libs/libigl/include/igl/ReAntTweakBar.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"ReAntTweakBar.h\"\n#ifndef IGL_NO_ANTTWEAKBAR\n\n#include <cstdio>\n#include <cstring>\n#include <sstream>\n#include <iostream>\n#include <iomanip>\n#include <map>\n\n// GLOBAL WRAPPERS\nnamespace \n{\n  std::map<TwType,std::pair<const char *,std::vector<TwEnumVal> > > ReTw_custom_types;\n}\n\nIGL_INLINE TwType igl::ReTwDefineEnum(\n  const char *name, \n  const TwEnumVal *enumValues, \n  unsigned int nbValues)\n{\n  using namespace std;\n  // copy enum valus into vector\n  std::vector<TwEnumVal> enum_vals;\n  enum_vals.resize(nbValues);\n  for(unsigned int j = 0; j<nbValues;j++)\n  {\n    enum_vals[j] = enumValues[j];\n  }\n  TwType type = TwDefineEnum(name,enumValues,nbValues);\n\n  ReTw_custom_types[type] = \n    std::pair<const char *,std::vector<TwEnumVal> >(name,enum_vals);\n\n  return type;\n}\n\nIGL_INLINE TwType igl::ReTwDefineEnumFromString(\n  const char * _Name,\n  const char * _EnumString)\n{\n  // Taken directly from TwMgr.cpp, just replace TwDefineEnum with\n  // ReTwDefineEnum\n  using namespace std;\n  {\n    if (_EnumString == NULL) \n        return ReTwDefineEnum(_Name, NULL, 0);\n\n    // split enumString\n    stringstream EnumStream(_EnumString);\n    string Label;\n    vector<string> Labels;\n    while( getline(EnumStream, Label, ',') ) {\n        // trim Label\n        size_t Start = Label.find_first_not_of(\" \\n\\r\\t\");\n        size_t End = Label.find_last_not_of(\" \\n\\r\\t\");\n        if( Start==string::npos || End==string::npos )\n            Label = \"\";\n        else\n            Label = Label.substr(Start, (End-Start)+1);\n        // store Label\n        Labels.push_back(Label);\n    }\n    // create TwEnumVal array\n    vector<TwEnumVal> Vals(Labels.size());\n    for( int i=0; i<(int)Labels.size(); i++ )\n    {\n        Vals[i].Value = i;\n        // Wrong:\n        //Vals[i].Label = Labels[i].c_str();\n        // Allocate char on heap\n        // http://stackoverflow.com/a/10050258/148668\n        char * c_label = new char[Labels[i].length()+1];\n        std::strcpy(c_label, Labels[i].c_str());\n        Vals[i].Label = c_label;\n    }\n\n    const TwType type = ReTwDefineEnum(_Name, Vals.empty() ? NULL : &(Vals[0]), (unsigned int)Vals.size());\n    return type;\n  }\n}\n\nnamespace\n{\n  struct ReTwTypeString\n  {\n    TwType type;\n    const char * type_str;\n  };\n\n  #define RETW_NUM_DEFAULT_TYPE_STRINGS 23\n  ReTwTypeString ReTwDefaultTypeStrings[RETW_NUM_DEFAULT_TYPE_STRINGS] = \n  {\n    {TW_TYPE_UNDEF,\"TW_TYPE_UNDEF\"},\n    {TW_TYPE_BOOLCPP,\"TW_TYPE_BOOLCPP\"},\n    {TW_TYPE_BOOL8,\"TW_TYPE_BOOL8\"},\n    {TW_TYPE_BOOL16,\"TW_TYPE_BOOL16\"},\n    {TW_TYPE_BOOL32,\"TW_TYPE_BOOL32\"},\n    {TW_TYPE_CHAR,\"TW_TYPE_CHAR\"},\n    {TW_TYPE_INT8,\"TW_TYPE_INT8\"},\n    {TW_TYPE_UINT8,\"TW_TYPE_UINT8\"},\n    {TW_TYPE_INT16,\"TW_TYPE_INT16\"},\n    {TW_TYPE_UINT16,\"TW_TYPE_UINT16\"},\n    {TW_TYPE_INT32,\"TW_TYPE_INT32\"},\n    {TW_TYPE_UINT32,\"TW_TYPE_UINT32\"},\n    {TW_TYPE_FLOAT,\"TW_TYPE_FLOAT\"},\n    {TW_TYPE_DOUBLE,\"TW_TYPE_DOUBLE\"},\n    {TW_TYPE_COLOR32,\"TW_TYPE_COLOR32\"},\n    {TW_TYPE_COLOR3F,\"TW_TYPE_COLOR3F\"},\n    {TW_TYPE_COLOR4F,\"TW_TYPE_COLOR4F\"},\n    {TW_TYPE_CDSTRING,\"TW_TYPE_CDSTRING\"},\n    {TW_TYPE_STDSTRING,\"TW_TYPE_STDSTRING\"},\n    {TW_TYPE_QUAT4F,\"TW_TYPE_QUAT4F\"},\n    {TW_TYPE_QUAT4D,\"TW_TYPE_QUAT4D\"},\n    {TW_TYPE_DIR3F,\"TW_TYPE_DIR3F\"},\n    {TW_TYPE_DIR3D,\"TW_TYPE_DIR3D\"}\n  };\n}\n\nIGL_INLINE igl::ReTwBar::ReTwBar():\n bar(NULL),\n  name(),\n  rw_items(),cb_items()\n{\n}\n\nIGL_INLINE igl::ReTwBar::ReTwBar(const igl::ReTwBar & that):\n  bar(that.bar),\n  name(that.name),\n  rw_items(that.rw_items),\n  cb_items(that.cb_items)\n{\n}\n\nIGL_INLINE igl::ReTwBar & igl::ReTwBar::operator=(const igl::ReTwBar & that)\n{\n  // check for self assignment\n  if(this != &that)\n  {\n    bar = that.bar;\n    rw_items = that.rw_items;\n    cb_items = that.cb_items;\n  }\n  return *this;\n}\n\n\n// BAR WRAPPERS\nIGL_INLINE void igl::ReTwBar::TwNewBar(const char * _name)\n{\n  this->bar = ::TwNewBar(_name);\n  // Alec: This causes trouble (not sure why) in multiple applications\n  // (medit, puppet) Probably there is some sort of memory corrpution.\n  // this->name = _name;\n  // Suspiciously this also fails:\n  //this->name = \"foobar\";\n}\n\nIGL_INLINE int igl::ReTwBar::TwAddVarRW(\n  const char *name, \n  TwType type, \n  void *var, \n  const char *def,\n  const bool record)\n{\n  int ret = ::TwAddVarRW(this->bar,name,type,var,def);\n  if(ret && record)\n  {\n    rw_items.push_back(ReTwRWItem(name,type,var));\n  }\n  return ret;\n}\n\nIGL_INLINE int igl::ReTwBar::TwAddVarCB(\n  const char *name, \n  TwType type, \n  TwSetVarCallback setCallback, \n  TwGetVarCallback getCallback, \n  void *clientData, \n  const char *def,\n  const bool record)\n{\n  int ret = \n    ::TwAddVarCB(this->bar,name,type,setCallback,getCallback,clientData,def);\n  if(ret && record)\n  {\n    cb_items.push_back(ReTwCBItem(name,type,setCallback,getCallback,clientData));\n  }\n  return ret;\n}\n\nIGL_INLINE int igl::ReTwBar::TwAddVarRO(\n  const char *name, \n  TwType type, \n  void *var, \n  const char *def)\n{\n  int ret = ::TwAddVarRO(this->bar,name,type,var,def);\n  // Read only variables are not recorded\n  //if(ret)\n  //{\n  //  rw_items.push_back(ReTwRWItem(name,type,var));\n  //}\n  return ret;\n}\n\nIGL_INLINE int igl::ReTwBar::TwAddButton(\n  const char *name, \n  TwButtonCallback buttonCallback, \n  void *clientData, \n  const char *def)\n{\n  int ret = \n    ::TwAddButton(this->bar,name,buttonCallback,clientData,def);\n  // buttons are not recorded\n  //if(ret)\n  //{\n  //  cb_items.push_back(ReTwCBItem(name,type,setCallback,getCallback,clientData));\n  //}\n  return ret;\n}\n\nIGL_INLINE int igl::ReTwBar::TwSetParam(\n  const char *varName, \n  const char *paramName, \n  TwParamValueType paramValueType, \n  unsigned int inValueCount, \n  const void *inValues)\n{\n  // For now just pass these along\n  return \n    ::TwSetParam(\n      this->bar,\n      varName,\n      paramName,\n      paramValueType,\n      inValueCount,\n      inValues);\n}\n\nIGL_INLINE int igl::ReTwBar::TwGetParam(\n  const char *varName, \n  const char *paramName, \n  TwParamValueType paramValueType, \n  unsigned int outValueMaxCount,\n  void *outValues)\n{\n  return \n    ::TwGetParam(\n      this->bar,\n      varName,\n      paramName,\n      paramValueType,\n      outValueMaxCount,\n      outValues);\n}\n\nIGL_INLINE int igl::ReTwBar::TwRefreshBar()\n{\n  return ::TwRefreshBar(this->bar);\n}\n\nIGL_INLINE int igl::ReTwBar::TwTerminate()\n{\n  //std::cout<<\"TwTerminate\"<<std::endl;\n  int r = ::TwTerminate();\n  //std::cout<<\"  \"<<r<<std::endl;\n  return r;\n}\n\nIGL_INLINE bool igl::ReTwBar::save(const char *file_name)\n{\n  FILE * fp;\n  if(file_name == NULL)\n  {\n    fp = stdout;\n  }else\n  {\n    fp = fopen(file_name,\"w\");\n  }\n\n  if(fp == NULL)\n  {\n    printf(\"ERROR: not able to open %s for writing...\\n\",file_name);\n    return false;\n  }\n\n  // Print all RW variables\n  for(\n    std::vector<ReTwRWItem>::iterator it = rw_items.begin(); \n    it != rw_items.end(); \n    it++)\n  {\n    std::string s = (*it).name;\n    const char * name = s.c_str();\n    TwType type = (*it).type;\n    void * var = (*it).var;\n    fprintf(fp,\"%s: %s\\n\",\n      name,\n      get_value_as_string(var,type).c_str());\n  }\n\n  char var[REANTTWEAKBAR_MAX_CB_VAR_SIZE];\n  // Print all CB variables\n  for(\n    std::vector<ReTwCBItem>::iterator it = cb_items.begin(); \n    it != cb_items.end(); \n    it++)\n  {\n    const char * name = it->name.c_str();\n    TwType type = it->type;\n    //TwSetVarCallback setCallback = it->setCallback;\n    TwGetVarCallback getCallback = it->getCallback;\n    void * clientData = it->clientData;\n    // I'm not sure how to do what I want to do. getCallback needs to be sure\n    // that it can write to var. So var needs to point to a valid and big\n    // enough chunk of memory\n    getCallback(var,clientData);\n    fprintf(fp,\"%s: %s\\n\",\n      name,\n      get_value_as_string(var,type).c_str());\n  }\n\n  fprintf(fp,\"\\n\");\n\n  if(file_name != NULL)\n  {\n    fclose(fp);\n  }\n  // everything succeeded\n  return true;\n}\n\nIGL_INLINE std::string igl::ReTwBar::get_value_as_string(\n  void * var, \n  TwType type)\n{\n  std::stringstream sstr;\n  switch(type)\n  {\n    case TW_TYPE_BOOLCPP:\n      {\n        sstr << \"TW_TYPE_BOOLCPP\" << \" \";\n        sstr << *(static_cast<bool*>(var));\n        break;\n      }\n    case TW_TYPE_QUAT4D:\n      {\n        sstr << \"TW_TYPE_QUAT4D\" << \" \";\n        // Q: Why does casting to double* work? shouldn't I have to cast to\n        // double**?\n        double * q = static_cast<double*>(var);\n        sstr << std::setprecision(15) << q[0] << \" \" << q[1] << \" \" << q[2] << \" \" << q[3];\n        break;\n      }\n    case TW_TYPE_QUAT4F:\n      {\n        sstr << \"TW_TYPE_QUAT4F\" << \" \";\n        // Q: Why does casting to float* work? shouldn't I have to cast to\n        // float**?\n        float * q = static_cast<float*>(var);\n        sstr << q[0] << \" \" << q[1] << \" \" << q[2] << \" \" << q[3];\n        break;\n      }\n    case TW_TYPE_COLOR4F:\n      {\n        sstr << \"TW_TYPE_COLOR4F\" << \" \";\n        float * c = static_cast<float*>(var);\n        sstr << c[0] << \" \" << c[1] << \" \" << c[2] << \" \" << c[3];\n        break;\n      }\n    case TW_TYPE_COLOR3F:\n      {\n        sstr << \"TW_TYPE_COLOR3F\" << \" \";\n        float * c = static_cast<float*>(var);\n        sstr << c[0] << \" \" << c[1] << \" \" << c[2];\n        break;\n      }\n    case TW_TYPE_DIR3D:\n      {\n        sstr << \"TW_TYPE_DIR3D\" << \" \";\n        double * d = static_cast<double*>(var);\n        sstr << std::setprecision(15) << d[0] << \" \" << d[1] << \" \" << d[2];\n        break;\n      }\n    case TW_TYPE_DIR3F:\n      {\n        sstr << \"TW_TYPE_DIR3F\" << \" \";\n        float * d = static_cast<float*>(var);\n        sstr << d[0] << \" \" << d[1] << \" \" << d[2];\n        break;\n      }\n    case TW_TYPE_BOOL32:\n      {\n        sstr << \"TW_TYPE_BOOL32\" << \" \";\n        sstr << *(static_cast<int*>(var));\n        break;\n      }\n    case TW_TYPE_UINT8:\n      {\n        sstr << \"TW_TYPE_UINT8\" << \" \";\n        // Cast to int so that it's human readable\n        sstr << (int)*(static_cast<unsigned char*>(var));\n        break;\n      }\n    case TW_TYPE_INT32:\n      {\n        sstr << \"TW_TYPE_INT32\" << \" \";\n        sstr << *(static_cast<int*>(var));\n        break;\n      }\n    case TW_TYPE_UINT32:\n      {\n        sstr << \"TW_TYPE_UINT32\" << \" \";\n        sstr << *(static_cast<unsigned int*>(var));\n        break;\n      }\n    case TW_TYPE_FLOAT:\n      {\n        sstr << \"TW_TYPE_FLOAT\" << \" \";\n        sstr << *(static_cast<float*>(var));\n        break;\n      }\n    case TW_TYPE_DOUBLE:\n      {\n        sstr << \"TW_TYPE_DOUBLE\" << \" \";\n        sstr << std::setprecision(15) << *(static_cast<double*>(var));\n        break;\n      }\n    case TW_TYPE_STDSTRING:\n      {\n        sstr << \"TW_TYPE_STDSTRING\" << \" \";\n        std::string *destPtr = static_cast<std::string *>(var);\n        sstr << destPtr->c_str();\n        break;\n      }\n    default:\n      {\n        using namespace std;\n        std::map<TwType,std::pair<const char *,std::vector<TwEnumVal> > >::const_iterator iter = \n          ReTw_custom_types.find(type);\n        if(iter != ReTw_custom_types.end())\n        {\n          sstr << (*iter).second.first << \" \";\n          int enum_val = *(static_cast<int*>(var));\n          // try find display name for enum value\n          std::vector<TwEnumVal>::const_iterator eit = (*iter).second.second.begin();\n          bool found = false;\n          for(;eit<(*iter).second.second.end();eit++)\n          {\n            if(enum_val == eit->Value)\n            {\n              sstr << eit->Label;\n              found = true;\n              break;\n            }\n          }\n          if(!found)\n          {\n            sstr << \"ERROR_ENUM_VALUE_NOT_DEFINED\";\n          }\n        }else\n        {\n          sstr << \"ERROR_TYPE_NOT_SUPPORTED\";\n        }\n        break;\n      }\n  }\n  return sstr.str();\n}\n\nIGL_INLINE bool igl::ReTwBar::load(const char *file_name)\n{\n  FILE * fp;\n  fp = fopen(file_name,\"r\");\n\n  if(fp == NULL)\n  {\n    printf(\"ERROR: not able to open %s for reading...\\n\",file_name);\n    return false;\n  }\n\n  // go through file line by line\n  char line[REANTTWEAKBAR_MAX_LINE];\n  bool still_comments;\n  char name[REANTTWEAKBAR_MAX_WORD];\n  char type_str[REANTTWEAKBAR_MAX_WORD];\n  char value_str[REANTTWEAKBAR_MAX_WORD];\n\n\n  // line number\n  int j = 0;\n  bool finished = false;\n  while(true)\n  {\n    // Eat comments\n    still_comments = true;\n    while(still_comments)\n    {\n      if(fgets(line,REANTTWEAKBAR_MAX_LINE,fp) == NULL)\n      {\n        finished = true;\n        break;\n      }\n      // Blank lines and lines that begin with # are comments\n      still_comments = (line[0] == '#' || line[0] == '\\n');\n      j++;\n    }\n    if(finished)\n    {\n      break;\n    }\n\n    sscanf(line,\"%[^:]: %s %[^\\n]\",name,type_str,value_str);\n    //printf(\"%s: %s %s\\n\",name, type_str,value_str);\n\n    TwType type;\n    if(!type_from_string(type_str,type))\n    {\n      printf(\"ERROR: %s type not found... Skipping...\\n\",type_str);\n      continue;\n    }\n    set_value_from_string(name,type,value_str);\n\n  }\n\n  fclose(fp);\n  \n  // everything succeeded\n  return true;\n}\n\nIGL_INLINE bool igl::ReTwBar::type_from_string(const char *type_str, TwType & type)\n{\n  // first check default types\n  for(int j = 0; j < RETW_NUM_DEFAULT_TYPE_STRINGS; j++)\n  {\n    if(strcmp(type_str,ReTwDefaultTypeStrings[j].type_str) == 0)\n    {\n      type = ReTwDefaultTypeStrings[j].type;\n      return true;\n      break;\n    }\n  }\n\n  // then check custom types\n  std::map<TwType,std::pair<const char *,std::vector<TwEnumVal> > >::const_iterator iter = \n    ReTw_custom_types.begin();\n  for(;iter != ReTw_custom_types.end(); iter++)\n  {\n    if(strcmp((*iter).second.first,type_str)==0)\n    {\n      type = (*iter).first;\n      return true;\n    }\n  }\n  return false;\n}\n\nbool igl::ReTwBar::set_value_from_string(\n  const char * name, \n  TwType type, \n  const char * value_str)\n{\n  void * value = NULL;\n  // possible value slots\n  int i;\n  float v;\n  double dv;\n  float f[4];\n  double d[4];\n  bool b;\n  unsigned int u;\n  unsigned char uc;\n  std::string s;\n\n  // First try to get value from default types\n  switch(type)\n  {\n    case TW_TYPE_BOOLCPP:\n      {\n        int ib;\n        if(sscanf(value_str,\" %d\",&ib) == 1)\n        {\n          b = ib!=0;\n          value = &b;\n        }else\n        {\n          printf(\"ERROR: Bad value format...\\n\");\n          return false;\n        }\n        break;\n      }\n    case TW_TYPE_QUAT4D:\n    //case TW_TYPE_COLOR4D:\n      {\n        if(sscanf(value_str,\" %lf %lf %lf %lf\",&d[0],&d[1],&d[2],&d[3]) == 4)\n        {\n          value = &d;\n        }else\n        {\n          printf(\"ERROR: Bad value format...\\n\");\n          return false;\n        }\n        break;\n      }\n    case TW_TYPE_QUAT4F:\n    case TW_TYPE_COLOR4F:\n      {\n        if(sscanf(value_str,\" %f %f %f %f\",&f[0],&f[1],&f[2],&f[3]) == 4)\n        {\n          value = &f;\n        }else\n        {\n          printf(\"ERROR: Bad value format...\\n\");\n          return false;\n        }\n        break;\n      }\n    //case TW_TYPE_COLOR3D:\n    case TW_TYPE_DIR3D:\n      {\n        if(sscanf(value_str,\" %lf %lf %lf\",&d[0],&d[1],&d[2]) == 3)\n        {\n          value = &d;\n        }else\n        {\n          printf(\"ERROR: Bad value format...\\n\");\n          return false;\n        }\n        break;\n      }\n    case TW_TYPE_COLOR3F:\n    case TW_TYPE_DIR3F:\n      {\n        if(sscanf(value_str,\" %f %f %f\",&f[0],&f[1],&f[2]) == 3)\n        {\n          value = &f;\n        }else\n        {\n          printf(\"ERROR: Bad value format...\\n\");\n          return false;\n        }\n        break;\n      }\n    case TW_TYPE_UINT8:\n      {\n        if(sscanf(value_str,\" %d\",&i) == 1)\n        {\n          // Cast to unsigned char\n          uc = (unsigned char) i;\n          value = &uc;\n        }else\n        {\n          printf(\"ERROR: Bad value format...\\n\");\n          return false;\n        }\n        break;\n      }\n    case TW_TYPE_BOOL32:\n    case TW_TYPE_INT32:\n      {\n        if(sscanf(value_str,\" %d\",&i) == 1)\n        {\n          value = &i;\n        }else\n        {\n          printf(\"ERROR: Bad value format...\\n\");\n          return false;\n        }\n        break;\n      }\n    case TW_TYPE_UINT32:\n      {\n        if(sscanf(value_str,\" %u\",&u) == 1)\n        {\n          value = &u;\n        }else\n        {\n          printf(\"ERROR: Bad value format...\\n\");\n          return false;\n        }\n        break;\n      }\n    case TW_TYPE_FLOAT:\n      {\n        if(sscanf(value_str,\" %f\",&v) == 1)\n        {\n          value = &v;\n        }else\n        {\n          printf(\"ERROR: Bad value format...\\n\");\n          return false;\n        }\n        break;\n      }\n    case TW_TYPE_DOUBLE:\n      {\n        if(sscanf(value_str,\" %lf\",&dv) == 1)\n        {\n          value = &dv;\n        }else\n        {\n          printf(\"ERROR: Bad value format...\\n\");\n          return false;\n        }\n        break;\n      }\n    case TW_TYPE_STDSTRING:\n      {\n        s  = value_str;\n        value = &s;\n        break;\n      }\n    default:\n      // Try to find type in custom enum types\n      std::map<TwType,std::pair<const char *,std::vector<TwEnumVal> > >::const_iterator iter = \n        ReTw_custom_types.find(type);\n      if(iter != ReTw_custom_types.end())\n      {\n        std::vector<TwEnumVal>::const_iterator eit = (*iter).second.second.begin();\n        bool found = false;\n        for(;eit<(*iter).second.second.end();eit++)\n        {\n          if(strcmp(value_str,eit->Label) == 0)\n          {\n            i = eit->Value;\n            value = &i;\n            found = true;\n            break;\n          }\n        }\n        if(!found)\n        {\n          printf(\"ERROR_ENUM_VALUE_NOT_DEFINED\");\n        }\n      }else\n      {\n        printf(\"ERROR_TYPE_NOT_SUPPORTED\\n\");\n      }\n\n      break;\n  }\n\n\n  // Find variable based on name\n  // First look in RW items\n  bool item_found = false;\n  for(\n    std::vector<ReTwRWItem>::iterator it = rw_items.begin(); \n    it != rw_items.end(); \n    it++)\n  {\n    if(it->name == name)\n    {\n      void * var = it->var;\n      switch(type)\n      {\n        case TW_TYPE_BOOLCPP:\n          {\n            bool * bvar = static_cast<bool*>(var);\n            bool * bvalue = static_cast<bool*>(value);\n            *bvar = *bvalue;\n            break;\n          }\n        case TW_TYPE_QUAT4D:\n        //case TW_TYPE_COLOR4D:\n          {\n            double * dvar = static_cast<double*>(var);\n            double * dvalue = static_cast<double*>(value);\n            dvar[0] = dvalue[0];\n            dvar[1] = dvalue[1];\n            dvar[2] = dvalue[2];\n            dvar[3] = dvalue[3];\n            break;\n          }\n        case TW_TYPE_QUAT4F:\n        case TW_TYPE_COLOR4F:\n          {\n            float * fvar = static_cast<float*>(var);\n            float * fvalue = static_cast<float*>(value);\n            fvar[0] = fvalue[0];\n            fvar[1] = fvalue[1];\n            fvar[2] = fvalue[2];\n            fvar[3] = fvalue[3];\n            break;\n          }\n        //case TW_TYPE_COLOR3D:\n        case TW_TYPE_DIR3D:\n          {\n            double * dvar = static_cast<double*>(var);\n            double * dvalue = static_cast<double*>(value);\n            dvar[0] = dvalue[0];\n            dvar[1] = dvalue[1];\n            dvar[2] = dvalue[2];\n            break;\n          }\n        case TW_TYPE_COLOR3F:\n        case TW_TYPE_DIR3F:\n          {\n            float * fvar = static_cast<float*>(var);\n            float * fvalue = static_cast<float*>(value);\n            fvar[0] = fvalue[0];\n            fvar[1] = fvalue[1];\n            fvar[2] = fvalue[2];\n            break;\n          }\n        case TW_TYPE_UINT8:\n          {\n            unsigned char * ucvar = static_cast<unsigned char*>(var);\n            unsigned char * ucvalue = static_cast<unsigned char*>(value);\n            *ucvar = *ucvalue;\n            break;\n          }\n        case TW_TYPE_BOOL32:\n        case TW_TYPE_INT32:\n          {\n            int * ivar = static_cast<int*>(var);\n            int * ivalue = static_cast<int*>(value);\n            *ivar = *ivalue;\n            break;\n          }\n        case TW_TYPE_UINT32:\n          {\n            unsigned int * uvar =   static_cast<unsigned int*>(var);\n            unsigned int * uvalue = static_cast<unsigned int*>(value);\n            *uvar = *uvalue;\n            break;\n          }\n        case TW_TYPE_FLOAT:\n          {\n            float * fvar = static_cast<float*>(var);\n            float * fvalue = static_cast<float*>(value);\n            *fvar = *fvalue;\n            break;\n          }\n        case TW_TYPE_DOUBLE:\n          {\n            double * dvar =   static_cast<double*>(var);\n            double * fvalue = static_cast<double*>(value);\n            *dvar = *fvalue;\n            break;\n          }\n        case TW_TYPE_STDSTRING:\n          {\n            std::string * svar =   static_cast<std::string*>(var);\n            std::string * svalue = static_cast<std::string*>(value);\n            *svar = *svalue;\n            break;\n          }\n        default:\n          // Try to find type in custom enum types\n          std::map<TwType,std::pair<const char *,std::vector<TwEnumVal> > >::iterator iter = \n            ReTw_custom_types.find(type);\n          if(iter != ReTw_custom_types.end())\n          {\n            int * ivar = static_cast<int*>(var);\n            std::vector<TwEnumVal>::iterator eit = (*iter).second.second.begin();\n            bool found = false;\n            for(;eit<(*iter).second.second.end();eit++)\n            {\n              if(strcmp(value_str,eit->Label) == 0)\n              {\n                *ivar = eit->Value;\n                found = true;\n                break;\n              }\n            }\n            if(!found)\n            {\n              printf(\"ERROR_ENUM_VALUE_NOT_DEFINED\");\n            }\n          }else\n          {\n            printf(\"ERROR_TYPE_NOT_SUPPORTED\\n\");\n          }\n          break;\n      }\n      item_found = true;\n      break;\n    }\n  }\n\n  // Try looking in CB items\n  if(!item_found)\n  {\n    for(\n      std::vector<ReTwCBItem>::iterator it = cb_items.begin(); \n      it != cb_items.end(); \n      it++)\n    {\n      if(it->name==name)\n      {\n        it->setCallback(value,it->clientData);\n        item_found = true;\n        break;\n      }\n    }\n  }\n\n  if(!item_found)\n  {\n    printf(\"ERROR: item '%s' not found\\n\",name);\n  }\n  return true;\n}\n\nIGL_INLINE const std::vector<igl::ReTwRWItem> & igl::ReTwBar::get_rw_items()\n{\n  return rw_items;\n}\n\nIGL_INLINE const std::vector<igl::ReTwCBItem> & igl::ReTwBar::get_cb_items()\n{\n  return cb_items;\n}\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/ReAntTweakBar.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_REANTTWEAKBAR_H\n#define IGL_REANTTWEAKBAR_H\n#ifndef IGL_NO_ANTTWEAKBAR\n#include \"igl_inline.h\"\n// ReAntTweakBar is a minimal wrapper for the AntTweakBar library that allows\n// \"bars\" to be saved and load from disk. Changing your existing app that uses\n// AntTweakBar to use ReAntTweakBar is trivial.\n// \n// Many (but not all) variable types are supported. I'll try to keep track them\n// here:\n//   TW_TYPE_BOOLCPP\n//   TW_TYPE_QUAT4F\n//   TW_TYPE_QUAT4D\n//   TW_TYPE_COLOR4F\n//   TW_TYPE_COLOR4D\n//   TW_TYPE_COLOR3F\n//   TW_TYPE_DIR3F\n//   TW_TYPE_DIR3D\n//   TW_TYPE_BOOL32\n//   TW_TYPE_INT32\n//   TW_TYPE_UINT32\n//   TW_TYPE_FLOAT\n//   TW_TYPE_DOUBLE\n//   TW_TYPE_UINT8\n//   and\n//   custom TwTypes made with TwDefineEnum\n// \n// I'm working on adding the rest on an as-needed basis. Adding a new type only\n// requires changes in a few places...\n// \n//\n//\n\n// This allows the user to have a non-global, static installation of\n// AntTweakBar\n#include <AntTweakBar.h>\n// Instead of including AntTweakBar.h, just define the necessary types\n// Types used:\n//   - TwType\n//   - TwEnumVal\n//   - TwSetVarCallback\n//   - TwGetVarCallback\n//   - TwBar\n//   - TwButtonCallback\n\n\n#include <vector>\n#include <string>\n\n#define REANTTWEAKBAR_MAX_CB_VAR_SIZE 1000\n// Max line size for reading files\n#define REANTTWEAKBAR_MAX_LINE 1000\n#define REANTTWEAKBAR_MAX_WORD 100\n\nnamespace igl\n{\n  TwType ReTwDefineEnum(\n    const char *name, \n    const TwEnumVal *enumValues, \n    unsigned int nbValues);\n  TwType ReTwDefineEnumFromString(const char * name,const char * enumString);\n  \n  struct ReTwRWItem\n  {\n    //const char * name;\n    std::string name;\n    TwType type;\n    void * var;\n    // Default constructor\n    IGL_INLINE ReTwRWItem(\n      const std::string _name,\n      TwType _type, \n      void *_var):\n      name(_name),\n      type(_type),\n      var(_var)\n    {\n    }\n    // Shallow copy constructor\n    // I solemnly swear it's OK to copy var this way\n    // Q: Is it really?\n    IGL_INLINE ReTwRWItem(const ReTwRWItem & that):\n      name(that.name),\n      type(that.type),\n      var(that.var)\n    {\n    }\n    // Shallow assignment \n    // I solemnly swear it's OK to copy var this way\n    IGL_INLINE ReTwRWItem & operator=(const ReTwRWItem & that)\n    {\n      if(this != &that)\n      {\n        this->name = that.name;\n        this->type = that.type;\n        this->var = that.var;\n      }\n      return *this;\n    }\n  };\n  \n  struct ReTwCBItem\n  {\n    //const char * name;\n    std::string name;\n    TwType type;\n    TwSetVarCallback setCallback;\n    TwGetVarCallback getCallback;\n    void * clientData;\n    // Default constructor\n    IGL_INLINE ReTwCBItem(\n      const std::string _name,\n      TwType _type, \n      TwSetVarCallback _setCallback,\n      TwGetVarCallback _getCallback,\n      void * _clientData):\n      name(_name),\n      type(_type),\n      setCallback(_setCallback),\n      getCallback(_getCallback),\n      clientData(_clientData)\n    {\n    }\n    // Shallow copy\n    // I solemnly swear it's OK to copy clientData this way\n    IGL_INLINE ReTwCBItem(const ReTwCBItem & that):\n      name(that.name),\n      type(that.type),\n      setCallback(that.setCallback),\n      getCallback(that.getCallback),\n      clientData(that.clientData)\n    {\n    }\n    // Shallow assignment\n    // I solemnly swear it's OK to copy clientData this way\n    IGL_INLINE ReTwCBItem & operator=(const ReTwCBItem & that)\n    {\n      if(this != &that)\n      {\n        name = that.name;\n        type = that.type;\n        setCallback = that.setCallback;\n        getCallback = that.getCallback;\n        clientData = that.clientData;\n      }\n      return *this;\n    }\n\n  };\n  \n  class ReTwBar\n  {\n    // VARIABLES\n    // Should be private, but seeing as I'm not going to implement all of the\n    // AntTweakBar public functions right away, I'll expose this so that at\n    // anytime AntTweakBar functions can be called directly on the bar\n    public:\n      TwBar * bar;\n      std::string name;\n    protected:\n      std::vector<ReTwRWItem> rw_items;\n      std::vector<ReTwCBItem> cb_items;\n    public:\n      // Default constructor with explicit initialization\n      IGL_INLINE ReTwBar();\n    private:\n      // Copy constructor does shallow copy\n      IGL_INLINE ReTwBar(const ReTwBar & that);\n      // Assignment operator does shallow assignment\n      IGL_INLINE ReTwBar &operator=(const ReTwBar & that);\n  \n    // WRAPPERS FOR ANTTWEAKBAR FUNCTIONS \n    public:\n      IGL_INLINE void TwNewBar(const char *_name);\n      IGL_INLINE int TwAddVarRW(\n        const char *name, \n        TwType type, \n        void *var, \n        const char *def,\n        const bool record=true);\n      IGL_INLINE int TwAddVarCB(\n        const char *name, \n        TwType type, \n        TwSetVarCallback setCallback, \n        TwGetVarCallback getCallback, \n        void *clientData, \n        const char *def,\n        const bool record=true);\n      // Wrappers for convenience (not recorded, just passed on)\n      IGL_INLINE int TwAddVarRO(const char *name, TwType type, void *var, const char *def);\n      IGL_INLINE int TwAddButton(\n        const char *name, \n        TwButtonCallback buttonCallback, \n        void *clientData, \n        const char *def);\n      IGL_INLINE int TwSetParam(\n        const char *varName, \n        const char *paramName, \n        TwParamValueType paramValueType, \n        unsigned int inValueCount, \n        const void *inValues);\n      IGL_INLINE int TwGetParam(\n        const char *varName, \n        const char *paramName, \n        TwParamValueType paramValueType, \n        unsigned int outValueMaxCount, \n        void *outValues);\n      IGL_INLINE int TwRefreshBar();\n      IGL_INLINE int TwTerminate();\n  \n  \n    // IO FUNCTIONS\n    public:\n      // Save current items to file\n      // Input:\n      //   file_name  name of file to save data to, can be null which means print\n      //   to stdout\n      // Return:\n      //   true only if there were no (fatal) errors\n      IGL_INLINE bool save(const char *file_name);\n      std::string get_value_as_string(\n        void * var, \n        TwType type);\n      // Load into current items from file\n      // Input:\n      //   file_name  name of input file to load\n      // Return:\n      //   true only if there were no (fatal) errors\n      IGL_INLINE bool load(const char *file_name);\n      // Get TwType from string\n      // Input\n      //   type_str  string of type \n      // Output\n      //   type  TwType converted from string\n      // Returns\n      //   true only if string matched a valid type\n      IGL_INLINE bool type_from_string(const char *type_str, TwType & type);\n      // I realize that I mix std::string and const char * all over the place.\n      // What can you do...\n      IGL_INLINE bool set_value_from_string(\n        const char * name, \n        TwType type, \n        const char * value_str);\n      IGL_INLINE const std::vector<ReTwRWItem> & get_rw_items();\n      IGL_INLINE const std::vector<ReTwCBItem> & get_cb_items();\n  };\n}\n\n// List of TwBar functions\n//TW_API TwBar *      TW_CALL TwNewBar(const char *barName);\n//TW_API int          TW_CALL TwDeleteBar(TwBar *bar);\n//TW_API int          TW_CALL TwDeleteAllBars();\n//TW_API int          TW_CALL TwSetTopBar(const TwBar *bar);\n//TW_API TwBar *      TW_CALL TwGetTopBar();\n//TW_API int          TW_CALL TwSetBottomBar(const TwBar *bar);\n//TW_API TwBar *      TW_CALL TwGetBottomBar();\n//TW_API const char * TW_CALL TwGetBarName(TwBar *bar);\n//TW_API int          TW_CALL TwGetBarCount();\n//TW_API TwBar *      TW_CALL TwGetBarByIndex(int barIndex);\n//TW_API TwBar *      TW_CALL TwGetBarByName(const char *barName);\n//TW_API int          TW_CALL TwRefreshBar(TwBar *bar);\n//TW_API int          TW_CALL TwTerminate();\n//\n//TW_API int      TW_CALL TwAddVarRW(TwBar *bar, const char *name, TwType type, void *var, const char *def);\n//TW_API int      TW_CALL TwAddVarRO(TwBar *bar, const char *name, TwType type, const void *var, const char *def);\n//TW_API int      TW_CALL TwAddVarCB(TwBar *bar, const char *name, TwType type, TwSetVarCallback setCallback, TwGetVarCallback getCallback, void *clientData, const char *def);\n//TW_API int      TW_CALL TwAddButton(TwBar *bar, const char *name, TwButtonCallback callback, void *clientData, const char *def);\n//TW_API int      TW_CALL TwAddSeparator(TwBar *bar, const char *name, const char *def);\n//TW_API int      TW_CALL TwRemoveVar(TwBar *bar, const char *name);\n//TW_API int      TW_CALL TwRemoveAllVars(TwBar *bar);\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"ReAntTweakBar.cpp\"\n#endif\n\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/RotateWidget.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_ROTATE_WIDGET_H\n#define IGL_ROTATE_WIDGET_H\n#include <Eigen/Geometry>\n#include <Eigen/Core>\n#include <vector>\n#include <igl/material_colors.h>\n\nnamespace igl\n{\n  // 3D Rotate tool widget similar to Maya's. Works best if field of view angle\n  // is less than ~25.\n  class RotateWidget\n  {\n      // If a is true then use A else use desaturated A\n      static inline void glColor4fv(const bool a, const Eigen::Vector4f & A);\n    public:\n      inline static Eigen::Quaterniond axis_q(const int a);\n      inline static Eigen::Vector3d view_direction(const int x, const int y);\n      inline static Eigen::Vector3d view_direction(const Eigen::Vector3d & pos);\n      Eigen::Vector3d pos;\n      Eigen::Quaterniond rot,down_rot;\n      // This line causes trouble if RotateWidget.h is included before bbw.h\n      Eigen::Vector2d down_xy,drag_xy,down_dir;\n      Eigen::Vector3d udown,udrag;\n      double outer_radius_on_screen;\n      double outer_over_inner;\n      bool m_is_enabled;\n      enum DownType\n      {\n        DOWN_TYPE_X = 0,\n        DOWN_TYPE_Y = 1,\n        DOWN_TYPE_Z = 2,\n        DOWN_TYPE_OUTLINE = 3,\n        DOWN_TYPE_TRACKBALL = 4,\n        DOWN_TYPE_NONE = 5,\n        NUM_DOWN_TYPES = 6\n      } down_type, selected_type;\n      inline RotateWidget();\n      // Vector from origin to mouse click \"Unprojected\" onto plane with depth of\n      // origin and scale to so that outer radius is 1\n      // \n      // Inputs:\n      //   x  mouse x position\n      //   y  mouse y position\n      // Returns vector\n      inline Eigen::Vector3d unproject_onto(const int x, const int y) const;\n      // Shoot ray from mouse click to sphere\n      //\n      // Inputs:\n      //   x  mouse x position\n      //   y  mouse y position\n      // Outputs:\n      //   hit  position of hit\n      // Returns true only if there was a hit\n      inline bool intersect(\n        const int x, \n        const int y, \n        Eigen::Vector3d & hit) const;\n      inline double unprojected_inner_radius() const;\n      inline bool down(const int x, const int y);\n      inline bool drag(const int x, const int y);\n      inline bool up(const int x, const int y);\n      inline bool is_down() const;\n      inline void draw() const;\n      inline void draw_guide() const;\n    public:\n        EIGEN_MAKE_ALIGNED_OPERATOR_NEW\n  };\n}\n\n// Implementation\n#include <igl/OpenGL_convenience.h>\n#include <igl/PI.h>\n#include <igl/EPS.h>\n#include <igl/ray_sphere_intersect.h>\n#include <igl/project.h>\n#include <igl/mat_to_quat.h>\n#include <igl/trackball.h>\n#include <igl/unproject.h>\n#include <iostream>\n#include <cassert>\n\ninline void igl::RotateWidget::glColor4fv(\n    const bool a,\n    const Eigen::Vector4f & A)\n{\n  if(a)\n  {\n    ::glColor4fv(A.data());\n  }else\n  {\n    Eigen::Vector4f B;\n    const double f = 0.95; // desaturate by 95%\n    const double L = 0.3*A(0) + 0.6*A(1) + 0.1*A(2);\n    B.head(3) = A.head(3).array() + f*(L-A.head(3).array());\n    B(3) = A(3);\n    ::glColor4fv(B.data());\n  }\n}\n\ninline Eigen::Quaterniond igl::RotateWidget::axis_q(const int a)\n{\n  assert(a<3 && a>=0);\n  const Eigen::Quaterniond axes[3] = {\n    Eigen::Quaterniond(Eigen::AngleAxisd(igl::PI*0.5,Eigen::Vector3d(0,1,0))),\n    Eigen::Quaterniond(Eigen::AngleAxisd(igl::PI*0.5,Eigen::Vector3d(1,0,0))),\n    Eigen::Quaterniond::Identity()};\n  return axes[a];\n}\n\ninline Eigen::Vector3d igl::RotateWidget::view_direction(const int x, const int y)\n{\n  using namespace Eigen;\n  const Vector3d win_s(x,y,0), win_d(x,y,1);\n  const Vector3d s = unproject(win_s);\n  const Vector3d d = unproject(win_d);\n  return d-s;\n}\n\ninline Eigen::Vector3d igl::RotateWidget::view_direction(const Eigen::Vector3d & pos)\n{\n  using namespace Eigen;\n  const Vector3d ppos = project(pos);\n  return view_direction(ppos(0),ppos(1));\n}\n\ninline igl::RotateWidget::RotateWidget():\n  pos(0,0,0),\n  rot(Eigen::Quaterniond::Identity()),\n  down_rot(rot),\n  down_xy(-1,-1),drag_xy(-1,-1),\n  outer_radius_on_screen(91.),\n  outer_over_inner(1.13684210526),\n  m_is_enabled(true),\n  down_type(DOWN_TYPE_NONE), \n  selected_type(DOWN_TYPE_NONE)\n{\n}\n\ninline Eigen::Vector3d igl::RotateWidget::unproject_onto(\n  const int x, \n  const int y) const\n{\n  using namespace Eigen;\n  // KNOWN BUG: This projects to same depths as pos. I think what we actually\n  // want is The intersection with the plane perpendicular to the view\n  // direction at pos. If the field of view angle is small then this difference\n  // is negligible.\n  //const Vector3d ppos = project(pos);\n  //const Vector3d uxy = unproject( Vector3d(x,y,ppos(2)));\n  // http://en.wikipedia.org/wiki/Line-plane_intersection\n  //\n  // Hrrmmm. There's still something wrong here if the ball's in the corner of\n  // the screen. Am I somehow not accounting for perspective correctly?\n  //\n  // Q: What about just projecting the circle's equation and solving for the\n  // distance?\n  const Vector3d l0 = unproject(Vector3d(x,y,0));\n  const Vector3d l = unproject(Vector3d(x,y,1))-l0;\n  const Vector3d n = view_direction(pos);\n  const double t = (pos-l0).dot(n)/l.dot(n);\n  const Vector3d uxy = l0+t*l;\n  return (uxy-pos)/unprojected_inner_radius()*outer_over_inner*outer_over_inner;\n}\n\ninline bool igl::RotateWidget::intersect(\n  const int x, \n  const int y,\n  Eigen::Vector3d & hit) const\n{\n  using namespace Eigen;\n  Vector3d view = view_direction(x,y);\n  const Vector3d ppos = project(pos);\n  Vector3d uxy = unproject(Vector3d(x,y,ppos(2)));\n  double t0,t1;\n  if(!ray_sphere_intersect(uxy,view,pos,unprojected_inner_radius(),t0,t1))\n  {\n    return false;\n  }\n  hit = uxy+t0*view;\n  return true;\n}\n\n\ninline double igl::RotateWidget::unprojected_inner_radius() const\n{\n  using namespace Eigen;\n  Vector3d off,ppos,ppos_off,pos_off;\n  project(pos,ppos);\n  ppos_off = ppos;\n  ppos_off(0) += outer_radius_on_screen/outer_over_inner;\n  unproject(ppos_off,pos_off);\n  return (pos-pos_off).norm();\n}\ninline bool igl::RotateWidget::down(const int x, const int y)\n{\n  using namespace Eigen;\n  using namespace std;\n  if(!m_is_enabled)\n  {\n    return false;\n  }\n  down_type = DOWN_TYPE_NONE;\n  selected_type = DOWN_TYPE_NONE;\n  down_xy = Vector2d(x,y);\n  drag_xy = down_xy;\n  down_rot = rot;\n  Vector3d ppos = project(pos);\n  const double r = (ppos.head(2) - down_xy).norm();\n  const double thresh = 3;\n  if(fabs(r - outer_radius_on_screen)<thresh)\n  {\n    udown = unproject_onto(x,y);\n    udrag = udown;\n    down_type = DOWN_TYPE_OUTLINE;\n    selected_type = DOWN_TYPE_OUTLINE;\n    // project mouse to same depth as pos\n    return true;\n  }else if(r < outer_radius_on_screen/outer_over_inner+thresh*0.5)\n  {\n    Vector3d hit;\n    const bool is_hit = intersect(down_xy(0),down_xy(1),hit);\n    if(!is_hit)\n    {\n      //cout<<\"~~~!is_hit\"<<endl;\n    }\n    auto on_meridian = [&](\n      const Vector3d & hit, \n      const Quaterniond & rot, \n      const Quaterniond & m,\n      Vector3d & pl_hit) -> bool\n    {\n      // project onto rotate plane\n      pl_hit = hit-pos;\n      pl_hit = (m.conjugate()*rot.conjugate()*pl_hit).eval();\n      pl_hit(2) = 0;\n      pl_hit = (rot*m*pl_hit).eval();\n      pl_hit.normalize();\n      pl_hit *= unprojected_inner_radius();\n      pl_hit += pos;\n      return (project(pl_hit).head(2)-project(hit).head(2)).norm()<2*thresh;\n    };\n    udown = (hit-pos).normalized()/outer_radius_on_screen;\n    udrag = udown;\n    for(int a = 0;a<3;a++)\n    {\n      Vector3d pl_hit;\n      if(on_meridian(hit,rot,Quaterniond(axis_q(a)),pl_hit))\n      {\n        udown = (pl_hit-pos).normalized()/outer_radius_on_screen;\n        udrag = udown;\n        down_type = DownType(DOWN_TYPE_X+a);\n        selected_type = down_type;\n        {\n          Vector3d dir3 = axis_q(a).conjugate()*down_rot.conjugate()*(hit-pos);\n          dir3 = AngleAxisd(-PI*0.5,Vector3d(0,0,1))*dir3;\n          dir3 = (rot*axis_q(a)*dir3).eval();\n          down_dir = (project((hit+dir3).eval())-project(hit)).head(2);\n          down_dir.normalize();\n          //// flip y because y coordinate is going to be given backwards in\n          //// drag()\n          //down_dir(1) *= -1;\n        }\n        return true;\n      }\n    }\n    //assert(is_hit);\n    down_type = DOWN_TYPE_TRACKBALL;\n    selected_type = DOWN_TYPE_TRACKBALL;\n    return true;\n  }else\n  {\n    return false;\n  }\n}\n\ninline bool igl::RotateWidget::drag(const int x, const int y)\n{\n  using namespace std;\n  using namespace Eigen;\n  if(!m_is_enabled)\n  {\n    return false;\n  }\n  drag_xy = Vector2d(x,y);\n  switch(down_type)\n  {\n    case DOWN_TYPE_NONE:\n      return false;\n    default:\n    {\n      const Quaterniond & q = axis_q(down_type-DOWN_TYPE_X);\n      const double dtheta = -(drag_xy - down_xy).dot(down_dir)/\n        outer_radius_on_screen/outer_over_inner*PI/2.;\n      Quaterniond dq(AngleAxisd(dtheta,down_rot*q*Vector3d(0,0,1)));\n      rot = dq * down_rot;\n      udrag = dq * udown;\n      return true;\n    }\n    case DOWN_TYPE_OUTLINE:\n      {\n        Vector3d ppos = project(pos);\n        // project mouse to same depth as pos\n        udrag = unproject_onto(x,y);\n        const Vector2d A = down_xy - ppos.head(2);\n        const Vector2d B = drag_xy - ppos.head(2);\n        const double dtheta = atan2(A(0)*B(1)-A(1)*B(0),A(0)*B(0)+A(1)*B(1));\n        Vector3d n = view_direction(pos).normalized();\n        Quaterniond dq(AngleAxisd(dtheta,-n));\n        //Vector3d n = udrag.cross(udown).normalized();\n        //Quaterniond dq(AngleAxisd(fabs(dtheta),-n));\n        rot = dq * down_rot;\n      }\n      return true;\n    case DOWN_TYPE_TRACKBALL:\n      {\n        Vector3d ppos = project(pos);\n        const double r = (double)outer_radius_on_screen/outer_over_inner*2.0;\n        //const int h = w;\n        Vector4i vp;\n        glGetIntegerv(GL_VIEWPORT,vp.data());\n        const int h = vp(3);\n        Quaterniond dq;\n        trackball(\n          r,r,\n          1,\n          Quaterniond::Identity(),\n          double(    down_xy(0)-ppos(0)    )+r/2.,\n          double((h-down_xy(1))-(h-ppos(1)))+r/2.,\n          double(             x-ppos(0)    )+r/2.,\n          double(         (h-y)-(h-ppos(1)))+r/2.,\n          dq);\n        // We've computed change in rotation according to this view:\n        // R = mv * r, R' = rot * (mv * r)\n        // But we only want new value for r:\n        // R' = mv * r'\n        // mv * r' = rot * (mv * r)\n        // r' = mv* * rot * mv * r\n        Matrix4d mv;\n        glGetDoublev(GL_MODELVIEW_MATRIX,mv.data());\n        Quaterniond scene_rot;\n        // Convert modelview matrix to quaternion\n        mat4_to_quat(mv.data(),scene_rot.coeffs().data());\n        scene_rot.normalize();\n        rot = scene_rot.conjugate() * dq * scene_rot * down_rot;\n      }\n      return true;\n  }\n}\n\ninline bool igl::RotateWidget::up(const int /*x*/, const int /*y*/)\n{\n  // even if disabled process up\n  down_type = DOWN_TYPE_NONE;\n  return false;\n}\n\ninline bool igl::RotateWidget::is_down() const\n{\n  return down_type != DOWN_TYPE_NONE;\n}\n\ninline void igl::RotateWidget::draw() const\n{\n  using namespace Eigen;\n  using namespace std;\n  glPushAttrib(GL_ENABLE_BIT | GL_LIGHTING_BIT | GL_DEPTH_BUFFER_BIT | GL_LINE_BIT);\n  glDisable(GL_CLIP_PLANE0);\n\n  glDisable(GL_LIGHTING);\n  glDisable(GL_DEPTH_TEST);\n  glLineWidth(2.0);\n\n  double r = unprojected_inner_radius();\n  Vector3d view = view_direction(pos).normalized();\n\n  auto draw_circle = [&](const bool cull)\n  {\n    Vector3d view = view_direction(pos).normalized();\n    glBegin(GL_LINES);\n    const double th_step = (2.0*igl::PI/100.0);\n    for(double th = 0;th<2.0*igl::PI+th_step;th+=th_step)\n    {\n      Vector3d a(cos(th),sin(th),0.0);\n      Vector3d b(cos(th+th_step),sin(th+th_step),0.0);\n      if(!cull || (0.5*(a+b)).dot(view)<FLOAT_EPS)\n      {\n        glVertex3dv(a.data());\n        glVertex3dv(b.data());\n      }\n    }\n    glEnd();\n  };\n\n\n  glPushMatrix();\n  glTranslated(pos(0),pos(1),pos(2));\n\n  glScaled(r,r,r);\n  // Draw outlines\n  {\n    glPushMatrix();\n    glColor4fv(m_is_enabled,MAYA_GREY);\n    Quaterniond q;\n    q.setFromTwoVectors(Vector3d(0,0,1),view);\n    glMultMatrixd(Affine3d(q).matrix().data());\n    draw_circle(false);\n    glScaled(outer_over_inner,outer_over_inner,outer_over_inner);\n    if(selected_type == DOWN_TYPE_OUTLINE)\n    {\n      glColor4fv(m_is_enabled,MAYA_YELLOW);\n    }else\n    {\n      glColor4fv(m_is_enabled,MAYA_CYAN);\n    }\n    draw_circle(false);\n    glPopMatrix();\n  }\n  // Draw quartiles\n  {\n    glPushMatrix();\n    glMultMatrixd(Affine3d(rot).matrix().data());\n    if(selected_type == DOWN_TYPE_Z)\n    {\n      glColor4fv(m_is_enabled,MAYA_YELLOW);\n    }else\n    {\n      glColor4fv(m_is_enabled,MAYA_BLUE);\n    }\n    draw_circle(true);\n    if(selected_type == DOWN_TYPE_Y)\n    {\n      glColor4fv(m_is_enabled,MAYA_YELLOW);\n    }else\n    {\n      glColor4fv(m_is_enabled,MAYA_GREEN);\n    }\n    glRotated(90.0,1.0,0.0,0.0);\n    draw_circle(true);\n    if(selected_type == DOWN_TYPE_X)\n    {\n      glColor4fv(m_is_enabled,MAYA_YELLOW);\n    }else\n    {\n      glColor4fv(m_is_enabled,MAYA_RED);\n    }\n    glRotated(90.0,0.0,1.0,0.0);\n    draw_circle(true);\n    glPopMatrix();\n  }\n  glColor4fv(m_is_enabled,MAYA_GREY);\n  draw_guide();\n  glPopMatrix();\n\n  glPopAttrib();\n};\n\ninline void igl::RotateWidget::draw_guide() const\n{\n  using namespace Eigen;\n  using namespace std;\n  glPushAttrib(\n    GL_DEPTH_BUFFER_BIT | \n    GL_ENABLE_BIT | \n    GL_POLYGON_BIT | \n    GL_POINT_BIT | \n    GL_TRANSFORM_BIT |\n    GL_STENCIL_BUFFER_BIT |\n    GL_LIGHTING_BIT);\n\n  // http://www.codeproject.com/Articles/23444/A-Simple-OpenGL-Stipple-Polygon-Example-EP_OpenGL_\n  const GLubyte halftone[] = {\n    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,\n    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,\n    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,\n    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,\n    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,\n    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,\n    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,\n    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,\n    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,\n    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,\n    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,\n    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,\n    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,\n    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,\n    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,\n    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55};\n\n\n  switch(down_type)\n  {\n    case DOWN_TYPE_NONE:\n    case DOWN_TYPE_TRACKBALL:\n      goto finish;\n    case DOWN_TYPE_OUTLINE:\n      glScaled(outer_over_inner,outer_over_inner,outer_over_inner);\n      break;\n    default:\n      break;\n  }\n  {\n    const Vector3d nudown(udown.normalized()), \n      nudrag(udrag.normalized());\n    glPushMatrix();\n    glDisable(GL_CULL_FACE);\n    glDisable(GL_POINT_SMOOTH);\n    glPointSize(5.);\n    glBegin(GL_POINTS);\n    glVertex3dv(nudown.data());\n    glVertex3d(0,0,0);\n    glVertex3dv(nudrag.data());\n    glEnd();\n    glBegin(GL_LINE_STRIP);\n    glVertex3dv(nudown.data());\n    glVertex3d(0,0,0);\n    glVertex3dv(nudrag.data());\n    glEnd();\n    glEnable(GL_POLYGON_STIPPLE);\n    glPolygonStipple(halftone);\n    glBegin(GL_TRIANGLE_FAN);\n    glVertex3d(0,0,0);\n    Quaterniond dq = rot * down_rot.conjugate();\n    //dq.setFromTwoVectors(nudown,nudrag);\n    for(double t = 0;t<1;t+=0.1)\n    {\n      const Vector3d p = Quaterniond::Identity().slerp(t,dq) * nudown;\n      glVertex3dv(p.data());\n    }\n    glVertex3dv(nudrag.data());\n    glEnd();\n    glPopMatrix();\n  }\nfinish:\n  glPopAttrib();\n}\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/STR.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_STR_H\n#define IGL_STR_H\n// http://stackoverflow.com/a/2433143/148668\n#include <string>\n#include <sstream>\n// Suppose you have a function:\n//   void func(std::string c);\n// Then you can write:\n//   func(STR(\"foo\"<<1<<\"bar\"));\n#define STR(X) static_cast<std::ostringstream&>(std::ostringstream().flush() << X).str()\n#endif \n"
  },
  {
    "path": "libs/libigl/include/igl/Singular_Value_Decomposition_Givens_QR_Factorization_Kernel.hpp",
    "content": "//#####################################################################\n// Copyright (c) 2010-2011, Eftychios Sifakis.\n//\n// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n//   * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n//   * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or\n//     other materials provided with the distribution.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,\n// BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n// SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//#####################################################################\n\n//###########################################################\n// Compute the Givens half-angle, construct the Givens quaternion and the rotation sine/cosine (for the full angle)\n//###########################################################\n\n#ifdef _WIN32\n  #undef max\n  #undef min\n#endif\n\nENABLE_SCALAR_IMPLEMENTATION(Ssh.f=SANPIVOT.f*SANPIVOT.f;)                                ENABLE_SSE_IMPLEMENTATION(Vsh=_mm_mul_ps(VANPIVOT,VANPIVOT);)                             ENABLE_AVX_IMPLEMENTATION(Vsh=_mm256_mul_ps(VANPIVOT,VANPIVOT);)\nENABLE_SCALAR_IMPLEMENTATION(Ssh.ui=(Ssh.f>=Ssmall_number.f)?0xffffffff:0;)               ENABLE_SSE_IMPLEMENTATION(Vsh=_mm_cmpge_ps(Vsh,Vsmall_number);)                           ENABLE_AVX_IMPLEMENTATION(Vsh=_mm256_cmp_ps(Vsh,Vsmall_number, _CMP_GE_OS);) //ENABLE_AVX_IMPLEMENTATION(Vsh=_mm256_cmpge_ps(Vsh,Vsmall_number);)\nENABLE_SCALAR_IMPLEMENTATION(Ssh.ui=Ssh.ui&SANPIVOT.ui;)                                  ENABLE_SSE_IMPLEMENTATION(Vsh=_mm_and_ps(Vsh,VANPIVOT);)                                  ENABLE_AVX_IMPLEMENTATION(Vsh=_mm256_and_ps(Vsh,VANPIVOT);)\n\nENABLE_SCALAR_IMPLEMENTATION(Stmp5.f=0.;)                                                 ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_xor_ps(Vtmp5,Vtmp5);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_xor_ps(Vtmp5,Vtmp5);)\nENABLE_SCALAR_IMPLEMENTATION(Sch.f=Stmp5.f-SAPIVOT.f;)                                    ENABLE_SSE_IMPLEMENTATION(Vch=_mm_sub_ps(Vtmp5,VAPIVOT);)                                 ENABLE_AVX_IMPLEMENTATION(Vch=_mm256_sub_ps(Vtmp5,VAPIVOT);)\nENABLE_SCALAR_IMPLEMENTATION(Sch.f=std::max(Sch.f,SAPIVOT.f);)                            ENABLE_SSE_IMPLEMENTATION(Vch=_mm_max_ps(Vch,VAPIVOT);)                                   ENABLE_AVX_IMPLEMENTATION(Vch=_mm256_max_ps(Vch,VAPIVOT);)\nENABLE_SCALAR_IMPLEMENTATION(Sch.f=std::max(Sch.f,Ssmall_number.f);)                      ENABLE_SSE_IMPLEMENTATION(Vch=_mm_max_ps(Vch,Vsmall_number);)                             ENABLE_AVX_IMPLEMENTATION(Vch=_mm256_max_ps(Vch,Vsmall_number);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=(SAPIVOT.f>=Stmp5.f)?0xffffffff:0;)                 ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_cmpge_ps(VAPIVOT,Vtmp5);)                             ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_cmp_ps(VAPIVOT,Vtmp5, _CMP_GE_OS);) //ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_cmpge_ps(VAPIVOT,Vtmp5);)\n\nENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sch.f*Sch.f;)                                        ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Vch,Vch);)                                     ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Vch,Vch);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp2.f=Ssh.f*Ssh.f;)                                        ENABLE_SSE_IMPLEMENTATION(Vtmp2=_mm_mul_ps(Vsh,Vsh);)                                     ENABLE_AVX_IMPLEMENTATION(Vtmp2=_mm256_mul_ps(Vsh,Vsh);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp2.f=Stmp1.f+Stmp2.f;)                                    ENABLE_SSE_IMPLEMENTATION(Vtmp2=_mm_add_ps(Vtmp1,Vtmp2);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp2=_mm256_add_ps(Vtmp1,Vtmp2);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=rsqrt(Stmp2.f);)                                     ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_rsqrt_ps(Vtmp2);)                                     ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_rsqrt_ps(Vtmp2);)\n\nENABLE_SCALAR_IMPLEMENTATION(Stmp4.f=Stmp1.f*Sone_half.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp4=_mm_mul_ps(Vtmp1,Vone_half);)                             ENABLE_AVX_IMPLEMENTATION(Vtmp4=_mm256_mul_ps(Vtmp1,Vone_half);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp3.f=Stmp1.f*Stmp4.f;)                                    ENABLE_SSE_IMPLEMENTATION(Vtmp3=_mm_mul_ps(Vtmp1,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp3=_mm256_mul_ps(Vtmp1,Vtmp4);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp3.f=Stmp1.f*Stmp3.f;)                                    ENABLE_SSE_IMPLEMENTATION(Vtmp3=_mm_mul_ps(Vtmp1,Vtmp3);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp3=_mm256_mul_ps(Vtmp1,Vtmp3);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp3.f=Stmp2.f*Stmp3.f;)                                    ENABLE_SSE_IMPLEMENTATION(Vtmp3=_mm_mul_ps(Vtmp2,Vtmp3);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp3=_mm256_mul_ps(Vtmp2,Vtmp3);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Stmp1.f+Stmp4.f;)                                    ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_add_ps(Vtmp1,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_add_ps(Vtmp1,Vtmp4);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Stmp1.f-Stmp3.f;)                                    ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_sub_ps(Vtmp1,Vtmp3);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_sub_ps(Vtmp1,Vtmp3);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Stmp1.f*Stmp2.f;)                                    ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Vtmp1,Vtmp2);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Vtmp1,Vtmp2);)\n\nENABLE_SCALAR_IMPLEMENTATION(Sch.f=Sch.f+Stmp1.f;)                                        ENABLE_SSE_IMPLEMENTATION(Vch=_mm_add_ps(Vch,Vtmp1);)                                     ENABLE_AVX_IMPLEMENTATION(Vch=_mm256_add_ps(Vch,Vtmp1);)\n\nENABLE_SCALAR_IMPLEMENTATION(Stmp1.ui=~Stmp5.ui&Ssh.ui;)                                  ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_andnot_ps(Vtmp5,Vsh);)                                ENABLE_AVX_IMPLEMENTATION(Vtmp1=Vch;)\nENABLE_SCALAR_IMPLEMENTATION(Stmp2.ui=~Stmp5.ui&Sch.ui;)                                  ENABLE_SSE_IMPLEMENTATION(Vtmp2=_mm_andnot_ps(Vtmp5,Vch);)                                ENABLE_AVX_IMPLEMENTATION(Vch=_mm256_blendv_ps(Vsh,Vch,Vtmp5);)\nENABLE_SCALAR_IMPLEMENTATION(Sch.ui=Stmp5.ui&Sch.ui;)                                     ENABLE_SSE_IMPLEMENTATION(Vch=_mm_and_ps(Vtmp5,Vch);)                                     ENABLE_AVX_IMPLEMENTATION(Vsh=_mm256_blendv_ps(Vtmp1,Vsh,Vtmp5);)\nENABLE_SCALAR_IMPLEMENTATION(Ssh.ui=Stmp5.ui&Ssh.ui;)                                     ENABLE_SSE_IMPLEMENTATION(Vsh=_mm_and_ps(Vtmp5,Vsh);)\nENABLE_SCALAR_IMPLEMENTATION(Sch.ui=Sch.ui|Stmp1.ui;)                                     ENABLE_SSE_IMPLEMENTATION(Vch=_mm_or_ps(Vch,Vtmp1);)\nENABLE_SCALAR_IMPLEMENTATION(Ssh.ui=Ssh.ui|Stmp2.ui;)                                     ENABLE_SSE_IMPLEMENTATION(Vsh=_mm_or_ps(Vsh,Vtmp2);)\n\nENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sch.f*Sch.f;)                                        ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Vch,Vch);)                                     ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Vch,Vch);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp2.f=Ssh.f*Ssh.f;)                                        ENABLE_SSE_IMPLEMENTATION(Vtmp2=_mm_mul_ps(Vsh,Vsh);)                                     ENABLE_AVX_IMPLEMENTATION(Vtmp2=_mm256_mul_ps(Vsh,Vsh);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp2.f=Stmp1.f+Stmp2.f;)                                    ENABLE_SSE_IMPLEMENTATION(Vtmp2=_mm_add_ps(Vtmp1,Vtmp2);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp2=_mm256_add_ps(Vtmp1,Vtmp2);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=rsqrt(Stmp2.f);)                                     ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_rsqrt_ps(Vtmp2);)                                     ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_rsqrt_ps(Vtmp2);)\n\nENABLE_SCALAR_IMPLEMENTATION(Stmp4.f=Stmp1.f*Sone_half.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp4=_mm_mul_ps(Vtmp1,Vone_half);)                             ENABLE_AVX_IMPLEMENTATION(Vtmp4=_mm256_mul_ps(Vtmp1,Vone_half);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp3.f=Stmp1.f*Stmp4.f;)                                    ENABLE_SSE_IMPLEMENTATION(Vtmp3=_mm_mul_ps(Vtmp1,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp3=_mm256_mul_ps(Vtmp1,Vtmp4);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp3.f=Stmp1.f*Stmp3.f;)                                    ENABLE_SSE_IMPLEMENTATION(Vtmp3=_mm_mul_ps(Vtmp1,Vtmp3);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp3=_mm256_mul_ps(Vtmp1,Vtmp3);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp3.f=Stmp2.f*Stmp3.f;)                                    ENABLE_SSE_IMPLEMENTATION(Vtmp3=_mm_mul_ps(Vtmp2,Vtmp3);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp3=_mm256_mul_ps(Vtmp2,Vtmp3);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Stmp1.f+Stmp4.f;)                                    ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_add_ps(Vtmp1,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_add_ps(Vtmp1,Vtmp4);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Stmp1.f-Stmp3.f;)                                    ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_sub_ps(Vtmp1,Vtmp3);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_sub_ps(Vtmp1,Vtmp3);)\n\nENABLE_SCALAR_IMPLEMENTATION(Sch.f=Sch.f*Stmp1.f;)                                        ENABLE_SSE_IMPLEMENTATION(Vch=_mm_mul_ps(Vch,Vtmp1);)                                     ENABLE_AVX_IMPLEMENTATION(Vch=_mm256_mul_ps(Vch,Vtmp1);)\nENABLE_SCALAR_IMPLEMENTATION(Ssh.f=Ssh.f*Stmp1.f;)                                        ENABLE_SSE_IMPLEMENTATION(Vsh=_mm_mul_ps(Vsh,Vtmp1);)                                     ENABLE_AVX_IMPLEMENTATION(Vsh=_mm256_mul_ps(Vsh,Vtmp1);)\n\nENABLE_SCALAR_IMPLEMENTATION(Sc.f=Sch.f*Sch.f;)                                           ENABLE_SSE_IMPLEMENTATION(Vc=_mm_mul_ps(Vch,Vch);)                                        ENABLE_AVX_IMPLEMENTATION(Vc=_mm256_mul_ps(Vch,Vch);)ENABLE_SCALAR_IMPLEMENTATION(Ss.f=Ssh.f*Ssh.f;)                                           ENABLE_SSE_IMPLEMENTATION(Vs=_mm_mul_ps(Vsh,Vsh);)                                        ENABLE_AVX_IMPLEMENTATION(Vs=_mm256_mul_ps(Vsh,Vsh);)\nENABLE_SCALAR_IMPLEMENTATION(Sc.f=Sc.f-Ss.f;)                                             ENABLE_SSE_IMPLEMENTATION(Vc=_mm_sub_ps(Vc,Vs);)                                          ENABLE_AVX_IMPLEMENTATION(Vc=_mm256_sub_ps(Vc,Vs);)\nENABLE_SCALAR_IMPLEMENTATION(Ss.f=Ssh.f*Sch.f;)                                           ENABLE_SSE_IMPLEMENTATION(Vs=_mm_mul_ps(Vsh,Vch);)                                        ENABLE_AVX_IMPLEMENTATION(Vs=_mm256_mul_ps(Vsh,Vch);)\nENABLE_SCALAR_IMPLEMENTATION(Ss.f=Ss.f+Ss.f;)                                             ENABLE_SSE_IMPLEMENTATION(Vs=_mm_add_ps(Vs,Vs);)                                          ENABLE_AVX_IMPLEMENTATION(Vs=_mm256_add_ps(Vs,Vs);)\n\n//###########################################################\n// Rotate matrix A\n//###########################################################\n\nENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Ss.f*SA11.f;)                                        ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Vs,VA11);)                                     ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Vs,VA11);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp2.f=Ss.f*SA21.f;)                                        ENABLE_SSE_IMPLEMENTATION(Vtmp2=_mm_mul_ps(Vs,VA21);)                                     ENABLE_AVX_IMPLEMENTATION(Vtmp2=_mm256_mul_ps(Vs,VA21);)\nENABLE_SCALAR_IMPLEMENTATION(SA11.f=Sc.f*SA11.f;)                                         ENABLE_SSE_IMPLEMENTATION(VA11=_mm_mul_ps(Vc,VA11);)                                      ENABLE_AVX_IMPLEMENTATION(VA11=_mm256_mul_ps(Vc,VA11);)\nENABLE_SCALAR_IMPLEMENTATION(SA21.f=Sc.f*SA21.f;)                                         ENABLE_SSE_IMPLEMENTATION(VA21=_mm_mul_ps(Vc,VA21);)                                      ENABLE_AVX_IMPLEMENTATION(VA21=_mm256_mul_ps(Vc,VA21);)\nENABLE_SCALAR_IMPLEMENTATION(SA11.f=SA11.f+Stmp2.f;)                                      ENABLE_SSE_IMPLEMENTATION(VA11=_mm_add_ps(VA11,Vtmp2);)                                   ENABLE_AVX_IMPLEMENTATION(VA11=_mm256_add_ps(VA11,Vtmp2);)\nENABLE_SCALAR_IMPLEMENTATION(SA21.f=SA21.f-Stmp1.f;)                                      ENABLE_SSE_IMPLEMENTATION(VA21=_mm_sub_ps(VA21,Vtmp1);)                                   ENABLE_AVX_IMPLEMENTATION(VA21=_mm256_sub_ps(VA21,Vtmp1);)\n\nENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Ss.f*SA12.f;)                                        ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Vs,VA12);)                                     ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Vs,VA12);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp2.f=Ss.f*SA22.f;)                                        ENABLE_SSE_IMPLEMENTATION(Vtmp2=_mm_mul_ps(Vs,VA22);)                                     ENABLE_AVX_IMPLEMENTATION(Vtmp2=_mm256_mul_ps(Vs,VA22);)\nENABLE_SCALAR_IMPLEMENTATION(SA12.f=Sc.f*SA12.f;)                                         ENABLE_SSE_IMPLEMENTATION(VA12=_mm_mul_ps(Vc,VA12);)                                      ENABLE_AVX_IMPLEMENTATION(VA12=_mm256_mul_ps(Vc,VA12);)\nENABLE_SCALAR_IMPLEMENTATION(SA22.f=Sc.f*SA22.f;)                                         ENABLE_SSE_IMPLEMENTATION(VA22=_mm_mul_ps(Vc,VA22);)                                      ENABLE_AVX_IMPLEMENTATION(VA22=_mm256_mul_ps(Vc,VA22);)\nENABLE_SCALAR_IMPLEMENTATION(SA12.f=SA12.f+Stmp2.f;)                                      ENABLE_SSE_IMPLEMENTATION(VA12=_mm_add_ps(VA12,Vtmp2);)                                   ENABLE_AVX_IMPLEMENTATION(VA12=_mm256_add_ps(VA12,Vtmp2);)\nENABLE_SCALAR_IMPLEMENTATION(SA22.f=SA22.f-Stmp1.f;)                                      ENABLE_SSE_IMPLEMENTATION(VA22=_mm_sub_ps(VA22,Vtmp1);)                                   ENABLE_AVX_IMPLEMENTATION(VA22=_mm256_sub_ps(VA22,Vtmp1);)\n\nENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Ss.f*SA13.f;)                                        ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Vs,VA13);)                                     ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Vs,VA13);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp2.f=Ss.f*SA23.f;)                                        ENABLE_SSE_IMPLEMENTATION(Vtmp2=_mm_mul_ps(Vs,VA23);)                                     ENABLE_AVX_IMPLEMENTATION(Vtmp2=_mm256_mul_ps(Vs,VA23);)\nENABLE_SCALAR_IMPLEMENTATION(SA13.f=Sc.f*SA13.f;)                                         ENABLE_SSE_IMPLEMENTATION(VA13=_mm_mul_ps(Vc,VA13);)                                      ENABLE_AVX_IMPLEMENTATION(VA13=_mm256_mul_ps(Vc,VA13);)\nENABLE_SCALAR_IMPLEMENTATION(SA23.f=Sc.f*SA23.f;)                                         ENABLE_SSE_IMPLEMENTATION(VA23=_mm_mul_ps(Vc,VA23);)                                      ENABLE_AVX_IMPLEMENTATION(VA23=_mm256_mul_ps(Vc,VA23);)\nENABLE_SCALAR_IMPLEMENTATION(SA13.f=SA13.f+Stmp2.f;)                                      ENABLE_SSE_IMPLEMENTATION(VA13=_mm_add_ps(VA13,Vtmp2);)                                   ENABLE_AVX_IMPLEMENTATION(VA13=_mm256_add_ps(VA13,Vtmp2);)\nENABLE_SCALAR_IMPLEMENTATION(SA23.f=SA23.f-Stmp1.f;)                                      ENABLE_SSE_IMPLEMENTATION(VA23=_mm_sub_ps(VA23,Vtmp1);)                                   ENABLE_AVX_IMPLEMENTATION(VA23=_mm256_sub_ps(VA23,Vtmp1);)\n\n//###########################################################\n// Update matrix U\n//###########################################################\n\n#ifdef COMPUTE_U_AS_MATRIX\nENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Ss.f*SU11.f;)                                        ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Vs,VU11);)                                     ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Vs,VU11);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp2.f=Ss.f*SU12.f;)                                        ENABLE_SSE_IMPLEMENTATION(Vtmp2=_mm_mul_ps(Vs,VU12);)                                     ENABLE_AVX_IMPLEMENTATION(Vtmp2=_mm256_mul_ps(Vs,VU12);)\nENABLE_SCALAR_IMPLEMENTATION(SU11.f=Sc.f*SU11.f;)                                         ENABLE_SSE_IMPLEMENTATION(VU11=_mm_mul_ps(Vc,VU11);)                                      ENABLE_AVX_IMPLEMENTATION(VU11=_mm256_mul_ps(Vc,VU11);)\nENABLE_SCALAR_IMPLEMENTATION(SU12.f=Sc.f*SU12.f;)                                         ENABLE_SSE_IMPLEMENTATION(VU12=_mm_mul_ps(Vc,VU12);)                                      ENABLE_AVX_IMPLEMENTATION(VU12=_mm256_mul_ps(Vc,VU12);)\nENABLE_SCALAR_IMPLEMENTATION(SU11.f=SU11.f+Stmp2.f;)                                      ENABLE_SSE_IMPLEMENTATION(VU11=_mm_add_ps(VU11,Vtmp2);)                                   ENABLE_AVX_IMPLEMENTATION(VU11=_mm256_add_ps(VU11,Vtmp2);)\nENABLE_SCALAR_IMPLEMENTATION(SU12.f=SU12.f-Stmp1.f;)                                      ENABLE_SSE_IMPLEMENTATION(VU12=_mm_sub_ps(VU12,Vtmp1);)                                   ENABLE_AVX_IMPLEMENTATION(VU12=_mm256_sub_ps(VU12,Vtmp1);)\n\nENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Ss.f*SU21.f;)                                        ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Vs,VU21);)                                     ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Vs,VU21);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp2.f=Ss.f*SU22.f;)                                        ENABLE_SSE_IMPLEMENTATION(Vtmp2=_mm_mul_ps(Vs,VU22);)                                     ENABLE_AVX_IMPLEMENTATION(Vtmp2=_mm256_mul_ps(Vs,VU22);)\nENABLE_SCALAR_IMPLEMENTATION(SU21.f=Sc.f*SU21.f;)                                         ENABLE_SSE_IMPLEMENTATION(VU21=_mm_mul_ps(Vc,VU21);)                                      ENABLE_AVX_IMPLEMENTATION(VU21=_mm256_mul_ps(Vc,VU21);)\nENABLE_SCALAR_IMPLEMENTATION(SU22.f=Sc.f*SU22.f;)                                         ENABLE_SSE_IMPLEMENTATION(VU22=_mm_mul_ps(Vc,VU22);)                                      ENABLE_AVX_IMPLEMENTATION(VU22=_mm256_mul_ps(Vc,VU22);)\nENABLE_SCALAR_IMPLEMENTATION(SU21.f=SU21.f+Stmp2.f;)                                      ENABLE_SSE_IMPLEMENTATION(VU21=_mm_add_ps(VU21,Vtmp2);)                                   ENABLE_AVX_IMPLEMENTATION(VU21=_mm256_add_ps(VU21,Vtmp2);)\nENABLE_SCALAR_IMPLEMENTATION(SU22.f=SU22.f-Stmp1.f;)                                      ENABLE_SSE_IMPLEMENTATION(VU22=_mm_sub_ps(VU22,Vtmp1);)                                   ENABLE_AVX_IMPLEMENTATION(VU22=_mm256_sub_ps(VU22,Vtmp1);)\n\nENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Ss.f*SU31.f;)                                        ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Vs,VU31);)                                     ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Vs,VU31);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp2.f=Ss.f*SU32.f;)                                        ENABLE_SSE_IMPLEMENTATION(Vtmp2=_mm_mul_ps(Vs,VU32);)                                     ENABLE_AVX_IMPLEMENTATION(Vtmp2=_mm256_mul_ps(Vs,VU32);)\nENABLE_SCALAR_IMPLEMENTATION(SU31.f=Sc.f*SU31.f;)                                         ENABLE_SSE_IMPLEMENTATION(VU31=_mm_mul_ps(Vc,VU31);)                                      ENABLE_AVX_IMPLEMENTATION(VU31=_mm256_mul_ps(Vc,VU31);)\nENABLE_SCALAR_IMPLEMENTATION(SU32.f=Sc.f*SU32.f;)                                         ENABLE_SSE_IMPLEMENTATION(VU32=_mm_mul_ps(Vc,VU32);)                                      ENABLE_AVX_IMPLEMENTATION(VU32=_mm256_mul_ps(Vc,VU32);)\nENABLE_SCALAR_IMPLEMENTATION(SU31.f=SU31.f+Stmp2.f;)                                      ENABLE_SSE_IMPLEMENTATION(VU31=_mm_add_ps(VU31,Vtmp2);)                                   ENABLE_AVX_IMPLEMENTATION(VU31=_mm256_add_ps(VU31,Vtmp2);)\nENABLE_SCALAR_IMPLEMENTATION(SU32.f=SU32.f-Stmp1.f;)                                      ENABLE_SSE_IMPLEMENTATION(VU32=_mm_sub_ps(VU32,Vtmp1);)                                   ENABLE_AVX_IMPLEMENTATION(VU32=_mm256_sub_ps(VU32,Vtmp1);)\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/Singular_Value_Decomposition_Jacobi_Conjugation_Kernel.hpp",
    "content": "//#####################################################################\n// Copyright (c) 2010-2011, Eftychios Sifakis.\n//\n// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n//   * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n//   * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or\n//     other materials provided with the distribution.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,\n// BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n// SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//#####################################################################\n\n//###########################################################\n// Compute the Givens angle (and half-angle) \n//###########################################################\n\nENABLE_SCALAR_IMPLEMENTATION(Ssh.f=SS21.f*Sone_half.f;)                                   ENABLE_SSE_IMPLEMENTATION(Vsh=_mm_mul_ps(VS21,Vone_half);)                                ENABLE_AVX_IMPLEMENTATION(Vsh=_mm256_mul_ps(VS21,Vone_half);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp5.f=SS11.f-SS22.f;)                                      ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_sub_ps(VS11,VS22);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_sub_ps(VS11,VS22);)\n\nENABLE_SCALAR_IMPLEMENTATION(Stmp2.f=Ssh.f*Ssh.f;)                                        ENABLE_SSE_IMPLEMENTATION(Vtmp2=_mm_mul_ps(Vsh,Vsh);)                                     ENABLE_AVX_IMPLEMENTATION(Vtmp2=_mm256_mul_ps(Vsh,Vsh);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp1.ui=(Stmp2.f>=Stiny_number.f)?0xffffffff:0;)            ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_cmpge_ps(Vtmp2,Vtiny_number);)                        ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_cmp_ps(Vtmp2,Vtiny_number, _CMP_GE_OS);) //ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_cmpge_ps(Vtmp2,Vtiny_number);)\nENABLE_SCALAR_IMPLEMENTATION(Ssh.ui=Stmp1.ui&Ssh.ui;)                                     ENABLE_SSE_IMPLEMENTATION(Vsh=_mm_and_ps(Vtmp1,Vsh);)                                     ENABLE_AVX_IMPLEMENTATION(Vsh=_mm256_and_ps(Vtmp1,Vsh);)\nENABLE_SCALAR_IMPLEMENTATION(Sch.ui=Stmp1.ui&Stmp5.ui;)                                   ENABLE_SSE_IMPLEMENTATION(Vch=_mm_and_ps(Vtmp1,Vtmp5);)                                   ENABLE_AVX_IMPLEMENTATION(Vch=_mm256_blendv_ps(Vone,Vtmp5,Vtmp1);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp2.ui=~Stmp1.ui&Sone.ui;)                                 ENABLE_SSE_IMPLEMENTATION(Vtmp2=_mm_andnot_ps(Vtmp1,Vone);)\nENABLE_SCALAR_IMPLEMENTATION(Sch.ui=Sch.ui|Stmp2.ui;)                                     ENABLE_SSE_IMPLEMENTATION(Vch=_mm_or_ps(Vch,Vtmp2);)\n\nENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Ssh.f*Ssh.f;)                                        ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Vsh,Vsh);)                                     ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Vsh,Vsh);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp2.f=Sch.f*Sch.f;)                                        ENABLE_SSE_IMPLEMENTATION(Vtmp2=_mm_mul_ps(Vch,Vch);)                                     ENABLE_AVX_IMPLEMENTATION(Vtmp2=_mm256_mul_ps(Vch,Vch);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp3.f=Stmp1.f+Stmp2.f;)                                    ENABLE_SSE_IMPLEMENTATION(Vtmp3=_mm_add_ps(Vtmp1,Vtmp2);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp3=_mm256_add_ps(Vtmp1,Vtmp2);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp4.f=rsqrt(Stmp3.f);)                                     ENABLE_SSE_IMPLEMENTATION(Vtmp4=_mm_rsqrt_ps(Vtmp3);)                                     ENABLE_AVX_IMPLEMENTATION(Vtmp4=_mm256_rsqrt_ps(Vtmp3);)\n\n#ifdef USE_ACCURATE_RSQRT_IN_JACOBI_CONJUGATION\nENABLE_SCALAR_IMPLEMENTATION(Ss.f=Stmp4.f*Sone_half.f;)                                   ENABLE_SSE_IMPLEMENTATION(Vs=_mm_mul_ps(Vtmp4,Vone_half);)                                ENABLE_AVX_IMPLEMENTATION(Vs=_mm256_mul_ps(Vtmp4,Vone_half);)\nENABLE_SCALAR_IMPLEMENTATION(Sc.f=Stmp4.f*Ss.f;)                                          ENABLE_SSE_IMPLEMENTATION(Vc=_mm_mul_ps(Vtmp4,Vs);)                                       ENABLE_AVX_IMPLEMENTATION(Vc=_mm256_mul_ps(Vtmp4,Vs);)\nENABLE_SCALAR_IMPLEMENTATION(Sc.f=Stmp4.f*Sc.f;)                                          ENABLE_SSE_IMPLEMENTATION(Vc=_mm_mul_ps(Vtmp4,Vc);)                                       ENABLE_AVX_IMPLEMENTATION(Vc=_mm256_mul_ps(Vtmp4,Vc);)\nENABLE_SCALAR_IMPLEMENTATION(Sc.f=Stmp3.f*Sc.f;)                                          ENABLE_SSE_IMPLEMENTATION(Vc=_mm_mul_ps(Vtmp3,Vc);)                                       ENABLE_AVX_IMPLEMENTATION(Vc=_mm256_mul_ps(Vtmp3,Vc);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp4.f=Stmp4.f+Ss.f;)                                       ENABLE_SSE_IMPLEMENTATION(Vtmp4=_mm_add_ps(Vtmp4,Vs);)                                    ENABLE_AVX_IMPLEMENTATION(Vtmp4=_mm256_add_ps(Vtmp4,Vs);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp4.f=Stmp4.f-Sc.f;)                                       ENABLE_SSE_IMPLEMENTATION(Vtmp4=_mm_sub_ps(Vtmp4,Vc);)                                    ENABLE_AVX_IMPLEMENTATION(Vtmp4=_mm256_sub_ps(Vtmp4,Vc);)\n#endif\n\nENABLE_SCALAR_IMPLEMENTATION(Ssh.f=Stmp4.f*Ssh.f;)                                        ENABLE_SSE_IMPLEMENTATION(Vsh=_mm_mul_ps(Vtmp4,Vsh);)                                     ENABLE_AVX_IMPLEMENTATION(Vsh=_mm256_mul_ps(Vtmp4,Vsh);)\nENABLE_SCALAR_IMPLEMENTATION(Sch.f=Stmp4.f*Sch.f;)                                        ENABLE_SSE_IMPLEMENTATION(Vch=_mm_mul_ps(Vtmp4,Vch);)                                     ENABLE_AVX_IMPLEMENTATION(Vch=_mm256_mul_ps(Vtmp4,Vch);)\n\nENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sfour_gamma_squared.f*Stmp1.f;)                      ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Vfour_gamma_squared,Vtmp1);)                   ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Vfour_gamma_squared,Vtmp1);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp1.ui=(Stmp2.f<=Stmp1.f)?0xffffffff:0;)                   ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_cmple_ps(Vtmp2,Vtmp1);)                               ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_cmp_ps(Vtmp2,Vtmp1, _CMP_LE_OS);) //ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_cmple_ps(Vtmp2,Vtmp1);)\n\nENABLE_SCALAR_IMPLEMENTATION(Stmp2.ui=Ssine_pi_over_eight.ui&Stmp1.ui;)                   ENABLE_SSE_IMPLEMENTATION(Vtmp2=_mm_and_ps(Vsine_pi_over_eight,Vtmp1);)                   ENABLE_AVX_IMPLEMENTATION(Vsh=_mm256_blendv_ps(Vsh,Vsine_pi_over_eight,Vtmp1);)\nENABLE_SCALAR_IMPLEMENTATION(Ssh.ui=~Stmp1.ui&Ssh.ui;)                                    ENABLE_SSE_IMPLEMENTATION(Vsh=_mm_andnot_ps(Vtmp1,Vsh);)\nENABLE_SCALAR_IMPLEMENTATION(Ssh.ui=Ssh.ui|Stmp2.ui;)                                     ENABLE_SSE_IMPLEMENTATION(Vsh=_mm_or_ps(Vsh,Vtmp2);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp2.ui=Scosine_pi_over_eight.ui&Stmp1.ui;)                 ENABLE_SSE_IMPLEMENTATION(Vtmp2=_mm_and_ps(Vcosine_pi_over_eight,Vtmp1);)                 ENABLE_AVX_IMPLEMENTATION(Vch=_mm256_blendv_ps(Vch,Vcosine_pi_over_eight,Vtmp1);)\nENABLE_SCALAR_IMPLEMENTATION(Sch.ui=~Stmp1.ui&Sch.ui;)                                    ENABLE_SSE_IMPLEMENTATION(Vch=_mm_andnot_ps(Vtmp1,Vch);)\nENABLE_SCALAR_IMPLEMENTATION(Sch.ui=Sch.ui|Stmp2.ui;)                                     ENABLE_SSE_IMPLEMENTATION(Vch=_mm_or_ps(Vch,Vtmp2);)\n\nENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Ssh.f*Ssh.f;)                                        ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Vsh,Vsh);)                                     ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Vsh,Vsh);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp2.f=Sch.f*Sch.f;)                                        ENABLE_SSE_IMPLEMENTATION(Vtmp2=_mm_mul_ps(Vch,Vch);)                                     ENABLE_AVX_IMPLEMENTATION(Vtmp2=_mm256_mul_ps(Vch,Vch);)\nENABLE_SCALAR_IMPLEMENTATION(Sc.f=Stmp2.f-Stmp1.f;)                                       ENABLE_SSE_IMPLEMENTATION(Vc=_mm_sub_ps(Vtmp2,Vtmp1);)                                    ENABLE_AVX_IMPLEMENTATION(Vc=_mm256_sub_ps(Vtmp2,Vtmp1);)\nENABLE_SCALAR_IMPLEMENTATION(Ss.f=Sch.f*Ssh.f;)                                           ENABLE_SSE_IMPLEMENTATION(Vs=_mm_mul_ps(Vch,Vsh);)                                        ENABLE_AVX_IMPLEMENTATION(Vs=_mm256_mul_ps(Vch,Vsh);)\nENABLE_SCALAR_IMPLEMENTATION(Ss.f=Ss.f+Ss.f;)                                             ENABLE_SSE_IMPLEMENTATION(Vs=_mm_add_ps(Vs,Vs);)                                          ENABLE_AVX_IMPLEMENTATION(Vs=_mm256_add_ps(Vs,Vs);)\n\n//###########################################################\n// Perform the actual Givens conjugation\n//###########################################################\n\n#ifndef USE_ACCURATE_RSQRT_IN_JACOBI_CONJUGATION\nENABLE_SCALAR_IMPLEMENTATION(Stmp3.f=Stmp1.f+Stmp2.f;)                                    ENABLE_SSE_IMPLEMENTATION(Vtmp3=_mm_add_ps(Vtmp1,Vtmp2);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp3=_mm256_add_ps(Vtmp1,Vtmp2);)\nENABLE_SCALAR_IMPLEMENTATION(SS33.f=SS33.f*Stmp3.f;)                                      ENABLE_SSE_IMPLEMENTATION(VS33=_mm_mul_ps(VS33,Vtmp3);)                                   ENABLE_AVX_IMPLEMENTATION(VS33=_mm256_mul_ps(VS33,Vtmp3);)\nENABLE_SCALAR_IMPLEMENTATION(SS31.f=SS31.f*Stmp3.f;)                                      ENABLE_SSE_IMPLEMENTATION(VS31=_mm_mul_ps(VS31,Vtmp3);)                                   ENABLE_AVX_IMPLEMENTATION(VS31=_mm256_mul_ps(VS31,Vtmp3);)\nENABLE_SCALAR_IMPLEMENTATION(SS32.f=SS32.f*Stmp3.f;)                                      ENABLE_SSE_IMPLEMENTATION(VS32=_mm_mul_ps(VS32,Vtmp3);)                                   ENABLE_AVX_IMPLEMENTATION(VS32=_mm256_mul_ps(VS32,Vtmp3);)\nENABLE_SCALAR_IMPLEMENTATION(SS33.f=SS33.f*Stmp3.f;)                                      ENABLE_SSE_IMPLEMENTATION(VS33=_mm_mul_ps(VS33,Vtmp3);)                                   ENABLE_AVX_IMPLEMENTATION(VS33=_mm256_mul_ps(VS33,Vtmp3);)\n#endif\n\nENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Ss.f*SS31.f;)                                        ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Vs,VS31);)                                     ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Vs,VS31);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp2.f=Ss.f*SS32.f;)                                        ENABLE_SSE_IMPLEMENTATION(Vtmp2=_mm_mul_ps(Vs,VS32);)                                     ENABLE_AVX_IMPLEMENTATION(Vtmp2=_mm256_mul_ps(Vs,VS32);)\nENABLE_SCALAR_IMPLEMENTATION(SS31.f=Sc.f*SS31.f;)                                         ENABLE_SSE_IMPLEMENTATION(VS31=_mm_mul_ps(Vc,VS31);)                                      ENABLE_AVX_IMPLEMENTATION(VS31=_mm256_mul_ps(Vc,VS31);)\nENABLE_SCALAR_IMPLEMENTATION(SS32.f=Sc.f*SS32.f;)                                         ENABLE_SSE_IMPLEMENTATION(VS32=_mm_mul_ps(Vc,VS32);)                                      ENABLE_AVX_IMPLEMENTATION(VS32=_mm256_mul_ps(Vc,VS32);)\nENABLE_SCALAR_IMPLEMENTATION(SS31.f=Stmp2.f+SS31.f;)                                      ENABLE_SSE_IMPLEMENTATION(VS31=_mm_add_ps(Vtmp2,VS31);)                                   ENABLE_AVX_IMPLEMENTATION(VS31=_mm256_add_ps(Vtmp2,VS31);)\nENABLE_SCALAR_IMPLEMENTATION(SS32.f=SS32.f-Stmp1.f;)                                      ENABLE_SSE_IMPLEMENTATION(VS32=_mm_sub_ps(VS32,Vtmp1);)                                   ENABLE_AVX_IMPLEMENTATION(VS32=_mm256_sub_ps(VS32,Vtmp1);)\n\nENABLE_SCALAR_IMPLEMENTATION(Stmp2.f=Ss.f*Ss.f;)                                          ENABLE_SSE_IMPLEMENTATION(Vtmp2=_mm_mul_ps(Vs,Vs);)                                       ENABLE_AVX_IMPLEMENTATION(Vtmp2=_mm256_mul_ps(Vs,Vs);)         \nENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=SS22.f*Stmp2.f;)                                     ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(VS22,Vtmp2);)                                  ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(VS22,Vtmp2);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp3.f=SS11.f*Stmp2.f;)                                     ENABLE_SSE_IMPLEMENTATION(Vtmp3=_mm_mul_ps(VS11,Vtmp2);)                                  ENABLE_AVX_IMPLEMENTATION(Vtmp3=_mm256_mul_ps(VS11,Vtmp2);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp4.f=Sc.f*Sc.f;)                                          ENABLE_SSE_IMPLEMENTATION(Vtmp4=_mm_mul_ps(Vc,Vc);)                                       ENABLE_AVX_IMPLEMENTATION(Vtmp4=_mm256_mul_ps(Vc,Vc);)\nENABLE_SCALAR_IMPLEMENTATION(SS11.f=SS11.f*Stmp4.f;)                                      ENABLE_SSE_IMPLEMENTATION(VS11=_mm_mul_ps(VS11,Vtmp4);)                                   ENABLE_AVX_IMPLEMENTATION(VS11=_mm256_mul_ps(VS11,Vtmp4);)\nENABLE_SCALAR_IMPLEMENTATION(SS22.f=SS22.f*Stmp4.f;)                                      ENABLE_SSE_IMPLEMENTATION(VS22=_mm_mul_ps(VS22,Vtmp4);)                                   ENABLE_AVX_IMPLEMENTATION(VS22=_mm256_mul_ps(VS22,Vtmp4);)\nENABLE_SCALAR_IMPLEMENTATION(SS11.f=SS11.f+Stmp1.f;)                                      ENABLE_SSE_IMPLEMENTATION(VS11=_mm_add_ps(VS11,Vtmp1);)                                   ENABLE_AVX_IMPLEMENTATION(VS11=_mm256_add_ps(VS11,Vtmp1);)\nENABLE_SCALAR_IMPLEMENTATION(SS22.f=SS22.f+Stmp3.f;)                                      ENABLE_SSE_IMPLEMENTATION(VS22=_mm_add_ps(VS22,Vtmp3);)                                   ENABLE_AVX_IMPLEMENTATION(VS22=_mm256_add_ps(VS22,Vtmp3);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp4.f=Stmp4.f-Stmp2.f;)                                    ENABLE_SSE_IMPLEMENTATION(Vtmp4=_mm_sub_ps(Vtmp4,Vtmp2);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp4=_mm256_sub_ps(Vtmp4,Vtmp2);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp2.f=SS21.f+SS21.f;)                                      ENABLE_SSE_IMPLEMENTATION(Vtmp2=_mm_add_ps(VS21,VS21);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp2=_mm256_add_ps(VS21,VS21);)\nENABLE_SCALAR_IMPLEMENTATION(SS21.f=SS21.f*Stmp4.f;)                                      ENABLE_SSE_IMPLEMENTATION(VS21=_mm_mul_ps(VS21,Vtmp4);)                                   ENABLE_AVX_IMPLEMENTATION(VS21=_mm256_mul_ps(VS21,Vtmp4);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp4.f=Sc.f*Ss.f;)                                          ENABLE_SSE_IMPLEMENTATION(Vtmp4=_mm_mul_ps(Vc,Vs);)                                       ENABLE_AVX_IMPLEMENTATION(Vtmp4=_mm256_mul_ps(Vc,Vs);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp2.f=Stmp2.f*Stmp4.f;)                                    ENABLE_SSE_IMPLEMENTATION(Vtmp2=_mm_mul_ps(Vtmp2,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp2=_mm256_mul_ps(Vtmp2,Vtmp4);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp5.f=Stmp5.f*Stmp4.f;)                                    ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_mul_ps(Vtmp5,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_mul_ps(Vtmp5,Vtmp4);)\nENABLE_SCALAR_IMPLEMENTATION(SS11.f=SS11.f+Stmp2.f;)                                      ENABLE_SSE_IMPLEMENTATION(VS11=_mm_add_ps(VS11,Vtmp2);)                                   ENABLE_AVX_IMPLEMENTATION(VS11=_mm256_add_ps(VS11,Vtmp2);)\nENABLE_SCALAR_IMPLEMENTATION(SS21.f=SS21.f-Stmp5.f;)                                      ENABLE_SSE_IMPLEMENTATION(VS21=_mm_sub_ps(VS21,Vtmp5);)                                   ENABLE_AVX_IMPLEMENTATION(VS21=_mm256_sub_ps(VS21,Vtmp5);)\nENABLE_SCALAR_IMPLEMENTATION(SS22.f=SS22.f-Stmp2.f;)                                      ENABLE_SSE_IMPLEMENTATION(VS22=_mm_sub_ps(VS22,Vtmp2);)                                   ENABLE_AVX_IMPLEMENTATION(VS22=_mm256_sub_ps(VS22,Vtmp2);)\n\n//###########################################################\n// Compute the cumulative rotation, in quaternion form\n//###########################################################\n\nENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Ssh.f*Sqvvx.f;)                                      ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Vsh,Vqvvx);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Vsh,Vqvvx);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp2.f=Ssh.f*Sqvvy.f;)                                      ENABLE_SSE_IMPLEMENTATION(Vtmp2=_mm_mul_ps(Vsh,Vqvvy);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp2=_mm256_mul_ps(Vsh,Vqvvy);)\nENABLE_SCALAR_IMPLEMENTATION(Stmp3.f=Ssh.f*Sqvvz.f;)                                      ENABLE_SSE_IMPLEMENTATION(Vtmp3=_mm_mul_ps(Vsh,Vqvvz);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp3=_mm256_mul_ps(Vsh,Vqvvz);)\nENABLE_SCALAR_IMPLEMENTATION(Ssh.f=Ssh.f*Sqvs.f;)                                         ENABLE_SSE_IMPLEMENTATION(Vsh=_mm_mul_ps(Vsh,Vqvs);)                                      ENABLE_AVX_IMPLEMENTATION(Vsh=_mm256_mul_ps(Vsh,Vqvs);)\n\nENABLE_SCALAR_IMPLEMENTATION(Sqvs.f=Sch.f*Sqvs.f;)                                        ENABLE_SSE_IMPLEMENTATION(Vqvs=_mm_mul_ps(Vch,Vqvs);)                                     ENABLE_AVX_IMPLEMENTATION(Vqvs=_mm256_mul_ps(Vch,Vqvs);)\nENABLE_SCALAR_IMPLEMENTATION(Sqvvx.f=Sch.f*Sqvvx.f;)                                      ENABLE_SSE_IMPLEMENTATION(Vqvvx=_mm_mul_ps(Vch,Vqvvx);)                                   ENABLE_AVX_IMPLEMENTATION(Vqvvx=_mm256_mul_ps(Vch,Vqvvx);)\nENABLE_SCALAR_IMPLEMENTATION(Sqvvy.f=Sch.f*Sqvvy.f;)                                      ENABLE_SSE_IMPLEMENTATION(Vqvvy=_mm_mul_ps(Vch,Vqvvy);)                                   ENABLE_AVX_IMPLEMENTATION(Vqvvy=_mm256_mul_ps(Vch,Vqvvy);)\nENABLE_SCALAR_IMPLEMENTATION(Sqvvz.f=Sch.f*Sqvvz.f;)                                      ENABLE_SSE_IMPLEMENTATION(Vqvvz=_mm_mul_ps(Vch,Vqvvz);)                                   ENABLE_AVX_IMPLEMENTATION(Vqvvz=_mm256_mul_ps(Vch,Vqvvz);)\n\nENABLE_SCALAR_IMPLEMENTATION(SQVVZ.f=SQVVZ.f+Ssh.f;)                                      ENABLE_SSE_IMPLEMENTATION(VQVVZ=_mm_add_ps(VQVVZ,Vsh);)                                   ENABLE_AVX_IMPLEMENTATION(VQVVZ=_mm256_add_ps(VQVVZ,Vsh);)\nENABLE_SCALAR_IMPLEMENTATION(Sqvs.f=Sqvs.f-STMP3.f;)                                      ENABLE_SSE_IMPLEMENTATION(Vqvs=_mm_sub_ps(Vqvs,VTMP3);)                                   ENABLE_AVX_IMPLEMENTATION(Vqvs=_mm256_sub_ps(Vqvs,VTMP3);)\nENABLE_SCALAR_IMPLEMENTATION(SQVVX.f=SQVVX.f+STMP2.f;)                                    ENABLE_SSE_IMPLEMENTATION(VQVVX=_mm_add_ps(VQVVX,VTMP2);)                                 ENABLE_AVX_IMPLEMENTATION(VQVVX=_mm256_add_ps(VQVVX,VTMP2);)\nENABLE_SCALAR_IMPLEMENTATION(SQVVY.f=SQVVY.f-STMP1.f;)                                    ENABLE_SSE_IMPLEMENTATION(VQVVY=_mm_sub_ps(VQVVY,VTMP1);)                                 ENABLE_AVX_IMPLEMENTATION(VQVVY=_mm256_sub_ps(VQVVY,VTMP1);)\n"
  },
  {
    "path": "libs/libigl/include/igl/Singular_Value_Decomposition_Kernel_Declarations.hpp",
    "content": "//#####################################################################\n// Copyright (c) 2010-2011, Eftychios Sifakis.\n//\n// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n//   * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n//   * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or\n//     other materials provided with the distribution.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,\n// BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n// SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//#####################################################################\n\n//###########################################################\n// Local variable declarations\n//###########################################################\n\n#ifdef PRINT_DEBUGGING_OUTPUT\n\n#ifdef USE_SSE_IMPLEMENTATION\n    float buf[4];\n    float A11,A21,A31,A12,A22,A32,A13,A23,A33;\n    float S11,S21,S31,S22,S32,S33;\n#ifdef COMPUTE_V_AS_QUATERNION\n    float QVS,QVVX,QVVY,QVVZ;\n#endif\n#ifdef COMPUTE_V_AS_MATRIX\n    float V11,V21,V31,V12,V22,V32,V13,V23,V33;\n#endif\n#ifdef COMPUTE_U_AS_QUATERNION\n    float QUS,QUVX,QUVY,QUVZ;\n#endif\n#ifdef COMPUTE_U_AS_MATRIX\n    float U11,U21,U31,U12,U22,U32,U13,U23,U33;\n#endif\n#endif\n\n#ifdef USE_AVX_IMPLEMENTATION\n    float buf[8];\n    float A11,A21,A31,A12,A22,A32,A13,A23,A33;\n    float S11,S21,S31,S22,S32,S33;\n#ifdef COMPUTE_V_AS_QUATERNION\n    float QVS,QVVX,QVVY,QVVZ;\n#endif\n#ifdef COMPUTE_V_AS_MATRIX\n    float V11,V21,V31,V12,V22,V32,V13,V23,V33;\n#endif\n#ifdef COMPUTE_U_AS_QUATERNION\n    float QUS,QUVX,QUVY,QUVZ;\n#endif\n#ifdef COMPUTE_U_AS_MATRIX\n    float U11,U21,U31,U12,U22,U32,U13,U23,U33;\n#endif\n#endif\n\n#endif\n\nconst float Four_Gamma_Squared=sqrt(8.)+3.;\nconst float Sine_Pi_Over_Eight=.5*sqrt(2.-sqrt(2.));\nconst float Cosine_Pi_Over_Eight=.5*sqrt(2.+sqrt(2.));\n\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Sfour_gamma_squared;)       ENABLE_SSE_IMPLEMENTATION(__m128 Vfour_gamma_squared;)                                    ENABLE_AVX_IMPLEMENTATION(__m256 Vfour_gamma_squared;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Ssine_pi_over_eight;)       ENABLE_SSE_IMPLEMENTATION(__m128 Vsine_pi_over_eight;)                                    ENABLE_AVX_IMPLEMENTATION(__m256 Vsine_pi_over_eight;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Scosine_pi_over_eight;)     ENABLE_SSE_IMPLEMENTATION(__m128 Vcosine_pi_over_eight;)                                  ENABLE_AVX_IMPLEMENTATION(__m256 Vcosine_pi_over_eight;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Sone_half;)                 ENABLE_SSE_IMPLEMENTATION(__m128 Vone_half;)                                              ENABLE_AVX_IMPLEMENTATION(__m256 Vone_half;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Sone;)                      ENABLE_SSE_IMPLEMENTATION(__m128 Vone;)                                                   ENABLE_AVX_IMPLEMENTATION(__m256 Vone;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Stiny_number;)              ENABLE_SSE_IMPLEMENTATION(__m128 Vtiny_number;)                                           ENABLE_AVX_IMPLEMENTATION(__m256 Vtiny_number;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Ssmall_number;)             ENABLE_SSE_IMPLEMENTATION(__m128 Vsmall_number;)                                          ENABLE_AVX_IMPLEMENTATION(__m256 Vsmall_number;)\n\nENABLE_SCALAR_IMPLEMENTATION(Sfour_gamma_squared.f=Four_Gamma_Squared;)                   ENABLE_SSE_IMPLEMENTATION(Vfour_gamma_squared=_mm_set1_ps(Four_Gamma_Squared);)           ENABLE_AVX_IMPLEMENTATION(Vfour_gamma_squared=_mm256_set1_ps(Four_Gamma_Squared);)\nENABLE_SCALAR_IMPLEMENTATION(Ssine_pi_over_eight.f=Sine_Pi_Over_Eight;)                   ENABLE_SSE_IMPLEMENTATION(Vsine_pi_over_eight=_mm_set1_ps(Sine_Pi_Over_Eight);)           ENABLE_AVX_IMPLEMENTATION(Vsine_pi_over_eight=_mm256_set1_ps(Sine_Pi_Over_Eight);)\nENABLE_SCALAR_IMPLEMENTATION(Scosine_pi_over_eight.f=Cosine_Pi_Over_Eight;)               ENABLE_SSE_IMPLEMENTATION(Vcosine_pi_over_eight=_mm_set1_ps(Cosine_Pi_Over_Eight);)       ENABLE_AVX_IMPLEMENTATION(Vcosine_pi_over_eight=_mm256_set1_ps(Cosine_Pi_Over_Eight);)\nENABLE_SCALAR_IMPLEMENTATION(Sone_half.f=.5;)                                             ENABLE_SSE_IMPLEMENTATION(Vone_half=_mm_set1_ps(.5);)                                     ENABLE_AVX_IMPLEMENTATION(Vone_half=_mm256_set1_ps(.5);)\nENABLE_SCALAR_IMPLEMENTATION(Sone.f=1.;)                                                  ENABLE_SSE_IMPLEMENTATION(Vone=_mm_set1_ps(1.);)                                          ENABLE_AVX_IMPLEMENTATION(Vone=_mm256_set1_ps(1.);)\nENABLE_SCALAR_IMPLEMENTATION(Stiny_number.f=1.e-20;)                                      ENABLE_SSE_IMPLEMENTATION(Vtiny_number=_mm_set1_ps(1.e-20);)                              ENABLE_AVX_IMPLEMENTATION(Vtiny_number=_mm256_set1_ps(1.e-20);)\nENABLE_SCALAR_IMPLEMENTATION(Ssmall_number.f=1.e-12;)                                     ENABLE_SSE_IMPLEMENTATION(Vsmall_number=_mm_set1_ps(1.e-12);)                             ENABLE_AVX_IMPLEMENTATION(Vsmall_number=_mm256_set1_ps(1.e-12);)\n\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Sa11;)                      ENABLE_SSE_IMPLEMENTATION(__m128 Va11;)                                                   ENABLE_AVX_IMPLEMENTATION(__m256 Va11;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Sa21;)                      ENABLE_SSE_IMPLEMENTATION(__m128 Va21;)                                                   ENABLE_AVX_IMPLEMENTATION(__m256 Va21;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Sa31;)                      ENABLE_SSE_IMPLEMENTATION(__m128 Va31;)                                                   ENABLE_AVX_IMPLEMENTATION(__m256 Va31;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Sa12;)                      ENABLE_SSE_IMPLEMENTATION(__m128 Va12;)                                                   ENABLE_AVX_IMPLEMENTATION(__m256 Va12;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Sa22;)                      ENABLE_SSE_IMPLEMENTATION(__m128 Va22;)                                                   ENABLE_AVX_IMPLEMENTATION(__m256 Va22;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Sa32;)                      ENABLE_SSE_IMPLEMENTATION(__m128 Va32;)                                                   ENABLE_AVX_IMPLEMENTATION(__m256 Va32;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Sa13;)                      ENABLE_SSE_IMPLEMENTATION(__m128 Va13;)                                                   ENABLE_AVX_IMPLEMENTATION(__m256 Va13;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Sa23;)                      ENABLE_SSE_IMPLEMENTATION(__m128 Va23;)                                                   ENABLE_AVX_IMPLEMENTATION(__m256 Va23;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Sa33;)                      ENABLE_SSE_IMPLEMENTATION(__m128 Va33;)                                                   ENABLE_AVX_IMPLEMENTATION(__m256 Va33;)\n\n#ifdef COMPUTE_V_AS_MATRIX\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Sv11;)                      ENABLE_SSE_IMPLEMENTATION(__m128 Vv11;)                                                   ENABLE_AVX_IMPLEMENTATION(__m256 Vv11;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Sv21;)                      ENABLE_SSE_IMPLEMENTATION(__m128 Vv21;)                                                   ENABLE_AVX_IMPLEMENTATION(__m256 Vv21;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Sv31;)                      ENABLE_SSE_IMPLEMENTATION(__m128 Vv31;)                                                   ENABLE_AVX_IMPLEMENTATION(__m256 Vv31;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Sv12;)                      ENABLE_SSE_IMPLEMENTATION(__m128 Vv12;)                                                   ENABLE_AVX_IMPLEMENTATION(__m256 Vv12;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Sv22;)                      ENABLE_SSE_IMPLEMENTATION(__m128 Vv22;)                                                   ENABLE_AVX_IMPLEMENTATION(__m256 Vv22;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Sv32;)                      ENABLE_SSE_IMPLEMENTATION(__m128 Vv32;)                                                   ENABLE_AVX_IMPLEMENTATION(__m256 Vv32;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Sv13;)                      ENABLE_SSE_IMPLEMENTATION(__m128 Vv13;)                                                   ENABLE_AVX_IMPLEMENTATION(__m256 Vv13;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Sv23;)                      ENABLE_SSE_IMPLEMENTATION(__m128 Vv23;)                                                   ENABLE_AVX_IMPLEMENTATION(__m256 Vv23;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Sv33;)                      ENABLE_SSE_IMPLEMENTATION(__m128 Vv33;)                                                   ENABLE_AVX_IMPLEMENTATION(__m256 Vv33;)\n#endif\n\n#ifdef COMPUTE_V_AS_QUATERNION\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Sqvs;)                      ENABLE_SSE_IMPLEMENTATION(__m128 Vqvs;)                                                   ENABLE_AVX_IMPLEMENTATION(__m256 Vqvs;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Sqvvx;)                     ENABLE_SSE_IMPLEMENTATION(__m128 Vqvvx;)                                                  ENABLE_AVX_IMPLEMENTATION(__m256 Vqvvx;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Sqvvy;)                     ENABLE_SSE_IMPLEMENTATION(__m128 Vqvvy;)                                                  ENABLE_AVX_IMPLEMENTATION(__m256 Vqvvy;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Sqvvz;)                     ENABLE_SSE_IMPLEMENTATION(__m128 Vqvvz;)                                                  ENABLE_AVX_IMPLEMENTATION(__m256 Vqvvz;)\n#endif\n\n#ifdef COMPUTE_U_AS_MATRIX\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Su11;)                      ENABLE_SSE_IMPLEMENTATION(__m128 Vu11;)                                                   ENABLE_AVX_IMPLEMENTATION(__m256 Vu11;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Su21;)                      ENABLE_SSE_IMPLEMENTATION(__m128 Vu21;)                                                   ENABLE_AVX_IMPLEMENTATION(__m256 Vu21;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Su31;)                      ENABLE_SSE_IMPLEMENTATION(__m128 Vu31;)                                                   ENABLE_AVX_IMPLEMENTATION(__m256 Vu31;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Su12;)                      ENABLE_SSE_IMPLEMENTATION(__m128 Vu12;)                                                   ENABLE_AVX_IMPLEMENTATION(__m256 Vu12;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Su22;)                      ENABLE_SSE_IMPLEMENTATION(__m128 Vu22;)                                                   ENABLE_AVX_IMPLEMENTATION(__m256 Vu22;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Su32;)                      ENABLE_SSE_IMPLEMENTATION(__m128 Vu32;)                                                   ENABLE_AVX_IMPLEMENTATION(__m256 Vu32;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Su13;)                      ENABLE_SSE_IMPLEMENTATION(__m128 Vu13;)                                                   ENABLE_AVX_IMPLEMENTATION(__m256 Vu13;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Su23;)                      ENABLE_SSE_IMPLEMENTATION(__m128 Vu23;)                                                   ENABLE_AVX_IMPLEMENTATION(__m256 Vu23;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Su33;)                      ENABLE_SSE_IMPLEMENTATION(__m128 Vu33;)                                                   ENABLE_AVX_IMPLEMENTATION(__m256 Vu33;)\n#endif\n\n#ifdef COMPUTE_U_AS_QUATERNION\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Squs;)                      ENABLE_SSE_IMPLEMENTATION(__m128 Vqus;)                                                   ENABLE_AVX_IMPLEMENTATION(__m256 Vqus;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Squvx;)                     ENABLE_SSE_IMPLEMENTATION(__m128 Vquvx;)                                                  ENABLE_AVX_IMPLEMENTATION(__m256 Vquvx;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Squvy;)                     ENABLE_SSE_IMPLEMENTATION(__m128 Vquvy;)                                                  ENABLE_AVX_IMPLEMENTATION(__m256 Vquvy;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Squvz;)                     ENABLE_SSE_IMPLEMENTATION(__m128 Vquvz;)                                                  ENABLE_AVX_IMPLEMENTATION(__m256 Vquvz;)\n#endif\n\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Sc;)                        ENABLE_SSE_IMPLEMENTATION(__m128 Vc;)                                                     ENABLE_AVX_IMPLEMENTATION(__m256 Vc;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Ss;)                        ENABLE_SSE_IMPLEMENTATION(__m128 Vs;)                                                     ENABLE_AVX_IMPLEMENTATION(__m256 Vs;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Sch;)                       ENABLE_SSE_IMPLEMENTATION(__m128 Vch;)                                                    ENABLE_AVX_IMPLEMENTATION(__m256 Vch;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Ssh;)                       ENABLE_SSE_IMPLEMENTATION(__m128 Vsh;)                                                    ENABLE_AVX_IMPLEMENTATION(__m256 Vsh;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Stmp1;)                     ENABLE_SSE_IMPLEMENTATION(__m128 Vtmp1;)                                                  ENABLE_AVX_IMPLEMENTATION(__m256 Vtmp1;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Stmp2;)                     ENABLE_SSE_IMPLEMENTATION(__m128 Vtmp2;)                                                  ENABLE_AVX_IMPLEMENTATION(__m256 Vtmp2;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Stmp3;)                     ENABLE_SSE_IMPLEMENTATION(__m128 Vtmp3;)                                                  ENABLE_AVX_IMPLEMENTATION(__m256 Vtmp3;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Stmp4;)                     ENABLE_SSE_IMPLEMENTATION(__m128 Vtmp4;)                                                  ENABLE_AVX_IMPLEMENTATION(__m256 Vtmp4;)\nENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Stmp5;)                     ENABLE_SSE_IMPLEMENTATION(__m128 Vtmp5;)                                                  ENABLE_AVX_IMPLEMENTATION(__m256 Vtmp5;)\n"
  },
  {
    "path": "libs/libigl/include/igl/Singular_Value_Decomposition_Main_Kernel_Body.hpp",
    "content": "//#####################################################################\n// Copyright (c) 2010-2011, Eftychios Sifakis.\n//\n// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n//   * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n//   * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or\n//     other materials provided with the distribution.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,\n// BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n// SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//#####################################################################\n\n#ifdef __INTEL_COMPILER\n#pragma warning( disable : 592 )\n#endif\n\n// #define USE_ACCURATE_RSQRT_IN_JACOBI_CONJUGATION\n// #define PERFORM_STRICT_QUATERNION_RENORMALIZATION\n\n{ // Begin block : Scope of qV (if not maintained)\n\n#ifndef COMPUTE_V_AS_QUATERNION\n    ENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Sqvs;)                  ENABLE_SSE_IMPLEMENTATION(__m128 Vqvs;)                                                   ENABLE_AVX_IMPLEMENTATION(__m256 Vqvs;) \n    ENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Sqvvx;)                 ENABLE_SSE_IMPLEMENTATION(__m128 Vqvvx;)                                                  ENABLE_AVX_IMPLEMENTATION(__m256 Vqvvx;)\n    ENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Sqvvy;)                 ENABLE_SSE_IMPLEMENTATION(__m128 Vqvvy;)                                                  ENABLE_AVX_IMPLEMENTATION(__m256 Vqvvy;)\n    ENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Sqvvz;)                 ENABLE_SSE_IMPLEMENTATION(__m128 Vqvvz;)                                                  ENABLE_AVX_IMPLEMENTATION(__m256 Vqvvz;)\n#endif\n\n{ // Begin block : Symmetric eigenanalysis\n\n    ENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Ss11;)                  ENABLE_SSE_IMPLEMENTATION(__m128 Vs11;)                                                   ENABLE_AVX_IMPLEMENTATION(__m256 Vs11;)\n    ENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Ss21;)                  ENABLE_SSE_IMPLEMENTATION(__m128 Vs21;)                                                   ENABLE_AVX_IMPLEMENTATION(__m256 Vs21;)\n    ENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Ss31;)                  ENABLE_SSE_IMPLEMENTATION(__m128 Vs31;)                                                   ENABLE_AVX_IMPLEMENTATION(__m256 Vs31;)\n    ENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Ss22;)                  ENABLE_SSE_IMPLEMENTATION(__m128 Vs22;)                                                   ENABLE_AVX_IMPLEMENTATION(__m256 Vs22;)\n    ENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Ss32;)                  ENABLE_SSE_IMPLEMENTATION(__m128 Vs32;)                                                   ENABLE_AVX_IMPLEMENTATION(__m256 Vs32;)\n    ENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Ss33;)                  ENABLE_SSE_IMPLEMENTATION(__m128 Vs33;)                                                   ENABLE_AVX_IMPLEMENTATION(__m256 Vs33;)\n\n    ENABLE_SCALAR_IMPLEMENTATION(Sqvs.f=1.;)                                              ENABLE_SSE_IMPLEMENTATION(Vqvs=Vone;)                                                     ENABLE_AVX_IMPLEMENTATION(Vqvs=Vone;)\n    ENABLE_SCALAR_IMPLEMENTATION(Sqvvx.f=0.;)                                             ENABLE_SSE_IMPLEMENTATION(Vqvvx=_mm_xor_ps(Vqvvx,Vqvvx);)                                 ENABLE_AVX_IMPLEMENTATION(Vqvvx=_mm256_xor_ps(Vqvvx,Vqvvx);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sqvvy.f=0.;)                                             ENABLE_SSE_IMPLEMENTATION(Vqvvy=_mm_xor_ps(Vqvvy,Vqvvy);)                                 ENABLE_AVX_IMPLEMENTATION(Vqvvy=_mm256_xor_ps(Vqvvy,Vqvvy);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sqvvz.f=0.;)                                             ENABLE_SSE_IMPLEMENTATION(Vqvvz=_mm_xor_ps(Vqvvz,Vqvvz);)                                 ENABLE_AVX_IMPLEMENTATION(Vqvvz=_mm256_xor_ps(Vqvvz,Vqvvz);)\n\n    //###########################################################\n    // Compute normal equations matrix\n    //###########################################################\n\n    ENABLE_SCALAR_IMPLEMENTATION(Ss11.f=Sa11.f*Sa11.f;)                                   ENABLE_SSE_IMPLEMENTATION(Vs11=_mm_mul_ps(Va11,Va11);)                                    ENABLE_AVX_IMPLEMENTATION(Vs11=_mm256_mul_ps(Va11,Va11);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sa21.f*Sa21.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Va21,Va21);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Va21,Va21);)\n    ENABLE_SCALAR_IMPLEMENTATION(Ss11.f=Stmp1.f+Ss11.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vs11=_mm_add_ps(Vtmp1,Vs11);)                                   ENABLE_AVX_IMPLEMENTATION(Vs11=_mm256_add_ps(Vtmp1,Vs11);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sa31.f*Sa31.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Va31,Va31);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Va31,Va31);)\n    ENABLE_SCALAR_IMPLEMENTATION(Ss11.f=Stmp1.f+Ss11.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vs11=_mm_add_ps(Vtmp1,Vs11);)                                   ENABLE_AVX_IMPLEMENTATION(Vs11=_mm256_add_ps(Vtmp1,Vs11);)\n\n    ENABLE_SCALAR_IMPLEMENTATION(Ss21.f=Sa12.f*Sa11.f;)                                   ENABLE_SSE_IMPLEMENTATION(Vs21=_mm_mul_ps(Va12,Va11);)                                    ENABLE_AVX_IMPLEMENTATION(Vs21=_mm256_mul_ps(Va12,Va11);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sa22.f*Sa21.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Va22,Va21);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Va22,Va21);)\n    ENABLE_SCALAR_IMPLEMENTATION(Ss21.f=Stmp1.f+Ss21.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vs21=_mm_add_ps(Vtmp1,Vs21);)                                   ENABLE_AVX_IMPLEMENTATION(Vs21=_mm256_add_ps(Vtmp1,Vs21);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sa32.f*Sa31.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Va32,Va31);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Va32,Va31);)\n    ENABLE_SCALAR_IMPLEMENTATION(Ss21.f=Stmp1.f+Ss21.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vs21=_mm_add_ps(Vtmp1,Vs21);)                                   ENABLE_AVX_IMPLEMENTATION(Vs21=_mm256_add_ps(Vtmp1,Vs21);)\n\n    ENABLE_SCALAR_IMPLEMENTATION(Ss31.f=Sa13.f*Sa11.f;)                                   ENABLE_SSE_IMPLEMENTATION(Vs31=_mm_mul_ps(Va13,Va11);)                                    ENABLE_AVX_IMPLEMENTATION(Vs31=_mm256_mul_ps(Va13,Va11);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sa23.f*Sa21.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Va23,Va21);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Va23,Va21);)\n    ENABLE_SCALAR_IMPLEMENTATION(Ss31.f=Stmp1.f+Ss31.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vs31=_mm_add_ps(Vtmp1,Vs31);)                                   ENABLE_AVX_IMPLEMENTATION(Vs31=_mm256_add_ps(Vtmp1,Vs31);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sa33.f*Sa31.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Va33,Va31);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Va33,Va31);)\n    ENABLE_SCALAR_IMPLEMENTATION(Ss31.f=Stmp1.f+Ss31.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vs31=_mm_add_ps(Vtmp1,Vs31);)                                   ENABLE_AVX_IMPLEMENTATION(Vs31=_mm256_add_ps(Vtmp1,Vs31);)\n\n    ENABLE_SCALAR_IMPLEMENTATION(Ss22.f=Sa12.f*Sa12.f;)                                   ENABLE_SSE_IMPLEMENTATION(Vs22=_mm_mul_ps(Va12,Va12);)                                    ENABLE_AVX_IMPLEMENTATION(Vs22=_mm256_mul_ps(Va12,Va12);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sa22.f*Sa22.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Va22,Va22);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Va22,Va22);)\n    ENABLE_SCALAR_IMPLEMENTATION(Ss22.f=Stmp1.f+Ss22.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vs22=_mm_add_ps(Vtmp1,Vs22);)                                   ENABLE_AVX_IMPLEMENTATION(Vs22=_mm256_add_ps(Vtmp1,Vs22);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sa32.f*Sa32.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Va32,Va32);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Va32,Va32);)\n    ENABLE_SCALAR_IMPLEMENTATION(Ss22.f=Stmp1.f+Ss22.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vs22=_mm_add_ps(Vtmp1,Vs22);)                                   ENABLE_AVX_IMPLEMENTATION(Vs22=_mm256_add_ps(Vtmp1,Vs22);)\n\n    ENABLE_SCALAR_IMPLEMENTATION(Ss32.f=Sa13.f*Sa12.f;)                                   ENABLE_SSE_IMPLEMENTATION(Vs32=_mm_mul_ps(Va13,Va12);)                                    ENABLE_AVX_IMPLEMENTATION(Vs32=_mm256_mul_ps(Va13,Va12);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sa23.f*Sa22.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Va23,Va22);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Va23,Va22);)\n    ENABLE_SCALAR_IMPLEMENTATION(Ss32.f=Stmp1.f+Ss32.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vs32=_mm_add_ps(Vtmp1,Vs32);)                                   ENABLE_AVX_IMPLEMENTATION(Vs32=_mm256_add_ps(Vtmp1,Vs32);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sa33.f*Sa32.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Va33,Va32);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Va33,Va32);)\n    ENABLE_SCALAR_IMPLEMENTATION(Ss32.f=Stmp1.f+Ss32.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vs32=_mm_add_ps(Vtmp1,Vs32);)                                   ENABLE_AVX_IMPLEMENTATION(Vs32=_mm256_add_ps(Vtmp1,Vs32);)\n\n    ENABLE_SCALAR_IMPLEMENTATION(Ss33.f=Sa13.f*Sa13.f;)                                   ENABLE_SSE_IMPLEMENTATION(Vs33=_mm_mul_ps(Va13,Va13);)                                    ENABLE_AVX_IMPLEMENTATION(Vs33=_mm256_mul_ps(Va13,Va13);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sa23.f*Sa23.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Va23,Va23);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Va23,Va23);)\n    ENABLE_SCALAR_IMPLEMENTATION(Ss33.f=Stmp1.f+Ss33.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vs33=_mm_add_ps(Vtmp1,Vs33);)                                   ENABLE_AVX_IMPLEMENTATION(Vs33=_mm256_add_ps(Vtmp1,Vs33);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sa33.f*Sa33.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Va33,Va33);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Va33,Va33);)\n    ENABLE_SCALAR_IMPLEMENTATION(Ss33.f=Stmp1.f+Ss33.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vs33=_mm_add_ps(Vtmp1,Vs33);)                                   ENABLE_AVX_IMPLEMENTATION(Vs33=_mm256_add_ps(Vtmp1,Vs33);)\n    \n    //###########################################################\n    // Solve symmetric eigenproblem using Jacobi iteration\n    //###########################################################\n\n    for(int sweep=1;sweep<=4;sweep++){\n\n        // First Jacobi conjugation\n\n#define SS11 Ss11\n#define SS21 Ss21\n#define SS31 Ss31\n#define SS22 Ss22\n#define SS32 Ss32\n#define SS33 Ss33\n#define SQVVX Sqvvx\n#define SQVVY Sqvvy\n#define SQVVZ Sqvvz\n#define STMP1 Stmp1\n#define STMP2 Stmp2\n#define STMP3 Stmp3\n\n#define VS11 Vs11\n#define VS21 Vs21\n#define VS31 Vs31\n#define VS22 Vs22\n#define VS32 Vs32\n#define VS33 Vs33\n#define VQVVX Vqvvx\n#define VQVVY Vqvvy\n#define VQVVZ Vqvvz\n#define VTMP1 Vtmp1\n#define VTMP2 Vtmp2\n#define VTMP3 Vtmp3\n\n#include \"Singular_Value_Decomposition_Jacobi_Conjugation_Kernel.hpp\"\n\n#undef SS11\n#undef SS21\n#undef SS31\n#undef SS22\n#undef SS32\n#undef SS33\n#undef SQVVX\n#undef SQVVY\n#undef SQVVZ\n#undef STMP1\n#undef STMP2\n#undef STMP3\n\n#undef VS11\n#undef VS21\n#undef VS31\n#undef VS22\n#undef VS32\n#undef VS33\n#undef VQVVX\n#undef VQVVY\n#undef VQVVZ\n#undef VTMP1\n#undef VTMP2\n#undef VTMP3\n\n        // Second Jacobi conjugation\n\n#define SS11 Ss22\n#define SS21 Ss32\n#define SS31 Ss21\n#define SS22 Ss33\n#define SS32 Ss31\n#define SS33 Ss11\n#define SQVVX Sqvvy\n#define SQVVY Sqvvz\n#define SQVVZ Sqvvx\n#define STMP1 Stmp2\n#define STMP2 Stmp3\n#define STMP3 Stmp1\n\n#define VS11 Vs22\n#define VS21 Vs32\n#define VS31 Vs21\n#define VS22 Vs33\n#define VS32 Vs31\n#define VS33 Vs11\n#define VQVVX Vqvvy\n#define VQVVY Vqvvz\n#define VQVVZ Vqvvx\n#define VTMP1 Vtmp2\n#define VTMP2 Vtmp3\n#define VTMP3 Vtmp1\n\n#include \"Singular_Value_Decomposition_Jacobi_Conjugation_Kernel.hpp\"\n\n#undef SS11\n#undef SS21\n#undef SS31\n#undef SS22\n#undef SS32\n#undef SS33\n#undef SQVVX\n#undef SQVVY\n#undef SQVVZ\n#undef STMP1\n#undef STMP2\n#undef STMP3\n\n#undef VS11\n#undef VS21\n#undef VS31\n#undef VS22\n#undef VS32\n#undef VS33\n#undef VQVVX\n#undef VQVVY\n#undef VQVVZ\n#undef VTMP1\n#undef VTMP2\n#undef VTMP3\n\n        // Third Jacobi conjugation\n\n#define SS11 Ss33\n#define SS21 Ss31\n#define SS31 Ss32\n#define SS22 Ss11\n#define SS32 Ss21\n#define SS33 Ss22\n#define SQVVX Sqvvz\n#define SQVVY Sqvvx\n#define SQVVZ Sqvvy\n#define STMP1 Stmp3\n#define STMP2 Stmp1\n#define STMP3 Stmp2\n\n#define VS11 Vs33\n#define VS21 Vs31\n#define VS31 Vs32\n#define VS22 Vs11\n#define VS32 Vs21\n#define VS33 Vs22\n#define VQVVX Vqvvz\n#define VQVVY Vqvvx\n#define VQVVZ Vqvvy\n#define VTMP1 Vtmp3\n#define VTMP2 Vtmp1\n#define VTMP3 Vtmp2\n\n#include \"Singular_Value_Decomposition_Jacobi_Conjugation_Kernel.hpp\"\n\n#undef SS11\n#undef SS21\n#undef SS31\n#undef SS22\n#undef SS32\n#undef SS33\n#undef SQVVX\n#undef SQVVY\n#undef SQVVZ\n#undef STMP1\n#undef STMP2\n#undef STMP3\n\n#undef VS11\n#undef VS21\n#undef VS31\n#undef VS22\n#undef VS32\n#undef VS33\n#undef VQVVX\n#undef VQVVY\n#undef VQVVZ\n#undef VTMP1\n#undef VTMP2\n#undef VTMP3\n    }\n\n#ifdef PRINT_DEBUGGING_OUTPUT\n#ifdef USE_SCALAR_IMPLEMENTATION\n    std::cout<<\"Scalar S =\"<<std::endl;\n    std::cout<<std::setw(12)<<Ss11.f<<std::endl;\n    std::cout<<std::setw(12)<<Ss21.f<<\"  \"<<std::setw(12)<<Ss22.f<<std::endl;\n    std::cout<<std::setw(12)<<Ss31.f<<\"  \"<<std::setw(12)<<Ss32.f<<\"  \"<<std::setw(12)<<Ss33.f<<std::endl;\n#endif\n#ifdef USE_SSE_IMPLEMENTATION\n    _mm_storeu_ps(buf,Vs11);S11=buf[0];\n    _mm_storeu_ps(buf,Vs21);S21=buf[0];\n    _mm_storeu_ps(buf,Vs31);S31=buf[0];\n    _mm_storeu_ps(buf,Vs22);S22=buf[0];\n    _mm_storeu_ps(buf,Vs32);S32=buf[0];\n    _mm_storeu_ps(buf,Vs33);S33=buf[0];\n    std::cout<<\"Vector S =\"<<std::endl;\n    std::cout<<std::setw(12)<<S11<<std::endl;\n    std::cout<<std::setw(12)<<S21<<\"  \"<<std::setw(12)<<S22<<std::endl;\n    std::cout<<std::setw(12)<<S31<<\"  \"<<std::setw(12)<<S32<<\"  \"<<std::setw(12)<<S33<<std::endl;\n#endif\n#ifdef USE_AVX_IMPLEMENTATION\n    _mm256_storeu_ps(buf,Vs11);S11=buf[0];\n    _mm256_storeu_ps(buf,Vs21);S21=buf[0];\n    _mm256_storeu_ps(buf,Vs31);S31=buf[0];\n    _mm256_storeu_ps(buf,Vs22);S22=buf[0];\n    _mm256_storeu_ps(buf,Vs32);S32=buf[0];\n    _mm256_storeu_ps(buf,Vs33);S33=buf[0];\n    std::cout<<\"Vector S =\"<<std::endl;\n    std::cout<<std::setw(12)<<S11<<std::endl;\n    std::cout<<std::setw(12)<<S21<<\"  \"<<std::setw(12)<<S22<<std::endl;\n    std::cout<<std::setw(12)<<S31<<\"  \"<<std::setw(12)<<S32<<\"  \"<<std::setw(12)<<S33<<std::endl;\n#endif\n#endif\n\n} // End block : Symmetric eigenanalysis\n\n    //###########################################################\n    // Normalize quaternion for matrix V\n    //###########################################################\n\n#if !defined(USE_ACCURATE_RSQRT_IN_JACOBI_CONJUGATION) || defined(PERFORM_STRICT_QUATERNION_RENORMALIZATION)\n\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp2.f=Sqvs.f*Sqvs.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vtmp2=_mm_mul_ps(Vqvs,Vqvs);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp2=_mm256_mul_ps(Vqvs,Vqvs);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sqvvx.f*Sqvvx.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Vqvvx,Vqvvx);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Vqvvx,Vqvvx);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp2.f=Stmp1.f+Stmp2.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp2=_mm_add_ps(Vtmp1,Vtmp2);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp2=_mm256_add_ps(Vtmp1,Vtmp2);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sqvvy.f*Sqvvy.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Vqvvy,Vqvvy);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Vqvvy,Vqvvy);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp2.f=Stmp1.f+Stmp2.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp2=_mm_add_ps(Vtmp1,Vtmp2);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp2=_mm256_add_ps(Vtmp1,Vtmp2);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sqvvz.f*Sqvvz.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Vqvvz,Vqvvz);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Vqvvz,Vqvvz);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp2.f=Stmp1.f+Stmp2.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp2=_mm_add_ps(Vtmp1,Vtmp2);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp2=_mm256_add_ps(Vtmp1,Vtmp2);)\n\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=rsqrt(Stmp2.f);)                                 ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_rsqrt_ps(Vtmp2);)                                     ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_rsqrt_ps(Vtmp2);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp4.f=Stmp1.f*Sone_half.f;)                            ENABLE_SSE_IMPLEMENTATION(Vtmp4=_mm_mul_ps(Vtmp1,Vone_half);)                             ENABLE_AVX_IMPLEMENTATION(Vtmp4=_mm256_mul_ps(Vtmp1,Vone_half);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp3.f=Stmp1.f*Stmp4.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp3=_mm_mul_ps(Vtmp1,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp3=_mm256_mul_ps(Vtmp1,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp3.f=Stmp1.f*Stmp3.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp3=_mm_mul_ps(Vtmp1,Vtmp3);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp3=_mm256_mul_ps(Vtmp1,Vtmp3);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp3.f=Stmp2.f*Stmp3.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp3=_mm_mul_ps(Vtmp2,Vtmp3);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp3=_mm256_mul_ps(Vtmp2,Vtmp3);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Stmp1.f+Stmp4.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_add_ps(Vtmp1,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_add_ps(Vtmp1,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Stmp1.f-Stmp3.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_sub_ps(Vtmp1,Vtmp3);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_sub_ps(Vtmp1,Vtmp3);)\n\n    ENABLE_SCALAR_IMPLEMENTATION(Sqvs.f=Sqvs.f*Stmp1.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vqvs=_mm_mul_ps(Vqvs,Vtmp1);)                                   ENABLE_AVX_IMPLEMENTATION(Vqvs=_mm256_mul_ps(Vqvs,Vtmp1);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sqvvx.f=Sqvvx.f*Stmp1.f;)                                ENABLE_SSE_IMPLEMENTATION(Vqvvx=_mm_mul_ps(Vqvvx,Vtmp1);)                                 ENABLE_AVX_IMPLEMENTATION(Vqvvx=_mm256_mul_ps(Vqvvx,Vtmp1);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sqvvy.f=Sqvvy.f*Stmp1.f;)                                ENABLE_SSE_IMPLEMENTATION(Vqvvy=_mm_mul_ps(Vqvvy,Vtmp1);)                                 ENABLE_AVX_IMPLEMENTATION(Vqvvy=_mm256_mul_ps(Vqvvy,Vtmp1);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sqvvz.f=Sqvvz.f*Stmp1.f;)                                ENABLE_SSE_IMPLEMENTATION(Vqvvz=_mm_mul_ps(Vqvvz,Vtmp1);)                                 ENABLE_AVX_IMPLEMENTATION(Vqvvz=_mm256_mul_ps(Vqvvz,Vtmp1);)\n\n#ifdef PRINT_DEBUGGING_OUTPUT\n#ifdef USE_SCALAR_IMPLEMENTATION\n    std::cout<<\"Scalar qV =\"<<std::endl;\n    std::cout<<std::setw(12)<<Sqvs.f<<\"  \"<<std::setw(12)<<Sqvvx.f<<\"  \"<<std::setw(12)<<Sqvvy.f<<\"  \"<<std::setw(12)<<Sqvvz.f<<std::endl;\n#endif\n#ifdef USE_SSE_IMPLEMENTATION\n    _mm_storeu_ps(buf,Vqvs);QVS=buf[0];\n    _mm_storeu_ps(buf,Vqvvx);QVVX=buf[0];\n    _mm_storeu_ps(buf,Vqvvy);QVVY=buf[0];\n    _mm_storeu_ps(buf,Vqvvz);QVVZ=buf[0];\n    std::cout<<\"Vector qV =\"<<std::endl;\n    std::cout<<std::setw(12)<<QVS<<\"  \"<<std::setw(12)<<QVVX<<\"  \"<<std::setw(12)<<QVVY<<\"  \"<<std::setw(12)<<QVVZ<<std::endl;\n#endif\n#ifdef USE_AVX_IMPLEMENTATION\n    _mm256_storeu_ps(buf,Vqvs);QVS=buf[0];\n    _mm256_storeu_ps(buf,Vqvvx);QVVX=buf[0];\n    _mm256_storeu_ps(buf,Vqvvy);QVVY=buf[0];\n    _mm256_storeu_ps(buf,Vqvvz);QVVZ=buf[0];\n    std::cout<<\"Vector qV =\"<<std::endl;\n    std::cout<<std::setw(12)<<QVS<<\"  \"<<std::setw(12)<<QVVX<<\"  \"<<std::setw(12)<<QVVY<<\"  \"<<std::setw(12)<<QVVZ<<std::endl;\n#endif\n#endif\n\n#endif\n\n{ // Begin block : Conjugation with V\n\n    //###########################################################\n    // Transform quaternion to matrix V\n    //###########################################################\n\n#ifndef COMPUTE_V_AS_MATRIX\n    ENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Sv11;)                  ENABLE_VECTOR_IMPLEMENTATION(__m128 Vv11;)\n    ENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Sv21;)                  ENABLE_VECTOR_IMPLEMENTATION(__m128 Vv21;)\n    ENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Sv31;)                  ENABLE_VECTOR_IMPLEMENTATION(__m128 Vv31;)\n    ENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Sv12;)                  ENABLE_VECTOR_IMPLEMENTATION(__m128 Vv12;)\n    ENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Sv22;)                  ENABLE_VECTOR_IMPLEMENTATION(__m128 Vv22;)\n    ENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Sv32;)                  ENABLE_VECTOR_IMPLEMENTATION(__m128 Vv32;)\n    ENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Sv13;)                  ENABLE_VECTOR_IMPLEMENTATION(__m128 Vv13;)\n    ENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Sv23;)                  ENABLE_VECTOR_IMPLEMENTATION(__m128 Vv23;)\n    ENABLE_SCALAR_IMPLEMENTATION(union {float f;unsigned int ui;} Sv33;)                  ENABLE_VECTOR_IMPLEMENTATION(__m128 Vv33;)\n#endif\n\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sqvvx.f*Sqvvx.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Vqvvx,Vqvvx);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Vqvvx,Vqvvx);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp2.f=Sqvvy.f*Sqvvy.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp2=_mm_mul_ps(Vqvvy,Vqvvy);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp2=_mm256_mul_ps(Vqvvy,Vqvvy);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp3.f=Sqvvz.f*Sqvvz.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp3=_mm_mul_ps(Vqvvz,Vqvvz);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp3=_mm256_mul_ps(Vqvvz,Vqvvz);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv11.f=Sqvs.f*Sqvs.f;)                                   ENABLE_SSE_IMPLEMENTATION(Vv11=_mm_mul_ps(Vqvs,Vqvs);)                                    ENABLE_AVX_IMPLEMENTATION(Vv11=_mm256_mul_ps(Vqvs,Vqvs);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv22.f=Sv11.f-Stmp1.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vv22=_mm_sub_ps(Vv11,Vtmp1);)                                   ENABLE_AVX_IMPLEMENTATION(Vv22=_mm256_sub_ps(Vv11,Vtmp1);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv33.f=Sv22.f-Stmp2.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vv33=_mm_sub_ps(Vv22,Vtmp2);)                                   ENABLE_AVX_IMPLEMENTATION(Vv33=_mm256_sub_ps(Vv22,Vtmp2);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv33.f=Sv33.f+Stmp3.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vv33=_mm_add_ps(Vv33,Vtmp3);)                                   ENABLE_AVX_IMPLEMENTATION(Vv33=_mm256_add_ps(Vv33,Vtmp3);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv22.f=Sv22.f+Stmp2.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vv22=_mm_add_ps(Vv22,Vtmp2);)                                   ENABLE_AVX_IMPLEMENTATION(Vv22=_mm256_add_ps(Vv22,Vtmp2);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv22.f=Sv22.f-Stmp3.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vv22=_mm_sub_ps(Vv22,Vtmp3);)                                   ENABLE_AVX_IMPLEMENTATION(Vv22=_mm256_sub_ps(Vv22,Vtmp3);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv11.f=Sv11.f+Stmp1.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vv11=_mm_add_ps(Vv11,Vtmp1);)                                   ENABLE_AVX_IMPLEMENTATION(Vv11=_mm256_add_ps(Vv11,Vtmp1);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv11.f=Sv11.f-Stmp2.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vv11=_mm_sub_ps(Vv11,Vtmp2);)                                   ENABLE_AVX_IMPLEMENTATION(Vv11=_mm256_sub_ps(Vv11,Vtmp2);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv11.f=Sv11.f-Stmp3.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vv11=_mm_sub_ps(Vv11,Vtmp3);)                                   ENABLE_AVX_IMPLEMENTATION(Vv11=_mm256_sub_ps(Vv11,Vtmp3);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sqvvx.f+Sqvvx.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_add_ps(Vqvvx,Vqvvx);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_add_ps(Vqvvx,Vqvvx);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp2.f=Sqvvy.f+Sqvvy.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp2=_mm_add_ps(Vqvvy,Vqvvy);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp2=_mm256_add_ps(Vqvvy,Vqvvy);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp3.f=Sqvvz.f+Sqvvz.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp3=_mm_add_ps(Vqvvz,Vqvvz);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp3=_mm256_add_ps(Vqvvz,Vqvvz);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv32.f=Sqvs.f*Stmp1.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vv32=_mm_mul_ps(Vqvs,Vtmp1);)                                   ENABLE_AVX_IMPLEMENTATION(Vv32=_mm256_mul_ps(Vqvs,Vtmp1);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv13.f=Sqvs.f*Stmp2.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vv13=_mm_mul_ps(Vqvs,Vtmp2);)                                   ENABLE_AVX_IMPLEMENTATION(Vv13=_mm256_mul_ps(Vqvs,Vtmp2);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv21.f=Sqvs.f*Stmp3.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vv21=_mm_mul_ps(Vqvs,Vtmp3);)                                   ENABLE_AVX_IMPLEMENTATION(Vv21=_mm256_mul_ps(Vqvs,Vtmp3);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sqvvy.f*Stmp1.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Vqvvy,Vtmp1);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Vqvvy,Vtmp1);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp2.f=Sqvvz.f*Stmp2.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp2=_mm_mul_ps(Vqvvz,Vtmp2);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp2=_mm256_mul_ps(Vqvvz,Vtmp2);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp3.f=Sqvvx.f*Stmp3.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp3=_mm_mul_ps(Vqvvx,Vtmp3);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp3=_mm256_mul_ps(Vqvvx,Vtmp3);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv12.f=Stmp1.f-Sv21.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vv12=_mm_sub_ps(Vtmp1,Vv21);)                                   ENABLE_AVX_IMPLEMENTATION(Vv12=_mm256_sub_ps(Vtmp1,Vv21);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv23.f=Stmp2.f-Sv32.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vv23=_mm_sub_ps(Vtmp2,Vv32);)                                   ENABLE_AVX_IMPLEMENTATION(Vv23=_mm256_sub_ps(Vtmp2,Vv32);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv31.f=Stmp3.f-Sv13.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vv31=_mm_sub_ps(Vtmp3,Vv13);)                                   ENABLE_AVX_IMPLEMENTATION(Vv31=_mm256_sub_ps(Vtmp3,Vv13);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv21.f=Stmp1.f+Sv21.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vv21=_mm_add_ps(Vtmp1,Vv21);)                                   ENABLE_AVX_IMPLEMENTATION(Vv21=_mm256_add_ps(Vtmp1,Vv21);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv32.f=Stmp2.f+Sv32.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vv32=_mm_add_ps(Vtmp2,Vv32);)                                   ENABLE_AVX_IMPLEMENTATION(Vv32=_mm256_add_ps(Vtmp2,Vv32);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv13.f=Stmp3.f+Sv13.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vv13=_mm_add_ps(Vtmp3,Vv13);)                                   ENABLE_AVX_IMPLEMENTATION(Vv13=_mm256_add_ps(Vtmp3,Vv13);)\n\n#ifdef COMPUTE_V_AS_MATRIX\n#ifdef PRINT_DEBUGGING_OUTPUT\n#ifdef USE_SCALAR_IMPLEMENTATION\n    std::cout<<\"Scalar V =\"<<std::endl;\n    std::cout<<std::setw(12)<<Sv11.f<<\"  \"<<std::setw(12)<<Sv12.f<<\"  \"<<std::setw(12)<<Sv13.f<<std::endl;\n    std::cout<<std::setw(12)<<Sv21.f<<\"  \"<<std::setw(12)<<Sv22.f<<\"  \"<<std::setw(12)<<Sv23.f<<std::endl;\n    std::cout<<std::setw(12)<<Sv31.f<<\"  \"<<std::setw(12)<<Sv32.f<<\"  \"<<std::setw(12)<<Sv33.f<<std::endl;\n#endif\n#ifdef USE_SSE_IMPLEMENTATION\n    _mm_storeu_ps(buf,Vv11);V11=buf[0];\n    _mm_storeu_ps(buf,Vv21);V21=buf[0];\n    _mm_storeu_ps(buf,Vv31);V31=buf[0];\n    _mm_storeu_ps(buf,Vv12);V12=buf[0];\n    _mm_storeu_ps(buf,Vv22);V22=buf[0];\n    _mm_storeu_ps(buf,Vv32);V32=buf[0];\n    _mm_storeu_ps(buf,Vv13);V13=buf[0];\n    _mm_storeu_ps(buf,Vv23);V23=buf[0];\n    _mm_storeu_ps(buf,Vv33);V33=buf[0];\n    std::cout<<\"Vector V =\"<<std::endl;\n    std::cout<<std::setw(12)<<V11<<\"  \"<<std::setw(12)<<V12<<\"  \"<<std::setw(12)<<V13<<std::endl;\n    std::cout<<std::setw(12)<<V21<<\"  \"<<std::setw(12)<<V22<<\"  \"<<std::setw(12)<<V23<<std::endl;\n    std::cout<<std::setw(12)<<V31<<\"  \"<<std::setw(12)<<V32<<\"  \"<<std::setw(12)<<V33<<std::endl;\n#endif\n#ifdef USE_AVX_IMPLEMENTATION\n    _mm256_storeu_ps(buf,Vv11);V11=buf[0];\n    _mm256_storeu_ps(buf,Vv21);V21=buf[0];\n    _mm256_storeu_ps(buf,Vv31);V31=buf[0];\n    _mm256_storeu_ps(buf,Vv12);V12=buf[0];\n    _mm256_storeu_ps(buf,Vv22);V22=buf[0];\n    _mm256_storeu_ps(buf,Vv32);V32=buf[0];\n    _mm256_storeu_ps(buf,Vv13);V13=buf[0];\n    _mm256_storeu_ps(buf,Vv23);V23=buf[0];\n    _mm256_storeu_ps(buf,Vv33);V33=buf[0];\n    std::cout<<\"Vector V =\"<<std::endl;\n    std::cout<<std::setw(12)<<V11<<\"  \"<<std::setw(12)<<V12<<\"  \"<<std::setw(12)<<V13<<std::endl;\n    std::cout<<std::setw(12)<<V21<<\"  \"<<std::setw(12)<<V22<<\"  \"<<std::setw(12)<<V23<<std::endl;\n    std::cout<<std::setw(12)<<V31<<\"  \"<<std::setw(12)<<V32<<\"  \"<<std::setw(12)<<V33<<std::endl;\n#endif\n#endif\n#endif\n\n    //###########################################################\n    // Multiply (from the right) with V\n    //###########################################################\n\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp2.f=Sa12.f;)                                         ENABLE_SSE_IMPLEMENTATION(Vtmp2=Va12;)                                                    ENABLE_AVX_IMPLEMENTATION(Vtmp2=Va12;)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp3.f=Sa13.f;)                                         ENABLE_SSE_IMPLEMENTATION(Vtmp3=Va13;)                                                    ENABLE_AVX_IMPLEMENTATION(Vtmp3=Va13;)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa12.f=Sv12.f*Sa11.f;)                                   ENABLE_SSE_IMPLEMENTATION(Va12=_mm_mul_ps(Vv12,Va11);)                                    ENABLE_AVX_IMPLEMENTATION(Va12=_mm256_mul_ps(Vv12,Va11);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa13.f=Sv13.f*Sa11.f;)                                   ENABLE_SSE_IMPLEMENTATION(Va13=_mm_mul_ps(Vv13,Va11);)                                    ENABLE_AVX_IMPLEMENTATION(Va13=_mm256_mul_ps(Vv13,Va11);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa11.f=Sv11.f*Sa11.f;)                                   ENABLE_SSE_IMPLEMENTATION(Va11=_mm_mul_ps(Vv11,Va11);)                                    ENABLE_AVX_IMPLEMENTATION(Va11=_mm256_mul_ps(Vv11,Va11);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sv21.f*Stmp2.f;)                                 ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Vv21,Vtmp2);)                                  ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Vv21,Vtmp2);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa11.f=Sa11.f+Stmp1.f;)                                  ENABLE_SSE_IMPLEMENTATION(Va11=_mm_add_ps(Va11,Vtmp1);)                                   ENABLE_AVX_IMPLEMENTATION(Va11=_mm256_add_ps(Va11,Vtmp1);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sv31.f*Stmp3.f;)                                 ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Vv31,Vtmp3);)                                  ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Vv31,Vtmp3);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa11.f=Sa11.f+Stmp1.f;)                                  ENABLE_SSE_IMPLEMENTATION(Va11=_mm_add_ps(Va11,Vtmp1);)                                   ENABLE_AVX_IMPLEMENTATION(Va11=_mm256_add_ps(Va11,Vtmp1);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sv22.f*Stmp2.f;)                                 ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Vv22,Vtmp2);)                                  ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Vv22,Vtmp2);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa12.f=Sa12.f+Stmp1.f;)                                  ENABLE_SSE_IMPLEMENTATION(Va12=_mm_add_ps(Va12,Vtmp1);)                                   ENABLE_AVX_IMPLEMENTATION(Va12=_mm256_add_ps(Va12,Vtmp1);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sv32.f*Stmp3.f;)                                 ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Vv32,Vtmp3);)                                  ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Vv32,Vtmp3);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa12.f=Sa12.f+Stmp1.f;)                                  ENABLE_SSE_IMPLEMENTATION(Va12=_mm_add_ps(Va12,Vtmp1);)                                   ENABLE_AVX_IMPLEMENTATION(Va12=_mm256_add_ps(Va12,Vtmp1);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sv23.f*Stmp2.f;)                                 ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Vv23,Vtmp2);)                                  ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Vv23,Vtmp2);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa13.f=Sa13.f+Stmp1.f;)                                  ENABLE_SSE_IMPLEMENTATION(Va13=_mm_add_ps(Va13,Vtmp1);)                                   ENABLE_AVX_IMPLEMENTATION(Va13=_mm256_add_ps(Va13,Vtmp1);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sv33.f*Stmp3.f;)                                 ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Vv33,Vtmp3);)                                  ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Vv33,Vtmp3);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa13.f=Sa13.f+Stmp1.f;)                                  ENABLE_SSE_IMPLEMENTATION(Va13=_mm_add_ps(Va13,Vtmp1);)                                   ENABLE_AVX_IMPLEMENTATION(Va13=_mm256_add_ps(Va13,Vtmp1);)\n\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp2.f=Sa22.f;)                                         ENABLE_SSE_IMPLEMENTATION(Vtmp2=Va22;)                                                    ENABLE_AVX_IMPLEMENTATION(Vtmp2=Va22;)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp3.f=Sa23.f;)                                         ENABLE_SSE_IMPLEMENTATION(Vtmp3=Va23;)                                                    ENABLE_AVX_IMPLEMENTATION(Vtmp3=Va23;)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa22.f=Sv12.f*Sa21.f;)                                   ENABLE_SSE_IMPLEMENTATION(Va22=_mm_mul_ps(Vv12,Va21);)                                    ENABLE_AVX_IMPLEMENTATION(Va22=_mm256_mul_ps(Vv12,Va21);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa23.f=Sv13.f*Sa21.f;)                                   ENABLE_SSE_IMPLEMENTATION(Va23=_mm_mul_ps(Vv13,Va21);)                                    ENABLE_AVX_IMPLEMENTATION(Va23=_mm256_mul_ps(Vv13,Va21);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa21.f=Sv11.f*Sa21.f;)                                   ENABLE_SSE_IMPLEMENTATION(Va21=_mm_mul_ps(Vv11,Va21);)                                    ENABLE_AVX_IMPLEMENTATION(Va21=_mm256_mul_ps(Vv11,Va21);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sv21.f*Stmp2.f;)                                 ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Vv21,Vtmp2);)                                  ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Vv21,Vtmp2);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa21.f=Sa21.f+Stmp1.f;)                                  ENABLE_SSE_IMPLEMENTATION(Va21=_mm_add_ps(Va21,Vtmp1);)                                   ENABLE_AVX_IMPLEMENTATION(Va21=_mm256_add_ps(Va21,Vtmp1);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sv31.f*Stmp3.f;)                                 ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Vv31,Vtmp3);)                                  ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Vv31,Vtmp3);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa21.f=Sa21.f+Stmp1.f;)                                  ENABLE_SSE_IMPLEMENTATION(Va21=_mm_add_ps(Va21,Vtmp1);)                                   ENABLE_AVX_IMPLEMENTATION(Va21=_mm256_add_ps(Va21,Vtmp1);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sv22.f*Stmp2.f;)                                 ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Vv22,Vtmp2);)                                  ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Vv22,Vtmp2);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa22.f=Sa22.f+Stmp1.f;)                                  ENABLE_SSE_IMPLEMENTATION(Va22=_mm_add_ps(Va22,Vtmp1);)                                   ENABLE_AVX_IMPLEMENTATION(Va22=_mm256_add_ps(Va22,Vtmp1);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sv32.f*Stmp3.f;)                                 ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Vv32,Vtmp3);)                                  ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Vv32,Vtmp3);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa22.f=Sa22.f+Stmp1.f;)                                  ENABLE_SSE_IMPLEMENTATION(Va22=_mm_add_ps(Va22,Vtmp1);)                                   ENABLE_AVX_IMPLEMENTATION(Va22=_mm256_add_ps(Va22,Vtmp1);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sv23.f*Stmp2.f;)                                 ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Vv23,Vtmp2);)                                  ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Vv23,Vtmp2);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa23.f=Sa23.f+Stmp1.f;)                                  ENABLE_SSE_IMPLEMENTATION(Va23=_mm_add_ps(Va23,Vtmp1);)                                   ENABLE_AVX_IMPLEMENTATION(Va23=_mm256_add_ps(Va23,Vtmp1);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sv33.f*Stmp3.f;)                                 ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Vv33,Vtmp3);)                                  ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Vv33,Vtmp3);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa23.f=Sa23.f+Stmp1.f;)                                  ENABLE_SSE_IMPLEMENTATION(Va23=_mm_add_ps(Va23,Vtmp1);)                                   ENABLE_AVX_IMPLEMENTATION(Va23=_mm256_add_ps(Va23,Vtmp1);)\n\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp2.f=Sa32.f;)                                         ENABLE_SSE_IMPLEMENTATION(Vtmp2=Va32;)                                                    ENABLE_AVX_IMPLEMENTATION(Vtmp2=Va32;)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp3.f=Sa33.f;)                                         ENABLE_SSE_IMPLEMENTATION(Vtmp3=Va33;)                                                    ENABLE_AVX_IMPLEMENTATION(Vtmp3=Va33;)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa32.f=Sv12.f*Sa31.f;)                                   ENABLE_SSE_IMPLEMENTATION(Va32=_mm_mul_ps(Vv12,Va31);)                                    ENABLE_AVX_IMPLEMENTATION(Va32=_mm256_mul_ps(Vv12,Va31);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa33.f=Sv13.f*Sa31.f;)                                   ENABLE_SSE_IMPLEMENTATION(Va33=_mm_mul_ps(Vv13,Va31);)                                    ENABLE_AVX_IMPLEMENTATION(Va33=_mm256_mul_ps(Vv13,Va31);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa31.f=Sv11.f*Sa31.f;)                                   ENABLE_SSE_IMPLEMENTATION(Va31=_mm_mul_ps(Vv11,Va31);)                                    ENABLE_AVX_IMPLEMENTATION(Va31=_mm256_mul_ps(Vv11,Va31);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sv21.f*Stmp2.f;)                                 ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Vv21,Vtmp2);)                                  ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Vv21,Vtmp2);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa31.f=Sa31.f+Stmp1.f;)                                  ENABLE_SSE_IMPLEMENTATION(Va31=_mm_add_ps(Va31,Vtmp1);)                                   ENABLE_AVX_IMPLEMENTATION(Va31=_mm256_add_ps(Va31,Vtmp1);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sv31.f*Stmp3.f;)                                 ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Vv31,Vtmp3);)                                  ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Vv31,Vtmp3);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa31.f=Sa31.f+Stmp1.f;)                                  ENABLE_SSE_IMPLEMENTATION(Va31=_mm_add_ps(Va31,Vtmp1);)                                   ENABLE_AVX_IMPLEMENTATION(Va31=_mm256_add_ps(Va31,Vtmp1);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sv22.f*Stmp2.f;)                                 ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Vv22,Vtmp2);)                                  ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Vv22,Vtmp2);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa32.f=Sa32.f+Stmp1.f;)                                  ENABLE_SSE_IMPLEMENTATION(Va32=_mm_add_ps(Va32,Vtmp1);)                                   ENABLE_AVX_IMPLEMENTATION(Va32=_mm256_add_ps(Va32,Vtmp1);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sv32.f*Stmp3.f;)                                 ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Vv32,Vtmp3);)                                  ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Vv32,Vtmp3);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa32.f=Sa32.f+Stmp1.f;)                                  ENABLE_SSE_IMPLEMENTATION(Va32=_mm_add_ps(Va32,Vtmp1);)                                   ENABLE_AVX_IMPLEMENTATION(Va32=_mm256_add_ps(Va32,Vtmp1);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sv23.f*Stmp2.f;)                                 ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Vv23,Vtmp2);)                                  ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Vv23,Vtmp2);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa33.f=Sa33.f+Stmp1.f;)                                  ENABLE_SSE_IMPLEMENTATION(Va33=_mm_add_ps(Va33,Vtmp1);)                                   ENABLE_AVX_IMPLEMENTATION(Va33=_mm256_add_ps(Va33,Vtmp1);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sv33.f*Stmp3.f;)                                 ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Vv33,Vtmp3);)                                  ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Vv33,Vtmp3);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa33.f=Sa33.f+Stmp1.f;)                                  ENABLE_SSE_IMPLEMENTATION(Va33=_mm_add_ps(Va33,Vtmp1);)                                   ENABLE_AVX_IMPLEMENTATION(Va33=_mm256_add_ps(Va33,Vtmp1);)\n\n#ifdef PRINT_DEBUGGING_OUTPUT\n#ifdef USE_SCALAR_IMPLEMENTATION\n    std::cout<<\"Scalar A (after multiplying with V) =\"<<std::endl;\n    std::cout<<std::setw(12)<<Sa11.f<<\"  \"<<std::setw(12)<<Sa12.f<<\"  \"<<std::setw(12)<<Sa13.f<<std::endl;\n    std::cout<<std::setw(12)<<Sa21.f<<\"  \"<<std::setw(12)<<Sa22.f<<\"  \"<<std::setw(12)<<Sa23.f<<std::endl;\n    std::cout<<std::setw(12)<<Sa31.f<<\"  \"<<std::setw(12)<<Sa32.f<<\"  \"<<std::setw(12)<<Sa33.f<<std::endl;\n#endif\n#ifdef USE_SSE_IMPLEMENTATION\n    _mm_storeu_ps(buf,Va11);A11=buf[0];\n    _mm_storeu_ps(buf,Va21);A21=buf[0];\n    _mm_storeu_ps(buf,Va31);A31=buf[0];\n    _mm_storeu_ps(buf,Va12);A12=buf[0];\n    _mm_storeu_ps(buf,Va22);A22=buf[0];\n    _mm_storeu_ps(buf,Va32);A32=buf[0];\n    _mm_storeu_ps(buf,Va13);A13=buf[0];\n    _mm_storeu_ps(buf,Va23);A23=buf[0];\n    _mm_storeu_ps(buf,Va33);A33=buf[0];\n    std::cout<<\"Vector A (after multiplying with V) =\"<<std::endl;\n    std::cout<<std::setw(12)<<A11<<\"  \"<<std::setw(12)<<A12<<\"  \"<<std::setw(12)<<A13<<std::endl;\n    std::cout<<std::setw(12)<<A21<<\"  \"<<std::setw(12)<<A22<<\"  \"<<std::setw(12)<<A23<<std::endl;\n    std::cout<<std::setw(12)<<A31<<\"  \"<<std::setw(12)<<A32<<\"  \"<<std::setw(12)<<A33<<std::endl;\n#endif\n#ifdef USE_AVX_IMPLEMENTATION\n    _mm256_storeu_ps(buf,Va11);A11=buf[0];\n    _mm256_storeu_ps(buf,Va21);A21=buf[0];\n    _mm256_storeu_ps(buf,Va31);A31=buf[0];\n    _mm256_storeu_ps(buf,Va12);A12=buf[0];\n    _mm256_storeu_ps(buf,Va22);A22=buf[0];\n    _mm256_storeu_ps(buf,Va32);A32=buf[0];\n    _mm256_storeu_ps(buf,Va13);A13=buf[0];\n    _mm256_storeu_ps(buf,Va23);A23=buf[0];\n    _mm256_storeu_ps(buf,Va33);A33=buf[0];\n    std::cout<<\"Vector A (after multiplying with V) =\"<<std::endl;\n    std::cout<<std::setw(12)<<A11<<\"  \"<<std::setw(12)<<A12<<\"  \"<<std::setw(12)<<A13<<std::endl;\n    std::cout<<std::setw(12)<<A21<<\"  \"<<std::setw(12)<<A22<<\"  \"<<std::setw(12)<<A23<<std::endl;\n    std::cout<<std::setw(12)<<A31<<\"  \"<<std::setw(12)<<A32<<\"  \"<<std::setw(12)<<A33<<std::endl;\n#endif\n#endif\n\n} // End block : Conjugation with V\n\n} // End block : Scope of qV (if not maintained)\n\n    //###########################################################\n    // Permute columns such that the singular values are sorted\n    //###########################################################\n\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sa11.f*Sa11.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Va11,Va11);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Va11,Va11);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp4.f=Sa21.f*Sa21.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vtmp4=_mm_mul_ps(Va21,Va21);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp4=_mm256_mul_ps(Va21,Va21);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Stmp1.f+Stmp4.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_add_ps(Vtmp1,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_add_ps(Vtmp1,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp4.f=Sa31.f*Sa31.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vtmp4=_mm_mul_ps(Va31,Va31);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp4=_mm256_mul_ps(Va31,Va31);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Stmp1.f+Stmp4.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_add_ps(Vtmp1,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_add_ps(Vtmp1,Vtmp4);)\n\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp2.f=Sa12.f*Sa12.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vtmp2=_mm_mul_ps(Va12,Va12);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp2=_mm256_mul_ps(Va12,Va12);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp4.f=Sa22.f*Sa22.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vtmp4=_mm_mul_ps(Va22,Va22);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp4=_mm256_mul_ps(Va22,Va22);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp2.f=Stmp2.f+Stmp4.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp2=_mm_add_ps(Vtmp2,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp2=_mm256_add_ps(Vtmp2,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp4.f=Sa32.f*Sa32.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vtmp4=_mm_mul_ps(Va32,Va32);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp4=_mm256_mul_ps(Va32,Va32);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp2.f=Stmp2.f+Stmp4.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp2=_mm_add_ps(Vtmp2,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp2=_mm256_add_ps(Vtmp2,Vtmp4);)\n\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp3.f=Sa13.f*Sa13.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vtmp3=_mm_mul_ps(Va13,Va13);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp3=_mm256_mul_ps(Va13,Va13);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp4.f=Sa23.f*Sa23.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vtmp4=_mm_mul_ps(Va23,Va23);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp4=_mm256_mul_ps(Va23,Va23);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp3.f=Stmp3.f+Stmp4.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp3=_mm_add_ps(Vtmp3,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp3=_mm256_add_ps(Vtmp3,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp4.f=Sa33.f*Sa33.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vtmp4=_mm_mul_ps(Va33,Va33);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp4=_mm256_mul_ps(Va33,Va33);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp3.f=Stmp3.f+Stmp4.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp3=_mm_add_ps(Vtmp3,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp3=_mm256_add_ps(Vtmp3,Vtmp4);)\n\n    // Swap columns 1-2 if necessary\n\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp4.ui=(Stmp1.f<Stmp2.f)?0xffffffff:0;)                ENABLE_SSE_IMPLEMENTATION(Vtmp4=_mm_cmplt_ps(Vtmp1,Vtmp2);)                               ENABLE_AVX_IMPLEMENTATION(Vtmp4=_mm256_cmp_ps(Vtmp1,Vtmp2, _CMP_LT_OS);) //ENABLE_AVX_IMPLEMENTATION(Vtmp4=_mm256_cmplt_ps(Vtmp1,Vtmp2);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Sa11.ui^Sa12.ui;)                               ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_xor_ps(Va11,Va12);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_xor_ps(Va11,Va12);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Stmp5.ui&Stmp4.ui;)                             ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_and_ps(Vtmp5,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_and_ps(Vtmp5,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa11.ui=Sa11.ui^Stmp5.ui;)                               ENABLE_SSE_IMPLEMENTATION(Va11=_mm_xor_ps(Va11,Vtmp5);)                                   ENABLE_AVX_IMPLEMENTATION(Va11=_mm256_xor_ps(Va11,Vtmp5);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa12.ui=Sa12.ui^Stmp5.ui;)                               ENABLE_SSE_IMPLEMENTATION(Va12=_mm_xor_ps(Va12,Vtmp5);)                                   ENABLE_AVX_IMPLEMENTATION(Va12=_mm256_xor_ps(Va12,Vtmp5);)\n\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Sa21.ui^Sa22.ui;)                               ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_xor_ps(Va21,Va22);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_xor_ps(Va21,Va22);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Stmp5.ui&Stmp4.ui;)                             ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_and_ps(Vtmp5,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_and_ps(Vtmp5,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa21.ui=Sa21.ui^Stmp5.ui;)                               ENABLE_SSE_IMPLEMENTATION(Va21=_mm_xor_ps(Va21,Vtmp5);)                                   ENABLE_AVX_IMPLEMENTATION(Va21=_mm256_xor_ps(Va21,Vtmp5);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa22.ui=Sa22.ui^Stmp5.ui;)                               ENABLE_SSE_IMPLEMENTATION(Va22=_mm_xor_ps(Va22,Vtmp5);)                                   ENABLE_AVX_IMPLEMENTATION(Va22=_mm256_xor_ps(Va22,Vtmp5);)\n\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Sa31.ui^Sa32.ui;)                               ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_xor_ps(Va31,Va32);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_xor_ps(Va31,Va32);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Stmp5.ui&Stmp4.ui;)                             ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_and_ps(Vtmp5,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_and_ps(Vtmp5,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa31.ui=Sa31.ui^Stmp5.ui;)                               ENABLE_SSE_IMPLEMENTATION(Va31=_mm_xor_ps(Va31,Vtmp5);)                                   ENABLE_AVX_IMPLEMENTATION(Va31=_mm256_xor_ps(Va31,Vtmp5);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa32.ui=Sa32.ui^Stmp5.ui;)                               ENABLE_SSE_IMPLEMENTATION(Va32=_mm_xor_ps(Va32,Vtmp5);)                                   ENABLE_AVX_IMPLEMENTATION(Va32=_mm256_xor_ps(Va32,Vtmp5);)\n\n#ifdef COMPUTE_V_AS_MATRIX\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Sv11.ui^Sv12.ui;)                               ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_xor_ps(Vv11,Vv12);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_xor_ps(Vv11,Vv12);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Stmp5.ui&Stmp4.ui;)                             ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_and_ps(Vtmp5,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_and_ps(Vtmp5,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv11.ui=Sv11.ui^Stmp5.ui;)                               ENABLE_SSE_IMPLEMENTATION(Vv11=_mm_xor_ps(Vv11,Vtmp5);)                                   ENABLE_AVX_IMPLEMENTATION(Vv11=_mm256_xor_ps(Vv11,Vtmp5);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv12.ui=Sv12.ui^Stmp5.ui;)                               ENABLE_SSE_IMPLEMENTATION(Vv12=_mm_xor_ps(Vv12,Vtmp5);)                                   ENABLE_AVX_IMPLEMENTATION(Vv12=_mm256_xor_ps(Vv12,Vtmp5);)\n\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Sv21.ui^Sv22.ui;)                               ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_xor_ps(Vv21,Vv22);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_xor_ps(Vv21,Vv22);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Stmp5.ui&Stmp4.ui;)                             ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_and_ps(Vtmp5,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_and_ps(Vtmp5,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv21.ui=Sv21.ui^Stmp5.ui;)                               ENABLE_SSE_IMPLEMENTATION(Vv21=_mm_xor_ps(Vv21,Vtmp5);)                                   ENABLE_AVX_IMPLEMENTATION(Vv21=_mm256_xor_ps(Vv21,Vtmp5);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv22.ui=Sv22.ui^Stmp5.ui;)                               ENABLE_SSE_IMPLEMENTATION(Vv22=_mm_xor_ps(Vv22,Vtmp5);)                                   ENABLE_AVX_IMPLEMENTATION(Vv22=_mm256_xor_ps(Vv22,Vtmp5);)\n\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Sv31.ui^Sv32.ui;)                               ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_xor_ps(Vv31,Vv32);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_xor_ps(Vv31,Vv32);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Stmp5.ui&Stmp4.ui;)                             ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_and_ps(Vtmp5,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_and_ps(Vtmp5,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv31.ui=Sv31.ui^Stmp5.ui;)                               ENABLE_SSE_IMPLEMENTATION(Vv31=_mm_xor_ps(Vv31,Vtmp5);)                                   ENABLE_AVX_IMPLEMENTATION(Vv31=_mm256_xor_ps(Vv31,Vtmp5);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv32.ui=Sv32.ui^Stmp5.ui;)                               ENABLE_SSE_IMPLEMENTATION(Vv32=_mm_xor_ps(Vv32,Vtmp5);)                                   ENABLE_AVX_IMPLEMENTATION(Vv32=_mm256_xor_ps(Vv32,Vtmp5);)\n#endif\n\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Stmp1.ui^Stmp2.ui;)                             ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_xor_ps(Vtmp1,Vtmp2);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_xor_ps(Vtmp1,Vtmp2);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Stmp5.ui&Stmp4.ui;)                             ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_and_ps(Vtmp5,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_and_ps(Vtmp5,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.ui=Stmp1.ui^Stmp5.ui;)                             ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_xor_ps(Vtmp1,Vtmp5);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_xor_ps(Vtmp1,Vtmp5);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp2.ui=Stmp2.ui^Stmp5.ui;)                             ENABLE_SSE_IMPLEMENTATION(Vtmp2=_mm_xor_ps(Vtmp2,Vtmp5);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp2=_mm256_xor_ps(Vtmp2,Vtmp5);)\n\n    // If columns 1-2 have been swapped, negate 2nd column of A and V so that V is still a rotation\n\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.f=-2.;)                                            ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_set1_ps(-2.);)                                        ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_set1_ps(-2.);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Stmp5.ui&Stmp4.ui;)                             ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_and_ps(Vtmp5,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_and_ps(Vtmp5,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp4.f=1.;)                                             ENABLE_SSE_IMPLEMENTATION(Vtmp4=Vone;)                                                    ENABLE_AVX_IMPLEMENTATION(Vtmp4=Vone;)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp4.f=Stmp4.f+Stmp5.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp4=_mm_add_ps(Vtmp4,Vtmp5);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp4=_mm256_add_ps(Vtmp4,Vtmp5);)\n\n    ENABLE_SCALAR_IMPLEMENTATION(Sa12.f=Sa12.f*Stmp4.f;)                                  ENABLE_SSE_IMPLEMENTATION(Va12=_mm_mul_ps(Va12,Vtmp4);)                                   ENABLE_AVX_IMPLEMENTATION(Va12=_mm256_mul_ps(Va12,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa22.f=Sa22.f*Stmp4.f;)                                  ENABLE_SSE_IMPLEMENTATION(Va22=_mm_mul_ps(Va22,Vtmp4);)                                   ENABLE_AVX_IMPLEMENTATION(Va22=_mm256_mul_ps(Va22,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa32.f=Sa32.f*Stmp4.f;)                                  ENABLE_SSE_IMPLEMENTATION(Va32=_mm_mul_ps(Va32,Vtmp4);)                                   ENABLE_AVX_IMPLEMENTATION(Va32=_mm256_mul_ps(Va32,Vtmp4);)\n\n#ifdef COMPUTE_V_AS_MATRIX\n    ENABLE_SCALAR_IMPLEMENTATION(Sv12.f=Sv12.f*Stmp4.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vv12=_mm_mul_ps(Vv12,Vtmp4);)                                   ENABLE_AVX_IMPLEMENTATION(Vv12=_mm256_mul_ps(Vv12,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv22.f=Sv22.f*Stmp4.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vv22=_mm_mul_ps(Vv22,Vtmp4);)                                   ENABLE_AVX_IMPLEMENTATION(Vv22=_mm256_mul_ps(Vv22,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv32.f=Sv32.f*Stmp4.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vv32=_mm_mul_ps(Vv32,Vtmp4);)                                   ENABLE_AVX_IMPLEMENTATION(Vv32=_mm256_mul_ps(Vv32,Vtmp4);)\n#endif\n\n    // If columns 1-2 have been swapped, also update quaternion representation of V (the quaternion may become un-normalized after this)\n\n#ifdef COMPUTE_V_AS_QUATERNION\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp4.f=Stmp4.f*Sone_half.f;)                            ENABLE_SSE_IMPLEMENTATION(Vtmp4=_mm_mul_ps(Vtmp4,Vone_half);)                             ENABLE_AVX_IMPLEMENTATION(Vtmp4=_mm256_mul_ps(Vtmp4,Vone_half);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp4.f=Stmp4.f-Sone_half.f;)                            ENABLE_SSE_IMPLEMENTATION(Vtmp4=_mm_sub_ps(Vtmp4,Vone_half);)                             ENABLE_AVX_IMPLEMENTATION(Vtmp4=_mm256_sub_ps(Vtmp4,Vone_half);)\n\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.f=Stmp4.f*Sqvvz.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_mul_ps(Vtmp4,Vqvvz);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_mul_ps(Vtmp4,Vqvvz);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.f=Stmp5.f+Sqvs.f;)                                 ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_add_ps(Vtmp5,Vqvs);)                                  ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_add_ps(Vtmp5,Vqvs);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sqvs.f=Sqvs.f*Stmp4.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vqvs=_mm_mul_ps(Vqvs,Vtmp4);)                                   ENABLE_AVX_IMPLEMENTATION(Vqvs=_mm256_mul_ps(Vqvs,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sqvvz.f=Sqvvz.f-Sqvs.f;)                                 ENABLE_SSE_IMPLEMENTATION(Vqvvz=_mm_sub_ps(Vqvvz,Vqvs);)                                  ENABLE_AVX_IMPLEMENTATION(Vqvvz=_mm256_sub_ps(Vqvvz,Vqvs);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sqvs.f=Stmp5.f;)                                         ENABLE_SSE_IMPLEMENTATION(Vqvs=Vtmp5;)                                                    ENABLE_AVX_IMPLEMENTATION(Vqvs=Vtmp5;)\n\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.f=Stmp4.f*Sqvvx.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_mul_ps(Vtmp4,Vqvvx);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_mul_ps(Vtmp4,Vqvvx);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.f=Stmp5.f+Sqvvy.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_add_ps(Vtmp5,Vqvvy);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_add_ps(Vtmp5,Vqvvy);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sqvvy.f=Sqvvy.f*Stmp4.f;)                                ENABLE_SSE_IMPLEMENTATION(Vqvvy=_mm_mul_ps(Vqvvy,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vqvvy=_mm256_mul_ps(Vqvvy,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sqvvx.f=Sqvvx.f-Sqvvy.f;)                                ENABLE_SSE_IMPLEMENTATION(Vqvvx=_mm_sub_ps(Vqvvx,Vqvvy);)                                 ENABLE_AVX_IMPLEMENTATION(Vqvvx=_mm256_sub_ps(Vqvvx,Vqvvy);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sqvvy.f=Stmp5.f;)                                        ENABLE_SSE_IMPLEMENTATION(Vqvvy=Vtmp5;)                                                   ENABLE_AVX_IMPLEMENTATION(Vqvvy=Vtmp5;)\n#endif\n\n    // Swap columns 1-3 if necessary\n\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp4.ui=(Stmp1.f<Stmp3.f)?0xffffffff:0;)                ENABLE_SSE_IMPLEMENTATION(Vtmp4=_mm_cmplt_ps(Vtmp1,Vtmp3);)                               ENABLE_AVX_IMPLEMENTATION(Vtmp4=_mm256_cmp_ps(Vtmp1,Vtmp3, _CMP_LT_OS);) //ENABLE_AVX_IMPLEMENTATION(Vtmp4=_mm256_cmplt_ps(Vtmp1,Vtmp3);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Sa11.ui^Sa13.ui;)                               ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_xor_ps(Va11,Va13);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_xor_ps(Va11,Va13);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Stmp5.ui&Stmp4.ui;)                             ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_and_ps(Vtmp5,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_and_ps(Vtmp5,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa11.ui=Sa11.ui^Stmp5.ui;)                               ENABLE_SSE_IMPLEMENTATION(Va11=_mm_xor_ps(Va11,Vtmp5);)                                   ENABLE_AVX_IMPLEMENTATION(Va11=_mm256_xor_ps(Va11,Vtmp5);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa13.ui=Sa13.ui^Stmp5.ui;)                               ENABLE_SSE_IMPLEMENTATION(Va13=_mm_xor_ps(Va13,Vtmp5);)                                   ENABLE_AVX_IMPLEMENTATION(Va13=_mm256_xor_ps(Va13,Vtmp5);)\n\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Sa21.ui^Sa23.ui;)                               ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_xor_ps(Va21,Va23);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_xor_ps(Va21,Va23);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Stmp5.ui&Stmp4.ui;)                             ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_and_ps(Vtmp5,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_and_ps(Vtmp5,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa21.ui=Sa21.ui^Stmp5.ui;)                               ENABLE_SSE_IMPLEMENTATION(Va21=_mm_xor_ps(Va21,Vtmp5);)                                   ENABLE_AVX_IMPLEMENTATION(Va21=_mm256_xor_ps(Va21,Vtmp5);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa23.ui=Sa23.ui^Stmp5.ui;)                               ENABLE_SSE_IMPLEMENTATION(Va23=_mm_xor_ps(Va23,Vtmp5);)                                   ENABLE_AVX_IMPLEMENTATION(Va23=_mm256_xor_ps(Va23,Vtmp5);)\n\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Sa31.ui^Sa33.ui;)                               ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_xor_ps(Va31,Va33);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_xor_ps(Va31,Va33);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Stmp5.ui&Stmp4.ui;)                             ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_and_ps(Vtmp5,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_and_ps(Vtmp5,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa31.ui=Sa31.ui^Stmp5.ui;)                               ENABLE_SSE_IMPLEMENTATION(Va31=_mm_xor_ps(Va31,Vtmp5);)                                   ENABLE_AVX_IMPLEMENTATION(Va31=_mm256_xor_ps(Va31,Vtmp5);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa33.ui=Sa33.ui^Stmp5.ui;)                               ENABLE_SSE_IMPLEMENTATION(Va33=_mm_xor_ps(Va33,Vtmp5);)                                   ENABLE_AVX_IMPLEMENTATION(Va33=_mm256_xor_ps(Va33,Vtmp5);)\n\n#ifdef COMPUTE_V_AS_MATRIX\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Sv11.ui^Sv13.ui;)                               ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_xor_ps(Vv11,Vv13);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_xor_ps(Vv11,Vv13);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Stmp5.ui&Stmp4.ui;)                             ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_and_ps(Vtmp5,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_and_ps(Vtmp5,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv11.ui=Sv11.ui^Stmp5.ui;)                               ENABLE_SSE_IMPLEMENTATION(Vv11=_mm_xor_ps(Vv11,Vtmp5);)                                   ENABLE_AVX_IMPLEMENTATION(Vv11=_mm256_xor_ps(Vv11,Vtmp5);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv13.ui=Sv13.ui^Stmp5.ui;)                               ENABLE_SSE_IMPLEMENTATION(Vv13=_mm_xor_ps(Vv13,Vtmp5);)                                   ENABLE_AVX_IMPLEMENTATION(Vv13=_mm256_xor_ps(Vv13,Vtmp5);)\n\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Sv21.ui^Sv23.ui;)                               ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_xor_ps(Vv21,Vv23);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_xor_ps(Vv21,Vv23);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Stmp5.ui&Stmp4.ui;)                             ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_and_ps(Vtmp5,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_and_ps(Vtmp5,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv21.ui=Sv21.ui^Stmp5.ui;)                               ENABLE_SSE_IMPLEMENTATION(Vv21=_mm_xor_ps(Vv21,Vtmp5);)                                   ENABLE_AVX_IMPLEMENTATION(Vv21=_mm256_xor_ps(Vv21,Vtmp5);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv23.ui=Sv23.ui^Stmp5.ui;)                               ENABLE_SSE_IMPLEMENTATION(Vv23=_mm_xor_ps(Vv23,Vtmp5);)                                   ENABLE_AVX_IMPLEMENTATION(Vv23=_mm256_xor_ps(Vv23,Vtmp5);)\n\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Sv31.ui^Sv33.ui;)                               ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_xor_ps(Vv31,Vv33);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_xor_ps(Vv31,Vv33);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Stmp5.ui&Stmp4.ui;)                             ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_and_ps(Vtmp5,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_and_ps(Vtmp5,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv31.ui=Sv31.ui^Stmp5.ui;)                               ENABLE_SSE_IMPLEMENTATION(Vv31=_mm_xor_ps(Vv31,Vtmp5);)                                   ENABLE_AVX_IMPLEMENTATION(Vv31=_mm256_xor_ps(Vv31,Vtmp5);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv33.ui=Sv33.ui^Stmp5.ui;)                               ENABLE_SSE_IMPLEMENTATION(Vv33=_mm_xor_ps(Vv33,Vtmp5);)                                   ENABLE_AVX_IMPLEMENTATION(Vv33=_mm256_xor_ps(Vv33,Vtmp5);)\n#endif\n\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Stmp1.ui^Stmp3.ui;)                             ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_xor_ps(Vtmp1,Vtmp3);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_xor_ps(Vtmp1,Vtmp3);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Stmp5.ui&Stmp4.ui;)                             ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_and_ps(Vtmp5,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_and_ps(Vtmp5,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.ui=Stmp1.ui^Stmp5.ui;)                             ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_xor_ps(Vtmp1,Vtmp5);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_xor_ps(Vtmp1,Vtmp5);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp3.ui=Stmp3.ui^Stmp5.ui;)                             ENABLE_SSE_IMPLEMENTATION(Vtmp3=_mm_xor_ps(Vtmp3,Vtmp5);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp3=_mm256_xor_ps(Vtmp3,Vtmp5);)\n\n    // If columns 1-3 have been swapped, negate 1st column of A and V so that V is still a rotation\n\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.f=-2.;)                                            ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_set1_ps(-2.);)                                        ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_set1_ps(-2.);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Stmp5.ui&Stmp4.ui;)                             ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_and_ps(Vtmp5,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_and_ps(Vtmp5,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp4.f=1.;)                                             ENABLE_SSE_IMPLEMENTATION(Vtmp4=Vone;)                                                    ENABLE_AVX_IMPLEMENTATION(Vtmp4=Vone;)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp4.f=Stmp4.f+Stmp5.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp4=_mm_add_ps(Vtmp4,Vtmp5);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp4=_mm256_add_ps(Vtmp4,Vtmp5);)\n\n    ENABLE_SCALAR_IMPLEMENTATION(Sa11.f=Sa11.f*Stmp4.f;)                                  ENABLE_SSE_IMPLEMENTATION(Va11=_mm_mul_ps(Va11,Vtmp4);)                                   ENABLE_AVX_IMPLEMENTATION(Va11=_mm256_mul_ps(Va11,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa21.f=Sa21.f*Stmp4.f;)                                  ENABLE_SSE_IMPLEMENTATION(Va21=_mm_mul_ps(Va21,Vtmp4);)                                   ENABLE_AVX_IMPLEMENTATION(Va21=_mm256_mul_ps(Va21,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa31.f=Sa31.f*Stmp4.f;)                                  ENABLE_SSE_IMPLEMENTATION(Va31=_mm_mul_ps(Va31,Vtmp4);)                                   ENABLE_AVX_IMPLEMENTATION(Va31=_mm256_mul_ps(Va31,Vtmp4);)\n\n#ifdef COMPUTE_V_AS_MATRIX\n    ENABLE_SCALAR_IMPLEMENTATION(Sv11.f=Sv11.f*Stmp4.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vv11=_mm_mul_ps(Vv11,Vtmp4);)                                   ENABLE_AVX_IMPLEMENTATION(Vv11=_mm256_mul_ps(Vv11,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv21.f=Sv21.f*Stmp4.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vv21=_mm_mul_ps(Vv21,Vtmp4);)                                   ENABLE_AVX_IMPLEMENTATION(Vv21=_mm256_mul_ps(Vv21,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv31.f=Sv31.f*Stmp4.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vv31=_mm_mul_ps(Vv31,Vtmp4);)                                   ENABLE_AVX_IMPLEMENTATION(Vv31=_mm256_mul_ps(Vv31,Vtmp4);)\n#endif\n\n    // If columns 1-3 have been swapped, also update quaternion representation of V (the quaternion may become un-normalized after this)\n\n#ifdef COMPUTE_V_AS_QUATERNION\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp4.f=Stmp4.f*Sone_half.f;)                            ENABLE_SSE_IMPLEMENTATION(Vtmp4=_mm_mul_ps(Vtmp4,Vone_half);)                             ENABLE_AVX_IMPLEMENTATION(Vtmp4=_mm256_mul_ps(Vtmp4,Vone_half);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp4.f=Stmp4.f-Sone_half.f;)                            ENABLE_SSE_IMPLEMENTATION(Vtmp4=_mm_sub_ps(Vtmp4,Vone_half);)                             ENABLE_AVX_IMPLEMENTATION(Vtmp4=_mm256_sub_ps(Vtmp4,Vone_half);)\n\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.f=Stmp4.f*Sqvvy.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_mul_ps(Vtmp4,Vqvvy);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_mul_ps(Vtmp4,Vqvvy);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.f=Stmp5.f+Sqvs.f;)                                 ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_add_ps(Vtmp5,Vqvs);)                                  ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_add_ps(Vtmp5,Vqvs);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sqvs.f=Sqvs.f*Stmp4.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vqvs=_mm_mul_ps(Vqvs,Vtmp4);)                                   ENABLE_AVX_IMPLEMENTATION(Vqvs=_mm256_mul_ps(Vqvs,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sqvvy.f=Sqvvy.f-Sqvs.f;)                                 ENABLE_SSE_IMPLEMENTATION(Vqvvy=_mm_sub_ps(Vqvvy,Vqvs);)                                  ENABLE_AVX_IMPLEMENTATION(Vqvvy=_mm256_sub_ps(Vqvvy,Vqvs);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sqvs.f=Stmp5.f;)                                         ENABLE_SSE_IMPLEMENTATION(Vqvs=Vtmp5;)                                                    ENABLE_AVX_IMPLEMENTATION(Vqvs=Vtmp5;)\n\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.f=Stmp4.f*Sqvvz.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_mul_ps(Vtmp4,Vqvvz);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_mul_ps(Vtmp4,Vqvvz);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.f=Stmp5.f+Sqvvx.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_add_ps(Vtmp5,Vqvvx);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_add_ps(Vtmp5,Vqvvx);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sqvvx.f=Sqvvx.f*Stmp4.f;)                                ENABLE_SSE_IMPLEMENTATION(Vqvvx=_mm_mul_ps(Vqvvx,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vqvvx=_mm256_mul_ps(Vqvvx,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sqvvz.f=Sqvvz.f-Sqvvx.f;)                                ENABLE_SSE_IMPLEMENTATION(Vqvvz=_mm_sub_ps(Vqvvz,Vqvvx);)                                 ENABLE_AVX_IMPLEMENTATION(Vqvvz=_mm256_sub_ps(Vqvvz,Vqvvx);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sqvvx.f=Stmp5.f;)                                        ENABLE_SSE_IMPLEMENTATION(Vqvvx=Vtmp5;)                                                   ENABLE_AVX_IMPLEMENTATION(Vqvvx=Vtmp5;)\n#endif\n\n    // Swap columns 2-3 if necessary\n\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp4.ui=(Stmp2.f<Stmp3.f)?0xffffffff:0;)                ENABLE_SSE_IMPLEMENTATION(Vtmp4=_mm_cmplt_ps(Vtmp2,Vtmp3);)                               ENABLE_AVX_IMPLEMENTATION(Vtmp4=_mm256_cmp_ps(Vtmp2,Vtmp3, _CMP_LT_OS);) //ENABLE_AVX_IMPLEMENTATION(Vtmp4=_mm256_cmplt_ps(Vtmp2,Vtmp3);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Sa12.ui^Sa13.ui;)                               ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_xor_ps(Va12,Va13);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_xor_ps(Va12,Va13);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Stmp5.ui&Stmp4.ui;)                             ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_and_ps(Vtmp5,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_and_ps(Vtmp5,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa12.ui=Sa12.ui^Stmp5.ui;)                               ENABLE_SSE_IMPLEMENTATION(Va12=_mm_xor_ps(Va12,Vtmp5);)                                   ENABLE_AVX_IMPLEMENTATION(Va12=_mm256_xor_ps(Va12,Vtmp5);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa13.ui=Sa13.ui^Stmp5.ui;)                               ENABLE_SSE_IMPLEMENTATION(Va13=_mm_xor_ps(Va13,Vtmp5);)                                   ENABLE_AVX_IMPLEMENTATION(Va13=_mm256_xor_ps(Va13,Vtmp5);)\n\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Sa22.ui^Sa23.ui;)                               ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_xor_ps(Va22,Va23);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_xor_ps(Va22,Va23);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Stmp5.ui&Stmp4.ui;)                             ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_and_ps(Vtmp5,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_and_ps(Vtmp5,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa22.ui=Sa22.ui^Stmp5.ui;)                               ENABLE_SSE_IMPLEMENTATION(Va22=_mm_xor_ps(Va22,Vtmp5);)                                   ENABLE_AVX_IMPLEMENTATION(Va22=_mm256_xor_ps(Va22,Vtmp5);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa23.ui=Sa23.ui^Stmp5.ui;)                               ENABLE_SSE_IMPLEMENTATION(Va23=_mm_xor_ps(Va23,Vtmp5);)                                   ENABLE_AVX_IMPLEMENTATION(Va23=_mm256_xor_ps(Va23,Vtmp5);)\n\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Sa32.ui^Sa33.ui;)                               ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_xor_ps(Va32,Va33);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_xor_ps(Va32,Va33);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Stmp5.ui&Stmp4.ui;)                             ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_and_ps(Vtmp5,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_and_ps(Vtmp5,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa32.ui=Sa32.ui^Stmp5.ui;)                               ENABLE_SSE_IMPLEMENTATION(Va32=_mm_xor_ps(Va32,Vtmp5);)                                   ENABLE_AVX_IMPLEMENTATION(Va32=_mm256_xor_ps(Va32,Vtmp5);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa33.ui=Sa33.ui^Stmp5.ui;)                               ENABLE_SSE_IMPLEMENTATION(Va33=_mm_xor_ps(Va33,Vtmp5);)                                   ENABLE_AVX_IMPLEMENTATION(Va33=_mm256_xor_ps(Va33,Vtmp5);)\n\n#ifdef COMPUTE_V_AS_MATRIX\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Sv12.ui^Sv13.ui;)                               ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_xor_ps(Vv12,Vv13);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_xor_ps(Vv12,Vv13);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Stmp5.ui&Stmp4.ui;)                             ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_and_ps(Vtmp5,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_and_ps(Vtmp5,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv12.ui=Sv12.ui^Stmp5.ui;)                               ENABLE_SSE_IMPLEMENTATION(Vv12=_mm_xor_ps(Vv12,Vtmp5);)                                   ENABLE_AVX_IMPLEMENTATION(Vv12=_mm256_xor_ps(Vv12,Vtmp5);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv13.ui=Sv13.ui^Stmp5.ui;)                               ENABLE_SSE_IMPLEMENTATION(Vv13=_mm_xor_ps(Vv13,Vtmp5);)                                   ENABLE_AVX_IMPLEMENTATION(Vv13=_mm256_xor_ps(Vv13,Vtmp5);)\n\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Sv22.ui^Sv23.ui;)                               ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_xor_ps(Vv22,Vv23);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_xor_ps(Vv22,Vv23);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Stmp5.ui&Stmp4.ui;)                             ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_and_ps(Vtmp5,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_and_ps(Vtmp5,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv22.ui=Sv22.ui^Stmp5.ui;)                               ENABLE_SSE_IMPLEMENTATION(Vv22=_mm_xor_ps(Vv22,Vtmp5);)                                   ENABLE_AVX_IMPLEMENTATION(Vv22=_mm256_xor_ps(Vv22,Vtmp5);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv23.ui=Sv23.ui^Stmp5.ui;)                               ENABLE_SSE_IMPLEMENTATION(Vv23=_mm_xor_ps(Vv23,Vtmp5);)                                   ENABLE_AVX_IMPLEMENTATION(Vv23=_mm256_xor_ps(Vv23,Vtmp5);)\n\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Sv32.ui^Sv33.ui;)                               ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_xor_ps(Vv32,Vv33);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_xor_ps(Vv32,Vv33);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Stmp5.ui&Stmp4.ui;)                             ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_and_ps(Vtmp5,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_and_ps(Vtmp5,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv32.ui=Sv32.ui^Stmp5.ui;)                               ENABLE_SSE_IMPLEMENTATION(Vv32=_mm_xor_ps(Vv32,Vtmp5);)                                   ENABLE_AVX_IMPLEMENTATION(Vv32=_mm256_xor_ps(Vv32,Vtmp5);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv33.ui=Sv33.ui^Stmp5.ui;)                               ENABLE_SSE_IMPLEMENTATION(Vv33=_mm_xor_ps(Vv33,Vtmp5);)                                   ENABLE_AVX_IMPLEMENTATION(Vv33=_mm256_xor_ps(Vv33,Vtmp5);)\n#endif\n\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Stmp2.ui^Stmp3.ui;)                             ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_xor_ps(Vtmp2,Vtmp3);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_xor_ps(Vtmp2,Vtmp3);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Stmp5.ui&Stmp4.ui;)                             ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_and_ps(Vtmp5,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_and_ps(Vtmp5,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp2.ui=Stmp2.ui^Stmp5.ui;)                             ENABLE_SSE_IMPLEMENTATION(Vtmp2=_mm_xor_ps(Vtmp2,Vtmp5);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp2=_mm256_xor_ps(Vtmp2,Vtmp5);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp3.ui=Stmp3.ui^Stmp5.ui;)                             ENABLE_SSE_IMPLEMENTATION(Vtmp3=_mm_xor_ps(Vtmp3,Vtmp5);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp3=_mm256_xor_ps(Vtmp3,Vtmp5);)\n\n    // If columns 2-3 have been swapped, negate 3rd column of A and V so that V is still a rotation\n\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.f=-2.;)                                            ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_set1_ps(-2.);)                                        ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_set1_ps(-2.);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.ui=Stmp5.ui&Stmp4.ui;)                             ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_and_ps(Vtmp5,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_and_ps(Vtmp5,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp4.f=1.;)                                             ENABLE_SSE_IMPLEMENTATION(Vtmp4=Vone;)                                                    ENABLE_AVX_IMPLEMENTATION(Vtmp4=Vone;)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp4.f=Stmp4.f+Stmp5.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp4=_mm_add_ps(Vtmp4,Vtmp5);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp4=_mm256_add_ps(Vtmp4,Vtmp5);)\n\n    ENABLE_SCALAR_IMPLEMENTATION(Sa13.f=Sa13.f*Stmp4.f;)                                  ENABLE_SSE_IMPLEMENTATION(Va13=_mm_mul_ps(Va13,Vtmp4);)                                   ENABLE_AVX_IMPLEMENTATION(Va13=_mm256_mul_ps(Va13,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa23.f=Sa23.f*Stmp4.f;)                                  ENABLE_SSE_IMPLEMENTATION(Va23=_mm_mul_ps(Va23,Vtmp4);)                                   ENABLE_AVX_IMPLEMENTATION(Va23=_mm256_mul_ps(Va23,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa33.f=Sa33.f*Stmp4.f;)                                  ENABLE_SSE_IMPLEMENTATION(Va33=_mm_mul_ps(Va33,Vtmp4);)                                   ENABLE_AVX_IMPLEMENTATION(Va33=_mm256_mul_ps(Va33,Vtmp4);)\n\n#ifdef COMPUTE_V_AS_MATRIX\n    ENABLE_SCALAR_IMPLEMENTATION(Sv13.f=Sv13.f*Stmp4.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vv13=_mm_mul_ps(Vv13,Vtmp4);)                                   ENABLE_AVX_IMPLEMENTATION(Vv13=_mm256_mul_ps(Vv13,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv23.f=Sv23.f*Stmp4.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vv23=_mm_mul_ps(Vv23,Vtmp4);)                                   ENABLE_AVX_IMPLEMENTATION(Vv23=_mm256_mul_ps(Vv23,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sv33.f=Sv33.f*Stmp4.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vv33=_mm_mul_ps(Vv33,Vtmp4);)                                   ENABLE_AVX_IMPLEMENTATION(Vv33=_mm256_mul_ps(Vv33,Vtmp4);)\n#endif\n\n    // If columns 2-3 have been swapped, also update quaternion representation of V (the quaternion may become un-normalized after this)\n\n#ifdef COMPUTE_V_AS_QUATERNION\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp4.f=Stmp4.f*Sone_half.f;)                            ENABLE_SSE_IMPLEMENTATION(Vtmp4=_mm_mul_ps(Vtmp4,Vone_half);)                             ENABLE_AVX_IMPLEMENTATION(Vtmp4=_mm256_mul_ps(Vtmp4,Vone_half);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp4.f=Stmp4.f-Sone_half.f;)                            ENABLE_SSE_IMPLEMENTATION(Vtmp4=_mm_sub_ps(Vtmp4,Vone_half);)                             ENABLE_AVX_IMPLEMENTATION(Vtmp4=_mm256_sub_ps(Vtmp4,Vone_half);)\n\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.f=Stmp4.f*Sqvvx.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_mul_ps(Vtmp4,Vqvvx);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_mul_ps(Vtmp4,Vqvvx);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.f=Stmp5.f+Sqvs.f;)                                 ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_add_ps(Vtmp5,Vqvs);)                                  ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_add_ps(Vtmp5,Vqvs);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sqvs.f=Sqvs.f*Stmp4.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vqvs=_mm_mul_ps(Vqvs,Vtmp4);)                                   ENABLE_AVX_IMPLEMENTATION(Vqvs=_mm256_mul_ps(Vqvs,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sqvvx.f=Sqvvx.f-Sqvs.f;)                                 ENABLE_SSE_IMPLEMENTATION(Vqvvx=_mm_sub_ps(Vqvvx,Vqvs);)                                  ENABLE_AVX_IMPLEMENTATION(Vqvvx=_mm256_sub_ps(Vqvvx,Vqvs);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sqvs.f=Stmp5.f;)                                         ENABLE_SSE_IMPLEMENTATION(Vqvs=Vtmp5;)                                                    ENABLE_AVX_IMPLEMENTATION(Vqvs=Vtmp5;)\n\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.f=Stmp4.f*Sqvvy.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_mul_ps(Vtmp4,Vqvvy);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_mul_ps(Vtmp4,Vqvvy);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp5.f=Stmp5.f+Sqvvz.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp5=_mm_add_ps(Vtmp5,Vqvvz);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp5=_mm256_add_ps(Vtmp5,Vqvvz);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sqvvz.f=Sqvvz.f*Stmp4.f;)                                ENABLE_SSE_IMPLEMENTATION(Vqvvz=_mm_mul_ps(Vqvvz,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vqvvz=_mm256_mul_ps(Vqvvz,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sqvvy.f=Sqvvy.f-Sqvvz.f;)                                ENABLE_SSE_IMPLEMENTATION(Vqvvy=_mm_sub_ps(Vqvvy,Vqvvz);)                                 ENABLE_AVX_IMPLEMENTATION(Vqvvy=_mm256_sub_ps(Vqvvy,Vqvvz);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sqvvz.f=Stmp5.f;)                                        ENABLE_SSE_IMPLEMENTATION(Vqvvz=Vtmp5;)                                                   ENABLE_AVX_IMPLEMENTATION(Vqvvz=Vtmp5;)\n#endif\n\n#ifdef COMPUTE_V_AS_MATRIX\n#ifdef PRINT_DEBUGGING_OUTPUT\n#ifdef USE_SCALAR_IMPLEMENTATION\n    std::cout<<\"Scalar V =\"<<std::endl;\n    std::cout<<std::setw(12)<<Sv11.f<<\"  \"<<std::setw(12)<<Sv12.f<<\"  \"<<std::setw(12)<<Sv13.f<<std::endl;\n    std::cout<<std::setw(12)<<Sv21.f<<\"  \"<<std::setw(12)<<Sv22.f<<\"  \"<<std::setw(12)<<Sv23.f<<std::endl;\n    std::cout<<std::setw(12)<<Sv31.f<<\"  \"<<std::setw(12)<<Sv32.f<<\"  \"<<std::setw(12)<<Sv33.f<<std::endl;\n#endif\n#ifdef USE_SSE_IMPLEMENTATION\n    _mm_storeu_ps(buf,Vv11);V11=buf[0];\n    _mm_storeu_ps(buf,Vv21);V21=buf[0];\n    _mm_storeu_ps(buf,Vv31);V31=buf[0];\n    _mm_storeu_ps(buf,Vv12);V12=buf[0];\n    _mm_storeu_ps(buf,Vv22);V22=buf[0];\n    _mm_storeu_ps(buf,Vv32);V32=buf[0];\n    _mm_storeu_ps(buf,Vv13);V13=buf[0];\n    _mm_storeu_ps(buf,Vv23);V23=buf[0];\n    _mm_storeu_ps(buf,Vv33);V33=buf[0];\n    std::cout<<\"Vector V =\"<<std::endl;\n    std::cout<<std::setw(12)<<V11<<\"  \"<<std::setw(12)<<V12<<\"  \"<<std::setw(12)<<V13<<std::endl;\n    std::cout<<std::setw(12)<<V21<<\"  \"<<std::setw(12)<<V22<<\"  \"<<std::setw(12)<<V23<<std::endl;\n    std::cout<<std::setw(12)<<V31<<\"  \"<<std::setw(12)<<V32<<\"  \"<<std::setw(12)<<V33<<std::endl;\n#endif\n#ifdef USE_AVX_IMPLEMENTATION\n    _mm256_storeu_ps(buf,Vv11);V11=buf[0];\n    _mm256_storeu_ps(buf,Vv21);V21=buf[0];\n    _mm256_storeu_ps(buf,Vv31);V31=buf[0];\n    _mm256_storeu_ps(buf,Vv12);V12=buf[0];\n    _mm256_storeu_ps(buf,Vv22);V22=buf[0];\n    _mm256_storeu_ps(buf,Vv32);V32=buf[0];\n    _mm256_storeu_ps(buf,Vv13);V13=buf[0];\n    _mm256_storeu_ps(buf,Vv23);V23=buf[0];\n    _mm256_storeu_ps(buf,Vv33);V33=buf[0];\n    std::cout<<\"Vector V =\"<<std::endl;\n    std::cout<<std::setw(12)<<V11<<\"  \"<<std::setw(12)<<V12<<\"  \"<<std::setw(12)<<V13<<std::endl;\n    std::cout<<std::setw(12)<<V21<<\"  \"<<std::setw(12)<<V22<<\"  \"<<std::setw(12)<<V23<<std::endl;\n    std::cout<<std::setw(12)<<V31<<\"  \"<<std::setw(12)<<V32<<\"  \"<<std::setw(12)<<V33<<std::endl;\n#endif\n#endif\n#endif\n\n#ifdef PRINT_DEBUGGING_OUTPUT\n#ifdef USE_SCALAR_IMPLEMENTATION\n    std::cout<<\"Scalar A (after multiplying with V) =\"<<std::endl;\n    std::cout<<std::setw(12)<<Sa11.f<<\"  \"<<std::setw(12)<<Sa12.f<<\"  \"<<std::setw(12)<<Sa13.f<<std::endl;\n    std::cout<<std::setw(12)<<Sa21.f<<\"  \"<<std::setw(12)<<Sa22.f<<\"  \"<<std::setw(12)<<Sa23.f<<std::endl;\n    std::cout<<std::setw(12)<<Sa31.f<<\"  \"<<std::setw(12)<<Sa32.f<<\"  \"<<std::setw(12)<<Sa33.f<<std::endl;\n#endif\n#ifdef USE_SSE_IMPLEMENTATION\n    _mm_storeu_ps(buf,Va11);A11=buf[0];\n    _mm_storeu_ps(buf,Va21);A21=buf[0];\n    _mm_storeu_ps(buf,Va31);A31=buf[0];\n    _mm_storeu_ps(buf,Va12);A12=buf[0];\n    _mm_storeu_ps(buf,Va22);A22=buf[0];\n    _mm_storeu_ps(buf,Va32);A32=buf[0];\n    _mm_storeu_ps(buf,Va13);A13=buf[0];\n    _mm_storeu_ps(buf,Va23);A23=buf[0];\n    _mm_storeu_ps(buf,Va33);A33=buf[0];\n    std::cout<<\"Vector A (after multiplying with V) =\"<<std::endl;\n    std::cout<<std::setw(12)<<A11<<\"  \"<<std::setw(12)<<A12<<\"  \"<<std::setw(12)<<A13<<std::endl;\n    std::cout<<std::setw(12)<<A21<<\"  \"<<std::setw(12)<<A22<<\"  \"<<std::setw(12)<<A23<<std::endl;\n    std::cout<<std::setw(12)<<A31<<\"  \"<<std::setw(12)<<A32<<\"  \"<<std::setw(12)<<A33<<std::endl;\n#endif\n#ifdef USE_AVX_IMPLEMENTATION\n    _mm256_storeu_ps(buf,Va11);A11=buf[0];\n    _mm256_storeu_ps(buf,Va21);A21=buf[0];\n    _mm256_storeu_ps(buf,Va31);A31=buf[0];\n    _mm256_storeu_ps(buf,Va12);A12=buf[0];\n    _mm256_storeu_ps(buf,Va22);A22=buf[0];\n    _mm256_storeu_ps(buf,Va32);A32=buf[0];\n    _mm256_storeu_ps(buf,Va13);A13=buf[0];\n    _mm256_storeu_ps(buf,Va23);A23=buf[0];\n    _mm256_storeu_ps(buf,Va33);A33=buf[0];\n    std::cout<<\"Vector A (after multiplying with V) =\"<<std::endl;\n    std::cout<<std::setw(12)<<A11<<\"  \"<<std::setw(12)<<A12<<\"  \"<<std::setw(12)<<A13<<std::endl;\n    std::cout<<std::setw(12)<<A21<<\"  \"<<std::setw(12)<<A22<<\"  \"<<std::setw(12)<<A23<<std::endl;\n    std::cout<<std::setw(12)<<A31<<\"  \"<<std::setw(12)<<A32<<\"  \"<<std::setw(12)<<A33<<std::endl;\n#endif\n#endif\n\n    //###########################################################\n    // Re-normalize quaternion for matrix V\n    //###########################################################\n\n#ifdef COMPUTE_V_AS_QUATERNION\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp2.f=Sqvs.f*Sqvs.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vtmp2=_mm_mul_ps(Vqvs,Vqvs);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp2=_mm256_mul_ps(Vqvs,Vqvs);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sqvvx.f*Sqvvx.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Vqvvx,Vqvvx);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Vqvvx,Vqvvx);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp2.f=Stmp1.f+Stmp2.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp2=_mm_add_ps(Vtmp1,Vtmp2);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp2=_mm256_add_ps(Vtmp1,Vtmp2);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sqvvy.f*Sqvvy.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Vqvvy,Vqvvy);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Vqvvy,Vqvvy);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp2.f=Stmp1.f+Stmp2.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp2=_mm_add_ps(Vtmp1,Vtmp2);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp2=_mm256_add_ps(Vtmp1,Vtmp2);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Sqvvz.f*Sqvvz.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Vqvvz,Vqvvz);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Vqvvz,Vqvvz);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp2.f=Stmp1.f+Stmp2.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp2=_mm_add_ps(Vtmp1,Vtmp2);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp2=_mm256_add_ps(Vtmp1,Vtmp2);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=rsqrt(Stmp2.f);)                                 ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_rsqrt_ps(Vtmp2);)                                     ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_rsqrt_ps(Vtmp2);)\n\n#ifdef PERFORM_STRICT_QUATERNION_RENORMALIZATION\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp4.f=Stmp1.f*Sone_half.f;)                            ENABLE_SSE_IMPLEMENTATION(Vtmp4=_mm_mul_ps(Vtmp1,Vone_half);)                             ENABLE_AVX_IMPLEMENTATION(Vtmp4=_mm256_mul_ps(Vtmp1,Vone_half);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp3.f=Stmp1.f*Stmp4.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp3=_mm_mul_ps(Vtmp1,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp3=_mm256_mul_ps(Vtmp1,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp3.f=Stmp1.f*Stmp3.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp3=_mm_mul_ps(Vtmp1,Vtmp3);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp3=_mm256_mul_ps(Vtmp1,Vtmp3);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp3.f=Stmp2.f*Stmp3.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp3=_mm_mul_ps(Vtmp2,Vtmp3);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp3=_mm256_mul_ps(Vtmp2,Vtmp3);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Stmp1.f+Stmp4.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_add_ps(Vtmp1,Vtmp4);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_add_ps(Vtmp1,Vtmp4);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Stmp1.f-Stmp3.f;)                                ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_sub_ps(Vtmp1,Vtmp3);)                                 ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_sub_ps(Vtmp1,Vtmp3);)\n#endif\n\n    ENABLE_SCALAR_IMPLEMENTATION(Sqvs.f=Sqvs.f*Stmp1.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vqvs=_mm_mul_ps(Vqvs,Vtmp1);)                                   ENABLE_AVX_IMPLEMENTATION(Vqvs=_mm256_mul_ps(Vqvs,Vtmp1);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sqvvx.f=Sqvvx.f*Stmp1.f;)                                ENABLE_SSE_IMPLEMENTATION(Vqvvx=_mm_mul_ps(Vqvvx,Vtmp1);)                                 ENABLE_AVX_IMPLEMENTATION(Vqvvx=_mm256_mul_ps(Vqvvx,Vtmp1);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sqvvy.f=Sqvvy.f*Stmp1.f;)                                ENABLE_SSE_IMPLEMENTATION(Vqvvy=_mm_mul_ps(Vqvvy,Vtmp1);)                                 ENABLE_AVX_IMPLEMENTATION(Vqvvy=_mm256_mul_ps(Vqvvy,Vtmp1);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sqvvz.f=Sqvvz.f*Stmp1.f;)                                ENABLE_SSE_IMPLEMENTATION(Vqvvz=_mm_mul_ps(Vqvvz,Vtmp1);)                                 ENABLE_AVX_IMPLEMENTATION(Vqvvz=_mm256_mul_ps(Vqvvz,Vtmp1);)\n\n#ifdef PRINT_DEBUGGING_OUTPUT\n#ifdef USE_SCALAR_IMPLEMENTATION\n    std::cout<<\"Scalar qV =\"<<std::endl;\n    std::cout<<std::setw(12)<<Sqvs.f<<\"  \"<<std::setw(12)<<Sqvvx.f<<\"  \"<<std::setw(12)<<Sqvvy.f<<\"  \"<<std::setw(12)<<Sqvvz.f<<std::endl;\n#endif\n#ifdef USE_SSE_IMPLEMENTATION\n    _mm_storeu_ps(buf,Vqvs);QVS=buf[0];\n    _mm_storeu_ps(buf,Vqvvx);QVVX=buf[0];\n    _mm_storeu_ps(buf,Vqvvy);QVVY=buf[0];\n    _mm_storeu_ps(buf,Vqvvz);QVVZ=buf[0];\n    std::cout<<\"Vector qV =\"<<std::endl;\n    std::cout<<std::setw(12)<<QVS<<\"  \"<<std::setw(12)<<QVVX<<\"  \"<<std::setw(12)<<QVVY<<\"  \"<<std::setw(12)<<QVVZ<<std::endl;\n#endif\n#ifdef USE_AVX_IMPLEMENTATION\n    _mm256_storeu_ps(buf,Vqvs);QVS=buf[0];\n    _mm256_storeu_ps(buf,Vqvvx);QVVX=buf[0];\n    _mm256_storeu_ps(buf,Vqvvy);QVVY=buf[0];\n    _mm256_storeu_ps(buf,Vqvvz);QVVZ=buf[0];\n    std::cout<<\"Vector qV =\"<<std::endl;\n    std::cout<<std::setw(12)<<QVS<<\"  \"<<std::setw(12)<<QVVX<<\"  \"<<std::setw(12)<<QVVY<<\"  \"<<std::setw(12)<<QVVZ<<std::endl;\n#endif\n#endif\n#endif\n\n    //###########################################################\n    // Construct QR factorization of A*V (=U*D) using Givens rotations\n    //###########################################################\n\n#ifdef COMPUTE_U_AS_MATRIX\n    ENABLE_SCALAR_IMPLEMENTATION(Su11.f=1.;)                                              ENABLE_SSE_IMPLEMENTATION(Vu11=Vone;)                                                     ENABLE_AVX_IMPLEMENTATION(Vu11=Vone;)\n    ENABLE_SCALAR_IMPLEMENTATION(Su21.f=0.;)                                              ENABLE_SSE_IMPLEMENTATION(Vu21=_mm_xor_ps(Vu21,Vu21);)                                    ENABLE_AVX_IMPLEMENTATION(Vu21=_mm256_xor_ps(Vu21,Vu21);)\n    ENABLE_SCALAR_IMPLEMENTATION(Su31.f=0.;)                                              ENABLE_SSE_IMPLEMENTATION(Vu31=_mm_xor_ps(Vu31,Vu31);)                                    ENABLE_AVX_IMPLEMENTATION(Vu31=_mm256_xor_ps(Vu31,Vu31);)\n    ENABLE_SCALAR_IMPLEMENTATION(Su12.f=0.;)                                              ENABLE_SSE_IMPLEMENTATION(Vu12=_mm_xor_ps(Vu12,Vu12);)                                    ENABLE_AVX_IMPLEMENTATION(Vu12=_mm256_xor_ps(Vu12,Vu12);)\n    ENABLE_SCALAR_IMPLEMENTATION(Su22.f=1.;)                                              ENABLE_SSE_IMPLEMENTATION(Vu22=Vone;)                                                     ENABLE_AVX_IMPLEMENTATION(Vu22=Vone;)\n    ENABLE_SCALAR_IMPLEMENTATION(Su32.f=0.;)                                              ENABLE_SSE_IMPLEMENTATION(Vu32=_mm_xor_ps(Vu32,Vu32);)                                    ENABLE_AVX_IMPLEMENTATION(Vu32=_mm256_xor_ps(Vu32,Vu32);)\n    ENABLE_SCALAR_IMPLEMENTATION(Su13.f=0.;)                                              ENABLE_SSE_IMPLEMENTATION(Vu13=_mm_xor_ps(Vu13,Vu13);)                                    ENABLE_AVX_IMPLEMENTATION(Vu13=_mm256_xor_ps(Vu13,Vu13);)\n    ENABLE_SCALAR_IMPLEMENTATION(Su23.f=0.;)                                              ENABLE_SSE_IMPLEMENTATION(Vu23=_mm_xor_ps(Vu23,Vu23);)                                    ENABLE_AVX_IMPLEMENTATION(Vu23=_mm256_xor_ps(Vu23,Vu23);)\n    ENABLE_SCALAR_IMPLEMENTATION(Su33.f=1.;)                                              ENABLE_SSE_IMPLEMENTATION(Vu33=Vone;)                                                     ENABLE_AVX_IMPLEMENTATION(Vu33=Vone;)\n#endif\n\n#ifdef COMPUTE_U_AS_QUATERNION\n    ENABLE_SCALAR_IMPLEMENTATION(Squs.f=1.;)                                              ENABLE_SSE_IMPLEMENTATION(Vqus=Vone;)                                                     ENABLE_AVX_IMPLEMENTATION(Vqus=Vone;)\n    ENABLE_SCALAR_IMPLEMENTATION(Squvx.f=0.;)                                             ENABLE_SSE_IMPLEMENTATION(Vquvx=_mm_xor_ps(Vquvx,Vquvx);)                                 ENABLE_AVX_IMPLEMENTATION(Vquvx=_mm256_xor_ps(Vquvx,Vquvx);)\n    ENABLE_SCALAR_IMPLEMENTATION(Squvy.f=0.;)                                             ENABLE_SSE_IMPLEMENTATION(Vquvy=_mm_xor_ps(Vquvy,Vquvy);)                                 ENABLE_AVX_IMPLEMENTATION(Vquvy=_mm256_xor_ps(Vquvy,Vquvy);)\n    ENABLE_SCALAR_IMPLEMENTATION(Squvz.f=0.;)                                             ENABLE_SSE_IMPLEMENTATION(Vquvz=_mm_xor_ps(Vquvz,Vquvz);)                                 ENABLE_AVX_IMPLEMENTATION(Vquvz=_mm256_xor_ps(Vquvz,Vquvz);)\n#endif\n\n    // First Givens rotation\n\n#define SAPIVOT Sa11\n#define SANPIVOT Sa21\n#define SA11 Sa11\n#define SA21 Sa21\n#define SA12 Sa12\n#define SA22 Sa22\n#define SA13 Sa13\n#define SA23 Sa23\n#define SU11 Su11\n#define SU12 Su12\n#define SU21 Su21\n#define SU22 Su22\n#define SU31 Su31\n#define SU32 Su32\n\n#define VAPIVOT Va11\n#define VANPIVOT Va21\n#define VA11 Va11\n#define VA21 Va21\n#define VA12 Va12\n#define VA22 Va22\n#define VA13 Va13\n#define VA23 Va23\n#define VU11 Vu11\n#define VU12 Vu12\n#define VU21 Vu21\n#define VU22 Vu22\n#define VU31 Vu31\n#define VU32 Vu32\n\n#include \"Singular_Value_Decomposition_Givens_QR_Factorization_Kernel.hpp\"\n    \n#undef SAPIVOT\n#undef SANPIVOT\n#undef SA11\n#undef SA21\n#undef SA12\n#undef SA22\n#undef SA13\n#undef SA23\n#undef SU11\n#undef SU12\n#undef SU21\n#undef SU22\n#undef SU31\n#undef SU32\n\n#undef VAPIVOT\n#undef VANPIVOT\n#undef VA11\n#undef VA21\n#undef VA12\n#undef VA22\n#undef VA13\n#undef VA23\n#undef VU11\n#undef VU12\n#undef VU21\n#undef VU22\n#undef VU31\n#undef VU32\n\n    // Update quaternion representation of U\n\n#ifdef COMPUTE_U_AS_QUATERNION\n    ENABLE_SCALAR_IMPLEMENTATION(Squs.f=Sch.f;)                                           ENABLE_SSE_IMPLEMENTATION(Vqus=Vch;)                                                      ENABLE_AVX_IMPLEMENTATION(Vqus=Vch;)\n    ENABLE_SCALAR_IMPLEMENTATION(Squvx.f=0.;)                                             ENABLE_SSE_IMPLEMENTATION(Vquvx=_mm_xor_ps(Vquvx,Vquvx);)                                 ENABLE_AVX_IMPLEMENTATION(Vquvx=_mm256_xor_ps(Vquvx,Vquvx);)\n    ENABLE_SCALAR_IMPLEMENTATION(Squvy.f=0.;)                                             ENABLE_SSE_IMPLEMENTATION(Vquvy=_mm_xor_ps(Vquvy,Vquvy);)                                 ENABLE_AVX_IMPLEMENTATION(Vquvy=_mm256_xor_ps(Vquvy,Vquvy);)\n    ENABLE_SCALAR_IMPLEMENTATION(Squvz.f=Ssh.f;)                                          ENABLE_SSE_IMPLEMENTATION(Vquvz=Vsh;)                                                     ENABLE_AVX_IMPLEMENTATION(Vquvz=Vsh;)\n#endif\n\n    // Second Givens rotation\n\n#define SAPIVOT Sa11\n#define SANPIVOT Sa31\n#define SA11 Sa11\n#define SA21 Sa31\n#define SA12 Sa12\n#define SA22 Sa32\n#define SA13 Sa13\n#define SA23 Sa33\n#define SU11 Su11\n#define SU12 Su13\n#define SU21 Su21\n#define SU22 Su23\n#define SU31 Su31\n#define SU32 Su33\n\n#define VAPIVOT Va11\n#define VANPIVOT Va31\n#define VA11 Va11\n#define VA21 Va31\n#define VA12 Va12\n#define VA22 Va32\n#define VA13 Va13\n#define VA23 Va33\n#define VU11 Vu11\n#define VU12 Vu13\n#define VU21 Vu21\n#define VU22 Vu23\n#define VU31 Vu31\n#define VU32 Vu33\n\n#include \"Singular_Value_Decomposition_Givens_QR_Factorization_Kernel.hpp\"\n    \n#undef SAPIVOT\n#undef SANPIVOT\n#undef SA11\n#undef SA21\n#undef SA12\n#undef SA22\n#undef SA13\n#undef SA23\n#undef SU11\n#undef SU12\n#undef SU21\n#undef SU22\n#undef SU31\n#undef SU32\n\n#undef VAPIVOT\n#undef VANPIVOT\n#undef VA11\n#undef VA21\n#undef VA12\n#undef VA22\n#undef VA13\n#undef VA23\n#undef VU11\n#undef VU12\n#undef VU21\n#undef VU22\n#undef VU31\n#undef VU32\n\n    // Update quaternion representation of U\n\n#ifdef COMPUTE_U_AS_QUATERNION\n    ENABLE_SCALAR_IMPLEMENTATION(Squvx.f=Ssh.f*Squvz.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vquvx=_mm_mul_ps(Vsh,Vquvz);)                                   ENABLE_AVX_IMPLEMENTATION(Vquvx=_mm256_mul_ps(Vsh,Vquvz);)\n    ENABLE_SCALAR_IMPLEMENTATION(Ssh.f=Ssh.f*Squs.f;)                                     ENABLE_SSE_IMPLEMENTATION(Vsh=_mm_mul_ps(Vsh,Vqus);)                                      ENABLE_AVX_IMPLEMENTATION(Vsh=_mm256_mul_ps(Vsh,Vqus);)\n    ENABLE_SCALAR_IMPLEMENTATION(Squvy.f=Squvy.f-Ssh.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vquvy=_mm_sub_ps(Vquvy,Vsh);)                                   ENABLE_AVX_IMPLEMENTATION(Vquvy=_mm256_sub_ps(Vquvy,Vsh);)\n    ENABLE_SCALAR_IMPLEMENTATION(Squs.f=Sch.f*Squs.f;)                                    ENABLE_SSE_IMPLEMENTATION(Vqus=_mm_mul_ps(Vch,Vqus);)                                     ENABLE_AVX_IMPLEMENTATION(Vqus=_mm256_mul_ps(Vch,Vqus);)\n    ENABLE_SCALAR_IMPLEMENTATION(Squvz.f=Sch.f*Squvz.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vquvz=_mm_mul_ps(Vch,Vquvz);)                                   ENABLE_AVX_IMPLEMENTATION(Vquvz=_mm256_mul_ps(Vch,Vquvz);)\n#endif\n\n    // Third Givens rotation\n\n#define SAPIVOT Sa22\n#define SANPIVOT Sa32\n#define SA11 Sa21\n#define SA21 Sa31\n#define SA12 Sa22\n#define SA22 Sa32\n#define SA13 Sa23\n#define SA23 Sa33\n#define SU11 Su12\n#define SU12 Su13\n#define SU21 Su22\n#define SU22 Su23\n#define SU31 Su32\n#define SU32 Su33\n\n#define VAPIVOT Va22\n#define VANPIVOT Va32\n#define VA11 Va21\n#define VA21 Va31\n#define VA12 Va22\n#define VA22 Va32\n#define VA13 Va23\n#define VA23 Va33\n#define VU11 Vu12\n#define VU12 Vu13\n#define VU21 Vu22\n#define VU22 Vu23\n#define VU31 Vu32\n#define VU32 Vu33\n\n#include \"Singular_Value_Decomposition_Givens_QR_Factorization_Kernel.hpp\"\n    \n#undef SAPIVOT\n#undef SANPIVOT\n#undef SA11\n#undef SA21\n#undef SA12\n#undef SA22\n#undef SA13\n#undef SA23\n#undef SU11\n#undef SU12\n#undef SU21\n#undef SU22\n#undef SU31\n#undef SU32\n\n#undef VAPIVOT\n#undef VANPIVOT\n#undef VA11\n#undef VA21\n#undef VA12\n#undef VA22\n#undef VA13\n#undef VA23\n#undef VU11\n#undef VU12\n#undef VU21\n#undef VU22\n#undef VU31\n#undef VU32\n\n    // Update quaternion representation of U\n\n#ifdef COMPUTE_U_AS_QUATERNION\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp1.f=Ssh.f*Squvx.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vtmp1=_mm_mul_ps(Vsh,Vquvx);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp1=_mm256_mul_ps(Vsh,Vquvx);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp2.f=Ssh.f*Squvy.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vtmp2=_mm_mul_ps(Vsh,Vquvy);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp2=_mm256_mul_ps(Vsh,Vquvy);)\n    ENABLE_SCALAR_IMPLEMENTATION(Stmp3.f=Ssh.f*Squvz.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vtmp3=_mm_mul_ps(Vsh,Vquvz);)                                   ENABLE_AVX_IMPLEMENTATION(Vtmp3=_mm256_mul_ps(Vsh,Vquvz);)\n    ENABLE_SCALAR_IMPLEMENTATION(Ssh.f=Ssh.f*Squs.f;)                                     ENABLE_SSE_IMPLEMENTATION(Vsh=_mm_mul_ps(Vsh,Vqus);)                                      ENABLE_AVX_IMPLEMENTATION(Vsh=_mm256_mul_ps(Vsh,Vqus);)\n    ENABLE_SCALAR_IMPLEMENTATION(Squs.f=Sch.f*Squs.f;)                                    ENABLE_SSE_IMPLEMENTATION(Vqus=_mm_mul_ps(Vch,Vqus);)                                     ENABLE_AVX_IMPLEMENTATION(Vqus=_mm256_mul_ps(Vch,Vqus);)\n    ENABLE_SCALAR_IMPLEMENTATION(Squvx.f=Sch.f*Squvx.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vquvx=_mm_mul_ps(Vch,Vquvx);)                                   ENABLE_AVX_IMPLEMENTATION(Vquvx=_mm256_mul_ps(Vch,Vquvx);)\n    ENABLE_SCALAR_IMPLEMENTATION(Squvy.f=Sch.f*Squvy.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vquvy=_mm_mul_ps(Vch,Vquvy);)                                   ENABLE_AVX_IMPLEMENTATION(Vquvy=_mm256_mul_ps(Vch,Vquvy);)\n    ENABLE_SCALAR_IMPLEMENTATION(Squvz.f=Sch.f*Squvz.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vquvz=_mm_mul_ps(Vch,Vquvz);)                                   ENABLE_AVX_IMPLEMENTATION(Vquvz=_mm256_mul_ps(Vch,Vquvz);)\n    ENABLE_SCALAR_IMPLEMENTATION(Squvx.f=Squvx.f+Ssh.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vquvx=_mm_add_ps(Vquvx,Vsh);)                                   ENABLE_AVX_IMPLEMENTATION(Vquvx=_mm256_add_ps(Vquvx,Vsh);)\n    ENABLE_SCALAR_IMPLEMENTATION(Squs.f=Squs.f-Stmp1.f;)                                  ENABLE_SSE_IMPLEMENTATION(Vqus=_mm_sub_ps(Vqus,Vtmp1);)                                   ENABLE_AVX_IMPLEMENTATION(Vqus=_mm256_sub_ps(Vqus,Vtmp1);)\n    ENABLE_SCALAR_IMPLEMENTATION(Squvy.f=Squvy.f+Stmp3.f;)                                ENABLE_SSE_IMPLEMENTATION(Vquvy=_mm_add_ps(Vquvy,Vtmp3);)                                 ENABLE_AVX_IMPLEMENTATION(Vquvy=_mm256_add_ps(Vquvy,Vtmp3);)\n    ENABLE_SCALAR_IMPLEMENTATION(Squvz.f=Squvz.f-Stmp2.f;)                                ENABLE_SSE_IMPLEMENTATION(Vquvz=_mm_sub_ps(Vquvz,Vtmp2);)                                 ENABLE_AVX_IMPLEMENTATION(Vquvz=_mm256_sub_ps(Vquvz,Vtmp2);)\n#endif\n\n#ifdef COMPUTE_U_AS_MATRIX\n#ifdef PRINT_DEBUGGING_OUTPUT\n#ifdef USE_SCALAR_IMPLEMENTATION\n    std::cout<<\"Scalar U =\"<<std::endl;\n    std::cout<<std::setw(12)<<Su11.f<<\"  \"<<std::setw(12)<<Su12.f<<\"  \"<<std::setw(12)<<Su13.f<<std::endl;\n    std::cout<<std::setw(12)<<Su21.f<<\"  \"<<std::setw(12)<<Su22.f<<\"  \"<<std::setw(12)<<Su23.f<<std::endl;\n    std::cout<<std::setw(12)<<Su31.f<<\"  \"<<std::setw(12)<<Su32.f<<\"  \"<<std::setw(12)<<Su33.f<<std::endl;\n#endif\n#ifdef USE_SSE_IMPLEMENTATION\n    _mm_storeu_ps(buf,Vu11);U11=buf[0];\n    _mm_storeu_ps(buf,Vu21);U21=buf[0];\n    _mm_storeu_ps(buf,Vu31);U31=buf[0];\n    _mm_storeu_ps(buf,Vu12);U12=buf[0];\n    _mm_storeu_ps(buf,Vu22);U22=buf[0];\n    _mm_storeu_ps(buf,Vu32);U32=buf[0];\n    _mm_storeu_ps(buf,Vu13);U13=buf[0];\n    _mm_storeu_ps(buf,Vu23);U23=buf[0];\n    _mm_storeu_ps(buf,Vu33);U33=buf[0];\n    std::cout<<\"Vector U =\"<<std::endl;\n    std::cout<<std::setw(12)<<U11<<\"  \"<<std::setw(12)<<U12<<\"  \"<<std::setw(12)<<U13<<std::endl;\n    std::cout<<std::setw(12)<<U21<<\"  \"<<std::setw(12)<<U22<<\"  \"<<std::setw(12)<<U23<<std::endl;\n    std::cout<<std::setw(12)<<U31<<\"  \"<<std::setw(12)<<U32<<\"  \"<<std::setw(12)<<U33<<std::endl;\n#endif\n#ifdef USE_AVX_IMPLEMENTATION\n    _mm256_storeu_ps(buf,Vu11);U11=buf[0];\n    _mm256_storeu_ps(buf,Vu21);U21=buf[0];\n    _mm256_storeu_ps(buf,Vu31);U31=buf[0];\n    _mm256_storeu_ps(buf,Vu12);U12=buf[0];\n    _mm256_storeu_ps(buf,Vu22);U22=buf[0];\n    _mm256_storeu_ps(buf,Vu32);U32=buf[0];\n    _mm256_storeu_ps(buf,Vu13);U13=buf[0];\n    _mm256_storeu_ps(buf,Vu23);U23=buf[0];\n    _mm256_storeu_ps(buf,Vu33);U33=buf[0];\n    std::cout<<\"Vector U =\"<<std::endl;\n    std::cout<<std::setw(12)<<U11<<\"  \"<<std::setw(12)<<U12<<\"  \"<<std::setw(12)<<U13<<std::endl;\n    std::cout<<std::setw(12)<<U21<<\"  \"<<std::setw(12)<<U22<<\"  \"<<std::setw(12)<<U23<<std::endl;\n    std::cout<<std::setw(12)<<U31<<\"  \"<<std::setw(12)<<U32<<\"  \"<<std::setw(12)<<U33<<std::endl;\n#endif\n#endif\n#endif\n\n#ifdef PRINT_DEBUGGING_OUTPUT\n#ifdef USE_SCALAR_IMPLEMENTATION\n    std::cout<<\"Scalar A (after multiplying with U-transpose and V) =\"<<std::endl;\n    std::cout<<std::setw(12)<<Sa11.f<<\"  \"<<std::setw(12)<<Sa12.f<<\"  \"<<std::setw(12)<<Sa13.f<<std::endl;\n    std::cout<<std::setw(12)<<Sa21.f<<\"  \"<<std::setw(12)<<Sa22.f<<\"  \"<<std::setw(12)<<Sa23.f<<std::endl;\n    std::cout<<std::setw(12)<<Sa31.f<<\"  \"<<std::setw(12)<<Sa32.f<<\"  \"<<std::setw(12)<<Sa33.f<<std::endl;\n#endif\n#ifdef USE_SSE_IMPLEMENTATION\n    _mm_storeu_ps(buf,Va11);A11=buf[0];\n    _mm_storeu_ps(buf,Va21);A21=buf[0];\n    _mm_storeu_ps(buf,Va31);A31=buf[0];\n    _mm_storeu_ps(buf,Va12);A12=buf[0];\n    _mm_storeu_ps(buf,Va22);A22=buf[0];\n    _mm_storeu_ps(buf,Va32);A32=buf[0];\n    _mm_storeu_ps(buf,Va13);A13=buf[0];\n    _mm_storeu_ps(buf,Va23);A23=buf[0];\n    _mm_storeu_ps(buf,Va33);A33=buf[0];\n    std::cout<<\"Vector A (after multiplying with U-transpose and V) =\"<<std::endl;\n    std::cout<<std::setw(12)<<A11<<\"  \"<<std::setw(12)<<A12<<\"  \"<<std::setw(12)<<A13<<std::endl;\n    std::cout<<std::setw(12)<<A21<<\"  \"<<std::setw(12)<<A22<<\"  \"<<std::setw(12)<<A23<<std::endl;\n    std::cout<<std::setw(12)<<A31<<\"  \"<<std::setw(12)<<A32<<\"  \"<<std::setw(12)<<A33<<std::endl;\n#endif\n#ifdef USE_AVX_IMPLEMENTATION\n    _mm256_storeu_ps(buf,Va11);A11=buf[0];\n    _mm256_storeu_ps(buf,Va21);A21=buf[0];\n    _mm256_storeu_ps(buf,Va31);A31=buf[0];\n    _mm256_storeu_ps(buf,Va12);A12=buf[0];\n    _mm256_storeu_ps(buf,Va22);A22=buf[0];\n    _mm256_storeu_ps(buf,Va32);A32=buf[0];\n    _mm256_storeu_ps(buf,Va13);A13=buf[0];\n    _mm256_storeu_ps(buf,Va23);A23=buf[0];\n    _mm256_storeu_ps(buf,Va33);A33=buf[0];\n    std::cout<<\"Vector A (after multiplying with U-transpose and V) =\"<<std::endl;\n    std::cout<<std::setw(12)<<A11<<\"  \"<<std::setw(12)<<A12<<\"  \"<<std::setw(12)<<A13<<std::endl;\n    std::cout<<std::setw(12)<<A21<<\"  \"<<std::setw(12)<<A22<<\"  \"<<std::setw(12)<<A23<<std::endl;\n    std::cout<<std::setw(12)<<A31<<\"  \"<<std::setw(12)<<A32<<\"  \"<<std::setw(12)<<A33<<std::endl;\n#endif\n#endif\n\n#ifdef COMPUTE_U_AS_QUATERNION\n#ifdef PRINT_DEBUGGING_OUTPUT\n#ifdef USE_SCALAR_IMPLEMENTATION\n    std::cout<<\"Scalar qU =\"<<std::endl;\n    std::cout<<std::setw(12)<<Squs.f<<\"  \"<<std::setw(12)<<Squvx.f<<\"  \"<<std::setw(12)<<Squvy.f<<\"  \"<<std::setw(12)<<Squvz.f<<std::endl;\n#endif\n#ifdef USE_SSE_IMPLEMENTATION\n    _mm_storeu_ps(buf,Vqus);QUS=buf[0];\n    _mm_storeu_ps(buf,Vquvx);QUVX=buf[0];\n    _mm_storeu_ps(buf,Vquvy);QUVY=buf[0];\n    _mm_storeu_ps(buf,Vquvz);QUVZ=buf[0];\n    std::cout<<\"Vector qU =\"<<std::endl;\n    std::cout<<std::setw(12)<<QUS<<\"  \"<<std::setw(12)<<QUVX<<\"  \"<<std::setw(12)<<QUVY<<\"  \"<<std::setw(12)<<QUVZ<<std::endl;\n#endif\n#ifdef USE_AVX_IMPLEMENTATION\n    _mm256_storeu_ps(buf,Vqus);QUS=buf[0];\n    _mm256_storeu_ps(buf,Vquvx);QUVX=buf[0];\n    _mm256_storeu_ps(buf,Vquvy);QUVY=buf[0];\n    _mm256_storeu_ps(buf,Vquvz);QUVZ=buf[0];\n    std::cout<<\"Vector qU =\"<<std::endl;\n    std::cout<<std::setw(12)<<QUS<<\"  \"<<std::setw(12)<<QUVX<<\"  \"<<std::setw(12)<<QUVY<<\"  \"<<std::setw(12)<<QUVZ<<std::endl;\n#endif\n#endif\n#endif\n\n#ifdef __INTEL_COMPILER\n#pragma warning( default : 592 )\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/Singular_Value_Decomposition_Preamble.hpp",
    "content": "//#####################################################################\n// Copyright (c) 2010-2011, Eftychios Sifakis.\n//\n// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n//   * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n//   * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or\n//     other materials provided with the distribution.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,\n// BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n// SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//#####################################################################\n\n#ifdef PRINT_DEBUGGING_OUTPUT\n#include <iomanip>\n#include <iostream>\n#endif\n\n// Prevent warnings\n#ifdef ENABLE_SCALAR_IMPLEMENTATION\n#  undef ENABLE_SCALAR_IMPLEMENTATION\n#endif\n#ifdef ENABLE_SSE_IMPLEMENTATION\n#  undef ENABLE_SSE_IMPLEMENTATION\n#endif\n#ifdef ENABLE_AVX_IMPLEMENTATION\n#  undef ENABLE_AVX_IMPLEMENTATION\n#endif\n\n#ifdef USE_SCALAR_IMPLEMENTATION\n#define ENABLE_SCALAR_IMPLEMENTATION(X) X\n#else\n#define ENABLE_SCALAR_IMPLEMENTATION(X)\n#endif\n\n#ifdef USE_SSE_IMPLEMENTATION\n#define ENABLE_SSE_IMPLEMENTATION(X) X\n#else\n#define ENABLE_SSE_IMPLEMENTATION(X)\n#endif\n\n#ifdef USE_AVX_IMPLEMENTATION\n#include <immintrin.h>\n#define ENABLE_AVX_IMPLEMENTATION(X) X\n#else\n// Stefan: removed include. Why does it import MMX instructions, shouldn't this be under the #ifdef USE_SSE_IMPLEMENTATION above?\n//#include <xmmintrin.h>\n#define ENABLE_AVX_IMPLEMENTATION(X)\n#endif\n\n#ifdef USE_SCALAR_IMPLEMENTATION\n// Alec: Why is this using sse intrinsics if it's supposed to be the scalar\n// implementation?\n#ifdef __SSE__\n#include <mmintrin.h>\n// Changed to inline\ninline float rsqrt(const float f)\n{\n    float buf[4];\n    buf[0]=f;\n    __m128 v=_mm_loadu_ps(buf);\n    v=_mm_rsqrt_ss(v);\n    _mm_storeu_ps(buf,v);\n    return buf[0];\n}\n#else\n#include <cmath>\ninline float rsqrt(const float f)\n{\n  return 1./sqrtf(f);\n}\n#endif\n#endif\n\n\n"
  },
  {
    "path": "libs/libigl/include/igl/SolverStatus.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_SOLVER_STATUS_H\n#define IGL_SOLVER_STATUS_H\nnamespace igl\n{\n  enum SolverStatus\n  {\n    // Good\n    SOLVER_STATUS_CONVERGED = 0,\n    // OK\n    SOLVER_STATUS_MAX_ITER = 1,\n    // Bad\n    SOLVER_STATUS_ERROR = 2,\n    NUM_SOLVER_STATUSES = 3,\n  };\n};\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/SortableRow.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_SORTABLE_ROW_H\n#define IGL_SORTABLE_ROW_H\n\n// Simple class to contain a rowvector which allows rowwise sorting and\n// reordering\n#include <Eigen/Core>\n\nnamespace igl\n{\n  // Templates:\n  //   T  should be a matrix that implments .size(), and operator(int i)\n  template <typename T>\n  class SortableRow\n  {\n    public:\n      T data;\n    public:\n      SortableRow():data(){};\n      SortableRow(const T & data):data(data){};\n      bool operator<(const SortableRow & that) const\n      {\n        // Get reference so that I can use parenthesis\n        const SortableRow<T> & THIS = *this;\n        // Lexicographical\n        int minc = (THIS.data.size() < that.data.size()? \n            THIS.data.size() : that.data.size());\n        // loop over columns\n        for(int i = 0;i<minc;i++)\n        {\n          if(THIS.data(i) == that.data(i))\n          {\n            continue;\n          }\n          return THIS.data(i) < that.data(i);\n        }\n        // All characters the same, comes done to length\n        return THIS.data.size()<that.data.size();\n      };\n      bool operator==(const SortableRow & that) const\n      {\n        // Get reference so that I can use parenthesis\n        const SortableRow<T> & THIS = *this;\n        if(THIS.data.size() != that.data.size())\n        {\n          return false;\n        }\n        for(int i = 0;i<THIS.data.size();i++)\n        {\n          if(THIS.data(i) != that.data(i))\n          {\n            return false;\n          }\n        }\n        return true;\n      };\n      bool operator!=(const SortableRow & that) const\n      {\n        return !(*this == that);\n      };\n  };\n}\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/Timer.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n// High Resolution Timer.\n//\n// Resolution on Mac (clock tick)\n// Resolution on Linux (1 us not tested)\n// Resolution on Windows (clock tick not tested)\n\n#ifndef IGL_TIMER_H\n#define IGL_TIMER_H\n\n#ifdef WIN32   // Windows system specific\n#include <windows.h>\n#elif __APPLE__ // Unix based system specific\n#include <mach/mach_time.h> // for mach_absolute_time\n#else\n#include <sys/time.h>\n#endif\n#include <cstddef>\n\nnamespace igl\n{\n  class Timer\n  {\n  public:\n    // default constructor\n    Timer():\n      stopped(0),\n#ifdef WIN32\n      frequency(),\n      startCount(),\n      endCount()\n#elif __APPLE__\n      startCount(0),\n      endCount(0)\n#else\n      startCount(),\n      endCount()\n#endif\n    {\n#ifdef WIN32\n      QueryPerformanceFrequency(&frequency);\n      startCount.QuadPart = 0;\n      endCount.QuadPart = 0;\n#elif __APPLE__\n      startCount = 0;\n      endCount = 0;\n#else\n      startCount.tv_sec = startCount.tv_usec = 0;\n      endCount.tv_sec = endCount.tv_usec = 0;\n#endif\n\n      stopped = 0;\n    }\n    // default destructor\n    ~Timer()                     \n    {\n\n    }\n\n#ifdef __APPLE__\n    //Raw mach_absolute_times going in, difference in seconds out\n    double subtractTimes( uint64_t endTime, uint64_t startTime )\n    {\n      uint64_t difference = endTime - startTime;\n      static double conversion = 0.0;\n\n      if( conversion == 0.0 )\n      {\n        mach_timebase_info_data_t info;\n        kern_return_t err = mach_timebase_info( &info );\n\n        //Convert the timebase into seconds\n        if( err == 0  )\n          conversion = 1e-9 * (double) info.numer / (double) info.denom;\n      }\n\n      return conversion * (double) difference;\n    }\n#endif\n\n    // start timer\n    void   start()               \n    {\n      stopped = 0; // reset stop flag\n#ifdef WIN32\n      QueryPerformanceCounter(&startCount);\n#elif __APPLE__\n      startCount = mach_absolute_time();\n#else\n      gettimeofday(&startCount, NULL);\n#endif\n\n    }\n\n    // stop the timer\n    void   stop()                \n    {\n      stopped = 1; // set timer stopped flag\n\n#ifdef WIN32\n      QueryPerformanceCounter(&endCount);\n#elif __APPLE__\n      endCount = mach_absolute_time();\n#else\n      gettimeofday(&endCount, NULL);\n#endif\n\n    }\n    // get elapsed time in second\n    double getElapsedTime()      \n    {\n      return this->getElapsedTimeInSec();\n    }\n    // get elapsed time in second (same as getElapsedTime)\n    double getElapsedTimeInSec() \n    {\n      return this->getElapsedTimeInMicroSec() * 0.000001;\n    }\n\n    // get elapsed time in milli-second\n    double getElapsedTimeInMilliSec()\n    {\n      return this->getElapsedTimeInMicroSec() * 0.001;\n    }\n    // get elapsed time in micro-second\n    double getElapsedTimeInMicroSec()          \n    {\n      double startTimeInMicroSec = 0;\n      double endTimeInMicroSec = 0;\n\n#ifdef WIN32\n      if(!stopped)\n        QueryPerformanceCounter(&endCount);\n\n      startTimeInMicroSec = \n        startCount.QuadPart * (1000000.0 / frequency.QuadPart);\n      endTimeInMicroSec = endCount.QuadPart * (1000000.0 / frequency.QuadPart);\n#elif __APPLE__\n      if (!stopped)\n        endCount = mach_absolute_time();\n\n      return subtractTimes(endCount,startCount)/1e-6;\n#else\n      if(!stopped)\n        gettimeofday(&endCount, NULL);\n\n      startTimeInMicroSec = \n        (startCount.tv_sec * 1000000.0) + startCount.tv_usec;\n      endTimeInMicroSec = (endCount.tv_sec * 1000000.0) + endCount.tv_usec;\n#endif\n\n      return endTimeInMicroSec - startTimeInMicroSec;\n    }\n\n  private:\n    // stop flag \n    int    stopped;               \n#ifdef WIN32\n    // ticks per second\n    LARGE_INTEGER frequency;      \n    LARGE_INTEGER startCount;     \n    LARGE_INTEGER endCount;       \n#elif __APPLE__\n    uint64_t startCount;           \n    uint64_t endCount;             \n#else\n    timeval startCount;           \n    timeval endCount;             \n#endif\n  };\n}\n#endif // TIMER_H_DEF\n\n"
  },
  {
    "path": "libs/libigl/include/igl/Viewport.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_VIEWPORT_H\n#define IGL_VIEWPORT_H\n\nnamespace igl\n{\n  // Simple Viewport class for an opengl context. Handles reshaping and mouse.\n  struct Viewport\n  {\n    int x,y,width,height;\n    // Constructors\n    Viewport(\n      const int x=0, \n      const int y=0, \n      const int width=0,\n      const int height=0):\n      x(x),\n      y(y),\n      width(width),\n      height(height)\n    {\n    };\n    virtual ~Viewport(){}\n    void reshape(\n      const int x, \n      const int y, \n      const int width,\n      const int height)\n    {\n      this->x = x;\n      this->y = y;\n      this->width = width;\n      this->height = height;\n    };\n    // Given mouse_x,mouse_y on the entire window return mouse_x, mouse_y in\n    // this viewport.\n    //\n    // Inputs:\n    //   my  mouse y-coordinate\n    //   wh  window height\n    // Returns y-coordinate in viewport\n    int mouse_y(const int my,const int wh)\n    {\n      return my - (wh - height - y);\n    }\n    // Inputs:\n    //   mx  mouse x-coordinate\n    // Returns x-coordinate in viewport\n    int mouse_x(const int mx)\n    {\n      return mx - x;\n    }\n    // Returns whether point (mx,my) is in extend of Viewport\n    bool inside(const int mx, const int my) const\n    {\n      return \n        mx >= x && my >= y && \n        mx < x+width && my < y+height;\n    }\n  };\n}\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/WindingNumberAABB.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n\n// # MUTUAL DEPENDENCY ISSUE FOR HEADER ONLY VERSION\n// MUST INCLUDE winding_number.h first before guard:\n#include \"winding_number.h\"\n\n#ifndef IGL_WINDINGNUMBERAABB_H\n#define IGL_WINDINGNUMBERAABB_H\n#include \"WindingNumberTree.h\"\n\nnamespace igl\n{\n  template <typename Point>\n  class WindingNumberAABB : public WindingNumberTree<Point>\n  {\n    protected:\n      Point min_corner;\n      Point max_corner;\n      double total_positive_area;\n    public: \n      enum SplitMethod\n      {\n        CENTER_ON_LONGEST_AXIS = 0,\n        MEDIAN_ON_LONGEST_AXIS = 1,\n        NUM_SPLIT_METHODS = 2\n      } split_method;\n    public:\n      inline WindingNumberAABB():\n        total_positive_area(std::numeric_limits<double>::infinity()),\n        split_method(MEDIAN_ON_LONGEST_AXIS)\n      {}\n      inline WindingNumberAABB(\n        const Eigen::MatrixXd & V,\n        const Eigen::MatrixXi & F);\n      inline WindingNumberAABB(\n        const WindingNumberTree<Point> & parent,\n        const Eigen::MatrixXi & F);\n      // Initialize some things\n      inline void set_mesh(\n        const Eigen::MatrixXd & V,\n        const Eigen::MatrixXi & F);\n      inline void init();\n      inline bool inside(const Point & p) const;\n      inline virtual void grow();\n      // Compute min and max corners\n      inline void compute_min_max_corners();\n      inline double max_abs_winding_number(const Point & p) const;\n      inline double max_simple_abs_winding_number(const Point & p) const;\n  };\n}\n\n// Implementation\n\n#include \"winding_number.h\"\n\n#include \"barycenter.h\"\n#include \"median.h\"\n#include \"doublearea.h\"\n#include \"per_face_normals.h\"\n\n#include <limits>\n#include <vector>\n#include <iostream>\n\n// Minimum number of faces in a hierarchy element (this is probably dependent\n// on speed of machine and compiler optimization)\n#ifndef WindingNumberAABB_MIN_F\n#  define WindingNumberAABB_MIN_F 100\n#endif\n\ntemplate <typename Point>\ninline void igl::WindingNumberAABB<Point>::set_mesh(\n    const Eigen::MatrixXd & V,\n    const Eigen::MatrixXi & F)\n{\n  igl::WindingNumberTree<Point>::set_mesh(V,F);\n  init();\n}\n\ntemplate <typename Point>\ninline void igl::WindingNumberAABB<Point>::init()\n{\n  using namespace Eigen;\n  assert(max_corner.size() == 3);\n  assert(min_corner.size() == 3);\n  compute_min_max_corners();\n  VectorXd dblA;\n  doublearea(this->getV(),this->getF(),dblA);\n  total_positive_area = dblA.sum()/2.0;\n}\n\ntemplate <typename Point>\ninline igl::WindingNumberAABB<Point>::WindingNumberAABB(\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F):\n  WindingNumberTree<Point>(V,F),\n  min_corner(),\n  max_corner(),\n  total_positive_area(std::numeric_limits<double>::infinity()),\n  split_method(MEDIAN_ON_LONGEST_AXIS)\n{\n  init();\n}\n\ntemplate <typename Point>\ninline igl::WindingNumberAABB<Point>::WindingNumberAABB(\n  const WindingNumberTree<Point> & parent,\n  const Eigen::MatrixXi & F):\n  WindingNumberTree<Point>(parent,F),\n  min_corner(),\n  max_corner(),\n  total_positive_area(std::numeric_limits<double>::infinity()),\n  split_method(MEDIAN_ON_LONGEST_AXIS)\n{\n  init();\n}\n\ntemplate <typename Point>\ninline void igl::WindingNumberAABB<Point>::grow()\n{\n  using namespace std;\n  using namespace Eigen;\n  // Clear anything that already exists\n  this->delete_children();\n\n  //cout<<\"cap.rows(): \"<<this->getcap().rows()<<endl;\n  //cout<<\"F.rows(): \"<<this->getF().rows()<<endl;\n\n  // Base cases\n  if(\n    this->getF().rows() <= (WindingNumberAABB_MIN_F>0?WindingNumberAABB_MIN_F:0) ||\n    (this->getcap().rows() - 2) >= this->getF().rows())\n  {\n    // Don't grow\n    return;\n  }\n\n  // Compute longest direction\n  int max_d = -1;\n  double max_len = -numeric_limits<double>::infinity();\n  for(int d = 0;d<min_corner.size();d++)\n  {\n    if( (max_corner[d] - min_corner[d]) > max_len )\n    {\n      max_len = (max_corner[d] - min_corner[d]);\n      max_d = d;\n    }\n  }\n  // Compute facet barycenters\n  MatrixXd BC;\n  barycenter(this->getV(),this->getF(),BC);\n\n\n  // Blerg, why is selecting rows so difficult\n\n  double split_value;\n  // Split in longest direction\n  switch(split_method)\n  {\n    case MEDIAN_ON_LONGEST_AXIS:\n      // Determine median\n      median(BC.col(max_d),split_value);\n      break;\n    default:\n      assert(false);\n    case CENTER_ON_LONGEST_AXIS:\n      split_value = 0.5*(max_corner[max_d] + min_corner[max_d]);\n      break;\n  }\n  //cout<<\"c: \"<<0.5*(max_corner[max_d] + min_corner[max_d])<<\" \"<<\n  //  \"m: \"<<split_value<<endl;;\n\n  vector<int> id( this->getF().rows());\n  for(int i = 0;i<this->getF().rows();i++)\n  {\n    if(BC(i,max_d) <= split_value)\n    {\n      id[i] = 0; //left\n    }else\n    {\n      id[i] = 1; //right\n    }\n  }\n\n  const int lefts = (int) count(id.begin(),id.end(),0);\n  const int rights = (int) count(id.begin(),id.end(),1);\n  if(lefts == 0 || rights == 0)\n  {\n    // badly balanced base case (could try to recut)\n    return;\n  }\n  assert(lefts+rights == this->getF().rows());\n  MatrixXi leftF(lefts,  this->getF().cols());\n  MatrixXi rightF(rights,this->getF().cols());\n  int left_i = 0;\n  int right_i = 0;\n  for(int i = 0;i<this->getF().rows();i++)\n  {\n    if(id[i] == 0)\n    {\n      leftF.row(left_i++) = this->getF().row(i);\n    }else if(id[i] == 1)\n    {\n      rightF.row(right_i++) = this->getF().row(i);\n    }else\n    {\n      assert(false);\n    }\n  }\n  assert(right_i == rightF.rows());\n  assert(left_i == leftF.rows());\n  // Finally actually grow children and Recursively grow\n  WindingNumberAABB<Point> * leftWindingNumberAABB = new WindingNumberAABB<Point>(*this,leftF);\n  leftWindingNumberAABB->grow();\n  this->children.push_back(leftWindingNumberAABB);\n  WindingNumberAABB<Point> * rightWindingNumberAABB = new WindingNumberAABB<Point>(*this,rightF);\n  rightWindingNumberAABB->grow();\n  this->children.push_back(rightWindingNumberAABB);\n}\n\ntemplate <typename Point>\ninline bool igl::WindingNumberAABB<Point>::inside(const Point & p) const\n{\n  assert(p.size() == max_corner.size());\n  assert(p.size() == min_corner.size());\n  for(int i = 0;i<p.size();i++)\n  {\n    //// Perfect matching is **not** robust\n    //if( p(i) < min_corner(i) || p(i) >= max_corner(i))\n    // **MUST** be conservative\n    if( p(i) < min_corner(i) || p(i) > max_corner(i))\n    {\n      return false;\n    }\n  }\n  return true;\n}\n\ntemplate <typename Point>\ninline void igl::WindingNumberAABB<Point>::compute_min_max_corners()\n{\n  using namespace std;\n  // initialize corners\n  for(int d = 0;d<min_corner.size();d++)\n  {\n    min_corner[d] =  numeric_limits<double>::infinity();\n    max_corner[d] = -numeric_limits<double>::infinity();\n  }\n\n  this->center = Point(0,0,0);\n  // Loop over facets\n  for(int i = 0;i<this->getF().rows();i++)\n  {\n    for(int j = 0;j<this->getF().cols();j++)\n    {\n      for(int d = 0;d<min_corner.size();d++)\n      {\n        min_corner[d] = \n          this->getV()(this->getF()(i,j),d) < min_corner[d] ?  \n            this->getV()(this->getF()(i,j),d) : min_corner[d];\n        max_corner[d] = \n          this->getV()(this->getF()(i,j),d) > max_corner[d] ?  \n            this->getV()(this->getF()(i,j),d) : max_corner[d];\n      }\n      // This is biased toward vertices incident on more than one face, but\n      // perhaps that's good\n      this->center += this->getV().row(this->getF()(i,j));\n    }\n  }\n  // Average\n  this->center.array() /= this->getF().size();\n\n  //cout<<\"min_corner: \"<<this->min_corner.transpose()<<endl;\n  //cout<<\"Center: \"<<this->center.transpose()<<endl;\n  //cout<<\"max_corner: \"<<this->max_corner.transpose()<<endl;\n  //cout<<\"Diag center: \"<<((this->max_corner + this->min_corner)*0.5).transpose()<<endl;\n  //cout<<endl;\n\n  this->radius = (max_corner-min_corner).norm()/2.0;\n}\n\ntemplate <typename Point>\ninline double igl::WindingNumberAABB<Point>::max_abs_winding_number(const Point & p) const\n{\n  using namespace std;\n  // Only valid if not inside\n  if(inside(p))\n  {\n    return numeric_limits<double>::infinity();\n  }\n  // Q: we know the total positive area so what's the most this could project\n  // to? Remember it could be layered in the same direction.\n  return numeric_limits<double>::infinity();\n}\n\ntemplate <typename Point>\ninline double igl::WindingNumberAABB<Point>::max_simple_abs_winding_number(const Point & p) const\n{\n  using namespace std;\n  using namespace Eigen;\n  // Only valid if not inside\n  if(inside(p))\n  {\n    return numeric_limits<double>::infinity();\n  }\n  // Max simple is the same as sum of positive winding number contributions of\n  // bounding box\n\n  // begin precomputation\n  //MatrixXd BV((int)pow(2,3),3);\n  MatrixXd BV((int)(1<<3),3);\n  BV <<\n    min_corner[0],min_corner[1],min_corner[2],\n    min_corner[0],min_corner[1],max_corner[2],\n    min_corner[0],max_corner[1],min_corner[2],\n    min_corner[0],max_corner[1],max_corner[2],\n    max_corner[0],min_corner[1],min_corner[2],\n    max_corner[0],min_corner[1],max_corner[2],\n    max_corner[0],max_corner[1],min_corner[2],\n    max_corner[0],max_corner[1],max_corner[2];\n  MatrixXi BF(2*2*3,3);\n  BF <<\n    0,6,4,\n    0,2,6,\n    0,3,2,\n    0,1,3,\n    2,7,6,\n    2,3,7,\n    4,6,7,\n    4,7,5,\n    0,4,5,\n    0,5,1,\n    1,5,7,\n    1,7,3;\n  MatrixXd BFN;\n  per_face_normals(BV,BF,BFN);\n  // end of precomputation\n\n  // Only keep those with positive dot products\n  MatrixXi PBF(BF.rows(),BF.cols());\n  int pbfi = 0;\n  Point p2c = 0.5*(min_corner+max_corner)-p;\n  for(int i = 0;i<BFN.rows();i++)\n  {\n    if(p2c.dot(BFN.row(i)) > 0)\n    {\n      PBF.row(pbfi++) = BF.row(i);\n    }\n  }\n  PBF.conservativeResize(pbfi,PBF.cols());\n  double w = numeric_limits<double>::infinity();\n  igl::winding_number_3(\n    BV.data(),\n    BV.rows(),\n    PBF.data(),\n    PBF.rows(),\n    p.data(),\n    1,\n    &w);\n  return w;\n}\n\n//// Explicit instanciation\n//template class igl::WindingNumberAABB<Eigen::Vector3d >;\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/WindingNumberMethod.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_WINDINGNUMBERMETHOD_H\n#define IGL_WINDINGNUMBERMETHOD_H\nnamespace igl\n{\n  // EXACT_WINDING_NUMBER_METHOD  exact hierarchical evaluation\n  // APPROX_SIMPLE_WINDING_NUMBER_METHOD  poor approximation\n  // APPROX_CACHE_WINDING_NUMBER_METHOD  another poor approximation\n  enum WindingNumberMethod\n  {\n    EXACT_WINDING_NUMBER_METHOD = 0,\n    APPROX_SIMPLE_WINDING_NUMBER_METHOD = 1,\n    APPROX_CACHE_WINDING_NUMBER_METHOD = 2,\n    NUM_WINDING_NUMBER_METHODS = 3\n  };\n}\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/WindingNumberTree.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_WINDINGNUMBERTREE_H\n#define IGL_WINDINGNUMBERTREE_H\n#include <list>\n#include <map>\n#include <Eigen/Dense>\n#include \"WindingNumberMethod.h\"\n\nnamespace igl\n{\n  // This is only need to fill in references, it should never actually be touched\n  // and shouldn't cause race conditions. (This is a hack, but I think it's \"safe\")\n  static Eigen::MatrixXd dummyV;\n  // Space partitioning tree for computing winding number hierarchically.\n  //\n  // Templates:\n  //   Point  type for points in space, e.g. Eigen::Vector3d\n  template <typename Point>\n  class WindingNumberTree\n  {\n    public:\n      // Method to use (see enum above)\n      //static double min_max_w;\n      static std::map< \n        std::pair<const WindingNumberTree*,const WindingNumberTree*>, double>\n          cached;\n    protected:\n      WindingNumberMethod method;\n      const WindingNumberTree * parent;\n      std::list<WindingNumberTree * > children;\n      //// List of boundary edges (recall edges are vertices in 2d)\n      //const Eigen::MatrixXi boundary;\n      // Base mesh vertices\n      Eigen::MatrixXd & V;\n      // Base mesh vertices with duplicates removed\n      Eigen::MatrixXd SV;\n      // Facets in this bounding volume\n      Eigen::MatrixXi F;\n      // Tesselated boundary curve\n      Eigen::MatrixXi cap;\n      // Upper Bound on radius of enclosing ball\n      double radius;\n      // (Approximate) center (of mass)\n      Point center;\n    public:\n      inline WindingNumberTree();\n      // For root\n      inline WindingNumberTree(\n        const Eigen::MatrixXd & V,\n        const Eigen::MatrixXi & F);\n      // For chilluns \n      inline WindingNumberTree(\n        const WindingNumberTree<Point> & parent,\n        const Eigen::MatrixXi & F);\n      inline virtual ~WindingNumberTree();\n      inline void delete_children();\n      inline virtual void set_mesh(\n        const Eigen::MatrixXd & V,\n        const Eigen::MatrixXi & F);\n      // Set method\n      inline void set_method( const WindingNumberMethod & m);\n    public:\n      inline const Eigen::MatrixXd & getV() const;\n      inline const Eigen::MatrixXi & getF() const;\n      inline const Eigen::MatrixXi & getcap() const;\n      // Grow the Tree recursively\n      inline virtual void grow();\n      // Determine whether a given point is inside the bounding \n      //\n      // Inputs:\n      //   p  query point \n      // Returns true if the point p is inside this bounding volume\n      inline virtual bool inside(const Point & p) const;\n      // Compute the (partial) winding number of a given point p\n      // According to method\n      //  \n      // Inputs:\n      //   p  query point \n      // Returns winding number \n      inline double winding_number(const Point & p) const;\n      // Same as above, but always computes winding number using exact method\n      // (sum over every facet)\n      inline double winding_number_all(const Point & p) const;\n      // Same as above, but always computes using sum over tesslated boundary\n      inline double winding_number_boundary(const Point & p) const;\n      //// Same as winding_number above, but if max_simple_abs_winding_number is\n      //// less than some threshold min_max_w just return 0 (colloquially the \"fast\n      //// multipole method)\n      ////\n      ////\n      //// Inputs:\n      ////   p  query point \n      ////   min_max_w  minimum max simple w to be processed\n      //// Returns approximate winding number\n      //double winding_number_approx_simple(\n      //  const Point & p, \n      //  const double min_max_w);\n      // Print contents of Tree\n      //\n      // Optional input:\n      //   tab  tab to show depth\n      inline void print(const char * tab=\"\");\n      // Determine max absolute winding number\n      //\n      // Inputs:\n      //   p  query point \n      // Returns max winding number of \n      inline virtual double max_abs_winding_number(const Point & p) const; \n      // Same as above, but stronger assumptions on (V,F). Assumes (V,F) is a\n      // simple polyhedron\n      inline virtual double max_simple_abs_winding_number(const Point & p) const;\n      // Compute or read cached winding number for point p with respect to mesh\n      // in bounding box, recursing according to approximation criteria\n      //\n      // Inputs:\n      //   p  query point \n      //   that  WindingNumberTree containing mesh w.r.t. which we're computing w.n.\n      // Returns cached winding number\n      inline virtual double cached_winding_number(const WindingNumberTree & that, const Point & p) const;\n  };\n}\n\n// Implementation\n\n#include \"WindingNumberTree.h\"\n#include \"winding_number.h\"\n#include \"triangle_fan.h\"\n#include \"exterior_edges.h\"\n\n#include <igl/PI.h>\n#include <igl/remove_duplicate_vertices.h>\n\n#include <iostream>\n#include <limits>\n\n//template <typename Point>\n//WindingNumberMethod WindingNumberTree<Point>::method = EXACT_WINDING_NUMBER_METHOD;\n//template <typename Point>\n//double WindingNumberTree<Point>::min_max_w = 0;\ntemplate <typename Point>\nstd::map< std::pair<const igl::WindingNumberTree<Point>*,const igl::WindingNumberTree<Point>*>, double>\n  igl::WindingNumberTree<Point>::cached;\n\ntemplate <typename Point>\ninline igl::WindingNumberTree<Point>::WindingNumberTree():\n  method(EXACT_WINDING_NUMBER_METHOD),\n  parent(NULL),\n  V(igl::dummyV),\n  SV(),\n  F(),\n  //boundary(igl::boundary_facets<Eigen::MatrixXi,Eigen::MatrixXi>(F))\n  cap(),\n  radius(std::numeric_limits<double>::infinity()),\n  center(0,0,0)\n{\n}\n\ntemplate <typename Point>\ninline igl::WindingNumberTree<Point>::WindingNumberTree(\n  const Eigen::MatrixXd & _V,\n  const Eigen::MatrixXi & _F):\n  method(EXACT_WINDING_NUMBER_METHOD),\n  parent(NULL),\n  V(igl::dummyV),\n  SV(),\n  F(),\n  //boundary(igl::boundary_facets<Eigen::MatrixXi,Eigen::MatrixXi>(F))\n  cap(),\n  radius(std::numeric_limits<double>::infinity()),\n  center(0,0,0)\n{\n  set_mesh(_V,_F);\n}\n\ntemplate <typename Point>\ninline void igl::WindingNumberTree<Point>::set_mesh(\n    const Eigen::MatrixXd & _V,\n    const Eigen::MatrixXi & _F)\n{\n  using namespace std;\n  // Remove any exactly duplicate vertices\n  // Q: Can this ever increase the complexity of the boundary?\n  // Q: Would we gain even more by remove almost exactly duplicate vertices?\n  Eigen::MatrixXi SF,SVI,SVJ;\n  igl::remove_duplicate_vertices(_V,_F,0.0,SV,SVI,SVJ,F);\n  triangle_fan(igl::exterior_edges(F),cap);\n  V = SV;\n}\n\ntemplate <typename Point>\ninline igl::WindingNumberTree<Point>::WindingNumberTree(\n  const igl::WindingNumberTree<Point> & parent,\n  const Eigen::MatrixXi & _F):\n  method(parent.method),\n  parent(&parent),\n  V(parent.V),\n  SV(),\n  F(_F),\n  cap(triangle_fan(igl::exterior_edges(_F)))\n{\n}\n\ntemplate <typename Point>\ninline igl::WindingNumberTree<Point>::~WindingNumberTree()\n{\n  delete_children();\n}\n\ntemplate <typename Point>\ninline void igl::WindingNumberTree<Point>::delete_children()\n{\n  using namespace std;\n  // Delete children\n  typename list<WindingNumberTree<Point>* >::iterator cit = children.begin();\n  while(cit != children.end())\n  {\n    // clear the memory of this item\n    delete (* cit);\n    // erase from list, returns next element in iterator\n    cit = children.erase(cit);\n  }\n}\n      \ntemplate <typename Point>\ninline void igl::WindingNumberTree<Point>::set_method(const WindingNumberMethod & m)\n{\n  this->method = m;\n  for(auto child : children)\n  {\n    child->set_method(m);\n  }\n}\n\ntemplate <typename Point>\ninline const Eigen::MatrixXd & igl::WindingNumberTree<Point>::getV() const\n{\n  return V;\n}\n\ntemplate <typename Point>\ninline const Eigen::MatrixXi & igl::WindingNumberTree<Point>::getF() const\n{\n  return F;\n}\n\ntemplate <typename Point>\ninline const Eigen::MatrixXi & igl::WindingNumberTree<Point>::getcap() const\n{\n  return cap;\n}\n\ntemplate <typename Point>\ninline void igl::WindingNumberTree<Point>::grow()\n{\n  // Don't grow\n  return;\n}\n\ntemplate <typename Point>\ninline bool igl::WindingNumberTree<Point>::inside(const Point & /*p*/) const\n{\n  return true;\n}\n\ntemplate <typename Point>\ninline double igl::WindingNumberTree<Point>::winding_number(const Point & p) const\n{\n  using namespace std;\n  //cout<<\"+\"<<boundary.rows();\n  // If inside then we need to be careful\n  if(inside(p))\n  {\n    // If not a leaf then recurse\n    if(children.size()>0)\n    {\n      // Recurse on each child and accumulate\n      double sum = 0;\n      for(\n        typename list<WindingNumberTree<Point>* >::const_iterator cit = children.begin();\n        cit != children.end();\n        cit++)\n      {\n        switch(method)\n        {\n          case EXACT_WINDING_NUMBER_METHOD:\n            sum += (*cit)->winding_number(p);\n            break;\n          case APPROX_SIMPLE_WINDING_NUMBER_METHOD:\n          case APPROX_CACHE_WINDING_NUMBER_METHOD:\n            //if((*cit)->max_simple_abs_winding_number(p) > min_max_w)\n            //{\n              sum += (*cit)->winding_number(p);\n            //}\n            break;\n          default:\n            assert(false);\n            break;\n        }\n      }\n      return sum;\n    }else\n    {\n      return winding_number_all(p);\n    }\n  }else{\n    // Otherwise we can just consider boundary\n    // Q: If we using the \"multipole\" method should we also subdivide the\n    // boundary case?\n    if((cap.rows() - 2) < F.rows())\n    {\n      switch(method)\n      {\n        case EXACT_WINDING_NUMBER_METHOD:\n          return winding_number_boundary(p);\n        case APPROX_SIMPLE_WINDING_NUMBER_METHOD:\n        {\n          double dist = (p-center).norm();\n          // Radius is already an overestimate of inside\n          if(dist>1.0*radius)\n          {\n            return 0;\n          }else\n          {\n            return winding_number_boundary(p);\n          }\n        }\n        case APPROX_CACHE_WINDING_NUMBER_METHOD:\n        {\n          return parent->cached_winding_number(*this,p);\n        }\n        default: assert(false);break;\n      }\n    }else\n    {\n      // doesn't pay off to use boundary\n      return winding_number_all(p);\n    }\n  }\n  return 0;\n}\n\ntemplate <typename Point>\ninline double igl::WindingNumberTree<Point>::winding_number_all(const Point & p) const\n{\n  double w = 0;\n  igl::winding_number_3(\n    V.data(),\n    V.rows(),\n    F.data(),\n    F.rows(),\n    p.data(),\n    1,\n    &w);\n  return w;\n}\n\ntemplate <typename Point>\ninline double igl::WindingNumberTree<Point>::winding_number_boundary(const Point & p) const\n{\n  using namespace Eigen;\n  using namespace std;\n\n  double w = 0;\n  // `cap` is already flipped inside out, so we don't need to flip sign of w\n  igl::winding_number_3(\n    V.data(),\n    V.rows(),\n    cap.data(),\n    cap.rows(),\n    &p[0],\n    1,\n    &w);\n  return w;\n}\n\n//template <typename Point>\n//inline double igl::WindingNumberTree<Point>::winding_number_approx_simple(\n//  const Point & p, \n//  const double min_max_w)\n//{\n//  using namespace std;\n//  if(max_simple_abs_winding_number(p) > min_max_w)\n//  {\n//    return winding_number(p);\n//  }else\n//  {\n//    cout<<\"Skipped! \"<<max_simple_abs_winding_number(p)<<\"<\"<<min_max_w<<endl;\n//    return 0;\n//  }\n//}\n\ntemplate <typename Point>\ninline void igl::WindingNumberTree<Point>::print(const char * tab)\n{\n  using namespace std;\n  // Print all facets\n  cout<<tab<<\"[\"<<endl<<F<<endl<<\"]\";\n  // Print children\n  for(\n      typename list<WindingNumberTree<Point>* >::iterator cit = children.begin();\n      cit != children.end();\n      cit++)\n  {\n    cout<<\",\"<<endl;\n    (*cit)->print((string(tab)+\"\").c_str());\n  }\n}\n\ntemplate <typename Point>\ninline double \nigl::WindingNumberTree<Point>::max_abs_winding_number(const Point & /*p*/) const\n{\n  return std::numeric_limits<double>::infinity();\n}\n\ntemplate <typename Point>\ninline double \nigl::WindingNumberTree<Point>::max_simple_abs_winding_number(\n  const Point & /*p*/) const\n{\n  using namespace std;\n  return numeric_limits<double>::infinity();\n}\n\ntemplate <typename Point>\ninline double igl::WindingNumberTree<Point>::cached_winding_number(\n  const igl::WindingNumberTree<Point> & that,\n  const Point & p) const\n{\n  using namespace std;\n  // Simple metric for `is_far`\n  //\n  //   this             that\n  //                   --------\n  //   -----          /   |    \\ .\n  //  /  r  \\        /    R     \\ .\n  // | p !   |      |     !      |\n  //  \\_____/        \\          /\n  //                  \\________/\n  //\n  // \n  // a = angle formed by trapazoid formed by raising sides with lengths r and R\n  // at respective centers.\n  //\n  // a = atan2(R-r,d), where d is the distance between centers\n\n  // That should be bigger (what about parent? what about sister?)\n  bool is_far = this->radius<that.radius;\n  if(is_far)\n  {\n    double a = atan2(\n      that.radius - this->radius,\n      (that.center - this->center).norm());\n    assert(a>0);\n    is_far = (a<PI/8.0);\n  }\n\n  if(is_far)\n  {\n    // Not implemented yet\n    pair<const WindingNumberTree*,const WindingNumberTree*> this_that(this,&that);\n    // Need to compute it for first time?\n    if(cached.count(this_that)==0)\n    {\n      cached[this_that] = \n        that.winding_number_boundary(this->center);\n    }\n    return cached[this_that];\n  }else if(children.size() == 0)\n  {\n    // not far and hierarchy ended too soon: can't use cache\n    return that.winding_number_boundary(p);\n  }else\n  {\n    for(\n      typename list<WindingNumberTree<Point>* >::const_iterator cit = children.begin();\n      cit != children.end();\n      cit++)\n    {\n      if((*cit)->inside(p))\n      {\n        return (*cit)->cached_winding_number(that,p);\n      }\n    }\n    // Not inside any children? This can totally happen because bounding boxes\n    // are set to bound contained facets. So sibilings may overlap and their\n    // union may not contain their parent (though, their union is certainly a\n    // subset of their parent).\n    assert(false);\n  }\n  return 0;\n}\n\n// Explicit instanciation\n//template class igl::WindingNumberTree<Eigen::Vector3d >;\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/ZERO.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_ZERO_H\n#define IGL_ZERO_H\nnamespace igl\n{\n  // Often one needs a reference to a dummy variable containing zero as its\n  // value, for example when using AntTweakBar's\n  // TwSetParam( \"3D View\", \"opened\", TW_PARAM_INT32, 1, &INT_ZERO);\n  const char CHAR_ZERO = 0;\n  const int INT_ZERO = 0;\n  const unsigned int UNSIGNED_INT_ZERO = 0;\n  const double DOUBLE_ZERO = 0;\n  const float FLOAT_ZERO = 0;\n}\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/active_set.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"active_set.h\"\n#include \"min_quad_with_fixed.h\"\n#include \"slice.h\"\n#include \"slice_into.h\"\n#include \"cat.h\"\n//#include \"matlab_format.h\"\n\n#include <iostream>\n#include <limits>\n#include <algorithm>\n\ntemplate <\n  typename AT,\n  typename DerivedB,\n  typename Derivedknown,\n  typename DerivedY,\n  typename AeqT,\n  typename DerivedBeq,\n  typename AieqT,\n  typename DerivedBieq,\n  typename Derivedlx,\n  typename Derivedux,\n  typename DerivedZ\n  >\nIGL_INLINE igl::SolverStatus igl::active_set(\n  const Eigen::SparseMatrix<AT>& A,\n  const Eigen::PlainObjectBase<DerivedB> & B,\n  const Eigen::PlainObjectBase<Derivedknown> & known,\n  const Eigen::PlainObjectBase<DerivedY> & Y,\n  const Eigen::SparseMatrix<AeqT>& Aeq,\n  const Eigen::PlainObjectBase<DerivedBeq> & Beq,\n  const Eigen::SparseMatrix<AieqT>& Aieq,\n  const Eigen::PlainObjectBase<DerivedBieq> & Bieq,\n  const Eigen::PlainObjectBase<Derivedlx> & p_lx,\n  const Eigen::PlainObjectBase<Derivedux> & p_ux,\n  const igl::active_set_params & params,\n  Eigen::PlainObjectBase<DerivedZ> & Z\n  )\n{\n//#define ACTIVE_SET_CPP_DEBUG\n#if defined(ACTIVE_SET_CPP_DEBUG) && !defined(_MSC_VER)\n#  warning \"ACTIVE_SET_CPP_DEBUG\"\n#endif\n  using namespace Eigen;\n  using namespace std;\n  SolverStatus ret = SOLVER_STATUS_ERROR;\n  const int n = A.rows();\n  assert(n == A.cols() && \"A must be square\");\n  // Discard const qualifiers\n  //if(B.size() == 0)\n  //{\n  //  B = DerivedB::Zero(n,1);\n  //}\n  assert(n == B.rows() && \"B.rows() must match A.rows()\");\n  assert(B.cols() == 1 && \"B must be a column vector\");\n  assert(Y.cols() == 1 && \"Y must be a column vector\");\n  assert((Aeq.size() == 0 && Beq.size() == 0) || Aeq.cols() == n);\n  assert((Aeq.size() == 0 && Beq.size() == 0) || Aeq.rows() == Beq.rows());\n  assert((Aeq.size() == 0 && Beq.size() == 0) || Beq.cols() == 1);\n  assert((Aieq.size() == 0 && Bieq.size() == 0) || Aieq.cols() == n);\n  assert((Aieq.size() == 0 && Bieq.size() == 0) || Aieq.rows() == Bieq.rows());\n  assert((Aieq.size() == 0 && Bieq.size() == 0) || Bieq.cols() == 1);\n  Eigen::Matrix<typename Derivedlx::Scalar,Eigen::Dynamic,1> lx;\n  Eigen::Matrix<typename Derivedux::Scalar,Eigen::Dynamic,1> ux;\n  if(p_lx.size() == 0)\n  {\n    lx = Derivedlx::Constant(\n      n,1,-numeric_limits<typename Derivedlx::Scalar>::max());\n  }else\n  {\n    lx = p_lx;\n  }\n  if(p_ux.size() == 0)\n  {\n    ux = Derivedux::Constant(\n      n,1,numeric_limits<typename Derivedux::Scalar>::max());\n  }else\n  {\n    ux = p_ux;\n  }\n  assert(lx.rows() == n && \"lx must have n rows\");\n  assert(ux.rows() == n && \"ux must have n rows\");\n  assert(ux.cols() == 1 && \"lx must be a column vector\");\n  assert(lx.cols() == 1 && \"ux must be a column vector\");\n  assert((ux.array()-lx.array()).minCoeff() > 0 && \"ux(i) must be > lx(i)\");\n  if(Z.size() != 0)\n  {\n    // Initial guess should have correct size\n    assert(Z.rows() == n && \"Z must have n rows\");\n    assert(Z.cols() == 1 && \"Z must be a column vector\");\n  }\n  assert(known.cols() == 1 && \"known must be a column vector\");\n  // Number of knowns\n  const int nk = known.size();\n\n  // Initialize active sets\n  typedef int BOOL;\n#define TRUE 1\n#define FALSE 0\n  Matrix<BOOL,Dynamic,1> as_lx = Matrix<BOOL,Dynamic,1>::Constant(n,1,FALSE);\n  Matrix<BOOL,Dynamic,1> as_ux = Matrix<BOOL,Dynamic,1>::Constant(n,1,FALSE);\n  Matrix<BOOL,Dynamic,1> as_ieq = Matrix<BOOL,Dynamic,1>::Constant(Aieq.rows(),1,FALSE);\n\n  // Keep track of previous Z for comparison\n  DerivedZ old_Z;\n  old_Z = DerivedZ::Constant(\n      n,1,numeric_limits<typename DerivedZ::Scalar>::max());\n\n  int iter = 0;\n  while(true)\n  {\n#ifdef ACTIVE_SET_CPP_DEBUG\n    cout<<\"Iteration: \"<<iter<<\":\"<<endl;\n    cout<<\"  pre\"<<endl;\n#endif\n    // FIND BREACHES OF CONSTRAINTS\n    int new_as_lx = 0;\n    int new_as_ux = 0;\n    int new_as_ieq = 0;\n    if(Z.size() > 0)\n    {\n      for(int z = 0;z < n;z++)\n      {\n        if(Z(z) < lx(z))\n        {\n          new_as_lx += (as_lx(z)?0:1);\n          //new_as_lx++;\n          as_lx(z) = TRUE;\n        }\n        if(Z(z) > ux(z))\n        {\n          new_as_ux += (as_ux(z)?0:1);\n          //new_as_ux++;\n          as_ux(z) = TRUE;\n        }\n      }\n      if(Aieq.rows() > 0)\n      {\n        DerivedZ AieqZ;\n        AieqZ = Aieq*Z;\n        for(int a = 0;a<Aieq.rows();a++)\n        {\n          if(AieqZ(a) > Bieq(a))\n          {\n            new_as_ieq += (as_ieq(a)?0:1);\n            as_ieq(a) = TRUE;\n          }\n        }\n      }\n#ifdef ACTIVE_SET_CPP_DEBUG\n      cout<<\"  new_as_lx: \"<<new_as_lx<<endl;\n      cout<<\"  new_as_ux: \"<<new_as_ux<<endl;\n#endif\n      const double diff = (Z-old_Z).squaredNorm();\n#ifdef ACTIVE_SET_CPP_DEBUG\n      cout<<\"diff: \"<<diff<<endl;\n#endif\n      if(diff < params.solution_diff_threshold)\n      {\n        ret = SOLVER_STATUS_CONVERGED;\n        break;\n      }\n      old_Z = Z;\n    }\n\n    const int as_lx_count = count(as_lx.data(),as_lx.data()+n,TRUE);\n    const int as_ux_count = count(as_ux.data(),as_ux.data()+n,TRUE);\n    const int as_ieq_count =\n      count(as_ieq.data(),as_ieq.data()+as_ieq.size(),TRUE);\n#ifndef NDEBUG\n    {\n      int count = 0;\n      for(int a = 0;a<as_ieq.size();a++)\n      {\n        if(as_ieq(a))\n        {\n          assert(as_ieq(a) == TRUE);\n          count++;\n        }\n      }\n      assert(as_ieq_count == count);\n    }\n#endif\n\n    // PREPARE FIXED VALUES\n    Derivedknown known_i;\n    known_i.resize(nk + as_lx_count + as_ux_count,1);\n    DerivedY Y_i;\n    Y_i.resize(nk + as_lx_count + as_ux_count,1);\n    {\n      known_i.block(0,0,known.rows(),known.cols()) = known;\n      Y_i.block(0,0,Y.rows(),Y.cols()) = Y;\n      int k = nk;\n      // Then all lx\n      for(int z = 0;z < n;z++)\n      {\n        if(as_lx(z))\n        {\n          known_i(k) = z;\n          Y_i(k) = lx(z);\n          k++;\n        }\n      }\n      // Finally all ux\n      for(int z = 0;z < n;z++)\n      {\n        if(as_ux(z))\n        {\n          known_i(k) = z;\n          Y_i(k) = ux(z);\n          k++;\n        }\n      }\n      assert(k==Y_i.size());\n      assert(k==known_i.size());\n    }\n    //cout<<matlab_format((known_i.array()+1).eval(),\"known_i\")<<endl;\n    // PREPARE EQUALITY CONSTRAINTS\n    VectorXi as_ieq_list(as_ieq_count,1);\n    // Gather active constraints and resp. rhss\n    DerivedBeq Beq_i;\n    Beq_i.resize(Beq.rows()+as_ieq_count,1);\n    Beq_i.head(Beq.rows()) = Beq;\n    {\n      int k =0;\n      for(int a=0;a<as_ieq.size();a++)\n      {\n        if(as_ieq(a))\n        {\n          assert(k<as_ieq_list.size());\n          as_ieq_list(k)=a;\n          Beq_i(Beq.rows()+k,0) = Bieq(k,0);\n          k++;\n        }\n      }\n      assert(k == as_ieq_count);\n    }\n    // extract active constraint rows\n    SparseMatrix<AeqT> Aeq_i,Aieq_i;\n    slice(Aieq,as_ieq_list,1,Aieq_i);\n    // Append to equality constraints\n    cat(1,Aeq,Aieq_i,Aeq_i);\n\n\n    min_quad_with_fixed_data<AT> data;\n#ifndef NDEBUG\n    {\n      // NO DUPES!\n      Matrix<BOOL,Dynamic,1> fixed = Matrix<BOOL,Dynamic,1>::Constant(n,1,FALSE);\n      for(int k = 0;k<known_i.size();k++)\n      {\n        assert(!fixed[known_i(k)]);\n        fixed[known_i(k)] = TRUE;\n      }\n    }\n#endif\n\n    DerivedZ sol;\n    if(known_i.size() == A.rows())\n    {\n      // Everything's fixed?\n#ifdef ACTIVE_SET_CPP_DEBUG\n      cout<<\"  everything's fixed.\"<<endl;\n#endif\n      Z.resize(A.rows(),Y_i.cols());\n      slice_into(Y_i,known_i,1,Z);\n      sol.resize(0,Y_i.cols());\n      assert(Aeq_i.rows() == 0 && \"All fixed but linearly constrained\");\n    }else\n    {\n#ifdef ACTIVE_SET_CPP_DEBUG\n      cout<<\"  min_quad_with_fixed_precompute\"<<endl;\n#endif\n      if(!min_quad_with_fixed_precompute(A,known_i,Aeq_i,params.Auu_pd,data))\n      {\n        cerr<<\"Error: min_quad_with_fixed precomputation failed.\"<<endl;\n        if(iter > 0 && Aeq_i.rows() > Aeq.rows())\n        {\n          cerr<<\"  *Are you sure rows of [Aeq;Aieq] are linearly independent?*\"<<\n            endl;\n        }\n        ret = SOLVER_STATUS_ERROR;\n        break;\n      }\n#ifdef ACTIVE_SET_CPP_DEBUG\n      cout<<\"  min_quad_with_fixed_solve\"<<endl;\n#endif\n      if(!min_quad_with_fixed_solve(data,B,Y_i,Beq_i,Z,sol))\n      {\n        cerr<<\"Error: min_quad_with_fixed solve failed.\"<<endl;\n        ret = SOLVER_STATUS_ERROR;\n        break;\n      }\n      //cout<<matlab_format((Aeq*Z-Beq).eval(),\"cr\")<<endl;\n      //cout<<matlab_format(Z,\"Z\")<<endl;\n#ifdef ACTIVE_SET_CPP_DEBUG\n      cout<<\"  post\"<<endl;\n#endif\n      // Computing Lagrange multipliers needs to be adjusted slightly if A is not symmetric\n      assert(data.Auu_sym);\n    }\n\n    // Compute Lagrange multiplier values for known_i\n    SparseMatrix<AT> Ak;\n    // Slow\n    slice(A,known_i,1,Ak);\n    DerivedB Bk;\n    slice(B,known_i,Bk);\n    MatrixXd Lambda_known_i = -(0.5*Ak*Z + 0.5*Bk);\n    // reverse the lambda values for lx\n    Lambda_known_i.block(nk,0,as_lx_count,1) =\n      (-1*Lambda_known_i.block(nk,0,as_lx_count,1)).eval();\n\n    // Extract Lagrange multipliers for Aieq_i (always at back of sol)\n    VectorXd Lambda_Aieq_i(Aieq_i.rows(),1);\n    for(int l = 0;l<Aieq_i.rows();l++)\n    {\n      Lambda_Aieq_i(Aieq_i.rows()-1-l) = sol(sol.rows()-1-l);\n    }\n\n    // Remove from active set\n    for(int l = 0;l<as_lx_count;l++)\n    {\n      if(Lambda_known_i(nk + l) < params.inactive_threshold)\n      {\n        as_lx(known_i(nk + l)) = FALSE;\n      }\n    }\n    for(int u = 0;u<as_ux_count;u++)\n    {\n      if(Lambda_known_i(nk + as_lx_count + u) <\n        params.inactive_threshold)\n      {\n        as_ux(known_i(nk + as_lx_count + u)) = FALSE;\n      }\n    }\n    for(int a = 0;a<as_ieq_count;a++)\n    {\n      if(Lambda_Aieq_i(a) < params.inactive_threshold)\n      {\n        as_ieq(as_ieq_list(a)) = FALSE;\n      }\n    }\n\n    iter++;\n    //cout<<iter<<endl;\n    if(params.max_iter>0 && iter>=params.max_iter)\n    {\n      ret = SOLVER_STATUS_MAX_ITER;\n      break;\n    }\n\n  }\n\n  return ret;\n}\n\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate igl::SolverStatus igl::active_set<double, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, double, Eigen::Matrix<double, -1, 1, 0, -1, 1>, double, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::SparseMatrix<double, 0, int> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::SparseMatrix<double, 0, int> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::SparseMatrix<double, 0, int> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, igl::active_set_params const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\ntemplate igl::SolverStatus igl::active_set<double, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, double, Eigen::Matrix<double, -1, 1, 0, -1, 1>, double, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::SparseMatrix<double, 0, int> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::SparseMatrix<double, 0, int> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::SparseMatrix<double, 0, int> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, igl::active_set_params const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/active_set.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_ACTIVE_SET_H\n#define IGL_ACTIVE_SET_H\n\n#include \"igl_inline.h\"\n#include \"SolverStatus.h\"\n#include <Eigen/Core>\n#include <Eigen/Sparse>\n\nnamespace igl\n{\n  struct active_set_params;\n  // Known Bugs: rows of [Aeq;Aieq] **must** be linearly independent. Should be\n  // using QR decomposition otherwise:\n  //   http://www.okstate.edu/sas/v8/sashtml/ormp/chap5/sect32.htm\n  //\n  // ACTIVE_SET Minimize quadratic energy \n  //\n  // 0.5*Z'*A*Z + Z'*B + C with constraints\n  //\n  // that Z(known) = Y, optionally also subject to the constraints Aeq*Z = Beq,\n  // and further optionally subject to the linear inequality constraints that\n  // Aieq*Z <= Bieq and constant inequality constraints lx <= x <= ux\n  //\n  // Inputs:\n  //   A  n by n matrix of quadratic coefficients\n  //   B  n by 1 column of linear coefficients\n  //   known  list of indices to known rows in Z\n  //   Y  list of fixed values corresponding to known rows in Z\n  //   Aeq  meq by n list of linear equality constraint coefficients\n  //   Beq  meq by 1 list of linear equality constraint constant values\n  //   Aieq  mieq by n list of linear inequality constraint coefficients\n  //   Bieq  mieq by 1 list of linear inequality constraint constant values\n  //   lx  n by 1 list of lower bounds [] implies -Inf\n  //   ux  n by 1 list of upper bounds [] implies Inf\n  //   params  struct of additional parameters (see below)\n  //   Z  if not empty, is taken to be an n by 1 list of initial guess values\n  //     (see output)\n  // Outputs:\n  //   Z  n by 1 list of solution values\n  // Returns true on success, false on error\n  //\n  // Benchmark: For a harmonic solve on a mesh with 325K facets, matlab 2.2\n  // secs, igl/min_quad_with_fixed.h 7.1 secs\n  //\n  template <\n    typename AT, \n    typename DerivedB,\n    typename Derivedknown, \n    typename DerivedY,\n    typename AeqT,\n    typename DerivedBeq,\n    typename AieqT,\n    typename DerivedBieq,\n    typename Derivedlx,\n    typename Derivedux,\n    typename DerivedZ\n    >\n  IGL_INLINE igl::SolverStatus active_set(\n    const Eigen::SparseMatrix<AT>& A,\n    const Eigen::PlainObjectBase<DerivedB> & B,\n    const Eigen::PlainObjectBase<Derivedknown> & known,\n    const Eigen::PlainObjectBase<DerivedY> & Y,\n    const Eigen::SparseMatrix<AeqT>& Aeq,\n    const Eigen::PlainObjectBase<DerivedBeq> & Beq,\n    const Eigen::SparseMatrix<AieqT>& Aieq,\n    const Eigen::PlainObjectBase<DerivedBieq> & Bieq,\n    const Eigen::PlainObjectBase<Derivedlx> & lx,\n    const Eigen::PlainObjectBase<Derivedux> & ux,\n    const igl::active_set_params & params,\n    Eigen::PlainObjectBase<DerivedZ> & Z\n    );\n};\n\n#include \"EPS.h\"\nstruct igl::active_set_params\n{\n  // Input parameters for active_set:\n  //   Auu_pd  whether Auu is positive definite {false}\n  //   max_iter  Maximum number of iterations (0 = Infinity, {100})\n  //   inactive_threshold  Threshold on Lagrange multiplier values to determine\n  //     whether to keep constraints active {EPS}\n  //   constraint_threshold  Threshold on whether constraints are violated (0\n  //     is perfect) {EPS}\n  //   solution_diff_threshold  Threshold on the squared norm of the difference\n  //     between two consecutive solutions {EPS}\n  bool Auu_pd;\n  int max_iter;\n  double inactive_threshold;\n  double constraint_threshold;\n  double solution_diff_threshold;\n  active_set_params():\n    Auu_pd(false),\n    max_iter(100),\n    inactive_threshold(igl::DOUBLE_EPS),\n    constraint_threshold(igl::DOUBLE_EPS),\n    solution_diff_threshold(igl::DOUBLE_EPS)\n    {};\n};\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"active_set.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/adjacency_list.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"adjacency_list.h\"\n\n#include \"verbose.h\"\n#include <algorithm>\n\ntemplate <typename Index, typename IndexVector>\nIGL_INLINE void igl::adjacency_list(\n    const Eigen::PlainObjectBase<Index>  & F,\n    std::vector<std::vector<IndexVector> >& A,\n    bool sorted)\n{\n  A.clear(); \n  A.resize(F.maxCoeff()+1);\n  \n  // Loop over faces\n  for(int i = 0;i<F.rows();i++)\n  {\n    // Loop over this face\n    for(int j = 0;j<F.cols();j++)\n    {\n      // Get indices of edge: s --> d\n      int s = F(i,j);\n      int d = F(i,(j+1)%F.cols());\n      A.at(s).push_back(d);\n      A.at(d).push_back(s);\n    }\n  }\n  \n  // Remove duplicates\n  for(int i=0; i<(int)A.size();++i)\n  {\n    std::sort(A[i].begin(), A[i].end());\n    A[i].erase(std::unique(A[i].begin(), A[i].end()), A[i].end());\n  }\n  \n  // If needed, sort every VV\n  if (sorted)\n  {\n    // Loop over faces\n    \n    // for every vertex v store a set of ordered edges not incident to v that belongs to triangle incident on v.\n    std::vector<std::vector<std::vector<int> > > SR; \n    SR.resize(A.size());\n    \n    for(int i = 0;i<F.rows();i++)\n    {\n      // Loop over this face\n      for(int j = 0;j<F.cols();j++)\n      {\n        // Get indices of edge: s --> d\n        int s = F(i,j);\n        int d = F(i,(j+1)%F.cols());\n        // Get index of opposing vertex v\n        int v = F(i,(j+2)%F.cols());\n        \n        std::vector<int> e(2);\n        e[0] = d;\n        e[1] = v;\n        SR[s].push_back(e);\n      }\n    }\n    \n    for(int v=0; v<(int)SR.size();++v)\n    {\n      std::vector<IndexVector>& vv = A.at(v);\n      std::vector<std::vector<int> >& sr = SR[v];\n      \n      std::vector<std::vector<int> > pn = sr;\n      \n      // Compute previous/next for every element in sr\n      for(int i=0;i<(int)sr.size();++i)\n      {\n        int a = sr[i][0];\n        int b = sr[i][1];\n        \n        // search for previous\n        int p = -1;\n        for(int j=0;j<(int)sr.size();++j)\n          if(sr[j][1] == a)\n            p = j;\n        pn[i][0] = p;\n        \n        // search for next\n        int n = -1;\n        for(int j=0;j<(int)sr.size();++j)\n          if(sr[j][0] == b)\n            n = j;\n        pn[i][1] = n;\n        \n      }\n      \n      // assume manifoldness (look for beginning of a single chain)\n      int c = 0;\n      for(int j=0; j<=(int)sr.size();++j)\n        if (pn[c][0] != -1)\n          c = pn[c][0];\n      \n      if (pn[c][0] == -1) // border case\n      {\n        // finally produce the new vv relation\n        for(int j=0; j<(int)sr.size();++j)\n        {\n          vv[j] = sr[c][0];\n          if (pn[c][1] != -1)\n            c = pn[c][1];\n        }\n        vv.back() = sr[c][1];\n      }\n      else\n      {\n        // finally produce the new vv relation\n        for(int j=0; j<(int)sr.size();++j)\n        {\n          vv[j] = sr[c][0];\n          \n          c = pn[c][1];\n        }\n      }\n    }\n  }\n}\n\ntemplate <typename Index>\nIGL_INLINE void igl::adjacency_list(\n  const std::vector<std::vector<Index> > & F,\n  std::vector<std::vector<Index> >& A)\n{\n  A.clear(); \n  A.resize(F.maxCoeff()+1);\n  \n  // Loop over faces\n  for(int i = 0;i<F.size();i++)\n  {\n    // Loop over this face\n    for(int j = 0;j<F[i].size();j++)\n    {\n      // Get indices of edge: s --> d\n      int s = F(i,j);\n      int d = F(i,(j+1)%F[i].size());\n      A.at(s).push_back(d);\n      A.at(d).push_back(s);\n    }\n  }\n  \n  // Remove duplicates\n  for(int i=0; i<(int)A.size();++i)\n  {\n    std::sort(A[i].begin(), A[i].end());\n    A[i].erase(std::unique(A[i].begin(), A[i].end()), A[i].end());\n  }\n  \n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::adjacency_list<Eigen::Matrix<int, -1, 2, 0, -1, 2>, int>(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&, bool);\n// generated by autoexplicit.sh\ntemplate void igl::adjacency_list<Eigen::Matrix<int, -1, -1, 0, -1, -1>, int>(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&, bool);\ntemplate void igl::adjacency_list<Eigen::Matrix<int, -1, 3, 0, -1, 3>, int>(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&, bool);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/adjacency_list.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_ADJACENCY_LIST_H\n#define IGL_ADJACENCY_LIST_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Dense>\n#include <Eigen/Sparse>\n#include <vector>\nnamespace igl \n{\n  // Constructs the graph adjacency list of a given mesh (V,F)\n  // Templates:\n  //   T  should be a eigen sparse matrix primitive type like int or double\n  // Inputs:\n  //   F       #F by dim list of mesh faces (must be triangles)\n  //   sorted  flag that indicates if the list should be sorted counter-clockwise\n  // Outputs: \n  //   A  vector<vector<T> > containing at row i the adjacent vertices of vertex i\n  //\n  // Example:\n  //   // Mesh in (V,F)\n  //   vector<vector<double> > A;\n  //   adjacency_list(F,A);\n  //\n  // See also: edges, cotmatrix, diag\n  template <typename Index, typename IndexVector>\n  IGL_INLINE void adjacency_list(\n    const Eigen::PlainObjectBase<Index> & F, \n    std::vector<std::vector<IndexVector> >& A,\n    bool sorted = false);\n\n  // Variant that accepts polygonal faces. \n  // Each element of F is a set of indices of a polygonal face.\n  template <typename Index>\n  IGL_INLINE void adjacency_list(\n    const std::vector<std::vector<Index> > & F,\n    std::vector<std::vector<Index> >& A);\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"adjacency_list.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/adjacency_matrix.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"adjacency_matrix.h\"\n\n#include \"verbose.h\"\n\n#include <vector>\n\ntemplate <typename DerivedF, typename T>\nIGL_INLINE void igl::adjacency_matrix(\n  const Eigen::MatrixBase<DerivedF> & F, \n  Eigen::SparseMatrix<T>& A)\n{\n  using namespace std;\n  using namespace Eigen;\n  typedef typename DerivedF::Scalar Index;\n\n  typedef Triplet<T> IJV;\n  vector<IJV > ijv;\n  ijv.reserve(F.size()*2);\n  // Loop over faces\n  for(int i = 0;i<F.rows();i++)\n  {\n    // Loop over this face\n    for(int j = 0;j<F.cols();j++)\n    {\n      // Get indices of edge: s --> d\n      Index s = F(i,j);\n      Index d = F(i,(j+1)%F.cols());\n      ijv.push_back(IJV(s,d,1));\n      ijv.push_back(IJV(d,s,1));\n    }\n  }\n\n  const Index n = F.maxCoeff()+1;\n  A.resize(n,n);\n  switch(F.cols())\n  {\n    case 3:\n      A.reserve(6*(F.maxCoeff()+1));\n      break;\n    case 4:\n      A.reserve(26*(F.maxCoeff()+1));\n      break;\n  }\n  A.setFromTriplets(ijv.begin(),ijv.end());\n\n  // Force all non-zeros to be one\n\n  // Iterate over outside\n  for(int k=0; k<A.outerSize(); ++k)\n  {\n    // Iterate over inside\n    for(typename Eigen::SparseMatrix<T>::InnerIterator it (A,k); it; ++it)\n    {\n      assert(it.value() != 0);\n      A.coeffRef(it.row(),it.col()) = 1;\n    }\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::adjacency_matrix<Eigen::Matrix<int, -1, -1, 0, -1, -1>, bool>(Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::SparseMatrix<bool, 0, int>&);\ntemplate void igl::adjacency_matrix<Eigen::Matrix<int, -1, -1, 0, -1, -1>, double>(Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::SparseMatrix<double, 0, int>&);\ntemplate void igl::adjacency_matrix<Eigen::Matrix<int, -1, -1, 0, -1, -1>, int>(Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::SparseMatrix<int, 0, int>&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/adjacency_matrix.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_ADJACENCY_MATRIX_H\n#define IGL_ADJACENCY_MATRIX_H\n#include \"igl_inline.h\"\n\n#define EIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET\n#include <Eigen/Dense>\n#include <Eigen/Sparse>\n\nnamespace igl \n{\n  // Constructs the graph adjacency matrix  of a given mesh (V,F)\n  // Templates:\n  //   T  should be a eigen sparse matrix primitive type like int or double\n  // Inputs:\n  //   F  #F by dim list of mesh simplices\n  // Outputs: \n  //   A  max(F) by max(F) cotangent matrix, each row i corresponding to V(i,:)\n  //\n  // Example:\n  //   // Mesh in (V,F)\n  //   Eigen::SparseMatrix<double> A;\n  //   adjacency_matrix(F,A);\n  //   // sum each row \n  //   SparseVector<double> Asum;\n  //   sum(A,1,Asum);\n  //   // Convert row sums into diagonal of sparse matrix\n  //   SparseMatrix<double> Adiag;\n  //   diag(Asum,Adiag);\n  //   // Build uniform laplacian\n  //   SparseMatrix<double> U;\n  //   U = A-Adiag;\n  //\n  // See also: edges, cotmatrix, diag\n  template <typename DerivedF, typename T>\n  IGL_INLINE void adjacency_matrix(\n    const Eigen::MatrixBase<DerivedF> & F, \n    Eigen::SparseMatrix<T>& A);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"adjacency_matrix.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/all.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"all.h\"\n#include \"redux.h\"\n\n\ntemplate <typename AType, typename DerivedB>\nIGL_INLINE void igl::all(\n  const Eigen::SparseMatrix<AType> & A, \n  const int dim,\n  Eigen::PlainObjectBase<DerivedB>& B)\n{\n  typedef typename DerivedB::Scalar Scalar;\n  igl::redux(A,dim,[](Scalar a, Scalar b){ return a && b!=0;},B);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#endif\n\n\n"
  },
  {
    "path": "libs/libigl/include/igl/all.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_ALL_H\n#define IGL_ALL_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <Eigen/Sparse>\nnamespace igl\n{\n  // For Dense matrices use: A.rowwise().all() or A.colwise().all()\n  //\n  // Inputs:\n  //   A  m by n sparse matrix\n  //   dim  dimension along which to check for all (1 or 2)\n  // Output:\n  //   B  n-long vector (if dim == 1) \n  //   or\n  //   B  m-long vector (if dim == 2)\n  //\n  template <typename AType, typename DerivedB>\n  IGL_INLINE void all(\n    const Eigen::SparseMatrix<AType> & A, \n    const int dim,\n    Eigen::PlainObjectBase<DerivedB>& B);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"all.cpp\"\n#endif\n#endif\n\n\n"
  },
  {
    "path": "libs/libigl/include/igl/all_edges.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"all_edges.h\"\n\ntemplate <typename DerivedF, typename DerivedE>\nIGL_INLINE void igl::all_edges(\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  Eigen::PlainObjectBase<DerivedE> & E)\n{\n  E.resize(F.rows()*F.cols(),F.cols()-1);\n  typedef typename DerivedE::Scalar EScalar;\n  switch(F.cols())\n  {\n    case 4:\n      E.block(0*F.rows(),0,F.rows(),1) = F.col(1).template cast<EScalar>();\n      E.block(0*F.rows(),1,F.rows(),1) = F.col(3).template cast<EScalar>();\n      E.block(0*F.rows(),2,F.rows(),1) = F.col(2).template cast<EScalar>();\n\n      E.block(1*F.rows(),0,F.rows(),1) = F.col(0).template cast<EScalar>();\n      E.block(1*F.rows(),1,F.rows(),1) = F.col(2).template cast<EScalar>();\n      E.block(1*F.rows(),2,F.rows(),1) = F.col(3).template cast<EScalar>();\n\n      E.block(2*F.rows(),0,F.rows(),1) = F.col(0).template cast<EScalar>();\n      E.block(2*F.rows(),1,F.rows(),1) = F.col(3).template cast<EScalar>();\n      E.block(2*F.rows(),2,F.rows(),1) = F.col(1).template cast<EScalar>();\n\n      E.block(3*F.rows(),0,F.rows(),1) = F.col(0).template cast<EScalar>();\n      E.block(3*F.rows(),1,F.rows(),1) = F.col(1).template cast<EScalar>();\n      E.block(3*F.rows(),2,F.rows(),1) = F.col(2).template cast<EScalar>();\n      return;\n    case 3:\n      E.block(0*F.rows(),0,F.rows(),1) = F.col(1).template cast<EScalar>();\n      E.block(0*F.rows(),1,F.rows(),1) = F.col(2).template cast<EScalar>();\n      E.block(1*F.rows(),0,F.rows(),1) = F.col(2).template cast<EScalar>();\n      E.block(1*F.rows(),1,F.rows(),1) = F.col(0).template cast<EScalar>();\n      E.block(2*F.rows(),0,F.rows(),1) = F.col(0).template cast<EScalar>();\n      E.block(2*F.rows(),1,F.rows(),1) = F.col(1).template cast<EScalar>();\n      return;\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::all_edges<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::all_edges<Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 2, 0, -1, 2> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> >&);\ntemplate void igl::all_edges<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 2, 0, -1, 2> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> >&);\ntemplate void igl::all_edges<Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::all_edges<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 2, 0, -1, 2> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/all_edges.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_ALL_EDGES_H\n#define IGL_ALL_EDGES_H\n#include \"igl_inline.h\"\n#include <Eigen/Dense>\nnamespace igl\n{\n  // ALL_EDGES Determines all \"directed edges\" of a given set of simplices\n  //\n  // Inputs:\n  //   F  #F by simplex_size list of \"faces\"\n  // Outputs:\n  //   E  #E by simplex_size-1  list of edges\n  //\n  // Note: this is not the same as igl::edges because this includes every\n  // directed edge including repeats (meaning interior edges on a surface will\n  // show up once for each direction and non-manifold edges may appear more than\n  // once for each direction).\n  template <typename DerivedF, typename DerivedE>\n  IGL_INLINE void all_edges(\n    const Eigen::PlainObjectBase<DerivedF> & F,\n    Eigen::PlainObjectBase<DerivedE> & E);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"all_edges.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/all_pairs_distances.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"all_pairs_distances.h\"\n#include <Eigen/Dense>\n\ntemplate <typename Mat>\nIGL_INLINE void igl::all_pairs_distances(\n  const Mat & V,\n  const Mat & U,\n  const bool squared,\n  Mat & D)\n{\n  // dimension should be the same\n  assert(V.cols() == U.cols());\n  // resize output\n  D.resize(V.rows(),U.rows());\n  for(int i = 0;i<V.rows();i++)\n  {\n    for(int j=0;j<U.rows();j++)\n    {\n      D(i,j) = (V.row(i)-U.row(j)).squaredNorm();\n      if(!squared)\n      {\n        D(i,j) = sqrt(D(i,j));\n      }\n    }\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::all_pairs_distances<Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, bool, Eigen::Matrix<double, -1, -1, 0, -1, -1>&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/all_pairs_distances.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_ALL_PAIRS_DISTANCES_H\n#define IGL_ALL_PAIRS_DISTANCES_H\n#include \"igl_inline.h\"\n\nnamespace igl\n{\n  // ALL_PAIRS_DISTANCES compute distances between each point i in V and point j\n  // in U\n  // \n  // D = all_pairs_distances(V,U)\n  // \n  // Templates:\n  //   Mat  matrix class like MatrixXd\n  // Inputs:\n  //   V  #V by dim list of points\n  //   U  #U by dim list of points\n  //   squared  whether to return squared distances\n  // Outputs:\n  //   D  #V by #U matrix of distances, where D(i,j) gives the distance or\n  //     squareed distance between V(i,:) and U(j,:)\n  // \n  template <typename Mat>\n  IGL_INLINE void all_pairs_distances(\n    const Mat & V,\n    const Mat & U,\n    const bool squared, \n    Mat & D);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"all_pairs_distances.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/ambient_occlusion.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"ambient_occlusion.h\"\n#include \"random_dir.h\"\n#include \"ray_mesh_intersect.h\"\n#include \"EPS.h\"\n#include \"Hit.h\"\n#include \"parallel_for.h\"\n#include <functional>\n#include <vector>\n#include <algorithm>\n\ntemplate <\n  typename DerivedP,\n  typename DerivedN,\n  typename DerivedS >\nIGL_INLINE void igl::ambient_occlusion(\n  const std::function<\n    bool(\n      const Eigen::Vector3f&,\n      const Eigen::Vector3f&)\n      > & shoot_ray,\n  const Eigen::PlainObjectBase<DerivedP> & P,\n  const Eigen::PlainObjectBase<DerivedN> & N,\n  const int num_samples,\n  Eigen::PlainObjectBase<DerivedS> & S)\n{\n  using namespace Eigen;\n  const int n = P.rows();\n  // Resize output\n  S.resize(n,1);\n  VectorXi hits = VectorXi::Zero(n,1);\n  // Embree seems to be parallel when constructing but not when tracing rays\n  const MatrixXf D = random_dir_stratified(num_samples).cast<float>();\n\n  const auto & inner = [&P,&N,&num_samples,&D,&S,&shoot_ray](const int p)\n  {\n    const Vector3f origin = P.row(p).template cast<float>();\n    const Vector3f normal = N.row(p).template cast<float>();\n    int num_hits = 0;\n    for(int s = 0;s<num_samples;s++)\n    {\n      Vector3f d = D.row(s);\n      if(d.dot(normal) < 0)\n      {\n        // reverse ray\n        d *= -1;\n      }\n      if(shoot_ray(origin,d))\n      {\n        num_hits++;\n      }\n    }\n    S(p) = (double)num_hits/(double)num_samples;\n  };\n  parallel_for(n,inner,1000);\n}\n\ntemplate <\n  typename DerivedV,\n  int DIM,\n  typename DerivedF,\n  typename DerivedP,\n  typename DerivedN,\n  typename DerivedS >\nIGL_INLINE void igl::ambient_occlusion(\n  const igl::AABB<DerivedV,DIM> & aabb,\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  const Eigen::PlainObjectBase<DerivedP> & P,\n  const Eigen::PlainObjectBase<DerivedN> & N,\n  const int num_samples,\n  Eigen::PlainObjectBase<DerivedS> & S)\n{\n  const auto & shoot_ray = [&aabb,&V,&F](\n    const Eigen::Vector3f& _s,\n    const Eigen::Vector3f& dir)->bool\n  {\n    Eigen::Vector3f s = _s+1e-4*dir;\n    igl::Hit hit;\n    return aabb.intersect_ray(\n      V,\n      F,\n      s  .cast<typename DerivedV::Scalar>().eval(),\n      dir.cast<typename DerivedV::Scalar>().eval(),\n      hit);\n  };\n  return ambient_occlusion(shoot_ray,P,N,num_samples,S);\n\n}\n\ntemplate <\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedP,\n  typename DerivedN,\n  typename DerivedS >\nIGL_INLINE void igl::ambient_occlusion(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  const Eigen::PlainObjectBase<DerivedP> & P,\n  const Eigen::PlainObjectBase<DerivedN> & N,\n  const int num_samples,\n  Eigen::PlainObjectBase<DerivedS> & S)\n{\n  if(F.rows() < 100)\n  {\n    // Super naive\n    const auto & shoot_ray = [&V,&F](\n      const Eigen::Vector3f& _s,\n      const Eigen::Vector3f& dir)->bool\n    {\n      Eigen::Vector3f s = _s+1e-4*dir;\n      igl::Hit hit;\n      return ray_mesh_intersect(s,dir,V,F,hit);\n    };\n    return ambient_occlusion(shoot_ray,P,N,num_samples,S);\n  }\n  AABB<DerivedV,3> aabb;\n  aabb.init(V,F);\n  return ambient_occlusion(aabb,V,F,P,N,num_samples,S);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::ambient_occlusion<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(std::function<bool (Eigen::Matrix<float, 3, 1, 0, 3, 1> const&, Eigen::Matrix<float, 3, 1, 0, 3, 1> const&)> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::ambient_occlusion<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(std::function<bool (Eigen::Matrix<float, 3, 1, 0, 3, 1> const&, Eigen::Matrix<float, 3, 1, 0, 3, 1> const&)> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::ambient_occlusion<Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(std::function<bool (Eigen::Matrix<float, 3, 1, 0, 3, 1> const&, Eigen::Matrix<float, 3, 1, 0, 3, 1> const&)> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\ntemplate void igl::ambient_occlusion<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(std::function<bool (Eigen::Matrix<float, 3, 1, 0, 3, 1> const&, Eigen::Matrix<float, 3, 1, 0, 3, 1> const&)> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/ambient_occlusion.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_AMBIENT_OCCLUSION_H\n#define IGL_AMBIENT_OCCLUSION_H\n#include \"igl_inline.h\"\n#include \"AABB.h\"\n#include <Eigen/Core>\n#include <functional>\nnamespace igl\n{\n  // Compute ambient occlusion per given point\n  //\n  // Inputs:\n  //    shoot_ray  function handle that outputs hits of a given ray against a\n  //      mesh (embedded in function handles as captured variable/data)\n  //    P  #P by 3 list of origin points\n  //    N  #P by 3 list of origin normals\n  // Outputs:\n  //    S  #P list of ambient occlusion values between 1 (fully occluded) and\n  //      0 (not occluded)\n  //\n  template <\n    typename DerivedP,\n    typename DerivedN,\n    typename DerivedS >\n  IGL_INLINE void ambient_occlusion(\n    const std::function<\n      bool(\n        const Eigen::Vector3f&,\n        const Eigen::Vector3f&)\n        > & shoot_ray,\n    const Eigen::PlainObjectBase<DerivedP> & P,\n    const Eigen::PlainObjectBase<DerivedN> & N,\n    const int num_samples,\n    Eigen::PlainObjectBase<DerivedS> & S);\n  // Inputs:\n  //   AABB  axis-aligned bounding box hierarchy around (V,F)\n  template <\n    typename DerivedV,\n    int DIM,\n    typename DerivedF,\n    typename DerivedP,\n    typename DerivedN,\n    typename DerivedS >\n  IGL_INLINE void ambient_occlusion(\n    const igl::AABB<DerivedV,DIM> & aabb,\n    const Eigen::PlainObjectBase<DerivedV> & V,\n    const Eigen::PlainObjectBase<DerivedF> & F,\n    const Eigen::PlainObjectBase<DerivedP> & P,\n    const Eigen::PlainObjectBase<DerivedN> & N,\n    const int num_samples,\n    Eigen::PlainObjectBase<DerivedS> & S);\n  // Inputs:\n  //    V  #V by 3 list of mesh vertex positions\n  //    F  #F by 3 list of mesh face indices into V\n  template <\n    typename DerivedV,\n    typename DerivedF,\n    typename DerivedP,\n    typename DerivedN,\n    typename DerivedS >\n  IGL_INLINE void ambient_occlusion(\n    const Eigen::PlainObjectBase<DerivedV> & V,\n    const Eigen::PlainObjectBase<DerivedF> & F,\n    const Eigen::PlainObjectBase<DerivedP> & P,\n    const Eigen::PlainObjectBase<DerivedN> & N,\n    const int num_samples,\n    Eigen::PlainObjectBase<DerivedS> & S);\n\n};\n#ifndef IGL_STATIC_LIBRARY\n#  include \"ambient_occlusion.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/angle_bound_frame_fields.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include <igl/angle_bound_frame_fields.h>\n#include <igl/edge_topology.h>\n#include <igl/local_basis.h>\n#include <igl/sparse.h>\n#include <igl/speye.h>\n#include <igl/slice.h>\n#include <igl/polyroots.h>\n#include <igl/colon.h>\n#include <Eigen/Sparse>\n\n#include <iostream>\n\nnamespace igl {\n\n  template <typename DerivedV, typename DerivedF>\n  class AngleBoundFFSolverData\n  {\n    public:\n      const Eigen::PlainObjectBase<DerivedV> &V; int numV;\n      const Eigen::PlainObjectBase<DerivedF> &F; int numF;\n\n      Eigen::MatrixXi EV; int numE;\n      Eigen::MatrixXi F2E;\n      Eigen::MatrixXi E2F;\n      Eigen::VectorXd K;\n\n      Eigen::VectorXi isBorderEdge;\n      int numInteriorEdges;\n      Eigen::Matrix<int,Eigen::Dynamic,2> E2F_int;\n      Eigen::VectorXi indInteriorToFull;\n      Eigen::VectorXi indFullToInterior;\n\n      DerivedV B1, B2, FN;\n\n      //laplacians\n      Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar>> DDA, DDB;\n\n  private:\n    IGL_INLINE void computeLaplacians();\n    IGL_INLINE void computek();\n    IGL_INLINE void computeCoefficientLaplacian(int n, Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > &D);\n    IGL_INLINE void precomputeInteriorEdges();\n\npublic:\n      IGL_INLINE AngleBoundFFSolverData(const Eigen::PlainObjectBase<DerivedV> &_V,\n                                   const Eigen::PlainObjectBase<DerivedF> &_F);\n  };\n\n  template <typename DerivedV, typename DerivedF, typename DerivedO>\n  class AngleBoundFFSolver\n  {\n  public:\n    IGL_INLINE AngleBoundFFSolver(const AngleBoundFFSolverData<DerivedV, DerivedF> &_data,\n                                  const typename DerivedV::Scalar &_thetaMin = 30,\n                                 int _maxIter = 50,\n                                 const typename DerivedV::Scalar &_lambdaInit = 100,\n                                 const typename DerivedV::Scalar &_lambdaMultFactor = 1.01,\n                                const bool _doHardConstraints = false);\n    IGL_INLINE bool solve(const Eigen::VectorXi &isConstrained,\n                          const Eigen::PlainObjectBase<DerivedO> &initialSolution,\n                          Eigen::PlainObjectBase<DerivedO> &output,\n                          typename DerivedV::Scalar *lambdaOut = NULL);\n\n  private:\n\n    const AngleBoundFFSolverData<DerivedV, DerivedF> &data;\n\n    //polyVF data\n    Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic, 1> Acoeff, Bcoeff;\n    Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 2> pvU, pvV;\n    typename DerivedV::Scalar lambda;\n\n    //parameters\n    typename DerivedV::Scalar lambdaInit,lambdaMultFactor;\n    int maxIter;\n    typename DerivedV::Scalar thetaMin;\n    bool doHardConstraints;\n\n    typename DerivedV::Scalar computeAngle(const std::complex<typename DerivedV::Scalar> &u,\n                                           const std::complex<typename DerivedV::Scalar> &v);\n//    IGL_INLINE void computeAngles(Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 1> &angles);\n\n    IGL_INLINE int getNumOutOfBounds();\n\n    IGL_INLINE void rotateAroundBisector(const std::complex<typename DerivedV::Scalar> &uin,\n                         const std::complex<typename DerivedV::Scalar> &vin,\n                         const typename DerivedV::Scalar theta,\n                         std::complex<typename DerivedV::Scalar> &uout,\n                         std::complex<typename DerivedV::Scalar> &vout);\n\n    IGL_INLINE void localStep();\n\n    IGL_INLINE void globalStep(const Eigen::Matrix<int, Eigen::Dynamic, 1>  &isConstrained,\n                               const Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic, 1>  &Ak,\n                               const Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic, 1>  &Bk);\n\n    IGL_INLINE void minQuadWithKnownMini(const Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > &Q,\n                         const Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > &f,\n                         const Eigen::VectorXi isConstrained,\n                         const Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic, 1> &xknown,\n                                         Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic, 1> &x);\n    IGL_INLINE void setFieldFromCoefficients();\n    IGL_INLINE void setCoefficientsFromField();\n\n  };\n}\n\n//Implementation\n/***************************** Data ***********************************/\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE igl::AngleBoundFFSolverData<DerivedV, DerivedF>::\nAngleBoundFFSolverData(const Eigen::PlainObjectBase<DerivedV> &_V,\n                  const Eigen::PlainObjectBase<DerivedF> &_F):\nV(_V),\nnumV(_V.rows()),\nF(_F),\nnumF(_F.rows())\n{\n  igl::edge_topology(V,F,EV,F2E,E2F);\n  numE = EV.rows();\n\n  precomputeInteriorEdges();\n\n  igl::local_basis(V,F,B1,B2,FN);\n\n  computek();\n\n  computeLaplacians();\n\n};\n\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::AngleBoundFFSolverData<DerivedV, DerivedF>::computeLaplacians()\n{\n  computeCoefficientLaplacian(2, DDA);\n\n  computeCoefficientLaplacian(4, DDB);\n}\n\ntemplate<typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::AngleBoundFFSolverData<DerivedV, DerivedF>::\nprecomputeInteriorEdges()\n{\n  // Flag border edges\n  numInteriorEdges = 0;\n  isBorderEdge.setZero(numE,1);\n  indFullToInterior = -1.*Eigen::VectorXi::Ones(numE,1);\n\n  for(unsigned i=0; i<numE; ++i)\n  {\n    if ((E2F(i,0) == -1) || ((E2F(i,1) == -1)))\n      isBorderEdge[i] = 1;\n    else\n    {\n      indFullToInterior[i] = numInteriorEdges;\n      numInteriorEdges++;\n    }\n  }\n\n  E2F_int.resize(numInteriorEdges, 2);\n  indInteriorToFull.setZero(numInteriorEdges,1);\n  int ii = 0;\n  for (int k=0; k<numE; ++k)\n  {\n    if (isBorderEdge[k])\n      continue;\n    E2F_int.row(ii) = E2F.row(k);\n    indInteriorToFull[ii] = k;\n    ii++;\n  }\n\n}\n\n\n\ntemplate<typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::AngleBoundFFSolverData<DerivedV, DerivedF>::\ncomputeCoefficientLaplacian(int n, Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > &D)\n{\n  std::vector<Eigen::Triplet<std::complex<typename DerivedV::Scalar> >> tripletList;\n\n  // For every non-border edge\n  for (unsigned eid=0; eid<numE; ++eid)\n  {\n    if (!isBorderEdge[eid])\n    {\n      int fid0 = E2F(eid,0);\n      int fid1 = E2F(eid,1);\n\n      tripletList.push_back(Eigen::Triplet<std::complex<typename DerivedV::Scalar> >(fid0,\n                                                                                     fid0,\n                                                                                     std::complex<typename DerivedV::Scalar>(1.)));\n      tripletList.push_back(Eigen::Triplet<std::complex<typename DerivedV::Scalar> >(fid1,\n                                                                                     fid1,\n                                                                                     std::complex<typename DerivedV::Scalar>(1.)));\n      tripletList.push_back(Eigen::Triplet<std::complex<typename DerivedV::Scalar> >(fid0,\n                                                                                     fid1,\n                                                                                     -1.*std::polar(1.,-1.*n*K[eid])));\n      tripletList.push_back(Eigen::Triplet<std::complex<typename DerivedV::Scalar> >(fid1,\n                                                                                     fid0,\n                                                                                     -1.*std::polar(1.,1.*n*K[eid])));\n\n    }\n  }\n  D.resize(numF,numF);\n  D.setFromTriplets(tripletList.begin(), tripletList.end());\n\n\n}\n\ntemplate<typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::AngleBoundFFSolverData<DerivedV, DerivedF>::\ncomputek()\n{\n  K.setZero(numE);\n  // For every non-border edge\n  for (unsigned eid=0; eid<numE; ++eid)\n  {\n    if (!isBorderEdge[eid])\n    {\n      int fid0 = E2F(eid,0);\n      int fid1 = E2F(eid,1);\n\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> N0 = FN.row(fid0);\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> N1 = FN.row(fid1);\n\n      // find common edge on triangle 0 and 1\n      int fid0_vc = -1;\n      int fid1_vc = -1;\n      for (unsigned i=0;i<3;++i)\n      {\n        if (F2E(fid0,i) == eid)\n          fid0_vc = i;\n        if (F2E(fid1,i) == eid)\n          fid1_vc = i;\n      }\n      assert(fid0_vc != -1);\n      assert(fid1_vc != -1);\n\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> common_edge = V.row(F(fid0,(fid0_vc+1)%3)) - V.row(F(fid0,fid0_vc));\n      common_edge.normalize();\n\n      // Map the two triangles in a new space where the common edge is the x axis and the N0 the z axis\n      Eigen::Matrix<typename DerivedV::Scalar, 3, 3> P;\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> o = V.row(F(fid0,fid0_vc));\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> tmp = -N0.cross(common_edge);\n      P << common_edge, tmp, N0;\n      //      P.transposeInPlace();\n\n\n      Eigen::Matrix<typename DerivedV::Scalar, 3, 3> V0;\n      V0.row(0) = V.row(F(fid0,0)) -o;\n      V0.row(1) = V.row(F(fid0,1)) -o;\n      V0.row(2) = V.row(F(fid0,2)) -o;\n\n      V0 = (P*V0.transpose()).transpose();\n\n      Eigen::Matrix<typename DerivedV::Scalar, 3, 3> V1;\n      V1.row(0) = V.row(F(fid1,0)) -o;\n      V1.row(1) = V.row(F(fid1,1)) -o;\n      V1.row(2) = V.row(F(fid1,2)) -o;\n      V1 = (P*V1.transpose()).transpose();\n\n      // compute rotation R such that R * N1 = N0\n      // i.e. map both triangles to the same plane\n      double alpha = -atan2(V1((fid1_vc+2)%3,2),V1((fid1_vc+2)%3,1));\n\n      Eigen::Matrix<typename DerivedV::Scalar, 3, 3> R;\n      R << 1,          0,            0,\n      0, cos(alpha), -sin(alpha) ,\n      0, sin(alpha),  cos(alpha);\n      V1 = (R*V1.transpose()).transpose();\n\n      // measure the angle between the reference frames\n      // k_ij is the angle between the triangle on the left and the one on the right\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> ref0 = V0.row(1) - V0.row(0);\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> ref1 = V1.row(1) - V1.row(0);\n\n      ref0.normalize();\n      ref1.normalize();\n\n      double ktemp = atan2(ref1(1),ref1(0)) - atan2(ref0(1),ref0(0));\n\n      // just to be sure, rotate ref0 using angle ktemp...\n      Eigen::Matrix<typename DerivedV::Scalar, 2, 2> R2;\n      R2 << cos(ktemp), -sin(ktemp), sin(ktemp), cos(ktemp);\n\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 2> tmp1 = R2*(ref0.head(2)).transpose();\n\n      K[eid] = ktemp;\n    }\n  }\n\n}\n\n\n/***************************** Solver ***********************************/\ntemplate <typename DerivedV, typename DerivedF, typename DerivedO>\nIGL_INLINE igl::AngleBoundFFSolver<DerivedV, DerivedF, DerivedO>::\nAngleBoundFFSolver(const AngleBoundFFSolverData<DerivedV, DerivedF> &_data,\n                   const typename DerivedV::Scalar &_thetaMin,\n                  int _maxIter,\n                  const typename DerivedV::Scalar &_lambdaInit,\n                  const typename DerivedV::Scalar &_lambdaMultFactor,\n                   const bool _doHardConstraints):\ndata(_data),\nlambdaInit(_lambdaInit),\nmaxIter(_maxIter),\nlambdaMultFactor(_lambdaMultFactor),\ndoHardConstraints(_doHardConstraints),\nthetaMin(_thetaMin)\n{\n  Acoeff.resize(data.numF,1);\n  Bcoeff.resize(data.numF,1);\n  pvU.setZero(data.numF, 2);\n  pvV.setZero(data.numF, 2);\n};\n\ntemplate<typename DerivedV, typename DerivedF, typename DerivedO>\nIGL_INLINE void igl::AngleBoundFFSolver<DerivedV, DerivedF, DerivedO>::\nrotateAroundBisector(const std::complex<typename DerivedV::Scalar> &uin,\n                          const std::complex<typename DerivedV::Scalar> &vin,\n                          const typename DerivedV::Scalar diff,\n                          std::complex<typename DerivedV::Scalar> &uout,\n                          std::complex<typename DerivedV::Scalar> &vout)\n{\n  //rotate 2D complex vectors u and v around their bisector so that their\n  //angle is at least theta\n\n  uout = uin;\n  vout = vin;\n  typename DerivedV::Scalar au = arg(uin);\n  typename DerivedV::Scalar av = arg(vin);\n  if (au<av)\n  {\n    uout = std::polar (1.0,-.5*diff)*uin;\n    vout = std::polar (1.0, .5*diff)*vin;\n  }\n  else\n  {\n    uout = std::polar (1.0, .5*diff)*uin;\n    vout = std::polar (1.0,-.5*diff)*vin;\n  }\n\n}\n\n\ntemplate<typename DerivedV, typename DerivedF, typename DerivedO>\nIGL_INLINE void igl::AngleBoundFFSolver<DerivedV, DerivedF, DerivedO>::\nlocalStep()\n{\n  for (int j =0; j<data.numF; ++j)\n  {\n\n    std::complex<typename DerivedV::Scalar> u(pvU(j,0),pvU(j,1));\n    std::complex<typename DerivedV::Scalar> v(pvV(j,0),pvV(j,1));\n\n    typename DerivedV::Scalar current_angle = computeAngle(u, v);\n    if (current_angle<thetaMin*M_PI/180)\n    {\n      // bring all to 1st or 4th quarter plane\n      if ((arg(u)>=0.5*M_PI || arg(u)<-0.5*M_PI ))\n        u = -u;\n      if ((arg(v)>=0.5*M_PI || arg(v)<-0.5*M_PI ))\n        v = -v;\n      assert(fabs(computeAngle(u, v) - current_angle)<1e-5);\n\n      if ( fabs(arg(u) - arg(v)) >0.5*M_PI )\n        v = -v;\n      assert(fabs(computeAngle(u, v) - current_angle)<1e-5);\n\n      std::complex<typename DerivedV::Scalar> u1, v1;\n      typename DerivedV::Scalar diff = thetaMin*M_PI/180 - current_angle + 1e-6;\n      rotateAroundBisector(u, v, diff, u1, v1);\n\n//      if (computeAngle(u1, v1)<thetaMin*M_PI/180)\n//      {\n//        std::cerr<<\"u = [\"<<real(u)<<\",\"<<imag(u)<< \"]; v= [\"<<real(v)<<\",\"<<imag(v)<<\"];\"<<std::endl;\n//        std::cerr<<\"u1 = [\"<<real(u1)<<\",\"<<imag(u1)<< \"]; v1= [\"<<real(v1)<<\",\"<<imag(v1)<<\"];\"<<std::endl;\n//        std::cerr<<\"current_angle = \"<<current_angle<<std::endl;\n//        std::cerr<<\"aout = \"<<computeAngle(u1, v1)<< \"; theta= \"<<thetaMin*M_PI/180<<\";\"<<std::endl;\n//      }\n//      assert(computeAngle(u1, v1)>=thetaMin*M_PI/180);\n\n\n      pvU.row(j) << real(u1),imag(u1);\n      pvV.row(j) << real(v1),imag(v1);\n    }\n  }\n\n}\n\n\n//\n//template<typename DerivedV, typename DerivedF, typename DerivedO>\n//IGL_INLINE void igl::AngleBoundFFSolver<DerivedV, DerivedF, DerivedO>::\n//computeAngles(Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 1> &angles)\n//{\n//  angles.resize(data.numF,1);\n//  for (int i =0; i<data.numF; ++i)\n//  {\n//    std::complex<typename DerivedV::Scalar> u(pvU(i,0),pvU(i,1));\n//    std::complex<typename DerivedV::Scalar> v(pvV(i,0),pvV(i,1));\n//    angles[i] = fabs(arg(u) - arg(v));\n//    if (angles[i]>M_PI)\n//      angles[i] = 2*M_PI-angles[i];\n//    if (angles[i]>.5*M_PI)\n//      angles[i] = M_PI-angles[i];\n//  }\n//}\n\ntemplate<typename DerivedV, typename DerivedF, typename DerivedO>\nIGL_INLINE typename DerivedV::Scalar igl::AngleBoundFFSolver<DerivedV, DerivedF, DerivedO>::\ncomputeAngle(const std::complex<typename DerivedV::Scalar> &u,\n             const std::complex<typename DerivedV::Scalar> &v)\n{\n  typename DerivedV::Scalar angle = std::min(fabs(arg(u*conj(v))), fabs(arg(u*conj(-v))));\n\n//  typename DerivedV::Scalar angle;\n//  typename DerivedV::Scalar a1 = fabs(arg(u*conj(v)));\n//  typename DerivedV::Scalar a2 = fabs(arg(u*conj(-v)));\n//  if (a1 < a2)\n//    angle = a1;\n//  else\n//  {\n//    angle = a2; v = -v;\n//  }\n\n//  typename DerivedV::Scalar angle = fabs(arg(u) - arg(v));\n//  if (angle>M_PI)\n//  {\n//    u = -u;\n//    angle = fabs(arg(u) - arg(v));\n//  };\n//\n//  if (angle>.5*M_PI)\n//  {\n//    v = -v;\n//    angle = fabs(arg(u) - arg(v));\n//  };\n//\n//  assert(fabs(angle-angle1)<1e-6);\n\n//  if (angle>M_PI)\n//    angle = 2*M_PI-angle;\n//  if (angle>.5*M_PI)\n//    angle = M_PI-angle;\n\n//  typename DerivedV::Scalar angle = fabs(arg(u) - arg(v));\n//    if (angle>M_PI)\n//      angle = 2*M_PI-angle;\n//    if (angle>.5*M_PI)\n//      angle = M_PI-angle;\n\n  assert(angle <= .5*M_PI && angle >0);\n\n  return angle;\n}\n\n\ntemplate<typename DerivedV, typename DerivedF, typename DerivedO>\nIGL_INLINE int igl::AngleBoundFFSolver<DerivedV, DerivedF, DerivedO>::\ngetNumOutOfBounds()\n{\n  Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 1> angles;\n//  computeAngles(angles);\n  int numOoB = 0;\n  for (int i =0; i<data.numF; ++i)\n  {\n    std::complex<typename DerivedV::Scalar> u(pvU(i,0),pvU(i,1));\n    std::complex<typename DerivedV::Scalar> v(pvV(i,0),pvV(i,1));\n    typename DerivedV::Scalar angle = computeAngle(u,v);\n//    if (angles[i] <thetaMin*M_PI/180)\n    if (angle <thetaMin*M_PI/180)\n      numOoB ++;\n  }\n  return numOoB;\n}\n\ntemplate<typename DerivedV, typename DerivedF, typename DerivedO>\nIGL_INLINE void igl::AngleBoundFFSolver<DerivedV, DerivedF, DerivedO>::\nsetCoefficientsFromField()\n{\n  for (int i = 0; i <data.numF; ++i)\n  {\n    std::complex<typename DerivedV::Scalar> u(pvU(i,0),pvU(i,1));\n    std::complex<typename DerivedV::Scalar> v(pvV(i,0),pvV(i,1));\n    Acoeff(i) = u*u+v*v;\n    Bcoeff(i) = u*u*v*v;\n  }\n}\n\n\ntemplate<typename DerivedV, typename DerivedF, typename DerivedO>\nIGL_INLINE void igl::AngleBoundFFSolver<DerivedV, DerivedF, DerivedO>::\nglobalStep(const Eigen::Matrix<int, Eigen::Dynamic, 1>  &isConstrained,\n           const Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic, 1>  &Ak,\n           const Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic, 1>  &Bk)\n{\n  setCoefficientsFromField();\n\n  Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > I;\n  igl::speye(data.numF, data.numF, I);\n  Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > QA = data.DDA+lambda*I;\n  Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > fA = (-2*lambda*Acoeff).sparseView();\n\n  Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > QB = data.DDB+lambda*I;\n  Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > fB = (-2*lambda*I*Bcoeff).sparseView();\n\n  if(doHardConstraints)\n  {\n    minQuadWithKnownMini(QA, fA, isConstrained, Ak, Acoeff);\n    minQuadWithKnownMini(QB, fB, isConstrained, Bk, Bcoeff);\n  }\n  else\n  {\n    Eigen::Matrix<int, Eigen::Dynamic, 1>isknown_; isknown_.setZero(data.numF,1);\n    Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic, 1> xknown_; xknown_.setZero(0,1);\n    minQuadWithKnownMini(QA, fA, isknown_, xknown_, Acoeff);\n    minQuadWithKnownMini(QB, fB, isknown_, xknown_, Bcoeff);\n  }\n  setFieldFromCoefficients();\n\n}\n\n\ntemplate<typename DerivedV, typename DerivedF, typename DerivedO>\nIGL_INLINE void igl::AngleBoundFFSolver<DerivedV, DerivedF, DerivedO>::\nsetFieldFromCoefficients()\n{\n  for (int i = 0; i <data.numF; ++i)\n  {\n    //    poly coefficients: 1, 0, -Acoeff, 0, Bcoeff\n    //    matlab code from roots (given there are no trailing zeros in the polynomial coefficients)\n    Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic, 1> polyCoeff(5,1);\n    polyCoeff<<1., 0., -Acoeff(i), 0., Bcoeff(i);\n\n    Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic, 1> roots;\n    polyRoots<std::complex<typename DerivedV::Scalar>>(polyCoeff,roots);\n\n    std::complex<typename DerivedV::Scalar> u = roots[0];\n    int maxi = -1;\n    float maxd = -1;\n    for (int k =1; k<4; ++k)\n    {\n      float dist = abs(roots[k]+u);\n      if (dist>maxd)\n      {\n        maxd = dist;\n        maxi = k;\n      }\n    }\n    std::complex<typename DerivedV::Scalar> v = roots[maxi];\n    pvU(i,0) = real(u); pvU(i,1) = imag(u);\n    pvV(i,0) = real(v); pvV(i,1) = imag(v);\n  }\n\n}\n\ntemplate<typename DerivedV, typename DerivedF, typename DerivedO>\nIGL_INLINE void igl::AngleBoundFFSolver<DerivedV, DerivedF, DerivedO>::\nminQuadWithKnownMini(const Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > &Q,\n                     const Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > &f,\n                     const Eigen::VectorXi isConstrained,\n                     const Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic, 1> &xknown,\n                     Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic, 1> &x)\n{\n  int N = Q.rows();\n\n  int nc = xknown.rows();\n  Eigen::VectorXi known; known.setZero(nc,1);\n  Eigen::VectorXi unknown; unknown.setZero(N-nc,1);\n\n  int indk = 0, indu = 0;\n  for (int i = 0; i<N; ++i)\n    if (isConstrained[i])\n    {\n      known[indk] = i;\n      indk++;\n    }\n    else\n    {\n      unknown[indu] = i;\n      indu++;\n    }\n\n  Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar>> Quu, Quk;\n\n  igl::slice(Q,unknown, unknown, Quu);\n  igl::slice(Q,unknown, known, Quk);\n\n\n  std::vector<typename Eigen::Triplet<std::complex<typename DerivedV::Scalar> > > tripletList;\n\n  Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > fu(N-nc,1);\n\n  igl::slice(f,unknown, Eigen::VectorXi::Zero(1,1), fu);\n\n  Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > rhs = (Quk*xknown).sparseView()+.5*fu;\n\n  Eigen::SparseLU< Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar>>> solver;\n  solver.compute(-Quu);\n  if(solver.info()!=Eigen::Success)\n  {\n    std::cerr<<\"Decomposition failed!\"<<std::endl;\n    return;\n  }\n  Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar>>  b  = solver.solve(rhs);\n  if(solver.info()!=Eigen::Success)\n  {\n    std::cerr<<\"Solving failed!\"<<std::endl;\n    return;\n  }\n\n  indk = 0, indu = 0;\n  x.setZero(N,1);\n  for (int i = 0; i<N; ++i)\n    if (isConstrained[i])\n      x[i] = xknown[indk++];\n    else\n      x[i] = b.coeff(indu++,0);\n\n}\n\n\ntemplate<typename DerivedV, typename DerivedF, typename DerivedO>\nIGL_INLINE bool igl::AngleBoundFFSolver<DerivedV, DerivedF, DerivedO>::\nsolve(const Eigen::VectorXi &isConstrained,\n      const Eigen::PlainObjectBase<DerivedO> &initialSolution,\n      Eigen::PlainObjectBase<DerivedO> &output,\n      typename DerivedV::Scalar *lambdaOut)\n{\n  int numConstrained = isConstrained.sum();\n  // coefficient values\n  Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic, 1> Ak, Bk;\n\n  pvU.resize(data.numF,2);\n  pvV.resize(data.numF,2);\n  for (int fi = 0; fi <data.numF; ++fi)\n  {\n    const Eigen::Matrix<typename DerivedV::Scalar, 1, 3> &b1 = data.B1.row(fi);\n    const Eigen::Matrix<typename DerivedV::Scalar, 1, 3> &b2 = data.B2.row(fi);\n    const Eigen::Matrix<typename DerivedV::Scalar, 1, 3> &u3 = initialSolution.block(fi,0,1,3);\n    const Eigen::Matrix<typename DerivedV::Scalar, 1, 3> &v3 = initialSolution.block(fi,3,1,3);\n    pvU.row(fi)<< u3.dot(b1), u3.dot(b2);\n    pvV.row(fi)<< v3.dot(b1), v3.dot(b2);\n  }\n  setCoefficientsFromField();\n  Ak.resize(numConstrained,1);\n  Bk.resize(numConstrained,1);\n  int ind = 0;\n  for (int i = 0; i <data.numF; ++i)\n  {\n    if(isConstrained[i])\n    {\n      Ak(ind) = Acoeff[i];\n      Bk(ind) = Bcoeff[i];\n      ind ++;\n    }\n  }\n\n\n\n  typename DerivedV::Scalar smoothnessValue;\n  int oob;\n\n  smoothnessValue = (Acoeff.adjoint()*data.DDA*Acoeff + Bcoeff.adjoint()*data.DDB*Bcoeff).real()[0];\n  printf(\"\\n\\nInitial smoothness: %.5g\\n\",smoothnessValue);\n  oob = getNumOutOfBounds();\n  printf(\"\\n\\nInitial out-of-bounds: %d\\n\",oob);\n  printf(\" %d %.5g %d\\n\",-1, smoothnessValue, oob);\n\n  lambda = lambdaInit;\n  for (int iter = 0; iter<maxIter; ++iter)\n  {\n    printf(\"\\n\\n--- Iteration %d ---\\n\",iter);\n\n    localStep();\n    globalStep(isConstrained, Ak, Bk);\n\n\n    smoothnessValue = (Acoeff.adjoint()*data.DDA*Acoeff + Bcoeff.adjoint()*data.DDB*Bcoeff).real()[0];\n\n    printf(\"Smoothness: %.5g\\n\",smoothnessValue);\n\n    oob = getNumOutOfBounds();\n\n    bool stoppingCriterion = (oob == 0) ;\n    if (stoppingCriterion)\n      break;\n    lambda = lambda*lambdaMultFactor;\n//    printf(\" %d %.5g %d\\n\",iter, smoothnessValue, oob);\n\n  }\n\n  output.setZero(data.numF,6);\n  for (int fi=0; fi<data.numF; ++fi)\n  {\n    const Eigen::Matrix<typename DerivedV::Scalar, 1, 3> &b1 = data.B1.row(fi);\n    const Eigen::Matrix<typename DerivedV::Scalar, 1, 3> &b2 = data.B2.row(fi);\n    output.block(fi,0, 1, 3) = pvU(fi,0)*b1 + pvU(fi,1)*b2;\n    output.block(fi,3, 1, 3) = pvV(fi,0)*b1 + pvV(fi,1)*b2;\n  }\n\n  if (lambdaOut)\n    *lambdaOut = lambda;\n\n\n  return (oob==0);\n}\n\n\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedO>\nIGL_INLINE bool igl::angle_bound_frame_fields(const Eigen::PlainObjectBase<DerivedV> &V,\n                                            const Eigen::PlainObjectBase<DerivedF> &F,\n                                              const typename DerivedV::Scalar &thetaMin,\n                                            const Eigen::VectorXi &isConstrained,\n                                            const Eigen::PlainObjectBase<DerivedO> &initialSolution,\n                                            Eigen::PlainObjectBase<DerivedO> &output,\n                                            int maxIter,\n                                            const typename DerivedV::Scalar &lambdaInit,\n                                            const typename DerivedV::Scalar &lambdaMultFactor,\n                                              const bool doHardConstraints)\n{\n  igl::AngleBoundFFSolverData<DerivedV, DerivedF> csdata(V, F);\n  igl::AngleBoundFFSolver<DerivedV, DerivedF, DerivedO> cs(csdata, thetaMin, maxIter, lambdaInit, lambdaMultFactor, doHardConstraints);\n  return (cs.solve(isConstrained, initialSolution, output));\n}\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedO>\nIGL_INLINE bool igl::angle_bound_frame_fields(const igl::AngleBoundFFSolverData<DerivedV, DerivedF> &csdata,\n                                              const typename DerivedV::Scalar &thetaMin,\n                                            const Eigen::VectorXi &isConstrained,\n                                            const Eigen::PlainObjectBase<DerivedO> &initialSolution,\n                                            Eigen::PlainObjectBase<DerivedO> &output,\n                                            int maxIter,\n                                            const typename DerivedV::Scalar &lambdaInit,\n                                            const typename DerivedV::Scalar &lambdaMultFactor,\n                                              const bool doHardConstraints,\n                                            typename DerivedV::Scalar *lambdaOut)\n{\n  igl::AngleBoundFFSolver<DerivedV, DerivedF, DerivedO> cs(csdata, thetaMin, maxIter, lambdaInit, lambdaMultFactor, doHardConstraints);\n  return (cs.solve(isConstrained, initialSolution, output, lambdaOut));\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/angle_bound_frame_fields.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_ANGLE_BOUND_FRAME_FIELDS_H\n#define IGL_ANGLE_BOUND_FRAME_FIELDS_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Core>\n#include <vector>\n\nnamespace igl {\n  //todo\n  /// Given 2 vectors centered on origin calculate the rotation matrix from first to the second\n\n  // Inputs:\n  //   v0, v1         the two #3 by 1 vectors\n  //   normalized     boolean, if false, then the vectors are normalized prior to the calculation\n  // Output:\n  //                  3 by 3 rotation matrix that takes v0 to v1\n  //\n  template <typename DerivedV, typename DerivedF>\n  class AngleBoundFFSolverData;\n\n  template <typename DerivedV, typename DerivedF, typename DerivedO>\n  IGL_INLINE bool angle_bound_frame_fields(const Eigen::PlainObjectBase<DerivedV> &V,\n                                         const Eigen::PlainObjectBase<DerivedF> &F,\n                                           const typename DerivedV::Scalar &thetaMin,\n                                         const Eigen::VectorXi &isConstrained,\n                                         const Eigen::PlainObjectBase<DerivedO> &initialSolution,\n                                         Eigen::PlainObjectBase<DerivedO> &output,\n                                         int _maxIter = 50,\n                                         const typename DerivedV::Scalar &_lambdaInit = 100,\n                                         const typename DerivedV::Scalar &_lambdaMultFactor = 1.5,\n                                           const bool _doHardConstraints = false);\n\n  template <typename DerivedV, typename DerivedF, typename DerivedO>\n  IGL_INLINE bool angle_bound_frame_fields(const AngleBoundFFSolverData<DerivedV, DerivedF> &csdata,\n                                           const typename DerivedV::Scalar &thetaMin,\n                                         const Eigen::VectorXi &isConstrained,\n                                         const Eigen::PlainObjectBase<DerivedO> &initialSolution,\n                                         Eigen::PlainObjectBase<DerivedO> &output,\n                                         int _maxIter = 50,\n                                         const typename DerivedV::Scalar &_lambdaInit = 100,\n                                         const typename DerivedV::Scalar &_lambdaMultFactor = 1.5,\n                                           const bool _doHardConstraints = false,\n                                         typename DerivedV::Scalar *lambdaOut = NULL);\n\n};\n\n\n#ifndef IGL_STATIC_LIBRARY\n#include \"angle_bound_frame_fields.cpp\"\n#endif\n\n\n#endif \n"
  },
  {
    "path": "libs/libigl/include/igl/angles.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2015 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"angles.h\"\n#include <Eigen/Geometry>\n#include <cassert>\n\ntemplate <\n  typename DerivedV,\n  typename DerivedF,\n  typename Derivedtheta>\nvoid igl::angles(\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  Eigen::PlainObjectBase<Derivedtheta>& theta)\n{\n  theta.resize(F.rows(),F.cols());\n\n  auto corner = [](const Eigen::PlainObjectBase<DerivedV>& x, const Eigen::PlainObjectBase<DerivedV>& y, const Eigen::PlainObjectBase<DerivedV>& z)\n  {\n    Eigen::RowVector3d v1 = (x-y).normalized();\n    Eigen::RowVector3d v2 = (z-y).normalized();\n\n    // http://stackoverflow.com/questions/10133957/signed-angle-between-two-vectors-without-a-reference-plane\n    double s = v1.cross(v2).norm();\n    double c = v1.dot(v2);\n\n    return atan2(s, c);\n  };\n\n  for(unsigned i=0; i<F.rows(); ++i)\n  {\n    for(unsigned j=0; j<F.cols(); ++j)\n    {\n      theta(i,j) = corner(\n        V.row(F(i,int(j-1+F.cols())%F.cols())),\n        V.row(F(i,j)),\n        V.row(F(i,(j+1+F.cols())%F.cols()))\n        );\n    }\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template specialization\ntemplate void igl::angles<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/angles.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2015 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_ANGLES_H\n#define IGL_ANGLES_H\n#ifdef _WIN32\n#  pragma message ( \"Deprecated. Use igl/internal_angles.h instead\" )\n#else\n#  warning \"Deprecated. Use igl/internal_angles.h instead\"\n#endif\n\n\n#include \"igl_inline.h\"\n#include \"deprecated.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // ANGLES Compute angles for each corner of each triangle\n  //\n  // Inputs:\n  //   V  #V by dim list of vertex positions\n  //   F  #V by 3[4] list of triangle[quads] indices\n  // Outputs:\n  //   theta  #F by 3[4] list of angles for each corner (in radians)\n  //\n  template <\n  typename DerivedV,\n  typename DerivedF,\n  typename Derivedtheta>\n  IGL_INLINE \n  IGL_DEPRECATED(\n    void angles(\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    Eigen::PlainObjectBase<Derivedtheta>& theta));\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"angles.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/angular_distance.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"angular_distance.h\"\n#include <igl/EPS.h>\n#include <igl/PI.h>\nIGL_INLINE double igl::angular_distance(\n  const Eigen::Quaterniond & A,\n  const Eigen::Quaterniond & B)\n{\n  assert(fabs(A.norm()-1)<FLOAT_EPS && \"A should be unit norm\");\n  assert(fabs(B.norm()-1)<FLOAT_EPS && \"B should be unit norm\");\n  //// acos is always in [0,2*pi)\n  //return acos(fabs(A.dot(B)));\n  return fmod(2.*acos(A.dot(B)),2.*PI);\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/angular_distance.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_ANGULAR_DISTANCE_H\n#define IGL_ANGULAR_DISTANCE_H\n#include \"igl_inline.h\"\n#include <Eigen/Geometry>\nnamespace igl\n{\n  // The \"angular distance\" between two unit quaternions is the angle of the\n  // smallest rotation (treated as an Axis and Angle) that takes A to B.\n  //\n  // Inputs:\n  //   A  unit quaternion\n  //   B  unit quaternion\n  // Returns angular distance\n  IGL_INLINE double angular_distance(\n    const Eigen::Quaterniond & A,\n    const Eigen::Quaterniond & B);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#include \"angular_distance.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/anttweakbar/ReAntTweakBar.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"ReAntTweakBar.h\"\n\n#include <cstdio>\n#include <cstring>\n#include <sstream>\n#include <iostream>\n#include <iomanip>\n#include <map>\n\n// GLOBAL WRAPPERS\nnamespace \n{\n  std::map<\n    TwType,std::pair<const char *,std::vector<TwEnumVal> > \n    > ReTw_custom_types;\n}\n\nIGL_INLINE TwType igl::anttweakbar::ReTwDefineEnum(\n  const char *name, \n  const TwEnumVal *enumValues, \n  unsigned int nbValues)\n{\n  using namespace std;\n  // copy enum valus into vector\n  std::vector<TwEnumVal> enum_vals;\n  enum_vals.resize(nbValues);\n  for(unsigned int j = 0; j<nbValues;j++)\n  {\n    enum_vals[j] = enumValues[j];\n  }\n  TwType type = TwDefineEnum(name,enumValues,nbValues);\n\n  ReTw_custom_types[type] = \n    std::pair<const char *,std::vector<TwEnumVal> >(name,enum_vals);\n\n  return type;\n}\n\nIGL_INLINE TwType igl::anttweakbar::ReTwDefineEnumFromString(\n  const char * _Name,\n  const char * _EnumString)\n{\n  // Taken directly from TwMgr.cpp, just replace TwDefineEnum with\n  // ReTwDefineEnum\n  using namespace std;\n  {\n    if (_EnumString == NULL) \n        return ReTwDefineEnum(_Name, NULL, 0);\n\n    // split enumString\n    stringstream EnumStream(_EnumString);\n    string Label;\n    vector<string> Labels;\n    while( getline(EnumStream, Label, ',') ) {\n        // trim Label\n        size_t Start = Label.find_first_not_of(\" \\n\\r\\t\");\n        size_t End = Label.find_last_not_of(\" \\n\\r\\t\");\n        if( Start==string::npos || End==string::npos )\n            Label = \"\";\n        else\n            Label = Label.substr(Start, (End-Start)+1);\n        // store Label\n        Labels.push_back(Label);\n    }\n    // create TwEnumVal array\n    vector<TwEnumVal> Vals(Labels.size());\n    for( int i=0; i<(int)Labels.size(); i++ )\n    {\n        Vals[i].Value = i;\n        // Wrong:\n        //Vals[i].Label = Labels[i].c_str();\n        // Allocate char on heap\n        // http://stackoverflow.com/a/10050258/148668\n        char * c_label = new char[Labels[i].length()+1];\n        std::strcpy(c_label, Labels[i].c_str());\n        Vals[i].Label = c_label;\n    }\n\n    const TwType type = \n      ReTwDefineEnum(_Name, Vals.empty() ? \n        NULL : \n        &(Vals[0]), (unsigned int)Vals.size());\n    return type;\n  }\n}\n\nnamespace\n{\n  struct ReTwTypeString\n  {\n    TwType type;\n    const char * type_str;\n  };\n\n  #define RETW_NUM_DEFAULT_TYPE_STRINGS 23\n  ReTwTypeString ReTwDefaultTypeStrings[RETW_NUM_DEFAULT_TYPE_STRINGS] = \n  {\n    {TW_TYPE_UNDEF,\"TW_TYPE_UNDEF\"},\n    {TW_TYPE_BOOLCPP,\"TW_TYPE_BOOLCPP\"},\n    {TW_TYPE_BOOL8,\"TW_TYPE_BOOL8\"},\n    {TW_TYPE_BOOL16,\"TW_TYPE_BOOL16\"},\n    {TW_TYPE_BOOL32,\"TW_TYPE_BOOL32\"},\n    {TW_TYPE_CHAR,\"TW_TYPE_CHAR\"},\n    {TW_TYPE_INT8,\"TW_TYPE_INT8\"},\n    {TW_TYPE_UINT8,\"TW_TYPE_UINT8\"},\n    {TW_TYPE_INT16,\"TW_TYPE_INT16\"},\n    {TW_TYPE_UINT16,\"TW_TYPE_UINT16\"},\n    {TW_TYPE_INT32,\"TW_TYPE_INT32\"},\n    {TW_TYPE_UINT32,\"TW_TYPE_UINT32\"},\n    {TW_TYPE_FLOAT,\"TW_TYPE_FLOAT\"},\n    {TW_TYPE_DOUBLE,\"TW_TYPE_DOUBLE\"},\n    {TW_TYPE_COLOR32,\"TW_TYPE_COLOR32\"},\n    {TW_TYPE_COLOR3F,\"TW_TYPE_COLOR3F\"},\n    {TW_TYPE_COLOR4F,\"TW_TYPE_COLOR4F\"},\n    {TW_TYPE_CDSTRING,\"TW_TYPE_CDSTRING\"},\n    {TW_TYPE_STDSTRING,\"TW_TYPE_STDSTRING\"},\n    {TW_TYPE_QUAT4F,\"TW_TYPE_QUAT4F\"},\n    {TW_TYPE_QUAT4D,\"TW_TYPE_QUAT4D\"},\n    {TW_TYPE_DIR3F,\"TW_TYPE_DIR3F\"},\n    {TW_TYPE_DIR3D,\"TW_TYPE_DIR3D\"}\n  };\n}\n\nIGL_INLINE igl::anttweakbar::ReTwBar::ReTwBar():\n bar(NULL),\n  name(),\n  rw_items(),cb_items()\n{\n}\n\nIGL_INLINE igl::anttweakbar::ReTwBar::ReTwBar(\n    const igl::anttweakbar::ReTwBar & that):\n  bar(that.bar),\n  name(that.name),\n  rw_items(that.rw_items),\n  cb_items(that.cb_items)\n{\n}\n\nIGL_INLINE igl::anttweakbar::ReTwBar & \nigl::anttweakbar::ReTwBar::operator=(const igl::anttweakbar::ReTwBar & that)\n{\n  // check for self assignment\n  if(this != &that)\n  {\n    bar = that.bar;\n    rw_items = that.rw_items;\n    cb_items = that.cb_items;\n  }\n  return *this;\n}\n\n\n// BAR WRAPPERS\nIGL_INLINE void igl::anttweakbar::ReTwBar::TwNewBar(const char * _name)\n{\n  this->bar = ::TwNewBar(_name);\n  // Alec: This causes trouble (not sure why) in multiple applications\n  // (medit, puppet) Probably there is some sort of memory corrpution.\n  // this->name = _name;\n  // Suspiciously this also fails:\n  //this->name = \"foobar\";\n}\n\nIGL_INLINE int igl::anttweakbar::ReTwBar::TwAddVarRW(\n  const char *name, \n  TwType type, \n  void *var, \n  const char *def,\n  const bool record)\n{\n  int ret = ::TwAddVarRW(this->bar,name,type,var,def);\n  if(ret && record)\n  {\n    rw_items.push_back(ReTwRWItem(name,type,var));\n  }\n  return ret;\n}\n\nIGL_INLINE int igl::anttweakbar::ReTwBar::TwAddVarCB(\n  const char *name, \n  TwType type, \n  TwSetVarCallback setCallback, \n  TwGetVarCallback getCallback, \n  void *clientData, \n  const char *def,\n  const bool record)\n{\n  int ret = \n    ::TwAddVarCB(this->bar,name,type,setCallback,getCallback,clientData,def);\n  if(ret && record)\n  {\n    cb_items.push_back(ReTwCBItem(name,type,setCallback,getCallback,clientData));\n  }\n  return ret;\n}\n\nIGL_INLINE int igl::anttweakbar::ReTwBar::TwAddVarRO(\n  const char *name, \n  TwType type, \n  void *var, \n  const char *def)\n{\n  int ret = ::TwAddVarRO(this->bar,name,type,var,def);\n  // Read only variables are not recorded\n  //if(ret)\n  //{\n  //  rw_items.push_back(ReTwRWItem(name,type,var));\n  //}\n  return ret;\n}\n\nIGL_INLINE int igl::anttweakbar::ReTwBar::TwAddButton(\n  const char *name, \n  TwButtonCallback buttonCallback, \n  void *clientData, \n  const char *def)\n{\n  int ret = \n    ::TwAddButton(this->bar,name,buttonCallback,clientData,def);\n  // buttons are not recorded\n  //if(ret)\n  //{\n  //  cb_items.push_back(ReTwCBItem(name,type,setCallback,getCallback,clientData));\n  //}\n  return ret;\n}\n\nIGL_INLINE int igl::anttweakbar::ReTwBar::TwSetParam(\n  const char *varName, \n  const char *paramName, \n  TwParamValueType paramValueType, \n  unsigned int inValueCount, \n  const void *inValues)\n{\n  // For now just pass these along\n  return \n    ::TwSetParam(\n      this->bar,\n      varName,\n      paramName,\n      paramValueType,\n      inValueCount,\n      inValues);\n}\n\nIGL_INLINE int igl::anttweakbar::ReTwBar::TwGetParam(\n  const char *varName, \n  const char *paramName, \n  TwParamValueType paramValueType, \n  unsigned int outValueMaxCount,\n  void *outValues)\n{\n  return \n    ::TwGetParam(\n      this->bar,\n      varName,\n      paramName,\n      paramValueType,\n      outValueMaxCount,\n      outValues);\n}\n\nIGL_INLINE int igl::anttweakbar::ReTwBar::TwRefreshBar()\n{\n  return ::TwRefreshBar(this->bar);\n}\n\nIGL_INLINE int igl::anttweakbar::ReTwBar::TwTerminate()\n{\n  //std::cout<<\"TwTerminate\"<<std::endl;\n  int r = ::TwTerminate();\n  //std::cout<<\"  \"<<r<<std::endl;\n  return r;\n}\n\nIGL_INLINE bool igl::anttweakbar::ReTwBar::save(const char *file_name)\n{\n  FILE * fp;\n  if(file_name == NULL)\n  {\n    fp = stdout;\n  }else\n  {\n    fp = fopen(file_name,\"w\");\n  }\n\n  if(fp == NULL)\n  {\n    printf(\"ERROR: not able to open %s for writing...\\n\",file_name);\n    return false;\n  }\n\n  // Print all RW variables\n  for(\n    std::vector<ReTwRWItem>::iterator it = rw_items.begin(); \n    it != rw_items.end(); \n    it++)\n  {\n    std::string s = (*it).name;\n    const char * name = s.c_str();\n    TwType type = (*it).type;\n    void * var = (*it).var;\n    fprintf(fp,\"%s: %s\\n\",\n      name,\n      get_value_as_string(var,type).c_str());\n  }\n\n  char var[REANTTWEAKBAR_MAX_CB_VAR_SIZE];\n  // Print all CB variables\n  for(\n    std::vector<ReTwCBItem>::iterator it = cb_items.begin(); \n    it != cb_items.end(); \n    it++)\n  {\n    const char * name = it->name.c_str();\n    TwType type = it->type;\n    //TwSetVarCallback setCallback = it->setCallback;\n    TwGetVarCallback getCallback = it->getCallback;\n    void * clientData = it->clientData;\n    // I'm not sure how to do what I want to do. getCallback needs to be sure\n    // that it can write to var. So var needs to point to a valid and big\n    // enough chunk of memory\n    getCallback(var,clientData);\n    fprintf(fp,\"%s: %s\\n\",\n      name,\n      get_value_as_string(var,type).c_str());\n  }\n\n  fprintf(fp,\"\\n\");\n\n  if(file_name != NULL)\n  {\n    fclose(fp);\n  }\n  // everything succeeded\n  return true;\n}\n\nIGL_INLINE std::string igl::anttweakbar::ReTwBar::get_value_as_string(\n  void * var, \n  TwType type)\n{\n  std::stringstream sstr;\n  switch(type)\n  {\n    case TW_TYPE_BOOLCPP:\n      {\n        sstr << \"TW_TYPE_BOOLCPP\" << \" \";\n        sstr << *(static_cast<bool*>(var));\n        break;\n      }\n    case TW_TYPE_QUAT4D:\n      {\n        sstr << \"TW_TYPE_QUAT4D\" << \" \";\n        // Q: Why does casting to double* work? shouldn't I have to cast to\n        // double**?\n        double * q = static_cast<double*>(var);\n        sstr << std::setprecision(15) << q[0] << \" \" << q[1] << \" \" << q[2] << \" \" << q[3];\n        break;\n      }\n    case TW_TYPE_QUAT4F:\n      {\n        sstr << \"TW_TYPE_QUAT4F\" << \" \";\n        // Q: Why does casting to float* work? shouldn't I have to cast to\n        // float**?\n        float * q = static_cast<float*>(var);\n        sstr << q[0] << \" \" << q[1] << \" \" << q[2] << \" \" << q[3];\n        break;\n      }\n    case TW_TYPE_COLOR4F:\n      {\n        sstr << \"TW_TYPE_COLOR4F\" << \" \";\n        float * c = static_cast<float*>(var);\n        sstr << c[0] << \" \" << c[1] << \" \" << c[2] << \" \" << c[3];\n        break;\n      }\n    case TW_TYPE_COLOR3F:\n      {\n        sstr << \"TW_TYPE_COLOR3F\" << \" \";\n        float * c = static_cast<float*>(var);\n        sstr << c[0] << \" \" << c[1] << \" \" << c[2];\n        break;\n      }\n    case TW_TYPE_DIR3D:\n      {\n        sstr << \"TW_TYPE_DIR3D\" << \" \";\n        double * d = static_cast<double*>(var);\n        sstr << std::setprecision(15) << d[0] << \" \" << d[1] << \" \" << d[2];\n        break;\n      }\n    case TW_TYPE_DIR3F:\n      {\n        sstr << \"TW_TYPE_DIR3F\" << \" \";\n        float * d = static_cast<float*>(var);\n        sstr << d[0] << \" \" << d[1] << \" \" << d[2];\n        break;\n      }\n    case TW_TYPE_BOOL32:\n      {\n        sstr << \"TW_TYPE_BOOL32\" << \" \";\n        sstr << *(static_cast<int*>(var));\n        break;\n      }\n    case TW_TYPE_UINT8:\n      {\n        sstr << \"TW_TYPE_UINT8\" << \" \";\n        // Cast to int so that it's human readable\n        sstr << (int)*(static_cast<unsigned char*>(var));\n        break;\n      }\n    case TW_TYPE_INT32:\n      {\n        sstr << \"TW_TYPE_INT32\" << \" \";\n        sstr << *(static_cast<int*>(var));\n        break;\n      }\n    case TW_TYPE_UINT32:\n      {\n        sstr << \"TW_TYPE_UINT32\" << \" \";\n        sstr << *(static_cast<unsigned int*>(var));\n        break;\n      }\n    case TW_TYPE_FLOAT:\n      {\n        sstr << \"TW_TYPE_FLOAT\" << \" \";\n        sstr << *(static_cast<float*>(var));\n        break;\n      }\n    case TW_TYPE_DOUBLE:\n      {\n        sstr << \"TW_TYPE_DOUBLE\" << \" \";\n        sstr << std::setprecision(15) << *(static_cast<double*>(var));\n        break;\n      }\n    case TW_TYPE_STDSTRING:\n      {\n        sstr << \"TW_TYPE_STDSTRING\" << \" \";\n        std::string *destPtr = static_cast<std::string *>(var);\n        sstr << destPtr->c_str();\n        break;\n      }\n    default:\n      {\n        using namespace std;\n        std::map<TwType,std::pair<const char *,std::vector<TwEnumVal> > >::const_iterator iter = \n          ReTw_custom_types.find(type);\n        if(iter != ReTw_custom_types.end())\n        {\n          sstr << (*iter).second.first << \" \";\n          int enum_val = *(static_cast<int*>(var));\n          // try find display name for enum value\n          std::vector<TwEnumVal>::const_iterator eit = (*iter).second.second.begin();\n          bool found = false;\n          for(;eit<(*iter).second.second.end();eit++)\n          {\n            if(enum_val == eit->Value)\n            {\n              sstr << eit->Label;\n              found = true;\n              break;\n            }\n          }\n          if(!found)\n          {\n            sstr << \"ERROR_ENUM_VALUE_NOT_DEFINED\";\n          }\n        }else\n        {\n          sstr << \"ERROR_TYPE_NOT_SUPPORTED\";\n        }\n        break;\n      }\n  }\n  return sstr.str();\n}\n\nIGL_INLINE bool igl::anttweakbar::ReTwBar::load(const char *file_name)\n{\n  FILE * fp;\n  fp = fopen(file_name,\"r\");\n\n  if(fp == NULL)\n  {\n    printf(\"ERROR: not able to open %s for reading...\\n\",file_name);\n    return false;\n  }\n\n  // go through file line by line\n  char line[REANTTWEAKBAR_MAX_LINE];\n  bool still_comments;\n  char name[REANTTWEAKBAR_MAX_WORD];\n  char type_str[REANTTWEAKBAR_MAX_WORD];\n  char value_str[REANTTWEAKBAR_MAX_WORD];\n\n\n  // line number\n  int j = 0;\n  bool finished = false;\n  while(true)\n  {\n    // Eat comments\n    still_comments = true;\n    while(still_comments)\n    {\n      if(fgets(line,REANTTWEAKBAR_MAX_LINE,fp) == NULL)\n      {\n        finished = true;\n        break;\n      }\n      // Blank lines and lines that begin with # are comments\n      still_comments = (line[0] == '#' || line[0] == '\\n');\n      j++;\n    }\n    if(finished)\n    {\n      break;\n    }\n\n    sscanf(line,\"%[^:]: %s %[^\\n]\",name,type_str,value_str);\n    //printf(\"%s: %s %s\\n\",name, type_str,value_str);\n\n    TwType type;\n    if(!type_from_string(type_str,type))\n    {\n      printf(\"ERROR: %s type not found... Skipping...\\n\",type_str);\n      continue;\n    }\n    set_value_from_string(name,type,value_str);\n\n  }\n\n  fclose(fp);\n  \n  // everything succeeded\n  return true;\n}\n\nIGL_INLINE bool igl::anttweakbar::ReTwBar::type_from_string(\n  const char *type_str, TwType & type)\n{\n  // first check default types\n  for(int j = 0; j < RETW_NUM_DEFAULT_TYPE_STRINGS; j++)\n  {\n    if(strcmp(type_str,ReTwDefaultTypeStrings[j].type_str) == 0)\n    {\n      type = ReTwDefaultTypeStrings[j].type;\n      return true;\n      break;\n    }\n  }\n\n  // then check custom types\n  std::map<\n    TwType,std::pair<const char *,std::vector<TwEnumVal> > \n    >::const_iterator iter = \n    ReTw_custom_types.begin();\n  for(;iter != ReTw_custom_types.end(); iter++)\n  {\n    if(strcmp((*iter).second.first,type_str)==0)\n    {\n      type = (*iter).first;\n      return true;\n    }\n  }\n  return false;\n}\n\nbool igl::anttweakbar::ReTwBar::set_value_from_string(\n  const char * name, \n  TwType type, \n  const char * value_str)\n{\n  void * value = NULL;\n  // possible value slots\n  int i;\n  float v;\n  double dv;\n  float f[4];\n  double d[4];\n  bool b;\n  unsigned int u;\n  unsigned char uc;\n  std::string s;\n\n  // First try to get value from default types\n  switch(type)\n  {\n    case TW_TYPE_BOOLCPP:\n      {\n        int ib;\n        if(sscanf(value_str,\" %d\",&ib) == 1)\n        {\n          b = ib!=0;\n          value = &b;\n        }else\n        {\n          printf(\"ERROR: Bad value format...\\n\");\n          return false;\n        }\n        break;\n      }\n    case TW_TYPE_QUAT4D:\n    //case TW_TYPE_COLOR4D:\n      {\n        if(sscanf(value_str,\" %lf %lf %lf %lf\",&d[0],&d[1],&d[2],&d[3]) == 4)\n        {\n          value = &d;\n        }else\n        {\n          printf(\"ERROR: Bad value format...\\n\");\n          return false;\n        }\n        break;\n      }\n    case TW_TYPE_QUAT4F:\n    case TW_TYPE_COLOR4F:\n      {\n        if(sscanf(value_str,\" %f %f %f %f\",&f[0],&f[1],&f[2],&f[3]) == 4)\n        {\n          value = &f;\n        }else\n        {\n          printf(\"ERROR: Bad value format...\\n\");\n          return false;\n        }\n        break;\n      }\n    //case TW_TYPE_COLOR3D:\n    case TW_TYPE_DIR3D:\n      {\n        if(sscanf(value_str,\" %lf %lf %lf\",&d[0],&d[1],&d[2]) == 3)\n        {\n          value = &d;\n        }else\n        {\n          printf(\"ERROR: Bad value format...\\n\");\n          return false;\n        }\n        break;\n      }\n    case TW_TYPE_COLOR3F:\n    case TW_TYPE_DIR3F:\n      {\n        if(sscanf(value_str,\" %f %f %f\",&f[0],&f[1],&f[2]) == 3)\n        {\n          value = &f;\n        }else\n        {\n          printf(\"ERROR: Bad value format...\\n\");\n          return false;\n        }\n        break;\n      }\n    case TW_TYPE_UINT8:\n      {\n        if(sscanf(value_str,\" %d\",&i) == 1)\n        {\n          // Cast to unsigned char\n          uc = (unsigned char) i;\n          value = &uc;\n        }else\n        {\n          printf(\"ERROR: Bad value format...\\n\");\n          return false;\n        }\n        break;\n      }\n    case TW_TYPE_BOOL32:\n    case TW_TYPE_INT32:\n      {\n        if(sscanf(value_str,\" %d\",&i) == 1)\n        {\n          value = &i;\n        }else\n        {\n          printf(\"ERROR: Bad value format...\\n\");\n          return false;\n        }\n        break;\n      }\n    case TW_TYPE_UINT32:\n      {\n        if(sscanf(value_str,\" %u\",&u) == 1)\n        {\n          value = &u;\n        }else\n        {\n          printf(\"ERROR: Bad value format...\\n\");\n          return false;\n        }\n        break;\n      }\n    case TW_TYPE_FLOAT:\n      {\n        if(sscanf(value_str,\" %f\",&v) == 1)\n        {\n          value = &v;\n        }else\n        {\n          printf(\"ERROR: Bad value format...\\n\");\n          return false;\n        }\n        break;\n      }\n    case TW_TYPE_DOUBLE:\n      {\n        if(sscanf(value_str,\" %lf\",&dv) == 1)\n        {\n          value = &dv;\n        }else\n        {\n          printf(\"ERROR: Bad value format...\\n\");\n          return false;\n        }\n        break;\n      }\n    case TW_TYPE_STDSTRING:\n      {\n        s  = value_str;\n        value = &s;\n        break;\n      }\n    default:\n      // Try to find type in custom enum types\n      std::map<TwType,std::pair<const char *,std::vector<TwEnumVal> > >::const_iterator iter = \n        ReTw_custom_types.find(type);\n      if(iter != ReTw_custom_types.end())\n      {\n        std::vector<TwEnumVal>::const_iterator eit = (*iter).second.second.begin();\n        bool found = false;\n        for(;eit<(*iter).second.second.end();eit++)\n        {\n          if(strcmp(value_str,eit->Label) == 0)\n          {\n            i = eit->Value;\n            value = &i;\n            found = true;\n            break;\n          }\n        }\n        if(!found)\n        {\n          printf(\"ERROR_ENUM_VALUE_NOT_DEFINED\");\n        }\n      }else\n      {\n        printf(\"ERROR_TYPE_NOT_SUPPORTED\\n\");\n      }\n\n      break;\n  }\n\n\n  // Find variable based on name\n  // First look in RW items\n  bool item_found = false;\n  for(\n    std::vector<ReTwRWItem>::iterator it = rw_items.begin(); \n    it != rw_items.end(); \n    it++)\n  {\n    if(it->name == name)\n    {\n      void * var = it->var;\n      switch(type)\n      {\n        case TW_TYPE_BOOLCPP:\n          {\n            bool * bvar = static_cast<bool*>(var);\n            bool * bvalue = static_cast<bool*>(value);\n            *bvar = *bvalue;\n            break;\n          }\n        case TW_TYPE_QUAT4D:\n        //case TW_TYPE_COLOR4D:\n          {\n            double * dvar = static_cast<double*>(var);\n            double * dvalue = static_cast<double*>(value);\n            dvar[0] = dvalue[0];\n            dvar[1] = dvalue[1];\n            dvar[2] = dvalue[2];\n            dvar[3] = dvalue[3];\n            break;\n          }\n        case TW_TYPE_QUAT4F:\n        case TW_TYPE_COLOR4F:\n          {\n            float * fvar = static_cast<float*>(var);\n            float * fvalue = static_cast<float*>(value);\n            fvar[0] = fvalue[0];\n            fvar[1] = fvalue[1];\n            fvar[2] = fvalue[2];\n            fvar[3] = fvalue[3];\n            break;\n          }\n        //case TW_TYPE_COLOR3D:\n        case TW_TYPE_DIR3D:\n          {\n            double * dvar = static_cast<double*>(var);\n            double * dvalue = static_cast<double*>(value);\n            dvar[0] = dvalue[0];\n            dvar[1] = dvalue[1];\n            dvar[2] = dvalue[2];\n            break;\n          }\n        case TW_TYPE_COLOR3F:\n        case TW_TYPE_DIR3F:\n          {\n            float * fvar = static_cast<float*>(var);\n            float * fvalue = static_cast<float*>(value);\n            fvar[0] = fvalue[0];\n            fvar[1] = fvalue[1];\n            fvar[2] = fvalue[2];\n            break;\n          }\n        case TW_TYPE_UINT8:\n          {\n            unsigned char * ucvar = static_cast<unsigned char*>(var);\n            unsigned char * ucvalue = static_cast<unsigned char*>(value);\n            *ucvar = *ucvalue;\n            break;\n          }\n        case TW_TYPE_BOOL32:\n        case TW_TYPE_INT32:\n          {\n            int * ivar = static_cast<int*>(var);\n            int * ivalue = static_cast<int*>(value);\n            *ivar = *ivalue;\n            break;\n          }\n        case TW_TYPE_UINT32:\n          {\n            unsigned int * uvar =   static_cast<unsigned int*>(var);\n            unsigned int * uvalue = static_cast<unsigned int*>(value);\n            *uvar = *uvalue;\n            break;\n          }\n        case TW_TYPE_FLOAT:\n          {\n            float * fvar = static_cast<float*>(var);\n            float * fvalue = static_cast<float*>(value);\n            *fvar = *fvalue;\n            break;\n          }\n        case TW_TYPE_DOUBLE:\n          {\n            double * dvar =   static_cast<double*>(var);\n            double * fvalue = static_cast<double*>(value);\n            *dvar = *fvalue;\n            break;\n          }\n        case TW_TYPE_STDSTRING:\n          {\n            std::string * svar =   static_cast<std::string*>(var);\n            std::string * svalue = static_cast<std::string*>(value);\n            *svar = *svalue;\n            break;\n          }\n        default:\n          // Try to find type in custom enum types\n          std::map<TwType,std::pair<const char *,std::vector<TwEnumVal> > >::iterator iter = \n            ReTw_custom_types.find(type);\n          if(iter != ReTw_custom_types.end())\n          {\n            int * ivar = static_cast<int*>(var);\n            std::vector<TwEnumVal>::iterator eit = (*iter).second.second.begin();\n            bool found = false;\n            for(;eit<(*iter).second.second.end();eit++)\n            {\n              if(strcmp(value_str,eit->Label) == 0)\n              {\n                *ivar = eit->Value;\n                found = true;\n                break;\n              }\n            }\n            if(!found)\n            {\n              printf(\"ERROR_ENUM_VALUE_NOT_DEFINED\");\n            }\n          }else\n          {\n            printf(\"ERROR_TYPE_NOT_SUPPORTED\\n\");\n          }\n          break;\n      }\n      item_found = true;\n      break;\n    }\n  }\n\n  // Try looking in CB items\n  if(!item_found)\n  {\n    for(\n      std::vector<ReTwCBItem>::iterator it = cb_items.begin(); \n      it != cb_items.end(); \n      it++)\n    {\n      if(it->name==name)\n      {\n        it->setCallback(value,it->clientData);\n        item_found = true;\n        break;\n      }\n    }\n  }\n\n  if(!item_found)\n  {\n    printf(\"ERROR: item '%s' not found\\n\",name);\n  }\n  return true;\n}\n\nIGL_INLINE const std::vector<igl::anttweakbar::ReTwRWItem> & \n  igl::anttweakbar::ReTwBar::get_rw_items()\n{\n  return rw_items;\n}\n\nIGL_INLINE const std::vector<igl::anttweakbar::ReTwCBItem> & \n  igl::anttweakbar::ReTwBar::get_cb_items()\n{\n  return cb_items;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/anttweakbar/ReAntTweakBar.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_ANTTWEAKBAR_REANTTWEAKBAR_H\n#define IGL_ANTTWEAKBAR_REANTTWEAKBAR_H\n#include \"../igl_inline.h\"\n// ReAntTweakBar is a minimal wrapper for the AntTweakBar library that allows\n// \"bars\" to be saved and load from disk. Changing your existing app that uses\n// AntTweakBar to use ReAntTweakBar is trivial.\n// \n// Many (but not all) variable types are supported. I'll try to keep track them\n// here:\n//   TW_TYPE_BOOLCPP\n//   TW_TYPE_QUAT4F\n//   TW_TYPE_QUAT4D\n//   TW_TYPE_COLOR4F\n//   TW_TYPE_COLOR4D\n//   TW_TYPE_COLOR3F\n//   TW_TYPE_DIR3F\n//   TW_TYPE_DIR3D\n//   TW_TYPE_BOOL32\n//   TW_TYPE_INT32\n//   TW_TYPE_UINT32\n//   TW_TYPE_FLOAT\n//   TW_TYPE_DOUBLE\n//   TW_TYPE_UINT8\n//   and\n//   custom TwTypes made with TwDefineEnum\n// \n// I'm working on adding the rest on an as-needed basis. Adding a new type only\n// requires changes in a few places...\n// \n//\n//\n\n// This allows the user to have a non-global, static installation of\n// AntTweakBar\n#include <AntTweakBar.h>\n// Instead of including AntTweakBar.h, just define the necessary types\n// Types used:\n//   - TwType\n//   - TwEnumVal\n//   - TwSetVarCallback\n//   - TwGetVarCallback\n//   - TwBar\n//   - TwButtonCallback\n\n\n#include <vector>\n#include <string>\n\n#define REANTTWEAKBAR_MAX_CB_VAR_SIZE 1000\n// Max line size for reading files\n#define REANTTWEAKBAR_MAX_LINE 1000\n#define REANTTWEAKBAR_MAX_WORD 100\n\nnamespace igl\n{\n  namespace anttweakbar\n  {\n    TwType ReTwDefineEnum(\n      const char *name, \n      const TwEnumVal *enumValues, \n      unsigned int nbValues);\n    TwType ReTwDefineEnumFromString(const char * name,const char * enumString);\n    \n    struct ReTwRWItem\n    {\n      //const char * name;\n      std::string name;\n      TwType type;\n      void * var;\n      // Default constructor\n      IGL_INLINE ReTwRWItem(\n        const std::string _name,\n        TwType _type, \n        void *_var):\n        name(_name),\n        type(_type),\n        var(_var)\n      {\n      }\n      // Shallow copy constructor\n      // I solemnly swear it's OK to copy var this way\n      // Q: Is it really?\n      IGL_INLINE ReTwRWItem(const ReTwRWItem & that):\n        name(that.name),\n        type(that.type),\n        var(that.var)\n      {\n      }\n      // Shallow assignment \n      // I solemnly swear it's OK to copy var this way\n      IGL_INLINE ReTwRWItem & operator=(const ReTwRWItem & that)\n      {\n        if(this != &that)\n        {\n          this->name = that.name;\n          this->type = that.type;\n          this->var = that.var;\n        }\n        return *this;\n      }\n    };\n    \n    struct ReTwCBItem\n    {\n      //const char * name;\n      std::string name;\n      TwType type;\n      TwSetVarCallback setCallback;\n      TwGetVarCallback getCallback;\n      void * clientData;\n      // Default constructor\n      IGL_INLINE ReTwCBItem(\n        const std::string _name,\n        TwType _type, \n        TwSetVarCallback _setCallback,\n        TwGetVarCallback _getCallback,\n        void * _clientData):\n        name(_name),\n        type(_type),\n        setCallback(_setCallback),\n        getCallback(_getCallback),\n        clientData(_clientData)\n      {\n      }\n      // Shallow copy\n      // I solemnly swear it's OK to copy clientData this way\n      IGL_INLINE ReTwCBItem(const ReTwCBItem & that):\n        name(that.name),\n        type(that.type),\n        setCallback(that.setCallback),\n        getCallback(that.getCallback),\n        clientData(that.clientData)\n      {\n      }\n      // Shallow assignment\n      // I solemnly swear it's OK to copy clientData this way\n      IGL_INLINE ReTwCBItem & operator=(const ReTwCBItem & that)\n      {\n        if(this != &that)\n        {\n          name = that.name;\n          type = that.type;\n          setCallback = that.setCallback;\n          getCallback = that.getCallback;\n          clientData = that.clientData;\n        }\n        return *this;\n      }\n  \n    };\n    \n    class ReTwBar\n    {\n      // VARIABLES\n      // Should be private, but seeing as I'm not going to implement all of the\n      // AntTweakBar public functions right away, I'll expose this so that at\n      // anytime AntTweakBar functions can be called directly on the bar\n      public:\n        TwBar * bar;\n        std::string name;\n      protected:\n        std::vector<ReTwRWItem> rw_items;\n        std::vector<ReTwCBItem> cb_items;\n      public:\n        // Default constructor with explicit initialization\n        IGL_INLINE ReTwBar();\n      private:\n        // Copy constructor does shallow copy\n        IGL_INLINE ReTwBar(const ReTwBar & that);\n        // Assignment operator does shallow assignment\n        IGL_INLINE ReTwBar &operator=(const ReTwBar & that);\n    \n      // WRAPPERS FOR ANTTWEAKBAR FUNCTIONS \n      public:\n        IGL_INLINE void TwNewBar(const char *_name);\n        IGL_INLINE int TwAddVarRW(\n          const char *name, \n          TwType type, \n          void *var, \n          const char *def,\n          const bool record=true);\n        IGL_INLINE int TwAddVarCB(\n          const char *name, \n          TwType type, \n          TwSetVarCallback setCallback, \n          TwGetVarCallback getCallback, \n          void *clientData, \n          const char *def,\n          const bool record=true);\n        // Wrappers for convenience (not recorded, just passed on)\n        IGL_INLINE int TwAddVarRO(const char *name, TwType type, void *var, const char *def);\n        IGL_INLINE int TwAddButton(\n          const char *name, \n          TwButtonCallback buttonCallback, \n          void *clientData, \n          const char *def);\n        IGL_INLINE int TwSetParam(\n          const char *varName, \n          const char *paramName, \n          TwParamValueType paramValueType, \n          unsigned int inValueCount, \n          const void *inValues);\n        IGL_INLINE int TwGetParam(\n          const char *varName, \n          const char *paramName, \n          TwParamValueType paramValueType, \n          unsigned int outValueMaxCount, \n          void *outValues);\n        IGL_INLINE int TwRefreshBar();\n        IGL_INLINE int TwTerminate();\n    \n    \n      // IO FUNCTIONS\n      public:\n        // Save current items to file\n        // Input:\n        //   file_name  name of file to save data to, can be null which means print\n        //   to stdout\n        // Return:\n        //   true only if there were no (fatal) errors\n        IGL_INLINE bool save(const char *file_name);\n        std::string get_value_as_string(\n          void * var, \n          TwType type);\n        // Load into current items from file\n        // Input:\n        //   file_name  name of input file to load\n        // Return:\n        //   true only if there were no (fatal) errors\n        IGL_INLINE bool load(const char *file_name);\n        // Get TwType from string\n        // Input\n        //   type_str  string of type \n        // Output\n        //   type  TwType converted from string\n        // Returns\n        //   true only if string matched a valid type\n        IGL_INLINE bool type_from_string(const char *type_str, TwType & type);\n        // I realize that I mix std::string and const char * all over the place.\n        // What can you do...\n        IGL_INLINE bool set_value_from_string(\n          const char * name, \n          TwType type, \n          const char * value_str);\n        IGL_INLINE const std::vector<ReTwRWItem> & get_rw_items();\n        IGL_INLINE const std::vector<ReTwCBItem> & get_cb_items();\n    };\n  }\n}\n\n// List of TwBar functions\n//TW_API TwBar *      TW_CALL TwNewBar(const char *barName);\n//TW_API int          TW_CALL TwDeleteBar(TwBar *bar);\n//TW_API int          TW_CALL TwDeleteAllBars();\n//TW_API int          TW_CALL TwSetTopBar(const TwBar *bar);\n//TW_API TwBar *      TW_CALL TwGetTopBar();\n//TW_API int          TW_CALL TwSetBottomBar(const TwBar *bar);\n//TW_API TwBar *      TW_CALL TwGetBottomBar();\n//TW_API const char * TW_CALL TwGetBarName(TwBar *bar);\n//TW_API int          TW_CALL TwGetBarCount();\n//TW_API TwBar *      TW_CALL TwGetBarByIndex(int barIndex);\n//TW_API TwBar *      TW_CALL TwGetBarByName(const char *barName);\n//TW_API int          TW_CALL TwRefreshBar(TwBar *bar);\n//TW_API int          TW_CALL TwTerminate();\n//\n//TW_API int      TW_CALL TwAddVarRW(TwBar *bar, const char *name, TwType type, void *var, const char *def);\n//TW_API int      TW_CALL TwAddVarRO(TwBar *bar, const char *name, TwType type, const void *var, const char *def);\n//TW_API int      TW_CALL TwAddVarCB(TwBar *bar, const char *name, TwType type, TwSetVarCallback setCallback, TwGetVarCallback getCallback, void *clientData, const char *def);\n//TW_API int      TW_CALL TwAddButton(TwBar *bar, const char *name, TwButtonCallback callback, void *clientData, const char *def);\n//TW_API int      TW_CALL TwAddSeparator(TwBar *bar, const char *name, const char *def);\n//TW_API int      TW_CALL TwRemoveVar(TwBar *bar, const char *name);\n//TW_API int      TW_CALL TwRemoveAllVars(TwBar *bar);\n\n// Until AntTweakBar dependency folder exists, this is header-only\n#ifndef IGL_STATIC_LIBRARY\n#  include \"ReAntTweakBar.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/anttweakbar/cocoa_key_to_anttweakbar_key.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"cocoa_key_to_anttweakbar_key.h\"\n\n#include <AntTweakBar.h>\n\nIGL_INLINE int igl::anttweakbar::cocoa_key_to_anttweakbar_key(int key)\n{\n  // I've left commented the AntTweakBar key codes that correspond to keys I\n  // don't have on my keyboard. Please fill this in if you have those keys\n  switch(key)\n  {\n    case 127:\n      return TW_KEY_BACKSPACE;\n    case 9:\n      return TW_KEY_TAB;\n  //TW_KEY_CLEAR        = 0x0c,\n    case 3://ENTER\n    case 13:\n      return TW_KEY_RETURN;\n    case 27:\n      return TW_KEY_ESCAPE;\n    case 32:\n      return TW_KEY_SPACE;\n    // IN A GLUT APP 40 is (\n    //case 40:\n    case 63272:\n      return TW_KEY_DELETE;\n    case 63232:\n      return TW_KEY_UP;\n    case 63233:\n      return TW_KEY_DOWN;\n    case 63235:\n      return TW_KEY_RIGHT;\n    case 63234:\n      return TW_KEY_LEFT;\n  //TW_KEY_INSERT,\n  //TW_KEY_HOME,\n  //TW_KEY_END,\n  //TW_KEY_PAGE_UP,\n  //TW_KEY_PAGE_DOWN,\n    case 63236:\n      return TW_KEY_F1;\n    case 63237:\n      return TW_KEY_F2;\n    case 63238:\n      return TW_KEY_F3;\n    case 63239:\n      return TW_KEY_F4;\n    case 63240:\n      return TW_KEY_F5;\n    case 63241:\n      return TW_KEY_F6;\n    case 63242:\n      return TW_KEY_F7;\n    case 63243:\n      return TW_KEY_F8;\n    case 63244:\n      return TW_KEY_F9;\n    case 63245:\n      return TW_KEY_F10;\n    case 63246:\n      return TW_KEY_F11;\n    case 63247:\n      return TW_KEY_F12;\n    case 63248:\n      return TW_KEY_F13;\n    case 63249:\n      return TW_KEY_F14;\n    case 63250:\n      return TW_KEY_F15;\n    default:\n      break;\n  }\n  return key;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/anttweakbar/cocoa_key_to_anttweakbar_key.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_ANTTWEAKBAR_COCOA_KEY_TO_ANTTWEAKBAR_KEY_H\n#define IGL_ANTTWEAKBAR_COCOA_KEY_TO_ANTTWEAKBAR_KEY_H\n#include \"../igl_inline.h\"\n\n\nnamespace igl\n{\n  namespace anttweakbar\n  {\n    // Convert an unsigned char (like that from Cocoa apps) to AntTweakBar key\n    // code.\n    // See also: TranslateKey() in TwMgr.cpp in AntTweakBar source\n    // Inputs:\n    //   key  unsigned char key from keyboard\n    // Returns int of new key code \n    IGL_INLINE int cocoa_key_to_anttweakbar_key(int key);\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"cocoa_key_to_anttweakbar_key.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/any.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"any.h\"\n#include \"redux.h\"\n\n\ntemplate <typename AType, typename DerivedB>\nIGL_INLINE void igl::any(\n  const Eigen::SparseMatrix<AType> & A, \n  const int dim,\n  Eigen::PlainObjectBase<DerivedB>& B)\n{\n  typedef typename DerivedB::Scalar Scalar;\n  igl::redux(A,dim,[](Scalar a, Scalar b){ return a || b!=0;},B);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::any<bool, Eigen::Array<bool, -1, 1, 0, -1, 1> >(Eigen::SparseMatrix<bool, 0, int> const&, int, Eigen::PlainObjectBase<Eigen::Array<bool, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/any.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_ANY_H\n#define IGL_ANY_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <Eigen/Sparse>\nnamespace igl\n{\n  // For Dense matrices use: A.rowwise().any() or A.colwise().any()\n  //\n  // Inputs:\n  //   A  m by n sparse matrix\n  //   dim  dimension along which to check for any (1 or 2)\n  // Output:\n  //   B  n-long vector (if dim == 1) \n  //   or\n  //   B  m-long vector (if dim == 2)\n  //\n  template <typename AType, typename DerivedB>\n  IGL_INLINE void any(\n    const Eigen::SparseMatrix<AType> & A, \n    const int dim,\n    Eigen::PlainObjectBase<DerivedB>& B);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"any.cpp\"\n#endif\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/any_of.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"any_of.h\"\n#include <Eigen/Core>\ntemplate <typename Mat>\nIGL_INLINE bool igl::any_of(const Mat & S)\n{\n  return std::any_of(S.data(),S.data()+S.size(),[](bool s){return s;});\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate bool igl::any_of<Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::Matrix<int, -1, 1, 0, -1, 1> const&);\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/any_of.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_ANY_OF_H\n#define IGL_ANY_OF_H\n#include \"igl_inline.h\"\nnamespace igl\n{\n  // Wrapper for STL `any_of` for matrix types\n  //\n  // Inputs:\n  //   S  matrix\n  // Returns whether any entries are true\n  //\n  // Seems that Eigen (now) implements this for `Eigen::Array` \n  template <typename Mat>\n  IGL_INLINE bool any_of(const Mat & S);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"any_of.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/arap.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"arap.h\"\n#include \"colon.h\"\n#include \"cotmatrix.h\"\n#include \"massmatrix.h\"\n#include \"group_sum_matrix.h\"\n#include \"covariance_scatter_matrix.h\"\n#include \"speye.h\"\n#include \"mode.h\"\n#include \"project_isometrically_to_plane.h\"\n#include \"slice.h\"\n#include \"arap_rhs.h\"\n#include \"repdiag.h\"\n#include \"columnize.h\"\n#include \"fit_rotations.h\"\n#include <cassert>\n#include <iostream>\n\ntemplate <\n  typename DerivedV,\n  typename DerivedF,\n  typename Derivedb>\nIGL_INLINE bool igl::arap_precomputation(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  const int dim,\n  const Eigen::PlainObjectBase<Derivedb> & b,\n  ARAPData & data)\n{\n  using namespace std;\n  using namespace Eigen;\n  typedef typename DerivedV::Scalar Scalar;\n  // number of vertices\n  const int n = V.rows();\n  data.n = n;\n  assert((b.size() == 0 || b.maxCoeff() < n) && \"b out of bounds\");\n  assert((b.size() == 0 || b.minCoeff() >=0) && \"b out of bounds\");\n  // remember b\n  data.b = b;\n  //assert(F.cols() == 3 && \"For now only triangles\");\n  // dimension\n  //const int dim = V.cols();\n  assert((dim == 3 || dim ==2) && \"dim should be 2 or 3\");\n  data.dim = dim;\n  //assert(dim == 3 && \"Only 3d supported\");\n  // Defaults\n  data.f_ext = MatrixXd::Zero(n,data.dim);\n\n  assert(data.dim <= V.cols() && \"solve dim should be <= embedding\");\n  bool flat = (V.cols() - data.dim)==1;\n\n  DerivedV plane_V;\n  DerivedF plane_F;\n  typedef SparseMatrix<Scalar> SparseMatrixS;\n  SparseMatrixS ref_map,ref_map_dim;\n  if(flat)\n  {\n    project_isometrically_to_plane(V,F,plane_V,plane_F,ref_map);\n    repdiag(ref_map,dim,ref_map_dim);\n  }\n  const PlainObjectBase<DerivedV>& ref_V = (flat?plane_V:V);\n  const PlainObjectBase<DerivedF>& ref_F = (flat?plane_F:F);\n  SparseMatrixS L;\n  cotmatrix(V,F,L);\n\n  ARAPEnergyType eff_energy = data.energy;\n  if(eff_energy == ARAP_ENERGY_TYPE_DEFAULT)\n  {\n    switch(F.cols())\n    {\n      case 3:\n        if(data.dim == 3)\n        {\n          eff_energy = ARAP_ENERGY_TYPE_SPOKES_AND_RIMS;\n        }else\n        {\n          eff_energy = ARAP_ENERGY_TYPE_ELEMENTS;\n        }\n        break;\n      case 4:\n        eff_energy = ARAP_ENERGY_TYPE_ELEMENTS;\n        break;\n      default:\n        assert(false);\n    }\n  }\n\n\n  // Get covariance scatter matrix, when applied collects the covariance\n  // matrices used to fit rotations to during optimization\n  covariance_scatter_matrix(ref_V,ref_F,eff_energy,data.CSM);\n  if(flat)\n  {\n    data.CSM = (data.CSM * ref_map_dim.transpose()).eval();\n  }\n  assert(data.CSM.cols() == V.rows()*data.dim);\n\n  // Get group sum scatter matrix, when applied sums all entries of the same\n  // group according to G\n  SparseMatrix<double> G_sum;\n  if(data.G.size() == 0)\n  {\n    if(eff_energy == ARAP_ENERGY_TYPE_ELEMENTS)\n    {\n      speye(F.rows(),G_sum);\n    }else\n    {\n      speye(n,G_sum);\n    }\n  }else\n  {\n    // groups are defined per vertex, convert to per face using mode\n    if(eff_energy == ARAP_ENERGY_TYPE_ELEMENTS)\n    {\n      Eigen::Matrix<int,Eigen::Dynamic,1> GG;\n      MatrixXi GF(F.rows(),F.cols());\n      for(int j = 0;j<F.cols();j++)\n      {\n        Matrix<int,Eigen::Dynamic,1> GFj;\n        slice(data.G,F.col(j),GFj);\n        GF.col(j) = GFj;\n      }\n      mode<int>(GF,2,GG);\n      data.G=GG;\n    }\n    //printf(\"group_sum_matrix()\\n\");\n    group_sum_matrix(data.G,G_sum);\n  }\n  SparseMatrix<double> G_sum_dim;\n  repdiag(G_sum,data.dim,G_sum_dim);\n  assert(G_sum_dim.cols() == data.CSM.rows());\n  data.CSM = (G_sum_dim * data.CSM).eval();\n\n\n  arap_rhs(ref_V,ref_F,data.dim,eff_energy,data.K);\n  if(flat)\n  {\n    data.K = (ref_map_dim * data.K).eval();\n  }\n  assert(data.K.rows() == data.n*data.dim);\n\n  SparseMatrix<double> Q = (-L).eval();\n\n  if(data.with_dynamics)\n  {\n    const double h = data.h;\n    assert(h != 0);\n    SparseMatrix<double> M;\n    massmatrix(V,F,MASSMATRIX_TYPE_DEFAULT,data.M);\n    const double dw = (1./data.ym)*(h*h);\n    SparseMatrix<double> DQ = dw * 1./(h*h)*data.M;\n    Q += DQ;\n    // Dummy external forces\n    data.f_ext = MatrixXd::Zero(n,data.dim);\n    data.vel = MatrixXd::Zero(n,data.dim);\n  }\n\n  return min_quad_with_fixed_precompute(\n    Q,b,SparseMatrix<double>(),true,data.solver_data);\n}\n\ntemplate <\n  typename Derivedbc,\n  typename DerivedU>\nIGL_INLINE bool igl::arap_solve(\n  const Eigen::PlainObjectBase<Derivedbc> & bc,\n  ARAPData & data,\n  Eigen::PlainObjectBase<DerivedU> & U)\n{\n  using namespace Eigen;\n  using namespace std;\n  assert(data.b.size() == bc.rows());\n  if(bc.size() > 0)\n  {\n    assert(bc.cols() == data.dim && \"bc.cols() match data.dim\");\n  }\n  const int n = data.n;\n  int iter = 0;\n  if(U.size() == 0)\n  {\n    // terrible initial guess.. should at least copy input mesh\n#ifndef NDEBUG\n    cerr<<\"arap_solve: Using terrible initial guess for U. Try U = V.\"<<endl;\n#endif\n    U = MatrixXd::Zero(data.n,data.dim);\n  }else\n  {\n    assert(U.cols() == data.dim && \"U.cols() match data.dim\");\n  }\n  // changes each arap iteration\n  MatrixXd U_prev = U;\n  // doesn't change for fixed with_dynamics timestep\n  MatrixXd U0;\n  if(data.with_dynamics)\n  {\n    U0 = U_prev;\n  }\n  while(iter < data.max_iter)\n  {\n    U_prev = U;\n    // enforce boundary conditions exactly\n    for(int bi = 0;bi<bc.rows();bi++)\n    {\n      U.row(data.b(bi)) = bc.row(bi);\n    }\n\n    const auto & Udim = U.replicate(data.dim,1);\n    assert(U.cols() == data.dim);\n    // As if U.col(2) was 0\n    MatrixXd S = data.CSM * Udim;\n    // THIS NORMALIZATION IS IMPORTANT TO GET SINGLE PRECISION SVD CODE TO WORK\n    // CORRECTLY.\n    S /= S.array().abs().maxCoeff();\n\n    const int Rdim = data.dim;\n    MatrixXd R(Rdim,data.CSM.rows());\n    if(R.rows() == 2)\n    {\n      fit_rotations_planar(S,R);\n    }else\n    {\n      fit_rotations(S,true,R);\n//#ifdef __SSE__ // fit_rotations_SSE will convert to float if necessary\n//      fit_rotations_SSE(S,R);\n//#else\n//      fit_rotations(S,true,R);\n//#endif\n    }\n    //for(int k = 0;k<(data.CSM.rows()/dim);k++)\n    //{\n    //  R.block(0,dim*k,dim,dim) = MatrixXd::Identity(dim,dim);\n    //}\n\n\n    // Number of rotations: #vertices or #elements\n    int num_rots = data.K.cols()/Rdim/Rdim;\n    // distribute group rotations to vertices in each group\n    MatrixXd eff_R;\n    if(data.G.size() == 0)\n    {\n      // copy...\n      eff_R = R;\n    }else\n    {\n      eff_R.resize(Rdim,num_rots*Rdim);\n      for(int r = 0;r<num_rots;r++)\n      {\n        eff_R.block(0,Rdim*r,Rdim,Rdim) =\n          R.block(0,Rdim*data.G(r),Rdim,Rdim);\n      }\n    }\n\n    MatrixXd Dl;\n    if(data.with_dynamics)\n    {\n      assert(data.M.rows() == n &&\n        \"No mass matrix. Call arap_precomputation if changing with_dynamics\");\n      const double h = data.h;\n      assert(h != 0);\n      //Dl = 1./(h*h*h)*M*(-2.*V0 + Vm1) - fext;\n      // data.vel = (V0-Vm1)/h\n      // h*data.vel = (V0-Vm1)\n      // -h*data.vel = -V0+Vm1)\n      // -V0-h*data.vel = -2V0+Vm1\n      const double dw = (1./data.ym)*(h*h);\n      Dl = dw * (1./(h*h)*data.M*(-U0 - h*data.vel) - data.f_ext);\n    }\n\n    VectorXd Rcol;\n    columnize(eff_R,num_rots,2,Rcol);\n    VectorXd Bcol = -data.K * Rcol;\n    assert(Bcol.size() == data.n*data.dim);\n    for(int c = 0;c<data.dim;c++)\n    {\n      VectorXd Uc,Bc,bcc,Beq;\n      Bc = Bcol.block(c*n,0,n,1);\n      if(data.with_dynamics)\n      {\n        Bc += Dl.col(c);\n      }\n      if(bc.size()>0)\n      {\n        bcc = bc.col(c);\n      }\n      min_quad_with_fixed_solve(\n        data.solver_data,\n        Bc,bcc,Beq,\n        Uc);\n      U.col(c) = Uc;\n    }\n\n    iter++;\n  }\n  if(data.with_dynamics)\n  {\n    // Keep track of velocity for next time\n    data.vel = (U-U0)/data.h;\n  }\n\n  return true;\n}\n\n#ifdef IGL_STATIC_LIBRARY\ntemplate bool igl::arap_solve<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, igl::ARAPData&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate bool igl::arap_precomputation<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, igl::ARAPData&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/arap.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_ARAP_H\n#define IGL_ARAP_H\n#include \"igl_inline.h\"\n#include \"min_quad_with_fixed.h\"\n#include \"ARAPEnergyType.h\"\n#include <Eigen/Core>\n#include <Eigen/Sparse>\n\nnamespace igl\n{\n  struct ARAPData\n  {\n    // n  #V\n    // G  #V list of group indices (1 to k) for each vertex, such that vertex i\n    //    is assigned to group G(i)\n    // energy  type of energy to use\n    // with_dynamics  whether using dynamics (need to call arap_precomputation\n    //   after changing)\n    // f_ext  #V by dim list of external forces\n    // vel  #V by dim list of velocities\n    // h  dynamics time step\n    // ym  ~Young's modulus smaller is softer, larger is more rigid/stiff\n    // max_iter  maximum inner iterations\n    // K  rhs pre-multiplier\n    // M  mass matrix\n    // solver_data  quadratic solver data\n    // b  list of boundary indices into V\n    // dim  dimension being used for solving\n    int n;\n    Eigen::VectorXi G;\n    ARAPEnergyType energy;\n    bool with_dynamics;\n    Eigen::MatrixXd f_ext,vel;\n    double h;\n    double ym;\n    int max_iter;\n    Eigen::SparseMatrix<double> K,M;\n    Eigen::SparseMatrix<double> CSM;\n    min_quad_with_fixed_data<double> solver_data;\n    Eigen::VectorXi b;\n    int dim;\n      ARAPData():\n        n(0),\n        G(),\n        energy(ARAP_ENERGY_TYPE_DEFAULT),\n        with_dynamics(false),\n        f_ext(),\n        h(1),\n        ym(1),\n        max_iter(10),\n        K(),\n        CSM(),\n        solver_data(),\n        b(),\n        dim(-1) // force this to be set by _precomputation\n    {\n    };\n  };\n  \n  // Compute necessary information to start using an ARAP deformation\n  //\n  // Inputs:\n  //   V  #V by dim list of mesh positions\n  //   F  #F by simplex-size list of triangle|tet indices into V\n  //   dim  dimension being used at solve time. For deformation usually dim =\n  //     V.cols(), for surface parameterization V.cols() = 3 and dim = 2\n  //   b  #b list of \"boundary\" fixed vertex indices into V\n  // Outputs:\n  //   data  struct containing necessary precomputation\n  template <\n    typename DerivedV,\n    typename DerivedF,\n    typename Derivedb>\n  IGL_INLINE bool arap_precomputation(\n    const Eigen::PlainObjectBase<DerivedV> & V,\n    const Eigen::PlainObjectBase<DerivedF> & F,\n    const int dim,\n    const Eigen::PlainObjectBase<Derivedb> & b,\n    ARAPData & data);\n  // Inputs:\n  //   bc  #b by dim list of boundary conditions\n  //   data  struct containing necessary precomputation and parameters\n  //   U  #V by dim initial guess\n  template <\n    typename Derivedbc,\n    typename DerivedU>\n  IGL_INLINE bool arap_solve(\n    const Eigen::PlainObjectBase<Derivedbc> & bc,\n    ARAPData & data,\n    Eigen::PlainObjectBase<DerivedU> & U);\n};\n\n#ifndef IGL_STATIC_LIBRARY\n#include \"arap.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/arap_dof.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"arap_dof.h\"\n\n#include \"cotmatrix.h\"\n#include \"massmatrix.h\"\n#include \"speye.h\"\n#include \"repdiag.h\"\n#include \"repmat.h\"\n#include \"slice.h\"\n#include \"colon.h\"\n#include \"is_sparse.h\"\n#include \"mode.h\"\n#include \"is_symmetric.h\"\n#include \"group_sum_matrix.h\"\n#include \"arap_rhs.h\"\n#include \"covariance_scatter_matrix.h\"\n#include \"fit_rotations.h\"\n\n#include \"verbose.h\"\n#include \"print_ijv.h\"\n\n#include \"get_seconds_hires.h\"\n//#include \"MKLEigenInterface.h\"\n#include \"min_quad_dense.h\"\n#include \"get_seconds.h\"\n#include \"columnize.h\"\n\n// defined if no early exit is supported, i.e., always take a fixed number of iterations\n#define IGL_ARAP_DOF_FIXED_ITERATIONS_COUNT\n\n// A carefull derivation of this implementation is given in the corresponding\n// matlab function arap_dof.m\ntemplate <typename LbsMatrixType, typename SSCALAR>\nIGL_INLINE bool igl::arap_dof_precomputation(\n  const Eigen::MatrixXd & V, \n  const Eigen::MatrixXi & F,\n  const LbsMatrixType & M,\n  const Eigen::Matrix<int,Eigen::Dynamic,1> & G,\n  ArapDOFData<LbsMatrixType, SSCALAR> & data)\n{\n  using namespace Eigen;\n  typedef Matrix<SSCALAR, Dynamic, Dynamic> MatrixXS;\n  // number of mesh (domain) vertices\n  int n = V.rows();\n  // cache problem size\n  data.n = n;\n  // dimension of mesh\n  data.dim = V.cols();\n  assert(data.dim == M.rows()/n);\n  assert(data.dim*n == M.rows());\n  if(data.dim == 3)\n  {\n    // Check if z-coordinate is all zeros\n    if(V.col(2).minCoeff() == 0 && V.col(2).maxCoeff() == 0)\n    {\n      data.effective_dim = 2;\n    }\n  }else\n  {\n    data.effective_dim = data.dim;\n  }\n  // Number of handles\n  data.m = M.cols()/data.dim/(data.dim+1);\n  assert(data.m*data.dim*(data.dim+1) == M.cols());\n  //assert(m == C.rows());\n\n  //printf(\"n=%d; dim=%d; m=%d;\\n\",n,data.dim,data.m);\n\n  // Build cotangent laplacian\n  SparseMatrix<double> Lcot;\n  //printf(\"cotmatrix()\\n\");\n  cotmatrix(V,F,Lcot);\n  // Discrete laplacian (should be minus matlab version)\n  SparseMatrix<double> Lapl = -2.0*Lcot;\n#ifdef EXTREME_VERBOSE\n  cout<<\"LaplIJV=[\"<<endl;print_ijv(Lapl,1);cout<<endl<<\"];\"<<\n    endl<<\"Lapl=sparse(LaplIJV(:,1),LaplIJV(:,2),LaplIJV(:,3),\"<<\n    Lapl.rows()<<\",\"<<Lapl.cols()<<\");\"<<endl;\n#endif\n\n  // Get group sum scatter matrix, when applied sums all entries of the same\n  // group according to G\n  SparseMatrix<double> G_sum;\n  if(G.size() == 0)\n  {\n    speye(n,G_sum);\n  }else\n  {\n    // groups are defined per vertex, convert to per face using mode\n    Eigen::Matrix<int,Eigen::Dynamic,1> GG;\n    if(data.energy == ARAP_ENERGY_TYPE_ELEMENTS)\n    {\n      MatrixXi GF(F.rows(),F.cols());\n      for(int j = 0;j<F.cols();j++)\n      {\n        Matrix<int,Eigen::Dynamic,1> GFj;\n        slice(G,F.col(j),GFj);\n        GF.col(j) = GFj;\n      }\n      mode<int>(GF,2,GG);\n    }else\n    {\n      GG=G;\n    }\n    //printf(\"group_sum_matrix()\\n\");\n    group_sum_matrix(GG,G_sum);\n  }\n\n#ifdef EXTREME_VERBOSE\n  cout<<\"G_sumIJV=[\"<<endl;print_ijv(G_sum,1);cout<<endl<<\"];\"<<\n    endl<<\"G_sum=sparse(G_sumIJV(:,1),G_sumIJV(:,2),G_sumIJV(:,3),\"<<\n    G_sum.rows()<<\",\"<<G_sum.cols()<<\");\"<<endl;\n#endif\n\n  // Get covariance scatter matrix, when applied collects the covariance matrices\n  // used to fit rotations to during optimization\n  SparseMatrix<double> CSM;\n  //printf(\"covariance_scatter_matrix()\\n\");\n  covariance_scatter_matrix(V,F,data.energy,CSM);\n#ifdef EXTREME_VERBOSE\n  cout<<\"CSMIJV=[\"<<endl;print_ijv(CSM,1);cout<<endl<<\"];\"<<\n    endl<<\"CSM=sparse(CSMIJV(:,1),CSMIJV(:,2),CSMIJV(:,3),\"<<\n    CSM.rows()<<\",\"<<CSM.cols()<<\");\"<<endl;\n#endif\n  \n\n  // Build the covariance matrix \"constructor\". This is a set of *scatter*\n  // matrices that when multiplied on the right by column of the transformation\n  // matrix entries (the degrees of freedom) L, we get a stack of dim by 1\n  // covariance matrix column, with a column in the stack for each rotation\n  // *group*. The output is a list of matrices because we construct each column\n  // in the stack of covariance matrices with an independent matrix-vector\n  // multiplication.\n  //\n  // We want to build S which is a stack of dim by dim covariance matrices.\n  // Thus S is dim*g by dim, where dim is the number of dimensions and g is the\n  // number of groups. We can precompute dim matrices CSM_M such that column i\n  // in S is computed as S(:,i) = CSM_M{i} * L, where L is a column of the\n  // skinning transformation matrix values. To be clear, the covariance matrix\n  // for group k is then given as the dim by dim matrix pulled from the stack:\n  // S((k-1)*dim + 1:dim,:)\n\n  // Apply group sum to each dimension's block of covariance scatter matrix\n  SparseMatrix<double> G_sum_dim;\n  repdiag(G_sum,data.dim,G_sum_dim);\n  CSM = (G_sum_dim * CSM).eval();\n#ifdef EXTREME_VERBOSE\n  cout<<\"CSMIJV=[\"<<endl;print_ijv(CSM,1);cout<<endl<<\"];\"<<\n    endl<<\"CSM=sparse(CSMIJV(:,1),CSMIJV(:,2),CSMIJV(:,3),\"<<\n    CSM.rows()<<\",\"<<CSM.cols()<<\");\"<<endl;\n#endif\n\n  //printf(\"CSM_M()\\n\");\n  // Precompute CSM times M for each dimension\n  data.CSM_M.resize(data.dim);\n#ifdef EXTREME_VERBOSE\n  cout<<\"data.CSM_M = cell(\"<<data.dim<<\",1);\"<<endl;\n#endif\n  // span of integers from 0 to n-1\n  Eigen::Matrix<int,Eigen::Dynamic,1> span_n(n);\n  for(int i = 0;i<n;i++)\n  {\n    span_n(i) = i;\n  }\n\n  // span of integers from 0 to M.cols()-1\n  Eigen::Matrix<int,Eigen::Dynamic,1> span_mlbs_cols(M.cols());\n  for(int i = 0;i<M.cols();i++)\n  {\n    span_mlbs_cols(i) = i;\n  }\n\n  // number of groups\n  int k = CSM.rows()/data.dim;\n  for(int i = 0;i<data.dim;i++)\n  {\n    //printf(\"CSM_M(): Mi\\n\");\n    LbsMatrixType M_i;\n    //printf(\"CSM_M(): slice\\n\");\n    slice(M,(span_n.array()+i*n).matrix().eval(),span_mlbs_cols,M_i);\n    LbsMatrixType M_i_dim;\n    data.CSM_M[i].resize(k*data.dim,data.m*data.dim*(data.dim+1));\n    assert(data.CSM_M[i].cols() == M.cols());\n    for(int j = 0;j<data.dim;j++)\n    {\n      SparseMatrix<double> CSMj;\n      //printf(\"CSM_M(): slice\\n\");\n      slice(\n        CSM,\n        colon<int>(j*k,(j+1)*k-1),\n        colon<int>(j*n,(j+1)*n-1),\n        CSMj);\n      assert(CSMj.rows() == k);\n      assert(CSMj.cols() == n);\n      LbsMatrixType CSMjM_i = CSMj * M_i;\n      if(is_sparse(CSMjM_i))\n      {\n        // Convert to full\n        //printf(\"CSM_M(): full\\n\");\n        MatrixXd CSMjM_ifull(CSMjM_i);\n//        printf(\"CSM_M[%d]: %d %d\\n\",i,data.CSM_M[i].rows(),data.CSM_M[i].cols());\n//        printf(\"CSM_M[%d].block(%d*%d=%d,0,%d,%d): %d %d\\n\",i,j,k,CSMjM_i.rows(),CSMjM_i.cols(),\n//            data.CSM_M[i].block(j*k,0,CSMjM_i.rows(),CSMjM_i.cols()).rows(),\n//            data.CSM_M[i].block(j*k,0,CSMjM_i.rows(),CSMjM_i.cols()).cols());\n//        printf(\"CSM_MjMi: %d %d\\n\",i,CSMjM_i.rows(),CSMjM_i.cols());\n//        printf(\"CSM_MjM_ifull: %d %d\\n\",i,CSMjM_ifull.rows(),CSMjM_ifull.cols());\n        data.CSM_M[i].block(j*k,0,CSMjM_i.rows(),CSMjM_i.cols()) = CSMjM_ifull;\n      }else\n      {\n        data.CSM_M[i].block(j*k,0,CSMjM_i.rows(),CSMjM_i.cols()) = CSMjM_i;\n      }\n    }\n#ifdef EXTREME_VERBOSE\n    cout<<\"CSM_Mi=[\"<<endl<<data.CSM_M[i]<<endl<<\"];\"<<endl;\n#endif\n  }\n\n  // precompute arap_rhs matrix\n  //printf(\"arap_rhs()\\n\");\n  SparseMatrix<double> K;\n  arap_rhs(V,F,V.cols(),data.energy,K);\n//#ifdef EXTREME_VERBOSE\n//  cout<<\"KIJV=[\"<<endl;print_ijv(K,1);cout<<endl<<\"];\"<<\n//    endl<<\"K=sparse(KIJV(:,1),KIJV(:,2),KIJV(:,3),\"<<\n//    K.rows()<<\",\"<<K.cols()<<\");\"<<endl;\n//#endif\n  // Precompute left muliplication by M and right multiplication by G_sum\n  SparseMatrix<double> G_sumT = G_sum.transpose();\n  SparseMatrix<double> G_sumT_dim_dim;\n  repdiag(G_sumT,data.dim*data.dim,G_sumT_dim_dim);\n  LbsMatrixType MT = M.transpose();\n  // If this is a bottle neck then consider reordering matrix multiplication\n  data.M_KG = -4.0 * (MT * (K * G_sumT_dim_dim));\n//#ifdef EXTREME_VERBOSE\n//  cout<<\"data.M_KGIJV=[\"<<endl;print_ijv(data.M_KG,1);cout<<endl<<\"];\"<<\n//    endl<<\"data.M_KG=sparse(data.M_KGIJV(:,1),data.M_KGIJV(:,2),data.M_KGIJV(:,3),\"<<\n//    data.M_KG.rows()<<\",\"<<data.M_KG.cols()<<\");\"<<endl;\n//#endif\n\n  // Precompute system matrix\n  //printf(\"A()\\n\");\n  SparseMatrix<double> A;\n  repdiag(Lapl,data.dim,A);\n  data.Q = MT * (A * M);\n//#ifdef EXTREME_VERBOSE\n//  cout<<\"QIJV=[\"<<endl;print_ijv(data.Q,1);cout<<endl<<\"];\"<<\n//    endl<<\"Q=sparse(QIJV(:,1),QIJV(:,2),QIJV(:,3),\"<<\n//    data.Q.rows()<<\",\"<<data.Q.cols()<<\");\"<<endl;\n//#endif\n\n  // Always do dynamics precomputation so we can hot-switch\n  //if(data.with_dynamics)\n  //{\n    // Build cotangent laplacian\n    SparseMatrix<double> Mass;\n    //printf(\"massmatrix()\\n\");\n    massmatrix(V,F,(F.cols()>3?MASSMATRIX_TYPE_BARYCENTRIC:MASSMATRIX_TYPE_VORONOI),Mass);\n    //cout<<\"MIJV=[\"<<endl;print_ijv(Mass,1);cout<<endl<<\"];\"<<\n    //  endl<<\"M=sparse(MIJV(:,1),MIJV(:,2),MIJV(:,3),\"<<\n    //  Mass.rows()<<\",\"<<Mass.cols()<<\");\"<<endl;\n    //speye(data.n,Mass);\n    SparseMatrix<double> Mass_rep;\n    repdiag(Mass,data.dim,Mass_rep);\n\n    // Multiply either side by weights matrix (should be dense)\n    data.Mass_tilde = MT * Mass_rep * M;\n    MatrixXd ones(data.dim*data.n,data.dim);\n    for(int i = 0;i<data.n;i++)\n    {\n      for(int d = 0;d<data.dim;d++)\n      {\n        ones(i+d*data.n,d) = 1;\n      }\n    }\n    data.fgrav = MT * (Mass_rep * ones);\n    data.fext = MatrixXS::Zero(MT.rows(),1);\n    //data.fgrav = MT * (ones);\n  //}\n\n\n  // This may/should be superfluous\n  //printf(\"is_symmetric()\\n\");\n  if(!is_symmetric(data.Q))\n  {\n    //printf(\"Fixing symmetry...\\n\");\n    // \"Fix\" symmetry\n    LbsMatrixType QT = data.Q.transpose();\n    LbsMatrixType Q_copy = data.Q;\n    data.Q = 0.5*(Q_copy+QT);\n    // Check that ^^^ this really worked. It doesn't always\n    //assert(is_symmetric(*Q));\n  }\n\n  //printf(\"arap_dof_precomputation() succeeded... so far...\\n\");\n  verbose(\"Number of handles: %i\\n\", data.m);\n  return true;\n}\n\n/////////////////////////////////////////////////////////////////////////\n//\n// STATIC FUNCTIONS (These should be removed or properly defined)\n//\n/////////////////////////////////////////////////////////////////////////\nnamespace igl\n{\n  // returns maximal difference of 'blok' from scalar times 3x3 identity:\n  template <typename SSCALAR>\n  inline static SSCALAR maxBlokErr(const Eigen::Matrix3f &blok)\n  {\n    SSCALAR mD;\n    SSCALAR value = blok(0,0);\n    SSCALAR diff1 = fabs(blok(1,1) - value);\n    SSCALAR diff2 = fabs(blok(2,2) - value);\n    if (diff1 > diff2) mD = diff1;\n    else mD = diff2;\n    \n    for (int v=0; v<3; v++)\n    {\n      for (int w=0; w<3; w++)\n      {\n        if (v == w)\n        {\n          continue;\n        }\n        if (mD < fabs(blok(v, w)))\n        {\n          mD = fabs(blok(v, w));\n        }\n      }\n    }\n    \n    return mD;\n  }\n  \n  // converts CSM_M_SSCALAR[0], CSM_M_SSCALAR[1], CSM_M_SSCALAR[2] into one\n  // \"condensed\" matrix CSM while checking we're not loosing any information by\n  // this process; specifically, returns maximal difference from scaled 3x3\n  // identity blocks, which should be pretty small number\n  template <typename MatrixXS>\n  static typename MatrixXS::Scalar condense_CSM(\n    const std::vector<MatrixXS> &CSM_M_SSCALAR, \n    int numBones, \n    int dim, \n    MatrixXS &CSM)\n  {\n    const int numRows = CSM_M_SSCALAR[0].rows();\n    assert(CSM_M_SSCALAR[0].cols() == dim*(dim+1)*numBones);\n    assert(CSM_M_SSCALAR[1].cols() == dim*(dim+1)*numBones);\n    assert(CSM_M_SSCALAR[2].cols() == dim*(dim+1)*numBones);\n    assert(CSM_M_SSCALAR[1].rows() == numRows);\n    assert(CSM_M_SSCALAR[2].rows() == numRows);\n  \n    const int numCols = (dim + 1)*numBones;\n    CSM.resize(numRows, numCols);\n  \n    typedef typename MatrixXS::Scalar SSCALAR;\n    SSCALAR maxDiff = 0.0f;\n  \n    for (int r=0; r<numRows; r++)\n    {\n      for (int coord=0; coord<dim+1; coord++)\n      {\n        for (int b=0; b<numBones; b++)\n        {\n          // this is just a test if we really have a multiple of 3x3 identity\n          Eigen::Matrix3f blok;\n          for (int v=0; v<3; v++)\n          {\n            for (int w=0; w<3; w++)\n            {\n              blok(v,w) = CSM_M_SSCALAR[v](r, coord*(numBones*dim) + b + w*numBones);\n            }          \n          }\n  \n          //SSCALAR value[3];\n          //for (int v=0; v<3; v++)\n          //  CSM_M_SSCALAR[v](r, coord*(numBones*dim) + b + v*numBones);\n  \n          SSCALAR mD = maxBlokErr<SSCALAR>(blok);\n          if (mD > maxDiff) maxDiff = mD;\n  \n          // use the first value:\n          CSM(r, coord*numBones + b) = blok(0,0);\n        }\n      }\n    }\n  \n    return maxDiff;\n  }\n  \n  // splits x_0, ... , x_dim coordinates in column vector 'L' into a numBones*(dimp1) x dim matrix 'Lsep';\n  // assumes 'Lsep' has already been preallocated\n  //\n  // is this the same as uncolumnize? no.\n  template <typename MatL, typename MatLsep>\n  static void splitColumns(\n   const MatL &L, \n   int numBones, \n   int dim, \n   int dimp1, \n   MatLsep &Lsep)\n  {\n    assert(L.cols() == 1);\n    assert(L.rows() == dim*(dimp1)*numBones);\n  \n    assert(Lsep.rows() == (dimp1)*numBones && Lsep.cols() == dim);\n  \n    for (int b=0; b<numBones; b++)\n    {\n      for (int coord=0; coord<dimp1; coord++)\n      {\n        for (int c=0; c<dim; c++)\n        {\n          Lsep(coord*numBones + b, c) = L(coord*numBones*dim + c*numBones + b, 0);\n        }\n      }\n    }\n  }\n  \n  \n  // the inverse of splitColumns, i.e., takes numBones*(dimp1) x dim matrix 'Lsep' and merges the dimensions\n  // into columns vector 'L' (which is assumed to be already allocated):\n  //\n  // is this the same as columnize? no.\n  template <typename MatrixXS>\n  static void mergeColumns(const MatrixXS &Lsep, int numBones, int dim, int dimp1, MatrixXS &L)\n  {\n    assert(L.cols() == 1);\n    assert(L.rows() == dim*(dimp1)*numBones);\n  \n    assert(Lsep.rows() == (dimp1)*numBones && Lsep.cols() == dim);\n  \n    for (int b=0; b<numBones; b++)\n    {\n      for (int coord=0; coord<dimp1; coord++)\n      {\n        for (int c=0; c<dim; c++)\n        {\n          L(coord*numBones*dim + c*numBones + b, 0) = Lsep(coord*numBones + b, c);\n        }\n      }\n    }\n  }\n  \n  // converts \"Solve1\" the \"rotations\" part of FullSolve matrix (the first part)\n  // into one \"condensed\" matrix CSolve1 while checking we're not loosing any\n  // information by this process; specifically, returns maximal difference from\n  // scaled 3x3 identity blocks, which should be pretty small number\n  template <typename MatrixXS>\n  static typename MatrixXS::Scalar condense_Solve1(MatrixXS &Solve1, int numBones, int numGroups, int dim, MatrixXS &CSolve1)\n  {\n    assert(Solve1.rows() == dim*(dim + 1)*numBones);\n    assert(Solve1.cols() == dim*dim*numGroups);\n  \n    typedef typename MatrixXS::Scalar SSCALAR;\n    SSCALAR maxDiff = 0.0f;\n  \n    CSolve1.resize((dim + 1)*numBones, dim*numGroups);  \n    for (int rowCoord=0; rowCoord<dim+1; rowCoord++)\n    {\n      for (int b=0; b<numBones; b++)\n      {\n        for (int colCoord=0; colCoord<dim; colCoord++)\n        {\n          for (int g=0; g<numGroups; g++)\n          {\n            Eigen::Matrix3f blok;\n            for (int r=0; r<3; r++)\n            {\n              for (int c=0; c<3; c++)\n              {\n                blok(r, c) = Solve1(rowCoord*numBones*dim + r*numBones + b, colCoord*numGroups*dim + c*numGroups + g);\n              }\n            }\n  \n            SSCALAR mD = maxBlokErr<SSCALAR>(blok);\n            if (mD > maxDiff) maxDiff = mD;\n  \n            CSolve1(rowCoord*numBones + b, colCoord*numGroups + g) = blok(0,0);\n          }\n        }\n      }\n    }  \n    \n    return maxDiff;\n  }\n}\n\ntemplate <typename LbsMatrixType, typename SSCALAR>\nIGL_INLINE bool igl::arap_dof_recomputation(\n  const Eigen::Matrix<int,Eigen::Dynamic,1> & fixed_dim,\n  const Eigen::SparseMatrix<double> & A_eq,\n  ArapDOFData<LbsMatrixType, SSCALAR> & data)\n{\n  using namespace Eigen;\n  typedef Matrix<SSCALAR, Dynamic, Dynamic> MatrixXS;\n\n  LbsMatrixType * Q;\n  LbsMatrixType Qdyn;\n  if(data.with_dynamics)\n  {\n    // multiply by 1/timestep and to quadratic coefficients matrix\n    // Might be missing a 0.5 here\n    LbsMatrixType Q_copy = data.Q;\n    Qdyn = Q_copy + (1.0/(data.h*data.h))*data.Mass_tilde;\n    Q = &Qdyn;\n\n    // This may/should be superfluous\n    //printf(\"is_symmetric()\\n\");\n    if(!is_symmetric(*Q))\n    {\n      //printf(\"Fixing symmetry...\\n\");\n      // \"Fix\" symmetry\n      LbsMatrixType QT = (*Q).transpose();\n      LbsMatrixType Q_copy = *Q;\n      *Q = 0.5*(Q_copy+QT);\n      // Check that ^^^ this really worked. It doesn't always\n      //assert(is_symmetric(*Q));\n    }\n  }else\n  {\n    Q = &data.Q;\n  }\n\n  assert((int)data.CSM_M.size() == data.dim);\n  assert(A_eq.cols() == data.m*data.dim*(data.dim+1));\n  data.fixed_dim = fixed_dim;\n\n  if(fixed_dim.size() > 0)\n  {\n    assert(fixed_dim.maxCoeff() < data.m*data.dim*(data.dim+1));\n    assert(fixed_dim.minCoeff() >= 0);\n  }\n\n#ifdef EXTREME_VERBOSE\n  cout<<\"data.fixed_dim=[\"<<endl<<data.fixed_dim<<endl<<\"]+1;\"<<endl;\n#endif\n\n  // Compute dense solve matrix (alternative of matrix factorization)\n  //printf(\"min_quad_dense_precompute()\\n\");\n  MatrixXd Qfull(*Q);\n  MatrixXd A_eqfull(A_eq);\n  MatrixXd M_Solve;\n\n  double timer0_start = get_seconds_hires();\n  bool use_lu = data.effective_dim != 2;\n  //use_lu = false;\n  //printf(\"use_lu: %s\\n\",(use_lu?\"TRUE\":\"FALSE\"));\n  min_quad_dense_precompute(Qfull, A_eqfull, use_lu,M_Solve);\n  double timer0_end = get_seconds_hires();\n  verbose(\"Bob timing: %.20f\\n\", (timer0_end - timer0_start)*1000.0);\n\n  // Precompute full solve matrix:\n  const int fsRows = data.m * data.dim * (data.dim + 1); // 12 * number_of_bones\n  const int fsCols1 = data.M_KG.cols(); // 9 * number_of_posConstraints\n  const int fsCols2 = A_eq.rows(); // number_of_posConstraints\n  data.M_FullSolve.resize(fsRows, fsCols1 + fsCols2);\n  // note the magical multiplicative constant \"-0.5\", I've no idea why it has\n  // to be there :)\n  data.M_FullSolve << \n    (-0.5 * M_Solve.block(0, 0, fsRows, fsRows) * data.M_KG).template cast<SSCALAR>(), \n    M_Solve.block(0, fsRows, fsRows, fsCols2).template cast<SSCALAR>();\n\n  if(data.with_dynamics)\n  {\n    printf(\n      \"---------------------------------------------------------------------\\n\"\n      \"\\n\\n\\nWITH DYNAMICS recomputation\\n\\n\\n\"\n      \"---------------------------------------------------------------------\\n\"\n      );\n    // Also need to save Π1 before it gets multiplied by Ktilde (aka M_KG)\n    data.Pi_1 = M_Solve.block(0, 0, fsRows, fsRows).template cast<SSCALAR>();\n  }\n\n  // Precompute condensed matrices,\n  // first CSM:\n  std::vector<MatrixXS> CSM_M_SSCALAR;\n  CSM_M_SSCALAR.resize(data.dim);\n  for (int i=0; i<data.dim; i++) CSM_M_SSCALAR[i] = data.CSM_M[i].template cast<SSCALAR>();\n  SSCALAR maxErr1 = condense_CSM(CSM_M_SSCALAR, data.m, data.dim, data.CSM);  \n  verbose(\"condense_CSM maxErr = %.15f (this should be close to zero)\\n\", maxErr1);\n  assert(fabs(maxErr1) < 1e-5);\n  \n  // and then solveBlock1:\n  // number of groups\n  const int k = data.CSM_M[0].rows()/data.dim;\n  MatrixXS SolveBlock1 = data.M_FullSolve.block(0, 0, data.M_FullSolve.rows(), data.dim * data.dim * k);\n  SSCALAR maxErr2 = condense_Solve1(SolveBlock1, data.m, k, data.dim, data.CSolveBlock1);  \n  verbose(\"condense_Solve1 maxErr = %.15f (this should be close to zero)\\n\", maxErr2);\n  assert(fabs(maxErr2) < 1e-5);\n\n  return true;\n}\n\ntemplate <typename LbsMatrixType, typename SSCALAR>\nIGL_INLINE bool igl::arap_dof_update(\n  const ArapDOFData<LbsMatrixType, SSCALAR> & data,\n  const Eigen::Matrix<double,Eigen::Dynamic,1> & B_eq,\n  const Eigen::MatrixXd & L0,\n  const int max_iters,\n  const double \n#ifdef IGL_ARAP_DOF_FIXED_ITERATIONS_COUNT\n  tol,\n#else\n  /*tol*/,\n#endif\n  Eigen::MatrixXd & L\n  )\n{\n  using namespace Eigen;\n  typedef Matrix<SSCALAR, Dynamic, Dynamic> MatrixXS;\n#ifdef ARAP_GLOBAL_TIMING\n  double timer_start = get_seconds_hires();\n#endif\n\n  // number of dimensions\n  assert((int)data.CSM_M.size() == data.dim);\n  assert((int)L0.size() == (data.m)*data.dim*(data.dim+1));\n  assert(max_iters >= 0);\n  assert(tol >= 0);\n\n  // timing variables\n  double \n    sec_start, \n    sec_covGather, \n    sec_fitRotations, \n    //sec_rhs, \n    sec_prepMult, \n    sec_solve, sec_end;\n\n  assert(L0.cols() == 1);\n#ifdef EXTREME_VERBOSE\n  cout<<\"dim=\"<<data.dim<<\";\"<<endl;\n  cout<<\"m=\"<<data.m<<\";\"<<endl;\n#endif\n\n  // number of groups\n  const int k = data.CSM_M[0].rows()/data.dim;\n  for(int i = 0;i<data.dim;i++)\n  {\n    assert(data.CSM_M[i].rows()/data.dim == k);\n  }\n#ifdef EXTREME_VERBOSE\n  cout<<\"k=\"<<k<<\";\"<<endl;\n#endif\n\n  // resize output and initialize with initial guess\n  L = L0;\n#ifndef IGL_ARAP_DOF_FIXED_ITERATIONS_COUNT\n  // Keep track of last solution\n  MatrixXS L_prev;\n#endif\n  // We will be iterating on L_SSCALAR, only at the end we convert back to double\n  MatrixXS L_SSCALAR = L.cast<SSCALAR>();\n\n  int iters = 0;\n#ifndef IGL_ARAP_DOF_FIXED_ITERATIONS_COUNT\n  double max_diff = tol+1;  \n#endif\n\n  MatrixXS S(k*data.dim,data.dim);\n  MatrixXS R(data.dim,data.dim*k);\n  Eigen::Matrix<SSCALAR,Eigen::Dynamic,1> Rcol(data.dim * data.dim * k);\n  Matrix<SSCALAR,Dynamic,1> B_eq_SSCALAR = B_eq.cast<SSCALAR>();\n  Matrix<SSCALAR,Dynamic,1> B_eq_fix_SSCALAR;\n  Matrix<SSCALAR,Dynamic,1> L0SSCALAR = L0.cast<SSCALAR>();\n  slice(L0SSCALAR, data.fixed_dim, B_eq_fix_SSCALAR);    \n  //MatrixXS rhsFull(Rcol.rows() + B_eq.rows() + B_eq_fix_SSCALAR.rows(), 1); \n\n  MatrixXS Lsep(data.m*(data.dim + 1), 3);  \n  const MatrixXS L_part2 = \n    data.M_FullSolve.block(0, Rcol.rows(), data.M_FullSolve.rows(), B_eq_SSCALAR.rows()) * B_eq_SSCALAR;\n  const MatrixXS L_part3 = \n    data.M_FullSolve.block(0, Rcol.rows() + B_eq_SSCALAR.rows(), data.M_FullSolve.rows(), B_eq_fix_SSCALAR.rows()) * B_eq_fix_SSCALAR;\n  MatrixXS L_part2and3 = L_part2 + L_part3;\n\n  // preallocate workspace variables:\n  MatrixXS Rxyz(k*data.dim, data.dim);  \n  MatrixXS L_part1xyz((data.dim + 1) * data.m, data.dim);\n  MatrixXS L_part1(data.dim * (data.dim + 1) * data.m, 1);\n\n#ifdef ARAP_GLOBAL_TIMING\n    double timer_prepFinished = get_seconds_hires();\n#endif\n\n#ifdef IGL_ARAP_DOF_FIXED_ITERATIONS_COUNT\n  while(iters < max_iters)\n#else\n  while(iters < max_iters && max_diff > tol)\n#endif\n  {  \n    if(data.print_timings)\n    {\n      sec_start = get_seconds_hires();\n    }\n\n#ifndef IGL_ARAP_DOF_FIXED_ITERATIONS_COUNT\n    L_prev = L_SSCALAR;\n#endif\n    ///////////////////////////////////////////////////////////////////////////\n    // Local step: Fix positions, fit rotations\n    ///////////////////////////////////////////////////////////////////////////    \n  \n    // Gather covariance matrices    \n\n    splitColumns(L_SSCALAR, data.m, data.dim, data.dim + 1, Lsep);\n\n    S = data.CSM * Lsep; \n    // interestingly, this doesn't seem to be so slow, but\n    //MKL is still 2x faster (probably due to AVX)\n    //#ifdef IGL_ARAP_DOF_DOUBLE_PRECISION_SOLVE\n    //    MKL_matMatMult_double(S, data.CSM, Lsep);\n    //#else\n    //    MKL_matMatMult_single(S, data.CSM, Lsep);\n    //#endif\n    \n    if(data.print_timings)\n    {\n      sec_covGather = get_seconds_hires();\n    }\n\n#ifdef EXTREME_VERBOSE\n    cout<<\"S=[\"<<endl<<S<<endl<<\"];\"<<endl;\n#endif\n    // Fit rotations to covariance matrices\n    if(data.effective_dim == 2)\n    {\n      fit_rotations_planar(S,R);\n    }else\n    {\n#ifdef __SSE__ // fit_rotations_SSE will convert to float if necessary\n      fit_rotations_SSE(S,R);\n#else\n      fit_rotations(S,false,R);\n#endif\n    }\n\n#ifdef EXTREME_VERBOSE\n    cout<<\"R=[\"<<endl<<R<<endl<<\"];\"<<endl;\n#endif  \n\n    if(data.print_timings)\n    {\n      sec_fitRotations = get_seconds_hires();\n    }\n  \n    ///////////////////////////////////////////////////////////////////////////\n    // \"Global\" step: fix rotations per mesh vertex, solve for\n    // linear transformations at handles\n    ///////////////////////////////////////////////////////////////////////////\n\n    // all this shuffling is retarded and not completely negligible time-wise;\n    // TODO: change fit_rotations_XXX so it returns R in the format ready for\n    // CSolveBlock1 multiplication\n    columnize(R, k, 2, Rcol);\n#ifdef EXTREME_VERBOSE\n    cout<<\"Rcol=[\"<<endl<<Rcol<<endl<<\"];\"<<endl;\n#endif  \n    splitColumns(Rcol, k, data.dim, data.dim, Rxyz);\n    \n    if(data.print_timings)\n    {\n      sec_prepMult = get_seconds_hires();\n    }  \n    \n    L_part1xyz = data.CSolveBlock1 * Rxyz;\n    //#ifdef IGL_ARAP_DOF_DOUBLE_PRECISION_SOLVE\n    //    MKL_matMatMult_double(L_part1xyz, data.CSolveBlock1, Rxyz);    \n    //#else\n    //    MKL_matMatMult_single(L_part1xyz, data.CSolveBlock1, Rxyz);    \n    //#endif\n    mergeColumns(L_part1xyz, data.m, data.dim, data.dim + 1, L_part1);\n\n    if(data.with_dynamics)\n    {\n      // Consider reordering or precomputing matrix multiplications\n      MatrixXS L_part1_dyn(data.dim * (data.dim + 1) * data.m, 1);\n      // Eigen can't parse this:\n      //L_part1_dyn = \n      //  -(2.0/(data.h*data.h)) * data.Pi_1 * data.Mass_tilde * data.L0 +\n      //   (1.0/(data.h*data.h)) * data.Pi_1 * data.Mass_tilde * data.Lm1;\n      // -1.0 because we've moved these linear terms to the right hand side\n      //MatrixXS temp = -1.0 * \n      //    ((-2.0/(data.h*data.h)) * data.L0.array() + \n      //      (1.0/(data.h*data.h)) * data.Lm1.array()).matrix();\n      //MatrixXS temp = -1.0 * \n      //    ( (-1.0/(data.h*data.h)) * data.L0.array() + \n      //      (1.0/(data.h*data.h)) * data.Lm1.array()\n      //      (-1.0/(data.h*data.h)) * data.L0.array() + \n      //      ).matrix();\n      //Lvel0 = (1.0/(data.h)) * data.Lm1.array() - data.L0.array();\n      MatrixXS temp = -1.0 * \n          ( (-1.0/(data.h*data.h)) * data.L0.array() + \n            (1.0/(data.h)) * data.Lvel0.array()\n            ).matrix();\n      MatrixXd temp_d = temp.template cast<double>();\n\n      MatrixXd temp_g = data.fgrav*(data.grav_mag*data.grav_dir);\n\n      assert(data.fext.rows() == temp_g.rows());\n      assert(data.fext.cols() == temp_g.cols());\n      MatrixXd temp2 = data.Mass_tilde * temp_d + temp_g + data.fext.template cast<double>();\n      MatrixXS temp2_f = temp2.template cast<SSCALAR>();\n      L_part1_dyn = data.Pi_1 * temp2_f;\n      L_part1.array() = L_part1.array() + L_part1_dyn.array();\n    }\n\n    //L_SSCALAR = L_part1 + L_part2and3;\n    assert(L_SSCALAR.rows() == L_part1.rows() && L_SSCALAR.rows() == L_part2and3.rows());\n    for (int i=0; i<L_SSCALAR.rows(); i++)\n    {\n      L_SSCALAR(i, 0) = L_part1(i, 0) + L_part2and3(i, 0);\n    }\n\n#ifdef EXTREME_VERBOSE\n    cout<<\"L=[\"<<endl<<L<<endl<<\"];\"<<endl;\n#endif  \n\n    if(data.print_timings)\n    {\n      sec_solve = get_seconds_hires();\n    }\n\n#ifndef IGL_ARAP_DOF_FIXED_ITERATIONS_COUNT\n    // Compute maximum absolute difference with last iteration's solution\n    max_diff = (L_SSCALAR-L_prev).eval().array().abs().matrix().maxCoeff();\n#endif\n    iters++;  \n\n    if(data.print_timings)\n    {\n      sec_end = get_seconds_hires();\n#ifndef WIN32\n      // trick to get sec_* variables to compile without warning on mac\n      if(false)\n#endif\n      printf(\n        \"\\ntotal iteration time = %f \"\n        \"[local: covGather = %f, \"\n        \"fitRotations = %f, \"\n        \"global: prep = %f, \"\n        \"solve = %f, \"\n        \"error = %f [ms]]\\n\", \n        (sec_end - sec_start)*1000.0, \n        (sec_covGather - sec_start)*1000.0, \n        (sec_fitRotations - sec_covGather)*1000.0, \n        (sec_prepMult - sec_fitRotations)*1000.0, \n        (sec_solve - sec_prepMult)*1000.0, \n        (sec_end - sec_solve)*1000.0 );\n    }\n  }\n\n\n  L = L_SSCALAR.template cast<double>();\n  assert(L.cols() == 1);\n\n#ifdef ARAP_GLOBAL_TIMING\n  double timer_finito = get_seconds_hires();\n  printf(\n    \"ARAP preparation = %f, \"\n    \"all %i iterations = %f [ms]\\n\", \n    (timer_prepFinished - timer_start)*1000.0, \n    max_iters, \n    (timer_finito - timer_prepFinished)*1000.0);  \n#endif\n\n  return true;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate bool igl::arap_dof_update<Eigen::Matrix<double, -1, -1, 0, -1, -1>, double>(ArapDOFData<Eigen::Matrix<double, -1, -1, 0, -1, -1>, double> const&, Eigen::Matrix<double, -1, 1, 0, -1, 1> const&, Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, int, double, Eigen::Matrix<double, -1, -1, 0, -1, -1>&);\ntemplate bool igl::arap_dof_recomputation<Eigen::Matrix<double, -1, -1, 0, -1, -1>, double>(Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, Eigen::SparseMatrix<double, 0, int> const&, ArapDOFData<Eigen::Matrix<double, -1, -1, 0, -1, -1>, double>&);\ntemplate bool igl::arap_dof_precomputation<Eigen::Matrix<double, -1, -1, 0, -1, -1>, double>(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, ArapDOFData<Eigen::Matrix<double, -1, -1, 0, -1, -1>, double>&);\ntemplate bool igl::arap_dof_update<Eigen::Matrix<double, -1, -1, 0, -1, -1>, float>(igl::ArapDOFData<Eigen::Matrix<double, -1, -1, 0, -1, -1>, float> const&, Eigen::Matrix<double, -1, 1, 0, -1, 1> const&, Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, int, double, Eigen::Matrix<double, -1, -1, 0, -1, -1>&);\ntemplate bool igl::arap_dof_recomputation<Eigen::Matrix<double, -1, -1, 0, -1, -1>, float>(Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, Eigen::SparseMatrix<double, 0, int> const&, igl::ArapDOFData<Eigen::Matrix<double, -1, -1, 0, -1, -1>, float>&);\ntemplate bool igl::arap_dof_precomputation<Eigen::Matrix<double, -1, -1, 0, -1, -1>, float>(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, igl::ArapDOFData<Eigen::Matrix<double, -1, -1, 0, -1, -1>, float>&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/arap_dof.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_ARAP_ENERGY_TYPE_DOF_H\n#define IGL_ARAP_ENERGY_TYPE_DOF_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Dense>\n#include <Eigen/Sparse>\n#include \"ARAPEnergyType.h\"\n#include <vector>\n\nnamespace igl\n{\n  // Caller example:\n  //\n  // Once:\n  // arap_dof_precomputation(...)\n  //\n  // Each frame:\n  // while(not satisfied)\n  //   arap_dof_update(...)\n  // end\n  \n  template <typename LbsMatrixType, typename SSCALAR>\n  struct ArapDOFData;\n  \n  ///////////////////////////////////////////////////////////////////////////\n  //\n  // Arap DOF precomputation consists of two parts the computation. The first is\n  // that which depends solely on the mesh (V,F), the linear blend skinning\n  // weights (M) and the groups G. Then there's the part that depends on the\n  // previous precomputation and the list of free and fixed vertices. \n  //\n  ///////////////////////////////////////////////////////////////////////////\n  \n  \n  // The code and variables differ from the description in Section 3 of \"Fast\n  // Automatic Skinning Transformations\" by [Jacobson et al. 2012]\n  // \n  // Here is a useful conversion table:\n  //\n  // [article]                             [code]\n  // S = \\tilde{K} T                       S = CSM * Lsep\n  // S --> R                               S --> R --shuffled--> Rxyz\n  // Gamma_solve RT = Pi_1 \\tilde{K} RT    L_part1xyz = CSolveBlock1 * Rxyz \n  // Pi_1 \\tilde{K}                        CSolveBlock1\n  // Peq = [T_full; P_pos]                 \n  // T_full                                B_eq_fix <--- L0\n  // P_pos                                 B_eq\n  // Pi_2 * P_eq =                         Lpart2and3 = Lpart2 + Lpart3\n  //   Pi_2_left T_full +                  Lpart3 = M_fullsolve(right) * B_eq_fix\n  //   Pi_2_right P_pos                    Lpart2 = M_fullsolve(left) * B_eq\n  // T = [Pi_1 Pi_2] [\\tilde{K}TRT P_eq]   L = Lpart1 + Lpart2and3\n  //\n  \n  // Precomputes the system we are going to optimize. This consists of building\n  // constructor matrices (to compute covariance matrices from transformations\n  // and to build the poisson solve right hand side from rotation matrix entries)\n  // and also prefactoring the poisson system.\n  //\n  // Inputs:\n  //   V  #V by dim list of vertex positions\n  //   F  #F by {3|4} list of face indices\n  //   M  #V * dim by #handles * dim * (dim+1) matrix such that\n  //     new_V(:) = LBS(V,W,A) = reshape(M * A,size(V)), where A is a column\n  //     vectors formed by the entries in each handle's dim by dim+1 \n  //     transformation matrix. Specifcally, A =\n  //       reshape(permute(Astack,[3 1 2]),n*dim*(dim+1),1)\n  //     or A = [Lxx;Lyx;Lxy;Lyy;tx;ty], and likewise for other dim\n  //     if Astack(:,:,i) is the dim by (dim+1) transformation at handle i\n  //     handles are ordered according to P then BE (point handles before bone\n  //     handles)\n  //   G  #V list of group indices (1 to k) for each vertex, such that vertex i \n  //     is assigned to group G(i)\n  // Outputs:\n  //   data  structure containing all necessary precomputation for calling\n  //     arap_dof_update\n  // Returns true on success, false on error\n  //\n  // See also: lbs_matrix_column\n  template <typename LbsMatrixType, typename SSCALAR>\n  IGL_INLINE bool arap_dof_precomputation(\n    const Eigen::MatrixXd & V, \n    const Eigen::MatrixXi & F,\n    const LbsMatrixType & M,\n    const Eigen::Matrix<int,Eigen::Dynamic,1> & G,\n    ArapDOFData<LbsMatrixType, SSCALAR> & data);\n  \n  // Should always be called after arap_dof_precomputation, but may be called in\n  // between successive calls to arap_dof_update, recomputes precomputation\n  // given that there are only changes in free and fixed\n  //\n  // Inputs:\n  //   fixed_dim  list of transformation element indices for fixed (or partailly\n  //   fixed) handles: not necessarily the complement of 'free'\n  //    NOTE: the constraints for fixed transformations still need to be\n  //    present in A_eq\n  //   A_eq  dim*#constraint_points by m*dim*(dim+1)  matrix of linear equality\n  //     constraint coefficients. Each row corresponds to a linear constraint,\n  //     so that A_eq * L = Beq says that the linear transformation entries in\n  //     the column L should produce the user supplied positional constraints\n  //     for each handle in Beq. The row A_eq(i*dim+d) corresponds to the\n  //     constrain on coordinate d of position i\n  // Outputs:\n  //   data  structure containing all necessary precomputation for calling\n  //     arap_dof_update\n  // Returns true on success, false on error\n  //\n  // See also: lbs_matrix_column\n  template <typename LbsMatrixType, typename SSCALAR>\n  IGL_INLINE bool arap_dof_recomputation(\n    const Eigen::Matrix<int,Eigen::Dynamic,1> & fixed_dim,\n    const Eigen::SparseMatrix<double> & A_eq,\n    ArapDOFData<LbsMatrixType, SSCALAR> & data);\n  \n  // Optimizes the transformations attached to each weight function based on\n  // precomputed system.\n  //\n  // Inputs:\n  //   data  precomputation data struct output from arap_dof_precomputation\n  //   Beq  dim*#constraint_points constraint values.\n  //   L0  #handles * dim * dim+1 list of initial guess transformation entries,\n  //     also holds fixed transformation entries for fixed handles\n  //   max_iters  maximum number of iterations\n  //   tol  stopping critera parameter. If variables (linear transformation\n  //     matrix entries) change by less than 'tol' the optimization terminates,\n  //       0.75 (weak tolerance)\n  //       0.0 (extreme tolerance)\n  // Outputs:\n  //   L  #handles * dim * dim+1 list of final optimized transformation entries,\n  //     allowed to be the same as L\n  template <typename LbsMatrixType, typename SSCALAR>\n  IGL_INLINE bool arap_dof_update(\n    const ArapDOFData<LbsMatrixType,SSCALAR> & data,\n    const Eigen::Matrix<double,Eigen::Dynamic,1> & B_eq,\n    const Eigen::MatrixXd & L0,\n    const int max_iters,\n    const double tol,\n    Eigen::MatrixXd & L\n    );\n  \n  // Structure that contains fields for all precomputed data or data that needs\n  // to be remembered at update\n  template <typename LbsMatrixType, typename SSCALAR>\n  struct ArapDOFData\n  {\n    typedef Eigen::Matrix<SSCALAR, Eigen::Dynamic, Eigen::Dynamic> MatrixXS;\n    // Type of arap energy we're solving\n    igl::ARAPEnergyType energy;\n    //// LU decomposition precomptation data; note: not used by araf_dop_update\n    //// any more, replaced by M_FullSolve\n    //igl::min_quad_with_fixed_data<double> lu_data;\n    // List of indices of fixed transformation entries\n    Eigen::Matrix<int,Eigen::Dynamic,1> fixed_dim;\n    // List of precomputed covariance scatter matrices multiplied by lbs\n    // matrices\n    //std::vector<Eigen::SparseMatrix<double> > CSM_M;\n    std::vector<Eigen::MatrixXd> CSM_M;\n    LbsMatrixType M_KG;\n    // Number of mesh vertices\n    int n;\n    // Number of weight functions\n    int m;\n    // Number of dimensions\n    int dim;\n    // Effective dimensions\n    int effective_dim;\n    // List of indices into C of positional constraints\n    Eigen::Matrix<int,Eigen::Dynamic,1> interpolated;\n    std::vector<bool> free_mask;\n    // Full quadratic coefficients matrix before lagrangian (should be dense)\n    LbsMatrixType Q;\n  \n  \n    //// Solve matrix for the global step\n    //Eigen::MatrixXd M_Solve; // TODO: remove from here\n  \n    // Full solve matrix that contains also conversion from rotations to the right hand side, \n    // i.e., solves Poisson transformations just from rotations and positional constraints\n    MatrixXS M_FullSolve;\n  \n    // Precomputed condensed matrices (3x3 commutators folded to 1x1):\n    MatrixXS CSM;\n    MatrixXS CSolveBlock1;\n  \n    // Print timings at each update\n    bool print_timings;\n  \n    // Dynamics\n    bool with_dynamics;\n    // I'm hiding the extra dynamics stuff in this struct, which sort of defeats\n    // the purpose of this function-based coding style...\n  \n    // Time step\n    double h;\n  \n    // L0  #handles * dim * dim+1 list of transformation entries from\n    // previous solve\n    MatrixXS L0;\n    //// Lm1  #handles * dim * dim+1 list of transformation entries from\n    //// previous-previous solve\n    //MatrixXS Lm1;\n    // \"Velocity\"\n    MatrixXS Lvel0;\n  \n    // #V by dim matrix of external forces\n    // fext\n    MatrixXS fext;\n  \n    // Mass_tilde: MT * Mass * M\n    LbsMatrixType Mass_tilde;\n  \n    // Force due to gravity (premultiplier)\n    Eigen::MatrixXd fgrav;\n    // Direction of gravity\n    Eigen::Vector3d grav_dir;\n    // Magnitude of gravity\n    double grav_mag;\n    \n    // Π1 from the paper\n    MatrixXS Pi_1;\n  \n    // Default values\n    ArapDOFData(): \n      energy(igl::ARAP_ENERGY_TYPE_SPOKES), \n      with_dynamics(false),\n      h(1),\n      grav_dir(0,-1,0),\n      grav_mag(0)\n    {\n    }\n  };\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"arap_dof.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/arap_linear_block.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"arap_linear_block.h\"\n#include \"verbose.h\"\n#include \"cotmatrix_entries.h\"\n#include <Eigen/Dense>\n\ntemplate <typename MatV, typename MatF, typename Scalar>\nIGL_INLINE void igl::arap_linear_block(\n  const MatV & V,\n  const MatF & F,\n  const int d,\n  const igl::ARAPEnergyType energy,\n  Eigen::SparseMatrix<Scalar> & Kd)\n{\n  switch(energy)\n  {\n    case ARAP_ENERGY_TYPE_SPOKES:\n      return igl::arap_linear_block_spokes(V,F,d,Kd);\n      break;\n    case ARAP_ENERGY_TYPE_SPOKES_AND_RIMS:\n      return igl::arap_linear_block_spokes_and_rims(V,F,d,Kd);\n      break;\n    case ARAP_ENERGY_TYPE_ELEMENTS:\n      return igl::arap_linear_block_elements(V,F,d,Kd);\n      break;\n    default:\n      verbose(\"Unsupported energy type: %d\\n\",energy);\n      assert(false);\n  }\n}\n\n\ntemplate <typename MatV, typename MatF, typename Scalar>\nIGL_INLINE void igl::arap_linear_block_spokes(\n  const MatV & V,\n  const MatF & F,\n  const int d,\n  Eigen::SparseMatrix<Scalar> & Kd)\n{\n  using namespace std;\n  using namespace Eigen;\n  // simplex size (3: triangles, 4: tetrahedra)\n  int simplex_size = F.cols();\n  // Number of elements\n  int m = F.rows();\n  // Temporary output\n  Matrix<int,Dynamic,2> edges;\n  Kd.resize(V.rows(), V.rows());\n  vector<Triplet<Scalar> > Kd_IJV;\n  if(simplex_size == 3)\n  {\n    // triangles\n    Kd.reserve(7*V.rows());\n    Kd_IJV.reserve(7*V.rows());\n    edges.resize(3,2);\n    edges << \n      1,2,\n      2,0,\n      0,1;\n  }else if(simplex_size == 4)\n  {\n    // tets\n    Kd.reserve(17*V.rows());\n    Kd_IJV.reserve(17*V.rows());\n    edges.resize(6,2);\n    edges << \n      1,2,\n      2,0,\n      0,1,\n      3,0,\n      3,1,\n      3,2;\n  }\n  // gather cotangent weights\n  Matrix<Scalar,Dynamic,Dynamic> C;\n  cotmatrix_entries(V,F,C);\n  // should have weights for each edge\n  assert(C.cols() == edges.rows());\n  // loop over elements\n  for(int i = 0;i<m;i++)\n  {\n    // loop over edges of element\n    for(int e = 0;e<edges.rows();e++)\n    {\n      int source = F(i,edges(e,0));\n      int dest = F(i,edges(e,1));\n      double v = 0.5*C(i,e)*(V(source,d)-V(dest,d));\n      Kd_IJV.push_back(Triplet<Scalar>(source,dest,v));\n      Kd_IJV.push_back(Triplet<Scalar>(dest,source,-v));\n      Kd_IJV.push_back(Triplet<Scalar>(source,source,v));\n      Kd_IJV.push_back(Triplet<Scalar>(dest,dest,-v));\n    }\n  }\n  Kd.setFromTriplets(Kd_IJV.begin(),Kd_IJV.end());\n  Kd.makeCompressed();\n}\n\ntemplate <typename MatV, typename MatF, typename Scalar>\nIGL_INLINE void igl::arap_linear_block_spokes_and_rims(\n  const MatV & V,\n  const MatF & F,\n  const int d,\n  Eigen::SparseMatrix<Scalar> & Kd)\n{\n  using namespace std;\n  using namespace Eigen;\n  // simplex size (3: triangles, 4: tetrahedra)\n  int simplex_size = F.cols();\n  // Number of elements\n  int m = F.rows();\n  // Temporary output\n  Kd.resize(V.rows(), V.rows());\n  vector<Triplet<Scalar> > Kd_IJV;\n  Matrix<int,Dynamic,2> edges;\n  if(simplex_size == 3)\n  {\n    // triangles\n    Kd.reserve(7*V.rows());\n    Kd_IJV.reserve(7*V.rows());\n    edges.resize(3,2);\n    edges << \n      1,2,\n      2,0,\n      0,1;\n  }else if(simplex_size == 4)\n  {\n    // tets\n    Kd.reserve(17*V.rows());\n    Kd_IJV.reserve(17*V.rows());\n    edges.resize(6,2);\n    edges << \n      1,2,\n      2,0,\n      0,1,\n      3,0,\n      3,1,\n      3,2;\n    // Not implemented yet for tets\n    assert(false);\n  }\n  // gather cotangent weights\n  Matrix<Scalar,Dynamic,Dynamic> C;\n  cotmatrix_entries(V,F,C);\n  // should have weights for each edge\n  assert(C.cols() == edges.rows());\n  // loop over elements\n  for(int i = 0;i<m;i++)\n  {\n    // loop over edges of element\n    for(int e = 0;e<edges.rows();e++)\n    {\n      int source = F(i,edges(e,0));\n      int dest = F(i,edges(e,1));\n      double v = C(i,e)*(V(source,d)-V(dest,d))/3.0;\n      // loop over edges again\n      for(int f = 0;f<edges.rows();f++)\n      {\n        int Rs = F(i,edges(f,0));\n        int Rd = F(i,edges(f,1));\n        if(Rs == source && Rd == dest)\n        {\n          Kd_IJV.push_back(Triplet<Scalar>(Rs,Rd,v));\n          Kd_IJV.push_back(Triplet<Scalar>(Rd,Rs,-v));\n        }else if(Rd == source)\n        {\n          Kd_IJV.push_back(Triplet<Scalar>(Rd,Rs,v));\n        }else if(Rs == dest)\n        {\n          Kd_IJV.push_back(Triplet<Scalar>(Rs,Rd,-v));\n        }\n      }\n      Kd_IJV.push_back(Triplet<Scalar>(source,source,v));\n      Kd_IJV.push_back(Triplet<Scalar>(dest,dest,-v));\n    }\n  }\n  Kd.setFromTriplets(Kd_IJV.begin(),Kd_IJV.end());\n  Kd.makeCompressed();\n}\n\ntemplate <typename MatV, typename MatF, typename Scalar>\nIGL_INLINE void igl::arap_linear_block_elements(\n  const MatV & V,\n  const MatF & F,\n  const int d,\n  Eigen::SparseMatrix<Scalar> & Kd)\n{\n  using namespace std;\n  using namespace Eigen;\n  // simplex size (3: triangles, 4: tetrahedra)\n  int simplex_size = F.cols();\n  // Number of elements\n  int m = F.rows();\n  // Temporary output\n  Kd.resize(V.rows(), F.rows());\n  vector<Triplet<Scalar> > Kd_IJV;\n  Matrix<int,Dynamic,2> edges;\n  if(simplex_size == 3)\n  {\n    // triangles\n    Kd.reserve(7*V.rows());\n    Kd_IJV.reserve(7*V.rows());\n    edges.resize(3,2);\n    edges << \n      1,2,\n      2,0,\n      0,1;\n  }else if(simplex_size == 4)\n  {\n    // tets\n    Kd.reserve(17*V.rows());\n    Kd_IJV.reserve(17*V.rows());\n    edges.resize(6,2);\n    edges << \n      1,2,\n      2,0,\n      0,1,\n      3,0,\n      3,1,\n      3,2;\n  }\n  // gather cotangent weights\n  Matrix<Scalar,Dynamic,Dynamic> C;\n  cotmatrix_entries(V,F,C);\n  // should have weights for each edge\n  assert(C.cols() == edges.rows());\n  // loop over elements\n  for(int i = 0;i<m;i++)\n  {\n    // loop over edges of element\n    for(int e = 0;e<edges.rows();e++)\n    {\n      int source = F(i,edges(e,0));\n      int dest = F(i,edges(e,1));\n      double v = C(i,e)*(V(source,d)-V(dest,d));\n      Kd_IJV.push_back(Triplet<Scalar>(source,i,v));\n      Kd_IJV.push_back(Triplet<Scalar>(dest,i,-v));\n    }\n  }\n  Kd.setFromTriplets(Kd_IJV.begin(),Kd_IJV.end());\n  Kd.makeCompressed();\n}\n\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate IGL_INLINE void igl::arap_linear_block<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, double>(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, int, igl::ARAPEnergyType, Eigen::SparseMatrix<double, 0, int>&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/arap_linear_block.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_ARAP_LINEAR_BLOCK_H\n#define IGL_ARAP_LINEAR_BLOCK_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Sparse>\n#include <igl/ARAPEnergyType.h>\n\nnamespace igl\n{\n  // ARAP_LINEAR_BLOCK constructs a block of the matrix which constructs the\n  // linear terms of a given arap energy. When treating rotations as knowns\n  // (arranged in a column) then this constructs Kd of K such that the linear\n  // portion of the energy is as a column:\n  //   K * R = [Kx Z  ... Ky Z  ... \n  //            Z  Kx ... Z  Ky ... \n  //            ... ]\n  // These blocks are also used to build the \"covariance scatter matrices\".\n  // Here we want to build a scatter matrix that multiplies against positions\n  // (treated as known) producing covariance matrices to fit each rotation.\n  // Notice that in the case of the RHS of the poisson solve the rotations are\n  // known and the positions unknown, and vice versa for rotation fitting.\n  // These linear block just relate the rotations to the positions, linearly in\n  // each.\n  //\n  // Templates:\n  //   MatV  vertex position matrix, e.g. Eigen::MatrixXd\n  //   MatF  face index matrix, e.g. Eigen::MatrixXd\n  //   Scalar  e.g. double\n  // Inputs:\n  //   V  #V by dim list of initial domain positions\n  //   F  #F by #simplex size list of triangle indices into V\n  //   d  coordinate of linear constructor to build\n  //   energy  ARAPEnergyType enum value defining which energy is being used.\n  //     See ARAPEnergyType.h for valid options and explanations.\n  // Outputs:\n  //   Kd  #V by #V/#F block of the linear constructor matrix corresponding to\n  //     coordinate d\n  //\n  template <typename MatV, typename MatF, typename Scalar>\n  IGL_INLINE void arap_linear_block(\n    const MatV & V,\n    const MatF & F,\n    const int d,\n    const igl::ARAPEnergyType energy,\n    Eigen::SparseMatrix<Scalar> & Kd);\n  // Helper functions for each energy type\n  template <typename MatV, typename MatF, typename Scalar>\n  IGL_INLINE void arap_linear_block_spokes(\n    const MatV & V,\n    const MatF & F,\n    const int d,\n    Eigen::SparseMatrix<Scalar> & Kd);\n  template <typename MatV, typename MatF, typename Scalar>\n  IGL_INLINE void arap_linear_block_spokes_and_rims(\n    const MatV & V,\n    const MatF & F,\n    const int d,\n    Eigen::SparseMatrix<Scalar> & Kd);\n  template <typename MatV, typename MatF, typename Scalar>\n  IGL_INLINE void arap_linear_block_elements(\n    const MatV & V,\n    const MatF & F,\n    const int d,\n    Eigen::SparseMatrix<Scalar> & Kd);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"arap_linear_block.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/arap_rhs.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"arap_rhs.h\"\n#include \"arap_linear_block.h\"\n#include \"verbose.h\"\n#include \"repdiag.h\"\n#include \"cat.h\"\n#include <iostream>\n\nIGL_INLINE void igl::arap_rhs(\n  const Eigen::MatrixXd & V, \n  const Eigen::MatrixXi & F,\n  const int dim,\n  const igl::ARAPEnergyType energy,\n  Eigen::SparseMatrix<double>& K)\n{\n  using namespace std;\n  using namespace Eigen;\n  // Number of dimensions\n  int Vdim = V.cols();\n  //// Number of mesh vertices\n  //int n = V.rows();\n  //// Number of mesh elements\n  //int m = F.rows();\n  //// number of rotations\n  //int nr;\n  switch(energy)\n  {\n    case ARAP_ENERGY_TYPE_SPOKES:\n      //nr = n;\n      break;\n    case ARAP_ENERGY_TYPE_SPOKES_AND_RIMS:\n      //nr = n;\n      break;\n    case ARAP_ENERGY_TYPE_ELEMENTS:\n      //nr = m;\n      break;\n    default:\n      fprintf(\n        stderr,\n        \"arap_rhs.h: Error: Unsupported arap energy %d\\n\",\n        energy);\n      return;\n  }\n\n  SparseMatrix<double> KX,KY,KZ;\n  arap_linear_block(V,F,0,energy,KX);\n  arap_linear_block(V,F,1,energy,KY);\n  if(Vdim == 2)\n  {\n    K = cat(2,repdiag(KX,dim),repdiag(KY,dim));\n  }else if(Vdim == 3)\n  {\n    arap_linear_block(V,F,2,energy,KZ);\n    if(dim == 3)\n    {\n      K = cat(2,cat(2,repdiag(KX,dim),repdiag(KY,dim)),repdiag(KZ,dim));\n    }else if(dim ==2)\n    {\n      SparseMatrix<double> ZZ(KX.rows()*2,KX.cols());\n      K = cat(2,cat(2,\n            cat(2,repdiag(KX,dim),ZZ),\n            cat(2,repdiag(KY,dim),ZZ)),\n            cat(2,repdiag(KZ,dim),ZZ));\n    }else\n    {\n      assert(false);\n      fprintf(\n      stderr,\n      \"arap_rhs.h: Error: Unsupported dimension %d\\n\",\n      dim);\n    }\n  }else\n  {\n    assert(false);\n    fprintf(\n     stderr,\n     \"arap_rhs.h: Error: Unsupported dimension %d\\n\",\n     Vdim);\n    return;\n  }\n  \n}\n\n"
  },
  {
    "path": "libs/libigl/include/igl/arap_rhs.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_ARAP_RHS_H\n#define IGL_ARAP_RHS_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Dense>\n#include <Eigen/Sparse>\n#include <igl/ARAPEnergyType.h>\n\nnamespace igl\n{\n  // ARAP_RHS build right-hand side constructor of global poisson solve for\n  // various Arap energies\n  // Inputs:\n  //   V  #V by Vdim list of initial domain positions\n  //   F  #F by 3 list of triangle indices into V\n  //   dim  dimension being used at solve time. For deformation usually dim =\n  //     V.cols(), for surface parameterization V.cols() = 3 and dim = 2\n  //   energy  igl::ARAPEnergyType enum value defining which energy is being\n  //     used. See igl::ARAPEnergyType.h for valid options and explanations.\n  // Outputs:\n  //   K  #V*dim by #(F|V)*dim*dim matrix such that: \n  //     b = K * reshape(permute(R,[3 1 2]),size(V|F,1)*size(V,2)*size(V,2),1);\n  //   \n  // See also: arap_linear_block\n  IGL_INLINE void arap_rhs(\n    const Eigen::MatrixXd & V, \n    const Eigen::MatrixXi & F,\n    const int dim,\n    const igl::ARAPEnergyType energy,\n    Eigen::SparseMatrix<double>& K);\n}\n#ifndef IGL_STATIC_LIBRARY\n#include \"arap_rhs.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/average_onto_faces.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"average_onto_faces.h\"\n\ntemplate <typename T, typename I>\nIGL_INLINE void igl::average_onto_faces(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> &V,\n            const Eigen::Matrix<I, Eigen::Dynamic, Eigen::Dynamic> &F,\n            const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> &S,\n            Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> &SF)\n{\n  \n  SF = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>::Zero(F.rows(),S.cols());\n\n  for (int i = 0; i <F.rows(); ++i)\n    for (int j = 0; j<F.cols(); ++j)\n      SF.row(i) += S.row(F(i,j));\n\n  SF.array() /= F.cols();\n  \n};\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/average_onto_faces.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_AVERAGE_ONTO_FACES_H\n#define IGL_AVERAGE_ONTO_FACES_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Dense>\nnamespace igl \n{\n  // average_onto_vertices \n  // Move a scalar field defined on faces to vertices by averaging\n  //\n  // Input:\n  // V,F: mesh\n  // S: scalar field defined on vertices, Vx1\n  // \n  // Output:\n  // SV: scalar field defined on faces\n  template <typename T, typename I>\n  IGL_INLINE void average_onto_faces(\n    const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> &V,\n    const Eigen::Matrix<I, Eigen::Dynamic, Eigen::Dynamic> &F,\n    const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> &S,\n    Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> &SF);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"average_onto_faces.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/average_onto_vertices.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"average_onto_vertices.h\"\n\ntemplate<typename DerivedV,typename DerivedF,typename DerivedS>\nIGL_INLINE void igl::average_onto_vertices(const Eigen::MatrixBase<DerivedV> &V,\n  const Eigen::MatrixBase<DerivedF> &F,\n  const Eigen::MatrixBase<DerivedS> &S,\n  Eigen::MatrixBase<DerivedS> &SV)\n{\n  SV = DerivedS::Zero(V.rows(),S.cols());\n  Eigen::Matrix<typename DerivedF::Scalar,Eigen::Dynamic,1> COUNT(V.rows());\n  COUNT.setZero();\n  for (int i = 0; i <F.rows(); ++i)\n  {\n    for (int j = 0; j<F.cols(); ++j)\n    {\n      SV.row(F(i,j)) += S.row(i);\n      COUNT[F(i,j)] ++;\n    }\n  }\n  for (int i = 0; i <V.rows(); ++i)\n    SV.row(i) /= COUNT[i];\n};\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/average_onto_vertices.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_AVERAGE_ONTO_VERTICES_H\n#define IGL_AVERAGE_ONTO_VERTICES_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Dense>\nnamespace igl \n{\n  // average_onto_vertices \n  // Move a scalar field defined on faces to vertices by averaging\n  //\n  // Input:\n  // V,F: mesh\n  // S: scalar field defined on faces, Fx1\n  // \n  // Output:\n  // SV: scalar field defined on vertices\n  template<typename DerivedV,typename DerivedF,typename DerivedS>\n  IGL_INLINE void average_onto_vertices(const Eigen::MatrixBase<DerivedV> &V,\n    const Eigen::MatrixBase<DerivedF> &F,\n    const Eigen::MatrixBase<DerivedS> &S,\n    Eigen::MatrixBase<DerivedS> &SV);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"average_onto_vertices.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/avg_edge_length.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"avg_edge_length.h\"\n\n#include <vector>\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE double igl::avg_edge_length(\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F)\n{\n  double avg = 0;\n  long int count = 0;\n\n  for (unsigned i=0;i<F.rows();++i)\n  {\n    for (unsigned j=0;j<F.cols();++j)\n    {\n      ++count;\n      avg += (V.row(F(i,j)) - V.row(F(i,(j+1)%F.cols()))).norm();\n    }\n  }\n\n  return avg / (double) count;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate double igl::avg_edge_length<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&);\ntemplate double igl::avg_edge_length<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&);\n// generated by autoexplicit.sh\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/avg_edge_length.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_AVERAGEEDGELENGTH_H\n#define IGL_AVERAGEEDGELENGTH_H\n\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <string>\n#include <vector>\n\nnamespace igl \n{\n  // Compute the average edge length for the given triangle mesh\n  // Templates:\n  //   DerivedV derived from vertex positions matrix type: i.e. MatrixXd\n  //   DerivedF derived from face indices matrix type: i.e. MatrixXi\n  //   DerivedL derived from edge lengths matrix type: i.e. MatrixXd\n  // Inputs:\n  //   V  eigen matrix #V by 3\n  //   F  #F by simplex-size list of mesh faces (must be simplex)\n  // Outputs:\n  //   l  average edge length\n  //\n  // See also: adjacency_matrix\n  template <typename DerivedV, typename DerivedF>\n  IGL_INLINE double avg_edge_length(\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F);\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"avg_edge_length.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/axis_angle_to_quat.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"axis_angle_to_quat.h\"\n#include \"EPS.h\"\n#include <cmath>\n\n// http://www.antisphere.com/Wiki/tools:anttweakbar\ntemplate <typename Q_type>\nIGL_INLINE void igl::axis_angle_to_quat(\n  const Q_type *axis, \n  const Q_type angle,\n  Q_type *out)\n{\n    Q_type n = axis[0]*axis[0] + axis[1]*axis[1] + axis[2]*axis[2];\n    if( fabs(n)>igl::EPS<Q_type>())\n    {\n        Q_type f = 0.5*angle;\n        out[3] = cos(f);\n        f = sin(f)/sqrt(n);\n        out[0] = axis[0]*f;\n        out[1] = axis[1]*f;\n        out[2] = axis[2]*f;\n    }\n    else\n    {\n        out[3] = 1.0;\n        out[0] = out[1] = out[2] = 0.0;\n    }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::axis_angle_to_quat<double>(double const*, double, double*);\n// generated by autoexplicit.sh\ntemplate void igl::axis_angle_to_quat<float>(float const*, float, float*);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/axis_angle_to_quat.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_AXIS_ANGLE_TO_QUAT_H\n#define IGL_AXIS_ANGLE_TO_QUAT_H\n#include \"igl_inline.h\"\n\nnamespace igl\n{\n  // Convert axis angle representation of a rotation to a quaternion\n  // A Quaternion, q, is defined here as an arrays of four scalars (x,y,z,w),\n  // such that q = x*i + y*j + z*k + w\n  // Inputs:\n  //   axis  3d vector\n  //   angle  scalar\n  // Outputs:\n  //   quaternion\n  template <typename Q_type>\n  IGL_INLINE void axis_angle_to_quat(\n    const Q_type *axis, \n    const Q_type angle,\n    Q_type *out);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"axis_angle_to_quat.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/barycenter.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"barycenter.h\"\n\ntemplate <\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedBC>\nIGL_INLINE void igl::barycenter(\n    const Eigen::PlainObjectBase<DerivedV> & V,\n    const Eigen::PlainObjectBase<DerivedF> & F,\n    Eigen::PlainObjectBase<DerivedBC> & BC)\n{\n  BC.setZero(F.rows(),V.cols());\n  // Loop over faces\n  for(int i = 0;i<F.rows();i++)\n  {\n    // loop around face\n    for(int j = 0;j<F.cols();j++)\n    {\n      // Accumulate\n      BC.row(i) += V.row(F(i,j));\n    }\n    // average\n    BC.row(i) /= double(F.cols());\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::barycenter<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 4, 0, -1, 4> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 4, 0, -1, 4> >&);\ntemplate void igl::barycenter<Eigen::Matrix<double, -1, 4, 0, -1, 4>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 4, 0, -1, 4> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 4, 0, -1, 4> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 4, 0, -1, 4> >&);\ntemplate void igl::barycenter<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\ntemplate void igl::barycenter<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::barycenter<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\ntemplate void igl::barycenter<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::barycenter<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 2, 0, -1, 2> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/barycenter.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_BARYCENTER_H\n#define IGL_BARYCENTER_H\n#include \"igl_inline.h\"\n#include <Eigen/Dense>\nnamespace igl\n{\n  // Computes the barycenter of every simplex\n  //\n  // Inputs:\n  //   V  #V x dim matrix of vertex coordinates\n  //   F  #F x simplex_size  matrix of indices of simplex corners into V\n  // Output:\n  //   BC  #F x dim matrix of 3d vertices\n  //\n  template <\n    typename DerivedV,\n    typename DerivedF,\n    typename DerivedBC>\n  IGL_INLINE void barycenter(\n      const Eigen::PlainObjectBase<DerivedV> & V,\n      const Eigen::PlainObjectBase<DerivedF> & F,\n      Eigen::PlainObjectBase<DerivedBC> & BC);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"barycenter.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/barycentric_coordinates.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"barycentric_coordinates.h\"\n#include \"volume.h\"\n\ntemplate <\n  typename DerivedP,\n  typename DerivedA,\n  typename DerivedB,\n  typename DerivedC,\n  typename DerivedD,\n  typename DerivedL>\nIGL_INLINE void igl::barycentric_coordinates(\n  const Eigen::PlainObjectBase<DerivedP> & P,\n  const Eigen::PlainObjectBase<DerivedA> & A,\n  const Eigen::PlainObjectBase<DerivedB> & B,\n  const Eigen::PlainObjectBase<DerivedC> & C,\n  const Eigen::PlainObjectBase<DerivedD> & D,\n  Eigen::PlainObjectBase<DerivedL> & L)\n{\n  using namespace Eigen;\n  assert(P.cols() == 3 && \"query must be in 3d\");\n  assert(A.cols() == 3 && \"corners must be in 3d\");\n  assert(B.cols() == 3 && \"corners must be in 3d\");\n  assert(C.cols() == 3 && \"corners must be in 3d\");\n  assert(D.cols() == 3 && \"corners must be in 3d\");\n  assert(P.rows() == A.rows() && \"Must have same number of queries as corners\");\n  assert(A.rows() == B.rows() && \"Corners must be same size\");\n  assert(A.rows() == C.rows() && \"Corners must be same size\");\n  assert(A.rows() == D.rows() && \"Corners must be same size\");\n  typedef Matrix<typename DerivedL::Scalar,DerivedL::RowsAtCompileTime,1> \n    VectorXS;\n  // Total volume\n  VectorXS vol,LA,LB,LC,LD;\n  volume(B,D,C,P,LA);\n  volume(A,C,D,P,LB);\n  volume(A,D,B,P,LC);\n  volume(A,B,C,P,LD);\n  volume(A,B,C,D,vol);\n  L.resize(P.rows(),4);\n  L<<LA,LB,LC,LD;\n  L.array().colwise() /= vol.array();\n}\n\ntemplate <\n  typename DerivedP,\n  typename DerivedA,\n  typename DerivedB,\n  typename DerivedC,\n  typename DerivedL>\nIGL_INLINE void igl::barycentric_coordinates(\n  const Eigen::MatrixBase<DerivedP> & P,\n  const Eigen::MatrixBase<DerivedA> & A,\n  const Eigen::MatrixBase<DerivedB> & B,\n  const Eigen::MatrixBase<DerivedC> & C,\n  Eigen::PlainObjectBase<DerivedL> & L)\n{\n  using namespace Eigen;\n#ifndef NDEBUG\n  const int DIM = P.cols();\n  assert(A.cols() == DIM && \"corners must be in same dimension as query\");\n  assert(B.cols() == DIM && \"corners must be in same dimension as query\");\n  assert(C.cols() == DIM && \"corners must be in same dimension as query\");\n  assert(P.rows() == A.rows() && \"Must have same number of queries as corners\");\n  assert(A.rows() == B.rows() && \"Corners must be same size\");\n  assert(A.rows() == C.rows() && \"Corners must be same size\");\n#endif\n\n  // http://gamedev.stackexchange.com/a/23745\n  typedef \n    Eigen::Array<\n      typename DerivedP::Scalar,\n               DerivedP::RowsAtCompileTime,\n               DerivedP::ColsAtCompileTime>\n    ArrayS;\n  typedef \n    Eigen::Array<\n      typename DerivedP::Scalar,\n               DerivedP::RowsAtCompileTime,\n               1>\n    VectorS;\n\n  const ArrayS v0 = B.array() - A.array();\n  const ArrayS v1 = C.array() - A.array();\n  const ArrayS v2 = P.array() - A.array();\n  VectorS d00 = (v0*v0).rowwise().sum();\n  VectorS d01 = (v0*v1).rowwise().sum();\n  VectorS d11 = (v1*v1).rowwise().sum();\n  VectorS d20 = (v2*v0).rowwise().sum();\n  VectorS d21 = (v2*v1).rowwise().sum();\n  VectorS denom = d00 * d11 - d01 * d01;\n  L.resize(P.rows(),3);\n  L.col(1) = (d11 * d20 - d01 * d21) / denom;\n  L.col(2) = (d00 * d21 - d01 * d20) / denom;\n  L.col(0) = 1.0f -(L.col(1) + L.col(2)).array();\n}\n\n#ifdef IGL_STATIC_LIBRARY\ntemplate void igl::barycentric_coordinates<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::barycentric_coordinates<Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix<double, 1, 3, 1, 1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> >&);\ntemplate void igl::barycentric_coordinates<Eigen::Matrix<double, 1, 2, 1, 1, 2>, Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 1, -1, false>, Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 1, -1, false>, Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 1, -1, false>, Eigen::Matrix<double, 1, 3, 1, 1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, 1, 2, 1, 1, 2> > const&, Eigen::MatrixBase<Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 1, -1, false> > const&, Eigen::MatrixBase<Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 1, -1, false> > const&, Eigen::MatrixBase<Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 1, -1, false> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> >&);\ntemplate void igl::barycentric_coordinates<Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 1, -1, false>, Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 1, -1, false>, Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 1, -1, false>, Eigen::Matrix<double, 1, 3, 1, 1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, Eigen::MatrixBase<Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 1, -1, false> > const&, Eigen::MatrixBase<Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 1, -1, false> > const&, Eigen::MatrixBase<Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 1, -1, false> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> >&);\ntemplate void igl::barycentric_coordinates<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/barycentric_coordinates.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_BARYCENTRIC_COORDINATES_H\n#define IGL_BARYCENTRIC_COORDINATES_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Compute barycentric coordinates in a tet\n  //\n  // Inputs:\n  //   P  #P by 3 Query points in 3d\n  //   A  #P by 3 Tet corners in 3d\n  //   B  #P by 3 Tet corners in 3d\n  //   C  #P by 3 Tet corners in 3d\n  //   D  #P by 3 Tet corners in 3d\n  // Outputs:\n  //   L  #P by 4 list of barycentric coordinates\n  //   \n  template <\n    typename DerivedP,\n    typename DerivedA,\n    typename DerivedB,\n    typename DerivedC,\n    typename DerivedD,\n    typename DerivedL>\n  IGL_INLINE void barycentric_coordinates(\n    const Eigen::PlainObjectBase<DerivedP> & P,\n    const Eigen::PlainObjectBase<DerivedA> & A,\n    const Eigen::PlainObjectBase<DerivedB> & B,\n    const Eigen::PlainObjectBase<DerivedC> & C,\n    const Eigen::PlainObjectBase<DerivedD> & D,\n    Eigen::PlainObjectBase<DerivedL> & L);\n  // Compute barycentric coordinates in a triangle\n  //\n  // Inputs:\n  //   P  #P by dim Query points\n  //   A  #P by dim Triangle corners\n  //   B  #P by dim Triangle corners\n  //   C  #P by dim Triangle corners\n  // Outputs:\n  //   L  #P by 3 list of barycentric coordinates\n  //   \n  template <\n    typename DerivedP,\n    typename DerivedA,\n    typename DerivedB,\n    typename DerivedC,\n    typename DerivedL>\n  IGL_INLINE void barycentric_coordinates(\n    const Eigen::MatrixBase<DerivedP> & P,\n    const Eigen::MatrixBase<DerivedA> & A,\n    const Eigen::MatrixBase<DerivedB> & B,\n    const Eigen::MatrixBase<DerivedC> & C,\n    Eigen::PlainObjectBase<DerivedL> & L);\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"barycentric_coordinates.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/barycentric_to_global.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"barycentric_to_global.h\"\n\n// For error printing\n#include <cstdio>\n#include <vector>\n\nnamespace igl\n{\n  template <typename Scalar, typename Index>\n  IGL_INLINE Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic> barycentric_to_global(\n    const Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic> & V,\n    const Eigen::Matrix<Index,Eigen::Dynamic,Eigen::Dynamic>  & F,\n    const Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic> & bc)\n  {\n    Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic> R;\n    R.resize(bc.rows(),3);\n\n    for (unsigned i=0; i<R.rows(); ++i)\n    {\n      unsigned id = round(bc(i,0));\n      double u   = bc(i,1);\n      double v   = bc(i,2);\n\n      if (id != -1)\n        R.row(i) = V.row(F(id,0)) +\n                  ((V.row(F(id,1)) - V.row(F(id,0))) * u +\n                   (V.row(F(id,2)) - V.row(F(id,0))) * v  );\n      else\n        R.row(i) << 0,0,0;\n    }\n    return R;\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\ntemplate Eigen::Matrix<double, -1, -1, 0, -1, -1> igl::barycentric_to_global<double, int>(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, Eigen::Matrix<double, -1, -1, 0, -1, -1> const&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/barycentric_to_global.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Daniele Panozzo <daniele.panozzo@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_BARYCENTRIC2GLOBAL_H\n#define IGL_BARYCENTRIC2GLOBAL_H\n#include <igl/igl_inline.h>\n\n#include <Eigen/Dense>\n#include <Eigen/Sparse>\n\nnamespace igl \n{\n  // Converts barycentric coordinates in the embree form to 3D coordinates\n  // Embree stores barycentric coordinates as triples: fid, bc1, bc2\n  // fid is the id of a face, bc1 is the displacement of the point wrt the \n  // first vertex v0 and the edge v1-v0. Similarly, bc2 is the displacement\n  // wrt v2-v0.\n  // \n  // Input:\n  // V:  #Vx3 Vertices of the mesh\n  // F:  #Fxe Faces of the mesh\n  // bc: #Xx3 Barycentric coordinates, one row per point\n  //\n  // Output:\n  // #X: #Xx3 3D coordinates of all points in bc\n  template <typename Scalar, typename Index>\n  IGL_INLINE Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic> \n    barycentric_to_global(\n      const Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic> & V, \n      const Eigen::Matrix<Index,Eigen::Dynamic,Eigen::Dynamic>   & F, \n      const Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic>  & bc);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"barycentric_to_global.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/basename.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"basename.h\"\n\n#include <algorithm>\n\nIGL_INLINE std::string igl::basename(const std::string & path)\n{\n  if(path == \"\")\n  {\n    return std::string(\"\");\n  }\n  // http://stackoverflow.com/questions/5077693/dirnamephp-similar-function-in-c\n  std::string::const_reverse_iterator last_slash =\n    std::find(\n      path.rbegin(), \n      path.rend(), '/');\n  if( last_slash == path.rend() )\n  {\n    // No slashes found\n    return path;\n  }else if(1 == (last_slash.base() - path.begin()))\n  {\n    // Slash is first char\n    return std::string(path.begin()+1,path.end());\n  }else if(path.end() == last_slash.base() )\n  {\n    // Slash is last char\n    std::string redo = std::string(path.begin(),path.end()-1);\n    return igl::basename(redo);\n  }\n  return std::string(last_slash.base(),path.end());\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/basename.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_BASENAME_H\n#define IGL_BASENAME_H\n#include \"igl_inline.h\"\n\n#include <string>\n\nnamespace igl\n{\n  // Function like PHP's basename: /etc/sudoers.d --> sudoers.d\n  // Input:\n  //  path  string containing input path\n  // Returns string containing basename (see php's basename)\n  //\n  // See also: dirname, pathinfo\n  IGL_INLINE std::string basename(const std::string & path);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"basename.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/bbw/bbw.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"bbw.h\"\n\n#include <igl/cotmatrix.h>\n#include <igl/massmatrix.h>\n#include <igl/invert_diag.h>\n#include <igl/speye.h>\n#include <igl/slice_into.h>\n#include <igl/min_quad_with_fixed.h>\n\n#define EIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET\n#include <Eigen/Sparse>\n\n#include <iostream>\n#include <cstdio>\n\n\nigl::BBWData::BBWData():\n  partition_unity(false),\n  W0(),\n#ifndef IGL_NO_MOSEK\n  mosek_data(),\n#endif\n  active_set_params(),\n  qp_solver(QP_SOLVER_IGL_ACTIVE_SET),\n  verbosity(0)\n{\n  // We know that the Bilaplacian is positive semi-definite\n  active_set_params.Auu_pd = true;\n}\n\nvoid igl::BBWData::print()\n{\n  using namespace std;\n  cout<<\"partition_unity: \"<<partition_unity<<endl;\n  cout<<\"W0=[\"<<endl<<W0<<endl<<\"];\"<<endl;\n  cout<<\"qp_solver: \"<<QPSolverNames[qp_solver]<<endl;\n}\n\n\ntemplate <\n  typename DerivedV, \n  typename DerivedEle, \n  typename Derivedb,\n  typename Derivedbc, \n  typename DerivedW>\nIGL_INLINE bool igl::bbw(\n  const Eigen::PlainObjectBase<DerivedV> & V, \n  const Eigen::PlainObjectBase<DerivedEle> & Ele, \n  const Eigen::PlainObjectBase<Derivedb> & b, \n  const Eigen::PlainObjectBase<Derivedbc> & bc, \n  igl::BBWData & data,\n  Eigen::PlainObjectBase<DerivedW> & W\n  )\n{\n  using namespace igl;\n  using namespace std;\n  using namespace Eigen;\n\n  // number of domain vertices\n  int n = V.rows();\n  // number of handles\n  int m = bc.cols();\n\n  SparseMatrix<typename DerivedW::Scalar> L;\n  cotmatrix(V,Ele,L);\n  MassMatrixType mmtype = MASSMATRIX_TYPE_VORONOI;\n  if(Ele.cols() == 4)\n  {\n    mmtype = MASSMATRIX_TYPE_BARYCENTRIC;\n  }\n  SparseMatrix<typename DerivedW::Scalar> M;\n  SparseMatrix<typename DerivedW::Scalar> Mi;\n  massmatrix(V,Ele,mmtype,M);\n\n  invert_diag(M,Mi);\n\n  // Biharmonic operator\n  SparseMatrix<typename DerivedW::Scalar> Q = L.transpose() * Mi * L;\n\n  W.derived().resize(n,m);\n  if(data.partition_unity)\n  {\n    // Not yet implemented\n    assert(false);\n  }else\n  {\n    // No linear terms\n    VectorXd c = VectorXd::Zero(n);\n    // No linear constraints\n    SparseMatrix<typename DerivedW::Scalar> A(0,n),Aeq(0,n),Aieq(0,n);\n    VectorXd uc(0,1),Beq(0,1),Bieq(0,1),lc(0,1);\n    // Upper and lower box constraints (Constant bounds)\n    VectorXd ux = VectorXd::Ones(n);\n    VectorXd lx = VectorXd::Zero(n);\n    active_set_params eff_params = data.active_set_params;\n    switch(data.qp_solver)\n    {\n      case QP_SOLVER_IGL_ACTIVE_SET:\n      {\n        if(data.verbosity >= 1)\n        {\n          cout<<\"BBW: max_iter: \"<<data.active_set_params.max_iter<<endl;\n          cout<<\"BBW: eff_max_iter: \"<<eff_params.max_iter<<endl;\n        }\n        if(data.verbosity >= 1)\n        {\n          cout<<\"BBW: Computing initial weights for \"<<m<<\" handle\"<<\n            (m!=1?\"s\":\"\")<<\".\"<<endl;\n        }\n        min_quad_with_fixed_data<typename DerivedW::Scalar > mqwf;\n        min_quad_with_fixed_precompute(Q,b,Aeq,true,mqwf);\n        min_quad_with_fixed_solve(mqwf,c,bc,Beq,W);\n        // decrement\n        eff_params.max_iter--;\n        bool error = false;\n        // Loop over handles\n#pragma omp parallel for\n        for(int i = 0;i<m;i++)\n        {\n          // Quicker exit for openmp\n          if(error)\n          {\n            continue;\n          }\n          if(data.verbosity >= 1)\n          {\n#pragma omp critical\n            cout<<\"BBW: Computing weight for handle \"<<i+1<<\" out of \"<<m<<\n              \".\"<<endl;\n          }\n          VectorXd bci = bc.col(i);\n          VectorXd Wi;\n          // use initial guess\n          Wi = W.col(i);\n          SolverStatus ret = active_set(\n              Q,c,b,bci,Aeq,Beq,Aieq,Bieq,lx,ux,eff_params,Wi);\n          switch(ret)\n          {\n            case SOLVER_STATUS_CONVERGED:\n              break;\n            case SOLVER_STATUS_MAX_ITER:\n              cerr<<\"active_set: max iter without convergence.\"<<endl;\n              break;\n            case SOLVER_STATUS_ERROR:\n            default:\n              cerr<<\"active_set error.\"<<endl;\n              error = true;\n          }\n          W.col(i) = Wi;\n        }\n        if(error)\n        {\n          return false;\n        }\n        break;\n      }\n      case QP_SOLVER_MOSEK:\n      {\n#ifdef IGL_NO_MOSEK\n        assert(false && \"Use another QPSolver. Recompile without IGL_NO_MOSEK defined.\");\n        cerr<<\"Use another QPSolver. Recompile without IGL_NO_MOSEK defined.\"<<endl;\n        return false;\n#else\n        // Loop over handles\n        for(int i = 0;i<m;i++)\n        {\n          if(data.verbosity >= 1)\n          {\n            cout<<\"BBW: Computing weight for handle \"<<i+1<<\" out of \"<<m<<\n              \".\"<<endl;\n          }\n          VectorXd bci = bc.col(i);\n          VectorXd Wi;\n          // impose boundary conditions via bounds\n          slice_into(bci,b,ux);\n          slice_into(bci,b,lx);\n          bool r = mosek_quadprog(Q,c,0,A,lc,uc,lx,ux,data.mosek_data,Wi);\n          if(!r)\n          {\n            return false;\n          }\n          W.col(i) = Wi;\n        }\n#endif\n        break;\n      }\n      default:\n      {\n        assert(false && \"Unknown qp_solver\");\n        return false;\n      }\n    }\n#ifndef NDEBUG\n    const double min_rowsum = W.rowwise().sum().array().abs().minCoeff();\n    if(min_rowsum < 0.1)\n    {\n      cerr<<\"bbw.cpp: Warning, minimum row sum is very low. Consider more \"\n        \"active set iterations or enforcing partition of unity.\"<<endl;\n    }\n#endif\n  }\n\n  return true;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template specialization\ntemplate bool igl::bbw<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, igl::BBWData&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/bbw/bbw.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef BBW_H\n#define BBW_H\n#include \"../igl_inline.h\"\n\n#include <Eigen/Dense>\n#ifndef IGL_NO_MOSEK\n#  include <igl/mosek/mosek_quadprog.h>\n#endif\n#include <igl/active_set.h>\n\nnamespace igl\n{\n  enum QPSolver\n  {\n    QP_SOLVER_IGL_ACTIVE_SET = 0,\n    QP_SOLVER_MOSEK = 1,\n    NUM_QP_SOLVERS = 2\n  };\n  const char * const QPSolverNames[NUM_QP_SOLVERS] =\n  {\n    \"QP_SOLVER_IGL_ACTIVE_SET\",\n    \"QP_SOLVER_MOSEK\"\n  };\n  // Container for BBW computation related data and flags\n  class BBWData\n  {\n    public:\n      // Enforce partition of unity during optimization (optimize all weight\n      // simultaneously)\n      bool partition_unity;\n      // Initial guess\n      Eigen::MatrixXd W0;\n#ifndef IGL_NO_MOSEK\n      igl::MosekData mosek_data;\n#endif\n      igl::active_set_params active_set_params;\n      // Which solver\n      QPSolver qp_solver;\n      // Verbosity level\n      // 0: quiet\n      // 1: loud\n      // 2: louder\n      int verbosity;\n    public:\n      BBWData();\n      // Print current state of object\n      void print();\n  };\n\n  // Compute Bounded Biharmonic Weights on a given domain (V,Ele) with a given\n  // set of boundary conditions\n  //\n  // Templates\n  //   DerivedV  derived type of eigen matrix for V (e.g. MatrixXd)\n  //   DerivedF  derived type of eigen matrix for F (e.g. MatrixXi)\n  //   Derivedb  derived type of eigen matrix for b (e.g. VectorXi)\n  //   Derivedbc  derived type of eigen matrix for bc (e.g. MatrixXd)\n  //   DerivedW  derived type of eigen matrix for W (e.g. MatrixXd)\n  // Inputs:\n  //   V  #V by dim vertex positions\n  //   Ele  #Elements by simplex-size list of element indices\n  //   b  #b boundary indices into V\n  //   bc #b by #W list of boundary values\n  //   data  object containing options, intial guess --> solution and results\n  // Outputs:\n  //   W  #V by #W list of *unnormalized* weights to normalize use \n  //    igl::normalize_row_sums(W,W); \n  // Returns true on success, false on failure\n  template <\n    typename DerivedV, \n    typename DerivedEle, \n    typename Derivedb,\n    typename Derivedbc, \n    typename DerivedW>\n  IGL_INLINE bool bbw(\n    const Eigen::PlainObjectBase<DerivedV> & V, \n    const Eigen::PlainObjectBase<DerivedEle> & Ele, \n    const Eigen::PlainObjectBase<Derivedb> & b, \n    const Eigen::PlainObjectBase<Derivedbc> & bc, \n    BBWData & data,\n    Eigen::PlainObjectBase<DerivedW> & W);\n}\n  \n#ifndef IGL_STATIC_LIBRARY\n#  include \"bbw.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/bbw.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"bbw.h\"\n#include \"min_quad_with_fixed.h\"\n#include \"harmonic.h\"\n#include \"parallel_for.h\"\n#include <Eigen/Sparse>\n#include <iostream>\n#include <mutex>\n#include <cstdio>\n\nigl::BBWData::BBWData():\n  partition_unity(false),\n  W0(),\n  active_set_params(),\n  verbosity(0)\n{\n  // We know that the Bilaplacian is positive semi-definite\n  active_set_params.Auu_pd = true;\n}\n\nvoid igl::BBWData::print()\n{\n  using namespace std;\n  cout<<\"partition_unity: \"<<partition_unity<<endl;\n  cout<<\"W0=[\"<<endl<<W0<<endl<<\"];\"<<endl;\n}\n\n\ntemplate <\n  typename DerivedV,\n  typename DerivedEle,\n  typename Derivedb,\n  typename Derivedbc,\n  typename DerivedW>\nIGL_INLINE bool igl::bbw(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedEle> & Ele,\n  const Eigen::PlainObjectBase<Derivedb> & b,\n  const Eigen::PlainObjectBase<Derivedbc> & bc,\n  igl::BBWData & data,\n  Eigen::PlainObjectBase<DerivedW> & W\n  )\n{\n  using namespace std;\n  using namespace Eigen;\n  assert(!data.partition_unity && \"partition_unity not implemented yet\");\n  // number of domain vertices\n  int n = V.rows();\n  // number of handles\n  int m = bc.cols();\n  // Build biharmonic operator\n  Eigen::SparseMatrix<typename DerivedV::Scalar> Q;\n  harmonic(V,Ele,2,Q);\n  W.derived().resize(n,m);\n  // No linear terms\n  VectorXd c = VectorXd::Zero(n);\n  // No linear constraints\n  SparseMatrix<typename DerivedW::Scalar> A(0,n),Aeq(0,n),Aieq(0,n);\n  VectorXd Beq(0,1),Bieq(0,1);\n  // Upper and lower box constraints (Constant bounds)\n  VectorXd ux = VectorXd::Ones(n);\n  VectorXd lx = VectorXd::Zero(n);\n  active_set_params eff_params = data.active_set_params;\n  if(data.verbosity >= 1)\n  {\n    cout<<\"BBW: max_iter: \"<<data.active_set_params.max_iter<<endl;\n    cout<<\"BBW: eff_max_iter: \"<<eff_params.max_iter<<endl;\n  }\n  if(data.verbosity >= 1)\n  {\n    cout<<\"BBW: Computing initial weights for \"<<m<<\" handle\"<<\n      (m!=1?\"s\":\"\")<<\".\"<<endl;\n  }\n  min_quad_with_fixed_data<typename DerivedW::Scalar > mqwf;\n  min_quad_with_fixed_precompute(Q,b,Aeq,true,mqwf);\n  min_quad_with_fixed_solve(mqwf,c,bc,Beq,W);\n  // decrement\n  eff_params.max_iter--;\n  bool error = false;\n  // Loop over handles\n  std::mutex critical;\n  const auto & optimize_weight = [&](const int i)\n  {\n    // Quicker exit for paralle_for\n    if(error)\n    {\n      return;\n    }\n    if(data.verbosity >= 1)\n    {\n      std::lock_guard<std::mutex> lock(critical);\n      cout<<\"BBW: Computing weight for handle \"<<i+1<<\" out of \"<<m<<\n        \".\"<<endl;\n    }\n    VectorXd bci = bc.col(i);\n    VectorXd Wi;\n    // use initial guess\n    Wi = W.col(i);\n    SolverStatus ret = active_set(\n        Q,c,b,bci,Aeq,Beq,Aieq,Bieq,lx,ux,eff_params,Wi);\n    switch(ret)\n    {\n      case SOLVER_STATUS_CONVERGED:\n        break;\n      case SOLVER_STATUS_MAX_ITER:\n        cerr<<\"active_set: max iter without convergence.\"<<endl;\n        break;\n      case SOLVER_STATUS_ERROR:\n      default:\n        cerr<<\"active_set error.\"<<endl;\n        error = true;\n    }\n    W.col(i) = Wi;\n  };\n  parallel_for(m,optimize_weight,2);\n  if(error)\n  {\n    return false;\n  }\n\n#ifndef NDEBUG\n  const double min_rowsum = W.rowwise().sum().array().abs().minCoeff();\n  if(min_rowsum < 0.1)\n  {\n    cerr<<\"bbw.cpp: Warning, minimum row sum is very low. Consider more \"\n      \"active set iterations or enforcing partition of unity.\"<<endl;\n  }\n#endif\n\n  return true;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate bool igl::bbw<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, igl::BBWData&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/bbw.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_BBW_H\n#define IGL_BBW_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Dense>\n#include <igl/active_set.h>\n\nnamespace igl\n{\n  // Container for BBW computation related data and flags\n  class BBWData\n  {\n    public:\n      // Enforce partition of unity during optimization (optimize all weight\n      // simultaneously)\n      bool partition_unity;\n      // Initial guess\n      Eigen::MatrixXd W0;\n      igl::active_set_params active_set_params;\n      // Verbosity level\n      // 0: quiet\n      // 1: loud\n      // 2: louder\n      int verbosity;\n    public:\n      IGL_INLINE BBWData();\n      // Print current state of object\n      IGL_INLINE void print();\n  };\n\n  // Compute Bounded Biharmonic Weights on a given domain (V,Ele) with a given\n  // set of boundary conditions\n  //\n  // Templates\n  //   DerivedV  derived type of eigen matrix for V (e.g. MatrixXd)\n  //   DerivedF  derived type of eigen matrix for F (e.g. MatrixXi)\n  //   Derivedb  derived type of eigen matrix for b (e.g. VectorXi)\n  //   Derivedbc  derived type of eigen matrix for bc (e.g. MatrixXd)\n  //   DerivedW  derived type of eigen matrix for W (e.g. MatrixXd)\n  // Inputs:\n  //   V  #V by dim vertex positions\n  //   Ele  #Elements by simplex-size list of element indices\n  //   b  #b boundary indices into V\n  //   bc #b by #W list of boundary values\n  //   data  object containing options, intial guess --> solution and results\n  // Outputs:\n  //   W  #V by #W list of *unnormalized* weights to normalize use\n  //    igl::normalize_row_sums(W,W);\n  // Returns true on success, false on failure\n  template <\n    typename DerivedV,\n    typename DerivedEle,\n    typename Derivedb,\n    typename Derivedbc,\n    typename DerivedW>\n  IGL_INLINE bool bbw(\n    const Eigen::PlainObjectBase<DerivedV> & V,\n    const Eigen::PlainObjectBase<DerivedEle> & Ele,\n    const Eigen::PlainObjectBase<Derivedb> & b,\n    const Eigen::PlainObjectBase<Derivedbc> & bc,\n    BBWData & data,\n    Eigen::PlainObjectBase<DerivedW> & W);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"bbw.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/bfs.cpp",
    "content": "#include \"bfs.h\"\n#include \"list_to_matrix.h\"\n#include <vector>\n#include <queue>\n\ntemplate <\n  typename AType,\n  typename DerivedD,\n  typename DerivedP>\nIGL_INLINE void igl::bfs(\n  const AType & A,\n  const size_t s,\n  Eigen::PlainObjectBase<DerivedD> & D,\n  Eigen::PlainObjectBase<DerivedP> & P)\n{\n  std::vector<typename DerivedD::Scalar> vD;\n  std::vector<typename DerivedP::Scalar> vP;\n  bfs(A,s,vD,vP);\n  list_to_matrix(vD,D);\n  list_to_matrix(vP,P);\n}\n\ntemplate <\n  typename AType,\n  typename DType,\n  typename PType>\nIGL_INLINE void igl::bfs(\n  const std::vector<std::vector<AType> > & A,\n  const size_t s,\n  std::vector<DType> & D,\n  std::vector<PType> & P)\n{\n  // number of nodes\n  int N = s+1;\n  for(const auto & Ai : A) for(const auto & a : Ai) N = std::max(N,a+1);\n  std::vector<bool> seen(N,false);\n  P.resize(N,-1);\n  std::queue<std::pair<int,int> > Q;\n  Q.push({s,-1});\n  while(!Q.empty())\n  {\n    const int f = Q.front().first;\n    const int p = Q.front().second;\n    Q.pop();\n    if(seen[f])\n    {\n      continue;\n    }\n    D.push_back(f);\n    P[f] = p;\n    seen[f] = true;\n    for(const auto & n : A[f]) Q.push({n,f});\n  }\n}\n\n\ntemplate <\n  typename AType,\n  typename DType,\n  typename PType>\nIGL_INLINE void igl::bfs(\n  const Eigen::SparseMatrix<AType> & A,\n  const size_t s,\n  std::vector<DType> & D,\n  std::vector<PType> & P)\n{\n  // number of nodes\n  int N = A.rows();\n  assert(A.rows() == A.cols());\n  std::vector<bool> seen(N,false);\n  P.resize(N,-1);\n  std::queue<std::pair<int,int> > Q;\n  Q.push({s,-1});\n  while(!Q.empty())\n  {\n    const int f = Q.front().first;\n    const int p = Q.front().second;\n    Q.pop();\n    if(seen[f])\n    {\n      continue;\n    }\n    D.push_back(f);\n    P[f] = p;\n    seen[f] = true;\n    for(typename Eigen::SparseMatrix<AType>::InnerIterator it (A,f); it; ++it)\n    {\n      if(it.value()) Q.push({it.index(),f});\n    }\n  }\n\n}\n\n"
  },
  {
    "path": "libs/libigl/include/igl/bfs.h",
    "content": "#ifndef IGL_BFS_H\n#define IGL_BFS_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <vector>\n#include <Eigen/Sparse>\nnamespace igl\n{\n  // Traverse a **directed** graph represented by an adjacency list using\n  // breadth first search\n  //\n  // Inputs:\n  //   A  #V list of adjacency lists  or #V by #V adjacency matrix\n  //   s  starting node (index into A)\n  // Outputs:\n  //   D  #V list of indices into rows of A in the order in which graph nodes\n  //     are discovered.\n  //   P  #V list of indices into rows of A of predecessor in resulting\n  //     spanning tree {-1 indicates root/not discovered), order corresponds to\n  //     V **not** D.\n  template <\n    typename AType,\n    typename DerivedD,\n    typename DerivedP>\n  IGL_INLINE void bfs(\n    const AType & A,\n    const size_t s,\n    Eigen::PlainObjectBase<DerivedD> & D,\n    Eigen::PlainObjectBase<DerivedP> & P);\n\n  template <\n    typename AType,\n    typename DType,\n    typename PType>\n  IGL_INLINE void bfs(\n    const std::vector<std::vector<AType> > & A,\n    const size_t s,\n    std::vector<DType> & D,\n    std::vector<PType> & P);\n  template <\n    typename AType,\n    typename DType,\n    typename PType>\n  IGL_INLINE void bfs(\n    const Eigen::SparseMatrix<AType> & A,\n    const size_t s,\n    std::vector<DType> & D,\n    std::vector<PType> & P);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"bfs.cpp\"\n#endif\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/bfs_orient.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"bfs_orient.h\"\n#include \"orientable_patches.h\"\n#include <Eigen/Sparse>\n#include <queue>\n\ntemplate <typename DerivedF, typename DerivedFF, typename DerivedC>\nIGL_INLINE void igl::bfs_orient(\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  Eigen::PlainObjectBase<DerivedFF> & FF,\n  Eigen::PlainObjectBase<DerivedC> & C)\n{\n  using namespace Eigen;\n  using namespace std;\n  SparseMatrix<int> A;\n  orientable_patches(F,C,A);\n\n  // number of faces\n  const int m = F.rows();\n  // number of patches\n  const int num_cc = C.maxCoeff()+1;\n  VectorXi seen = VectorXi::Zero(m);\n\n  // Edge sets\n  const int ES[3][2] = {{1,2},{2,0},{0,1}};\n\n  if(&FF != &F)\n  {\n    FF = F;\n  }\n  // loop over patches\n#pragma omp parallel for\n  for(int c = 0;c<num_cc;c++)\n  {\n    queue<int> Q;\n    // find first member of patch c\n    for(int f = 0;f<FF.rows();f++)\n    {\n      if(C(f) == c)\n      {\n        Q.push(f);\n        break;\n      }\n    }\n    assert(!Q.empty());\n    while(!Q.empty())\n    {\n      const int f = Q.front();\n      Q.pop();\n      if(seen(f) > 0)\n      {\n        continue;\n      }\n      seen(f)++;\n      // loop over neighbors of f\n      for(typename SparseMatrix<int>::InnerIterator it (A,f); it; ++it)\n      {\n        // might be some lingering zeros, and skip self-adjacency\n        if(it.value() != 0 && it.row() != f)\n        {\n          const int n = it.row();\n          assert(n != f);\n          // loop over edges of f\n          for(int efi = 0;efi<3;efi++)\n          {\n            // efi'th edge of face f\n            Vector2i ef(FF(f,ES[efi][0]),FF(f,ES[efi][1]));\n            // loop over edges of n\n            for(int eni = 0;eni<3;eni++)\n            {\n              // eni'th edge of face n\n              Vector2i en(FF(n,ES[eni][0]),FF(n,ES[eni][1]));\n              // Match (half-edges go same direction)\n              if(ef(0) == en(0) && ef(1) == en(1))\n              {\n                // flip face n\n                FF.row(n) = FF.row(n).reverse().eval();\n              }\n            }\n          }\n          // add neighbor to queue\n          Q.push(n);\n        }\n      }\n    }\n  }\n\n  // make sure flip is OK if &FF = &F\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::bfs_orient<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/bfs_orient.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_BFS_ORIENT_H\n#define IGL_BFS_ORIENT_H\n#include <Eigen/Core>\n#include <igl/igl_inline.h>\n\nnamespace igl\n{\n  // Consistently orient faces in orientable patches using BFS\n  //\n  // F = bfs_orient(F,V);\n  //\n  // Inputs:\n  //  F  #F by 3 list of faces\n  // Outputs:\n  //  FF  #F by 3 list of faces (OK if same as F)\n  //  C  #F list of component ids\n  //\n  //\n  template <typename DerivedF, typename DerivedFF, typename DerivedC>\n  IGL_INLINE void bfs_orient(\n    const Eigen::PlainObjectBase<DerivedF> & F,\n    Eigen::PlainObjectBase<DerivedFF> & FF,\n    Eigen::PlainObjectBase<DerivedC> & C);\n};\n#ifndef IGL_STATIC_LIBRARY\n#  include \"bfs_orient.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/biharmonic_coordinates.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"biharmonic_coordinates.h\"\n#include \"cotmatrix.h\"\n#include \"massmatrix.h\"\n#include \"min_quad_with_fixed.h\"\n#include \"normal_derivative.h\"\n#include \"on_boundary.h\"\n#include <Eigen/Sparse>\n\ntemplate <\n  typename DerivedV,\n  typename DerivedT,\n  typename SType,\n  typename DerivedW>\nIGL_INLINE bool igl::biharmonic_coordinates(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedT> & T,\n  const std::vector<std::vector<SType> > & S,\n  Eigen::PlainObjectBase<DerivedW> & W)\n{\n  return biharmonic_coordinates(V,T,S,2,W);\n}\n\ntemplate <\n  typename DerivedV,\n  typename DerivedT,\n  typename SType,\n  typename DerivedW>\nIGL_INLINE bool igl::biharmonic_coordinates(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedT> & T,\n  const std::vector<std::vector<SType> > & S,\n  const int k,\n  Eigen::PlainObjectBase<DerivedW> & W)\n{\n  using namespace Eigen;\n  using namespace std;\n  // This is not the most efficient way to build A, but follows \"Linear\n  // Subspace Design for Real-Time Shape Deformation\" [Wang et al. 2015].\n  SparseMatrix<double> A;\n  {\n    SparseMatrix<double> N,Z,L,K,M;\n    normal_derivative(V,T,N);\n    Array<bool,Dynamic,1> I;\n    Array<bool,Dynamic,Dynamic> C;\n    on_boundary(T,I,C);\n    {\n      std::vector<Triplet<double> >ZIJV;\n      for(int t =0;t<T.rows();t++)\n      {\n        for(int f =0;f<T.cols();f++)\n        {\n          if(C(t,f))\n          {\n            const int i = t+f*T.rows();\n            for(int c = 1;c<T.cols();c++)\n            {\n              ZIJV.emplace_back(T(t,(f+c)%T.cols()),i,1);\n            }\n          }\n        }\n      }\n      Z.resize(V.rows(),N.rows());\n      Z.setFromTriplets(ZIJV.begin(),ZIJV.end());\n      N = (Z*N).eval();\n    }\n    cotmatrix(V,T,L);\n    K = N+L;\n    massmatrix(V,T,MASSMATRIX_TYPE_DEFAULT,M);\n    // normalize\n    M /= ((VectorXd)M.diagonal()).array().abs().maxCoeff();\n    DiagonalMatrix<double,Dynamic> Minv =\n      ((VectorXd)M.diagonal().array().inverse()).asDiagonal();\n    switch(k)\n    {\n      default:\n        assert(false && \"unsupported\");\n      case 2:\n        // For C1 smoothness in 2D, one should use bi-harmonic\n        A = K.transpose() * (Minv * K);\n        break;\n      case 3:\n        // For C1 smoothness in 3D, one should use tri-harmonic\n        A = K.transpose() * (Minv * (-L * (Minv * K)));\n        break;\n    }\n  }\n  // Vertices in point handles\n  const size_t mp =\n    count_if(S.begin(),S.end(),[](const vector<int> & h){return h.size()==1;});\n  // number of region handles\n  const size_t r = S.size()-mp;\n  // Vertices in region handles\n  size_t mr = 0;\n  for(const auto & h : S)\n  {\n    if(h.size() > 1)\n    {\n      mr += h.size();\n    }\n  }\n  const size_t dim = T.cols()-1;\n  // Might as well be dense... I think...\n  MatrixXd J = MatrixXd::Zero(mp+mr,mp+r*(dim+1));\n  VectorXi b(mp+mr);\n  MatrixXd H(mp+r*(dim+1),dim);\n  {\n    int v = 0;\n    int c = 0;\n    for(int h = 0;h<S.size();h++)\n    {\n      if(S[h].size()==1)\n      {\n        H.row(c) = V.block(S[h][0],0,1,dim);\n        J(v,c++) = 1;\n        b(v) = S[h][0];\n        v++;\n      }else\n      {\n        assert(S[h].size() >= dim+1);\n        for(int p = 0;p<S[h].size();p++)\n        {\n          for(int d = 0;d<dim;d++)\n          {\n            J(v,c+d) = V(S[h][p],d);\n          }\n          J(v,c+dim) = 1;\n          b(v) = S[h][p];\n          v++;\n        }\n        H.block(c,0,dim+1,dim).setIdentity();\n        c+=dim+1;\n      }\n    }\n  }\n  // minimize    ½ W' A W'\n  // subject to  W(b,:) = J\n  return min_quad_with_fixed(\n    A,VectorXd::Zero(A.rows()).eval(),b,J,SparseMatrix<double>(),VectorXd(),true,W);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate bool igl::biharmonic_coordinates<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, int, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/biharmonic_coordinates.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_BIHARMONIC_COORDINATES_H\n#define IGL_BIHARMONIC_COORDINATES_H\n#include \"igl_inline.h\"\n#include <Eigen/Dense>\n#include <vector>\nnamespace igl\n{\n  // Compute \"discrete biharmonic generalized barycentric coordinates\" as\n  // described in \"Linear Subspace Design for Real-Time Shape Deformation\"\n  // [Wang et al. 2015]. Not to be confused with \"Bounded Biharmonic Weights\n  // for Real-Time Deformation\" [Jacobson et al. 2011] or \"Biharmonic\n  // Coordinates\" (2D complex barycentric coordinates) [Weber et al. 2012].\n  // These weights minimize a discrete version of the squared Laplacian energy\n  // subject to positional interpolation constraints at selected vertices\n  // (point handles) and transformation interpolation constraints at regions\n  // (region handles).\n  //\n  // Templates:\n  //   HType  should be a simple index type e.g. `int`,`size_t`\n  // Inputs:\n  //   V  #V by dim list of mesh vertex positions\n  //   T  #T by dim+1 list of / triangle indices into V      if dim=2\n  //                          \\ tetrahedron indices into V   if dim=3\n  //   S  #point-handles+#region-handles list of lists of selected vertices for\n  //     each handle. Point handles should have singleton lists and region\n  //     handles should have lists of size at least dim+1 (and these points\n  //     should be in general position).\n  // Outputs:\n  //   W  #V by #points-handles+(#region-handles * dim+1) matrix of weights so\n  //     that columns correspond to each handles generalized barycentric\n  //     coordinates (for point-handles) or animation space weights (for region\n  //     handles).\n  // returns true only on success\n  //\n  // Example:\n  //\n  //     MatrixXd W;\n  //     igl::biharmonic_coordinates(V,F,S,W);\n  //     const size_t dim = T.cols()-1;\n  //     MatrixXd H(W.cols(),dim);\n  //     {\n  //       int c = 0;\n  //       for(int h = 0;h<S.size();h++)\n  //       {\n  //         if(S[h].size()==1)\n  //         {\n  //           H.row(c++) = V.block(S[h][0],0,1,dim);\n  //         }else\n  //         {\n  //           H.block(c,0,dim+1,dim).setIdentity();\n  //           c+=dim+1;\n  //         }\n  //       }\n  //     }\n  //     assert( (V-(W*H)).array().maxCoeff() < 1e-7 );\n  template <\n    typename DerivedV,\n    typename DerivedT,\n    typename SType,\n    typename DerivedW>\n  IGL_INLINE bool biharmonic_coordinates(\n    const Eigen::PlainObjectBase<DerivedV> & V,\n    const Eigen::PlainObjectBase<DerivedT> & T,\n    const std::vector<std::vector<SType> > & S,\n    Eigen::PlainObjectBase<DerivedW> & W);\n  // k  2-->biharmonic, 3-->triharmonic\n  template <\n    typename DerivedV,\n    typename DerivedT,\n    typename SType,\n    typename DerivedW>\n  IGL_INLINE bool biharmonic_coordinates(\n    const Eigen::PlainObjectBase<DerivedV> & V,\n    const Eigen::PlainObjectBase<DerivedT> & T,\n    const std::vector<std::vector<SType> > & S,\n    const int k,\n    Eigen::PlainObjectBase<DerivedW> & W);\n\n};\n#  ifndef IGL_STATIC_LIBRARY\n#    include \"biharmonic_coordinates.cpp\"\n#  endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/bijective_composite_harmonic_mapping.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2017 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"bijective_composite_harmonic_mapping.h\"\n\n#include \"slice.h\"\n#include \"doublearea.h\"\n#include \"harmonic.h\"\n//#include \"matlab/MatlabWorkspace.h\"\n#include <iostream>\n\ntemplate <\n  typename DerivedV,\n  typename DerivedF,\n  typename Derivedb,\n  typename Derivedbc,\n  typename DerivedU>\nIGL_INLINE bool igl::bijective_composite_harmonic_mapping(\n  const Eigen::MatrixBase<DerivedV> & V,\n  const Eigen::MatrixBase<DerivedF> & F,\n  const Eigen::MatrixBase<Derivedb> & b,\n  const Eigen::MatrixBase<Derivedbc> & bc,\n  Eigen::PlainObjectBase<DerivedU> & U)\n{\n  return bijective_composite_harmonic_mapping(V,F,b,bc,1,200,20,true,U);\n}\n\ntemplate <\n  typename DerivedV,\n  typename DerivedF,\n  typename Derivedb,\n  typename Derivedbc,\n  typename DerivedU>\nIGL_INLINE bool igl::bijective_composite_harmonic_mapping(\n  const Eigen::MatrixBase<DerivedV> & V,\n  const Eigen::MatrixBase<DerivedF> & F,\n  const Eigen::MatrixBase<Derivedb> & b,\n  const Eigen::MatrixBase<Derivedbc> & bc,\n  const int min_steps,\n  const int max_steps,\n  const int num_inner_iters,\n  const bool test_for_flips,\n  Eigen::PlainObjectBase<DerivedU> & U)\n{\n  typedef typename Derivedbc::Scalar Scalar;\n  assert(V.cols() == 2 && bc.cols() == 2 && \"Input should be 2D\");\n  assert(F.cols() == 3 && \"F should contain triangles\");\n  int tries = 0;\n  int nsteps = min_steps;\n  Derivedbc bc0;\n  slice(V,b,1,bc0);\n\n  // It's difficult to check for flips \"robustly\" in the sense that the input\n  // mesh might not have positive/consistent sign to begin with. \n\n  while(nsteps<=max_steps)\n  {\n    U = V;\n    int flipped = 0;\n    int nans = 0;\n    int step = 0;\n    for(;step<=nsteps;step++)\n    {\n      const Scalar t = ((Scalar)step)/((Scalar)nsteps);\n      // linearly interpolate boundary conditions\n      // TODO: replace this with something that guarantees a homotopic \"morph\"\n      // of the boundary conditions. Something like \"Homotopic Morphing of\n      // Planar Curves\" [Dym et al. 2015] but also handling multiple connected\n      // components.\n      Derivedbc bct = bc0 + t*(bc - bc0);\n      // Compute dsicrete harmonic map using metric of previous step\n      for(int iter = 0;iter<num_inner_iters;iter++)\n      {\n        //std::cout<<nsteps<<\" t: \"<<t<<\" iter: \"<<iter;\n        //igl::matlab::MatlabWorkspace mw;\n        //mw.save(U,\"U\");\n        //mw.save_index(F,\"F\");\n        //mw.save_index(b,\"b\");\n        //mw.save(bct,\"bct\");\n        //mw.write(\"numerical.mat\");\n        harmonic(DerivedU(U),F,b,bct,1,U);\n        igl::slice(U,b,1,bct);\n        nans = (U.array() != U.array()).count();\n        if(test_for_flips)\n        {\n          Eigen::Matrix<Scalar,Eigen::Dynamic,1> A;\n          doublearea(U,F,A);\n          flipped = (A.array() < 0 ).count();\n          //std::cout<<\"  \"<<flipped<<\"  nan? \"<<(U.array() != U.array()).any()<<std::endl;\n          if(flipped == 0 && nans == 0) break;\n        }\n      }\n      if(flipped > 0 || nans>0) break;\n    }\n    if(flipped == 0 && nans == 0)\n    {\n      return step == nsteps+1;\n    }\n    nsteps *= 2;\n  }\n  //std::cout<<\"failed to finish in \"<<nsteps<<\"...\"<<std::endl;\n  return false;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate bool igl::bijective_composite_harmonic_mapping<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 1, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> >&);\n// generated by autoexplicit.sh\ntemplate bool igl::bijective_composite_harmonic_mapping<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 1, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, int, int, int, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/bijective_composite_harmonic_mapping.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2017 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_BIJECTIVE_COMPOSITE_HARMONIC_MAPPING_H\n#define IGL_BIJECTIVE_COMPOSITE_HARMONIC_MAPPING_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n\nnamespace igl \n{\n  // Compute a planar mapping of a triangulated polygon (V,F) subjected to\n  // boundary conditions (b,bc). The mapping should be bijective in the sense\n  // that no triangles' areas become negative (this assumes they started\n  // positive). This mapping is computed by \"composing\" harmonic mappings\n  // between incremental morphs of the boundary conditions. This is a bit like\n  // a discrete version of \"Bijective Composite Mean Value Mappings\" [Schneider\n  // et al. 2013] but with a discrete harmonic map (cf. harmonic coordinates)\n  // instead of mean value coordinates. This is inspired by \"Embedding a\n  // triangular graph within a given boundary\" [Xu et al. 2011].\n  //\n  // Inputs:\n  //   V  #V by 2 list of triangle mesh vertex positions\n  //   F  #F by 3 list of triangle indices into V\n  //   b  #b list of boundary indices into V\n  //   bc  #b by 2 list of boundary conditions corresponding to b\n  // Outputs:\n  //   U  #V by 2 list of output mesh vertex locations\n  // Returns true if and only if U contains a successfull bijectie mapping\n  //\n  // \n  template <\n    typename DerivedV,\n    typename DerivedF,\n    typename Derivedb,\n    typename Derivedbc,\n    typename DerivedU>\n  IGL_INLINE bool bijective_composite_harmonic_mapping(\n    const Eigen::MatrixBase<DerivedV> & V,\n    const Eigen::MatrixBase<DerivedF> & F,\n    const Eigen::MatrixBase<Derivedb> & b,\n    const Eigen::MatrixBase<Derivedbc> & bc,\n    Eigen::PlainObjectBase<DerivedU> & U);\n  //\n  // Inputs:\n  //   min_steps  mininum number of steps to take from V(b,:) to bc\n  //   max_steps  mininum number of steps to take from V(b,:) to bc (if\n  //     max_steps == min_steps then no further number of steps will be tried)\n  //   num_inner_iters  number of iterations of harmonic solves to run after\n  //     for each morph step (to try to push flips back in)\n  //   test_for_flips  wether to check if flips occured (and trigger more\n  //     steps). if test_for_flips = false then this function always returns\n  //     true\n  // \n  template <\n    typename DerivedV,\n    typename DerivedF,\n    typename Derivedb,\n    typename Derivedbc,\n    typename DerivedU>\n  IGL_INLINE bool bijective_composite_harmonic_mapping(\n    const Eigen::MatrixBase<DerivedV> & V,\n    const Eigen::MatrixBase<DerivedF> & F,\n    const Eigen::MatrixBase<Derivedb> & b,\n    const Eigen::MatrixBase<Derivedbc> & bc,\n    const int min_steps,\n    const int max_steps,\n    const int num_inner_iters,\n    const bool test_for_flips,\n    Eigen::PlainObjectBase<DerivedU> & U);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"bijective_composite_harmonic_mapping.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/bone_parents.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"bone_parents.h\"\n\ntemplate <typename DerivedBE, typename DerivedP>\nIGL_INLINE void igl::bone_parents(\n  const Eigen::PlainObjectBase<DerivedBE>& BE,\n  Eigen::PlainObjectBase<DerivedP>& P)\n{\n  P.resize(BE.rows(),1);\n  // Stupid O(n²) version\n  for(int e = 0;e<BE.rows();e++)\n  {\n    P(e) = -1;\n    for(int f = 0;f<BE.rows();f++)\n    {\n      if(BE(e,0) == BE(f,1))\n      {\n        P(e) = f;\n      }\n    }\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\ntemplate void igl::bone_parents<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/bone_parents.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_BONE_PARENTS_H\n#define IGL_BONE_PARENTS_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // BONE_PARENTS Recover \"parent\" bones from directed graph representation.\n  // \n  // Inputs:\n  //   BE  #BE by 2 list of directed bone edges\n  // Outputs:\n  //   P  #BE by 1 list of parent indices into BE, -1 means root.\n  //\n  template <typename DerivedBE, typename DerivedP>\n  IGL_INLINE void bone_parents(\n    const Eigen::PlainObjectBase<DerivedBE>& BE,\n    Eigen::PlainObjectBase<DerivedP>& P);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"bone_parents.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/boolean/MeshBooleanType.h",
    "content": "#ifndef MESH_BOOLEAN_TYPE_H\n#define MESH_BOOLEAN_TYPE_H\n\nnamespace igl\n{\n  enum MeshBooleanType\n  {\n    MESH_BOOLEAN_TYPE_UNION = 0,\n    MESH_BOOLEAN_TYPE_INTERSECT = 1,\n    MESH_BOOLEAN_TYPE_MINUS = 2,\n    MESH_BOOLEAN_TYPE_XOR = 3,\n    MESH_BOOLEAN_TYPE_RESOLVE = 4,\n    NUM_MESH_BOOLEAN_TYPES = 5\n  };\n};\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/boolean/from_cork_mesh.cpp",
    "content": "#ifndef IGL_NO_CORK\n#include \"from_cork_mesh.h\"\n\ntemplate <\n  typename DerivedV,\n  typename DerivedF>\nIGL_INLINE void igl::from_cork_mesh(\n  const CorkTriMesh & mesh,\n  Eigen::PlainObjectBase<DerivedV > & V,\n  Eigen::PlainObjectBase<DerivedF > & F)\n{\n  using namespace std;\n  F.resize(mesh.n_triangles,3);\n  V.resize(mesh.n_vertices,3);\n  for(size_t v = 0;v<mesh.n_vertices;v++)\n  {\n    for(size_t c = 0;c<3;c++)\n    {\n      V(v,c) = mesh.vertices[v*3+c];\n    }\n  }\n  for(size_t f = 0;f<mesh.n_triangles;f++)\n  {\n    for(size_t c = 0;c<3;c++)\n    {\n      F(f,c) = mesh.triangles[f*3+c];\n    }\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template specialization\ntemplate void igl::from_cork_mesh<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(CorkTriMesh const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::from_cork_mesh<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(CorkTriMesh const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&);\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/boolean/from_cork_mesh.h",
    "content": "#ifndef IGL_FROM_CORK_MESH_H\n#define IGL_FROM_CORK_MESH_H\n#ifndef IGL_NO_CORK\n#include <igl/igl_inline.h>\n#include <cork.h>\n#include <Eigen/Core>\nnamespace igl\n{\n  // Convert cork's triangle mesh representation to a (V,F) mesh.\n  //\n  // Inputs:\n  //   mesh  cork representation of mesh\n  // Outputs:\n  //   V  #V by 3 list of vertex positions\n  //   F  #F by 3 list of triangle indices into V\n  template <\n    typename DerivedV,\n    typename DerivedF>\n  IGL_INLINE void from_cork_mesh(\n    const CorkTriMesh & mesh,\n    Eigen::PlainObjectBase<DerivedV > & V,\n    Eigen::PlainObjectBase<DerivedF > & F);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"from_cork_mesh.cpp\"\n#endif\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/boolean/mesh_boolean.cpp",
    "content": "#include \"mesh_boolean.h\"\n#include <igl/per_face_normals.h>\n#include <igl/cgal/peel_outer_hull_layers.h>\n#include <igl/cgal/remesh_self_intersections.h>\n#include <igl/remove_unreferenced.h>\n#include <igl/unique_simplices.h>\n#include <iostream>\n\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\n\n//#define IGL_MESH_BOOLEAN_DEBUG\n\ntemplate <\n  typename DerivedVA,\n  typename DerivedFA,\n  typename DerivedVB,\n  typename DerivedFB,\n  typename DerivedVC,\n  typename DerivedFC,\n  typename DerivedJ>\nIGL_INLINE void igl::mesh_boolean(\n  const Eigen::PlainObjectBase<DerivedVA > & VA,\n  const Eigen::PlainObjectBase<DerivedFA > & FA,\n  const Eigen::PlainObjectBase<DerivedVB > & VB,\n  const Eigen::PlainObjectBase<DerivedFB > & FB,\n  const MeshBooleanType & type,\n  Eigen::PlainObjectBase<DerivedVC > & VC,\n  Eigen::PlainObjectBase<DerivedFC > & FC,\n  Eigen::PlainObjectBase<DerivedJ > & J)\n{\n  const std::function<void(\n    const Eigen::Matrix<typename DerivedVC::Scalar,Eigen::Dynamic,3> &,\n    const Eigen::Matrix<typename DerivedFC::Scalar, Eigen::Dynamic,3>&,\n          Eigen::Matrix<typename DerivedVC::Scalar,Eigen::Dynamic,3> &,\n          Eigen::Matrix<typename DerivedFC::Scalar, Eigen::Dynamic,3>&,\n          Eigen::Matrix<typename DerivedJ::Scalar, Eigen::Dynamic,1>&)>\n    empty_fun;\n  return mesh_boolean(VA,FA,VB,FB,type,empty_fun,VC,FC,J);\n}\n\ntemplate <\n  typename DerivedVA,\n  typename DerivedFA,\n  typename DerivedVB,\n  typename DerivedFB,\n  typename DerivedVC,\n  typename DerivedFC>\nIGL_INLINE void igl::mesh_boolean(\n  const Eigen::PlainObjectBase<DerivedVA > & VA,\n  const Eigen::PlainObjectBase<DerivedFA > & FA,\n  const Eigen::PlainObjectBase<DerivedVB > & VB,\n  const Eigen::PlainObjectBase<DerivedFB > & FB,\n  const MeshBooleanType & type,\n  Eigen::PlainObjectBase<DerivedVC > & VC,\n  Eigen::PlainObjectBase<DerivedFC > & FC)\n{\n  Eigen::Matrix<typename DerivedFC::Index, Eigen::Dynamic,1> J;\n  const std::function<void(\n    const Eigen::Matrix<typename DerivedVC::Scalar,Eigen::Dynamic,3> &,\n    const Eigen::Matrix<typename DerivedFC::Scalar, Eigen::Dynamic,3>&,\n          Eigen::Matrix<typename DerivedVC::Scalar,Eigen::Dynamic,3> &,\n          Eigen::Matrix<typename DerivedFC::Scalar, Eigen::Dynamic,3>&,\n          Eigen::Matrix<typename DerivedFC::Index, Eigen::Dynamic,1>&)>\n    empty_fun;\n  return mesh_boolean(VA,FA,VB,FB,type,empty_fun,VC,FC,J);\n}\n\ntemplate <\n  typename DerivedVA,\n  typename DerivedFA,\n  typename DerivedVB,\n  typename DerivedFB,\n  typename DerivedVC,\n  typename DerivedFC,\n  typename DerivedJ>\nIGL_INLINE void igl::mesh_boolean(\n  const Eigen::PlainObjectBase<DerivedVA > & VA,\n  const Eigen::PlainObjectBase<DerivedFA > & FA,\n  const Eigen::PlainObjectBase<DerivedVB > & VB,\n  const Eigen::PlainObjectBase<DerivedFB > & FB,\n  const MeshBooleanType & type,\n  const std::function<void(\n    const Eigen::Matrix<typename DerivedVC::Scalar,Eigen::Dynamic,3>&,\n    const Eigen::Matrix<typename DerivedFC::Scalar, Eigen::Dynamic,3>&,\n          Eigen::Matrix<typename DerivedVC::Scalar,Eigen::Dynamic,3>&,\n          Eigen::Matrix<typename DerivedFC::Scalar, Eigen::Dynamic,3>&,\n          Eigen::Matrix<typename DerivedJ::Scalar, Eigen::Dynamic,1>&)>\n    & resolve_fun,\n  Eigen::PlainObjectBase<DerivedVC > & VC,\n  Eigen::PlainObjectBase<DerivedFC > & FC,\n  Eigen::PlainObjectBase<DerivedJ > & J)\n{\n  using namespace Eigen;\n  using namespace std;\n  using namespace igl;\n  MeshBooleanType eff_type = type;\n  // Concatenate A and B into a single mesh\n  typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;\n  typedef Kernel::FT ExactScalar;\n  typedef typename DerivedVC::Scalar Scalar;\n  typedef typename DerivedFC::Scalar Index;\n  typedef Matrix<Scalar,Dynamic,3> MatrixX3S;\n  typedef Matrix<ExactScalar,Dynamic,3> MatrixX3ES;\n  typedef Matrix<Index,Dynamic,3> MatrixX3I;\n  typedef Matrix<Index,Dynamic,2> MatrixX2I;\n  typedef Matrix<Index,Dynamic,1> VectorXI;\n  typedef Matrix<typename DerivedJ::Scalar,Dynamic,1> VectorXJ;\n#ifdef IGL_MESH_BOOLEAN_DEBUG\n  cout<<\"mesh boolean...\"<<endl;\n#endif\n  MatrixX3S V(VA.rows()+VB.rows(),3);\n  MatrixX3I F(FA.rows()+FB.rows(),3);\n  V.block(0,0,VA.rows(),VA.cols()) = VA;\n  V.block(VA.rows(),0,VB.rows(),VB.cols()) = VB;\n#ifdef IGL_MESH_BOOLEAN_DEBUG\n  cout<<\"prepare selfintersect input...\"<<endl;\n#endif\n  switch(type)\n  {\n    // Minus is implemented by flipping B and computing union\n    case MESH_BOOLEAN_TYPE_MINUS:\n      F.block(0,0,FA.rows(),FA.cols()) = FA.rowwise().reverse();\n      F.block(FA.rows(),0,FB.rows(),FB.cols()) = FB.array()+VA.rows();\n      //F.block(0,0,FA.rows(),3) = FA;\n      //F.block(FA.rows(),0,FB.rows(),3) =\n      //  FB.rowwise().reverse().array()+VA.rows();\n      eff_type = MESH_BOOLEAN_TYPE_INTERSECT;\n      break;\n    default:\n      F.block(0,0,FA.rows(),FA.cols()) = FA;\n      F.block(FA.rows(),0,FB.rows(),FB.cols()) = FB.array()+VA.rows();\n      break;\n  }\n\n  // Resolve intersections (assumes A and B are solid)\n  const auto & libigl_resolve = [](\n    const MatrixX3S & V,\n    const MatrixX3I & F,\n    MatrixX3ES & CV,\n    MatrixX3I & CF,\n    VectorXJ & J)\n  {\n    MatrixX3ES SV;\n    MatrixX3I SF;\n    MatrixX2I SIF;\n    VectorXI SIM,UIM;\n    RemeshSelfIntersectionsParam params;\n    remesh_self_intersections(V,F,params,SV,SF,SIF,J,SIM);\n    for_each(SF.data(),SF.data()+SF.size(),[&SIM](int & a){a=SIM(a);});\n    {\n      remove_unreferenced(SV,SF,CV,CF,UIM);\n    }\n  };\n\n#ifdef IGL_MESH_BOOLEAN_DEBUG\n  cout<<\"resolve...\"<<endl;\n#endif\n  MatrixX3S CV;\n  MatrixX3ES EV;\n  MatrixX3I CF;\n  VectorXJ CJ;\n  if(resolve_fun)\n  {\n    resolve_fun(V,F,CV,CF,CJ);\n  }else\n  {\n    libigl_resolve(V,F,EV,CF,CJ);\n    CV.resize(EV.rows(), EV.cols());\n    std::transform(EV.data(), EV.data() + EV.rows()*EV.cols(),\n            CV.data(), [&](ExactScalar val) {\n            return CGAL::to_double(val);\n            });\n  }\n\n  if(type == MESH_BOOLEAN_TYPE_RESOLVE)\n  {\n    FC = CF;\n    VC = CV;\n    J = CJ;\n    return;\n  }\n  MatrixX3S N,CN;\n  per_face_normals_stable(V,F,N);\n  CN.resize(CF.rows(),3);\n  for(size_t f = 0;f<(size_t)CN.rows();f++)\n  {\n    CN.row(f) = N.row(CJ(f));\n  }\n\n#ifdef IGL_MESH_BOOLEAN_DEBUG\n  cout<<\"peel...\"<<endl;\n#endif\n  Matrix<bool,Dynamic,1> from_A(CF.rows());\n  // peel layers keeping track of odd and even flips\n  Matrix<bool,Dynamic,1> odd;\n  Matrix<bool,Dynamic,1> flip;\n  peel_outer_hull_layers(EV,CF,CN,odd,flip);\n\n#ifdef IGL_MESH_BOOLEAN_DEBUG\n  cout<<\"categorize...\"<<endl;\n#endif\n  const Index m = CF.rows();\n  // Faces of output vG[i] = j means ith face of output should be jth face in F\n  std::vector<Index> vG;\n  // Whether faces of output should be flipped, Gflip[i] = true means ith face\n  // of output should be F.row(vG[i]).reverse() rather than F.row(vG[i])\n  std::vector<bool> Gflip;\n  for(Index f = 0;f<m;f++)\n  {\n    switch(eff_type)\n    {\n      case MESH_BOOLEAN_TYPE_XOR:\n      case MESH_BOOLEAN_TYPE_UNION:\n        if((odd(f)&&!flip(f))||(!odd(f)&&flip(f)))\n        {\n          vG.push_back(f);\n          Gflip.push_back(false);\n        }else if(eff_type == MESH_BOOLEAN_TYPE_XOR)\n        {\n          vG.push_back(f);\n          Gflip.push_back(true);\n        }\n        break;\n      case MESH_BOOLEAN_TYPE_INTERSECT:\n        if((!odd(f) && !flip(f)) || (odd(f) && flip(f)))\n        {\n          vG.push_back(f);\n          Gflip.push_back(type == MESH_BOOLEAN_TYPE_MINUS);\n        }\n        break;\n      default:\n        assert(false && \"Unknown type\");\n        return;\n    }\n  }\n  const Index gm = vG.size();\n  MatrixX3I G(gm,3);\n  VectorXi GJ(gm,1);\n  for(Index g = 0;g<gm;g++)\n  {\n    G.row(g) = Gflip[g] ? CF.row(vG[g]).reverse().eval() : CF.row(vG[g]);\n    GJ(g) = CJ(vG[g]);\n  }\n#ifdef IGL_MESH_BOOLEAN_DEBUG\n  cout<<\"clean...\"<<endl;\n#endif\n  // Deal with duplicate faces\n  {\n    VectorXi IA,IC;\n    MatrixX3I uG;\n    unique_simplices(G,uG,IA,IC);\n    assert(IA.rows() == uG.rows());\n    // faces ontop of each unique face\n    vector<vector<Index> > uG2G(uG.rows());\n    // signed counts\n    VectorXi counts = VectorXi::Zero(uG.rows());\n    // loop over all faces\n    for(Index g = 0;g<gm;g++)\n    {\n      const int ug = IC(g);\n      assert(ug < uG2G.size());\n      uG2G[ug].push_back(g);\n      // is uG(g,:) just a rotated version of G(g,:) ?\n      const bool consistent =\n        (G(g,0) == uG(ug,0) && G(g,1) == uG(ug,1) && G(g,2) == uG(ug,2)) ||\n        (G(g,0) == uG(ug,1) && G(g,1) == uG(ug,2) && G(g,2) == uG(ug,0)) ||\n        (G(g,0) == uG(ug,2) && G(g,1) == uG(ug,0) && G(g,2) == uG(ug,1));\n      counts(ug) += consistent ? 1 : -1;\n    }\n    MatrixX3I oldG = G;\n    // Faces of output vG[i] = j means ith face of output should be jth face in\n    // oldG\n    vG.clear();\n    for(size_t ug = 0;ug < uG2G.size();ug++)\n    {\n      // if signed occurrences is zero or ±two then keep none\n      // else if signed occurrences is ±one then keep just one facet\n      if(abs(counts(ug)) == 1)\n      {\n        assert(uG2G.size() > 0);\n        vG.push_back(uG2G[ug][0]);\n      }\n#ifdef IGL_MESH_BOOLEAN_DEBUG\n      else\n      {\n        cout<<\"Skipping \"<<uG2G.size()<<\" facets...\"<<endl;\n      }\n#endif\n    }\n    G.resize(vG.size(),3);\n    J.resize(vG.size());\n    for(size_t g = 0;g<vG.size();g++)\n    {\n      G.row(g) = oldG.row(vG[g]);\n      J(g) = GJ(vG[g]);\n    }\n  }\n  // remove unreferenced vertices\n  VectorXi newIM;\n  remove_unreferenced(CV,G,VC,FC,newIM);\n  //cerr<<\"warning not removing unref\"<<endl;\n  //VC = CV;\n  //FC = G;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n\n// This is a hack to discuss\n#include <igl/remove_unreferenced.cpp>\n\ntemplate void igl::remove_unreferenced<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n\n#include <igl/cgal/peel_outer_hull_layers.cpp>\ntemplate unsigned long igl::peel_outer_hull_layers<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<bool, -1, 1, 0, -1, 1>, Eigen::Matrix<bool, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<bool, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<bool, -1, 1, 0, -1, 1> >&);\n\n#include <igl/cgal/outer_hull.cpp>\ntemplate void igl::outer_hull<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<bool, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<bool, -1, 1, 0, -1, 1> >&);\n\n// Explicit template specialization\ntemplate void igl::mesh_boolean<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, igl::MeshBooleanType const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::mesh_boolean<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, igl::MeshBooleanType const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/boolean/mesh_boolean.h",
    "content": "#ifndef MESH_BOOLEAN_H\n#define MESH_BOOLEAN_H\n\n#include <igl/igl_inline.h>\n#include \"MeshBooleanType.h\"\n#include <Eigen/Core>\n#include <functional>\n\nnamespace igl\n{\n  //  MESH_BOOLEAN Compute boolean csg operations on \"solid\", consistently oriented\n  //  meshes.\n  // \n  //  Inputs:\n  //    V  #V by 3 list of vertex positions of first mesh\n  //    F  #F by 3 list of triangle indices into V\n  //    U  #U by 3 list of vertex positions of second mesh\n  //    G  #G by 3 list of triangle indices into U\n  //    type  type of boolean operation\n  //  Outputs:\n  //    W  #W by 3 list of vertex positions of boolean result mesh\n  //    H  #H by 3 list of triangle indices into W\n  //    J  #H list of indices into [FA;FB] revealing \"birth\" facet\n  //  \n  //  See also: self_intersect\n  //     \n  template <\n    typename DerivedVA,\n    typename DerivedFA,\n    typename DerivedVB,\n    typename DerivedFB,\n    typename DerivedVC,\n    typename DerivedFC,\n    typename DerivedJ>\n  IGL_INLINE void mesh_boolean(\n    const Eigen::PlainObjectBase<DerivedVA > & VA,\n    const Eigen::PlainObjectBase<DerivedFA > & FA,\n    const Eigen::PlainObjectBase<DerivedVB > & VB,\n    const Eigen::PlainObjectBase<DerivedFB > & FB,\n    const MeshBooleanType & type,\n    Eigen::PlainObjectBase<DerivedVC > & VC,\n    Eigen::PlainObjectBase<DerivedFC > & FC,\n    Eigen::PlainObjectBase<DerivedJ > & J);\n  template <\n    typename DerivedVA,\n    typename DerivedFA,\n    typename DerivedVB,\n    typename DerivedFB,\n    typename DerivedVC,\n    typename DerivedFC>\n  IGL_INLINE void mesh_boolean(\n    const Eigen::PlainObjectBase<DerivedVA > & VA,\n    const Eigen::PlainObjectBase<DerivedFA > & FA,\n    const Eigen::PlainObjectBase<DerivedVB > & VB,\n    const Eigen::PlainObjectBase<DerivedFB > & FB,\n    const MeshBooleanType & type,\n    Eigen::PlainObjectBase<DerivedVC > & VC,\n    Eigen::PlainObjectBase<DerivedFC > & FC);\n  // Inputs:\n  //   resolve_fun  function handle for computing resolve of a\n  //     self-intersections of a mesh and outputting the new mesh.\n  template <\n    typename DerivedVA,\n    typename DerivedFA,\n    typename DerivedVB,\n    typename DerivedFB,\n    typename DerivedVC,\n    typename DerivedFC,\n    typename DerivedJ>\n  IGL_INLINE void mesh_boolean(\n    const Eigen::PlainObjectBase<DerivedVA > & VA,\n    const Eigen::PlainObjectBase<DerivedFA > & FA,\n    const Eigen::PlainObjectBase<DerivedVB > & VB,\n    const Eigen::PlainObjectBase<DerivedFB > & FB,\n    const MeshBooleanType & type,\n    const std::function<void(\n      const Eigen::Matrix<typename DerivedVC::Scalar,Eigen::Dynamic,3> &,\n      const Eigen::Matrix<typename DerivedFC::Scalar,Eigen::Dynamic,3> &,\n            Eigen::Matrix<typename DerivedVC::Scalar,Eigen::Dynamic,3> &,\n            Eigen::Matrix<typename DerivedFC::Scalar,Eigen::Dynamic,3> &,\n            Eigen::Matrix<typename  DerivedJ::Scalar,Eigen::Dynamic,1>&)> \n      & resolve_fun,\n    Eigen::PlainObjectBase<DerivedVC > & VC,\n    Eigen::PlainObjectBase<DerivedFC > & FC,\n    Eigen::PlainObjectBase<DerivedJ > & J);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"mesh_boolean.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/boolean/mesh_boolean_cork.cpp",
    "content": "#ifndef IGL_NO_CORK\n#include \"mesh_boolean_cork.h\"\n#include \"to_cork_mesh.h\"\n#include \"from_cork_mesh.h\"\n\ntemplate <\n  typename DerivedVA,\n  typename DerivedFA,\n  typename DerivedVB,\n  typename DerivedFB,\n  typename DerivedVC,\n  typename DerivedFC>\nIGL_INLINE void igl::mesh_boolean_cork(\n  const Eigen::PlainObjectBase<DerivedVA > & VA,\n  const Eigen::PlainObjectBase<DerivedFA > & FA,\n  const Eigen::PlainObjectBase<DerivedVB > & VB,\n  const Eigen::PlainObjectBase<DerivedFB > & FB,\n  const MeshBooleanType & type,\n  Eigen::PlainObjectBase<DerivedVC > & VC,\n  Eigen::PlainObjectBase<DerivedFC > & FC)\n{\n  CorkTriMesh A,B,C;\n  // pointer to output so it's easy to redirect on degenerate cases\n  CorkTriMesh *ret = &C;\n  to_cork_mesh(VA,FA,A);\n  to_cork_mesh(VB,FB,B);\n  switch(type)\n  {\n    case MESH_BOOLEAN_TYPE_UNION:\n      if(A.n_triangles == 0)\n      {\n        ret = &B;\n      }else if(B.n_triangles == 0)\n      {\n        ret = &A;\n      }else\n      {\n        computeUnion(A,B,ret);\n      }\n      break;\n    case MESH_BOOLEAN_TYPE_INTERSECT:\n      if(A.n_triangles == 0 || B.n_triangles == 0)\n      {\n        ret->n_triangles = 0;\n        ret->n_vertices = 0;\n      }else\n      {\n        computeIntersection(A,B,ret);\n      }\n      break;\n    case MESH_BOOLEAN_TYPE_MINUS:\n      if(A.n_triangles == 0)\n      {\n        ret->n_triangles = 0;\n        ret->n_vertices = 0;\n      }else if(B.n_triangles == 0)\n      {\n        ret = &A;\n      }else\n      {\n        computeDifference(A,B,ret);\n      }\n      break;\n    case MESH_BOOLEAN_TYPE_XOR:\n      if(A.n_triangles == 0)\n      {\n        ret = &B;\n      }else if(B.n_triangles == 0)\n      {\n        ret = &A;\n      }else\n      {\n        computeSymmetricDifference(A,B,&C);\n      }\n      break;\n    case MESH_BOOLEAN_TYPE_RESOLVE:\n      resolveIntersections(A,B,&C);\n      break;\n    default:\n      assert(false && \"Unknown type\");\n      return;\n  }\n  from_cork_mesh(*ret,VC,FC);\n  freeCorkTriMesh(&A);\n  freeCorkTriMesh(&B);\n  freeCorkTriMesh(&C);\n}\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template specialization\ntemplate void igl::mesh_boolean_cork<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, MeshBooleanType const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::mesh_boolean_cork<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, igl::MeshBooleanType const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&);\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/boolean/mesh_boolean_cork.h",
    "content": "#ifndef MESH_BOOLEAN_CORK_H\n#define MESH_BOOLEAN_CORK_H\n#ifndef IGL_NO_CORK\n#include \"MeshBooleanType.h\"\n#include <igl/igl_inline.h>\n#include <Eigen/Core>\n#include <cork.h> // for consistent uint\n\nnamespace igl\n{\n  // Compute a boolean operation on two input meshes using the cork library.\n  //\n  // Inputs:\n  //   VA  #VA by 3 list of vertex positions of first mesh\n  //   FA  #FA by 3 list of triangle indices into VA\n  //   VB  #VB by 3 list of vertex positions of second mesh\n  //   FB  #FB by 3 list of triangle indices into VB\n  //   type  of boolean operation see MeshBooleanType.h\n  // Outputs:\n  //   VC  #VC by 3 list of vertex positions of output mesh\n  //   FC  #FC by 3 list of triangle indices into VC\n  template <\n    typename DerivedVA,\n    typename DerivedFA,\n    typename DerivedVB,\n    typename DerivedFB,\n    typename DerivedVC,\n    typename DerivedFC>\n  IGL_INLINE void mesh_boolean_cork(\n    const Eigen::PlainObjectBase<DerivedVA > & VA,\n    const Eigen::PlainObjectBase<DerivedFA > & FA,\n    const Eigen::PlainObjectBase<DerivedVB > & VB,\n    const Eigen::PlainObjectBase<DerivedFB > & FB,\n    const MeshBooleanType & type,\n    Eigen::PlainObjectBase<DerivedVC > & VC,\n    Eigen::PlainObjectBase<DerivedFC > & FC);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"mesh_boolean_cork.cpp\"\n#endif\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/boolean/to_cork_mesh.cpp",
    "content": "#ifndef IGL_NO_CORK\n#include \"to_cork_mesh.h\"\ntemplate <\n  typename DerivedV,\n  typename DerivedF>\nIGL_INLINE void igl::to_cork_mesh(\n  const Eigen::PlainObjectBase<DerivedV > & V,\n  const Eigen::PlainObjectBase<DerivedF > & F,\n  CorkTriMesh & mesh)\n{\n  using namespace std;\n  assert((F.cols() == 0 || F.cols() == 3) && \"Facets should be triangles.\");\n  assert((V.cols() == 0 || V.cols() == 3) && \"Vertices should be in 3D.\");\n  mesh.n_triangles = F.rows();\n  mesh.n_vertices = V.rows();\n  mesh.vertices = new double[mesh.n_vertices*3];\n  mesh.triangles = new uint[mesh.n_triangles*3];\n  for(size_t v = 0;v<mesh.n_vertices;v++)\n  {\n    for(size_t c = 0;c<3;c++)\n    {\n      mesh.vertices[v*3+c] = V(v,c);\n    }\n  }\n  for(size_t f = 0;f<mesh.n_triangles;f++)\n  {\n    for(size_t c = 0;c<3;c++)\n    {\n      mesh.triangles[f*3+c] = F(f,c);\n    }\n  }\n}\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template specialization\ntemplate void igl::to_cork_mesh<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, CorkTriMesh&);\ntemplate void igl::to_cork_mesh<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, CorkTriMesh&);\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/boolean/to_cork_mesh.h",
    "content": "#ifndef IGL_TO_CORK_MESH_H\n#define IGL_TO_CORK_MESH_H\n#ifndef IGL_NO_CORK\n#include <igl/igl_inline.h>\n#include <cork.h>\n#include <Eigen/Core>\nnamespace igl\n{\n  // Convert a (V,F) mesh to a cork's triangle mesh representation.\n  //\n  // Inputs:\n  //   V  #V by 3 list of vertex positions\n  //   F  #F by 3 list of triangle indices into V\n  // Outputs:\n  //   mesh  cork representation of mesh\n  template <\n    typename DerivedV,\n    typename DerivedF>\n  IGL_INLINE void to_cork_mesh(\n    const Eigen::PlainObjectBase<DerivedV > & V,\n    const Eigen::PlainObjectBase<DerivedF > & F,\n    CorkTriMesh & mesh);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"to_cork_mesh.cpp\"\n#endif\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/boost/bfs_orient.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"bfs_orient.h\"\n#include \"orientable_patches.h\"\n#include <Eigen/Sparse>\n#include <queue>\n\ntemplate <typename DerivedF, typename DerivedFF, typename DerivedC>\nIGL_INLINE void igl::bfs_orient(\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  Eigen::PlainObjectBase<DerivedFF> & FF,\n  Eigen::PlainObjectBase<DerivedC> & C)\n{\n  using namespace Eigen;\n  using namespace igl;\n  using namespace std;\n  SparseMatrix<int> A;\n  orientable_patches(F,C,A);\n\n  // number of faces\n  const int m = F.rows();\n  // number of patches\n  const int num_cc = C.maxCoeff()+1;\n  VectorXi seen = VectorXi::Zero(m);\n\n  // Edge sets\n  const int ES[3][2] = {{1,2},{2,0},{0,1}};\n\n  if(&FF != &F)\n  {\n    FF = F;\n  }\n  // loop over patches\n#pragma omp parallel for\n  for(int c = 0;c<num_cc;c++)\n  {\n    queue<int> Q;\n    // find first member of patch c\n    for(int f = 0;f<FF.rows();f++)\n    {\n      if(C(f) == c)\n      {\n        Q.push(f);\n        break;\n      }\n    }\n    assert(!Q.empty());\n    while(!Q.empty())\n    {\n      const int f = Q.front();\n      Q.pop();\n      if(seen(f) > 0)\n      {\n        continue;\n      }\n      seen(f)++;\n      // loop over neighbors of f\n      for(typename SparseMatrix<int>::InnerIterator it (A,f); it; ++it)\n      {\n        // might be some lingering zeros, and skip self-adjacency\n        if(it.value() != 0 && it.row() != f)\n        {\n          const int n = it.row();\n          assert(n != f);\n          // loop over edges of f\n          for(int efi = 0;efi<3;efi++)\n          {\n            // efi'th edge of face f\n            Vector2i ef(FF(f,ES[efi][0]),FF(f,ES[efi][1]));\n            // loop over edges of n\n            for(int eni = 0;eni<3;eni++)\n            {\n              // eni'th edge of face n\n              Vector2i en(FF(n,ES[eni][0]),FF(n,ES[eni][1]));\n              // Match (half-edges go same direction)\n              if(ef(0) == en(0) && ef(1) == en(1))\n              {\n                // flip face n\n                FF.row(n) = FF.row(n).reverse().eval();\n              }\n            }\n          }\n          // add neighbor to queue\n          Q.push(n);\n        }\n      }\n    }\n  }\n\n  // make sure flip is OK if &FF = &F\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template specialization\ntemplate void igl::bfs_orient<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/boost/bfs_orient.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_BFS_ORIENT_H\n#define IGL_BFS_ORIENT_H\n#include <Eigen/Core>\n#include <igl/igl_inline.h>\n\nnamespace igl\n{\n  // Consistently orient faces in orientable patches using BFS\n  //\n  // F = bfs_orient(F,V);\n  //\n  // Inputs:\n  //  F  #F by 3 list of faces\n  // Outputs:\n  //  FF  #F by 3 list of faces (OK if same as F)\n  //  C  #F list of component ids\n  //\n  //\n  template <typename DerivedF, typename DerivedFF, typename DerivedC>\n  IGL_INLINE void bfs_orient(\n    const Eigen::PlainObjectBase<DerivedF> & F,\n    Eigen::PlainObjectBase<DerivedFF> & FF,\n    Eigen::PlainObjectBase<DerivedC> & C);\n};\n#ifndef IGL_STATIC_LIBRARY\n#  include \"bfs_orient.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/boost/components.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"components.h\"\n#include <igl/adjacency_matrix.h>\n\n//#include <boost/graph/adjacency_matrix.hpp>\n#include <boost/graph/adjacency_list.hpp>\n#include <boost/graph/connected_components.hpp>\n#include <iostream>\n#include <vector>\n#include <cassert>\n\ntemplate <typename AScalar, typename DerivedC>\nIGL_INLINE void igl::components(\n  const Eigen::SparseMatrix<AScalar> & A,\n  Eigen::PlainObjectBase<DerivedC> & C)\n{\n  assert(A.rows() == A.cols());\n  using namespace Eigen;\n  // THIS IS DENSE:\n  //boost::adjacency_matrix<boost::undirectedS> bA(A.rows());\n  boost::adjacency_list<boost::vecS,boost::vecS,boost::undirectedS> bA(A.rows());\n  for(int j=0; j<A.outerSize();j++)\n  {\n    // Iterate over inside\n    for(typename SparseMatrix<AScalar>::InnerIterator it (A,j); it; ++it)\n    {\n      if(0 != it.value())\n      {\n        boost::add_edge(it.row(),it.col(),bA);\n      }\n    }\n  }\n  C.resize(A.rows(),1);\n  boost::connected_components(bA,C.data());\r\n}\n\ntemplate <typename DerivedF, typename DerivedC>\nIGL_INLINE void igl::components(\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  Eigen::PlainObjectBase<DerivedC> & C)\n{\n  Eigen::SparseMatrix<typename DerivedC::Scalar> A;\n  igl::adjacency_matrix(F,A);\n  return components(A,C);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template specialization\ntemplate void igl::components<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/boost/components.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COMPONENTS_H\n#define IGL_COMPONENTS_H\n#include <igl/igl_inline.h>\n#include <Eigen/Core>\n#include <Eigen/Sparse>\nnamespace igl\n{\n  // Compute connected components of a graph represented by an adjacency matrix\n  //\n  // Inputs:\n  //   A  n by n adjacency matrix\n  // Outputs:\n  //   C  n list of component ids\n  //\n  template <typename AScalar, typename DerivedC>\n  IGL_INLINE void components(\n    const Eigen::SparseMatrix<AScalar> & A,\n    Eigen::PlainObjectBase<DerivedC> & C);\n  // Ditto but for mesh faces as input. This computes connected components of\n  // **vertices** where **edges** establish connectivity.\n  //\n  // Inputs:\n  //   F  n by 3 list of triangle indices\n  // Outputs:\n  //   C  max(F) list of component ids\n  template <typename DerivedF, typename DerivedC>\n  IGL_INLINE void components(\n    const Eigen::PlainObjectBase<DerivedF> & F,\n    Eigen::PlainObjectBase<DerivedC> & C);\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"components.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/boost/orientable_patches.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"orientable_patches.h\"\n#include \"components.h\"\n#include <igl/sort.h>\n#include <igl/unique.h>\n#include <igl/matlab_format.h>\n#include <vector>\n#include <iostream>\n\ntemplate <typename DerivedF, typename DerivedC, typename AScalar>\nIGL_INLINE void igl::orientable_patches(\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  Eigen::PlainObjectBase<DerivedC> & C,\n  Eigen::SparseMatrix<AScalar> & A)\n{\n  using namespace Eigen;\n  using namespace std;\n\n  // simplex size\n  assert(F.cols() == 3);\n\n  // List of all \"half\"-edges: 3*#F by 2\n  Matrix<typename DerivedF::Scalar, Dynamic, 2> allE,sortallE,uE;\n  allE.resize(F.rows()*3,2);\n  Matrix<int,Dynamic,2> IX;\n  VectorXi IA,IC;\n  allE.block(0*F.rows(),0,F.rows(),1) = F.col(1);\n  allE.block(0*F.rows(),1,F.rows(),1) = F.col(2);\n  allE.block(1*F.rows(),0,F.rows(),1) = F.col(2);\n  allE.block(1*F.rows(),1,F.rows(),1) = F.col(0);\n  allE.block(2*F.rows(),0,F.rows(),1) = F.col(0);\n  allE.block(2*F.rows(),1,F.rows(),1) = F.col(1);\n  // Sort each row\n  sort(allE,2,true,sortallE,IX);\n  //IC(i) tells us where to find sortallE(i,:) in uE: \n  // so that sortallE(i,:) = uE(IC(i),:)\n  unique_rows(sortallE,uE,IA,IC);\n  // uE2FT(e,f) = 1 means face f is adjacent to unique edge e\n  vector<Triplet<AScalar> > uE2FTijv(IC.rows());\n  for(int e = 0;e<IC.rows();e++)\n  {\n    uE2FTijv[e] = Triplet<AScalar>(e%F.rows(),IC(e),1);\n  }\n  SparseMatrix<AScalar> uE2FT(F.rows(),uE.rows());\n  uE2FT.setFromTriplets(uE2FTijv.begin(),uE2FTijv.end());\n  // kill non-manifold edges\n  for(int j=0; j<(int)uE2FT.outerSize();j++)\n  {\n    int degree = 0;\n    for(typename SparseMatrix<AScalar>::InnerIterator it (uE2FT,j); it; ++it)\n    {\n      degree++;\n    }\n    // Iterate over inside\n    if(degree > 2)\n    {\n      for(typename SparseMatrix<AScalar>::InnerIterator it (uE2FT,j); it; ++it)\n      {\n        uE2FT.coeffRef(it.row(),it.col()) = 0;\n      }\n    }\n  }\n  // Face-face Adjacency matrix\n  SparseMatrix<AScalar> uE2F;\n  uE2F = uE2FT.transpose().eval();\n  A = uE2FT*uE2F;\n  // All ones\n  for(int j=0; j<A.outerSize();j++)\n  {\n    // Iterate over inside\n    for(typename SparseMatrix<AScalar>::InnerIterator it (A,j); it; ++it)\n    {\n      if(it.value() > 1)\n      {\n        A.coeffRef(it.row(),it.col()) = 1;\n      }\n    }\n  }\n  //% Connected components are patches\n  //%C = components(A); % alternative to graphconncomp from matlab_bgl\n  //[~,C] = graphconncomp(A);\n  // graph connected components using boost\r\n  components(A,C);\n\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template specialization\ntemplate void igl::orientable_patches<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, int>(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::SparseMatrix<int, 0, int>&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/boost/orientable_patches.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_ORIENTABLE_PATCHES_H\n#define IGL_ORIENTABLE_PATCHES_H\n#include <igl/igl_inline.h>\n#include <Eigen/Core>\n#include <Eigen/Sparse>\nnamespace igl\n{\n  //  Compute connected components of facets connected by manifold edges.\n  // \n  //  Known bugs: This will detect a moebius strip as a single patch (manifold,\n  //  non-orientable) and also non-manfiold, yet orientable patches. \n  // \n  //  Q: Does this find exactly (manifold || orientable) patches?\n  // \n  //  Inputs:\n  //    F  #F by simplex-size list of facets\n  //  Outputs:\n  //    C  #F list of component ids\n  //    A  #F by #F adjacency matrix\n  // \n  template <typename DerivedF, typename DerivedC, typename AScalar>\n  IGL_INLINE void orientable_patches(\n    const Eigen::PlainObjectBase<DerivedF> & F,\n    Eigen::PlainObjectBase<DerivedC> & C,\n    Eigen::SparseMatrix<AScalar> & A);\n};\n#ifndef IGL_STATIC_LIBRARY\n#  include \"orientable_patches.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/boundary_conditions.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"boundary_conditions.h\"\n\n#include \"verbose.h\"\n#include \"EPS.h\"\n#include \"project_to_line.h\"\n\n#include <vector>\n#include <map>\n#include <iostream>\n\nIGL_INLINE bool igl::boundary_conditions(\n  const Eigen::MatrixXd & V  ,\n  const Eigen::MatrixXi & /*Ele*/,\n  const Eigen::MatrixXd & C  ,\n  const Eigen::VectorXi & P  ,\n  const Eigen::MatrixXi & BE ,\n  const Eigen::MatrixXi & CE ,\n  Eigen::VectorXi &       b  ,\n  Eigen::MatrixXd &       bc )\n{\n  using namespace Eigen;\n  using namespace std;\n\n  if(P.size()+BE.rows() == 0)\n  {\n    verbose(\"^%s: Error: no handles found\\n\",__FUNCTION__);\n    return false;\n  }\n\n  vector<int> bci;\n  vector<int> bcj;\n  vector<double> bcv;\n\n  // loop over points\n  for(int p = 0;p<P.size();p++)\n  {\n    VectorXd pos = C.row(P(p));\n    // loop over domain vertices\n    for(int i = 0;i<V.rows();i++)\n    {\n      // Find samples just on pos\n      //Vec3 vi(V(i,0),V(i,1),V(i,2));\n      // EIGEN GOTCHA:\n      // double sqrd = (V.row(i)-pos).array().pow(2).sum();\n      // Must first store in temporary\n      VectorXd vi = V.row(i);\n      double sqrd = (vi-pos).squaredNorm();\n      if(sqrd <= FLOAT_EPS)\n      {\n        //cout<<\"sum(([\"<<\n        //  V(i,0)<<\" \"<<\n        //  V(i,1)<<\" \"<<\n        //  V(i,2)<<\"] - [\"<<\n        //  pos(0)<<\" \"<<\n        //  pos(1)<<\" \"<<\n        //  pos(2)<<\"]).^2) = \"<<sqrd<<endl;\n        bci.push_back(i);\n        bcj.push_back(p);\n        bcv.push_back(1.0);\n      }\n    }\n  }\n\n  // loop over bone edges\n  for(int e = 0;e<BE.rows();e++)\n  {\n    // loop over domain vertices\n    for(int i = 0;i<V.rows();i++)\n    {\n      // Find samples from tip up to tail\n      VectorXd tip = C.row(BE(e,0));\n      VectorXd tail = C.row(BE(e,1));\n      // Compute parameter along bone and squared distance\n      double t,sqrd;\n      project_to_line(\n          V(i,0),V(i,1),V(i,2),\n          tip(0),tip(1),tip(2),\n          tail(0),tail(1),tail(2),\n          t,sqrd);\n      if(t>=-FLOAT_EPS && t<=(1.0f+FLOAT_EPS) && sqrd<=FLOAT_EPS)\n      {\n        bci.push_back(i);\n        bcj.push_back(P.size()+e);\n        bcv.push_back(1.0);\n      }\n    }\n  }\n\n  // loop over cage edges\n  for(int e = 0;e<CE.rows();e++)\n  {\n    // loop over domain vertices\n    for(int i = 0;i<V.rows();i++)\n    {\n      // Find samples from tip up to tail\n      VectorXd tip = C.row(P(CE(e,0)));\n      VectorXd tail = C.row(P(CE(e,1)));\n      // Compute parameter along bone and squared distance\n      double t,sqrd;\n      project_to_line(\n          V(i,0),V(i,1),V(i,2),\n          tip(0),tip(1),tip(2),\n          tail(0),tail(1),tail(2),\n          t,sqrd);\n      if(t>=-FLOAT_EPS && t<=(1.0f+FLOAT_EPS) && sqrd<=FLOAT_EPS)\n      {\n        bci.push_back(i);\n        bcj.push_back(CE(e,0));\n        bcv.push_back(1.0-t);\n        bci.push_back(i);\n        bcj.push_back(CE(e,1));\n        bcv.push_back(t);\n      }\n    }\n  }\n\n  // find unique boundary indices\n  vector<int> vb = bci;\n  sort(vb.begin(),vb.end());\n  vb.erase(unique(vb.begin(), vb.end()), vb.end());\n\n  b.resize(vb.size());\n  bc = MatrixXd::Zero(vb.size(),P.size()+BE.rows());\n  // Map from boundary index to index in boundary\n  map<int,int> bim;\n  int i = 0;\n  // Also fill in b\n  for(vector<int>::iterator bit = vb.begin();bit != vb.end();bit++)\n  {\n    b(i) = *bit;\n    bim[*bit] = i;\n    i++;\n  }\n\n  // Build BC\n  for(i = 0;i < (int)bci.size();i++)\n  {\n    assert(bim.find(bci[i]) != bim.end());\n    bc(bim[bci[i]],bcj[i]) = bcv[i];\n  }\n\n  // Normalize accross rows so that conditions sum to one\n  for(i = 0;i<bc.rows();i++)\n  {\n    double sum = bc.row(i).sum();\n    assert(sum != 0 && \"Some boundary vertex getting all zero BCs\");\n    bc.row(i).array() /= sum;\n  }\n\n  if(bc.size() == 0)\n  {\n    verbose(\"^%s: Error: boundary conditions are empty.\\n\",__FUNCTION__);\n    return false;\n  }\n\n  // If there's only a single boundary condition, the following tests\n  // are overzealous.\n  if(bc.cols() == 1)\n  {\n    // If there is only one weight function,\n    // then we expect that there is only one handle.\n    assert(P.rows() + BE.rows() == 1);\n    return true;\n  }\n\n  // Check that every Weight function has at least one boundary value of 1 and\n  // one value of 0\n  for(i = 0;i<bc.cols();i++)\n  {\n    double min_abs_c = bc.col(i).array().abs().minCoeff();\n    double max_c = bc.col(i).maxCoeff();\n    if(min_abs_c > FLOAT_EPS)\n    {\n      verbose(\"^%s: Error: handle %d does not receive 0 weight\\n\",__FUNCTION__,i);\n      return false;\n    }\n    if(max_c< (1-FLOAT_EPS))\n    {\n      verbose(\"^%s: Error: handle %d does not receive 1 weight\\n\",__FUNCTION__,i);\n      return false;\n    }\n  }\n\n  return true;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/boundary_conditions.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_BOUNDARY_CONDITIONS_H\n#define IGL_BOUNDARY_CONDITIONS_H\n#include \"igl_inline.h\"\n#include <Eigen/Dense>\n\nnamespace igl\n{\n\n  // Compute boundary conditions for automatic weights computation. This\n  // function expects that the given mesh (V,Ele) has sufficient samples\n  // (vertices) exactly at point handle locations and exactly along bone and\n  // cage edges.\n  //\n  // Inputs:\n  //   V  #V by dim list of domain vertices\n  //   Ele  #Ele by simplex-size list of simplex indices\n  //   C  #C by dim list of handle positions\n  //   P  #P by 1 list of point handle indices into C\n  //   BE  #BE by 2 list of bone edge indices into C\n  //   CE  #CE by 2 list of cage edge indices into *P*\n  // Outputs:\n  //   b  #b list of boundary indices (indices into V of vertices which have\n  //     known, fixed values)\n  //   bc #b by #weights list of known/fixed values for boundary vertices\n  //     (notice the #b != #weights in general because #b will include all the\n  //     intermediary samples along each bone, etc.. The ordering of the\n  //     weights corresponds to [P;BE]\n  // Returns false if boundary conditions are suspicious:\n  //   P and BE are empty\n  //   bc is empty\n  //   some column of bc doesn't have a 0 (assuming bc has >1 columns)\n  //   some column of bc doesn't have a 1 (assuming bc has >1 columns)\n  IGL_INLINE bool boundary_conditions(\n    const Eigen::MatrixXd & V,\n    const Eigen::MatrixXi & Ele,\n    const Eigen::MatrixXd & C,\n    const Eigen::VectorXi & P,\n    const Eigen::MatrixXi & BE,\n    const Eigen::MatrixXi & CE,\n    Eigen::VectorXi & b,\n    Eigen::MatrixXd & bc);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"boundary_conditions.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/boundary_facets.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"boundary_facets.h\"\n#include \"face_occurrences.h\"\n\n// IGL includes\n#include \"sort.h\"\n\n// STL includes\n#include <map>\n#include <iostream>\n\ntemplate <typename IntegerT, typename IntegerF>\nIGL_INLINE void igl::boundary_facets(\n  const std::vector<std::vector<IntegerT> > & T,\n  std::vector<std::vector<IntegerF> > & F)\n{\n  using namespace std;\n\n  if(T.size() == 0)\n  {\n    F.clear();\n    return;\n  }\n\n  int simplex_size = T[0].size();\n  // Get a list of all faces\n  vector<vector<IntegerF> > allF(\n    T.size()*simplex_size,\n    vector<IntegerF>(simplex_size-1));\n\n  // Gather faces, loop over tets\n  for(int i = 0; i< (int)T.size();i++)\n  {\n    assert((int)T[i].size() == simplex_size);\n    switch(simplex_size)\n    {\n      case 4:\n        // get face in correct order\n        allF[i*simplex_size+0][0] = T[i][1];\n        allF[i*simplex_size+0][1] = T[i][3];\n        allF[i*simplex_size+0][2] = T[i][2];\n        // get face in correct order\n        allF[i*simplex_size+1][0] = T[i][0];\n        allF[i*simplex_size+1][1] = T[i][2];\n        allF[i*simplex_size+1][2] = T[i][3];\n        // get face in correct order\n        allF[i*simplex_size+2][0] = T[i][0];\n        allF[i*simplex_size+2][1] = T[i][3];\n        allF[i*simplex_size+2][2] = T[i][1];\n        // get face in correct order\n        allF[i*simplex_size+3][0] = T[i][0];\n        allF[i*simplex_size+3][1] = T[i][1];\n        allF[i*simplex_size+3][2] = T[i][2];\n        break;\n      case 3:\n        allF[i*simplex_size+0][0] = T[i][1];\n        allF[i*simplex_size+0][1] = T[i][2];\n        allF[i*simplex_size+1][0] = T[i][2];\n        allF[i*simplex_size+1][1] = T[i][0];\n        allF[i*simplex_size+2][0] = T[i][0];\n        allF[i*simplex_size+2][1] = T[i][1];\n        break;\n    }\n  }\n\n  // Counts\n  vector<int> C;\n  face_occurrences(allF,C);\n\n  // Q: Why not just count the number of ones?\n  // A: because we are including non-manifold edges as boundary edges\n  int twos = (int) count(C.begin(),C.end(),2);\n  //int ones = (int) count(C.begin(),C.end(),1);\n  // Resize output to fit number of ones\n  F.resize(allF.size() - twos);\n  //F.resize(ones);\n  int k = 0;\n  for(int i = 0;i< (int)allF.size();i++)\n  {\n    if(C[i] != 2)\n    {\n      assert(k<(int)F.size());\n      F[k] = allF[i];\n      k++;\n    }\n  }\n  assert(k==(int)F.size());\n  //if(k != F.size())\n  //{\n  //  printf(\"%d =? %d\\n\",k,F.size());\n  //}\n\n}\n\n#include \"list_to_matrix.h\"\n#include \"matrix_to_list.h\"\n\ntemplate <typename DerivedT, typename DerivedF>\nIGL_INLINE void igl::boundary_facets(\n  const Eigen::PlainObjectBase<DerivedT>& T,\n  Eigen::PlainObjectBase<DerivedF>& F)\n{\n  assert(T.cols() == 0 || T.cols() == 4 || T.cols() == 3);\n  using namespace std;\n  using namespace Eigen;\n  // Cop out: use vector of vectors version\n  vector<vector<typename DerivedT::Scalar> > vT;\n  matrix_to_list(T,vT);\n  vector<vector<typename DerivedF::Scalar> > vF;\n  boundary_facets(vT,vF);\n  list_to_matrix(vF,F);\n}\n\ntemplate <typename DerivedT, typename Ret>\nRet igl::boundary_facets(\n  const Eigen::PlainObjectBase<DerivedT>& T)\n{\n  Ret F;\n  igl::boundary_facets(T,F);\n  return F;\n}\n\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::boundary_facets<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<unsigned int, -1, 3, 1, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<unsigned int, -1, 3, 1, -1, 3> >&);\n// generated by autoexplicit.sh\ntemplate void igl::boundary_facets<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&);\ntemplate void igl::boundary_facets<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::boundary_facets<int, int>(std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&);\n//template Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > igl::boundary_facets(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&);\ntemplate Eigen::Matrix<int, -1, -1, 0, -1, -1> igl::boundary_facets<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&);\ntemplate void igl::boundary_facets<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 3, 1, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/boundary_facets.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_BOUNDARY_FACETS_H\n#define IGL_BOUNDARY_FACETS_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Dense>\n\n#include <vector>\n\nnamespace igl\n{\n  // BOUNDARY_FACETS Determine boundary faces (edges) of tetrahedra (triangles)\n  // stored in T (analogous to qptoolbox's `outline` and `boundary_faces`).\n  //\n  // Templates:\n  //   IntegerT  integer-value: e.g. int\n  //   IntegerF  integer-value: e.g. int\n  // Input:\n  //  T  tetrahedron (triangle) index list, m by 4 (3), where m is the number of tetrahedra\n  // Output:\n  //  F  list of boundary faces, n by 3 (2), where n is the number of boundary faces\n  //\n  //\n  template <typename IntegerT, typename IntegerF>\n  IGL_INLINE void boundary_facets(\n    const std::vector<std::vector<IntegerT> > & T,\n    std::vector<std::vector<IntegerF> > & F);\n\n  // Templates:\n  //   DerivedT  integer-value: i.e. from MatrixXi\n  //   DerivedF  integer-value: i.e. from MatrixXi\n  template <typename DerivedT, typename DerivedF>\n  IGL_INLINE void boundary_facets(\n    const Eigen::PlainObjectBase<DerivedT>& T,\n    Eigen::PlainObjectBase<DerivedF>& F);\n  // Same as above but returns F\n  template <typename DerivedT, typename Ret>\n  Ret boundary_facets(\n    const Eigen::PlainObjectBase<DerivedT>& T);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"boundary_facets.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/boundary_loop.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Stefan Brugger <stefanbrugger@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"boundary_loop.h\"\n#include \"slice.h\"\n#include \"triangle_triangle_adjacency.h\"\n#include \"vertex_triangle_adjacency.h\"\n#include \"is_border_vertex.h\"\n#include <set>\n\ntemplate <typename DerivedF, typename Index>\nIGL_INLINE void igl::boundary_loop(\n    const Eigen::PlainObjectBase<DerivedF> & F,\n    std::vector<std::vector<Index> >& L)\n{\n  using namespace std;\n  using namespace Eigen;\n\n  if(F.rows() == 0)\n    return;\n\n  VectorXd Vdummy(F.maxCoeff()+1,1);\n  DerivedF TT,TTi;\n  vector<std::vector<int> > VF, VFi;\n  triangle_triangle_adjacency(F,TT,TTi);\n  vertex_triangle_adjacency(Vdummy,F,VF,VFi);\n\n  vector<bool> unvisited = is_border_vertex(Vdummy,F);\n  set<int> unseen;\n  for (size_t i = 0; i < unvisited.size(); ++i)\n  {\n    if (unvisited[i])\n      unseen.insert(unseen.end(),i);\n  }\n\n  while (!unseen.empty())\n  {\n    vector<Index> l;\n\n    // Get first vertex of loop\n    int start = *unseen.begin();\n    unseen.erase(unseen.begin());\n    unvisited[start] = false;\n    l.push_back(start);\n\n    bool done = false;\n    while (!done)\n    {\n      // Find next vertex\n      bool newBndEdge = false;\n      int v = l[l.size()-1];\n      int next;\n      for (int i = 0; i < (int)VF[v].size() && !newBndEdge; i++)\n      {\n        int fid = VF[v][i];\n\n        if (TT.row(fid).minCoeff() < 0.) // Face contains boundary edge\n        {\n          int vLoc = -1;\n          if (F(fid,0) == v) vLoc = 0;\n          if (F(fid,1) == v) vLoc = 1;\n          if (F(fid,2) == v) vLoc = 2;\n\n          int vNext = F(fid,(vLoc + 1) % F.cols());\n\n          newBndEdge = false;\n          if (unvisited[vNext] && TT(fid,vLoc) < 0)\n          {\n            next = vNext;\n            newBndEdge = true;\n          }\n        }\n      }\n\n      if (newBndEdge)\n      {\n        l.push_back(next);\n        unseen.erase(next);\n        unvisited[next] = false;\n      }\n      else\n        done = true;\n    }\n    L.push_back(l);\n  }\n}\n\ntemplate <typename DerivedF, typename Index>\nIGL_INLINE void igl::boundary_loop(\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  std::vector<Index>& L)\n{\n  using namespace Eigen;\n  using namespace std;\n\n  if(F.rows() == 0)\n    return;\n\n  vector<vector<int> > Lall;\n  boundary_loop(F,Lall);\n\n  int idxMax = -1;\n  size_t maxLen = 0;\n  for (size_t i = 0; i < Lall.size(); ++i)\n  {\n    if (Lall[i].size() > maxLen)\n    {\n      maxLen = Lall[i].size();\n      idxMax = i;\n    }\n  }\n\n  //Check for meshes without boundary\n  if (idxMax == -1)\n  {\n      L.clear();\n      return;\n  }\n\n  L.resize(Lall[idxMax].size());\n  for (size_t i = 0; i < Lall[idxMax].size(); ++i)\n  {\n    L[i] = Lall[idxMax][i];\n  }\n}\n\ntemplate <typename DerivedF, typename DerivedL>\nIGL_INLINE void igl::boundary_loop(\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  Eigen::PlainObjectBase<DerivedL>& L)\n{\n  using namespace Eigen;\n  using namespace std;\n\n  if(F.rows() == 0)\n    return;\n\n  vector<int> Lvec;\n  boundary_loop(F,Lvec);\n\n  L.resize(Lvec.size());\n  for (size_t i = 0; i < Lvec.size(); ++i)\n    L(i) = Lvec[i];\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::boundary_loop<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/boundary_loop.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Stefan Brugger <stefanbrugger@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_BOUNDARY_LOOP_H\n#define IGL_BOUNDARY_LOOP_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Dense>\n#include <vector>\n\nnamespace igl\n{\n  // Compute list of ordered boundary loops for a manifold mesh.\n  //\n  // Templates:\n  //  Index  index type\n  // Inputs:\n  //   F  #V by dim list of mesh faces\n  // Outputs:\n  //   L  list of loops where L[i] = ordered list of boundary vertices in loop i\n  //\n  template <typename DerivedF, typename Index>\n  IGL_INLINE void boundary_loop(\n    const Eigen::PlainObjectBase<DerivedF>& F, \n    std::vector<std::vector<Index> >& L);\n\n\n  // Compute ordered boundary loops for a manifold mesh and return the \n  // longest loop in terms of vertices.\n  //\n  // Templates:\n  //  Index  index type\n  // Inputs:\n  //   F  #V by dim list of mesh faces\n  // Outputs:\n  //   L  ordered list of boundary vertices of longest boundary loop\n  //\n  template <typename DerivedF, typename Index>\n  IGL_INLINE void boundary_loop(\n    const Eigen::PlainObjectBase<DerivedF>& F, \n    std::vector<Index>& L);\n\n  // Compute ordered boundary loops for a manifold mesh and return the \n  // longest loop in terms of vertices.\n  //\n  // Templates:\n  //  Index  index type\n  // Inputs:\n  //   F  #V by dim list of mesh faces\n  // Outputs:\n  //   L  ordered list of boundary vertices of longest boundary loop\n  //\n  template <typename DerivedF, typename DerivedL>\n  IGL_INLINE void boundary_loop(\n    const Eigen::PlainObjectBase<DerivedF>& F, \n    Eigen::PlainObjectBase<DerivedL>& L);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"boundary_loop.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/bounding_box.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"bounding_box.h\"\n#include <iostream>\n\ntemplate <typename DerivedV, typename DerivedBV, typename DerivedBF>\nIGL_INLINE void igl::bounding_box(\n  const Eigen::MatrixBase<DerivedV>& V,\n  Eigen::PlainObjectBase<DerivedBV>& BV,\n  Eigen::PlainObjectBase<DerivedBF>& BF)\n{\n  return bounding_box(V,0.,BV,BF);\n}\n\ntemplate <typename DerivedV, typename DerivedBV, typename DerivedBF>\nIGL_INLINE void igl::bounding_box(\n  const Eigen::MatrixBase<DerivedV>& V,\n  const typename DerivedV::Scalar pad,\n  Eigen::PlainObjectBase<DerivedBV>& BV,\n  Eigen::PlainObjectBase<DerivedBF>& BF)\n{\n  using namespace std;\n\n  const int dim = V.cols();\n  const auto & minV = V.colwise().minCoeff().array()-pad;\n  const auto & maxV = V.colwise().maxCoeff().array()+pad;\n  // 2^n vertices\n  BV.resize((1<<dim),dim);\n\n  // Recursive lambda to generate all 2^n combinations\n  const std::function<void(const int,const int,int*,int)> combos =\n  [&BV,&minV,&maxV,&combos](\n    const int dim,\n    const int i,\n    int * X,\n    const int pre_index)\n  {\n    for(X[i] = 0;X[i]<2;X[i]++)\n    {\n      int index = pre_index*2+X[i];\n      if((i+1)<dim)\n      {\n        combos(dim,i+1,X,index);\n      }else\n      {\n        for(int d = 0;d<dim;d++)\n        {\n          BV(index,d) = (X[d]?minV[d]:maxV[d]);\n        }\n      }\n    }\n  };\n\n  Eigen::VectorXi X(dim);\n  combos(dim,0,X.data(),0);\n  switch(dim)\n  {\n    case 2:\n      BF.resize(4,2);\n      BF<<\n        3,1,\n        1,0,\n        0,2,\n        2,3;\n      break;\n    case 3:\n      BF.resize(12,3);\n      BF<<\n        2,0,6,\n        0,4,6,\n        5,4,0,\n        5,0,1,\n        6,4,5,\n        5,7,6,\n        3,0,2,\n        1,0,3,\n        3,2,6,\n        6,7,3,\n        5,1,3,\n        3,7,5;\n      break;\n    default:\n      assert(false && \"Unsupported dimension.\");\n      break;\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::bounding_box<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::bounding_box<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<double, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::Matrix<double, -1, -1, 1, -1, -1>::Scalar, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::bounding_box<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<double, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::bounding_box<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&);\ntemplate void igl::bounding_box<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/bounding_box.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_BOUNDING_BOX_H\n#define IGL_BOUNDING_BOX_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Build a triangle mesh of the bounding box of a given list of vertices\n  // \n  // Inputs:\n  //   V  #V by dim list of rest domain positions\n  // Outputs:\n  //   BV  2^dim by dim list of bounding box corners positions\n  //   BF  #BF by dim list of simplex facets \n  template <typename DerivedV, typename DerivedBV, typename DerivedBF>\n  IGL_INLINE void bounding_box(\n    const Eigen::MatrixBase<DerivedV>& V,\n    Eigen::PlainObjectBase<DerivedBV>& BV,\n    Eigen::PlainObjectBase<DerivedBF>& BF);\n  template <typename DerivedV, typename DerivedBV, typename DerivedBF>\n  IGL_INLINE void bounding_box(\n    const Eigen::MatrixBase<DerivedV>& V,\n    const typename DerivedV::Scalar pad,\n    Eigen::PlainObjectBase<DerivedBV>& BV,\n    Eigen::PlainObjectBase<DerivedBF>& BF);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"bounding_box.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/bounding_box_diagonal.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"bounding_box_diagonal.h\"\n#include \"mat_max.h\"\n#include \"mat_min.h\"\n#include <cmath>\n\nIGL_INLINE double igl::bounding_box_diagonal(\n  const Eigen::MatrixXd & V)\n{\n  using namespace Eigen;\n  VectorXd maxV,minV;\n  VectorXi maxVI,minVI;\n  mat_max(V,1,maxV,maxVI);\n  mat_min(V,1,minV,minVI);\n  return sqrt((maxV-minV).array().square().sum());\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/bounding_box_diagonal.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_BOUNDING_BOX_DIAGONAL_H\n#define IGL_BOUNDING_BOX_DIAGONAL_H\n#include \"igl_inline.h\"\n#include <Eigen/Dense>\nnamespace igl\n{\n  // Compute the length of the diagonal of a given meshes axis-aligned bounding\n  // box\n  //\n  // Inputs:\n  //   V  #V by 3 list of vertex positions\n  //   F  #F by 3 list of triangle indices into V\n  // Returns length of bounding box diagonal\n  IGL_INLINE double bounding_box_diagonal( const Eigen::MatrixXd & V);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"bounding_box_diagonal.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/canonical_quaternions.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"canonical_quaternions.h\"\n\ntemplate <> IGL_INLINE float igl::CANONICAL_VIEW_QUAT<float>(int i, int j)\n{\n  return (float)igl::CANONICAL_VIEW_QUAT_F[i][j];\n}\ntemplate <> IGL_INLINE double igl::CANONICAL_VIEW_QUAT<double>(int i, int j)\n{\n  return (double)igl::CANONICAL_VIEW_QUAT_D[i][j];\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/canonical_quaternions.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_CANONICAL_QUATERNIONS_H\n#define IGL_CANONICAL_QUATERNIONS_H\n#include \"igl_inline.h\"\n// Define some canonical quaternions for floats and doubles\n// A Quaternion, q, is defined here as an arrays of four scalars (x,y,z,w),\n// such that q = x*i + y*j + z*k + w\nnamespace igl\n{\n  // Float versions\n#define SQRT_2_OVER_2 0.707106781f\n  // Identity\n  const float IDENTITY_QUAT_F[4] = {0,0,0,1};\n  // The following match the Matlab canonical views\n  // X point right, Y pointing up and Z point out\n  const float XY_PLANE_QUAT_F[4] = {0,0,0,1};\n  // X points right, Y points *in* and Z points up\n  const float XZ_PLANE_QUAT_F[4] = {-SQRT_2_OVER_2,0,0,SQRT_2_OVER_2};\n  // X points out, Y points right, and Z points up\n  const float YZ_PLANE_QUAT_F[4] = {-0.5,-0.5,-0.5,0.5};\n  const float CANONICAL_VIEW_QUAT_F[][4] = \n    {\n      {             0,             0,             0,             1}, // 0\n      {             0,             0, SQRT_2_OVER_2, SQRT_2_OVER_2}, // 1\n      {             0,             0,             1,             0}, // 2\n      {             0,             0, SQRT_2_OVER_2,-SQRT_2_OVER_2}, // 3\n\n      {             0,            -1,             0,             0}, // 4\n      {-SQRT_2_OVER_2, SQRT_2_OVER_2,             0,             0}, // 5\n      {            -1,             0,             0,             0}, // 6\n      {-SQRT_2_OVER_2,-SQRT_2_OVER_2,             0,             0}, // 7\n\n      {          -0.5,          -0.5,          -0.5,           0.5}, // 8\n      {             0,-SQRT_2_OVER_2,             0, SQRT_2_OVER_2}, // 9\n      {           0.5,          -0.5,           0.5,           0.5}, // 10\n      { SQRT_2_OVER_2,             0, SQRT_2_OVER_2,             0}, // 11\n\n      { SQRT_2_OVER_2,             0,-SQRT_2_OVER_2,             0}, // 12\n      {           0.5,           0.5,          -0.5,           0.5}, // 13\n      {             0, SQRT_2_OVER_2,             0, SQRT_2_OVER_2}, // 14\n      {          -0.5,           0.5,           0.5,           0.5}, // 15\n\n      {             0, SQRT_2_OVER_2, SQRT_2_OVER_2,             0}, // 16\n      {          -0.5,           0.5,           0.5,          -0.5}, // 17\n      {-SQRT_2_OVER_2,             0,             0,-SQRT_2_OVER_2}, // 18\n      {          -0.5,          -0.5,          -0.5,          -0.5}, // 19\n\n      {-SQRT_2_OVER_2,             0,             0, SQRT_2_OVER_2}, // 20\n      {          -0.5,          -0.5,           0.5,           0.5}, // 21\n      {             0,-SQRT_2_OVER_2, SQRT_2_OVER_2,             0}, // 22\n      {           0.5,          -0.5,           0.5,          -0.5}  // 23\n    };\n#undef SQRT_2_OVER_2\n  // Double versions\n#define SQRT_2_OVER_2 0.70710678118654757\n  // Identity\n  const double IDENTITY_QUAT_D[4] = {0,0,0,1};\n  // The following match the Matlab canonical views\n  // X point right, Y pointing up and Z point out\n  const double XY_PLANE_QUAT_D[4] = {0,0,0,1};\n  // X points right, Y points *in* and Z points up\n  const double XZ_PLANE_QUAT_D[4] = {-SQRT_2_OVER_2,0,0,SQRT_2_OVER_2};\n  // X points out, Y points right, and Z points up\n  const double YZ_PLANE_QUAT_D[4] = {-0.5,-0.5,-0.5,0.5};\n  const double CANONICAL_VIEW_QUAT_D[][4] = \n    {\n      {             0,             0,             0,             1},\n      {             0,             0, SQRT_2_OVER_2, SQRT_2_OVER_2},\n      {             0,             0,             1,             0},\n      {             0,             0, SQRT_2_OVER_2,-SQRT_2_OVER_2},\n  \n      {             0,            -1,             0,             0},\n      {-SQRT_2_OVER_2, SQRT_2_OVER_2,             0,             0},\n      {            -1,             0,             0,             0},\n      {-SQRT_2_OVER_2,-SQRT_2_OVER_2,             0,             0},\n  \n      {          -0.5,          -0.5,          -0.5,           0.5},\n      {             0,-SQRT_2_OVER_2,             0, SQRT_2_OVER_2},\n      {           0.5,          -0.5,           0.5,           0.5},\n      { SQRT_2_OVER_2,             0, SQRT_2_OVER_2,             0},\n  \n      { SQRT_2_OVER_2,             0,-SQRT_2_OVER_2,             0},\n      {           0.5,           0.5,          -0.5,           0.5},\n      {             0, SQRT_2_OVER_2,             0, SQRT_2_OVER_2},\n      {          -0.5,           0.5,           0.5,           0.5},\n  \n      {             0, SQRT_2_OVER_2, SQRT_2_OVER_2,             0},\n      {          -0.5,           0.5,           0.5,          -0.5},\n      {-SQRT_2_OVER_2,             0,             0,-SQRT_2_OVER_2},\n      {          -0.5,          -0.5,          -0.5,          -0.5},\n  \n      {-SQRT_2_OVER_2,             0,             0, SQRT_2_OVER_2},\n      {          -0.5,          -0.5,           0.5,           0.5},\n      {             0,-SQRT_2_OVER_2, SQRT_2_OVER_2,             0},\n      {           0.5,          -0.5,           0.5,          -0.5}\n    };\n#undef SQRT_2_OVER_2\n#define NUM_CANONICAL_VIEW_QUAT 24\n\n  // NOTE: I want to rather be able to return a Q_type[][] but C++ is not\n  // making it easy. So instead I've written a per-element accessor\n  \n  // Return element [i][j] of the corresponding CANONICAL_VIEW_QUAT_* of the\n  // given templated type\n  // Inputs:\n  //   i  index of quaternion\n  //   j  index of coordinate in quaternion i\n  // Returns values of CANONICAL_VIEW_QUAT_*[i][j]\n  template <typename Q_type> \n  IGL_INLINE Q_type CANONICAL_VIEW_QUAT(int i, int j);\n  // Template specializations for float and double\n  template <> \n  IGL_INLINE float CANONICAL_VIEW_QUAT<float>(int i, int j);\n  template <> \n  IGL_INLINE double CANONICAL_VIEW_QUAT<double>(int i, int j);\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"canonical_quaternions.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/cat.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"cat.h\"\n\n#include <cstdio>\n\n// Bug in unsupported/Eigen/SparseExtra needs iostream first\n#include <iostream>\n#include <unsupported/Eigen/SparseExtra>\n\n\n// Sparse matrices need to be handled carefully. Because C++ does not \n// Template:\n//   Scalar  sparse matrix scalar type, e.g. double\ntemplate <typename Scalar>\nIGL_INLINE void igl::cat(\n    const int dim, \n    const Eigen::SparseMatrix<Scalar> & A, \n    const Eigen::SparseMatrix<Scalar> & B, \n    Eigen::SparseMatrix<Scalar> & C)\n{\n\n  assert(dim == 1 || dim == 2);\n  using namespace Eigen;\n  // Special case if B or A is empty\n  if(A.size() == 0)\n  {\n    C = B;\n    return;\n  }\n  if(B.size() == 0)\n  {\n    C = A;\n    return;\n  }\n\n#if false\n  // This **must** be DynamicSparseMatrix, otherwise this implementation is\n  // insanely slow\n  DynamicSparseMatrix<Scalar, RowMajor> dyn_C;\n  if(dim == 1)\n  {\n    assert(A.cols() == B.cols());\n    dyn_C.resize(A.rows()+B.rows(),A.cols());\n  }else if(dim == 2)\n  {\n    assert(A.rows() == B.rows());\n    dyn_C.resize(A.rows(),A.cols()+B.cols());\n  }else\n  {\n    fprintf(stderr,\"cat.h: Error: Unsupported dimension %d\\n\",dim);\n  }\n\n  dyn_C.reserve(A.nonZeros()+B.nonZeros());\n\n  // Iterate over outside of A\n  for(int k=0; k<A.outerSize(); ++k)\n  {\n    // Iterate over inside\n    for(typename SparseMatrix<Scalar>::InnerIterator it (A,k); it; ++it)\n    {\n      dyn_C.coeffRef(it.row(),it.col()) += it.value();\n    }\n  }\n\n  // Iterate over outside of B\n  for(int k=0; k<B.outerSize(); ++k)\n  {\n    // Iterate over inside\n    for(typename SparseMatrix<Scalar>::InnerIterator it (B,k); it; ++it)\n    {\n      int r = (dim == 1 ? A.rows()+it.row() : it.row());\n      int c = (dim == 2 ? A.cols()+it.col() : it.col());\n      dyn_C.coeffRef(r,c) += it.value();\n    }\n  }\n\n  C = SparseMatrix<Scalar>(dyn_C);\n#elif false\n  std::vector<Triplet<Scalar> > CIJV;\n  CIJV.reserve(A.nonZeros() + B.nonZeros());\n  {\n    // Iterate over outside of A\n    for(int k=0; k<A.outerSize(); ++k)\n    {\n      // Iterate over inside\n      for(typename SparseMatrix<Scalar>::InnerIterator it (A,k); it; ++it)\n      {\n        CIJV.emplace_back(it.row(),it.col(),it.value());\n      }\n    }\n    // Iterate over outside of B\n    for(int k=0; k<B.outerSize(); ++k)\n    {\n      // Iterate over inside\n      for(typename SparseMatrix<Scalar>::InnerIterator it (B,k); it; ++it)\n      {\n        int r = (dim == 1 ? A.rows()+it.row() : it.row());\n        int c = (dim == 2 ? A.cols()+it.col() : it.col());\n        CIJV.emplace_back(r,c,it.value());\n      }\n    }\n\n  }\n\n  C = SparseMatrix<Scalar>( \n      dim == 1 ? A.rows()+B.rows() : A.rows(),\n      dim == 1 ? A.cols()          : A.cols()+B.cols());\n  C.reserve(A.nonZeros() + B.nonZeros());\n  C.setFromTriplets(CIJV.begin(),CIJV.end());\n#else\n  C = SparseMatrix<Scalar>( \n      dim == 1 ? A.rows()+B.rows() : A.rows(),\n      dim == 1 ? A.cols()          : A.cols()+B.cols());\n  Eigen::VectorXi per_col = Eigen::VectorXi::Zero(C.cols());\n  if(dim == 1)\n  {\n    assert(A.outerSize() == B.outerSize());\n    for(int k = 0;k<A.outerSize();++k)\n    {\n      for(typename SparseMatrix<Scalar>::InnerIterator it (A,k); it; ++it)\n      {\n        per_col(k)++;\n      }\n      for(typename SparseMatrix<Scalar>::InnerIterator it (B,k); it; ++it)\n      {\n        per_col(k)++;\n      }\n    }\n  }else\n  {\n    for(int k = 0;k<A.outerSize();++k)\n    {\n      for(typename SparseMatrix<Scalar>::InnerIterator it (A,k); it; ++it)\n      {\n        per_col(k)++;\n      }\n    }\n    for(int k = 0;k<B.outerSize();++k)\n    {\n      for(typename SparseMatrix<Scalar>::InnerIterator it (B,k); it; ++it)\n      {\n        per_col(A.cols() + k)++;\n      }\n    }\n  }\n  C.reserve(per_col);\n  if(dim == 1)\n  {\n    for(int k = 0;k<A.outerSize();++k)\n    {\n      for(typename SparseMatrix<Scalar>::InnerIterator it (A,k); it; ++it)\n      {\n        C.insert(it.row(),k) = it.value();\n      }\n      for(typename SparseMatrix<Scalar>::InnerIterator it (B,k); it; ++it)\n      {\n        C.insert(A.rows()+it.row(),k) = it.value();\n      }\n    }\n  }else\n  {\n    for(int k = 0;k<A.outerSize();++k)\n    {\n      for(typename SparseMatrix<Scalar>::InnerIterator it (A,k); it; ++it)\n      {\n        C.insert(it.row(),k) = it.value();\n      }\n    }\n    for(int k = 0;k<B.outerSize();++k)\n    {\n      for(typename SparseMatrix<Scalar>::InnerIterator it (B,k); it; ++it)\n      {\n        C.insert(it.row(),A.cols()+k) = it.value();\n      }\n    }\n  }\n  C.makeCompressed();\n\n#endif\n\n}\n\ntemplate <typename Derived, class MatC>\nIGL_INLINE void igl::cat(\n  const int dim,\n  const Eigen::MatrixBase<Derived> & A, \n  const Eigen::MatrixBase<Derived> & B,\n  MatC & C)\n{\n  assert(dim == 1 || dim == 2);\n  // Special case if B or A is empty\n  if(A.size() == 0)\n  {\n    C = B;\n    return;\n  }\n  if(B.size() == 0)\n  {\n    C = A;\n    return;\n  }\n\n  if(dim == 1)\n  {\n    assert(A.cols() == B.cols());\n    C.resize(A.rows()+B.rows(),A.cols());\n    C << A,B;\n  }else if(dim == 2)\n  {\n    assert(A.rows() == B.rows());\n    C.resize(A.rows(),A.cols()+B.cols());\n    C << A,B;\n  }else\n  {\n    fprintf(stderr,\"cat.h: Error: Unsupported dimension %d\\n\",dim);\n  }\n}\n\ntemplate <class Mat>\nIGL_INLINE Mat igl::cat(const int dim, const Mat & A, const Mat & B)\n{\n  assert(dim == 1 || dim == 2);\n  Mat C;\n  igl::cat(dim,A,B,C);\n  return C;\n}\n\ntemplate <class Mat>\nIGL_INLINE void igl::cat(const std::vector<std::vector< Mat > > & A, Mat & C)\n{\n  using namespace std;\n  // Start with empty matrix\n  C.resize(0,0);\n  for(const auto & row_vec : A)\n  {\n    // Concatenate each row horizontally\n    // Start with empty matrix\n    Mat row(0,0);\n    for(const auto & element : row_vec)\n    {\n      row = cat(2,row,element);\n    }\n    // Concatenate rows vertically\n    C = cat(1,C,row);\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate Eigen::Matrix<double, -1, -1, 0, -1, -1> igl::cat<Eigen::Matrix<double, -1, -1, 0, -1, -1> >(int, Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<double, -1, -1, 0, -1, -1> const&);\n// generated by autoexplicit.sh\ntemplate Eigen::SparseMatrix<double, 0, int> igl::cat<Eigen::SparseMatrix<double, 0, int> >(int, Eigen::SparseMatrix<double, 0, int> const&, Eigen::SparseMatrix<double, 0, int> const&);\n// generated by autoexplicit.sh\ntemplate Eigen::Matrix<int, -1, -1, 0, -1, -1> igl::cat<Eigen::Matrix<int, -1, -1, 0, -1, -1> >(int, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&);\ntemplate void igl::cat<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(int, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::Matrix<double, -1, 1, 0, -1, 1>&);\ntemplate Eigen::Matrix<int, -1, 1, 0, -1, 1> igl::cat<Eigen::Matrix<int, -1, 1, 0, -1, 1> >(int, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&);\ntemplate Eigen::Matrix<double, -1, 1, 0, -1, 1> igl::cat<Eigen::Matrix<double, -1, 1, 0, -1, 1> >(int, Eigen::Matrix<double, -1, 1, 0, -1, 1> const&, Eigen::Matrix<double, -1, 1, 0, -1, 1> const&);\ntemplate void igl::cat<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(int, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&);\ntemplate void igl::cat<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(int, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/cat.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_CAT_H\n#define IGL_CAT_H\n#include \"igl_inline.h\"\n\n#define EIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET\n#include <Eigen/Sparse>\n#include <Eigen/Dense>\n\nnamespace igl\n{\n  // If you're using Dense matrices you might be better off using the << operator\n\n  // This is an attempt to act like matlab's cat function.\n\n  // Perform concatenation of a two matrices along a single dimension\n  // If dim == 1, then C = [A;B]. If dim == 2 then C = [A B]\n  // \n  // Template:\n  //   Scalar  scalar data type for sparse matrices like double or int\n  //   Mat  matrix type for all matrices (e.g. MatrixXd, SparseMatrix)\n  //   MatC  matrix type for ouput matrix (e.g. MatrixXd) needs to support\n  //     resize\n  // Inputs:\n  //   A  first input matrix\n  //   B  second input matrix\n  //   dim  dimension along which to concatenate, 1 or 2\n  // Outputs:\n  //   C  output matrix\n  //   \n  template <typename Scalar>\n  IGL_INLINE void cat(\n      const int dim, \n      const Eigen::SparseMatrix<Scalar> & A, \n      const Eigen::SparseMatrix<Scalar> & B, \n      Eigen::SparseMatrix<Scalar> & C);\n  template <typename Derived, class MatC>\n  IGL_INLINE void cat(\n    const int dim,\n    const Eigen::MatrixBase<Derived> & A, \n    const Eigen::MatrixBase<Derived> & B,\n    MatC & C);\n  // Wrapper that returns C\n  template <class Mat>\n  IGL_INLINE Mat cat(const int dim, const Mat & A, const Mat & B);\n\n  // Note: Maybe we can autogenerate a bunch of overloads D = cat(int,A,B,C),\n  // E = cat(int,A,B,C,D), etc. \n\n  // Concatenate a \"matrix\" of blocks\n  // C = [A0;A1;A2;...;An] where Ai = [A[i][0] A[i][1] ... A[i][m]];\n  //\n  // Inputs:\n  //   A  a matrix (vector of row vectors)\n  // Output:\n  //   C\n  template <class Mat>\n  IGL_INLINE void cat(const std::vector<std::vector< Mat > > & A, Mat & C);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"cat.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/ceil.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"ceil.h\"\n#include <cmath>\n\ntemplate < typename DerivedX, typename DerivedY>\nIGL_INLINE void igl::ceil(\n  const Eigen::PlainObjectBase<DerivedX>& X,\n  Eigen::PlainObjectBase<DerivedY>& Y)\n{\n  using namespace std;\n  //Y = DerivedY::Zero(m,n);\n//#pragma omp parallel for\n  //for(int i = 0;i<m;i++)\n  //{\n  //  for(int j = 0;j<n;j++)\n  //  {\n  //    Y(i,j) = std::ceil(X(i,j));\n  //  }\n  //}\n  typedef typename DerivedX::Scalar Scalar;\n  Y = X.unaryExpr([](const Scalar &x)->Scalar{return std::ceil(x);}).template cast<typename DerivedY::Scalar >();\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::ceil<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/ceil.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_CEIL_H\n#define IGL_CEIL_H\n#include \"igl_inline.h\"\n#include <Eigen/Dense>\nnamespace igl\n{\n  // Ceil a given matrix to nearest integers \n  //\n  // Inputs:\n  //   X  m by n matrix of scalars\n  // Outputs:\n  //   Y  m by n matrix of ceiled integers\n  template < typename DerivedX, typename DerivedY>\n  IGL_INLINE void ceil(\n    const Eigen::PlainObjectBase<DerivedX>& X,\n    Eigen::PlainObjectBase<DerivedY>& Y);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"ceil.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/centroid.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"centroid.h\"\n#include <Eigen/Geometry>\n\ntemplate <\n  typename DerivedV, \n  typename DerivedF, \n  typename Derivedc, \n  typename Derivedvol>\nIGL_INLINE void igl::centroid(\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  Eigen::PlainObjectBase<Derivedc>& cen,\n  Derivedvol & vol)\n{\n  using namespace Eigen;\n  assert(F.cols() == 3 && \"F should contain triangles.\");\n  assert(V.cols() == 3 && \"V should contain 3d points.\");\n  const int m = F.rows();\n  cen.setZero();\n  vol = 0;\n  // loop over faces\n  for(int f = 0;f<m;f++)\n  {\n    // \"Calculating the volume and centroid of a polyhedron in 3d\" [Nuernberg 2013]\n    // http://www2.imperial.ac.uk/~rn/centroid.pdf\n    // rename corners\n    const RowVector3d & a = V.row(F(f,0));\n    const RowVector3d & b = V.row(F(f,1));\n    const RowVector3d & c = V.row(F(f,2));\n    // un-normalized normal\n    const RowVector3d & n = (b-a).cross(c-a);\n    // total volume via divergence theorem: ∫ 1\n    vol += n.dot(a)/6.;\n    // centroid via divergence theorem and midpoint quadrature: ∫ x\n    cen.array() += (1./24.*n.array()*((a+b).array().square() + (b+c).array().square() + \n        (c+a).array().square()).array());\n  }\n  cen *= 1./(2.*vol);\n}\n\ntemplate <\n  typename DerivedV, \n  typename DerivedF, \n  typename Derivedc>\nIGL_INLINE void igl::centroid(\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  Eigen::PlainObjectBase<Derivedc>& c)\n{\n  typename Derivedc::Scalar vol;\n  return centroid(V,F,c,vol);\n}\n\n#ifdef IGL_STATIC_LIBRARY\ntemplate void igl::centroid<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, 3, 1, 0, 3, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 1, 0, 3, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/centroid.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_CENTROID_H\n#define IGL_CENTROID_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // CENTROID Computes the centroid of a closed mesh using a surface integral.\n  // \n  // Inputs:\n  //   V  #V by dim list of rest domain positions\n  //   F  #F by 3 list of triangle indices into V\n  // Outputs:\n  //    c  dim vector of centroid coordinates\n  //    vol  total volume of solid.\n  //\n  template <\n    typename DerivedV, \n    typename DerivedF, \n    typename Derivedc, \n    typename Derivedvol>\n  IGL_INLINE void centroid(\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    Eigen::PlainObjectBase<Derivedc>& c,\n    Derivedvol & vol);\n  template <\n    typename DerivedV, \n    typename DerivedF, \n    typename Derivedc>\n  IGL_INLINE void centroid(\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    Eigen::PlainObjectBase<Derivedc>& c);\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"centroid.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/cgal/CGAL_includes.hpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_CGAL_INCLUDES_H\n#define IGL_CGAL_INCLUDES_H\n\n// This causes unknown bugs during intersection meshing:\n//// http://www.alecjacobson.com/weblog/?p=4291\n//#define CGAL_INTERSECTION_VERSION 1\n// Use this instead to mute errors resulting from bad CGAL assertions\n#define CGAL_KERNEL_NO_ASSERTIONS\n// Triangle triangle intersection\n#include <CGAL/intersections.h>\n// THIS CANNOT BE INCLUDED IN THE SAME FILE AS <CGAL/intersections.h>\n// #include <CGAL/Boolean_set_operations_2.h>\n\n// Constrained Delaunay Triangulation types\n#include <CGAL/Constrained_Delaunay_triangulation_2.h>\n#include <CGAL/Constrained_triangulation_plus_2.h>\n\n// Axis-align boxes for all-pairs self-intersection detection\n#include <CGAL/point_generators_3.h>\n#include <CGAL/Bbox_3.h>\n#include <CGAL/box_intersection_d.h>\n#include <CGAL/function_objects.h>\n#include <CGAL/Join_input_iterator.h>\n#include <CGAL/algorithm.h>\n#include <vector>\n\n// Axis-aligned bounding box tree for tet tri intersection\n#include <CGAL/AABB_tree.h>\n#include <CGAL/AABB_traits.h>\n#include <CGAL/AABB_triangle_primitive.h>\n\n// Boolean operations\n#include <CGAL/Polyhedron_3.h>\n// Is this actually used?\n//#include <CGAL/Nef_polyhedron_3.h>\n\n// Delaunay Triangulation in 3D\n#include <CGAL/Delaunay_triangulation_3.h>\n\n#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/cgal/RemeshSelfIntersectionsParam.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_REMESH_SELF_INTERSECTIONS_PARAM_H\n#define IGL_REMESH_SELF_INTERSECTIONS_PARAM_H\n\nnamespace igl\n{\n  // Optional Parameters\n  //   DetectOnly  Only compute IF, leave VV and FF alone\n  struct RemeshSelfIntersectionsParam\n  {\n    bool detect_only;\n    bool first_only;\n    RemeshSelfIntersectionsParam():detect_only(false),first_only(false){};\n  };\n}\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/cgal/SelfIntersectMesh.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_SELFINTERSECTMESH_H\n#define IGL_SELFINTERSECTMESH_H\n\n#include \"CGAL_includes.hpp\"\n#include \"RemeshSelfIntersectionsParam.h\"\n\n#include <Eigen/Dense>\n#include <list>\n#include <map>\n#include <vector>\n\n//#define IGL_SELFINTERSECTMESH_DEBUG\n#ifndef IGL_FIRST_HIT_EXCEPTION\n#define IGL_FIRST_HIT_EXCEPTION 10\n#endif\n\n// The easiest way to keep track of everything is to use a class\n\nnamespace igl\n{\n  // Kernel is a CGAL kernel like:\n  //     CGAL::Exact_predicates_inexact_constructions_kernel\n  // or \n  //     CGAL::Exact_predicates_exact_constructions_kernel\n\n  template <\n    typename Kernel,\n    typename DerivedV,\n    typename DerivedF,\n    typename DerivedVV,\n    typename DerivedFF,\n    typename DerivedIF,\n    typename DerivedJ,\n    typename DerivedIM>\n  class SelfIntersectMesh\n  {\n    typedef \n      SelfIntersectMesh<\n      Kernel,\n      DerivedV,\n      DerivedF,\n      DerivedVV,\n      DerivedFF,\n      DerivedIF,\n      DerivedJ,\n      DerivedIM> Self;\n    public:\n      // 3D Primitives\n      typedef CGAL::Point_3<Kernel>    Point_3;\n      typedef CGAL::Segment_3<Kernel>  Segment_3; \n      typedef CGAL::Triangle_3<Kernel> Triangle_3; \n      typedef CGAL::Plane_3<Kernel>    Plane_3;\n      typedef CGAL::Tetrahedron_3<Kernel> Tetrahedron_3; \n      //typedef CGAL::Polyhedron_3<Kernel> Polyhedron_3; \n      //typedef CGAL::Nef_polyhedron_3<Kernel> Nef_polyhedron_3; \n      // 2D Primitives\n      typedef CGAL::Point_2<Kernel>    Point_2;\n      typedef CGAL::Segment_2<Kernel>  Segment_2; \n      typedef CGAL::Triangle_2<Kernel> Triangle_2; \n      // 2D Constrained Delaunay Triangulation types\n      typedef CGAL::Triangulation_vertex_base_2<Kernel>  TVB_2;\n      typedef CGAL::Constrained_triangulation_face_base_2<Kernel> CTFB_2;\n      typedef CGAL::Triangulation_data_structure_2<TVB_2,CTFB_2> TDS_2;\n      typedef CGAL::Exact_intersections_tag Itag;\n      typedef CGAL::Constrained_Delaunay_triangulation_2<Kernel,TDS_2,Itag> \n        CDT_2;\n      typedef CGAL::Constrained_triangulation_plus_2<CDT_2> CDT_plus_2;\n      // Axis-align boxes for all-pairs self-intersection detection\n      typedef std::vector<Triangle_3> Triangles;\n      typedef typename Triangles::iterator TrianglesIterator;\n      typedef typename Triangles::const_iterator TrianglesConstIterator;\n      typedef \n        CGAL::Box_intersection_d::Box_with_handle_d<double,3,TrianglesIterator> \n        Box;\n\n      // Input mesh\n      const Eigen::PlainObjectBase<DerivedV> & V;\n      const Eigen::PlainObjectBase<DerivedF> & F;\n      // Number of self-intersecting triangle pairs\n      typedef typename DerivedF::Index Index;\n      Index count;\n      typedef std::vector<CGAL::Object> ObjectList;\n      std::vector<ObjectList > F_objects;\n      Triangles T;\n      typedef std::vector<Index> IndexList;\n      IndexList lIF;\n      std::vector<bool> offensive;\n      std::vector<Index> offending_index;\n      std::vector<Index> offending;\n      // Make a short name for the edge map's key\n      typedef std::pair<Index,Index> EMK;\n      // Make a short name for the type stored at each edge, the edge map's\n      // value\n      typedef std::vector<Index> EMV;\n      // Make a short name for the edge map\n      typedef std::map<EMK,EMV> EdgeMap;\n      EdgeMap edge2faces;\n    public:\n      RemeshSelfIntersectionsParam params;\n    public:\n      // Constructs (VV,FF) a new mesh with self-intersections of (V,F)\n      // subdivided\n      //\n      // See also: remesh_self_intersections.h\n      inline SelfIntersectMesh(\n          const Eigen::PlainObjectBase<DerivedV> & V,\n          const Eigen::PlainObjectBase<DerivedF> & F,\n          const RemeshSelfIntersectionsParam & params,\n          Eigen::PlainObjectBase<DerivedVV> & VV,\n          Eigen::PlainObjectBase<DerivedFF> & FF,\n          Eigen::PlainObjectBase<DerivedIF> & IF,\n          Eigen::PlainObjectBase<DerivedJ> & J,\n          Eigen::PlainObjectBase<DerivedIM> & IM);\n    private:\n      // Helper function to mark a face as offensive\n      //\n      // Inputs:\n      //   f  index of face in F\n      inline void mark_offensive(const Index f);\n      // Helper function to count intersections between faces\n      //\n      // Input:\n      //   fa  index of face A in F\n      //   fb  index of face B in F\n      inline void count_intersection( const Index fa, const Index fb);\n      // Helper function for box_intersect. Intersect two triangles A and B,\n      // append the intersection object (point,segment,triangle) to a running\n      // list for A and B\n      //\n      // Inputs:\n      //   A  triangle in 3D\n      //   B  triangle in 3D\n      //   fa  index of A in F (and F_objects)\n      //   fb  index of A in F (and F_objects)\n      // Returns true only if A intersects B\n      //\n      inline bool intersect(\n          const Triangle_3 & A, \n          const Triangle_3 & B, \n          const Index fa,\n          const Index fb);\n      // Helper function for box_intersect. In the case where A and B have\n      // already been identified to share a vertex, then we only want to add\n      // possible segment intersections. Assumes truly duplicate triangles are\n      // not given as input\n      //\n      // Inputs:\n      //   A  triangle in 3D\n      //   B  triangle in 3D\n      //   fa  index of A in F (and F_objects)\n      //   fb  index of B in F (and F_objects)\n      //   va  index of shared vertex in A (and F_objects)\n      //   vb  index of shared vertex in B (and F_objects)\n      //// Returns object of intersection (should be Segment or point)\n      //   Returns true if intersection (besides shared point)\n      //\n      inline bool single_shared_vertex(\n          const Triangle_3 & A,\n          const Triangle_3 & B,\n          const Index fa,\n          const Index fb,\n          const Index va,\n          const Index vb);\n      // Helper handling one direction\n      inline bool single_shared_vertex(\n          const Triangle_3 & A,\n          const Triangle_3 & B,\n          const Index fa,\n          const Index fb,\n          const Index va);\n      // Helper function for box_intersect. In the case where A and B have\n      // already been identified to share two vertices, then we only want to add\n      // a possible coplanar (Triangle) intersection. Assumes truly degenerate\n      // facets are not givin as input.\n      inline bool double_shared_vertex(\n          const Triangle_3 & A,\n          const Triangle_3 & B,\n          const Index fa,\n          const Index fb);\n\n    public:\n      // Callback function called during box self intersections test. Means\n      // boxes a and b intersect. This method then checks if the triangles in\n      // each box intersect and if so, then processes the intersections\n      //\n      // Inputs:\n      //   a  box containing a triangle\n      //   b  box containing a triangle\n      inline void box_intersect(const Box& a, const Box& b);\n    private:\n      // Compute 2D delaunay triangulation of a given 3d triangle and a list of\n      // intersection objects (points,segments,triangles). CGAL uses an affine\n      // projection rather than an isometric projection, so we're not\n      // guaranteed that the 2D delaunay triangulation here will be a delaunay\n      // triangulation in 3D.\n      //\n      // Inputs:\n      //   A  triangle in 3D\n      //   A_objects_3  updated list of intersection objects for A\n      // Outputs:\n      //   cdt  Contrained delaunay triangulation in projected 2D plane\n      inline void projected_delaunay(\n          const Triangle_3 & A,\n          const ObjectList & A_objects_3,\n          CDT_plus_2 & cdt);\n      // Getters:\n    public:\n      //const IndexList& get_lIF() const{ return lIF;}\n      static inline void box_intersect_static(\n        SelfIntersectMesh * SIM, \n        const Box &a, \n        const Box &b);\n      // Annoying wrappers to conver from cgal to double or cgal\n      static inline void to_output_type(const typename Kernel::FT & cgal,double & d);\n      static inline void to_output_type(\n        const typename CGAL::Epeck::FT & cgal,\n        CGAL::Epeck::FT & d);\n  };\n}\n\n// Implementation\n\n#include \"mesh_to_cgal_triangle_list.h\"\n\n#include <igl/REDRUM.h>\n#include <igl/get_seconds.h>\n#include <igl/C_STR.h>\n\n\n#include <functional>\n#include <algorithm>\n#include <exception>\n#include <cassert>\n#include <iostream>\n\n// References:\n// http://minregret.googlecode.com/svn/trunk/skyline/src/extern/CGAL-3.3.1/examples/Polyhedron/polyhedron_self_intersection.cpp\n// http://www.cgal.org/Manual/3.9/examples/Boolean_set_operations_2/do_intersect.cpp\n\n// Q: Should we be using CGAL::Polyhedron_3?\n// A: No! Input is just a list of unoriented triangles. Polyhedron_3 requires\n// a 2-manifold.\n// A: But! It seems we could use CGAL::Triangulation_3. Though it won't be easy\n// to take advantage of functions like insert_in_facet because we want to\n// constrain segments. Hmmm. Actualy Triangulation_3 doesn't look right...\n\n//static void box_intersect(SelfIntersectMesh * SIM,const Box & A, const Box & B)\n//{\n//  return SIM->box_intersect(A,B);\n//}\n\n\n// CGAL's box_self_intersection_d uses C-style function callbacks without\n// userdata. This is a leapfrog method for calling a member function. It should\n// be bound as if the prototype was:\n//   static void box_intersect(const Box &a, const Box &b)\n// using boost:\n//  boost::function<void(const Box &a,const Box &b)> cb\n//    = boost::bind(&::box_intersect, this, _1,_2);\n//   \ntemplate <\n  typename Kernel,\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedVV,\n  typename DerivedFF,\n  typename DerivedIF,\n  typename DerivedJ,\n  typename DerivedIM>\ninline void igl::SelfIntersectMesh<\n  Kernel,\n  DerivedV,\n  DerivedF,\n  DerivedVV,\n  DerivedFF,\n  DerivedIF,\n  DerivedJ,\n  DerivedIM>::box_intersect_static(\n  Self * SIM, \n  const typename Self::Box &a, \n  const typename Self::Box &b)\n{\n  SIM->box_intersect(a,b);\n}\n\ntemplate <\n  typename Kernel,\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedVV,\n  typename DerivedFF,\n  typename DerivedIF,\n  typename DerivedJ,\n  typename DerivedIM>\ninline igl::SelfIntersectMesh<\n  Kernel,\n  DerivedV,\n  DerivedF,\n  DerivedVV,\n  DerivedFF,\n  DerivedIF,\n  DerivedJ,\n  DerivedIM>::SelfIntersectMesh(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  const RemeshSelfIntersectionsParam & params,\n  Eigen::PlainObjectBase<DerivedVV> & VV,\n  Eigen::PlainObjectBase<DerivedFF> & FF,\n  Eigen::PlainObjectBase<DerivedIF> & IF,\n  Eigen::PlainObjectBase<DerivedJ> & J,\n  Eigen::PlainObjectBase<DerivedIM> & IM):\n  V(V),\n  F(F),\n  count(0),\n  F_objects(F.rows()),\n  T(),\n  lIF(),\n  offensive(F.rows(),false),\n  offending_index(F.rows(),-1),\n  offending(),\n  edge2faces(),\n  params(params)\n{\n  using namespace std;\n  using namespace Eigen;\n\n#ifdef IGL_SELFINTERSECTMESH_DEBUG\n  const auto & tictoc = []()\n  {\n    static double t_start = igl::get_seconds();\n    double diff = igl::get_seconds()-t_start;\n    t_start += diff;\n    return diff;\n  };\n  tictoc();\n#endif\n\n  // Compute and process self intersections\n  mesh_to_cgal_triangle_list(V,F,T);\n#ifdef IGL_SELFINTERSECTMESH_DEBUG\n  cout<<\"mesh_to_cgal_triangle_list: \"<<tictoc()<<endl;\n#endif\n  // http://www.cgal.org/Manual/latest/doc_html/cgal_manual/Box_intersection_d/Chapter_main.html#Section_63.5 \n  // Create the corresponding vector of bounding boxes\n  std::vector<Box> boxes;\n  boxes.reserve(T.size());\n  for ( \n    TrianglesIterator tit = T.begin(); \n    tit != T.end(); \n    ++tit)\n  {\n    boxes.push_back(Box(tit->bbox(), tit));\n  }\n  // Leapfrog callback\n  std::function<void(const Box &a,const Box &b)> cb = \n    std::bind(&box_intersect_static, this, \n      // Explicitly use std namespace to avoid confusion with boost (who puts\n      // _1 etc. in global namespace)\n      std::placeholders::_1,\n      std::placeholders::_2);\n#ifdef IGL_SELFINTERSECTMESH_DEBUG\n  cout<<\"boxes and bind: \"<<tictoc()<<endl;\n#endif\n  // Run the self intersection algorithm with all defaults\n  try{\n    CGAL::box_self_intersection_d(boxes.begin(), boxes.end(),cb);\n  }catch(int e)\n  {\n    // Rethrow if not IGL_FIRST_HIT_EXCEPTION\n    if(e != IGL_FIRST_HIT_EXCEPTION)\n    {\n      throw e;\n    }\n    // Otherwise just fall through\n  }\n#ifdef IGL_SELFINTERSECTMESH_DEBUG\n  cout<<\"box_self_intersection_d: \"<<tictoc()<<endl;\n#endif\n\n  // Convert lIF to Eigen matrix\n  assert(lIF.size()%2 == 0);\n  IF.resize(lIF.size()/2,2);\n  {\n    Index i=0;\n    for(\n      typename IndexList::const_iterator ifit = lIF.begin();\n      ifit!=lIF.end();\n      )\n    {\n      IF(i,0) = (*ifit);\n      ifit++; \n      IF(i,1) = (*ifit);\n      ifit++;\n      i++;\n    }\n  }\n#ifdef IGL_SELFINTERSECTMESH_DEBUG\n  cout<<\"IF: \"<<tictoc()<<endl;\n#endif\n\n  if(params.detect_only)\n  {\n    return;\n  }\n\n  int NF_count = 0;\n  // list of new faces, we'll fix F later\n  vector<\n    typename Eigen::Matrix<typename DerivedFF::Scalar,Dynamic,Dynamic>\n    > NF(offending.size());\n  // list of new vertices\n  typedef vector<Point_3> Point_3List;\n  Point_3List NV;\n  Index NV_count = 0;\n  vector<CDT_plus_2> cdt(offending.size());\n  vector<Plane_3> P(offending.size());\n  // Use map for *all* faces\n  map<typename CDT_plus_2::Vertex_handle,Index> v2i;\n  // Loop over offending triangles\n  const size_t noff = offending.size();\n#ifdef IGL_SELFINTERSECTMESH_DEBUG\n  double t_proj_del = 0;\n#endif\n  // Unfortunately it looks like CGAL has trouble allocating memory when\n  // multiple openmp threads are running. Crashes durring CDT...\n//# pragma omp parallel for if (noff>1000)\n  for(Index o = 0;o<(Index)noff;o++)\n  {\n    // index in F\n    const Index f = offending[o];\n    {\n#ifdef IGL_SELFINTERSECTMESH_DEBUG\n      const double t_before = get_seconds();\n#endif\n      projected_delaunay(T[f],F_objects[f],cdt[o]);\n#ifdef IGL_SELFINTERSECTMESH_DEBUG\n      t_proj_del += (get_seconds()-t_before);\n#endif\n    }\n    // Q: Is this also delaunay in 3D?\n    // A: No, because the projection is affine and delaunay is not affine\n    // invariant.\n    // Q: Then, can't we first get the 2D delaunay triangulation, then lift it\n    // to 3D and flip any offending edges?\n    // Plane of projection (also used by projected_delaunay)\n    P[o] = Plane_3(T[f].vertex(0),T[f].vertex(1),T[f].vertex(2));\n    // Build index map\n    {\n      Index i=0;\n      for(\n        typename CDT_plus_2::Finite_vertices_iterator vit = cdt[o].finite_vertices_begin();\n        vit != cdt[o].finite_vertices_end();\n        ++vit)\n      {\n        if(i<3)\n        {\n          //cout<<T[f].vertex(i)<<\n          //  (T[f].vertex(i) == P[o].to_3d(vit->point())?\" == \":\" != \")<<\n          //  P[o].to_3d(vit->point())<<endl;\n#ifndef NDEBUG\n          // I want to be sure that the original corners really show up as the\n          // original corners of the CDT. I.e. I don't trust CGAL to maintain\n          // the order\n          assert(T[f].vertex(i) == P[o].to_3d(vit->point()));\n#endif\n          // For first three, use original index in F\n//#   pragma omp critical\n          v2i[vit] = F(f,i);\n        }else\n        {\n          const Point_3 vit_point_3 = P[o].to_3d(vit->point());\n          // First look up each edge's neighbors to see if exact point has\n          // already been added (This makes everything a bit quadratic)\n          bool found = false;\n          for(int e = 0; e<3 && !found;e++)\n          {\n            // Index of F's eth edge in V\n            Index i = F(f,(e+1)%3);\n            Index j = F(f,(e+2)%3);\n            // Be sure that i<j\n            if(i>j)\n            {\n              swap(i,j);\n            }\n            assert(edge2faces.count(EMK(i,j))==1);\n            // loop over neighbors\n            for(\n              typename IndexList::const_iterator nit = edge2faces[EMK(i,j)].begin();\n              nit != edge2faces[EMK(i,j)].end() && !found;\n              nit++)\n            {\n              // don't consider self\n              if(*nit == f)\n              {\n                continue;\n              }\n              // index of neighbor in offending (to find its cdt)\n              Index no = offending_index[*nit];\n              // Loop over vertices of that neighbor's cdt (might not have been\n              // processed yet, but then it's OK because it'll just be empty)\n              for(\n                  typename CDT_plus_2::Finite_vertices_iterator uit = cdt[no].finite_vertices_begin();\n                  uit != cdt[no].finite_vertices_end() && !found;\n                  ++uit)\n              {\n                if(vit_point_3 == P[no].to_3d(uit->point()))\n                {\n                  assert(v2i.count(uit) == 1);\n//#   pragma omp critical\n                  v2i[vit] = v2i[uit];\n                  found = true;\n                }\n              }\n            }\n          }\n          if(!found)\n          {\n//#   pragma omp critical\n            {\n              v2i[vit] = V.rows()+NV_count;\n              NV.push_back(vit_point_3);\n              NV_count++;\n            }\n          }\n        }\n        i++;\n      }\n    }\n    {\n      Index i = 0;\n      // Resize to fit new number of triangles\n      NF[o].resize(cdt[o].number_of_faces(),3);\n//#   pragma omp atomic\n      NF_count+=NF[o].rows();\n      // Append new faces to NF\n      for(\n        typename CDT_plus_2::Finite_faces_iterator fit = cdt[o].finite_faces_begin();\n        fit != cdt[o].finite_faces_end();\n        ++fit)\n      {\n        NF[o](i,0) = v2i[fit->vertex(0)];\n        NF[o](i,1) = v2i[fit->vertex(1)];\n        NF[o](i,2) = v2i[fit->vertex(2)];\n        i++;\n      }\n    }\n  }\n#ifdef IGL_SELFINTERSECTMESH_DEBUG\n  cout<<\"CDT: \"<<tictoc()<<\"  \"<<t_proj_del<<endl;\n#endif\n\n  assert(NV_count == (Index)NV.size());\n  // Build output\n#ifndef NDEBUG\n  {\n    Index off_count = 0;\n    for(Index f = 0;f<F.rows();f++)\n    {\n      off_count+= (offensive[f]?1:0);\n    }\n    assert(off_count==(Index)offending.size());\n  }\n#endif\n  // Append faces\n  FF.resize(F.rows()-offending.size()+NF_count,3);\n  J.resize(FF.rows());\n  // First append non-offending original faces\n  // There's an Eigen way to do this in one line but I forget\n  Index off = 0;\n  for(Index f = 0;f<F.rows();f++)\n  {\n    if(!offensive[f])\n    {\n      FF.row(off) = F.row(f);\n      J(off) = f;\n      off++;\n    }\n  }\n  assert(off == (Index)(F.rows()-offending.size()));\n  // Now append replacement faces for offending faces\n  for(Index o = 0;o<(Index)offending.size();o++)\n  {\n    FF.block(off,0,NF[o].rows(),3) = NF[o];\n    J.block(off,0,NF[o].rows(),1).setConstant(offending[o]);\n    off += NF[o].rows();\n  }\n  // Append vertices\n  VV.resize(V.rows()+NV_count,3);\n  VV.block(0,0,V.rows(),3) = V.template cast<typename DerivedVV::Scalar>();\n  {\n    Index i = 0;\n    for(\n      typename Point_3List::const_iterator nvit = NV.begin();\n      nvit != NV.end();\n      nvit++)\n    {\n      for(Index d = 0;d<3;d++)\n      {\n        const Point_3 & p = *nvit;\n        // Don't convert via double if output type is same as Kernel\n        to_output_type(p[d], VV(V.rows()+i,d));\n      }\n      i++;\n    }\n  }\n  IM.resize(VV.rows(),1);\n  map<Point_3,Index> vv2i;\n  // Safe to check for duplicates using double for original vertices: if\n  // incoming reps are different then the points are unique.\n  for(Index v = 0;v<V.rows();v++)\n  {\n    const Point_3 p(V(v,0),V(v,1),V(v,2));\n    if(vv2i.count(p)==0)\n    {\n      vv2i[p] = v;\n    }\n    assert(vv2i.count(p) == 1);\n    IM(v) = vv2i[p];\n  }\n  // Must check for duplicates of new vertices using exact.\n  {\n    Index v = V.rows();\n    for(\n      typename Point_3List::const_iterator nvit = NV.begin();\n      nvit != NV.end();\n      nvit++)\n    {\n      const Point_3 & p = *nvit;\n      if(vv2i.count(p)==0)\n      {\n        vv2i[p] = v;\n      }\n      assert(vv2i.count(p) == 1);\n      IM(v) = vv2i[p];\n      v++;\n    }\n  }\n#ifdef IGL_SELFINTERSECTMESH_DEBUG\n  cout<<\"Output + dupes: \"<<tictoc()<<endl;\n#endif\n\n  // Q: Does this give the same result as TETGEN?\n  // A: For the cow and beast, yes.\n\n  // Q: Is tetgen faster than this CGAL implementation?\n  // A: Well, yes. But Tetgen is only solving the detection (predicates)\n  // problem. This is also appending the intersection objects (construction).\n  // But maybe tetgen is still faster for the detection part. For example, this\n  // CGAL implementation on the beast takes 98 seconds but tetgen detection\n  // takes 14 seconds\n\n}\n\n\ntemplate <\n  typename Kernel,\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedVV,\n  typename DerivedFF,\n  typename DerivedIF,\n  typename DerivedJ,\n  typename DerivedIM>\ninline void igl::SelfIntersectMesh<\n  Kernel,\n  DerivedV,\n  DerivedF,\n  DerivedVV,\n  DerivedFF,\n  DerivedIF,\n  DerivedJ,\n  DerivedIM>::mark_offensive(const Index f)\n{\n  using namespace std;\n  lIF.push_back(f);\n  if(!offensive[f])\n  {\n    offensive[f]=true;\n    offending_index[f]=offending.size();\n    offending.push_back(f);\n    // Add to edge map\n    for(Index e = 0; e<3;e++)\n    {\n      // Index of F's eth edge in V\n      Index i = F(f,(e+1)%3);\n      Index j = F(f,(e+2)%3);\n      // Be sure that i<j\n      if(i>j)\n      {\n        swap(i,j);\n      }\n      // Create new list if there is no entry\n      if(edge2faces.count(EMK(i,j))==0)\n      {\n        edge2faces[EMK(i,j)] = EMV();\n      }\n      // append to list\n      edge2faces[EMK(i,j)].push_back(f);\n    }\n  }\n}\n\ntemplate <\n  typename Kernel,\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedVV,\n  typename DerivedFF,\n  typename DerivedIF,\n  typename DerivedJ,\n  typename DerivedIM>\ninline void igl::SelfIntersectMesh<\n  Kernel,\n  DerivedV,\n  DerivedF,\n  DerivedVV,\n  DerivedFF,\n  DerivedIF,\n  DerivedJ,\n  DerivedIM>::count_intersection(\n  const Index fa,\n  const Index fb)\n{\n  mark_offensive(fa);\n  mark_offensive(fb);\n  this->count++;\n  // We found the first intersection\n  if(params.first_only && this->count >= 1)\n  {\n    throw IGL_FIRST_HIT_EXCEPTION;\n  }\n}\n\ntemplate <\n  typename Kernel,\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedVV,\n  typename DerivedFF,\n  typename DerivedIF,\n  typename DerivedJ,\n  typename DerivedIM>\ninline bool igl::SelfIntersectMesh<\n  Kernel,\n  DerivedV,\n  DerivedF,\n  DerivedVV,\n  DerivedFF,\n  DerivedIF,\n  DerivedJ,\n  DerivedIM>::intersect(\n  const Triangle_3 & A, \n  const Triangle_3 & B, \n  const Index fa,\n  const Index fb)\n{\n  // Determine whether there is an intersection\n  if(!CGAL::do_intersect(A,B))\n  {\n    return false;\n  }\n  if(!params.detect_only)\n  {\n    // Construct intersection\n    CGAL::Object result = CGAL::intersection(A,B);\n    F_objects[fa].push_back(result);\n    F_objects[fb].push_back(result);\n  }\n  count_intersection(fa,fb);\n  return true;\n}\n\ntemplate <\n  typename Kernel,\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedVV,\n  typename DerivedFF,\n  typename DerivedIF,\n  typename DerivedJ,\n  typename DerivedIM>\ninline bool igl::SelfIntersectMesh<\n  Kernel,\n  DerivedV,\n  DerivedF,\n  DerivedVV,\n  DerivedFF,\n  DerivedIF,\n  DerivedJ,\n  DerivedIM>::single_shared_vertex(\n  const Triangle_3 & A,\n  const Triangle_3 & B,\n  const Index fa,\n  const Index fb,\n  const Index va,\n  const Index vb)\n{\n  ////using namespace std;\n  //CGAL::Object result = CGAL::intersection(A,B);\n  //if(CGAL::object_cast<Segment_3 >(&result))\n  //{\n  //  // Append to each triangle's running list\n  //  F_objects[fa].push_back(result);\n  //  F_objects[fb].push_back(result);\n  //  count_intersection(fa,fb);\n  //}else\n  //{\n  //  // Then intersection must be at point\n  //  // And point must be at shared vertex\n  //  assert(CGAL::object_cast<Point_3>(&result));\n  //}\n  if(single_shared_vertex(A,B,fa,fb,va))\n  {\n    return true;\n  }\n  return single_shared_vertex(B,A,fb,fa,vb);\n}\n\ntemplate <\n  typename Kernel,\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedVV,\n  typename DerivedFF,\n  typename DerivedIF,\n  typename DerivedJ,\n  typename DerivedIM>\ninline bool igl::SelfIntersectMesh<\n  Kernel,\n  DerivedV,\n  DerivedF,\n  DerivedVV,\n  DerivedFF,\n  DerivedIF,\n  DerivedJ,\n  DerivedIM>::single_shared_vertex(\n  const Triangle_3 & A,\n  const Triangle_3 & B,\n  const Index fa,\n  const Index fb,\n  const Index va)\n{\n  // This was not a good idea. It will not handle coplanar triangles well.\n  using namespace std;\n  Segment_3 sa(\n    A.vertex((va+1)%3),\n    A.vertex((va+2)%3));\n\n  if(CGAL::do_intersect(sa,B))\n  {\n    CGAL::Object result = CGAL::intersection(sa,B);\n    if(const Point_3 * p = CGAL::object_cast<Point_3 >(&result))\n    {\n      if(!params.detect_only)\n      {\n        // Single intersection --> segment from shared point to intersection\n        CGAL::Object seg = CGAL::make_object(Segment_3(\n          A.vertex(va),\n          *p));\n        F_objects[fa].push_back(seg);\n        F_objects[fb].push_back(seg);\n      }\n      count_intersection(fa,fb);\n      return true;\n    }else if(CGAL::object_cast<Segment_3 >(&result))\n    {\n      //cerr<<REDRUM(\"Coplanar at: \"<<fa<<\" & \"<<fb<<\" (single shared).\")<<endl;\n      // Must be coplanar\n      if(params.detect_only)\n      {\n        count_intersection(fa,fb);\n      }else\n      {\n        // WRONG:\n        //// Segment intersection --> triangle from shared point to intersection\n        //CGAL::Object tri = CGAL::make_object(Triangle_3(\n        //  A.vertex(va),\n        //  s->vertex(0),\n        //  s->vertex(1)));\n        //F_objects[fa].push_back(tri);\n        //F_objects[fb].push_back(tri);\n        //count_intersection(fa,fb);\n        // Need to do full test. Intersection could be a general poly.\n        bool test = intersect(A,B,fa,fb);\n        ((void)test);\n        assert(test);\n      }\n      return true;\n    }else\n    {\n      cerr<<REDRUM(\"Segment ∩ triangle neither point nor segment?\")<<endl;\n      assert(false);\n    }\n  }\n\n  return false;\n}\n\n\ntemplate <\n  typename Kernel,\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedVV,\n  typename DerivedFF,\n  typename DerivedIF,\n  typename DerivedJ,\n  typename DerivedIM>\ninline bool igl::SelfIntersectMesh<\n  Kernel,\n  DerivedV,\n  DerivedF,\n  DerivedVV,\n  DerivedFF,\n  DerivedIF,\n  DerivedJ,\n  DerivedIM>::double_shared_vertex(\n  const Triangle_3 & A,\n  const Triangle_3 & B,\n  const Index fa,\n  const Index fb)\n{\n  using namespace std;\n  // Cheaper way to do this than calling do_intersect?\n  if(\n    // Can only have an intersection if co-planar\n    (A.supporting_plane() == B.supporting_plane() ||\n    A.supporting_plane() == B.supporting_plane().opposite()) &&\n    CGAL::do_intersect(A,B))\n  {\n    // Construct intersection\n    try\n    {\n      // This can fail for Epick but not Epeck\n      CGAL::Object result = CGAL::intersection(A,B);\n      if(!result.empty())\n      {\n        if(CGAL::object_cast<Segment_3 >(&result))\n        {\n          // not coplanar\n          return false;\n        } else if(CGAL::object_cast<Point_3 >(&result))\n        {\n          // this \"shouldn't\" happen but does for inexact\n          return false;\n        } else\n        {\n          if(!params.detect_only)\n          {\n            // Triangle object\n            F_objects[fa].push_back(result);\n            F_objects[fb].push_back(result);\n          }\n          count_intersection(fa,fb);\n          //cerr<<REDRUM(\"Coplanar at: \"<<fa<<\" & \"<<fb<<\" (double shared).\")<<endl;\n          return true;\n        }\n      }else\n      {\n        // CGAL::intersection is disagreeing with do_intersect\n        return false;\n      }\n    }catch(...)\n    {\n      // This catches some cgal assertion:\n      //     CGAL error: assertion violation!\n      //     Expression : is_finite(d)\n      //     File       : /opt/local/include/CGAL/GMP/Gmpq_type.h\n      //     Line       : 132\n      //     Explanation: \n      // But only if NDEBUG is not defined, otherwise there's an uncaught\n      // \"Floating point exception: 8\" SIGFPE\n      return false;\n    }\n  }\n  // No intersection.\n  return false;\n}\n\ntemplate <\n  typename Kernel,\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedVV,\n  typename DerivedFF,\n  typename DerivedIF,\n  typename DerivedJ,\n  typename DerivedIM>\ninline void igl::SelfIntersectMesh<\n  Kernel,\n  DerivedV,\n  DerivedF,\n  DerivedVV,\n  DerivedFF,\n  DerivedIF,\n  DerivedJ,\n  DerivedIM>::box_intersect(\n  const Box& a, \n  const Box& b)\n{\n  using namespace std;\n  // Could we write this as a static function of:\n  //\n  // F.row(fa)\n  // F.row(fb)\n  // A\n  // B\n\n  // index in F and T\n  Index fa = a.handle()-T.begin();\n  Index fb = b.handle()-T.begin();\n  const Triangle_3 & A = *a.handle();\n  const Triangle_3 & B = *b.handle();\n  // I'm not going to deal with degenerate triangles, though at some point we\n  // should\n  assert(!a.handle()->is_degenerate());\n  assert(!b.handle()->is_degenerate());\n  // Number of combinatorially shared vertices\n  Index comb_shared_vertices = 0;\n  // Number of geometrically shared vertices (*not* including combinatorially\n  // shared)\n  Index geo_shared_vertices = 0;\n  // Keep track of shared vertex indices (we only handles single shared\n  // vertices as a special case, so just need last/first/only ones)\n  Index va=-1,vb=-1;\n  Index ea,eb;\n  for(ea=0;ea<3;ea++)\n  {\n    for(eb=0;eb<3;eb++)\n    {\n      if(F(fa,ea) == F(fb,eb))\n      {\n        comb_shared_vertices++;\n        va = ea;\n        vb = eb;\n      }else if(A.vertex(ea) == B.vertex(eb))\n      {\n        geo_shared_vertices++;\n        va = ea;\n        vb = eb;\n      }\n    }\n  }\n  const Index total_shared_vertices = comb_shared_vertices + geo_shared_vertices;\n  if(comb_shared_vertices== 3)\n  {\n    //// Combinatorially duplicate face, these should be removed by preprocessing\n    //cerr<<REDRUM(\"Facets \"<<fa<<\" and \"<<fb<<\" are combinatorial duplicates\")<<endl;\n    goto done;\n  }\n  if(total_shared_vertices== 3)\n  {\n    //// Geometrically duplicate face, these should be removed by preprocessing\n    //cerr<<REDRUM(\"Facets \"<<fa<<\" and \"<<fb<<\" are geometrical duplicates\")<<endl;\n    goto done;\n  }\n  //// SPECIAL CASES ARE BROKEN FOR COPLANAR TRIANGLES\n  //if(total_shared_vertices > 0)\n  //{\n  //  bool coplanar = \n  //    CGAL::coplanar(A.vertex(0),A.vertex(1),A.vertex(2),B.vertex(0)) &&\n  //    CGAL::coplanar(A.vertex(0),A.vertex(1),A.vertex(2),B.vertex(1)) &&\n  //    CGAL::coplanar(A.vertex(0),A.vertex(1),A.vertex(2),B.vertex(2));\n  //  if(coplanar)\n  //  {\n  //    cerr<<MAGENTAGIN(\"Facets \"<<fa<<\" and \"<<fb<<\n  //      \" are coplanar and share vertices\")<<endl;\n  //    goto full;\n  //  }\n  //}\n\n  if(total_shared_vertices == 2)\n  {\n    // Q: What about coplanar?\n    //\n    // o    o\n    // |\\  /|\n    // | \\/ |\n    // | /\\ |\n    // |/  \\|\n    // o----o\n    double_shared_vertex(A,B,fa,fb);\n\n    goto done;\n  }\n  assert(total_shared_vertices<=1);\n  if(total_shared_vertices==1)\n  {\n    assert(va>=0 && va<3);\n    assert(vb>=0 && vb<3);\n//#ifndef NDEBUG\n//    CGAL::Object result =\n//#endif\n    single_shared_vertex(A,B,fa,fb,va,vb);\n//#ifndef NDEBUG\n//    if(!CGAL::object_cast<Segment_3 >(&result))\n//    {\n//      const Point_3 * p = CGAL::object_cast<Point_3 >(&result);\n//      assert(p);\n//      for(int ea=0;ea<3;ea++)\n//      {\n//        for(int eb=0;eb<3;eb++)\n//        {\n//          if(F(fa,ea) == F(fb,eb))\n//          {\n//            assert(*p==A.vertex(ea));\n//            assert(*p==B.vertex(eb));\n//          }\n//        }\n//      }\n//    }\n//#endif\n  }else\n  {\n//full:\n    // No geometrically shared vertices, do general intersect\n    intersect(*a.handle(),*b.handle(),fa,fb);\n  }\ndone:\n  return;\n}\n\n// Compute 2D delaunay triangulation of a given 3d triangle and a list of\n// intersection objects (points,segments,triangles). CGAL uses an affine\n// projection rather than an isometric projection, so we're not guaranteed\n// that the 2D delaunay triangulation here will be a delaunay triangulation\n// in 3D.\n//\n// Inputs:\n//   A  triangle in 3D\n//   A_objects_3  updated list of intersection objects for A\n// Outputs:\n//   cdt  Contrained delaunay triangulation in projected 2D plane\ntemplate <\n  typename Kernel,\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedVV,\n  typename DerivedFF,\n  typename DerivedIF,\n  typename DerivedJ,\n  typename DerivedIM>\ninline void igl::SelfIntersectMesh<\n  Kernel,\n  DerivedV,\n  DerivedF,\n  DerivedVV,\n  DerivedFF,\n  DerivedIF,\n  DerivedJ,\n  DerivedIM>::projected_delaunay(\n  const Triangle_3 & A,\n  const ObjectList & A_objects_3,\n  CDT_plus_2 & cdt)\n{\n  using namespace std;\n  // http://www.cgal.org/Manual/3.2/doc_html/cgal_manual/Triangulation_2/Chapter_main.html#Section_2D_Triangulations_Constrained_Plus\n  // Plane of triangle A\n  Plane_3 P(A.vertex(0),A.vertex(1),A.vertex(2));\n  // Insert triangle into vertices\n  typename CDT_plus_2::Vertex_handle corners[3];\n  for(Index i = 0;i<3;i++)\n  {\n    corners[i] = cdt.insert(P.to_2d(A.vertex(i)));\n  }\n  // Insert triangle edges as constraints\n  for(Index i = 0;i<3;i++)\n  {\n    cdt.insert_constraint( corners[(i+1)%3], corners[(i+2)%3]);\n  }\n  // Insert constraints for intersection objects\n  for( const auto & obj : A_objects_3)\n  {\n    if(const Segment_3 *iseg = CGAL::object_cast<Segment_3 >(&obj))\n    {\n      // Add segment constraint\n      cdt.insert_constraint(P.to_2d(iseg->vertex(0)),P.to_2d(iseg->vertex(1)));\n    }else if(const Point_3 *ipoint = CGAL::object_cast<Point_3 >(&obj))\n    {\n      // Add point\n      cdt.insert(P.to_2d(*ipoint));\n    } else if(const Triangle_3 *itri = CGAL::object_cast<Triangle_3 >(&obj))\n    {\n      // Add 3 segment constraints\n      cdt.insert_constraint(P.to_2d(itri->vertex(0)),P.to_2d(itri->vertex(1)));\n      cdt.insert_constraint(P.to_2d(itri->vertex(1)),P.to_2d(itri->vertex(2)));\n      cdt.insert_constraint(P.to_2d(itri->vertex(2)),P.to_2d(itri->vertex(0)));\n    } else if(const std::vector<Point_3 > *polyp = \n        CGAL::object_cast< std::vector<Point_3 > >(&obj))\n    {\n      //cerr<<REDRUM(\"Poly...\")<<endl;\n      const std::vector<Point_3 > & poly = *polyp;\n      const Index m = poly.size();\n      assert(m>=2);\n      for(Index p = 0;p<m;p++)\n      {\n        const Index np = (p+1)%m;\n        cdt.insert_constraint(P.to_2d(poly[p]),P.to_2d(poly[np]));\n      }\n    }else\n    {\n      cerr<<REDRUM(\"What is this object?!\")<<endl;\n      assert(false);\n    }\n  }\n}\n\ntemplate <\n  typename Kernel,\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedVV,\n  typename DerivedFF,\n  typename DerivedIF,\n  typename DerivedJ,\n  typename DerivedIM>\ninline \nvoid \nigl::SelfIntersectMesh<\n  Kernel,\n  DerivedV,\n  DerivedF,\n  DerivedVV,\n  DerivedFF,\n  DerivedIF,\n  DerivedJ,\n  DerivedIM>::to_output_type(\n    const typename Kernel::FT & cgal,\n    double & d)\n{\n  d = CGAL::to_double(cgal);\n}\n\ntemplate <\n  typename Kernel,\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedVV,\n  typename DerivedFF,\n  typename DerivedIF,\n  typename DerivedJ,\n  typename DerivedIM>\ninline \nvoid \nigl::SelfIntersectMesh<\n  Kernel,\n  DerivedV,\n  DerivedF,\n  DerivedVV,\n  DerivedFF,\n  DerivedIF,\n  DerivedJ,\n  DerivedIM>::to_output_type(\n    const typename CGAL::Epeck::FT & cgal,\n    CGAL::Epeck::FT & d)\n{\n  d = cgal;\n}\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/cgal/complex_to_mesh.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"complex_to_mesh.h\"\n\n#include <igl/centroid.h>\n#include <igl/remove_unreferenced.h>\n\n#include <CGAL/Surface_mesh_default_triangulation_3.h>\n#include <CGAL/Delaunay_triangulation_cell_base_with_circumcenter_3.h>\n#include <set>\n#include <stack>\n\ntemplate <typename Tr, typename DerivedV, typename DerivedF>\nIGL_INLINE bool igl::complex_to_mesh(\n  const CGAL::Complex_2_in_triangulation_3<Tr> & c2t3,\n  Eigen::PlainObjectBase<DerivedV> & V, \n  Eigen::PlainObjectBase<DerivedF> & F)\n{\n  using namespace igl;\n  using namespace Eigen;\n  // CGAL/IO/Complex_2_in_triangulation_3_file_writer.h\n  using CGAL::Surface_mesher::number_of_facets_on_surface;\n\n  typedef typename CGAL::Complex_2_in_triangulation_3<Tr> C2t3;\n  typedef typename Tr::Finite_facets_iterator Finite_facets_iterator;\n  typedef typename Tr::Finite_vertices_iterator Finite_vertices_iterator;\n  typedef typename Tr::Facet Facet;\n  typedef typename Tr::Edge Edge;\n  typedef typename Tr::Vertex_handle Vertex_handle;\n\n  // Header.\n  const Tr& tr = c2t3.triangulation();\n\n  bool success = true;\n\n  const int n = tr.number_of_vertices();\n  const int m = c2t3.number_of_facets();\n\n  assert(m == number_of_facets_on_surface(tr));\n  \n  // Finite vertices coordinates.\n  std::map<Vertex_handle, int> v2i;\n  V.resize(n,3);\n  {\n    int v = 0;\n    for(Finite_vertices_iterator vit = tr.finite_vertices_begin();\n        vit != tr.finite_vertices_end();\n        ++vit)\n    {\n      V(v,0) = vit->point().x(); \n      V(v,1) = vit->point().y(); \n      V(v,2) = vit->point().z(); \n      v2i[vit] = v++;\n    }\n  }\n\n  {\n    Finite_facets_iterator fit = tr.finite_facets_begin();\n    std::set<Facet> oriented_set;\n    std::stack<Facet> stack;\n\n    while ((int)oriented_set.size() != m) \n    {\n      while ( fit->first->is_facet_on_surface(fit->second) == false ||\n        oriented_set.find(*fit) != oriented_set.end() ||\n        oriented_set.find(c2t3.opposite_facet(*fit)) !=\n        oriented_set.end() ) \n      {\n        ++fit;\n      }\n      oriented_set.insert(*fit);\n      stack.push(*fit);\n      while(! stack.empty() )\n      {\n        Facet f = stack.top();\n        stack.pop();\n        for(int ih = 0 ; ih < 3 ; ++ih)\n        {\n          const int i1  = tr.vertex_triple_index(f.second, tr. cw(ih));\n          const int i2  = tr.vertex_triple_index(f.second, tr.ccw(ih));\n\n          const typename C2t3::Face_status face_status\n            = c2t3.face_status(Edge(f.first, i1, i2));\n          if(face_status == C2t3::REGULAR) \n          {\n            Facet fn = c2t3.neighbor(f, ih);\n            if (oriented_set.find(fn) == oriented_set.end())\n            {\n              if(oriented_set.find(c2t3.opposite_facet(fn)) == oriented_set.end())\n              {\n                oriented_set.insert(fn);\n                stack.push(fn);\n              }else {\n                success = false; // non-orientable\n              }\n            }\n          }else if(face_status != C2t3::BOUNDARY)\n          {\n            success = false; // non manifold, thus non-orientable\n          }\n        } // end \"for each neighbor of f\"\n      } // end \"stack non empty\"\n    } // end \"oriented_set not full\"\n\n    F.resize(m,3);\n    int f = 0;\n    for(typename std::set<Facet>::const_iterator fit = \n        oriented_set.begin();\n        fit != oriented_set.end();\n        ++fit)\n    {\n      const typename Tr::Cell_handle cell = fit->first;\n      const int& index = fit->second;\n      const int index1 = v2i[cell->vertex(tr.vertex_triple_index(index, 0))];\n      const int index2 = v2i[cell->vertex(tr.vertex_triple_index(index, 1))];\n      const int index3 = v2i[cell->vertex(tr.vertex_triple_index(index, 2))];\n      // This order is flipped\n      F(f,0) = index1;\n      F(f,1) = index2;\n      F(f,2) = index3;\n      f++;\n    }\n    assert(f == m);\n  } // end if(facets must be oriented)\n\n  // This CGAL code seems to randomly assign the global orientation\n  // Flip based on the signed volume.\n  Eigen::Vector3d cen;\n  double vol;\n  igl::centroid(V,F,cen,vol);\n  if(vol < 0)\n  {\n    // Flip\n    F = F.rowwise().reverse().eval();\n  }\n\n  // CGAL code somehow can end up with unreferenced vertices\n  VectorXi _1;\n  remove_unreferenced( MatrixXd(V), MatrixXi(F), V,F,_1);\n\n  return success;\n}\n\n#ifdef IGL_STATIC_LIBRARY\ntemplate bool igl::complex_to_mesh<CGAL::Delaunay_triangulation_3<CGAL::Robust_circumcenter_traits_3<CGAL::Epick>, CGAL::Triangulation_data_structure_3<CGAL::Surface_mesh_vertex_base_3<CGAL::Robust_circumcenter_traits_3<CGAL::Epick>, CGAL::Triangulation_vertex_base_3<CGAL::Robust_circumcenter_traits_3<CGAL::Epick>, CGAL::Triangulation_ds_vertex_base_3<void> > >, CGAL::Delaunay_triangulation_cell_base_with_circumcenter_3<CGAL::Robust_circumcenter_traits_3<CGAL::Epick>, CGAL::Surface_mesh_cell_base_3<CGAL::Robust_circumcenter_traits_3<CGAL::Epick>, CGAL::Triangulation_cell_base_3<CGAL::Robust_circumcenter_traits_3<CGAL::Epick>, CGAL::Triangulation_ds_cell_base_3<void> > > >, CGAL::Sequential_tag>, CGAL::Default, CGAL::Default>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(CGAL::Complex_2_in_triangulation_3<CGAL::Delaunay_triangulation_3<CGAL::Robust_circumcenter_traits_3<CGAL::Epick>, CGAL::Triangulation_data_structure_3<CGAL::Surface_mesh_vertex_base_3<CGAL::Robust_circumcenter_traits_3<CGAL::Epick>, CGAL::Triangulation_vertex_base_3<CGAL::Robust_circumcenter_traits_3<CGAL::Epick>, CGAL::Triangulation_ds_vertex_base_3<void> > >, CGAL::Delaunay_triangulation_cell_base_with_circumcenter_3<CGAL::Robust_circumcenter_traits_3<CGAL::Epick>, CGAL::Surface_mesh_cell_base_3<CGAL::Robust_circumcenter_traits_3<CGAL::Epick>, CGAL::Triangulation_cell_base_3<CGAL::Robust_circumcenter_traits_3<CGAL::Epick>, CGAL::Triangulation_ds_cell_base_3<void> > > >, CGAL::Sequential_tag>, CGAL::Default, CGAL::Default>, void> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/cgal/complex_to_mesh.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COMPLEX_TO_MESH_H\n#define IGL_COMPLEX_TO_MESH_H\n#include \"../igl_inline.h\"\n\n#include <Eigen/Dense>\n#include <CGAL/Complex_2_in_triangulation_3.h>\n\nnamespace igl \n{\n  // Templates:\n  //   Tr  CGAL triangulation type, e.g.\n  //     CGAL::Surface_mesh_default_triangulation_3\n  // Inputs\n  //   c2t3  2-complex (surface) living in a 3d triangulation (e.g. result of\n  //     CGAL::make_surface_mesh)\n  // Outputs:\n  //   V  #V by 3 list of vertex positions\n  //   F  #F by 3 list of triangle indices\n  // Returns true iff conversion was successful, failure can ok if CGAL code\n  // can't figure out ordering.\n  //\n  template <typename Tr, typename DerivedV, typename DerivedF>\n  IGL_INLINE bool complex_to_mesh(\n    const CGAL::Complex_2_in_triangulation_3<Tr> & c2t3,\n    Eigen::PlainObjectBase<DerivedV> & V, \n    Eigen::PlainObjectBase<DerivedF> & F);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"complex_to_mesh.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/cgal/intersect_other.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"intersect_other.h\"\n#include \"CGAL_includes.hpp\"\n#include \"mesh_to_cgal_triangle_list.h\"\n\n#ifndef IGL_FIRST_HIT_EXCEPTION\n#define IGL_FIRST_HIT_EXCEPTION 10\n#endif\n\nIGL_INLINE void igl::intersect_other(\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  const Eigen::MatrixXd & U,\n  const Eigen::MatrixXi & G,\n  const bool first_only,\n  Eigen::MatrixXi & IF)\n{\n  using namespace std;\n  using namespace Eigen;\n\n\n  typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;\n  // 3D Primitives\n  typedef CGAL::Point_3<Kernel>    Point_3;\n  typedef CGAL::Segment_3<Kernel>  Segment_3; \n  typedef CGAL::Triangle_3<Kernel> Triangle_3; \n  typedef CGAL::Plane_3<Kernel>    Plane_3;\n  typedef CGAL::Tetrahedron_3<Kernel> Tetrahedron_3; \n  // 2D Primitives\n  typedef CGAL::Point_2<Kernel>    Point_2;\n  typedef CGAL::Segment_2<Kernel>  Segment_2; \n  typedef CGAL::Triangle_2<Kernel> Triangle_2; \n  // 2D Constrained Delaunay Triangulation types\n  typedef CGAL::Triangulation_vertex_base_2<Kernel>  TVB_2;\n  typedef CGAL::Constrained_triangulation_face_base_2<Kernel> CTFB_2;\n  typedef CGAL::Triangulation_data_structure_2<TVB_2,CTFB_2> TDS_2;\n  typedef CGAL::Exact_intersections_tag Itag;\n  typedef CGAL::Constrained_Delaunay_triangulation_2<Kernel,TDS_2,Itag> \n    CDT_2;\n  typedef CGAL::Constrained_triangulation_plus_2<CDT_2> CDT_plus_2;\n  // Axis-align boxes for all-pairs self-intersection detection\n  typedef std::vector<Triangle_3> Triangles;\n  typedef typename Triangles::iterator TrianglesIterator;\n  typedef typename Triangles::const_iterator TrianglesConstIterator;\n  typedef \n    CGAL::Box_intersection_d::Box_with_handle_d<double,3,TrianglesIterator> \n    Box;\n\n  Triangles TF,TG;\n  // Compute and process self intersections\n  mesh_to_cgal_triangle_list(V,F,TF);\n  mesh_to_cgal_triangle_list(U,G,TG);\n  // http://www.cgal.org/Manual/latest/doc_html/cgal_manual/Box_intersection_d/Chapter_main.html#Section_63.5 \n  // Create the corresponding vector of bounding boxes\n  std::vector<Box> F_boxes,G_boxes;\n  const auto box_up = [](Triangles & T, std::vector<Box> & boxes)\n  {\n    boxes.reserve(T.size());\n    for ( \n      TrianglesIterator tit = T.begin(); \n      tit != T.end(); \n      ++tit)\n    {\n      boxes.push_back(Box(tit->bbox(), tit));\n    }\n  };\n  box_up(TF,F_boxes);\n  box_up(TG,G_boxes);\n  std::list<int> lIF;\n  const auto cb = [&](const Box &a, const Box &b)\n  {\n    using namespace std;\n    // index in F and T\n    int fa = a.handle()-TF.begin();\n    int fb = b.handle()-TG.begin();\n    const Triangle_3 & A = *a.handle();\n    const Triangle_3 & B = *b.handle();\n    if(CGAL::do_intersect(A,B))\n    {\n      // There was an intersection\n      lIF.push_back(fa);\n      lIF.push_back(fb);\n      if(first_only)\n      {\n        throw IGL_FIRST_HIT_EXCEPTION;\n      }\n    }\n  };\n  try{\n    CGAL::box_intersection_d(\n      F_boxes.begin(), F_boxes.end(),\n      G_boxes.begin(), G_boxes.end(),\n      cb);\n  }catch(int e)\n  {\n    // Rethrow if not FIRST_HIT_EXCEPTION\n    if(e != IGL_FIRST_HIT_EXCEPTION)\n    {\n      throw e;\n    }\n    // Otherwise just fall through\n  }\n\n  // Convert lIF to Eigen matrix\n  assert(lIF.size()%2 == 0);\n  IF.resize(lIF.size()/2,2);\n  {\n    int i=0;\n    for(\n      list<int>::const_iterator ifit = lIF.begin();\n      ifit!=lIF.end();\n      )\n    {\n      IF(i,0) = (*ifit);\n      ifit++; \n      IF(i,1) = (*ifit);\n      ifit++;\n      i++;\n    }\n  }\n\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template specialization\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/cgal/intersect_other.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_INTERSECT_OTHER_H\n#define IGL_INTERSECT_OTHER_H\n#include <igl/igl_inline.h>\n\n#include <Eigen/Dense>\n\n#ifdef MEX\n#  include <mex.h>\n#  include <cassert>\n#  undef assert\n#  define assert( isOK ) ( (isOK) ? (void)0 : (void) mexErrMsgTxt(C_STR(__FILE__<<\":\"<<__LINE__<<\": failed assertion `\"<<#isOK<<\"'\"<<std::endl) ) )\n#endif\n\nnamespace igl\n{\n  // INTERSECT Given a triangle mesh (V,F) and another mesh (U,G) find all pairs\n  // of intersecting faces. Note that self-intersections are ignored.\n  // \n  // [VV,FF,IF] = selfintersect(V,F,'ParameterName',ParameterValue, ...)\n  //\n  // Inputs:\n  //   V  #V by 3 list of vertex positions\n  //   F  #F by 3 list of triangle indices into V\n  //   U  #U by 3 list of vertex positions\n  //   G  #G by 3 list of triangle indices into U\n  //   first_only  whether to only detect the first intersection.\n  // Outputs:\n  //   IF  #intersecting face pairs by 2 list of intersecting face pairs,\n  //     indexing F and G\n  //\n  // See also: selfintersect\n  IGL_INLINE void intersect_other(\n    const Eigen::MatrixXd & V,\n    const Eigen::MatrixXi & F,\n    const Eigen::MatrixXd & U,\n    const Eigen::MatrixXi & G,\n    const bool first_only,\n    Eigen::MatrixXi & IF);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"intersect_other.cpp\"\n#endif\n  \n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/cgal/mesh_to_cgal_triangle_list.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"mesh_to_cgal_triangle_list.h\"\n\n#include <cassert>\n\ntemplate <\n  typename DerivedV,\n  typename DerivedF,\n  typename Kernel>\nIGL_INLINE void igl::mesh_to_cgal_triangle_list(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  std::vector<CGAL::Triangle_3<Kernel> > & T)\n{\n  typedef CGAL::Point_3<Kernel>    Point_3;\n  typedef CGAL::Triangle_3<Kernel> Triangle_3; \n  // Must be 3D\n  assert(V.cols() == 3);\n  // Must be triangles\n  assert(F.cols() == 3);\n  T.reserve(F.rows());\n  // Loop over faces\n  for(int f = 0;f<(int)F.rows();f++)\n  {\n    T.push_back(\n      Triangle_3(\n        Point_3( V(F(f,0),0), V(F(f,0),1), V(F(f,0),2)),\n        Point_3( V(F(f,1),0), V(F(f,1),1), V(F(f,1),2)),\n        Point_3( V(F(f,2),0), V(F(f,2),1), V(F(f,2),2))));\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template specialization\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/cgal/mesh_to_cgal_triangle_list.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_MESH_TO_CGAL_TRIANGLE_LIST_H\n#define IGL_MESH_TO_CGAL_TRIANGLE_LIST_H\n#include <igl/igl_inline.h>\n#include <Eigen/Core>\n#include \"CGAL_includes.hpp\"\nnamespace igl\n{\n  // Convert a mesh (V,F) to a list of CGAL triangles\n  //\n  // Templates:\n  //   Kernal  CGAL computation and construction kernel (e.g.\n  //     CGAL::Exact_predicates_exact_constructions_kernel)\n  // Inputs:\n  //   V  #V by 3 list of vertex positions\n  //   F  #F by 3 list of triangle indices\n  // Outputs:\n  //   T  #F list of CGAL triangles\n  template <\n    typename DerivedV,\n    typename DerivedF,\n    typename Kernel>\n  IGL_INLINE void mesh_to_cgal_triangle_list(\n    const Eigen::PlainObjectBase<DerivedV> & V,\n    const Eigen::PlainObjectBase<DerivedF> & F,\n    std::vector<CGAL::Triangle_3<Kernel> > & T);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"mesh_to_cgal_triangle_list.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/cgal/mesh_to_polyhedron.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"mesh_to_polyhedron.h\"\n#include <CGAL/Polyhedron_3.h>\n#include <CGAL/Polyhedron_incremental_builder_3.h>\n\n\ntemplate <typename Polyhedron>\nIGL_INLINE bool igl::mesh_to_polyhedron(\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  Polyhedron & poly)\n{\n  typedef typename Polyhedron::HalfedgeDS HalfedgeDS;\n  // Postcondition: hds is a valid polyhedral surface.\n  CGAL::Polyhedron_incremental_builder_3<HalfedgeDS> B(poly.hds());\n  B.begin_surface(V.rows(),F.rows());\n  typedef typename HalfedgeDS::Vertex   Vertex;\n  typedef typename Vertex::Point Point;\n  assert(V.cols() == 3 && \"V must be #V by 3\");\n  for(int v = 0;v<V.rows();v++)\n  {\n    B.add_vertex(Point(V(v,0),V(v,1),V(v,2)));\n  }\n  assert(F.cols() == 3 && \"F must be #F by 3\");\n  for(int f=0;f<F.rows();f++)\n  {\n    B.begin_facet();\n    for(int c = 0;c<3;c++)\n    {\n      B.add_vertex_to_facet(F(f,c));\n    }\n    B.end_facet();\n  }\n  if(B.error())\n  {\n    B.rollback();\n    return false;\n  }\n  B.end_surface();\n  return poly.is_valid();\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instanciation\n#include <CGAL/Simple_cartesian.h>\n#include <CGAL/Polyhedron_items_with_id_3.h>\ntemplate bool igl::mesh_to_polyhedron<CGAL::Polyhedron_3<CGAL::Simple_cartesian<double>, CGAL::Polyhedron_items_with_id_3, CGAL::HalfedgeDS_default, std::allocator<int> > >(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, CGAL::Polyhedron_3<CGAL::Simple_cartesian<double>, CGAL::Polyhedron_items_with_id_3, CGAL::HalfedgeDS_default, std::allocator<int> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/cgal/mesh_to_polyhedron.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_MESH_TO_POLYHEDRON_H\n#define IGL_MESH_TO_POLYHEDRON_H\n#include <igl/igl_inline.h>\n#include <Eigen/Core>\n\nnamespace igl\n{\n  // Convert a mesh (V,F) to a CGAL Polyhedron\n  //\n  // Templates:\n  //   Polyhedron  CGAL Polyhedron type (e.g. Polyhedron_3)\n  // Inputs:\n  //   V  #V by 3 list of vertex positions\n  //   F  #F by 3 list of triangle indices\n  // Outputs:\n  //   poly  cgal polyhedron\n  // Returns true only if (V,F) can be converted to a valid polyhedron (i.e. if\n  // (V,F) is vertex and edge manifold).\n  template <typename Polyhedron>\n  IGL_INLINE bool mesh_to_polyhedron(\n    const Eigen::MatrixXd & V,\n    const Eigen::MatrixXi & F,\n    Polyhedron & poly);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"mesh_to_polyhedron.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/cgal/order_facets_around_edges.cpp",
    "content": "#include \"order_facets_around_edges.h\"\n#include \"../sort_angles.h\"\n#include <type_traits>\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\n\ntemplate<\n    typename DerivedV,\n    typename DerivedF,\n    typename DerivedN,\n    typename DerivedE,\n    typename DeriveduE,\n    typename DerivedEMAP,\n    typename uE2EType,\n    typename uE2oEType,\n    typename uE2CType >\nIGL_INLINE\ntypename std::enable_if<!std::is_same<typename DerivedV::Scalar,\ntypename CGAL::Exact_predicates_exact_constructions_kernel::FT>::value, void>::type\nigl::order_facets_around_edges(\n        const Eigen::PlainObjectBase<DerivedV>& V,\n        const Eigen::PlainObjectBase<DerivedF>& F,\n        const Eigen::PlainObjectBase<DerivedN>& N,\n        const Eigen::PlainObjectBase<DerivedE>& E,\n        const Eigen::PlainObjectBase<DeriveduE>& uE,\n        const Eigen::PlainObjectBase<DerivedEMAP>& EMAP,\n        const std::vector<std::vector<uE2EType> >& uE2E,\n        std::vector<std::vector<uE2oEType> >& uE2oE,\n        std::vector<std::vector<uE2CType > >& uE2C ) {\n\n    typedef Eigen::Matrix<typename DerivedN::Scalar, 3, 1> Vector3F;\n    const typename DerivedV::Scalar EPS = 1e-12;\n    const size_t num_faces = F.rows();\n    const size_t num_undirected_edges = uE.rows();\n\n    auto edge_index_to_face_index = [&](size_t ei) { return ei % num_faces; };\n    auto edge_index_to_corner_index = [&](size_t ei) { return ei / num_faces; };\n\n    uE2oE.resize(num_undirected_edges);\n    uE2C.resize(num_undirected_edges);\n\n    for(size_t ui = 0;ui<num_undirected_edges;ui++)\n    {\n        const auto& adj_edges = uE2E[ui];\n        const size_t edge_valance = adj_edges.size();\n        assert(edge_valance > 0);\n\n        const auto ref_edge = adj_edges[0];\n        const auto ref_face = edge_index_to_face_index(ref_edge);\n        Vector3F ref_normal = N.row(ref_face);\n\n        const auto ref_corner_o = edge_index_to_corner_index(ref_edge);\n        const auto ref_corner_s = (ref_corner_o+1)%3;\n        const auto ref_corner_d = (ref_corner_o+2)%3;\n\n        const typename DerivedF::Scalar o = F(ref_face, ref_corner_o);\n        const typename DerivedF::Scalar s = F(ref_face, ref_corner_s);\n        const typename DerivedF::Scalar d = F(ref_face, ref_corner_d);\n\n        Vector3F edge = V.row(d) - V.row(s);\n        auto edge_len = edge.norm();\n        bool degenerated = edge_len < EPS;\n        if (degenerated) {\n            if (edge_valance <= 2) {\n                // There is only one way to order 2 or less faces.\n                edge.setZero();\n            } else {\n                edge.setZero();\n                Eigen::Matrix<typename DerivedN::Scalar, Eigen::Dynamic, 3>\n                    normals(edge_valance, 3);\n                for (size_t fei=0; fei<edge_valance; fei++) {\n                    const auto fe = adj_edges[fei];\n                    const auto f = edge_index_to_face_index(fe);\n                    normals.row(fei) = N.row(f);\n                }\n                for (size_t i=0; i<edge_valance; i++) {\n                    size_t j = (i+1) % edge_valance;\n                    Vector3F ni = normals.row(i);\n                    Vector3F nj = normals.row(j);\n                    edge = ni.cross(nj);\n                    edge_len = edge.norm();\n                    if (edge_len >= EPS) {\n                        edge.normalize();\n                        break;\n                    }\n                }\n\n                // Ensure edge direction are consistent with reference face.\n                Vector3F in_face_vec = V.row(o) - V.row(s);\n                if (edge.cross(in_face_vec).dot(ref_normal) < 0) {\n                    edge *= -1;\n                }\n\n                if (edge.norm() < EPS) {\n                    std::cerr << \"=====================================\" << std::endl;\n                    std::cerr << \"  ui: \" << ui << std::endl;\n                    std::cerr << \"edge: \" << ref_edge << std::endl;\n                    std::cerr << \"face: \" << ref_face << std::endl;\n                    std::cerr << \"  vs: \" << V.row(s) << std::endl;\n                    std::cerr << \"  vd: \" << V.row(d) << std::endl;\n                    std::cerr << \"adj face normals: \" << std::endl;\n                    std::cerr << normals << std::endl;\n                    std::cerr << \"Very degenerated case detected:\" << std::endl;\n                    std::cerr << \"Near zero edge surrounded by \"\n                        << edge_valance << \" neearly colinear faces\" <<\n                        std::endl;\n                    std::cerr << \"=====================================\" << std::endl;\n                }\n            }\n        } else {\n            edge.normalize();\n        }\n\n        Eigen::MatrixXd angle_data(edge_valance, 3);\n        std::vector<bool> cons(edge_valance);\n\n        for (size_t fei=0; fei<edge_valance; fei++) {\n            const auto fe = adj_edges[fei];\n            const auto f = edge_index_to_face_index(fe);\n            const auto c = edge_index_to_corner_index(fe);\n            cons[fei] = (d == F(f, (c+1)%3));\n            assert( cons[fei] ||  (d == F(f,(c+2)%3)));\n            assert(!cons[fei] || (s == F(f,(c+2)%3)));\n            assert(!cons[fei] || (d == F(f,(c+1)%3)));\n            Vector3F n = N.row(f);\n            angle_data(fei, 0) = ref_normal.cross(n).dot(edge);\n            angle_data(fei, 1) = ref_normal.dot(n);\n            if (cons[fei]) {\n                angle_data(fei, 0) *= -1;\n                angle_data(fei, 1) *= -1;\n            }\n            angle_data(fei, 0) *= -1; // Sort clockwise.\n            angle_data(fei, 2) = (cons[fei]?1.:-1.)*(f+1);\n        }\n\n        Eigen::VectorXi order;\n        igl::sort_angles(angle_data, order);\n\n        auto& ordered_edges = uE2oE[ui];\n        auto& consistency = uE2C[ui];\n\n        ordered_edges.resize(edge_valance);\n        consistency.resize(edge_valance);\n        for (size_t fei=0; fei<edge_valance; fei++) {\n            ordered_edges[fei] = adj_edges[order[fei]];\n            consistency[fei] = cons[order[fei]];\n        }\n    }\n}\n\ntemplate<\n    typename DerivedV,\n    typename DerivedF,\n    typename DerivedN,\n    typename DerivedE,\n    typename DeriveduE,\n    typename DerivedEMAP,\n    typename uE2EType,\n    typename uE2oEType,\n    typename uE2CType >\nIGL_INLINE \ntypename std::enable_if<std::is_same<typename DerivedV::Scalar,\ntypename CGAL::Exact_predicates_exact_constructions_kernel::FT>::value, void>::type\nigl::order_facets_around_edges(\n        const Eigen::PlainObjectBase<DerivedV>& V,\n        const Eigen::PlainObjectBase<DerivedF>& F,\n        const Eigen::PlainObjectBase<DerivedN>& N,\n        const Eigen::PlainObjectBase<DerivedE>& E,\n        const Eigen::PlainObjectBase<DeriveduE>& uE,\n        const Eigen::PlainObjectBase<DerivedEMAP>& EMAP,\n        const std::vector<std::vector<uE2EType> >& uE2E,\n        std::vector<std::vector<uE2oEType> >& uE2oE,\n        std::vector<std::vector<uE2CType > >& uE2C ) {\n\n    typedef Eigen::Matrix<typename DerivedN::Scalar, 3, 1> Vector3F;\n    typedef Eigen::Matrix<typename DerivedV::Scalar, 3, 1> Vector3E;\n    const typename DerivedV::Scalar EPS = 1e-12;\n    const size_t num_faces = F.rows();\n    const size_t num_undirected_edges = uE.rows();\n\n    auto edge_index_to_face_index = [&](size_t ei) { return ei % num_faces; };\n    auto edge_index_to_corner_index = [&](size_t ei) { return ei / num_faces; };\n\n    uE2oE.resize(num_undirected_edges);\n    uE2C.resize(num_undirected_edges);\n\n    for(size_t ui = 0;ui<num_undirected_edges;ui++)\n    {\n        const auto& adj_edges = uE2E[ui];\n        const size_t edge_valance = adj_edges.size();\n        assert(edge_valance > 0);\n\n        const auto ref_edge = adj_edges[0];\n        const auto ref_face = edge_index_to_face_index(ref_edge);\n        Vector3F ref_normal = N.row(ref_face);\n\n        const auto ref_corner_o = edge_index_to_corner_index(ref_edge);\n        const auto ref_corner_s = (ref_corner_o+1)%3;\n        const auto ref_corner_d = (ref_corner_o+2)%3;\n\n        const typename DerivedF::Scalar o = F(ref_face, ref_corner_o);\n        const typename DerivedF::Scalar s = F(ref_face, ref_corner_s);\n        const typename DerivedF::Scalar d = F(ref_face, ref_corner_d);\n\n        Vector3E exact_edge = V.row(d) - V.row(s);\n        exact_edge.array() /= exact_edge.squaredNorm();\n        Vector3F edge(\n                CGAL::to_double(exact_edge[0]),\n                CGAL::to_double(exact_edge[1]),\n                CGAL::to_double(exact_edge[2]));\n        edge.normalize();\n\n        Eigen::MatrixXd angle_data(edge_valance, 3);\n        std::vector<bool> cons(edge_valance);\n\n        for (size_t fei=0; fei<edge_valance; fei++) {\n            const auto fe = adj_edges[fei];\n            const auto f = edge_index_to_face_index(fe);\n            const auto c = edge_index_to_corner_index(fe);\n            cons[fei] = (d == F(f, (c+1)%3));\n            assert( cons[fei] ||  (d == F(f,(c+2)%3)));\n            assert(!cons[fei] || (s == F(f,(c+2)%3)));\n            assert(!cons[fei] || (d == F(f,(c+1)%3)));\n            Vector3F n = N.row(f);\n            angle_data(fei, 0) = ref_normal.cross(n).dot(edge);\n            angle_data(fei, 1) = ref_normal.dot(n);\n            if (cons[fei]) {\n                angle_data(fei, 0) *= -1;\n                angle_data(fei, 1) *= -1;\n            }\n            angle_data(fei, 0) *= -1; // Sort clockwise.\n            angle_data(fei, 2) = (cons[fei]?1.:-1.)*(f+1);\n        }\n\n        Eigen::VectorXi order;\n        igl::sort_angles(angle_data, order);\n\n        auto& ordered_edges = uE2oE[ui];\n        auto& consistency = uE2C[ui];\n\n        ordered_edges.resize(edge_valance);\n        consistency.resize(edge_valance);\n        for (size_t fei=0; fei<edge_valance; fei++) {\n            ordered_edges[fei] = adj_edges[order[fei]];\n            consistency[fei] = cons[order[fei]];\n        }\n    }\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/cgal/order_facets_around_edges.h",
    "content": "#ifndef ORDER_FACETS_AROUND_EDGES\n#define ORDER_FACETS_AROUND_EDGES\n\n#include \"../igl_inline.h\"\n#include <Eigen/Core>\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\n\nnamespace igl {\n    // For each undirected edge, sort its adjacent faces.\n    //\n    // Inputs:\n    //   V    #V by 3 list of vertices.\n    //   F    #F by 3 list of faces\n    //   N    #F by 3 list of face normals.\n    //   E    #F*3 by 2 list vertex indices, represents directed edges.\n    //  uE    #uE by 2 list of vertex_indices, represents undirected edges.\n    //  EMAP  #F*3 list of indices that maps E to uE. (a many-to-one map)\n    //  uE2E  #uE list of lists that maps uE to E. (a one-to-many map)\n    //\n    // Outputs:\n    //   uE2oE #uE list of lists that maps uE to an ordered list of E. (a\n    //         one-to-many map)\n    //   uE2C  #uE list of lists of bools indicates whether each face in\n    //         uE2oE[i] is consistently orientated as the ordering.\n    //\n    template<\n        typename DerivedV,\n        typename DerivedF,\n        typename DerivedN,\n        typename DerivedE,\n        typename DeriveduE,\n        typename DerivedEMAP,\n        typename uE2EType,\n        typename uE2oEType,\n        typename uE2CType >\n    IGL_INLINE\n    typename std::enable_if<!std::is_same<typename DerivedV::Scalar,\n    typename CGAL::Exact_predicates_exact_constructions_kernel::FT>::value, void>::type\n    order_facets_around_edges(\n            const Eigen::PlainObjectBase<DerivedV>& V,\n            const Eigen::PlainObjectBase<DerivedF>& F,\n            const Eigen::PlainObjectBase<DerivedN>& N,\n            const Eigen::PlainObjectBase<DerivedE>& E,\n            const Eigen::PlainObjectBase<DeriveduE>& uE,\n            const Eigen::PlainObjectBase<DerivedEMAP>& EMAP,\n            const std::vector<std::vector<uE2EType> >& uE2E,\n            std::vector<std::vector<uE2oEType> >& uE2oE,\n            std::vector<std::vector<uE2CType > >& uE2C );\n\n    template<\n        typename DerivedV,\n        typename DerivedF,\n        typename DerivedN,\n        typename DerivedE,\n        typename DeriveduE,\n        typename DerivedEMAP,\n        typename uE2EType,\n        typename uE2oEType,\n        typename uE2CType >\n    IGL_INLINE \n    typename std::enable_if<std::is_same<typename DerivedV::Scalar,\n    typename CGAL::Exact_predicates_exact_constructions_kernel::FT>::value, void>::type\n    order_facets_around_edges(\n            const Eigen::PlainObjectBase<DerivedV>& V,\n            const Eigen::PlainObjectBase<DerivedF>& F,\n            const Eigen::PlainObjectBase<DerivedN>& N,\n            const Eigen::PlainObjectBase<DerivedE>& E,\n            const Eigen::PlainObjectBase<DeriveduE>& uE,\n            const Eigen::PlainObjectBase<DerivedEMAP>& EMAP,\n            const std::vector<std::vector<uE2EType> >& uE2E,\n            std::vector<std::vector<uE2oEType> >& uE2oE,\n            std::vector<std::vector<uE2CType > >& uE2C );\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#include \"order_facets_around_edges.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/cgal/outer_hull.cpp",
    "content": "#include \"outer_hull.h\"\n#include \"order_facets_around_edges.h\"\n#include \"../outer_facet.h\"\n#include \"../sortrows.h\"\n#include \"../facet_components.h\"\n#include \"../winding_number.h\"\n#include \"../triangle_triangle_adjacency.h\"\n#include \"../unique_edge_map.h\"\n#include \"../barycenter.h\"\n#include \"../per_face_normals.h\"\n#include \"../writePLY.h\"\n#include \"../sort_angles.h\"\n\n#include <Eigen/Geometry>\n#include <vector>\n#include <map>\n#include <queue>\n#include <iostream>\n#include <CGAL/number_utils.h>\n//#define IGL_OUTER_HULL_DEBUG\n\ntemplate <\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedN,\n  typename DerivedG,\n  typename DerivedJ,\n  typename Derivedflip>\nIGL_INLINE void igl::outer_hull(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  const Eigen::PlainObjectBase<DerivedN> & N,\n  Eigen::PlainObjectBase<DerivedG> & G,\n  Eigen::PlainObjectBase<DerivedJ> & J,\n  Eigen::PlainObjectBase<Derivedflip> & flip)\n{\n#ifdef IGL_OUTER_HULL_DEBUG\n  std::cerr << \"Extracting outer hull\" << std::endl;\n#endif\n  using namespace Eigen;\n  using namespace std;\n  typedef typename DerivedF::Index Index;\n  Matrix<Index,DerivedF::RowsAtCompileTime,1> C;\n  typedef Matrix<typename DerivedV::Scalar,Dynamic,DerivedV::ColsAtCompileTime> MatrixXV;\n  typedef Matrix<typename DerivedF::Scalar,Dynamic,DerivedF::ColsAtCompileTime> MatrixXF;\n  typedef Matrix<typename DerivedG::Scalar,Dynamic,DerivedG::ColsAtCompileTime> MatrixXG;\n  typedef Matrix<typename DerivedJ::Scalar,Dynamic,DerivedJ::ColsAtCompileTime> MatrixXJ;\n  typedef Matrix<typename DerivedN::Scalar,1,3> RowVector3N;\n  const Index m = F.rows();\n\n  // UNUSED:\n  //const auto & duplicate_simplex = [&F](const int f, const int g)->bool\n  //{\n  //  return\n  //    (F(f,0) == F(g,0) && F(f,1) == F(g,1) && F(f,2) == F(g,2)) ||\n  //    (F(f,1) == F(g,0) && F(f,2) == F(g,1) && F(f,0) == F(g,2)) ||\n  //    (F(f,2) == F(g,0) && F(f,0) == F(g,1) && F(f,1) == F(g,2)) ||\n  //    (F(f,0) == F(g,2) && F(f,1) == F(g,1) && F(f,2) == F(g,0)) ||\n  //    (F(f,1) == F(g,2) && F(f,2) == F(g,1) && F(f,0) == F(g,0)) ||\n  //    (F(f,2) == F(g,2) && F(f,0) == F(g,1) && F(f,1) == F(g,0));\n  //};\n\n#ifdef IGL_OUTER_HULL_DEBUG\n  cout<<\"outer hull...\"<<endl;\n#endif\n\n#ifdef IGL_OUTER_HULL_DEBUG\n  cout<<\"edge map...\"<<endl;\n#endif\n  typedef Matrix<typename DerivedF::Scalar,Dynamic,2> MatrixX2I;\n  typedef Matrix<typename DerivedF::Index,Dynamic,1> VectorXI;\n  typedef Matrix<typename DerivedV::Scalar, 3, 1> Vector3F;\n  MatrixX2I E,uE;\n  VectorXI EMAP;\n  vector<vector<typename DerivedF::Index> > uE2E;\n  unique_edge_map(F,E,uE,EMAP,uE2E);\n#ifdef IGL_OUTER_HULL_DEBUG\n  for (size_t ui=0; ui<uE.rows(); ui++) {\n      std::cout << ui << \": \" << uE2E[ui].size() << \" -- (\";\n      for (size_t i=0; i<uE2E[ui].size(); i++) {\n          std::cout << uE2E[ui][i] << \", \";\n      }\n      std::cout << \")\" << std::endl;\n  }\n#endif\n\n  std::vector<std::vector<typename DerivedF::Index> > uE2oE;\n  std::vector<std::vector<bool> > uE2C;\n  order_facets_around_edges(V, F, N, E, uE, EMAP, uE2E, uE2oE, uE2C);\n  uE2E = uE2oE;\n  VectorXI diIM(3*m);\n  for (auto ue : uE2E) {\n      for (size_t i=0; i<ue.size(); i++) {\n          auto fe = ue[i];\n          diIM[fe] = i;\n      }\n  }\n\n  vector<vector<vector<Index > > > TT,_1;\n  triangle_triangle_adjacency(E,EMAP,uE2E,false,TT,_1);\n  VectorXI counts;\n#ifdef IGL_OUTER_HULL_DEBUG\n  cout<<\"facet components...\"<<endl;\n#endif\n  facet_components(TT,C,counts);\n  assert(C.maxCoeff()+1 == counts.rows());\n  const size_t ncc = counts.rows();\n  G.resize(0,F.cols());\n  J.resize(0,1);\n  flip.setConstant(m,1,false);\n\n#ifdef IGL_OUTER_HULL_DEBUG\n  cout<<\"reindex...\"<<endl;\n#endif\n  // H contains list of faces on outer hull;\n  vector<bool> FH(m,false);\n  vector<bool> EH(3*m,false);\n  vector<MatrixXG> vG(ncc);\n  vector<MatrixXJ> vJ(ncc);\n  vector<MatrixXJ> vIM(ncc);\n  //size_t face_count = 0;\n  for(size_t id = 0;id<ncc;id++)\n  {\n    vIM[id].resize(counts[id],1);\n  }\n  // current index into each IM\n  vector<size_t> g(ncc,0);\n  // place order of each face in its respective component\n  for(Index f = 0;f<m;f++)\n  {\n    vIM[C(f)](g[C(f)]++) = f;\n  }\n\n#ifdef IGL_OUTER_HULL_DEBUG\n  cout<<\"barycenters...\"<<endl;\n#endif\n  // assumes that \"resolve\" has handled any coplanar cases correctly and nearly\n  // coplanar cases can be sorted based on barycenter.\n  MatrixXV BC;\n  barycenter(V,F,BC);\n\n#ifdef IGL_OUTER_HULL_DEBUG\n  cout<<\"loop over CCs (=\"<<ncc<<\")...\"<<endl;\n#endif\n  for(Index id = 0;id<(Index)ncc;id++)\n  {\n    auto & IM = vIM[id];\n    // starting face that's guaranteed to be on the outer hull and in this\n    // component\n    int f;\n    bool f_flip;\n#ifdef IGL_OUTER_HULL_DEBUG\n  cout<<\"outer facet...\"<<endl;\n#endif\n    outer_facet(V,F,N,IM,f,f_flip);\n#ifdef IGL_OUTER_HULL_DEBUG\n  cout<<\"outer facet: \"<<f<<endl;\n  cout << V.row(F(f, 0)) << std::endl;\n  cout << V.row(F(f, 1)) << std::endl;\n  cout << V.row(F(f, 2)) << std::endl;\n#endif\n    int FHcount = 1;\n    FH[f] = true;\n    // Q contains list of face edges to continue traversing upong\n    queue<int> Q;\n    Q.push(f+0*m);\n    Q.push(f+1*m);\n    Q.push(f+2*m);\n    flip(f) = f_flip;\n    //std::cout << \"face \" << face_count++ << \": \" << f << std::endl;\n    //std::cout << \"f \" << F.row(f).array()+1 << std::endl;\n    //cout<<\"flip(\"<<f<<\") = \"<<(flip(f)?\"true\":\"false\")<<endl;\n#ifdef IGL_OUTER_HULL_DEBUG\n  cout<<\"BFS...\"<<endl;\n#endif\n    while(!Q.empty())\n    {\n      // face-edge\n      const int e = Q.front();\n      Q.pop();\n      // face\n      const int f = e%m;\n      // corner\n      const int c = e/m;\n#ifdef IGL_OUTER_HULL_DEBUG\n      std::cout << \"edge: \" << e << \", ue: \" << EMAP(e) << std::endl;\n      std::cout << \"face: \" << f << std::endl;\n      std::cout << \"corner: \" << c << std::endl;\n      std::cout << \"consistent: \" << uE2C[EMAP(e)][diIM[e]] << std::endl;\n#endif\n      // Should never see edge again...\n      if(EH[e] == true)\n      {\n        continue;\n      }\n      EH[e] = true;\n      // source of edge according to f\n      const int fs = flip(f)?F(f,(c+2)%3):F(f,(c+1)%3);\n      // destination of edge according to f\n      const int fd = flip(f)?F(f,(c+1)%3):F(f,(c+2)%3);\n      // edge valence\n      const size_t val = uE2E[EMAP(e)].size();\n#ifdef IGL_OUTER_HULL_DEBUG\n      std::cout << \"vd: \" << V.row(fd) << std::endl;\n      std::cout << \"vs: \" << V.row(fs) << std::endl;\n      std::cout << \"edge: \" << V.row(fd) - V.row(fs) << std::endl;\n      for (size_t i=0; i<val; i++) {\n          if (i == diIM(e)) {\n              std::cout << \"* \";\n          } else {\n              std::cout << \"  \";\n          }\n          std::cout << i << \": \"\n              << \" (e: \" << uE2E[EMAP(e)][i] << \", f: \"\n              << uE2E[EMAP(e)][i] % m * (uE2C[EMAP(e)][i] ? 1:-1) << \")\" << std::endl;\n      }\n#endif\n      //// find overlapping face-edges\n      //const auto & neighbors = uE2E[EMAP(e)];\n      //// normal after possible flipping\n      //const auto & fN = (flip(f)?-1.:1.)*N.row(f);\n      //// Edge vector according to f's (flipped) orientation.\n      ////const auto & eV = (V.row(fd)-V.row(fs)).normalized();\n\n//#warning \"EXPERIMENTAL, DO NOT USE\"\n      //// THIS IS WRONG! The first face is---after sorting---no longer the face\n      //// used for orienting the sort.\n      //const auto ui = EMAP(e);\n      //const auto fe0 = uE2E[ui][0];\n      //const auto es = F(fe0%m,((fe0/m)+1)%3);\n\n      // is edge consistent with edge of face used for sorting\n      const int e_cons = (uE2C[EMAP(e)][diIM(e)] ? 1: -1);\n      int nfei = -1;\n      // Loop once around trying to find suitable next face\n      for(size_t step = 1; step<val+2;step++)\n      {\n        const int nfei_new = (diIM(e) + 2*val + e_cons*step*(flip(f)?-1:1))%val;\n        const int nf = uE2E[EMAP(e)][nfei_new] % m;\n        // Don't consider faces with identical dihedral angles\n        //if ((di[EMAP(e)][diIM(e)].array() != di[EMAP(e)][nfei_new].array()).any())\n        //if((di[EMAP(e)][diIM(e)] != di[EMAP(e)][nfei_new]))\n//#warning \"THIS IS HACK, FIX ME\"\n//        if( abs(di[EMAP(e)][diIM(e)] - di[EMAP(e)][nfei_new]) < 1e-15 )\n        {\n#ifdef IGL_OUTER_HULL_DEBUG\n        //cout<<\"Next facet: \"<<(f+1)<<\" --> \"<<(nf+1)<<\", |\"<<\n        //  di[EMAP(e)][diIM(e)]<<\" - \"<<di[EMAP(e)][nfei_new]<<\"| = \"<<\n        //    abs(di[EMAP(e)][diIM(e)] - di[EMAP(e)][nfei_new])\n        //    <<endl;\n#endif\n\n\n\n          // Only use this face if not already seen\n          if(!FH[nf])\n          {\n            nfei = nfei_new;\n          //} else {\n          //    std::cout << \"skipping face \" << nfei_new << \" because it is seen before\"\n          //        << std::endl;\n          }\n          break;\n        //} else {\n        //    std::cout << di[EMAP(e)][diIM(e)].transpose() << std::endl;\n        //    std::cout << di[EMAP(e)][diIM(nfei_new)].transpose() << std::endl;\n        //    std::cout << \"skipping face \" << nfei_new << \" with identical dihedral angle\"\n        //        << std::endl;\n        }\n//#ifdef IGL_OUTER_HULL_DEBUG\n//        cout<<\"Skipping co-planar facet: \"<<(f+1)<<\" --> \"<<(nf+1)<<endl;\n//#endif\n      }\n\n      int max_ne = -1;\n      //// Loop over and find max dihedral angle\n      //typename DerivedV::Scalar max_di = -1;\n      //for(const auto & ne : neighbors)\n      //{\n      //  const int nf = ne%m;\n      //  if(nf == f)\n      //  {\n      //    continue;\n      //  }\n      //  // Corner of neighbor\n      //  const int nc = ne/m;\n      //  // Is neighbor oriented consistently with (flipped) f?\n      //  //const int ns = F(nf,(nc+1)%3);\n      //  const int nd = F(nf,(nc+2)%3);\n      //  const bool cons = (flip(f)?fd:fs) == nd;\n      //  // Normal after possibly flipping to match flip or orientation of f\n      //  const auto & nN = (cons? (flip(f)?-1:1.) : (flip(f)?1.:-1.) )*N.row(nf);\n      //  // Angle between n and f\n      //  const auto & ndi = M_PI - atan2( fN.cross(nN).dot(eV), fN.dot(nN));\n      //  if(ndi>=max_di)\n      //  {\n      //    max_ne = ne;\n      //    max_di = ndi;\n      //  }\n      //}\n\n      ////cout<<(max_ne != max_ne_2)<<\" =?= \"<<e_cons<<endl;\n      //if(max_ne != max_ne_2)\n      //{\n      //  cout<<(f+1)<<\" ---> \"<<(max_ne%m)+1<<\" != \"<<(max_ne_2%m)+1<<\" ... \"<<e_cons<<\" \"<<flip(f)<<endl;\n      //  typename DerivedV::Scalar max_di = -1;\n      //  for(size_t nei = 0;nei<neighbors.size();nei++)\n      //  {\n      //    const auto & ne = neighbors[nei];\n      //    const int nf = ne%m;\n      //    if(nf == f)\n      //    {\n      //      cout<<\"  \"<<(ne%m)+1<<\":\\t\"<<0<<\"\\t\"<<di[EMAP[e]][nei]<<\" \"<<diIM(ne)<<endl;\n      //      continue;\n      //    }\n      //    // Corner of neighbor\n      //    const int nc = ne/m;\n      //    // Is neighbor oriented consistently with (flipped) f?\n      //    //const int ns = F(nf,(nc+1)%3);\n      //    const int nd = F(nf,(nc+2)%3);\n      //    const bool cons = (flip(f)?fd:fs) == nd;\n      //    // Normal after possibly flipping to match flip or orientation of f\n      //    const auto & nN = (cons? (flip(f)?-1:1.) : (flip(f)?1.:-1.) )*N.row(nf);\n      //    // Angle between n and f\n      //    const auto & ndi = M_PI - atan2( fN.cross(nN).dot(eV), fN.dot(nN));\n      //    cout<<\"  \"<<(ne%m)+1<<\":\\t\"<<ndi<<\"\\t\"<<di[EMAP[e]][nei]<<\" \"<<diIM(ne)<<endl;\n      //    if(ndi>=max_di)\n      //    {\n      //      max_ne = ne;\n      //      max_di = ndi;\n      //    }\n      //  }\n      //}\n      if(nfei >= 0)\n      {\n        max_ne = uE2E[EMAP(e)][nfei];\n      }\n\n      if(max_ne>=0)\n      {\n        // face of neighbor\n        const int nf = max_ne%m;\n#ifdef IGL_OUTER_HULL_DEBUG\n        if(!FH[nf])\n        {\n          // first time seeing face\n          cout<<(f+1)<<\" --> \"<<(nf+1)<<endl;\n        }\n#endif\n        FH[nf] = true;\n        //std::cout << \"face \" << face_count++ << \": \" << nf << std::endl;\n        //std::cout << \"f \" << F.row(nf).array()+1 << std::endl;\n        FHcount++;\n        // corner of neighbor\n        const int nc = max_ne/m;\n        const int nd = F(nf,(nc+2)%3);\n        const bool cons = (flip(f)?fd:fs) == nd;\n        flip(nf) = (cons ? flip(f) : !flip(f));\n        //cout<<\"flip(\"<<nf<<\") = \"<<(flip(nf)?\"true\":\"false\")<<endl;\n        const int ne1 = nf+((nc+1)%3)*m;\n        const int ne2 = nf+((nc+2)%3)*m;\n        if(!EH[ne1])\n        {\n          Q.push(ne1);\n        }\n        if(!EH[ne2])\n        {\n          Q.push(ne2);\n        }\n      }\n    }\n\n    {\n      vG[id].resize(FHcount,3);\n      vJ[id].resize(FHcount,1);\n      //nG += FHcount;\n      size_t h = 0;\n      assert(counts(id) == IM.rows());\n      for(int i = 0;i<counts(id);i++)\n      {\n        const size_t f = IM(i);\n        //if(f_flip)\n        //{\n        //  flip(f) = !flip(f);\n        //}\n        if(FH[f])\n        {\n          vG[id].row(h) = (flip(f)?F.row(f).reverse().eval():F.row(f));\n          vJ[id](h,0) = f;\n          h++;\n        }\n      }\n      assert((int)h == FHcount);\n    }\n  }\n\n  // Is A inside B? Assuming A and B are consistently oriented but closed and\n  // non-intersecting.\n  const auto & is_component_inside_other = [](\n    const Eigen::MatrixXd & V,\n    const MatrixXV & BC,\n    const MatrixXG & A,\n    const MatrixXJ & AJ,\n    const MatrixXG & B)->bool\n  {\n    const auto & bounding_box = [](\n      const Eigen::MatrixXd & V,\n      const MatrixXG & F)->\n      Eigen::MatrixXd\n    {\n      Eigen::MatrixXd BB(2,3);\n      BB<<\n         1e26,1e26,1e26,\n        -1e26,-1e26,-1e26;\n      const size_t m = F.rows();\n      for(size_t f = 0;f<m;f++)\n      {\n        for(size_t c = 0;c<3;c++)\n        {\n          const auto & vfc = V.row(F(f,c));\n          BB.row(0) = BB.row(0).array().min(vfc.array()).eval();\n          BB.row(1) = BB.row(1).array().max(vfc.array()).eval();\n        }\n      }\n      return BB;\n    };\n    // A lot of the time we're dealing with unrelated, distant components: cull\n    // them.\n    Eigen::MatrixXd ABB = bounding_box(V,A);\n    Eigen::MatrixXd BBB = bounding_box(V,B);\n    if( (BBB.row(0)-ABB.row(1)).maxCoeff()>0  ||\n        (ABB.row(0)-BBB.row(1)).maxCoeff()>0 )\n    {\n      // bounding boxes do not overlap\n      return false;\n    }\n    ////////////////////////////////////////////////////////////////////////\n    // POTENTIAL ROBUSTNESS WEAK AREA\n    ////////////////////////////////////////////////////////////////////////\n    //\n\n    // winding_number_3 expects colmajor\n    // q could be so close (<~1e-15) to B that the winding number is not a robust way to\n    // determine inside/outsideness. We could try to find a _better_ q which is\n    // farther away, but couldn't they all be bad?\n    double q[3] = {\n        CGAL::to_double(BC(AJ(0), 0)),\n        CGAL::to_double(BC(AJ(0), 1)),\n        CGAL::to_double(BC(AJ(0), 2)) };\n    // In a perfect world, it's enough to test a single point.\n    double w;\n    winding_number_3(\n      V.data(),V.rows(),\n      B.data(),B.rows(),\n      q,1,&w);\n    return w > 0.5 || w < -0.5;\n  };\n\n  Eigen::MatrixXd Vcol(V.rows(), V.cols());\n  for (size_t i=0; i<(size_t)V.rows(); i++) {\n      for (size_t j=0; j<(size_t)V.cols(); j++) {\n          Vcol(i, j) = CGAL::to_double(V(i, j));\n      }\n  }\n\n  // Reject components which are completely inside other components\n  vector<bool> keep(ncc,true);\n  size_t nG = 0;\n  // This is O( ncc * ncc * m)\n  for(size_t id = 0;id<ncc;id++)\n  {\n    for(size_t oid = 0;oid<ncc;oid++)\n    {\n      if(id == oid)\n      {\n        continue;\n      }\n      const bool inside = is_component_inside_other(Vcol,BC,vG[id],vJ[id],vG[oid]);\n#ifdef IGL_OUTER_HULL_DEBUG\n      cout<<id<<\" is inside \"<<oid<<\" ? \"<<inside<<endl;\n#endif\n      keep[id] = keep[id] && !inside;\n    }\n    if(keep[id])\n    {\n      nG += vJ[id].rows();\n    }\n  }\n\n  // collect G and J across components\n  G.resize(nG,3);\n  J.resize(nG,1);\n  {\n    size_t off = 0;\n    for(Index id = 0;id<(Index)ncc;id++)\n    {\n      if(keep[id])\n      {\n        assert(vG[id].rows() == vJ[id].rows());\n        G.block(off,0,vG[id].rows(),vG[id].cols()) = vG[id];\n        J.block(off,0,vJ[id].rows(),vJ[id].cols()) = vJ[id];\n        off += vG[id].rows();\n      }\n    }\n  }\n}\n\ntemplate <\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedG,\n  typename DerivedJ,\n  typename Derivedflip>\nIGL_INLINE void igl::outer_hull(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  Eigen::PlainObjectBase<DerivedG> & G,\n  Eigen::PlainObjectBase<DerivedJ> & J,\n  Eigen::PlainObjectBase<Derivedflip> & flip)\n{\n  Eigen::Matrix<typename DerivedV::Scalar,DerivedF::RowsAtCompileTime,3> N;\n  per_face_normals_stable(V,F,N);\n  return outer_hull(V,F,N,G,J,flip);\n}\n\n\n#ifdef IGL_STATIC_LIBRARY\n\n#include <igl/barycenter.cpp>\ntemplate void igl::barycenter<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> >&);\n\n#include <igl/outer_facet.cpp>\ntemplate void igl::outer_facet<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, int>(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> > const&, int&, bool&);\n\n#include <igl/cgal/order_facets_around_edges.cpp>\ntemplate std::__1::enable_if<std::is_same<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>::Scalar, CGAL::Lazy_exact_nt<CGAL::Gmpq> >::value, void>::type igl::order_facets_around_edges<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, long, long, bool>(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> > const&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> > const&, std::__1::vector<std::__1::vector<long, std::__1::allocator<long> >, std::__1::allocator<std::__1::vector<long, std::__1::allocator<long> > > > const&, std::__1::vector<std::__1::vector<long, std::__1::allocator<long> >, std::__1::allocator<std::__1::vector<long, std::__1::allocator<long> > > >&, std::__1::vector<std::__1::vector<bool, std::__1::allocator<bool> >, std::__1::allocator<std::__1::vector<bool, std::__1::allocator<bool> > > >&);\n\n// Explicit template specialization\ntemplate void igl::outer_hull<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<bool, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<bool, -1, 1, 0, -1, 1> >&);\ntemplate void igl::outer_hull<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::outer_hull<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<bool, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<bool, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/cgal/outer_hull.h",
    "content": "#ifndef IGL_OUTER_HULL_H\n#define IGL_OUTER_HULL_H\n#include \"../igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Compute the \"outer hull\" of a potentially non-manifold mesh (V,F) whose\n  // intersections have been \"resolved\" (e.g. using `cork` or\n  // `igl::selfintersect`). The outer hull is defined to be all facets\n  // (regardless of orientation) for which there exists some path from infinity\n  // to the face without intersecting any other facets. For solids, this is the\n  // surface of the solid. In general this includes any thin \"wings\" or \"flaps\".\n  // This implementation largely follows Section 3.6 of \"Direct repair of\n  // self-intersecting meshes\" [Attene 2014].\n  //\n  // Inputs:\n  //   V  #V by 3 list of vertex positions\n  //   F  #F by 3 list of triangle indices into V\n  //   N  #F by 3 list of per-face normals\n  // Outputs:\n  //   G  #G by 3 list of output triangle indices into V\n  //   J  #G list of indices into F\n  //   flip  #F list of whether facet was added to G **and** flipped orientation\n  //     (false for faces not added to G)\n  template <\n    typename DerivedV,\n    typename DerivedF,\n    typename DerivedN,\n    typename DerivedG,\n    typename DerivedJ,\n    typename Derivedflip>\n  IGL_INLINE void outer_hull(\n    const Eigen::PlainObjectBase<DerivedV> & V,\n    const Eigen::PlainObjectBase<DerivedF> & F,\n    const Eigen::PlainObjectBase<DerivedN> & N,\n    Eigen::PlainObjectBase<DerivedG> & G,\n    Eigen::PlainObjectBase<DerivedJ> & J,\n    Eigen::PlainObjectBase<Derivedflip> & flip);\n  template <\n    typename DerivedV,\n    typename DerivedF,\n    typename DerivedG,\n    typename DerivedJ,\n    typename Derivedflip>\n  IGL_INLINE void outer_hull(\n    const Eigen::PlainObjectBase<DerivedV> & V,\n    const Eigen::PlainObjectBase<DerivedF> & F,\n    Eigen::PlainObjectBase<DerivedG> & G,\n    Eigen::PlainObjectBase<DerivedJ> & J,\n    Eigen::PlainObjectBase<Derivedflip> & flip);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"outer_hull.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/cgal/peel_outer_hull_layers.cpp",
    "content": "#include \"peel_outer_hull_layers.h\"\n#include \"../per_face_normals.h\"\n#include \"outer_hull.h\"\n#include <vector>\n#include <iostream>\n//#define IGL_PEEL_OUTER_HULL_LAYERS_DEBUG\n#ifdef IGL_PEEL_OUTER_HULL_LAYERS_DEBUG\n#include \"../writePLY.h\"\n#include \"../writeDMAT.h\"\n#include \"../STR.h\"\n#endif\n\nusing namespace std;\ntemplate <\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedN,\n  typename Derivedodd,\n  typename Derivedflip>\nIGL_INLINE size_t igl::peel_outer_hull_layers(\n  const Eigen::PlainObjectBase<DerivedV > & V,\n  const Eigen::PlainObjectBase<DerivedF > & F,\n  const Eigen::PlainObjectBase<DerivedN > & N,\n  Eigen::PlainObjectBase<Derivedodd > & odd,\n  Eigen::PlainObjectBase<Derivedflip > & flip)\n{\n  using namespace Eigen;\n  using namespace std;\n  typedef typename DerivedF::Index Index;\n  typedef Matrix<typename DerivedF::Scalar,Dynamic,DerivedF::ColsAtCompileTime> MatrixXF;\n  typedef Matrix<typename DerivedN::Scalar,Dynamic,DerivedN::ColsAtCompileTime> MatrixXN;\n  typedef Matrix<Index,Dynamic,1> MatrixXI;\n  typedef Matrix<typename Derivedflip::Scalar,Dynamic,Derivedflip::ColsAtCompileTime> MatrixXflip;\n  const Index m = F.rows();\n#ifdef IGL_PEEL_OUTER_HULL_LAYERS_DEBUG\n  cout<<\"peel outer hull layers...\"<<endl;\n#endif\n#ifdef IGL_PEEL_OUTER_HULL_LAYERS_DEBUG\n  cout<<\"calling outer hull...\"<<endl;\n  writePLY(STR(\"peel-outer-hull-input.ply\"),V,F);\n#endif\n\n#ifdef IGL_PEEL_OUTER_HULL_LAYERS_DEBUG\n  cout<<\"resize output ...\"<<endl;\n#endif\n  // keep track of iteration parity and whether flipped in hull\n  MatrixXF Fr = F;\n  MatrixXN Nr = N;\n  odd.resize(m,1);\n  flip.resize(m,1);\n  // Keep track of index map\n  MatrixXI IM = MatrixXI::LinSpaced(m,0,m-1);\n  // This is O(n * layers)\n  bool odd_iter = true;\n  MatrixXI P(m,1);\n  Index iter = 0;\n  while(Fr.size() > 0)\n  {\n    assert(Fr.rows() == IM.rows());\n    // Compute outer hull of current Fr\n    MatrixXF Fo;\n    MatrixXI Jo;\n    MatrixXflip flipr;\n#ifdef IGL_PEEL_OUTER_HULL_LAYERS_DEBUG\n  cout<<\"calling outer hull...\"<<endl;\n  writePLY(STR(\"outer-hull-input-\"<<iter<<\".ply\"),V,Fr);\n  writeDMAT(STR(\"outer-hull-input-\"<<iter<<\".dmat\"),Nr);\n#endif\n    outer_hull(V,Fr,Nr,Fo,Jo,flipr);\n#ifdef IGL_PEEL_OUTER_HULL_LAYERS_DEBUG\n  writePLY(STR(\"outer-hull-output-\"<<iter<<\".ply\"),V,Fo);\n  cout<<\"reindex, flip...\"<<endl;\n#endif\n    assert(Fo.rows() == Jo.rows());\n    // all faces in Fo of Fr\n    vector<bool> in_outer(Fr.rows(),false);\n    for(Index g = 0;g<Jo.rows();g++)\n    {\n      odd(IM(Jo(g))) = odd_iter;\n      P(IM(Jo(g))) = iter;\n      in_outer[Jo(g)] = true;\n      flip(IM(Jo(g))) = flipr(Jo(g));\n    }\n    // Fr = Fr - Fo\n    // update IM\n    MatrixXF prev_Fr = Fr;\n    MatrixXN prev_Nr = Nr;\n    MatrixXI prev_IM = IM;\n    Fr.resize(prev_Fr.rows() - Fo.rows(),F.cols());\n    Nr.resize(Fr.rows(),3);\n    IM.resize(Fr.rows());\n    {\n      Index g = 0;\n      for(Index f = 0;f<prev_Fr.rows();f++)\n      {\n        if(!in_outer[f])\n        {\n          Fr.row(g) = prev_Fr.row(f);\n          Nr.row(g) = prev_Nr.row(f);\n          IM(g) = prev_IM(f);\n          g++;\n        }\n      }\n    }\n    odd_iter = !odd_iter;\n    iter++;\n  }\n  return iter;\n}\n\ntemplate <\n  typename DerivedV,\n  typename DerivedF,\n  typename Derivedodd,\n  typename Derivedflip>\nIGL_INLINE size_t igl::peel_outer_hull_layers(\n  const Eigen::PlainObjectBase<DerivedV > & V,\n  const Eigen::PlainObjectBase<DerivedF > & F,\n  Eigen::PlainObjectBase<Derivedodd > & odd,\n  Eigen::PlainObjectBase<Derivedflip > & flip)\n{\n  Eigen::Matrix<typename DerivedV::Scalar,DerivedF::RowsAtCompileTime,3> N;\n  per_face_normals(V,F,N);\n  return peel_outer_hull_layers(V,F,N,odd,flip);\n}\n\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template specialization\ntemplate size_t igl::peel_outer_hull_layers<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<bool, -1, 1, 0, -1, 1>, Eigen::Matrix<bool, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<bool, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<bool, -1, 1, 0, -1, 1> >&);\ntemplate size_t igl::peel_outer_hull_layers<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<bool, -1, 1, 0, -1, 1>, Eigen::Matrix<bool, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<bool, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<bool, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/cgal/peel_outer_hull_layers.h",
    "content": "#ifndef IGL_PEEL_OUTER_HULL_LAYERS_H\n#define IGL_PEEL_OUTER_HULL_LAYERS_H\n#include \"../igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Computes necessary generic information for boolean operations by\n  // successively \"peeling\" off the \"outer hull\" of a mesh (V,F) resulting from\n  // \"resolving\" all (self-)intersections.\n  //\n  // Inputs:\n  //   V  #V by 3 list of vertex positions\n  //   F  #F by 3 list of triangle indices into V\n  //   N  #F by 3 list of per-face normals\n  // Outputs:\n  //   odd  #F list of whether facet belongs to an odd iteration peel (otherwise\n  //     an even iteration peel)\n  //   flip  #F list of whether a facet's orientation was flipped when facet\n  //     \"peeled\" into its associated outer hull layer.\n  // Returns number of peels\n  template <\n    typename DerivedV,\n    typename DerivedF,\n    typename DerivedN,\n    typename Derivedodd,\n    typename Derivedflip>\n  IGL_INLINE size_t peel_outer_hull_layers(\n    const Eigen::PlainObjectBase<DerivedV > & V,\n    const Eigen::PlainObjectBase<DerivedF > & F,\n    const Eigen::PlainObjectBase<DerivedN > & N,\n    Eigen::PlainObjectBase<Derivedodd > & odd,\n    Eigen::PlainObjectBase<Derivedflip > & flip);\n  template <\n    typename DerivedV,\n    typename DerivedF,\n    typename Derivedodd,\n    typename Derivedflip>\n  IGL_INLINE size_t peel_outer_hull_layers(\n    const Eigen::PlainObjectBase<DerivedV > & V,\n    const Eigen::PlainObjectBase<DerivedF > & F,\n    Eigen::PlainObjectBase<Derivedodd > & odd,\n    Eigen::PlainObjectBase<Derivedflip > & flip);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"peel_outer_hull_layers.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/cgal/point_mesh_squared_distance.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"point_mesh_squared_distance.h\"\n#include \"mesh_to_cgal_triangle_list.h\"\n\ntemplate <typename Kernel>\nIGL_INLINE void igl::cgal::point_mesh_squared_distance(\n  const Eigen::MatrixXd & P,\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  Eigen::VectorXd & sqrD,\n  Eigen::VectorXi & I,\n  Eigen::MatrixXd & C)\n{\n  using namespace std;\n  typedef CGAL::Triangle_3<Kernel> Triangle_3; \n  typedef typename std::vector<Triangle_3>::iterator Iterator;\n  typedef CGAL::AABB_triangle_primitive<Kernel, Iterator> Primitive;\n  typedef CGAL::AABB_traits<Kernel, Primitive> AABB_triangle_traits;\n  typedef CGAL::AABB_tree<AABB_triangle_traits> Tree;\n  Tree tree;\n  vector<Triangle_3> T;\n  point_mesh_squared_distance_precompute(V,F,tree,T);\n  return point_mesh_squared_distance(P,tree,T,sqrD,I,C);\n}\n\ntemplate <typename Kernel>\nIGL_INLINE void igl::cgal::point_mesh_squared_distance_precompute(\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  CGAL::AABB_tree<\n    CGAL::AABB_traits<Kernel, \n      CGAL::AABB_triangle_primitive<Kernel, \n        typename std::vector<CGAL::Triangle_3<Kernel> >::iterator\n      >\n    >\n  > & tree,\n  std::vector<CGAL::Triangle_3<Kernel> > & T)\n{\n  using namespace std;\n\n  typedef CGAL::Triangle_3<Kernel> Triangle_3; \n  typedef CGAL::Point_3<Kernel> Point_3; \n  typedef typename std::vector<Triangle_3>::iterator Iterator;\n  typedef CGAL::AABB_triangle_primitive<Kernel, Iterator> Primitive;\n  typedef CGAL::AABB_traits<Kernel, Primitive> AABB_triangle_traits;\n  typedef CGAL::AABB_tree<AABB_triangle_traits> Tree;\n\n  // Must be 3D\n  assert(V.cols() == 3);\n  // Must be triangles\n  assert(F.cols() == 3);\n\n  // WTF ALERT!!!! \n  //\n  // There's a bug in clang probably or at least in cgal. Without calling this\n  // line (I guess invoking some compilation from <vector>), clang will vomit\n  // errors inside CGAL.\n  //\n  // http://stackoverflow.com/questions/27748442/is-clangs-c11-support-reliable\n  T.reserve(0);\n\n  // Make list of cgal triangles\n  mesh_to_cgal_triangle_list(V,F,T);\n  tree.clear();\n  tree.insert(T.begin(),T.end());\n  tree.accelerate_distance_queries();\n  // accelerate_distance_queries doesn't seem actually to do _all_ of the\n  // precomputation. the tree (despite being const) will still do more\n  // precomputation and reorganizing on the first call of `closest_point` or\n  // `closest_point_and_primitive`. Therefor, call it once here.\n  tree.closest_point_and_primitive(Point_3(0,0,0));\n}\n\ntemplate <typename Kernel>\nIGL_INLINE void igl::cgal::point_mesh_squared_distance(\n  const Eigen::MatrixXd & P,\n  const CGAL::AABB_tree<\n    CGAL::AABB_traits<Kernel, \n      CGAL::AABB_triangle_primitive<Kernel, \n        typename std::vector<CGAL::Triangle_3<Kernel> >::iterator\n      >\n    >\n  > & tree,\n  const std::vector<CGAL::Triangle_3<Kernel> > & T,\n  Eigen::VectorXd & sqrD,\n  Eigen::VectorXi & I,\n  Eigen::MatrixXd & C)\n{\n  typedef CGAL::Triangle_3<Kernel> Triangle_3; \n  typedef typename std::vector<Triangle_3>::iterator Iterator;\n  typedef CGAL::AABB_triangle_primitive<Kernel, Iterator> Primitive;\n  typedef CGAL::AABB_traits<Kernel, Primitive> AABB_triangle_traits;\n  typedef CGAL::AABB_tree<AABB_triangle_traits> Tree;\n  typedef typename Tree::Point_and_primitive_id Point_and_primitive_id;\n  typedef CGAL::Point_3<Kernel>    Point_3;\n  assert(P.cols() == 3);\n  const int n = P.rows();\n  sqrD.resize(n,1);\n  I.resize(n,1);\n  C.resize(n,P.cols());\n  for(int p = 0;p < n;p++)\n  {\n    Point_3 query(P(p,0),P(p,1),P(p,2));\n    // Find closest point and primitive id\n    Point_and_primitive_id pp = tree.closest_point_and_primitive(query);\n    Point_3 closest_point = pp.first;\n    C(p,0) = CGAL::to_double(closest_point[0]);\n    C(p,1) = CGAL::to_double(closest_point[1]);\n    C(p,2) = CGAL::to_double(closest_point[2]);\n    sqrD(p) = CGAL::to_double((closest_point-query).squared_length());\n    I(p) = pp.second - T.begin();\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template specialization\ntemplate void igl::cgal::point_mesh_squared_distance_precompute<CGAL::Epick>(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, CGAL::AABB_tree<CGAL::AABB_traits<CGAL::Epick, CGAL::AABB_triangle_primitive<CGAL::Epick, std::vector<CGAL::Triangle_3<CGAL::Epick>, std::allocator<CGAL::Triangle_3<CGAL::Epick> > >::iterator, CGAL::Boolean_tag<false> > > >&, std::vector<CGAL::Triangle_3<CGAL::Epick>, std::allocator<CGAL::Triangle_3<CGAL::Epick> > >&);\ntemplate void igl::cgal::point_mesh_squared_distance<CGAL::Epeck>( const Eigen::MatrixXd & P, const Eigen::MatrixXd & V, const Eigen::MatrixXi & F, Eigen::VectorXd & sqrD, Eigen::VectorXi & I, Eigen::MatrixXd & C);\ntemplate void igl::cgal::point_mesh_squared_distance<CGAL::Epick>(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, Eigen::Matrix<double, -1, 1, 0, -1, 1>&, Eigen::Matrix<int, -1, 1, 0, -1, 1>&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&);\ntemplate void igl::cgal::point_mesh_squared_distance<CGAL::Simple_cartesian<double> >(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, Eigen::Matrix<double, -1, 1, 0, -1, 1>&, Eigen::Matrix<int, -1, 1, 0, -1, 1>&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/cgal/point_mesh_squared_distance.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_CGAL_POINT_MESH_SQUARED_DISTANCE_H\n#define IGL_CGAL_POINT_MESH_SQUARED_DISTANCE_H\n#include <igl/igl_inline.h>\n#include <Eigen/Core>\n#include <vector>\n#include \"CGAL_includes.hpp\"\nnamespace igl\n{\n  namespace cgal\n  {\n    // Compute distances from a set of points P to a triangle mesh (V,F)\n    //\n    // Templates:\n    //   Kernal  CGAL computation and construction kernel (e.g.\n    //     CGAL::Simple_cartesian<double>)\n    // Inputs:\n    //   P  #P by 3 list of query point positions\n    //   V  #V by 3 list of vertex positions\n    //   F  #F by 3 list of triangle indices\n    // Outputs:\n    //   sqrD  #P list of smallest squared distances\n    //   I  #P list of facet indices corresponding to smallest distances\n    //   C  #P by 3 list of closest points\n    //\n    // Known bugs: This only computes distances to triangles. So unreferenced\n    // vertices and degenerate triangles (segments) are ignored.\n    template <typename Kernel>\n    IGL_INLINE void point_mesh_squared_distance(\n      const Eigen::MatrixXd & P,\n      const Eigen::MatrixXd & V,\n      const Eigen::MatrixXi & F,\n      Eigen::VectorXd & sqrD,\n      Eigen::VectorXi & I,\n      Eigen::MatrixXd & C);\n    // Probably can do this in a way that we don't pass around `tree` and `T`\n    //\n    // Outputs:\n    //   tree  CGAL's AABB tree\n    //   T  list of CGAL triangles in order of F (for determining which was found\n    //     in computation)\n    template <typename Kernel>\n    IGL_INLINE void point_mesh_squared_distance_precompute(\n      const Eigen::MatrixXd & V,\n      const Eigen::MatrixXi & F,\n      CGAL::AABB_tree<\n        CGAL::AABB_traits<Kernel, \n          CGAL::AABB_triangle_primitive<Kernel, \n            typename std::vector<CGAL::Triangle_3<Kernel> >::iterator\n          >\n        >\n      > & tree,\n      std::vector<CGAL::Triangle_3<Kernel> > & T);\n    // Inputs:\n    //  see above\n    // Outputs:\n    //  see above\n    template <typename Kernel>\n    IGL_INLINE void point_mesh_squared_distance(\n      const Eigen::MatrixXd & P,\n      const CGAL::AABB_tree<\n        CGAL::AABB_traits<Kernel, \n          CGAL::AABB_triangle_primitive<Kernel, \n            typename std::vector<CGAL::Triangle_3<Kernel> >::iterator\n          >\n        >\n      > & tree,\n      const std::vector<CGAL::Triangle_3<Kernel> > & T,\n      Eigen::VectorXd & sqrD,\n      Eigen::VectorXi & I,\n      Eigen::MatrixXd & C);\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"point_mesh_squared_distance.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/cgal/polyhedron_to_mesh.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"polyhedron_to_mesh.h\"\n#include <CGAL/Polyhedron_3.h>\n\ntemplate <typename Polyhedron>\nIGL_INLINE void igl::polyhedron_to_mesh(\n  const Polyhedron & poly,\n  Eigen::MatrixXd & V,\n  Eigen::MatrixXi & F)\n{\n  using namespace std;\n  V.resize(poly.size_of_vertices(),3);\n  F.resize(poly.size_of_facets(),3);\n  typedef typename Polyhedron::Vertex_const_iterator Vertex_iterator;\n  std::map<Vertex_iterator,size_t> vertex_to_index;\n  {\n    size_t v = 0;\n    for(\n      typename Polyhedron::Vertex_const_iterator p = poly.vertices_begin();\n      p != poly.vertices_end();\n      p++)\n    {\n      V(v,0) = p->point().x();\n      V(v,1) = p->point().y();\n      V(v,2) = p->point().z();\n      vertex_to_index[p] = v;\n      v++;\n    }\n  }\n  {\n    size_t f = 0;\n    for(\n      typename Polyhedron::Facet_const_iterator facet = poly.facets_begin();\n      facet != poly.facets_end();\n      ++facet)\n    {\n      typename Polyhedron::Halfedge_around_facet_const_circulator he = \n        facet->facet_begin();\n      // Facets in polyhedral surfaces are at least triangles.\n      assert(CGAL::circulator_size(he) == 3 && \"Facets should be triangles\");\n      size_t c = 0;\n      do {\n        //// This is stooopidly slow\n        // F(f,c) = std::distance(poly.vertices_begin(), he->vertex());\n        F(f,c) = vertex_to_index[he->vertex()];\n        c++;\n      } while ( ++he != facet->facet_begin());\n      f++;\n    }\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instanciation\n#include <CGAL/Simple_cartesian.h>\n#include <CGAL/Polyhedron_items_with_id_3.h>\ntemplate void igl::polyhedron_to_mesh<CGAL::Polyhedron_3<CGAL::Simple_cartesian<double>, CGAL::Polyhedron_items_with_id_3, CGAL::HalfedgeDS_default, std::allocator<int> > >(CGAL::Polyhedron_3<CGAL::Simple_cartesian<double>, CGAL::Polyhedron_items_with_id_3, CGAL::HalfedgeDS_default, std::allocator<int> > const&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/cgal/polyhedron_to_mesh.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_POLYHEDRON_TO_MESH_H\n#define IGL_POLYHEDRON_TO_MESH_H\n#include <igl/igl_inline.h>\n#include <Eigen/Core>\n\nnamespace igl\n{\n  // Convert a CGAL Polyhedron to a mesh (V,F)\n  //\n  // Templates:\n  //   Polyhedron  CGAL Polyhedron type (e.g. Polyhedron_3)\n  // Inputs:\n  //   poly  cgal polyhedron\n  // Outputs:\n  //   V  #V by 3 list of vertex positions\n  //   F  #F by 3 list of triangle indices\n  template <typename Polyhedron>\n  IGL_INLINE void polyhedron_to_mesh(\n    const Polyhedron & poly,\n    Eigen::MatrixXd & V,\n    Eigen::MatrixXi & F);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"polyhedron_to_mesh.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/cgal/remesh_self_intersections.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"remesh_self_intersections.h\"\n#include \"SelfIntersectMesh.h\"\n#include <igl/C_STR.h>\n#include <list>\n#include <iostream>\n\ntemplate <\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedVV,\n  typename DerivedFF,\n  typename DerivedIF,\n  typename DerivedJ,\n  typename DerivedIM>\nIGL_INLINE void igl::remesh_self_intersections(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  const RemeshSelfIntersectionsParam & params,\n  Eigen::PlainObjectBase<DerivedVV> & VV,\n  Eigen::PlainObjectBase<DerivedFF> & FF,\n  Eigen::PlainObjectBase<DerivedIF> & IF,\n  Eigen::PlainObjectBase<DerivedJ> & J,\n  Eigen::PlainObjectBase<DerivedIM> & IM)\n{\n  using namespace std;\n  if(params.detect_only)\n  {\n    //// This is probably a terrible idea, but CGAL is throwing floating point\n    //// exceptions.\n\n//#ifdef __APPLE__\n//#define IGL_THROW_FPE 11\n//    const auto & throw_fpe = [](int e)\n//    {\n//      throw \"IGL_THROW_FPE\";\n//    };\n//    signal(SIGFPE,throw_fpe);\n//#endif\n\n    typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;\n    typedef\n      SelfIntersectMesh<\n        Kernel,\n        DerivedV,\n        DerivedF,\n        DerivedVV,\n        DerivedFF,\n        DerivedIF,\n        DerivedJ,\n        DerivedIM>\n      SelfIntersectMeshK;\n    SelfIntersectMeshK SIM = SelfIntersectMeshK(V,F,params,VV,FF,IF,J,IM);\n\n//#ifdef __APPLE__\n//    signal(SIGFPE,SIG_DFL);\n//#endif\n\n  }else\n  {\n    typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;\n    typedef\n      SelfIntersectMesh<\n        Kernel,\n        DerivedV,\n        DerivedF,\n        DerivedVV,\n        DerivedFF,\n        DerivedIF,\n        DerivedJ,\n        DerivedIM>\n      SelfIntersectMeshK;\n    SelfIntersectMeshK SIM = SelfIntersectMeshK(V,F,params,VV,FF,IF,J,IM);\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template specialization\ntemplate void igl::remesh_self_intersections<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, igl::RemeshSelfIntersectionsParam const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::remesh_self_intersections<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, igl::RemeshSelfIntersectionsParam const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::remesh_self_intersections<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, igl::RemeshSelfIntersectionsParam const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/cgal/remesh_self_intersections.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_REMESH_SELF_INTERSECTIONS_H\n#define IGL_REMESH_SELF_INTERSECTIONS_H\n#include <igl/igl_inline.h>\n#include \"RemeshSelfIntersectionsParam.h\"\n\n#include <Eigen/Dense>\n\n#ifdef MEX\n#  include <mex.h>\n#  include <cassert>\n#  undef assert\n#  define assert( isOK ) ( (isOK) ? (void)0 : (void) mexErrMsgTxt(C_STR(__FILE__<<\":\"<<__LINE__<<\": failed assertion `\"<<#isOK<<\"'\"<<std::endl) ) )\n#endif\n  \nnamespace igl\n{\n  // Given a triangle mesh (V,F) compute a new mesh (VV,FF) which is the same\n  // as (V,F) except that any self-intersecting triangles in (V,F) have been\n  // subdivided (new vertices and face created) so that the self-intersection\n  // contour lies exactly on edges in (VV,FF). New vertices will appear in\n  // original faces or on original edges. New vertices on edges are \"merged\"\n  // only across original faces sharing that edge. This means that if the input\n  // triangle mesh is a closed manifold the output will be too.\n  //\n  // Inputs:\n  //   V  #V by 3 list of vertex positions\n  //   F  #F by 3 list of triangle indices into V\n  //   params  struct of optional parameters\n  // Outputs:\n  //   VV  #VV by 3 list of vertex positions\n  //   FF  #FF by 3 list of triangle indices into V\n  //   IF  #intersecting face pairs by 2  list of intersecting face pairs,\n  //     indexing F\n  //   J  #FF list of indices into F denoting birth triangle\n  //   IM  #VV list of indices into VV of unique vertices.\n  //\n  // Known bugs: If an existing edge in (V,F) lies exactly on another face then\n  // any resulting additional vertices along that edge may not get properly\n  // connected so that the output mesh has the same global topology. This is\n  // because \n  //\n  // Example:\n  //     // resolve intersections\n  //     igl::remesh_self_intersections(V,F,params,VV,FF,IF,J,IM);\n  //     // _apply_ duplicate vertex mapping IM to FF\n  //     for_each(FF.data(),FF.data()+FF.size(),[&IM](int & a){a=IM(a);});\n  //     // remove any vertices now unreferenced after duplicate mapping.\n  //     igl::remove_unreferenced(VV,FF,SV,SF,UIM);\n  //     // Now (SV,SF) is ready to extract outer hull\n  //     igl::outer_hull(SV,SF,G,J,flip);\n  //\n  template <\n    typename DerivedV,\n    typename DerivedF,\n    typename DerivedVV,\n    typename DerivedFF,\n    typename DerivedIF,\n    typename DerivedJ,\n    typename DerivedIM>\n  IGL_INLINE void remesh_self_intersections(\n    const Eigen::PlainObjectBase<DerivedV> & V,\n    const Eigen::PlainObjectBase<DerivedF> & F,\n    const RemeshSelfIntersectionsParam & params,\n    Eigen::PlainObjectBase<DerivedVV> & VV,\n    Eigen::PlainObjectBase<DerivedFF> & FF,\n    Eigen::PlainObjectBase<DerivedIF> & IF,\n    Eigen::PlainObjectBase<DerivedJ> & J,\n    Eigen::PlainObjectBase<DerivedIM> & IM);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"remesh_self_intersections.cpp\"\n#endif\n  \n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/cgal/signed_distance_isosurface.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"signed_distance_isosurface.h\"\n#include \"point_mesh_squared_distance.h\"\n#include \"complex_to_mesh.h\"\n\n#include \"../AABB.h\"\n#include \"../per_face_normals.h\"\n#include \"../per_edge_normals.h\"\n#include \"../per_vertex_normals.h\"\n#include \"../centroid.h\"\n#include \"../WindingNumberAABB.h\"\n#include \"../matlab_format.h\"\n#include \"../remove_unreferenced.h\"\n\n#include <CGAL/Surface_mesh_default_triangulation_3.h>\n#include <CGAL/Complex_2_in_triangulation_3.h>\n#include <CGAL/make_surface_mesh.h>\n#include <CGAL/Implicit_surface_3.h>\n#include <CGAL/IO/output_surface_facets_to_polyhedron.h>\n// Axis-aligned bounding box tree for tet tri intersection\n#include <CGAL/AABB_tree.h>\n#include <CGAL/AABB_traits.h>\n#include <CGAL/AABB_triangle_primitive.h>\n#include <vector>\n\nIGL_INLINE bool igl::signed_distance_isosurface(\n  const Eigen::MatrixXd & IV,\n  const Eigen::MatrixXi & IF,\n  const double level,\n  const double angle_bound,\n  const double radius_bound,\n  const double distance_bound,\n  const SignedDistanceType sign_type,\n  Eigen::MatrixXd & V,\n  Eigen::MatrixXi & F)\n{\n  using namespace std;\n  using namespace Eigen;\n\n  // default triangulation for Surface_mesher\n  typedef CGAL::Surface_mesh_default_triangulation_3 Tr;\n  // c2t3\n  typedef CGAL::Complex_2_in_triangulation_3<Tr> C2t3;\n  typedef Tr::Geom_traits GT;//Kernel\n  typedef GT::Sphere_3 Sphere_3;\n  typedef GT::Point_3 Point_3;\n  typedef GT::FT FT;\n  typedef std::function<FT (Point_3)> Function;\n  typedef CGAL::Implicit_surface_3<GT, Function> Surface_3;\n\n  AABB<Eigen::MatrixXd,3> tree;\n  tree.init(IV,IF);\n\n  Eigen::MatrixXd FN,VN,EN;\n  Eigen::MatrixXi E;\n  Eigen::VectorXi EMAP;\n  WindingNumberAABB<Eigen::Vector3d> hier;\n  switch(sign_type)\n  {\n    default:\n      assert(false && \"Unknown SignedDistanceType\");\n    case SIGNED_DISTANCE_TYPE_UNSIGNED:\n      // do nothing\n      break;\n    case SIGNED_DISTANCE_TYPE_DEFAULT:\n    case SIGNED_DISTANCE_TYPE_WINDING_NUMBER:\n      hier.set_mesh(IV,IF);\n      hier.grow();\n      break;\n    case SIGNED_DISTANCE_TYPE_PSEUDONORMAL:\n      // \"Signed Distance Computation Using the Angle Weighted Pseudonormal\"\n      // [Bærentzen & Aanæs 2005]\n      per_face_normals(IV,IF,FN);\n      per_vertex_normals(IV,IF,PER_VERTEX_NORMALS_WEIGHTING_TYPE_ANGLE,FN,VN);\n      per_edge_normals(\n        IV,IF,PER_EDGE_NORMALS_WEIGHTING_TYPE_UNIFORM,FN,EN,E,EMAP);\n      break;\n  }\n\n  Tr tr;            // 3D-Delaunay triangulation\n  C2t3 c2t3 (tr);   // 2D-complex in 3D-Delaunay triangulation\n  // defining the surface\n  const auto & IVmax = IV.colwise().maxCoeff();\n  const auto & IVmin = IV.colwise().minCoeff();\n  const double bbd = (IVmax-IVmin).norm();\n  const double r = bbd/2.;\n  const auto & IVmid = 0.5*(IVmax + IVmin);\n  // Supposedly the implict needs to evaluate to <0 at cmid...\n  // http://doc.cgal.org/latest/Surface_mesher/classCGAL_1_1Implicit__surface__3.html\n  Point_3 cmid(IVmid(0),IVmid(1),IVmid(2));\n  Function fun;\n  switch(sign_type)\n  {\n    default:\n      assert(false && \"Unknown SignedDistanceType\");\n    case SIGNED_DISTANCE_TYPE_UNSIGNED:\n      fun = \n        [&tree,&IV,&IF,&level](const Point_3 & q) -> FT\n        {\n          int i;\n          RowVector3d c;\n          const double sd = tree.squared_distance(\n            IV,IF,RowVector3d(q.x(),q.y(),q.z()),i,c);\n          return sd-level;\n        };\n    case SIGNED_DISTANCE_TYPE_DEFAULT:\n    case SIGNED_DISTANCE_TYPE_WINDING_NUMBER:\n      fun = \n        [&tree,&IV,&IF,&hier,&level](const Point_3 & q) -> FT\n        {\n          const double sd = signed_distance_winding_number(\n            tree,IV,IF,hier,RowVector3d(q.x(),q.y(),q.z()));\n          return sd-level;\n        };\n      break;\n    case SIGNED_DISTANCE_TYPE_PSEUDONORMAL:\n      fun = [&tree,&IV,&IF,&FN,&VN,&EN,&EMAP,&level](const Point_3 & q) -> FT\n        {\n          const double sd = \n            igl::signed_distance_pseudonormal(\n              tree,IV,IF,FN,VN,EN,EMAP,RowVector3d(q.x(),q.y(),q.z()));\n          return sd- level;\n        };\n      break;\n  }\n  Sphere_3 bounding_sphere(cmid, (r+level)*(r+level));\n  Surface_3 surface(fun,bounding_sphere);\n  CGAL::Surface_mesh_default_criteria_3<Tr> \n    criteria(angle_bound,radius_bound,distance_bound);\n  // meshing surface\n  CGAL::make_surface_mesh(c2t3, surface, criteria, CGAL::Manifold_tag());\n  // complex to (V,F)\n  return igl::complex_to_mesh(c2t3,V,F);\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/cgal/signed_distance_isosurface.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_SIGNED_DISTANCE_ISOSURFACE_H\n#define IGL_SIGNED_DISTANCE_ISOSURFACE_H\n#include \"../igl_inline.h\"\n#include \"../signed_distance.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // SIGNED_DISTANCE_ISOSURFACE Compute the contour of an iso-level of the\n  // signed distance field to a given mesh.\n  //\n  // Inputs:\n  //   IV  #IV by 3 list of input mesh vertex positions\n  //   IF  #IF by 3 list of input triangle indices\n  //   level  iso-level to contour in world coords, negative is inside.\n  //   angle_bound  lower bound on triangle angles (mesh quality) (e.g. 28)\n  //   radius_bound  upper bound on triangle size (mesh density?) (e.g. 0.02)\n  //   distance_bound  cgal mysterious parameter (mesh density?) (e.g. 0.01)\n  //   sign_type  method for computing distance _sign_ (see\n  //     ../signed_distance.h)\n  // Outputs:\n  //   V  #V by 3 list of input mesh vertex positions\n  //   F  #F by 3 list of input triangle indices\n  //  \n  IGL_INLINE bool signed_distance_isosurface(\n    const Eigen::MatrixXd & IV,\n    const Eigen::MatrixXi & IF,\n    const double level,\n    const double angle_bound,\n    const double radius_bound,\n    const double distance_bound,\n    const SignedDistanceType sign_type,\n    Eigen::MatrixXd & V,\n    Eigen::MatrixXi & F);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"signed_distance_isosurface.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/circulation.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"circulation.h\"\n#include \"list_to_matrix.h\"\n\nIGL_INLINE std::vector<int> igl::circulation(\n  const int e,\n  const bool ccw,\n  const Eigen::MatrixXi & F,\n  const Eigen::MatrixXi & E,\n  const Eigen::VectorXi & EMAP,\n  const Eigen::MatrixXi & EF,\n  const Eigen::MatrixXi & EI)\n{\n  // prepare output\n  std::vector<int> N;\n  N.reserve(6);\n  const int m = F.rows();\n  const auto & step = [&](\n    const int e, \n    const int ff,\n    int & ne, \n    int & nf)\n  {\n    assert((EF(e,1) == ff || EF(e,0) == ff) && \"e should touch ff\");\n    //const int fside = EF(e,1)==ff?1:0;\n    const int nside = EF(e,0)==ff?1:0;\n    const int nv = EI(e,nside);\n    // get next face\n    nf = EF(e,nside);\n    // get next edge \n    const int dir = ccw?-1:1;\n    ne = EMAP(nf+m*((nv+dir+3)%3));\n  };\n  // Always start with first face (ccw in step will be sure to turn right\n  // direction)\n  const int f0 = EF(e,0);\n  int fi = f0;\n  int ei = e;\n  while(true)\n  {\n    step(ei,fi,ei,fi);\n    N.push_back(fi);\n    // back to start?\n    if(fi == f0)\n    {\n      assert(ei == e);\n      break;\n    }\n  }\n  return N;\n}\n\nIGL_INLINE void igl::circulation(\n  const int e,\n  const bool ccw,\n  const Eigen::MatrixXi & F,\n  const Eigen::MatrixXi & E,\n  const Eigen::VectorXi & EMAP,\n  const Eigen::MatrixXi & EF,\n  const Eigen::MatrixXi & EI,\n  Eigen::VectorXi & vN)\n{\n  std::vector<int> N = circulation(e,ccw,F,E,EMAP,EF,EI);\n  igl::list_to_matrix(N,vN);\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/circulation.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_CIRCULATION_H\n#define IGL_CIRCULATION_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <vector>\n\nnamespace igl\n{\n  // Return list of faces around the end point of an edge. Assumes\n  // data-structures are built from an edge-manifold **closed** mesh.\n  //\n  // Inputs:\n  //   e  index into E of edge to circulate\n  //   ccw  whether to _continue_ in ccw direction of edge (circulate around\n  //     E(e,1))\n  //   F  #F by 3 list of face indices\n  //   E  #E by 2 list of edge indices\n  //   EMAP #F*3 list of indices into E, mapping each directed edge to unique\n  //     unique edge in E\n  //   EF  #E by 2 list of edge flaps, EF(e,0)=f means e=(i-->j) is the edge of\n  //     F(f,:) opposite the vth corner, where EI(e,0)=v. Similarly EF(e,1) \"\n  //     e=(j->i)\n  //   EI  #E by 2 list of edge flap corners (see above).\n  // Returns list of faces touched by circulation (in cyclically order).\n  //   \n  IGL_INLINE std::vector<int> circulation(\n    const int e,\n    const bool ccw,\n    const Eigen::MatrixXi & F,\n    const Eigen::MatrixXi & E,\n    const Eigen::VectorXi & EMAP,\n    const Eigen::MatrixXi & EF,\n    const Eigen::MatrixXi & EI);\n  // Wrapper with VectorXi output.\n  IGL_INLINE void circulation(\n    const int e,\n    const bool ccw,\n    const Eigen::MatrixXi & F,\n    const Eigen::MatrixXi & E,\n    const Eigen::VectorXi & EMAP,\n    const Eigen::MatrixXi & EF,\n    const Eigen::MatrixXi & EI,\n    Eigen::VectorXi & vN);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"circulation.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/circumradius.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"circumradius.h\"\n#include \"edge_lengths.h\"\n#include \"doublearea.h\"\ntemplate <\n  typename DerivedV, \n  typename DerivedF,\n  typename DerivedR>\nIGL_INLINE void igl::circumradius(\n  const Eigen::PlainObjectBase<DerivedV> & V, \n  const Eigen::PlainObjectBase<DerivedF> & F,\n  Eigen::PlainObjectBase<DerivedR> & R)\n{\n  Eigen::Matrix<typename DerivedV::Scalar,Eigen::Dynamic,3> l;\n  igl::edge_lengths(V,F,l);\n  DerivedR A;\n  igl::doublearea(l,0.,A);\n  // use formula: R=abc/(4*area) to compute the circum radius\n  R = l.col(0).array() * l.col(1).array() * l.col(2).array() / (2.0*A.array());\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/circumradius.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_CIRCUMRADIUS_H\n#define IGL_CIRCUMRADIUS_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Compute the circumradius of each triangle in a mesh (V,F)\n  //\n  // Inputs:\n  //   V  #V by dim list of mesh vertex positions\n  //   F  #F by 3 list of triangle indices into V\n  // Outputs:\n  //   R  #F list of circumradii\n  //\n  template <\n    typename DerivedV, \n    typename DerivedF,\n    typename DerivedR>\n  IGL_INLINE void circumradius(\n    const Eigen::PlainObjectBase<DerivedV> & V, \n    const Eigen::PlainObjectBase<DerivedF> & F,\n    Eigen::PlainObjectBase<DerivedR> & R);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"circumradius.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/cocoa_key_to_anttweakbar_key.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"cocoa_key_to_anttweakbar_key.h\"\n#ifndef IGL_NO_ANTTWEAKBAR\n\n#include <AntTweakBar.h>\n\nIGL_INLINE int igl::cocoa_key_to_anttweakbar_key(int key)\n{\n  // I've left commented the AntTweakBar key codes that correspond to keys I\n  // don't have on my keyboard. Please fill this in if you have those keys\n  switch(key)\n  {\n    case 127:\n      return TW_KEY_BACKSPACE;\n    case 9:\n      return TW_KEY_TAB;\n  //TW_KEY_CLEAR        = 0x0c,\n    case 3://ENTER\n    case 13:\n      return TW_KEY_RETURN;\n    case 27:\n      return TW_KEY_ESCAPE;\n    case 32:\n      return TW_KEY_SPACE;\n    // IN A GLUT APP 40 is (\n    //case 40:\n    case 63272:\n      return TW_KEY_DELETE;\n    case 63232:\n      return TW_KEY_UP;\n    case 63233:\n      return TW_KEY_DOWN;\n    case 63235:\n      return TW_KEY_RIGHT;\n    case 63234:\n      return TW_KEY_LEFT;\n  //TW_KEY_INSERT,\n  //TW_KEY_HOME,\n  //TW_KEY_END,\n  //TW_KEY_PAGE_UP,\n  //TW_KEY_PAGE_DOWN,\n    case 63236:\n      return TW_KEY_F1;\n    case 63237:\n      return TW_KEY_F2;\n    case 63238:\n      return TW_KEY_F3;\n    case 63239:\n      return TW_KEY_F4;\n    case 63240:\n      return TW_KEY_F5;\n    case 63241:\n      return TW_KEY_F6;\n    case 63242:\n      return TW_KEY_F7;\n    case 63243:\n      return TW_KEY_F8;\n    case 63244:\n      return TW_KEY_F9;\n    case 63245:\n      return TW_KEY_F10;\n    case 63246:\n      return TW_KEY_F11;\n    case 63247:\n      return TW_KEY_F12;\n    case 63248:\n      return TW_KEY_F13;\n    case 63249:\n      return TW_KEY_F14;\n    case 63250:\n      return TW_KEY_F15;\n    default:\n      break;\n  }\n  return key;\n}\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/cocoa_key_to_anttweakbar_key.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COCOA_KEY_TO_ANTTWEAKBAR_KEY_H\n#define IGL_COCOA_KEY_TO_ANTTWEAKBAR_KEY_H\n#ifndef IGL_NO_ANTTWEAKBAR\n#include \"igl_inline.h\"\n\n\nnamespace igl\n{\n  // Convert an unsigned char (like that from Cocoa apps) to AntTweakBar key\n  // code.\n  // See also: TranslateKey() in TwMgr.cpp in AntTweakBar source\n  // Inputs:\n  //   key  unsigned char key from keyboard\n  // Returns int of new key code \n  IGL_INLINE int cocoa_key_to_anttweakbar_key(int key);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"cocoa_key_to_anttweakbar_key.cpp\"\n#endif\n\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/collapse_edge.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"collapse_edge.h\"\n#include \"circulation.h\"\n#include \"edge_collapse_is_valid.h\"\n#include <vector>\n\nIGL_INLINE bool igl::collapse_edge(\n  const int e,\n  const Eigen::RowVectorXd & p,\n  Eigen::MatrixXd & V,\n  Eigen::MatrixXi & F,\n  Eigen::MatrixXi & E,\n  Eigen::VectorXi & EMAP,\n  Eigen::MatrixXi & EF,\n  Eigen::MatrixXi & EI,\n  int & a_e1,\n  int & a_e2,\n  int & a_f1,\n  int & a_f2)\n{\n  // Assign this to 0 rather than, say, -1 so that deleted elements will get\n  // draw as degenerate elements at vertex 0 (which should always exist and\n  // never get collapsed to anything else since it is the smallest index)\n  using namespace Eigen;\n  using namespace std;\n  const int eflip = E(e,0)>E(e,1);\n  // source and destination\n  const int s = eflip?E(e,1):E(e,0);\n  const int d = eflip?E(e,0):E(e,1);\n\n  if(!edge_collapse_is_valid(e,F,E,EMAP,EF,EI))\n  {\n    return false;\n  }\n\n  // Important to grab neighbors of d before monkeying with edges\n  const std::vector<int> nV2Fd = circulation(e,!eflip,F,E,EMAP,EF,EI);\n\n  // The following implementation strongly relies on s<d\n  assert(s<d && \"s should be less than d\");\n  // move source and destination to midpoint\n  V.row(s) = p;\n  V.row(d) = p;\n\n  // Helper function to replace edge and associate information with NULL\n  const auto & kill_edge = [&E,&EI,&EF](const int e)\n  {\n    E(e,0) = IGL_COLLAPSE_EDGE_NULL;\n    E(e,1) = IGL_COLLAPSE_EDGE_NULL;\n    EF(e,0) = IGL_COLLAPSE_EDGE_NULL;\n    EF(e,1) = IGL_COLLAPSE_EDGE_NULL;\n    EI(e,0) = IGL_COLLAPSE_EDGE_NULL;\n    EI(e,1) = IGL_COLLAPSE_EDGE_NULL;\n  };\n\n  // update edge info\n  // for each flap\n  const int m = F.rows();\n  for(int side = 0;side<2;side++)\n  {\n    const int f = EF(e,side);\n    const int v = EI(e,side);\n    const int sign = (eflip==0?1:-1)*(1-2*side);\n    // next edge emanating from d\n    const int e1 = EMAP(f+m*((v+sign*1+3)%3));\n    // prev edge pointing to s\n    const int e2 = EMAP(f+m*((v+sign*2+3)%3));\n    assert(E(e1,0) == d || E(e1,1) == d);\n    assert(E(e2,0) == s || E(e2,1) == s);\n    // face adjacent to f on e1, also incident on d\n    const bool flip1 = EF(e1,1)==f;\n    const int f1 = flip1 ? EF(e1,0) : EF(e1,1);\n    assert(f1!=f);\n    assert(F(f1,0)==d || F(f1,1)==d || F(f1,2) == d);\n    // across from which vertex of f1 does e1 appear?\n    const int v1 = flip1 ? EI(e1,0) : EI(e1,1);\n    // Kill e1\n    kill_edge(e1);\n    // Kill f\n    F(f,0) = IGL_COLLAPSE_EDGE_NULL;\n    F(f,1) = IGL_COLLAPSE_EDGE_NULL;\n    F(f,2) = IGL_COLLAPSE_EDGE_NULL;\n    // map f1's edge on e1 to e2\n    assert(EMAP(f1+m*v1) == e1);\n    EMAP(f1+m*v1) = e2;\n    // side opposite f2, the face adjacent to f on e2, also incident on s\n    const int opp2 = (EF(e2,0)==f?0:1);\n    assert(EF(e2,opp2) == f);\n    EF(e2,opp2) = f1;\n    EI(e2,opp2) = v1;\n    // remap e2 from d to s\n    E(e2,0) = E(e2,0)==d ? s : E(e2,0);\n    E(e2,1) = E(e2,1)==d ? s : E(e2,1);\n    if(side==0)\n    {\n      a_e1 = e1;\n      a_f1 = f;\n    }else\n    {\n      a_e2 = e1;\n      a_f2 = f;\n    }\n  }\n\n  // finally, reindex faces and edges incident on d. Do this last so asserts\n  // make sense.\n  //\n  // Could actually skip first and last, since those are always the two\n  // collpased faces.\n  for(auto f : nV2Fd)\n  {\n    for(int v = 0;v<3;v++)\n    {\n      if(F(f,v) == d)\n      {\n        const int flip1 = (EF(EMAP(f+m*((v+1)%3)),0)==f)?1:0;\n        const int flip2 = (EF(EMAP(f+m*((v+2)%3)),0)==f)?0:1;\n        assert(\n          E(EMAP(f+m*((v+1)%3)),flip1) == d ||\n          E(EMAP(f+m*((v+1)%3)),flip1) == s);\n        E(EMAP(f+m*((v+1)%3)),flip1) = s;\n        assert(\n          E(EMAP(f+m*((v+2)%3)),flip2) == d ||\n          E(EMAP(f+m*((v+2)%3)),flip2) == s);\n        E(EMAP(f+m*((v+2)%3)),flip2) = s;\n        F(f,v) = s;\n        break;\n      }\n    }\n  }\n  // Finally, \"remove\" this edge and its information\n  kill_edge(e);\n\n  return true;\n}\n\nIGL_INLINE bool igl::collapse_edge(\n  const int e,\n  const Eigen::RowVectorXd & p,\n  Eigen::MatrixXd & V,\n  Eigen::MatrixXi & F,\n  Eigen::MatrixXi & E,\n  Eigen::VectorXi & EMAP,\n  Eigen::MatrixXi & EF,\n  Eigen::MatrixXi & EI)\n{\n  int e1,e2,f1,f2;\n  return collapse_edge(e,p,V,F,E,EMAP,EF,EI,e1,e2,f1,f2);\n}\n\nIGL_INLINE bool igl::collapse_edge(\n  const std::function<void(\n    const int,\n    const Eigen::MatrixXd &,\n    const Eigen::MatrixXi &,\n    const Eigen::MatrixXi &,\n    const Eigen::VectorXi &,\n    const Eigen::MatrixXi &,\n    const Eigen::MatrixXi &,\n    double &,\n    Eigen::RowVectorXd &)> & cost_and_placement,\n  Eigen::MatrixXd & V,\n  Eigen::MatrixXi & F,\n  Eigen::MatrixXi & E,\n  Eigen::VectorXi & EMAP,\n  Eigen::MatrixXi & EF,\n  Eigen::MatrixXi & EI,\n  std::set<std::pair<double,int> > & Q,\n  std::vector<std::set<std::pair<double,int> >::iterator > & Qit,\n  Eigen::MatrixXd & C)\n{\n  int e,e1,e2,f1,f2;\n  const auto always_try = [](\n    const Eigen::MatrixXd &                                         ,/*V*/\n    const Eigen::MatrixXi &                                         ,/*F*/\n    const Eigen::MatrixXi &                                         ,/*E*/\n    const Eigen::VectorXi &                                         ,/*EMAP*/\n    const Eigen::MatrixXi &                                         ,/*EF*/\n    const Eigen::MatrixXi &                                         ,/*EI*/\n    const std::set<std::pair<double,int> > &                        ,/*Q*/\n    const std::vector<std::set<std::pair<double,int> >::iterator > &,/*Qit*/\n    const Eigen::MatrixXd &                                         ,/*C*/\n    const int                                                        /*e*/\n    ) -> bool { return true;};\n  const auto never_care = [](\n    const Eigen::MatrixXd &                                         ,   /*V*/\n    const Eigen::MatrixXi &                                         ,   /*F*/\n    const Eigen::MatrixXi &                                         ,   /*E*/\n    const Eigen::VectorXi &                                         ,/*EMAP*/\n    const Eigen::MatrixXi &                                         ,  /*EF*/\n    const Eigen::MatrixXi &                                         ,  /*EI*/\n    const std::set<std::pair<double,int> > &                        ,   /*Q*/\n    const std::vector<std::set<std::pair<double,int> >::iterator > &, /*Qit*/\n    const Eigen::MatrixXd &                                         ,   /*C*/\n    const int                                                       ,   /*e*/\n    const int                                                       ,  /*e1*/\n    const int                                                       ,  /*e2*/\n    const int                                                       ,  /*f1*/\n    const int                                                       ,  /*f2*/\n    const bool                                                  /*collapsed*/\n    )-> void { };\n  return \n    collapse_edge(\n      cost_and_placement,always_try,never_care,\n      V,F,E,EMAP,EF,EI,Q,Qit,C,e,e1,e2,f1,f2);\n}\n\nIGL_INLINE bool igl::collapse_edge(\n  const std::function<void(\n    const int,\n    const Eigen::MatrixXd &,\n    const Eigen::MatrixXi &,\n    const Eigen::MatrixXi &,\n    const Eigen::VectorXi &,\n    const Eigen::MatrixXi &,\n    const Eigen::MatrixXi &,\n    double &,\n    Eigen::RowVectorXd &)> & cost_and_placement,\n  const std::function<bool(\n    const Eigen::MatrixXd &                                         ,/*V*/\n    const Eigen::MatrixXi &                                         ,/*F*/\n    const Eigen::MatrixXi &                                         ,/*E*/\n    const Eigen::VectorXi &                                         ,/*EMAP*/\n    const Eigen::MatrixXi &                                         ,/*EF*/\n    const Eigen::MatrixXi &                                         ,/*EI*/\n    const std::set<std::pair<double,int> > &                        ,/*Q*/\n    const std::vector<std::set<std::pair<double,int> >::iterator > &,/*Qit*/\n    const Eigen::MatrixXd &                                         ,/*C*/\n    const int                                                        /*e*/\n    )> & pre_collapse,\n  const std::function<void(\n    const Eigen::MatrixXd &                                         ,   /*V*/\n    const Eigen::MatrixXi &                                         ,   /*F*/\n    const Eigen::MatrixXi &                                         ,   /*E*/\n    const Eigen::VectorXi &                                         ,/*EMAP*/\n    const Eigen::MatrixXi &                                         ,  /*EF*/\n    const Eigen::MatrixXi &                                         ,  /*EI*/\n    const std::set<std::pair<double,int> > &                        ,   /*Q*/\n    const std::vector<std::set<std::pair<double,int> >::iterator > &, /*Qit*/\n    const Eigen::MatrixXd &                                         ,   /*C*/\n    const int                                                       ,   /*e*/\n    const int                                                       ,  /*e1*/\n    const int                                                       ,  /*e2*/\n    const int                                                       ,  /*f1*/\n    const int                                                       ,  /*f2*/\n    const bool                                                  /*collapsed*/\n    )> & post_collapse,\n  Eigen::MatrixXd & V,\n  Eigen::MatrixXi & F,\n  Eigen::MatrixXi & E,\n  Eigen::VectorXi & EMAP,\n  Eigen::MatrixXi & EF,\n  Eigen::MatrixXi & EI,\n  std::set<std::pair<double,int> > & Q,\n  std::vector<std::set<std::pair<double,int> >::iterator > & Qit,\n  Eigen::MatrixXd & C)\n{\n  int e,e1,e2,f1,f2;\n  return \n    collapse_edge(\n      cost_and_placement,pre_collapse,post_collapse,\n      V,F,E,EMAP,EF,EI,Q,Qit,C,e,e1,e2,f1,f2);\n}\n\n\nIGL_INLINE bool igl::collapse_edge(\n  const std::function<void(\n    const int,\n    const Eigen::MatrixXd &,\n    const Eigen::MatrixXi &,\n    const Eigen::MatrixXi &,\n    const Eigen::VectorXi &,\n    const Eigen::MatrixXi &,\n    const Eigen::MatrixXi &,\n    double &,\n    Eigen::RowVectorXd &)> & cost_and_placement,\n  const std::function<bool(\n    const Eigen::MatrixXd &                                         ,/*V*/\n    const Eigen::MatrixXi &                                         ,/*F*/\n    const Eigen::MatrixXi &                                         ,/*E*/\n    const Eigen::VectorXi &                                         ,/*EMAP*/\n    const Eigen::MatrixXi &                                         ,/*EF*/\n    const Eigen::MatrixXi &                                         ,/*EI*/\n    const std::set<std::pair<double,int> > &                        ,/*Q*/\n    const std::vector<std::set<std::pair<double,int> >::iterator > &,/*Qit*/\n    const Eigen::MatrixXd &                                         ,/*C*/\n    const int                                                        /*e*/\n    )> & pre_collapse,\n  const std::function<void(\n    const Eigen::MatrixXd &                                         ,   /*V*/\n    const Eigen::MatrixXi &                                         ,   /*F*/\n    const Eigen::MatrixXi &                                         ,   /*E*/\n    const Eigen::VectorXi &                                         ,/*EMAP*/\n    const Eigen::MatrixXi &                                         ,  /*EF*/\n    const Eigen::MatrixXi &                                         ,  /*EI*/\n    const std::set<std::pair<double,int> > &                        ,   /*Q*/\n    const std::vector<std::set<std::pair<double,int> >::iterator > &, /*Qit*/\n    const Eigen::MatrixXd &                                         ,   /*C*/\n    const int                                                       ,   /*e*/\n    const int                                                       ,  /*e1*/\n    const int                                                       ,  /*e2*/\n    const int                                                       ,  /*f1*/\n    const int                                                       ,  /*f2*/\n    const bool                                                  /*collapsed*/\n    )> & post_collapse,\n  Eigen::MatrixXd & V,\n  Eigen::MatrixXi & F,\n  Eigen::MatrixXi & E,\n  Eigen::VectorXi & EMAP,\n  Eigen::MatrixXi & EF,\n  Eigen::MatrixXi & EI,\n  std::set<std::pair<double,int> > & Q,\n  std::vector<std::set<std::pair<double,int> >::iterator > & Qit,\n  Eigen::MatrixXd & C,\n  int & e,\n  int & e1,\n  int & e2,\n  int & f1,\n  int & f2)\n{\n  using namespace Eigen;\n  if(Q.empty())\n  {\n    // no edges to collapse\n    return false;\n  }\n  std::pair<double,int> p = *(Q.begin());\n  if(p.first == std::numeric_limits<double>::infinity())\n  {\n    // min cost edge is infinite cost\n    return false;\n  }\n  Q.erase(Q.begin());\n  e = p.second;\n  Qit[e] = Q.end();\n  std::vector<int> N  = circulation(e, true,F,E,EMAP,EF,EI);\n  std::vector<int> Nd = circulation(e,false,F,E,EMAP,EF,EI);\n  N.insert(N.begin(),Nd.begin(),Nd.end());\n  bool collapsed = true;\n  if(pre_collapse(V,F,E,EMAP,EF,EI,Q,Qit,C,e))\n  {\n    collapsed = collapse_edge(e,C.row(e),V,F,E,EMAP,EF,EI,e1,e2,f1,f2);\n  }else\n  {\n    // Aborted by pre collapse callback\n    collapsed = false;\n  }\n  post_collapse(V,F,E,EMAP,EF,EI,Q,Qit,C,e,e1,e2,f1,f2,collapsed);\n  if(collapsed)\n  {\n    // Erase the two, other collapsed edges\n    Q.erase(Qit[e1]);\n    Qit[e1] = Q.end();\n    Q.erase(Qit[e2]);\n    Qit[e2] = Q.end();\n    // update local neighbors\n    // loop over original face neighbors\n    for(auto n : N)\n    {\n      if(F(n,0) != IGL_COLLAPSE_EDGE_NULL ||\n          F(n,1) != IGL_COLLAPSE_EDGE_NULL ||\n          F(n,2) != IGL_COLLAPSE_EDGE_NULL)\n      {\n        for(int v = 0;v<3;v++)\n        {\n          // get edge id\n          const int ei = EMAP(v*F.rows()+n);\n          // erase old entry\n          Q.erase(Qit[ei]);\n          // compute cost and potential placement\n          double cost;\n          RowVectorXd place;\n          cost_and_placement(ei,V,F,E,EMAP,EF,EI,cost,place);\n          // Replace in queue\n          Qit[ei] = Q.insert(std::pair<double,int>(cost,ei)).first;\n          C.row(ei) = place;\n        }\n      }\n    }\n  }else\n  {\n    // reinsert with infinite weight (the provided cost function must **not**\n    // have given this un-collapsable edge inf cost already)\n    p.first = std::numeric_limits<double>::infinity();\n    Qit[e] = Q.insert(p).first;\n  }\n  return collapsed;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/collapse_edge.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COLLAPSE_EDGE_H\n#define IGL_COLLAPSE_EDGE_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <vector>\n#include <set>\nnamespace igl\n{\n  // Assumes (V,F) is a closed manifold mesh (except for previouslly collapsed\n  // faces which should be set to: \n  // [IGL_COLLAPSE_EDGE_NULL IGL_COLLAPSE_EDGE_NULL IGL_COLLAPSE_EDGE_NULL].\n  // Collapses exactly two faces and exactly 3 edges from E (e and one side of\n  // each face gets collapsed to the other). This is implemented in a way that\n  // it can be repeatedly called until satisfaction and then the garbage in F\n  // can be collected by removing NULL faces.\n  //\n  // Inputs:\n  //   e  index into E of edge to try to collapse. E(e,:) = [s d] or [d s] so\n  //     that s<d, then d is collapsed to s.\n  ///  p  dim list of vertex position where to place merged vertex\n  // Inputs/Outputs:\n  //   V  #V by dim list of vertex positions, lesser index of E(e,:) will be set\n  //     to midpoint of edge.\n  //   F  #F by 3 list of face indices into V.\n  //   E  #E by 2 list of edge indices into V.\n  //   EMAP #F*3 list of indices into E, mapping each directed edge to unique\n  //     unique edge in E\n  //   EF  #E by 2 list of edge flaps, EF(e,0)=f means e=(i-->j) is the edge of\n  //     F(f,:) opposite the vth corner, where EI(e,0)=v. Similarly EF(e,1) \"\n  //     e=(j->i)\n  //   EI  #E by 2 list of edge flap corners (see above).\n  //   e1  index into E of edge collpased on left\n  //   e2  index into E of edge collpased on left\n  //   f1  index into E of edge collpased on left\n  //   f2  index into E of edge collpased on left\n  // Returns true if edge was collapsed\n  #define IGL_COLLAPSE_EDGE_NULL 0\n  IGL_INLINE bool collapse_edge(\n    const int e,\n    const Eigen::RowVectorXd & p,\n    Eigen::MatrixXd & V,\n    Eigen::MatrixXi & F,\n    Eigen::MatrixXi & E,\n    Eigen::VectorXi & EMAP,\n    Eigen::MatrixXi & EF,\n    Eigen::MatrixXi & EI,\n    int & e1,\n    int & e2,\n    int & f1,\n    int & f2);\n  IGL_INLINE bool collapse_edge(\n    const int e,\n    const Eigen::RowVectorXd & p,\n    Eigen::MatrixXd & V,\n    Eigen::MatrixXi & F,\n    Eigen::MatrixXi & E,\n    Eigen::VectorXi & EMAP,\n    Eigen::MatrixXi & EF,\n    Eigen::MatrixXi & EI);\n  // Collapse least-cost edge from a priority queue and update queue \n  //\n  // Inputs/Outputs:\n  //   cost_and_placement  function computing cost of collapsing an edge and 3d\n  //     position where it should be placed:\n  //     cost_and_placement(V,F,E,EMAP,EF,EI,cost,placement);\n  //     **If the edges is collapsed** then this function will be called on all\n  //     edges of all faces previously incident on the endpoints of the\n  //     collapsed edge.\n  //   Q  queue containing pairs of costs and edge indices\n  //   Qit  list of iterators so that Qit[e] --> iterator of edge e in Q\n  //   C  #E by dim list of stored placements\n  IGL_INLINE bool collapse_edge(\n    const std::function<void(\n      const int,\n      const Eigen::MatrixXd &,\n      const Eigen::MatrixXi &,\n      const Eigen::MatrixXi &,\n      const Eigen::VectorXi &,\n      const Eigen::MatrixXi &,\n      const Eigen::MatrixXi &,\n      double &,\n      Eigen::RowVectorXd &)> & cost_and_placement,\n    Eigen::MatrixXd & V,\n    Eigen::MatrixXi & F,\n    Eigen::MatrixXi & E,\n    Eigen::VectorXi & EMAP,\n    Eigen::MatrixXi & EF,\n    Eigen::MatrixXi & EI,\n    std::set<std::pair<double,int> > & Q,\n    std::vector<std::set<std::pair<double,int> >::iterator > & Qit,\n    Eigen::MatrixXd & C);\n  // Inputs:\n  //   pre_collapse  callback called with index of edge whose collapse is about\n  //     to be attempted. This function should return whether to **proceed**\n  //     with the collapse: returning true means \"yes, try to collapse\",\n  //     returning false means \"No, consider this edge 'uncollapsable', behave\n  //     as if collapse_edge(e) returned false.\n  //   post_collapse  callback called with index of edge whose collapse was\n  //     just attempted and a flag revealing whether this was successful.\n  IGL_INLINE bool collapse_edge(\n    const std::function<void(\n      const int,\n      const Eigen::MatrixXd &,\n      const Eigen::MatrixXi &,\n      const Eigen::MatrixXi &,\n      const Eigen::VectorXi &,\n      const Eigen::MatrixXi &,\n      const Eigen::MatrixXi &,\n      double &,\n      Eigen::RowVectorXd &)> & cost_and_placement,\n    const std::function<bool(\n      const Eigen::MatrixXd &                                         ,/*V*/\n      const Eigen::MatrixXi &                                         ,/*F*/\n      const Eigen::MatrixXi &                                         ,/*E*/\n      const Eigen::VectorXi &                                         ,/*EMAP*/\n      const Eigen::MatrixXi &                                         ,/*EF*/\n      const Eigen::MatrixXi &                                         ,/*EI*/\n      const std::set<std::pair<double,int> > &                        ,/*Q*/\n      const std::vector<std::set<std::pair<double,int> >::iterator > &,/*Qit*/\n      const Eigen::MatrixXd &                                         ,/*C*/\n      const int                                                        /*e*/\n      )> & pre_collapse,\n    const std::function<void(\n      const Eigen::MatrixXd &                                         ,   /*V*/\n      const Eigen::MatrixXi &                                         ,   /*F*/\n      const Eigen::MatrixXi &                                         ,   /*E*/\n      const Eigen::VectorXi &                                         ,/*EMAP*/\n      const Eigen::MatrixXi &                                         ,  /*EF*/\n      const Eigen::MatrixXi &                                         ,  /*EI*/\n      const std::set<std::pair<double,int> > &                        ,   /*Q*/\n      const std::vector<std::set<std::pair<double,int> >::iterator > &, /*Qit*/\n      const Eigen::MatrixXd &                                         ,   /*C*/\n      const int                                                       ,   /*e*/\n      const int                                                       ,  /*e1*/\n      const int                                                       ,  /*e2*/\n      const int                                                       ,  /*f1*/\n      const int                                                       ,  /*f2*/\n      const bool                                                  /*collapsed*/\n      )> & post_collapse,\n    Eigen::MatrixXd & V,\n    Eigen::MatrixXi & F,\n    Eigen::MatrixXi & E,\n    Eigen::VectorXi & EMAP,\n    Eigen::MatrixXi & EF,\n    Eigen::MatrixXi & EI,\n    std::set<std::pair<double,int> > & Q,\n    std::vector<std::set<std::pair<double,int> >::iterator > & Qit,\n    Eigen::MatrixXd & C);\n\n  IGL_INLINE bool collapse_edge(\n    const std::function<void(\n      const int,\n      const Eigen::MatrixXd &,\n      const Eigen::MatrixXi &,\n      const Eigen::MatrixXi &,\n      const Eigen::VectorXi &,\n      const Eigen::MatrixXi &,\n      const Eigen::MatrixXi &,\n      double &,\n      Eigen::RowVectorXd &)> & cost_and_placement,\n    const std::function<bool(\n      const Eigen::MatrixXd &                                         ,/*V*/\n      const Eigen::MatrixXi &                                         ,/*F*/\n      const Eigen::MatrixXi &                                         ,/*E*/\n      const Eigen::VectorXi &                                         ,/*EMAP*/\n      const Eigen::MatrixXi &                                         ,/*EF*/\n      const Eigen::MatrixXi &                                         ,/*EI*/\n      const std::set<std::pair<double,int> > &                        ,/*Q*/\n      const std::vector<std::set<std::pair<double,int> >::iterator > &,/*Qit*/\n      const Eigen::MatrixXd &                                         ,/*C*/\n      const int                                                        /*e*/\n      )> & pre_collapse,\n    const std::function<void(\n      const Eigen::MatrixXd &                                         ,   /*V*/\n      const Eigen::MatrixXi &                                         ,   /*F*/\n      const Eigen::MatrixXi &                                         ,   /*E*/\n      const Eigen::VectorXi &                                         ,/*EMAP*/\n      const Eigen::MatrixXi &                                         ,  /*EF*/\n      const Eigen::MatrixXi &                                         ,  /*EI*/\n      const std::set<std::pair<double,int> > &                        ,   /*Q*/\n      const std::vector<std::set<std::pair<double,int> >::iterator > &, /*Qit*/\n      const Eigen::MatrixXd &                                         ,   /*C*/\n      const int                                                       ,   /*e*/\n      const int                                                       ,  /*e1*/\n      const int                                                       ,  /*e2*/\n      const int                                                       ,  /*f1*/\n      const int                                                       ,  /*f2*/\n      const bool                                                  /*collapsed*/\n      )> & post_collapse,\n    Eigen::MatrixXd & V,\n    Eigen::MatrixXi & F,\n    Eigen::MatrixXi & E,\n    Eigen::VectorXi & EMAP,\n    Eigen::MatrixXi & EF,\n    Eigen::MatrixXi & EI,\n    std::set<std::pair<double,int> > & Q,\n    std::vector<std::set<std::pair<double,int> >::iterator > & Qit,\n    Eigen::MatrixXd & C,\n    int & e,\n    int & e1,\n    int & e2,\n    int & f1,\n    int & f2);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"collapse_edge.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/collapse_small_triangles.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"collapse_small_triangles.h\"\n\n#include \"bounding_box_diagonal.h\"\n#include \"doublearea.h\"\n#include \"edge_lengths.h\"\n#include \"colon.h\"\n#include \"faces_first.h\"\n\n#include <limits>\n\n#include <iostream>\n\nvoid igl::collapse_small_triangles(\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  const double eps,\n  Eigen::MatrixXi & FF)\n{\n  using namespace Eigen;\n  using namespace std;\n\n  // Compute bounding box diagonal length\n  double bbd = bounding_box_diagonal(V);\n  MatrixXd l;\n  edge_lengths(V,F,l);\n  VectorXd dblA;\n  doublearea(l,0.,dblA);\n\n  // Minimum area tolerance\n  const double min_dblarea = 2.0*eps*bbd*bbd;\n\n  Eigen::VectorXi FIM = colon<int>(0,V.rows()-1);\n  int num_edge_collapses = 0;\n  // Loop over triangles\n  for(int f = 0;f<F.rows();f++)\n  {\n    if(dblA(f) < min_dblarea)\n    {\n      double minl = 0;\n      int minli = -1;\n      // Find shortest edge\n      for(int e = 0;e<3;e++)\n      {\n        if(minli==-1 || l(f,e)<minl)\n        {\n          minli = e;\n          minl = l(f,e);\n        }\n      }\n      double maxl = 0;\n      int maxli = -1;\n      // Find longest edge\n      for(int e = 0;e<3;e++)\n      {\n        if(maxli==-1 || l(f,e)>maxl)\n        {\n          maxli = e;\n          maxl = l(f,e);\n        }\n      }\n      // Be sure that min and max aren't the same\n      maxli = (minli==maxli?(minli+1)%3:maxli);\n\n      // Collapse min edge maintaining max edge: i-->j\n      // Q: Why this direction?\n      int i = maxli;\n      int j = ((minli+1)%3 == maxli ? (minli+2)%3: (minli+1)%3);\n      assert(i != minli);\n      assert(j != minli);\n      assert(i != j);\n      FIM(F(f,i)) = FIM(F(f,j));\n      num_edge_collapses++;\n    }\n  }\n\n  // Reindex faces\n  MatrixXi rF = F;\n  // Loop over triangles\n  for(int f = 0;f<rF.rows();f++)\n  {\n    for(int i = 0;i<rF.cols();i++)\n    {\n      rF(f,i) = FIM(rF(f,i));\n    }\n  }\n\n  FF.resizeLike(rF);\n  int num_face_collapses=0;\n  // Only keep uncollapsed faces\n  {\n    int ff = 0;\n    // Loop over triangles\n    for(int f = 0;f<rF.rows();f++)\n    {\n      bool collapsed = false;\n      // Check if any indices are the same\n      for(int i = 0;i<rF.cols();i++)\n      {\n        for(int j = i+1;j<rF.cols();j++)\n        {\n          if(rF(f,i)==rF(f,j))\n          {\n            collapsed = true;\n            num_face_collapses++;\n            break;\n          }\n        }\n      }\n      if(!collapsed)\n      {\n        FF.row(ff++) = rF.row(f);\n      }\n    }\n    // Use conservative resize\n    FF.conservativeResize(ff,FF.cols());\n  }\n  //cout<<\"num_edge_collapses: \"<<num_edge_collapses<<endl;\n  //cout<<\"num_face_collapses: \"<<num_face_collapses<<endl;\n  if(num_edge_collapses == 0)\n  {\n    // There must have been a \"collapsed edge\" in the input\n    assert(num_face_collapses==0);\n    // Base case\n    return;\n  }\n\n  //// force base case\n  //return;\n\n  MatrixXi recFF = FF;\n  return collapse_small_triangles(V,recFF,eps,FF);\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/collapse_small_triangles.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COLLAPSE_SMALL_TRIANGLES_H\n#define IGL_COLLAPSE_SMALL_TRIANGLES_H\n#include <Eigen/Dense>\nnamespace igl\n{\n  // Given a triangle mesh (V,F) compute a new mesh (VV,FF) which contains the\n  // original faces and vertices of (V,F) except any small triangles have been\n  // removed via collapse.\n  //\n  // We are *not* following the rules in \"Mesh Optimization\" [Hoppe et al]\n  // Section 4.2. But for our purposes we don't care about this criteria.\n  //\n  // Inputs:\n  //   V  #V by 3 list of vertex positions\n  //   F  #F by 3 list of triangle indices into V\n  //   eps  epsilon for smallest allowed area treated as fraction of squared bounding box\n  //     diagonal\n  // Outputs:\n  //   FF  #FF by 3 list of triangle indices into V\n  //\n  //\n  void collapse_small_triangles(\n    const Eigen::MatrixXd & V,\n    const Eigen::MatrixXi & F,\n    const double eps,\n    Eigen::MatrixXi & FF);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"collapse_small_triangles.cpp\"\n#endif\n  \n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/colon.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"colon.h\"\n#include \"LinSpaced.h\"\n\n#include <cstdio>\n\ntemplate <typename L,typename S,typename H,typename T>\nIGL_INLINE void igl::colon(\n  const L low,\n  const S step,\n  const H hi,\n  Eigen::Matrix<T,Eigen::Dynamic,1> & I)\n{\n  const int size = ((hi-low)/step)+1;\n  I = igl::LinSpaced<Eigen::Matrix<T,Eigen::Dynamic,1> >(size,low,low+step*(size-1));\n}\n\ntemplate <typename L,typename H,typename T>\nIGL_INLINE void igl::colon(\n  const L low,\n  const H hi,\n  Eigen::Matrix<T,Eigen::Dynamic,1> & I)\n{\n  return igl::colon(low,(T)1,hi,I);\n}\n\ntemplate <typename T,typename L,typename H>\nIGL_INLINE Eigen::Matrix<T,Eigen::Dynamic,1> igl::colon(\n  const L low,\n  const H hi)\n{\n  Eigen::Matrix<T,Eigen::Dynamic,1> I;\n  igl::colon(low,hi,I);\n  return I;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate Eigen::Matrix<int,-1,1,0,-1,1> igl::colon<int,int,int>(int, int);\ntemplate Eigen::Matrix<int,-1,1,0,-1,1> igl::colon<int,int,long>(int,long);\ntemplate Eigen::Matrix<int,-1,1,0,-1,1> igl::colon<int,int,long long int>(int,long long int);\ntemplate Eigen::Matrix<double, -1, 1, 0, -1, 1> igl::colon<double, double, double>(double, double);\n// generated by autoexplicit.sh\ntemplate void igl::colon<int, long, int, int>(int, long, int, Eigen::Matrix<int, -1, 1, 0, -1, 1>&);\ntemplate void igl::colon<int, int, long, int>(int, int, long, Eigen::Matrix<int, -1, 1, 0, -1, 1>&);\ntemplate void igl::colon<int, long, int>(int, long, Eigen::Matrix<int, -1, 1, 0, -1, 1>&);\ntemplate void igl::colon<int, int, int>(int, int, Eigen::Matrix<int, -1, 1, 0, -1, 1>&);\ntemplate void igl::colon<int,long long int,int>(int,long long int,Eigen::Matrix<int,-1,1,0,-1,1> &);\ntemplate void igl::colon<int, int, int, int>(int, int, int, Eigen::Matrix<int, -1, 1, 0, -1, 1>&);\ntemplate void igl::colon<int, long, long>(int, long, Eigen::Matrix<long, -1, 1, 0, -1, 1>&);\ntemplate void igl::colon<int, double, double, double>(int, double, double, Eigen::Matrix<double, -1, 1, 0, -1, 1>&);\ntemplate void igl::colon<double, double, double>(double, double, Eigen::Matrix<double, -1, 1, 0, -1, 1>&);\n#ifdef WIN32\ntemplate void igl::colon<int, long long,long>(int, long long, class Eigen::Matrix<long,-1,1,0,-1,1> &);\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/colon.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COLON_H\n#define IGL_COLON_H\n#include \"igl_inline.h\"\n#include <Eigen/Dense>\nnamespace igl\n{\n  // Note:\n  // This should be potentially replaced with eigen's LinSpaced() function\n  //\n  // If step = 1, it's about 5 times faster to use:\n  //     X = Eigen::VectorXi::LinSpaced(n,0,n-1);\n  // than \n  //     X = igl::colon<int>(0,n-1);\n  //\n\n  // Colon operator like matlab's colon operator. Enumerats values between low\n  // and hi with step step.\n  // Templates:\n  //   L  should be a eigen matrix primitive type like int or double\n  //   S  should be a eigen matrix primitive type like int or double\n  //   H  should be a eigen matrix primitive type like int or double\n  //   T  should be a eigen matrix primitive type like int or double\n  // Inputs:\n  //   low  starting value if step is valid then this is *always* the first\n  //     element of I\n  //   step  step difference between sequential elements returned in I,\n  //     remember this will be cast to template T at compile time. If low<hi\n  //     then step must be positive. If low>hi then step must be negative.\n  //     Otherwise I will be set to empty.\n  //   hi  ending value, if (hi-low)%step is zero then this will be the last\n  //     element in I. If step is positive there will be no elements greater\n  //     than hi, vice versa if hi<low\n  // Output:\n  //   I  list of values from low to hi with step size step\n  template <typename L,typename S,typename H,typename T>\n  IGL_INLINE void colon(\n    const L low, \n    const S step, \n    const H hi, \n    Eigen::Matrix<T,Eigen::Dynamic,1> & I);\n  // Same as above but step == (T)1\n  template <typename L,typename H,typename T>\n  IGL_INLINE void colon(\n    const L low, \n    const H hi, \n    Eigen::Matrix<T,Eigen::Dynamic,1> & I);\n  // Return output rather than set in reference\n  template <typename T,typename L,typename H>\n  IGL_INLINE Eigen::Matrix<T,Eigen::Dynamic,1> colon(\n    const L low, \n    const H hi);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"colon.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/column_to_quats.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"column_to_quats.h\"\nIGL_INLINE bool igl::column_to_quats(\n  const Eigen::VectorXd & Q,\n  std::vector<\n    Eigen::Quaterniond,Eigen::aligned_allocator<Eigen::Quaterniond> > & vQ)\n{\n  using namespace Eigen;\n  if(Q.size() % 4 != 0)\n  {\n    return false;\n  }\n  const int nQ = Q.size()/4;\n  vQ.resize(nQ);\n  for(int q=0;q<nQ;q++)\n  {\n    // Constructor uses wxyz\n    vQ[q] = Quaterniond( Q(q*4+3), Q(q*4+0), Q(q*4+1), Q(q*4+2));\n  }\n  return true;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/column_to_quats.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COLUMN_TO_QUATS_H\n#define IGL_COLUMN_TO_QUATS_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <Eigen/Geometry>\n#include <Eigen/StdVector>\n#include <vector>\nnamespace igl\n{\n  // \"Columnize\" a list of quaternions (q1x,q1y,q1z,q1w,q2x,q2y,q2z,q2w,...)\n  //\n  // Inputs:\n  //   Q  n*4-long list of coefficients\n  // Outputs:\n  //   vQ  n-long list of quaternions\n  // Returns false if n%4!=0\n  IGL_INLINE bool column_to_quats(\n    const Eigen::VectorXd & Q,\n    std::vector<\n      Eigen::Quaterniond,Eigen::aligned_allocator<Eigen::Quaterniond> > & vQ);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"column_to_quats.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/columnize.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"columnize.h\"\n#include <cassert>\n\ntemplate <typename DerivedA, typename DerivedB>\nIGL_INLINE void igl::columnize(\n  const Eigen::PlainObjectBase<DerivedA> & A,\n  const int k,\n  const int dim,\n  Eigen::PlainObjectBase<DerivedB> & B)\n{\n  // Eigen matrices must be 2d so dim must be only 1 or 2\n  assert(dim == 1 || dim == 2);\n\n  // block height, width, and number of blocks\n  int m,n;\n  if(dim == 1)\n  {\n    m = A.rows()/k;\n    assert(m*(int)k == (int)A.rows());\n    n = A.cols();\n  }else// dim == 2\n  {\n    m = A.rows();\n    n = A.cols()/k;\n    assert(n*(int)k == (int)A.cols());\n  }\n\n  // resize output\n  B.resize(A.rows()*A.cols(),1);\n\n  for(int b = 0;b<(int)k;b++)\n  {\n    for(int i = 0;i<m;i++)\n    {\n      for(int j = 0;j<n;j++)\n      {\n        if(dim == 1)\n        {\n          B(j*m*k+i*k+b) = A(i+b*m,j);\n        }else\n        {\n          B(j*m*k+i*k+b) = A(i,b*n+j);\n        }\n      }\n    }\n  }\n}\n\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::columnize<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, int, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\ntemplate void igl::columnize<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, int, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::columnize<Eigen::Matrix<float, -1, -1, 0, -1, -1>, Eigen::Matrix<float, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<float, -1, -1, 0, -1, -1> > const&, int, int, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, -1, 0, -1, -1> >&);\ntemplate void igl::columnize<Eigen::Matrix<float, -1, -1, 0, -1, -1>, Eigen::Matrix<float, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<float, -1, -1, 0, -1, -1> > const&, int, int, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/columnize.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COLUMNIZE_H\n#define IGL_COLUMNIZE_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Core>\nnamespace igl\n{\n  // \"Columnize\" a stack of block matrices. If A = [A1,A2,A3,...,Ak] with each A*\n  // an m by n block then this produces the column vector whose entries are \n  // B(j*m*k+i*k+b) = A(i,b*n+j);\n  // or if A = [A1;A2;...;Ak] then\n  // B(j*m*k+i*k+b) = A(i+b*m,j);\n  //\n  // Templates:\n  //   T  should be a eigen matrix primitive type like int or double\n  // Inputs:\n  //   A  m*k by n (dim: 1) or m by n*k (dim: 2) eigen Matrix of type T values\n  //   k  number of blocks\n  //   dim  dimension in which blocks are stacked\n  // Output\n  //   B  m*n*k eigen vector of type T values,\n  //\n  // See also: transpose_blocks\n  template <typename DerivedA, typename DerivedB>\n  IGL_INLINE void columnize(\n    const Eigen::PlainObjectBase<DerivedA> & A,\n    const int k,\n    const int dim,\n    Eigen::PlainObjectBase<DerivedB> & B);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"columnize.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/comb_cross_field.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>, Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"comb_cross_field.h\"\n\n#include <vector>\n#include <deque>\n#include <Eigen/Geometry>\n#include \"per_face_normals.h\"\n#include \"is_border_vertex.h\"\n#include \"rotation_matrix_from_directions.h\"\n\n#include \"triangle_triangle_adjacency.h\"\n\nnamespace igl {\n  template <typename DerivedV, typename DerivedF>\n  class Comb\n  {\n  public:\n\n    const Eigen::PlainObjectBase<DerivedV> &V;\n    const Eigen::PlainObjectBase<DerivedF> &F;\n    const Eigen::PlainObjectBase<DerivedV> &PD1;\n    const Eigen::PlainObjectBase<DerivedV> &PD2;\n    DerivedV N;\n\n  private:\n    // internal\n    DerivedF TT;\n    DerivedF TTi;\n\n\n  private:\n\n\n    static inline double Sign(double a){return (double)((a>0)?+1:-1);}\n\n\n  private:\n\n    // returns the 90 deg rotation of a (around n) most similar to target b\n    /// a and b should be in the same plane orthogonal to N\n    static inline Eigen::Matrix<typename DerivedV::Scalar, 3, 1> K_PI_new(const Eigen::Matrix<typename DerivedV::Scalar, 3, 1>& a,\n                                                                   const Eigen::Matrix<typename DerivedV::Scalar, 3, 1>& b,\n                                                                   const Eigen::Matrix<typename DerivedV::Scalar, 3, 1>& n)\n    {\n      Eigen::Matrix<typename DerivedV::Scalar, 3, 1> c = (a.cross(n)).normalized();\n      typename DerivedV::Scalar scorea = a.dot(b);\n      typename DerivedV::Scalar scorec = c.dot(b);\n      if (fabs(scorea)>=fabs(scorec))\n        return a*Sign(scorea);\n      else\n        return c*Sign(scorec);\n    }\n\n\n\n  public:\n    inline Comb(const Eigen::PlainObjectBase<DerivedV> &_V,\n         const Eigen::PlainObjectBase<DerivedF> &_F,\n         const Eigen::PlainObjectBase<DerivedV> &_PD1,\n         const Eigen::PlainObjectBase<DerivedV> &_PD2\n         ):\n    V(_V),\n    F(_F),\n    PD1(_PD1),\n    PD2(_PD2)\n    {\n      igl::per_face_normals(V,F,N);\n      igl::triangle_triangle_adjacency(F,TT,TTi);\n    }\n    inline void comb(Eigen::PlainObjectBase<DerivedV> &PD1out,\n              Eigen::PlainObjectBase<DerivedV> &PD2out)\n    {\n//      PD1out = PD1;\n//      PD2out = PD2;\n      PD1out.setZero(F.rows(),3);PD1out<<PD1;\n      PD2out.setZero(F.rows(),3);PD2out<<PD2;\n\n      Eigen::VectorXi mark = Eigen::VectorXi::Constant(F.rows(),false);\n\n      std::deque<int> d;\n\n      d.push_back(0);\n      mark(0) = true;\n\n      while (!d.empty())\n      {\n        int f0 = d.at(0);\n        d.pop_front();\n        for (int k=0; k<3; k++)\n        {\n          int f1 = TT(f0,k);\n          if (f1==-1) continue;\n          if (mark(f1)) continue;\n\n          Eigen::Matrix<typename DerivedV::Scalar, 3, 1> dir0    = PD1out.row(f0);\n          Eigen::Matrix<typename DerivedV::Scalar, 3, 1> dir1    = PD1out.row(f1);\n          Eigen::Matrix<typename DerivedV::Scalar, 3, 1> n0    = N.row(f0);\n          Eigen::Matrix<typename DerivedV::Scalar, 3, 1> n1    = N.row(f1);\n\n\n          Eigen::Matrix<typename DerivedV::Scalar, 3, 1> dir0Rot = igl::rotation_matrix_from_directions(n0, n1)*dir0;\n          dir0Rot.normalize();\n          Eigen::Matrix<typename DerivedV::Scalar, 3, 1> targD   = K_PI_new(dir1,dir0Rot,n1);\n\n          PD1out.row(f1)  = targD;\n          PD2out.row(f1)  = n1.cross(targD).normalized();\n\n          mark(f1) = true;\n          d.push_back(f1);\n\n        }\n      }\n\n      // everything should be marked\n      for (int i=0; i<F.rows(); i++)\n      {\n        assert(mark(i));\n      }\n    }\n\n\n\n  };\n}\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::comb_cross_field(const Eigen::PlainObjectBase<DerivedV> &V,\n                                      const Eigen::PlainObjectBase<DerivedF> &F,\n                                      const Eigen::PlainObjectBase<DerivedV> &PD1,\n                                      const Eigen::PlainObjectBase<DerivedV> &PD2,\n                                      Eigen::PlainObjectBase<DerivedV> &PD1out,\n                                      Eigen::PlainObjectBase<DerivedV> &PD2out)\n{\n  igl::Comb<DerivedV, DerivedF> cmb(V, F, PD1, PD2);\n  cmb.comb(PD1out, PD2out);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::comb_cross_field<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\ntemplate void igl::comb_cross_field<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/comb_cross_field.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>, Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_COMB_CROSS_FIELD_H\n#define IGL_COMB_CROSS_FIELD_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Computes principal matchings of the vectors of a cross field across face edges,\n  // and generates a combed cross field defined on the mesh faces\n  \n  // Inputs:\n  //   V          #V by 3 eigen Matrix of mesh vertex 3D positions\n  //   F          #F by 4 eigen Matrix of face (quad) indices\n  //   PD1in      #F by 3 eigen Matrix of the first per face cross field vector\n  //   PD2in      #F by 3 eigen Matrix of the second per face cross field vector\n  // Output:\n  //   PD1out      #F by 3 eigen Matrix of the first combed cross field vector\n  //   PD2out      #F by 3 eigen Matrix of the second combed cross field vector\n  //\n  \n  \n  template <typename DerivedV, typename DerivedF>\n  IGL_INLINE void comb_cross_field(const Eigen::PlainObjectBase<DerivedV> &V,\n                                   const Eigen::PlainObjectBase<DerivedF> &F,\n                                   const Eigen::PlainObjectBase<DerivedV> &PD1in,\n                                   const Eigen::PlainObjectBase<DerivedV> &PD2in,\n                                   Eigen::PlainObjectBase<DerivedV> &PD1out,\n                                   Eigen::PlainObjectBase<DerivedV> &PD2out);\n}\n#ifndef IGL_STATIC_LIBRARY\n#include \"comb_cross_field.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/comb_frame_field.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>, Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifdef WIN32\n  #define _USE_MATH_DEFINES\n#endif\n#include <cmath>\n\n#include \"comb_frame_field.h\"\n#include \"local_basis.h\"\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedP>\nIGL_INLINE void igl::comb_frame_field(const Eigen::PlainObjectBase<DerivedV> &V,\n                                      const Eigen::PlainObjectBase<DerivedF> &F,\n                                      const Eigen::PlainObjectBase<DerivedP> &PD1,\n                                      const Eigen::PlainObjectBase<DerivedP> &PD2,\n                                      const Eigen::PlainObjectBase<DerivedP> &BIS1_combed,\n                                      const Eigen::PlainObjectBase<DerivedP> &BIS2_combed,\n                                      Eigen::PlainObjectBase<DerivedP> &PD1_combed,\n                                      Eigen::PlainObjectBase<DerivedP> &PD2_combed)\n{\n  DerivedV B1, B2, B3;\n  igl::local_basis(V,F,B1,B2,B3);\n\n  PD1_combed.resize(BIS1_combed.rows(),3);\n  PD2_combed.resize(BIS2_combed.rows(),3);\n\n  for (unsigned i=0; i<PD1.rows();++i)\n  {\n    Eigen::Matrix<typename DerivedP::Scalar,4,3> DIRs;\n    DIRs <<\n    PD1.row(i),\n    -PD1.row(i),\n    PD2.row(i),\n    -PD2.row(i);\n\n    std::vector<double> a(4);\n\n\n    double a_combed = atan2(B2.row(i).dot(BIS1_combed.row(i)),B1.row(i).dot(BIS1_combed.row(i)));\n\n    // center on the combed sector center\n    for (unsigned j=0;j<4;++j)\n    {\n      a[j] = atan2(B2.row(i).dot(DIRs.row(j)),B1.row(i).dot(DIRs.row(j))) - a_combed;\n      //make it positive by adding some multiple of 2pi\n      a[j] += std::ceil (std::max(0., -a[j]) / (M_PI*2.)) * (M_PI*2.);\n      //take modulo 2pi\n      a[j] = fmod(a[j], (M_PI*2.));\n    }\n    // now the max is u and the min is v\n\n    int m = std::min_element(a.begin(),a.end())-a.begin();\n    int M = std::max_element(a.begin(),a.end())-a.begin();\n\n    assert(\n           ((m>=0 && m<=1) && (M>=2 && M<=3))\n           ||\n           ((m>=2 && m<=3) && (M>=0 && M<=1))\n           );\n\n    PD1_combed.row(i) = DIRs.row(m);\n    PD2_combed.row(i) = DIRs.row(M);\n\n  }\n\n\n  //    PD1_combed = BIS1_combed;\n  //    PD2_combed = BIS2_combed;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::comb_frame_field<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\ntemplate void igl::comb_frame_field<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/comb_frame_field.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>, Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_COMB_FRAME_FIELD_H\n#define IGL_COMB_FRAME_FIELD_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Computes principal matchings of the vectors of a frame field across face edges,\n  // and generates a combed frame field defined on the mesh faces. This makes use of a\n  // combed cross field generated by combing the field created by the bisectors of the\n  // frame field.\n\n  // Inputs:\n  //   V            #V by 3 eigen Matrix of mesh vertex 3D positions\n  //   F            #F by 4 eigen Matrix of face (quad) indices\n  //   PD1          #F by 3 eigen Matrix of the first per face cross field vector\n  //   PD2          #F by 3 eigen Matrix of the second per face cross field vector\n  //   BIS1_combed  #F by 3 eigen Matrix of the first combed bisector field vector\n  //   BIS2_combed  #F by 3 eigen Matrix of the second combed bisector field vector\n  // Output:\n  //   PD1_combed  #F by 3 eigen Matrix of the first combed cross field vector\n  //   PD2_combed  #F by 3 eigen Matrix of the second combed cross field vector\n  //\n\n\n  template <typename DerivedV, typename DerivedF, typename DerivedP>\n  IGL_INLINE void comb_frame_field(const Eigen::PlainObjectBase<DerivedV> &V,\n                                        const Eigen::PlainObjectBase<DerivedF> &F,\n                                        const Eigen::PlainObjectBase<DerivedP> &PD1,\n                                        const Eigen::PlainObjectBase<DerivedP> &PD2,\n                                        const Eigen::PlainObjectBase<DerivedP> &BIS1_combed,\n                                        const Eigen::PlainObjectBase<DerivedP> &BIS2_combed,\n                                        Eigen::PlainObjectBase<DerivedP> &PD1_combed,\n                                        Eigen::PlainObjectBase<DerivedP> &PD2_combed);\n}\n#ifndef IGL_STATIC_LIBRARY\n#include \"comb_frame_field.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/comb_line_field.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Nico Pietroni <nico.pietroni@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"comb_line_field.h\"\n\n#include <vector>\n#include <deque>\n#include \"per_face_normals.h\"\n#include \"is_border_vertex.h\"\n#include \"rotation_matrix_from_directions.h\"\n\n#include \"triangle_triangle_adjacency.h\"\n\nnamespace igl {\ntemplate <typename DerivedV, typename DerivedF>\nclass CombLine\n{\npublic:\n\n    const Eigen::PlainObjectBase<DerivedV> &V;\n    const Eigen::PlainObjectBase<DerivedF> &F;\n    const Eigen::PlainObjectBase<DerivedV> &PD1;\n    DerivedV N;\n\nprivate:\n    // internal\n    DerivedF TT;\n    DerivedF TTi;\n\n\nprivate:\n\n\n    static inline double Sign(double a){return (double)((a>0)?+1:-1);}\n\n\nprivate:\n\n    // returns the 180 deg rotation of a (around n) most similar to target b\n    // a and b should be in the same plane orthogonal to N\n    static inline Eigen::Matrix<typename DerivedV::Scalar, 3, 1> K_PI_line(const Eigen::Matrix<typename DerivedV::Scalar, 3, 1>& a,\n                                                                           const Eigen::Matrix<typename DerivedV::Scalar, 3, 1>& b)\n    {\n        typename DerivedV::Scalar scorea = a.dot(b);\n        if (scorea<0)\n            return -a;\n        else\n            return a;\n    }\n\n\n\npublic:\n\n    inline CombLine(const Eigen::PlainObjectBase<DerivedV> &_V,\n                    const Eigen::PlainObjectBase<DerivedF> &_F,\n                    const Eigen::PlainObjectBase<DerivedV> &_PD1):\n        V(_V),\n        F(_F),\n        PD1(_PD1)\n    {\n        igl::per_face_normals(V,F,N);\n        igl::triangle_triangle_adjacency(F,TT,TTi);\n    }\n\n    inline void comb(Eigen::PlainObjectBase<DerivedV> &PD1out)\n    {\n        PD1out.setZero(F.rows(),3);PD1out<<PD1;\n\n        Eigen::VectorXi mark = Eigen::VectorXi::Constant(F.rows(),false);\n\n        std::deque<int> d;\n\n        d.push_back(0);\n        mark(0) = true;\n\n        while (!d.empty())\n        {\n            int f0 = d.at(0);\n            d.pop_front();\n            for (int k=0; k<3; k++)\n            {\n                int f1 = TT(f0,k);\n                if (f1==-1) continue;\n                if (mark(f1)) continue;\n\n                Eigen::Matrix<typename DerivedV::Scalar, 3, 1> dir0  = PD1out.row(f0);\n                Eigen::Matrix<typename DerivedV::Scalar, 3, 1> dir1  = PD1out.row(f1);\n                Eigen::Matrix<typename DerivedV::Scalar, 3, 1> n0    = N.row(f0);\n                Eigen::Matrix<typename DerivedV::Scalar, 3, 1> n1    = N.row(f1);\n\n                Eigen::Matrix<typename DerivedV::Scalar, 3, 1> dir0Rot = igl::rotation_matrix_from_directions(n0, n1)*dir0;\n                dir0Rot.normalize();\n                Eigen::Matrix<typename DerivedV::Scalar, 3, 1> targD   = K_PI_line(dir1,dir0Rot);\n\n                PD1out.row(f1)  = targD;\n                //PD2out.row(f1)  = n1.cross(targD).normalized();\n\n                mark(f1) = true;\n                d.push_back(f1);\n\n            }\n        }\n\n        // everything should be marked\n        for (int i=0; i<F.rows(); i++)\n        {\n            assert(mark(i));\n        }\n    }\n\n};\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::comb_line_field(const Eigen::PlainObjectBase<DerivedV> &V,\n                                     const Eigen::PlainObjectBase<DerivedF> &F,\n                                     const Eigen::PlainObjectBase<DerivedV> &PD1,\n                                     Eigen::PlainObjectBase<DerivedV> &PD1out)\n{\n    igl::CombLine<DerivedV, DerivedF> cmb(V, F, PD1);\n    cmb.comb(PD1out);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/comb_line_field.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Nico Pietroni <nico.pietroni@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_COMB_LINE_FIELD_H\n#define IGL_COMB_LINE_FIELD_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Computes principal matchings of the vectors of a cross field across face edges,\n  // and generates a combed cross field defined on the mesh faces\n\n  // Inputs:\n  //   V          #V by 3 eigen Matrix of mesh vertex 3D positions\n  //   F          #F by 4 eigen Matrix of face (quad) indices\n  //   PD1in      #F by 3 eigen Matrix of the first per face cross field vector\n  //   PD2in      #F by 3 eigen Matrix of the second per face cross field vector\n  // Output:\n  //   PD1out      #F by 3 eigen Matrix of the first combed cross field vector\n  //   PD2out      #F by 3 eigen Matrix of the second combed cross field vector\n  //\n\n\n  template <typename DerivedV, typename DerivedF>\n  IGL_INLINE void comb_line_field(const Eigen::PlainObjectBase<DerivedV> &V,\n                                  const Eigen::PlainObjectBase<DerivedF> &F,\n                                  const Eigen::PlainObjectBase<DerivedV> &PD1in,\n                                  Eigen::PlainObjectBase<DerivedV> &PD1out);\n}\n#ifndef IGL_STATIC_LIBRARY\n#include \"comb_line_field.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/combine.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"combine.h\"\n#include <cassert>\ntemplate <\n  typename DerivedVV, \n  typename DerivedFF, \n  typename DerivedV, \n  typename DerivedF>\nIGL_INLINE void igl::combine(\n  const std::vector<DerivedVV> & VV,\n  const std::vector<DerivedFF> & FF,\n  Eigen::PlainObjectBase<DerivedV> & V,\n  Eigen::PlainObjectBase<DerivedF> & F)\n{\n  assert(VV.size() == FF.size() && \n    \"Lists of verex lists and face lists should be same size\");\n  // Dimension of vertex positions\n  const int dim = VV.size() > 0 ? VV[0].cols() : 0;\n  // Simplex/element size\n  const int ss = FF.size() > 0 ? FF[0].cols() : 0;\n  int n = 0;\n  int m = 0;\n  for(int i = 0;i<VV.size();i++)\n  {\n    const auto & Vi = VV[i];\n    const auto & Fi = FF[i];\n    n+=Vi.rows();\n    assert(dim == Vi.cols() && \"All vertex lists should have same #columns\");\n    m+=Fi.rows();\n    assert(ss == Fi.cols() && \"All face lists should have same #columns\");\n  }\n  V.resize(n,dim);\n  F.resize(m,ss);\n  {\n    int kv = 0;\n    int kf = 0;\n    for(int i = 0;i<VV.size();i++)\n    {\n      const auto & Vi = VV[i];\n      const int ni = Vi.rows();\n      const auto & Fi = FF[i];\n      const int mi = Fi.rows();\n      F.block(kf,0,mi,ss) = Fi.array()+kv;\n      kf+=mi;\n      V.block(kv,0,ni,dim) = Vi;\n      kv+=ni;\n    }\n    assert(kv == V.rows());\n    assert(kf == F.rows());\n  }\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/combine.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COMBINE_H\n#define IGL_COMBINE_H\n\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <vector>\n\nnamespace igl\n{\n  // Combine k meshes into a single >=k connected component mesh with a single\n  // vertex list and face list. Similar to Maya's Combine operation.\n  //\n  // Inputs:\n  //   VV  k-long list of lists of mesh vertex positions\n  //   FF  k-long list of lists of mesh face indices so that FF[i] indexes\n  //     VV[i]\n  // Outputs:\n  //   V   VV[0].rows()+...+VV[k-1].rows() by VV[0].cols() list of mesh\n  //     vertex positions\n  //   F   FF[0].rows()+...+FF[k-1].rows() by FF[0].cols() list of mesh faces\n  //     indices into V\n  // Example:\n  //   // Suppose you have mesh A (VA,FA) and mesh B (VB,FB)\n  //   igl::combine<Eigen::MatrixXd,Eigen::MatrixXi>({VA,VB},{FA,FB},V,F);\n  //\n  template <\n    typename DerivedVV, \n    typename DerivedFF, \n    typename DerivedV, \n    typename DerivedF>\n  IGL_INLINE void combine(\n    const std::vector<DerivedVV> & VV,\n    const std::vector<DerivedFF> & FF,\n    Eigen::PlainObjectBase<DerivedV> & V,\n    Eigen::PlainObjectBase<DerivedF> & F);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"combine.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/comiso/frame_field.cpp",
    "content": "#include \"frame_field.h\"\n\n#include <igl/triangle_triangle_adjacency.h>\n#include <igl/edge_topology.h>\n#include <igl/per_face_normals.h>\n#include <igl/comiso/nrosy.h>\n#include <iostream>\n\nnamespace igl\n{\n\nclass FrameInterpolator\n{\npublic:\n  // Init\n  IGL_INLINE FrameInterpolator(const Eigen::MatrixXd& _V, const Eigen::MatrixXi& _F);\n  IGL_INLINE ~FrameInterpolator();\n\n  // Reset constraints (at least one constraint must be present or solve will fail)\n  IGL_INLINE void resetConstraints();\n\n  IGL_INLINE void setConstraint(const int fid, const Eigen::VectorXd& v);\n\n  IGL_INLINE void interpolateSymmetric();\n\n  // Generate the frame field\n  IGL_INLINE void solve();\n\n  // Convert the frame field in the canonical representation\n  IGL_INLINE void frame2canonical(const Eigen::MatrixXd& TP, const Eigen::RowVectorXd& v, double& theta, Eigen::VectorXd& S);\n\n  // Convert the canonical representation in a frame field\n  IGL_INLINE void canonical2frame(const Eigen::MatrixXd& TP, const double theta, const Eigen::VectorXd& S, Eigen::RowVectorXd& v);\n\n  IGL_INLINE Eigen::MatrixXd getFieldPerFace();\n\n  IGL_INLINE void PolarDecomposition(Eigen::MatrixXd V, Eigen::MatrixXd& U, Eigen::MatrixXd& P);\n\n  // Symmetric\n  Eigen::MatrixXd S;\n  std::vector<bool> S_c;\n\n  // -------------------------------------------------\n\n  // Face Topology\n  Eigen::MatrixXi TT, TTi;\n\n  // Two faces are consistent if their representative vector are taken modulo PI\n  std::vector<bool> edge_consistency;\n  Eigen::MatrixXi   edge_consistency_TT;\n\nprivate:\n  IGL_INLINE double mod2pi(double d);\n  IGL_INLINE double modpi2(double d);\n  IGL_INLINE double modpi(double d);\n\n  // Convert a direction on the tangent space into an angle\n  IGL_INLINE double vector2theta(const Eigen::MatrixXd& TP, const Eigen::RowVectorXd& v);\n\n  // Convert an angle in a vector in the tangent space\n  IGL_INLINE Eigen::RowVectorXd theta2vector(const Eigen::MatrixXd& TP, const double theta);\n\n  // Interpolate the cross field (theta)\n  IGL_INLINE void interpolateCross();\n\n  // Compute difference between reference frames\n  IGL_INLINE void computek();\n\n  // Compute edge consistency\n  IGL_INLINE void compute_edge_consistency();\n\n  // Cross field direction\n  Eigen::VectorXd thetas;\n  std::vector<bool> thetas_c;\n\n  // Edge Topology\n  Eigen::MatrixXi EV, FE, EF;\n  std::vector<bool> isBorderEdge;\n\n  // Angle between two reference frames\n  // R(k) * t0 = t1\n  Eigen::VectorXd k;\n\n  // Mesh\n  Eigen::MatrixXd V;\n  Eigen::MatrixXi F;\n\n  // Normals per face\n  Eigen::MatrixXd N;\n\n  // Reference frame per triangle\n  std::vector<Eigen::MatrixXd> TPs;\n\n};\n\n\n\n\nFrameInterpolator::FrameInterpolator(const Eigen::MatrixXd& _V, const Eigen::MatrixXi& _F)\n{\n  using namespace std;\n  using namespace Eigen;\n\n  V = _V;\n  F = _F;\n\n  assert(V.rows() > 0);\n  assert(F.rows() > 0);\n\n\n  // Generate topological relations\n  igl::triangle_triangle_adjacency(V,F,TT,TTi);\n  igl::edge_topology(V,F, EV, FE, EF);\n\n  // Flag border edges\n  isBorderEdge.resize(EV.rows());\n  for(unsigned i=0; i<EV.rows(); ++i)\n    isBorderEdge[i] = (EF(i,0) == -1) || ((EF(i,1) == -1));\n\n  // Generate normals per face\n  igl::per_face_normals(V, F, N);\n\n  // Generate reference frames\n  for(unsigned fid=0; fid<F.rows(); ++fid)\n  {\n    // First edge\n    Vector3d e1 = V.row(F(fid,1)) - V.row(F(fid,0));\n    e1.normalize();\n    Vector3d e2 = N.row(fid);\n    e2 = e2.cross(e1);\n    e2.normalize();\n\n    MatrixXd TP(2,3);\n    TP << e1.transpose(), e2.transpose();\n    TPs.push_back(TP);\n  }\n\n  // Reset the constraints\n  resetConstraints();\n\n  // Compute k, differences between reference frames\n  computek();\n\n  // Alloc internal variables\n  thetas            = VectorXd::Zero(F.rows());\n  S = MatrixXd::Zero(F.rows(),3);\n\n  compute_edge_consistency();\n}\n\nFrameInterpolator::~FrameInterpolator()\n{\n\n}\n\ndouble FrameInterpolator::mod2pi(double d)\n{\n  while(d<0)\n    d = d + (2.0*M_PI);\n\n  return fmod(d, (2.0*M_PI));\n}\n\ndouble FrameInterpolator::modpi2(double d)\n{\n  while(d<0)\n    d = d + (M_PI/2.0);\n\n  return fmod(d, (M_PI/2.0));\n}\n\ndouble FrameInterpolator::modpi(double d)\n{\n  while(d<0)\n    d = d + (M_PI);\n\n  return fmod(d, (M_PI));\n}\n\n\ndouble FrameInterpolator::vector2theta(const Eigen::MatrixXd& TP, const Eigen::RowVectorXd& v)\n{\n  // Project onto the tangent plane\n  Eigen::Vector2d vp = TP * v.transpose();\n\n  // Convert to angle\n  double theta = atan2(vp(1),vp(0));\n  return theta;\n}\n\nEigen::RowVectorXd FrameInterpolator::theta2vector(const Eigen::MatrixXd& TP, const double theta)\n{\n  Eigen::Vector2d vp(cos(theta),sin(theta));\n  return vp.transpose() * TP;\n}\n\nvoid FrameInterpolator::interpolateCross()\n{\n  using namespace std;\n  using namespace Eigen;\n\n  //olga: was\n  // NRosyField nrosy(V,F);\n  // for (unsigned i=0; i<F.rows(); ++i)\n    // if(thetas_c[i])\n      // nrosy.setConstraintHard(i,theta2vector(TPs[i],thetas(i)));\n  // nrosy.solve(4);\n  // MatrixXd R = nrosy.getFieldPerFace();\n\n  //olga: is\n  Eigen::MatrixXd R;\n  Eigen::VectorXd S;\n  Eigen::VectorXi b; b.resize(F.rows(),1);\n  Eigen::MatrixXd bc; bc.resize(F.rows(),3);\n  int num = 0;\n  for (unsigned i=0; i<F.rows(); ++i)\n    if(thetas_c[i])\n      {\n        b[num] = i;\n        bc.row(num) = theta2vector(TPs[i],thetas(i));\n        num++;\n      }\n  b.conservativeResize(num,Eigen::NoChange);\n  bc.conservativeResize(num,Eigen::NoChange);\n\n  igl::nrosy(V, F, b, bc, 4, R, S);\n  //olga:end\n  assert(R.rows() == F.rows());\n\n  for (unsigned i=0; i<F.rows(); ++i)\n    thetas(i) = vector2theta(TPs[i],R.row(i));\n}\n\nvoid FrameInterpolator::resetConstraints()\n{\n  thetas_c.resize(F.rows());\n  S_c.resize(F.rows());\n\n  for(unsigned i=0; i<F.rows(); ++i)\n  {\n    thetas_c[i]  = false;\n    S_c[i] = false;\n  }\n\n}\n\nvoid FrameInterpolator::compute_edge_consistency()\n{\n  using namespace std;\n  using namespace Eigen;\n\n  // Compute per-edge consistency\n  edge_consistency.resize(EF.rows());\n  edge_consistency_TT = MatrixXi::Constant(TT.rows(),3,-1);\n\n  // For every non-border edge\n  for (unsigned eid=0; eid<EF.rows(); ++eid)\n  {\n    if (!isBorderEdge[eid])\n    {\n      int fid0 = EF(eid,0);\n      int fid1 = EF(eid,1);\n\n      double theta0 = thetas(fid0);\n      double theta1 = thetas(fid1);\n\n      theta0 = theta0 + k(eid);\n\n      double r = modpi(theta0-theta1);\n\n      edge_consistency[eid] = r < M_PI/4.0 || r > 3*(M_PI/4.0);\n\n      // Copy it into edge_consistency_TT\n      int i1 = -1;\n      int i2 = -1;\n      for (unsigned i=0; i<3; ++i)\n      {\n        if (TT(fid0,i) == fid1)\n          i1 = i;\n        if (TT(fid1,i) == fid0)\n          i2 = i;\n      }\n      assert(i1 != -1);\n      assert(i2 != -1);\n\n      edge_consistency_TT(fid0,i1) = edge_consistency[eid];\n      edge_consistency_TT(fid1,i2) = edge_consistency[eid];\n    }\n  }\n}\n\nvoid FrameInterpolator::computek()\n{\n  using namespace std;\n  using namespace Eigen;\n\n  k.resize(EF.rows());\n\n  // For every non-border edge\n  for (unsigned eid=0; eid<EF.rows(); ++eid)\n  {\n    if (!isBorderEdge[eid])\n    {\n      int fid0 = EF(eid,0);\n      int fid1 = EF(eid,1);\n\n      Vector3d N0 = N.row(fid0);\n      //Vector3d N1 = N.row(fid1);\n\n      // find common edge on triangle 0 and 1\n      int fid0_vc = -1;\n      int fid1_vc = -1;\n      for (unsigned i=0;i<3;++i)\n      {\n        if (EV(eid,0) == F(fid0,i))\n          fid0_vc = i;\n        if (EV(eid,1) == F(fid1,i))\n          fid1_vc = i;\n      }\n      assert(fid0_vc != -1);\n      assert(fid1_vc != -1);\n\n      Vector3d common_edge = V.row(F(fid0,(fid0_vc+1)%3)) - V.row(F(fid0,fid0_vc));\n      common_edge.normalize();\n\n      // Map the two triangles in a new space where the common edge is the x axis and the N0 the z axis\n      MatrixXd P(3,3);\n      VectorXd o = V.row(F(fid0,fid0_vc));\n      VectorXd tmp = -N0.cross(common_edge);\n      P << common_edge, tmp, N0;\n      P.transposeInPlace();\n\n\n      MatrixXd V0(3,3);\n      V0.row(0) = V.row(F(fid0,0)).transpose() -o;\n      V0.row(1) = V.row(F(fid0,1)).transpose() -o;\n      V0.row(2) = V.row(F(fid0,2)).transpose() -o;\n\n      V0 = (P*V0.transpose()).transpose();\n\n      assert(V0(0,2) < 10e-10);\n      assert(V0(1,2) < 10e-10);\n      assert(V0(2,2) < 10e-10);\n\n      MatrixXd V1(3,3);\n      V1.row(0) = V.row(F(fid1,0)).transpose() -o;\n      V1.row(1) = V.row(F(fid1,1)).transpose() -o;\n      V1.row(2) = V.row(F(fid1,2)).transpose() -o;\n      V1 = (P*V1.transpose()).transpose();\n\n      assert(V1(fid1_vc,2) < 10e-10);\n      assert(V1((fid1_vc+1)%3,2) < 10e-10);\n\n      // compute rotation R such that R * N1 = N0\n      // i.e. map both triangles to the same plane\n      double alpha = -atan2(V1((fid1_vc+2)%3,2),V1((fid1_vc+2)%3,1));\n\n      MatrixXd R(3,3);\n      R << 1,          0,            0,\n           0, cos(alpha), -sin(alpha) ,\n           0, sin(alpha),  cos(alpha);\n      V1 = (R*V1.transpose()).transpose();\n\n      assert(V1(0,2) < 10e-10);\n      assert(V1(1,2) < 10e-10);\n      assert(V1(2,2) < 10e-10);\n\n      // measure the angle between the reference frames\n      // k_ij is the angle between the triangle on the left and the one on the right\n      VectorXd ref0 = V0.row(1) - V0.row(0);\n      VectorXd ref1 = V1.row(1) - V1.row(0);\n\n      ref0.normalize();\n      ref1.normalize();\n\n      double ktemp = atan2(ref1(1),ref1(0)) - atan2(ref0(1),ref0(0));\n\n      // just to be sure, rotate ref0 using angle ktemp...\n      MatrixXd R2(2,2);\n      R2 << cos(ktemp), -sin(ktemp), sin(ktemp), cos(ktemp);\n\n      tmp = R2*ref0.head<2>();\n\n      assert(tmp(0) - ref1(0) < (0.000001));\n      assert(tmp(1) - ref1(1) < (0.000001));\n\n      k[eid] = ktemp;\n    }\n  }\n\n}\n\n\n  void FrameInterpolator::frame2canonical(const Eigen::MatrixXd& TP, const Eigen::RowVectorXd& v, double& theta, Eigen::VectorXd& S_v)\n{\n  using namespace std;\n  using namespace Eigen;\n\n  RowVectorXd v0 = v.segment<3>(0);\n  RowVectorXd v1 = v.segment<3>(3);\n\n  // Project onto the tangent plane\n  Vector2d vp0 = TP * v0.transpose();\n  Vector2d vp1 = TP * v1.transpose();\n\n  // Assemble matrix\n  MatrixXd M(2,2);\n  M << vp0, vp1;\n\n  if (M.determinant() < 0)\n    M.col(1) = -M.col(1);\n\n  assert(M.determinant() > 0);\n\n  // cerr << \"M: \" << M << endl;\n\n  MatrixXd R,S;\n  PolarDecomposition(M,R,S);\n\n  // Finally, express the cross field as an angle\n  theta = atan2(R(1,0),R(0,0));\n\n  MatrixXd R2(2,2);\n  R2 << cos(theta), -sin(theta), sin(theta), cos(theta);\n\n  assert((R2-R).norm() < 10e-8);\n\n  // Convert into rotation invariant form\n  S = R * S * R.inverse();\n\n  // Copy in vector form\n  S_v = VectorXd(3);\n  S_v << S(0,0), S(0,1), S(1,1);\n}\n\n  void FrameInterpolator::canonical2frame(const Eigen::MatrixXd& TP, const double theta, const Eigen::VectorXd& S_v, Eigen::RowVectorXd& v)\n{\n  using namespace std;\n  using namespace Eigen;\n\n  assert(S_v.size() == 3);\n\n  MatrixXd S_temp(2,2);\n  S_temp << S_v(0), S_v(1), S_v(1), S_v(2);\n\n  // Convert angle in vector in the tangent plane\n  // Vector2d vp(cos(theta),sin(theta));\n\n  // First reconstruct R\n  MatrixXd R(2,2);\n\n  R << cos(theta), -sin(theta), sin(theta), cos(theta);\n\n  // Rotation invariant reconstruction\n  MatrixXd M = S_temp * R;\n\n  Vector2d vp0(M(0,0),M(1,0));\n  Vector2d vp1(M(0,1),M(1,1));\n\n  // Unproject the vectors\n  RowVectorXd v0 = vp0.transpose() * TP;\n  RowVectorXd v1 = vp1.transpose() * TP;\n\n  v.resize(6);\n  v << v0, v1;\n}\n\nvoid FrameInterpolator::solve()\n{\n  interpolateCross();\n  interpolateSymmetric();\n}\n\nvoid FrameInterpolator::interpolateSymmetric()\n{\n  using namespace std;\n  using namespace Eigen;\n\n  // Generate uniform Laplacian matrix\n  typedef Eigen::Triplet<double> triplet;\n  std::vector<triplet> triplets;\n\n  // Variables are stacked as x1,y1,z1,x2,y2,z2\n  triplets.reserve(3*4*F.rows());\n\n  MatrixXd b = MatrixXd::Zero(3*F.rows(),1);\n\n  // Build L and b\n  for (unsigned eid=0; eid<EF.rows(); ++eid)\n  {\n    if (!isBorderEdge[eid])\n    {\n      for (int z=0;z<2;++z)\n      {\n        // W = [w_a, w_b\n        //      w_b, w_c]\n        //\n\n        // It is not symmetric\n        int i    = EF(eid,z==0?0:1);\n        int j    = EF(eid,z==0?1:0);\n\n        int w_a_0 = (i*3)+0;\n        int w_b_0 = (i*3)+1;\n        int w_c_0 = (i*3)+2;\n\n        int w_a_1 = (j*3)+0;\n        int w_b_1 = (j*3)+1;\n        int w_c_1 = (j*3)+2;\n\n        // Rotation to change frame\n        double r_a =  cos(z==1?k(eid):-k(eid));\n        double r_b = -sin(z==1?k(eid):-k(eid));\n        double r_c =  sin(z==1?k(eid):-k(eid));\n        double r_d =  cos(z==1?k(eid):-k(eid));\n\n        // First term\n        // w_a_0 = r_a^2 w_a_1 + 2 r_a r_b w_b_1 + r_b^2 w_c_1 = 0\n        triplets.push_back(triplet(w_a_0,w_a_0,                -1 ));\n        triplets.push_back(triplet(w_a_0,w_a_1,           r_a*r_a ));\n        triplets.push_back(triplet(w_a_0,w_b_1,       2 * r_a*r_b ));\n        triplets.push_back(triplet(w_a_0,w_c_1,           r_b*r_b ));\n\n        // Second term\n        // w_b_0 = r_a r_c w_a + (r_b r_c + r_a r_d) w_b + r_b r_d w_c\n        triplets.push_back(triplet(w_b_0,w_b_0,                -1 ));\n        triplets.push_back(triplet(w_b_0,w_a_1,           r_a*r_c ));\n        triplets.push_back(triplet(w_b_0,w_b_1, r_b*r_c + r_a*r_d ));\n        triplets.push_back(triplet(w_b_0,w_c_1,           r_b*r_d ));\n\n        // Third term\n        // w_c_0 = r_c^2 w_a + 2 r_c r_d w_b +  r_d^2 w_c\n        triplets.push_back(triplet(w_c_0,w_c_0,                -1 ));\n        triplets.push_back(triplet(w_c_0,w_a_1,           r_c*r_c ));\n        triplets.push_back(triplet(w_c_0,w_b_1,       2 * r_c*r_d ));\n        triplets.push_back(triplet(w_c_0,w_c_1,           r_d*r_d ));\n      }\n    }\n  }\n\n  SparseMatrix<double> L(3*F.rows(),3*F.rows());\n  L.setFromTriplets(triplets.begin(), triplets.end());\n\n  triplets.clear();\n\n  // Add soft constraints\n  double w = 100000;\n  for (unsigned fid=0; fid < F.rows(); ++fid)\n  {\n    if (S_c[fid])\n    {\n      for (unsigned i=0;i<3;++i)\n      {\n        triplets.push_back(triplet(3*fid + i,3*fid + i,w));\n        b(3*fid + i) += w*S(fid,i);\n      }\n    }\n  }\n\n  SparseMatrix<double> soft(3*F.rows(),3*F.rows());\n  soft.setFromTriplets(triplets.begin(), triplets.end());\n\n  SparseMatrix<double> M;\n\n  M = L + soft;\n\n  // Solve Lx = b;\n\n  SparseLU<SparseMatrix<double> > solver;\n\n  solver.compute(M);\n\n  if(solver.info()!=Success)\n  {\n    std::cerr << \"LU failed - frame_interpolator.cpp\" << std::endl;\n    assert(0);\n  }\n\n  MatrixXd x;\n  x = solver.solve(b);\n\n  if(solver.info()!=Success)\n  {\n    std::cerr << \"Linear solve failed - frame_interpolator.cpp\" << std::endl;\n    assert(0);\n  }\n\n  S = MatrixXd::Zero(F.rows(),3);\n\n  // Copy back the result\n  for (unsigned i=0;i<F.rows();++i)\n    S.row(i) << x(i*3+0), x(i*3+1), x(i*3+2);\n\n}\n\nvoid FrameInterpolator::setConstraint(const int fid, const Eigen::VectorXd& v)\n{\n  using namespace std;\n  using namespace Eigen;\n\n  double   t_;\n  VectorXd S_;\n\n  frame2canonical(TPs[fid],v,t_,S_);\n\n  Eigen::RowVectorXd v2;\n  canonical2frame(TPs[fid], t_, S_, v2);\n\n  thetas(fid)   = t_;\n  thetas_c[fid] = true;\n\n  S.row(fid) = S_;\n  S_c[fid]   = true;\n\n}\n\nEigen::MatrixXd FrameInterpolator::getFieldPerFace()\n{\n  using namespace std;\n  using namespace Eigen;\n\n  MatrixXd R(F.rows(),6);\n  for (unsigned i=0; i<F.rows(); ++i)\n  {\n    RowVectorXd v;\n    canonical2frame(TPs[i],thetas(i),S.row(i),v);\n    R.row(i) = v;\n  }\n  return R;\n}\n\n  void FrameInterpolator::PolarDecomposition(Eigen::MatrixXd V, Eigen::MatrixXd& U, Eigen::MatrixXd& P)\n{\n  using namespace std;\n  using namespace Eigen;\n\n  // Polar Decomposition\n  JacobiSVD<MatrixXd> svd(V,Eigen::ComputeFullU | Eigen::ComputeFullV);\n\n  U = svd.matrixU() * svd.matrixV().transpose();\n  P = svd.matrixV() * svd.singularValues().asDiagonal() * svd.matrixV().transpose();\n}\n\n}\n\n\nIGL_INLINE void igl::frame_field(\n                                 const Eigen::MatrixXd& V,\n                                 const Eigen::MatrixXi& F,\n                                 const Eigen::VectorXi& b,\n                                 const Eigen::MatrixXd& bc1,\n                                 const Eigen::MatrixXd& bc2,\n                                 Eigen::MatrixXd& FF1,\n                                 Eigen::MatrixXd& FF2\n                                 )\n\n{\n  using namespace std;\n  using namespace Eigen;\n\n  assert(b.size() > 0);\n\n  // Init Solver\n  FrameInterpolator field(V,F);\n\n  for (unsigned i=0; i<b.size(); ++i)\n  {\n    VectorXd t(6); t << bc1.row(i).transpose(), bc2.row(i).transpose();\n    field.setConstraint(b(i), t);\n  }\n\n  // Solve\n  field.solve();\n\n  // Copy back\n  MatrixXd R = field.getFieldPerFace();\n  FF1 = R.block(0, 0, R.rows(), 3);\n  FF2 = R.block(0, 3, R.rows(), 3);\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/comiso/frame_field.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_FRAMEFIELD_H\n#define IGL_FRAMEFIELD_H\n\n#include <igl/igl_inline.h>\n#include <Eigen/Dense>\n#include <vector>\n\nnamespace igl\n{\n// Generate a piecewise-constant frame-field field from a sparse set of constraints on faces\n// using the algorithm proposed in:\n// Frame Fields: Anisotropic and Non-Orthogonal Cross Fields\n// Daniele Panozzo, Enrico Puppo, Marco Tarini, Olga Sorkine-Hornung,\n// ACM Transactions on Graphics (SIGGRAPH, 2014)\n//\n// Inputs:\n//   V       #V by 3 list of mesh vertex coordinates\n//   F       #F by 3 list of mesh faces (must be triangles)\n//   b       #B by 1 list of constrained face indices\n//   bc1     #B by 3 list of the constrained first representative vector of the frame field (up to permutation and sign)\n//   bc2     #B by 3 list of the constrained second representative vector of the frame field (up to permutation and sign)\n//\n// Outputs:\n//   FF1      #F by 3 the first representative vector of the frame field (up to permutation and sign)\n//   FF2      #F by 3 the second representative vector of the frame field (up to permutation and sign)\n//\n// TODO: it now supports only soft constraints, should be extended to support both hard and soft constraints\nIGL_INLINE void frame_field(\n  const Eigen::MatrixXd& V,\n  const Eigen::MatrixXi& F,\n  const Eigen::VectorXi& b,\n  const Eigen::MatrixXd& bc1,\n  const Eigen::MatrixXd& bc2,\n  Eigen::MatrixXd& FF1,\n  Eigen::MatrixXd& FF2\n  );\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"frame_field.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/comiso/miq.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>, Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include <igl/comiso/miq.h>\n#include <igl/local_basis.h>\n#include <igl/triangle_triangle_adjacency.h>\n\n// includes for VertexIndexing\n#include <igl/HalfEdgeIterator.h>\n#include <igl/is_border_vertex.h>\n#include <igl/vertex_triangle_adjacency.h>\n\n\n// includes for poissonSolver\n#include <gmm/gmm.h>\n#include <CoMISo/Solver/ConstrainedSolver.hh>\n#include <CoMISo/Solver/MISolver.hh>\n#include <CoMISo/Solver/GMM_Tools.hh>\n#include <igl/doublearea.h>\n#include <igl/per_face_normals.h>\n\n//\n#include <igl/cross_field_missmatch.h>\n#include <igl/comb_frame_field.h>\n#include <igl/comb_cross_field.h>\n#include <igl/cut_mesh_from_singularities.h>\n#include <igl/find_cross_field_singularities.h>\n#include <igl/compute_frame_field_bisectors.h>\n#include <igl/rotate_vectors.h>\n\n\n// #define DEBUG_PRINT\n#include <fstream>\n#include <iostream>\n#include <igl/matlab_format.h>\nusing namespace std;\nusing namespace Eigen;\n\n#define DEBUGPRINT 0\n\n\nnamespace igl {\n\n  class SparseMatrixData{\n  protected:\n    unsigned int m_nrows;\n    unsigned int m_ncols;\n    std::vector<unsigned int> m_rowind;\n    std::vector<unsigned int> m_colind;\n    std::vector<double>       m_vals;\n\n  public:\n    unsigned int   nrows()    { return m_nrows      ; }\n    unsigned int   ncols()    { return m_ncols      ; }\n    unsigned int   nentries() { return m_vals.size(); }\n    std::vector<unsigned int>&  rowind()   { return m_rowind     ; }\n    std::vector<unsigned int>&  colind()   { return m_colind     ; }\n    std::vector<double>&        vals()     { return m_vals       ; }\n\n    // create an empty matrix with a fixed number of rows\n    IGL_INLINE SparseMatrixData()\n    {\n      initialize(0,0);\n    }\n\n    // create an empty matrix with a fixed number of rows\n    IGL_INLINE void initialize(int nr, int nc) {\n      assert(nr >= 0 && nc >=0);\n      m_nrows = nr;\n      m_ncols = nc;\n\n      m_rowind.resize(0);\n      m_colind.resize(0);\n      m_vals.resize(0);\n    }\n\n    // add a nonzero entry to the matrix\n    // no checks are done for coinciding entries\n    // the interpretation of the repeated entries (replace or add)\n    // depends on how the actual sparse matrix datastructure is constructed\n\n    IGL_INLINE void addEntryCmplx(unsigned int i, unsigned int j, std::complex<double> val) {\n      m_rowind.push_back(2*i);   m_colind.push_back(2*j);   m_vals.push_back( val.real());\n      m_rowind.push_back(2*i);   m_colind.push_back(2*j+1); m_vals.push_back(-val.imag());\n      m_rowind.push_back(2*i+1); m_colind.push_back(2*j);   m_vals.push_back( val.imag());\n      m_rowind.push_back(2*i+1); m_colind.push_back(2*j+1); m_vals.push_back( val.real());\n    }\n\n    IGL_INLINE void addEntryReal(unsigned int i, unsigned int j, double val) {\n      m_rowind.push_back(i);   m_colind.push_back(j);   m_vals.push_back(val);\n    }\n\n    IGL_INLINE virtual ~SparseMatrixData() {\n    }\n\n  };\n\n  // a small class to manage storage for matrix data\n  // not using stl vectors: want to make all memory management\n  // explicit to avoid hidden automatic reallocation\n  // TODO: redo with STL vectors but with explicit mem. management\n\n  class SparseSystemData {\n  private:\n    // matrix representation,  A[rowind[i],colind[i]] = vals[i]\n    // right-hand side\n    SparseMatrixData m_A;\n    double       *m_b;\n    double       *m_x;\n\n  public:\n    IGL_INLINE SparseMatrixData& A() { return m_A; }\n    IGL_INLINE double*        b()        { return m_b       ; }\n    IGL_INLINE double*        x()        { return m_x       ; }\n    IGL_INLINE unsigned int   nrows()    { return  m_A.nrows(); }\n\n  public:\n\n    IGL_INLINE SparseSystemData(): m_A(), m_b(NULL), m_x(NULL){ }\n\n    IGL_INLINE void initialize(unsigned int nr, unsigned int nc) {\n      m_A.initialize(nr,nc);\n      m_b      = new          double[nr];\n      m_x      = new          double[nr];\n      assert(m_b);\n      std::fill( m_b,  m_b+nr, 0.);\n    }\n\n    IGL_INLINE void addRHSCmplx(unsigned int i, std::complex<double> val) {\n      assert( 2*i+1 < m_A.nrows());\n      m_b[2*i] += val.real(); m_b[2*i+1] += val.imag();\n    }\n\n    IGL_INLINE void setRHSCmplx(unsigned int i, std::complex<double> val) {\n      assert( 2*i+1 < m_A.nrows());\n      m_b[2*i] = val.real(); m_b[2*i+1] = val.imag();\n    }\n\n    IGL_INLINE std::complex<double> getRHSCmplx(unsigned int i) {\n      assert( 2*i+1 < m_A.nrows());\n      return std::complex<double>( m_b[2*i], m_b[2*i+1]);\n    }\n\n    IGL_INLINE double getRHSReal(unsigned int i) {\n      assert( i < m_A.nrows());\n      return m_b[i];\n    }\n\n    IGL_INLINE std::complex<double> getXCmplx(unsigned int i) {\n      assert( 2*i+1 < m_A.nrows());\n      return std::complex<double>( m_x[2*i], m_x[2*i+1]);\n    }\n\n    IGL_INLINE void cleanMem() {\n      //m_A.cleanup();\n      delete [] m_b;\n      delete [] m_x;\n    }\n\n    IGL_INLINE virtual ~SparseSystemData() {\n      delete [] m_b;\n      delete [] m_x;\n    }\n  };\n\n  struct SeamInfo\n  {\n    int v0,v0p,v1,v1p;\n    int integerVar;\n    unsigned char MMatch;\n\n    IGL_INLINE SeamInfo(int _v0,\n                        int _v1,\n                        int _v0p,\n                        int _v1p,\n                        int _MMatch,\n                        int _integerVar);\n\n    IGL_INLINE SeamInfo(const SeamInfo &S1);\n  };\n\n  struct MeshSystemInfo\n  {\n    ///total number of scalar variables\n    int num_scalar_variables;\n    ////number of vertices variables\n    int num_vert_variables;\n    ///num of integer for cuts\n    int num_integer_cuts;\n    ///this are used for drawing purposes\n    std::vector<SeamInfo> EdgeSeamInfo;\n#if 0\n    ///this are values of integer variables after optimization\n    std::vector<int> IntegerValues;\n#endif\n  };\n\n\n  template <typename DerivedV, typename DerivedF>\n  class VertexIndexing\n  {\n  public:\n    // Input:\n    const Eigen::PlainObjectBase<DerivedV> &V;\n    const Eigen::PlainObjectBase<DerivedF> &F;\n    const Eigen::PlainObjectBase<DerivedF> &TT;\n    const Eigen::PlainObjectBase<DerivedF> &TTi;\n    // const Eigen::PlainObjectBase<DerivedV> &PD1;\n    // const Eigen::PlainObjectBase<DerivedV> &PD2;\n\n    const Eigen::Matrix<int, Eigen::Dynamic, 3> &Handle_MMatch;\n    // const Eigen::Matrix<int, Eigen::Dynamic, 1> &Handle_Singular; // bool\n    // const Eigen::Matrix<int, Eigen::Dynamic, 1> &Handle_SingularDegree; // vertex;\n    const Eigen::Matrix<int, Eigen::Dynamic, 3> &Handle_Seams; // 3 bool\n\n\n    ///this handle for mesh TODO: move with the other global variables\n    MeshSystemInfo Handle_SystemInfo;\n\n    // Output:\n    ///this maps the integer for edge - face\n    Eigen::MatrixXi Handle_Integer; // TODO: remove it is useless\n\n    ///per face indexes of vertex in the solver\n    Eigen::MatrixXi HandleS_Index;\n\n    ///per vertex variable indexes\n    std::vector<std::vector<int> > HandleV_Integer;\n\n    // internal\n    std::vector<std::vector<int> > VF, VFi;\n    std::vector<bool> V_border; // bool\n\n    IGL_INLINE VertexIndexing(const Eigen::PlainObjectBase<DerivedV> &_V,\n                              const Eigen::PlainObjectBase<DerivedF> &_F,\n                              const Eigen::PlainObjectBase<DerivedF> &_TT,\n                              const Eigen::PlainObjectBase<DerivedF> &_TTi,\n                              //  const Eigen::PlainObjectBase<DerivedV> &_PD1,\n                              //  const Eigen::PlainObjectBase<DerivedV> &_PD2,\n                              const Eigen::Matrix<int, Eigen::Dynamic, 3> &_Handle_MMatch,\n                              //  const Eigen::Matrix<int, Eigen::Dynamic, 1> &_Handle_Singular,\n                              //  const Eigen::Matrix<int, Eigen::Dynamic, 1> &_Handle_SingularDegree,\n                              const Eigen::Matrix<int, Eigen::Dynamic, 3> &_Handle_Seams\n                              );\n\n    ///vertex to variable mapping\n    IGL_INLINE void InitMapping();\n\n    IGL_INLINE void InitFaceIntegerVal();\n\n    IGL_INLINE void InitSeamInfo();\n\n\n  private:\n    ///this maps back index to vertices\n    std::vector<int> IndexToVert; // TODO remove it is useless\n\n    ///this is used for drawing purposes\n    std::vector<int> duplicated; // TODO remove it is useless\n\n    IGL_INLINE void FirstPos(const int v, int &f, int &edge);\n\n    IGL_INLINE int AddNewIndex(const int v0);\n\n    IGL_INLINE bool HasIndex(int indexVert,int indexVar);\n\n    IGL_INLINE void GetSeamInfo(const int f0,\n                                const int f1,\n                                const int indexE,\n                                int &v0,int &v1,\n                                int &v0p,int &v1p,\n                                unsigned char &_MMatch,\n                                int &integerVar);\n    IGL_INLINE bool IsSeam(const int f0, const int f1);\n\n    ///find initial position of the pos to\n    // assing face to vert inxex correctly\n    IGL_INLINE void FindInitialPos(const int vert, int &edge, int &face);\n\n\n    ///intialize the mapping given an initial pos\n    ///whih must be initialized with FindInitialPos\n    IGL_INLINE void MapIndexes(const int  vert, const int edge_init, const int f_init);\n\n    ///intialize the mapping for a given vertex\n    IGL_INLINE void InitMappingSeam(const int vert);\n\n    ///intialize the mapping for a given sampled mesh\n    IGL_INLINE void InitMappingSeam();\n\n    ///test consistency of face variables per vert mapping\n    IGL_INLINE void TestSeamMappingFace(const int f);\n\n    ///test consistency of face variables per vert mapping\n    IGL_INLINE void TestSeamMappingVertex(int indexVert);\n\n    ///check consistency of variable mapping across seams\n    IGL_INLINE void TestSeamMapping();\n\n  };\n\n\n  template <typename DerivedV, typename DerivedF>\n  class PoissonSolver\n  {\n\n  public:\n    IGL_INLINE void SolvePoisson(Eigen::VectorXd Stiffness,\n                                 double vector_field_scale=0.1f,\n                                 double grid_res=1.f,\n                                 bool direct_round=true,\n                                 int localIter=0,\n                                 bool _integer_rounding=true,\n                                 bool _singularity_rounding=true,\n                                 std::vector<int> roundVertices = std::vector<int>(),\n                                 std::vector<std::vector<int> > hardFeatures = std::vector<std::vector<int> >());\n\n    IGL_INLINE PoissonSolver(const Eigen::PlainObjectBase<DerivedV> &_V,\n                             const Eigen::PlainObjectBase<DerivedF> &_F,\n                             const Eigen::PlainObjectBase<DerivedF> &_TT,\n                             const Eigen::PlainObjectBase<DerivedF> &_TTi,\n                             const Eigen::PlainObjectBase<DerivedV> &_PD1,\n                             const Eigen::PlainObjectBase<DerivedV> &_PD2,\n                             const Eigen::MatrixXi &_HandleS_Index,\n                             const Eigen::Matrix<int, Eigen::Dynamic, 1>&_Handle_Singular,\n                             const MeshSystemInfo &_Handle_SystemInfo\n                             );\n\n    const Eigen::PlainObjectBase<DerivedV> &V;\n    const Eigen::PlainObjectBase<DerivedF> &F;\n    const Eigen::PlainObjectBase<DerivedF> &TT;\n    const Eigen::PlainObjectBase<DerivedF> &TTi;\n    const Eigen::PlainObjectBase<DerivedV> &PD1;\n    const Eigen::PlainObjectBase<DerivedV> &PD2;\n    const Eigen::Matrix<int, Eigen::Dynamic, 1> &Handle_Singular; // bool\n    const Eigen::MatrixXi &HandleS_Index; //todo\n\n    const MeshSystemInfo &Handle_SystemInfo;\n\n    // Internal:\n    Eigen::MatrixXd doublearea;\n    Eigen::VectorXd Handle_Stiffness;\n    Eigen::PlainObjectBase<DerivedV> N;\n    std::vector<std::vector<int> > VF;\n    std::vector<std::vector<int> > VFi;\n    Eigen::MatrixXd UV; // this is probably useless\n\n    // Output:\n    // per wedge UV coordinates, 6 coordinates (1 face) per row\n    Eigen::MatrixXd WUV;\n\n    ///solver data\n    SparseSystemData S;\n\n    ///vector of unknowns\n    std::vector< double > X;\n\n    ////REAL PART\n    ///number of fixed vertex\n    unsigned int n_fixed_vars;\n\n    ///the number of REAL variables for vertices\n    unsigned int n_vert_vars;\n\n    ///total number of variables of the system,\n    ///do not consider constraints, but consider integer vars\n    unsigned int num_total_vars;\n\n    //////INTEGER PART\n    ///the total number of integer variables\n    unsigned int n_integer_vars;\n\n    ///CONSTRAINT PART\n    ///number of cuts constraints\n    unsigned int num_cut_constraint;\n\n    // number of user-defined constraints\n    unsigned int num_userdefined_constraint;\n\n    ///total number of constraints equations\n    unsigned int num_constraint_equations;\n\n    ///total size of the system including constraints\n    unsigned int system_size;\n\n    ///if you intend to make integer rotation\n    ///and translations\n    bool integer_jumps_bary;\n\n    ///vector of blocked vertices\n    std::vector<int> Hard_constraints;\n\n    ///vector of indexes to round\n    std::vector<int> ids_to_round;\n\n    ///vector of indexes to round\n    std::vector<std::vector<int > > userdefined_constraints;\n\n    ///boolean that is true if rounding to integer is needed\n    bool integer_rounding;\n\n    ///START SYSTEM ACCESS METHODS\n    ///add an entry to the LHS\n    IGL_INLINE void AddValA(int Xindex,\n                            int Yindex,\n                            double val);\n\n    ///add a complex entry to the LHS\n    IGL_INLINE void AddComplexA(int VarXindex,\n                                int VarYindex,\n                                std::complex<double> val);\n\n    ///add a velue to the RHS\n    IGL_INLINE void AddValB(int Xindex,\n                            double val);\n\n    ///add the area term, scalefactor is used to sum up\n    ///and normalize on the overlap zones\n    IGL_INLINE void AddAreaTerm(int index[3][3][2],double ScaleFactor);\n\n    ///set the diagonal of the matrix (which is zero at the beginning)\n    ///such that the sum of a row or a colums is zero\n    IGL_INLINE void SetDiagonal(double val[3][3]);\n\n    ///given a vector of scalar values and\n    ///a vector of indexes add such values\n    ///as specified by the indexes\n    IGL_INLINE void AddRHS(double b[6],\n                           int index[3]);\n\n    ///add a 3x3 block matrix to the system matrix...\n    ///indexes are specified in the 3x3 matrix of x,y pairs\n    ///indexes must be multiplied by 2 cause u and v\n    IGL_INLINE void Add33Block(double val[3][3], int index[3][3][2]);\n\n    ///add a 3x3 block matrix to the system matrix...\n    ///indexes are specified in the 3x3 matrix of x,y pairs\n    ///indexes must be multiplied by 2 cause u and v\n    IGL_INLINE void Add44Block(double val[4][4],int index[4][4][2]);\n    ///END SYSTEM ACCESS METHODS\n\n    ///START COMMON MATH FUNCTIONS\n    ///return the complex encoding the rotation\n    ///for a given missmatch interval\n    IGL_INLINE std::complex<double> GetRotationComplex(int interval);\n    ///END COMMON MATH FUNCTIONS\n\n\n    ///START ENERGY MINIMIZATION PART\n    ///initialize the LHS for a given face\n    ///for minimization of Dirichlet's energy\n    IGL_INLINE void perElementLHS(int f,\n                                  double val[3][3],\n                                  int index[3][3][2]);\n\n    ///initialize the RHS for a given face\n    ///for minimization of Dirichlet's energy\n    IGL_INLINE void perElementRHS(int f,\n                                  double b[6],\n                                  double vector_field_scale=1);\n\n    ///evaluate the LHS and RHS for a single face\n    ///for minimization of Dirichlet's energy\n    IGL_INLINE void PerElementSystemReal(int f,\n                                         double val[3][3],\n                                         int index[3][3][2],\n                                         double b[6],\n                                         double vector_field_scale=1.0);\n    ///END ENERGY MINIMIZATION PART\n\n    ///START FIXING VERTICES\n    ///set a given vertex as fixed\n    IGL_INLINE void AddFixedVertex(int v);\n\n    ///find vertex to fix in case we're using\n    ///a vector field NB: multiple components not handled\n    IGL_INLINE void FindFixedVertField();\n\n    ///find hard constraint depending if using or not\n    ///a vector field\n    IGL_INLINE void FindFixedVert();\n\n    IGL_INLINE int GetFirstVertexIndex(int v);\n\n    ///fix the vertices which are flagged as fixed\n    IGL_INLINE void FixBlockedVertex();\n    ///END FIXING VERTICES\n\n    ///HANDLING SINGULARITY\n    //set the singularity round to integer location\n    IGL_INLINE void AddSingularityRound();\n\n    IGL_INLINE void AddToRoundVertices(std::vector<int> ids);\n\n    ///START GENERIC SYSTEM FUNCTIONS\n    //build the laplacian matrix cyclyng over all rangemaps\n    //and over all faces\n    IGL_INLINE void BuildLaplacianMatrix(double vfscale=1);\n\n    ///find different sized of the system\n    IGL_INLINE void FindSizes();\n\n    IGL_INLINE void AllocateSystem();\n\n    ///intitialize the whole matrix\n    IGL_INLINE void InitMatrix();\n\n    ///map back coordinates after that\n    ///the system has been solved\n    IGL_INLINE void MapCoords();\n    ///END GENERIC SYSTEM FUNCTIONS\n\n    ///set the constraints for the inter-range cuts\n    IGL_INLINE void BuildSeamConstraintsExplicitTranslation();\n\n    ///set the constraints for the inter-range cuts\n    IGL_INLINE void BuildUserDefinedConstraints();\n\n    ///call of the mixed integer solver\n    IGL_INLINE void MixedIntegerSolve(double cone_grid_res=1,\n                                      bool direct_round=true,\n                                      int localIter=0);\n\n    IGL_INLINE void clearUserConstraint();\n\n    IGL_INLINE void addSharpEdgeConstraint(int fid, int vid);\n\n  };\n\n  template <typename DerivedV, typename DerivedF, typename DerivedU>\n  class MIQ_class\n  {\n  private:\n    const Eigen::PlainObjectBase<DerivedV> &V;\n    const Eigen::PlainObjectBase<DerivedF> &F;\n    Eigen::MatrixXd WUV;\n    // internal\n    Eigen::PlainObjectBase<DerivedF> TT;\n    Eigen::PlainObjectBase<DerivedF> TTi;\n\n    // Stiffness per face\n    Eigen::VectorXd Handle_Stiffness;\n    Eigen::PlainObjectBase<DerivedV> B1, B2, B3;\n\n  public:\n    IGL_INLINE MIQ_class(const Eigen::PlainObjectBase<DerivedV> &V_,\n                         const Eigen::PlainObjectBase<DerivedF> &F_,\n                         const Eigen::PlainObjectBase<DerivedV> &PD1_combed,\n                         const Eigen::PlainObjectBase<DerivedV> &PD2_combed,\n                         // const Eigen::PlainObjectBase<DerivedV> &BIS1_combed,\n                         // const Eigen::PlainObjectBase<DerivedV> &BIS2_combed,\n                         const Eigen::Matrix<int, Eigen::Dynamic, 3> &Handle_MMatch,\n                         const Eigen::Matrix<int, Eigen::Dynamic, 1> &Handle_Singular,\n                         // const Eigen::Matrix<int, Eigen::Dynamic, 1> &Handle_SingularDegree,\n                         const Eigen::Matrix<int, Eigen::Dynamic, 3> &Handle_Seams,\n                         Eigen::PlainObjectBase<DerivedU> &UV,\n                         Eigen::PlainObjectBase<DerivedF> &FUV,\n                         double GradientSize = 30.0,\n                         double Stiffness = 5.0,\n                         bool DirectRound = false,\n                         int iter = 5,\n                         int localIter = 5,\n                         bool DoRound = true,\n                         bool SingularityRound=true,\n                         std::vector<int> roundVertices = std::vector<int>(),\n                         std::vector<std::vector<int> > hardFeatures = std::vector<std::vector<int> >());\n\n\n    IGL_INLINE void extractUV(Eigen::PlainObjectBase<DerivedU> &UV_out,\n                              Eigen::PlainObjectBase<DerivedF> &FUV_out);\n\n  private:\n    IGL_INLINE int NumFlips(const Eigen::MatrixXd& WUV);\n\n    IGL_INLINE double Distortion(int f, double h, const Eigen::MatrixXd& WUV);\n\n    IGL_INLINE double LaplaceDistortion(const int f, double h, const Eigen::MatrixXd& WUV);\n\n    IGL_INLINE bool updateStiffeningJacobianDistorsion(double grad_size, const Eigen::MatrixXd& WUV);\n\n    IGL_INLINE bool IsFlipped(const Eigen::Vector2d &uv0,\n                              const Eigen::Vector2d &uv1,\n                              const Eigen::Vector2d &uv2);\n\n    IGL_INLINE bool IsFlipped(const int i, const Eigen::MatrixXd& WUV);\n\n  };\n};\n\nIGL_INLINE igl::SeamInfo::SeamInfo(int _v0,\n                                   int _v1,\n                                   int _v0p,\n                                   int _v1p,\n                                   int _MMatch,\n                                   int _integerVar)\n{\n  v0=_v0;\n  v1=_v1;\n  v0p=_v0p;\n  v1p=_v1p;\n  integerVar=_integerVar;\n  MMatch=_MMatch;\n}\n\nIGL_INLINE igl::SeamInfo::SeamInfo(const SeamInfo &S1)\n{\n  v0=S1.v0;\n  v1=S1.v1;\n  v0p=S1.v0p;\n  v1p=S1.v1p;\n  integerVar=S1.integerVar;\n  MMatch=S1.MMatch;\n}\n\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE igl::VertexIndexing<DerivedV, DerivedF>::VertexIndexing(const Eigen::PlainObjectBase<DerivedV> &_V,\n                                                                   const Eigen::PlainObjectBase<DerivedF> &_F,\n                                                                   const Eigen::PlainObjectBase<DerivedF> &_TT,\n                                                                   const Eigen::PlainObjectBase<DerivedF> &_TTi,\n                                                                   // const Eigen::PlainObjectBase<DerivedV> &_PD1,\n                                                                   // const Eigen::PlainObjectBase<DerivedV> &_PD2,\n                                                                   const Eigen::Matrix<int, Eigen::Dynamic, 3> &_Handle_MMatch,\n                                                                   // const Eigen::Matrix<int, Eigen::Dynamic, 1> &_Handle_Singular,\n                                                                   // const Eigen::Matrix<int, Eigen::Dynamic, 1> &_Handle_SingularDegree,\n                                                                   const Eigen::Matrix<int, Eigen::Dynamic, 3> &_Handle_Seams\n\n                                                                   ):\nV(_V),\nF(_F),\nTT(_TT),\nTTi(_TTi),\n// PD1(_PD1),\n// PD2(_PD2),\nHandle_MMatch(_Handle_MMatch),\n// Handle_Singular(_Handle_Singular),\n// Handle_SingularDegree(_Handle_SingularDegree),\nHandle_Seams(_Handle_Seams)\n{\n  #ifdef DEBUG_PRINT\n  cerr<<igl::matlab_format(Handle_Seams,\"Handle_Seams\");\n#endif\n  V_border = igl::is_border_vertex(V,F);\n  igl::vertex_triangle_adjacency(V,F,VF,VFi);\n\n  IndexToVert.clear();\n\n  Handle_SystemInfo.num_scalar_variables=0;\n  Handle_SystemInfo.num_vert_variables=0;\n  Handle_SystemInfo.num_integer_cuts=0;\n\n  duplicated.clear();\n\n  HandleS_Index = Eigen::MatrixXi::Constant(F.rows(),3,-1);\n\n  Handle_Integer = Eigen::MatrixXi::Constant(F.rows(),3,-1);\n\n  HandleV_Integer.resize(V.rows());\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::VertexIndexing<DerivedV, DerivedF>::FirstPos(const int v, int &f, int &edge)\n{\n  f    = VF[v][0];  // f=v->cVFp();\n  edge = VFi[v][0]; // edge=v->cVFi();\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE int igl::VertexIndexing<DerivedV, DerivedF>::AddNewIndex(const int v0)\n{\n  Handle_SystemInfo.num_scalar_variables++;\n  HandleV_Integer[v0].push_back(Handle_SystemInfo.num_scalar_variables);\n  IndexToVert.push_back(v0);\n  return Handle_SystemInfo.num_scalar_variables;\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE bool igl::VertexIndexing<DerivedV, DerivedF>::HasIndex(int indexVert,int indexVar)\n{\n  for (unsigned int i=0;i<HandleV_Integer[indexVert].size();i++)\n    if (HandleV_Integer[indexVert][i]==indexVar)return true;\n  return false;\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::VertexIndexing<DerivedV, DerivedF>::GetSeamInfo(const int f0,\n                                                                     const int f1,\n                                                                     const int indexE,\n                                                                     int &v0,int &v1,\n                                                                     int &v0p,int &v1p,\n                                                                     unsigned char &_MMatch,\n                                                                     int &integerVar)\n{\n  int edgef0 = indexE;\n  v0 = HandleS_Index(f0,edgef0);\n  v1 = HandleS_Index(f0,(edgef0+1)%3);\n  ////get the index on opposite side\n  assert(TT(f0,edgef0) == f1);\n  int edgef1 = TTi(f0,edgef0);\n  v1p = HandleS_Index(f1,edgef1);\n  v0p = HandleS_Index(f1,(edgef1+1)%3);\n\n  integerVar = Handle_Integer(f0,edgef0);\n  _MMatch = Handle_MMatch(f0,edgef0);\n  assert(F(f0,edgef0)         == F(f1,((edgef1+1)%3)));\n  assert(F(f0,((edgef0+1)%3)) == F(f1,edgef1));\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE bool igl::VertexIndexing<DerivedV, DerivedF>::IsSeam(const int f0, const int f1)\n{\n  for (int i=0;i<3;i++)\n  {\n    int f_clos = TT(f0,i);\n\n    if (f_clos == -1)\n      continue; ///border\n\n    if (f_clos == f1)\n      return(Handle_Seams(f0,i));\n  }\n  assert(0);\n  return false;\n}\n\n///find initial position of the pos to\n// assing face to vert inxex correctly\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::VertexIndexing<DerivedV, DerivedF>::FindInitialPos(const int vert,\n                                                                        int &edge,\n                                                                        int &face)\n{\n  int f_init;\n  int edge_init;\n  FirstPos(vert,f_init,edge_init); // todo manually IGL_INLINE the function\n  igl::HalfEdgeIterator<DerivedF> VFI(&F,&TT,&TTi,f_init,edge_init);\n\n#ifdef DEBUG_PRINT\n  cerr<<\"--FindInitialPos--\"<<endl;\n#endif\n  bool vertexB = V_border[vert];\n  bool possible_split=false;\n  bool complete_turn=false;\n  do\n  {\n    int curr_f = VFI.Fi();\n    int curr_edge=VFI.Ei();\n#ifdef DEBUG_PRINT\n    cerr<<\"@ face \"<<curr_f<<\", edge \"<< F(curr_f,curr_edge)<<\" - \"<< F(curr_f,(curr_edge+1)%3)<<endl;\n#endif\n    VFI.NextFE();\n    int next_f=VFI.Fi();\n#ifdef DEBUG_PRINT\n    cerr<<\"next face \"<<next_f<<\", edge \"<< F(next_f,VFI.Ei())<<\" - \"<< F(next_f,(VFI.Ei()+1)%3)<<endl;\n#endif\n    ///test if I've just crossed a border\n    bool on_border=(TT(curr_f,curr_edge)==-1);\n#ifdef DEBUG_PRINT\n    cerr<<\"on_border: \"<<on_border<<endl;\n#endif\n    //bool mismatch=false;\n    bool seam=false;\n\n    #ifdef DEBUG_PRINT\n    cerr<<igl::matlab_format(Handle_Seams,\"Handle_Seams\");\n    #endif\n    ///or if I've just crossed a seam\n    ///if I'm on a border I MUST start from the one next t othe border\n    if (!vertexB)\n      //seam=curr_f->IsSeam(next_f);\n      seam=IsSeam(curr_f,next_f);\n    // if (vertexB)\n    // assert(!Handle_Singular(vert));\n    // ;\n    //assert(!vert->IsSingular());\n#ifdef DEBUG_PRINT\n    cerr<<\"seam: \"<<seam<<endl;\n#endif\n    possible_split=((on_border)||(seam));\n#ifdef DEBUG_PRINT\n    cerr<<\"possible_split: \"<<possible_split<<endl;\n#endif\n    complete_turn = next_f == f_init;\n#ifdef DEBUG_PRINT\n    cerr<<\"complete_turn: \"<<complete_turn<<endl;\n#endif\n  } while ((!possible_split)&&(!complete_turn));\n  face=VFI.Fi();\n  edge=VFI.Ei();\n#ifdef DEBUG_PRINT\n  cerr<<\"FindInitialPos done. Face: \"<<face<<\", edge: \"<< F(face,edge)<<\" - \"<< F(face,(edge+1)%3)<<endl;\n#endif\n  ///test that is not on a border\n  //assert(face->FFp(edge)!=face);\n}\n\n\n\n///intialize the mapping given an initial pos\n///whih must be initialized with FindInitialPos\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::VertexIndexing<DerivedV, DerivedF>::MapIndexes(const int  vert,\n                                                                    const int edge_init,\n                                                                    const int f_init)\n{\n  ///check that is not on border..\n  ///in such case maybe it's non manyfold\n  ///insert an initial index\n  int curr_index=AddNewIndex(vert);\n#ifdef DEBUG_PRINT\n  cerr<<\"--MapIndexes--\"<<endl;\n#endif\n#ifdef DEBUG_PRINT\n  cerr<<\"adding vertex for \"<<vert<<endl;\n#endif\n  ///and initialize the jumping pos\n  igl::HalfEdgeIterator<DerivedF> VFI(&F,&TT,&TTi,f_init,edge_init);\n  bool complete_turn=false;\n  do\n  {\n    int curr_f = VFI.Fi();\n    int curr_edge = VFI.Ei();\n#ifdef DEBUG_PRINT\n    cerr<<\"Adding vertex \"<<curr_index<<\" to face \"<<curr_f<<\", edge \"<< F(curr_f,curr_edge)<<\" - \"<< F(curr_f,(curr_edge+1)%3)<<endl;\n#endif\n    ///assing the current index\n    HandleS_Index(curr_f,curr_edge) = curr_index;\n#ifdef DEBUG_PRINT\n    cerr<<igl::matlab_format(HandleS_Index,\"HandleS_Index\")<<endl;\n#endif\n    VFI.NextFE();\n    int next_f = VFI.Fi();\n#ifdef DEBUG_PRINT\n    cerr<<\"next face \"<<next_f<<\", edge \"<< F(next_f,VFI.Ei())<<\" - \"<< F(next_f,(VFI.Ei()+1)%3)<<endl;\n#endif\n    ///test if I've finiseh with the face exploration\n    complete_turn = (next_f==f_init);\n#ifdef DEBUG_PRINT\n    cerr<<\"complete_turn: \"<<complete_turn<<endl;\n#endif\n    ///or if I've just crossed a mismatch\n    if (!complete_turn)\n    {\n      bool seam=false;\n      //seam=curr_f->IsSeam(next_f);\n      seam=IsSeam(curr_f,next_f);\n      if (seam)\n      {\n        ///then add a new index\n        curr_index=AddNewIndex(vert);\n#ifdef DEBUG_PRINT\n        cerr<<\"Found a seam, adding vertex for \"<<vert<<endl;\n#endif\n      }\n    }\n  } while (!complete_turn);\n}\n\n///intialize the mapping for a given vertex\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::VertexIndexing<DerivedV, DerivedF>::InitMappingSeam(const int vert)\n{\n  ///first rotate until find the first pos after a mismatch\n  ///or a border or return to the first position...\n  int f_init = VF[vert][0];\n  int indexE = VFi[vert][0];\n\n  igl::HalfEdgeIterator<DerivedF> VFI(&F,&TT,&TTi,f_init,indexE);\n\n  int edge_init;\n  int face_init;\n#ifdef DEBUG_PRINT\n  cerr<<\"---Vertex: \"<<vert<<\"---\"<<endl;\n#endif\n  FindInitialPos(vert,edge_init,face_init);\n  MapIndexes(vert,edge_init,face_init);\n}\n\n///intialize the mapping for a given sampled mesh\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::VertexIndexing<DerivedV, DerivedF>::InitMappingSeam()\n{\n  //num_scalar_variables=-1;\n  Handle_SystemInfo.num_scalar_variables=-1;\n  for (unsigned int i=0;i<V.rows();i++)\n    InitMappingSeam(i);\n\n  for (unsigned int j=0;j<V.rows();j++)\n  {\n    assert(HandleV_Integer[j].size()>0);\n    if (HandleV_Integer[j].size()>1)\n      duplicated.push_back(j);\n  }\n}\n\n///test consistency of face variables per vert mapping\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::VertexIndexing<DerivedV, DerivedF>::TestSeamMappingFace(const int f)\n{\n  for (int k=0;k<3;k++)\n  {\n    int indexV=HandleS_Index(f,k);\n    int v = F(f,k);\n    bool has_index=HasIndex(v,indexV);\n    assert(has_index);\n  }\n}\n\n///test consistency of face variables per vert mapping\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::VertexIndexing<DerivedV, DerivedF>::TestSeamMappingVertex(int indexVert)\n{\n  for (unsigned int k=0;k<HandleV_Integer[indexVert].size();k++)\n  {\n    int indexV=HandleV_Integer[indexVert][k];\n\n    ///get faces sharing vertex\n    std::vector<int> faces = VF[indexVert];\n    std::vector<int> indexes = VFi[indexVert];\n\n    for (unsigned int j=0;j<faces.size();j++)\n    {\n      int f = faces[j];\n      int index = indexes[j];\n      assert(F(f,index) == indexVert);\n      assert((index>=0)&&(index<3));\n\n      if (HandleS_Index(f,index) == indexV)\n        return;\n    }\n  }\n  assert(0);\n}\n\n\n///check consistency of variable mapping across seams\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::VertexIndexing<DerivedV, DerivedF>::TestSeamMapping()\n{\n  printf(\"\\n TESTING SEAM INDEXES \\n\");\n  ///test F-V mapping\n  for (unsigned int j=0;j<F.rows();j++)\n    TestSeamMappingFace(j);\n\n  ///TEST  V-F MAPPING\n  for (unsigned int j=0;j<V.rows();j++)\n    TestSeamMappingVertex(j);\n\n}\n\n\n///vertex to variable mapping\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::VertexIndexing<DerivedV, DerivedF>::InitMapping()\n{\n  //use_direction_field=_use_direction_field;\n\n  IndexToVert.clear();\n  duplicated.clear();\n\n  InitMappingSeam();\n\n  Handle_SystemInfo.num_vert_variables=Handle_SystemInfo.num_scalar_variables+1;\n\n  ///end testing...\n  TestSeamMapping();\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::VertexIndexing<DerivedV, DerivedF>::InitFaceIntegerVal()\n{\n  Handle_SystemInfo.num_integer_cuts=0;\n  for (unsigned int j=0;j<F.rows();j++)\n  {\n    for (int k=0;k<3;k++)\n    {\n      if (Handle_Seams(j,k))\n      {\n        Handle_Integer(j,k) = Handle_SystemInfo.num_integer_cuts;\n        Handle_SystemInfo.num_integer_cuts++;\n      }\n      else\n        Handle_Integer(j,k)=-1;\n    }\n  }\n}\n\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::VertexIndexing<DerivedV, DerivedF>::InitSeamInfo()\n{\n  Handle_SystemInfo.EdgeSeamInfo.clear();\n  for (unsigned int f0=0;f0<F.rows();f0++)\n  {\n    for (int k=0;k<3;k++)\n    {\n      int f1 = TT(f0,k);\n\n      if (f1 == -1)\n        continue;\n\n      bool seam = Handle_Seams(f0,k);\n      if (seam)\n      {\n        int v0,v0p,v1,v1p;\n        unsigned char MM;\n        int integerVar;\n        GetSeamInfo(f0,f1,k,v0,v1,v0p,v1p,MM,integerVar);\n        Handle_SystemInfo.EdgeSeamInfo.push_back(SeamInfo(v0,v1,v0p,v1p,MM,integerVar));\n      }\n    }\n  }\n}\n\n\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::PoissonSolver<DerivedV, DerivedF>::SolvePoisson(Eigen::VectorXd Stiffness,\n                                                                     double vector_field_scale,\n                                                                     double grid_res,\n                                                                     bool direct_round,\n                                                                     int localIter,\n                                                                     bool _integer_rounding,\n                                                                     bool _singularity_rounding,\n                                                                     std::vector<int> roundVertices,\n                                                                     std::vector<std::vector<int> > hardFeatures)\n{\n  Handle_Stiffness = Stiffness;\n\n  //initialization of flags and data structures\n  integer_rounding=_integer_rounding;\n\n  ids_to_round.clear();\n\n  clearUserConstraint();\n  // copy the user constraints number\n  for (size_t i = 0; i < hardFeatures.size(); ++i)\n  {\n    addSharpEdgeConstraint(hardFeatures[i][0],hardFeatures[i][1]);\n  }\n\n  ///Initializing Matrix\n\n  int t0=clock();\n\n  ///initialize the matrix ALLOCATING SPACE\n  InitMatrix();\n  if (DEBUGPRINT)\n    printf(\"\\n ALLOCATED THE MATRIX \\n\");\n\n  ///build the laplacian system\n  BuildLaplacianMatrix(vector_field_scale);\n\n  // add seam constraints\n  BuildSeamConstraintsExplicitTranslation();\n\n  // add user defined constraints\n  BuildUserDefinedConstraints();\n\n  ////add the lagrange multiplier\n  FixBlockedVertex();\n\n  if (DEBUGPRINT)\n    printf(\"\\n BUILT THE MATRIX \\n\");\n\n  if (integer_rounding)\n    AddToRoundVertices(roundVertices);\n\n  if (_singularity_rounding)\n    AddSingularityRound();\n\n  int t1=clock();\n  if (DEBUGPRINT) printf(\"\\n time:%d \\n\",t1-t0);\n  if (DEBUGPRINT) printf(\"\\n SOLVING \\n\");\n\n  MixedIntegerSolve(grid_res,direct_round,localIter);\n\n  int t2=clock();\n  if (DEBUGPRINT) printf(\"\\n time:%d \\n\",t2-t1);\n  if (DEBUGPRINT) printf(\"\\n ASSIGNING COORDS \\n\");\n\n  MapCoords();\n\n  int t3=clock();\n  if (DEBUGPRINT) printf(\"\\n time:%d \\n\",t3-t2);\n  if (DEBUGPRINT) printf(\"\\n FINISHED \\n\");\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE igl::PoissonSolver<DerivedV, DerivedF>\n::PoissonSolver(const Eigen::PlainObjectBase<DerivedV> &_V,\n                const Eigen::PlainObjectBase<DerivedF> &_F,\n                const Eigen::PlainObjectBase<DerivedF> &_TT,\n                const Eigen::PlainObjectBase<DerivedF> &_TTi,\n                const Eigen::PlainObjectBase<DerivedV> &_PD1,\n                const Eigen::PlainObjectBase<DerivedV> &_PD2,\n                const Eigen::MatrixXi &_HandleS_Index,\n                const Eigen::Matrix<int, Eigen::Dynamic, 1>&_Handle_Singular,\n                const MeshSystemInfo &_Handle_SystemInfo //todo: const?\n):\nV(_V),\nF(_F),\nTT(_TT),\nTTi(_TTi),\nPD1(_PD1),\nPD2(_PD2),\nHandleS_Index(_HandleS_Index),\nHandle_Singular(_Handle_Singular),\nHandle_SystemInfo(_Handle_SystemInfo)\n{\n  UV        = Eigen::MatrixXd(V.rows(),2);\n  WUV       = Eigen::MatrixXd(F.rows(),6);\n  igl::doublearea(V,F,doublearea);\n  igl::per_face_normals(V,F,N);\n  igl::vertex_triangle_adjacency(V,F,VF,VFi);\n}\n\n\n///START SYSTEM ACCESS METHODS\n///add an entry to the LHS\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::PoissonSolver<DerivedV, DerivedF>::AddValA(int Xindex,\n                                                                int Yindex,\n                                                                double val)\n{\n  int size=(int)S.nrows();\n  assert(0 <= Xindex && Xindex < size);\n  assert(0 <= Yindex && Yindex < size);\n  S.A().addEntryReal(Xindex,Yindex,val);\n}\n\n///add a complex entry to the LHS\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::PoissonSolver<DerivedV, DerivedF>::AddComplexA(int VarXindex,\n                                                                    int VarYindex,\n                                                                    std::complex<double> val)\n{\n  int size=(int)S.nrows()/2;\n  assert(0 <= VarXindex && VarXindex < size);\n  assert(0 <= VarYindex && VarYindex < size);\n  S.A().addEntryCmplx(VarXindex,VarYindex,val);\n}\n\n///add a velue to the RHS\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::PoissonSolver<DerivedV, DerivedF>::AddValB(int Xindex,\n                                                                double val)\n{\n  int size=(int)S.nrows();\n  assert(0 <= Xindex && Xindex < size);\n  S.b()[Xindex] += val;\n}\n\n///add the area term, scalefactor is used to sum up\n///and normalize on the overlap zones\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::PoissonSolver<DerivedV, DerivedF>::AddAreaTerm(int index[3][3][2],double ScaleFactor)\n{\n  const double entry = 0.5*ScaleFactor;\n  double val[3][3]= {\n    {0,       entry, -entry},\n    {-entry,      0,  entry},\n    {entry,  -entry,      0}\n  };\n\n  for (int i=0;i<3;i++)\n    for (int j=0;j<3;j++)\n    {\n      ///add for both u and v\n      int Xindex=index[i][j][0]*2;\n      int Yindex=index[i][j][1]*2;\n\n      AddValA(Xindex+1,Yindex,-val[i][j]);\n      AddValA(Xindex,Yindex+1,val[i][j]);\n    }\n}\n\n///set the diagonal of the matrix (which is zero at the beginning)\n///such that the sum of a row or a colums is zero\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::PoissonSolver<DerivedV, DerivedF>::SetDiagonal(double val[3][3])\n{\n  for (int i=0;i<3;i++)\n  {\n    double sum=0;\n    for (int j=0;j<3;j++)\n      sum+=val[i][j];\n    val[i][i]=-sum;\n  }\n}\n\n///given a vector of scalar values and\n///a vector of indexes add such values\n///as specified by the indexes\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::PoissonSolver<DerivedV, DerivedF>::AddRHS(double b[6],\n                                                               int index[3])\n{\n  for (int i=0;i<3;i++)\n  {\n    double valU=b[i*2];\n    double valV=b[(i*2)+1];\n    AddValB((index[i]*2),valU);\n    AddValB((index[i]*2)+1,valV);\n  }\n}\n\n///add a 3x3 block matrix to the system matrix...\n///indexes are specified in the 3x3 matrix of x,y pairs\n///indexes must be multiplied by 2 cause u and v\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::PoissonSolver<DerivedV, DerivedF>::Add33Block(double val[3][3], int index[3][3][2])\n{\n  for (int i=0;i<3;i++)\n    for (int j=0;j<3;j++)\n    {\n      ///add for both u and v\n      int Xindex=index[i][j][0]*2;\n      int Yindex=index[i][j][1]*2;\n      assert((unsigned)Xindex<(n_vert_vars*2));\n      assert((unsigned)Yindex<(n_vert_vars*2));\n      AddValA(Xindex,Yindex,val[i][j]);\n      AddValA(Xindex+1,Yindex+1,val[i][j]);\n    }\n}\n\n///add a 3x3 block matrix to the system matrix...\n///indexes are specified in the 3x3 matrix of x,y pairs\n///indexes must be multiplied by 2 cause u and v\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::PoissonSolver<DerivedV, DerivedF>::Add44Block(double val[4][4],int index[4][4][2])\n{\n  for (int i=0;i<4;i++)\n    for (int j=0;j<4;j++)\n    {\n      ///add for both u and v\n      int Xindex=index[i][j][0]*2;\n      int Yindex=index[i][j][1]*2;\n      assert((unsigned)Xindex<(n_vert_vars*2));\n      assert((unsigned)Yindex<(n_vert_vars*2));\n      AddValA(Xindex,Yindex,val[i][j]);\n      AddValA(Xindex+1,Yindex+1,val[i][j]);\n    }\n}\n///END SYSTEM ACCESS METHODS\n\n///START COMMON MATH FUNCTIONS\n///return the complex encoding the rotation\n///for a given missmatch interval\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE std::complex<double> igl::PoissonSolver<DerivedV, DerivedF>::GetRotationComplex(int interval)\n{\n  assert((interval>=0)&&(interval<4));\n\n  switch(interval)\n  {\n    case 0:return std::complex<double>(1,0);\n    case 1:return std::complex<double>(0,1);\n    case 2:return std::complex<double>(-1,0);\n    default:return std::complex<double>(0,-1);\n  }\n}\n\n///END COMMON MATH FUNCTIONS\n\n\n///START ENERGY MINIMIZATION PART\n///initialize the LHS for a given face\n///for minimization of Dirichlet's energy\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::PoissonSolver<DerivedV, DerivedF>::perElementLHS(int f,\n                                                                      double val[3][3],\n                                                                      int index[3][3][2])\n{\n  ///initialize to zero\n  for (int x=0;x<3;x++)\n    for (int y=0;y<3;y++)\n      val[x][y]=0;\n\n  ///get the vertices\n  int v[3];\n  v[0] = F(f,0);\n  v[1] = F(f,1);\n  v[2] = F(f,2);\n\n  ///get the indexes of vertex instance (to consider cuts)\n  ///for the current face\n  int Vindexes[3];\n  Vindexes[0]=HandleS_Index(f,0);\n  Vindexes[1]=HandleS_Index(f,1);\n  Vindexes[2]=HandleS_Index(f,2);\n\n  ///initialize the indexes for the block\n  for (int x=0;x<3;x++)\n    for (int y=0;y<3;y++)\n    {\n      index[x][y][0]=Vindexes[x];\n      index[x][y][1]=Vindexes[y];\n    }\n\n  ///initialize edges\n  Eigen::Matrix<typename DerivedV::Scalar, 3, 1> e[3];\n  for (int k=0;k<3;k++)\n    e[k] = V.row(v[(k+2)%3]) - V.row(v[(k+1)%3]);\n\n  ///then consider area but also considering scale factor dur to overlaps\n\n  double areaT = doublearea(f)/2.0;\n\n  for (int x=0;x<3;x++)\n    for (int y=0;y<3;y++)\n      if (x!=y)\n      {\n        double num =  (e[x].dot(e[y]));\n        val[x][y]  =  num/(4.0*areaT);\n        val[x][y]  *= Handle_Stiffness[f];//f->stiffening;\n      }\n\n  ///set the matrix as diagonal\n  SetDiagonal(val);\n}\n\n///initialize the RHS for a given face\n///for minimization of Dirichlet's energy\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::PoissonSolver<DerivedV, DerivedF>::perElementRHS(int f,\n                                                                      double b[6],\n                                                                      double vector_field_scale)\n{\n\n  /// then set the rhs\n  Eigen::Matrix<typename DerivedV::Scalar, 3, 1> scaled_Kreal;\n  Eigen::Matrix<typename DerivedV::Scalar, 3, 1> scaled_Kimag;\n  Eigen::Matrix<typename DerivedV::Scalar, 3, 1> fNorm = N.row(f);\n  Eigen::Matrix<typename DerivedV::Scalar, 3, 1> p[3];\n  p[0] = V.row(F(f,0));\n  p[1] = V.row(F(f,1));\n  p[2] = V.row(F(f,2));\n\n  Eigen::Matrix<typename DerivedV::Scalar, 3, 1> neg_t[3];\n  neg_t[0] = fNorm.cross(p[2] - p[1]);\n  neg_t[1] = fNorm.cross(p[0] - p[2]);\n  neg_t[2] = fNorm.cross(p[1] - p[0]);\n\n  Eigen::Matrix<typename DerivedV::Scalar, 3, 1> K1,K2;\n  K1 = PD1.row(f);\n  K2 = -PD2.row(f); // TODO: the \"-\" accounts for the orientation of local_basis.h, adapt the code before and remove the \"-\"\n\n  scaled_Kreal = K1*(vector_field_scale)/2;\n  scaled_Kimag = K2*(vector_field_scale)/2;\n\n  double stiff_val = Handle_Stiffness[f];\n\n  b[0] = scaled_Kreal.dot(neg_t[0]) * stiff_val;\n  b[1] = scaled_Kimag.dot(neg_t[0]) * stiff_val;\n  b[2] = scaled_Kreal.dot(neg_t[1]) * stiff_val;\n  b[3] = scaled_Kimag.dot(neg_t[1]) * stiff_val;\n  b[4] = scaled_Kreal.dot(neg_t[2]) * stiff_val;\n  b[5] = scaled_Kimag.dot(neg_t[2]) * stiff_val;\n\n  //    if (f == 0)\n  //    {\n  //      cerr << \"DEBUG!!!\" << endl;\n  //\n  //\n  //      for (unsigned z = 0; z<6; ++z)\n  //        cerr << b[z] << \" \";\n  //      cerr << endl;\n  //\n  //      scaled_Kreal = K1*(vector_field_scale)/2;\n  //      scaled_Kimag = -K2*(vector_field_scale)/2;\n  //\n  //      double stiff_val = Handle_Stiffness[f];\n  //\n  //      b[0] = scaled_Kreal.dot(neg_t[0]) * stiff_val;\n  //      b[1] = scaled_Kimag.dot(neg_t[0]) * stiff_val;\n  //      b[2] = scaled_Kreal.dot(neg_t[1]) * stiff_val;\n  //      b[3] = scaled_Kimag.dot(neg_t[1]) * stiff_val;\n  //      b[4] = scaled_Kreal.dot(neg_t[2]) * stiff_val;\n  //      b[5] = scaled_Kimag.dot(neg_t[2]) * stiff_val;\n  //\n  //      for (unsigned z = 0; z<6; ++z)\n  //        cerr << b[z] << \" \";\n  //      cerr << endl;\n  //\n  //    }\n\n}\n\n///evaluate the LHS and RHS for a single face\n///for minimization of Dirichlet's energy\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::PoissonSolver<DerivedV, DerivedF>::PerElementSystemReal(int f,\n                                                                             double val[3][3],\n                                                                             int index[3][3][2],\n                                                                             double b[6],\n                                                                             double vector_field_scale)\n{\n  perElementLHS(f,val,index);\n  perElementRHS(f,b,vector_field_scale);\n}\n///END ENERGY MINIMIZATION PART\n\n///START FIXING VERTICES\n///set a given vertex as fixed\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::PoissonSolver<DerivedV, DerivedF>::AddFixedVertex(int v)\n{\n  n_fixed_vars++;\n  Hard_constraints.push_back(v);\n}\n\n///find vertex to fix in case we're using\n///a vector field NB: multiple components not handled\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::PoissonSolver<DerivedV, DerivedF>::FindFixedVertField()\n{\n  Hard_constraints.clear();\n\n  n_fixed_vars=0;\n  //fix the first singularity\n  for (unsigned int v=0;v<V.rows();v++)\n  {\n    if (Handle_Singular(v))\n    {\n      AddFixedVertex(v);\n      UV.row(v) << 0,0;\n      return;\n    }\n  }\n\n  ///if anything fixed fix the first\n  AddFixedVertex(0); // TODO HERE IT ISSSSSS\n  UV.row(0) << 0,0;\n  std::cerr << \"No vertices to fix, I am fixing the first vertex to the origin!\" << std::endl;\n}\n\n///find hard constraint depending if using or not\n///a vector field\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::PoissonSolver<DerivedV, DerivedF>::FindFixedVert()\n{\n  Hard_constraints.clear();\n  FindFixedVertField();\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE int igl::PoissonSolver<DerivedV, DerivedF>::GetFirstVertexIndex(int v)\n{\n  return HandleS_Index(VF[v][0],VFi[v][0]);\n}\n\n///fix the vertices which are flagged as fixed\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::PoissonSolver<DerivedV, DerivedF>::FixBlockedVertex()\n{\n  int offset_row = n_vert_vars*2 + num_cut_constraint*2;\n\n  unsigned int constr_num = 0;\n  for (unsigned int i=0;i<Hard_constraints.size();i++)\n  {\n    int v = Hard_constraints[i];\n\n    ///get first index of the vertex that must blocked\n    //int index=v->vertex_index[0];\n    int index = GetFirstVertexIndex(v);\n\n    ///multiply times 2 because of uv\n    int indexvert = index*2;\n\n    ///find the first free row to add the constraint\n    int indexRow = (offset_row+constr_num*2);\n    int indexCol = indexRow;\n\n    ///add fixing constraint LHS\n    AddValA(indexRow,indexvert,1);\n    AddValA(indexRow+1,indexvert+1,1);\n\n    ///add fixing constraint RHS\n    AddValB(indexCol,  UV(v,0));\n    AddValB(indexCol+1,UV(v,1));\n\n    constr_num++;\n  }\n  assert(constr_num==n_fixed_vars);\n}\n///END FIXING VERTICES\n\n///HANDLING SINGULARITY\n//set the singularity round to integer location\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::PoissonSolver<DerivedV, DerivedF>::AddSingularityRound()\n{\n  for (unsigned int v=0;v<V.rows();v++)\n  {\n    if (Handle_Singular(v))\n    {\n      int index0=GetFirstVertexIndex(v);\n      ids_to_round.push_back( index0*2   );\n      ids_to_round.push_back((index0*2)+1);\n    }\n  }\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::PoissonSolver<DerivedV, DerivedF>::AddToRoundVertices(std::vector<int> ids)\n{\n  for (size_t i = 0; i < ids.size(); ++i)\n  {\n    if (ids[i] < 0 || ids[i] >= V.rows())\n      std::cerr << \"WARNING: Ignored round vertex constraint, vertex \" << ids[i] << \" does not exist in the mesh.\" << std::endl;\n    int index0 = GetFirstVertexIndex(ids[i]);\n    ids_to_round.push_back( index0*2   );\n    ids_to_round.push_back((index0*2)+1);\n  }\n}\n\n///START GENERIC SYSTEM FUNCTIONS\n//build the laplacian matrix cyclyng over all rangemaps\n//and over all faces\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::PoissonSolver<DerivedV, DerivedF>::BuildLaplacianMatrix(double vfscale)\n{\n  ///then for each face\n  for (unsigned int f=0;f<F.rows();f++)\n  {\n\n    int var_idx[3]; //vertex variable indices\n\n    for(int k = 0; k < 3; ++k)\n      var_idx[k] = HandleS_Index(f,k);\n\n    ///block of variables\n    double val[3][3];\n    ///block of vertex indexes\n    int index[3][3][2];\n    ///righe hand side\n    double b[6];\n    ///compute the system for the given face\n    PerElementSystemReal(f, val,index, b, vfscale);\n\n    //Add the element to the matrix\n    Add33Block(val,index);\n\n    ///add right hand side\n    AddRHS(b,var_idx);\n  }\n}\n\n///find different sized of the system\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::PoissonSolver<DerivedV, DerivedF>::FindSizes()\n{\n  ///find the vertex that need to be fixed\n  FindFixedVert();\n\n  ///REAL PART\n  n_vert_vars = Handle_SystemInfo.num_vert_variables;\n\n  ///INTEGER PART\n  ///the total number of integer variables\n  n_integer_vars = Handle_SystemInfo.num_integer_cuts;\n\n  ///CONSTRAINT PART\n  num_cut_constraint = Handle_SystemInfo.EdgeSeamInfo.size()*2;\n\n  num_constraint_equations = num_cut_constraint*2 + n_fixed_vars*2 + num_userdefined_constraint;\n\n  ///total variable of the system\n  num_total_vars = n_vert_vars*2+n_integer_vars*2;\n\n  ///initialize matrix size\n\n  system_size = num_total_vars + num_constraint_equations;\n\n  if (DEBUGPRINT)     printf(\"\\n*** SYSTEM VARIABLES *** \\n\");\n  if (DEBUGPRINT)     printf(\"* NUM REAL VERTEX VARIABLES %d \\n\",n_vert_vars);\n\n  if (DEBUGPRINT)     printf(\"\\n*** SINGULARITY *** \\n \");\n  if (DEBUGPRINT)     printf(\"* NUM SINGULARITY %d\\n\",(int)ids_to_round.size()/2);\n\n  if (DEBUGPRINT)     printf(\"\\n*** INTEGER VARIABLES *** \\n\");\n  if (DEBUGPRINT)     printf(\"* NUM INTEGER VARIABLES %d \\n\",(int)n_integer_vars);\n\n  if (DEBUGPRINT)     printf(\"\\n*** CONSTRAINTS *** \\n \");\n  if (DEBUGPRINT)     printf(\"* NUM FIXED CONSTRAINTS %d\\n\",n_fixed_vars);\n  if (DEBUGPRINT)     printf(\"* NUM CUTS CONSTRAINTS %d\\n\",num_cut_constraint);\n  if (DEBUGPRINT)     printf(\"* NUM USER DEFINED CONSTRAINTS %d\\n\",num_userdefined_constraint);\n\n  if (DEBUGPRINT)     printf(\"\\n*** TOTAL SIZE *** \\n\");\n  if (DEBUGPRINT)     printf(\"* TOTAL VARIABLE SIZE (WITH INTEGER TRASL) %d \\n\",num_total_vars);\n  if (DEBUGPRINT)     printf(\"* TOTAL CONSTRAINTS %d \\n\",num_constraint_equations);\n  if (DEBUGPRINT)     printf(\"* MATRIX SIZE  %d \\n\",system_size);\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::PoissonSolver<DerivedV, DerivedF>::AllocateSystem()\n{\n  S.initialize(system_size, system_size);\n  printf(\"\\n INITIALIZED SPARSE MATRIX OF %d x %d \\n\",system_size, system_size);\n}\n\n///intitialize the whole matrix\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::PoissonSolver<DerivedV, DerivedF>::InitMatrix()\n{\n  FindSizes();\n  AllocateSystem();\n}\n\n///map back coordinates after that\n///the system has been solved\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::PoissonSolver<DerivedV, DerivedF>::MapCoords()\n{\n  ///map coords to faces\n  for (unsigned int f=0;f<F.rows();f++)\n  {\n\n    for (int k=0;k<3;k++)\n    {\n      //get the index of the variable in the system\n      int indexUV = HandleS_Index(f,k);\n      ///then get U and V coords\n      double U=X[indexUV*2];\n      double V=X[indexUV*2+1];\n\n      WUV(f,k*2 + 0) = U;\n      WUV(f,k*2 + 1) = V;\n    }\n  }\n\n#if 0\n  ///initialize the vector of integer variables to return their values\n  Handle_SystemInfo.IntegerValues.resize(n_integer_vars*2);\n  int baseIndex = (n_vert_vars)*2;\n  int endIndex  = baseIndex+n_integer_vars*2;\n  int index     = 0;\n  for (int i=baseIndex; i<endIndex; i++)\n  {\n    ///assert that the value is an integer value\n    double value=X[i];\n    double diff = value-(int)floor(value+0.5);\n    assert(diff<0.00000001);\n    Handle_SystemInfo.IntegerValues[index] = value;\n    index++;\n  }\n#endif\n}\n\n///END GENERIC SYSTEM FUNCTIONS\n\n///set the constraints for the inter-range cuts\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::PoissonSolver<DerivedV, DerivedF>::BuildSeamConstraintsExplicitTranslation()\n{\n  ///add constraint(s) for every seam edge (not halfedge)\n  int offset_row = n_vert_vars;\n  ///current constraint row\n  int constr_row = offset_row;\n  ///current constraint\n  unsigned int constr_num = 0;\n\n  for (unsigned int i=0; i<num_cut_constraint/2; i++)\n  {\n    unsigned char interval = Handle_SystemInfo.EdgeSeamInfo[i].MMatch;\n    if (interval==1)\n      interval=3;\n    else\n      if(interval==3)\n        interval=1;\n\n    int p0  = Handle_SystemInfo.EdgeSeamInfo[i].v0;\n    int p1  = Handle_SystemInfo.EdgeSeamInfo[i].v1;\n    int p0p = Handle_SystemInfo.EdgeSeamInfo[i].v0p;\n    int p1p = Handle_SystemInfo.EdgeSeamInfo[i].v1p;\n\n    std::complex<double> rot = GetRotationComplex(interval);\n\n    ///get the integer variable\n    int integerVar = offset_row+Handle_SystemInfo.EdgeSeamInfo[i].integerVar;\n\n    if (integer_rounding)\n    {\n      ids_to_round.push_back(integerVar*2);\n      ids_to_round.push_back(integerVar*2+1);\n    }\n\n    AddComplexA(constr_row, p0 ,  rot);\n    AddComplexA(constr_row, p0p,   -1);\n    ///then translation...considering the rotation\n    ///due to substitution\n    AddComplexA(constr_row, integerVar, 1);\n\n    AddValB(2*constr_row  ,0);\n    AddValB(2*constr_row+1,0);\n    constr_row +=1;\n    constr_num++;\n\n    AddComplexA(constr_row, p1,  rot);\n    AddComplexA(constr_row, p1p, -1);\n\n    ///other translation\n    AddComplexA(constr_row, integerVar  , 1);\n\n    AddValB(2*constr_row,0);\n    AddValB(2*constr_row+1,0);\n\n    constr_row +=1;\n    constr_num++;\n  }\n}\n\n///set the constraints for the inter-range cuts\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::PoissonSolver<DerivedV, DerivedF>::BuildUserDefinedConstraints()\n{\n  /// the user defined constraints are at the end\n  int offset_row = n_vert_vars*2 + num_cut_constraint*2 + n_fixed_vars*2;\n\n  ///current constraint row\n  int constr_row = offset_row;\n\n  assert(num_userdefined_constraint == userdefined_constraints.size());\n\n  for (unsigned int i=0; i<num_userdefined_constraint; i++)\n  {\n    for (unsigned int j=0; j<userdefined_constraints[i].size()-1; ++j)\n    {\n      AddValA(constr_row, j ,  userdefined_constraints[i][j]);\n    }\n\n    AddValB(constr_row,userdefined_constraints[i][userdefined_constraints[i].size()-1]);\n\n    constr_row +=1;\n  }\n}\n\n///call of the mixed integer solver\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::PoissonSolver<DerivedV, DerivedF>::MixedIntegerSolve(double cone_grid_res,\n                                                                          bool direct_round,\n                                                                          int localIter)\n{\n  X = std::vector<double>((n_vert_vars+n_integer_vars)*2);\n\n  ///variables part\n  int ScalarSize = n_vert_vars*2;\n  int SizeMatrix = (n_vert_vars+n_integer_vars)*2;\n\n  if (DEBUGPRINT)\n    printf(\"\\n ALLOCATED X \\n\");\n\n  ///matrix A\n  gmm::col_matrix< gmm::wsvector< double > > A(SizeMatrix,SizeMatrix); // lhs matrix variables +\n\n  ///constraints part\n  int CsizeX = num_constraint_equations;\n  int CsizeY = SizeMatrix+1;\n  gmm::row_matrix< gmm::wsvector< double > > C(CsizeX,CsizeY); // constraints\n\n  if (DEBUGPRINT)\n    printf(\"\\n ALLOCATED QMM STRUCTURES \\n\");\n\n  std::vector<double> rhs(SizeMatrix,0);  // rhs\n\n  if (DEBUGPRINT)\n    printf(\"\\n ALLOCATED RHS STRUCTURES \\n\");\n\n  //// copy LHS\n  for(int i = 0; i < (int)S.A().nentries(); ++i)\n  {\n    int row  = S.A().rowind()[i];\n    int col  = S.A().colind()[i];\n    int size =(int)S.nrows();\n    assert(0 <= row && row < size);\n    assert(0 <= col && col < size);\n\n    // it's either part of the matrix\n    if (row < ScalarSize)\n    {\n      A(row, col) += S.A().vals()[i];\n    }\n    // or it's a part of the constraint\n    else\n    {\n      assert ((unsigned int)row < (n_vert_vars+num_constraint_equations)*2);\n      int r = row - ScalarSize;\n      assert(r   < CsizeX);\n      assert(col < CsizeY);\n      C(r  , col  ) +=  S.A().vals()[i];\n    }\n  }\n\n  if (DEBUGPRINT)\n    printf(\"\\n SET %d INTEGER VALUES \\n\",n_integer_vars);\n\n  ///add penalization term for integer variables\n  double penalization = 0.000001;\n  int offline_index   = ScalarSize;\n  for(unsigned int i = 0; i < (n_integer_vars)*2; ++i)\n  {\n    int index=offline_index+i;\n    A(index,index)=penalization;\n  }\n\n  if (DEBUGPRINT)\n    printf(\"\\n SET RHS \\n\");\n\n  // copy RHS\n  for(int i = 0; i < (int)ScalarSize; ++i)\n  {\n    rhs[i] = S.getRHSReal(i) * cone_grid_res;\n  }\n\n  // copy constraint RHS\n  if (DEBUGPRINT)\n    printf(\"\\n SET %d CONSTRAINTS \\n\",num_constraint_equations);\n\n  for(unsigned int i = 0; i < num_constraint_equations; ++i)\n  {\n    C(i, SizeMatrix) = -S.getRHSReal(ScalarSize + i) * cone_grid_res;\n  }\n\n  ///copy values back into S\n  COMISO::ConstrainedSolver solver;\n\n  solver.misolver().set_local_iters(localIter);\n\n  solver.misolver().set_direct_rounding(direct_round);\n\n  std::sort(ids_to_round.begin(),ids_to_round.end());\n  std::vector<int>::iterator new_end=std::unique(ids_to_round.begin(),ids_to_round.end());\n  int dist=distance(ids_to_round.begin(),new_end);\n  ids_to_round.resize(dist);\n\n  solver.solve( C, A, X, rhs, ids_to_round, 0.0, false, false);\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::PoissonSolver<DerivedV, DerivedF>::clearUserConstraint()\n{\n  num_userdefined_constraint = 0;\n  userdefined_constraints.clear();\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::PoissonSolver<DerivedV, DerivedF>::addSharpEdgeConstraint(int fid, int vid)\n{\n  // prepare constraint\n  std::vector<int> c(Handle_SystemInfo.num_vert_variables*2 + 1);\n\n  for (size_t i = 0; i < c.size(); ++i)\n  {\n    c[i] = 0;\n  }\n\n  int v1 = F(fid,vid);\n  int v2 = F(fid,(vid+1)%3);\n\n  Eigen::Matrix<typename DerivedV::Scalar, 3, 1> e = V.row(v2) - V.row(v1);\n  e = e.normalized();\n\n  int v1i = HandleS_Index(fid,vid);//GetFirstVertexIndex(v1);\n  int v2i = HandleS_Index(fid,(vid+1)%3);//GetFirstVertexIndex(v2);\n\n  double d1 = fabs(e.dot(PD1.row(fid).normalized()));\n  double d2 = fabs(e.dot(PD2.row(fid).normalized()));\n\n  int offset = 0;\n\n  if (d1>d2)\n    offset = 1;\n\n  ids_to_round.push_back((v1i * 2) + offset);\n  ids_to_round.push_back((v2i * 2) + offset);\n\n  // add constraint\n  c[(v1i * 2) + offset] =  1;\n  c[(v2i * 2) + offset] = -1;\n\n  // add to the user-defined constraints\n  num_userdefined_constraint++;\n  userdefined_constraints.push_back(c);\n\n}\n\n\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedU>\nIGL_INLINE igl::MIQ_class<DerivedV, DerivedF, DerivedU>::MIQ_class(const Eigen::PlainObjectBase<DerivedV> &V_,\n                                                                   const Eigen::PlainObjectBase<DerivedF> &F_,\n                                                                   const Eigen::PlainObjectBase<DerivedV> &PD1_combed,\n                                                                   const Eigen::PlainObjectBase<DerivedV> &PD2_combed,\n                                                                   // const Eigen::PlainObjectBase<DerivedV> &BIS1_combed,\n                                                                   // const Eigen::PlainObjectBase<DerivedV> &BIS2_combed,\n                                                                   const Eigen::Matrix<int, Eigen::Dynamic, 3> &Handle_MMatch,\n                                                                   const Eigen::Matrix<int, Eigen::Dynamic, 1> &Handle_Singular,\n                                                                   // const Eigen::Matrix<int, Eigen::Dynamic, 1> &Handle_SingularDegree,\n                                                                   const Eigen::Matrix<int, Eigen::Dynamic, 3> &Handle_Seams,\n                                                                   Eigen::PlainObjectBase<DerivedU> &UV,\n                                                                   Eigen::PlainObjectBase<DerivedF> &FUV,\n                                                                   double GradientSize,\n                                                                   double Stiffness,\n                                                                   bool DirectRound,\n                                                                   int iter,\n                                                                   int localIter,\n                                                                   bool DoRound,\n                                                                   bool SingularityRound,\n                                                                   std::vector<int> roundVertices,\n                                                                   std::vector<std::vector<int> > hardFeatures):\nV(V_),\nF(F_)\n{\n  igl::local_basis(V,F,B1,B2,B3);\n  igl::triangle_triangle_adjacency(V,F,TT,TTi);\n\n  // Prepare indexing for the linear system\n  VertexIndexing<DerivedV, DerivedF> VInd(V, F, TT, TTi, /*BIS1_combed, BIS2_combed,*/ Handle_MMatch, /*Handle_Singular, Handle_SingularDegree,*/ Handle_Seams);\n\n  VInd.InitMapping();\n  VInd.InitFaceIntegerVal();\n  VInd.InitSeamInfo();\n\n  // Eigen::PlainObjectBase<DerivedV> PD1_combed_for_poisson, PD2_combed_for_poisson;\n  // // Rotate by 90 degrees CCW\n  // PD1_combed_for_poisson.setZero(PD1_combed.rows(),3);\n  // PD2_combed_for_poisson.setZero(PD2_combed.rows(),3);\n  // for (unsigned i=0; i<PD1_combed.rows();++i)\n  // {\n  //   double n1 = PD1_combed.row(i).norm();\n  //   double n2 = PD2_combed.row(i).norm();\n  //\n  //   double a1 = atan2(B2.row(i).dot(PD1_combed.row(i)),B1.row(i).dot(PD1_combed.row(i)));\n  //   double a2 = atan2(B2.row(i).dot(PD2_combed.row(i)),B1.row(i).dot(PD2_combed.row(i)));\n  //\n  //   // a1 += M_PI/2;\n  //   // a2 += M_PI/2;\n  //\n  //\n  //   PD1_combed_for_poisson.row(i) = cos(a1) * B1.row(i) + sin(a1) * B2.row(i);\n  //   PD2_combed_for_poisson.row(i) = cos(a2) * B1.row(i) + sin(a2) * B2.row(i);\n  //\n  //   PD1_combed_for_poisson.row(i) = PD1_combed_for_poisson.row(i).normalized() * n1;\n  //   PD2_combed_for_poisson.row(i) = PD2_combed_for_poisson.row(i).normalized() * n2;\n  // }\n\n\n  // Assemble the system and solve\n  PoissonSolver<DerivedV, DerivedF> PSolver(V,\n                                            F,\n                                            TT,\n                                            TTi,\n                                            PD1_combed,\n                                            PD2_combed,\n                                            VInd.HandleS_Index,\n                                            /*VInd.Handle_Singular*/Handle_Singular,\n                                            VInd.Handle_SystemInfo);\n  Handle_Stiffness = Eigen::VectorXd::Constant(F.rows(),1);\n\n\n  if (iter > 0) // do stiffening\n  {\n    for (int i=0;i<iter;i++)\n    {\n      PSolver.SolvePoisson(Handle_Stiffness, GradientSize,1.f,DirectRound,localIter,DoRound,SingularityRound,roundVertices,hardFeatures);\n      int nflips=NumFlips(PSolver.WUV);\n      bool folded = updateStiffeningJacobianDistorsion(GradientSize,PSolver.WUV);\n      printf(\"ITERATION %d FLIPS %d \\n\",i,nflips);\n      if (!folded)break;\n    }\n  }\n  else\n  {\n    PSolver.SolvePoisson(Handle_Stiffness,GradientSize,1.f,DirectRound,localIter,DoRound,SingularityRound,roundVertices,hardFeatures);\n  }\n\n  int nflips=NumFlips(PSolver.WUV);\n  printf(\"**** END OPTIMIZING #FLIPS %d  ****\\n\",nflips);\n\n  fflush(stdout);\n  WUV = PSolver.WUV;\n\n}\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedU>\nIGL_INLINE void igl::MIQ_class<DerivedV, DerivedF, DerivedU>::extractUV(Eigen::PlainObjectBase<DerivedU> &UV_out,\n                                                                        Eigen::PlainObjectBase<DerivedF> &FUV_out)\n{\n  //      int f = F.rows();\n  int f = WUV.rows();\n\n  unsigned vtfaceid[f*3];\n  std::vector<double> vtu;\n  std::vector<double> vtv;\n\n  std::vector<std::vector<double> > listUV;\n  unsigned counter = 0;\n\n  for (unsigned i=0; i<f; ++i)\n  {\n    for (unsigned j=0; j<3; ++j)\n    {\n      std::vector<double> t(3);\n      t[0] = WUV(i,j*2 + 0);\n      t[1] = WUV(i,j*2 + 1);\n      t[2] = counter++;\n      listUV.push_back(t);\n    }\n  }\n  std::sort(listUV.begin(),listUV.end());\n\n  counter = 0;\n  unsigned k = 0;\n  while (k < f*3)\n  {\n    double u = listUV[k][0];\n    double v = listUV[k][1];\n    unsigned id = round(listUV[k][2]);\n\n    vtfaceid[id] = counter;\n    vtu.push_back(u);\n    vtv.push_back(v);\n\n    unsigned j=1;\n    while(k+j < f*3 && u == listUV[k+j][0] && v == listUV[k+j][1])\n    {\n      unsigned tid = round(listUV[k+j][2]);\n      vtfaceid[tid] = counter;\n      ++j;\n    }\n    k = k+j;\n    counter++;\n  }\n\n  UV_out.resize(vtu.size(),2);\n  for (unsigned i=0; i<vtu.size(); ++i)\n  {\n    UV_out(i,0) = vtu[i];\n    UV_out(i,1) = vtv[i];\n  }\n\n  FUV_out.resize(f,3);\n\n  unsigned vcounter = 0;\n  for (unsigned i=0; i<f; ++i)\n  {\n    FUV_out(i,0)  = vtfaceid[vcounter++];\n    FUV_out(i,1)  = vtfaceid[vcounter++];\n    FUV_out(i,2)  = vtfaceid[vcounter++];\n  }\n\n}\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedU>\nIGL_INLINE int igl::MIQ_class<DerivedV, DerivedF, DerivedU>::NumFlips(const Eigen::MatrixXd& WUV)\n{\n  int numFl=0;\n  for (unsigned int i=0;i<F.rows();i++)\n  {\n    if (IsFlipped(i, WUV))\n      numFl++;\n  }\n  return numFl;\n}\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedU>\nIGL_INLINE double igl::MIQ_class<DerivedV, DerivedF, DerivedU>::Distortion(int f, double h, const Eigen::MatrixXd& WUV)\n{\n  assert(h > 0);\n\n  Eigen::Vector2d uv0,uv1,uv2;\n\n  uv0 << WUV(f,0), WUV(f,1);\n  uv1 << WUV(f,2), WUV(f,3);\n  uv2 << WUV(f,4), WUV(f,5);\n\n  Eigen::Matrix<typename DerivedV::Scalar, 3, 1> p0 = V.row(F(f,0));\n  Eigen::Matrix<typename DerivedV::Scalar, 3, 1> p1 = V.row(F(f,1));\n  Eigen::Matrix<typename DerivedV::Scalar, 3, 1> p2 = V.row(F(f,2));\n\n  Eigen::Matrix<typename DerivedV::Scalar, 3, 1> norm = (p1 - p0).cross(p2 - p0);\n  double area2 = norm.norm();\n  double area2_inv  = 1.0 / area2;\n  norm *= area2_inv;\n\n  if (area2 > 0)\n  {\n    // Singular values of the Jacobian\n    Eigen::Matrix<typename DerivedV::Scalar, 3, 1> neg_t0 = norm.cross(p2 - p1);\n    Eigen::Matrix<typename DerivedV::Scalar, 3, 1> neg_t1 = norm.cross(p0 - p2);\n    Eigen::Matrix<typename DerivedV::Scalar, 3, 1> neg_t2 = norm.cross(p1 - p0);\n\n    Eigen::Matrix<typename DerivedV::Scalar, 3, 1> diffu =  (neg_t0 * uv0(0) +neg_t1 *uv1(0) +  neg_t2 * uv2(0) )*area2_inv;\n    Eigen::Matrix<typename DerivedV::Scalar, 3, 1> diffv = (neg_t0 * uv0(1) + neg_t1*uv1(1) +  neg_t2*uv2(1) )*area2_inv;\n\n    // first fundamental form\n    double I00 = diffu.dot(diffu);  // guaranteed non-neg\n    double I01 = diffu.dot(diffv);  // I01 = I10\n    double I11 = diffv.dot(diffv);  // guaranteed non-neg\n\n    // eigenvalues of a 2x2 matrix\n    // [a00 a01]\n    // [a10 a11]\n    // 1/2 * [ (a00 + a11) +/- sqrt((a00 - a11)^2 + 4 a01 a10) ]\n    double trI = I00 + I11;                     // guaranteed non-neg\n    double diffDiag = I00 - I11;                // guaranteed non-neg\n    double sqrtDet = sqrt(std::max(0.0, diffDiag*diffDiag +\n                                   4 * I01 * I01)); // guaranteed non-neg\n    double sig1 = 0.5 * (trI + sqrtDet); // higher singular value\n    double sig2 = 0.5 * (trI - sqrtDet); // lower singular value\n\n    // Avoid sig2 < 0 due to numerical error\n    if (fabs(sig2) < 1.0e-8)\n      sig2 = 0;\n\n    assert(sig1 >= 0);\n    assert(sig2 >= 0);\n\n    if (sig2 < 0) {\n      printf(\"Distortion will be NaN! sig1^2 is negative (%lg)\\n\",\n             sig2);\n    }\n\n    // The singular values of the Jacobian are the sqrts of the\n    // eigenvalues of the first fundamental form.\n    sig1 = sqrt(sig1);\n    sig2 = sqrt(sig2);\n\n    // distortion\n    double tao = IsFlipped(f,WUV) ? -1 : 1;\n    double factor = tao / h;\n    double lam = fabs(factor * sig1 - 1) + fabs(factor * sig2 - 1);\n    return lam;\n  }\n  else {\n    return 10; // something \"large\"\n  }\n}\n\n////////////////////////////////////////////////////////////////////////////\n// Approximate the distortion laplacian using a uniform laplacian on\n//  the dual mesh:\n//      ___________\n//      \\-1 / \\-1 /\n//       \\ / 3 \\ /\n//        \\-----/\n//         \\-1 /\n//          \\ /\n//\n//  @param[in]  f   facet on which to compute distortion laplacian\n//  @param[in]  h   scaling factor applied to cross field\n//  @return     distortion laplacian for f\n///////////////////////////////////////////////////////////////////////////\ntemplate <typename DerivedV, typename DerivedF, typename DerivedU>\nIGL_INLINE double igl::MIQ_class<DerivedV, DerivedF, DerivedU>::LaplaceDistortion(const int f, double h, const Eigen::MatrixXd& WUV)\n{\n  double mydist = Distortion(f, h, WUV);\n  double lapl=0;\n  for (int i=0;i<3;i++)\n  {\n    if (TT(f,i) != -1)\n      lapl += (mydist - Distortion(TT(f,i), h, WUV));\n  }\n  return lapl;\n}\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedU>\nIGL_INLINE bool igl::MIQ_class<DerivedV, DerivedF, DerivedU>::updateStiffeningJacobianDistorsion(double grad_size, const Eigen::MatrixXd& WUV)\n{\n  bool flipped = NumFlips(WUV)>0;\n\n  if (!flipped)\n    return false;\n\n  double maxL=0;\n  double maxD=0;\n\n  if (flipped)\n  {\n    const double c = 1.0;\n    const double d = 5.0;\n\n    for (unsigned int i = 0; i < F.rows(); ++i)\n    {\n      double dist=Distortion(i,grad_size,WUV);\n      if (dist > maxD)\n        maxD=dist;\n\n      double absLap=fabs(LaplaceDistortion(i, grad_size,WUV));\n      if (absLap > maxL)\n        maxL = absLap;\n\n      double stiffDelta = std::min(c * absLap, d);\n\n      Handle_Stiffness[i]+=stiffDelta;\n    }\n  }\n  printf(\"Maximum Distorsion %4.4f \\n\",maxD);\n  printf(\"Maximum Laplacian %4.4f \\n\",maxL);\n  return flipped;\n}\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedU>\nIGL_INLINE bool igl::MIQ_class<DerivedV, DerivedF, DerivedU>::IsFlipped(const Eigen::Vector2d &uv0,\n                                                                        const Eigen::Vector2d &uv1,\n                                                                        const Eigen::Vector2d &uv2)\n{\n  Eigen::Vector2d e0 = (uv1-uv0);\n  Eigen::Vector2d e1 = (uv2-uv0);\n\n  double Area = e0(0)*e1(1) - e0(1)*e1(0);\n  return (Area<=0);\n}\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedU>\nIGL_INLINE bool igl::MIQ_class<DerivedV, DerivedF, DerivedU>::IsFlipped(const int i, const Eigen::MatrixXd& WUV)\n{\n  Eigen::Vector2d uv0,uv1,uv2;\n  uv0 << WUV(i,0), WUV(i,1);\n  uv1 << WUV(i,2), WUV(i,3);\n  uv2 << WUV(i,4), WUV(i,5);\n\n  return (IsFlipped(uv0,uv1,uv2));\n}\n\n\n\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedU>\nIGL_INLINE void igl::miq(const Eigen::PlainObjectBase<DerivedV> &V,\n                         const Eigen::PlainObjectBase<DerivedF> &F,\n                         const Eigen::PlainObjectBase<DerivedV> &PD1_combed,\n                         const Eigen::PlainObjectBase<DerivedV> &PD2_combed,\n                         //  const Eigen::PlainObjectBase<DerivedV> &BIS1_combed,\n                         //  const Eigen::PlainObjectBase<DerivedV> &BIS2_combed,\n                         const Eigen::Matrix<int, Eigen::Dynamic, 3> &Handle_MMatch,\n                         const Eigen::Matrix<int, Eigen::Dynamic, 1> &Handle_Singular,\n                         //  const Eigen::Matrix<int, Eigen::Dynamic, 1> &Handle_SingularDegree,\n                         const Eigen::Matrix<int, Eigen::Dynamic, 3> &Handle_Seams,\n                         Eigen::PlainObjectBase<DerivedU> &UV,\n                         Eigen::PlainObjectBase<DerivedF> &FUV,\n                         double GradientSize,\n                         double Stiffness,\n                         bool DirectRound,\n                         int iter,\n                         int localIter,\n                         bool DoRound,\n                         bool SingularityRound,\n                         std::vector<int> roundVertices,\n                         std::vector<std::vector<int> > hardFeatures)\n{\n  GradientSize = GradientSize/(V.colwise().maxCoeff()-V.colwise().minCoeff()).norm();\n\n  igl::MIQ_class<DerivedV, DerivedF, DerivedU> miq(V,\n                                                   F,\n                                                   PD1_combed,\n                                                   PD2_combed,\n                                                   //  BIS1_combed,\n                                                   //  BIS2_combed,\n                                                   Handle_MMatch,\n                                                   Handle_Singular,\n                                                   //  Handle_SingularDegree,\n                                                   Handle_Seams,\n                                                   UV,\n                                                   FUV,\n                                                   GradientSize,\n                                                   Stiffness,\n                                                   DirectRound,\n                                                   iter,\n                                                   localIter,\n                                                   DoRound,\n                                                   SingularityRound,\n                                                   roundVertices,\n                                                   hardFeatures);\n\n  miq.extractUV(UV,FUV);\n}\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedU>\nIGL_INLINE void igl::miq(const Eigen::PlainObjectBase<DerivedV> &V,\n                         const Eigen::PlainObjectBase<DerivedF> &F,\n                         const Eigen::PlainObjectBase<DerivedV> &PD1,\n                         const Eigen::PlainObjectBase<DerivedV> &PD2,\n                         Eigen::PlainObjectBase<DerivedU> &UV,\n                         Eigen::PlainObjectBase<DerivedF> &FUV,\n                         double GradientSize,\n                         double Stiffness,\n                         bool DirectRound,\n                         int iter,\n                         int localIter,\n                         bool DoRound,\n                         bool SingularityRound,\n                         std::vector<int> roundVertices,\n                         std::vector<std::vector<int> > hardFeatures)\n{\n  // Eigen::MatrixXd PD2i = PD2;\n  // if (PD2i.size() == 0)\n  // {\n  // Eigen::MatrixXd B1, B2, B3;\n  // igl::local_basis(V,F,B1,B2,B3);\n  // PD2i = igl::rotate_vectors(V,Eigen::VectorXd::Constant(1,M_PI/2),B1,B2);\n  // }\n\n  Eigen::PlainObjectBase<DerivedV> BIS1, BIS2;\n  igl::compute_frame_field_bisectors(V, F, PD1, PD2, BIS1, BIS2);\n\n  Eigen::PlainObjectBase<DerivedV> BIS1_combed, BIS2_combed;\n  igl::comb_cross_field(V, F, BIS1, BIS2, BIS1_combed, BIS2_combed);\n\n  Eigen::PlainObjectBase<DerivedF> Handle_MMatch;\n  igl::cross_field_missmatch(V, F, BIS1_combed, BIS2_combed, true, Handle_MMatch);\n\n  Eigen::Matrix<int, Eigen::Dynamic, 1> isSingularity, singularityIndex;\n  igl::find_cross_field_singularities(V, F, Handle_MMatch, isSingularity, singularityIndex);\n\n  Eigen::Matrix<int, Eigen::Dynamic, 3> Handle_Seams;\n  igl::cut_mesh_from_singularities(V, F, Handle_MMatch, Handle_Seams);\n\n  Eigen::PlainObjectBase<DerivedV> PD1_combed, PD2_combed;\n  igl::comb_frame_field(V, F, PD1, PD2, BIS1_combed, BIS2_combed, PD1_combed, PD2_combed);\n\n  igl::miq(V,\n           F,\n           PD1_combed,\n           PD2_combed,\n           //  BIS1_combed,\n           //  BIS2_combed,\n           Handle_MMatch,\n           isSingularity,\n           //  singularityIndex,\n           Handle_Seams,\n           UV,\n           FUV,\n           GradientSize,\n           Stiffness,\n           DirectRound,\n           iter,\n           localIter,\n           DoRound,\n           SingularityRound,\n           roundVertices,\n           hardFeatures);\n\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template specialization\n// template void igl::miq<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 2, 0, -1, 2> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, double, double, bool, int, int, bool, std::__1::vector<int, std::__1::allocator<int> >, std::__1::vector<std::__1::vector<int, std::__1::allocator<int> >, std::__1::allocator<std::__1::vector<int, std::__1::allocator<int> > > >);\n// template void igl::miq<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 2, 0, -1, 2> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::Matrix<int, -1, 3, 0, -1, 3> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, double, double, bool, int, int, bool, std::__1::vector<int, std::__1::allocator<int> >, std::__1::vector<std::__1::vector<int, std::__1::allocator<int> >, std::__1::allocator<std::__1::vector<int, std::__1::allocator<int> > > >);\n//template void igl::miq<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 2, 0, -1, 2> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::Matrix<int, -1, 3, 0, -1, 3> const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, Eigen::Matrix<int, -1, 3, 0, -1, 3> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, double, double, bool, int, int, bool, std::__1::vector<int, std::__1::allocator<int> >, std::__1::vector<std::__1::vector<int, std::__1::allocator<int> >, std::__1::allocator<std::__1::vector<int, std::__1::allocator<int> > > >);\ntemplate void igl::miq<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, double, double, bool, int, int, bool, bool, std::__1::vector<int, std::__1::allocator<int> >, std::__1::vector<std::__1::vector<int, std::__1::allocator<int> >, std::__1::allocator<std::__1::vector<int, std::__1::allocator<int> > > >);\ntemplate void igl::miq<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, 3, 0, -1, 3> const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, Eigen::Matrix<int, -1, 3, 0, -1, 3> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, double, double, bool, int, int, bool, bool, std::__1::vector<int, std::__1::allocator<int> >, std::__1::vector<std::__1::vector<int, std::__1::allocator<int> >, std::__1::allocator<std::__1::vector<int, std::__1::allocator<int> > > >);\ntemplate void igl::miq<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, double, double, bool, int, int, bool, bool, std::__1::vector<int, std::__1::allocator<int> >, std::__1::vector<std::__1::vector<int, std::__1::allocator<int> >, std::__1::allocator<std::__1::vector<int, std::__1::allocator<int> > > >);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/comiso/miq.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>, Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_MIQ_H\n#define IGL_MIQ_H\n#include <igl/igl_inline.h>\n#include <Eigen/Core>\n#include <vector>\n\nnamespace igl\n{\n  // Global seamless parametrization aligned with a given per-face jacobian (PD1,PD2).\n  // The algorithm is based on\n  // \"Mixed-Integer Quadrangulation\" by D. Bommes, H. Zimmer, L. Kobbelt\n  // ACM SIGGRAPH 2009, Article No. 77 (http://dl.acm.org/citation.cfm?id=1531383)\n  // We thank Nico Pietroni for providing a reference implementation of MIQ\n  // on which our code is based.\n\n  // Inputs:\n  //   V              #V by 3 list of mesh vertex 3D positions\n  //   F              #F by 3 list of faces indices in V\n  //   PD1            #V by 3 first line of the Jacobian per triangle\n  //   PD2            #V by 3 second line of the Jacobian per triangle\n  //                  (optional, if empty it will be a vector in the tangent plane orthogonal to PD1)\n  //   scale          global scaling for the gradient (controls the quads resolution)\n  //   stiffness      weight for the stiffness iterations\n  //   direct_round   greedily round all integer variables at once (greatly improves optimization speed but lowers quality)\n  //   iter           stiffness iterations (0 = no stiffness)\n  //   local_iter     number of local iterations for the integer rounding\n  //   do_round       enables the integer rounding (disabling it could be useful for debugging)\n  //   round_vertices id of additional vertices that should be snapped to integer coordinates\n  //   hard_features  #H by 2 list of pairs of vertices that belongs to edges that should be snapped to integer coordinates\n  //\n  // Output:\n  //   UV             #UV by 2 list of vertices in 2D\n  //   FUV            #FUV by 3 list of face indices in UV\n  //\n  // TODO: rename the parameters name in the cpp consistenly\n  //       improve the handling of hard_features, right now it might fail in difficult cases\n\n  template <typename DerivedV, typename DerivedF, typename DerivedU>\n  IGL_INLINE void miq(const Eigen::PlainObjectBase<DerivedV> &V,\n                                              const Eigen::PlainObjectBase<DerivedF> &F,\n                                              const Eigen::PlainObjectBase<DerivedV> &PD1,\n                                              const Eigen::PlainObjectBase<DerivedV> &PD2,\n                                              Eigen::PlainObjectBase<DerivedU> &UV,\n                                              Eigen::PlainObjectBase<DerivedF> &FUV,\n                                              double scale = 30.0,\n                                              double stiffness = 5.0,\n                                              bool direct_round = false,\n                                              int iter = 5,\n                                              int local_iter = 5,\n                                              bool DoRound = true,bool SingularityRound=true,\n                                              std::vector<int> round_vertices = std::vector<int>(),\n                                              std::vector<std::vector<int> > hard_features = std::vector<std::vector<int> >());\n\n  // Helper function that allows to directly provided pre-combed bisectors for an already cut mesh\n  // Additional input:\n  // PD1_combed, PD2_combed  :   #F by 3 combed jacobian\n  // BIS1_combed, BIS2_combed:   #F by 3 pre combed bi-sectors\n  // MMatch:                     #F by 3 list of per-corner integer PI/2 rotations\n  // Singular:                   #V list of flag that denotes if a vertex is singular or not\n  // SingularDegree:             #V list of flag that denotes the degree of the singularity\n  // Seams:                      #F by 3 list of per-corner flag that denotes seams\n\n  template <typename DerivedV, typename DerivedF, typename DerivedU>\n  IGL_INLINE void miq(const Eigen::PlainObjectBase<DerivedV> &V,\n                                              const Eigen::PlainObjectBase<DerivedF> &F,\n                                              const Eigen::PlainObjectBase<DerivedV> &PD1_combed,\n                                              const Eigen::PlainObjectBase<DerivedV> &PD2_combed,\n                                              // const Eigen::PlainObjectBase<DerivedV> &BIS1_combed,\n                                              // const Eigen::PlainObjectBase<DerivedV> &BIS2_combed,\n                                              const Eigen::Matrix<int, Eigen::Dynamic, 3> &MMatch,\n                                              const Eigen::Matrix<int, Eigen::Dynamic, 1> &Singular,\n                                              // const Eigen::Matrix<int, Eigen::Dynamic, 1> &SingularDegree,\n                                              const Eigen::Matrix<int, Eigen::Dynamic, 3> &Seams,\n                                              Eigen::PlainObjectBase<DerivedU> &UV,\n                                              Eigen::PlainObjectBase<DerivedF> &FUV,\n                                              double GradientSize = 30.0,\n                                              double Stiffness = 5.0,\n                                              bool DirectRound = false,\n                                              int iter = 5,\n                                              int localIter = 5, bool DoRound = true,bool SingularityRound=true,\n                                              std::vector<int> roundVertices = std::vector<int>(),\n                                              std::vector<std::vector<int> > hardFeatures = std::vector<std::vector<int> >());\n};\n#ifndef IGL_STATIC_LIBRARY\n#include \"miq.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/comiso/nrosy.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"nrosy.h\"\n\n#include <igl/comiso/nrosy.h>\n#include <igl/triangle_triangle_adjacency.h>\n#include <igl/edge_topology.h>\n#include <igl/per_face_normals.h>\n\n#include <iostream>\n#include <fstream>\n\n#include <Eigen/Geometry>\n#include <Eigen/Sparse>\n#include <queue>\n\n#include <gmm/gmm.h>\n#include <CoMISo/Solver/ConstrainedSolver.hh>\n#include <CoMISo/Solver/MISolver.hh>\n#include <CoMISo/Solver/GMM_Tools.hh>\n\nnamespace igl\n{\nclass NRosyField\n{\npublic:\n  // Init\n  IGL_INLINE NRosyField(const Eigen::MatrixXd& _V, const Eigen::MatrixXi& _F);\n\n  // Generate the N-rosy field\n  // N degree of the rosy field\n  // roundseparately: round the integer variables one at a time, slower but higher quality\n  IGL_INLINE void solve(const int N = 4);\n\n  // Set a hard constraint on fid\n  // fid: face id\n  // v: direction to fix (in 3d)\n  IGL_INLINE void setConstraintHard(const int fid, const Eigen::Vector3d& v);\n\n  // Set a soft constraint on fid\n  // fid: face id\n  // w: weight of the soft constraint, clipped between 0 and 1\n  // v: direction to fix (in 3d)\n  IGL_INLINE void setConstraintSoft(const int fid, const double w, const Eigen::Vector3d& v);\n\n  // Set the ratio between smoothness and soft constraints (0 -> smoothness only, 1 -> soft constr only)\n  IGL_INLINE void setSoftAlpha(double alpha);\n\n  // Reset constraints (at least one constraint must be present or solve will fail)\n  IGL_INLINE void resetConstraints();\n\n  // Return the current field\n  IGL_INLINE Eigen::MatrixXd getFieldPerFace();\n\n  // Return the current field (in Ahish's ffield format)\n  IGL_INLINE Eigen::MatrixXd getFFieldPerFace();\n\n  // Compute singularity indexes\n  IGL_INLINE void findCones(int N);\n\n  // Return the singularities\n  IGL_INLINE Eigen::VectorXd getSingularityIndexPerVertex();\n\nprivate:\n\n  // Compute angle differences between reference frames\n  IGL_INLINE void computek();\n\n  // Remove useless matchings\n  IGL_INLINE void reduceSpace();\n\n  // Prepare the system matrix\n  IGL_INLINE void prepareSystemMatrix(const int N);\n\n  // Solve without roundings\n  IGL_INLINE void solveNoRoundings();\n\n  // Solve with roundings using CoMIso\n  IGL_INLINE void solveRoundings();\n\n  // Round all p to 0 and fix\n  IGL_INLINE void roundAndFixToZero();\n\n  // Round all p and fix\n  IGL_INLINE void roundAndFix();\n\n  // Convert a vector in 3d to an angle wrt the local reference system\n  IGL_INLINE double convert3DtoLocal(unsigned fid, const Eigen::Vector3d& v);\n\n  // Convert an angle wrt the local reference system to a 3d vector\n  IGL_INLINE Eigen::Vector3d convertLocalto3D(unsigned fid, double a);\n\n  // Compute the per vertex angle defect\n  IGL_INLINE Eigen::VectorXd angleDefect();\n\n  // Temporary variable for the field\n  Eigen::VectorXd angles;\n\n  // Hard constraints\n  Eigen::VectorXd hard;\n  std::vector<bool> isHard;\n\n  // Soft constraints\n  Eigen::VectorXd soft;\n  Eigen::VectorXd wSoft;\n  double          softAlpha;\n\n  // Face Topology\n  Eigen::MatrixXi TT, TTi;\n\n  // Edge Topology\n  Eigen::MatrixXi EV, FE, EF;\n  std::vector<bool> isBorderEdge;\n\n  // Per Edge information\n  // Angle between two reference frames\n  Eigen::VectorXd k;\n\n  // Jumps\n  Eigen::VectorXi p;\n  std::vector<bool> pFixed;\n\n  // Mesh\n  Eigen::MatrixXd V;\n  Eigen::MatrixXi F;\n\n  // Normals per face\n  Eigen::MatrixXd N;\n\n  // Singularity index\n  Eigen::VectorXd singularityIndex;\n\n  // Reference frame per triangle\n  std::vector<Eigen::MatrixXd> TPs;\n\n  // System stuff\n  Eigen::SparseMatrix<double> A;\n  Eigen::VectorXd b;\n  Eigen::VectorXi tag_t;\n  Eigen::VectorXi tag_p;\n\n};\n\n} // NAMESPACE IGL\n\nigl::NRosyField::NRosyField(const Eigen::MatrixXd& _V, const Eigen::MatrixXi& _F)\n{\n  using namespace std;\n  using namespace Eigen;\n\n  V = _V;\n  F = _F;\n\n  assert(V.rows() > 0);\n  assert(F.rows() > 0);\n\n\n  // Generate topological relations\n  igl::triangle_triangle_adjacency(V,F,TT,TTi);\n  igl::edge_topology(V,F, EV, FE, EF);\n\n  // Flag border edges\n  isBorderEdge.resize(EV.rows());\n  for(unsigned i=0; i<EV.rows(); ++i)\n    isBorderEdge[i] = (EF(i,0) == -1) || ((EF(i,1) == -1));\n\n  // Generate normals per face\n  igl::per_face_normals(V, F, N);\n\n  // Generate reference frames\n  for(unsigned fid=0; fid<F.rows(); ++fid)\n  {\n    // First edge\n    Vector3d e1 = V.row(F(fid,1)) - V.row(F(fid,0));\n    e1.normalize();\n    Vector3d e2 = N.row(fid);\n    e2 = e2.cross(e1);\n    e2.normalize();\n\n    MatrixXd TP(2,3);\n    TP << e1.transpose(), e2.transpose();\n    TPs.push_back(TP);\n  }\n\n  // Alloc internal variables\n  angles = VectorXd::Zero(F.rows());\n  p = VectorXi::Zero(EV.rows());\n  pFixed.resize(EV.rows());\n  k = VectorXd::Zero(EV.rows());\n  singularityIndex = VectorXd::Zero(V.rows());\n\n  // Reset the constraints\n  resetConstraints();\n\n  // Compute k, differences between reference frames\n  computek();\n\n  softAlpha = 0.5;\n}\n\nvoid igl::NRosyField::setSoftAlpha(double alpha)\n{\n  assert(alpha >= 0 && alpha < 1);\n  softAlpha = alpha;\n}\n\n\nvoid igl::NRosyField::prepareSystemMatrix(const int N)\n{\n  using namespace std;\n  using namespace Eigen;\n\n  double Nd = N;\n\n  // Minimize the MIQ energy\n  // Energy on edge ij is\n  //     (t_i - t_j + kij + pij*(2*pi/N))^2\n  // Partial derivatives:\n  //   t_i: 2     ( t_i - t_j + kij + pij*(2*pi/N)) = 0\n  //   t_j: 2     (-t_i + t_j - kij - pij*(2*pi/N)) = 0\n  //   pij: 4pi/N ( t_i - t_j + kij + pij*(2*pi/N)) = 0\n  //\n  //          t_i      t_j         pij       kij\n  // t_i [     2       -2           4pi/N      2    ]\n  // t_j [    -2        2          -4pi/N     -2    ]\n  // pij [   4pi/N   -4pi/N    2*(2pi/N)^2   4pi/N  ]\n\n  // Count and tag the variables\n  tag_t = VectorXi::Constant(F.rows(),-1);\n  vector<int> id_t;\n  int count = 0;\n  for(unsigned i=0; i<F.rows(); ++i)\n    if (!isHard[i])\n    {\n      tag_t(i) = count++;\n      id_t.push_back(i);\n    }\n\n  unsigned count_t = id_t.size();\n\n  tag_p = VectorXi::Constant(EF.rows(),-1);\n  vector<int> id_p;\n  for(unsigned i=0; i<EF.rows(); ++i)\n  {\n    if (!pFixed[i])\n    {\n      // if it is not fixed then it is a variable\n      tag_p(i) = count++;\n    }\n\n    // if it is not a border edge,\n    if (!isBorderEdge[i])\n    {\n      // and it is not between two fixed faces\n      if (!(isHard[EF(i,0)] && isHard[EF(i,1)]))\n      {\n          // then it participates in the energy!\n          id_p.push_back(i);\n      }\n    }\n  }\n\n  unsigned count_p = count - count_t;\n  // System sizes: A (count_t + count_p) x (count_t + count_p)\n  //               b (count_t + count_p)\n\n  b = VectorXd::Zero(count_t + count_p);\n\n  std::vector<Eigen::Triplet<double> > T;\n  T.reserve(3 * 4 * count_p);\n\n  for(unsigned r=0; r<id_p.size(); ++r)\n  {\n    int eid = id_p[r];\n    int i = EF(eid,0);\n    int j = EF(eid,1);\n    bool isFixed_i = isHard[i];\n    bool isFixed_j = isHard[j];\n    bool isFixed_p = pFixed[eid];\n    int row;\n    // (i)-th row: t_i [     2       -2           4pi/N      2    ]\n    if (!isFixed_i)\n    {\n      row = tag_t[i];\n      if (isFixed_i) b(row) += -2               * hard[i]; else T.push_back(Eigen::Triplet<double>(row,tag_t[i]  , 2             ));\n      if (isFixed_j) b(row) +=  2               * hard[j]; else T.push_back(Eigen::Triplet<double>(row,tag_t[j]  ,-2             ));\n      if (isFixed_p) b(row) += -((4 * M_PI)/Nd) * p[eid] ; else T.push_back(Eigen::Triplet<double>(row,tag_p[eid],((4 * M_PI)/Nd)));\n      b(row) += -2 * k[eid];\n      assert(hard[i] == hard[i]);\n      assert(hard[j] == hard[j]);\n      assert(p[eid] == p[eid]);\n      assert(k[eid] == k[eid]);\n      assert(b(row) == b(row));\n    }\n    // (j)+1 -th row: t_j [    -2        2          -4pi/N     -2    ]\n    if (!isFixed_j)\n    {\n      row = tag_t[j];\n      if (isFixed_i) b(row) += 2               * hard[i]; else T.push_back(Eigen::Triplet<double>(row,tag_t[i]  , -2             ));\n      if (isFixed_j) b(row) += -2              * hard[j]; else T.push_back(Eigen::Triplet<double>(row,tag_t[j] ,  2              ));\n      if (isFixed_p) b(row) += ((4 * M_PI)/Nd) * p[eid] ; else T.push_back(Eigen::Triplet<double>(row,tag_p[eid],-((4 * M_PI)/Nd)));\n      b(row) += 2 * k[eid];\n      assert(k[eid] == k[eid]);\n      assert(b(row) == b(row));\n    }\n    // (r*3)+2 -th row: pij [   4pi/N   -4pi/N    2*(2pi/N)^2   4pi/N  ]\n    if (!isFixed_p)\n    {\n      row = tag_p[eid];\n      if (isFixed_i) b(row) += -(4 * M_PI)/Nd              * hard[i]; else T.push_back(Eigen::Triplet<double>(row,tag_t[i] ,   (4 * M_PI)/Nd             ));\n      if (isFixed_j) b(row) +=  (4 * M_PI)/Nd              * hard[j]; else T.push_back(Eigen::Triplet<double>(row,tag_t[j] ,  -(4 * M_PI)/Nd             ));\n      if (isFixed_p) b(row) += -(2 * pow(((2*M_PI)/Nd),2)) * p[eid] ;  else T.push_back(Eigen::Triplet<double>(row,tag_p[eid],  (2 * pow(((2*M_PI)/Nd),2))));\n      b(row) += - (4 * M_PI)/Nd * k[eid];\n      assert(k[eid] == k[eid]);\n      assert(b(row) == b(row));\n    }\n\n  }\n\n  A = SparseMatrix<double>(count_t + count_p, count_t + count_p);\n  A.setFromTriplets(T.begin(), T.end());\n\n  // Soft constraints\n  bool addSoft = false;\n\n  for(unsigned i=0; i<wSoft.size();++i)\n    if (wSoft[i] != 0)\n      addSoft = true;\n\n  if (addSoft)\n  {\n    cerr << \" Adding soft here: \" << endl;\n    cerr << \" softAplha: \" << softAlpha << endl;\n    VectorXd bSoft = VectorXd::Zero(count_t + count_p);\n\n    std::vector<Eigen::Triplet<double> > TSoft;\n    TSoft.reserve(2 * count_p);\n\n    for(unsigned i=0; i<F.rows(); ++i)\n    {\n      int varid = tag_t[i];\n      if (varid != -1) // if it is a variable in the system\n      {\n        TSoft.push_back(Eigen::Triplet<double>(varid,varid,wSoft[i]));\n        bSoft[varid] += wSoft[i] * soft[i];\n      }\n    }\n    SparseMatrix<double> ASoft(count_t + count_p, count_t + count_p);\n    ASoft.setFromTriplets(TSoft.begin(), TSoft.end());\n\n//    ofstream s(\"/Users/daniele/As.txt\");\n//    for(unsigned i=0; i<TSoft.size(); ++i)\n//      s << TSoft[i].row() << \" \" << TSoft[i].col() << \" \" << TSoft[i].value() << endl;\n//    s.close();\n\n//    ofstream s2(\"/Users/daniele/bs.txt\");\n//    for(unsigned i=0; i<bSoft.rows(); ++i)\n//      s2 << bSoft(i) << endl;\n//    s2.close();\n\n    // Stupid Eigen bug\n    SparseMatrix<double> Atmp (count_t + count_p, count_t + count_p);\n    SparseMatrix<double> Atmp2(count_t + count_p, count_t + count_p);\n    SparseMatrix<double> Atmp3(count_t + count_p, count_t + count_p);\n\n    // Merge the two part of the energy\n    Atmp = (1.0 - softAlpha)*A;\n    Atmp2 = softAlpha * ASoft;\n    Atmp3 = Atmp+Atmp2;\n\n    A = Atmp3;\n    b = b*(1.0 - softAlpha) + bSoft * softAlpha;\n  }\n\n//  ofstream s(\"/Users/daniele/A.txt\");\n//  for (int k=0; k<A.outerSize(); ++k)\n//    for (SparseMatrix<double>::InnerIterator it(A,k); it; ++it)\n//    {\n//      s << it.row() << \" \" << it.col() << \" \" << it.value() << endl;\n//    }\n//  s.close();\n//\n//  ofstream s2(\"/Users/daniele/b.txt\");\n//  for(unsigned i=0; i<b.rows(); ++i)\n//    s2 << b(i) << endl;\n//  s2.close();\n}\n\nvoid igl::NRosyField::solveNoRoundings()\n{\n  using namespace std;\n  using namespace Eigen;\n\n  // Solve the linear system\n  SimplicialLDLT<SparseMatrix<double> > solver;\n  solver.compute(A);\n  VectorXd x = solver.solve(b);\n\n  // Copy the result back\n  for(unsigned i=0; i<F.rows(); ++i)\n    if (tag_t[i] != -1)\n      angles[i] = x(tag_t[i]);\n    else\n      angles[i] = hard[i];\n\n  for(unsigned i=0; i<EF.rows(); ++i)\n    if(tag_p[i]  != -1)\n      p[i] = roundl(x[tag_p[i]]);\n}\n\nvoid igl::NRosyField::solveRoundings()\n{\n  using namespace std;\n  using namespace Eigen;\n\n  unsigned n = A.rows();\n\n  gmm::col_matrix< gmm::wsvector< double > > gmm_A;\n  std::vector<double> gmm_b;\n  std::vector<int> ids_to_round;\n  std::vector<double> x;\n\n  gmm_A.resize(n,n);\n  gmm_b.resize(n);\n  x.resize(n);\n\n  // Copy A\n  for (int k=0; k<A.outerSize(); ++k)\n    for (SparseMatrix<double>::InnerIterator it(A,k); it; ++it)\n    {\n      gmm_A(it.row(),it.col()) += it.value();\n    }\n\n  // Copy b\n  for(unsigned i=0; i<n;++i)\n    gmm_b[i] = b[i];\n\n  // Set variables to round\n  ids_to_round.clear();\n  for(unsigned i=0; i<tag_p.size();++i)\n    if(tag_p[i] != -1)\n      ids_to_round.push_back(tag_p[i]);\n\n  // Empty constraints\n  gmm::row_matrix< gmm::wsvector< double > > gmm_C(0, n);\n\n  COMISO::ConstrainedSolver cs;\n  //print_miso_settings(cs.misolver());\n  cs.solve(gmm_C, gmm_A, x, gmm_b, ids_to_round, 0.0, false, true);\n\n  // Copy the result back\n  for(unsigned i=0; i<F.rows(); ++i)\n    if (tag_t[i] != -1)\n      angles[i] = x[tag_t[i]];\n    else\n      angles[i] = hard[i];\n\n  for(unsigned i=0; i<EF.rows(); ++i)\n    if(tag_p[i]  != -1)\n      p[i] = roundl(x[tag_p[i]]);\n\n}\n\n\nvoid igl::NRosyField::roundAndFix()\n{\n  for(unsigned i=0; i<p.rows(); ++i)\n    pFixed[i] = true;\n}\n\nvoid igl::NRosyField::roundAndFixToZero()\n{\n  for(unsigned i=0; i<p.rows(); ++i)\n  {\n    pFixed[i] = true;\n    p[i] = 0;\n  }\n}\n\nvoid igl::NRosyField::solve(const int N)\n{\n  // Reduce the search space by fixing matchings\n  reduceSpace();\n\n  // Build the system\n  prepareSystemMatrix(N);\n\n  // Solve with integer roundings\n  solveRoundings();\n\n  // This is a very greedy solving strategy\n  // // Solve with no roundings\n  // solveNoRoundings();\n  //\n  // // Round all p and fix them\n  // roundAndFix();\n  //\n  // // Build the system\n  // prepareSystemMatrix(N);\n  //\n  // // Solve with no roundings (they are all fixed)\n  // solveNoRoundings();\n\n  // Find the cones\n  findCones(N);\n}\n\nvoid igl::NRosyField::setConstraintHard(const int fid, const Eigen::Vector3d& v)\n{\n  isHard[fid] = true;\n  hard(fid) = convert3DtoLocal(fid, v);\n}\n\nvoid igl::NRosyField::setConstraintSoft(const int fid, const double w, const Eigen::Vector3d& v)\n{\n  wSoft(fid) = w;\n  soft(fid) = convert3DtoLocal(fid, v);\n}\n\nvoid igl::NRosyField::resetConstraints()\n{\n  using namespace std;\n  using namespace Eigen;\n\n  isHard.resize(F.rows());\n  for(unsigned i=0; i<F.rows(); ++i)\n    isHard[i] = false;\n  hard   = VectorXd::Zero(F.rows());\n\n  wSoft  = VectorXd::Zero(F.rows());\n  soft   = VectorXd::Zero(F.rows());\n}\n\nEigen::MatrixXd igl::NRosyField::getFieldPerFace()\n{\n  using namespace std;\n  using namespace Eigen;\n\n  MatrixXd result(F.rows(),3);\n  for(unsigned i=0; i<F.rows(); ++i)\n    result.row(i) = convertLocalto3D(i, angles(i));\n  return result;\n}\n\nEigen::MatrixXd igl::NRosyField::getFFieldPerFace()\n{\n  using namespace std;\n  using namespace Eigen;\n\n  MatrixXd result(F.rows(),6);\n  for(unsigned i=0; i<F.rows(); ++i)\n  {\n      Vector3d v1 = convertLocalto3D(i, angles(i));\n      Vector3d n = N.row(i);\n      Vector3d v2 = n.cross(v1);\n      v1.normalize();\n      v2.normalize();\n\n      result.block(i,0,1,3) = v1.transpose();\n      result.block(i,3,1,3) = v2.transpose();\n  }\n  return result;\n}\n\n\nvoid igl::NRosyField::computek()\n{\n  using namespace std;\n  using namespace Eigen;\n\n  // For every non-border edge\n  for (unsigned eid=0; eid<EF.rows(); ++eid)\n  {\n    if (!isBorderEdge[eid])\n    {\n      int fid0 = EF(eid,0);\n      int fid1 = EF(eid,1);\n\n      Vector3d N0 = N.row(fid0);\n      Vector3d N1 = N.row(fid1);\n\n      // find common edge on triangle 0 and 1\n      int fid0_vc = -1;\n      int fid1_vc = -1;\n      for (unsigned i=0;i<3;++i)\n      {\n        if (EV(eid,0) == F(fid0,i))\n          fid0_vc = i;\n        if (EV(eid,1) == F(fid1,i))\n          fid1_vc = i;\n      }\n      assert(fid0_vc != -1);\n      assert(fid1_vc != -1);\n\n      Vector3d common_edge = V.row(F(fid0,(fid0_vc+1)%3)) - V.row(F(fid0,fid0_vc));\n      common_edge.normalize();\n\n      // Map the two triangles in a new space where the common edge is the x axis and the N0 the z axis\n      MatrixXd P(3,3);\n      VectorXd o = V.row(F(fid0,fid0_vc));\n      VectorXd tmp = -N0.cross(common_edge);\n      P << common_edge, tmp, N0;\n      P.transposeInPlace();\n\n\n      MatrixXd V0(3,3);\n      V0.row(0) = V.row(F(fid0,0)).transpose() -o;\n      V0.row(1) = V.row(F(fid0,1)).transpose() -o;\n      V0.row(2) = V.row(F(fid0,2)).transpose() -o;\n\n      V0 = (P*V0.transpose()).transpose();\n\n      assert(V0(0,2) < 10e-10);\n      assert(V0(1,2) < 10e-10);\n      assert(V0(2,2) < 10e-10);\n\n      MatrixXd V1(3,3);\n      V1.row(0) = V.row(F(fid1,0)).transpose() -o;\n      V1.row(1) = V.row(F(fid1,1)).transpose() -o;\n      V1.row(2) = V.row(F(fid1,2)).transpose() -o;\n      V1 = (P*V1.transpose()).transpose();\n\n      assert(V1(fid1_vc,2) < 10e-10);\n      assert(V1((fid1_vc+1)%3,2) < 10e-10);\n\n      // compute rotation R such that R * N1 = N0\n      // i.e. map both triangles to the same plane\n      double alpha = -atan2(V1((fid1_vc+2)%3,2),V1((fid1_vc+2)%3,1));\n\n      MatrixXd R(3,3);\n      R << 1,          0,            0,\n           0, cos(alpha), -sin(alpha) ,\n           0, sin(alpha),  cos(alpha);\n      V1 = (R*V1.transpose()).transpose();\n\n      assert(V1(0,2) < 10e-10);\n      assert(V1(1,2) < 10e-10);\n      assert(V1(2,2) < 10e-10);\n\n      // measure the angle between the reference frames\n      // k_ij is the angle between the triangle on the left and the one on the right\n      VectorXd ref0 = V0.row(1) - V0.row(0);\n      VectorXd ref1 = V1.row(1) - V1.row(0);\n\n      ref0.normalize();\n      ref1.normalize();\n\n      double ktemp = atan2(ref1(1),ref1(0)) - atan2(ref0(1),ref0(0));\n\n      // just to be sure, rotate ref0 using angle ktemp...\n      MatrixXd R2(2,2);\n      R2 << cos(ktemp), -sin(ktemp), sin(ktemp), cos(ktemp);\n\n      tmp = R2*ref0.head<2>();\n\n      assert(tmp(0) - ref1(0) < 10^10);\n      assert(tmp(1) - ref1(1) < 10^10);\n\n      k[eid] = ktemp;\n    }\n  }\n\n}\n\nvoid igl::NRosyField::reduceSpace()\n{\n  using namespace std;\n  using namespace Eigen;\n\n  // All variables are free in the beginning\n  for(unsigned i=0; i<EV.rows(); ++i)\n    pFixed[i] = false;\n\n  vector<VectorXd> debug;\n\n  // debug\n//  MatrixXd B(F.rows(),3);\n//  for(unsigned i=0; i<F.rows(); ++i)\n//    B.row(i) = 1./3. * (V.row(F(i,0)) + V.row(F(i,1)) + V.row(F(i,2)));\n\n  vector<bool> visited(EV.rows());\n  for(unsigned i=0; i<EV.rows(); ++i)\n    visited[i] = false;\n\n  vector<bool> starting(EV.rows());\n  for(unsigned i=0; i<EV.rows(); ++i)\n    starting[i] = false;\n\n  queue<int> q;\n  for(unsigned i=0; i<F.rows(); ++i)\n    if (isHard[i] || wSoft[i] != 0)\n    {\n      q.push(i);\n      starting[i] = true;\n    }\n\n  // Reduce the search space (see MI paper)\n  while (!q.empty())\n  {\n    int c = q.front();\n    q.pop();\n\n    visited[c] = true;\n    for(int i=0; i<3; ++i)\n    {\n      int eid = FE(c,i);\n      int fid = TT(c,i);\n\n      // skip borders\n      if (fid != -1)\n      {\n        assert((EF(eid,0) == c && EF(eid,1) == fid) || (EF(eid,1) == c && EF(eid,0) == fid));\n        // for every neighbouring face\n        if (!visited[fid] && !starting[fid])\n        {\n          pFixed[eid] = true;\n          p[eid] = 0;\n          visited[fid] = true;\n          q.push(fid);\n\n        }\n      }\n      else\n      {\n        // fix borders\n        pFixed[eid] = true;\n        p[eid] = 0;\n      }\n    }\n\n  }\n\n  // Force matchings between fixed faces\n  for(unsigned i=0; i<F.rows();++i)\n  {\n    if (isHard[i])\n    {\n      for(unsigned int j=0; j<3; ++j)\n      {\n        int fid = TT(i,j);\n        if ((fid!=-1) && (isHard[fid]))\n        {\n          // i and fid are adjacent and fixed\n          int eid = FE(i,j);\n          int fid0 = EF(eid,0);\n          int fid1 = EF(eid,1);\n\n          pFixed[eid] = true;\n          p[eid] = roundl(2.0/M_PI*(hard(fid1) - hard(fid0) - k(eid)));\n        }\n      }\n    }\n  }\n\n//  std::ofstream s(\"/Users/daniele/debug.txt\");\n//  for(unsigned i=0; i<debug.size(); i += 2)\n//    s << debug[i].transpose() << \" \" << debug[i+1].transpose() << endl;\n//  s.close();\n\n}\n\ndouble igl::NRosyField::convert3DtoLocal(unsigned fid, const Eigen::Vector3d& v)\n{\n  using namespace std;\n  using namespace Eigen;\n\n  // Project onto the tangent plane\n  Vector2d vp = TPs[fid] * v;\n\n  // Convert to angle\n  return atan2(vp(1),vp(0));\n}\n\nEigen::Vector3d igl::NRosyField::convertLocalto3D(unsigned fid, double a)\n{\n  using namespace std;\n  using namespace Eigen;\n\n  Vector2d vp(cos(a),sin(a));\n  return vp.transpose() * TPs[fid];\n}\n\nEigen::VectorXd igl::NRosyField::angleDefect()\n{\n  Eigen::VectorXd A = Eigen::VectorXd::Constant(V.rows(),-2*M_PI);\n\n  for (unsigned i=0; i < F.rows(); ++i)\n  {\n    for (int j = 0; j < 3; ++j)\n    {\n      Eigen::VectorXd a = V.row(F(i,(j+1)%3)) - V.row(F(i,j));\n      Eigen::VectorXd b = V.row(F(i,(j+2)%3)) - V.row(F(i,j));\n      double t = a.transpose()*b;\n      t /= (a.norm() * b.norm());\n      A(F(i,j)) += acos(t);\n    }\n  }\n\n  return A;\n}\n\nvoid igl::NRosyField::findCones(int N)\n{\n  // Compute I0, see http://www.graphics.rwth-aachen.de/media/papers/bommes_zimmer_2009_siggraph_011.pdf for details\n\n  Eigen::VectorXd I0 = Eigen::VectorXd::Zero(V.rows());\n\n  // first the k\n  for (unsigned i=0; i < EV.rows(); ++i)\n  {\n    if (!isBorderEdge[i])\n    {\n      I0(EV(i,0)) -= k(i);\n      I0(EV(i,1)) += k(i);\n    }\n  }\n\n  // then the A\n  Eigen::VectorXd A = angleDefect();\n\n  I0 = I0 + A;\n\n  // normalize\n  I0 = I0 / (2*M_PI);\n\n  // round to integer (remove numerical noise)\n  for (unsigned i=0; i < I0.size(); ++i)\n    I0(i) = round(I0(i));\n\n  // compute I\n  Eigen::VectorXd I = I0;\n\n  for (unsigned i=0; i < EV.rows(); ++i)\n  {\n    if (!isBorderEdge[i])\n    {\n      I(EV(i,0)) -= double(p(i))/double(N);\n      I(EV(i,1)) += double(p(i))/double(N);\n    }\n  }\n\n  // Clear the vertices on the edges\n  for (unsigned i=0; i < EV.rows(); ++i)\n  {\n    if (isBorderEdge[i])\n    {\n      I0(EV(i,0)) = 0;\n      I0(EV(i,1)) = 0;\n      I(EV(i,0)) = 0;\n      I(EV(i,1)) = 0;\n      A(EV(i,0)) = 0;\n      A(EV(i,1)) = 0;\n    }\n  }\n\n  singularityIndex = I;\n}\n\nEigen::VectorXd igl::NRosyField::getSingularityIndexPerVertex()\n{\n  return singularityIndex;\n}\n\nIGL_INLINE void igl::nrosy(\n                           const Eigen::MatrixXd& V,\n                           const Eigen::MatrixXi& F,\n                           const Eigen::VectorXi& b,\n                           const Eigen::MatrixXd& bc,\n                           const Eigen::VectorXi& b_soft,\n                           const Eigen::VectorXd& w_soft,\n                           const Eigen::MatrixXd& bc_soft,\n                           const int N,\n                           const double soft,\n                           Eigen::MatrixXd& R,\n                           Eigen::VectorXd& S\n                           )\n{\n  // Init solver\n  igl::NRosyField solver(V,F);\n\n  // Add hard constraints\n  for (unsigned i=0; i<b.size();++i)\n    solver.setConstraintHard(b(i),bc.row(i));\n\n  // Add soft constraints\n  for (unsigned i=0; i<b_soft.size();++i)\n    solver.setConstraintSoft(b_soft(i),w_soft(i),bc_soft.row(i));\n\n  // Set the soft constraints global weight\n  solver.setSoftAlpha(soft);\n\n  // Interpolate\n  solver.solve(N);\n\n  // Copy the result back\n  R = solver.getFieldPerFace();\n\n  // Extract singularity indices\n  S = solver.getSingularityIndexPerVertex();\n}\n\n\nIGL_INLINE void igl::nrosy(\n                           const Eigen::MatrixXd& V,\n                           const Eigen::MatrixXi& F,\n                           const Eigen::VectorXi& b,\n                           const Eigen::MatrixXd& bc,\n                           const int N,\n                           Eigen::MatrixXd& R,\n                           Eigen::VectorXd& S\n                           )\n{\n  // Init solver\n  igl::NRosyField solver(V,F);\n\n  // Add hard constraints\n  for (unsigned i=0; i<b.size();++i)\n    solver.setConstraintHard(b(i),bc.row(i));\n\n  // Interpolate\n  solver.solve(N);\n\n  // Copy the result back\n  R = solver.getFieldPerFace();\n\n  // Extract singularity indices\n  S = solver.getSingularityIndexPerVertex();\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/comiso/nrosy.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_NROSY_H\n#define IGL_NROSY_H\n\n#include <iostream>\n#include <Eigen/Core>\n#include <Eigen/Sparse>\n#include <vector>\n#include <igl/igl_inline.h>\n\nnamespace igl\n{\n// Generate a N-RoSy field from a sparse set of constraints\n//\n// Inputs:\n//   V       #V by 3 list of mesh vertex coordinates\n//   F       #F by 3 list of mesh faces (must be triangles)\n//   b       #B by 1 list of constrained face indices\n//   bc      #B by 3 list of representative vectors for the constrained faces\n//   b_soft  #S by 1 b for soft constraints\n//   w_soft  #S by 1 weight for the soft constraints (0-1)\n//   bc_soft #S by 3 bc for soft constraints\n//   N       the degree of the N-RoSy vector field\n//   soft    the strenght of the soft contraints w.r.t. smoothness\n//           (0 -> smoothness only, 1->constraints only)\n\n// Outputs:\n//   R       #F by 3 the representative vectors of the interpolated field\n//   S       #V by 1 the singularity index for each vertex (0 = regular)\n\nIGL_INLINE void nrosy(\n  const Eigen::MatrixXd& V,\n  const Eigen::MatrixXi& F,\n  const Eigen::VectorXi& b,\n  const Eigen::MatrixXd& bc,\n  const Eigen::VectorXi& b_soft,\n  const Eigen::VectorXd& w_soft,\n  const Eigen::MatrixXd& bc_soft,\n  const int N,\n  const double soft,\n  Eigen::MatrixXd& R,\n  Eigen::VectorXd& S\n  );\n\n//wrapper for the case without soft constraints\nIGL_INLINE void nrosy(\n const Eigen::MatrixXd& V,\n const Eigen::MatrixXi& F,\n const Eigen::VectorXi& b,\n const Eigen::MatrixXd& bc,\n const int N,\n Eigen::MatrixXd& R,\n Eigen::VectorXd& S\n  );\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"nrosy.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/compile_and_link_program.cpp",
    "content": "#include \"compile_and_link_program.h\"\n#include \"compile_shader.h\"\n#include \"report_gl_error.h\"\n#include <iostream>\n#include <cassert>\n\nIGL_INLINE GLuint igl::compile_and_link_program(\n  const char * v_str, const char * f_str)\n{\n  GLuint vid = compile_shader(GL_VERTEX_SHADER,v_str);\n  GLuint fid = compile_shader(GL_FRAGMENT_SHADER,f_str);\n\n  GLuint prog_id = glCreateProgram();\n  assert(prog_id != 0 && \"Failed to create shader.\");\n  glAttachShader(prog_id,vid);\n  igl::report_gl_error(\"glAttachShader (vid): \");\n  glAttachShader(prog_id,fid);\n  igl::report_gl_error(\"glAttachShader (fid): \");\n\n  glLinkProgram(prog_id);\n  igl::report_gl_error(\"glLinkProgram: \");\n\n  GLint status;\n  glGetProgramiv(prog_id, GL_LINK_STATUS, &status);\n  if (status != GL_TRUE)\n  {\n    char buffer[512];\n    glGetProgramInfoLog(prog_id, 512, NULL, buffer);\n    std::cerr << \"Linker error: \" << std::endl << buffer << std::endl;\n    prog_id = 0;\n  }\n  return prog_id;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/compile_and_link_program.h",
    "content": "#ifndef IGL_COMPILE_AND_LINK_PROGRAM_H\n#define IGL_COMPILE_AND_LINK_PROGRAM_H\n#include \"igl_inline.h\"\n#include \"OpenGL_convenience.h\"\nnamespace igl\n{\n  // Compile and link very simple vertex/fragment shaders\n  //\n  // Inputs:\n  //   v_str  string of vertex shader contents\n  //   f_str  string of fragment shader contents\n  // Returns id of program\n  //\n  // Known bugs: this seems to duplicate `create_shader_program` with less\n  // functionality.\n  IGL_INLINE GLuint compile_and_link_program(\n    const char * v_str, const char * f_str);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"compile_and_link_program.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/compile_shader.cpp",
    "content": "#include \"compile_shader.h\"\n#include \"report_gl_error.h\"\n#include <iostream>\n\nIGL_INLINE GLuint igl::compile_shader(const GLint type, const char * str)\n{\n  GLuint id = glCreateShader(type);\n  igl::report_gl_error(\"glCreateShader: \");\n  glShaderSource(id,1,&str,NULL);\n  igl::report_gl_error(\"glShaderSource: \");\n  glCompileShader(id);\n  igl::report_gl_error(\"glCompileShader: \");\n\n  GLint status;\n  glGetShaderiv(id, GL_COMPILE_STATUS, &status);\n  if (status != GL_TRUE)\n  {\n    char buffer[512];\n    if (type == GL_VERTEX_SHADER)\n      std::cerr << \"Vertex shader:\" << std::endl;\n    else if (type == GL_FRAGMENT_SHADER)\n      std::cerr << \"Fragment shader:\" << std::endl;\n    std::cerr << str << std::endl << std::endl;\n    glGetShaderInfoLog(id, 512, NULL, buffer);\n    std::cerr << \"Error: \" << std::endl << buffer << std::endl;\n  }\n  return id;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/compile_shader.h",
    "content": "#ifndef IGL_COMPILE_SHADER_H\n#define IGL_COMPILE_SHADER_H\n#include \"OpenGL_convenience.h\"\n#include \"igl_inline.h\"\nnamespace igl\n{\n  // Compile a shader given type and string of shader code\n  // \n  // Inputs:\n  //   type  either GL_VERTEX_SHADER or GL_FRAGMENT_SHADER\n  //   str  contents of shader code\n  // Returns result of glCreateShader (id of shader)\n  //\n  // Example:\n  //     GLuint vid = compile_shader(GL_VERTEX_SHADER,vertex_shader.c_str());\n  //     GLuint fid = compile_shader(GL_FRAGMENT_SHADER,fragment_shader.c_str());\n  //     GLuint prog_id = glCreateProgram();\n  //     glAttachShader(prog_id,vid);\n  //     glAttachShader(prog_id,fid);\n  //     glLinkProgram(prog_id);\n  //\n  // Known bugs: seems to be duplicate of `load_shader`\n  IGL_INLINE GLuint compile_shader(const GLint type, const char * str);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"compile_shader.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/components.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"components.h\"\n#include \"adjacency_matrix.h\"\n#include <queue>\n#include <vector>\n\ntemplate <typename AScalar, typename DerivedC, typename Derivedcounts>\nIGL_INLINE void igl::components(\n  const Eigen::SparseMatrix<AScalar> & A,\n  Eigen::PlainObjectBase<DerivedC> & C,\n  Eigen::PlainObjectBase<Derivedcounts> & counts)\n{\n  using namespace Eigen;\n  using namespace std;\n  assert(A.rows() == A.cols() && \"A should be square.\");\n  const size_t n = A.rows();\n  Array<bool,Dynamic,1> seen = Array<bool,Dynamic,1>::Zero(n,1);\n  C.resize(n,1);\n  typename DerivedC::Scalar id = 0;\n  vector<typename Derivedcounts::Scalar> vcounts;\n  // breadth first search\n  for(int k=0; k<A.outerSize(); ++k)\n  {\n    if(seen(k))\n    {\n      continue;\n    }\n    queue<int> Q;\n    Q.push(k);\n    vcounts.push_back(0);\n    while(!Q.empty())\n    {\n      const int f = Q.front();\n      Q.pop();\n      if(seen(f))\n      {\n        continue;\n      }\n      seen(f) = true;\n      C(f,0) = id;\n      vcounts[id]++;\n      // Iterate over inside\n      for(typename SparseMatrix<AScalar>::InnerIterator it (A,f); it; ++it)\n      {\n        const int g = it.index();\n        if(!seen(g) && it.value())\n        {\n          Q.push(g);\n        }\n      }\n    }\n    id++;\n  }\n  assert((size_t) id == vcounts.size());\n  const size_t ncc = vcounts.size();\n  assert((size_t)C.maxCoeff()+1 == ncc);\n  counts.resize(ncc,1);\n  for(size_t i = 0;i<ncc;i++)\n  {\n    counts(i) = vcounts[i];\n  }\n}\n\ntemplate <typename AScalar, typename DerivedC>\nIGL_INLINE void igl::components(\n  const Eigen::SparseMatrix<AScalar> & A,\n  Eigen::PlainObjectBase<DerivedC> & C)\n{\n  Eigen::VectorXi counts;\n  return components(A,C,counts);\n}\n\ntemplate <typename DerivedF, typename DerivedC>\nIGL_INLINE void igl::components(\n  const Eigen::MatrixBase<DerivedF> & F,\n  Eigen::PlainObjectBase<DerivedC> & C)\n{\n  Eigen::SparseMatrix<typename DerivedC::Scalar> A;\n  adjacency_matrix(F,A);\n  return components(A,C);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::components<bool, Eigen::Array<int, -1, 1, 0, -1, 1> >(Eigen::SparseMatrix<bool, 0, int> const&, Eigen::PlainObjectBase<Eigen::Array<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::components<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::components<int, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::SparseMatrix<int, 0, int> const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::components<int, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::SparseMatrix<int, 0, int> const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::components<double, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::SparseMatrix<double, 0, int> const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::components<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/components.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COMPONENTS_H\n#define IGL_COMPONENTS_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <Eigen/Sparse>\nnamespace igl\n{\n  // Compute connected components of a graph represented by an adjacency\n  // matrix. This version is faster than the previous version using boost.\n  //\n  // Inputs:\n  //   A  n by n adjacency matrix\n  // Outputs:\n  //   C  n list of component ids (starting with 0)\n  //   counts  #components list of counts for each component\n  //\n  template <typename AScalar, typename DerivedC, typename Derivedcounts>\n  IGL_INLINE void components(\n    const Eigen::SparseMatrix<AScalar> & A,\n    Eigen::PlainObjectBase<DerivedC> & C,\n    Eigen::PlainObjectBase<Derivedcounts> & counts);\n  template <typename AScalar, typename DerivedC>\n  IGL_INLINE void components(\n    const Eigen::SparseMatrix<AScalar> & A,\n    Eigen::PlainObjectBase<DerivedC> & C);\n  // Ditto but for mesh faces as input. This computes connected components of\n  // **vertices** where **edges** establish connectivity.\n  //\n  // Inputs:\n  //   F  n by 3 list of triangle indices\n  // Outputs:\n  //   C  max(F) list of component ids\n  template <typename DerivedF, typename DerivedC>\n  IGL_INLINE void components(\n    const Eigen::MatrixBase<DerivedF> & F,\n    Eigen::PlainObjectBase<DerivedC> & C);\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"components.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/compute_frame_field_bisectors.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>, Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifdef WIN32\n  #define _USE_MATH_DEFINES\n#endif\n#include <cmath>\n\n#include \"compute_frame_field_bisectors.h\"\n#include \"igl/local_basis.h\"\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::compute_frame_field_bisectors(\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  const Eigen::PlainObjectBase<DerivedV>& B1,\n  const Eigen::PlainObjectBase<DerivedV>& B2,\n  const Eigen::PlainObjectBase<DerivedV>& PD1,\n  const Eigen::PlainObjectBase<DerivedV>& PD2,\n  Eigen::PlainObjectBase<DerivedV>& BIS1,\n  Eigen::PlainObjectBase<DerivedV>& BIS2)\n{\n  BIS1.resize(PD1.rows(),3);\n  BIS2.resize(PD1.rows(),3);\n\n  for (unsigned i=0; i<PD1.rows();++i)\n  {\n    // project onto the tangent plane and convert to angle\n    // Convert to angle\n    double a1 = atan2(B2.row(i).dot(PD1.row(i)),B1.row(i).dot(PD1.row(i)));\n    //make it positive by adding some multiple of 2pi\n    a1 += std::ceil (std::max(0., -a1) / (M_PI*2.)) * (M_PI*2.);\n    //take modulo 2pi\n    a1 = fmod(a1, (M_PI*2.));\n    double a2 = atan2(B2.row(i).dot(PD2.row(i)),B1.row(i).dot(PD2.row(i)));\n    //make it positive by adding some multiple of 2pi\n    a2 += std::ceil (std::max(0., -a2) / (M_PI*2.)) * (M_PI*2.);\n    //take modulo 2pi\n    a2 = fmod(a2, (M_PI*2.));\n\n    double b1 = (a1+a2)/2.0;\n    //make it positive by adding some multiple of 2pi\n    b1 += std::ceil (std::max(0., -b1) / (M_PI*2.)) * (M_PI*2.);\n    //take modulo 2pi\n    b1 = fmod(b1, (M_PI*2.));\n\n    double b2 = b1+(M_PI/2.);\n    //make it positive by adding some multiple of 2pi\n    b2 += std::ceil (std::max(0., -b2) / (M_PI*2.)) * (M_PI*2.);\n    //take modulo 2pi\n    b2 = fmod(b2, (M_PI*2.));\n\n    BIS1.row(i) = cos(b1) * B1.row(i) + sin(b1) * B2.row(i);\n    BIS2.row(i) = cos(b2) * B1.row(i) + sin(b2) * B2.row(i);\n\n  }\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::compute_frame_field_bisectors(\n                                                   const Eigen::PlainObjectBase<DerivedV>& V,\n                                                   const Eigen::PlainObjectBase<DerivedF>& F,\n                                                   const Eigen::PlainObjectBase<DerivedV>& PD1,\n                                                   const Eigen::PlainObjectBase<DerivedV>& PD2,\n                                                   Eigen::PlainObjectBase<DerivedV>& BIS1,\n                                                   Eigen::PlainObjectBase<DerivedV>& BIS2)\n{\n  DerivedV B1, B2, B3;\n  igl::local_basis(V,F,B1,B2,B3);\n\n  compute_frame_field_bisectors( V, F, B1, B2, PD1, PD2, BIS1, BIS2);\n\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::compute_frame_field_bisectors<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\ntemplate void igl::compute_frame_field_bisectors<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/compute_frame_field_bisectors.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>, Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_COMPUTE_FRAME_FIELD_BISECTORS_H\n#define IGL_COMPUTE_FRAME_FIELD_BISECTORS_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Compute bisectors of a frame field defined on mesh faces\n  // Inputs:\n  //   V     #V by 3 eigen Matrix of mesh vertex 3D positions\n  //   F     #F by 3 eigen Matrix of face (triangle) indices\n  //   B1    #F by 3 eigen Matrix of face (triangle) base vector 1\n  //   B2    #F by 3 eigen Matrix of face (triangle) base vector 2\n  //   PD1   #F by 3 eigen Matrix of the first per face frame field vector\n  //   PD2   #F by 3 eigen Matrix of the second per face frame field vector\n  // Output:\n  //   BIS1  #F by 3 eigen Matrix of the first per face frame field bisector\n  //   BIS2  #F by 3 eigen Matrix of the second per face frame field bisector\n  //\n  template <typename DerivedV, typename DerivedF>\n  IGL_INLINE void compute_frame_field_bisectors(\n                                                const Eigen::PlainObjectBase<DerivedV>& V,\n                                                const Eigen::PlainObjectBase<DerivedF>& F,\n                                                const Eigen::PlainObjectBase<DerivedV>& B1,\n                                                const Eigen::PlainObjectBase<DerivedV>& B2,\n                                                const Eigen::PlainObjectBase<DerivedV>& PD1,\n                                                const Eigen::PlainObjectBase<DerivedV>& PD2,\n                                                Eigen::PlainObjectBase<DerivedV>& BIS1,\n                                                Eigen::PlainObjectBase<DerivedV>& BIS2);\n\n  // Wrapper without given basis vectors.\n  template <typename DerivedV, typename DerivedF>\n  IGL_INLINE void compute_frame_field_bisectors(\n                                                const Eigen::PlainObjectBase<DerivedV>& V,\n                                                const Eigen::PlainObjectBase<DerivedF>& F,\n                                                const Eigen::PlainObjectBase<DerivedV>& PD1,\n                                                const Eigen::PlainObjectBase<DerivedV>& PD2,\n                                                Eigen::PlainObjectBase<DerivedV>& BIS1,\n                                                Eigen::PlainObjectBase<DerivedV>& BIS2);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"compute_frame_field_bisectors.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/conjugate_frame_fields.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include <igl/conjugate_frame_fields.h>\n#include <igl/speye.h>\n#include <igl/slice.h>\n#include <igl/polyroots.h>\n#include <Eigen/Sparse>\n\n#include <iostream>\n\nnamespace igl {\n  template <typename DerivedV, typename DerivedF, typename DerivedO>\n  class ConjugateFFSolver\n  {\n  public:\n    IGL_INLINE ConjugateFFSolver(const ConjugateFFSolverData<DerivedV, DerivedF> &_data,\n                                 int _maxIter = 50,\n                                 const typename DerivedV::Scalar _lambdaOrtho = .1,\n                                 const typename DerivedV::Scalar _lambdaInit = 100,\n                                 const typename DerivedV::Scalar _lambdaMultFactor = 1.01,\n                                 bool _doHardConstraints = true);\n    IGL_INLINE typename DerivedV::Scalar solve(const Eigen::VectorXi &isConstrained,\n                                               const Eigen::PlainObjectBase<DerivedO> &initialSolution,\n                                               Eigen::PlainObjectBase<DerivedO> &output);\n    \n  private:\n    \n    const ConjugateFFSolverData<DerivedV, DerivedF> &data;\n    \n    //polyVF data\n    Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic, 1> Acoeff, Bcoeff;\n    Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 2> pvU, pvV;\n    typename DerivedV::Scalar lambda;\n    \n    //parameters\n    typename DerivedV::Scalar lambdaOrtho;\n    typename DerivedV::Scalar lambdaInit,lambdaMultFactor;\n    int maxIter;\n    bool doHardConstraints;\n    \n    IGL_INLINE void localStep();\n    IGL_INLINE void getPolyCoeffsForLocalSolve(const Eigen::Matrix<typename DerivedV::Scalar, 4, 1> &s,\n                                               const Eigen::Matrix<typename DerivedV::Scalar, 4, 1> &z,\n                                               Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 1> &polyCoeff);\n    \n    IGL_INLINE void globalStep(const Eigen::Matrix<int, Eigen::Dynamic, 1>  &isConstrained,\n                               const Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic, 1>  &Ak,\n                               const Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic, 1>  &Bk);\n    IGL_INLINE void minQuadWithKnownMini(const Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > &Q,\n                                         const Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > &f,\n                                         const Eigen::VectorXi isConstrained,\n                                         const Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic, 1> &xknown,\n                                         Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic, 1> &x);\n    IGL_INLINE void setFieldFromCoefficients();\n    IGL_INLINE void setCoefficientsFromField();\n    \n  };\n}\n\n//Implementation\n/***************************** Solver ***********************************/\ntemplate <typename DerivedV, typename DerivedF, typename DerivedO>\nIGL_INLINE igl::ConjugateFFSolver<DerivedV, DerivedF, DerivedO>::\nConjugateFFSolver(const ConjugateFFSolverData<DerivedV, DerivedF> &_data,\n                  int _maxIter,\n                  const typename DerivedV::Scalar _lambdaOrtho,\n                  const typename DerivedV::Scalar _lambdaInit,\n                  const typename DerivedV::Scalar _lambdaMultFactor,\n                  bool _doHardConstraints):\ndata(_data),\nlambdaOrtho(_lambdaOrtho),\nlambdaInit(_lambdaInit),\nmaxIter(_maxIter),\nlambdaMultFactor(_lambdaMultFactor),\ndoHardConstraints(_doHardConstraints)\n{\n  Acoeff.resize(data.numF,1);\n  Bcoeff.resize(data.numF,1);\n  pvU.setZero(data.numF, 2);\n  pvV.setZero(data.numF, 2);\n};\n\n\n\ntemplate<typename DerivedV, typename DerivedF, typename DerivedO>\nIGL_INLINE void igl::ConjugateFFSolver<DerivedV, DerivedF, DerivedO>::\ngetPolyCoeffsForLocalSolve(const Eigen::Matrix<typename DerivedV::Scalar, 4, 1> &s,\n                           const Eigen::Matrix<typename DerivedV::Scalar, 4, 1> &z,\n                           Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 1> &polyCoeff)\n{\n  typename DerivedV::Scalar s0 = s(0);\n  typename DerivedV::Scalar s1 = s(1);\n  typename DerivedV::Scalar s2 = s(2);\n  typename DerivedV::Scalar s3 = s(3);\n  typename DerivedV::Scalar z0 = z(0);\n  typename DerivedV::Scalar z1 = z(1);\n  typename DerivedV::Scalar z2 = z(2);\n  typename DerivedV::Scalar z3 = z(3);\n  \n  polyCoeff.resize(7,1);\n  polyCoeff(0) =  s0*s0* s1*s1* s2*s2* s3* z3*z3 +  s0*s0* s1*s1* s2* s3*s3* z2*z2 +  s0*s0* s1* s2*s2* s3*s3* z1*z1 +  s0* s1*s1* s2*s2* s3*s3* z0*z0 ;\n  polyCoeff(1) = 2* s0*s0* s1*s1* s2* s3* z2*z2 + 2* s0*s0* s1*s1* s2* s3* z3*z3 + 2* s0*s0* s1* s2*s2* s3* z1*z1 + 2* s0*s0* s1* s2*s2* s3* z3*z3 + 2* s0*s0* s1* s2* s3*s3* z1*z1 + 2* s0*s0* s1* s2* s3*s3* z2*z2 + 2* s0* s1*s1* s2*s2* s3* z0*z0 + 2* s0* s1*s1* s2*s2* s3* z3*z3 + 2* s0* s1*s1* s2* s3*s3* z0*z0 + 2* s0* s1*s1* s2* s3*s3* z2*z2 + 2* s0* s1* s2*s2* s3*s3* z0*z0 + 2* s0* s1* s2*s2* s3*s3* z1*z1 ;\n  polyCoeff(2) =  s0*s0* s1*s1* s2* z2*z2 +  s0*s0* s1*s1* s3* z3*z3 +  s0*s0* s1* s2*s2* z1*z1 + 4* s0*s0* s1* s2* s3* z1*z1 + 4* s0*s0* s1* s2* s3* z2*z2 + 4* s0*s0* s1* s2* s3* z3*z3 +  s0*s0* s1* s3*s3* z1*z1 +  s0*s0* s2*s2* s3* z3*z3 +  s0*s0* s2* s3*s3* z2*z2 +  s0* s1*s1* s2*s2* z0*z0 + 4* s0* s1*s1* s2* s3* z0*z0 + 4* s0* s1*s1* s2* s3* z2*z2 + 4* s0* s1*s1* s2* s3* z3*z3 +  s0* s1*s1* s3*s3* z0*z0 + 4* s0* s1* s2*s2* s3* z0*z0 + 4* s0* s1* s2*s2* s3* z1*z1 + 4* s0* s1* s2*s2* s3* z3*z3 + 4* s0* s1* s2* s3*s3* z0*z0 + 4* s0* s1* s2* s3*s3* z1*z1 + 4* s0* s1* s2* s3*s3* z2*z2 +  s0* s2*s2* s3*s3* z0*z0 +  s1*s1* s2*s2* s3* z3*z3 +  s1*s1* s2* s3*s3* z2*z2 +  s1* s2*s2* s3*s3* z1*z1;\n  polyCoeff(3) = 2* s0*s0* s1* s2* z1*z1 + 2* s0*s0* s1* s2* z2*z2 + 2* s0*s0* s1* s3* z1*z1 + 2* s0*s0* s1* s3* z3*z3 + 2* s0*s0* s2* s3* z2*z2 + 2* s0*s0* s2* s3* z3*z3 + 2* s0* s1*s1* s2* z0*z0 + 2* s0* s1*s1* s2* z2*z2 + 2* s0* s1*s1* s3* z0*z0 + 2* s0* s1*s1* s3* z3*z3 + 2* s0* s1* s2*s2* z0*z0 + 2* s0* s1* s2*s2* z1*z1 + 8* s0* s1* s2* s3* z0*z0 + 8* s0* s1* s2* s3* z1*z1 + 8* s0* s1* s2* s3* z2*z2 + 8* s0* s1* s2* s3* z3*z3 + 2* s0* s1* s3*s3* z0*z0 + 2* s0* s1* s3*s3* z1*z1 + 2* s0* s2*s2* s3* z0*z0 + 2* s0* s2*s2* s3* z3*z3 + 2* s0* s2* s3*s3* z0*z0 + 2* s0* s2* s3*s3* z2*z2 + 2* s1*s1* s2* s3* z2*z2 + 2* s1*s1* s2* s3* z3*z3 + 2* s1* s2*s2* s3* z1*z1 + 2* s1* s2*s2* s3* z3*z3 + 2* s1* s2* s3*s3* z1*z1 + 2* s1* s2* s3*s3* z2*z2 ;\n  polyCoeff(4) =  s0*s0* s1* z1*z1 +  s0*s0* s2* z2*z2 +  s0*s0* s3* z3*z3 +  s0* s1*s1* z0*z0 + 4* s0* s1* s2* z0*z0 + 4* s0* s1* s2* z1*z1 + 4* s0* s1* s2* z2*z2 + 4* s0* s1* s3* z0*z0 + 4* s0* s1* s3* z1*z1 + 4* s0* s1* s3* z3*z3 +  s0* s2*s2* z0*z0 + 4* s0* s2* s3* z0*z0 + 4* s0* s2* s3* z2*z2 + 4* s0* s2* s3* z3*z3 +  s0* s3*s3* z0*z0 +  s1*s1* s2* z2*z2 +  s1*s1* s3* z3*z3 +  s1* s2*s2* z1*z1 + 4* s1* s2* s3* z1*z1 + 4* s1* s2* s3* z2*z2 + 4* s1* s2* s3* z3*z3 +  s1* s3*s3* z1*z1 +  s2*s2* s3* z3*z3 +  s2* s3*s3* z2*z2;\n  polyCoeff(5) = 2* s0* s1* z0*z0 + 2* s0* s1* z1*z1 + 2* s0* s2* z0*z0 + 2* s0* s2* z2*z2 + 2* s0* s3* z0*z0 + 2* s0* s3* z3*z3 + 2* s1* s2* z1*z1 + 2* s1* s2* z2*z2 + 2* s1* s3* z1*z1 + 2* s1* s3* z3*z3 + 2* s2* s3* z2*z2 + 2* s2* s3* z3*z3 ;\n  polyCoeff(6) =  s0* z0*z0 +  s1* z1*z1 +  s2* z2*z2 +  s3* z3*z3;\n  \n}\n\n\ntemplate<typename DerivedV, typename DerivedF, typename DerivedO>\nIGL_INLINE void igl::ConjugateFFSolver<DerivedV, DerivedF, DerivedO>::\nlocalStep()\n{\n  for (int j =0; j<data.numF; ++j)\n  {\n    Eigen::Matrix<typename DerivedV::Scalar, 4, 1> xproj; xproj << pvU.row(j).transpose(),pvV.row(j).transpose();\n    Eigen::Matrix<typename DerivedV::Scalar, 4, 1> z = data.UH[j].transpose()*xproj;\n    Eigen::Matrix<typename DerivedV::Scalar, 4, 1> x;\n    \n    Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 1> polyCoeff;\n    getPolyCoeffsForLocalSolve(data.s[j], z, polyCoeff);\n    Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic, 1> roots;\n    igl::polyRoots<typename DerivedV::Scalar, typename DerivedV::Scalar> (polyCoeff, roots );\n    \n    //  find closest real root to xproj\n    typename DerivedV::Scalar minDist = 1e10;\n    for (int i =0; i< 6; ++i)\n    {\n      if (fabs(imag(roots[i]))>1e-10)\n        continue;\n      Eigen::Matrix<typename DerivedV::Scalar, 4, 4> D = ((Eigen::Matrix<typename DerivedV::Scalar, 4, 1>::Ones()+real(roots(i))*data.s[j]).array().inverse()).matrix().asDiagonal();\n      Eigen::Matrix<typename DerivedV::Scalar, 4, 1> candidate = data.UH[j]*D*z;\n      typename DerivedV::Scalar dist = (candidate-xproj).norm();\n      if (dist<minDist)\n      {\n        minDist = dist;\n        x = candidate;\n      }\n      \n    }\n    \n    pvU.row(j) << x(0),x(1);\n    pvV.row(j) << x(2),x(3);\n  }\n}\n\n\ntemplate<typename DerivedV, typename DerivedF, typename DerivedO>\nIGL_INLINE void igl::ConjugateFFSolver<DerivedV, DerivedF, DerivedO>::\nsetCoefficientsFromField()\n{\n  for (int i = 0; i <data.numF; ++i)\n  {\n    std::complex<typename DerivedV::Scalar> u(pvU(i,0),pvU(i,1));\n    std::complex<typename DerivedV::Scalar> v(pvV(i,0),pvV(i,1));\n    Acoeff(i) = u*u+v*v;\n    Bcoeff(i) = u*u*v*v;\n  }\n}\n\n\ntemplate<typename DerivedV, typename DerivedF, typename DerivedO>\nIGL_INLINE void igl::ConjugateFFSolver<DerivedV, DerivedF, DerivedO>::\nglobalStep(const Eigen::Matrix<int, Eigen::Dynamic, 1>  &isConstrained,\n           const Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic, 1>  &Ak,\n           const Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic, 1>  &Bk)\n{\n  setCoefficientsFromField();\n  \n  Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > I;\n  igl::speye(data.numF, data.numF, I);\n  Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > QA = data.DDA+lambda*data.planarityWeight+lambdaOrtho*I;\n  Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > fA = (-2*lambda*data.planarityWeight*Acoeff).sparseView();\n  \n  Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > QB = data.DDB+lambda*data.planarityWeight;\n  Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > fB = (-2*lambda*data.planarityWeight*Bcoeff).sparseView();\n  \n  if(doHardConstraints)\n  {\n    minQuadWithKnownMini(QA, fA, isConstrained, Ak, Acoeff);\n    minQuadWithKnownMini(QB, fB, isConstrained, Bk, Bcoeff);\n  }\n  else\n  {\n    Eigen::Matrix<int, Eigen::Dynamic, 1>isknown_; isknown_.setZero(data.numF,1);\n    Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic, 1> xknown_; xknown_.setZero(0,1);\n    minQuadWithKnownMini(QA, fA, isknown_, xknown_, Acoeff);\n    minQuadWithKnownMini(QB, fB, isknown_, xknown_, Bcoeff);\n  }\n  setFieldFromCoefficients();\n  \n}\n\n\ntemplate<typename DerivedV, typename DerivedF, typename DerivedO>\nIGL_INLINE void igl::ConjugateFFSolver<DerivedV, DerivedF, DerivedO>::\nsetFieldFromCoefficients()\n{\n  for (int i = 0; i <data.numF; ++i)\n  {\n    //    poly coefficients: 1, 0, -Acoeff, 0, Bcoeff\n    //    matlab code from roots (given there are no trailing zeros in the polynomial coefficients)\n    Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic, 1> polyCoeff(5,1);\n    polyCoeff<<1., 0., -Acoeff(i), 0., Bcoeff(i);\n    \n    Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic, 1> roots;\n    polyRoots<std::complex<typename DerivedV::Scalar>>(polyCoeff,roots);\n    \n    std::complex<typename DerivedV::Scalar> u = roots[0];\n    int maxi = -1;\n    float maxd = -1;\n    for (int k =1; k<4; ++k)\n    {\n      float dist = abs(roots[k]+u);\n      if (dist>maxd)\n      {\n        maxd = dist;\n        maxi = k;\n      }\n    }\n    std::complex<typename DerivedV::Scalar> v = roots[maxi];\n    pvU(i,0) = real(u); pvU(i,1) = imag(u);\n    pvV(i,0) = real(v); pvV(i,1) = imag(v);\n  }\n  \n}\n\ntemplate<typename DerivedV, typename DerivedF, typename DerivedO>\nIGL_INLINE void igl::ConjugateFFSolver<DerivedV, DerivedF, DerivedO>::\nminQuadWithKnownMini(const Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > &Q,\n                     const Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > &f,\n                     const Eigen::VectorXi isConstrained,\n                     const Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic, 1> &xknown,\n                     Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic, 1> &x)\n{\n  int N = Q.rows();\n  \n  int nc = xknown.rows();\n  Eigen::VectorXi known; known.setZero(nc,1);\n  Eigen::VectorXi unknown; unknown.setZero(N-nc,1);\n  \n  int indk = 0, indu = 0;\n  for (int i = 0; i<N; ++i)\n    if (isConstrained[i])\n    {\n      known[indk] = i;\n      indk++;\n    }\n    else\n    {\n      unknown[indu] = i;\n      indu++;\n    }\n  \n  Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar>> Quu, Quk;\n  \n  igl::slice(Q,unknown, unknown, Quu);\n  igl::slice(Q,unknown, known, Quk);\n  \n  \n  std::vector<typename Eigen::Triplet<std::complex<typename DerivedV::Scalar> > > tripletList;\n  \n  Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > fu(N-nc,1);\n  \n  igl::slice(f,unknown, Eigen::VectorXi::Zero(1,1), fu);\n  \n  Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > rhs = (Quk*xknown).sparseView()+.5*fu;\n  \n  Eigen::SparseLU< Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar>>> solver;\n  solver.compute(-Quu);\n  if(solver.info()!=Eigen::Success)\n  {\n    std::cerr<<\"Decomposition failed!\"<<std::endl;\n    return;\n  }\n  Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar>>  b  = solver.solve(rhs);\n  if(solver.info()!=Eigen::Success)\n  {\n    std::cerr<<\"Solving failed!\"<<std::endl;\n    return;\n  }\n  \n  indk = 0, indu = 0;\n  x.setZero(N,1);\n  for (int i = 0; i<N; ++i)\n    if (isConstrained[i])\n      x[i] = xknown[indk++];\n    else\n      x[i] = b.coeff(indu++,0);\n  \n}\n\n\ntemplate<typename DerivedV, typename DerivedF, typename DerivedO>\nIGL_INLINE typename DerivedV::Scalar igl::ConjugateFFSolver<DerivedV, DerivedF, DerivedO>::\nsolve(const Eigen::VectorXi &isConstrained,\n      const Eigen::PlainObjectBase<DerivedO> &initialSolution,\n      Eigen::PlainObjectBase<DerivedO> &output)\n{\n  int numConstrained = isConstrained.sum();\n  // coefficient values\n  Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic, 1> Ak, Bk;\n  \n  pvU.resize(data.numF,2);\n  pvV.resize(data.numF,2);\n  for (int fi = 0; fi <data.numF; ++fi)\n  {\n    const Eigen::Matrix<typename DerivedV::Scalar, 1, 3> &b1 = data.B1.row(fi);\n    const Eigen::Matrix<typename DerivedV::Scalar, 1, 3> &b2 = data.B2.row(fi);\n    const Eigen::Matrix<typename DerivedV::Scalar, 1, 3> &u3 = initialSolution.block(fi,0,1,3);\n    const Eigen::Matrix<typename DerivedV::Scalar, 1, 3> &v3 = initialSolution.block(fi,3,1,3);\n    pvU.row(fi)<< u3.dot(b1), u3.dot(b2);\n    pvV.row(fi)<< v3.dot(b1), v3.dot(b2);\n  }\n  setCoefficientsFromField();\n  Ak.resize(numConstrained,1);\n  Bk.resize(numConstrained,1);\n  int ind = 0;\n  for (int i = 0; i <data.numF; ++i)\n  {\n    if(isConstrained[i])\n    {\n      Ak(ind) = Acoeff[i];\n      Bk(ind) = Bcoeff[i];\n      ind ++;\n    }\n  }\n  \n  \n  \n  typename DerivedV::Scalar smoothnessValue;\n  Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 1> conjValues;\n  typename DerivedV::Scalar meanConj;\n  typename DerivedV::Scalar maxConj;\n  \n  data.evaluateConjugacy(pvU, pvV, conjValues);\n  meanConj = conjValues.cwiseAbs().mean();\n  maxConj = conjValues.cwiseAbs().maxCoeff();\n  printf(\"Initial max non-conjugacy: %.5g\\n\",maxConj);\n  \n  smoothnessValue = (Acoeff.adjoint()*data.DDA*Acoeff + Bcoeff.adjoint()*data.DDB*Bcoeff).real()[0];\n  printf(\"\\n\\nInitial smoothness: %.5g\\n\",smoothnessValue);\n  \n  lambda = lambdaInit;\n  \n  bool doit = false;\n  for (int iter = 0; iter<maxIter; ++iter)\n  {\n    printf(\"\\n\\n--- Iteration %d ---\\n\",iter);\n    \n    typename DerivedV::Scalar oldMeanConj = meanConj;\n    \n    localStep();\n    globalStep(isConstrained, Ak, Bk);\n    \n    \n    smoothnessValue = (Acoeff.adjoint()*data.DDA*Acoeff + Bcoeff.adjoint()*data.DDB*Bcoeff).real()[0];\n    \n    printf(\"Smoothness: %.5g\\n\",smoothnessValue);\n    \n    data.evaluateConjugacy(pvU, pvV, conjValues);\n    meanConj = conjValues.cwiseAbs().mean();\n    maxConj = conjValues.cwiseAbs().maxCoeff();\n    printf(\"Mean/Max non-conjugacy: %.5g, %.5g\\n\",meanConj,maxConj);\n    typename DerivedV::Scalar diffMeanConj = fabs(oldMeanConj-meanConj);\n    \n    if (diffMeanConj<1e-4)\n      doit = true;\n    \n    if (doit)\n      lambda = lambda*lambdaMultFactor;\n    printf(\" %d %.5g %.5g\\n\",iter, smoothnessValue,maxConj);\n    \n  }\n  \n  output.setZero(data.numF,6);\n  for (int fi=0; fi<data.numF; ++fi)\n  {\n    const Eigen::Matrix<typename DerivedV::Scalar, 1, 3> &b1 = data.B1.row(fi);\n    const Eigen::Matrix<typename DerivedV::Scalar, 1, 3> &b2 = data.B2.row(fi);\n    output.block(fi,0, 1, 3) = pvU(fi,0)*b1 + pvU(fi,1)*b2;\n    output.block(fi,3, 1, 3) = pvV(fi,0)*b1 + pvV(fi,1)*b2;\n  }\n  \n  return lambda;\n}\n\n\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedO>\nIGL_INLINE void igl::conjugate_frame_fields(const Eigen::PlainObjectBase<DerivedV> &V,\n                                       const Eigen::PlainObjectBase<DerivedF> &F,\n                                       const Eigen::VectorXi &isConstrained,\n                                       const Eigen::PlainObjectBase<DerivedO> &initialSolution,\n                                       Eigen::PlainObjectBase<DerivedO> &output,\n                                       int maxIter,\n                                       const typename DerivedV::Scalar lambdaOrtho,\n                                       const typename DerivedV::Scalar lambdaInit,\n                                       const typename DerivedV::Scalar lambdaMultFactor,\n                                       bool doHardConstraints)\n{\n  igl::ConjugateFFSolverData<DerivedV, DerivedF> csdata(V, F);\n  igl::ConjugateFFSolver<DerivedV, DerivedF, DerivedO> cs(csdata, maxIter, lambdaOrtho, lambdaInit, lambdaMultFactor, doHardConstraints);\n  cs.solve(isConstrained, initialSolution, output);\n}\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedO>\nIGL_INLINE typename DerivedV::Scalar igl::conjugate_frame_fields(const igl::ConjugateFFSolverData<DerivedV, DerivedF> &csdata,\n                                                                 const Eigen::VectorXi &isConstrained,\n                                                                 const Eigen::PlainObjectBase<DerivedO> &initialSolution,\n                                                                 Eigen::PlainObjectBase<DerivedO> &output,\n                                                                 int maxIter,\n                                                                 const typename DerivedV::Scalar lambdaOrtho,\n                                                                 const typename DerivedV::Scalar lambdaInit,\n                                                                 const typename DerivedV::Scalar lambdaMultFactor,\n                                                                 bool doHardConstraints)\n{\n  igl::ConjugateFFSolver<DerivedV, DerivedF, DerivedO> cs(csdata, maxIter, lambdaOrtho, lambdaInit, lambdaMultFactor, doHardConstraints);\n  typename DerivedV::Scalar lambdaOut = cs.solve(isConstrained, initialSolution, output);\n  return lambdaOut;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate Eigen::Matrix<double, -1, -1, 0, -1, -1>::Scalar igl::conjugate_frame_fields<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(igl::ConjugateFFSolverData<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, int, Eigen::Matrix<double, -1, -1, 0, -1, -1>::Scalar, Eigen::Matrix<double, -1, -1, 0, -1, -1>::Scalar, Eigen::Matrix<double, -1, -1, 0, -1, -1>::Scalar, bool);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/conjugate_frame_fields.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_CONJUGATE_FRAME_FIELDS_H\n#define IGL_CONJUGATE_FRAME_FIELDS_H\n#include \"igl_inline.h\"\n#include \"ConjugateFFSolverData.h\"\n#include <Eigen/Core>\n#include <vector>\n\nnamespace igl {\n  //todo\n  // TODO: isConstrained should become a list of indices for consistency with\n  //       n_polyvector\n  \n  template <typename DerivedV, typename DerivedF, typename DerivedO>\n  IGL_INLINE void conjugate_frame_fields(const Eigen::PlainObjectBase<DerivedV> &V,\n                                         const Eigen::PlainObjectBase<DerivedF> &F,\n                                         const Eigen::VectorXi &isConstrained,\n                                         const Eigen::PlainObjectBase<DerivedO> &initialSolution,\n                                         Eigen::PlainObjectBase<DerivedO> &output,\n                                         int _maxIter = 50,\n                                         const typename DerivedV::Scalar _lambdaOrtho = .1,\n                                         const typename DerivedV::Scalar _lambdaInit = 100,\n                                         const typename DerivedV::Scalar _lambdaMultFactor = 1.01,\n                                         bool _doHardConstraints = true);\n  \n  template <typename DerivedV, typename DerivedF, typename DerivedO>\n  IGL_INLINE typename DerivedV::Scalar conjugate_frame_fields(const ConjugateFFSolverData<DerivedV, DerivedF> &csdata,\n                                                              const Eigen::VectorXi &isConstrained,\n                                                              const Eigen::PlainObjectBase<DerivedO> &initialSolution,\n                                                              Eigen::PlainObjectBase<DerivedO> &output,\n                                                              int _maxIter = 50,\n                                                              const typename DerivedV::Scalar _lambdaOrtho = .1,\n                                                              const typename DerivedV::Scalar _lambdaInit = 100,\n                                                              const typename DerivedV::Scalar _lambdaMultFactor = 1.01,\n                                                              bool _doHardConstraints = true);\n  \n};\n\n\n#ifndef IGL_STATIC_LIBRARY\n#include \"conjugate_frame_fields.cpp\"\n#endif\n\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/connect_boundary_to_infinity.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"connect_boundary_to_infinity.h\"\n#include \"boundary_facets.h\"\n\ntemplate <typename DerivedF, typename DerivedFO>\nIGL_INLINE void igl::connect_boundary_to_infinity(\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  Eigen::PlainObjectBase<DerivedFO> & FO)\n{\n  return connect_boundary_to_infinity(F,F.maxCoeff(),FO);\n}\ntemplate <typename DerivedF, typename DerivedFO>\nIGL_INLINE void igl::connect_boundary_to_infinity(\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  const typename DerivedF::Scalar inf_index,\n  Eigen::PlainObjectBase<DerivedFO> & FO)\n{\n  // Determine boundary edges\n  Eigen::Matrix<typename DerivedFO::Scalar,Eigen::Dynamic,Eigen::Dynamic> O;\n  boundary_facets(F,O);\n  FO.resize(F.rows()+O.rows(),F.cols());\n  typedef Eigen::Matrix<typename DerivedFO::Scalar,Eigen::Dynamic,1> VectorXI;\n  FO.topLeftCorner(F.rows(),F.cols()) = F;\n  FO.bottomLeftCorner(O.rows(),O.cols()) = O.rowwise().reverse();\n  FO.bottomRightCorner(O.rows(),1).setConstant(inf_index);\n}\n\ntemplate <\n  typename DerivedV, \n  typename DerivedF, \n  typename DerivedVO, \n  typename DerivedFO>\nIGL_INLINE void igl::connect_boundary_to_infinity(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  Eigen::PlainObjectBase<DerivedVO> & VO,\n  Eigen::PlainObjectBase<DerivedFO> & FO)\n{\n  typename DerivedV::Index inf_index = V.rows();\n  connect_boundary_to_infinity(F,inf_index,FO);\n  VO.resize(V.rows()+1,V.cols());\n  VO.topLeftCorner(V.rows(),V.cols()) = V;\n  auto inf = std::numeric_limits<typename DerivedVO::Scalar>::infinity();\n  VO.row(V.rows()).setConstant(inf);\n}\n\n#ifdef IGL_STATIC_LIBRARY\ntemplate void igl::connect_boundary_to_infinity<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/connect_boundary_to_infinity.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_CONNECT_BOUNDARY_TO_INFINITY_H\n#define IGL_CONNECT_BOUNDARY_TO_INFINITY_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Connect all boundary edges to a ficticious point at infinity.\n  //\n  // Inputs:\n  //   F  #F by 3 list of face indices into some V\n  // Outputs:\n  //   FO  #F+#O by 3 list of face indices into [V;inf inf inf], original F are\n  //     guaranteed to come first. If (V,F) was a manifold mesh, now it is\n  //     closed with a possibly non-manifold vertex at infinity (but it will be\n  //     edge-manifold).\n  template <typename DerivedF, typename DerivedFO>\n  IGL_INLINE void connect_boundary_to_infinity(\n    const Eigen::PlainObjectBase<DerivedF> & F,\n    Eigen::PlainObjectBase<DerivedFO> & FO);\n  // Inputs:\n  //   inf_index  index of point at infinity (usually V.rows() or F.maxCoeff())\n  template <typename DerivedF, typename DerivedFO>\n  IGL_INLINE void connect_boundary_to_infinity(\n    const Eigen::PlainObjectBase<DerivedF> & F,\n    const typename DerivedF::Scalar inf_index,\n    Eigen::PlainObjectBase<DerivedFO> & FO);\n  // Inputs:\n  //   V  #V by 3 list of vertex positions\n  //   F  #F by 3 list of face indices into some V\n  // Outputs:\n  //   VO  #V+1 by 3 list of vertex positions, original V are guaranteed to\n  //     come first. Last point is inf, inf, inf\n  //   FO  #F+#O by 3 list of face indices into VO\n  // \n  template <\n    typename DerivedV, \n    typename DerivedF, \n    typename DerivedVO, \n    typename DerivedFO>\n  IGL_INLINE void connect_boundary_to_infinity(\n    const Eigen::PlainObjectBase<DerivedV> & V,\n    const Eigen::PlainObjectBase<DerivedF> & F,\n    Eigen::PlainObjectBase<DerivedVO> & VO,\n    Eigen::PlainObjectBase<DerivedFO> & FO);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"connect_boundary_to_infinity.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/README.md",
    "content": "## IGL copyleft subdirectory\n\nFunctions in the `include/igl/copyleft/` subdirectory are in the\n`igl::copyleft::` namespace to indicate that they are under a more aggressive\n[copyleft](https://en.wikipedia.org/wiki/Copyleft) than\n[MPL2](https://en.wikipedia.org/wiki/Mozilla_Public_License) used for the main\n`include/igl` directory and `igl::` namespace. Most notably, this subdirectory\nincludes code that is under\n[GPL](https://en.wikipedia.org/wiki/GNU_General_Public_License).\n\nTypically a company planning on developing software without releasing its\nsource code will avoid or purchase licenses for such dependencies. If you do\nobtain such a license for the dependencies employed here, you are free to use\nthe libigl functions here as per their MPL2 license.\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/BinaryWindingNumberOperations.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Qingnan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n//\n#ifndef IGL_COPYLEFT_CGAL_BINARY_WINDING_NUMBER_OPERATIONS_H\n#define IGL_COPYLEFT_CGAL_BINARY_WINDING_NUMBER_OPERATIONS_H\n\n#include <stdexcept>\n#include \"../../igl_inline.h\"\n#include \"../../MeshBooleanType.h\"\n#include <Eigen/Core>\n\n// TODO: This is not written according to libigl style. These should be\n// function handles.\n//\n// Why is this templated on DerivedW\n//\n// These are all generalized to n-ary operations\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      template <igl::MeshBooleanType Op>\n      class BinaryWindingNumberOperations {\n        public:\n          template<typename DerivedW>\n            typename DerivedW::Scalar operator()(\n                const Eigen::PlainObjectBase<DerivedW>& /*win_nums*/) const {\n              throw (std::runtime_error(\"not implemented!\"));\n            }\n      };\n\n      // A ∪ B ∪ ... ∪ Z\n      template <>\n      class BinaryWindingNumberOperations<MESH_BOOLEAN_TYPE_UNION> {\n        public:\n          template<typename DerivedW>\n          typename DerivedW::Scalar operator()(\n              const Eigen::PlainObjectBase<DerivedW>& win_nums) const \n          {\n            for(int i = 0;i<win_nums.size();i++)\n            {\n              if(win_nums(i) > 0) return true;\n            }\n            return false;\n          }\n      };\n\n      // A ∩ B ∩ ... ∩ Z\n      template <>\n      class BinaryWindingNumberOperations<MESH_BOOLEAN_TYPE_INTERSECT> {\n        public:\n          template<typename DerivedW>\n          typename DerivedW::Scalar operator()(\n              const Eigen::PlainObjectBase<DerivedW>& win_nums) const \n          {\n            for(int i = 0;i<win_nums.size();i++)\n            {\n              if(win_nums(i)<=0) return false;\n            }\n            return true;\n          }\n      };\n\n      // A \\ B \\ ... \\ Z = A \\ (B ∪ ... ∪ Z)\n      template <>\n      class BinaryWindingNumberOperations<MESH_BOOLEAN_TYPE_MINUS> {\n        public:\n          template<typename DerivedW>\n          typename DerivedW::Scalar operator()(\n              const Eigen::PlainObjectBase<DerivedW>& win_nums) const \n          {\n            assert(win_nums.size()>1);\n            // Union of objects 1 through n-1\n            bool union_rest = false;\n            for(int i = 1;i<win_nums.size();i++)\n            {\n              union_rest = union_rest || win_nums(i) > 0;\n              if(union_rest) break;\n            }\n            // Must be in object 0 and not in union of objects 1 through n-1\n            return win_nums(0) > 0 && !union_rest;\n          }\n      };\n\n      // A ∆ B ∆ ... ∆ Z  (equivalent to set inside odd number of objects)\n      template <>\n      class BinaryWindingNumberOperations<MESH_BOOLEAN_TYPE_XOR> {\n        public:\n          template<typename DerivedW>\n          typename DerivedW::Scalar operator()(\n              const Eigen::PlainObjectBase<DerivedW>& win_nums) const \n          {\n            // If inside an odd number of objects\n            int count = 0;\n            for(int i = 0;i<win_nums.size();i++)\n            {\n              if(win_nums(i) > 0) count++;\n            }\n            return count % 2 == 1;\n          }\n      };\n\n      template <>\n      class BinaryWindingNumberOperations<MESH_BOOLEAN_TYPE_RESOLVE> {\n        public:\n          template<typename DerivedW>\n            typename DerivedW::Scalar operator()(\n                const Eigen::PlainObjectBase<DerivedW>& /*win_nums*/) const {\n              return true;\n            }\n      };\n\n      typedef BinaryWindingNumberOperations<MESH_BOOLEAN_TYPE_UNION> BinaryUnion;\n      typedef BinaryWindingNumberOperations<MESH_BOOLEAN_TYPE_INTERSECT> BinaryIntersect;\n      typedef BinaryWindingNumberOperations<MESH_BOOLEAN_TYPE_MINUS> BinaryMinus;\n      typedef BinaryWindingNumberOperations<MESH_BOOLEAN_TYPE_XOR> BinaryXor;\n      typedef BinaryWindingNumberOperations<MESH_BOOLEAN_TYPE_RESOLVE> BinaryResolve;\n\n      enum KeeperType {\n        KEEP_INSIDE,\n        KEEP_ALL\n      };\n\n      template<KeeperType T>\n      class WindingNumberFilter {\n        public:\n          template<typename DerivedW>\n            short operator()(\n                const Eigen::PlainObjectBase<DerivedW>& /*win_nums*/) const {\n              throw std::runtime_error(\"Not implemented\");\n            }\n      };\n\n      template<>\n      class WindingNumberFilter<KEEP_INSIDE> {\n        public:\n          template<typename T>\n          short operator()(T out_w, T in_w) const {\n            if (in_w > 0 && out_w <= 0) return 1;\n            else if (in_w <= 0 && out_w > 0) return -1;\n            else return 0;\n          }\n      };\n\n      template<>\n      class WindingNumberFilter<KEEP_ALL> {\n        public:\n          template<typename T>\n            short operator()(T /*out_w*/, T /*in_w*/) const {\n              return 1;\n            }\n      };\n\n      typedef WindingNumberFilter<KEEP_INSIDE> KeepInside;\n      typedef WindingNumberFilter<KEEP_ALL> KeepAll;\n    }\n  }\n}\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/CGAL_includes.hpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_CGAL_INCLUDES_H\n#define IGL_CGAL_INCLUDES_H\n\n// This causes unknown bugs during intersection meshing:\n//// http://www.alecjacobson.com/weblog/?p=4291\n//#define CGAL_INTERSECTION_VERSION 1\n// Use this instead to mute errors resulting from bad CGAL assertions\n#define CGAL_KERNEL_NO_ASSERTIONS\n// Triangle triangle intersection\n#include <CGAL/intersections.h>\n// THIS CANNOT BE INCLUDED IN THE SAME FILE AS <CGAL/intersections.h>\n// #include <CGAL/Boolean_set_operations_2.h>\n\n// Constrained Delaunay Triangulation types\n#include <CGAL/Constrained_Delaunay_triangulation_2.h>\n#include <CGAL/Constrained_triangulation_plus_2.h>\n\n// Axis-align boxes for all-pairs self-intersection detection\n#include <CGAL/point_generators_3.h>\n#include <CGAL/Bbox_3.h>\n#include <CGAL/box_intersection_d.h>\n#include <CGAL/function_objects.h>\n#include <CGAL/Join_input_iterator.h>\n#include <CGAL/algorithm.h>\n#include <vector>\n\n// Axis-aligned bounding box tree for tet tri intersection\n#include <CGAL/AABB_tree.h>\n#include <CGAL/AABB_traits.h>\n#include <CGAL/AABB_triangle_primitive.h>\n\n// Boolean operations\n#include <CGAL/Polyhedron_3.h>\n// Is this actually used?\n//#include <CGAL/Nef_polyhedron_3.h>\n\n// Delaunay Triangulation in 3D\n#include <CGAL/Delaunay_triangulation_3.h>\n\n#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/CSGTree.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_CGAL_CSG_TREE_H\n#define IGL_COPYLEFT_CGAL_CSG_TREE_H\n\n#include \"../../MeshBooleanType.h\"\n#include \"string_to_mesh_boolean_type.h\"\n#include \"mesh_boolean.h\"\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\n#include <CGAL/number_utils.h>\n\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // Class for defining and computing a constructive solid geometry result\n      // out of a tree of boolean operations on \"solid\" triangle meshes.\n      //\n      //template <typename DerivedF>\n      class CSGTree\n      {\n        public:\n          typedef CGAL::Epeck::FT ExactScalar;\n          //typedef Eigen::PlainObjectBase<DerivedF> POBF;\n          typedef Eigen::MatrixXi POBF;\n          typedef POBF::Index FIndex;\n          typedef Eigen::Matrix<ExactScalar,Eigen::Dynamic,3> MatrixX3E;\n          typedef Eigen::Matrix<FIndex,Eigen::Dynamic,1> VectorJ;\n        private:\n          // Resulting mesh\n          MatrixX3E m_V;\n          POBF m_F;\n          VectorJ m_J;\n          // Number of birth faces in A + those in B. I.e. sum of original \"leaf\"\n          // faces involved in result.\n          size_t m_number_of_birth_faces;\n        public:\n          CSGTree()\n          {\n          }\n          //typedef Eigen::MatrixXd MatrixX3E;\n          //typedef Eigen::MatrixXi POBF;\n          // http://stackoverflow.com/a/3279550/148668\n          CSGTree(const CSGTree & other)\n            :\n            // copy things\n            m_V(other.m_V),\n            // This is an issue if m_F is templated\n            // https://forum.kde.org/viewtopic.php?f=74&t=128414\n            m_F(other.m_F),\n            m_J(other.m_J),\n            m_number_of_birth_faces(other.m_number_of_birth_faces)\n          {\n          }\n          // copy-swap idiom\n          friend void swap(CSGTree& first, CSGTree& second)\n          {\n            using std::swap;\n            // swap things\n            swap(first.m_V,second.m_V);\n            // This is an issue if m_F is templated, similar to\n            // https://forum.kde.org/viewtopic.php?f=74&t=128414\n            swap(first.m_F,second.m_F);\n            swap(first.m_J,second.m_J);\n            swap(first.m_number_of_birth_faces,second.m_number_of_birth_faces);\n          }\n          // Pass-by-value (aka copy)\n          CSGTree& operator=(CSGTree other)\n          {\n            swap(*this,other);\n            return *this;\n          }\n          CSGTree(CSGTree&& other):\n            // initialize via default constructor\n            CSGTree() \n          {\n            swap(*this,other);\n          }\n          // Construct and compute a boolean operation on existing CSGTree nodes.\n          //\n          // Inputs:\n          //   A  Solid result of previous CSG operation (or identity, see below)\n          //   B  Solid result of previous CSG operation (or identity, see below)\n          //   type  type of mesh boolean to compute \n          CSGTree(\n            const CSGTree & A,\n            const CSGTree & B,\n            const MeshBooleanType & type)\n          {\n            // conduct boolean operation\n            mesh_boolean(A.V(),A.F(),B.V(),B.F(),type,m_V,m_F,m_J);\n            // reindex m_J\n            std::for_each(m_J.data(),m_J.data()+m_J.size(),\n              [&](typename VectorJ::Scalar & j) -> void\n              {\n                if(j < A.F().rows())\n                {\n                  j = A.J()(j);\n                }else\n                {\n                  assert(j<(A.F().rows()+B.F().rows()));\n                  j = A.number_of_birth_faces()+(B.J()(j-A.F().rows()));\n                }\n              });\n            m_number_of_birth_faces = \n              A.number_of_birth_faces() + B.number_of_birth_faces();\n          }\n          // Overload using string for type\n          CSGTree(\n            const CSGTree & A,\n            const CSGTree & B,\n            const std::string & s):\n            CSGTree(A,B,string_to_mesh_boolean_type(s))\n          {\n            // do nothing (all done in constructor).\n          }\n          // \"Leaf\" node with identity operation on assumed \"solid\" mesh (V,F)\n          //\n          // Inputs:\n          //   V  #V by 3 list of mesh vertices (in any precision, will be\n          //     converted to exact)\n          //   F  #F by 3 list of mesh face indices into V\n          template <typename DerivedV>\n          CSGTree(const Eigen::PlainObjectBase<DerivedV> & V, const POBF & F)//:\n          // Possible Eigen bug:\n          // https://forum.kde.org/viewtopic.php?f=74&t=128414\n            //m_V(V.template cast<ExactScalar>()),m_F(F)\n          {\n            m_V = V.template cast<ExactScalar>();\n            m_F = F;\n            // number of faces\n            m_number_of_birth_faces = m_F.rows();\n            // identity birth index\n            m_J = VectorJ::LinSpaced(\n              m_number_of_birth_faces,0,m_number_of_birth_faces-1);\n          }\n          // Returns reference to resulting mesh vertices m_V in exact scalar\n          // representation\n          const MatrixX3E & V() const\n          {\n            return m_V;\n          }\n          // Returns mesh vertices in the desired output type, casting when\n          // appropriate to floating precision.\n          template <typename DerivedV>\n          Eigen::PlainObjectBase<DerivedV> cast_V() const\n          {\n            Eigen::PlainObjectBase<DerivedV> dV;\n            dV.resize(m_V.rows(),m_V.cols());\n            for(int i = 0;i<m_V.rows();i++)\n            {\n              for(int j = 0;j<m_V.cols();j++)\n              {\n                dV(i,j) = CGAL::to_double(m_V(i,j));\n              }\n            }\n            return dV;\n          }\n          // Returns reference to resulting mesh faces m_F\n          const POBF & F() const\n          {\n            return m_F;\n          }\n          // Returns reference to \"birth parents\" indices into [F1;F2;...;Fn]\n          // where F1, ... , Fn are the face lists of the leaf (\"original\") input\n          // meshes.\n          const VectorJ & J() const\n          {\n            return m_J;\n          }\n          // The number of leaf faces = #F1 + #F2 + ... + #Fn\n          const size_t & number_of_birth_faces() const\n          {\n            return m_number_of_birth_faces;\n          }\n      };\n    }\n  }\n}\n\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/RemeshSelfIntersectionsParam.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_CGAL_REMESH_SELF_INTERSECTIONS_PARAM_H\n#define IGL_COPYLEFT_CGAL_REMESH_SELF_INTERSECTIONS_PARAM_H\n\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // Optional Parameters\n      //   DetectOnly  Only compute IF, leave VV and FF alone\n      struct RemeshSelfIntersectionsParam\n      {\n        bool detect_only;\n        bool first_only;\n        bool stitch_all;\n        inline RemeshSelfIntersectionsParam(\n          bool _detect_only=false, \n          bool _first_only=false,\n          bool _stitch_all=false):\n          detect_only(_detect_only),\n          first_only(_first_only),\n          stitch_all(_stitch_all){};\n      };\n    }\n  }\n}\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/SelfIntersectMesh.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_CGAL_SELFINTERSECTMESH_H\n#define IGL_COPYLEFT_CGAL_SELFINTERSECTMESH_H\n\n#include \"CGAL_includes.hpp\"\n#include \"RemeshSelfIntersectionsParam.h\"\n#include \"../../unique.h\"\n\n#include <Eigen/Dense>\n#include <list>\n#include <map>\n#include <vector>\n#include <thread>\n#include <mutex>\n\n//#define IGL_SELFINTERSECTMESH_DEBUG\n#ifndef IGL_FIRST_HIT_EXCEPTION\n#define IGL_FIRST_HIT_EXCEPTION 10\n#endif\n\n// The easiest way to keep track of everything is to use a class\n\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // Kernel is a CGAL kernel like:\n      //     CGAL::Exact_predicates_inexact_constructions_kernel\n      // or \n      //     CGAL::Exact_predicates_exact_constructions_kernel\n    \n      template <\n        typename Kernel,\n        typename DerivedV,\n        typename DerivedF,\n        typename DerivedVV,\n        typename DerivedFF,\n        typename DerivedIF,\n        typename DerivedJ,\n        typename DerivedIM>\n      class SelfIntersectMesh\n      {\n        typedef \n          SelfIntersectMesh<\n          Kernel,\n          DerivedV,\n          DerivedF,\n          DerivedVV,\n          DerivedFF,\n          DerivedIF,\n          DerivedJ,\n          DerivedIM> Self;\n        public:\n          // 3D Primitives\n          typedef CGAL::Point_3<Kernel>    Point_3;\n          typedef CGAL::Segment_3<Kernel>  Segment_3; \n          typedef CGAL::Triangle_3<Kernel> Triangle_3; \n          typedef CGAL::Plane_3<Kernel>    Plane_3;\n          typedef CGAL::Tetrahedron_3<Kernel> Tetrahedron_3; \n          // 2D Primitives\n          typedef CGAL::Point_2<Kernel>    Point_2;\n          typedef CGAL::Segment_2<Kernel>  Segment_2; \n          typedef CGAL::Triangle_2<Kernel> Triangle_2; \n          // 2D Constrained Delaunay Triangulation types\n          typedef CGAL::Exact_intersections_tag Itag;\n          // Axis-align boxes for all-pairs self-intersection detection\n          typedef std::vector<Triangle_3> Triangles;\n          typedef typename Triangles::iterator TrianglesIterator;\n          typedef typename Triangles::const_iterator TrianglesConstIterator;\n          typedef \n            CGAL::Box_intersection_d::Box_with_handle_d<double,3,TrianglesIterator> \n            Box;\n    \n          // Input mesh\n          const Eigen::PlainObjectBase<DerivedV> & V;\n          const Eigen::PlainObjectBase<DerivedF> & F;\n          // Number of self-intersecting triangle pairs\n          typedef typename DerivedF::Index Index;\n          Index count;\n          typedef std::vector<std::pair<Index, CGAL::Object>> ObjectList;\n          // Using a vector here makes this **not** output sensitive\n          Triangles T;\n          typedef std::vector<Index> IndexList;\n          IndexList lIF;\n          // #F-long list of faces with intersections mapping to the order in\n          // which they were first found\n          std::map<Index,ObjectList> offending;\n          // Make a short name for the edge map's key\n          typedef std::pair<Index,Index> EMK;\n          // Make a short name for the type stored at each edge, the edge map's\n          // value\n          typedef std::vector<Index> EMV;\n          // Make a short name for the edge map\n          typedef std::map<EMK,EMV> EdgeMap;\n          // Maps edges of offending faces to all incident offending faces\n          std::vector<std::pair<TrianglesIterator, TrianglesIterator> >\n              candidate_triangle_pairs;\n\n        public:\n          RemeshSelfIntersectionsParam params;\n        public:\n          // Constructs (VV,FF) a new mesh with self-intersections of (V,F)\n          // subdivided\n          //\n          // See also: remesh_self_intersections.h\n          inline SelfIntersectMesh(\n              const Eigen::PlainObjectBase<DerivedV> & V,\n              const Eigen::PlainObjectBase<DerivedF> & F,\n              const RemeshSelfIntersectionsParam & params,\n              Eigen::PlainObjectBase<DerivedVV> & VV,\n              Eigen::PlainObjectBase<DerivedFF> & FF,\n              Eigen::PlainObjectBase<DerivedIF> & IF,\n              Eigen::PlainObjectBase<DerivedJ> & J,\n              Eigen::PlainObjectBase<DerivedIM> & IM);\n        private:\n          // Helper function to mark a face as offensive\n          //\n          // Inputs:\n          //   f  index of face in F\n          inline void mark_offensive(const Index f);\n          // Helper function to count intersections between faces\n          //\n          // Input:\n          //   fa  index of face A in F\n          //   fb  index of face B in F\n          inline void count_intersection( const Index fa, const Index fb);\n          // Helper function for box_intersect. Intersect two triangles A and B,\n          // append the intersection object (point,segment,triangle) to a running\n          // list for A and B\n          //\n          // Inputs:\n          //   A  triangle in 3D\n          //   B  triangle in 3D\n          //   fa  index of A in F (and key into offending)\n          //   fb  index of B in F (and key into offending)\n          // Returns true only if A intersects B\n          //\n          inline bool intersect(\n              const Triangle_3 & A, \n              const Triangle_3 & B, \n              const Index fa,\n              const Index fb);\n          // Helper function for box_intersect. In the case where A and B have\n          // already been identified to share a vertex, then we only want to\n          // add possible segment intersections. Assumes truly duplicate\n          // triangles are not given as input\n          //\n          // Inputs:\n          //   A  triangle in 3D\n          //   B  triangle in 3D\n          //   fa  index of A in F (and key into offending)\n          //   fb  index of B in F (and key into offending)\n          //   va  index of shared vertex in A (and key into offending)\n          //   vb  index of shared vertex in B (and key into offending)\n          //   Returns true if intersection (besides shared point)\n          //\n          inline bool single_shared_vertex(\n              const Triangle_3 & A,\n              const Triangle_3 & B,\n              const Index fa,\n              const Index fb,\n              const Index va,\n              const Index vb);\n          // Helper handling one direction\n          inline bool single_shared_vertex(\n              const Triangle_3 & A,\n              const Triangle_3 & B,\n              const Index fa,\n              const Index fb,\n              const Index va);\n          // Helper function for box_intersect. In the case where A and B have\n          // already been identified to share two vertices, then we only want\n          // to add a possible coplanar (Triangle) intersection. Assumes truly\n          // degenerate facets are not givin as input.\n          inline bool double_shared_vertex(\n              const Triangle_3 & A,\n              const Triangle_3 & B,\n              const Index fa,\n              const Index fb,\n              const std::vector<std::pair<Index,Index> > shared);\n    \n        public:\n          // Callback function called during box self intersections test. Means\n          // boxes a and b intersect. This method then checks if the triangles\n          // in each box intersect and if so, then processes the intersections\n          //\n          // Inputs:\n          //   a  box containing a triangle\n          //   b  box containing a triangle\n          inline void box_intersect(const Box& a, const Box& b);\n          inline void process_intersecting_boxes();\n        public:\n          // Getters:\n          //const IndexList& get_lIF() const{ return lIF;}\n          static inline void box_intersect_static(\n            SelfIntersectMesh * SIM, \n            const Box &a, \n            const Box &b);\n        private:\n          std::mutex m_offending_lock;\n      };\n    }\n  }\n}\n\n// Implementation\n\n#include \"mesh_to_cgal_triangle_list.h\"\n#include \"remesh_intersections.h\"\n\n#include \"../../REDRUM.h\"\n#include \"../../get_seconds.h\"\n#include \"../../C_STR.h\"\n\n\n#include <functional>\n#include <algorithm>\n#include <exception>\n#include <cassert>\n#include <iostream>\n\n// References:\n// http://minregret.googlecode.com/svn/trunk/skyline/src/extern/CGAL-3.3.1/examples/Polyhedron/polyhedron_self_intersection.cpp\n// http://www.cgal.org/Manual/3.9/examples/Boolean_set_operations_2/do_intersect.cpp\n\n// Q: Should we be using CGAL::Polyhedron_3?\n// A: No! Input is just a list of unoriented triangles. Polyhedron_3 requires\n// a 2-manifold.\n// A: But! It seems we could use CGAL::Triangulation_3. Though it won't be easy\n// to take advantage of functions like insert_in_facet because we want to\n// constrain segments. Hmmm. Actualy Triangulation_3 doesn't look right...\n\n// CGAL's box_self_intersection_d uses C-style function callbacks without\n// userdata. This is a leapfrog method for calling a member function. It should\n// be bound as if the prototype was:\n//   static void box_intersect(const Box &a, const Box &b)\n// using boost:\n//  boost::function<void(const Box &a,const Box &b)> cb\n//    = boost::bind(&::box_intersect, this, _1,_2);\n//   \ntemplate <\n  typename Kernel,\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedVV,\n  typename DerivedFF,\n  typename DerivedIF,\n  typename DerivedJ,\n  typename DerivedIM>\ninline void igl::copyleft::cgal::SelfIntersectMesh<\n  Kernel,\n  DerivedV,\n  DerivedF,\n  DerivedVV,\n  DerivedFF,\n  DerivedIF,\n  DerivedJ,\n  DerivedIM>::box_intersect_static(\n  Self * SIM, \n  const typename Self::Box &a, \n  const typename Self::Box &b)\n{\n  SIM->box_intersect(a,b);\n}\n\ntemplate <\n  typename Kernel,\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedVV,\n  typename DerivedFF,\n  typename DerivedIF,\n  typename DerivedJ,\n  typename DerivedIM>\ninline igl::copyleft::cgal::SelfIntersectMesh<\n  Kernel,\n  DerivedV,\n  DerivedF,\n  DerivedVV,\n  DerivedFF,\n  DerivedIF,\n  DerivedJ,\n  DerivedIM>::SelfIntersectMesh(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  const RemeshSelfIntersectionsParam & params,\n  Eigen::PlainObjectBase<DerivedVV> & VV,\n  Eigen::PlainObjectBase<DerivedFF> & FF,\n  Eigen::PlainObjectBase<DerivedIF> & IF,\n  Eigen::PlainObjectBase<DerivedJ> & J,\n  Eigen::PlainObjectBase<DerivedIM> & IM):\n  V(V),\n  F(F),\n  count(0),\n  T(),\n  lIF(),\n  offending(),\n  params(params)\n{\n  using namespace std;\n  using namespace Eigen;\n\n#ifdef IGL_SELFINTERSECTMESH_DEBUG\n  const auto & tictoc = []() -> double\n  {\n    static double t_start = igl::get_seconds();\n    double diff = igl::get_seconds()-t_start;\n    t_start += diff;\n    return diff;\n  };\n  const auto log_time = [&](const std::string& label) -> void{\n    std::cout << \"SelfIntersectMesh.\" << label << \": \"\n      << tictoc() << std::endl;\n  };\n  tictoc();\n#endif\n\n  // Compute and process self intersections\n  mesh_to_cgal_triangle_list(V,F,T);\n#ifdef IGL_SELFINTERSECTMESH_DEBUG\n  log_time(\"convert_to_triangle_list\");\n#endif\n  // http://www.cgal.org/Manual/latest/doc_html/cgal_manual/Box_intersection_d/Chapter_main.html#Section_63.5 \n  // Create the corresponding vector of bounding boxes\n  std::vector<Box> boxes;\n  boxes.reserve(T.size());\n  for ( \n    TrianglesIterator tit = T.begin(); \n    tit != T.end(); \n    ++tit)\n  {\n    if (!tit->is_degenerate())\n    {\n      boxes.push_back(Box(tit->bbox(), tit));\n    }\n  }\n  // Leapfrog callback\n  std::function<void(const Box &a,const Box &b)> cb = \n    std::bind(&box_intersect_static, this, \n      // Explicitly use std namespace to avoid confusion with boost (who puts\n      // _1 etc. in global namespace)\n      std::placeholders::_1,\n      std::placeholders::_2);\n#ifdef IGL_SELFINTERSECTMESH_DEBUG\n  log_time(\"box_and_bind\");\n#endif\n  // Run the self intersection algorithm with all defaults\n  CGAL::box_self_intersection_d(boxes.begin(), boxes.end(),cb);\n#ifdef IGL_SELFINTERSECTMESH_DEBUG\n  log_time(\"box_intersection_d\");\n#endif\n  try{\n    process_intersecting_boxes();\n  }catch(int e)\n  {\n    // Rethrow if not IGL_FIRST_HIT_EXCEPTION\n    if(e != IGL_FIRST_HIT_EXCEPTION)\n    {\n      throw e;\n    }\n    // Otherwise just fall through\n  }\n#ifdef IGL_SELFINTERSECTMESH_DEBUG\n  log_time(\"resolve_intersection\");\n#endif\n\n  // Convert lIF to Eigen matrix\n  assert(lIF.size()%2 == 0);\n  IF.resize(lIF.size()/2,2);\n  {\n    Index i=0;\n    for(\n      typename IndexList::const_iterator ifit = lIF.begin();\n      ifit!=lIF.end();\n      )\n    {\n      IF(i,0) = (*ifit);\n      ifit++; \n      IF(i,1) = (*ifit);\n      ifit++;\n      i++;\n    }\n  }\n#ifdef IGL_SELFINTERSECTMESH_DEBUG\n  log_time(\"store_intersecting_face_pairs\");\n#endif\n\n  if(params.detect_only)\n  {\n    return;\n  }\n\n  remesh_intersections(\n    V,F,T,offending,params.stitch_all,VV,FF,J,IM);\n\n#ifdef IGL_SELFINTERSECTMESH_DEBUG\n  log_time(\"remesh_intersection\");\n#endif\n}\n\n\ntemplate <\n  typename Kernel,\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedVV,\n  typename DerivedFF,\n  typename DerivedIF,\n  typename DerivedJ,\n  typename DerivedIM>\ninline void igl::copyleft::cgal::SelfIntersectMesh<\n  Kernel,\n  DerivedV,\n  DerivedF,\n  DerivedVV,\n  DerivedFF,\n  DerivedIF,\n  DerivedJ,\n  DerivedIM>::mark_offensive(const Index f)\n{\n  using namespace std;\n  lIF.push_back(f);\n  if(offending.count(f) == 0)\n  {\n    // first time marking, initialize with new id and empty list\n    offending[f] = {};\n  }\n}\n\ntemplate <\n  typename Kernel,\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedVV,\n  typename DerivedFF,\n  typename DerivedIF,\n  typename DerivedJ,\n  typename DerivedIM>\ninline void igl::copyleft::cgal::SelfIntersectMesh<\n  Kernel,\n  DerivedV,\n  DerivedF,\n  DerivedVV,\n  DerivedFF,\n  DerivedIF,\n  DerivedJ,\n  DerivedIM>::count_intersection(\n  const Index fa,\n  const Index fb)\n{\n  std::lock_guard<std::mutex> guard(m_offending_lock);\n  mark_offensive(fa);\n  mark_offensive(fb);\n  this->count++;\n  // We found the first intersection\n  if(params.first_only && this->count >= 1)\n  {\n    throw IGL_FIRST_HIT_EXCEPTION;\n  }\n\n}\n\ntemplate <\n  typename Kernel,\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedVV,\n  typename DerivedFF,\n  typename DerivedIF,\n  typename DerivedJ,\n  typename DerivedIM>\ninline bool igl::copyleft::cgal::SelfIntersectMesh<\n  Kernel,\n  DerivedV,\n  DerivedF,\n  DerivedVV,\n  DerivedFF,\n  DerivedIF,\n  DerivedJ,\n  DerivedIM>::intersect(\n  const Triangle_3 & A, \n  const Triangle_3 & B, \n  const Index fa,\n  const Index fb)\n{\n  // Determine whether there is an intersection\n  if(!CGAL::do_intersect(A,B))\n  {\n    return false;\n  }\n  count_intersection(fa,fb);\n  if(!params.detect_only)\n  {\n    // Construct intersection\n    CGAL::Object result = CGAL::intersection(A,B);\n    std::lock_guard<std::mutex> guard(m_offending_lock);\n    offending[fa].push_back({fb, result});\n    offending[fb].push_back({fa, result});\n  }\n  return true;\n}\n\ntemplate <\n  typename Kernel,\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedVV,\n  typename DerivedFF,\n  typename DerivedIF,\n  typename DerivedJ,\n  typename DerivedIM>\ninline bool igl::copyleft::cgal::SelfIntersectMesh<\n  Kernel,\n  DerivedV,\n  DerivedF,\n  DerivedVV,\n  DerivedFF,\n  DerivedIF,\n  DerivedJ,\n  DerivedIM>::single_shared_vertex(\n  const Triangle_3 & A,\n  const Triangle_3 & B,\n  const Index fa,\n  const Index fb,\n  const Index va,\n  const Index vb)\n{\n  if(single_shared_vertex(A,B,fa,fb,va))\n  {\n    return true;\n  }\n  return single_shared_vertex(B,A,fb,fa,vb);\n}\n\ntemplate <\n  typename Kernel,\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedVV,\n  typename DerivedFF,\n  typename DerivedIF,\n  typename DerivedJ,\n  typename DerivedIM>\ninline bool igl::copyleft::cgal::SelfIntersectMesh<\n  Kernel,\n  DerivedV,\n  DerivedF,\n  DerivedVV,\n  DerivedFF,\n  DerivedIF,\n  DerivedJ,\n  DerivedIM>::single_shared_vertex(\n  const Triangle_3 & A,\n  const Triangle_3 & B,\n  const Index fa,\n  const Index fb,\n  const Index va)\n{\n  // This was not a good idea. It will not handle coplanar triangles well.\n  using namespace std;\n  Segment_3 sa(\n    A.vertex((va+1)%3),\n    A.vertex((va+2)%3));\n\n  if(CGAL::do_intersect(sa,B))\n  {\n    // can't put count_intersection(fa,fb) here since we use intersect below\n    // and then it will be counted twice.\n    if(params.detect_only)\n    {\n      count_intersection(fa,fb);\n      return true;\n    }\n    CGAL::Object result = CGAL::intersection(sa,B);\n    if(const Point_3 * p = CGAL::object_cast<Point_3 >(&result))\n    {\n      // Single intersection --> segment from shared point to intersection\n      CGAL::Object seg = CGAL::make_object(Segment_3(\n        A.vertex(va),\n        *p));\n      count_intersection(fa,fb);\n      std::lock_guard<std::mutex> guard(m_offending_lock);\n      offending[fa].push_back({fb, seg});\n      offending[fb].push_back({fa, seg});\n      return true;\n    }else if(CGAL::object_cast<Segment_3 >(&result))\n    {\n      // Need to do full test. Intersection could be a general poly.\n      bool test = intersect(A,B,fa,fb);\n      ((void)test);\n      assert(test && \"intersect should agree with do_intersect\");\n      return true;\n    }else\n    {\n      cerr<<REDRUM(\"Segment ∩ triangle neither point nor segment?\")<<endl;\n      assert(false);\n    }\n  }\n\n  return false;\n}\n\n\ntemplate <\n  typename Kernel,\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedVV,\n  typename DerivedFF,\n  typename DerivedIF,\n  typename DerivedJ,\n  typename DerivedIM>\ninline bool igl::copyleft::cgal::SelfIntersectMesh<\n  Kernel,\n  DerivedV,\n  DerivedF,\n  DerivedVV,\n  DerivedFF,\n  DerivedIF,\n  DerivedJ,\n  DerivedIM>::double_shared_vertex(\n  const Triangle_3 & A,\n  const Triangle_3 & B,\n  const Index fa,\n  const Index fb,\n  const std::vector<std::pair<Index,Index> > shared)\n{\n  using namespace std;\n\n  // must be co-planar\n  if(\n    A.supporting_plane() != B.supporting_plane() &&\n    A.supporting_plane() != B.supporting_plane().opposite())\n  {\n    return false;\n  }\n  // Since A and B are non-degenerate the intersection must be a polygon\n  // (triangle). Either\n  //   - the vertex of A (B) opposite the shared edge of lies on B (A), or\n  //   - an edge of A intersects and edge of B without sharing a vertex\n  //\n  // Determine if the vertex opposite edge (a0,a1) in triangle A lies in\n  // (intersects) triangle B\n  const auto & opposite_point_inside = [](\n    const Triangle_3 & A, const Index a0, const Index a1, const Triangle_3 & B) \n    -> bool\n  {\n    // get opposite index\n    Index a2 = -1;\n    for(int c = 0;c<3;c++)\n    {\n      if(c != a0 && c != a1)\n      {\n        a2 = c;\n        break;\n      }\n    }\n    assert(a2 != -1);\n    bool ret = CGAL::do_intersect(A.vertex(a2),B);\n    return ret;\n  };\n\n  // Determine if edge opposite vertex va in triangle A intersects edge\n  // opposite vertex vb in triangle B.\n  const auto & opposite_edges_intersect = [](\n    const Triangle_3 & A, const Index va,\n    const Triangle_3 & B, const Index vb) -> bool\n  {\n    Segment_3 sa( A.vertex((va+1)%3), A.vertex((va+2)%3));\n    Segment_3 sb( B.vertex((vb+1)%3), B.vertex((vb+2)%3));\n    bool ret = CGAL::do_intersect(sa,sb);\n    return ret;\n  };\n\n  if( \n    !opposite_point_inside(A,shared[0].first,shared[1].first,B) &&\n    !opposite_point_inside(B,shared[0].second,shared[1].second,A) &&\n    !opposite_edges_intersect(A,shared[0].first,B,shared[1].second) && \n    !opposite_edges_intersect(A,shared[1].first,B,shared[0].second))\n  {\n    return false;\n  }\n\n  // there is an intersection indeed\n  count_intersection(fa,fb);\n  if(params.detect_only)\n  {\n    return true;\n  }\n  // Construct intersection\n  try\n  {\n    // This can fail for Epick but not Epeck\n    CGAL::Object result = CGAL::intersection(A,B);\n    if(!result.empty())\n    {\n      if(CGAL::object_cast<Segment_3 >(&result))\n      {\n        // not coplanar\n        assert(false && \n          \"Co-planar non-degenerate triangles should intersect over triangle\");\n        return false;\n      } else if(CGAL::object_cast<Point_3 >(&result))\n      {\n        // this \"shouldn't\" happen but does for inexact\n        assert(false && \n          \"Co-planar non-degenerate triangles should intersect over triangle\");\n        return false;\n      } else\n      {\n        // Triangle object\n        std::lock_guard<std::mutex> guard(m_offending_lock);\n        offending[fa].push_back({fb, result});\n        offending[fb].push_back({fa, result});\n        return true;\n      }\n    }else\n    {\n      // CGAL::intersection is disagreeing with do_intersect\n      assert(false && \"CGAL::intersection should agree with predicate tests\");\n      return false;\n    }\n  }catch(...)\n  {\n    // This catches some cgal assertion:\n    //     CGAL error: assertion violation!\n    //     Expression : is_finite(d)\n    //     File       : /opt/local/include/CGAL/GMP/Gmpq_type.h\n    //     Line       : 132\n    //     Explanation: \n    // But only if NDEBUG is not defined, otherwise there's an uncaught\n    // \"Floating point exception: 8\" SIGFPE\n    return false;\n  }\n  // No intersection.\n  return false;\n}\n\ntemplate <\n  typename Kernel,\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedVV,\n  typename DerivedFF,\n  typename DerivedIF,\n  typename DerivedJ,\n  typename DerivedIM>\ninline void igl::copyleft::cgal::SelfIntersectMesh<\n  Kernel,\n  DerivedV,\n  DerivedF,\n  DerivedVV,\n  DerivedFF,\n  DerivedIF,\n  DerivedJ,\n  DerivedIM>::box_intersect(\n  const Box& a, \n  const Box& b)\n{\n  candidate_triangle_pairs.push_back({a.handle(), b.handle()});\n}\n\ntemplate <\n  typename Kernel,\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedVV,\n  typename DerivedFF,\n  typename DerivedIF,\n  typename DerivedJ,\n  typename DerivedIM>\ninline void igl::copyleft::cgal::SelfIntersectMesh<\n  Kernel,\n  DerivedV,\n  DerivedF,\n  DerivedVV,\n  DerivedFF,\n  DerivedIF,\n  DerivedJ,\n  DerivedIM>::process_intersecting_boxes()\n{\n  std::vector<std::mutex> triangle_locks(T.size());\n  std::vector<std::mutex> vertex_locks(V.rows());\n  std::mutex index_lock;\n  std::mutex exception_mutex;\n  bool exception_fired = false;\n  int exception = -1;\n  auto process_chunk = \n    [&](\n      const size_t first, \n      const size_t last) -> void\n  {\n    try\n    {\n      assert(last >= first);\n\n      for (size_t i=first; i<last; i++) \n      {\n        if(exception_fired) return;\n        Index fa=T.size(), fb=T.size();\n        {\n          // Before knowing which triangles are involved, we need to lock\n          // everything to prevent race condition in updating reference\n          // counters.\n          std::lock_guard<std::mutex> guard(index_lock);\n          const auto& tri_pair = candidate_triangle_pairs[i];\n          fa = tri_pair.first - T.begin();\n          fb = tri_pair.second - T.begin();\n        }\n        assert(fa < T.size());\n        assert(fb < T.size());\n\n        // Lock triangles\n        std::lock_guard<std::mutex> guard_A(triangle_locks[fa]);\n        std::lock_guard<std::mutex> guard_B(triangle_locks[fb]);\n\n        // Lock vertices\n        std::list<std::lock_guard<std::mutex> > guard_vertices;\n        {\n          std::vector<typename DerivedF::Scalar> unique_vertices;\n          std::vector<size_t> tmp1, tmp2;\n          igl::unique({F(fa,0), F(fa,1), F(fa,2), F(fb,0), F(fb,1), F(fb,2)},\n              unique_vertices, tmp1, tmp2);\n          std::for_each(unique_vertices.begin(), unique_vertices.end(),\n              [&](const typename DerivedF::Scalar& vi) {\n              guard_vertices.emplace_back(vertex_locks[vi]);\n              });\n        }\n        if(exception_fired) return;\n\n        const Triangle_3& A = T[fa];\n        const Triangle_3& B = T[fb];\n\n        // Number of combinatorially shared vertices\n        Index comb_shared_vertices = 0;\n        // Number of geometrically shared vertices (*not* including\n        // combinatorially shared)\n        Index geo_shared_vertices = 0;\n        // Keep track of shared vertex indices\n        std::vector<std::pair<Index,Index> > shared;\n        Index ea,eb;\n        for(ea=0;ea<3;ea++)\n        {\n          for(eb=0;eb<3;eb++)\n          {\n            if(F(fa,ea) == F(fb,eb))\n            {\n              comb_shared_vertices++;\n              shared.emplace_back(ea,eb);\n            }else if(A.vertex(ea) == B.vertex(eb))\n            {\n              geo_shared_vertices++;\n              shared.emplace_back(ea,eb);\n            }\n          }\n        }\n        const Index total_shared_vertices = \n          comb_shared_vertices + geo_shared_vertices;\n        if(exception_fired) return;\n\n        if(comb_shared_vertices== 3)\n        {\n          assert(shared.size() == 3);\n          // Combinatorially duplicate face, these should be removed by\n          // preprocessing\n          continue;\n        }\n        if(total_shared_vertices== 3)\n        {\n          assert(shared.size() == 3);\n          // Geometrically duplicate face, these should be removed by\n          // preprocessing\n          continue;\n        }\n        if(total_shared_vertices == 2)\n        {\n          assert(shared.size() == 2);\n          // Q: What about coplanar?\n          //\n          // o    o\n          // |\\  /|\n          // | \\/ |\n          // | /\\ |\n          // |/  \\|\n          // o----o\n          double_shared_vertex(A,B,fa,fb,shared);\n          continue;\n        }\n        assert(total_shared_vertices<=1);\n        if(total_shared_vertices==1)\n        {\n          single_shared_vertex(A,B,fa,fb,shared[0].first,shared[0].second);\n        }else\n        {\n          intersect(A,B,fa,fb);\n        }\n      }\n    }catch(int e)\n    {\n      std::lock_guard<std::mutex> exception_lock(exception_mutex);\n      exception_fired = true;\n      exception = e;\n    }\n  };\n  size_t num_threads=0;\n  const size_t hardware_limit = std::thread::hardware_concurrency();\n  if (const char* igl_num_threads = std::getenv(\"LIBIGL_NUM_THREADS\")) {\n    num_threads = atoi(igl_num_threads);\n  }\n  if (num_threads == 0 || num_threads > hardware_limit) {\n    num_threads = hardware_limit;\n  }\n  assert(num_threads > 0);\n  const size_t num_pairs = candidate_triangle_pairs.size();\n  const size_t chunk_size = num_pairs / num_threads;\n  std::vector<std::thread> threads;\n  for (size_t i=0; i<num_threads-1; i++) \n  {\n    threads.emplace_back(process_chunk, i*chunk_size, (i+1)*chunk_size);\n  }\n  // Do some work in the master thread.\n  process_chunk((num_threads-1)*chunk_size, num_pairs);\n  for (auto& t : threads) \n  {\n    if (t.joinable()) t.join();\n  }\n  if(exception_fired) throw exception;\n  //process_chunk(0, candidate_triangle_pairs.size());\n}\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/assign.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"assign.h\"\n#include \"assign_scalar.h\"\n\ntemplate <typename DerivedC, typename DerivedD>\nIGL_INLINE void igl::copyleft::cgal::assign(\n  const Eigen::PlainObjectBase<DerivedC> & C,\n  Eigen::PlainObjectBase<DerivedD> & D)\n{\n  D.resizeLike(C);\n  for(int i = 0;i<C.rows();i++)\n  {\n    for(int j = 0;j<C.cols();j++)\n    {\n      assign_scalar(C(i,j),D(i,j));\n    }\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::copyleft::cgal::assign<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\n// generated by autoexplicit.sh\ntemplate void igl::copyleft::cgal::assign<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> >&);\n// generated by autoexplicit.sh\ntemplate void igl::copyleft::cgal::assign<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::copyleft::cgal::assign<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::copyleft::cgal::assign<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::copyleft::cgal::assign<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::copyleft::cgal::assign<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\n// generated by autoexplicit.sh\ntemplate void igl::copyleft::cgal::assign<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> >&);\n// generated by autoexplicit.sh\ntemplate void igl::copyleft::cgal::assign<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::copyleft::cgal::assign<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> >&);\n// generated by autoexplicit.sh\ntemplate void igl::copyleft::cgal::assign<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\n// generated by autoexplicit.sh\ntemplate void igl::copyleft::cgal::assign<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 8, 3, 0, 8, 3>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 8, 3, 0, 8, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 8, 3, 0, 8, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 8, 3, 0, 8, 3> >&);\n// generated by autoexplicit.sh\ntemplate void igl::copyleft::cgal::assign<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 8, 3, 0, 8, 3>, Eigen::Matrix<double, 8, 3, 0, 8, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 8, 3, 0, 8, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 8, 3, 0, 8, 3> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/assign.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_CGAL_ASSIGN_H\n#define IGL_COPYLEFT_CGAL_ASSIGN_H\n#include \"../../igl_inline.h\"\n#include <Eigen/Core>\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\n\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      template <typename DerivedC, typename DerivedD>\n      IGL_INLINE void assign(\n        const Eigen::PlainObjectBase<DerivedC> & C,\n        Eigen::PlainObjectBase<DerivedD> & D);\n    }\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"assign.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/assign_scalar.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"assign_scalar.h\"\n\nIGL_INLINE void igl::copyleft::cgal::assign_scalar(\n  const CGAL::Epeck::FT & cgal,\n  CGAL::Epeck::FT & d)\n{\n  d = cgal;\n}\n\nIGL_INLINE void igl::copyleft::cgal::assign_scalar(\n  const CGAL::Epeck::FT & _cgal,\n  double & d)\n{\n  // FORCE evaluation of the exact type otherwise interval might be huge.\n  const CGAL::Epeck::FT cgal = _cgal.exact();\n  const auto interval = CGAL::to_interval(cgal);\n  d = interval.first;\n  do {\n      const double next = nextafter(d, interval.second);\n      if (CGAL::abs(cgal-d) < CGAL::abs(cgal-next)) break;\n      d = next;\n  } while (d < interval.second);\n}\n\nIGL_INLINE void igl::copyleft::cgal::assign_scalar(\n  const CGAL::Epeck::FT & _cgal,\n  float& d)\n{\n  // FORCE evaluation of the exact type otherwise interval might be huge.\n  const CGAL::Epeck::FT cgal = _cgal.exact();\n  const auto interval = CGAL::to_interval(cgal);\n  d = interval.first;\n  do {\n      const float next = nextafter(d, float(interval.second));\n      if (CGAL::abs(cgal-d) < CGAL::abs(cgal-next)) break;\n      d = next;\n  } while (d < float(interval.second));\n}\n\nIGL_INLINE void igl::copyleft::cgal::assign_scalar(\n  const double & c,\n  double & d)\n{\n  d = c;\n}\n\nIGL_INLINE void igl::copyleft::cgal::assign_scalar(\n  const float& c,\n  float& d)\n{\n  d = c;\n}\n\nIGL_INLINE void igl::copyleft::cgal::assign_scalar(\n  const float& c,\n  double& d)\n{\n  d = c;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/assign_scalar.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_CGAL_ASSIGN_SCALAR_H\n#define IGL_COPYLEFT_CGAL_ASSIGN_SCALAR_H\n#include \"../../igl_inline.h\"\n#include \"CGAL_includes.hpp\"\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // Inputs:\n      //   cgal  cgal scalar\n      // Outputs:\n      //   d  output scalar\n      IGL_INLINE void assign_scalar(\n        const CGAL::Epeck::FT & cgal,\n        CGAL::Epeck::FT & d);\n      IGL_INLINE void assign_scalar(\n        const CGAL::Epeck::FT & cgal,\n        double & d);\n      IGL_INLINE void assign_scalar(\n        const CGAL::Epeck::FT & cgal,\n        float& d);\n      IGL_INLINE void assign_scalar(\n        const double & c,\n        double & d);\n      IGL_INLINE void assign_scalar(\n        const float& c,\n        float & d);\n      IGL_INLINE void assign_scalar(\n        const float& c,\n        double& d);\n    }\n  }\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"assign_scalar.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/barycenter.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2017 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"../../barycenter.h\"\n#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\n#ifdef IGL_STATIC_LIBRARY\n#undef IGL_STATIC_LIBRARY\n#include \"../../barycenter.cpp\"\ntemplate void igl::barycenter<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/cell_adjacency.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Qingnan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n//\n\n#include \"cell_adjacency.h\"\n\ntemplate <typename DerivedC>\nIGL_INLINE void igl::copyleft::cgal::cell_adjacency(\n    const Eigen::PlainObjectBase<DerivedC>& per_patch_cells,\n    const size_t num_cells,\n    std::vector<std::set<std::tuple<typename DerivedC::Scalar, bool, size_t> > >&\n    adjacency_list) {\n\n  const size_t num_patches = per_patch_cells.rows();\n  adjacency_list.resize(num_cells);\n  for (size_t i=0; i<num_patches; i++) {\n    const int positive_cell = per_patch_cells(i,0);\n    const int negative_cell = per_patch_cells(i,1);\n    adjacency_list[positive_cell].emplace(negative_cell, false, i);\n    adjacency_list[negative_cell].emplace(positive_cell, true, i);\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\ntemplate void igl::copyleft::cgal::cell_adjacency<Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, unsigned long, std::vector<std::set<std::tuple<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Scalar, bool, unsigned long>, std::less<std::tuple<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Scalar, bool, unsigned long> >, std::allocator<std::tuple<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Scalar, bool, unsigned long> > >, std::allocator<std::set<std::tuple<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Scalar, bool, unsigned long>, std::less<std::tuple<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Scalar, bool, unsigned long> >, std::allocator<std::tuple<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Scalar, bool, unsigned long> > > > >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/cell_adjacency.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Qingnan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n//\n#ifndef IGL_COPYLEFT_CGAL_CELL_ADJACENCY_H\n#define IGL_COPYLEFT_CGAL_CELL_ADJACENCY_H\n#include \"../../igl_inline.h\"\n#include <Eigen/Core>\n#include <set>\n#include <tuple>\n#include <vector>\n\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // Inputs:\n      //   per_patch_cells  #P by 2 list of cell labels on each side of each\n      //                    patch.  Cell labels are assumed to be continuous\n      //                    from 0 to #C.\n      //   num_cells        number of cells.\n      //\n      // Outputs:\n      //   adjacency_list  #C array of list of adjcent cell informations.  If\n      //                   cell i and cell j are adjacent via patch x, where i\n      //                   is on the positive side of x, and j is on the\n      //                   negative side.  Then,\n      //                   adjacency_list[i] will contain the entry {j, false, x}\n      //                   and\n      //                   adjacency_list[j] will contain the entry {i, true, x}\n      template < typename DerivedC >\n      IGL_INLINE void cell_adjacency(\n          const Eigen::PlainObjectBase<DerivedC>& per_patch_cells,\n          const size_t num_cells,\n          std::vector<std::set<std::tuple<typename DerivedC::Scalar, bool, size_t> > >&\n          adjacency_list);\n    }\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"cell_adjacency.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/closest_facet.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Qingnan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n//\n#include \"closest_facet.h\"\n\n#include <vector>\n#include <stdexcept>\n#include <unordered_map>\n\n#include \"order_facets_around_edge.h\"\n#include \"submesh_aabb_tree.h\"\n#include \"../../vertex_triangle_adjacency.h\"\n#include \"../../LinSpaced.h\"\n//#include \"../../writePLY.h\"\n\ntemplate<\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedI,\n  typename DerivedP,\n  typename uE2EType,\n  typename DerivedEMAP,\n  typename DerivedR,\n  typename DerivedS >\nIGL_INLINE void igl::copyleft::cgal::closest_facet(\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    const Eigen::PlainObjectBase<DerivedI>& I,\n    const Eigen::PlainObjectBase<DerivedP>& P,\n    const std::vector<std::vector<uE2EType> >& uE2E,\n    const Eigen::PlainObjectBase<DerivedEMAP>& EMAP,\n    Eigen::PlainObjectBase<DerivedR>& R,\n    Eigen::PlainObjectBase<DerivedS>& S)\n{\n\n  typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;\n  typedef Kernel::Point_3 Point_3;\n  typedef Kernel::Plane_3 Plane_3;\n  typedef Kernel::Segment_3 Segment_3;\n  typedef Kernel::Triangle_3 Triangle;\n  typedef std::vector<Triangle>::iterator Iterator;\n  typedef CGAL::AABB_triangle_primitive<Kernel, Iterator> Primitive;\n  typedef CGAL::AABB_traits<Kernel, Primitive> AABB_triangle_traits;\n  typedef CGAL::AABB_tree<AABB_triangle_traits> Tree;\n\n  if (F.rows() <= 0 || I.rows() <= 0) {\n    throw std::runtime_error(\n        \"Closest facet cannot be computed on empty mesh.\");\n  }\n\n  std::vector<std::vector<size_t> > VF, VFi;\n  igl::vertex_triangle_adjacency(V.rows(), F, VF, VFi);\n  std::vector<bool> in_I;\n  std::vector<Triangle> triangles;\n  Tree tree;\n  submesh_aabb_tree(V,F,I,tree,triangles,in_I);\n\n  return closest_facet(\n    V,F,I,P,uE2E,EMAP,VF,VFi,tree,triangles,in_I,R,S);\n}\n\ntemplate<\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedI,\n  typename DerivedP,\n  typename uE2EType,\n  typename DerivedEMAP,\n  typename Kernel,\n  typename DerivedR,\n  typename DerivedS >\nIGL_INLINE void igl::copyleft::cgal::closest_facet(\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    const Eigen::PlainObjectBase<DerivedI>& I,\n    const Eigen::PlainObjectBase<DerivedP>& P,\n    const std::vector<std::vector<uE2EType> >& uE2E,\n    const Eigen::PlainObjectBase<DerivedEMAP>& EMAP,\n    const std::vector<std::vector<size_t> > & VF,\n    const std::vector<std::vector<size_t> > & VFi,\n    const CGAL::AABB_tree<\n      CGAL::AABB_traits<\n        Kernel, \n        CGAL::AABB_triangle_primitive<\n          Kernel, typename std::vector<\n            typename Kernel::Triangle_3 >::iterator > > > & tree,\n    const std::vector<typename Kernel::Triangle_3 > & triangles,\n    const std::vector<bool> & in_I,\n    Eigen::PlainObjectBase<DerivedR>& R,\n    Eigen::PlainObjectBase<DerivedS>& S)\n{\n  typedef typename Kernel::Point_3 Point_3;\n  typedef typename Kernel::Plane_3 Plane_3;\n  typedef typename Kernel::Segment_3 Segment_3;\n  typedef typename Kernel::Triangle_3 Triangle;\n  typedef typename std::vector<Triangle>::iterator Iterator;\n  typedef typename CGAL::AABB_triangle_primitive<Kernel, Iterator> Primitive;\n  typedef typename CGAL::AABB_traits<Kernel, Primitive> AABB_triangle_traits;\n  typedef typename CGAL::AABB_tree<AABB_triangle_traits> Tree;\n\n  const size_t num_faces = I.rows();\n  if (F.rows() <= 0 || I.rows() <= 0) {\n    throw std::runtime_error(\n        \"Closest facet cannot be computed on empty mesh.\");\n  }\n\n  auto on_the_positive_side = [&](size_t fid, const Point_3& p) -> bool\n  {\n    const auto& f = F.row(fid).eval();\n    Point_3 v0(V(f[0], 0), V(f[0], 1), V(f[0], 2));\n    Point_3 v1(V(f[1], 0), V(f[1], 1), V(f[1], 2));\n    Point_3 v2(V(f[2], 0), V(f[2], 1), V(f[2], 2));\n    auto ori = CGAL::orientation(v0, v1, v2, p);\n    switch (ori) {\n      case CGAL::POSITIVE:\n        return true;\n      case CGAL::NEGATIVE:\n        return false;\n      case CGAL::COPLANAR:\n        // Warning:\n        // This can only happen if fid contains a boundary edge.\n        // Catergorized this ambiguous case as negative side.\n        return false;\n      default:\n        throw std::runtime_error(\"Unknown CGAL state.\");\n    }\n    return false;\n  };\n\n  auto get_orientation = [&](size_t fid, size_t s, size_t d) -> bool \n  {\n    const auto& f = F.row(fid);\n    if      ((size_t)f[0] == s && (size_t)f[1] == d) return false;\n    else if ((size_t)f[1] == s && (size_t)f[2] == d) return false;\n    else if ((size_t)f[2] == s && (size_t)f[0] == d) return false;\n    else if ((size_t)f[0] == d && (size_t)f[1] == s) return true;\n    else if ((size_t)f[1] == d && (size_t)f[2] == s) return true;\n    else if ((size_t)f[2] == d && (size_t)f[0] == s) return true;\n    else {\n      throw std::runtime_error(\n          \"Cannot compute orientation due to incorrect connectivity\");\n      return false;\n    }\n  };\n  auto index_to_signed_index = [&](size_t index, bool ori) -> int{\n    return (index+1) * (ori? 1:-1);\n  };\n  //auto signed_index_to_index = [&](int signed_index) -> size_t {\n  //    return abs(signed_index) - 1;\n  //};\n\n  enum ElementType { VERTEX, EDGE, FACE };\n  auto determine_element_type = [&](const Point_3& p, const size_t fid,\n      size_t& element_index) -> ElementType {\n    const auto& tri = triangles[fid];\n    const Point_3 p0 = tri[0];\n    const Point_3 p1 = tri[1];\n    const Point_3 p2 = tri[2];\n\n    if (p == p0) { element_index = 0; return VERTEX; }\n    if (p == p1) { element_index = 1; return VERTEX; }\n    if (p == p2) { element_index = 2; return VERTEX; }\n    if (CGAL::collinear(p0, p1, p)) { element_index = 2; return EDGE; }\n    if (CGAL::collinear(p1, p2, p)) { element_index = 0; return EDGE; }\n    if (CGAL::collinear(p2, p0, p)) { element_index = 1; return EDGE; }\n\n    element_index = 0;\n    return FACE;\n  };\n\n  auto process_edge_case = [&](\n      size_t query_idx,\n      const size_t s, const size_t d,\n      size_t preferred_facet,\n      bool& orientation) -> size_t \n  {\n    Point_3 query_point(\n      P(query_idx, 0),\n      P(query_idx, 1),\n      P(query_idx, 2));\n\n    size_t corner_idx = std::numeric_limits<size_t>::max();\n    if ((s == F(preferred_facet, 0) && d == F(preferred_facet, 1)) ||\n        (s == F(preferred_facet, 1) && d == F(preferred_facet, 0))) \n    {\n      corner_idx = 2;\n    } else if ((s == F(preferred_facet, 0) && d == F(preferred_facet, 2)) ||\n        (s == F(preferred_facet, 2) && d == F(preferred_facet, 0))) \n    {\n      corner_idx = 1;\n    } else if ((s == F(preferred_facet, 1) && d == F(preferred_facet, 2)) ||\n        (s == F(preferred_facet, 2) && d == F(preferred_facet, 1))) \n    {\n      corner_idx = 0;\n    } else \n    {\n      std::cerr << \"s: \" << s << \"\\t d:\" << d << std::endl;\n      std::cerr << F.row(preferred_facet) << std::endl;\n      throw std::runtime_error(\n          \"Invalid connectivity, edge does not belong to facet\");\n    }\n\n    auto ueid = EMAP(preferred_facet + corner_idx * F.rows());\n    auto eids = uE2E[ueid];\n    std::vector<size_t> intersected_face_indices;\n    for (auto eid : eids) \n    {\n      const size_t fid = eid % F.rows();\n      if (in_I[fid]) \n      {\n        intersected_face_indices.push_back(fid);\n      }\n    }\n\n    const size_t num_intersected_faces = intersected_face_indices.size();\n    std::vector<int> intersected_face_signed_indices(num_intersected_faces);\n    std::transform(\n        intersected_face_indices.begin(),\n        intersected_face_indices.end(),\n        intersected_face_signed_indices.begin(),\n        [&](size_t index) {\n        return index_to_signed_index(\n          index, get_orientation(index, s,d));\n        });\n\n    assert(num_intersected_faces >= 1);\n    if (num_intersected_faces == 1) \n    {\n      // The edge must be a boundary edge.  Thus, the orientation can be\n      // simply determined by checking if the query point is on the\n      // positive side of the facet.\n      const size_t fid = intersected_face_indices[0];\n      orientation = on_the_positive_side(fid, query_point);\n      return fid;\n    }\n\n    Eigen::VectorXi order;\n    DerivedP pivot = P.row(query_idx).eval();\n    igl::copyleft::cgal::order_facets_around_edge(V, F, s, d,\n      intersected_face_signed_indices,\n      pivot, order);\n\n    // Although first and last are equivalent, make the choice based on\n    // preferred_facet.\n    const size_t first = order[0];\n    const size_t last = order[num_intersected_faces-1];\n    if (intersected_face_indices[first] == preferred_facet) {\n      orientation = intersected_face_signed_indices[first] < 0;\n      return intersected_face_indices[first];\n    } else if (intersected_face_indices[last] == preferred_facet) {\n      orientation = intersected_face_signed_indices[last] > 0;\n      return intersected_face_indices[last];\n    } else {\n      orientation = intersected_face_signed_indices[order[0]] < 0;\n      return intersected_face_indices[order[0]];\n    }\n  };\n\n  auto process_face_case = [&](\n      const size_t query_idx, const Point_3& closest_point,\n      const size_t fid, bool& orientation) -> size_t {\n    const auto& f = F.row(I(fid, 0));\n    return process_edge_case(query_idx, f[0], f[1], I(fid, 0), orientation);\n  };\n\n  // Given that the closest point to query point P(query_idx,:) on (V,F(I,:))\n  // is the vertex at V(s,:) which is incident at least on triangle\n  // F(preferred_facet,:), determine a facet incident on V(s,:) that is\n  // _exposed_ to the query point and determine whether that facet is facing\n  // _toward_ or _away_ from the query point.\n  //\n  // Inputs:\n  //   query_idx  index into P of query point\n  //   s  index into V of closest point at vertex\n  //   preferred_facet  facet incident on s\n  // Outputs:\n  //   orientation  whether returned face is facing toward or away from\n  //     query (parity unclear)\n  // Returns face guaranteed to be \"exposed\" to P(query_idx,:)\n  auto process_vertex_case = [&](\n    const size_t query_idx, \n    size_t s,\n    size_t preferred_facet, \n    bool& orientation) -> size_t\n  {\n    const Point_3 query_point(\n        P(query_idx, 0), P(query_idx, 1), P(query_idx, 2));\n    const Point_3 closest_point(V(s, 0), V(s, 1), V(s, 2));\n    std::vector<size_t> adj_faces;\n    std::vector<size_t> adj_face_corners;\n    {\n      // Gather adj faces to s within I.\n      const auto& all_adj_faces = VF[s];\n      const auto& all_adj_face_corners = VFi[s];\n      const size_t num_all_adj_faces = all_adj_faces.size();\n      for (size_t i=0; i<num_all_adj_faces; i++) \n      {\n        const size_t fid = all_adj_faces[i];\n        // Shouldn't this always be true if I is a full connected component?\n        if (in_I[fid]) \n        {\n          adj_faces.push_back(fid);\n          adj_face_corners.push_back(all_adj_face_corners[i]);\n        }\n      }\n    }\n    const size_t num_adj_faces = adj_faces.size();\n    assert(num_adj_faces > 0);\n\n    std::set<size_t> adj_vertices_set;\n    std::unordered_multimap<size_t, size_t> v2f;\n    for (size_t i=0; i<num_adj_faces; i++) \n    {\n      const size_t fid = adj_faces[i];\n      const size_t cid = adj_face_corners[i];\n      const auto& f = F.row(adj_faces[i]);\n      const size_t next = f[(cid+1)%3];\n      const size_t prev = f[(cid+2)%3];\n      adj_vertices_set.insert(next);\n      adj_vertices_set.insert(prev);\n      v2f.insert({{next, fid}, {prev, fid}});\n    }\n    const size_t num_adj_vertices = adj_vertices_set.size();\n    std::vector<size_t> adj_vertices(num_adj_vertices);\n    std::copy(adj_vertices_set.begin(), adj_vertices_set.end(),\n        adj_vertices.begin());\n\n    std::vector<Point_3> adj_points;\n    for (size_t vid : adj_vertices) \n    {\n      adj_points.emplace_back(V(vid,0), V(vid,1), V(vid,2));\n    }\n\n    // A plane is on the exterior if all adj_points lies on or to\n    // one side of the plane.\n    auto is_on_exterior = [&](const Plane_3& separator) -> bool{\n      size_t positive=0;\n      size_t negative=0;\n      size_t coplanar=0;\n      for (const auto& point : adj_points) {\n        switch(separator.oriented_side(point)) {\n          case CGAL::ON_POSITIVE_SIDE:\n            positive++;\n            break;\n          case CGAL::ON_NEGATIVE_SIDE:\n            negative++;\n            break;\n          case CGAL::ON_ORIENTED_BOUNDARY:\n            coplanar++;\n            break;\n          default:\n            throw \"Unknown plane-point orientation\";\n        }\n      }\n      auto query_orientation = separator.oriented_side(query_point);\n      if (query_orientation == CGAL::ON_ORIENTED_BOUNDARY &&\n          (positive == 0 && negative == 0)) {\n        // All adj vertices and query point are coplanar.\n        // In this case, all separators are equally valid.\n        return true;\n      } else {\n        bool r = (positive == 0 && query_orientation == CGAL::POSITIVE)\n          || (negative == 0 && query_orientation == CGAL::NEGATIVE);\n        return r;\n      }\n    };\n\n    size_t d = std::numeric_limits<size_t>::max();\n    for (size_t i=0; i<num_adj_vertices; i++) {\n      const size_t vi = adj_vertices[i];\n      for (size_t j=i+1; j<num_adj_vertices; j++) {\n        Plane_3 separator(closest_point, adj_points[i], adj_points[j]);\n        if (separator.is_degenerate()) {\n          continue;\n        }\n        if (is_on_exterior(separator)) {\n          if (!CGAL::collinear(\n                query_point, adj_points[i], closest_point)) {\n            d = vi;\n            break;\n          } else {\n            d = adj_vertices[j];\n            assert(!CGAL::collinear(\n                  query_point, adj_points[j], closest_point));\n            break;\n          }\n        }\n      }\n    }\n    if (d == std::numeric_limits<size_t>::max()) {\n      Eigen::MatrixXd tmp_vertices(V.rows(), V.cols());\n      for (size_t i=0; i<V.rows(); i++) {\n        for (size_t j=0; j<V.cols(); j++) {\n          tmp_vertices(i,j) = CGAL::to_double(V(i,j));\n        }\n      }\n      Eigen::MatrixXi tmp_faces(adj_faces.size(), 3);\n      for (size_t i=0; i<adj_faces.size(); i++) {\n        tmp_faces.row(i) = F.row(adj_faces[i]);\n      }\n      //igl::writePLY(\"debug.ply\", tmp_vertices, tmp_faces, false);\n      throw std::runtime_error(\"Invalid vertex neighborhood\");\n    }\n    const auto itr = v2f.equal_range(d);\n    assert(itr.first != itr.second);\n\n    return process_edge_case(query_idx, s, d, itr.first->second, orientation);\n  };\n\n  const size_t num_queries = P.rows();\n  R.resize(num_queries, 1);\n  S.resize(num_queries, 1);\n  for (size_t i=0; i<num_queries; i++) {\n    const Point_3 query(P(i,0), P(i,1), P(i,2));\n    auto projection = tree.closest_point_and_primitive(query);\n    const Point_3 closest_point = projection.first;\n    size_t fid = projection.second - triangles.begin();\n    bool fid_ori = false;\n\n    // Gether all facets sharing the closest point.\n    typename std::vector<typename Tree::Primitive_id> intersected_faces;\n    tree.all_intersected_primitives(Segment_3(closest_point, query),\n        std::back_inserter(intersected_faces));\n    const size_t num_intersected_faces = intersected_faces.size();\n    std::vector<size_t> intersected_face_indices(num_intersected_faces);\n    std::transform(intersected_faces.begin(),\n        intersected_faces.end(),\n        intersected_face_indices.begin(),\n        [&](const typename Tree::Primitive_id& itr) -> size_t\n        { return I(itr-triangles.begin(), 0); });\n\n    size_t element_index;\n    auto element_type = determine_element_type(closest_point, fid,\n        element_index);\n    switch(element_type) {\n      case VERTEX:\n        {\n          const auto& f = F.row(I(fid, 0));\n          const size_t s = f[element_index];\n          fid = process_vertex_case(i, s, I(fid, 0), fid_ori);\n        }\n        break;\n      case EDGE:\n        {\n          const auto& f = F.row(I(fid, 0));\n          const size_t s = f[(element_index+1)%3];\n          const size_t d = f[(element_index+2)%3];\n          fid = process_edge_case(i, s, d, I(fid, 0), fid_ori);\n        }\n        break;\n      case FACE:\n        {\n          fid = process_face_case(i, closest_point, fid, fid_ori);\n        }\n        break;\n      default:\n        throw std::runtime_error(\"Unknown element type.\");\n    }\n\n\n    R(i,0) = fid;\n    S(i,0) = fid_ori;\n  }\n}\n\ntemplate<\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedP,\n  typename uE2EType,\n  typename DerivedEMAP,\n  typename DerivedR,\n  typename DerivedS >\nIGL_INLINE void igl::copyleft::cgal::closest_facet(\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    const Eigen::PlainObjectBase<DerivedP>& P,\n    const std::vector<std::vector<uE2EType> >& uE2E,\n    const Eigen::PlainObjectBase<DerivedEMAP>& EMAP,\n    Eigen::PlainObjectBase<DerivedR>& R,\n    Eigen::PlainObjectBase<DerivedS>& S) {\n  const size_t num_faces = F.rows();\n  Eigen::VectorXi I = igl::LinSpaced<Eigen::VectorXi>(num_faces, 0, num_faces-1);\n  igl::copyleft::cgal::closest_facet(V, F, I, P, uE2E, EMAP, R, S);\n}\n\n#ifdef IGL_STATIC_LIBRARY\ntemplate void igl::copyleft::cgal::closest_facet<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, unsigned long, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> > const&, std::vector<std::vector<unsigned long, std::allocator<unsigned long> >, std::allocator<std::vector<unsigned long, std::allocator<unsigned long> > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/closest_facet.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Qingnan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n//\n#ifndef IGL_COPYLET_CGAL_CLOSEST_FACET_H\n#define IGL_COPYLET_CGAL_CLOSEST_FACET_H\n\n#include \"../../igl_inline.h\"\n#include <Eigen/Core>\n#include <vector>\n\n#include <CGAL/AABB_tree.h>\n#include <CGAL/AABB_traits.h>\n#include <CGAL/AABB_triangle_primitive.h>\n#include <CGAL/intersections.h>\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\n\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // Determine the closest facet for each of the input points.\n      //\n      // Inputs:\n      //   V  #V by 3 array of vertices.\n      //   F  #F by 3 array of faces.\n      //   I  #I list of triangle indices to consider.\n      //   P  #P by 3 array of query points.\n      //\n      // Outputs:\n      //   R  #P list of closest facet indices.\n      //   S  #P list of bools indicating on which side of the closest facet\n      //      each query point lies.\n      template<\n        typename DerivedV,\n        typename DerivedF,\n        typename DerivedI,\n        typename DerivedP,\n        typename uE2EType,\n        typename DerivedEMAP,\n        typename DerivedR,\n        typename DerivedS >\n      IGL_INLINE void closest_facet(\n        const Eigen::PlainObjectBase<DerivedV>& V,\n        const Eigen::PlainObjectBase<DerivedF>& F,\n        const Eigen::PlainObjectBase<DerivedI>& I,\n        const Eigen::PlainObjectBase<DerivedP>& P,\n        const std::vector<std::vector<uE2EType> >& uE2E,\n        const Eigen::PlainObjectBase<DerivedEMAP>& EMAP,\n              Eigen::PlainObjectBase<DerivedR>& R,\n              Eigen::PlainObjectBase<DerivedS>& S);\n      template<\n        typename DerivedV,\n        typename DerivedF,\n        typename DerivedP,\n        typename uE2EType,\n        typename DerivedEMAP,\n        typename DerivedR,\n        typename DerivedS >\n      IGL_INLINE void closest_facet(\n        const Eigen::PlainObjectBase<DerivedV>& V,\n        const Eigen::PlainObjectBase<DerivedF>& F,\n        const Eigen::PlainObjectBase<DerivedP>& P,\n        const std::vector<std::vector<uE2EType> >& uE2E,\n        const Eigen::PlainObjectBase<DerivedEMAP>& EMAP,\n        Eigen::PlainObjectBase<DerivedR>& R,\n        Eigen::PlainObjectBase<DerivedS>& S);\n      template<\n        typename DerivedV,\n        typename DerivedF,\n        typename DerivedI,\n        typename DerivedP,\n        typename uE2EType,\n        typename DerivedEMAP,\n        typename Kernel,\n        typename DerivedR,\n        typename DerivedS >\n      IGL_INLINE void closest_facet(\n          const Eigen::PlainObjectBase<DerivedV>& V,\n          const Eigen::PlainObjectBase<DerivedF>& F,\n          const Eigen::PlainObjectBase<DerivedI>& I,\n          const Eigen::PlainObjectBase<DerivedP>& P,\n          const std::vector<std::vector<uE2EType> >& uE2E,\n          const Eigen::PlainObjectBase<DerivedEMAP>& EMAP,\n          const std::vector<std::vector<size_t> > & VF,\n          const std::vector<std::vector<size_t> > & VFi,\n          const CGAL::AABB_tree<\n            CGAL::AABB_traits<\n              Kernel, \n              CGAL::AABB_triangle_primitive<\n                Kernel, typename std::vector<\n                  typename Kernel::Triangle_3 >::iterator > > > & tree,\n          const std::vector<typename Kernel::Triangle_3 > & triangles,\n          const std::vector<bool> & in_I,\n          Eigen::PlainObjectBase<DerivedR>& R,\n          Eigen::PlainObjectBase<DerivedS>& S);\n    }\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#include \"closest_facet.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/complex_to_mesh.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"complex_to_mesh.h\"\n\n#include \"../../centroid.h\"\n#include \"../../remove_unreferenced.h\"\n\n#include <CGAL/Surface_mesh_default_triangulation_3.h>\n#include <CGAL/Delaunay_triangulation_cell_base_with_circumcenter_3.h>\n#include <set>\n#include <stack>\n\ntemplate <typename Tr, typename DerivedV, typename DerivedF>\nIGL_INLINE bool igl::copyleft::cgal::complex_to_mesh(\n  const CGAL::Complex_2_in_triangulation_3<Tr> & c2t3,\n  Eigen::PlainObjectBase<DerivedV> & V, \n  Eigen::PlainObjectBase<DerivedF> & F)\n{\n  using namespace Eigen;\n  // CGAL/IO/Complex_2_in_triangulation_3_file_writer.h\n  using CGAL::Surface_mesher::number_of_facets_on_surface;\n\n  typedef typename CGAL::Complex_2_in_triangulation_3<Tr> C2t3;\n  typedef typename Tr::Finite_facets_iterator Finite_facets_iterator;\n  typedef typename Tr::Finite_vertices_iterator Finite_vertices_iterator;\n  typedef typename Tr::Facet Facet;\n  typedef typename Tr::Edge Edge;\n  typedef typename Tr::Vertex_handle Vertex_handle;\n\n  // Header.\n  const Tr& tr = c2t3.triangulation();\n\n  bool success = true;\n\n  const int n = tr.number_of_vertices();\n  const int m = c2t3.number_of_facets();\n\n  assert(m == number_of_facets_on_surface(tr));\n  \n  // Finite vertices coordinates.\n  std::map<Vertex_handle, int> v2i;\n  V.resize(n,3);\n  {\n    int v = 0;\n    for(Finite_vertices_iterator vit = tr.finite_vertices_begin();\n        vit != tr.finite_vertices_end();\n        ++vit)\n    {\n      V(v,0) = vit->point().x(); \n      V(v,1) = vit->point().y(); \n      V(v,2) = vit->point().z(); \n      v2i[vit] = v++;\n    }\n  }\n\n  {\n    Finite_facets_iterator fit = tr.finite_facets_begin();\n    std::set<Facet> oriented_set;\n    std::stack<Facet> stack;\n\n    while ((int)oriented_set.size() != m) \n    {\n      while ( fit->first->is_facet_on_surface(fit->second) == false ||\n        oriented_set.find(*fit) != oriented_set.end() ||\n        oriented_set.find(c2t3.opposite_facet(*fit)) !=\n        oriented_set.end() ) \n      {\n        ++fit;\n      }\n      oriented_set.insert(*fit);\n      stack.push(*fit);\n      while(! stack.empty() )\n      {\n        Facet f = stack.top();\n        stack.pop();\n        for(int ih = 0 ; ih < 3 ; ++ih)\n        {\n          const int i1  = tr.vertex_triple_index(f.second, tr. cw(ih));\n          const int i2  = tr.vertex_triple_index(f.second, tr.ccw(ih));\n\n          const typename C2t3::Face_status face_status\n            = c2t3.face_status(Edge(f.first, i1, i2));\n          if(face_status == C2t3::REGULAR) \n          {\n            Facet fn = c2t3.neighbor(f, ih);\n            if (oriented_set.find(fn) == oriented_set.end())\n            {\n              if(oriented_set.find(c2t3.opposite_facet(fn)) == oriented_set.end())\n              {\n                oriented_set.insert(fn);\n                stack.push(fn);\n              }else {\n                success = false; // non-orientable\n              }\n            }\n          }else if(face_status != C2t3::BOUNDARY)\n          {\n            success = false; // non manifold, thus non-orientable\n          }\n        } // end \"for each neighbor of f\"\n      } // end \"stack non empty\"\n    } // end \"oriented_set not full\"\n\n    F.resize(m,3);\n    int f = 0;\n    for(typename std::set<Facet>::const_iterator fit = \n        oriented_set.begin();\n        fit != oriented_set.end();\n        ++fit)\n    {\n      const typename Tr::Cell_handle cell = fit->first;\n      const int& index = fit->second;\n      const int index1 = v2i[cell->vertex(tr.vertex_triple_index(index, 0))];\n      const int index2 = v2i[cell->vertex(tr.vertex_triple_index(index, 1))];\n      const int index3 = v2i[cell->vertex(tr.vertex_triple_index(index, 2))];\n      // This order is flipped\n      F(f,0) = index1;\n      F(f,1) = index2;\n      F(f,2) = index3;\n      f++;\n    }\n    assert(f == m);\n  } // end if(facets must be oriented)\n\n  // This CGAL code seems to randomly assign the global orientation\n  // Flip based on the signed volume.\n  Eigen::Vector3d cen;\n  double vol;\n  igl::centroid(V,F,cen,vol);\n  if(vol < 0)\n  {\n    // Flip\n    F = F.rowwise().reverse().eval();\n  }\n\n  // CGAL code somehow can end up with unreferenced vertices\n  {\n    VectorXi _1;\n    remove_unreferenced( MatrixXd(V), MatrixXi(F), V,F,_1);\n  }\n\n  return success;\n}\n\n#ifdef IGL_STATIC_LIBRARY\ntemplate bool igl::copyleft::cgal::complex_to_mesh<CGAL::Delaunay_triangulation_3<CGAL::Robust_circumcenter_traits_3<CGAL::Epick>, CGAL::Triangulation_data_structure_3<CGAL::Surface_mesh_vertex_base_3<CGAL::Robust_circumcenter_traits_3<CGAL::Epick>, CGAL::Triangulation_vertex_base_3<CGAL::Robust_circumcenter_traits_3<CGAL::Epick>, CGAL::Triangulation_ds_vertex_base_3<void> > >, CGAL::Delaunay_triangulation_cell_base_with_circumcenter_3<CGAL::Robust_circumcenter_traits_3<CGAL::Epick>, CGAL::Surface_mesh_cell_base_3<CGAL::Robust_circumcenter_traits_3<CGAL::Epick>, CGAL::Triangulation_cell_base_3<CGAL::Robust_circumcenter_traits_3<CGAL::Epick>, CGAL::Triangulation_ds_cell_base_3<void> > > >, CGAL::Sequential_tag>, CGAL::Default, CGAL::Default>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(CGAL::Complex_2_in_triangulation_3<CGAL::Delaunay_triangulation_3<CGAL::Robust_circumcenter_traits_3<CGAL::Epick>, CGAL::Triangulation_data_structure_3<CGAL::Surface_mesh_vertex_base_3<CGAL::Robust_circumcenter_traits_3<CGAL::Epick>, CGAL::Triangulation_vertex_base_3<CGAL::Robust_circumcenter_traits_3<CGAL::Epick>, CGAL::Triangulation_ds_vertex_base_3<void> > >, CGAL::Delaunay_triangulation_cell_base_with_circumcenter_3<CGAL::Robust_circumcenter_traits_3<CGAL::Epick>, CGAL::Surface_mesh_cell_base_3<CGAL::Robust_circumcenter_traits_3<CGAL::Epick>, CGAL::Triangulation_cell_base_3<CGAL::Robust_circumcenter_traits_3<CGAL::Epick>, CGAL::Triangulation_ds_cell_base_3<void> > > >, CGAL::Sequential_tag>, CGAL::Default, CGAL::Default>, void> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/complex_to_mesh.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_CGAL_COMPLEX_TO_MESH_H\n#define IGL_COPYLEFT_CGAL_COMPLEX_TO_MESH_H\n#include \"../../igl_inline.h\"\n\n#include <Eigen/Dense>\n#include <CGAL/Complex_2_in_triangulation_3.h>\n\nnamespace igl \n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // Templates:\n      //   Tr  CGAL triangulation type, e.g.\n      //     CGAL::Surface_mesh_default_triangulation_3\n      // Inputs\n      //   c2t3  2-complex (surface) living in a 3d triangulation (e.g. result of\n      //     CGAL::make_surface_mesh)\n      // Outputs:\n      //   V  #V by 3 list of vertex positions\n      //   F  #F by 3 list of triangle indices\n      // Returns true iff conversion was successful, failure can ok if CGAL code\n      // can't figure out ordering.\n      //\n      template <typename Tr, typename DerivedV, typename DerivedF>\n      IGL_INLINE bool complex_to_mesh(\n        const CGAL::Complex_2_in_triangulation_3<Tr> & c2t3,\n        Eigen::PlainObjectBase<DerivedV> & V, \n        Eigen::PlainObjectBase<DerivedF> & F);\n    }\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"complex_to_mesh.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/component_inside_component.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Qingnan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"component_inside_component.h\"\n\n#include \"order_facets_around_edge.h\"\n#include \"../../LinSpaced.h\"\n#include \"points_inside_component.h\"\n\n#include <CGAL/AABB_tree.h>\n#include <CGAL/AABB_traits.h>\n#include <CGAL/AABB_triangle_primitive.h>\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\n\n#include <cassert>\n#include <list>\n#include <limits>\n#include <vector>\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedI>\nIGL_INLINE bool igl::copyleft::cgal::component_inside_component(\n        const Eigen::PlainObjectBase<DerivedV>& V1,\n        const Eigen::PlainObjectBase<DerivedF>& F1,\n        const Eigen::PlainObjectBase<DerivedI>& I1,\n        const Eigen::PlainObjectBase<DerivedV>& V2,\n        const Eigen::PlainObjectBase<DerivedF>& F2,\n        const Eigen::PlainObjectBase<DerivedI>& I2) {\n    if (F1.rows() <= 0 || I1.rows() <= 0 || F2.rows() <= 0 || I2.rows() <= 0) {\n        throw \"Component inside test cannot be done on empty component!\";\n    }\n\n    const Eigen::Vector3i& f = F1.row(I1(0, 0));\n    const Eigen::Matrix<typename DerivedV::Scalar, 1, 3> query(\n            (V1(f[0],0) + V1(f[1],0) + V1(f[2],0))/3.0,\n            (V1(f[0],1) + V1(f[1],1) + V1(f[2],1))/3.0,\n            (V1(f[0],2) + V1(f[1],2) + V1(f[2],2))/3.0);\n    Eigen::VectorXi inside;\n    igl::copyleft::cgal::points_inside_component(V2, F2, I2, query, inside);\n    assert(inside.size() == 1);\n    return inside[0];\n}\n\ntemplate<typename DerivedV, typename DerivedF>\nIGL_INLINE bool igl::copyleft::cgal::component_inside_component(\n        const Eigen::PlainObjectBase<DerivedV>& V1,\n        const Eigen::PlainObjectBase<DerivedF>& F1,\n        const Eigen::PlainObjectBase<DerivedV>& V2,\n        const Eigen::PlainObjectBase<DerivedF>& F2) {\n    if (F1.rows() <= 0 || F2.rows() <= 0) {\n        throw \"Component inside test cannot be done on empty component!\";\n    }\n    Eigen::VectorXi I1(F1.rows()), I2(F2.rows());\n    I1 = igl::LinSpaced<Eigen::VectorXi>(F1.rows(), 0, F1.rows()-1);\n    I2 = igl::LinSpaced<Eigen::VectorXi>(F2.rows(), 0, F2.rows()-1);\n    return igl::copyleft::cgal::component_inside_component(V1, F1, I1, V2, F2, I2);\n}\n\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate bool igl::copyleft::cgal::component_inside_component<\nEigen::Matrix<double, -1, -1, 0, -1, -1>,\nEigen::Matrix<   int, -1, -1, 0, -1, -1>,\nEigen::Matrix<   int, -1, -1, 0, -1, -1> > (\nEigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&,\nEigen::PlainObjectBase<Eigen::Matrix<   int, -1, -1, 0, -1, -1> > const&,\nEigen::PlainObjectBase<Eigen::Matrix<   int, -1, -1, 0, -1, -1> > const&,\nEigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&,\nEigen::PlainObjectBase<Eigen::Matrix<   int, -1, -1, 0, -1, -1> > const&,\nEigen::PlainObjectBase<Eigen::Matrix<   int, -1, -1, 0, -1, -1> > const&);\n\ntemplate bool igl::copyleft::cgal::component_inside_component<\nEigen::Matrix<double, -1, -1, 0, -1, -1>,\nEigen::Matrix<   int, -1, -1, 0, -1, -1> > (\nEigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&,\nEigen::PlainObjectBase<Eigen::Matrix<   int, -1, -1, 0, -1, -1> > const&,\nEigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&,\nEigen::PlainObjectBase<Eigen::Matrix<   int, -1, -1, 0, -1, -1> > const&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/component_inside_component.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Qingnan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_CGAL_COMONENT_INSIDE_COMPONENT\n#define IGL_COPYLEFT_CGAL_COMONENT_INSIDE_COMPONENT\n\n#include \"../../igl_inline.h\"\n#include <Eigen/Core>\n#include <vector>\n\nnamespace igl {\n  namespace copyleft\n  {\n    namespace cgal {\n\n        // Determine if connected facet component (V1, F1, I1) is inside of\n        // connected facet component (V2, F2, I2).\n        //\n        // Precondition:\n        // Both components must represent closed, self-intersection free,\n        // non-degenerated surfaces that are the boundary of 3D volumes. In\n        // addition, (V1, F1, I1) must not intersect with (V2, F2, I2).\n        //\n        // Inputs:\n        //   V1  #V1 by 3 list of vertex position of mesh 1\n        //   F1  #F1 by 3 list of triangles indices into V1\n        //   I1  #I1 list of indices into F1, indicate the facets of component\n        //   V2  #V2 by 3 list of vertex position of mesh 2\n        //   F2  #F2 by 3 list of triangles indices into V2\n        //   I2  #I2 list of indices into F2, indicate the facets of component\n        //\n        // Outputs:\n        //   return true iff (V1, F1, I1) is entirely inside of (V2, F2, I2).\n        template<typename DerivedV, typename DerivedF, typename DerivedI>\n            IGL_INLINE bool component_inside_component(\n                    const Eigen::PlainObjectBase<DerivedV>& V1,\n                    const Eigen::PlainObjectBase<DerivedF>& F1,\n                    const Eigen::PlainObjectBase<DerivedI>& I1,\n                    const Eigen::PlainObjectBase<DerivedV>& V2,\n                    const Eigen::PlainObjectBase<DerivedF>& F2,\n                    const Eigen::PlainObjectBase<DerivedI>& I2);\n\n        // Determine if mesh (V1, F1) is inside of mesh (V2, F2).\n        //\n        // Precondition:\n        // Both meshes must be closed, self-intersection free, non-degenerated\n        // surfaces that are the boundary of 3D volumes.  They should not\n        // intersect each other.\n        //\n        // Inputs:\n        //   V1  #V1 by 3 list of vertex position of mesh 1\n        //   F1  #F1 by 3 list of triangles indices into V1\n        //   V2  #V2 by 3 list of vertex position of mesh 2\n        //   F2  #F2 by 3 list of triangles indices into V2\n        //\n        // Outputs:\n        //   return true iff (V1, F1) is entirely inside of (V2, F2).\n        template<typename DerivedV, typename DerivedF>\n            IGL_INLINE bool component_inside_component(\n                    const Eigen::PlainObjectBase<DerivedV>& V1,\n                    const Eigen::PlainObjectBase<DerivedF>& F1,\n                    const Eigen::PlainObjectBase<DerivedV>& V2,\n                    const Eigen::PlainObjectBase<DerivedF>& F2);\n    }\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#include \"component_inside_component.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/delaunay_triangulation.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2016 Qingnan Zhou <qnzhou@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"delaunay_triangulation.h\"\n#include \"../../delaunay_triangulation.h\"\n#include \"orient2D.h\"\n#include \"incircle.h\"\n\ntemplate<\n  typename DerivedV,\n  typename DerivedF>\nIGL_INLINE void igl::copyleft::cgal::delaunay_triangulation(\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    Eigen::PlainObjectBase<DerivedF>& F)\n{\n  typedef typename DerivedV::Scalar Scalar;\n  igl::delaunay_triangulation(V, orient2D<Scalar>, incircle<Scalar>, F);\n}\n\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/delaunay_triangulation.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Qingan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_COPYLEFT_CGAL_DELAUNAY_TRIANGULATION_H\n#define IGL_COPYLEFT_CGAL_DELAUNAY_TRIANGULATION_H\n\n#include \"../../igl_inline.h\"\n#include <Eigen/Core>\n\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n\n      // Given a set of points in 2D, return a Delaunay triangulation of these\n      // points.\n      //\n      // Inputs:\n      //   V  #V by 2 list of vertex positions\n      //\n      // Outputs:\n      //   F  #F by 3 of faces in Delaunay triangulation.\n      template<\n        typename DerivedV,\n        typename DerivedF\n        >\n      IGL_INLINE void delaunay_triangulation(\n          const Eigen::PlainObjectBase<DerivedV>& V,\n          Eigen::PlainObjectBase<DerivedF>& F);\n    }\n  }\n}\n\n\n\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"delaunay_triangulation.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/extract_cells.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Qingnan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n//\n#include \"extract_cells.h\"\n#include \"closest_facet.h\"\n#include \"order_facets_around_edge.h\"\n#include \"outer_facet.h\"\n#include \"submesh_aabb_tree.h\"\n#include \"../../extract_manifold_patches.h\"\n#include \"../../facet_components.h\"\n#include \"../../get_seconds.h\"\n#include \"../../triangle_triangle_adjacency.h\"\n#include \"../../unique_edge_map.h\"\n#include \"../../vertex_triangle_adjacency.h\"\n\n#include <CGAL/AABB_tree.h>\n#include <CGAL/AABB_traits.h>\n#include <CGAL/AABB_triangle_primitive.h>\n#include <CGAL/intersections.h>\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\n\n#include <iostream>\n#include <vector>\n#include <queue>\n#include <map>\n#include <set>\n\n//#define EXTRACT_CELLS_DEBUG\n\ntemplate<\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedC >\nIGL_INLINE size_t igl::copyleft::cgal::extract_cells(\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  Eigen::PlainObjectBase<DerivedC>& cells)\n{\n  const size_t num_faces = F.rows();\n  // Construct edge adjacency\n  Eigen::MatrixXi E, uE;\n  Eigen::VectorXi EMAP;\n  std::vector<std::vector<size_t> > uE2E;\n  igl::unique_edge_map(F, E, uE, EMAP, uE2E);\n  // Cluster into manifold patches\n  Eigen::VectorXi P;\n  igl::extract_manifold_patches(F, EMAP, uE2E, P);\n  // Extract cells\n  DerivedC per_patch_cells;\n  const size_t num_cells =\n    igl::copyleft::cgal::extract_cells(V,F,P,E,uE,uE2E,EMAP,per_patch_cells);\n  // Distribute per-patch cell information to each face\n  cells.resize(num_faces, 2);\n  for (size_t i=0; i<num_faces; i++) \n  {\n    cells.row(i) = per_patch_cells.row(P[i]);\n  }\n  return num_cells;\n}\n\n\ntemplate<\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedP,\n  typename DerivedE,\n  typename DeriveduE,\n  typename uE2EType,\n  typename DerivedEMAP,\n  typename DerivedC >\nIGL_INLINE size_t igl::copyleft::cgal::extract_cells(\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  const Eigen::PlainObjectBase<DerivedP>& P,\n  const Eigen::PlainObjectBase<DerivedE>& E,\n  const Eigen::PlainObjectBase<DeriveduE>& uE,\n  const std::vector<std::vector<uE2EType> >& uE2E,\n  const Eigen::PlainObjectBase<DerivedEMAP>& EMAP,\n  Eigen::PlainObjectBase<DerivedC>& cells) \n{\n  // Trivial base case\n  if(P.size() == 0)\n  {\n    assert(F.size() == 0);\n    cells.resize(0,2);\n    return 0;\n  }\n\n  typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;\n  typedef Kernel::Point_3 Point_3;\n  typedef Kernel::Plane_3 Plane_3;\n  typedef Kernel::Segment_3 Segment_3;\n  typedef Kernel::Triangle_3 Triangle;\n  typedef std::vector<Triangle>::iterator Iterator;\n  typedef CGAL::AABB_triangle_primitive<Kernel, Iterator> Primitive;\n  typedef CGAL::AABB_traits<Kernel, Primitive> AABB_triangle_traits;\n  typedef CGAL::AABB_tree<AABB_triangle_traits> Tree;\n\n#ifdef EXTRACT_CELLS_DEBUG\n  const auto & tictoc = []() -> double\n  {\n    static double t_start = igl::get_seconds();\n    double diff = igl::get_seconds()-t_start;\n    t_start += diff;\n    return diff;\n  };\n  const auto log_time = [&](const std::string& label) -> void {\n    std::cout << \"extract_cells.\" << label << \": \"\n      << tictoc() << std::endl;\n  };\n  tictoc();\n#else\n  // no-op\n  const auto log_time = [](const std::string){};\n#endif\n  const size_t num_faces = F.rows();\n  typedef typename DerivedF::Scalar Index;\n  assert(P.size() > 0);\n  const size_t num_patches = P.maxCoeff()+1;\n\n  // Extract all cells...\n  DerivedC raw_cells;\n  const size_t num_raw_cells =\n    extract_cells_single_component(V,F,P,uE,uE2E,EMAP,raw_cells);\n  log_time(\"extract_single_component_cells\");\n\n  // Compute triangle-triangle adjacency data-structure\n  std::vector<std::vector<std::vector<Index > > > TT,_1;\n  igl::triangle_triangle_adjacency(E, EMAP, uE2E, false, TT, _1);\n  log_time(\"compute_face_adjacency\");\n\n  // Compute connected components of the mesh\n  Eigen::VectorXi C, counts;\n  igl::facet_components(TT, C, counts);\n  log_time(\"form_components\");\n\n  const size_t num_components = counts.size();\n  // components[c] --> list of face indices into F of faces in component c\n  std::vector<std::vector<size_t> > components(num_components);\n  // Loop over all faces\n  for (size_t i=0; i<num_faces; i++) \n  {\n    components[C[i]].push_back(i);\n  }\n  // Convert vector lists to Eigen lists...\n  // and precompute data-structures for each component\n  std::vector<std::vector<size_t> > VF,VFi;\n  igl::vertex_triangle_adjacency(V.rows(), F, VF, VFi);\n  std::vector<Eigen::VectorXi> Is(num_components);\n  std::vector<\n    CGAL::AABB_tree<\n      CGAL::AABB_traits<\n        Kernel, \n        CGAL::AABB_triangle_primitive<\n          Kernel, std::vector<\n            Kernel::Triangle_3 >::iterator > > > > trees(num_components);\n  std::vector< std::vector<Kernel::Triangle_3 > > \n    triangle_lists(num_components);\n  std::vector<std::vector<bool> > in_Is(num_components);\n\n  // Find outer facets, their orientations and cells for each component\n  Eigen::VectorXi outer_facets(num_components);\n  Eigen::VectorXi outer_facet_orientation(num_components);\n  Eigen::VectorXi outer_cells(num_components);\n  for (size_t i=0; i<num_components; i++)\n  {\n    Is[i].resize(components[i].size());\n    std::copy(components[i].begin(), components[i].end(),Is[i].data());\n    bool flipped;\n    igl::copyleft::cgal::outer_facet(V, F, Is[i], outer_facets[i], flipped);\n    outer_facet_orientation[i] = flipped?1:0;\n    outer_cells[i] = raw_cells(P[outer_facets[i]], outer_facet_orientation[i]);\n  }\n#ifdef EXTRACT_CELLS_DEBUG\n  log_time(\"outer_facet_per_component\");\n#endif\n\n  // Compute barycenter of a triangle in mesh (V,F)\n  //\n  // Inputs:\n  //   fid  index into F\n  // Returns row-vector of barycenter coordinates\n  const auto get_triangle_center = [&V,&F](const size_t fid) \n  {\n    return ((V.row(F(fid,0))+V.row(F(fid,1))+V.row(F(fid,2)))/3.0).eval();\n  };\n  std::vector<std::vector<size_t> > nested_cells(num_raw_cells);\n  std::vector<std::vector<size_t> > ambient_cells(num_raw_cells);\n  std::vector<std::vector<size_t> > ambient_comps(num_components);\n  // Only bother if there's more than one component\n  if(num_components > 1) \n  {\n    // construct bounding boxes for each component\n    DerivedV bbox_min(num_components, 3);\n    DerivedV bbox_max(num_components, 3);\n    // Assuming our mesh (in exact numbers) fits in the range of double.\n    bbox_min.setConstant(std::numeric_limits<double>::max());\n    bbox_max.setConstant(std::numeric_limits<double>::min());\n    // Loop over faces\n    for (size_t i=0; i<num_faces; i++)\n    {\n      // component of this face\n      const auto comp_id = C[i];\n      const auto& f = F.row(i);\n      for (size_t j=0; j<3; j++) \n      {\n        for(size_t d=0;d<3;d++)\n        {\n          bbox_min(comp_id,d) = std::min(bbox_min(comp_id,d), V(f[j],d));\n          bbox_max(comp_id,d) = std::max(bbox_max(comp_id,d), V(f[j],d));\n        }\n      }\n    }\n    // Return true if box of component ci intersects that of cj\n    const auto bbox_intersects = [&bbox_max,&bbox_min](size_t ci, size_t cj)\n    {\n      return !(\n        bbox_max(ci,0) < bbox_min(cj,0) ||\n        bbox_max(ci,1) < bbox_min(cj,1) ||\n        bbox_max(ci,2) < bbox_min(cj,2) ||\n        bbox_max(cj,0) < bbox_min(ci,0) ||\n        bbox_max(cj,1) < bbox_min(ci,1) ||\n        bbox_max(cj,2) < bbox_min(ci,2));\n    };\n    \n    // Loop over components. This section is O(m²)\n    for (size_t i=0; i<num_components; i++)\n    {\n      // List of components that could overlap with component i\n      std::vector<size_t> candidate_comps;\n      candidate_comps.reserve(num_components);\n      // Loop over components\n      for (size_t j=0; j<num_components; j++) \n      {\n        if (i == j) continue;\n        if (bbox_intersects(i,j)) candidate_comps.push_back(j);\n      }\n\n      const size_t num_candidate_comps = candidate_comps.size();\n      if (num_candidate_comps == 0) continue;\n\n      // Build aabb tree for this component.\n      submesh_aabb_tree(V,F,Is[i],trees[i],triangle_lists[i],in_Is[i]);\n\n      // Get query points on each candidate component: barycenter of\n      // outer-facet \n      DerivedV queries(num_candidate_comps, 3);\n      for (size_t j=0; j<num_candidate_comps; j++)\n      {\n        const size_t index = candidate_comps[j];\n        queries.row(j) = get_triangle_center(outer_facets[index]);\n      }\n\n      // Gather closest facets in ith component to each query point and their\n      // orientations\n      const auto& I = Is[i];\n      const auto& tree = trees[i];\n      const auto& in_I = in_Is[i];\n      const auto& triangles = triangle_lists[i];\n\n      Eigen::VectorXi closest_facets, closest_facet_orientations;\n      closest_facet(\n        V,\n        F, \n        I, \n        queries,\n        uE2E, \n        EMAP, \n        VF,\n        VFi,\n        tree,\n        triangles,\n        in_I,\n        closest_facets, \n        closest_facet_orientations);\n      // Loop over all candidates\n      for (size_t j=0; j<num_candidate_comps; j++)\n      {\n        const size_t index = candidate_comps[j];\n        const size_t closest_patch = P[closest_facets[j]];\n        const size_t closest_patch_side = closest_facet_orientations[j] ? 0:1;\n        // The cell id of the closest patch\n        const size_t ambient_cell =\n          raw_cells(closest_patch,closest_patch_side);\n        if (ambient_cell != (size_t)outer_cells[i])\n        {\n          // ---> component index inside component i, because the cell of the\n          // closest facet on i to component index is **not** the same as the\n          // \"outer cell\" of component i: component index is **not** outside of\n          // component i (therefore it's inside).\n          nested_cells[ambient_cell].push_back(outer_cells[index]);\n          ambient_cells[outer_cells[index]].push_back(ambient_cell);\n          ambient_comps[index].push_back(i);\n        }\n      }\n    }\n  }\n\n#ifdef EXTRACT_CELLS_DEBUG\n    log_time(\"nested_relationship\");\n#endif\n\n    const size_t INVALID = std::numeric_limits<size_t>::max();\n    const size_t INFINITE_CELL = num_raw_cells;\n    std::vector<size_t> embedded_cells(num_raw_cells, INVALID);\n    for (size_t i=0; i<num_components; i++) {\n        const size_t outer_cell = outer_cells[i];\n        const auto& ambient_comps_i = ambient_comps[i];\n        const auto& ambient_cells_i = ambient_cells[outer_cell];\n        const size_t num_ambient_comps = ambient_comps_i.size();\n        assert(num_ambient_comps == ambient_cells_i.size());\n        if (num_ambient_comps > 0) {\n            size_t embedded_comp = INVALID;\n            size_t embedded_cell = INVALID;\n            for (size_t j=0; j<num_ambient_comps; j++) {\n                if (ambient_comps[ambient_comps_i[j]].size() ==\n                        num_ambient_comps-1) {\n                    embedded_comp = ambient_comps_i[j];\n                    embedded_cell = ambient_cells_i[j];\n                    break;\n                }\n            }\n            assert(embedded_comp != INVALID);\n            assert(embedded_cell != INVALID);\n            embedded_cells[outer_cell] = embedded_cell;\n        } else {\n            embedded_cells[outer_cell] = INFINITE_CELL;\n        }\n    }\n    for (size_t i=0; i<num_patches; i++) {\n        if (embedded_cells[raw_cells(i,0)] != INVALID) {\n            raw_cells(i,0) = embedded_cells[raw_cells(i, 0)];\n        }\n        if (embedded_cells[raw_cells(i,1)] != INVALID) {\n            raw_cells(i,1) = embedded_cells[raw_cells(i, 1)];\n        }\n    }\n\n    size_t count = 0;\n    std::vector<size_t> mapped_indices(num_raw_cells+1, INVALID);\n    // Always map infinite cell to index 0.\n    mapped_indices[INFINITE_CELL] = count;\n    count++;\n\n    for (size_t i=0; i<num_patches; i++) {\n        const size_t old_positive_cell_id = raw_cells(i, 0);\n        const size_t old_negative_cell_id = raw_cells(i, 1);\n        size_t positive_cell_id, negative_cell_id;\n        if (mapped_indices[old_positive_cell_id] == INVALID) {\n            mapped_indices[old_positive_cell_id] = count;\n            positive_cell_id = count;\n            count++;\n        } else {\n            positive_cell_id = mapped_indices[old_positive_cell_id];\n        }\n        if (mapped_indices[old_negative_cell_id] == INVALID) {\n            mapped_indices[old_negative_cell_id] = count;\n            negative_cell_id = count;\n            count++;\n        } else {\n            negative_cell_id = mapped_indices[old_negative_cell_id];\n        }\n        raw_cells(i, 0) = positive_cell_id;\n        raw_cells(i, 1) = negative_cell_id;\n    }\n    cells = raw_cells;\n#ifdef EXTRACT_CELLS_DEBUG\n    log_time(\"finalize\");\n#endif\n    return count;\n}\n\ntemplate<\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedP,\n  typename DeriveduE,\n  typename uE2EType,\n  typename DerivedEMAP,\n  typename DerivedC>\nIGL_INLINE size_t igl::copyleft::cgal::extract_cells_single_component(\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  const Eigen::PlainObjectBase<DerivedP>& P,\n  const Eigen::PlainObjectBase<DeriveduE>& uE,\n  const std::vector<std::vector<uE2EType> >& uE2E,\n  const Eigen::PlainObjectBase<DerivedEMAP>& EMAP,\n  Eigen::PlainObjectBase<DerivedC>& cells)\n{\n  const size_t num_faces = F.rows();\n  // Input:\n  //   index  index into #F*3 list of undirect edges\n  // Returns index into face\n  const auto edge_index_to_face_index = [&num_faces](size_t index)\n  {\n    return index % num_faces;\n  };\n  // Determine if a face (containing undirected edge {s,d} is consistently\n  // oriented with directed edge {s,d} (or otherwise it is with {d,s})\n  // \n  // Inputs:\n  //   fid  face index into F\n  //   s  source index of edge\n  //   d  destination index of edge\n  // Returns true if face F(fid,:) is consistent with {s,d}\n  const auto is_consistent = \n    [&F](const size_t fid, const size_t s, const size_t d) -> bool\n  {\n    if ((size_t)F(fid, 0) == s && (size_t)F(fid, 1) == d) return false;\n    if ((size_t)F(fid, 1) == s && (size_t)F(fid, 2) == d) return false;\n    if ((size_t)F(fid, 2) == s && (size_t)F(fid, 0) == d) return false;\n\n    if ((size_t)F(fid, 0) == d && (size_t)F(fid, 1) == s) return true;\n    if ((size_t)F(fid, 1) == d && (size_t)F(fid, 2) == s) return true;\n    if ((size_t)F(fid, 2) == d && (size_t)F(fid, 0) == s) return true;\n    throw \"Invalid face!\";\n    return false;\n  };\n\n  const size_t num_unique_edges = uE.rows();\n  const size_t num_patches = P.maxCoeff() + 1;\n\n  // Build patch-patch adjacency list.\n  std::vector<std::map<size_t, size_t> > patch_adj(num_patches);\n  for (size_t i=0; i<num_unique_edges; i++) {\n    const size_t s = uE(i,0);\n    const size_t d = uE(i,1);\n    const auto adj_faces = uE2E[i];\n    const size_t num_adj_faces = adj_faces.size();\n    if (num_adj_faces > 2) {\n      for (size_t j=0; j<num_adj_faces; j++) {\n        const size_t patch_j = P[edge_index_to_face_index(adj_faces[j])];\n        for (size_t k=j+1; k<num_adj_faces; k++) {\n          const size_t patch_k = P[edge_index_to_face_index(adj_faces[k])];\n          if (patch_adj[patch_j].find(patch_k) == patch_adj[patch_j].end()) {\n            patch_adj[patch_j].insert({patch_k, i});\n          }\n          if (patch_adj[patch_k].find(patch_j) == patch_adj[patch_k].end()) {\n            patch_adj[patch_k].insert({patch_j, i});\n          }\n        }\n      }\n    }\n  }\n\n\n  const int INVALID = std::numeric_limits<int>::max();\n  std::vector<size_t> cell_labels(num_patches * 2);\n  for (size_t i=0; i<num_patches; i++) cell_labels[i] = i;\n  std::vector<std::set<size_t> > equivalent_cells(num_patches*2);\n  std::vector<bool> processed(num_unique_edges, false);\n\n  size_t label_count=0;\n  for (size_t i=0; i<num_patches; i++) {\n    for (const auto& entry : patch_adj[i]) {\n      const size_t neighbor_patch = entry.first;\n      const size_t uei = entry.second;\n      if (processed[uei]) continue;\n      processed[uei] = true;\n\n      const auto& adj_faces = uE2E[uei];\n      const size_t num_adj_faces = adj_faces.size();\n      assert(num_adj_faces > 2);\n\n      const size_t s = uE(uei,0);\n      const size_t d = uE(uei,1);\n\n      std::vector<int> signed_adj_faces;\n      for (auto ej : adj_faces)\n      {\n        const size_t fid = edge_index_to_face_index(ej);\n        bool cons = is_consistent(fid, s, d);\n        signed_adj_faces.push_back((fid+1)*(cons ? 1:-1));\n      }\n      {\n        // Sort adjacent faces cyclically around {s,d}\n        Eigen::VectorXi order;\n        // order[f] will reveal the order of face f in signed_adj_faces\n        order_facets_around_edge(V, F, s, d, signed_adj_faces, order);\n        for (size_t j=0; j<num_adj_faces; j++) {\n          const size_t curr_idx = j;\n          const size_t next_idx = (j+1)%num_adj_faces;\n          const size_t curr_patch_idx =\n            P[edge_index_to_face_index(adj_faces[order[curr_idx]])];\n          const size_t next_patch_idx =\n            P[edge_index_to_face_index(adj_faces[order[next_idx]])];\n          const bool curr_cons = signed_adj_faces[order[curr_idx]] > 0;\n          const bool next_cons = signed_adj_faces[order[next_idx]] > 0;\n          const size_t curr_cell_idx = curr_patch_idx*2 + (curr_cons?0:1);\n          const size_t next_cell_idx = next_patch_idx*2 + (next_cons?1:0);\n          equivalent_cells[curr_cell_idx].insert(next_cell_idx);\n          equivalent_cells[next_cell_idx].insert(curr_cell_idx);\n        }\n      }\n    }\n  }\n\n  size_t count=0;\n  cells.resize(num_patches, 2);\n  cells.setConstant(INVALID);\n  const auto extract_equivalent_cells = [&](size_t i) {\n    if (cells(i/2, i%2) != INVALID) return;\n    std::queue<size_t> Q;\n    Q.push(i);\n    cells(i/2, i%2) = count;\n    while (!Q.empty()) {\n      const size_t index = Q.front();\n      Q.pop();\n      for (const auto j : equivalent_cells[index]) {\n        if (cells(j/2, j%2) == INVALID) {\n          cells(j/2, j%2) = count;\n          Q.push(j);\n        }\n      }\n    }\n    count++;\n  };\n  for (size_t i=0; i<num_patches; i++) {\n    extract_equivalent_cells(i*2);\n    extract_equivalent_cells(i*2+1);\n  }\n\n  assert((cells.array() != INVALID).all());\n  return count;\n}\n\n\n#ifdef IGL_STATIC_LIBRARY\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\ntemplate unsigned long igl::copyleft::cgal::extract_cells<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, unsigned long, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<std::vector<unsigned long, std::allocator<unsigned long> >, std::allocator<std::vector<unsigned long, std::allocator<unsigned long> > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate unsigned long igl::copyleft::cgal::extract_cells<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/extract_cells.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Qingnan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n//\n#ifndef IGL_COPYLEFT_CGAL_EXTRACT_CELLS\n#define IGL_COPYLEFT_CGAL_EXTRACT_CELLS\n\n#include \"../../igl_inline.h\"\n#include <Eigen/Core>\n#include <vector>\n\nnamespace igl {\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // Extract connected 3D space partitioned by mesh (V, F).\n      //\n      // Inputs:\n      //   V  #V by 3 array of vertices.\n      //   F  #F by 3 array of faces.\n      //\n      // Output:\n      //   cells  #F by 2 array of cell indices.  cells(i,0) represents the\n      //          cell index on the positive side of face i, and cells(i,1)\n      //          represents cell index of the negqtive side.\n      //          By convension cell with index 0 is the infinite cell.\n      // Returns the number of cells\n      template<\n        typename DerivedV,\n        typename DerivedF,\n        typename DerivedC >\n      IGL_INLINE size_t extract_cells(\n        const Eigen::PlainObjectBase<DerivedV>& V,\n        const Eigen::PlainObjectBase<DerivedF>& F,\n        Eigen::PlainObjectBase<DerivedC>& cells);\n\n      // Extract connected 3D space partitioned by mesh (V, F).\n      //\n      // Inputs:\n      //   V  #V by 3 array of vertices.\n      //   F  #F by 3 array of faces.\n      //   P  #F list of patch indices.\n      //   E  #E by 2 array of vertex indices, one edge per row.\n      //  uE    #uE by 2 list of vertex_indices, represents undirected edges.\n      //  uE2E  #uE list of lists that maps uE to E. (a one-to-many map)\n      //  EMAP  #F*3 list of indices into uE.\n      //\n      // Output:\n      //   cells  #P by 2 array of cell indices.  cells(i,0) represents the\n      //          cell index on the positive side of patch i, and cells(i,1)\n      //          represents cell index of the negqtive side.\n      //          By convension cell with index 0 is the infinite cell.\n      template<\n        typename DerivedV,\n        typename DerivedF,\n        typename DerivedP,\n        typename DerivedE,\n        typename DeriveduE,\n        typename uE2EType,\n        typename DerivedEMAP,\n        typename DerivedC >\n      IGL_INLINE size_t extract_cells(\n        const Eigen::PlainObjectBase<DerivedV>& V,\n        const Eigen::PlainObjectBase<DerivedF>& F,\n        const Eigen::PlainObjectBase<DerivedP>& P,\n        const Eigen::PlainObjectBase<DerivedE>& E,\n        const Eigen::PlainObjectBase<DeriveduE>& uE,\n        const std::vector<std::vector<uE2EType> >& uE2E,\n        const Eigen::PlainObjectBase<DerivedEMAP>& EMAP,\n        Eigen::PlainObjectBase<DerivedC>& cells);\n\n      // Extract connected 3D space partitioned by mesh (V,F) composed of\n      // **possibly multiple components** (the name of this function is\n      // dubious).\n      //\n      // Inputs:\n      //   V  #V by 3 array of vertices.\n      //   F  #F by 3 array of faces.\n      //   P  #F list of patch indices.\n      //   E  #E by 2 array of vertex indices, one edge per row.\n      //  uE    #uE by 2 list of vertex_indices, represents undirected edges.\n      //  uE2E  #uE list of lists that maps uE to E. (a one-to-many map)\n      //  EMAP  #F*3 list of indices into uE.\n      // Output:\n      //  cells  #P by 2 array of cell indices.  cells(i,0) represents the\n      //    cell index on the positive side of patch i, and cells(i,1)\n      //    represents cell index of the negative side.\n      template<\n        typename DerivedV,\n        typename DerivedF,\n        typename DerivedP,\n        typename DeriveduE,\n        typename uE2EType,\n        typename DerivedEMAP,\n        typename DerivedC >\n      IGL_INLINE size_t extract_cells_single_component(\n        const Eigen::PlainObjectBase<DerivedV>& V,\n        const Eigen::PlainObjectBase<DerivedF>& F,\n        const Eigen::PlainObjectBase<DerivedP>& P,\n        const Eigen::PlainObjectBase<DeriveduE>& uE,\n        const std::vector<std::vector<uE2EType> >& uE2E,\n        const Eigen::PlainObjectBase<DerivedEMAP>& EMAP,\n        Eigen::PlainObjectBase<DerivedC>& cells);\n    }\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"extract_cells.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/extract_feature.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Qingnan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"extract_feature.h\"\n#include <igl/unique_edge_map.h>\n#include <CGAL/Kernel/global_functions.h>\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\n\ntemplate<\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedE >\nIGL_INLINE void igl::copyleft::cgal::extract_feature(\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    const double tol,\n    Eigen::PlainObjectBase<DerivedE>& feature_edges) {\n\n  using IndexType = typename DerivedE::Scalar;\n  DerivedE E, uE;\n  Eigen::VectorXi EMAP;\n  std::vector<std::vector<IndexType> > uE2E;\n  igl::unique_edge_map(F, E, uE, EMAP, uE2E);\n\n  igl::copyleft::cgal::extract_feature(V, F, tol, E, uE, uE2E, feature_edges);\n}\n\ntemplate<\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedE >\nIGL_INLINE void igl::copyleft::cgal::extract_feature(\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    const double tol,\n    const Eigen::PlainObjectBase<DerivedE>& E,\n    const Eigen::PlainObjectBase<DerivedE>& uE,\n    const std::vector<std::vector<typename DerivedE::Scalar> >& uE2E,\n    Eigen::PlainObjectBase<DerivedE>& feature_edges) {\n\n  assert(V.cols() == 3);\n  assert(F.cols() == 3);\n  using Scalar = typename DerivedV::Scalar;\n  using IndexType = typename DerivedE::Scalar;\n  using Vertex = Eigen::Matrix<Scalar, 3, 1>;\n  using Kernel = typename CGAL::Exact_predicates_exact_constructions_kernel;\n  using Point = typename Kernel::Point_3;\n\n  const size_t num_unique_edges = uE.rows();\n  const size_t num_faces = F.rows();\n  // NOTE: CGAL's definition of dihedral angle measures the angle between two\n  // facets instead of facet normals.\n  const double cos_tol = cos(M_PI - tol);\n  std::vector<size_t> result; // Indices into uE\n\n  auto is_non_manifold = [&uE2E](size_t ei) -> bool {\n    return uE2E[ei].size() > 2;\n  };\n\n  auto is_boundary = [&uE2E](size_t ei) -> bool {\n    return uE2E[ei].size() == 1;\n  };\n\n  auto opposite_vertex = [&uE, &F](size_t ei, size_t fi) -> IndexType {\n    const size_t v0 = uE(ei, 0);\n    const size_t v1 = uE(ei, 1);\n    for (size_t i=0; i<3; i++) {\n      const size_t v = F(fi, i);\n      if (v != v0 && v != v1) { return v; }\n    }\n    throw \"Input face must be topologically degenerate!\";\n  };\n\n  auto is_feature = [&V, &F, &uE, &uE2E, &opposite_vertex, num_faces](\n      size_t ei, double cos_tol) -> bool {\n    auto adj_faces = uE2E[ei];\n    assert(adj_faces.size() == 2);\n    const Vertex v0 = V.row(uE(ei, 0));\n    const Vertex v1 = V.row(uE(ei, 1));\n    const Vertex v2 = V.row(opposite_vertex(ei, adj_faces[0] % num_faces));\n    const Vertex v3 = V.row(opposite_vertex(ei, adj_faces[1] % num_faces));\n    const Point p0(v0[0], v0[1], v0[2]);\n    const Point p1(v1[0], v1[1], v1[2]);\n    const Point p2(v2[0], v2[1], v2[2]);\n    const Point p3(v3[0], v3[1], v3[2]);\n    const auto ori = CGAL::orientation(p0, p1, p2, p3);\n    switch (ori) {\n      case CGAL::POSITIVE:\n        return CGAL::compare_dihedral_angle(p0, p1, p2, p3, cos_tol) ==\n          CGAL::SMALLER;\n      case CGAL::NEGATIVE:\n        return CGAL::compare_dihedral_angle(p0, p1, p3, p2, cos_tol) ==\n          CGAL::SMALLER;\n      case CGAL::COPLANAR:\n        if (!CGAL::collinear(p0, p1, p2) && !CGAL::collinear(p0, p1, p3)) {\n          return CGAL::compare_dihedral_angle(p0, p1, p2, p3, cos_tol) ==\n            CGAL::SMALLER;\n        } else {\n          throw \"Dihedral angle (and feature edge) is not well defined for\"\n              \" degenerate triangles!\";\n        }\n      default:\n        throw \"Unknown CGAL orientation\";\n    }\n  };\n\n  for (size_t i=0; i<num_unique_edges; i++) {\n    if (is_boundary(i) || is_non_manifold(i) || is_feature(i, cos_tol)) {\n      result.push_back(i);\n    }\n  }\n\n  const size_t num_feature_edges = result.size();\n  feature_edges.resize(num_feature_edges, 2);\n  for (size_t i=0; i<num_feature_edges; i++) {\n    feature_edges.row(i) = uE.row(result[i]);\n  }\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/extract_feature.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Qingnan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_COPYLEFT_CGAL_EXTRACT_FEATURE_H\n#define IGL_COPYLEFT_CGAL_EXTRACT_FEATURE_H\n#include \"../../igl_inline.h\"\n#include <Eigen/Core>\n#include <vector>\n\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // Extract feature edges based on dihedral angle.\n      // Here, dihedral angle is defined as the angle between surface\n      // __normals__ as described in\n      // http://mathworld.wolfram.com/DihedralAngle.html\n      //\n      // Non-manifold and boundary edges are automatically considered as\n      // features.\n      //\n      // Inputs:\n      //   V   #V by 3 array of vertices.\n      //   F   #F by 3 array of faces.\n      //   tol Edges with dihedral angle larger than this are considered\n      //       as features.  Angle is measured in radian.\n      //\n      // Output:\n      //   feature_edges: #E by 2 array of edges.  Each edge satisfies at\n      //      least one of the following criteria:\n      //\n      //      * Edge has dihedral angle larger than tol.\n      //      * Edge is boundary.\n      //      * Edge is non-manifold (i.e. it has more than 2 adjacent\n      //        faces).\n      template <\n        typename DerivedV,\n        typename DerivedF,\n        typename DerivedE>\n      IGL_INLINE void extract_feature(\n            const Eigen::PlainObjectBase<DerivedV>& V,\n            const Eigen::PlainObjectBase<DerivedF>& F,\n            const double tol,\n            Eigen::PlainObjectBase<DerivedE>& feature_edges);\n\n      // Inputs:\n      //   V    #V by 3 array of vertices.\n      //   F    #F by 3 array of faces.\n      //   tol  Edges with dihedral angle larger than this are considered\n      //        as features.  Angle is measured in radian.\n      //   E    #E by 2 array of directed edges.\n      //   uE   #uE by 2 array of undirected edges.\n      //   uE2E #uE list of lists mapping undirected edges to all corresponding\n      //        directed edges.\n      //\n      // Output:\n      //   feature_edges: #E by 2 array of edges.  Each edge satisfies at\n      //      least one of the following criteria:\n      //\n      //      * Edge has dihedral angle larger than tol.\n      //      * Edge is boundary.\n      //      * Edge is non-manifold (i.e. it has more than 2 adjacent\n      //        faces).\n      template <\n        typename DerivedV,\n        typename DerivedF,\n        typename DerivedE>\n      IGL_INLINE void extract_feature(\n            const Eigen::PlainObjectBase<DerivedV>& V,\n            const Eigen::PlainObjectBase<DerivedF>& F,\n            const double tol,\n            const Eigen::PlainObjectBase<DerivedE>& E,\n            const Eigen::PlainObjectBase<DerivedE>& uE,\n            const std::vector<std::vector<typename DerivedE::Scalar> >& uE2E,\n            Eigen::PlainObjectBase<DerivedE>& feature_edges);\n    }\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"extract_feature.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/half_space_box.cpp",
    "content": "#include \"half_space_box.h\"\n#include \"assign_scalar.h\"\n#include <CGAL/Point_3.h>\n#include <CGAL/Vector_3.h>\n\ntemplate <typename DerivedV>\nIGL_INLINE void igl::copyleft::cgal::half_space_box(\n  const CGAL::Plane_3<CGAL::Epeck> & P,\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  Eigen::Matrix<CGAL::Epeck::FT,8,3> & BV,\n  Eigen::Matrix<int,12,3> & BF)\n{\n  typedef CGAL::Plane_3<CGAL::Epeck> Plane;\n  typedef CGAL::Point_3<CGAL::Epeck> Point;\n  typedef CGAL::Vector_3<CGAL::Epeck> Vector;\n  typedef CGAL::Epeck::FT EScalar;\n  Eigen::Matrix<typename DerivedV::Scalar,1,3> avg(0,0,0);\n  for(int v = 0;v<V.rows();v++) for(int c = 0;c<V.cols();c++) avg(c) += V(v,c);\n  avg /= V.rows();\n\n  Point o3(avg(0),avg(1),avg(2));\n  Point o2 = P.projection(o3);\n  Vector u;\n  EScalar max_sqrd = -1;\n  for(int v = 0;v<V.rows();v++)\n  {\n    Vector v2 = P.projection(Point(V(v,0),V(v,1),V(v,2))) - o2;\n    const EScalar sqrd = v2.squared_length();\n    if(max_sqrd<0 || sqrd < max_sqrd)\n    {\n      u = v2;\n      max_sqrd = sqrd;\n    }\n  }\n  // L1 bbd \n  const EScalar bbd = \n    (EScalar(V.col(0).maxCoeff())- EScalar(V.col(0).minCoeff())) + \n    (EScalar(V.col(1).maxCoeff())- EScalar(V.col(1).minCoeff())) + \n    (EScalar(V.col(2).maxCoeff())- EScalar(V.col(2).minCoeff()));\n  Vector n = P.orthogonal_vector();\n  // now we have a center o2 and a vector u to the farthest point on the plane \n  std::vector<Point> vBV;vBV.reserve(8);\n  Vector v = CGAL::cross_product(u,n);\n  // Scale u,v,n to be longer than bbd\n  const auto & longer_than = [](const EScalar min_sqr, Vector & x)\n  {\n    assert(x.squared_length() > 0);\n    while(x.squared_length() < min_sqr)\n    {\n      x = 2.*x;\n    }\n  };\n  longer_than(bbd*bbd,u);\n  longer_than(bbd*bbd,v);\n  longer_than(bbd*bbd,n);\n  vBV.emplace_back( o2 + u + v);\n  vBV.emplace_back( o2 - u + v);\n  vBV.emplace_back( o2 - u - v);\n  vBV.emplace_back( o2 + u - v);\n  vBV.emplace_back( o2 + u + v - n);\n  vBV.emplace_back( o2 - u + v - n);\n  vBV.emplace_back( o2 - u - v - n);\n  vBV.emplace_back( o2 + u - v - n);\n  BV.resize(8,3);\n  for(int b = 0;b<8;b++)\n  {\n    igl::copyleft::cgal::assign_scalar(vBV[b].x(),BV(b,0));\n    igl::copyleft::cgal::assign_scalar(vBV[b].y(),BV(b,1));\n    igl::copyleft::cgal::assign_scalar(vBV[b].z(),BV(b,2));\n  }\n  BF.resize(12,3);\n  BF<<\n    1,0,2,\n    2,0,3,\n    4,5,6,\n    4,6,7,\n    0,1,4,\n    4,1,5,\n    1,2,5,\n    5,2,6,\n    2,3,6,\n    6,3,7,\n    3,0,7,\n    7,0,4;\n}\n\ntemplate <typename Derivedp, typename Derivedn, typename DerivedV>\nIGL_INLINE void igl::copyleft::cgal::half_space_box(\n  const Eigen::PlainObjectBase<Derivedp> & p,\n  const Eigen::PlainObjectBase<Derivedn> & n,\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  Eigen::Matrix<CGAL::Epeck::FT,8,3> & BV,\n  Eigen::Matrix<int,12,3> & BF)\n{\n  typedef CGAL::Plane_3<CGAL::Epeck> Plane;\n  typedef CGAL::Point_3<CGAL::Epeck> Point;\n  typedef CGAL::Vector_3<CGAL::Epeck> Vector;\n  Plane P(Point(p(0),p(1),p(2)),Vector(n(0),n(1),n(2)));\n  return half_space_box(P,V,BV,BF);\n}\n\ntemplate <typename Derivedequ, typename DerivedV>\nIGL_INLINE void igl::copyleft::cgal::half_space_box(\n  const Eigen::PlainObjectBase<Derivedequ> & equ,\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  Eigen::Matrix<CGAL::Epeck::FT,8,3> & BV,\n  Eigen::Matrix<int,12,3> & BF)\n{\n  typedef CGAL::Plane_3<CGAL::Epeck> Plane;\n  Plane P(equ(0),equ(1),equ(2),equ(3));\n  return half_space_box(P,V,BV,BF);\n}\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::copyleft::cgal::half_space_box<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 1, 4, 1, 1, 4>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 1, 4, 1, 1, 4> > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 8, 3, 0, 8, 3>&, Eigen::Matrix<int, 12, 3, 0, 12, 3>&);\n// generated by autoexplicit.sh\ntemplate void igl::copyleft::cgal::half_space_box<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 1, 4, 1, 1, 4>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 4, 0, -1, 4> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 1, 4, 1, 1, 4> > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 4, 0, -1, 4> > const&, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 8, 3, 0, 8, 3>&, Eigen::Matrix<int, 12, 3, 0, 12, 3>&);\n// generated by autoexplicit.sh\ntemplate void igl::copyleft::cgal::half_space_box<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 1, 4, 1, 1, 4>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 1, 4, 1, 1, 4> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 8, 3, 0, 8, 3>&, Eigen::Matrix<int, 12, 3, 0, 12, 3>&);\ntemplate void igl::copyleft::cgal::half_space_box<Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 8, 3, 0, 8, 3>&, Eigen::Matrix<int, 12, 3, 0, 12, 3>&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/half_space_box.h",
    "content": "#ifndef IGL_COPYLEFT_CGAL_HALF_SPACE_BOX_H\n#define IGL_COPYLEFT_CGAL_HALF_SPACE_BOX_H\n#include \"../../igl_inline.h\"\n#include <Eigen/Core>\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\n#include <CGAL/Plane_3.h>\n\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // Construct a mesh of box (BV,BF) so that it contains the intersection of\n      // the half-space under the plane (P) and the bounding box of V, and does not\n      // contain any of the half-space above (P).\n      //\n      // Inputs:\n      //   P  plane so that normal points away from half-space\n      //   V  #V by 3 list of vertex positions\n      // Outputs:\n      //   BV  #BV by 3 list of box vertex positions\n      //   BF  #BF b3 list of box triangle indices into BV\n      template <typename DerivedV>\n      IGL_INLINE void half_space_box(\n        const CGAL::Plane_3<CGAL::Epeck> & P,\n        const Eigen::PlainObjectBase<DerivedV> & V,\n        Eigen::Matrix<CGAL::Epeck::FT,8,3> & BV,\n        Eigen::Matrix<int,12,3> & BF);\n      // Inputs:\n      //   p  3d point on plane\n      //   n  3d vector of normal of plane pointing away from inside\n      //   V  #V by 3 list of vertex positions\n      // Outputs:\n      //   BV  #BV by 3 list of box vertex positions\n      //   BF  #BF b3 list of box triangle indices into BV\n      template <typename Derivedp, typename Derivedn, typename DerivedV>\n      IGL_INLINE void half_space_box(\n        const Eigen::PlainObjectBase<Derivedp> & p,\n        const Eigen::PlainObjectBase<Derivedn> & n,\n        const Eigen::PlainObjectBase<DerivedV> & V,\n        Eigen::Matrix<CGAL::Epeck::FT,8,3> & BV,\n        Eigen::Matrix<int,12,3> & BF);\n      // Inputs:\n      //   equ  plane equation: a*x+b*y+c*z + d = 0\n      //   V  #V by 3 list of vertex positions\n      // Outputs:\n      //   BV  #BV by 3 list of box vertex positions\n      //   BF  #BF b3 list of box triangle indices into BV\n      template <typename Derivedequ, typename DerivedV>\n      IGL_INLINE void half_space_box(\n        const Eigen::PlainObjectBase<Derivedequ> & equ,\n        const Eigen::PlainObjectBase<DerivedV> & V,\n        Eigen::Matrix<CGAL::Epeck::FT,8,3> & BV,\n        Eigen::Matrix<int,12,3> & BF);\n    }\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"half_space_box.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/incircle.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Qingan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"incircle.h\"\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\n#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>\n\ntemplate<typename Scalar>\nIGL_INLINE short igl::copyleft::cgal::incircle(\n    const Scalar pa[2],\n    const Scalar pb[2],\n    const Scalar pc[2],\n    const Scalar pd[2])\n{\n  typedef CGAL::Exact_predicates_exact_constructions_kernel Epeck;\n  typedef CGAL::Exact_predicates_inexact_constructions_kernel Epick;\n  typedef typename std::conditional<std::is_same<Scalar, Epeck::FT>::value,\n          Epeck, Epick>::type Kernel;\n\n  switch(CGAL::side_of_oriented_circle(\n        typename Kernel::Point_2(pa[0], pa[1]),\n        typename Kernel::Point_2(pb[0], pb[1]),\n        typename Kernel::Point_2(pc[0], pc[1]),\n        typename Kernel::Point_2(pd[0], pd[1]))) {\n    case CGAL::ON_POSITIVE_SIDE:\n      return 1;\n    case CGAL::ON_NEGATIVE_SIDE:\n      return -1;\n    case CGAL::ON_ORIENTED_BOUNDARY:\n      return 0;\n    default:\n      throw \"Invalid incircle result\";\n  }\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/incircle.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Qingan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_COPYLEFT_CGAL_INCIRCLE_H\n#define IGL_COPYLEFT_CGAL_INCIRCLE_H\n\n#include \"../../igl_inline.h\"\n\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // Inputs:\n      //   pa,pb,pc,pd  2D points.\n      // Output:\n      //   1 if pd is inside of the oriented circle formed by pa,pb,pc.\n      //   0 if pd is co-circular with pa,pb,pc.\n      //  -1 if pd is outside of the oriented circle formed by pa,pb,pc.\n      template <typename Scalar>\n      IGL_INLINE short incircle(\n          const Scalar pa[2],\n          const Scalar pb[2],\n          const Scalar pc[2],\n          const Scalar pd[2]);\n    }\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"incircle.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/insert_into_cdt.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"insert_into_cdt.h\"\n#include <CGAL/Point_3.h>\n#include <CGAL/Segment_3.h>\n#include <CGAL/Triangle_3.h>\n\ntemplate <typename Kernel>\nIGL_INLINE void igl::copyleft::cgal::insert_into_cdt(\n  const CGAL::Object & obj,\n  const CGAL::Plane_3<Kernel> & P,\n  CGAL::Constrained_triangulation_plus_2<\n    CGAL::Constrained_Delaunay_triangulation_2<\n      Kernel,\n      CGAL::Triangulation_data_structure_2<\n        CGAL::Triangulation_vertex_base_2<Kernel>,\n        CGAL::Constrained_triangulation_face_base_2< Kernel>\n      >,\n      CGAL::Exact_intersections_tag\n    > \n  > \n  & cdt)\n{\n  typedef CGAL::Point_3<Kernel>    Point_3;\n  typedef CGAL::Segment_3<Kernel>  Segment_3; \n  typedef CGAL::Triangle_3<Kernel> Triangle_3; \n\n  if(const Segment_3 *iseg = CGAL::object_cast<Segment_3 >(&obj)) \n  {\n    // Add segment constraint\n    cdt.insert_constraint( P.to_2d(iseg->vertex(0)),P.to_2d(iseg->vertex(1)));\n  }else if(const Point_3 *ipoint = CGAL::object_cast<Point_3 >(&obj)) \n  {\n    // Add point\n    cdt.insert(P.to_2d(*ipoint));\n  } else if(const Triangle_3 *itri = CGAL::object_cast<Triangle_3 >(&obj)) \n  {\n    // Add 3 segment constraints\n    cdt.insert_constraint( P.to_2d(itri->vertex(0)),P.to_2d(itri->vertex(1)));\n    cdt.insert_constraint( P.to_2d(itri->vertex(1)),P.to_2d(itri->vertex(2)));\n    cdt.insert_constraint( P.to_2d(itri->vertex(2)),P.to_2d(itri->vertex(0)));\n  } else if(const std::vector<Point_3 > *polyp = \n      CGAL::object_cast< std::vector<Point_3 > >(&obj)) \n  {\n    const std::vector<Point_3 > & poly = *polyp;\n    const size_t m = poly.size();\n    assert(m>=2);\n    for(size_t p = 0;p<m;p++)\n    {\n      const size_t np = (p+1)%m;\n      cdt.insert_constraint(P.to_2d(poly[p]),P.to_2d(poly[np]));\n    }\n  }else {\n    throw std::runtime_error(\"Unknown intersection object!\");\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\ntemplate void igl::copyleft::cgal::insert_into_cdt<CGAL::Epick>(CGAL::Object const&, CGAL::Plane_3<CGAL::Epick> const&, CGAL::Constrained_triangulation_plus_2<CGAL::Constrained_Delaunay_triangulation_2<CGAL::Epick, CGAL::Triangulation_data_structure_2<CGAL::Triangulation_vertex_base_2<CGAL::Epick, CGAL::Triangulation_ds_vertex_base_2<void> >, CGAL::Constrained_triangulation_face_base_2<CGAL::Epick, CGAL::Triangulation_face_base_2<CGAL::Epick, CGAL::Triangulation_ds_face_base_2<void> > > >, CGAL::Exact_intersections_tag> >&);\ntemplate void igl::copyleft::cgal::insert_into_cdt<CGAL::Epeck>(CGAL::Object const&, CGAL::Plane_3<CGAL::Epeck> const&, CGAL::Constrained_triangulation_plus_2<CGAL::Constrained_Delaunay_triangulation_2<CGAL::Epeck, CGAL::Triangulation_data_structure_2<CGAL::Triangulation_vertex_base_2<CGAL::Epeck, CGAL::Triangulation_ds_vertex_base_2<void> >, CGAL::Constrained_triangulation_face_base_2<CGAL::Epeck, CGAL::Triangulation_face_base_2<CGAL::Epeck, CGAL::Triangulation_ds_face_base_2<void> > > >, CGAL::Exact_intersections_tag> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/insert_into_cdt.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_CGAL_INSERT_INTO_CDT_H\n#define IGL_COPYLEFT_CGAL_INSERT_INTO_CDT_H\n#include \"../../igl_inline.h\"\n\n#include <CGAL/Plane_3.h>\n#include <CGAL/Constrained_Delaunay_triangulation_2.h>\n#include <CGAL/Constrained_triangulation_plus_2.h>\n\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // Given a current 2D constrained Delaunay triangulation (cdt), insert a\n      // 3D \"object\" (e.g., resulting from intersecting two triangles) into the\n      // cdt, by projecting it via the given plane (P) and adding appropriate\n      // constraints.\n      //\n      // Inputs:\n      //   obj  CGAL::Object representing a vertex, segment, or (convex)\n      //     polygon. All vertices should lie on the plane P. If not, then this\n      //     adds the _projection_ of this object to the cdt and that might not\n      //     be what you wanted to do.\n      //   P  plane obj lies on and upon which the cdt is being performed\n      //   cdt  current CDT, see output\n      // Outputs:\n      //   cdt  CDT updated to contain constraints for the given object\n      // \n      template <typename Kernel>\n      IGL_INLINE void insert_into_cdt(\n        const CGAL::Object & obj,\n        const CGAL::Plane_3<Kernel> & P,\n        CGAL::Constrained_triangulation_plus_2<\n          CGAL::Constrained_Delaunay_triangulation_2<\n            Kernel,\n            CGAL::Triangulation_data_structure_2<\n              CGAL::Triangulation_vertex_base_2<Kernel>,\n              CGAL::Constrained_triangulation_face_base_2< Kernel>\n            >,\n            CGAL::Exact_intersections_tag\n          > \n        > \n        & cdt);\n    }\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"insert_into_cdt.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/insphere.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Qingan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"insphere.h\"\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\n#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>\n\ntemplate<typename Scalar>\nIGL_INLINE short igl::copyleft::cgal::insphere(\n    const Scalar pa[3],\n    const Scalar pb[3],\n    const Scalar pc[3],\n    const Scalar pd[3],\n    const Scalar pe[3])\n{\n  typedef CGAL::Exact_predicates_exact_constructions_kernel Epeck;\n  typedef CGAL::Exact_predicates_inexact_constructions_kernel Epick;\n  typedef typename std::conditional<std::is_same<Scalar, Epeck::FT>::value,\n          Epeck, Epick>::type Kernel;\n\n  switch(CGAL::side_of_oriented_sphere(\n        typename Kernel::Point_3(pa[0], pa[1], pa[2]),\n        typename Kernel::Point_3(pb[0], pb[1], pb[2]),\n        typename Kernel::Point_3(pc[0], pc[1], pc[2]),\n        typename Kernel::Point_3(pd[0], pd[1], pd[2]),\n        typename Kernel::Point_3(pe[0], pe[1], pe[2]))) {\n    case CGAL::ON_POSITIVE_SIDE:\n      return 1;\n    case CGAL::ON_NEGATIVE_SIDE:\n      return -1;\n    case CGAL::ON_ORIENTED_BOUNDARY:\n      return 0;\n    default:\n      throw \"Invalid incircle result\";\n  }\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/insphere.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Qingan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_COPYLEFT_CGAL_INSPHERE_H\n#define IGL_COPYLEFT_CGAL_INSPHERE_H\n\n#include \"../../igl_inline.h\"\n\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // Inputs:\n      //   pa,pb,pc,pd,pe  3D points.\n      // Output:\n      //   1 if pe is inside of the oriented sphere formed by pa,pb,pc,pd.\n      //   0 if pe is co-spherical with pa,pb,pc,pd.\n      //  -1 if pe is outside of the oriented sphere formed by pa,pb,pc,pd.\n      template <typename Scalar>\n      IGL_INLINE short insphere(\n          const Scalar pa[3],\n          const Scalar pb[3],\n          const Scalar pc[3],\n          const Scalar pd[3],\n          const Scalar pe[3]);\n    }\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"insphere.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/intersect_other.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"intersect_other.h\"\n#include \"CGAL_includes.hpp\"\n#include \"mesh_to_cgal_triangle_list.h\"\n#include \"remesh_intersections.h\"\n#include \"../../slice_mask.h\"\n#include \"../../remove_unreferenced.h\"\n\n#ifndef IGL_FIRST_HIT_EXCEPTION\n#define IGL_FIRST_HIT_EXCEPTION 10\n#endif\n\n// Un-exposed helper functions\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      template <typename DerivedF>\n      static IGL_INLINE void push_result(\n        const Eigen::PlainObjectBase<DerivedF> & F,\n        const int f,\n        const int f_other,\n        const CGAL::Object & result,\n        std::map<\n          typename DerivedF::Index,\n          std::vector<std::pair<typename DerivedF::Index, CGAL::Object> > > &\n          offending)\n        //std::map<\n        //  std::pair<typename DerivedF::Index,typename DerivedF::Index>,\n        //  std::vector<typename DerivedF::Index> > & edge2faces)\n      {\n        typedef typename DerivedF::Index Index;\n        typedef std::pair<Index,Index> EMK;\n        if(offending.count(f) == 0)\n        {\n          // first time marking, initialize with new id and empty list\n          offending[f] = {};\n          for(Index e = 0; e<3;e++)\n          {\n            // append face to edge's list\n            Index i = F(f,(e+1)%3) < F(f,(e+2)%3) ? F(f,(e+1)%3) : F(f,(e+2)%3);\n            Index j = F(f,(e+1)%3) < F(f,(e+2)%3) ? F(f,(e+2)%3) : F(f,(e+1)%3);\n            //edge2faces[EMK(i,j)].push_back(f);\n          }\n        }\n        offending[f].push_back({f_other,result});\n      }\n      template <\n        typename Kernel,\n        typename DerivedVA,\n        typename DerivedFA,\n        typename DerivedVB,\n        typename DerivedFB,\n        typename DerivedIF,\n        typename DerivedVVAB,\n        typename DerivedFFAB,\n        typename DerivedJAB,\n        typename DerivedIMAB>\n      static IGL_INLINE bool intersect_other_helper(\n        const Eigen::PlainObjectBase<DerivedVA> & VA,\n        const Eigen::PlainObjectBase<DerivedFA> & FA,\n        const Eigen::PlainObjectBase<DerivedVB> & VB,\n        const Eigen::PlainObjectBase<DerivedFB> & FB,\n        const RemeshSelfIntersectionsParam & params,\n        Eigen::PlainObjectBase<DerivedIF> & IF,\n        Eigen::PlainObjectBase<DerivedVVAB> & VVAB,\n        Eigen::PlainObjectBase<DerivedFFAB> & FFAB,\n        Eigen::PlainObjectBase<DerivedJAB>  & JAB,\n        Eigen::PlainObjectBase<DerivedIMAB> & IMAB)\n      {\n\n        using namespace std;\n        using namespace Eigen;\n\n        typedef typename DerivedFA::Index Index;\n        // 3D Primitives\n        typedef CGAL::Point_3<Kernel>    Point_3;\n        typedef CGAL::Segment_3<Kernel>  Segment_3; \n        typedef CGAL::Triangle_3<Kernel> Triangle_3; \n        typedef CGAL::Plane_3<Kernel>    Plane_3;\n        typedef CGAL::Tetrahedron_3<Kernel> Tetrahedron_3; \n        // 2D Primitives\n        typedef CGAL::Point_2<Kernel>    Point_2;\n        typedef CGAL::Segment_2<Kernel>  Segment_2; \n        typedef CGAL::Triangle_2<Kernel> Triangle_2; \n        // 2D Constrained Delaunay Triangulation types\n        typedef CGAL::Triangulation_vertex_base_2<Kernel>  TVB_2;\n        typedef CGAL::Constrained_triangulation_face_base_2<Kernel> CTAB_2;\n        typedef CGAL::Triangulation_data_structure_2<TVB_2,CTAB_2> TDS_2;\n        typedef CGAL::Exact_intersections_tag Itag;\n        // Axis-align boxes for all-pairs self-intersection detection\n        typedef std::vector<Triangle_3> Triangles;\n        typedef typename Triangles::iterator TrianglesIterator;\n        typedef typename Triangles::const_iterator TrianglesConstIterator;\n        typedef \n          CGAL::Box_intersection_d::Box_with_handle_d<double,3,TrianglesIterator> \n          Box;\n        typedef \n          std::map<Index,std::vector<std::pair<Index,CGAL::Object> > > \n          OffendingMap;\n        typedef std::map<std::pair<Index,Index>,std::vector<Index> >  EdgeMap;\n        typedef std::pair<Index,Index> EMK;\n\n        Triangles TA,TB;\n        // Compute and process self intersections\n        mesh_to_cgal_triangle_list(VA,FA,TA);\n        mesh_to_cgal_triangle_list(VB,FB,TB);\n        // http://www.cgal.org/Manual/latest/doc_html/cgal_manual/Box_intersection_d/Chapter_main.html#Section_63.5 \n        // Create the corresponding vector of bounding boxes\n        std::vector<Box> A_boxes,B_boxes;\n        const auto box_up = [](Triangles & T, std::vector<Box> & boxes) -> void\n        {\n          boxes.reserve(T.size());\n          for ( \n            TrianglesIterator tit = T.begin(); \n            tit != T.end(); \n            ++tit)\n          {\n            boxes.push_back(Box(tit->bbox(), tit));\n          }\n        };\n        box_up(TA,A_boxes);\n        box_up(TB,B_boxes);\n        OffendingMap offendingA,offendingB;\n        //EdgeMap edge2facesA,edge2facesB;\n\n        std::list<int> lIF;\n        const auto cb = [&](const Box &a, const Box &b) -> void\n        {\n          using namespace std;\n          // index in F and T\n          int fa = a.handle()-TA.begin();\n          int fb = b.handle()-TB.begin();\n          const Triangle_3 & A = *a.handle();\n          const Triangle_3 & B = *b.handle();\n          if(CGAL::do_intersect(A,B))\n          {\n            // There was an intersection\n            lIF.push_back(fa);\n            lIF.push_back(fb);\n            if(params.first_only)\n            {\n              throw IGL_FIRST_HIT_EXCEPTION;\n            }\n            if(!params.detect_only)\n            {\n              CGAL::Object result = CGAL::intersection(A,B);\n\n              push_result(FA,fa,fb,result,offendingA);\n              push_result(FB,fb,fa,result,offendingB);\n            }\n          }\n        };\n        try{\n          CGAL::box_intersection_d(\n            A_boxes.begin(), A_boxes.end(),\n            B_boxes.begin(), B_boxes.end(),\n            cb);\n        }catch(int e)\n        {\n          // Rethrow if not FIRST_HIT_EXCEPTION\n          if(e != IGL_FIRST_HIT_EXCEPTION)\n          {\n            throw e;\n          }\n          // Otherwise just fall through\n        }\n\n        // Convert lIF to Eigen matrix\n        assert(lIF.size()%2 == 0);\n        IF.resize(lIF.size()/2,2);\n        {\n          int i=0;\n          for(\n            list<int>::const_iterator ifit = lIF.begin();\n            ifit!=lIF.end();\n            )\n          {\n            IF(i,0) = (*ifit);\n            ifit++; \n            IF(i,1) = (*ifit);\n            ifit++;\n            i++;\n          }\n        }\n        if(!params.detect_only)\n        {\n          // Obsolete, now remesh_intersections expects a single mesh\n          // remesh_intersections(VA,FA,TA,offendingA,VVA,FFA,JA,IMA);\n          // remesh_intersections(VB,FB,TB,offendingB,VVB,FFB,JB,IMB);\n          // Combine mesh and offending maps\n          DerivedVA VAB(VA.rows()+VB.rows(),3);\n          VAB<<VA,VB;\n          DerivedFA FAB(FA.rows()+FB.rows(),3);\n          FAB<<FA,(FB.array()+VA.rows());\n          Triangles TAB;\n          TAB.reserve(TA.size()+TB.size());\n          TAB.insert(TAB.end(),TA.begin(),TA.end());\n          TAB.insert(TAB.end(),TB.begin(),TB.end());\n          OffendingMap offending;\n          //offending.reserve(offendingA.size() + offendingB.size());\n          for (const auto itr : offendingA)\n          {\n            // Remap offenders in FB to FAB\n            auto offenders = itr.second;\n            for(auto & offender : offenders)\n            {\n              offender.first += FA.rows();\n            }\n            offending[itr.first] = offenders;\n          }\n          for (const auto itr : offendingB)\n          {\n            // Store offenders for FB according to place in FAB\n            offending[FA.rows() + itr.first] = itr.second;\n          }\n\n          remesh_intersections(\n            VAB,FAB,TAB,offending,params.stitch_all,VVAB,FFAB,JAB,IMAB);\n        }\n\n        return IF.rows() > 0;\n      }\n    }\n  }\n}\n\ntemplate <\n  typename DerivedVA,\n  typename DerivedFA,\n  typename DerivedVB,\n  typename DerivedFB,\n  typename DerivedIF,\n  typename DerivedVVAB,\n  typename DerivedFFAB,\n  typename DerivedJAB,\n  typename DerivedIMAB>\nIGL_INLINE bool igl::copyleft::cgal::intersect_other(\n    const Eigen::PlainObjectBase<DerivedVA> & VA,\n    const Eigen::PlainObjectBase<DerivedFA> & FA,\n    const Eigen::PlainObjectBase<DerivedVB> & VB,\n    const Eigen::PlainObjectBase<DerivedFB> & FB,\n    const RemeshSelfIntersectionsParam & params,\n    Eigen::PlainObjectBase<DerivedIF> & IF,\n    Eigen::PlainObjectBase<DerivedVVAB> & VVAB,\n    Eigen::PlainObjectBase<DerivedFFAB> & FFAB,\n    Eigen::PlainObjectBase<DerivedJAB>  & JAB,\n    Eigen::PlainObjectBase<DerivedIMAB> & IMAB)\n{\n  if(params.detect_only)\n  {\n    return intersect_other_helper<CGAL::Epick>\n      (VA,FA,VB,FB,params,IF,VVAB,FFAB,JAB,IMAB);\n  }else\n  {\n    return intersect_other_helper<CGAL::Epeck>\n      (VA,FA,VB,FB,params,IF,VVAB,FFAB,JAB,IMAB);\n  }\n}\n\nIGL_INLINE bool igl::copyleft::cgal::intersect_other(\n  const Eigen::MatrixXd & VA,\n  const Eigen::MatrixXi & FA,\n  const Eigen::MatrixXd & VB,\n  const Eigen::MatrixXi & FB,\n  const bool first_only,\n  Eigen::MatrixXi & IF)\n{\n  Eigen::MatrixXd VVAB;\n  Eigen::MatrixXi FFAB;\n  Eigen::VectorXi JAB,IMAB;\n  return intersect_other(\n    VA,FA,VB,FB,{true,first_only},IF,VVAB,FFAB,JAB,IMAB);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/intersect_other.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_CGAL_INTERSECT_OTHER_H\n#define IGL_COPYLEFT_CGAL_INTERSECT_OTHER_H\n#include \"../../igl_inline.h\"\n#include \"RemeshSelfIntersectionsParam.h\"\n\n#include <Eigen/Dense>\n\n#ifdef MEX\n#  include <mex.h>\n#  include <cassert>\n#  undef assert\n#  define assert( isOK ) ( (isOK) ? (void)0 : (void) mexErrMsgTxt(C_STR(__FILE__<<\":\"<<__LINE__<<\": failed assertion `\"<<#isOK<<\"'\"<<std::endl) ) )\n#endif\n\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // INTERSECT_OTHER Given a triangle mesh (VA,FA) and another mesh (VB,FB)\n      // find all pairs of intersecting faces. Note that self-intersections are\n      // ignored.\n      // \n      // Inputs:\n      //   VA  #V by 3 list of vertex positions\n      //   FA  #F by 3 list of triangle indices into VA\n      //   VB  #V by 3 list of vertex positions\n      //   FB  #F by 3 list of triangle indices into VB\n      //   params   whether to detect only and then whether to only find first\n      //     intersection\n      // Outputs:\n      //   IF  #intersecting face pairs by 2 list of intersecting face pairs,\n      //     indexing FA and FB\n      //   VVAB  #VVAB by 3 list of vertex positions\n      //   FFAB  #FFAB by 3 list of triangle indices into VVA\n      //   JAB  #FFAB list of indices into [FA;FB] denoting birth triangle\n      //   IMAB  #VVAB list of indices stitching duplicates (resulting from\n      //     mesh intersections) together\n      template <\n        typename DerivedVA,\n        typename DerivedFA,\n        typename DerivedVB,\n        typename DerivedFB,\n        typename DerivedIF,\n        typename DerivedVVAB,\n        typename DerivedFFAB,\n        typename DerivedJAB,\n        typename DerivedIMAB>\n      IGL_INLINE bool intersect_other(\n        const Eigen::PlainObjectBase<DerivedVA> & VA,\n        const Eigen::PlainObjectBase<DerivedFA> & FA,\n        const Eigen::PlainObjectBase<DerivedVB> & VB,\n        const Eigen::PlainObjectBase<DerivedFB> & FB,\n        const RemeshSelfIntersectionsParam & params,\n        Eigen::PlainObjectBase<DerivedIF> & IF,\n        Eigen::PlainObjectBase<DerivedVVAB> & VVAB,\n        Eigen::PlainObjectBase<DerivedFFAB> & FFAB,\n        Eigen::PlainObjectBase<DerivedJAB>  & JAB,\n        Eigen::PlainObjectBase<DerivedIMAB> & IMAB);\n      // Legacy wrapper for detect only using common types.\n      //\n      // Inputs:\n      //   VA  #V by 3 list of vertex positions\n      //   FA  #F by 3 list of triangle indices into VA\n      //   VB  #V by 3 list of vertex positions\n      //   FB  #F by 3 list of triangle indices into VB\n      //   first_only  whether to only detect the first intersection.\n      // Outputs:\n      //   IF  #intersecting face pairs by 2 list of intersecting face pairs,\n      //     indexing FA and FB\n      // Returns true if any intersections were found\n      //\n      // See also: remesh_self_intersections\n      IGL_INLINE bool intersect_other(\n        const Eigen::MatrixXd & VA,\n        const Eigen::MatrixXi & FA,\n        const Eigen::MatrixXd & VB,\n        const Eigen::MatrixXi & FB,\n        const bool first_only,\n        Eigen::MatrixXi & IF);\n    }\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"intersect_other.cpp\"\n#endif\n  \n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/intersect_with_half_space.cpp",
    "content": "#include \"intersect_with_half_space.h\"\n#include \"mesh_boolean.h\"\n#include \"half_space_box.h\"\n\ntemplate <\n  typename DerivedV,\n  typename DerivedF,\n  typename Derivedp,\n  typename Derivedn,\n  typename DerivedVC,\n  typename DerivedFC,\n  typename DerivedJ>\nIGL_INLINE bool igl::copyleft::cgal::intersect_with_half_space(\n  const Eigen::PlainObjectBase<DerivedV > & V,\n  const Eigen::PlainObjectBase<DerivedF > & F,\n  const Eigen::PlainObjectBase<Derivedp > & p,\n  const Eigen::PlainObjectBase<Derivedn > & n,\n  Eigen::PlainObjectBase<DerivedVC > & VC,\n  Eigen::PlainObjectBase<DerivedFC > & FC,\n  Eigen::PlainObjectBase<DerivedJ > & J)\n{\n  typedef CGAL::Plane_3<CGAL::Epeck> Plane;\n  typedef CGAL::Point_3<CGAL::Epeck> Point;\n  typedef CGAL::Vector_3<CGAL::Epeck> Vector;\n  Plane P(Point(p(0),p(1),p(2)),Vector(n(0),n(1),n(2)));\n  return intersect_with_half_space(V,F,P,VC,FC,J);\n}\n\ntemplate <\n  typename DerivedV,\n  typename DerivedF,\n  typename Derivedequ,\n  typename DerivedVC,\n  typename DerivedFC,\n  typename DerivedJ>\nIGL_INLINE bool igl::copyleft::cgal::intersect_with_half_space(\n  const Eigen::PlainObjectBase<DerivedV > & V,\n  const Eigen::PlainObjectBase<DerivedF > & F,\n  const Eigen::PlainObjectBase<Derivedequ > & equ,\n  Eigen::PlainObjectBase<DerivedVC > & VC,\n  Eigen::PlainObjectBase<DerivedFC > & FC,\n  Eigen::PlainObjectBase<DerivedJ > & J)\n{\n  typedef CGAL::Plane_3<CGAL::Epeck> Plane;\n  Plane P(equ(0),equ(1),equ(2),equ(3));\n  return intersect_with_half_space(V,F,P,VC,FC,J);\n}\n\ntemplate <\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedVC,\n  typename DerivedFC,\n  typename DerivedJ>\nIGL_INLINE bool igl::copyleft::cgal::intersect_with_half_space(\n  const Eigen::PlainObjectBase<DerivedV > & V,\n  const Eigen::PlainObjectBase<DerivedF > & F,\n  const CGAL::Plane_3<CGAL::Epeck> & P,\n  Eigen::PlainObjectBase<DerivedVC > & VC,\n  Eigen::PlainObjectBase<DerivedFC > & FC,\n  Eigen::PlainObjectBase<DerivedJ > & J)\n{\n  Eigen::Matrix<CGAL::Epeck::FT,8,3> BV;\n  Eigen::Matrix<int,12,3> BF;\n  half_space_box(P,V,BV,BF);\n  // Disturbingly, (BV,BF) must be first argument\n  const bool ret = mesh_boolean(BV,BF,V,F,MESH_BOOLEAN_TYPE_INTERSECT,VC,FC,J);\n  // But now J is wrong...\n  std::for_each(\n    J.data(),\n    J.data()+J.size(),\n    [&BF,&F](typename DerivedJ::Scalar & j)\n      {j = (j<BF.rows()?F.rows()+j:j-BF.rows());}\n    );\n  return ret;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate bool igl::copyleft::cgal::intersect_with_half_space<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 1, 4, 1, 1, 4>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 1, 4, 1, 1, 4> > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n// generated by autoexplicit.sh\ntemplate bool igl::copyleft::cgal::intersect_with_half_space<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 4, 0, -1, 4>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 1, 4, 1, 1, 4>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 4, 0, -1, 4>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 4, 0, -1, 4> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 1, 4, 1, 1, 4> > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 4, 0, -1, 4> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n// generated by autoexplicit.sh\ntemplate bool igl::copyleft::cgal::intersect_with_half_space<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 1, 4, 1, 1, 4>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 1, 4, 1, 1, 4> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate bool igl::copyleft::cgal::intersect_with_half_space<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/intersect_with_half_space.h",
    "content": "#ifndef IGL_COPYLEFT_CGAL_INTERSECT_WITH_HALF_SPACE_H\n#define IGL_COPYLEFT_CGAL_INTERSECT_WITH_HALF_SPACE_H\n#include \"../../igl_inline.h\"\n#include <Eigen/Core>\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\n#include <CGAL/Plane_3.h>\n\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // Intersect a PWN mesh with a half-space. Point on plane, normal pointing\n      // outward.\n      //\n      // Inputs:\n      //   V  #V by 3 list of mesh vertex positions\n      //   p  3d point on plane\n      //   n  3d vector of normal of plane pointing away from inside\n      // Outputs:\n      //   VC  #VC by 3 list of vertex positions of boolean result mesh\n      //   FC  #FC by 3 list of triangle indices into VC\n      //   J  #FC list of indices into [F;F.rows()+[1;2]] revealing \"birth\"\n      //     facet\n      template <\n        typename DerivedV,\n        typename DerivedF,\n        typename Derivedp,\n        typename Derivedn,\n        typename DerivedVC,\n        typename DerivedFC,\n        typename DerivedJ>\n      IGL_INLINE bool intersect_with_half_space(\n        const Eigen::PlainObjectBase<DerivedV > & V,\n        const Eigen::PlainObjectBase<DerivedF > & F,\n        const Eigen::PlainObjectBase<Derivedp > & p,\n        const Eigen::PlainObjectBase<Derivedn > & n,\n        Eigen::PlainObjectBase<DerivedVC > & VC,\n        Eigen::PlainObjectBase<DerivedFC > & FC,\n        Eigen::PlainObjectBase<DerivedJ > & J);\n      // Intersect a PWN mesh with a half-space. Plane equation.\n      //\n      // Inputs:\n      //   V  #V by 3 list of mesh vertex positions\n      //   equ  plane equation: P(x,y,z) = a*x+b*y+c*z + d = 0, P(x,y,z) < 0 is\n      //     _inside_.\n      // Outputs:\n      //   VC  #VC by 3 list of vertex positions of boolean result mesh\n      //   FC  #FC by 3 list of triangle indices into VC\n      //   J  #FC list of indices into [F;F.rows()+[1;2]] revealing \"birth\" facet\n      template <\n        typename DerivedV,\n        typename DerivedF,\n        typename Derivedequ,\n        typename DerivedVC,\n        typename DerivedFC,\n        typename DerivedJ>\n      IGL_INLINE bool intersect_with_half_space(\n        const Eigen::PlainObjectBase<DerivedV > & V,\n        const Eigen::PlainObjectBase<DerivedF > & F,\n        const Eigen::PlainObjectBase<Derivedequ > & equ,\n        Eigen::PlainObjectBase<DerivedVC > & VC,\n        Eigen::PlainObjectBase<DerivedFC > & FC,\n        Eigen::PlainObjectBase<DerivedJ > & J);\n      // Intersect a PWN mesh with a half-space. CGAL Plane.\n      //\n      // Inputs:\n      //   V  #V by 3 list of mesh vertex positions\n      //   P  plane \n      // Outputs:\n      //   VC  #VC by 3 list of vertex positions of boolean result mesh\n      //   FC  #FC by 3 list of triangle indices into VC\n      //   J  #FC list of indices into [F;F.rows()+[1;2]] revealing \"birth\" facet\n      template <\n        typename DerivedV,\n        typename DerivedF,\n        typename DerivedVC,\n        typename DerivedFC,\n        typename DerivedJ>\n      IGL_INLINE bool intersect_with_half_space(\n        const Eigen::PlainObjectBase<DerivedV > & V,\n        const Eigen::PlainObjectBase<DerivedF > & F,\n        const CGAL::Plane_3<CGAL::Epeck> & P,\n        Eigen::PlainObjectBase<DerivedVC > & VC,\n        Eigen::PlainObjectBase<DerivedFC > & FC,\n        Eigen::PlainObjectBase<DerivedJ > & J);\n    }\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"intersect_with_half_space.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/lexicographic_triangulation.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n//                    Qingan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"lexicographic_triangulation.h\"\n#include \"../../lexicographic_triangulation.h\"\n#include \"orient2D.h\"\n\ntemplate<\n  typename DerivedP,\n  typename DerivedF\n  >\nIGL_INLINE void igl::copyleft::cgal::lexicographic_triangulation(\n    const Eigen::PlainObjectBase<DerivedP>& P,\n    Eigen::PlainObjectBase<DerivedF>& F)\n{\n  typedef typename DerivedP::Scalar Scalar;\n  igl::lexicographic_triangulation(P, orient2D<Scalar>, F);\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/lexicographic_triangulation.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n//                    Qingan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_COPYLEFT_CGAL_LEXICOGRAPHIC_TRIANGULATION_H\n#define IGL_COPYLEFT_CGAL_LEXICOGRAPHIC_TRIANGULATION_H\n#include \"../../igl_inline.h\"\n#include <Eigen/Core>\n\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n\n      // Given a set of points in 2D, return a lexicographic triangulation of these\n      // points.\n      //\n      // Inputs:\n      //   P  #P by 2 list of vertex positions\n      //\n      // Outputs:\n      //   F  #F by 3 of faces in lexicographic triangulation.\n      template<\n        typename DerivedP,\n        typename DerivedF\n        >\n      IGL_INLINE void lexicographic_triangulation(\n          const Eigen::PlainObjectBase<DerivedP>& P,\n          Eigen::PlainObjectBase<DerivedF>& F);\n    }\n  }\n}\n\n\n\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"lexicographic_triangulation.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/mesh_boolean.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n//                    Qingnan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n//\n#include \"mesh_boolean.h\"\n#include \"assign.h\"\n#include \"extract_cells.h\"\n#include \"mesh_boolean_type_to_funcs.h\"\n#include \"propagate_winding_numbers.h\"\n#include \"relabel_small_immersed_cells.h\"\n#include \"remesh_self_intersections.h\"\n#include \"string_to_mesh_boolean_type.h\"\n#include \"../../cumsum.h\"\n#include \"../../extract_manifold_patches.h\"\n#include \"../../get_seconds.h\"\n#include \"../../remove_unreferenced.h\"\n#include \"../../resolve_duplicated_faces.h\"\n#include \"../../slice.h\"\n#include \"../../unique_edge_map.h\"\n#include \"../../unique_simplices.h\"\n\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\n#include <algorithm>\n\n//#define MESH_BOOLEAN_TIMING\n//#define DOUBLE_CHECK_EXACT_OUTPUT\n//#define SMALL_CELL_REMOVAL\n\ntemplate <\n  typename DerivedVA,\n  typename DerivedFA,\n  typename DerivedVB,\n  typename DerivedFB,\n  typename DerivedVC,\n  typename DerivedFC,\n  typename DerivedJ>\nIGL_INLINE bool igl::copyleft::cgal::mesh_boolean(\n    const Eigen::PlainObjectBase<DerivedVA > & VA,\n    const Eigen::PlainObjectBase<DerivedFA > & FA,\n    const Eigen::PlainObjectBase<DerivedVB > & VB,\n    const Eigen::PlainObjectBase<DerivedFB > & FB,\n    const MeshBooleanType & type,\n    Eigen::PlainObjectBase<DerivedVC > & VC,\n    Eigen::PlainObjectBase<DerivedFC > & FC,\n    Eigen::PlainObjectBase<DerivedJ > & J)\n{\n  std::function<int(const int, const int)> keep;\n  std::function<int(const Eigen::Matrix<int,1,Eigen::Dynamic>) > wind_num_op;\n  mesh_boolean_type_to_funcs(type,wind_num_op,keep);\n  return mesh_boolean(VA,FA,VB,FB,wind_num_op,keep,VC,FC,J);\n}\ntemplate <\n  typename DerivedVA,\n  typename DerivedFA,\n  typename DerivedVB,\n  typename DerivedFB,\n  typename DerivedVC,\n  typename DerivedFC,\n  typename DerivedJ>\nIGL_INLINE bool igl::copyleft::cgal::mesh_boolean(\n  const Eigen::PlainObjectBase<DerivedVA > & VA,\n  const Eigen::PlainObjectBase<DerivedFA > & FA,\n  const Eigen::PlainObjectBase<DerivedVB > & VB,\n  const Eigen::PlainObjectBase<DerivedFB > & FB,\n  const std::string & type_str,\n  Eigen::PlainObjectBase<DerivedVC > & VC,\n  Eigen::PlainObjectBase<DerivedFC > & FC,\n  Eigen::PlainObjectBase<DerivedJ > & J)\n{\n  return mesh_boolean(\n    VA,FA,VB,FB,string_to_mesh_boolean_type(type_str),VC,FC,J);\n}\n\ntemplate <\n  typename DerivedVA,\n  typename DerivedFA,\n  typename DerivedVB,\n  typename DerivedFB,\n  typename DerivedVC,\n  typename DerivedFC,\n  typename DerivedJ>\nIGL_INLINE bool igl::copyleft::cgal::mesh_boolean(\n    const Eigen::PlainObjectBase<DerivedVA> & VA,\n    const Eigen::PlainObjectBase<DerivedFA> & FA,\n    const Eigen::PlainObjectBase<DerivedVB> & VB,\n    const Eigen::PlainObjectBase<DerivedFB> & FB,\n    const std::function<int(const Eigen::Matrix<int,1,Eigen::Dynamic>) >& wind_num_op,\n    const std::function<int(const int, const int)> & keep,\n    Eigen::PlainObjectBase<DerivedVC > & VC,\n    Eigen::PlainObjectBase<DerivedFC > & FC,\n    Eigen::PlainObjectBase<DerivedJ > & J) \n{\n  // Generate combined mesh (VA,FA,VB,FB) -> (V,F)\n  Eigen::Matrix<size_t,2,1> sizes(FA.rows(),FB.rows());\n  // TODO: This is a precision template **bug** that results in failure to\n  // compile. If DerivedVA::Scalar is double and DerivedVB::Scalar is\n  // CGAL::Epeck::FT then the following assignment will not compile. This\n  // implies that VA must have the trumping precision (and a valid assignment\n  // operator from VB's type).\n  Eigen::Matrix<typename DerivedVA::Scalar,Eigen::Dynamic,3> VV(VA.rows() + VB.rows(), 3);\n  DerivedFC FF(FA.rows() + FB.rows(), 3);\n  // Can't use comma initializer\n  for(int a = 0;a<VA.rows();a++)\n  {\n    for(int d = 0;d<3;d++) VV(a,d) = VA(a,d);\n  }\n  for(int b = 0;b<VB.rows();b++)\n  {\n    for(int d = 0;d<3;d++) VV(VA.rows()+b,d) = VB(b,d);\n  }\n  FF.block(0, 0, FA.rows(), 3) = FA;\n  FF.block(FA.rows(), 0, FB.rows(), 3) = FB.array() + VA.rows();\n  return mesh_boolean(VV,FF,sizes,wind_num_op,keep,VC,FC,J);\n}\n\ntemplate <\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedVC,\n  typename DerivedFC,\n  typename DerivedJ>\nIGL_INLINE bool igl::copyleft::cgal::mesh_boolean(\n    const std::vector<DerivedV > & Vlist,\n    const std::vector<DerivedF > & Flist,\n    const std::function<int(const Eigen::Matrix<int,1,Eigen::Dynamic>) >& wind_num_op,\n    const std::function<int(const int, const int)> & keep,\n    Eigen::PlainObjectBase<DerivedVC > & VC,\n    Eigen::PlainObjectBase<DerivedFC > & FC,\n    Eigen::PlainObjectBase<DerivedJ > & J)\n{\n  assert(Flist.size() == Vlist.size() && \"#Vlist and #Flist should match\");\n  const size_t num_inputs = Vlist.size();\n  // Gather sizes\n  Eigen::Matrix<size_t,Eigen::Dynamic,1> sizes(num_inputs);\n  int numf = 0;\n  int numv = 0;\n  for(int i = 0;i<num_inputs;i++)\n  {\n    sizes(i) = Flist[i].rows();\n    numf += Flist[i].rows();\n    numv += Vlist[i].rows();\n  }\n  // Combined mesh\n  DerivedV VV(numv,3);\n  DerivedF FF(numf,3);\n  {\n    int fk = 0;\n    int vk = 0;\n    for(int i = 0;i<num_inputs;i++)\n    {\n      FF.block(fk,0,Flist[i].rows(),3) = Flist[i].array() + vk;\n      fk += Flist[i].rows();\n      VV.block(vk,0,Vlist[i].rows(),3) = Vlist[i];\n      vk += Vlist[i].rows();\n    }\n  }\n  return mesh_boolean(VV,FF,sizes,wind_num_op,keep,VC,FC,J);\n}\n\ntemplate <\n  typename DerivedVV,\n  typename DerivedFF,\n  typename Derivedsizes,\n  typename DerivedVC,\n  typename DerivedFC,\n  typename DerivedJ>\nIGL_INLINE bool igl::copyleft::cgal::mesh_boolean(\n    const Eigen::PlainObjectBase<DerivedVV > & VV,\n    const Eigen::PlainObjectBase<DerivedFF > & FF,\n    const Eigen::PlainObjectBase<Derivedsizes> & sizes,\n    const std::function<int(const Eigen::Matrix<int,1,Eigen::Dynamic>) >& wind_num_op,\n    const std::function<int(const int, const int)> & keep,\n    Eigen::PlainObjectBase<DerivedVC > & VC,\n    Eigen::PlainObjectBase<DerivedFC > & FC,\n    Eigen::PlainObjectBase<DerivedJ > & J)\n{\n#ifdef MESH_BOOLEAN_TIMING\n  const auto & tictoc = []() -> double\n  {\n    static double t_start = igl::get_seconds();\n    double diff = igl::get_seconds()-t_start;\n    t_start += diff;\n    return diff;\n  };\n  const auto log_time = [&](const std::string& label) -> void {\n    std::cout << \"mesh_boolean.\" << label << \": \"\n      << tictoc() << std::endl;\n  };\n  tictoc();\n#endif\n  typedef typename DerivedVC::Scalar Scalar;\n  typedef CGAL::Epeck Kernel;\n  typedef Kernel::FT ExactScalar;\n  typedef Eigen::Matrix<Scalar,Eigen::Dynamic,3> MatrixX3S;\n  typedef Eigen::Matrix<typename DerivedJ::Scalar,Eigen::Dynamic,1> VectorXJ;\n  typedef Eigen::Matrix<\n    ExactScalar,\n    Eigen::Dynamic,\n    Eigen::Dynamic,\n    DerivedVC::IsRowMajor> MatrixXES;\n  MatrixXES V;\n  DerivedFC F;\n  VectorXJ  CJ;\n  {\n    Eigen::VectorXi I;\n    igl::copyleft::cgal::RemeshSelfIntersectionsParam params;\n    params.stitch_all = true;\n    MatrixXES Vr;\n    DerivedFC Fr;\n    Eigen::MatrixXi IF;\n    igl::copyleft::cgal::remesh_self_intersections(\n        VV, FF, params, Vr, Fr, IF, CJ, I);\n    assert(I.size() == Vr.rows());\n    // Merge coinciding vertices into non-manifold vertices.\n    std::for_each(Fr.data(), Fr.data()+Fr.size(),\n          [&I](typename DerivedFC::Scalar& a) { a=I[a]; });\n      // Remove unreferenced vertices.\n      Eigen::VectorXi UIM;\n      igl::remove_unreferenced(Vr, Fr, V, F, UIM);\n   }\n#ifdef MESH_BOOLEAN_TIMING\n  log_time(\"resolve_self_intersection\");\n#endif\n\n  // Compute edges of (F) --> (E,uE,EMAP,uE2E)\n  Eigen::MatrixXi E, uE;\n  Eigen::VectorXi EMAP;\n  std::vector<std::vector<size_t> > uE2E;\n  igl::unique_edge_map(F, E, uE, EMAP, uE2E);\n\n  // Compute patches (F,EMAP,uE2E) --> (P)\n  Eigen::VectorXi P;\n  const size_t num_patches = igl::extract_manifold_patches(F, EMAP, uE2E, P);\n#ifdef MESH_BOOLEAN_TIMING\n  log_time(\"patch_extraction\");\n#endif\n\n  // Compute cells (V,F,P,E,uE,EMAP) -> (per_patch_cells)\n  Eigen::MatrixXi per_patch_cells;\n  const size_t num_cells =\n    igl::copyleft::cgal::extract_cells(\n        V, F, P, E, uE, uE2E, EMAP, per_patch_cells);\n#ifdef MESH_BOOLEAN_TIMING\n  log_time(\"cell_extraction\");\n#endif\n\n  // Compute winding numbers on each side of each facet.\n  const size_t num_faces = F.rows();\n  // W(f,:) --> [w1out,w1in,w2out,w2in, ... wnout,wnint] winding numbers above\n  // and below each face w.r.t. each input mesh, so that W(f,2*i) is the\n  // winding number above face f w.r.t. input i, and W(f,2*i+1) is the winding\n  // number below face f w.r.t. input i.\n  Eigen::MatrixXi W;\n  // labels(f) = i means that face f comes from mesh i\n  Eigen::VectorXi labels(num_faces);\n  // cumulative sizes\n  Derivedsizes cumsizes;\n  igl::cumsum(sizes,1,cumsizes);\n  const size_t num_inputs = sizes.size();\n  std::transform(\n    CJ.data(), \n    CJ.data()+CJ.size(), \n    labels.data(),\n    // Determine which input mesh birth face i comes from\n    [&num_inputs,&cumsizes](int i)->int\n    { \n      for(int k = 0;k<num_inputs;k++)\n      {\n        if(i<cumsizes(k)) return k;\n      }\n      assert(false && \"Birth parent index out of range\");\n      return -1;\n    });\n  bool valid = true;\n  if (num_faces > 0) \n  {\n    valid = valid & \n      igl::copyleft::cgal::propagate_winding_numbers(\n          V, F, uE, uE2E, num_patches, P, num_cells, per_patch_cells, labels, W);\n  } else \n  {\n    W.resize(0, 2*num_inputs);\n  }\n  assert((size_t)W.rows() == num_faces);\n  // If W doesn't have enough columns, pad with zeros\n  if (W.cols() <= 2*num_inputs) \n  {\n    const int old_ncols = W.cols();\n    W.conservativeResize(num_faces,2*num_inputs);\n    W.rightCols(2*num_inputs-old_ncols).setConstant(0);\n  }\n  assert((size_t)W.cols() == 2*num_inputs);\n#ifdef MESH_BOOLEAN_TIMING\n  log_time(\"propagate_input_winding_number\");\n#endif\n\n  // Compute resulting winding number.\n  Eigen::MatrixXi Wr(num_faces, 2);\n  for (size_t i=0; i<num_faces; i++) \n  {\n    // Winding number vectors above and below\n    Eigen::RowVectorXi w_out(1,num_inputs), w_in(1,num_inputs);\n    for(size_t k =0;k<num_inputs;k++)\n    {\n      w_out(k) = W(i,2*k+0);\n      w_in(k) = W(i,2*k+1);\n    }\n    Wr(i,0) = wind_num_op(w_out);\n    Wr(i,1) = wind_num_op(w_in);\n  }\n#ifdef MESH_BOOLEAN_TIMING\n  log_time(\"compute_output_winding_number\");\n#endif\n\n#ifdef SMALL_CELL_REMOVAL\n  igl::copyleft::cgal::relabel_small_immersed_cells(\n    V, F, num_patches, P, num_cells, per_patch_cells, 1e-3, Wr);\n#endif\n\n  // Extract boundary separating inside from outside.\n  auto index_to_signed_index = [&](size_t i, bool ori) -> int\n  {\n    return (i+1)*(ori?1:-1);\n  };\n  //auto signed_index_to_index = [&](int i) -> size_t {\n  //    return abs(i) - 1;\n  //};\n  std::vector<int> selected;\n  for(size_t i=0; i<num_faces; i++) \n  {\n    auto should_keep = keep(Wr(i,0), Wr(i,1));\n    if (should_keep > 0) \n    {\n      selected.push_back(index_to_signed_index(i, true));\n    } else if (should_keep < 0) \n    {\n      selected.push_back(index_to_signed_index(i, false));\n    }\n  }\n\n  const size_t num_selected = selected.size();\n  DerivedFC kept_faces(num_selected, 3);\n  DerivedJ  kept_face_indices(num_selected, 1);\n  for (size_t i=0; i<num_selected; i++) \n  {\n    size_t idx = abs(selected[i]) - 1;\n    if (selected[i] > 0) \n    {\n      kept_faces.row(i) = F.row(idx);\n    } else \n    {\n      kept_faces.row(i) = F.row(idx).reverse();\n    }\n    kept_face_indices(i, 0) = CJ[idx];\n  }\n#ifdef MESH_BOOLEAN_TIMING\n  log_time(\"extract_output\");\n#endif\n\n  // Finally, remove duplicated faces and unreferenced vertices.\n  {\n    DerivedFC G;\n    DerivedJ JJ;\n    igl::resolve_duplicated_faces(kept_faces, G, JJ);\n    igl::slice(kept_face_indices, JJ, 1, J);\n\n#ifdef DOUBLE_CHECK_EXACT_OUTPUT\n    {\n      // Sanity check on exact output.\n      igl::copyleft::cgal::RemeshSelfIntersectionsParam params;\n      params.detect_only = true;\n      params.first_only = true;\n      MatrixXES dummy_VV;\n      DerivedFC dummy_FF, dummy_IF;\n      Eigen::VectorXi dummy_J, dummy_IM;\n      igl::copyleft::cgal::SelfIntersectMesh<\n        Kernel,\n        MatrixXES, DerivedFC,\n        MatrixXES, DerivedFC,\n        DerivedFC,\n        Eigen::VectorXi,\n        Eigen::VectorXi\n      > checker(V, G, params,\n          dummy_VV, dummy_FF, dummy_IF, dummy_J, dummy_IM);\n      if (checker.count != 0) \n      {\n        throw \"Self-intersection not fully resolved.\";\n      }\n    }\n#endif\n\n    MatrixX3S Vs;\n    assign(V,Vs);\n    Eigen::VectorXi newIM;\n    igl::remove_unreferenced(Vs,G,VC,FC,newIM);\n  }\n#ifdef MESH_BOOLEAN_TIMING\n  log_time(\"clean_up\");\n#endif\n  return valid;\n}\n\ntemplate <\n  typename DerivedVA,\n  typename DerivedFA,\n  typename DerivedVB,\n  typename DerivedFB,\n  typename DerivedVC,\n  typename DerivedFC>\nIGL_INLINE bool igl::copyleft::cgal::mesh_boolean(\n  const Eigen::PlainObjectBase<DerivedVA > & VA,\n  const Eigen::PlainObjectBase<DerivedFA > & FA,\n  const Eigen::PlainObjectBase<DerivedVB > & VB,\n  const Eigen::PlainObjectBase<DerivedFB > & FB,\n  const MeshBooleanType & type,\n  Eigen::PlainObjectBase<DerivedVC > & VC,\n  Eigen::PlainObjectBase<DerivedFC > & FC) \n{\n  Eigen::Matrix<typename DerivedFC::Index, Eigen::Dynamic,1> J;\n  return igl::copyleft::cgal::mesh_boolean(VA,FA,VB,FB,type,VC,FC,J);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate bool igl::copyleft::cgal::mesh_boolean<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 8, 3, 0, 8, 3>, Eigen::Matrix<int, 12, 3, 0, 12, 3>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 8, 3, 0, 8, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, 12, 3, 0, 12, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, igl::MeshBooleanType const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate bool igl::copyleft::cgal::mesh_boolean<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 8, 3, 0, 8, 3>, Eigen::Matrix<int, 12, 3, 0, 12, 3>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 4, 0, -1, 4>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 4, 0, -1, 4>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 8, 3, 0, 8, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, 12, 3, 0, 12, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 4, 0, -1, 4> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, igl::MeshBooleanType const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 4, 0, -1, 4> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate bool igl::copyleft::cgal::mesh_boolean<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, igl::MeshBooleanType const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate bool igl::copyleft::cgal::mesh_boolean<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<long, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, igl::MeshBooleanType const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&);\ntemplate bool igl::copyleft::cgal::mesh_boolean<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, igl::MeshBooleanType const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate bool igl::copyleft::cgal::mesh_boolean<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate bool igl::copyleft::cgal::mesh_boolean<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(std::vector<Eigen::Matrix<double, -1, -1, 0, -1, -1>, std::allocator<Eigen::Matrix<double, -1, -1, 0, -1, -1> > > const&, std::vector<Eigen::Matrix<int, -1, -1, 0, -1, -1>, std::allocator<Eigen::Matrix<int, -1, -1, 0, -1, -1> > > const&, std::function<int (Eigen::Matrix<int, 1, -1, 1, 1, -1>)> const&, std::function<int (int, int)> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate bool igl::copyleft::cgal::mesh_boolean<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate bool igl::copyleft::cgal::mesh_boolean<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 8, 3, 0, 8, 3>, Eigen::Matrix<int, 12, 3, 0, 12, 3>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 8, 3, 0, 8, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, 12, 3, 0, 12, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, igl::MeshBooleanType const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate bool igl::copyleft::cgal::mesh_boolean<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate bool igl::copyleft::cgal::mesh_boolean<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, igl::MeshBooleanType const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/mesh_boolean.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n//                    Qingnan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n//\n#ifndef IGL_COPYLEFT_CGAL_MESH_BOOLEAN_H\n#define IGL_COPYLEFT_CGAL_MESH_BOOLEAN_H\n\n#include \"../../igl_inline.h\"\n#include \"../../MeshBooleanType.h\"\n#include <Eigen/Core>\n#include <functional>\n#include <vector>\n\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      //  MESH_BOOLEAN Compute boolean csg operations on \"solid\", consistently\n      //  oriented meshes.\n      //\n      //  Inputs:\n      //    VA  #VA by 3 list of vertex positions of first mesh\n      //    FA  #FA by 3 list of triangle indices into VA\n      //    VB  #VB by 3 list of vertex positions of second mesh\n      //    FB  #FB by 3 list of triangle indices into VB\n      //    type  type of boolean operation\n      //  Outputs:\n      //    VC  #VC by 3 list of vertex positions of boolean result mesh\n      //    FC  #FC by 3 list of triangle indices into VC\n      //    J  #FC list of indices into [FA;FA.rows()+FB] revealing \"birth\" facet\n      //  Returns true if inputs induce a piecewise constant winding number\n      //  field and type is valid\n      //\n      //  See also: mesh_boolean_cork, intersect_other,\n      //  remesh_self_intersections\n      template <\n        typename DerivedVA,\n        typename DerivedFA,\n        typename DerivedVB,\n        typename DerivedFB,\n        typename DerivedVC,\n        typename DerivedFC,\n        typename DerivedJ>\n      IGL_INLINE bool mesh_boolean(\n        const Eigen::PlainObjectBase<DerivedVA > & VA,\n        const Eigen::PlainObjectBase<DerivedFA > & FA,\n        const Eigen::PlainObjectBase<DerivedVB > & VB,\n        const Eigen::PlainObjectBase<DerivedFB > & FB,\n        const MeshBooleanType & type,\n        Eigen::PlainObjectBase<DerivedVC > & VC,\n        Eigen::PlainObjectBase<DerivedFC > & FC,\n        Eigen::PlainObjectBase<DerivedJ > & J);\n      template <\n        typename DerivedVA,\n        typename DerivedFA,\n        typename DerivedVB,\n        typename DerivedFB,\n        typename DerivedVC,\n        typename DerivedFC,\n        typename DerivedJ>\n      IGL_INLINE bool mesh_boolean(\n        const Eigen::PlainObjectBase<DerivedVA > & VA,\n        const Eigen::PlainObjectBase<DerivedFA > & FA,\n        const Eigen::PlainObjectBase<DerivedVB > & VB,\n        const Eigen::PlainObjectBase<DerivedFB > & FB,\n        const std::string & type_str,\n        Eigen::PlainObjectBase<DerivedVC > & VC,\n        Eigen::PlainObjectBase<DerivedFC > & FC,\n        Eigen::PlainObjectBase<DerivedJ > & J);\n      //\n      //  Inputs:\n      //    VA  #VA by 3 list of vertex positions of first mesh\n      //    FA  #FA by 3 list of triangle indices into VA\n      //    VB  #VB by 3 list of vertex positions of second mesh\n      //    FB  #FB by 3 list of triangle indices into VB\n      //    wind_num_op  function handle for filtering winding numbers from\n      //      tuples of integer values to [0,1] outside/inside values\n      //    keep  function handle for determining if a patch should be \"kept\"\n      //      in the output based on the winding number on either side\n      //  Outputs:\n      //    VC  #VC by 3 list of vertex positions of boolean result mesh\n      //    FC  #FC by 3 list of triangle indices into VC\n      //    J  #FC list of indices into [FA;FB] revealing \"birth\" facet\n      //  Returns true iff inputs induce a piecewise constant winding number\n      //    field\n      //\n      //  See also: mesh_boolean_cork, intersect_other,\n      //  remesh_self_intersections\n      template <\n        typename DerivedVA,\n        typename DerivedFA,\n        typename DerivedVB,\n        typename DerivedFB,\n        typename DerivedVC,\n        typename DerivedFC,\n        typename DerivedJ>\n      IGL_INLINE bool mesh_boolean(\n          const Eigen::PlainObjectBase<DerivedVA> & VA,\n          const Eigen::PlainObjectBase<DerivedFA> & FA,\n          const Eigen::PlainObjectBase<DerivedVB> & VB,\n          const Eigen::PlainObjectBase<DerivedFB> & FB,\n          const std::function<int(const Eigen::Matrix<int,1,Eigen::Dynamic>) >& wind_num_op,\n          const std::function<int(const int, const int)> & keep,\n          Eigen::PlainObjectBase<DerivedVC > & VC,\n          Eigen::PlainObjectBase<DerivedFC > & FC,\n          Eigen::PlainObjectBase<DerivedJ > & J);\n      //  MESH_BOOLEAN Variadic boolean operations\n      //\n      //  Inputs:\n      //    Vlist  k-long list of lists of mesh vertex positions\n      //    Flist  k-long list of lists of mesh face indices, so that Flist[i] indexes\n      //      vertices in Vlist[i]\n      //    wind_num_op  function handle for filtering winding numbers from\n      //      n-tuples of integer values to [0,1] outside/inside values\n      //    keep  function handle for determining if a patch should be \"kept\"\n      //      in the output based on the winding number on either side\n      //  Outputs:\n      //    VC  #VC by 3 list of vertex positions of boolean result mesh\n      //    FC  #FC by 3 list of triangle indices into VC\n      //    J  #FC list of indices into [Flist[0];Flist[1];...;Flist[k]]\n      //      revealing \"birth\" facet\n      //  Returns true iff inputs induce a piecewise constant winding number\n      //    field\n      //\n      //  See also: mesh_boolean_cork, intersect_other,\n      //  remesh_self_intersections\n      template <\n        typename DerivedV,\n        typename DerivedF,\n        typename DerivedVC,\n        typename DerivedFC,\n        typename DerivedJ>\n      IGL_INLINE bool mesh_boolean(\n          const std::vector<DerivedV > & Vlist,\n          const std::vector<DerivedF > & Flist,\n          const std::function<int(const Eigen::Matrix<int,1,Eigen::Dynamic>) >& wind_num_op,\n          const std::function<int(const int, const int)> & keep,\n          Eigen::PlainObjectBase<DerivedVC > & VC,\n          Eigen::PlainObjectBase<DerivedFC > & FC,\n          Eigen::PlainObjectBase<DerivedJ > & J);\n      // Given a merged mesh (V,F) and list of sizes of inputs\n      //\n      // Inputs:\n      //   V  #V by 3 list of merged mesh vertex positions\n      //   F  #F by 3 list of merged mesh face indices so that first sizes(0)\n      //     faces come from the first input, and the next sizes(1) faces come\n      //     from the second input, and so on.\n      //   sizes  #inputs list of sizes so that sizes(i) is the #faces in the\n      //     ith input\n      //    wind_num_op  function handle for filtering winding numbers from\n      //      tuples of integer values to [0,1] outside/inside values\n      //    keep  function handle for determining if a patch should be \"kept\"\n      //      in the output based on the winding number on either side\n      //  Outputs:\n      //    VC  #VC by 3 list of vertex positions of boolean result mesh\n      //    FC  #FC by 3 list of triangle indices into VC\n      //    J  #FC list of birth parent indices\n      // \n      template <\n        typename DerivedVV,\n        typename DerivedFF,\n        typename Derivedsizes,\n        typename DerivedVC,\n        typename DerivedFC,\n        typename DerivedJ>\n      IGL_INLINE bool mesh_boolean(\n          const Eigen::PlainObjectBase<DerivedVV > & VV,\n          const Eigen::PlainObjectBase<DerivedFF > & FF,\n          const Eigen::PlainObjectBase<Derivedsizes> & sizes,\n          const std::function<int(const Eigen::Matrix<int,1,Eigen::Dynamic>) >& wind_num_op,\n          const std::function<int(const int, const int)> & keep,\n          Eigen::PlainObjectBase<DerivedVC > & VC,\n          Eigen::PlainObjectBase<DerivedFC > & FC,\n          Eigen::PlainObjectBase<DerivedJ > & J);\n      //  Inputs:\n      //    VA  #VA by 3 list of vertex positions of first mesh\n      //    FA  #FA by 3 list of triangle indices into VA\n      //    VB  #VB by 3 list of vertex positions of second mesh\n      //    FB  #FB by 3 list of triangle indices into VB\n      //    type  type of boolean operation\n      //  Outputs:\n      //    VC  #VC by 3 list of vertex positions of boolean result mesh\n      //    FC  #FC by 3 list of triangle indices into VC\n      //  Returns true ff inputs induce a piecewise constant winding number\n      //    field and type is valid\n      template <\n        typename DerivedVA,\n        typename DerivedFA,\n        typename DerivedVB,\n        typename DerivedFB,\n        typename DerivedVC,\n        typename DerivedFC>\n      IGL_INLINE bool mesh_boolean(\n          const Eigen::PlainObjectBase<DerivedVA > & VA,\n          const Eigen::PlainObjectBase<DerivedFA > & FA,\n          const Eigen::PlainObjectBase<DerivedVB > & VB,\n          const Eigen::PlainObjectBase<DerivedFB > & FB,\n          const MeshBooleanType & type,\n          Eigen::PlainObjectBase<DerivedVC > & VC,\n          Eigen::PlainObjectBase<DerivedFC > & FC);\n    }\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"mesh_boolean.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/mesh_boolean_type_to_funcs.cpp",
    "content": "#include \"mesh_boolean_type_to_funcs.h\"\n#include \"BinaryWindingNumberOperations.h\"\n\nIGL_INLINE void igl::copyleft::cgal::mesh_boolean_type_to_funcs(\n  const MeshBooleanType & type,\n  std::function<int(const Eigen::Matrix<int,1,Eigen::Dynamic>) >& wind_num_op,\n  std::function<int(const int, const int)> & keep)\n{\n  switch (type) \n  {\n    case MESH_BOOLEAN_TYPE_UNION:\n      wind_num_op = BinaryUnion();\n      keep = KeepInside();\n      return;\n    case MESH_BOOLEAN_TYPE_INTERSECT:\n      wind_num_op = BinaryIntersect();\n      keep = KeepInside();\n      return;\n    case MESH_BOOLEAN_TYPE_MINUS:\n      wind_num_op = BinaryMinus();\n      keep = KeepInside();\n      return;\n    case MESH_BOOLEAN_TYPE_XOR:\n      wind_num_op = BinaryXor();\n      keep = KeepInside();\n      return;\n    case MESH_BOOLEAN_TYPE_RESOLVE:\n      wind_num_op = BinaryResolve();\n      keep = KeepAll();\n      return;\n    default:\n      assert(false && \"Unsupported boolean type.\");\n      return;\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/mesh_boolean_type_to_funcs.h",
    "content": "#ifndef IGL_COPYLEFT_CGAL_MESH_BOOLEAN_TYPE_TO_FUNCS_H\n#define IGL_COPYLEFT_CGAL_MESH_BOOLEAN_TYPE_TO_FUNCS_H\n\n#include \"../../igl_inline.h\"\n#include \"../../MeshBooleanType.h\"\n#include <Eigen/Core>\n#include <functional>\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // Convert a MeshBooleanType enum to a pair of winding number conversion\n      // function and \"keep\" function used by mesh_boolean\n      //\n      // Inputs:\n      //   type  MeshBooleanType enum value\n      // Outputs:\n      //    wind_num_op  function handle for filtering winding numbers from\n      //      tuples of integer values to [0,1] outside/inside values\n      //    keep  function handle for determining if a patch should be \"kept\"\n      //      in the output based on the winding number on either side\n      //\n      // See also: string_to_mesh_boolean_type\n      IGL_INLINE void mesh_boolean_type_to_funcs(\n        const MeshBooleanType & type,\n        std::function<int(const Eigen::Matrix<int,1,Eigen::Dynamic>) >& \n          wind_num_op,\n        std::function<int(const int, const int)> & keep);\n    }\n  }\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"mesh_boolean_type_to_funcs.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/mesh_to_cgal_triangle_list.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"mesh_to_cgal_triangle_list.h\"\n#include \"assign.h\"\n\n#include <cassert>\n\ntemplate <\n  typename DerivedV,\n  typename DerivedF,\n  typename Kernel>\nIGL_INLINE void igl::copyleft::cgal::mesh_to_cgal_triangle_list(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  std::vector<CGAL::Triangle_3<Kernel> > & T)\n{\n  typedef CGAL::Point_3<Kernel>    Point_3;\n  typedef CGAL::Triangle_3<Kernel> Triangle_3; \n  // Must be 3D\n  assert(V.cols() == 3);\n  // **Copy** to convert to output type (this is especially/only needed if the\n  // input type DerivedV::Scalar is CGAL::Epeck\n  Eigen::Matrix<\n    typename Kernel::FT,\n    DerivedV::RowsAtCompileTime,\n    DerivedV::ColsAtCompileTime> \n    KV(V.rows(),V.cols());\n  assign(V,KV);\n  // Must be triangles\n  assert(F.cols() == 3);\n  T.reserve(F.rows());\n  // Loop over faces\n  for(int f = 0;f<(int)F.rows();f++)\n  {\n    T.push_back(\n      Triangle_3(\n        Point_3( KV(F(f,0),0), KV(F(f,0),1), KV(F(f,0),2)),\n        Point_3( KV(F(f,1),0), KV(F(f,1),1), KV(F(f,1),2)),\n        Point_3( KV(F(f,2),0), KV(F(f,2),1), KV(F(f,2),2))));\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::copyleft::cgal::mesh_to_cgal_triangle_list<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, CGAL::Epick>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<CGAL::Triangle_3<CGAL::Epick>, std::allocator<CGAL::Triangle_3<CGAL::Epick> > >&);\n// generated by autoexplicit.sh\ntemplate void igl::copyleft::cgal::mesh_to_cgal_triangle_list<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, CGAL::Epeck>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<CGAL::Triangle_3<CGAL::Epeck>, std::allocator<CGAL::Triangle_3<CGAL::Epeck> > >&);\n// generated by autoexplicit.sh\ntemplate void igl::copyleft::cgal::mesh_to_cgal_triangle_list<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, CGAL::Epick>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<CGAL::Triangle_3<CGAL::Epick>, std::allocator<CGAL::Triangle_3<CGAL::Epick> > >&);\n// generated by autoexplicit.sh\ntemplate void igl::copyleft::cgal::mesh_to_cgal_triangle_list<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, CGAL::Epeck>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<CGAL::Triangle_3<CGAL::Epeck>, std::allocator<CGAL::Triangle_3<CGAL::Epeck> > >&);\ntemplate void igl::copyleft::cgal::mesh_to_cgal_triangle_list<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, CGAL::Epeck>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, std::vector<CGAL::Triangle_3<CGAL::Epeck>, std::allocator<CGAL::Triangle_3<CGAL::Epeck> > >&);\ntemplate void igl::copyleft::cgal::mesh_to_cgal_triangle_list<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, CGAL::Epick>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, std::vector<CGAL::Triangle_3<CGAL::Epick>, std::allocator<CGAL::Triangle_3<CGAL::Epick> > >&);\ntemplate void igl::copyleft::cgal::mesh_to_cgal_triangle_list<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, CGAL::Epeck>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<CGAL::Triangle_3<CGAL::Epeck>, std::allocator<CGAL::Triangle_3<CGAL::Epeck> > >&);\ntemplate void igl::copyleft::cgal::mesh_to_cgal_triangle_list<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, CGAL::Epick>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<CGAL::Triangle_3<CGAL::Epick>, std::allocator<CGAL::Triangle_3<CGAL::Epick> > >&);\ntemplate void igl::copyleft::cgal::mesh_to_cgal_triangle_list<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, CGAL::Epeck>(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, std::vector<CGAL::Triangle_3<CGAL::Epeck>, std::allocator<CGAL::Triangle_3<CGAL::Epeck> > >&);\ntemplate void igl::copyleft::cgal::mesh_to_cgal_triangle_list<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, CGAL::Epick>(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, std::vector<CGAL::Triangle_3<CGAL::Epick>, std::allocator<CGAL::Triangle_3<CGAL::Epick> > >&);\ntemplate void igl::copyleft::cgal::mesh_to_cgal_triangle_list<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, CGAL::Epick>(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<CGAL::Triangle_3<CGAL::Epick>, std::allocator<CGAL::Triangle_3<CGAL::Epick> > >&);\ntemplate void igl::copyleft::cgal::mesh_to_cgal_triangle_list<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, CGAL::Epeck>(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<CGAL::Triangle_3<CGAL::Epeck>, std::allocator<CGAL::Triangle_3<CGAL::Epeck> > >&);\ntemplate void igl::copyleft::cgal::mesh_to_cgal_triangle_list<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 8, 3, 0, 8, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, CGAL::Epick>(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 8, 3, 0, 8, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<CGAL::Triangle_3<CGAL::Epick>, std::allocator<CGAL::Triangle_3<CGAL::Epick> > >&);\ntemplate void igl::copyleft::cgal::mesh_to_cgal_triangle_list<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 8, 3, 0, 8, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, CGAL::Epeck>(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 8, 3, 0, 8, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<CGAL::Triangle_3<CGAL::Epeck>, std::allocator<CGAL::Triangle_3<CGAL::Epeck> > >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/mesh_to_cgal_triangle_list.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_CGAL_MESH_TO_CGAL_TRIANGLE_LIST_H\n#define IGL_COPYLEFT_CGAL_MESH_TO_CGAL_TRIANGLE_LIST_H\n#include \"../../igl_inline.h\"\n#include <Eigen/Core>\n#include \"CGAL_includes.hpp\"\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // Convert a mesh (V,F) to a list of CGAL triangles\n      //\n      // Templates:\n      //   Kernal  CGAL computation and construction kernel (e.g.\n      //     CGAL::Exact_predicates_exact_constructions_kernel)\n      // Inputs:\n      //   V  #V by 3 list of vertex positions\n      //   F  #F by 3 list of triangle indices\n      // Outputs:\n      //   T  #F list of CGAL triangles\n      template <\n        typename DerivedV,\n        typename DerivedF,\n        typename Kernel>\n      IGL_INLINE void mesh_to_cgal_triangle_list(\n        const Eigen::PlainObjectBase<DerivedV> & V,\n        const Eigen::PlainObjectBase<DerivedF> & F,\n        std::vector<CGAL::Triangle_3<Kernel> > & T);\n    }\n  }\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"mesh_to_cgal_triangle_list.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/mesh_to_polyhedron.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"mesh_to_polyhedron.h\"\n#include <CGAL/Polyhedron_3.h>\n#include <CGAL/Polyhedron_incremental_builder_3.h>\n\n\ntemplate <typename Polyhedron>\nIGL_INLINE bool igl::copyleft::cgal::mesh_to_polyhedron(\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  Polyhedron & poly)\n{\n  typedef typename Polyhedron::HalfedgeDS HalfedgeDS;\n  // Postcondition: hds is a valid polyhedral surface.\n  CGAL::Polyhedron_incremental_builder_3<HalfedgeDS> B(poly.hds());\n  B.begin_surface(V.rows(),F.rows());\n  typedef typename HalfedgeDS::Vertex   Vertex;\n  typedef typename Vertex::Point Point;\n  assert(V.cols() == 3 && \"V must be #V by 3\");\n  for(int v = 0;v<V.rows();v++)\n  {\n    B.add_vertex(Point(V(v,0),V(v,1),V(v,2)));\n  }\n  assert(F.cols() == 3 && \"F must be #F by 3\");\n  for(int f=0;f<F.rows();f++)\n  {\n    B.begin_facet();\n    for(int c = 0;c<3;c++)\n    {\n      B.add_vertex_to_facet(F(f,c));\n    }\n    B.end_facet();\n  }\n  if(B.error())\n  {\n    B.rollback();\n    return false;\n  }\n  B.end_surface();\n  return poly.is_valid();\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#include <CGAL/Simple_cartesian.h>\n#include <CGAL/Polyhedron_items_with_id_3.h>\ntemplate bool igl::copyleft::cgal::mesh_to_polyhedron<CGAL::Polyhedron_3<CGAL::Simple_cartesian<double>, CGAL::Polyhedron_items_with_id_3, CGAL::HalfedgeDS_default, std::allocator<int> > >(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, CGAL::Polyhedron_3<CGAL::Simple_cartesian<double>, CGAL::Polyhedron_items_with_id_3, CGAL::HalfedgeDS_default, std::allocator<int> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/mesh_to_polyhedron.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_CGAL_MESH_TO_POLYHEDRON_H\n#define IGL_COPYLEFT_CGAL_MESH_TO_POLYHEDRON_H\n#include \"../../igl_inline.h\"\n#include <Eigen/Core>\n\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // Convert a mesh (V,F) to a CGAL Polyhedron\n      //\n      // Templates:\n      //   Polyhedron  CGAL Polyhedron type (e.g. Polyhedron_3)\n      // Inputs:\n      //   V  #V by 3 list of vertex positions\n      //   F  #F by 3 list of triangle indices\n      // Outputs:\n      //   poly  cgal polyhedron\n      // Returns true only if (V,F) can be converted to a valid polyhedron (i.e. if\n      // (V,F) is vertex and edge manifold).\n      template <typename Polyhedron>\n      IGL_INLINE bool mesh_to_polyhedron(\n        const Eigen::MatrixXd & V,\n        const Eigen::MatrixXi & F,\n        Polyhedron & poly);\n    }\n  }\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"mesh_to_polyhedron.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/minkowski_sum.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"minkowski_sum.h\"\n#include \"mesh_boolean.h\"\n\n#include \"../../slice_mask.h\"\n#include \"../../LinSpaced.h\"\n#include \"../../unique.h\"\n#include \"../../get_seconds.h\"\n#include \"../../edges.h\"\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\n#include <cassert>\n#include <vector>\n\n\ntemplate <\n  typename DerivedVA,\n  typename DerivedFA,\n  typename DerivedVB,\n  typename DerivedFB,\n  typename DerivedW,\n  typename DerivedG,\n  typename DerivedJ>\nIGL_INLINE void igl::copyleft::cgal::minkowski_sum(\n  const Eigen::PlainObjectBase<DerivedVA> & VA,\n  const Eigen::PlainObjectBase<DerivedFA> & FA,\n  const Eigen::PlainObjectBase<DerivedVB> & VB,\n  const Eigen::PlainObjectBase<DerivedFB> & FB,\n  const bool resolve_overlaps,\n  Eigen::PlainObjectBase<DerivedW> & W,\n  Eigen::PlainObjectBase<DerivedG> & G,\n  Eigen::PlainObjectBase<DerivedJ> & J)\n{\n  using namespace std;\n  using namespace Eigen;\n  assert(FA.cols() == 3 && \"FA must contain a closed triangle mesh\");\n  assert(FB.cols() <= FA.cols() && \n    \"FB must contain lower diemnsional simplices than FA\");\n  const auto tictoc = []()->double\n  {\n    static double t_start;\n    double now = igl::get_seconds();\n    double interval = now-t_start;\n    t_start = now;\n    return interval;\n  };\n  tictoc();\n  Matrix<typename DerivedFB::Scalar,Dynamic,2> EB;\n  edges(FB,EB);\n  Matrix<typename DerivedFA::Scalar,Dynamic,2> EA(0,2);\n  if(FB.cols() == 3)\n  {\n    edges(FA,EA);\n  }\n  // number of copies of A along edges of B\n  const int n_ab = EB.rows();\n  // number of copies of B along edges of A\n  const int n_ba = EA.rows();\n\n  vector<DerivedW> vW(n_ab + n_ba);\n  vector<DerivedG> vG(n_ab + n_ba);\n  vector<DerivedJ> vJ(n_ab + n_ba);\n  vector<int> offsets(n_ab + n_ba + 1);\n  offsets[0] = 0;\n  // sweep A along edges of B\n  for(int e = 0;e<n_ab;e++)\n  {\n    Matrix<typename DerivedJ::Scalar,Dynamic,1> eJ;\n    minkowski_sum(\n      VA,\n      FA,\n      VB.row(EB(e,0)).eval(),\n      VB.row(EB(e,1)).eval(),\n      false,\n      vW[e],\n      vG[e],\n      eJ);\n    assert(vG[e].rows() == eJ.rows());\n    assert(eJ.cols() == 1);\n    vJ[e].resize(vG[e].rows(),2);\n    vJ[e].col(0) = eJ;\n    vJ[e].col(1).setConstant(e);\n    offsets[e+1] = offsets[e] + vW[e].rows();\n  }\n  // sweep B along edges of A\n  for(int e = 0;e<n_ba;e++)\n  {\n    Matrix<typename DerivedJ::Scalar,Dynamic,1> eJ;\n    const int ee = n_ab+e;\n    minkowski_sum(\n      VB,\n      FB,\n      VA.row(EA(e,0)).eval(),\n      VA.row(EA(e,1)).eval(),\n      false,\n      vW[ee],\n      vG[ee],\n      eJ);\n    vJ[ee].resize(vG[ee].rows(),2);\n    vJ[ee].col(0) = eJ.array() + (FA.rows()+1);\n    vJ[ee].col(1).setConstant(ee);\n  }\n  // Combine meshes\n  int n=0,m=0;\n  for_each(vW.begin(),vW.end(),[&n](const DerivedW & w){n+=w.rows();});\n  for_each(vG.begin(),vG.end(),[&m](const DerivedG & g){m+=g.rows();});\n  assert(n == offsets.back());\n\n  W.resize(n,3);\n  G.resize(m,3);\n  J.resize(m,2);\n  {\n    int m_off = 0,n_off = 0;\n    for(int i = 0;i<vG.size();i++)\n    {\n      W.block(n_off,0,vW[i].rows(),3) = vW[i];\n      G.block(m_off,0,vG[i].rows(),3) = vG[i].array()+offsets[i];\n      J.block(m_off,0,vJ[i].rows(),2) = vJ[i];\n      n_off += vW[i].rows();\n      m_off += vG[i].rows();\n    }\n    assert(n == n_off);\n    assert(m == m_off);\n  }\n  if(resolve_overlaps)\n  {\n    Eigen::Matrix<typename DerivedJ::Scalar, Eigen::Dynamic,1> SJ;\n    mesh_boolean(\n      DerivedW(W),\n      DerivedG(G),\n      Matrix<typename DerivedW::Scalar,Dynamic,Dynamic>(),\n      Matrix<typename DerivedG::Scalar,Dynamic,Dynamic>(),\n      MESH_BOOLEAN_TYPE_UNION,\n      W,\n      G,\n      SJ);\n    J = slice(DerivedJ(J),SJ,1);\n  }\n}\n\ntemplate <\n  typename DerivedVA,\n  typename DerivedFA,\n  typename sType, int sCols, int sOptions,\n  typename dType, int dCols, int dOptions,\n  typename DerivedW,\n  typename DerivedG,\n  typename DerivedJ>\nIGL_INLINE void igl::copyleft::cgal::minkowski_sum(\n  const Eigen::PlainObjectBase<DerivedVA> & VA,\n  const Eigen::PlainObjectBase<DerivedFA> & FA,\n  const Eigen::Matrix<sType,1,sCols,sOptions> & s,\n  const Eigen::Matrix<dType,1,dCols,dOptions> & d,\n  const bool resolve_overlaps, \n  Eigen::PlainObjectBase<DerivedW> & W,\n  Eigen::PlainObjectBase<DerivedG> & G,\n  Eigen::PlainObjectBase<DerivedJ> & J)\n{\n  using namespace Eigen;\n  using namespace std;\n  assert(s.cols() == 3 && \"s should be a 3d point\");\n  assert(d.cols() == 3 && \"d should be a 3d point\");\n  // silly base case\n  if(FA.size() == 0)\n  {\n    W.resize(0,3);\n    G.resize(0,3);\n    return;\n  }\n  const int dim = VA.cols();\n  assert(dim == 3 && \"dim must be 3D\");\n  assert(s.size() == 3 && \"s must be 3D point\");\n  assert(d.size() == 3 && \"d must be 3D point\");\n  // segment vector\n  const CGAL::Vector_3<CGAL::Epeck> v(d(0)-s(0),d(1)-s(1),d(2)-s(2));\n  // number of vertices\n  const int n = VA.rows();\n  // duplicate vertices at s and d, we'll remove unreferernced later\n  W.resize(2*n,dim);\n  for(int i = 0;i<n;i++)\n  {\n    for(int j = 0;j<dim;j++)\n    {\n      W  (i,j) = VA(i,j) + s(j);\n      W(i+n,j) = VA(i,j) + d(j);\n    }\n  }\n  // number of faces\n  const int m = FA.rows();\n  //// Mask whether positive dot product, or negative: because of exactly zero,\n  //// these are not necessarily complementary\n  // Nevermind, actually P = !N\n  Matrix<bool,Dynamic,1> P(m,1),N(m,1);\n  // loop over faces\n  int mp = 0,mn = 0;\n  for(int f = 0;f<m;f++)\n  {\n    const CGAL::Plane_3<CGAL::Epeck> plane(\n      CGAL::Point_3<CGAL::Epeck>(VA(FA(f,0),0),VA(FA(f,0),1),VA(FA(f,0),2)),\n      CGAL::Point_3<CGAL::Epeck>(VA(FA(f,1),0),VA(FA(f,1),1),VA(FA(f,1),2)),\n      CGAL::Point_3<CGAL::Epeck>(VA(FA(f,2),0),VA(FA(f,2),1),VA(FA(f,2),2)));\n    const auto normal = plane.orthogonal_vector();\n    const auto dt = normal * v;\n    if(dt > 0)\n    {\n      P(f) = true;\n      N(f) = false;\n      mp++;\n    }else\n    //}else if(dt < 0)\n    {\n      P(f) = false;\n      N(f) = true;\n      mn++;\n    //}else\n    //{\n    //  P(f) = false;\n    //  N(f) = false;\n    }\n  }\n\n  typedef Matrix<typename DerivedG::Scalar,Dynamic,Dynamic> MatrixXI;\n  typedef Matrix<typename DerivedG::Scalar,Dynamic,1> VectorXI;\n  MatrixXI GT(mp+mn,3);\n  GT<< slice_mask(FA,N,1), slice_mask((FA.array()+n).eval(),P,1);\n  // J indexes FA for parts at s and m+FA for parts at d\n  J = igl::LinSpaced<DerivedJ >(m,0,m-1);\n  DerivedJ JT(mp+mn);\n  JT << slice_mask(J,P,1), slice_mask(J,N,1);\n  JT.block(mp,0,mn,1).array()+=m;\n\n  // Original non-co-planar faces with positively oriented reversed\n  MatrixXI BA(mp+mn,3);\n  BA << slice_mask(FA,P,1).rowwise().reverse(), slice_mask(FA,N,1);\n  // Quads along **all** sides\n  MatrixXI GQ((mp+mn)*3,4);\n  GQ<< \n    BA.col(1), BA.col(0), BA.col(0).array()+n, BA.col(1).array()+n,\n    BA.col(2), BA.col(1), BA.col(1).array()+n, BA.col(2).array()+n,\n    BA.col(0), BA.col(2), BA.col(2).array()+n, BA.col(0).array()+n;\n\n  MatrixXI uGQ;\n  VectorXI S,sI,sJ;\n  //const auto & total_signed_distance = \n  [](\n      const MatrixXI & F,\n      VectorXI & S,\n      MatrixXI & uF,\n      VectorXI & I,\n      VectorXI & J)\n  {\n    const int m = F.rows();\n    const int d = F.cols();\n    MatrixXI sF = F;\n    const auto MN = sF.rowwise().minCoeff().eval();\n    // rotate until smallest index is first\n    for(int p = 0;p<d;p++)\n    {\n      for(int f = 0;f<m;f++)\n      {\n        if(sF(f,0) != MN(f))\n        {\n          for(int r = 0;r<d-1;r++)\n          {\n            std::swap(sF(f,r),sF(f,r+1));\n          }\n        }\n      }\n    }\n    // swap orienation\n    for(int f = 0;f<m;f++)\n    {\n      if(sF(f,d-1) < sF(f,1))\n      {\n        sF.block(f,1,1,d-1) = sF.block(f,1,1,d-1).reverse().eval();\n      }\n    }\n    Matrix<bool,Dynamic,1> M = Matrix<bool,Dynamic,1>::Zero(m,1);\n    {\n      VectorXI P = igl::LinSpaced<VectorXI >(d,0,d-1);\n      for(int p = 0;p<d;p++)\n      {\n        for(int f = 0;f<m;f++)\n        {\n          bool all = true;\n          for(int r = 0;r<d;r++)\n          {\n            all = all && (sF(f,P(r)) == F(f,r));\n          }\n          M(f) = M(f) || all;\n        }\n        for(int r = 0;r<d-1;r++)\n        {\n          std::swap(P(r),P(r+1));\n        }\n      }\n    }\n    unique_rows(sF,uF,I,J);\n    S = VectorXI::Zero(uF.rows(),1);\n    assert(m == J.rows());\n    for(int f = 0;f<m;f++)\n    {\n      S(J(f)) += M(f) ? 1 : -1;\n    }\n  }(MatrixXI(GQ),S,uGQ,sI,sJ);\n  assert(S.rows() == uGQ.rows());\n  const int nq = (S.array().abs()==2).count();\n  GQ.resize(nq,4);\n  {\n    int k = 0;\n    for(int q = 0;q<uGQ.rows();q++)\n    {\n      switch(S(q))\n      {\n        case -2:\n          GQ.row(k++) = uGQ.row(q).reverse().eval();\n          break;\n        case 2:\n          GQ.row(k++) = uGQ.row(q);\n          break;\n        default:\n        // do not add\n          break;\n      }\n    }\n    assert(nq == k);\n  }\n\n  G.resize(GT.rows()+2*GQ.rows(),3);\n  G<< \n    GT,\n    GQ.col(0), GQ.col(1), GQ.col(2), \n    GQ.col(0), GQ.col(2), GQ.col(3);\n  J.resize(JT.rows()+2*GQ.rows(),1);\n  J<<JT,DerivedJ::Constant(2*GQ.rows(),1,2*m+1);\n  if(resolve_overlaps)\n  {\n    Eigen::Matrix<typename DerivedJ::Scalar, Eigen::Dynamic,1> SJ;\n    mesh_boolean(\n      DerivedW(W),DerivedG(G),\n      Matrix<typename DerivedVA::Scalar,Dynamic,Dynamic>(),MatrixXI(),\n      MESH_BOOLEAN_TYPE_UNION,\n      W,G,SJ);\n    J = slice(DerivedJ(J),SJ,1);\n  }\n}\n\ntemplate <\n  typename DerivedVA,\n  typename DerivedFA,\n  typename sType, int sCols, int sOptions,\n  typename dType, int dCols, int dOptions,\n  typename DerivedW,\n  typename DerivedG,\n  typename DerivedJ>\nIGL_INLINE void igl::copyleft::cgal::minkowski_sum(\n  const Eigen::PlainObjectBase<DerivedVA> & VA,\n  const Eigen::PlainObjectBase<DerivedFA> & FA,\n  const Eigen::Matrix<sType,1,sCols,sOptions> & s,\n  const Eigen::Matrix<dType,1,dCols,dOptions> & d,\n  Eigen::PlainObjectBase<DerivedW> & W,\n  Eigen::PlainObjectBase<DerivedG> & G,\n  Eigen::PlainObjectBase<DerivedJ> & J)\n{\n  return minkowski_sum(VA,FA,s,d,true,W,G,J);\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/minkowski_sum.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_CGAL_MINKOWSKI_SUM_H\n#define IGL_COPYLEFT_CGAL_MINKOWSKI_SUM_H\n\n#include \"../../igl_inline.h\"\n#include <Eigen/Core>\n\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // Compute the Minkowski sum of a closed triangle mesh (V,F) and a\n      // set of simplices in 3D.\n      //\n      // Inputs:\n      //   VA  #VA by 3 list of mesh vertices in 3D\n      //   FA  #FA by 3 list of triangle indices into VA\n      //   VB  #VB by 3 list of mesh vertices in 3D\n      //   FB  #FB by ss list of simplex indices into VB, ss<=3\n      //   resolve_overlaps  whether or not to resolve self-union. If false\n      //     then result may contain self-intersections if input mesh is\n      //     non-convex.\n      // Outputs:\n      //   W  #W by 3 list of mesh vertices in 3D\n      //   G  #G by 3 list of triangle indices into W\n      //   J  #G by 2 list of indices into \n      //   \n      template <\n        typename DerivedVA,\n        typename DerivedFA,\n        typename DerivedVB,\n        typename DerivedFB,\n        typename DerivedW,\n        typename DerivedG,\n        typename DerivedJ>\n      IGL_INLINE void minkowski_sum(\n        const Eigen::PlainObjectBase<DerivedVA> & VA,\n        const Eigen::PlainObjectBase<DerivedFA> & FA,\n        const Eigen::PlainObjectBase<DerivedVB> & VB,\n        const Eigen::PlainObjectBase<DerivedFB> & FB,\n        const bool resolve_overlaps,\n        Eigen::PlainObjectBase<DerivedW> & W,\n        Eigen::PlainObjectBase<DerivedG> & G,\n        Eigen::PlainObjectBase<DerivedJ> & J);\n      // Compute the Minkowski sum of a closed triangle mesh (V,F) and a\n      // segment [s,d] in 3D.\n      //\n      // Inputs:\n      //   VA  #VA by 3 list of mesh vertices in 3D\n      //   FA  #FA by 3 list of triangle indices into VA\n      //   s  segment source endpoint in 3D\n      //   d  segment source endpoint in 3D\n      //   resolve_overlaps  whether or not to resolve self-union. If false\n      //     then result may contain self-intersections if input mesh is\n      //     non-convex.\n      // Outputs:\n      //   W  #W by 3 list of mesh vertices in 3D\n      //   G  #G by 3 list of triangle indices into W\n      //   J  #G list of indices into [F;#V+F;[s d]] of birth parents\n      //\n      template <\n        typename DerivedVA,\n        typename DerivedFA,\n        typename sType, int sCols, int sOptions,\n        typename dType, int dCols, int dOptions,\n        typename DerivedW,\n        typename DerivedG,\n        typename DerivedJ>\n      IGL_INLINE void minkowski_sum(\n        const Eigen::PlainObjectBase<DerivedVA> & VA,\n        const Eigen::PlainObjectBase<DerivedFA> & FA,\n        const Eigen::Matrix<sType,1,sCols,sOptions> & s,\n        const Eigen::Matrix<dType,1,dCols,dOptions> & d,\n        const bool resolve_overlaps,\n        Eigen::PlainObjectBase<DerivedW> & W,\n        Eigen::PlainObjectBase<DerivedG> & G,\n        Eigen::PlainObjectBase<DerivedJ> & J);\n      template <\n        typename DerivedVA,\n        typename DerivedFA,\n        typename sType, int sCols, int sOptions,\n        typename dType, int dCols, int dOptions,\n        typename DerivedW,\n        typename DerivedG,\n        typename DerivedJ>\n      IGL_INLINE void minkowski_sum(\n        const Eigen::PlainObjectBase<DerivedVA> & VA,\n        const Eigen::PlainObjectBase<DerivedFA> & FA,\n        const Eigen::Matrix<sType,1,sCols,sOptions> & s,\n        const Eigen::Matrix<dType,1,dCols,dOptions> & d,\n        Eigen::PlainObjectBase<DerivedW> & W,\n        Eigen::PlainObjectBase<DerivedG> & G,\n        Eigen::PlainObjectBase<DerivedJ> & J);\n    }\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"minkowski_sum.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/order_facets_around_edge.cpp",
    "content": "#include \"order_facets_around_edge.h\"\n#include <Eigen/Geometry>\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\n\n#include <stdexcept>\n\n// adj_faces contains signed index starting from +- 1.\ntemplate<\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedI >\nvoid igl::copyleft::cgal::order_facets_around_edge(\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    size_t s,\n    size_t d, \n    const std::vector<int>& adj_faces,\n    Eigen::PlainObjectBase<DerivedI>& order, bool debug)\n{\n  // Although we only need exact predicates in the algorithm,\n  // exact constructions are needed to avoid degeneracies due to\n  // casting to double.\n  typedef CGAL::Exact_predicates_exact_constructions_kernel K;\n  typedef K::Point_3 Point_3;\n  typedef K::Plane_3 Plane_3;\n\n  auto get_face_index = [&](int adj_f)->size_t\n  {\n    return abs(adj_f) - 1;\n  };\n\n  auto get_opposite_vertex = [&](size_t fid)->size_t\n  {\n    typedef typename DerivedF::Scalar Index;\n    if (F(fid, 0) != (Index)s && F(fid, 0) != (Index)d) return F(fid, 0);\n    if (F(fid, 1) != (Index)s && F(fid, 1) != (Index)d) return F(fid, 1);\n    if (F(fid, 2) != (Index)s && F(fid, 2) != (Index)d) return F(fid, 2);\n    assert(false);\n    return -1;\n  };\n\n  // Handle base cases\n  if (adj_faces.size() == 0) \n  {\n    order.resize(0, 1);\n    return;\n  } else if (adj_faces.size() == 1)\n  {\n    order.resize(1, 1);\n    order(0, 0) = 0;\n    return;\n  } else if (adj_faces.size() == 2)\n  {\n    const size_t o1 = get_opposite_vertex(get_face_index(adj_faces[0]));\n    const size_t o2 = get_opposite_vertex(get_face_index(adj_faces[1]));\n    const Point_3 ps(V(s, 0), V(s, 1), V(s, 2));\n    const Point_3 pd(V(d, 0), V(d, 1), V(d, 2));\n    const Point_3 p1(V(o1, 0), V(o1, 1), V(o1, 2));\n    const Point_3 p2(V(o2, 0), V(o2, 1), V(o2, 2));\n    order.resize(2, 1);\n    switch (CGAL::orientation(ps, pd, p1, p2))\n    {\n      case CGAL::POSITIVE:\n        order(0, 0) = 1;\n        order(1, 0) = 0;\n        break;\n      case CGAL::NEGATIVE:\n        order(0, 0) = 0;\n        order(1, 0) = 1;\n        break;\n      case CGAL::COPLANAR:\n        {\n          switch (CGAL::coplanar_orientation(ps, pd, p1, p2)) {\n            case CGAL::POSITIVE:\n              // Duplicated face, use index to break tie.\n              order(0, 0) = adj_faces[0] < adj_faces[1] ? 0:1;\n              order(1, 0) = adj_faces[0] < adj_faces[1] ? 1:0;\n              break;\n            case CGAL::NEGATIVE:\n              // Coplanar faces, one on each side of the edge.\n              // It is equally valid to order them (0, 1) or (1, 0).\n              // I cannot think of any reason to prefer one to the\n              // other.  So just use (0, 1) ordering by default.\n              order(0, 0) = 0;\n              order(1, 0) = 1;\n              break;\n            case CGAL::COLLINEAR:\n              std::cerr << \"Degenerated triangle detected.\" <<\n                std::endl;\n              assert(false);\n              break;\n            default:\n              assert(false);\n          }\n        }\n        break;\n      default:\n        assert(false);\n    }\n    return;\n  }\n\n  const size_t num_adj_faces = adj_faces.size();\n  const size_t o = get_opposite_vertex( get_face_index(adj_faces[0]));\n  const Point_3 p_s(V(s, 0), V(s, 1), V(s, 2));\n  const Point_3 p_d(V(d, 0), V(d, 1), V(d, 2));\n  const Point_3 p_o(V(o, 0), V(o, 1), V(o, 2));\n  const Plane_3 separator(p_s, p_d, p_o);\n  if (separator.is_degenerate()) {\n    throw std::runtime_error(\n        \"Cannot order facets around edge due to degenerated facets\");\n  }\n\n  std::vector<Point_3> opposite_vertices;\n  for (size_t i=0; i<num_adj_faces; i++)\n  {\n    const size_t o = get_opposite_vertex( get_face_index(adj_faces[i]));\n    opposite_vertices.emplace_back(\n        V(o, 0), V(o, 1), V(o, 2));\n  }\n\n  std::vector<int> positive_side;\n  std::vector<int> negative_side;\n  std::vector<int> tie_positive_oriented;\n  std::vector<int> tie_negative_oriented;\n\n  std::vector<size_t> positive_side_index;\n  std::vector<size_t> negative_side_index;\n  std::vector<size_t> tie_positive_oriented_index;\n  std::vector<size_t> tie_negative_oriented_index;\n\n  for (size_t i=0; i<num_adj_faces; i++)\n  {\n    const int f = adj_faces[i];\n    const Point_3& p_a = opposite_vertices[i];\n    auto orientation = separator.oriented_side(p_a);\n    switch (orientation) {\n      case CGAL::ON_POSITIVE_SIDE:\n        positive_side.push_back(f);\n        positive_side_index.push_back(i);\n        break;\n      case CGAL::ON_NEGATIVE_SIDE:\n        negative_side.push_back(f);\n        negative_side_index.push_back(i);\n        break;\n      case CGAL::ON_ORIENTED_BOUNDARY:\n        {\n          auto inplane_orientation = CGAL::coplanar_orientation(\n              p_s, p_d, p_o, p_a);\n          switch (inplane_orientation) {\n            case CGAL::POSITIVE:\n              tie_positive_oriented.push_back(f);\n              tie_positive_oriented_index.push_back(i);\n              break;\n            case CGAL::NEGATIVE:\n              tie_negative_oriented.push_back(f);\n              tie_negative_oriented_index.push_back(i);\n              break;\n            case CGAL::COLLINEAR:\n            default:\n              throw std::runtime_error(\n                  \"Degenerated facet detected.\");\n              break;\n          }\n        }\n        break;\n      default:\n        // Should not be here.\n        throw std::runtime_error(\"Unknown CGAL state detected.\");\n    }\n  }\n  if (debug) {\n    std::cout << \"tie positive: \" << std::endl;\n    for (auto& f : tie_positive_oriented) {\n      std::cout << get_face_index(f) << \" \";\n    }\n    std::cout << std::endl;\n    std::cout << \"positive side: \" << std::endl;\n    for (auto& f : positive_side) {\n      std::cout << get_face_index(f) << \" \";\n    }\n    std::cout << std::endl;\n    std::cout << \"tie negative: \" << std::endl;\n    for (auto& f : tie_negative_oriented) {\n      std::cout << get_face_index(f) << \" \";\n    }\n    std::cout << std::endl;\n    std::cout << \"negative side: \" << std::endl;\n    for (auto& f : negative_side) {\n      std::cout << get_face_index(f) << \" \";\n    }\n    std::cout << std::endl;\n  }\n\n  auto index_sort = [](std::vector<int>& data) -> std::vector<size_t>{\n    const size_t len = data.size();\n    std::vector<size_t> order(len);\n    for (size_t i=0; i<len; i++) { order[i] = i; }\n    auto comp = [&](size_t i, size_t j) { return data[i] < data[j]; };\n    std::sort(order.begin(), order.end(), comp);\n    return order;\n  };\n\n  DerivedI positive_order, negative_order;\n  order_facets_around_edge(V, F, s, d, positive_side, positive_order, debug);\n  order_facets_around_edge(V, F, s, d, negative_side, negative_order, debug);\n  std::vector<size_t> tie_positive_order = index_sort(tie_positive_oriented);\n  std::vector<size_t> tie_negative_order = index_sort(tie_negative_oriented);\n\n  // Copy results into order vector.\n  const size_t tie_positive_size = tie_positive_oriented.size();\n  const size_t tie_negative_size = tie_negative_oriented.size();\n  const size_t positive_size = positive_order.size();\n  const size_t negative_size = negative_order.size();\n\n  order.resize(\n      tie_positive_size + positive_size + tie_negative_size + negative_size,1);\n\n  size_t count=0;\n  for (size_t i=0; i<tie_positive_size; i++)\n  {\n    order(count+i, 0) = tie_positive_oriented_index[tie_positive_order[i]];\n  }\n  count += tie_positive_size;\n\n  for (size_t i=0; i<negative_size; i++) \n  {\n    order(count+i, 0) = negative_side_index[negative_order(i, 0)];\n  }\n  count += negative_size;\n\n  for (size_t i=0; i<tie_negative_size; i++)\n  {\n    order(count+i, 0) = tie_negative_oriented_index[tie_negative_order[i]];\n  }\n  count += tie_negative_size;\n\n  for (size_t i=0; i<positive_size; i++)\n  {\n    order(count+i, 0) = positive_side_index[positive_order(i, 0)];\n  }\n  count += positive_size;\n  assert(count == num_adj_faces);\n\n  // Find the correct start point.\n  size_t start_idx = 0;\n  for (size_t i=0; i<num_adj_faces; i++)\n  {\n    const Point_3& p_a = opposite_vertices[order(i, 0)];\n    const Point_3& p_b =\n      opposite_vertices[order((i+1)%num_adj_faces, 0)];\n    auto orientation = CGAL::orientation(p_s, p_d, p_a, p_b);\n    if (orientation == CGAL::POSITIVE)\n    {\n      // Angle between triangle (p_s, p_d, p_a) and (p_s, p_d, p_b) is\n      // more than 180 degrees.\n      start_idx = (i+1)%num_adj_faces;\n      break;\n    } else if (orientation == CGAL::COPLANAR &&\n        Plane_3(p_s, p_d, p_a).orthogonal_direction() !=\n        Plane_3(p_s, p_d, p_b).orthogonal_direction())\n    {\n      // All 4 points are coplanar, but p_a and p_b are on each side of\n      // the edge (p_s, p_d).  This means the angle between triangle\n      // (p_s, p_d, p_a) and (p_s, p_d, p_b) is exactly 180 degrees.\n      start_idx = (i+1)%num_adj_faces;\n      break;\n    }\n  }\n  DerivedI circular_order = order;\n  for (size_t i=0; i<num_adj_faces; i++)\n  {\n    order(i, 0) = circular_order((start_idx + i)%num_adj_faces, 0);\n  }\n}\n\ntemplate<\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedI>\nIGL_INLINE\nvoid igl::copyleft::cgal::order_facets_around_edge(\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  size_t s,\n  size_t d, \n  const std::vector<int>& adj_faces,\n  const Eigen::PlainObjectBase<DerivedV>& pivot_point,\n  Eigen::PlainObjectBase<DerivedI>& order)\n{\n  assert(V.cols() == 3);\n  assert(F.cols() == 3);\n  assert(pivot_point.cols() == 3);\n  auto signed_index_to_index = [&](int signed_idx)\n  {\n      return abs(signed_idx) -1;\n  };\n  auto get_opposite_vertex_index = [&](size_t fid) -> typename DerivedF::Scalar\n  {\n      typedef typename DerivedF::Scalar Index;\n      if (F(fid, 0) != (Index)s && F(fid, 0) != (Index)d) return F(fid, 0);\n      if (F(fid, 1) != (Index)s && F(fid, 1) != (Index)d) return F(fid, 1);\n      if (F(fid, 2) != (Index)s && F(fid, 2) != (Index)d) return F(fid, 2);\n      assert(false);\n      // avoid warning\n      return -1;\n  };\n\n  {\n    // Check if s, d and pivot are collinear.\n    typedef CGAL::Exact_predicates_exact_constructions_kernel K;\n    K::Point_3 ps(V(s,0), V(s,1), V(s,2));\n    K::Point_3 pd(V(d,0), V(d,1), V(d,2));\n    K::Point_3 pp(pivot_point(0,0), pivot_point(0,1), pivot_point(0,2));\n    if (CGAL::collinear(ps, pd, pp)) {\n        throw std::runtime_error(\n                \"Pivot point is collinear with the outer edge!\");\n    }\n  }\n\n  const size_t N = adj_faces.size();\n  const size_t num_faces = N + 1; // N adj faces + 1 pivot face\n\n  // Because face indices are used for tie breaking, the original face indices\n  // in the new faces array must be ascending.\n  auto comp = [&](int i, int j) \n  {\n    return signed_index_to_index(adj_faces[i]) <\n      signed_index_to_index(adj_faces[j]);\n  };\n  std::vector<size_t> adj_order(N);\n  for (size_t i=0; i<N; i++) adj_order[i] = i;\n  std::sort(adj_order.begin(), adj_order.end(), comp);\n\n  DerivedV vertices(num_faces + 2, 3);\n  for (size_t i=0; i<N; i++) \n  {\n    const size_t fid = signed_index_to_index(adj_faces[adj_order[i]]);\n    vertices.row(i) = V.row(get_opposite_vertex_index(fid));\n  }\n  vertices.row(N  ) = pivot_point;\n  vertices.row(N+1) = V.row(s);\n  vertices.row(N+2) = V.row(d);\n\n  DerivedF faces(num_faces, 3);\n  for (size_t i=0; i<N; i++)\n  {\n    if (adj_faces[adj_order[i]] < 0) \n    {\n      faces(i,0) = N+1; // s\n      faces(i,1) = N+2; // d\n      faces(i,2) = i  ;\n    } else \n    {\n      faces(i,0) = N+2; // d\n      faces(i,1) = N+1; // s\n      faces(i,2) = i  ;\n    }\n  }\n  // Last face is the pivot face.\n  faces(N, 0) = N+1;\n  faces(N, 1) = N+2;\n  faces(N, 2) = N;\n\n  std::vector<int> adj_faces_with_pivot(num_faces);\n  for (size_t i=0; i<num_faces; i++)\n  {\n    if ((size_t)faces(i,0) == N+1 && (size_t)faces(i,1) == N+2)\n    {\n        adj_faces_with_pivot[i] = int(i+1) * -1;\n    } else\n    {\n        adj_faces_with_pivot[i] = int(i+1);\n    }\n  }\n\n  DerivedI order_with_pivot;\n  order_facets_around_edge(\n    vertices, faces, N+1, N+2, adj_faces_with_pivot, order_with_pivot);\n\n  assert((size_t)order_with_pivot.size() == num_faces);\n  order.resize(N);\n  size_t pivot_index = num_faces + 1;\n  for (size_t i=0; i<num_faces; i++)\n  {\n    if ((size_t)order_with_pivot[i] == N)\n    {\n      pivot_index = i;\n      break;\n    }\n  }\n  assert(pivot_index < num_faces);\n\n  for (size_t i=0; i<N; i++)\n  {\n    order[i] = adj_order[order_with_pivot[(pivot_index+i+1)%num_faces]];\n  }\n}\n\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::copyleft::cgal::order_facets_around_edge<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, unsigned long, unsigned long, std::vector<int, std::allocator<int> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, bool);\ntemplate void igl::copyleft::cgal::order_facets_around_edge<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, unsigned long, unsigned long, std::vector<int, std::allocator<int> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, bool);\ntemplate void igl::copyleft::cgal::order_facets_around_edge<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, unsigned long, unsigned long, std::vector<int, std::allocator<int> > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::order_facets_around_edge<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, unsigned long, unsigned long, std::vector<int, std::allocator<int> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::order_facets_around_edge<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, unsigned long, unsigned long, std::vector<int, std::allocator<int> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::order_facets_around_edge<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, unsigned long, unsigned long, std::vector<int, std::allocator<int> > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/order_facets_around_edge.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Qingnan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n//\n#ifndef IGL_COPYLEFT_CGAL_ORDER_FACETS_AROUND_EDGE_H\n#define IGL_COPYLEFT_CGAL_ORDER_FACETS_AROUND_EDGE_H\n#include \"../../igl_inline.h\"\n#include <Eigen/Core>\n#include <vector>\n\nnamespace igl \n{\n  namespace copyleft\n  {\n    namespace cgal \n    {\n      // Given a directed edge, sort its adjacent faces.  Assuming the\n      // directed edge is (s, d).  Sort the adjacent faces clockwise around the\n      // axis (d - s), i.e. left-hand rule.  An adjacent face is consistently\n      // oriented if it contains (d, s) as a directed edge.\n      //\n      // For overlapping faces, break the tie using signed face index, smaller\n      // signed index comes before the larger signed index.  Signed index is\n      // computed as (consistent? 1:-1) * (face_index + 1).\n      //\n      // Inputs:\n      //   V  #V by 3 list of vertices.\n      //   F  #F by 3 list of faces\n      //   s  Index of source vertex.\n      //   d  Index of desination vertex.\n      //   adj_faces  List of adjacent face signed indices.\n      // Output:\n      //   order  List of face indices that orders adjacent faces around edge\n      //     (s, d) clockwise.\n      template<\n        typename DerivedV,\n        typename DerivedF,\n        typename DerivedI >\n      IGL_INLINE\n      void order_facets_around_edge(\n          const Eigen::PlainObjectBase<DerivedV>& V,\n          const Eigen::PlainObjectBase<DerivedF>& F,\n          size_t s, \n          size_t d, \n          const std::vector<int>& adj_faces,\n          Eigen::PlainObjectBase<DerivedI>& order,\n          bool debug=false);\n\n      // This funciton is a wrapper around the one above.  Since the ordering\n      // is circular, the pivot point is used to define a starting point.  So\n      // order[0] is the index into adj_face that is immediately after the\n      // pivot face (s, d, pivot point) in clockwise order.\n      template<\n        typename DerivedV,\n        typename DerivedF,\n        typename DerivedI>\n      IGL_INLINE\n      void order_facets_around_edge(\n        const Eigen::PlainObjectBase<DerivedV>& V,\n        const Eigen::PlainObjectBase<DerivedF>& F,\n        size_t s, \n        size_t d, \n        const std::vector<int>& adj_faces,\n        const Eigen::PlainObjectBase<DerivedV>& pivot_point,\n        Eigen::PlainObjectBase<DerivedI>& order);\n    }\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#include \"order_facets_around_edge.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/order_facets_around_edges.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"order_facets_around_edges.h\"\n#include \"order_facets_around_edge.h\"\n#include \"../../sort_angles.h\"\n#include <Eigen/Geometry>\n#include <type_traits>\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\n\ntemplate<\n    typename DerivedV,\n    typename DerivedF,\n    typename DerivedN,\n    typename DeriveduE,\n    typename uE2EType,\n    typename uE2oEType,\n    typename uE2CType >\nIGL_INLINE\ntypename std::enable_if<!std::is_same<typename DerivedV::Scalar,\ntypename CGAL::Exact_predicates_exact_constructions_kernel::FT>::value, void>::type\nigl::copyleft::cgal::order_facets_around_edges(\n        const Eigen::PlainObjectBase<DerivedV>& V,\n        const Eigen::PlainObjectBase<DerivedF>& F,\n        const Eigen::PlainObjectBase<DerivedN>& N,\n        const Eigen::PlainObjectBase<DeriveduE>& uE,\n        const std::vector<std::vector<uE2EType> >& uE2E,\n        std::vector<std::vector<uE2oEType> >& uE2oE,\n        std::vector<std::vector<uE2CType > >& uE2C ) {\n\n    typedef Eigen::Matrix<typename DerivedN::Scalar, 3, 1> Vector3F;\n    const typename DerivedV::Scalar EPS = 1e-12;\n    const size_t num_faces = F.rows();\n    const size_t num_undirected_edges = uE.rows();\n\n    auto edge_index_to_face_index = [&](size_t ei) { return ei % num_faces; };\n    auto edge_index_to_corner_index = [&](size_t ei) { return ei / num_faces; };\n\n    uE2oE.resize(num_undirected_edges);\n    uE2C.resize(num_undirected_edges);\n\n    for(size_t ui = 0;ui<num_undirected_edges;ui++)\n    {\n        const auto& adj_edges = uE2E[ui];\n        const size_t edge_valance = adj_edges.size();\n        assert(edge_valance > 0);\n\n        const auto ref_edge = adj_edges[0];\n        const auto ref_face = edge_index_to_face_index(ref_edge);\n        Vector3F ref_normal = N.row(ref_face);\n\n        const auto ref_corner_o = edge_index_to_corner_index(ref_edge);\n        const auto ref_corner_s = (ref_corner_o+1)%3;\n        const auto ref_corner_d = (ref_corner_o+2)%3;\n\n        const typename DerivedF::Scalar o = F(ref_face, ref_corner_o);\n        const typename DerivedF::Scalar s = F(ref_face, ref_corner_s);\n        const typename DerivedF::Scalar d = F(ref_face, ref_corner_d);\n\n        Vector3F edge = V.row(d) - V.row(s);\n        auto edge_len = edge.norm();\n        bool degenerated = edge_len < EPS;\n        if (degenerated) {\n            if (edge_valance <= 2) {\n                // There is only one way to order 2 or less faces.\n                edge.setZero();\n            } else {\n                edge.setZero();\n                Eigen::Matrix<typename DerivedN::Scalar, Eigen::Dynamic, 3>\n                    normals(edge_valance, 3);\n                for (size_t fei=0; fei<edge_valance; fei++) {\n                    const auto fe = adj_edges[fei];\n                    const auto f = edge_index_to_face_index(fe);\n                    normals.row(fei) = N.row(f);\n                }\n                for (size_t i=0; i<edge_valance; i++) {\n                    size_t j = (i+1) % edge_valance;\n                    Vector3F ni = normals.row(i);\n                    Vector3F nj = normals.row(j);\n                    edge = ni.cross(nj);\n                    edge_len = edge.norm();\n                    if (edge_len >= EPS) {\n                        edge.normalize();\n                        break;\n                    }\n                }\n\n                // Ensure edge direction are consistent with reference face.\n                Vector3F in_face_vec = V.row(o) - V.row(s);\n                if (edge.cross(in_face_vec).dot(ref_normal) < 0) {\n                    edge *= -1;\n                }\n\n                if (edge.norm() < EPS) {\n                    std::cerr << \"=====================================\" << std::endl;\n                    std::cerr << \"  ui: \" << ui << std::endl;\n                    std::cerr << \"edge: \" << ref_edge << std::endl;\n                    std::cerr << \"face: \" << ref_face << std::endl;\n                    std::cerr << \"  vs: \" << V.row(s) << std::endl;\n                    std::cerr << \"  vd: \" << V.row(d) << std::endl;\n                    std::cerr << \"adj face normals: \" << std::endl;\n                    std::cerr << normals << std::endl;\n                    std::cerr << \"Very degenerated case detected:\" << std::endl;\n                    std::cerr << \"Near zero edge surrounded by \"\n                        << edge_valance << \" neearly colinear faces\" <<\n                        std::endl;\n                    std::cerr << \"=====================================\" << std::endl;\n                }\n            }\n        } else {\n            edge.normalize();\n        }\n\n        Eigen::MatrixXd angle_data(edge_valance, 3);\n        std::vector<bool> cons(edge_valance);\n\n        for (size_t fei=0; fei<edge_valance; fei++) {\n            const auto fe = adj_edges[fei];\n            const auto f = edge_index_to_face_index(fe);\n            const auto c = edge_index_to_corner_index(fe);\n            cons[fei] = (d == F(f, (c+1)%3));\n            assert( cons[fei] ||  (d == F(f,(c+2)%3)));\n            assert(!cons[fei] || (s == F(f,(c+2)%3)));\n            assert(!cons[fei] || (d == F(f,(c+1)%3)));\n            Vector3F n = N.row(f);\n            angle_data(fei, 0) = ref_normal.cross(n).dot(edge);\n            angle_data(fei, 1) = ref_normal.dot(n);\n            if (cons[fei]) {\n                angle_data(fei, 0) *= -1;\n                angle_data(fei, 1) *= -1;\n            }\n            angle_data(fei, 0) *= -1; // Sort clockwise.\n            angle_data(fei, 2) = (cons[fei]?1.:-1.)*(f+1);\n        }\n\n        Eigen::VectorXi order;\n        igl::sort_angles(angle_data, order);\n\n        auto& ordered_edges = uE2oE[ui];\n        auto& consistency = uE2C[ui];\n\n        ordered_edges.resize(edge_valance);\n        consistency.resize(edge_valance);\n        for (size_t fei=0; fei<edge_valance; fei++) {\n            ordered_edges[fei] = adj_edges[order[fei]];\n            consistency[fei] = cons[order[fei]];\n        }\n    }\n}\n\ntemplate<\n    typename DerivedV,\n    typename DerivedF,\n    typename DerivedN,\n    typename DeriveduE,\n    typename uE2EType,\n    typename uE2oEType,\n    typename uE2CType >\nIGL_INLINE \ntypename std::enable_if<std::is_same<typename DerivedV::Scalar,\ntypename CGAL::Exact_predicates_exact_constructions_kernel::FT>::value, void>::type\nigl::copyleft::cgal::order_facets_around_edges(\n        const Eigen::PlainObjectBase<DerivedV>& V,\n        const Eigen::PlainObjectBase<DerivedF>& F,\n        const Eigen::PlainObjectBase<DerivedN>& N,\n        const Eigen::PlainObjectBase<DeriveduE>& uE,\n        const std::vector<std::vector<uE2EType> >& uE2E,\n        std::vector<std::vector<uE2oEType> >& uE2oE,\n        std::vector<std::vector<uE2CType > >& uE2C ) {\n\n    typedef Eigen::Matrix<typename DerivedN::Scalar, 3, 1> Vector3F;\n    typedef Eigen::Matrix<typename DerivedV::Scalar, 3, 1> Vector3E;\n    const typename DerivedV::Scalar EPS = 1e-12;\n    const size_t num_faces = F.rows();\n    const size_t num_undirected_edges = uE.rows();\n\n    auto edge_index_to_face_index = [&](size_t ei) { return ei % num_faces; };\n    auto edge_index_to_corner_index = [&](size_t ei) { return ei / num_faces; };\n\n    uE2oE.resize(num_undirected_edges);\n    uE2C.resize(num_undirected_edges);\n\n    for(size_t ui = 0;ui<num_undirected_edges;ui++)\n    {\n        const auto& adj_edges = uE2E[ui];\n        const size_t edge_valance = adj_edges.size();\n        assert(edge_valance > 0);\n\n        const auto ref_edge = adj_edges[0];\n        const auto ref_face = edge_index_to_face_index(ref_edge);\n        Vector3F ref_normal = N.row(ref_face);\n\n        const auto ref_corner_o = edge_index_to_corner_index(ref_edge);\n        const auto ref_corner_s = (ref_corner_o+1)%3;\n        const auto ref_corner_d = (ref_corner_o+2)%3;\n\n        const typename DerivedF::Scalar o = F(ref_face, ref_corner_o);\n        const typename DerivedF::Scalar s = F(ref_face, ref_corner_s);\n        const typename DerivedF::Scalar d = F(ref_face, ref_corner_d);\n\n        Vector3E exact_edge = V.row(d) - V.row(s);\n        exact_edge.array() /= exact_edge.squaredNorm();\n        Vector3F edge(\n                CGAL::to_double(exact_edge[0]),\n                CGAL::to_double(exact_edge[1]),\n                CGAL::to_double(exact_edge[2]));\n        edge.normalize();\n\n        Eigen::MatrixXd angle_data(edge_valance, 3);\n        std::vector<bool> cons(edge_valance);\n\n        for (size_t fei=0; fei<edge_valance; fei++) {\n            const auto fe = adj_edges[fei];\n            const auto f = edge_index_to_face_index(fe);\n            const auto c = edge_index_to_corner_index(fe);\n            cons[fei] = (d == F(f, (c+1)%3));\n            assert( cons[fei] ||  (d == F(f,(c+2)%3)));\n            assert(!cons[fei] || (s == F(f,(c+2)%3)));\n            assert(!cons[fei] || (d == F(f,(c+1)%3)));\n            Vector3F n = N.row(f);\n            angle_data(fei, 0) = ref_normal.cross(n).dot(edge);\n            angle_data(fei, 1) = ref_normal.dot(n);\n            if (cons[fei]) {\n                angle_data(fei, 0) *= -1;\n                angle_data(fei, 1) *= -1;\n            }\n            angle_data(fei, 0) *= -1; // Sort clockwise.\n            angle_data(fei, 2) = (cons[fei]?1.:-1.)*(f+1);\n        }\n\n        Eigen::VectorXi order;\n        igl::sort_angles(angle_data, order);\n\n        auto& ordered_edges = uE2oE[ui];\n        auto& consistency = uE2C[ui];\n\n        ordered_edges.resize(edge_valance);\n        consistency.resize(edge_valance);\n        for (size_t fei=0; fei<edge_valance; fei++) {\n            ordered_edges[fei] = adj_edges[order[fei]];\n            consistency[fei] = cons[order[fei]];\n        }\n    }\n}\n\ntemplate<\n    typename DerivedV,\n    typename DerivedF,\n    typename DeriveduE,\n    typename uE2EType,\n    typename uE2oEType,\n    typename uE2CType >\nIGL_INLINE void igl::copyleft::cgal::order_facets_around_edges(\n        const Eigen::PlainObjectBase<DerivedV>& V,\n        const Eigen::PlainObjectBase<DerivedF>& F,\n        const Eigen::PlainObjectBase<DeriveduE>& uE,\n        const std::vector<std::vector<uE2EType> >& uE2E,\n        std::vector<std::vector<uE2oEType> >& uE2oE,\n        std::vector<std::vector<uE2CType > >& uE2C ) {\n\n    //typedef Eigen::Matrix<typename DerivedV::Scalar, 3, 1> Vector3E;\n    const size_t num_faces = F.rows();\n    const size_t num_undirected_edges = uE.rows();\n\n    auto edge_index_to_face_index = [&](size_t ei) { return ei % num_faces; };\n    auto edge_index_to_corner_index = [&](size_t ei) { return ei / num_faces; };\n\n    uE2oE.resize(num_undirected_edges);\n    uE2C.resize(num_undirected_edges);\n\n    for(size_t ui = 0;ui<num_undirected_edges;ui++)\n    {\n        const auto& adj_edges = uE2E[ui];\n        const size_t edge_valance = adj_edges.size();\n        assert(edge_valance > 0);\n\n        const auto ref_edge = adj_edges[0];\n        const auto ref_face = edge_index_to_face_index(ref_edge);\n\n        const auto ref_corner_o = edge_index_to_corner_index(ref_edge);\n        const auto ref_corner_s = (ref_corner_o+1)%3;\n        const auto ref_corner_d = (ref_corner_o+2)%3;\n\n        //const typename DerivedF::Scalar o = F(ref_face, ref_corner_o);\n        const typename DerivedF::Scalar s = F(ref_face, ref_corner_s);\n        const typename DerivedF::Scalar d = F(ref_face, ref_corner_d);\n\n        std::vector<bool> cons(edge_valance);\n        std::vector<int> adj_faces(edge_valance);\n        for (size_t fei=0; fei<edge_valance; fei++) {\n            const auto fe = adj_edges[fei];\n            const auto f = edge_index_to_face_index(fe);\n            const auto c = edge_index_to_corner_index(fe);\n            cons[fei] = (d == F(f, (c+1)%3));\n            adj_faces[fei] = (f+1) * (cons[fei] ? 1:-1);\n\n            assert( cons[fei] ||  (d == F(f,(c+2)%3)));\n            assert(!cons[fei] || (s == F(f,(c+2)%3)));\n            assert(!cons[fei] || (d == F(f,(c+1)%3)));\n        }\n\n        Eigen::VectorXi order;\n        order_facets_around_edge(V, F, s, d, adj_faces, order);\n        assert((size_t)order.size() == edge_valance);\n\n        auto& ordered_edges = uE2oE[ui];\n        auto& consistency = uE2C[ui];\n\n        ordered_edges.resize(edge_valance);\n        consistency.resize(edge_valance);\n        for (size_t fei=0; fei<edge_valance; fei++) {\n            ordered_edges[fei] = adj_edges[order[fei]];\n            consistency[fei] = cons[order[fei]];\n        }\n    }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::copyleft::cgal::order_facets_around_edges<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, int, int, bool>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&, std::vector<std::vector<bool, std::allocator<bool> >, std::allocator<std::vector<bool, std::allocator<bool> > > >&);\n// generated by autoexplicit.sh\ntemplate std::enable_if<!(std::is_same<Eigen::Matrix<double, -1, -1, 0, -1, -1>::Scalar, CGAL::Lazy_exact_nt<CGAL::Gmpq> >::value), void>::type igl::copyleft::cgal::order_facets_around_edges<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, int, int, bool>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&, std::vector<std::vector<bool, std::allocator<bool> >, std::allocator<std::vector<bool, std::allocator<bool> > > >&);\ntemplate void igl::copyleft::cgal::order_facets_around_edges<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 2, 0, -1, 2>, long, long, bool>(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> > const&, std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > > const&, std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > >&, std::vector<std::vector<bool, std::allocator<bool> >, std::allocator<std::vector<bool, std::allocator<bool> > > >&);\ntemplate void igl::copyleft::cgal::order_facets_around_edges<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 2, 0, -1, 2>, long, long, bool>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> > const&, std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > > const&, std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > >&, std::vector<std::vector<bool, std::allocator<bool> >, std::allocator<std::vector<bool, std::allocator<bool> > > >&);\ntemplate void igl::copyleft::cgal::order_facets_around_edges<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 2, 0, -1, 2>, long, long, bool>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> > const&, std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > > const&, std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > >&, std::vector<std::vector<bool, std::allocator<bool> >, std::allocator<std::vector<bool, std::allocator<bool> > > >&);\ntemplate void igl::copyleft::cgal::order_facets_around_edges<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 2, 0, -1, 2>, long, long, bool>(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> > const&, std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > > const&, std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > >&, std::vector<std::vector<bool, std::allocator<bool> >, std::allocator<std::vector<bool, std::allocator<bool> > > >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/order_facets_around_edges.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_CGAL_ORDER_FACETS_AROUND_EDGES_H\n#define IGL_COPYLEFT_CGAL_ORDER_FACETS_AROUND_EDGES_H\n#include \"../../igl_inline.h\"\n#include <Eigen/Core>\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\n#include <vector>\n\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // For each undirected edge, sort its adjacent faces.  Assuming the\n      // undirected edge is (s, d).  Sort the adjacent faces clockwise around the\n      // axis (d - s), i.e. left-hand rule.  An adjacent face is consistently\n      // oriented if it contains (d, s) as a directed edge.\n      //\n      // For overlapping faces, break the tie using signed face index, smaller\n      // signed index comes before the larger signed index.  Signed index is\n      // computed as (consistent? 1:-1) * index.\n      //\n      // Inputs:\n      //   V    #V by 3 list of vertices.\n      //   F    #F by 3 list of faces\n      //   N    #F by 3 list of face normals.\n      //  uE    #uE by 2 list of vertex_indices, represents undirected edges.\n      //  uE2E  #uE list of lists that maps uE to E. (a one-to-many map)\n      //\n      // Outputs:\n      //   uE2oE #uE list of lists that maps uE to an ordered list of E. (a\n      //         one-to-many map)\n      //   uE2C  #uE list of lists of bools indicates whether each face in\n      //         uE2oE[i] is consistently orientated as the ordering.\n      //\n      template<\n          typename DerivedV,\n          typename DerivedF,\n          typename DerivedN,\n          typename DeriveduE,\n          typename uE2EType,\n          typename uE2oEType,\n          typename uE2CType >\n      IGL_INLINE\n      typename std::enable_if<!std::is_same<typename DerivedV::Scalar,\n      typename CGAL::Exact_predicates_exact_constructions_kernel::FT>::value, void>::type\n      order_facets_around_edges(\n        const Eigen::PlainObjectBase<DerivedV>& V,\n        const Eigen::PlainObjectBase<DerivedF>& F,\n        const Eigen::PlainObjectBase<DerivedN>& N,\n        const Eigen::PlainObjectBase<DeriveduE>& uE,\n        const std::vector<std::vector<uE2EType> >& uE2E,\n        std::vector<std::vector<uE2oEType> >& uE2oE,\n        std::vector<std::vector<uE2CType > >& uE2C );\n\n      template<\n          typename DerivedV,\n          typename DerivedF,\n          typename DerivedN,\n          typename DeriveduE,\n          typename uE2EType,\n          typename uE2oEType,\n          typename uE2CType >\n      IGL_INLINE \n      typename std::enable_if<std::is_same<typename DerivedV::Scalar,\n      typename CGAL::Exact_predicates_exact_constructions_kernel::FT>::value, void>::type\n      order_facets_around_edges(\n        const Eigen::PlainObjectBase<DerivedV>& V,\n        const Eigen::PlainObjectBase<DerivedF>& F,\n        const Eigen::PlainObjectBase<DerivedN>& N,\n        const Eigen::PlainObjectBase<DeriveduE>& uE,\n        const std::vector<std::vector<uE2EType> >& uE2E,\n        std::vector<std::vector<uE2oEType> >& uE2oE,\n        std::vector<std::vector<uE2CType > >& uE2C );\n\n      // Order faces around each edge. Only exact predicate is used in the algorithm.\n      // Normal is not needed.\n      template<\n          typename DerivedV,\n          typename DerivedF,\n          typename DeriveduE,\n          typename uE2EType,\n          typename uE2oEType,\n          typename uE2CType >\n      IGL_INLINE void order_facets_around_edges(\n        const Eigen::PlainObjectBase<DerivedV>& V,\n        const Eigen::PlainObjectBase<DerivedF>& F,\n        const Eigen::PlainObjectBase<DeriveduE>& uE,\n        const std::vector<std::vector<uE2EType> >& uE2E,\n        std::vector<std::vector<uE2oEType> >& uE2oE,\n        std::vector<std::vector<uE2CType > >& uE2C );\n    }\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#include \"order_facets_around_edges.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/orient2D.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Qingan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"orient2D.h\"\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\n#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>\n\ntemplate<typename Scalar>\nIGL_INLINE short igl::copyleft::cgal::orient2D(\n    const Scalar pa[2],\n    const Scalar pb[2],\n    const Scalar pc[2])\n{\n  typedef CGAL::Exact_predicates_exact_constructions_kernel Epeck;\n  typedef CGAL::Exact_predicates_inexact_constructions_kernel Epick;\n  typedef typename std::conditional<std::is_same<Scalar, Epeck::FT>::value,\n          Epeck, Epick>::type Kernel;\n\n  switch(CGAL::orientation(\n        typename Kernel::Point_2(pa[0], pa[1]),\n        typename Kernel::Point_2(pb[0], pb[1]),\n        typename Kernel::Point_2(pc[0], pc[1]))) {\n    case CGAL::LEFT_TURN:\n      return 1;\n    case CGAL::RIGHT_TURN:\n      return -1;\n    case CGAL::COLLINEAR:\n      return 0;\n    default:\n      throw \"Invalid orientation\";\n  }\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/orient2D.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Qingan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_COPYLEFT_CGAL_ORIENT_2D_H\n#define IGL_COPYLEFT_CGAL_ORIENT_2D_H\n\n#include \"../../igl_inline.h\"\n\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // Inputs:\n      //   pa,pb,pc   2D points.\n      // Output:\n      //   1 if pa,pb,pc are counterclockwise oriented.\n      //   0 if pa,pb,pc are counterclockwise oriented.\n      //  -1 if pa,pb,pc are clockwise oriented.\n      template <typename Scalar>\n      IGL_INLINE short orient2D(\n          const Scalar pa[2],\n          const Scalar pb[2],\n          const Scalar pc[2]);\n    }\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"orient2D.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/orient3D.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Qingan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"orient3D.h\"\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\n#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>\n\ntemplate<typename Scalar>\nIGL_INLINE short igl::copyleft::cgal::orient3D(\n    const Scalar pa[3],\n    const Scalar pb[3],\n    const Scalar pc[3],\n    const Scalar pd[3])\n{\n  typedef CGAL::Exact_predicates_exact_constructions_kernel Epeck;\n  typedef CGAL::Exact_predicates_inexact_constructions_kernel Epick;\n  typedef typename std::conditional<std::is_same<Scalar, Epeck::FT>::value,\n          Epeck, Epick>::type Kernel;\n\n  switch(CGAL::orientation(\n        typename Kernel::Point_3(pa[0], pa[1], pa[2]),\n        typename Kernel::Point_3(pb[0], pb[1], pb[2]),\n        typename Kernel::Point_3(pc[0], pc[1], pc[2]),\n        typename Kernel::Point_3(pd[0], pd[1], pd[2]))) {\n    case CGAL::POSITIVE:\n      return 1;\n    case CGAL::NEGATIVE:\n      return -1;\n    case CGAL::COPLANAR:\n      return 0;\n    default:\n      throw \"Invalid orientation\";\n  }\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/orient3D.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Qingan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_COPYLEFT_CGAL_ORIENT_3D_H\n#define IGL_COPYLEFT_CGAL_ORIENT_3D_H\n\n#include \"../../igl_inline.h\"\n\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // Inputs:\n      //   pa,pb,pc,pd  3D points.\n      // Output:\n      //   1 if pa,pb,pc,pd forms a tet of positive volume.\n      //   0 if pa,pb,pc,pd are coplanar.\n      //  -1 if pa,pb,pc,pd forms a tet of negative volume.\n      template <typename Scalar>\n      IGL_INLINE short orient3D(\n          const Scalar pa[3],\n          const Scalar pb[3],\n          const Scalar pc[3],\n          const Scalar pd[3]);\n    }\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"orient3D.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/outer_element.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2015 Qingnan Zhou <qnzhou@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"outer_element.h\"\n#include <iostream>\n#include <vector>\n\ntemplate <\n     typename DerivedV,\n     typename DerivedF,\n     typename DerivedI,\n     typename IndexType,\n     typename DerivedA\n     >\nIGL_INLINE void igl::copyleft::cgal::outer_vertex(\n        const Eigen::PlainObjectBase<DerivedV> & V,\n        const Eigen::PlainObjectBase<DerivedF> & F,\n        const Eigen::PlainObjectBase<DerivedI> & I,\n        IndexType & v_index,\n        Eigen::PlainObjectBase<DerivedA> & A)\n{\n    // Algorithm:\n    //    Find an outer vertex (i.e. vertex reachable from infinity)\n    //    Return the vertex with the largest X value.\n    //    If there is a tie, pick the one with largest Y value.\n    //    If there is still a tie, pick the one with the largest Z value.\n    //    If there is still a tie, then there are duplicated vertices within the\n    //    mesh, which violates the precondition.\n    typedef typename DerivedF::Scalar Index;\n    const Index INVALID = std::numeric_limits<Index>::max();\n    const size_t num_selected_faces = I.rows();\n    std::vector<size_t> candidate_faces;\n    Index outer_vid = INVALID;\n    typename DerivedV::Scalar outer_val = 0;\n    for (size_t i=0; i<num_selected_faces; i++)\n    {\n        size_t f = I(i);\n        for (size_t j=0; j<3; j++)\n        {\n            Index v = F(f, j);\n            auto vx = V(v, 0);\n            if (outer_vid == INVALID || vx > outer_val)\n            {\n                outer_val = vx;\n                outer_vid = v;\n                candidate_faces = {f};\n            } else if (v == outer_vid)\n            {\n                candidate_faces.push_back(f);\n            } else if (vx == outer_val)\n            {\n                // Break tie.\n                auto vy = V(v,1);\n                auto vz = V(v, 2);\n                auto outer_y = V(outer_vid, 1);\n                auto outer_z = V(outer_vid, 2);\n                assert(!(vy == outer_y && vz == outer_z));\n                bool replace = (vy > outer_y) ||\n                    ((vy == outer_y) && (vz > outer_z));\n                if (replace)\n                {\n                    outer_val = vx;\n                    outer_vid = v;\n                    candidate_faces = {f};\n                }\n            }\n        }\n    }\n\n    assert(outer_vid != INVALID);\n    assert(candidate_faces.size() > 0);\n    v_index = outer_vid;\n    A.resize(candidate_faces.size());\n    std::copy(candidate_faces.begin(), candidate_faces.end(), A.data());\n}\n\ntemplate<\n    typename DerivedV,\n    typename DerivedF,\n    typename DerivedI,\n    typename IndexType,\n    typename DerivedA\n    >\nIGL_INLINE void igl::copyleft::cgal::outer_edge(\n        const Eigen::PlainObjectBase<DerivedV> & V,\n        const Eigen::PlainObjectBase<DerivedF> & F,\n        const Eigen::PlainObjectBase<DerivedI> & I,\n        IndexType & v1,\n        IndexType & v2,\n        Eigen::PlainObjectBase<DerivedA> & A) {\n    // Algorithm:\n    //    Find an outer vertex first.\n    //    Find the incident edge with largest abs slope when projected onto XY plane.\n    //    If there is a tie, check the signed slope and use the positive one.\n    //    If there is still a tie, break it using the projected slope onto ZX plane.\n    //    If there is still a tie, again check the signed slope and use the positive one.\n    //    If there is still a tie, then there are multiple overlapping edges,\n    //    which violates the precondition.\n    typedef typename DerivedV::Scalar Scalar;\n    typedef typename DerivedV::Index Index;\n    typedef typename Eigen::Matrix<Scalar, 3, 1> ScalarArray3;\n    typedef typename Eigen::Matrix<typename DerivedF::Scalar, 3, 1> IndexArray3;\n    const Index INVALID = std::numeric_limits<Index>::max();\n\n    Index outer_vid;\n    Eigen::Matrix<Index,Eigen::Dynamic,1> candidate_faces;\n    outer_vertex(V, F, I, outer_vid, candidate_faces);\n    const ScalarArray3& outer_v = V.row(outer_vid);\n    assert(candidate_faces.size() > 0);\n\n    auto get_vertex_index = [&](const IndexArray3& f, Index vid) -> Index\n    {\n        if (f[0] == vid) return 0;\n        if (f[1] == vid) return 1;\n        if (f[2] == vid) return 2;\n        assert(false);\n        return -1;\n    };\n\n    auto unsigned_value = [](Scalar v) -> Scalar {\n        if (v < 0) return v * -1;\n        else return v;\n    };\n\n    Scalar outer_slope_YX = 0;\n    Scalar outer_slope_ZX = 0;\n    Index outer_opp_vid = INVALID;\n    bool infinite_slope_detected = false;\n    std::vector<Index> incident_faces;\n    auto check_and_update_outer_edge = [&](Index opp_vid, Index fid) -> void {\n        if (opp_vid == outer_opp_vid)\n        {\n            incident_faces.push_back(fid);\n            return;\n        }\n\n        const ScalarArray3 opp_v = V.row(opp_vid);\n        if (!infinite_slope_detected && outer_v[0] != opp_v[0])\n        {\n            // Finite slope\n            const ScalarArray3 diff = opp_v - outer_v;\n            const Scalar slope_YX = diff[1] / diff[0];\n            const Scalar slope_ZX = diff[2] / diff[0];\n            const Scalar u_slope_YX = unsigned_value(slope_YX);\n            const Scalar u_slope_ZX = unsigned_value(slope_ZX);\n            bool update = false;\n            if (outer_opp_vid == INVALID) {\n                update = true;\n            } else {\n                const Scalar u_outer_slope_YX = unsigned_value(outer_slope_YX);\n                if (u_slope_YX > u_outer_slope_YX) {\n                    update = true;\n                } else if (u_slope_YX == u_outer_slope_YX &&\n                        slope_YX > outer_slope_YX) {\n                    update = true;\n                } else if (slope_YX == outer_slope_YX) {\n                    const Scalar u_outer_slope_ZX =\n                        unsigned_value(outer_slope_ZX);\n                    if (u_slope_ZX > u_outer_slope_ZX) {\n                        update = true;\n                    } else if (u_slope_ZX == u_outer_slope_ZX &&\n                            slope_ZX > outer_slope_ZX) {\n                        update = true;\n                    } else if (slope_ZX == u_outer_slope_ZX) {\n                        assert(false);\n                    }\n                }\n            }\n\n            if (update) {\n                outer_opp_vid = opp_vid;\n                outer_slope_YX = slope_YX;\n                outer_slope_ZX = slope_ZX;\n                incident_faces = {fid};\n            }\n        } else if (!infinite_slope_detected)\n        {\n            // Infinite slope\n            outer_opp_vid = opp_vid;\n            infinite_slope_detected = true;\n            incident_faces = {fid};\n        }\n    };\n\n    const size_t num_candidate_faces = candidate_faces.size();\n    for (size_t i=0; i<num_candidate_faces; i++)\n    {\n        const Index fid = candidate_faces(i);\n        const IndexArray3& f = F.row(fid);\n        size_t id = get_vertex_index(f, outer_vid);\n        Index next_vid = f((id+1)%3);\n        Index prev_vid = f((id+2)%3);\n        check_and_update_outer_edge(next_vid, fid);\n        check_and_update_outer_edge(prev_vid, fid);\n    }\n\n    v1 = outer_vid;\n    v2 = outer_opp_vid;\n    A.resize(incident_faces.size());\n    std::copy(incident_faces.begin(), incident_faces.end(), A.data());\n}\n\n\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\ntemplate void igl::copyleft::cgal::outer_edge<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, long, Eigen::Matrix<long, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> > const&, long&, long&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::outer_edge<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, long, Eigen::Matrix<long, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, long&, long&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::outer_edge<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, long, Eigen::Matrix<long, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> > const&, long&, long&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::outer_edge<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, long, Eigen::Matrix<long, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, long&, long&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::outer_edge<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 1, -1, -1>, long, Eigen::Matrix<long, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 1, -1, -1> > const&, long&, long&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::outer_edge<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, long, Eigen::Matrix<long, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> > const&, long&, long&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::outer_edge<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, long, Eigen::Matrix<long, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, long&, long&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/outer_element.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Qingan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_CGAL_OUTER_ELEMENT_H\n#define IGL_COPYLEFT_CGAL_OUTER_ELEMENT_H\n#include \"../../igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // Find a vertex that is reachable from infinite without crossing any faces.\n      // Such vertex is called \"outer vertex.\"\n      //\n      // Precondition: The input mesh must have all self-intersection resolved and\n      // no duplicated vertices.  See cgal::remesh_self_intersections.h for how to\n      // obtain such input.\n      //\n      // Inputs:\n      //   V  #V by 3 list of vertex positions\n      //   F  #F by 3 list of triangle indices into V\n      //   I  #I list of facets to consider\n      // Outputs:\n      //   v_index  index of outer vertex\n      //   A  #A list of facets incident to the outer vertex\n      template <\n          typename DerivedV,\n          typename DerivedF,\n          typename DerivedI,\n          typename IndexType,\n          typename DerivedA\n          >\n      IGL_INLINE void outer_vertex(\n              const Eigen::PlainObjectBase<DerivedV> & V,\n              const Eigen::PlainObjectBase<DerivedF> & F,\n              const Eigen::PlainObjectBase<DerivedI> & I,\n              IndexType & v_index,\n              Eigen::PlainObjectBase<DerivedA> & A);\n      // Find an edge that is reachable from infinity without crossing any faces.\n      // Such edge is called \"outer edge.\"\n      //\n      // Precondition: The input mesh must have all self-intersection resolved\n      // and no duplicated vertices.  The correctness of the output depends on\n      // the fact that there is no edge overlap.  See\n      // cgal::remesh_self_intersections.h for how to obtain such input.\n      //\n      // Inputs:\n      //   V  #V by 3 list of vertex positions\n      //   F  #F by 3 list of triangle indices into V\n      //   I  #I list of facets to consider\n      // Outputs:\n      //   v1 index of the first end point of outer edge\n      //   v2 index of the second end point of outer edge\n      //   A  #A list of facets incident to the outer edge\n      template<\n          typename DerivedV,\n          typename DerivedF,\n          typename DerivedI,\n          typename IndexType,\n          typename DerivedA\n          >\n      IGL_INLINE void outer_edge(\n              const Eigen::PlainObjectBase<DerivedV> & V,\n              const Eigen::PlainObjectBase<DerivedF> & F,\n              const Eigen::PlainObjectBase<DerivedI> & I,\n              IndexType & v1,\n              IndexType & v2,\n              Eigen::PlainObjectBase<DerivedA> & A);\n\n    }\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"outer_element.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/outer_facet.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Qingnan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"outer_facet.h\"\n#include \"outer_element.h\"\n#include \"order_facets_around_edge.h\"\n#include <algorithm>\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\n\ntemplate<\n    typename DerivedV,\n    typename DerivedF,\n    typename DerivedI,\n    typename IndexType\n    >\nIGL_INLINE void igl::copyleft::cgal::outer_facet(\n        const Eigen::PlainObjectBase<DerivedV> & V,\n        const Eigen::PlainObjectBase<DerivedF> & F,\n        const Eigen::PlainObjectBase<DerivedI> & I,\n        IndexType & f,\n        bool & flipped) {\n\n    // Algorithm:\n    //\n    //    1. Find an outer edge (s, d).\n    //\n    //    2. Order adjacent facets around this edge. Because the edge is an\n    //    outer edge, there exists a plane passing through it such that all its\n    //    adjacent facets lie on the same side. The implementation of\n    //    order_facets_around_edge() will find a natural start facet such that\n    //    The first and last facets according to this order are on the outside.\n    //\n    //    3. Because the vertex s is an outer vertex by construction (see\n    //    implemnetation of outer_edge()). The first adjacent facet is facing\n    //    outside (i.e. flipped=false) if it has positive X normal component.\n    //    If it has zero normal component, it is facing outside if it contains\n    //    directed edge (s, d).  \n\n    //typedef typename DerivedV::Scalar Scalar;\n    typedef typename DerivedV::Index Index;\n\n    Index s,d;\n    Eigen::Matrix<Index,Eigen::Dynamic,1> incident_faces;\n    outer_edge(V, F, I, s, d, incident_faces);\n    assert(incident_faces.size() > 0);\n\n    auto convert_to_signed_index = [&](size_t fid) -> int{\n        if ((F(fid, 0) == s && F(fid, 1) == d) ||\n            (F(fid, 1) == s && F(fid, 2) == d) ||\n            (F(fid, 2) == s && F(fid, 0) == d) ) {\n            return int(fid+1) * -1;\n        } else {\n            return int(fid+1);\n        }\n    };\n\n    auto signed_index_to_index = [&](int signed_id) -> size_t {\n        return size_t(abs(signed_id) - 1);\n    };\n\n    std::vector<int> adj_faces(incident_faces.size());\n    std::transform(incident_faces.data(),\n            incident_faces.data() + incident_faces.size(),\n            adj_faces.begin(),\n            convert_to_signed_index);\n\n    DerivedV pivot_point = V.row(s);\n    pivot_point(0, 0) += 1.0;\n\n    Eigen::VectorXi order;\n    order_facets_around_edge(V, F, s, d, adj_faces, pivot_point, order);\n\n    f = signed_index_to_index(adj_faces[order[0]]);\n    flipped = adj_faces[order[0]] > 0;\n}\n\n\n\ntemplate<\n    typename DerivedV,\n    typename DerivedF,\n    typename DerivedN,\n    typename DerivedI,\n    typename IndexType\n    >\nIGL_INLINE void igl::copyleft::cgal::outer_facet(\n        const Eigen::PlainObjectBase<DerivedV> & V,\n        const Eigen::PlainObjectBase<DerivedF> & F,\n        const Eigen::PlainObjectBase<DerivedN> & N,\n        const Eigen::PlainObjectBase<DerivedI> & I,\n        IndexType & f,\n        bool & flipped) {\n    // Algorithm:\n    //    Find an outer edge.\n    //    Find the incident facet with the largest absolute X normal component.\n    //    If there is a tie, keep the one with positive X component.\n    //    If there is still a tie, pick the face with the larger signed index\n    //    (flipped face has negative index).\n    typedef typename DerivedV::Scalar Scalar;\n    typedef typename DerivedV::Index Index;\n    const size_t INVALID = std::numeric_limits<size_t>::max();\n\n    Index v1,v2;\n    Eigen::Matrix<Index,Eigen::Dynamic,1> incident_faces;\n    outer_edge(V, F, I, v1, v2, incident_faces);\n    assert(incident_faces.size() > 0);\n\n    auto generic_fabs = [&](const Scalar& val) -> const Scalar {\n        if (val >= 0) return val;\n        else return -val;\n    };\n\n    Scalar max_nx = 0;\n    size_t outer_fid = INVALID;\n    const size_t num_incident_faces = incident_faces.size();\n    for (size_t i=0; i<num_incident_faces; i++) \n    {\n        const auto& fid = incident_faces(i);\n        const Scalar nx = N(fid, 0);\n        if (outer_fid == INVALID) {\n            max_nx = nx;\n            outer_fid = fid;\n        } else {\n            if (generic_fabs(nx) > generic_fabs(max_nx)) {\n                max_nx = nx;\n                outer_fid = fid;\n            } else if (nx == -max_nx && nx > 0) {\n                max_nx = nx;\n                outer_fid = fid;\n            } else if (nx == max_nx) {\n                if ((max_nx >= 0 && outer_fid < fid) ||\n                    (max_nx <  0 && outer_fid > fid)) {\n                    max_nx = nx;\n                    outer_fid = fid;\n                }\n            }\n        }\n    }\n\n    assert(outer_fid != INVALID);\n    f = outer_fid;\n    flipped = max_nx < 0;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::copyleft::cgal::outer_facet<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, unsigned long>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, unsigned long&, bool&);\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\n#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>\ntemplate void igl::copyleft::cgal::outer_facet<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, int>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> > const&, int&, bool&);\ntemplate void igl::copyleft::cgal::outer_facet<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 1, -1, -1>, Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 1, -1, -1>, unsigned long>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 1, -1, -1> > const&, unsigned long&, bool&);\ntemplate void igl::copyleft::cgal::outer_facet<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, int>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int&, bool&);\ntemplate void igl::copyleft::cgal::outer_facet<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, int>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int&, bool&);\ntemplate void igl::copyleft::cgal::outer_facet<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, int>(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> > const&, int&, bool&);\ntemplate void igl::copyleft::cgal::outer_facet<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, int>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> > const&, int&, bool&);\ntemplate void igl::copyleft::cgal::outer_facet<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, int>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int&, bool&);\ntemplate void igl::copyleft::cgal::outer_facet<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, unsigned long>(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, unsigned long&, bool&);\ntemplate void igl::copyleft::cgal::outer_facet<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, int>(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int&, bool&);\ntemplate void igl::copyleft::cgal::outer_facet<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, int>(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> > const&, int&, bool&);\ntemplate void igl::copyleft::cgal::outer_facet<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, int>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, int&, bool&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/outer_facet.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Qingnan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_COPYLEFT_CGAL_OUTER_FACET_H\n#define IGL_COPYLEFT_CGAL_OUTER_FACET_H\n#include \"../../igl_inline.h\"\n#include <Eigen/Core>\n\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n        // Find a facet that is reachable from infinity without crossing any faces.\n        // Such facet is called \"outer facet.\"\n        //\n        // Precondition: The input mesh must have all self-intersection resolved.  I.e\n        // there is no duplicated vertices, no overlapping edge and no intersecting\n        // faces (the only exception is there could be topologically duplicated faces).\n        // See cgal::remesh_self_intersections.h for how to obtain such input.\n        //\n        // This function differ from igl::outer_facet() in the fact this\n        // funciton is more robust because it does not rely on facet normals.\n        //\n        // Inputs:\n        //   V  #V by 3 list of vertex positions\n        //   F  #F by 3 list of triangle indices into V\n        //   I  #I list of facets to consider\n        // Outputs:\n        //   f  Index of the outer facet.\n        //   flipped  true iff the normal of f points inwards.\n        template<\n            typename DerivedV,\n            typename DerivedF,\n            typename DerivedI,\n            typename IndexType\n            >\n        IGL_INLINE void outer_facet(\n                const Eigen::PlainObjectBase<DerivedV> & V,\n                const Eigen::PlainObjectBase<DerivedF> & F,\n                const Eigen::PlainObjectBase<DerivedI> & I,\n                IndexType & f,\n                bool & flipped);\n\n      // Find a facet that is reachable from infinity without crossing any faces.\n      // Such facet is called \"outer facet.\"\n      //\n      // Precondition: The input mesh must have all self-intersection resolved.\n      // I.e there is no duplicated vertices, no overlapping edge and no\n      // intersecting faces (the only exception is there could be topologically\n      // duplicated faces).  See cgal::remesh_self_intersections.h for how to\n      // obtain such input.\n      //\n      // Inputs:\n      //   V  #V by 3 list of vertex positions\n      //   F  #F by 3 list of triangle indices into V\n      //   N  #N by 3 list of face normals\n      //   I  #I list of facets to consider\n      // Outputs:\n      //   f  Index of the outer facet.\n      //   flipped  true iff the normal of f points inwards.\n      template<\n          typename DerivedV,\n          typename DerivedF,\n          typename DerivedN,\n          typename DerivedI,\n          typename IndexType\n          >\n      IGL_INLINE void outer_facet(\n              const Eigen::PlainObjectBase<DerivedV> & V,\n              const Eigen::PlainObjectBase<DerivedF> & F,\n              const Eigen::PlainObjectBase<DerivedN> & N,\n              const Eigen::PlainObjectBase<DerivedI> & I,\n              IndexType & f,\n              bool & flipped);\n\n    }\n\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"outer_facet.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/outer_hull.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"outer_hull.h\"\n#include \"extract_cells.h\"\n#include \"remesh_self_intersections.h\"\n#include \"assign.h\"\n#include \"../../remove_unreferenced.h\"\n\n#include <CGAL/AABB_tree.h>\n#include <CGAL/AABB_traits.h>\n#include <CGAL/AABB_triangle_primitive.h>\n#include <CGAL/intersections.h>\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\n\ntemplate <\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedHV,\n  typename DerivedHF,\n  typename DerivedJ,\n  typename Derivedflip>\nIGL_INLINE void igl::copyleft::cgal::outer_hull(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  Eigen::PlainObjectBase<DerivedHV> & HV,\n  Eigen::PlainObjectBase<DerivedHF> & HF,\n  Eigen::PlainObjectBase<DerivedJ> & J,\n  Eigen::PlainObjectBase<Derivedflip> & flip)\n{\n  // Exact types\n  typedef CGAL::Epeck Kernel;\n  typedef Kernel::FT ExactScalar;\n  typedef\n    Eigen::Matrix<\n    ExactScalar,\n    Eigen::Dynamic,\n    Eigen::Dynamic,\n    DerivedHV::IsRowMajor>\n      MatrixXES;\n  // Remesh self-intersections\n  MatrixXES Vr;\n  DerivedHF Fr;\n  DerivedJ Jr;\n  {\n    RemeshSelfIntersectionsParam params;\n    params.stitch_all = true;\n    Eigen::VectorXi I;\n    Eigen::MatrixXi IF;\n    remesh_self_intersections(V, F, params, Vr, Fr, IF, Jr, I);\n    // Merge coinciding vertices into non-manifold vertices.\n    std::for_each(Fr.data(), Fr.data()+Fr.size(),\n      [&I](typename DerivedHF::Scalar& a) { a=I[a]; });\n      // Remove unreferenced vertices.\n    Eigen::VectorXi UIM;\n    remove_unreferenced(MatrixXES(Vr),DerivedHF(Fr), Vr, Fr, UIM);\n  }\n  // Extract cells for each face\n  Eigen::MatrixXi C;\n  extract_cells(Vr,Fr,C);\n  // Extract faces on ambient cell\n  int num_outer = 0;\n  for(int i = 0;i<C.rows();i++)\n  {\n    num_outer += ( C(i,0) == 0 || C(i,1) == 0 ) ? 1 : 0;\n  }\n  HF.resize(num_outer,3);\n  J.resize(num_outer,1);\n  flip.resize(num_outer,1);\n  {\n    int h = 0;\n    for(int i = 0;i<C.rows();i++)\n    {\n      if(C(i,0)==0)\n      {\n        HF.row(h) = Fr.row(i);\n        J(h) = Jr(i);\n        flip(h) = false;\n        h++;\n      }else if(C(i,1) == 0)\n      {\n        HF.row(h) = Fr.row(i).reverse();\n        J(h) = Jr(i);\n        flip(h) = true;\n        h++;\n      }\n    }\n    assert(h == num_outer);\n  }\n  // Remove unreferenced vertices and re-index faces\n  {\n    // Cast to output type\n    DerivedHV Vr_cast;\n    assign(Vr,Vr_cast);\n    Eigen::VectorXi I;\n    remove_unreferenced(Vr_cast,DerivedHF(HF),HV,HF,I);\n  }\n}\n\n#include \"points_inside_component.h\"\n#include \"order_facets_around_edges.h\"\n#include \"outer_facet.h\"\n#include \"../../sortrows.h\"\n#include \"../../facet_components.h\"\n#include \"../../winding_number.h\"\n#include \"../../triangle_triangle_adjacency.h\"\n#include \"../../unique_edge_map.h\"\n#include \"../../barycenter.h\"\n#include \"../../per_face_normals.h\"\n#include \"../../sort_angles.h\"\n#include <Eigen/Geometry>\n#include <vector>\n#include <map>\n#include <queue>\n#include <iostream>\n#include <type_traits>\n#include <CGAL/number_utils.h>\n//#define IGL_OUTER_HULL_DEBUG\n\ntemplate <\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedG,\n  typename DerivedJ,\n  typename Derivedflip>\nIGL_INLINE void igl::copyleft::cgal::outer_hull_legacy(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  Eigen::PlainObjectBase<DerivedG> & G,\n  Eigen::PlainObjectBase<DerivedJ> & J,\n  Eigen::PlainObjectBase<Derivedflip> & flip)\n{\n#ifdef IGL_OUTER_HULL_DEBUG\n  std::cerr << \"Extracting outer hull\" << std::endl;\n#endif\n  using namespace Eigen;\n  using namespace std;\n  typedef typename DerivedF::Index Index;\n  Matrix<Index,DerivedF::RowsAtCompileTime,1> C;\n  typedef Matrix<typename DerivedV::Scalar,Dynamic,DerivedV::ColsAtCompileTime> MatrixXV;\n  //typedef Matrix<typename DerivedF::Scalar,Dynamic,DerivedF::ColsAtCompileTime> MatrixXF;\n  typedef Matrix<typename DerivedG::Scalar,Dynamic,DerivedG::ColsAtCompileTime> MatrixXG;\n  typedef Matrix<typename DerivedJ::Scalar,Dynamic,DerivedJ::ColsAtCompileTime> MatrixXJ;\n  const Index m = F.rows();\n\n  // UNUSED:\n  //const auto & duplicate_simplex = [&F](const int f, const int g)->bool\n  //{\n  //  return\n  //    (F(f,0) == F(g,0) && F(f,1) == F(g,1) && F(f,2) == F(g,2)) ||\n  //    (F(f,1) == F(g,0) && F(f,2) == F(g,1) && F(f,0) == F(g,2)) ||\n  //    (F(f,2) == F(g,0) && F(f,0) == F(g,1) && F(f,1) == F(g,2)) ||\n  //    (F(f,0) == F(g,2) && F(f,1) == F(g,1) && F(f,2) == F(g,0)) ||\n  //    (F(f,1) == F(g,2) && F(f,2) == F(g,1) && F(f,0) == F(g,0)) ||\n  //    (F(f,2) == F(g,2) && F(f,0) == F(g,1) && F(f,1) == F(g,0));\n  //};\n\n#ifdef IGL_OUTER_HULL_DEBUG\n  cout<<\"outer hull...\"<<endl;\n#endif\n\n#ifdef IGL_OUTER_HULL_DEBUG\n  cout<<\"edge map...\"<<endl;\n#endif\n  typedef Matrix<typename DerivedF::Scalar,Dynamic,2> MatrixX2I;\n  typedef Matrix<typename DerivedF::Index,Dynamic,1> VectorXI;\n  //typedef Matrix<typename DerivedV::Scalar, 3, 1> Vector3F;\n  MatrixX2I E,uE;\n  VectorXI EMAP;\n  vector<vector<typename DerivedF::Index> > uE2E;\n  unique_edge_map(F,E,uE,EMAP,uE2E);\n#ifdef IGL_OUTER_HULL_DEBUG\n  for (size_t ui=0; ui<uE.rows(); ui++) {\n      std::cout << ui << \": \" << uE2E[ui].size() << \" -- (\";\n      for (size_t i=0; i<uE2E[ui].size(); i++) {\n          std::cout << uE2E[ui][i] << \", \";\n      }\n      std::cout << \")\" << std::endl;\n  }\n#endif\n\n  std::vector<std::vector<typename DerivedF::Index> > uE2oE;\n  std::vector<std::vector<bool> > uE2C;\n  order_facets_around_edges(V, F, uE, uE2E, uE2oE, uE2C);\n  uE2E = uE2oE;\n  VectorXI diIM(3*m);\n  for (auto ue : uE2E) {\n      for (size_t i=0; i<ue.size(); i++) {\n          auto fe = ue[i];\n          diIM[fe] = i;\n      }\n  }\n\n  vector<vector<vector<Index > > > TT,_1;\n  triangle_triangle_adjacency(E,EMAP,uE2E,false,TT,_1);\n  VectorXI counts;\n#ifdef IGL_OUTER_HULL_DEBUG\n  cout<<\"facet components...\"<<endl;\n#endif\n  facet_components(TT,C,counts);\n  assert(C.maxCoeff()+1 == counts.rows());\n  const size_t ncc = counts.rows();\n  G.resize(0,F.cols());\n  J.resize(0,1);\n  flip.setConstant(m,1,false);\n\n#ifdef IGL_OUTER_HULL_DEBUG\n  cout<<\"reindex...\"<<endl;\n#endif\n  // H contains list of faces on outer hull;\n  vector<bool> FH(m,false);\n  vector<bool> EH(3*m,false);\n  vector<MatrixXG> vG(ncc);\n  vector<MatrixXJ> vJ(ncc);\n  vector<MatrixXJ> vIM(ncc);\n  //size_t face_count = 0;\n  for(size_t id = 0;id<ncc;id++)\n  {\n    vIM[id].resize(counts[id],1);\n  }\n  // current index into each IM\n  vector<size_t> g(ncc,0);\n  // place order of each face in its respective component\n  for(Index f = 0;f<m;f++)\n  {\n    vIM[C(f)](g[C(f)]++) = f;\n  }\n\n#ifdef IGL_OUTER_HULL_DEBUG\n  cout<<\"barycenters...\"<<endl;\n#endif\n  // assumes that \"resolve\" has handled any coplanar cases correctly and nearly\n  // coplanar cases can be sorted based on barycenter.\n  MatrixXV BC;\n  barycenter(V,F,BC);\n\n#ifdef IGL_OUTER_HULL_DEBUG\n  cout<<\"loop over CCs (=\"<<ncc<<\")...\"<<endl;\n#endif\n  for(Index id = 0;id<(Index)ncc;id++)\n  {\n    auto & IM = vIM[id];\n    // starting face that's guaranteed to be on the outer hull and in this\n    // component\n    int f;\n    bool f_flip;\n#ifdef IGL_OUTER_HULL_DEBUG\n  cout<<\"outer facet...\"<<endl;\n#endif\n  igl::copyleft::cgal::outer_facet(V,F,IM,f,f_flip);\n#ifdef IGL_OUTER_HULL_DEBUG\n  cout<<\"outer facet: \"<<f<<endl;\n  //cout << V.row(F(f, 0)) << std::endl;\n  //cout << V.row(F(f, 1)) << std::endl;\n  //cout << V.row(F(f, 2)) << std::endl;\n#endif\n    int FHcount = 1;\n    FH[f] = true;\n    // Q contains list of face edges to continue traversing upong\n    queue<int> Q;\n    Q.push(f+0*m);\n    Q.push(f+1*m);\n    Q.push(f+2*m);\n    flip(f) = f_flip;\n    //std::cout << \"face \" << face_count++ << \": \" << f << std::endl;\n    //std::cout << \"f \" << F.row(f).array()+1 << std::endl;\n    //cout<<\"flip(\"<<f<<\") = \"<<(flip(f)?\"true\":\"false\")<<endl;\n#ifdef IGL_OUTER_HULL_DEBUG\n  cout<<\"BFS...\"<<endl;\n#endif\n    while(!Q.empty())\n    {\n      // face-edge\n      const int e = Q.front();\n      Q.pop();\n      // face\n      const int f = e%m;\n      // corner\n      const int c = e/m;\n#ifdef IGL_OUTER_HULL_DEBUG\n      std::cout << \"edge: \" << e << \", ue: \" << EMAP(e) << std::endl;\n      std::cout << \"face: \" << f << std::endl;\n      std::cout << \"corner: \" << c << std::endl;\n      std::cout << \"consistent: \" << uE2C[EMAP(e)][diIM[e]] << std::endl;\n#endif\n      // Should never see edge again...\n      if(EH[e] == true)\n      {\n        continue;\n      }\n      EH[e] = true;\n      // source of edge according to f\n      const int fs = flip(f)?F(f,(c+2)%3):F(f,(c+1)%3);\n      // destination of edge according to f\n      const int fd = flip(f)?F(f,(c+1)%3):F(f,(c+2)%3);\n      // edge valence\n      const size_t val = uE2E[EMAP(e)].size();\n#ifdef IGL_OUTER_HULL_DEBUG\n      //std::cout << \"vd: \" << V.row(fd) << std::endl;\n      //std::cout << \"vs: \" << V.row(fs) << std::endl;\n      //std::cout << \"edge: \" << V.row(fd) - V.row(fs) << std::endl;\n      for (size_t i=0; i<val; i++) {\n          if (i == diIM(e)) {\n              std::cout << \"* \";\n          } else {\n              std::cout << \"  \";\n          }\n          std::cout << i << \": \"\n              << \" (e: \" << uE2E[EMAP(e)][i] << \", f: \"\n              << uE2E[EMAP(e)][i] % m * (uE2C[EMAP(e)][i] ? 1:-1) << \")\" << std::endl;\n      }\n#endif\n\n      // is edge consistent with edge of face used for sorting\n      const int e_cons = (uE2C[EMAP(e)][diIM(e)] ? 1: -1);\n      int nfei = -1;\n      // Loop once around trying to find suitable next face\n      for(size_t step = 1; step<val+2;step++)\n      {\n        const int nfei_new = (diIM(e) + 2*val + e_cons*step*(flip(f)?-1:1))%val;\n        const int nf = uE2E[EMAP(e)][nfei_new] % m;\n        {\n#ifdef IGL_OUTER_HULL_DEBUG\n        //cout<<\"Next facet: \"<<(f+1)<<\" --> \"<<(nf+1)<<\", |\"<<\n        //  di[EMAP(e)][diIM(e)]<<\" - \"<<di[EMAP(e)][nfei_new]<<\"| = \"<<\n        //    abs(di[EMAP(e)][diIM(e)] - di[EMAP(e)][nfei_new])\n        //    <<endl;\n#endif\n\n\n\n          // Only use this face if not already seen\n          if(!FH[nf])\n          {\n            nfei = nfei_new;\n          //} else {\n          //    std::cout << \"skipping face \" << nfei_new << \" because it is seen before\"\n          //        << std::endl;\n          }\n          break;\n        //} else {\n        //    std::cout << di[EMAP(e)][diIM(e)].transpose() << std::endl;\n        //    std::cout << di[EMAP(e)][diIM(nfei_new)].transpose() << std::endl;\n        //    std::cout << \"skipping face \" << nfei_new << \" with identical dihedral angle\"\n        //        << std::endl;\n        }\n//#ifdef IGL_OUTER_HULL_DEBUG\n//        cout<<\"Skipping co-planar facet: \"<<(f+1)<<\" --> \"<<(nf+1)<<endl;\n//#endif\n      }\n\n      int max_ne = -1;\n      if(nfei >= 0)\n      {\n        max_ne = uE2E[EMAP(e)][nfei];\n      }\n\n      if(max_ne>=0)\n      {\n        // face of neighbor\n        const int nf = max_ne%m;\n#ifdef IGL_OUTER_HULL_DEBUG\n        if(!FH[nf])\n        {\n          // first time seeing face\n          cout<<(f+1)<<\" --> \"<<(nf+1)<<endl;\n        }\n#endif\n        FH[nf] = true;\n        //std::cout << \"face \" << face_count++ << \": \" << nf << std::endl;\n        //std::cout << \"f \" << F.row(nf).array()+1 << std::endl;\n        FHcount++;\n        // corner of neighbor\n        const int nc = max_ne/m;\n        const int nd = F(nf,(nc+2)%3);\n        const bool cons = (flip(f)?fd:fs) == nd;\n        flip(nf) = (cons ? flip(f) : !flip(f));\n        //cout<<\"flip(\"<<nf<<\") = \"<<(flip(nf)?\"true\":\"false\")<<endl;\n        const int ne1 = nf+((nc+1)%3)*m;\n        const int ne2 = nf+((nc+2)%3)*m;\n        if(!EH[ne1])\n        {\n          Q.push(ne1);\n        }\n        if(!EH[ne2])\n        {\n          Q.push(ne2);\n        }\n      }\n    }\n\n    {\n      vG[id].resize(FHcount,3);\n      vJ[id].resize(FHcount,1);\n      //nG += FHcount;\n      size_t h = 0;\n      assert(counts(id) == IM.rows());\n      for(int i = 0;i<counts(id);i++)\n      {\n        const size_t f = IM(i);\n        //if(f_flip)\n        //{\n        //  flip(f) = !flip(f);\n        //}\n        if(FH[f])\n        {\n          vG[id].row(h) = (flip(f)?F.row(f).reverse().eval():F.row(f));\n          vJ[id](h,0) = f;\n          h++;\n        }\n      }\n      assert((int)h == FHcount);\n    }\n  }\n\n  // Is A inside B? Assuming A and B are consistently oriented but closed and\n  // non-intersecting.\n  const auto & has_overlapping_bbox = [](\n    const Eigen::PlainObjectBase<DerivedV> & V,\n    const MatrixXG & A,\n    const MatrixXG & B)->bool\n  {\n    const auto & bounding_box = [](\n      const Eigen::PlainObjectBase<DerivedV> & V,\n      const MatrixXG & F)->\n        DerivedV\n    {\n      DerivedV BB(2,3);\n      BB<<\n         1e26,1e26,1e26,\n        -1e26,-1e26,-1e26;\n      const size_t m = F.rows();\n      for(size_t f = 0;f<m;f++)\n      {\n        for(size_t c = 0;c<3;c++)\n        {\n          const auto & vfc = V.row(F(f,c)).eval();\n          BB(0,0) = std::min(BB(0,0), vfc(0,0));\n          BB(0,1) = std::min(BB(0,1), vfc(0,1));\n          BB(0,2) = std::min(BB(0,2), vfc(0,2));\n          BB(1,0) = std::max(BB(1,0), vfc(0,0));\n          BB(1,1) = std::max(BB(1,1), vfc(0,1));\n          BB(1,2) = std::max(BB(1,2), vfc(0,2));\n        }\n      }\n      return BB;\n    };\n    // A lot of the time we're dealing with unrelated, distant components: cull\n    // them.\n    DerivedV ABB = bounding_box(V,A);\n    DerivedV BBB = bounding_box(V,B);\n    if( (BBB.row(0)-ABB.row(1)).maxCoeff()>0  ||\n        (ABB.row(0)-BBB.row(1)).maxCoeff()>0 )\n    {\n      // bounding boxes do not overlap\n      return false;\n    } else {\n      return true;\n    }\n  };\n\n  // Reject components which are completely inside other components\n  vector<bool> keep(ncc,true);\n  size_t nG = 0;\n  // This is O( ncc * ncc * m)\n  for(size_t id = 0;id<ncc;id++)\n  {\n    if (!keep[id]) continue;\n    std::vector<size_t> unresolved;\n    for(size_t oid = 0;oid<ncc;oid++)\n    {\n      if(id == oid || !keep[oid])\n      {\n        continue;\n      }\n      if (has_overlapping_bbox(V, vG[id], vG[oid])) {\n          unresolved.push_back(oid);\n      }\n    }\n    const size_t num_unresolved_components = unresolved.size();\n    DerivedV query_points(num_unresolved_components, 3);\n    for (size_t i=0; i<num_unresolved_components; i++) {\n        const size_t oid = unresolved[i];\n        DerivedF f = vG[oid].row(0);\n        query_points(i,0) = (V(f(0,0), 0) + V(f(0,1), 0) + V(f(0,2), 0))/3.0;\n        query_points(i,1) = (V(f(0,0), 1) + V(f(0,1), 1) + V(f(0,2), 1))/3.0;\n        query_points(i,2) = (V(f(0,0), 2) + V(f(0,1), 2) + V(f(0,2), 2))/3.0;\n    }\n    Eigen::VectorXi inside;\n    igl::copyleft::cgal::points_inside_component(V, vG[id], query_points, inside);\n    assert((size_t)inside.size() == num_unresolved_components);\n    for (size_t i=0; i<num_unresolved_components; i++) {\n        if (inside(i, 0)) {\n            const size_t oid = unresolved[i];\n            keep[oid] = false;\n        }\n    }\n  }\n  for (size_t id = 0; id<ncc; id++) {\n      if (keep[id]) {\n          nG += vJ[id].rows();\n      }\n  }\n\n  // collect G and J across components\n  G.resize(nG,3);\n  J.resize(nG,1);\n  {\n    size_t off = 0;\n    for(Index id = 0;id<(Index)ncc;id++)\n    {\n      if(keep[id])\n      {\n        assert(vG[id].rows() == vJ[id].rows());\n        G.block(off,0,vG[id].rows(),vG[id].cols()) = vG[id];\n        J.block(off,0,vJ[id].rows(),vJ[id].cols()) = vJ[id];\n        off += vG[id].rows();\n      }\n    }\n  }\n}\n\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::copyleft::cgal::outer_hull<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::outer_hull_legacy< Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > &, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > &, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > &);\ntemplate void igl::copyleft::cgal::outer_hull_legacy< Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::copyleft::cgal::outer_hull_legacy<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::outer_hull_legacy<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/outer_hull.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_CGAL_OUTER_HULL_H\n#define IGL_COPYLEFT_CGAL_OUTER_HULL_H\n#include \"../../igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // Compute the \"outer hull\" of a piecewise constant winding number induce\n      // triangle mesh (V,F).\n      //\n      // Inputs:\n      //   V  #V by 3 list of vertex positions\n      //   F  #F by 3 list of triangle indices into V\n      // Outputs:\n      //   HV  #HV by 3 list of output vertex positions\n      //   HF  #HF by 3 list of output triangle indices into HV\n      //   J  #HF list of indices into F\n      //   flip  #HF list of whether facet was flipped when added to HF\n      //\n      template <\n        typename DerivedV,\n        typename DerivedF,\n        typename DerivedHV,\n        typename DerivedHF,\n        typename DerivedJ,\n        typename Derivedflip>\n      IGL_INLINE void outer_hull(\n        const Eigen::PlainObjectBase<DerivedV> & V,\n        const Eigen::PlainObjectBase<DerivedF> & F,\n        Eigen::PlainObjectBase<DerivedHV> & HV,\n        Eigen::PlainObjectBase<DerivedHF> & HF,\n        Eigen::PlainObjectBase<DerivedJ> & J,\n        Eigen::PlainObjectBase<Derivedflip> & flip);\n      // Compute the \"outer hull\" of a potentially non-manifold mesh (V,F) whose\n      // intersections have been \"resolved\" (e.g. using `cork` or\n      // `igl::copyleft::cgal::selfintersect`). The outer hull is defined to be all facets\n      // (regardless of orientation) for which there exists some path from infinity\n      // to the face without intersecting any other facets. For solids, this is the\n      // surface of the solid. In general this includes any thin \"wings\" or\n      // \"flaps\".  This implementation largely follows Section 3.6 of \"Direct\n      // repair of self-intersecting meshes\" [Attene 2014].\n      //\n      // Note: This doesn't require the input mesh to be piecewise constant\n      // winding number, but won't handle multiple non-nested connected\n      // components.\n      //\n      // Inputs:\n      //   V  #V by 3 list of vertex positions\n      //   F  #F by 3 list of triangle indices into V\n      // Outputs:\n      //   G  #G by 3 list of output triangle indices into V\n      //   J  #G list of indices into F\n      //   flip  #F list of whether facet was added to G **and** flipped orientation\n      //     (false for faces not added to G)\n      template <\n        typename DerivedV,\n        typename DerivedF,\n        typename DerivedG,\n        typename DerivedJ,\n        typename Derivedflip>\n      IGL_INLINE void outer_hull_legacy(\n        const Eigen::PlainObjectBase<DerivedV> & V,\n        const Eigen::PlainObjectBase<DerivedF> & F,\n        Eigen::PlainObjectBase<DerivedG> & G,\n        Eigen::PlainObjectBase<DerivedJ> & J,\n        Eigen::PlainObjectBase<Derivedflip> & flip);\n    }\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"outer_hull.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/peel_outer_hull_layers.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"peel_outer_hull_layers.h\"\n#include \"outer_hull.h\"\n#include \"../../LinSpaced.h\"\n#include <vector>\n#include <iostream>\n//#define IGL_PEEL_OUTER_HULL_LAYERS_DEBUG\n#ifdef IGL_PEEL_OUTER_HULL_LAYERS_DEBUG\n#include \"../../writePLY.h\"\n#include \"../../writeDMAT.h\"\n#include \"../../STR.h\"\n#endif\n\ntemplate <\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedI,\n  typename Derivedflip>\nIGL_INLINE size_t igl::copyleft::cgal::peel_outer_hull_layers(\n  const Eigen::PlainObjectBase<DerivedV > & V,\n  const Eigen::PlainObjectBase<DerivedF > & F,\n  Eigen::PlainObjectBase<DerivedI> & I,\n  Eigen::PlainObjectBase<Derivedflip > & flip)\n{\n  using namespace Eigen;\n  using namespace std;\n  typedef typename DerivedF::Index Index;\n  typedef Matrix<typename DerivedF::Scalar,Dynamic,DerivedF::ColsAtCompileTime> MatrixXF;\n  typedef Matrix<Index,Dynamic,1> MatrixXI;\n  typedef Matrix<typename Derivedflip::Scalar,Dynamic,Derivedflip::ColsAtCompileTime> MatrixXflip;\n  const Index m = F.rows();\n#ifdef IGL_PEEL_OUTER_HULL_LAYERS_DEBUG\n  cout<<\"peel outer hull layers...\"<<endl;\n#endif\n#ifdef IGL_PEEL_OUTER_HULL_LAYERS_DEBUG\n  cout<<\"calling outer hull...\"<<endl;\n  writePLY(STR(\"peel-outer-hull-input.ply\"),V,F);\n#endif\n\n#ifdef IGL_PEEL_OUTER_HULL_LAYERS_DEBUG\n  cout<<\"resize output ...\"<<endl;\n#endif\n  // keep track of iteration parity and whether flipped in hull\n  MatrixXF Fr = F;\n  I.resize(m,1);\n  flip.resize(m,1);\n  // Keep track of index map\n  MatrixXI IM = igl::LinSpaced<MatrixXI >(m,0,m-1);\n  // This is O(n * layers)\n  MatrixXI P(m,1);\n  Index iter = 0;\n  while(Fr.size() > 0)\n  {\n    assert(Fr.rows() == IM.rows());\n    // Compute outer hull of current Fr\n    MatrixXF Fo;\n    MatrixXI Jo;\n    MatrixXflip flipr;\n#ifdef IGL_PEEL_OUTER_HULL_LAYERS_DEBUG\n  {\n      cout<<\"calling outer hull...\" << iter <<endl;\n      std::stringstream ss;\n      ss << \"outer_hull_\" << iter << \".ply\";\n      Eigen::MatrixXd vertices(V.rows(), V.cols());\n      std::transform(V.data(), V.data() + V.rows()*V.cols(),\n              vertices.data(),\n              [](typename DerivedV::Scalar val)\n              {return CGAL::to_double(val); });\n      writePLY(ss.str(), vertices, Fr);\n  }\n#endif\n    outer_hull_legacy(V,Fr,Fo,Jo,flipr);\n#ifdef IGL_PEEL_OUTER_HULL_LAYERS_DEBUG\n  writePLY(STR(\"outer-hull-output-\"<<iter<<\".ply\"),V,Fo);\n  cout<<\"reindex, flip...\"<<endl;\n#endif\n    assert(Fo.rows() != 0);\n    assert(Fo.rows() == Jo.rows());\n    // all faces in Fo of Fr\n    vector<bool> in_outer(Fr.rows(),false);\n    for(Index g = 0;g<Jo.rows();g++)\n    {\n      I(IM(Jo(g))) = iter;\n      P(IM(Jo(g))) = iter;\n      in_outer[Jo(g)] = true;\n      flip(IM(Jo(g))) = flipr(Jo(g));\n    }\n    // Fr = Fr - Fo\n    // update IM\n    MatrixXF prev_Fr = Fr;\n    MatrixXI prev_IM = IM;\n    Fr.resize(prev_Fr.rows() - Fo.rows(),F.cols());\n    IM.resize(Fr.rows());\n    {\n      Index g = 0;\n      for(Index f = 0;f<prev_Fr.rows();f++)\n      {\n        if(!in_outer[f])\n        {\n          Fr.row(g) = prev_Fr.row(f);\n          IM(g) = prev_IM(f);\n          g++;\n        }\n      }\n    }\n    iter++;\n  }\n  return iter;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\n#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>\ntemplate unsigned long igl::copyleft::cgal::peel_outer_hull_layers<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate size_t igl::copyleft::cgal::peel_outer_hull_layers<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/peel_outer_hull_layers.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_CGAL_PEEL_OUTER_HULL_LAYERS_H\n#define IGL_COPYLEFT_CGAL_PEEL_OUTER_HULL_LAYERS_H\n#include \"../../igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // Computes necessary generic information for boolean operations by\n      // successively \"peeling\" off the \"outer hull\" of a mesh (V,F) resulting from\n      // \"resolving\" all (self-)intersections.\n      //\n      // Inputs:\n      //   V  #V by 3 list of vertex positions\n      //   F  #F by 3 list of triangle indices into V\n      // Outputs:\n      //   I  #F list of which peel Iation a facet belongs \n      //   flip  #F list of whether a facet's orientation was flipped when facet\n      //     \"peeled\" into its associated outer hull layer.\n      // Returns number of peels\n      template <\n        typename DerivedV,\n        typename DerivedF,\n        typename DerivedI,\n        typename Derivedflip>\n      IGL_INLINE size_t peel_outer_hull_layers(\n        const Eigen::PlainObjectBase<DerivedV > & V,\n        const Eigen::PlainObjectBase<DerivedF > & F,\n        Eigen::PlainObjectBase<DerivedI > & I,\n        Eigen::PlainObjectBase<Derivedflip > & flip);\n    }\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"peel_outer_hull_layers.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/peel_winding_number_layers.cpp",
    "content": "#include \"peel_winding_number_layers.h\"\n\n#include <cassert>\n\n#include \"propagate_winding_numbers.h\"\n\ntemplate<\ntypename DerivedV,\ntypename DerivedF,\ntypename DerivedW >\nIGL_INLINE size_t igl::copyleft::cgal::peel_winding_number_layers(\n        const Eigen::PlainObjectBase<DerivedV > & V,\n        const Eigen::PlainObjectBase<DerivedF > & F,\n        Eigen::PlainObjectBase<DerivedW>& W) {\n    const size_t num_faces = F.rows();\n    Eigen::VectorXi labels(num_faces);\n    labels.setZero();\n\n    Eigen::MatrixXi winding_numbers;\n    igl::copyleft::cgal::propagate_winding_numbers(V, F, labels, winding_numbers);\n    assert(winding_numbers.rows() == num_faces);\n    assert(winding_numbers.cols() == 2);\n\n    int min_w = winding_numbers.minCoeff();\n    int max_w = winding_numbers.maxCoeff();\n    assert(max_w > min_w);\n\n    W.resize(num_faces, 1);\n    for (size_t i=0; i<num_faces; i++) {\n        W(i, 0) = winding_numbers(i, 1);\n    }\n    return max_w - min_w;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/peel_winding_number_layers.h",
    "content": "#ifndef IGL_COPYLEFT_CGAL_PEEL_WINDING_NUMBER_LAYERS_H\n#define IGL_COPYLEFT_CGAL_PEEL_WINDING_NUMBER_LAYERS_H\n#include \"../../igl_inline.h\"\n#include <Eigen/Core>\n\nnamespace igl {\n  namespace copyleft {\n    namespace cgal {\n        template<\n            typename DerivedV,\n            typename DerivedF,\n            typename DerivedW >\n        IGL_INLINE size_t peel_winding_number_layers(\n                const Eigen::PlainObjectBase<DerivedV > & V,\n                const Eigen::PlainObjectBase<DerivedF > & F,\n                Eigen::PlainObjectBase<DerivedW>& W);\n    }\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"peel_winding_number_layers.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/piecewise_constant_winding_number.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"piecewise_constant_winding_number.h\"\n#include \"../../piecewise_constant_winding_number.h\"\n#include \"remesh_self_intersections.h\"\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\n#include <algorithm>\n\ntemplate < typename DerivedV, typename DerivedF>\nIGL_INLINE bool igl::copyleft::cgal::piecewise_constant_winding_number(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedF> & F)\n{\n  Eigen::Matrix<CGAL::Epeck::FT,Eigen::Dynamic,3> VV;\n  Eigen::Matrix<typename DerivedF::Scalar,Eigen::Dynamic,3> FF;\n  Eigen::Matrix<typename DerivedF::Index,Eigen::Dynamic,2> IF;\n  Eigen::Matrix<typename DerivedF::Index,Eigen::Dynamic,1> J;\n  Eigen::Matrix<typename DerivedV::Index,Eigen::Dynamic,1> UIM,IM;\n  // resolve intersections\n  remesh_self_intersections(V,F,{false,false,true},VV,FF,IF,J,IM);\n  return igl::piecewise_constant_winding_number(FF);\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/piecewise_constant_winding_number.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_CGAL_PIECEWISE_CONSTANT_WINDING_NUMBER_H\n#define IGL_COPYLEFT_CGAL_PIECEWISE_CONSTANT_WINDING_NUMBER_H\n#include \"../../igl_inline.h\"\n#include <Eigen/Core>\n#include <vector>\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // PIECEWISE_CONSTANT_WINDING_NUMBER Determine if a given mesh induces a\n      // piecewise constant winding number field: Is this mesh valid input to\n      // solid set operations.\n      // \n      // Inputs:\n      //   V  #V by 3 list of mesh vertex positions\n      //   F  #F by 3 list of triangle indices into V\n      // Returns true if the mesh _combinatorially_ induces a piecewise\n      // constant winding number field.\n      template <\n        typename DerivedV,\n        typename DerivedF>\n      IGL_INLINE bool piecewise_constant_winding_number(\n        const Eigen::PlainObjectBase<DerivedV> & V,\n        const Eigen::PlainObjectBase<DerivedF>& F);\n    }\n  }\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"piecewise_constant_winding_number.cpp\"\n#endif\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/point_mesh_squared_distance.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"point_mesh_squared_distance.h\"\n#include \"mesh_to_cgal_triangle_list.h\"\n#include \"assign_scalar.h\"\n\ntemplate <\n  typename Kernel,\n  typename DerivedP,\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedsqrD,\n  typename DerivedI,\n  typename DerivedC>\nIGL_INLINE void igl::copyleft::cgal::point_mesh_squared_distance(\n  const Eigen::PlainObjectBase<DerivedP> & P,\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedF> & F,\n        Eigen::PlainObjectBase<DerivedsqrD> & sqrD,\n        Eigen::PlainObjectBase<DerivedI> & I,\n        Eigen::PlainObjectBase<DerivedC> & C)\n{\n  using namespace std;\n  typedef CGAL::Triangle_3<Kernel> Triangle_3; \n  typedef typename std::vector<Triangle_3>::iterator Iterator;\n  typedef CGAL::AABB_triangle_primitive<Kernel, Iterator> Primitive;\n  typedef CGAL::AABB_traits<Kernel, Primitive> AABB_triangle_traits;\n  typedef CGAL::AABB_tree<AABB_triangle_traits> Tree;\n  Tree tree;\n  vector<Triangle_3> T;\n  point_mesh_squared_distance_precompute(V,F,tree,T);\n  return point_mesh_squared_distance(P,tree,T,sqrD,I,C);\n}\n\ntemplate <typename Kernel, typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::cgal::point_mesh_squared_distance_precompute(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  CGAL::AABB_tree<\n    CGAL::AABB_traits<Kernel, \n      CGAL::AABB_triangle_primitive<Kernel, \n        typename std::vector<CGAL::Triangle_3<Kernel> >::iterator\n      >\n    >\n  > & tree,\n  std::vector<CGAL::Triangle_3<Kernel> > & T)\n{\n  using namespace std;\n\n  typedef CGAL::Triangle_3<Kernel> Triangle_3; \n  typedef CGAL::Point_3<Kernel> Point_3; \n  typedef typename std::vector<Triangle_3>::iterator Iterator;\n  typedef CGAL::AABB_triangle_primitive<Kernel, Iterator> Primitive;\n  typedef CGAL::AABB_traits<Kernel, Primitive> AABB_triangle_traits;\n  typedef CGAL::AABB_tree<AABB_triangle_traits> Tree;\n\n  // Must be 3D\n  assert(V.cols() == 3);\n  // Must be triangles\n  assert(F.cols() == 3);\n\n  // WTF ALERT!!!! \n  //\n  // There's a bug in clang probably or at least in cgal. Without calling this\n  // line (I guess invoking some compilation from <vector>), clang will vomit\n  // errors inside CGAL.\n  //\n  // http://stackoverflow.com/questions/27748442/is-clangs-c11-support-reliable\n  T.reserve(0);\n\n  // Make list of cgal triangles\n  mesh_to_cgal_triangle_list(V,F,T);\n  tree.clear();\n  tree.insert(T.begin(),T.end());\n  tree.accelerate_distance_queries();\n  // accelerate_distance_queries doesn't seem actually to do _all_ of the\n  // precomputation. the tree (despite being const) will still do more\n  // precomputation and reorganizing on the first call of `closest_point` or\n  // `closest_point_and_primitive`. Therefor, call it once here.\n  tree.closest_point_and_primitive(Point_3(0,0,0));\n}\n\ntemplate <\n  typename Kernel,\n  typename DerivedP,\n  typename DerivedsqrD,\n  typename DerivedI,\n  typename DerivedC>\nIGL_INLINE void igl::copyleft::cgal::point_mesh_squared_distance(\n  const Eigen::PlainObjectBase<DerivedP> & P,\n  const CGAL::AABB_tree<\n    CGAL::AABB_traits<Kernel, \n      CGAL::AABB_triangle_primitive<Kernel, \n        typename std::vector<CGAL::Triangle_3<Kernel> >::iterator\n      >\n    >\n  > & tree,\n  const std::vector<CGAL::Triangle_3<Kernel> > & T,\n  Eigen::PlainObjectBase<DerivedsqrD> & sqrD,\n  Eigen::PlainObjectBase<DerivedI> & I,\n  Eigen::PlainObjectBase<DerivedC> & C)\n{\n  typedef CGAL::Triangle_3<Kernel> Triangle_3; \n  typedef typename std::vector<Triangle_3>::iterator Iterator;\n  typedef CGAL::AABB_triangle_primitive<Kernel, Iterator> Primitive;\n  typedef CGAL::AABB_traits<Kernel, Primitive> AABB_triangle_traits;\n  typedef CGAL::AABB_tree<AABB_triangle_traits> Tree;\n  typedef typename Tree::Point_and_primitive_id Point_and_primitive_id;\n  typedef CGAL::Point_3<Kernel>    Point_3;\n  assert(P.cols() == 3);\n  const int n = P.rows();\n  sqrD.resize(n,1);\n  I.resize(n,1);\n  C.resize(n,P.cols());\n  for(int p = 0;p < n;p++)\n  {\n    Point_3 query(P(p,0),P(p,1),P(p,2));\n    // Find closest point and primitive id\n    Point_and_primitive_id pp = tree.closest_point_and_primitive(query);\n    Point_3 closest_point = pp.first;\n    assign_scalar(closest_point[0],C(p,0));\n    assign_scalar(closest_point[1],C(p,1));\n    assign_scalar(closest_point[2],C(p,2));\n    assign_scalar((closest_point-query).squared_length(),sqrD(p));\n    I(p) = pp.second - T.begin();\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::copyleft::cgal::point_mesh_squared_distance<CGAL::Epeck, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/point_mesh_squared_distance.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_CGAL_POINT_MESH_SQUARED_DISTANCE_H\n#define IGL_COPYLEFT_CGAL_POINT_MESH_SQUARED_DISTANCE_H\n#include \"../../igl_inline.h\"\n#include <Eigen/Core>\n#include <vector>\n#include \"CGAL_includes.hpp\"\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // Compute distances from a set of points P to a triangle mesh (V,F)\n      //\n      // Templates:\n      //   Kernal  CGAL computation and construction kernel (e.g.\n      //     CGAL::Simple_cartesian<double>)\n      // Inputs:\n      //   P  #P by 3 list of query point positions\n      //   V  #V by 3 list of vertex positions\n      //   F  #F by 3 list of triangle indices\n      // Outputs:\n      //   sqrD  #P list of smallest squared distances\n      //   I  #P list of facet indices corresponding to smallest distances\n      //   C  #P by 3 list of closest points\n      //\n      // Known bugs: This only computes distances to triangles. So unreferenced\n      // vertices and degenerate triangles (segments) are ignored.\n      template <\n        typename Kernel,\n        typename DerivedP,\n        typename DerivedV,\n        typename DerivedF,\n        typename DerivedsqrD,\n        typename DerivedI,\n        typename DerivedC>\n      IGL_INLINE void point_mesh_squared_distance(\n        const Eigen::PlainObjectBase<DerivedP> & P,\n        const Eigen::PlainObjectBase<DerivedV> & V,\n        const Eigen::PlainObjectBase<DerivedF> & F,\n              Eigen::PlainObjectBase<DerivedsqrD> & sqrD,\n              Eigen::PlainObjectBase<DerivedI> & I,\n              Eigen::PlainObjectBase<DerivedC> & C);\n      // Probably can do this in a way that we don't pass around `tree` and `T`\n      //\n      // Outputs:\n      //   tree  CGAL's AABB tree\n      //   T  list of CGAL triangles in order of F (for determining which was found\n      //     in computation)\n      template <\n        typename Kernel,\n        typename DerivedV,\n        typename DerivedF\n        >\n      IGL_INLINE void point_mesh_squared_distance_precompute(\n        const Eigen::PlainObjectBase<DerivedV> & V,\n        const Eigen::PlainObjectBase<DerivedF> & F,\n        CGAL::AABB_tree<\n          CGAL::AABB_traits<Kernel, \n            CGAL::AABB_triangle_primitive<Kernel, \n              typename std::vector<CGAL::Triangle_3<Kernel> >::iterator\n            >\n          >\n        > & tree,\n        std::vector<CGAL::Triangle_3<Kernel> > & T);\n      // Inputs:\n      //  see above\n      // Outputs:\n      //  see above\n      template <\n        typename Kernel,\n        typename DerivedP,\n        typename DerivedsqrD,\n        typename DerivedI,\n        typename DerivedC>\n      IGL_INLINE void point_mesh_squared_distance(\n        const Eigen::PlainObjectBase<DerivedP> & P,\n        const CGAL::AABB_tree<\n          CGAL::AABB_traits<Kernel, \n            CGAL::AABB_triangle_primitive<Kernel, \n              typename std::vector<CGAL::Triangle_3<Kernel> >::iterator\n            >\n          >\n        > & tree,\n        const std::vector<CGAL::Triangle_3<Kernel> > & T,\n        Eigen::PlainObjectBase<DerivedsqrD> & sqrD,\n        Eigen::PlainObjectBase<DerivedI> & I,\n        Eigen::PlainObjectBase<DerivedC> & C);\n    }\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"point_mesh_squared_distance.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/point_segment_squared_distance.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"point_segment_squared_distance.h\"\n\ntemplate < typename Kernel>\nIGL_INLINE void igl::copyleft::cgal::point_segment_squared_distance(\n  const CGAL::Point_3<Kernel> & P1,\n  const CGAL::Segment_3<Kernel> & S2,\n  CGAL::Point_3<Kernel> & P2,\n  typename Kernel::FT & d)\n{\n  if(S2.is_degenerate())\n  {\n    P2 = S2.source();\n    d = (P1-P2).squared_length();\n    return;\n  }\n  // http://stackoverflow.com/a/1501725/148668\n  const auto sqr_len = S2.squared_length();\n  assert(sqr_len != 0);\n  const auto & V = S2.source();\n  const auto & W = S2.target();\n  const auto t = (P1-V).dot(W-V)/sqr_len;\n  if(t<0)\n  {\n    P2 = V;\n  }else if(t>1)\n  {\n    P2 = W;\n  }else\n  {\n    P2 = V  + t*(W-V);\n  }\n  d = (P1-P2).squared_length();\n}\n\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/point_segment_squared_distance.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_CGAL_POINT_SEGMENT_SQUARED_DISTANCE_H\n#define IGL_COPYLEFT_CGAL_POINT_SEGMENT_SQUARED_DISTANCE_H\n#include \"../../igl_inline.h\"\n#include <CGAL/Segment_3.h>\n#include <CGAL/Point_3.h>\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // Given a point P1 and segment S2 find the points on each of closest\n      // approach and the squared distance thereof.\n      // \n      // Inputs:\n      //   P1  point\n      //   S2  segment\n      // Outputs:\n      //   P2  point on S2 closest to P1\n      //   d  distance betwee P1 and S2\n      template < typename Kernel>\n      IGL_INLINE void point_segment_squared_distance(\n          const CGAL::Point_3<Kernel> & P1,\n          const CGAL::Segment_3<Kernel> & S2,\n          CGAL::Point_3<Kernel> & P2,\n          typename Kernel::FT & d\n          );\n\n    }\n  }\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"point_segment_squared_distance.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/point_solid_signed_squared_distance.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"point_solid_signed_squared_distance.h\"\n#include \"points_inside_component.h\"\n#include \"point_mesh_squared_distance.h\"\n#include \"../../list_to_matrix.h\"\n#include \"../../slice_mask.h\"\n#include <vector>\n#include <Eigen/Core>\n\ntemplate <\n  typename DerivedQ,\n  typename DerivedVB,\n  typename DerivedFB,\n  typename DerivedD>\nIGL_INLINE void igl::copyleft::cgal::point_solid_signed_squared_distance(\n  const Eigen::PlainObjectBase<DerivedQ> & Q,\n  const Eigen::PlainObjectBase<DerivedVB> & VB,\n  const Eigen::PlainObjectBase<DerivedFB> & FB,\n  Eigen::PlainObjectBase<DerivedD> & D)\n{\n  // compute unsigned distances\n  Eigen::VectorXi I;\n  DerivedVB C;\n  point_mesh_squared_distance<CGAL::Epeck>(Q,VB,FB,D,I,C);\n  // Collect queries that have non-zero distance\n  Eigen::Array<bool,Eigen::Dynamic,1> NZ = D.array()!=0;\n  // Compute sign for non-zero distance queries\n  DerivedQ QNZ;\n  slice_mask(Q,NZ,1,QNZ);\n  Eigen::Array<bool,Eigen::Dynamic,1> DNZ;\n  igl::copyleft::cgal::points_inside_component(VB,FB,QNZ,DNZ);\n  // Apply sign to distances\n  DerivedD S = DerivedD::Zero(Q.rows(),1);\n  {\n    int k = 0;\n    for(int q = 0;q<Q.rows();q++)\n    {\n      if(NZ(q))\n      {\n        D(q) *= DNZ(k++) ? -1. : 1.;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/point_solid_signed_squared_distance.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_CGAL_POINT_SOLID_SIGNED_SQUARED_DISTANCE_H\n#define IGL_COPYLEFT_CGAL_POINT_SOLID_SIGNED_SQUARED_DISTANCE_H\n#include \"../../igl_inline.h\"\n#include <Eigen/Core>\n\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // POINT_SOLID_SIGNED_SQUARED_DISTANCE Given a set of points (Q) and the\n      // boundary mesh (VB,FB) of a solid (as defined in [Zhou et al. 2016],\n      // determine the signed squared distance for each point q in Q so that d(q,B) is\n      // negative if inside and positive if outside.\n      //\n      // Inputs:\n      //   Q  #Q by 3 list of query point positions\n      //   VB  #VB by 3 list of mesh vertex positions of B\n      //   FB  #FB by 3 list of mesh triangle indices into VB\n      // Outputs:\n      //   D\n      template <\n        typename DerivedQ,\n        typename DerivedVB,\n        typename DerivedFB,\n        typename DerivedD>\n      IGL_INLINE void point_solid_signed_squared_distance(\n        const Eigen::PlainObjectBase<DerivedQ> & Q,\n        const Eigen::PlainObjectBase<DerivedVB> & VB,\n        const Eigen::PlainObjectBase<DerivedFB> & FB,\n        Eigen::PlainObjectBase<DerivedD> & D);\n    }\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"point_solid_signed_squared_distance.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/point_triangle_squared_distance.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"point_triangle_squared_distance.h\"\n#include <CGAL/Segment_3.h>\ntemplate < typename Kernel>\nIGL_INLINE void point_triangle_squared_distance(\n  const CGAL::Point_3<Kernel> & P1,\n  const CGAL::Triangle_3<Kernel> & T2,\n  CGAL::Point_3<Kernel> & P2,\n  typename Kernel::FT & d)\n{\n  assert(!T2.is_degenerate());\n  if(T2.has_on(P1))\n  {\n    P2 = P1;\n    d = 0;\n    return;\n  }\n  const auto proj_1 = T2.supporting_plane().projection(P2);\n  if(T2.has_on(proj_1))\n  {\n    P2 = proj_1;\n    d = (proj_1-P1).squared_length();\n    return;\n  }\n  // closest point must be on the boundary\n  bool first = true;\n  // loop over edges\n  for(int i=0;i<3;i++)\n  {\n    CGAL::Point_3<Kernel> P2i;\n    typename Kernel::FT di;\n    const CGAL::Segment_3<Kernel> si( T2.vertex(i+1), T2.vertex(i+2));\n    point_segment_squared_distance(P1,si,P2i,di);\n    if(first || di < d)\n    {\n      first = false;\n      d = di;\n      P2 = P2i;\n    }\n  }\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/point_triangle_squared_distance.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_CGAL_POINT_TRIANGLE_SQUARED_DISTANCE_H\n#define IGL_COPYLEFT_CGAL_POINT_TRIANGLE_SQUARED_DISTANCE_H\n#include \"../../igl_inline.h\"\n#include <CGAL/Triangle_3.h>\n#include <CGAL/Point_3.h>\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // Given a point P1 and triangle T2 find the points on each of closest\n      // approach and the squared distance thereof.\n      // \n      // Inputs:\n      //   P1  point\n      //   T2  triangle\n      // Outputs:\n      //   P2  point on T2 closest to P1\n      //   d  distance betwee P1 and T2\n      template < typename Kernel>\n      IGL_INLINE void point_triangle_squared_distance(\n        const CGAL::Point_3<Kernel> & P1,\n        const CGAL::Triangle_3<Kernel> & T2,\n        CGAL::Point_3<Kernel> & P2,\n        typename Kernel::FT & d\n        );\n\n    }\n  }\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"point_triangle_squared_distance.cpp\"\n#endif\n\n#endif\n\n\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/points_inside_component.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Qingnan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"points_inside_component.h\"\n#include \"../../LinSpaced.h\"\n#include \"order_facets_around_edge.h\"\n#include \"assign_scalar.h\"\n\n#include <CGAL/AABB_tree.h>\n#include <CGAL/AABB_traits.h>\n#include <CGAL/AABB_triangle_primitive.h>\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\n\n#include <cassert>\n#include <list>\n#include <limits>\n#include <vector>\n\n\nnamespace igl {\n  namespace copyleft \n  {\n    namespace cgal {\n        namespace points_inside_component_helper {\n            typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;\n            typedef Kernel::Ray_3 Ray_3;\n            typedef Kernel::Point_3 Point_3;\n            typedef Kernel::Vector_3 Vector_3;\n            typedef Kernel::Triangle_3 Triangle;\n            typedef Kernel::Plane_3 Plane_3;\n            typedef std::vector<Triangle>::iterator Iterator;\n            typedef CGAL::AABB_triangle_primitive<Kernel, Iterator> Primitive;\n            typedef CGAL::AABB_traits<Kernel, Primitive> AABB_triangle_traits;\n            typedef CGAL::AABB_tree<AABB_triangle_traits> Tree;\n\n            template<typename DerivedF, typename DerivedI>\n            void extract_adj_faces(\n                    const Eigen::PlainObjectBase<DerivedF>& F,\n                    const Eigen::PlainObjectBase<DerivedI>& I,\n                    const size_t s, const size_t d,\n                    std::vector<int>& adj_faces) {\n                const size_t num_faces = I.rows();\n                for (size_t i=0; i<num_faces; i++) {\n                    Eigen::Vector3i f = F.row(I(i, 0));\n                    if (((size_t)f[0] == s && (size_t)f[1] == d) ||\n                        ((size_t)f[1] == s && (size_t)f[2] == d) ||\n                        ((size_t)f[2] == s && (size_t)f[0] == d)) {\n                        adj_faces.push_back((I(i, 0)+1) * -1);\n                        continue;\n                    }\n                    if (((size_t)f[0] == d && (size_t)f[1] == s) ||\n                        ((size_t)f[1] == d && (size_t)f[2] == s) ||\n                        ((size_t)f[2] == d && (size_t)f[0] == s)) {\n                        adj_faces.push_back(I(i, 0)+1);\n                        continue;\n                    }\n                }\n            }\n\n            template<typename DerivedF, typename DerivedI>\n            void extract_adj_vertices(\n                    const Eigen::PlainObjectBase<DerivedF>& F,\n                    const Eigen::PlainObjectBase<DerivedI>& I,\n                    const size_t v, std::vector<int>& adj_vertices) {\n                std::set<size_t> unique_adj_vertices;\n                const size_t num_faces = I.rows();\n                for (size_t i=0; i<num_faces; i++) {\n                    Eigen::Vector3i f = F.row(I(i, 0));\n                    if ((size_t)f[0] == v) {\n                        unique_adj_vertices.insert(f[1]);\n                        unique_adj_vertices.insert(f[2]);\n                    } else if ((size_t)f[1] == v) {\n                        unique_adj_vertices.insert(f[0]);\n                        unique_adj_vertices.insert(f[2]);\n                    } else if ((size_t)f[2] == v) {\n                        unique_adj_vertices.insert(f[0]);\n                        unique_adj_vertices.insert(f[1]);\n                    }\n                }\n                adj_vertices.resize(unique_adj_vertices.size());\n                std::copy(unique_adj_vertices.begin(),\n                        unique_adj_vertices.end(),\n                        adj_vertices.begin());\n            }\n\n            template<typename DerivedV, typename DerivedF, typename DerivedI>\n            bool determine_point_edge_orientation(\n                    const Eigen::PlainObjectBase<DerivedV>& V,\n                    const Eigen::PlainObjectBase<DerivedF>& F,\n                    const Eigen::PlainObjectBase<DerivedI>& I,\n                    const Point_3& query, size_t s, size_t d) {\n                // Algorithm:\n                //\n                // Order the adj faces around the edge (s,d) clockwise using\n                // query point as pivot.  (i.e. The first face of the ordering\n                // is directly after the pivot point, and the last face is\n                // directly before the pivot.)\n                //\n                // The point is outside if the first and last faces of the\n                // ordering forms a convex angle.  This check can be done\n                // without any construction by looking at the orientation of the\n                // faces.  The angle is convex iff the first face contains (s,d)\n                // as an edge and the last face contains (d,s) as an edge.\n                //\n                // The point is inside if the first and last faces of the\n                // ordering forms a concave angle.  That is the first face\n                // contains (d,s) as an edge and the last face contains (s,d) as\n                // an edge.\n                //\n                // In the special case of duplicated faces. I.e. multiple faces\n                // sharing the same 3 corners, but not necessarily the same\n                // orientation.  The ordering will always rank faces containing\n                // edge (s,d) before faces containing edge (d,s).\n                //\n                // Therefore, if there are any duplicates of the first faces,\n                // the ordering will always choose the one with edge (s,d) if\n                // possible.  The same for the last face.\n                //\n                // In the very degenerated case where the first and last face\n                // are duplicates, but with different orientations, it is\n                // equally valid to think the angle formed by them is either 0\n                // or 360 degrees.  By default, 0 degree is used, and thus the\n                // query point is outside.\n\n                std::vector<int> adj_faces;\n                extract_adj_faces(F, I, s, d, adj_faces);\n                const size_t num_adj_faces = adj_faces.size();\n                assert(num_adj_faces > 0);\n\n                DerivedV pivot_point(1, 3);\n                igl::copyleft::cgal::assign_scalar(query.x(), pivot_point(0, 0));\n                igl::copyleft::cgal::assign_scalar(query.y(), pivot_point(0, 1));\n                igl::copyleft::cgal::assign_scalar(query.z(), pivot_point(0, 2));\n                Eigen::VectorXi order;\n                order_facets_around_edge(V, F, s, d,\n                        adj_faces, pivot_point, order);\n                assert((size_t)order.size() == num_adj_faces);\n                if (adj_faces[order[0]] > 0 &&\n                    adj_faces[order[num_adj_faces-1] < 0]) {\n                    return true;\n                } else if (adj_faces[order[0]] < 0 &&\n                    adj_faces[order[num_adj_faces-1] > 0]) {\n                    return false;\n                } else {\n                    throw \"The input mesh does not represent a valid volume\";\n                }\n                throw \"The input mesh does not represent a valid volume\";\n                return false;\n            }\n\n            template<typename DerivedV, typename DerivedF, typename DerivedI>\n            bool determine_point_vertex_orientation(\n                    const Eigen::PlainObjectBase<DerivedV>& V,\n                    const Eigen::PlainObjectBase<DerivedF>& F,\n                    const Eigen::PlainObjectBase<DerivedI>& I,\n                    const Point_3& query, size_t s) {\n                std::vector<int> adj_vertices;\n                extract_adj_vertices(F, I, s, adj_vertices);\n                const size_t num_adj_vertices = adj_vertices.size();\n\n                std::vector<Point_3> adj_points;\n                for (size_t i=0; i<num_adj_vertices; i++) {\n                    const size_t vi = adj_vertices[i];\n                    adj_points.emplace_back(V(vi,0), V(vi,1), V(vi,2));\n                }\n\n                // A plane is on the exterior if all adj_points lies on or to\n                // one side of the plane.\n                auto is_on_exterior = [&](const Plane_3& separator) -> bool{\n                    size_t positive=0;\n                    size_t negative=0;\n                    size_t coplanar=0;\n                    for (const auto& point : adj_points) {\n                        switch(separator.oriented_side(point)) {\n                            case CGAL::ON_POSITIVE_SIDE:\n                                positive++;\n                                break;\n                            case CGAL::ON_NEGATIVE_SIDE:\n                                negative++;\n                                break;\n                            case CGAL::ON_ORIENTED_BOUNDARY:\n                                coplanar++;\n                                break;\n                            default:\n                                throw \"Unknown plane-point orientation\";\n                        }\n                    }\n                    auto query_orientation = separator.oriented_side(query);\n                    bool r =\n                        (positive == 0 && query_orientation == CGAL::POSITIVE)\n                        ||\n                        (negative == 0 && query_orientation == CGAL::NEGATIVE);\n                    return r;\n                };\n\n                size_t d = std::numeric_limits<size_t>::max();\n                Point_3 p(V(s,0), V(s,1), V(s,2));\n                for (size_t i=0; i<num_adj_vertices; i++) {\n                    const size_t vi = adj_vertices[i];\n                    for (size_t j=i+1; j<num_adj_vertices; j++) {\n                        Plane_3 separator(p, adj_points[i], adj_points[j]);\n                        if (separator.is_degenerate()) {\n                            throw \"Input mesh contains degenerated faces\";\n                        }\n                        if (is_on_exterior(separator)) {\n                            d = vi;\n                            assert(!CGAL::collinear(p, adj_points[i], query));\n                            break;\n                        }\n                    }\n                    if (d < (size_t)V.rows()) break;\n                }\n                if (d > (size_t)V.rows()) {\n                    // All adj faces are coplanar, use the first edge.\n                    d = adj_vertices[0];\n                }\n                return determine_point_edge_orientation(V, F, I, query, s, d);\n            }\n\n            template<typename DerivedV, typename DerivedF, typename DerivedI>\n            bool determine_point_face_orientation(\n                    const Eigen::PlainObjectBase<DerivedV>& V,\n                    const Eigen::PlainObjectBase<DerivedF>& F,\n                    const Eigen::PlainObjectBase<DerivedI>& I,\n                    const Point_3& query, size_t fid) {\n                // Algorithm: A point is on the inside of a face if the\n                // tetrahedron formed by them is negatively oriented.\n\n                Eigen::Vector3i f = F.row(I(fid, 0));\n                const Point_3 v0(V(f[0], 0), V(f[0], 1), V(f[0], 2));\n                const Point_3 v1(V(f[1], 0), V(f[1], 1), V(f[1], 2));\n                const Point_3 v2(V(f[2], 0), V(f[2], 1), V(f[2], 2));\n                auto result = CGAL::orientation(v0, v1, v2, query);\n                if (result == CGAL::COPLANAR) {\n                    throw \"Cannot determine inside/outside because query point lies exactly on the input surface.\";\n                }\n                return result == CGAL::NEGATIVE;\n            }\n        }\n    }\n  }\n}\n\ntemplate<typename DerivedV, typename DerivedF, typename DerivedI,\n    typename DerivedP, typename DerivedB>\nIGL_INLINE void igl::copyleft::cgal::points_inside_component(\n        const Eigen::PlainObjectBase<DerivedV>& V,\n        const Eigen::PlainObjectBase<DerivedF>& F,\n        const Eigen::PlainObjectBase<DerivedI>& I,\n        const Eigen::PlainObjectBase<DerivedP>& P,\n        Eigen::PlainObjectBase<DerivedB>& inside) {\n    using namespace igl::copyleft::cgal::points_inside_component_helper;\n    if (F.rows() <= 0 || I.rows() <= 0) {\n        throw \"Inside check cannot be done on empty facet component.\";\n    }\n\n    const size_t num_faces = I.rows();\n    std::vector<Triangle> triangles;\n    for (size_t i=0; i<num_faces; i++) {\n        const Eigen::Vector3i f = F.row(I(i, 0));\n        triangles.emplace_back(\n                Point_3(V(f[0], 0), V(f[0], 1), V(f[0], 2)),\n                Point_3(V(f[1], 0), V(f[1], 1), V(f[1], 2)),\n                Point_3(V(f[2], 0), V(f[2], 1), V(f[2], 2)));\n        if (triangles.back().is_degenerate()) {\n            throw \"Input facet components contains degenerated triangles\";\n        }\n    }\n    Tree tree(triangles.begin(), triangles.end());\n    tree.accelerate_distance_queries();\n\n    enum ElementType { VERTEX, EDGE, FACE };\n    auto determine_element_type = [&](\n            size_t fid, const Point_3& p, size_t& element_index) -> ElementType{\n        const Eigen::Vector3i f = F.row(I(fid, 0));\n        const Point_3 p0(V(f[0], 0), V(f[0], 1), V(f[0], 2));\n        const Point_3 p1(V(f[1], 0), V(f[1], 1), V(f[1], 2));\n        const Point_3 p2(V(f[2], 0), V(f[2], 1), V(f[2], 2));\n\n        if (p == p0) { element_index = 0; return VERTEX; }\n        if (p == p1) { element_index = 1; return VERTEX; }\n        if (p == p2) { element_index = 2; return VERTEX; }\n        if (CGAL::collinear(p0, p1, p)) { element_index = 2; return EDGE; }\n        if (CGAL::collinear(p1, p2, p)) { element_index = 0; return EDGE; }\n        if (CGAL::collinear(p2, p0, p)) { element_index = 1; return EDGE; }\n\n        element_index = 0;\n        return FACE;\n    };\n\n    const size_t num_queries = P.rows();\n    inside.resize(num_queries, 1);\n    for (size_t i=0; i<num_queries; i++) {\n        const Point_3 query(P(i,0), P(i,1), P(i,2));\n        auto projection = tree.closest_point_and_primitive(query);\n        auto closest_point = projection.first;\n        size_t fid = projection.second - triangles.begin();\n\n        size_t element_index;\n        switch (determine_element_type(fid, closest_point, element_index)) {\n            case VERTEX:\n                {\n                    const size_t s = F(I(fid, 0), element_index);\n                    inside(i,0) = determine_point_vertex_orientation(\n                            V, F, I, query, s);\n                }\n                break;\n            case EDGE:\n                {\n                    const size_t s = F(I(fid, 0), (element_index+1)%3);\n                    const size_t d = F(I(fid, 0), (element_index+2)%3);\n                    inside(i,0) = determine_point_edge_orientation(\n                            V, F, I, query, s, d);\n                }\n                break;\n            case FACE:\n                inside(i,0) = determine_point_face_orientation(V, F, I, query, fid);\n                break;\n            default:\n                throw \"Unknow closest element type!\";\n        }\n    }\n}\n\ntemplate<typename DerivedV, typename DerivedF, typename DerivedP,\n    typename DerivedB>\nIGL_INLINE void igl::copyleft::cgal::points_inside_component(\n        const Eigen::PlainObjectBase<DerivedV>& V,\n        const Eigen::PlainObjectBase<DerivedF>& F,\n        const Eigen::PlainObjectBase<DerivedP>& P,\n        Eigen::PlainObjectBase<DerivedB>& inside) {\n    Eigen::VectorXi I = igl::LinSpaced<Eigen::VectorXi>(F.rows(), 0, F.rows()-1);\n    igl::copyleft::cgal::points_inside_component(V, F, I, P, inside);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::copyleft::cgal::points_inside_component< Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<   int, -1, -1, 0, -1, -1>, Eigen::Matrix<   int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<   int, -1, -1, 0, -1, -1> > ( Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<   int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<   int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<   int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::copyleft::cgal::points_inside_component< Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<   int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<   int, -1, -1, 0, -1, -1> > ( Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix< int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<   int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::copyleft::cgal::points_inside_component<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::points_inside_component<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::points_inside_component<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::points_inside_component<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/points_inside_component.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Qingnan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_CGAL_POINTS_INSIDE_COMPONENTS\n#define IGL_COPYLEFT_CGAL_POINTS_INSIDE_COMPONENTS\n\n#include \"../../igl_inline.h\"\n#include <Eigen/Core>\n#include <vector>\n\nnamespace igl \n{\n  namespace copyleft\n  {\n    namespace cgal {\n\n      // Determine if queries points P are inside of connected facet component\n      // (V, F, I), where I indicates a subset of facets that forms the\n      // component.\n      //\n      // Precondition:\n      // The input mesh must be a closed, self-intersection free,\n      // non-degenerated surface.  Queries points must be either inside or\n      // outside of the mesh (i.e. not on the surface of the mesh).\n      //\n      // Inputs:\n      //   V  #V by 3 array of vertex positions.\n      //   F  #F by 3 array of triangles.\n      //   I  #I list of triangle indices to consider.\n      //   P  #P by 3 array of query points.\n      //\n      // Outputs:\n      //   inside  #P list of booleans that is true iff the corresponding\n      //           query point is inside of the mesh.\n      template<\n        typename DerivedV,\n        typename DerivedF,\n        typename DerivedI,\n        typename DerivedP,\n        typename DerivedB>\n      IGL_INLINE void points_inside_component(\n        const Eigen::PlainObjectBase<DerivedV>& V,\n        const Eigen::PlainObjectBase<DerivedF>& F,\n        const Eigen::PlainObjectBase<DerivedI>& I,\n        const Eigen::PlainObjectBase<DerivedP>& P,\n        Eigen::PlainObjectBase<DerivedB>& inside);\n\n      // Determine if query points P is inside of the mesh (V, F).\n      // See above for precondition and I/O specs.\n      template<\n        typename DerivedV,\n        typename DerivedF,\n        typename DerivedP,\n        typename DerivedB>\n      IGL_INLINE void points_inside_component(\n          const Eigen::PlainObjectBase<DerivedV>& V,\n          const Eigen::PlainObjectBase<DerivedF>& F,\n          const Eigen::PlainObjectBase<DerivedP>& P,\n          Eigen::PlainObjectBase<DerivedB>& inside);\n    }\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#include \"points_inside_component.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/polyhedron_to_mesh.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"polyhedron_to_mesh.h\"\n#include <CGAL/Polyhedron_3.h>\n\ntemplate <typename Polyhedron>\nIGL_INLINE void igl::copyleft::cgal::polyhedron_to_mesh(\n  const Polyhedron & poly,\n  Eigen::MatrixXd & V,\n  Eigen::MatrixXi & F)\n{\n  using namespace std;\n  V.resize(poly.size_of_vertices(),3);\n  F.resize(poly.size_of_facets(),3);\n  typedef typename Polyhedron::Vertex_const_iterator Vertex_iterator;\n  std::map<Vertex_iterator,size_t> vertex_to_index;\n  {\n    size_t v = 0;\n    for(\n      typename Polyhedron::Vertex_const_iterator p = poly.vertices_begin();\n      p != poly.vertices_end();\n      p++)\n    {\n      V(v,0) = p->point().x();\n      V(v,1) = p->point().y();\n      V(v,2) = p->point().z();\n      vertex_to_index[p] = v;\n      v++;\n    }\n  }\n  {\n    size_t f = 0;\n    for(\n      typename Polyhedron::Facet_const_iterator facet = poly.facets_begin();\n      facet != poly.facets_end();\n      ++facet)\n    {\n      typename Polyhedron::Halfedge_around_facet_const_circulator he = \n        facet->facet_begin();\n      // Facets in polyhedral surfaces are at least triangles.\n      assert(CGAL::circulator_size(he) == 3 && \"Facets should be triangles\");\n      size_t c = 0;\n      do {\n        //// This is stooopidly slow\n        // F(f,c) = std::distance(poly.vertices_begin(), he->vertex());\n        F(f,c) = vertex_to_index[he->vertex()];\n        c++;\n      } while ( ++he != facet->facet_begin());\n      f++;\n    }\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#include <CGAL/Simple_cartesian.h>\n#include <CGAL/Polyhedron_items_with_id_3.h>\ntemplate void igl::copyleft::cgal::polyhedron_to_mesh<CGAL::Polyhedron_3<CGAL::Simple_cartesian<double>, CGAL::Polyhedron_items_with_id_3, CGAL::HalfedgeDS_default, std::allocator<int> > >(CGAL::Polyhedron_3<CGAL::Simple_cartesian<double>, CGAL::Polyhedron_items_with_id_3, CGAL::HalfedgeDS_default, std::allocator<int> > const&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/polyhedron_to_mesh.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_CGAL_POLYHEDRON_TO_MESH_H\n#define IGL_COPYLEFT_CGAL_POLYHEDRON_TO_MESH_H\n#include \"../../igl_inline.h\"\n#include <Eigen/Core>\n\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // Convert a CGAL Polyhedron to a mesh (V,F)\n      //\n      // Templates:\n      //   Polyhedron  CGAL Polyhedron type (e.g. Polyhedron_3)\n      // Inputs:\n      //   poly  cgal polyhedron\n      // Outputs:\n      //   V  #V by 3 list of vertex positions\n      //   F  #F by 3 list of triangle indices\n      template <typename Polyhedron>\n      IGL_INLINE void polyhedron_to_mesh(\n        const Polyhedron & poly,\n        Eigen::MatrixXd & V,\n        Eigen::MatrixXi & F);\n    }\n  }\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"polyhedron_to_mesh.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/projected_cdt.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"projected_cdt.h\"\n#include \"insert_into_cdt.h\"\n#include \"assign_scalar.h\"\n#include \"../../list_to_matrix.h\"\ntemplate <typename Kernel, typename Index>\nIGL_INLINE void igl::copyleft::cgal::projected_cdt(\n  const std::vector<CGAL::Object> & objects,\n  const CGAL::Plane_3<Kernel> & P,\n  std::vector<CGAL::Point_3<Kernel> >& vertices,\n  std::vector<std::vector<Index> >& faces)\n{\n  typedef CGAL::Triangulation_vertex_base_2<Kernel>  TVB_2;\n  typedef CGAL::Constrained_triangulation_face_base_2<Kernel> CTFB_2;\n  typedef CGAL::Triangulation_data_structure_2<TVB_2,CTFB_2> TDS_2;\n  typedef CGAL::Exact_intersections_tag Itag;\n  typedef CGAL::Constrained_Delaunay_triangulation_2<Kernel,TDS_2,Itag> CDT_2;\n  typedef CGAL::Constrained_triangulation_plus_2<CDT_2> CDT_plus_2;\n  CDT_plus_2 cdt;\n  for(const auto & obj : objects) insert_into_cdt(obj,P,cdt);\n  // Read off vertices of the cdt, remembering index\n  std::map<typename CDT_plus_2::Vertex_handle,Index> v2i;\n  size_t count=0;\n  for (\n    auto itr = cdt.finite_vertices_begin();\n    itr != cdt.finite_vertices_end(); \n    itr++) \n  {\n    vertices.push_back(P.to_3d(itr->point()));\n    v2i[itr] = count;\n    count++;\n  }\n  // Read off faces and store index triples\n  for (\n    auto itr = cdt.finite_faces_begin();\n    itr != cdt.finite_faces_end(); \n    itr++)\n  {\n    faces.push_back( \n      { v2i[itr->vertex(0)], v2i[itr->vertex(1)], v2i[itr->vertex(2)] });\n  }\n}\n\ntemplate < typename Kernel, typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::cgal::projected_cdt(\n  const std::vector<CGAL::Object> & objects,\n  const CGAL::Plane_3<Kernel> & P,\n  Eigen::PlainObjectBase<DerivedV> & V,\n  Eigen::PlainObjectBase<DerivedF> & F)\n{\n  std::vector<CGAL::Point_3<Kernel> > vertices;\n  std::vector<std::vector<typename DerivedF::Scalar> > faces;\n  projected_cdt(objects,P,vertices,faces);\n  V.resize(vertices.size(),3);\n  for(int v = 0;v<vertices.size();v++)\n  {\n    for(int d = 0;d<3;d++)\n    {\n      assign_scalar(vertices[v][d], V(v,d));\n    }\n  }\n  list_to_matrix(faces,F);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::copyleft::cgal::projected_cdt<CGAL::Epick, long>(std::vector<CGAL::Object, std::allocator<CGAL::Object> > const&, CGAL::Plane_3<CGAL::Epick> const&, std::vector<CGAL::Point_3<CGAL::Epick>, std::allocator<CGAL::Point_3<CGAL::Epick> > >&, std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > >&);\n// generated by autoexplicit.sh\ntemplate void igl::copyleft::cgal::projected_cdt<CGAL::Epeck, long>(std::vector<CGAL::Object, std::allocator<CGAL::Object> > const&, CGAL::Plane_3<CGAL::Epeck> const&, std::vector<CGAL::Point_3<CGAL::Epeck>, std::allocator<CGAL::Point_3<CGAL::Epeck> > >&, std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > >&);\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/projected_cdt.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_CGAL_PROJECTED_CDT_H\n#define IGL_COPYLEFT_CGAL_PROJECTED_CDT_H\n#include \"../../igl_inline.h\"\n#include <Eigen/Core>\n#include <CGAL/Plane_3.h>\n#include <CGAL/Point_3.h>\n#include <vector>\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // Given a list of objects (e.g., resulting from intersecting a triangle\n      // with many other triangles), construct a constrained Delaunay\n      // triangulation on a given plane (P), by inersting constraints for each\n      // object projected onto that plane.\n      //\n      // Inputs:\n      //   objects  list of objects. This should lie on the given plane (P),\n      //     otherwise they are added to the cdt _after_ their non-trivial\n      //     projection\n      //   P  plane upon which all objects lie and upon which the CDT is\n      //     conducted\n      // Outputs:\n      //   vertices  list of vertices of the CDT mesh _back on the 3D plane_\n      //   faces  list of list of triangle indices into vertices\n      //   \n      template <typename Kernel, typename Index>\n      IGL_INLINE void projected_cdt(\n        const std::vector<CGAL::Object> & objects,\n        const CGAL::Plane_3<Kernel> & P,\n        std::vector<CGAL::Point_3<Kernel> >& vertices,\n        std::vector<std::vector<Index> >& faces);\n      // Outputs:\n      //   V  #V by 3 list of vertices of the CDT mesh _back on the 3D plane_,\n      //     **cast** from the number type of Kernel to the number type of\n      //     DerivedV\n      //   F  #F by 3 list of triangle indices into V\n      template < typename Kernel, typename DerivedV, typename DerivedF>\n      IGL_INLINE void projected_cdt(\n        const std::vector<CGAL::Object> & objects,\n        const CGAL::Plane_3<Kernel> & P,\n        Eigen::PlainObjectBase<DerivedV> & V,\n        Eigen::PlainObjectBase<DerivedF> & F);\n    }\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"projected_cdt.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/projected_delaunay.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"projected_delaunay.h\"\n#include \"../../REDRUM.h\"\n#include <iostream>\n#include <cassert>\n\n#if CGAL_VERSION_NR < 1040611000\n#  warning \"CGAL Version < 4.6.1 may result in crashes. Please upgrade CGAL\"\n#endif\n\ntemplate <typename Kernel>\nIGL_INLINE void igl::copyleft::cgal::projected_delaunay(\n  const CGAL::Triangle_3<Kernel> & A,\n  const std::vector<CGAL::Object> & A_objects_3,\n  CGAL::Constrained_triangulation_plus_2<\n    CGAL::Constrained_Delaunay_triangulation_2<\n      Kernel,\n      CGAL::Triangulation_data_structure_2<\n        CGAL::Triangulation_vertex_base_2<Kernel>,\n        CGAL::Constrained_triangulation_face_base_2<Kernel> >,\n      CGAL::Exact_intersections_tag> > & cdt)\n{\n  using namespace std;\n  // 3D Primitives\n  typedef CGAL::Point_3<Kernel>    Point_3;\n  typedef CGAL::Segment_3<Kernel>  Segment_3; \n  typedef CGAL::Triangle_3<Kernel> Triangle_3; \n  typedef CGAL::Plane_3<Kernel>    Plane_3;\n  //typedef CGAL::Tetrahedron_3<Kernel> Tetrahedron_3; \n  typedef CGAL::Point_2<Kernel>    Point_2;\n  //typedef CGAL::Segment_2<Kernel>  Segment_2; \n  //typedef CGAL::Triangle_2<Kernel> Triangle_2; \n  typedef CGAL::Triangulation_vertex_base_2<Kernel>  TVB_2;\n  typedef CGAL::Constrained_triangulation_face_base_2<Kernel> CTFB_2;\n  typedef CGAL::Triangulation_data_structure_2<TVB_2,CTFB_2> TDS_2;\n  typedef CGAL::Exact_intersections_tag Itag;\n  typedef CGAL::Constrained_Delaunay_triangulation_2<Kernel,TDS_2,Itag> \n    CDT_2;\n  typedef CGAL::Constrained_triangulation_plus_2<CDT_2> CDT_plus_2;\n\n  // http://www.cgal.org/Manual/3.2/doc_html/cgal_manual/Triangulation_2/Chapter_main.html#Section_2D_Triangulations_Constrained_Plus\n  // Plane of triangle A\n  Plane_3 P(A.vertex(0),A.vertex(1),A.vertex(2));\n  // Insert triangle into vertices\n  typename CDT_plus_2::Vertex_handle corners[3];\n  typedef size_t Index;\n  for(Index i = 0;i<3;i++)\n  {\n    const Point_3 & p3 = A.vertex(i);\n    const Point_2 & p2 = P.to_2d(p3);\n    typename CDT_plus_2::Vertex_handle corner = cdt.insert(p2);\n    corners[i] = corner;\n  }\n  // Insert triangle edges as constraints\n  for(Index i = 0;i<3;i++)\n  {\n    cdt.insert_constraint( corners[(i+1)%3], corners[(i+2)%3]);\n  }\n  // Insert constraints for intersection objects\n  for( const auto & obj : A_objects_3)\n  {\n    if(const Segment_3 *iseg = CGAL::object_cast<Segment_3 >(&obj))\n    {\n      // Add segment constraint\n      cdt.insert_constraint(P.to_2d(iseg->vertex(0)),P.to_2d(iseg->vertex(1)));\n    }else if(const Point_3 *ipoint = CGAL::object_cast<Point_3 >(&obj))\n    {\n      // Add point\n      cdt.insert(P.to_2d(*ipoint));\n    } else if(const Triangle_3 *itri = CGAL::object_cast<Triangle_3 >(&obj))\n    {\n      // Add 3 segment constraints\n      cdt.insert_constraint(P.to_2d(itri->vertex(0)),P.to_2d(itri->vertex(1)));\n      cdt.insert_constraint(P.to_2d(itri->vertex(1)),P.to_2d(itri->vertex(2)));\n      cdt.insert_constraint(P.to_2d(itri->vertex(2)),P.to_2d(itri->vertex(0)));\n    } else if(const std::vector<Point_3 > *polyp = \n        CGAL::object_cast< std::vector<Point_3 > >(&obj))\n    {\n      //cerr<<REDRUM(\"Poly...\")<<endl;\n      const std::vector<Point_3 > & poly = *polyp;\n      const Index m = poly.size();\n      assert(m>=2);\n      for(Index p = 0;p<m;p++)\n      {\n        const Index np = (p+1)%m;\n        cdt.insert_constraint(P.to_2d(poly[p]),P.to_2d(poly[np]));\n      }\n    }else\n    {\n      cerr<<REDRUM(\"What is this object?!\")<<endl;\n      assert(false);\n    }\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::copyleft::cgal::projected_delaunay<CGAL::Epeck>(CGAL::Triangle_3<CGAL::Epeck> const&, std::vector<CGAL::Object, std::allocator<CGAL::Object> > const&, CGAL::Constrained_triangulation_plus_2<CGAL::Constrained_Delaunay_triangulation_2<CGAL::Epeck, CGAL::Triangulation_data_structure_2<CGAL::Triangulation_vertex_base_2<CGAL::Epeck, CGAL::Triangulation_ds_vertex_base_2<void> >, CGAL::Constrained_triangulation_face_base_2<CGAL::Epeck, CGAL::Triangulation_face_base_2<CGAL::Epeck, CGAL::Triangulation_ds_face_base_2<void> > > >, CGAL::Exact_intersections_tag> >&);\ntemplate void igl::copyleft::cgal::projected_delaunay<CGAL::Epick>(CGAL::Triangle_3<CGAL::Epick> const&, std::vector<CGAL::Object, std::allocator<CGAL::Object> > const&, CGAL::Constrained_triangulation_plus_2<CGAL::Constrained_Delaunay_triangulation_2<CGAL::Epick, CGAL::Triangulation_data_structure_2<CGAL::Triangulation_vertex_base_2<CGAL::Epick, CGAL::Triangulation_ds_vertex_base_2<void> >, CGAL::Constrained_triangulation_face_base_2<CGAL::Epick, CGAL::Triangulation_face_base_2<CGAL::Epick, CGAL::Triangulation_ds_face_base_2<void> > > >, CGAL::Exact_intersections_tag> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/projected_delaunay.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_CGAL_PROJECTED_DELAUNAY_H\n#define IGL_COPYLEFT_CGAL_PROJECTED_DELAUNAY_H\n#include \"../../igl_inline.h\"\n#include \"CGAL_includes.hpp\"\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // Compute 2D delaunay triangulation of a given 3d triangle and a list of\n      // intersection objects (points,segments,triangles). CGAL uses an affine\n      // projection rather than an isometric projection, so we're not guaranteed\n      // that the 2D delaunay triangulation here will be a delaunay triangulation\n      // in 3D.\n      //\n      // Inputs:\n      //   A  triangle in 3D\n      //   A_objects_3  updated list of intersection objects for A\n      // Outputs:\n      //   cdt  Contrained delaunay triangulation in projected 2D plane\n      template <typename Kernel>\n      IGL_INLINE void projected_delaunay(\n        const CGAL::Triangle_3<Kernel> & A,\n        const std::vector<CGAL::Object> & A_objects_3,\n        CGAL::Constrained_triangulation_plus_2<\n          CGAL::Constrained_Delaunay_triangulation_2<\n            Kernel,\n            CGAL::Triangulation_data_structure_2<\n              CGAL::Triangulation_vertex_base_2<Kernel>,\n              CGAL::Constrained_triangulation_face_base_2<Kernel> >,\n            CGAL::Exact_intersections_tag> > & cdt);\n    }\n  }\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"projected_delaunay.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/propagate_winding_numbers.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Qingnan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n//\n#include \"propagate_winding_numbers.h\"\n#include \"../../extract_manifold_patches.h\"\n#include \"../../extract_non_manifold_edge_curves.h\"\n#include \"../../facet_components.h\"\n#include \"../../unique_edge_map.h\"\n#include \"../../piecewise_constant_winding_number.h\"\n#include \"../../writeOBJ.h\"\n#include \"../../writePLY.h\"\n#include \"../../get_seconds.h\"\n#include \"../../LinSpaced.h\"\n#include \"order_facets_around_edge.h\"\n#include \"outer_facet.h\"\n#include \"closest_facet.h\"\n#include \"assign.h\"\n#include \"extract_cells.h\"\n#include \"cell_adjacency.h\"\n\n#include <stdexcept>\n#include <limits>\n#include <vector>\n#include <tuple>\n#include <queue>\n\n//#define PROPAGATE_WINDING_NUMBER_TIMING\n\ntemplate<\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedL,\n  typename DerivedW>\nIGL_INLINE bool igl::copyleft::cgal::propagate_winding_numbers(\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    const Eigen::PlainObjectBase<DerivedL>& labels,\n    Eigen::PlainObjectBase<DerivedW>& W) \n{\n#ifdef PROPAGATE_WINDING_NUMBER_TIMING\n  const auto & tictoc = []() -> double\n  {\n    static double t_start = igl::get_seconds();\n    double diff = igl::get_seconds()-t_start;\n    t_start += diff;\n    return diff;\n  };\n  const auto log_time = [&](const std::string& label) -> void {\n    std::cout << \"propagate_winding_num.\" << label << \": \"\n      << tictoc() << std::endl;\n  };\n  tictoc();\n#endif\n\n  Eigen::MatrixXi E, uE;\n  Eigen::VectorXi EMAP;\n  std::vector<std::vector<size_t> > uE2E;\n  igl::unique_edge_map(F, E, uE, EMAP, uE2E);\n\n  Eigen::VectorXi P;\n  const size_t num_patches = igl::extract_manifold_patches(F, EMAP, uE2E, P);\n\n  DerivedW per_patch_cells;\n  const size_t num_cells =\n    igl::copyleft::cgal::extract_cells(\n        V, F, P, E, uE, uE2E, EMAP, per_patch_cells);\n#ifdef PROPAGATE_WINDING_NUMBER_TIMING\n  log_time(\"cell_extraction\");\n#endif\n\n  return propagate_winding_numbers(V, F,\n          uE, uE2E,\n          num_patches, P,\n          num_cells, per_patch_cells,\n          labels, W);\n}\n\n\ntemplate<\n  typename DerivedV,\n  typename DerivedF,\n  typename DeriveduE,\n  typename uE2EType,\n  typename DerivedP,\n  typename DerivedC,\n  typename DerivedL,\n  typename DerivedW>\nIGL_INLINE bool igl::copyleft::cgal::propagate_winding_numbers(\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    const Eigen::PlainObjectBase<DeriveduE>& uE,\n    const std::vector<std::vector<uE2EType> >& uE2E,\n    const size_t num_patches,\n    const Eigen::PlainObjectBase<DerivedP>& P,\n    const size_t num_cells,\n    const Eigen::PlainObjectBase<DerivedC>& C,\n    const Eigen::PlainObjectBase<DerivedL>& labels,\n    Eigen::PlainObjectBase<DerivedW>& W)\n{\n#ifdef PROPAGATE_WINDING_NUMBER_TIMING\n  const auto & tictoc = []() -> double\n  {\n    static double t_start = igl::get_seconds();\n    double diff = igl::get_seconds()-t_start;\n    t_start += diff;\n    return diff;\n  };\n  const auto log_time = [&](const std::string& label) -> void {\n    std::cout << \"propagate_winding_num.\" << label << \": \"\n      << tictoc() << std::endl;\n  };\n  tictoc();\n#endif\n\n  bool valid = true;\n  if (!piecewise_constant_winding_number(F, uE, uE2E)) \n  {\n    assert(false && \"Input mesh is not orientable\");\n    std::cerr << \"Input mesh is not orientable!\" << std::endl;\n    valid = false;\n  }\n\n  const size_t num_faces = F.rows();\n  typedef std::tuple<typename DerivedC::Scalar, bool, size_t> CellConnection;\n  std::vector<std::set<CellConnection> > cell_adj;\n  igl::copyleft::cgal::cell_adjacency(C, num_cells, cell_adj);\n#ifdef PROPAGATE_WINDING_NUMBER_TIMING\n  log_time(\"cell_connectivity\");\n#endif\n\n  auto save_cell = [&](const std::string& filename, size_t cell_id) -> void{\n    std::vector<size_t> faces;\n    for (size_t i=0; i<num_patches; i++) {\n      if ((C.row(i).array() == cell_id).any()) {\n        for (size_t j=0; j<num_faces; j++) {\n          if ((size_t)P[j] == i) {\n            faces.push_back(j);\n          }\n        }\n      }\n    }\n    Eigen::MatrixXi cell_faces(faces.size(), 3);\n    for (size_t i=0; i<faces.size(); i++) {\n      cell_faces.row(i) = F.row(faces[i]);\n    }\n    Eigen::MatrixXd vertices;\n    assign(V,vertices);\n    writePLY(filename, vertices, cell_faces);\n  };\n\n#ifndef NDEBUG\n  {\n    // Check for odd cycle.\n    Eigen::VectorXi cell_labels(num_cells);\n    cell_labels.setZero();\n    Eigen::VectorXi parents(num_cells);\n    parents.setConstant(-1);\n    auto trace_parents = [&](size_t idx) -> std::list<size_t> {\n      std::list<size_t> path;\n      path.push_back(idx);\n      while ((size_t)parents[path.back()] != path.back()) {\n        path.push_back(parents[path.back()]);\n      }\n      return path;\n    };\n    for (size_t i=0; i<num_cells; i++) {\n      if (cell_labels[i] == 0) {\n        cell_labels[i] = 1;\n        std::queue<size_t> Q;\n        Q.push(i);\n        parents[i] = i;\n        while (!Q.empty()) {\n          size_t curr_idx = Q.front();\n          Q.pop();\n          int curr_label = cell_labels[curr_idx];\n          for (const auto& neighbor : cell_adj[curr_idx]) {\n            if (cell_labels[std::get<0>(neighbor)] == 0) \n            {\n              cell_labels[std::get<0>(neighbor)] = curr_label * -1;\n              Q.push(std::get<0>(neighbor));\n              parents[std::get<0>(neighbor)] = curr_idx;\n            } else \n            {\n              if (cell_labels[std::get<0>(neighbor)] != curr_label * -1) \n              {\n                std::cerr << \"Odd cell cycle detected!\" << std::endl;\n                auto path = trace_parents(curr_idx);\n                path.reverse();\n                auto path2 = trace_parents(std::get<0>(neighbor));\n                path.insert(path.end(), path2.begin(), path2.end());\n                for (auto cell_id : path) \n                {\n                  std::cout << cell_id << \" \";\n                  std::stringstream filename;\n                  filename << \"cell_\" << cell_id << \".ply\";\n                  save_cell(filename.str(), cell_id);\n                }\n                std::cout << std::endl;\n                valid = false;\n              }\n              // Do not fail when odd cycle is detected because the resulting\n              // integer winding number field, although inconsistent, may still\n              // be used if the problem region is local and embedded within a\n              // valid volume.\n              //assert(cell_labels[std::get<0>(neighbor)] == curr_label * -1);\n            }\n          }\n        }\n      }\n    }\n#ifdef PROPAGATE_WINDING_NUMBER_TIMING\n    log_time(\"odd_cycle_check\");\n#endif\n  }\n#endif\n\n  size_t outer_facet;\n  bool flipped;\n  Eigen::VectorXi I = igl::LinSpaced<Eigen::VectorXi>(num_faces, 0, num_faces-1);\n  igl::copyleft::cgal::outer_facet(V, F, I, outer_facet, flipped);\n#ifdef PROPAGATE_WINDING_NUMBER_TIMING\n  log_time(\"outer_facet\");\n#endif\n\n  const size_t outer_patch = P[outer_facet];\n  const size_t infinity_cell = C(outer_patch, flipped?1:0);\n\n  Eigen::VectorXi patch_labels(num_patches);\n  const int INVALID = std::numeric_limits<int>::max();\n  patch_labels.setConstant(INVALID);\n  for (size_t i=0; i<num_faces; i++) {\n    if (patch_labels[P[i]] == INVALID) {\n      patch_labels[P[i]] = labels[i];\n    } else {\n      assert(patch_labels[P[i]] == labels[i]);\n    }\n  }\n  assert((patch_labels.array() != INVALID).all());\n  const size_t num_labels = patch_labels.maxCoeff()+1;\n\n  Eigen::MatrixXi per_cell_W(num_cells, num_labels);\n  per_cell_W.setConstant(INVALID);\n  per_cell_W.row(infinity_cell).setZero();\n  std::queue<size_t> Q;\n  Q.push(infinity_cell);\n  while (!Q.empty()) {\n    size_t curr_cell = Q.front();\n    Q.pop();\n    for (const auto& neighbor : cell_adj[curr_cell]) {\n      size_t neighbor_cell, patch_idx;\n      bool direction;\n      std::tie(neighbor_cell, direction, patch_idx) = neighbor;\n      if ((per_cell_W.row(neighbor_cell).array() == INVALID).any()) {\n        per_cell_W.row(neighbor_cell) = per_cell_W.row(curr_cell);\n        for (size_t i=0; i<num_labels; i++) {\n          int inc = (patch_labels[patch_idx] == (int)i) ?\n            (direction ? -1:1) :0;\n          per_cell_W(neighbor_cell, i) =\n            per_cell_W(curr_cell, i) + inc;\n        }\n        Q.push(neighbor_cell);\n      } else {\n#ifndef NDEBUG\n        // Checking for winding number consistency.\n        // This check would inevitably fail for meshes that contain open\n        // boundary or non-orientable.  However, the inconsistent winding number\n        // field would still be useful in some cases such as when problem region\n        // is local and embedded within the volume.  This, unfortunately, is the\n        // best we can do because the problem of computing integer winding\n        // number is ill-defined for open and non-orientable surfaces.\n        for (size_t i=0; i<num_labels; i++) {\n          if ((int)i == patch_labels[patch_idx]) {\n            int inc = direction ? -1:1;\n            //assert(per_cell_W(neighbor_cell, i) ==\n            //    per_cell_W(curr_cell, i) + inc);\n          } else {\n            //assert(per_cell_W(neighbor_cell, i) ==\n            //    per_cell_W(curr_cell, i));\n          }\n        }\n#endif\n      }\n    }\n  }\n#ifdef PROPAGATE_WINDING_NUMBER_TIMING\n  log_time(\"propagate_winding_number\");\n#endif\n\n  W.resize(num_faces, num_labels*2);\n  for (size_t i=0; i<num_faces; i++) \n  {\n    const size_t patch = P[i];\n    const size_t positive_cell = C(patch, 0);\n    const size_t negative_cell = C(patch, 1);\n    for (size_t j=0; j<num_labels; j++) {\n      W(i,j*2  ) = per_cell_W(positive_cell, j);\n      W(i,j*2+1) = per_cell_W(negative_cell, j);\n    }\n  }\n#ifdef PROPAGATE_WINDING_NUMBER_TIMING\n  log_time(\"store_result\");\n#endif\n  return valid;\n}\n\n\n#ifdef IGL_STATIC_LIBRARY\ntemplate bool igl::copyleft::cgal::propagate_winding_numbers<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/propagate_winding_numbers.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Qingnan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n//\n#ifndef IGL_COPYLEFT_CGAL_PROPAGATE_WINDING_NUMBERS_H\n#define IGL_COPYLEFT_CGAL_PROPAGATE_WINDING_NUMBERS_H\n#include \"../../igl_inline.h\"\n#include <Eigen/Core>\n#include <vector>\n\n// The following methods compute the winding number on each side of each facet\n// or patch of a 3D mesh.  The input mesh is valid if it splits the ambient\n// space, R^3, into subspaces with constant integer winding numbers.  That is\n// the input mesh should be closed and for each directed edge the number of\n// clockwise facing facets should equal the number of counterclockwise facing\n// facets.\n\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // TODO: This shouldn't need to be in igl::copyleft::cgal, it should\n      // instead take as input an index of the ambient cell and the winding\n      // number vector there.\n      //\n      // Compute winding number on each side of the face.  The input mesh\n      // could contain multiple connected components.  The input mesh must\n      // represent the boundary of a valid 3D volume, which means it is\n      // closed, consistently oriented and induces integer winding numbers.\n      //\n      // Inputs:\n      //   V  #V by 3 list of vertex positions.\n      //   F  #F by 3 list of triangle indices into V.\n      //   labels  #F list of facet labels ranging from 0 to k-1.\n      // Output:\n      //   W  #F by k*2 list of winding numbers.  ``W(i,j*2)`` is the winding\n      //      number on the positive side of facet ``i`` with respect to the\n      //      facets labeled ``j``.  Similarly, ``W(i,j*2+1)`` is the winding\n      //      number on the negative side of facet ``i`` with respect to the\n      //      facets labeled ``j``.\n      // Returns true iff the input induces a piecewise-constant winding number\n      //   field.\n      template<\n        typename DerivedV,\n        typename DerivedF,\n        typename DerivedL,\n        typename DerivedW>\n      IGL_INLINE bool propagate_winding_numbers(\n        const Eigen::PlainObjectBase<DerivedV>& V,\n        const Eigen::PlainObjectBase<DerivedF>& F,\n        const Eigen::PlainObjectBase<DerivedL>& labels,\n        Eigen::PlainObjectBase<DerivedW>& W);\n\n      // Inputs:\n      //   V  #V by 3 list of vertex positions.\n      //   F  #F by 3 list of triangle indices into V.\n      //   uE    #uE by 2 list of vertex_indices, represents undirected edges.\n      //   uE2E  #uE list of lists that maps uE to E. (a one-to-many map)\n      //   num_patches  number of patches\n      //   P  #F list of patch ids.\n      //   num_cells    number of cells\n      //   C  #P by 2 list of cell ids on each side of each patch.\n      //   labels  #F list of facet labels ranging from 0 to k-1.\n      // Output:\n      //   W  #F by k*2 list of winding numbers.  ``W(i,j*2)`` is the winding\n      //      number on the positive side of facet ``i`` with respect to the\n      //      facets labeled ``j``.  Similarly, ``W(i,j*2+1)`` is the winding\n      //      number on the negative side of facet ``i`` with respect to the\n      //      facets labeled ``j``.\n      template<\n        typename DerivedV,\n        typename DerivedF,\n        typename DeriveduE,\n        typename uE2EType,\n        typename DerivedP,\n        typename DerivedC,\n        typename DerivedL,\n        typename DerivedW>\n      IGL_INLINE bool propagate_winding_numbers(\n        const Eigen::PlainObjectBase<DerivedV>& V,\n        const Eigen::PlainObjectBase<DerivedF>& F,\n        const Eigen::PlainObjectBase<DeriveduE>& uE,\n        const std::vector<std::vector<uE2EType> >& uE2E,\n        const size_t num_patches,\n        const Eigen::PlainObjectBase<DerivedP>& P,\n        const size_t num_cells,\n        const Eigen::PlainObjectBase<DerivedC>& C,\n        const Eigen::PlainObjectBase<DerivedL>& labels,\n        Eigen::PlainObjectBase<DerivedW>& W);\n    }\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"propagate_winding_numbers.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/read_triangle_mesh.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"read_triangle_mesh.h\"\n#include \"assign.h\"\n#include \"../../read_triangle_mesh.h\"\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE bool igl::copyleft::cgal::read_triangle_mesh(\n  const std::string str,\n  Eigen::PlainObjectBase<DerivedV>& V,\n  Eigen::PlainObjectBase<DerivedF>& F)\n{\n  Eigen::MatrixXd Vd;\n  bool ret = igl::read_triangle_mesh(str,Vd,F);\n  if(ret)\n  {\n    assign(Vd,V);\n  }\n  return ret;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/read_triangle_mesh.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_CGAL_READ_TRIANGLE_MESH_H\n#define IGL_COPYLEFT_CGAL_READ_TRIANGLE_MESH_H\n#include \"../../igl_inline.h\"\n\n#include <Eigen/Core>\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // Simple wrapper, reads floating point precision but assigns to\n      // DerivedV::Scalar which may be a CGAL type\n      //\n      // Inputs:\n      //   str  path to file\n      // Outputs:\n      //   V  eigen double matrix #V by 3\n      //   F  eigen int matrix #F by 3\n      // Returns true iff success\n      template <typename DerivedV, typename DerivedF>\n      IGL_INLINE bool read_triangle_mesh(\n        const std::string str,\n        Eigen::PlainObjectBase<DerivedV>& V,\n        Eigen::PlainObjectBase<DerivedF>& F);\n    }\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"read_triangle_mesh.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/relabel_small_immersed_cells.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Qingnan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n//\n\n#include \"relabel_small_immersed_cells.h\"\n#include \"../../centroid.h\"\n#include \"assign.h\"\n#include \"cell_adjacency.h\"\n\n#include <vector>\n\ntemplate<\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedP,\n  typename DerivedC,\n  typename FT,\n  typename DerivedW>\nIGL_INLINE void igl::copyleft::cgal::relabel_small_immersed_cells(\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    const size_t num_patches,\n    const Eigen::PlainObjectBase<DerivedP>& P,\n    const size_t num_cells,\n    const Eigen::PlainObjectBase<DerivedC>& C,\n    const FT vol_threashold,\n    Eigen::PlainObjectBase<DerivedW>& W)\n{\n  const size_t num_vertices = V.rows();\n  const size_t num_faces = F.rows();\n  typedef std::tuple<typename DerivedC::Scalar, bool, size_t> CellConnection;\n  std::vector<std::set<CellConnection> > cell_adj;\n  igl::copyleft::cgal::cell_adjacency(C, num_cells, cell_adj);\n\n  Eigen::MatrixXd VV;\n  assign(V,VV);\n\n  auto compute_cell_volume = [&](size_t cell_id) {\n    std::vector<short> is_involved(num_patches, 0);\n    for (size_t i=0; i<num_patches; i++) {\n      if (C(i,0) == cell_id) {\n        // cell is on positive side of patch i.\n        is_involved[i] = 1;\n      }\n      if (C(i,1) == cell_id) {\n        // cell is on negative side of patch i.\n        is_involved[i] = -1;\n      }\n    }\n\n    std::vector<size_t> involved_positive_faces;\n    std::vector<size_t> involved_negative_faces;\n    for (size_t i=0; i<num_faces; i++) {\n      switch (is_involved[P[i]]) {\n        case 1:\n          involved_negative_faces.push_back(i);\n          break;\n        case -1:\n          involved_positive_faces.push_back(i);\n          break;\n      }\n    }\n\n    const size_t num_positive_faces = involved_positive_faces.size();\n    const size_t num_negative_faces = involved_negative_faces.size();\n    DerivedF selected_faces(num_positive_faces + num_negative_faces, 3);\n    for (size_t i=0; i<num_positive_faces; i++) {\n      selected_faces.row(i) = F.row(involved_positive_faces[i]);\n    }\n    for (size_t i=0; i<num_negative_faces; i++) {\n      selected_faces.row(num_positive_faces+i) =\n        F.row(involved_negative_faces[i]).reverse();\n    }\n\n    Eigen::VectorXd c(3);\n    double vol;\n    igl::centroid(VV, selected_faces, c, vol);\n    return vol;\n  };\n\n  std::vector<typename DerivedV::Scalar> cell_volumes(num_cells);\n  for (size_t i=0; i<num_cells; i++) {\n    cell_volumes[i] = compute_cell_volume(i);\n  }\n\n  std::vector<typename DerivedW::Scalar> cell_values(num_cells);\n  for (size_t i=0; i<num_faces; i++) {\n    cell_values[C(P[i], 0)] = W(i, 0);\n    cell_values[C(P[i], 1)] = W(i, 1);\n  }\n\n  for (size_t i=1; i<num_cells; i++) {\n    std::cout << cell_volumes[i] << std::endl;\n    if (cell_volumes[i] >= vol_threashold) continue;\n    std::set<typename DerivedW::Scalar> neighbor_values;\n    const auto neighbors = cell_adj[i];\n    for (const auto& entry : neighbors) {\n      const auto& j = std::get<0>(entry);\n      neighbor_values.insert(cell_values[j]);\n    }\n    // If cell i is immersed, assign its value to be the immersed value.\n    if (neighbor_values.size() == 1) {\n      cell_values[i] = *neighbor_values.begin();\n    }\n  }\n\n  for (size_t i=0; i<num_faces; i++) {\n    W(i,0) = cell_values[C(P[i], 0)];\n    W(i,1) = cell_values[C(P[i], 1)];\n  }\n}\n\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/relabel_small_immersed_cells.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Qingnan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n//\n#ifndef IGL_RELABEL_SMALL_IMMERSED_CELLS\n#define IGL_RELABEL_SMALL_IMMERSED_CELLS\n\n#include \"../../igl_inline.h\"\n#include <Eigen/Core>\n#include <vector>\n\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // Inputs:\n      //   V  #V by 3 list of vertex positions.\n      //   F  #F by 3 list of triangle indices into V.\n      //   num_patches  number of patches\n      //   P  #F list of patch ids.\n      //   num_cells    number of cells\n      //   C  #P by 2 list of cell ids on each side of each patch.\n      //   vol_threshold  Volume threshold, cells smaller than this\n      //                  and is completely immersed will be relabeled.\n      //\n      // In/Output:\n      //   W  #F by 2 cell labels.  W(i,0) is the label on the positive side of\n      //      face i, W(i,1) is the label on the negative side of face i.  W\n      //      will be modified in place by this method.\n      template<\n        typename DerivedV,\n        typename DerivedF,\n        typename DerivedP,\n        typename DerivedC,\n        typename FT,\n        typename DerivedW>\n      IGL_INLINE void relabel_small_immersed_cells(\n          const Eigen::PlainObjectBase<DerivedV>& V,\n          const Eigen::PlainObjectBase<DerivedF>& F,\n          const size_t num_patches,\n          const Eigen::PlainObjectBase<DerivedP>& P,\n          const size_t num_cells,\n          const Eigen::PlainObjectBase<DerivedC>& C,\n          const FT vol_threashold,\n          Eigen::PlainObjectBase<DerivedW>& W);\n    }\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"relabel_small_immersed_cells.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/remesh_intersections.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Qingnan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n//\n#include \"remesh_intersections.h\"\n#include \"assign_scalar.h\"\n#include \"projected_cdt.h\"\n#include \"../../get_seconds.h\"\n#include \"../../LinSpaced.h\"\n#include \"../../unique.h\"\n\n#include <vector>\n#include <map>\n#include <queue>\n#include <unordered_map>\n#include <iostream>\n\n//#define REMESH_INTERSECTIONS_TIMING\n\ntemplate <\n  typename DerivedV,\n  typename DerivedF,\n  typename Kernel,\n  typename DerivedVV,\n  typename DerivedFF,\n  typename DerivedJ,\n  typename DerivedIM>\nIGL_INLINE void igl::copyleft::cgal::remesh_intersections(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  const std::vector<CGAL::Triangle_3<Kernel> > & T,\n  const std::map<\n  typename DerivedF::Index,\n  std::vector<\n  std::pair<typename DerivedF::Index, CGAL::Object> > > & offending,\n  Eigen::PlainObjectBase<DerivedVV> & VV,\n  Eigen::PlainObjectBase<DerivedFF> & FF,\n  Eigen::PlainObjectBase<DerivedJ> & J,\n  Eigen::PlainObjectBase<DerivedIM> & IM) \n{\n  // by default, no stitching\n  igl::copyleft::cgal::remesh_intersections(V,F,T,offending,false,VV,FF,J,IM);\n}\n\ntemplate <\n  typename DerivedV,\n  typename DerivedF,\n  typename Kernel,\n  typename DerivedVV,\n  typename DerivedFF,\n  typename DerivedJ,\n  typename DerivedIM>\nIGL_INLINE void igl::copyleft::cgal::remesh_intersections(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  const std::vector<CGAL::Triangle_3<Kernel> > & T,\n  const std::map<\n    typename DerivedF::Index,\n    std::vector<\n      std::pair<typename DerivedF::Index, CGAL::Object> > > & offending,\n  bool stitch_all,\n  Eigen::PlainObjectBase<DerivedVV> & VV,\n  Eigen::PlainObjectBase<DerivedFF> & FF,\n  Eigen::PlainObjectBase<DerivedJ> & J,\n  Eigen::PlainObjectBase<DerivedIM> & IM)\n{\n\n#ifdef REMESH_INTERSECTIONS_TIMING\n    const auto & tictoc = []() -> double\n    {\n      static double t_start = igl::get_seconds();\n      double diff = igl::get_seconds()-t_start;\n      t_start += diff;\n      return diff;\n    };\n    const auto log_time = [&](const std::string& label) -> void {\n      std::cout << \"remesh_intersections.\" << label << \": \"\n          << tictoc() << std::endl;\n    };\n    tictoc();\n#endif\n\n    typedef CGAL::Point_3<Kernel>    Point_3;\n    typedef CGAL::Segment_3<Kernel>  Segment_3; \n    typedef CGAL::Plane_3<Kernel>    Plane_3;\n    typedef CGAL::Triangulation_vertex_base_2<Kernel>  TVB_2;\n    typedef CGAL::Constrained_triangulation_face_base_2<Kernel> CTFB_2;\n    typedef CGAL::Triangulation_data_structure_2<TVB_2,CTFB_2> TDS_2;\n    typedef CGAL::Exact_intersections_tag Itag;\n    typedef CGAL::Constrained_Delaunay_triangulation_2<Kernel,TDS_2,Itag> \n        CDT_2;\n    typedef CGAL::Constrained_triangulation_plus_2<CDT_2> CDT_plus_2;\n\n    typedef typename DerivedF::Index Index;\n    typedef std::pair<Index, Index> Edge;\n    struct EdgeHash {\n        size_t operator()(const Edge& e) const {\n            return (e.first * 805306457) ^ (e.second * 201326611);\n        }\n    };\n    typedef std::unordered_map<Edge, std::vector<Index>, EdgeHash > EdgeMap;\n\n    const size_t num_faces = F.rows();\n    const size_t num_base_vertices = V.rows();\n    assert(num_faces == T.size());\n\n    std::vector<bool> is_offending(num_faces, false);\n    for (const auto itr : offending)\n    {\n      const auto& fid = itr.first;\n      is_offending[fid] = true;\n    }\n\n    // Cluster overlaps so that co-planar clusters are resolved only once\n    std::unordered_map<Index, std::vector<Index> > intersecting_and_coplanar;\n    for (const auto itr : offending)\n    {\n      const auto& fi = itr.first;\n      const auto P = T[fi].supporting_plane();\n      assert(!P.is_degenerate());\n      for (const auto jtr : itr.second) \n      {\n        const auto& fj = jtr.first;\n        const auto& tj = T[fj];\n        if (P.has_on(tj[0]) && P.has_on(tj[1]) && P.has_on(tj[2]))\n        {\n          auto loc = intersecting_and_coplanar.find(fi);\n          if (loc == intersecting_and_coplanar.end())\n          {\n            intersecting_and_coplanar[fi] = {fj};\n          } else\n          {\n            loc->second.push_back(fj);\n          }\n        }\n      }\n    }\n#ifdef REMESH_INTERSECTIONS_TIMING\n    log_time(\"overlap_analysis\");\n#endif\n\n    std::vector<std::vector<Index> > resolved_faces;\n    std::vector<Index> source_faces;\n    std::vector<Point_3> new_vertices;\n    EdgeMap edge_vertices;\n\n    // Run constraint Delaunay triangulation on the plane.\n    // \n    // Inputs:\n    //   P  plane to triangulate upone\n    //   involved_faces  #F list of indices into triangle of involved faces\n    // Outputs:\n    //   vertices  #V list of vertex positions of output triangulation\n    //   faces   #F list of face indices into vertices of output triangulation\n    //\n    auto delaunay_triangulation = [&offending, &T](\n      const Plane_3& P,\n      const std::vector<Index>& involved_faces,\n      std::vector<Point_3>& vertices,\n      std::vector<std::vector<Index> >& faces) -> void \n    {\n      std::vector<CGAL::Object> objects;\n\n      CDT_plus_2 cdt;\n      // insert each face into a common cdt\n      for (const auto& fid : involved_faces)\n      {\n        const auto itr = offending.find(fid);\n        const auto& triangle = T[fid];\n        objects.push_back(CGAL::make_object(triangle));\n        if (itr == offending.end())\n        {\n          continue;\n        }\n        for (const auto& index_obj : itr->second) \n        {\n          //const auto& ofid = index_obj.first;\n          const auto& obj = index_obj.second;\n          objects.push_back(obj);\n        }\n      }\n      projected_cdt(objects,P,vertices,faces);\n    };\n\n    // Given p on triangle indexed by ori_f, add point to list of vertices return index of p.\n    //\n    // Input:\n    //   p  point to search for\n    //   ori_f  index of triangle p is corner of\n    // Returns global index of vertex (dependent on whether stitch_all flag is\n    // set)\n    //\n    auto find_or_append_point = [&](\n      const Point_3& p, \n      const size_t ori_f) -> Index \n    {\n      if (stitch_all) \n      {\n        // No need to check if p shared by multiple triangles because all shared\n        // vertices would be merged later on.\n        const size_t index = num_base_vertices + new_vertices.size();\n        new_vertices.push_back(p);\n        return index;\n      } else \n      {\n        // Stitching triangles according to input connectivity.\n        // This step is potentially costly.\n        const auto& triangle = T[ori_f];\n        const auto& f = F.row(ori_f).eval();\n\n        // Check if p is one of the triangle corners.\n        for (size_t i=0; i<3; i++) \n        {\n          if (p == triangle[i]) return f[i];\n        }\n\n        // Check if p is on one of the edges.\n        for (size_t i=0; i<3; i++) {\n          const Point_3 curr_corner = triangle[i];\n          const Point_3 next_corner = triangle[(i+1)%3];\n          const Segment_3 edge(curr_corner, next_corner);\n          if (edge.has_on(p)) {\n            const Index curr = f[i];\n            const Index next = f[(i+1)%3];\n            Edge key;\n            key.first = curr<next?curr:next;\n            key.second = curr<next?next:curr;\n            auto itr = edge_vertices.find(key);\n            if (itr == edge_vertices.end()) {\n              const Index index =\n                num_base_vertices + new_vertices.size();\n              edge_vertices.insert({key, {index}});\n              new_vertices.push_back(p);\n              return index;\n            } else {\n              for (const auto vid : itr->second) {\n                if (p == new_vertices[vid - num_base_vertices]) {\n                  return vid;\n                }\n              }\n              const size_t index = num_base_vertices + new_vertices.size();\n              new_vertices.push_back(p);\n              itr->second.push_back(index);\n              return index;\n            }\n          }\n        }\n\n        // p must be in the middle of the triangle.\n        const size_t index = num_base_vertices + new_vertices.size();\n        new_vertices.push_back(p);\n        return index;\n      }\n    };\n\n    // Determine the vertex indices for each corner of each output triangle.\n    // \n    // Inputs:\n    //   vertices  #V list of vertices of cdt\n    //   faces  #F list of list of face indices into vertices of cdt\n    //   involved_faces  list of involved faces on the plane of cdt\n    // Side effects:\n    //   - add faces to resolved_faces\n    //   - add corresponding original face to source_faces\n    //   - \n    auto post_triangulation_process = [&](\n      const std::vector<Point_3>& vertices,\n      const std::vector<std::vector<Index> >& faces,\n      const std::vector<Index>& involved_faces) -> void \n    {\n      assert(involved_faces.size() > 0);\n      // for all faces of the cdt\n      for (const auto& f : faces) \n      {\n        const Point_3& v0 = vertices[f[0]];\n        const Point_3& v1 = vertices[f[1]];\n        const Point_3& v2 = vertices[f[2]];\n        Point_3 center(\n          (v0[0] + v1[0] + v2[0]) / 3.0,\n          (v0[1] + v1[1] + v2[1]) / 3.0,\n          (v0[2] + v1[2] + v2[2]) / 3.0);\n        if (involved_faces.size() == 1) \n        {\n          // If only there is only one involved face, all sub-triangles must\n          // belong to it and have the correct orientation.\n          const auto& ori_f = involved_faces[0];\n          std::vector<Index> corners(3);\n          corners[0] = find_or_append_point(v0, ori_f);\n          corners[1] = find_or_append_point(v1, ori_f);\n          corners[2] = find_or_append_point(v2, ori_f);\n          resolved_faces.emplace_back(corners);\n          source_faces.push_back(ori_f);\n        } else \n        {\n          for (const auto& ori_f : involved_faces) \n          {\n            const auto& triangle = T[ori_f];\n            const Plane_3 P = triangle.supporting_plane();\n            if (triangle.has_on(center)) {\n              std::vector<Index> corners(3);\n              corners[0] = find_or_append_point(v0, ori_f);\n              corners[1] = find_or_append_point(v1, ori_f);\n              corners[2] = find_or_append_point(v2, ori_f);\n              if (CGAL::orientation(\n                    P.to_2d(v0), P.to_2d(v1), P.to_2d(v2))\n                  == CGAL::RIGHT_TURN) {\n                std::swap(corners[0], corners[1]);\n              }\n              resolved_faces.emplace_back(corners);\n              source_faces.push_back(ori_f);\n            }\n          }\n        }\n      }\n    };\n\n    // Process un-touched faces.\n    for (size_t i=0; i<num_faces; i++) \n    {\n      if (!is_offending[i] && !T[i].is_degenerate()) \n      {\n        resolved_faces.push_back( { F(i,0), F(i,1), F(i,2) } );\n        source_faces.push_back(i);\n      }\n    }\n\n    // Process self-intersecting faces.\n    std::vector<bool> processed(num_faces, false);\n    std::vector<std::pair<Plane_3, std::vector<Index> > > cdt_inputs;\n    for (const auto itr : offending) \n    {\n      const auto fid = itr.first;\n      if (processed[fid]) continue;\n      processed[fid] = true;\n\n      const auto loc = intersecting_and_coplanar.find(fid);\n      std::vector<Index> involved_faces;\n      if (loc == intersecting_and_coplanar.end()) \n      {\n        involved_faces.push_back(fid);\n      } else \n      {\n        std::queue<Index> Q;\n        Q.push(fid);\n        while (!Q.empty()) \n        {\n          const auto index = Q.front();\n          involved_faces.push_back(index);\n          Q.pop();\n\n          const auto overlapping_faces = intersecting_and_coplanar.find(index);\n          assert(overlapping_faces != intersecting_and_coplanar.end());\n\n          for (const auto other_index : overlapping_faces->second) \n          {\n            if (processed[other_index]) continue;\n            processed[other_index] = true;\n            Q.push(other_index);\n          }\n        }\n      }\n\n      Plane_3 P = T[fid].supporting_plane();\n      cdt_inputs.emplace_back(P, involved_faces);\n    }\n#ifdef REMESH_INTERSECTIONS_TIMING\n    log_time(\"preprocess\");\n#endif\n\n    const size_t num_cdts = cdt_inputs.size();\n    std::vector<std::vector<Point_3> > cdt_vertices(num_cdts);\n    std::vector<std::vector<std::vector<Index> > > cdt_faces(num_cdts);\n\n    const auto cdt = [&](const size_t first, const size_t last) \n    {\n      for (size_t i=first; i<last; i++) \n      {\n        auto& vertices = cdt_vertices[i];\n        auto& faces = cdt_faces[i];\n        const auto& P = cdt_inputs[i].first;\n        const auto& involved_faces = cdt_inputs[i].second;\n        delaunay_triangulation(P, involved_faces, vertices, faces);\n      }\n    };\n    cdt(0, num_cdts);\n#ifdef REMESH_INTERSECTIONS_TIMING\n    log_time(\"cdt\");\n#endif\n\n    for (size_t i=0; i<num_cdts; i++) \n    {\n      const auto& vertices = cdt_vertices[i];\n      const auto& faces = cdt_faces[i];\n      const auto& involved_faces = cdt_inputs[i].second;\n      post_triangulation_process(vertices, faces, involved_faces);\n    }\n#ifdef REMESH_INTERSECTIONS_TIMING\n    log_time(\"stitching\");\n#endif\n\n    // Output resolved mesh.\n    const size_t num_out_vertices = new_vertices.size() + num_base_vertices;\n    VV.resize(num_out_vertices, 3);\n    for (size_t i=0; i<num_base_vertices; i++) \n    {\n      assign_scalar(V(i,0), VV(i,0));\n      assign_scalar(V(i,1), VV(i,1));\n      assign_scalar(V(i,2), VV(i,2));\n    }\n\n    for (size_t i=num_base_vertices; i<num_out_vertices; i++) \n    {\n      assign_scalar(new_vertices[i-num_base_vertices][0], VV(i,0));\n      assign_scalar(new_vertices[i-num_base_vertices][1], VV(i,1));\n      assign_scalar(new_vertices[i-num_base_vertices][2], VV(i,2));\n    }\n\n    const size_t num_out_faces = resolved_faces.size();\n    FF.resize(num_out_faces, 3);\n    for (size_t i=0; i<num_out_faces; i++) \n    {\n      FF(i,0) = resolved_faces[i][0];\n      FF(i,1) = resolved_faces[i][1];\n      FF(i,2) = resolved_faces[i][2];\n    }\n\n    J.resize(num_out_faces);\n    std::copy(source_faces.begin(), source_faces.end(), J.data());\n\n    // Extract unique vertex indices.\n    const size_t VV_size = VV.rows();\n    IM.resize(VV_size,1);\n\n    DerivedVV unique_vv;\n    Eigen::VectorXi unique_to_vv, vv_to_unique;\n    // This is not stable... So even if offending is empty V != VV in\n    // general...\n    igl::unique_rows(VV, unique_vv, unique_to_vv, vv_to_unique);\n    if(stitch_all) \n    {\n      // Merge all vertices having the same coordinates into a single vertex\n      // and set IM to identity map.\n      VV = unique_vv;\n      std::transform(FF.data(), FF.data() + FF.rows()*FF.cols(),\n          FF.data(), [&vv_to_unique](const typename DerivedFF::Scalar& a)\n          { return vv_to_unique[a]; });\n      IM = igl::LinSpaced<\n        Eigen::Matrix<typename DerivedIM::Scalar, Eigen::Dynamic,1 >\n        >(unique_vv.rows(), 0, unique_vv.rows()-1);\n    }else \n    {\n      // Vertices with the same coordinates would be represented by one vertex.\n      // The IM value of a vertex is the index of the representative vertex.\n      for (Index v=0; v<(Index)VV_size; v++) {\n        IM(v) = unique_to_vv[vv_to_unique[v]];\n      }\n    }\n\n#ifdef REMESH_INTERSECTIONS_TIMING\n    log_time(\"store_results\");\n#endif\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::copyleft::cgal::remesh_intersections<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, CGAL::Epick, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<CGAL::Triangle_3<CGAL::Epick>, std::allocator<CGAL::Triangle_3<CGAL::Epick> > > const&, std::map<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object> > >, std::less<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index const, std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object> > > > > > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_intersections<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, CGAL::Epeck, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<CGAL::Triangle_3<CGAL::Epeck>, std::allocator<CGAL::Triangle_3<CGAL::Epeck> > > const&, std::map<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object> > >, std::less<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index const, std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object> > > > > > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_intersections<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, CGAL::Epick, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<CGAL::Triangle_3<CGAL::Epick>, std::allocator<CGAL::Triangle_3<CGAL::Epick> > > const&, std::map<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object> > >, std::less<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index const, std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object> > > > > > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_intersections<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, CGAL::Epick, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<CGAL::Triangle_3<CGAL::Epick>, std::allocator<CGAL::Triangle_3<CGAL::Epick> > > const&, std::map<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object> > >, std::less<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index const, std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object> > > > > > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_intersections<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, CGAL::Epick, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<CGAL::Triangle_3<CGAL::Epick>, std::allocator<CGAL::Triangle_3<CGAL::Epick> > > const&, std::map<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object> > >, std::less<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index const, std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object> > > > > > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_intersections<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, CGAL::Epeck, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<CGAL::Triangle_3<CGAL::Epeck>, std::allocator<CGAL::Triangle_3<CGAL::Epeck> > > const&, std::map<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object> > >, std::less<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index const, std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object> > > > > > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_intersections<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, CGAL::Epeck, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<CGAL::Triangle_3<CGAL::Epeck>, std::allocator<CGAL::Triangle_3<CGAL::Epeck> > > const&, std::map<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object> > >, std::less<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index const, std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object> > > > > > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_intersections<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, CGAL::Epeck, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<CGAL::Triangle_3<CGAL::Epeck>, std::allocator<CGAL::Triangle_3<CGAL::Epeck> > > const&, std::map<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object> > >, std::less<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index const, std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object> > > > > > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_intersections<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, CGAL::Epick, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<CGAL::Triangle_3<CGAL::Epick>, std::allocator<CGAL::Triangle_3<CGAL::Epick> > > const&, std::map<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object> > >, std::less<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index const, std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object> > > > > > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_intersections<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, CGAL::Epick, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<CGAL::Triangle_3<CGAL::Epick>, std::allocator<CGAL::Triangle_3<CGAL::Epick> > > const&, std::map<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object> > >, std::less<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index const, std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object> > > > > > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_intersections<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, CGAL::Epeck, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<CGAL::Triangle_3<CGAL::Epeck>, std::allocator<CGAL::Triangle_3<CGAL::Epeck> > > const&, std::map<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object> > >, std::less<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index const, std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object> > > > > > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_intersections<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, CGAL::Epeck, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<CGAL::Triangle_3<CGAL::Epeck>, std::allocator<CGAL::Triangle_3<CGAL::Epeck> > > const&, std::map<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object> > >, std::less<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index const, std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object> > > > > > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_intersections<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, CGAL::Epick, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, std::vector<CGAL::Triangle_3<CGAL::Epick>, std::allocator<CGAL::Triangle_3<CGAL::Epick> > > const&, std::map<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::vector<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object> > >, std::less<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index>, std::allocator<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index const, std::vector<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object> > > > > > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_intersections<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, CGAL::Epick, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, std::vector<CGAL::Triangle_3<CGAL::Epick>, std::allocator<CGAL::Triangle_3<CGAL::Epick> > > const&, std::map<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::vector<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object> > >, std::less<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index>, std::allocator<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index const, std::vector<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object> > > > > > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_intersections<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, CGAL::Epick, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<long, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, std::vector<CGAL::Triangle_3<CGAL::Epick>, std::allocator<CGAL::Triangle_3<CGAL::Epick> > > const&, std::map<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::vector<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object> > >, std::less<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index>, std::allocator<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index const, std::vector<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object> > > > > > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_intersections<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, CGAL::Epick, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, std::vector<CGAL::Triangle_3<CGAL::Epick>, std::allocator<CGAL::Triangle_3<CGAL::Epick> > > const&, std::map<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::vector<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object> > >, std::less<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index>, std::allocator<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index const, std::vector<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object> > > > > > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_intersections<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, CGAL::Epick, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, std::vector<CGAL::Triangle_3<CGAL::Epick>, std::allocator<CGAL::Triangle_3<CGAL::Epick> > > const&, std::map<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::vector<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object> > >, std::less<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index>, std::allocator<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index const, std::vector<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object> > > > > > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_intersections<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, CGAL::Epeck, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, std::vector<CGAL::Triangle_3<CGAL::Epeck>, std::allocator<CGAL::Triangle_3<CGAL::Epeck> > > const&, std::map<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::vector<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object> > >, std::less<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index>, std::allocator<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index const, std::vector<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object> > > > > > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_intersections<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, CGAL::Epeck, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, std::vector<CGAL::Triangle_3<CGAL::Epeck>, std::allocator<CGAL::Triangle_3<CGAL::Epeck> > > const&, std::map<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::vector<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object> > >, std::less<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index>, std::allocator<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index const, std::vector<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object> > > > > > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_intersections<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, CGAL::Epeck, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<long, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, std::vector<CGAL::Triangle_3<CGAL::Epeck>, std::allocator<CGAL::Triangle_3<CGAL::Epeck> > > const&, std::map<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::vector<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object> > >, std::less<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index>, std::allocator<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index const, std::vector<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object> > > > > > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_intersections<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, CGAL::Epeck, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, std::vector<CGAL::Triangle_3<CGAL::Epeck>, std::allocator<CGAL::Triangle_3<CGAL::Epeck> > > const&, std::map<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::vector<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object> > >, std::less<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index>, std::allocator<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index const, std::vector<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object> > > > > > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_intersections<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, CGAL::Epeck, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, std::vector<CGAL::Triangle_3<CGAL::Epeck>, std::allocator<CGAL::Triangle_3<CGAL::Epeck> > > const&, std::map<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::vector<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object> > >, std::less<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index>, std::allocator<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index const, std::vector<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object> > > > > > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_intersections<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, CGAL::Epick, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<CGAL::Triangle_3<CGAL::Epick>, std::allocator<CGAL::Triangle_3<CGAL::Epick> > > const&, std::map<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object> > >, std::less<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index const, std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object> > > > > > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_intersections<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, CGAL::Epick, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<CGAL::Triangle_3<CGAL::Epick>, std::allocator<CGAL::Triangle_3<CGAL::Epick> > > const&, std::map<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object> > >, std::less<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index const, std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object> > > > > > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_intersections<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, CGAL::Epeck, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<CGAL::Triangle_3<CGAL::Epeck>, std::allocator<CGAL::Triangle_3<CGAL::Epeck> > > const&, std::map<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object> > >, std::less<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index const, std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object> > > > > > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_intersections<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, CGAL::Epeck, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<CGAL::Triangle_3<CGAL::Epeck>, std::allocator<CGAL::Triangle_3<CGAL::Epeck> > > const&, std::map<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object> > >, std::less<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index const, std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object> > > > > > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_intersections<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, CGAL::Epick, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, std::vector<CGAL::Triangle_3<CGAL::Epick>, std::allocator<CGAL::Triangle_3<CGAL::Epick> > > const&, std::map<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::vector<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object> > >, std::less<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index>, std::allocator<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index const, std::vector<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object> > > > > > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_intersections<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, CGAL::Epeck, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, std::vector<CGAL::Triangle_3<CGAL::Epeck>, std::allocator<CGAL::Triangle_3<CGAL::Epeck> > > const&, std::map<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, std::vector<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object> > >, std::less<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index>, std::allocator<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index const, std::vector<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, 3, 0, -1, 3>::Index, CGAL::Object> > > > > > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_intersections<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 8, 3, 0, 8, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, CGAL::Epick, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 8, 3, 0, 8, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<CGAL::Triangle_3<CGAL::Epick>, std::allocator<CGAL::Triangle_3<CGAL::Epick> > > const&, std::map<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object> > >, std::less<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index const, std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object> > > > > > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_intersections<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 8, 3, 0, 8, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, CGAL::Epeck, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 8, 3, 0, 8, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<CGAL::Triangle_3<CGAL::Epeck>, std::allocator<CGAL::Triangle_3<CGAL::Epeck> > > const&, std::map<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object> > >, std::less<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index const, std::vector<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object>, std::allocator<std::pair<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, CGAL::Object> > > > > > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/remesh_intersections.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Qingnan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n//\n#ifndef IGL_COPYLEFT_CGAL_REMESH_INTERSECTIONS_H\n#define IGL_COPYLEFT_CGAL_REMESH_INTERSECTIONS_H\n\n#include \"../../igl_inline.h\"\n#include <Eigen/Dense>\n#include \"CGAL_includes.hpp\"\n\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // Remesh faces according to results of intersection detection and\n      // construction (e.g. from `igl::copyleft::cgal::intersect_other` or\n      // `igl::copyleft::cgal::SelfIntersectMesh`)\n      //\n      // Inputs:\n      //   V  #V by 3 list of vertex positions\n      //   F  #F by 3 list of triangle indices into V\n      //   T  #F list of cgal triangles\n      //   offending #offending map taking face indices into F to pairs of order\n      //     of first finding and list of intersection objects from all\n      //     intersections\n      //   stitch_all  if true, merge all vertices with thte same coordiante.\n      // Outputs:\n      //   VV  #VV by 3 list of vertex positions, if stitch_all = false then\n      //     first #V vertices will always be V\n      //   FF  #FF by 3 list of triangle indices into V\n      //   IF  #intersecting face pairs by 2  list of intersecting face pairs,\n      //     indexing F\n      //   J  #FF list of indices into F denoting birth triangle\n      //   IM  / stitch_all = true   #VV list from 0 to #VV-1\n      //       \\ stitch_all = false  #VV list of indices into VV of unique vertices.\n      //\n      template <\n        typename DerivedV,\n        typename DerivedF,\n        typename Kernel,\n        typename DerivedVV,\n        typename DerivedFF,\n        typename DerivedJ,\n        typename DerivedIM>\n      IGL_INLINE void remesh_intersections(\n        const Eigen::PlainObjectBase<DerivedV> & V,\n        const Eigen::PlainObjectBase<DerivedF> & F,\n        const std::vector<CGAL::Triangle_3<Kernel> > & T,\n        const std::map<\n          typename DerivedF::Index,\n            std::vector<\n            std::pair<typename DerivedF::Index, CGAL::Object> > > & offending,\n        bool stitch_all,\n        Eigen::PlainObjectBase<DerivedVV> & VV,\n        Eigen::PlainObjectBase<DerivedFF> & FF,\n        Eigen::PlainObjectBase<DerivedJ> & J,\n        Eigen::PlainObjectBase<DerivedIM> & IM);\n      // Same as above except stitch_all is assumed \"false\"\n      template <\n        typename DerivedV,\n        typename DerivedF,\n        typename Kernel,\n        typename DerivedVV,\n        typename DerivedFF,\n        typename DerivedJ,\n        typename DerivedIM>\n      IGL_INLINE void remesh_intersections(\n        const Eigen::PlainObjectBase<DerivedV> & V,\n        const Eigen::PlainObjectBase<DerivedF> & F,\n        const std::vector<CGAL::Triangle_3<Kernel> > & T,\n        const std::map<\n          typename DerivedF::Index,\n            std::vector<\n            std::pair<typename DerivedF::Index, CGAL::Object> > > & offending,\n        Eigen::PlainObjectBase<DerivedVV> & VV,\n        Eigen::PlainObjectBase<DerivedFF> & FF,\n        Eigen::PlainObjectBase<DerivedJ> & J,\n        Eigen::PlainObjectBase<DerivedIM> & IM);\n    }\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"remesh_intersections.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/remesh_self_intersections.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"remesh_self_intersections.h\"\n#include \"SelfIntersectMesh.h\"\n#include \"../../C_STR.h\"\n#include <list>\n#include <iostream>\n\ntemplate <\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedVV,\n  typename DerivedFF,\n  typename DerivedIF,\n  typename DerivedJ,\n  typename DerivedIM>\nIGL_INLINE void igl::copyleft::cgal::remesh_self_intersections(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  const RemeshSelfIntersectionsParam & params,\n  Eigen::PlainObjectBase<DerivedVV> & VV,\n  Eigen::PlainObjectBase<DerivedFF> & FF,\n  Eigen::PlainObjectBase<DerivedIF> & IF,\n  Eigen::PlainObjectBase<DerivedJ> & J,\n  Eigen::PlainObjectBase<DerivedIM> & IM)\n{\n  using namespace std;\n  if(params.detect_only)\n  {\n    //// This is probably a terrible idea, but CGAL is throwing floating point\n    //// exceptions.\n\n//#ifdef __APPLE__\n//#define IGL_THROW_FPE 11\n//    const auto & throw_fpe = [](int e)\n//    {\n//      throw \"IGL_THROW_FPE\";\n//    };\n//    signal(SIGFPE,throw_fpe);\n//#endif\n\n    typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;\n    typedef\n      SelfIntersectMesh<\n        Kernel,\n        DerivedV,\n        DerivedF,\n        DerivedVV,\n        DerivedFF,\n        DerivedIF,\n        DerivedJ,\n        DerivedIM>\n      SelfIntersectMeshK;\n    SelfIntersectMeshK SIM(V,F,params,VV,FF,IF,J,IM);\n\n//#ifdef __APPLE__\n//    signal(SIGFPE,SIG_DFL);\n//#endif\n\n  }else\n  {\n    typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;\n    typedef\n      SelfIntersectMesh<\n        Kernel,\n        DerivedV,\n        DerivedF,\n        DerivedVV,\n        DerivedFF,\n        DerivedIF,\n        DerivedJ,\n        DerivedIM>\n      SelfIntersectMeshK;\n    SelfIntersectMeshK SIM(V,F,params,VV,FF,IF,J,IM);\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::copyleft::cgal::remesh_self_intersections<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, igl::copyleft::cgal::RemeshSelfIntersectionsParam const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_self_intersections<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, igl::copyleft::cgal::RemeshSelfIntersectionsParam const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_self_intersections<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, igl::copyleft::cgal::RemeshSelfIntersectionsParam const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_self_intersections<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, igl::copyleft::cgal::RemeshSelfIntersectionsParam const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_self_intersections<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, igl::copyleft::cgal::RemeshSelfIntersectionsParam const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_self_intersections<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, igl::copyleft::cgal::RemeshSelfIntersectionsParam const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_self_intersections<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<long, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, igl::copyleft::cgal::RemeshSelfIntersectionsParam const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_self_intersections<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, igl::copyleft::cgal::RemeshSelfIntersectionsParam const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_self_intersections<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, igl::copyleft::cgal::RemeshSelfIntersectionsParam const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_self_intersections<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, igl::copyleft::cgal::RemeshSelfIntersectionsParam const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_self_intersections<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, igl::copyleft::cgal::RemeshSelfIntersectionsParam const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_self_intersections<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 8, 3, 0, 8, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, 8, 3, 0, 8, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, igl::copyleft::cgal::RemeshSelfIntersectionsParam const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_self_intersections<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, igl::copyleft::cgal::RemeshSelfIntersectionsParam const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_self_intersections<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, igl::copyleft::cgal::RemeshSelfIntersectionsParam const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::copyleft::cgal::remesh_self_intersections<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, igl::copyleft::cgal::RemeshSelfIntersectionsParam const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/remesh_self_intersections.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_CGAL_REMESH_SELF_INTERSECTIONS_H\n#define IGL_COPYLEFT_CGAL_REMESH_SELF_INTERSECTIONS_H\n#include \"../../igl_inline.h\"\n#include \"RemeshSelfIntersectionsParam.h\"\n\n#include <Eigen/Dense>\n  \nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // Given a triangle mesh (V,F) compute a new mesh (VV,FF) which is the same\n      // as (V,F) except that any self-intersecting triangles in (V,F) have been\n      // subdivided (new vertices and face created) so that the self-intersection\n      // contour lies exactly on edges in (VV,FF). New vertices will appear in\n      // original faces or on original edges. New vertices on edges are \"merged\"\n      // only across original faces sharing that edge. This means that if the input\n      // triangle mesh is a closed manifold the output will be too.\n      //\n      // Inputs:\n      //   V  #V by 3 list of vertex positions\n      //   F  #F by 3 list of triangle indices into V\n      //   params  struct of optional parameters\n      // Outputs:\n      //   VV  #VV by 3 list of vertex positions\n      //   FF  #FF by 3 list of triangle indices into VV\n      //   IF  #intersecting face pairs by 2  list of intersecting face pairs,\n      //     indexing F\n      //   J  #FF list of indices into F denoting birth triangle\n      //   IM  #VV list of indices into VV of unique vertices.\n      //\n      // Known bugs: If an existing edge in (V,F) lies exactly on another face then\n      // any resulting additional vertices along that edge may not get properly\n      // connected so that the output mesh has the same global topology. This is\n      // because \n      //\n      // Example:\n      //     // resolve intersections\n      //     igl::copyleft::cgal::remesh_self_intersections(V,F,params,VV,FF,IF,J,IM);\n      //     // _apply_ duplicate vertex mapping IM to FF\n      //     for_each(FF.data(),FF.data()+FF.size(),[&IM](int & a){a=IM(a);});\n      //     // remove any vertices now unreferenced after duplicate mapping.\n      //     igl::remove_unreferenced(VV,FF,SV,SF,UIM);\n      //     // Now (SV,SF) is ready to extract outer hull\n      //     igl::copyleft::cgal::outer_hull(SV,SF,G,J,flip);\n      //\n      template <\n        typename DerivedV,\n        typename DerivedF,\n        typename DerivedVV,\n        typename DerivedFF,\n        typename DerivedIF,\n        typename DerivedJ,\n        typename DerivedIM>\n      IGL_INLINE void remesh_self_intersections(\n        const Eigen::PlainObjectBase<DerivedV> & V,\n        const Eigen::PlainObjectBase<DerivedF> & F,\n        const RemeshSelfIntersectionsParam & params,\n        Eigen::PlainObjectBase<DerivedVV> & VV,\n        Eigen::PlainObjectBase<DerivedFF> & FF,\n        Eigen::PlainObjectBase<DerivedIF> & IF,\n        Eigen::PlainObjectBase<DerivedJ> & J,\n        Eigen::PlainObjectBase<DerivedIM> & IM);\n    }\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"remesh_self_intersections.cpp\"\n#endif\n  \n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/remove_unreferenced.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2017 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"../../remove_unreferenced.h\"\n#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\n#ifdef IGL_STATIC_LIBRARY\n#undef IGL_STATIC_LIBRARY\n#include \"../../remove_unreferenced.cpp\"\ntemplate void igl::remove_unreferenced<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::remove_unreferenced<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::remove_unreferenced<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 4, 0, -1, 4>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 4, 0, -1, 4> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/resolve_intersections.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"resolve_intersections.h\"\n#include \"subdivide_segments.h\"\n#include \"row_to_point.h\"\n#include \"../../unique.h\"\n#include \"../../list_to_matrix.h\"\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\n#include <CGAL/Segment_2.h>\n#include <CGAL/Point_2.h>\n#include <algorithm>\n#include <vector>\n\ntemplate <\n  typename DerivedV, \n  typename DerivedE, \n  typename DerivedVI, \n  typename DerivedEI,\n  typename DerivedJ,\n  typename DerivedIM>\nIGL_INLINE void igl::copyleft::cgal::resolve_intersections(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedE> & E,\n  Eigen::PlainObjectBase<DerivedVI> & VI,\n  Eigen::PlainObjectBase<DerivedEI> & EI,\n  Eigen::PlainObjectBase<DerivedJ> & J,\n  Eigen::PlainObjectBase<DerivedIM> & IM)\n{\n  using namespace Eigen;\n  using namespace igl;\n  using namespace std;\n  // Exact scalar type\n  typedef CGAL::Epeck K;\n  typedef K::FT EScalar;\n  typedef CGAL::Segment_2<K> Segment_2;\n  typedef CGAL::Point_2<K> Point_2;\n  typedef Matrix<EScalar,Dynamic,Dynamic>  MatrixXE;\n\n  // Convert vertex positions to exact kernel\n  MatrixXE VE(V.rows(),V.cols());\n  for(int i = 0;i<V.rows();i++)\n  {\n    for(int j = 0;j<V.cols();j++)\n    {\n      VE(i,j) = V(i,j);\n    }\n  }\n\n  const int m = E.rows();\n  // resolve all intersections: silly O(n²) implementation\n  std::vector<std::vector<Point_2> > steiner(m);\n  for(int i = 0;i<m;i++)\n  {\n    Segment_2 si(row_to_point<K>(VE,E(i,0)),row_to_point<K>(VE,E(i,1)));\n    steiner[i].push_back(si.vertex(0));\n    steiner[i].push_back(si.vertex(1));\n    for(int j = i+1;j<m;j++)\n    {\n      Segment_2 sj(row_to_point<K>(VE,E(j,0)),row_to_point<K>(VE,E(j,1)));\n      // do they intersect?\n      if(CGAL::do_intersect(si,sj))\n      {\n        CGAL::Object result = CGAL::intersection(si,sj);\n        if(const Point_2 * p = CGAL::object_cast<Point_2 >(&result))\n        {\n          steiner[i].push_back(*p);\n          steiner[j].push_back(*p);\n          // add intersection point\n        }else if(const Segment_2 * s = CGAL::object_cast<Segment_2 >(&result))\n        {\n          // add both endpoints\n          steiner[i].push_back(s->vertex(0));\n          steiner[j].push_back(s->vertex(0));\n          steiner[i].push_back(s->vertex(1));\n          steiner[j].push_back(s->vertex(1));\n        }else\n        {\n          assert(false && \"Unknown intersection type\");\n        }\n      }\n    }\n  }\n\n  subdivide_segments(V,E,steiner,VI,EI,J,IM);\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/resolve_intersections.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_CGAL_RESOLVE_INTERSECTIONS_H\n#define IGL_COPYLEFT_CGAL_RESOLVE_INTERSECTIONS_H\n#include \"../../igl_inline.h\"\n#include <Eigen/Core>\n\nnamespace igl\n{\n  namespace copyleft\n  {\n    // RESOLVE_INTERSECTIONS Given a list of possible intersecting segments with\n    // endpoints, split segments to overlap only at endpoints\n    //\n    // Inputs:\n    //   V  #V by 2 list of vertex positions\n    //   E  #E by 2 list of segment indices into V\n    // Outputs:\n    //   VI  #VI by 2 list of output vertex positions, copies of V are always\n    //     the first #V vertices\n    //   EI  #EI by 2 list of segment indices into V, #EI ≥ #E\n    //   J  #EI list of indices into E revealing \"parent segments\"\n    //   IM  #VI list of indices into VV of unique vertices.\n    namespace cgal\n    {\n      template <\n        typename DerivedV, \n        typename DerivedE, \n        typename DerivedVI, \n        typename DerivedEI,\n        typename DerivedJ,\n        typename DerivedIM>\n      IGL_INLINE void resolve_intersections(\n        const Eigen::PlainObjectBase<DerivedV> & V,\n        const Eigen::PlainObjectBase<DerivedE> & E,\n        Eigen::PlainObjectBase<DerivedVI> & VI,\n        Eigen::PlainObjectBase<DerivedEI> & EI,\n        Eigen::PlainObjectBase<DerivedJ> & J,\n        Eigen::PlainObjectBase<DerivedIM> & IM);\n    }\n  }\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"resolve_intersections.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/row_to_point.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"row_to_point.h\"\n\ntemplate <\n  typename Kernel,\n  typename DerivedV>\nIGL_INLINE CGAL::Point_2<Kernel> igl::copyleft::cgal::row_to_point(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const typename DerivedV::Index & i)\n{\n  return CGAL::Point_2<Kernel>(V(i,0),V(i,1));\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/row_to_point.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_CGAL_ROW_TO_POINT_H\n#define IGL_COPYLEFT_CGAL_ROW_TO_POINT_H\n#include \"../../igl_inline.h\"\n#include <Eigen/Core>\n#include <CGAL/Point_2.h>\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // Extract a row from V and treat as a 2D cgal point (only first two\n      // columns of V are used).\n      // \n      // Inputs:\n      //   V  #V by 2 list of vertex positions\n      //   i  row index\n      // Returns 2D cgal point\n      template <\n        typename Kernel,\n        typename DerivedV>\n      IGL_INLINE CGAL::Point_2<Kernel> row_to_point(\n        const Eigen::PlainObjectBase<DerivedV> & V,\n        const typename DerivedV::Index & i);\n    }\n  }\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"row_to_point.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/segment_segment_squared_distance.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"segment_segment_squared_distance.h\"\n#include <CGAL/Vector_3.h>\n\n// http://geomalgorithms.com/a07-_distance.html\ntemplate < typename Kernel>\nIGL_INLINE bool igl::copyleft::cgal::segment_segment_squared_distance(\n    const CGAL::Segment_3<Kernel> & S1,\n    const CGAL::Segment_3<Kernel> & S2,\n    CGAL::Point_3<Kernel> & P1,\n    CGAL::Point_3<Kernel> & P2,\n    typename Kernel::FT & dst)\n{\n  typedef CGAL::Point_3<Kernel> Point_3;\n  typedef CGAL::Vector_3<Kernel> Vector_3;\n  typedef typename Kernel::FT EScalar;\n  if(S1.is_degenerate())\n  {\n    // All points on S1 are the same\n    P1 = S1.source();\n    point_segment_squared_distance(P1,S2,P2,dst);\n    return true;\n  }else if(S2.is_degenerate())\n  {\n    assert(!S1.is_degenerate());\n    // All points on S2 are the same\n    P2 = S2.source();\n    point_segment_squared_distance(P2,S1,P1,dst);\n    return true;\n  }\n\n  assert(!S1.is_degenerate());\n  assert(!S2.is_degenerate());\n\n  Vector_3 u = S1.target() - S1.source();\n  Vector_3 v = S2.target() - S2.source();\n  Vector_3 w = S1.source() - S2.source();\n\n  const auto a = u.dot(u);         // always >= 0\n  const auto b = u.dot(v);\n  const auto c = v.dot(v);         // always >= 0\n  const auto d = u.dot(w);\n  const auto e = v.dot(w);\n  const auto D = a*c - b*b;        // always >= 0\n  assert(D>=0);\n  const auto sc=D, sN=D, sD = D;       // sc = sN / sD, default sD = D >= 0\n  const auto tc=D, tN=D, tD = D;       // tc = tN / tD, default tD = D >= 0\n\n  bool parallel = false;\n  // compute the line parameters of the two closest points\n  if (D==0) \n  { \n    // the lines are almost parallel\n    parallel = true;\n    sN = 0.0;         // force using source point on segment S1\n    sD = 1.0;         // to prevent possible division by 0.0 later\n    tN = e;\n    tD = c;\n  } else\n  {\n    // get the closest points on the infinite lines\n    sN = (b*e - c*d);\n    tN = (a*e - b*d);\n    if (sN < 0.0) \n    { \n      // sc < 0 => the s=0 edge is visible\n      sN = 0.0;\n      tN = e;\n      tD = c;\n    } else if (sN > sD) \n    {  // sc > 1  => the s=1 edge is visible\n      sN = sD;\n      tN = e + b;\n      tD = c;\n    }\n  }\n\n  if (tN < 0.0) \n  {\n    // tc < 0 => the t=0 edge is visible\n    tN = 0.0;\n    // recompute sc for this edge\n    if (-d < 0.0)\n    {\n      sN = 0.0;\n    }else if (-d > a)\n    {\n      sN = sD;\n    }else \n    {\n      sN = -d;\n      sD = a;\n    }\n  }else if (tN > tD) \n  {\n    // tc > 1  => the t=1 edge is visible\n    tN = tD;\n    // recompute sc for this edge\n    if ((-d + b) < 0.0)\n    {\n      sN = 0;\n    }else if ((-d + b) > a)\n    {\n      sN = sD;\n    }else\n    {\n      sN = (-d +  b);\n      sD = a;\n    }\n  }\n  // finally do the division to get sc and tc\n  sc = (abs(sN) == 0 ? 0.0 : sN / sD);\n  tc = (abs(tN) == 0 ? 0.0 : tN / tD);\n\n  // get the difference of the two closest points\n  P1 = S1.source() + sc*(S1.target()-S1.source());\n  P2 = S2.source() + sc*(S2.target()-S2.source());\n  Vector_3   dP = w + (sc * u) - (tc * v);  // =  S1(sc) - S2(tc)\n  assert(dP == (P1-P2));\n\n  dst = dP.squared_length();   // return the closest distance\n  return parallel;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/segment_segment_squared_distance.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_CGAL_SEGMENT_SEGMENT_SQUARED_DISTANCE_H\n#define IGL_COPYLEFT_CGAL_SEGMENT_SEGMENT_SQUARED_DISTANCE_H\n#include \"../../igl_inline.h\"\n#include <CGAL/Segment_3.h>\n#include <CGAL/Point_3.h>\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // Given two segments S1 and S2 find the points on each of closest\n      // approach and the squared distance thereof.\n      // \n      // Inputs:\n      //   S1  first segment\n      //   S2  second segment\n      // Outputs:\n      //   P1  point on S1 closest to S2\n      //   P2  point on S2 closest to S1\n      //   d  distance betwee P1 and S2\n      // Returns true if the closest approach is unique.\n      template < typename Kernel>\n      IGL_INLINE bool segment_segment_squared_distance(\n          const CGAL::Segment_3<Kernel> & S1,\n          const CGAL::Segment_3<Kernel> & S2,\n          CGAL::Point_3<Kernel> & P1,\n          CGAL::Point_3<Kernel> & P2,\n          typename Kernel::FT & d\n          );\n\n    }\n  }\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"segment_segment_squared_distance.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/signed_distance_isosurface.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"signed_distance_isosurface.h\"\n#include \"point_mesh_squared_distance.h\"\n#include \"complex_to_mesh.h\"\n\n#include \"../../AABB.h\"\n#include \"../../per_face_normals.h\"\n#include \"../../per_edge_normals.h\"\n#include \"../../per_vertex_normals.h\"\n#include \"../../centroid.h\"\n#include \"../../WindingNumberAABB.h\"\n\n#include <CGAL/Surface_mesh_default_triangulation_3.h>\n#include <CGAL/Complex_2_in_triangulation_3.h>\n#include <CGAL/make_surface_mesh.h>\n#include <CGAL/Implicit_surface_3.h>\n#include <CGAL/IO/output_surface_facets_to_polyhedron.h>\n// Axis-aligned bounding box tree for tet tri intersection\n#include <CGAL/AABB_tree.h>\n#include <CGAL/AABB_traits.h>\n#include <CGAL/AABB_triangle_primitive.h>\n#include <vector>\n\nIGL_INLINE bool igl::copyleft::cgal::signed_distance_isosurface(\n  const Eigen::MatrixXd & IV,\n  const Eigen::MatrixXi & IF,\n  const double level,\n  const double angle_bound,\n  const double radius_bound,\n  const double distance_bound,\n  const SignedDistanceType sign_type,\n  Eigen::MatrixXd & V,\n  Eigen::MatrixXi & F)\n{\n  using namespace std;\n  using namespace Eigen;\n\n  // default triangulation for Surface_mesher\n  typedef CGAL::Surface_mesh_default_triangulation_3 Tr;\n  // c2t3\n  typedef CGAL::Complex_2_in_triangulation_3<Tr> C2t3;\n  typedef Tr::Geom_traits GT;//Kernel\n  typedef GT::Sphere_3 Sphere_3;\n  typedef GT::Point_3 Point_3;\n  typedef GT::FT FT;\n  typedef std::function<FT (Point_3)> Function;\n  typedef CGAL::Implicit_surface_3<GT, Function> Surface_3;\n\n  AABB<Eigen::MatrixXd,3> tree;\n  tree.init(IV,IF);\n\n  Eigen::MatrixXd FN,VN,EN;\n  Eigen::MatrixXi E;\n  Eigen::VectorXi EMAP;\n  WindingNumberAABB<Eigen::Vector3d> hier;\n  switch(sign_type)\n  {\n    default:\n      assert(false && \"Unknown SignedDistanceType\");\n    case SIGNED_DISTANCE_TYPE_UNSIGNED:\n      // do nothing\n      break;\n    case SIGNED_DISTANCE_TYPE_DEFAULT:\n    case SIGNED_DISTANCE_TYPE_WINDING_NUMBER:\n      hier.set_mesh(IV,IF);\n      hier.grow();\n      break;\n    case SIGNED_DISTANCE_TYPE_PSEUDONORMAL:\n      // \"Signed Distance Computation Using the Angle Weighted Pseudonormal\"\n      // [Bærentzen & Aanæs 2005]\n      per_face_normals(IV,IF,FN);\n      per_vertex_normals(IV,IF,PER_VERTEX_NORMALS_WEIGHTING_TYPE_ANGLE,FN,VN);\n      per_edge_normals(\n        IV,IF,PER_EDGE_NORMALS_WEIGHTING_TYPE_UNIFORM,FN,EN,E,EMAP);\n      break;\n  }\n\n  Tr tr;            // 3D-Delaunay triangulation\n  C2t3 c2t3 (tr);   // 2D-complex in 3D-Delaunay triangulation\n  // defining the surface\n  const auto & IVmax = IV.colwise().maxCoeff();\n  const auto & IVmin = IV.colwise().minCoeff();\n  const double bbd = (IVmax-IVmin).norm();\n  const double r = bbd/2.;\n  const auto & IVmid = 0.5*(IVmax + IVmin);\n  // Supposedly the implict needs to evaluate to <0 at cmid...\n  // http://doc.cgal.org/latest/Surface_mesher/classCGAL_1_1Implicit__surface__3.html\n  Point_3 cmid(IVmid(0),IVmid(1),IVmid(2));\n  Function fun;\n  switch(sign_type)\n  {\n    default:\n      assert(false && \"Unknown SignedDistanceType\");\n    case SIGNED_DISTANCE_TYPE_UNSIGNED:\n      fun = \n        [&tree,&IV,&IF,&level](const Point_3 & q) -> FT\n        {\n          int i;\n          RowVector3d c;\n          const double sd = tree.squared_distance(\n            IV,IF,RowVector3d(q.x(),q.y(),q.z()),i,c);\n          return sd-level;\n        };\n    case SIGNED_DISTANCE_TYPE_DEFAULT:\n    case SIGNED_DISTANCE_TYPE_WINDING_NUMBER:\n      fun = \n        [&tree,&IV,&IF,&hier,&level](const Point_3 & q) -> FT\n        {\n          const double sd = signed_distance_winding_number(\n            tree,IV,IF,hier,RowVector3d(q.x(),q.y(),q.z()));\n          return sd-level;\n        };\n      break;\n    case SIGNED_DISTANCE_TYPE_PSEUDONORMAL:\n      fun = [&tree,&IV,&IF,&FN,&VN,&EN,&EMAP,&level](const Point_3 & q) -> FT\n        {\n          const double sd = \n            igl::signed_distance_pseudonormal(\n              tree,IV,IF,FN,VN,EN,EMAP,RowVector3d(q.x(),q.y(),q.z()));\n          return sd- level;\n        };\n      break;\n  }\n  Sphere_3 bounding_sphere(cmid, (r+level)*(r+level));\n  Surface_3 surface(fun,bounding_sphere);\n  CGAL::Surface_mesh_default_criteria_3<Tr> \n    criteria(angle_bound,radius_bound,distance_bound);\n  // meshing surface\n  CGAL::make_surface_mesh(c2t3, surface, criteria, CGAL::Manifold_tag());\n  // complex to (V,F)\n  return igl::copyleft::cgal::complex_to_mesh(c2t3,V,F);\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/signed_distance_isosurface.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_CGAL_SIGNED_DISTANCE_ISOSURFACE_H\n#define IGL_COPYLEFT_CGAL_SIGNED_DISTANCE_ISOSURFACE_H\n#include \"../../igl_inline.h\"\n#include \"../../signed_distance.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // SIGNED_DISTANCE_ISOSURFACE Compute the contour of an iso-level of the\n      // signed distance field to a given mesh.\n      //\n      // Inputs:\n      //   IV  #IV by 3 list of input mesh vertex positions\n      //   IF  #IF by 3 list of input triangle indices\n      //   level  iso-level to contour in world coords, negative is inside.\n      //   angle_bound  lower bound on triangle angles (mesh quality) (e.g. 28)\n      //   radius_bound  upper bound on triangle size (mesh density?) (e.g. 0.02)\n      //   distance_bound  cgal mysterious parameter (mesh density?) (e.g. 0.01)\n      //   sign_type  method for computing distance _sign_ (see\n      //     ../signed_distance.h)\n      // Outputs:\n      //   V  #V by 3 list of input mesh vertex positions\n      //   F  #F by 3 list of input triangle indices\n      //  \n      IGL_INLINE bool signed_distance_isosurface(\n        const Eigen::MatrixXd & IV,\n        const Eigen::MatrixXi & IF,\n        const double level,\n        const double angle_bound,\n        const double radius_bound,\n        const double distance_bound,\n        const SignedDistanceType sign_type,\n        Eigen::MatrixXd & V,\n        Eigen::MatrixXi & F);\n    }\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"signed_distance_isosurface.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/slice.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2017 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"../../slice.h\"\n#ifdef IGL_STATIC_LIBRARY\n#undef IGL_STATIC_LIBRARY\n#include \"../../slice.cpp\"\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/snap_rounding.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"snap_rounding.h\"\n#include \"resolve_intersections.h\"\n#include \"subdivide_segments.h\"\n#include \"../../remove_unreferenced.h\"\n#include \"../../unique.h\"\n#include <CGAL/Segment_2.h>\n#include <CGAL/Point_2.h>\n#include <CGAL/Vector_2.h>\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\n#include <algorithm>\n\ntemplate <\n  typename DerivedV, \n  typename DerivedE, \n  typename DerivedVI, \n  typename DerivedEI,\n  typename DerivedJ>\nIGL_INLINE void igl::copyleft::cgal::snap_rounding(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedE> & E,\n  Eigen::PlainObjectBase<DerivedVI> & VI,\n  Eigen::PlainObjectBase<DerivedEI> & EI,\n  Eigen::PlainObjectBase<DerivedJ> & J)\n{\n  using namespace Eigen;\n  using namespace igl;\n  using namespace igl::copyleft::cgal;\n  using namespace std;\n  // Exact scalar type\n  typedef CGAL::Epeck Kernel;\n  typedef Kernel::FT EScalar;\n  typedef CGAL::Segment_2<Kernel> Segment_2;\n  typedef CGAL::Point_2<Kernel> Point_2;\n  typedef CGAL::Vector_2<Kernel> Vector_2;\n  typedef Matrix<EScalar,Dynamic,Dynamic>  MatrixXE;\n  // Convert vertex positions to exact kernel\n\n  MatrixXE VE;\n  {\n    VectorXi IM;\n    resolve_intersections(V,E,VE,EI,J,IM);\n    for_each(\n      EI.data(),\n      EI.data()+EI.size(),\n      [&IM](typename DerivedEI::Scalar& i){i=IM(i);});\n    VectorXi _;\n    remove_unreferenced( MatrixXE(VE), DerivedEI(EI), VE,EI,_);\n  }\n\n  // find all hot pixels\n  //// southwest and north east corners\n  //const RowVector2i SW(\n  //  round(VE.col(0).minCoeff()),\n  //  round(VE.col(1).minCoeff()));\n  //const RowVector2i NE(\n  //  round(VE.col(0).maxCoeff()),\n  //  round(VE.col(1).maxCoeff()));\n\n  // https://github.com/CGAL/cgal/issues/548\n  // Round an exact scalar to the nearest integer. A priori can't just round\n  // double. Suppose e=0.5+ε but double(e)<0.5\n  //\n  // Inputs:\n  //   e  exact number\n  // Outputs:\n  //   i  closest integer\n  const auto & round = [](const EScalar & e)->int\n  {\n    const double d = CGAL::to_double(e);\n    // get an integer that's near the closest int\n    int i = std::round(d);\n    EScalar di_sqr = CGAL::square((e-EScalar(i)));\n    const auto & search = [&i,&di_sqr,&e](const int dir)\n    {\n      while(true)\n      {\n        const int j = i+dir;\n        const EScalar dj_sqr = CGAL::square((e-EScalar(j)));\n        if(dj_sqr < di_sqr)\n        {\n          i = j;\n          di_sqr = dj_sqr;\n        }else\n        {\n          break;\n        }\n      }\n    };\n    // Try to increase/decrease int\n    search(1);\n    search(-1);\n    return i;\n  };\n  vector<Point_2> hot;\n  for(int i = 0;i<VE.rows();i++)\n  {\n    hot.emplace_back(round(VE(i,0)),round(VE(i,1)));\n  }\n  {\n    std::vector<size_t> _1,_2;\n    igl::unique(vector<Point_2>(hot),hot,_1,_2);\n  }\n\n  // find all segments intersecting hot pixels\n  //   split edge at closest point to hot pixel center\n  vector<vector<Point_2>>  steiner(EI.rows());\n  // initialize each segment with endpoints\n  for(int i = 0;i<EI.rows();i++)\n  {\n    steiner[i].emplace_back(VE(EI(i,0),0),VE(EI(i,0),1));\n    steiner[i].emplace_back(VE(EI(i,1),0),VE(EI(i,1),1));\n  }\n  // silly O(n²) implementation\n  for(const Point_2 & h : hot)\n  {\n    // North, East, South, West\n    Segment_2 wall[4] = \n    {\n      {h+Vector_2(-0.5, 0.5),h+Vector_2( 0.5, 0.5)},\n      {h+Vector_2( 0.5, 0.5),h+Vector_2( 0.5,-0.5)},\n      {h+Vector_2( 0.5,-0.5),h+Vector_2(-0.5,-0.5)},\n      {h+Vector_2(-0.5,-0.5),h+Vector_2(-0.5, 0.5)}\n    };\n    // consider all segments\n    for(int i = 0;i<EI.rows();i++)\n    {\n      // endpoints\n      const Point_2 s(VE(EI(i,0),0),VE(EI(i,0),1));\n      const Point_2 d(VE(EI(i,1),0),VE(EI(i,1),1));\n      // if either end-point is in h's pixel then ignore\n      const Point_2 rs(round(s.x()),round(s.y()));\n      const Point_2 rd(round(d.x()),round(d.y()));\n      if(h == rs || h == rd)\n      {\n        continue;\n      }\n      // otherwise check for intersections with walls consider all walls\n      const Segment_2 si(s,d);\n      vector<Point_2> hits;\n      for(int j = 0;j<4;j++)\n      {\n        const Segment_2 & sj = wall[j];\n        if(CGAL::do_intersect(si,sj))\n        {\n          CGAL::Object result = CGAL::intersection(si,sj);\n          if(const Point_2 * p = CGAL::object_cast<Point_2 >(&result))\n          {\n            hits.push_back(*p);\n          }else if(const Segment_2 * s = CGAL::object_cast<Segment_2 >(&result))\n          {\n            // add both endpoints\n            hits.push_back(s->vertex(0));\n            hits.push_back(s->vertex(1));\n          }\n        }\n      }\n      if(hits.size() == 0)\n      {\n        continue;\n      }\n      // centroid of hits\n      Vector_2 cen(0,0);\n      for(const Point_2 & hit : hits)\n      {\n        cen = Vector_2(cen.x()+hit.x(), cen.y()+hit.y());\n      }\n      cen = Vector_2(cen.x()/EScalar(hits.size()),cen.y()/EScalar(hits.size()));\n      const Point_2 rcen(round(cen.x()),round(cen.y()));\n      // after all of that, don't add as a steiner unless it's going to round\n      // to h\n      if(rcen == h)\n      {\n        steiner[i].emplace_back(cen.x(),cen.y());\n      }\n    }\n  }\n  {\n    DerivedJ prevJ = J;\n    VectorXi IM;\n    subdivide_segments(MatrixXE(VE),MatrixXi(EI),steiner,VE,EI,J,IM);\n    for_each(J.data(),J.data()+J.size(),[&prevJ](typename DerivedJ::Scalar & j){j=prevJ(j);});\n    for_each(\n      EI.data(),\n      EI.data()+EI.size(),\n      [&IM](typename DerivedEI::Scalar& i){i=IM(i);});\n    VectorXi _;\n    remove_unreferenced( MatrixXE(VE), DerivedEI(EI), VE,EI,_);\n  }\n\n\n  VI.resizeLike(VE);\n  for(int i = 0;i<VE.rows();i++)\n  {\n    for(int j = 0;j<VE.cols();j++)\n    {\n      VI(i,j) = round(CGAL::to_double(VE(i,j)));\n    }\n  }\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/snap_rounding.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_CGAL_SNAP_ROUNDING_H\n#define IGL_COPYLEFT_CGAL_SNAP_ROUNDING_H\n\n#include \"../../igl_inline.h\"\n#include <Eigen/Core>\n\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // SNAP_ROUNDING Snap a list of possible intersecting segments with\n      // endpoints in any precision to _the_ integer grid.\n      //\n      // Inputs:\n      //   V  #V by 2 list of vertex positions\n      //   E  #E by 2 list of segment indices into V\n      // Outputs:\n      //   VI  #VI by 2 list of output integer vertex positions, rounded copies\n      //     of V are always the first #V vertices\n      //   EI  #EI by 2 list of segment indices into V, #EI ≥ #E\n      //   J  #EI list of indices into E revealing \"parent segments\"\n      template <\n        typename DerivedV, \n        typename DerivedE, \n        typename DerivedVI, \n        typename DerivedEI,\n        typename DerivedJ>\n      IGL_INLINE void snap_rounding(\n        const Eigen::PlainObjectBase<DerivedV> & V,\n        const Eigen::PlainObjectBase<DerivedE> & E,\n        Eigen::PlainObjectBase<DerivedVI> & VI,\n        Eigen::PlainObjectBase<DerivedEI> & EI,\n        Eigen::PlainObjectBase<DerivedJ> & J);\n    }\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"snap_rounding.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/string_to_mesh_boolean_type.cpp",
    "content": "﻿#include \"string_to_mesh_boolean_type.h\"\n#include <algorithm>\n#include <cassert>\n#include <vector>\n\nIGL_INLINE bool igl::copyleft::cgal::string_to_mesh_boolean_type( \n  const std::string & s,\n  MeshBooleanType & type)\n{\n  using namespace std;\n  string eff_s = s;\n  transform(eff_s.begin(), eff_s.end(), eff_s.begin(), ::tolower);\n  const auto & find_any = \n    [](const vector<string> & haystack, const string & needle)->bool\n  {\n    return find(haystack.begin(), haystack.end(), needle) != haystack.end();\n  };\n  if(find_any({\"union\",\"unite\",\"u\",\"∪\"},eff_s))\n  {\n    type = MESH_BOOLEAN_TYPE_UNION;\n  }else if(find_any({\"intersect\",\"intersection\",\"i\",\"∩\"},eff_s))\n  {\n    type = MESH_BOOLEAN_TYPE_INTERSECT;\n  }else if(\n    find_any(\n      {\"minus\",\"subtract\",\"difference\",\"relative complement\",\"m\",\"\\\\\"},eff_s))\n  {\n    type = MESH_BOOLEAN_TYPE_MINUS;\n  }else if(find_any({\"xor\",\"symmetric difference\",\"x\",\"∆\"},eff_s))\n  {\n    type = MESH_BOOLEAN_TYPE_XOR;\n  }else if(find_any({\"resolve\"},eff_s))\n  {\n    type = MESH_BOOLEAN_TYPE_RESOLVE;\n  }else\n  {\n    return false;\n  }\n  return true;\n}\n\nIGL_INLINE igl::MeshBooleanType \nigl::copyleft::cgal::string_to_mesh_boolean_type( \n  const std::string & s)\n{\n  MeshBooleanType type;\n#ifndef NDEBUG\n  const bool ret = \n#endif\n    string_to_mesh_boolean_type(s,type);\n  assert(ret && \"Unknown MeshBooleanType name\");\n  return type;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/string_to_mesh_boolean_type.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_CGAL_STRING_TO_MESH_BOOLEAN_H\n#define IGL_COPYLEFT_CGAL_STRING_TO_MESH_BOOLEAN_H\n\n#include \"../../igl_inline.h\"\n#include \"../../MeshBooleanType.h\"\n#include <string>\n\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // Convert string to boolean type\n      //\n      //  Inputs:\n      //    s  string identifying type, one of the following:\n      //      \"union\",\"intersect\",\"minus\",\"xor\",\"resolve\"\n      //  Outputs:\n      //    type  type of boolean operation\n      // Returns true only on success\n      //     \n      IGL_INLINE bool string_to_mesh_boolean_type(\n        const std::string & s,\n        MeshBooleanType & type);\n      // Returns type without error handling\n      IGL_INLINE MeshBooleanType string_to_mesh_boolean_type(\n        const std::string & s);\n    }\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"string_to_mesh_boolean_type.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/subdivide_segments.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"subdivide_segments.h\"\n#include \"row_to_point.h\"\n#include \"assign_scalar.h\"\n#include \"../../unique.h\"\n#include \"../../list_to_matrix.h\"\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\n#include <CGAL/Segment_2.h>\n#include <CGAL/Point_2.h>\n#include <algorithm>\n#include <vector>\n\ntemplate <\n  typename DerivedV, \n  typename DerivedE,\n  typename Kernel, \n  typename DerivedVI, \n  typename DerivedEI,\n  typename DerivedJ,\n  typename DerivedIM>\nIGL_INLINE void igl::copyleft::cgal::subdivide_segments(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedE> & E,\n  const std::vector<std::vector<CGAL::Point_2<Kernel> > > & _steiner,\n  Eigen::PlainObjectBase<DerivedVI> & VI,\n  Eigen::PlainObjectBase<DerivedEI> & EI,\n  Eigen::PlainObjectBase<DerivedJ> & J,\n  Eigen::PlainObjectBase<DerivedIM> & IM)\n{\n  using namespace Eigen;\n  using namespace igl;\n  using namespace std;\n\n  // Exact scalar type\n  typedef Kernel K;\n  typedef typename Kernel::FT EScalar;\n  typedef CGAL::Segment_2<Kernel> Segment_2;\n  typedef CGAL::Point_2<Kernel> Point_2;\n  typedef Matrix<EScalar,Dynamic,Dynamic>  MatrixXE;\n\n  // non-const copy\n  std::vector<std::vector<CGAL::Point_2<Kernel> > > steiner = _steiner;\n\n  // Convert vertex positions to exact kernel\n  MatrixXE VE(V.rows(),V.cols());\n  for(int i = 0;i<V.rows();i++)\n  {\n    for(int j = 0;j<V.cols();j++)\n    {\n      VE(i,j) = V(i,j);\n    }\n  }\n\n  // number of original vertices\n  const int n = V.rows();\n  // number of original segments\n  const int m = E.rows();\n  // now steiner contains lists of points (unsorted) for each edge. Sort them\n  // and count total number of vertices and edges\n  int ni = 0;\n  int mi = 0;\n  // new steiner points\n  std::vector<Point_2> S;\n  std::vector<std::vector<typename DerivedE::Scalar> > vEI;\n  std::vector<typename DerivedJ::Scalar> vJ;\n  for(int i = 0;i<m;i++)\n  {\n    {\n      const Point_2 s = row_to_point<K>(VE,E(i,0));\n      std::sort(\n        steiner[i].begin(),\n        steiner[i].end(),\n        [&s](const Point_2 & A, const Point_2 & B)->bool\n        {\n          return (A-s).squared_length() < (B-s).squared_length();\n        });\n    }\n    // remove duplicates\n    steiner[i].erase(\n      std::unique(steiner[i].begin(), steiner[i].end()), \n      steiner[i].end());\n    {\n      int s = E(i,0);\n      // legs to each steiner in order\n      for(int j = 1;j<steiner[i].size()-1;j++)\n      {\n        int d = n+S.size();\n        S.push_back(steiner[i][j]);\n        vEI.push_back({s,d});\n        vJ.push_back(i);\n        s = d;\n      }\n      // don't forget last (which might only) leg\n      vEI.push_back({s,E(i,1)});\n      vJ.push_back(i);\n    }\n  }\n  // potentially unnecessary copying ...\n  VI.resize(n+S.size(),2);\n  for(int i = 0;i<V.rows();i++)\n  {\n    for(int j = 0;j<V.cols();j++)\n    {\n      assign_scalar(V(i,j),VI(i,j));\n    }\n  }\n  for(int i = 0;i<S.size();i++)\n  {\n    assign_scalar(S[i].x(),VI(n+i,0));\n    assign_scalar(S[i].y(),VI(n+i,1));\n  }\n  list_to_matrix(vEI,EI);\n  list_to_matrix(vJ,J);\n  {\n    // Find unique mapping\n    std::vector<Point_2> vVES,_1;\n    for(int i = 0;i<n;i++)\n    {\n      vVES.push_back(row_to_point<K>(VE,i));\n    }\n    vVES.insert(vVES.end(),S.begin(),S.end());\n    std::vector<size_t> vA,vIM;\n    igl::unique(vVES,_1,vA,vIM);\n    // Push indices back into vVES\n    for_each(vIM.data(),vIM.data()+vIM.size(),[&vA](size_t & i){i=vA[i];});\n    list_to_matrix(vIM,IM);\n  }\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/subdivide_segments.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_CGAL_SUBDIVIDE_SEGMENTS_H\n#define IGL_COPYLEFT_CGAL_SUBDIVIDE_SEGMENTS_H\n#include \"../../igl_inline.h\"\n#include <Eigen/Core>\n#include <CGAL/Segment_2.h>\n#include <CGAL/Point_2.h>\n#include <vector>\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // Insert steiner points to subdivide a given set of line segments\n      // \n      // Inputs:\n      //   V  #V by 2 list of vertex positions\n      //   E  #E by 2 list of segment indices into V\n      //   steiner  #E list of lists of unsorted steiner points (including\n      //     endpoints) along the #E original segments\n      // Outputs:\n      //   VI  #VI by 2 list of output vertex positions, copies of V are always\n      //     the first #V vertices\n      //   EI  #EI by 2 list of segment indices into V, #EI ≥ #E\n      //   J  #EI list of indices into E revealing \"parent segments\"\n      //   IM  #VI list of indices into VV of unique vertices.\n      template <\n        typename DerivedV, \n        typename DerivedE,\n        typename Kernel, \n        typename DerivedVI, \n        typename DerivedEI,\n        typename DerivedJ,\n        typename DerivedIM>\n      IGL_INLINE void subdivide_segments(\n        const Eigen::PlainObjectBase<DerivedV> & V,\n        const Eigen::PlainObjectBase<DerivedE> & E,\n        const std::vector<std::vector<CGAL::Point_2<Kernel> > > & steiner,\n        Eigen::PlainObjectBase<DerivedVI> & VI,\n        Eigen::PlainObjectBase<DerivedEI> & EI,\n        Eigen::PlainObjectBase<DerivedJ> & J,\n        Eigen::PlainObjectBase<DerivedIM> & IM);\n    }\n  }\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"subdivide_segments.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/submesh_aabb_tree.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"submesh_aabb_tree.h\"\n#include <stdexcept>\n\ntemplate<\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedI,\n  typename Kernel>\nIGL_INLINE void igl::copyleft::cgal::submesh_aabb_tree(\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  const Eigen::PlainObjectBase<DerivedI>& I,\n  CGAL::AABB_tree<\n    CGAL::AABB_traits<\n      Kernel, \n      CGAL::AABB_triangle_primitive<\n        Kernel, typename std::vector<\n          typename Kernel::Triangle_3 >::iterator > > > & tree,\n  std::vector<typename Kernel::Triangle_3 > & triangles,\n  std::vector<bool> & in_I)\n{\n  in_I.resize(F.rows(), false);\n  const size_t num_faces = I.rows();\n  for (size_t i=0; i<num_faces; i++) \n  {\n    const Eigen::Vector3i f = F.row(I(i, 0));\n    in_I[I(i,0)] = true;\n    triangles.emplace_back(\n      typename Kernel::Point_3(V(f[0], 0), V(f[0], 1), V(f[0], 2)),\n      typename Kernel::Point_3(V(f[1], 0), V(f[1], 1), V(f[1], 2)),\n      typename Kernel::Point_3(V(f[2], 0), V(f[2], 1), V(f[2], 2)));\n#ifndef NDEBUG\n    if (triangles.back().is_degenerate()) \n    {\n      throw std::runtime_error(\n        \"Input facet components contains degenerated triangles\");\n    }\n#endif\n  }\n  tree.insert(triangles.begin(), triangles.end());\n  tree.accelerate_distance_queries();\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::copyleft::cgal::submesh_aabb_tree<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, CGAL::Epeck>(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, CGAL::AABB_tree<CGAL::AABB_traits<CGAL::Epeck, CGAL::AABB_triangle_primitive<CGAL::Epeck, std::vector<CGAL::Epeck::Triangle_3, std::allocator<CGAL::Epeck::Triangle_3> >::iterator, CGAL::Boolean_tag<false> > > >&, std::vector<CGAL::Epeck::Triangle_3, std::allocator<CGAL::Epeck::Triangle_3> >&, std::vector<bool, std::allocator<bool> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/submesh_aabb_tree.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n//\n#ifndef IGL_COPYLET_CGAL_SUBMESH_AABB_TREE_H\n#define IGL_COPYLET_CGAL_SUBMESH_AABB_TREE_H\n\n#include \"../../igl_inline.h\"\n#include <Eigen/Core>\n#include <vector>\n\n#include <CGAL/AABB_tree.h>\n#include <CGAL/AABB_traits.h>\n#include <CGAL/AABB_triangle_primitive.h>\n#include <CGAL/intersections.h>\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\n\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // Build an AABB tree for a submesh indicated by a face selection list I\n      // of a full mesh (V,F)\n      //\n      // Inputs:\n      //   V  #V by 3 array of vertices.\n      //   F  #F by 3 array of faces.\n      //   I  #I list of triangle indices to consider.\n      // Outputs:\n      //   tree  aabb containing triangles of (V,F(I,:))\n      //   triangles  #I list of cgal triangles\n      //   in_I  #F list of whether in submesh\n      template<\n        typename DerivedV,\n        typename DerivedF,\n        typename DerivedI,\n        typename Kernel>\n      IGL_INLINE void submesh_aabb_tree(\n        const Eigen::PlainObjectBase<DerivedV>& V,\n        const Eigen::PlainObjectBase<DerivedF>& F,\n        const Eigen::PlainObjectBase<DerivedI>& I,\n        CGAL::AABB_tree<\n          CGAL::AABB_traits<\n            Kernel, \n            CGAL::AABB_triangle_primitive<\n              Kernel, typename std::vector<\n                typename Kernel::Triangle_3 >::iterator > > > & tree,\n        std::vector<typename Kernel::Triangle_3 > & triangles,\n        std::vector<bool> & in_I);\n    }\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"submesh_aabb_tree.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/triangle_triangle_squared_distance.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"triangle_triangle_squared_distance.h\"\n#include \"point_triangle_squared_distance.h\"\n#include <CGAL/Vector_3.h>\n#include <CGAL/Segment_3.h>\n#include <CGAL/intersections.h>\n\ntemplate < typename Kernel>\nIGL_INLINE bool igl::copyleft::cgal::triangle_triangle_squared_distance(\n  const CGAL::Triangle_3<Kernel> & T1,\n  const CGAL::Triangle_3<Kernel> & T2,\n  CGAL::Point_3<Kernel> & P1,\n  CGAL::Point_3<Kernel> & P2,\n  typename Kernel::FT & d)\n{\n  typedef CGAL::Point_3<Kernel> Point_3;\n  typedef CGAL::Vector_3<Kernel> Vector_3;\n  typedef CGAL::Triangle_3<Kernel> Triangle_3;\n  typedef CGAL::Segment_3<Kernel> Segment_3;\n  typedef typename Kernel::FT EScalar;\n  assert(!T1.is_degenerate());\n  assert(!T2.is_degenerate());\n\n  bool unique = true;\n  if(CGAL::do_intersect(T1,T2))\n  {\n    // intersecting triangles have zero (squared) distance\n    CGAL::Object result = CGAL::intersection(T1,T2);\n    // Some point on the intersection result\n    CGAL::Point_3<Kernel> Q;\n    if(const Point_3 * p = CGAL::object_cast<Point_3 >(&result))\n    {\n      Q = *p;\n    }else if(const Segment_3 * s = CGAL::object_cast<Segment_3 >(&result))\n    {\n      unique = false;\n      Q = s->source();\n    }else if(const Triangle_3 *itri = CGAL::object_cast<Triangle_3 >(&result))\n    {\n      Q = s->vertex(0);\n      unique = false;\n    }else if(const std::vector<Point_3 > *polyp = \n      CGAL::object_cast< std::vector<Point_3 > >(&result))\n    {\n      assert(polyp->size() > 0 && \"intersection poly should not be empty\");\n      Q = polyp[0];\n      unique = false;\n    }else\n    {\n      assert(false && \"Unknown intersection result\");\n    }\n    P1 = Q;\n    P2 = Q;\n    d = 0;\n    return unique;\n  }\n  // triangles do not intersect: the points of closest approach must be on the\n  // boundary of one of the triangles\n  d = std::numeric_limits<double>::infinity();\n  const auto & vertices_face = [&unique](\n    const Triangle_3 & T1,\n    const Triangle_3 & T2,\n    Point_3 & P1,\n    Point_3 & P2,\n    EScalar & d)\n  {\n    for(int i = 0;i<3;i++)\n    {\n      const Point_3 vi = T1.vertex(i);\n      Point_3 P2i;\n      EScalar di;\n      point_triangle_squared_distance(vi,T2,P2i,di);\n      if(di<d)\n      {\n        d = di;\n        P1 = vi;\n        P2 = P2i;\n        unique = true;\n      }else if(d == di)\n      {\n        // edge of T1 floating parallel above T2\n        unique = false;\n      }\n    }\n  };\n  vertices_face(T1,T2,P1,P2,d);\n  vertices_face(T2,T1,P1,P2,d);\n  for(int i = 0;i<3;i++)\n  {\n    const Segment_3 s1( T1.vertex(i+1), T1.vertex(i+2));\n    for(int j = 0;j<3;j++)\n    {\n      const Segment_3 s2( T2.vertex(i+1), T2.vertex(i+2));\n      Point_3 P1ij;\n      Point_3 P2ij;\n      EScalar dij;\n      bool uniqueij = segment_segment_squared_distance(s1,s2,P1ij,P2ij,dij);\n      if(dij < d)\n      {\n        P1 = P1ij;\n        P2 = P2ij;\n        d = dij;\n        unique = uniqueij;\n      }\n    }\n  }\n  return unique;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/triangle_triangle_squared_distance.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_CGAL_TRIANGLE_TRIANGLE_SQUARED_DISTANCE_H\n#define IGL_COPYLEFT_CGAL_TRIANGLE_TRIANGLE_SQUARED_DISTANCE_H\n#include \"../../igl_inline.h\"\n#include <CGAL/Triangle_3.h>\n#include <CGAL/Point_3.h>\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // Given two triangles T1 and T2 find the points on each of closest\n      // approach and the squared distance thereof.\n      // \n      // Inputs:\n      //   T1  first triangle\n      //   T2  second triangle\n      // Outputs:\n      //   P1  point on T1 closest to T2\n      //   P2  point on T2 closest to T1\n      //   d  distance betwee P1 and T2\n      // Returns true if the closest approach is unique.\n      template < typename Kernel>\n      IGL_INLINE bool triangle_triangle_squared_distance(\n        const CGAL::Triangle_3<Kernel> & T1,\n        const CGAL::Triangle_3<Kernel> & T2,\n        CGAL::Point_3<Kernel> & P1,\n        CGAL::Point_3<Kernel> & P2,\n        typename Kernel::FT & d);\n    }\n  }\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"triangle_triangle_squared_distance.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/trim_with_solid.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"trim_with_solid.h\"\n#include \"assign.h\"\n#include \"intersect_other.h\"\n#include \"point_solid_signed_squared_distance.h\"\n\n#include \"../../extract_manifold_patches.h\"\n#include \"../../list_to_matrix.h\"\n#include \"../../remove_unreferenced.h\"\n#include \"../../slice_mask.h\"\n\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\n\n#include <vector>\n\ntemplate <\n  typename DerivedVA,\n  typename DerivedFA,\n  typename DerivedVB,\n  typename DerivedFB,\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedD,\n  typename DerivedJ>\nIGL_INLINE void igl::copyleft::cgal::trim_with_solid(\n  const Eigen::PlainObjectBase<DerivedVA> & VA,\n  const Eigen::PlainObjectBase<DerivedFA> & FA,\n  const Eigen::PlainObjectBase<DerivedVB> & VB,\n  const Eigen::PlainObjectBase<DerivedFB> & FB,\n  Eigen::PlainObjectBase<DerivedV> & Vd,\n  Eigen::PlainObjectBase<DerivedF> & F,\n  Eigen::PlainObjectBase<DerivedD> & D,\n  Eigen::PlainObjectBase<DerivedJ> & J)\n{\n  // resolve intersections using exact representation\n  typedef Eigen::Matrix<CGAL::Epeck::FT,Eigen::Dynamic,3> MatrixX3E;\n  typedef Eigen::Matrix<CGAL::Epeck::FT,Eigen::Dynamic,1> VectorXE;\n  typedef Eigen::Matrix<CGAL::Epeck::FT,1,3> RowVector3E;\n  MatrixX3E V;\n  Eigen::MatrixXi _1;\n  Eigen::VectorXi _2;\n  // Intersect A and B meshes and stitch together new faces\n  igl::copyleft::cgal::intersect_other(\n    VA,FA,VB,FB,{false,false,true},_1,V,F,J,_2);\n  // Partition result into manifold patches\n  Eigen::VectorXi P;\n  const size_t num_patches = igl::extract_manifold_patches(F,P);\n  // only keep faces from A\n  Eigen::Matrix<bool,Eigen::Dynamic,1> A = J.array()< FA.rows();\n  igl::slice_mask(Eigen::MatrixXi(F),A,1,F);\n  igl::slice_mask(Eigen::VectorXi(P),A,1,P);\n  igl::slice_mask(Eigen::VectorXi(J),A,1,J);\n  // Agregate representative query points for each patch\n  std::vector<bool> flag(num_patches);\n  std::vector<std::vector<CGAL::Epeck::FT> > vQ;\n  Eigen::VectorXi P2Q(num_patches);\n  for(int f = 0;f<P.rows();f++)\n  {\n    const auto p = P(f);\n    // if not yet processed this patch\n    if(!flag[p])\n    {\n      P2Q(p) = vQ.size();\n      std::vector<CGAL::Epeck::FT> q = {\n        (V(F(f,0),0)+ V(F(f,1),0)+ V(F(f,2),0))/3.,\n        (V(F(f,0),1)+ V(F(f,1),1)+ V(F(f,2),1))/3.,\n        (V(F(f,0),2)+ V(F(f,1),2)+ V(F(f,2),2))/3.};\n      vQ.emplace_back(q);\n      flag[p] = true;\n    }\n  }\n  MatrixX3E Q;\n  igl::list_to_matrix(vQ,Q);\n  VectorXE SP;\n  point_solid_signed_squared_distance(Q,VB,FB,SP);\n  Eigen::Matrix<bool,Eigen::Dynamic,1> DP = SP.array()>0;\n  // distribute flag to all faces\n  D.resize(F.rows());\n  for(int f = 0;f<F.rows();f++)\n  {\n    D(f) = DP(P2Q(P(f)));\n  }\n  Eigen::VectorXi _;\n  igl::remove_unreferenced(MatrixX3E(V),DerivedF(F),V,F,_);\n  assign(V,Vd);\n}\n\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/trim_with_solid.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_CGAL_TRIM_WITH_SOLID_H\n#define IGL_COPYLEFT_CGAL_TRIM_WITH_SOLID_H\n\n#include \"../../igl_inline.h\"\n#include <Eigen/Core>\n\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cgal\n    {\n      // TRIM_WITH_SOLID Given an arbitrary mesh (VA,FA) and the boundary mesh\n      // (VB,FB) of a solid (as defined in [Zhou et al. 2016]), Resolve intersections\n      // between A and B subdividing faces of A so that intersections with B exists\n      // only along edges and vertices (and coplanar faces). Then determine whether\n      // each of these faces is inside or outside of B. This can be used to extract\n      // the part of A inside or outside of B.\n      //\n      // Inputs:\n      //   VA  #VA by 3 list of mesh vertex positions of A\n      //   FA  #FA by 3 list of mesh triangle indices into VA\n      //   VB  #VB by 3 list of mesh vertex positions of B\n      //   FB  #FB by 3 list of mesh triangle indices into VB\n      // Outputs:\n      //   V  #V by 3 list of mesh vertex positions of output\n      //   F  #F by 3 list of mesh triangle indices into V\n      //   D  #F list of bools whether face is inside B\n      //   J  #F list of indices into FA revealing birth parent\n      //\n      template <\n        typename DerivedVA,\n        typename DerivedFA,\n        typename DerivedVB,\n        typename DerivedFB,\n        typename DerivedV,\n        typename DerivedF,\n        typename DerivedD,\n        typename DerivedJ>\n      IGL_INLINE void trim_with_solid(\n        const Eigen::PlainObjectBase<DerivedVA> & VA,\n        const Eigen::PlainObjectBase<DerivedFA> & FA,\n        const Eigen::PlainObjectBase<DerivedVB> & VB,\n        const Eigen::PlainObjectBase<DerivedFB> & FB,\n        Eigen::PlainObjectBase<DerivedV> & Vd,\n        Eigen::PlainObjectBase<DerivedF> & F,\n        Eigen::PlainObjectBase<DerivedD> & D,\n        Eigen::PlainObjectBase<DerivedJ> & J);\n    }\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"trim_with_solid.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cgal/unique.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2017 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"../../unique.h\"\n#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\n#ifdef IGL_STATIC_LIBRARY\n#undef IGL_STATIC_LIBRARY\n#include \"../../unique.cpp\"\ntemplate void igl::unique_rows<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::unique_rows<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/comiso/frame_field.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2015 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"frame_field.h\"\n\n#include <igl/triangle_triangle_adjacency.h>\n#include <igl/edge_topology.h>\n#include <igl/per_face_normals.h>\n#include <igl/copyleft/comiso/nrosy.h>\n#include <iostream>\n\nnamespace igl\n{\nnamespace copyleft\n{\nnamespace comiso\n{\n\nclass FrameInterpolator\n{\npublic:\n  // Init\n  IGL_INLINE FrameInterpolator(const Eigen::MatrixXd& _V, const Eigen::MatrixXi& _F);\n  IGL_INLINE ~FrameInterpolator();\n\n  // Reset constraints (at least one constraint must be present or solve will fail)\n  IGL_INLINE void resetConstraints();\n\n  IGL_INLINE void setConstraint(const int fid, const Eigen::VectorXd& v);\n\n  IGL_INLINE void interpolateSymmetric();\n\n  // Generate the frame field\n  IGL_INLINE void solve();\n\n  // Convert the frame field in the canonical representation\n  IGL_INLINE void frame2canonical(const Eigen::MatrixXd& TP, const Eigen::RowVectorXd& v, double& theta, Eigen::VectorXd& S);\n\n  // Convert the canonical representation in a frame field\n  IGL_INLINE void canonical2frame(const Eigen::MatrixXd& TP, const double theta, const Eigen::VectorXd& S, Eigen::RowVectorXd& v);\n\n  IGL_INLINE Eigen::MatrixXd getFieldPerFace();\n\n  IGL_INLINE void PolarDecomposition(Eigen::MatrixXd V, Eigen::MatrixXd& U, Eigen::MatrixXd& P);\n\n  // Symmetric\n  Eigen::MatrixXd S;\n  std::vector<bool> S_c;\n\n  // -------------------------------------------------\n\n  // Face Topology\n  Eigen::MatrixXi TT, TTi;\n\n  // Two faces are consistent if their representative vector are taken modulo PI\n  std::vector<bool> edge_consistency;\n  Eigen::MatrixXi   edge_consistency_TT;\n\nprivate:\n  IGL_INLINE double mod2pi(double d);\n  IGL_INLINE double modpi2(double d);\n  IGL_INLINE double modpi(double d);\n\n  // Convert a direction on the tangent space into an angle\n  IGL_INLINE double vector2theta(const Eigen::MatrixXd& TP, const Eigen::RowVectorXd& v);\n\n  // Convert an angle in a vector in the tangent space\n  IGL_INLINE Eigen::RowVectorXd theta2vector(const Eigen::MatrixXd& TP, const double theta);\n\n  // Interpolate the cross field (theta)\n  IGL_INLINE void interpolateCross();\n\n  // Compute difference between reference frames\n  IGL_INLINE void computek();\n\n  // Compute edge consistency\n  IGL_INLINE void compute_edge_consistency();\n\n  // Cross field direction\n  Eigen::VectorXd thetas;\n  std::vector<bool> thetas_c;\n\n  // Edge Topology\n  Eigen::MatrixXi EV, FE, EF;\n  std::vector<bool> isBorderEdge;\n\n  // Angle between two reference frames\n  // R(k) * t0 = t1\n  Eigen::VectorXd k;\n\n  // Mesh\n  Eigen::MatrixXd V;\n  Eigen::MatrixXi F;\n\n  // Normals per face\n  Eigen::MatrixXd N;\n\n  // Reference frame per triangle\n  std::vector<Eigen::MatrixXd> TPs;\n\n};\n\nFrameInterpolator::FrameInterpolator(const Eigen::MatrixXd& _V, const Eigen::MatrixXi& _F)\n{\n  using namespace std;\n  using namespace Eigen;\n\n  V = _V;\n  F = _F;\n\n  assert(V.rows() > 0);\n  assert(F.rows() > 0);\n\n\n  // Generate topological relations\n  igl::triangle_triangle_adjacency(F,TT,TTi);\n  igl::edge_topology(V,F, EV, FE, EF);\n\n  // Flag border edges\n  isBorderEdge.resize(EV.rows());\n  for(unsigned i=0; i<EV.rows(); ++i)\n    isBorderEdge[i] = (EF(i,0) == -1) || ((EF(i,1) == -1));\n\n  // Generate normals per face\n  igl::per_face_normals(V, F, N);\n\n  // Generate reference frames\n  for(unsigned fid=0; fid<F.rows(); ++fid)\n  {\n    // First edge\n    Vector3d e1 = V.row(F(fid,1)) - V.row(F(fid,0));\n    e1.normalize();\n    Vector3d e2 = N.row(fid);\n    e2 = e2.cross(e1);\n    e2.normalize();\n\n    MatrixXd TP(2,3);\n    TP << e1.transpose(), e2.transpose();\n    TPs.push_back(TP);\n  }\n\n  // Reset the constraints\n  resetConstraints();\n\n  // Compute k, differences between reference frames\n  computek();\n\n  // Alloc internal variables\n  thetas            = VectorXd::Zero(F.rows());\n  S = MatrixXd::Zero(F.rows(),3);\n\n  compute_edge_consistency();\n}\n\nFrameInterpolator::~FrameInterpolator()\n{\n\n}\n\ndouble FrameInterpolator::mod2pi(double d)\n{\n  while(d<0)\n    d = d + (2.0*M_PI);\n\n  return fmod(d, (2.0*M_PI));\n}\n\ndouble FrameInterpolator::modpi2(double d)\n{\n  while(d<0)\n    d = d + (M_PI/2.0);\n\n  return fmod(d, (M_PI/2.0));\n}\n\ndouble FrameInterpolator::modpi(double d)\n{\n  while(d<0)\n    d = d + (M_PI);\n\n  return fmod(d, (M_PI));\n}\n\n\ndouble FrameInterpolator::vector2theta(const Eigen::MatrixXd& TP, const Eigen::RowVectorXd& v)\n{\n  // Project onto the tangent plane\n  Eigen::Vector2d vp = TP * v.transpose();\n\n  // Convert to angle\n  double theta = atan2(vp(1),vp(0));\n  return theta;\n}\n\nEigen::RowVectorXd FrameInterpolator::theta2vector(const Eigen::MatrixXd& TP, const double theta)\n{\n  Eigen::Vector2d vp(cos(theta),sin(theta));\n  return vp.transpose() * TP;\n}\n\nvoid FrameInterpolator::interpolateCross()\n{\n  using namespace std;\n  using namespace Eigen;\n\n  //olga: was\n  // NRosyField nrosy(V,F);\n  // for (unsigned i=0; i<F.rows(); ++i)\n    // if(thetas_c[i])\n      // nrosy.setConstraintHard(i,theta2vector(TPs[i],thetas(i)));\n  // nrosy.solve(4);\n  // MatrixXd R = nrosy.getFieldPerFace();\n\n  //olga: is\n  Eigen::MatrixXd R;\n  Eigen::VectorXd S;\n  Eigen::VectorXi b; b.resize(F.rows(),1);\n  Eigen::MatrixXd bc; bc.resize(F.rows(),3);\n  int num = 0;\n  for (unsigned i=0; i<F.rows(); ++i)\n    if(thetas_c[i])\n      {\n        b[num] = i;\n        bc.row(num) = theta2vector(TPs[i],thetas(i));\n        num++;\n      }\n  b.conservativeResize(num,Eigen::NoChange);\n  bc.conservativeResize(num,Eigen::NoChange);\n\n  igl::copyleft::comiso::nrosy(V, F, b, bc, 4, R, S);\n  //olga:end\n  assert(R.rows() == F.rows());\n\n  for (unsigned i=0; i<F.rows(); ++i)\n    thetas(i) = vector2theta(TPs[i],R.row(i));\n}\n\nvoid FrameInterpolator::resetConstraints()\n{\n  thetas_c.resize(F.rows());\n  S_c.resize(F.rows());\n\n  for(unsigned i=0; i<F.rows(); ++i)\n  {\n    thetas_c[i]  = false;\n    S_c[i] = false;\n  }\n\n}\n\nvoid FrameInterpolator::compute_edge_consistency()\n{\n  using namespace std;\n  using namespace Eigen;\n\n  // Compute per-edge consistency\n  edge_consistency.resize(EF.rows());\n  edge_consistency_TT = MatrixXi::Constant(TT.rows(),3,-1);\n\n  // For every non-border edge\n  for (unsigned eid=0; eid<EF.rows(); ++eid)\n  {\n    if (!isBorderEdge[eid])\n    {\n      int fid0 = EF(eid,0);\n      int fid1 = EF(eid,1);\n\n      double theta0 = thetas(fid0);\n      double theta1 = thetas(fid1);\n\n      theta0 = theta0 + k(eid);\n\n      double r = modpi(theta0-theta1);\n\n      edge_consistency[eid] = r < M_PI/4.0 || r > 3*(M_PI/4.0);\n\n      // Copy it into edge_consistency_TT\n      int i1 = -1;\n      int i2 = -1;\n      for (unsigned i=0; i<3; ++i)\n      {\n        if (TT(fid0,i) == fid1)\n          i1 = i;\n        if (TT(fid1,i) == fid0)\n          i2 = i;\n      }\n      assert(i1 != -1);\n      assert(i2 != -1);\n\n      edge_consistency_TT(fid0,i1) = edge_consistency[eid];\n      edge_consistency_TT(fid1,i2) = edge_consistency[eid];\n    }\n  }\n}\n\nvoid FrameInterpolator::computek()\n{\n  using namespace std;\n  using namespace Eigen;\n\n  k.resize(EF.rows());\n\n  // For every non-border edge\n  for (unsigned eid=0; eid<EF.rows(); ++eid)\n  {\n    if (!isBorderEdge[eid])\n    {\n      int fid0 = EF(eid,0);\n      int fid1 = EF(eid,1);\n\n      Vector3d N0 = N.row(fid0);\n      //Vector3d N1 = N.row(fid1);\n\n      // find common edge on triangle 0 and 1\n      int fid0_vc = -1;\n      int fid1_vc = -1;\n      for (unsigned i=0;i<3;++i)\n      {\n        if (EV(eid,0) == F(fid0,i))\n          fid0_vc = i;\n        if (EV(eid,1) == F(fid1,i))\n          fid1_vc = i;\n      }\n      assert(fid0_vc != -1);\n      assert(fid1_vc != -1);\n\n      Vector3d common_edge = V.row(F(fid0,(fid0_vc+1)%3)) - V.row(F(fid0,fid0_vc));\n      common_edge.normalize();\n\n      // Map the two triangles in a new space where the common edge is the x axis and the N0 the z axis\n      MatrixXd P(3,3);\n      VectorXd o = V.row(F(fid0,fid0_vc));\n      VectorXd tmp = -N0.cross(common_edge);\n      P << common_edge, tmp, N0;\n      P.transposeInPlace();\n\n\n      MatrixXd V0(3,3);\n      V0.row(0) = V.row(F(fid0,0)).transpose() -o;\n      V0.row(1) = V.row(F(fid0,1)).transpose() -o;\n      V0.row(2) = V.row(F(fid0,2)).transpose() -o;\n\n      V0 = (P*V0.transpose()).transpose();\n\n      assert(V0(0,2) < 10e-10);\n      assert(V0(1,2) < 10e-10);\n      assert(V0(2,2) < 10e-10);\n\n      MatrixXd V1(3,3);\n      V1.row(0) = V.row(F(fid1,0)).transpose() -o;\n      V1.row(1) = V.row(F(fid1,1)).transpose() -o;\n      V1.row(2) = V.row(F(fid1,2)).transpose() -o;\n      V1 = (P*V1.transpose()).transpose();\n\n      assert(V1(fid1_vc,2) < 10e-10);\n      assert(V1((fid1_vc+1)%3,2) < 10e-10);\n\n      // compute rotation R such that R * N1 = N0\n      // i.e. map both triangles to the same plane\n      double alpha = -atan2(V1((fid1_vc+2)%3,2),V1((fid1_vc+2)%3,1));\n\n      MatrixXd R(3,3);\n      R << 1,          0,            0,\n           0, cos(alpha), -sin(alpha) ,\n           0, sin(alpha),  cos(alpha);\n      V1 = (R*V1.transpose()).transpose();\n\n      assert(V1(0,2) < 10e-10);\n      assert(V1(1,2) < 10e-10);\n      assert(V1(2,2) < 10e-10);\n\n      // measure the angle between the reference frames\n      // k_ij is the angle between the triangle on the left and the one on the right\n      VectorXd ref0 = V0.row(1) - V0.row(0);\n      VectorXd ref1 = V1.row(1) - V1.row(0);\n\n      ref0.normalize();\n      ref1.normalize();\n\n      double ktemp = atan2(ref1(1),ref1(0)) - atan2(ref0(1),ref0(0));\n\n      // just to be sure, rotate ref0 using angle ktemp...\n      MatrixXd R2(2,2);\n      R2 << cos(ktemp), -sin(ktemp), sin(ktemp), cos(ktemp);\n\n      tmp = R2*ref0.head<2>();\n\n      assert(tmp(0) - ref1(0) < (0.000001));\n      assert(tmp(1) - ref1(1) < (0.000001));\n\n      k[eid] = ktemp;\n    }\n  }\n\n}\n\n\n  void FrameInterpolator::frame2canonical(const Eigen::MatrixXd& TP, const Eigen::RowVectorXd& v, double& theta, Eigen::VectorXd& S_v)\n{\n  using namespace std;\n  using namespace Eigen;\n\n  RowVectorXd v0 = v.segment<3>(0);\n  RowVectorXd v1 = v.segment<3>(3);\n\n  // Project onto the tangent plane\n  Vector2d vp0 = TP * v0.transpose();\n  Vector2d vp1 = TP * v1.transpose();\n\n  // Assemble matrix\n  MatrixXd M(2,2);\n  M << vp0, vp1;\n\n  if (M.determinant() < 0)\n    M.col(1) = -M.col(1);\n\n  assert(M.determinant() > 0);\n\n  // cerr << \"M: \" << M << endl;\n\n  MatrixXd R,S;\n  PolarDecomposition(M,R,S);\n\n  // Finally, express the cross field as an angle\n  theta = atan2(R(1,0),R(0,0));\n\n  MatrixXd R2(2,2);\n  R2 << cos(theta), -sin(theta), sin(theta), cos(theta);\n\n  assert((R2-R).norm() < 10e-8);\n\n  // Convert into rotation invariant form\n  S = R * S * R.inverse();\n\n  // Copy in vector form\n  S_v = VectorXd(3);\n  S_v << S(0,0), S(0,1), S(1,1);\n}\n\n  void FrameInterpolator::canonical2frame(const Eigen::MatrixXd& TP, const double theta, const Eigen::VectorXd& S_v, Eigen::RowVectorXd& v)\n{\n  using namespace std;\n  using namespace Eigen;\n\n  assert(S_v.size() == 3);\n\n  MatrixXd S_temp(2,2);\n  S_temp << S_v(0), S_v(1), S_v(1), S_v(2);\n\n  // Convert angle in vector in the tangent plane\n  // Vector2d vp(cos(theta),sin(theta));\n\n  // First reconstruct R\n  MatrixXd R(2,2);\n\n  R << cos(theta), -sin(theta), sin(theta), cos(theta);\n\n  // Rotation invariant reconstruction\n  MatrixXd M = S_temp * R;\n\n  Vector2d vp0(M(0,0),M(1,0));\n  Vector2d vp1(M(0,1),M(1,1));\n\n  // Unproject the vectors\n  RowVectorXd v0 = vp0.transpose() * TP;\n  RowVectorXd v1 = vp1.transpose() * TP;\n\n  v.resize(6);\n  v << v0, v1;\n}\n\nvoid FrameInterpolator::solve()\n{\n  interpolateCross();\n  interpolateSymmetric();\n}\n\nvoid FrameInterpolator::interpolateSymmetric()\n{\n  using namespace std;\n  using namespace Eigen;\n\n  // Generate uniform Laplacian matrix\n  typedef Eigen::Triplet<double> triplet;\n  std::vector<triplet> triplets;\n\n  // Variables are stacked as x1,y1,z1,x2,y2,z2\n  triplets.reserve(3*4*F.rows());\n\n  MatrixXd b = MatrixXd::Zero(3*F.rows(),1);\n\n  // Build L and b\n  for (unsigned eid=0; eid<EF.rows(); ++eid)\n  {\n    if (!isBorderEdge[eid])\n    {\n      for (int z=0;z<2;++z)\n      {\n        // W = [w_a, w_b\n        //      w_b, w_c]\n        //\n\n        // It is not symmetric\n        int i    = EF(eid,z==0?0:1);\n        int j    = EF(eid,z==0?1:0);\n\n        int w_a_0 = (i*3)+0;\n        int w_b_0 = (i*3)+1;\n        int w_c_0 = (i*3)+2;\n\n        int w_a_1 = (j*3)+0;\n        int w_b_1 = (j*3)+1;\n        int w_c_1 = (j*3)+2;\n\n        // Rotation to change frame\n        double r_a =  cos(z==1?k(eid):-k(eid));\n        double r_b = -sin(z==1?k(eid):-k(eid));\n        double r_c =  sin(z==1?k(eid):-k(eid));\n        double r_d =  cos(z==1?k(eid):-k(eid));\n\n        // First term\n        // w_a_0 = r_a^2 w_a_1 + 2 r_a r_b w_b_1 + r_b^2 w_c_1 = 0\n        triplets.push_back(triplet(w_a_0,w_a_0,                -1 ));\n        triplets.push_back(triplet(w_a_0,w_a_1,           r_a*r_a ));\n        triplets.push_back(triplet(w_a_0,w_b_1,       2 * r_a*r_b ));\n        triplets.push_back(triplet(w_a_0,w_c_1,           r_b*r_b ));\n\n        // Second term\n        // w_b_0 = r_a r_c w_a + (r_b r_c + r_a r_d) w_b + r_b r_d w_c\n        triplets.push_back(triplet(w_b_0,w_b_0,                -1 ));\n        triplets.push_back(triplet(w_b_0,w_a_1,           r_a*r_c ));\n        triplets.push_back(triplet(w_b_0,w_b_1, r_b*r_c + r_a*r_d ));\n        triplets.push_back(triplet(w_b_0,w_c_1,           r_b*r_d ));\n\n        // Third term\n        // w_c_0 = r_c^2 w_a + 2 r_c r_d w_b +  r_d^2 w_c\n        triplets.push_back(triplet(w_c_0,w_c_0,                -1 ));\n        triplets.push_back(triplet(w_c_0,w_a_1,           r_c*r_c ));\n        triplets.push_back(triplet(w_c_0,w_b_1,       2 * r_c*r_d ));\n        triplets.push_back(triplet(w_c_0,w_c_1,           r_d*r_d ));\n      }\n    }\n  }\n\n  SparseMatrix<double> L(3*F.rows(),3*F.rows());\n  L.setFromTriplets(triplets.begin(), triplets.end());\n\n  triplets.clear();\n\n  // Add soft constraints\n  double w = 100000;\n  for (unsigned fid=0; fid < F.rows(); ++fid)\n  {\n    if (S_c[fid])\n    {\n      for (unsigned i=0;i<3;++i)\n      {\n        triplets.push_back(triplet(3*fid + i,3*fid + i,w));\n        b(3*fid + i) += w*S(fid,i);\n      }\n    }\n  }\n\n  SparseMatrix<double> soft(3*F.rows(),3*F.rows());\n  soft.setFromTriplets(triplets.begin(), triplets.end());\n\n  SparseMatrix<double> M;\n\n  M = L + soft;\n\n  // Solve Lx = b;\n\n  SparseLU<SparseMatrix<double> > solver;\n\n  solver.compute(M);\n\n  if(solver.info()!=Success)\n  {\n    std::cerr << \"LU failed - frame_interpolator.cpp\" << std::endl;\n    assert(0);\n  }\n\n  MatrixXd x;\n  x = solver.solve(b);\n\n  if(solver.info()!=Success)\n  {\n    std::cerr << \"Linear solve failed - frame_interpolator.cpp\" << std::endl;\n    assert(0);\n  }\n\n  S = MatrixXd::Zero(F.rows(),3);\n\n  // Copy back the result\n  for (unsigned i=0;i<F.rows();++i)\n    S.row(i) << x(i*3+0), x(i*3+1), x(i*3+2);\n\n}\n\nvoid FrameInterpolator::setConstraint(const int fid, const Eigen::VectorXd& v)\n{\n  using namespace std;\n  using namespace Eigen;\n\n  double   t_;\n  VectorXd S_;\n\n  frame2canonical(TPs[fid],v,t_,S_);\n\n  Eigen::RowVectorXd v2;\n  canonical2frame(TPs[fid], t_, S_, v2);\n\n  thetas(fid)   = t_;\n  thetas_c[fid] = true;\n\n  S.row(fid) = S_;\n  S_c[fid]   = true;\n\n}\n\nEigen::MatrixXd FrameInterpolator::getFieldPerFace()\n{\n  using namespace std;\n  using namespace Eigen;\n\n  MatrixXd R(F.rows(),6);\n  for (unsigned i=0; i<F.rows(); ++i)\n  {\n    RowVectorXd v;\n    canonical2frame(TPs[i],thetas(i),S.row(i),v);\n    R.row(i) = v;\n  }\n  return R;\n}\n\n  void FrameInterpolator::PolarDecomposition(Eigen::MatrixXd V, Eigen::MatrixXd& U, Eigen::MatrixXd& P)\n{\n  using namespace std;\n  using namespace Eigen;\n\n  // Polar Decomposition\n  JacobiSVD<MatrixXd> svd(V,Eigen::ComputeFullU | Eigen::ComputeFullV);\n\n  U = svd.matrixU() * svd.matrixV().transpose();\n  P = svd.matrixV() * svd.singularValues().asDiagonal() * svd.matrixV().transpose();\n}\n\n}\n}\n}\n\nIGL_INLINE void igl::copyleft::comiso::frame_field(\n                                 const Eigen::MatrixXd& V,\n                                 const Eigen::MatrixXi& F,\n                                 const Eigen::VectorXi& b,\n                                 const Eigen::MatrixXd& bc1,\n                                 const Eigen::MatrixXd& bc2,\n                                 Eigen::MatrixXd& FF1,\n                                 Eigen::MatrixXd& FF2\n                                 )\n\n{\n  using namespace std;\n  using namespace Eigen;\n\n  assert(b.size() > 0);\n\n  // Init Solver\n  FrameInterpolator field(V,F);\n\n  for (unsigned i=0; i<b.size(); ++i)\n  {\n    VectorXd t(6); t << bc1.row(i).transpose(), bc2.row(i).transpose();\n    field.setConstraint(b(i), t);\n  }\n\n  // Solve\n  field.solve();\n\n  // Copy back\n  MatrixXd R = field.getFieldPerFace();\n  FF1 = R.block(0, 0, R.rows(), 3);\n  FF2 = R.block(0, 3, R.rows(), 3);\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/comiso/frame_field.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COMISO_FRAMEFIELD_H\n#define IGL_COMISO_FRAMEFIELD_H\n\n#include <igl/igl_inline.h>\n#include <Eigen/Dense>\n#include <vector>\n\nnamespace igl\n{\nnamespace copyleft\n{\nnamespace comiso\n{\n// Generate a piecewise-constant frame-field field from a sparse set of constraints on faces\n// using the algorithm proposed in:\n// Frame Fields: Anisotropic and Non-Orthogonal Cross Fields\n// Daniele Panozzo, Enrico Puppo, Marco Tarini, Olga Sorkine-Hornung,\n// ACM Transactions on Graphics (SIGGRAPH, 2014)\n//\n// Inputs:\n//   V       #V by 3 list of mesh vertex coordinates\n//   F       #F by 3 list of mesh faces (must be triangles)\n//   b       #B by 1 list of constrained face indices\n//   bc1     #B by 3 list of the constrained first representative vector of the frame field (up to permutation and sign)\n//   bc2     #B by 3 list of the constrained second representative vector of the frame field (up to permutation and sign)\n//\n// Outputs:\n//   FF1      #F by 3 the first representative vector of the frame field (up to permutation and sign)\n//   FF2      #F by 3 the second representative vector of the frame field (up to permutation and sign)\n//\n// TODO: it now supports only soft constraints, should be extended to support both hard and soft constraints\nIGL_INLINE void frame_field(\n  const Eigen::MatrixXd& V,\n  const Eigen::MatrixXi& F,\n  const Eigen::VectorXi& b,\n  const Eigen::MatrixXd& bc1,\n  const Eigen::MatrixXd& bc2,\n  Eigen::MatrixXd& FF1,\n  Eigen::MatrixXd& FF2\n  );\n}\n}\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"frame_field.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/comiso/miq.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>, Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include <igl/copyleft/comiso/miq.h>\n#include <igl/local_basis.h>\n#include <igl/triangle_triangle_adjacency.h>\n\n// includes for VertexIndexing\n#include <igl/HalfEdgeIterator.h>\n#include <igl/is_border_vertex.h>\n#include <igl/vertex_triangle_adjacency.h>\n\n\n// includes for poissonSolver\n#include <gmm/gmm.h>\n#include <CoMISo/Solver/ConstrainedSolver.hh>\n#include <CoMISo/Solver/MISolver.hh>\n#include <CoMISo/Solver/GMM_Tools.hh>\n#include <igl/doublearea.h>\n#include <igl/per_face_normals.h>\n\n//\n#include <igl/cross_field_missmatch.h>\n#include <igl/comb_frame_field.h>\n#include <igl/comb_cross_field.h>\n#include <igl/cut_mesh_from_singularities.h>\n#include <igl/find_cross_field_singularities.h>\n#include <igl/compute_frame_field_bisectors.h>\n#include <igl/rotate_vectors.h>\n\n\n// #define DEBUG_PRINT\n#include <fstream>\n#include <iostream>\n#include <igl/matlab_format.h>\nusing namespace std;\nusing namespace Eigen;\n\n#define DEBUGPRINT 0\n\nnamespace igl {\n    namespace copyleft {\n        namespace comiso {\n\nclass SparseMatrixData{\nprotected:\n    unsigned int m_nrows;\n    unsigned int m_ncols;\n    std::vector<unsigned int> m_rowind;\n    std::vector<unsigned int> m_colind;\n    std::vector<double>       m_vals;\n\npublic:\n    unsigned int   nrows()    { return m_nrows      ; }\n    unsigned int   ncols()    { return m_ncols      ; }\n    unsigned int   nentries() { return m_vals.size(); }\n    std::vector<unsigned int>&  rowind()   { return m_rowind     ; }\n    std::vector<unsigned int>&  colind()   { return m_colind     ; }\n    std::vector<double>&        vals()     { return m_vals       ; }\n\n    // create an empty matrix with a fixed number of rows\n    IGL_INLINE SparseMatrixData()\n    {\n        initialize(0,0);\n    }\n\n    // create an empty matrix with a fixed number of rows\n    IGL_INLINE void initialize(int nr, int nc) {\n        assert(nr >= 0 && nc >=0);\n        m_nrows = nr;\n        m_ncols = nc;\n\n        m_rowind.resize(0);\n        m_colind.resize(0);\n        m_vals.resize(0);\n    }\n\n    // add a nonzero entry to the matrix\n    // no checks are done for coinciding entries\n    // the interpretation of the repeated entries (replace or add)\n    // depends on how the actual sparse matrix datastructure is constructed\n\n    IGL_INLINE void addEntryCmplx(unsigned int i, unsigned int j, std::complex<double> val) {\n        m_rowind.push_back(2*i);   m_colind.push_back(2*j);   m_vals.push_back( val.real());\n        m_rowind.push_back(2*i);   m_colind.push_back(2*j+1); m_vals.push_back(-val.imag());\n        m_rowind.push_back(2*i+1); m_colind.push_back(2*j);   m_vals.push_back( val.imag());\n        m_rowind.push_back(2*i+1); m_colind.push_back(2*j+1); m_vals.push_back( val.real());\n    }\n\n    IGL_INLINE void addEntryReal(unsigned int i, unsigned int j, double val) {\n        m_rowind.push_back(i);   m_colind.push_back(j);   m_vals.push_back(val);\n    }\n\n    IGL_INLINE virtual ~SparseMatrixData() {\n    }\n\n};\n\n// a small class to manage storage for matrix data\n// not using stl vectors: want to make all memory management\n// explicit to avoid hidden automatic reallocation\n// TODO: redo with STL vectors but with explicit mem. management\n\nclass SparseSystemData {\nprivate:\n    // matrix representation,  A[rowind[i],colind[i]] = vals[i]\n    // right-hand side\n    SparseMatrixData m_A;\n    double       *m_b;\n    double       *m_x;\n\npublic:\n    IGL_INLINE SparseMatrixData& A() { return m_A; }\n    IGL_INLINE double*        b()        { return m_b       ; }\n    IGL_INLINE double*        x()        { return m_x       ; }\n    IGL_INLINE unsigned int   nrows()    { return  m_A.nrows(); }\n\npublic:\n\n    IGL_INLINE SparseSystemData(): m_A(), m_b(NULL), m_x(NULL){ }\n\n    IGL_INLINE void initialize(unsigned int nr, unsigned int nc) {\n        m_A.initialize(nr,nc);\n        m_b      = new          double[nr];\n        m_x      = new          double[nr];\n        assert(m_b);\n        std::fill( m_b,  m_b+nr, 0.);\n    }\n\n    IGL_INLINE void addRHSCmplx(unsigned int i, std::complex<double> val) {\n        assert( 2*i+1 < m_A.nrows());\n        m_b[2*i] += val.real(); m_b[2*i+1] += val.imag();\n    }\n\n    IGL_INLINE void setRHSCmplx(unsigned int i, std::complex<double> val) {\n        assert( 2*i+1 < m_A.nrows());\n        m_b[2*i] = val.real(); m_b[2*i+1] = val.imag();\n    }\n\n    IGL_INLINE std::complex<double> getRHSCmplx(unsigned int i) {\n        assert( 2*i+1 < m_A.nrows());\n        return std::complex<double>( m_b[2*i], m_b[2*i+1]);\n    }\n\n    IGL_INLINE double getRHSReal(unsigned int i) {\n        assert( i < m_A.nrows());\n        return m_b[i];\n    }\n\n    IGL_INLINE std::complex<double> getXCmplx(unsigned int i) {\n        assert( 2*i+1 < m_A.nrows());\n        return std::complex<double>( m_x[2*i], m_x[2*i+1]);\n    }\n\n    IGL_INLINE void cleanMem() {\n        //m_A.cleanup();\n        delete [] m_b;\n        delete [] m_x;\n    }\n\n    IGL_INLINE virtual ~SparseSystemData() {\n        delete [] m_b;\n        delete [] m_x;\n    }\n};\n\nstruct SeamInfo\n{\n    int v0,v0p,v1,v1p;\n    int integerVar;\n    unsigned char MMatch;\n\n    IGL_INLINE SeamInfo(int _v0,\n                        int _v1,\n                        int _v0p,\n                        int _v1p,\n                        int _MMatch,\n                        int _integerVar);\n\n    IGL_INLINE SeamInfo(const SeamInfo &S1);\n};\n\nstruct MeshSystemInfo\n{\n    ///total number of scalar variables\n    int num_scalar_variables;\n    ////number of vertices variables\n    int num_vert_variables;\n    ///num of integer for cuts\n    int num_integer_cuts;\n    ///this are used for drawing purposes\n    std::vector<SeamInfo> EdgeSeamInfo;\n#if 0\n    ///this are values of integer variables after optimization\n    std::vector<int> IntegerValues;\n#endif\n};\n\n\ntemplate <typename DerivedV, typename DerivedF>\nclass VertexIndexing\n{\npublic:\n    // Input:\n    const Eigen::PlainObjectBase<DerivedV> &V;\n    const Eigen::PlainObjectBase<DerivedF> &F;\n    const Eigen::PlainObjectBase<DerivedF> &TT;\n    const Eigen::PlainObjectBase<DerivedF> &TTi;\n    // const Eigen::PlainObjectBase<DerivedV> &PD1;\n    // const Eigen::PlainObjectBase<DerivedV> &PD2;\n\n    const Eigen::Matrix<int, Eigen::Dynamic, 3> &Handle_MMatch;\n    // const Eigen::Matrix<int, Eigen::Dynamic, 1> &Handle_Singular; // bool\n    // const Eigen::Matrix<int, Eigen::Dynamic, 1> &Handle_SingularDegree; // vertex;\n    const Eigen::Matrix<int, Eigen::Dynamic, 3> &Handle_Seams; // 3 bool\n\n\n    ///this handle for mesh TODO: move with the other global variables\n    MeshSystemInfo Handle_SystemInfo;\n\n    // Output:\n    ///this maps the integer for edge - face\n    Eigen::MatrixXi Handle_Integer; // TODO: remove it is useless\n\n    ///per face indexes of vertex in the solver\n    Eigen::MatrixXi HandleS_Index;\n\n    ///per vertex variable indexes\n    std::vector<std::vector<int> > HandleV_Integer;\n\n    // internal\n    std::vector<std::vector<int> > VF, VFi;\n    std::vector<bool> V_border; // bool\n\n    IGL_INLINE VertexIndexing(const Eigen::PlainObjectBase<DerivedV> &_V,\n                              const Eigen::PlainObjectBase<DerivedF> &_F,\n                              const Eigen::PlainObjectBase<DerivedF> &_TT,\n                              const Eigen::PlainObjectBase<DerivedF> &_TTi,\n                              //  const Eigen::PlainObjectBase<DerivedV> &_PD1,\n                              //  const Eigen::PlainObjectBase<DerivedV> &_PD2,\n                              const Eigen::Matrix<int, Eigen::Dynamic, 3> &_Handle_MMatch,\n                              //  const Eigen::Matrix<int, Eigen::Dynamic, 1> &_Handle_Singular,\n                              //  const Eigen::Matrix<int, Eigen::Dynamic, 1> &_Handle_SingularDegree,\n                              const Eigen::Matrix<int, Eigen::Dynamic, 3> &_Handle_Seams\n                              );\n\n    ///vertex to variable mapping\n    IGL_INLINE void InitMapping();\n\n    IGL_INLINE void InitFaceIntegerVal();\n\n    IGL_INLINE void InitSeamInfo();\n\n\nprivate:\n    ///this maps back index to vertices\n    std::vector<int> IndexToVert; // TODO remove it is useless\n\n    ///this is used for drawing purposes\n    std::vector<int> duplicated; // TODO remove it is useless\n\n    IGL_INLINE void FirstPos(const int v, int &f, int &edge);\n\n    IGL_INLINE int AddNewIndex(const int v0);\n\n    IGL_INLINE bool HasIndex(int indexVert,int indexVar);\n\n    IGL_INLINE void GetSeamInfo(const int f0,\n                                const int f1,\n                                const int indexE,\n                                int &v0,int &v1,\n                                int &v0p,int &v1p,\n                                unsigned char &_MMatch,\n                                int &integerVar);\n    IGL_INLINE bool IsSeam(const int f0, const int f1);\n\n    ///find initial position of the pos to\n    // assing face to vert inxex correctly\n    IGL_INLINE void FindInitialPos(const int vert, int &edge, int &face);\n\n\n    ///intialize the mapping given an initial pos\n    ///whih must be initialized with FindInitialPos\n    IGL_INLINE void MapIndexes(const int  vert, const int edge_init, const int f_init);\n\n    ///intialize the mapping for a given vertex\n    IGL_INLINE void InitMappingSeam(const int vert);\n\n    ///intialize the mapping for a given sampled mesh\n    IGL_INLINE void InitMappingSeam();\n\n    ///test consistency of face variables per vert mapping\n    IGL_INLINE void TestSeamMappingFace(const int f);\n\n    ///test consistency of face variables per vert mapping\n    IGL_INLINE void TestSeamMappingVertex(int indexVert);\n\n    ///check consistency of variable mapping across seams\n    IGL_INLINE void TestSeamMapping();\n\n};\n\n\ntemplate <typename DerivedV, typename DerivedF>\nclass PoissonSolver\n{\n\npublic:\n    IGL_INLINE void SolvePoisson(Eigen::VectorXd Stiffness,\n                                 double vector_field_scale=0.1f,\n                                 double grid_res=1.f,\n                                 bool direct_round=true,\n                                 int localIter=0,\n                                 bool _integer_rounding=true,\n                                 bool _singularity_rounding=true,\n                                 std::vector<int> roundVertices = std::vector<int>(),\n                                 std::vector<std::vector<int> > hardFeatures = std::vector<std::vector<int> >());\n\n    IGL_INLINE PoissonSolver(const Eigen::PlainObjectBase<DerivedV> &_V,\n                             const Eigen::PlainObjectBase<DerivedF> &_F,\n                             const Eigen::PlainObjectBase<DerivedF> &_TT,\n                             const Eigen::PlainObjectBase<DerivedF> &_TTi,\n                             const Eigen::PlainObjectBase<DerivedV> &_PD1,\n                             const Eigen::PlainObjectBase<DerivedV> &_PD2,\n                             const Eigen::MatrixXi &_HandleS_Index,\n                             const Eigen::Matrix<int, Eigen::Dynamic, 1>&_Handle_Singular,\n                             const MeshSystemInfo &_Handle_SystemInfo,\n                             const double &_MiqAnisotropy);\n\n    const Eigen::PlainObjectBase<DerivedV> &V;\n    const Eigen::PlainObjectBase<DerivedF> &F;\n    const Eigen::PlainObjectBase<DerivedF> &TT;\n    const Eigen::PlainObjectBase<DerivedF> &TTi;\n    const Eigen::PlainObjectBase<DerivedV> &PD1;\n    const Eigen::PlainObjectBase<DerivedV> &PD2;\n    const Eigen::Matrix<int, Eigen::Dynamic, 1> &Handle_Singular; // bool\n    const Eigen::MatrixXi &HandleS_Index; //todo\n\n    const MeshSystemInfo &Handle_SystemInfo;\n\n    // Internal:\n    Eigen::MatrixXd doublearea;\n    Eigen::VectorXd Handle_Stiffness;\n    Eigen::PlainObjectBase<DerivedV> N;\n    std::vector<std::vector<int> > VF;\n    std::vector<std::vector<int> > VFi;\n    Eigen::MatrixXd UV; // this is probably useless\n    double MiqAnisotropy;\n\n    // Output:\n    // per wedge UV coordinates, 6 coordinates (1 face) per row\n    Eigen::MatrixXd WUV;\n\n    ///solver data\n    SparseSystemData S;\n\n    ///vector of unknowns\n    std::vector< double > X;\n\n    ////REAL PART\n    ///number of fixed vertex\n    unsigned int n_fixed_vars;\n\n    ///the number of REAL variables for vertices\n    unsigned int n_vert_vars;\n\n    ///total number of variables of the system,\n    ///do not consider constraints, but consider integer vars\n    unsigned int num_total_vars;\n\n    //////INTEGER PART\n    ///the total number of integer variables\n    unsigned int n_integer_vars;\n\n    ///CONSTRAINT PART\n    ///number of cuts constraints\n    unsigned int num_cut_constraint;\n\n    // number of user-defined constraints\n    unsigned int num_userdefined_constraint;\n\n    ///total number of constraints equations\n    unsigned int num_constraint_equations;\n\n    ///total size of the system including constraints\n    unsigned int system_size;\n\n    ///if you intend to make integer rotation\n    ///and translations\n    bool integer_jumps_bary;\n\n    ///vector of blocked vertices\n    std::vector<int> Hard_constraints;\n\n    ///vector of indexes to round\n    std::vector<int> ids_to_round;\n\n    ///vector of indexes to round\n    std::vector<std::vector<int > > userdefined_constraints;\n\n    ///boolean that is true if rounding to integer is needed\n    bool integer_rounding;\n\n    ///START SYSTEM ACCESS METHODS\n    ///add an entry to the LHS\n    IGL_INLINE void AddValA(int Xindex,\n                            int Yindex,\n                            double val);\n\n    ///add a complex entry to the LHS\n    IGL_INLINE void AddComplexA(int VarXindex,\n                                int VarYindex,\n                                std::complex<double> val);\n\n    ///add a velue to the RHS\n    IGL_INLINE void AddValB(int Xindex,\n                            double val);\n\n    ///add the area term, scalefactor is used to sum up\n    ///and normalize on the overlap zones\n    IGL_INLINE void AddAreaTerm(int index[3][3][2],double ScaleFactor);\n\n    ///set the diagonal of the matrix (which is zero at the beginning)\n    ///such that the sum of a row or a colums is zero\n    IGL_INLINE void SetDiagonal(double val[3][3]);\n\n    IGL_INLINE void SetDiagonal2(double val[6][6]);\n\n    ///given a vector of scalar values and\n    ///a vector of indexes add such values\n    ///as specified by the indexes\n    IGL_INLINE void AddRHS(double b[6],\n    int index[3]);\n\n    ///add a 3x3 block matrix to the system matrix...\n    ///indexes are specified in the 3x3 matrix of x,y pairs\n    ///indexes must be multiplied by 2 cause u and v\n    IGL_INLINE void Add33Block(double val[3][3], int index[3][3][2]);\n\n    IGL_INLINE void Add66Block(double val[6][6], int index[6][6][2]);\n\n    ///add a 3x3 block matrix to the system matrix...\n    ///indexes are specified in the 3x3 matrix of x,y pairs\n    ///indexes must be multiplied by 2 cause u and v\n    IGL_INLINE void Add44Block(double val[4][4],int index[4][4][2]);\n    ///END SYSTEM ACCESS METHODS\n\n    ///START COMMON MATH FUNCTIONS\n    ///return the complex encoding the rotation\n    ///for a given missmatch interval\n    IGL_INLINE std::complex<double> GetRotationComplex(int interval);\n    ///END COMMON MATH FUNCTIONS\n\n\n    ///START ENERGY MINIMIZATION PART\n    ///initialize the LHS for a given face\n    ///for minimization of Dirichlet's energy\n    IGL_INLINE void perElementLHS(int f,\n                                  double val[3][3],\n    int index[3][3][2]);\n\n    IGL_INLINE void perElementLHS2(int f,\n                                   double val[6][6],\n    int index[6][6][2]);\n\n    ///initialize the RHS for a given face\n    ///for minimization of Dirichlet's energy\n    IGL_INLINE void perElementRHS(int f,\n                                  double b[6],\n    double vector_field_scale=1);\n\n    ///evaluate the LHS and RHS for a single face\n    ///for minimization of Dirichlet's energy\n    IGL_INLINE void PerElementSystemReal(int f,\n                                         double val[3][3],\n    int index[3][3][2],\n    double b[6],\n    double vector_field_scale=1.0);\n\n\n    IGL_INLINE void PerElementSystemReal2(int f,\n                                          double val[6][6],\n    int index[6][6][2],\n    double b[6],\n    double vector_field_scale=1.0);\n    ///END ENERGY MINIMIZATION PART\n\n    ///START FIXING VERTICES\n    ///set a given vertex as fixed\n    IGL_INLINE void AddFixedVertex(int v);\n\n    ///find vertex to fix in case we're using\n    ///a vector field NB: multiple components not handled\n    IGL_INLINE void FindFixedVertField();\n\n    ///find hard constraint depending if using or not\n    ///a vector field\n    IGL_INLINE void FindFixedVert();\n\n    IGL_INLINE int GetFirstVertexIndex(int v);\n\n    ///fix the vertices which are flagged as fixed\n    IGL_INLINE void FixBlockedVertex();\n    ///END FIXING VERTICES\n\n    ///HANDLING SINGULARITY\n    //set the singularity round to integer location\n    IGL_INLINE void AddSingularityRound();\n\n    IGL_INLINE void AddToRoundVertices(std::vector<int> ids);\n\n    ///START GENERIC SYSTEM FUNCTIONS\n    //build the laplacian matrix cyclyng over all rangemaps\n    //and over all faces\n    IGL_INLINE void BuildLaplacianMatrix(double vfscale=1);\n\n    ///find different sized of the system\n    IGL_INLINE void FindSizes();\n\n    IGL_INLINE void AllocateSystem();\n\n    ///intitialize the whole matrix\n    IGL_INLINE void InitMatrix();\n\n    ///map back coordinates after that\n    ///the system has been solved\n    IGL_INLINE void MapCoords();\n    ///END GENERIC SYSTEM FUNCTIONS\n\n    ///set the constraints for the inter-range cuts\n    IGL_INLINE void BuildSeamConstraintsExplicitTranslation();\n\n    ///set the constraints for the inter-range cuts\n    IGL_INLINE void BuildUserDefinedConstraints();\n\n    ///call of the mixed integer solver\n    IGL_INLINE void MixedIntegerSolve(double cone_grid_res=1,\n                                      bool direct_round=true,\n                                      int localIter=0);\n\n    IGL_INLINE void clearUserConstraint();\n\n    IGL_INLINE void addSharpEdgeConstraint(int fid, int vid);\n\n};\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedU>\nclass MIQ_class\n{\nprivate:\n    const Eigen::PlainObjectBase<DerivedV> &V;\n    const Eigen::PlainObjectBase<DerivedF> &F;\n    Eigen::MatrixXd WUV;\n    // internal\n    Eigen::PlainObjectBase<DerivedF> TT;\n    Eigen::PlainObjectBase<DerivedF> TTi;\n\n    // Stiffness per face\n    Eigen::VectorXd Handle_Stiffness;\n    Eigen::PlainObjectBase<DerivedV> B1, B2, B3;\n\npublic:\n    IGL_INLINE MIQ_class(const Eigen::PlainObjectBase<DerivedV> &V_,\n                         const Eigen::PlainObjectBase<DerivedF> &F_,\n                         const Eigen::PlainObjectBase<DerivedV> &PD1_combed,\n                         const Eigen::PlainObjectBase<DerivedV> &PD2_combed,\n                         // const Eigen::PlainObjectBase<DerivedV> &BIS1_combed,\n                         // const Eigen::PlainObjectBase<DerivedV> &BIS2_combed,\n                         const Eigen::Matrix<int, Eigen::Dynamic, 3> &Handle_MMatch,\n                         const Eigen::Matrix<int, Eigen::Dynamic, 1> &Handle_Singular,\n                         // const Eigen::Matrix<int, Eigen::Dynamic, 1> &Handle_SingularDegree,\n                         const Eigen::Matrix<int, Eigen::Dynamic, 3> &Handle_Seams,\n                         Eigen::PlainObjectBase<DerivedU> &UV,\n                         Eigen::PlainObjectBase<DerivedF> &FUV,\n                         double GradientSize = 30.0,\n                         double Stiffness = 5.0,\n                         bool DirectRound = false,\n                         int iter = 5,\n                         int localIter = 5,\n                         bool DoRound = true,\n                         bool SingularityRound=true,\n                         std::vector<int> roundVertices = std::vector<int>(),\n                         std::vector<std::vector<int> > hardFeatures = std::vector<std::vector<int> >(),\n                         double miqAnisotropy=1);\n\n\n    IGL_INLINE void extractUV(Eigen::PlainObjectBase<DerivedU> &UV_out,\n                              Eigen::PlainObjectBase<DerivedF> &FUV_out);\n\nprivate:\n    IGL_INLINE int NumFlips(const Eigen::MatrixXd& WUV);\n\n    IGL_INLINE double Distortion(int f, double h, const Eigen::MatrixXd& WUV);\n\n    IGL_INLINE double LaplaceDistortion(const int f, double h, const Eigen::MatrixXd& WUV);\n\n    IGL_INLINE bool updateStiffeningJacobianDistorsion(double grad_size, const Eigen::MatrixXd& WUV);\n\n    IGL_INLINE bool IsFlipped(const Eigen::Vector2d &uv0,\n                              const Eigen::Vector2d &uv1,\n                              const Eigen::Vector2d &uv2);\n\n    IGL_INLINE bool IsFlipped(const int i, const Eigen::MatrixXd& WUV);\n\n};\n};\n};\n};\n\nIGL_INLINE igl::copyleft::comiso::SeamInfo::SeamInfo(int _v0,\n                                   int _v1,\n                                   int _v0p,\n                                   int _v1p,\n                                   int _MMatch,\n                                   int _integerVar)\n{\n    v0=_v0;\n    v1=_v1;\n    v0p=_v0p;\n    v1p=_v1p;\n    integerVar=_integerVar;\n    MMatch=_MMatch;\n}\n\nIGL_INLINE igl::copyleft::comiso::SeamInfo::SeamInfo(const SeamInfo &S1)\n{\n    v0=S1.v0;\n    v1=S1.v1;\n    v0p=S1.v0p;\n    v1p=S1.v1p;\n    integerVar=S1.integerVar;\n    MMatch=S1.MMatch;\n}\n\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE igl::copyleft::comiso::VertexIndexing<DerivedV, DerivedF>::VertexIndexing(const Eigen::PlainObjectBase<DerivedV> &_V,\n                                                                   const Eigen::PlainObjectBase<DerivedF> &_F,\n                                                                   const Eigen::PlainObjectBase<DerivedF> &_TT,\n                                                                   const Eigen::PlainObjectBase<DerivedF> &_TTi,\n                                                                   // const Eigen::PlainObjectBase<DerivedV> &_PD1,\n                                                                   // const Eigen::PlainObjectBase<DerivedV> &_PD2,\n                                                                   const Eigen::Matrix<int, Eigen::Dynamic, 3> &_Handle_MMatch,\n                                                                   // const Eigen::Matrix<int, Eigen::Dynamic, 1> &_Handle_Singular,\n                                                                   // const Eigen::Matrix<int, Eigen::Dynamic, 1> &_Handle_SingularDegree,\n                                                                   const Eigen::Matrix<int, Eigen::Dynamic, 3> &_Handle_Seams\n\n                                                                   ):\n    V(_V),\n    F(_F),\n    TT(_TT),\n    TTi(_TTi),\n    // PD1(_PD1),\n    // PD2(_PD2),\n    Handle_MMatch(_Handle_MMatch),\n    // Handle_Singular(_Handle_Singular),\n    // Handle_SingularDegree(_Handle_SingularDegree),\n    Handle_Seams(_Handle_Seams)\n{\n#ifdef DEBUG_PRINT\n    cerr<<igl::matlab_format(Handle_Seams,\"Handle_Seams\");\n#endif\n    V_border = igl::is_border_vertex(V,F);\n    igl::vertex_triangle_adjacency(V,F,VF,VFi);\n\n    IndexToVert.clear();\n\n    Handle_SystemInfo.num_scalar_variables=0;\n    Handle_SystemInfo.num_vert_variables=0;\n    Handle_SystemInfo.num_integer_cuts=0;\n\n    duplicated.clear();\n\n    HandleS_Index = Eigen::MatrixXi::Constant(F.rows(),3,-1);\n\n    Handle_Integer = Eigen::MatrixXi::Constant(F.rows(),3,-1);\n\n    HandleV_Integer.resize(V.rows());\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::VertexIndexing<DerivedV, DerivedF>::FirstPos(const int v, int &f, int &edge)\n{\n    f    = VF[v][0];  // f=v->cVFp();\n    edge = VFi[v][0]; // edge=v->cVFi();\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE int igl::copyleft::comiso::VertexIndexing<DerivedV, DerivedF>::AddNewIndex(const int v0)\n{\n    Handle_SystemInfo.num_scalar_variables++;\n    HandleV_Integer[v0].push_back(Handle_SystemInfo.num_scalar_variables);\n    IndexToVert.push_back(v0);\n    return Handle_SystemInfo.num_scalar_variables;\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE bool igl::copyleft::comiso::VertexIndexing<DerivedV, DerivedF>::HasIndex(int indexVert,int indexVar)\n{\n    for (unsigned int i=0;i<HandleV_Integer[indexVert].size();i++)\n        if (HandleV_Integer[indexVert][i]==indexVar)return true;\n    return false;\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::VertexIndexing<DerivedV, DerivedF>::GetSeamInfo(const int f0,\n                                                                     const int f1,\n                                                                     const int indexE,\n                                                                     int &v0,int &v1,\n                                                                     int &v0p,int &v1p,\n                                                                     unsigned char &_MMatch,\n                                                                     int &integerVar)\n{\n    int edgef0 = indexE;\n    v0 = HandleS_Index(f0,edgef0);\n    v1 = HandleS_Index(f0,(edgef0+1)%3);\n    ////get the index on opposite side\n    assert(TT(f0,edgef0) == f1);\n    int edgef1 = TTi(f0,edgef0);\n    v1p = HandleS_Index(f1,edgef1);\n    v0p = HandleS_Index(f1,(edgef1+1)%3);\n\n    integerVar = Handle_Integer(f0,edgef0);\n    _MMatch = Handle_MMatch(f0,edgef0);\n    assert(F(f0,edgef0)         == F(f1,((edgef1+1)%3)));\n    assert(F(f0,((edgef0+1)%3)) == F(f1,edgef1));\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE bool igl::copyleft::comiso::VertexIndexing<DerivedV, DerivedF>::IsSeam(const int f0, const int f1)\n{\n    for (int i=0;i<3;i++)\n    {\n        int f_clos = TT(f0,i);\n\n        if (f_clos == -1)\n            continue; ///border\n\n        if (f_clos == f1)\n            return(Handle_Seams(f0,i));\n    }\n    assert(0);\n    return false;\n}\n\n///find initial position of the pos to\n// assing face to vert inxex correctly\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::VertexIndexing<DerivedV, DerivedF>::FindInitialPos(const int vert,\n                                                                        int &edge,\n                                                                        int &face)\n{\n    int f_init;\n    int edge_init;\n    FirstPos(vert,f_init,edge_init); // todo manually IGL_INLINE the function\n    igl::HalfEdgeIterator<DerivedF> VFI(F,TT,TTi,f_init,edge_init);\n\n#ifdef DEBUG_PRINT\n    cerr<<\"--FindInitialPos--\"<<endl;\n#endif\n    bool vertexB = V_border[vert];\n    bool possible_split=false;\n    bool complete_turn=false;\n    do\n    {\n        int curr_f = VFI.Fi();\n        int curr_edge=VFI.Ei();\n#ifdef DEBUG_PRINT\n        cerr<<\"@ face \"<<curr_f<<\", edge \"<< F(curr_f,curr_edge)<<\" - \"<< F(curr_f,(curr_edge+1)%3)<<endl;\n#endif\n        VFI.NextFE();\n        int next_f=VFI.Fi();\n#ifdef DEBUG_PRINT\n        cerr<<\"next face \"<<next_f<<\", edge \"<< F(next_f,VFI.Ei())<<\" - \"<< F(next_f,(VFI.Ei()+1)%3)<<endl;\n#endif\n        ///test if I've just crossed a border\n        bool on_border=(TT(curr_f,curr_edge)==-1);\n#ifdef DEBUG_PRINT\n        cerr<<\"on_border: \"<<on_border<<endl;\n#endif\n        //bool mismatch=false;\n        bool seam=false;\n\n#ifdef DEBUG_PRINT\n        cerr<<igl::matlab_format(Handle_Seams,\"Handle_Seams\");\n#endif\n        ///or if I've just crossed a seam\n        ///if I'm on a border I MUST start from the one next t othe border\n        if (!vertexB)\n            //seam=curr_f->IsSeam(next_f);\n            seam=IsSeam(curr_f,next_f);\n        // if (vertexB)\n        // assert(!Handle_Singular(vert));\n        // ;\n        //assert(!vert->IsSingular());\n#ifdef DEBUG_PRINT\n        cerr<<\"seam: \"<<seam<<endl;\n#endif\n        possible_split=((on_border)||(seam));\n#ifdef DEBUG_PRINT\n        cerr<<\"possible_split: \"<<possible_split<<endl;\n#endif\n        complete_turn = next_f == f_init;\n#ifdef DEBUG_PRINT\n        cerr<<\"complete_turn: \"<<complete_turn<<endl;\n#endif\n    } while ((!possible_split)&&(!complete_turn));\n    face=VFI.Fi();\n    edge=VFI.Ei();\n#ifdef DEBUG_PRINT\n    cerr<<\"FindInitialPos done. Face: \"<<face<<\", edge: \"<< F(face,edge)<<\" - \"<< F(face,(edge+1)%3)<<endl;\n#endif\n    ///test that is not on a border\n    //assert(face->FFp(edge)!=face);\n}\n\n\n\n///intialize the mapping given an initial pos\n///whih must be initialized with FindInitialPos\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::VertexIndexing<DerivedV, DerivedF>::MapIndexes(const int  vert,\n                                                                    const int edge_init,\n                                                                    const int f_init)\n{\n    ///check that is not on border..\n    ///in such case maybe it's non manyfold\n    ///insert an initial index\n    int curr_index=AddNewIndex(vert);\n#ifdef DEBUG_PRINT\n    cerr<<\"--MapIndexes--\"<<endl;\n#endif\n#ifdef DEBUG_PRINT\n    cerr<<\"adding vertex for \"<<vert<<endl;\n#endif\n    ///and initialize the jumping pos\n    igl::HalfEdgeIterator<DerivedF> VFI(F,TT,TTi,f_init,edge_init);\n    bool complete_turn=false;\n    do\n    {\n        int curr_f = VFI.Fi();\n        int curr_edge = VFI.Ei();\n#ifdef DEBUG_PRINT\n        cerr<<\"Adding vertex \"<<curr_index<<\" to face \"<<curr_f<<\", edge \"<< F(curr_f,curr_edge)<<\" - \"<< F(curr_f,(curr_edge+1)%3)<<endl;\n#endif\n        ///assing the current index\n        HandleS_Index(curr_f,curr_edge) = curr_index;\n#ifdef DEBUG_PRINT\n        cerr<<igl::matlab_format(HandleS_Index,\"HandleS_Index\")<<endl;\n#endif\n        VFI.NextFE();\n        int next_f = VFI.Fi();\n#ifdef DEBUG_PRINT\n        cerr<<\"next face \"<<next_f<<\", edge \"<< F(next_f,VFI.Ei())<<\" - \"<< F(next_f,(VFI.Ei()+1)%3)<<endl;\n#endif\n        ///test if I've finiseh with the face exploration\n        complete_turn = (next_f==f_init);\n#ifdef DEBUG_PRINT\n        cerr<<\"complete_turn: \"<<complete_turn<<endl;\n#endif\n        ///or if I've just crossed a mismatch\n        if (!complete_turn)\n        {\n            bool seam=false;\n            //seam=curr_f->IsSeam(next_f);\n            seam=IsSeam(curr_f,next_f);\n            if (seam)\n            {\n                ///then add a new index\n                curr_index=AddNewIndex(vert);\n#ifdef DEBUG_PRINT\n                cerr<<\"Found a seam, adding vertex for \"<<vert<<endl;\n#endif\n            }\n        }\n    } while (!complete_turn);\n}\n\n///intialize the mapping for a given vertex\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::VertexIndexing<DerivedV, DerivedF>::InitMappingSeam(const int vert)\n{\n    ///first rotate until find the first pos after a mismatch\n    ///or a border or return to the first position...\n    int f_init = VF[vert][0];\n    int indexE = VFi[vert][0];\n\n    igl::HalfEdgeIterator<DerivedF> VFI(F,TT,TTi,f_init,indexE);\n\n    int edge_init;\n    int face_init;\n#ifdef DEBUG_PRINT\n    cerr<<\"---Vertex: \"<<vert<<\"---\"<<endl;\n#endif\n    FindInitialPos(vert,edge_init,face_init);\n    MapIndexes(vert,edge_init,face_init);\n}\n\n///intialize the mapping for a given sampled mesh\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::VertexIndexing<DerivedV, DerivedF>::InitMappingSeam()\n{\n    //num_scalar_variables=-1;\n    Handle_SystemInfo.num_scalar_variables=-1;\n    for (unsigned int i=0;i<V.rows();i++)\n        InitMappingSeam(i);\n\n    for (unsigned int j=0;j<V.rows();j++)\n    {\n        assert(HandleV_Integer[j].size()>0);\n        if (HandleV_Integer[j].size()>1)\n            duplicated.push_back(j);\n    }\n}\n\n///test consistency of face variables per vert mapping\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::VertexIndexing<DerivedV, DerivedF>::TestSeamMappingFace(const int f)\n{\n    for (int k=0;k<3;k++)\n    {\n        int indexV=HandleS_Index(f,k);\n        int v = F(f,k);\n        bool has_index=HasIndex(v,indexV);\n        assert(has_index);\n    }\n}\n\n///test consistency of face variables per vert mapping\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::VertexIndexing<DerivedV, DerivedF>::TestSeamMappingVertex(int indexVert)\n{\n    for (unsigned int k=0;k<HandleV_Integer[indexVert].size();k++)\n    {\n        int indexV=HandleV_Integer[indexVert][k];\n\n        ///get faces sharing vertex\n        std::vector<int> faces = VF[indexVert];\n        std::vector<int> indexes = VFi[indexVert];\n\n        for (unsigned int j=0;j<faces.size();j++)\n        {\n            int f = faces[j];\n            int index = indexes[j];\n            assert(F(f,index) == indexVert);\n            assert((index>=0)&&(index<3));\n\n            if (HandleS_Index(f,index) == indexV)\n                return;\n        }\n    }\n    assert(0);\n}\n\n\n///check consistency of variable mapping across seams\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::VertexIndexing<DerivedV, DerivedF>::TestSeamMapping()\n{\n    printf(\"\\n TESTING SEAM INDEXES \\n\");\n    ///test F-V mapping\n    for (unsigned int j=0;j<F.rows();j++)\n        TestSeamMappingFace(j);\n\n    ///TEST  V-F MAPPING\n    for (unsigned int j=0;j<V.rows();j++)\n        TestSeamMappingVertex(j);\n\n}\n\n\n///vertex to variable mapping\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::VertexIndexing<DerivedV, DerivedF>::InitMapping()\n{\n    //use_direction_field=_use_direction_field;\n\n    IndexToVert.clear();\n    duplicated.clear();\n\n    InitMappingSeam();\n\n    Handle_SystemInfo.num_vert_variables=Handle_SystemInfo.num_scalar_variables+1;\n\n    ///end testing...\n    TestSeamMapping();\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::VertexIndexing<DerivedV, DerivedF>::InitFaceIntegerVal()\n{\n    Handle_SystemInfo.num_integer_cuts=0;\n    for (unsigned int j=0;j<F.rows();j++)\n    {\n        for (int k=0;k<3;k++)\n        {\n            if (Handle_Seams(j,k))\n            {\n                Handle_Integer(j,k) = Handle_SystemInfo.num_integer_cuts;\n                Handle_SystemInfo.num_integer_cuts++;\n            }\n            else\n                Handle_Integer(j,k)=-1;\n        }\n    }\n}\n\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::VertexIndexing<DerivedV, DerivedF>::InitSeamInfo()\n{\n    Handle_SystemInfo.EdgeSeamInfo.clear();\n    for (unsigned int f0=0;f0<F.rows();f0++)\n    {\n        for (int k=0;k<3;k++)\n        {\n            int f1 = TT(f0,k);\n\n            if (f1 == -1)\n                continue;\n\n            bool seam = Handle_Seams(f0,k);\n            if (seam)\n            {\n                int v0,v0p,v1,v1p;\n                unsigned char MM;\n                int integerVar;\n                GetSeamInfo(f0,f1,k,v0,v1,v0p,v1p,MM,integerVar);\n                Handle_SystemInfo.EdgeSeamInfo.push_back(SeamInfo(v0,v1,v0p,v1p,MM,integerVar));\n            }\n        }\n    }\n}\n\n\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::SolvePoisson(Eigen::VectorXd Stiffness,\n                                                                     double vector_field_scale,\n                                                                     double grid_res,\n                                                                     bool direct_round,\n                                                                     int localIter,\n                                                                     bool _integer_rounding,\n                                                                     bool _singularity_rounding,\n                                                                     std::vector<int> roundVertices,\n                                                                     std::vector<std::vector<int> > hardFeatures)\n{\n    Handle_Stiffness = Stiffness;\n\n    //initialization of flags and data structures\n    integer_rounding=_integer_rounding;\n\n    ids_to_round.clear();\n\n    clearUserConstraint();\n    // copy the user constraints number\n    for (size_t i = 0; i < hardFeatures.size(); ++i)\n    {\n        addSharpEdgeConstraint(hardFeatures[i][0],hardFeatures[i][1]);\n    }\n\n    ///Initializing Matrix\n\n    int t0=clock();\n\n    ///initialize the matrix ALLOCATING SPACE\n    InitMatrix();\n    if (DEBUGPRINT)\n        printf(\"\\n ALLOCATED THE MATRIX \\n\");\n\n    ///build the laplacian system\n    BuildLaplacianMatrix(vector_field_scale);\n\n    // add seam constraints\n    BuildSeamConstraintsExplicitTranslation();\n\n    // add user defined constraints\n    BuildUserDefinedConstraints();\n\n    ////add the lagrange multiplier\n    FixBlockedVertex();\n\n    if (DEBUGPRINT)\n        printf(\"\\n BUILT THE MATRIX \\n\");\n\n    if (integer_rounding)\n        AddToRoundVertices(roundVertices);\n\n    if (_singularity_rounding)\n        AddSingularityRound();\n\n    int t1=clock();\n    if (DEBUGPRINT) printf(\"\\n time:%d \\n\",t1-t0);\n    if (DEBUGPRINT) printf(\"\\n SOLVING \\n\");\n\n    MixedIntegerSolve(grid_res,direct_round,localIter);\n\n    int t2=clock();\n    if (DEBUGPRINT) printf(\"\\n time:%d \\n\",t2-t1);\n    if (DEBUGPRINT) printf(\"\\n ASSIGNING COORDS \\n\");\n\n    MapCoords();\n\n    int t3=clock();\n    if (DEBUGPRINT) printf(\"\\n time:%d \\n\",t3-t2);\n    if (DEBUGPRINT) printf(\"\\n FINISHED \\n\");\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>\n::PoissonSolver(const Eigen::PlainObjectBase<DerivedV> &_V,\n                const Eigen::PlainObjectBase<DerivedF> &_F,\n                const Eigen::PlainObjectBase<DerivedF> &_TT,\n                const Eigen::PlainObjectBase<DerivedF> &_TTi,\n                const Eigen::PlainObjectBase<DerivedV> &_PD1,\n                const Eigen::PlainObjectBase<DerivedV> &_PD2,\n                const Eigen::MatrixXi &_HandleS_Index,\n                const Eigen::Matrix<int, Eigen::Dynamic, 1>&_Handle_Singular,\n                const MeshSystemInfo &_Handle_SystemInfo, //todo: const?\n                const double &_MiqAnisotropy):\n    V(_V),\n    F(_F),\n    TT(_TT),\n    TTi(_TTi),\n    PD1(_PD1),\n    PD2(_PD2),\n    HandleS_Index(_HandleS_Index),\n    Handle_Singular(_Handle_Singular),\n    Handle_SystemInfo(_Handle_SystemInfo)\n{\n    UV        = Eigen::MatrixXd(V.rows(),2);\n    WUV       = Eigen::MatrixXd(F.rows(),6);\n    igl::doublearea(V,F,doublearea);\n    igl::per_face_normals(V,F,N);\n    igl::vertex_triangle_adjacency(V,F,VF,VFi);\n    MiqAnisotropy=_MiqAnisotropy;\n}\n\n\n///START SYSTEM ACCESS METHODS\n///add an entry to the LHS\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::AddValA(int Xindex,\n                                                                int Yindex,\n                                                                double val)\n{\n    int size=(int)S.nrows();\n    assert(0 <= Xindex && Xindex < size);\n    assert(0 <= Yindex && Yindex < size);\n    S.A().addEntryReal(Xindex,Yindex,val);\n}\n\n///add a complex entry to the LHS\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::AddComplexA(int VarXindex,\n                                                                    int VarYindex,\n                                                                    std::complex<double> val)\n{\n    int size=(int)S.nrows()/2;\n    assert(0 <= VarXindex && VarXindex < size);\n    assert(0 <= VarYindex && VarYindex < size);\n    S.A().addEntryCmplx(VarXindex,VarYindex,val);\n}\n\n///add a velue to the RHS\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::AddValB(int Xindex,\n                                                                double val)\n{\n    int size=(int)S.nrows();\n    assert(0 <= Xindex && Xindex < size);\n    S.b()[Xindex] += val;\n}\n\n///add the area term, scalefactor is used to sum up\n///and normalize on the overlap zones\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::AddAreaTerm(int index[3][3][2],double ScaleFactor)\n{\n    const double entry = 0.5*ScaleFactor;\n    double val[3][3]= {\n        {0,       entry, -entry},\n        {-entry,      0,  entry},\n        {entry,  -entry,      0}\n    };\n\n    for (int i=0;i<3;i++)\n        for (int j=0;j<3;j++)\n        {\n            ///add for both u and v\n            int Xindex=index[i][j][0]*2;\n            int Yindex=index[i][j][1]*2;\n\n            AddValA(Xindex+1,Yindex,-val[i][j]);\n            AddValA(Xindex,Yindex+1,val[i][j]);\n        }\n}\n\n///set the diagonal of the matrix (which is zero at the beginning)\n///such that the sum of a row or a colums is zero\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::SetDiagonal(double val[3][3])\n{\n    for (int i=0;i<3;i++)\n    {\n        double sum=0;\n        for (int j=0;j<3;j++)\n            sum+=val[i][j];\n        val[i][i]=-sum;\n    }\n}\n\n///set the diagonal of the matrix (which is zero at the beginning)\n///such that the sum of a row or a colums is zero\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::SetDiagonal2(double val[6][6])\n{\n    for (int i=0;i<6;i++)\n    {\n        double sum=0;\n        for (int j=0;j<6;j++)\n            sum+=val[i][j];\n        val[i][i]=-sum;\n    }\n}\n\n///given a vector of scalar values and\n///a vector of indexes add such values\n///as specified by the indexes\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::AddRHS(double b[6],\nint index[3])\n{\n    for (int i=0;i<3;i++)\n    {\n        double valU=b[i*2];\n        double valV=b[(i*2)+1];\n        AddValB((index[i]*2),valU);\n        AddValB((index[i]*2)+1,valV);\n    }\n}\n\n///add a 3x3 block matrix to the system matrix...\n///indexes are specified in the 3x3 matrix of x,y pairs\n///indexes must be multiplied by 2 cause u and v\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::Add33Block(double val[3][3], int index[3][3][2])\n{\n    for (int i=0;i<3;i++)\n        for (int j=0;j<3;j++)\n        {\n            ///add for both u and v\n            int Xindex=index[i][j][0]*2;\n            int Yindex=index[i][j][1]*2;\n            assert((unsigned)Xindex<(n_vert_vars*2));\n            assert((unsigned)Yindex<(n_vert_vars*2));\n            AddValA(Xindex,Yindex,val[i][j]);\n            AddValA(Xindex+1,Yindex+1,val[i][j]);\n        }\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::Add66Block(double val[6][6], int index[6][6][2])\n{\n    for (int i=0;i<6;i++)\n        for (int j=0;j<6;j++)\n        {\n            ///add for both u and v\n            int Xindex=index[i][j][0];\n            int Yindex=index[i][j][1];\n            assert((unsigned)Xindex<(n_vert_vars*2));\n            assert((unsigned)Yindex<(n_vert_vars*2));\n            AddValA(Xindex,Yindex,val[i][j]);\n            //AddValA(Xindex+1,Yindex+1,val[i][j]);\n        }\n}\n\n///add a 3x3 block matrix to the system matrix...\n///indexes are specified in the 3x3 matrix of x,y pairs\n///indexes must be multiplied by 2 cause u and v\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::Add44Block(double val[4][4],int index[4][4][2])\n{\n    for (int i=0;i<4;i++)\n        for (int j=0;j<4;j++)\n        {\n            ///add for both u and v\n            int Xindex=index[i][j][0]*2;\n            int Yindex=index[i][j][1]*2;\n            assert((unsigned)Xindex<(n_vert_vars*2));\n            assert((unsigned)Yindex<(n_vert_vars*2));\n            AddValA(Xindex,Yindex,val[i][j]);\n            AddValA(Xindex+1,Yindex+1,val[i][j]);\n        }\n}\n///END SYSTEM ACCESS METHODS\n\n///START COMMON MATH FUNCTIONS\n///return the complex encoding the rotation\n///for a given missmatch interval\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE std::complex<double> igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::GetRotationComplex(int interval)\n{\n    assert((interval>=0)&&(interval<4));\n\n    switch(interval)\n    {\n    case 0:return std::complex<double>(1,0);\n    case 1:return std::complex<double>(0,1);\n    case 2:return std::complex<double>(-1,0);\n    default:return std::complex<double>(0,-1);\n    }\n}\n\n///END COMMON MATH FUNCTIONS\n\n\n///START ENERGY MINIMIZATION PART\n///initialize the LHS for a given face\n///for minimization of Dirichlet's energy\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::perElementLHS(int f,\n                                                                      double val[3][3],\nint index[3][3][2])\n{\n    ///initialize to zero\n    for (int x=0;x<3;x++)\n        for (int y=0;y<3;y++)\n            val[x][y]=0;\n\n    ///get the vertices\n    int v[3];\n    v[0] = F(f,0);\n    v[1] = F(f,1);\n    v[2] = F(f,2);\n\n    ///get the indexes of vertex instance (to consider cuts)\n    ///for the current face\n    int Vindexes[3];\n    Vindexes[0]=HandleS_Index(f,0);\n    Vindexes[1]=HandleS_Index(f,1);\n    Vindexes[2]=HandleS_Index(f,2);\n\n    ///initialize the indexes for the block\n    for (int x=0;x<3;x++)\n        for (int y=0;y<3;y++)\n        {\n            index[x][y][0]=Vindexes[x];\n            index[x][y][1]=Vindexes[y];\n        }\n\n    ///initialize edges\n    Eigen::Matrix<typename DerivedV::Scalar, 3, 1> e[3];\n    for (int k=0;k<3;k++)\n        e[k] = V.row(v[(k+2)%3]) - V.row(v[(k+1)%3]);\n\n    ///then consider area but also considering scale factor dur to overlaps\n\n    double areaT = doublearea(f)/2.0;\n\n    for (int x=0;x<3;x++)\n        for (int y=0;y<3;y++)\n            if (x!=y)\n            {\n                double num =  (e[x].dot(e[y]));\n                val[x][y]  =  num/(4.0*areaT);\n                val[x][y]  *= Handle_Stiffness[f];//f->stiffening;\n            }\n\n    ///set the matrix as diagonal\n    SetDiagonal(val);\n}\n\n/////START ENERGY MINIMIZATION PART\n/////initialize the LHS for a given face\n/////for minimization of Dirichlet's energy\n//template <typename DerivedV, typename DerivedF>\n//IGL_INLINE void igl::PoissonSolver<DerivedV, DerivedF>::perElementLHS2(int f,\n//                                                                      double val[6][6],\n//                                                                      int index[6][6][2])\n//{\n//  ///initialize to zero\n//  for (int x=0;x<6;x++)\n//    for (int y=0;y<6;y++)\n//    {\n//      val[x][y]=0;\n//      index[x][y][0]=0;\n//      index[x][y][1]=0;\n//    }\n\n//  ///get the vertices\n//  int v[3];\n//  v[0] = F(f,0);\n//  v[1] = F(f,1);\n//  v[2] = F(f,2);\n\n//  ///get the indexes of vertex instance (to consider cuts)\n//  ///for the current face\n//  int Vindexes[3];\n//  Vindexes[0]=HandleS_Index(f,0);\n//  Vindexes[1]=HandleS_Index(f,1);\n//  Vindexes[2]=HandleS_Index(f,2);\n\n//  ///initialize the indexes for the block\n//  for (int x=0;x<3;x++)\n//    for (int y=0;y<3;y++)\n//    {\n\n//      index[x*2][y*2][0]=Vindexes[x]*2;\n//      index[x*2][y*2][1]=Vindexes[y]*2;\n//      index[(x*2)+1][(y*2)+1][0]=1+Vindexes[x]*2;\n//      index[(x*2)+1][(y*2)+1][1]=1+Vindexes[y]*2;\n//    }\n\n//  ///initialize edges\n//  Eigen::Matrix<typename DerivedV::Scalar, 3, 1> e[3];\n//  for (int k=0;k<3;k++)\n//    e[k] = V.row(v[(k+2)%3]) - V.row(v[(k+1)%3]);\n\n//  ///then consider area but also considering scale factor dur to overlaps\n\n//  double areaT = doublearea(f)/2.0;\n\n//  for (int x=0;x<3;x++)\n//    for (int y=0;y<3;y++)\n//      if (x!=y)\n//      {\n//        double num =  (e[x].dot(e[y]));\n//        val[x*2][y*2]  =  num/(4.0*areaT);\n//        val[x*2][y*2]  *= Handle_Stiffness[f];//f->stiffening;\n//        val[(x*2)+1][(y*2)+1]  =  num/(4.0*areaT);\n//        val[(x*2)+1][(y*2)+1]  *= Handle_Stiffness[f];//f->stiffening;\n//      }\n\n//  ///set the matrix as diagonal\n//  SetDiagonal2(val);\n//}\n\n///START ENERGY MINIMIZATION PART\n///initialize the LHS for a given face\n///for minimization of Dirichlet's energy\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::perElementLHS2(int f,\n                                                                       double val[6][6],\nint index[6][6][2])\n{\n    ///initialize to zero\n    for (int x=0;x<6;x++)\n        for (int y=0;y<6;y++)\n        {\n            val[x][y]=0;\n            index[x][y][0]=0;\n            index[x][y][1]=0;\n        }\n\n    ///get the vertices\n    int v[3];\n    v[0] = F(f,0);\n    v[1] = F(f,1);\n    v[2] = F(f,2);\n\n    ///get the indexes of vertex instance (to consider cuts)\n    ///for the current face\n    int Vindexes[3];\n    Vindexes[0]=HandleS_Index(f,0);\n    Vindexes[1]=HandleS_Index(f,1);\n    Vindexes[2]=HandleS_Index(f,2);\n\n    ///initialize the indexes for the block\n    for (int x=0;x<3;x++)\n        for (int y=0;y<3;y++)\n        {\n\n            index[x*2][y*2][0]=Vindexes[x]*2;\n            index[x*2][y*2][1]=Vindexes[y]*2;\n            index[(x*2)+1][(y*2)+1][0]=1+Vindexes[x]*2;\n            index[(x*2)+1][(y*2)+1][1]=1+Vindexes[y]*2;\n        }\n\n    Eigen::Matrix<typename DerivedV::Scalar, 3, 1> fNorm = N.row(f);\n    Eigen::Matrix<typename DerivedV::Scalar, 3, 1> p[3];\n    p[0] = V.row(F(f,0));\n    p[1] = V.row(F(f,1));\n    p[2] = V.row(F(f,2));\n\n    Eigen::Matrix<typename DerivedV::Scalar, 3, 1> neg_t[3];\n    neg_t[0] = fNorm.cross(p[2] - p[1]);\n    neg_t[1] = fNorm.cross(p[0] - p[2]);\n    neg_t[2] = fNorm.cross(p[1] - p[0]);\n\n\n    ///then consider area but also considering scale factor dur to overlaps\n\n    //double areaT = doublearea(f)/2.0;\n    double inv_dbl_A = 1.0 / fabs(neg_t[0].dot(p[0] - p[2]));\n\n    Eigen::Matrix<typename DerivedV::Scalar, 3, 1> K1,K2;\n    K1 = PD1.row(f);\n    K2 = -PD2.row(f); // TODO: the \"-\" accounts for the orientation of local_basis.h, adapt the code before and remove the \"-\"\n\n    Eigen::Matrix<typename DerivedV::Scalar, 3, 1> Kinv1_vec, Kinv2_vec;\n\n    //     672     matvec::pseudo_inverse_2x3(toCVec3D(K1), toCVec3D(K2), toCVec3D(norm), Kinv1_vec, Kinv2_vec);\n    Eigen::Matrix<typename DerivedV::Scalar, 3, 1> neg_K1perp = K1.cross(fNorm);\n    Eigen::Matrix<typename DerivedV::Scalar, 3, 1> K2perp = fNorm.cross(K2);\n    double c2 = K1.dot(K2perp);\n    c2 = (c2 == 0) ? 1.0 : 1.0 / c2;\n    Kinv1_vec = c2*(K2perp);\n    Kinv2_vec = c2*(neg_K1perp);\n\n    //     673     Vector Kinv1 = toVector(Kinv1_vec);\n    //     674     Vector Kinv2 = toVector(Kinv2_vec);\n    const double a=MiqAnisotropy;\n    const double sqrt_a = sqrt(a);\n\n    //     676     double nt_proj_K1[3] = { neg_t[0] * Kinv1, neg_t[1] * Kinv1, neg_t[2] * Kinv1 };\n    //     677     double nt_proj_K2[3] = { neg_t[0] * Kinv2, neg_t[1] * Kinv2, neg_t[2] * Kinv2 };\n    double nt_proj_K1[3] = { neg_t[0].dot(Kinv1_vec), neg_t[1].dot(Kinv1_vec), neg_t[2].dot(Kinv1_vec) };\n    double nt_proj_K2[3] = { neg_t[0].dot(Kinv2_vec), neg_t[1].dot(Kinv2_vec), neg_t[2].dot(Kinv2_vec) };\n    //     678     const double K1K1 = K1 * K1;\n    //     679     const double K1K2 = K1 * K2;\n    //     680     const double K2K2 = K2 * K2;\n\n    const double K1K1 = K1.dot(K1);\n    const double K1K2 = K1.dot(K2);\n    const double K2K2 = K2.dot(K2);\n    // Computes 4x the Dirichlet energy minimization LHS when a=1.\n    //  694     //     original: (1/8 dot(t_j, t_k) / (triangle area))\n    //  695     //     computes: (1/2 dot(t_j, t_k) / (triangle area))\n    for(int i = 0; i < 3; i++) {\n        for(int j = 0; j < 3; j++) {\n            //698             A[6*(2*i  ) + (2*j  )] = inv_dbl_A *\n            //699                     (      a * K1K1 * (nt_proj_K1[i]*nt_proj_K1[j])\n            //700                     + sqrt_a * K1K2 * (nt_proj_K1[i]*nt_proj_K2[j] + nt_proj_K2[i]*nt_proj_K1[j])\n            //701                     +          K2K2 * (nt_proj_K2[i]*nt_proj_K2[j])\n            //702                     );\n            val[2*i][2*j]=inv_dbl_A*(      a * K1K1 * (nt_proj_K1[i]*nt_proj_K1[j])\n                                           + sqrt_a * K1K2 * (nt_proj_K1[i]*nt_proj_K2[j] + nt_proj_K2[i]*nt_proj_K1[j])\n                                           +          K2K2 * (nt_proj_K2[i]*nt_proj_K2[j])\n                                           );\n            //    703             A[6*(2*i  ) + (2*j+1)] = 0.;\n            //    704             A[6*(2*i+1) + (2*j  )] = 0.;\n            val[2*i][2*j+1] = 0;\n            val[2*i+1][2*j] = 0;\n            //    705             A[6*(2*i+1) + (2*j+1)] = inv_dbl_A *\n            //    706                     (          K1K1 * (nt_proj_K1[i]*nt_proj_K1[j])\n            //    707                     + sqrt_a * K1K2 * (nt_proj_K1[i]*nt_proj_K2[j] + nt_proj_K2[i]*nt_proj_K1[j])\n            //    708                     +      a * K2K2 * (nt_proj_K2[i]*nt_proj_K2[j])\n            //    709                     );\n            val[2*i+1][2*j+1] = inv_dbl_A *( K1K1 * (nt_proj_K1[i]*nt_proj_K1[j])\n                                             + sqrt_a * K1K2 * (nt_proj_K1[i]*nt_proj_K2[j] + nt_proj_K2[i]*nt_proj_K1[j])\n                                             +      a * K2K2 * (nt_proj_K2[i]*nt_proj_K2[j])\n                                             );\n            // Include the area term if applicable (for conformal)\n            // 4x Dirichlet energy => use Marea x 4.\n        }\n    }\n\n    for(size_t i=0;i<6;i++)\n        for (size_t j=0;j<6;j++)\n            val[i][j] *= Handle_Stiffness[f];\n}\n\n///initialize the RHS for a given face\n///for minimization of Dirichlet's energy\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::perElementRHS(int f,\n                                                                      double b[6],\ndouble vector_field_scale)\n{\n\n    /// then set the rhs\n    Eigen::Matrix<typename DerivedV::Scalar, 3, 1> scaled_Kreal;\n    Eigen::Matrix<typename DerivedV::Scalar, 3, 1> scaled_Kimag;\n    Eigen::Matrix<typename DerivedV::Scalar, 3, 1> fNorm = N.row(f);\n    Eigen::Matrix<typename DerivedV::Scalar, 3, 1> p[3];\n    p[0] = V.row(F(f,0));\n    p[1] = V.row(F(f,1));\n    p[2] = V.row(F(f,2));\n\n    Eigen::Matrix<typename DerivedV::Scalar, 3, 1> neg_t[3];\n    neg_t[0] = fNorm.cross(p[2] - p[1]);\n    neg_t[1] = fNorm.cross(p[0] - p[2]);\n    neg_t[2] = fNorm.cross(p[1] - p[0]);\n\n    Eigen::Matrix<typename DerivedV::Scalar, 3, 1> K1,K2;\n    K1 = PD1.row(f);\n    K2 = -PD2.row(f); // TODO: the \"-\" accounts for the orientation of local_basis.h, adapt the code before and remove the \"-\"\n\n    scaled_Kreal = K1*(vector_field_scale)/2;\n    scaled_Kimag = K2*(vector_field_scale)/2;\n\n    double stiff_val = Handle_Stiffness[f]*MiqAnisotropy;\n\n    b[0] = scaled_Kreal.dot(neg_t[0]) * stiff_val;\n    b[1] = scaled_Kimag.dot(neg_t[0]) * stiff_val;\n    b[2] = scaled_Kreal.dot(neg_t[1]) * stiff_val;\n    b[3] = scaled_Kimag.dot(neg_t[1]) * stiff_val;\n    b[4] = scaled_Kreal.dot(neg_t[2]) * stiff_val;\n    b[5] = scaled_Kimag.dot(neg_t[2]) * stiff_val;\n\n    //    if (f == 0)\n    //    {\n    //      cerr << \"DEBUG!!!\" << endl;\n    //\n    //\n    //      for (unsigned z = 0; z<6; ++z)\n    //        cerr << b[z] << \" \";\n    //      cerr << endl;\n    //\n    //      scaled_Kreal = K1*(vector_field_scale)/2;\n    //      scaled_Kimag = -K2*(vector_field_scale)/2;\n    //\n    //      double stiff_val = Handle_Stiffness[f];\n    //\n    //      b[0] = scaled_Kreal.dot(neg_t[0]) * stiff_val;\n    //      b[1] = scaled_Kimag.dot(neg_t[0]) * stiff_val;\n    //      b[2] = scaled_Kreal.dot(neg_t[1]) * stiff_val;\n    //      b[3] = scaled_Kimag.dot(neg_t[1]) * stiff_val;\n    //      b[4] = scaled_Kreal.dot(neg_t[2]) * stiff_val;\n    //      b[5] = scaled_Kimag.dot(neg_t[2]) * stiff_val;\n    //\n    //      for (unsigned z = 0; z<6; ++z)\n    //        cerr << b[z] << \" \";\n    //      cerr << endl;\n    //\n    //    }\n\n}\n\n///evaluate the LHS and RHS for a single face\n///for minimization of Dirichlet's energy\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::PerElementSystemReal2(int f,\n                                                                              double val[6][6],\nint index[6][6][2],\ndouble b[6],\ndouble vector_field_scale)\n{\n    perElementLHS2(f,val,index);\n    perElementRHS(f,b,vector_field_scale);\n}\n\n///evaluate the LHS and RHS for a single face\n///for minimization of Dirichlet's energy\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::PerElementSystemReal(int f,\n                                                                             double val[3][3],\nint index[3][3][2],\ndouble b[6],\ndouble vector_field_scale)\n{\n    perElementLHS(f,val,index);\n    perElementRHS(f,b,vector_field_scale);\n}\n///END ENERGY MINIMIZATION PART\n\n///START FIXING VERTICES\n///set a given vertex as fixed\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::AddFixedVertex(int v)\n{\n    n_fixed_vars++;\n    Hard_constraints.push_back(v);\n}\n\n///find vertex to fix in case we're using\n///a vector field NB: multiple components not handled\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::FindFixedVertField()\n{\n    Hard_constraints.clear();\n\n    n_fixed_vars=0;\n    //fix the first singularity\n    for (unsigned int v=0;v<V.rows();v++)\n    {\n        if (Handle_Singular(v))\n        {\n            AddFixedVertex(v);\n            UV.row(v) << 0,0;\n            return;\n        }\n    }\n\n    ///if anything fixed fix the first\n    AddFixedVertex(0); // TODO HERE IT ISSSSSS\n    UV.row(0) << 0,0;\n    std::cerr << \"No vertices to fix, I am fixing the first vertex to the origin!\" << std::endl;\n}\n\n///find hard constraint depending if using or not\n///a vector field\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::FindFixedVert()\n{\n    Hard_constraints.clear();\n    FindFixedVertField();\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE int igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::GetFirstVertexIndex(int v)\n{\n    return HandleS_Index(VF[v][0],VFi[v][0]);\n}\n\n///fix the vertices which are flagged as fixed\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::FixBlockedVertex()\n{\n    int offset_row = n_vert_vars*2 + num_cut_constraint*2;\n\n    unsigned int constr_num = 0;\n    for (unsigned int i=0;i<Hard_constraints.size();i++)\n    {\n        int v = Hard_constraints[i];\n\n        ///get first index of the vertex that must blocked\n        //int index=v->vertex_index[0];\n        int index = GetFirstVertexIndex(v);\n\n        ///multiply times 2 because of uv\n        int indexvert = index*2;\n\n        ///find the first free row to add the constraint\n        int indexRow = (offset_row+constr_num*2);\n        int indexCol = indexRow;\n\n        ///add fixing constraint LHS\n        AddValA(indexRow,indexvert,1);\n        AddValA(indexRow+1,indexvert+1,1);\n\n        ///add fixing constraint RHS\n        AddValB(indexCol,  UV(v,0));\n        AddValB(indexCol+1,UV(v,1));\n\n        constr_num++;\n    }\n    assert(constr_num==n_fixed_vars);\n}\n///END FIXING VERTICES\n\n///HANDLING SINGULARITY\n//set the singularity round to integer location\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::AddSingularityRound()\n{\n    for (unsigned int v=0;v<V.rows();v++)\n    {\n        if (Handle_Singular(v))\n        {\n            int index0=GetFirstVertexIndex(v);\n            ids_to_round.push_back( index0*2   );\n            ids_to_round.push_back((index0*2)+1);\n        }\n    }\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::AddToRoundVertices(std::vector<int> ids)\n{\n    for (size_t i = 0; i < ids.size(); ++i)\n    {\n        if (ids[i] < 0 || ids[i] >= V.rows())\n            std::cerr << \"WARNING: Ignored round vertex constraint, vertex \" << ids[i] << \" does not exist in the mesh.\" << std::endl;\n        int index0 = GetFirstVertexIndex(ids[i]);\n        ids_to_round.push_back( index0*2   );\n        ids_to_round.push_back((index0*2)+1);\n    }\n}\n\n///START GENERIC SYSTEM FUNCTIONS\n//build the laplacian matrix cyclyng over all rangemaps\n//and over all faces\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::BuildLaplacianMatrix(double vfscale)\n{\n    ///then for each face\n    for (unsigned int f=0;f<F.rows();f++)\n    {\n\n        int var_idx[3]; //vertex variable indices\n\n        for(int k = 0; k < 3; ++k)\n            var_idx[k] = HandleS_Index(f,k);\n\n        ///block of variables\n        double val[3][3];\n        ///block of vertex indexes\n        int index[3][3][2];\n        ///righe hand side\n        double b[6];\n        ///compute the system for the given face\n        PerElementSystemReal(f, val,index, b, vfscale);\n\n\n        //Add the element to the matrix\n        //Add33Block(val,index);\n\n        ///add right hand side\n        AddRHS(b,var_idx);\n\n        //then test.. compute\n        double val2[6][6];\n        int index2[6][6][2];\n        PerElementSystemReal2(f,val2,index2,b,vfscale);\n\n        Add66Block(val2,index2);\n\n//        if (f!=0)continue;\n//        std::cout<<\"TEST1\"<<std::endl;\n//        for (size_t i=0;i<S.A().nentries();i++)\n//        {\n//            //m_rowind.push_back(i);   m_colind.push_back(j);   m_vals.push_back(val)\n//            if (S.A().vals()[i]==0)continue;\n//            std::cout<<S.A().rowind()[i]<<\",\"<<S.A().colind()[i]<<\" : \"<<S.A().vals()[i]<<std::endl;\n//        }\n//        std::cout<<\"TEST2\"<<std::endl;\n//        for (size_t i=0;i<6;i++)\n//            for (size_t j=0;j<6;j++)\n//            {\n//                if (val2[i][j]==0)continue;\n//                std::cout<<index2[i][j][0]<<\",\"<<index2[i][j][1]<<\" : \"<<val2[i][j]<<std::endl;\n//            }\n    }\n\n}\n\n///find different sized of the system\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::FindSizes()\n{\n    ///find the vertex that need to be fixed\n    FindFixedVert();\n\n    ///REAL PART\n    n_vert_vars = Handle_SystemInfo.num_vert_variables;\n\n    ///INTEGER PART\n    ///the total number of integer variables\n    n_integer_vars = Handle_SystemInfo.num_integer_cuts;\n\n    ///CONSTRAINT PART\n    num_cut_constraint = Handle_SystemInfo.EdgeSeamInfo.size()*2;\n\n    num_constraint_equations = num_cut_constraint*2 + n_fixed_vars*2 + num_userdefined_constraint;\n\n    ///total variable of the system\n    num_total_vars = n_vert_vars*2+n_integer_vars*2;\n\n    ///initialize matrix size\n\n    system_size = num_total_vars + num_constraint_equations;\n\n    if (DEBUGPRINT)     printf(\"\\n*** SYSTEM VARIABLES *** \\n\");\n    if (DEBUGPRINT)     printf(\"* NUM REAL VERTEX VARIABLES %d \\n\",n_vert_vars);\n\n    if (DEBUGPRINT)     printf(\"\\n*** SINGULARITY *** \\n \");\n    if (DEBUGPRINT)     printf(\"* NUM SINGULARITY %d\\n\",(int)ids_to_round.size()/2);\n\n    if (DEBUGPRINT)     printf(\"\\n*** INTEGER VARIABLES *** \\n\");\n    if (DEBUGPRINT)     printf(\"* NUM INTEGER VARIABLES %d \\n\",(int)n_integer_vars);\n\n    if (DEBUGPRINT)     printf(\"\\n*** CONSTRAINTS *** \\n \");\n    if (DEBUGPRINT)     printf(\"* NUM FIXED CONSTRAINTS %d\\n\",n_fixed_vars);\n    if (DEBUGPRINT)     printf(\"* NUM CUTS CONSTRAINTS %d\\n\",num_cut_constraint);\n    if (DEBUGPRINT)     printf(\"* NUM USER DEFINED CONSTRAINTS %d\\n\",num_userdefined_constraint);\n\n    if (DEBUGPRINT)     printf(\"\\n*** TOTAL SIZE *** \\n\");\n    if (DEBUGPRINT)     printf(\"* TOTAL VARIABLE SIZE (WITH INTEGER TRASL) %d \\n\",num_total_vars);\n    if (DEBUGPRINT)     printf(\"* TOTAL CONSTRAINTS %d \\n\",num_constraint_equations);\n    if (DEBUGPRINT)     printf(\"* MATRIX SIZE  %d \\n\",system_size);\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::AllocateSystem()\n{\n    S.initialize(system_size, system_size);\n    printf(\"\\n INITIALIZED SPARSE MATRIX OF %d x %d \\n\",system_size, system_size);\n}\n\n///intitialize the whole matrix\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::InitMatrix()\n{\n    FindSizes();\n    AllocateSystem();\n}\n\n///map back coordinates after that\n///the system has been solved\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::MapCoords()\n{\n    ///map coords to faces\n    for (unsigned int f=0;f<F.rows();f++)\n    {\n\n        for (int k=0;k<3;k++)\n        {\n            //get the index of the variable in the system\n            int indexUV = HandleS_Index(f,k);\n            ///then get U and V coords\n            double U=X[indexUV*2];\n            double V=X[indexUV*2+1];\n\n            WUV(f,k*2 + 0) = U;\n            WUV(f,k*2 + 1) = V;\n        }\n    }\n\n#if 0\n    ///initialize the vector of integer variables to return their values\n    Handle_SystemInfo.IntegerValues.resize(n_integer_vars*2);\n    int baseIndex = (n_vert_vars)*2;\n    int endIndex  = baseIndex+n_integer_vars*2;\n    int index     = 0;\n    for (int i=baseIndex; i<endIndex; i++)\n    {\n        ///assert that the value is an integer value\n        double value=X[i];\n        double diff = value-(int)floor(value+0.5);\n        assert(diff<0.00000001);\n        Handle_SystemInfo.IntegerValues[index] = value;\n        index++;\n    }\n#endif\n}\n\n///END GENERIC SYSTEM FUNCTIONS\n\n///set the constraints for the inter-range cuts\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::BuildSeamConstraintsExplicitTranslation()\n{\n    ///add constraint(s) for every seam edge (not halfedge)\n    int offset_row = n_vert_vars;\n    ///current constraint row\n    int constr_row = offset_row;\n    ///current constraint\n    unsigned int constr_num = 0;\n\n    for (unsigned int i=0; i<num_cut_constraint/2; i++)\n    {\n        unsigned char interval = Handle_SystemInfo.EdgeSeamInfo[i].MMatch;\n        if (interval==1)\n            interval=3;\n        else\n            if(interval==3)\n                interval=1;\n\n        int p0  = Handle_SystemInfo.EdgeSeamInfo[i].v0;\n        int p1  = Handle_SystemInfo.EdgeSeamInfo[i].v1;\n        int p0p = Handle_SystemInfo.EdgeSeamInfo[i].v0p;\n        int p1p = Handle_SystemInfo.EdgeSeamInfo[i].v1p;\n\n        std::complex<double> rot = GetRotationComplex(interval);\n\n        ///get the integer variable\n        int integerVar = offset_row+Handle_SystemInfo.EdgeSeamInfo[i].integerVar;\n\n        if (integer_rounding)\n        {\n            ids_to_round.push_back(integerVar*2);\n            ids_to_round.push_back(integerVar*2+1);\n        }\n\n        AddComplexA(constr_row, p0 ,  rot);\n        AddComplexA(constr_row, p0p,   -1);\n        ///then translation...considering the rotation\n        ///due to substitution\n        AddComplexA(constr_row, integerVar, 1);\n\n        AddValB(2*constr_row  ,0);\n        AddValB(2*constr_row+1,0);\n        constr_row +=1;\n        constr_num++;\n\n        AddComplexA(constr_row, p1,  rot);\n        AddComplexA(constr_row, p1p, -1);\n\n        ///other translation\n        AddComplexA(constr_row, integerVar  , 1);\n\n        AddValB(2*constr_row,0);\n        AddValB(2*constr_row+1,0);\n\n        constr_row +=1;\n        constr_num++;\n    }\n}\n\n///set the constraints for the inter-range cuts\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::BuildUserDefinedConstraints()\n{\n    /// the user defined constraints are at the end\n    int offset_row = n_vert_vars*2 + num_cut_constraint*2 + n_fixed_vars*2;\n\n    ///current constraint row\n    int constr_row = offset_row;\n\n    assert(num_userdefined_constraint == userdefined_constraints.size());\n\n    for (unsigned int i=0; i<num_userdefined_constraint; i++)\n    {\n        for (unsigned int j=0; j<userdefined_constraints[i].size()-1; ++j)\n        {\n            AddValA(constr_row, j ,  userdefined_constraints[i][j]);\n        }\n\n        AddValB(constr_row,userdefined_constraints[i][userdefined_constraints[i].size()-1]);\n\n        constr_row +=1;\n    }\n}\n\n///call of the mixed integer solver\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::MixedIntegerSolve(double cone_grid_res,\n                                                                          bool direct_round,\n                                                                          int localIter)\n{\n    X = std::vector<double>((n_vert_vars+n_integer_vars)*2);\n\n    ///variables part\n    int ScalarSize = n_vert_vars*2;\n    int SizeMatrix = (n_vert_vars+n_integer_vars)*2;\n\n    if (DEBUGPRINT)\n        printf(\"\\n ALLOCATED X \\n\");\n\n    ///matrix A\n    gmm::col_matrix< gmm::wsvector< double > > A(SizeMatrix,SizeMatrix); // lhs matrix variables +\n\n    ///constraints part\n    int CsizeX = num_constraint_equations;\n    int CsizeY = SizeMatrix+1;\n    gmm::row_matrix< gmm::wsvector< double > > C(CsizeX,CsizeY); // constraints\n\n    if (DEBUGPRINT)\n        printf(\"\\n ALLOCATED QMM STRUCTURES \\n\");\n\n    std::vector<double> rhs(SizeMatrix,0);  // rhs\n\n    if (DEBUGPRINT)\n        printf(\"\\n ALLOCATED RHS STRUCTURES \\n\");\n\n    //// copy LHS\n    for(int i = 0; i < (int)S.A().nentries(); ++i)\n    {\n        int row  = S.A().rowind()[i];\n        int col  = S.A().colind()[i];\n        int size =(int)S.nrows();\n        assert(0 <= row && row < size);\n        assert(0 <= col && col < size);\n\n        // it's either part of the matrix\n        if (row < ScalarSize)\n        {\n            A(row, col) += S.A().vals()[i];\n        }\n        // or it's a part of the constraint\n        else\n        {\n            assert ((unsigned int)row < (n_vert_vars+num_constraint_equations)*2);\n            int r = row - ScalarSize;\n            assert(r   < CsizeX);\n            assert(col < CsizeY);\n            C(r  , col  ) +=  S.A().vals()[i];\n        }\n    }\n\n    if (DEBUGPRINT)\n        printf(\"\\n SET %d INTEGER VALUES \\n\",n_integer_vars);\n\n    ///add penalization term for integer variables\n    double penalization = 0.000001;\n    int offline_index   = ScalarSize;\n    for(unsigned int i = 0; i < (n_integer_vars)*2; ++i)\n    {\n        int index=offline_index+i;\n        A(index,index)=penalization;\n    }\n\n    if (DEBUGPRINT)\n        printf(\"\\n SET RHS \\n\");\n\n    // copy RHS\n    for(int i = 0; i < (int)ScalarSize; ++i)\n    {\n        rhs[i] = S.getRHSReal(i) * cone_grid_res;\n    }\n\n    // copy constraint RHS\n    if (DEBUGPRINT)\n        printf(\"\\n SET %d CONSTRAINTS \\n\",num_constraint_equations);\n\n    for(unsigned int i = 0; i < num_constraint_equations; ++i)\n    {\n        C(i, SizeMatrix) = -S.getRHSReal(ScalarSize + i) * cone_grid_res;\n    }\n\n    ///copy values back into S\n    COMISO::ConstrainedSolver solver;\n\n    solver.misolver().set_local_iters(localIter);\n\n    solver.misolver().set_direct_rounding(direct_round);\n\n    std::sort(ids_to_round.begin(),ids_to_round.end());\n    std::vector<int>::iterator new_end=std::unique(ids_to_round.begin(),ids_to_round.end());\n    int dist=distance(ids_to_round.begin(),new_end);\n    ids_to_round.resize(dist);\n\n    solver.solve( C, A, X, rhs, ids_to_round, 0.0, false, false);\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::clearUserConstraint()\n{\n    num_userdefined_constraint = 0;\n    userdefined_constraints.clear();\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::addSharpEdgeConstraint(int fid, int vid)\n{\n    // prepare constraint\n    std::vector<int> c(Handle_SystemInfo.num_vert_variables*2 + 1);\n\n    for (size_t i = 0; i < c.size(); ++i)\n    {\n        c[i] = 0;\n    }\n\n    int v1 = F(fid,vid);\n    int v2 = F(fid,(vid+1)%3);\n\n    Eigen::Matrix<typename DerivedV::Scalar, 3, 1> e = V.row(v2) - V.row(v1);\n    e = e.normalized();\n\n    int v1i = HandleS_Index(fid,vid);//GetFirstVertexIndex(v1);\n    int v2i = HandleS_Index(fid,(vid+1)%3);//GetFirstVertexIndex(v2);\n\n    double d1 = fabs(e.dot(PD1.row(fid).normalized()));\n    double d2 = fabs(e.dot(PD2.row(fid).normalized()));\n\n    int offset = 0;\n\n    if (d1>d2)\n        offset = 1;\n\n    ids_to_round.push_back((v1i * 2) + offset);\n    ids_to_round.push_back((v2i * 2) + offset);\n\n    // add constraint\n    c[(v1i * 2) + offset] =  1;\n    c[(v2i * 2) + offset] = -1;\n\n    // add to the user-defined constraints\n    num_userdefined_constraint++;\n    userdefined_constraints.push_back(c);\n\n}\n\n\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedU>\nIGL_INLINE igl::copyleft::comiso::MIQ_class<DerivedV, DerivedF, DerivedU>::MIQ_class(const Eigen::PlainObjectBase<DerivedV> &V_,\n                                                                   const Eigen::PlainObjectBase<DerivedF> &F_,\n                                                                   const Eigen::PlainObjectBase<DerivedV> &PD1_combed,\n                                                                   const Eigen::PlainObjectBase<DerivedV> &PD2_combed,\n                                                                   // const Eigen::PlainObjectBase<DerivedV> &BIS1_combed,\n                                                                   // const Eigen::PlainObjectBase<DerivedV> &BIS2_combed,\n                                                                   const Eigen::Matrix<int, Eigen::Dynamic, 3> &Handle_MMatch,\n                                                                   const Eigen::Matrix<int, Eigen::Dynamic, 1> &Handle_Singular,\n                                                                   // const Eigen::Matrix<int, Eigen::Dynamic, 1> &Handle_SingularDegree,\n                                                                   const Eigen::Matrix<int, Eigen::Dynamic, 3> &Handle_Seams,\n                                                                   Eigen::PlainObjectBase<DerivedU> &UV,\n                                                                   Eigen::PlainObjectBase<DerivedF> &FUV,\n                                                                   double GradientSize,\n                                                                   double Stiffness,\n                                                                   bool DirectRound,\n                                                                   int iter,\n                                                                   int localIter,\n                                                                   bool DoRound,\n                                                                   bool SingularityRound,\n                                                                   std::vector<int> roundVertices,\n                                                                   std::vector<std::vector<int> > hardFeatures,\n                                                                   double MiqAnisotropy):\n    V(V_),\n    F(F_)\n{\n    igl::local_basis(V,F,B1,B2,B3);\n    //igl::triangle_triangle_adjacency(V,F,TT,TTi);\n    igl::triangle_triangle_adjacency(F,TT,TTi);\n\n    // Prepare indexing for the linear system\n    VertexIndexing<DerivedV, DerivedF> VInd(V, F, TT, TTi, /*BIS1_combed, BIS2_combed,*/ Handle_MMatch, /*Handle_Singular, Handle_SingularDegree,*/ Handle_Seams);\n\n    VInd.InitMapping();\n    VInd.InitFaceIntegerVal();\n    VInd.InitSeamInfo();\n\n    std::cout<<\"*** Anisotropy *** \"<<MiqAnisotropy<<std::endl;\n    // Eigen::PlainObjectBase<DerivedV> PD1_combed_for_poisson, PD2_combed_for_poisson;\n    // // Rotate by 90 degrees CCW\n    // PD1_combed_for_poisson.setZero(PD1_combed.rows(),3);\n    // PD2_combed_for_poisson.setZero(PD2_combed.rows(),3);\n    // for (unsigned i=0; i<PD1_combed.rows();++i)\n    // {\n    //   double n1 = PD1_combed.row(i).norm();\n    //   double n2 = PD2_combed.row(i).norm();\n    //\n    //   double a1 = atan2(B2.row(i).dot(PD1_combed.row(i)),B1.row(i).dot(PD1_combed.row(i)));\n    //   double a2 = atan2(B2.row(i).dot(PD2_combed.row(i)),B1.row(i).dot(PD2_combed.row(i)));\n    //\n    //   // a1 += M_PI/2;\n    //   // a2 += M_PI/2;\n    //\n    //\n    //   PD1_combed_for_poisson.row(i) = cos(a1) * B1.row(i) + sin(a1) * B2.row(i);\n    //   PD2_combed_for_poisson.row(i) = cos(a2) * B1.row(i) + sin(a2) * B2.row(i);\n    //\n    //   PD1_combed_for_poisson.row(i) = PD1_combed_for_poisson.row(i).normalized() * n1;\n    //   PD2_combed_for_poisson.row(i) = PD2_combed_for_poisson.row(i).normalized() * n2;\n    // }\n\n\n    // Assemble the system and solve\n    PoissonSolver<DerivedV, DerivedF> PSolver(V,\n                                              F,\n                                              TT,\n                                              TTi,\n                                              PD1_combed,\n                                              PD2_combed,\n                                              VInd.HandleS_Index,\n                                              /*VInd.Handle_Singular*/Handle_Singular,\n                                              VInd.Handle_SystemInfo,\n                                              MiqAnisotropy);\n\n    Handle_Stiffness = Eigen::VectorXd::Constant(F.rows(),1);\n\n\n    if (iter > 0) // do stiffening\n    {\n        for (int i=0;i<iter;i++)\n        {\n            PSolver.SolvePoisson(Handle_Stiffness, GradientSize,1.f,DirectRound,localIter,DoRound,SingularityRound,roundVertices,hardFeatures);\n            int nflips=NumFlips(PSolver.WUV);\n            bool folded = updateStiffeningJacobianDistorsion(GradientSize,PSolver.WUV);\n            printf(\"ITERATION %d FLIPS %d \\n\",i,nflips);\n            if (!folded)break;\n        }\n    }\n    else\n    {\n        PSolver.SolvePoisson(Handle_Stiffness,GradientSize,1.f,DirectRound,localIter,DoRound,SingularityRound,roundVertices,hardFeatures);\n    }\n\n    int nflips=NumFlips(PSolver.WUV);\n    printf(\"**** END OPTIMIZING #FLIPS %d  ****\\n\",nflips);\n\n    fflush(stdout);\n    WUV = PSolver.WUV;\n\n}\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedU>\nIGL_INLINE void igl::copyleft::comiso::MIQ_class<DerivedV, DerivedF, DerivedU>::extractUV(Eigen::PlainObjectBase<DerivedU> &UV_out,\n                                                                        Eigen::PlainObjectBase<DerivedF> &FUV_out)\n{\n    //      int f = F.rows();\n    int f = WUV.rows();\n\n    unsigned vtfaceid[f*3];\n    std::vector<double> vtu;\n    std::vector<double> vtv;\n\n    std::vector<std::vector<double> > listUV;\n    unsigned counter = 0;\n\n    for (unsigned i=0; i<f; ++i)\n    {\n        for (unsigned j=0; j<3; ++j)\n        {\n            std::vector<double> t(3);\n            t[0] = WUV(i,j*2 + 0);\n            t[1] = WUV(i,j*2 + 1);\n            t[2] = counter++;\n            listUV.push_back(t);\n        }\n    }\n    std::sort(listUV.begin(),listUV.end());\n\n    counter = 0;\n    unsigned k = 0;\n    while (k < f*3)\n    {\n        double u = listUV[k][0];\n        double v = listUV[k][1];\n        unsigned id = round(listUV[k][2]);\n\n        vtfaceid[id] = counter;\n        vtu.push_back(u);\n        vtv.push_back(v);\n\n        unsigned j=1;\n        while(k+j < f*3 && u == listUV[k+j][0] && v == listUV[k+j][1])\n        {\n            unsigned tid = round(listUV[k+j][2]);\n            vtfaceid[tid] = counter;\n            ++j;\n        }\n        k = k+j;\n        counter++;\n    }\n\n    UV_out.resize(vtu.size(),2);\n    for (unsigned i=0; i<vtu.size(); ++i)\n    {\n        UV_out(i,0) = vtu[i];\n        UV_out(i,1) = vtv[i];\n    }\n\n    FUV_out.resize(f,3);\n\n    unsigned vcounter = 0;\n    for (unsigned i=0; i<f; ++i)\n    {\n        FUV_out(i,0)  = vtfaceid[vcounter++];\n        FUV_out(i,1)  = vtfaceid[vcounter++];\n        FUV_out(i,2)  = vtfaceid[vcounter++];\n    }\n\n}\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedU>\nIGL_INLINE int igl::copyleft::comiso::MIQ_class<DerivedV, DerivedF, DerivedU>::NumFlips(const Eigen::MatrixXd& WUV)\n{\n    int numFl=0;\n    for (unsigned int i=0;i<F.rows();i++)\n    {\n        if (IsFlipped(i, WUV))\n            numFl++;\n    }\n    return numFl;\n}\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedU>\nIGL_INLINE double igl::copyleft::comiso::MIQ_class<DerivedV, DerivedF, DerivedU>::Distortion(int f, double h, const Eigen::MatrixXd& WUV)\n{\n    assert(h > 0);\n\n    Eigen::Vector2d uv0,uv1,uv2;\n\n    uv0 << WUV(f,0), WUV(f,1);\n    uv1 << WUV(f,2), WUV(f,3);\n    uv2 << WUV(f,4), WUV(f,5);\n\n    Eigen::Matrix<typename DerivedV::Scalar, 3, 1> p0 = V.row(F(f,0));\n    Eigen::Matrix<typename DerivedV::Scalar, 3, 1> p1 = V.row(F(f,1));\n    Eigen::Matrix<typename DerivedV::Scalar, 3, 1> p2 = V.row(F(f,2));\n\n    Eigen::Matrix<typename DerivedV::Scalar, 3, 1> norm = (p1 - p0).cross(p2 - p0);\n    double area2 = norm.norm();\n    double area2_inv  = 1.0 / area2;\n    norm *= area2_inv;\n\n    if (area2 > 0)\n    {\n        // Singular values of the Jacobian\n        Eigen::Matrix<typename DerivedV::Scalar, 3, 1> neg_t0 = norm.cross(p2 - p1);\n        Eigen::Matrix<typename DerivedV::Scalar, 3, 1> neg_t1 = norm.cross(p0 - p2);\n        Eigen::Matrix<typename DerivedV::Scalar, 3, 1> neg_t2 = norm.cross(p1 - p0);\n\n        Eigen::Matrix<typename DerivedV::Scalar, 3, 1> diffu =  (neg_t0 * uv0(0) +neg_t1 *uv1(0) +  neg_t2 * uv2(0) )*area2_inv;\n        Eigen::Matrix<typename DerivedV::Scalar, 3, 1> diffv = (neg_t0 * uv0(1) + neg_t1*uv1(1) +  neg_t2*uv2(1) )*area2_inv;\n\n        // first fundamental form\n        double I00 = diffu.dot(diffu);  // guaranteed non-neg\n        double I01 = diffu.dot(diffv);  // I01 = I10\n        double I11 = diffv.dot(diffv);  // guaranteed non-neg\n\n        // eigenvalues of a 2x2 matrix\n        // [a00 a01]\n        // [a10 a11]\n        // 1/2 * [ (a00 + a11) +/- sqrt((a00 - a11)^2 + 4 a01 a10) ]\n        double trI = I00 + I11;                     // guaranteed non-neg\n        double diffDiag = I00 - I11;                // guaranteed non-neg\n        double sqrtDet = sqrt(std::max(0.0, diffDiag*diffDiag +\n                                       4 * I01 * I01)); // guaranteed non-neg\n        double sig1 = 0.5 * (trI + sqrtDet); // higher singular value\n        double sig2 = 0.5 * (trI - sqrtDet); // lower singular value\n\n        // Avoid sig2 < 0 due to numerical error\n        if (fabs(sig2) < 1.0e-8)\n            sig2 = 0;\n\n        assert(sig1 >= 0);\n        assert(sig2 >= 0);\n\n        if (sig2 < 0) {\n            printf(\"Distortion will be NaN! sig1^2 is negative (%lg)\\n\",\n                   sig2);\n        }\n\n        // The singular values of the Jacobian are the sqrts of the\n        // eigenvalues of the first fundamental form.\n        sig1 = sqrt(sig1);\n        sig2 = sqrt(sig2);\n\n        // distortion\n        double tao = IsFlipped(f,WUV) ? -1 : 1;\n        double factor = tao / h;\n        double lam = fabs(factor * sig1 - 1) + fabs(factor * sig2 - 1);\n        return lam;\n    }\n    else {\n        return 10; // something \"large\"\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////\n// Approximate the distortion laplacian using a uniform laplacian on\n//  the dual mesh:\n//      ___________\n//      \\-1 / \\-1 /\n//       \\ / 3 \\ /\n//        \\-----/\n//         \\-1 /\n//          \\ /\n//\n//  @param[in]  f   facet on which to compute distortion laplacian\n//  @param[in]  h   scaling factor applied to cross field\n//  @return     distortion laplacian for f\n///////////////////////////////////////////////////////////////////////////\ntemplate <typename DerivedV, typename DerivedF, typename DerivedU>\nIGL_INLINE double igl::copyleft::comiso::MIQ_class<DerivedV, DerivedF, DerivedU>::LaplaceDistortion(const int f, double h, const Eigen::MatrixXd& WUV)\n{\n    double mydist = Distortion(f, h, WUV);\n    double lapl=0;\n    for (int i=0;i<3;i++)\n    {\n        if (TT(f,i) != -1)\n            lapl += (mydist - Distortion(TT(f,i), h, WUV));\n    }\n    return lapl;\n}\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedU>\nIGL_INLINE bool igl::copyleft::comiso::MIQ_class<DerivedV, DerivedF, DerivedU>::updateStiffeningJacobianDistorsion(double grad_size, const Eigen::MatrixXd& WUV)\n{\n    bool flipped = NumFlips(WUV)>0;\n\n    if (!flipped)\n        return false;\n\n    double maxL=0;\n    double maxD=0;\n\n    if (flipped)\n    {\n        const double c = 1.0;\n        const double d = 5.0;\n\n        for (unsigned int i = 0; i < F.rows(); ++i)\n        {\n            double dist=Distortion(i,grad_size,WUV);\n            if (dist > maxD)\n                maxD=dist;\n\n            double absLap=fabs(LaplaceDistortion(i, grad_size,WUV));\n            if (absLap > maxL)\n                maxL = absLap;\n\n            double stiffDelta = std::min(c * absLap, d);\n\n            Handle_Stiffness[i]+=stiffDelta;\n        }\n    }\n    printf(\"Maximum Distorsion %4.4f \\n\",maxD);\n    printf(\"Maximum Laplacian %4.4f \\n\",maxL);\n    return flipped;\n}\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedU>\nIGL_INLINE bool igl::copyleft::comiso::MIQ_class<DerivedV, DerivedF, DerivedU>::IsFlipped(const Eigen::Vector2d &uv0,\n                                                                        const Eigen::Vector2d &uv1,\n                                                                        const Eigen::Vector2d &uv2)\n{\n    Eigen::Vector2d e0 = (uv1-uv0);\n    Eigen::Vector2d e1 = (uv2-uv0);\n\n    double Area = e0(0)*e1(1) - e0(1)*e1(0);\n    return (Area<=0);\n}\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedU>\nIGL_INLINE bool igl::copyleft::comiso::MIQ_class<DerivedV, DerivedF, DerivedU>::IsFlipped(const int i, const Eigen::MatrixXd& WUV)\n{\n    Eigen::Vector2d uv0,uv1,uv2;\n    uv0 << WUV(i,0), WUV(i,1);\n    uv1 << WUV(i,2), WUV(i,3);\n    uv2 << WUV(i,4), WUV(i,5);\n\n    return (IsFlipped(uv0,uv1,uv2));\n}\n\n\n\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedU>\nIGL_INLINE void igl::copyleft::comiso::miq(const Eigen::PlainObjectBase<DerivedV> &V,\n                         const Eigen::PlainObjectBase<DerivedF> &F,\n                         const Eigen::PlainObjectBase<DerivedV> &PD1_combed,\n                         const Eigen::PlainObjectBase<DerivedV> &PD2_combed,\n                         //  const Eigen::PlainObjectBase<DerivedV> &BIS1_combed,\n                         //  const Eigen::PlainObjectBase<DerivedV> &BIS2_combed,\n                         const Eigen::Matrix<int, Eigen::Dynamic, 3> &Handle_MMatch,\n                         const Eigen::Matrix<int, Eigen::Dynamic, 1> &Handle_Singular,\n                         //  const Eigen::Matrix<int, Eigen::Dynamic, 1> &Handle_SingularDegree,\n                         const Eigen::Matrix<int, Eigen::Dynamic, 3> &Handle_Seams,\n                         Eigen::PlainObjectBase<DerivedU> &UV,\n                         Eigen::PlainObjectBase<DerivedF> &FUV,\n                         double GradientSize,\n                         double Stiffness,\n                         bool DirectRound,\n                         int iter,\n                         int localIter,\n                         bool DoRound,\n                         bool SingularityRound,\n                         std::vector<int> roundVertices,\n                         std::vector<std::vector<int> > hardFeatures,\n                         double miqAnisotropy)\n{\n    GradientSize = GradientSize/(V.colwise().maxCoeff()-V.colwise().minCoeff()).norm();\n\n    igl::copyleft::comiso::MIQ_class<DerivedV, DerivedF, DerivedU> miq(V,\n                                                     F,\n                                                     PD1_combed,\n                                                     PD2_combed,\n                                                     //  BIS1_combed,\n                                                     //  BIS2_combed,\n                                                     Handle_MMatch,\n                                                     Handle_Singular,\n                                                     //  Handle_SingularDegree,\n                                                     Handle_Seams,\n                                                     UV,\n                                                     FUV,\n                                                     GradientSize,\n                                                     Stiffness,\n                                                     DirectRound,\n                                                     iter,\n                                                     localIter,\n                                                     DoRound,\n                                                     SingularityRound,\n                                                     roundVertices,\n                                                     hardFeatures,\n                                                     miqAnisotropy);\n\n    miq.extractUV(UV,FUV);\n}\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedU>\nIGL_INLINE void igl::copyleft::comiso::miq(const Eigen::PlainObjectBase<DerivedV> &V,\n                         const Eigen::PlainObjectBase<DerivedF> &F,\n                         const Eigen::PlainObjectBase<DerivedV> &PD1,\n                         const Eigen::PlainObjectBase<DerivedV> &PD2,\n                         Eigen::PlainObjectBase<DerivedU> &UV,\n                         Eigen::PlainObjectBase<DerivedF> &FUV,\n                         double GradientSize,\n                         double Stiffness,\n                         bool DirectRound,\n                         int iter,\n                         int localIter,\n                         bool DoRound,\n                         bool SingularityRound,\n                         std::vector<int> roundVertices,\n                         std::vector<std::vector<int> > hardFeatures,\n                         double miqAnisotropy)\n{\n    // Eigen::MatrixXd PD2i = PD2;\n    // if (PD2i.size() == 0)\n    // {\n    // Eigen::MatrixXd B1, B2, B3;\n    // igl::local_basis(V,F,B1,B2,B3);\n    // PD2i = igl::rotate_vectors(V,Eigen::VectorXd::Constant(1,M_PI/2),B1,B2);\n    // }\n\n    Eigen::PlainObjectBase<DerivedV> BIS1, BIS2;\n    igl::compute_frame_field_bisectors(V, F, PD1, PD2, BIS1, BIS2);\n\n    Eigen::PlainObjectBase<DerivedV> BIS1_combed, BIS2_combed;\n    igl::comb_cross_field(V, F, BIS1, BIS2, BIS1_combed, BIS2_combed);\n\n    Eigen::PlainObjectBase<DerivedF> Handle_MMatch;\n    igl::cross_field_missmatch(V, F, BIS1_combed, BIS2_combed, true, Handle_MMatch);\n\n    Eigen::Matrix<int, Eigen::Dynamic, 1> isSingularity, singularityIndex;\n    igl::find_cross_field_singularities(V, F, Handle_MMatch, isSingularity, singularityIndex);\n\n    Eigen::Matrix<int, Eigen::Dynamic, 3> Handle_Seams;\n    igl::cut_mesh_from_singularities(V, F, Handle_MMatch, Handle_Seams);\n\n    Eigen::PlainObjectBase<DerivedV> PD1_combed, PD2_combed;\n    igl::comb_frame_field(V, F, PD1, PD2, BIS1_combed, BIS2_combed, PD1_combed, PD2_combed);\n\n    igl::copyleft::comiso::miq(V,\n             F,\n             PD1_combed,\n             PD2_combed,\n             //  BIS1_combed,\n             //  BIS2_combed,\n             Handle_MMatch,\n             isSingularity,\n             //  singularityIndex,\n             Handle_Seams,\n             UV,\n             FUV,\n             GradientSize,\n             Stiffness,\n             DirectRound,\n             iter,\n             localIter,\n             DoRound,\n             SingularityRound,\n             roundVertices,\n             hardFeatures,\n             miqAnisotropy);\n\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template specialization\n// template void igl::miq<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 2, 0, -1, 2> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, double, double, bool, int, int, bool, std::__1::vector<int, std::__1::allocator<int> >, std::__1::vector<std::__1::vector<int, std::__1::allocator<int> >, std::__1::allocator<std::__1::vector<int, std::__1::allocator<int> > > >);\n// template void igl::miq<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 2, 0, -1, 2> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::Matrix<int, -1, 3, 0, -1, 3> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, double, double, bool, int, int, bool, std::__1::vector<int, std::__1::allocator<int> >, std::__1::vector<std::__1::vector<int, std::__1::allocator<int> >, std::__1::allocator<std::__1::vector<int, std::__1::allocator<int> > > >);\n//template void igl::miq<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 2, 0, -1, 2> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::Matrix<int, -1, 3, 0, -1, 3> const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, Eigen::Matrix<int, -1, 3, 0, -1, 3> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, double, double, bool, int, int, bool, std::__1::vector<int, std::__1::allocator<int> >, std::__1::vector<std::__1::vector<int, std::__1::allocator<int> >, std::__1::allocator<std::__1::vector<int, std::__1::allocator<int> > > >);\ntemplate void igl::copyleft::comiso::miq<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, double, double, bool, int, int, bool, bool, std::__1::vector<int, std::__1::allocator<int> >, std::__1::vector<std::__1::vector<int, std::__1::allocator<int> >, std::__1::allocator<std::__1::vector<int, std::__1::allocator<int> > > >);\ntemplate void igl::copyleft::comiso::miq<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, 3, 0, -1, 3> const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, Eigen::Matrix<int, -1, 3, 0, -1, 3> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, double, double, bool, int, int, bool, bool, std::__1::vector<int, std::__1::allocator<int> >, std::__1::vector<std::__1::vector<int, std::__1::allocator<int> >, std::__1::allocator<std::__1::vector<int, std::__1::allocator<int> > > >);\ntemplate void igl::copyleft::comiso::miq<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, double, double, bool, int, int, bool, bool, std::__1::vector<int, std::__1::allocator<int> >, std::__1::vector<std::__1::vector<int, std::__1::allocator<int> >, std::__1::allocator<std::__1::vector<int, std::__1::allocator<int> > > >);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/comiso/miq.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>, Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_MIQ_H\n#define IGL_MIQ_H\n#include <igl/igl_inline.h>\n#include <Eigen/Core>\n#include <vector>\n\nnamespace igl\n{\n    namespace copyleft\n    {\n        namespace comiso\n        {\n  // Global seamless parametrization aligned with a given per-face jacobian (PD1,PD2).\n  // The algorithm is based on\n  // \"Mixed-Integer Quadrangulation\" by D. Bommes, H. Zimmer, L. Kobbelt\n  // ACM SIGGRAPH 2009, Article No. 77 (http://dl.acm.org/citation.cfm?id=1531383)\n  // We thank Nico Pietroni for providing a reference implementation of MIQ\n  // on which our code is based.\n\n  // Inputs:\n  //   V              #V by 3 list of mesh vertex 3D positions\n  //   F              #F by 3 list of faces indices in V\n  //   PD1            #V by 3 first line of the Jacobian per triangle\n  //   PD2            #V by 3 second line of the Jacobian per triangle\n  //                  (optional, if empty it will be a vector in the tangent plane orthogonal to PD1)\n  //   scale          global scaling for the gradient (controls the quads resolution)\n  //   stiffness      weight for the stiffness iterations\n  //   direct_round   greedily round all integer variables at once (greatly improves optimization speed but lowers quality)\n  //   iter           stiffness iterations (0 = no stiffness)\n  //   local_iter     number of local iterations for the integer rounding\n  //   do_round       enables the integer rounding (disabling it could be useful for debugging)\n  //   round_vertices id of additional vertices that should be snapped to integer coordinates\n  //   hard_features  #H by 2 list of pairs of vertices that belongs to edges that should be snapped to integer coordinates\n  //\n  // Output:\n  //   UV             #UV by 2 list of vertices in 2D\n  //   FUV            #FUV by 3 list of face indices in UV\n  //\n  // TODO: rename the parameters name in the cpp consistenly\n  //       improve the handling of hard_features, right now it might fail in difficult cases\n\n  template <typename DerivedV, typename DerivedF, typename DerivedU>\n  IGL_INLINE void miq(const Eigen::PlainObjectBase<DerivedV> &V,\n                                              const Eigen::PlainObjectBase<DerivedF> &F,\n                                              const Eigen::PlainObjectBase<DerivedV> &PD1,\n                                              const Eigen::PlainObjectBase<DerivedV> &PD2,\n                                              Eigen::PlainObjectBase<DerivedU> &UV,\n                                              Eigen::PlainObjectBase<DerivedF> &FUV,\n                                              double scale = 30.0,\n                                              double stiffness = 5.0,\n                                              bool direct_round = false,\n                                              int iter = 5,\n                                              int local_iter = 5,\n                                              bool DoRound = true,bool SingularityRound=true,\n                                              std::vector<int> round_vertices = std::vector<int>(),\n                                              std::vector<std::vector<int> > hard_features = std::vector<std::vector<int> >(),\n                                              double miqAnisotropy=1);\n\n  // Helper function that allows to directly provided pre-combed bisectors for an already cut mesh\n  // Additional input:\n  // PD1_combed, PD2_combed  :   #F by 3 combed jacobian\n  // BIS1_combed, BIS2_combed:   #F by 3 pre combed bi-sectors\n  // MMatch:                     #F by 3 list of per-corner integer PI/2 rotations\n  // Singular:                   #V list of flag that denotes if a vertex is singular or not\n  // SingularDegree:             #V list of flag that denotes the degree of the singularity\n  // Seams:                      #F by 3 list of per-corner flag that denotes seams\n\n  template <typename DerivedV, typename DerivedF, typename DerivedU>\n  IGL_INLINE void miq(const Eigen::PlainObjectBase<DerivedV> &V,\n                                              const Eigen::PlainObjectBase<DerivedF> &F,\n                                              const Eigen::PlainObjectBase<DerivedV> &PD1_combed,\n                                              const Eigen::PlainObjectBase<DerivedV> &PD2_combed,\n                                              // const Eigen::PlainObjectBase<DerivedV> &BIS1_combed,\n                                              // const Eigen::PlainObjectBase<DerivedV> &BIS2_combed,\n                                              const Eigen::Matrix<int, Eigen::Dynamic, 3> &MMatch,\n                                              const Eigen::Matrix<int, Eigen::Dynamic, 1> &Singular,\n                                              // const Eigen::Matrix<int, Eigen::Dynamic, 1> &SingularDegree,\n                                              const Eigen::Matrix<int, Eigen::Dynamic, 3> &Seams,\n                                              Eigen::PlainObjectBase<DerivedU> &UV,\n                                              Eigen::PlainObjectBase<DerivedF> &FUV,\n                                              double GradientSize = 30.0,\n                                              double Stiffness = 5.0,\n                                              bool DirectRound = false,\n                                              int iter = 5,\n                                              int localIter = 5, bool DoRound = true,bool SingularityRound=true,\n                                              std::vector<int> roundVertices = std::vector<int>(),\n                                              std::vector<std::vector<int> > hardFeatures = std::vector<std::vector<int> >(),\n                                              double miqAnisotropy=1);\n        };\n    };\n};\n#ifndef IGL_STATIC_LIBRARY\n#include \"miq.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/comiso/miqNew.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>, Olga Diamanti <olga.diam@gmail.com>, Kevin Walliman <wkevin@student.ethz.ch>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"miq.h\"\n#include \"../../local_basis.h\"\n#include \"../../triangle_triangle_adjacency.h\"\n#include \"../../cut_mesh.h\"\n#include \"../../LinSpaced.h\"\n\n// includes for VertexIndexing\n#include \"../../HalfEdgeIterator.h\"\n#include \"../../is_border_vertex.h\"\n#include \"../../vertex_triangle_adjacency.h\"\n\n// includes for PoissonSolver\n#include \"../../slice_into.h\"\n#include \"../../grad.h\"\n#include \"../../cotmatrix.h\"\n#include \"../../doublearea.h\"\n#include <gmm/gmm.h>\n#include <CoMISo/Solver/ConstrainedSolver.hh>\n#include <CoMISo/Solver/MISolver.hh>\n#include <CoMISo/Solver/GMM_Tools.hh>\n\n//\n#include \"../../cross_field_missmatch.h\"\n#include \"../../comb_frame_field.h\"\n#include \"../../comb_cross_field.h\"\n#include \"../../cut_mesh_from_singularities.h\"\n#include \"../../find_cross_field_singularities.h\"\n#include \"../../compute_frame_field_bisectors.h\"\n#include \"../../rotate_vectors.h\"\n\n#ifndef NDEBUG\n#include <fstream>\n#endif\n#include <iostream>\n#include \"../../matlab_format.h\"\n\n#define DEBUGPRINT 0\n\n\nnamespace igl {\nnamespace copyleft {\nnamespace comiso {\n  struct SeamInfo\n  {\n    int v0,v0p;\n    int integerVar;\n    unsigned char MMatch;\n\n    IGL_INLINE SeamInfo(int _v0,\n                        int _v0p,\n                        int _MMatch,\n                        int _integerVar);\n\n    IGL_INLINE SeamInfo(const SeamInfo &S1);\n  };\n\n  struct MeshSystemInfo\n  {\n    ////number of vertices variables\n    int num_vert_variables;\n    ///num of integer for cuts\n    int num_integer_cuts;\n    ///this are used for drawing purposes\n    std::vector<SeamInfo> EdgeSeamInfo;\n  };\n\n\n  template <typename DerivedV, typename DerivedF>\n  class VertexIndexing\n  {\n  public:\n    // Input:\n    const Eigen::PlainObjectBase<DerivedV> &V;\n    const Eigen::PlainObjectBase<DerivedF> &F;\n    const Eigen::PlainObjectBase<DerivedV> &Vcut;\n    const Eigen::PlainObjectBase<DerivedF> &Fcut;\n    const Eigen::PlainObjectBase<DerivedF> &TT;\n    const Eigen::PlainObjectBase<DerivedF> &TTi;\n\n    const Eigen::Matrix<int, Eigen::Dynamic, 3> &Handle_MMatch;\n    const Eigen::Matrix<int, Eigen::Dynamic, 1> &Handle_Singular; // bool\n    const Eigen::Matrix<int, Eigen::Dynamic, 3> &Handle_Seams; // 3 bool\n\n\n    ///this handle for mesh TODO: move with the other global variables\n    MeshSystemInfo Handle_SystemInfo;\n\n    IGL_INLINE VertexIndexing(const Eigen::PlainObjectBase<DerivedV> &_V,\n                              const Eigen::PlainObjectBase<DerivedF> &_F,\n                              const Eigen::PlainObjectBase<DerivedV> &_Vcut,\n                              const Eigen::PlainObjectBase<DerivedF> &_Fcut,\n                              const Eigen::PlainObjectBase<DerivedF> &_TT,\n                              const Eigen::PlainObjectBase<DerivedF> &_TTi,\n                              const Eigen::Matrix<int, Eigen::Dynamic, 3> &_Handle_MMatch,\n                              const Eigen::Matrix<int, Eigen::Dynamic, 1> &_Handle_Singular,\n                              const Eigen::Matrix<int, Eigen::Dynamic, 3> &_Handle_Seams\n                              );\n\n    // provide information about every vertex per seam\n    IGL_INLINE void InitSeamInfo();\n\n\n  private:\n    struct VertexInfo{\n      int v;  // vertex index (according to V)\n      int f0, k0; // face and local edge information of the edge that connects this vertex to the previous vertex (previous in the vector)\n      int f1, k1; // face and local edge information of the other face corresponding to the same edge\n      VertexInfo(int _v, int _f0, int _k0, int _f1, int _k1) :\n                 v(_v), f0(_f0), k0(_k0), f1(_f1), k1(_k1){}\n      bool operator==(VertexInfo const& other){\n        return other.v == v;\n      }\n    };\n\n    IGL_INLINE void GetSeamInfo(const int f0,\n                                const int f1,\n                                const int indexE,\n                                int &v0,int &v1,\n                                int &v0p,int &v1p,\n                                unsigned char &_MMatch);\n\n    IGL_INLINE std::vector<std::vector<VertexInfo> > GetVerticesPerSeam();\n  };\n\n\n  template <typename DerivedV, typename DerivedF>\n  class PoissonSolver\n  {\n\n  public:\n    IGL_INLINE void SolvePoisson(Eigen::VectorXd Stiffness,\n                                 double vector_field_scale=0.1f,\n                                 double grid_res=1.f,\n                                 bool direct_round=true,\n                                 int localIter=0,\n                                 bool _integer_rounding=true,\n                                 bool _singularity_rounding=true,\n                                 std::vector<int> roundVertices = std::vector<int>(),\n                                 std::vector<std::vector<int> > hardFeatures = std::vector<std::vector<int> >());\n\n    IGL_INLINE PoissonSolver(const Eigen::PlainObjectBase<DerivedV> &_V,\n                             const Eigen::PlainObjectBase<DerivedF> &_F,\n                             const Eigen::PlainObjectBase<DerivedV> &_Vcut,\n                             const Eigen::PlainObjectBase<DerivedF> &_Fcut,\n                             const Eigen::PlainObjectBase<DerivedF> &_TT,\n                             const Eigen::PlainObjectBase<DerivedF> &_TTi,\n                             const Eigen::PlainObjectBase<DerivedV> &_PD1,\n                             const Eigen::PlainObjectBase<DerivedV> &_PD2,\n                             const Eigen::Matrix<int, Eigen::Dynamic, 1>&_Handle_Singular,\n                             const MeshSystemInfo &_Handle_SystemInfo\n                             );\n\n    const Eigen::PlainObjectBase<DerivedV> &V;\n    const Eigen::PlainObjectBase<DerivedF> &F;\n    const Eigen::PlainObjectBase<DerivedV> &Vcut;\n    const Eigen::PlainObjectBase<DerivedF> &Fcut;\n    const Eigen::PlainObjectBase<DerivedF> &TT;\n    const Eigen::PlainObjectBase<DerivedF> &TTi;\n    const Eigen::PlainObjectBase<DerivedV> &PD1;\n    const Eigen::PlainObjectBase<DerivedV> &PD2;\n    const Eigen::Matrix<int, Eigen::Dynamic, 1> &Handle_Singular; // bool\n\n    const MeshSystemInfo &Handle_SystemInfo;\n\n    // Internal:\n    Eigen::VectorXd Handle_Stiffness;\n    std::vector<std::vector<int> > VF;\n    std::vector<std::vector<int> > VFi;\n    Eigen::MatrixXd UV; // this is probably useless\ndouble MiqAnisotropy;\n    // Output:\n    // per wedge UV coordinates, 6 coordinates (1 face) per row\n    Eigen::MatrixXd WUV;\n    // per vertex UV coordinates, Vcut.rows() x 2\n    Eigen::MatrixXd UV_out;\n\n    // Matrices\n    Eigen::SparseMatrix<double> Lhs;\n    Eigen::SparseMatrix<double> Constraints;\n    Eigen::VectorXd rhs;\n    Eigen::VectorXd constraints_rhs;\n    ///vector of unknowns\n    std::vector< double > X;\n\n    ////REAL PART\n    ///number of fixed vertex\n    unsigned int n_fixed_vars;\n\n    ///the number of REAL variables for vertices\n    unsigned int n_vert_vars;\n\n    ///total number of variables of the system,\n    ///do not consider constraints, but consider integer vars\n    unsigned int num_total_vars;\n\n    //////INTEGER PART\n    ///the total number of integer variables\n    unsigned int n_integer_vars;\n\n    ///CONSTRAINT PART\n    ///number of cuts constraints\n    unsigned int num_cut_constraint;\n\n    // number of user-defined constraints\n    unsigned int num_userdefined_constraint;\n\n    ///total number of constraints equations\n    unsigned int num_constraint_equations;\n\n    ///vector of blocked vertices\n    std::vector<int> Hard_constraints;\n\n    ///vector of indexes to round\n    std::vector<int> ids_to_round;\n\n    ///vector of indexes to round\n    std::vector<std::vector<int > > userdefined_constraints;\n\n    ///boolean that is true if rounding to integer is needed\n    bool integer_rounding;\n\n    ///START COMMON MATH FUNCTIONS\n    ///return the complex encoding the rotation\n    ///for a given missmatch interval\n    IGL_INLINE std::complex<double> GetRotationComplex(int interval);\n    ///END COMMON MATH FUNCTIONS\n\n    ///START FIXING VERTICES\n    ///set a given vertex as fixed\n    IGL_INLINE void AddFixedVertex(int v);\n\n    ///find vertex to fix in case we're using\n    ///a vector field NB: multiple components not handled\n    IGL_INLINE void FindFixedVertField();\n\n    ///find hard constraint depending if using or not\n    ///a vector field\n    IGL_INLINE void FindFixedVert();\n\n    IGL_INLINE int GetFirstVertexIndex(int v);\n\n    ///fix the vertices which are flagged as fixed\n    IGL_INLINE void FixBlockedVertex();\n    ///END FIXING VERTICES\n\n    ///HANDLING SINGULARITY\n    //set the singularity round to integer location\n    IGL_INLINE void AddSingularityRound();\n\n    IGL_INLINE void AddToRoundVertices(std::vector<int> ids);\n\n    ///START GENERIC SYSTEM FUNCTIONS\n    //build the laplacian matrix cyclyng over all rangemaps\n    //and over all faces\n    IGL_INLINE void BuildLaplacianMatrix(double vfscale=1);\n\n    ///find different sized of the system\n    IGL_INLINE void FindSizes();\n\n    IGL_INLINE void AllocateSystem();\n\n    ///intitialize the whole matrix\n    IGL_INLINE void InitMatrix();\n\n    ///map back coordinates after that\n    ///the system has been solved\n    IGL_INLINE void MapCoords();\n    ///END GENERIC SYSTEM FUNCTIONS\n\n    ///set the constraints for the inter-range cuts\n    IGL_INLINE void BuildSeamConstraintsExplicitTranslation();\n\n    ///set the constraints for the inter-range cuts\n    IGL_INLINE void BuildUserDefinedConstraints();\n\n    ///call of the mixed integer solver\n    IGL_INLINE void MixedIntegerSolve(double cone_grid_res=1,\n                                      bool direct_round=true,\n                                      int localIter=0);\n\n    IGL_INLINE void clearUserConstraint();\n\n    IGL_INLINE void addSharpEdgeConstraint(int fid, int vid);\n\n  };\n\n  template <typename DerivedV, typename DerivedF, typename DerivedU>\n  class MIQ_class\n  {\n  private:\n    const Eigen::PlainObjectBase<DerivedV> &V;\n    const Eigen::PlainObjectBase<DerivedF> &F;\n    DerivedV Vcut;\n    DerivedF Fcut;\n    Eigen::MatrixXd UV_out;\n    DerivedF FUV_out;\n\n    // internal\n    DerivedF TT;\n    DerivedF TTi;\n\n    // Stiffness per face\n    Eigen::VectorXd Handle_Stiffness;\n    DerivedV B1, B2, B3;\n\n  public:\n    IGL_INLINE MIQ_class(const Eigen::PlainObjectBase<DerivedV> &V_,\n                         const Eigen::PlainObjectBase<DerivedF> &F_,\n                         const Eigen::PlainObjectBase<DerivedV> &PD1_combed,\n                         const Eigen::PlainObjectBase<DerivedV> &PD2_combed,\n                         const Eigen::Matrix<int, Eigen::Dynamic, 3> &Handle_MMatch,\n                         const Eigen::Matrix<int, Eigen::Dynamic, 1> &Handle_Singular,\n                         const Eigen::Matrix<int, Eigen::Dynamic, 3> &Handle_Seams,\n                         Eigen::PlainObjectBase<DerivedU> &UV,\n                         Eigen::PlainObjectBase<DerivedF> &FUV,\n                         double GradientSize = 30.0,\n                         double Stiffness = 5.0,\n                         bool DirectRound = false,\n                         int iter = 5,\n                         int localIter = 5,\n                         bool DoRound = true,\n                         bool SingularityRound=true,\n                         std::vector<int> roundVertices = std::vector<int>(),\n                         std::vector<std::vector<int> > hardFeatures = std::vector<std::vector<int> >());\n\n\n    IGL_INLINE void extractUV(Eigen::PlainObjectBase<DerivedU> &UV_out,\n                              Eigen::PlainObjectBase<DerivedF> &FUV_out);\n\n  private:\n    IGL_INLINE int NumFlips(const Eigen::MatrixXd& WUV);\n\n    IGL_INLINE double Distortion(int f, double h, const Eigen::MatrixXd& WUV);\n\n    IGL_INLINE double LaplaceDistortion(const int f, double h, const Eigen::MatrixXd& WUV);\n\n    IGL_INLINE bool updateStiffeningJacobianDistorsion(double grad_size, const Eigen::MatrixXd& WUV);\n\n    IGL_INLINE bool IsFlipped(const Eigen::Vector2d &uv0,\n                              const Eigen::Vector2d &uv1,\n                              const Eigen::Vector2d &uv2);\n\n    IGL_INLINE bool IsFlipped(const int i, const Eigen::MatrixXd& WUV);\n\n  };\n};\n};\n}\n\nIGL_INLINE igl::copyleft::comiso::SeamInfo::SeamInfo(int _v0,\n                                   int _v0p,\n                                   int _MMatch,\n                                   int _integerVar)\n{\n  v0=_v0;\n  v0p=_v0p;\n  integerVar=_integerVar;\n  MMatch=_MMatch;\n}\n\nIGL_INLINE igl::copyleft::comiso::SeamInfo::SeamInfo(const SeamInfo &S1)\n{\n  v0=S1.v0;\n  v0p=S1.v0p;\n  integerVar=S1.integerVar;\n  MMatch=S1.MMatch;\n}\n\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE igl::copyleft::comiso::VertexIndexing<DerivedV, DerivedF>::VertexIndexing(const Eigen::PlainObjectBase<DerivedV> &_V,\n                                                                   const Eigen::PlainObjectBase<DerivedF> &_F,\n                                                                   const Eigen::PlainObjectBase<DerivedV> &_Vcut,\n                                                                   const Eigen::PlainObjectBase<DerivedF> &_Fcut,\n                                                                   const Eigen::PlainObjectBase<DerivedF> &_TT,\n                                                                   const Eigen::PlainObjectBase<DerivedF> &_TTi,\n                                                                   const Eigen::Matrix<int, Eigen::Dynamic, 3> &_Handle_MMatch,\n                                                                   const Eigen::Matrix<int, Eigen::Dynamic, 1> &_Handle_Singular,\n                                                                   const Eigen::Matrix<int, Eigen::Dynamic, 3> &_Handle_Seams\n                                                                   ):\nV(_V),\nF(_F),\nVcut(_Vcut),\nFcut(_Fcut),\nTT(_TT),\nTTi(_TTi),\nHandle_MMatch(_Handle_MMatch),\nHandle_Singular(_Handle_Singular),\nHandle_Seams(_Handle_Seams)\n{\n  #ifdef DEBUG_PRINT\n  cerr<<igl::matlab_format(Handle_Seams,\"Handle_Seams\");\n#endif\n\n  Handle_SystemInfo.num_vert_variables=Vcut.rows();\n  Handle_SystemInfo.num_integer_cuts=0;\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::VertexIndexing<DerivedV, DerivedF>::GetSeamInfo(const int f0,\n                                                                     const int f1,\n                                                                     const int indexE,\n                                                                     int &v0,int &v1,\n                                                                     int &v0p,int &v1p,\n                                                                     unsigned char &_MMatch)\n{\n  int edgef0 = indexE;\n  v0 = Fcut(f0,edgef0);\n  v1 = Fcut(f0,(edgef0+1)%3);\n  ////get the index on opposite side\n  assert(TT(f0,edgef0) == f1);\n  int edgef1 = TTi(f0,edgef0);\n  v1p = Fcut(f1,edgef1);\n  v0p = Fcut(f1,(edgef1+1)%3);\n\n  _MMatch = Handle_MMatch(f0,edgef0);\n  assert(F(f0,edgef0)         == F(f1,((edgef1+1)%3)));\n  assert(F(f0,((edgef0+1)%3)) == F(f1,edgef1));\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE std::vector<std::vector<typename igl::copyleft::comiso::VertexIndexing<DerivedV, DerivedF>::VertexInfo> > igl::copyleft::comiso::VertexIndexing<DerivedV, DerivedF>::GetVerticesPerSeam()\n{\n  // Return value\n  std::vector<std::vector<VertexInfo> >verticesPerSeam;\n\n  // for every vertex, keep track of their adjacent vertices on seams.\n  // regular vertices have two neighbors on a seam, start- and endvertices may have any other numbers of neighbors (e.g. 1 or 3)\n  std::vector<std::list<VertexInfo> > VVSeam(V.rows());\n  Eigen::MatrixXi F_hit = Eigen::MatrixXi::Zero(F.rows(), 3);\n  for (unsigned int f=0; f<F.rows();f++)\n  {\n    int f0 = f;\n    for(int k0=0; k0<3; k0++){\n      int f1 = TT(f0,k0);\n      if(f1 == -1)\n        continue;\n\n      bool seam = Handle_Seams(f0,k0);\n      if (seam && F_hit(f0,k0) == 0)\n      {\n        int v0 = F(f0, k0);\n        int v1 = F(f0, (k0+1)%3);\n        int k1 = TTi(f0,k0);\n        VVSeam[v0].push_back(VertexInfo(v1, f0, k0, f1, k1));\n        VVSeam[v1].push_back(VertexInfo(v0, f0, k0, f1, k1));\n        F_hit(f0, k0) = 1;\n        F_hit(f1, k1) = 1;\n      }\n    }\n  }\n\n  // Find start vertices, i.e. vertices that start or end a seam branch\n  std::vector<int> startVertexIndices;\n  std::vector<bool> isStartVertex(V.rows());\n  for (unsigned int i=0;i<V.rows();i++)\n  {\n    isStartVertex[i] = false;\n    // vertices with two neighbors are regular vertices, unless the vertex is a singularity, in which case it qualifies as a start vertex\n    if (VVSeam[i].size() > 0 && VVSeam[i].size() != 2 || Handle_Singular(i) == true)\n    {\n      startVertexIndices.push_back(i);\n      isStartVertex[i] = true;\n    }\n  }\n\n  // For each startVertex, walk along its seam\n  for (unsigned int i=0;i<startVertexIndices.size();i++)\n  {\n    auto startVertexNeighbors = &VVSeam[startVertexIndices[i]];\n    const int neighborSize = startVertexNeighbors->size();\n\n    // explore every seam to which this vertex is a start vertex\n    // note: a vertex can never be a start vertex and a regular vertex simultaneously\n    for (unsigned int j=0;j<neighborSize;j++)\n    {\n      std::vector<VertexInfo> thisSeam; // temporary container\n\n      // Create vertexInfo struct for start vertex\n      auto startVertex = VertexInfo(startVertexIndices[i], -1, -1, -1, -1);// -1 values are arbitrary (will never be used)\n      auto currentVertex = startVertex;\n      // Add start vertex to the seam\n      thisSeam.push_back(currentVertex);\n\n      // advance on the seam\n      auto currentVertexNeighbors = startVertexNeighbors;\n      auto nextVertex = currentVertexNeighbors->front();\n      currentVertexNeighbors->pop_front();\n\n      auto prevVertex = startVertex; // bogus initialization to get the type\n      while (true)\n      {\n        // move to the next vertex\n        prevVertex = currentVertex;\n        currentVertex = nextVertex;\n        currentVertexNeighbors = &VVSeam[nextVertex.v];\n\n        // add current vertex to this seam\n        thisSeam.push_back(currentVertex);\n\n        // remove the previous vertex\n        auto it = std::find(currentVertexNeighbors->begin(), currentVertexNeighbors->end(), prevVertex);\n        assert(it != currentVertexNeighbors->end());\n        currentVertexNeighbors->erase(it);\n\n        if (currentVertexNeighbors->size() == 1 && !isStartVertex[currentVertex.v])\n        {\n          nextVertex = currentVertexNeighbors->front();\n          currentVertexNeighbors->pop_front();\n        }\n        else\n          break;\n      }\n      verticesPerSeam.push_back(thisSeam);\n    }\n  }\n\n  return verticesPerSeam;\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::VertexIndexing<DerivedV, DerivedF>::InitSeamInfo()\n{\n  auto verticesPerSeam = GetVerticesPerSeam();\n  Handle_SystemInfo.EdgeSeamInfo.clear();\n  int integerVar = 0;\n  // Loop over each seam\n  for(auto seam : verticesPerSeam){\n    //choose initial side of the seam such that the start vertex corresponds to Fcut(f, k) and the end vertex corresponds to Fcut(f, (k+1)%3) and not vice versa.\n    int priorVertexIdx;\n    if(seam.size() > 2){\n      auto v1 = seam[1];\n      auto v2 = seam[2];\n      if(Fcut(v1.f0, (v1.k0+1) % 3) == Fcut(v2.f0, v2.k0) || Fcut(v1.f0, (v1.k0+1) % 3) == Fcut(v2.f1, v2.k1)){\n        priorVertexIdx = Fcut(v1.f0, v1.k0);\n      }\n      else{\n        priorVertexIdx = Fcut(v1.f1, v1.k1);\n        assert(Fcut(v1.f1, (v1.k1+1) % 3) == Fcut(v2.f0, v2.k0) || Fcut(v1.f1, (v1.k1+1) % 3) == Fcut(v2.f1, v2.k1));\n      }\n    }\n    else{\n      auto v1 = seam[1];\n      priorVertexIdx = Fcut(v1.f0, v1.k0);\n    }\n\n    // Loop over each vertex of the seam\n    for(auto it=seam.begin()+1; it != seam.end(); ++it){\n      auto vertex = *it;\n      // choose the correct side of the seam\n      int f,k,ff,kk;\n      if(priorVertexIdx == Fcut(vertex.f0, vertex.k0)){\n        f = vertex.f0; ff = vertex.f1;\n        k = vertex.k0; kk = vertex.k1;\n      }\n      else{\n        f = vertex.f1; ff = vertex.f0;\n        k = vertex.k1; kk = vertex.k0;\n        assert(priorVertexIdx == Fcut(vertex.f1, vertex.k1));\n      }\n\n      int vtx0,vtx0p,vtx1,vtx1p;\n      unsigned char MM;\n      GetSeamInfo(f,ff,k,vtx0,vtx1,vtx0p,vtx1p,MM);\n      Handle_SystemInfo.EdgeSeamInfo.push_back(SeamInfo(vtx0,vtx0p,MM,integerVar));\n      if(it == seam.end() -1){\n        Handle_SystemInfo.EdgeSeamInfo.push_back(SeamInfo(vtx1,vtx1p,MM,integerVar));\n      }\n      priorVertexIdx = vtx1;\n    }\n    // use the same integer for each seam\n    integerVar++;\n  }\n  Handle_SystemInfo.num_integer_cuts = integerVar;\n\n#ifndef NDEBUG\n  int totalNVerticesOnSeams = 0;\n  for(auto seam : verticesPerSeam){\n    totalNVerticesOnSeams += seam.size();\n  }\n  assert(Handle_SystemInfo.EdgeSeamInfo.size() == totalNVerticesOnSeams);\n#endif\n}\n\n\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::SolvePoisson(Eigen::VectorXd Stiffness,\n                                                                     double vector_field_scale,\n                                                                     double grid_res,\n                                                                     bool direct_round,\n                                                                     int localIter,\n                                                                     bool _integer_rounding,\n                                                                     bool _singularity_rounding,\n                                                                     std::vector<int> roundVertices,\n                                                                     std::vector<std::vector<int> > hardFeatures)\n{\n  Handle_Stiffness = Stiffness;\n\n  //initialization of flags and data structures\n  integer_rounding=_integer_rounding;\n\n  ids_to_round.clear();\n\n  clearUserConstraint();\n  // copy the user constraints number\n  for (size_t i = 0; i < hardFeatures.size(); ++i)\n  {\n    addSharpEdgeConstraint(hardFeatures[i][0],hardFeatures[i][1]);\n  }\n\n  ///Initializing Matrix\n\n  int t0=clock();\n\n  ///initialize the matrix ALLOCATING SPACE\n  InitMatrix();\n  if (DEBUGPRINT)\n    printf(\"\\n ALLOCATED THE MATRIX \\n\");\n\n  ///build the laplacian system\n  BuildLaplacianMatrix(vector_field_scale);\n\n  // add seam constraints\n  BuildSeamConstraintsExplicitTranslation();\n\n  // add user defined constraints\n  BuildUserDefinedConstraints();\n\n  ////add the lagrange multiplier\n  FixBlockedVertex();\n\n  if (DEBUGPRINT)\n    printf(\"\\n BUILT THE MATRIX \\n\");\n\n  if (integer_rounding)\n    AddToRoundVertices(roundVertices);\n\n  if (_singularity_rounding)\n    AddSingularityRound();\n\n  int t1=clock();\n  if (DEBUGPRINT) printf(\"\\n time:%d \\n\",t1-t0);\n  if (DEBUGPRINT) printf(\"\\n SOLVING \\n\");\n\n  MixedIntegerSolve(grid_res,direct_round,localIter);\n\n  int t2=clock();\n  if (DEBUGPRINT) printf(\"\\n time:%d \\n\",t2-t1);\n  if (DEBUGPRINT) printf(\"\\n ASSIGNING COORDS \\n\");\n\n  MapCoords();\n\n  int t3=clock();\n  if (DEBUGPRINT) printf(\"\\n time:%d \\n\",t3-t2);\n  if (DEBUGPRINT) printf(\"\\n FINISHED \\n\");\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>\n::PoissonSolver(const Eigen::PlainObjectBase<DerivedV> &_V,\n                const Eigen::PlainObjectBase<DerivedF> &_F,\n                const Eigen::PlainObjectBase<DerivedV> &_Vcut,\n                const Eigen::PlainObjectBase<DerivedF> &_Fcut,\n                const Eigen::PlainObjectBase<DerivedF> &_TT,\n                const Eigen::PlainObjectBase<DerivedF> &_TTi,\n                const Eigen::PlainObjectBase<DerivedV> &_PD1,\n                const Eigen::PlainObjectBase<DerivedV> &_PD2,\n                const Eigen::Matrix<int, Eigen::Dynamic, 1>&_Handle_Singular,\n                const MeshSystemInfo &_Handle_SystemInfo\n):\nV(_V),\nF(_F),\nVcut(_Vcut),\nFcut(_Fcut),\nTT(_TT),\nTTi(_TTi),\nPD1(_PD1),\nPD2(_PD2),\nHandle_Singular(_Handle_Singular),\nHandle_SystemInfo(_Handle_SystemInfo)\n{\n  UV        = Eigen::MatrixXd(V.rows(),2);\n  WUV       = Eigen::MatrixXd(F.rows(),6);\n  UV_out    = Eigen::MatrixXd(Vcut.rows(),2);\n  igl::vertex_triangle_adjacency(V,F,VF,VFi);\n}\n\n///START COMMON MATH FUNCTIONS\n///return the complex encoding the rotation\n///for a given missmatch interval\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE std::complex<double> igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::GetRotationComplex(int interval)\n{\n  assert((interval>=0)&&(interval<4));\n\n  switch(interval)\n  {\n    case 0:return std::complex<double>(1,0);\n    case 1:return std::complex<double>(0,1);\n    case 2:return std::complex<double>(-1,0);\n    default:return std::complex<double>(0,-1);\n  }\n}\n\n///END COMMON MATH FUNCTIONS\n\n///START FIXING VERTICES\n///set a given vertex as fixed\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::AddFixedVertex(int v)\n{\n  n_fixed_vars++;\n  Hard_constraints.push_back(v);\n}\n\n///find vertex to fix in case we're using\n///a vector field NB: multiple components not handled\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::FindFixedVertField()\n{\n  Hard_constraints.clear();\n\n  n_fixed_vars=0;\n  //fix the first singularity\n  for (unsigned int v=0;v<V.rows();v++)\n  {\n    if (Handle_Singular(v))\n    {\n      AddFixedVertex(v);\n      UV.row(v) << 0,0;\n      return;\n    }\n  }\n\n  ///if anything fixed fix the first\n  AddFixedVertex(0);\n  UV.row(0) << 0,0;\n  std::cerr << \"No vertices to fix, I am fixing the first vertex to the origin!\" << std::endl;\n}\n\n///find hard constraint depending if using or not\n///a vector field\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::FindFixedVert()\n{\n  Hard_constraints.clear();\n  FindFixedVertField();\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE int igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::GetFirstVertexIndex(int v)\n{\n  return Fcut(VF[v][0],VFi[v][0]);\n}\n\n///fix the vertices which are flagged as fixed\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::FixBlockedVertex()\n{\n  int offset_row = num_cut_constraint*2;\n\n  unsigned int constr_num = 0;\n  for (unsigned int i=0;i<Hard_constraints.size();i++)\n  {\n    int v = Hard_constraints[i];\n\n    ///get first index of the vertex that must blocked\n    //int index=v->vertex_index[0];\n    int index = GetFirstVertexIndex(v);\n\n    ///multiply times 2 because of uv\n    int indexvert = index*2;\n\n    ///find the first free row to add the constraint\n    int indexRow = (offset_row+constr_num*2);\n    int indexCol = indexRow;\n\n    ///add fixing constraint LHS\n    Constraints.coeffRef(indexRow,  indexvert)   += 1;\n    Constraints.coeffRef(indexRow+1,indexvert+1) += 1;\n\n    ///add fixing constraint RHS\n    constraints_rhs[indexCol]   = UV(v,0);\n    constraints_rhs[indexCol+1] = UV(v,1);\n\n    constr_num++;\n  }\n  assert(constr_num==n_fixed_vars);\n}\n///END FIXING VERTICES\n\n///HANDLING SINGULARITY\n//set the singularity round to integer location\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::AddSingularityRound()\n{\n  for (unsigned int v=0;v<V.rows();v++)\n  {\n    if (Handle_Singular(v))\n    {\n      int index0=GetFirstVertexIndex(v);\n      ids_to_round.push_back( index0*2   );\n      ids_to_round.push_back((index0*2)+1);\n    }\n  }\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::AddToRoundVertices(std::vector<int> ids)\n{\n  for (size_t i = 0; i < ids.size(); ++i)\n  {\n    if (ids[i] < 0 || ids[i] >= V.rows())\n      std::cerr << \"WARNING: Ignored round vertex constraint, vertex \" << ids[i] << \" does not exist in the mesh.\" << std::endl;\n    int index0 = GetFirstVertexIndex(ids[i]);\n    ids_to_round.push_back( index0*2   );\n    ids_to_round.push_back((index0*2)+1);\n  }\n}\n\n///START GENERIC SYSTEM FUNCTIONS\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::BuildLaplacianMatrix(double vfscale)\n{\n  Eigen::VectorXi idx  = igl::LinSpaced<Eigen::VectorXi >(Vcut.rows(), 0, 2*Vcut.rows()-2);\n  Eigen::VectorXi idx2 = igl::LinSpaced<Eigen::VectorXi >(Vcut.rows(), 1, 2*Vcut.rows()-1);\n\n  // get gradient matrix\n  Eigen::SparseMatrix<double> G(Fcut.rows() * 3, Vcut.rows());\n  igl::grad(Vcut, Fcut, G);\n\n  // get triangle weights\n  Eigen::VectorXd dblA(Fcut.rows());\n  igl::doublearea(Vcut, Fcut, dblA);\n\n  // compute intermediate result\n  Eigen::SparseMatrix<double> G2;\n  G2 = G.transpose() * dblA.replicate<3,1>().asDiagonal() * Handle_Stiffness.replicate<3,1>().asDiagonal();\n\n  ///  Compute LHS\n  Eigen::SparseMatrix<double> Cotmatrix;\n  Cotmatrix = 0.5 * G2 * G;\n  igl::slice_into(Cotmatrix, idx,  idx,  Lhs);\n  igl::slice_into(Cotmatrix, idx2, idx2, Lhs);\n\n  /// Compute RHS\n  // reshape nrosy vectors\n  const Eigen::MatrixXd u = Eigen::Map<const Eigen::MatrixXd>(PD1.data(),Fcut.rows()*3,1); // this mimics a reshape at the cost of a copy.\n  const Eigen::MatrixXd v = Eigen::Map<const Eigen::MatrixXd>(PD2.data(),Fcut.rows()*3,1); // this mimics a reshape at the cost of a copy.\n\n  // multiply with weights\n  Eigen::VectorXd rhs1 =  G2 * u * 0.5 * vfscale;\n  Eigen::VectorXd rhs2 = -G2 * v * 0.5 * vfscale;\n  igl::slice_into(rhs1, idx,  1, rhs);\n  igl::slice_into(rhs2, idx2, 1, rhs);\n}\n\n///find different sized of the system\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::FindSizes()\n{\n  ///find the vertex that need to be fixed\n  FindFixedVert();\n\n  ///REAL PART\n  n_vert_vars = Handle_SystemInfo.num_vert_variables;\n\n  ///INTEGER PART\n  ///the total number of integer variables\n  n_integer_vars = Handle_SystemInfo.num_integer_cuts;\n\n  ///CONSTRAINT PART\n  num_cut_constraint = Handle_SystemInfo.EdgeSeamInfo.size();\n\n  num_constraint_equations = num_cut_constraint * 2 + n_fixed_vars * 2 + num_userdefined_constraint;\n\n  ///total variable of the system\n  num_total_vars = (n_vert_vars+n_integer_vars) * 2;\n\n  ///initialize matrix size\n\n  if (DEBUGPRINT)     printf(\"\\n*** SYSTEM VARIABLES *** \\n\");\n  if (DEBUGPRINT)     printf(\"* NUM REAL VERTEX VARIABLES %d \\n\",n_vert_vars);\n\n  if (DEBUGPRINT)     printf(\"\\n*** INTEGER VARIABLES *** \\n\");\n  if (DEBUGPRINT)     printf(\"* NUM INTEGER VARIABLES %d \\n\",(int)n_integer_vars);\n\n  if (DEBUGPRINT)     printf(\"\\n*** CONSTRAINTS *** \\n \");\n  if (DEBUGPRINT)     printf(\"* NUM FIXED CONSTRAINTS %d\\n\",n_fixed_vars);\n  if (DEBUGPRINT)     printf(\"* NUM CUTS CONSTRAINTS %d\\n\",num_cut_constraint);\n  if (DEBUGPRINT)     printf(\"* NUM USER DEFINED CONSTRAINTS %d\\n\",num_userdefined_constraint);\n\n  if (DEBUGPRINT)     printf(\"\\n*** TOTAL SIZE *** \\n\");\n  if (DEBUGPRINT)     printf(\"* TOTAL VARIABLE SIZE (WITH INTEGER TRASL) %d \\n\",num_total_vars);\n  if (DEBUGPRINT)     printf(\"* TOTAL CONSTRAINTS %d \\n\",num_constraint_equations);\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::AllocateSystem()\n{\n  Lhs.resize(n_vert_vars * 2, n_vert_vars * 2);\n  Constraints.resize(num_constraint_equations, num_total_vars);\n  rhs.resize(n_vert_vars * 2);\n  constraints_rhs.resize(num_constraint_equations);\n\n  printf(\"\\n INITIALIZED SPARSE MATRIX OF %d x %d \\n\",n_vert_vars*2, n_vert_vars*2);\n  printf(\"\\n INITIALIZED SPARSE MATRIX OF %d x %d \\n\",num_constraint_equations, num_total_vars);\n  printf(\"\\n INITIALIZED VECTOR OF %d x 1 \\n\",n_vert_vars*2);\n  printf(\"\\n INITIALIZED VECTOR OF %d x 1 \\n\",num_constraint_equations);\n}\n\n///intitialize the whole matrix\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::InitMatrix()\n{\n  FindSizes();\n  AllocateSystem();\n}\n\n///map back coordinates after that\n///the system has been solved\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::MapCoords()\n{\n  ///map coords to faces\n  for (unsigned int f=0;f<Fcut.rows();f++)\n  {\n\n    for (int k=0;k<3;k++)\n    {\n      //get the index of the variable in the system\n      int indexUV = Fcut(f,k);\n      ///then get U and V coords\n      double U=X[indexUV*2];\n      double V=X[indexUV*2+1];\n\n      WUV(f,k*2 + 0) = U;\n      WUV(f,k*2 + 1) = V;\n    }\n\n  }\n\n  for(int i = 0; i < Vcut.rows(); i++){\n    UV_out(i,0) = X[i*2];\n    UV_out(i,1) = X[i*2+1];\n  }\n}\n\n///END GENERIC SYSTEM FUNCTIONS\n\n///set the constraints for the inter-range cuts\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::BuildSeamConstraintsExplicitTranslation()\n{\n  ///current constraint row\n  int constr_row = 0;\n\n  for (unsigned int i=0; i<num_cut_constraint; i++)\n  {\n    unsigned char interval = Handle_SystemInfo.EdgeSeamInfo[i].MMatch;\n    if (interval==1)\n      interval=3;\n    else\n      if(interval==3)\n        interval=1;\n\n    int p0  = Handle_SystemInfo.EdgeSeamInfo[i].v0;\n    int p0p = Handle_SystemInfo.EdgeSeamInfo[i].v0p;\n\n    std::complex<double> rot = GetRotationComplex(interval);\n\n    ///get the integer variable\n    int integerVar = n_vert_vars + Handle_SystemInfo.EdgeSeamInfo[i].integerVar;\n\n    if (integer_rounding)\n    {\n      ids_to_round.push_back(integerVar*2);\n      ids_to_round.push_back(integerVar*2+1);\n    }\n\n    // cross boundary compatibility conditions\n    Constraints.coeffRef(constr_row,   2*p0)   +=  rot.real();\n    Constraints.coeffRef(constr_row,   2*p0+1) += -rot.imag();\n    Constraints.coeffRef(constr_row+1, 2*p0)   +=  rot.imag();\n    Constraints.coeffRef(constr_row+1, 2*p0+1) +=  rot.real();\n\n    Constraints.coeffRef(constr_row,   2*p0p)   += -1;\n    Constraints.coeffRef(constr_row+1, 2*p0p+1) += -1;\n\n    Constraints.coeffRef(constr_row,   2*integerVar)   += 1;\n    Constraints.coeffRef(constr_row+1, 2*integerVar+1) += 1;\n\n    constraints_rhs[constr_row]   = 0;\n    constraints_rhs[constr_row+1] = 0;\n\n    constr_row += 2;\n  }\n\n}\n\n///set the constraints for the inter-range cuts\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::BuildUserDefinedConstraints()\n{\n  /// the user defined constraints are at the end\n  int offset_row = num_cut_constraint*2 + n_fixed_vars*2;\n\n  ///current constraint row\n  int constr_row = offset_row;\n\n  assert(num_userdefined_constraint == userdefined_constraints.size());\n\n  for (unsigned int i=0; i<num_userdefined_constraint; i++)\n  {\n    for (unsigned int j=0; j<userdefined_constraints[i].size()-1; ++j)\n    {\n      Constraints.coeffRef(constr_row, j) = userdefined_constraints[i][j];\n    }\n\n    constraints_rhs[constr_row] = userdefined_constraints[i][userdefined_constraints[i].size()-1];\n    constr_row +=1;\n  }\n}\n\n///call of the mixed integer solver\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::MixedIntegerSolve(double cone_grid_res,\n                                                                          bool direct_round,\n                                                                          int localIter)\n{\n  X = std::vector<double>((n_vert_vars+n_integer_vars)*2);\n  if (DEBUGPRINT)\n    printf(\"\\n ALLOCATED X \\n\");\n\n  ///variables part\n  int ScalarSize = n_vert_vars*2;\n  int SizeMatrix = (n_vert_vars+n_integer_vars)*2;\n\n  ///matrix A\n  gmm::col_matrix< gmm::wsvector< double > > A(SizeMatrix,SizeMatrix); // lhs matrix variables\n\n  ///constraints part\n  int CsizeX = num_constraint_equations;\n  int CsizeY = SizeMatrix+1;\n  gmm::row_matrix< gmm::wsvector< double > > C(CsizeX,CsizeY); // constraints\n\n  if (DEBUGPRINT)\n    printf(\"\\n ALLOCATED QMM STRUCTURES \\n\");\n\n  std::vector<double> B(SizeMatrix,0);  // rhs\n\n  if (DEBUGPRINT)\n    printf(\"\\n ALLOCATED RHS STRUCTURES \\n\");\n\n  //// copy LHS\n  for (int k=0; k < Lhs.outerSize(); ++k){\n    for (Eigen::SparseMatrix<double>::InnerIterator it(Lhs,k); it; ++it){\n      int row = it.row();\n      int col = it.col();\n      A(row, col) += it.value();\n    }\n  }\n  //// copy Constraints\n  for (int k=0; k < Constraints.outerSize(); ++k){\n    for (Eigen::SparseMatrix<double>::InnerIterator it(Constraints,k); it; ++it){\n      int row = it.row();\n      int col = it.col();\n      C(row, col) += it.value();\n    }\n  }\n\n  if (DEBUGPRINT)\n    printf(\"\\n SET %d INTEGER VALUES \\n\",n_integer_vars);\n\n  ///add penalization term for integer variables\n  double penalization = 0.000001;\n  int offline_index   = ScalarSize;\n  for(unsigned int i = 0; i < (n_integer_vars)*2; ++i)\n  {\n    int index=offline_index+i;\n    A(index,index)=penalization;\n  }\n\n  if (DEBUGPRINT)\n    printf(\"\\n SET RHS \\n\");\n\n  // copy RHS\n  for(int i = 0; i < (int)ScalarSize; ++i)\n  {\n    B[i] = rhs[i] * cone_grid_res;\n  }\n\n  // copy constraint RHS\n  if (DEBUGPRINT)\n    printf(\"\\n SET %d CONSTRAINTS \\n\",num_constraint_equations);\n\n  for(unsigned int i = 0; i < num_constraint_equations; ++i)\n  {\n    C(i, SizeMatrix) = -constraints_rhs[i] * cone_grid_res;\n  }\n\n  COMISO::ConstrainedSolver solver;\n\n  solver.misolver().set_local_iters(localIter);\n\n  solver.misolver().set_direct_rounding(direct_round);\n\n  std::sort(ids_to_round.begin(),ids_to_round.end());\n  std::vector<int>::iterator new_end=std::unique(ids_to_round.begin(),ids_to_round.end());\n  int dist=distance(ids_to_round.begin(),new_end);\n  ids_to_round.resize(dist);\n\n  solver.solve( C, A, X, B, ids_to_round, 0.0, false, false);\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::clearUserConstraint()\n{\n  num_userdefined_constraint = 0;\n  userdefined_constraints.clear();\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::copyleft::comiso::PoissonSolver<DerivedV, DerivedF>::addSharpEdgeConstraint(int fid, int vid)\n{\n  // prepare constraint\n  std::vector<int> c(Handle_SystemInfo.num_vert_variables*2 + 1);\n\n  for (size_t i = 0; i < c.size(); ++i)\n  {\n    c[i] = 0;\n  }\n\n  int v1 = Fcut(fid,vid);\n  int v2 = Fcut(fid,(vid+1)%3);\n\n  Eigen::Matrix<typename DerivedV::Scalar, 3, 1> e = Vcut.row(v2) - Vcut.row(v1);\n  e = e.normalized();\n\n  double d1 = fabs(e.dot(PD1.row(fid).normalized()));\n  double d2 = fabs(e.dot(PD2.row(fid).normalized()));\n\n  int offset = 0;\n\n  if (d1>d2)\n    offset = 1;\n\n  ids_to_round.push_back((v1 * 2) + offset);\n  ids_to_round.push_back((v2 * 2) + offset);\n\n  // add constraint\n  c[(v1 * 2) + offset] =  1;\n  c[(v2 * 2) + offset] = -1;\n\n  // add to the user-defined constraints\n  num_userdefined_constraint++;\n  userdefined_constraints.push_back(c);\n\n}\n\n\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedU>\nIGL_INLINE igl::copyleft::comiso::MIQ_class<DerivedV, DerivedF, DerivedU>::MIQ_class(const Eigen::PlainObjectBase<DerivedV> &V_,\n                                                                   const Eigen::PlainObjectBase<DerivedF> &F_,\n                                                                   const Eigen::PlainObjectBase<DerivedV> &PD1_combed,\n                                                                   const Eigen::PlainObjectBase<DerivedV> &PD2_combed,\n                                                                   const Eigen::Matrix<int, Eigen::Dynamic, 3> &Handle_MMatch,\n                                                                   const Eigen::Matrix<int, Eigen::Dynamic, 1> &Handle_Singular,\n                                                                   const Eigen::Matrix<int, Eigen::Dynamic, 3> &Handle_Seams,\n                                                                   Eigen::PlainObjectBase<DerivedU> &UV,\n                                                                   Eigen::PlainObjectBase<DerivedF> &FUV,\n                                                                   double GradientSize,\n                                                                   double Stiffness,\n                                                                   bool DirectRound,\n                                                                   int iter,\n                                                                   int localIter,\n                                                                   bool DoRound,\n                                                                   bool SingularityRound,\n                                                                   std::vector<int> roundVertices,\n                                                                   std::vector<std::vector<int> > hardFeatures):\nV(V_),\nF(F_)\n{\n  igl::cut_mesh(V, F, Handle_Seams, Vcut, Fcut);\n\n  igl::local_basis(V,F,B1,B2,B3);\n  igl::triangle_triangle_adjacency(F,TT,TTi);\n\n  // Prepare indexing for the linear system\n  VertexIndexing<DerivedV, DerivedF> VInd(V, F, Vcut, Fcut, TT, TTi, Handle_MMatch, Handle_Singular, Handle_Seams);\n\n  VInd.InitSeamInfo();\n\n  // Assemble the system and solve\n  PoissonSolver<DerivedV, DerivedF> PSolver(V,\n                                            F,\n                                            Vcut,\n                                            Fcut,\n                                            TT,\n                                            TTi,\n                                            PD1_combed,\n                                            PD2_combed,\n                                            Handle_Singular,\n                                            VInd.Handle_SystemInfo);\n  Handle_Stiffness = Eigen::VectorXd::Constant(F.rows(),1);\n\n\n  if (iter > 0) // do stiffening\n  {\n    for (int i=0;i<iter;i++)\n    {\n      PSolver.SolvePoisson(Handle_Stiffness, GradientSize,1.f,DirectRound,localIter,DoRound,SingularityRound,roundVertices,hardFeatures);\n      int nflips=NumFlips(PSolver.WUV);\n      bool folded = updateStiffeningJacobianDistorsion(GradientSize,PSolver.WUV);\n      printf(\"ITERATION %d FLIPS %d \\n\",i,nflips);\n      if (!folded)break;\n    }\n  }\n  else\n  {\n    PSolver.SolvePoisson(Handle_Stiffness,GradientSize,1.f,DirectRound,localIter,DoRound,SingularityRound,roundVertices,hardFeatures);\n  }\n\n  int nflips=NumFlips(PSolver.WUV);\n  printf(\"**** END OPTIMIZING #FLIPS %d  ****\\n\",nflips);\n\n  UV_out = PSolver.UV_out;\n  FUV_out = PSolver.Fcut;\n  fflush(stdout);\n}\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedU>\nIGL_INLINE void igl::copyleft::comiso::MIQ_class<DerivedV, DerivedF, DerivedU>::extractUV(Eigen::PlainObjectBase<DerivedU> &UV_out,\n                                                                        Eigen::PlainObjectBase<DerivedF> &FUV_out)\n{\n  UV_out = this->UV_out;\n  FUV_out = this->FUV_out;\n}\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedU>\nIGL_INLINE int igl::copyleft::comiso::MIQ_class<DerivedV, DerivedF, DerivedU>::NumFlips(const Eigen::MatrixXd& WUV)\n{\n  int numFl=0;\n  for (unsigned int i=0;i<F.rows();i++)\n  {\n    if (IsFlipped(i, WUV))\n      numFl++;\n  }\n  return numFl;\n}\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedU>\nIGL_INLINE double igl::copyleft::comiso::MIQ_class<DerivedV, DerivedF, DerivedU>::Distortion(int f, double h, const Eigen::MatrixXd& WUV)\n{\n  assert(h > 0);\n\n  Eigen::Vector2d uv0,uv1,uv2;\n\n  uv0 << WUV(f,0), WUV(f,1);\n  uv1 << WUV(f,2), WUV(f,3);\n  uv2 << WUV(f,4), WUV(f,5);\n\n  Eigen::Matrix<typename DerivedV::Scalar, 3, 1> p0 = Vcut.row(Fcut(f,0));\n  Eigen::Matrix<typename DerivedV::Scalar, 3, 1> p1 = Vcut.row(Fcut(f,1));\n  Eigen::Matrix<typename DerivedV::Scalar, 3, 1> p2 = Vcut.row(Fcut(f,2));\n\n  Eigen::Matrix<typename DerivedV::Scalar, 3, 1> norm = (p1 - p0).cross(p2 - p0);\n  double area2 = norm.norm();\n  double area2_inv  = 1.0 / area2;\n  norm *= area2_inv;\n\n  if (area2 > 0)\n  {\n    // Singular values of the Jacobian\n    Eigen::Matrix<typename DerivedV::Scalar, 3, 1> neg_t0 = norm.cross(p2 - p1);\n    Eigen::Matrix<typename DerivedV::Scalar, 3, 1> neg_t1 = norm.cross(p0 - p2);\n    Eigen::Matrix<typename DerivedV::Scalar, 3, 1> neg_t2 = norm.cross(p1 - p0);\n\n    Eigen::Matrix<typename DerivedV::Scalar, 3, 1> diffu =  (neg_t0 * uv0(0) +neg_t1 *uv1(0) +  neg_t2 * uv2(0) )*area2_inv;\n    Eigen::Matrix<typename DerivedV::Scalar, 3, 1> diffv = (neg_t0 * uv0(1) + neg_t1*uv1(1) +  neg_t2*uv2(1) )*area2_inv;\n\n    // first fundamental form\n    double I00 = diffu.dot(diffu);  // guaranteed non-neg\n    double I01 = diffu.dot(diffv);  // I01 = I10\n    double I11 = diffv.dot(diffv);  // guaranteed non-neg\n\n    // eigenvalues of a 2x2 matrix\n    // [a00 a01]\n    // [a10 a11]\n    // 1/2 * [ (a00 + a11) +/- sqrt((a00 - a11)^2 + 4 a01 a10) ]\n    double trI = I00 + I11;                     // guaranteed non-neg\n    double diffDiag = I00 - I11;                // guaranteed non-neg\n    double sqrtDet = sqrt(std::max(0.0, diffDiag*diffDiag +\n                                   4 * I01 * I01)); // guaranteed non-neg\n    double sig1 = 0.5 * (trI + sqrtDet); // higher singular value\n    double sig2 = 0.5 * (trI - sqrtDet); // lower singular value\n\n    // Avoid sig2 < 0 due to numerical error\n    if (fabs(sig2) < 1.0e-8)\n      sig2 = 0;\n\n    assert(sig1 >= 0);\n    assert(sig2 >= 0);\n\n    if (sig2 < 0) {\n      printf(\"Distortion will be NaN! sig1^2 is negative (%lg)\\n\",\n             sig2);\n    }\n\n    // The singular values of the Jacobian are the sqrts of the\n    // eigenvalues of the first fundamental form.\n    sig1 = sqrt(sig1);\n    sig2 = sqrt(sig2);\n\n    // distortion\n    double tao = IsFlipped(f,WUV) ? -1 : 1;\n    double factor = tao / h;\n    double lam = fabs(factor * sig1 - 1) + fabs(factor * sig2 - 1);\n    return lam;\n  }\n  else {\n    return 10; // something \"large\"\n  }\n}\n\n////////////////////////////////////////////////////////////////////////////\n// Approximate the distortion laplacian using a uniform laplacian on\n//  the dual mesh:\n//      ___________\n//      \\-1 / \\-1 /\n//       \\ / 3 \\ /\n//        \\-----/\n//         \\-1 /\n//          \\ /\n//\n//  @param[in]  f   facet on which to compute distortion laplacian\n//  @param[in]  h   scaling factor applied to cross field\n//  @return     distortion laplacian for f\n///////////////////////////////////////////////////////////////////////////\ntemplate <typename DerivedV, typename DerivedF, typename DerivedU>\nIGL_INLINE double igl::copyleft::comiso::MIQ_class<DerivedV, DerivedF, DerivedU>::LaplaceDistortion(const int f, double h, const Eigen::MatrixXd& WUV)\n{\n  double mydist = Distortion(f, h, WUV);\n  double lapl=0;\n  for (int i=0;i<3;i++)\n  {\n    if (TT(f,i) != -1)\n      lapl += (mydist - Distortion(TT(f,i), h, WUV));\n  }\n  return lapl;\n}\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedU>\nIGL_INLINE bool igl::copyleft::comiso::MIQ_class<DerivedV, DerivedF, DerivedU>::updateStiffeningJacobianDistorsion(double grad_size, const Eigen::MatrixXd& WUV)\n{\n  bool flipped = NumFlips(WUV)>0;\n\n  if (!flipped)\n    return false;\n\n  double maxL=0;\n  double maxD=0;\n\n  if (flipped)\n  {\n    const double c = 1.0;\n    const double d = 5.0;\n\n    for (unsigned int i = 0; i < Fcut.rows(); ++i)\n    {\n      double dist=Distortion(i,grad_size,WUV);\n      if (dist > maxD)\n        maxD=dist;\n\n      double absLap=fabs(LaplaceDistortion(i, grad_size,WUV));\n      if (absLap > maxL)\n        maxL = absLap;\n\n      double stiffDelta = std::min(c * absLap, d);\n\n      Handle_Stiffness[i]+=stiffDelta;\n    }\n  }\n  printf(\"Maximum Distorsion %4.4f \\n\",maxD);\n  printf(\"Maximum Laplacian %4.4f \\n\",maxL);\n  return flipped;\n}\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedU>\nIGL_INLINE bool igl::copyleft::comiso::MIQ_class<DerivedV, DerivedF, DerivedU>::IsFlipped(const Eigen::Vector2d &uv0,\n                                                                        const Eigen::Vector2d &uv1,\n                                                                        const Eigen::Vector2d &uv2)\n{\n  Eigen::Vector2d e0 = (uv1-uv0);\n  Eigen::Vector2d e1 = (uv2-uv0);\n\n  double Area = e0(0)*e1(1) - e0(1)*e1(0);\n  return (Area<=0);\n}\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedU>\nIGL_INLINE bool igl::copyleft::comiso::MIQ_class<DerivedV, DerivedF, DerivedU>::IsFlipped(\n  const int i, const Eigen::MatrixXd& WUV)\n{\n  Eigen::Vector2d uv0,uv1,uv2;\n  uv0 << WUV(i,0), WUV(i,1);\n  uv1 << WUV(i,2), WUV(i,3);\n  uv2 << WUV(i,4), WUV(i,5);\n\n  return (IsFlipped(uv0,uv1,uv2));\n}\n\n\n\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedU>\nIGL_INLINE void igl::copyleft::comiso::miq(\n  const Eigen::PlainObjectBase<DerivedV> &V,\n  const Eigen::PlainObjectBase<DerivedF> &F,\n  const Eigen::PlainObjectBase<DerivedV> &PD1_combed,\n  const Eigen::PlainObjectBase<DerivedV> &PD2_combed,\n  const Eigen::Matrix<int, Eigen::Dynamic, 3> &Handle_MMatch,\n  const Eigen::Matrix<int, Eigen::Dynamic, 1> &Handle_Singular,\n  const Eigen::Matrix<int, Eigen::Dynamic, 3> &Handle_Seams,\n  Eigen::PlainObjectBase<DerivedU> &UV,\n  Eigen::PlainObjectBase<DerivedF> &FUV,\n  double GradientSize,\n  double Stiffness,\n  bool DirectRound,\n  int iter,\n  int localIter,\n  bool DoRound,\n  bool SingularityRound,\n  std::vector<int> roundVertices,\n  std::vector<std::vector<int> > hardFeatures)\n{\n  GradientSize = GradientSize/(V.colwise().maxCoeff()-V.colwise().minCoeff()).norm();\n\n  igl::copyleft::comiso::MIQ_class<DerivedV, DerivedF, DerivedU> miq(V,\n    F,\n    PD1_combed,\n    PD2_combed,\n    Handle_MMatch,\n    Handle_Singular,\n    Handle_Seams,\n    UV,\n    FUV,\n    GradientSize,\n    Stiffness,\n    DirectRound,\n    iter,\n    localIter,\n    DoRound,\n    SingularityRound,\n    roundVertices,\n    hardFeatures);\n\n  miq.extractUV(UV,FUV);\n}\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedU>\nIGL_INLINE void igl::copyleft::comiso::miq(\n    const Eigen::PlainObjectBase<DerivedV> &V,\n    const Eigen::PlainObjectBase<DerivedF> &F,\n    const Eigen::PlainObjectBase<DerivedV> &PD1,\n    const Eigen::PlainObjectBase<DerivedV> &PD2,\n    Eigen::PlainObjectBase<DerivedU> &UV,\n    Eigen::PlainObjectBase<DerivedF> &FUV,\n    double GradientSize,\n    double Stiffness,\n    bool DirectRound,\n    int iter,\n    int localIter,\n    bool DoRound,\n    bool SingularityRound,\n    std::vector<int> roundVertices,\n    std::vector<std::vector<int> > hardFeatures)\n{\n\n  DerivedV BIS1, BIS2;\n  igl::compute_frame_field_bisectors(V, F, PD1, PD2, BIS1, BIS2);\n\n  DerivedV BIS1_combed, BIS2_combed;\n  igl::comb_cross_field(V, F, BIS1, BIS2, BIS1_combed, BIS2_combed);\n\n  DerivedF Handle_MMatch;\n  igl::cross_field_missmatch(V, F, BIS1_combed, BIS2_combed, true, Handle_MMatch);\n\n  Eigen::Matrix<int, Eigen::Dynamic, 1> isSingularity, singularityIndex;\n  igl::find_cross_field_singularities(V, F, Handle_MMatch, isSingularity, singularityIndex);\n\n  Eigen::Matrix<int, Eigen::Dynamic, 3> Handle_Seams;\n  igl::cut_mesh_from_singularities(V, F, Handle_MMatch, Handle_Seams);\n\n  DerivedV PD1_combed, PD2_combed;\n  igl::comb_frame_field(V, F, PD1, PD2, BIS1_combed, BIS2_combed, PD1_combed, PD2_combed);\n\n  igl::copyleft::comiso::miq(V,\n           F,\n           PD1_combed,\n           PD2_combed,\n           Handle_MMatch,\n           isSingularity,\n           Handle_Seams,\n           UV,\n           FUV,\n           GradientSize,\n           Stiffness,\n           DirectRound,\n           iter,\n           localIter,\n           DoRound,\n           SingularityRound,\n           roundVertices,\n           hardFeatures);\n\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::copyleft::comiso::miq<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, double, double, bool, int, int, bool, bool, std::vector<int, std::allocator<int> >, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >);\ntemplate void igl::copyleft::comiso::miq<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, 3, 0, -1, 3> const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, Eigen::Matrix<int, -1, 3, 0, -1, 3> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, double, double, bool, int, int, bool, bool, std::vector<int, std::allocator<int> >, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >);\ntemplate void igl::copyleft::comiso::miq<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, double, double, bool, int, int, bool, bool, std::vector<int, std::allocator<int> >, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/comiso/miqNew.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>, Olga Diamanti <olga.diam@gmail.com>, Kevin Walliman <wkevin@student.ethz.ch>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COMISO_MIQ_H\n#define IGL_COMISO_MIQ_H\n#include \"../../igl_inline.h\"\n#include <Eigen/Core>\n#include <vector>\n\nnamespace igl\n{\n  namespace copyleft\n  {\n  namespace comiso\n  {\n  // Global seamless parametrization aligned with a given per-face jacobian (PD1,PD2).\n    // The algorithm is based on\n    // \"Mixed-Integer Quadrangulation\" by D. Bommes, H. Zimmer, L. Kobbelt\n    // ACM SIGGRAPH 2009, Article No. 77 (http://dl.acm.org/citation.cfm?id=1531383)\n    // We thank Nico Pietroni for providing a reference implementation of MIQ\n    // on which our code is based.\n\n    // Inputs:\n    //   V              #V by 3 list of mesh vertex 3D positions\n    //   F              #F by 3 list of faces indices in V\n    //   PD1            #V by 3 first line of the Jacobian per triangle\n    //   PD2            #V by 3 second line of the Jacobian per triangle\n    //                  (optional, if empty it will be a vector in the tangent plane orthogonal to PD1)\n    //   scale          global scaling for the gradient (controls the quads resolution)\n    //   stiffness      weight for the stiffness iterations\n    //   direct_round   greedily round all integer variables at once (greatly improves optimization speed but lowers quality)\n    //   iter           stiffness iterations (0 = no stiffness)\n    //   local_iter     number of local iterations for the integer rounding\n    //   do_round       enables the integer rounding (disabling it could be useful for debugging)\n    //   round_vertices id of additional vertices that should be snapped to integer coordinates\n    //   hard_features  #H by 2 list of pairs of vertices that belongs to edges that should be snapped to integer coordinates\n    //\n    // Output:\n    //   UV             #UV by 2 list of vertices in 2D\n    //   FUV            #FUV by 3 list of face indices in UV\n    //\n    // TODO: rename the parameters name in the cpp consistenly\n    //       improve the handling of hard_features, right now it might fail in difficult cases\n\n    template <typename DerivedV, typename DerivedF, typename DerivedU>\n    IGL_INLINE void miq(\n      const Eigen::PlainObjectBase<DerivedV> &V,\n      const Eigen::PlainObjectBase<DerivedF> &F,\n      const Eigen::PlainObjectBase<DerivedV> &PD1,\n      const Eigen::PlainObjectBase<DerivedV> &PD2,\n      Eigen::PlainObjectBase<DerivedU> &UV,\n      Eigen::PlainObjectBase<DerivedF> &FUV,\n      double scale = 30.0,\n      double stiffness = 5.0,\n      bool direct_round = false,\n      int iter = 5,\n      int local_iter = 5,\n      bool DoRound = true,bool SingularityRound=true,\n      std::vector<int> round_vertices = std::vector<int>(),\n      std::vector<std::vector<int> > hard_features = std::vector<std::vector<int> >(),\n\tdouble miqAnisotropy=1);\n\n    // Helper function that allows to directly provided pre-combed bisectors for an already cut mesh\n    // Additional input:\n    // PD1_combed, PD2_combed  :   #F by 3 combed jacobian\n    // BIS1_combed, BIS2_combed:   #F by 3 pre combed bi-sectors\n    // MMatch:                     #F by 3 list of per-corner integer PI/2 rotations\n    // Singular:                   #V list of flag that denotes if a vertex is singular or not\n    // SingularDegree:             #V list of flag that denotes the degree of the singularity\n    // Seams:                      #F by 3 list of per-corner flag that denotes seams\n\n    template <typename DerivedV, typename DerivedF, typename DerivedU>\n    IGL_INLINE void miq(const Eigen::PlainObjectBase<DerivedV> &V,\n      const Eigen::PlainObjectBase<DerivedF> &F,\n      const Eigen::PlainObjectBase<DerivedV> &PD1_combed,\n      const Eigen::PlainObjectBase<DerivedV> &PD2_combed,\n      const Eigen::Matrix<int, Eigen::Dynamic, 3> &MMatch,\n      const Eigen::Matrix<int, Eigen::Dynamic, 1> &Singular,\n      const Eigen::Matrix<int, Eigen::Dynamic, 3> &Seams,\n      Eigen::PlainObjectBase<DerivedU> &UV,\n      Eigen::PlainObjectBase<DerivedF> &FUV,\n      double GradientSize = 30.0,\n      double Stiffness = 5.0,\n      bool DirectRound = false,\n      int iter = 5,\n      int localIter = 5, bool DoRound = true,bool SingularityRound=true,\n      std::vector<int> roundVertices = std::vector<int>(),\n      std::vector<std::vector<int> > hardFeatures = std::vector<std::vector<int> >(),\n\tdouble miqAnisotropy=1);\n  };\n};\n};\n#ifndef IGL_STATIC_LIBRARY\n#include \"miq.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/comiso/nrosy.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"nrosy.h\"\n\n#include <igl/copyleft/comiso/nrosy.h>\n#include <igl/triangle_triangle_adjacency.h>\n#include <igl/edge_topology.h>\n#include <igl/per_face_normals.h>\n\n#include <iostream>\n#include <fstream>\n\n#include <Eigen/Geometry>\n#include <Eigen/Sparse>\n#include <queue>\n\n#include <gmm/gmm.h>\n#include <CoMISo/Solver/ConstrainedSolver.hh>\n#include <CoMISo/Solver/MISolver.hh>\n#include <CoMISo/Solver/GMM_Tools.hh>\n\nnamespace igl\n{\nnamespace copyleft\n{\n\nnamespace comiso\n{\nclass NRosyField\n{\npublic:\n  // Init\n  IGL_INLINE NRosyField(const Eigen::MatrixXd& _V, const Eigen::MatrixXi& _F);\n\n  // Generate the N-rosy field\n  // N degree of the rosy field\n  // roundseparately: round the integer variables one at a time, slower but higher quality\n  IGL_INLINE void solve(const int N = 4);\n\n  // Set a hard constraint on fid\n  // fid: face id\n  // v: direction to fix (in 3d)\n  IGL_INLINE void setConstraintHard(const int fid, const Eigen::Vector3d& v);\n\n  // Set a soft constraint on fid\n  // fid: face id\n  // w: weight of the soft constraint, clipped between 0 and 1\n  // v: direction to fix (in 3d)\n  IGL_INLINE void setConstraintSoft(const int fid, const double w, const Eigen::Vector3d& v);\n\n  // Set the ratio between smoothness and soft constraints (0 -> smoothness only, 1 -> soft constr only)\n  IGL_INLINE void setSoftAlpha(double alpha);\n\n  // Reset constraints (at least one constraint must be present or solve will fail)\n  IGL_INLINE void resetConstraints();\n\n  // Return the current field\n  IGL_INLINE Eigen::MatrixXd getFieldPerFace();\n\n  // Return the current field (in Ahish's ffield format)\n  IGL_INLINE Eigen::MatrixXd getFFieldPerFace();\n\n  // Compute singularity indexes\n  IGL_INLINE void findCones(int N);\n\n  // Return the singularities\n  IGL_INLINE Eigen::VectorXd getSingularityIndexPerVertex();\n\nprivate:\n\n  // Compute angle differences between reference frames\n  IGL_INLINE void computek();\n\n  // Remove useless matchings\n  IGL_INLINE void reduceSpace();\n\n  // Prepare the system matrix\n  IGL_INLINE void prepareSystemMatrix(const int N);\n\n  // Solve without roundings\n  IGL_INLINE void solveNoRoundings();\n\n  // Solve with roundings using CoMIso\n  IGL_INLINE void solveRoundings();\n\n  // Round all p to 0 and fix\n  IGL_INLINE void roundAndFixToZero();\n\n  // Round all p and fix\n  IGL_INLINE void roundAndFix();\n\n  // Convert a vector in 3d to an angle wrt the local reference system\n  IGL_INLINE double convert3DtoLocal(unsigned fid, const Eigen::Vector3d& v);\n\n  // Convert an angle wrt the local reference system to a 3d vector\n  IGL_INLINE Eigen::Vector3d convertLocalto3D(unsigned fid, double a);\n\n  // Compute the per vertex angle defect\n  IGL_INLINE Eigen::VectorXd angleDefect();\n\n  // Temporary variable for the field\n  Eigen::VectorXd angles;\n\n  // Hard constraints\n  Eigen::VectorXd hard;\n  std::vector<bool> isHard;\n\n  // Soft constraints\n  Eigen::VectorXd soft;\n  Eigen::VectorXd wSoft;\n  double          softAlpha;\n\n  // Face Topology\n  Eigen::MatrixXi TT, TTi;\n\n  // Edge Topology\n  Eigen::MatrixXi EV, FE, EF;\n  std::vector<bool> isBorderEdge;\n\n  // Per Edge information\n  // Angle between two reference frames\n  Eigen::VectorXd k;\n\n  // Jumps\n  Eigen::VectorXi p;\n  std::vector<bool> pFixed;\n\n  // Mesh\n  Eigen::MatrixXd V;\n  Eigen::MatrixXi F;\n\n  // Normals per face\n  Eigen::MatrixXd N;\n\n  // Singularity index\n  Eigen::VectorXd singularityIndex;\n\n  // Reference frame per triangle\n  std::vector<Eigen::MatrixXd> TPs;\n\n  // System stuff\n  Eigen::SparseMatrix<double> A;\n  Eigen::VectorXd b;\n  Eigen::VectorXi tag_t;\n  Eigen::VectorXi tag_p;\n\n};\n\n} // NAMESPACE COMISO\n} // NAMESPACE COPYLEFT\n} // NAMESPACE IGL\n\nigl::copyleft::comiso::NRosyField::NRosyField(const Eigen::MatrixXd& _V, const Eigen::MatrixXi& _F)\n{\n  using namespace std;\n  using namespace Eigen;\n\n  V = _V;\n  F = _F;\n\n  assert(V.rows() > 0);\n  assert(F.rows() > 0);\n\n\n  // Generate topological relations\n  igl::triangle_triangle_adjacency(F,TT,TTi);\n  igl::edge_topology(V,F, EV, FE, EF);\n\n  // Flag border edges\n  isBorderEdge.resize(EV.rows());\n  for(unsigned i=0; i<EV.rows(); ++i)\n    isBorderEdge[i] = (EF(i,0) == -1) || ((EF(i,1) == -1));\n\n  // Generate normals per face\n  igl::per_face_normals(V, F, N);\n\n  // Generate reference frames\n  for(unsigned fid=0; fid<F.rows(); ++fid)\n  {\n    // First edge\n    Vector3d e1 = V.row(F(fid,1)) - V.row(F(fid,0));\n    e1.normalize();\n    Vector3d e2 = N.row(fid);\n    e2 = e2.cross(e1);\n    e2.normalize();\n\n    MatrixXd TP(2,3);\n    TP << e1.transpose(), e2.transpose();\n    TPs.push_back(TP);\n  }\n\n  // Alloc internal variables\n  angles = VectorXd::Zero(F.rows());\n  p = VectorXi::Zero(EV.rows());\n  pFixed.resize(EV.rows());\n  k = VectorXd::Zero(EV.rows());\n  singularityIndex = VectorXd::Zero(V.rows());\n\n  // Reset the constraints\n  resetConstraints();\n\n  // Compute k, differences between reference frames\n  computek();\n\n  softAlpha = 0.5;\n}\n\nvoid igl::copyleft::comiso::NRosyField::setSoftAlpha(double alpha)\n{\n  assert(alpha >= 0 && alpha < 1);\n  softAlpha = alpha;\n}\n\n\nvoid igl::copyleft::comiso::NRosyField::prepareSystemMatrix(const int N)\n{\n  using namespace std;\n  using namespace Eigen;\n\n  double Nd = N;\n\n  // Minimize the MIQ energy\n  // Energy on edge ij is\n  //     (t_i - t_j + kij + pij*(2*pi/N))^2\n  // Partial derivatives:\n  //   t_i: 2     ( t_i - t_j + kij + pij*(2*pi/N)) = 0\n  //   t_j: 2     (-t_i + t_j - kij - pij*(2*pi/N)) = 0\n  //   pij: 4pi/N ( t_i - t_j + kij + pij*(2*pi/N)) = 0\n  //\n  //          t_i      t_j         pij       kij\n  // t_i [     2       -2           4pi/N      2    ]\n  // t_j [    -2        2          -4pi/N     -2    ]\n  // pij [   4pi/N   -4pi/N    2*(2pi/N)^2   4pi/N  ]\n\n  // Count and tag the variables\n  tag_t = VectorXi::Constant(F.rows(),-1);\n  vector<int> id_t;\n  int count = 0;\n  for(unsigned i=0; i<F.rows(); ++i)\n    if (!isHard[i])\n    {\n      tag_t(i) = count++;\n      id_t.push_back(i);\n    }\n\n  unsigned count_t = id_t.size();\n\n  tag_p = VectorXi::Constant(EF.rows(),-1);\n  vector<int> id_p;\n  for(unsigned i=0; i<EF.rows(); ++i)\n  {\n    if (!pFixed[i])\n    {\n      // if it is not fixed then it is a variable\n      tag_p(i) = count++;\n    }\n\n    // if it is not a border edge,\n    if (!isBorderEdge[i])\n    {\n      // and it is not between two fixed faces\n      if (!(isHard[EF(i,0)] && isHard[EF(i,1)]))\n      {\n          // then it participates in the energy!\n          id_p.push_back(i);\n      }\n    }\n  }\n\n  unsigned count_p = count - count_t;\n  // System sizes: A (count_t + count_p) x (count_t + count_p)\n  //               b (count_t + count_p)\n\n  b = VectorXd::Zero(count_t + count_p);\n\n  std::vector<Eigen::Triplet<double> > T;\n  T.reserve(3 * 4 * count_p);\n\n  for(unsigned r=0; r<id_p.size(); ++r)\n  {\n    int eid = id_p[r];\n    int i = EF(eid,0);\n    int j = EF(eid,1);\n    bool isFixed_i = isHard[i];\n    bool isFixed_j = isHard[j];\n    bool isFixed_p = pFixed[eid];\n    int row;\n    // (i)-th row: t_i [     2       -2           4pi/N      2    ]\n    if (!isFixed_i)\n    {\n      row = tag_t[i];\n      if (isFixed_i) b(row) += -2               * hard[i]; else T.push_back(Eigen::Triplet<double>(row,tag_t[i]  , 2             ));\n      if (isFixed_j) b(row) +=  2               * hard[j]; else T.push_back(Eigen::Triplet<double>(row,tag_t[j]  ,-2             ));\n      if (isFixed_p) b(row) += -((4 * M_PI)/Nd) * p[eid] ; else T.push_back(Eigen::Triplet<double>(row,tag_p[eid],((4 * M_PI)/Nd)));\n      b(row) += -2 * k[eid];\n      assert(hard[i] == hard[i]);\n      assert(hard[j] == hard[j]);\n      assert(p[eid] == p[eid]);\n      assert(k[eid] == k[eid]);\n      assert(b(row) == b(row));\n    }\n    // (j)+1 -th row: t_j [    -2        2          -4pi/N     -2    ]\n    if (!isFixed_j)\n    {\n      row = tag_t[j];\n      if (isFixed_i) b(row) += 2               * hard[i]; else T.push_back(Eigen::Triplet<double>(row,tag_t[i]  , -2             ));\n      if (isFixed_j) b(row) += -2              * hard[j]; else T.push_back(Eigen::Triplet<double>(row,tag_t[j] ,  2              ));\n      if (isFixed_p) b(row) += ((4 * M_PI)/Nd) * p[eid] ; else T.push_back(Eigen::Triplet<double>(row,tag_p[eid],-((4 * M_PI)/Nd)));\n      b(row) += 2 * k[eid];\n      assert(k[eid] == k[eid]);\n      assert(b(row) == b(row));\n    }\n    // (r*3)+2 -th row: pij [   4pi/N   -4pi/N    2*(2pi/N)^2   4pi/N  ]\n    if (!isFixed_p)\n    {\n      row = tag_p[eid];\n      if (isFixed_i) b(row) += -(4 * M_PI)/Nd              * hard[i]; else T.push_back(Eigen::Triplet<double>(row,tag_t[i] ,   (4 * M_PI)/Nd             ));\n      if (isFixed_j) b(row) +=  (4 * M_PI)/Nd              * hard[j]; else T.push_back(Eigen::Triplet<double>(row,tag_t[j] ,  -(4 * M_PI)/Nd             ));\n      if (isFixed_p) b(row) += -(2 * pow(((2*M_PI)/Nd),2)) * p[eid] ;  else T.push_back(Eigen::Triplet<double>(row,tag_p[eid],  (2 * pow(((2*M_PI)/Nd),2))));\n      b(row) += - (4 * M_PI)/Nd * k[eid];\n      assert(k[eid] == k[eid]);\n      assert(b(row) == b(row));\n    }\n\n  }\n\n  A = SparseMatrix<double>(count_t + count_p, count_t + count_p);\n  A.setFromTriplets(T.begin(), T.end());\n\n  // Soft constraints\n  bool addSoft = false;\n\n  for(unsigned i=0; i<wSoft.size();++i)\n    if (wSoft[i] != 0)\n      addSoft = true;\n\n  if (addSoft)\n  {\n    cerr << \" Adding soft here: \" << endl;\n    cerr << \" softAplha: \" << softAlpha << endl;\n    VectorXd bSoft = VectorXd::Zero(count_t + count_p);\n\n    std::vector<Eigen::Triplet<double> > TSoft;\n    TSoft.reserve(2 * count_p);\n\n    for(unsigned i=0; i<F.rows(); ++i)\n    {\n      int varid = tag_t[i];\n      if (varid != -1) // if it is a variable in the system\n      {\n        TSoft.push_back(Eigen::Triplet<double>(varid,varid,wSoft[i]));\n        bSoft[varid] += wSoft[i] * soft[i];\n      }\n    }\n    SparseMatrix<double> ASoft(count_t + count_p, count_t + count_p);\n    ASoft.setFromTriplets(TSoft.begin(), TSoft.end());\n\n//    ofstream s(\"/Users/daniele/As.txt\");\n//    for(unsigned i=0; i<TSoft.size(); ++i)\n//      s << TSoft[i].row() << \" \" << TSoft[i].col() << \" \" << TSoft[i].value() << endl;\n//    s.close();\n\n//    ofstream s2(\"/Users/daniele/bs.txt\");\n//    for(unsigned i=0; i<bSoft.rows(); ++i)\n//      s2 << bSoft(i) << endl;\n//    s2.close();\n\n    // Stupid Eigen bug\n    SparseMatrix<double> Atmp (count_t + count_p, count_t + count_p);\n    SparseMatrix<double> Atmp2(count_t + count_p, count_t + count_p);\n    SparseMatrix<double> Atmp3(count_t + count_p, count_t + count_p);\n\n    // Merge the two part of the energy\n    Atmp = (1.0 - softAlpha)*A;\n    Atmp2 = softAlpha * ASoft;\n    Atmp3 = Atmp+Atmp2;\n\n    A = Atmp3;\n    b = b*(1.0 - softAlpha) + bSoft * softAlpha;\n  }\n\n//  ofstream s(\"/Users/daniele/A.txt\");\n//  for (int k=0; k<A.outerSize(); ++k)\n//    for (SparseMatrix<double>::InnerIterator it(A,k); it; ++it)\n//    {\n//      s << it.row() << \" \" << it.col() << \" \" << it.value() << endl;\n//    }\n//  s.close();\n//\n//  ofstream s2(\"/Users/daniele/b.txt\");\n//  for(unsigned i=0; i<b.rows(); ++i)\n//    s2 << b(i) << endl;\n//  s2.close();\n}\n\nvoid igl::copyleft::comiso::NRosyField::solveNoRoundings()\n{\n  using namespace std;\n  using namespace Eigen;\n\n  // Solve the linear system\n  SimplicialLDLT<SparseMatrix<double> > solver;\n  solver.compute(A);\n  VectorXd x = solver.solve(b);\n\n  // Copy the result back\n  for(unsigned i=0; i<F.rows(); ++i)\n    if (tag_t[i] != -1)\n      angles[i] = x(tag_t[i]);\n    else\n      angles[i] = hard[i];\n\n  for(unsigned i=0; i<EF.rows(); ++i)\n    if(tag_p[i]  != -1)\n      p[i] = roundl(x[tag_p[i]]);\n}\n\nvoid igl::copyleft::comiso::NRosyField::solveRoundings()\n{\n  using namespace std;\n  using namespace Eigen;\n\n  unsigned n = A.rows();\n\n  gmm::col_matrix< gmm::wsvector< double > > gmm_A;\n  std::vector<double> gmm_b;\n  std::vector<int> ids_to_round;\n  std::vector<double> x;\n\n  gmm_A.resize(n,n);\n  gmm_b.resize(n);\n  x.resize(n);\n\n  // Copy A\n  for (int k=0; k<A.outerSize(); ++k)\n    for (SparseMatrix<double>::InnerIterator it(A,k); it; ++it)\n    {\n      gmm_A(it.row(),it.col()) += it.value();\n    }\n\n  // Copy b\n  for(unsigned i=0; i<n;++i)\n    gmm_b[i] = b[i];\n\n  // Set variables to round\n  ids_to_round.clear();\n  for(unsigned i=0; i<tag_p.size();++i)\n    if(tag_p[i] != -1)\n      ids_to_round.push_back(tag_p[i]);\n\n  // Empty constraints\n  gmm::row_matrix< gmm::wsvector< double > > gmm_C(0, n);\n\n  COMISO::ConstrainedSolver cs;\n  //print_miso_settings(cs.misolver());\n  cs.solve(gmm_C, gmm_A, x, gmm_b, ids_to_round, 0.0, false, true);\n\n  // Copy the result back\n  for(unsigned i=0; i<F.rows(); ++i)\n    if (tag_t[i] != -1)\n      angles[i] = x[tag_t[i]];\n    else\n      angles[i] = hard[i];\n\n  for(unsigned i=0; i<EF.rows(); ++i)\n    if(tag_p[i]  != -1)\n      p[i] = roundl(x[tag_p[i]]);\n\n}\n\n\nvoid igl::copyleft::comiso::NRosyField::roundAndFix()\n{\n  for(unsigned i=0; i<p.rows(); ++i)\n    pFixed[i] = true;\n}\n\nvoid igl::copyleft::comiso::NRosyField::roundAndFixToZero()\n{\n  for(unsigned i=0; i<p.rows(); ++i)\n  {\n    pFixed[i] = true;\n    p[i] = 0;\n  }\n}\n\nvoid igl::copyleft::comiso::NRosyField::solve(const int N)\n{\n  // Reduce the search space by fixing matchings\n  reduceSpace();\n\n  // Build the system\n  prepareSystemMatrix(N);\n\n  // Solve with integer roundings\n  solveRoundings();\n\n  // This is a very greedy solving strategy\n  // // Solve with no roundings\n  // solveNoRoundings();\n  //\n  // // Round all p and fix them\n  // roundAndFix();\n  //\n  // // Build the system\n  // prepareSystemMatrix(N);\n  //\n  // // Solve with no roundings (they are all fixed)\n  // solveNoRoundings();\n\n  // Find the cones\n  findCones(N);\n}\n\nvoid igl::copyleft::comiso::NRosyField::setConstraintHard(const int fid, const Eigen::Vector3d& v)\n{\n  isHard[fid] = true;\n  hard(fid) = convert3DtoLocal(fid, v);\n}\n\nvoid igl::copyleft::comiso::NRosyField::setConstraintSoft(const int fid, const double w, const Eigen::Vector3d& v)\n{\n  wSoft(fid) = w;\n  soft(fid) = convert3DtoLocal(fid, v);\n}\n\nvoid igl::copyleft::comiso::NRosyField::resetConstraints()\n{\n  using namespace std;\n  using namespace Eigen;\n\n  isHard.resize(F.rows());\n  for(unsigned i=0; i<F.rows(); ++i)\n    isHard[i] = false;\n  hard   = VectorXd::Zero(F.rows());\n\n  wSoft  = VectorXd::Zero(F.rows());\n  soft   = VectorXd::Zero(F.rows());\n}\n\nEigen::MatrixXd igl::copyleft::comiso::NRosyField::getFieldPerFace()\n{\n  using namespace std;\n  using namespace Eigen;\n\n  MatrixXd result(F.rows(),3);\n  for(unsigned i=0; i<F.rows(); ++i)\n    result.row(i) = convertLocalto3D(i, angles(i));\n  return result;\n}\n\nEigen::MatrixXd igl::copyleft::comiso::NRosyField::getFFieldPerFace()\n{\n  using namespace std;\n  using namespace Eigen;\n\n  MatrixXd result(F.rows(),6);\n  for(unsigned i=0; i<F.rows(); ++i)\n  {\n      Vector3d v1 = convertLocalto3D(i, angles(i));\n      Vector3d n = N.row(i);\n      Vector3d v2 = n.cross(v1);\n      v1.normalize();\n      v2.normalize();\n\n      result.block(i,0,1,3) = v1.transpose();\n      result.block(i,3,1,3) = v2.transpose();\n  }\n  return result;\n}\n\n\nvoid igl::copyleft::comiso::NRosyField::computek()\n{\n  using namespace std;\n  using namespace Eigen;\n\n  // For every non-border edge\n  for (unsigned eid=0; eid<EF.rows(); ++eid)\n  {\n    if (!isBorderEdge[eid])\n    {\n      int fid0 = EF(eid,0);\n      int fid1 = EF(eid,1);\n\n      Vector3d N0 = N.row(fid0);\n      Vector3d N1 = N.row(fid1);\n\n      // find common edge on triangle 0 and 1\n      int fid0_vc = -1;\n      int fid1_vc = -1;\n      for (unsigned i=0;i<3;++i)\n      {\n        if (EV(eid,0) == F(fid0,i))\n          fid0_vc = i;\n        if (EV(eid,1) == F(fid1,i))\n          fid1_vc = i;\n      }\n      assert(fid0_vc != -1);\n      assert(fid1_vc != -1);\n\n      Vector3d common_edge = V.row(F(fid0,(fid0_vc+1)%3)) - V.row(F(fid0,fid0_vc));\n      common_edge.normalize();\n\n      // Map the two triangles in a new space where the common edge is the x axis and the N0 the z axis\n      MatrixXd P(3,3);\n      VectorXd o = V.row(F(fid0,fid0_vc));\n      VectorXd tmp = -N0.cross(common_edge);\n      P << common_edge, tmp, N0;\n      P.transposeInPlace();\n\n\n      MatrixXd V0(3,3);\n      V0.row(0) = V.row(F(fid0,0)).transpose() -o;\n      V0.row(1) = V.row(F(fid0,1)).transpose() -o;\n      V0.row(2) = V.row(F(fid0,2)).transpose() -o;\n\n      V0 = (P*V0.transpose()).transpose();\n\n      assert(V0(0,2) < 10e-10);\n      assert(V0(1,2) < 10e-10);\n      assert(V0(2,2) < 10e-10);\n\n      MatrixXd V1(3,3);\n      V1.row(0) = V.row(F(fid1,0)).transpose() -o;\n      V1.row(1) = V.row(F(fid1,1)).transpose() -o;\n      V1.row(2) = V.row(F(fid1,2)).transpose() -o;\n      V1 = (P*V1.transpose()).transpose();\n\n      assert(V1(fid1_vc,2) < 10e-10);\n      assert(V1((fid1_vc+1)%3,2) < 10e-10);\n\n      // compute rotation R such that R * N1 = N0\n      // i.e. map both triangles to the same plane\n      double alpha = -atan2(V1((fid1_vc+2)%3,2),V1((fid1_vc+2)%3,1));\n\n      MatrixXd R(3,3);\n      R << 1,          0,            0,\n           0, cos(alpha), -sin(alpha) ,\n           0, sin(alpha),  cos(alpha);\n      V1 = (R*V1.transpose()).transpose();\n\n      assert(V1(0,2) < 10e-10);\n      assert(V1(1,2) < 10e-10);\n      assert(V1(2,2) < 10e-10);\n\n      // measure the angle between the reference frames\n      // k_ij is the angle between the triangle on the left and the one on the right\n      VectorXd ref0 = V0.row(1) - V0.row(0);\n      VectorXd ref1 = V1.row(1) - V1.row(0);\n\n      ref0.normalize();\n      ref1.normalize();\n\n      double ktemp = atan2(ref1(1),ref1(0)) - atan2(ref0(1),ref0(0));\n\n      // just to be sure, rotate ref0 using angle ktemp...\n      MatrixXd R2(2,2);\n      R2 << cos(ktemp), -sin(ktemp), sin(ktemp), cos(ktemp);\n\n      tmp = R2*ref0.head<2>();\n\n      assert(tmp(0) - ref1(0) < 10^10);\n      assert(tmp(1) - ref1(1) < 10^10);\n\n      k[eid] = ktemp;\n    }\n  }\n\n}\n\nvoid igl::copyleft::comiso::NRosyField::reduceSpace()\n{\n  using namespace std;\n  using namespace Eigen;\n\n  // All variables are free in the beginning\n  for(unsigned i=0; i<EV.rows(); ++i)\n    pFixed[i] = false;\n\n  vector<VectorXd> debug;\n\n  // debug\n//  MatrixXd B(F.rows(),3);\n//  for(unsigned i=0; i<F.rows(); ++i)\n//    B.row(i) = 1./3. * (V.row(F(i,0)) + V.row(F(i,1)) + V.row(F(i,2)));\n\n  vector<bool> visited(EV.rows());\n  for(unsigned i=0; i<EV.rows(); ++i)\n    visited[i] = false;\n\n  vector<bool> starting(EV.rows());\n  for(unsigned i=0; i<EV.rows(); ++i)\n    starting[i] = false;\n\n  queue<int> q;\n  for(unsigned i=0; i<F.rows(); ++i)\n    if (isHard[i] || wSoft[i] != 0)\n    {\n      q.push(i);\n      starting[i] = true;\n    }\n\n  // Reduce the search space (see MI paper)\n  while (!q.empty())\n  {\n    int c = q.front();\n    q.pop();\n\n    visited[c] = true;\n    for(int i=0; i<3; ++i)\n    {\n      int eid = FE(c,i);\n      int fid = TT(c,i);\n\n      // skip borders\n      if (fid != -1)\n      {\n        assert((EF(eid,0) == c && EF(eid,1) == fid) || (EF(eid,1) == c && EF(eid,0) == fid));\n        // for every neighbouring face\n        if (!visited[fid] && !starting[fid])\n        {\n          pFixed[eid] = true;\n          p[eid] = 0;\n          visited[fid] = true;\n          q.push(fid);\n\n        }\n      }\n      else\n      {\n        // fix borders\n        pFixed[eid] = true;\n        p[eid] = 0;\n      }\n    }\n\n  }\n\n  // Force matchings between fixed faces\n  for(unsigned i=0; i<F.rows();++i)\n  {\n    if (isHard[i])\n    {\n      for(unsigned int j=0; j<3; ++j)\n      {\n        int fid = TT(i,j);\n        if ((fid!=-1) && (isHard[fid]))\n        {\n          // i and fid are adjacent and fixed\n          int eid = FE(i,j);\n          int fid0 = EF(eid,0);\n          int fid1 = EF(eid,1);\n\n          pFixed[eid] = true;\n          p[eid] = roundl(2.0/M_PI*(hard(fid1) - hard(fid0) - k(eid)));\n        }\n      }\n    }\n  }\n\n//  std::ofstream s(\"/Users/daniele/debug.txt\");\n//  for(unsigned i=0; i<debug.size(); i += 2)\n//    s << debug[i].transpose() << \" \" << debug[i+1].transpose() << endl;\n//  s.close();\n\n}\n\ndouble igl::copyleft::comiso::NRosyField::convert3DtoLocal(unsigned fid, const Eigen::Vector3d& v)\n{\n  using namespace std;\n  using namespace Eigen;\n\n  // Project onto the tangent plane\n  Vector2d vp = TPs[fid] * v;\n\n  // Convert to angle\n  return atan2(vp(1),vp(0));\n}\n\nEigen::Vector3d igl::copyleft::comiso::NRosyField::convertLocalto3D(unsigned fid, double a)\n{\n  using namespace std;\n  using namespace Eigen;\n\n  Vector2d vp(cos(a),sin(a));\n  return vp.transpose() * TPs[fid];\n}\n\nEigen::VectorXd igl::copyleft::comiso::NRosyField::angleDefect()\n{\n  Eigen::VectorXd A = Eigen::VectorXd::Constant(V.rows(),-2*M_PI);\n\n  for (unsigned i=0; i < F.rows(); ++i)\n  {\n    for (int j = 0; j < 3; ++j)\n    {\n      Eigen::VectorXd a = V.row(F(i,(j+1)%3)) - V.row(F(i,j));\n      Eigen::VectorXd b = V.row(F(i,(j+2)%3)) - V.row(F(i,j));\n      double t = a.transpose()*b;\n      t /= (a.norm() * b.norm());\n      A(F(i,j)) += acos(t);\n    }\n  }\n\n  return A;\n}\n\nvoid igl::copyleft::comiso::NRosyField::findCones(int N)\n{\n  // Compute I0, see http://www.graphics.rwth-aachen.de/media/papers/bommes_zimmer_2009_siggraph_011.pdf for details\n\n  Eigen::VectorXd I0 = Eigen::VectorXd::Zero(V.rows());\n\n  // first the k\n  for (unsigned i=0; i < EV.rows(); ++i)\n  {\n    if (!isBorderEdge[i])\n    {\n      I0(EV(i,0)) -= k(i);\n      I0(EV(i,1)) += k(i);\n    }\n  }\n\n  // then the A\n  Eigen::VectorXd A = angleDefect();\n\n  I0 = I0 + A;\n\n  // normalize\n  I0 = I0 / (2*M_PI);\n\n  // round to integer (remove numerical noise)\n  for (unsigned i=0; i < I0.size(); ++i)\n    I0(i) = round(I0(i));\n\n  // compute I\n  Eigen::VectorXd I = I0;\n\n  for (unsigned i=0; i < EV.rows(); ++i)\n  {\n    if (!isBorderEdge[i])\n    {\n      I(EV(i,0)) -= double(p(i))/double(N);\n      I(EV(i,1)) += double(p(i))/double(N);\n    }\n  }\n\n  // Clear the vertices on the edges\n  for (unsigned i=0; i < EV.rows(); ++i)\n  {\n    if (isBorderEdge[i])\n    {\n      I0(EV(i,0)) = 0;\n      I0(EV(i,1)) = 0;\n      I(EV(i,0)) = 0;\n      I(EV(i,1)) = 0;\n      A(EV(i,0)) = 0;\n      A(EV(i,1)) = 0;\n    }\n  }\n\n  singularityIndex = I;\n}\n\nEigen::VectorXd igl::copyleft::comiso::NRosyField::getSingularityIndexPerVertex()\n{\n  return singularityIndex;\n}\n\nIGL_INLINE void igl::copyleft::comiso::nrosy(\n  const Eigen::MatrixXd& V,\n  const Eigen::MatrixXi& F,\n  const Eigen::VectorXi& b,\n  const Eigen::MatrixXd& bc,\n  const Eigen::VectorXi& b_soft,\n  const Eigen::VectorXd& w_soft,\n  const Eigen::MatrixXd& bc_soft,\n  const int N,\n  const double soft,\n  Eigen::MatrixXd& R,\n  Eigen::VectorXd& S\n  )\n{\n  // Init solver\n  igl::copyleft::comiso::NRosyField solver(V,F);\n\n  // Add hard constraints\n  for (unsigned i=0; i<b.size();++i)\n    solver.setConstraintHard(b(i),bc.row(i));\n\n  // Add soft constraints\n  for (unsigned i=0; i<b_soft.size();++i)\n    solver.setConstraintSoft(b_soft(i),w_soft(i),bc_soft.row(i));\n\n  // Set the soft constraints global weight\n  solver.setSoftAlpha(soft);\n\n  // Interpolate\n  solver.solve(N);\n\n  // Copy the result back\n  R = solver.getFieldPerFace();\n\n  // Extract singularity indices\n  S = solver.getSingularityIndexPerVertex();\n}\n\n\nIGL_INLINE void igl::copyleft::comiso::nrosy(\n                           const Eigen::MatrixXd& V,\n                           const Eigen::MatrixXi& F,\n                           const Eigen::VectorXi& b,\n                           const Eigen::MatrixXd& bc,\n                           const int N,\n                           Eigen::MatrixXd& R,\n                           Eigen::VectorXd& S\n                           )\n{\n  // Init solver\n  igl::copyleft::comiso::NRosyField solver(V,F);\n\n  // Add hard constraints\n  for (unsigned i=0; i<b.size();++i)\n    solver.setConstraintHard(b(i),bc.row(i));\n\n  // Interpolate\n  solver.solve(N);\n\n  // Copy the result back\n  R = solver.getFieldPerFace();\n\n  // Extract singularity indices\n  S = solver.getSingularityIndexPerVertex();\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/comiso/nrosy.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COMISO_NROSY_H\n#define IGL_COMISO_NROSY_H\n\n#include <iostream>\n#include <Eigen/Core>\n#include <Eigen/Sparse>\n#include <vector>\n#include \"../../igl_inline.h\"\n\nnamespace igl\n{\n  namespace copyleft\n  {\n  namespace comiso\n  {\n    // Generate a N-RoSy field from a sparse set of constraints\n    //\n    // Inputs:\n    //   V       #V by 3 list of mesh vertex coordinates\n    //   F       #F by 3 list of mesh faces (must be triangles)\n    //   b       #B by 1 list of constrained face indices\n    //   bc      #B by 3 list of representative vectors for the constrained\n    //     faces\n    //   b_soft  #S by 1 b for soft constraints\n    //   w_soft  #S by 1 weight for the soft constraints (0-1)\n    //   bc_soft #S by 3 bc for soft constraints\n    //   N       the degree of the N-RoSy vector field\n    //   soft    the strenght of the soft contraints w.r.t. smoothness\n    //           (0 -> smoothness only, 1->constraints only)\n    // Outputs:\n    //   R       #F by 3 the representative vectors of the interpolated field\n    //   S       #V by 1 the singularity index for each vertex (0 = regular)\n    IGL_INLINE void nrosy(\n      const Eigen::MatrixXd& V,\n      const Eigen::MatrixXi& F,\n      const Eigen::VectorXi& b,\n      const Eigen::MatrixXd& bc,\n      const Eigen::VectorXi& b_soft,\n      const Eigen::VectorXd& w_soft,\n      const Eigen::MatrixXd& bc_soft,\n      const int N,\n      const double soft,\n      Eigen::MatrixXd& R,\n      Eigen::VectorXd& S\n      );\n    //wrapper for the case without soft constraints\n    IGL_INLINE void nrosy(\n     const Eigen::MatrixXd& V,\n     const Eigen::MatrixXi& F,\n     const Eigen::VectorXi& b,\n     const Eigen::MatrixXd& bc,\n     const int N,\n     Eigen::MatrixXd& R,\n     Eigen::VectorXd& S\n      );\n\n  }\n}\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"nrosy.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cork/from_cork_mesh.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"from_cork_mesh.h\"\n\ntemplate <\n  typename DerivedV,\n  typename DerivedF>\nIGL_INLINE void igl::copyleft::cork::from_cork_mesh(\n  const CorkTriMesh & mesh,\n  Eigen::PlainObjectBase<DerivedV > & V,\n  Eigen::PlainObjectBase<DerivedF > & F)\n{\n  using namespace std;\n  F.resize(mesh.n_triangles,3);\n  V.resize(mesh.n_vertices,3);\n  for(size_t v = 0;v<mesh.n_vertices;v++)\n  {\n    for(size_t c = 0;c<3;c++)\n    {\n      V(v,c) = mesh.vertices[v*3+c];\n    }\n  }\n  for(size_t f = 0;f<mesh.n_triangles;f++)\n  {\n    for(size_t c = 0;c<3;c++)\n    {\n      F(f,c) = mesh.triangles[f*3+c];\n    }\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::copyleft::cork::from_cork_mesh<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(CorkTriMesh const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::copyleft::cork::from_cork_mesh<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(CorkTriMesh const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cork/from_cork_mesh.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_CORK_FROM_CORK_MESH_H\n#define IGL_COPYLEFT_CORK_FROM_CORK_MESH_H\n#include \"../../igl_inline.h\"\n#include <cork.h>\n#include <Eigen/Core>\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cork\n    {\n      // Convert cork's triangle mesh representation to a (V,F) mesh.\n      //\n      // Inputs:\n      //   mesh  cork representation of mesh\n      // Outputs:\n      //   V  #V by 3 list of vertex positions\n      //   F  #F by 3 list of triangle indices into V\n      template <\n        typename DerivedV,\n        typename DerivedF>\n      IGL_INLINE void from_cork_mesh(\n        const CorkTriMesh & mesh,\n        Eigen::PlainObjectBase<DerivedV > & V,\n        Eigen::PlainObjectBase<DerivedF > & F);\n    }\n  }\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"from_cork_mesh.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cork/mesh_boolean.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"mesh_boolean.h\"\n#include \"to_cork_mesh.h\"\n#include \"from_cork_mesh.h\"\n\ntemplate <\n  typename DerivedVA,\n  typename DerivedFA,\n  typename DerivedVB,\n  typename DerivedFB,\n  typename DerivedVC,\n  typename DerivedFC>\nIGL_INLINE void igl::copyleft::cork::mesh_boolean(\n  const Eigen::PlainObjectBase<DerivedVA > & VA,\n  const Eigen::PlainObjectBase<DerivedFA > & FA,\n  const Eigen::PlainObjectBase<DerivedVB > & VB,\n  const Eigen::PlainObjectBase<DerivedFB > & FB,\n  const MeshBooleanType & type,\n  Eigen::PlainObjectBase<DerivedVC > & VC,\n  Eigen::PlainObjectBase<DerivedFC > & FC)\n{\n  CorkTriMesh A,B,C;\n  // pointer to output so it's easy to redirect on degenerate cases\n  CorkTriMesh *ret = &C;\n  to_cork_mesh(VA,FA,A);\n  to_cork_mesh(VB,FB,B);\n  switch(type)\n  {\n    case MESH_BOOLEAN_TYPE_UNION:\n      if(A.n_triangles == 0)\n      {\n        ret = &B;\n      }else if(B.n_triangles == 0)\n      {\n        ret = &A;\n      }else\n      {\n        computeUnion(A,B,ret);\n      }\n      break;\n    case MESH_BOOLEAN_TYPE_INTERSECT:\n      if(A.n_triangles == 0 || B.n_triangles == 0)\n      {\n        ret->n_triangles = 0;\n        ret->n_vertices = 0;\n      }else\n      {\n        computeIntersection(A,B,ret);\n      }\n      break;\n    case MESH_BOOLEAN_TYPE_MINUS:\n      if(A.n_triangles == 0)\n      {\n        ret->n_triangles = 0;\n        ret->n_vertices = 0;\n      }else if(B.n_triangles == 0)\n      {\n        ret = &A;\n      }else\n      {\n        computeDifference(A,B,ret);\n      }\n      break;\n    case MESH_BOOLEAN_TYPE_XOR:\n      if(A.n_triangles == 0)\n      {\n        ret = &B;\n      }else if(B.n_triangles == 0)\n      {\n        ret = &A;\n      }else\n      {\n        computeSymmetricDifference(A,B,&C);\n      }\n      break;\n    case MESH_BOOLEAN_TYPE_RESOLVE:\n      resolveIntersections(A,B,&C);\n      break;\n    default:\n      assert(false && \"Unknown type\");\n      return;\n  }\n  from_cork_mesh(*ret,VC,FC);\n  freeCorkTriMesh(&A);\n  freeCorkTriMesh(&B);\n  freeCorkTriMesh(&C);\n}\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::copyleft::cork::mesh_boolean<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, MeshBooleanType const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::copyleft::cork::mesh_boolean<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, igl::MeshBooleanType const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&);\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cork/mesh_boolean.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_CORK_MESH_BOOLEAN_H\n#define IGL_COPYLEFT_CORK_MESH_BOOLEAN_H\n#include \"../../MeshBooleanType.h\"\n#include \"../../igl_inline.h\"\n#include <Eigen/Core>\n#include <cork.h> // for consistent uint\n\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cork\n    {\n      // Compute a boolean operation on two input meshes using the cork library.\n      //\n      // Inputs:\n      //   VA  #VA by 3 list of vertex positions of first mesh\n      //   FA  #FA by 3 list of triangle indices into VA\n      //   VB  #VB by 3 list of vertex positions of second mesh\n      //   FB  #FB by 3 list of triangle indices into VB\n      //   type  of boolean operation see MeshBooleanType.h\n      // Outputs:\n      //   VC  #VC by 3 list of vertex positions of output mesh\n      //   FC  #FC by 3 list of triangle indices into VC\n      template <\n        typename DerivedVA,\n        typename DerivedFA,\n        typename DerivedVB,\n        typename DerivedFB,\n        typename DerivedVC,\n        typename DerivedFC>\n      IGL_INLINE void mesh_boolean(\n        const Eigen::PlainObjectBase<DerivedVA > & VA,\n        const Eigen::PlainObjectBase<DerivedFA > & FA,\n        const Eigen::PlainObjectBase<DerivedVB > & VB,\n        const Eigen::PlainObjectBase<DerivedFB > & FB,\n        const MeshBooleanType & type,\n        Eigen::PlainObjectBase<DerivedVC > & VC,\n        Eigen::PlainObjectBase<DerivedFC > & FC);\n    }\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"mesh_boolean.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cork/to_cork_mesh.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"to_cork_mesh.h\"\ntemplate <\n  typename DerivedV,\n  typename DerivedF>\nIGL_INLINE void igl::copyleft::cork::to_cork_mesh(\n  const Eigen::PlainObjectBase<DerivedV > & V,\n  const Eigen::PlainObjectBase<DerivedF > & F,\n  CorkTriMesh & mesh)\n{\n  using namespace std;\n  assert((F.cols() == 0 || F.cols() == 3) && \"Facets should be triangles.\");\n  assert((V.cols() == 0 || V.cols() == 3) && \"Vertices should be in 3D.\");\n  mesh.n_triangles = F.rows();\n  mesh.n_vertices = V.rows();\n  mesh.vertices = new float[mesh.n_vertices*3];\n  mesh.triangles = new uint[mesh.n_triangles*3];\n  for(size_t v = 0;v<mesh.n_vertices;v++)\n  {\n    for(size_t c = 0;c<3;c++)\n    {\n      mesh.vertices[v*3+c] = V(v,c);\n    }\n  }\n  for(size_t f = 0;f<mesh.n_triangles;f++)\n  {\n    for(size_t c = 0;c<3;c++)\n    {\n      mesh.triangles[f*3+c] = F(f,c);\n    }\n  }\n}\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::copyleft::cork::to_cork_mesh<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, CorkTriMesh&);\ntemplate void igl::copyleft::cork::to_cork_mesh<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, CorkTriMesh&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/cork/to_cork_mesh.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_CORK_TO_CORK_MESH_H\n#define IGL_COPYLEFT_CORK_TO_CORK_MESH_H\n#include \"../../igl_inline.h\"\n#include <cork.h>\n#include <Eigen/Core>\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace cork\n    {\n      // Convert a (V,F) mesh to a cork's triangle mesh representation.\n      //\n      // Inputs:\n      //   V  #V by 3 list of vertex positions\n      //   F  #F by 3 list of triangle indices into V\n      // Outputs:\n      //   mesh  cork representation of mesh\n      template <\n        typename DerivedV,\n        typename DerivedF>\n      IGL_INLINE void to_cork_mesh(\n        const Eigen::PlainObjectBase<DerivedV > & V,\n        const Eigen::PlainObjectBase<DerivedF > & F,\n        CorkTriMesh & mesh);\n    }\n  }\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"to_cork_mesh.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/marching_cubes.cpp",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                                IsoEx                                      *\n *        Copyright (C) 2002 by Computer Graphics Group, RWTH Aachen         *\n *                         www.rwth-graphics.de                              *\n *                                                                           *\n *---------------------------------------------------------------------------*\n *                                                                           *\n *                                License                                    *\n *                                                                           *\n *  This library is free software; you can redistribute it and/or modify it  *\n *  under the terms of the GNU Library General Public License as published   *\n *  by the Free Software Foundation, version 2.                              *\n *                                                                           *\n *  This library is distributed in the hope that it will be useful, but      *\n *  WITHOUT ANY WARRANTY; without even the implied warranty of               *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU        *\n *  Library General Public License for more details.                         *\n *                                                                           *\n *  You should have received a copy of the GNU Library General Public        *\n *  License along with this library; if not, write to the Free Software      *\n *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.                *\n *                                                                           *\n \\*===========================================================================*/\n\n#include \"marching_cubes.h\"\n#include \"marching_cubes_tables.h\"\n#include <map>\n\nextern const int edgeTable[256];\nextern const int triTable[256][2][17];\nextern const int polyTable[8][16];\n\nclass EdgeKey\n{\npublic:\n\n  EdgeKey(unsigned i0, unsigned i1) {\n    if (i0 < i1)  { i0_ = i0;  i1_ = i1; }\n    else            { i0_ = i1;  i1_ = i0; }\n  }\n\n  bool operator<(const EdgeKey& _rhs) const\n  {\n    if (i0_ != _rhs.i0_)\n      return (i0_ < _rhs.i0_);\n    else\n      return (i1_ < _rhs.i1_);\n  }\n\nprivate:\n  unsigned i0_, i1_;\n};\n\n\ntemplate <typename DerivedV1, typename DerivedV2, typename DerivedF>\nclass MarchingCubes\n{\n  typedef std::map<EdgeKey, unsigned>  MyMap;\n  typedef typename MyMap::const_iterator   MyMapIterator;\n\npublic:\n  MarchingCubes(\n                const Eigen::PlainObjectBase<DerivedV1> &values,\n                const Eigen::PlainObjectBase<DerivedV2> &points,\n                const unsigned x_res,\n                const unsigned y_res,\n                const unsigned z_res,\n                Eigen::PlainObjectBase<DerivedV2> &vertices,\n                Eigen::PlainObjectBase<DerivedF> &faces)\n  {\n    assert(values.cols() == 1);\n    assert(points.cols() == 3);\n\n    if(x_res <2 || y_res<2 ||z_res<2)\n      return;\n    faces.resize(10000,3);\n    int num_faces = 0;\n\n    vertices.resize(10000,3);\n    int num_vertices = 0;\n\n\n    unsigned n_cubes  = (x_res-1) * (y_res-1) * (z_res-1);\n    assert(unsigned(points.rows()) == x_res * y_res * z_res);\n\n    unsigned int         offsets_[8];\n    offsets_[0] = 0;\n    offsets_[1] = 1;\n    offsets_[2] = 1 + x_res;\n    offsets_[3] =     x_res;\n    offsets_[4] =             x_res*y_res;\n    offsets_[5] = 1         + x_res*y_res;\n    offsets_[6] = 1 + x_res + x_res*y_res;\n    offsets_[7] =     x_res + x_res*y_res;\n\n    for (unsigned cube_it =0 ; cube_it < n_cubes; ++cube_it)\n    {\n\n      unsigned         corner[8];\n      typename DerivedF::Scalar samples[12];\n      unsigned char    cubetype(0);\n      unsigned int     i;\n\n\n      // get point indices of corner vertices\n      for (i=0; i<8; ++i)\n      {\n        // get cube coordinates\n        unsigned int _idx = cube_it;\n        unsigned int X(x_res-1), Y(y_res-1);\n        unsigned int x = _idx % X;  _idx /= X;\n        unsigned int y = _idx % Y;  _idx /= Y;\n        unsigned int z = _idx;\n\n        // transform to point coordinates\n        _idx = x + y*x_res + z*x_res*y_res;\n\n        // add offset\n        corner[i] = _idx + offsets_[i];\n      }\n\n\n      // determine cube type\n      for (i=0; i<8; ++i)\n        if (values[corner[i]] > 0.0)\n          cubetype |= (1<<i);\n\n\n      // trivial reject ?\n      if (cubetype == 0 || cubetype == 255)\n        continue;\n\n\n      // compute samples on cube's edges\n      if (edgeTable[cubetype]&1)\n        samples[0]  = add_vertex(values, points, corner[0], corner[1], vertices, num_vertices, edge2vertex);\n      if (edgeTable[cubetype]&2)\n        samples[1]  = add_vertex(values, points, corner[1], corner[2], vertices, num_vertices, edge2vertex);\n      if (edgeTable[cubetype]&4)\n        samples[2]  = add_vertex(values, points, corner[3], corner[2], vertices, num_vertices, edge2vertex);\n      if (edgeTable[cubetype]&8)\n        samples[3]  = add_vertex(values, points, corner[0], corner[3], vertices, num_vertices, edge2vertex);\n      if (edgeTable[cubetype]&16)\n        samples[4]  = add_vertex(values, points, corner[4], corner[5], vertices, num_vertices, edge2vertex);\n      if (edgeTable[cubetype]&32)\n        samples[5]  = add_vertex(values, points, corner[5], corner[6], vertices, num_vertices, edge2vertex);\n      if (edgeTable[cubetype]&64)\n        samples[6]  = add_vertex(values, points, corner[7], corner[6], vertices, num_vertices, edge2vertex);\n      if (edgeTable[cubetype]&128)\n        samples[7]  = add_vertex(values, points, corner[4], corner[7], vertices, num_vertices, edge2vertex);\n      if (edgeTable[cubetype]&256)\n        samples[8]  = add_vertex(values, points, corner[0], corner[4], vertices, num_vertices, edge2vertex);\n      if (edgeTable[cubetype]&512)\n        samples[9]  = add_vertex(values, points, corner[1], corner[5], vertices, num_vertices, edge2vertex);\n      if (edgeTable[cubetype]&1024)\n        samples[10] = add_vertex(values, points, corner[2], corner[6], vertices, num_vertices, edge2vertex);\n      if (edgeTable[cubetype]&2048)\n        samples[11] = add_vertex(values, points, corner[3], corner[7], vertices, num_vertices, edge2vertex);\n\n\n\n      // connect samples by triangles\n      for (i=0; triTable[cubetype][0][i] != -1; i+=3 )\n      {\n        num_faces++;\n        if (num_faces > faces.rows())\n          faces.conservativeResize(faces.rows()+10000, Eigen::NoChange);\n\n        faces.row(num_faces-1) <<\n        samples[triTable[cubetype][0][i  ]],\n        samples[triTable[cubetype][0][i+1]],\n        samples[triTable[cubetype][0][i+2]];\n\n      }\n\n    }\n\n    vertices.conservativeResize(num_vertices, Eigen::NoChange);\n    faces.conservativeResize(num_faces, Eigen::NoChange);\n\n  };\n\n  static typename DerivedF::Scalar  add_vertex(const Eigen::PlainObjectBase<DerivedV1> &values,\n                                               const Eigen::PlainObjectBase<DerivedV2> &points,\n                                               unsigned int i0,\n                                               unsigned int i1,\n                                               Eigen::PlainObjectBase<DerivedV2> &vertices,\n                                               int &num_vertices,\n                                               MyMap &edge2vertex)\n  {\n    // find vertex if it has been computed already\n    MyMapIterator it = edge2vertex.find(EdgeKey(i0, i1));\n    if (it != edge2vertex.end())\n      return it->second;\n    ;\n\n    // generate new vertex\n    const Eigen::Matrix<typename DerivedV2::Scalar, 1, 3> & p0 = points.row(i0);\n    const Eigen::Matrix<typename DerivedV2::Scalar, 1, 3> & p1 = points.row(i1);\n\n    typename DerivedV1::Scalar s0 = fabs(values[i0]);\n    typename DerivedV1::Scalar s1 = fabs(values[i1]);\n    typename DerivedV1::Scalar t  = s0 / (s0+s1);\n\n\n    num_vertices++;\n    if (num_vertices > vertices.rows())\n      vertices.conservativeResize(vertices.rows()+10000, Eigen::NoChange);\n\n    vertices.row(num_vertices-1)  = (1.0f-t)*p0 + t*p1;\n    edge2vertex[EdgeKey(i0, i1)] = num_vertices-1;\n\n    return num_vertices-1;\n  }\n  ;\n\n  // maps an edge to the sample vertex generated on it\n  MyMap  edge2vertex;\n};\n\n\ntemplate <typename DerivedV1, typename DerivedV2, typename DerivedF>\nIGL_INLINE void igl::copyleft::marching_cubes(\n  const Eigen::PlainObjectBase<DerivedV1> &values,\n  const Eigen::PlainObjectBase<DerivedV2> &points,\n  const unsigned x_res,\n  const unsigned y_res,\n  const unsigned z_res,\n  Eigen::PlainObjectBase<DerivedV2> &vertices,\n  Eigen::PlainObjectBase<DerivedF> &faces)\n{\n  MarchingCubes<DerivedV1, DerivedV2, DerivedF> mc(values,\n                                       points,\n                                       x_res,\n                                       y_res,\n                                       z_res,\n                                       vertices,\n                                       faces);\n}\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::copyleft::marching_cubes<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, unsigned int, unsigned int, unsigned int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/marching_cubes.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_MARCHINGCUBES_H\n#define IGL_COPYLEFT_MARCHINGCUBES_H\n#include \"../igl_inline.h\"\n\n#include <Eigen/Core>\nnamespace igl\n{\n  namespace copyleft\n  {\n    // marching_cubes( values, points, x_res, y_res, z_res, vertices, faces )\n    //\n    // performs marching cubes reconstruction on the grid defined by values, and\n    // points, and generates vertices and faces\n    //\n    // Input:\n    //  values  #number_of_grid_points x 1 array -- the scalar values of an\n    //    implicit function defined on the grid points (<0 in the inside of the\n    //    surface, 0 on the border, >0 outside)\n    //  points  #number_of_grid_points x 3 array -- 3-D positions of the grid\n    //    points, ordered in x,y,z order:\n    //      points[index] = the point at (x,y,z) where :\n    //      x = (index % (xres -1),\n    //      y = (index / (xres-1)) %(yres-1),\n    //      z = index / (xres -1) / (yres -1) ).\n    //      where x,y,z index x, y, z dimensions\n    //      i.e. index = x + y*xres + z*xres*yres\n    //  xres  resolutions of the grid in x dimension\n    //  yres  resolutions of the grid in y dimension\n    //  zres  resolutions of the grid in z dimension\n    // Output:\n    //   vertices  #V by 3 list of mesh vertex positions\n    //   faces  #F by 3 list of mesh triangle indices\n    //\n    template <typename DerivedV1, typename DerivedV2, typename DerivedF>\n      IGL_INLINE void marching_cubes(\n        const Eigen::PlainObjectBase<DerivedV1> &values,\n        const Eigen::PlainObjectBase<DerivedV2> &points,\n        const unsigned x_res,\n        const unsigned y_res,\n        const unsigned z_res,\n        Eigen::PlainObjectBase<DerivedV2> &vertices,\n        Eigen::PlainObjectBase<DerivedF> &faces);\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"marching_cubes.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/marching_cubes_tables.h",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                                IsoEx                                      *\n *        Copyright (C) 2002 by Computer Graphics Group, RWTH Aachen         *\n *                         www.rwth-graphics.de                              *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *                                                                           *\n *                                License                                    *\n *                                                                           *\n *  This library is free software; you can redistribute it and/or modify it  *\n *  under the terms of the GNU Library General Public License as published   *\n *  by the Free Software Foundation, version 2.                              *\n *                                                                           *\n *  This library is distributed in the hope that it will be useful, but      *\n *  WITHOUT ANY WARRANTY; without even the implied warranty of               *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU        *\n *  Library General Public License for more details.                         *\n *                                                                           *\n *  You should have received a copy of the GNU Library General Public        *\n *  License along with this library; if not, write to the Free Software      *\n *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.                *\n *                                                                           *\n \\*===========================================================================*/\n\n//=============================================================================\n#ifndef IGL_ISOEX_MC_TABLES_HH\n#define IGL_ISOEX_MC_TABLES_HH\n//=============================================================================\n\n\n//int edgeTable[256];\n//int triTable[256][2][17];\n//int polyTable[8][16];\n\nconst int edgeTable[256]=\n{\n  0x0  , 0x109, 0x203, 0x30a, 0x406, 0x50f, 0x605, 0x70c,\n  0x80c, 0x905, 0xa0f, 0xb06, 0xc0a, 0xd03, 0xe09, 0xf00,\n  0x190, 0x99 , 0x393, 0x29a, 0x596, 0x49f, 0x795, 0x69c,\n  0x99c, 0x895, 0xb9f, 0xa96, 0xd9a, 0xc93, 0xf99, 0xe90,\n  0x230, 0x339, 0x33 , 0x13a, 0x636, 0x73f, 0x435, 0x53c,\n  0xa3c, 0xb35, 0x83f, 0x936, 0xe3a, 0xf33, 0xc39, 0xd30,\n  0x3a0, 0x2a9, 0x1a3, 0xaa , 0x7a6, 0x6af, 0x5a5, 0x4ac,\n  0xbac, 0xaa5, 0x9af, 0x8a6, 0xfaa, 0xea3, 0xda9, 0xca0,\n  0x460, 0x569, 0x663, 0x76a, 0x66 , 0x16f, 0x265, 0x36c,\n  0xc6c, 0xd65, 0xe6f, 0xf66, 0x86a, 0x963, 0xa69, 0xb60,\n  0x5f0, 0x4f9, 0x7f3, 0x6fa, 0x1f6, 0xff , 0x3f5, 0x2fc,\n  0xdfc, 0xcf5, 0xfff, 0xef6, 0x9fa, 0x8f3, 0xbf9, 0xaf0,\n  0x650, 0x759, 0x453, 0x55a, 0x256, 0x35f, 0x55 , 0x15c,\n  0xe5c, 0xf55, 0xc5f, 0xd56, 0xa5a, 0xb53, 0x859, 0x950,\n  0x7c0, 0x6c9, 0x5c3, 0x4ca, 0x3c6, 0x2cf, 0x1c5, 0xcc ,\n  0xfcc, 0xec5, 0xdcf, 0xcc6, 0xbca, 0xac3, 0x9c9, 0x8c0,\n  0x8c0, 0x9c9, 0xac3, 0xbca, 0xcc6, 0xdcf, 0xec5, 0xfcc,\n  0xcc , 0x1c5, 0x2cf, 0x3c6, 0x4ca, 0x5c3, 0x6c9, 0x7c0,\n  0x950, 0x859, 0xb53, 0xa5a, 0xd56, 0xc5f, 0xf55, 0xe5c,\n  0x15c, 0x55 , 0x35f, 0x256, 0x55a, 0x453, 0x759, 0x650,\n  0xaf0, 0xbf9, 0x8f3, 0x9fa, 0xef6, 0xfff, 0xcf5, 0xdfc,\n  0x2fc, 0x3f5, 0xff , 0x1f6, 0x6fa, 0x7f3, 0x4f9, 0x5f0,\n  0xb60, 0xa69, 0x963, 0x86a, 0xf66, 0xe6f, 0xd65, 0xc6c,\n  0x36c, 0x265, 0x16f, 0x66 , 0x76a, 0x663, 0x569, 0x460,\n  0xca0, 0xda9, 0xea3, 0xfaa, 0x8a6, 0x9af, 0xaa5, 0xbac,\n  0x4ac, 0x5a5, 0x6af, 0x7a6, 0xaa , 0x1a3, 0x2a9, 0x3a0,\n  0xd30, 0xc39, 0xf33, 0xe3a, 0x936, 0x83f, 0xb35, 0xa3c,\n  0x53c, 0x435, 0x73f, 0x636, 0x13a, 0x33 , 0x339, 0x230,\n  0xe90, 0xf99, 0xc93, 0xd9a, 0xa96, 0xb9f, 0x895, 0x99c,\n  0x69c, 0x795, 0x49f, 0x596, 0x29a, 0x393, 0x99 , 0x190,\n  0xf00, 0xe09, 0xd03, 0xc0a, 0xb06, 0xa0f, 0x905, 0x80c,\n  0x70c, 0x605, 0x50f, 0x406, 0x30a, 0x203, 0x109, 0x0   \n};\n\n\n//-----------------------------------------------------------------------------\n\n\nconst int triTable[256][2][17] =\n{{{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n  { 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 3, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 3, 0,  1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 8, 3, 9, 8, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4, 1, 9, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 3, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 8, 3, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 3, 3, 0, 8,  3,  1,  2, 10, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 2, 10, 0, 2, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4, 2, 10, 9, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{2, 8, 3, 2, 10, 8, 10, 9, 8, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 10,  9, 8,  3, 2 , -1,-1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1,  3, 3, 11,  2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 11, 2, 8, 11, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1,  4, 0, 8, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 10 */\n  {{1, 9, 0, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 3, 3, 1, 9, 0, 2, 3,11, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 11, 2, 1, 9, 11, 9, 8, 11, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1,  5, 9, 8, 11, 2, 1,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{3, 10, 1, 11, 10, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1,  4, 3, 11,10, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 10, 1, 0, 8, 10, 8, 11, 10, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1,  5, 8, 11, 10, 1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{3, 9, 0, 3, 11, 9, 11, 10, 9, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 11,10,  9, 0, 3, -1,-1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 15 */\n  {{9, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4,  8, 11, 10, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 3, 4,  7,  8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{4, 3, 0, 7, 3, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4, 4, 7, 3, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 1, 9, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 3, 3, 0, 1, 9,  8,  4,  7, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{4, 1, 9, 4, 7, 1, 7, 3, 1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 7, 3, 1, 9, 4,  -1,-1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 20 */\n  {{1, 2, 10, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 3,  3, 1, 2,10,  8,  4,  7, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{3, 4, 7, 3, 0, 4, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 4, 3, 3, 0, 4, 7, 1,  2, 10, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 2, 10, 9, 0, 2, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 4,  3, 2,10, 9, 0, 8, 4,  7, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{2, 10, 9, 2, 9, 7, 2, 7, 3, 7, 9, 4, -1, -1, -1, -1, -1},\n    {1,  6, 7, 3, 2,10, 9, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{8, 4, 7, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 3, 3, 8,  4, 7,  3, 11,  2, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 25 */\n  {{11, 4, 7, 11, 2, 4, 2, 0, 4, -1, -1, -1, -1, -1, -1, -1, -1},\n    { 1, 5, 2, 0,  4, 7,11,-1,-1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 0, 1, 8, 4, 7, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1},\n    {3, 3, 3, 3, 9, 0, 1, 8,  4,  7,  2,  3, 11, -1, -1, -1, -1}},\n  \n  {{4, 7, 11, 9, 4, 11, 9, 11, 2, 9, 2, 1, -1, -1, -1, -1, -1},\n    {2, 4, 4, 2, 1, 9, 11, 11,9,4,7, -1, -1, -1, -1, -1 ,-1}},\n  \n  {{3, 10, 1, 3, 11, 10, 7, 8, 4, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2,  4, 3, 3, 11,10, 1,  7, 8,  4, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 11, 10, 1, 4, 11, 1, 0, 4, 7, 11, 4, -1, -1, -1, -1, -1},\n    {1,  6,  1, 0, 4,  7,11,10, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 30 */\n  {{4, 7, 8, 9, 0, 11, 9, 11, 10, 11, 0, 3, -1, -1, -1, -1, -1},\n    {2, 3, 5, 4, 7,  8, 0,  3, 11, 10, 9, -1, -1, -1, -1, -1, -1}},\n  \n  {{4, 7, 11, 4, 11, 9, 9, 11, 10, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5,  4,  7,11,10, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 3, 9,  5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 5, 4, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 3, 3, 9, 5, 4,  0,  8,  3, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 5, 4, 1, 5, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4, 0, 1, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 35 */\n  {{8, 5, 4, 8, 3, 5, 3, 1, 5, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 3, 1, 5, 4, 8,-1,-1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 2, 10, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 3,  3, 1, 2,10,  9,  5,  4, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{3, 0, 8, 1, 2, 10, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1, -1},\n    {3, 3, 3, 3, 3,  0, 8, 1, 2, 10,  4,  9,  5, -1, -1, -1, -1}},\n  \n  {{5, 2, 10, 5, 4, 2, 4, 0, 2, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5,  4, 0, 2,10, 5,-1,-1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{2, 10, 5, 3, 2, 5, 3, 5, 4, 3, 4, 8, -1, -1, -1, -1, -1},\n    {2,  4, 4, 2, 10, 5, 3, 4, 8, 3, 5, -1, -1, -1, -1, -1, -1}},\n  \n  /* 40 */\n  {{9, 5, 4, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 3, 3, 9, 5,  4,  2,  3, 11, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 11, 2, 0, 8, 11, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2,  4, 3, 0, 8, 11, 2, 4, 9,  5, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 5, 4, 0, 1, 5, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 4, 3, 0, 1, 5, 4, 2,  3, 11, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{2, 1, 5, 2, 5, 8, 2, 8, 11, 4, 8, 5, -1, -1, -1, -1, -1},\n    {1, 6, 2, 1, 5, 4, 8,11, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{10, 3, 11, 10, 1, 3, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1},\n    { 2, 4,  3,  3,11,10, 1, 9, 5,  4, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 45 */\n  {{4, 9, 5, 0, 8, 1, 8, 10, 1, 8, 11, 10, -1, -1, -1, -1, -1},\n    {2, 3, 5, 4, 9, 5, 1,  0, 8,11, 10, -1, -1, -1, -1, -1, -1}},\n  \n  {{5, 4, 0, 5, 0, 11, 5, 11, 10, 11, 0, 3, -1, -1, -1, -1, -1},\n    {1, 6, 5, 4, 0,  3,11, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{5, 4, 8, 5, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 5, 4, 8, 11, 10,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 7, 8, 5, 7, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4, 7, 8, 9, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 3, 0, 9, 5, 3, 5, 7, 3, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 5, 7, 3, 0, 9,-1,-1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 50 */\n  {{0, 7, 8, 0, 1, 7, 1, 5, 7, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 1, 5, 7, 8, 0,-1,-1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4, 3, 1, 5, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 7, 8, 9, 5, 7, 10, 1, 2, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 4, 3, 7, 8, 9,  5,10, 1,  2, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{10, 1, 2, 9, 5, 0, 5, 3, 0, 5, 7, 3, -1, -1, -1, -1, -1},\n    { 2, 3, 5,10, 1, 2, 0, 9, 5, 7, 3,-1, -1, -1, -1, -1, -1}},\n  \n  {{8, 0, 2, 8, 2, 5, 8, 5, 7, 10, 5, 2, -1, -1, -1, -1, -1},\n    {1, 6, 2,10, 5, 7, 8, 0,-1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 55 */\n  {{2, 10, 5, 2, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1,  5, 2,10, 5, 7, 3,-1,-1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{7, 9, 5, 7, 8, 9, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 4, 3, 7, 8, 9, 5,  3,11,  2, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 5, 7, 9, 7, 2, 9, 2, 0, 2, 7, 11, -1, -1, -1, -1, -1},\n    {1, 6, 2, 0, 9, 5, 7,11, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{2, 3, 11, 0, 1, 8, 1, 7, 8, 1, 5, 7, -1, -1, -1, -1, -1},\n    {2, 3,  5, 2, 3,11, 8, 0, 1, 5, 7, -1, -1, -1, -1, -1, -1}},\n  \n  {{11, 2, 1, 11, 1, 7, 7, 1, 5, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1,  5,11, 2, 1, 5, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 60 */\n  {{9, 5, 8, 8, 5, 7, 10, 1, 3, 10, 3, 11, -1, -1, -1, -1, -1},\n    {2, 4, 4, 3,11, 10, 1, 5, 7,  8, 9, -1, -1, -1, -1, -1, -1}},\n  \n  {{5, 7, 0, 5, 0, 9, 7, 11, 0, 1, 0, 10, 11, 10, 0, -1, -1},\n    {1, 7, 5, 7, 11,10, 1, 0, 9, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{11, 10, 0, 11, 0, 3, 10, 5, 0, 8, 0, 7, 5, 7, 0, -1, -1},\n    {1, 7, 11,10,5, 7, 8, 0,3, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{11, 10, 5, 7, 11, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    { 1,  4, 5, 7, 11,10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    { 1, 3,10,  6,  5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 65 */\n  {{0, 8, 3, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 3, 3, 0,  8, 3,  5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 0, 1, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 3, 3, 9,  0, 1,  5, 10,  6, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 8, 3, 1, 9, 8, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 4, 3, 1, 9, 8, 3,  5,10,  6, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 6, 5, 2, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4, 1, 2, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 6, 5, 1, 2, 6, 3, 0, 8, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 4, 3, 1, 2, 6, 5, 3, 0,  8, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 70 */\n  {{9, 6, 5, 9, 0, 6, 0, 2, 6, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 0, 2, 6, 5, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{5, 9, 8, 5, 8, 2, 5, 2, 6, 3, 2, 8, -1, -1, -1, -1, -1},\n    {1, 6, 2, 6, 5, 9, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{2, 3, 11, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 3,  3,  2, 3,11, 10,  6,  5, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{11, 0, 8, 11, 2, 0, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1},\n    { 2, 4, 3,  0, 8, 11, 2, 10, 6,  5, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 1, 9, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1},\n    {3, 3, 3, 3, 0,  1, 9,  2, 3, 11,  5, 10,  6, -1, -1, -1, -1}},\n  \n  /* 75 */\n  {{5, 10, 6, 1, 9, 2, 9, 11, 2, 9, 8, 11, -1, -1, -1, -1, -1},\n    {2, 3,  5, 5,10, 6, 2,  1, 9, 8,11, -1, -1, -1, -1, -1, -1}},\n  \n  {{6, 3, 11, 6, 5, 3, 5, 1, 3, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5,  5, 1, 3, 11,6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 8, 11, 0, 11, 5, 0, 5, 1, 5, 11, 6, -1, -1, -1, -1, -1},\n    {1, 6,  5, 1,  0, 8,11, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{3, 11, 6, 0, 3, 6, 0, 6, 5, 0, 5, 9, -1, -1, -1, -1, -1},\n    {2,  4, 4, 3, 11, 6, 0, 5, 9, 0, 6, -1, -1, -1, -1}},\n  \n  {{6, 5, 9, 6, 9, 11, 11, 9, 8, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 6, 5, 9,  8, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 80 */\n  {{5, 10, 6, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2,  3, 3, 5,10, 6,  4,  7,  8, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{4, 3, 0, 4, 7, 3, 6, 5, 10, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 4, 3, 4, 7, 3, 0, 6,  5, 10, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 9, 0, 5, 10, 6, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1},\n    {3, 3, 3, 3,  1, 9, 0, 5,10,  6,  8,  4,  7, -1, -1, -1, -1}},\n  \n  {{10, 6, 5, 1, 9, 7, 1, 7, 3, 7, 9, 4, -1, -1, -1, -1, -1},\n    { 2, 3, 5,10, 6, 5, 9, 4, 7, 3, 1,-1, -1, -1, -1, -1, -1}},\n  \n  {{6, 1, 2, 6, 5, 1, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 4, 3, 1, 2, 6, 5, 4, 7,  8, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 85 */\n  {{1, 2, 5, 5, 2, 6, 3, 0, 4, 3, 4, 7, -1, -1, -1, -1, -1},\n    {2, 4, 4, 2, 6, 5, 1, 3, 0, 4, 7, -1, -1, -1, -1, -1, -1}},\n  \n  {{8, 4, 7, 9, 0, 5, 0, 6, 5, 0, 2, 6, -1, -1, -1, -1, -1},\n    {2, 3, 5, 8, 4, 7, 5, 9, 0, 2, 6, -1, -1, -1, -1, -1, -1}},\n  \n  {{7, 3, 9, 7, 9, 4, 3, 2, 9, 5, 9, 6, 2, 6, 9, -1, -1},\n    {1, 7, 7, 3, 2, 6, 5, 9, 4,-1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{3, 11, 2, 7, 8, 4, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1},\n    {3,  3, 3, 3, 3,11,  2, 7, 8,  4, 10,  6,  5, -1, -1, -1, -1}},\n  \n  {{5, 10, 6, 4, 7, 2, 4, 2, 0, 2, 7, 11, -1, -1, -1, -1, -1},\n    {2,  3, 5, 5,10, 6, 7,11, 2, 0, 4, -1, -1, -1, -1, -1, -1}},\n  \n  /* 90 */\n  {{0, 1, 9, 4, 7, 8, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1, -1},\n    {4, 3, 3, 3, 3, 0, 1, 9,  4, 7,  8, 2,  3, 11, 5, 10, 6}},\n  \n  {{9, 2, 1, 9, 11, 2, 9, 4, 11, 7, 11, 4, 5, 10, 6, -1, -1},\n    {3, 4, 4, 3, 2, 1,  9,11, 4, 7, 11, 9, 5, 10, 6,  -1, -1}},\n  \n  {{8, 4, 7, 3, 11, 5, 3, 5, 1, 5, 11, 6, -1, -1, -1, -1, -1},\n    {2, 3, 5, 8,  4, 7, 11, 6, 5, 1, 3, -1, -1, -1, -1, -1, -1}},\n  \n  {{5, 1, 11, 5, 11, 6, 1, 0, 11, 7, 11, 4, 0, 4, 11, -1, -1},\n    {1, 7,  5, 1, 0,  4, 7,11, 6,  -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 5, 9, 0, 6, 5, 0, 3, 6, 11, 6, 3, 8, 4, 7, -1, -1},\n    {3, 4, 4, 3, 0, 6, 5, 9, 3, 11, 6, 0, 8, 4, 7, -1, -1}},\n  \n  /* 95 */\n  {{6, 5, 9, 6, 9, 11, 4, 7, 9, 7, 11, 9, -1, -1, -1, -1, -1},\n    {2, 4, 4, 9, 4, 7, 11, 6, 5, 9, 11,-1, -1, -1, -1, -1, -1}},\n  \n  {{10, 4, 9, 6, 4, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    { 1, 4, 4, 9, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{4, 10, 6, 4, 9, 10, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2,  4, 3, 4,  9,10, 6, 0, 8,  3, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{10, 0,  1, 10, 6, 0, 6, 4, 0, -1, -1, -1, -1, -1, -1, -1, -1},\n    { 1, 5,  6, 4, 0, 1, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{8, 3, 1, 8, 1, 6, 8, 6, 4, 6, 1, 10, -1, -1, -1, -1, -1},\n    {1, 6, 1,10, 6, 4, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 100 */\n  {{1, 4, 9, 1, 2, 4, 2, 6, 4, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 2, 6, 4, 9, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{3, 0, 8, 1, 2, 9, 2, 4, 9, 2, 6, 4, -1, -1, -1, -1, -1},\n    {2, 3, 5, 3, 0, 8, 9, 1, 2, 6, 4, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4, 2, 6, 4, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{8, 3, 2, 8, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 8, 3, 2, 6, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{10, 4, 9, 10, 6, 4, 11, 2, 3, -1, -1, -1, -1, -1, -1, -1, -1},\n    { 2, 4, 3, 10, 6, 4,  9,11, 2,  3, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 105 */\n  {{0, 8, 2, 2, 8, 11, 4, 9, 10, 4, 10, 6, -1, -1, -1, -1, -1},\n    {2, 4, 4, 2, 11, 8, 0, 10,  6, 4,  9, -1, -1, -1, -1, -1, -1}},\n  \n  {{3, 11, 2, 0, 1, 6, 0, 6, 4, 6, 1, 10, -1, -1, -1, -1, -1},\n    {2,  3, 5, 3,11, 2, 1, 10,6, 4, 0, -1, -1, -1, -1, -1, -1}},\n  \n  {{6, 4, 1, 6, 1, 10, 4, 8, 1, 2, 1, 11, 8, 11, 1, -1, -1},\n    {1, 7, 6, 4, 8,11, 2,  1,10, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 6, 4, 9, 3, 6, 9, 1, 3, 11, 6, 3, -1, -1, -1, -1, -1},\n    {1, 6, 3,11, 6, 4, 9, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{8, 11, 1, 8, 1, 0, 11, 6, 1, 9, 1, 4, 6, 4, 1, -1, -1},\n    {1,  7, 8,11, 6, 4,  9, 1, 0, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 110 */\n  {{3, 11, 6, 3, 6, 0, 0, 6, 4, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1,  5, 3,11, 6, 4, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{6, 4, 8, 11, 6, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4, 8, 11, 6, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{7, 10, 6, 7, 8, 10, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1,  5, 8,  9,10, 6, 7,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 7, 3, 0, 10,  7, 0, 9, 10, 6, 7, 10, -1, -1, -1, -1, -1},\n    {1, 6, 0, 9, 10,  6, 7, 3, -1,-1,-1, -1, -1, -1, -1, -1, -1}},\n  \n  {{10, 6, 7, 1, 10, 7, 1, 7,  8, 1, 8, 0, -1, -1, -1, -1, -1},\n    { 2, 4, 4, 8, 0, 1,  7, 10, 6, 7, 1,-1, -1, -1, -1, -1, -1}},\n  \n  /* 115 */\n  {{10, 6, 7, 10, 7, 1, 1, 7, 3, -1, -1, -1, -1, -1, -1, -1, -1},\n    { 1, 5, 10, 6, 7, 3, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 2, 6, 1, 6, 8, 1, 8, 9, 8, 6, 7, -1, -1, -1, -1, -1},\n    {1, 6, 1, 2, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{2, 6, 9, 2, 9, 1, 6, 7, 9, 0, 9, 3, 7, 3, 9, -1, -1},\n    {1, 7, 2, 6, 7, 3, 0, 9, 1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{7, 8, 0, 7, 0, 6, 6, 0, 2, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 7, 8, 0, 2, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{7, 3, 2, 6, 7, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4, 7, 3, 2, 6,  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 120 */\n  {{2, 3, 11, 10, 6, 8, 10, 8, 9, 8, 6, 7, -1, -1, -1, -1, -1},\n    {2, 3,  5,  2, 3,11,  6, 7, 8, 9,10, -1, -1, -1, -1, -1, -1}},\n  \n  {{2, 0, 7, 2, 7, 11, 0, 9, 7, 6, 7, 10, 9, 10, 7, -1, -1},\n    {1, 7, 2, 0, 9,10,6, 7, 11, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 8, 0, 1, 7, 8, 1, 10, 7, 6, 7, 10, 2, 3, 11, -1, -1},\n    {3, 4, 4, 3, 8, 0, 1, 7, 10, 6, 7, 1, 11, 2, 3, -1, -1}},\n  \n  {{11, 2, 1, 11, 1, 7, 10, 6, 1, 6, 7, 1, -1, -1, -1, -1, -1},\n    { 2, 4, 4, 11, 2,  1,7, 1, 10, 6, 7,-1, -1, -1, -1, -1, -1}},\n  \n  {{8, 9, 6, 8, 6, 7, 9, 1, 6, 11, 6, 3, 1, 3, 6, -1, -1},\n    {1, 7, 8, 9, 1, 3, 11, 6, 7,-1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 125 */\n  {{0, 9, 1, 11, 6, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 3, 3,  0, 9, 1, 11,  6,  7, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{7, 8, 0, 7, 0, 6, 3, 11, 0, 11, 6, 0, -1, -1, -1, -1, -1},\n    {2, 4, 4, 0, 3,11, 6, 7,  8, 0, 6, -1, -1, -1, -1, -1, -1}},\n  \n  {{7, 11, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 3,  7, 11,  6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 3,  7,  6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{3, 0, 8, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 3, 3,  3, 0, 8, 11,  7,  6, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 130 */\n  {{0, 1, 9, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 3, 3,  0, 1, 9, 11,  7,  6, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{8, 1, 9, 8, 3, 1, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 4, 3, 1, 9,  8, 3,11, 7,  6, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{10, 1, 2, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    { 2, 3, 3,10,  1, 2,  6, 11,  7, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 2, 10, 3, 0, 8, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1, -1},\n    {3, 3,  3, 3, 1, 2,10,  3, 0,  8,  6, 11,  7, -1, -1, -1, -1}},\n  \n  {{2, 9, 0, 2, 10, 9, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 4, 3, 2, 10, 9, 0, 6, 11,  7, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 135 */\n  {{6, 11, 7, 2, 10, 3, 10, 8, 3, 10, 9, 8, -1, -1, -1, -1, -1},\n    {2,  3, 5, 6, 11, 7,  3, 2,10,  9, 8, -1, -1, -1, -1, -1, -1}},\n  \n  {{7, 2, 3, 6, 2, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4, 2, 3, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{7, 0, 8, 7, 6, 0, 6, 2, 0, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 6, 2, 0, 8, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{2, 7, 6, 2, 3, 7, 0, 1, 9, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 4, 3, 2, 3, 7, 6, 0, 1,  9, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 6, 2, 1, 8, 6, 1, 9, 8, 8, 7, 6, -1, -1, -1, -1, -1},\n    {1, 6, 6, 2, 1, 9, 8, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 140 */\n  {{10, 7, 6, 10, 1, 7, 1, 3, 7, -1, -1, -1, -1, -1, -1, -1, -1},\n    { 1, 5, 1,  3, 7, 6,10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{10, 7, 6, 1, 7, 10, 1, 8, 7, 1, 0, 8, -1, -1, -1, -1, -1},\n    { 2, 4, 4, 10, 1, 7, 6,  8, 7, 1, 0,-1, -1, -1, -1, -1, -1}},\n  \n  {{0, 3, 7, 0, 7, 10, 0, 10, 9, 6, 10, 7, -1, -1, -1, -1, -1},\n    {1, 6,10, 9, 0, 3,  7, 6,-1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{7, 6, 10, 7, 10, 8, 8, 10, 9, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5,  7, 6, 10, 9, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{6, 8, 4, 11, 8, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4, 6, 11, 8, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 145 */\n  {{3, 6, 11, 3, 0, 6, 0, 4, 6, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5,  0, 4, 6,11, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{8, 6, 11, 8, 4, 6, 9, 0, 1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 4,  3, 6,11, 8, 4, 9, 0,  1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 4, 6, 9, 6, 3, 9, 3, 1, 11, 3, 6, -1, -1, -1, -1, -1},\n    {1, 6, 6,11, 3, 1, 9, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{6, 8, 4, 6, 11, 8, 2, 10,  1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 4, 3, 6, 11, 8, 4,  2, 10,  1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 2, 10, 3, 0, 11, 0, 6, 11, 0, 4, 6, -1, -1, -1, -1, -1},\n    {2, 3,  5, 1, 2, 10,11, 3,0,4, 6, -1, -1, -1, -1, -1, -1}},\n  \n  /* 150 */\n  {{4, 11, 8, 4, 6, 11, 0, 2, 9, 2, 10, 9, -1, -1, -1, -1, -1},\n    {2,  4, 4, 4, 6, 11, 8, 2,10, 9,  0, -1, -1, -1, -1, -1, -1}},\n  \n  {{10, 9, 3, 10, 3, 2, 9, 4, 3, 11, 3, 6, 4, 6, 3, -1, -1},\n    {1,  7, 10,9, 4, 6, 11, 3, 2, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{8, 2, 3, 8, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 4, 6, 2, 3, 8,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4, 4, 6, 2, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 9, 0, 2, 3, 4, 2, 4, 6, 4, 3, 8, -1, -1, -1, -1, -1},\n    {2, 3, 5, 1, 9, 0, 3, 8, 4, 6, 2, -1, -1, -1, -1, -1, -1}},\n  \n  /* 155 */\n  {{1, 9, 4, 1, 4, 2, 2, 4, 6, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 1, 9, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{8, 1, 3, 8, 6, 1, 8, 4, 6, 6, 10, 1, -1, -1, -1, -1, -1},\n    {1, 6, 1, 3, 8, 4, 6,10, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{10, 1, 0, 10, 0, 6, 6, 0, 4, -1, -1, -1, -1, -1, -1, -1, -1},\n    { 1, 5,10, 1,0,4,6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{4, 6, 3, 4, 3, 8, 6, 10, 3, 0, 3, 9, 10, 9, 3, -1, -1},\n    {1, 7, 4, 6, 10, 9, 0,3, 8, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{10, 9, 4, 6, 10, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    { 1, 4, 4, 6, 10, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 160 */\n  {{4, 9, 5, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 3, 3, 4, 9,  5,  7,  6, 11, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 8, 3, 4, 9, 5, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1},\n    {3, 3, 3, 3, 0, 8,  3, 4, 9,  5, 11,  7,  6, -1, -1, -1, -1}},\n  \n  {{5, 0, 1, 5, 4, 0, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 4, 3, 0, 1, 5, 4, 7,  6, 11, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{11, 7, 6, 8, 3, 4, 3, 5, 4, 3, 1, 5, -1, -1, -1, -1, -1},\n    { 2, 3, 5,11, 7, 6, 4, 8, 3, 1, 5,-1, -1, -1, -1, -1, -1}},\n  \n  {{9, 5, 4, 10, 1, 2, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1},\n    {3, 3, 3,  3, 9, 5, 4,10,  1,  2,  7,  6, 11, -1, -1, -1, -1}},\n  \n  /* 165 */\n  {{6, 11, 7, 1, 2, 10, 0, 8, 3, 4, 9, 5, -1, -1, -1, -1, -1},\n    {4,  3, 3, 3, 3,  6,11, 7, 1, 2,10, 0,  8,  3,  4,  9, 5}},\n  \n  {{7, 6, 11, 5, 4, 10, 4, 2, 10, 4, 0, 2, -1, -1, -1, -1, -1},\n    {2, 3, 5,  7, 6, 11, 10, 5, 4, 0, 2,-1, -1, -1, -1, -1, -1}},\n  \n  {{3, 4, 8, 3, 5, 4, 3, 2, 5, 10, 5, 2, 11, 7, 6, -1, -1},\n    {3, 4, 4, 3, 5, 3, 2,10, 4, 8, 3, 5, 6, 11, 7, 6, -1}},\n  \n  {{7, 2, 3, 7, 6, 2, 5, 4, 9, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 4, 3, 2, 3, 7, 6, 5, 4,  9, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 5, 4, 0, 8, 6, 0, 6, 2, 6, 8, 7, -1, -1, -1, -1, -1},\n    {2, 3, 5, 9, 5, 4, 8, 7, 6, 2, 0, -1, -1, -1, -1, -1, -1}},\n  \n  /* 170 */\n  {{3, 6, 2, 3, 7, 6, 1, 5, 0, 5, 4, 0, -1, -1, -1, -1, -1},\n    {2, 4, 4, 3, 7, 6, 2, 0, 1, 5, 4, -1, -1, -1, -1, -1, -1}},\n  \n  {{6, 2, 8, 6, 8, 7, 2, 1, 8, 4, 8, 5, 1, 5, 8, -1, -1},\n    {1, 7, 6, 2, 1, 5, 4, 8, 7,-1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 5, 4, 10, 1, 6, 1, 7, 6, 1, 3, 7, -1, -1, -1, -1, -1},\n    {2, 3, 5,  9, 5, 4, 6,10, 1, 3, 7,-1, -1, -1, -1, -1, -1}},\n  \n  {{1, 6, 10, 1, 7, 6, 1, 0, 7, 8, 7, 0, 9, 5, 4, -1, -1},\n    {3, 4, 4, 3, 0, 8, 7, 1, 6, 10, 1, 7, 9, 5, 4, -1, -1}},\n  \n  {{4, 0, 10, 4, 10, 5, 0, 3, 10, 6, 10, 7, 3, 7, 10, -1, -1},\n    {1, 7,  4, 0, 3, 7, 6, 10, 5, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 175 */\n  {{7, 6, 10, 7, 10, 8, 5, 4, 10, 4, 8, 10, -1, -1, -1, -1, -1},\n    {2, 4, 4, 4,  8, 10, 5, 7,  6,10, 8, -1, -1, -1, -1, -1, -1}},\n  \n  {{6, 9, 5, 6, 11, 9, 11, 8, 9, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5,11, 8, 9, 5, 6,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{3, 6, 11, 0, 6, 3, 0, 5, 6, 0, 9, 5, -1, -1, -1, -1, -1},\n    {2, 4, 4,  0, 9, 5, 6, 6,11, 3, 0, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 11, 8, 0, 5, 11, 0, 1, 5, 5, 6, 11, -1, -1, -1, -1, -1},\n    {1,  6, 0, 1, 5,  6,11, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{6, 11, 3, 6, 3, 5, 5, 3, 1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1,  5, 6,11, 3, 1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /*180 */\n  {{1, 2, 10, 9, 5, 11, 9, 11, 8, 11, 5, 6, -1, -1, -1, -1, -1},\n    {2, 3,  5, 1, 2, 10, 5,  6,11,  8, 9, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 11, 3, 0, 6, 11, 0, 9, 6, 5, 6, 9, 1, 2, 10, -1, -1},\n    {3,  4, 4, 3, 11, 3,0, 6, 9, 5, 6, 0, 2, 10, 1, 2, 10}},\n  \n  {{11, 8, 5, 11, 5, 6, 8, 0, 5, 10, 5, 2, 0, 2, 5, -1, -1},\n    { 1, 7,11, 8, 0, 2,10, 5, 6,-1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{6, 11, 3, 6, 3, 5, 2, 10, 3, 10, 5, 3, -1, -1, -1, -1, -1},\n    {2, 4,  4, 6,11, 3, 5, 10, 5,  3, 2, -1, -1, -1, -1, -1, -1}},\n  \n  {{5, 8, 9, 5, 2, 8, 5, 6, 2, 3, 8, 2, -1, -1, -1, -1, -1},\n    {1, 6, 2, 3, 8, 9, 5, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 185 */\n  {{9, 5, 6, 9, 6, 0, 0, 6, 2, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 9, 5, 6, 2, 0,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 5, 8, 1, 8, 0, 5, 6, 8, 3, 8, 2, 6, 2, 8, -1, -1},\n    {1, 7, 1, 5, 6, 2, 3, 8, 0, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 5, 6, 2, 1, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4, 1, 5, 6, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 3, 6, 1, 6, 10, 3, 8, 6, 5, 6, 9, 8, 9, 6, -1, -1},\n    {1, 7, 1, 3, 8,  9, 5, 6,10, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{10, 1, 0, 10, 0, 6, 9, 5, 0, 5, 6, 0, -1, -1, -1, -1, -1},\n    { 2, 4, 4, 5,  6, 0, 9, 10, 1, 0, 6, -1, -1, -1, -1, -1, -1}},\n  \n  /* 190 */\n  {{0, 3, 8, 5, 6, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 3, 3, 0, 3,  8,  5,  6, 10, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{10, 5, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    { 1, 3,10,  5,  6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{11, 5, 10, 7, 5, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    { 1, 4,  5,10, 11, 7,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{11, 5, 10, 11, 7, 5, 8, 3, 0, -1, -1, -1, -1, -1, -1, -1, -1},\n    { 2, 4,  3,  5,10,11, 7, 8, 3,  0, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{5, 11, 7, 5, 10, 11, 1, 9, 0, -1, -1, -1, -1, -1, -1, -1, -1},\n    { 2, 4, 3, 5, 10, 11, 7, 1, 9,  0, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 195 */\n  {{10, 7, 5, 10, 11, 7, 9, 8, 1, 8, 3, 1, -1, -1, -1, -1, -1},\n    { 2, 4, 4, 10, 11, 7, 5, 1, 9, 8, 3, -1, -1, -1, -1, -1, -1}},\n  \n  {{11, 1, 2, 11, 7, 1, 7, 5, 1, -1, -1, -1, -1, -1, -1, -1, -1},\n    { 1, 5, 7, 5, 1, 2,11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 8, 3, 1, 2, 7, 1, 7, 5, 7, 2, 11, -1, -1, -1, -1, -1},\n    {2, 3, 5, 0, 8, 3, 2,11, 7, 5,1, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 7, 5, 9, 2, 7, 9, 0, 2, 2, 11, 7, -1, -1, -1, -1, -1},\n    {1, 6, 2,11, 7, 5, 9, 0,-1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{7, 5, 2, 7, 2, 11, 5, 9, 2, 3, 2, 8, 9, 8, 2, -1, -1},\n    {1, 7, 7, 5, 9, 8, 3, 2,11,-1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 200 */\n  {{2, 5, 10, 2, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5,  3, 7, 5,10, 2,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{8, 2, 0, 8, 5, 2, 8, 7, 5, 10, 2, 5, -1, -1, -1, -1, -1},\n    {1, 6, 5,10, 2, 0, 8, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 0, 1, 5, 10, 3, 5, 3, 7, 3, 10, 2, -1, -1, -1, -1, -1},\n    {2, 3, 5, 9,  0, 1, 10, 2, 3, 7, 5, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 8, 2, 9, 2, 1, 8, 7, 2, 10, 2, 5, 7, 5, 2, -1, -1},\n    {1, 7, 9, 8, 7, 5,10, 2, 1,-1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4, 3, 7, 5, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 205 */\n  {{0, 8, 7, 0, 7, 1, 1, 7, 5, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 0, 8, 7, 5, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 0, 3, 9, 3, 5, 5, 3, 7, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 9, 0, 3, 7, 5,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 8, 7, 5, 9, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4, 7, 5, 9, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{5, 8, 4, 5, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 10,11, 8, 4, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{5, 0, 4, 5, 11, 0, 5, 10, 11, 11, 3, 0, -1, -1, -1, -1, -1},\n    {1, 6, 0, 4,  5,10,11,  3, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 210 */\n  {{0, 1, 9, 8, 4, 10, 8, 10, 11, 10, 4, 5, -1, -1, -1, -1, -1},\n    {2, 3, 5, 0, 1,  9, 4,  5, 10, 11, 8, -1, -1, -1, -1, -1, -1}},\n  \n  {{10, 11, 4, 10, 4, 5, 11, 3, 4, 9, 4, 1, 3, 1, 4, -1, -1},\n    { 1,  7,10, 11, 3, 1, 9,4, 5,-1, -1, -1, -1, -1, -1, -1}},\n  \n  {{2, 5, 1, 2, 8, 5, 2, 11, 8, 4, 5, 8, -1, -1, -1, -1, -1},\n    {1, 6, 2,11, 8, 4,  5, 1,-1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 4, 11, 0, 11, 3, 4, 5, 11, 2, 11, 1, 5, 1, 11, -1, -1},\n    {1, 7,  0, 4, 5, 1,  2, 11, 3,-1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 2, 5, 0, 5, 9, 2, 11, 5, 4, 5, 8, 11, 8, 5, -1, -1},\n    {1, 7, 0, 2,11, 8, 4,  5, 9, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 215 */\n  {{9, 4, 5, 2, 11, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2, 3, 3, 9,  4, 5,  2, 11,  3, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{2, 5, 10, 3, 5, 2, 3, 4, 5, 3, 8, 4, -1, -1, -1, -1, -1},\n    {2, 4, 4, 2, 3, 5, 10, 4, 5, 3, 8,-1, -1, -1, -1, -1, -1}},\n  \n  {{5, 10, 2, 5, 2, 4, 4, 2, 0, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1,  5, 5,10, 2, 0, 4,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{3, 10, 2, 3, 5, 10, 3, 8, 5, 4, 5, 8, 0, 1, 9, -1, -1},\n    {3,  4, 4, 3, 3, 5, 10, 2, 8, 4, 5, 3, 0, 1, 9, -1, -1}},\n  \n  {{5, 10, 2, 5, 2, 4, 1, 9, 2, 9, 4, 2, -1, -1, -1, -1, -1},\n    {1,  6,10, 2, 1, 9, 4, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 220 */\n  {{8, 4, 5, 8, 5, 3, 3, 5, 1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 8, 4, 5, 1, 3,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 4, 5, 1, 0, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4, 0, 4, 5, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{8, 4, 5, 8, 5, 3, 9, 0, 5, 0, 3, 5, -1, -1, -1, -1, -1},\n    {2, 4, 4, 0, 3, 5, 9, 8, 4, 5, 3, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 4, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 3, 9,  4,  5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{4, 11, 7, 4, 9, 11, 9, 10, 11, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1,  5, 9,10, 11, 7, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 225 */\n  {{0, 8, 3, 4, 9, 7, 9, 11, 7, 9, 10, 11, -1, -1, -1, -1, -1},\n    {2, 3, 5, 0, 8, 3, 7, 4, 9, 10, 11, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 10, 11, 1, 11, 4, 1, 4, 0, 7, 4, 11, -1, -1, -1, -1, -1},\n    {1,  6,  1, 10,11, 7, 4, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{3, 1, 4, 3, 4, 8, 1, 10, 4, 7, 4, 11, 10, 11, 4, -1, -1},\n    {1, 7, 3, 1,10,11, 7,  4, 8, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{4, 11, 7, 9, 11, 4, 9, 2, 11, 9, 1, 2, -1, -1, -1, -1, -1},\n    {2,  4, 4, 2, 11, 9, 1, 4, 9, 11, 7, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 7, 4, 9, 11, 7, 9, 1, 11, 2, 11, 1, 0, 8, 3, -1, -1},\n    {3, 4, 4, 3, 1, 2, 11, 9, 7, 4,  9,11,  8, 3, 0, 8, 3}},\n  \n  /* 230 */\n  {{11, 7, 4, 11, 4, 2, 2, 4, 0, -1, -1, -1, -1, -1, -1, -1, -1},\n    { 1, 5, 11, 7, 4, 0, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{11, 7, 4, 11, 4, 2, 8, 3, 4, 3, 2, 4, -1, -1, -1, -1, -1},\n    { 2, 4, 4, 11, 7, 4, 2, 3, 2, 4, 8,-1, -1, -1, -1, -1, -1}},\n  \n  {{2, 9, 10, 2, 7, 9, 2, 3, 7, 7, 4, 9, -1, -1, -1, -1, -1},\n    {1, 6,  2, 3, 7, 4, 9,10, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 10, 7, 9, 7, 4, 10, 2, 7, 8, 7, 0, 2, 0, 7, -1, -1},\n    {1,  7, 9,10, 2, 0, 8, 7, 4,-1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{3, 7, 10, 3, 10, 2, 7, 4, 10, 1, 10, 0, 4, 0, 10, -1, -1},\n    {1, 7,  3, 7, 4, 0, 1,10, 2, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 235 */\n  {{1, 10, 2, 8, 7, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {2,  3, 3, 1,10, 2,  8,  7,  4, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{4, 9, 1, 4, 1, 7, 7, 1, 3, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 4, 9, 1, 3, 7,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{4, 9, 1, 4, 1, 7, 0, 8, 1, 8, 7, 1, -1, -1, -1, -1, -1},\n    {2, 4, 4, 8, 7, 1, 0, 4, 9, 1, 7, -1, -1, -1, -1, -1, -1}},\n  \n  {{4, 0, 3, 7, 4, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4, 3, 7, 4, 0,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{4, 8, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 3, 4,  8,  7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 240 */\n  {{9, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1,  4, 8,  9, 10,11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{3, 0, 9, 3, 9, 11, 11, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 3, 0, 9, 10, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 1, 10, 0, 10, 8, 8, 10, 11, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5,  0, 1, 10,11, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{3, 1, 10, 11, 3, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4,  3,  1,10, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 2, 11, 1, 11, 9, 9, 11, 8, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5,  1, 2, 11, 8, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 245 */\n  {{3, 0, 9, 3, 9, 11, 1, 2, 9, 2, 11, 9, -1, -1, -1, -1, -1},\n    {2, 4, 4, 2,11,  9, 1, 3, 0, 9, 11, -1, -1, -1, -1, -1,-1}},\n  \n  {{0, 2, 11, 8, 0, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4,  0, 2,11,  8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{3, 2, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 3,  3,  2, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{2, 3, 8, 2, 8, 10, 10, 8, 9, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 5, 2, 3, 8,  9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{9, 10, 2, 0, 9, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1,  4, 2, 0, 9,10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  /* 250 */\n  {{2, 3, 8, 2, 8, 10, 0, 1, 8, 1, 10, 8, -1, -1, -1, -1, -1},\n    {2, 4, 4, 2, 3, 8, 10, 1, 10, 8, 0, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 10, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1,  3, 1, 10,  2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{1, 3, 8, 9, 1, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 4, 1, 3, 8, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 9, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 3, 0,  9,  1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{0, 3, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    {1, 3, 0,  3,  8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},\n  \n  {{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},\n    { 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}}\n};\n\n\n//-----------------------------------------------------------------------------\n\n\nconst int polyTable[8][16] =\n{\n  {-1},\n  {-1},\n  {-1},\n  {0, 1, 2, -1},\n  {0, 1, 2, 2, 3, 0, -1},\n  {0, 1, 2, 0, 2, 4, 4, 2, 3, -1},\n  {0, 1, 2, 2, 3, 4, 4, 5, 0, 0, 2, 4, -1},\n  {0, 1, 5, 0, 5, 6, 1, 2, 5, 4, 5, 3, 2, 3, 5, -1}\n};\n\n\n//=============================================================================\n\n\n//=============================================================================\n#endif // ISOEX_MC_TABLES_HH defined\n//=============================================================================\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/progressive_hulls.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"progressive_hulls.h\"\n#include \"progressive_hulls_cost_and_placement.h\"\n#include \"../decimate.h\"\n#include \"../max_faces_stopping_condition.h\"\nIGL_INLINE bool igl::copyleft::progressive_hulls(\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  const size_t max_m,\n  Eigen::MatrixXd & U,\n  Eigen::MatrixXi & G,\n  Eigen::VectorXi & J)\n{\n  int m = F.rows();\n  Eigen::VectorXi I;\n  return decimate(\n    V,\n    F,\n    progressive_hulls_cost_and_placement,\n    max_faces_stopping_condition(m,(const int)m,max_m),\n    U,\n    G,\n    J,\n    I);\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/progressive_hulls.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_PROGRESSIVE_HULLS_H\n#define IGL_COPYLEFT_PROGRESSIVE_HULLS_H\n#include \"../igl_inline.h\"\n#include <Eigen/Core>\n\nnamespace igl\n{\n  namespace copyleft\n  {\n    // Assumes (V,F) is a closed manifold mesh \n    // Collapses edges until desired number of faces is achieved but ensures\n    // that new vertices are placed outside all previous meshes as per\n    // \"progressive hulls\" in \"Silhouette clipping\" [Sander et al. 2000].\n    //\n    // Inputs:\n    //   V  #V by dim list of vertex positions\n    //   F  #F by 3 list of face indices into V.\n    //   max_m  desired number of output faces\n    // Outputs:\n    //   U  #U by dim list of output vertex posistions (can be same ref as V)\n    //   G  #G by 3 list of output face indices into U (can be same ref as G)\n    //   J  #G list of indices into F of birth faces\n    // Returns true if m was reached (otherwise #G > m)\n    IGL_INLINE bool progressive_hulls(\n      const Eigen::MatrixXd & V,\n      const Eigen::MatrixXi & F,\n      const size_t max_m,\n      Eigen::MatrixXd & U,\n      Eigen::MatrixXi & G,\n      Eigen::VectorXi & J);\n  }\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"progressive_hulls.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/progressive_hulls_cost_and_placement.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"progressive_hulls_cost_and_placement.h\"\n#include \"quadprog.h\"\n#include \"../unique.h\"\n#include \"../circulation.h\"\n#include <cassert>\n#include <vector>\n#include <limits>\n\nIGL_INLINE void igl::copyleft::progressive_hulls_cost_and_placement(\n  const int e,\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  const Eigen::MatrixXi & E,\n  const Eigen::VectorXi & EMAP,\n  const Eigen::MatrixXi & EF,\n  const Eigen::MatrixXi & EI,\n  double & cost,\n  Eigen::RowVectorXd & p)\n{\n  using namespace Eigen;\n  using namespace std;\n  // Controls the amount of quadratic energy to add (too small will introduce\n  // instabilities and flaps)\n  const double w = 0.1;\n\n  assert(V.cols() == 3 && \"V.cols() should be 3\");\n  // Gather list of unique face neighbors\n  vector<int> Nall =  circulation(e, true,F,E,EMAP,EF,EI);\n  vector<int> Nother= circulation(e,false,F,E,EMAP,EF,EI);\n  Nall.insert(Nall.end(),Nother.begin(),Nother.end());\n  vector<int> N;\n  igl::unique(Nall,N);\n  // Gather:\n  //   A  #N by 3 normals scaled by area,\n  //   D  #N determinants of matrix formed by points as columns\n  //   B  #N point on plane dot normal\n  MatrixXd A(N.size(),3);\n  VectorXd D(N.size());\n  VectorXd B(N.size());\n  //cout<<\"N=[\";\n  for(int i = 0;i<N.size();i++)\n  {\n    const int f = N[i];\n    //cout<<(f+1)<<\" \";\n    const RowVector3d & v01 = V.row(F(f,1))-V.row(F(f,0));\n    const RowVector3d & v20 = V.row(F(f,2))-V.row(F(f,0));\n    A.row(i) = v01.cross(v20);\n    B(i) = V.row(F(f,0)).dot(A.row(i));\n    D(i) = \n      (Matrix3d()<< V.row(F(f,0)), V.row(F(f,1)), V.row(F(f,2)))\n      .finished().determinant();\n  }\n  //cout<<\"];\"<<endl;\n  // linear objective\n  Vector3d f = A.colwise().sum().transpose();\n  VectorXd x;\n  //bool success = linprog(f,-A,-B,MatrixXd(0,A.cols()),VectorXd(0,1),x);\n  //VectorXd _;\n  //bool success = mosek_linprog(f,A.sparseView(),B,_,_,_,env,x);\n  //if(success)\n  //{\n  //  cost  = (1./6.)*(x.dot(f) - D.sum());\n  //}\n  bool success = false;\n  {\n    RowVectorXd mid = 0.5*(V.row(E(e,0))+V.row(E(e,1)));\n    MatrixXd G =  w*Matrix3d::Identity(3,3);\n    VectorXd g0 = (1.-w)*f - w*mid.transpose();\n    const int n = A.cols();\n    success = quadprog(\n        G,g0,\n        MatrixXd(n,0),VectorXd(0,1),\n        A.transpose(),-B,x);\n    cost  = (1.-w)*(1./6.)*(x.dot(f) - D.sum()) + \n      w*(x.transpose()-mid).squaredNorm() +\n      w*(V.row(E(e,0))-V.row(E(e,1))).norm();\n  }\n\n  // A x >= B\n  // A x - B >=0\n  // This is annoyingly necessary. Seems the solver is letting some garbage\n  // slip by.\n  success = success && ((A*x-B).minCoeff()>-1e-10);\n  if(success)\n  {\n    p = x.transpose();\n    //assert(cost>=0 && \"Cost should be positive\");\n  }else\n  {\n    cost = std::numeric_limits<double>::infinity();\n    //VectorXi NM;\n    //igl::list_to_matrix(N,NM);\n    //cout<<matlab_format((NM.array()+1).eval(),\"N\")<<endl;\n    //cout<<matlab_format(f,\"f\")<<endl;\n    //cout<<matlab_format(A,\"A\")<<endl;\n    //cout<<matlab_format(B,\"B\")<<endl;\n    //exit(-1);\n    p = RowVectorXd::Constant(1,3,std::nan(\"inf-cost\"));\n  }\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/progressive_hulls_cost_and_placement.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_PROGRESSIVE_HULLS_COST_AND_PLACEMENT_H\n#define IGL_COPYLEFT_PROGRESSIVE_HULLS_COST_AND_PLACEMENT_H\n#include <Eigen/Core>\n#include \"../igl_inline.h\"\nnamespace igl\n{\n  namespace copyleft\n  {\n    // A \"cost and placement\" compatible with `igl::decimate` implementing the\n    // \"progressive hulls\" algorithm in \"Silhouette clipping\" [Sander et al.\n    // 2000]. This implementation fixes an issue that the original linear\n    // program becomes unstable for flat patches by introducing a small\n    // quadratic energy term pulling the collapsed edge toward its midpoint.\n    // This function is not really meant to be called directly but rather\n    // passed to `igl::decimate` as a handle.\n    //\n    // Inputs:\n    //   e  index of edge to be collapsed\n    //   V  #V by 3 list of vertex positions\n    //   F  #F by 3 list of faces indices into V\n    //   E  #E by 3 list of edges indices into V\n    //   EMAP #F*3 list of indices into E, mapping each directed edge to unique\n    //     unique edge in E\n    //   EF  #E by 2 list of edge flaps, EF(e,0)=f means e=(i-->j) is the edge of\n    //     F(f,:) opposite the vth corner, where EI(e,0)=v. Similarly EF(e,1) \"\n    //     e=(j->i)\n    //   EI  #E by 2 list of edge flap corners (see above).\n    // Outputs:\n    //   cost  cost of collapsing edge e\n    //   p  position to place collapsed vertex\n    //\n    IGL_INLINE void progressive_hulls_cost_and_placement(\n      const int e,\n      const Eigen::MatrixXd & V,\n      const Eigen::MatrixXi & F,\n      const Eigen::MatrixXi & E,\n      const Eigen::VectorXi & EMAP,\n      const Eigen::MatrixXi & EF,\n      const Eigen::MatrixXi & EI,\n      double & cost,\n      Eigen::RowVectorXd & p);\n  }\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"progressive_hulls_cost_and_placement.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/quadprog.cpp",
    "content": "#include \"quadprog.h\"\n#include <vector>\n/*\n FILE eiquadprog.hh\n \n NOTE: this is a modified of uQuadProg++ package, working with Eigen data structures. \n       uQuadProg++ is itself a port made by Angelo Furfaro of QuadProg++ originally developed by \n       Luca Di Gaspero, working with ublas data structures. \n\n The quadprog_solve() function implements the algorithm of Goldfarb and Idnani \n for the solution of a (convex) Quadratic Programming problem\nby means of a dual method.\n\t \nThe problem is in the form:\n\nmin 0.5 * x G x + g0 x\ns.t.\n    CE^T x + ce0 = 0\n    CI^T x + ci0 >= 0\n\t \n The matrix and vectors dimensions are as follows:\n     G: n * n\n\t\tg0: n\n\t\t\t\t\n\t\tCE: n * p\n\t ce0: p\n\t\t\t\t\n\t  CI: n * m\n   ci0: m\n\n     x: n\n \n The function will return the cost of the solution written in the x vector or\n std::numeric_limits::infinity() if the problem is infeasible. In the latter case\n the value of the x vector is not correct.\n \n References: D. Goldfarb, A. Idnani. A numerically stable dual method for solving\n             strictly convex quadratic programs. Mathematical Programming 27 (1983) pp. 1-33.\n\n Notes:\n  1. pay attention in setting up the vectors ce0 and ci0. \n\t   If the constraints of your problem are specified in the form \n\t   A^T x = b and C^T x >= d, then you should set ce0 = -b and ci0 = -d.\n  2. The matrix G is modified within the function since it is used to compute\n     the G = L^T L cholesky factorization for further computations inside the function. \n     If you need the original matrix G you should make a copy of it and pass the copy\n     to the function.\n    \n \n The author will be grateful if the researchers using this software will\n acknowledge the contribution of this modified function and of Di Gaspero's\n original version in their research papers.\n\n\nLICENSE\n\nCopyright (2010) Gael Guennebaud\nCopyright (2008) Angelo Furfaro\nCopyright (2006) Luca Di Gaspero\n\n\nThis file is a porting of QuadProg++ routine, originally developed\nby Luca Di Gaspero, exploiting uBlas data structures for vectors and\nmatrices instead of native C++ array.\n\nuquadprog is free software; you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation; either version 2 of the License, or\n(at your option) any later version.\n\nuquadprog is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with uquadprog; if not, write to the Free Software\nFoundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n\n*/\n\n#include <Eigen/Dense>\n\nIGL_INLINE bool igl::copyleft::quadprog(\n  const Eigen::MatrixXd & G,  \n  const Eigen::VectorXd & g0,  \n  const Eigen::MatrixXd & CE, \n  const Eigen::VectorXd & ce0,  \n  const Eigen::MatrixXd & CI, \n  const Eigen::VectorXd & ci0, \n  Eigen::VectorXd& x)\n{\n  using namespace Eigen;\n  typedef double Scalar;\n  const auto distance = [](Scalar a, Scalar b)->Scalar\n  {\n  \tScalar a1, b1, t;\n  \ta1 = std::abs(a);\n  \tb1 = std::abs(b);\n  \tif (a1 > b1) \n  \t{\n  \t\tt = (b1 / a1);\n  \t\treturn a1 * std::sqrt(1.0 + t * t);\n  \t}\n  \telse\n  \t\tif (b1 > a1)\n  \t\t{\n  \t\t\tt = (a1 / b1);\n  \t\t\treturn b1 * std::sqrt(1.0 + t * t);\n  \t\t}\n  \treturn a1 * std::sqrt(2.0);\n  };\n  const auto compute_d = [](VectorXd &d, const MatrixXd& J, const VectorXd& np)\n  {\n    d = J.adjoint() * np;\n  };\n\n  const auto update_z = \n    [](VectorXd& z, const MatrixXd& J, const VectorXd& d,  int iq)\n  {\n    z = J.rightCols(z.size()-iq) * d.tail(d.size()-iq);\n  };\n\n  const auto update_r = \n    [](const MatrixXd& R, VectorXd& r, const VectorXd& d, int iq) \n  {\n    r.head(iq) = \n      R.topLeftCorner(iq,iq).triangularView<Upper>().solve(d.head(iq));\n  };\n\n  const auto add_constraint = [&distance](\n    MatrixXd& R, \n    MatrixXd& J, \n    VectorXd& d, \n    int& iq, \n    double& R_norm)->bool\n  {\n    int n=J.rows();\n#ifdef TRACE_SOLVER\n    std::cerr << \"Add constraint \" << iq << '/';\n#endif\n    int i, j, k;\n    double cc, ss, h, t1, t2, xny;\n    \n    /* we have to find the Givens rotation which will reduce the element\n      d(j) to zero.\n      if it is already zero we don't have to do anything, except of\n      decreasing j */  \n    for (j = n - 1; j >= iq + 1; j--)\n    {\n      /* The Givens rotation is done with the matrix (cc cs, cs -cc).\n        If cc is one, then element (j) of d is zero compared with element\n        (j - 1). Hence we don't have to do anything. \n        If cc is zero, then we just have to switch column (j) and column (j - 1) \n        of J. Since we only switch columns in J, we have to be careful how we\n        update d depending on the sign of gs.\n        Otherwise we have to apply the Givens rotation to these columns.\n        The i - 1 element of d has to be updated to h. */\n      cc = d(j - 1);\n      ss = d(j);\n      h = distance(cc, ss);\n      if (h == 0.0)\n        continue;\n      d(j) = 0.0;\n      ss = ss / h;\n      cc = cc / h;\n      if (cc < 0.0)\n      {\n        cc = -cc;\n        ss = -ss;\n        d(j - 1) = -h;\n      }\n      else\n        d(j - 1) = h;\n      xny = ss / (1.0 + cc);\n      for (k = 0; k < n; k++)\n      {\n        t1 = J(k,j - 1);\n        t2 = J(k,j);\n        J(k,j - 1) = t1 * cc + t2 * ss;\n        J(k,j) = xny * (t1 + J(k,j - 1)) - t2;\n      }\n    }\n    /* update the number of constraints added*/\n    iq++;\n    /* To update R we have to put the iq components of the d vector\n      into column iq - 1 of R\n      */\n    R.col(iq-1).head(iq) = d.head(iq);\n#ifdef TRACE_SOLVER\n    std::cerr << iq << std::endl;\n#endif\n    \n    if (std::abs(d(iq - 1)) <= std::numeric_limits<double>::epsilon() * R_norm)\n    {\n      // problem degenerate\n      return false;\n    }\n    R_norm = std::max<double>(R_norm, std::abs(d(iq - 1)));\n    return true;\n  };\n\n  const auto delete_constraint = [&distance](\n      MatrixXd& R, \n      MatrixXd& J, \n      VectorXi& A, \n      VectorXd& u, \n      int p, \n      int& iq, \n      int l)\n  {\n    int n = R.rows();\n#ifdef TRACE_SOLVER\n    std::cerr << \"Delete constraint \" << l << ' ' << iq;\n#endif\n    int i, j, k, qq;\n    double cc, ss, h, xny, t1, t2;\n\n    /* Find the index qq for active constraint l to be removed */\n    for (i = p; i < iq; i++)\n      if (A(i) == l)\n      {\n        qq = i;\n        break;\n      }\n\n    /* remove the constraint from the active set and the duals */\n    for (i = qq; i < iq - 1; i++)\n    {\n      A(i) = A(i + 1);\n      u(i) = u(i + 1);\n      R.col(i) = R.col(i+1);\n    }\n\n    A(iq - 1) = A(iq);\n    u(iq - 1) = u(iq);\n    A(iq) = 0; \n    u(iq) = 0.0;\n    for (j = 0; j < iq; j++)\n      R(j,iq - 1) = 0.0;\n    /* constraint has been fully removed */\n    iq--;\n#ifdef TRACE_SOLVER\n    std::cerr << '/' << iq << std::endl;\n#endif \n\n    if (iq == 0)\n      return;\n\n    for (j = qq; j < iq; j++)\n    {\n      cc = R(j,j);\n      ss = R(j + 1,j);\n      h = distance(cc, ss);\n      if (h == 0.0)\n        continue;\n      cc = cc / h;\n      ss = ss / h;\n      R(j + 1,j) = 0.0;\n      if (cc < 0.0)\n      {\n        R(j,j) = -h;\n        cc = -cc;\n        ss = -ss;\n      }\n      else\n        R(j,j) = h;\n\n      xny = ss / (1.0 + cc);\n      for (k = j + 1; k < iq; k++)\n      {\n        t1 = R(j,k);\n        t2 = R(j + 1,k);\n        R(j,k) = t1 * cc + t2 * ss;\n        R(j + 1,k) = xny * (t1 + R(j,k)) - t2;\n      }\n      for (k = 0; k < n; k++)\n      {\n        t1 = J(k,j);\n        t2 = J(k,j + 1);\n        J(k,j) = t1 * cc + t2 * ss;\n        J(k,j + 1) = xny * (J(k,j) + t1) - t2;\n      }\n    }\n  };\n\n  int i, j, k, l; /* indices */\n  int ip, me, mi;\n  int n=g0.size();  int p=ce0.size();  int m=ci0.size();  \n  MatrixXd R(G.rows(),G.cols()), J(G.rows(),G.cols());\n  \n  LLT<MatrixXd,Lower> chol(G.cols());\n \n  VectorXd s(m+p), z(n), r(m + p), d(n),  np(n), u(m + p);\n  VectorXd x_old(n), u_old(m + p);\n  double f_value, psi, c1, c2, sum, ss, R_norm;\n  const double inf = std::numeric_limits<double>::infinity();\n  double t, t1, t2; /* t is the step length, which is the minimum of the partial step length t1 \n    * and the full step length t2 */\n  VectorXi A(m + p), A_old(m + p), iai(m + p);\n  int q;\n  int iq, iter = 0;\n  std::vector<bool> iaexcl(m + p);\n \t\n  me = p; /* number of equality constraints */\n  mi = m; /* number of inequality constraints */\n  q = 0;  /* size of the active set A (containing the indices of the active constraints) */\n  \n  /*\n   * Preprocessing phase\n   */\n\t\n  /* compute the trace of the original matrix G */\n  c1 = G.trace();\n\t\n\t/* decompose the matrix G in the form LL^T */\n  chol.compute(G);\n \n  /* initialize the matrix R */\n  d.setZero();\n  R.setZero();\n\tR_norm = 1.0; /* this variable will hold the norm of the matrix R */\n  \n\t/* compute the inverse of the factorized matrix G^-1, this is the initial value for H */\n  // J = L^-T\n  J.setIdentity();\n  J = chol.matrixU().solve(J);\n\tc2 = J.trace();\n#ifdef TRACE_SOLVER\n print_matrix(\"J\", J, n);\n#endif\n  \n\t/* c1 * c2 is an estimate for cond(G) */\n  \n\t/* \n   * Find the unconstrained minimizer of the quadratic form 0.5 * x G x + g0 x \n   * this is a feasible point in the dual space\n\t * x = G^-1 * g0\n   */\n  x = chol.solve(g0);\n  x = -x;\n\t/* and compute the current solution value */ \n\tf_value = 0.5 * g0.dot(x);\n#ifdef TRACE_SOLVER\n  std::cerr << \"Unconstrained solution: \" << f_value << std::endl;\n  print_vector(\"x\", x, n);\n#endif\n  \n\t/* Add equality constraints to the working set A */\n  iq = 0;\n\tfor (i = 0; i < me; i++)\n\t{\n    np = CE.col(i);\n    compute_d(d, J, np);\n\t\tupdate_z(z, J, d,  iq);\n\t\tupdate_r(R, r, d,  iq);\n#ifdef TRACE_SOLVER\n\t\tprint_matrix(\"R\", R, iq);\n\t\tprint_vector(\"z\", z, n);\n\t\tprint_vector(\"r\", r, iq);\n\t\tprint_vector(\"d\", d, n);\n#endif\n    \n    /* compute full step length t2: i.e., the minimum step in primal space s.t. the contraint \n      becomes feasible */\n    t2 = 0.0;\n    if (std::abs(z.dot(z)) > std::numeric_limits<double>::epsilon()) // i.e. z != 0\n      t2 = (-np.dot(x) - ce0(i)) / z.dot(np);\n    \n    x += t2 * z;\n\n    /* set u = u+ */\n    u(iq) = t2;\n    u.head(iq) -= t2 * r.head(iq);\n    \n    /* compute the new solution value */\n    f_value += 0.5 * (t2 * t2) * z.dot(np);\n    A(i) = -i - 1;\n    \n    if (!add_constraint(R, J, d, iq, R_norm))\n    {\n      // FIXME: it should raise an error\n      // Equality constraints are linearly dependent\n      return false;\n    }\n  }\n  \n\t/* set iai = K \\ A */\n\tfor (i = 0; i < mi; i++)\n\t\tiai(i) = i;\n  \nl1:\titer++;\n#ifdef TRACE_SOLVER\n  print_vector(\"x\", x, n);\n#endif\n  /* step 1: choose a violated constraint */\n\tfor (i = me; i < iq; i++)\n\t{\n\t  ip = A(i);\n\t\tiai(ip) = -1;\n\t}\n\t\n\t/* compute s(x) = ci^T * x + ci0 for all elements of K \\ A */\n\tss = 0.0;\n\tpsi = 0.0; /* this value will contain the sum of all infeasibilities */\n\tip = 0; /* ip will be the index of the chosen violated constraint */\n\tfor (i = 0; i < mi; i++)\n\t{\n\t\tiaexcl[i] = true;\n\t\tsum = CI.col(i).dot(x) + ci0(i);\n\t\ts(i) = sum;\n\t\tpsi += std::min(0.0, sum);\n\t}\n#ifdef TRACE_SOLVER\n  print_vector(\"s\", s, mi);\n#endif\n\n    \n\tif (std::abs(psi) <= mi * std::numeric_limits<double>::epsilon() * c1 * c2* 100.0)\n\t{\n    /* numerically there are not infeasibilities anymore */\n    q = iq;\n\t\treturn true;\n  }\n    \n  /* save old values for u, x and A */\n   u_old.head(iq) = u.head(iq);\n   A_old.head(iq) = A.head(iq);\n   x_old = x;\n    \nl2: /* Step 2: check for feasibility and determine a new S-pair */\n\tfor (i = 0; i < mi; i++)\n\t{\n\t\tif (s(i) < ss && iai(i) != -1 && iaexcl[i])\n\t\t{\n\t\t\tss = s(i);\n\t\t\tip = i;\n\t\t}\n\t}\n  if (ss >= 0.0)\n  {\n    q = iq;\n    return true;\n  }\n    \n  /* set np = n(ip) */\n  np = CI.col(ip);\n  /* set u = (u 0)^T */\n  u(iq) = 0.0;\n  /* add ip to the active set A */\n  A(iq) = ip;\n\n#ifdef TRACE_SOLVER\n\tstd::cerr << \"Trying with constraint \" << ip << std::endl;\n\tprint_vector(\"np\", np, n);\n#endif\n    \nl2a:/* Step 2a: determine step direction */\n  /* compute z = H np: the step direction in the primal space (through J, see the paper) */\n  compute_d(d, J, np);\n  update_z(z, J, d, iq);\n  /* compute N* np (if q > 0): the negative of the step direction in the dual space */\n  update_r(R, r, d, iq);\n#ifdef TRACE_SOLVER\n  std::cerr << \"Step direction z\" << std::endl;\n\t\tprint_vector(\"z\", z, n);\n\t\tprint_vector(\"r\", r, iq + 1);\n    print_vector(\"u\", u, iq + 1);\n    print_vector(\"d\", d, n);\n    print_ivector(\"A\", A, iq + 1);\n#endif\n    \n  /* Step 2b: compute step length */\n  l = 0;\n  /* Compute t1: partial step length (maximum step in dual space without violating dual feasibility */\n  t1 = inf; /* +inf */\n  /* find the index l s.t. it reaches the minimum of u+(x) / r */\n  for (k = me; k < iq; k++)\n  {\n    double tmp;\n    if (r(k) > 0.0 && ((tmp = u(k) / r(k)) < t1) )\n    {\n      t1 = tmp;\n      l = A(k);\n    }\n  }\n  /* Compute t2: full step length (minimum step in primal space such that the constraint ip becomes feasible */\n  if (std::abs(z.dot(z))  > std::numeric_limits<double>::epsilon()) // i.e. z != 0\n    t2 = -s(ip) / z.dot(np);\n  else\n    t2 = inf; /* +inf */\n\n  /* the step is chosen as the minimum of t1 and t2 */\n  t = std::min(t1, t2);\n#ifdef TRACE_SOLVER\n  std::cerr << \"Step sizes: \" << t << \" (t1 = \" << t1 << \", t2 = \" << t2 << \") \";\n#endif\n  \n  /* Step 2c: determine new S-pair and take step: */\n  \n  /* case (i): no step in primal or dual space */\n  if (t >= inf)\n  {\n    /* QPP is infeasible */\n    // FIXME: unbounded to raise\n    q = iq;\n    return false;\n  }\n  /* case (ii): step in dual space */\n  if (t2 >= inf)\n  {\n    /* set u = u +  t * [-r 1) and drop constraint l from the active set A */\n    u.head(iq) -= t * r.head(iq);\n    u(iq) += t;\n    iai(l) = l;\n    delete_constraint(R, J, A, u, p, iq, l);\n#ifdef TRACE_SOLVER\n    std::cerr << \" in dual space: \" \n      << f_value << std::endl;\n    print_vector(\"x\", x, n);\n    print_vector(\"z\", z, n);\n\t\tprint_ivector(\"A\", A, iq + 1);\n#endif\n    goto l2a;\n  }\n  \n  /* case (iii): step in primal and dual space */\n  \n  x += t * z;\n  /* update the solution value */\n  f_value += t * z.dot(np) * (0.5 * t + u(iq));\n  \n  u.head(iq) -= t * r.head(iq);\n  u(iq) += t;\n#ifdef TRACE_SOLVER\n  std::cerr << \" in both spaces: \" \n    << f_value << std::endl;\n\tprint_vector(\"x\", x, n);\n\tprint_vector(\"u\", u, iq + 1);\n\tprint_vector(\"r\", r, iq + 1);\n\tprint_ivector(\"A\", A, iq + 1);\n#endif\n  \n  if (t == t2)\n  {\n#ifdef TRACE_SOLVER\n    std::cerr << \"Full step has taken \" << t << std::endl;\n    print_vector(\"x\", x, n);\n#endif\n    /* full step has taken */\n    /* add constraint ip to the active set*/\n\t\tif (!add_constraint(R, J, d, iq, R_norm))\n\t\t{\n\t\t\tiaexcl[ip] = false;\n\t\t\tdelete_constraint(R, J, A, u, p, iq, ip);\n#ifdef TRACE_SOLVER\n      print_matrix(\"R\", R, n);\n      print_ivector(\"A\", A, iq);\n#endif\n\t\t\tfor (i = 0; i < m; i++)\n\t\t\t\tiai(i) = i;\n\t\t\tfor (i = 0; i < iq; i++)\n\t\t\t{\n\t\t\t\tA(i) = A_old(i);\n\t\t\t\tiai(A(i)) = -1;\n\t\t\t\tu(i) = u_old(i);\n\t\t\t}\n\t\t\tx = x_old;\n      goto l2; /* go to step 2 */\n\t\t}    \n    else\n      iai(ip) = -1;\n#ifdef TRACE_SOLVER\n    print_matrix(\"R\", R, n);\n    print_ivector(\"A\", A, iq);\n#endif\n    goto l1;\n  }\n  \n  /* a patial step has taken */\n#ifdef TRACE_SOLVER\n  std::cerr << \"Partial step has taken \" << t << std::endl;\n  print_vector(\"x\", x, n);\n#endif\n  /* drop constraint l */\n\tiai(l) = l;\n\tdelete_constraint(R, J, A, u, p, iq, l);\n#ifdef TRACE_SOLVER\n  print_matrix(\"R\", R, n);\n  print_ivector(\"A\", A, iq);\n#endif\n  \n  s(ip) = CI.col(ip).dot(x) + ci0(ip);\n\n#ifdef TRACE_SOLVER\n  print_vector(\"s\", s, mi);\n#endif\n  goto l2a;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/quadprog.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_QUADPROG_H\n#define IGL_COPYLEFT_QUADPROG_H\n\n#include \"../igl_inline.h\"\n#include <Eigen/Dense>\nnamespace igl\n{\n  namespace copyleft\n  {\n    // Solve a (dense) quadratric program of the form:\n    //\n    //   min  0.5 x G x + g0 x\n    //   s.t. CE' x + ce0  = 0\n    //   and  CI' x + ci0 >= 0\n    //\n    // Inputs:\n    //   G  #x by #x matrix of quadratic coefficients\n    //   g0  #x vector of linear coefficients\n    //   CE #x by #CE list of linear equality coefficients\n    //   ce0 #CE list of linear equality right-hand sides\n    //   CI #x by #CI list of linear equality coefficients\n    //   ci0 #CI list of linear equality right-hand sides\n    // Outputs:\n    //   x  #x vector of solution values\n    // Returns true iff success\n    IGL_INLINE bool quadprog(\n      const Eigen::MatrixXd & G,  \n      const Eigen::VectorXd & g0,  \n      const Eigen::MatrixXd & CE, \n      const Eigen::VectorXd & ce0,  \n      const Eigen::MatrixXd & CI, \n      const Eigen::VectorXd & ci0, \n      Eigen::VectorXd& x);\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"quadprog.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/swept_volume.cpp",
    "content": "#include \"swept_volume.h\"\n#include \"../swept_volume_bounding_box.h\"\n#include \"../swept_volume_signed_distance.h\"\n#include \"../voxel_grid.h\"\n#include \"marching_cubes.h\"\n#include <iostream>\n\nIGL_INLINE void igl::copyleft::swept_volume(\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  const std::function<Eigen::Affine3d(const double t)> & transform,\n  const size_t steps,\n  const size_t grid_res,\n  const size_t isolevel_grid,\n  Eigen::MatrixXd & SV,\n  Eigen::MatrixXi & SF)\n{\n  using namespace std;\n  using namespace Eigen;\n  using namespace igl;\n  using namespace igl::copyleft;\n\n  const auto & Vtransform = \n    [&V,&transform](const size_t vi,const double t)->RowVector3d\n  {\n    Vector3d Vvi = V.row(vi).transpose();\n    return (transform(t)*Vvi).transpose();\n  };\n  AlignedBox3d Mbox;\n  swept_volume_bounding_box(V.rows(),Vtransform,steps,Mbox);\n\n  // Amount of padding: pad*h should be >= isolevel\n  const int pad = isolevel_grid+1;\n  // number of vertices on the largest side\n  const int s = grid_res+2*pad;\n  const double h = Mbox.diagonal().maxCoeff()/(double)(s-2.*pad-1.);\n  const double isolevel = isolevel_grid*h;\n\n  // create grid\n  RowVector3i res;\n  MatrixXd GV;\n  voxel_grid(Mbox,s,pad,GV,res);\n\n  // compute values\n  VectorXd S;\n  swept_volume_signed_distance(V,F,transform,steps,GV,res,h,isolevel,S);\n  S.array()-=isolevel;\n  marching_cubes(S,GV,res(0),res(1),res(2),SV,SF);\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/swept_volume.h",
    "content": "#ifndef IGL_COPYLEFT_SWEPT_VOLUME_H\n#define IGL_COPYLEFT_SWEPT_VOLUME_H\n#include \"../igl_inline.h\"\n#include <Eigen/Core>\n#include <Eigen/Geometry>\nnamespace igl\n{\n  namespace copyleft\n  {\n    // Compute the surface of the swept volume of a solid object with surface\n    // (V,F) mesh under going rigid motion.\n    // \n    // Inputs:\n    //   V  #V by 3 list of mesh positions in reference pose\n    //   F  #F by 3 list of mesh indices into V\n    //   transform  function handle so that transform(t) returns the rigid\n    //     transformation at time t∈[0,1]\n    //   steps  number of time steps: steps=3 --> t∈{0,0.5,1}\n    //   grid_res  number of grid cells on the longest side containing the\n    //     motion (isolevel+1 cells will also be added on each side as padding)\n    //   isolevel  distance level to be contoured as swept volume\n    // Outputs:\n    //   SV  #SV by 3 list of mesh positions of the swept surface\n    //   SF  #SF by 3 list of mesh faces into SV\n    IGL_INLINE void swept_volume(\n      const Eigen::MatrixXd & V,\n      const Eigen::MatrixXi & F,\n      const std::function<Eigen::Affine3d(const double t)> & transform,\n      const size_t steps,\n      const size_t grid_res,\n      const size_t isolevel,\n      Eigen::MatrixXd & SV,\n      Eigen::MatrixXi & SF);\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"swept_volume.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/tetgen/README",
    "content": "IGL interface to tetgen library\n\nDependencies:\n  tetgen  \n  \nTravel to $IGL/external/tetgen and issue:\n  make -f Makefile.igl tetlib\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/tetgen/cdt.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"cdt.h\"\n#include \"../../bounding_box.h\"\n#include \"tetrahedralize.h\"\n\ntemplate <\n  typename DerivedV, \n  typename DerivedF, \n  typename DerivedTV, \n  typename DerivedTT, \n  typename DerivedTF>\nIGL_INLINE bool igl::copyleft::tetgen::cdt(\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  const CDTParam & param,\n  Eigen::PlainObjectBase<DerivedTV>& TV,\n  Eigen::PlainObjectBase<DerivedTT>& TT,\n  Eigen::PlainObjectBase<DerivedTF>& TF)\n{\n  using namespace Eigen;\n  using namespace std;\n  // Effective input mesh\n  DerivedV U;\n  DerivedF G;\n  if(param.use_bounding_box)\n  {\n    // Construct bounding box mesh\n    DerivedV BV;\n    DerivedF BF;\n    bounding_box(V,BV,BF);\n    // scale bounding box\n    const RowVector3d mid = \n     (BV.colwise().minCoeff() + BV.colwise().maxCoeff()).eval()*0.5;\n    BV.rowwise() -= mid;\n    assert(param.bounding_box_scale >= 1.);\n    BV.array() *= param.bounding_box_scale;\n    BV.rowwise() += mid;\n    // Append bounding box to mesh\n    U.resize(V.rows()+BV.rows(),V.cols());\n    U<<V,BV;\n    BF.array() += V.rows();\n    G.resize(F.rows()+BF.rows(),F.cols());\n    G<<F,BF;\n  }else\n  {\n    // needless copies\n    U = V;\n    G = F;\n  }\n  // effective flags;\n  string flags = param.flags + (param.use_bounding_box ? \"\" : \"c\");\n  return tetrahedralize(U,G,flags,TV,TT,TF);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate bool igl::copyleft::tetgen::cdt<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, igl::copyleft::tetgen::CDTParam const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/tetgen/cdt.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_TETGEN_CDT_H\n#define IGL_COPYLEFT_TETGEN_CDT_H\n#include \"../../igl_inline.h\"\n\n#include <Eigen/Core>\n#include <string>\n#ifndef TETLIBRARY\n#  define TETLIBRARY \n#endif\n#include \"tetgen.h\" // Defined REAL\n\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace tetgen\n    {\n      struct CDTParam\n      {\n        // Tetgen can compute mesh of convex hull of input (i.e. \"c\") but often\n        // chokes. One workaround is to force it to mesh the entire bounding box.\n        // {false}\n        bool use_bounding_box = false;\n        // Scale the bounding box a bit so that vertices near it do not give tetgen\n        // problems. {1.01}\n        double bounding_box_scale = 1.01;\n        // Flags to tetgen. Do not include the \"c\" flag here! {\"Y\"}\n        std::string flags = \"Y\";\n      };\n      // Create a constrained delaunay tesselation containing convex hull of the\n      // given **non-selfintersecting** mesh.\n      //\n      // Inputs:\n      //    V  #V by 3 list of input mesh vertices\n      //    F  #F by 3 list of input mesh facets\n      //    param  see above\n      //    TV  #TV by 3 list of output mesh vertices (V come first)\n      //    TT  #TT by 3 list of tetrahedra indices into TV.\n      //    TF  #TF by 3 list of facets from F potentially subdivided.\n      // \n      template <\n        typename DerivedV, \n        typename DerivedF, \n        typename DerivedTV, \n        typename DerivedTT, \n        typename DerivedTF>\n      IGL_INLINE bool cdt(\n        const Eigen::PlainObjectBase<DerivedV>& V,\n        const Eigen::PlainObjectBase<DerivedF>& F,\n        const CDTParam & param,\n        Eigen::PlainObjectBase<DerivedTV>& TV,\n        Eigen::PlainObjectBase<DerivedTT>& TT,\n        Eigen::PlainObjectBase<DerivedTF>& TF);\n    }\n  }\n}\n\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"cdt.cpp\"\n#endif\n\n#endif\n\n\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/tetgen/mesh_to_tetgenio.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"mesh_to_tetgenio.h\"\n\n// IGL includes \n#include \"../../matrix_to_list.h\"\n\n// STL includes\n#include <cassert>\n\nIGL_INLINE bool igl::copyleft::tetgen::mesh_to_tetgenio(\n  const std::vector<std::vector<REAL > > & V, \n  const std::vector<std::vector<int> > & F, \n  tetgenio & in)\n{\n  using namespace std;\n  // all indices start from 0\n  in.firstnumber = 0;\n\n  in.numberofpoints = V.size();\n  in.pointlist = new REAL[in.numberofpoints * 3];\n  // loop over points\n  for(int i = 0; i < (int)V.size(); i++)\n  {\n    assert(V[i].size() == 3);\n    in.pointlist[i*3+0] = V[i][0];\n    in.pointlist[i*3+1] = V[i][1];\n    in.pointlist[i*3+2] = V[i][2];\n  }\n\n  in.numberoffacets = F.size();\n  in.facetlist = new tetgenio::facet[in.numberoffacets];\n  in.facetmarkerlist = new int[in.numberoffacets];\n\n  // loop over face\n  for(int i = 0;i < (int)F.size(); i++)\n  {\n    in.facetmarkerlist[i] = i;\n    tetgenio::facet * f = &in.facetlist[i];\n    f->numberofpolygons = 1;\n    f->polygonlist = new tetgenio::polygon[f->numberofpolygons];\n    f->numberofholes = 0;\n    f->holelist = NULL;\n    tetgenio::polygon * p = &f->polygonlist[0];\n    p->numberofvertices = F[i].size();\n    p->vertexlist = new int[p->numberofvertices];\n    // loop around face\n    for(int j = 0;j < (int)F[i].size(); j++)\n    {\n      p->vertexlist[j] = F[i][j];\n    }\n  }\n  return true;\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE bool igl::copyleft::tetgen::mesh_to_tetgenio(\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  tetgenio & in)\n{\n  using namespace std;\n  vector<vector<REAL> > vV;\n  vector<vector<int> > vF;\n  matrix_to_list(V,vV);\n  matrix_to_list(F,vF);\n  return mesh_to_tetgenio(vV,vF,in);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate bool igl::copyleft::tetgen::mesh_to_tetgenio<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, tetgenio&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/tetgen/mesh_to_tetgenio.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_TETGEN_MESH_TO_TETGENIO_H\n#define IGL_COPYLEFT_TETGEN_MESH_TO_TETGENIO_H\n#include \"../../igl_inline.h\"\n\n#ifndef TETLIBRARY\n#  define TETLIBRARY \n#endif\n#include \"tetgen.h\" // Defined tetgenio, REAL\n#include <vector>\n#include <Eigen/Core>\n\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace tetgen\n    {\n      // Load a vertex list and face list into a tetgenio object\n      // Inputs:\n      //   V  #V by 3 vertex position list\n      //   F  #F list of polygon face indices into V (0-indexed)\n      // Outputs:\n      //   in  tetgenio input object\n      // Returns true on success, false on error\n      IGL_INLINE bool mesh_to_tetgenio(\n        const std::vector<std::vector<REAL > > & V, \n        const std::vector<std::vector<int> > & F, \n        tetgenio & in);\n      \n      // Wrapper with Eigen types\n      // Templates:\n      //   DerivedV  real-value: i.e. from MatrixXd\n      //   DerivedF  integer-value: i.e. from MatrixXi\n      template <typename DerivedV, typename DerivedF>\n      IGL_INLINE bool mesh_to_tetgenio(\n        const Eigen::PlainObjectBase<DerivedV>& V,\n        const Eigen::PlainObjectBase<DerivedF>& F,\n        tetgenio & in);\n    }\n  }\n}\n\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"mesh_to_tetgenio.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/tetgen/mesh_with_skeleton.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"mesh_with_skeleton.h\"\n#include \"tetrahedralize.h\"\n\n#include \"../../sample_edges.h\"\n#include \"../../cat.h\"\n\n#include <iostream>\n// Default settings pq2Y tell tetgen to mesh interior of triangle mesh and\n// to produce a graded tet mesh\nconst static std::string DEFAULT_TETGEN_FLAGS = \"pq2Y\";\n\nIGL_INLINE bool igl::copyleft::tetgen::mesh_with_skeleton(\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  const Eigen::MatrixXd & C,\n  const Eigen::VectorXi & /*P*/,\n  const Eigen::MatrixXi & BE,\n  const Eigen::MatrixXi & CE,\n  const int samples_per_bone,\n  const std::string & tetgen_flags,\n  Eigen::MatrixXd & VV,\n  Eigen::MatrixXi & TT,\n  Eigen::MatrixXi & FF)\n{\n  using namespace Eigen;\n  using namespace std;\n  const string eff_tetgen_flags = \n    (tetgen_flags.length() == 0?DEFAULT_TETGEN_FLAGS:tetgen_flags);\n  // Collect all edges that need samples:\n  MatrixXi BECE = cat(1,BE,CE);\n  MatrixXd S;\n  // Sample each edge with 10 samples. (Choice of 10 doesn't seem to matter so\n  // much, but could under some circumstances)\n  sample_edges(C,BECE,samples_per_bone,S);\n  // Vertices we'll constrain tet mesh to meet\n  MatrixXd VS = cat(1,V,S);\n  // Use tetgen to mesh the interior of surface, this assumes surface:\n  //   * has no holes\n  //   * has no non-manifold edges or vertices\n  //   * has consistent orientation\n  //   * has no self-intersections\n  //   * has no 0-volume pieces\n  cerr<<\"tetgen begin()\"<<endl;\n  int status = tetrahedralize( VS,F,eff_tetgen_flags,VV,TT,FF);\n  cerr<<\"tetgen end()\"<<endl;\n  if(FF.rows() != F.rows())\n  {\n    // Issue a warning if the surface has changed\n    cerr<<\"mesh_with_skeleton: Warning: boundary faces != input faces\"<<endl;\n  }\n  if(status != 0)\n  {\n    cerr<<\n      \"***************************************************************\"<<endl<<\n      \"***************************************************************\"<<endl<<\n      \"***************************************************************\"<<endl<<\n      \"***************************************************************\"<<endl<<\n      \"* mesh_with_skeleton: tetgen failed. Just meshing convex hull *\"<<endl<<\n      \"***************************************************************\"<<endl<<\n      \"***************************************************************\"<<endl<<\n      \"***************************************************************\"<<endl<<\n      \"***************************************************************\"<<endl;\n    // If meshing convex hull then use more regular mesh\n    status = tetrahedralize(VS,F,\"q1.414\",VV,TT,FF);\n    // I suppose this will fail if the skeleton is outside the mesh\n    assert(FF.maxCoeff() < VV.rows());\n    if(status != 0)\n    {\n      cerr<<\"mesh_with_skeleton: tetgen failed again.\"<<endl;\n      return false;\n    }\n  }\n\n  return true;\n}\n\nIGL_INLINE bool igl::copyleft::tetgen::mesh_with_skeleton(\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  const Eigen::MatrixXd & C,\n  const Eigen::VectorXi & P,\n  const Eigen::MatrixXi & BE,\n  const Eigen::MatrixXi & CE,\n  const int samples_per_bone,\n  Eigen::MatrixXd & VV,\n  Eigen::MatrixXi & TT,\n  Eigen::MatrixXi & FF)\n{\n  return mesh_with_skeleton(\n    V,F,C,P,BE,CE,samples_per_bone,DEFAULT_TETGEN_FLAGS,VV,TT,FF);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/tetgen/mesh_with_skeleton.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_TETGEN_MESH_WITH_SKELETON_H\n#define IGL_COPYLEFT_TETGEN_MESH_WITH_SKELETON_H\n#include \"../../igl_inline.h\"\n#include <Eigen/Dense>\n#include <string>\n\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace tetgen\n    {\n      // Mesh the interior of a given surface with tetrahedra which are graded\n      // (tend to be small near the surface and large inside) and conform to the\n      // given handles and samplings thereof.\n      //\n      // Inputs:\n      //  V  #V by 3 list of mesh vertex positions\n      //  F  #F by 3 list of triangle indices\n      //  C  #C by 3 list of vertex positions\n      //  P  #P list of point handle indices\n      //  BE #BE by 2 list of bone-edge indices\n      //  CE #CE by 2 list of cage-edge indices\n      //  samples_per_bone  #samples to add per bone\n      //  tetgen_flags  flags to pass to tetgen {\"\"-->\"pq2Y\"} otherwise you're on\n      //    your own and it's your funeral if you pass nonsense flags\n      // Outputs:\n      //  VV  #VV by 3 list of tet-mesh vertex positions\n      //  TT  #TT by 4 list of tetrahedra indices\n      //  FF  #FF by 3 list of surface triangle indices\n      // Returns true only on success\n      IGL_INLINE bool mesh_with_skeleton(\n        const Eigen::MatrixXd & V,\n        const Eigen::MatrixXi & F,\n        const Eigen::MatrixXd & C,\n        const Eigen::VectorXi & /*P*/,\n        const Eigen::MatrixXi & BE,\n        const Eigen::MatrixXi & CE,\n        const int samples_per_bone,\n        const std::string & tetgen_flags,\n        Eigen::MatrixXd & VV,\n        Eigen::MatrixXi & TT,\n        Eigen::MatrixXi & FF);\n      // Wrapper using default tetgen_flags\n      IGL_INLINE bool mesh_with_skeleton(\n        const Eigen::MatrixXd & V,\n        const Eigen::MatrixXi & F,\n        const Eigen::MatrixXd & C,\n        const Eigen::VectorXi & /*P*/,\n        const Eigen::MatrixXi & BE,\n        const Eigen::MatrixXi & CE,\n        const int samples_per_bone,\n        Eigen::MatrixXd & VV,\n        Eigen::MatrixXi & TT,\n        Eigen::MatrixXi & FF);\n    }\n  }\n}\n\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"mesh_with_skeleton.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/tetgen/read_into_tetgenio.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"read_into_tetgenio.h\"\n#include \"mesh_to_tetgenio.h\"\n\n// IGL includes\n#include \"../../pathinfo.h\"\n#ifndef IGL_NO_EIGEN\n#  define IGL_NO_EIGEN_WAS_NOT_ALREADY_DEFINED\n#  define IGL_NO_EIGEN\n#endif \n// Include igl headers without including Eigen\n#include \"../../readOBJ.h\"\n#ifdef IGL_NO_EIGEN_WAS_NOT_ALREADY_DEFINED\n#  undef IGL_NO_EIGEN\n#endif\n\n// STL includes\n#include <algorithm>\n#include <iostream>\n#include <vector>\n\nIGL_INLINE bool igl::copyleft::tetgen::read_into_tetgenio(\n  const std::string & path,\n  tetgenio & in)\n{\n  using namespace std;\n  // get file extension\n  string dirname,basename,ext,filename;\n  pathinfo(path,dirname,basename,ext,filename);\n  // convert to lower case for easy comparison\n  transform(ext.begin(), ext.end(), ext.begin(), ::tolower);\n  bool success = false;\n\n  char basename_char[1024];\n  strcpy(basename_char,basename.c_str());\n\n  if(ext == \"obj\")\n  {\n    // read obj into vertex list and face list\n    vector<vector<REAL> > V,TC,N;\n    vector<vector<int>  > F,FTC,FN;\n    success = readOBJ(path,V,TC,N,F,FTC,FN);\n    success &= mesh_to_tetgenio(V,F,in);\n  }else if(ext == \"off\")\n  {\n    success = in.load_off(basename_char);\n  }else if(ext == \"node\")\n  {\n    success = in.load_node(basename_char);\n  }else \n  {\n    if(ext.length() > 0)\n    {\n      cerr<<\"^read_into_tetgenio Warning: Unsupported extension (\"<<ext<<\n        \"): try to load as basename...\"<<endl;\n    }\n    // This changed as of (the so far unreleased) tetgen 1.5\n    //success = in.load_tetmesh(basename_char);\n    //int object = tetgenbehavior::NODES;\n    //if(ext == \"mesh\")\n    //{\n    //  object = tetgenbehavior::MEDIT;\n    //}\n    success = in.load_tetmesh(basename_char,!tetgenbehavior::MEDIT);\n  }\n\n  return success;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/tetgen/read_into_tetgenio.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_TETGEN_READ_INTO_TETGENIO_H\n#define IGL_COPYLEFT_TETGEN_READ_INTO_TETGENIO_H\n#include \"../../igl_inline.h\"\n\n#include <string>\n#ifndef TETLIBRARY\n#define TETLIBRARY \n#endif\n#include \"tetgen.h\" // Defined tetgenio, REAL\n\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace tetgen\n    {\n      // Read a mesh or point set into tetgenio (input object for calling\n      // tetgen).  Many file formats are already supported by tetgen:\n      //   .off\n      //   .ply\n      //   .node\n      //   .ply\n      //   .medit\n      //   .vtk\n      //   etc.\n      // Noteably it does not support .obj which is loaded by hand here (also\n      // demonstrating how to load points/faces programatically)\n      //\n      // If the file extension is not recognized the filename is assumed to be\n      // the basename of a collection describe a tetmesh, (of which at least\n      // the .node file must exist):\n      //   [filename].node\n      //   [filename].ele\n      //   [filename].face\n      //   [filename].edge\n      //   [filename].vol\n      //\n      // Inputs:\n      //   path  path to file or basename to files\n      // Outputs:\n      //   in  tetgenio input object\n      // Returns true on success, false on error\n      IGL_INLINE bool read_into_tetgenio(\n        const std::string & path, \n        tetgenio & in);\n    }\n  }\n}\n\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"read_into_tetgenio.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/tetgen/tetgenio_to_tetmesh.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"tetgenio_to_tetmesh.h\"\n\n// IGL includes\n#include \"../../list_to_matrix.h\"\n\n// STL includes\n#include <iostream>\n\nIGL_INLINE bool igl::copyleft::tetgen::tetgenio_to_tetmesh(\n  const tetgenio & out,\n  std::vector<std::vector<REAL > > & V, \n  std::vector<std::vector<int> > & T,\n  std::vector<std::vector<int> > & F)\n{\n  using namespace std;\n  // process points\n  if(out.pointlist == NULL)\n  {\n    cerr<<\"^tetgenio_to_tetmesh Error: point list is NULL\\n\"<<endl;\n    return false;\n  }\n  V.resize(out.numberofpoints,vector<REAL>(3));\n  // loop over points\n  for(int i = 0;i < out.numberofpoints; i++)\n  {\n    V[i][0] = out.pointlist[i*3+0];\n    V[i][1] = out.pointlist[i*3+1];\n    V[i][2] = out.pointlist[i*3+2];\n  }\n\n\n  // process tets\n  if(out.tetrahedronlist == NULL)\n  {\n    cerr<<\"^tetgenio_to_tetmesh Error: tet list is NULL\\n\"<<endl;\n    return false;\n  }\n\n  // When would this not be 4?\n  assert(out.numberofcorners == 4);\n  T.resize(out.numberoftetrahedra,vector<int>(out.numberofcorners));\n  int min_index = 1e7;\n  int max_index = -1e7;\n  // loop over tetrahedra\n  for(int i = 0; i < out.numberoftetrahedra; i++)\n  {\n    for(int j = 0; j<out.numberofcorners; j++)\n    {\n      int index = out.tetrahedronlist[i * out.numberofcorners + j];\n      T[i][j] = index;\n      min_index = (min_index > index ? index : min_index);\n      max_index = (max_index < index ? index : max_index);\n    }\n  }\n  assert(min_index >= 0);\n  assert(max_index >= 0);\n  assert(max_index < (int)V.size());\n\n  cout<<out.numberoftrifaces<<endl;\n\n  // When would this not be 4?\n  F.clear();\n  // loop over tetrahedra\n  for(int i = 0; i < out.numberoftrifaces; i++)\n  {\n    if(out.trifacemarkerlist[i]>=0)\n    {\n      vector<int> face(3);\n      for(int j = 0; j<3; j++)\n      {\n        face[j] = out.trifacelist[i * 3 + j];\n      }\n      F.push_back(face);\n    }\n  }\n\n  return true;\n}\n\nIGL_INLINE bool igl::copyleft::tetgen::tetgenio_to_tetmesh(\n  const tetgenio & out,\n  std::vector<std::vector<REAL > > & V, \n  std::vector<std::vector<int> > & T)\n{\n  std::vector<std::vector<int> > F;\n  return tetgenio_to_tetmesh(out,V,T,F);\n}\n\ntemplate <typename DerivedV, typename DerivedT, typename DerivedF>\nIGL_INLINE bool igl::copyleft::tetgen::tetgenio_to_tetmesh(\n  const tetgenio & out,\n  Eigen::PlainObjectBase<DerivedV>& V,\n  Eigen::PlainObjectBase<DerivedT>& T,\n  Eigen::PlainObjectBase<DerivedF>& F)\n{\n  using namespace std;\n  vector<vector<REAL> > vV;\n  vector<vector<int> > vT;\n  vector<vector<int> > vF;\n  bool success = tetgenio_to_tetmesh(out,vV,vT,vF);\n  if(!success)\n  {\n    return false;\n  }\n  bool V_rect = list_to_matrix(vV,V);\n  if(!V_rect)\n  {\n    // igl::list_to_matrix(vV,V) already printed error message to std err\n    return false;\n  }\n  bool T_rect = list_to_matrix(vT,T);\n  if(!T_rect)\n  {\n    // igl::list_to_matrix(vT,T) already printed error message to std err\n    return false;\n  }\n  bool F_rect = list_to_matrix(vF,F);\n  if(!F_rect)\n  {\n    return false;\n  }\n\n  return true;\n}\n\ntemplate <typename DerivedV, typename DerivedT>\nIGL_INLINE bool igl::copyleft::tetgen::tetgenio_to_tetmesh(\n  const tetgenio & out,\n  Eigen::PlainObjectBase<DerivedV>& V,\n  Eigen::PlainObjectBase<DerivedT>& T)\n{\n  Eigen::PlainObjectBase<DerivedT> F;\n  return tetgenio_to_tetmesh(out,V,T,F);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate bool igl::copyleft::tetgen::tetgenio_to_tetmesh<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(tetgenio const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/tetgen/tetgenio_to_tetmesh.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_TETGEN_TETGENIO_TO_TETMESH_H\n#define IGL_COPYLEFT_TETGEN_TETGENIO_TO_TETMESH_H\n#include \"../../igl_inline.h\"\n\n#ifndef TETLIBRARY\n#define TETLIBRARY \n#endif\n#include \"tetgen.h\" // Defined tetgenio, REAL\n#include <vector>\n#include <Eigen/Core>\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace tetgen\n    {\n      // Extract a tetrahedral mesh from a tetgenio object\n      // Inputs:\n      //   out tetgenio output object\n      // Outputs:\n      //   V  #V by 3 vertex position list\n      //   T  #T by 4 list of tetrahedra indices into V\n      //   F  #F by 3 list of marked facets\n      // Returns true on success, false on error\n      IGL_INLINE bool tetgenio_to_tetmesh(\n        const tetgenio & out,\n        std::vector<std::vector<REAL > > & V, \n        std::vector<std::vector<int> > & T,\n        std::vector<std::vector<int> > & F);\n      IGL_INLINE bool tetgenio_to_tetmesh(\n        const tetgenio & out,\n        std::vector<std::vector<REAL > > & V, \n        std::vector<std::vector<int> > & T);\n      \n      // Wrapper with Eigen types\n      // Templates:\n      //   DerivedV  real-value: i.e. from MatrixXd\n      //   DerivedT  integer-value: i.e. from MatrixXi\n      template <typename DerivedV, typename DerivedT, typename DerivedF>\n      IGL_INLINE bool tetgenio_to_tetmesh(\n        const tetgenio & out,\n        Eigen::PlainObjectBase<DerivedV>& V,\n        Eigen::PlainObjectBase<DerivedT>& T,\n        Eigen::PlainObjectBase<DerivedF>& F);\n      template <typename DerivedV, typename DerivedT>\n      IGL_INLINE bool tetgenio_to_tetmesh(\n        const tetgenio & out,\n        Eigen::PlainObjectBase<DerivedV>& V,\n        Eigen::PlainObjectBase<DerivedT>& T);\n    }\n  }\n}\n\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"tetgenio_to_tetmesh.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/tetgen/tetrahedralize.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"tetrahedralize.h\"\n#include \"mesh_to_tetgenio.h\"\n#include \"tetgenio_to_tetmesh.h\"\n\n// IGL includes \n#include \"../../matrix_to_list.h\"\n#include \"../../list_to_matrix.h\"\n#include \"../../boundary_facets.h\"\n\n// STL includes\n#include <cassert>\n#include <iostream>\n\nIGL_INLINE int igl::copyleft::tetgen::tetrahedralize(\n  const std::vector<std::vector<REAL > > & V, \n  const std::vector<std::vector<int> > & F, \n  const std::string switches,\n  std::vector<std::vector<REAL > > & TV, \n  std::vector<std::vector<int > > & TT, \n  std::vector<std::vector<int> > & TF)\n{\n  using namespace std;\n  tetgenio in,out;\n  bool success;\n  success = mesh_to_tetgenio(V,F,in);\n  if(!success)\n  {\n    return -1;\n  }\n  try\n  {\n    char * cswitches = new char[switches.size() + 1];\n    std::strcpy(cswitches,switches.c_str());\n    ::tetrahedralize(cswitches,&in, &out);\n    delete[] cswitches;\n  }catch(int e)\n  {\n    cerr<<\"^\"<<__FUNCTION__<<\": TETGEN CRASHED... KABOOOM!!!\"<<endl;\n    return 1;\n  }\n  if(out.numberoftetrahedra == 0)\n  {\n    cerr<<\"^\"<<__FUNCTION__<<\": Tetgen failed to create tets\"<<endl;\n    return 2;\n  }\n  success = tetgenio_to_tetmesh(out,TV,TT,TF);\n  if(!success)\n  {\n    return -1;\n  }\n  //boundary_facets(TT,TF);\n  return 0;\n}\n\ntemplate <\n  typename DerivedV, \n  typename DerivedF, \n  typename DerivedTV, \n  typename DerivedTT, \n  typename DerivedTF>\nIGL_INLINE int igl::copyleft::tetgen::tetrahedralize(\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  const std::string switches,\n  Eigen::PlainObjectBase<DerivedTV>& TV,\n  Eigen::PlainObjectBase<DerivedTT>& TT,\n  Eigen::PlainObjectBase<DerivedTF>& TF)\n{\n  using namespace std;\n  vector<vector<REAL> > vV,vTV;\n  vector<vector<int> > vF,vTT,vTF;\n  matrix_to_list(V,vV);\n  matrix_to_list(F,vF);\n  int e = tetrahedralize(vV,vF,switches,vTV,vTT,vTF);\n  if(e == 0)\n  {\n    bool TV_rect = list_to_matrix(vTV,TV);\n    if(!TV_rect)\n    {\n      return 3;\n    }\n    bool TT_rect = list_to_matrix(vTT,TT);\n    if(!TT_rect)\n    {\n      return 3;\n    }\n    bool TF_rect = list_to_matrix(vTF,TF);\n    if(!TF_rect)\n    {\n      return 3;\n    }\n  }\n  return e;\n}\n\ntemplate <\n  typename DerivedV, \n  typename DerivedF, \n  typename DerivedVM, \n  typename DerivedFM, \n  typename DerivedTV, \n  typename DerivedTT, \n  typename DerivedTF,\n  typename DerivedTM>\nIGL_INLINE int igl::copyleft::tetgen::tetrahedralize(\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  const Eigen::PlainObjectBase<DerivedVM>& VM,\n  const Eigen::PlainObjectBase<DerivedFM>& FM,\n  const std::string switches,\n  Eigen::PlainObjectBase<DerivedTV>& TV,\n  Eigen::PlainObjectBase<DerivedTT>& TT,\n  Eigen::PlainObjectBase<DerivedTF>& TF,\n  Eigen::PlainObjectBase<DerivedTM>& TM)\n{\n  using namespace std;\n  vector<vector<REAL> > vV,vTV;\n  vector<vector<int> > vF,vTT,vTF;\n  vector<int> vTM;\n\t\n  matrix_to_list(V,vV);\n  matrix_to_list(F,vF);\n\tvector<int> vVM = matrix_to_list(VM);\n\tvector<int> vFM = matrix_to_list(FM);\n  int e = tetrahedralize(vV,vF,vVM,vFM,switches,vTV,vTT,vTF,vTM);\n  if(e == 0)\n  {\n    bool TV_rect = list_to_matrix(vTV,TV);\n    if(!TV_rect)\n    {\n      return false;\n    }\n    bool TT_rect = list_to_matrix(vTT,TT);\n    if(!TT_rect)\n    {\n      return false;\n    }\n    bool TF_rect = list_to_matrix(vTF,TF);\n    if(!TF_rect)\n    {\n      return false;\n    }\n    bool TM_rect = list_to_matrix(vTM,TM);\n    if(!TM_rect)\n    {\n      return false;\n    }\n  }\n  return e;\n}\nIGL_INLINE int igl::copyleft::tetgen::tetrahedralize(\n  const std::vector<std::vector<REAL > > & V, \n  const std::vector<std::vector<int> > & F, \n  const std::vector<int> & VM, \n\tconst std::vector<int> & FM,\n  const std::string switches,\n  std::vector<std::vector<REAL > > & TV, \n  std::vector<std::vector<int > > & TT, \n  std::vector<std::vector<int> > & TF,\n  std::vector<int> & TM)\n{\n  using namespace std;\n  tetgenio in,out;\n  bool success;\n  success = mesh_to_tetgenio(V,F,in);\n  if(!success)\n  {\n    return -1;\n  }\n\tin.pointmarkerlist = new int[VM.size()];\n\tfor (int i = 0; i < VM.size(); ++i) {\n\t\tin.pointmarkerlist[i] = VM[i];\n\t}\n  // These have already been created in mesh_to_tetgenio.\n  // Reset them here.\n\tfor (int i = 0; i < FM.size(); ++i) {\n\t\tin.facetmarkerlist[i] = FM[i];\n\t}\n  try\n  {\n    char * cswitches = new char[switches.size() + 1];\n    std::strcpy(cswitches,switches.c_str());\n    ::tetrahedralize(cswitches,&in, &out);\n    delete[] cswitches;\n  }catch(int e)\n  {\n    cerr<<\"^\"<<__FUNCTION__<<\": TETGEN CRASHED... KABOOOM!!!\"<<endl;\n    return 1;\n  }\n  if(out.numberoftetrahedra == 0)\n  {\n    cerr<<\"^\"<<__FUNCTION__<<\": Tetgen failed to create tets\"<<endl;\n    return 2;\n  }\n  success = tetgenio_to_tetmesh(out,TV,TT,TF);\n  if(!success)\n  {\n    return -1;\n  }\n\tTM.resize(out.numberofpoints);\n\tfor (int i = 0; i < out.numberofpoints; ++i) {\n\t\tTM[i] = out.pointmarkerlist[i];\n\t}\n  //boundary_facets(TT,TF);\n  return 0;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate int igl::copyleft::tetgen::tetrahedralize<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate int igl::copyleft::tetgen::tetrahedralize<Eigen::Matrix<double, -1, -1, 0, -1, -1>,Eigen::Matrix<int, -1, -1, 0, -1, -1>,Eigen::Matrix<int, -1, 1, 0, -1, 1>,Eigen::Matrix<int, -1, 1, 0, -1, 1>,Eigen::Matrix<double, -1, -1, 0, -1, -1>,Eigen::Matrix<int, -1, -1, 0, -1, -1>,Eigen::Matrix<int, -1, -1, 0, -1, -1>,Eigen::Matrix<int, -1, 1, 0, -1, 1> >(const Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > &,const Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > &,const Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > &,const Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > &,const std::basic_string<char, std::char_traits<char>, std::allocator<char> >,Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > &,Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > &,Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > &, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > &);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/copyleft/tetgen/tetrahedralize.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COPYLEFT_TETGEN_TETRAHEDRALIZE_H\n#define IGL_COPYLEFT_TETGEN_TETRAHEDRALIZE_H\n#include \"../../igl_inline.h\"\n\n#include <vector>\n#include <string>\n#include <Eigen/Core>\n#ifndef TETLIBRARY\n#define TETLIBRARY \n#endif\n#include \"tetgen.h\" // Defined REAL\n\nnamespace igl\n{\n  namespace copyleft\n  {\n    namespace tetgen\n    {\n      // Mesh the interior of a surface mesh (V,F) using tetgen\n      //\n      // Inputs:\n      //   V  #V by 3 vertex position list\n      //   F  #F list of polygon face indices into V (0-indexed)\n      //   switches  string of tetgen options (See tetgen documentation) e.g.\n      //     \"pq1.414a0.01\" tries to mesh the interior of a given surface with\n      //       quality and area constraints\n      //     \"\" will mesh the convex hull constrained to pass through V (ignores F)\n      // Outputs:\n      //   TV  #V by 3 vertex position list\n      //   TT  #T by 4 list of tet face indices\n      //   TF  #F by 3 list of triangle face indices\n      // Returns status:\n      //   0 success\n      //   1 tetgen threw exception\n      //   2 tetgen did not crash but could not create any tets (probably there are\n      //     holes, duplicate faces etc.)\n      //   -1 other error\n      IGL_INLINE int tetrahedralize(\n        const std::vector<std::vector<REAL > > & V, \n        const std::vector<std::vector<int> > & F, \n        const std::string switches,\n        std::vector<std::vector<REAL > > & TV, \n        std::vector<std::vector<int > > & TT, \n        std::vector<std::vector<int> > & TF);\n      \n      // Wrapper with Eigen types\n      // Templates:\n      //   DerivedV  real-value: i.e. from MatrixXd\n      //   DerivedF  integer-value: i.e. from MatrixXi\n      template <\n        typename DerivedV, \n        typename DerivedF, \n        typename DerivedTV, \n        typename DerivedTT, \n        typename DerivedTF>\n      IGL_INLINE int tetrahedralize(\n        const Eigen::PlainObjectBase<DerivedV>& V,\n        const Eigen::PlainObjectBase<DerivedF>& F,\n        const std::string switches,\n        Eigen::PlainObjectBase<DerivedTV>& TV,\n        Eigen::PlainObjectBase<DerivedTT>& TT,\n        Eigen::PlainObjectBase<DerivedTF>& TF);\n      \n\t\t\t// Mesh the interior of a surface mesh (V,F) using tetgen\n      //\n      // Inputs:\n      //   V  #V by 3 vertex position list\n      //   F  #F list of polygon face indices into V (0-indexed)\n\t\t\t//   M  #V list of markers for vertices\n      //   switches  string of tetgen options (See tetgen documentation) e.g.\n      //     \"pq1.414a0.01\" tries to mesh the interior of a given surface with\n      //       quality and area constraints\n      //     \"\" will mesh the convex hull constrained to pass through V (ignores F)\n      // Outputs:\n      //   TV  #V by 3 vertex position list\n      //   TT  #T by 4 list of tet face indices\n      //   TF  #F by 3 list of triangle face indices\n\t\t\t//   TM  #V list of markers for vertices\n      // Returns status:\n      //   0 success\n      //   1 tetgen threw exception\n      //   2 tetgen did not crash but could not create any tets (probably there are\n      //     holes, duplicate faces etc.)\n      //   -1 other error\n      IGL_INLINE int tetrahedralize(\n        const std::vector<std::vector<REAL > > & V, \n        const std::vector<std::vector<int> > & F, \n\t\t\t\tconst std::vector<int> & VM,\n\t\t\t\tconst std::vector<int> & FM,\n        const std::string switches,\n        std::vector<std::vector<REAL > > & TV, \n        std::vector<std::vector<int > > & TT, \n        std::vector<std::vector<int> > & TF,\n\t\t\t\tstd::vector<int> & TM);\n      \n      // Wrapper with Eigen types\n      // Templates:\n      //   DerivedV  real-value: i.e. from MatrixXd\n      //   DerivedF  integer-value: i.e. from MatrixXi\n      template <\n        typename DerivedV, \n        typename DerivedF, \n\t\t\t\ttypename DerivedVM,\n\t\t\t\ttypename DerivedFM,\n        typename DerivedTV, \n        typename DerivedTT, \n        typename DerivedTF, \n        typename DerivedTM>\n      IGL_INLINE int tetrahedralize(\n        const Eigen::PlainObjectBase<DerivedV>& V,\n        const Eigen::PlainObjectBase<DerivedF>& F,\n        const Eigen::PlainObjectBase<DerivedVM>& VM,\n        const Eigen::PlainObjectBase<DerivedFM>& FM,\n        const std::string switches,\n        Eigen::PlainObjectBase<DerivedTV>& TV,\n        Eigen::PlainObjectBase<DerivedTT>& TT,\n        Eigen::PlainObjectBase<DerivedTF>& TF,\n        Eigen::PlainObjectBase<DerivedTM>& TM);\n    }\n  }\n}\n\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"tetrahedralize.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/cotmatrix.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"cotmatrix.h\"\n#include <vector>\n\n// For error printing\n#include <cstdio>\n#include \"cotmatrix_entries.h\"\n\n// Bug in unsupported/Eigen/SparseExtra needs iostream first\n#include <iostream>\n\ntemplate <typename DerivedV, typename DerivedF, typename Scalar>\nIGL_INLINE void igl::cotmatrix(\n  const Eigen::MatrixBase<DerivedV> & V, \n  const Eigen::MatrixBase<DerivedF> & F, \n  Eigen::SparseMatrix<Scalar>& L)\n{\n  using namespace Eigen;\n  using namespace std;\n\n  L.resize(V.rows(),V.rows());\n  Matrix<int,Dynamic,2> edges;\n  int simplex_size = F.cols();\n  // 3 for triangles, 4 for tets\n  assert(simplex_size == 3 || simplex_size == 4);\n  if(simplex_size == 3)\n  {\n    // This is important! it could decrease the comptuation time by a factor of 2\n    // Laplacian for a closed 2d manifold mesh will have on average 7 entries per\n    // row\n    L.reserve(10*V.rows());\n    edges.resize(3,2);\n    edges << \n      1,2,\n      2,0,\n      0,1;\n  }else if(simplex_size == 4)\n  {\n    L.reserve(17*V.rows());\n    edges.resize(6,2);\n    edges << \n      1,2,\n      2,0,\n      0,1,\n      3,0,\n      3,1,\n      3,2;\n  }else\n  {\n    return;\n  }\n  // Gather cotangents\n  Matrix<Scalar,Dynamic,Dynamic> C;\n  cotmatrix_entries(V,F,C);\n  \n  vector<Triplet<Scalar> > IJV;\n  IJV.reserve(F.rows()*edges.rows()*4);\n  // Loop over triangles\n  for(int i = 0; i < F.rows(); i++)\n  {\n    // loop over edges of element\n    for(int e = 0;e<edges.rows();e++)\n    {\n      int source = F(i,edges(e,0));\n      int dest = F(i,edges(e,1));\n      IJV.push_back(Triplet<Scalar>(source,dest,C(i,e)));\n      IJV.push_back(Triplet<Scalar>(dest,source,C(i,e)));\n      IJV.push_back(Triplet<Scalar>(source,source,-C(i,e)));\n      IJV.push_back(Triplet<Scalar>(dest,dest,-C(i,e)));\n    }\n  }\n  L.setFromTriplets(IJV.begin(),IJV.end());\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::cotmatrix<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, double>(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::SparseMatrix<double, 0, int>&);\ntemplate void igl::cotmatrix<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 4, 0, -1, 4>, double>(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 4, 0, -1, 4> > const&, Eigen::SparseMatrix<double, 0, int>&);\ntemplate void igl::cotmatrix<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, double>(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::SparseMatrix<double, 0, int>&);\ntemplate void igl::cotmatrix<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, double>(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::SparseMatrix<double, 0, int>&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/cotmatrix.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COTMATRIX_H\n#define IGL_COTMATRIX_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Dense>\n#include <Eigen/Sparse>\n\n// History:\n//  Used const references rather than copying the entire mesh \n//    Alec 9 October 2011\n//  removed cotan (uniform weights) optional parameter it was building a buggy\n//    half of the uniform laplacian, please see adjacency_matrix istead \n//    Alec 9 October 2011\n\nnamespace igl \n{\n  // Constructs the cotangent stiffness matrix (discrete laplacian) for a given\n  // mesh (V,F).\n  //\n  // Templates:\n  //   DerivedV  derived type of eigen matrix for V (e.g. derived from\n  //     MatrixXd)\n  //   DerivedF  derived type of eigen matrix for F (e.g. derived from\n  //     MatrixXi)\n  //   Scalar  scalar type for eigen sparse matrix (e.g. double)\n  // Inputs:\n  //   V  #V by dim list of mesh vertex positions\n  //   F  #F by simplex_size list of mesh faces (must be triangles)\n  // Outputs: \n  //   L  #V by #V cotangent matrix, each row i corresponding to V(i,:)\n  //\n  // See also: adjacency_matrix\n  //\n  // Note: This Laplacian uses the convention that diagonal entries are\n  // **minus** the sum of off-diagonal entries. The diagonal entries are\n  // therefore in general negative and the matrix is **negative** semi-definite\n  // (immediately, -L is **positive** semi-definite)\n  //\n  template <typename DerivedV, typename DerivedF, typename Scalar>\n  IGL_INLINE void cotmatrix(\n    const Eigen::MatrixBase<DerivedV> & V, \n    const Eigen::MatrixBase<DerivedF> & F, \n    Eigen::SparseMatrix<Scalar>& L);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"cotmatrix.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/cotmatrix_entries.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"cotmatrix_entries.h\"\n#include \"doublearea.h\"\n#include \"squared_edge_lengths.h\"\n#include \"edge_lengths.h\"\n#include \"face_areas.h\"\n#include \"volume.h\"\n#include \"dihedral_angles.h\"\n\n#include \"verbose.h\"\n\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedC>\nIGL_INLINE void igl::cotmatrix_entries(\n  const Eigen::MatrixBase<DerivedV>& V,\n  const Eigen::MatrixBase<DerivedF>& F,\n  Eigen::PlainObjectBase<DerivedC>& C)\n{\n  using namespace std;\n  using namespace Eigen;\n  // simplex size (3: triangles, 4: tetrahedra)\n  int simplex_size = F.cols();\n  // Number of elements\n  int m = F.rows();\n\n  // Law of cosines + law of sines\n  switch(simplex_size)\n  {\n    case 3:\n    {\n      // Triangles\n      //Compute Squared Edge lenghts \n      Matrix<typename DerivedC::Scalar,Dynamic,3> l2;\n      igl::squared_edge_lengths(V,F,l2);\n      //Compute Edge lenghts \n      Matrix<typename DerivedC::Scalar,Dynamic,3> l;\n      l = l2.array().sqrt();\n      \n      // double area\n      Matrix<typename DerivedC::Scalar,Dynamic,1> dblA;\n      doublearea(l,0.,dblA);\n      // cotangents and diagonal entries for element matrices\n      // correctly divided by 4 (alec 2010)\n      C.resize(m,3);\n      for(int i = 0;i<m;i++)\n      {\n        C(i,0) = (l2(i,1) + l2(i,2) - l2(i,0))/dblA(i)/4.0;\n        C(i,1) = (l2(i,2) + l2(i,0) - l2(i,1))/dblA(i)/4.0;\n        C(i,2) = (l2(i,0) + l2(i,1) - l2(i,2))/dblA(i)/4.0;\n      }\n      break;\n    }\n    case 4:\n    {\n\n      // edge lengths numbered same as opposite vertices\n      Matrix<typename DerivedC::Scalar,Dynamic,6> l;\n      edge_lengths(V,F,l);\n      Matrix<typename DerivedC::Scalar,Dynamic,4> s;\n      face_areas(l,s);\n      Matrix<typename DerivedC::Scalar,Dynamic,6> cos_theta,theta;\n      dihedral_angles_intrinsic(l,s,theta,cos_theta);\n\n      // volume\n      Matrix<typename DerivedC::Scalar,Dynamic,1> vol;\n      volume(l,vol);\n\n\n      // Law of sines\n      // http://mathworld.wolfram.com/Tetrahedron.html\n      Matrix<typename DerivedC::Scalar,Dynamic,6> sin_theta(m,6);\n      sin_theta.col(0) = vol.array() / ((2./(3.*l.col(0).array())).array() * s.col(1).array() * s.col(2).array());\n      sin_theta.col(1) = vol.array() / ((2./(3.*l.col(1).array())).array() * s.col(2).array() * s.col(0).array());\n      sin_theta.col(2) = vol.array() / ((2./(3.*l.col(2).array())).array() * s.col(0).array() * s.col(1).array());\n      sin_theta.col(3) = vol.array() / ((2./(3.*l.col(3).array())).array() * s.col(3).array() * s.col(0).array());\n      sin_theta.col(4) = vol.array() / ((2./(3.*l.col(4).array())).array() * s.col(3).array() * s.col(1).array());\n      sin_theta.col(5) = vol.array() / ((2./(3.*l.col(5).array())).array() * s.col(3).array() * s.col(2).array());\n\n\n      // http://arxiv.org/pdf/1208.0354.pdf Page 18\n      C = (1./6.) * l.array() * cos_theta.array() / sin_theta.array();\n\n      break;\n    }\n    default:\n    {\n      fprintf(stderr,\n          \"cotmatrix_entries.h: Error: Simplex size (%d) not supported\\n\", simplex_size);\n      assert(false);\n    }\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::cotmatrix_entries<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::cotmatrix_entries<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::cotmatrix_entries<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 4, 0, -1, 4>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 4, 0, -1, 4> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::cotmatrix_entries<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/cotmatrix_entries.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COTMATRIX_ENTRIES_H\n#define IGL_COTMATRIX_ENTRIES_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // COTMATRIX_ENTRIES compute the cotangents of each angle in mesh (V,F)\n  // \n  // Inputs:\n  //   V  #V by dim list of rest domain positions\n  //   F  #F by {3|4} list of {triangle|tetrahedra} indices into V\n  // Outputs:\n  //     C  #F by 3 list of 1/2*cotangents corresponding angles\n  //       for triangles, columns correspond to edges [1,2],[2,0],[0,1]\n  //   OR\n  //     C  #F by 6 list of 1/6*cotangents of dihedral angles*edge lengths\n  //       for tets, columns along edges [1,2],[2,0],[0,1],[3,0],[3,1],[3,2] \n  //\n  template <typename DerivedV, typename DerivedF, typename DerivedC>\n  IGL_INLINE void cotmatrix_entries(\n    const Eigen::MatrixBase<DerivedV>& V,\n    const Eigen::MatrixBase<DerivedF>& F,\n    Eigen::PlainObjectBase<DerivedC>& C);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"cotmatrix_entries.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/count.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"count.h\"\n#include \"redux.h\"\n\ntemplate <typename XType, typename SType>\nIGL_INLINE void igl::count(\n  const Eigen::SparseMatrix<XType>& X, \n  const int dim,\n  Eigen::SparseVector<SType>& S)\n{\n  // dim must be 2 or 1\n  assert(dim == 1 || dim == 2);\n  // Get size of input\n  int m = X.rows();\n  int n = X.cols();\n  // resize output\n  if(dim==1)\n  {\n    S = Eigen::SparseVector<SType>(n);\n  }else\n  {\n    S = Eigen::SparseVector<SType>(m);\n  }\n\n  // Iterate over outside\n  for(int k=0; k<X.outerSize(); ++k)\n  {\n    // Iterate over inside\n    for(typename Eigen::SparseMatrix<XType>::InnerIterator it (X,k); it; ++it)\n    {\n      if(dim == 1)\n      {\n        S.coeffRef(it.col()) += (it.value() == 0? 0: 1);\n      }else\n      {\n        S.coeffRef(it.row()) += (it.value() == 0? 0: 1);\n      }\n    }\n  }\n\n}\n\ntemplate <typename AType, typename DerivedB>\nIGL_INLINE void igl::count(\n  const Eigen::SparseMatrix<AType>& A, \n  const int dim,\n  Eigen::PlainObjectBase<DerivedB>& B)\n{\n  typedef typename DerivedB::Scalar Scalar;\n  igl::redux(A,dim,[](Scalar a, Scalar b){ return a+(b==0?0:1);},B);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::count<bool, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::SparseMatrix<bool, 0, int> const&, int, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::count<bool, Eigen::Array<int, -1, 1, 0, -1, 1> >(Eigen::SparseMatrix<bool, 0, int> const&, int, Eigen::PlainObjectBase<Eigen::Array<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/count.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COUNT_H\n#define IGL_COUNT_H\n#include \"igl_inline.h\"\n#include <Eigen/Sparse>\n\nnamespace igl\n{\n  // Note: If your looking for dense matrix matlab like sum for eigen matrics\n  // just use:\n  //   M.colwise().count() or M.rowwise().count()\n  // \n\n  // Count the number of non-zeros in the columns or rows of a sparse matrix\n  //\n  // Inputs:\n  //   X  m by n sparse matrix\n  //   dim  dimension along which to sum (1 or 2)\n  // Output:\n  //   S  n-long sparse vector (if dim == 1) \n  //   or\n  //   S  m-long sparse vector (if dim == 2)\n  template <typename XType, typename SType>\n  IGL_INLINE void count(\n    const Eigen::SparseMatrix<XType>& X, \n    const int dim,\n    Eigen::SparseVector<SType>& S);\n  template <typename XType, typename DerivedS>\n  IGL_INLINE void count(\n    const Eigen::SparseMatrix<XType>& X, \n    const int dim,\n    Eigen::PlainObjectBase<DerivedS>& S);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"count.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/covariance_scatter_matrix.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"covariance_scatter_matrix.h\"\n#include \"arap_linear_block.h\"\n#include \"cotmatrix.h\"\n#include \"diag.h\"\n#include \"sum.h\"\n#include \"edges.h\"\n#include \"verbose.h\"\n#include \"cat.h\"\n\nIGL_INLINE void igl::covariance_scatter_matrix(\n  const Eigen::MatrixXd & V, \n  const Eigen::MatrixXi & F,\n  const ARAPEnergyType energy,\n  Eigen::SparseMatrix<double>& CSM)\n{\n  using namespace Eigen;\n  // number of mesh vertices\n  int n = V.rows();\n  assert(n > F.maxCoeff());\n  // dimension of mesh\n  int dim = V.cols();\n  // Number of mesh elements\n  int m = F.rows();\n\n  // number of rotations\n  int nr;\n  switch(energy)\n  {\n    case ARAP_ENERGY_TYPE_SPOKES:\n      nr = n;\n      break;\n    case ARAP_ENERGY_TYPE_SPOKES_AND_RIMS:\n      nr = n;\n      break;\n    case ARAP_ENERGY_TYPE_ELEMENTS:\n      nr = m;\n      break;\n    default:\n      fprintf(\n        stderr,\n        \"covariance_scatter_matrix.h: Error: Unsupported arap energy %d\\n\",\n        energy);\n      return;\n  }\n\n  SparseMatrix<double> KX,KY,KZ;\n  arap_linear_block(V,F,0,energy,KX);\n  arap_linear_block(V,F,1,energy,KY);\n  SparseMatrix<double> Z(n,nr);\n  if(dim == 2)\n  {\n    CSM = cat(1,cat(2,KX,Z),cat(2,Z,KY)).transpose();\n  }else if(dim == 3)\n  {\n    arap_linear_block(V,F,2,energy,KZ);\n    SparseMatrix<double>ZZ(n,nr*2);\n    CSM = \n      cat(1,cat(1,cat(2,KX,ZZ),cat(2,cat(2,Z,KY),Z)),cat(2,ZZ,KZ)).transpose();\n  }else\n  {\n    fprintf(\n     stderr,\n     \"covariance_scatter_matrix.h: Error: Unsupported dimension %d\\n\",\n     dim);\n    return;\n  }\n\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/covariance_scatter_matrix.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_COVARIANCE_SCATTER_MATRIX_H\n#define IGL_COVARIANCE_SCATTER_MATRIX_H\n\n#include \"igl_inline.h\"\n#include \"ARAPEnergyType.h\"\n#include <Eigen/Dense>\n#include <Eigen/Sparse>\n \nnamespace igl\n{\n  // Construct the covariance scatter matrix for a given arap energy\n  // Inputs:\n  //   V  #V by Vdim list of initial domain positions\n  //   F  #F by 3 list of triangle indices into V\n  //   energy  ARAPEnergyType enum value defining which energy is being used.\n  //     See ARAPEnergyType.h for valid options and explanations.\n  // Outputs:\n  //   CSM dim*#V/#F by dim*#V sparse matrix containing special laplacians along\n  //     the diagonal so that when multiplied by V gives covariance matrix\n  //     elements, can be used to speed up covariance matrix computation\n  IGL_INLINE void covariance_scatter_matrix(\n    const Eigen::MatrixXd & V, \n    const Eigen::MatrixXi & F,\n    const ARAPEnergyType energy,\n    Eigen::SparseMatrix<double>& CSM);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#include \"covariance_scatter_matrix.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/create_index_vbo.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"create_index_vbo.h\"\n\n#ifndef IGL_NO_OPENGL\n// http://www.songho.ca/opengl/gl_vbo.html#create\nIGL_INLINE void igl::create_index_vbo(\n  const Eigen::MatrixXi & F,\n  GLuint & F_vbo_id)\n{\n  // Generate Buffers\n  glGenBuffersARB(1,&F_vbo_id);\n  // Bind Buffers\n  glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB,F_vbo_id);\n  // Copy data to buffers\n  // We expect a matrix with each vertex position on a row, we then want to\n  // pass this data to OpenGL reading across rows (row-major)\n  if(F.Options & Eigen::RowMajor)\n  {\n    glBufferDataARB(\n      GL_ELEMENT_ARRAY_BUFFER_ARB,\n      sizeof(int)*F.size(),\n      F.data(),\n      GL_STATIC_DRAW_ARB);\n  }else\n  {\n    // Create temporary copy of transpose\n    Eigen::MatrixXi FT = F.transpose();\n    // If its column major then we need to temporarily store a transpose\n    glBufferDataARB(\n      GL_ELEMENT_ARRAY_BUFFER_ARB,\n      sizeof(int)*F.size(),\n      FT.data(),\n      GL_STATIC_DRAW);\n  }\n  // bind with 0, so, switch back to normal pointer operation\n  glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);\n}\n#endif\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template specialization\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/create_index_vbo.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_CREATE_INDEX_VBO_H\n#define IGL_CREATE_INDEX_VBO_H\n#ifndef IGL_NO_OPENGL\n#include \"igl_inline.h\"\n// NOTE: It wouldn't be so hard to template this using Eigen's templates\n\n#include <Eigen/Core>\n\n#include \"OpenGL_convenience.h\"\n\n// Create a VBO (Vertex Buffer Object) for a list of indices:\n// GL_ELEMENT_ARRAY_BUFFER_ARB for the triangle indices (F)\nnamespace igl\n{\n\n  // Inputs:\n  //   F  #F by 3 eigen Matrix of face (triangle) indices\n  // Outputs:\n  //   F_vbo_id  buffer id for face indices\n  //\n  IGL_INLINE void create_index_vbo(\n    const Eigen::MatrixXi & F,\n    GLuint & F_vbo_id);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"create_index_vbo.cpp\"\n#endif\n\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/create_mesh_vbo.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"create_mesh_vbo.h\"\n#ifndef IGL_NO_OPENGL\n\n#include \"create_vector_vbo.h\"\n#include \"create_index_vbo.h\"\n\n// http://www.songho.ca/opengl/gl_vbo.html#create\nIGL_INLINE void igl::create_mesh_vbo(\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  GLuint & V_vbo_id,\n  GLuint & F_vbo_id)\n{\n  // Create VBO for vertex position vectors\n  create_vector_vbo(V,V_vbo_id);\n  // Create VBO for face index lists\n  create_index_vbo(F,F_vbo_id);\n}\n\n// http://www.songho.ca/opengl/gl_vbo.html#create\nIGL_INLINE void igl::create_mesh_vbo(\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  const Eigen::MatrixXd & N,\n  GLuint & V_vbo_id,\n  GLuint & F_vbo_id,\n  GLuint & N_vbo_id)\n{\n  // Create VBOs for faces and vertices\n  create_mesh_vbo(V,F,V_vbo_id,F_vbo_id);\n  // Create VBO for normal vectors\n  create_vector_vbo(N,N_vbo_id);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template specialization\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/create_mesh_vbo.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_CREATE_MESH_VBO_H\n#define IGL_CREATE_MESH_VBO_H\n#ifndef IGL_NO_OPENGL\n#include \"igl_inline.h\"\n// NOTE: It wouldn't be so hard to template this using Eigen's templates\n\n#include <Eigen/Core>\n\n#include \"OpenGL_convenience.h\"\n\n// Create a VBO (Vertex Buffer Object) for a mesh. Actually two VBOs: one \n// GL_ARRAY_BUFFER for the vertex positions (V) and one\n// GL_ELEMENT_ARRAY_BUFFER for the triangle indices (F)\nnamespace igl\n{\n\n  // Inputs:\n  //   V  #V by 3 eigen Matrix of mesh vertex 3D positions\n  //   F  #F by 3 eigne Matrix of face (triangle) indices\n  // Outputs:\n  //   V_vbo_id  buffer id for vertex positions\n  //   F_vbo_id  buffer id for face indices\n  //\n  // NOTE: when using glDrawElements VBOs for V and F using MatrixXd and\n  // MatrixXi will have types GL_DOUBLE and GL_UNSIGNED_INT respectively\n  //\n  IGL_INLINE void create_mesh_vbo(\n    const Eigen::MatrixXd & V,\n    const Eigen::MatrixXi & F,\n    GLuint & V_vbo_id,\n    GLuint & F_vbo_id);\n\n  // Inputs:\n  //   V  #V by 3 eigen Matrix of mesh vertex 3D positions\n  //   F  #F by 3 eigne Matrix of face (triangle) indices\n  //   N  #V by 3 eigen Matrix of mesh vertex 3D normals\n  // Outputs:\n  //   V_vbo_id  buffer id for vertex positions\n  //   F_vbo_id  buffer id for face indices\n  //   N_vbo_id  buffer id for vertex positions\n  IGL_INLINE void create_mesh_vbo(\n    const Eigen::MatrixXd & V,\n    const Eigen::MatrixXi & F,\n    const Eigen::MatrixXd & N,\n    GLuint & V_vbo_id,\n    GLuint & F_vbo_id,\n    GLuint & N_vbo_id);\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"create_mesh_vbo.cpp\"\n#endif\n\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/create_shader_program.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"create_shader_program.h\"\n#ifndef IGL_NO_OPENGL\n\n#include \"load_shader.h\"\n#include \"print_program_info_log.h\"\n#include <iostream>\n#include <cstdio>\n\nIGL_INLINE bool igl::create_shader_program(\n  const std::string & geom_source,\n  const std::string & vert_source,\n  const std::string & frag_source,\n  const std::map<std::string,GLuint> & attrib,\n  GLuint & id)\n{\n  using namespace std;\n  if(vert_source == \"\" && frag_source == \"\")\n  {\n    cerr<<\n      \"create_shader_program() could not create shader program,\"\n      \" both .vert and .frag source given were empty\"<<endl;\n    return false;\n  }\n\n  // create program\n  id = glCreateProgram();\n  if(id == 0)\n  {\n    cerr<<\"create_shader_program() could not create shader program.\"<<endl;\n    return false;\n  }\n\n  if(geom_source != \"\")\n  {\n    // load vertex shader\n    GLuint g = igl::load_shader(geom_source.c_str(),GL_GEOMETRY_SHADER_EXT);\n    if(g == 0)\n    {\n      cerr<<\"geometry shader failed to compile.\"<<endl;\n      return false;\n    }\n    glAttachShader(id,g);\n  }\n\n  if(vert_source != \"\")\n  {\n    // load vertex shader\n    GLuint v = igl::load_shader(vert_source.c_str(),GL_VERTEX_SHADER);\n    if(v == 0)\n    {\n      cerr<<\"vertex shader failed to compile.\"<<endl;\n      return false;\n    }\n    glAttachShader(id,v);\n  }\n\n  if(frag_source != \"\")\n  {\n    // load fragment shader\n    GLuint f = igl::load_shader(frag_source.c_str(),GL_FRAGMENT_SHADER);\n    if(f == 0)\n    {\n      cerr<<\"fragment shader failed to compile.\"<<endl;\n      return false;\n    }\n    glAttachShader(id,f);\n  }\n\n  // loop over attributes\n  for(\n    std::map<std::string,GLuint>::const_iterator ait = attrib.begin();\n    ait != attrib.end();\n    ait++)\n  {\n    glBindAttribLocation(\n      id,\n      (*ait).second,\n      (*ait).first.c_str());\n  }\n  // Link program\n  glLinkProgram(id);\n\n  // print log if any\n  igl::print_program_info_log(id);\n\n  return true;\n}\n\nIGL_INLINE bool igl::create_shader_program(\n  const std::string & vert_source,\n  const std::string & frag_source,\n  const std::map<std::string,GLuint> & attrib,\n  GLuint & prog_id)\n{\n  return create_shader_program(\"\",vert_source,frag_source,attrib,prog_id);\n}\n\n\nIGL_INLINE GLuint igl::create_shader_program(\n  const std::string & geom_source,\n  const std::string & vert_source,\n  const std::string & frag_source,\n  const std::map<std::string,GLuint> & attrib)\n{\n  GLuint prog_id = 0;\n  create_shader_program(geom_source,vert_source,frag_source,attrib,prog_id);\n  return prog_id;\n}\n\nIGL_INLINE GLuint igl::create_shader_program(\n  const std::string & vert_source,\n  const std::string & frag_source,\n  const std::map<std::string,GLuint> & attrib)\n{\n  GLuint prog_id = 0;\n  create_shader_program(vert_source,frag_source,attrib,prog_id);\n  return prog_id;\n}\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/create_shader_program.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_CREATE_SHADER_PROGRAM_H\n#define IGL_CREATE_SHADER_PROGRAM_H\n\n#ifndef IGL_NO_OPENGL\n#include \"igl_inline.h\"\n#include <string>\n#include <map>\n\n#include \"OpenGL_convenience.h\"\n\nnamespace igl\n{\n  // Create a shader program with a vertex and fragments shader loading from\n  // source strings and vertex attributes assigned from a map before linking the\n  // shaders to the program, making it ready to use with glUseProgram(id)\n  // Inputs:\n  //   geom_source  string containing source code of geometry shader (can be\n  //     \"\" to mean use default pass-through)\n  //   vert_source  string containing source code of vertex shader\n  //   frag_source  string containing source code of fragment shader\n  //   attrib  map containing table of vertex attribute strings add their\n  //   correspondingly ids (generated previously using glBindAttribLocation)\n  // Outputs:\n  //   id  index id of created shader, set to 0 on error\n  // Returns true on success, false on error\n  //\n  // Note: Caller is responsible for making sure that current value of id is not\n  // leaking a shader (since it will be overwritten)\n  //\n  // See also: destroy_shader_program\n  IGL_INLINE bool create_shader_program(\n    const std::string &geom_source,\n    const std::string &vert_source,\n    const std::string &frag_source,\n    const std::map<std::string,GLuint> &attrib,\n    GLuint & id);\n  IGL_INLINE bool create_shader_program(\n    const std::string &vert_source,\n    const std::string &frag_source,\n    const std::map<std::string,GLuint> &attrib,\n    GLuint & id);\n  IGL_INLINE GLuint create_shader_program(\n    const std::string & geom_source,\n    const std::string & vert_source,\n    const std::string & frag_source,\n    const std::map<std::string,GLuint> &attrib);\n  IGL_INLINE GLuint create_shader_program(\n    const std::string & vert_source,\n    const std::string & frag_source,\n    const std::map<std::string,GLuint> &attrib);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"create_shader_program.cpp\"\n#endif\n\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/create_vector_vbo.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"create_vector_vbo.h\"\n#ifndef IGL_NO_OPENGL\n\n#include <cassert>\n\n// http://www.songho.ca/opengl/gl_vbo.html#create\ntemplate <typename T>\nIGL_INLINE void igl::create_vector_vbo(\n  const Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> & V,\n  GLuint & V_vbo_id)\n{\n  //// Expects that input is list of 3D vectors along rows\n  //assert(V.cols() == 3);\n\n  // Generate Buffers\n  glGenBuffers(1,&V_vbo_id);\n  // Bind Buffers\n  glBindBuffer(GL_ARRAY_BUFFER,V_vbo_id);\n  // Copy data to buffers\n  // We expect a matrix with each vertex position on a row, we then want to\n  // pass this data to OpenGL reading across rows (row-major)\n  if(V.Options & Eigen::RowMajor)\n  {\n    glBufferData(\n      GL_ARRAY_BUFFER,\n      sizeof(T)*V.size(),\n      V.data(),\n      GL_STATIC_DRAW);\n  }else\n  {\n    // Create temporary copy of transpose\n    Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> VT = V.transpose();\n    // If its column major then we need to temporarily store a transpose\n    glBufferData(\n      GL_ARRAY_BUFFER,\n      sizeof(T)*V.size(),\n      VT.data(),\n      GL_STATIC_DRAW);\n  }\n  // bind with 0, so, switch back to normal pointer operation\n  glBindBuffer(GL_ARRAY_BUFFER, 0);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template specialization\n// generated by autoexplicit.sh\ntemplate void igl::create_vector_vbo<int>(Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, unsigned int&);\n// generated by autoexplicit.sh\ntemplate void igl::create_vector_vbo<double>(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, unsigned int&);\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/create_vector_vbo.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_CREATE_VECTOR_VBO_H\n#define IGL_CREATE_VECTOR_VBO_H\n#ifndef IGL_NO_OPENGL\n#include \"igl_inline.h\"\n// NOTE: It wouldn't be so hard to template this using Eigen's templates\n\n#include <Eigen/Core>\n\n#include \"OpenGL_convenience.h\"\n\n// Create a VBO (Vertex Buffer Object) for a list of vectors:\n// GL_ARRAY_BUFFER for the vectors (V)\nnamespace igl\n{\n\n  // Templates:\n  //   T  should be a eigen matrix primitive type like int or double\n  // Inputs:\n  //   V  m by n eigen Matrix of type T values\n  // Outputs:\n  //   V_vbo_id  buffer id for vectors\n  //\n  template <typename T>\n  IGL_INLINE void create_vector_vbo(\n    const Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> & V,\n    GLuint & V_vbo_id);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"create_vector_vbo.cpp\"\n#endif\n\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/cross.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"cross.h\"\n\n// http://www.antisphere.com/Wiki/tools:anttweakbar\nIGL_INLINE void igl::cross(\n  const double *a, \n  const double *b,\n  double *out)\n{\n  out[0] = a[1]*b[2]-a[2]*b[1];\n  out[1] = a[2]*b[0]-a[0]*b[2];\n  out[2] = a[0]*b[1]-a[1]*b[0];\n}\n\ntemplate <\n  typename DerivedA,\n  typename DerivedB,\n  typename DerivedC>\nIGL_INLINE void igl::cross(\n  const Eigen::PlainObjectBase<DerivedA> & A,\n  const Eigen::PlainObjectBase<DerivedB> & B,\n  Eigen::PlainObjectBase<DerivedC> & C)\n{\n  assert(A.cols() == 3 && \"#cols should be 3\");\n  assert(B.cols() == 3 && \"#cols should be 3\");\n  assert(A.rows() == B.rows() && \"#rows in A and B should be equal\");\n  C.resize(A.rows(),3);\n  for(int d = 0;d<3;d++)\n  {\n    C.col(d) = \n      A.col((d+1)%3).array() * B.col((d+2)%3).array() -\n      A.col((d+2)%3).array() * B.col((d+1)%3).array();\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\ntemplate void igl::cross<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::cross<Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/cross.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_CROSS_H\n#define IGL_CROSS_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Computes out = cross(a,b)\n  // Inputs:\n  //   a  left 3d vector\n  //   b  right 3d vector\n  // Outputs:\n  //   out  result 3d vector\n  IGL_INLINE void cross( const double *a, const double *b, double *out);\n  // Computes C = cross(A,B,2);\n  //\n  // Inputs:\n  //   A  #A by 3 list of row-vectors\n  //   B  #A by 3 list of row-vectors\n  // Outputs:\n  //   C  #A by 3 list of row-vectors\n  template <\n    typename DerivedA,\n    typename DerivedB,\n    typename DerivedC>\n  IGL_INLINE void cross(\n    const Eigen::PlainObjectBase<DerivedA> & A,\n    const Eigen::PlainObjectBase<DerivedB> & B,\n    Eigen::PlainObjectBase<DerivedC> & C);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"cross.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/cross_field_missmatch.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>, Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"cross_field_missmatch.h\"\n\n#include <cmath>\n#include <vector>\n#include <deque>\n#include <igl/comb_cross_field.h>\n#include <igl/per_face_normals.h>\n#include <igl/is_border_vertex.h>\n#include <igl/vertex_triangle_adjacency.h>\n#include <igl/triangle_triangle_adjacency.h>\n#include <igl/rotation_matrix_from_directions.h>\n\nnamespace igl {\n  template <typename DerivedV, typename DerivedF, typename DerivedM>\n  class MissMatchCalculator\n  {\n  public:\n\n    const Eigen::PlainObjectBase<DerivedV> &V;\n    const Eigen::PlainObjectBase<DerivedF> &F;\n    const Eigen::PlainObjectBase<DerivedV> &PD1;\n    const Eigen::PlainObjectBase<DerivedV> &PD2;\n    \n    DerivedV N;\n\n  private:\n    // internal\n    std::vector<bool> V_border; // bool\n    std::vector<std::vector<int> > VF;\n    std::vector<std::vector<int> > VFi;\n    \n    DerivedF TT;\n    DerivedF TTi;\n\n\n  private:\n    ///compute the mismatch between 2 faces\n    inline int MissMatchByCross(const int f0,\n                         const int f1)\n    {\n      Eigen::Matrix<typename DerivedV::Scalar, 3, 1> dir0 = PD1.row(f0);\n      Eigen::Matrix<typename DerivedV::Scalar, 3, 1> dir1 = PD1.row(f1);\n      Eigen::Matrix<typename DerivedV::Scalar, 3, 1> n0 = N.row(f0);\n      Eigen::Matrix<typename DerivedV::Scalar, 3, 1> n1 = N.row(f1);\n\n      Eigen::Matrix<typename DerivedV::Scalar, 3, 1> dir1Rot = igl::rotation_matrix_from_directions(n1,n0)*dir1;\n      dir1Rot.normalize();\n\n      // TODO: this should be equivalent to the other code below, to check!\n      // Compute the angle between the two vectors\n      //    double a0 = atan2(dir0.dot(B2.row(f0)),dir0.dot(B1.row(f0)));\n      //    double a1 = atan2(dir1Rot.dot(B2.row(f0)),dir1Rot.dot(B1.row(f0)));\n      //\n      //    double angle_diff = a1-a0;   //VectToAngle(f0,dir1Rot);\n\n      double angle_diff = atan2(dir1Rot.dot(PD2.row(f0)),dir1Rot.dot(PD1.row(f0)));\n\n      //    std::cerr << \"Dani: \" << dir0(0) << \" \" << dir0(1) << \" \" << dir0(2) << \" \" << dir1Rot(0) << \" \" << dir1Rot(1) << \" \" << dir1Rot(2) << \" \" << angle_diff << std::endl;\n\n      double step=M_PI/2.0;\n      int i=(int)std::floor((angle_diff/step)+0.5);\n      int k=0;\n      if (i>=0)\n        k=i%4;\n      else\n        k=(-(3*i))%4;\n      return k;\n    }\n\n\npublic:\n  inline MissMatchCalculator(const Eigen::PlainObjectBase<DerivedV> &_V,\n                      const Eigen::PlainObjectBase<DerivedF> &_F,\n                      const Eigen::PlainObjectBase<DerivedV> &_PD1,\n                      const Eigen::PlainObjectBase<DerivedV> &_PD2\n                      ):\n  V(_V),\n  F(_F),\n  PD1(_PD1),\n  PD2(_PD2)\n  {\n    igl::per_face_normals(V,F,N);\n    V_border = igl::is_border_vertex(V,F);\n    igl::vertex_triangle_adjacency(V,F,VF,VFi);\n    igl::triangle_triangle_adjacency(F,TT,TTi);\n  }\n\n  inline void calculateMissmatch(Eigen::PlainObjectBase<DerivedM> &Handle_MMatch)\n  {\n    Handle_MMatch.setConstant(F.rows(),3,-1);\n    for (size_t i=0;i<F.rows();i++)\n    {\n      for (int j=0;j<3;j++)\n      {\n        if (((int)i)==TT(i,j) || TT(i,j) == -1)\n          Handle_MMatch(i,j)=0;\n        else\n          Handle_MMatch(i,j) = MissMatchByCross(i,TT(i,j));\n      }\n    }\n  }\n\n};\n}\ntemplate <typename DerivedV, typename DerivedF, typename DerivedM>\nIGL_INLINE void igl::cross_field_missmatch(const Eigen::PlainObjectBase<DerivedV> &V,\n                                           const Eigen::PlainObjectBase<DerivedF> &F,\n                                           const Eigen::PlainObjectBase<DerivedV> &PD1,\n                                           const Eigen::PlainObjectBase<DerivedV> &PD2,\n                                           const bool isCombed,\n                                           Eigen::PlainObjectBase<DerivedM> &missmatch)\n{\n  DerivedV PD1_combed;\n  DerivedV PD2_combed;\n\n  if (!isCombed)\n    igl::comb_cross_field(V,F,PD1,PD2,PD1_combed,PD2_combed);\n  else\n  {\n    PD1_combed = PD1;\n    PD2_combed = PD2;\n  }\n  igl::MissMatchCalculator<DerivedV, DerivedF, DerivedM> sf(V, F, PD1_combed, PD2_combed);\n  sf.calculateMissmatch(missmatch);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::cross_field_missmatch<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&);\ntemplate void igl::cross_field_missmatch<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::cross_field_missmatch<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&);\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/cross_field_missmatch.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>, Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_CROSS_FIELD_MISSMATCH_H\n#define IGL_CROSS_FIELD_MISSMATCH_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Calculates the missmatch (integer), at each face edge, of a cross field defined on the mesh faces.\n  // The integer missmatch is a multiple of pi/2 that transforms the cross on one side of the edge to\n  // the cross on the other side. It represents the deviation from a Lie connection across the edge.\n\n  // Inputs:\n  //   V         #V by 3 eigen Matrix of mesh vertex 3D positions\n  //   F         #F by 3 eigen Matrix of face (quad) indices\n  //   PD1       #F by 3 eigen Matrix of the first per face cross field vector\n  //   PD2       #F by 3 eigen Matrix of the second per face cross field vector\n  //   isCombed  boolean, specifying whether the field is combed (i.e. matching has been precomputed.\n  //             If not, the field is combed first.\n  // Output:\n  //   Handle_MMatch    #F by 3 eigen Matrix containing the integer missmatch of the cross field\n  //                    across all face edges\n  //\n\n  template <typename DerivedV, typename DerivedF, typename DerivedM>\n  IGL_INLINE void cross_field_missmatch(const Eigen::PlainObjectBase<DerivedV> &V,\n                                        const Eigen::PlainObjectBase<DerivedF> &F,\n                                        const Eigen::PlainObjectBase<DerivedV> &PD1,\n                                        const Eigen::PlainObjectBase<DerivedV> &PD2,\n                                        const bool isCombed,\n                                        Eigen::PlainObjectBase<DerivedM> &missmatch);\n}\n#ifndef IGL_STATIC_LIBRARY\n#include \"cross_field_missmatch.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/crouzeix_raviart_massmatrix.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"crouzeix_raviart_massmatrix.h\"\n#include \"unique_simplices.h\"\n#include \"all_edges.h\"\n\n#include \"is_edge_manifold.h\"\n#include \"doublearea.h\"\n\n#include <cassert>\n#include <vector>\n\ntemplate <typename MT, typename DerivedV, typename DerivedF, typename DerivedE, typename DerivedEMAP>\nvoid igl::crouzeix_raviart_massmatrix(\n    const Eigen::PlainObjectBase<DerivedV> & V, \n    const Eigen::PlainObjectBase<DerivedF> & F, \n    Eigen::SparseMatrix<MT> & M,\n    Eigen::PlainObjectBase<DerivedE> & E,\n    Eigen::PlainObjectBase<DerivedEMAP> & EMAP)\n{\n  // All occurances of directed edges\n  Eigen::MatrixXi allE;\n  all_edges(F,allE);\n  Eigen::VectorXi _1;\n  unique_simplices(allE,E,_1,EMAP);\n  return crouzeix_raviart_massmatrix(V,F,E,EMAP,M);\n}\n\ntemplate <typename MT, typename DerivedV, typename DerivedF, typename DerivedE, typename DerivedEMAP>\nvoid igl::crouzeix_raviart_massmatrix(\n    const Eigen::PlainObjectBase<DerivedV> & V, \n    const Eigen::PlainObjectBase<DerivedF> & F, \n    const Eigen::PlainObjectBase<DerivedE> & E,\n    const Eigen::PlainObjectBase<DerivedEMAP> & EMAP,\n    Eigen::SparseMatrix<MT> & M)\n{\n  using namespace Eigen;\n  using namespace std;\n  assert(F.cols() == 3);\n  // Mesh should be edge-manifold\n  assert(is_edge_manifold(F));\n  // number of elements (triangles)\n  int m = F.rows();\n  // Get triangle areas\n  VectorXd TA;\n  doublearea(V,F,TA);\n  vector<Triplet<MT> > MIJV(3*m);\n  for(int f = 0;f<m;f++)\n  {\n    for(int c = 0;c<3;c++)\n    {\n      MIJV[f+m*c] = Triplet<MT>(EMAP(f+m*c),EMAP(f+m*c),TA(f)*0.5);\n    }\n  }\n  M.resize(E.rows(),E.rows());\n  M.setFromTriplets(MIJV.begin(),MIJV.end());\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::crouzeix_raviart_massmatrix<double, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::SparseMatrix<double, 0, int>&);\ntemplate void igl::crouzeix_raviart_massmatrix<float, Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::SparseMatrix<float, 0, int>&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/crouzeix_raviart_massmatrix.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef CROUZEIX_RAVIART_MASSMATRIX_H\n#define CROUZEIX_RAVIART_MASSMATRIX_H\n#include <Eigen/Dense>\n#include <Eigen/Sparse>\n\nnamespace igl\n{\n  // CROUZEIX_RAVIART_MASSMATRIX Compute the Crouzeix-Raviart mass matrix where\n  // M(e,e) is just the sum of the areas of the triangles on either side of an\n  // edge e.\n  //\n  // See for example \"Discrete Quadratic Curvature Energies\" [Wardetzky, Bergou,\n  // Harmon, Zorin, Grinspun 2007]\n  //\n  // Templates:\n  //   MT  type of eigen sparse matrix for M (e.g. double for\n  //     SparseMatrix<double>)\n  //   DerivedV  derived type of eigen matrix for V (e.g. derived from\n  //     MatrixXd)\n  //   DerivedF  derived type of eigen matrix for F (e.g. derived from\n  //     MatrixXi)\n  //   DerivedE  derived type of eigen matrix for E (e.g. derived from\n  //     MatrixXi)\n  // Inputs:\n  //   V  #V by dim list of vertex positions\n  //   F  #F by 3 list of triangle indices\n  // Outputs:\n  //   M  #E by #E edge-based diagonal mass matrix\n  //   E  #E by 2 list of edges\n  //   EMAP  #F*3 list of indices mapping allE to E\n  //\n  //\n  template <typename MT, typename DerivedV, typename DerivedF, typename DerivedE, typename DerivedEMAP>\n  void crouzeix_raviart_massmatrix(\n      const Eigen::PlainObjectBase<DerivedV> & V, \n      const Eigen::PlainObjectBase<DerivedF> & F, \n      Eigen::SparseMatrix<MT> & M,\n      Eigen::PlainObjectBase<DerivedE> & E,\n      Eigen::PlainObjectBase<DerivedEMAP> & EMAP);\n  // wrapper if E and EMAP are already computed (better match!)\n  template <typename MT, typename DerivedV, typename DerivedF, typename DerivedE, typename DerivedEMAP>\n  void crouzeix_raviart_massmatrix(\n      const Eigen::PlainObjectBase<DerivedV> & V, \n      const Eigen::PlainObjectBase<DerivedF> & F, \n      const Eigen::PlainObjectBase<DerivedE> & E,\n      const Eigen::PlainObjectBase<DerivedEMAP> & EMAP,\n      Eigen::SparseMatrix<MT> & M);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"crouzeix_raviart_massmatrix.cpp\"\n#endif\n  \n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/cumsum.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"cumsum.h\"\n#include <numeric>\n#include <iostream>\n\ntemplate <typename DerivedX, typename DerivedY>\nIGL_INLINE void igl::cumsum(\n  const Eigen::PlainObjectBase<DerivedX > & X,\n  const int dim,\n  Eigen::PlainObjectBase<DerivedY > & Y)\n{\n  using namespace Eigen;\n  using namespace std;\n  Y.resizeLike(X);\n  // get number of columns (or rows)\n  int num_outer = (dim == 1 ? X.cols() : X.rows() );\n  // get number of rows (or columns)\n  int num_inner = (dim == 1 ? X.rows() : X.cols() );\n  // This has been optimized so that dim = 1 or 2 is roughly the same cost.\n  // (Optimizations assume ColMajor order)\n  if(dim == 1)\n  {\n#pragma omp parallel for\n    for(int o = 0;o<num_outer;o++)\n    {\n      typename DerivedX::Scalar sum = 0;\n      for(int i = 0;i<num_inner;i++)\n      {\n        sum += X(i,o);\n        Y(i,o) = sum;\n      }\n    }\n  }else\n  {\n    for(int i = 0;i<num_inner;i++)\n    {\n      // Notice that it is *not* OK to put this above the inner loop\n      // Though here it doesn't seem to pay off...\n//#pragma omp parallel for\n      for(int o = 0;o<num_outer;o++)\n      {\n        if(i == 0)\n        {\n          Y(o,i) = X(o,i);\n        }else\n        {\n          Y(o,i) = Y(o,i-1) + X(o,i);\n        }\n      }\n    }\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::cumsum<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::cumsum<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\ntemplate void igl::cumsum<Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 1, 0, 3, 1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 1, 0, 3, 1> >&);\ntemplate void igl::cumsum<Eigen::Matrix<unsigned long, 2, 1, 0, 2, 1>, Eigen::Matrix<unsigned long, 2, 1, 0, 2, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<unsigned long, 2, 1, 0, 2, 1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<unsigned long, 2, 1, 0, 2, 1> >&);\ntemplate void igl::cumsum<Eigen::Matrix<unsigned long, -1, 1, 0, -1, 1>, Eigen::Matrix<unsigned long, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<unsigned long, -1, 1, 0, -1, 1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<unsigned long, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/cumsum.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_CUMSUM_H\n#define IGL_CUMSUM_H\n\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n\nnamespace igl\n{\n  // Computes a cumulative sum of the columns of X, like matlab's `cumsum`.\n  //\n  // Templates:\n  //   DerivedX  Type of matrix X\n  //   DerivedY  Type of matrix Y\n  // Inputs:\n  //   X  m by n Matrix to be cumulatively summed.\n  //   dim  dimension to take cumulative sum (1 or 2)\n  // Output:\n  //   Y  m by n Matrix containing cumulative sum.\n  //\n  template <typename DerivedX, typename DerivedY>\n  IGL_INLINE void cumsum(\n    const Eigen::PlainObjectBase<DerivedX > & X,\n    const int dim,\n    Eigen::PlainObjectBase<DerivedY > & Y);\n  //template <typename DerivedX, typename DerivedY>\n  //IGL_INLINE void cumsum(\n  //  const Eigen::PlainObjectBase<DerivedX > & X,\n  //  Eigen::PlainObjectBase<DerivedY > & Y);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"cumsum.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/cut_mesh.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include <igl/cut_mesh.h>\n#include <igl/vertex_triangle_adjacency.h>\n#include <igl/triangle_triangle_adjacency.h>\n#include <igl/is_border_vertex.h>\n#include <igl/HalfEdgeIterator.h>\n#include <set>\n\n\nnamespace igl {\n\n\n  template <typename DerivedV, typename DerivedF, typename VFType, typename DerivedTT, typename DerivedC>\n  class MeshCutterMini\n  {\n  public:\n    // Input\n    //mesh\n    const Eigen::PlainObjectBase<DerivedV> &V;\n    const Eigen::PlainObjectBase<DerivedF> &F;\n    const Eigen::PlainObjectBase<DerivedTT> &TT;\n    const Eigen::PlainObjectBase<DerivedTT> &TTi;\n    const std::vector<std::vector<VFType> >& VF;\n    const std::vector<std::vector<VFType> >& VFi;\n    const std::vector<bool> &V_border; // bool\n    //edges to cut\n    const Eigen::PlainObjectBase<DerivedC> &Handle_Seams; // 3 bool\n\n    // total number of scalar variables\n    int num_scalar_variables;\n\n    // per face indexes of vertex in the solver\n    DerivedF HandleS_Index;\n\n    // per vertex variable indexes\n    std::vector<std::vector<int> > HandleV_Integer;\n\n    IGL_INLINE MeshCutterMini(const Eigen::PlainObjectBase<DerivedV> &_V,\n                              const Eigen::PlainObjectBase<DerivedF> &_F,\n                              const Eigen::PlainObjectBase<DerivedTT> &_TT,\n                              const Eigen::PlainObjectBase<DerivedTT> &_TTi,\n                              const std::vector<std::vector<VFType> > &_VF,\n                              const std::vector<std::vector<VFType> > &_VFi,\n                              const std::vector<bool> &_V_border,\n                              const Eigen::PlainObjectBase<DerivedC> &_Handle_Seams);\n\n    // vertex to variable mapping\n    // initialize the mapping for a given sampled mesh\n    IGL_INLINE void InitMappingSeam();\n\n  private:\n\n    IGL_INLINE void FirstPos(const int v, int &f, int &edge);\n\n    IGL_INLINE int AddNewIndex(const int v0);\n\n    IGL_INLINE bool IsSeam(const int f0, const int f1);\n\n    // find initial position of the pos to\n    // assing face to vert inxex correctly\n    IGL_INLINE void FindInitialPos(const int vert, int &edge, int &face);\n\n\n    // intialize the mapping given an initial pos\n    // whih must be initialized with FindInitialPos\n    IGL_INLINE void MapIndexes(const int  vert, const int edge_init, const int f_init);\n\n    // intialize the mapping for a given vertex\n    IGL_INLINE void InitMappingSeam(const int vert);\n\n  };\n}\n\n\ntemplate <typename DerivedV, typename DerivedF, typename VFType, typename DerivedTT, typename DerivedC>\nIGL_INLINE igl::MeshCutterMini<DerivedV, DerivedF, VFType, DerivedTT, DerivedC>::\nMeshCutterMini(const Eigen::PlainObjectBase<DerivedV> &_V,\n               const Eigen::PlainObjectBase<DerivedF> &_F,\n               const Eigen::PlainObjectBase<DerivedTT> &_TT,\n               const Eigen::PlainObjectBase<DerivedTT> &_TTi,\n               const std::vector<std::vector<VFType> > &_VF,\n               const std::vector<std::vector<VFType> > &_VFi,\n               const std::vector<bool> &_V_border,\n               const Eigen::PlainObjectBase<DerivedC> &_Handle_Seams):\nV(_V),\nF(_F),\nTT(_TT),\nTTi(_TTi),\nVF(_VF),\nVFi(_VFi),\nV_border(_V_border),\nHandle_Seams(_Handle_Seams)\n{\n  num_scalar_variables=0;\n\n  HandleS_Index.setConstant(F.rows(),3,-1);\n\n  HandleV_Integer.resize(V.rows());\n}\n\n\ntemplate <typename DerivedV, typename DerivedF, typename VFType, typename DerivedTT, typename DerivedC>\nIGL_INLINE void igl::MeshCutterMini<DerivedV, DerivedF, VFType, DerivedTT, DerivedC>::\nFirstPos(const int v, int &f, int &edge)\n{\n  f    = VF[v][0];  // f=v->cVFp();\n  edge = VFi[v][0]; // edge=v->cVFi();\n}\n\ntemplate <typename DerivedV, typename DerivedF, typename VFType, typename DerivedTT, typename DerivedC>\nIGL_INLINE int igl::MeshCutterMini<DerivedV, DerivedF, VFType, DerivedTT, DerivedC>::\nAddNewIndex(const int v0)\n{\n  num_scalar_variables++;\n  HandleV_Integer[v0].push_back(num_scalar_variables);\n  return num_scalar_variables;\n}\n\ntemplate <typename DerivedV, typename DerivedF, typename VFType, typename DerivedTT, typename DerivedC>\nIGL_INLINE bool igl::MeshCutterMini<DerivedV, DerivedF, VFType, DerivedTT, DerivedC>::\nIsSeam(const int f0, const int f1)\n{\n  for (int i=0;i<3;i++)\n  {\n    int f_clos = TT(f0,i);\n\n    if (f_clos == -1)\n      continue; ///border\n\n    if (f_clos == f1)\n      return(Handle_Seams(f0,i));\n  }\n  assert(0);\n  return false;\n}\n\n///find initial position of the pos to\n// assing face to vert inxex correctly\ntemplate <typename DerivedV, typename DerivedF, typename VFType, typename DerivedTT, typename DerivedC>\nIGL_INLINE void igl::MeshCutterMini<DerivedV, DerivedF, VFType, DerivedTT, DerivedC>::\nFindInitialPos(const int vert,\n               int &edge,\n               int &face)\n{\n  int f_init;\n  int edge_init;\n  FirstPos(vert,f_init,edge_init); // todo manually the function\n  igl::HalfEdgeIterator<DerivedF> VFI(F,TT,TTi,f_init,edge_init);\n\n  bool vertexB = V_border[vert];\n  bool possible_split=false;\n  bool complete_turn=false;\n  do\n  {\n    int curr_f = VFI.Fi();\n    int curr_edge=VFI.Ei();\n    VFI.NextFE();\n    int next_f=VFI.Fi();\n    ///test if I've just crossed a border\n    bool on_border=(TT(curr_f,curr_edge)==-1);\n    //bool mismatch=false;\n    bool seam=false;\n\n    ///or if I've just crossed a seam\n    ///if I'm on a border I MUST start from the one next t othe border\n    if (!vertexB)\n      //seam=curr_f->IsSeam(next_f);\n      seam=IsSeam(curr_f,next_f);\n    //    if (vertexB)\n    //      assert(!Handle_Singular(vert));\n    //    ;\n    //assert(!vert->IsSingular());\n    possible_split=((on_border)||(seam));\n    complete_turn = next_f == f_init;\n  } while ((!possible_split)&&(!complete_turn));\n  face=VFI.Fi();\n  edge=VFI.Ei();\n}\n\n\n\n///intialize the mapping given an initial pos\n///whih must be initialized with FindInitialPos\ntemplate <typename DerivedV, typename DerivedF, typename VFType, typename DerivedTT, typename DerivedC>\nIGL_INLINE void igl::MeshCutterMini<DerivedV, DerivedF, VFType, DerivedTT, DerivedC>::\nMapIndexes(const int  vert,\n           const int edge_init,\n           const int f_init)\n{\n  ///check that is not on border..\n  ///in such case maybe it's non manyfold\n  ///insert an initial index\n  int curr_index=AddNewIndex(vert);\n  ///and initialize the jumping pos\n  igl::HalfEdgeIterator<DerivedF> VFI(F,TT,TTi,f_init,edge_init);\n  bool complete_turn=false;\n  do\n  {\n    int curr_f = VFI.Fi();\n    int curr_edge = VFI.Ei();\n    ///assing the current index\n    HandleS_Index(curr_f,curr_edge) = curr_index;\n    VFI.NextFE();\n    int next_f = VFI.Fi();\n    ///test if I've finiseh with the face exploration\n    complete_turn = (next_f==f_init);\n    ///or if I've just crossed a mismatch\n    if (!complete_turn)\n    {\n      bool seam=false;\n      //seam=curr_f->IsSeam(next_f);\n      seam=IsSeam(curr_f,next_f);\n      if (seam)\n      {\n        ///then add a new index\n        curr_index=AddNewIndex(vert);\n      }\n    }\n  } while (!complete_turn);\n}\n\n///initialize the mapping for a given vertex\ntemplate <typename DerivedV, typename DerivedF, typename VFType, typename DerivedTT, typename DerivedC>\nIGL_INLINE void igl::MeshCutterMini<DerivedV, DerivedF, VFType, DerivedTT, DerivedC>::\nInitMappingSeam(const int vert)\n{\n  ///first rotate until find the first pos after a mismatch\n  ///or a border or return to the first position...\n  int f_init = VF[vert][0];\n  int indexE = VFi[vert][0];\n\n  igl::HalfEdgeIterator<DerivedF> VFI(F,TT,TTi,f_init,indexE);\n\n  int edge_init;\n  int face_init;\n  FindInitialPos(vert,edge_init,face_init);\n  MapIndexes(vert,edge_init,face_init);\n}\n\n///vertex to variable mapping\n///initialize the mapping for a given sampled mesh\ntemplate <typename DerivedV, typename DerivedF, typename VFType, typename DerivedTT, typename DerivedC>\nIGL_INLINE void igl::MeshCutterMini<DerivedV, DerivedF, VFType, DerivedTT, DerivedC>::\nInitMappingSeam()\n{\n  num_scalar_variables=-1;\n  for (unsigned int i=0;i<V.rows();i++)\n    InitMappingSeam(i);\n\n  for (unsigned int j=0;j<V.rows();j++)\n    assert(HandleV_Integer[j].size()>0);\n}\n\n\ntemplate <typename DerivedV, typename DerivedF, typename VFType, typename DerivedTT, typename DerivedC>\nIGL_INLINE void igl::cut_mesh(\n                                                                  const Eigen::PlainObjectBase<DerivedV> &V,\n                                                                  const Eigen::PlainObjectBase<DerivedF> &F,\n                                                                  const std::vector<std::vector<VFType> >& VF,\n                                                                  const std::vector<std::vector<VFType> >& VFi,\n                                                                  const Eigen::PlainObjectBase<DerivedTT>& TT,\n                                                                  const Eigen::PlainObjectBase<DerivedTT>& TTi,\n                                                                  const std::vector<bool> &V_border,\n                                                                  const Eigen::PlainObjectBase<DerivedC> &cuts,\n                                                                  Eigen::PlainObjectBase<DerivedV> &Vcut,\n                                                                  Eigen::PlainObjectBase<DerivedF> &Fcut)\n{\n  //finding the cuts is done, now we need to actually generate a cut mesh\n  igl::MeshCutterMini<DerivedV, DerivedF, VFType, DerivedTT, DerivedC> mc(V, F, TT, TTi, VF, VFi, V_border, cuts);\n  mc.InitMappingSeam();\n\n  Fcut = mc.HandleS_Index;\n  //we have the faces, we need the vertices;\n  int newNumV = Fcut.maxCoeff()+1;\n  Vcut.setZero(newNumV,3);\n  for (int vi=0; vi<V.rows(); ++vi)\n    for (int i=0; i<mc.HandleV_Integer[vi].size();++i)\n      Vcut.row(mc.HandleV_Integer[vi][i]) = V.row(vi);\n\n  //ugly hack to fix some problematic cases (border vertex that is also on the boundary of the hole\n  for (int fi =0; fi<Fcut.rows(); ++fi)\n    for (int k=0; k<3; ++k)\n      if (Fcut(fi,k)==-1)\n      {\n        //we need to add a vertex\n        Fcut(fi,k) = newNumV;\n        newNumV ++;\n        Vcut.conservativeResize(newNumV, Eigen::NoChange);\n        Vcut.row(newNumV-1) = V.row(F(fi,k));\n      }\n\n\n}\n\n\n//Wrapper of the above with only vertices and faces as mesh input\ntemplate <typename DerivedV, typename DerivedF, typename DerivedC>\nIGL_INLINE void igl::cut_mesh(\n                                                                  const Eigen::PlainObjectBase<DerivedV> &V,\n                                                                  const Eigen::PlainObjectBase<DerivedF> &F,\n                                                                  const Eigen::PlainObjectBase<DerivedC> &cuts,\n                                                                  Eigen::PlainObjectBase<DerivedV> &Vcut,\n                                                                  Eigen::PlainObjectBase<DerivedF> &Fcut)\n{\n\n  std::vector<std::vector<int> > VF, VFi;\n  igl::vertex_triangle_adjacency(V,F,VF,VFi);\n\n  Eigen::MatrixXd Vt = V;\n  Eigen::MatrixXi Ft = F;\n  Eigen::MatrixXi TT, TTi;\n  igl::triangle_triangle_adjacency(Ft,TT,TTi);\n\n  std::vector<bool> V_border = igl::is_border_vertex(V,F);\n\n  igl::cut_mesh(V, F, VF, VFi, TT, TTi, V_border, cuts, Vcut, Fcut);\n\n\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::cut_mesh<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, int, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<bool, std::allocator<bool> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::cut_mesh<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::cut_mesh<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&);\ntemplate void igl::cut_mesh<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/cut_mesh.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2015 Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_CUT_MESH\n#define IGL_CUT_MESH\n#include \"igl_inline.h\"\n\n#include <Eigen/Core>\n#include <vector>\n\nnamespace igl\n{\n  // Given a mesh and a list of edges that are to be cut, the function\n  // generates a new disk-topology mesh that has the cuts at its boundary.\n  //\n  // Todo: this combinatorial operation should not depend on the vertex\n  // positions V.\n  //\n  // Inputs:\n  //   V  #V by 3 list of the vertex positions\n  //   F  #F by 3 list of the faces (must be triangles)\n  //   VF  #V list of lists of incident faces (adjacency list), e.g.  as\n  //     returned by igl::vertex_triangle_adjacency\n  //   VFi  #V list of lists of index of incidence within incident faces listed\n  //     in VF, e.g. as returned by igl::vertex_triangle_adjacency\n  //   TT  #F by 3 triangle to triangle adjacent matrix (e.g. computed via\n  //     igl:triangle_triangle_adjacency)\n  //   TTi  #F by 3 adjacent matrix, the element i,j is the id of edge of the\n  //     triangle TT(i,j) that is adjacent with triangle i (e.g. computed via\n  //     igl:triangle_triangle_adjacency)\n  //   V_border  #V by 1 list of booleans, indicating if the corresponging\n  //     vertex is at the mesh boundary, e.g. as returned by\n  //     igl::is_border_vertex\n  //   cuts  #F by 3 list of boolean flags, indicating the edges that need to\n  //     be cut (has 1 at the face edges that are to be cut, 0 otherwise)\n  // Outputs:\n  //   Vcut  #V by 3 list of the vertex positions of the cut mesh. This matrix\n  //     will be similar to the original vertices except some rows will be\n  //     duplicated.\n  //   Fcut  #F by 3 list of the faces of the cut mesh(must be triangles). This\n  //     matrix will be similar to the original face matrix except some indices\n  //     will be redirected to point to the newly duplicated vertices.\n  //\n  template <\n    typename DerivedV, \n    typename DerivedF, \n    typename VFType, \n    typename DerivedTT, \n    typename DerivedC>\n  IGL_INLINE void cut_mesh(\n    const Eigen::PlainObjectBase<DerivedV> &V,\n    const Eigen::PlainObjectBase<DerivedF> &F,\n    const std::vector<std::vector<VFType> >& VF,\n    const std::vector<std::vector<VFType> >& VFi,\n    const Eigen::PlainObjectBase<DerivedTT>& TT,\n    const Eigen::PlainObjectBase<DerivedTT>& TTi,\n    const std::vector<bool> &V_border,\n    const Eigen::PlainObjectBase<DerivedC> &cuts,\n    Eigen::PlainObjectBase<DerivedV> &Vcut,\n    Eigen::PlainObjectBase<DerivedF> &Fcut);\n  //Wrapper of the above with only vertices and faces as mesh input\n  template <typename DerivedV, typename DerivedF, typename DerivedC>\n  IGL_INLINE void cut_mesh(\n    const Eigen::PlainObjectBase<DerivedV> &V,\n    const Eigen::PlainObjectBase<DerivedF> &F,\n    const Eigen::PlainObjectBase<DerivedC> &cuts,\n    Eigen::PlainObjectBase<DerivedV> &Vcut,\n    Eigen::PlainObjectBase<DerivedF> &Fcut);\n};\n\n\n#ifndef IGL_STATIC_LIBRARY\n#include \"cut_mesh.cpp\"\n#endif\n\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/cut_mesh_from_singularities.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>, Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"cut_mesh_from_singularities.h\"\n\n#include <igl/triangle_triangle_adjacency.h>\n#include <igl/edge_topology.h>\n\n#include <vector>\n#include <deque>\n\n\nnamespace igl {\n  template <\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedM,\n  typename DerivedO\n  >\n  class MeshCutter\n  {\n  protected:\n    const Eigen::PlainObjectBase<DerivedV> &V;\n    const Eigen::PlainObjectBase<DerivedF> &F;\n    const Eigen::PlainObjectBase<DerivedM> &Handle_MMatch;\n\n    Eigen::VectorXi F_visited;\n    DerivedF TT;\n    DerivedF TTi;\n\n    Eigen::MatrixXi E, F2E, E2F;\n  protected:\n\n    inline bool IsRotSeam(const int f0,const int edge)\n    {\n      unsigned char MM = Handle_MMatch(f0,edge);\n      return (MM!=0);\n    }\n\n    inline void FloodFill(const int start, Eigen::PlainObjectBase<DerivedO> &Handle_Seams)\n    {\n      std::deque<int> d;\n      ///clean the visited flag\n      F_visited(start) = true;\n      d.push_back(start);\n\n      while (!d.empty())\n      {\n        int f = d.at(0); d.pop_front();\n        for (int s = 0; s<3; s++)\n        {\n          int g = TT(f,s); // f->FFp(s);\n          int j = TTi(f,s); // f->FFi(s);\n\n          if (j == -1)\n          {\n            g = f;\n            j = s;\n          }\n\n          if ((!(IsRotSeam(f,s))) && (!(IsRotSeam(g,j)))  && (!F_visited(g)) )\n          {\n            Handle_Seams(f,s)=false;\n            Handle_Seams(g,j)=false;\n            F_visited(g) = true;\n            d.push_back(g);\n          }\n        }\n      }\n    }\n\n    inline void Retract(Eigen::PlainObjectBase<DerivedO> &Handle_Seams)\n    {\n      std::vector<int> e(V.rows(),0); // number of edges per vert\n      // for (unsigned f=0; f<F.rows(); f++)\n      // {\n      //   for (int s = 0; s<3; s++)\n      //   {\n      //     if (Handle_Seams(f,s))\n      //       if (TT(f,s)<=f)\n      //       {\n      //         e[ F(f,s) ] ++;\n      //         e[ F(f,(s+1)%3) ] ++;\n      //       }\n      //   }\n      // }\n      for (int ei=0; ei<E.rows(); ++ei)\n      {\n        //only need one face\n        int f0 = E2F(ei,0);\n        if (f0==-1)\n          f0 = E2F(ei,1);\n        int k=0;\n        for (k=0; k<3; ++k)\n          if (F2E(f0,k)==ei)\n            break;\n        if (Handle_Seams(f0,k))\n        {\n          e[ F(f0,k) ] ++;\n          e[ F(f0,(k+1)%3) ] ++;\n        }\n      }\n\n      bool over=true;\n      int guard = 0;\n      do\n      {\n        over = true;\n        for (int f = 0; f<F.rows(); f++) //if (!f->IsD())\n        {\n          for (int s = 0; s<3; s++)\n          {\n            if (Handle_Seams(f,s))\n              if (!(IsRotSeam(f,s))) // never retract rot seams\n              {\n                if (e[ F(f,s) ] == 1) {\n                  // dissolve seam\n                  Handle_Seams(f,s)=false;\n                  if (TT(f,s) != -1)\n                    Handle_Seams(TT(f,s),TTi(f,s))=false;\n\n                  e[ F(f,s)] --;\n                  e[ F(f,(s+1)%3) ] --;\n                  over = false;\n                }\n              }\n          }\n        }\n\n        if (guard++>10000)\n          over = true;\n\n      } while (!over);\n    }\n\n  public:\n\n    inline MeshCutter(const Eigen::PlainObjectBase<DerivedV> &V_,\n               const Eigen::PlainObjectBase<DerivedF> &F_,\n               const Eigen::PlainObjectBase<DerivedM> &Handle_MMatch_):\n    V(V_),\n    F(F_),\n    Handle_MMatch(Handle_MMatch_)\n    {\n      triangle_triangle_adjacency(F,TT,TTi);\n      edge_topology(V,F,E,F2E,E2F);\n    };\n\n    inline void cut(Eigen::PlainObjectBase<DerivedO> &Handle_Seams)\n    {\n      F_visited.setConstant(F.rows(),0);\n      Handle_Seams.setConstant(F.rows(),3,1);\n\n      int index=0;\n      for (unsigned f = 0; f<F.rows(); f++)\n      {\n        if (!F_visited(f))\n        {\n          index++;\n          FloodFill(f, Handle_Seams);\n        }\n      }\n\n      Retract(Handle_Seams);\n\n      for (unsigned int f=0;f<F.rows();f++)\n        for (int j=0;j<3;j++)\n          if (IsRotSeam(f,j))\n            Handle_Seams(f,j)=true;\n\n    }\n\n\n\n\n  };\n}\ntemplate <typename DerivedV,\n  typename DerivedF,\n  typename DerivedM,\n  typename DerivedO>\nIGL_INLINE void igl::cut_mesh_from_singularities(const Eigen::PlainObjectBase<DerivedV> &V,\n                                                 const Eigen::PlainObjectBase<DerivedF> &F,\n                                                 const Eigen::PlainObjectBase<DerivedM> &Handle_MMatch,\n                                                 Eigen::PlainObjectBase<DerivedO> &Handle_Seams)\n{\n  igl::MeshCutter< DerivedV, DerivedF, DerivedM, DerivedO> mc(V, F, Handle_MMatch);\n  mc.cut(Handle_Seams);\n\n}\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::cut_mesh_from_singularities<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::cut_mesh_from_singularities<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::cut_mesh_from_singularities<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&);\ntemplate void igl::cut_mesh_from_singularities<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::cut_mesh_from_singularities<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::cut_mesh_from_singularities<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/cut_mesh_from_singularities.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>, Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_CUT_MESH_FROM_SINGULARITIES_H\n#define IGL_CUT_MESH_FROM_SINGULARITIES_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Given a mesh (V,F) and the integer mismatch of a cross field per edge\n  // (MMatch), finds the cut_graph connecting the singularities (seams) and the\n  // degree of the singularities singularity_index\n  //\n  // Input:\n  //   V  #V by 3 list of mesh vertex positions\n  //   F  #F by 3 list of faces\n  //   MMatch  #F by 3 list of per corner integer mismatch\n  // Outputs:\n  //   seams  #F by 3 list of per corner booleans that denotes if an edge is a\n  //     seam or not\n  //\n  template <\n    typename DerivedV, \n    typename DerivedF, \n    typename DerivedM, \n    typename DerivedO> \n  IGL_INLINE void cut_mesh_from_singularities(\n    const Eigen::PlainObjectBase<DerivedV> &V, \n    const Eigen::PlainObjectBase<DerivedF> &F, \n    const Eigen::PlainObjectBase<DerivedM> &MMatch,\n    Eigen::PlainObjectBase<DerivedO> &seams);\n}\n#ifndef IGL_STATIC_LIBRARY\n#include \"cut_mesh_from_singularities.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/cylinder.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"cylinder.h\"\n#include \"PI.h\"\n#include <cassert>\n#include <cmath>\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::cylinder(\n  const int axis_devisions,\n  const int height_devisions,\n  Eigen::PlainObjectBase<DerivedV> & V,\n  Eigen::PlainObjectBase<DerivedF> & F)\n{\n  V.resize(axis_devisions*height_devisions,3);\n  F.resize(2*(axis_devisions*(height_devisions-1)),3);\n  int f = 0;\n  typedef typename DerivedV::Scalar Scalar;\n  for(int th = 0;th<axis_devisions;th++)\n  {\n    Scalar x = cos(2.*igl::PI*Scalar(th)/Scalar(axis_devisions));\n    Scalar y = sin(2.*igl::PI*Scalar(th)/Scalar(axis_devisions));\n    for(int h = 0;h<height_devisions;h++)\n    {\n      Scalar z = Scalar(h)/Scalar(height_devisions-1);\n      V(th+h*axis_devisions,0) = x;\n      V(th+h*axis_devisions,1) = y;\n      V(th+h*axis_devisions,2) = z;\n      if(h > 0)\n      {\n        F(f,0) = ((th+0)%axis_devisions)+(h-1)*axis_devisions;\n        F(f,1) = ((th+1)%axis_devisions)+(h-1)*axis_devisions;\n        F(f,2) = ((th+0)%axis_devisions)+(h+0)*axis_devisions;\n        f++;\n        F(f,0) = ((th+1)%axis_devisions)+(h-1)*axis_devisions;\n        F(f,1) = ((th+1)%axis_devisions)+(h+0)*axis_devisions;\n        F(f,2) = ((th+0)%axis_devisions)+(h+0)*axis_devisions;\n        f++;\n      }\n    }\n  }\n  assert(f == F.rows());\n}\n\n#ifdef IGL_STATIC_LIBRARY\ntemplate void igl::cylinder<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(int, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/cylinder.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_CYLINDER_H\n#define IGL_CYLINDER_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Construct a triangle mesh of a cylinder (without caps)\n  //\n  // Inputs:\n  //   axis_devisions  number of vertices _around the cylinder_\n  //   height_devisions  number of vertices _up the cylinder_\n  // Outputs:\n  //   V  #V by 3 list of mesh vertex positions\n  //   F  #F by 3 list of triangle indices into V\n  //\n  template <typename DerivedV, typename DerivedF>\n  IGL_INLINE void cylinder(\n    const int axis_devisions,\n    const int height_devisions,\n    Eigen::PlainObjectBase<DerivedV> & V,\n    Eigen::PlainObjectBase<DerivedF> & F);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"cylinder.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/dated_copy.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"dated_copy.h\"\n#include \"dirname.h\"\n#include \"basename.h\"\n\n#include <ctime>\n#include <fstream>\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <iostream>\n\n#if !defined(_WIN32)\n#include <unistd.h>\n\nIGL_INLINE bool igl::dated_copy(const std::string & src_path, const std::string & dir)\n{\n  using namespace std;\n  // Get time and date as string\n  char buffer[80];\n  time_t rawtime;\n  struct tm * timeinfo;\n  time (&rawtime);\n  timeinfo = localtime (&rawtime);\n  // ISO 8601 format with hyphens instead of colons and no timezone offset\n  strftime (buffer,80,\"%Y-%m-%dT%H-%M-%S\",timeinfo);\n  string src_basename = basename(src_path);\n  string dst_basename = src_basename+\"-\"+buffer;\n  string dst_path = dir+\"/\"+dst_basename;\n  cerr<<\"Saving binary to \"<<dst_path;\n  {\n    // http://stackoverflow.com/a/10195497/148668\n    ifstream src(src_path,ios::binary);\n    if (!src.is_open()) \n    {\n      cerr<<\" failed.\"<<endl;\n      return false;\n    }\n    ofstream dst(dst_path,ios::binary);\n    if(!dst.is_open())\n    {\n      cerr<<\" failed.\"<<endl;\n      return false;\n    }\n    dst << src.rdbuf();\n  }\n  cerr<<\" succeeded.\"<<endl;\n  cerr<<\"Setting permissions of \"<<dst_path;\n  {\n    int src_posix = fileno(fopen(src_path.c_str(),\"r\"));\n    if(src_posix == -1)\n    {\n      cerr<<\" failed.\"<<endl;\n      return false;\n    }\n    struct stat fst;\n    fstat(src_posix,&fst);\n    int dst_posix = fileno(fopen(dst_path.c_str(),\"r\"));\n    if(dst_posix == -1)\n    {\n      cerr<<\" failed.\"<<endl;\n      return false;\n    }\n    //update to the same uid/gid\n    if(fchown(dst_posix,fst.st_uid,fst.st_gid))\n    {\n      cerr<<\" failed.\"<<endl;\n      return false;\n    }\n    //update the permissions \n    if(fchmod(dst_posix,fst.st_mode) == -1)\n    {\n      cerr<<\" failed.\"<<endl;\n      return false;\n    }\n    cerr<<\" succeeded.\"<<endl;\n  }\n  return true;\n}\n\nIGL_INLINE bool igl::dated_copy(const std::string & src_path)\n{\n  return dated_copy(src_path,dirname(src_path));\n}\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/dated_copy.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n\n// Known issues: This function does not work under windows\n\n#ifndef IGL_DATED_COPY_H\n#define IGL_DATED_COPY_H\n#include \"igl_inline.h\"\n#include <string>\nnamespace igl\n{\n  // Copy the given file to a new file with the same basename in `dir`\n  // directory with the current date and time as a suffix.\n  //\n  // Inputs:\n  //   src_path  path to source file\n  //   dir  directory of destination file\n  // Example:\n  //   dated_copy(\"/path/to/foo\",\"/bar/\");\n  //   // copies /path/to/foo to /bar/foo-2013-12-12T18-10-56\n  IGL_INLINE bool dated_copy(const std::string & src_path, const std::string & dir);\n  // Wrapper using directory of source file\n  IGL_INLINE bool dated_copy(const std::string & src_path);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"dated_copy.cpp\"\n#endif\n#endif \n\n"
  },
  {
    "path": "libs/libigl/include/igl/decimate.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"decimate.h\"\n#include \"collapse_edge.h\"\n#include \"edge_flaps.h\"\n#include \"remove_unreferenced.h\"\n#include \"slice_mask.h\"\n#include \"slice.h\"\n#include \"connect_boundary_to_infinity.h\"\n#include \"max_faces_stopping_condition.h\"\n#include \"shortest_edge_and_midpoint.h\"\n\nIGL_INLINE bool igl::decimate(\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  const size_t max_m,\n  Eigen::MatrixXd & U,\n  Eigen::MatrixXi & G,\n  Eigen::VectorXi & J,\n  Eigen::VectorXi & I)\n{\n  // Original number of faces\n  const int orig_m = F.rows();\n  // Tracking number of faces\n  int m = F.rows();\n  typedef Eigen::MatrixXd DerivedV;\n  typedef Eigen::MatrixXi DerivedF;\n  DerivedV VO;\n  DerivedF FO;\n  igl::connect_boundary_to_infinity(V,F,VO,FO);\n  bool ret = decimate(\n    VO,\n    FO,\n    shortest_edge_and_midpoint,\n    max_faces_stopping_condition(m,orig_m,max_m),\n    U,\n    G,\n    J,\n    I);\n  const Eigen::Array<bool,Eigen::Dynamic,1> keep = (J.array()<orig_m);\n  igl::slice_mask(Eigen::MatrixXi(G),keep,1,G);\n  igl::slice_mask(Eigen::VectorXi(J),keep,1,J);\n  Eigen::VectorXi _1,I2;\n  igl::remove_unreferenced(Eigen::MatrixXd(U),Eigen::MatrixXi(G),U,G,_1,I2);\n  igl::slice(Eigen::VectorXi(I),I2,1,I);\n  return ret;\n}\n\nIGL_INLINE bool igl::decimate(\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  const size_t max_m,\n  Eigen::MatrixXd & U,\n  Eigen::MatrixXi & G,\n  Eigen::VectorXi & J)\n{\n  Eigen::VectorXi I;\n  return igl::decimate(V,F,max_m,U,G,J,I);\n}\n\nIGL_INLINE bool igl::decimate(\n  const Eigen::MatrixXd & OV,\n  const Eigen::MatrixXi & OF,\n  const std::function<void(\n    const int,\n    const Eigen::MatrixXd &,\n    const Eigen::MatrixXi &,\n    const Eigen::MatrixXi &,\n    const Eigen::VectorXi &,\n    const Eigen::MatrixXi &,\n    const Eigen::MatrixXi &,\n    double &,\n    Eigen::RowVectorXd &)> & cost_and_placement,\n  const std::function<bool(\n      const Eigen::MatrixXd &,\n      const Eigen::MatrixXi &,\n      const Eigen::MatrixXi &,\n      const Eigen::VectorXi &,\n      const Eigen::MatrixXi &,\n      const Eigen::MatrixXi &,\n      const std::set<std::pair<double,int> > &,\n      const std::vector<std::set<std::pair<double,int> >::iterator > &,\n      const Eigen::MatrixXd &,\n      const int,\n      const int,\n      const int,\n      const int,\n      const int)> & stopping_condition,\n  Eigen::MatrixXd & U,\n  Eigen::MatrixXi & G,\n  Eigen::VectorXi & J,\n  Eigen::VectorXi & I\n  )\n{\n  const auto always_try = [](\n    const Eigen::MatrixXd &                                         ,/*V*/\n    const Eigen::MatrixXi &                                         ,/*F*/\n    const Eigen::MatrixXi &                                         ,/*E*/\n    const Eigen::VectorXi &                                         ,/*EMAP*/\n    const Eigen::MatrixXi &                                         ,/*EF*/\n    const Eigen::MatrixXi &                                         ,/*EI*/\n    const std::set<std::pair<double,int> > &                        ,/*Q*/\n    const std::vector<std::set<std::pair<double,int> >::iterator > &,/*Qit*/\n    const Eigen::MatrixXd &                                         ,/*C*/\n    const int                                                        /*e*/\n    ) -> bool { return true;};\n  const auto never_care = [](\n    const Eigen::MatrixXd &                                         ,   /*V*/\n    const Eigen::MatrixXi &                                         ,   /*F*/\n    const Eigen::MatrixXi &                                         ,   /*E*/\n    const Eigen::VectorXi &                                         ,/*EMAP*/\n    const Eigen::MatrixXi &                                         ,  /*EF*/\n    const Eigen::MatrixXi &                                         ,  /*EI*/\n    const std::set<std::pair<double,int> > &                        ,   /*Q*/\n    const std::vector<std::set<std::pair<double,int> >::iterator > &, /*Qit*/\n    const Eigen::MatrixXd &                                         ,   /*C*/\n    const int                                                       ,   /*e*/\n    const int                                                       ,  /*e1*/\n    const int                                                       ,  /*e2*/\n    const int                                                       ,  /*f1*/\n    const int                                                       ,  /*f2*/\n    const bool                                                  /*collapsed*/\n    )-> void { };\n  return igl::decimate(\n    OV,OF,cost_and_placement,stopping_condition,always_try,never_care,U,G,J,I);\n}\n\nIGL_INLINE bool igl::decimate(\n  const Eigen::MatrixXd & OV,\n  const Eigen::MatrixXi & OF,\n  const std::function<void(\n    const int,\n    const Eigen::MatrixXd &,\n    const Eigen::MatrixXi &,\n    const Eigen::MatrixXi &,\n    const Eigen::VectorXi &,\n    const Eigen::MatrixXi &,\n    const Eigen::MatrixXi &,\n    double &,\n    Eigen::RowVectorXd &)> & cost_and_placement,\n  const std::function<bool(\n      const Eigen::MatrixXd &,\n      const Eigen::MatrixXi &,\n      const Eigen::MatrixXi &,\n      const Eigen::VectorXi &,\n      const Eigen::MatrixXi &,\n      const Eigen::MatrixXi &,\n      const std::set<std::pair<double,int> > &,\n      const std::vector<std::set<std::pair<double,int> >::iterator > &,\n      const Eigen::MatrixXd &,\n      const int,\n      const int,\n      const int,\n      const int,\n      const int)> & stopping_condition,\n    const std::function<bool(\n      const Eigen::MatrixXd &                                         ,/*V*/\n      const Eigen::MatrixXi &                                         ,/*F*/\n      const Eigen::MatrixXi &                                         ,/*E*/\n      const Eigen::VectorXi &                                         ,/*EMAP*/\n      const Eigen::MatrixXi &                                         ,/*EF*/\n      const Eigen::MatrixXi &                                         ,/*EI*/\n      const std::set<std::pair<double,int> > &                        ,/*Q*/\n      const std::vector<std::set<std::pair<double,int> >::iterator > &,/*Qit*/\n      const Eigen::MatrixXd &                                         ,/*C*/\n      const int                                                        /*e*/\n      )> & pre_collapse,\n    const std::function<void(\n      const Eigen::MatrixXd &                                         ,   /*V*/\n      const Eigen::MatrixXi &                                         ,   /*F*/\n      const Eigen::MatrixXi &                                         ,   /*E*/\n      const Eigen::VectorXi &                                         ,/*EMAP*/\n      const Eigen::MatrixXi &                                         ,  /*EF*/\n      const Eigen::MatrixXi &                                         ,  /*EI*/\n      const std::set<std::pair<double,int> > &                        ,   /*Q*/\n      const std::vector<std::set<std::pair<double,int> >::iterator > &, /*Qit*/\n      const Eigen::MatrixXd &                                         ,   /*C*/\n      const int                                                       ,   /*e*/\n      const int                                                       ,  /*e1*/\n      const int                                                       ,  /*e2*/\n      const int                                                       ,  /*f1*/\n      const int                                                       ,  /*f2*/\n      const bool                                                  /*collapsed*/\n      )> & post_collapse,\n  Eigen::MatrixXd & U,\n  Eigen::MatrixXi & G,\n  Eigen::VectorXi & J,\n  Eigen::VectorXi & I\n  )\n{\n  using namespace Eigen;\n  using namespace std;\n  VectorXi EMAP;\n  MatrixXi E,EF,EI;\n  edge_flaps(OF,E,EMAP,EF,EI);\n  return igl::decimate(\n    OV,OF,\n    cost_and_placement,stopping_condition,pre_collapse,post_collapse,\n    E,EMAP,EF,EI,\n    U,G,J,I);\n}\n\n\nIGL_INLINE bool igl::decimate(\n  const Eigen::MatrixXd & OV,\n  const Eigen::MatrixXi & OF,\n  const std::function<void(\n    const int,\n    const Eigen::MatrixXd &,\n    const Eigen::MatrixXi &,\n    const Eigen::MatrixXi &,\n    const Eigen::VectorXi &,\n    const Eigen::MatrixXi &,\n    const Eigen::MatrixXi &,\n    double &,\n    Eigen::RowVectorXd &)> & cost_and_placement,\n  const std::function<bool(\n      const Eigen::MatrixXd &,\n      const Eigen::MatrixXi &,\n      const Eigen::MatrixXi &,\n      const Eigen::VectorXi &,\n      const Eigen::MatrixXi &,\n      const Eigen::MatrixXi &,\n      const std::set<std::pair<double,int> > &,\n      const std::vector<std::set<std::pair<double,int> >::iterator > &,\n      const Eigen::MatrixXd &,\n      const int,\n      const int,\n      const int,\n      const int,\n      const int)> & stopping_condition,\n    const std::function<bool(\n      const Eigen::MatrixXd &                                         ,/*V*/\n      const Eigen::MatrixXi &                                         ,/*F*/\n      const Eigen::MatrixXi &                                         ,/*E*/\n      const Eigen::VectorXi &                                         ,/*EMAP*/\n      const Eigen::MatrixXi &                                         ,/*EF*/\n      const Eigen::MatrixXi &                                         ,/*EI*/\n      const std::set<std::pair<double,int> > &                        ,/*Q*/\n      const std::vector<std::set<std::pair<double,int> >::iterator > &,/*Qit*/\n      const Eigen::MatrixXd &                                         ,/*C*/\n      const int                                                        /*e*/\n      )> & pre_collapse,\n    const std::function<void(\n      const Eigen::MatrixXd &                                         ,   /*V*/\n      const Eigen::MatrixXi &                                         ,   /*F*/\n      const Eigen::MatrixXi &                                         ,   /*E*/\n      const Eigen::VectorXi &                                         ,/*EMAP*/\n      const Eigen::MatrixXi &                                         ,  /*EF*/\n      const Eigen::MatrixXi &                                         ,  /*EI*/\n      const std::set<std::pair<double,int> > &                        ,   /*Q*/\n      const std::vector<std::set<std::pair<double,int> >::iterator > &, /*Qit*/\n      const Eigen::MatrixXd &                                         ,   /*C*/\n      const int                                                       ,   /*e*/\n      const int                                                       ,  /*e1*/\n      const int                                                       ,  /*e2*/\n      const int                                                       ,  /*f1*/\n      const int                                                       ,  /*f2*/\n      const bool                                                  /*collapsed*/\n      )> & post_collapse,\n  const Eigen::MatrixXi & OE,\n  const Eigen::VectorXi & OEMAP,\n  const Eigen::MatrixXi & OEF,\n  const Eigen::MatrixXi & OEI,\n  Eigen::MatrixXd & U,\n  Eigen::MatrixXi & G,\n  Eigen::VectorXi & J,\n  Eigen::VectorXi & I\n  )\n{\n\n  // Decimate 1\n  using namespace Eigen;\n  using namespace std;\n  // Working copies\n  Eigen::MatrixXd V = OV;\n  Eigen::MatrixXi F = OF;\n  Eigen::MatrixXi E = OE;\n  Eigen::VectorXi EMAP = OEMAP;\n  Eigen::MatrixXi EF = OEF;\n  Eigen::MatrixXi EI = OEI;\n  typedef std::set<std::pair<double,int> > PriorityQueue;\n  PriorityQueue Q;\n  std::vector<PriorityQueue::iterator > Qit;\n  Qit.resize(E.rows());\n  // If an edge were collapsed, we'd collapse it to these points:\n  MatrixXd C(E.rows(),V.cols());\n  for(int e = 0;e<E.rows();e++)\n  {\n    double cost = e;\n    RowVectorXd p(1,3);\n    cost_and_placement(e,V,F,E,EMAP,EF,EI,cost,p);\n    C.row(e) = p;\n    Qit[e] = Q.insert(std::pair<double,int>(cost,e)).first;\n  }\n  int prev_e = -1;\n  bool clean_finish = false;\n\n  while(true)\n  {\n    if(Q.empty())\n    {\n      break;\n    }\n    if(Q.begin()->first == std::numeric_limits<double>::infinity())\n    {\n      // min cost edge is infinite cost\n      break;\n    }\n    int e,e1,e2,f1,f2;\n    if(collapse_edge(\n       cost_and_placement, pre_collapse, post_collapse,\n       V,F,E,EMAP,EF,EI,Q,Qit,C,e,e1,e2,f1,f2))\n    {\n      if(stopping_condition(V,F,E,EMAP,EF,EI,Q,Qit,C,e,e1,e2,f1,f2))\n      {\n        clean_finish = true;\n        break;\n      }\n    }else\n    {\n      if(prev_e == e)\n      {\n        assert(false && \"Edge collapse no progress... bad stopping condition?\");\n        break;\n      }\n      // Edge was not collapsed... must have been invalid. collapse_edge should\n      // have updated its cost to inf... continue\n    }\n    prev_e = e;\n  }\n  // remove all IGL_COLLAPSE_EDGE_NULL faces\n  MatrixXi F2(F.rows(),3);\n  J.resize(F.rows());\n  int m = 0;\n  for(int f = 0;f<F.rows();f++)\n  {\n    if(\n      F(f,0) != IGL_COLLAPSE_EDGE_NULL || \n      F(f,1) != IGL_COLLAPSE_EDGE_NULL || \n      F(f,2) != IGL_COLLAPSE_EDGE_NULL)\n    {\n      F2.row(m) = F.row(f);\n      J(m) = f;\n      m++;\n    }\n  }\n  F2.conservativeResize(m,F2.cols());\n  J.conservativeResize(m);\n  VectorXi _1;\n  remove_unreferenced(V,F2,U,G,_1,I);\n  return clean_finish;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/decimate.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_DECIMATE_H\n#define IGL_DECIMATE_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <vector>\n#include <set>\nnamespace igl\n{\n  // Assumes (V,F) is a manifold mesh (possibly with boundary) Collapses edges\n  // until desired number of faces is achieved. This uses default edge cost and\n  // merged vertex placement functions {edge length, edge midpoint}.\n  //\n  // Inputs:\n  //   V  #V by dim list of vertex positions\n  //   F  #F by 3 list of face indices into V.\n  //   max_m  desired number of output faces\n  // Outputs:\n  //   U  #U by dim list of output vertex posistions (can be same ref as V)\n  //   G  #G by 3 list of output face indices into U (can be same ref as G)\n  //   J  #G list of indices into F of birth face\n  //   I  #U list of indices into V of birth vertices\n  // Returns true if m was reached (otherwise #G > m)\n  IGL_INLINE bool decimate(\n    const Eigen::MatrixXd & V,\n    const Eigen::MatrixXi & F,\n    const size_t max_m,\n    Eigen::MatrixXd & U,\n    Eigen::MatrixXi & G,\n    Eigen::VectorXi & J,\n    Eigen::VectorXi & I);\n  // Inputs:\n  //   V  #V by dim list of vertex positions\n  //   F  #F by 3 list of face indices into V.\n  //   max_m  desired number of output faces\n  // Outputs:\n  //   U  #U by dim list of output vertex posistions (can be same ref as V)\n  //   G  #G by 3 list of output face indices into U (can be same ref as G)\n  //   J  #G list of indices into F of birth face\n  // Returns true if m was reached (otherwise #G > m)\n  IGL_INLINE bool decimate(\n    const Eigen::MatrixXd & V,\n    const Eigen::MatrixXi & F,\n    const size_t max_m,\n    Eigen::MatrixXd & U,\n    Eigen::MatrixXi & G,\n    Eigen::VectorXi & J);\n  // Assumes a **closed** manifold mesh. See igl::connect_boundary_to_infinity\n  // and igl::decimate in decimate.cpp\n  // is handling meshes with boundary by connecting all boundary edges with\n  // dummy facets to infinity **and** modifying the stopping criteria.\n  //\n  // Inputs:\n  //   cost_and_placement  function computing cost of collapsing an edge and 3d\n  //     position where it should be placed:\n  //     cost_and_placement(V,F,E,EMAP,EF,EI,cost,placement);\n  //   stopping_condition  function returning whether to stop collapsing edges\n  //     based on current state. Guaranteed to be called after _successfully_\n  //     collapsing edge e removing edges (e,e1,e2) and faces (f1,f2):\n  //     bool should_stop =\n  //       stopping_condition(V,F,E,EMAP,EF,EI,Q,Qit,C,e,e1,e2,f1,f2);\n  IGL_INLINE bool decimate(\n    const Eigen::MatrixXd & V,\n    const Eigen::MatrixXi & F,\n    const std::function<void(\n      const int              /*e*/,\n      const Eigen::MatrixXd &/*V*/,\n      const Eigen::MatrixXi &/*F*/,\n      const Eigen::MatrixXi &/*E*/,\n      const Eigen::VectorXi &/*EMAP*/,\n      const Eigen::MatrixXi &/*EF*/,\n      const Eigen::MatrixXi &/*EI*/,\n      double &               /*cost*/,\n      Eigen::RowVectorXd &   /*p*/\n      )> & cost_and_placement,\n    const std::function<bool(\n      const Eigen::MatrixXd &                                         ,/*V*/\n      const Eigen::MatrixXi &                                         ,/*F*/\n      const Eigen::MatrixXi &                                         ,/*E*/\n      const Eigen::VectorXi &                                         ,/*EMAP*/\n      const Eigen::MatrixXi &                                         ,/*EF*/\n      const Eigen::MatrixXi &                                         ,/*EI*/\n      const std::set<std::pair<double,int> > &                        ,/*Q*/\n      const std::vector<std::set<std::pair<double,int> >::iterator > &,/*Qit*/\n      const Eigen::MatrixXd &                                         ,/*C*/\n      const int                                                       ,/*e*/\n      const int                                                       ,/*e1*/\n      const int                                                       ,/*e2*/\n      const int                                                       ,/*f1*/\n      const int                                                        /*f2*/\n      )> & stopping_condition,\n    Eigen::MatrixXd & U,\n    Eigen::MatrixXi & G,\n    Eigen::VectorXi & J,\n    Eigen::VectorXi & I);\n\n  // Inputs:\n  //   pre_collapse  callback called with index of edge whose collapse is about\n  //     to be attempted (see collapse_edge)\n  //   post_collapse  callback called with index of edge whose collapse was\n  //     just attempted and a flag revealing whether this was successful (see\n  //     collapse_edge)\n  IGL_INLINE bool decimate(\n    const Eigen::MatrixXd & V,\n    const Eigen::MatrixXi & F,\n    const std::function<void(\n      const int              /*e*/,\n      const Eigen::MatrixXd &/*V*/,\n      const Eigen::MatrixXi &/*F*/,\n      const Eigen::MatrixXi &/*E*/,\n      const Eigen::VectorXi &/*EMAP*/,\n      const Eigen::MatrixXi &/*EF*/,\n      const Eigen::MatrixXi &/*EI*/,\n      double &               /*cost*/,\n      Eigen::RowVectorXd &   /*p*/\n      )> & cost_and_placement,\n    const std::function<bool(\n      const Eigen::MatrixXd &                                         ,/*V*/\n      const Eigen::MatrixXi &                                         ,/*F*/\n      const Eigen::MatrixXi &                                         ,/*E*/\n      const Eigen::VectorXi &                                         ,/*EMAP*/\n      const Eigen::MatrixXi &                                         ,/*EF*/\n      const Eigen::MatrixXi &                                         ,/*EI*/\n      const std::set<std::pair<double,int> > &                        ,/*Q*/\n      const std::vector<std::set<std::pair<double,int> >::iterator > &,/*Qit*/\n      const Eigen::MatrixXd &                                         ,/*C*/\n      const int                                                       ,/*e*/\n      const int                                                       ,/*e1*/\n      const int                                                       ,/*e2*/\n      const int                                                       ,/*f1*/\n      const int                                                        /*f2*/\n      )> & stopping_condition,\n    const std::function<bool(\n      const Eigen::MatrixXd &                                         ,/*V*/\n      const Eigen::MatrixXi &                                         ,/*F*/\n      const Eigen::MatrixXi &                                         ,/*E*/\n      const Eigen::VectorXi &                                         ,/*EMAP*/\n      const Eigen::MatrixXi &                                         ,/*EF*/\n      const Eigen::MatrixXi &                                         ,/*EI*/\n      const std::set<std::pair<double,int> > &                        ,/*Q*/\n      const std::vector<std::set<std::pair<double,int> >::iterator > &,/*Qit*/\n      const Eigen::MatrixXd &                                         ,/*C*/\n      const int                                                        /*e*/\n      )> & pre_collapse,\n    const std::function<void(\n      const Eigen::MatrixXd &                                         ,   /*V*/\n      const Eigen::MatrixXi &                                         ,   /*F*/\n      const Eigen::MatrixXi &                                         ,   /*E*/\n      const Eigen::VectorXi &                                         ,/*EMAP*/\n      const Eigen::MatrixXi &                                         ,  /*EF*/\n      const Eigen::MatrixXi &                                         ,  /*EI*/\n      const std::set<std::pair<double,int> > &                        ,   /*Q*/\n      const std::vector<std::set<std::pair<double,int> >::iterator > &, /*Qit*/\n      const Eigen::MatrixXd &                                         ,   /*C*/\n      const int                                                       ,   /*e*/\n      const int                                                       ,  /*e1*/\n      const int                                                       ,  /*e2*/\n      const int                                                       ,  /*f1*/\n      const int                                                       ,  /*f2*/\n      const bool                                                  /*collapsed*/\n      )> & post_collapse,\n    Eigen::MatrixXd & U,\n    Eigen::MatrixXi & G,\n    Eigen::VectorXi & J,\n    Eigen::VectorXi & I);\n\n  // Inputs:\n  //   EMAP #F*3 list of indices into E, mapping each directed edge to unique\n  //     unique edge in E\n  //   EF  #E by 2 list of edge flaps, EF(e,0)=f means e=(i-->j) is the edge of\n  //     F(f,:) opposite the vth corner, where EI(e,0)=v. Similarly EF(e,1) \"\n  //     e=(j->i)\n  //   EI  #E by 2 list of edge flap corners (see above).\n\n  IGL_INLINE bool decimate(\n    const Eigen::MatrixXd & V,\n    const Eigen::MatrixXi & F,\n    const std::function<void(\n      const int              /*e*/,\n      const Eigen::MatrixXd &/*V*/,\n      const Eigen::MatrixXi &/*F*/,\n      const Eigen::MatrixXi &/*E*/,\n      const Eigen::VectorXi &/*EMAP*/,\n      const Eigen::MatrixXi &/*EF*/,\n      const Eigen::MatrixXi &/*EI*/,\n      double &               /*cost*/,\n      Eigen::RowVectorXd &   /*p*/\n      )> & cost_and_placement,\n    const std::function<bool(\n      const Eigen::MatrixXd &                                         ,/*V*/\n      const Eigen::MatrixXi &                                         ,/*F*/\n      const Eigen::MatrixXi &                                         ,/*E*/\n      const Eigen::VectorXi &                                         ,/*EMAP*/\n      const Eigen::MatrixXi &                                         ,/*EF*/\n      const Eigen::MatrixXi &                                         ,/*EI*/\n      const std::set<std::pair<double,int> > &                        ,/*Q*/\n      const std::vector<std::set<std::pair<double,int> >::iterator > &,/*Qit*/\n      const Eigen::MatrixXd &                                         ,/*C*/\n      const int                                                       ,/*e*/\n      const int                                                       ,/*e1*/\n      const int                                                       ,/*e2*/\n      const int                                                       ,/*f1*/\n      const int                                                        /*f2*/\n      )> & stopping_condition,\n    const std::function<bool(\n      const Eigen::MatrixXd &                                         ,/*V*/\n      const Eigen::MatrixXi &                                         ,/*F*/\n      const Eigen::MatrixXi &                                         ,/*E*/\n      const Eigen::VectorXi &                                         ,/*EMAP*/\n      const Eigen::MatrixXi &                                         ,/*EF*/\n      const Eigen::MatrixXi &                                         ,/*EI*/\n      const std::set<std::pair<double,int> > &                        ,/*Q*/\n      const std::vector<std::set<std::pair<double,int> >::iterator > &,/*Qit*/\n      const Eigen::MatrixXd &                                         ,/*C*/\n      const int                                                        /*e*/\n      )> & pre_collapse,\n    const std::function<void(\n      const Eigen::MatrixXd &                                         ,   /*V*/\n      const Eigen::MatrixXi &                                         ,   /*F*/\n      const Eigen::MatrixXi &                                         ,   /*E*/\n      const Eigen::VectorXi &                                         ,/*EMAP*/\n      const Eigen::MatrixXi &                                         ,  /*EF*/\n      const Eigen::MatrixXi &                                         ,  /*EI*/\n      const std::set<std::pair<double,int> > &                        ,   /*Q*/\n      const std::vector<std::set<std::pair<double,int> >::iterator > &, /*Qit*/\n      const Eigen::MatrixXd &                                         ,   /*C*/\n      const int                                                       ,   /*e*/\n      const int                                                       ,  /*e1*/\n      const int                                                       ,  /*e2*/\n      const int                                                       ,  /*f1*/\n      const int                                                       ,  /*f2*/\n      const bool                                                  /*collapsed*/\n      )> & post_collapse,\n    const Eigen::MatrixXi & E,\n    const Eigen::VectorXi & EMAP,\n    const Eigen::MatrixXi & EF,\n    const Eigen::MatrixXi & EI,\n    Eigen::MatrixXd & U,\n    Eigen::MatrixXi & G,\n    Eigen::VectorXi & J,\n    Eigen::VectorXi & I);\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"decimate.cpp\"\n#endif\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/deform_skeleton.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"deform_skeleton.h\"\nvoid igl::deform_skeleton(\n  const Eigen::MatrixXd & C,\n  const Eigen::MatrixXi & BE,\n  const std::vector<\n    Eigen::Affine3d,Eigen::aligned_allocator<Eigen::Affine3d> > & vA,\n  Eigen::MatrixXd & CT,\n  Eigen::MatrixXi & BET)\n{\n  using namespace Eigen;\n  assert(BE.rows() == (int)vA.size());\n  CT.resize(2*BE.rows(),C.cols());\n  BET.resize(BE.rows(),2);\n  for(int e = 0;e<BE.rows();e++)\n  {\n    BET(e,0) = 2*e;\n    BET(e,1) = 2*e+1;\n    Affine3d a = vA[e];\n    Vector3d c0 = C.row(BE(e,0));\n    Vector3d c1 = C.row(BE(e,1));\n    CT.row(2*e) =   a * c0;\n    CT.row(2*e+1) = a * c1;\n  }\n\n}\n\nIGL_INLINE void igl::deform_skeleton(\n  const Eigen::MatrixXd & C,\n  const Eigen::MatrixXi & BE,\n  const Eigen::MatrixXd & T,\n  Eigen::MatrixXd & CT,\n  Eigen::MatrixXi & BET)\n{\n  using namespace Eigen;\n  //assert(BE.rows() == (int)vA.size());\n  CT.resize(2*BE.rows(),C.cols());\n  BET.resize(BE.rows(),2);\n  for(int e = 0;e<BE.rows();e++)\n  {\n    BET(e,0) = 2*e;\n    BET(e,1) = 2*e+1;\n    Matrix4d t;\n    t << T.block(e*4,0,4,3).transpose(), 0,0,0,0;\n    Affine3d a;\n    a.matrix() = t;\n    Vector3d c0 = C.row(BE(e,0));\n    Vector3d c1 = C.row(BE(e,1));\n    CT.row(2*e) =   a * c0;\n    CT.row(2*e+1) = a * c1;\n  }\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/deform_skeleton.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_DEFORM_SKELETON_H\n#define IGL_DEFORM_SKELETON_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <Eigen/Geometry>\n#include <Eigen/StdVector>\n#include <vector>\nnamespace igl\n{\n  // Deform a skeleton.\n  //\n  // Inputs:\n  //   C  #C by 3 list of joint positions\n  //   BE  #BE by 2 list of bone edge indices\n  //   vA  #BE list of bone transformations\n  // Outputs\n  //   CT  #BE*2 by 3 list of deformed joint positions\n  //   BET  #BE by 2 list of bone edge indices (maintains order)\n  //\n  IGL_INLINE void deform_skeleton(\n    const Eigen::MatrixXd & C,\n    const Eigen::MatrixXi & BE,\n    const std::vector<\n      Eigen::Affine3d,Eigen::aligned_allocator<Eigen::Affine3d> > & vA,\n    Eigen::MatrixXd & CT,\n    Eigen::MatrixXi & BET);\n  // Inputs:\n  //   T  #BE*4 by 3 list of stacked transformation matrix\n  IGL_INLINE void deform_skeleton(\n    const Eigen::MatrixXd & C,\n    const Eigen::MatrixXi & BE,\n    const Eigen::MatrixXd & T,\n    Eigen::MatrixXd & CT,\n    Eigen::MatrixXi & BET);\n}\n  \n#ifndef IGL_STATIC_LIBRARY\n#  include \"deform_skeleton.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/delaunay_triangulation.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2016 Qingnan Zhou <qnzhou@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"delaunay_triangulation.h\"\n#include \"flip_edge.h\"\n#include \"lexicographic_triangulation.h\"\n#include \"unique_edge_map.h\"\n\n#include <vector>\n#include <sstream>\n\ntemplate<\n  typename DerivedV,\n  typename Orient2D,\n  typename InCircle,\n  typename DerivedF>\nIGL_INLINE void igl::delaunay_triangulation(\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    Orient2D orient2D,\n    InCircle incircle,\n    Eigen::PlainObjectBase<DerivedF>& F)\n{\n  assert(V.cols() == 2);\n  typedef typename DerivedF::Scalar Index;\n  typedef typename DerivedV::Scalar Scalar;\n  igl::lexicographic_triangulation(V, orient2D, F);\n  const size_t num_faces = F.rows();\n  if (num_faces == 0) {\n    // Input points are degenerate.  No faces will be generated.\n    return;\n  }\n  assert(F.cols() == 3);\n\n  Eigen::MatrixXi E;\n  Eigen::MatrixXi uE;\n  Eigen::VectorXi EMAP;\n  std::vector<std::vector<Index> > uE2E;\n  igl::unique_edge_map(F, E, uE, EMAP, uE2E);\n\n  auto is_delaunay = [&V,&F,&uE2E,num_faces,&incircle](size_t uei) {\n    auto& half_edges = uE2E[uei];\n    if (half_edges.size() != 2) {\n      throw \"Cannot flip non-manifold or boundary edge\";\n    }\n\n    const size_t f1 = half_edges[0] % num_faces;\n    const size_t f2 = half_edges[1] % num_faces;\n    const size_t c1 = half_edges[0] / num_faces;\n    const size_t c2 = half_edges[1] / num_faces;\n    assert(c1 < 3);\n    assert(c2 < 3);\n    assert(f1 != f2);\n    const size_t v1 = F(f1, (c1+1)%3);\n    const size_t v2 = F(f1, (c1+2)%3);\n    const size_t v4 = F(f1, c1);\n    const size_t v3 = F(f2, c2);\n    const Scalar p1[] = {V(v1, 0), V(v1, 1)};\n    const Scalar p2[] = {V(v2, 0), V(v2, 1)};\n    const Scalar p3[] = {V(v3, 0), V(v3, 1)};\n    const Scalar p4[] = {V(v4, 0), V(v4, 1)};\n    auto orientation = incircle(p1, p2, p4, p3);\n    return orientation <= 0;\n  };\n\n  bool all_delaunay = false;\n  while(!all_delaunay) {\n    all_delaunay = true;\n    for (size_t i=0; i<uE2E.size(); i++) {\n      if (uE2E[i].size() == 2) {\n        if (!is_delaunay(i)) {\n          all_delaunay = false;\n          flip_edge(F, E, uE, EMAP, uE2E, i);\n        }\n      }\n    }\n  }\n}\n\n"
  },
  {
    "path": "libs/libigl/include/igl/delaunay_triangulation.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Qingan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_DELAUNAY_TRIANGULATION_H\n#define IGL_DELAUNAY_TRIANGULATION_H\n\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n\nnamespace igl\n{\n  // Given a set of points in 2D, return a Delaunay triangulation of these\n  // points.\n  //\n  // Inputs:\n  //   V  #V by 2 list of vertex positions\n  //   orient2D  A functor such that orient2D(pa, pb, pc) returns\n  //               1 if pa,pb,pc forms a conterclockwise triangle.\n  //              -1 if pa,pb,pc forms a clockwise triangle.\n  //               0 if pa,pb,pc are collinear.\n  //              where the argument pa,pb,pc are of type Scalar[2].\n  //   incircle  A functor such that incircle(pa, pb, pc, pd) returns\n  //               1 if pd is on the positive size of circumcirle of (pa,pb,pc)\n  //              -1 if pd is on the positive size of circumcirle of (pa,pb,pc)\n  //               0 if pd is cocircular with pa, pb, pc.\n  // Outputs:\n  //   F  #F by 3 of faces in Delaunay triangulation.\n  template<\n    typename DerivedV,\n    typename Orient2D,\n    typename InCircle,\n    typename DerivedF\n    >\n  IGL_INLINE void delaunay_triangulation(\n      const Eigen::PlainObjectBase<DerivedV>& V,\n      Orient2D orient2D,\n      InCircle incircle,\n      Eigen::PlainObjectBase<DerivedF>& F);\n}\n\n\n\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"delaunay_triangulation.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/deprecated.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_DEPRECATED_H\n#define IGL_DEPRECATED_H\n// Macro for marking a function as deprecated.\n// \n// http://stackoverflow.com/a/295229/148668\n#ifdef __GNUC__\n#define IGL_DEPRECATED(func) func __attribute__ ((deprecated))\n#elif defined(_MSC_VER)\n#define IGL_DEPRECATED(func) __declspec(deprecated) func\n#else\n#pragma message(\"WARNING: You need to implement IGL_DEPRECATED for this compiler\")\n#define IGL_DEPRECATED(func) func\n#endif\n// Usage:\n//\n//     template <typename T> IGL_INLINE void my_func(Arg1 a);\n//\n// becomes \n//\n//     template <typename T> IGL_INLINE IGL_DEPRECATED(void my_func(Arg1 a));\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/destroy_shader_program.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"destroy_shader_program.h\"\n#ifndef IGL_NO_OPENGL\n#include <cstdio>\n#include \"report_gl_error.h\"\n\nIGL_INLINE bool igl::destroy_shader_program(const GLuint id)\n{\n  // Don't try to destroy id == 0 (no shader program)\n  if(id == 0)\n  {\n    fprintf(stderr,\"Error: destroy_shader_program() id = %d\"\n      \" but must should be positive\\n\",id);\n    return false;\n  }\n  // Get each attached shader one by one and detach and delete it\n  GLsizei count;\n  // shader id\n  GLuint s;\n  do\n  {\n    // Try to get at most *1* attached shader\n    glGetAttachedShaders(id,1,&count,&s);\n    GLenum err = igl::report_gl_error();\n    if (GL_NO_ERROR != err)\n    {\n      return false;\n    }\n    // Check that we actually got *1*\n    if(count == 1)\n    {\n      // Detach and delete this shader\n      glDetachShader(id,s);\n      glDeleteShader(s);\n    }\n  }while(count > 0);\n  // Now that all of the shaders are gone we can just delete the program\n  glDeleteProgram(id);\n  return true;\n}\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/destroy_shader_program.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_DESTROY_SHADER_PROGRAM_H\n#define IGL_DESTROY_SHADER_PROGRAM_H\n#ifndef IGL_NO_OPENGL\n#include \"igl_inline.h\"\n\n#include \"OpenGL_convenience.h\"\n\nnamespace igl\n{\n  // Properly destroy a shader program. Detach and delete each of its shaders\n  // and delete it\n  // Inputs:\n  //   id  index id of created shader, set to 0 on error\n  // Returns true on success, false on error\n  // \n  // Note: caller is responsible for making sure he doesn't foolishly continue\n  // to use id as if it still contains a program\n  // \n  // See also: create_shader_program\n  IGL_INLINE bool destroy_shader_program(const GLuint id);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"destroy_shader_program.cpp\"\n#endif\n\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/dfs.cpp",
    "content": "#include \"dfs.h\"\n#include \"list_to_matrix.h\"\n#include <vector>\n\ntemplate <\n  typename AType,\n  typename DerivedD,\n  typename DerivedP,\n  typename DerivedC>\nIGL_INLINE void igl::dfs(\n  const std::vector<std::vector<AType> > & A,\n  const size_t s,\n  Eigen::PlainObjectBase<DerivedD> & D,\n  Eigen::PlainObjectBase<DerivedP> & P,\n  Eigen::PlainObjectBase<DerivedC> & C)\n{\n  std::vector<typename DerivedD::Scalar> vD;\n  std::vector<typename DerivedP::Scalar> vP;\n  std::vector<typename DerivedC::Scalar> vC;\n  dfs(A,s,vD,vP,vC);\n  list_to_matrix(vD,D);\n  list_to_matrix(vP,P);\n  list_to_matrix(vC,C);\n}\n\ntemplate <\n  typename AType,\n  typename DType,\n  typename PType,\n  typename CType>\nIGL_INLINE void igl::dfs(\n  const std::vector<std::vector<AType> > & A,\n  const size_t s,\n  std::vector<DType> & D,\n  std::vector<PType> & P,\n  std::vector<CType> & C)\n{\n  // number of nodes\n  int N = s+1;\n  for(const auto & Ai : A) for(const auto & a : Ai) N = std::max(N,a+1);\n  std::vector<bool> seen(N,false);\n  P.resize(N,-1);\n  std::function<void(const size_t, const size_t)> dfs_helper;\n  dfs_helper = [&D,&P,&C,&dfs_helper,&seen,&A](const size_t s, const size_t p)\n  {\n    if(seen[s]) return;\n    seen[s] = true;\n    D.push_back(s);\n    P[s] = p;\n    for(const auto n : A[s]) dfs_helper(n,s);\n    C.push_back(s);\n  };\n  dfs_helper(s,-1);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::dfs<int, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > const&, unsigned long, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/dfs.h",
    "content": "#ifndef IGL_DFS_H\n#define IGL_DFS_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <vector>\nnamespace igl\n{\n  // Traverse a **directed** graph represented by an adjacency list using\n  // depth first search\n  //\n  // Inputs:\n  //   A  #V list of adjacency lists\n  //   s  starting node (index into A)\n  // Outputs:\n  //   D  #V list of indices into rows of A in the order in which graph nodes\n  //     are discovered.\n  //   P  #V list of indices into rows of A of predecessor in resulting\n  //     spanning tree {-1 indicates root/not discovered), order corresponds to\n  //     V **not** D.\n  //   C  #V list of indices into rows of A in order that nodes are \"closed\"\n  //     (all descendants have been discovered)\n  template <\n    typename AType,\n    typename DerivedD,\n    typename DerivedP,\n    typename DerivedC>\n  IGL_INLINE void dfs(\n    const std::vector<std::vector<AType> > & A,\n    const size_t s,\n    Eigen::PlainObjectBase<DerivedD> & D,\n    Eigen::PlainObjectBase<DerivedP> & P,\n    Eigen::PlainObjectBase<DerivedC> & C);\n  template <\n    typename AType,\n    typename DType,\n    typename PType,\n    typename CType>\n  IGL_INLINE void dfs(\n    const std::vector<std::vector<AType> > & A,\n    const size_t s,\n    std::vector<DType> & D,\n    std::vector<PType> & P,\n    std::vector<CType> & C);\n\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"dfs.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/diag.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"diag.h\"\n\n#include \"verbose.h\"\n\n// Bug in unsupported/Eigen/SparseExtra needs iostream first\n#include <iostream>\n#include <unsupported/Eigen/SparseExtra>\n\ntemplate <typename T>\nIGL_INLINE void igl::diag(\n  const Eigen::SparseMatrix<T>& X,\n  Eigen::SparseVector<T>& V)\n{\n  assert(false && \"Just call X.diagonal().sparseView() directly\");\n  V = X.diagonal().sparseView();\n  //// Get size of input\n  //int m = X.rows();\n  //int n = X.cols();\n  //V = Eigen::SparseVector<T>((m>n?n:m));\n  //V.reserve(V.size());\n\n  //// Iterate over outside\n  //for(int k=0; k<X.outerSize(); ++k)\n  //{\n  //  // Iterate over inside\n  //  for(typename Eigen::SparseMatrix<T>::InnerIterator it (X,k); it; ++it)\n  //  {\n  //    if(it.col() == it.row())\n  //    {\n  //      V.coeffRef(it.col()) += it.value();\n  //    }\n  //  }\n  //}\n}\n\ntemplate <typename T,typename DerivedV>\nIGL_INLINE void igl::diag(\n  const Eigen::SparseMatrix<T>& X,\n  Eigen::MatrixBase<DerivedV> & V)\n{\n  assert(false && \"Just call X.diagonal() directly\");\n  V = X.diagonal();\n  //// Get size of input\n  //int m = X.rows();\n  //int n = X.cols();\n  //V.derived().resize((m>n?n:m),1);\n\n  //// Iterate over outside\n  //for(int k=0; k<X.outerSize(); ++k)\n  //{\n  //  // Iterate over inside\n  //  for(typename Eigen::SparseMatrix<T>::InnerIterator it (X,k); it; ++it)\n  //  {\n  //    if(it.col() == it.row())\n  //    {\n  //      V(it.col()) = it.value();\n  //    }\n  //  }\n  //}\n}\n\ntemplate <typename T>\nIGL_INLINE void igl::diag(\n  const Eigen::SparseVector<T>& V,\n  Eigen::SparseMatrix<T>& X)\n{\n  // clear and resize output\n  Eigen::DynamicSparseMatrix<T, Eigen::RowMajor> dyn_X(V.size(),V.size());\n  dyn_X.reserve(V.size());\n  // loop over non-zeros\n  for(typename Eigen::SparseVector<T>::InnerIterator it(V); it; ++it)\n  {\n    dyn_X.coeffRef(it.index(),it.index()) += it.value();\n  }\n  X = Eigen::SparseMatrix<T>(dyn_X);\n}\n\ntemplate <typename T, typename DerivedV>\nIGL_INLINE void igl::diag(\n  const Eigen::MatrixBase<DerivedV> & V,\n  Eigen::SparseMatrix<T>& X)\n{\n  assert(V.rows() == 1 || V.cols() == 1);\n  // clear and resize output\n  Eigen::DynamicSparseMatrix<T, Eigen::RowMajor> dyn_X(V.size(),V.size());\n  dyn_X.reserve(V.size());\n  // loop over non-zeros\n  for(int i = 0;i<V.size();i++)\n  {\n    dyn_X.coeffRef(i,i) += V[i];\n  }\n  X = Eigen::SparseMatrix<T>(dyn_X);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::diag<double, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::SparseMatrix<double, 0, int> const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::diag<double>(Eigen::SparseMatrix<double, 0, int> const&, Eigen::SparseVector<double, 0, int>&);\ntemplate void igl::diag<double, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::SparseMatrix<double, 0, int>&);\ntemplate void igl::diag<double>(Eigen::SparseVector<double, 0, int> const&, Eigen::SparseMatrix<double, 0, int>&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/diag.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_DIAG_H\n#define IGL_DIAG_H\n#include \"igl_inline.h\"\n#define EIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET\n#include <Eigen/Sparse>\n\nnamespace igl\n{\n  // http://forum.kde.org/viewtopic.php?f=74&t=117476&p=292388#p292388\n  //\n  // This is superceded by \n  //   VectorXd V = X.diagonal() and \n  //   SparseVector<double> V = X.diagonal().sparseView()\n  //   SparseMatrix<double> X = V.asDiagonal().sparseView()\n  //\n  //\n  // Either extracts the main diagonal of a matrix as a vector OR converts a\n  // vector into a matrix with vector along the main diagonal. Like matlab's\n  // diag function\n\n  // Templates:\n  //   T  should be a eigen sparse matrix primitive type like int or double\n  // Inputs:\n  //   X  an m by n sparse matrix\n  // Outputs:\n  //   V  a min(m,n) sparse vector\n  template <typename T>\n  IGL_INLINE void diag(\n    const Eigen::SparseMatrix<T>& X, \n    Eigen::SparseVector<T>& V);\n  template <typename T,typename DerivedV>\n  IGL_INLINE void diag(\n    const Eigen::SparseMatrix<T>& X, \n    Eigen::MatrixBase<DerivedV>& V);\n  // Templates:\n  //   T  should be a eigen sparse matrix primitive type like int or double\n  // Inputs:\n  //  V  a m sparse vector\n  // Outputs:\n  //  X  a m by m sparse matrix\n  template <typename T>\n  IGL_INLINE void diag(\n    const Eigen::SparseVector<T>& V,\n    Eigen::SparseMatrix<T>& X);\n  template <typename T, typename DerivedV>\n  IGL_INLINE void diag(\n    const Eigen::MatrixBase<DerivedV>& V,\n    Eigen::SparseMatrix<T>& X);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"diag.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/dihedral_angles.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"dihedral_angles.h\"\n#include <cassert>\n\ntemplate <\n  typename DerivedV, \n  typename DerivedT, \n  typename Derivedtheta,\n  typename Derivedcos_theta>\nIGL_INLINE void igl::dihedral_angles(\n  Eigen::PlainObjectBase<DerivedV>& V,\n  Eigen::PlainObjectBase<DerivedT>& T,\n  Eigen::PlainObjectBase<Derivedtheta>& theta,\n  Eigen::PlainObjectBase<Derivedcos_theta>& cos_theta)\n{\n  using namespace Eigen;\n  assert(T.cols() == 4);\n  Matrix<typename Derivedtheta::Scalar,Dynamic,6> l;\n  edge_lengths(V,T,l);\n  Matrix<typename Derivedtheta::Scalar,Dynamic,4> s;\n  face_areas(l,s);\n  return dihedral_angles_intrinsic(l,s,theta,cos_theta);\n}\n\ntemplate <\n  typename DerivedL, \n  typename DerivedA, \n  typename Derivedtheta,\n  typename Derivedcos_theta>\nIGL_INLINE void igl::dihedral_angles_intrinsic(\n  Eigen::PlainObjectBase<DerivedL>& L,\n  Eigen::PlainObjectBase<DerivedA>& A,\n  Eigen::PlainObjectBase<Derivedtheta>& theta,\n  Eigen::PlainObjectBase<Derivedcos_theta>& cos_theta)\n{\n  using namespace Eigen;\n  const int m = L.rows();\n  assert(m == A.rows());\n  // Law of cosines\n  // http://math.stackexchange.com/a/49340/35376\n  Matrix<typename Derivedtheta::Scalar,Dynamic,6> H_sqr(m,6);\n  H_sqr.col(0) = (1./16.) * (4. * L.col(3).array().square() * L.col(0).array().square() - \n                                ((L.col(1).array().square() + L.col(4).array().square()) -\n                                 (L.col(2).array().square() + L.col(5).array().square())).square());\n  H_sqr.col(1) = (1./16.) * (4. * L.col(4).array().square() * L.col(1).array().square() - \n                                ((L.col(2).array().square() + L.col(5).array().square()) -\n                                 (L.col(3).array().square() + L.col(0).array().square())).square());\n  H_sqr.col(2) = (1./16.) * (4. * L.col(5).array().square() * L.col(2).array().square() - \n                                ((L.col(3).array().square() + L.col(0).array().square()) -\n                                 (L.col(4).array().square() + L.col(1).array().square())).square());\n  H_sqr.col(3) = (1./16.) * (4. * L.col(0).array().square() * L.col(3).array().square() - \n                                ((L.col(4).array().square() + L.col(1).array().square()) -\n                                 (L.col(5).array().square() + L.col(2).array().square())).square());\n  H_sqr.col(4) = (1./16.) * (4. * L.col(1).array().square() * L.col(4).array().square() - \n                                ((L.col(5).array().square() + L.col(2).array().square()) -\n                                 (L.col(0).array().square() + L.col(3).array().square())).square());\n  H_sqr.col(5) = (1./16.) * (4. * L.col(2).array().square() * L.col(5).array().square() - \n                                ((L.col(0).array().square() + L.col(3).array().square()) -\n                                 (L.col(1).array().square() + L.col(4).array().square())).square());\n  cos_theta.resize(m,6);\n  cos_theta.col(0) = (H_sqr.col(0).array() - \n      A.col(1).array().square() - A.col(2).array().square()).array() / \n      (-2.*A.col(1).array() * A.col(2).array());\n  cos_theta.col(1) = (H_sqr.col(1).array() - \n      A.col(2).array().square() - A.col(0).array().square()).array() / \n      (-2.*A.col(2).array() * A.col(0).array());\n  cos_theta.col(2) = (H_sqr.col(2).array() - \n      A.col(0).array().square() - A.col(1).array().square()).array() / \n      (-2.*A.col(0).array() * A.col(1).array());\n  cos_theta.col(3) = (H_sqr.col(3).array() - \n      A.col(3).array().square() - A.col(0).array().square()).array() / \n      (-2.*A.col(3).array() * A.col(0).array());\n  cos_theta.col(4) = (H_sqr.col(4).array() - \n      A.col(3).array().square() - A.col(1).array().square()).array() / \n      (-2.*A.col(3).array() * A.col(1).array());\n  cos_theta.col(5) = (H_sqr.col(5).array() - \n      A.col(3).array().square() - A.col(2).array().square()).array() / \n      (-2.*A.col(3).array() * A.col(2).array());\n\n  theta = cos_theta.array().acos();\n\n  cos_theta.resize(m,6);\n\n}\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::dihedral_angles_intrinsic<Eigen::Matrix<double, -1, 6, 0, -1, 6>, Eigen::Matrix<double, -1, 4, 0, -1, 4>, Eigen::Matrix<double, -1, 6, 0, -1, 6>, Eigen::Matrix<double, -1, 6, 0, -1, 6> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 6, 0, -1, 6> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 4, 0, -1, 4> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 6, 0, -1, 6> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 6, 0, -1, 6> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/dihedral_angles.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_DIHEDRAL_ANGLES_H\n#define IGL_DIHEDRAL_ANGLES_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // DIHEDRAL_ANGLES Compute dihedral angles for all tets of a given tet mesh\n  // (V,T)\n  //\n  // theta = dihedral_angles(V,T)\n  // theta = dihedral_angles(V,T,'ParameterName',parameter_value,...)\n  //\n  // Inputs:\n  //   V  #V by dim list of vertex positions\n  //   T  #V by 4 list of tet indices\n  // Outputs:\n  //   theta  #T by 6 list of dihedral angles (in radians)\n  //   cos_theta  #T by 6 list of cosine of dihedral angles (in radians)\n  //\n  template <\n    typename DerivedV, \n    typename DerivedT, \n    typename Derivedtheta,\n    typename Derivedcos_theta>\n  IGL_INLINE void dihedral_angles(\n    Eigen::PlainObjectBase<DerivedV>& V,\n    Eigen::PlainObjectBase<DerivedT>& T,\n    Eigen::PlainObjectBase<Derivedtheta>& theta,\n    Eigen::PlainObjectBase<Derivedcos_theta>& cos_theta);\n  template <\n    typename DerivedL, \n    typename DerivedA, \n    typename Derivedtheta,\n    typename Derivedcos_theta>\n  IGL_INLINE void dihedral_angles_intrinsic(\n    Eigen::PlainObjectBase<DerivedL>& L,\n    Eigen::PlainObjectBase<DerivedA>& A,\n    Eigen::PlainObjectBase<Derivedtheta>& theta,\n    Eigen::PlainObjectBase<Derivedcos_theta>& cos_theta);\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"dihedral_angles.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/dijkstra.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include <igl/dijkstra.h>\n\ntemplate <typename IndexType, typename DerivedD, typename DerivedP>\nIGL_INLINE int igl::dijkstra_compute_paths(const IndexType &source,\n                                           const std::set<IndexType> &targets,\n                                           const std::vector<std::vector<IndexType> >& VV,\n                                           Eigen::PlainObjectBase<DerivedD> &min_distance,\n                                           Eigen::PlainObjectBase<DerivedP> &previous)\n{\n  int numV = VV.size();\n  min_distance.setConstant(numV, 1, std::numeric_limits<typename DerivedD::Scalar>::infinity());\n  min_distance[source] = 0;\n  previous.setConstant(numV, 1, -1);\n  std::set<std::pair<typename DerivedD::Scalar, IndexType> > vertex_queue;\n  vertex_queue.insert(std::make_pair(min_distance[source], source));\n\n  while (!vertex_queue.empty())\n  {\n    typename DerivedD::Scalar dist = vertex_queue.begin()->first;\n    IndexType u = vertex_queue.begin()->second;\n    vertex_queue.erase(vertex_queue.begin());\n\n    if (targets.find(u)!= targets.end())\n      return u;\n\n    // Visit each edge exiting u\n    const std::vector<int> &neighbors = VV[u];\n    for (std::vector<int>::const_iterator neighbor_iter = neighbors.begin();\n         neighbor_iter != neighbors.end();\n         neighbor_iter++)\n    {\n      IndexType v = *neighbor_iter;\n      typename DerivedD::Scalar distance_through_u = dist + 1.;\n      if (distance_through_u < min_distance[v]) {\n        vertex_queue.erase(std::make_pair(min_distance[v], v));\n\n        min_distance[v] = distance_through_u;\n        previous[v] = u;\n        vertex_queue.insert(std::make_pair(min_distance[v], v));\n\n      }\n\n    }\n  }\n  //we should never get here\n  return -1;\n}\n\ntemplate <typename IndexType, typename DerivedP>\nIGL_INLINE void igl::dijkstra_get_shortest_path_to(const IndexType &vertex,\n                                                   const Eigen::PlainObjectBase<DerivedP> &previous,\n                                                   std::vector<IndexType> &path)\n{\n  IndexType source = vertex;\n  path.clear();\n  for ( ; source != -1; source = previous[source])\n    path.push_back(source);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate int igl::dijkstra_compute_paths<int, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(int const&, std::set<int, std::less<int>, std::allocator<int> > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::dijkstra_get_shortest_path_to<int, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(int const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, std::vector<int, std::allocator<int> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/dijkstra.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2015 Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_DIJKSTRA\n#define IGL_DIJKSTRA\n#include \"igl_inline.h\"\n\n#include <Eigen/Core>\n#include <vector>\n#include <set>\n\nnamespace igl {\n\n  // Dijstra's algorithm for shortest paths, with multiple targets.\n  // Adapted from http://rosettacode.org/wiki/Dijkstra%27s_algorithm .\n  //\n  // Inputs:\n  //   source           index of source vertex\n  //   targets          target vector set\n  //   VV               #V list of lists of incident vertices (adjacency list), e.g.\n  //                    as returned by igl::adjacency_list\n  //\n  // Output:\n  //   min_distance     #V by 1 list of the minimum distances from source to all vertices\n  //   previous         #V by 1 list of the previous visited vertices (for each vertex) - used for backtracking\n  //\n  template <typename IndexType, typename DerivedD, typename DerivedP>\n  IGL_INLINE int dijkstra_compute_paths(const IndexType &source,\n                                        const std::set<IndexType> &targets,\n                                        const std::vector<std::vector<IndexType> >& VV,\n                                        Eigen::PlainObjectBase<DerivedD> &min_distance,\n                                        Eigen::PlainObjectBase<DerivedP> &previous);\n\n  // Backtracking after Dijstra's algorithm, to find shortest path.\n  //\n  // Inputs:\n  //   vertex           vertex to which we want the shortest path (from same source as above)\n  //   previous         #V by 1 list of the previous visited vertices (for each vertex) - result of Dijkstra's algorithm\n  //\n  // Output:\n  //   path             #P by 1 list of vertex indices in the shortest path from source to vertex\n  //\n  template <typename IndexType, typename DerivedP>\n  IGL_INLINE void dijkstra_get_shortest_path_to(const IndexType &vertex,\n                                                const Eigen::PlainObjectBase<DerivedP> &previous,\n                                                std::vector<IndexType> &path);\n};\n\n\n#ifndef IGL_STATIC_LIBRARY\n#include \"dijkstra.cpp\"\n#endif\n\n\n#endif /* defined(IGL_DIJKSTRA) */\n"
  },
  {
    "path": "libs/libigl/include/igl/directed_edge_orientations.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"directed_edge_orientations.h\"\n\ntemplate <typename DerivedC, typename DerivedE>\nIGL_INLINE void igl::directed_edge_orientations(\n  const Eigen::PlainObjectBase<DerivedC> & C,\n  const Eigen::PlainObjectBase<DerivedE> & E,\n  std::vector<\n      Eigen::Quaterniond,Eigen::aligned_allocator<Eigen::Quaterniond> > & Q)\n{\n  using namespace Eigen;\n  Q.resize(E.rows());\n  for(int e = 0;e<E.rows();e++)\n  {\n    const auto & b = C.row(E(e,1)) - C.row(E(e,0));\n    Q[e].setFromTwoVectors( RowVector3d(1,0,0),b);\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::directed_edge_orientations<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<Eigen::Quaternion<double, 0>, Eigen::aligned_allocator<Eigen::Quaternion<double, 0> > >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/directed_edge_orientations.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_DIRECTED_EDGE_ORIENTATIONS_H\n#define IGL_DIRECTED_EDGE_ORIENTATIONS_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Core>\n#include <Eigen/Geometry>\n#include <Eigen/StdVector>\n#include <vector>\n\nnamespace igl\n{\n  // Determine rotations that take each edge from the x-axis to its given rest\n  // orientation.\n  //\n  // Inputs:\n  //   C  #C by 3 list of edge vertex positions\n  //   E  #E by 2 list of directed edges\n  // Outputs:\n  //   Q  #E list of quaternions \n  //\n  template <typename DerivedC, typename DerivedE>\n  IGL_INLINE void directed_edge_orientations(\n    const Eigen::PlainObjectBase<DerivedC> & C,\n    const Eigen::PlainObjectBase<DerivedE> & E,\n    std::vector<\n      Eigen::Quaterniond,Eigen::aligned_allocator<Eigen::Quaterniond> > & Q);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"directed_edge_orientations.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/directed_edge_parents.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"directed_edge_parents.h\"\n#include \"slice_into.h\"\n#include \"slice.h\"\n#include \"colon.h\"\n#include \"setdiff.h\"\n#include <algorithm>\n\ntemplate <typename DerivedE, typename DerivedP>\nIGL_INLINE void igl::directed_edge_parents(\n  const Eigen::PlainObjectBase<DerivedE> & E,\n  Eigen::PlainObjectBase<DerivedP> & P)\n{\n  using namespace Eigen;\n  using namespace std;\n  VectorXi I = VectorXi::Constant(E.maxCoeff()+1,1,-1);\n  //I(E.col(1)) = 0:E.rows()-1\n  slice_into(colon<int>(0,E.rows()-1),E.col(1).eval(),I);\n  VectorXi roots,_;\n  setdiff(E.col(0).eval(),E.col(1).eval(),roots,_);\n  std::for_each(roots.data(),roots.data()+roots.size(),[&](int r){I(r)=-1;});\n  slice(I,E.col(0).eval(),P);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::directed_edge_parents<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/directed_edge_parents.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_DIRECTED_EDGE_PARENTS_H\n#define IGL_DIRECTED_EDGE_PARENTS_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Dense>\n\nnamespace igl\n{\n  // Recover \"parents\" (preceeding edges) in a tree given just directed edges.\n  //\n  // Inputs:\n  //   E  #E by 2 list of directed edges\n  // Outputs:\n  //   P  #E list of parent indices into E (-1) means root\n  //\n  template <typename DerivedE, typename DerivedP>\n  IGL_INLINE void directed_edge_parents(\n    const Eigen::PlainObjectBase<DerivedE> & E,\n    Eigen::PlainObjectBase<DerivedP> & P);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"directed_edge_parents.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/dirname.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"dirname.h\"\n\n#include <algorithm>\n#include \"verbose.h\"\n\nIGL_INLINE std::string igl::dirname(const std::string & path)\n{\n  if(path == \"\")\n  {\n    return std::string(\"\");\n  }\n  // http://stackoverflow.com/questions/5077693/dirnamephp-similar-function-in-c\n  std::string::const_reverse_iterator last_slash =\n    std::find(\n      path.rbegin(), \n      path.rend(), '/');\n  if( last_slash == path.rend() )\n  {\n    // No slashes found\n    return std::string(\".\");\n  }else if(1 == (last_slash.base() - path.begin()))\n  {\n    // Slash is first char\n    return std::string(\"/\");\n  }else if(path.end() == last_slash.base() )\n  {\n    // Slash is last char\n    std::string redo = std::string(path.begin(),path.end()-1);\n    return igl::dirname(redo);\n  }\n  return std::string(path.begin(),last_slash.base()-1);\n}\n\n"
  },
  {
    "path": "libs/libigl/include/igl/dirname.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_DIRNAME_H\n#define IGL_DIRNAME_H\n#include \"igl_inline.h\"\n\n#include <string>\n\nnamespace igl\n{\n  // Function like PHP's dirname: /etc/passwd --> /etc, \n  // Input:\n  //  path  string containing input path\n  // Returns string containing dirname (see php's dirname)\n  //\n  // See also: basename, pathinfo\n  IGL_INLINE std::string dirname(const std::string & path);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"dirname.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/dot.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"dot.h\"\n\n// http://www.antisphere.com/Wiki/tools:anttweakbar\nIGL_INLINE double igl::dot(\n  const double *a, \n  const double *b)\n{\n  return a[0]*b[0] + a[1]*b[1] + a[2]*b[2];\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/dot.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_DOT_H\n#define IGL_DOT_H\n#include \"igl_inline.h\"\nnamespace igl\n{\n  // Computes out = dot(a,b)\n  // Inputs:\n  //   a  left 3d vector\n  //   b  right 3d vector\n  // Returns scalar dot product\n  IGL_INLINE double dot(\n    const double *a, \n    const double *b);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"dot.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/dot_row.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"igl/dot_row.h\"\n\ntemplate <typename DerivedV>\nIGL_INLINE DerivedV igl::dot_row(\n  const Eigen::PlainObjectBase<DerivedV>& A,\n  const Eigen::PlainObjectBase<DerivedV>& B\n  )\n{\n  assert(A.rows() == B.rows());\n  assert(A.cols() == B.cols());\n\n  return (A.array() * B.array()).rowwise().sum();\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate Eigen::Matrix<double, -1, -1, 0, -1, -1> igl::dot_row<Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/dot_row.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_DOT_ROW_H\n#define IGL_DOT_ROW_H\n\n#include \"igl/igl_inline.h\"\n#include <Eigen/Core>\n\nnamespace igl\n{\n  // Compute the dot product between each row of A and B\n  // Templates:\n  //   DerivedV derived from vertex positions matrix type: i.e. MatrixXd\n  // Inputs:\n  //   A  eigen matrix r by c\n  //   B  eigen matrix r by c\n  // Returns:\n  //   d a column vector with r entries that contains the dot product of each corresponding row of A and B\n  //\n  template <typename DerivedV>\n  IGL_INLINE DerivedV dot_row(\n    const Eigen::PlainObjectBase<DerivedV>& A,\n    const Eigen::PlainObjectBase<DerivedV>& B);\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"dot_row.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/doublearea.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"doublearea.h\"\n#include \"edge_lengths.h\"\n#include \"parallel_for.h\"\n#include \"sort.h\"\n#include <cassert>\n#include <iostream>\n#include <limits>\n\ntemplate <typename DerivedV, typename DerivedF, typename DeriveddblA>\nIGL_INLINE void igl::doublearea(\n  const Eigen::MatrixBase<DerivedV> & V,\n  const Eigen::MatrixBase<DerivedF> & F,\n  Eigen::PlainObjectBase<DeriveddblA> & dblA)\n{\n  // quads are handled by a specialized function\n  if (F.cols() == 4) return doublearea_quad(V,F,dblA);\n\n  const int dim = V.cols();\n  // Only support triangles\n  assert(F.cols() == 3);\n  const size_t m = F.rows();\n  // Compute edge lengths\n  Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 3> l;\n\n  // Projected area helper\n  const auto & proj_doublearea =\n    [&V,&F](const int x, const int y, const int f)->double\n  {\n    auto rx = V(F(f,0),x)-V(F(f,2),x);\n    auto sx = V(F(f,1),x)-V(F(f,2),x);\n    auto ry = V(F(f,0),y)-V(F(f,2),y);\n    auto sy = V(F(f,1),y)-V(F(f,2),y);\n    return rx*sy - ry*sx;\n  };\n\n  switch(dim)\n  {\n    case 3:\n    {\n      dblA = DeriveddblA::Zero(m,1);\n      for(size_t f = 0;f<m;f++)\n      {\n        for(int d = 0;d<3;d++)\n        {\n          double dblAd = proj_doublearea(d,(d+1)%3,f);\n          dblA(f) += dblAd*dblAd;\n        }\n      }\n      dblA = dblA.array().sqrt().eval();\n      break;\n    }\n    case 2:\n    {\n      dblA.resize(m,1);\n      for(size_t f = 0;f<m;f++)\n      {\n        dblA(f) = proj_doublearea(0,1,f);\n      }\n      break;\n    }\n    default:\n    {\n      edge_lengths(V,F,l);\n      return doublearea(l,0.,dblA);\n    }\n  }\n}\n\n\ntemplate <\n  typename DerivedA,\n  typename DerivedB,\n  typename DerivedC,\n  typename DerivedD>\nIGL_INLINE void igl::doublearea(\n  const Eigen::MatrixBase<DerivedA> & A,\n  const Eigen::MatrixBase<DerivedB> & B,\n  const Eigen::MatrixBase<DerivedC> & C,\n  Eigen::PlainObjectBase<DerivedD> & D)\n{\n  assert((B.cols() == A.cols()) && \"dimensions of A and B should match\");\n  assert((C.cols() == A.cols()) && \"dimensions of A and C should match\");\n  assert(A.rows() == B.rows() && \"corners should have same length\");\n  assert(A.rows() == C.rows() && \"corners should have same length\");\n  switch(A.cols())\n  {\n    case 2:\n    {\n      // For 2d compute signed area\n      const auto & R = A-C;\n      const auto & S = B-C;\n      D = R.col(0).array()*S.col(1).array() - R.col(1).array()*S.col(0).array();\n      break;\n    }\n    default:\n    {\n      Eigen::Matrix<typename DerivedD::Scalar,DerivedD::RowsAtCompileTime,3>\n        uL(A.rows(),3);\n      uL.col(0) = (B-C).rowwise().norm();\n      uL.col(1) = (C-A).rowwise().norm();\n      uL.col(2) = (A-B).rowwise().norm();\n      doublearea(uL,D);\n    }\n  }\n}\n\ntemplate <\n  typename DerivedA,\n  typename DerivedB,\n  typename DerivedC>\nIGL_INLINE typename DerivedA::Scalar igl::doublearea_single(\n  const Eigen::MatrixBase<DerivedA> & A,\n  const Eigen::MatrixBase<DerivedB> & B,\n  const Eigen::MatrixBase<DerivedC> & C)\n{\n  assert(A.size() == 2 && \"Vertices should be 2D\");\n  assert(B.size() == 2 && \"Vertices should be 2D\");\n  assert(C.size() == 2 && \"Vertices should be 2D\");\n  auto r = A-C;\n  auto s = B-C;\n  return r(0)*s(1) - r(1)*s(0);\n}\n\ntemplate <typename Derivedl, typename DeriveddblA>\nIGL_INLINE void igl::doublearea(\n  const Eigen::MatrixBase<Derivedl> & ul,\n  Eigen::PlainObjectBase<DeriveddblA> & dblA)\n{\n  // Default is to leave NaNs and fire asserts in debug mode\n  return doublearea(\n    ul,std::numeric_limits<typename Derivedl::Scalar>::quiet_NaN(),dblA);\n}\n\ntemplate <typename Derivedl, typename DeriveddblA>\nIGL_INLINE void igl::doublearea(\n  const Eigen::MatrixBase<Derivedl> & ul,\n  const typename Derivedl::Scalar nan_replacement,\n  Eigen::PlainObjectBase<DeriveddblA> & dblA)\n{\n  using namespace Eigen;\n  using namespace std;\n  typedef typename Derivedl::Index Index;\n  // Only support triangles\n  assert(ul.cols() == 3);\n  // Number of triangles\n  const Index m = ul.rows();\n  Eigen::Matrix<typename Derivedl::Scalar, Eigen::Dynamic, 3> l;\n  MatrixXi _;\n  //\n  // \"Miscalculating Area and Angles of a Needle-like Triangle\"\n  // https://people.eecs.berkeley.edu/~wkahan/Triangle.pdf\n  igl::sort(ul,2,false,l,_);\n  // semiperimeters\n  //Matrix<typename Derivedl::Scalar,Dynamic,1> s = l.rowwise().sum()*0.5;\n  //assert((Index)s.rows() == m);\n  // resize output\n  dblA.resize(l.rows(),1);\n  parallel_for(\n    m,\n    [&l,&dblA,&nan_replacement](const int i)\n    {\n      // Kahan's Heron's formula\n      typedef typename Derivedl::Scalar Scalar;\n      const Scalar arg =\n        (l(i,0)+(l(i,1)+l(i,2)))*\n        (l(i,2)-(l(i,0)-l(i,1)))*\n        (l(i,2)+(l(i,0)-l(i,1)))*\n        (l(i,0)+(l(i,1)-l(i,2)));\n      dblA(i) = 2.0*0.25*sqrt(arg);\n      // Alec: If the input edge lengths were computed from floating point\n      // vertex positions then there's no guarantee that they fulfill the\n      // triangle inequality (in their floating point approximations). For\n      // nearly degenerate triangles the round-off error during side-length\n      // computation may be larger than (or rather smaller) than the height of\n      // the triangle. In \"Lecture Notes on Geometric Robustness\" Shewchuck 09,\n      // Section 3.1 http://www.cs.berkeley.edu/~jrs/meshpapers/robnotes.pdf,\n      // he recommends computing the triangle areas for 2D and 3D using 2D\n      // signed areas computed with determinants.\n      assert( \n        (nan_replacement == nan_replacement || \n          (l(i,2) - (l(i,0)-l(i,1)))>=0)\n          && \"Side lengths do not obey the triangle inequality.\");\n      if(dblA(i) != dblA(i))\n      {\n        dblA(i) = nan_replacement;\n      }\n      assert(dblA(i) == dblA(i) && \"DOUBLEAREA() PRODUCED NaN\");\n    },\n    1000l);\n}\n\ntemplate <typename DerivedV, typename DerivedF, typename DeriveddblA>\nIGL_INLINE void igl::doublearea_quad(\n  const Eigen::MatrixBase<DerivedV> & V,\n  const Eigen::MatrixBase<DerivedF> & F,\n  Eigen::PlainObjectBase<DeriveddblA> & dblA)\n{\n  assert(V.cols() == 3); // Only supports points in 3D\n  assert(F.cols() == 4); // Only support quads\n  const size_t m = F.rows();\n\n  // Split the quads into triangles\n  Eigen::MatrixXi Ft(F.rows()*2,3);\n\n  for(size_t i=0; i<m;++i)\n  {\n    Ft.row(i*2    ) << F(i,0), F(i,1), F(i,2);\n    Ft.row(i*2 + 1) << F(i,2), F(i,3), F(i,0);\n  }\n\n  // Compute areas\n  Eigen::VectorXd doublearea_tri;\n  igl::doublearea(V,Ft,doublearea_tri);\n\n  dblA.resize(F.rows(),1);\n  for(unsigned i=0; i<F.rows();++i)\n  {\n    dblA(i) = doublearea_tri(i*2) + doublearea_tri(i*2 + 1);\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::doublearea<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\ntemplate void igl::doublearea<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\ntemplate void igl::doublearea<Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<unsigned int, -1, 3, 1, -1, 3>, Eigen::Matrix<float, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<unsigned int, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 1, 0, -1, 1> >&);\ntemplate void igl::doublearea<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\ntemplate void igl::doublearea<Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\ntemplate void igl::doublearea<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\ntemplate void igl::doublearea<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\ntemplate void igl::doublearea<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\ntemplate void igl::doublearea<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::doublearea<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\ntemplate void igl::doublearea<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::doublearea<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::doublearea<Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix<double, 1, 1, 0, 1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 1, 0, 1, 1> >&);\ntemplate void igl::doublearea<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::doublearea<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::doublearea<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 3, 1, -1, 3>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\ntemplate Eigen::Matrix<double, -1, -1, 0, -1, -1>::Scalar igl::doublearea_single<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&);\ntemplate Eigen::Matrix<double, 2, 1, 0, 2, 1>::Scalar igl::doublearea_single<Eigen::Matrix<double, 2, 1, 0, 2, 1>, Eigen::Matrix<double, 2, 1, 0, 2, 1>, Eigen::Matrix<double, 2, 1, 0, 2, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, 2, 1, 0, 2, 1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, 2, 1, 0, 2, 1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, 2, 1, 0, 2, 1> > const&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/doublearea.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_DOUBLEAREA_H\n#define IGL_DOUBLEAREA_H\n#include \"igl_inline.h\"\n#include <Eigen/Dense>\nnamespace igl\n{\n  // DOUBLEAREA computes twice the area for each input triangle[quad]\n  //\n  // Templates:\n  //   DerivedV  derived type of eigen matrix for V (e.g. derived from\n  //     MatrixXd)\n  //   DerivedF  derived type of eigen matrix for F (e.g. derived from\n  //     MatrixXi)\n  //   DeriveddblA  derived type of eigen matrix for dblA (e.g. derived from\n  //     MatrixXd)\n  // Inputs:\n  //   V  #V by dim list of mesh vertex positions\n  //   F  #F by simplex_size list of mesh faces (must be triangles or quads)\n  // Outputs:\n  //   dblA  #F list of triangle[quad] double areas (SIGNED only for 2D input)\n  //\n  // Known bug: For dim==3 complexity is O(#V + #F)!! Not just O(#F). This is a big deal\n  // if you have 1million unreferenced vertices and 1 face\n  template <typename DerivedV, typename DerivedF, typename DeriveddblA>\n  IGL_INLINE void doublearea(\n    const Eigen::MatrixBase<DerivedV> & V,\n    const Eigen::MatrixBase<DerivedF> & F,\n    Eigen::PlainObjectBase<DeriveddblA> & dblA);\n  // Stream of triangles, computes signed area...\n  template <\n    typename DerivedA,\n    typename DerivedB,\n    typename DerivedC,\n    typename DerivedD>\n  IGL_INLINE void doublearea(\n    const Eigen::MatrixBase<DerivedA> & A,\n    const Eigen::MatrixBase<DerivedB> & B,\n    const Eigen::MatrixBase<DerivedC> & C,\n    Eigen::PlainObjectBase<DerivedD> & D);\n  // Single triangle in 2D!\n  //\n  // This should handle streams of corners not just single corners\n  template <\n    typename DerivedA,\n    typename DerivedB,\n    typename DerivedC>\n  IGL_INLINE typename DerivedA::Scalar doublearea_single(\n    const Eigen::MatrixBase<DerivedA> & A,\n    const Eigen::MatrixBase<DerivedB> & B,\n    const Eigen::MatrixBase<DerivedC> & C);\n  // Same as above but use instrinsic edge lengths rather than (V,F) mesh. This\n  //\n  // Inputs:\n  //   l  #F by dim list of edge lengths using\n  //     for triangles, columns correspond to edges 23,31,12\n  //   nan_replacement  what value should be used for triangles whose given\n  //     edge lengths do not obey the triangle inequality. These may be very\n  //     wrong (e.g., [100 1 1]) or may be nearly degenerate triangles whose\n  //     floating point side length computation leads to breach of the triangle\n  //     inequality. One may wish to set this parameter to 0 if side lengths l\n  //     are _known_ to come from a valid embedding (e.g., some mesh (V,F)). In\n  //     that case, the only circumstance the triangle inequality is broken is\n  //     when the triangle is nearly degenerate and floating point error\n  //     dominates: hence replacing with zero is reasonable.\n  // Outputs:\n  //   dblA  #F list of triangle double areas\n  template <typename Derivedl, typename DeriveddblA>\n  IGL_INLINE void doublearea(\n    const Eigen::MatrixBase<Derivedl> & l,\n    const typename Derivedl::Scalar nan_replacement,\n    Eigen::PlainObjectBase<DeriveddblA> & dblA);\n  // default behavior is to assert on NaNs and leave them in place\n  template <typename Derivedl, typename DeriveddblA>\n  IGL_INLINE void doublearea(\n    const Eigen::MatrixBase<Derivedl> & l,\n    Eigen::PlainObjectBase<DeriveddblA> & dblA);\n  // DOUBLEAREA_QUAD computes twice the area for each input quadrilateral\n  //\n  // Inputs:\n  //   V  #V by dim list of mesh vertex positions\n  //   F  #F by simplex_size list of mesh faces (must be quadrilaterals)\n  // Outputs:\n  //   dblA  #F list of quadrilateral double areas\n  //\n  template <typename DerivedV, typename DerivedF, typename DeriveddblA>\n  IGL_INLINE void doublearea_quad(\n  const Eigen::MatrixBase<DerivedV> & V,\n  const Eigen::MatrixBase<DerivedF> & F,\n  Eigen::PlainObjectBase<DeriveddblA> & dblA);\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"doublearea.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/dqs.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"dqs.h\"\n#include <Eigen/Geometry>\ntemplate <\n  typename DerivedV,\n  typename DerivedW,\n  typename Q,\n  typename QAlloc,\n  typename T,\n  typename DerivedU>\nIGL_INLINE void igl::dqs(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedW> & W,\n  const std::vector<Q,QAlloc> & vQ,\n  const std::vector<T> & vT,\n  Eigen::PlainObjectBase<DerivedU> & U)\n{\n  using namespace std;\n  assert(V.rows() <= W.rows());\n  assert(W.cols() == (int)vQ.size());\n  assert(W.cols() == (int)vT.size());\n  // resize output\n  U.resizeLike(V);\n\n  // Convert quats + trans into dual parts\n  vector<Q> vD(vQ.size());\n  for(int c = 0;c<W.cols();c++)\n  {\n    const Q & q = vQ[c];\n    vD[c].w() = -0.5*( vT[c](0)*q.x() + vT[c](1)*q.y() + vT[c](2)*q.z());\n    vD[c].x() =  0.5*( vT[c](0)*q.w() + vT[c](1)*q.z() - vT[c](2)*q.y());\n    vD[c].y() =  0.5*(-vT[c](0)*q.z() + vT[c](1)*q.w() + vT[c](2)*q.x());\n    vD[c].z() =  0.5*( vT[c](0)*q.y() - vT[c](1)*q.x() + vT[c](2)*q.w());\n  }\n\n  // Loop over vertices\n  const int nv = V.rows();\n#pragma omp parallel for if (nv>10000)\n  for(int i = 0;i<nv;i++)\n  {\n    Q b0(0,0,0,0);\n    Q be(0,0,0,0);\n    // Loop over handles\n    for(int c = 0;c<W.cols();c++)\n    {\n      b0.coeffs() += W(i,c) * vQ[c].coeffs();\n      be.coeffs() += W(i,c) * vD[c].coeffs();\n    }\n    Q ce = be;\n    ce.coeffs() /= b0.norm();\n    Q c0 = b0;\n    c0.coeffs() /= b0.norm();\n    // See algorithm 1 in \"Geometric skinning with approximate dual quaternion\n    // blending\" by Kavan et al\n    T v = V.row(i);\n    T d0 = c0.vec();\n    T de = ce.vec();\n    typename Q::Scalar a0 = c0.w();\n    typename Q::Scalar ae = ce.w();\n    U.row(i) =  v + 2*d0.cross(d0.cross(v) + a0*v) + 2*(a0*de - ae*d0 + d0.cross(de));\n  }\n\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::dqs<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Quaternion<double, 0>, Eigen::aligned_allocator<Eigen::Quaternion<double, 0> >, Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, std::vector<Eigen::Quaternion<double, 0>, Eigen::aligned_allocator<Eigen::Quaternion<double, 0> > > const&, std::vector<Eigen::Matrix<double, 3, 1, 0, 3, 1>, std::allocator<Eigen::Matrix<double, 3, 1, 0, 3, 1> > > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/dqs.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_DQS_H\n#define IGL_DQS_H\n#include \"igl_inline.h\"\n#include <vector>\n#include <Eigen/Core>\nnamespace igl\n{\n  // Dual quaternion skinning\n  //\n  // Inputs:\n  //   V  #V by 3 list of rest positions\n  //   W  #W by #C list of weights\n  //   vQ  #C list of rotation quaternions \n  //   vT  #C list of translation vectors\n  // Outputs:\n  //   U  #V by 3 list of new positions\n  template <\n    typename DerivedV,\n    typename DerivedW,\n    typename Q,\n    typename QAlloc,\n    typename T,\n    typename DerivedU>\n  IGL_INLINE void dqs(\n    const Eigen::PlainObjectBase<DerivedV> & V,\n    const Eigen::PlainObjectBase<DerivedW> & W,\n    const std::vector<Q,QAlloc> & vQ,\n    const std::vector<T> & vT,\n    Eigen::PlainObjectBase<DerivedU> & U);\n};\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"dqs.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/draw_beach_ball.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"draw_beach_ball.h\"\n#ifndef IGL_NO_OPENGL\n\n#include \"OpenGL_convenience.h\"\n\n// I'm not sure why windows would need it this way:\n// http://lists.cairographics.org/archives/cairo/2008-January/012722.html\n#ifdef _MSC_VER\n#define SAFE_INLINE __inline\n#else\n#define SAFE_INLINE inline\n#endif\n\n#include <vector>\n#include <cmath>\n#include <iostream>\n\n// Most of this implementation comes from the AntTweakBar source code:\n// TwMgr.cpp, TwMgr.h, TwColor.h, TwColor.cpp, TwOpenGL.h and TwOpenGL.cpp\n\n////////////////////////////////////////////////////////////////////////////\n// Begin Copied Straight from AntTweakBar\n////////////////////////////////////////////////////////////////////////////\nenum EArrowParts     { ARROW_CONE, ARROW_CONE_CAP, ARROW_CYL, ARROW_CYL_CAP };\n\ntemplate <typename T> SAFE_INLINE const T& TClamp(const T& X, const T& Limit1, const T& Limit2)\n{\n    if( Limit1<Limit2 )\n        return (X<=Limit1) ? Limit1 : ( (X>=Limit2) ? Limit2 : X );\n    else\n        return (X<=Limit2) ? Limit2 : ( (X>=Limit1) ? Limit1 : X );\n}\n\ntypedef unsigned int color32;\nstatic SAFE_INLINE color32 Color32FromARGBi(int A, int R, int G, int B)\n{\n    return (((color32)TClamp(A, 0, 255))<<24) | (((color32)TClamp(R, 0, 255))<<16) | (((color32)TClamp(G, 0, 255))<<8) | ((color32)TClamp(B, 0, 255));\n}\n\nstatic SAFE_INLINE color32 Color32FromARGBf(float A, float R, float G, float B)\n{\n    return (((color32)TClamp(A*256.0f, 0.0f, 255.0f))<<24) | (((color32)TClamp(R*256.0f, 0.0f, 255.0f))<<16) | (((color32)TClamp(G*256.0f, 0.0f, 255.0f))<<8) | ((color32)TClamp(B*256.0f, 0.0f, 255.0f));\n}\n\nstatic SAFE_INLINE void Color32ToARGBi(color32 Color, int *A, int *R, int *G, int *B)\n{\n    if(A) *A = (Color>>24)&0xff;\n    if(R) *R = (Color>>16)&0xff;\n    if(G) *G = (Color>>8)&0xff;\n    if(B) *B = Color&0xff;\n}\n\nstatic SAFE_INLINE void Color32ToARGBf(color32 Color, float *A, float *R, float *G, float *B)\n{\n    if(A) *A = (1.0f/255.0f)*float((Color>>24)&0xff);\n    if(R) *R = (1.0f/255.0f)*float((Color>>16)&0xff);\n    if(G) *G = (1.0f/255.0f)*float((Color>>8)&0xff);\n    if(B) *B = (1.0f/255.0f)*float(Color&0xff);\n}\n\nstatic color32 ColorBlend(color32 Color1, color32 Color2, float S)\n{\n    float a1, r1, g1, b1, a2, r2, g2, b2;\n    Color32ToARGBf(Color1, &a1, &r1, &g1, &b1);\n    Color32ToARGBf(Color2, &a2, &r2, &g2, &b2);\n    float t = 1.0f-S;\n    return Color32FromARGBf(t*a1+S*a2, t*r1+S*r2, t*g1+S*g2, t*b1+S*b2);\n}\n\nstatic std::vector<float>   s_SphTri;\nstatic std::vector<color32> s_SphCol;\nstatic void CreateSphere()\n{\n    const int SUBDIV = 7;\n    s_SphTri.clear();\n    s_SphCol.clear();\n\n    const float A[8*3] = { 1,0,0, 0,0,-1, -1,0,0, 0,0,1,   0,0,1,  1,0,0,  0,0,-1, -1,0,0 };\n    const float B[8*3] = { 0,1,0, 0,1,0,  0,1,0,  0,1,0,   0,-1,0, 0,-1,0, 0,-1,0, 0,-1,0 };\n    const float C[8*3] = { 0,0,1, 1,0,0,  0,0,-1, -1,0,0,  1,0,0,  0,0,-1, -1,0,0, 0,0,1  };\n    //const color32 COL_A[8] = { 0xffff8080, 0xff000080, 0xff800000, 0xff8080ff,  0xff8080ff, 0xffff8080, 0xff000080, 0xff800000 };\n    //const color32 COL_B[8] = { 0xff80ff80, 0xff80ff80, 0xff80ff80, 0xff80ff80,  0xff008000, 0xff008000, 0xff008000, 0xff008000 };\n    //const color32 COL_C[8] = { 0xff8080ff, 0xffff8080, 0xff000080, 0xff800000,  0xffff8080, 0xff000080, 0xff800000, 0xff8080ff };\n    const color32 COL_A[8] = { 0xffffffff, 0xffffff40, 0xff40ff40, 0xff40ffff,  0xffff40ff, 0xffff4040, 0xff404040, 0xff4040ff };\n    const color32 COL_B[8] = { 0xffffffff, 0xffffff40, 0xff40ff40, 0xff40ffff,  0xffff40ff, 0xffff4040, 0xff404040, 0xff4040ff };\n    const color32 COL_C[8] = { 0xffffffff, 0xffffff40, 0xff40ff40, 0xff40ffff,  0xffff40ff, 0xffff4040, 0xff404040, 0xff4040ff };\n\n    int i, j, k, l;\n    float xa, ya, za, xb, yb, zb, xc, yc, zc, x, y, z, norm, u[3], v[3];\n    color32 col;\n    for( i=0; i<8; ++i )\n    {\n        xa = A[3*i+0]; ya = A[3*i+1]; za = A[3*i+2];\n        xb = B[3*i+0]; yb = B[3*i+1]; zb = B[3*i+2];\n        xc = C[3*i+0]; yc = C[3*i+1]; zc = C[3*i+2];\n        for( j=0; j<=SUBDIV; ++j )\n            for( k=0; k<=2*(SUBDIV-j); ++k )\n            {\n                if( k%2==0 )\n                {\n                    u[0] = ((float)j)/(SUBDIV+1);\n                    v[0] = ((float)(k/2))/(SUBDIV+1);\n                    u[1] = ((float)(j+1))/(SUBDIV+1);\n                    v[1] = ((float)(k/2))/(SUBDIV+1);\n                    u[2] = ((float)j)/(SUBDIV+1);\n                    v[2] = ((float)(k/2+1))/(SUBDIV+1);\n                }\n                else\n                {\n                    u[0] = ((float)j)/(SUBDIV+1);\n                    v[0] = ((float)(k/2+1))/(SUBDIV+1);\n                    u[1] = ((float)(j+1))/(SUBDIV+1);\n                    v[1] = ((float)(k/2))/(SUBDIV+1);\n                    u[2] = ((float)(j+1))/(SUBDIV+1);\n                    v[2] = ((float)(k/2+1))/(SUBDIV+1);\n                }\n\n                for( l=0; l<3; ++l )\n                {\n                    x = (1.0f-u[l]-v[l])*xa + u[l]*xb + v[l]*xc;\n                    y = (1.0f-u[l]-v[l])*ya + u[l]*yb + v[l]*yc;\n                    z = (1.0f-u[l]-v[l])*za + u[l]*zb + v[l]*zc;\n                    norm = sqrtf(x*x+y*y+z*z);\n                    x /= norm; y /= norm; z /= norm;\n                    s_SphTri.push_back(x); s_SphTri.push_back(y); s_SphTri.push_back(z);\nstatic const float  FLOAT_EPS     = 1.0e-7f;\n                    if( u[l]+v[l]>FLOAT_EPS )\n                        col = ColorBlend(COL_A[i], ColorBlend(COL_B[i], COL_C[i], v[l]/(u[l]+v[l])), u[l]+v[l]);\n                    else\n                        col = COL_A[i];\n                    //if( (j==0 && k==0) || (j==0 && k==2*SUBDIV) || (j==SUBDIV && k==0) )\n                    //  col = 0xffff0000;\n                    s_SphCol.push_back(col);\n                }\n            }\n    }\n    //s_SphTriProj.clear();\n    //s_SphTriProj.resize(2*s_SphCol.size(), 0);\n    //s_SphColLight.clear();\n    //s_SphColLight.resize(s_SphCol.size(), 0);\n}\n\nstatic std::vector<float> s_ArrowTri[4];\nstatic std::vector<float> s_ArrowNorm[4];\nstatic void CreateArrow()\n{\n    const int   SUBDIV  = 15;\n    const float CYL_RADIUS  = 0.08f;\n    const float CONE_RADIUS = 0.16f;\n    const float CONE_LENGTH = 0.25f;\n    const float ARROW_BGN = -1.1f;\n    const float ARROW_END = 1.15f;\n    int i;\n    for(i=0; i<4; ++i)\n    {\n        s_ArrowTri[i].clear();\n        s_ArrowNorm[i].clear();\n    }\n    \n    float x0, x1, y0, y1, z0, z1, a0, a1, nx, nn;\n    for(i=0; i<SUBDIV; ++i)\n    {\nstatic const float  FLOAT_PI      = 3.14159265358979323846f;\n        a0 = 2.0f*FLOAT_PI*(float(i))/SUBDIV;\n        a1 = 2.0f*FLOAT_PI*(float(i+1))/SUBDIV;\n        x0 = ARROW_BGN;\n        x1 = ARROW_END-CONE_LENGTH;\n        y0 = cosf(a0);\n        z0 = sinf(a0);\n        y1 = cosf(a1);\n        z1 = sinf(a1);\n        s_ArrowTri[ARROW_CYL].push_back(x1); s_ArrowTri[ARROW_CYL].push_back(CYL_RADIUS*y0); s_ArrowTri[ARROW_CYL].push_back(CYL_RADIUS*z0);\n        s_ArrowTri[ARROW_CYL].push_back(x0); s_ArrowTri[ARROW_CYL].push_back(CYL_RADIUS*y0); s_ArrowTri[ARROW_CYL].push_back(CYL_RADIUS*z0);\n        s_ArrowTri[ARROW_CYL].push_back(x0); s_ArrowTri[ARROW_CYL].push_back(CYL_RADIUS*y1); s_ArrowTri[ARROW_CYL].push_back(CYL_RADIUS*z1);\n        s_ArrowTri[ARROW_CYL].push_back(x1); s_ArrowTri[ARROW_CYL].push_back(CYL_RADIUS*y0); s_ArrowTri[ARROW_CYL].push_back(CYL_RADIUS*z0);\n        s_ArrowTri[ARROW_CYL].push_back(x0); s_ArrowTri[ARROW_CYL].push_back(CYL_RADIUS*y1); s_ArrowTri[ARROW_CYL].push_back(CYL_RADIUS*z1);\n        s_ArrowTri[ARROW_CYL].push_back(x1); s_ArrowTri[ARROW_CYL].push_back(CYL_RADIUS*y1); s_ArrowTri[ARROW_CYL].push_back(CYL_RADIUS*z1);\n        s_ArrowNorm[ARROW_CYL].push_back(0); s_ArrowNorm[ARROW_CYL].push_back(y0); s_ArrowNorm[ARROW_CYL].push_back(z0);\n        s_ArrowNorm[ARROW_CYL].push_back(0); s_ArrowNorm[ARROW_CYL].push_back(y0); s_ArrowNorm[ARROW_CYL].push_back(z0);\n        s_ArrowNorm[ARROW_CYL].push_back(0); s_ArrowNorm[ARROW_CYL].push_back(y1); s_ArrowNorm[ARROW_CYL].push_back(z1);\n        s_ArrowNorm[ARROW_CYL].push_back(0); s_ArrowNorm[ARROW_CYL].push_back(y0); s_ArrowNorm[ARROW_CYL].push_back(z0);\n        s_ArrowNorm[ARROW_CYL].push_back(0); s_ArrowNorm[ARROW_CYL].push_back(y1); s_ArrowNorm[ARROW_CYL].push_back(z1);\n        s_ArrowNorm[ARROW_CYL].push_back(0); s_ArrowNorm[ARROW_CYL].push_back(y1); s_ArrowNorm[ARROW_CYL].push_back(z1);\n        s_ArrowTri[ARROW_CYL_CAP].push_back(x0); s_ArrowTri[ARROW_CYL_CAP].push_back(0); s_ArrowTri[ARROW_CYL_CAP].push_back(0);\n        s_ArrowTri[ARROW_CYL_CAP].push_back(x0); s_ArrowTri[ARROW_CYL_CAP].push_back(CYL_RADIUS*y1); s_ArrowTri[ARROW_CYL_CAP].push_back(CYL_RADIUS*z1);\n        s_ArrowTri[ARROW_CYL_CAP].push_back(x0); s_ArrowTri[ARROW_CYL_CAP].push_back(CYL_RADIUS*y0); s_ArrowTri[ARROW_CYL_CAP].push_back(CYL_RADIUS*z0);\n        s_ArrowNorm[ARROW_CYL_CAP].push_back(-1); s_ArrowNorm[ARROW_CYL_CAP].push_back(0); s_ArrowNorm[ARROW_CYL_CAP].push_back(0);\n        s_ArrowNorm[ARROW_CYL_CAP].push_back(-1); s_ArrowNorm[ARROW_CYL_CAP].push_back(0); s_ArrowNorm[ARROW_CYL_CAP].push_back(0);\n        s_ArrowNorm[ARROW_CYL_CAP].push_back(-1); s_ArrowNorm[ARROW_CYL_CAP].push_back(0); s_ArrowNorm[ARROW_CYL_CAP].push_back(0);\n        x0 = ARROW_END-CONE_LENGTH;\n        x1 = ARROW_END;\n        nx = CONE_RADIUS/(x1-x0);\n        nn = 1.0f/sqrtf(nx*nx+1);\n        s_ArrowTri[ARROW_CONE].push_back(x1); s_ArrowTri[ARROW_CONE].push_back(0); s_ArrowTri[ARROW_CONE].push_back(0);\n        s_ArrowTri[ARROW_CONE].push_back(x0); s_ArrowTri[ARROW_CONE].push_back(CONE_RADIUS*y0); s_ArrowTri[ARROW_CONE].push_back(CONE_RADIUS*z0);\n        s_ArrowTri[ARROW_CONE].push_back(x0); s_ArrowTri[ARROW_CONE].push_back(CONE_RADIUS*y1); s_ArrowTri[ARROW_CONE].push_back(CONE_RADIUS*z1);\n        s_ArrowTri[ARROW_CONE].push_back(x1); s_ArrowTri[ARROW_CONE].push_back(0); s_ArrowTri[ARROW_CONE].push_back(0);\n        s_ArrowTri[ARROW_CONE].push_back(x0); s_ArrowTri[ARROW_CONE].push_back(CONE_RADIUS*y1); s_ArrowTri[ARROW_CONE].push_back(CONE_RADIUS*z1);\n        s_ArrowTri[ARROW_CONE].push_back(x1); s_ArrowTri[ARROW_CONE].push_back(0); s_ArrowTri[ARROW_CONE].push_back(0);\n        s_ArrowNorm[ARROW_CONE].push_back(nn*nx); s_ArrowNorm[ARROW_CONE].push_back(nn*y0); s_ArrowNorm[ARROW_CONE].push_back(nn*z0);\n        s_ArrowNorm[ARROW_CONE].push_back(nn*nx); s_ArrowNorm[ARROW_CONE].push_back(nn*y0); s_ArrowNorm[ARROW_CONE].push_back(nn*z0);\n        s_ArrowNorm[ARROW_CONE].push_back(nn*nx); s_ArrowNorm[ARROW_CONE].push_back(nn*y1); s_ArrowNorm[ARROW_CONE].push_back(nn*z1);\n        s_ArrowNorm[ARROW_CONE].push_back(nn*nx); s_ArrowNorm[ARROW_CONE].push_back(nn*y0); s_ArrowNorm[ARROW_CONE].push_back(nn*z0);\n        s_ArrowNorm[ARROW_CONE].push_back(nn*nx); s_ArrowNorm[ARROW_CONE].push_back(nn*y1); s_ArrowNorm[ARROW_CONE].push_back(nn*z1);\n        s_ArrowNorm[ARROW_CONE].push_back(nn*nx); s_ArrowNorm[ARROW_CONE].push_back(nn*y1); s_ArrowNorm[ARROW_CONE].push_back(nn*z1);\n        s_ArrowTri[ARROW_CONE_CAP].push_back(x0); s_ArrowTri[ARROW_CONE_CAP].push_back(0); s_ArrowTri[ARROW_CONE_CAP].push_back(0);\n        s_ArrowTri[ARROW_CONE_CAP].push_back(x0); s_ArrowTri[ARROW_CONE_CAP].push_back(CONE_RADIUS*y1); s_ArrowTri[ARROW_CONE_CAP].push_back(CONE_RADIUS*z1);\n        s_ArrowTri[ARROW_CONE_CAP].push_back(x0); s_ArrowTri[ARROW_CONE_CAP].push_back(CONE_RADIUS*y0); s_ArrowTri[ARROW_CONE_CAP].push_back(CONE_RADIUS*z0);\n        s_ArrowNorm[ARROW_CONE_CAP].push_back(-1); s_ArrowNorm[ARROW_CONE_CAP].push_back(0); s_ArrowNorm[ARROW_CONE_CAP].push_back(0);\n        s_ArrowNorm[ARROW_CONE_CAP].push_back(-1); s_ArrowNorm[ARROW_CONE_CAP].push_back(0); s_ArrowNorm[ARROW_CONE_CAP].push_back(0);\n        s_ArrowNorm[ARROW_CONE_CAP].push_back(-1); s_ArrowNorm[ARROW_CONE_CAP].push_back(0); s_ArrowNorm[ARROW_CONE_CAP].push_back(0);\n    }\n\n    //for(i=0; i<4; ++i)\n    //{\n    //    s_ArrowTriProj[i].clear();\n    //    s_ArrowTriProj[i].resize(2*(s_ArrowTri[i].size()/3), 0);\n    //    s_ArrowColLight[i].clear();\n    //    s_ArrowColLight[i].resize(s_ArrowTri[i].size()/3, 0);\n    //}\n}\n\n////////////////////////////////////////////////////////////////////////////\n// End Copied Straight from AntTweakBar\n////////////////////////////////////////////////////////////////////////////\n\nIGL_INLINE void igl::draw_beach_ball()\n{\n  using namespace std;\n\n  CreateSphere();\n  // Keep track of opengl settings\n  int cm;\n  glGetIntegerv(GL_COLOR_MATERIAL,&cm);\n  // Draw triangles\n  glEnable(GL_COLOR_MATERIAL);\n  glColorMaterial(GL_FRONT_AND_BACK,GL_DIFFUSE);\n  float mat_ambient[4] = {0.1,0.1,0.1,1.0};\n  float mat_specular[4] = {0.0,0.0,0.0,1.0};\n  float mat_shininess = 1;\n  glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT,  mat_ambient);\n  glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);\n  glMaterialf( GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);\n\n  glPushMatrix();\n  glScalef(0.7,0.7,0.7);\n  glEnable(GL_NORMALIZE);\n  glBegin(GL_TRIANGLES);\n  for(int i = 0;i<(int)s_SphCol.size();i++)\n  {\n    glNormal3fv(&s_SphTri[i*3]);\n    glColor4ub(GLubyte(s_SphCol[i]>>16), GLubyte(s_SphCol[i]>>8), GLubyte(s_SphCol[i]), GLubyte(s_SphCol[i]>>24));\n    glVertex3fv(&s_SphTri[i*3]);\n  }\n  glEnd();\n  glPopMatrix();\n\n  CreateArrow();\n  for(int k = 0;k<3;k++)\n  {\n    glPushMatrix();\n    glColor3f(k==0,k==1,k==2);\n    glRotatef((k==2?-1.0:1.0)*90,k==0,k==2,k==1);\n    glBegin(GL_TRIANGLES);\n    for(int j = 0;j<4;j++)\n    {\n      for(int i = 0;i<(int)s_ArrowTri[j].size();i+=3)\n      {\n        glNormal3fv(&s_ArrowNorm[j][i]);\n        glVertex3fv(&s_ArrowTri[j][i]);\n      }\n    }\n    glEnd();\n    glPopMatrix();\n  }\n\n  (cm ? glEnable(GL_COLOR_MATERIAL):glDisable(GL_COLOR_MATERIAL));\n}\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/draw_beach_ball.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_DRAW_BEACH_BALL_H\n#define IGL_DRAW_BEACH_BALL_H\n#ifndef IGL_NO_OPENGL\n#include \"igl_inline.h\"\n\nnamespace igl\n{\n  // Draw a beach ball icon/glyph (from AntTweakBar) at the current origin\n  // according to the current orientation: ball has radius 0.75 and axis have\n  // length 1.15\n  IGL_INLINE void draw_beach_ball();\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"draw_beach_ball.cpp\"\n#endif\n\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/draw_floor.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"draw_floor.h\"\n#ifndef IGL_NO_OPENGL\n\n#include \"OpenGL_convenience.h\"\n\nIGL_INLINE void igl::draw_floor(const float * colorA, const float * colorB,\n  const int GridSizeX,\n  const int GridSizeY)\n{\n  const float SizeX = 0.5f*100./(double)GridSizeX;\n  const float SizeY = 0.5f*100./(double)GridSizeY;\n  // old settings\n  int old_lighting=0,old_color_material=0;\n  glGetIntegerv(GL_LIGHTING,&old_lighting);\n  glGetIntegerv(GL_COLOR_MATERIAL,&old_color_material);\n  glDisable(GL_LIGHTING);\n  glColorMaterial( GL_FRONT, GL_EMISSION);\n  glEnable(GL_COLOR_MATERIAL);\n  glColorMaterial( GL_FRONT, GL_AMBIENT_AND_DIFFUSE);\n  // Set material\n  const float black[] = {0.,0.,0.,1.};\n  glMaterialfv(GL_FRONT, GL_AMBIENT, black);\n  glMaterialfv(GL_FRONT, GL_DIFFUSE, black);\n  glMaterialfv(GL_FRONT, GL_SPECULAR, black);\n  glMaterialfv(GL_FRONT, GL_EMISSION, black);\n  glMaterialf(GL_FRONT, GL_SHININESS,0);\n  const bool use_lighting = false;\n  if(use_lighting)\n  {\n    glEnable(GL_LIGHTING);\n  }else\n  {\n    glDisable(GL_LIGHTING);\n  }\n\n\n  glBegin(GL_QUADS);\n  glNormal3f(0,1,0);\n  for (int x =-GridSizeX/2;x<GridSizeX/2;++x)\n  {\n    for (int y =-GridSizeY/2;y<GridSizeY/2;++y)\n    {\n      if ((x+y)&0x00000001) //modulo 2\n      {\n        glColor4fv(colorA);\n      }else\n      {\n        glColor4fv(colorB);\n      }\n      glVertex3f(    x*SizeX,0,(y+1)*SizeY);\n      glVertex3f((x+1)*SizeX,0,(y+1)*SizeY);\n      glVertex3f((x+1)*SizeX,0,    y*SizeY);\n      glVertex3f(    x*SizeX,0,    y*SizeY);\n    }\n  }\n  glEnd();\n\n  (old_lighting ? glEnable(GL_LIGHTING) : glDisable(GL_LIGHTING));\n  (old_color_material? glEnable(GL_COLOR_MATERIAL) : glDisable(GL_COLOR_MATERIAL));\n}\n\nIGL_INLINE void igl::draw_floor()\n{\n  const float grey[] = {0.80,0.80,0.80,1.};\n  const float white[] = {0.95,0.95,0.95,1.};\n  igl::draw_floor(grey,white);\n}\n\nIGL_INLINE void igl::draw_floor_outline(const float * colorA, const float * colorB,\n  const int GridSizeX,\n  const int GridSizeY)\n{\n  const float SizeX = 0.5f*100./(double)GridSizeX;\n  const float SizeY = 0.5f*100./(double)GridSizeY;\n  float old_line_width =0;\n  // old settings\n  int old_lighting=0,old_color_material=0;\n  glGetIntegerv(GL_LIGHTING,&old_lighting);\n  glGetIntegerv(GL_COLOR_MATERIAL,&old_color_material);\n  glDisable(GL_LIGHTING);\n\n  // Set material\n  const float black[] = {0.,0.,0.,1.};\n  glMaterialfv(GL_FRONT, GL_AMBIENT, black);\n  glMaterialfv(GL_FRONT, GL_DIFFUSE, black);\n  glMaterialfv(GL_FRONT, GL_SPECULAR, black);\n  glMaterialfv(GL_FRONT, GL_EMISSION, black);\n  glMaterialf(GL_FRONT, GL_SHININESS,0);\n  const bool use_lighting = false;\n  if(use_lighting)\n  {\n    glEnable(GL_LIGHTING);\n  }else\n  {\n    glDisable(GL_LIGHTING);\n  }\n\n  glLineWidth(2.0f);\n  glBegin(GL_LINES);\n  for (int x =-GridSizeX/2;x<=GridSizeX/2;++x)\n  {\n    if(x!=(GridSizeX/2))\n    {\n      for(int s = -1;s<2;s+=2)\n      {\n        int y = s*(GridSizeY/2);\n        int cy = y==(GridSizeY/2) ? y-1 : y;\n        if ((x+cy)&0x00000001) //modulo 2\n        {\n          glColor4fv(colorA);\n          //glColor3f(1,0,0);\n        }else\n        {\n          glColor4fv(colorB);\n          //glColor3f(0,0,1);\n        }\n        glVertex3f((x+1)*SizeX,0,y*SizeY);\n        glVertex3f(    x*SizeX,0,y*SizeY);\n      }\n    }\n    if(x==-(GridSizeX/2) || x==(GridSizeX/2))\n    {\n      int cx = x==(GridSizeX/2) ? x-1 : x;\n      for (int y =-GridSizeY/2;y<GridSizeY/2;++y)\n      {\n        if ((cx+y)&0x00000001) //modulo 2\n        {\n          glColor4fv(colorA);\n          //glColor3f(1,0,0);\n        }else\n        {\n          glColor4fv(colorB);\n          //glColor3f(0,0,1);\n        }\n        glVertex3f(x*SizeX,0,(y+1)*SizeY);\n        glVertex3f(x*SizeX,0,    y*SizeY);\n      }\n    }\n  }\n  glEnd();\n\n  glGetFloatv(GL_LINE_WIDTH,&old_line_width);\n  glLineWidth(old_line_width);\n  (old_lighting ? glEnable(GL_LIGHTING) : glDisable(GL_LIGHTING));\n  (old_color_material? glEnable(GL_COLOR_MATERIAL) : glDisable(GL_COLOR_MATERIAL));\n}\n\nIGL_INLINE void igl::draw_floor_outline()\n{\n  const float grey[] = {0.80,0.80,0.80,1.};\n  const float white[] = {0.95,0.95,0.95,1.};\n  igl::draw_floor_outline(grey,white);\n}\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/draw_floor.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_DRAW_FLOOR_H\n#define IGL_DRAW_FLOOR_H\n#ifndef IGL_NO_OPENGL\n#include \"igl_inline.h\"\nnamespace igl\n{\n  // Draw a checkerboard floor aligned with current (X,Z) plane using OpenGL\n  // calls. side=50 centered at (0,0):\n  //   (-25,-25)-->(-25,25)-->(25,25)-->(25,-25)\n  //\n  // Use glPushMatrix(), glScaled(), glTranslated() to arrange the floor.\n  // \n  // Inputs:\n  //   colorA  float4 color\n  //   colorB  float4 color\n  //\n  // Example:\n  //   // Draw a nice floor\n  //   glPushMatrix();\n  //   glCullFace(GL_BACK);\n  //   glEnable(GL_CULL_FACE);\n  //   glEnable(GL_LIGHTING);\n  //   glTranslated(0,-1,0);\n  //   if(project(Vector3d(0,0,0))(2) - project(Vector3d(0,1,0))(2) > -FLOAT_EPS)\n  //   {\n  //     draw_floor_outline();\n  //   }\n  //   draw_floor();\n  //   glPopMatrix();\n  //   glDisable(GL_CULL_FACE);\n  //\n  IGL_INLINE void draw_floor(\n    const float * colorA, \n    const float * colorB, \n    const int GridSizeX=100, \n    const int GridSizeY=100);\n  // Wrapper with default colors\n  IGL_INLINE void draw_floor();\n  IGL_INLINE void draw_floor_outline(\n    const float * colorA, \n    const float * colorB, \n    const int GridSizeX=100, \n    const int GridSizeY=100);\n  // Wrapper with default colors\n  IGL_INLINE void draw_floor_outline();\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"draw_floor.cpp\"\n#endif\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/draw_mesh.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"draw_mesh.h\"\n#ifndef IGL_NO_OPENGL\n\nIGL_INLINE void igl::draw_mesh(\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  const Eigen::MatrixXd & N)\n{\n  using namespace Eigen;\n  MatrixXd _d;\n  MatrixXi _i;\n  return draw_mesh(V,F,N,_i,_d,_d,_i,_d,0,_i,0);\n}\n\nIGL_INLINE void igl::draw_mesh(\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  const Eigen::MatrixXd & N,\n  const Eigen::MatrixXd & C)\n{\n  using namespace Eigen;\n  MatrixXd _d;\n  MatrixXi _i;\n  return draw_mesh(V,F,N,_i,C,_d,_i,_d,0,_i,0);\n}\n\nIGL_INLINE void igl::draw_mesh(\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  const Eigen::MatrixXd & N,\n  const Eigen::MatrixXd & C,\n  const Eigen::MatrixXd & TC)\n{\n  using namespace Eigen;\n  MatrixXd _d;\n  MatrixXi _i;\n  return draw_mesh(V,F,N,_i,C,TC,_i,_d,0,_i,0);\n}\n\nIGL_INLINE void igl::draw_mesh(\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  const Eigen::MatrixXd & N,\n  const Eigen::MatrixXd & C,\n  const Eigen::MatrixXd & TC,\n  const Eigen::MatrixXd & W,\n  const GLuint W_index,\n  const Eigen::MatrixXi & WI,\n  const GLuint WI_index)\n{\n  using namespace Eigen;\n  return draw_mesh(V,F,N,MatrixXi(),C,TC,MatrixXi(),W,W_index,WI,WI_index);\n}\n\nIGL_INLINE void igl::draw_mesh(\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  const Eigen::MatrixXd & N,\n  const Eigen::MatrixXi & NF,\n  const Eigen::MatrixXd & C,\n  const Eigen::MatrixXd & TC,\n  const Eigen::MatrixXi & TF,\n  const Eigen::MatrixXd & W,\n  const GLuint W_index,\n  const Eigen::MatrixXi & WI,\n  const GLuint WI_index)\n{\n  using namespace std;\n  using namespace Eigen;\n  const int rF = F.rows();\n  const int cF = F.cols();\n  const int cC = C.cols();\n  const int rC = C.rows();\n  const int cW = W.cols();\n  const int rW = W.rows();\n  const int rV = V.rows();\n  const int rTC = TC.rows();\n  const int rTF = TF.rows();\n  const int rNF = NF.rows();\n  const int rN = N.rows();\n\n  if(F.size() > 0)\n  {\n    assert(F.maxCoeff() < V.rows());\n    assert(V.cols() == 3);\n    assert(rC == rV || rC == rF || rC == rF*3 || rC==1 || C.size() == 0);\n    assert(C.cols() >= 3 || C.size() == 0);\n    assert(N.cols() == 3 || N.size() == 0);\n    assert(TC.cols() == 2 || TC.size() == 0);\n    assert(cF == 3 || cF == 4);\n    assert(TF.size() == 0 || TF.cols() == F.cols());\n    assert(NF.size() == 0 || NF.cols() == NF.cols());\n  }\n  if(W.size()>0)\n  {\n    assert(W.rows() == V.rows());\n    assert(WI.rows() == V.rows());\n    assert(W.cols() == WI.cols());\n  }\n\n  switch(F.cols())\n  {\n    default:\n    case 3:\n      glBegin(GL_TRIANGLES);\n      break;\n    case 4:\n      glBegin(GL_QUADS);\n      break;\n  }\n  // loop over faces\n  for(int i = 0; i<rF;i++)\n  {\n    // loop over corners of triangle\n    for(int j = 0;j<cF;j++)\n    {\n\n      int tc = -1;\n      if(rTF != 0)\n      {\n        tc = TF(i,j);\n      } else if(rTC == 1)\n      {\n        tc = 0;\n      }else if(rTC == rV)\n      {\n        tc = F(i,j);\n      }else if(rTC == rF*cF)\n      {\n        tc = i*cF + j;\n      }else if(rTC == rF)\n      {\n        tc = i;\n      }else\n      {\n        assert(TC.size() == 0);\n      }\n\n      // RGB(A)\n      Matrix<MatrixXd::Scalar,1,Dynamic> color;\n      if(rC == 1)\n      {\n        color = C.row(0);\n      }else if(rC == rV)\n      {\n        color = C.row(F(i,j));\n      }else if(rC == rF*cF)\n      {\n        color = C.row(i*cF+j);\n      }else if(rC == rF)\n      {\n        color = C.row(i);\n      }else\n      {\n        assert(C.size() == 0);\n      }\n\n      int n = -1;\n      if(rNF != 0)\n      {\n        n = NF(i,j); // indexed normals\n      } else if(rN == 1) \n      {\n        n = 0; // uniform normals\n      }else if(rN == rF)\n      {\n        n = i; // face normals\n      }else if(rN == rV)\n      {\n        n = F(i,j); // vertex normals\n      }else if(rN == rF*cF)\n      {\n        n = i*cF + j; // corner normals\n      }else\n      {\n        assert(N.size() == 0);\n      }\n\n      {\n        if(rW>0 && W_index !=0 && WI_index != 0)\n        {\n          int weights_left = cW;\n          while(weights_left != 0)\n          {\n            int pass_size = std::min(4,weights_left);\n            int weights_already_passed = cW-weights_left;\n            // Get attribute location of next 4 weights\n            int pass_W_index = W_index + weights_already_passed/4;\n            int pass_WI_index = WI_index + weights_already_passed/4;\n            switch(pass_size)\n            {\n              case 1:\n                glVertexAttrib1d(\n                  pass_W_index,\n                  W(F(i,j),0+weights_already_passed));\n                glVertexAttrib1d(\n                  pass_WI_index,\n                  WI(F(i,j),0+weights_already_passed));\n                break;\n              case 2:\n                glVertexAttrib2d(\n                  pass_W_index,\n                  W(F(i,j),0+weights_already_passed),\n                  W(F(i,j),1+weights_already_passed));\n                glVertexAttrib2d(\n                  pass_WI_index,\n                  WI(F(i,j),0+weights_already_passed),\n                  WI(F(i,j),1+weights_already_passed));\n                break;\n              case 3:\n                glVertexAttrib3d(\n                  pass_W_index,\n                  W(F(i,j),0+weights_already_passed),\n                  W(F(i,j),1+weights_already_passed),\n                  W(F(i,j),2+weights_already_passed));\n                glVertexAttrib3d(\n                  pass_WI_index,\n                  WI(F(i,j),0+weights_already_passed),\n                  WI(F(i,j),1+weights_already_passed),\n                  WI(F(i,j),2+weights_already_passed));\n                break;\n              default:\n                glVertexAttrib4d(\n                  pass_W_index,\n                  W(F(i,j),0+weights_already_passed),\n                  W(F(i,j),1+weights_already_passed),\n                  W(F(i,j),2+weights_already_passed),\n                  W(F(i,j),3+weights_already_passed));\n                glVertexAttrib4d(\n                  pass_WI_index,\n                  WI(F(i,j),0+weights_already_passed),\n                  WI(F(i,j),1+weights_already_passed),\n                  WI(F(i,j),2+weights_already_passed),\n                  WI(F(i,j),3+weights_already_passed));\n                break;\n            }\n            weights_left -= pass_size;\n          }\n        }\n        if(tc != -1)\n        {\n          glTexCoord2d(TC(tc,0),TC(tc,1));\n        }\n        if(rC>0)\n        {\n          switch(cC)\n          {\n            case 3:\n              glColor3dv(color.data());\n              break;\n            case 4:\n              glColor4dv(color.data());\n              break;\n            default:\n              break;\n          }\n        }\n        if(n != -1)\n        {\n          glNormal3d(N(n,0),N(n,1),N(n,2));\n        }\n        glVertex3d(V(F(i,j),0),V(F(i,j),1),V(F(i,j),2));\n      }\n    }\n  }\n  glEnd();\n}\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/draw_mesh.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_DRAW_MESH_H\n#define IGL_DRAW_MESH_H\n#ifndef IGL_NO_OPENGL\n#include \"igl_inline.h\"\n\n#include <Eigen/Dense>\n\n#include \"OpenGL_convenience.h\"\n\nnamespace igl\n{\n  // Draw OpenGL commands needed to display a mesh with normals\n  //\n  // Inputs:\n  //   V  #V by 3 eigen Matrix of mesh vertex 3D positions\n  //   F  #F by 3|4 eigen Matrix of face (triangle/quad) indices\n  //   N  #V|#F by 3 eigen Matrix of 3D normals\n  IGL_INLINE void draw_mesh(\n    const Eigen::MatrixXd & V,\n    const Eigen::MatrixXi & F,\n    const Eigen::MatrixXd & N);\n  \n  // Draw OpenGL commands needed to display a mesh with normals and per-vertex\n  // colors\n  //\n  // Inputs:\n  //   V  #V by 3 eigen Matrix of mesh vertex 3D positions\n  //   F  #F by 3|4 eigen Matrix of face (triangle/quad) indices\n  //   N  #V|#F by 3 eigen Matrix of 3D normals\n  //   C  #V|#F|1 by 3 eigen Matrix of RGB colors\n  IGL_INLINE void draw_mesh(\n    const Eigen::MatrixXd & V,\n    const Eigen::MatrixXi & F,\n    const Eigen::MatrixXd & N,\n    const Eigen::MatrixXd & C);\n  // Inputs:\n  //   V  #V by 3 eigen Matrix of mesh vertex 3D positions\n  //   F  #F by 3|4 eigen Matrix of face (triangle/quad) indices\n  //   N  #V|#F by 3 eigen Matrix of 3D normals\n  //   C  #V|#F|1 by 3 eigen Matrix of RGB colors\n  //   TC  #V|#F|1 by 3 eigen Matrix of Texture Coordinates\n  IGL_INLINE void draw_mesh(\n    const Eigen::MatrixXd & V,\n    const Eigen::MatrixXi & F,\n    const Eigen::MatrixXd & N,\n    const Eigen::MatrixXd & C,\n    const Eigen::MatrixXd & TC);\n  \n  // Draw OpenGL commands needed to display a mesh with normals, per-vertex\n  // colors and LBS weights\n  //\n  // Inputs:\n  //   V  #V by 3 eigen Matrix of mesh vertex 3D positions\n  //   F  #F by 3|4 eigen Matrix of face (triangle/quad) indices\n  //   N  #V by 3 eigen Matrix of mesh vertex 3D normals\n  //   C  #V by 3 eigen Matrix of mesh vertex RGB colors\n  //   TC  #V by 3 eigen Matrix of mesh vertex UC coorindates between 0 and 1\n  //   W  #V by #H eigen Matrix of per mesh vertex, per handle weights\n  //   W_index  Specifies the index of the \"weight\" vertex attribute: see\n  //     glBindAttribLocation, if W_index is 0 then weights are ignored\n  //   WI  #V by #H eigen Matrix of per mesh vertex, per handle weight ids\n  //   WI_index  Specifies the index of the \"weight\" vertex attribute: see\n  //     glBindAttribLocation, if WI_index is 0 then weight indices are ignored\n  IGL_INLINE void draw_mesh(\n    const Eigen::MatrixXd & V,\n    const Eigen::MatrixXi & F,\n    const Eigen::MatrixXd & N,\n    const Eigen::MatrixXd & C,\n    const Eigen::MatrixXd & TC,\n    const Eigen::MatrixXd & W,\n    const GLuint W_index,\n    const Eigen::MatrixXi & WI,\n    const GLuint WI_index);\n  \n  // Draw OpenGL commands needed to display a mesh with normals, per-vertex\n  // colors and LBS weights\n  //\n  // Inputs:\n  //   V  #V by 3 eigen Matrix of mesh vertex 3D positions\n  //   F  #F by 3|4 eigen Matrix of face (triangle/quad) indices\n  //   N  #V by 3 eigen Matrix of mesh vertex 3D normals\n  //   NF  #F by 3 eigen Matrix of face (triangle/quad) normal indices, <0\n  //     means no normal\n  //   C  #V by 3 eigen Matrix of mesh vertex RGB colors\n  //   TC  #V by 3 eigen Matrix of mesh vertex UC coorindates between 0 and 1\n  //   TF  #F by 3 eigen Matrix of face (triangle/quad) texture indices, <0\n  //     means no texture\n  //   W  #V by #H eigen Matrix of per mesh vertex, per handle weights\n  //   W_index  Specifies the index of the \"weight\" vertex attribute: see\n  //     glBindAttribLocation, if W_index is 0 then weights are ignored\n  //   WI  #V by #H eigen Matrix of per mesh vertex, per handle weight ids\n  //   WI_index  Specifies the index of the \"weight\" vertex attribute: see\n  //     glBindAttribLocation, if WI_index is 0 then weight indices are ignored\n  IGL_INLINE void draw_mesh(\n    const Eigen::MatrixXd & V,\n    const Eigen::MatrixXi & F,\n    const Eigen::MatrixXd & N,\n    const Eigen::MatrixXi & NF,\n    const Eigen::MatrixXd & C,\n    const Eigen::MatrixXd & TC,\n    const Eigen::MatrixXi & TF,\n    const Eigen::MatrixXd & W,\n    const GLuint W_index,\n    const Eigen::MatrixXi & WI,\n    const GLuint WI_index);\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"draw_mesh.cpp\"\n#endif\n\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/draw_point.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"draw_point.h\"\n#ifndef IGL_NO_OPENGL\n\n// Implementation\n#include \"OpenGL_convenience.h\"\n\n#include <cassert>\n#include <cmath>\n\nIGL_INLINE void igl::draw_point(\n  const double x,\n  const double y,\n  const double z,\n  const double requested_r,\n  const bool selected)\n{\n  // Push GL settings\n  glPushAttrib(GL_ENABLE_BIT | GL_LIGHTING_BIT);\n\n  float f;\n  glGetFloatv(GL_POINT_SIZE_MAX,&f);\n  // THIS IS OVERZEALOUS on Mac OS X: OpenGL reports a smaller point size than\n  // possible.\n  //assert(requested_r<=0.5*f);\n  double r = (requested_r<0.5*f?requested_r:0.5*f);\n\n  //glDisable(GL_DEPTH_TEST);\n  glDisable(GL_LIGHTING);\n\n  // get current color\n  float color[4];\n  glGetFloatv(GL_CURRENT_COLOR,color);\n\n  double outline_size = (r>7 ? sqrt(r/7.0) : 1.0);\n\n  // White outline\n  glColor4f(1,1,1,color[3]);\n  glPointSize(2*r);\n  glBegin(GL_POINTS);\n  glVertex3d(x,y,z);\n  glEnd();\n  // Black outline\n  glColor4f(0,0,0,color[3]);\n  glPointSize(2*r-2*outline_size);\n  glBegin(GL_POINTS);\n  glVertex3d(x,y,z);\n  glEnd();\n  \n  // Foreground\n  glColor4fv(color);\n  glPointSize(2*r-4*outline_size);\n  glBegin(GL_POINTS);\n  glVertex3d(x,y,z);\n  glEnd();\n  // Selection inner circle\n  if(selected)\n  {\n    glColor4f(0,0,0,color[3]);\n    double selected_size = 2*r-7*outline_size;\n    selected_size = (selected_size>3?selected_size:3);\n    glPointSize(selected_size);\n    glBegin(GL_POINTS);\n    glVertex3d(x,y,z);\n    glEnd();\n  }\n\n  // reset color\n  glColor4fv(color);\n\n  // Pop GL settings\n  glPopAttrib();\n}\n\ntemplate <typename DerivedP>\nIGL_INLINE void igl::draw_point(\n  const Eigen::PlainObjectBase<DerivedP> & P,\n  const double requested_r,\n  const bool selected)\n{\n  switch(P.size())\n  {\n    case 2:\n      return draw_point(P(0),P(1),0,requested_r,selected);\n    default:\n      return draw_point(P(0),P(1),P(2),requested_r,selected);\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\ntemplate void igl::draw_point<Eigen::Matrix<double, 3, 1, 0, 3, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 1, 0, 3, 1> > const&, double, bool);\ntemplate void igl::draw_point<Eigen::Matrix<double, 2, 1, 0, 2, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 1, 0, 2, 1> > const&, double, bool); \n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/draw_point.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_DRAW_POINT_H\n#define IGL_DRAW_POINT_H\n#ifndef IGL_NO_OPENGL\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  //double POINT_COLOR[3] = {239./255.,213./255.,46./255.};\n  // Draw a nice looking, colored dot at a given point in 3d.\n  //\n  // Note: expects that GL_CURRENT_COLOR is set with the desired foreground color\n  // \n  // Inputs:\n  //   x  x-coordinate of point, modelview coordinates\n  //   y  y-coordinate of point, modelview coordinates\n  //   z  z-coordinate of point, modelview coordinates\n  //   requested_r  outer-most radius of dot {7}, measured in screen space pixels\n  //   selected  fills inner circle with black {false}\n  // Asserts that requested_r does not exceed 0.5*GL_POINT_SIZE_MAX\n  IGL_INLINE void draw_point(\n    const double x,\n    const double y,\n    const double z,\n    const double requested_r = 7,\n    const bool selected = false);\n  template <typename DerivedP>\n  IGL_INLINE void draw_point(\n    const Eigen::PlainObjectBase<DerivedP> & P,\n    const double requested_r = 7,\n    const bool selected = false);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"draw_point.cpp\"\n#endif\n\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/draw_rectangular_marquee.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"draw_rectangular_marquee.h\"\n#include \"OpenGL_convenience.h\"\n#include \"material_colors.h\"\n\nIGL_INLINE void igl::draw_rectangular_marquee(\n  const int from_x,\n  const int from_y,\n  const int to_x,\n  const int to_y)\n{\n  using namespace std;\n  int l;\n  glGetIntegerv(GL_LIGHTING,&l);\n  int s;\n  glGetIntegerv(GL_LINE_STIPPLE,&s);\n  double lw;\n  glGetDoublev(GL_LINE_WIDTH,&lw);\n  glDisable(GL_LIGHTING);\n  // Screen space for this viewport\n  GLint viewport[4];\n  glGetIntegerv(GL_VIEWPORT,viewport);\n  const int width = viewport[2];\n  const int height = viewport[3];\n  glMatrixMode(GL_PROJECTION);\n  glPushMatrix();\n  glLoadIdentity();\n  gluOrtho2D(0,width,0,height);\n  glMatrixMode(GL_MODELVIEW);\n  glPushMatrix();\n  glLoadIdentity();\n\n  glEnable(GL_LINE_STIPPLE);\n  glLineStipple(3,0xAAAA);\n  glLineWidth(1);\n  glColor4f(0.2,0.2,0.2,1);\n  glBegin(GL_LINE_STRIP);\n  glVertex2d(from_x,from_y);\n  glVertex2d(to_x,from_y);\n  glVertex2d(to_x,to_y);\n  glVertex2d(from_x,to_y);\n  glVertex2d(from_x,from_y);\n  glEnd();\n\n  glPopMatrix();\n  glMatrixMode(GL_PROJECTION);\n  glPopMatrix();\n  glMatrixMode(GL_MODELVIEW);\n  glLineWidth(lw);\n  (s ? glEnable(GL_LINE_STIPPLE):glDisable(GL_LINE_STIPPLE));\n  (l ? glEnable(GL_LIGHTING):glDisable(GL_LIGHTING));\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/draw_rectangular_marquee.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_DRAW_RECTANGULAR_MARQUEE_H\n#define IGL_DRAW_RECTANGULAR_MARQUEE_H\n#include \"igl_inline.h\"\nnamespace igl\n{\n  // Draw a rectangular marquee (selection box) in screen space. This sets up\n  // screen space using current viewport.\n  //\n  // Inputs:\n  //   from_x  x coordinate of from point\n  //   from_y  y coordinate of from point\n  //   to_x  x coordinate of to point\n  //   to_y  y coordinate of to point\n  IGL_INLINE void draw_rectangular_marquee(\n    const int from_x,\n    const int from_y,\n    const int to_x,\n    const int to_y);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"draw_rectangular_marquee.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/draw_skeleton_3d.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"draw_skeleton_3d.h\"\n#include \"PI.h\"\n#include \"OpenGL_convenience.h\"\n#include \"material_colors.h\"\n#include <Eigen/Geometry>\n#include <iostream>\n\ntemplate <\n  typename DerivedC, \n  typename DerivedBE, \n  typename DerivedT, \n  typename Derivedcolor>\nIGL_INLINE void igl::draw_skeleton_3d(\n  const Eigen::PlainObjectBase<DerivedC> & C,\n  const Eigen::PlainObjectBase<DerivedBE> & BE,\n  const Eigen::PlainObjectBase<DerivedT> & T,\n  const Eigen::PlainObjectBase<Derivedcolor> & color,\n  const double half_bbd)\n{\n  // Note: Maya's skeleton *does* scale with the mesh suggesting a scale\n  // parameter. Further, its joint balls are not rotated with the bones.\n  using namespace Eigen;\n  using namespace std;\n  if(color.size() == 0)\n  {\n    return draw_skeleton_3d(C,BE,T,MAYA_SEA_GREEN,half_bbd);\n  }\n  assert(color.cols() == 4 || color.size() == 4);\n  if(T.size() == 0)\n  {\n    typedef Eigen::Matrix<typename DerivedT::Scalar,Dynamic,Dynamic> Mat;\n    Mat I = Mat::Identity(C.cols()+1,C.cols());\n    Mat T = I.replicate(BE.rows(),1);\n    // insane base case\n    if(T.size() == 0)\n    {\n      return;\n    }\n    return draw_skeleton_3d(C,BE,T,color,half_bbd);\n  }\n  assert(T.rows() == BE.rows()*(C.cols()+1));\n  assert(T.cols() == C.cols());\n  // push old settings\n  glPushAttrib(GL_LIGHTING_BIT);\n  glPushAttrib(GL_LINE_BIT);\n  glDisable(GL_LIGHTING);\n  glLineWidth(1.0);\n\n  auto draw_sphere = [](const double r)\n  {\n    auto draw_circle = []()\n    {\n      glBegin(GL_LINE_STRIP);\n      for(double th = 0;th<2.0*igl::PI;th+=(2.0*igl::PI/30.0))\n      {\n        glVertex3d(cos(th),sin(th),0.0);\n      }\n      glVertex3d(cos(0),sin(0),0.0);\n      glEnd();\n    };\n    glPushMatrix();\n    glScaled(r,r,r);\n    draw_circle();\n    glRotated(90.0,1.0,0.0,0.0);\n    draw_circle();\n    glRotated(90.0,0.0,1.0,0.0);\n    draw_circle();\n    glPopMatrix();\n  };\n  auto draw_pyramid = [](const double r)\n  {\n    glBegin(GL_LINE_STRIP);\n    glVertex3d(0, 1,-1);\n    glVertex3d(0,-1,-1);\n    glVertex3d(0,-1, 1);\n    glVertex3d(0, 1, 1);\n    glVertex3d(0, 1,-1);\n    glEnd();\n    glBegin(GL_LINES);\n    glVertex3d(0, 1,-1);\n    glVertex3d(1,0,0);\n    glVertex3d(0,-1,-1);\n    glVertex3d(1,0,0);\n    glVertex3d(0,-1, 1);\n    glVertex3d(1,0,0);\n    glVertex3d(0, 1, 1);\n    glVertex3d(1,0,0);\n    glEnd();\n  };\n\n  // Loop over bones\n  for(int e = 0;e < BE.rows();e++)\n  {\n    // Draw a sphere\n    auto s = C.row(BE(e,0));\n    auto d = C.row(BE(e,1));\n    auto b = (d-s).transpose().eval();\n    double r = 0.02*half_bbd;\n    Matrix4d Te = Matrix4d::Identity();\n    Te.block(0,0,3,4) = T.block(e*4,0,4,3).transpose();\n    Quaterniond q;\n    q.setFromTwoVectors(Vector3d(1,0,0),b);\n    glPushMatrix();\n    glMultMatrixd(Te.data());\n    glTranslated(s(0),s(1),s(2));\n    if(color.size() == 4)\n    {\n      glColor4d( color(0), color(1), color(2), color(3));\n    }else\n    {\n      glColor4d( color(e,0), color(e,1), color(e,2), color(e,3));\n    }\n    draw_sphere(r);\n    const double len = b.norm()-2.*r;\n    if(len>=0)\n    {\n      auto u = b.normalized()*r;\n      glPushMatrix();\n      glTranslated(u(0),u(1),u(2));\n      glMultMatrixd(Affine3d(q).matrix().data());\n      glScaled(b.norm()-2.*r,r,r);\n      draw_pyramid(r);\n      glPopMatrix();\n    }\n    glTranslated(b(0),b(1),b(2));\n    draw_sphere(r);\n    glPopMatrix();\n  }\n  // Reset settings\n  glPopAttrib();\n  glPopAttrib();\n}\n\ntemplate <typename DerivedC, typename DerivedBE, typename DerivedT>\nIGL_INLINE void igl::draw_skeleton_3d(\n  const Eigen::PlainObjectBase<DerivedC> & C,\n  const Eigen::PlainObjectBase<DerivedBE> & BE,\n  const Eigen::PlainObjectBase<DerivedT> & T)\n{\n  return draw_skeleton_3d(C,BE,T,MAYA_SEA_GREEN);\n}\n\ntemplate <typename DerivedC, typename DerivedBE>\nIGL_INLINE void igl::draw_skeleton_3d(\n  const Eigen::PlainObjectBase<DerivedC> & C,\n  const Eigen::PlainObjectBase<DerivedBE> & BE)\n{\n  return draw_skeleton_3d(C,BE,Eigen::MatrixXd(),MAYA_SEA_GREEN);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instanciation\ntemplate void igl::draw_skeleton_3d<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&);\ntemplate void igl::draw_skeleton_3d<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&);\ntemplate void igl::draw_skeleton_3d<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<float, 4, 1, 0, 4, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, 4, 1, 0, 4, 1> > const&, double);\ntemplate void igl::draw_skeleton_3d<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<float, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, -1, 0, -1, -1> > const&, double);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/draw_skeleton_3d.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_DRAW_SKELETON_3D_H\n#define IGL_DRAW_SKELETON_3D_H\n#include \"igl_inline.h\"\n#include \"material_colors.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Draw a skeleton\n  //\n  // Inputs:\n  //   C  #C by dim List of joint rest positions\n  //   BE  #BE by 2 list of bone edge indices into C\n  //   T  #BE*(dim+1) by dim  matrix of stacked transposed bone transformations\n  //   color  #BE|1 by 4 list of color\n  //   half_bbd  half bounding box diagonal to determine scaling {1.0}\n  template <\n    typename DerivedC, \n    typename DerivedBE, \n    typename DerivedT, \n    typename Derivedcolor>\n  IGL_INLINE void draw_skeleton_3d(\n    const Eigen::PlainObjectBase<DerivedC> & C,\n    const Eigen::PlainObjectBase<DerivedBE> & BE,\n    const Eigen::PlainObjectBase<DerivedT> & T,\n    const Eigen::PlainObjectBase<Derivedcolor> & color,\n    const double half_bbd=0.5);\n  // Default color\n  template <typename DerivedC, typename DerivedBE, typename DerivedT>\n  IGL_INLINE void draw_skeleton_3d(\n    const Eigen::PlainObjectBase<DerivedC> & C,\n    const Eigen::PlainObjectBase<DerivedBE> & BE,\n    const Eigen::PlainObjectBase<DerivedT> & T);\n  template <typename DerivedC, typename DerivedBE>\n  IGL_INLINE void draw_skeleton_3d(\n    const Eigen::PlainObjectBase<DerivedC> & C,\n    const Eigen::PlainObjectBase<DerivedBE> & BE);\n};\n#ifndef IGL_STATIC_LIBRARY\n#  include \"draw_skeleton_3d.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/draw_skeleton_vector_graphics.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"draw_skeleton_vector_graphics.h\"\n#include \"OpenGL_convenience.h\"\n#include \"draw_point.h\"\n#include \"material_colors.h\"\n\nIGL_INLINE void igl::draw_skeleton_vector_graphics(\n  const Eigen::MatrixXd & C,\n  const Eigen::MatrixXi & BE)\n{\n  return draw_skeleton_vector_graphics(C,BE,BBW_POINT_COLOR,BBW_LINE_COLOR);\n}\n\nIGL_INLINE void igl::draw_skeleton_vector_graphics(\n  const Eigen::MatrixXd & C,\n  const Eigen::MatrixXi & BE,\n  const float * point_color,\n  const float * line_color)\n{\n  using namespace Eigen;\n\n  int old_lighting=0;\n  double old_line_width=1;\n  glGetIntegerv(GL_LIGHTING,&old_lighting);\n  glGetDoublev(GL_LINE_WIDTH,&old_line_width);\n  int cm;\n  glGetIntegerv(GL_COLOR_MATERIAL,&cm);\n  glDisable(GL_LIGHTING);\n  glDisable(GL_LINE_STIPPLE);\n  //glEnable(GL_POLYGON_OFFSET_FILL);\n  glEnable(GL_COLOR_MATERIAL);\n  glLineWidth(10.0);\n  glColorMaterial(GL_FRONT_AND_BACK,GL_DIFFUSE);\n  float mat_ambient[4] = {0.1,0.1,0.1,1.0};\n  float mat_specular[4] = {0.0,0.0,0.0,1.0};\n  float mat_shininess = 1;\n  glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT,  mat_ambient);\n  glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT,  mat_ambient);\n  glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);\n  glMaterialf( GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);\n\n  for(int i = 0;i<3;i++)\n  {\n    switch(i)\n    {\n      case 0: glColor3fv(WHITE);      glLineWidth(10); break;\n      case 1: glColor3fv(BLACK);      glLineWidth( 6); break;\n      case 2: glColor3fv(line_color); glLineWidth( 4); break;\n    }\n    // Loop over bone edges\n    glBegin(GL_LINES);\n    for(int e = 0;e<BE.rows();e++)\n    {\n      RowVector3d tip = C.row(BE(e,0));\n      RowVector3d tail = C.row(BE(e,1));\n      glVertex3dv(tip.data());\n      glVertex3dv(tail.data());\n    }\n    glEnd();\n  }\n\n  glColor3fv(point_color);\n  for(int i = 0;i<C.rows();i++)\n  {\n    RowVector3d p = C.row(i);\n    draw_point(p(0),p(1),p(2));\n  }\n\n  (cm ? glEnable(GL_COLOR_MATERIAL):glDisable(GL_COLOR_MATERIAL));\n  //glDisable(GL_POLYGON_OFFSET_FILL);\n  glEnable(GL_LIGHTING);\n  (old_lighting ? glEnable(GL_LIGHTING) : glDisable(GL_LIGHTING));\n  glLineWidth(old_line_width);\n}\n\ntemplate <typename DerivedC, typename DerivedBE, typename DerivedT>\nIGL_INLINE void igl::draw_skeleton_vector_graphics(\n  const Eigen::PlainObjectBase<DerivedC> & C,\n  const Eigen::PlainObjectBase<DerivedBE> & BE,\n  const Eigen::PlainObjectBase<DerivedT> & T)\n{\n  return draw_skeleton_vector_graphics(C,BE,T,BBW_POINT_COLOR,BBW_LINE_COLOR);\n}\n\ntemplate <typename DerivedC, typename DerivedBE, typename DerivedT>\nIGL_INLINE void igl::draw_skeleton_vector_graphics(\n  const Eigen::PlainObjectBase<DerivedC> & C,\n  const Eigen::PlainObjectBase<DerivedBE> & BE,\n  const Eigen::PlainObjectBase<DerivedT> & T,\n  const float * point_color,\n  const float * line_color)\n{\n  Eigen::PlainObjectBase<DerivedC> CT;\n  Eigen::PlainObjectBase<DerivedBE> BET;\n  const int dim = T.cols();\n  assert(dim == C.cols());\n  CT.resize(2*BE.rows(),C.cols());\n  BET.resize(BE.rows(),2);\n  for(int e = 0;e<BE.rows();e++)\n  {\n    BET(e,0) = 2*e; \n    BET(e,1) = 2*e+1;\n    const auto & c0 = C.row(BE(e,0));\n    const auto & c1 = C.row(BE(e,1));\n    const auto & L = T.block(e*(dim+1),0,dim,dim);\n    const auto & t = T.block(e*(dim+1)+dim,0,1,dim);\n    CT.row(2*e) =   c0 * L + t;\n    CT.row(2*e+1) = c1 * L + t;\n  }\n  draw_skeleton_vector_graphics(CT,BET,point_color,line_color);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instanciation\ntemplate void igl::draw_skeleton_vector_graphics<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/draw_skeleton_vector_graphics.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_DRAW_SKELETON_VECTOR_GRAPHICS_H\n#define IGL_DRAW_SKELETON_VECTOR_GRAPHICS_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n\nnamespace igl\n{\n  // Draw a skeleton with a 2D vector graphcis style à la BBW, STBS, Monotonic,\n  // FAST papers.\n  //\n  // Inputs:\n  //   C  #C by dim list of joint positions\n  //   BE #BE by 2 list of bone edge indices into C\n  //  point_color  color of points\n  //  line_color  color of lines\n  IGL_INLINE void draw_skeleton_vector_graphics(\n    const Eigen::MatrixXd & C,\n    const Eigen::MatrixXi & BE,\n    const float * point_color,\n    const float * line_color);\n  // Use default colors (originally from BBW paper)\n  IGL_INLINE void draw_skeleton_vector_graphics(\n    const Eigen::MatrixXd & C,\n    const Eigen::MatrixXi & BE);\n  //   T  #BE*(dim+1) by dim  matrix of stacked transposed bone transformations\n  template <typename DerivedC, typename DerivedBE, typename DerivedT>\n  IGL_INLINE void draw_skeleton_vector_graphics(\n    const Eigen::PlainObjectBase<DerivedC> & C,\n    const Eigen::PlainObjectBase<DerivedBE> & BE,\n    const Eigen::PlainObjectBase<DerivedT> & T,\n    const float * point_color,\n    const float * line_color);\n  template <typename DerivedC, typename DerivedBE, typename DerivedT>\n  IGL_INLINE void draw_skeleton_vector_graphics(\n    const Eigen::PlainObjectBase<DerivedC> & C,\n    const Eigen::PlainObjectBase<DerivedBE> & BE,\n    const Eigen::PlainObjectBase<DerivedT> & T);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"draw_skeleton_vector_graphics.cpp\"\n#endif\n#endif \n"
  },
  {
    "path": "libs/libigl/include/igl/ears.cpp",
    "content": "#include \"ears.h\"\n#include \"on_boundary.h\"\n#include \"find.h\"\n#include \"slice.h\"\n#include \"mat_min.h\"\n#include <cassert>\n\ntemplate <\n  typename DerivedF,\n  typename Derivedear,\n  typename Derivedear_opp>\nIGL_INLINE void igl::ears(\n  const Eigen::MatrixBase<DerivedF> & F,\n  Eigen::PlainObjectBase<Derivedear> & ear,\n  Eigen::PlainObjectBase<Derivedear_opp> & ear_opp)\n{\n  assert(F.cols() == 3 && \"F should contain triangles\");\n  Eigen::Array<bool,Eigen::Dynamic,3> B;\n  {\n    Eigen::Array<bool,Eigen::Dynamic,1> I;\n    on_boundary(F,I,B);\n  }\n  find(B.rowwise().count() == 2,ear);\n  Eigen::Array<bool,Eigen::Dynamic,3> Bear;\n  slice(B,ear,1,Bear);\n  Eigen::Array<bool,Eigen::Dynamic,1> M;\n  mat_min(Bear,2,M,ear_opp);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::ears<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/ears.h",
    "content": "#ifndef IGL_EARS_H\n#define IGL_EARS_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // FIND_EARS  Find all ears (faces with two boundary edges) in a given mesh\n  // \n  // [ears,ear_opp] = find_ears(F)\n  //\n  // Inputs:\n  //   F  #F by 3 list of triangle mesh indices\n  // Outputs:\n  //   ears  #ears list of indices into F of ears\n  //   ear_opp  #ears list of indices indicating which edge is non-boundary\n  //     (connecting to flops)\n  // \n  template <\n    typename DerivedF,\n    typename Derivedear,\n    typename Derivedear_opp>\n  IGL_INLINE void ears(\n    const Eigen::MatrixBase<DerivedF> & F,\n    Eigen::PlainObjectBase<Derivedear> & ear,\n    Eigen::PlainObjectBase<Derivedear_opp> & ear_opp);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"ears.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/edge_collapse_is_valid.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"edge_collapse_is_valid.h\"\n#include \"collapse_edge.h\"\n#include \"circulation.h\"\n#include \"intersect.h\"\n#include \"unique.h\"\n#include \"list_to_matrix.h\"\n#include <vector>\n\nIGL_INLINE bool igl::edge_collapse_is_valid(\n  const int e,\n  const Eigen::MatrixXi & F,\n  const Eigen::MatrixXi & E,\n  const Eigen::VectorXi & EMAP,\n  const Eigen::MatrixXi & EF,\n  const Eigen::MatrixXi & EI)\n{\n  using namespace Eigen;\n  using namespace std;\n  // For consistency with collapse_edge.cpp, let's determine edge flipness\n  // (though not needed to check validity)\n  const int eflip = E(e,0)>E(e,1);\n  // source and destination\n  const int s = eflip?E(e,1):E(e,0);\n  const int d = eflip?E(e,0):E(e,1);\n\n  if(s == IGL_COLLAPSE_EDGE_NULL && d==IGL_COLLAPSE_EDGE_NULL)\n  {\n    return false;\n  }\n  // check if edge collapse is valid: intersection of vertex neighbors of s and\n  // d should be exactly 2+(s,d) = 4\n  // http://stackoverflow.com/a/27049418/148668\n  {\n    // all vertex neighbors around edge, including the two vertices of the edge\n    const auto neighbors = [](\n      const int e,\n      const bool ccw,\n      const Eigen::MatrixXi & F,\n      const Eigen::MatrixXi & E,\n      const Eigen::VectorXi & EMAP,\n      const Eigen::MatrixXi & EF,\n      const Eigen::MatrixXi & EI) \n    {\n      vector<int> N,uN;\n      vector<int> V2Fe = circulation(e, ccw,F,E,EMAP,EF,EI);\n      for(auto f : V2Fe)\n      {\n        N.push_back(F(f,0));\n        N.push_back(F(f,1));\n        N.push_back(F(f,2));\n      }\n      vector<size_t> _1,_2;\n      igl::unique(N,uN,_1,_2);\n      VectorXi uNm;\n      list_to_matrix(uN,uNm);\n      return uNm;\n    };\n    VectorXi Ns = neighbors(e, eflip,F,E,EMAP,EF,EI);\n    VectorXi Nd = neighbors(e,!eflip,F,E,EMAP,EF,EI);\n    VectorXi Nint = igl::intersect(Ns,Nd);\n    if(Nint.size() != 4)\n    {\n      return false;\n    }\n    if(Ns.size() == 4 && Nd.size() == 4)\n    {\n      VectorXi NsNd(8);\n      NsNd<<Ns,Nd;\n      VectorXi Nun,_1,_2;\n      igl::unique(NsNd,Nun,_1,_2);\n      // single tet, don't collapse\n      if(Nun.size() == 4)\n      {\n        return false;\n      }\n    }\n  }\n  return true;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/edge_collapse_is_valid.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_EDGE_COLLAPSE_IS_VALID_H\n#define IGL_EDGE_COLLAPSE_IS_VALID_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Assumes (V,F) is a closed manifold mesh (except for previouslly collapsed\n  // faces which should be set to: \n  // [IGL_COLLAPSE_EDGE_NULL IGL_COLLAPSE_EDGE_NULL IGL_COLLAPSE_EDGE_NULL].\n  // Tests whether collapsing exactly two faces and exactly 3 edges from E (e\n  // and one side of each face gets collapsed to the other) will result in a\n  // mesh with the same topology.\n  //\n  // Inputs:\n  //   e  index into E of edge to try to collapse. E(e,:) = [s d] or [d s] so\n  //     that s<d, then d is collapsed to s.\n  //   F  #F by 3 list of face indices into V.\n  //   E  #E by 2 list of edge indices into V.\n  //   EMAP #F*3 list of indices into E, mapping each directed edge to unique\n  //     unique edge in E\n  //   EF  #E by 2 list of edge flaps, EF(e,0)=f means e=(i-->j) is the edge of\n  //     F(f,:) opposite the vth corner, where EI(e,0)=v. Similarly EF(e,1) \"\n  //     e=(j->i)\n  //   EI  #E by 2 list of edge flap corners (see above).\n  // Returns true if edge collapse is valid\n  IGL_INLINE bool edge_collapse_is_valid(\n    const int e,\n    const Eigen::MatrixXi & F,\n    const Eigen::MatrixXi & E,\n    const Eigen::VectorXi & EMAP,\n    const Eigen::MatrixXi & EF,\n    const Eigen::MatrixXi & EI);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"edge_collapse_is_valid.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/edge_flaps.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"edge_flaps.h\"\n#include \"unique_edge_map.h\"\n#include <vector>\n#include <cassert>\n\nIGL_INLINE void igl::edge_flaps(\n  const Eigen::MatrixXi & F,\n  const Eigen::MatrixXi & E,\n  const Eigen::VectorXi & EMAP,\n  Eigen::MatrixXi & EF,\n  Eigen::MatrixXi & EI)\n{\n  // Initialize to boundary value\n  EF.setConstant(E.rows(),2,-1);\n  EI.setConstant(E.rows(),2,-1);\n  // loop over all faces\n  for(int f = 0;f<F.rows();f++)\n  {\n    // loop over edges across from corners\n    for(int v = 0;v<3;v++)\n    {\n      // get edge id\n      const int e = EMAP(v*F.rows()+f);\n      // See if this is left or right flap w.r.t. edge orientation\n      if( F(f,(v+1)%3) == E(e,0) && F(f,(v+2)%3) == E(e,1))\n      {\n        EF(e,0) = f;\n        EI(e,0) = v;\n      }else\n      {\n        assert(F(f,(v+1)%3) == E(e,1) && F(f,(v+2)%3) == E(e,0));\n        EF(e,1) = f;\n        EI(e,1) = v;\n      }\n    }\n  }\n}\n\nIGL_INLINE void igl::edge_flaps(\n  const Eigen::MatrixXi & F,\n  Eigen::MatrixXi & E,\n  Eigen::VectorXi & EMAP,\n  Eigen::MatrixXi & EF,\n  Eigen::MatrixXi & EI)\n{\n  Eigen::MatrixXi allE;\n  std::vector<std::vector<int> > uE2E;\n  igl::unique_edge_map(F,allE,E,EMAP,uE2E);\n  // Const-ify to call overload\n  const auto & cE = E;\n  const auto & cEMAP = EMAP;\n  return edge_flaps(F,cE,cEMAP,EF,EI);\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/edge_flaps.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_EDGE_FLAPS_H\n#define IGL_EDGE_FLAPS_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Determine \"edge flaps\": two faces on either side of a unique edge (assumes\n  // edge-manifold mesh)\n  //\n  // Inputs:\n  //   F  #F by 3 list of face indices\n  //   E  #E by 2 list of edge indices into V.\n  //   EMAP #F*3 list of indices into E, mapping each directed edge to unique\n  //     unique edge in E\n  // Outputs:\n  //   EF  #E by 2 list of edge flaps, EF(e,0)=f means e=(i-->j) is the edge of\n  //     F(f,:) opposite the vth corner, where EI(e,0)=v. Similarly EF(e,1) \"\n  //     e=(j->i)\n  //   EI  #E by 2 list of edge flap corners (see above).\n  //\n  // TODO: This seems to be a duplicate of edge_topology.h\n  // igl::edge_topology(V,F,etEV,etFE,etEF);\n  // igl::edge_flaps(F,efE,efEMAP,efEF,efEI);\n  // [~,I] = sort(efE,2)\n  // all( efE(sub2ind(size(efE),repmat(1:size(efE,1),2,1)',I)) == etEV )\n  // all( efEF(sub2ind(size(efE),repmat(1:size(efE,1),2,1)',I)) == etEF )\n  // all(efEMAP(sub2ind(size(F),repmat(1:size(F,1),3,1)',repmat([1 2 3],size(F,1),1))) == etFE(:,[2 3 1]))\n  IGL_INLINE void edge_flaps(\n    const Eigen::MatrixXi & F,\n    const Eigen::MatrixXi & E,\n    const Eigen::VectorXi & EMAP,\n    Eigen::MatrixXi & EF,\n    Eigen::MatrixXi & EI);\n  // Only faces as input\n  IGL_INLINE void edge_flaps(\n    const Eigen::MatrixXi & F,\n    Eigen::MatrixXi & E,\n    Eigen::VectorXi & EMAP,\n    Eigen::MatrixXi & EF,\n    Eigen::MatrixXi & EI);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"edge_flaps.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/edge_lengths.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"edge_lengths.h\"\n#include \"squared_edge_lengths.h\"\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedL>\nIGL_INLINE void igl::edge_lengths(\n  const Eigen::MatrixBase<DerivedV>& V,\n  const Eigen::MatrixBase<DerivedF>& F,\n  Eigen::PlainObjectBase<DerivedL>& L)\n  {\n      igl::squared_edge_lengths(V,F,L);\n      L=L.array().sqrt().eval();\n  }\n  \n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::edge_lengths<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 6, 0, -1, 6> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 6, 0, -1, 6> >&);\n// generated by autoexplicit.sh\ntemplate void igl::edge_lengths<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\ntemplate void igl::edge_lengths<Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<unsigned int, -1, 3, 1, -1, 3>, Eigen::Matrix<float, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<unsigned int, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 0, -1, 3> >&);\ntemplate void igl::edge_lengths<Eigen::Matrix<float, -1, 2, 0, -1, 2>, Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1>, Eigen::Matrix<float, -1, 2, 0, -1, 2> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 2, 0, -1, 2> > const&, Eigen::MatrixBase<Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 2, 0, -1, 2> >&);\ntemplate void igl::edge_lengths<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\ntemplate void igl::edge_lengths<Eigen::Matrix<double, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 2, 0, -1, 2> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> >&);\ntemplate void igl::edge_lengths<Eigen::Matrix<double, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 2, 0, -1, 2> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> >&);\ntemplate void igl::edge_lengths<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 6, 0, -1, 6> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 6, 0, -1, 6> >&);\ntemplate void igl::edge_lengths<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\ntemplate void igl::edge_lengths<Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1>, Eigen::Matrix<float, -1, 3, 1, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> >&);\ntemplate void igl::edge_lengths<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::edge_lengths<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 4, 0, -1, 4>, Eigen::Matrix<double, -1, 6, 0, -1, 6> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 4, 0, -1, 4> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 6, 0, -1, 6> >&);\ntemplate void igl::edge_lengths<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::edge_lengths<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\ntemplate void igl::edge_lengths<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 3, 1, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> >&);\ntemplate void igl::edge_lengths<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1>, Eigen::Matrix<double, -1, 3, 1, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> >&);\ntemplate void igl::edge_lengths<Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<float, -1, 3, 1, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> >&);\ntemplate void igl::edge_lengths<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 6, 0, -1, 6> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 6, 0, -1, 6> >&);\ntemplate void igl::edge_lengths<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 4, 0, -1, 4>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 4, 0, -1, 4> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\ntemplate void igl::edge_lengths<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\ntemplate void igl::edge_lengths<Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<float, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 0, -1, 3> >&);\ntemplate void igl::edge_lengths<Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1>, Eigen::Matrix<float, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 0, -1, 3> >&);\ntemplate void igl::edge_lengths<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\ntemplate void igl::edge_lengths<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 3, 1, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/edge_lengths.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_EDGE_LENGTHS_H\n#define IGL_EDGE_LENGTHS_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Dense>\n\nnamespace igl\n{\n  // Constructs a list of lengths of edges opposite each index in a face\n  // (triangle/tet) list\n  //\n  // Templates:\n  //   DerivedV derived from vertex positions matrix type: i.e. MatrixXd\n  //   DerivedF derived from face indices matrix type: i.e. MatrixXi\n  //   DerivedL derived from edge lengths matrix type: i.e. MatrixXd\n  // Inputs:\n  //   V  eigen matrix #V by 3\n  //   F  #F by 2 list of mesh edges\n  //    or\n  //   F  #F by 3 list of mesh faces (must be triangles)\n  //    or\n  //   T  #T by 4 list of mesh elements (must be tets)\n  // Outputs:\n  //   L  #F by {1|3|6} list of edge lengths \n  //     for edges, column of lengths\n  //     for triangles, columns correspond to edges [1,2],[2,0],[0,1]\n  //     for tets, columns correspond to edges\n  //     [3 0],[3 1],[3 2],[1 2],[2 0],[0 1]\n  //\n  template <typename DerivedV, typename DerivedF, typename DerivedL>\n  IGL_INLINE void edge_lengths(\n    const Eigen::MatrixBase<DerivedV>& V,\n    const Eigen::MatrixBase<DerivedF>& F,\n    Eigen::PlainObjectBase<DerivedL>& L);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"edge_lengths.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/edge_topology.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"edge_topology.h\"\n#include \"is_edge_manifold.h\"\n#include <algorithm>\n\ntemplate<typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::edge_topology(\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  Eigen::MatrixXi& EV,\n  Eigen::MatrixXi& FE,\n  Eigen::MatrixXi& EF)\n{\n  // Only needs to be edge-manifold\n  if (V.rows() ==0 || F.rows()==0)\n  {\n    EV = Eigen::MatrixXi::Constant(0,2,-1);\n    FE = Eigen::MatrixXi::Constant(0,3,-1);\n    EF = Eigen::MatrixXi::Constant(0,2,-1);\n    return;\n  }\n  assert(igl::is_edge_manifold(F));\n  std::vector<std::vector<int> > ETT;\n  for(int f=0;f<F.rows();++f)\n    for (int i=0;i<3;++i)\n    {\n      // v1 v2 f vi\n      int v1 = F(f,i);\n      int v2 = F(f,(i+1)%3);\n      if (v1 > v2) std::swap(v1,v2);\n      std::vector<int> r(4);\n      r[0] = v1; r[1] = v2;\n      r[2] = f;  r[3] = i;\n      ETT.push_back(r);\n    }\n  std::sort(ETT.begin(),ETT.end());\n\n  // count the number of edges (assume manifoldness)\n  int En = 1; // the last is always counted\n  for(int i=0;i<int(ETT.size())-1;++i)\n    if (!((ETT[i][0] == ETT[i+1][0]) && (ETT[i][1] == ETT[i+1][1])))\n      ++En;\n\n  EV = Eigen::MatrixXi::Constant((int)(En),2,-1);\n  FE = Eigen::MatrixXi::Constant((int)(F.rows()),3,-1);\n  EF = Eigen::MatrixXi::Constant((int)(En),2,-1);\n  En = 0;\n\n  for(unsigned i=0;i<ETT.size();++i)\n  {\n    if (i == ETT.size()-1 ||\n        !((ETT[i][0] == ETT[i+1][0]) && (ETT[i][1] == ETT[i+1][1]))\n        )\n    {\n      // Border edge\n      std::vector<int>& r1 = ETT[i];\n      EV(En,0)     = r1[0];\n      EV(En,1)     = r1[1];\n      EF(En,0)    = r1[2];\n      FE(r1[2],r1[3]) = En;\n    }\n    else\n    {\n      std::vector<int>& r1 = ETT[i];\n      std::vector<int>& r2 = ETT[i+1];\n      EV(En,0)     = r1[0];\n      EV(En,1)     = r1[1];\n      EF(En,0)    = r1[2];\n      EF(En,1)    = r2[2];\n      FE(r1[2],r1[3]) = En;\n      FE(r2[2],r2[3]) = En;\n      ++i; // skip the next one\n    }\n    ++En;\n  }\n\n  // Sort the relation EF, accordingly to EV\n  // the first one is the face on the left of the edge\n  for(unsigned i=0; i<EF.rows(); ++i)\n  {\n    int fid = EF(i,0);\n    bool flip = true;\n    // search for edge EV.row(i)\n    for (unsigned j=0; j<3; ++j)\n    {\n      if ((F(fid,j) == EV(i,0)) && (F(fid,(j+1)%3) == EV(i,1)))\n        flip = false;\n    }\n\n    if (flip)\n    {\n      int tmp = EF(i,0);\n      EF(i,0) = EF(i,1);\n      EF(i,1) = tmp;\n    }\n  }\n\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::edge_topology<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&);\ntemplate void igl::edge_topology<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/edge_topology.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_EDGE_TOPOLOGY_H\n#define IGL_EDGE_TOPOLOGY_H\n\n#include \"igl_inline.h\"\n\n#include <Eigen/Core>\n#include <vector>\n\nnamespace igl \n{\n  // Initialize Edges and their topological relations (assumes an edge-manifold\n  // mesh)\n  //\n  // Output:\n  // EV  : #Ex2, Stores the edge description as pair of indices to vertices\n  // FE : #Fx3, Stores the Triangle-Edge relation\n  // EF : #Ex2: Stores the Edge-Triangle relation\n  //\n  // TODO: This seems to be a inferior duplicate of edge_flaps.h:\n  //   - unused input parameter V\n  //   - roughly 2x slower than edge_flaps\n  //   - outputs less information: edge_flaps reveals corner opposite edge\n  //   - FE uses non-standard and ambiguous order: FE(f,c) is merely an edge\n  //     incident on corner c of face f. In contrast, edge_flaps's EMAP(f,c) reveals\n  //     the edge _opposite_ corner c of face f\ntemplate <typename DerivedV, typename DerivedF>\n  IGL_INLINE void edge_topology(\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F, \n    Eigen::MatrixXi& EV, \n    Eigen::MatrixXi& FE, \n    Eigen::MatrixXi& EF);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"edge_topology.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/edges.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"edges.h\"\n#include \"adjacency_matrix.h\"\n\ntemplate <typename DerivedF, typename DerivedE>\nIGL_INLINE void igl::edges(\n  const Eigen::MatrixBase<DerivedF> & F, \n  Eigen::PlainObjectBase<DerivedE> & E)\n{\n  // build adjacency matrix\n  typedef typename DerivedF::Scalar Index;\n  Eigen::SparseMatrix<Index> A;\n  igl::adjacency_matrix(F,A);\n  // Number of non zeros should be twice number of edges\n  assert(A.nonZeros()%2 == 0);\n  // Resize to fit edges\n  E.resize(A.nonZeros()/2,2);\n  int i = 0;\n  // Iterate over outside\n  for(int k=0; k<A.outerSize(); ++k)\n  {\n    // Iterate over inside\n    for(typename Eigen::SparseMatrix<Index>::InnerIterator it (A,k); it; ++it)\n    {\n      // only add edge in one direction\n      if(it.row()<it.col())\n      {\n        E(i,0) = it.row();\n        E(i,1) = it.col();\n        i++;\n      }\n    }\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::edges<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 2, 0, -1, 2> >(Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/edges.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_EDGES_H\n#define IGL_EDGES_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Dense>\n\nnamespace igl\n{\n  // Constructs a list of unique edges represented in a given mesh (V,F)\n  // Templates:\n  //   T  should be a eigen sparse matrix primitive type like int or double\n  // Inputs:\n  //   F  #F by 3 list of mesh faces (must be triangles)\n  //   or\n  //   T  #T x 4  matrix of indices of tet corners\n  // Outputs:\n  //   E #E by 2 list of edges in no particular order\n  //\n  // See also: adjacency_matrix\n  template <typename DerivedF, typename DerivedE>\n  IGL_INLINE void edges(\n    const Eigen::MatrixBase<DerivedF> & F, \n    Eigen::PlainObjectBase<DerivedE> & E);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"edges.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/edges_to_path.cpp",
    "content": "#include \"edges_to_path.h\"\n#include \"dfs.h\"\n#include \"sort.h\"\n#include \"slice.h\"\n#include \"ismember.h\"\n#include \"unique.h\"\n#include \"adjacency_list.h\"\n\ntemplate <\n  typename DerivedE,\n  typename DerivedI,\n  typename DerivedJ,\n  typename DerivedK>\nIGL_INLINE void igl::edges_to_path(\n  const Eigen::MatrixBase<DerivedE> & OE,\n  Eigen::PlainObjectBase<DerivedI> & I,\n  Eigen::PlainObjectBase<DerivedJ> & J,\n  Eigen::PlainObjectBase<DerivedK> & K)\n{\n  assert(OE.rows()>=1);\n  if(OE.rows() == 1)\n  {\n    I.resize(2);\n    I(0) = OE(0);\n    I(1) = OE(1);\n    J.resize(1);\n    J(0) = 0;\n    K.resize(1);\n    K(0) = 0;\n  }\n\n  // Compute on reduced graph\n  DerivedI U;\n  Eigen::VectorXi vE;\n  {\n    Eigen::VectorXi IA;\n    unique(OE,U,IA,vE);\n  }\n\n  Eigen::VectorXi V = Eigen::VectorXi::Zero(vE.maxCoeff()+1);\n  for(int e = 0;e<vE.size();e++)\n  {\n    V(vE(e))++;\n    assert(V(vE(e))<=2);\n  }\n  // Try to find a vertex with valence = 1\n  int c = 2;\n  int s = vE(0);\n  for(int v = 0;v<V.size();v++)\n  {\n    if(V(v) == 1)\n    {\n      c = V(v);\n      s = v;\n      break;\n    }\n  }\n  assert(V(s) == c);\n  assert(c == 2 || c == 1);\n\n  // reshape E to be #E by 2\n  DerivedE E = Eigen::Map<DerivedE>(vE.data(),OE.rows(),OE.cols()).eval();\n  {\n    std::vector<std::vector<int> > A;\n    igl::adjacency_list(E,A);\n    Eigen::VectorXi P,C;\n    dfs(A,s,I,P,C);\n  }\n  if(c == 2)\n  {\n    I.conservativeResize(I.size()+1);\n    I(I.size()-1) = I(0);\n  }\n\n  DerivedE sE;\n  Eigen::Matrix<typename DerivedI::Scalar,Eigen::Dynamic,2> sEI;\n  {\n    Eigen::MatrixXi _;\n    sort(E,2,true,sE,_);\n    Eigen::Matrix<typename DerivedI::Scalar,Eigen::Dynamic,2> EI(I.size()-1,2);\n    EI.col(0) = I.head(I.size()-1);\n    EI.col(1) = I.tail(I.size()-1);\n    sort(EI,2,true,sEI,_);\n  }\n  {\n    Eigen::Array<bool,Eigen::Dynamic,1> F;\n    ismember_rows(sEI,sE,F,J);\n  }\n  K.resize(I.size()-1);\n  for(int k = 0;k<K.size();k++)\n  {\n    K(k) = (E(J(k),0) != I(k) ? 1 : 0);\n  }\n\n  // Map vertex indices onto original graph\n  slice(U,DerivedI(I),1,I);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::edges_to_path<Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/edges_to_path.h",
    "content": "#ifndef IGL_EDGES_TO_PATH_H\n#define IGL_EDGES_TO_PATH_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // EDGES_TO_PATH Given a set of undirected, unique edges such that all form a\n  // single connected compoent with exactly 0 or 2 nodes with valence =1,\n  // determine the/a path visiting all nodes.\n  //\n  // Inputs:\n  //   E  #E by 2 list of undirected edges\n  // Outputs:\n  //   I  #E+1 list of nodes in order tracing the chain (loop), if the output\n  //     is a loop then I(1) == I(end)\n  //   J  #I-1 list of indices into E of edges tracing I\n  //   K  #I-1 list of indices into columns of E {1,2} so that K(i) means that\n  //     E(i,K(i)) comes before the other (i.e., E(i,3-K(i)) ). This means that \n  //     I(i) == E(J(i),K(i)) for i<#I, or\n  //     I == E(sub2ind(size(E),J([1:end end]),[K;3-K(end)]))))\n  // \n  template <\n    typename DerivedE,\n    typename DerivedI,\n    typename DerivedJ,\n    typename DerivedK>\n  IGL_INLINE void edges_to_path(\n    const Eigen::MatrixBase<DerivedE> & E,\n    Eigen::PlainObjectBase<DerivedI> & I,\n    Eigen::PlainObjectBase<DerivedJ> & J,\n    Eigen::PlainObjectBase<DerivedK> & K);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"edges_to_path.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/eigs.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"eigs.h\"\n\n#include \"cotmatrix.h\"\n#include \"sort.h\"\n#include \"slice.h\"\n#include \"massmatrix.h\"\n#include <iostream>\n\ntemplate <\n  typename Atype,\n  typename Btype,\n  typename DerivedU,\n  typename DerivedS>\nIGL_INLINE bool igl::eigs(\n  const Eigen::SparseMatrix<Atype> & A,\n  const Eigen::SparseMatrix<Btype> & iB,\n  const size_t k,\n  const EigsType type,\n  Eigen::PlainObjectBase<DerivedU> & sU,\n  Eigen::PlainObjectBase<DerivedS> & sS)\n{\n  using namespace Eigen;\n  using namespace std;\n  const size_t n = A.rows();\n  assert(A.cols() == n && \"A should be square.\");\n  assert(iB.rows() == n && \"B should be match A's dims.\");\n  assert(iB.cols() == n && \"B should be square.\");\n  assert(type == EIGS_TYPE_SM && \"Only low frequencies are supported\");\n  DerivedU U(n,k);\n  DerivedS S(k,1);\n  typedef Atype Scalar;\n  typedef Eigen::Matrix<typename DerivedU::Scalar,DerivedU::RowsAtCompileTime,1> VectorXS;\n  // Rescale B for better numerics\n  const Scalar rescale = std::abs(iB.diagonal().maxCoeff());\n  const Eigen::SparseMatrix<Btype> B = iB/rescale;\n\n  Scalar tol = 1e-4;\n  Scalar conv = 1e-14;\n  int max_iter = 100;\n  int i = 0;\n  while(true)\n  {\n    // Random initial guess\n    VectorXS y = VectorXS::Random(n,1);\n    Scalar eff_sigma = 0;\n    if(i>0)\n    {\n      eff_sigma = 1e-8+std::abs(S(i-1));\n    }\n    // whether to use rayleigh quotient method\n    bool ray = false;\n    Scalar err = std::numeric_limits<Scalar>::infinity();\n    int iter;\n    Scalar sigma = std::numeric_limits<Scalar>::infinity();\n    VectorXS x;\n    for(iter = 0;iter<max_iter;iter++)\n    {\n      if(i>0 && !ray)\n      {\n        // project-out existing modes\n        for(int j = 0;j<i;j++)\n        {\n          const VectorXS u = U.col(j);\n          y = (y - u*u.dot(B*y)/u.dot(B * u)).eval();\n        }\n      }\n      // normalize\n      x = y/sqrt(y.dot(B*y));\n\n      // current guess at eigen value\n      sigma = x.dot(A*x)/x.dot(B*x);\n      //x *= sigma>0?1.:-1.;\n\n      Scalar err_prev = err;\n      err = (A*x-sigma*B*x).array().abs().maxCoeff();\n      if(err<conv)\n      {\n        break;\n      }\n      if(ray || err<tol)\n      {\n        eff_sigma = sigma;\n        ray = true;\n      }\n\n      Scalar tikhonov = std::abs(eff_sigma)<1e-12?1e-10:0;\n      switch(type)\n      {\n        default:\n          assert(false && \"Not supported\");\n          break;\n        case EIGS_TYPE_SM:\n        {\n          SimplicialLDLT<SparseMatrix<Scalar> > solver;\n          const SparseMatrix<Scalar> C = A-eff_sigma*B+tikhonov*B;\n          //mw.save(C,\"C\");\n          //mw.save(eff_sigma,\"eff_sigma\");\n          //mw.save(tikhonov,\"tikhonov\");\n          solver.compute(C);\n          switch(solver.info())\n          {\n            case Eigen::Success:\n              break;\n            case Eigen::NumericalIssue:\n              cerr<<\"Error: Numerical issue.\"<<endl;\n              return false;\n            default:\n              cerr<<\"Error: Other.\"<<endl;\n              return false;\n          }\n          const VectorXS rhs = B*x;\n          y = solver.solve(rhs);\n          //mw.save(rhs,\"rhs\");\n          //mw.save(y,\"y\");\n          //mw.save(x,\"x\");\n          //mw.write(\"eigs.mat\");\n          //if(i == 1)\n          //return false;\n          break;\n        }\n      }\n    }\n    if(iter == max_iter)\n    {\n      cerr<<\"Failed to converge.\"<<endl;\n      return false;\n    }\n    if(i==0 || (S.head(i).array()-sigma).abs().maxCoeff()>1e-14)\n    {\n      U.col(i) = x;\n      S(i) = sigma;\n      i++;\n      if(i == k)\n      {\n        break;\n      }\n    }else\n    {\n      // restart with new random guess.\n      cout<<\"RESTART!\"<<endl;\n    }\n  }\n  // finally sort\n  VectorXi I;\n  igl::sort(S,1,false,sS,I);\n  sU = igl::slice(U,I,2);\n  sS /= rescale;\n  sU /= sqrt(rescale);\n  return true;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate bool igl::eigs<double, double, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::SparseMatrix<double, 0, int> const&, Eigen::SparseMatrix<double, 0, int> const&, unsigned long, igl::EigsType, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\n#ifdef WIN32\ntemplate bool igl::eigs<double, double, Eigen::Matrix<double,-1,-1,0,-1,-1>, Eigen::Matrix<double,-1,1,0,-1,1> >(Eigen::SparseMatrix<double,0,int> const &,Eigen::SparseMatrix<double,0,int> const &,unsigned long long, igl::EigsType, Eigen::PlainObjectBase< Eigen::Matrix<double,-1,-1,0,-1,-1> > &, Eigen::PlainObjectBase<Eigen::Matrix<double,-1,1,0,-1,1> > &);\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/eigs.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_EIGS_H\n#define IGL_EIGS_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <Eigen/Sparse>\n\nnamespace igl\n{\n  // Act like MATLAB's eigs function. Compute the first/last k eigen pairs of\n  // the generalized eigen value problem:\n  //\n  //     A u = s B u\n  //\n  // Solutions are approximate and sorted. \n  //\n  // Ideally one should use ARPACK and the Eigen unsupported ARPACK module.\n  // This implementation does simple, naive power iterations.\n  //\n  // Inputs:\n  //   A  #A by #A symmetric matrix\n  //   B  #A by #A symmetric positive-definite matrix\n  //   k  number of eigen pairs to compute\n  // Outputs:\n  //   sU  #A by k list of sorted eigen vectors (descending)\n  //   sS  k list of sorted eigen values (descending)\n  //\n  // Known issues:\n  //   - only one pair per eigen value is found (no multiples)\n  //   - only the 'sm' small magnitude eigen values are well supported\n  //   \n  enum EigsType\n  {\n    EIGS_TYPE_SM = 0,\n    EIGS_TYPE_LM = 1,\n    NUM_EIGS_TYPES = 2\n  };\n  template <\n    typename Atype,\n    typename Btype,\n    typename DerivedU,\n    typename DerivedS>\n  IGL_INLINE bool eigs(\n    const Eigen::SparseMatrix<Atype> & A,\n    const Eigen::SparseMatrix<Btype> & B,\n    const size_t k,\n    const EigsType type,\n    Eigen::PlainObjectBase<DerivedU> & sU,\n    Eigen::PlainObjectBase<DerivedS> & sS);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#include \"eigs.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/embree/EmbreeIntersector.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//               2014 Christian Schüller <schuellchr@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n// igl function interface for Embree2.2\n//\n// Necessary changes to switch from previous Embree versions:\n// * Use igl:Hit instead of embree:Hit (where id0 -> id)\n// * For Embree2.2\n// * Uncomment #define __USE_RAY_MASK__ in platform.h to enable masking\n\n#ifndef IGL_EMBREE_EMBREE_INTERSECTOR_H\n#define IGL_EMBREE_EMBREE_INTERSECTOR_H\n\n#include \"../Hit.h\"\n#include <Eigen/Geometry>\n#include <Eigen/Core>\n#include <Eigen/Geometry>\n\n#include <embree2/rtcore.h>\n#include <embree2/rtcore_ray.h>\n#include <iostream>\n#include <vector>\n\nnamespace igl\n{\n  namespace embree\n  {\n    class EmbreeIntersector\n    {\n    public:\n      // Initialize embree engine. This will be called on instance `init()`\n      // calls. If already inited then this function does nothing: it is harmless\n      // to call more than once.\n      static inline void global_init();\n    private:\n      // Deinitialize the embree engine.\n      static inline void global_deinit();\n    public:\n      typedef Eigen::Matrix<float,Eigen::Dynamic,3> PointMatrixType;\n      typedef Eigen::Matrix<int,Eigen::Dynamic,3> FaceMatrixType;\n    public:\n      inline EmbreeIntersector();\n    private:\n      // Copying and assignment are not allowed.\n      inline EmbreeIntersector(const EmbreeIntersector & that);\n      inline EmbreeIntersector & operator=(const EmbreeIntersector &);\n    public:\n      virtual inline ~EmbreeIntersector();\n\n      // Initialize with a given mesh.\n      //\n      // Inputs:\n      //   V  #V by 3 list of vertex positions\n      //   F  #F by 3 list of Oriented triangles\n      //   isStatic  scene is optimized for static geometry\n      // Side effects:\n      //   The first time this is ever called the embree engine is initialized.\n      inline void init(\n        const PointMatrixType& V,\n        const FaceMatrixType& F,\n        bool isStatic = false);\n\n      // Initialize with a given mesh.\n      //\n      // Inputs:\n      //   V  vector of #V by 3 list of vertex positions for each geometry\n      //   F  vector of #F by 3 list of Oriented triangles for each geometry\n      //   masks  a 32 bit mask to identify active geometries.\n      //   isStatic  scene is optimized for static geometry\n      // Side effects:\n      //   The first time this is ever called the embree engine is initialized.\n      inline void init(\n        const std::vector<const PointMatrixType*>& V,\n        const std::vector<const FaceMatrixType*>& F,\n        const std::vector<int>& masks,\n        bool isStatic = false);\n\n      // Deinitialize embree datasctructures for current mesh.  Also called on\n      // destruction: no need to call if you just want to init() once and\n      // destroy.\n      inline void deinit();\n\n      // Given a ray find the first hit\n      //\n      // Inputs:\n      //   origin     3d origin point of ray\n      //   direction  3d (not necessarily normalized) direction vector of ray\n      //   tnear      start of ray segment\n      //   tfar       end of ray segment\n      //   masks      a 32 bit mask to identify active geometries.\n      // Output:\n      //   hit        information about hit\n      // Returns true if and only if there was a hit\n      inline bool intersectRay(\n        const Eigen::RowVector3f& origin,\n        const Eigen::RowVector3f& direction,\n        Hit& hit,\n        float tnear = 0,\n        float tfar = std::numeric_limits<float>::infinity(),\n        int mask = 0xFFFFFFFF) const;\n\n      // Given a ray find the first hit\n      // This is a conservative hit test where multiple rays within a small radius\n      // will be tested and only the closesest hit is returned.\n      //\n      // Inputs:\n      //   origin     3d origin point of ray\n      //   direction  3d (not necessarily normalized) direction vector of ray\n      //   tnear      start of ray segment\n      //   tfar       end of ray segment\n      //   masks      a 32 bit mask to identify active geometries.\n      //   geoId      id of geometry mask (default std::numeric_limits<float>::infinity() if no: no masking)\n      //   closestHit true for gets closest hit, false for furthest hit\n      // Output:\n      //   hit        information about hit\n      // Returns true if and only if there was a hit\n      inline bool intersectBeam(\n        const Eigen::RowVector3f& origin,\n        const Eigen::RowVector3f& direction,\n        Hit& hit,\n        float tnear = 0,\n        float tfar = std::numeric_limits<float>::infinity(),\n        int mask = 0xFFFFFFFF,\n        int geoId = -1,\n        bool closestHit = true,\n        unsigned int samples = 4) const;\n\n      // Given a ray find all hits in order\n      //\n      // Inputs:\n      //   origin     3d origin point of ray\n      //   direction  3d (not necessarily normalized) direction vector of ray\n      //   tnear      start of ray segment\n      //   tfar       end of ray segment\n      //   masks      a 32 bit mask to identify active geometries.\n      // Output:\n      //   hit        information about hit\n      //   num_rays   number of rays shot (at least one)\n      // Returns true if and only if there was a hit\n      inline bool intersectRay(\n        const Eigen::RowVector3f& origin,\n        const Eigen::RowVector3f& direction,\n        std::vector<Hit > &hits,\n        int& num_rays,\n        float tnear = 0,\n        float tfar = std::numeric_limits<float>::infinity(),\n        int mask = 0xFFFFFFFF) const;\n\n      // Given a ray find the first hit\n      //\n      // Inputs:\n      //   a    3d first end point of segment\n      //   ab   3d vector from a to other endpoint b\n      // Output:\n      //   hit  information about hit\n      // Returns true if and only if there was a hit\n      inline bool intersectSegment(\n        const Eigen::RowVector3f& a,\n        const Eigen::RowVector3f& ab,\n        Hit &hit,\n        int mask = 0xFFFFFFFF) const;\n\n    private:\n\n      struct Vertex   {float x,y,z,a;};\n      struct Triangle {int v0, v1, v2;};\n\n      RTCScene scene;\n      unsigned geomID;\n      Vertex* vertices;\n      Triangle* triangles;\n      bool initialized;\n\n      inline void createRay(\n        RTCRay& ray,\n        const Eigen::RowVector3f& origin,\n        const Eigen::RowVector3f& direction,\n        float tnear,\n        float tfar,\n        int mask) const;\n    };\n  }\n}\n\n// Implementation\n#include <igl/EPS.h>\n// This unfortunately cannot be a static field of EmbreeIntersector because it\n// would depend on the template and then we might end up with initializing\n// embree twice. If only there was a way to ask embree if it's already\n// initialized...\nnamespace igl\n{\n  namespace embree\n  {\n    // Keeps track of whether the **Global** Embree intersector has been\n    // initialized. This should never been done at the global scope.\n    static bool EmbreeIntersector_inited = false;\n  }\n}\n\ninline void igl::embree::EmbreeIntersector::global_init()\n{\n  if(!EmbreeIntersector_inited)\n  {\n    rtcInit();\n    if(rtcGetError() != RTC_NO_ERROR)\n      std::cerr << \"Embree: An error occured while initialiting embree core!\" << std::endl;\n#ifdef IGL_VERBOSE\n    else\n      std::cerr << \"Embree: core initialized.\" << std::endl;\n#endif\n    EmbreeIntersector_inited = true;\n  }\n}\n\ninline void igl::embree::EmbreeIntersector::global_deinit()\n{\n  EmbreeIntersector_inited = false;\n  rtcExit();\n}\n\ninline igl::embree::EmbreeIntersector::EmbreeIntersector()\n  :\n  //scene(NULL),\n  geomID(0),\n  triangles(NULL),\n  vertices(NULL),\n  initialized(false)\n{\n}\n\ninline igl::embree::EmbreeIntersector::EmbreeIntersector(\n  const EmbreeIntersector &)\n  :// To make -Weffc++ happy\n  //scene(NULL),\n  geomID(0),\n  triangles(NULL),\n  vertices(NULL),\n  initialized(false)\n{\n  assert(false && \"Embree: Copying EmbreeIntersector is not allowed\");\n}\n\ninline igl::embree::EmbreeIntersector & igl::embree::EmbreeIntersector::operator=(\n  const EmbreeIntersector &)\n{\n  assert(false && \"Embree: Assigning an EmbreeIntersector is not allowed\");\n  return *this;\n}\n\n\ninline void igl::embree::EmbreeIntersector::init(\n  const PointMatrixType& V,\n  const FaceMatrixType& F,\n  bool isStatic)\n{\n  std::vector<const PointMatrixType*> Vtemp;\n  std::vector<const FaceMatrixType*> Ftemp;\n  std::vector<int> masks;\n  Vtemp.push_back(&V);\n  Ftemp.push_back(&F);\n  masks.push_back(0xFFFFFFFF);\n  init(Vtemp,Ftemp,masks,isStatic);\n}\n\ninline void igl::embree::EmbreeIntersector::init(\n  const std::vector<const PointMatrixType*>& V,\n  const std::vector<const FaceMatrixType*>& F,\n  const std::vector<int>& masks,\n  bool isStatic)\n{\n\n  if(initialized)\n    deinit();\n\n  using namespace std;\n  global_init();\n\n  if(V.size() == 0 || F.size() == 0)\n  {\n    std::cerr << \"Embree: No geometry specified!\";\n    return;\n  }\n\n  // create a scene\n  RTCSceneFlags flags = RTC_SCENE_ROBUST | RTC_SCENE_HIGH_QUALITY;\n  if(isStatic)\n    flags = flags | RTC_SCENE_STATIC;\n  scene = rtcNewScene(flags,RTC_INTERSECT1);\n\n  for(int g=0;g<(int)V.size();g++)\n  {\n    // create triangle mesh geometry in that scene\n    geomID = rtcNewTriangleMesh(scene,RTC_GEOMETRY_STATIC,F[g]->rows(),V[g]->rows(),1);\n\n    // fill vertex buffer\n    vertices = (Vertex*)rtcMapBuffer(scene,geomID,RTC_VERTEX_BUFFER);\n    for(int i=0;i<(int)V[g]->rows();i++)\n    {\n      vertices[i].x = (float)V[g]->coeff(i,0);\n      vertices[i].y = (float)V[g]->coeff(i,1);\n      vertices[i].z = (float)V[g]->coeff(i,2);\n    }\n    rtcUnmapBuffer(scene,geomID,RTC_VERTEX_BUFFER);\n\n    // fill triangle buffer\n    triangles = (Triangle*) rtcMapBuffer(scene,geomID,RTC_INDEX_BUFFER);\n    for(int i=0;i<(int)F[g]->rows();i++)\n    {\n      triangles[i].v0 = (int)F[g]->coeff(i,0);\n      triangles[i].v1 = (int)F[g]->coeff(i,1);\n      triangles[i].v2 = (int)F[g]->coeff(i,2);\n    }\n    rtcUnmapBuffer(scene,geomID,RTC_INDEX_BUFFER);\n\n    rtcSetMask(scene,geomID,masks[g]);\n  }\n\n  rtcCommit(scene);\n\n  if(rtcGetError() != RTC_NO_ERROR)\n      std::cerr << \"Embree: An error occured while initializing the provided geometry!\" << endl;\n#ifdef IGL_VERBOSE\n  else\n    std::cerr << \"Embree: geometry added.\" << endl;\n#endif\n\n  initialized = true;\n}\n\nigl::embree::EmbreeIntersector\n::~EmbreeIntersector()\n{\n  if(initialized)\n    deinit();\n}\n\nvoid igl::embree::EmbreeIntersector::deinit()\n{\n  if(EmbreeIntersector_inited && scene)\n  {\n    rtcDeleteScene(scene);\n\n    if(rtcGetError() != RTC_NO_ERROR)\n    {\n        std::cerr << \"Embree: An error occured while resetting!\" << std::endl;\n    }\n#ifdef IGL_VERBOSE\n    else\n    {\n      std::cerr << \"Embree: geometry removed.\" << std::endl;\n    }\n#endif\n  }\n}\n\ninline bool igl::embree::EmbreeIntersector::intersectRay(\n  const Eigen::RowVector3f& origin,\n  const Eigen::RowVector3f& direction,\n  Hit& hit,\n  float tnear,\n  float tfar,\n  int mask) const\n{\n  RTCRay ray;\n  createRay(ray, origin,direction,tnear,tfar,mask);\n\n  // shot ray\n  rtcIntersect(scene,ray);\n#ifdef IGL_VERBOSE\n  if(rtcGetError() != RTC_NO_ERROR)\n      std::cerr << \"Embree: An error occured while resetting!\" << std::endl;\n#endif\n\n  if((unsigned)ray.geomID != RTC_INVALID_GEOMETRY_ID)\n  {\n    hit.id = ray.primID;\n    hit.gid = ray.geomID;\n    hit.u = ray.u;\n    hit.v = ray.v;\n    hit.t = ray.tfar;\n    return true;\n  }\n\n  return false;\n}\n\ninline bool igl::embree::EmbreeIntersector::intersectBeam(\n      const Eigen::RowVector3f& origin,\n      const Eigen::RowVector3f& direction,\n      Hit& hit,\n      float tnear,\n      float tfar,\n      int mask,\n      int geoId,\n      bool closestHit,\n\t  unsigned int samples) const\n{\n  bool hasHit = false;\n  Hit bestHit;\n\n  if(closestHit)\n    bestHit.t = std::numeric_limits<float>::max();\n  else\n    bestHit.t = 0;\n\n  if((intersectRay(origin,direction,hit,tnear,tfar,mask) && (hit.gid == geoId || geoId == -1)))\n  {\n    bestHit = hit;\n  }\n\n  // sample points around actual ray (conservative hitcheck)\n  const float eps= 1e-5;\n\n  Eigen::RowVector3f up(0,1,0);\n  Eigen::RowVector3f offset = direction.cross(up).normalized();\n\n  Eigen::Matrix3f rot = Eigen::AngleAxis<float>(2*3.14159265358979/samples,direction).toRotationMatrix();\n\n  for(int r=0;r<(int)samples;r++)\n  {\n    if(intersectRay(origin+offset*eps,direction,hit,tnear,tfar,mask) && \n        ((closestHit && (hit.t < bestHit.t)) || \n           (!closestHit && (hit.t > bestHit.t)))  &&\n        (hit.gid == geoId || geoId == -1))\n    {\n      bestHit = hit;\n      hasHit = true;\n    }\n    offset = rot*offset.transpose();\n  }\n\n  hit = bestHit;\n  return hasHit;\n}\n\ninline bool\nigl::embree::EmbreeIntersector\n::intersectRay(\n  const Eigen::RowVector3f& origin,\n  const Eigen::RowVector3f& direction,\n  std::vector<Hit > &hits,\n  int& num_rays,\n  float tnear,\n  float tfar,\n  int mask) const\n{\n  using namespace std;\n  num_rays = 0;\n  hits.clear();\n  int last_id0 = -1;\n  double self_hits = 0;\n  // This epsilon is directly correleated to the number of missed hits, smaller\n  // means more accurate and slower\n  //const double eps = DOUBLE_EPS;\n  const double eps = FLOAT_EPS;\n  double min_t = tnear;\n  bool large_hits_warned = false;\n  RTCRay ray;\n  createRay(ray,origin,direction,tnear,tfar,mask);\n\n  while(true)\n  {\n    ray.tnear = min_t;\n    ray.tfar = tfar;\n    ray.geomID = RTC_INVALID_GEOMETRY_ID;\n    ray.primID = RTC_INVALID_GEOMETRY_ID;\n    ray.instID = RTC_INVALID_GEOMETRY_ID;\n    num_rays++;\n    rtcIntersect(scene,ray);\n    if((unsigned)ray.geomID != RTC_INVALID_GEOMETRY_ID)\n    {\n      // Hit self again, progressively advance\n      if(ray.primID == last_id0 || ray.tfar <= min_t)\n      {\n        // push min_t a bit more\n        //double t_push = pow(2.0,self_hits-4)*(hit.t<eps?eps:hit.t);\n        double t_push = pow(2.0,self_hits)*eps;\n        #ifdef IGL_VERBOSE\n        std::cerr<<\"  t_push: \"<<t_push<<endl;\n        #endif\n        //o = o+t_push*d;\n        min_t += t_push;\n        self_hits++;\n      }\n      else\n      {\n        Hit hit;\n        hit.id = ray.primID;\n        hit.gid = ray.geomID;\n        hit.u = ray.u;\n        hit.v = ray.v;\n        hit.t = ray.tfar;\n        hits.push_back(hit);\n#ifdef IGL_VERBOSE\n        std::cerr<<\"  t: \"<<hit.t<<endl;\n#endif\n        // Instead of moving origin, just change min_t. That way calculations\n        // all use exactly same origin values\n        min_t = ray.tfar;\n\n        // reset t_scale\n        self_hits = 0;\n      }\n      last_id0 = ray.primID;\n    }\n    else\n      break; // no more hits\n\n    if(hits.size()>1000 && !large_hits_warned)\n    {\n      std::cout<<\"Warning: Large number of hits...\"<<endl;\n      std::cout<<\"[ \";\n      for(vector<Hit>::iterator hit = hits.begin(); hit != hits.end();hit++)\n      {\n        std::cout<<(hit->id+1)<<\" \";\n      }\n\n      std::cout.precision(std::numeric_limits< double >::digits10);\n      std::cout<<\"[ \";\n\n      for(vector<Hit>::iterator hit = hits.begin(); hit != hits.end(); hit++)\n      {\n        std::cout<<(hit->t)<<endl;;\n      }\n\n      std::cout<<\"]\"<<endl;\n      large_hits_warned = true;\n\n      return hits.empty();\n    }\n  }\n\n  return hits.empty();\n}\n\ninline bool\nigl::embree::EmbreeIntersector\n::intersectSegment(const Eigen::RowVector3f& a, const Eigen::RowVector3f& ab, Hit &hit, int mask) const\n{\n  RTCRay ray;\n  createRay(ray,a,ab,0,1.0,mask);\n\n  rtcIntersect(scene,ray);\n\n  if((unsigned)ray.geomID != RTC_INVALID_GEOMETRY_ID)\n  {\n    hit.id = ray.primID;\n    hit.gid = ray.geomID;\n    hit.u = ray.u;\n    hit.v = ray.v;\n    hit.t = ray.tfar;\n    return true;\n  }\n\n  return false;\n}\n\ninline void\nigl::embree::EmbreeIntersector\n::createRay(RTCRay& ray, const Eigen::RowVector3f& origin, const Eigen::RowVector3f& direction, float tnear, float tfar, int mask) const\n{\n  ray.org[0] = origin[0];\n  ray.org[1] = origin[1];\n  ray.org[2] = origin[2];\n  ray.dir[0] = direction[0];\n  ray.dir[1] = direction[1];\n  ray.dir[2] = direction[2];\n  ray.tnear = tnear;\n  ray.tfar = tfar;\n  ray.geomID = RTC_INVALID_GEOMETRY_ID;\n  ray.primID = RTC_INVALID_GEOMETRY_ID;\n  ray.instID = RTC_INVALID_GEOMETRY_ID;\n  ray.mask = mask;\n  ray.time = 0.0f;\n}\n\n#endif //EMBREE_INTERSECTOR_H\n"
  },
  {
    "path": "libs/libigl/include/igl/embree/Embree_convenience.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_EMBREE_EMBREE_CONVENIENCE_H\n#define IGL_EMBREE_EMBREE_CONVENIENCE_H\n\n#undef interface\n#undef near\n#undef far\n// Why are these in quotes? isn't that a bad idea?\n#ifdef __GNUC__\n// This is how it should be done\n#  if __GNUC__ >= 4\n#    if __GNUC_MINOR__ >= 6\n#      pragma GCC diagnostic push\n#      pragma GCC diagnostic ignored \"-Weffc++\"\n#    endif\n#  endif\n// This is a hack\n#  pragma GCC system_header\n#endif\n#include <embree/include/embree.h>\n#include <embree/include/intersector1.h>\n#include <embree/common/ray.h>\n#ifdef __GNUC__\n#  if __GNUC__ >= 4\n#    if __GNUC_MINOR__ >= 6\n#      pragma GCC diagnostic pop\n#    endif\n#  endif\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/embree/Hit.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//               2014 Christian Schüller <schuellchr@gmail.com> \n//\n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_HIT_H\n#define IGL_HIT_H\n\nnamespace igl\n{\n  // Reimplementation of the embree::Hit struct from embree1.0\n  struct Hit\n  {\n    int id; // primitive id\n    int gid; // geometry id\n    float u,v; // barycentric coordinates\n    float t; // distance = direction*t to intersection\n  };\n}\n#endif \n"
  },
  {
    "path": "libs/libigl/include/igl/embree/ambient_occlusion.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"ambient_occlusion.h\"\n#include \"../ambient_occlusion.h\"\n#include \"EmbreeIntersector.h\"\n#include \"../Hit.h\"\n\ntemplate <\n  typename DerivedP,\n  typename DerivedN,\n  typename DerivedS >\nIGL_INLINE void igl::embree::ambient_occlusion(\n  const igl::embree::EmbreeIntersector & ei,\n  const Eigen::PlainObjectBase<DerivedP> & P,\n  const Eigen::PlainObjectBase<DerivedN> & N,\n  const int num_samples,\n  Eigen::PlainObjectBase<DerivedS> & S)\n{\n  const auto & shoot_ray = [&ei](\n    const Eigen::Vector3f& s,\n    const Eigen::Vector3f& dir)->bool\n  {\n    igl::Hit hit;\n    const float tnear = 1e-4f;\n    return ei.intersectRay(s,dir,hit,tnear);\n  };\n  return igl::ambient_occlusion(shoot_ray,P,N,num_samples,S);\n}\n\ntemplate <\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedP,\n  typename DerivedN,\n  typename DerivedS >\nIGL_INLINE void igl::embree::ambient_occlusion(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  const Eigen::PlainObjectBase<DerivedP> & P,\n  const Eigen::PlainObjectBase<DerivedN> & N,\n  const int num_samples,\n  Eigen::PlainObjectBase<DerivedS> & S)\n{\n  using namespace Eigen;\n  EmbreeIntersector ei;\n  ei.init(V.template cast<float>(),F.template cast<int>());\n  ambient_occlusion(ei,P,N,num_samples,S);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::embree::ambient_occlusion<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(igl::embree::EmbreeIntersector const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\ntemplate void igl::embree::ambient_occlusion<Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(igl::embree::EmbreeIntersector const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\ntemplate void igl::embree::ambient_occlusion<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\ntemplate void igl::embree::ambient_occlusion<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\ntemplate void igl::embree::ambient_occlusion<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/embree/ambient_occlusion.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_EMBREE_AMBIENT_OCCLUSION_H\n#define IGL_EMBREE_AMBIENT_OCCLUSION_H\n#include \"../igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  namespace embree\n  {\n    // Forward define\n    class EmbreeIntersector;\n    // Compute ambient occlusion per given point\n    //\n    // Inputs:\n    //    ei  EmbreeIntersector containing (V,F)\n    //    P  #P by 3 list of origin points\n    //    N  #P by 3 list of origin normals\n    // Outputs:\n    //    S  #P list of ambient occlusion values between 1 (fully occluded) and\n    //      0 (not occluded)\n    //\n    template <\n      typename DerivedP,\n      typename DerivedN,\n      typename DerivedS >\n    IGL_INLINE void ambient_occlusion(\n      const EmbreeIntersector & ei,\n      const Eigen::PlainObjectBase<DerivedP> & P,\n      const Eigen::PlainObjectBase<DerivedN> & N,\n      const int num_samples,\n      Eigen::PlainObjectBase<DerivedS> & S);\n    // Wrapper which builds new EmbreeIntersector for (V,F). That's expensive so\n    // avoid this if repeatedly calling.\n    template <\n      typename DerivedV,\n      typename DerivedF,\n      typename DerivedP,\n      typename DerivedN,\n      typename DerivedS >\n    IGL_INLINE void ambient_occlusion(\n      const Eigen::PlainObjectBase<DerivedV> & V,\n      const Eigen::PlainObjectBase<DerivedF> & F,\n      const Eigen::PlainObjectBase<DerivedP> & P,\n      const Eigen::PlainObjectBase<DerivedN> & N,\n      const int num_samples,\n      Eigen::PlainObjectBase<DerivedS> & S);\n  }\n};\n#ifndef IGL_STATIC_LIBRARY\n#  include \"ambient_occlusion.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/embree/bone_heat.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"bone_heat.h\"\n#include \"EmbreeIntersector.h\"\n#include \"bone_visible.h\"\n#include \"../project_to_line_segment.h\"\n#include \"../cotmatrix.h\"\n#include \"../massmatrix.h\"\n#include \"../mat_min.h\"\n#include <Eigen/Sparse>\n\nbool igl::embree::bone_heat(\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  const Eigen::MatrixXd & C,\n  const Eigen::VectorXi & P,\n  const Eigen::MatrixXi & BE,\n  const Eigen::MatrixXi & CE,\n  Eigen::MatrixXd & W)\n{\n  using namespace std;\n  using namespace Eigen;\n  assert(CE.rows() == 0 && \"Cage edges not supported.\");\n  assert(C.cols() == V.cols() && \"V and C should have same #cols\");\n  assert(BE.cols() == 2 && \"BE should have #cols=2\");\n  assert(F.cols() == 3 && \"F should contain triangles.\");\n  assert(V.cols() == 3 && \"V should contain 3D positions.\");\n\n  const int n = V.rows();\n  const int np = P.rows();\n  const int nb = BE.rows();\n  const int m = np + nb;\n\n  // \"double sided lighting\"\n  MatrixXi FF;\n  FF.resize(F.rows()*2,F.cols());\n  FF << F, F.rowwise().reverse();\n  // Initialize intersector\n  EmbreeIntersector ei;\n  ei.init(V.cast<float>(),F.cast<int>());\n\n  typedef Matrix<bool,Dynamic,1> VectorXb;\n  typedef Matrix<bool,Dynamic,Dynamic> MatrixXb;\n  MatrixXb vis_mask(n,m);\n  // Distances\n  MatrixXd D(n,m);\n  // loop over points\n  for(int j = 0;j<np;j++)\n  {\n    const Vector3d p = C.row(P(j));\n    D.col(j) = (V.rowwise()-p.transpose()).rowwise().norm();\n    VectorXb vj;\n    bone_visible(V,F,ei,p,p,vj);\n    vis_mask.col(j) = vj;\n  }\n\n  // loop over bones\n  for(int j = 0;j<nb;j++)\n  {\n    const Vector3d s = C.row(BE(j,0));\n    const Vector3d d = C.row(BE(j,1));\n    VectorXd t,sqrD;\n    project_to_line_segment(V,s,d,t,sqrD);\n    D.col(np+j) = sqrD.array().sqrt();\n    VectorXb vj;\n    bone_visible(V,F,ei,s,d,vj);\n    vis_mask.col(np+j) = vj;\n  }\n\n  if(CE.rows() > 0)\n  {\n    cerr<<\"Error: Cage edges are not supported. Ignored.\"<<endl;\n  }\n\n  MatrixXd PP = MatrixXd::Zero(n,m);\n  VectorXd min_D;\n  VectorXd Hdiag = VectorXd::Zero(n);\n  VectorXi J;\n  mat_min(D,2,min_D,J);\n  for(int i = 0;i<n;i++)\n  {\n    PP(i,J(i)) = 1;\n    if(vis_mask(i,J(i)))\n    {\n      double hii = pow(min_D(i),-2.); \n      Hdiag(i) = (hii>1e10?1e10:hii);\n    }\n  }\n  SparseMatrix<double> Q,L,M;\n  cotmatrix(V,F,L);\n  massmatrix(V,F,MASSMATRIX_TYPE_DEFAULT,M);\n  const auto & H = Hdiag.asDiagonal();\n  Q = (-L+M*H);\n  SimplicialLLT <SparseMatrix<double > > llt;\n  llt.compute(Q);\n  switch(llt.info())\n  {\n    case Eigen::Success:\n      break;\n    case Eigen::NumericalIssue:\n      cerr<<\"Error: Numerical issue.\"<<endl;\n      return false;\n    default:\n      cerr<<\"Error: Other.\"<<endl;\n      return false;\n  }\n\n  const auto & rhs = M*H*PP;\n  W = llt.solve(rhs);\n  return true;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/embree/bone_heat.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_EMBREE_BONE_HEAT_H\n#define IGL_EMBREE_BONE_HEAT_H\n#include \"../igl_inline.h\"\n#include <Eigen/Core>\n\nnamespace igl\n{\n  namespace embree\n  {\n    // BONE_HEAT  Compute skinning weights W given a surface mesh (V,F) and an\n    // internal skeleton (C,BE) according to \"Automatic Rigging\" [Baran and\n    // Popovic 2007].\n    //\n    // Inputs:\n    //   V  #V by 3 list of mesh vertex positions\n    //   F  #F by 3 list of mesh corner indices into V\n    //   C  #C by 3 list of joint locations\n    //   P  #P list of point handle indices into C\n    //   BE  #BE by 2 list of bone edge indices into C\n    //   CE  #CE by 2 list of cage edge indices into **P**\n    // Outputs:\n    //   W  #V by #P+#BE matrix of weights.\n    // Returns true only on success.\n    //\n    IGL_INLINE bool bone_heat(\n      const Eigen::MatrixXd & V,\n      const Eigen::MatrixXi & F,\n      const Eigen::MatrixXd & C,\n      const Eigen::VectorXi & P,\n      const Eigen::MatrixXi & BE,\n      const Eigen::MatrixXi & CE,\n      Eigen::MatrixXd & W);\n  }\n};\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"bone_heat.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/embree/bone_visible.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"bone_visible.h\"\n#include \"../project_to_line.h\"\n#include \"../EPS.h\"\n#include \"../Hit.h\"\n#include \"../Timer.h\"\n#include <iostream>\n\ntemplate <\n  typename DerivedV, \n  typename DerivedF, \n  typename DerivedSD,\n  typename Derivedflag>\nIGL_INLINE void igl::embree::bone_visible(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  const Eigen::PlainObjectBase<DerivedSD> & s,\n  const Eigen::PlainObjectBase<DerivedSD> & d,\n  Eigen::PlainObjectBase<Derivedflag>  & flag)\n{\n  // \"double sided lighting\"\n  Eigen::PlainObjectBase<DerivedF> FF;\n  FF.resize(F.rows()*2,F.cols());\n  FF << F, F.rowwise().reverse();\n  // Initialize intersector\n  EmbreeIntersector ei;\n  ei.init(V.template cast<float>(),FF.template cast<int>());\n  return bone_visible(V,F,ei,s,d,flag);\n}\n\ntemplate <\n  typename DerivedV, \n  typename DerivedF, \n  typename DerivedSD,\n  typename Derivedflag>\nIGL_INLINE void igl::embree::bone_visible(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  const EmbreeIntersector & ei,\n  const Eigen::PlainObjectBase<DerivedSD> & s,\n  const Eigen::PlainObjectBase<DerivedSD> & d,\n  Eigen::PlainObjectBase<Derivedflag>  & flag)\n{\n  using namespace std;\n  using namespace Eigen;\n  flag.resize(V.rows());\n  const double sd_norm = (s-d).norm();\n  // Embree seems to be parallel when constructing but not when tracing rays\n#pragma omp parallel for\n  // loop over mesh vertices\n  for(int v = 0;v<V.rows();v++)\n  {\n    const Vector3d Vv = V.row(v);\n    // Project vertex v onto line segment sd\n    //embree.intersectSegment\n    double t,sqrd;\n    Vector3d projv;\n    // degenerate bone, just snap to s\n    if(sd_norm < DOUBLE_EPS)\n    {\n      t = 0;\n      sqrd = (Vv-s).array().pow(2).sum();\n      projv = s;\n    }else\n    {\n      // project onto (infinite) line\n      project_to_line(\n        Vv(0),Vv(1),Vv(2),s(0),s(1),s(2),d(0),d(1),d(2),\n        projv(0),projv(1),projv(2),t,sqrd);\n      // handle projections past endpoints\n      if(t<0)\n      {\n        t = 0;\n        sqrd = (Vv-s).array().pow(2).sum();\n        projv = s;\n      } else if(t>1)\n      {\n        t = 1;\n        sqrd = (Vv-d).array().pow(2).sum();\n        projv = d;\n      }\n    }\n    igl::Hit hit;\n    // perhaps 1.0 should be 1.0-epsilon, or actually since we checking the\n    // incident face, perhaps 1.0 should be 1.0+eps\n    const Vector3d dir = (Vv-projv)*1.0;\n    if(ei.intersectSegment(\n       projv.template cast<float>(),\n       dir.template cast<float>(), \n       hit))\n    {\n      // mod for double sided lighting\n      const int fi = hit.id % F.rows();\n\n      //if(v == 1228-1)\n      //{\n      //  Vector3d bc,P;\n      //  bc << 1 - hit.u - hit.v, hit.u, hit.v; // barycentric\n      //  P = V.row(F(fi,0))*bc(0) + \n      //      V.row(F(fi,1))*bc(1) + \n      //      V.row(F(fi,2))*bc(2);\n      //  cout<<(fi+1)<<endl;\n      //  cout<<bc.transpose()<<endl;\n      //  cout<<P.transpose()<<endl;\n      //  cout<<hit.t<<endl;\n      //  cout<<(projv + dir*hit.t).transpose()<<endl;\n      //  cout<<Vv.transpose()<<endl;\n      //}\n\n      // Assume hit is valid, so not visible\n      flag(v) = false;\n      // loop around corners of triangle\n      for(int c = 0;c<F.cols();c++)\n      {\n        if(F(fi,c) == v)\n        {\n          // hit self, so no hits before, so vertex v is visible\n          flag(v) = true;\n          break;\n        }\n      }\n      // Hit is actually past v\n      if(!flag(v) && (hit.t*hit.t*dir.squaredNorm())>sqrd)\n      {\n        flag(v) = true;\n      }\n    }else\n    {\n      // no hit so vectex v is visible\n      flag(v) = true;\n    }\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::embree::bone_visible<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<bool, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 1, 0, 3, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 1, 0, 3, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<bool, -1, 1, 0, -1, 1> >&);\ntemplate void igl::embree::bone_visible<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<bool, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<bool, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/embree/bone_visible.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_EMBREE_BONE_VISIBLE_H\n#define IGL_EMBREE_BONE_VISIBLE_H\n#include <igl/igl_inline.h>\n#include <Eigen/Core>\n#include \"EmbreeIntersector.h\"\nnamespace igl\n{\n  namespace embree\n  {\n    //\n    // BONE_VISIBLE  test whether vertices of mesh are \"visible\" to a given bone,\n    // where \"visible\" is defined as in [Baran & Popovic 07]. Instead of checking\n    // whether each point can see *any* of the bone, we just check if each point\n    // can see its own projection onto the bone segment. In other words, we project\n    // each vertex v onto the bone, projv. Then we check if there are any\n    // intersections between the line segment (projv-->v) and the mesh.\n    //\n    // [flag] = bone_visible(V,F,s,d);\n    //\n    // Input:\n    //    V  #V by 3 list of vertex positions\n    //    F  #F by 3 list of triangle indices\n    //    s  row vector of position of start end point of bone\n    //    d  row vector of position of dest end point of bone\n    // Output:\n    //    flag  #V by 1 list of bools (true) visible, (false) obstructed\n    //\n    // Note: This checks for hits along the segment which are facing in *any*\n    // direction from the ray.\n    //\n    template <\n      typename DerivedV, \n      typename DerivedF, \n      typename DerivedSD,\n      typename Derivedflag>\n    IGL_INLINE void bone_visible(\n      const Eigen::PlainObjectBase<DerivedV> & V,\n      const Eigen::PlainObjectBase<DerivedF> & F,\n      const Eigen::PlainObjectBase<DerivedSD> & s,\n      const Eigen::PlainObjectBase<DerivedSD> & d,\n      Eigen::PlainObjectBase<Derivedflag>  & flag);\n    // Inputs:\n    //  ei  EmbreeIntersector for mesh (V,F) should be double sided\n    template <\n      typename DerivedV, \n      typename DerivedF, \n      typename DerivedSD,\n      typename Derivedflag>\n    IGL_INLINE void bone_visible(\n      const Eigen::PlainObjectBase<DerivedV> & V,\n      const Eigen::PlainObjectBase<DerivedF> & F,\n      const EmbreeIntersector & ei,\n      const Eigen::PlainObjectBase<DerivedSD> & s,\n      const Eigen::PlainObjectBase<DerivedSD> & d,\n      Eigen::PlainObjectBase<Derivedflag>  & flag);\n  }\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"bone_visible.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/embree/line_mesh_intersection.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"line_mesh_intersection.h\"\n#include \"../Hit.h\"\n\n// For error printing\n#include <cstdio>\n#include <vector>\n\n#include <igl/per_vertex_normals.h>\n#include <igl/embree/EmbreeIntersector.h>\n\ntemplate <typename ScalarMatrix, typename IndexMatrix>\nIGL_INLINE ScalarMatrix igl::embree::line_mesh_intersection\n(\n const ScalarMatrix & V_source,\n const ScalarMatrix  & N_source,\n const ScalarMatrix & V_target,\n const IndexMatrix  & F_target\n)\n{\n\n  double tol = 0.00001;\n\n  Eigen::MatrixXd ray_pos = V_source;\n  Eigen::MatrixXd ray_dir = N_source;\n\n  // Allocate matrix for the result\n  ScalarMatrix R;\n  R.resize(V_source.rows(), 3);\n\n  // Initialize embree\n  EmbreeIntersector embree;\n  embree.init(V_target.template cast<float>(),F_target.template cast<int>());\n\n  // Shoot rays from the source to the target\n  for (unsigned i=0; i<ray_pos.rows(); ++i)\n  {\n    igl::Hit A,B;\n    // Shoot ray A\n    Eigen::RowVector3d A_pos = ray_pos.row(i) + tol * ray_dir.row(i);\n    Eigen::RowVector3d A_dir = -ray_dir.row(i);\n\n    bool A_hit = embree.intersectBeam(A_pos.cast<float>(), A_dir.cast<float>(),A);\n\n    Eigen::RowVector3d B_pos = ray_pos.row(i) - tol * ray_dir.row(i);\n    Eigen::RowVector3d B_dir = ray_dir.row(i);\n\n    bool B_hit = embree.intersectBeam(B_pos.cast<float>(), B_dir.cast<float>(),B);\n\n\n    int choice = -1;\n\n    if (A_hit && ! B_hit)\n      choice = 0;\n    else if (!A_hit && B_hit)\n      choice = 1;\n    else if (A_hit && B_hit)\n      choice = A.t > B.t;\n\n    Eigen::RowVector3d temp;\n\n    if (choice == -1)\n      temp << -1, 0, 0;\n    else if (choice == 0)\n      temp << A.id, A.u, A.v;\n    else if (choice == 1)\n      temp << B.id, B.u, B.v;\n\n    R.row(i) = temp;\n\n  }\n\n  return R;\n\n}\n\n#ifdef IGL_STATIC_LIBRARY\ntemplate Eigen::Matrix<double, -1, -1, 0, -1, -1> igl::embree::line_mesh_intersection<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/embree/line_mesh_intersection.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Daniele Panozzo <daniele.panozzo@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_EMBREE_LINE_MESH_INTERSECTION_H\n#define IGL_EMBREE_LINE_MESH_INTERSECTION_H\n#include <igl/igl_inline.h>\n\n#include <Eigen/Dense>\n#include <Eigen/Sparse>\n#include <vector>\n\nnamespace igl \n{\n  namespace embree\n  {\n    // Project the point cloud V_source onto the triangle mesh\n    // V_target,F_target. \n    // A ray is casted for every vertex in the direction specified by \n    // N_source and its opposite.\n    //\n    // Input:\n    // V_source: #Vx3 Vertices of the source mesh\n    // N_source: #Vx3 Normals of the point cloud\n    // V_target: #V2x3 Vertices of the target mesh\n    // F_target: #F2x3 Faces of the target mesh\n    //\n    // Output:\n    // #Vx3 matrix of baricentric coordinate. Each row corresponds to \n    // a vertex of the projected mesh and it has the following format:\n    // id b1 b2. id is the id of a face of the source mesh. b1 and b2 are \n    // the barycentric coordinates wrt the first two edges of the triangle\n    // To convert to standard global coordinates, see barycentric_to_global.h\n    template <typename ScalarMatrix, typename IndexMatrix>\n    IGL_INLINE ScalarMatrix line_mesh_intersection\n    (\n     const ScalarMatrix & V_source,\n     const ScalarMatrix  & N_source,\n     const ScalarMatrix & V_target,\n     const IndexMatrix  & F_target\n     );\n  }\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"line_mesh_intersection.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/embree/reorient_facets_raycast.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"reorient_facets_raycast.h\"\n#include \"../per_face_normals.h\"\n#include \"../doublearea.h\"\n#include \"../random_dir.h\"\n#include \"../bfs_orient.h\"\n#include \"EmbreeIntersector.h\"\n#include <iostream>\n#include <random>\n#include <ctime>\n#include <limits>\n\ntemplate <\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedI,\n  typename DerivedC>\nIGL_INLINE void igl::embree::reorient_facets_raycast(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  int rays_total,\n  int rays_minimum,\n  bool facet_wise,\n  bool use_parity,\n  bool is_verbose,\n  Eigen::PlainObjectBase<DerivedI> & I,\n  Eigen::PlainObjectBase<DerivedC> & C)\n{\n  using namespace Eigen;\n  using namespace std;\n  assert(F.cols() == 3);\n  assert(V.cols() == 3);\n\n  // number of faces\n  const int m = F.rows();\n\n  MatrixXi FF = F;\n  if (facet_wise) {\n    C.resize(m);\n    for (int i = 0; i < m; ++i) C(i) = i;\n\n  } else {\n    if (is_verbose) cout << \"extracting patches... \";\n    bfs_orient(F,FF,C);\n  }\n  if (is_verbose) cout << (C.maxCoeff() + 1)  << \" components. \";\n\n  // number of patches\n  const int num_cc = C.maxCoeff()+1;\n\n  // Init Embree\n  EmbreeIntersector ei;\n  ei.init(V.template cast<float>(),FF);\n\n  // face normal\n  MatrixXd N;\n  per_face_normals(V,FF,N);\n\n  // face area\n  Matrix<typename DerivedV::Scalar,Dynamic,1> A;\n  doublearea(V,FF,A);\n  double area_total = A.sum();\n\n  // determine number of rays per component according to its area\n  VectorXd area_per_component;\n  area_per_component.setZero(num_cc);\n  for (int f = 0; f < m; ++f)\n  {\n    area_per_component(C(f)) += A(f);\n  }\n  VectorXi num_rays_per_component(num_cc);\n  for (int c = 0; c < num_cc; ++c)\n  {\n    num_rays_per_component(c) = max<int>(static_cast<int>(rays_total * area_per_component(c) / area_total), rays_minimum);\n  }\n  rays_total = num_rays_per_component.sum();\n\n  // generate all the rays\n  if (is_verbose) cout << \"generating rays... \";\n  uniform_real_distribution<float> rdist;\n  mt19937 prng;\n  prng.seed(time(nullptr));\n  vector<int     > ray_face;\n  vector<Vector3f> ray_ori;\n  vector<Vector3f> ray_dir;\n  ray_face.reserve(rays_total);\n  ray_ori .reserve(rays_total);\n  ray_dir .reserve(rays_total);\n  for (int c = 0; c < num_cc; ++c)\n  {\n    if (area_per_component[c] == 0)\n    {\n      continue;\n    }\n    vector<int> CF;     // set of faces per component\n    vector<double> CF_area;\n    for (int f = 0; f < m; ++f)\n    {\n      if (C(f)==c)\n      {\n        CF.push_back(f);\n        CF_area.push_back(A(f));\n      }\n    }\n    // discrete distribution for random selection of faces with probability proportional to their areas\n    discrete_distribution<int> ddist(CF.size(), 0, CF.size(), [&](double i){ return CF_area[static_cast<int>(i)]; });       // simple ctor of (Iter, Iter) not provided by the stupid VC11/12\n    for (int i = 0; i < num_rays_per_component[c]; ++i)\n    {\n      int f = CF[ddist(prng)];          // select face with probability proportional to face area\n      float s = rdist(prng);            // random barycentric coordinate (reference: Generating Random Points in Triangles [Turk, Graphics Gems I 1990])\n      float t = rdist(prng);\n      float sqrt_t = sqrtf(t);\n      float a = 1 - sqrt_t;\n      float b = (1 - s) * sqrt_t;\n      float c = s * sqrt_t;\n      Vector3f p = a * V.row(FF(f,0)).template cast<float>().eval()       // be careful with the index!!!\n                 + b * V.row(FF(f,1)).template cast<float>().eval()\n                 + c * V.row(FF(f,2)).template cast<float>().eval();\n      Vector3f n = N.row(f).cast<float>();\n      if (n.isZero()) continue;\n      // random direction in hemisphere around n (avoid too grazing angle)\n      Vector3f d;\n      while (true) {\n        d = random_dir().cast<float>();\n        float ndotd = n.dot(d);\n        if (fabsf(ndotd) < 0.1f)\n        {\n          continue;\n        }\n        if (ndotd < 0)\n        {\n          d *= -1.0f;\n        }\n        break;\n      }\n      ray_face.push_back(f);\n      ray_ori .push_back(p);\n      ray_dir .push_back(d);\n\n      if (is_verbose && ray_face.size() % (rays_total / 10) == 0) cout << \".\";\n    }\n  }\n  if (is_verbose) cout << ray_face.size()  << \" rays. \";\n\n  // per component voting: first=front, second=back\n  vector<pair<float, float>> C_vote_distance(num_cc, make_pair(0, 0));      // sum of distance between ray origin and intersection\n  vector<pair<int  , int  >> C_vote_infinity(num_cc, make_pair(0, 0));      // number of rays reaching infinity\n  vector<pair<int  , int  >> C_vote_parity(num_cc, make_pair(0, 0));        // sum of parity count for each ray\n\n  if (is_verbose) cout << \"shooting rays... \";\n#pragma omp parallel for\n  for (int i = 0; i < (int)ray_face.size(); ++i)\n  {\n    int      f = ray_face[i];\n    Vector3f o = ray_ori [i];\n    Vector3f d = ray_dir [i];\n    int c = C(f);\n\n    // shoot ray toward front & back\n    vector<Hit> hits_front;\n    vector<Hit> hits_back;\n    int num_rays_front;\n    int num_rays_back;\n    ei.intersectRay(o,  d, hits_front, num_rays_front);\n    ei.intersectRay(o, -d, hits_back , num_rays_back );\n    if (!hits_front.empty() && hits_front[0].id == f) hits_front.erase(hits_front.begin());\n    if (!hits_back .empty() && hits_back [0].id == f) hits_back .erase(hits_back .begin());\n\n    if (use_parity) {\n#pragma omp atomic\n      C_vote_parity[c].first  += hits_front.size() % 2;\n#pragma omp atomic\n      C_vote_parity[c].second += hits_back .size() % 2;\n\n    } else {\n      if (hits_front.empty())\n      {\n#pragma omp atomic\n        C_vote_infinity[c].first++;\n      } else {\n#pragma omp atomic\n        C_vote_distance[c].first += hits_front[0].t;\n      }\n\n      if (hits_back.empty())\n      {\n#pragma omp atomic\n        C_vote_infinity[c].second++;\n      } else {\n#pragma omp atomic\n        C_vote_distance[c].second += hits_back[0].t;\n      }\n    }\n  }\n\n  I.resize(m);\n  for(int f = 0; f < m; ++f)\n  {\n    int c = C(f);\n    if (use_parity) {\n      I(f) = C_vote_parity[c].first > C_vote_parity[c].second ? 1 : 0;      // Ideally, parity for the front/back side should be 1/0 (i.e., parity sum for all rays should be smaller on the front side)\n\n    } else {\n      I(f) = (C_vote_infinity[c].first == C_vote_infinity[c].second && C_vote_distance[c].first <  C_vote_distance[c].second) ||\n              C_vote_infinity[c].first <  C_vote_infinity[c].second\n              ? 1 : 0;\n    }\n    // To account for the effect of bfs_orient\n    if (F.row(f) != FF.row(f))\n      I(f) = 1 - I(f);\n  }\n  if (is_verbose) cout << \"done!\" << endl;\n}\n\ntemplate <\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedFF,\n  typename DerivedI>\nIGL_INLINE void igl::embree::reorient_facets_raycast(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  Eigen::PlainObjectBase<DerivedFF> & FF,\n  Eigen::PlainObjectBase<DerivedI> & I)\n{\n  const int rays_total = F.rows()*100;\n  const int rays_minimum = 10;\n  const bool facet_wise = false;\n  const bool use_parity = false;\n  const bool is_verbose = false;\n  Eigen::VectorXi C;\n  reorient_facets_raycast(\n    V,F,rays_total,rays_minimum,facet_wise,use_parity,is_verbose,I,C);\n  // Conservative in case FF = F\n  FF.conservativeResize(F.rows(),F.cols());\n  for(int i = 0;i<I.rows();i++)\n  {\n    if(I(i))\n    {\n      FF.row(i) = (F.row(i).reverse()).eval();\n    }else\n    {\n      FF.row(i) = F.row(i);\n    }\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::embree::reorient_facets_raycast<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::embree::reorient_facets_raycast<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<bool, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, int, int, bool, bool, bool, Eigen::PlainObjectBase<Eigen::Matrix<bool, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::embree::reorient_facets_raycast<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, int, int, bool, bool, bool, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/embree/reorient_facets_raycast.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_EMBREE_REORIENT_FACETS_RAYCAST_H\n#define IGL_EMBREE_REORIENT_FACETS_RAYCAST_H\n#include \"../igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  namespace embree\n  {\n    // Orient each component (identified by C) of a mesh (V,F) using ambient\n    // occlusion such that the front side is less occluded than back side, as\n    // described in \"A Simple Method for Correcting Facet Orientations in\n    // Polygon Meshes Based on Ray Casting\" [Takayama et al. 2014].\n    //\n    // Inputs:\n    //   V  #V by 3 list of vertex positions\n    //   F  #F by 3 list of triangle indices\n    //   rays_total  Total number of rays that will be shot\n    //   rays_minimum  Minimum number of rays that each patch should receive\n    //   facet_wise  Decision made for each face independently, no use of patches\n    //     (i.e., each face is treated as a patch)\n    //   use_parity  Use parity mode\n    //   is_verbose  Verbose output to cout\n    // Outputs:\n    //   I  #F list of whether face has been flipped\n    //   C  #F list of patch ID (output of bfs_orient > manifold patches)\n    template <\n      typename DerivedV, \n      typename DerivedF, \n      typename DerivedI,\n      typename DerivedC>\n    IGL_INLINE void reorient_facets_raycast(\n      const Eigen::PlainObjectBase<DerivedV> & V,\n      const Eigen::PlainObjectBase<DerivedF> & F,\n      int rays_total,\n      int rays_minimum,\n      bool facet_wise,\n      bool use_parity,\n      bool is_verbose,\n      Eigen::PlainObjectBase<DerivedI> & I,\n      Eigen::PlainObjectBase<DerivedC> & C);\n    // Outputs:\n    //   FF  #F by 3 list of reoriented faces\n    // Defaults:\n    //   rays_total = F.rows()*100;\n    //   rays_minimum = 10;\n    //   facet_wise = false;\n    //   use_parity = false;\n    //   is_verbose = false;\n    template <\n      typename DerivedV, \n      typename DerivedF, \n      typename DerivedFF,\n      typename DerivedI>\n    IGL_INLINE void reorient_facets_raycast(\n      const Eigen::PlainObjectBase<DerivedV> & V,\n      const Eigen::PlainObjectBase<DerivedF> & F,\n      Eigen::PlainObjectBase<DerivedFF> & FF,\n      Eigen::PlainObjectBase<DerivedI> & I);\n  }\n};\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"reorient_facets_raycast.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/embree/unproject_in_mesh.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"unproject_in_mesh.h\"\n#include \"EmbreeIntersector.h\"\n#include \"../unproject_ray.h\"\n#include \"../unproject_in_mesh.h\"\n#include <vector>\n\ntemplate <typename Derivedobj>\nIGL_INLINE int igl::embree::unproject_in_mesh(\n  const Eigen::Vector2f& pos,\n  const Eigen::Matrix4f& model,\n  const Eigen::Matrix4f& proj,\n  const Eigen::Vector4f& viewport,\n  const EmbreeIntersector & ei,\n  Eigen::PlainObjectBase<Derivedobj> & obj,\n  std::vector<igl::Hit > & hits)\n{\n  using namespace std;\n  using namespace Eigen;\n  const auto & shoot_ray = [&ei](\n    const Eigen::Vector3f& s,\n    const Eigen::Vector3f& dir,\n    std::vector<igl::Hit> & hits)\n  {\n    int num_rays_shot;\n    ei.intersectRay(s,dir,hits,num_rays_shot);\n  };\n  return igl::unproject_in_mesh(pos,model,proj,viewport,shoot_ray,obj,hits);\n}\n\ntemplate <typename Derivedobj>\nIGL_INLINE int igl::embree::unproject_in_mesh(\n    const Eigen::Vector2f& pos,\n    const Eigen::Matrix4f& model,\n    const Eigen::Matrix4f& proj,\n    const Eigen::Vector4f& viewport,\n    const EmbreeIntersector & ei,\n    Eigen::PlainObjectBase<Derivedobj> & obj)\n{\n  std::vector<igl::Hit> hits;\n  return unproject_in_mesh(pos,model,proj,viewport,ei,obj,hits);\n}\n\n\n#ifdef IGL_STATIC_LIBRARY\ntemplate int igl::embree::unproject_in_mesh<Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::Matrix<float, 2, 1, 0, 2, 1> const&, Eigen::Matrix<float, 4, 4, 0, 4, 4> const&, Eigen::Matrix<float, 4, 4, 0, 4, 4> const&, Eigen::Matrix<float, 4, 1, 0, 4, 1> const&, igl::embree::EmbreeIntersector const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, std::vector<igl::Hit, std::allocator<igl::Hit> >&);\ntemplate int igl::embree::unproject_in_mesh<Eigen::Matrix<double, 1, 3, 1, 1, 3> >(Eigen::Matrix<float, 2, 1, 0, 2, 1> const&, Eigen::Matrix<float, 4, 4, 0, 4, 4> const&, Eigen::Matrix<float, 4, 4, 0, 4, 4> const&, Eigen::Matrix<float, 4, 1, 0, 4, 1> const&, igl::embree::EmbreeIntersector const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> >&, std::vector<igl::Hit, std::allocator<igl::Hit> >&);\ntemplate int igl::embree::unproject_in_mesh<Eigen::Matrix<double, 3, 1, 0, 3, 1> >(Eigen::Matrix<float, 2, 1, 0, 2, 1> const&, Eigen::Matrix<float, 4, 4, 0, 4, 4> const&, Eigen::Matrix<float, 4, 4, 0, 4, 4> const&, Eigen::Matrix<float, 4, 1, 0, 4, 1> const&, igl::embree::EmbreeIntersector const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 1, 0, 3, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/embree/unproject_in_mesh.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_EMBREE_UNPROJECT_IN_MESH\n#define IGL_EMBREE_UNPROJECT_IN_MESH\n#include <igl/igl_inline.h>\n#include <Eigen/Core>\n\n#include <vector>\n#include \"../Hit.h\"\n\nnamespace igl\n{\n  namespace embree\n  {\n    // Forward define\n    class EmbreeIntersector;\n  \n    // Unproject a screen location (using current opengl viewport, projection, and\n    // model view) to a 3D position _inside_ a given mesh. If the ray through the\n    // given screen location (x,y) _hits_ the mesh more than twice then the 3D\n    // midpoint between the first two hits is return. If it hits once, then that\n    // point is return. If it does not hit the mesh then obj is not set.\n    //\n    //\n    // Inputs:\n    //    pos        screen space coordinates\n    //    model      model matrix\n    //    proj       projection matrix\n    //    viewport   vieweport vector\n    //    ei         EmbreeIntersector containing (V,F)\n    // Outputs:\n    //    obj        3d unprojected mouse point in mesh\n    //    hits       vector of embree hits\n    // Returns number of hits\n    //\n    // Note: Previous prototype did not require model, proj, and viewport. This\n    // has been removed. Instead replace with:\n    //\n    //     Eigen::Matrix4f model,proj;\n    //     Eigen::Vector4f viewport;\n    //     igl::opengl2::model_proj_viewport(model,proj,viewport);\n    //     igl::embree::unproject_in_mesh(Vector2f(x,y),model,proj,viewport,ei,obj,hits);\n    //\n    template < typename Derivedobj>\n    IGL_INLINE int unproject_in_mesh(\n      const Eigen::Vector2f& pos,\n      const Eigen::Matrix4f& model,\n      const Eigen::Matrix4f& proj,\n      const Eigen::Vector4f& viewport,\n      const EmbreeIntersector & ei,\n      Eigen::PlainObjectBase<Derivedobj> & obj,\n      std::vector<igl::Hit > & hits);\n    template < typename Derivedobj>\n    IGL_INLINE int unproject_in_mesh(\n      const Eigen::Vector2f& pos,\n      const Eigen::Matrix4f& model,\n      const Eigen::Matrix4f& proj,\n      const Eigen::Vector4f& viewport,\n      const EmbreeIntersector & ei,\n      Eigen::PlainObjectBase<Derivedobj> & obj);\n\n  }\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"unproject_in_mesh.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/embree/unproject_onto_mesh.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"unproject_onto_mesh.h\"\n#include \"EmbreeIntersector.h\"\n#include \"../unproject_onto_mesh.h\"\n#include <vector>\n\nIGL_INLINE bool igl::embree::unproject_onto_mesh(\n  const Eigen::Vector2f& pos,\n  const Eigen::MatrixXi& F,\n  const Eigen::Matrix4f& model,\n  const Eigen::Matrix4f& proj,\n  const Eigen::Vector4f& viewport,\n  const EmbreeIntersector & ei,\n  int& fid,\n  Eigen::Vector3f& bc)\n{\n  using namespace std;\n  using namespace Eigen;\n  const auto & shoot_ray = [&ei](\n    const Eigen::Vector3f& s,\n    const Eigen::Vector3f& dir,\n    igl::Hit & hit)->bool\n  {\n    return ei.intersectRay(s,dir,hit);\n  };\n  return igl::unproject_onto_mesh(pos,model,proj,viewport,shoot_ray,fid,bc);\n}\n\nIGL_INLINE bool igl::embree::unproject_onto_mesh(\n  const Eigen::Vector2f& pos,\n  const Eigen::MatrixXi& F,\n  const Eigen::Matrix4f& model,\n  const Eigen::Matrix4f& proj,\n  const Eigen::Vector4f& viewport,\n  const EmbreeIntersector & ei,\n  int& fid,\n  int& vid)\n{\n  Eigen::Vector3f bc;\n  if(!igl::embree::unproject_onto_mesh(pos,F,model,proj,viewport,ei,fid,bc))\n  {\n    return false;\n  }\n  int i;\n  bc.maxCoeff(&i);\n  vid = F(fid,i);\n  return true;\n}\n\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/embree/unproject_onto_mesh.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_EMBREE_UNPROJECT_ONTO_MESH_H\n#define IGL_EMBREE_UNPROJECT_ONTO_MESH_H\n#include <igl/igl_inline.h>\n#include <Eigen/Core>\n\n#include <vector>\n\nnamespace igl\n{\n  namespace embree\n  {\n    // Forward define\n    class EmbreeIntersector;\n    // Unproject a screen location (using the given model, proj and viewport) to find\n    // the first hit on a mesh.\n    //\n    // Inputs:\n    //    pos        screen space coordinates\n    //    F          #F by 3 face matrix\n    //    model      model matrix\n    //    proj       projection matrix\n    //    viewport   vieweport vector\n    //    ei         EmbreeIntersector containing (V,F)\n    // Outputs:\n    //    fid        id of the first face hit\n    //    bc         barycentric coordinates of hit\n    // Returns true if there is a hit\n    IGL_INLINE bool unproject_onto_mesh(\n      const Eigen::Vector2f& pos,\n      const Eigen::MatrixXi& F,\n      const Eigen::Matrix4f& model,\n      const Eigen::Matrix4f& proj,\n      const Eigen::Vector4f& viewport,\n      const EmbreeIntersector & ei,\n      int& fid,\n      Eigen::Vector3f& bc);\n    \n    // Unproject a screen location (using the given model, proj and viewport) to find\n    // the first face on the mesh and the closest vertex\n    //\n    // Inputs:\n    //    pos        screen space coordinates\n    //    F          #F by 3 face matrix\n    //    model      model matrix\n    //    proj       projection matrix\n    //    viewport   vieweport vector\n    //    ei         EmbreeIntersector containing (V,F)\n    // Outputs:\n    //    fid        id of the first face hit\n    //    vid        vertex id of the closest vertex hit\n    // Returns true if there is a hit\n    IGL_INLINE bool unproject_onto_mesh(\n      const Eigen::Vector2f& pos,\n      const Eigen::MatrixXi& F,\n      const Eigen::Matrix4f& model,\n      const Eigen::Matrix4f& proj,\n      const Eigen::Vector4f& viewport,\n      const EmbreeIntersector & ei,\n      int& fid,\n      int& vid);\n  }\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"unproject_onto_mesh.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/euler_characteristic.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2016 Michael Rabinovich <michaelrabinovich27@gmail.com@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"euler_characteristic.h\"\n\n#include \"edge_topology.h\"\n#include \"edges.h\"\n\ntemplate <typename Scalar, typename Index>\nIGL_INLINE int igl::euler_characteristic(\n  const Eigen::PlainObjectBase<Scalar> & V,\n  const Eigen::PlainObjectBase<Index> & F)\n{\n\n  int euler_v = V.rows();\n  Eigen::MatrixXi EV, FE, EF;\n  igl::edge_topology(V, F, EV, FE, EF);\n  int euler_e = EV.rows();\n  int euler_f = F.rows();\n\n  int euler_char = euler_v - euler_e + euler_f;\n  return euler_char;\n\n}\n\ntemplate <typename DerivedF>\nIGL_INLINE int igl::euler_characteristic(\n  const Eigen::MatrixBase<DerivedF> & F)\n{\n  const int nf = F.rows();\n  const int nv = F.maxCoeff()+1;\n  Eigen::Matrix<typename DerivedF::Scalar,Eigen::Dynamic,2> E;\n  edges(F,E);\n  const int ne = E.rows();\n  return nv - ne + nf;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate int igl::euler_characteristic<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&);\ntemplate int igl::euler_characteristic<Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/euler_characteristic.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2016 Michael Rabinovich <michaelrabinovich27@gmail.com>\n// Copyright (C) 2017 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_EULER_CHARACTERISTIC_H\n#define IGL_EULER_CHARACTERISTIC_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Dense>\n#include <Eigen/Sparse>\n#include <vector>\nnamespace igl\n{\n  // Computes the Euler characteristic of a given mesh (V,F)\n  //\n  // Inputs:\n  //   F #F by dim list of mesh faces (must be triangles)\n  // Returns An int containing the Euler characteristic\n  template <typename DerivedF>\n  IGL_INLINE int euler_characteristic(\n    const Eigen::MatrixBase<DerivedF> & F);\n\n  // Computes the Euler characteristic of a given mesh (V,F)\n  // Templates:\n  //   Scalar  should be a floating point number type\n  //   Index   should be an integer type\n  // Inputs:\n  //   V       #V by dim list of mesh vertex positions\n  //   F       #F by dim list of mesh faces (must be triangles)\n  // Returns An int containing the Euler characteristic\n  template <typename Scalar, typename Index>\n  IGL_INLINE int euler_characteristic(\n    const Eigen::PlainObjectBase<Scalar> & V,\n    const Eigen::PlainObjectBase<Index> & F);\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"euler_characteristic.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/example_fun.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"example_fun.h\"\n#include <iostream>\n\ntemplate <typename Printable>\nIGL_INLINE bool igl::example_fun(const Printable & input)\n{\n  using namespace std;\n  cout<<\"example_fun: \"<<input<<endl;\n  return true;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate bool igl::example_fun<double>(const double& input);\ntemplate bool igl::example_fun<int>(const int& input);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/example_fun.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_EXAMPLE_FUN_H\n#define IGL_EXAMPLE_FUN_H\n\n#include \"igl_inline.h\"\n\nnamespace igl\n{\n  // This is an example of a function, it takes a templated parameter and\n  // shovels it into cout\n  //\n  // Templates:\n  //   T  type that supports\n  // Input:\n  //   input  some input of a Printable type\n  // Returns true for the sake of returning something\n  template <typename Printable>\n  IGL_INLINE bool example_fun(const Printable & input);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"example_fun.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/exterior_edges.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"exterior_edges.h\"\n#include \"all_edges.h\"\n#include \"sort.h\"\n#include \"unique.h\"\n\n#include <cassert>\n#include <unordered_map>\n#include <utility>\n#include <iostream>\n\n//template <typename T> inline int sgn(T val) {\n//      return (T(0) < val) - (val < T(0));\n//}\n\n//static void mod2(std::pair<const std::pair<const int, const int>, int>& p)\n//{\n//  using namespace std;\n//  // Be sure that sign of mod matches sign of argument\n//  p.second = p.second%2 ? sgn(p.second) : 0;\n//}\n\n//// http://stackoverflow.com/a/5517869/148668\n//struct Compare\n//{\n//   int i;\n//   Compare(const int& i) : i(i) {}\n//};\n//bool operator==(const std::pair<std::pair<const int, const int>,int>&p, const Compare& c)\n//{\n//  return c.i == p.second;\n//}\n//bool operator==(const Compare& c, const std::pair<std::pair<const int, const int>, int> &p)\n//{\n//  return c.i == p.second;\n//}\n\nIGL_INLINE void igl::exterior_edges(\n  const Eigen::MatrixXi & F,\n  Eigen::MatrixXi & E)\n{\n  using namespace Eigen;\n  using namespace std;\n  assert(F.cols() == 3);\n  const size_t m = F.rows();\n  MatrixXi all_E,sall_E,sort_order;\n  // Sort each edge by index\n  all_edges(F,all_E);\n  sort(all_E,2,true,sall_E,sort_order);\n  // Find unique edges\n  MatrixXi uE;\n  VectorXi IA,EMAP;\n  unique_rows(sall_E,uE,IA,EMAP);\n  VectorXi counts = VectorXi::Zero(uE.rows());\n  for(size_t a = 0;a<3*m;a++)\n  {\n    counts(EMAP(a)) += (sort_order(a)==0?1:-1);\n  }\n\n  E.resize(all_E.rows(),2);\n  {\n    int e = 0;\n    const size_t nue = uE.rows();\n    // Append each unique edge with a non-zero amount of signed occurances\n    for(size_t ue = 0; ue<nue; ue++)\n    {\n      const int count = counts(ue);\n      size_t i,j;\n      if(count == 0)\n      {\n        continue;\n      }else if(count < 0)\n      {\n        i = uE(ue,1);\n        j = uE(ue,0);\n      }else if(count > 0)\n      {\n        i = uE(ue,0);\n        j = uE(ue,1);\n      }\n      // Append edge for every repeated entry\n      const int abs_count = abs(count);\n      for(int k = 0;k<abs_count;k++)\n      {\n        E(e,0) = i;\n        E(e,1) = j;\n        e++;\n      }\n    }\n    E.conservativeResize(e,2);\n  }\n}\n\nIGL_INLINE Eigen::MatrixXi igl::exterior_edges( const Eigen::MatrixXi & F)\n{\n  using namespace Eigen;\n  MatrixXi E;\n  exterior_edges(F,E);\n  return E;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/exterior_edges.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_EXTERIOR_EDGES_H\n#define IGL_EXTERIOR_EDGES_H\n#include \"igl_inline.h\"\n#include <Eigen/Dense>\nnamespace igl\n{\n  // EXTERIOR_EDGES Determines boundary \"edges\" and also edges with an\n  // odd number of occurances where seeing edge (i,j) counts as +1 and seeing\n  // the opposite edge (j,i) counts as -1\n  //\n  // Inputs:\n  //   F  #F by simplex_size list of \"faces\"\n  // Outputs:\n  //   E  #E by simplex_size-1  list of exterior edges\n  //\n  IGL_INLINE void exterior_edges(\n    const Eigen::MatrixXi & F,\n    Eigen::MatrixXi & E);\n  // Inline version\n  IGL_INLINE Eigen::MatrixXi exterior_edges( const Eigen::MatrixXi & F);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"exterior_edges.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/extract_manifold_patches.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"extract_manifold_patches.h\"\n#include \"unique_edge_map.h\"\n#include <cassert>\n#include <limits>\n#include <queue>\n\ntemplate<\n  typename DerivedF,\n  typename DerivedEMAP,\n  typename uE2EType,\n  typename DerivedP>\nIGL_INLINE size_t igl::extract_manifold_patches(\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  const Eigen::PlainObjectBase<DerivedEMAP>& EMAP,\n  const std::vector<std::vector<uE2EType> >& uE2E,\n  Eigen::PlainObjectBase<DerivedP>& P)\n{\n    assert(F.cols() == 3);\n    const size_t num_faces = F.rows();\n\n    auto edge_index_to_face_index = [&](size_t ei) { return ei % num_faces; };\n    auto face_and_corner_index_to_edge_index = [&](size_t fi, size_t ci) {\n        return ci*num_faces + fi;\n    };\n    auto is_manifold_edge = [&](size_t fi, size_t ci) -> bool {\n        const size_t ei = face_and_corner_index_to_edge_index(fi, ci);\n        return uE2E[EMAP(ei, 0)].size() == 2;\n    };\n    auto get_adj_face_index = [&](size_t fi, size_t ci) -> size_t {\n        const size_t ei = face_and_corner_index_to_edge_index(fi, ci);\n        const auto& adj_faces = uE2E[EMAP(ei, 0)];\n        assert(adj_faces.size() == 2);\n        if (adj_faces[0] == ei) {\n            return edge_index_to_face_index(adj_faces[1]);\n        } else {\n            assert(adj_faces[1] == ei);\n            return edge_index_to_face_index(adj_faces[0]);\n        }\n    };\n\n    typedef typename DerivedP::Scalar Scalar;\n    const Scalar INVALID = std::numeric_limits<Scalar>::max();\n    P.resize(num_faces,1);\n    P.setConstant(INVALID);\n    size_t num_patches = 0;\n    for (size_t i=0; i<num_faces; i++) {\n        if (P(i,0) != INVALID) continue;\n\n        std::queue<size_t> Q;\n        Q.push(i);\n        P(i,0) = num_patches;\n        while (!Q.empty()) {\n            const size_t fid = Q.front();\n            Q.pop();\n            for (size_t j=0; j<3; j++) {\n                if (is_manifold_edge(fid, j)) {\n                    const size_t adj_fid = get_adj_face_index(fid, j);\n                    if (P(adj_fid,0) == INVALID) {\n                        Q.push(adj_fid);\n                        P(adj_fid,0) = num_patches;\n                    }\n                }\n            }\n        }\n        num_patches++;\n    }\n    assert((P.array() != INVALID).all());\n\n    return num_patches;\n}\n\ntemplate<\n  typename DerivedF,\n  typename DerivedP>\nIGL_INLINE size_t igl::extract_manifold_patches(\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  Eigen::PlainObjectBase<DerivedP>& P)\n{\n  Eigen::MatrixXi E, uE;\n  Eigen::VectorXi EMAP;\n  std::vector<std::vector<size_t> > uE2E;\n  igl::unique_edge_map(F, E, uE, EMAP, uE2E);\n  return igl::extract_manifold_patches(F, EMAP, uE2E, P);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n#ifndef WIN32\ntemplate unsigned long igl::extract_manifold_patches<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, unsigned long, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, std::vector<std::vector<unsigned long, std::allocator<unsigned long> >, std::allocator<std::vector<unsigned long, std::allocator<unsigned long> > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/extract_manifold_patches.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_EXTRACT_MANIFOLD_PATCHES\n#define IGL_EXTRACT_MANIFOLD_PATCHES\n\n#include \"igl_inline.h\"\n#include <Eigen/Dense>\n#include <vector>\n\nnamespace igl {\n    // Extract a set of maximal patches from a given mesh.\n    // A maximal patch is a subset of the input faces that are connected via\n    // manifold edges; a patch is as large as possible.\n    //\n    // Inputs:\n    //   F  #F by 3 list representing triangles.\n    //   EMAP  #F*3 list of indices of unique undirected edges.\n    //   uE2E  #uE list of lists of indices into E of coexisting edges.\n    //\n    // Output:\n    //   P  #F list of patch incides.\n    //\n    // Returns:\n    //   number of manifold patches.\n    template <\n      typename DerivedF,\n      typename DerivedEMAP,\n      typename uE2EType,\n      typename DerivedP>\n    IGL_INLINE size_t extract_manifold_patches(\n      const Eigen::PlainObjectBase<DerivedF>& F,\n      const Eigen::PlainObjectBase<DerivedEMAP>& EMAP,\n      const std::vector<std::vector<uE2EType> >& uE2E,\n      Eigen::PlainObjectBase<DerivedP>& P);\n    template <\n      typename DerivedF,\n      typename DerivedP>\n    IGL_INLINE size_t extract_manifold_patches(\n      const Eigen::PlainObjectBase<DerivedF>& F,\n      Eigen::PlainObjectBase<DerivedP>& P);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"extract_manifold_patches.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/extract_non_manifold_edge_curves.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"extract_non_manifold_edge_curves.h\"\n#include <algorithm>\n#include <cassert>\n#include <list>\n#include <vector>\n#include <unordered_map>\n\ntemplate<\ntypename DerivedF,\ntypename DerivedEMAP,\ntypename uE2EType >\nIGL_INLINE void igl::extract_non_manifold_edge_curves(\n        const Eigen::PlainObjectBase<DerivedF>& F,\n        const Eigen::PlainObjectBase<DerivedEMAP>& /*EMAP*/,\n        const std::vector<std::vector<uE2EType> >& uE2E,\n        std::vector<std::vector<size_t> >& curves) {\n    const size_t num_faces = F.rows();\n    assert(F.cols() == 3);\n    //typedef std::pair<size_t, size_t> Edge;\n    auto edge_index_to_face_index = [&](size_t ei) { return ei % num_faces; };\n    auto edge_index_to_corner_index = [&](size_t ei) { return ei / num_faces; };\n    auto get_edge_end_points = [&](size_t ei, size_t& s, size_t& d) {\n        const size_t fi = edge_index_to_face_index(ei);\n        const size_t ci = edge_index_to_corner_index(ei);\n        s = F(fi, (ci+1)%3);\n        d = F(fi, (ci+2)%3);\n    };\n\n    curves.clear();\n    const size_t num_unique_edges = uE2E.size();\n    std::unordered_multimap<size_t, size_t> vertex_edge_adjacency;\n    std::vector<size_t> non_manifold_edges;\n    for (size_t i=0; i<num_unique_edges; i++) {\n        const auto& adj_edges = uE2E[i];\n        if (adj_edges.size() == 2) continue;\n\n        const size_t ei = adj_edges[0];\n        size_t s,d;\n        get_edge_end_points(ei, s, d);\n        vertex_edge_adjacency.insert({{s, i}, {d, i}});\n        non_manifold_edges.push_back(i);\n        assert(vertex_edge_adjacency.count(s) > 0);\n        assert(vertex_edge_adjacency.count(d) > 0);\n    }\n\n    auto expand_forward = [&](std::list<size_t>& edge_curve,\n            size_t& front_vertex, size_t& end_vertex) {\n        while(vertex_edge_adjacency.count(front_vertex) == 2 &&\n                front_vertex != end_vertex) {\n            auto adj_edges = vertex_edge_adjacency.equal_range(front_vertex);\n            for (auto itr = adj_edges.first; itr!=adj_edges.second; itr++) {\n                const size_t uei = itr->second;\n                assert(uE2E.at(uei).size() != 2);\n                const size_t ei = uE2E[uei][0];\n                if (uei == edge_curve.back()) continue;\n                size_t s,d;\n                get_edge_end_points(ei, s, d);\n                edge_curve.push_back(uei);\n                if (s == front_vertex) {\n                    front_vertex = d;\n                } else if (d == front_vertex) {\n                    front_vertex = s;\n                } else {\n                    throw \"Invalid vertex/edge adjacency!\";\n                }\n                break;\n            }\n        }\n    };\n\n    auto expand_backward = [&](std::list<size_t>& edge_curve,\n            size_t& front_vertex, size_t& end_vertex) {\n        while(vertex_edge_adjacency.count(front_vertex) == 2 &&\n                front_vertex != end_vertex) {\n            auto adj_edges = vertex_edge_adjacency.equal_range(front_vertex);\n            for (auto itr = adj_edges.first; itr!=adj_edges.second; itr++) {\n                const size_t uei = itr->second;\n                assert(uE2E.at(uei).size() != 2);\n                const size_t ei = uE2E[uei][0];\n                if (uei == edge_curve.front()) continue;\n                size_t s,d;\n                get_edge_end_points(ei, s, d);\n                edge_curve.push_front(uei);\n                if (s == front_vertex) {\n                    front_vertex = d;\n                } else if (d == front_vertex) {\n                    front_vertex = s;\n                } else {\n                    throw \"Invalid vertex/edge adjcency!\";\n                }\n                break;\n            }\n        }\n    };\n\n    std::vector<bool> visited(num_unique_edges, false);\n    for (const size_t i : non_manifold_edges) {\n        if (visited[i]) continue;\n        std::list<size_t> edge_curve;\n        edge_curve.push_back(i);\n\n        const auto& adj_edges = uE2E[i];\n        assert(adj_edges.size() != 2);\n        const size_t ei = adj_edges[0];\n        size_t s,d;\n        get_edge_end_points(ei, s, d);\n\n        expand_forward(edge_curve, d, s);\n        expand_backward(edge_curve, s, d);\n        curves.emplace_back(edge_curve.begin(), edge_curve.end());\n        for (auto itr = edge_curve.begin(); itr!=edge_curve.end(); itr++) {\n            visited[*itr] = true;\n        }\n    }\n\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/extract_non_manifold_edge_curves.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_NON_MANIFOLD_EDGE_CURVES\n#define IGL_NON_MANIFOLD_EDGE_CURVES\n\n#include \"igl_inline.h\"\n#include <Eigen/Dense>\n#include <vector>\n\nnamespace igl {\n    // Extract non-manifold curves from a given mesh.\n    // A non-manifold curves are a set of connected non-manifold edges that\n    // does not touch other non-manifold edges except at the end points.\n    // They are also maximal in the sense that they cannot be expanded by\n    // including more edges.\n    //\n    // Assumes the input mesh have all self-intersection resolved.  See\n    // ``igl::cgal::remesh_self_intersection`` for more details.\n    //\n    // Inputs:\n    //   F  #F by 3 list representing triangles.\n    //   EMAP  #F*3 list of indices of unique undirected edges.\n    //   uE2E  #uE list of lists of indices into E of coexisting edges.\n    //\n    // Output:\n    //   curves  An array of arries of unique edge indices.\n    template<\n        typename DerivedF,\n        typename DerivedEMAP,\n        typename uE2EType>\n    IGL_INLINE void extract_non_manifold_edge_curves(\n            const Eigen::PlainObjectBase<DerivedF>& F,\n            const Eigen::PlainObjectBase<DerivedEMAP>& EMAP,\n            const std::vector<std::vector<uE2EType> >& uE2E,\n            std::vector<std::vector<size_t> >& curves);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"extract_non_manifold_edge_curves.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/face_areas.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"face_areas.h\"\n#include \"edge_lengths.h\"\n#include \"doublearea.h\"\n\ntemplate <typename DerivedV, typename DerivedT, typename DerivedA>\nIGL_INLINE void igl::face_areas(\n  const Eigen::MatrixBase<DerivedV>& V,\n  const Eigen::MatrixBase<DerivedT>& T,\n  Eigen::PlainObjectBase<DerivedA>& A)\n{\n  assert(T.cols() == 4);\n  DerivedA L;\n  edge_lengths(V,T,L);\n  return face_areas(L,A);\n}\n\ntemplate <typename DerivedL, typename DerivedA>\nIGL_INLINE void igl::face_areas(\n  const Eigen::MatrixBase<DerivedL>& L,\n  Eigen::PlainObjectBase<DerivedA>& A)\n{\n  return face_areas(\n    L,std::numeric_limits<typename DerivedL::Scalar>::quiet_NaN(),A);\n}\n\ntemplate <typename DerivedL, typename DerivedA>\nIGL_INLINE void igl::face_areas(\n  const Eigen::MatrixBase<DerivedL>& L,\n  const typename DerivedL::Scalar doublearea_nan_replacement,\n  Eigen::PlainObjectBase<DerivedA>& A)\n{\n  using namespace Eigen;\n  assert(L.cols() == 6);\n  const int m = L.rows();\n  // (unsigned) face Areas (opposite vertices: 1 2 3 4)\n  Matrix<typename DerivedA::Scalar,Dynamic,1> \n    A0(m,1), A1(m,1), A2(m,1), A3(m,1);\n  Matrix<typename DerivedA::Scalar,Dynamic,3> \n    L0(m,3), L1(m,3), L2(m,3), L3(m,3);\n  L0<<L.col(1),L.col(2),L.col(3);\n  L1<<L.col(0),L.col(2),L.col(4);\n  L2<<L.col(0),L.col(1),L.col(5);\n  L3<<L.col(3),L.col(4),L.col(5);\n  doublearea(L0,doublearea_nan_replacement,A0);\n  doublearea(L1,doublearea_nan_replacement,A1);\n  doublearea(L2,doublearea_nan_replacement,A2);\n  doublearea(L3,doublearea_nan_replacement,A3);\n  A.resize(m,4);\n  A.col(0) = 0.5*A0;\n  A.col(1) = 0.5*A1;\n  A.col(2) = 0.5*A2;\n  A.col(3) = 0.5*A3;\n}\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::face_areas<Eigen::Matrix<double, -1, 6, 0, -1, 6>, Eigen::Matrix<double, -1, 4, 0, -1, 4> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 6, 0, -1, 6> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 4, 0, -1, 4> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/face_areas.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_FACE_AREAS_H\n#define IGL_FACE_AREAS_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Dense>\n\nnamespace igl\n{\n  // Constructs a list of face areas of faces opposite each index in a tet list\n  //\n  // Inputs:\n  //   V  #V by 3 list of mesh vertex positions\n  //   T  #T by 3 list of tet mesh indices into V\n  // Outputs:\n  //   A   #T by 4 list of face areas corresponding to faces opposite vertices\n  //     0,1,2,3\n  //\n  template <typename DerivedV, typename DerivedT, typename DerivedA>\n  IGL_INLINE void face_areas(\n    const Eigen::MatrixBase<DerivedV>& V,\n    const Eigen::MatrixBase<DerivedT>& T,\n    Eigen::PlainObjectBase<DerivedA>& A);\n  // Compute tet-mesh face areas from edge lengths.\n  //\n  // Inputs:\n  //   L  #T by 6 list of tet-mesh edge lengths corresponding to edges\n  //     [3 0],[3 1],[3 2],[1 2],[2 0],[0 1]\n  // Outputs:\n  //   A   #T by 4 list of face areas corresponding to faces opposite vertices \n  //     0,1,2,3: i.e. made of edges [123],[024],[015],[345]\n  //    \n  //\n  template <typename DerivedL, typename DerivedA>\n  IGL_INLINE void face_areas(\n    const Eigen::MatrixBase<DerivedL>& L,\n    Eigen::PlainObjectBase<DerivedA>& A);\n  // doublearea_nan_replacement  See doublearea.h\n  template <typename DerivedL, typename DerivedA>\n  IGL_INLINE void face_areas(\n    const Eigen::MatrixBase<DerivedL>& L,\n    const typename DerivedL::Scalar doublearea_nan_replacement,\n    Eigen::PlainObjectBase<DerivedA>& A);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"face_areas.cpp\"\n#endif\n\n#endif\n\n\n"
  },
  {
    "path": "libs/libigl/include/igl/face_occurrences.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"face_occurrences.h\"\n\n#include <map>\n#include \"sort.h\"\n#include <cassert>\n\ntemplate <typename IntegerF, typename IntegerC>\nIGL_INLINE void igl::face_occurrences(\n  const std::vector<std::vector<IntegerF> > & F,\n  std::vector<IntegerC> & C)\n{\n  using namespace std;\n\n  // Get a list of sorted faces\n  vector<vector<IntegerF> > sortedF = F;\n  for(int i = 0; i < (int)F.size();i++)\n  {\n    sort(sortedF[i].begin(),sortedF[i].end());\n  }\n  // Count how many times each sorted face occurs\n  map<vector<IntegerF>,int> counts;\n  for(int i = 0; i < (int)sortedF.size();i++)\n  {\n    if(counts.find(sortedF[i]) == counts.end())\n    {\n      // initialize to count of 1\n      counts[sortedF[i]] = 1;\n    }else\n    {\n      // increment count\n      counts[sortedF[i]]++;\n      assert(counts[sortedF[i]] == 2 && \"Input should be manifold\");\n    }\n  }\n\n  // Resize output to fit number of ones\n  C.resize(F.size());\n  for(int i = 0;i< (int)F.size();i++)\n  {\n    // sorted face should definitely be in counts map\n    assert(counts.find(sortedF[i]) != counts.end());\n    C[i] = counts[sortedF[i]];\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::face_occurrences<unsigned int, int>(std::vector<std::vector<unsigned int, std::allocator<unsigned int> >, std::allocator<std::vector<unsigned int, std::allocator<unsigned int> > > > const&, std::vector<int, std::allocator<int> >&);\ntemplate void igl::face_occurrences<int, int>(std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > const&, std::vector<int, std::allocator<int> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/face_occurrences.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_FACE_OCCURRENCES\n#define IGL_FACE_OCCURRENCES\n#include \"igl_inline.h\"\n\n#include <vector>\nnamespace igl\n{\n  // Count the occruances of each face (row) in a list of face indices\n  // (irrespecitive of order)\n  // Inputs:\n  //   F  #F by simplex-size\n  // Outputs\n  //   C  #F list of counts\n  // Known bug: triangles/tets only (where ignoring order still gives simplex)\n  template <typename IntegerF, typename IntegerC>\n  IGL_INLINE void face_occurrences(\n    const std::vector<std::vector<IntegerF> > & F,\n    std::vector<IntegerC> & C);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"face_occurrences.cpp\"\n#endif\n\n#endif\n\n\n"
  },
  {
    "path": "libs/libigl/include/igl/faces_first.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"faces_first.h\"\n\n#include <vector>\n#include <Eigen/Dense>\n\ntemplate <typename MatV, typename MatF, typename VecI>\nIGL_INLINE void igl::faces_first(\n  const MatV & V, \n  const MatF & F, \n  MatV & RV, \n  MatF & RF, \n  VecI & IM)\n{\n  assert(&V != &RV);\n  assert(&F != &RF);\n  using namespace std;\n  using namespace Eigen;\n  vector<bool> in_face(V.rows());\n  for(int i = 0; i<F.rows(); i++)\n  {\n    for(int j = 0; j<F.cols(); j++)\n    {\n      in_face[F(i,j)] = true;\n    }\n  }\n  // count number of vertices not in faces\n  int num_in_F = 0;\n  for(int i = 0;i<V.rows();i++)\n  {\n    num_in_F += (in_face[i]?1:0);\n  }\n  // list of unique vertices that occur in F\n  VectorXi U(num_in_F);\n  // list of unique vertices that do not occur in F\n  VectorXi NU(V.rows()-num_in_F);\n  int Ui = 0;\n  int NUi = 0;\n  // loop over vertices\n  for(int i = 0;i<V.rows();i++)\n  {\n    if(in_face[i])\n    {\n      U(Ui) = i;\n      Ui++;\n    }else\n    {\n      NU(NUi) = i;\n      NUi++;\n    }\n  }\n  IM.resize(V.rows());\n  // reindex vertices that occur in faces to be first\n  for(int i = 0;i<U.size();i++)\n  {\n    IM(U(i)) = i;\n  }\n  // reindex vertices that do not occur in faces to come after those that do\n  for(int i = 0;i<NU.size();i++)\n  {\n    IM(NU(i)) = i+U.size();\n  }\n  RF.resizeLike(F);\n  // Reindex faces\n  for(int i = 0; i<F.rows(); i++)\n  {\n    for(int j = 0; j<F.cols(); j++)\n    {\n      RF(i,j) = IM(F(i,j));\n    }\n  }\n  RV.resizeLike(V);\n  // Reorder vertices\n  for(int i = 0;i<V.rows();i++)\n  {\n    RV.row(IM(i)) = V.row(i);\n  }\n}\n\ntemplate <typename MatV, typename MatF, typename VecI>\nIGL_INLINE void igl::faces_first(\n  MatV & V, \n  MatF & F, \n  VecI & IM)\n{\n  MatV RV;\n  // Copying F may not be needed, seems RF = F is safe (whereas RV = V is not)\n  MatF RF;\n  igl::faces_first(V,F,RV,RF,IM);\n  V = RV;\n  F = RF;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::faces_first<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::Matrix<double, -1, -1, 0, -1, -1>&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&, Eigen::Matrix<int, -1, 1, 0, -1, 1>&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/faces_first.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_FACES_FIRST_H\n#define IGL_FACES_FIRST_H\n#include \"igl_inline.h\"\nnamespace igl\n{\n  // FACES_FIRST Reorder vertices so that vertices in face list come before\n  // vertices that don't appear in the face list. This is especially useful if\n  // the face list contains only surface faces and you want surface vertices\n  // listed before internal vertices\n  //\n  // [RV,RT,RF,IM] = faces_first(V,T,F);\n  //\n  // Templates:\n  //   MatV  matrix for vertex positions, e.g. MatrixXd\n  //   MatF  matrix for face indices, e.g. MatrixXi\n  //   VecI  vector for index map, e.g. VectorXi\n  // Input:\n  //  V  # vertices by 3 vertex positions\n  //  F  # faces by 3 list of face indices\n  // Output: \n  //  RV  # vertices by 3 vertex positions, order such that if the jth vertex is\n  //    some face in F, and the kth vertex is not then j comes before k\n  //  RF  # faces by 3 list of face indices, reindexed to use RV\n  //  IM  #V by 1 list of indices such that: RF = IM(F) and RT = IM(T)\n  //    and RV(IM,:) = V\n  //\n  //\n  // Example:\n  //   // Tet mesh in (V,T,F)\n  //   faces_first(V,F,IM);\n  //   T = T.unaryExpr(bind1st(mem_fun( static_cast<VectorXi::Scalar&\n  //     (VectorXi::*)(VectorXi::Index)>(&VectorXi::operator())),\n  //     &IM)).eval();\n  template <typename MatV, typename MatF, typename VecI>\n  IGL_INLINE void faces_first(\n    const MatV & V, \n    const MatF & F, \n    MatV & RV, \n    MatF & RF, \n    VecI & IM);\n  // Virtual \"in place\" wrapper\n  template <typename MatV, typename MatF, typename VecI>\n  IGL_INLINE void faces_first(\n    MatV & V, \n    MatF & F, \n    VecI & IM);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"faces_first.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/facet_components.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"facet_components.h\"\n#include <igl/triangle_triangle_adjacency.h>\n#include <vector>\n#include <queue>\ntemplate <typename DerivedF, typename DerivedC>\nIGL_INLINE void igl::facet_components(\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  Eigen::PlainObjectBase<DerivedC> & C)\n{\n  using namespace std;\n  typedef typename DerivedF::Index Index;\n  vector<vector<vector<Index > > > TT;\n  vector<vector<vector<Index > > > TTi;\n  triangle_triangle_adjacency(F,TT,TTi);\n  Eigen::VectorXi counts;\n  return facet_components(TT,C,counts);\n}\n\ntemplate <\n  typename TTIndex, \n  typename DerivedC,\n  typename Derivedcounts>\nIGL_INLINE void igl::facet_components(\n  const std::vector<std::vector<std::vector<TTIndex > > > & TT,\n  Eigen::PlainObjectBase<DerivedC> & C,\n  Eigen::PlainObjectBase<Derivedcounts> & counts)\n{\n  using namespace std;\n  typedef TTIndex Index;\n  const Index m = TT.size();\n  C.resize(m,1);\n  vector<bool> seen(m,false);\n  Index id = 0;\n  vector<Index> vcounts;\n  for(Index g = 0;g<m;g++)\n  {\n    if(seen[g])\n    {\n      continue;\n    }\n    vcounts.push_back(0);\n    queue<Index> Q;\n    Q.push(g);\n    while(!Q.empty())\n    {\n      const Index f = Q.front();\n      Q.pop();\n      if(seen[f])\n      {\n        continue;\n      }\n      seen[f] = true;\n      vcounts[id]++;\n      C(f,0) = id;\n      // Face f's neighbor lists opposite opposite each corner\n      for(const auto & c : TT[f])\n      {\n        // Each neighbor\n        for(const auto & n : c)\n        {\n          if(!seen[n])\n          {\n            Q.push(n);\n          }\n        }\n      }\n    }\n    id++;\n  }\n  assert((size_t) id == vcounts.size());\n  const size_t ncc = vcounts.size();\n  assert((size_t)C.maxCoeff()+1 == ncc);\n  counts.resize(ncc,1);\n  for(size_t i = 0;i<ncc;i++)\n  {\n    counts(i) = vcounts[i];\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::facet_components<long, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<long, -1, 1, 0, -1, 1> >(std::vector<std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > >, std::allocator<std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&);\ntemplate void igl::facet_components<int, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(std::vector<std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >, std::allocator<std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::facet_components<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/facet_components.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef FACET_COMPONENTS_H\n#define FACET_COMPONENTS_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <vector>\nnamespace igl\n{\n  // Compute connected components of facets based on edge-edge adjacency.\n  //\n  // Inputs:\n  //   F  #F by 3 list of triangle indices\n  // Ouputs:\n  //   C  #F list of connected component ids\n  template <typename DerivedF, typename DerivedC>\n  IGL_INLINE void facet_components(\n    const Eigen::PlainObjectBase<DerivedF> & F,\n    Eigen::PlainObjectBase<DerivedC> & C);\n  // Inputs:\n  //   TT  #TT by 3 list of list of adjacency triangles (see\n  //   triangle_triangle_adjacency.h)\n  // Ouputs:\n  //   C  #F list of connected component ids\n  //   counts #C list of number of facets in each components\n  template <\n    typename TTIndex, \n    typename DerivedC,\n    typename Derivedcounts>\n  IGL_INLINE void facet_components(\n    const std::vector<std::vector<std::vector<TTIndex > > > & TT,\n    Eigen::PlainObjectBase<DerivedC> & C,\n    Eigen::PlainObjectBase<Derivedcounts> & counts);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"facet_components.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/false_barycentric_subdivision.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"false_barycentric_subdivision.h\"\n\n#include \"verbose.h\"\n#include <algorithm>\n#include <igl/barycenter.h>\n\ntemplate <typename Scalar, typename Index>\nIGL_INLINE void igl::false_barycentric_subdivision(\n    const Eigen::PlainObjectBase<Scalar> & V,\n    const Eigen::PlainObjectBase<Index> & F,\n    Eigen::PlainObjectBase<Scalar> & VD,\n    Eigen::PlainObjectBase<Index> & FD)\n{\n  using namespace Eigen;\n  // Compute face barycenter\n  Eigen::MatrixXd BC;\n  igl::barycenter(V,F,BC);\n\n  // Add the barycenters to the vertices\n  VD.resize(V.rows()+F.rows(),3);\n  VD.block(0,0,V.rows(),3) = V;\n  VD.block(V.rows(),0,F.rows(),3) = BC;\n\n  // Each face is split four ways\n  FD.resize(F.rows()*3,3);\n\n  for (unsigned i=0; i<F.rows(); ++i)\n  {\n    int i0 = F(i,0);\n    int i1 = F(i,1);\n    int i2 = F(i,2);\n    int i3 = V.rows() + i;\n\n    Vector3i F0,F1,F2;\n    F0 << i0,i1,i3;\n    F1 << i1,i2,i3;\n    F2 << i2,i0,i3;\n\n    FD.row(i*3 + 0) = F0;\n    FD.row(i*3 + 1) = F1;\n    FD.row(i*3 + 2) = F2;\n  }\n\n\n}\n\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::false_barycentric_subdivision<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&);\ntemplate void igl::false_barycentric_subdivision<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/false_barycentric_subdivision.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_ADD_BARYCENTER_H\n#define IGL_ADD_BARYCENTER_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Dense>\n\nnamespace igl\n{\n  // Refine the mesh by adding the barycenter of each face\n  // Inputs:\n  //   V       #V by 3 coordinates of the vertices\n  //   F       #F by 3 list of mesh faces (must be triangles)\n  // Outputs:\n  //   VD      #V + #F by 3 coordinate of the vertices of the dual mesh\n  //           The added vertices are added at the end of VD (should not be\n  //           same references as (V,F)\n  //   FD      #F*3 by 3 faces of the dual mesh\n  //\n  template <typename Scalar, typename Index>\n  IGL_INLINE void false_barycentric_subdivision(\n    const Eigen::PlainObjectBase<Scalar> & V,\n    const Eigen::PlainObjectBase<Index> & F,\n    Eigen::PlainObjectBase<Scalar> & VD,\n    Eigen::PlainObjectBase<Index> & FD);\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"false_barycentric_subdivision.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/field_local_global_conversions.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include <igl/field_local_global_conversions.h>\n\n template <typename DerivedG, typename DerivedL, typename DerivedB>\nIGL_INLINE void igl::global2local(\nconst Eigen::PlainObjectBase<DerivedB>& B1,\nconst Eigen::PlainObjectBase<DerivedB>& B2,\nconst Eigen::PlainObjectBase<DerivedG>& global,\nEigen::PlainObjectBase<DerivedL>& local)\n{\n\n  int n = global.cols()/3;\n  //get 2D vectors from 3D vectors\n  local.resize(global.rows(), n*2);\n  for (int i =0; i<global.rows(); ++i)\n  {\n    for (int k =0; k<n; k++)\n    {\n      const Eigen::Matrix<typename DerivedG::Scalar,1,3> &g = global.block(i, k*3,1,3);\n      local.block(i, k*2,1,2) << g.dot(B1.row(i).template cast<typename DerivedG::Scalar>()), g.dot(B2.row(i).template cast<typename DerivedG::Scalar>()) ;\n    }\n  }\n}\n\ntemplate <typename DerivedG, typename DerivedL, typename DerivedB>\nIGL_INLINE void igl::local2global(\nconst Eigen::PlainObjectBase<DerivedB>& B1,\nconst Eigen::PlainObjectBase<DerivedB>& B2,\nconst Eigen::PlainObjectBase<DerivedL>& local,\nEigen::PlainObjectBase<DerivedG>& global)\n{\n  int n = local.cols()/2;\n  //get 3D vectors from 2D vectors\n  global.resize(local.rows(), n*3);\n  for (int i =0; i<global.rows(); ++i)\n  {\n    for (int k =0; k<n; k++)\n    {\n      const Eigen::Matrix<typename DerivedL::Scalar,1,2> &l = local.block(i, k*2,1,2);\n      global.block(i, k*3, 1,3) = l[0]*B1.row(i).template cast<typename DerivedG::Scalar>() + l[1]*B2.row(i).template cast<typename DerivedG::Scalar>() ;\n    }\n  }\n\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::global2local<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::local2global<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/field_local_global_conversions.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2015 Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_FIELD_LOCAL_GLOBAL_CONVERSIONS\n#define IGL_FIELD_LOCAL_GLOBAL_CONVERSIONS\n#include \"igl_inline.h\"\n\n#include <Eigen/Core>\n#include <vector>\n\nnamespace igl {\n  // Converts a face-based polyvector field consisting of n vectors per face\n  // from its 3D coordinates to its local 2D representation (with respect to the\n  // local bases of each triangle)\n\n  // Inputs:\n  //   B1               #F by 3 list of the first basis vector of each triangle\n  //   B2               #F by 3 list of the second basis vector of each triangle\n  //   global           #F by 3n list of the 3D coordinates of the per-face vectors\n  //                    (stacked horizontally for each triangle)\n  // Output:\n  //   local            #F by 2n list of the 2D representation of the per-face vectors\n  //                    (stacked horizontally for each triangle)\n  //\ntemplate <typename DerivedG, typename DerivedL, typename DerivedB>\nIGL_INLINE void global2local(\nconst Eigen::PlainObjectBase<DerivedB>& B1,\nconst Eigen::PlainObjectBase<DerivedB>& B2,\nconst Eigen::PlainObjectBase<DerivedG>& global,\nEigen::PlainObjectBase<DerivedL>& local);\n\n// Converts a face-based polyvector field consisting of n vectors per face\n// from its local 2D representation (with respect to the local bases of each\n// triangle) to its 3D coordinates\n\n// Inputs:\n//   B1               #F by 3 list of the first basis vector of each triangle\n//   B2               #F by 3 list of the second basis vector of each triangle\n//   local            #F by 2n list of the 2D representation of the per-face vectors\n//                    (stacked horizontally for each triangle)\n// Output:\n//   global           #F by 3n list of the 3D coordinates of the per-face vectors\n//                    (stacked horizontally for each triangle)\n//\ntemplate <typename DerivedG, typename DerivedL, typename DerivedB>\nIGL_INLINE void local2global(\nconst Eigen::PlainObjectBase<DerivedB>& B1,\nconst Eigen::PlainObjectBase<DerivedB>& B2,\nconst Eigen::PlainObjectBase<DerivedL>& local,\nEigen::PlainObjectBase<DerivedG>& global);\n\n};\n\n\n#ifndef IGL_STATIC_LIBRARY\n#include \"field_local_global_conversions.cpp\"\n#endif\n\n\n#endif /* defined(IGL_FIELD_LOCAL_GLOBAL_CONVERSIONS) */\n"
  },
  {
    "path": "libs/libigl/include/igl/file_contents_as_string.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"file_contents_as_string.h\"\n\n#include <fstream>\n#include <cstdio>\n#include <cassert>\n\nIGL_INLINE bool igl::file_contents_as_string(\n  const std::string file_name,\n  std::string & content)\n{\n  std::ifstream ifs(file_name.c_str());\n  // Check that opening the stream worked successfully\n  if(!ifs.good())\n  {\n    fprintf(\n      stderr,\n      \"IOError: file_contents_as_string() cannot open %s\\n\",\n      file_name.c_str());\n    return false;\n  }\n  // Stream file contents into string\n  content = std::string(\n    (std::istreambuf_iterator<char>(ifs)),\n    (std::istreambuf_iterator<char>()));\n  return true;\n}\n\nIGL_INLINE std::string igl::file_contents_as_string(\n  const std::string file_name)\n{\n  std::string content;\n#ifndef NDEBUG\n  bool ret = \n#endif\n    file_contents_as_string(file_name,content);\n  assert(ret && \"file_contents_as_string failed to read string from file\");\n  return content;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/file_contents_as_string.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_FILE_CONTENTS_AS_STRING_H\n#define IGL_FILE_CONTENTS_AS_STRING_H\n#include \"igl_inline.h\"\n\n#include <string>\nnamespace igl\n{\n  // Read a files contents as plain text into a given string\n  // Inputs:\n  //   file_name  path to file to be read\n  // Outputs:\n  //   content  output string containing contents of the given file\n  // Returns true on succes, false on error\n  IGL_INLINE bool file_contents_as_string(\n    const std::string file_name,\n    std::string & content);\n  IGL_INLINE std::string file_contents_as_string(\n    const std::string file_name);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"file_contents_as_string.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/file_dialog_open.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"file_dialog_open.h\"\n#include <cstdio>\n#include <cstring>\n\n#ifdef _WIN32\n  #include <windows.h>\n  #undef max\n  #undef min\n  \n  #include <Commdlg.h>\n#endif\n\nIGL_INLINE std::string igl::file_dialog_open()\n{\n  const int FILE_DIALOG_MAX_BUFFER = 1024;\n  char buffer[FILE_DIALOG_MAX_BUFFER];\n  \n#ifdef __APPLE__\n  // For apple use applescript hack\n  FILE * output = popen(\n    \"osascript -e \\\"\"\n    \"   tell application \\\\\\\"System Events\\\\\\\"\\n\"\n    \"           activate\\n\"\n    \"           set existing_file to choose file\\n\"\n    \"   end tell\\n\"\n    \"   set existing_file_path to (POSIX path of (existing_file))\\n\"\n    \"\\\" 2>/dev/null | tr -d '\\n' \",\"r\");\n  while ( fgets(buffer, FILE_DIALOG_MAX_BUFFER, output) != NULL )\n  {\n  }\n#elif defined _WIN32\n  \n  // Use native windows file dialog box\n  // (code contributed by Tino Weinkauf)\n\n  OPENFILENAME ofn;       // common dialog box structure\n  char szFile[260];       // buffer for file name\n\n  // Initialize OPENFILENAME\n  ZeroMemory(&ofn, sizeof(ofn));\n  ofn.lStructSize = sizeof(ofn);\n  ofn.hwndOwner = NULL;\n  ofn.lpstrFile = new char[100];\n  // Set lpstrFile[0] to '\\0' so that GetOpenFileName does not \n  // use the contents of szFile to initialize itself.\n  ofn.lpstrFile[0] = '\\0';\n  ofn.nMaxFile = sizeof(szFile);\n  ofn.lpstrFilter = \"*.*\\0\";//off\\0*.off\\0obj\\0*.obj\\0mp\\0*.mp\\0\";\n  ofn.nFilterIndex = 1;\n  ofn.lpstrFileTitle = NULL;\n  ofn.nMaxFileTitle = 0;\n  ofn.lpstrInitialDir = NULL;\n  ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;\n\n  // Display the Open dialog box. \n  int pos = 0;\n  if (GetOpenFileName(&ofn)==TRUE)\n  {\n    while(ofn.lpstrFile[pos] != '\\0')\n    {\n      buffer[pos] = (char)ofn.lpstrFile[pos];\n      pos++;\n    }\n  } \n  buffer[pos] = 0;\n#else\n  \n  // For linux use zenity\n  FILE * output = popen(\"/usr/bin/zenity --file-selection\",\"r\");\n  while ( fgets(buffer, FILE_DIALOG_MAX_BUFFER, output) != NULL )\n  {\n  }\n  \n  if (strlen(buffer) > 0)\n  {\n    buffer[strlen(buffer)-1] = 0;\n  }\n#endif\n  return std::string(buffer);\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/file_dialog_open.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_FILE_DIALOG_OPEN_H\n#define IGL_FILE_DIALOG_OPEN_H\n#include \"igl_inline.h\"\n\n#include <string>\n\nnamespace igl\n{\n  // Returns a string with a path to an existing file\n  // The string is returned empty if no file is selected\n  // (on Linux machines, it assumes that Zenity is installed)\n  //\n  // Usage:\n  //   std::string str = get_open_file_path();\n  IGL_INLINE std::string file_dialog_open();\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"file_dialog_open.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/file_dialog_save.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"file_dialog_save.h\"\n#include <cstdio>\n#include <cstring>\n\n#ifdef _WIN32\n #include <windows.h>\n #include <Commdlg.h>\n#endif\n\nIGL_INLINE std::string igl::file_dialog_save()\n{\n  const int FILE_DIALOG_MAX_BUFFER = 1024;\n  char buffer[FILE_DIALOG_MAX_BUFFER];\n#ifdef __APPLE__\n  // For apple use applescript hack\n  // There is currently a bug in Applescript that strips extensions off\n  // of chosen existing files in the \"choose file name\" dialog\n  // I'm assuming that will be fixed soon\n  FILE * output = popen(\n    \"osascript -e \\\"\"\n    \"   tell application \\\\\\\"System Events\\\\\\\"\\n\"\n    \"           activate\\n\"\n    \"           set existing_file to choose file name\\n\"\n    \"   end tell\\n\"\n    \"   set existing_file_path to (POSIX path of (existing_file))\\n\"\n    \"\\\" 2>/dev/null | tr -d '\\n' \",\"r\");\n  while ( fgets(buffer, FILE_DIALOG_MAX_BUFFER, output) != NULL )\n  {\n  }\n#elif defined _WIN32\n\n  // Use native windows file dialog box\n  // (code contributed by Tino Weinkauf)\n\n  OPENFILENAME ofn;       // common dialog box structure\n  char szFile[260];       // buffer for file name\n\n  // Initialize OPENFILENAME\n  ZeroMemory(&ofn, sizeof(ofn));\n  ofn.lStructSize = sizeof(ofn);\n  ofn.hwndOwner = NULL;//hwnd;\n  ofn.lpstrFile = new char[100];\n  // Set lpstrFile[0] to '\\0' so that GetOpenFileName does not \n  // use the contents of szFile to initialize itself.\n  ofn.lpstrFile[0] = '\\0';\n  ofn.nMaxFile = sizeof(szFile);\n  ofn.lpstrFilter = \"\";\n  ofn.nFilterIndex = 1;\n  ofn.lpstrFileTitle = NULL;\n  ofn.nMaxFileTitle = 0;\n  ofn.lpstrInitialDir = NULL;\n  ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;\n\n  // Display the Open dialog box. \n  int pos = 0;\n  if (GetSaveFileName(&ofn)==TRUE)\n  {\n    while(ofn.lpstrFile[pos] != '\\0')\n    {\n      buffer[pos] = (char)ofn.lpstrFile[pos];\n      pos++;\n    }\n    buffer[pos] = 0;\n  }\n\n#else\n  // For every other machine type use zenity\n  FILE * output = popen(\"/usr/bin/zenity --file-selection --save\",\"r\");\n  while ( fgets(buffer, FILE_DIALOG_MAX_BUFFER, output) != NULL )\n  {\n  }\n  \n  if (strlen(buffer) > 0)\n  {\n    buffer[strlen(buffer)-1] = 0;\n  }\n#endif\n  return std::string(buffer);\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/file_dialog_save.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_FILE_DIALOG_SAVE_H\n#define IGL_FILE_DIALOG_SAVE_H\n#include \"igl_inline.h\"\n\n#include <string>\n\nnamespace igl\n{\n  // Returns a string with a path to a new/existing file\n  // The string is returned empty if no file is selected\n  // (on Linux machines, it assumes that Zenity is installed)\n  //\n  // Usage:\n  //   char buffer[FILE_DIALOG_MAX_BUFFER];\n  //   get_save_file_path(buffer);\n  IGL_INLINE std::string file_dialog_save();\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"file_dialog_save.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/file_exists.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"file_exists.h\"\n\n#include <sys/stat.h>\n\nIGL_INLINE bool igl::file_exists(const std::string filename)\n{\n  struct stat status;\n  return (stat(filename.c_str(),&status)==0);\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/file_exists.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_FILE_EXISTS_H\n#define IGL_FILE_EXISTS_H\n#include \"igl_inline.h\"\n#include <string>\nnamespace igl\n{\n  // Check if a file or directory exists like PHP's file_exists function:\n  // http://php.net/manual/en/function.file-exists.php\n  // Input:\n  //   filename  path to file\n  // Returns true if file exists and is readable and false if file doesn't\n  // exist or *is not readable*\n  IGL_INLINE bool file_exists(const std::string filename);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"file_exists.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/find.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"find.h\"\n\n#include \"verbose.h\"\n#include <iostream>\n  \ntemplate <\n  typename T, \n  typename DerivedI, \n  typename DerivedJ,\n  typename DerivedV>\nIGL_INLINE void igl::find(\n  const Eigen::SparseMatrix<T>& X,\n  Eigen::DenseBase<DerivedI> & I,\n  Eigen::DenseBase<DerivedJ> & J,\n  Eigen::DenseBase<DerivedV> & V)\n{\n  // Resize outputs to fit nonzeros\n  I.derived().resize(X.nonZeros(),1);\n  J.derived().resize(X.nonZeros(),1);\n  V.derived().resize(X.nonZeros(),1);\n\n  int i = 0;\n  // Iterate over outside\n  for(int k=0; k<X.outerSize(); ++k)\n  {\n    // Iterate over inside\n    for(typename Eigen::SparseMatrix<T>::InnerIterator it (X,k); it; ++it)\n    {\n      V(i) = it.value();\n      I(i) = it.row();\n      J(i) = it.col();\n      i++;\n    }\n  }\n}\n\ntemplate <\n  typename DerivedX,\n  typename DerivedI, \n  typename DerivedJ,\n  typename DerivedV>\nIGL_INLINE void igl::find(\n  const Eigen::DenseBase<DerivedX>& X,\n  Eigen::PlainObjectBase<DerivedI> & I,\n  Eigen::PlainObjectBase<DerivedJ> & J,\n  Eigen::PlainObjectBase<DerivedV> & V)\n{\n  const int nnz = X.count();\n  I.resize(nnz,1);\n  J.resize(nnz,1);\n  V.resize(nnz,1);\n  {\n    int k = 0;\n    for(int j = 0;j<X.cols();j++)\n    {\n      for(int i = 0;i<X.rows();i++)\n      {\n        if(X(i,j))\n        {\n          I(k) = i;\n          J(k) = j;\n          V(k) = X(i,j);\n          k++;\n        }\n      }\n    }\n  }\n}\n\ntemplate <\n  typename DerivedX,\n  typename DerivedI>\nIGL_INLINE void igl::find(\n  const Eigen::DenseBase<DerivedX>& X,\n  Eigen::PlainObjectBase<DerivedI> & I)\n{\n  const int nnz = X.count();\n  I.resize(nnz,1);\n  {\n    int k = 0;\n    for(int j = 0;j<X.cols();j++)\n    {\n      for(int i = 0;i<X.rows();i++)\n      {\n        if(X(i,j))\n        {\n          I(k) = i+X.rows()*j;\n          k++;\n        }\n      }\n    }\n  }\n}\n  \ntemplate <typename T>\nIGL_INLINE void igl::find(\n  const Eigen::SparseVector<T>& X,\n  Eigen::Matrix<int,Eigen::Dynamic,1> & I,\n  Eigen::Matrix<T,Eigen::Dynamic,1> & V)\n{\n  // Resize outputs to fit nonzeros\n  I.resize(X.nonZeros());\n  V.resize(X.nonZeros());\n\n  int i = 0;\n  // loop over non-zeros\n  for(typename Eigen::SparseVector<T>::InnerIterator it(X); it; ++it)\n  {\n    I(i) = it.index();\n    V(i) = it.value();\n    i++;\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::find<Eigen::CwiseBinaryOp<Eigen::internal::scalar_cmp_op<long, (Eigen::internal::ComparisonName)0>, Eigen::PartialReduxExpr<Eigen::Array<bool, -1, 3, 0, -1, 3>, Eigen::internal::member_count<long>, 1> const, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<long>, Eigen::Array<long, -1, 1, 0, -1, 1> > const>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::CwiseBinaryOp<Eigen::internal::scalar_cmp_op<long, (Eigen::internal::ComparisonName)0>, Eigen::PartialReduxExpr<Eigen::Array<bool, -1, 3, 0, -1, 3>, Eigen::internal::member_count<long>, 1> const, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<long>, Eigen::Array<long, -1, 1, 0, -1, 1> > const> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::find<bool, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Array<bool, -1, 1, 0, -1, 1> >(Eigen::SparseMatrix<bool, 0, int> const&, Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::DenseBase<Eigen::Array<bool, -1, 1, 0, -1, 1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::find<Eigen::Array<bool, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Array<bool, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::find<Eigen::CwiseBinaryOp<Eigen::internal::scalar_cmp_op<int, (Eigen::internal::ComparisonName)0>, Eigen::Array<int, -1, 1, 0, -1, 1> const, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<int>, Eigen::Array<int, -1, 1, 0, -1, 1> > const>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::CwiseBinaryOp<Eigen::internal::scalar_cmp_op<int, (Eigen::internal::ComparisonName)0>, Eigen::Array<int, -1, 1, 0, -1, 1> const, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<int>, Eigen::Array<int, -1, 1, 0, -1, 1> > const> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::find<double, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::SparseMatrix<double, 0, int> const&, Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::DenseBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\ntemplate void igl::find<double, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::SparseMatrix<double, 0, int> const&, Eigen::DenseBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::DenseBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::DenseBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::find<double, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::SparseMatrix<double, 0, int> const&, Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::DenseBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::find<Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::find<double, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::SparseMatrix<double, 0, int> const&, Eigen::DenseBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::DenseBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::DenseBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/find.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_FIND_H\n#define IGL_FIND_H\n#include \"igl_inline.h\"\n#define EIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET\n#include <Eigen/Dense>\n#include <Eigen/Sparse>\nnamespace igl\n{\n  // Find the non-zero entries and there respective indices in a sparse matrix.\n  // Like matlab's [I,J,V] = find(X)\n  //\n  // Templates:\n  //   T  should be a eigen sparse matrix primitive type like int or double\n  // Input:\n  //   X  m by n matrix whose entries are to be found \n  // Outputs:\n  //   I  nnz vector of row indices of non zeros entries in X\n  //   J  nnz vector of column indices of non zeros entries in X\n  //   V  nnz vector of type T non-zeros entries in X\n  //\n  template <\n    typename T, \n    typename DerivedI, \n    typename DerivedJ,\n    typename DerivedV>\n  IGL_INLINE void find(\n    const Eigen::SparseMatrix<T>& X,\n    Eigen::DenseBase<DerivedI> & I,\n    Eigen::DenseBase<DerivedJ> & J,\n    Eigen::DenseBase<DerivedV> & V);\n  template <\n    typename DerivedX,\n    typename DerivedI, \n    typename DerivedJ,\n    typename DerivedV>\n  IGL_INLINE void find(\n    const Eigen::DenseBase<DerivedX>& X,\n    Eigen::PlainObjectBase<DerivedI> & I,\n    Eigen::PlainObjectBase<DerivedJ> & J,\n    Eigen::PlainObjectBase<DerivedV> & V);\n  template <\n    typename DerivedX,\n    typename DerivedI>\n  IGL_INLINE void find(\n    const Eigen::DenseBase<DerivedX>& X,\n    Eigen::PlainObjectBase<DerivedI> & I);\n  // Find the non-zero entries and there respective indices in a sparse vector.\n  // Similar to matlab's [I,J,V] = find(X), but instead of [I,J] being\n  // subscripts into X, since X is a vector we just return I, a list of indices\n  // into X\n  //\n  // Templates:\n  //   T  should be a eigen sparse matrix primitive type like int or double\n  // Input:\n  //   X  vector whose entries are to be found\n  // Outputs:\n  //   I  nnz vector of indices of non zeros entries in X\n  //   V  nnz vector of type T non-zeros entries in X\n  template <typename T>\n  IGL_INLINE void find(\n    const Eigen::SparseVector<T>& X,\n    Eigen::Matrix<int,Eigen::Dynamic,1> & I,\n    Eigen::Matrix<T,Eigen::Dynamic,1> & V);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"find.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/find_cross_field_singularities.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>, Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"find_cross_field_singularities.h\"\n\n#include <vector>\n#include <igl/cross_field_missmatch.h>\n#include <igl/is_border_vertex.h>\n#include <igl/vertex_triangle_adjacency.h>\n#include <igl/is_border_vertex.h>\n#include <igl/cross_field_missmatch.h>\n\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedM, typename DerivedO>\nIGL_INLINE void igl::find_cross_field_singularities(const Eigen::PlainObjectBase<DerivedV> &V,\n                                                    const Eigen::PlainObjectBase<DerivedF> &F,\n                                                    const Eigen::PlainObjectBase<DerivedM> &Handle_MMatch,\n                                                    Eigen::PlainObjectBase<DerivedO> &isSingularity,\n                                                    Eigen::PlainObjectBase<DerivedO> &singularityIndex)\n{\n  std::vector<bool> V_border = igl::is_border_vertex(V,F);\n\n  std::vector<std::vector<int> > VF;\n  std::vector<std::vector<int> > VFi;\n  igl::vertex_triangle_adjacency(V,F,VF,VFi);\n\n\n  isSingularity.setZero(V.rows(),1);\n  singularityIndex.setZero(V.rows(),1);\n  for (unsigned int vid=0;vid<V.rows();vid++)\n  {\n    ///check that is on border..\n    if (V_border[vid])\n      continue;\n\n    int missmatch=0;\n    for (unsigned int i=0;i<VF[vid].size();i++)\n    {\n      // look for the vertex\n      int j=-1;\n      for (unsigned z=0; z<3; ++z)\n        if (F(VF[vid][i],z) == vid)\n          j=z;\n      assert(j!=-1);\n\n      missmatch+=Handle_MMatch(VF[vid][i],j);\n    }\n    missmatch=missmatch%4;\n\n    isSingularity(vid)=(missmatch!=0);\n    singularityIndex(vid)=missmatch;\n  }\n\n\n}\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedO>\nIGL_INLINE void igl::find_cross_field_singularities(const Eigen::PlainObjectBase<DerivedV> &V,\n                                                    const Eigen::PlainObjectBase<DerivedF> &F,\n                                                    const Eigen::PlainObjectBase<DerivedV> &PD1,\n                                                    const Eigen::PlainObjectBase<DerivedV> &PD2,\n                                                    Eigen::PlainObjectBase<DerivedO> &isSingularity,\n                                                    Eigen::PlainObjectBase<DerivedO> &singularityIndex,\n                                                    bool isCombed)\n{\n  Eigen::Matrix<typename DerivedF::Scalar, Eigen::Dynamic, 3> Handle_MMatch;\n\n  igl::cross_field_missmatch(V, F, PD1, PD2, isCombed, Handle_MMatch);\n  igl::find_cross_field_singularities(V, F, Handle_MMatch, isSingularity, singularityIndex);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::find_cross_field_singularities<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::find_cross_field_singularities<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&,\nEigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, bool);\ntemplate void igl::find_cross_field_singularities<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::find_cross_field_singularities<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, bool);\ntemplate void igl::find_cross_field_singularities<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/find_cross_field_singularities.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>, Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_FIND_CROSS_FIELD_SINGULARITIES_H\n#define IGL_FIND_CROSS_FIELD_SINGULARITIES_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Computes singularities of a cross field, assumed combed\n\n\n  // Inputs:\n  //   V                #V by 3 eigen Matrix of mesh vertex 3D positions\n  //   F                #F by 3 eigen Matrix of face (quad) indices\n  //   Handle_MMatch    #F by 3 eigen Matrix containing the integer missmatch of the cross field\n  //                    across all face edges\n  // Output:\n  //   isSingularity    #V by 1 boolean eigen Vector indicating the presence of a singularity on a vertex\n  //   singularityIndex #V by 1 integer eigen Vector containing the singularity indices\n  //\n  template <typename DerivedV, typename DerivedF, typename DerivedM, typename DerivedO>\n  IGL_INLINE void find_cross_field_singularities(const Eigen::PlainObjectBase<DerivedV> &V,\n                                                 const Eigen::PlainObjectBase<DerivedF> &F,\n                                                 const Eigen::PlainObjectBase<DerivedM> &Handle_MMatch,\n                                                 Eigen::PlainObjectBase<DerivedO> &isSingularity,\n                                                 Eigen::PlainObjectBase<DerivedO> &singularityIndex);\n\n  // Wrapper that calculates the missmatch if it is not provided.\n  // Note that the field in PD1 and PD2 MUST BE combed (see igl::comb_cross_field).\n  // Inputs:\n  //   V                #V by 3 eigen Matrix of mesh vertex 3D positions\n  //   F                #F by 3 eigen Matrix of face (quad) indices\n  //   PD1              #F by 3 eigen Matrix of the first per face cross field vector\n  //   PD2              #F by 3 eigen Matrix of the second per face  cross field vector\n  // Output:\n  //   isSingularity    #V by 1 boolean eigen Vector indicating the presence of a singularity on a vertex\n  //   singularityIndex #V by 1 integer eigen Vector containing the singularity indices\n  //\n  template <typename DerivedV, typename DerivedF, typename DerivedO>\n  IGL_INLINE void find_cross_field_singularities(const Eigen::PlainObjectBase<DerivedV> &V,\n                                                 const Eigen::PlainObjectBase<DerivedF> &F,\n                                                 const Eigen::PlainObjectBase<DerivedV> &PD1,\n                                                 const Eigen::PlainObjectBase<DerivedV> &PD2,\n                                                 Eigen::PlainObjectBase<DerivedO> &isSingularity,\n                                                 Eigen::PlainObjectBase<DerivedO> &singularityIndex,\n                                                 bool isCombed = false);\n}\n#ifndef IGL_STATIC_LIBRARY\n#include \"find_cross_field_singularities.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/find_zero.cpp",
    "content": "#include \"find_zero.h\"\n#include \"for_each.h\"\n#include \"any.h\"\n\ntemplate <typename AType, typename DerivedI>\nIGL_INLINE void igl::find_zero(\n  const Eigen::SparseMatrix<AType> & A,\n  const int dim,\n  Eigen::PlainObjectBase<DerivedI> & I)\n{\n  assert((dim == 1 || dim == 2) && \"dim must be 2 or 1\");\n  // Get size of input\n  int m = A.rows();\n  int n = A.cols();\n  // I starts by containing guess where 0 might be\n  I = DerivedI::Zero(dim==1?n:m);\n  Eigen::Array<bool,Eigen::Dynamic,1> found = \n    Eigen::Array<bool,Eigen::Dynamic,1>::Zero(dim==1?n:m);\n  const auto func = [&I,&found,&dim](int i, int j, const int v)\n  {\n    if(dim == 2)\n    {\n      std::swap(i,j);\n    }\n    // Coded as if dim == 1, assuming swap for dim == 2\n    // Have we already found a zero?\n    if(!found(j))\n    {\n      if(I(j) != i || v == 0)\n      {\n        // either there was an implicit zero between the last element and this\n        // one, or this one is zero\n        found(j) = true;\n      }else\n      {\n        // If not found, then guess that next element will be zero\n        I(j) = I(j)+1;\n      }\n    }\n  };\n  for_each(A,func);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::find_zero<bool, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::SparseMatrix<bool, 0, int> const&, int, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/find_zero.h",
    "content": "#ifndef IGL_FIND_ZERO_H\n#define IGL_FIND_ZERO_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <Eigen/Sparse>\nnamespace igl\n{\n  // Find the first zero (whether implicit or explicitly stored) in the\n  // rows/columns of a matrix.\n  // Inputs:\n  //   A  m by n sparse matrix\n  //   dim  dimension along which to check for any (1 or 2)\n  // Output:\n  //   I  n-long vector (if dim == 1)  {m means no zeros found}\n  //   or\n  //   I  m-long vector (if dim == 2)  {n means no zeros found}\n  //\n  template <typename AType, typename DerivedI>\n  IGL_INLINE void find_zero(\n    const Eigen::SparseMatrix<AType> & A,\n    const int dim,\n    Eigen::PlainObjectBase<DerivedI> & I);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"find_zero.cpp\"\n#endif\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/fit_plane.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Daniele Panozzo <daniele.panozzo@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"fit_plane.h\"\n#include <iostream>\n\nIGL_INLINE void igl::fit_plane(\n    const Eigen::MatrixXd & V,\n    Eigen::RowVector3d & N,\n    Eigen::RowVector3d & C)\n{\n  assert(V.rows()>0);\n\n  Eigen::Vector3d sum = V.colwise().sum();\n\n  Eigen::Vector3d center = sum.array()/(double(V.rows()));\n\n  C = center;\n\n  double sumXX=0.0f,sumXY=0.0f,sumXZ=0.0f;\n  double sumYY=0.0f,sumYZ=0.0f;\n  double sumZZ=0.0f;\n\n  for(int i=0;i<V.rows();i++)\n  {\n    double diffX=V(i,0)-center(0);\n    double diffY=V(i,1)-center(1);\n    double diffZ=V(i,2)-center(2);\n    sumXX+=diffX*diffX;\n    sumXY+=diffX*diffY;\n    sumXZ+=diffX*diffZ;\n    sumYY+=diffY*diffY;\n    sumYZ+=diffY*diffZ;\n    sumZZ+=diffZ*diffZ;\n  }\n\n  Eigen::MatrixXd m(3,3);\n  m << sumXX,sumXY,sumXZ,\n    sumXY,sumYY,sumYZ,\n    sumXZ,sumYZ,sumZZ;\n\n  Eigen::SelfAdjointEigenSolver<Eigen::MatrixXd> es(m);\n  \n  N = es.eigenvectors().col(0);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n#endif\n\n\n\n"
  },
  {
    "path": "libs/libigl/include/igl/fit_plane.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Daniele Panozzo <daniele.panozzo@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_FIT_PLANE_H\n#define IGL_FIT_PLANE_H\n\n#include \"igl_inline.h\"\n#include <Eigen/Dense>\n\nnamespace igl\n{\n  // This function fits a plane to a point cloud.\n  //\n  // Input:\n  //   V #Vx3 matrix. The 3D point cloud, one row for each vertex.\n  // Output: \n  //   N 1x3 Vector. The normal of the fitted plane.\n  //   C 1x3 Vector. A point that lies in the fitted plane.\n  // From http://missingbytes.blogspot.com/2012/06/fitting-plane-to-point-cloud.html\n\n  IGL_INLINE void fit_plane(\n    const Eigen::MatrixXd & V,\n    Eigen::RowVector3d & N,\n    Eigen::RowVector3d & C);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"fit_plane.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/fit_rigid.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"fit_rigid.h\"\n#include \"procrustes.h\"\n\nIGL_INLINE void igl::fit_rigid(\n  const Eigen::MatrixXd & A,\n  const Eigen::MatrixXd & B,\n  Eigen::Rotation2Dd & R,\n  Eigen::RowVector2d & t)\n{\n  using namespace Eigen;\n  Matrix2d Rmat;\n  procrustes(A,B,Rmat,t);\n  R.fromRotationMatrix(Rmat);\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/fit_rigid.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_FIT_RIGID_H\n#define IGL_FIT_RIGID_H\n\n#warning \"Deprecated. Use igl/procrustes.h instead\"\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <Eigen/Geometry>\n\nnamespace igl\n{\n  // Deprecated: please use procrustes(...) instead.\n  // Fit a rigid \n  IGL_INLINE void fit_rigid(\n    const Eigen::MatrixXd & A,\n    const Eigen::MatrixXd & B,\n    Eigen::Rotation2Dd & R,\n    Eigen::RowVector2d & t);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"fit_rigid.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/fit_rotations.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"fit_rotations.h\"\n#include \"polar_svd3x3.h\"\n#include \"repmat.h\"\n#include \"verbose.h\"\n#include \"polar_dec.h\"\n#include \"polar_svd.h\"\n#include \"C_STR.h\"\n#include <iostream>\n\ntemplate <typename DerivedS, typename DerivedD>\nIGL_INLINE void igl::fit_rotations(\n  const Eigen::PlainObjectBase<DerivedS> & S,\n  const bool single_precision,\n  Eigen::PlainObjectBase<DerivedD> & R)\n{\n  using namespace std;\n  const int dim = S.cols();\n  const int nr = S.rows()/dim;\n  assert(nr * dim == S.rows());\n  assert(dim == 3);\n\n  // resize output\n  R.resize(dim,dim*nr); // hopefully no op (should be already allocated)\n\n  //std::cout<<\"S=[\"<<std::endl<<S<<std::endl<<\"];\"<<std::endl;\n  //MatrixXd si(dim,dim);\n  Eigen::Matrix<typename DerivedS::Scalar,3,3> si;// = Eigen::Matrix3d::Identity();\n  // loop over number of rotations we're computing\n  for(int r = 0;r<nr;r++)\n  {\n    // build this covariance matrix\n    for(int i = 0;i<dim;i++)\n    {\n      for(int j = 0;j<dim;j++)\n      {\n        si(i,j) = S(i*nr+r,j);\n      }\n    }\n    typedef Eigen::Matrix<typename DerivedD::Scalar,3,3> Mat3;\n    typedef Eigen::Matrix<typename DerivedD::Scalar,3,1> Vec3;\n    Mat3 ri;\n    if(single_precision)\n    {\n      polar_svd3x3(si, ri);\n    }else\n    {\n      Mat3 ti,ui,vi;\n      Vec3 _;\n      igl::polar_svd(si,ri,ti,ui,_,vi);\n    }\n    assert(ri.determinant() >= 0);\n    R.block(0,r*dim,dim,dim) = ri.block(0,0,dim,dim).transpose();\n    //cout<<matlab_format(si,C_STR(\"si_\"<<r))<<endl;\n    //cout<<matlab_format(ri.transpose().eval(),C_STR(\"ri_\"<<r))<<endl;\n  }\n}\n\ntemplate <typename DerivedS, typename DerivedD>\nIGL_INLINE void igl::fit_rotations_planar(\n  const Eigen::PlainObjectBase<DerivedS> & S,\n        Eigen::PlainObjectBase<DerivedD> & R)\n{ \n  using namespace std;\n  const int dim = S.cols();\n  const int nr = S.rows()/dim;\n  //assert(dim == 2 && \"_planar input should be 2D\");\n  assert(nr * dim == S.rows());\n\n  // resize output\n  R.resize(dim,dim*nr); // hopefully no op (should be already allocated)\n\n  Eigen::Matrix<typename DerivedS::Scalar,2,2> si;\n  // loop over number of rotations we're computing\n  for(int r = 0;r<nr;r++)\n  {\n    // build this covariance matrix\n    for(int i = 0;i<2;i++)\n    {\n      for(int j = 0;j<2;j++)\n      {\n        si(i,j) = S(i*nr+r,j);\n      }\n    }\n    typedef Eigen::Matrix<typename DerivedD::Scalar,2,2> Mat2;\n    typedef Eigen::Matrix<typename DerivedD::Scalar,2,1> Vec2;\n    Mat2 ri,ti,ui,vi;\n    Vec2 _;\n    igl::polar_svd(si,ri,ti,ui,_,vi);\n#ifndef FIT_ROTATIONS_ALLOW_FLIPS\n    // Check for reflection\n    if(ri.determinant() < 0)\n    {\n      vi.col(1) *= -1.;\n      ri = ui * vi.transpose();\n    }\n    assert(ri.determinant() >= 0);\n#endif  \n\n    // Not sure why polar_dec computes transpose...\n    R.block(0,r*dim,dim,dim).setIdentity();\n    R.block(0,r*dim,2,2) = ri.transpose();\n  }\n}\n\n\n#ifdef __SSE__\nIGL_INLINE void igl::fit_rotations_SSE(\n  const Eigen::MatrixXf & S, \n  Eigen::MatrixXf & R)\n{\n  const int cStep = 4;\n\n  assert(S.cols() == 3);\n  const int dim = 3; //S.cols();\n  const int nr = S.rows()/dim;  \n  assert(nr * dim == S.rows());\n\n  // resize output\n  R.resize(dim,dim*nr); // hopefully no op (should be already allocated)\n\n  Eigen::Matrix<float, 3*cStep, 3> siBig;\n  // using SSE decompose cStep matrices at a time:\n  int r = 0;\n  for( ; r<nr; r+=cStep)\n  {\n    int numMats = cStep;\n    if (r + cStep >= nr) numMats = nr - r;\n    // build siBig:\n    for (int k=0; k<numMats; k++)\n    {\n      for(int i = 0;i<dim;i++)\n      {\n        for(int j = 0;j<dim;j++)\n        {\n          siBig(i + 3*k, j) = S(i*nr + r + k, j);\n        }\n      }\n    }\n    Eigen::Matrix<float, 3*cStep, 3> ri;\n    polar_svd3x3_sse(siBig, ri);    \n\n    for (int k=0; k<cStep; k++)\n      assert(ri.block(3*k, 0, 3, 3).determinant() >= 0);\n\n    // Not sure why polar_dec computes transpose...\n    for (int k=0; k<numMats; k++)\n    {\n      R.block(0, (r + k)*dim, dim, dim) = ri.block(3*k, 0, dim, dim).transpose();\n    }    \n  }\n}\n\nIGL_INLINE void igl::fit_rotations_SSE(\n  const Eigen::MatrixXd & S,\n  Eigen::MatrixXd & R)\n{\n  const Eigen::MatrixXf Sf = S.cast<float>();\n  Eigen::MatrixXf Rf;\n  fit_rotations_SSE(Sf,Rf);\n  R = Rf.cast<double>();\n}\n#endif\n\n#ifdef __AVX__\nIGL_INLINE void igl::fit_rotations_AVX(\n  const Eigen::MatrixXf & S,\n  Eigen::MatrixXf & R)\n{\n  const int cStep = 8;\n\n  assert(S.cols() == 3);\n  const int dim = 3; //S.cols();\n  const int nr = S.rows()/dim;  \n  assert(nr * dim == S.rows());\n\n  // resize output\n  R.resize(dim,dim*nr); // hopefully no op (should be already allocated)\n\n  Eigen::Matrix<float, 3*cStep, 3> siBig;\n  // using SSE decompose cStep matrices at a time:\n  int r = 0;\n  for( ; r<nr; r+=cStep)\n  {\n    int numMats = cStep;\n    if (r + cStep >= nr) numMats = nr - r;\n    // build siBig:\n    for (int k=0; k<numMats; k++)\n    {\n      for(int i = 0;i<dim;i++)\n      {\n        for(int j = 0;j<dim;j++)\n        {\n          siBig(i + 3*k, j) = S(i*nr + r + k, j);\n        }\n      }\n    }\n    Eigen::Matrix<float, 3*cStep, 3> ri;\n    polar_svd3x3_avx(siBig, ri);    \n\n    for (int k=0; k<cStep; k++)\n      assert(ri.block(3*k, 0, 3, 3).determinant() >= 0);\n\n    // Not sure why polar_dec computes transpose...\n    for (int k=0; k<numMats; k++)\n    {\n      R.block(0, (r + k)*dim, dim, dim) = ri.block(3*k, 0, dim, dim).transpose();\n    }    \n  }\n}\n#endif\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::fit_rotations<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::fit_rotations_planar<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::fit_rotations_planar<Eigen::Matrix<float, -1, -1, 0, -1, -1>, Eigen::Matrix<float, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<float, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, -1, 0, -1, -1> >&);\ntemplate void igl::fit_rotations<Eigen::Matrix<float,-1,-1,0,-1,-1>,Eigen::Matrix<float,-1,-1,0,-1,-1> >(Eigen::PlainObjectBase<Eigen::Matrix<float,-1,-1,0,-1,-1> > const &,bool,Eigen::PlainObjectBase<Eigen::Matrix<float,-1,-1,0,-1,-1> > &);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/fit_rotations.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_FIT_ROTATIONS_H\n#define IGL_FIT_ROTATIONS_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n\nnamespace igl\n{\n  // Known issues: This seems to be implemented in Eigen/Geometry:\n  // Eigen::umeyama\n  //\n  // FIT_ROTATIONS Given an input mesh and new positions find rotations for\n  // every covariance matrix in a stack of covariance matrices\n  // \n  // Inputs:\n  //   S  nr*dim by dim stack of covariance matrices\n  //   single_precision  whether to use single precision (faster)\n  // Outputs:\n  //   R  dim by dim * nr list of rotations\n  //\n  template <typename DerivedS, typename DerivedD>\n  IGL_INLINE void fit_rotations(\n    const Eigen::PlainObjectBase<DerivedS> & S,\n    const bool single_precision,\n          Eigen::PlainObjectBase<DerivedD> & R);\n  \n  // FIT_ROTATIONS Given an input mesh and new positions find 2D rotations for\n  // every vertex that best maps its one ring to the new one ring\n  // \n  // Inputs:\n  //   S  nr*dim by dim stack of covariance matrices, third column and every\n  //   third row will be ignored\n  // Outputs:\n  //   R  dim by dim * nr list of rotations, third row and third column of each\n  //   rotation will just be identity\n  //\n  template <typename DerivedS, typename DerivedD>\n  IGL_INLINE void fit_rotations_planar(\n    const Eigen::PlainObjectBase<DerivedS> & S,\n          Eigen::PlainObjectBase<DerivedD> & R);\n#ifdef __SSE__\n  IGL_INLINE void fit_rotations_SSE( const Eigen::MatrixXf & S, Eigen::MatrixXf & R);\n  IGL_INLINE void fit_rotations_SSE( const Eigen::MatrixXd & S, Eigen::MatrixXd & R);\n#endif\n#ifdef __AVX__\n  IGL_INLINE void fit_rotations_AVX( const Eigen::MatrixXf & S, Eigen::MatrixXf & R);\n#endif\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"fit_rotations.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/flare_textures.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_FLARE_TEXTURES_H\n#define IGL_FLARE_TEXTURES_H\nnamespace igl\n{\n  const uint8_t FLARE_TEXTURE_0[16384] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,12,12,12,12,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,12,12,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,12,15,15,15,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,15,15,12,12,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,15,15,20,20,20,20,20,20,20,20,23,23,23,23,23,23,23,23,23,23,23,23,23,23,20,20,20,20,20,20,20,20,15,15,12,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,15,20,20,20,20,20,20,23,23,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,23,23,23,20,20,20,20,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,20,20,20,23,23,28,28,28,28,28,28,28,31,31,31,31,31,31,31,31,31,31,31,31,31,31,28,28,28,28,28,28,28,28,23,23,20,20,20,20,15,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,20,20,23,28,28,28,28,28,28,31,31,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,31,31,31,28,28,28,28,28,23,23,20,20,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,15,20,20,20,23,23,28,28,28,28,31,31,36,36,36,36,36,36,36,36,39,39,39,39,39,39,39,39,39,39,39,39,39,36,36,36,36,36,36,36,36,31,28,28,28,28,28,23,20,20,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,20,23,28,28,28,28,31,31,36,36,36,36,36,39,39,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,39,39,36,36,36,36,36,36,31,28,28,28,28,23,20,20,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,20,23,28,28,28,28,31,36,36,36,36,39,39,44,44,44,44,44,44,44,44,47,47,47,47,47,47,47,47,47,47,47,47,47,44,44,44,44,44,44,44,39,39,36,36,36,36,31,31,28,28,28,23,23,20,20,20,15,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,15,20,20,20,23,28,28,28,31,31,36,36,36,36,39,44,44,44,44,44,47,47,47,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,47,47,44,44,44,44,44,39,39,36,36,36,36,31,28,28,28,23,20,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,23,28,28,28,28,31,36,36,36,39,44,44,44,44,44,47,47,52,52,52,52,52,52,52,55,55,55,55,55,55,55,55,55,55,55,55,55,52,52,52,52,52,52,52,47,47,44,44,44,44,39,36,36,36,36,31,28,28,28,23,20,20,20,15,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,15,20,20,20,23,28,28,28,31,36,36,36,39,44,44,44,44,47,52,52,52,52,52,52,55,55,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,55,55,52,52,52,52,52,47,47,44,44,44,39,39,36,36,36,31,28,28,28,23,20,20,15,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,15,20,20,23,28,28,28,31,36,36,36,39,44,44,44,44,47,52,52,52,52,55,55,60,60,60,60,60,60,60,63,63,63,63,63,63,63,63,63,63,63,63,60,60,60,60,60,60,60,60,55,52,52,52,52,52,47,44,44,44,39,36,36,36,31,28,28,28,23,20,20,20,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,15,20,20,23,28,28,28,36,36,36,39,44,44,44,47,47,52,52,52,55,55,60,60,60,60,60,63,63,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,63,63,63,60,60,60,60,60,55,52,52,52,52,47,44,44,44,39,36,36,36,31,28,28,28,20,20,20,15,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,20,20,20,23,28,28,31,36,36,36,39,44,44,44,47,52,52,52,55,60,60,60,60,63,63,68,68,68,68,68,68,68,71,71,71,71,71,71,71,71,71,71,71,71,68,68,68,68,68,68,68,63,63,60,60,60,60,55,52,52,52,52,47,44,44,44,39,36,36,36,28,28,28,23,20,20,15,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,20,20,28,28,28,31,36,36,39,44,44,44,47,52,52,52,55,60,60,60,60,63,68,68,68,68,68,71,71,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,71,71,68,68,68,68,68,63,63,60,60,60,55,55,52,52,52,47,44,44,39,36,36,36,31,28,28,23,20,20,15,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,20,23,28,28,31,36,36,36,39,44,44,47,52,52,52,55,60,60,60,63,63,68,68,68,68,71,76,76,76,76,76,76,76,79,79,79,79,79,79,79,79,79,79,79,79,76,76,76,76,76,76,76,71,71,68,68,68,68,63,60,60,60,55,52,52,52,47,44,44,44,39,36,36,31,28,28,23,20,20,15,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,20,23,28,28,31,36,36,39,44,44,44,47,52,52,55,60,60,60,63,63,68,68,68,71,71,76,76,76,76,79,79,79,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,79,79,76,76,76,76,76,71,68,68,68,68,63,60,60,60,55,52,52,52,47,44,44,39,36,36,31,28,28,23,20,20,15,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,20,23,28,28,31,36,36,39,44,44,47,52,52,52,55,60,60,60,63,68,68,68,71,76,76,76,76,79,79,84,84,84,84,84,84,84,87,87,87,87,87,87,87,87,87,87,87,84,84,84,84,84,84,84,79,76,76,76,76,71,71,68,68,68,63,60,60,60,55,52,52,47,44,44,44,36,36,36,28,28,28,20,20,15,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,20,23,28,28,31,36,36,39,44,44,47,52,52,55,60,60,60,63,68,68,68,71,76,76,76,76,79,84,84,84,84,84,87,87,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,87,87,84,84,84,84,84,79,76,76,76,71,71,68,68,68,60,60,60,55,52,52,52,44,44,44,36,36,36,28,28,28,20,20,15,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,20,20,23,28,28,31,36,36,39,44,44,47,52,52,55,60,60,63,68,68,68,71,76,76,76,79,79,84,84,84,84,87,92,92,92,92,92,92,92,95,95,95,95,95,95,95,95,95,95,95,92,92,92,92,92,92,87,87,84,84,84,84,79,76,76,76,71,68,68,68,63,60,60,60,52,52,52,47,44,44,39,36,36,28,28,28,20,20,15,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,20,20,23,28,28,31,36,36,39,44,44,47,52,52,55,60,60,63,68,68,68,71,76,76,79,79,84,84,84,87,92,92,92,92,92,95,95,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,95,95,92,92,92,92,92,87,84,84,84,84,79,76,76,76,71,68,68,68,60,60,60,55,52,52,47,44,44,39,36,36,28,28,23,20,20,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,15,20,20,28,28,31,36,36,39,44,44,52,52,52,60,60,60,63,68,68,71,76,76,76,79,84,84,84,87,92,92,92,92,95,100,100,100,100,100,100,100,103,103,103,103,103,103,103,103,103,103,100,100,100,100,100,100,100,95,95,92,92,92,87,87,84,84,84,79,76,76,71,68,68,68,63,60,60,55,52,52,47,44,44,39,36,36,28,28,23,20,20,15,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,20,28,28,31,36,36,39,44,44,52,52,52,60,60,60,68,68,68,71,76,76,79,84,84,84,87,92,92,92,95,95,100,100,100,100,103,103,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,103,103,100,100,100,100,100,95,92,92,92,87,84,84,84,79,76,76,76,71,68,68,63,60,60,55,52,52,47,44,44,39,36,36,28,28,23,20,20,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,15,20,20,23,28,31,36,36,39,44,44,52,52,52,60,60,63,68,68,68,76,76,76,79,84,84,87,92,92,92,95,95,100,100,100,103,103,108,108,108,108,108,108,111,111,111,111,111,111,111,111,111,111,108,108,108,108,108,108,108,103,100,100,100,100,95,92,92,92,87,84,84,84,79,76,76,71,68,68,63,60,60,55,52,52,47,44,44,36,36,31,28,28,23,20,15,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,20,20,23,28,28,36,36,39,44,44,47,52,52,60,60,63,68,68,71,76,76,79,84,84,84,87,92,92,92,95,100,100,100,103,108,108,108,108,108,111,111,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,111,111,108,108,108,108,103,103,100,100,100,95,92,92,92,87,84,84,79,76,76,71,68,68,63,60,60,55,52,52,47,44,44,36,36,31,28,28,20,20,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,23,28,28,31,36,39,44,44,47,52,52,60,60,63,68,68,71,76,76,79,84,84,87,92,92,92,95,100,100,100,103,108,108,108,108,111,116,116,116,116,116,116,119,119,119,119,119,119,119,119,119,119,116,116,116,116,116,116,111,111,108,108,108,103,103,100,100,100,95,92,92,87,84,84,79,76,76,71,68,68,63,60,60,55,52,52,44,44,39,36,36,31,28,23,20,20,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,15,20,20,28,28,31,36,36,44,44,47,52,52,60,60,63,68,68,71,76,76,79,84,84,87,92,92,92,100,100,100,103,108,108,108,111,111,116,116,116,116,119,119,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,119,119,116,116,116,116,111,108,108,108,103,100,100,100,95,92,92,87,84,84,84,76,76,76,68,68,63,60,60,55,52,52,44,44,39,36,36,28,28,23,20,20,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,20,20,23,28,28,36,36,39,44,47,52,52,55,60,60,68,68,71,76,76,79,84,84,87,92,92,95,100,100,100,108,108,108,111,116,116,116,116,119,119,124,124,124,124,124,124,127,127,127,127,127,127,127,127,127,124,124,124,124,124,124,119,116,116,116,116,111,108,108,108,103,100,100,100,92,92,92,84,84,84,76,76,76,68,68,63,60,60,55,52,47,44,44,39,36,31,28,28,20,20,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,23,28,28,36,36,39,44,44,52,52,55,60,60,68,68,71,76,76,79,84,84,87,92,92,95,100,100,103,108,108,108,111,116,116,116,119,124,124,124,124,127,127,132,132,132,132,132,132,132,132,132,132,132,132,132,132,127,127,124,124,124,124,119,119,116,116,116,111,108,108,103,100,100,100,95,92,92,87,84,84,76,76,71,68,68,63,60,60,52,52,47,44,44,36,36,31,28,23,20,20,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,20,20,28,28,31,36,36,44,44,47,52,55,60,60,63,68,68,76,76,79,84,84,87,92,92,95,100,100,103,108,108,111,116,116,116,119,124,124,124,124,127,132,132,132,132,132,132,135,135,135,135,135,135,135,135,135,132,132,132,132,132,132,127,124,124,124,119,119,116,116,111,108,108,108,103,100,100,95,92,92,87,84,84,76,76,71,68,68,63,60,55,52,52,44,44,39,36,36,28,28,23,20,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,23,28,28,36,36,39,44,47,52,52,60,60,63,68,68,76,76,79,84,84,87,92,92,100,100,100,108,108,108,111,116,116,119,124,124,124,127,127,132,132,132,132,135,140,140,140,140,140,140,140,140,140,140,140,140,140,140,135,135,132,132,132,132,127,124,124,124,119,116,116,116,111,108,108,103,100,100,95,92,92,87,84,84,76,76,71,68,68,60,60,55,52,52,44,44,39,36,31,28,28,20,20,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,15,20,20,28,28,31,36,39,44,44,52,52,55,60,63,68,68,71,76,79,84,84,87,92,92,100,100,100,108,108,108,116,116,116,119,124,124,124,127,132,132,132,135,140,140,140,140,140,140,143,143,143,143,143,143,143,143,140,140,140,140,140,140,135,135,132,132,132,127,124,124,124,119,116,116,111,108,108,103,100,100,95,92,92,84,84,79,76,76,71,68,63,60,60,52,52,47,44,44,36,36,28,28,23,20,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,23,28,28,36,36,44,44,47,52,55,60,60,68,68,71,76,76,84,84,87,92,92,95,100,100,108,108,111,116,116,116,124,124,124,127,132,132,132,135,140,140,140,140,143,143,148,148,148,148,148,148,148,148,148,148,148,148,148,143,143,140,140,140,140,135,132,132,132,127,124,124,119,116,116,111,108,108,103,100,100,95,92,92,84,84,79,76,76,68,68,63,60,55,52,52,44,44,39,36,31,28,28,20,20,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,20,20,28,28,31,36,39,44,44,52,52,60,60,63,68,68,76,76,79,84,87,92,92,95,100,100,108,108,111,116,116,119,124,124,124,132,132,132,135,140,140,140,143,143,148,148,148,148,148,151,151,151,151,151,151,151,151,148,148,148,148,148,148,143,140,140,140,135,132,132,132,127,124,124,119,116,116,111,108,108,103,100,100,92,92,87,84,84,79,76,71,68,68,60,60,55,52,47,44,44,36,36,31,28,23,20,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,23,28,31,36,36,44,44,47,52,55,60,60,68,68,71,76,79,84,84,92,92,95,100,100,108,108,111,116,116,119,124,124,127,132,132,132,140,140,140,143,148,148,148,148,151,151,156,156,156,156,156,156,156,156,156,156,156,156,151,151,148,148,148,148,143,140,140,140,135,132,132,127,124,124,119,116,116,111,108,108,103,100,100,92,92,87,84,84,76,76,71,68,63,60,60,52,52,47,44,39,36,31,28,28,20,20,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,20,20,28,28,31,36,39,44,47,52,52,60,60,63,68,71,76,76,84,84,87,92,92,100,100,103,108,108,116,116,119,124,124,127,132,132,135,140,140,140,143,148,148,148,151,156,156,156,156,156,156,159,159,159,159,159,159,159,156,156,156,156,156,151,151,148,148,148,143,140,140,135,132,132,132,124,124,119,116,116,111,108,108,100,100,95,92,92,84,84,79,76,76,68,68,60,60,55,52,47,44,44,36,36,28,28,23,20,15,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,15,20,23,28,28,36,36,44,44,47,52,55,60,63,68,68,76,76,79,84,87,92,92,100,100,103,108,108,116,116,119,124,124,127,132,132,135,140,140,143,148,148,148,151,156,156,156,156,159,164,164,164,164,164,164,164,164,164,164,164,164,159,159,156,156,156,156,151,148,148,143,140,140,140,132,132,132,124,124,119,116,116,111,108,108,100,100,95,92,87,84,84,76,76,71,68,63,60,60,52,52,47,44,39,36,31,28,28,20,20,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,20,20,23,28,31,36,39,44,44,52,52,60,60,63,68,71,76,79,84,84,92,92,95,100,100,108,108,111,116,116,124,124,127,132,132,135,140,140,143,148,148,151,156,156,156,159,159,164,164,164,164,164,167,167,167,167,167,167,167,164,164,164,164,164,159,156,156,156,151,148,148,148,143,140,140,135,132,132,124,124,119,116,116,108,108,103,100,100,92,92,87,84,79,76,76,68,68,63,60,55,52,47,44,44,36,36,28,28,23,20,15,12,7,0,0,0,0,0,0,0,0,0,0,0,0,7,12,15,20,20,28,28,36,36,44,44,47,52,55,60,63,68,68,76,76,79,84,87,92,92,100,100,108,108,111,116,116,124,124,127,132,132,135,140,140,143,148,148,151,156,156,159,164,164,164,164,167,167,172,172,172,172,172,172,172,172,172,172,172,167,164,164,164,164,159,156,156,156,151,148,148,143,140,140,135,132,132,124,124,119,116,116,108,108,103,100,95,92,92,84,84,79,76,71,68,63,60,60,52,52,44,44,39,36,31,28,23,20,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,7,12,15,20,23,28,31,36,36,44,44,52,52,60,60,63,68,71,76,79,84,84,92,92,95,100,103,108,108,116,116,119,124,124,132,132,135,140,140,143,148,148,156,156,156,159,164,164,164,167,172,172,172,172,172,175,175,175,175,175,175,175,172,172,172,172,172,167,164,164,164,159,156,156,151,148,148,143,140,140,132,132,127,124,124,116,116,111,108,108,100,100,95,92,87,84,79,76,76,68,68,60,60,55,52,47,44,39,36,36,28,28,20,20,12,12,0,0,0,0,0,0,0,0,0,0,0,0,12,12,20,20,28,28,31,36,39,44,47,52,55,60,60,68,68,76,76,79,84,87,92,95,100,100,108,108,111,116,119,124,124,132,132,135,140,140,143,148,148,156,156,156,164,164,164,167,172,172,172,175,175,180,180,180,180,180,180,180,180,180,180,180,175,172,172,172,167,164,164,164,159,156,156,151,148,148,143,140,140,132,132,127,124,124,116,116,108,108,103,100,95,92,92,84,84,79,76,71,68,63,60,60,52,52,44,44,36,36,28,28,23,20,15,12,7,0,0,0,0,0,0,0,0,0,0,7,12,15,20,20,28,28,36,36,44,44,52,52,55,60,63,68,71,76,76,84,84,92,92,95,100,103,108,111,116,116,124,124,127,132,132,140,140,143,148,148,156,156,156,164,164,164,172,172,172,175,180,180,180,180,180,183,183,183,183,183,183,180,180,180,180,180,175,172,172,172,167,164,164,159,156,156,151,148,148,140,140,135,132,132,124,124,119,116,111,108,108,100,100,95,92,87,84,79,76,76,68,68,60,60,52,52,47,44,39,36,31,28,23,20,15,12,12,0,0,0,0,0,0,0,0,0,0,7,12,15,20,23,28,31,36,39,44,44,52,52,60,60,68,68,71,76,79,84,87,92,95,100,100,108,108,116,116,119,124,124,132,132,140,140,143,148,148,156,156,156,164,164,167,172,172,172,175,180,180,180,183,188,188,188,188,188,188,188,188,188,188,183,183,180,180,180,175,172,172,167,164,164,159,156,156,151,148,148,140,140,135,132,127,124,124,116,116,111,108,103,100,95,92,92,84,84,76,76,71,68,63,60,55,52,47,44,39,36,36,28,28,20,20,12,12,0,0,0,0,0,0,0,0,0,0,12,12,20,20,23,28,31,36,39,44,47,52,55,60,63,68,68,76,76,84,84,92,92,95,100,103,108,111,116,116,124,124,127,132,135,140,140,148,148,151,156,156,164,164,167,172,172,175,180,180,180,183,188,188,188,188,191,191,191,191,191,191,188,188,188,188,188,183,180,180,175,172,172,167,164,164,159,156,156,148,148,143,140,140,132,132,127,124,119,116,111,108,108,100,100,92,92,87,84,79,76,71,68,63,60,60,52,52,44,44,36,36,28,28,20,20,15,12,7,0,0,0,0,0,0,0,0,0,12,12,20,20,28,28,36,36,44,44,47,52,55,60,63,68,71,76,79,84,84,92,92,100,100,108,108,111,116,119,124,127,132,132,140,140,143,148,151,156,156,164,164,167,172,172,175,180,180,183,188,188,188,191,191,196,196,196,196,196,196,196,196,196,191,188,188,188,183,180,180,180,172,172,167,164,164,159,156,156,148,148,143,140,135,132,132,124,124,116,116,111,108,103,100,95,92,87,84,84,76,76,68,68,60,60,52,52,47,44,39,36,31,28,23,20,15,12,7,0,0,0,0,0,0,0,0,7,12,15,20,20,28,28,36,36,44,44,52,52,60,60,68,68,76,76,79,84,87,92,95,100,103,108,108,116,116,124,124,127,132,135,140,143,148,148,156,156,159,164,164,172,172,175,180,180,183,188,188,191,196,196,196,196,196,199,199,199,199,199,196,196,196,196,191,188,188,188,180,180,180,172,172,167,164,164,156,156,151,148,143,140,140,132,132,127,124,119,116,111,108,108,100,100,92,92,84,84,76,76,71,68,63,60,55,52,47,44,39,36,31,28,23,20,20,12,12,0,0,0,0,0,0,0,0,7,12,15,20,23,28,31,36,39,44,47,52,52,60,60,68,68,76,76,84,84,92,92,100,100,103,108,111,116,119,124,124,132,132,140,140,148,148,151,156,159,164,164,172,172,175,180,180,183,188,188,191,196,196,196,199,204,204,204,204,204,204,204,204,199,199,196,196,196,191,188,188,180,180,180,172,172,167,164,159,156,156,148,148,143,140,135,132,127,124,124,116,116,108,108,100,100,95,92,87,84,79,76,71,68,63,60,55,52,52,44,44,36,36,28,28,20,20,12,12,0,0,0,0,0,0,0,0,7,12,15,20,23,28,31,36,39,44,47,52,55,60,63,68,71,76,79,84,84,92,92,100,100,108,108,116,116,119,124,127,132,135,140,143,148,148,156,156,164,164,167,172,172,180,180,183,188,188,191,196,196,199,204,204,204,204,207,207,207,207,207,204,204,204,204,196,196,196,191,188,188,180,180,175,172,172,164,164,159,156,151,148,143,140,140,132,132,124,124,119,116,111,108,103,100,95,92,87,84,79,76,76,68,68,60,60,52,52,44,44,36,36,28,28,20,20,12,12,0,0,0,0,0,0,0,0,12,12,20,20,28,28,36,36,44,44,47,52,55,60,63,68,71,76,79,84,87,92,95,100,103,108,108,116,116,124,124,132,132,140,140,143,148,151,156,159,164,164,172,172,175,180,183,188,188,191,196,196,199,204,204,207,212,212,212,212,212,212,212,212,207,204,204,204,199,196,196,191,188,188,180,180,175,172,167,164,164,156,156,148,148,140,140,135,132,127,124,119,116,111,108,108,100,100,92,92,84,84,76,76,68,68,60,60,52,52,44,44,39,36,31,28,23,20,15,12,7,0,0,0,0,0,0,0,12,12,20,20,28,28,36,36,44,44,52,52,60,60,68,68,76,76,79,84,87,92,95,100,103,108,111,116,119,124,127,132,132,140,140,148,148,156,156,159,164,167,172,175,180,180,188,188,191,196,196,204,204,204,207,212,212,212,215,215,215,215,212,212,212,212,207,204,204,199,196,196,188,188,183,180,180,172,172,164,164,159,156,151,148,143,140,135,132,132,124,124,116,116,108,108,100,100,92,92,84,84,76,76,71,68,63,60,55,52,47,44,39,36,31,28,23,20,15,12,7,0,0,0,0,0,0,0,12,12,20,20,28,28,36,36,44,44,52,52,60,60,68,68,76,76,84,84,92,92,100,100,108,108,111,116,119,124,127,132,135,140,143,148,151,156,156,164,164,172,172,180,180,183,188,191,196,196,199,204,204,212,212,212,215,220,220,220,220,220,220,220,215,212,212,207,204,204,199,196,191,188,188,180,180,175,172,167,164,159,156,156,148,148,140,140,132,132,124,124,116,116,108,108,103,100,95,92,87,84,79,76,71,68,63,60,55,52,47,44,39,36,31,28,23,20,15,12,7,0,0,0,0,0,0,7,12,15,20,23,28,31,36,36,44,44,52,52,60,60,68,68,76,76,84,84,92,92,100,100,108,108,116,116,124,124,132,132,140,140,143,148,151,156,159,164,167,172,175,180,180,188,188,196,196,199,204,204,212,212,215,220,220,220,220,223,223,223,220,220,220,215,212,212,207,204,204,196,196,191,188,183,180,175,172,172,164,164,156,156,148,148,140,140,135,132,127,124,119,116,111,108,103,100,95,92,87,84,79,76,71,68,63,60,55,52,47,44,39,36,36,28,28,20,20,12,12,0,0,0,0,0,0,7,12,15,20,23,28,31,36,39,44,47,52,55,60,63,68,71,76,79,84,84,92,92,100,100,108,108,116,116,124,124,132,132,140,140,148,148,156,156,164,164,167,172,175,180,183,188,191,196,196,204,204,207,212,215,220,220,223,228,228,228,228,228,228,223,220,220,215,212,212,207,204,199,196,196,188,188,180,180,172,172,164,164,159,156,151,148,143,140,135,132,127,124,119,116,111,108,103,100,95,92,87,84,79,76,76,68,68,60,60,52,52,44,44,36,36,28,28,20,20,12,12,0,0,0,0,0,0,7,12,15,20,23,28,31,36,39,44,47,52,55,60,63,68,71,76,79,84,87,92,95,100,103,108,111,116,119,124,124,132,132,140,140,148,148,156,156,164,164,172,172,180,180,188,188,191,196,199,204,207,212,212,220,220,223,228,228,228,231,231,231,228,228,228,220,220,215,212,212,204,204,196,196,188,188,183,180,175,172,167,164,159,156,151,148,143,140,135,132,127,124,119,116,116,108,108,100,100,92,92,84,84,76,76,68,68,60,60,52,52,44,44,36,36,28,28,20,20,12,12,0,0,0,0,0,0,7,12,15,20,23,28,31,36,39,44,47,52,55,60,63,68,71,76,79,84,87,92,95,100,103,108,111,116,119,124,127,132,135,140,143,148,151,156,156,164,164,172,172,180,180,188,188,196,196,204,204,212,212,215,220,223,228,228,231,236,236,236,236,236,228,228,223,220,220,212,212,207,204,199,196,191,188,183,180,175,172,167,164,159,156,156,148,148,140,140,132,132,124,124,116,116,108,108,100,100,92,92,84,84,76,76,68,68,60,60,52,52,44,44,36,36,28,28,20,20,12,12,0,0,0,0,0,0,7,12,15,20,23,28,31,36,39,44,47,52,55,60,63,68,71,76,79,84,87,92,95,100,103,108,111,116,119,124,127,132,135,140,143,148,151,156,159,164,167,172,175,180,183,188,191,196,196,204,204,212,212,220,220,228,228,231,236,236,239,239,236,236,236,228,228,223,220,215,212,207,204,199,196,196,188,188,180,180,172,172,164,164,156,156,148,148,140,140,132,132,124,124,116,116,108,108,100,100,92,92,84,84,76,76,68,68,60,60,52,52,44,44,36,36,28,28,20,20,12,12,0,0,0,0,0,0,7,12,15,20,23,28,31,36,39,44,47,52,55,60,63,68,71,76,79,84,87,92,95,100,103,108,111,116,119,124,127,132,135,140,143,148,151,156,159,164,167,172,175,180,183,188,191,196,199,204,207,212,215,220,220,228,228,236,236,239,244,244,244,239,236,231,228,223,220,220,212,212,204,204,196,196,188,188,180,180,172,172,164,164,156,156,148,148,140,140,132,132,124,124,116,116,108,108,100,100,92,92,84,84,76,76,68,68,60,60,52,52,44,44,36,36,28,28,20,20,12,12,0,0,0,0,0,0,7,12,15,20,23,28,31,36,39,44,47,52,55,60,63,68,71,76,79,84,87,92,95,100,103,108,111,116,119,124,127,132,135,140,143,148,151,156,159,164,167,172,175,180,183,188,191,196,199,204,207,212,215,220,223,228,231,236,239,244,244,247,244,244,236,236,228,228,220,220,212,212,204,204,196,196,188,188,180,180,172,172,164,164,156,156,148,148,140,140,132,132,124,124,116,116,108,108,100,100,92,92,84,84,76,76,68,68,60,60,52,52,44,44,36,36,28,28,20,20,12,12,0,0,0,0,0,0,7,12,15,20,23,28,31,36,39,44,47,52,55,60,63,68,71,76,79,84,87,92,95,100,103,108,111,116,119,124,127,132,135,140,143,148,151,156,159,164,167,172,175,180,183,188,191,196,199,204,207,212,215,220,223,228,231,236,239,244,247,252,244,244,236,236,228,228,220,220,212,212,204,204,196,196,188,188,180,180,172,172,164,164,156,156,148,148,140,140,132,132,124,124,116,116,108,108,100,100,92,92,84,84,76,76,68,68,60,60,52,52,44,44,36,36,28,28,20,20,12,12,0,0,0,0,0,0,7,12,15,20,23,28,31,36,39,44,47,52,55,60,63,68,71,76,79,84,87,92,95,100,103,108,111,116,119,124,127,132,135,140,143,148,151,156,159,164,167,172,175,180,183,188,191,196,199,204,207,212,215,220,223,228,231,236,236,244,244,244,244,239,236,236,228,228,220,220,212,212,204,204,196,196,188,188,180,180,172,172,164,164,156,156,148,148,140,140,132,132,124,124,116,116,108,108,100,100,92,92,84,84,76,76,68,68,60,60,52,52,44,44,36,36,28,28,20,20,12,12,0,0,0,0,0,0,7,12,15,20,23,28,31,36,39,44,47,52,55,60,63,68,71,76,79,84,87,92,95,100,103,108,111,116,119,124,127,132,135,140,143,148,151,156,159,164,167,172,175,180,183,188,191,196,199,204,207,212,212,220,220,228,228,236,236,239,244,244,239,236,236,231,228,223,220,215,212,207,204,204,196,196,188,188,180,180,172,172,164,164,156,156,148,148,140,140,132,132,124,124,116,116,108,108,100,100,92,92,84,84,76,76,68,68,60,60,52,52,44,44,36,36,28,28,20,20,12,12,0,0,0,0,0,0,7,12,15,20,23,28,31,36,39,44,47,52,55,60,63,68,71,76,79,84,87,92,95,100,103,108,111,116,119,124,127,132,135,140,143,148,151,156,159,164,167,172,175,180,180,188,188,196,196,204,204,212,212,220,220,223,228,228,236,236,236,236,236,236,231,228,228,220,220,215,212,207,204,199,196,191,188,183,180,175,172,172,164,164,156,156,148,148,140,140,132,132,124,124,116,116,108,108,100,100,92,92,84,84,76,76,68,68,60,60,52,52,44,44,36,36,28,28,20,20,12,12,0,0,0,0,0,0,7,12,15,20,23,28,31,36,39,44,47,52,55,60,63,68,71,76,79,84,87,92,95,100,103,108,111,116,119,124,127,132,135,140,140,148,148,156,156,164,164,172,172,180,180,188,188,196,196,199,204,207,212,215,220,220,228,228,228,231,236,236,236,231,228,228,223,220,220,212,212,204,204,199,196,191,188,183,180,175,172,167,164,159,156,151,148,143,140,140,132,132,124,124,116,116,108,108,100,100,92,92,84,84,76,76,68,68,60,60,52,52,44,44,36,36,28,28,20,20,12,12,0,0,0,0,0,0,7,12,15,20,23,28,31,36,39,44,47,52,55,60,63,68,71,76,79,84,87,92,95,100,100,108,108,116,116,124,124,132,132,140,140,148,148,156,156,164,164,172,172,180,180,183,188,191,196,199,204,204,212,212,215,220,220,223,228,228,228,228,228,228,228,223,220,220,212,212,207,204,204,196,196,188,188,180,180,175,172,167,164,159,156,151,148,143,140,135,132,127,124,119,116,111,108,103,100,100,92,92,84,84,76,76,68,68,60,60,52,52,44,44,36,36,28,28,20,20,12,12,0,0,0,0,0,0,7,12,15,20,23,28,31,36,39,44,47,52,55,60,60,68,68,76,76,84,84,92,92,100,100,108,108,116,116,124,124,132,132,140,140,148,148,151,156,159,164,167,172,175,180,183,188,188,196,196,204,204,207,212,212,215,220,220,223,223,228,228,228,223,220,220,220,215,212,212,204,204,199,196,191,188,188,180,180,172,172,164,164,156,156,151,148,143,140,135,132,127,124,119,116,111,108,103,100,95,92,87,84,79,76,71,68,63,60,60,52,52,44,44,36,36,28,28,20,20,12,12,0,0,0,0,0,0,7,12,15,20,20,28,28,36,36,44,44,52,52,60,60,68,68,76,76,84,84,92,92,100,100,108,108,116,116,124,124,127,132,135,140,143,148,151,156,159,164,164,172,172,180,180,188,188,191,196,196,204,204,207,212,212,215,220,220,220,220,220,220,220,220,220,212,212,212,204,204,199,196,196,188,188,183,180,175,172,167,164,164,156,156,148,148,140,140,132,132,124,124,119,116,111,108,103,100,95,92,87,84,79,76,71,68,63,60,55,52,47,44,39,36,31,28,23,20,20,12,12,0,0,0,0,0,0,0,12,12,20,20,28,28,36,36,44,44,52,52,60,60,68,68,76,76,84,84,92,92,95,100,103,108,111,116,119,124,127,132,135,140,143,148,148,156,156,164,164,172,172,175,180,183,188,188,196,196,199,204,204,207,212,212,212,215,220,220,220,220,215,215,212,212,212,204,204,204,196,196,191,188,188,180,180,172,172,167,164,159,156,151,148,143,140,140,132,132,124,124,116,116,108,108,100,100,92,92,87,84,79,76,71,68,63,60,55,52,47,44,39,36,31,28,23,20,15,12,7,0,0,0,0,0,0,0,12,12,20,20,28,28,36,36,44,44,52,52,60,60,63,68,71,76,79,84,87,92,95,100,103,108,111,116,119,124,124,132,132,140,140,148,148,151,156,159,164,167,172,172,180,180,183,188,191,196,196,199,204,204,207,212,212,212,212,212,212,212,212,212,212,207,204,204,204,196,196,191,188,188,180,180,175,172,172,164,164,156,156,151,148,143,140,135,132,127,124,119,116,116,108,108,100,100,92,92,84,84,76,76,68,68,60,60,55,52,47,44,39,36,31,28,23,20,15,12,7,0,0,0,0,0,0,0,12,12,20,20,23,28,31,36,39,44,47,52,55,60,63,68,71,76,79,84,87,92,92,100,100,108,108,116,116,124,124,132,132,135,140,143,148,151,156,156,164,164,167,172,175,180,180,188,188,191,196,196,199,204,204,204,207,207,212,212,212,212,207,207,204,204,204,199,196,196,191,188,188,183,180,180,172,172,167,164,159,156,156,148,148,140,140,132,132,127,124,119,116,111,108,103,100,95,92,92,84,84,76,76,68,68,60,60,52,52,44,44,36,36,28,28,23,20,15,12,7,0,0,0,0,0,0,0,7,12,15,20,23,28,31,36,39,44,47,52,55,60,63,68,68,76,76,84,84,92,92,100,100,108,108,111,116,119,124,127,132,135,140,140,148,148,156,156,159,164,164,172,172,175,180,180,188,188,191,196,196,196,199,204,204,204,204,204,204,204,204,204,204,204,199,196,196,191,188,188,183,180,180,175,172,167,164,164,156,156,151,148,143,140,135,132,132,124,124,116,116,108,108,103,100,95,92,87,84,79,76,71,68,68,60,60,52,52,44,44,36,36,28,28,20,20,12,12,0,0,0,0,0,0,0,0,7,12,15,20,23,28,31,36,36,44,44,52,52,60,60,68,68,76,76,84,84,87,92,95,100,103,108,111,116,116,124,124,132,132,140,140,143,148,151,156,156,164,164,167,172,172,180,180,180,188,188,188,191,196,196,196,199,199,204,204,204,204,204,199,199,196,196,196,191,188,188,183,180,180,175,172,172,164,164,159,156,151,148,148,140,140,135,132,127,124,119,116,116,108,108,100,100,92,92,84,84,79,76,71,68,63,60,55,52,47,44,39,36,36,28,28,20,20,12,12,0,0,0,0,0,0,0,0,0,12,12,20,20,28,28,36,36,44,44,52,52,60,60,63,68,71,76,79,84,87,92,95,100,100,108,108,116,116,119,124,127,132,135,140,140,148,148,151,156,159,164,164,167,172,172,180,180,180,188,188,188,191,196,196,196,196,196,196,196,196,196,196,196,196,191,188,188,188,183,180,180,175,172,172,167,164,159,156,156,148,148,143,140,140,132,132,124,124,119,116,111,108,103,100,95,92,92,84,84,76,76,68,68,60,60,55,52,47,44,39,36,31,28,23,20,15,12,7,0,0,0,0,0,0,0,0,0,12,12,20,20,28,28,36,36,39,44,47,52,55,60,63,68,71,76,76,84,84,92,92,100,100,103,108,111,116,119,124,124,132,132,135,140,143,148,148,156,156,159,164,164,167,172,172,180,180,180,183,188,188,188,188,191,196,196,196,196,196,196,191,191,188,188,188,188,180,180,180,175,172,172,167,164,164,156,156,151,148,148,140,140,135,132,127,124,124,116,116,108,108,100,100,95,92,87,84,79,76,76,68,68,60,60,52,52,44,44,36,36,31,28,23,20,15,12,7,0,0,0,0,0,0,0,0,0,7,12,15,20,23,28,31,36,39,44,47,52,52,60,60,68,68,76,76,84,84,87,92,95,100,103,108,108,116,116,119,124,127,132,132,140,140,143,148,151,156,156,159,164,164,167,172,172,175,180,180,180,183,188,188,188,188,188,188,188,188,188,188,188,188,188,183,180,180,180,175,172,172,167,164,164,156,156,151,148,148,143,140,135,132,132,124,124,119,116,111,108,103,100,100,92,92,84,84,79,76,71,68,63,60,55,52,52,44,44,36,36,28,28,20,20,12,12,7,0,0,0,0,0,0,0,0,0,7,12,15,20,23,28,28,36,36,44,44,52,52,60,60,63,68,71,76,79,84,84,92,92,100,100,103,108,111,116,119,124,124,132,132,135,140,140,148,148,151,156,156,159,164,164,167,172,172,175,180,180,180,180,183,183,188,188,188,188,188,188,183,183,180,180,180,180,175,172,172,172,167,164,164,159,156,156,148,148,143,140,140,132,132,127,124,119,116,116,108,108,103,100,95,92,87,84,84,76,76,68,68,60,60,55,52,47,44,39,36,31,28,28,20,20,12,12,0,0,0,0,0,0,0,0,0,0,0,12,12,20,20,28,28,36,36,39,44,47,52,55,60,63,68,68,76,76,84,84,87,92,95,100,103,108,108,116,116,119,124,127,132,132,135,140,143,148,148,151,156,156,159,164,164,167,172,172,172,175,175,180,180,180,180,180,180,180,180,180,180,180,180,180,175,172,172,172,167,164,164,164,156,156,156,148,148,143,140,140,135,132,127,124,124,116,116,111,108,103,100,100,92,92,87,84,79,76,71,68,68,60,60,52,52,44,44,39,36,31,28,23,20,15,12,7,0,0,0,0,0,0,0,0,0,0,0,12,12,20,20,23,28,31,36,39,44,47,52,52,60,60,68,68,71,76,79,84,87,92,92,100,100,103,108,111,116,116,124,124,127,132,132,140,140,143,148,148,151,156,156,159,164,164,164,167,172,172,172,172,175,175,180,180,180,180,180,180,175,175,175,172,172,172,172,167,164,164,159,156,156,156,148,148,143,140,140,135,132,132,124,124,119,116,116,108,108,100,100,95,92,87,84,84,76,76,68,68,63,60,55,52,47,44,44,36,36,28,28,20,20,15,12,7,0,0,0,0,0,0,0,0,0,0,0,7,12,15,20,23,28,28,36,36,44,44,52,52,55,60,63,68,71,76,76,84,84,87,92,95,100,100,108,108,111,116,119,124,124,127,132,132,140,140,143,148,148,151,156,156,156,159,164,164,164,167,172,172,172,172,172,172,172,172,172,172,172,172,172,172,167,167,164,164,164,159,156,156,151,148,148,143,140,140,135,132,132,127,124,119,116,116,111,108,103,100,100,92,92,87,84,79,76,71,68,68,60,60,52,52,47,44,39,36,31,28,28,20,20,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,20,20,28,28,31,36,39,44,47,52,52,60,60,68,68,71,76,79,84,84,92,92,100,100,103,108,108,116,116,119,124,124,132,132,135,140,140,143,148,148,148,156,156,156,159,164,164,164,164,164,167,167,172,172,172,172,172,172,172,167,167,164,164,164,164,159,156,156,156,151,148,148,143,140,140,135,132,132,127,124,124,116,116,111,108,108,100,100,95,92,87,84,84,76,76,71,68,63,60,55,52,52,44,44,36,36,31,28,23,20,15,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,23,28,31,36,36,44,44,52,52,55,60,63,68,71,76,76,84,84,87,92,95,100,100,103,108,111,116,116,119,124,124,132,132,135,140,140,140,148,148,148,151,156,156,156,159,159,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,159,156,156,156,151,148,148,148,143,140,140,135,132,132,127,124,124,119,116,111,108,108,103,100,95,92,92,84,84,79,76,71,68,68,60,60,55,52,47,44,39,36,36,28,28,20,20,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,15,20,20,28,28,36,36,39,44,47,52,55,60,60,68,68,71,76,79,84,84,92,92,95,100,100,108,108,111,116,116,119,124,124,132,132,132,140,140,140,143,148,148,148,151,156,156,156,156,159,159,159,164,164,164,164,164,164,164,159,159,156,156,156,156,156,151,148,148,148,143,140,140,135,132,132,127,124,124,119,116,116,108,108,103,100,100,92,92,87,84,84,76,76,68,68,63,60,55,52,52,44,44,36,36,31,28,23,20,20,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,20,20,23,28,31,36,39,44,44,52,52,55,60,63,68,68,76,76,79,84,87,92,92,100,100,103,108,108,111,116,116,119,124,124,132,132,132,135,140,140,143,143,148,148,148,151,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,151,151,148,148,148,143,140,140,140,135,132,132,127,124,124,119,116,116,108,108,103,100,100,95,92,87,84,84,79,76,71,68,68,60,60,55,52,47,44,39,36,36,28,28,20,20,15,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,15,20,20,28,28,36,36,39,44,47,52,52,60,60,68,68,71,76,76,84,84,87,92,92,100,100,103,108,108,111,116,116,119,124,124,127,132,132,135,140,140,140,143,143,148,148,148,148,151,151,156,156,156,156,156,156,156,156,151,151,151,148,148,148,148,143,140,140,140,135,132,132,132,127,124,124,119,116,116,111,108,108,100,100,95,92,92,84,84,79,76,76,68,68,63,60,55,52,52,44,44,39,36,31,28,23,20,20,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,20,20,23,28,31,36,36,44,44,52,52,55,60,60,68,68,71,76,79,84,84,87,92,95,100,100,103,108,108,111,116,116,119,124,124,127,132,132,132,135,140,140,140,140,143,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,143,143,140,140,140,140,135,132,132,127,124,124,124,119,116,116,111,108,108,100,100,95,92,92,87,84,84,76,76,71,68,63,60,60,52,52,47,44,39,36,36,28,28,23,20,15,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,15,20,23,28,28,36,36,39,44,47,52,52,60,60,63,68,68,76,76,79,84,84,92,92,95,100,100,103,108,108,111,116,116,119,124,124,124,127,132,132,132,135,140,140,140,140,140,143,143,148,148,148,148,148,148,148,148,143,143,143,140,140,140,140,135,135,132,132,132,127,124,124,119,116,116,116,108,108,108,100,100,95,92,92,87,84,84,76,76,71,68,68,60,60,55,52,52,44,44,36,36,31,28,23,20,20,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,20,20,23,28,31,36,36,44,44,47,52,55,60,60,68,68,71,76,76,79,84,84,92,92,95,100,100,103,108,108,111,116,116,116,124,124,124,127,132,132,132,132,135,135,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,135,132,132,132,132,127,124,124,124,119,116,116,111,108,108,108,100,100,100,92,92,87,84,84,79,76,76,68,68,63,60,55,52,52,44,44,39,36,36,28,28,20,20,15,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,15,20,20,28,28,31,36,39,44,44,52,52,55,60,60,68,68,71,76,76,84,84,87,92,92,95,100,100,103,108,108,108,116,116,116,119,124,124,124,127,127,132,132,132,132,135,135,135,140,140,140,140,140,140,140,140,140,135,135,132,132,132,132,132,127,124,124,124,119,116,116,116,111,108,108,103,100,100,95,92,92,87,84,84,79,76,76,68,68,63,60,60,52,52,47,44,44,36,36,31,28,23,20,20,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,20,20,23,28,28,36,36,39,44,47,52,52,60,60,63,68,68,71,76,76,84,84,87,92,92,95,100,100,100,108,108,108,111,116,116,116,119,124,124,124,124,127,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,127,127,124,124,124,124,119,116,116,116,111,108,108,103,100,100,95,92,92,87,84,84,79,76,76,71,68,68,60,60,55,52,52,44,44,39,36,31,28,28,20,20,15,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,15,20,20,28,28,31,36,36,44,44,47,52,52,60,60,63,68,68,71,76,76,84,84,87,92,92,92,100,100,100,103,108,108,108,111,116,116,116,119,124,124,124,124,124,127,127,127,132,132,132,132,132,132,132,132,132,127,127,124,124,124,124,124,119,119,116,116,116,111,108,108,108,103,100,100,95,92,92,87,84,84,79,76,76,71,68,68,60,60,55,52,52,44,44,39,36,36,28,28,23,20,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,23,28,28,36,36,39,44,44,52,52,55,60,60,63,68,68,76,76,76,84,84,84,92,92,92,95,100,100,103,108,108,108,111,111,116,116,116,119,119,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,119,119,116,116,116,116,111,108,108,108,103,100,100,100,95,92,92,87,84,84,79,76,76,71,68,68,60,60,55,52,52,47,44,44,36,36,31,28,23,20,20,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,20,20,23,28,28,36,36,39,44,44,52,52,55,60,60,63,68,68,76,76,76,84,84,84,87,92,92,95,100,100,100,103,108,108,108,111,111,116,116,116,116,116,119,119,119,124,124,124,124,124,124,124,124,124,119,119,119,116,116,116,116,116,111,108,108,108,103,100,100,100,95,92,92,92,87,84,84,79,76,76,71,68,68,63,60,60,52,52,47,44,44,36,36,31,28,28,20,20,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,15,20,20,28,28,31,36,36,44,44,47,52,52,55,60,60,63,68,68,71,76,76,79,84,84,87,92,92,92,95,100,100,100,103,108,108,108,108,111,111,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,111,108,108,108,108,103,103,100,100,100,95,92,92,87,84,84,84,79,76,76,71,68,68,63,60,60,52,52,47,44,44,39,36,36,28,28,23,20,20,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,20,28,28,31,36,36,44,44,47,52,52,55,60,60,63,68,68,71,76,76,79,84,84,84,87,92,92,95,95,100,100,100,103,108,108,108,108,108,108,111,111,116,116,116,116,116,116,116,116,116,116,111,111,111,108,108,108,108,108,103,100,100,100,100,95,92,92,92,87,84,84,84,76,76,76,71,68,68,63,60,60,52,52,47,44,44,39,36,36,28,28,23,20,20,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,20,20,23,28,28,31,36,36,44,44,47,52,52,55,60,60,63,68,68,71,76,76,79,84,84,84,87,92,92,92,95,95,100,100,100,100,103,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,103,103,100,100,100,100,95,92,92,92,87,84,84,84,79,76,76,76,68,68,68,60,60,60,52,52,52,44,44,39,36,36,31,28,28,20,20,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,20,20,23,28,28,36,36,39,44,44,47,52,52,55,60,60,63,68,68,71,76,76,76,79,84,84,84,87,92,92,92,92,95,100,100,100,100,100,103,103,103,108,108,108,108,108,108,108,108,108,108,103,103,103,100,100,100,100,100,95,95,92,92,92,87,87,84,84,84,79,76,76,71,68,68,68,60,60,60,52,52,52,44,44,39,36,36,31,28,28,20,20,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,20,23,28,28,36,36,39,44,44,47,52,52,55,60,60,63,68,68,68,71,76,76,76,79,84,84,84,87,92,92,92,92,95,95,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,95,95,92,92,92,92,87,87,84,84,84,79,76,76,76,71,68,68,63,60,60,55,52,52,47,44,44,39,36,36,31,28,28,23,20,20,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,20,23,28,28,36,36,39,44,44,47,52,52,55,60,60,60,63,68,68,71,76,76,76,79,79,84,84,84,87,87,92,92,92,92,92,95,95,95,100,100,100,100,100,100,100,100,100,100,100,95,95,92,92,92,92,92,92,87,84,84,84,84,79,76,76,76,71,68,68,68,63,60,60,55,52,52,47,44,44,39,36,36,31,28,28,23,20,20,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,15,20,20,28,28,28,36,36,39,44,44,44,52,52,52,55,60,60,63,68,68,68,71,76,76,76,79,79,84,84,84,84,87,87,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,87,84,84,84,84,84,79,76,76,76,71,68,68,68,63,60,60,60,55,52,52,47,44,44,39,36,36,31,28,28,23,20,20,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,15,20,20,28,28,28,36,36,36,44,44,44,47,52,52,55,60,60,60,63,68,68,68,71,76,76,76,76,79,84,84,84,84,84,84,87,87,87,92,92,92,92,92,92,92,92,92,92,92,87,87,87,84,84,84,84,84,79,79,76,76,76,71,71,68,68,68,63,60,60,55,52,52,52,47,44,44,39,36,36,31,28,28,23,20,20,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,15,20,20,28,28,28,36,36,36,39,44,44,47,52,52,52,55,60,60,60,63,68,68,68,71,76,76,76,76,76,79,79,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,79,79,76,76,76,76,71,68,68,68,68,63,60,60,60,55,52,52,52,44,44,44,39,36,36,31,28,28,23,20,20,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,15,20,20,23,28,28,31,36,36,39,44,44,44,52,52,52,55,60,60,60,63,63,68,68,68,71,71,76,76,76,76,76,76,79,79,79,84,84,84,84,84,84,84,84,84,84,84,79,79,79,76,76,76,76,76,76,71,68,68,68,68,63,60,60,60,55,52,52,52,47,44,44,44,36,36,36,31,28,28,23,20,20,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,15,20,20,23,28,28,31,36,36,39,44,44,44,47,52,52,52,55,60,60,60,60,63,68,68,68,68,71,71,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,71,71,68,68,68,68,68,63,60,60,60,55,55,52,52,52,44,44,44,39,36,36,36,28,28,28,23,20,20,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,15,20,20,23,28,28,31,36,36,36,39,44,44,44,47,52,52,52,55,60,60,60,60,63,63,68,68,68,68,68,71,71,71,76,76,76,76,76,76,76,76,76,76,76,76,71,71,71,68,68,68,68,68,68,63,60,60,60,60,55,55,52,52,52,47,44,44,44,39,36,36,31,28,28,28,20,20,20,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,15,20,20,23,28,28,28,31,36,36,39,44,44,44,47,47,52,52,52,55,60,60,60,60,60,63,63,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,63,60,60,60,60,60,55,52,52,52,52,47,44,44,44,39,36,36,36,31,28,28,23,20,20,20,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,15,20,20,20,23,28,28,31,36,36,36,39,44,44,44,47,47,52,52,52,52,55,60,60,60,60,60,60,63,63,63,68,68,68,68,68,68,68,68,68,68,68,68,63,63,63,60,60,60,60,60,60,55,55,52,52,52,52,47,44,44,44,39,36,36,36,31,28,28,28,23,20,20,15,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,23,28,28,28,31,36,36,36,39,44,44,44,44,47,52,52,52,52,52,55,55,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,55,55,52,52,52,52,47,47,44,44,44,39,39,36,36,36,31,28,28,23,20,20,20,15,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,15,20,20,20,23,28,28,28,31,36,36,36,39,44,44,44,44,47,47,52,52,52,52,52,52,55,55,55,60,60,60,60,60,60,60,60,60,60,60,60,60,55,55,55,52,52,52,52,52,52,47,44,44,44,44,39,36,36,36,36,31,28,28,28,23,20,20,20,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,20,20,20,23,28,28,28,31,31,36,36,36,39,39,44,44,44,44,47,47,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,47,47,44,44,44,44,44,39,36,36,36,36,31,28,28,28,23,20,20,20,15,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,20,23,28,28,28,28,31,36,36,36,36,39,39,44,44,44,44,44,44,47,47,47,52,52,52,52,52,52,52,52,52,52,52,52,52,47,47,47,44,44,44,44,44,44,39,39,36,36,36,36,31,28,28,28,23,20,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,20,23,28,28,28,28,31,36,36,36,36,36,39,39,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,39,39,36,36,36,36,36,31,31,28,28,28,23,23,20,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,20,23,28,28,28,28,28,31,36,36,36,36,36,36,39,39,39,39,44,44,44,44,44,44,44,44,44,44,44,44,44,39,39,39,36,36,36,36,36,36,31,31,28,28,28,28,23,20,20,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,20,23,23,28,28,28,28,28,31,31,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,31,31,28,28,28,28,28,23,20,20,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,20,20,23,23,28,28,28,28,28,28,31,31,31,36,36,36,36,36,36,36,36,36,36,36,36,36,36,31,31,31,28,28,28,28,28,28,28,23,20,20,20,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,15,20,20,20,20,20,23,23,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,23,23,20,20,20,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,15,15,20,20,20,20,20,20,23,23,23,28,28,28,28,28,28,28,28,28,28,28,28,28,28,23,23,23,23,20,20,20,20,20,20,15,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,12,15,15,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,15,15,12,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,12,12,12,15,15,15,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,15,15,15,12,12,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};\n  const uint8_t FLARE_TEXTURE_1[16384] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,7,7,7,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,7,7,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,7,7,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,7,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,7,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,12,12,12,12,12,12,12,12,12,12,12,15,15,15,15,15,15,15,15,15,15,15,15,12,12,12,12,12,12,12,12,12,12,12,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,12,12,12,12,12,12,12,12,12,15,15,15,15,20,20,20,20,20,20,20,20,20,20,20,20,20,15,15,15,15,12,12,12,12,12,12,12,12,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,12,12,12,12,15,15,15,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,15,15,15,12,12,12,12,12,12,12,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,12,12,12,12,12,12,12,15,15,20,20,20,20,20,20,20,20,20,20,20,23,23,23,23,23,20,20,20,20,20,20,20,20,20,20,20,15,15,12,12,12,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,12,12,12,15,15,20,20,20,20,20,20,20,23,23,23,23,28,28,28,28,28,28,28,28,28,23,23,23,23,20,20,20,20,20,20,20,15,15,12,12,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,12,12,15,15,20,20,20,20,20,20,23,23,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,23,23,23,20,20,20,20,20,20,15,15,12,12,12,12,12,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,12,15,15,20,20,20,20,20,23,23,28,28,28,28,28,28,28,28,31,31,31,31,31,31,31,31,28,28,28,28,28,28,28,28,23,23,20,20,20,20,20,15,15,12,12,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,12,15,15,20,20,20,20,23,23,28,28,28,28,28,28,31,31,36,36,36,36,36,36,36,36,36,36,36,36,31,31,31,28,28,28,28,28,28,23,20,20,20,20,20,15,15,12,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,12,15,20,20,20,20,20,23,28,28,28,28,28,31,31,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,31,31,28,28,28,28,23,23,20,20,20,20,15,15,12,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,15,15,20,20,20,20,23,28,28,28,28,28,31,36,36,36,36,36,39,39,39,44,44,44,44,44,44,44,44,44,39,39,36,36,36,36,36,36,31,28,28,28,28,23,20,20,20,20,20,15,12,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,15,15,20,20,20,20,23,28,28,28,28,31,36,36,36,36,39,39,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,39,36,36,36,36,36,31,28,28,28,28,23,20,20,20,20,15,12,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,15,15,20,20,20,23,23,28,28,28,31,36,36,36,36,39,44,44,44,44,44,47,47,52,52,52,52,52,52,52,52,47,47,47,44,44,44,44,39,39,36,36,36,31,28,28,28,28,23,20,20,20,20,15,12,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,15,15,20,20,20,23,28,28,28,28,31,36,36,36,39,44,44,44,44,47,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,47,47,44,44,44,39,39,36,36,36,31,28,28,28,23,20,20,20,20,15,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,12,15,20,20,20,23,28,28,28,31,36,36,36,39,44,44,44,44,47,52,52,52,52,55,55,60,60,60,60,60,60,60,60,60,55,55,52,52,52,52,47,44,44,44,39,36,36,36,31,28,28,28,23,20,20,20,20,15,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,15,20,20,20,23,28,28,28,31,36,36,36,39,44,44,44,47,52,52,52,55,60,60,60,60,60,63,63,63,63,63,63,60,60,60,60,60,55,55,52,52,52,47,44,44,44,39,36,36,31,28,28,28,23,20,20,20,15,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,15,20,20,20,23,28,28,28,31,36,36,36,39,44,44,47,52,52,52,55,60,60,60,63,68,68,68,68,68,68,68,68,68,68,68,68,63,60,60,60,60,55,52,52,47,44,44,44,39,36,36,31,28,28,28,23,20,20,20,15,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,15,20,20,20,23,28,28,31,36,36,36,44,44,44,47,52,52,55,60,60,60,63,68,68,68,71,71,76,76,76,76,76,76,71,71,68,68,68,68,63,60,60,60,52,52,52,47,44,44,39,36,36,31,28,28,28,23,20,20,20,15,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,15,20,20,20,23,28,28,31,36,36,36,44,44,44,52,52,52,60,60,60,63,68,68,71,76,76,76,76,76,79,79,79,79,76,76,76,76,76,71,68,68,68,63,60,60,55,52,52,47,44,44,39,36,36,31,28,28,28,23,20,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,20,23,28,28,28,36,36,36,44,44,44,52,52,55,60,60,63,68,68,71,76,76,76,79,84,84,84,84,84,84,84,84,84,84,84,79,76,76,76,68,68,68,60,60,55,52,52,47,44,44,39,36,36,31,28,28,23,20,20,20,15,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,15,20,20,20,28,28,28,31,36,36,39,44,44,52,52,55,60,60,68,68,68,76,76,79,84,84,84,87,87,92,92,92,92,92,92,92,87,84,84,84,79,76,76,71,68,68,63,60,60,52,52,47,44,44,39,36,36,31,28,28,23,20,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,20,23,28,28,31,36,36,39,44,44,52,52,55,60,60,68,68,71,76,76,84,84,84,92,92,92,95,95,100,100,100,100,95,95,92,92,92,87,84,84,79,76,76,68,68,63,60,60,52,52,47,44,44,36,36,36,28,28,28,23,20,20,15,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,15,20,20,23,28,28,28,36,36,39,44,44,47,52,55,60,60,68,68,71,76,79,84,84,92,92,95,100,100,100,100,103,103,103,103,103,100,100,100,95,92,92,87,84,84,76,76,71,68,63,60,60,52,52,47,44,39,36,36,31,28,28,23,20,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,20,23,28,28,31,36,36,44,44,47,52,52,60,60,68,68,76,76,79,84,87,92,92,100,100,103,108,108,108,108,111,111,108,108,108,108,103,100,100,95,92,92,84,84,76,76,71,68,63,60,55,52,52,44,44,39,36,36,28,28,28,23,20,20,15,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,23,28,28,28,36,36,39,44,44,52,52,60,60,68,68,71,76,84,84,87,92,95,100,103,108,108,111,116,116,116,116,116,116,116,116,116,111,108,108,100,100,92,92,87,84,76,76,68,68,63,60,55,52,47,44,44,36,36,31,28,28,23,20,20,20,15,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,20,23,28,28,31,36,36,44,44,47,52,55,60,63,68,71,76,79,84,92,92,100,100,108,108,116,116,119,124,124,124,124,124,124,124,124,119,116,116,111,108,103,100,95,92,87,84,76,76,68,68,60,60,52,52,44,44,39,36,36,28,28,28,23,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,20,28,28,28,36,36,39,44,44,52,52,60,60,68,68,76,79,84,87,92,100,100,108,111,116,119,124,124,127,132,132,132,132,132,132,132,127,124,124,116,116,108,103,100,95,92,84,84,76,76,68,63,60,55,52,47,44,44,36,36,31,28,28,23,20,20,20,15,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,23,28,28,31,36,36,44,44,47,52,55,60,63,68,76,76,84,87,92,100,100,108,111,116,124,124,132,132,135,140,140,140,140,140,140,140,132,132,127,124,119,116,108,108,100,95,92,84,79,76,71,68,60,60,52,52,44,44,39,36,36,28,28,23,20,20,20,15,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,20,23,28,28,31,36,39,44,44,52,52,60,60,68,71,76,84,84,92,95,100,108,111,116,124,127,132,135,140,143,148,148,148,148,148,148,148,140,140,132,132,124,119,116,108,103,100,92,87,84,76,76,68,63,60,55,52,47,44,44,36,36,31,28,28,23,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,20,28,28,28,36,36,39,44,47,52,55,60,63,68,76,79,84,92,92,100,108,111,116,124,127,132,140,143,148,151,156,156,156,156,156,156,156,148,148,140,135,132,124,119,116,108,103,100,92,84,84,76,71,68,60,60,52,52,44,44,36,36,31,28,28,23,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,23,28,28,31,36,36,44,44,52,52,60,60,68,71,76,84,84,92,100,103,108,116,124,127,132,140,143,148,156,159,164,164,167,167,164,164,164,156,151,148,140,135,132,124,116,111,108,100,95,92,84,76,76,68,63,60,55,52,47,44,39,36,36,28,28,23,20,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,23,28,28,31,36,39,44,44,52,52,60,63,68,76,76,84,92,95,100,108,116,119,124,132,140,143,151,156,164,167,172,172,175,175,175,172,172,164,159,156,148,140,135,127,124,116,108,103,100,92,84,84,76,68,68,60,55,52,47,44,39,36,36,31,28,28,20,20,20,15,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,20,23,28,28,36,36,39,44,47,52,55,60,68,68,76,79,84,92,100,103,108,116,124,132,135,143,148,156,164,172,175,180,183,188,188,183,180,180,172,164,159,156,148,140,132,124,119,116,108,100,92,87,84,76,71,68,60,60,52,52,44,44,36,36,31,28,28,23,20,20,15,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,20,23,28,28,36,36,39,44,47,52,55,60,68,71,76,84,87,92,100,108,111,119,124,132,140,148,156,164,172,175,180,188,191,196,196,196,188,188,180,172,164,156,151,143,135,132,124,116,108,100,95,92,84,79,76,68,63,60,52,52,44,44,36,36,31,28,28,23,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,20,28,28,31,36,36,44,44,52,52,60,60,68,71,76,84,87,95,100,108,116,124,127,135,143,151,159,167,175,180,188,196,204,204,204,204,199,196,188,180,172,164,156,148,140,132,124,116,111,103,100,92,84,79,76,68,63,60,55,52,47,44,39,36,31,28,28,23,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,20,28,28,31,36,36,44,44,52,52,60,63,68,76,76,84,92,95,100,108,116,124,132,140,148,156,164,172,180,188,196,204,212,215,220,212,207,199,191,183,175,167,156,148,140,132,127,119,111,108,100,92,87,84,76,68,68,60,55,52,47,44,39,36,36,28,28,23,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,23,28,28,31,36,36,44,44,52,52,60,63,68,76,79,84,92,100,103,108,116,124,132,140,148,156,164,172,183,191,204,212,220,228,228,223,215,204,196,188,180,172,164,151,143,135,127,124,116,108,100,92,87,84,76,71,68,60,55,52,47,44,39,36,36,28,28,23,20,20,20,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,23,28,28,31,36,36,44,44,52,52,60,63,68,76,79,84,92,100,103,111,116,124,132,140,148,156,167,175,188,196,204,215,228,236,236,231,220,212,199,188,180,172,164,156,148,140,132,124,116,108,100,92,87,84,76,71,68,60,55,52,47,44,39,36,36,28,28,23,20,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,23,28,28,31,36,36,44,44,52,52,60,63,68,76,79,84,92,100,103,111,116,124,132,140,148,156,167,175,188,196,204,220,228,236,244,236,220,212,204,191,180,172,164,156,148,140,132,124,116,108,100,92,87,84,76,71,68,60,55,52,47,44,39,36,36,28,28,23,20,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,23,28,28,31,36,36,44,44,52,52,60,63,68,76,79,84,92,100,103,108,116,124,132,140,148,156,164,175,183,196,204,212,223,231,236,228,220,212,199,188,180,172,164,156,148,135,132,124,116,108,100,92,87,84,76,71,68,60,55,52,47,44,39,36,36,28,28,23,20,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,23,28,28,31,36,36,44,44,52,52,60,63,68,76,76,84,92,95,103,108,116,124,132,140,148,156,164,172,180,188,199,207,215,220,220,220,212,204,196,188,180,167,159,151,143,135,127,119,116,108,100,92,87,84,76,68,68,60,55,52,47,44,39,36,36,28,28,23,20,20,20,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,20,28,28,31,36,36,44,44,52,52,60,60,68,71,76,84,92,95,100,108,116,124,132,140,148,156,164,172,180,188,196,199,204,212,212,212,204,196,188,180,172,164,156,148,140,132,124,116,111,108,100,92,84,79,76,68,68,60,55,52,47,44,39,36,31,28,28,23,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,20,28,28,28,36,36,44,44,47,52,60,60,68,71,76,84,87,92,100,108,116,119,127,132,140,148,156,164,172,180,188,191,196,199,204,199,196,188,183,175,167,164,156,148,140,132,124,116,108,103,100,92,84,79,76,68,63,60,55,52,44,44,39,36,31,28,28,23,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,20,23,28,28,36,36,39,44,47,52,55,60,68,68,76,84,84,92,100,103,111,116,124,132,140,148,151,159,164,172,180,183,188,188,191,188,188,180,175,172,164,156,148,140,132,127,124,116,108,100,95,92,84,76,76,68,63,60,52,52,44,44,36,36,31,28,28,23,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,20,20,20,23,28,28,31,36,39,44,47,52,55,60,63,68,76,79,84,92,95,100,108,116,124,127,132,140,148,156,159,164,172,175,180,180,180,180,180,172,167,164,156,148,143,140,132,124,116,111,108,100,92,87,84,76,71,68,60,60,52,52,44,44,36,36,31,28,28,20,20,20,15,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,23,28,28,31,36,36,44,44,52,52,60,60,68,71,76,84,87,92,100,108,111,116,124,132,135,140,148,156,156,164,167,172,172,172,172,167,164,164,156,148,148,140,132,124,119,116,108,100,95,92,84,79,76,68,68,60,55,52,47,44,39,36,36,28,28,23,20,20,20,15,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,23,28,28,31,36,36,44,44,47,52,55,60,68,68,76,79,84,92,95,100,108,116,119,124,132,135,140,148,151,156,156,164,164,164,164,159,156,156,148,143,140,132,127,124,116,108,103,100,92,87,84,76,71,68,63,60,52,52,44,44,39,36,31,28,28,23,20,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,20,23,28,28,36,36,39,44,47,52,55,60,63,68,76,76,84,87,92,100,103,108,116,119,124,132,135,140,143,148,148,151,156,156,156,151,148,148,140,140,132,127,124,116,111,108,100,95,92,84,79,76,68,68,60,60,52,52,44,44,36,36,31,28,28,23,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,20,23,28,28,31,36,36,44,44,52,52,60,60,68,68,76,79,84,92,92,100,103,108,116,119,124,127,132,135,140,140,143,148,148,148,143,140,140,132,132,124,124,116,111,108,100,100,92,87,84,76,71,68,63,60,55,52,47,44,39,36,36,28,28,28,20,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,23,28,28,31,36,36,39,44,47,52,55,60,63,68,71,76,84,84,92,95,100,108,108,116,116,124,124,132,132,132,135,140,140,135,135,132,132,127,124,119,116,111,108,100,100,92,87,84,79,76,68,68,60,60,52,52,44,44,39,36,31,28,28,23,20,20,20,15,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,20,23,28,28,36,36,39,44,44,52,52,60,60,68,68,76,76,84,87,92,95,100,103,108,111,116,119,124,124,127,127,132,132,132,127,124,124,124,116,116,108,108,100,100,92,92,84,79,76,71,68,63,60,55,52,47,44,39,36,36,31,28,28,23,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,20,23,28,28,31,36,36,39,44,47,52,52,60,60,68,68,76,76,84,87,92,95,100,103,108,108,116,116,116,119,124,124,124,124,119,116,116,116,111,108,103,100,100,92,92,84,79,76,71,68,63,60,55,52,52,44,44,39,36,36,28,28,23,20,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,20,28,28,28,36,36,39,44,44,47,52,55,60,63,68,71,76,76,84,84,92,92,100,100,103,108,108,111,111,116,116,116,116,116,111,108,108,108,100,100,95,92,87,84,79,76,76,68,68,60,60,52,52,47,44,39,36,36,31,28,28,23,20,20,20,15,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,20,23,28,28,31,36,36,39,44,44,52,52,55,60,63,68,71,76,76,84,84,87,92,95,100,100,100,103,108,108,108,108,108,108,108,103,100,100,95,92,92,87,84,79,76,76,68,68,60,60,55,52,47,44,44,36,36,31,28,28,28,20,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,20,23,28,28,31,36,36,44,44,47,52,52,60,60,63,68,68,76,76,79,84,84,92,92,92,95,100,100,100,100,100,100,100,100,100,95,92,92,87,84,84,79,76,71,68,68,60,60,55,52,52,44,44,39,36,36,31,28,28,23,20,20,20,15,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,20,23,28,28,28,36,36,39,44,44,47,52,52,60,60,63,68,68,76,76,76,84,84,84,87,92,92,92,92,92,92,92,92,92,92,92,87,84,84,79,76,76,71,68,68,60,60,55,52,52,44,44,39,36,36,31,28,28,23,20,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,20,23,28,28,31,36,36,39,44,44,47,52,52,60,60,63,68,68,71,76,76,76,84,84,84,84,87,87,87,87,87,87,84,84,84,84,79,76,76,71,68,68,63,60,60,55,52,52,44,44,44,36,36,31,28,28,28,23,20,20,20,15,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,15,20,20,20,28,28,28,31,36,36,39,44,44,47,52,52,55,60,60,63,68,68,71,76,76,76,79,79,84,84,84,84,84,84,79,79,76,76,76,71,68,68,68,63,60,60,55,52,52,44,44,44,36,36,36,28,28,28,23,20,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,20,23,28,28,28,31,36,36,39,44,44,47,52,52,55,60,60,60,63,68,68,68,71,76,76,76,76,76,76,76,76,76,76,76,71,68,68,68,63,60,60,55,52,52,52,44,44,44,36,36,36,31,28,28,23,20,20,20,15,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,15,20,20,20,23,28,28,28,31,36,36,39,44,44,47,52,52,52,55,60,60,60,63,68,68,68,68,68,71,71,71,71,68,68,68,68,68,68,63,60,60,60,55,52,52,47,44,44,44,36,36,36,31,28,28,23,20,20,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,15,20,20,20,23,28,28,28,31,36,36,39,44,44,44,47,52,52,52,55,60,60,60,60,63,63,68,68,68,68,68,68,68,63,63,60,60,60,60,55,52,52,52,47,44,44,39,36,36,36,31,28,28,28,23,20,20,20,15,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,15,20,20,20,20,23,28,28,28,31,36,36,36,39,44,44,44,47,52,52,52,55,55,60,60,60,60,60,60,60,60,60,60,60,60,60,55,52,52,52,52,47,44,44,44,39,36,36,36,31,28,28,28,23,20,20,20,15,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,15,20,20,20,20,23,28,28,28,31,36,36,36,39,44,44,44,44,47,52,52,52,52,52,55,55,55,55,55,55,55,55,55,52,52,52,52,52,47,44,44,44,39,36,36,36,31,28,28,28,28,23,20,20,20,15,12,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,15,20,20,20,20,23,28,28,28,31,36,36,36,36,39,44,44,44,44,47,47,52,52,52,52,52,52,52,52,52,52,52,52,52,47,44,44,44,44,39,39,36,36,36,31,28,28,28,23,23,20,20,20,15,15,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,12,15,20,20,20,20,23,28,28,28,28,31,36,36,36,36,39,44,44,44,44,44,44,47,47,47,47,47,47,47,47,44,44,44,44,44,44,39,39,36,36,36,31,31,28,28,28,23,20,20,20,20,15,15,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,12,15,20,20,20,20,23,23,28,28,28,28,31,36,36,36,36,36,39,39,44,44,44,44,44,44,44,44,44,44,44,44,44,39,39,36,36,36,36,36,31,28,28,28,28,23,20,20,20,20,15,15,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,12,15,15,20,20,20,20,23,28,28,28,28,28,31,36,36,36,36,36,36,36,39,39,39,39,39,39,39,39,39,36,36,36,36,36,36,31,31,28,28,28,28,23,23,20,20,20,20,15,12,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,12,15,15,20,20,20,20,23,23,28,28,28,28,28,31,31,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,31,31,28,28,28,28,28,28,23,20,20,20,20,20,15,12,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,12,12,15,20,20,20,20,20,23,23,28,28,28,28,28,28,31,31,31,31,36,36,36,36,36,36,31,31,31,31,28,28,28,28,28,28,23,23,20,20,20,20,20,15,15,12,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,12,12,15,15,20,20,20,20,20,23,23,23,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,23,23,20,20,20,20,20,20,15,12,12,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,12,12,12,12,12,12,15,15,20,20,20,20,20,20,23,23,23,28,28,28,28,28,28,28,28,28,28,28,28,28,28,23,23,23,20,20,20,20,20,20,20,15,15,12,12,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,12,12,12,15,15,20,20,20,20,20,20,20,20,23,23,23,23,23,23,23,23,23,23,23,23,20,20,20,20,20,20,20,20,20,15,15,12,12,12,12,12,12,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,12,12,12,12,12,12,12,15,15,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,15,15,15,12,12,12,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,12,12,12,12,15,15,15,15,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,15,15,15,12,12,12,12,12,12,12,12,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,12,12,12,12,12,12,12,12,12,12,15,15,15,15,15,15,20,20,20,20,20,15,15,15,15,15,15,12,12,12,12,12,12,12,12,12,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,15,15,15,12,12,12,12,12,12,12,12,12,12,12,12,12,12,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,7,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,7,7,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,7,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,7,7,7,7,12,12,12,12,12,12,12,12,12,12,12,7,7,7,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};\n  const uint8_t FLARE_TEXTURE_2[16384] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,20,20,23,28,28,28,28,28,28,28,28,28,28,23,23,20,20,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,28,28,31,36,36,36,36,39,39,44,44,44,44,44,44,39,39,39,36,36,36,36,28,28,23,20,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,23,28,31,36,36,39,44,44,44,47,47,52,52,52,52,52,52,52,52,52,52,52,52,47,47,44,44,44,44,36,36,36,28,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,23,28,36,36,39,44,44,47,52,52,52,55,55,60,60,60,60,60,60,60,60,60,60,60,60,60,60,55,55,52,52,52,52,47,44,44,39,36,31,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,28,36,36,44,44,47,52,52,55,60,60,60,60,63,63,68,68,68,68,68,68,68,68,68,68,68,68,68,68,63,63,60,60,60,60,55,52,52,52,44,44,39,36,31,28,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,31,36,44,44,47,52,52,60,60,60,63,68,68,68,68,68,71,71,76,76,76,76,76,76,76,76,76,76,76,76,71,71,68,68,68,68,68,63,60,60,60,55,52,52,47,44,39,36,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,36,39,44,47,52,52,60,60,60,63,68,68,68,71,76,76,76,76,76,76,79,79,79,79,84,84,84,84,84,79,79,79,79,76,76,76,76,76,71,71,68,68,68,63,60,60,55,52,52,44,44,36,31,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,36,39,44,52,52,55,60,60,63,68,68,71,76,76,76,76,79,79,84,84,84,84,84,84,84,84,84,87,87,87,84,84,84,84,84,84,84,84,84,79,79,76,76,76,71,68,68,68,63,60,60,52,52,47,44,36,31,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,36,39,44,52,52,60,60,63,68,68,71,76,76,76,79,84,84,84,84,84,87,87,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,87,87,84,84,84,84,79,76,76,76,71,68,68,68,60,60,55,52,47,44,36,28,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,31,36,44,52,52,60,60,63,68,68,76,76,76,79,84,84,84,84,87,92,92,92,92,92,92,95,95,95,100,100,100,100,100,100,100,100,95,95,95,95,92,92,92,92,92,92,87,84,84,84,79,76,76,76,71,68,68,60,60,55,52,47,44,36,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,36,44,47,52,60,60,63,68,71,76,76,76,84,84,84,87,92,92,92,92,92,95,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,95,95,92,92,92,92,87,84,84,84,79,76,76,71,68,68,63,60,55,52,44,39,36,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,36,39,44,52,55,60,63,68,71,76,76,79,84,84,84,87,92,92,92,95,100,100,100,100,100,100,103,103,108,108,108,108,108,108,108,108,108,108,108,108,108,108,103,103,103,100,100,100,100,100,95,92,92,92,92,87,84,84,79,76,76,71,68,68,60,60,52,52,44,36,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,36,44,52,52,60,63,68,68,76,76,79,84,84,87,92,92,92,95,100,100,100,100,103,103,108,108,108,108,108,108,108,108,111,111,111,111,111,111,111,111,111,108,108,108,108,108,108,108,108,103,100,100,100,100,95,92,92,92,87,84,84,84,76,76,71,68,68,60,55,52,44,39,36,23,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,31,39,44,52,55,60,68,68,76,76,79,84,84,87,92,92,92,95,100,100,100,103,108,108,108,108,108,111,111,111,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,111,111,108,108,108,108,108,103,100,100,100,100,95,92,92,87,84,84,79,76,76,71,68,63,60,52,52,44,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,23,36,44,47,52,60,63,68,71,76,76,84,84,87,92,92,92,100,100,100,103,103,108,108,108,108,111,116,116,116,116,116,116,116,116,119,119,119,119,119,119,119,119,119,119,119,116,116,116,116,116,116,116,111,111,108,108,108,108,103,100,100,100,95,92,92,87,84,84,79,76,76,68,68,60,55,52,44,36,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,44,52,55,60,68,68,76,76,79,84,84,92,92,92,100,100,100,103,108,108,108,108,111,116,116,116,116,116,119,119,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,119,119,116,116,116,116,116,111,111,108,108,108,103,100,100,100,95,92,92,87,84,84,76,76,71,68,63,60,52,47,39,31,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,44,52,60,60,68,71,76,76,84,84,87,92,92,95,100,100,103,108,108,108,111,116,116,116,116,119,119,124,124,124,124,124,124,124,124,127,127,127,127,127,127,127,127,127,127,127,124,124,124,124,124,124,124,119,119,116,116,116,116,111,108,108,108,103,100,100,100,95,92,92,84,84,79,76,76,68,63,60,52,47,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,36,44,52,60,63,68,71,76,79,84,84,92,92,95,100,100,103,108,108,108,111,116,116,116,116,119,124,124,124,124,124,127,127,127,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,127,127,124,124,124,124,124,119,119,116,116,116,111,111,108,108,103,100,100,100,92,92,87,84,84,76,76,68,68,60,55,52,44,36,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,39,44,52,60,63,68,76,76,84,84,87,92,92,100,100,100,108,108,108,111,116,116,116,119,124,124,124,124,124,127,132,132,132,132,132,132,132,132,132,135,135,135,135,135,135,135,135,135,132,132,132,132,132,132,132,132,127,127,124,124,124,124,119,116,116,116,111,108,108,108,103,100,100,95,92,92,84,84,79,76,71,68,60,55,52,44,36,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,39,47,52,60,63,68,76,76,84,84,92,92,95,100,100,103,108,108,111,116,116,116,119,124,124,124,124,127,132,132,132,132,132,132,135,135,135,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,135,135,135,132,132,132,132,132,127,127,124,124,124,119,116,116,116,111,108,108,108,100,100,100,92,92,87,84,79,76,71,68,60,55,52,44,36,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,39,47,52,60,68,68,76,76,84,84,92,92,95,100,100,108,108,108,111,116,116,119,124,124,124,124,127,132,132,132,132,135,135,140,140,140,140,140,140,140,140,140,140,140,143,143,140,140,140,140,140,140,140,140,140,140,140,135,135,132,132,132,132,132,127,124,124,124,119,116,116,116,111,108,108,103,100,100,95,92,87,84,84,76,71,68,60,55,52,44,36,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,44,52,60,68,68,76,79,84,87,92,92,100,100,103,108,108,111,116,116,116,119,124,124,124,127,132,132,132,132,135,140,140,140,140,140,140,143,143,143,148,148,148,148,148,148,148,148,148,148,148,148,143,143,143,140,140,140,140,140,140,135,135,132,132,132,132,127,124,124,124,119,116,116,111,108,108,108,100,100,95,92,92,84,84,76,71,68,60,55,52,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,36,44,52,60,68,68,76,79,84,87,92,92,100,100,103,108,108,111,116,116,119,124,124,124,127,132,132,132,135,135,140,140,140,140,143,143,143,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,143,143,140,140,140,140,140,135,132,132,132,132,127,124,124,124,116,116,116,111,108,108,100,100,95,92,92,84,84,76,71,68,60,55,52,44,31,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,36,44,52,60,63,68,76,79,84,87,92,95,100,100,108,108,108,116,116,116,124,124,124,127,132,132,132,135,135,140,140,140,140,143,148,148,148,148,148,148,148,151,151,151,151,151,151,156,156,156,151,151,151,151,151,148,148,148,148,148,148,148,143,143,140,140,140,140,135,132,132,132,127,124,124,124,119,116,116,111,108,108,103,100,100,92,92,84,84,76,71,68,60,55,52,39,28,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,44,52,60,63,68,76,79,84,87,92,95,100,100,108,108,111,116,116,119,124,124,124,127,132,132,132,135,140,140,140,143,143,148,148,148,148,148,151,151,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,151,151,148,148,148,148,148,148,143,140,140,140,140,135,132,132,132,127,124,124,119,116,116,111,108,108,103,100,100,92,92,84,84,76,71,68,60,52,47,39,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,31,44,52,60,63,68,76,76,84,87,92,95,100,100,108,108,111,116,116,119,124,124,127,132,132,132,135,140,140,140,143,143,148,148,148,148,151,151,156,156,156,156,156,156,156,156,156,159,159,159,159,159,159,159,156,156,156,156,156,156,156,156,156,151,148,148,148,148,148,143,140,140,140,140,135,132,132,127,124,124,124,116,116,116,108,108,103,100,100,92,92,84,84,76,71,68,60,52,44,36,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,39,47,55,60,68,76,76,84,87,92,95,100,100,108,108,111,116,116,119,124,124,127,132,132,135,140,140,140,140,143,148,148,148,148,151,156,156,156,156,156,156,159,159,159,164,164,164,164,164,164,164,164,164,164,164,164,159,159,159,156,156,156,156,156,156,151,151,148,148,148,148,143,140,140,140,135,132,132,132,127,124,124,119,116,116,108,108,103,100,100,92,92,84,79,76,68,68,60,52,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,36,44,52,60,68,71,76,84,84,92,92,100,100,108,108,111,116,116,124,124,124,127,132,132,135,140,140,140,143,148,148,148,148,151,156,156,156,156,156,159,159,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,159,159,156,156,156,156,156,151,148,148,148,143,143,140,140,140,132,132,132,127,124,124,119,116,116,108,108,103,100,95,92,87,84,79,76,68,63,60,52,44,31,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,44,52,60,68,71,76,84,84,92,92,100,100,108,108,111,116,116,124,124,124,132,132,132,135,140,140,143,148,148,148,148,151,156,156,156,156,159,159,164,164,164,164,164,164,164,167,167,167,167,167,167,167,167,167,167,167,167,164,164,164,164,164,164,164,164,159,156,156,156,156,151,151,148,148,148,143,140,140,140,135,132,132,127,124,124,119,116,116,108,108,103,100,95,92,87,84,76,76,68,60,55,47,36,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,39,52,55,63,68,76,79,84,92,92,100,100,108,108,111,116,116,124,124,124,132,132,132,140,140,140,143,148,148,148,151,156,156,156,156,159,159,164,164,164,164,164,167,167,167,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,167,167,164,164,164,164,164,164,159,156,156,156,156,151,148,148,148,143,140,140,140,135,132,132,127,124,124,119,116,116,108,108,103,100,95,92,87,84,76,71,68,60,52,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,36,44,52,60,68,76,76,84,87,92,95,100,103,108,111,116,116,124,124,124,132,132,132,140,140,140,143,148,148,148,151,156,156,156,159,159,164,164,164,164,167,167,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,167,167,164,164,164,164,164,159,156,156,156,156,151,148,148,148,143,140,140,135,132,132,127,124,124,119,116,116,108,108,100,100,92,92,84,84,76,68,63,60,52,44,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,31,44,52,60,68,71,76,84,84,92,95,100,103,108,108,116,116,119,124,124,132,132,135,140,140,140,143,148,148,151,156,156,156,156,159,164,164,164,164,167,167,172,172,172,172,172,172,175,175,175,175,175,180,180,180,180,180,175,175,175,175,172,172,172,172,172,172,172,167,164,164,164,164,164,159,156,156,156,151,148,148,148,143,140,140,135,132,132,127,124,124,119,116,111,108,108,100,100,92,92,84,79,76,68,60,55,47,36,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,36,47,55,63,68,76,79,84,92,92,100,100,108,108,116,116,119,124,124,132,132,132,140,140,140,143,148,148,151,156,156,156,159,164,164,164,164,167,167,172,172,172,172,172,175,175,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,175,175,175,172,172,172,172,172,167,164,164,164,164,159,156,156,156,151,148,148,148,143,140,140,135,132,132,127,124,124,116,116,111,108,103,100,95,92,87,84,76,71,68,60,52,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,44,52,60,68,76,76,84,87,92,100,100,108,108,111,116,119,124,124,127,132,132,140,140,140,148,148,148,151,156,156,156,159,164,164,164,167,167,172,172,172,172,175,175,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,175,175,172,172,172,172,172,167,164,164,164,164,159,156,156,156,148,148,148,143,140,140,135,132,132,127,124,124,116,116,111,108,103,100,95,92,84,84,76,68,63,55,52,39,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,39,52,60,63,68,76,84,84,92,95,100,103,108,111,116,116,124,124,127,132,132,140,140,140,143,148,148,151,156,156,156,159,164,164,164,167,172,172,172,172,175,175,180,180,180,180,180,180,183,183,183,183,188,188,188,188,188,188,188,183,183,183,180,180,180,180,180,180,180,175,172,172,172,172,167,167,164,164,164,159,156,156,156,148,148,148,143,140,140,135,132,132,124,124,119,116,116,108,108,100,100,92,92,84,79,76,68,60,52,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,44,52,60,68,76,79,84,92,92,100,100,108,108,116,116,124,124,127,132,132,135,140,140,143,148,148,151,156,156,156,159,164,164,164,167,172,172,172,175,175,180,180,180,180,180,183,183,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,183,183,183,180,180,180,180,180,175,172,172,172,172,167,164,164,164,159,156,156,156,148,148,148,143,140,140,135,132,132,124,124,119,116,111,108,103,100,95,92,87,84,76,68,63,60,52,39,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,39,52,60,63,71,76,84,87,92,95,100,108,108,111,116,119,124,124,132,132,135,140,140,143,148,148,151,156,156,156,164,164,164,167,172,172,172,172,175,180,180,180,180,180,183,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,183,183,180,180,180,180,175,175,172,172,172,167,164,164,164,159,156,156,156,148,148,148,140,140,140,132,132,127,124,124,116,116,111,108,103,100,92,92,84,79,76,68,60,52,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,20,36,44,52,60,68,76,79,84,92,92,100,103,108,111,116,116,124,124,127,132,135,140,140,143,148,148,151,156,156,156,164,164,164,167,172,172,172,175,175,180,180,180,180,183,188,188,188,188,188,188,191,191,191,191,196,196,196,196,196,196,191,191,191,191,188,188,188,188,188,188,183,183,180,180,180,180,175,172,172,172,167,164,164,164,159,156,156,151,148,148,148,140,140,135,132,132,127,124,119,116,116,108,108,100,100,92,87,84,76,71,63,60,52,39,28,0,0,0,0,0,0,0,0,0,0,0,0,28,39,52,60,63,71,76,84,87,92,100,100,108,108,116,116,119,124,127,132,132,140,140,143,148,148,151,156,156,156,159,164,164,167,172,172,172,175,180,180,180,180,183,188,188,188,188,188,191,191,191,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,191,191,188,188,188,188,188,183,180,180,180,180,175,172,172,172,167,164,164,164,159,156,156,151,148,148,143,140,140,135,132,132,124,124,119,116,111,108,103,100,92,92,84,79,76,68,60,52,44,36,15,0,0,0,0,0,0,0,0,0,0,12,31,44,52,60,68,76,79,84,92,92,100,103,108,111,116,119,124,124,132,132,135,140,140,148,148,148,156,156,156,159,164,164,167,172,172,172,175,180,180,180,180,183,188,188,188,188,191,191,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,191,191,188,188,188,188,188,183,180,180,180,175,172,172,172,167,164,164,164,159,156,156,151,148,148,143,140,140,132,132,127,124,124,116,116,108,108,100,100,92,87,84,76,68,63,55,47,36,23,0,0,0,0,0,0,0,0,0,0,23,36,47,55,63,68,76,84,87,92,100,100,108,108,116,116,124,124,127,132,132,140,140,143,148,148,151,156,156,159,164,164,167,172,172,172,175,180,180,180,183,188,188,188,188,191,191,196,196,196,196,196,196,199,199,199,199,199,204,204,199,199,199,199,199,196,196,196,196,196,196,196,191,188,188,188,188,183,180,180,180,175,172,172,172,167,164,164,164,156,156,156,151,148,148,140,140,135,132,132,124,124,119,116,111,108,103,100,92,92,84,79,76,68,60,52,44,31,12,0,0,0,0,0,0,0,0,0,28,44,52,60,68,76,76,84,92,92,100,103,108,111,116,119,124,124,132,132,135,140,140,148,148,151,156,156,159,164,164,164,172,172,172,175,180,180,180,183,188,188,188,188,191,196,196,196,196,196,199,199,199,204,204,204,204,204,204,204,204,204,204,204,204,204,199,199,196,196,196,196,196,191,191,188,188,188,183,180,180,180,175,172,172,172,167,164,164,159,156,156,151,148,148,143,140,140,135,132,127,124,124,116,116,108,108,100,95,92,87,84,76,68,63,55,44,36,20,0,0,0,0,0,0,0,0,20,36,44,52,60,68,76,84,84,92,95,100,108,108,116,116,124,124,127,132,135,140,140,143,148,148,156,156,156,164,164,164,167,172,172,175,180,180,180,183,188,188,188,188,191,196,196,196,196,199,199,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,199,199,196,196,196,196,196,191,188,188,188,183,180,180,180,175,172,172,172,167,164,164,159,156,156,151,148,148,143,140,135,132,132,124,124,119,116,111,108,103,100,92,92,84,76,71,68,60,52,39,28,0,0,0,0,0,0,0,0,23,36,47,60,63,71,76,84,87,92,100,103,108,111,116,119,124,124,132,132,135,140,143,148,148,151,156,156,159,164,164,167,172,172,175,180,180,180,183,188,188,188,191,191,196,196,196,196,199,204,204,204,204,204,204,204,207,207,207,207,207,207,207,207,207,204,204,204,204,204,204,199,199,196,196,196,196,191,188,188,188,183,180,180,180,175,172,172,172,164,164,164,159,156,156,148,148,143,140,140,135,132,127,124,124,116,116,108,108,100,95,92,84,79,76,68,60,52,44,31,12,0,0,0,0,0,0,7,28,44,52,60,68,76,79,84,92,95,100,103,108,116,116,124,124,127,132,135,140,140,143,148,148,156,156,159,164,164,167,172,172,172,175,180,180,183,188,188,188,191,196,196,196,196,199,204,204,204,204,204,204,207,207,212,212,212,212,212,212,212,212,212,212,207,207,207,204,204,204,204,204,199,196,196,196,196,191,188,188,188,183,180,180,180,175,172,172,167,164,164,159,156,156,151,148,148,143,140,135,132,132,124,124,119,116,111,108,100,100,92,87,84,76,68,63,55,47,36,20,0,0,0,0,0,0,20,36,44,52,60,68,76,84,87,92,100,100,108,108,116,116,124,124,132,132,135,140,143,148,148,151,156,156,159,164,164,167,172,172,175,180,180,180,188,188,188,191,196,196,196,196,199,204,204,204,204,207,207,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,207,207,204,204,204,204,199,199,196,196,196,191,188,188,188,183,180,180,180,172,172,172,167,164,164,159,156,156,148,148,143,140,140,135,132,127,124,119,116,111,108,103,100,92,92,84,76,71,68,60,52,39,28,0,0,0,0,0,0,23,36,47,60,63,71,76,84,92,92,100,103,108,111,116,119,124,127,132,132,140,140,143,148,148,156,156,159,164,164,167,172,172,175,180,180,180,183,188,188,188,191,196,196,196,199,204,204,204,204,207,212,212,212,212,212,212,212,212,215,215,215,215,215,212,212,212,212,212,212,212,207,207,204,204,204,204,199,196,196,196,191,188,188,188,183,180,180,175,172,172,167,164,164,159,156,156,151,148,148,143,140,135,132,132,124,124,116,116,108,108,100,95,92,84,79,76,68,60,52,44,31,12,0,0,0,0,0,28,39,52,60,68,76,79,84,92,95,100,108,108,116,116,124,124,132,132,135,140,140,148,148,151,156,156,159,164,164,167,172,172,175,180,180,183,188,188,188,191,196,196,196,199,204,204,204,204,207,212,212,212,212,212,215,215,215,220,220,220,220,220,220,215,215,215,212,212,212,212,212,212,207,204,204,204,204,199,196,196,196,191,188,188,183,180,180,180,175,172,172,167,164,164,159,156,156,148,148,143,140,140,132,132,127,124,119,116,111,108,100,100,92,87,84,76,68,63,55,44,36,20,0,0,0,0,12,31,44,52,60,68,76,84,84,92,100,100,108,108,116,119,124,124,132,132,140,140,143,148,148,156,156,159,164,164,167,172,172,175,180,180,180,188,188,188,191,196,196,196,199,204,204,204,207,207,212,212,212,212,215,215,220,220,220,220,220,220,220,220,220,220,220,220,220,215,212,212,212,212,212,207,204,204,204,199,199,196,196,191,188,188,188,183,180,180,175,172,172,167,164,164,159,156,156,151,148,148,140,140,135,132,127,124,124,116,111,108,103,100,92,92,84,76,71,68,60,47,36,23,0,0,0,0,20,36,44,55,63,68,76,84,87,92,100,103,108,111,116,119,124,127,132,135,140,140,148,148,151,156,156,159,164,164,167,172,172,175,180,180,183,188,188,191,196,196,196,199,204,204,204,207,207,212,212,212,215,215,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,215,215,212,212,212,212,207,204,204,204,199,196,196,196,191,188,188,188,180,180,180,175,172,172,167,164,164,159,156,156,148,148,143,140,135,132,132,124,124,116,116,108,108,100,95,92,84,79,76,68,60,52,39,28,0,0,0,0,20,36,47,60,68,71,76,84,92,92,100,103,108,116,116,124,124,132,132,135,140,143,148,148,151,156,156,164,164,167,172,172,175,180,180,180,188,188,188,191,196,196,196,204,204,204,204,207,212,212,212,215,215,220,220,220,220,220,223,223,223,223,223,223,223,223,220,220,220,220,220,220,215,212,212,212,212,207,204,204,204,199,196,196,196,191,188,188,183,180,180,175,172,172,167,164,164,159,156,156,151,148,143,140,140,132,132,127,124,119,116,111,108,100,100,92,84,84,76,68,60,52,44,31,12,0,0,0,28,39,52,60,68,76,79,84,92,95,100,108,108,116,116,124,124,132,132,140,140,143,148,148,156,156,159,164,164,167,172,172,175,180,180,183,188,188,191,196,196,196,199,204,204,204,207,212,212,212,215,220,220,220,220,220,223,223,228,228,228,228,228,228,228,228,228,223,223,220,220,220,220,215,212,212,212,212,207,204,204,204,199,196,196,191,188,188,188,180,180,180,175,172,172,164,164,164,156,156,151,148,148,140,140,135,132,127,124,119,116,111,108,103,100,92,87,84,76,68,60,52,44,36,15,0,0,0,28,44,52,60,68,76,79,84,92,100,100,108,111,116,119,124,127,132,132,140,140,143,148,151,156,156,159,164,164,172,172,172,180,180,180,188,188,188,191,196,196,199,204,204,204,207,212,212,212,215,220,220,220,220,223,223,228,228,228,228,228,228,228,228,228,228,228,228,228,223,220,220,220,220,215,212,212,212,207,204,204,204,199,196,196,196,191,188,188,183,180,180,175,172,172,167,164,164,159,156,156,148,148,143,140,135,132,132,124,124,116,116,108,103,100,92,92,84,76,71,63,55,47,36,20,0,0,12,31,44,52,60,68,76,84,87,92,100,100,108,111,116,119,124,127,132,135,140,140,148,148,151,156,156,164,164,167,172,172,175,180,180,183,188,188,191,196,196,196,199,204,204,207,212,212,212,215,215,220,220,220,223,228,228,228,228,228,228,228,231,231,228,228,228,228,228,228,228,223,220,220,220,220,215,212,212,212,207,204,204,204,199,196,196,191,188,188,183,180,180,180,172,172,167,164,164,159,156,156,148,148,143,140,140,132,132,124,124,116,116,108,108,100,95,92,84,79,71,68,60,52,36,23,0,0,15,36,44,55,63,68,76,84,87,92,100,103,108,111,116,124,124,127,132,135,140,143,148,148,156,156,159,164,164,167,172,172,175,180,180,183,188,188,191,196,196,199,204,204,204,207,212,212,212,215,220,220,220,223,228,228,228,228,228,231,231,231,236,236,236,231,231,231,228,228,228,228,223,220,220,220,220,215,212,212,212,207,204,204,199,196,196,196,188,188,188,183,180,180,175,172,172,164,164,159,156,156,151,148,143,140,140,132,132,127,124,119,116,108,108,100,95,92,84,79,76,68,60,52,39,28,0,0,20,36,47,55,63,71,76,84,92,92,100,103,108,116,116,124,124,132,132,135,140,143,148,148,156,156,159,164,164,167,172,172,180,180,180,188,188,188,191,196,196,199,204,204,204,212,212,212,215,220,220,220,223,228,228,228,228,231,231,236,236,236,236,236,236,236,236,236,231,228,228,228,228,223,220,220,220,215,212,212,212,207,204,204,204,196,196,196,191,188,188,183,180,180,175,172,172,167,164,164,156,156,151,148,148,140,140,135,132,127,124,119,116,111,108,100,100,92,84,79,76,68,60,52,44,28,0,0,20,36,47,60,68,71,76,84,92,95,100,108,108,116,116,124,124,132,132,140,140,143,148,151,156,156,159,164,164,172,172,175,180,180,183,188,188,191,196,196,196,199,204,204,207,212,212,212,215,220,220,220,223,228,228,228,231,231,236,236,236,236,236,236,236,236,236,236,236,231,228,228,228,228,223,220,220,220,215,212,212,207,204,204,204,199,196,196,191,188,188,183,180,180,175,172,172,167,164,164,159,156,151,148,148,140,140,135,132,127,124,119,116,111,108,100,100,92,87,84,76,68,60,52,44,28,7,0,23,36,52,60,68,76,79,84,92,95,100,108,108,116,116,124,124,132,132,140,140,148,148,151,156,156,164,164,167,172,172,175,180,180,183,188,188,191,196,196,199,204,204,204,207,212,212,215,220,220,220,223,228,228,228,231,231,236,236,236,236,239,239,239,239,236,236,236,236,236,231,228,228,228,223,220,220,220,215,212,212,212,207,204,204,199,196,196,191,188,188,188,180,180,180,172,172,167,164,164,159,156,156,148,148,143,140,135,132,127,124,119,116,111,108,103,100,92,87,84,76,68,60,52,44,31,12,0,28,39,52,60,68,76,79,84,92,95,100,108,108,116,119,124,127,132,132,140,140,148,148,151,156,156,164,164,167,172,172,175,180,180,183,188,188,191,196,196,199,204,204,204,212,212,212,215,220,220,220,223,228,228,228,231,236,236,236,236,239,244,244,244,244,239,239,236,236,236,236,231,228,228,228,223,220,220,220,212,212,212,207,204,204,199,196,196,196,188,188,188,183,180,180,172,172,172,164,164,159,156,156,148,148,143,140,135,132,132,124,124,116,116,108,103,100,92,87,84,76,68,63,52,44,36,12,0,28,39,52,60,68,76,79,84,92,100,100,108,111,116,119,124,127,132,135,140,140,148,148,151,156,156,164,164,167,172,172,175,180,180,183,188,188,191,196,196,199,204,204,207,212,212,212,215,220,220,223,228,228,228,231,236,236,236,236,239,244,244,244,244,244,244,244,239,236,236,236,231,228,228,228,223,220,220,220,215,212,212,207,204,204,204,199,196,196,191,188,188,183,180,180,175,172,172,164,164,159,156,156,148,148,143,140,140,132,132,124,124,116,116,108,103,100,92,92,84,76,68,63,55,44,36,15,0,28,44,52,60,68,76,79,84,92,100,100,108,111,116,119,124,127,132,135,140,140,148,148,151,156,159,164,164,167,172,172,175,180,180,188,188,188,196,196,196,199,204,204,207,212,212,212,220,220,220,223,228,228,228,231,236,236,236,239,244,244,244,244,244,244,244,244,239,239,236,236,236,231,228,228,223,220,220,220,215,212,212,212,204,204,204,199,196,196,191,188,188,183,180,180,175,172,172,164,164,159,156,156,151,148,143,140,140,132,132,124,124,116,116,108,103,100,92,92,84,76,71,63,55,44,36,20,0,28,44,52,60,68,76,84,84,92,100,100,108,111,116,119,124,127,132,135,140,140,148,148,151,156,159,164,164,167,172,172,180,180,180,188,188,188,196,196,196,199,204,204,207,212,212,215,220,220,220,223,228,228,228,231,236,236,239,244,244,244,244,247,247,244,244,244,244,239,236,236,236,231,228,228,228,223,220,220,215,212,212,212,204,204,204,199,196,196,191,188,188,183,180,180,175,172,172,164,164,159,156,156,151,148,143,140,140,132,132,124,124,116,116,108,103,100,95,92,84,76,71,63,55,47,36,20,0,28,44,52,60,68,76,84,87,92,100,100,108,111,116,119,124,127,132,135,140,143,148,148,156,156,159,164,164,167,172,172,180,180,180,188,188,188,196,196,196,204,204,204,207,212,212,215,220,220,220,223,228,228,231,236,236,236,239,244,244,244,247,252,252,247,244,244,244,239,236,236,236,231,228,228,228,223,220,220,215,212,212,212,207,204,204,199,196,196,191,188,188,183,180,180,175,172,172,167,164,164,156,156,151,148,143,140,140,132,132,124,124,116,116,108,108,100,95,92,84,76,71,63,55,47,36,20,0,28,44,52,60,68,76,84,87,92,100,100,108,111,116,119,124,127,132,135,140,143,148,148,156,156,159,164,164,167,172,172,180,180,180,188,188,188,196,196,196,204,204,204,207,212,212,215,220,220,220,223,228,228,231,236,236,236,239,244,244,244,247,252,252,247,244,244,244,239,236,236,236,231,228,228,228,223,220,220,215,212,212,212,207,204,204,199,196,196,191,188,188,183,180,180,175,172,172,167,164,164,156,156,151,148,143,140,140,132,132,124,124,116,116,108,108,100,95,92,84,76,71,63,55,47,36,20,0,28,44,52,60,68,76,84,87,92,100,100,108,111,116,119,124,127,132,135,140,140,148,148,156,156,159,164,164,167,172,172,180,180,180,188,188,188,196,196,196,199,204,204,207,212,212,215,220,220,220,223,228,228,228,236,236,236,239,244,244,244,244,247,247,247,244,244,244,239,236,236,236,231,228,228,228,223,220,220,215,212,212,212,207,204,204,199,196,196,191,188,188,183,180,180,175,172,172,167,164,159,156,156,151,148,143,140,140,132,132,124,124,116,116,108,103,100,95,92,84,76,71,63,55,47,36,20,0,28,44,52,60,68,76,84,84,92,100,100,108,111,116,119,124,127,132,135,140,140,148,148,151,156,159,164,164,167,172,172,180,180,180,188,188,188,196,196,196,199,204,204,207,212,212,215,220,220,220,223,228,228,228,231,236,236,236,239,244,244,244,244,244,244,244,244,244,239,236,236,236,231,228,228,228,220,220,220,215,212,212,212,204,204,204,199,196,196,191,188,188,183,180,180,175,172,172,164,164,159,156,156,151,148,143,140,140,132,132,124,124,116,116,108,103,100,92,92,84,76,71,63,55,44,36,20,0,28,39,52,60,68,76,79,84,92,100,100,108,111,116,119,124,127,132,135,140,140,148,148,151,156,159,164,164,167,172,172,175,180,180,188,188,188,191,196,196,199,204,204,207,212,212,212,215,220,220,223,228,228,228,231,236,236,236,239,244,244,244,244,244,244,244,244,239,236,236,236,231,228,228,228,223,220,220,220,215,212,212,207,204,204,204,199,196,196,191,188,188,183,180,180,175,172,172,164,164,159,156,156,151,148,143,140,140,132,132,124,124,116,116,108,103,100,92,92,84,76,71,63,55,44,36,20,0,28,39,52,60,68,76,79,84,92,95,100,108,111,116,119,124,127,132,135,140,140,148,148,151,156,156,164,164,167,172,172,175,180,180,183,188,188,191,196,196,199,204,204,207,212,212,212,215,220,220,220,228,228,228,231,236,236,236,236,239,239,244,244,244,244,244,239,236,236,236,236,231,228,228,228,223,220,220,220,215,212,212,207,204,204,204,196,196,196,191,188,188,183,180,180,175,172,172,164,164,159,156,156,148,148,143,140,135,132,132,124,124,116,116,108,103,100,92,87,84,76,68,63,55,44,36,15,0,23,39,52,60,68,76,79,84,92,95,100,108,108,116,119,124,127,132,132,140,140,148,148,151,156,156,164,164,167,172,172,175,180,180,183,188,188,191,196,196,199,204,204,204,207,212,212,215,220,220,220,223,228,228,228,231,236,236,236,236,239,239,239,239,239,239,236,236,236,236,231,228,228,228,228,223,220,220,215,212,212,212,207,204,204,199,196,196,196,188,188,188,180,180,180,172,172,167,164,164,159,156,156,148,148,143,140,135,132,132,124,124,116,111,108,103,100,92,87,84,76,68,60,52,44,31,12,0,23,36,47,60,68,71,79,84,92,95,100,108,108,116,116,124,124,132,132,140,140,143,148,151,156,156,159,164,164,172,172,175,180,180,183,188,188,191,196,196,196,204,204,204,207,212,212,212,220,220,220,223,228,228,228,228,231,236,236,236,236,236,236,236,236,236,236,236,236,231,231,228,228,228,223,220,220,220,215,212,212,212,207,204,204,199,196,196,191,188,188,183,180,180,175,172,172,167,164,164,159,156,156,148,148,143,140,135,132,127,124,119,116,111,108,103,100,92,87,84,76,68,60,52,44,31,12,0,20,36,47,55,63,71,76,84,92,95,100,103,108,116,116,124,124,132,132,140,140,143,148,148,156,156,159,164,164,172,172,172,180,180,180,188,188,188,196,196,196,199,204,204,207,212,212,212,215,220,220,220,223,228,228,228,228,231,236,236,236,236,236,236,236,236,236,236,231,231,228,228,228,223,220,220,220,220,215,212,212,207,204,204,204,199,196,196,191,188,188,183,180,180,175,172,172,167,164,164,156,156,151,148,148,140,140,135,132,127,124,119,116,111,108,100,100,92,87,84,76,68,60,52,44,28,0,0,20,36,44,55,63,68,76,84,92,92,100,103,108,116,116,124,124,132,132,135,140,143,148,148,156,156,159,164,164,167,172,172,175,180,180,183,188,188,191,196,196,199,204,204,204,207,212,212,212,215,220,220,220,223,228,228,228,228,231,231,236,236,236,236,236,236,231,231,228,228,228,228,228,223,220,220,220,215,212,212,212,207,204,204,199,196,196,196,191,188,188,183,180,180,175,172,172,167,164,164,156,156,151,148,148,140,140,132,132,127,124,119,116,108,108,100,95,92,84,79,76,68,60,52,44,28,0,0,12,36,44,52,60,68,76,84,87,92,100,103,108,111,116,119,124,127,132,135,140,140,148,148,151,156,156,164,164,167,172,172,175,180,180,183,188,188,191,196,196,196,199,204,204,207,212,212,212,215,220,220,220,220,223,228,228,228,228,228,231,231,231,231,231,231,228,228,228,228,228,228,223,220,220,220,215,212,212,212,207,204,204,204,199,196,196,191,188,188,188,180,180,180,172,172,172,164,164,159,156,156,151,148,143,140,140,132,132,124,124,116,116,108,108,100,95,92,84,79,76,68,60,52,39,28,0,0,7,28,44,52,60,68,76,84,87,92,100,100,108,111,116,119,124,127,132,135,140,140,148,148,151,156,156,164,164,164,172,172,175,180,180,183,188,188,188,191,196,196,199,204,204,204,207,212,212,212,215,220,220,220,220,223,228,228,228,228,228,228,228,228,228,228,228,228,228,228,223,223,220,220,220,220,215,212,212,212,207,204,204,204,196,196,196,191,188,188,183,180,180,175,172,172,167,164,164,159,156,156,148,148,143,140,135,132,132,124,124,116,116,108,103,100,95,92,84,76,71,68,60,47,36,20,0,0,0,28,44,52,60,68,76,79,84,92,95,100,108,108,116,116,124,124,132,132,140,140,143,148,148,156,156,159,164,164,167,172,172,175,180,180,183,188,188,191,196,196,196,199,204,204,207,212,212,212,212,215,220,220,220,220,223,223,228,228,228,228,228,228,228,228,228,228,228,223,220,220,220,220,220,215,212,212,212,207,204,204,204,199,196,196,196,188,188,188,183,180,180,175,172,172,167,164,164,156,156,151,148,148,140,140,135,132,127,124,119,116,111,108,103,100,92,87,84,76,68,63,55,44,36,20,0,0,0,23,36,52,60,68,71,79,84,92,95,100,108,108,116,116,124,124,132,132,135,140,143,148,148,156,156,159,164,164,167,172,172,175,180,180,183,188,188,188,196,196,196,199,204,204,204,207,212,212,212,212,215,220,220,220,220,220,223,223,223,228,228,228,228,228,223,223,223,220,220,220,220,220,215,212,212,212,207,204,204,204,199,196,196,196,191,188,188,183,180,180,180,172,172,172,164,164,159,156,156,151,148,148,140,140,132,132,127,124,119,116,111,108,100,100,92,87,84,76,68,60,52,44,31,12,0,0,0,20,36,47,55,63,71,76,84,92,92,100,103,108,111,116,119,124,127,132,135,140,140,148,148,151,156,156,164,164,164,172,172,172,180,180,180,183,188,188,191,196,196,196,199,204,204,204,207,212,212,212,212,215,220,220,220,220,220,220,220,223,223,223,223,220,220,220,220,220,220,220,215,215,212,212,212,207,207,204,204,204,199,196,196,191,188,188,188,183,180,180,175,172,172,167,164,164,159,156,156,148,148,143,140,140,132,132,124,124,116,116,108,108,100,95,92,84,79,76,68,60,52,44,28,0,0,0,0,15,36,44,52,60,68,76,84,87,92,100,100,108,111,116,119,124,127,132,132,140,140,143,148,148,156,156,159,164,164,167,172,172,175,180,180,183,188,188,188,191,196,196,196,199,204,204,204,207,212,212,212,212,215,215,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,215,212,212,212,212,207,207,204,204,204,199,196,196,196,191,188,188,183,180,180,180,172,172,172,164,164,164,156,156,151,148,148,143,140,135,132,132,124,124,116,116,108,103,100,95,92,84,79,71,68,60,52,39,28,0,0,0,0,0,28,44,52,60,68,76,79,84,92,95,100,108,108,116,116,124,124,132,132,135,140,143,148,148,151,156,156,164,164,164,172,172,172,180,180,180,183,188,188,191,196,196,196,199,204,204,204,204,207,212,212,212,212,212,215,215,220,220,220,220,220,220,220,220,220,220,215,215,215,212,212,212,212,207,207,204,204,204,199,196,196,196,191,188,188,188,183,180,180,175,172,172,167,164,164,159,156,156,151,148,148,140,140,135,132,127,124,119,116,111,108,103,100,92,87,84,76,71,63,55,47,36,20,0,0,0,0,0,28,39,52,60,68,71,76,84,92,92,100,103,108,111,116,119,124,127,132,135,140,140,148,148,151,156,156,159,164,164,167,172,172,175,180,180,180,188,188,188,191,196,196,196,199,204,204,204,204,207,207,212,212,212,212,212,212,215,215,215,215,215,215,215,215,215,212,212,212,212,212,212,207,204,204,204,204,199,196,196,196,191,188,188,188,183,180,180,180,172,172,172,164,164,164,156,156,151,148,148,143,140,140,132,132,124,124,119,116,108,108,100,100,92,87,84,76,68,60,52,44,36,15,0,0,0,0,0,20,36,44,55,63,68,76,84,87,92,100,100,108,111,116,119,124,127,132,132,140,140,143,148,148,156,156,156,164,164,164,172,172,172,175,180,180,183,188,188,188,191,196,196,196,199,199,204,204,204,204,207,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,207,207,204,204,204,204,199,196,196,196,191,191,188,188,183,180,180,180,175,172,172,167,164,164,159,156,156,151,148,148,140,140,135,132,127,124,124,116,116,108,108,100,95,92,84,79,76,68,60,52,44,28,0,0,0,0,0,0,12,31,44,52,60,68,76,79,84,92,95,100,108,108,116,116,124,124,132,132,135,140,140,148,148,151,156,156,159,164,164,167,172,172,175,180,180,180,183,188,188,188,191,196,196,196,199,199,204,204,204,204,207,207,207,212,212,212,212,212,212,212,212,212,212,212,212,212,207,207,204,204,204,204,204,199,196,196,196,196,191,188,188,188,183,180,180,175,172,172,172,164,164,164,156,156,156,148,148,143,140,140,132,132,127,124,119,116,111,108,103,100,92,92,84,76,71,63,60,47,36,23,0,0,0,0,0,0,0,28,39,52,60,68,71,76,84,92,92,100,103,108,111,116,119,124,127,132,132,140,140,143,148,148,151,156,156,164,164,164,167,172,172,175,180,180,180,183,188,188,188,191,196,196,196,196,199,204,204,204,204,204,204,207,207,207,212,212,212,212,212,212,207,207,207,207,204,204,204,204,204,199,199,196,196,196,191,191,188,188,188,183,180,180,180,172,172,172,167,164,164,159,156,156,151,148,148,140,140,135,132,132,124,124,116,116,108,108,100,100,92,87,84,76,68,60,52,44,36,20,0,0,0,0,0,0,0,20,36,47,55,63,68,76,84,87,92,100,100,108,108,116,116,124,124,132,132,135,140,140,148,148,151,156,156,159,164,164,167,172,172,172,175,180,180,180,183,188,188,188,191,196,196,196,196,199,199,204,204,204,204,204,204,204,204,204,207,207,207,204,204,204,204,204,204,204,204,204,199,196,196,196,196,191,191,188,188,188,183,180,180,180,175,172,172,167,164,164,159,156,156,151,148,148,143,140,140,132,132,127,124,119,116,111,108,103,100,95,92,84,79,76,68,60,52,44,28,7,0,0,0,0,0,0,0,12,31,44,52,60,68,76,79,84,92,95,100,103,108,111,116,119,124,127,132,132,140,140,143,148,148,151,156,156,159,164,164,167,172,172,172,175,180,180,180,183,188,188,188,191,191,196,196,196,196,199,199,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,199,199,196,196,196,196,196,191,188,188,188,188,183,180,180,180,175,172,172,167,164,164,164,159,156,156,151,148,148,140,140,135,132,132,124,124,116,116,108,108,100,100,92,87,84,76,71,63,60,47,36,23,0,0,0,0,0,0,0,0,0,28,39,52,60,68,71,76,84,87,92,100,100,108,111,116,116,124,124,132,132,135,140,140,143,148,148,156,156,156,164,164,164,167,172,172,172,175,180,180,180,183,188,188,188,188,191,196,196,196,196,196,196,199,199,199,204,204,204,204,204,204,204,204,204,199,199,199,196,196,196,196,196,191,191,188,188,188,188,183,180,180,180,175,172,172,172,167,164,164,159,156,156,151,148,148,143,140,140,132,132,127,124,119,116,111,108,103,100,95,92,84,79,76,68,60,52,44,36,15,0,0,0,0,0,0,0,0,0,20,36,44,52,60,68,76,79,84,92,95,100,103,108,111,116,119,124,127,132,132,140,140,143,148,148,151,156,156,159,164,164,164,167,172,172,172,175,180,180,180,183,188,188,188,188,191,191,196,196,196,196,196,196,196,199,199,199,199,199,199,199,199,196,196,196,196,196,196,196,196,191,188,188,188,188,183,183,180,180,180,175,172,172,172,167,164,164,159,156,156,151,148,148,143,140,140,135,132,132,124,124,116,116,108,108,100,100,92,87,84,76,71,68,60,52,39,28,0,0,0,0,0,0,0,0,0,0,7,28,44,52,60,68,71,76,84,87,92,100,100,108,108,116,116,124,124,127,132,135,140,140,143,148,148,151,156,156,159,164,164,164,167,172,172,172,175,180,180,180,183,183,188,188,188,188,191,191,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,191,191,188,188,188,188,188,183,180,180,180,180,175,172,172,172,167,164,164,159,156,156,156,148,148,148,140,140,135,132,132,127,124,119,116,111,108,103,100,95,92,84,84,76,68,60,55,44,36,20,0,0,0,0,0,0,0,0,0,0,0,20,36,47,55,60,68,76,84,84,92,95,100,103,108,111,116,119,124,124,132,132,135,140,140,143,148,148,151,156,156,159,164,164,164,167,172,172,172,175,180,180,180,180,183,188,188,188,188,188,188,191,191,191,196,196,196,196,196,196,196,196,196,196,196,191,191,191,188,188,188,188,188,183,183,180,180,180,180,175,172,172,172,167,164,164,164,156,156,156,151,148,148,143,140,140,132,132,127,124,124,116,116,108,108,100,100,92,87,84,76,71,68,60,52,44,28,12,0,0,0,0,0,0,0,0,0,0,0,12,31,44,52,60,68,71,76,84,87,92,100,100,108,108,116,116,124,124,127,132,132,140,140,140,148,148,148,156,156,156,159,164,164,164,167,172,172,172,175,180,180,180,180,180,183,188,188,188,188,188,188,188,188,191,191,191,191,191,191,191,191,191,188,188,188,188,188,188,188,183,183,180,180,180,180,175,172,172,172,172,167,164,164,164,156,156,156,151,148,148,143,140,140,135,132,132,124,124,119,116,111,108,103,100,95,92,84,84,76,68,63,55,47,36,23,0,0,0,0,0,0,0,0,0,0,0,0,0,23,36,47,55,63,68,76,79,84,92,95,100,103,108,111,116,116,124,124,127,132,132,140,140,143,148,148,148,156,156,156,159,164,164,164,167,172,172,172,172,175,180,180,180,180,180,183,183,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,183,183,180,180,180,180,180,175,172,172,172,167,167,164,164,164,156,156,156,151,148,148,143,140,140,135,132,132,127,124,119,116,116,108,108,100,100,92,87,84,76,71,68,60,52,44,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,44,52,60,68,71,76,84,87,92,100,100,108,108,111,116,119,124,124,132,132,135,140,140,143,148,148,148,156,156,156,159,164,164,164,167,172,172,172,172,175,175,180,180,180,180,180,183,183,183,188,188,188,188,188,188,188,188,188,188,188,188,183,183,183,180,180,180,180,180,180,175,172,172,172,172,167,164,164,164,159,156,156,156,151,148,148,143,140,140,135,132,132,127,124,124,116,116,111,108,103,100,95,92,84,79,76,68,60,55,47,36,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,36,47,55,60,68,76,79,84,92,92,100,100,108,108,116,116,119,124,127,132,132,135,140,140,143,148,148,148,156,156,156,159,164,164,164,164,167,172,172,172,172,175,175,180,180,180,180,180,180,180,183,183,183,183,183,183,183,183,183,183,180,180,180,180,180,180,180,180,175,172,172,172,172,172,167,164,164,164,159,156,156,156,151,148,148,148,140,140,140,132,132,127,124,124,119,116,111,108,103,100,95,92,87,84,76,71,68,60,52,44,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,44,52,60,68,71,76,84,84,92,95,100,103,108,111,116,116,124,124,127,132,132,135,140,140,143,148,148,148,151,156,156,156,159,164,164,164,167,167,172,172,172,172,175,175,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,175,175,172,172,172,172,172,167,164,164,164,164,159,156,156,156,151,148,148,148,140,140,140,132,132,132,124,124,119,116,116,108,108,100,100,92,92,84,79,76,68,60,52,44,36,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,44,52,60,68,76,76,84,87,92,100,100,108,108,111,116,116,124,124,127,132,132,135,140,140,143,148,148,148,151,156,156,156,159,164,164,164,164,167,167,172,172,172,172,172,175,175,175,180,180,180,180,180,180,180,180,180,180,180,180,175,175,175,172,172,172,172,172,172,167,164,164,164,164,159,159,156,156,156,151,148,148,143,140,140,140,132,132,132,124,124,119,116,116,108,108,103,100,95,92,84,84,76,68,63,60,52,44,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,39,52,55,63,68,76,79,84,92,92,100,100,108,108,111,116,119,124,124,127,132,132,135,140,140,143,148,148,148,151,156,156,156,159,159,164,164,164,164,167,167,172,172,172,172,172,172,172,172,175,175,175,175,175,175,175,175,175,172,172,172,172,172,172,172,172,167,164,164,164,164,164,159,156,156,156,151,148,148,148,143,140,140,140,132,132,132,124,124,119,116,116,111,108,103,100,95,92,87,84,76,71,68,60,52,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,44,52,60,68,71,76,84,84,92,95,100,100,108,108,116,116,119,124,124,127,132,132,135,140,140,140,148,148,148,151,151,156,156,156,159,159,164,164,164,164,164,167,167,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,167,167,164,164,164,164,164,159,156,156,156,156,151,148,148,148,143,140,140,140,132,132,132,124,124,124,116,116,111,108,103,100,100,92,87,84,79,76,68,60,55,47,36,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,36,44,52,60,68,76,76,84,87,92,95,100,103,108,108,116,116,119,124,124,127,132,132,135,140,140,140,143,148,148,148,151,156,156,156,156,159,159,164,164,164,164,164,164,167,167,167,172,172,172,172,172,172,172,172,172,172,167,167,167,167,164,164,164,164,164,164,159,156,156,156,156,151,151,148,148,148,143,140,140,135,132,132,132,124,124,124,116,116,111,108,108,100,100,92,92,84,79,76,68,63,60,52,44,31,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,39,52,55,63,68,76,79,84,87,92,95,100,103,108,108,116,116,119,124,124,127,132,132,135,140,140,140,143,148,148,148,148,151,156,156,156,156,159,159,164,164,164,164,164,164,164,164,164,164,164,167,167,167,164,164,164,164,164,164,164,164,164,164,159,159,156,156,156,156,156,151,148,148,148,143,140,140,140,135,132,132,132,124,124,124,116,116,111,108,108,100,100,92,92,84,84,76,71,68,60,52,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,44,52,60,63,68,76,79,84,92,92,100,100,103,108,108,116,116,119,124,124,127,132,132,132,135,140,140,140,143,148,148,148,148,151,156,156,156,156,156,159,159,159,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,159,159,156,156,156,156,156,151,151,148,148,148,148,143,140,140,140,135,132,132,127,124,124,119,116,116,111,108,108,100,100,95,92,87,84,76,71,68,60,52,47,36,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,36,44,52,60,68,71,76,84,84,92,92,100,100,103,108,108,116,116,119,124,124,124,132,132,132,135,140,140,140,143,143,148,148,148,148,151,156,156,156,156,156,156,156,159,159,159,159,159,159,164,164,159,159,159,159,159,159,156,156,156,156,156,156,156,151,151,148,148,148,148,143,140,140,140,135,132,132,132,127,124,124,119,116,116,111,108,108,100,100,95,92,87,84,76,76,68,60,55,52,39,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,36,47,52,60,68,71,76,84,84,92,92,100,100,103,108,108,116,116,116,124,124,124,127,132,132,132,135,140,140,140,143,143,148,148,148,148,151,151,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,151,151,148,148,148,148,148,143,140,140,140,140,135,132,132,132,127,124,124,119,116,116,111,108,108,100,100,95,92,87,84,79,76,68,63,60,52,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,39,47,55,60,68,71,76,84,84,92,92,100,100,103,108,108,111,116,116,119,124,124,127,132,132,132,135,135,140,140,140,143,143,148,148,148,148,148,148,151,151,151,156,156,156,156,156,156,156,156,156,156,156,156,156,151,151,151,148,148,148,148,148,148,143,140,140,140,140,135,132,132,132,127,124,124,124,119,116,116,111,108,108,100,100,95,92,87,84,79,76,68,63,60,52,44,36,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,31,44,52,55,60,68,71,76,84,84,92,92,95,100,103,108,108,111,116,116,119,124,124,124,127,132,132,132,135,135,140,140,140,140,143,143,148,148,148,148,148,148,148,148,148,151,151,151,151,151,151,151,148,148,148,148,148,148,148,148,148,143,143,140,140,140,140,135,132,132,132,132,127,124,124,119,116,116,116,108,108,103,100,100,95,92,87,84,79,76,68,68,60,52,44,36,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,44,52,55,60,68,71,76,84,84,92,92,95,100,100,108,108,111,116,116,116,119,124,124,124,127,132,132,132,135,135,140,140,140,140,140,143,143,143,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,143,143,140,140,140,140,140,140,135,132,132,132,132,127,124,124,124,119,116,116,111,108,108,103,100,100,92,92,87,84,79,76,68,68,60,52,44,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,44,52,55,60,68,71,76,84,84,87,92,95,100,100,103,108,108,111,116,116,119,124,124,124,124,127,132,132,132,132,135,135,140,140,140,140,140,140,140,143,143,143,143,143,143,143,143,143,143,143,143,143,140,140,140,140,140,140,140,135,135,132,132,132,132,127,124,124,124,119,116,116,116,111,108,108,103,100,100,92,92,87,84,79,76,68,68,60,52,47,39,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,36,44,52,55,60,68,71,76,79,84,87,92,92,100,100,103,108,108,111,116,116,116,119,124,124,124,124,127,132,132,132,132,132,135,135,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,135,135,132,132,132,132,132,127,127,124,124,124,119,116,116,116,111,108,108,103,100,100,95,92,92,84,84,76,76,68,68,60,52,47,39,28,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,36,44,52,55,60,68,71,76,79,84,87,92,92,95,100,100,103,108,108,111,116,116,116,119,124,124,124,124,127,127,132,132,132,132,132,132,135,135,135,135,140,140,140,140,140,140,140,140,135,135,135,135,132,132,132,132,132,132,132,127,124,124,124,124,119,116,116,116,111,108,108,108,103,100,100,95,92,87,84,84,76,76,68,63,60,52,47,39,28,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,36,44,52,55,60,68,68,76,76,84,84,92,92,95,100,100,103,108,108,108,111,116,116,116,119,119,124,124,124,124,127,127,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,127,127,124,124,124,124,124,119,116,116,116,111,108,108,108,103,100,100,95,92,92,87,84,79,76,71,68,63,60,52,44,39,28,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,36,44,52,52,60,68,68,76,76,84,84,87,92,92,95,100,100,103,108,108,108,111,116,116,116,116,119,124,124,124,124,124,124,127,127,127,127,132,132,132,132,132,132,132,132,132,132,132,127,127,127,124,124,124,124,124,124,119,119,116,116,116,111,108,108,108,103,100,100,100,95,92,92,84,84,79,76,71,68,60,60,52,44,36,28,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,31,39,47,52,60,63,68,71,76,79,84,84,92,92,92,100,100,100,103,108,108,108,111,111,116,116,116,116,119,119,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,119,119,116,116,116,116,116,111,108,108,108,103,100,100,100,95,92,92,87,84,84,76,76,68,68,60,55,52,44,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,39,44,52,60,60,68,68,76,76,84,84,87,92,92,92,100,100,100,103,108,108,108,108,111,111,116,116,116,116,116,119,119,119,119,124,124,124,124,124,124,124,124,124,124,124,119,119,119,116,116,116,116,116,116,111,108,108,108,108,103,100,100,100,95,92,92,87,84,84,79,76,71,68,63,60,52,52,44,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,36,44,52,55,60,63,68,71,76,79,84,84,87,92,92,92,95,100,100,100,103,108,108,108,108,111,111,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,111,111,108,108,108,108,108,103,100,100,100,95,92,92,87,84,84,79,76,76,68,68,60,60,52,47,39,36,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,44,47,52,60,60,68,68,76,76,79,84,84,87,92,92,92,95,100,100,100,100,103,108,108,108,108,108,108,111,111,111,116,116,116,116,116,116,116,116,116,116,111,111,111,108,108,108,108,108,108,103,103,100,100,100,100,95,92,92,87,84,84,84,76,76,71,68,63,60,55,52,44,36,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,31,36,44,52,55,60,63,68,68,76,76,79,84,84,87,92,92,92,92,95,100,100,100,100,103,103,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,103,103,100,100,100,100,100,95,92,92,92,87,84,84,84,76,76,71,68,68,60,60,52,47,44,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,36,44,47,52,55,60,63,68,71,76,76,79,84,84,84,87,92,92,92,92,95,100,100,100,100,100,100,100,103,103,103,103,103,108,108,103,103,103,103,103,103,100,100,100,100,100,100,95,95,92,92,92,92,87,84,84,79,76,76,71,68,68,60,60,52,52,44,36,31,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,31,36,44,52,52,60,60,63,68,68,76,76,76,79,84,84,84,87,92,92,92,92,92,95,95,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,95,95,95,92,92,92,92,87,87,84,84,84,79,76,76,71,68,68,63,60,55,52,44,44,36,28,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,39,44,52,52,60,60,63,68,68,71,76,76,76,79,84,84,84,84,87,92,92,92,92,92,92,92,92,92,95,95,95,95,92,92,92,92,92,92,92,92,92,87,87,84,84,84,84,79,76,76,76,71,68,68,60,60,55,52,47,44,36,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,36,39,44,52,52,55,60,63,68,68,68,71,76,76,76,79,84,84,84,84,84,84,87,87,87,92,92,92,92,92,92,92,92,87,87,87,87,84,84,84,84,84,79,79,76,76,76,71,68,68,63,60,60,55,52,47,44,36,31,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,36,39,44,47,52,55,60,60,63,68,68,68,71,76,76,76,76,79,79,79,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,79,79,76,76,76,76,71,71,68,68,63,60,60,60,52,52,44,44,36,31,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,36,36,44,44,52,52,55,60,60,63,68,68,68,68,71,71,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,71,68,68,68,68,63,60,60,60,52,52,47,44,39,36,28,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,23,31,36,39,44,47,52,52,55,60,60,60,60,63,68,68,68,68,68,68,68,71,71,71,71,71,71,71,68,68,68,68,68,68,68,63,60,60,60,55,52,52,47,44,44,36,36,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,31,36,39,44,44,47,52,52,52,55,60,60,60,60,60,63,63,63,63,63,63,63,63,63,63,60,60,60,60,60,60,55,52,52,52,47,44,44,36,36,28,23,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,31,36,36,39,44,44,47,52,52,52,52,52,52,55,55,55,55,55,55,55,55,55,52,52,52,52,52,47,44,44,44,39,36,36,28,23,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,23,28,31,36,36,36,39,44,44,44,44,44,44,47,47,47,47,44,44,44,44,44,44,44,39,36,36,31,28,28,20,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,20,23,28,28,28,31,36,36,36,36,36,36,36,36,36,36,31,31,28,28,28,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,15,20,20,20,20,20,20,20,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};\n  const uint8_t FLARE_TEXTURE_3[16384] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,28,36,39,44,52,55,60,60,60,60,60,60,60,52,52,44,36,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,36,44,60,68,76,84,92,95,100,108,108,108,111,111,111,108,108,103,100,92,84,79,71,60,52,44,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,44,60,71,84,95,108,116,124,132,140,148,148,156,156,159,164,164,164,159,156,151,148,140,135,127,119,111,100,92,76,68,52,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,44,60,76,92,108,119,132,143,156,164,172,180,188,196,199,204,207,212,212,212,212,212,204,204,196,191,188,180,172,159,148,140,124,116,100,84,68,52,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,36,55,76,92,108,124,140,156,167,180,191,204,212,220,228,236,244,252,252,244,244,244,244,244,244,247,252,247,244,236,228,220,207,196,188,172,164,148,132,116,100,84,63,44,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,39,60,84,100,119,140,156,172,188,204,215,228,244,252,244,231,223,215,212,204,199,196,196,191,191,196,196,196,204,207,212,220,228,236,244,244,236,220,212,196,180,164,148,132,108,92,71,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,39,60,84,108,124,148,164,183,204,220,236,252,239,228,212,204,191,183,172,167,159,156,148,148,143,140,140,143,148,148,151,156,164,172,180,188,196,207,220,236,247,244,228,212,196,175,156,135,116,95,76,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,36,60,84,108,132,151,172,191,212,228,247,236,220,204,191,180,164,156,143,132,124,116,111,108,100,100,92,92,92,92,95,100,103,108,116,124,132,140,148,159,172,188,199,212,228,244,239,220,204,180,164,140,116,92,71,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,52,76,100,124,148,172,196,220,236,244,228,207,191,172,159,143,132,116,108,95,84,76,68,60,55,52,47,44,44,44,44,44,52,52,60,68,71,79,92,100,111,124,140,151,164,180,199,220,236,247,228,204,183,164,140,116,92,63,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,39,68,92,119,148,172,196,220,239,244,220,199,180,164,143,127,111,95,84,68,60,44,36,28,20,12,0,0,0,0,0,0,0,0,0,0,12,15,23,31,44,52,63,76,92,103,119,135,156,172,188,212,228,252,228,204,180,156,132,108,79,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,79,108,135,164,188,212,236,244,220,196,175,156,132,116,100,79,63,52,36,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,44,55,71,92,108,124,143,164,188,207,228,252,228,204,175,148,124,92,68,36,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,60,92,124,148,180,204,228,247,220,196,172,151,132,108,87,68,52,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,44,60,79,100,119,140,164,188,212,236,244,220,191,164,135,108,76,47,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,39,71,100,132,164,188,220,244,228,204,180,156,132,108,84,63,44,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,52,76,95,119,140,164,191,220,244,231,204,175,148,116,87,55,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,44,79,108,140,172,204,231,244,215,188,164,135,111,84,63,39,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,52,76,100,124,148,175,204,228,244,215,188,156,124,92,63,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,84,116,148,180,212,244,231,204,172,148,119,92,68,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,31,55,79,108,132,159,188,220,247,228,196,164,132,100,68,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,87,124,156,188,220,252,220,191,164,132,108,76,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,63,92,119,148,180,207,236,236,204,172,140,108,71,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,55,92,124,156,191,228,244,212,183,151,124,92,63,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,76,108,140,167,196,228,244,207,175,140,108,71,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,92,124,159,196,228,244,207,175,143,116,84,52,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,68,100,127,159,191,228,244,212,180,143,108,71,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,52,87,124,159,196,228,236,204,172,140,108,76,44,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,60,92,124,156,188,220,247,212,180,140,108,68,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,44,84,124,156,196,228,236,204,167,132,100,68,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,84,116,151,188,220,247,212,175,140,103,68,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,79,116,156,191,228,236,204,167,132,100,63,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,47,79,116,148,183,220,247,212,172,135,100,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,71,108,148,188,228,244,204,167,132,95,60,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,44,79,116,148,188,223,244,204,167,132,92,52,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,60,100,140,180,220,244,207,172,132,100,60,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,44,79,116,151,188,228,236,199,164,124,84,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,52,92,132,172,212,252,212,175,140,100,63,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,44,84,119,156,196,236,231,191,151,111,71,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,79,124,164,204,244,220,183,143,108,68,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,52,87,124,164,204,244,220,180,140,100,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,68,108,148,188,231,231,191,151,116,76,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,55,92,132,172,212,252,212,172,132,87,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,52,92,135,180,220,244,204,164,124,84,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,60,100,140,180,223,239,196,156,116,71,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,76,119,164,204,244,215,172,132,92,52,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,71,116,156,196,236,228,183,140,100,55,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,60,100,148,188,228,228,188,148,108,63,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,84,124,167,212,252,212,164,124,79,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,84,124,172,212,247,204,164,119,76,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,60,100,140,183,228,236,191,148,108,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,60,108,148,196,236,220,180,135,92,52,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,71,116,156,199,244,215,172,127,84,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,84,132,172,220,244,196,156,111,68,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,132,175,220,239,196,151,108,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,60,108,151,196,239,220,172,132,84,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,68,108,151,196,244,220,172,127,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,124,172,220,244,196,151,108,63,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,84,132,172,220,239,196,148,103,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,55,100,148,191,236,220,175,132,84,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,60,108,151,196,244,215,172,124,76,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,119,164,212,244,199,156,108,63,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,84,132,180,223,236,188,143,95,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,140,183,228,228,180,132,87,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,68,111,156,204,252,207,164,116,68,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,108,156,204,247,207,164,116,68,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,140,188,231,228,180,132,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,124,172,220,236,191,143,100,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,124,167,212,244,196,148,100,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,140,188,236,220,172,127,79,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,103,151,196,244,212,164,116,68,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,108,156,204,252,204,159,111,63,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,87,135,180,228,228,180,132,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,71,119,167,215,239,191,143,95,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,71,119,167,215,239,191,143,95,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,132,180,228,228,180,132,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,108,156,204,252,204,156,108,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,95,143,191,244,212,164,116,68,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,140,188,236,215,167,119,71,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,60,108,156,204,252,204,156,108,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,132,180,228,228,180,132,84,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,68,116,164,212,244,191,143,95,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,68,119,167,220,236,188,140,92,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,124,172,220,231,183,132,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,108,156,207,247,196,148,100,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,132,180,228,223,172,124,76,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,100,148,199,247,204,156,108,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,92,140,188,236,215,167,116,68,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,140,191,244,212,164,116,68,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,95,148,196,244,212,159,111,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,135,188,236,220,172,119,71,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,100,148,199,252,204,156,108,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,79,132,180,228,223,175,124,76,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,55,108,156,204,252,199,148,100,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,124,175,228,228,180,132,79,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,60,108,156,207,244,196,148,100,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,71,124,172,220,231,180,132,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,108,159,212,244,196,143,92,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,68,119,172,220,236,188,135,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,111,164,212,244,191,140,92,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,68,116,167,220,236,188,135,87,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,111,164,212,244,191,140,92,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,68,116,167,220,236,188,140,87,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,111,164,212,244,196,143,92,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,68,116,167,220,236,188,135,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,108,159,212,244,196,148,95,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,68,119,172,220,236,183,132,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,60,108,156,204,247,196,148,100,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,76,124,172,223,231,180,132,84,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,103,151,204,252,204,151,103,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,127,180,228,228,180,127,76,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,100,148,196,247,207,156,108,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,132,180,231,220,172,124,76,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,140,191,244,212,164,116,68,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,92,140,188,236,215,167,116,68,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,135,188,236,220,172,124,71,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,47,100,148,196,244,212,159,111,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,79,127,180,228,228,180,132,79,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,55,108,156,204,252,204,156,103,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,71,119,172,220,236,188,140,92,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,68,116,164,212,244,196,143,95,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,111,159,207,244,196,148,100,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,124,172,220,236,183,135,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,100,148,196,244,207,159,111,63,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,87,135,183,231,220,172,124,76,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,140,188,236,220,172,124,76,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,100,148,196,244,212,164,116,68,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,124,172,220,236,188,140,92,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,68,116,164,212,244,196,148,100,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,68,116,164,212,247,199,151,103,55,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,79,127,175,223,236,188,140,92,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,100,148,196,244,212,164,119,71,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,47,95,143,188,236,220,172,124,76,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,132,180,228,228,180,135,92,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,68,111,159,204,252,204,156,108,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,68,116,164,212,244,199,156,108,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,132,175,223,236,188,140,92,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,100,148,196,239,220,172,124,79,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,55,100,148,196,239,215,172,124,76,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,132,175,220,236,188,143,100,52,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,124,167,212,244,196,151,108,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,63,108,156,204,247,212,164,119,76,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,52,100,140,188,231,228,180,132,87,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,135,180,228,228,188,140,95,52,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,116,164,207,252,204,159,116,68,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,71,116,164,204,252,207,164,119,76,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,52,100,140,188,228,228,183,140,92,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,95,140,183,228,228,188,140,100,55,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,76,119,164,207,252,207,164,116,71,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,116,164,204,252,212,164,124,79,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,60,100,148,188,231,228,183,140,95,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,92,140,180,228,236,191,148,108,63,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,84,127,172,212,247,204,159,116,71,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,71,116,156,204,244,220,175,132,92,52,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,68,111,156,196,236,220,180,135,92,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,132,175,220,244,204,159,119,76,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,60,100,140,180,223,236,196,156,111,68,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,63,108,148,191,231,228,188,148,108,68,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,47,87,127,167,212,252,212,172,127,84,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,79,124,164,204,244,220,180,140,100,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,76,116,156,196,236,228,183,140,100,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,52,92,135,175,215,247,207,167,127,92,52,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,68,108,148,188,228,236,196,156,116,76,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,68,108,148,188,228,236,196,159,124,84,47,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,68,103,140,180,220,244,207,167,127,84,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,76,116,156,196,236,228,191,156,116,79,44,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,60,100,135,172,212,252,215,175,140,100,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,47,87,124,164,204,244,228,188,151,116,79,44,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,60,100,132,172,204,244,220,183,148,108,68,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,55,92,132,172,207,244,220,188,148,116,79,44,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,60,100,132,167,204,239,228,188,151,116,76,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,63,100,140,175,212,247,220,183,148,116,84,52,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,68,100,132,167,204,236,228,196,156,119,84,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,68,108,140,180,212,247,220,188,151,119,87,55,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,39,68,103,135,172,204,236,231,196,159,124,84,52,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,71,108,143,180,212,247,223,188,156,124,92,60,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,47,76,108,140,172,204,239,228,196,159,124,92,52,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,71,108,140,175,212,244,228,196,164,132,100,71,44,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,60,87,116,148,180,212,244,228,196,159,124,92,52,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,71,108,140,172,204,236,236,204,172,140,116,84,60,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,44,68,100,127,156,188,220,252,220,188,156,124,92,52,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,68,103,135,167,199,231,244,212,180,156,124,100,71,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,60,84,111,140,167,196,228,244,215,183,151,119,84,52,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,68,100,132,164,191,220,252,223,196,167,140,116,92,68,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,52,76,100,127,156,180,212,236,236,207,175,148,116,84,52,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,60,92,124,151,180,212,239,236,212,183,156,132,108,84,60,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,52,76,100,119,148,172,196,223,252,228,196,167,140,108,76,44,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,84,111,140,172,196,228,252,228,199,175,151,132,108,84,68,44,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,55,76,100,116,140,164,188,212,236,236,212,183,156,127,100,68,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,44,71,100,132,156,183,212,236,244,220,196,172,151,132,111,92,76,60,39,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,31,47,68,84,100,124,140,164,188,207,231,247,220,196,172,140,116,84,60,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,60,87,116,140,164,191,215,239,244,220,196,180,156,140,124,103,87,71,60,44,36,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,15,28,39,52,68,79,95,111,132,148,167,188,207,228,252,228,204,180,156,127,100,76,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,71,100,124,148,172,196,220,239,244,223,204,188,167,151,135,119,108,92,84,68,60,52,44,36,31,28,20,20,20,20,20,20,23,28,36,39,47,55,68,76,87,100,116,127,143,159,175,196,212,231,252,228,207,183,159,135,111,84,60,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,55,79,108,127,151,172,196,215,236,252,231,212,196,180,167,156,140,132,119,108,100,92,84,79,76,71,68,68,68,68,68,76,76,84,92,100,108,116,124,135,148,164,175,188,204,223,239,244,228,204,183,164,140,116,92,68,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,60,84,108,127,148,172,188,207,228,244,244,228,215,204,188,180,167,156,148,140,135,132,124,124,119,116,116,116,119,124,127,132,140,148,156,164,172,183,196,212,223,236,252,236,215,196,180,159,140,116,95,71,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,39,60,84,103,124,143,164,180,196,212,228,239,252,236,228,220,207,199,191,188,180,175,172,172,167,167,167,172,172,180,180,188,196,204,212,220,231,244,244,236,220,204,188,172,151,132,116,92,71,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,60,76,95,116,132,148,164,180,191,204,215,228,236,247,247,244,236,228,228,220,220,220,220,220,220,223,228,231,236,244,252,244,236,220,212,196,188,172,156,140,124,108,87,68,47,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,52,68,84,100,116,132,143,156,167,180,188,196,204,212,220,223,228,231,236,236,236,236,236,231,228,220,215,212,204,196,183,172,164,148,140,124,108,92,76,60,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,52,68,84,95,108,119,132,140,148,156,164,172,175,180,180,188,188,188,188,183,180,180,172,167,159,156,143,135,124,116,100,92,76,60,44,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,47,60,71,84,92,100,108,116,119,124,132,132,135,135,140,135,132,132,127,124,116,111,103,95,84,76,68,52,44,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,31,44,52,60,68,71,76,79,84,84,87,87,84,84,84,76,76,68,60,52,44,36,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,20,28,28,36,36,36,36,36,36,31,28,23,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};\n  const uint8_t FLARE_TEXTURE_4[16384] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,28,36,39,44,52,55,60,60,60,60,60,60,60,52,52,44,36,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,36,44,60,68,76,84,92,95,100,108,108,108,111,111,111,108,108,103,100,92,84,79,71,60,52,44,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,44,60,71,84,95,108,116,124,132,140,148,148,156,156,159,164,164,164,159,156,151,148,140,135,127,119,111,100,92,76,68,52,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,44,60,76,92,108,119,132,143,156,164,172,180,188,196,199,204,207,212,212,212,212,212,204,204,196,191,188,180,172,159,148,140,124,116,100,84,68,52,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,36,55,76,92,108,124,140,156,167,180,191,204,212,220,228,236,244,252,252,252,252,252,252,252,252,252,252,247,244,236,228,220,207,196,188,172,164,148,132,116,100,84,63,44,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,39,60,84,100,119,140,156,172,188,204,215,228,244,252,252,252,252,247,247,247,244,244,244,244,244,244,244,244,247,247,247,247,252,252,252,244,236,220,212,196,180,164,148,132,108,92,71,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,39,60,84,108,124,148,164,183,204,220,236,252,252,252,247,247,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,247,247,252,252,244,228,212,196,175,156,135,116,95,76,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,36,60,84,108,132,151,172,191,212,228,247,252,247,247,244,244,244,244,244,239,239,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,239,239,244,244,244,244,244,247,252,252,239,220,204,180,164,140,116,92,71,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,52,76,100,124,148,172,196,220,236,252,252,247,244,244,244,244,239,236,236,236,236,236,236,231,231,231,231,231,231,231,231,231,231,231,231,236,236,236,236,236,236,239,239,244,244,244,244,247,252,247,228,204,183,164,140,116,92,63,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,39,68,92,119,148,172,196,220,239,252,247,244,244,244,244,239,236,236,236,236,231,231,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,231,236,236,236,236,236,239,244,244,244,247,252,252,228,204,180,156,132,108,79,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,79,108,135,164,188,212,236,252,247,244,244,244,239,236,236,236,236,231,228,228,228,228,228,223,223,223,220,220,220,220,220,220,220,220,220,220,220,223,223,228,228,228,228,228,228,231,236,236,236,239,244,244,244,247,252,252,228,204,175,148,124,92,68,36,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,60,92,124,148,180,204,228,252,252,244,244,244,239,236,236,236,231,228,228,228,228,223,220,220,220,220,220,220,220,220,215,215,215,215,215,215,215,220,220,220,220,220,220,220,223,223,228,228,228,231,231,236,236,236,239,244,244,247,252,244,220,191,164,135,108,76,47,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,39,71,100,132,164,188,220,244,252,247,244,244,239,236,236,236,231,228,228,228,223,220,220,220,220,215,215,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,215,215,220,220,220,220,223,223,228,228,228,231,236,236,236,244,244,244,247,252,231,204,175,148,116,87,55,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,44,79,108,140,172,204,231,252,247,244,244,239,236,236,236,228,228,228,223,220,220,220,220,215,212,212,212,212,212,212,207,207,207,204,204,204,204,204,204,204,207,207,207,212,212,212,212,212,215,215,220,220,220,223,228,228,228,231,236,236,239,244,244,247,252,244,215,188,156,124,92,63,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,84,116,148,180,212,244,252,247,244,244,236,236,236,231,228,228,223,220,220,220,215,212,212,212,212,207,207,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,207,212,212,212,212,215,220,220,220,223,228,228,228,231,236,236,239,244,244,247,252,228,196,164,132,100,68,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,87,124,156,188,220,252,252,244,244,239,236,236,231,228,228,223,220,220,220,215,212,212,212,207,204,204,204,204,204,199,199,196,196,196,196,196,196,196,196,196,196,196,196,196,199,199,204,204,204,204,207,207,212,212,212,215,220,220,223,228,228,228,236,236,236,244,244,247,252,236,204,172,140,108,71,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,55,92,124,156,191,228,252,247,244,244,239,236,236,228,228,228,220,220,220,215,212,212,207,204,204,204,204,199,196,196,196,196,196,196,191,191,191,191,191,191,191,191,191,191,196,196,196,196,196,196,199,199,204,204,204,207,212,212,212,215,220,220,223,228,228,231,236,236,239,244,244,252,244,207,175,140,108,71,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,92,124,159,196,228,252,247,244,244,236,236,231,228,228,223,220,220,215,212,212,207,204,204,204,199,196,196,196,196,191,191,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,191,196,196,196,196,199,204,204,204,207,212,212,212,215,220,220,223,228,228,236,236,239,244,244,252,244,212,180,143,108,71,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,52,87,124,159,196,228,252,247,244,239,236,236,231,228,228,220,220,215,212,212,207,204,204,204,199,196,196,196,191,188,188,188,188,188,183,183,180,180,180,180,180,180,180,180,180,180,183,183,188,188,188,188,188,191,196,196,196,196,199,204,204,207,212,212,215,220,220,223,228,228,231,236,239,244,244,247,247,212,180,140,108,68,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,44,84,124,156,196,228,252,247,244,239,236,236,228,228,223,220,220,215,212,212,207,204,204,199,196,196,196,191,188,188,188,183,183,180,180,180,180,180,180,175,175,175,175,175,175,180,180,180,180,180,180,180,183,188,188,188,188,191,196,196,196,199,204,204,207,212,212,215,220,220,228,228,231,236,236,244,244,247,247,212,175,140,103,68,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,79,116,156,191,228,252,247,244,239,236,236,228,228,223,220,220,212,212,207,204,204,199,196,196,196,188,188,188,183,180,180,180,180,175,175,172,172,172,172,172,172,172,172,172,172,172,172,172,172,175,175,180,180,180,180,183,188,188,188,191,196,196,199,204,204,204,212,212,215,220,220,223,228,231,236,236,244,244,247,247,212,172,135,100,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,71,108,148,188,228,252,247,244,239,236,231,228,228,220,220,215,212,212,207,204,204,196,196,196,188,188,188,183,180,180,180,175,172,172,172,172,172,167,167,167,164,164,164,164,164,164,167,167,167,172,172,172,172,172,175,180,180,180,183,188,188,188,191,196,196,199,204,204,207,212,212,220,220,223,228,231,236,236,244,244,252,244,204,167,132,92,52,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,60,100,140,180,220,252,247,244,239,236,231,228,228,220,220,215,212,212,204,204,199,196,196,191,188,188,183,180,180,180,175,172,172,172,167,167,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,167,172,172,172,172,175,180,180,183,188,188,188,196,196,196,204,204,207,212,212,220,220,223,228,231,236,236,244,244,252,236,199,164,124,84,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,52,92,132,172,212,252,247,244,239,236,236,228,228,220,220,215,212,207,204,204,199,196,196,188,188,183,180,180,180,175,172,172,172,167,164,164,164,164,159,159,156,156,156,156,156,156,156,156,156,156,156,159,159,164,164,164,164,167,172,172,172,175,180,180,183,188,188,191,196,196,199,204,207,212,212,220,220,223,228,231,236,236,244,244,252,231,191,151,111,71,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,79,124,164,204,244,252,244,244,236,236,228,228,220,220,215,212,207,204,204,196,196,191,188,188,183,180,180,175,172,172,167,164,164,164,159,159,156,156,156,156,156,151,151,151,151,151,151,151,151,156,156,156,156,156,156,159,164,164,164,167,172,172,172,175,180,180,183,188,188,196,196,199,204,204,212,212,220,220,223,228,231,236,239,244,247,252,220,180,140,100,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,68,108,148,188,231,252,244,244,236,236,228,228,220,220,215,212,207,204,204,196,196,191,188,188,180,180,175,172,172,167,164,164,164,159,156,156,156,151,151,148,148,148,148,148,148,148,148,148,148,148,148,148,148,151,151,156,156,156,156,159,164,164,167,172,172,175,180,180,183,188,188,196,196,199,204,204,212,212,220,220,223,228,231,236,239,244,247,252,212,172,132,87,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,52,92,135,180,220,252,247,244,239,236,231,228,223,220,215,212,207,204,204,196,196,188,188,183,180,180,175,172,172,164,164,164,159,156,156,156,151,148,148,148,148,143,143,140,140,140,140,140,140,140,140,143,143,148,148,148,148,148,151,156,156,156,159,164,164,167,172,172,175,180,180,188,188,191,196,199,204,204,212,212,220,220,228,228,236,236,244,244,252,239,196,156,116,71,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,76,119,164,204,244,247,244,239,236,231,228,223,220,215,212,207,204,204,196,196,188,188,183,180,180,172,172,167,164,164,159,156,156,151,148,148,148,148,143,140,140,140,140,140,140,135,135,135,135,140,140,140,140,140,140,140,143,148,148,148,151,156,156,156,164,164,164,172,172,175,180,180,188,188,191,196,199,204,204,212,212,220,220,228,228,236,236,244,244,252,228,183,140,100,55,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,60,100,148,188,228,252,244,244,236,236,228,228,220,220,212,212,204,204,196,196,188,188,183,180,175,172,172,167,164,164,156,156,156,148,148,148,143,140,140,140,140,135,132,132,132,132,132,132,132,132,132,132,132,132,135,135,140,140,140,143,148,148,148,151,156,156,159,164,164,167,172,175,180,180,188,188,191,196,199,204,207,212,215,220,223,228,231,236,239,244,247,252,212,164,124,79,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,84,124,172,212,252,247,244,236,236,228,228,220,220,212,212,204,204,196,196,188,188,183,180,175,172,172,164,164,159,156,156,151,148,148,143,140,140,140,135,132,132,132,132,127,127,127,124,124,124,124,127,127,127,132,132,132,132,132,135,140,140,140,148,148,148,156,156,156,164,164,167,172,172,180,180,188,188,191,196,199,204,207,212,215,220,223,228,231,236,239,244,252,236,191,148,108,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,60,108,148,196,236,252,244,239,236,231,228,223,220,215,212,207,204,199,196,191,188,183,180,175,172,172,164,164,159,156,156,148,148,143,140,140,140,135,132,132,132,127,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,127,132,132,132,135,140,140,143,148,148,151,156,156,164,164,167,172,172,180,180,188,188,196,196,204,204,212,212,220,220,228,228,236,236,244,244,252,215,172,127,84,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,84,132,172,220,252,244,244,236,236,228,228,220,215,212,207,204,199,196,191,188,183,180,175,172,172,164,164,159,156,151,148,148,143,140,140,135,132,132,127,124,124,124,124,119,119,116,116,116,116,116,116,116,116,116,119,119,124,124,124,127,132,132,132,135,140,140,143,148,151,156,156,159,164,167,172,175,180,180,188,188,196,196,204,204,212,212,220,220,228,231,236,239,244,247,239,196,151,108,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,60,108,151,196,239,247,244,239,236,231,228,220,220,212,212,204,204,196,196,188,188,180,180,172,172,164,164,156,156,151,148,148,140,140,135,132,132,127,124,124,124,119,116,116,116,116,116,111,111,111,111,111,111,111,116,116,116,116,119,119,124,124,127,132,132,135,140,140,143,148,148,156,156,159,164,167,172,175,180,183,188,191,196,199,204,207,212,215,220,223,228,236,236,244,244,252,220,172,127,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,124,172,220,252,244,244,236,236,228,223,220,215,212,207,204,196,196,188,188,180,180,172,172,164,164,159,156,151,148,148,140,140,135,132,132,124,124,124,119,116,116,116,111,108,108,108,108,108,108,108,108,108,108,108,108,111,111,116,116,116,119,124,124,127,132,132,140,140,143,148,148,156,156,159,164,167,172,175,180,183,188,191,196,199,204,212,212,220,220,228,228,236,239,244,247,239,196,148,103,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,55,100,148,191,236,247,244,239,236,228,228,220,220,212,207,204,199,196,191,188,183,180,175,172,167,164,159,156,151,148,143,140,140,132,132,127,124,124,119,116,116,111,108,108,108,108,103,103,100,100,100,100,100,100,103,103,108,108,108,108,111,116,116,116,124,124,124,132,132,135,140,143,148,148,156,156,164,164,172,172,180,180,188,188,196,196,204,204,212,215,220,223,228,236,236,244,244,252,215,172,124,76,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,119,164,212,252,244,244,236,236,228,223,220,215,212,204,204,196,196,188,183,180,175,172,167,164,159,156,151,148,148,140,140,132,132,127,124,124,116,116,116,108,108,108,103,100,100,100,100,100,100,95,95,95,100,100,100,100,100,103,108,108,108,111,116,116,119,124,124,132,132,135,140,143,148,148,156,156,164,164,172,172,180,180,188,191,196,199,204,207,212,220,220,228,228,236,239,244,252,236,188,143,95,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,140,183,228,252,244,239,236,231,228,220,220,212,207,204,199,196,188,188,180,180,172,172,164,164,156,156,148,148,140,140,132,132,127,124,119,116,116,111,108,108,103,100,100,100,95,92,92,92,92,92,92,92,92,92,92,95,100,100,100,100,108,108,108,116,116,119,124,124,132,132,135,140,143,148,151,156,159,164,167,172,175,180,183,188,196,196,204,204,212,215,220,223,228,236,236,244,247,252,207,164,116,68,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,108,156,204,247,247,244,236,236,228,223,220,215,212,204,204,196,196,188,183,180,175,172,164,164,156,156,148,148,140,140,132,132,127,124,119,116,116,108,108,103,100,100,100,95,92,92,92,87,87,87,84,84,84,87,87,92,92,92,92,95,100,100,103,108,108,111,116,116,124,124,132,132,135,140,143,148,151,156,159,164,172,172,180,180,188,188,196,199,204,207,212,220,220,228,231,236,239,244,252,228,180,132,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,124,172,220,252,244,244,236,231,228,220,220,212,207,204,199,196,188,188,180,180,172,167,164,159,156,151,148,143,140,135,132,127,124,119,116,116,108,108,103,100,100,95,92,92,87,84,84,84,84,84,84,84,84,84,84,84,84,87,92,92,92,95,100,100,108,108,111,116,116,124,124,132,132,140,140,148,148,156,156,164,164,172,175,180,183,188,196,196,204,204,212,215,220,223,228,236,236,244,247,244,196,148,100,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,140,188,236,247,244,239,236,228,228,220,215,212,204,204,196,196,188,183,180,175,172,164,164,156,156,148,143,140,135,132,127,124,119,116,116,108,108,100,100,95,92,92,87,84,84,84,79,79,76,76,76,76,76,76,76,79,84,84,84,87,92,92,95,100,100,103,108,111,116,116,124,124,132,132,140,140,148,151,156,159,164,167,172,180,180,188,188,196,199,204,212,212,220,223,228,231,236,244,244,252,212,164,116,68,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,108,156,204,252,247,244,236,236,228,223,220,212,212,204,199,196,191,188,180,180,172,167,164,159,156,148,148,140,140,132,132,124,124,116,116,108,108,100,100,95,92,92,84,84,84,79,76,76,76,76,71,71,71,71,71,76,76,76,76,79,84,84,87,92,92,100,100,103,108,111,116,119,124,127,132,135,140,143,148,156,156,164,164,172,175,180,183,188,196,196,204,207,212,215,220,228,228,236,239,244,252,228,180,132,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,71,119,167,215,252,244,244,236,231,228,220,220,212,207,204,196,196,188,183,180,175,172,164,164,156,151,148,143,140,135,132,124,124,116,116,108,108,100,100,95,92,87,84,84,79,76,76,71,71,68,68,68,68,68,68,68,68,68,71,76,76,76,84,84,87,92,92,100,100,103,108,111,116,119,124,127,132,140,140,148,148,156,159,164,167,172,180,180,188,191,196,204,204,212,215,220,223,228,236,236,244,247,239,191,143,95,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,132,180,228,252,244,239,236,228,228,220,215,212,204,204,196,191,188,180,180,172,172,164,159,156,148,148,140,140,132,127,124,119,116,111,108,103,100,95,92,87,84,84,76,76,76,68,68,68,63,63,60,60,60,60,60,63,68,68,68,71,76,76,79,84,84,92,92,100,100,108,108,116,116,124,124,132,135,140,143,148,156,156,164,164,172,175,180,188,188,196,199,204,207,212,220,223,228,231,236,244,247,252,204,156,108,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,95,143,191,244,247,244,236,236,228,223,220,212,212,204,199,196,188,188,180,175,172,167,164,156,156,148,143,140,135,132,124,124,116,116,108,103,100,95,92,87,84,84,76,76,71,68,68,63,60,60,60,60,55,55,60,60,60,60,60,63,68,68,76,76,79,84,84,92,92,100,100,108,111,116,119,124,127,132,140,140,148,151,156,159,164,172,172,180,183,188,196,196,204,207,212,215,220,228,231,236,244,244,252,215,167,119,71,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,60,108,156,204,252,247,244,236,231,228,220,220,212,207,204,196,196,188,183,180,172,172,164,159,156,151,148,140,140,132,127,124,119,116,108,108,100,100,92,92,84,84,76,76,71,68,63,60,60,60,55,52,52,52,52,52,52,52,55,60,60,63,68,68,71,76,79,84,87,92,95,100,103,108,111,116,124,124,132,135,140,143,148,156,156,164,167,172,180,180,188,191,196,204,204,212,215,220,228,228,236,239,244,252,228,180,132,84,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,68,116,164,212,252,244,244,236,231,228,220,215,212,207,204,196,191,188,183,180,172,167,164,159,156,148,148,140,135,132,124,124,116,111,108,103,100,95,92,84,84,76,76,71,68,63,60,60,55,52,52,47,47,47,44,47,47,52,52,52,55,60,60,68,68,71,76,79,84,87,92,100,100,108,108,116,119,124,127,132,140,140,148,151,156,164,164,172,175,180,188,188,196,199,204,212,212,220,223,228,236,236,244,247,236,188,140,92,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,124,172,220,252,244,239,236,228,228,220,215,212,204,204,196,191,188,180,175,172,167,164,156,151,148,143,140,132,132,124,119,116,108,108,100,100,92,87,84,79,76,71,68,63,60,55,52,52,47,44,44,44,44,44,44,44,44,47,52,52,55,60,60,68,68,76,76,84,84,92,95,100,103,108,116,116,124,124,132,135,140,148,148,156,159,164,172,172,180,183,188,196,196,204,207,212,220,223,228,231,236,244,247,247,196,148,100,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,132,180,228,252,244,239,236,228,223,220,212,212,204,199,196,188,188,180,175,172,164,164,156,151,148,140,140,132,127,124,116,116,108,103,100,95,92,84,84,76,76,68,63,60,55,52,52,44,44,44,39,36,36,36,36,36,39,44,44,47,52,55,60,60,68,68,76,79,84,87,92,100,100,108,111,116,119,124,132,132,140,143,148,156,156,164,167,172,180,183,188,191,196,204,207,212,220,220,228,231,236,244,244,252,204,156,108,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,92,140,188,236,247,244,236,236,228,223,220,212,212,204,199,196,188,183,180,172,172,164,159,156,148,148,140,135,132,124,124,116,111,108,100,100,92,87,84,79,76,68,68,60,60,52,52,44,44,39,36,36,36,31,31,31,36,36,36,44,44,47,52,55,60,63,68,71,76,84,84,92,95,100,103,108,116,119,124,127,132,140,143,148,151,156,164,167,172,180,180,188,191,196,204,204,212,215,220,228,231,236,244,244,252,212,164,116,68,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,95,148,196,244,247,244,236,231,228,223,220,212,207,204,196,196,188,183,180,172,167,164,159,156,148,143,140,132,132,124,119,116,108,108,100,95,92,84,84,76,71,68,63,60,55,52,44,44,39,36,31,28,28,28,28,28,28,31,36,36,44,44,47,52,60,60,68,68,76,79,84,92,92,100,103,108,111,116,124,127,132,140,140,148,151,156,164,164,172,175,180,188,191,196,199,204,212,215,220,228,228,236,239,244,252,220,172,119,71,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,100,148,199,252,247,244,236,231,228,220,220,212,207,204,196,191,188,180,180,172,167,164,156,156,148,143,140,132,127,124,119,116,108,103,100,92,92,84,79,76,71,68,60,60,52,47,44,39,36,31,28,28,23,20,20,20,23,28,28,36,36,44,44,52,52,60,63,68,76,76,84,87,92,100,100,108,111,116,124,124,132,135,140,148,148,156,159,164,172,175,180,188,188,196,199,204,212,215,220,223,228,236,239,244,252,223,175,124,76,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,55,108,156,204,252,244,244,236,231,228,220,220,212,207,204,196,191,188,180,180,172,167,164,156,151,148,140,140,132,127,124,116,116,108,103,100,92,87,84,79,76,68,63,60,55,52,44,44,36,31,28,28,20,20,20,20,20,20,23,28,28,36,39,44,47,52,60,60,68,71,76,84,84,92,95,100,108,108,116,119,124,132,135,140,148,148,156,159,164,172,172,180,183,188,196,199,204,212,212,220,223,228,236,239,244,252,228,180,132,79,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,60,108,156,207,252,244,244,236,231,228,220,215,212,204,204,196,191,188,180,175,172,164,164,156,151,148,140,140,132,127,124,116,111,108,100,100,92,87,84,76,76,68,63,60,52,47,44,39,36,28,28,20,20,12,12,12,12,15,20,23,28,31,36,44,44,52,55,60,68,68,76,79,84,92,95,100,108,108,116,119,124,132,132,140,143,148,156,159,164,172,172,180,183,188,196,199,204,212,212,220,223,228,236,239,244,247,231,180,132,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,108,159,212,252,244,244,236,231,228,220,215,212,204,204,196,191,188,180,175,172,164,164,156,151,148,140,135,132,124,124,116,111,108,100,100,92,87,84,76,71,68,60,60,52,47,44,36,36,28,23,20,12,12,7,7,12,12,20,20,28,28,36,39,44,52,55,60,63,68,76,79,84,92,92,100,103,108,116,119,124,132,132,140,143,148,156,159,164,172,172,180,183,188,196,196,204,207,212,220,223,228,236,236,244,247,236,188,135,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,111,164,212,252,244,244,236,231,228,220,215,212,204,204,196,191,188,180,175,172,164,164,156,151,148,140,135,132,124,124,116,111,108,100,95,92,84,84,76,71,68,60,55,52,47,44,36,31,28,20,20,12,7,0,0,0,12,15,20,23,28,36,39,44,52,52,60,63,68,76,79,84,92,92,100,103,108,116,119,124,132,132,140,143,148,156,156,164,167,172,180,183,188,196,196,204,207,212,220,223,228,236,236,244,247,236,188,135,87,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,111,164,212,252,244,244,236,231,228,220,215,212,204,204,196,191,188,180,175,172,164,164,156,151,148,140,135,132,124,124,116,111,108,100,95,92,84,84,76,71,68,60,55,52,44,44,36,31,28,20,20,12,7,0,0,0,12,12,20,23,28,36,39,44,52,52,60,63,68,76,79,84,92,92,100,103,108,116,119,124,132,132,140,143,148,156,156,164,167,172,180,183,188,196,196,204,207,212,220,223,228,236,236,244,247,236,188,140,87,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,111,164,212,252,244,244,236,231,228,220,215,212,204,204,196,191,188,180,175,172,164,164,156,151,148,140,135,132,124,124,116,111,108,100,95,92,84,84,76,71,68,60,60,52,47,44,36,31,28,20,20,12,12,0,0,7,12,15,20,28,28,36,39,44,52,52,60,63,68,76,79,84,92,92,100,103,108,116,119,124,132,132,140,143,148,156,159,164,167,172,180,183,188,196,196,204,207,212,220,223,228,236,236,244,247,236,188,135,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,108,159,212,252,244,244,236,231,228,220,215,212,204,204,196,191,188,180,175,172,164,164,156,151,148,140,140,132,127,124,116,111,108,100,100,92,87,84,76,71,68,60,60,52,47,44,36,36,28,23,20,15,12,12,12,12,12,20,20,28,31,36,44,44,52,55,60,68,68,76,79,84,92,92,100,103,108,116,119,124,132,132,140,143,148,156,159,164,172,172,180,183,188,196,199,204,212,212,220,223,228,236,236,244,247,236,183,132,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,60,108,156,204,252,244,244,236,231,228,220,215,212,204,204,196,191,188,180,180,172,167,164,156,151,148,140,140,132,127,124,116,111,108,103,100,92,87,84,76,76,68,63,60,52,52,44,39,36,31,28,23,20,20,15,12,15,20,20,28,28,36,36,44,47,52,55,60,68,71,76,84,84,92,95,100,108,108,116,119,124,132,135,140,143,148,156,159,164,172,172,180,183,188,196,199,204,212,212,220,223,228,236,239,244,252,231,180,132,84,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,103,151,204,252,247,244,236,231,228,220,220,212,207,204,196,191,188,180,180,172,167,164,156,156,148,143,140,132,127,124,116,116,108,103,100,92,92,84,79,76,68,68,60,55,52,47,44,36,36,28,28,23,20,20,20,20,20,28,28,31,36,39,44,52,52,60,63,68,71,76,84,84,92,95,100,108,111,116,124,124,132,135,140,148,148,156,159,164,172,175,180,188,188,196,199,204,212,212,220,223,228,236,239,244,252,228,180,127,76,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,100,148,196,247,247,244,236,231,228,220,220,212,207,204,196,196,188,183,180,172,167,164,156,156,148,143,140,132,132,124,119,116,108,108,100,95,92,84,84,76,71,68,60,60,52,52,44,44,36,36,28,28,28,23,23,28,28,28,31,36,39,44,47,52,55,60,68,68,76,76,84,87,92,100,100,108,111,116,124,124,132,135,140,148,151,156,164,164,172,175,180,188,188,196,199,204,212,215,220,228,228,236,239,244,252,220,172,124,76,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,140,191,244,247,244,236,236,228,223,220,212,207,204,196,196,188,183,180,172,172,164,159,156,148,148,140,135,132,124,119,116,111,108,100,100,92,87,84,76,76,68,63,60,55,52,47,44,44,36,36,31,28,28,28,28,31,36,36,39,44,44,52,52,60,60,68,71,76,79,84,92,92,100,103,108,116,116,124,127,132,140,140,148,151,156,164,164,172,175,180,188,191,196,204,204,212,215,220,228,228,236,239,244,252,215,167,116,68,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,135,188,236,247,244,236,236,228,223,220,212,212,204,199,196,188,188,180,175,172,164,159,156,151,148,140,135,132,124,124,116,111,108,103,100,92,92,84,79,76,71,68,63,60,55,52,47,44,44,39,36,36,36,36,36,36,36,39,44,44,52,52,60,60,68,68,76,76,84,87,92,95,100,108,108,116,119,124,132,132,140,143,148,156,156,164,167,172,180,180,188,191,196,204,207,212,215,220,228,231,236,244,244,252,212,159,111,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,79,127,180,228,252,244,239,236,228,228,220,215,212,204,199,196,188,188,180,175,172,164,164,156,151,148,140,140,132,127,124,119,116,108,108,100,95,92,87,84,76,76,68,68,60,60,55,52,47,44,44,44,39,39,39,39,44,44,44,47,52,52,55,60,63,68,71,76,79,84,92,92,100,100,108,111,116,124,124,132,135,140,148,148,156,159,164,172,172,180,183,188,196,196,204,207,212,220,220,228,231,236,244,247,252,204,156,103,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,71,119,172,220,252,244,239,236,228,228,220,215,212,204,204,196,191,188,180,180,172,167,164,156,156,148,143,140,132,132,124,119,116,111,108,100,100,92,92,84,84,76,76,68,68,60,60,55,52,52,47,44,44,44,44,44,44,47,52,52,52,60,60,63,68,71,76,79,84,87,92,95,100,108,108,116,116,124,127,132,140,140,148,151,156,159,164,172,175,180,183,188,196,199,204,212,212,220,223,228,236,236,244,247,244,196,143,95,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,111,159,207,252,244,244,236,231,228,220,220,212,207,204,196,196,188,183,180,172,172,164,159,156,148,148,140,135,132,127,124,116,116,108,108,100,95,92,87,84,79,76,71,68,68,60,60,60,52,52,52,52,52,52,52,52,52,52,55,60,60,63,68,68,76,76,84,84,92,92,100,100,108,111,116,119,124,132,132,140,143,148,151,156,164,167,172,175,180,188,188,196,199,204,212,215,220,223,228,236,239,244,252,236,183,135,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,100,148,196,244,247,244,236,236,228,223,220,212,212,204,199,196,188,188,180,175,172,164,164,156,151,148,143,140,132,132,124,119,116,111,108,103,100,95,92,87,84,79,76,71,68,68,63,60,60,60,55,55,52,52,52,55,55,60,60,60,68,68,71,76,76,84,84,92,92,100,100,108,108,116,116,124,127,132,135,140,148,148,156,159,164,167,172,180,180,188,191,196,204,204,212,215,220,228,228,236,239,244,252,220,172,124,76,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,140,188,236,247,244,239,236,228,223,220,215,212,204,199,196,191,188,180,180,172,167,164,156,156,148,148,140,135,132,127,124,116,116,108,108,100,100,92,92,84,84,79,76,76,68,68,68,63,60,60,60,60,60,60,60,60,63,68,68,68,71,76,76,84,84,87,92,95,100,103,108,111,116,119,124,132,132,140,140,148,151,156,164,164,172,175,180,183,188,196,196,204,207,212,220,220,228,231,236,244,244,252,212,164,116,68,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,124,172,220,252,244,239,236,228,228,220,215,212,207,204,196,196,188,183,180,172,172,164,159,156,151,148,140,140,132,132,124,124,116,116,108,108,100,100,92,92,84,84,79,76,76,71,68,68,68,68,63,63,63,63,68,68,68,68,71,76,76,79,84,84,87,92,95,100,103,108,111,116,119,124,127,132,135,140,148,148,156,156,164,167,172,175,180,188,188,196,199,204,212,212,220,223,228,236,236,244,247,244,196,148,100,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,68,116,164,212,252,244,244,236,231,228,223,220,212,207,204,199,196,188,188,180,175,172,167,164,156,156,148,148,140,135,132,127,124,119,116,111,108,103,100,100,92,92,87,84,84,79,76,76,76,71,68,68,68,68,68,68,71,71,76,76,76,79,84,84,92,92,95,100,100,108,108,116,116,124,124,132,132,140,143,148,151,156,159,164,172,172,180,183,188,191,196,204,204,212,215,220,228,228,236,239,244,252,236,188,140,92,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,100,148,196,244,247,244,236,236,228,223,220,215,212,204,204,196,191,188,183,180,172,172,164,159,156,151,148,143,140,135,132,124,124,119,116,111,108,103,100,100,92,92,87,84,84,84,79,76,76,76,76,76,76,76,76,76,76,76,79,84,84,87,92,92,95,100,100,108,108,116,116,124,124,132,132,140,140,148,148,156,156,164,167,172,175,180,188,188,196,199,204,207,212,220,220,228,231,236,244,244,252,220,172,124,76,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,132,180,228,252,244,239,236,231,228,220,220,212,207,204,196,196,188,188,180,175,172,167,164,156,156,148,148,140,140,132,132,124,124,116,116,111,108,103,100,100,95,92,92,87,84,84,84,84,79,79,79,79,79,79,84,84,84,84,87,92,92,92,100,100,103,108,108,116,116,119,124,127,132,135,140,143,148,151,156,164,164,172,172,180,180,188,191,196,204,204,212,212,220,223,228,236,236,244,247,252,204,156,108,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,68,116,164,212,252,244,244,236,231,228,223,220,212,212,204,199,196,191,188,183,180,172,172,164,164,156,156,148,143,140,140,132,132,124,124,116,116,111,108,108,100,100,100,95,92,92,92,87,84,84,84,84,84,84,84,84,84,87,92,92,92,95,100,100,103,108,108,116,116,119,124,127,132,135,140,140,148,151,156,159,164,167,172,175,180,188,188,196,196,204,207,212,215,220,228,228,236,239,244,252,236,188,140,92,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,100,148,196,239,247,244,239,236,228,228,220,215,212,207,204,196,196,188,188,180,175,172,167,164,159,156,151,148,143,140,135,132,132,124,124,116,116,111,108,108,103,100,100,100,95,92,92,92,92,92,92,92,92,92,92,92,92,92,95,100,100,100,108,108,111,116,116,119,124,127,132,132,140,140,148,148,156,156,164,164,172,172,180,183,188,191,196,199,204,212,212,220,223,228,231,236,244,244,252,215,172,124,76,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,132,175,220,252,244,244,236,231,228,223,220,212,212,204,199,196,191,188,183,180,175,172,164,164,156,156,151,148,143,140,135,132,132,124,124,119,116,116,111,108,108,103,100,100,100,100,95,95,92,92,92,92,92,95,95,100,100,100,100,108,108,108,111,116,116,124,124,127,132,132,140,140,148,148,151,156,159,164,167,172,180,180,188,188,196,196,204,207,212,215,220,228,228,236,236,244,247,244,196,151,108,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,63,108,156,204,247,247,244,236,236,228,228,220,215,212,207,204,199,196,188,188,180,180,172,172,164,164,156,156,148,148,143,140,135,132,132,124,124,119,116,116,111,108,108,108,103,103,100,100,100,100,100,100,100,100,100,100,100,103,108,108,108,111,116,116,119,124,124,127,132,132,140,140,143,148,151,156,159,164,167,172,175,180,183,188,191,196,204,204,212,212,220,223,228,231,236,244,244,252,228,180,132,87,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,135,180,228,252,244,239,236,231,228,223,220,212,212,204,204,196,196,188,183,180,175,172,167,164,164,156,156,148,148,143,140,135,132,132,127,124,124,119,116,116,116,111,108,108,108,108,108,103,103,103,103,103,108,108,108,108,108,111,116,116,116,119,124,124,132,132,135,140,140,143,148,151,156,159,164,164,172,172,180,180,188,191,196,199,204,207,212,215,220,228,228,236,236,244,247,252,204,159,116,68,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,71,116,164,204,252,247,244,236,236,228,228,220,215,212,207,204,199,196,191,188,183,180,175,172,167,164,159,156,156,148,148,143,140,140,132,132,127,124,124,124,119,116,116,116,111,111,108,108,108,108,108,108,108,108,111,111,116,116,116,116,119,124,124,127,132,132,135,140,140,148,148,151,156,159,164,164,172,172,180,180,188,188,196,196,204,204,212,212,220,223,228,231,236,239,244,252,228,183,140,92,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,95,140,183,228,252,244,244,236,231,228,223,220,215,212,204,204,196,196,188,188,180,180,175,172,167,164,159,156,156,148,148,143,140,140,135,132,132,127,124,124,124,119,119,116,116,116,116,116,116,116,116,116,116,116,116,116,119,124,124,124,127,132,132,132,140,140,140,148,148,151,156,159,164,164,172,172,180,180,183,188,191,196,199,204,212,212,220,220,228,228,236,236,244,247,252,207,164,116,71,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,116,164,204,252,247,244,239,236,228,228,220,220,212,212,204,204,196,196,188,188,180,180,172,172,167,164,159,156,156,151,148,148,140,140,140,135,132,132,127,124,124,124,124,124,119,119,119,119,119,119,119,119,124,124,124,124,124,127,132,132,132,135,140,140,143,148,148,151,156,159,164,164,172,172,175,180,183,188,191,196,199,204,207,212,215,220,223,228,231,236,244,244,252,228,183,140,95,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,92,140,180,228,252,244,244,236,236,228,223,220,215,212,207,204,199,196,196,188,188,180,180,172,172,167,164,164,156,156,151,148,148,143,140,140,140,135,132,132,132,127,127,124,124,124,124,124,124,124,124,124,124,124,127,132,132,132,132,135,140,140,143,148,148,151,156,156,159,164,164,172,172,175,180,183,188,191,196,196,204,204,212,212,220,220,228,231,236,239,244,247,247,204,159,116,71,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,71,116,156,204,244,247,244,239,236,231,228,223,220,215,212,207,204,199,196,191,188,188,180,180,175,172,167,164,164,159,156,156,151,148,148,143,140,140,140,135,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,135,140,140,140,140,148,148,148,151,156,156,159,164,164,172,172,175,180,183,188,188,196,196,204,204,212,212,220,220,228,228,236,236,244,244,252,220,180,135,92,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,132,175,220,252,247,244,236,236,228,228,220,220,212,212,207,204,199,196,191,188,188,180,180,175,172,172,164,164,159,156,156,156,148,148,148,143,140,140,140,140,140,135,135,132,132,132,132,132,132,135,135,135,140,140,140,140,143,148,148,148,151,156,156,159,164,164,167,172,172,180,180,183,188,188,196,196,204,204,212,212,215,220,223,228,231,236,239,244,252,236,196,156,111,68,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,63,108,148,191,231,252,244,244,236,236,228,228,220,220,212,212,204,204,199,196,191,188,188,180,180,175,172,172,167,164,164,159,156,156,156,151,148,148,148,143,143,140,140,140,140,140,140,140,140,140,140,140,140,140,143,148,148,148,148,151,156,156,156,164,164,164,167,172,172,180,180,183,188,188,196,196,204,204,207,212,215,220,223,228,231,236,239,244,247,252,212,172,127,84,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,79,124,164,204,244,247,244,239,236,231,228,223,220,220,212,212,204,204,199,196,191,188,188,183,180,180,172,172,172,164,164,164,159,156,156,156,151,148,148,148,148,148,148,143,143,143,143,143,143,143,148,148,148,148,148,151,151,156,156,156,159,164,164,167,172,172,175,180,180,183,188,191,196,196,204,204,207,212,215,220,223,228,228,236,236,244,244,252,228,183,140,100,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,52,92,135,175,215,252,247,244,239,236,231,228,223,220,220,212,212,204,204,199,196,196,188,188,183,180,180,175,172,172,167,164,164,164,159,156,156,156,156,151,151,148,148,148,148,148,148,148,148,148,148,151,151,156,156,156,156,159,164,164,164,167,172,172,172,180,180,180,188,188,191,196,196,204,204,207,212,215,220,220,228,228,236,236,244,244,252,236,196,156,116,76,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,68,108,148,188,228,252,244,244,239,236,231,228,223,220,220,212,212,204,204,199,196,196,191,188,188,180,180,180,175,172,172,167,164,164,164,164,159,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,159,159,164,164,164,167,172,172,172,175,180,180,183,188,188,191,196,196,204,204,207,212,215,220,220,228,228,236,236,239,244,247,244,207,167,127,84,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,76,116,156,196,236,252,244,244,236,236,231,228,223,220,220,212,212,207,204,204,196,196,191,188,188,183,180,180,180,175,172,172,172,167,164,164,164,164,164,159,159,159,159,156,156,159,159,159,159,164,164,164,164,164,167,167,172,172,172,175,180,180,183,188,188,191,196,196,199,204,204,212,212,215,220,220,228,228,236,236,239,244,247,252,215,175,140,100,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,47,87,124,164,204,244,252,244,244,236,236,231,228,223,220,220,212,212,207,204,204,199,196,196,191,188,188,183,180,180,180,175,172,172,172,172,167,167,164,164,164,164,164,164,164,164,164,164,164,164,164,167,172,172,172,172,175,175,180,180,180,188,188,188,191,196,196,199,204,204,212,212,215,220,220,228,228,231,236,239,244,247,252,220,183,148,108,68,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,55,92,132,172,207,244,247,244,244,236,236,231,228,223,220,220,215,212,212,204,204,199,196,196,196,188,188,188,183,180,180,180,180,175,172,172,172,172,172,172,172,172,167,167,167,172,172,172,172,172,172,172,175,175,180,180,180,183,188,188,188,191,196,196,199,204,204,207,212,212,215,220,223,228,228,236,236,239,244,247,252,228,188,151,116,76,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,63,100,140,175,212,247,247,244,244,236,236,231,228,228,220,220,215,212,212,207,204,204,199,196,196,196,188,188,188,188,183,180,180,180,180,180,175,175,172,172,172,172,172,172,172,172,175,175,175,180,180,180,180,180,183,188,188,188,191,196,196,196,204,204,204,212,212,212,220,220,223,228,228,236,236,239,244,247,252,228,196,156,119,84,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,68,108,140,180,212,247,247,244,244,236,236,231,228,228,223,220,220,212,212,212,204,204,204,199,196,196,196,191,188,188,188,188,183,183,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,183,183,188,188,188,188,191,196,196,196,199,204,204,207,212,212,215,220,220,223,228,228,236,236,239,244,247,252,231,196,159,124,84,52,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,71,108,143,180,212,247,252,244,244,239,236,236,228,228,223,220,220,215,212,212,207,204,204,204,199,196,196,196,196,191,188,188,188,188,188,188,183,183,183,183,183,183,183,183,188,188,188,188,188,188,188,191,196,196,196,199,204,204,204,207,212,212,212,220,220,220,228,228,231,236,236,239,244,247,252,228,196,159,124,92,52,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,71,108,140,175,212,244,252,244,244,239,236,236,231,228,228,220,220,220,215,212,212,207,204,204,204,204,199,196,196,196,196,191,191,191,188,188,188,188,188,188,188,188,188,188,188,191,191,196,196,196,196,196,199,204,204,204,207,212,212,212,215,220,220,223,228,228,231,236,236,244,244,247,252,228,196,159,124,92,52,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,71,108,140,172,204,236,252,247,244,244,236,236,231,228,228,223,220,220,220,215,212,212,212,207,204,204,204,204,199,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,199,199,204,204,204,204,207,212,212,212,215,220,220,223,228,228,231,236,236,239,244,244,247,252,220,188,156,124,92,52,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,68,103,135,167,199,231,252,247,244,244,239,236,236,231,228,228,223,220,220,220,215,212,212,212,207,207,204,204,204,204,204,199,199,199,199,196,196,196,196,199,199,199,199,204,204,204,204,204,204,207,212,212,212,212,215,220,220,223,228,228,228,231,236,236,239,244,244,252,244,215,183,151,119,84,52,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,68,100,132,164,191,220,252,252,244,244,239,236,236,236,228,228,228,223,220,220,220,215,215,212,212,212,212,207,207,204,204,204,204,204,204,204,204,204,204,204,204,204,204,207,207,212,212,212,212,212,215,220,220,220,223,228,228,228,231,236,236,239,244,244,247,252,236,207,175,148,116,84,52,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,60,92,124,151,180,212,239,252,247,244,244,239,236,236,236,228,228,228,223,223,220,220,220,215,215,212,212,212,212,212,212,212,212,207,207,207,207,212,212,212,212,212,212,212,212,215,215,220,220,220,220,223,228,228,228,231,236,236,236,244,244,244,252,252,228,196,167,140,108,76,44,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,84,111,140,172,196,228,252,252,244,244,244,239,236,236,236,231,228,228,228,223,223,220,220,220,220,220,215,215,215,212,212,212,212,212,212,212,212,212,215,215,215,220,220,220,220,220,223,228,228,228,228,231,236,236,236,239,244,244,247,252,236,212,183,156,127,100,68,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,44,71,100,132,156,183,212,236,252,247,244,244,244,239,236,236,236,231,228,228,228,228,228,223,223,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,223,223,228,228,228,228,231,236,236,236,236,244,244,244,247,252,247,220,196,172,140,116,84,60,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,60,87,116,140,164,191,215,239,252,247,244,244,244,239,236,236,236,236,231,231,228,228,228,228,228,228,223,223,223,223,223,223,223,223,223,223,228,228,228,228,228,228,228,231,236,236,236,236,239,244,244,244,247,252,252,228,204,180,156,127,100,76,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,71,100,124,148,172,196,220,239,252,252,247,244,244,244,239,236,236,236,236,236,231,231,231,228,228,228,228,228,228,228,228,228,228,228,228,228,231,231,236,236,236,236,236,239,244,244,244,244,247,252,252,228,207,183,159,135,111,84,60,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,55,79,108,127,151,172,196,215,236,252,252,247,244,244,244,244,244,239,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,239,239,244,244,244,244,247,252,252,244,228,204,183,164,140,116,92,68,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,60,84,108,127,148,172,188,207,228,244,252,252,247,247,244,244,244,244,244,244,239,239,239,239,236,236,236,236,236,239,239,239,239,244,244,244,244,244,244,247,252,252,252,236,215,196,180,159,140,116,95,71,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,39,60,84,103,124,143,164,180,196,212,228,239,252,252,252,247,247,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,247,247,252,252,252,244,236,220,204,188,172,151,132,116,92,71,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,60,76,95,116,132,148,164,180,191,204,215,228,236,247,252,252,252,252,252,247,247,247,247,247,247,252,252,252,252,252,252,244,236,220,212,196,188,172,156,140,124,108,87,68,47,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,52,68,84,100,116,132,143,156,167,180,188,196,204,212,220,223,228,231,236,236,236,236,236,231,228,220,215,212,204,196,183,172,164,148,140,124,108,92,76,60,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,52,68,84,95,108,119,132,140,148,156,164,172,175,180,180,188,188,188,188,183,180,180,172,167,159,156,143,135,124,116,100,92,76,60,44,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,47,60,71,84,92,100,108,116,119,124,132,132,135,135,140,135,132,132,127,124,116,111,103,95,84,76,68,52,44,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,31,44,52,60,68,71,76,79,84,84,87,87,84,84,84,76,76,68,60,52,44,36,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,20,28,28,36,36,36,36,36,36,31,28,23,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};\n  const uint8_t FLARE_TEXTURE_5[16384] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,28,36,39,44,52,55,60,60,60,60,60,60,60,52,52,44,36,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,36,44,60,68,76,84,92,95,100,108,108,108,111,111,111,108,108,103,100,92,84,79,71,60,52,44,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,44,60,71,84,95,108,116,124,132,140,148,148,156,156,159,164,164,164,159,156,151,148,140,135,127,119,111,100,92,76,68,52,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,44,60,76,92,108,119,132,143,156,164,172,180,188,196,199,204,207,212,212,212,212,212,204,204,196,191,188,180,172,159,148,140,124,116,100,84,68,52,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,36,55,76,92,108,124,140,156,167,180,191,204,212,220,228,236,244,252,252,252,252,252,252,252,252,252,252,247,244,236,228,220,207,196,188,172,164,148,132,116,100,84,63,44,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,39,60,84,100,119,140,156,172,188,204,215,228,244,252,247,244,244,244,239,236,236,236,236,236,236,236,236,236,236,236,239,244,244,247,252,244,236,220,212,196,180,164,148,132,108,92,71,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,39,60,84,108,124,148,164,183,204,220,236,252,247,244,239,236,236,231,228,228,228,223,220,220,220,220,220,220,220,220,223,223,228,228,228,236,236,239,244,244,252,244,228,212,196,175,156,135,116,95,76,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,36,60,84,108,132,151,172,191,212,228,247,247,244,236,236,228,228,223,220,220,215,212,212,212,212,207,207,207,207,207,207,207,212,212,212,212,220,220,220,228,228,231,236,239,244,252,239,220,204,180,164,140,116,92,71,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,52,76,100,124,148,172,196,220,236,252,244,239,236,228,228,220,220,212,212,207,204,204,199,199,196,196,196,196,196,196,196,196,196,196,196,199,204,204,204,212,212,215,220,223,228,231,236,244,247,247,228,204,183,164,140,116,92,63,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,39,68,92,119,148,172,196,220,239,247,244,236,231,228,220,215,212,207,204,204,196,196,191,188,188,188,188,183,183,180,180,180,180,180,183,183,188,188,188,191,196,196,199,204,204,212,212,220,223,228,236,239,244,252,228,204,180,156,132,108,79,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,79,108,135,164,188,212,236,252,244,236,228,223,220,212,207,204,199,196,191,188,188,183,180,180,175,172,172,172,172,172,172,172,172,172,172,172,172,175,180,180,180,183,188,188,196,196,204,204,212,215,220,228,231,236,244,252,228,204,175,148,124,92,68,36,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,60,92,124,148,180,204,228,252,244,236,228,223,220,212,204,204,196,191,188,183,180,180,172,172,172,164,164,164,164,159,159,159,156,156,159,159,159,164,164,164,164,167,172,172,175,180,180,188,188,196,196,204,207,212,220,228,231,239,244,244,220,191,164,135,108,76,47,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,39,71,100,132,164,188,220,244,244,236,228,223,220,212,204,199,196,188,183,180,175,172,172,164,164,159,156,156,156,151,151,148,148,148,148,148,148,148,148,148,151,156,156,156,159,164,164,167,172,172,180,180,188,191,196,204,207,212,220,228,236,244,252,231,204,175,148,116,87,55,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,44,79,108,140,172,204,231,252,244,236,228,220,212,204,199,196,188,183,180,172,172,164,164,156,156,151,148,148,148,143,140,140,140,140,140,140,140,140,140,140,140,140,140,143,148,148,151,156,156,159,164,167,172,175,180,188,188,196,204,207,215,220,228,236,244,244,215,188,156,124,92,63,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,84,116,148,180,212,244,244,236,228,220,212,207,199,196,188,180,180,172,167,164,156,156,151,148,148,140,140,140,135,132,132,132,132,127,127,127,127,127,127,132,132,132,132,132,135,140,140,143,148,148,156,156,164,164,172,172,180,188,191,196,204,212,220,228,236,244,252,228,196,164,132,100,68,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,87,124,156,188,220,252,244,236,228,220,212,204,196,188,183,180,172,164,164,156,151,148,148,140,140,135,132,132,127,124,124,124,124,119,119,119,116,116,116,119,119,119,124,124,124,124,132,132,132,135,140,143,148,148,156,159,164,172,172,180,188,196,199,204,212,220,228,236,247,236,204,172,140,108,71,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,55,92,124,156,191,228,252,239,231,223,215,207,199,191,188,180,172,167,164,156,151,148,143,140,135,132,127,124,124,119,116,116,116,116,111,111,108,108,108,108,108,108,111,111,116,116,116,116,119,124,124,127,132,132,140,140,148,148,156,159,164,172,175,180,188,196,204,212,220,228,236,244,244,207,175,140,108,71,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,92,124,159,196,228,247,239,228,220,212,204,196,188,180,175,172,164,156,151,148,140,140,132,132,124,124,119,116,116,111,108,108,108,108,103,100,100,100,100,100,100,100,100,103,103,108,108,108,111,116,116,116,124,124,127,132,135,140,148,148,156,159,164,172,180,188,196,199,207,215,228,236,244,244,212,180,143,108,71,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,52,87,124,159,196,228,247,236,228,220,212,204,196,188,180,172,164,159,156,148,143,140,132,132,124,124,116,116,111,108,108,103,100,100,100,100,95,92,92,92,92,92,92,92,92,95,95,100,100,100,100,108,108,108,116,116,119,124,127,132,135,140,148,151,156,164,172,175,183,188,196,204,212,223,236,244,247,212,180,140,108,68,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,44,84,124,156,196,228,247,236,228,220,212,199,191,183,180,172,164,156,148,148,140,132,132,124,119,116,116,108,108,103,100,100,95,92,92,92,92,87,87,84,84,84,84,84,84,84,87,87,92,92,92,95,100,100,100,103,108,111,116,116,124,127,132,140,140,148,156,159,164,172,180,188,196,204,212,220,231,244,247,212,175,140,103,68,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,79,116,156,191,228,247,236,228,220,207,199,191,183,175,167,164,156,148,140,135,132,124,124,116,111,108,108,100,100,95,92,92,87,84,84,84,84,79,79,79,76,76,76,76,79,79,79,84,84,84,84,87,92,92,92,100,100,103,108,108,116,119,124,127,132,140,148,151,156,164,172,180,188,196,204,212,220,231,244,247,212,172,135,100,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,71,108,148,188,228,247,236,228,220,207,199,188,180,172,164,159,151,148,140,132,127,124,116,116,108,108,100,100,92,92,87,84,84,84,79,76,76,76,76,76,71,71,71,71,71,71,71,76,76,76,76,76,79,84,84,87,92,92,95,100,103,108,111,116,119,124,132,135,140,148,156,164,172,180,188,196,204,212,220,231,244,244,204,167,132,92,52,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,60,100,140,180,220,252,239,228,220,207,199,188,180,172,164,156,151,143,140,132,124,119,116,108,108,100,100,92,92,87,84,84,79,76,76,76,71,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,71,76,76,76,79,84,84,92,92,95,100,103,108,116,116,124,127,132,140,148,156,164,172,180,188,196,204,212,223,236,244,236,199,164,124,84,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,52,92,132,172,212,252,239,228,220,212,199,188,180,172,164,156,148,143,135,132,124,116,116,108,103,100,92,92,87,84,79,76,76,71,68,68,68,68,63,60,60,60,60,60,60,60,60,60,60,60,60,63,63,68,68,68,71,76,76,79,84,84,92,92,95,100,108,108,116,124,127,132,140,148,156,164,172,180,188,196,204,212,223,236,244,231,191,151,111,71,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,79,124,164,204,244,244,231,220,212,199,191,180,172,164,156,148,140,135,127,124,116,111,108,100,95,92,87,84,79,76,76,71,68,68,63,60,60,60,60,55,55,55,52,52,52,52,52,52,52,55,55,60,60,60,60,63,68,68,68,76,76,79,84,84,92,92,100,103,108,116,119,124,132,140,148,156,164,172,180,188,196,204,215,228,236,252,220,180,140,100,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,68,108,148,188,231,244,236,223,212,204,191,183,172,164,156,148,140,135,127,124,116,108,103,100,92,92,84,84,76,76,71,68,68,63,60,60,60,55,52,52,52,52,52,52,47,47,47,47,47,52,52,52,52,52,52,55,60,60,60,63,68,68,76,76,79,84,87,92,100,100,108,111,116,124,132,140,148,156,164,172,180,188,196,207,220,228,239,252,212,172,132,87,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,52,92,135,180,220,252,236,228,215,204,196,183,175,164,156,148,140,135,127,124,116,108,103,100,92,87,84,79,76,71,68,68,63,60,60,55,52,52,52,47,47,44,44,44,44,44,44,44,44,44,44,44,44,44,47,52,52,52,52,55,60,60,63,68,68,76,76,84,84,92,95,100,108,111,116,124,132,140,148,156,164,172,180,188,199,212,220,231,244,239,196,156,116,71,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,76,119,164,204,244,244,228,220,207,196,188,180,167,159,151,143,135,127,124,116,108,100,100,92,87,84,76,76,68,68,63,60,60,55,52,52,47,44,44,44,44,44,39,39,39,39,36,36,36,39,39,39,44,44,44,44,44,47,52,52,52,55,60,60,68,68,71,76,79,84,92,92,100,108,111,116,124,132,140,148,156,164,172,180,191,204,212,223,236,247,228,183,140,100,55,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,60,100,148,188,228,244,236,220,212,199,188,180,172,164,151,143,135,127,124,116,108,100,100,92,84,84,76,76,68,68,60,60,55,52,52,47,44,44,44,39,39,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,39,44,44,44,47,52,52,52,60,60,63,68,71,76,79,84,92,92,100,108,111,116,124,132,140,148,156,164,172,183,196,204,215,228,239,252,212,164,124,79,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,84,124,172,212,252,236,228,212,204,191,180,172,164,156,148,140,132,124,116,108,100,100,92,84,84,76,71,68,63,60,60,52,52,47,44,44,44,39,36,36,36,36,36,31,31,31,28,28,28,28,28,31,31,31,36,36,36,36,36,39,44,44,47,52,52,55,60,60,68,68,76,76,84,87,92,100,108,111,119,124,132,140,148,156,167,180,188,196,207,220,231,244,236,191,148,108,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,60,108,148,196,236,244,228,220,207,196,188,175,164,156,148,140,132,124,116,108,103,100,92,84,79,76,71,68,63,60,55,52,52,44,44,44,39,36,36,36,31,31,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,31,36,36,36,36,39,44,44,47,52,52,60,60,68,68,76,76,84,87,92,100,108,116,119,127,135,143,151,164,172,180,191,204,212,223,236,252,215,172,127,84,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,84,132,172,220,252,236,223,212,199,188,180,172,159,148,140,132,124,116,111,103,100,92,84,84,76,71,68,60,60,52,52,47,44,44,39,36,36,36,31,28,28,28,28,28,23,23,23,23,23,23,23,23,23,23,28,28,28,28,28,31,31,36,36,36,44,44,44,52,52,55,60,63,68,76,76,84,92,95,100,108,116,124,132,140,148,156,164,172,183,196,204,220,228,244,239,196,151,108,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,60,108,151,196,239,244,228,220,204,196,183,172,164,156,148,135,127,119,116,108,100,92,87,84,76,71,68,60,60,52,52,47,44,44,36,36,36,31,28,28,28,28,23,23,20,20,20,20,20,20,20,20,20,20,20,20,20,23,28,28,28,28,31,36,36,36,39,44,44,52,52,55,60,63,68,76,79,84,92,95,100,108,116,124,132,140,148,156,167,180,188,199,212,223,236,247,220,172,127,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,124,172,220,247,236,223,212,199,188,180,167,156,148,140,132,124,116,108,100,92,87,84,76,71,68,60,60,52,52,44,44,39,36,36,31,28,28,28,28,23,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,23,23,28,28,28,31,36,36,39,44,44,47,52,55,60,63,68,76,79,84,92,100,103,111,119,127,135,143,156,164,172,183,196,204,220,228,244,239,196,148,103,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,55,100,148,191,236,244,228,220,204,196,180,172,164,151,143,132,124,116,108,103,95,92,84,76,76,68,63,60,52,52,44,44,39,36,36,31,28,28,28,23,20,20,20,20,20,15,15,15,15,12,12,12,12,12,15,15,15,20,20,20,20,20,23,23,28,28,28,36,36,36,44,44,47,52,55,60,68,68,76,84,87,92,100,108,116,124,132,140,148,156,167,180,188,199,212,223,236,252,215,172,124,76,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,119,164,212,252,236,223,212,199,188,180,164,156,148,140,132,124,116,108,100,92,84,79,76,68,63,60,52,52,44,44,39,36,36,31,28,28,23,20,20,20,20,20,15,15,12,12,12,12,12,12,12,12,12,12,12,12,12,15,15,20,20,20,20,23,28,28,28,31,36,36,44,44,47,52,60,60,68,71,76,84,92,95,100,108,116,124,132,140,151,164,172,180,196,204,220,228,244,236,188,143,95,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,140,183,228,244,231,220,204,196,183,172,164,151,140,132,124,116,108,100,92,87,84,76,68,68,60,55,52,47,44,39,36,36,31,28,28,23,20,20,20,20,15,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,15,15,20,20,20,20,28,28,28,31,36,36,44,44,52,52,60,60,68,76,79,84,92,100,108,116,124,132,140,148,156,167,180,188,199,212,223,236,252,207,164,116,68,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,108,156,204,247,239,228,212,204,188,180,167,156,148,140,132,119,111,108,100,92,84,76,71,68,60,60,52,47,44,39,36,36,31,28,28,23,20,20,20,15,12,12,12,12,12,12,12,7,7,7,7,7,7,7,7,12,12,12,12,12,12,12,15,15,20,20,20,23,28,28,31,36,36,44,44,52,52,60,63,68,76,84,87,92,100,108,116,124,132,140,151,164,172,183,196,207,220,231,244,228,180,132,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,124,172,220,247,236,220,207,196,183,172,164,151,143,132,124,116,108,100,92,87,79,76,68,63,60,52,52,44,44,36,36,31,28,28,23,20,20,20,15,12,12,12,12,12,7,7,7,7,0,0,0,0,0,0,0,7,7,7,12,12,12,12,12,12,15,20,20,20,23,28,28,31,36,39,44,47,52,55,60,68,71,76,84,92,100,108,111,124,132,140,148,156,167,180,188,204,212,228,239,244,196,148,100,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,140,188,236,244,228,215,204,191,180,172,156,148,140,132,124,116,108,100,92,84,76,71,68,60,55,52,44,44,36,36,31,28,28,23,20,20,20,15,12,12,12,12,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,12,15,20,20,20,23,28,28,36,36,39,44,47,52,60,63,68,76,79,87,92,100,108,116,124,132,143,156,164,172,188,196,212,220,236,252,212,164,116,68,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,108,156,204,252,236,228,212,199,188,175,164,156,148,135,124,116,108,100,92,87,79,76,68,63,60,52,47,44,39,36,31,28,28,23,20,20,20,15,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,15,20,20,20,28,28,31,36,36,44,44,52,55,60,68,71,76,84,92,100,108,116,124,132,140,148,159,172,180,196,204,220,231,244,228,180,132,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,71,119,167,215,247,236,220,207,196,183,172,164,151,140,132,124,116,108,100,92,84,76,71,68,60,55,52,44,44,36,36,28,28,23,20,20,20,15,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,15,20,20,23,28,28,31,36,39,44,47,52,60,63,68,76,84,87,95,100,108,116,127,135,148,156,167,180,188,204,212,228,244,239,191,143,95,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,132,180,228,244,228,220,204,191,180,172,156,148,140,127,119,111,103,95,87,84,76,68,63,60,52,47,44,39,36,31,28,28,20,20,20,15,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,23,28,28,36,36,44,44,52,55,60,68,71,76,84,92,100,108,116,124,132,143,156,164,172,188,196,212,223,236,252,204,156,108,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,95,143,191,244,239,228,212,204,188,180,164,156,148,135,124,116,108,100,92,84,79,71,68,60,55,52,44,44,36,36,28,28,23,20,20,15,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,20,28,28,31,36,39,44,47,52,60,63,68,76,84,92,95,103,111,124,132,140,148,159,172,183,196,207,220,236,247,215,167,119,71,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,60,108,156,204,252,236,223,212,196,188,172,164,151,140,132,124,116,108,100,92,84,76,68,63,60,52,47,44,39,36,31,28,28,20,20,20,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,23,28,28,36,36,44,44,52,55,60,68,76,79,87,92,100,108,116,127,140,148,156,167,180,191,204,220,228,244,228,180,132,84,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,68,116,164,212,247,236,220,207,196,183,172,159,148,140,132,119,111,103,95,87,84,76,68,60,60,52,44,44,36,36,28,28,23,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,28,28,31,36,39,44,52,52,60,68,71,76,84,92,100,108,116,124,132,143,156,164,180,188,204,212,228,244,236,188,140,92,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,124,172,220,244,231,220,204,191,180,172,156,148,140,127,116,108,100,92,84,79,76,68,60,55,52,44,39,36,31,28,28,20,20,20,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,23,28,28,36,36,44,47,52,60,63,68,76,84,92,100,108,116,124,132,140,151,164,172,188,196,212,228,236,247,196,148,100,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,132,180,228,244,228,215,204,188,180,164,156,148,135,124,116,108,100,92,84,76,71,68,60,52,47,44,39,36,31,28,23,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,20,20,20,28,28,36,36,44,44,52,55,60,68,76,84,87,95,103,111,124,132,140,148,164,172,183,196,212,220,236,252,204,156,108,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,92,140,188,236,244,228,212,199,188,175,164,156,143,132,124,116,108,100,92,84,76,68,63,60,52,47,44,36,36,28,28,23,20,20,15,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,28,28,31,36,39,44,52,55,60,68,76,79,87,92,100,108,119,127,140,148,159,172,180,196,207,220,236,247,212,164,116,68,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,95,148,196,244,239,228,212,199,188,172,164,151,140,132,124,116,108,100,92,84,76,68,60,55,52,44,44,36,36,28,28,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,23,28,31,36,39,44,47,52,60,68,71,76,84,92,100,108,116,127,140,148,156,172,180,191,204,220,231,244,220,172,119,71,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,100,148,199,252,236,223,212,196,188,172,164,151,140,132,124,111,103,95,87,79,76,68,60,55,52,44,39,36,31,28,23,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,20,20,23,28,28,36,36,44,47,52,60,63,68,76,84,92,100,108,116,124,135,148,156,167,180,191,204,220,228,244,223,175,124,76,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,55,108,156,204,252,236,220,212,196,183,172,159,148,140,132,119,111,100,92,87,79,76,68,60,55,52,44,39,36,31,28,23,20,20,15,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,28,28,36,36,44,47,52,60,63,68,76,84,92,100,108,116,124,132,143,156,164,180,188,204,215,228,244,228,180,132,79,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,60,108,156,207,252,236,220,207,196,183,172,159,148,140,127,119,108,100,92,84,79,71,68,60,52,52,44,39,36,31,28,23,20,20,15,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,28,28,36,36,44,44,52,60,63,68,76,84,92,100,108,116,124,132,143,156,164,180,188,204,212,228,244,231,180,132,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,108,159,212,252,236,220,207,196,180,172,159,148,140,127,119,108,100,92,84,76,71,68,60,52,47,44,39,36,28,28,23,20,20,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,28,28,31,36,44,44,52,55,60,68,76,84,92,100,108,116,124,132,143,156,164,175,188,204,212,228,244,236,188,135,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,111,164,212,252,236,220,207,196,180,172,156,148,140,127,116,108,100,92,84,76,71,68,60,52,47,44,36,36,28,28,23,20,20,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,28,28,31,36,44,44,52,55,60,68,76,84,92,100,108,116,124,132,140,156,164,175,188,199,212,228,244,236,188,135,87,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,111,164,212,252,236,220,207,196,180,172,156,148,140,127,116,108,100,92,84,76,71,68,60,52,47,44,36,36,28,28,23,20,20,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,23,28,31,36,44,44,52,55,60,68,76,84,92,100,108,116,124,132,140,156,164,175,188,199,212,228,244,236,188,140,87,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,111,164,212,252,236,220,207,196,180,172,159,148,140,127,116,108,100,92,84,76,71,68,60,52,47,44,36,36,28,28,23,20,20,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,28,28,31,36,44,44,52,55,60,68,76,84,92,100,108,116,124,132,143,156,164,175,188,199,212,228,244,236,188,135,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,108,159,212,252,236,220,207,196,180,172,159,148,140,127,119,108,100,92,84,79,71,68,60,52,47,44,39,36,28,28,23,20,20,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,28,28,31,36,44,44,52,55,60,68,76,84,92,100,108,116,124,132,143,156,164,175,188,204,212,228,244,236,183,132,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,60,108,156,204,252,236,220,207,196,183,172,159,148,140,132,119,111,100,92,84,79,71,68,60,52,52,44,39,36,31,28,23,20,20,15,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,28,28,36,36,44,44,52,60,63,68,76,84,92,100,108,116,124,132,143,156,164,180,188,204,215,228,244,231,180,132,84,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,103,151,204,252,236,223,212,196,183,172,164,148,140,132,119,111,103,95,87,79,76,68,60,55,52,44,39,36,31,28,23,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,20,20,23,28,28,36,36,44,47,52,60,63,68,76,84,92,100,108,116,124,135,148,156,164,180,188,204,215,228,244,228,180,127,76,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,100,148,196,247,236,223,212,196,188,172,164,151,140,132,124,116,103,95,87,84,76,68,60,55,52,44,44,36,31,28,28,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,15,20,20,23,28,28,36,36,44,47,52,60,68,71,76,84,92,100,108,116,124,135,148,156,167,180,191,204,220,231,244,220,172,124,76,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,140,191,244,239,228,212,199,188,175,164,156,140,132,124,116,108,100,92,84,76,68,63,60,52,44,44,36,36,28,28,20,20,20,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,23,28,31,36,39,44,52,52,60,68,71,79,84,92,100,108,116,127,140,148,156,172,180,196,204,220,236,247,215,167,116,68,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,135,188,236,244,228,212,204,188,180,164,156,143,132,124,116,108,100,92,84,76,68,63,60,52,47,44,36,36,28,28,23,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,28,28,31,36,44,44,52,55,60,68,76,79,87,95,103,111,119,132,140,148,159,172,183,196,207,220,236,252,212,159,111,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,79,127,180,228,244,228,220,204,191,180,167,156,148,135,124,116,108,100,92,84,76,71,68,60,52,52,44,39,36,31,28,28,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,23,28,28,36,36,44,44,52,60,60,68,76,84,92,100,108,116,124,132,140,151,164,172,188,196,212,223,236,252,204,156,103,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,71,119,172,220,247,236,220,204,196,180,172,159,148,140,132,119,111,100,95,87,79,76,68,60,55,52,44,44,36,36,28,28,23,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,23,28,31,36,39,44,47,52,60,63,68,76,84,92,100,108,116,124,132,143,156,164,175,188,199,212,228,239,244,196,143,95,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,111,159,207,252,236,220,212,196,183,172,164,151,140,132,124,116,108,100,92,84,76,68,63,60,52,47,44,36,36,31,28,23,20,20,15,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,23,28,28,31,36,44,44,52,55,60,68,71,79,84,92,100,108,116,124,135,148,156,167,180,188,204,215,228,244,236,183,135,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,100,148,196,244,239,228,212,199,188,175,164,156,143,132,124,116,108,100,92,84,76,71,68,60,52,52,44,39,36,31,28,28,23,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,23,28,31,36,36,44,47,52,60,60,68,76,84,87,95,103,111,119,132,140,148,159,172,180,196,204,220,231,244,220,172,124,76,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,140,188,236,244,228,215,204,188,180,167,156,148,135,127,116,108,100,92,87,79,76,68,60,55,52,47,44,36,36,31,28,23,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,23,28,28,31,36,39,44,52,52,60,68,68,76,84,92,100,108,116,124,132,140,151,164,172,183,196,212,220,236,252,212,164,116,68,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,124,172,220,244,231,220,204,196,180,172,159,148,140,132,124,116,103,100,92,84,76,68,63,60,52,52,44,39,36,36,28,28,23,20,20,15,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,20,28,28,31,36,36,44,44,52,55,60,68,76,79,84,92,100,108,116,124,135,143,156,164,175,188,199,212,228,239,244,196,148,100,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,68,116,164,212,252,236,223,212,196,188,172,164,156,143,132,124,116,108,100,92,84,79,76,68,60,55,52,47,44,36,36,31,28,28,20,20,20,15,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,20,23,28,28,36,36,39,44,52,52,60,63,68,76,84,92,95,103,111,119,132,140,148,156,172,180,191,204,215,228,244,236,188,140,92,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,100,148,196,244,239,228,212,204,188,180,167,156,148,140,127,119,111,103,95,92,84,76,68,63,60,52,52,44,44,36,36,28,28,28,20,20,20,15,12,12,12,12,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,15,20,20,20,23,28,28,31,36,39,44,47,52,55,60,68,76,79,84,92,100,108,116,124,132,140,151,164,172,183,196,207,220,236,247,220,172,124,76,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,132,180,228,244,231,220,204,196,180,172,164,148,140,132,124,116,108,100,92,84,79,76,68,60,60,52,47,44,39,36,36,28,28,23,20,20,20,15,12,12,12,12,12,7,7,7,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,12,15,20,20,20,23,28,28,31,36,36,44,44,52,52,60,63,68,76,84,87,95,103,108,119,127,135,148,156,164,180,188,199,212,228,236,252,204,156,108,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,68,116,164,212,252,236,223,212,196,188,175,164,156,148,135,127,116,108,103,95,92,84,76,68,68,60,55,52,44,44,39,36,31,28,28,23,20,20,20,15,15,12,12,12,12,12,12,7,7,7,7,7,7,7,7,7,7,7,12,12,12,12,12,12,15,20,20,20,23,28,28,31,36,36,44,44,47,52,60,60,68,76,79,84,92,100,108,116,124,132,140,148,159,172,180,191,204,220,228,244,236,188,140,92,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,100,148,196,239,244,228,215,204,191,180,172,159,148,140,132,124,116,108,100,92,84,79,76,68,63,60,52,52,44,44,36,36,31,28,28,23,20,20,20,20,15,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,15,15,20,20,20,23,28,28,31,36,36,39,44,47,52,55,60,68,71,76,84,92,95,103,108,116,127,135,148,156,164,175,188,196,212,220,236,247,215,172,124,76,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,132,175,220,247,236,220,207,196,188,172,164,156,148,135,127,119,111,103,95,92,84,76,71,68,60,60,52,52,44,44,36,36,31,28,28,28,23,20,20,20,15,15,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,15,15,20,20,20,20,23,28,28,31,36,36,39,44,47,52,55,60,63,68,76,84,87,92,100,108,116,124,132,140,148,159,172,180,191,204,212,228,239,244,196,151,108,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,63,108,156,204,247,239,228,212,204,188,180,172,159,148,140,132,124,116,108,100,92,87,84,76,71,68,60,55,52,47,44,44,36,36,31,28,28,28,23,20,20,20,20,20,15,15,12,12,12,12,12,12,12,12,12,12,15,15,15,20,20,20,20,23,28,28,28,31,36,36,39,44,44,52,52,60,63,68,76,79,84,92,100,103,111,119,127,135,148,156,164,172,188,196,207,220,236,244,228,180,132,87,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,135,180,228,244,231,220,207,196,188,172,164,156,148,140,127,119,116,108,100,92,84,79,76,68,68,60,55,52,47,44,44,36,36,36,31,28,28,28,23,20,20,20,20,20,20,15,15,15,15,15,15,15,15,20,20,20,20,20,20,23,23,28,28,28,31,36,36,39,44,44,52,52,60,60,68,71,76,84,92,95,100,108,116,124,132,140,148,159,172,180,188,204,212,228,239,252,204,159,116,68,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,71,116,164,204,252,236,228,212,204,191,180,172,159,151,140,132,124,116,108,103,100,92,84,79,76,68,63,60,55,52,47,44,44,39,36,36,31,28,28,28,28,23,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,23,23,28,28,28,31,36,36,36,44,44,47,52,52,60,60,68,71,76,84,87,92,100,108,116,124,132,140,148,156,164,175,188,196,207,220,231,244,228,183,140,92,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,95,140,183,228,244,231,220,207,196,188,175,164,156,148,140,132,124,116,108,100,95,92,84,76,76,68,63,60,55,52,52,44,44,39,36,36,36,31,28,28,28,28,28,23,23,20,20,20,20,20,20,20,20,23,23,23,28,28,28,28,31,31,36,36,39,44,44,47,52,52,60,60,68,71,76,84,84,92,100,108,111,119,127,135,143,151,164,172,180,191,204,212,228,239,252,207,164,116,71,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,116,164,204,252,239,228,215,204,196,180,172,164,156,148,135,127,124,116,108,100,92,92,84,76,76,68,63,60,60,52,52,47,44,44,39,36,36,36,31,28,28,28,28,28,28,28,28,28,23,28,28,28,28,28,28,28,28,31,31,36,36,36,39,44,44,47,52,55,60,60,68,71,76,84,84,92,100,103,108,116,124,132,140,148,156,167,180,188,196,212,220,236,244,228,183,140,95,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,92,140,180,228,244,236,220,212,199,188,180,172,159,151,140,132,127,119,111,108,100,92,87,84,76,76,68,68,60,60,52,52,47,44,44,44,39,36,36,36,36,31,31,28,28,28,28,28,28,28,28,28,28,28,31,31,36,36,36,36,39,44,44,47,52,52,55,60,63,68,71,76,84,84,92,100,103,108,116,124,132,140,148,156,164,172,183,196,204,215,228,239,247,204,159,116,71,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,71,116,156,204,244,244,228,220,204,196,188,175,164,156,148,140,132,124,116,111,108,100,92,87,84,79,76,68,68,60,60,55,52,52,47,44,44,44,39,36,36,36,36,36,36,36,31,31,31,31,31,36,36,36,36,36,36,39,44,44,44,44,52,52,52,60,60,63,68,71,76,84,84,92,100,100,108,116,124,132,140,148,156,164,172,180,188,204,212,223,236,247,220,180,135,92,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,132,175,220,252,236,228,212,204,196,183,172,164,156,148,140,132,124,116,111,108,100,92,92,84,79,76,71,68,63,60,60,55,52,52,47,44,44,44,44,39,39,36,36,36,36,36,36,36,36,36,36,36,39,44,44,44,44,47,52,52,52,55,60,60,68,68,76,76,84,84,92,100,100,108,116,124,127,135,143,151,159,172,180,188,196,207,220,231,244,236,196,156,111,68,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,63,108,148,191,231,244,236,220,212,199,188,180,172,164,156,148,140,132,124,116,111,108,100,95,92,84,84,76,76,68,68,63,60,60,55,52,52,52,47,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,47,52,52,52,55,60,60,63,68,71,76,79,84,87,92,100,103,108,116,124,127,135,140,148,156,167,175,188,196,204,215,228,239,252,212,172,127,84,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,79,124,164,204,244,244,228,220,207,196,188,180,172,164,156,148,140,132,124,116,111,108,100,95,92,87,84,79,76,71,68,68,63,60,60,55,52,52,52,52,47,47,47,44,44,44,44,44,44,44,47,47,52,52,52,52,55,60,60,60,63,68,68,76,76,84,84,92,92,100,103,108,116,124,127,132,140,148,156,164,172,183,196,204,212,223,236,247,228,183,140,100,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,52,92,135,175,215,252,236,228,215,204,196,188,180,172,164,156,148,140,132,124,119,116,108,100,100,92,92,84,84,76,76,71,68,68,63,60,60,60,55,55,52,52,52,52,52,52,52,52,52,52,52,52,52,55,60,60,60,60,68,68,68,76,76,79,84,87,92,95,100,108,108,116,124,127,135,140,148,156,164,172,180,191,204,212,220,236,244,236,196,156,116,76,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,68,108,148,188,228,247,236,228,212,204,196,188,180,172,164,156,148,140,132,124,119,116,108,103,100,95,92,87,84,79,76,76,71,68,68,68,63,60,60,60,60,60,60,55,55,55,55,55,60,60,60,60,60,60,63,68,68,68,76,76,79,84,84,92,92,100,100,108,111,116,124,132,135,140,148,156,164,172,180,188,199,212,220,228,244,244,207,167,127,84,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,76,116,156,196,236,244,236,223,212,204,196,188,180,172,164,156,148,140,132,127,124,116,111,108,100,100,92,92,87,84,84,76,76,76,71,68,68,68,68,63,63,63,60,60,60,60,60,63,63,68,68,68,68,68,71,76,76,79,84,84,87,92,95,100,103,108,116,119,124,132,140,143,148,156,164,172,180,188,199,207,220,228,239,252,215,175,140,100,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,47,87,124,164,204,244,244,236,220,212,204,196,188,180,172,164,156,148,140,135,132,124,119,116,108,108,100,100,92,92,87,84,84,79,76,76,76,76,71,68,68,68,68,68,68,68,68,68,68,71,71,76,76,76,79,84,84,84,92,92,95,100,103,108,111,116,124,127,132,140,148,151,156,164,172,180,188,199,207,220,228,236,252,220,183,148,108,68,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,55,92,132,172,207,244,244,231,220,212,204,196,188,180,172,164,156,148,143,140,132,127,124,116,116,108,108,100,100,95,92,92,87,84,84,84,79,76,76,76,76,76,76,76,76,76,76,76,76,79,79,84,84,84,87,92,92,95,100,103,108,108,116,119,124,132,135,140,148,156,159,167,172,180,188,199,207,220,228,236,247,228,188,151,116,76,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,63,100,140,175,212,247,244,231,220,212,204,196,188,180,172,164,156,151,148,140,135,132,124,124,116,111,108,108,100,100,95,92,92,92,87,87,84,84,84,84,84,84,84,84,84,84,84,84,84,87,92,92,92,95,100,100,103,108,108,116,116,124,127,132,140,143,148,156,164,172,175,183,191,199,207,220,228,236,247,228,196,156,119,84,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,68,108,140,180,212,247,244,231,223,212,204,196,188,180,172,167,164,156,148,143,140,132,132,124,124,116,116,108,108,103,100,100,100,95,92,92,92,92,92,92,92,92,92,92,92,92,92,92,95,100,100,100,103,108,108,111,116,119,124,127,132,135,140,148,151,156,164,172,180,188,196,204,212,220,228,236,247,231,196,159,124,84,52,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,71,108,143,180,212,247,244,236,223,215,207,199,191,183,180,172,164,156,156,148,140,140,132,132,124,124,116,116,111,108,108,108,103,100,100,100,100,100,100,100,100,100,100,100,100,100,100,103,108,108,108,111,116,116,119,124,127,132,135,140,148,148,156,164,167,172,180,188,196,204,212,220,228,236,247,228,196,159,124,92,52,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,71,108,140,175,212,244,244,236,228,220,212,204,196,188,180,172,167,164,156,151,148,140,140,132,132,127,124,124,116,116,116,111,108,108,108,108,108,108,108,108,108,108,108,108,108,108,111,116,116,116,119,124,124,132,132,135,140,148,148,156,159,164,172,180,183,188,196,204,212,220,228,239,252,228,196,159,124,92,52,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,71,108,140,172,204,236,244,236,228,220,212,204,196,191,183,180,172,167,164,156,151,148,143,140,135,132,132,127,124,124,124,119,116,116,116,116,116,116,116,116,116,116,116,116,116,119,124,124,124,132,132,135,140,140,148,148,156,159,164,172,175,180,188,196,204,207,215,223,236,244,252,220,188,156,124,92,52,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,68,103,135,167,199,231,252,239,231,223,215,207,204,196,188,183,180,172,167,164,156,156,148,148,143,140,140,132,132,132,127,127,124,124,124,124,124,124,124,124,124,124,124,127,132,132,132,135,140,140,143,148,151,156,159,164,172,172,180,188,191,196,204,212,220,228,236,244,244,215,183,151,119,84,52,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,68,100,132,164,191,220,252,244,236,228,220,212,204,199,196,188,180,180,172,167,164,159,156,156,148,148,143,140,140,140,140,135,132,132,132,132,132,132,132,132,135,135,140,140,140,143,148,148,151,156,156,164,164,172,175,180,188,188,196,204,212,215,223,231,239,247,236,207,175,148,116,84,52,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,60,92,124,151,180,212,239,247,239,231,223,220,212,204,199,196,188,183,180,172,172,167,164,159,156,156,151,148,148,148,148,143,143,143,140,140,143,143,143,148,148,148,148,151,156,156,159,164,164,172,172,180,180,188,191,196,204,207,212,220,228,236,244,252,228,196,167,140,108,76,44,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,84,111,140,172,196,228,252,244,236,228,223,220,212,204,199,196,188,188,180,180,172,172,167,164,164,164,159,156,156,156,156,156,156,156,156,156,156,156,156,156,159,164,164,167,172,172,175,180,183,188,191,196,204,207,212,220,228,236,239,247,236,212,183,156,127,100,68,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,44,71,100,132,156,183,212,236,252,244,236,228,223,220,212,207,204,196,196,188,188,183,180,180,172,172,172,172,167,164,164,164,164,164,164,164,164,164,167,172,172,172,175,180,180,183,188,191,196,199,204,212,212,220,228,231,239,244,247,220,196,172,140,116,84,60,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,60,87,116,140,164,191,215,239,247,244,236,228,223,220,212,212,204,204,196,196,191,188,188,183,180,180,180,180,180,175,175,175,175,175,180,180,180,180,183,188,188,188,196,196,199,204,207,212,220,220,228,236,239,244,252,228,204,180,156,127,100,76,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,71,100,124,148,172,196,220,239,252,244,236,231,228,220,220,212,212,207,204,204,196,196,196,191,191,188,188,188,188,188,188,188,188,188,191,196,196,196,199,204,204,212,212,215,220,228,228,236,239,244,252,228,207,183,159,135,111,84,60,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,55,79,108,127,151,172,196,215,236,252,244,239,236,231,228,223,220,220,212,212,212,207,204,204,204,204,204,199,199,199,204,204,204,204,204,207,212,212,215,220,220,228,228,236,236,244,247,244,228,204,183,164,140,116,92,68,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,60,84,108,127,148,172,188,207,228,244,252,244,244,236,236,228,228,228,220,220,220,220,215,212,212,212,212,212,212,215,215,220,220,220,223,228,228,231,236,239,244,247,252,236,215,196,180,159,140,116,95,71,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,39,60,84,103,124,143,164,180,196,212,228,239,252,247,244,244,236,236,236,231,228,228,228,228,228,228,228,228,228,228,231,236,236,236,239,244,244,252,244,236,220,204,188,172,151,132,116,92,71,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,60,76,95,116,132,148,164,180,191,204,215,228,236,247,252,247,244,244,244,244,244,244,244,244,244,244,244,244,247,252,252,244,236,220,212,196,188,172,156,140,124,108,87,68,47,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,52,68,84,100,116,132,143,156,167,180,188,196,204,212,220,223,228,231,236,236,236,236,236,231,228,220,215,212,204,196,183,172,164,148,140,124,108,92,76,60,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,52,68,84,95,108,119,132,140,148,156,164,172,175,180,180,188,188,188,188,183,180,180,172,167,159,156,143,135,124,116,100,92,76,60,44,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,47,60,71,84,92,100,108,116,119,124,132,132,135,135,140,135,132,132,127,124,116,111,103,95,84,76,68,52,44,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,31,44,52,60,68,71,76,79,84,84,87,87,84,84,84,76,76,68,60,52,44,36,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,20,28,28,36,36,36,36,36,36,31,28,23,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};\n  const uint8_t * FLARE_TEXTURES[6] = {\n    FLARE_TEXTURE_0,\n    FLARE_TEXTURE_1,\n    FLARE_TEXTURE_2,\n    FLARE_TEXTURE_3,\n    FLARE_TEXTURE_4,\n    FLARE_TEXTURE_5,\n  };\n  const int FLARE_TEXTURE_WIDTHS[10] = {\n    128,\n    128,\n    128,\n    128,\n    128,\n    128,\n  };\n  const int FLARE_TEXTURE_HEIGHTS[10] = {\n    128,\n    128,\n    128,\n    128,\n    128,\n    128,\n  };\n}\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/flip_avoiding_line_search.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2016 Michael Rabinovich\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"flip_avoiding_line_search.h\"\n#include \"line_search.h\"\n\n#include <Eigen/Dense>\n#include <vector>\n\nnamespace igl\n{\n  namespace flip_avoiding\n  {\n    //---------------------------------------------------------------------------\n    // x - array of size 3\n    // In case 3 real roots: => x[0], x[1], x[2], return 3\n    //         2 real roots: x[0], x[1],          return 2\n    //         1 real root : x[0], x[1] ± i*x[2], return 1\n    // http://math.ivanovo.ac.ru/dalgebra/Khashin/poly/index.html\n    IGL_INLINE int SolveP3(std::vector<double>& x,double a,double b,double c)\n    { // solve cubic equation x^3 + a*x^2 + b*x + c\n      using namespace std;\n      double a2 = a*a;\n        double q  = (a2 - 3*b)/9;\n      double r  = (a*(2*a2-9*b) + 27*c)/54;\n        double r2 = r*r;\n      double q3 = q*q*q;\n      double A,B;\n        if(r2<q3)\n        {\n          double t=r/sqrt(q3);\n          if( t<-1) t=-1;\n          if( t> 1) t= 1;\n          t=acos(t);\n          a/=3; q=-2*sqrt(q);\n          x[0]=q*cos(t/3)-a;\n          x[1]=q*cos((t+(2*M_PI))/3)-a;\n          x[2]=q*cos((t-(2*M_PI))/3)-a;\n          return(3);\n        }\n        else\n        {\n          A =-pow(fabs(r)+sqrt(r2-q3),1./3);\n          if( r<0 ) A=-A;\n          B = A==0? 0 : B=q/A;\n\n          a/=3;\n          x[0] =(A+B)-a;\n          x[1] =-0.5*(A+B)-a;\n          x[2] = 0.5*sqrt(3.)*(A-B);\n          if(fabs(x[2])<1e-14)\n          {\n            x[2]=x[1]; return(2);\n          }\n          return(1);\n        }\n    }\n\n    IGL_INLINE double get_smallest_pos_quad_zero(double a,double b, double c)\n    {\n      using namespace std;\n      double t1,t2;\n      if (a != 0)\n      {\n        double delta_in = pow(b,2) - 4*a*c;\n        if (delta_in < 0)\n        {\n          return INFINITY;\n        }\n        double delta = sqrt(delta_in);\n        t1 = (-b + delta)/ (2*a);\n        t2 = (-b - delta)/ (2*a);\n      }\n      else\n      {\n        t1 = t2 = -b/c;\n      }\n      assert (std::isfinite(t1));\n      assert (std::isfinite(t2));\n\n      double tmp_n = min(t1,t2);\n      t1 = max(t1,t2); t2 = tmp_n;\n      if (t1 == t2)\n      {\n        return INFINITY; // means the orientation flips twice = doesn't flip\n      }\n      // return the smallest negative root if it exists, otherwise return infinity\n      if (t1 > 0)\n      {\n        if (t2 > 0)\n        {\n          return t2;\n        }\n        else\n        {\n          return t1;\n        }\n      }\n      else\n      {\n        return INFINITY;\n      }\n    }\n\n    IGL_INLINE double get_min_pos_root_2D(const Eigen::MatrixXd& uv,\n                                          const Eigen::MatrixXi& F,\n                                          Eigen::MatrixXd& d,\n                                          int f)\n    {\n      using namespace std;\n    /*\n          Finding the smallest timestep t s.t a triangle get degenerated (<=> det = 0)\n          The following code can be derived by a symbolic expression in matlab:\n\n          Symbolic matlab:\n          U11 = sym('U11');\n          U12 = sym('U12');\n          U21 = sym('U21');\n          U22 = sym('U22');\n          U31 = sym('U31');\n          U32 = sym('U32');\n\n          V11 = sym('V11');\n          V12 = sym('V12');\n          V21 = sym('V21');\n          V22 = sym('V22');\n          V31 = sym('V31');\n          V32 = sym('V32');\n\n          t = sym('t');\n\n          U1 = [U11,U12];\n          U2 = [U21,U22];\n          U3 = [U31,U32];\n\n          V1 = [V11,V12];\n          V2 = [V21,V22];\n          V3 = [V31,V32];\n\n          A = [(U2+V2*t) - (U1+ V1*t)];\n          B = [(U3+V3*t) - (U1+ V1*t)];\n          C = [A;B];\n\n          solve(det(C), t);\n          cf = coeffs(det(C),t); % Now cf(1),cf(2),cf(3) holds the coefficients for the polynom. at order c,b,a\n        */\n\n      int v1 = F(f,0); int v2 = F(f,1); int v3 = F(f,2);\n      // get quadratic coefficients (ax^2 + b^x + c)\n      const double& U11 = uv(v1,0);\n      const double& U12 = uv(v1,1);\n      const double& U21 = uv(v2,0);\n      const double& U22 = uv(v2,1);\n      const double& U31 = uv(v3,0);\n      const double& U32 = uv(v3,1);\n\n      const double& V11 = d(v1,0);\n      const double& V12 = d(v1,1);\n      const double& V21 = d(v2,0);\n      const double& V22 = d(v2,1);\n      const double& V31 = d(v3,0);\n      const double& V32 = d(v3,1);\n\n      double a = V11*V22 - V12*V21 - V11*V32 + V12*V31 + V21*V32 - V22*V31;\n      double b = U11*V22 - U12*V21 - U21*V12 + U22*V11 - U11*V32 + U12*V31 + U31*V12 - U32*V11 + U21*V32 - U22*V31 - U31*V22 + U32*V21;\n      double c = U11*U22 - U12*U21 - U11*U32 + U12*U31 + U21*U32 - U22*U31;\n\n      return get_smallest_pos_quad_zero(a,b,c);\n    }\n\n    IGL_INLINE double get_min_pos_root_3D(const Eigen::MatrixXd& uv,\n                                          const Eigen::MatrixXi& F,\n                                          Eigen::MatrixXd& direc,\n                                          int f)\n    {\n      using namespace std;\n      /*\n          Searching for the roots of:\n            +-1/6 * |ax ay az 1|\n                    |bx by bz 1|\n                    |cx cy cz 1|\n                    |dx dy dz 1|\n          Every point ax,ay,az has a search direction a_dx,a_dy,a_dz, and so we add those to the matrix, and solve the cubic to find the step size t for a 0 volume\n          Symbolic matlab:\n            syms a_x a_y a_z a_dx a_dy a_dz % tetrahedera point and search direction\n            syms b_x b_y b_z b_dx b_dy b_dz\n            syms c_x c_y c_z c_dx c_dy c_dz\n            syms d_x d_y d_z d_dx d_dy d_dz\n            syms t % Timestep var, this is what we're looking for\n\n\n            a_plus_t = [a_x,a_y,a_z] + t*[a_dx,a_dy,a_dz];\n            b_plus_t = [b_x,b_y,b_z] + t*[b_dx,b_dy,b_dz];\n            c_plus_t = [c_x,c_y,c_z] + t*[c_dx,c_dy,c_dz];\n            d_plus_t = [d_x,d_y,d_z] + t*[d_dx,d_dy,d_dz];\n\n            vol_mat = [a_plus_t,1;b_plus_t,1;c_plus_t,1;d_plus_t,1]\n            //cf = coeffs(det(vol_det),t); % Now cf(1),cf(2),cf(3),cf(4) holds the coefficients for the polynom\n            [coefficients,terms] = coeffs(det(vol_det),t); % terms = [ t^3, t^2, t, 1], Coefficients hold the coeff we seek\n      */\n      int v1 = F(f,0); int v2 = F(f,1); int v3 = F(f,2); int v4 = F(f,3);\n      const double& a_x = uv(v1,0);\n      const double& a_y = uv(v1,1);\n      const double& a_z = uv(v1,2);\n      const double& b_x = uv(v2,0);\n      const double& b_y = uv(v2,1);\n      const double& b_z = uv(v2,2);\n      const double& c_x = uv(v3,0);\n      const double& c_y = uv(v3,1);\n      const double& c_z = uv(v3,2);\n      const double& d_x = uv(v4,0);\n      const double& d_y = uv(v4,1);\n      const double& d_z = uv(v4,2);\n\n      const double& a_dx = direc(v1,0);\n      const double& a_dy = direc(v1,1);\n      const double& a_dz = direc(v1,2);\n      const double& b_dx = direc(v2,0);\n      const double& b_dy = direc(v2,1);\n      const double& b_dz = direc(v2,2);\n      const double& c_dx = direc(v3,0);\n      const double& c_dy = direc(v3,1);\n      const double& c_dz = direc(v3,2);\n      const double& d_dx = direc(v4,0);\n      const double& d_dy = direc(v4,1);\n      const double& d_dz = direc(v4,2);\n\n      // Find solution for: a*t^3 + b*t^2 + c*d +d = 0\n      double a = a_dx*b_dy*c_dz - a_dx*b_dz*c_dy - a_dy*b_dx*c_dz + a_dy*b_dz*c_dx + a_dz*b_dx*c_dy - a_dz*b_dy*c_dx - a_dx*b_dy*d_dz + a_dx*b_dz*d_dy + a_dy*b_dx*d_dz - a_dy*b_dz*d_dx - a_dz*b_dx*d_dy + a_dz*b_dy*d_dx + a_dx*c_dy*d_dz - a_dx*c_dz*d_dy - a_dy*c_dx*d_dz + a_dy*c_dz*d_dx + a_dz*c_dx*d_dy - a_dz*c_dy*d_dx - b_dx*c_dy*d_dz + b_dx*c_dz*d_dy + b_dy*c_dx*d_dz - b_dy*c_dz*d_dx - b_dz*c_dx*d_dy + b_dz*c_dy*d_dx;\n\n      double b = a_dy*b_dz*c_x - a_dy*b_x*c_dz - a_dz*b_dy*c_x + a_dz*b_x*c_dy + a_x*b_dy*c_dz - a_x*b_dz*c_dy - a_dx*b_dz*c_y + a_dx*b_y*c_dz + a_dz*b_dx*c_y - a_dz*b_y*c_dx - a_y*b_dx*c_dz + a_y*b_dz*c_dx + a_dx*b_dy*c_z - a_dx*b_z*c_dy - a_dy*b_dx*c_z + a_dy*b_z*c_dx + a_z*b_dx*c_dy - a_z*b_dy*c_dx - a_dy*b_dz*d_x + a_dy*b_x*d_dz + a_dz*b_dy*d_x - a_dz*b_x*d_dy - a_x*b_dy*d_dz + a_x*b_dz*d_dy + a_dx*b_dz*d_y - a_dx*b_y*d_dz - a_dz*b_dx*d_y + a_dz*b_y*d_dx + a_y*b_dx*d_dz - a_y*b_dz*d_dx - a_dx*b_dy*d_z + a_dx*b_z*d_dy + a_dy*b_dx*d_z - a_dy*b_z*d_dx - a_z*b_dx*d_dy + a_z*b_dy*d_dx + a_dy*c_dz*d_x - a_dy*c_x*d_dz - a_dz*c_dy*d_x + a_dz*c_x*d_dy + a_x*c_dy*d_dz - a_x*c_dz*d_dy - a_dx*c_dz*d_y + a_dx*c_y*d_dz + a_dz*c_dx*d_y - a_dz*c_y*d_dx - a_y*c_dx*d_dz + a_y*c_dz*d_dx + a_dx*c_dy*d_z - a_dx*c_z*d_dy - a_dy*c_dx*d_z + a_dy*c_z*d_dx + a_z*c_dx*d_dy - a_z*c_dy*d_dx - b_dy*c_dz*d_x + b_dy*c_x*d_dz + b_dz*c_dy*d_x - b_dz*c_x*d_dy - b_x*c_dy*d_dz + b_x*c_dz*d_dy + b_dx*c_dz*d_y - b_dx*c_y*d_dz - b_dz*c_dx*d_y + b_dz*c_y*d_dx + b_y*c_dx*d_dz - b_y*c_dz*d_dx - b_dx*c_dy*d_z + b_dx*c_z*d_dy + b_dy*c_dx*d_z - b_dy*c_z*d_dx - b_z*c_dx*d_dy + b_z*c_dy*d_dx;\n\n      double c = a_dz*b_x*c_y - a_dz*b_y*c_x - a_x*b_dz*c_y + a_x*b_y*c_dz + a_y*b_dz*c_x - a_y*b_x*c_dz - a_dy*b_x*c_z + a_dy*b_z*c_x + a_x*b_dy*c_z - a_x*b_z*c_dy - a_z*b_dy*c_x + a_z*b_x*c_dy + a_dx*b_y*c_z - a_dx*b_z*c_y - a_y*b_dx*c_z + a_y*b_z*c_dx + a_z*b_dx*c_y - a_z*b_y*c_dx - a_dz*b_x*d_y + a_dz*b_y*d_x + a_x*b_dz*d_y - a_x*b_y*d_dz - a_y*b_dz*d_x + a_y*b_x*d_dz + a_dy*b_x*d_z - a_dy*b_z*d_x - a_x*b_dy*d_z + a_x*b_z*d_dy + a_z*b_dy*d_x - a_z*b_x*d_dy - a_dx*b_y*d_z + a_dx*b_z*d_y + a_y*b_dx*d_z - a_y*b_z*d_dx - a_z*b_dx*d_y + a_z*b_y*d_dx + a_dz*c_x*d_y - a_dz*c_y*d_x - a_x*c_dz*d_y + a_x*c_y*d_dz + a_y*c_dz*d_x - a_y*c_x*d_dz - a_dy*c_x*d_z + a_dy*c_z*d_x + a_x*c_dy*d_z - a_x*c_z*d_dy - a_z*c_dy*d_x + a_z*c_x*d_dy + a_dx*c_y*d_z - a_dx*c_z*d_y - a_y*c_dx*d_z + a_y*c_z*d_dx + a_z*c_dx*d_y - a_z*c_y*d_dx - b_dz*c_x*d_y + b_dz*c_y*d_x + b_x*c_dz*d_y - b_x*c_y*d_dz - b_y*c_dz*d_x + b_y*c_x*d_dz + b_dy*c_x*d_z - b_dy*c_z*d_x - b_x*c_dy*d_z + b_x*c_z*d_dy + b_z*c_dy*d_x - b_z*c_x*d_dy - b_dx*c_y*d_z + b_dx*c_z*d_y + b_y*c_dx*d_z - b_y*c_z*d_dx - b_z*c_dx*d_y + b_z*c_y*d_dx;\n\n      double d = a_x*b_y*c_z - a_x*b_z*c_y - a_y*b_x*c_z + a_y*b_z*c_x + a_z*b_x*c_y - a_z*b_y*c_x - a_x*b_y*d_z + a_x*b_z*d_y + a_y*b_x*d_z - a_y*b_z*d_x - a_z*b_x*d_y + a_z*b_y*d_x + a_x*c_y*d_z - a_x*c_z*d_y - a_y*c_x*d_z + a_y*c_z*d_x + a_z*c_x*d_y - a_z*c_y*d_x - b_x*c_y*d_z + b_x*c_z*d_y + b_y*c_x*d_z - b_y*c_z*d_x - b_z*c_x*d_y + b_z*c_y*d_x;\n\n      if (a==0)\n      {\n        return get_smallest_pos_quad_zero(b,c,d);\n      }\n      b/=a; c/=a; d/=a; // normalize it all\n      std::vector<double> res(3);\n      int real_roots_num = SolveP3(res,b,c,d);\n      switch (real_roots_num)\n      {\n        case 1:\n          return (res[0] >= 0) ? res[0]:INFINITY;\n        case 2:\n        {\n          double max_root = max(res[0],res[1]); double min_root = min(res[0],res[1]);\n          if (min_root > 0) return min_root;\n          if (max_root > 0) return max_root;\n          return INFINITY;\n        }\n        case 3:\n        default:\n        {\n          std::sort(res.begin(),res.end());\n          if (res[0] > 0) return res[0];\n          if (res[1] > 0) return res[1];\n          if (res[2] > 0) return res[2];\n          return INFINITY;\n        }\n      }\n    }\n\n    IGL_INLINE double compute_max_step_from_singularities(const Eigen::MatrixXd& uv,\n                                                          const Eigen::MatrixXi& F,\n                                                          Eigen::MatrixXd& d)\n    {\n      using namespace std;\n      double max_step = INFINITY;\n\n      // The if statement is outside the for loops to avoid branching/ease parallelizing\n      if (uv.cols() == 2)\n      {\n        for (int f = 0; f < F.rows(); f++)\n        {\n          double min_positive_root = get_min_pos_root_2D(uv,F,d,f);\n          max_step = min(max_step, min_positive_root);\n        }\n      }\n      else\n      { // volumetric deformation\n        for (int f = 0; f < F.rows(); f++)\n        {\n          double min_positive_root = get_min_pos_root_3D(uv,F,d,f);\n          max_step = min(max_step, min_positive_root);\n        }\n      }\n      return max_step;\n    }\n  }\n}\n\nIGL_INLINE double igl::flip_avoiding_line_search(\n  const Eigen::MatrixXi F,\n  Eigen::MatrixXd& cur_v,\n  Eigen::MatrixXd& dst_v,\n  std::function<double(Eigen::MatrixXd&)> energy,\n  double cur_energy)\n{\n  using namespace std;\n  Eigen::MatrixXd d = dst_v - cur_v;\n\n  double min_step_to_singularity = igl::flip_avoiding::compute_max_step_from_singularities(cur_v,F,d);\n  double max_step_size = min(1., min_step_to_singularity*0.8);\n\n  return igl::line_search(cur_v,d,max_step_size, energy, cur_energy);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/flip_avoiding_line_search.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2016 Michael Rabinovich\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_FLIP_AVOIDING_LINE_SEARCH_H\n#define IGL_FLIP_AVOIDING_LINE_SEARCH_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Dense>\n\nnamespace igl\n{\n  // A bisection line search for a mesh based energy that avoids triangle flips as suggested in\n  // \t\t\"Bijective Parameterization with Free Boundaries\" (Smith J. and Schaefer S., 2015).\n  //\n  // The user specifies an initial vertices position (that has no flips) and target one (that my have flipped triangles).\n  // This method first computes the largest step in direction of the destination vertices that does not incur flips,\n  // and then minimizes a given energy using this maximal step and a bisection linesearch (see igl::line_search).\n  //\n  // Supports both triangle and tet meshes.\n  //\n  // Inputs:\n  //   F  #F by 3/4 \t\t\t\tlist of mesh faces or tets\n  //   cur_v  \t\t\t\t\t\t#V by dim list of variables\n  //   dst_v  \t\t\t\t\t\t#V by dim list of target vertices. This mesh may have flipped triangles\n  //   energy       \t\t\t    A function to compute the mesh-based energy (return an energy that is bigger than 0)\n  //   cur_energy(OPTIONAL)         The energy at the given point. Helps save redundant computations.\n  //\t\t\t\t\t\t\t    This is optional. If not specified, the function will compute it.\n  // Outputs:\n  //\t\tcur_v  \t\t\t\t\t\t#V by dim list of variables at the new location\n  // Returns the energy at the new point\n  IGL_INLINE double flip_avoiding_line_search(\n    const Eigen::MatrixXi F,\n    Eigen::MatrixXd& cur_v,\n    Eigen::MatrixXd& dst_v,\n    std::function<double(Eigen::MatrixXd&)> energy,\n    double cur_energy = -1);\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"flip_avoiding_line_search.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/flip_edge.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Qingan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"flip_edge.h\"\n\ntemplate <\n  typename DerivedF,\n  typename DerivedE,\n  typename DeriveduE,\n  typename DerivedEMAP,\n  typename uE2EType>\nIGL_INLINE void igl::flip_edge(\n  Eigen::PlainObjectBase<DerivedF> & F,\n  Eigen::PlainObjectBase<DerivedE> & E,\n  Eigen::PlainObjectBase<DeriveduE> & uE,\n  Eigen::PlainObjectBase<DerivedEMAP> & EMAP,\n  std::vector<std::vector<uE2EType> > & uE2E,\n  const size_t uei)\n{\n  typedef typename DerivedF::Scalar Index;\n  const size_t num_faces = F.rows();\n  assert(F.cols() == 3);\n  //          v1                 v1\n  //          /|\\                / \\\n  //         / | \\              /f1 \\\n  //     v3 /f2|f1\\ v4  =>  v3 /_____\\ v4\n  //        \\  |  /            \\ f2  /\n  //         \\ | /              \\   /\n  //          \\|/                \\ /\n  //          v2                 v2\n  auto& half_edges = uE2E[uei];\n  if (half_edges.size() != 2) {\n    throw \"Cannot flip non-manifold or boundary edge\";\n  }\n\n  const size_t f1 = half_edges[0] % num_faces;\n  const size_t f2 = half_edges[1] % num_faces;\n  const size_t c1 = half_edges[0] / num_faces;\n  const size_t c2 = half_edges[1] / num_faces;\n  assert(c1 < 3);\n  assert(c2 < 3);\n\n  assert(f1 != f2);\n  const size_t v1 = F(f1, (c1+1)%3);\n  const size_t v2 = F(f1, (c1+2)%3);\n  const size_t v4 = F(f1, c1);\n  const size_t v3 = F(f2, c2);\n  assert(F(f2, (c2+2)%3) == v1);\n  assert(F(f2, (c2+1)%3) == v2);\n\n  const size_t e_12 = half_edges[0];\n  const size_t e_24 = f1 + ((c1 + 1) % 3) * num_faces;\n  const size_t e_41 = f1 + ((c1 + 2) % 3) * num_faces;\n  const size_t e_21 = half_edges[1];\n  const size_t e_13 = f2 + ((c2 + 1) % 3) * num_faces;\n  const size_t e_32 = f2 + ((c2 + 2) % 3) * num_faces;\n  assert(E(e_12, 0) == v1);\n  assert(E(e_12, 1) == v2);\n  assert(E(e_24, 0) == v2);\n  assert(E(e_24, 1) == v4);\n  assert(E(e_41, 0) == v4);\n  assert(E(e_41, 1) == v1);\n  assert(E(e_21, 0) == v2);\n  assert(E(e_21, 1) == v1);\n  assert(E(e_13, 0) == v1);\n  assert(E(e_13, 1) == v3);\n  assert(E(e_32, 0) == v3);\n  assert(E(e_32, 1) == v2);\n\n  const size_t ue_24 = EMAP(e_24);\n  const size_t ue_41 = EMAP(e_41);\n  const size_t ue_13 = EMAP(e_13);\n  const size_t ue_32 = EMAP(e_32);\n\n  F(f1, 0) = v1;\n  F(f1, 1) = v3;\n  F(f1, 2) = v4;\n  F(f2, 0) = v2;\n  F(f2, 1) = v4;\n  F(f2, 2) = v3;\n\n  uE(uei, 0) = v3;\n  uE(uei, 1) = v4;\n\n  const size_t new_e_34 = f1;\n  const size_t new_e_41 = f1 + num_faces;\n  const size_t new_e_13 = f1 + num_faces*2;\n  const size_t new_e_43 = f2;\n  const size_t new_e_32 = f2 + num_faces;\n  const size_t new_e_24 = f2 + num_faces*2;\n\n  E(new_e_34, 0) = v3;\n  E(new_e_34, 1) = v4;\n  E(new_e_41, 0) = v4;\n  E(new_e_41, 1) = v1;\n  E(new_e_13, 0) = v1;\n  E(new_e_13, 1) = v3;\n  E(new_e_43, 0) = v4;\n  E(new_e_43, 1) = v3;\n  E(new_e_32, 0) = v3;\n  E(new_e_32, 1) = v2;\n  E(new_e_24, 0) = v2;\n  E(new_e_24, 1) = v4;\n\n  EMAP(new_e_34) = uei;\n  EMAP(new_e_43) = uei;\n  EMAP(new_e_41) = ue_41;\n  EMAP(new_e_13) = ue_13;\n  EMAP(new_e_32) = ue_32;\n  EMAP(new_e_24) = ue_24;\n\n  auto replace = [](std::vector<Index>& array, Index old_v, Index new_v) {\n    std::replace(array.begin(), array.end(), old_v, new_v);\n  };\n  replace(uE2E[uei], e_12, new_e_34);\n  replace(uE2E[uei], e_21, new_e_43);\n  replace(uE2E[ue_13], e_13, new_e_13);\n  replace(uE2E[ue_32], e_32, new_e_32);\n  replace(uE2E[ue_24], e_24, new_e_24);\n  replace(uE2E[ue_41], e_41, new_e_41);\n\n#ifndef NDEBUG\n  auto sanity_check = [&](size_t ue) {\n    const auto& adj_faces = uE2E[ue];\n    if (adj_faces.size() == 2) {\n      const size_t first_f  = adj_faces[0] % num_faces;\n      const size_t first_c  = adj_faces[0] / num_faces;\n      const size_t second_f = adj_faces[1] % num_faces;\n      const size_t second_c = adj_faces[1] / num_faces;\n      const size_t vertex_0 = F(first_f, (first_c+1) % 3);\n      const size_t vertex_1 = F(first_f, (first_c+2) % 3);\n      assert(vertex_0 == F(second_f, (second_c+2) % 3));\n      assert(vertex_1 == F(second_f, (second_c+1) % 3));\n    }\n  };\n\n  sanity_check(uei);\n  sanity_check(ue_13);\n  sanity_check(ue_32);\n  sanity_check(ue_24);\n  sanity_check(ue_41);\n#endif\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/flip_edge.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Qingan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_FLIP_EDGE_H\n#define IGL_FLIP_EDGE_H\n\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <vector>\n\nnamespace igl\n{\n  // Flip an edge in a triangle mesh.  The edge specified by uei must have\n  // exactly **two** adjacent faces.  Violation will result in exception.\n  // Another warning: edge flipping could convert manifold mesh into\n  // non-manifold.\n  //\n  // Inputs:\n  //   F    #F by 3 list of triangles.\n  //   E    #F*3 by 2 list of all of directed edges\n  //   uE   #uE by 2 list of unique undirected edges\n  //   EMAP #F*3 list of indices into uE, mapping each directed edge to unique\n  //        undirected edge\n  //   uE2E #uE list of lists of indices into E of coexisting edges\n  //   ue   index into uE the edge to be flipped.\n  //\n  // Output:\n  //   Updated F, E, uE, EMAP and uE2E.\n  template <\n    typename DerivedF,\n    typename DerivedE,\n    typename DeriveduE,\n    typename DerivedEMAP,\n    typename uE2EType>\n  IGL_INLINE void flip_edge(\n    Eigen::PlainObjectBase<DerivedF> & F,\n    Eigen::PlainObjectBase<DerivedE> & E,\n    Eigen::PlainObjectBase<DeriveduE> & uE,\n    Eigen::PlainObjectBase<DerivedEMAP> & EMAP,\n    std::vector<std::vector<uE2EType> > & uE2E,\n    const size_t uei);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"flip_edge.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/flipped_triangles.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2016 Michael Rabinovich <michaelrabinovich27@gmail.com@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"flipped_triangles.h\"\n\n#include \"list_to_matrix.h\"\n#include <vector>\ntemplate <typename DerivedV, typename DerivedF, typename DerivedX>\nIGL_INLINE void igl::flipped_triangles(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  Eigen::PlainObjectBase<DerivedX> & X)\n{\n  assert(V.cols() == 2 && \"V should contain 2D positions\");\n  std::vector<typename DerivedX::Scalar> flip_idx;\n  for (int i = 0; i < F.rows(); i++)\n  {\n    // https://www.cs.cmu.edu/~quake/robust.html\n    typedef Eigen::Matrix<typename DerivedV::Scalar,1,2> RowVector2S;\n    RowVector2S v1_n = V.row(F(i,0));\n    RowVector2S v2_n = V.row(F(i,1));\n    RowVector2S v3_n = V.row(F(i,2));\n    Eigen::Matrix<typename DerivedV::Scalar,3,3> T2_Homo;\n    T2_Homo.col(0) << v1_n(0),v1_n(1),1.;\n    T2_Homo.col(1) << v2_n(0),v2_n(1),1.;\n    T2_Homo.col(2) << v3_n(0),v3_n(1),1.;\n    double det = T2_Homo.determinant();\n    assert(det == det && \"det should not be NaN\");\n    if (det < 0)\n    {\n      flip_idx.push_back(i);\n    }\n  }\n  igl::list_to_matrix(flip_idx,X);\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE Eigen::VectorXi igl::flipped_triangles(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedF> & F)\n{\n  Eigen::VectorXi X;\n  flipped_triangles(V,F,X);\n  return X;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::flipped_triangles<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate Eigen::Matrix<int, -1, 1, 0, -1, 1> igl::flipped_triangles<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/flipped_triangles.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2016 Michael Rabinovich <michaelrabinovich27@gmail.com@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_FLIPPED_TRIANGLES_H\n#define IGL_FLIPPED_TRIANGLES_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Dense>\nnamespace igl\n{\n  // Finds the ids of the flipped triangles of the mesh V,F in the UV mapping uv\n  //\n  // Inputs:\n  //   V  #V by 2 list of mesh vertex positions\n  //   F  #F by 3 list of mesh faces (must be triangles)\n  // Outputs:\n  //   X  #flipped list of containing the indices into F of the flipped triangles\n  // Wrapper with return type\n  template <typename DerivedV, typename DerivedF, typename DerivedX>\n  IGL_INLINE void flipped_triangles(\n    const Eigen::PlainObjectBase<DerivedV> & V,\n    const Eigen::PlainObjectBase<DerivedF> & F,\n    Eigen::PlainObjectBase<DerivedX> & X);\n  template <typename Scalar, typename Index>\n  IGL_INLINE Eigen::VectorXi flipped_triangles(\n    const Eigen::PlainObjectBase<Scalar> & V,\n    const Eigen::PlainObjectBase<Index> & F);\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"flipped_triangles.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/flood_fill.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"flood_fill.h\"\n#include <limits>\n\nIGL_INLINE void igl::flood_fill(\n  const Eigen::RowVector3i & res,\n  Eigen::VectorXd & S)\n{\n  using namespace Eigen;\n  using namespace std;\n  const auto flood = [&res,&S] (\n     const int xi, \n     const int yi, \n     const int zi,\n     const int signed_xi, \n     const int signed_yi, \n     const int signed_zi,\n     const double s)\n    {\n      // flood fill this value back on this row\n      for(int bxi = xi;signed_xi<--bxi;)\n      {\n        S(bxi+res(0)*(yi + res(1)*zi)) = s;\n      }\n      // flood fill this value back on any previous rows\n      for(int byi = yi;signed_yi<--byi;)\n      {\n        for(int xi = 0;xi<res(0);xi++)\n        {\n          S(xi+res(0)*(byi + res(1)*zi)) = s;\n        }\n      }\n      // flood fill this value back on any previous \"sheets\"\n      for(int bzi = zi;signed_zi<--bzi;)\n      {\n        for(int yi = 0;yi<res(1);yi++)\n        {\n          for(int xi = 0;xi<res(0);xi++)\n          {\n            S(xi+res(0)*(yi + res(1)*bzi)) = s;\n          }\n        }\n      }\n    };\n  int signed_zi = -1;\n  double s = numeric_limits<double>::quiet_NaN();\n  for(int zi = 0;zi<res(2);zi++)\n  {\n    int signed_yi = -1;\n    if(zi != 0)\n    {\n      s = S(0+res(0)*(0 + res(1)*(zi-1)));\n    }\n    for(int yi = 0;yi<res(1);yi++)\n    {\n      // index of last signed item on this row\n      int signed_xi = -1;\n      if(yi != 0)\n      {\n        s = S(0+res(0)*(yi-1 + res(1)*zi));\n      }\n      for(int xi = 0;xi<res(0);xi++)\n      {\n        int i = xi+res(0)*(yi + res(1)*zi);\n        if(S(i)!=S(i))\n        {\n          if(s == s)\n          {\n            S(i) = s;\n          }\n          continue;\n        }\n        s = S(i);\n        flood(xi,yi,zi,signed_xi,signed_yi,signed_zi,s);\n        // remember this position\n        signed_xi = xi;\n        signed_yi = yi;\n        signed_zi = zi;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/flood_fill.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_FLOOD_FILL_H\n#define IGL_FLOOD_FILL_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Given a 3D array with sparse non-nan (number?) data fill in the NaNs via\n  // flood fill. This should ensure that, e.g., if data near 0 always has a band\n  // (surface) of numbered and signed data, then components of nans will be\n  // correctly signed.\n  //\n  // Inputs:\n  //   res  3-long list of dimensions of grid\n  //   S  res(0)*res(1)*res(2)  list of scalar values (with (many) nans), see\n  //     output\n  // Outputs:\n  //   S  flood fill data in place\n  IGL_INLINE void flood_fill(const Eigen::RowVector3i& res, Eigen::VectorXd& S);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"flood_fill.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/floor.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"floor.h\"\n#include <cmath>\n#include <iostream>\n\ntemplate < typename DerivedX, typename DerivedY>\nIGL_INLINE void igl::floor(\n  const Eigen::PlainObjectBase<DerivedX>& X,\n  Eigen::PlainObjectBase<DerivedY>& Y)\n{\n  using namespace std;\n  //Y = DerivedY::Zero(m,n);\n//#pragma omp parallel for\n  //for(int i = 0;i<m;i++)\n  //{\n  //  for(int j = 0;j<n;j++)\n  //  {\n  //    Y(i,j) = std::floor(X(i,j));\n  //  }\n  //}\n  typedef typename DerivedX::Scalar Scalar;\n  Y = X.unaryExpr([](const Scalar &x)->Scalar{return std::floor(x);}).template cast<typename DerivedY::Scalar >();\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::floor<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::floor<Eigen::Array<double, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Array<double, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::floor<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/floor.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_FLOOR_H\n#define IGL_FLOOR_H\n#include \"igl_inline.h\"\n#include <Eigen/Dense>\nnamespace igl\n{\n  // Floor a given matrix to nearest integers \n  //\n  // Inputs:\n  //   X  m by n matrix of scalars\n  // Outputs:\n  //   Y  m by n matrix of floored integers\n  template < typename DerivedX, typename DerivedY>\n  IGL_INLINE void floor(\n    const Eigen::PlainObjectBase<DerivedX>& X,\n    Eigen::PlainObjectBase<DerivedY>& Y);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"floor.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/for_each.h",
    "content": "#ifndef IGL_FOR_EACH_H\n#define IGL_FOR_EACH_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <Eigen/Sparse>\nnamespace igl\n{\n  // FOR_EACH  Call a given function for each non-zero (i.e., explicit value\n  // might actually be ==0) in a Sparse Matrix A _in order (of storage)_. This is\n  // useless unless func has _side-effects_.\n  //\n  // Inputs:\n  //   A  m by n SparseMatrix\n  //   func  function handle with prototype \"compatible with\" `void (Index i,\n  //     Index j, Scalar & v)`. Return values will be ignored.\n  //\n  // See also: std::for_each\n  template <typename AType, typename Func>\n  inline void for_each(\n    const Eigen::SparseMatrix<AType> & A,\n    const Func & func);\n  template <typename DerivedA, typename Func>\n  inline void for_each(\n    const Eigen::DenseBase<DerivedA> & A,\n    const Func & func);\n}\n\n// Implementation\n\ntemplate <typename AType, typename Func>\ninline void igl::for_each(\n  const Eigen::SparseMatrix<AType> & A,\n  const Func & func)\n{\n  // Can **not** use parallel for because this must be _in order_\n  // Iterate over outside\n  for(int k=0; k<A.outerSize(); ++k)\n  {\n    // Iterate over inside\n    for(typename Eigen::SparseMatrix<AType>::InnerIterator it (A,k); it; ++it)\n    {\n      func(it.row(),it.col(),it.value());\n    }\n  }\n}\n\ntemplate <typename DerivedA, typename Func>\ninline void igl::for_each(\n  const Eigen::DenseBase<DerivedA> & A,\n  const Func & func)\n{\n  // Can **not** use parallel for because this must be _in order_\n  if(A.IsRowMajor)\n  {\n    for(typename DerivedA::Index i = 0;i<A.rows();i++)\n    {\n      for(typename DerivedA::Index j = 0;j<A.cols();j++)\n      {\n        func(i,j,A(i,j));\n      }\n    }\n  }else\n  {\n    for(typename DerivedA::Index j = 0;j<A.cols();j++)\n    {\n      for(typename DerivedA::Index i = 0;i<A.rows();i++)\n      {\n        func(i,j,A(i,j));\n      }\n    }\n  }\n  \n}\n\n//#ifndef IGL_STATIC_LIBRARY\n//#  include \"for_each.cpp\"\n//#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/forward_kinematics.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"forward_kinematics.h\"\n#include <functional>\n#include <iostream>\n\nIGL_INLINE void igl::forward_kinematics(\n  const Eigen::MatrixXd & C,\n  const Eigen::MatrixXi & BE,\n  const Eigen::VectorXi & P,\n  const std::vector<\n    Eigen::Quaterniond,Eigen::aligned_allocator<Eigen::Quaterniond> > & dQ,\n  const std::vector<Eigen::Vector3d> & dT,\n  std::vector<\n    Eigen::Quaterniond,Eigen::aligned_allocator<Eigen::Quaterniond> > & vQ,\n  std::vector<Eigen::Vector3d> & vT)\n{\n  using namespace std;\n  using namespace Eigen;\n  const int m = BE.rows(); \n  assert(m == P.rows());\n  assert(m == (int)dQ.size());\n  assert(m == (int)dT.size());\n  vector<bool> computed(m,false);\n  vQ.resize(m);\n  vT.resize(m);\n  // Dynamic programming\n  function<void (int) > fk_helper = [&] (int b)\n  {\n    if(!computed[b])\n    {\n      if(P(b) < 0)\n      {\n        // base case for roots\n        vQ[b] = dQ[b];\n        const Vector3d r = C.row(BE(b,0)).transpose();\n        vT[b] = r-dQ[b]*r + dT[b];\n      }else\n      {\n        // Otherwise first compute parent's\n        const int p = P(b);\n        fk_helper(p);\n        vQ[b] = vQ[p] * dQ[b];\n        const Vector3d r = C.row(BE(b,0)).transpose();\n        vT[b] = vT[p] - vQ[b]*r + vQ[p]*(r + dT[b]);\n      }\n      computed[b] = true;\n    }\n  };\n  for(int b = 0;b<m;b++)\n  {\n    fk_helper(b);\n  }\n}\n\nIGL_INLINE void igl::forward_kinematics(\n  const Eigen::MatrixXd & C,\n  const Eigen::MatrixXi & BE,\n  const Eigen::VectorXi & P,\n  const std::vector<\n    Eigen::Quaterniond,Eigen::aligned_allocator<Eigen::Quaterniond> > & dQ,\n  std::vector<\n    Eigen::Quaterniond,Eigen::aligned_allocator<Eigen::Quaterniond> > & vQ,\n  std::vector<Eigen::Vector3d> & vT)\n{\n  std::vector<Eigen::Vector3d> dT(BE.rows(),Eigen::Vector3d(0,0,0));\n  return forward_kinematics(C,BE,P,dQ,dT,vQ,vT);\n}\n\nIGL_INLINE void igl::forward_kinematics(\n  const Eigen::MatrixXd & C,\n  const Eigen::MatrixXi & BE,\n  const Eigen::VectorXi & P,\n  const std::vector<\n    Eigen::Quaterniond,Eigen::aligned_allocator<Eigen::Quaterniond> > & dQ,\n  const std::vector<Eigen::Vector3d> & dT,\n  Eigen::MatrixXd & T)\n{\n  using namespace Eigen;\n  using namespace std;\n  vector< Quaterniond,aligned_allocator<Quaterniond> > vQ;\n  vector< Vector3d> vT;\n  forward_kinematics(C,BE,P,dQ,dT,vQ,vT);\n  const int dim = C.cols();\n  T.resize(BE.rows()*(dim+1),dim);\n  for(int e = 0;e<BE.rows();e++)\n  {\n    Affine3d a = Affine3d::Identity();\n    a.translate(vT[e]);\n    a.rotate(vQ[e]);\n    T.block(e*(dim+1),0,dim+1,dim) =\n      a.matrix().transpose().block(0,0,dim+1,dim);\n  }\n}\n\nIGL_INLINE void igl::forward_kinematics(\n  const Eigen::MatrixXd & C,\n  const Eigen::MatrixXi & BE,\n  const Eigen::VectorXi & P,\n  const std::vector<\n    Eigen::Quaterniond,Eigen::aligned_allocator<Eigen::Quaterniond> > & dQ,\n  Eigen::MatrixXd & T)\n{\n  std::vector<Eigen::Vector3d> dT(BE.rows(),Eigen::Vector3d(0,0,0));\n  return forward_kinematics(C,BE,P,dQ,dT,T);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/forward_kinematics.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_FORWARD_KINEMATICS_H\n#define IGL_FORWARD_KINEMATICS_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <Eigen/Geometry>\n#include <Eigen/StdVector>\n#include <vector>\n\nnamespace igl\n{\n  // Given a skeleton and a set of relative bone rotations compute absolute\n  // rigid transformations for each bone.\n  //\n  // Inputs:\n  //   C  #C by dim list of joint positions\n  //   BE  #BE by 2 list of bone edge indices\n  //   P  #BE list of parent indices into BE\n  //   dQ  #BE list of relative rotations\n  //   dT  #BE list of relative translations\n  // Outputs:\n  //   vQ  #BE list of absolute rotations\n  //   vT  #BE list of absolute translations\n  IGL_INLINE void forward_kinematics(\n    const Eigen::MatrixXd & C,\n    const Eigen::MatrixXi & BE,\n    const Eigen::VectorXi & P,\n    const std::vector<\n      Eigen::Quaterniond,Eigen::aligned_allocator<Eigen::Quaterniond> > & dQ,\n    const std::vector<Eigen::Vector3d> & dT,\n    std::vector<\n      Eigen::Quaterniond,Eigen::aligned_allocator<Eigen::Quaterniond> > & vQ,\n    std::vector<Eigen::Vector3d> & vT);\n  // Wrapper assuming each dT[i] == {0,0,0}\n  IGL_INLINE void forward_kinematics(\n    const Eigen::MatrixXd & C,\n    const Eigen::MatrixXi & BE,\n    const Eigen::VectorXi & P,\n    const std::vector<\n      Eigen::Quaterniond,Eigen::aligned_allocator<Eigen::Quaterniond> > & dQ,\n    std::vector<\n      Eigen::Quaterniond,Eigen::aligned_allocator<Eigen::Quaterniond> > & vQ,\n    std::vector<Eigen::Vector3d> & vT);\n\n  // Outputs:\n  //   T  #BE*(dim+1) by dim stack of transposed transformation matrices\n  IGL_INLINE void forward_kinematics(\n    const Eigen::MatrixXd & C,\n    const Eigen::MatrixXi & BE,\n    const Eigen::VectorXi & P,\n    const std::vector<\n      Eigen::Quaterniond,Eigen::aligned_allocator<Eigen::Quaterniond> > & dQ,\n    const std::vector<Eigen::Vector3d> & dT,\n    Eigen::MatrixXd & T);\n  IGL_INLINE void forward_kinematics(\n    const Eigen::MatrixXd & C,\n    const Eigen::MatrixXi & BE,\n    const Eigen::VectorXi & P,\n    const std::vector<\n      Eigen::Quaterniond,Eigen::aligned_allocator<Eigen::Quaterniond> > & dQ,\n    Eigen::MatrixXd & T);\n\n};\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"forward_kinematics.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/frame_field_deformer.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"frame_field_deformer.h\"\n\n#include <Eigen/Dense>\n#include <Eigen/Sparse>\n#include <vector>\n\n#include <igl/cotmatrix_entries.h>\n#include <igl/cotmatrix.h>\n#include <igl/vertex_triangle_adjacency.h>\n\nnamespace igl\n{\n\nclass Frame_field_deformer\n{\npublic:\n\n  IGL_INLINE Frame_field_deformer();\n  IGL_INLINE ~Frame_field_deformer();\n\n  // Initialize the optimizer\n  IGL_INLINE void init(const Eigen::MatrixXd& _V, const Eigen::MatrixXi& _F, const Eigen::MatrixXd& _D1, const Eigen::MatrixXd& _D2, double _Lambda, double _perturb_rotations, int _fixed = 1);\n\n  // Run N optimization steps\n  IGL_INLINE void optimize(int N, bool reset = false);\n\n  // Reset optimization\n  IGL_INLINE void reset_opt();\n\n  // Precomputation of all components\n  IGL_INLINE void precompute_opt();\n\n  // Precomputation for deformation energy\n  IGL_INLINE void precompute_ARAP(Eigen::SparseMatrix<double> & Lff, Eigen::MatrixXd & LfcVc);\n\n  // Precomputation for regularization\n  IGL_INLINE void precompute_SMOOTH(Eigen::SparseMatrix<double> & MS, Eigen::MatrixXd & bS);\n\n  // extracts a r x c block from sparse matrix mat into sparse matrix m1\n  // (r0,c0) is upper left entry of block\n  IGL_INLINE void extractBlock(Eigen::SparseMatrix<double> & mat, int r0, int c0, int r, int c, Eigen::SparseMatrix<double> & m1);\n\n  // computes optimal rotations for faces of m wrt current coords in mw.V\n  // returns a 3x3 matrix\n  IGL_INLINE void compute_optimal_rotations();\n\n  // global optimization step - linear system\n  IGL_INLINE void compute_optimal_positions();\n\n  // compute the output XField from deformation gradient\n  IGL_INLINE void computeXField(std::vector< Eigen::Matrix<double,3,2> > & XF);\n\n  // computes in WW the ideal warp at each tri to make the frame field a cross\n  IGL_INLINE void compute_idealWarp(std::vector< Eigen::Matrix<double,3,3> > & WW);\n\n  // -------------------------------- Variables ----------------------------------------------------\n\n  // Mesh I/O:\n\n  Eigen::MatrixXd V;                         // Original mesh - vertices\n  Eigen::MatrixXi F;                         // Original mesh - faces\n\n  std::vector<std::vector<int> > VT;                   // Vertex to triangle topology\n  std::vector<std::vector<int> > VTi;                  // Vertex to triangle topology\n\n  Eigen::MatrixXd V_w;                       // Warped mesh - vertices\n\n  std::vector< Eigen::Matrix<double,3,2> > FF;  \t// frame field FF in 3D (parallel to m.F)\n  std::vector< Eigen::Matrix<double,3,3> > WW;    // warping matrices to make a cross field (parallel to m.F)\n  std::vector< Eigen::Matrix<double,3,2> > XF;  \t// pseudo-cross field from solution (parallel to m.F)\n\n  int fixed;\n\n  double perturb_rotations; // perturbation to rotation matrices\n\n  // Numerics\n  int nfree,nconst;\t\t\t\t\t          // number of free/constrained vertices in the mesh - default all-but-1/1\n  Eigen::MatrixXd C;\t\t\t\t\t\t\t            // cotangent matrix of m\n  Eigen::SparseMatrix<double> L;\t\t\t\t\t          // Laplacian matrix of m\n\n  Eigen::SparseMatrix<double> M;\t\t\t\t\t          // matrix for global optimization - pre-conditioned\n  Eigen::MatrixXd RHS;\t\t\t\t\t\t            // pre-computed part of known term in global optimization\n  std::vector< Eigen::Matrix<double,3,3> > RW;    // optimal rotation-warping matrices (parallel to m.F) -- INCORPORATES WW\n  Eigen::SimplicialCholesky<Eigen::SparseMatrix<double> > solver;   // solver for linear system in global opt.\n\n  // Parameters\nprivate:\n  double Lambda = 0.1;\t\t\t\t        // weight of energy regularization\n\n};\n\n  IGL_INLINE Frame_field_deformer::Frame_field_deformer() {}\n\n  IGL_INLINE Frame_field_deformer::~Frame_field_deformer() {}\n\n  IGL_INLINE void Frame_field_deformer::init(const Eigen::MatrixXd& _V,\n                          const Eigen::MatrixXi& _F,\n                          const Eigen::MatrixXd& _D1,\n                          const Eigen::MatrixXd& _D2,\n                          double _Lambda,\n                          double _perturb_rotations,\n                          int _fixed)\n{\n  V = _V;\n  F = _F;\n\n  assert(_D1.rows() == _D2.rows());\n\n  FF.clear();\n  for (unsigned i=0; i < _D1.rows(); ++i)\n  {\n    Eigen::Matrix<double,3,2> ff;\n    ff.col(0) = _D1.row(i);\n    ff.col(1) = _D2.row(i);\n    FF.push_back(ff);\n  }\n\n  fixed = _fixed;\n  Lambda = _Lambda;\n  perturb_rotations = _perturb_rotations;\n\n  reset_opt();\n  precompute_opt();\n}\n\n\nIGL_INLINE void Frame_field_deformer::optimize(int N, bool reset)\n{\n  //Reset optimization\n\tif (reset)\n    reset_opt();\n\n\t// Iterative Local/Global optimization\n  for (int i=0; i<N;i++)\n  {\n    compute_optimal_rotations();\n    compute_optimal_positions();\n\t\tcomputeXField(XF);\n  }\n}\n\nIGL_INLINE void Frame_field_deformer::reset_opt()\n{\n  V_w = V;\n\n  for (unsigned i=0; i<V_w.rows(); ++i)\n    for (unsigned j=0; j<V_w.cols(); ++j)\n      V_w(i,j) += (double(rand())/double(RAND_MAX))*10e-4*perturb_rotations;\n\n}\n\n// precomputation of all components\nIGL_INLINE void Frame_field_deformer::precompute_opt()\n{\n  using namespace Eigen;\n\tnfree = V.rows() - fixed;\t\t\t\t\t\t    // free vertices (at the beginning ov m.V) - global\n  nconst = V.rows()-nfree;\t\t\t\t\t\t// #constrained vertices\n  igl::vertex_triangle_adjacency(V,F,VT,VTi);                // compute vertex to face relationship\n\n  igl::cotmatrix_entries(V,F,C);\t\t\t\t\t\t\t     // cotangent matrix for opt. rotations - global\n\n  igl::cotmatrix(V,F,L);\n\n\tSparseMatrix<double> MA;\t\t\t\t\t\t// internal matrix for ARAP-warping energy\n\tMatrixXd LfcVc;\t\t\t\t\t\t\t\t\t\t  // RHS (partial) for ARAP-warping energy\n\tSparseMatrix<double> MS;\t\t\t\t\t\t// internal matrix for smoothing energy\n\tMatrixXd bS;\t\t\t\t\t\t\t\t\t\t    // RHS (full) for smoothing energy\n\n\tprecompute_ARAP(MA,LfcVc);\t\t\t\t\t// precompute terms for the ARAP-warp part\n\tprecompute_SMOOTH(MS,bS);\t\t\t\t\t\t// precompute terms for the smoothing part\n\tcompute_idealWarp(WW);              // computes the ideal warps\n  RW.resize(F.rows());\t\t\t\t\t\t\t\t// init rotation matrices - global\n\n  M =\t  (1-Lambda)*MA + Lambda*MS;\t\t// matrix for linear system - global\n\n\tRHS = (1-Lambda)*LfcVc + Lambda*bS;\t// RHS (partial) for linear system - global\n  solver.compute(M);\t\t\t\t\t\t\t\t\t// system pre-conditioning\n  if (solver.info()!=Eigen::Success) {fprintf(stderr,\"Decomposition failed in pre-conditioning!\\n\"); exit(-1);}\n\n\tfprintf(stdout,\"Preconditioning done.\\n\");\n\n}\n\nIGL_INLINE void Frame_field_deformer::precompute_ARAP(Eigen::SparseMatrix<double> & Lff, Eigen::MatrixXd & LfcVc)\n{\n  using namespace Eigen;\n\tfprintf(stdout,\"Precomputing ARAP terms\\n\");\n\tSparseMatrix<double> LL = -4*L;\n\tLff = SparseMatrix<double>(nfree,nfree);\n  extractBlock(LL,0,0,nfree,nfree,Lff);\n\tSparseMatrix<double> Lfc = SparseMatrix<double>(nfree,nconst);\n  extractBlock(LL,0,nfree,nfree,nconst,Lfc);\n\tLfcVc = - Lfc * V_w.block(nfree,0,nconst,3);\n}\n\nIGL_INLINE void Frame_field_deformer::precompute_SMOOTH(Eigen::SparseMatrix<double> & MS, Eigen::MatrixXd & bS)\n{\n  using namespace Eigen;\n\tfprintf(stdout,\"Precomputing SMOOTH terms\\n\");\n\n\tSparseMatrix<double> LL = 4*L*L;\n\n  // top-left\n\tMS = SparseMatrix<double>(nfree,nfree);\n  extractBlock(LL,0,0,nfree,nfree,MS);\n\n  // top-right\n\tSparseMatrix<double> Mfc = SparseMatrix<double>(nfree,nconst);\n  extractBlock(LL,0,nfree,nfree,nconst,Mfc);\n\n\tMatrixXd MfcVc = Mfc * V_w.block(nfree,0,nconst,3);\n\tbS = (LL*V).block(0,0,nfree,3)-MfcVc;\n\n}\n\n  IGL_INLINE void Frame_field_deformer::extractBlock(Eigen::SparseMatrix<double> & mat, int r0, int c0, int r, int c, Eigen::SparseMatrix<double> & m1)\n{\n  std::vector<Eigen::Triplet<double> > tripletList;\n  for (int k=c0; k<c0+c; ++k)\n    for (Eigen::SparseMatrix<double>::InnerIterator it(mat,k); it; ++it)\n    {\n      if (it.row()>=r0 && it.row()<r0+r)\n        tripletList.push_back(Eigen::Triplet<double>(it.row()-r0,it.col()-c0,it.value()));\n    }\n  m1.setFromTriplets(tripletList.begin(), tripletList.end());\n}\n\nIGL_INLINE void Frame_field_deformer::compute_optimal_rotations()\n{\n  using namespace Eigen;\n  Matrix<double,3,3> r,S,P,PP,D;\n\n  for (int i=0;i<F.rows();i++)\n\t{\n\t\t// input tri --- could be done once and saved in a matrix\n\t\tP.col(0) = (V.row(F(i,1))-V.row(F(i,0))).transpose();\n\t\tP.col(1) = (V.row(F(i,2))-V.row(F(i,1))).transpose();\n\t\tP.col(2) = (V.row(F(i,0))-V.row(F(i,2))).transpose();\n\n\t\tP = WW[i] * P;\t\t// apply ideal warp\n\n\t\t// current tri\n\t\tPP.col(0) = (V_w.row(F(i,1))-V_w.row(F(i,0))).transpose();\n\t\tPP.col(1) = (V_w.row(F(i,2))-V_w.row(F(i,1))).transpose();\n\t\tPP.col(2) = (V_w.row(F(i,0))-V_w.row(F(i,2))).transpose();\n\n\t\t// cotangents\n\t\tD <<    C(i,2), 0,      0,\n    0,      C(i,0), 0,\n    0,      0,      C(i,1);\n\n\t\tS = PP*D*P.transpose();\n\t\tEigen::JacobiSVD<Matrix<double,3,3> > svd(S, Eigen::ComputeFullU | Eigen::ComputeFullV );\n\t\tMatrix<double,3,3>  su = svd.matrixU();\n\t\tMatrix<double,3,3>  sv = svd.matrixV();\n\t\tr = su*sv.transpose();\n\n\t\tif (r.determinant()<0)  // correct reflections\n\t\t{\n\t\t\tsu(0,2)=-su(0,2); su(1,2)=-su(1,2); su(2,2)=-su(2,2);\n\t\t\tr = su*sv.transpose();\n\t\t}\n\t\tRW[i] = r*WW[i];\t\t// RW INCORPORATES IDEAL WARP WW!!!\n\t}\n}\n\nIGL_INLINE void Frame_field_deformer::compute_optimal_positions()\n{\n  using namespace Eigen;\n\t// compute variable RHS of ARAP-warp part of the system\n  MatrixXd b(nfree,3);          // fx3 known term of the system\n\tMatrixXd X;\t\t\t\t\t\t\t\t\t\t// result\n  int t;\t\t  \t\t\t\t\t\t\t\t\t// triangles incident to edge (i,j)\n\tint vi,i1,i2;\t\t\t\t\t\t\t\t\t// index of vertex i wrt tri t0\n\n  for (int i=0;i<nfree;i++)\n  {\n    b.row(i) << 0.0, 0.0, 0.0;\n    for (int k=0;k<(int)VT[i].size();k++)\t\t\t\t\t// for all incident triangles\n    {\n      t = VT[i][k];\t\t\t\t\t\t\t\t\t\t\t\t// incident tri\n\t\t\tvi = (i==F(t,0))?0:(i==F(t,1))?1:(i==F(t,2))?2:3;\t// index of i in t\n\t\t\tassert(vi!=3);\n\t\t\ti1 = F(t,(vi+1)%3);\n\t\t\ti2 = F(t,(vi+2)%3);\n\t\t\tb.row(i)+=(C(t,(vi+2)%3)*RW[t]*(V.row(i1)-V.row(i)).transpose()).transpose();\n\t\t\tb.row(i)+=(C(t,(vi+1)%3)*RW[t]*(V.row(i2)-V.row(i)).transpose()).transpose();\n    }\n  }\n  b/=2.0;\n\tb=-4*b;\n\n\tb*=(1-Lambda);\t\t// blend\n\n  b+=RHS;\t\t\t\t// complete known term\n\n\tX = solver.solve(b);\n\tif (solver.info()!=Eigen::Success) {printf(\"Solving linear system failed!\\n\"); return;}\n\n\t// copy result to mw.V\n  for (int i=0;i<nfree;i++)\n    V_w.row(i)=X.row(i);\n\n}\n\n  IGL_INLINE void Frame_field_deformer::computeXField(std::vector< Eigen::Matrix<double,3,2> > & XF)\n{\n  using namespace Eigen;\n  Matrix<double,3,3> P,PP,DG;\n\tXF.resize(F.rows());\n\n  for (int i=0;i<F.rows();i++)\n\t{\n\t\tint i0,i1,i2;\n\t\t// indexes of vertices of face i\n\t\ti0 = F(i,0); i1 = F(i,1); i2 = F(i,2);\n\n\t\t// input frame\n\t\tP.col(0) = (V.row(i1)-V.row(i0)).transpose();\n\t\tP.col(1) = (V.row(i2)-V.row(i0)).transpose();\n\t\tP.col(2) = P.col(0).cross(P.col(1));\n\n\t\t// output triangle brought to origin\n\t\tPP.col(0) = (V_w.row(i1)-V_w.row(i0)).transpose();\n\t\tPP.col(1) = (V_w.row(i2)-V_w.row(i0)).transpose();\n\t\tPP.col(2) = PP.col(0).cross(PP.col(1));\n\n\t\t// deformation gradient\n\t\tDG = PP * P.inverse();\n\t\tXF[i] = DG * FF[i];\n\t}\n}\n\n// computes in WW the ideal warp at each tri to make the frame field a cross\n  IGL_INLINE void Frame_field_deformer::compute_idealWarp(std::vector< Eigen::Matrix<double,3,3> > & WW)\n{\n  using namespace Eigen;\n\n  WW.resize(F.rows());\n\tfor (int i=0;i<(int)FF.size();i++)\n\t{\n\t\tVector3d v0,v1,v2;\n\t\tv0 = FF[i].col(0);\n\t\tv1 = FF[i].col(1);\n\t\tv2=v0.cross(v1); v2.normalize();\t\t\t// normal\n\n\t\tMatrix3d A,AI;\t\t\t\t\t\t\t\t// compute affine map A that brings:\n\t\tA <<    v0[0], v1[0], v2[0],\t\t\t\t//\tfirst vector of FF to x unary vector\n    v0[1], v1[1], v2[1],\t\t\t\t//\tsecond vector of FF to xy plane\n    v0[2], v1[2], v2[2];\t\t\t\t//\ttriangle normal to z unary vector\n\t\tAI = A.inverse();\n\n\t\t// polar decomposition to discard rotational component (unnecessary but makes it easier)\n\t\tEigen::JacobiSVD<Matrix<double,3,3> > svd(AI, Eigen::ComputeFullU | Eigen::ComputeFullV );\n\t\t//Matrix<double,3,3>  au = svd.matrixU();\n\t\tMatrix<double,3,3>  av = svd.matrixV();\n\t\tDiagonalMatrix<double,3>\tas(svd.singularValues());\n\t\tWW[i] = av*as*av.transpose();\n\t}\n}\n\n}\n\n\nIGL_INLINE void igl::frame_field_deformer(\n  const Eigen::MatrixXd& V,\n  const Eigen::MatrixXi& F,\n  const Eigen::MatrixXd& FF1,\n  const Eigen::MatrixXd& FF2,\n  Eigen::MatrixXd&       V_d,\n  Eigen::MatrixXd&       FF1_d,\n  Eigen::MatrixXd&       FF2_d,\n  const int              iterations,\n  const double           lambda,\n  const bool             perturb_initial_guess)\n{\n  using namespace Eigen;\n  // Solvers\n  Frame_field_deformer deformer;\n\n  // Init optimizer\n  deformer.init(V, F, FF1, FF2, lambda, perturb_initial_guess ? 0.1 : 0);\n\n  // Optimize\n  deformer.optimize(iterations,true);\n\n  // Copy positions\n  V_d = deformer.V_w;\n\n  // Allocate\n  FF1_d.resize(F.rows(),3);\n  FF2_d.resize(F.rows(),3);\n\n  // Copy frame field\n  for(unsigned i=0; i<deformer.XF.size(); ++i)\n  {\n    FF1_d.row(i) = deformer.XF[i].col(0);\n    FF2_d.row(i) = deformer.XF[i].col(1);\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/frame_field_deformer.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_FRAME_FIELD_DEFORMER_H\n#define IGL_FRAME_FIELD_DEFORMER_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Dense>\n\nnamespace igl\n{\n  // Deform a mesh to transform the given per-face frame field to be as close\n  // as possible to a cross field, in the least square sense.\n  //\n  // Inputs:\n  //   V       #V by 3 coordinates of the vertices\n  //   F       #F by 3 list of mesh faces (must be triangles)\n  //   FF1     #F by 3 first representative vector of the frame field\n  //   FF2     #F by 3 second representative vector of the frame field\n  //   lambda  laplacian regularization parameter 0=no regularization 1=full regularization\n  //\n  // Outputs:\n  //   V_d     #F by 3 deformed, first representative vector\n  //   V_d     #F by 3 deformed, first representative vector\n  //   V_d     #F by 3 deformed, first representative vector\n  //\n  IGL_INLINE void frame_field_deformer(\n    const Eigen::MatrixXd& V,\n    const Eigen::MatrixXi& F,\n    const Eigen::MatrixXd& FF1,\n    const Eigen::MatrixXd& FF2,\n    Eigen::MatrixXd&       V_d,\n    Eigen::MatrixXd&       FF1_d,\n    Eigen::MatrixXd&       FF2_d,\n    const int              iterations = 50,\n    const double           lambda = 0.1,\n    const bool             perturb_initial_guess = true);\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"frame_field_deformer.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/frame_to_cross_field.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"frame_to_cross_field.h\"\n#include <igl/local_basis.h>\n#include <igl/dot_row.h>\n\nIGL_INLINE void igl::frame_to_cross_field(\n  const Eigen::MatrixXd& V,\n  const Eigen::MatrixXi& F,\n  const Eigen::MatrixXd& FF1,\n  const Eigen::MatrixXd& FF2,\n  Eigen::MatrixXd& X)\n{\n  using namespace Eigen;\n\n  // Generate local basis\n  MatrixXd B1, B2, B3;\n\n  igl::local_basis(V,F,B1,B2,B3);\n\n  // Project the frame fields in the local basis\n  MatrixXd d1, d2;\n  d1.resize(F.rows(),2);\n  d2.resize(F.rows(),2);\n\n  d1 << igl::dot_row(B1,FF1), igl::dot_row(B2,FF1);\n  d2 << igl::dot_row(B1,FF2), igl::dot_row(B2,FF2);\n\n  X.resize(F.rows(), 3);\n\n\tfor (int i=0;i<F.rows();i++)\n\t{\n\t\tVector2d v1 = d1.row(i);\n\t\tVector2d v2 = d2.row(i);\n\n    // define inverse map that maps the canonical axis to the given frame directions\n\t\tMatrix2d A;\n\t\tA <<    v1[0], v2[0],\n            v1[1], v2[1];\n\n\t\t// find the closest rotation\n\t\tEigen::JacobiSVD<Matrix<double,2,2> > svd(A, Eigen::ComputeFullU | Eigen::ComputeFullV );\n    Matrix2d C = svd.matrixU() * svd.matrixV().transpose();\n\n    Vector2d v = C.col(0);\n    X.row(i) = v(0) * B1.row(i) + v(1) * B2.row(i);\n  }\n}\n\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/frame_to_cross_field.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_FRAME_TO_CROSS_FIELD_H\n#define IGL_FRAME_TO_CROSS_FIELD_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Dense>\n\nnamespace igl\n{\n  // Convert a frame field into its closest cross field\n  // Inputs:\n  //   V       #V by 3 coordinates of the vertices\n  //   F       #F by 3 list of mesh faces (must be triangles)\n  //   FF1     #F by 3 the first representative vector of the frame field (up to permutation and sign)\n  //   FF2     #F by 3 the second representative vector of the frame field (up to permutation and sign)\n  //\n  // Outputs:\n  //   X       #F by 3 representative vector of the closest cross field\n  //\n  IGL_INLINE void frame_to_cross_field(\n    const Eigen::MatrixXd& V,\n    const Eigen::MatrixXi& F,\n    const Eigen::MatrixXd& FF1,\n    const Eigen::MatrixXd& FF2,\n    Eigen::MatrixXd& X);\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"frame_to_cross_field.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/frustum.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"frustum.h\"\ntemplate < typename DerivedP>\nIGL_INLINE void igl::frustum(\n  const typename DerivedP::Scalar left,\n  const typename DerivedP::Scalar right,\n  const typename DerivedP::Scalar bottom,\n  const typename DerivedP::Scalar top,\n  const typename DerivedP::Scalar nearVal,\n  const typename DerivedP::Scalar farVal,\n  Eigen::PlainObjectBase<DerivedP> & P)\n{\n  P.setConstant(4,4,0.);\n  P(0,0) = (2.0 * nearVal) / (right - left);\n  P(1,1) = (2.0 * nearVal) / (top - bottom);\n  P(0,2) = (right + left) / (right - left);\n  P(1,2) = (top + bottom) / (top - bottom);\n  P(2,2) = -(farVal + nearVal) / (farVal - nearVal);\n  P(3,2) = -1.0;\n  P(2,3) = -(2.0 * farVal * nearVal) / (farVal - nearVal);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::frustum<Eigen::Matrix<float, 4, 4, 0, 4, 4> >(Eigen::Matrix<float, 4, 4, 0, 4, 4>::Scalar, Eigen::Matrix<float, 4, 4, 0, 4, 4>::Scalar, Eigen::Matrix<float, 4, 4, 0, 4, 4>::Scalar, Eigen::Matrix<float, 4, 4, 0, 4, 4>::Scalar, Eigen::Matrix<float, 4, 4, 0, 4, 4>::Scalar, Eigen::Matrix<float, 4, 4, 0, 4, 4>::Scalar, Eigen::PlainObjectBase<Eigen::Matrix<float, 4, 4, 0, 4, 4> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/frustum.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_FRUSTUM_H\n#define IGL_FRUSTUM_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Dense>\n\nnamespace igl \n{\n  // Implementation of the deprecated glFrustum function.\n  //\n  // Inputs:\n  //   left  coordinate of left vertical clipping plane\n  //   right  coordinate of right vertical clipping plane\n  //   bottom  coordinate of bottom vertical clipping plane\n  //   top  coordinate of top vertical clipping plane\n  //   nearVal  distance to near plane\n  //   farVal  distance to far plane\n  // Outputs:\n  //   P  4x4 perspective matrix\n  template < typename DerivedP>\n  IGL_INLINE void frustum(\n    const typename DerivedP::Scalar left,\n    const typename DerivedP::Scalar right,\n    const typename DerivedP::Scalar bottom,\n    const typename DerivedP::Scalar top,\n    const typename DerivedP::Scalar nearVal,\n    const typename DerivedP::Scalar farVal,\n    Eigen::PlainObjectBase<DerivedP> & P);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"frustum.cpp\"\n#endif\n\n#endif\n\n\n"
  },
  {
    "path": "libs/libigl/include/igl/full.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"full.h\"\n\ntemplate <typename T,typename DerivedB>\nIGL_INLINE void igl::full(\n  const Eigen::SparseMatrix<T> & A,\n  Eigen::PlainObjectBase<DerivedB>& B)\n{\n  assert(false && \"Obsolete. Just call B = Matrix(A)\");\n  using namespace Eigen;\n  B = PlainObjectBase<DerivedB >::Zero(A.rows(),A.cols());\n  // Iterate over outside\n  for(int k=0; k<A.outerSize(); ++k)\n  {\n    // Iterate over inside\n    for(typename SparseMatrix<T>::InnerIterator it (A,k); it; ++it)\n    {\n      B(it.row(),it.col()) = it.value();\n    }\n  }\n}\n\ntemplate <typename DerivedA,typename DerivedB>\nIGL_INLINE void igl::full(\n  const Eigen::PlainObjectBase<DerivedA>& A,\n  Eigen::PlainObjectBase<DerivedB>& B)\n{\n  assert(false && \"Obsolete. Just call B = Matrix(A)\");\n  B = A;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template specialization\n// generated by autoexplicit.sh\ntemplate void igl::full<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::full<double, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::SparseMatrix<double, 0, int> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/full.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_FULL_H\n#define IGL_FULL_H\n#include \"igl_inline.h\"\n#define EIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET\n#include <Eigen/Dense>\n#include <Eigen/Sparse>\nnamespace igl\n{\n  // This is totally unnecessary. You can just call MatrixXd B = MatrixXd(A);\n  //\n  // Convert a sparsematrix into a full one\n  //\n  // Templates:\n  //   T  should be a eigen sparse matrix primitive type like int or double\n  // Input:\n  //   A  m by n sparse matrix\n  // Output:\n  //   B  m by n dense/full matrix\n  template <typename T,typename DerivedB>\n  IGL_INLINE void full(\n    const Eigen::SparseMatrix<T> & A,\n    Eigen::PlainObjectBase<DerivedB> & B);\n  // If already full then this will just be a copy by assignment\n  template <typename DerivedA,typename DerivedB>\n  IGL_INLINE void full(\n    const Eigen::PlainObjectBase<DerivedA>& A,\n    Eigen::PlainObjectBase<DerivedB>& B);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"full.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/gaussian_curvature.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"gaussian_curvature.h\"\n#include \"internal_angles.h\"\n#include \"PI.h\"\n#include <iostream>\ntemplate <typename DerivedV, typename DerivedF, typename DerivedK>\nIGL_INLINE void igl::gaussian_curvature(\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  Eigen::PlainObjectBase<DerivedK> & K)\n{\n  using namespace Eigen;\n  using namespace std;\n  // internal corner angles\n  Matrix<\n    typename DerivedV::Scalar,\n    DerivedF::RowsAtCompileTime,\n    DerivedF::ColsAtCompileTime> A;\n  internal_angles(V,F,A);\n  K.resize(V.rows(),1);\n  K.setConstant(V.rows(),1,2.*PI);\n  assert(A.rows() == F.rows());\n  assert(A.cols() == F.cols());\n  assert(K.rows() == V.rows());\n  assert(F.maxCoeff() < V.rows());\n  assert(K.cols() == 1);\n  const int Frows = F.rows();\n  //K_G(x_i) = (2π - ∑θj)\n//#ifndef IGL_GAUSSIAN_CURVATURE_OMP_MIN_VALUE\n//#  define IGL_GAUSSIAN_CURVATURE_OMP_MIN_VALUE 1000\n//#endif\n//#pragma omp parallel for if (Frows>IGL_GAUSSIAN_CURVATURE_OMP_MIN_VALUE)\n  for(int f = 0;f<Frows;f++)\n  {\n    // throw normal at each corner\n    for(int j = 0; j < 3;j++)\n    {\n      // Q: Does this need to be critical?\n      // H: I think so, sadly. Maybe there's a way to use reduction\n//#pragma omp critical\n      K(F(f,j),0) -=  A(f,j);\n    }\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::gaussian_curvature<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::gaussian_curvature<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/gaussian_curvature.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_GAUSSIAN_CURVATURE_H\n#define IGL_GAUSSIAN_CURVATURE_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Compute discrete local integral gaussian curvature (angle deficit, without\n  // averaging by local area).\n  //\n  // Inputs:\n  //   V  #V by 3 eigen Matrix of mesh vertex 3D positions\n  //   F  #F by 3 eigen Matrix of face (triangle) indices\n  // Output:\n  //   K  #V by 1 eigen Matrix of discrete gaussian curvature values\n  //\n  template <typename DerivedV, typename DerivedF, typename DerivedK>\n  IGL_INLINE void gaussian_curvature(\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    Eigen::PlainObjectBase<DerivedK> & K);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"gaussian_curvature.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/get_modifiers.h",
    "content": "#ifndef GET_MODIFIERS_H\n#define GET_MODIFIERS_H\n//#include \"igl_inline.h\"\nnamespace igl\n{\n  enum Modifier\n  {\n    MODIFIER_OPTION = 1,\n    MODIFIER_SHIFT = 2,\n    MODIFIER_CONTROL = 4,\n    MODIFIER_COMMAND = 8,\n    NUM_MODIFIERS = 4,\n  };\n  // Retrieve current modifier constellation. \n  //\n  // Returns int that's an \"or\" of the active modifiers above.\n  //\n  // FORCED INLINE\n  inline int get_modifiers();\n}\n\n// Implementation \n\n/* glutGetModifiers return mask. */\n#ifndef GLUT_ACTIVE_SHIFT\n#  define GLUT_ACTIVE_SHIFT 1\n#endif\n#ifndef GLUT_ACTIVE_CTRL\n#  define GLUT_ACTIVE_CTRL 2\n#endif\n#ifndef GLUT_ACTIVE_ALT\n#  define GLUT_ACTIVE_ALT 4\n#endif\n#ifndef GLUT_ACTIVE_COMMAND\n#  define GLUT_ACTIVE_COMMAND 8\n#endif\n\n#ifdef __APPLE__\n//#include <Carbon/HIToolbox/Events.h>\n#include <Carbon/Carbon.h>\n#endif\n\n#warning \"igl::get_modifiers is deprecated. If using GLUT, try Alec's glut patch www.alecjacobson.com/weblog/?p=3659 and use glutGetModifiers\"\n\n// FORCED INLINE\ninline int igl::get_modifiers()\n{\n  int mod = 0;\n#ifdef __APPLE__\n  // http://stackoverflow.com/a/18082326/148668\n  KeyMap keyStates;\n  const auto & carbon_is_keydown = [&keyStates]( uint16_t vKey )->bool\n  {\n    uint8_t index = vKey / 32 ;\n    uint8_t shift = vKey % 32 ;\n    return keyStates[index].bigEndianValue & (1 << shift) ;\n  };\n  GetKeys(keyStates) ;\n  mod |= (carbon_is_keydown(kVK_Command)?GLUT_ACTIVE_COMMAND:0);\n  mod |= (carbon_is_keydown(kVK_Shift)?GLUT_ACTIVE_SHIFT:0);\n  mod |= (carbon_is_keydown(kVK_Option)?GLUT_ACTIVE_ALT:0);\n  mod |= (carbon_is_keydown(kVK_Control)?GLUT_ACTIVE_CTRL:0);\n#else\n#  warning \"igl::get_modifiers not supported on your OS, some demos may not work correctly.\"\n#endif\n  return mod;\n}\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/get_seconds.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"get_seconds.h\"\n#include <chrono>\nIGL_INLINE double igl::get_seconds()\n{\n  return \n    std::chrono::duration<double>(\n      std::chrono::system_clock::now().time_since_epoch()).count();\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/get_seconds.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_GET_SECONDS_H\n#define IGL_GET_SECONDS_H\n#include \"igl_inline.h\"\n\nnamespace igl\n{\n  // Return the current time in seconds since program start\n  // \n  // Example:\n  //    const auto & tictoc = []()\n  //    {\n  //      static double t_start = igl::get_seconds();\n  //      double diff = igl::get_seconds()-t_start;\n  //      t_start += diff;\n  //      return diff;\n  //    };\n  //    tictoc();\n  //    ... // part 1\n  //    cout<<\"part 1: \"<<tictoc()<<endl;\n  //    ... // part 2\n  //    cout<<\"part 2: \"<<tictoc()<<endl;\n  //    ... // etc\n  IGL_INLINE double get_seconds();\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"get_seconds.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/get_seconds_hires.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"get_seconds_hires.h\"\n\n#if _WIN32\n#  include <windows.h>\n#  include <cassert>\nIGL_INLINE double igl::get_seconds_hires()\n{\n  LARGE_INTEGER li_freq, li_current;\n  const bool ret = QueryPerformanceFrequency(&li_freq);\n  const bool ret2 = QueryPerformanceCounter(&li_current);\n  assert(ret && ret2);\n  assert(li_freq.QuadPart > 0);\n  return double(li_current.QuadPart) / double(li_freq.QuadPart);\n}\n#else\n#  include \"get_seconds.h\"\nIGL_INLINE double igl::get_seconds_hires()\n{\n  // Sorry I've no idea how performance counters work on Mac...\n  return igl::get_seconds();\n}\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/get_seconds_hires.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_GET_SECONDS_HIRES_H\n#define IGL_GET_SECONDS_HIRES_H\n#include \"igl_inline.h\"\n\nnamespace igl\n{\n  // Return the current time in seconds using performance counters\n  IGL_INLINE double get_seconds_hires();\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"get_seconds_hires.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/gl_type_size.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"gl_type_size.h\"\n#ifndef IGL_NO_OPENGL\n#include <cassert>\n\nIGL_INLINE int igl::gl_type_size(const GLenum type)\n{\n  switch(type)\n  {\n    case GL_DOUBLE:\n      return 8;\n      break;\n    case GL_FLOAT:\n      return 4;\n      break;\n    case GL_INT:\n      return 4;\n      break;\n    default:\n      // should handle all other GL_[types]\n      assert(false && \"Implementation incomplete.\");\n      break;\n  }\n  return -1;\n}\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/gl_type_size.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_GL_TYPE_SIZE_H\n#define IGL_GL_TYPE_SIZE_H\n#ifndef IGL_NO_OPENGL\n#include \"igl_inline.h\"\n\n#include \"OpenGL_convenience.h\"\n\nnamespace igl\n{\n  // Return the number of bytes for a given OpenGL type\n  // Inputs:\n  //   type  enum value of opengl type\n  // Returns size in bytes of type\n  IGL_INLINE int gl_type_size(const GLenum type);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"gl_type_size.cpp\"\n#endif\n\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/grad.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"grad.h\"\n#include <Eigen/Geometry>\n#include <vector>\n\n#include \"per_face_normals.h\"\n#include \"volume.h\"\n#include \"doublearea.h\"\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void grad_tet(const Eigen::PlainObjectBase<DerivedV>&V,\n                     const Eigen::PlainObjectBase<DerivedF>&T,\n                            Eigen::SparseMatrix<typename DerivedV::Scalar> &G,\n                            bool uniform) {\n  using namespace Eigen;\n  assert(T.cols() == 4);\n  const int n = V.rows(); int m = T.rows();\n\n  /*\n      F = [ ...\n      T(:,1) T(:,2) T(:,3); ...\n      T(:,1) T(:,3) T(:,4); ...\n      T(:,1) T(:,4) T(:,2); ...\n      T(:,2) T(:,4) T(:,3)]; */\n  MatrixXi F(4*m,3);\n  for (int i = 0; i < m; i++) {\n    F.row(0*m + i) << T(i,0), T(i,1), T(i,2);\n    F.row(1*m + i) << T(i,0), T(i,2), T(i,3);\n    F.row(2*m + i) << T(i,0), T(i,3), T(i,1);\n    F.row(3*m + i) << T(i,1), T(i,3), T(i,2);\n  }\n  // compute volume of each tet\n  VectorXd vol; igl::volume(V,T,vol);\n\n  VectorXd A(F.rows());\n  MatrixXd N(F.rows(),3);\n  if (!uniform) {\n    // compute tetrahedron face normals\n    igl::per_face_normals(V,F,N); int norm_rows = N.rows();\n    for (int i = 0; i < norm_rows; i++)\n      N.row(i) /= N.row(i).norm();\n    igl::doublearea(V,F,A); A/=2.;\n  } else {\n    // Use a uniform tetrahedra as a reference, with the same volume as the original one:\n    //\n    // Use normals of the uniform tet (V = h*[0,0,0;1,0,0;0.5,sqrt(3)/2.,0;0.5,sqrt(3)/6.,sqrt(2)/sqrt(3)])\n    //         0         0    1.0000\n    //         0.8165   -0.4714   -0.3333\n    //         0          0.9428   -0.3333\n    //         -0.8165   -0.4714   -0.3333\n    for (int i = 0; i < m; i++) {\n      N.row(0*m+i) << 0,0,1;\n      double a = sqrt(2)*std::cbrt(3*vol(i)); // area of a face in a uniform tet with volume = vol(i)\n      A(0*m+i) = (pow(a,2)*sqrt(3))/4.;\n    }\n    for (int i = 0; i < m; i++) {\n      N.row(1*m+i) << 0.8165,-0.4714,-0.3333;\n      double a = sqrt(2)*std::cbrt(3*vol(i));\n      A(1*m+i) = (pow(a,2)*sqrt(3))/4.;\n    }\n    for (int i = 0; i < m; i++) {\n      N.row(2*m+i) << 0,0.9428,-0.3333;\n      double a = sqrt(2)*std::cbrt(3*vol(i));\n      A(2*m+i) = (pow(a,2)*sqrt(3))/4.;\n    }\n    for (int i = 0; i < m; i++) {\n      N.row(3*m+i) << -0.8165,-0.4714,-0.3333;\n      double a = sqrt(2)*std::cbrt(3*vol(i));\n      A(3*m+i) = (pow(a,2)*sqrt(3))/4.;\n    }\n\n  }\n\n  /*  G = sparse( ...\n      [0*m + repmat(1:m,1,4) ...\n       1*m + repmat(1:m,1,4) ...\n       2*m + repmat(1:m,1,4)], ...\n      repmat([T(:,4);T(:,2);T(:,3);T(:,1)],3,1), ...\n      repmat(A./(3*repmat(vol,4,1)),3,1).*N(:), ...\n      3*m,n);*/\n  std::vector<Triplet<double> > G_t;\n  for (int i = 0; i < 4*m; i++) {\n    int T_j; // j indexes : repmat([T(:,4);T(:,2);T(:,3);T(:,1)],3,1)\n    switch (i/m) {\n      case 0:\n        T_j = 3;\n        break;\n      case 1:\n        T_j = 1;\n        break;\n      case 2:\n        T_j = 2;\n        break;\n      case 3:\n        T_j = 0;\n        break;\n    }\n    int i_idx = i%m;\n    int j_idx = T(i_idx,T_j);\n\n    double val_before_n = A(i)/(3*vol(i_idx));\n    G_t.push_back(Triplet<double>(0*m+i_idx, j_idx, val_before_n * N(i,0)));\n    G_t.push_back(Triplet<double>(1*m+i_idx, j_idx, val_before_n * N(i,1)));\n    G_t.push_back(Triplet<double>(2*m+i_idx, j_idx, val_before_n * N(i,2)));\n  }\n  G.resize(3*m,n);\n  G.setFromTriplets(G_t.begin(), G_t.end());\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void grad_tri(const Eigen::PlainObjectBase<DerivedV>&V,\n                     const Eigen::PlainObjectBase<DerivedF>&F,\n                    Eigen::SparseMatrix<typename DerivedV::Scalar> &G,\n                    bool uniform)\n{\n  Eigen::Matrix<typename DerivedV::Scalar,Eigen::Dynamic,3>\n    eperp21(F.rows(),3), eperp13(F.rows(),3);\n\n  for (int i=0;i<F.rows();++i)\n  {\n    // renaming indices of vertices of triangles for convenience\n    int i1 = F(i,0);\n    int i2 = F(i,1);\n    int i3 = F(i,2);\n\n    // #F x 3 matrices of triangle edge vectors, named after opposite vertices\n    Eigen::Matrix<typename DerivedV::Scalar, 1, 3> v32 = V.row(i3) - V.row(i2);\n    Eigen::Matrix<typename DerivedV::Scalar, 1, 3> v13 = V.row(i1) - V.row(i3);\n    Eigen::Matrix<typename DerivedV::Scalar, 1, 3> v21 = V.row(i2) - V.row(i1);\n    Eigen::Matrix<typename DerivedV::Scalar, 1, 3> n = v32.cross(v13);\n    // area of parallelogram is twice area of triangle\n    // area of parallelogram is || v1 x v2 ||\n    // This does correct l2 norm of rows, so that it contains #F list of twice\n    // triangle areas\n    double dblA = std::sqrt(n.dot(n));\n    Eigen::Matrix<typename DerivedV::Scalar, 1, 3> u;\n    if (!uniform) {\n      // now normalize normals to get unit normals\n      u = n / dblA;\n    } else {\n      // Abstract equilateral triangle v1=(0,0), v2=(h,0), v3=(h/2, (sqrt(3)/2)*h)\n\n      // get h (by the area of the triangle)\n      double h = sqrt( (dblA)/sin(M_PI / 3.0)); // (h^2*sin(60))/2. = Area => h = sqrt(2*Area/sin_60)\n\n      Eigen::VectorXd v1,v2,v3;\n      v1 << 0,0,0;\n      v2 << h,0,0;\n      v3 << h/2.,(sqrt(3)/2.)*h,0;\n\n      // now fix v32,v13,v21 and the normal\n      v32 = v3-v2;\n      v13 = v1-v3;\n      v21 = v2-v1;\n      n = v32.cross(v13);\n    }\n\n    // rotate each vector 90 degrees around normal\n    double norm21 = std::sqrt(v21.dot(v21));\n    double norm13 = std::sqrt(v13.dot(v13));\n    eperp21.row(i) = u.cross(v21);\n    eperp21.row(i) = eperp21.row(i) / std::sqrt(eperp21.row(i).dot(eperp21.row(i)));\n    eperp21.row(i) *= norm21 / dblA;\n    eperp13.row(i) = u.cross(v13);\n    eperp13.row(i) = eperp13.row(i) / std::sqrt(eperp13.row(i).dot(eperp13.row(i)));\n    eperp13.row(i) *= norm13 / dblA;\n  }\n\n  std::vector<int> rs;\n  rs.reserve(F.rows()*4*3);\n  std::vector<int> cs;\n  cs.reserve(F.rows()*4*3);\n  std::vector<double> vs;\n  vs.reserve(F.rows()*4*3);\n\n  // row indices\n  for(int r=0;r<3;r++)\n  {\n    for(int j=0;j<4;j++)\n    {\n      for(int i=r*F.rows();i<(r+1)*F.rows();i++) rs.push_back(i);\n    }\n  }\n\n  // column indices\n  for(int r=0;r<3;r++)\n  {\n    for(int i=0;i<F.rows();i++) cs.push_back(F(i,1));\n    for(int i=0;i<F.rows();i++) cs.push_back(F(i,0));\n    for(int i=0;i<F.rows();i++) cs.push_back(F(i,2));\n    for(int i=0;i<F.rows();i++) cs.push_back(F(i,0));\n  }\n\n  // values\n  for(int i=0;i<F.rows();i++) vs.push_back(eperp13(i,0));\n  for(int i=0;i<F.rows();i++) vs.push_back(-eperp13(i,0));\n  for(int i=0;i<F.rows();i++) vs.push_back(eperp21(i,0));\n  for(int i=0;i<F.rows();i++) vs.push_back(-eperp21(i,0));\n  for(int i=0;i<F.rows();i++) vs.push_back(eperp13(i,1));\n  for(int i=0;i<F.rows();i++) vs.push_back(-eperp13(i,1));\n  for(int i=0;i<F.rows();i++) vs.push_back(eperp21(i,1));\n  for(int i=0;i<F.rows();i++) vs.push_back(-eperp21(i,1));\n  for(int i=0;i<F.rows();i++) vs.push_back(eperp13(i,2));\n  for(int i=0;i<F.rows();i++) vs.push_back(-eperp13(i,2));\n  for(int i=0;i<F.rows();i++) vs.push_back(eperp21(i,2));\n  for(int i=0;i<F.rows();i++) vs.push_back(-eperp21(i,2));\n\n  // create sparse gradient operator matrix\n  G.resize(3*F.rows(),V.rows());\n  std::vector<Eigen::Triplet<typename DerivedV::Scalar> > triplets;\n  for (int i=0;i<(int)vs.size();++i)\n  {\n    triplets.push_back(Eigen::Triplet<typename DerivedV::Scalar>(rs[i],cs[i],vs[i]));\n  }\n  G.setFromTriplets(triplets.begin(), triplets.end());\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::grad(const Eigen::PlainObjectBase<DerivedV>&V,\n                     const Eigen::PlainObjectBase<DerivedF>&F,\n                    Eigen::SparseMatrix<typename DerivedV::Scalar> &G,\n                    bool uniform)\n{\n  assert(F.cols() == 3 || F.cols() == 4);\n  if (F.cols() == 3)\n    return grad_tri(V,F,G,uniform);\n  if (F.cols() == 4)\n    return grad_tet(V,F,G,uniform);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::grad<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::SparseMatrix<Eigen::Matrix<double, -1, -1, 0, -1, -1>::Scalar, 0, int>&, bool);\ntemplate void igl::grad<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::SparseMatrix<Eigen::Matrix<double, -1, 3, 0, -1, 3>::Scalar, 0, int>&, bool);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/grad.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\r\n//\r\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\r\n//\r\n// This Source Code Form is subject to the terms of the Mozilla Public License\r\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\r\n// obtain one at http://mozilla.org/MPL/2.0/.\r\n#ifndef IGL_GRAD_MAT_H\r\n#define IGL_GRAD_MAT_H\r\n#include \"igl_inline.h\"\r\n\r\n#include <Eigen/Core>\r\n#include <Eigen/Sparse>\r\n\r\nnamespace igl {\r\n  // GRAD\r\n  // G = grad(V,F)\r\n  //\r\n  // Compute the numerical gradient operator\r\n  //\r\n  // Inputs:\r\n  //   V          #vertices by 3 list of mesh vertex positions\r\n  //   F          #faces by 3 list of mesh face indices [or a #faces by 4 list of tetrahedral indices]\r\n  //   uniform    boolean (default false) - Use a uniform mesh instead of the vertices V\r\n  // Outputs:\r\n  //   G  #faces*dim by #V Gradient operator\r\n  //\r\n\r\n  // Gradient of a scalar function defined on piecewise linear elements (mesh)\r\n  // is constant on each triangle [tetrahedron] i,j,k:\r\n  // grad(Xijk) = (Xj-Xi) * (Vi - Vk)^R90 / 2A + (Xk-Xi) * (Vj - Vi)^R90 / 2A\r\n  // where Xi is the scalar value at vertex i, Vi is the 3D position of vertex\r\n  // i, and A is the area of triangle (i,j,k). ^R90 represent a rotation of\r\n  // 90 degrees\r\n  //\r\ntemplate <typename DerivedV, typename DerivedF>\r\nIGL_INLINE void grad(const Eigen::PlainObjectBase<DerivedV>&V,\r\n                     const Eigen::PlainObjectBase<DerivedF>&F,\r\n                    Eigen::SparseMatrix<typename DerivedV::Scalar> &G,\r\n                    bool uniform = false);\r\n}\r\n#ifndef IGL_STATIC_LIBRARY\r\n#  include \"grad.cpp\"\r\n#endif\r\n\r\n#endif\r\n"
  },
  {
    "path": "libs/libigl/include/igl/grid.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"grid.h\"\n\nIGL_INLINE void igl::grid(const Eigen::RowVector3i & res, Eigen::MatrixXd & GV)\n{\n  using namespace Eigen;\n  GV.resize(res(0)*res(1)*res(2),3);\n  for(int zi = 0;zi<res(2);zi++)\n  {\n    const auto lerp = \n      [&](const double di, const int d)->double{return di/(double)(res(d)-1);};\n    const double z = lerp(zi,2);\n    for(int yi = 0;yi<res(1);yi++)\n    {\n      const double y = lerp(yi,1);\n      for(int xi = 0;xi<res(0);xi++)\n      {\n        const double x = lerp(xi,0);\n        GV.row(xi+res(0)*(yi + res(1)*zi)) = RowVector3d(x,y,z);\n      }\n    }\n  }\n}\n\n"
  },
  {
    "path": "libs/libigl/include/igl/grid.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_GRID_H\n#define IGL_GRID_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Construct vertices of a regular grid, suitable for input to\n  // `igl::marching_cubes`\n  //\n  // Inputs:\n  //   res  3-long list of number of vertices along the x y and z dimensions\n  // Outputs:\n  //   GV  res(0)*res(1)*res(2) by 3 list of mesh vertex positions.\n  //   \n  IGL_INLINE void grid(const Eigen::RowVector3i & res, Eigen::MatrixXd & GV);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"grid.cpp\"\n#endif\n#endif \n"
  },
  {
    "path": "libs/libigl/include/igl/group_sum_matrix.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"group_sum_matrix.h\"\n\ntemplate <typename T>\nIGL_INLINE void igl::group_sum_matrix(\n  const Eigen::Matrix<int,Eigen::Dynamic,1> & G,\n  const int k,\n  Eigen::SparseMatrix<T>& A)\n{\n  // number of vertices\n  int n = G.rows();\n  assert(k > G.maxCoeff());\n\n  A.resize(k,n);\n\n  // builds A such that A(i,j) = 1 where i corresponds to group i and j\n  // corresponds to vertex j\n\n  // Loop over vertices\n  for(int j = 0;j<n;j++)\n  {\n    A.insert(G(j),j) = 1;\n  }\n\n  A.makeCompressed();\n}\n\ntemplate <typename T>\nIGL_INLINE void igl::group_sum_matrix(\n  const Eigen::Matrix<int,Eigen::Dynamic,1> & G,\n  Eigen::SparseMatrix<T>& A)\n{\n  return group_sum_matrix(G,G.maxCoeff()+1,A);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::group_sum_matrix<double>(Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, int, Eigen::SparseMatrix<double, 0, int>&);\ntemplate void igl::group_sum_matrix<double>(Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, Eigen::SparseMatrix<double, 0, int>&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/group_sum_matrix.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_GROUP_SUM_MATRIX_H\n#define IGL_GROUP_SUM_MATRIX_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Dense>\n#include <Eigen/Sparse>\n\nnamespace igl\n{\n  // GROUP_SUM_MATRIX Builds a matrix A such that A*V computes the sum of\n  // vertices in each group specified by G\n  //\n  // group_sum_matrix(G,k,A);\n  // \n  // Templates:\n  //   T  should be a eigen sparse matrix primitive type like int or double\n  // Inputs:\n  //   G  #V list of group indices (0 to k-1) for each vertex, such that vertex i \n  //     is assigned to group G(i)\n  //   k  #groups, good choice is max(G)+1\n  // Outputs:\n  //   A  #groups by #V sparse matrix such that A*V = group_sums\n  //\n  template <typename T>\n  IGL_INLINE void group_sum_matrix(\n    const Eigen::Matrix<int,Eigen::Dynamic,1> & G,\n    const int k,\n    Eigen::SparseMatrix<T>& A);\n  // Wrapper with k = max(G)+1\n  template <typename T>\n  IGL_INLINE void group_sum_matrix(\n    const Eigen::Matrix<int,Eigen::Dynamic,1> & G,\n    Eigen::SparseMatrix<T>& A);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"group_sum_matrix.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/guess_extension.cpp",
    "content": "#include \"guess_extension.h\"\n#include \"is_stl.h\"\n#include \"ply.h\"\n\nIGL_INLINE void igl::guess_extension(FILE * fp, std::string & guess)\n{\n  const auto is_off = [](FILE * fp)-> bool\n  {\n    char header[1000];\n    const std::string OFF(\"OFF\");\n    const std::string NOFF(\"NOFF\");\n    const std::string COFF(\"COFF\");\n    bool f = (fscanf(fp,\"%s\\n\",header)==1 && (\n        std::string(header).compare(0, OFF.length(), OFF)==0 ||\n        std::string(header).compare(0, COFF.length(), COFF)==0 ||\n        std::string(header).compare(0,NOFF.length(),NOFF)==0));\n    rewind(fp);\n    return f;\n  };\n  const auto is_ply = [](FILE * ply_file) -> bool\n  {\n    int nelems;\n    char ** elem_names;\n    PlyFile * in_ply = ply_read(ply_file,&nelems,&elem_names);\n    if(in_ply==NULL)\n    {\n      return false;\n    }\n    free(in_ply);\n    rewind(ply_file);\n    return true;\n  };\n  const auto is_wrl = [](FILE * wrl_file)->bool\n  {\n    bool still_comments = true;\n    char line[1000];\n    std::string needle(\"point [\");\n    std::string haystack;\n    while(still_comments)\n    {\n      if(fgets(line,1000,wrl_file) == NULL)\n      {\n        rewind(wrl_file);\n        return false;\n      }\n      haystack = std::string(line);\n      still_comments = std::string::npos == haystack.find(needle);\n    }\n    rewind(wrl_file);\n    return true;\n  };\n  const auto is_mesh = [](FILE * mesh_file )->bool\n  {\n    char line[2048];\n    // eat comments at beginning of file\n    bool still_comments= true;\n    while(still_comments)\n    {\n      if(fgets(line,2048,mesh_file) == NULL)\n      {\n        rewind(mesh_file);\n        return false;\n      }\n      still_comments = (line[0] == '#' || line[0] == '\\n');\n    }\n    char str[2048];\n    sscanf(line,\" %s\",str);\n    // check that first word is MeshVersionFormatted\n    if(0!=strcmp(str,\"MeshVersionFormatted\"))\n    {\n      rewind(mesh_file);\n      return false;\n    }\n    rewind(mesh_file);\n    return true;\n  };\n  guess = \"obj\";\n  if(is_mesh(fp))\n  {\n    guess = \"mesh\";\n  }else if(is_off(fp))\n  {\n    guess = \"off\";\n  }else if(is_ply(fp))\n  {\n    guess = \"ply\";\n  }else if(igl::is_stl(fp))\n  {\n    guess = \"stl\";\n  }else if(is_wrl(fp))\n  {\n    guess = \"wrl\";\n  }\n  // else obj\n  rewind(fp);\n}\n\nIGL_INLINE std::string igl::guess_extension(FILE * fp)\n{\n  std::string guess;\n  guess_extension(fp,guess);\n  return guess;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/guess_extension.h",
    "content": "#ifndef IGL_GUESS_EXTENSION_H\n#define IGL_GUESS_EXTENSION_H\n#include \"igl_inline.h\"\n#include <string>\n#include <cstdio>\nnamespace igl\n{\n  // Given a file pointer at the beginning of a \"mesh\" file, try to guess the\n  // extension of the file format it comes from. The file pointer is rewound on\n  // return.\n  //\n  // Inputs:\n  //   fp  file pointer (see output)\n  // Outputs:\n  //   fp  file pointer rewound \n  //   guess  extension as string. One of \"mesh\",{\"obj\"},\"off\",\"ply\",\"stl\", or\n  //     \"wrl\"\n  //\n  IGL_INLINE void guess_extension(FILE * fp, std::string & guess);\n  IGL_INLINE std::string guess_extension(FILE * fp);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"guess_extension.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/harmonic.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"harmonic.h\"\n#include \"adjacency_matrix.h\"\n#include \"cotmatrix.h\"\n#include \"diag.h\"\n#include \"invert_diag.h\"\n#include \"isdiag.h\"\n#include \"massmatrix.h\"\n#include \"min_quad_with_fixed.h\"\n#include \"speye.h\"\n#include \"sum.h\"\n#include <Eigen/Sparse>\n\ntemplate <\n  typename DerivedV,\n  typename DerivedF,\n  typename Derivedb,\n  typename Derivedbc,\n  typename DerivedW>\nIGL_INLINE bool igl::harmonic(\n  const Eigen::MatrixBase<DerivedV> & V,\n  const Eigen::MatrixBase<DerivedF> & F,\n  const Eigen::MatrixBase<Derivedb> & b,\n  const Eigen::MatrixBase<Derivedbc> & bc,\n  const int k,\n  Eigen::PlainObjectBase<DerivedW> & W)\n{\n  using namespace Eigen;\n  typedef typename DerivedV::Scalar Scalar;\n  SparseMatrix<Scalar> L,M;\n  cotmatrix(V,F,L);\n  if(k>1)\n  {\n    massmatrix(V,F,MASSMATRIX_TYPE_DEFAULT,M);\n  }\n  return harmonic(L,M,b,bc,k,W);\n}\n\ntemplate <\n  typename DerivedF,\n  typename Derivedb,\n  typename Derivedbc,\n  typename DerivedW>\nIGL_INLINE bool igl::harmonic(\n  const Eigen::MatrixBase<DerivedF> & F,\n  const Eigen::MatrixBase<Derivedb> & b,\n  const Eigen::MatrixBase<Derivedbc> & bc,\n  const int k,\n  Eigen::PlainObjectBase<DerivedW> & W)\n{\n  using namespace Eigen;\n  typedef typename Derivedbc::Scalar Scalar;\n  SparseMatrix<Scalar> A;\n  adjacency_matrix(F,A);\n  // sum each row\n  SparseVector<Scalar> Asum;\n  sum(A,1,Asum);\n  // Convert row sums into diagonal of sparse matrix\n  SparseMatrix<Scalar> Adiag;\n  diag(Asum,Adiag);\n  SparseMatrix<Scalar> L = A-Adiag;\n  SparseMatrix<Scalar> M;\n  speye(L.rows(),M);\n  return harmonic(L,M,b,bc,k,W);\n}\n\ntemplate <\n  typename DerivedL,\n  typename DerivedM,\n  typename Derivedb,\n  typename Derivedbc,\n  typename DerivedW>\nIGL_INLINE bool igl::harmonic(\n  const Eigen::SparseMatrix<DerivedL> & L,\n  const Eigen::SparseMatrix<DerivedM> & M,\n  const Eigen::MatrixBase<Derivedb> & b,\n  const Eigen::MatrixBase<Derivedbc> & bc,\n  const int k,\n  Eigen::PlainObjectBase<DerivedW> & W)\n{\n  const int n = L.rows();\n  assert(n == L.cols() && \"L must be square\");\n  assert((k==1 || n == M.cols() ) && \"M must be same size as L\");\n  assert((k==1 || n == M.rows() ) && \"M must be square\");\n  assert((k==1 || igl::isdiag(M))  && \"Mass matrix should be diagonal\");\n\n  Eigen::SparseMatrix<DerivedL> Q;\n  igl::harmonic(L,M,k,Q);\n\n  typedef DerivedL Scalar;\n  min_quad_with_fixed_data<Scalar> data;\n  min_quad_with_fixed_precompute(Q,b,Eigen::SparseMatrix<Scalar>(),true,data);\n  W.resize(n,bc.cols());\n  typedef Eigen::Matrix<Scalar,Eigen::Dynamic,1> VectorXS;\n  const VectorXS B = VectorXS::Zero(n,1);\n  for(int w = 0;w<bc.cols();w++)\n  {\n    const VectorXS bcw = bc.col(w);\n    VectorXS Ww;\n    if(!min_quad_with_fixed_solve(data,B,bcw,VectorXS(),Ww))\n    {\n      return false;\n    }\n    W.col(w) = Ww;\n  }\n  return true;\n}\n\ntemplate <\n  typename DerivedL,\n  typename DerivedM,\n  typename DerivedQ>\nIGL_INLINE void igl::harmonic(\n  const Eigen::SparseMatrix<DerivedL> & L,\n  const Eigen::SparseMatrix<DerivedM> & M,\n  const int k,\n  Eigen::SparseMatrix<DerivedQ> & Q)\n{\n  assert(L.rows() == L.cols()&&\"L should be square\");\n  Q = -L;\n  if(k == 1) return;\n  assert(L.rows() == M.rows()&&\"L should match M's dimensions\");\n  assert(M.rows() == M.cols()&&\"M should be square\");\n  Eigen::SparseMatrix<DerivedM> Mi;\n  invert_diag(M,Mi);\n  // This is **not** robust for k>2. See KKT system in [Jacobson et al. 2010]\n  // of the kharmonic function in gptoolbox\n  for(int p = 1;p<k;p++)\n  {\n    Q = (Q*Mi*-L).eval();\n  }\n}\n\n#include \"find.h\"\ntemplate <\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedQ>\nIGL_INLINE void igl::harmonic(\n  const Eigen::MatrixBase<DerivedV> & V,\n  const Eigen::MatrixBase<DerivedF> & F,\n  const int k,\n  Eigen::SparseMatrix<DerivedQ> & Q)\n{\n  Eigen::SparseMatrix<DerivedQ> L,M;\n  cotmatrix(V,F,L);\n  if(k>1)\n  {\n    massmatrix(V,F,MASSMATRIX_TYPE_DEFAULT,M);\n  }\n  return harmonic(L,M,k,Q);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate bool igl::harmonic<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n// generated by autoexplicit.sh\ntemplate bool igl::harmonic<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 1, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> >&);\n// generated by autoexplicit.sh\ntemplate bool igl::harmonic<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::harmonic<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, double>(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, int, Eigen::SparseMatrix<double, 0, int>&);\n// generated by autoexplicit.sh\ntemplate bool igl::harmonic<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\n// generated by autoexplicit.sh\ntemplate bool igl::harmonic<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/harmonic.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_HARMONIC_H\n#define IGL_HARMONIC_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <Eigen/Sparse>\nnamespace igl\n{\n  // Compute k-harmonic weight functions \"coordinates\".\n  //\n  //\n  // Inputs:\n  //   V  #V by dim vertex positions\n  //   F  #F by simplex-size list of element indices\n  //   b  #b boundary indices into V\n  //   bc #b by #W list of boundary values\n  //   k  power of harmonic operation (1: harmonic, 2: biharmonic, etc)\n  // Outputs:\n  //   W  #V by #W list of weights\n  //\n  template <\n    typename DerivedV,\n    typename DerivedF,\n    typename Derivedb,\n    typename Derivedbc,\n    typename DerivedW>\n  IGL_INLINE bool harmonic(\n    const Eigen::MatrixBase<DerivedV> & V,\n    const Eigen::MatrixBase<DerivedF> & F,\n    const Eigen::MatrixBase<Derivedb> & b,\n    const Eigen::MatrixBase<Derivedbc> & bc,\n    const int k,\n    Eigen::PlainObjectBase<DerivedW> & W);\n  // Compute harmonic map using uniform laplacian operator\n  //\n  // Inputs:\n  //   F  #F by simplex-size list of element indices\n  //   b  #b boundary indices into V\n  //   bc #b by #W list of boundary values\n  //   k  power of harmonic operation (1: harmonic, 2: biharmonic, etc)\n  // Outputs:\n  //   W  #V by #W list of weights\n  //\n  template <\n    typename DerivedF,\n    typename Derivedb,\n    typename Derivedbc,\n    typename DerivedW>\n  IGL_INLINE bool harmonic(\n    const Eigen::MatrixBase<DerivedF> & F,\n    const Eigen::MatrixBase<Derivedb> & b,\n    const Eigen::MatrixBase<Derivedbc> & bc,\n    const int k,\n    Eigen::PlainObjectBase<DerivedW> & W);\n  // Compute a harmonic map using a given Laplacian and mass matrix\n  //\n  // Inputs:\n  //   L  #V by #V discrete (integrated) Laplacian  \n  //   M  #V by #V mass matrix\n  //   b  #b boundary indices into V\n  //   bc  #b by #W list of boundary values\n  //   k  power of harmonic operation (1: harmonic, 2: biharmonic, etc)\n  // Outputs:\n  //   W  #V by #V list of weights\n  template <\n    typename DerivedL,\n    typename DerivedM,\n    typename Derivedb,\n    typename Derivedbc,\n    typename DerivedW>\n  IGL_INLINE bool harmonic(\n    const Eigen::SparseMatrix<DerivedL> & L,\n    const Eigen::SparseMatrix<DerivedM> & M,\n    const Eigen::MatrixBase<Derivedb> & b,\n    const Eigen::MatrixBase<Derivedbc> & bc,\n    const int k,\n    Eigen::PlainObjectBase<DerivedW> & W);\n  // Build the discrete k-harmonic operator (computing integrated quantities).\n  // That is, if the k-harmonic PDE is Q x = 0, then this minimizes x' Q x\n  //\n  // Inputs:\n  //   L  #V by #V discrete (integrated) Laplacian  \n  //   M  #V by #V mass matrix\n  //   k  power of harmonic operation (1: harmonic, 2: biharmonic, etc)\n  // Outputs:\n  //   Q  #V by #V discrete (integrated) k-Laplacian  \n  template <\n    typename DerivedL,\n    typename DerivedM,\n    typename DerivedQ>\n  IGL_INLINE void harmonic(\n    const Eigen::SparseMatrix<DerivedL> & L,\n    const Eigen::SparseMatrix<DerivedM> & M,\n    const int k,\n    Eigen::SparseMatrix<DerivedQ> & Q);\n  // Inputs:\n  //   V  #V by dim vertex positions\n  //   F  #F by simplex-size list of element indices\n  //   k  power of harmonic operation (1: harmonic, 2: biharmonic, etc)\n  // Outputs:\n  //   Q  #V by #V discrete (integrated) k-Laplacian  \n  template <\n    typename DerivedV,\n    typename DerivedF,\n    typename DerivedQ>\n  IGL_INLINE void harmonic(\n    const Eigen::MatrixBase<DerivedV> & V,\n    const Eigen::MatrixBase<DerivedF> & F,\n    const int k,\n    Eigen::SparseMatrix<DerivedQ> & Q);\n};\n\n#ifndef IGL_STATIC_LIBRARY\n#include \"harmonic.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/harwell_boeing.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"harwell_boeing.h\"\n\ntemplate <typename Scalar, typename Index>\nIGL_INLINE void igl::harwell_boeing(\n  const Eigen::SparseMatrix<Scalar> & A,\n  int & num_rows,\n  std::vector<Scalar> & V,\n  std::vector<Index> & R,\n  std::vector<Index> & C)\n{\n  num_rows = A.rows();\n  int num_cols = A.cols();\n  int nnz = A.nonZeros();\n  V.resize(nnz);\n  R.resize(nnz);\n  C.resize(num_cols+1);\n\n  // Assumes outersize is columns\n  assert(A.cols() == A.outerSize());\n  int column_pointer = 0;\n  int i = 0;\n  int k = 0;\n  // Iterate over outside\n  for(; k<A.outerSize(); ++k)\n  {\n    C[k] = column_pointer;\n    // Iterate over inside\n    for(typename Eigen::SparseMatrix<Scalar>::InnerIterator it (A,k); it; ++it)\n    {\n      V[i] = it.value();\n      R[i] = it.row();\n      i++;\n      // Also increment column pointer\n      column_pointer++; \n    }\n  }\n  // by convention C[num_cols] = nnz\n  C[k] = column_pointer;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::harwell_boeing<double, int>(Eigen::SparseMatrix<double, 0, int> const&, int&, std::vector<double, std::allocator<double> >&, std::vector<int, std::allocator<int> >&, std::vector<int, std::allocator<int> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/harwell_boeing.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_HARWELL_BOEING_H\n#define IGL_HARWELL_BOEING_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Sparse>\n#include <vector>\n\n\nnamespace igl\n{\n  // Convert the matrix to Compressed sparse column (CSC or CCS) format,\n  // also known as Harwell Boeing format. As described:\n  // http://netlib.org/linalg/html_templates/node92.html\n  // or\n  // http://en.wikipedia.org/wiki/Sparse_matrix\n  //   #Compressed_sparse_column_.28CSC_or_CCS.29\n  // Templates:\n  //   Scalar  type of sparse matrix like double\n  // Inputs:\n  //   A  sparse m by n matrix\n  // Outputs:\n  //   num_rows  number of rows\n  //   V  non-zero values, row indices running fastest, size(V) = nnz \n  //   R  row indices corresponding to vals, size(R) = nnz\n  //   C  index in vals of first entry in each column, size(C) = num_cols+1\n  //\n  // All indices and pointers are 0-based\n  template <typename Scalar, typename Index>\n  IGL_INLINE void harwell_boeing(\n    const Eigen::SparseMatrix<Scalar> & A,\n    int & num_rows,\n    std::vector<Scalar> & V,\n    std::vector<Index> & R,\n    std::vector<Index> & C);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"harwell_boeing.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/hausdorff.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"hausdorff.h\"\n#include \"point_mesh_squared_distance.h\"\n\ntemplate <\n  typename DerivedVA, \n  typename DerivedFA,\n  typename DerivedVB,\n  typename DerivedFB,\n  typename Scalar>\nIGL_INLINE void igl::hausdorff(\n  const Eigen::PlainObjectBase<DerivedVA> & VA, \n  const Eigen::PlainObjectBase<DerivedFA> & FA,\n  const Eigen::PlainObjectBase<DerivedVB> & VB, \n  const Eigen::PlainObjectBase<DerivedFB> & FB,\n  Scalar & d)\n{\n  using namespace Eigen;\n  assert(VA.cols() == 3 && \"VA should contain 3d points\");\n  assert(FA.cols() == 3 && \"FA should contain triangles\");\n  assert(VB.cols() == 3 && \"VB should contain 3d points\");\n  assert(FB.cols() == 3 && \"FB should contain triangles\");\n  Matrix<Scalar,Dynamic,1> sqr_DBA,sqr_DAB;\n  Matrix<typename DerivedVA::Index,Dynamic,1> I;\n  Matrix<typename DerivedVA::Scalar,Dynamic,3> C;\n  point_mesh_squared_distance(VB,VA,FA,sqr_DBA,I,C);\n  point_mesh_squared_distance(VA,VB,FB,sqr_DAB,I,C);\n  const Scalar dba = sqr_DBA.maxCoeff();\n  const Scalar dab = sqr_DAB.maxCoeff();\n  d = sqrt(std::max(dba,dab));\n}\n\n#ifdef IGL_STATIC_LIBRARY\ntemplate void igl::hausdorff<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, double>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, double&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/hausdorff.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_HAUSDORFF_H\n#define IGL_HAUSDORFF_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Dense>\n\nnamespace igl \n{\n  // HAUSDORFF compute the Hausdorff distance between mesh (VA,FA) and mesh\n  // (VB,FB). This is the \n  //\n  // d(A,B) = max ( max min d(a,b) , max min d(b,a) )\n  //                a∈A b∈B          b∈B a∈A\n  //\n  // Known issue: This is only computing max(min(va,B),min(vb,A)). This is\n  // better than max(min(va,Vb),min(vb,Va)). This (at least) is missing\n  // \"edge-edge\" cases like the distance between the two different\n  // triangulations of a non-planar quad in 3D. Even simpler, consider the\n  // Hausdorff distance between the non-convex, block letter V polygon (with 7\n  // vertices) in 2D and its convex hull. The Hausdorff distance is defined by\n  // the midpoint in the middle of the segment across the concavity and some\n  // non-vertex point _on the edge_ of the V.\n  //\n  // Inputs:\n  //   VA  #VA by 3 list of vertex positions\n  //   FA  #FA by 3 list of face indices into VA\n  //   VB  #VB by 3 list of vertex positions\n  //   FB  #FB by 3 list of face indices into VB\n  // Outputs:\n  //   d  hausdorff distance\n  //   //pair  2 by 3 list of \"determiner points\" so that pair(1,:) is from A\n  //   //  and pair(2,:) is from B\n  //\n  template <\n    typename DerivedVA, \n    typename DerivedFA,\n    typename DerivedVB,\n    typename DerivedFB,\n    typename Scalar>\n  IGL_INLINE void hausdorff(\n    const Eigen::PlainObjectBase<DerivedVA> & VA, \n    const Eigen::PlainObjectBase<DerivedFA> & FA,\n    const Eigen::PlainObjectBase<DerivedVB> & VB, \n    const Eigen::PlainObjectBase<DerivedFB> & FB,\n    Scalar & d);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"hausdorff.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/histc.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"histc.h\"\n#include <cassert>\n#include <iostream>\n\ntemplate <typename DerivedX, typename DerivedE, typename DerivedN, typename DerivedB>\nIGL_INLINE void igl::histc(\n  const Eigen::MatrixBase<DerivedX > & X,\n  const Eigen::MatrixBase<DerivedE > & E,\n  Eigen::PlainObjectBase<DerivedN > & N,\n  Eigen::PlainObjectBase<DerivedB > & B)\n{\n  histc(X,E,B);\n  const int n = E.size();\n  const int m = X.size();\n  assert(m == B.size());\n  N.resize(n,1);\n  N.setConstant(0);\n#pragma omp parallel for\n  for(int j = 0;j<m;j++)\n  {\n    if(B(j) >= 0)\n    {\n#pragma omp atomic\n      N(B(j))++;\n    }\n  }\n}\n\ntemplate <typename DerivedX, typename DerivedE, typename DerivedB>\nIGL_INLINE void igl::histc(\n  const Eigen::MatrixBase<DerivedX > & X,\n  const Eigen::MatrixBase<DerivedE > & E,\n  Eigen::PlainObjectBase<DerivedB > & B)\n{\n  const int m = X.size();\n  using namespace std;\n  assert( \n    (E.bottomRightCorner(E.size()-1,1) -\n      E.topLeftCorner(E.size()-1,1)).maxCoeff() >= 0 && \n    \"E should be monotonically increasing\");\n  B.resize(m,1);\n#pragma omp parallel for\n  for(int j = 0;j<m;j++)\n  {\n    const double x = X(j);\n    // Boring one-offs\n    if(x < E(0) || x > E(E.size()-1))\n    {\n      B(j) = -1;\n      continue;\n    }\n    // Find x in E\n    int l = 0;\n    int h = E.size()-1;\n    int k = l;\n    while((h-l)>1)\n    {\n      assert(x >= E(l));\n      assert(x <= E(h));\n      k = (h+l)/2;\n      if(x < E(k))\n      {\n        h = k;\n      }else\n      {\n        l = k;\n      }\n    }\n    if(x == E(h))\n    {\n      k = h;\n    }else\n    {\n      k = l;\n    }\n    B(j) = k;\n  }\n}\n\ntemplate <typename DerivedE>\nIGL_INLINE void igl::histc(\n    const typename DerivedE::Scalar & x,\n    const Eigen::MatrixBase<DerivedE > & E,\n    typename DerivedE::Index & b)\n{\n  Eigen::Matrix<typename DerivedE::Scalar,1,1> X;\n  X(0) = x;\n  Eigen::Matrix<typename DerivedE::Index,1,1> B;\n  hist(X,E,B);\n  b = B(0);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::histc<Eigen::CwiseNullaryOp<Eigen::internal::linspaced_op<int, true>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::CwiseNullaryOp<Eigen::internal::linspaced_op<int, true>, Eigen::Matrix<int, -1, 1, 0, -1, 1> > > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::histc<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\ntemplate void igl::histc<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::histc<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::histc<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::histc<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/histc.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_HISTC_H\n#define IGL_HISTC_H\n\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n\nnamespace igl\n{\n  // Like matlab's histc. Count occurances of values in X between consecutive\n  // entries in E\n  //\n  // Inputs:\n  //   X  m-long Vector of values\n  //   E  n-long Monotonically increasing vector of edges\n  // Outputs:\n  //   N  n-long vector where N(k) reveals how many values in X fall between\n  //     E(k) <= X < E(k+1)\n  //   B  m-long vector of bin ids so that B(j) = k if E(k) <= X(j) < E(k+1).\n  //     B(j) = -1 if X(j) is outside of E.\n  //\n  // O(n+m*log(n))\n  template <typename DerivedX, typename DerivedE, typename DerivedN, typename DerivedB>\n  IGL_INLINE void histc(\n    const Eigen::MatrixBase<DerivedX > & X,\n    const Eigen::MatrixBase<DerivedE > & E,\n    Eigen::PlainObjectBase<DerivedN > & N,\n    Eigen::PlainObjectBase<DerivedB > & B);\n  // Truly O(m*log(n))\n  template <typename DerivedX, typename DerivedE, typename DerivedB>\n  IGL_INLINE void histc(\n    const Eigen::MatrixBase<DerivedX > & X,\n    const Eigen::MatrixBase<DerivedE > & E,\n    Eigen::PlainObjectBase<DerivedB > & B);\n  // Scalar search wrapper\n  template <typename DerivedE>\n  IGL_INLINE void histc(\n    const typename DerivedE::Scalar & x,\n    const Eigen::MatrixBase<DerivedE > & E,\n    typename DerivedE::Index & b);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"histc.cpp\"\n#endif\n\n#endif\n\n\n\n"
  },
  {
    "path": "libs/libigl/include/igl/hsv_to_rgb.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"hsv_to_rgb.h\"\n#include <cmath>\n\n\ntemplate <typename T>\nIGL_INLINE void igl::hsv_to_rgb(const T * hsv, T * rgb)\n{\n  igl::hsv_to_rgb(\n      hsv[0],hsv[1],hsv[2],\n      rgb[0],rgb[1],rgb[2]);\n}\n\ntemplate <typename T>\nIGL_INLINE void igl::hsv_to_rgb(\n  const T & h, const T & s, const T & v,\n  T & r, T & g, T & b)\n{\n  // From medit\n  double f,p,q,t,hh;\n  int    i;\n  hh = ((int)h % 360) / 60.;\n  i = (int)std::floor(hh);    /* largest int <= h     */\n  f = hh - i;                    /* fractional part of h */\n  p = v * (1.0 - s);\n  q = v * (1.0 - (s * f));\n  t = v * (1.0 - (s * (1.0 - f)));\n\n  switch(i) {\n  case 0: r = v; g = t; b = p; break;\n  case 1: r = q; g = v; b = p; break;\n  case 2: r = p; g = v; b = t; break;\n  case 3: r = p; g = q; b = v; break;\n  case 4: r = t; g = p; b = v; break;\n  case 5: r = v; g = p; b = q; break;\n  }\n}\n\ntemplate <typename DerivedH, typename DerivedR>\nvoid igl::hsv_to_rgb(\n  const Eigen::PlainObjectBase<DerivedH> & H,\n  Eigen::PlainObjectBase<DerivedR> & R)\n{\n  assert(H.cols() == 3);\n  R.resizeLike(H);\n  for(typename DerivedH::Index r = 0;r<H.rows();r++)\n  {\n    typename DerivedH::Scalar hsv[3];\n    hsv[0] = H(r,0);\n    hsv[1] = H(r,1);\n    hsv[2] = H(r,2);\n    typename DerivedR::Scalar rgb[] = {0,0,0};\n    hsv_to_rgb(hsv,rgb);\n    R(r,0) = rgb[0];\n    R(r,1) = rgb[1];\n    R(r,2) = rgb[2];\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\ntemplate void igl::hsv_to_rgb<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::hsv_to_rgb<Eigen::Matrix<float, -1, -1, 0, -1, -1>, Eigen::Matrix<float, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<float, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, -1, 0, -1, -1> >&);\ntemplate void igl::hsv_to_rgb<Eigen::Matrix<unsigned char, 64, 3, 1, 64, 3>, Eigen::Matrix<unsigned char, 64, 3, 1, 64, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<unsigned char, 64, 3, 1, 64, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<unsigned char, 64, 3, 1, 64, 3> >&);\ntemplate void igl::hsv_to_rgb<Eigen::Matrix<float, 64, 3, 1, 64, 3>, Eigen::Matrix<float, 64, 3, 1, 64, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<float, 64, 3, 1, 64, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, 64, 3, 1, 64, 3> >&);\ntemplate void igl::hsv_to_rgb<double>(double const*, double*);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/hsv_to_rgb.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_HSV_TO_RGB_H\n#define IGL_HSV_TO_RGB_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Convert RGB to HSV\n  //\n  // Inputs:\n  //   h  hue value (degrees: [0,360])\n  //   s  saturation value ([0,1])\n  //   v  value value ([0,1])\n  // Outputs:\n  //   r  red value ([0,1]) \n  //   g  green value ([0,1])\n  //   b  blue value ([0,1])\n  template <typename T>\n  IGL_INLINE void hsv_to_rgb(const T * hsv, T * rgb);\n  template <typename T>\n  IGL_INLINE void hsv_to_rgb( \n    const T & h, const T & s, const T & v, \n    T & r, T & g, T & b);\n  template <typename DerivedH, typename DerivedR>\n  void hsv_to_rgb(\n    const Eigen::PlainObjectBase<DerivedH> & H,\n    Eigen::PlainObjectBase<DerivedR> & R);\n};\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"hsv_to_rgb.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/igl_inline.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n// This should *NOT* be contained in a IGL_*_H ifdef, since it may be defined\n// differently based on when it is included\n#ifdef IGL_INLINE\n#undef IGL_INLINE\n#endif\n\n#ifndef IGL_STATIC_LIBRARY\n#  define IGL_INLINE inline\n#else\n#  define IGL_INLINE\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/in_element.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"in_element.h\"\n\ntemplate <typename DerivedV, typename DerivedQ, int DIM>\nIGL_INLINE void igl::in_element(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::MatrixXi & Ele,\n  const Eigen::PlainObjectBase<DerivedQ> & Q,\n  const AABB<DerivedV,DIM> & aabb,\n  Eigen::VectorXi & I)\n{\n  using namespace std;\n  using namespace Eigen;\n  const int Qr = Q.rows();\n  I.setConstant(Qr,1,-1);\n#pragma omp parallel for if (Qr>10000)\n  for(int e = 0;e<Qr;e++)\n  {\n    // find all\n    const auto R = aabb.find(V,Ele,Q.row(e).eval(),true);\n    if(!R.empty())\n    {\n      I(e) = R[0];\n    }\n  }\n}\n\ntemplate <typename DerivedV, typename DerivedQ, int DIM, typename Scalar>\nIGL_INLINE void igl::in_element(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::MatrixXi & Ele,\n  const Eigen::PlainObjectBase<DerivedQ> & Q,\n  const AABB<DerivedV,DIM> & aabb,\n  Eigen::SparseMatrix<Scalar> & I)\n{\n  using namespace std;\n  using namespace Eigen;\n  const int Qr = Q.rows();\n  std::vector<Triplet<Scalar> > IJV;\n  IJV.reserve(Qr);\n#pragma omp parallel for if (Qr>10000)\n  for(int e = 0;e<Qr;e++)\n  {\n    // find all\n    const auto R = aabb.find(V,Ele,Q.row(e).eval(),false);\n    for(const auto r : R)\n    {\n#pragma omp critical\n      IJV.push_back(Triplet<Scalar>(e,r,1));\n    }\n  }\n  I.resize(Qr,Ele.rows());\n  I.setFromTriplets(IJV.begin(),IJV.end());\n}\n\n#ifdef IGL_STATIC_LIBRARY\ntemplate void igl::in_element<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, 2>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 2> const&, Eigen::Matrix<int, -1, 1, 0, -1, 1>&);\ntemplate void igl::in_element<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, 3>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 3> const&, Eigen::Matrix<int, -1, 1, 0, -1, 1>&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/in_element.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_IN_ELEMENT_H\n#define IGL_IN_ELEMENT_H\n\n#include \"igl_inline.h\"\n#include \"AABB.h\"\n#include <Eigen/Core>\n#include <Eigen/Sparse>\n\nnamespace igl\n{\n  // Determine whether each point in a list of points is in the elements of a\n  // mesh.\n  //\n  // templates:\n  //   DIM  dimension of vertices in V (# of columns)\n  // Inputs:\n  //   V  #V by dim list of mesh vertex positions.\n  //   Ele  #Ele by dim+1 list of mesh indices into #V.\n  //   Q  #Q by dim list of query point positions\n  //   aabb  axis-aligned bounding box tree object (see AABB.h)\n  // Outputs:\n  //   I  #Q list of indices into Ele of first containing element (-1 means no\n  //     containing element)\n  template <typename DerivedV, typename DerivedQ, int DIM>\n  IGL_INLINE void in_element(\n    const Eigen::PlainObjectBase<DerivedV> & V,\n    const Eigen::MatrixXi & Ele,\n    const Eigen::PlainObjectBase<DerivedQ> & Q,\n    const AABB<DerivedV,DIM> & aabb,\n    Eigen::VectorXi & I);\n  // Outputs:\n  //   I  #Q by #Ele sparse matrix revealing whether each element contains each\n  //     point: I(q,e) means point q is in element e\n  template <typename DerivedV, typename DerivedQ, int DIM, typename Scalar>\n  IGL_INLINE void in_element(\n    const Eigen::PlainObjectBase<DerivedV> & V,\n    const Eigen::MatrixXi & Ele,\n    const Eigen::PlainObjectBase<DerivedQ> & Q,\n    const AABB<DerivedV,DIM> & aabb,\n    Eigen::SparseMatrix<Scalar> & I);\n};\n\n#ifndef IGL_STATIC_LIBRARY\n#include \"in_element.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/infinite_cost_stopping_condition.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"infinite_cost_stopping_condition.h\"\n\nIGL_INLINE void igl::infinite_cost_stopping_condition(\n  const std::function<void(\n    const int,\n    const Eigen::MatrixXd &,\n    const Eigen::MatrixXi &,\n    const Eigen::MatrixXi &,\n    const Eigen::VectorXi &,\n    const Eigen::MatrixXi &,\n    const Eigen::MatrixXi &,\n    double &,\n    Eigen::RowVectorXd &)> & cost_and_placement,\n  std::function<bool(\n    const Eigen::MatrixXd &,\n    const Eigen::MatrixXi &,\n    const Eigen::MatrixXi &,\n    const Eigen::VectorXi &,\n    const Eigen::MatrixXi &,\n    const Eigen::MatrixXi &,\n    const std::set<std::pair<double,int> > &,\n    const std::vector<std::set<std::pair<double,int> >::iterator > &,\n    const Eigen::MatrixXd &,\n    const int,\n    const int,\n    const int,\n    const int,\n    const int)> & stopping_condition)\n{\n  stopping_condition = \n    [&cost_and_placement]\n    (\n    const Eigen::MatrixXd & V,\n    const Eigen::MatrixXi & F,\n    const Eigen::MatrixXi & E,\n    const Eigen::VectorXi & EMAP,\n    const Eigen::MatrixXi & EF,\n    const Eigen::MatrixXi & EI,\n    const std::set<std::pair<double,int> > & Q,\n    const std::vector<std::set<std::pair<double,int> >::iterator > & Qit,\n    const Eigen::MatrixXd & C,\n    const int e,\n    const int /*e1*/,\n    const int /*e2*/,\n    const int /*f1*/,\n    const int /*f2*/)->bool\n    {\n      Eigen::RowVectorXd p;\n      double cost;\n      cost_and_placement(e,V,F,E,EMAP,EF,EI,cost,p);\n      return std::isinf(cost);\n    };\n}\n\nIGL_INLINE \n  std::function<bool(\n    const Eigen::MatrixXd &,\n    const Eigen::MatrixXi &,\n    const Eigen::MatrixXi &,\n    const Eigen::VectorXi &,\n    const Eigen::MatrixXi &,\n    const Eigen::MatrixXi &,\n    const std::set<std::pair<double,int> > &,\n    const std::vector<std::set<std::pair<double,int> >::iterator > &,\n    const Eigen::MatrixXd &,\n    const int,\n    const int,\n    const int,\n    const int,\n    const int)> \n  igl::infinite_cost_stopping_condition(\n    const std::function<void(\n      const int,\n      const Eigen::MatrixXd &,\n      const Eigen::MatrixXi &,\n      const Eigen::MatrixXi &,\n      const Eigen::VectorXi &,\n      const Eigen::MatrixXi &,\n      const Eigen::MatrixXi &,\n      double &,\n      Eigen::RowVectorXd &)> & cost_and_placement)\n{\n  std::function<bool(\n    const Eigen::MatrixXd &,\n    const Eigen::MatrixXi &,\n    const Eigen::MatrixXi &,\n    const Eigen::VectorXi &,\n    const Eigen::MatrixXi &,\n    const Eigen::MatrixXi &,\n    const std::set<std::pair<double,int> > &,\n    const std::vector<std::set<std::pair<double,int> >::iterator > &,\n    const Eigen::MatrixXd &,\n    const int,\n    const int,\n    const int,\n    const int,\n    const int)> stopping_condition;\n  infinite_cost_stopping_condition(cost_and_placement,stopping_condition);\n  return stopping_condition;\n}\n\n"
  },
  {
    "path": "libs/libigl/include/igl/infinite_cost_stopping_condition.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_INFINITE_COST_STOPPING_CONDITION_H\n#define IGL_INFINITE_COST_STOPPING_CONDITION_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <vector>\n#include <set>\n#include <functional>\nnamespace igl\n{\n  // Stopping condition function compatible with igl::decimate. The output\n  // function handle will return true if cost of next edge is infinite.\n  //\n  // Inputs:\n  //   cost_and_placement  handle being used by igl::collapse_edge\n  // Outputs:\n  //   stopping_condition\n  //\n  IGL_INLINE void infinite_cost_stopping_condition(\n    const std::function<void(\n      const int,\n      const Eigen::MatrixXd &,\n      const Eigen::MatrixXi &,\n      const Eigen::MatrixXi &,\n      const Eigen::VectorXi &,\n      const Eigen::MatrixXi &,\n      const Eigen::MatrixXi &,\n      double &,\n      Eigen::RowVectorXd &)> & cost_and_placement,\n    std::function<bool(\n      const Eigen::MatrixXd &,\n      const Eigen::MatrixXi &,\n      const Eigen::MatrixXi &,\n      const Eigen::VectorXi &,\n      const Eigen::MatrixXi &,\n      const Eigen::MatrixXi &,\n      const std::set<std::pair<double,int> > &,\n      const std::vector<std::set<std::pair<double,int> >::iterator > &,\n      const Eigen::MatrixXd &,\n      const int,\n      const int,\n      const int,\n      const int,\n      const int)> & stopping_condition);\n  IGL_INLINE \n    std::function<bool(\n      const Eigen::MatrixXd &,\n      const Eigen::MatrixXi &,\n      const Eigen::MatrixXi &,\n      const Eigen::VectorXi &,\n      const Eigen::MatrixXi &,\n      const Eigen::MatrixXi &,\n      const std::set<std::pair<double,int> > &,\n      const std::vector<std::set<std::pair<double,int> >::iterator > &,\n      const Eigen::MatrixXd &,\n      const int,\n      const int,\n      const int,\n      const int,\n      const int)> \n    infinite_cost_stopping_condition(\n      const std::function<void(\n        const int,\n        const Eigen::MatrixXd &,\n        const Eigen::MatrixXi &,\n        const Eigen::MatrixXi &,\n        const Eigen::VectorXi &,\n        const Eigen::MatrixXi &,\n        const Eigen::MatrixXi &,\n        double &,\n        Eigen::RowVectorXd &)> & cost_and_placement);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"infinite_cost_stopping_condition.cpp\"\n#endif\n#endif\n\n\n"
  },
  {
    "path": "libs/libigl/include/igl/init_render_to_texture.cpp",
    "content": "#include \"init_render_to_texture.h\"\n#include <cassert>\n\nIGL_INLINE void igl::init_render_to_texture(\n  const size_t width,\n  const size_t height,\n  GLuint & tex_id,\n  GLuint & fbo_id,\n  GLuint & dfbo_id)\n{\n  using namespace std;\n  // Delete if already exists\n  glDeleteTextures(1,&tex_id);\n  glDeleteFramebuffersEXT(1,&fbo_id);\n  glDeleteFramebuffersEXT(1,&dfbo_id);\n  // http://www.opengl.org/wiki/Framebuffer_Object_Examples#Quick_example.2C_render_to_texture_.282D.29\n  glGenTextures(1, &tex_id);\n  glBindTexture(GL_TEXTURE_2D, tex_id);\n  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);\n  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);\n  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);\n  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);\n  //NULL means reserve texture memory, but texels are undefined\n  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F_ARB, width, height, 0, GL_BGRA, GL_FLOAT, NULL);\n  glBindTexture(GL_TEXTURE_2D, 0);\n  glGenFramebuffersEXT(1, &fbo_id);\n  glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo_id);\n  //Attach 2D texture to this FBO\n  glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, tex_id, 0);\n\n  glGenRenderbuffersEXT(1, &dfbo_id);\n  glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, dfbo_id);\n  glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, width, height);\n  //Attach depth buffer to FBO (for this example it's not really needed, but if\n  //drawing a 3D scene it would be necessary to attach something)\n  glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, dfbo_id);\n\n  //Does the GPU support current FBO configuration?\n  GLenum status;\n  status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);\n  assert(status == GL_FRAMEBUFFER_COMPLETE_EXT);\n  // Unbind to clean up\n  glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);\n  glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);\n}\n\n"
  },
  {
    "path": "libs/libigl/include/igl/init_render_to_texture.h",
    "content": "#ifndef IGL_INIT_RENDER_TO_TEXTURE_H\n#define IGL_INIT_RENDER_TO_TEXTURE_H\n#include \"igl_inline.h\"\n#include \"OpenGL_convenience.h\"\n#include <cstdlib>\nnamespace igl\n{\n  // Create a texture+framebuffer+depthbuffer triplet bound for rendering into\n  // the texture;\n  //\n  // Inputs:\n  //   width  image width\n  //   height image height\n  // Outputs:\n  //   tex_id  id of the texture\n  //   fbo_id  id of the frame buffer object\n  //   dfbo_id  id of the depth frame buffer object\n  IGL_INLINE void init_render_to_texture(\n    const size_t width,\n    const size_t height,\n    GLuint & tex_id,\n    GLuint & fbo_id,\n    GLuint & dfbo_id);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"init_render_to_texture.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/inradius.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"inradius.h\"\n#include \"edge_lengths.h\"\n#include \"doublearea.h\"\n\ntemplate <\n  typename DerivedV, \n  typename DerivedF,\n  typename DerivedR>\nIGL_INLINE void igl::inradius(\n  const Eigen::PlainObjectBase<DerivedV> & V, \n  const Eigen::PlainObjectBase<DerivedF> & F,\n  Eigen::PlainObjectBase<DerivedR> & r)\n{\n  Eigen::Matrix<typename DerivedV::Scalar,Eigen::Dynamic,3> l;\n  Eigen::Matrix<typename DerivedV::Scalar,Eigen::Dynamic,1> R;\n  igl::edge_lengths(V,F,l);\n  // If R is the circumradius, \n  // R*r = (abc)/(2*(a+b+c))\n  // R = abc/(4*area)\n  // r(abc/(4*area)) = (abc)/(2*(a+b+c))\n  // r/(4*area) = 1/(2*(a+b+c))\n  // r = (2*area)/(a+b+c)\n  DerivedR A;\n  igl::doublearea(l,0.,A);\n  r = A.array() /l.array().rowwise().sum();\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/inradius.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_INRADIUS_H\n#define IGL_INRADIUS_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Compute the inradius of each triangle in a mesh (V,F)\n  //\n  // Inputs:\n  //   V  #V by dim list of mesh vertex positions\n  //   F  #F by 3 list of triangle indices into V\n  // Outputs:\n  //   R  #F list of inradii\n  //\n  template <\n    typename DerivedV, \n    typename DerivedF,\n    typename DerivedR>\n  IGL_INLINE void inradius(\n    const Eigen::PlainObjectBase<DerivedV> & V, \n    const Eigen::PlainObjectBase<DerivedF> & F,\n    Eigen::PlainObjectBase<DerivedR> & R);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"inradius.cpp\"\n#endif\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/integrable_polyvector_fields.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2015 Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include <igl/integrable_polyvector_fields.h>\n#include <igl/field_local_global_conversions.h>\n#include <igl/parallel_transport_angles.h>\n#include <igl/local_basis.h>\n#include <igl/edge_topology.h>\n#include <igl/sparse.h>\n#include <igl/sort.h>\n#include <igl/slice.h>\n#include <igl/slice_into.h>\n#include <igl/sort_vectors_ccw.h>\n#include <iostream>\n\nIGL_INLINE igl::integrable_polyvector_fields_parameters::integrable_polyvector_fields_parameters():\nnumIter(5),\nwBarrier(0.1),\nsBarrier(0.9),\nwCurl(10),\nwQuotCurl(10),\nwSmooth(1.),\nwCloseUnconstrained(1e-3),\nwCloseConstrained(100),\nredFactor_wsmooth(.8),\ngamma(0.1),\ntikh_gamma(1e-8)\n{}\n\n\n\n\nnamespace igl {\n  template <typename DerivedV, typename DerivedF, typename DerivedFF, typename DerivedC>\n  class IntegrableFieldSolver\n  {\n  private:\n\n    IntegrableFieldSolverData<DerivedV, DerivedF, DerivedFF, DerivedC> &data;\n    //Symbolic calculations\n    IGL_INLINE void rj_barrier_face(const Eigen::RowVectorXd &vec2D_a,\n                                    const double &s,\n                                    Eigen::VectorXd &residuals,\n                                    bool do_jac = false,\n                                    Eigen::MatrixXd &J = *(Eigen::MatrixXd*)NULL);\n    IGL_INLINE void rj_polycurl_edge(const Eigen::RowVectorXd &vec2D_a,\n                                     const Eigen::RowVector2d &ea,\n                                     const Eigen::RowVectorXd &vec2D_b,\n                                     const Eigen::RowVector2d &eb,\n                                     Eigen::VectorXd &residuals,\n                                     bool do_jac = false,\n                                     Eigen::MatrixXd &Jac = *(Eigen::MatrixXd*)NULL);\n    IGL_INLINE void rj_quotcurl_edge_polyversion(const Eigen::RowVectorXd &vec2D_a,\n                                                 const Eigen::RowVector2d &ea,\n                                                 const Eigen::RowVectorXd &vec2D_b,\n                                                 const Eigen::RowVector2d &eb,\n                                                 Eigen::VectorXd &residuals,\n                                                 bool do_jac = false,\n                                                 Eigen::MatrixXd &Jac = *(Eigen::MatrixXd*)NULL);\n    IGL_INLINE void rj_smoothness_edge(const Eigen::RowVectorXd &vec2D_a,\n                                       const Eigen::RowVectorXd &vec2D_b,\n                                       const double &k,\n                                       const int nA,\n                                       const int nB,\n                                       Eigen::VectorXd &residuals,\n                                       bool do_jac = false,\n                                       Eigen::MatrixXd &Jac = *(Eigen::MatrixXd*)NULL);\n\n  public:\n    IGL_INLINE IntegrableFieldSolver(IntegrableFieldSolverData<DerivedV, DerivedF, DerivedFF, DerivedC> &cffsoldata);\n\n    IGL_INLINE bool solve(integrable_polyvector_fields_parameters &params,\n                          Eigen::PlainObjectBase<DerivedFF>& current_field,\n                          bool current_field_is_not_ccw);\n\n    IGL_INLINE void solveGaussNewton(integrable_polyvector_fields_parameters &params,\n                                     const Eigen::VectorXd &x_initial,\n                                     Eigen::VectorXd &x);\n\n    //Compute residuals and Jacobian for Gauss Newton\n    IGL_INLINE double RJ(const Eigen::VectorXd &x,\n                         const Eigen::VectorXd &x0,\n                         const integrable_polyvector_fields_parameters &params,\n                         bool doJacs = false);\n\n    IGL_INLINE void RJ_Smoothness(const Eigen::MatrixXd &sol2D,\n                                  const double &wSmoothSqrt,\n                                  const int startRowInJacobian,\n                                  bool doJacs = false,\n                                  const int startIndexInVectors = 0);\n    IGL_INLINE void RJ_Barrier(const Eigen::MatrixXd &sol2D,\n                               const double &s,\n                               const double &wBarrierSqrt,\n                               const int startRowInJacobian,\n                               bool doJacs = false,\n                               const int startIndexInVectors = 0);\n    IGL_INLINE void RJ_Closeness(const Eigen::MatrixXd &sol2D,\n                                 const Eigen::MatrixXd &sol02D,\n                                 const double &wCloseUnconstrainedSqrt,\n                                 const double &wCloseConstrainedSqrt,\n                                 const int startRowInJacobian,\n                                 bool doJacs = false,\n                                 const int startIndexInVectors = 0);\n    IGL_INLINE void RJ_Curl(const Eigen::MatrixXd &sol2D,\n                            const double &wCASqrt,\n                            const double &wCBSqrt,\n                            const int startRowInJacobian,\n                            bool doJacs = false,\n                            const int startIndexInVectors = 0);\n    IGL_INLINE void RJ_QuotCurl(const Eigen::MatrixXd &sol2D,\n                                const double &wQuotCurlSqrt,\n                                const int startRowInJacobian,\n                                bool doJacs = false,\n                                const int startIndexInVectors = 0);\n\n\n  };\n};\n\n\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedFF, typename DerivedC>\nIGL_INLINE igl::IntegrableFieldSolverData<DerivedV, DerivedF, DerivedFF, DerivedC>::IntegrableFieldSolverData()\n{}\n\n\ntemplate<typename DerivedV, typename DerivedF, typename DerivedFF, typename DerivedC>\nIGL_INLINE void igl::IntegrableFieldSolverData<DerivedV, DerivedF, DerivedFF, DerivedC>::\nprecomputeMesh(const Eigen::PlainObjectBase<DerivedV> &_V,\n               const Eigen::PlainObjectBase<DerivedF> &_F)\n{\n  numV = _V.rows();\n  numF = _F.rows();\n  numVariables = 2*2*numF;\n  //Mesh stuff\n  igl::edge_topology(_V,_F,E,F2E,E2F);\n  numE = E.rows();\n  igl::local_basis(_V,_F,B1,B2,FN);\n  computeInteriorEdges();\n  igl::parallel_transport_angles(_V, _F, FN, E2F, F2E, K);\n  EVecNorm.setZero(numE,3);\n  for (int k = 0; k<numE; ++k)\n    EVecNorm.row(k) = (_V.row(E(k,1))-_V.row(E(k,0))).normalized();\n}\n\ntemplate<typename DerivedV, typename DerivedF, typename DerivedFF, typename DerivedC>\nIGL_INLINE void igl::IntegrableFieldSolverData<DerivedV, DerivedF, DerivedFF, DerivedC>::\ninitializeConstraints(const Eigen::VectorXi& b,\n                      const Eigen::PlainObjectBase<DerivedC>& bc,\n                      const Eigen::VectorXi& constraint_level)\n{\n  //save constrained\n  Eigen::VectorXi iSorted, constrained_unsorted;\n  constrained_unsorted.resize(2*2*b.size());\n  is_constrained_face.setZero(numF, 1);\n  int ind = 0;\n  indInConstrained.setConstant(numF,1,-1);\n  for (int k =0; k<b.size(); ++k)\n  {\n    is_constrained_face[b[k]] = constraint_level[k];\n    for (int i=0; i<2;++i)\n    {\n      int xi = 2*2*b[k] + 2*i +0;\n      int yi = 2*2*b[k] + 2*i +1;\n      constrained_unsorted[ind++] = xi;\n      constrained_unsorted[ind++] = yi;\n    }\n    indInConstrained[b[k]] = k;\n  }\n  //sort in descending order (so removing rows will work)\n  igl::sort(constrained_unsorted, 1, false, constrained, iSorted);\n  constrained_vec3 = bc.template cast<double>();\n\n}\n\ntemplate<typename DerivedV, typename DerivedF, typename DerivedFF, typename DerivedC>\nIGL_INLINE void igl::IntegrableFieldSolverData<DerivedV, DerivedF, DerivedFF, DerivedC>::\nmakeFieldCCW(Eigen::MatrixXd &sol3D)\n{\n  //sort ccw\n  Eigen::RowVectorXd t;\n  Eigen::RowVectorXd all(1,2*2*3);\n  Eigen::VectorXi order;\n  for (int fi=0; fi<numF; ++fi)\n  {\n    //take all 4 vectors (including opposites) and pick two that are in ccw order\n    all << sol3D.row(fi), -sol3D.row(fi);\n\t  igl::sort_vectors_ccw(all, FN.row(fi).eval(), order, t);\n    //if we are in a constrained face, we need to make sure that the first vector is always the same vector as in the constraints\n    if(is_constrained_face[fi])\n    {\n      const Eigen::RowVector3d &constraint = constrained_vec3.block(indInConstrained[fi], 0, 1, 3);;\n      int best_i = -1; double best_score = std::numeric_limits<double>::max();\n      for (int i = 0; i<2*2; ++i)\n      {\n        double score = (t.segment(i*3,3) - constraint).norm();\n        if (score<best_score)\n        {\n          best_score = score;\n          best_i = i;\n        }\n      }\n      //do a circshift\n      Eigen::RowVectorXd temp = t.segment(0, 3*best_i);\n      int s1 = 3*best_i;\n      int n2 = 3*best_i;\n      int n1 = 3*2*2-n2;\n      t.segment(0,n1) = t.segment(s1,n1);\n      t.segment(n1, n2) = temp;\n\n    }\n    sol3D.row(fi) = t.segment(0, 2*3);\n  }\n}\n\ntemplate<typename DerivedV, typename DerivedF, typename DerivedFF, typename DerivedC>\nIGL_INLINE void igl::IntegrableFieldSolverData<DerivedV, DerivedF, DerivedFF, DerivedC>::\ninitializeOriginalVariable(const Eigen::PlainObjectBase<DerivedFF>& original_field)\n{\n  Eigen::MatrixXd sol2D;\n  Eigen::MatrixXd sol3D = original_field.template cast<double>();\n  makeFieldCCW(sol3D);\n  igl::global2local(B1, B2, sol3D, sol2D);\n  xOriginal.setZero(numVariables);\n  for (int i =0; i<numF; i++)\n    xOriginal.segment(i*2*2, 2*2) = sol2D.row(i);\n\n}\n\ntemplate<typename DerivedV, typename DerivedF, typename DerivedFF, typename DerivedC>\nIGL_INLINE void igl::IntegrableFieldSolverData<DerivedV, DerivedF, DerivedFF, DerivedC>::\ncomputeInteriorEdges()\n{\n  Eigen::VectorXi isBorderEdge;\n  // Flag border edges\n  numInteriorEdges = 0;\n  isBorderEdge.setZero(numE,1);\n  indFullToInterior = -1*Eigen::VectorXi::Ones(numE,1);\n\n  for(unsigned i=0; i<numE; ++i)\n  {\n    if ((E2F(i,0) == -1) || ((E2F(i,1) == -1)))\n      isBorderEdge[i] = 1;\n    else\n    {\n      indFullToInterior[i] = numInteriorEdges;\n      numInteriorEdges++;\n    }\n  }\n\n  E2F_int.resize(numInteriorEdges, 2);\n  indInteriorToFull.setZero(numInteriorEdges,1);\n  int ii = 0;\n  for (int k=0; k<numE; ++k)\n  {\n    if (isBorderEdge[k])\n      continue;\n    E2F_int.row(ii) = E2F.row(k);\n    indInteriorToFull[ii] = k;\n    ii++;\n  }\n\n}\n\ntemplate<typename DerivedV, typename DerivedF, typename DerivedFF, typename DerivedC>\nIGL_INLINE void igl::IntegrableFieldSolverData<DerivedV, DerivedF, DerivedFF, DerivedC>::\nadd_Jacobian_to_svector(const int &toplace,\n                        const Eigen::MatrixXd &tJac,\n                        Eigen::VectorXd &SS_Jac)\n{\n  int numInnerRows = tJac.rows();\n  int numInnerCols = tJac.cols();\n  int ind = toplace;\n  for (int j=0; j<numInnerRows; ++j)\n    for (int k=0; k<numInnerCols; ++k, ++ind)\n      SS_Jac(ind) = tJac(j,k);\n}\n\ntemplate<typename DerivedV, typename DerivedF, typename DerivedFF, typename DerivedC>\nIGL_INLINE void igl::IntegrableFieldSolverData<DerivedV, DerivedF, DerivedFF, DerivedC>::\nadd_jac_indices_face(const int numInnerRows,\n                     const int numInnerCols,\n                     const int startRowInJacobian,\n                     const int startIndexInVectors,\n                     Eigen::VectorXi &Rows,\n                     Eigen::VectorXi &Columns)\n{\n  for (int fi=0; fi<numF; ++fi)\n  {\n\n    int startRow = startRowInJacobian+numInnerRows*fi;\n    int startIndex = startIndexInVectors+numInnerRows*numInnerCols*fi;\n    face_Jacobian_indices(startRow, startIndex, fi, 2, numInnerRows, numInnerCols, Rows, Columns);\n  }\n}\n\n\ntemplate<typename DerivedV, typename DerivedF, typename DerivedFF, typename DerivedC>\nIGL_INLINE void igl::IntegrableFieldSolverData<DerivedV, DerivedF, DerivedFF, DerivedC>::\nface_Jacobian_indices(const int &startRow,\n                      const int &toplace,\n                      const int& fi,\n                      const int& half_degree,\n                      const int &numInnerRows,\n                      const int &numInnerCols,\n                      Eigen::VectorXi &rows,\n                      Eigen::VectorXi &columns)\n{\n  int ind = toplace;\n  for (int j=0; j<numInnerRows; ++j)\n  {\n    for (int k=0; k<numInnerCols; ++k, ++ind)\n    {\n      int iv  = k/2;//which vector (0..half_degree-1) am i at\n      int ixy = k%2;//which part (real/imag) am i at\n      rows(ind) = startRow+j;\n      columns(ind) = 2*half_degree*fi + 2*iv +ixy;\n    }\n  }\n}\n\ntemplate<typename DerivedV, typename DerivedF, typename DerivedFF, typename DerivedC>\nIGL_INLINE void igl::IntegrableFieldSolverData<DerivedV, DerivedF, DerivedFF, DerivedC>::\nadd_jac_indices_edge(const int numInnerRows,\n                     const int numInnerCols,\n                     const int startRowInJacobian,\n                     const int startIndexInVectors,\n                     Eigen::VectorXi &Rows,\n                     Eigen::VectorXi &Columns)\n{\n  for (int ii=0; ii<numInteriorEdges; ++ii)\n  {\n    // the two faces of the flap\n    int a = E2F_int(ii,0);\n    int b = E2F_int(ii,1);\n\n\n    int startRow = startRowInJacobian+numInnerRows*ii;\n    int startIndex = startIndexInVectors+numInnerRows*numInnerCols*ii;\n\n    edge_Jacobian_indices(startRow, startIndex, a, b, 2, numInnerRows, numInnerCols, Rows, Columns);\n\n  }\n}\n\n\ntemplate<typename DerivedV, typename DerivedF, typename DerivedFF, typename DerivedC>\nIGL_INLINE void igl::IntegrableFieldSolverData<DerivedV, DerivedF, DerivedFF, DerivedC>::\nedge_Jacobian_indices(const int &startRow,\n                      const int &toplace,\n                      const int& a,\n                      const int& b,\n                      const int& half_degree,\n                      const int &numInnerRows,\n                      const int &numInnerCols,\n                      Eigen::VectorXi &rows,\n                      Eigen::VectorXi &columns)\n{\n  int ind = toplace;\n  for (int j=0; j<numInnerRows; ++j)\n  {\n    for (int k=0; k<numInnerCols; ++k, ++ind)\n    {\n      int f   = (k<2*half_degree)?a:b;//which face i am at\n      int iv  = (k%(2*half_degree))/2;//which vector (0..half_degree-1) am i at\n      int ixy = k%2;//which part (real/imag) am i at\n      rows(ind) = startRow+j;\n      columns(ind) = 2*half_degree*f + 2*iv +ixy;\n    }\n  }\n}\n\ntemplate<typename DerivedV, typename DerivedF, typename DerivedFF, typename DerivedC>\nIGL_INLINE void igl::IntegrableFieldSolverData<DerivedV, DerivedF, DerivedFF, DerivedC>::\ncomputeJacobianPattern()\n{\n  num_residuals_smooth = 4*numInteriorEdges;\n  num_residuals_close = 4*numF;\n  num_residuals_polycurl = 2*numInteriorEdges;\n  num_residuals_quotcurl = numInteriorEdges;\n  num_residuals_barrier = numF;\n\n  num_residuals = num_residuals_smooth + num_residuals_close + num_residuals_polycurl + num_residuals_quotcurl + num_residuals_barrier;\n\n  residuals.setZero(num_residuals,1);\n\n  //per edge\n  numJacElements_smooth = numInteriorEdges*numInnerJacCols_edge*numInnerJacRows_smooth;\n  numJacElements_polycurl = numInteriorEdges*numInnerJacCols_edge*numInnerJacRows_polycurl;\n  numJacElements_quotcurl = numInteriorEdges*numInnerJacCols_edge*numInnerJacRows_quotcurl;\n\n  //per face\n  numJacElements_barrier = numF*numInnerJacCols_face*numInnerJacRows_barrier;\n  numJacElements_close = numF*numInnerJacCols_face*numInnerJacRows_close;\n\n  numJacElements = (numJacElements_smooth +numJacElements_polycurl + numJacElements_quotcurl) + (numJacElements_barrier +numJacElements_close);\n  //allocate\n  II_Jac.setZero(numJacElements);\n  JJ_Jac.setZero(numJacElements);\n  SS_Jac.setOnes(numJacElements);\n\n  //set stuff (attention: order !)\n  int startRowInJacobian = 0;\n  int startIndexInVectors = 0;\n\n  //smoothness\n  add_jac_indices_edge(numInnerJacRows_smooth,\n                       numInnerJacCols_edge,\n                       startRowInJacobian,\n                       startIndexInVectors,\n                       II_Jac,\n                       JJ_Jac);\n  startRowInJacobian += num_residuals_smooth;\n  startIndexInVectors += numJacElements_smooth;\n\n  //closeness\n  add_jac_indices_face(numInnerJacRows_close,\n                       numInnerJacCols_face,\n                       startRowInJacobian,\n                       startIndexInVectors,\n                       II_Jac,\n                       JJ_Jac);\n  startRowInJacobian += num_residuals_close;\n  startIndexInVectors += numJacElements_close;\n\n  //barrier\n  add_jac_indices_face(numInnerJacRows_barrier,\n                       numInnerJacCols_face,\n                       startRowInJacobian,\n                       startIndexInVectors,\n                       II_Jac,\n                       JJ_Jac);\n  startRowInJacobian += num_residuals_barrier;\n  startIndexInVectors += numJacElements_barrier;\n\n  //polycurl\n  add_jac_indices_edge(numInnerJacRows_polycurl,\n                       numInnerJacCols_edge,\n                       startRowInJacobian,\n                       startIndexInVectors,\n                       II_Jac,\n                       JJ_Jac);\n  startRowInJacobian += num_residuals_polycurl;\n  startIndexInVectors += numJacElements_polycurl;\n\n  //quotcurl\n  add_jac_indices_edge(numInnerJacRows_quotcurl,\n                       numInnerJacCols_edge,\n                       startRowInJacobian,\n                       startIndexInVectors,\n                       II_Jac,\n                       JJ_Jac);\n  igl::sparse(II_Jac, JJ_Jac, SS_Jac, Jac);\n}\n\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedFF, typename DerivedC>\nIGL_INLINE void igl::IntegrableFieldSolverData<DerivedV, DerivedF, DerivedFF, DerivedC>::\ncomputeHessianPattern()\n{\n  //II_Jac is sorted in ascending order already\n  int starti = 0;\n  int currI = II_Jac(0);\n  for (int ii = 0; ii<II_Jac.rows(); ++ii)\n  {\n    if(currI != II_Jac(ii))\n    {\n      starti = ii;\n      currI = II_Jac(ii);\n    }\n    int k1  = II_Jac(ii);\n    for (int jj = starti; jj<II_Jac.rows(); ++jj)\n    {\n      int k2  = II_Jac(jj);\n      if (k1 !=k2)\n        break;\n      indInSS_Hess_1_vec.push_back(ii);\n      indInSS_Hess_2_vec.push_back(jj);\n      Hess_triplets.push_back(Eigen::Triplet<double> (JJ_Jac(ii),\n                                                      JJ_Jac(jj),\n                                                      SS_Jac(ii)*SS_Jac(jj)\n                                                      )\n                              );\n    }\n  }\n  Hess.resize(Jac.cols(),Jac.cols());\n  Hess.setFromTriplets(Hess_triplets.begin(), Hess_triplets.end());\n  Hess.makeCompressed();\n}\n\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedFF, typename DerivedC>\nIGL_INLINE void igl::IntegrableFieldSolverData<DerivedV, DerivedF, DerivedFF, DerivedC>::\ncomputeNewHessValues()\n{\n  for (int i =0; i<Hess_triplets.size(); ++i)\n    Hess_triplets[i] = Eigen::Triplet<double>(Hess_triplets[i].row(),\n                                              Hess_triplets[i].col(),\n                                              SS_Jac(indInSS_Hess_1_vec[i])*SS_Jac(indInSS_Hess_2_vec[i])\n                                              );\n\n  Hess.setFromTriplets(Hess_triplets.begin(), Hess_triplets.end());\n}\n\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedFF, typename DerivedC>\nIGL_INLINE igl::IntegrableFieldSolver<DerivedV, DerivedF, DerivedFF, DerivedC>::IntegrableFieldSolver( IntegrableFieldSolverData<DerivedV, DerivedF, DerivedFF, DerivedC> &cffsoldata):\ndata(cffsoldata)\n{ };\n\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedFF, typename DerivedC>\nIGL_INLINE bool igl::IntegrableFieldSolver<DerivedV, DerivedF, DerivedFF, DerivedC>::\nsolve(igl::integrable_polyvector_fields_parameters &params,\n      Eigen::PlainObjectBase<DerivedFF>& current_field,\n      bool current_field_is_not_ccw)\n{\n  Eigen::MatrixXd sol2D;\n  Eigen::MatrixXd sol3D = current_field.template cast<double>();\n  if (current_field_is_not_ccw)\n    data.makeFieldCCW(sol3D);\n\n  igl::global2local(data.B1, data.B2, sol3D, sol2D);\n  Eigen::VectorXd x;\n  x.setZero(data.numVariables);\n  for (int i =0; i<data.numF; i++)\n    x.segment(i*2*2, 2*2) = sol2D.row(i);\n\n  //get x\n  solveGaussNewton(params, data.xOriginal, x);\n  //get output from x\n  for (int i =0; i<data.numF; i++)\n    sol2D.row(i) = x.segment(i*2*2, 2*2);\n  igl::local2global(data.B1, data.B2, sol2D, sol3D);\n  current_field = sol3D.cast<typename DerivedFF::Scalar>();\n  return true;\n}\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedFF, typename DerivedC>\nIGL_INLINE void igl::IntegrableFieldSolver<DerivedV, DerivedF, DerivedFF, DerivedC>::\nsolveGaussNewton(integrable_polyvector_fields_parameters &params,\n                 const Eigen::VectorXd &x_initial,\n                 Eigen::VectorXd &x)\n{\n  bool converged = false;\n\n  double F;\n  Eigen::VectorXd xprev = x;\n  Eigen::VectorXd xc = igl::slice(x_initial, data.constrained, 1);\n  //  double ESmooth, EClose, ECurl, EQuotCurl, EBarrier;\n  for (int innerIter = 0; innerIter<params.numIter; ++innerIter)\n  {\n\n    //set constrained entries to those of the initial\n    igl::slice_into(xc, data.constrained, 1, xprev);\n\n\n    //get function, gradients and Hessians\n    F = RJ(x, xprev, params, true);\n\n    printf(\"IntegrableFieldSolver -- Iteration %d\\n\", innerIter);\n\n    if((data.residuals.array() == std::numeric_limits<double>::infinity()).any())\n    {\n      std::cerr<<\"IntegrableFieldSolver -- residuals: got infinity somewhere\"<<std::endl;\n      exit(1);\n    };\n    if((data.residuals.array() != data.residuals.array()).any())\n    {\n      std::cerr<<\"IntegrableFieldSolver -- residuals: got infinity somewhere\"<<std::endl;\n      exit(1);\n    };\n\n    converged = false;\n\n    Eigen::VectorXd rhs = data.Jac.transpose()*data.residuals;\n\n    bool success;\n    data.solver.factorize(data.Hess);\n    success = data.solver.info() == Eigen::Success;\n\n    if(!success)\n      std::cerr<<\"IntegrableFieldSolver -- Could not do LU\"<<std::endl;\n\n    Eigen::VectorXd direction;\n\n    double error;\n    direction = data.solver.solve(rhs);\n    error = (data.Hess*direction - rhs).cwiseAbs().maxCoeff();\n    if(error> 1e-4)\n    {\n      std::cerr<<\"IntegrableFieldSolver -- Could not solve\"<<std::endl;\n    }\n\n    // adaptive backtracking\n    bool repeat = true;\n    int run = 0;\n    Eigen::VectorXd cx;\n    Eigen::VectorXd tRes;\n    double newF;\n    while(repeat)\n    {\n      cx = x - params.gamma*direction;\n      newF = RJ(cx, xprev, params);\n      if(newF < F)\n      {\n        repeat = false;\n        if(run == 0)\n          params.gamma *= 2;\n      }\n      else\n      {\n        params.gamma *= 0.5f;\n        if(params.gamma<1e-30)\n        {\n          repeat = false;\n          converged = true;\n        }\n      }\n      run++;\n    }\n\n\n    if (!converged)\n    {\n      xprev = x;\n      x = cx;\n    }\n    else\n    {\n      std::cerr<<\"IntegrableFieldSolver -- Converged\"<<std::endl;\n      break;\n    }\n  }\n\n\n}\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedFF, typename DerivedC>\nIGL_INLINE double igl::IntegrableFieldSolver<DerivedV, DerivedF, DerivedFF, DerivedC>::\nRJ(const Eigen::VectorXd &x,\n   const Eigen::VectorXd &x0,\n   const integrable_polyvector_fields_parameters &params,\n   bool doJacs)\n{\n  Eigen::MatrixXd sol2D(data.numF,4), sol02D(data.numF,4);\n  for (int i =0; i<data.numF; i++)\n    sol2D.row(i) = x.segment(i*2*2, 2*2);\n  for (int i =0; i<data.numF; i++)\n    sol02D.row(i) = x0.segment(i*2*2, 2*2);\n\n  data.SS_Jac.setZero(data.numJacElements);\n\n  //set stuff (attention: order !)\n  int startRowInJacobian = 0;\n  int startIndexInVectors = 0;\n\n  //smoothness\n  RJ_Smoothness(sol2D, sqrt(params.wSmooth), startRowInJacobian, doJacs, startIndexInVectors);\n  startRowInJacobian += data.num_residuals_smooth;\n  startIndexInVectors += data.numJacElements_smooth;\n\n  //closeness\n  RJ_Closeness(sol2D, sol02D, sqrt(params.wCloseUnconstrained), sqrt(params.wCloseConstrained), startRowInJacobian, doJacs, startIndexInVectors);\n  startRowInJacobian += data.num_residuals_close;\n  startIndexInVectors += data.numJacElements_close;\n\n  //barrier\n  RJ_Barrier(sol2D, params.sBarrier, sqrt(params.wBarrier), startRowInJacobian, doJacs, startIndexInVectors);\n  startRowInJacobian += data.num_residuals_barrier;\n  startIndexInVectors += data.numJacElements_barrier;\n\n  //polycurl\n  RJ_Curl(sol2D, params.wCurl, powl(params.wCurl, 2), startRowInJacobian, doJacs, startIndexInVectors);\n  startRowInJacobian += data.num_residuals_polycurl;\n  startIndexInVectors += data.numJacElements_polycurl;\n\n  //quotcurl\n  RJ_QuotCurl(sol2D, sqrt(params.wQuotCurl), startRowInJacobian, doJacs, startIndexInVectors);\n\n  if(doJacs)\n  {\n    for (int i =0; i<data.numJacElements; ++i)\n      data.Jac.coeffRef(data.II_Jac(i), data.JJ_Jac(i)) = data.SS_Jac(i);\n    data.computeNewHessValues();\n  }\n\n  return data.residuals.transpose()*data.residuals;\n}\n\n\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedFF, typename DerivedC>\nIGL_INLINE void igl::IntegrableFieldSolver<DerivedV, DerivedF, DerivedFF, DerivedC>::\nrj_smoothness_edge(const Eigen::RowVectorXd &vec2D_a,\n                   const Eigen::RowVectorXd &vec2D_b,\n                   const double &k,\n                   const int nA,\n                   const int nB,\n                   Eigen::VectorXd &residuals,\n                   bool do_jac,\n                   Eigen::MatrixXd &Jac)\n{\n  const Eigen::RowVector2d &ua = vec2D_a.segment(0, 2);\n  const Eigen::RowVector2d &va = vec2D_a.segment(2, 2);\n  const Eigen::RowVector2d &ub = vec2D_b.segment(0, 2);\n  const Eigen::RowVector2d &vb = vec2D_b.segment(2, 2);\n  const double &xua=ua[0], &yua=ua[1], &xva=va[0], &yva=va[1];\n  const double &xub=ub[0], &yub=ub[1], &xvb=vb[0], &yvb=vb[1];\n\n  double xua_2 = xua*xua;\n  double xva_2 = xva*xva;\n  double yua_2 = yua*yua;\n  double yva_2 = yva*yva;\n  double xub_2 = xub*xub;\n  double xvb_2 = xvb*xvb;\n  double yub_2 = yub*yub;\n  double yvb_2 = yvb*yvb;\n\n  double sA = sin(nA*k);\n  double cA = cos(nA*k);\n  double sB = sin(nB*k);\n  double cB = cos(nB*k);\n\n  double t1 = xua*yua;\n  double t2 = xva*yva;\n  double t3 = xub*xvb;\n  double t4 = yub*yvb;\n  double t5 = xua*xva;\n  double t6 = xub*yub;\n  double t7 = yua*yva;\n  double t8 = xvb*yvb;\n\n  double t9  = xva_2 - yva_2;\n  double t10 = xua_2 - yua_2;\n  double t11 = xvb_2 - yvb_2;\n  double t12 = xub_2 - yub_2;\n\n  double t13 = 2*t1 + 2*t2;\n\n  double t17 = (2*t1*t9 + 2*t2*t10);\n  double t19 = (t10*t9 - 4*t5*t7);\n\n\n  residuals.resize(4, 1);\n  residuals <<\n  cA*(t10 + t9) - sA*(t13) - t12 - t11,\n  sA*(t10 + t9) - 2*t8 - 2*t6 + cA*(t13),\n  cB*t19 - (t12)*(t11) - sB*t17 + 4*t3*t4,\n  cB*t17 + sB*t19 - 2*t6*(t11) - 2*t8*(t12);\n\n\n  if (do_jac)\n  {\n    double t20 = 2*yua*t9 + 4*xua*t2;\n    double t21 = 2*xua*t9 - 4*xva*t7;\n    double t22 = 2*yva*t10 + 4*t5*yua;\n    double t23 = 2*xva*t10 - 4*t1*yva;\n\n    Jac.resize(4,8);\n    Jac <<                                                                     2*xua*cA - 2*yua*sA,                                                                     - 2*yua*cA - 2*xua*sA,                                                                     2*xva*cA - 2*yva*sA,                                                                     - 2*yva*cA - 2*xva*sA,                                  -2*xub,                                 2*yub,                                  -2*xvb,                                 2*yvb,\n    2*yua*cA + 2*xua*sA,                                                                       2*xua*cA - 2*yua*sA,                                                                     2*yva*cA + 2*xva*sA,                                                                       2*xva*cA - 2*yva*sA,                                  -2*yub,                                -2*xub,                                  -2*yvb,                                -2*xvb,\n    cB*(t21) - sB*(t20), - cB*(t20) - sB*(t21), cB*(t23) - sB*(t22), - cB*(t22) - sB*(t23),   4*xvb*t4 - 2*xub*t11, 2*yub*t11 + 4*t3*yvb,   4*xub*t4 - 2*xvb*t12, 2*yvb*t12 + 4*t3*yub,\n    cB*(t20) + sB*(t21),   cB*(t21) - sB*(t20), cB*(t22) + sB*(t23),   cB*(t23) - sB*(t22), - 2*yub*t11 - 4*t3*yvb, 4*xvb*t4 - 2*xub*t11, - 2*yvb*t12 - 4*t3*yub, 4*xub*t4 - 2*xvb*t12;\n  }\n}\n\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedFF, typename DerivedC>\nIGL_INLINE void igl::IntegrableFieldSolver<DerivedV, DerivedF, DerivedFF, DerivedC>::\nRJ_Smoothness(const Eigen::MatrixXd &sol2D,\n              const double &wSmoothSqrt,\n              const int startRowInJacobian,\n              bool doJacs,\n              const int startIndexInVectors)\n{\n  if (wSmoothSqrt ==0)\n    return;\n  for (int ii=0; ii<data.numInteriorEdges; ++ii)\n  {\n    // the two faces of the flap\n    int a = data.E2F_int(ii,0);\n    int b = data.E2F_int(ii,1);\n\n    int k = data.indInteriorToFull[ii];\n\n    Eigen::MatrixXd tJac;\n    Eigen::VectorXd tRes;\n    rj_smoothness_edge(sol2D.row(a),\n                       sol2D.row(b),\n                       data.K[k],\n                       2*(0+1), //degree of first coefficient\n                       2*(1+1), //degree of second coefficient\n                       tRes,\n                       doJacs,\n                       tJac);\n\n    int startRow = startRowInJacobian+data.numInnerJacRows_smooth*ii;\n    data.residuals.segment(startRow,data.numInnerJacRows_smooth) = wSmoothSqrt*tRes;\n\n    if(doJacs)\n    {\n      int startIndex = startIndexInVectors+data.numInnerJacRows_smooth*data.numInnerJacCols_edge*ii;\n      data.add_Jacobian_to_svector(startIndex, wSmoothSqrt*tJac,data.SS_Jac);\n    }\n  }\n}\n\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedFF, typename DerivedC>\nIGL_INLINE void igl::IntegrableFieldSolver<DerivedV, DerivedF, DerivedFF, DerivedC>::\nrj_barrier_face(const Eigen::RowVectorXd &vec2D_a,\n                const double &s,\n                Eigen::VectorXd &residuals,\n                bool do_jac,\n                Eigen::MatrixXd &Jac)\n{\n\n  const Eigen::RowVector2d &ua = vec2D_a.segment(0, 2);\n  const Eigen::RowVector2d &va = vec2D_a.segment(2, 2);\n  const double &xua=ua[0], &yua=ua[1], &xva=va[0], &yva=va[1];\n\n\n  double xva_2 = xva*xva;\n  double yua_2 = yua*yua;\n  double xua_2 = xua*xua;\n  double yva_2 = yva*yva;\n\n  double s_2 = s*s;\n  double s_3 = s*s_2;\n\n  double t00 = xua*yva;\n  double t01 = xva*yua;\n  double t05 = t00 - t01;\n  double t05_2 = t05*t05;\n  double t05_3 = t05*t05_2;\n\n  if (do_jac)\n    Jac.setZero(1,4);\n  residuals.resize(1, 1);\n  if (t05>=s)\n    residuals << 0;\n  else if (t05<0)\n    residuals << std::numeric_limits<double>::infinity();\n  else\n  {\n    residuals << 1/((3*t00 - 3*t01)/s - (3*t05_2)/s_2 + t05_3/s_3) - 1;\n    double t03 = (s - t05)*(s - t05);\n    double t06 = (3*s_2 - 3*s*t00 + 3*s*t01 + xua_2*yva_2 - 2*xua*t01*yva + xva_2*yua_2);\n    double t04 = t06*t06;\n    if (do_jac)\n      Jac<<\n      -(3*s_3*yva*t03)/(t05_2*t04),\n      (3*s_3*xva*t03)/(t05_2*t04),\n      (3*s_3*yua*t03)/(t05_2*t04),\n      -(3*s_3*xua*t03)/(t05_2*t04);\n  }\n}\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedFF, typename DerivedC>\nIGL_INLINE void igl::IntegrableFieldSolver<DerivedV, DerivedF, DerivedFF, DerivedC>::\nRJ_Barrier(const Eigen::MatrixXd &sol2D,\n           const double &s,\n           const double &wBarrierSqrt,\n           const int startRowInJacobian,\n           bool doJacs,\n           const int startIndexInVectors)\n{\n  if (wBarrierSqrt ==0)\n    return;\n\n  for (int fi=0; fi<data.numF; ++fi)\n  {\n    Eigen::MatrixXd tJac;\n    Eigen::VectorXd tRes;\n    rj_barrier_face(sol2D.row(fi),\n                    s,\n                    tRes,\n                    doJacs,\n                    tJac);\n\n    int startRow = startRowInJacobian+ data.numInnerJacRows_barrier * fi;\n    data.residuals.segment(startRow,data.numInnerJacRows_barrier) = wBarrierSqrt*tRes;\n\n    if(doJacs)\n    {\n      int startIndex = startIndexInVectors+data.numInnerJacRows_barrier*data.numInnerJacCols_face*fi;\n      data.add_Jacobian_to_svector(startIndex, wBarrierSqrt*tJac,data.SS_Jac);\n    }\n  }\n}\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedFF, typename DerivedC>\nIGL_INLINE void igl::IntegrableFieldSolver<DerivedV, DerivedF, DerivedFF, DerivedC>::\nRJ_Closeness(const Eigen::MatrixXd &sol2D,\n             const Eigen::MatrixXd &sol02D,\n             const double &wCloseUnconstrainedSqrt,\n             const double &wCloseConstrainedSqrt,\n             const int startRowInJacobian,\n             bool doJacs,\n             const int startIndexInVectors)\n{\n  if (wCloseUnconstrainedSqrt ==0 && wCloseConstrainedSqrt ==0)\n    return;\n  for (int fi=0; fi<data.numF; ++fi)\n  {\n    Eigen::Vector4d weights;\n    if (!data.is_constrained_face[fi])\n      weights.setConstant(wCloseUnconstrainedSqrt);\n    else\n    {\n      if (data.is_constrained_face[fi]==1)\n        //only constrain the first vector\n        weights<<wCloseConstrainedSqrt,wCloseConstrainedSqrt,wCloseUnconstrainedSqrt,wCloseUnconstrainedSqrt;\n      else\n        //either not partial, or partial with 2 constraints\n        weights.setConstant(wCloseConstrainedSqrt);\n    }\n\n    Eigen::MatrixXd tJac;\n    Eigen::VectorXd tRes;\n    tJac = Eigen::MatrixXd::Identity(4,4);\n    tRes.resize(4, 1); tRes<<(sol2D.row(fi)-sol02D.row(fi)).transpose();\n    int startRow = startRowInJacobian+data.numInnerJacRows_close*fi;\n    data.residuals.segment(startRow,data.numInnerJacRows_close) = weights.array()*tRes.array();\n\n    if(doJacs)\n    {\n      int startIndex = startIndexInVectors+data.numInnerJacRows_close*data.numInnerJacCols_face*fi;\n      data.add_Jacobian_to_svector(startIndex, weights.asDiagonal()*tJac,data.SS_Jac);\n    }\n\n  }\n}\n\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedFF, typename DerivedC>\nIGL_INLINE void igl::IntegrableFieldSolver<DerivedV, DerivedF, DerivedFF, DerivedC>::\nrj_polycurl_edge(const Eigen::RowVectorXd &vec2D_a,\n                 const Eigen::RowVector2d &ea,\n                 const Eigen::RowVectorXd &vec2D_b,\n                 const Eigen::RowVector2d &eb,\n                 Eigen::VectorXd &residuals,\n                 bool do_jac,\n                 Eigen::MatrixXd &Jac)\n{\n  const Eigen::RowVector2d &ua = vec2D_a.segment(0, 2);\n  const Eigen::RowVector2d &va = vec2D_a.segment(2, 2);\n  const Eigen::RowVector2d &ub = vec2D_b.segment(0, 2);\n  const Eigen::RowVector2d &vb = vec2D_b.segment(2, 2);\n  const double &xua=ua[0], &yua=ua[1], &xva=va[0], &yva=va[1];\n  const double &xub=ub[0], &yub=ub[1], &xvb=vb[0], &yvb=vb[1];\n  const double &xea=ea[0], &yea=ea[1];\n  const double &xeb=eb[0], &yeb=eb[1];\n\n  const double dua = (xea*xua + yea*yua);\n  const double dub = (xeb*xub + yeb*yub);\n  const double dva = (xea*xva + yea*yva);\n  const double dvb = (xeb*xvb + yeb*yvb);\n\n  const double dua_2 = dua*dua;\n  const double dva_2 = dva*dva;\n  const double dub_2 = dub*dub;\n  const double dvb_2 = dvb*dvb;\n\n  residuals.resize(2, 1);\n  residuals << dua_2 - dub_2 + dva_2 - dvb_2,\n  dua_2*dva_2 - dub_2*dvb_2 ;\n\n\n\n  if (do_jac)\n  {\n\n    Jac.resize(2,8);\n    Jac << 2*xea*dua,                       2*yea*dua,                       2*xea*dva,                       2*yea*dva,                       -2*xeb*dub,                       -2*yeb*dub,                       -2*xeb*dvb,                       -2*yeb*dvb,\n    2*xea*dua*dva_2, 2*yea*dua*dva_2, 2*xea*dua_2*dva, 2*yea*dua_2*dva, -2*xeb*dub*dvb_2, -2*yeb*dub*dvb_2, -2*xeb*dub_2*dvb, -2*yeb*dub_2*dvb;\n  }\n}\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedFF, typename DerivedC>\nIGL_INLINE void igl::IntegrableFieldSolver<DerivedV, DerivedF, DerivedFF, DerivedC>::\nRJ_Curl(const Eigen::MatrixXd &sol2D,\n        const double &wCASqrt,\n        const double &wCBSqrt,\n        const int startRowInJacobian,\n        bool doJacs,\n        const int startIndexInVectors)\n{\n  if((wCASqrt==0) &&(wCBSqrt==0))\n    return;\n  for (int ii=0; ii<data.numInteriorEdges; ++ii)\n  {\n    // the two faces of the flap\n    int a = data.E2F_int(ii,0);\n    int b = data.E2F_int(ii,1);\n\n    int k = data.indInteriorToFull[ii];\n\n    // the common edge, a 3 vector\n    const Eigen::RowVector3d &ce = data.EVecNorm.row(k);\n\n    // the common edge expressed in local coordinates in the two faces\n    // x/y denotes real/imaginary\n    double xea = data.B1.row(a).dot(ce);\n    double yea = data.B2.row(a).dot(ce);\n    Eigen::RowVector2d ea; ea<<xea, yea;\n    double xeb = data.B1.row(b).dot(ce);\n    double yeb = data.B2.row(b).dot(ce);\n    Eigen::RowVector2d eb; eb<<xeb, yeb;\n\n\n    Eigen::MatrixXd tJac;\n    Eigen::VectorXd tRes;\n    rj_polycurl_edge(sol2D.row(a),\n                     ea,\n                     sol2D.row(b),\n                     eb,\n                     tRes,\n                     doJacs,\n                     tJac);\n\n    tRes[0] = tRes[0]*wCASqrt;\n    tRes[1] = tRes[1]*wCBSqrt;\n\n\n    int startRow = startRowInJacobian+data.numInnerJacRows_polycurl*ii;\n    data.residuals.segment(startRow,data.numInnerJacRows_polycurl) = tRes;\n\n    if(doJacs)\n    {\n      tJac.row(0) = tJac.row(0)*wCASqrt;\n      tJac.row(1) = tJac.row(1)*wCBSqrt;\n      int startIndex = startIndexInVectors+data.numInnerJacRows_polycurl*data.numInnerJacCols_edge*ii;\n      data.add_Jacobian_to_svector(startIndex, tJac,data.SS_Jac);\n    }\n\n  }\n}\n\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedFF, typename DerivedC>\nIGL_INLINE void igl::IntegrableFieldSolver<DerivedV, DerivedF, DerivedFF, DerivedC>::\nrj_quotcurl_edge_polyversion(const Eigen::RowVectorXd &vec2D_a,\n                             const Eigen::RowVector2d &ea,\n                             const Eigen::RowVectorXd &vec2D_b,\n                             const Eigen::RowVector2d &eb,\n                             Eigen::VectorXd &residuals,\n                             bool do_jac,\n                             Eigen::MatrixXd &Jac)\n{\n  const Eigen::RowVector2d &ua = vec2D_a.segment(0, 2);\n  const Eigen::RowVector2d &va = vec2D_a.segment(2, 2);\n  const Eigen::RowVector2d &ub = vec2D_b.segment(0, 2);\n  const Eigen::RowVector2d &vb = vec2D_b.segment(2, 2);\n  const double &xua=ua[0], &yua=ua[1], &xva=va[0], &yva=va[1];\n  const double &xub=ub[0], &yub=ub[1], &xvb=vb[0], &yvb=vb[1];\n  const double &xea=ea[0], &yea=ea[1];\n  const double &xeb=eb[0], &yeb=eb[1];\n\n  double dua = (xea*xua + yea*yua);\n  double dva = (xea*xva + yea*yva);\n  double dub = (xeb*xub + yeb*yub);\n  double dvb = (xeb*xvb + yeb*yvb);\n\n  double dua_2 = dua * dua;\n  double dva_2 = dva * dva;\n  double dub_2 = dub * dub;\n  double dvb_2 = dvb * dvb;\n  double t00 = (dub_2 - dvb_2);\n  double t01 = (dua_2 - dva_2);\n\n\n  residuals.resize(1, 1);\n  residuals << dua*dva*t00 - dub*dvb*t01;\n\n  if (do_jac)\n  {\n    Jac.resize(1,8);\n    Jac <<  xea*dva*t00 - 2*xea*dua*dub*dvb, yea*dva*t00 - 2*yea*dua*dub*dvb, xea*dua*t00 + 2*xea*dub*dva*dvb, yea*dua*t00 + 2*yea*dub*dva*dvb, 2*xeb*dua*dub*dva - xeb*dvb*t01, 2*yeb*dua*dub*dva - yeb*dvb*t01, - xeb*dub*t01 - 2*xeb*dua*dva*dvb, - yeb*dub*t01 - 2*yeb*dua*dva*dvb;\n  }\n}\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedFF, typename DerivedC>\nIGL_INLINE void igl::IntegrableFieldSolver<DerivedV, DerivedF, DerivedFF, DerivedC>::\nRJ_QuotCurl(const Eigen::MatrixXd &sol2D,\n            const double &wQuotCurlSqrt,\n            const int startRowInJacobian,\n            bool doJacs,\n            const int startIndexInVectors)\n{\n  for (int ii=0; ii<data.numInteriorEdges; ++ii)\n  {\n    // the two faces of the flap\n    int a = data.E2F_int(ii,0);\n    int b = data.E2F_int(ii,1);\n\n    int k = data.indInteriorToFull[ii];\n\n    // the common edge, a 3 vector\n    const Eigen::RowVector3d &ce = data.EVecNorm.row(k);\n\n    // the common edge expressed in local coordinates in the two faces\n    // x/y denotes real/imaginary\n    double xea = data.B1.row(a).dot(ce);\n    double yea = data.B2.row(a).dot(ce);\n    Eigen::RowVector2d ea; ea<<xea, yea;\n    double xeb = data.B1.row(b).dot(ce);\n    double yeb = data.B2.row(b).dot(ce);\n    Eigen::RowVector2d eb; eb<<xeb, yeb;\n\n\n    Eigen::MatrixXd tJac;\n    Eigen::VectorXd tRes;\n    rj_quotcurl_edge_polyversion(sol2D.row(a),\n                                 ea,\n                                 sol2D.row(b),\n                                 eb,\n                                 tRes,\n                                 doJacs,\n                                 tJac);\n\n    int startRow = startRowInJacobian+ data.numInnerJacRows_quotcurl*ii;\n    data.residuals.segment(startRow,data.numInnerJacRows_quotcurl) = wQuotCurlSqrt*tRes;\n\n    if(doJacs)\n    {\n      int startIndex = startIndexInVectors+data.numInnerJacRows_quotcurl*data.numInnerJacCols_edge*ii;\n      data.add_Jacobian_to_svector(startIndex, wQuotCurlSqrt*tJac,data.SS_Jac);\n    }\n  }\n}\n\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedFF, typename DerivedC>\nIGL_INLINE void igl::integrable_polyvector_fields_precompute(\n                                                             const Eigen::PlainObjectBase<DerivedV>& V,\n                                                             const Eigen::PlainObjectBase<DerivedF>& F,\n                                                             const Eigen::VectorXi& b,\n                                                             const Eigen::PlainObjectBase<DerivedC>& bc,\n                                                             const Eigen::VectorXi& constraint_level,\n                                                             const Eigen::PlainObjectBase<DerivedFF>& original_field,\n                                                             igl::IntegrableFieldSolverData<DerivedV, DerivedF, DerivedFF, DerivedC> &data)\n{\n  data.precomputeMesh(V,F);\n\n  data.computeJacobianPattern();\n  data.computeHessianPattern();\n  data.solver.analyzePattern(data.Hess);\n\n  data.initializeConstraints(b,bc,constraint_level);\n  data.initializeOriginalVariable(original_field);\n};\n\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedFF, typename DerivedC>\nIGL_INLINE void igl::integrable_polyvector_fields_solve(igl::IntegrableFieldSolverData<DerivedV, DerivedF, DerivedFF, DerivedC> &cffsoldata,\n                                                        integrable_polyvector_fields_parameters &params,\n                                                        Eigen::PlainObjectBase<DerivedFF>& current_field,\n                                                        bool current_field_is_not_ccw)\n{\n  igl::IntegrableFieldSolver<DerivedV, DerivedF, DerivedFF, DerivedC> cffs(cffsoldata);\n  cffs.solve(params, current_field, current_field_is_not_ccw);\n};\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate igl::IntegrableFieldSolverData<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >::IntegrableFieldSolverData();\ntemplate void igl::integrable_polyvector_fields_solve<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(igl::IntegrableFieldSolverData<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, igl::integrable_polyvector_fields_parameters&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, bool);\ntemplate void igl::integrable_polyvector_fields_precompute<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, igl::IntegrableFieldSolverData<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/integrable_polyvector_fields.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2015 Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_INTEGRABLE_POLYVECTOR_FIELDS\n#define IGL_INTEGRABLE_POLYVECTOR_FIELDS\n#include \"igl_inline.h\"\n\n#include <Eigen/Core>\n#include <Eigen/Sparse>\n\nnamespace igl {\n  // Compute a curl-free frame field from user constraints, optionally starting\n  // from a gived frame field (assumed to be interpolating the constraints).\n  // Implementation of the paper \"Integrable PolyVector Fields\", SIGGRAPH 2015.\n\n  // Set of parameters used during solve\n  struct integrable_polyvector_fields_parameters;\n\n  // All data necessary for solving. Gets initialized from the original field\n  //  and gets updated during each solve.\n  template <typename DerivedV, typename DerivedF, typename DerivedFF, typename DerivedC> class IntegrableFieldSolverData;\n\n\n  // Precomputes matrices and necessary initial variables from the mesh and the\n  // original field. This function is meant to be called before solve().\n  // Inputs:\n  //   V                 #V by 3 list of mesh vertex coordinates\n  //   F                 #F by 3 list of mesh faces (must be triangles)\n  //   b                 #B by 1 list of constrained face indices\n  //   bc                #B by 6 list of the representative vectors at the constrained faces\n  //   constraint_level  #B by 1 list of \"constraint level\" flag (level=2 indicates that both directions are constrained,\n  //                     level = 1 indicates a partially constrained face, i.e. only the first vector will be constrained)\n  //   original_field    #F by 6 list of the representative vectors of the frame field to be used as a starting point\n  //                     (up to permutation and sign, stacked horizontally for each face)\n  // Returns:\n  //   data              an IntegrableFieldSolverData object that holds all intermediate\n  //                     data needed by the solve routine, with correctly initialized values.\n  //\n  template <typename DerivedV, typename DerivedF, typename DerivedFF, typename DerivedC>\n  IGL_INLINE void integrable_polyvector_fields_precompute(const Eigen::PlainObjectBase<DerivedV>& V,\n                                                    const Eigen::PlainObjectBase<DerivedF>& F,\n                                                    const Eigen::VectorXi& b,\n                                                    const Eigen::PlainObjectBase<DerivedC>& bc,\n                                                    const Eigen::VectorXi& constraint_level,\n                                                    const Eigen::PlainObjectBase<DerivedFF>& original_field,\n                                                    igl::IntegrableFieldSolverData<DerivedV, DerivedF, DerivedFF, DerivedC> &data);\n\n\n  // Given the current estimate of the field, performes one round of optimization\n  // iterations and updates the current estimate. The intermediate data is saved\n  // and returned for the next iteration.\n  // Inputs:\n  //   data                         an IntegrableFieldSolverData object that holds all intermediate\n  //                                data needed by the solve routine, with their values at the current time instance.\n  //   params                       solver parameters (see below)\n  //   current_field                #F by 6 list of the representative vectors of the current frame field to be used as a starting point\n  //   current_field_is_not_ccw     boolean, determines whether the representative vectors in the current field are in\n  //                                non- ccw order - if true, they will be corrected before being passed to the solver.\n  //                                The field returned by this routine is always in ccw order, so this flag typically only\n  //                                needs to be set to true during the first call to solve(). If unsure, set to true.\n  // Returns:\n  //   current_field                updated estimate for the integrable field\n  //\ntemplate <typename DerivedV, typename DerivedF, typename DerivedFF, typename DerivedC>\n  IGL_INLINE void integrable_polyvector_fields_solve(IntegrableFieldSolverData<DerivedV, DerivedF, DerivedFF, DerivedC> &cffsoldata,\n    integrable_polyvector_fields_parameters &params,\n                                               Eigen::PlainObjectBase<DerivedFF>& current_field,\n                                               bool current_field_is_not_ccw);\n\n\n};\n\n\n//parameters\nstruct igl::integrable_polyvector_fields_parameters\n{\n  // number of optimization iterations\n  int numIter;\n  //weight for barrier term (ensuring ccw ordering of the vectors per face)\n  double wBarrier;\n  //the s-parameter of the barrier term (see Schüller et al. 2013, Locally Injective Mappings)\n  double sBarrier;\n  //weight for the PolyCurl term of the energy\n  double wCurl;\n  //weight for the PolyQuotient term of the energy\n  double wQuotCurl;\n  //weight for the smoothness term of the energy\n  double wSmooth;\n  //weight for the closeness to the original field, for the unconstrained faces (regularization term)\n  double wCloseUnconstrained;\n  //weight for the closeness to the original field, for the constrained faces\n  double wCloseConstrained;\n  //the per-iteration reduction factor the smoothness weight\n  double redFactor_wsmooth;\n  //the step size for the Gauss-Newton optimization\n  double gamma;\n  //tikhonov regularization term (typically not needed, default value should suffice)\n  double tikh_gamma;\n\n  IGL_INLINE integrable_polyvector_fields_parameters();\n\n};\n\n//solver data\ntemplate <typename DerivedV, typename DerivedF, typename DerivedFF, typename DerivedC>\nclass igl::IntegrableFieldSolverData\n{\npublic:\n  //Original field\n  Eigen::VectorXd xOriginal;\n\n  //Constraints\n  Eigen::VectorXi constrained;\n  Eigen::VectorXi is_constrained_face;//0 for unconstrained, 1 for constrained once (partial) and 2 for fully constrained\n  Eigen::VectorXi indInConstrained;\n  Eigen::MatrixXd constrained_vec3;\n\n  //Mesh data\n  //edges and normalized edge vectors\n  Eigen::MatrixXd EVecNorm;\n  Eigen::MatrixXi E, E2F, F2E;\n  int numV, numF, numE;\n  //interior edge data\n  int numInteriorEdges;\n  Eigen::Matrix<int,Eigen::Dynamic,2> E2F_int;\n  Eigen::VectorXi indInteriorToFull;\n  Eigen::VectorXi indFullToInterior;\n  //per-edge angles (for parallel transport)\n  Eigen::VectorXd K;\n  //local bases\n  DerivedV B1, B2, FN;\n\n  //Solver Data\n  Eigen::VectorXd residuals;\n  Eigen::SparseMatrix<double> Jac;\n  Eigen::VectorXi II_Jac, JJ_Jac;\n  Eigen::VectorXd SS_Jac;\n  int numVariables;\n  int num_residuals;\n  int num_residuals_smooth;\n  int num_residuals_close;\n  int num_residuals_polycurl;\n  int num_residuals_quotcurl;\n  int num_residuals_barrier;\n  const int numInnerJacCols_edge = 8;\n  const int numInnerJacCols_face = 4;\n  const int numInnerJacRows_smooth = 4;\n  const int numInnerJacRows_polycurl = 2;\n  const int numInnerJacRows_quotcurl = 1;\n  const int numInnerJacRows_barrier = 1;\n  const int numInnerJacRows_close = 4;\n  int numJacElements_smooth;\n  int numJacElements_polycurl;\n  int numJacElements_quotcurl;\n  int numJacElements_barrier;\n  int numJacElements_close;\n  int numJacElements;\n  IGL_INLINE void add_jac_indices_face(const int numInnerRows,\n                                       const int numInnerCols,\n                                       const int startRowInJacobian,\n                                       const int startIndexInVectors,\n                                       Eigen::VectorXi &Rows,\n                                       Eigen::VectorXi &Columns);\n  IGL_INLINE void face_Jacobian_indices(const int &startRow,\n                                        const int &toplace,\n                                        const int& fi,\n                                        const int& half_degree,\n                                        const int &numInnerRows,\n                                        const int &numInnerCols,\n                                        Eigen::VectorXi &rows,\n                                        Eigen::VectorXi &columns);\n  IGL_INLINE void add_Jacobian_to_svector(const int &toplace,\n                                          const Eigen::MatrixXd &tJac,\n                                          Eigen::VectorXd &SS_Jac);\n\n  IGL_INLINE void add_jac_indices_edge(const int numInnerRows,\n                                       const int numInnerCols,\n                                       const int startRowInJacobian,\n                                       const int startIndexInVectors,\n                                       Eigen::VectorXi &Rows,\n                                       Eigen::VectorXi &Columns);\n  IGL_INLINE void edge_Jacobian_indices(const int &startRow,\n                                        const int &toplace,\n                                        const int& a,\n                                        const int& b,\n                                        const int& half_degree,\n                                        const int &numInnerRows,\n                                        const int &numInnerCols,\n                                        Eigen::VectorXi &rows,\n                                        Eigen::VectorXi &columns);\n  std::vector<int> indInSS_Hess_1_vec;\n  std::vector<int> indInSS_Hess_2_vec;\n  Eigen::SparseMatrix<double> Hess;\n  std::vector<Eigen::Triplet<double> > Hess_triplets;\n  Eigen::SimplicialLDLT<Eigen::SparseMatrix<double> > solver;\n\n  IGL_INLINE void precomputeMesh(const Eigen::PlainObjectBase<DerivedV> &_V,\n                                 const Eigen::PlainObjectBase<DerivedF> &_F);\n  IGL_INLINE void computeInteriorEdges();\n  IGL_INLINE void computeJacobianPattern();\n  IGL_INLINE void computeHessianPattern();\n  IGL_INLINE void computeNewHessValues();\n  IGL_INLINE void initializeOriginalVariable(const Eigen::PlainObjectBase<DerivedFF>& original_field);\n  IGL_INLINE void initializeConstraints(const Eigen::VectorXi& b,\n                                        const Eigen::PlainObjectBase<DerivedC>& bc,\n                                        const Eigen::VectorXi& constraint_level);\n  IGL_INLINE void makeFieldCCW(Eigen::MatrixXd &sol3D);\n\npublic:\n  IGL_INLINE IntegrableFieldSolverData();\n\n  IGL_INLINE IntegrableFieldSolverData(\n                                     const Eigen::PlainObjectBase<DerivedV> &_V,\n                                     const Eigen::PlainObjectBase<DerivedF> &_F,\n                                     const Eigen::VectorXi& b,\n                                     const Eigen::VectorXi& constraint_level,\n                                     const Eigen::PlainObjectBase<DerivedFF>& original_field);\n\n};\n\n#ifndef IGL_STATIC_LIBRARY\n#include \"integrable_polyvector_fields.cpp\"\n#endif\n\n\n#endif /* defined(IGL_INTEGRABLE_POLYVECTOR_FIELDS) */\n"
  },
  {
    "path": "libs/libigl/include/igl/internal_angles.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// Copyright (C) 2015 Daniele Panozzo <daniele.panozzo@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"internal_angles.h\"\n#include \"squared_edge_lengths.h\"\n#include \"parallel_for.h\"\n#include \"get_seconds.h\"\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedK>\nIGL_INLINE void igl::internal_angles(\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  Eigen::PlainObjectBase<DerivedK> & K)\n{\n  using namespace Eigen;\n  using namespace std;\n  typedef typename DerivedV::Scalar Scalar;\n  if(F.cols() == 3)\n  {\n    // Edge lengths\n    Matrix<\n      Scalar,\n      DerivedF::RowsAtCompileTime,\n      DerivedF::ColsAtCompileTime> L_sq;\n      igl::squared_edge_lengths(V,F,L_sq);\n\n    assert(F.cols() == 3 && \"F should contain triangles\");\n    igl::internal_angles_using_squared_edge_lengths(L_sq,K);\n  }else\n  {\n    assert(V.cols() == 3 && \"If F contains non-triangle facets, V must be 3D\");\n    K.resizeLike(F);\n    auto corner = [](\n      const typename DerivedV::ConstRowXpr & x, \n      const typename DerivedV::ConstRowXpr & y, \n      const typename DerivedV::ConstRowXpr & z)\n    {\n      typedef Eigen::Matrix<Scalar,1,3> RowVector3S;\n      RowVector3S v1 = (x-y).normalized();\n      RowVector3S v2 = (z-y).normalized();\n      // http://stackoverflow.com/questions/10133957/signed-angle-between-two-vectors-without-a-reference-plane\n      Scalar s = v1.cross(v2).norm();\n      Scalar c = v1.dot(v2);\n      return atan2(s, c);\n    };\n    for(unsigned i=0; i<F.rows(); ++i)\n    {\n      for(unsigned j=0; j<F.cols(); ++j)\n      {\n        K(i,j) = corner(\n            V.row(F(i,int(j-1+F.cols())%F.cols())),\n            V.row(F(i,j)),\n            V.row(F(i,(j+1+F.cols())%F.cols()))\n            );\n      }\n    }\n  }\n}\n\ntemplate <typename DerivedL, typename DerivedK>\nIGL_INLINE void igl::internal_angles_using_squared_edge_lengths(\n  const Eigen::PlainObjectBase<DerivedL>& L_sq,\n  Eigen::PlainObjectBase<DerivedK> & K)\n{\n  typedef typename DerivedL::Index Index;\n  assert(L_sq.cols() == 3 && \"Edge-lengths should come from triangles\");\n  const Index m = L_sq.rows();\n  K.resize(m,3);\n  parallel_for(\n    m,\n    [&L_sq,&K](const Index f)\n    {\n      for(size_t d = 0;d<3;d++)\n      {\n        const auto & s1 = L_sq(f,d);\n        const auto & s2 = L_sq(f,(d+1)%3);\n        const auto & s3 = L_sq(f,(d+2)%3);\n        K(f,d) = acos((s3 + s2 - s1)/(2.*sqrt(s3*s2)));\n      }\n    },\n    1000l);\n}\n\ntemplate <typename DerivedL, typename DerivedK>\nIGL_INLINE void igl::internal_angles_using_edge_lengths(\n  const Eigen::PlainObjectBase<DerivedL>& L,\n  Eigen::PlainObjectBase<DerivedK> & K)\n{\n  // Note:\n  //   Usage of internal_angles_using_squared_edge_lengths() is preferred to internal_angles_using_squared_edge_lengths()\n  //   This function is deprecated and probably will be removed in future versions\n  typedef typename DerivedL::Index Index;\n  assert(L.cols() == 3 && \"Edge-lengths should come from triangles\");\n  const Index m = L.rows();\n  K.resize(m,3);\n  parallel_for(\n    m,\n    [&L,&K](const Index f)\n    {\n      for(size_t d = 0;d<3;d++)\n      {\n        const auto & s1 = L(f,d);\n        const auto & s2 = L(f,(d+1)%3);\n        const auto & s3 = L(f,(d+2)%3);\n        K(f,d) = acos((s3*s3 + s2*s2 - s1*s1)/(2.*s3*s2));\n      }\n    },\n    1000l);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::internal_angles<Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<unsigned int, -1, 3, 1, -1, 3>, Eigen::Matrix<float, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<unsigned int, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 0, -1, 3> >&);\ntemplate void igl::internal_angles<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::internal_angles<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::internal_angles<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::internal_angles<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\ntemplate void igl::internal_angles<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\ntemplate void igl::internal_angles<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 3, 1, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/internal_angles.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_INTERNAL_ANGLES_H\n#define IGL_INTERNAL_ANGLES_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Compute internal angles for a triangle mesh\n  //\n  // Inputs:\n  //   V  #V by dim eigen Matrix of mesh vertex nD positions\n  //   F  #F by poly-size eigen Matrix of face (triangle) indices\n  // Output:\n  //   K  #F by poly-size eigen Matrix of internal angles\n  //     for triangles, columns correspond to edges [1,2],[2,0],[0,1]\n  //\n  // Known Issues:\n  //   if poly-size ≠ 3 then dim must equal 3.\n  template <typename DerivedV, typename DerivedF, typename DerivedK>\n  IGL_INLINE void internal_angles(\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    Eigen::PlainObjectBase<DerivedK> & K);\n  // Inputs:\n  //   L_sq  #F by 3 list of squared edge lengths\n  // Output:\n  //   K  #F by poly-size eigen Matrix of internal angles\n  //     for triangles, columns correspond to edges [1,2],[2,0],[0,1]\n  //\n  // Note:\n  //   Usage of internal_angles_using_squared_edge_lengths is preferred to internal_angles_using_squared_edge_lengths\n  template <typename DerivedL, typename DerivedK>\n  IGL_INLINE void internal_angles_using_squared_edge_lengths(\n    const Eigen::PlainObjectBase<DerivedL>& L_sq,\n    Eigen::PlainObjectBase<DerivedK> & K);\n  // Inputs:\n  //   L  #F by 3 list of edge lengths\n  // Output:\n  //   K  #F by poly-size eigen Matrix of internal angles\n  //     for triangles, columns correspond to edges [1,2],[2,0],[0,1]\n  //\n  // Note:\n  //   Usage of internal_angles_using_squared_edge_lengths is preferred to internal_angles_using_squared_edge_lengths\n  //   This function is deprecated and probably will be removed in future versions\n  template <typename DerivedL, typename DerivedK>\n  IGL_INLINE void internal_angles_using_edge_lengths(\n    const Eigen::PlainObjectBase<DerivedL>& L,\n    Eigen::PlainObjectBase<DerivedK> & K);}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"internal_angles.cpp\"\n#endif\n\n#endif\n\n\n"
  },
  {
    "path": "libs/libigl/include/igl/intersect.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"intersect.h\"\ntemplate <class M>\nIGL_INLINE void igl::intersect(const M & A, const M & B, M & C)\n{\n  // Stupid O(size(A) * size(B)) to do it\n  // Alec: This should be implemented by using unique and sort like `setdiff`\n  M dyn_C(A.size() > B.size() ? A.size() : B.size(),1);\n  // count of intersects\n  int c = 0;\n  // Loop over A\n  for(int i = 0;i<A.size();i++)\n  {\n    // Loop over B\n    for(int j = 0;j<B.size();j++)\n    {\n      if(A(i) == B(j))\n      {\n        dyn_C(c) = A(i);\n        c++;\n      }\n    }\n  }\n\n  // resize output\n  C.resize(c,1);\n  // Loop over intersects\n  for(int i = 0;i<c;i++)\n  {\n    C(i) = dyn_C(i);\n  }\n}\n\ntemplate <class M>\nIGL_INLINE M igl::intersect(const M & A, const M & B)\n{\n  M C;\n  intersect(A,B,C);\n  return C;\n}\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate Eigen::Matrix<int, -1, 1, 0, -1, 1> igl::intersect<Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&); \n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/intersect.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_INTERSECT_H\n#define IGL_INTERSECT_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Determine the intersect between two sets of coefficients using ==\n  // Templates:\n  //   M  matrix type that implements indexing by global index M(i)\n  // Inputs:\n  //   A  matrix of coefficients\n  //   B  matrix of coefficients\n  // Output:\n  //   C  matrix of elements appearing in both A and B, C is always resized to\n  //   have a single column\n  template <class M>\n  IGL_INLINE void intersect(const M & A, const M & B, M & C);\n  // Last argument as return\n  template <class M>\n  IGL_INLINE M intersect(const M & A, const M & B);\n}\n#ifndef IGL_STATIC_LIBRARY\n#include \"intersect.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/invert_diag.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"invert_diag.h\"\n\ntemplate <typename T>\nIGL_INLINE void igl::invert_diag(\n  const Eigen::SparseMatrix<T>& X, \n  Eigen::SparseMatrix<T>& Y)\n{\n#ifndef NDEBUG\n  typename Eigen::SparseVector<T> dX = X.diagonal().sparseView();\n  // Check that there are no zeros along the diagonal\n  assert(dX.nonZeros() == dX.size());\n#endif\n  // http://www.alecjacobson.com/weblog/?p=2552\n  if(&Y != &X)\n  {\n    Y = X;\n  }\n  // Iterate over outside\n  for(int k=0; k<Y.outerSize(); ++k)\n  {\n    // Iterate over inside\n    for(typename Eigen::SparseMatrix<T>::InnerIterator it (Y,k); it; ++it)\n    {\n      if(it.col() == it.row())\n      {\n        T v = it.value();\n        assert(v != 0);\n        v = ((T)1.0)/v;\n        Y.coeffRef(it.row(),it.col()) = v;\n      }\n    }\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::invert_diag<double>(Eigen::SparseMatrix<double, 0, int> const&, Eigen::SparseMatrix<double, 0, int>&);\ntemplate void igl::invert_diag<float>(Eigen::SparseMatrix<float, 0, int> const&, Eigen::SparseMatrix<float, 0, int>&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/invert_diag.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_INVERT_DIAG_H\n#define IGL_INVERT_DIAG_H\n#include \"igl_inline.h\"\n#define EIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET\n#include <Eigen/Sparse>\n\nnamespace igl\n{\n  // Invert the diagonal entries of a matrix (if the matrix is a diagonal\n  // matrix then this amounts to inverting the matrix)\n\n  // Templates:\n  //   T  should be a eigen sparse matrix primitive type like int or double\n  // Inputs:\n  //   X  an m by n sparse matrix\n  // Outputs:\n  //   Y  an m by n sparse matrix\n  template <typename T>\n  IGL_INLINE void invert_diag(\n    const Eigen::SparseMatrix<T>& X, \n    Eigen::SparseMatrix<T>& Y);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"invert_diag.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/is_border_vertex.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"is_border_vertex.h\"\n#include <vector>\n\n#include \"triangle_triangle_adjacency.h\"\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE std::vector<bool> igl::is_border_vertex(\n    const Eigen::PlainObjectBase<DerivedV> &V,\n    const Eigen::PlainObjectBase<DerivedF> &F)\n{\n  DerivedF FF;\n  igl::triangle_triangle_adjacency(F,FF);\n  std::vector<bool> ret(V.rows());\n  for(unsigned i=0; i<ret.size();++i)\n    ret[i] = false;\n\n  for(unsigned i=0; i<F.rows();++i)\n    for(unsigned j=0;j<F.cols();++j)\n      if(FF(i,j) == -1)\n      {\n        ret[F(i,j)]       = true;\n        ret[F(i,(j+1)%F.cols())] = true;\n      }\n  return ret;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate std::vector<bool, std::allocator<bool> > igl::is_border_vertex<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&);\ntemplate std::vector<bool, std::allocator<bool> > igl::is_border_vertex<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&);\ntemplate std::vector<bool, std::allocator<bool> > igl::is_border_vertex<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/is_border_vertex.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_IS_BORDER_VERTEX_H\n#define IGL_IS_BORDER_VERTEX_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Core>\n#include <vector>\n\nnamespace igl \n{\n  // Determine vertices on open boundary of a (manifold) mesh with triangle\n  // faces F\n  //\n  // Inputs:\n  //   V  #V by dim list of vertex positions \n  //   F  #F by 3 list of triangle indices\n  // Returns #V vector of bools revealing whether vertices are on boundary\n  //\n  // Known Bugs: - does not depend on V\n  //             - assumes mesh is edge manifold\n  // \n  template <typename DerivedV, typename DerivedF>\n  IGL_INLINE std::vector<bool> is_border_vertex(\n   const Eigen::PlainObjectBase<DerivedV> &V,\n   const Eigen::PlainObjectBase<DerivedF> &F);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"is_border_vertex.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/is_boundary_edge.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"is_boundary_edge.h\"\n#include \"unique.h\"\n#include \"sort.h\"\n\ntemplate <\n  typename DerivedF,\n  typename DerivedE,\n  typename DerivedB>\nvoid igl::is_boundary_edge(\n  const Eigen::PlainObjectBase<DerivedE> & E,\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  Eigen::PlainObjectBase<DerivedB> & B)\n{\n  using namespace Eigen;\n  using namespace std;\n  // Should be triangles\n  assert(F.cols() == 3);\n  // Should be edges\n  assert(E.cols() == 2);\n  // number of faces\n  const int m = F.rows();\n  // Collect all directed edges after E\n  MatrixXi EallE(E.rows()+3*m,2);\n  EallE.block(0,0,E.rows(),E.cols()) = E;\n  for(int e = 0;e<3;e++)\n  {\n    for(int f = 0;f<m;f++)\n    {\n      for(int c = 0;c<2;c++)\n      {\n        // 12 20 01\n        EallE(E.rows()+m*e+f,c) = F(f,(c+1+e)%3);\n      }\n    }\n  }\n  // sort directed edges into undirected edges\n  MatrixXi sorted_EallE,_;\n  sort(EallE,2,true,sorted_EallE,_);\n  // Determine unique undirected edges E and map to directed edges EMAP\n  MatrixXi uE;\n  VectorXi EMAP;\n  unique_rows(sorted_EallE,uE,_,EMAP);\n  // Counts of occurances\n  VectorXi N = VectorXi::Zero(uE.rows());\n  for(int e = 0;e<EMAP.rows();e++)\n  {\n    N(EMAP(e))++;\n  }\n  B.resize(E.rows());\n  // Look of occurances of 2: one for original and another for boundary\n  for(int e = 0;e<E.rows();e++)\n  {\n    B(e) = (N(EMAP(e)) == 2);\n  }\n}\n\n\ntemplate <\n  typename DerivedF,\n  typename DerivedE,\n  typename DerivedB,\n  typename DerivedEMAP>\nvoid igl::is_boundary_edge(\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  Eigen::PlainObjectBase<DerivedB> & B,\n  Eigen::PlainObjectBase<DerivedE> & E,\n  Eigen::PlainObjectBase<DerivedEMAP> & EMAP)\n{\n  using namespace Eigen;\n  using namespace std;\n  // Should be triangles\n  assert(F.cols() == 3);\n  // number of faces\n  const int m = F.rows();\n  // Collect all directed edges after E\n  MatrixXi allE(3*m,2);\n  for(int e = 0;e<3;e++)\n  {\n    for(int f = 0;f<m;f++)\n    {\n      for(int c = 0;c<2;c++)\n      {\n        // 12 20 01\n        allE(m*e+f,c) = F(f,(c+1+e)%3);\n      }\n    }\n  }\n  // sort directed edges into undirected edges\n  MatrixXi sorted_allE,_;\n  sort(allE,2,true,sorted_allE,_);\n  // Determine unique undirected edges E and map to directed edges EMAP\n  unique_rows(sorted_allE,E,_,EMAP);\n  // Counts of occurances\n  VectorXi N = VectorXi::Zero(E.rows());\n  for(int e = 0;e<EMAP.rows();e++)\n  {\n    N(EMAP(e))++;\n  }\n  B.resize(E.rows());\n  // Look of occurances of 1\n  for(int e = 0;e<E.rows();e++)\n  {\n    B(e) = N(e) == 1;\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation:\ntemplate void igl::is_boundary_edge<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\ntemplate void igl::is_boundary_edge<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<bool, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<bool, -1, 1, 0, -1, 1> >&);\ntemplate void igl::is_boundary_edge<Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<bool, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<bool, -1, 1, 0, -1, 1> >&);\ntemplate void igl::is_boundary_edge<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<bool, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<bool, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::is_boundary_edge<Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<bool, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<bool, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::is_boundary_edge<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/is_boundary_edge.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IS_BOUNDARY_EDGE_H\n#define IS_BOUNDARY_EDGE_H\n#include <Eigen/Dense>\n\nnamespace igl\n{\n  //  IS_BOUNDARY_EDGE Determine for each edge E if it is a \"boundary edge\" in F.\n  //  Boundary edges are undirected edges which occur only once.\n  // \n  //  Inputs:\n  //    E  #E by 2 list of edges\n  //    F  #F by 3 list of triangles\n  //  Outputs:\n  //    B  #E list bools. true iff unoriented edge occurs exactly once in F\n  //      (non-manifold and non-existant edges will be false)\n  // \n  template <\n    typename DerivedF,\n    typename DerivedE,\n    typename DerivedB>\n  void is_boundary_edge(\n    const Eigen::PlainObjectBase<DerivedE> & E,\n    const Eigen::PlainObjectBase<DerivedF> & F,\n    Eigen::PlainObjectBase<DerivedB> & B);\n  // Wrapper where Edges should also be computed from F\n  //   E  #E by 2 list of edges\n  //   EMAP  #F*3 list of indices mapping allE to E\n  template <\n    typename DerivedF,\n    typename DerivedE,\n    typename DerivedB,\n    typename DerivedEMAP>\n  void is_boundary_edge(\n    const Eigen::PlainObjectBase<DerivedF> & F,\n    Eigen::PlainObjectBase<DerivedB> & B,\n    Eigen::PlainObjectBase<DerivedE> & E,\n    Eigen::PlainObjectBase<DerivedEMAP> & EMAP);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"is_boundary_edge.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/is_dir.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"is_dir.h\"\n\n#include <sys/stat.h>\n\n#ifndef S_ISDIR\r\n#define S_ISDIR(mode)  (((mode) & S_IFMT) == S_IFDIR)\r\n#endif\r\n\r\n#ifndef S_ISREG\r\n#define S_ISREG(mode)  (((mode) & S_IFMT) == S_IFREG)\r\n#endif\n\nIGL_INLINE bool igl::is_dir(const char * filename)\n{\n  struct stat status;\n  if(stat(filename,&status)!=0)\n  {\n    // path does not exist\n    return false;\n  }\n  // Tests whether existing path is a directory\n  return S_ISDIR(status.st_mode);\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/is_dir.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_IS_DIR_H\n#define IGL_IS_DIR_H\n#include \"igl_inline.h\"\nnamespace igl\n{\n  // Act like php's is_dir function\n  // http://php.net/manual/en/function.is-dir.php\n  // Tells whether the given filename is a directory.\n  // Input:\n  //   filename  Path to the file. If filename is a relative filename, it will\n  //     be checked relative to the current working directory. \n  // Returns TRUE if the filename exists and is a directory, FALSE\n  // otherwise.\n  IGL_INLINE bool is_dir(const char * filename);\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"is_dir.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/is_edge_manifold.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"is_edge_manifold.h\"\n#include \"all_edges.h\"\n#include \"unique_simplices.h\"\n\n#include <algorithm>\n#include <vector>\n\ntemplate <\n  typename DerivedF,\n  typename DerivedBF,\n  typename DerivedE,\n  typename DerivedEMAP,\n  typename DerivedBE>\nIGL_INLINE bool igl::is_edge_manifold(\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  Eigen::PlainObjectBase<DerivedBF>& BF,\n  Eigen::PlainObjectBase<DerivedE>& E,\n  Eigen::PlainObjectBase<DerivedEMAP>& EMAP,\n  Eigen::PlainObjectBase<DerivedBE>& BE)\n{\n  using namespace Eigen;\n  typedef typename DerivedF::Index Index;\n  typedef Matrix<typename DerivedF::Scalar,Dynamic,1> VectorXF;\n  typedef Matrix<typename DerivedF::Scalar,Dynamic,2> MatrixXF2;\n  MatrixXF2 allE;\n  all_edges(F,allE);\n  // Find unique undirected edges and mapping\n  VectorXF _;\n  unique_simplices(allE,E,_,EMAP);\n  std::vector<typename DerivedF::Index> count(E.rows(),0);\n  for(Index e = 0;e<EMAP.rows();e++)\n  {\n    count[EMAP[e]]++;\n  }\n  const Index m = F.rows();\n  BF.resize(m,3);\n  BE.resize(E.rows(),1);\n  bool all = true;\n  for(Index e = 0;e<EMAP.rows();e++)\n  {\n    const bool manifold = count[EMAP[e]] <= 2;\n    all &= BF(e%m,e/m) = manifold;\n    BE(EMAP[e]) = manifold;\n  }\n  return all;\n}\n\ntemplate <typename DerivedF>\nIGL_INLINE bool igl::is_edge_manifold(\n  const Eigen::PlainObjectBase<DerivedF>& F)\n{\n  // TODO: It's bothersome that this is not calling/reusing the code from the\n  // overload above. This could result in disagreement.\n\n  // List of edges (i,j,f,c) where edge i<j is associated with corner i of face\n  // f\n  std::vector<std::vector<int> > TTT;\n  for(int f=0;f<F.rows();++f)\n    for (int i=0;i<3;++i)\n    {\n      // v1 v2 f ei\n      int v1 = F(f,i);\n      int v2 = F(f,(i+1)%3);\n      if (v1 > v2) std::swap(v1,v2);\n      std::vector<int> r(4);\n      r[0] = v1; r[1] = v2;\n      r[2] = f;  r[3] = i;\n      TTT.push_back(r);\n    }\n  // Sort lexicographically\n  std::sort(TTT.begin(),TTT.end());\n\n  for(int i=2;i<(int)TTT.size();++i)\n  {\n    // Check any edges occur 3 times\n    std::vector<int>& r1 = TTT[i-2];\n    std::vector<int>& r2 = TTT[i-1];\n    std::vector<int>& r3 = TTT[i];\n    if ( (r1[0] == r2[0] && r2[0] == r3[0])\n        &&\n        (r1[1] == r2[1] && r2[1] == r3[1]) )\n    {\n      return false;\n    }\n  }\n  return true;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate bool igl::is_edge_manifold<Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1> > const&);\n// generated by autoexplicit.sh\n//template bool igl::is_edge_manifold<double>(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&);\ntemplate bool igl::is_edge_manifold<Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&);\ntemplate bool igl::is_edge_manifold<Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/is_edge_manifold.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_IS_EDGE_MANIFOLD_H\n#define IGL_IS_EDGE_MANIFOLD_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Core>\n\nnamespace igl \n{\n  // check if the mesh is edge-manifold\n  //\n  // Inputs:\n  //   V  #V by dim list of mesh vertex positions **unneeded**\n  //   F  #F by 3 list of triangle indices\n  // Returns whether mesh is edge manifold.\n  //\n  // Known Bugs:\n  //  Does not check for non-manifold vertices\n  //\n  // See also: is_vertex_manifold\n  template <\n    typename DerivedF, \n    typename DerivedBF,\n    typename DerivedE,\n    typename DerivedEMAP,\n    typename DerivedBE>\n  IGL_INLINE bool is_edge_manifold(\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    Eigen::PlainObjectBase<DerivedBF>& BF,\n    Eigen::PlainObjectBase<DerivedE>& E,\n    Eigen::PlainObjectBase<DerivedEMAP>& EMAP,\n    Eigen::PlainObjectBase<DerivedBE>& BE);\n  template <typename DerivedF>\n  IGL_INLINE bool is_edge_manifold(\n    const Eigen::PlainObjectBase<DerivedF>& F);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"is_edge_manifold.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/is_file.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"is_file.h\"\n\n#include <sys/stat.h>\n#ifdef _WIN32\n#  ifndef S_ISREG\r\n#    define S_ISREG(mode)  (((mode) & S_IFMT) == S_IFREG)\r\n#  endif\n#endif\nIGL_INLINE bool igl::is_file(const char * filename)\n{\n  struct stat status;\n  if(stat(filename,&status)!=0)\n  {\n    // path does not exist\n    return false;\n  }\n  // Tests whether existing path is a regular file\n  return S_ISREG(status.st_mode);\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/is_file.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_IS_FILE_H\n#define IGL_IS_FILE_H\n#include \"igl_inline.h\"\nnamespace igl\n{\n  // Act like php's is_file function\n  // http://php.net/manual/en/function.is-file.php\n  // Tells whether the given filename is a regular file.\n  // Input:\n  //   filename  Path to the file. If filename is a relative filename, it will\n  //     be checked relative to the current working directory. \n  // Returns TRUE if the filename exists and is a regular file, FALSE\n  // otherwise.\n  IGL_INLINE bool is_file(const char * filename);\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"is_file.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/is_irregular_vertex.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2015 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"is_irregular_vertex.h\"\n#include <vector>\n\n#include \"is_border_vertex.h\"\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE std::vector<bool> igl::is_irregular_vertex(const Eigen::PlainObjectBase<DerivedV> &V, const Eigen::PlainObjectBase<DerivedF> &F)\n{\n  Eigen::VectorXi count = Eigen::VectorXi::Zero(F.maxCoeff());\n\n  for(unsigned i=0; i<F.rows();++i)\n  {\n    for(unsigned j=0; j<F.cols();++j)\n    {\n      if (F(i,j) < F(i,(j+1)%F.cols())) // avoid duplicate edges\n      {\n        count(F(i,j  )) += 1;\n        count(F(i,(j+1)%F.cols())) += 1;\n      }\n    }\n  }\n\n  std::vector<bool> border = is_border_vertex(V,F);\n\n  std::vector<bool> res(count.size());\n\n  for (unsigned i=0; i<res.size(); ++i)\n    res[i] = !border[i] && count[i] != (F.cols() == 3 ? 6 : 4 );\n\n  return res;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate std::vector<bool, std::allocator<bool> > igl::is_irregular_vertex<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&);\ntemplate std::vector<bool, std::allocator<bool> > igl::is_irregular_vertex<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/is_irregular_vertex.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2015 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_IS_IRREGULAR_VERTEX_H\n#define IGL_IS_IRREGULAR_VERTEX_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Core>\n#include <vector>\n\nnamespace igl\n{\n  // Determine if a vertex is irregular, i.e. it has more than 6 (triangles)\n  // or 4 (quads) incident edges. Vertices on the boundary are ignored.\n  //\n  // Inputs:\n  //   V  #V by dim list of vertex positions\n  //   F  #F by 3[4] list of triangle[quads] indices\n  // Returns #V vector of bools revealing whether vertices are singular\n  //\n  template <typename DerivedV, typename DerivedF>\n  IGL_INLINE std::vector<bool> is_irregular_vertex(const Eigen::PlainObjectBase<DerivedV> &V, const Eigen::PlainObjectBase<DerivedF> &F);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"is_irregular_vertex.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/is_planar.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"is_planar.h\"\nIGL_INLINE bool igl::is_planar(const Eigen::MatrixXd & V)\n{\n  if(V.size() == 0) return false;\n  if(V.cols() == 2) return true;\n  for(int i = 0;i<V.rows();i++)\n  {\n    if(V(i,2) != 0) return false;\n  }\n  return true;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/is_planar.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_IS_PLANAR_H\n#define IGL_IS_PLANAR_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Dense>\n\nnamespace igl\n{\n  // Determin if a set of points lies on the XY plane\n  //\n  // Inputs:\n  //   V  #V by dim list of vertex positions\n  // Return true if a mesh has constant value of 0 in z coordinate\n  //\n  // Known bugs: Doesn't determine if vertex is flat if it doesn't lie on the\n  // XY plane.\n  IGL_INLINE bool is_planar(const Eigen::MatrixXd & V);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"is_planar.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/is_readable.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"is_readable.h\"\n\n#ifdef _WIN32\n#  include <cstdio>\nIGL_INLINE bool igl::is_readable(const char* filename)\n{\n  FILE * f = fopen(filename,\"r\");\n  if(f == NULL)\n  {\n    return false;\n  }\n  fclose(f);\n  return true;\n}\n#else\n#  include <sys/stat.h>\n#  include <unistd.h>\n#  include <iostream>\nIGL_INLINE bool igl::is_readable(const char* filename)\n{\n  // Check if file already exists\n  struct stat status;\n  if(stat(filename,&status)!=0)\n  {\n    return false;\n  }\n\n  // Get current users uid and gid\n  uid_t this_uid = getuid();\n  gid_t this_gid = getgid();\n\n  // Dealing with owner\n  if( this_uid == status.st_uid )\n  {\n    return S_IRUSR & status.st_mode;\n  }\n\n  // Dealing with group member\n  if( this_gid == status.st_gid )\n  {\n    return S_IRGRP & status.st_mode;\n  }\n\n  // Dealing with other\n  return S_IROTH & status.st_mode;\n\n}\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/is_readable.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_IS_READABLE_H\n#define IGL_IS_READABLE_H\n#include \"igl_inline.h\"\nnamespace igl\n{\n  // Check if a file is reabable like PHP's is_readable function:\n  // http://www.php.net/manual/en/function.is-readable.php\n  // Input:\n  //   filename  path to file\n  // Returns true if file exists and is readable and false if file doesn't\n  // exist or *is not readable*\n  //\n  // Note: Windows version will not check user or group ids\n  IGL_INLINE bool is_readable(const char * filename);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"is_readable.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/is_sparse.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"is_sparse.h\"\ntemplate <typename T>\nIGL_INLINE bool igl::is_sparse(\n  const Eigen::SparseMatrix<T> & A)\n{\n  return true;\n}\ntemplate <typename DerivedA>\nIGL_INLINE bool igl::is_sparse(\n  const Eigen::PlainObjectBase<DerivedA>& A)\n{\n  return false;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate bool igl::is_sparse<double>(Eigen::SparseMatrix<double, 0, int> const&);\n// generated by autoexplicit.sh\ntemplate bool igl::is_sparse<Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/is_sparse.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_IS_SPARSE_H\n#define IGL_IS_SPARSE_H\n#include \"igl_inline.h\"\n#define EIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET\n#include <Eigen/Dense>\n#include <Eigen/Sparse>\nnamespace igl\n{\n  // Determine if a matrix A is sparse\n  //\n  // Template:\n  //   T,DerivedA defines scalar type\n  // Inputs:\n  //   A  matrix in question\n  // Returns true if A is represented with a sparse matrix\n  template <typename T>\n  IGL_INLINE bool is_sparse(\n    const Eigen::SparseMatrix<T> & A);\n  template <typename DerivedA>\n  IGL_INLINE bool is_sparse(\n    const Eigen::PlainObjectBase<DerivedA>& A);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"is_sparse.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/is_stl.cpp",
    "content": "#include \"is_stl.h\"\n#include <string>\nIGL_INLINE bool igl::is_stl(FILE * stl_file, bool & is_ascii)\n{\n\n  //      solid?\n  //   YES      NO\n  //   /         if .stl, definitely binary\n  //  /\n  // perfect size?\n  //      YES     NO\n  //\n  const auto perfect_size = [](FILE * stl_file)->bool\n  {\n    stl_file = freopen(NULL,\"rb\",stl_file);\n    // Read 80 header\n    char header[80];\n    if(fread(header,sizeof(char),80,stl_file)!=80)\n    {\n      return false;\n    }\n    // Read number of triangles\n    unsigned int num_tri;\n    if(fread(&num_tri,sizeof(unsigned int),1,stl_file)!=1)\n    {\n      return false;\n    }\n    fseek(stl_file,0,SEEK_END);\n    int file_size = ftell(stl_file);\n    stl_file = freopen(NULL,\"r\",stl_file);\n    return (file_size == 80 + 4 + (4*12 + 2) * num_tri);\n  };\n  // Specifically 80 character header\n  char header[80];\n  char solid[80];\n  is_ascii = true;\n  bool f = true;\n  if(fread(header,1,80,stl_file) != 80)\n  {\n    f = false;\n    goto finish;\n  }\n\n  sscanf(header,\"%s\",solid);\n  if(std::string(\"solid\") == solid)\n  {\n    f = true;\n    is_ascii = !perfect_size(stl_file);\n  }else\n  {\n    is_ascii = false;\n    f = perfect_size(stl_file);\n  }\nfinish:\n  rewind(stl_file);\n  return f;\n}\n\nIGL_INLINE bool igl::is_stl(FILE * stl_file)\n{\n  bool is_ascii;\n  return is_stl(stl_file,is_ascii);\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/is_stl.h",
    "content": "#ifndef IGL_IS_STL_H\n#define IGL_IS_STL_H\n#include \"igl_inline.h\"\n#include <cstdio>\nnamespace igl\n{\n  // Given a file pointer, determine if it contains an .stl file and then\n  // rewind it.\n  // \n  // Inputs:\n  //   stl_file  pointer to file \n  // Outputs:\n  //   is_ascii  flag whether stl is ascii\n  // Returns  whether stl_file is an .stl file\n  IGL_INLINE bool is_stl(FILE * stl_file, bool & is_ascii);\n  IGL_INLINE bool is_stl(FILE * stl_file);\n};\n#ifndef IGL_STATIC_LIBRARY\n#  include \"is_stl.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/is_symmetric.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"is_symmetric.h\"\n#include \"find.h\"\n\ntemplate <typename T>\nIGL_INLINE bool igl::is_symmetric(const Eigen::SparseMatrix<T>& A)\n{\n  if(A.rows() != A.cols())\n  {\n    return false;\n  }\n  assert(A.size() != 0);\n  Eigen::SparseMatrix<T> AT = A.transpose();\n  Eigen::SparseMatrix<T> AmAT = A-AT;\n  //// Eigen screws up something with LLT if you try to do\n  //SparseMatrix<T> AmAT = A-A.transpose();\n  //// Eigen crashes at runtime if you try to do\n  // return (A-A.transpose()).nonZeros() == 0;\n  return AmAT.nonZeros() == 0;\n}\n\ntemplate <typename DerivedA>\nIGL_INLINE bool igl::is_symmetric(\n  const Eigen::PlainObjectBase<DerivedA>& A)\n{\n  if(A.rows() != A.cols())\n  {\n    return false;\n  }\n  assert(A.size() != 0);\n  const typename Eigen::PlainObjectBase<DerivedA>& AT = A.transpose();\n  const typename Eigen::PlainObjectBase<DerivedA>& AmAT = A-AT;\n  //// Eigen screws up something with LLT if you try to do\n  //SparseMatrix<T> AmAT = A-A.transpose();\n  //// Eigen crashes at runtime if you try to do\n  // return (A-A.transpose()).nonZeros() == 0;\n  return AmAT.nonZeros() == 0;\n}\n\ntemplate <typename AType, typename epsilonT>\nIGL_INLINE bool igl::is_symmetric(\n  const Eigen::SparseMatrix<AType>& A, \n  const epsilonT epsilon)\n{\n  using namespace Eigen;\n  using namespace std;\n  if(A.rows() != A.cols())\n  {\n    return false;\n  }\n  assert(A.size() != 0);\n  SparseMatrix<AType> AT = A.transpose();\n  SparseMatrix<AType> AmAT = A-AT;\n  VectorXi AmATI,AmATJ;\n  Matrix<AType,Dynamic,1> AmATV;\n  find(AmAT,AmATI,AmATJ,AmATV);\n  if(AmATI.size() == 0)\n  {\n    return true;\n  }\n  \n  return AmATV.maxCoeff() < epsilon && AmATV.minCoeff() > -epsilon;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate bool igl::is_symmetric<Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&);\n// generated by autoexplicit.sh\ntemplate bool igl::is_symmetric<double>(Eigen::SparseMatrix<double, 0, int> const&);\ntemplate bool igl::is_symmetric<double, double>(Eigen::SparseMatrix<double, 0, int> const&, double);\ntemplate bool igl::is_symmetric<double, int>(Eigen::SparseMatrix<double, 0, int> const&, int);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/is_symmetric.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_IS_SYMMETRIC_H\n#define IGL_IS_SYMMETRIC_H\n#include \"igl_inline.h\"\n#define EIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET\n#include <Eigen/Sparse>\nnamespace igl\n{\n  // Returns true if the given matrix is symmetric\n  // Inputs:\n  //   A  m by m matrix\n  // Returns true if the matrix is square and symmetric\n  template <typename AT>\n  IGL_INLINE bool is_symmetric(const Eigen::SparseMatrix<AT>& A);\n  // Inputs:\n  //   epsilon threshold on L1 difference between A and A'\n  template <typename AT, typename epsilonT>\n  IGL_INLINE bool is_symmetric(const Eigen::SparseMatrix<AT>& A, const epsilonT epsilon);\n  template <typename DerivedA>\n  IGL_INLINE bool is_symmetric(\n    const Eigen::PlainObjectBase<DerivedA>& A);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"is_symmetric.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/is_vertex_manifold.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"is_vertex_manifold.h\"\n#include \"triangle_triangle_adjacency.h\"\n#include \"vertex_triangle_adjacency.h\"\n#include \"unique.h\"\n#include <vector>\n#include <cassert>\n#include <map>\n#include <queue>\n#include <iostream>\n\ntemplate <typename DerivedF,typename DerivedB>\nIGL_INLINE bool igl::is_vertex_manifold(\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  Eigen::PlainObjectBase<DerivedB>& B)\n{\n  using namespace std;\n  using namespace Eigen;\n  assert(F.cols() == 3 && \"F must contain triangles\");\n  typedef typename DerivedF::Scalar Index;\n  typedef typename DerivedF::Index FIndex;\n  const FIndex m = F.rows();\n  const Index n = F.maxCoeff()+1;\n  vector<vector<vector<FIndex > > > TT;\n  vector<vector<vector<FIndex > > > TTi;\n  triangle_triangle_adjacency(F,TT,TTi);\n\n  vector<vector<FIndex > > V2F,_1;\n  vertex_triangle_adjacency(n,F,V2F,_1);\n\n  const auto & check_vertex = [&](const Index v)->bool\n  {\n    vector<FIndex> uV2Fv;\n    {\n      vector<size_t> _1,_2;\n      unique(V2F[v],uV2Fv,_1,_2);\n    }\n    const FIndex one_ring_size = uV2Fv.size();\n    if(one_ring_size == 0)\n    {\n      return false;\n    }\n    const FIndex g = uV2Fv[0];\n    queue<Index> Q;\n    Q.push(g);\n    map<FIndex,bool> seen;\n    while(!Q.empty())\n    {\n      const FIndex f = Q.front();\n      Q.pop();\n      if(seen.count(f)==1)\n      {\n        continue;\n      }\n      seen[f] = true;\n      // Face f's neighbor lists opposite opposite each corner\n      for(const auto & c : TT[f])\n      {\n        // Each neighbor\n        for(const auto & n : c)\n        {\n          bool contains_v = false;\n          for(Index nc = 0;nc<F.cols();nc++)\n          {\n            if(F(n,nc) == v)\n            {\n              contains_v = true;\n              break;\n            }\n          }\n          if(seen.count(n)==0 && contains_v)\n          {\n            Q.push(n);\n          }\n        }\n      }\n    }\n    return one_ring_size == (FIndex) seen.size();\n  };\n\n  // Unreferenced vertices are considered non-manifold\n  B.setConstant(n,1,false);\n  // Loop over all vertices touched by F\n  bool all = true;\n  for(Index v = 0;v<n;v++)\n  {\n    all &= B(v) = check_vertex(v);\n  }\n  return all;\n}\n\n#ifdef IGL_STATIC_LIBRARY\ntemplate bool igl::is_vertex_manifold<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate bool igl::is_vertex_manifold<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate bool igl::is_vertex_manifold<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/is_vertex_manifold.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_IS_VERTEX_MANIFOLD_H\n#define IGL_IS_VERTEX_MANIFOLD_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Core>\n\nnamespace igl \n{\n  // Check if a mesh is vertex-manifold. This only checks whether the faces\n  // incident on each vertex form exactly one connected component. Vertices\n  // incident on non-manifold edges are not consider non-manifold by this\n  // function (see is_edge_manifold.h). Unreferenced verties are considered\n  // non-manifold (zero components).\n  //\n  // Inputs:\n  //   F  #F by 3 list of triangle indices\n  // Outputs:\n  //   B  #V list indicate whether each vertex is locally manifold.\n  // Returns whether mesh is vertex manifold.\n  //\n  // See also: is_edge_manifold\n  template <typename DerivedF,typename DerivedB>\n  IGL_INLINE bool is_vertex_manifold(\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    Eigen::PlainObjectBase<DerivedB>& B);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"is_vertex_manifold.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/is_writable.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"is_writable.h\"\n\n#ifdef _WIN32\n#include <sys/stat.h>\n#ifndef S_IWUSR\n#  define S_IWUSR S_IWRITE\n#endif\nIGL_INLINE bool is_writable(const char* filename)\n{\n  // Check if file already exists\n  struct stat status;\n  if(stat(filename,&status)!=0)\n  {\n    return false;\n  }\n\n  return S_IWUSR & status.st_mode;\n}\n#else\n#include <sys/stat.h>\n#include <unistd.h>\n\nIGL_INLINE bool igl::is_writable(const char* filename)\n{\n  // Check if file already exists\n  struct stat status;\n  if(stat(filename,&status)!=0)\n  {\n    return false;\n  }\n\n  // Get current users uid and gid\n  uid_t this_uid = getuid();\n  gid_t this_gid = getgid();\n\n  // Dealing with owner\n  if( this_uid == status.st_uid )\n  {\n    return S_IWUSR & status.st_mode;\n  }\n\n  // Dealing with group member\n  if( this_gid == status.st_gid )\n  {\n    return S_IWGRP & status.st_mode;\n  }\n\n  // Dealing with other\n  return S_IWOTH & status.st_mode;\n}\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/is_writable.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_IS_WRITABLE_H\n#define IGL_IS_WRITABLE_H\n#include \"igl_inline.h\"\nnamespace igl\n{\n  // Check if a file exists *and* is writable like PHP's is_writable function:\n  // http://www.php.net/manual/en/function.is-writable.php\n  // Input:\n  //   filename  path to file\n  // Returns true if file exists and is writable and false if file doesn't\n  // exist or *is not writable*\n  //\n  // Note: Windows version will not test group and user id\n  IGL_INLINE bool is_writable(const char * filename);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"is_writable.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/isdiag.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"isdiag.h\"\n\ntemplate <typename Scalar>\nIGL_INLINE bool igl::isdiag(const Eigen::SparseMatrix<Scalar> & A)\n{\n  // Iterate over outside of A\n  for(int k=0; k<A.outerSize(); ++k)\n  {\n    // Iterate over inside\n    for(typename Eigen::SparseMatrix<Scalar>::InnerIterator it (A,k); it; ++it)\n    {\n      if(it.row() != it.col() && it.value()!=0)\n      {\n        return false;\n      }\n    }\n  }\n  return true;\n}\n\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate bool igl::isdiag<double>(class Eigen::SparseMatrix<double,0,int> const &);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/isdiag.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_ISDIAG_H\n#define IGL_ISDIAG_H\n#include \"igl_inline.h\"\n#include <Eigen/Sparse>\nnamespace igl\n{\n  // Determine if a given matrix is diagonal: all non-zeros lie on the\n  // main diagonal.\n  //\n  // Inputs:\n  //   A  m by n sparse matrix\n  // Returns true iff and only if the matrix is diagonal.\n  template <typename Scalar>\n  IGL_INLINE bool isdiag(const Eigen::SparseMatrix<Scalar> & A);\n};\n#ifndef IGL_STATIC_LIBRARY\n#  include \"isdiag.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/ismember.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"ismember.h\"\n#include \"colon.h\"\n#include \"list_to_matrix.h\"\n#include \"sort.h\"\n#include \"sortrows.h\"\n#include \"unique.h\"\n\ntemplate <\n  typename DerivedA,\n  typename DerivedB,\n  typename DerivedIA,\n  typename DerivedLOCB>\nIGL_INLINE void igl::ismember(\n  const Eigen::PlainObjectBase<DerivedA> & A,\n  const Eigen::PlainObjectBase<DerivedB> & B,\n  Eigen::PlainObjectBase<DerivedIA> & IA,\n  Eigen::PlainObjectBase<DerivedLOCB> & LOCB)\n{\n  using namespace Eigen;\n  using namespace std;\n  IA.resizeLike(A);\n  IA.setConstant(false);\n  LOCB.resizeLike(A);\n  LOCB.setConstant(-1);\n  // boring base cases\n  if(A.size() == 0)\n  {\n    return;\n  }\n  if(B.size() == 0)\n  {\n    return;\n  }\n\n  // Get rid of any duplicates\n  typedef Matrix<typename DerivedA::Scalar,Dynamic,1> VectorA;\n  typedef Matrix<typename DerivedB::Scalar,Dynamic,1> VectorB;\n  const VectorA vA(Eigen::Map<const VectorA>(A.data(), A.cols()*A.rows(),1));\n  const VectorB vB(Eigen::Map<const VectorB>(B.data(), B.cols()*B.rows(),1));\n  VectorA uA;\n  VectorB uB;\n  Eigen::Matrix<typename DerivedA::Index,Dynamic,1> uIA,uIuA,uIB,uIuB;\n  unique(vA,uA,uIA,uIuA);\n  unique(vB,uB,uIB,uIuB);\n  // Sort both\n  VectorA sA;\n  VectorB sB;\n  Eigen::Matrix<typename DerivedA::Index,Dynamic,1> sIA,sIB;\n  sort(uA,1,true,sA,sIA);\n  sort(uB,1,true,sB,sIB);\n\n  Eigen::Matrix<bool,Eigen::Dynamic,1> uF = \n    Eigen::Matrix<bool,Eigen::Dynamic,1>::Zero(sA.size(),1);\n  Eigen::Matrix<typename DerivedLOCB::Scalar, Eigen::Dynamic,1> uLOCB =\n    Eigen::Matrix<typename DerivedLOCB::Scalar,Eigen::Dynamic,1>::\n    Constant(sA.size(),1,-1);\n  {\n    int bi = 0;\n    // loop over sA\n    bool past = false;\n    for(int a = 0;a<sA.size();a++)\n    {\n      while(!past && sA(a)>sB(bi))\n      {\n        bi++;\n        past = bi>=sB.size();\n      }\n      if(!past && sA(a)==sB(bi))\n      {\n        uF(sIA(a)) = true;\n        uLOCB(sIA(a)) = uIB(sIB(bi));\n      }\n    }\n  }\n\n  Map< Matrix<typename DerivedIA::Scalar,Dynamic,1> > \n    vIA(IA.data(),IA.cols()*IA.rows(),1);\n  Map< Matrix<typename DerivedLOCB::Scalar,Dynamic,1> > \n    vLOCB(LOCB.data(),LOCB.cols()*LOCB.rows(),1);\n  for(int a = 0;a<A.size();a++)\n  {\n    vIA(a) = uF(uIuA(a));\n    vLOCB(a) = uLOCB(uIuA(a));\n  }\n}\n\ntemplate <\n  typename DerivedA,\n  typename DerivedB,\n  typename DerivedIA,\n  typename DerivedLOCB>\nIGL_INLINE void igl::ismember_rows(\n  const Eigen::PlainObjectBase<DerivedA> & A,\n  const Eigen::PlainObjectBase<DerivedB> & B,\n  Eigen::PlainObjectBase<DerivedIA> & IA,\n  Eigen::PlainObjectBase<DerivedLOCB> & LOCB)\n{\n  using namespace Eigen;\n  using namespace std;\n  assert(A.cols() == B.cols() && \"number of columns must match\");\n  IA.resize(A.rows(),1);\n  IA.setConstant(false);\n  LOCB.resize(A.rows(),1);\n  LOCB.setConstant(-1);\n  // boring base cases\n  if(A.size() == 0)\n  {\n    return;\n  }\n  if(B.size() == 0)\n  {\n    return;\n  }\n\n  // Get rid of any duplicates\n  DerivedA uA;\n  DerivedB uB;\n  Eigen::Matrix<typename DerivedA::Index,Dynamic,1> uIA,uIuA,uIB,uIuB;\n  unique_rows(A,uA,uIA,uIuA);\n  unique_rows(B,uB,uIB,uIuB);\n  // Sort both\n  DerivedA sA;\n  DerivedB sB;\n  Eigen::Matrix<typename DerivedA::Index,Dynamic,1> sIA,sIB;\n  sortrows(uA,true,sA,sIA);\n  sortrows(uB,true,sB,sIB);\n\n  Eigen::Matrix<bool,Eigen::Dynamic,1> uF = \n    Eigen::Matrix<bool,Eigen::Dynamic,1>::Zero(sA.size(),1);\n  Eigen::Matrix<typename DerivedLOCB::Scalar, Eigen::Dynamic,1> uLOCB =\n    Eigen::Matrix<typename DerivedLOCB::Scalar,Eigen::Dynamic,1>::\n    Constant(sA.size(),1,-1);\n  const auto & row_greater_than = [&sA,&sB](const int a, const int b)\n  {\n    for(int c = 0;c<sA.cols();c++)\n    {\n      if(sA(a,c) > sB(b,c)) return true;\n      if(sA(a,c) < sB(b,c)) return false;\n    }\n    return false;\n  };\n  {\n    int bi = 0;\n    // loop over sA\n    bool past = false;\n    for(int a = 0;a<sA.rows();a++)\n    {\n      while(!past && row_greater_than(a,bi))\n      {\n        bi++;\n        past = bi>=sB.size();\n      }\n      if(!past && (sA.row(a).array()==sB.row(bi).array()).all() )\n      {\n        uF(sIA(a)) = true;\n        uLOCB(sIA(a)) = uIB(sIB(bi));\n      }\n    }\n  }\n\n  for(int a = 0;a<A.rows();a++)\n  {\n    IA(a) = uF(uIuA(a));\n    LOCB(a) = uLOCB(uIuA(a));\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::ismember<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<bool, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<bool, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::ismember_rows<Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Array<bool, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> > const&, Eigen::PlainObjectBase<Eigen::Array<bool, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/ismember.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_ISMEMBER_H\n#define IGL_ISMEMBER_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Determine if elements of A exist in elements of B\n  //\n  // Inputs:\n  //   A  ma by na matrix\n  //   B  mb by nb matrix\n  // Outputs:\n  //   IA  ma by na matrix of flags whether corresponding element of A exists in\n  //     B\n  //   LOCB  ma by na matrix of indices in B locating matching element (-1 if\n  //     not found), indices assume column major ordering\n  //\n  template <\n    typename DerivedA,\n    typename DerivedB,\n    typename DerivedIA,\n    typename DerivedLOCB>\n  IGL_INLINE void ismember(\n    const Eigen::PlainObjectBase<DerivedA> & A,\n    const Eigen::PlainObjectBase<DerivedB> & B,\n    Eigen::PlainObjectBase<DerivedIA> & IA,\n    Eigen::PlainObjectBase<DerivedLOCB> & LOCB);\n  template <\n    typename DerivedA,\n    typename DerivedB,\n    typename DerivedIA,\n    typename DerivedLOCB>\n  IGL_INLINE void ismember_rows(\n    const Eigen::PlainObjectBase<DerivedA> & A,\n    const Eigen::PlainObjectBase<DerivedB> & B,\n    Eigen::PlainObjectBase<DerivedIA> & IA,\n    Eigen::PlainObjectBase<DerivedLOCB> & LOCB);\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"ismember.cpp\"\n#endif\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/jet.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"jet.h\"\n#include \"colon.h\"\n\n#ifndef IGL_NO_EIGEN\n//void igl::jet(const int m, Eigen::MatrixXd & J)\n//{\n//  using namespace Eigen;\n//  // Applications/MATLAB_R2012b.app/toolbox/matlab/graph3d/jet.m\n//  const int n = ceil(m/4);\n//  // resize output\n//  J.resize(m,3);\n//  // u = [(1:1:n)/n ones(1,n-1) (n:-1:1)/n]';\n//  VectorXd u(n*3-1);\n//  u.block(0,0,n-1,1) = colon(1,n)/double(n);\n//  VectorXd g;\n//  colon(0,n*3-1-1,g);\n//  g.array() = g.array() + ceil(n/2) - int((m%4)==1);\n//  VectorXd r = (g.array() + n).eval().matrix();\n//  VectorXd b = (g.array() - n).eval().matrix();\n//  int ri = 0;\n//  int gi = 0;\n//  int sb = 0;\n//  // count number of indices in b\n//  for(int j = 0;j<g.rows();j++)\n//  {\n//    sb += b(j)<m;\n//  }\n//\n//  for(int j = 0;j<g.rows();j++)\n//  {\n//    if(r(j)<m)\n//    {\n//      J(r(j),0) = u(ri++);\n//    }\n//    if(g(j)<m)\n//    {\n//      J(g(j),1) = u(gi++);\n//    }\n//    if(b(j)<m)\n//    {\n//      //J(b(j),2) = u(m- --sb);\n//    }\n//  }\n//}\n#endif\n\n\ntemplate <typename T>\nIGL_INLINE void igl::jet(const T x, T * rgb)\n{\n  return jet(x,rgb[0],rgb[1],rgb[2]);\n}\n\ntemplate <typename T>\nIGL_INLINE void igl::jet(const T x_in, T & r, T & g, T & b)\n{\n  // Only important if the number of colors is small. In which case the rest is\n  // still wrong anyway\n  // x = linspace(0,1,jj)' * (1-1/jj) + 1/jj;\n  //\n  const double rone = 0.8;\n  const double gone = 1.0;\n  const double bone = 1.0;\n  T x = x_in;\n  x = (x_in<0?0:(x>1?1:x));\n\n  if(x<1./8.)\n  {\n    r = 0;\n    g = 0;\n    b = bone*(0.5+(x)/(1./8.)*0.5);\n  }else if(x<3./8.)\n  {\n    r = 0;\n    g = gone*(x-1./8.)/(3./8.-1./8.);\n    b = bone;\n  }else if(x<5./8.)\n  {\n    r = rone*(x-3./8.)/(5./8.-3./8.);\n    g = gone;\n    b = (bone-(x-3./8.)/(5./8.-3./8.));\n  }else if(x<7./8.)\n  {\n    r = rone;\n    g = (gone-(x-5./8.)/(7./8.-5./8.));\n    b = 0;\n  }else\n  {\n    r = (rone-(x-7./8.)/(1.-7./8.)*0.5);\n    g = 0;\n    b = 0;\n  }\n}\n\ntemplate <typename DerivedZ, typename DerivedC>\nIGL_INLINE void igl::jet(\n  const Eigen::PlainObjectBase<DerivedZ> & Z,\n  const bool normalize,\n  Eigen::PlainObjectBase<DerivedC> & C)\n{\n  const double min_z = (normalize?Z.minCoeff():0);\n  const double max_z = (normalize?Z.maxCoeff():-1);\n  return jet(Z,min_z,max_z,C);\n}\n\ntemplate <typename DerivedZ, typename DerivedC>\nIGL_INLINE void igl::jet(\n  const Eigen::PlainObjectBase<DerivedZ> & Z,\n  const double min_z,\n  const double max_z,\n  Eigen::PlainObjectBase<DerivedC> & C)\n{\n  C.resize(Z.rows(),3);\n  double denom = (max_z-min_z);\n  denom = denom==0?1:denom;\n  for(int r = 0;r<Z.rows();r++)\n  {\n    jet(\n      (typename DerivedC::Scalar)((-min_z+Z(r,0))/denom),\n      C(r,0),\n      C(r,1),\n      C(r,2));\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::jet<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::jet<double>(double, double*);\ntemplate void igl::jet<double>(double, double&, double&, double&);\ntemplate void igl::jet<float>(float, float*);\ntemplate void igl::jet<Eigen::Array<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Array<double, -1, 1, 0, -1, 1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::jet<Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::jet<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::jet<float>(float, float&, float&, float&);\ntemplate void igl::jet<Eigen::Matrix<float, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 1, 0, -1, 1> > const&, double, double, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::jet<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, double, double, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::jet<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, double, double, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/jet.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_JET_H\n#define IGL_JET_H\n#include \"igl_inline.h\"\n//#ifndef IGL_NO_EIGEN\n#  include <Eigen/Dense>\n//#endif\nnamespace igl\n{\n  // JET like MATLAB's jet\n  //\n  // Inputs:\n  //   m  number of colors \n  // Outputs:\n  //   J  m by list of RGB colors between 0 and 1\n  //\n//#ifndef IGL_NO_EIGEN\n//  void jet(const int m, Eigen::MatrixXd & J);\n//#endif\n  // Wrapper for directly computing [r,g,b] values for a given factor f between\n  // 0 and 1\n  //\n  // Inputs:\n  //   f  factor determining color value as if 0 was min and 1 was max\n  // Outputs:\n  //   r  red value\n  //   g  green value\n  //   b  blue value\n  template <typename T>\n  IGL_INLINE void jet(const T f, T * rgb);\n  template <typename T>\n  IGL_INLINE void jet(const T f, T & r, T & g, T & b);\n  // Inputs:\n  //   Z  #Z list of factors\n  //   normalize  whether to normalize Z to be tightly between [0,1]\n  // Outputs:\n  //   C  #C by 3 list of rgb colors\n  template <typename DerivedZ, typename DerivedC>\n  IGL_INLINE void jet(\n    const Eigen::PlainObjectBase<DerivedZ> & Z,\n    const bool normalize,\n    Eigen::PlainObjectBase<DerivedC> & C);\n  // Inputs:\n  //   min_z  value at blue\n  //   max_z  value at red\n  template <typename DerivedZ, typename DerivedC>\n  IGL_INLINE void jet(\n    const Eigen::PlainObjectBase<DerivedZ> & Z,\n    const double min_Z,\n    const double max_Z,\n    Eigen::PlainObjectBase<DerivedC> & C);\n};\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"jet.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/kronecker_product.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"kronecker_product.h\"\n\n//// Bug in unsupported/Eigen/SparseExtra needs iostream first\n//#include <iostream>\n//#include <unsupported/Eigen/SparseExtra>\n//\n//template <typename Scalar>\n//IGL_INLINE Eigen::SparseMatrix<Scalar> igl::kronecker_product(\n//  const Eigen::SparseMatrix<Scalar> & A,\n//  const Eigen::SparseMatrix<Scalar> & B)\n//{\n//  using namespace Eigen;\n//  using namespace std;\n//\n//  // Convert B in triplets format\n//  MatrixXd B_triplets(B.nonZeros(),3);\n//  int count = 0;\n//  for (int k=0; k<B.outerSize(); ++k)\n//    for (SparseMatrix<double>::InnerIterator it(B,k); it; ++it)\n//      B_triplets.row(count++) << it.row(), it.col(), it.value();\n//\n//  MatrixXd C_triplets(B_triplets.rows()*A.nonZeros(),3);\n//  count = 0;\n//  for (int k=0; k<A.outerSize(); ++k)\n//    for (SparseMatrix<double>::InnerIterator it(A,k); it; ++it)\n//    {\n//      int i = it.row();\n//      int j = it.col();\n//      double v = it.value();\n//\n//      MatrixXd B_triplets_copy = B_triplets;\n//      B_triplets_copy.col(0) = B_triplets_copy.col(0).array() + double(B.rows()*i);\n//      B_triplets_copy.col(1) = B_triplets_copy.col(1).array() + double(B.cols()*j);\n//      B_triplets_copy.col(2) = B_triplets_copy.col(2).array() * v;\n//\n//      C_triplets.block(count*B_triplets.rows(),0,\n//                       B_triplets.rows(), B_triplets.cols()) = B_triplets_copy;\n//\n//      count++;\n//    }\n//\n//  typedef Eigen::Triplet<double> T;\n//  std::vector<T> triplets;\n//  triplets.reserve(C_triplets.rows());\n//  \n//  for(unsigned i=0; i<C_triplets.rows(); ++i)\n//    triplets.push_back(T(C_triplets(i,0),C_triplets(i,1),C_triplets(i,2)));\n//  SparseMatrix<Scalar> C(A.rows()*B.rows(),A.cols()*B.cols());\n//  C.setFromTriplets(triplets.begin(),triplets.end());\n//  \n//  return C;\n//}\n//\n//#ifdef IGL_STATIC_LIBRARY\n//// Explicit template specialization\n//// generated by autoexplicit.sh\n//template Eigen::SparseMatrix<double, 0, int> igl::kronecker_product<double>(Eigen::SparseMatrix<double, 0, int> const&, Eigen::SparseMatrix<double, 0, int> const&);\n//#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/kronecker_product.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_KRONECKERPRODUCT_H\n#define IGL_KRONECKERPRODUCT_H\n\n// Obsolete: Use \n// #include <unsupported/Eigen/src/KroneckerProduct>\n// ...\n// Eigen::kroneckerProduct(A,B,C);\n\n//#include \"igl_inline.h\"\n//\n//#include <Eigen/Dense>\n//#include <Eigen/Sparse>\n//\n//namespace igl\n//{\n//  // Computes the Kronecker product between sparse matrices A and B.\n//  //\n//  // Inputs:\n//  //   A  #M by #N sparse matrix\n//  //   B  #P by #Q sparse matrix\n//  // Returns #M*#P by #N*#Q sparse matrix\n//  //\n//  template <typename Scalar>\n//  IGL_INLINE Eigen::SparseMatrix<Scalar> kronecker_product(\n//    const Eigen::SparseMatrix<Scalar> & A,\n//    const Eigen::SparseMatrix<Scalar> & B);\n//}\n//\n//#ifndef IGL_STATIC_LIBRARY\n//#  include \"kronecker_product.cpp\"\n//#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/launch_medit.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"launch_medit.h\"\n#include \"writeMESH.h\"\n#include <cstdio>\n#include <iostream>\n#include <string>\n#include <sstream>\n\n#define MEDIT_PATH \"/opt/local/bin/medit\"\n#define TEMP_MESH_FILE \"/var/tmp/temp.mesh\"\n#define TEMP_MEDIT_FILE \"/var/tmp/temp.medit\"\n\ntemplate <typename DerivedV, typename DerivedT, typename DerivedF>\nIGL_INLINE int igl::launch_medit(\n  const Eigen::PlainObjectBase<DerivedV> & V, \n  const Eigen::PlainObjectBase<DerivedT> & T,\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  const bool wait)\n{\n  using namespace std;\n  // Build medit command, end with & so command returns without waiting\n  stringstream command; \n  command<<MEDIT_PATH<<\" \"<<TEMP_MESH_FILE<<\" \"<<TEMP_MEDIT_FILE;\n  if(!wait)\n  {\n    command<<\" &\";\n  }\n  bool mesh_saved = writeMESH(TEMP_MESH_FILE,V,T,F);\n  if(!mesh_saved)\n  {\n    return -1;\n  }\n  // Write default medit options\n  const string default_medit_file_contents = \n    \"BackgroundColor 1 1 1\\n\"\n    \"LineColor 0 0 0\\n\"\n    \"WindowSize 1024 800\\n\"\n    \"RenderMode shading + lines\\n\";\n  FILE * fp = fopen(TEMP_MEDIT_FILE,\"w\");\n  if(fp == NULL)\n  {\n    cerr<<\"^\"<<__FUNCTION__<<\": Could not write to \"<<TEMP_MEDIT_FILE<<endl;\n    return -1;\n  }\n  fprintf(fp,\"%s\",default_medit_file_contents.c_str());\n  fclose(fp);\n\n  try\n  {\n    return system(command.str().c_str());\n  }catch(int e)\n  {\n    cerr<<\"^\"<<__FUNCTION__<<\": Calling to medit crashed...\"<<endl;\n    return -1;\n  }\n  // Could clean up and delete these files but not really worth it\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate int igl::launch_medit<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, bool);\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/launch_medit.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_LAUNCH_MEDIT_H\n#define IGL_LAUNCH_MEDIT_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Core>\n\nnamespace igl \n{\n  // Writes the tetmesh in (V,T,F) to a temporary file, opens it with medit\n  // (forking with a system call) and returns\n  //\n  //\n  // Templates:\n  //   DerivedV  real-value: i.e. from MatrixXd\n  //   DerivedT  integer-value: i.e. from MatrixXi\n  //   DerivedF  integer-value: i.e. from MatrixXi\n  // Inputs:\n  //   V  double matrix of vertex positions  #V by 3\n  //   T  #T list of tet indices into vertex positions\n  //   F  #F list of face indices into vertex positions\n  //   wait  whether to wait for medit process to finish before returning\n  // Returns returned value of system call (probably not useful if wait=false\n  // because of the fork)\n  template <typename DerivedV, typename DerivedT, typename DerivedF>\n  IGL_INLINE int launch_medit(\n    const Eigen::PlainObjectBase<DerivedV> & V, \n    const Eigen::PlainObjectBase<DerivedT> & T,\n    const Eigen::PlainObjectBase<DerivedF> & F,\n    const bool wait);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"launch_medit.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/lbs_matrix.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"lbs_matrix.h\"\n\nIGL_INLINE void igl::lbs_matrix(\n  const Eigen::MatrixXd & V, \n  const Eigen::MatrixXd & W,\n  Eigen::MatrixXd & M)\n{\n  using namespace Eigen;\n  // Number of dimensions\n  const int dim = V.cols();\n  // Number of model points\n  const int n = V.rows();\n  // Number of skinning transformations/weights\n  const int m = W.cols();\n\n  // Assumes that first n rows of weights correspond to V\n  assert(W.rows() >= n);\n\n  M.resize(n,(dim+1)*m);\n  for(int j = 0;j<m;j++)\n  {\n    VectorXd Wj = W.block(0,j,V.rows(),1);\n    for(int i = 0;i<(dim+1);i++)\n    {\n      if(i<dim)\n      {\n        M.col(i + j*(dim+1)) = \n          Wj.cwiseProduct(V.col(i));\n      }else\n      {\n        M.col(i + j*(dim+1)).array() = W.block(0,j,V.rows(),1).array();\n      }\n    }\n  }\n}\n\nIGL_INLINE void igl::lbs_matrix_column(\n  const Eigen::MatrixXd & V, \n  const Eigen::MatrixXd & W,\n  Eigen::SparseMatrix<double>& M)\n{\n  // number of mesh vertices\n  int n = V.rows();\n  assert(n == W.rows());\n  // dimension of mesh\n  int dim = V.cols();\n  // number of handles\n  int m = W.cols();\n\n  M.resize(n*dim,m*dim*(dim+1));\n\n  // loop over coordinates of mesh vertices\n  for(int x = 0; x < dim; x++)\n  {\n    // loop over mesh vertices\n    for(int j = 0; j < n; j++)\n    {\n      // loop over handles\n      for(int i = 0; i < m; i++)\n      {\n        // loop over cols of affine transformations\n        for(int c = 0; c < (dim+1); c++)\n        {\n          double value = W(j,i);\n          if(c<dim)\n          {\n            value *= V(j,c);\n          }\n          M.insert(x*n + j,x*m + c*m*dim + i) = value;\n        }\n      }\n    }\n  }\n\n  M.makeCompressed();\n}\n\nIGL_INLINE void igl::lbs_matrix_column(\n  const Eigen::MatrixXd & V, \n  const Eigen::MatrixXd & W,\n  Eigen::MatrixXd & M)\n{\n  // number of mesh vertices\n  int n = V.rows();\n  assert(n == W.rows());\n  // dimension of mesh\n  int dim = V.cols();\n  // number of handles\n  int m = W.cols();\n  M.resize(n*dim,m*dim*(dim+1));\n\n  // loop over coordinates of mesh vertices\n  for(int x = 0; x < dim; x++)\n  {\n    // loop over mesh vertices\n    for(int j = 0; j < n; j++)\n    {\n      // loop over handles\n      for(int i = 0; i < m; i++)\n      {\n        // loop over cols of affine transformations\n        for(int c = 0; c < (dim+1); c++)\n        {\n          double value = W(j,i);\n          if(c<dim)\n          {\n            value *= V(j,c);\n          }\n          M(x*n + j,x*m + c*m*dim + i) = value;\n        }\n      }\n    }\n  }\n}\n\nIGL_INLINE void igl::lbs_matrix_column(\n  const Eigen::MatrixXd & V, \n  const Eigen::MatrixXd & W,\n  const Eigen::MatrixXi & WI,\n  Eigen::SparseMatrix<double>& M)\n{\n  // number of mesh vertices\n  int n = V.rows();\n  assert(n == W.rows());\n  assert(n == WI.rows());\n  // dimension of mesh\n  int dim = V.cols();\n  // number of handles\n  int m = WI.maxCoeff()+1;\n  // max number of influencing handles\n  int k = W.cols();\n  assert(k == WI.cols());\n\n  M.resize(n*dim,m*dim*(dim+1));\n\n  // loop over coordinates of mesh vertices\n  for(int x = 0; x < dim; x++)\n  {\n    // loop over mesh vertices\n    for(int j = 0; j < n; j++)\n    {\n      // loop over handles\n      for(int i = 0; i < k; i++)\n      {\n        // loop over cols of affine transformations\n        for(int c = 0; c < (dim+1); c++)\n        {\n          double value = W(j,i);\n          if(c<dim)\n          {\n            value *= V(j,c);\n          }\n          if(value != 0)\n          {\n            M.insert(x*n + j,x*m + c*m*dim + WI(j,i)) = value;\n          }\n        }\n      }\n    }\n  }\n\n  M.makeCompressed();\n}\n\n\nIGL_INLINE void igl::lbs_matrix_column(\n  const Eigen::MatrixXd & V, \n  const Eigen::MatrixXd & W,\n  const Eigen::MatrixXi & WI,\n  Eigen::MatrixXd & M)\n{\n  // Cheapskate wrapper\n  using namespace Eigen;\n  SparseMatrix<double> sM;\n  lbs_matrix_column(V,W,WI,sM);\n  M = MatrixXd(sM);\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/lbs_matrix.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_LBS_MATRIX_H\n#define IGL_LBS_MATRIX_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Dense>\n#include <Eigen/Sparse>\n\nnamespace igl\n{\n  // LBS_MATRIX Linear blend skinning can be expressed by V' = M * T where V' is\n  // a #V by dim matrix of deformed vertex positions (one vertex per row), M is a\n  // #V by (dim+1)*#T (composed of weights and rest positions) and T is a\n  // #T*(dim+1) by dim matrix of #T stacked transposed transformation matrices.\n  // See equations (1) and (2) in \"Fast Automatic Skinning Transformations\"\n  // [Jacobson et al 2012]\n  //\n  // Inputs:\n  //   V  #V by dim list of rest positions\n  //   W  #V+ by #T  list of weights\n  // Outputs:\n  //   M  #V by #T*(dim+1)\n  //\n  // In MATLAB:\n  //   kron(ones(1,size(W,2)),[V ones(size(V,1),1)]).*kron(W,ones(1,size(V,2)+1))\n  IGL_INLINE void lbs_matrix(\n    const Eigen::MatrixXd & V, \n    const Eigen::MatrixXd & W,\n    Eigen::MatrixXd & M);\n  // LBS_MATRIX  construct a matrix that when multiplied against a column of\n  // affine transformation entries computes new coordinates of the vertices\n  //\n  // I'm not sure it makes since that the result is stored as a sparse matrix.\n  // The number of non-zeros per row *is* dependent on the number of mesh\n  // vertices and handles.\n  //\n  // Inputs:\n  //   V  #V by dim list of vertex rest positions\n  //   W  #V by #handles list of correspondence weights\n  // Output:\n  //   M  #V * dim by #handles * dim * (dim+1) matrix such that\n  //     new_V(:) = LBS(V,W,A) = reshape(M * A,size(V)), where A is a column\n  //     vectors formed by the entries in each handle's dim by dim+1 \n  //     transformation matrix. Specifcally, A =\n  //       reshape(permute(Astack,[3 1 2]),n*dim*(dim+1),1)\n  //     or A = [Lxx;Lyx;Lxy;Lyy;tx;ty], and likewise for other dim\n  //     if Astack(:,:,i) is the dim by (dim+1) transformation at handle i\n  IGL_INLINE void lbs_matrix_column(\n    const Eigen::MatrixXd & V, \n    const Eigen::MatrixXd & W,\n    Eigen::SparseMatrix<double>& M);\n  IGL_INLINE void lbs_matrix_column(\n    const Eigen::MatrixXd & V, \n    const Eigen::MatrixXd & W,\n    Eigen::MatrixXd & M);\n  // Same as LBS_MATRIX above but instead of giving W as a full matrix of weights\n  // (each vertex has #handles weights), a constant number of weights are given\n  // for each vertex.\n  // \n  // Inputs:\n  //   V  #V by dim list of vertex rest positions\n  //   W  #V by k  list of k correspondence weights per vertex\n  //   WI  #V by k  list of k correspondence weight indices per vertex. Such that\n  //     W(j,WI(i)) gives the ith most significant correspondence weight on vertex j\n  // Output:\n  //   M  #V * dim by #handles * dim * (dim+1) matrix such that\n  //     new_V(:) = LBS(V,W,A) = reshape(M * A,size(V)), where A is a column\n  //     vectors formed by the entries in each handle's dim by dim+1 \n  //     transformation matrix. Specifcally, A =\n  //       reshape(permute(Astack,[3 1 2]),n*dim*(dim+1),1)\n  //     or A = [Lxx;Lyx;Lxy;Lyy;tx;ty], and likewise for other dim\n  //     if Astack(:,:,i) is the dim by (dim+1) transformation at handle i\n  //\n  IGL_INLINE void lbs_matrix_column(\n    const Eigen::MatrixXd & V, \n    const Eigen::MatrixXd & W,\n    const Eigen::MatrixXi & WI,\n    Eigen::SparseMatrix<double>& M);\n  IGL_INLINE void lbs_matrix_column(\n    const Eigen::MatrixXd & V, \n    const Eigen::MatrixXd & W,\n    const Eigen::MatrixXi & WI,\n    Eigen::MatrixXd & M);\n}\n#ifndef IGL_STATIC_LIBRARY\n#include \"lbs_matrix.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/lens_flare.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"lens_flare.h\"\n\n#ifndef IGL_NO_OPENGL\n#include \"C_STR.h\"\n#include \"unproject.h\"\n#include \"project.h\"\n#include \"shine_textures.h\"\n#include \"flare_textures.h\"\n\n#include <iostream>\n\n// http://www.opengl.org/archives/resources/features/KilgardTechniques/LensFlare/glflare.c\n\nIGL_INLINE void igl::lens_flare_load_textures(\n  std::vector<GLuint> & shine_id,\n  std::vector<GLuint> & flare_id)\n{\n\n  const auto setup_texture =[](\n    const uint8_t * texture, \n    const int width,\n    const int height,\n    GLuint texobj,\n    GLenum minFilter, GLenum maxFilter)\n  {\n    glBindTexture(GL_TEXTURE_2D, texobj);\n    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);\n    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minFilter);\n    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, maxFilter);\n    glTexImage2D(GL_TEXTURE_2D, 0, 1, width, height, 0,\n      GL_LUMINANCE, GL_UNSIGNED_BYTE, texture);\n  };\n\n  glPixelStorei(GL_UNPACK_ALIGNMENT, 1);\n  shine_id.resize(10);\n  glGenTextures(10,&shine_id[0]);\n  for (int i = 0; i < (int)shine_id.size(); i++) {\n    setup_texture(\n      SHINE_TEXTURES[i],\n      SHINE_TEXTURE_WIDTHS[i],\n      SHINE_TEXTURE_HEIGHTS[i],\n      shine_id[i], GL_LINEAR, GL_LINEAR);\n  }\n  flare_id.resize(6);\n  glGenTextures(6,&flare_id[0]);\n  for (int i = 0; i < (int)flare_id.size(); i++) {\n    setup_texture(\n      FLARE_TEXTURES[i],\n      FLARE_TEXTURE_WIDTHS[i],\n      FLARE_TEXTURE_HEIGHTS[i],\n      flare_id[i], GL_LINEAR, GL_LINEAR);\n  }\n}\n\nIGL_INLINE void igl::lens_flare_create(\n  const float * A,\n  const float * B,\n  const float * C,\n  std::vector<igl::Flare> & flares)\n{\n  using namespace std;\n  flares.resize(12);\n  /* Shines */\n  flares[0] = Flare(-1, 1.0f, 0.1f, C, 1.0);\n  flares[1] = Flare(-1, 1.0f, 0.15f, B, 1.0);\n  flares[2] = Flare(-1, 1.0f, 0.35f, A, 1.0);\n\n  /* Flares */\n  flares[3] =  Flare(2, 1.3f, 0.04f, A, 0.6);\n  flares[4] =  Flare(3, 1.0f, 0.1f, A, 0.4);\n  flares[5] =  Flare(1, 0.5f, 0.2f, A, 0.3);\n  flares[6] =  Flare(3, 0.2f, 0.05f, A, 0.3);\n  flares[7] =  Flare(0, 0.0f, 0.04f, A, 0.3);\n  flares[8] =  Flare(5, -0.25f, 0.07f, A, 0.5);\n  flares[9] =  Flare(5, -0.4f, 0.02f, A, 0.6);\n  flares[10] = Flare(5, -0.6f, 0.04f, A, 0.4);\n  flares[11] = Flare(5, -1.0f, 0.03f, A, 0.2);\n}\n\nIGL_INLINE void igl::lens_flare_draw(\n  const std::vector<igl::Flare> & flares,\n  const std::vector<GLuint> & shine_ids,\n  const std::vector<GLuint> & flare_ids,\n  const Eigen::Vector3f & light,\n  const float near_clip,\n  int & shine_tic)\n{\n  bool ot2 = glIsEnabled(GL_TEXTURE_2D);\n  bool ob = glIsEnabled(GL_BLEND);\n  bool odt = glIsEnabled(GL_DEPTH_TEST);\n  bool ocm = glIsEnabled(GL_COLOR_MATERIAL);\n  bool ol = glIsEnabled(GL_LIGHTING);\n  int obsa,obda,odf,odwm;\n  glGetIntegerv(GL_BLEND_SRC_ALPHA,&obsa);\n  glGetIntegerv(GL_BLEND_DST_ALPHA,&obda);\n  glGetIntegerv(GL_DEPTH_FUNC,&odf);\n  glGetIntegerv(GL_DEPTH_WRITEMASK,&odwm);\n\n  glDisable(GL_COLOR_MATERIAL);\n  glEnable(GL_DEPTH_TEST);\n  //glDepthFunc(GL_LEQUAL);\n  glDepthMask(GL_FALSE);\n  glEnable(GL_TEXTURE_2D);\n  glDisable(GL_LIGHTING);\n  glEnable(GL_BLEND);\n  glBlendFunc(GL_ONE, GL_ONE);\n\n  using namespace Eigen;\n  using namespace igl;\n  using namespace std;\n\n  //// view_dir  direction from eye to position is is looking at\n  //const Vector3f view_dir =  (at - from).normalized();\n\n  //// near_clip  distance from eye to near clipping plane along view_dir\n  //// center   position on near clipping plane along viewdir from eye\n  //const Vector3f center =  from + near_clip*view_dir;\n\n  Vector3f plight = project(light);\n  // Orthogonal vectors to view direction at light\n  Vector3f psx = plight;\n  psx(0) += 1;\n  Vector3f psy = plight;\n  psy(1) += 1;\n\n  // axis toward center\n  int vp[4];\n  glGetIntegerv(GL_VIEWPORT,vp);\n  Vector3f center = unproject(Vector3f(0.5*vp[2],0.5*vp[3],plight[2]-1e-3));\n  //Vector3f center(0,0,1);\n  Vector3f axis = light-center;\n  //glLineWidth(4.);\n  //glColor3f(1,0,0);\n  //glBegin(GL_LINES);\n  //glVertex3fv(center.data());\n  //glVertex3fv(light.data());\n  //glEnd();\n\n  const Vector3f SX = unproject(psx).normalized();\n  const Vector3f SY = unproject(psy).normalized();\n\n  for(int i = 0; i < (int)flares.size(); i++)\n  {\n    const Vector3f sx = flares[i].scale * SX;\n    const Vector3f sy = flares[i].scale * SY;\n    glColor3fv(flares[i].color);\n    if (flares[i].type < 0) {\n      glBindTexture(GL_TEXTURE_2D, shine_ids[shine_tic]);\n      shine_tic = (shine_tic + 1) % shine_ids.size();\n    } else \n    {\n      glBindTexture(GL_TEXTURE_2D, flare_ids[flares[i].type]);\n    }\n\n    /* position = center + flare[i].loc * axis */\n    const Vector3f position = center + flares[i].loc * axis;\n    Vector3f tmp;\n\n    glBegin(GL_QUADS);\n    glTexCoord2f(0.0, 0.0);\n    tmp =  position +  sx;\n    tmp =  tmp +  sy;\n    glVertex3fv(tmp.data());\n\n    glTexCoord2f(1.0, 0.0);\n    tmp =  position -  sx;\n    tmp =  tmp +  sy;\n    glVertex3fv(tmp.data());\n\n    glTexCoord2f(1.0, 1.0);\n    tmp =  position -  sx;\n    tmp =  tmp -  sy;\n    glVertex3fv(tmp.data());\n\n    glTexCoord2f(0.0, 1.0);\n    tmp =  position +  sx;\n    tmp =  tmp -  sy;\n    glVertex3fv(tmp.data());\n    glEnd();\n  }\n  ot2?glEnable(GL_TEXTURE_2D):glDisable(GL_TEXTURE_2D);\n  ob?glEnable(GL_BLEND):glDisable(GL_BLEND);\n  odt?glEnable(GL_DEPTH_TEST):glDisable(GL_DEPTH_TEST);\n  ocm?glEnable(GL_COLOR_MATERIAL):glDisable(GL_COLOR_MATERIAL);\n  ol?glEnable(GL_LIGHTING):glDisable(GL_LIGHTING);\n  glBlendFunc(obsa,obda);\n  glDepthFunc(odf);\n  glDepthMask(odwm);\n}\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/lens_flare.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_LENS_FLARE_H\n#define IGL_LENS_FLARE_H\n\n#ifndef IGL_NO_OPENGL\n#include <igl/OpenGL_convenience.h>\n#include <Eigen/Core>\n#include \"igl_inline.h\"\n\n#include <vector>\n\nnamespace igl\n{\n  struct Flare{\n    int type;             /* flare texture index, 0..5 */\n    float scale;\n    float loc;            /* postion on axis */\n    float color[3];\n    Flare():\n      type(-1),\n      scale(0),\n      loc(0)\n    {}\n    Flare(int type, float location, float scale, const float color[3], float colorScale) :\n      type(type),\n      scale(scale),\n      loc(location)\n    {\n      this->color[0] = color[0] * colorScale;\n      this->color[1] = color[1] * colorScale;\n      this->color[2] = color[2] * colorScale;\n    }\n  };\n  \n  \n  // Initialize shared data for lens flates\n  //\n  // Inputs:\n  //   start_id   starting texture id location (should have at least id:id+16 free)\n  // Outputs:\n  //   shine  list of texture ids for shines\n  //   flare  list of texture ids for flares\n  IGL_INLINE void lens_flare_load_textures(\n    std::vector<GLuint> & shine_ids,\n    std::vector<GLuint> & flare_ids);\n  \n  // Create a set of lens flares\n  //\n  // Inputs:\n  //   A  primary color\n  //   B  secondary color\n  //   C  secondary color\n  // Outputs:\n  //   flares  list of flare objects\n  IGL_INLINE void lens_flare_create(\n    const float * A,\n    const float * B,\n    const float * C,\n    std::vector<Flare> & flares);\n  \n  // Draw lens flares\n  //\n  // Inputs:\n  //   flares  list of Flare objects\n  //   shine_ids  list of shine textures\n  //   flare_ids  list of flare texture ids\n  //   light  position of light\n  //   near_clip  near clipping plane\n  //   shine_tic  current \"tic\" in shine textures\n  // Outputs:\n  //   shine_tic  current \"tic\" in shine textures\n  IGL_INLINE void lens_flare_draw(\n    const std::vector<Flare> & flares,\n    const std::vector<GLuint> & shine_ids,\n    const std::vector<GLuint> & flare_ids,\n    const Eigen::Vector3f & light,\n    const float near_clip,\n    int & shine_tic);\n};\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"lens_flare.cpp\"\n#endif\n\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/lexicographic_triangulation.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n//                    Qingan Zhou <qnzhou@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"lexicographic_triangulation.h\"\n#include \"sortrows.h\"\n\n#include <vector>\n#include <list>\n\ntemplate<\n  typename DerivedP,\n  typename Orient2D,\n  typename DerivedF\n  >\nIGL_INLINE void igl::lexicographic_triangulation(\n    const Eigen::PlainObjectBase<DerivedP>& P,\n    Orient2D orient2D,\n    Eigen::PlainObjectBase<DerivedF>& F)\n{\n  typedef typename DerivedP::Scalar Scalar;\n  const size_t num_pts = P.rows();\n  if (num_pts < 3) {\n    throw \"At least 3 points are required for triangulation!\";\n  }\n\n  // Sort points in lexicographic order.\n  DerivedP ordered_P;\n  Eigen::VectorXi order;\n  igl::sortrows(P, true, ordered_P, order);\n\n  std::vector<Eigen::Vector3i> faces;\n  std::list<int> boundary;\n  const Scalar p0[] = {ordered_P(0, 0), ordered_P(0, 1)};\n  const Scalar p1[] = {ordered_P(1, 0), ordered_P(1, 1)};\n  for (size_t i=2; i<num_pts; i++) {\n    const Scalar curr_p[] = {ordered_P(i, 0), ordered_P(i, 1)};\n    if (faces.size() == 0) {\n      // All points processed so far are collinear.\n      // Check if the current point is collinear with every points before it.\n      auto orientation = orient2D(p0, p1, curr_p);\n      if (orientation != 0) {\n        // Add a fan of triangles eminating from curr_p.\n        if (orientation > 0) {\n          for (size_t j=0; j<=i-2; j++) {\n            faces.push_back({order[j], order[j+1], order[i]});\n          }\n        } else if (orientation < 0) {\n          for (size_t j=0; j<=i-2; j++) {\n            faces.push_back({order[j+1], order[j], order[i]});\n          }\n        }\n        // Initialize current boundary.\n        boundary.insert(boundary.end(), order.data(), order.data()+i+1);\n        if (orientation < 0) {\n          boundary.reverse();\n        }\n      }\n    } else {\n      const size_t bd_size = boundary.size();\n      assert(bd_size >= 3);\n      std::vector<short> orientations;\n      for (auto itr=boundary.begin(); itr!=boundary.end(); itr++) {\n        auto next_itr = std::next(itr, 1);\n        if (next_itr == boundary.end()) {\n          next_itr = boundary.begin();\n        }\n        const Scalar bd_p0[] = {P(*itr, 0), P(*itr, 1)};\n        const Scalar bd_p1[] = {P(*next_itr, 0), P(*next_itr, 1)};\n        auto orientation = orient2D(bd_p0, bd_p1, curr_p);\n        if (orientation < 0) {\n          faces.push_back({*next_itr, *itr, order[i]});\n        }\n        orientations.push_back(orientation);\n      }\n\n      auto left_itr = boundary.begin();\n      auto right_itr = boundary.begin();\n      auto curr_itr = boundary.begin();\n      for (size_t j=0; j<bd_size; j++, curr_itr++) {\n        size_t prev = (j+bd_size-1) % bd_size;\n        if (orientations[j] >= 0 && orientations[prev] < 0) {\n          right_itr = curr_itr;\n        } else if (orientations[j] < 0 && orientations[prev] >= 0) {\n          left_itr = curr_itr;\n        }\n      }\n      assert(left_itr != right_itr);\n\n      for (auto itr=left_itr; itr!=right_itr; itr++) {\n        if (itr == boundary.end()) itr = boundary.begin();\n        if (itr == right_itr) break;\n        if (itr == left_itr || itr == right_itr) continue;\n        itr = boundary.erase(itr);\n        if (itr == boundary.begin()) {\n            itr = boundary.end();\n        } else {\n            itr--;\n        }\n      }\n\n      if (right_itr == boundary.begin()) {\n        assert(std::next(left_itr, 1) == boundary.end());\n        boundary.insert(boundary.end(), order[i]);\n      } else {\n        assert(std::next(left_itr, 1) == right_itr);\n        boundary.insert(right_itr, order[i]);\n      }\n    }\n  }\n\n  const size_t num_faces = faces.size();\n  if (num_faces == 0) {\n      // All input points are collinear.\n      // Do nothing here.\n  } else {\n      F.resize(num_faces, 3);\n      for (size_t i=0; i<num_faces; i++) {\n          F.row(i) = faces[i];\n      }\n  }\n}\n\n"
  },
  {
    "path": "libs/libigl/include/igl/lexicographic_triangulation.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n//                    Qingan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_LEXICOGRAPHIC_TRIANGULATION_H\n#define IGL_LEXICOGRAPHIC_TRIANGULATION_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n\nnamespace igl\n{\n  // Given a set of points in 2D, return a lexicographic triangulation of these\n  // points.\n  //\n  // Inputs:\n  //   P  #P by 2 list of vertex positions\n  //   orient2D  A functor such that orient2D(pa, pb, pc) returns\n  //               1 if pa,pb,pc forms a conterclockwise triangle.\n  //              -1 if pa,pb,pc forms a clockwise triangle.\n  //               0 if pa,pb,pc are collinear.\n  //              where the argument pa,pb,pc are of type Scalar[2].\n  //\n  // Outputs:\n  //   F  #F by 3 of faces in lexicographic triangulation.\n  template<\n    typename DerivedP,\n    typename Orient2D,\n    typename DerivedF\n    >\n  IGL_INLINE void lexicographic_triangulation(\n      const Eigen::PlainObjectBase<DerivedP>& P,\n      Orient2D orient2D,\n      Eigen::PlainObjectBase<DerivedF>& F);\n}\n\n\n\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"lexicographic_triangulation.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/lim/lim.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Christian Schüller <schuellchr@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"lim.h\"\n#include <LIMSolverInterface.h>\n\n\nIGL_INLINE igl::lim::State igl::lim::lim(\n  Eigen::Matrix<double,Eigen::Dynamic,3>& vertices,\n  const Eigen::Matrix<double,Eigen::Dynamic,3>& initialVertices,\n  const Eigen::Matrix<int,Eigen::Dynamic,Eigen::Dynamic>& elements,\n  const Eigen::SparseMatrix<double>& constraintMatrix,\n  const Eigen::Matrix<double,Eigen::Dynamic,1>& constraintTargets,\n  Energy energyType,\n  double tolerance,\n  int maxIteration,\n  bool findLocalMinima)\n{\n  return (State)ComputeLIM(\n    vertices,\n    initialVertices,\n    elements,\n    constraintMatrix,\n    constraintTargets,\n    (EnergyType)energyType,\n    tolerance,\n    maxIteration,\n    findLocalMinima\n    );\n}\n\nIGL_INLINE igl::lim::State igl::lim::lim(\n  Eigen::Matrix<double,Eigen::Dynamic,3>& vertices,\n  const Eigen::Matrix<double,Eigen::Dynamic,3>& initialVertices,\n  const Eigen::Matrix<int,Eigen::Dynamic,Eigen::Dynamic>& elements,\n  const Eigen::SparseMatrix<double>& constraintMatrix,\n  const Eigen::Matrix<double,Eigen::Dynamic,1>& constraintTargets,\n  Energy energyType,\n  double tolerance,\n  int maxIteration,\n  bool findLocalMinima,\n  bool enableOuput,\n  bool enableBarriers,\n  bool enableAlphaUpdate,\n  double beta,\n  double eps)\n{\n  return (State)ComputeLIM(\n    vertices,\n    initialVertices,\n    elements,\n    constraintMatrix,\n    constraintTargets,\n    (EnergyType)energyType,\n    tolerance,\n    maxIteration,\n    findLocalMinima,\n    enableOuput,\n    enableBarriers,\n    enableAlphaUpdate,\n    beta,\n    eps\n    );\n}\n\nIGL_INLINE igl::lim::State igl::lim::lim(\n  Eigen::Matrix<double,Eigen::Dynamic,3>& vertices,\n  const Eigen::Matrix<double,Eigen::Dynamic,3>& initialVertices,\n  const Eigen::Matrix<int,Eigen::Dynamic,Eigen::Dynamic>& elements,\n  const std::vector<int>& borderVertices,\n  const Eigen::Matrix<double,Eigen::Dynamic,1>& gradients,\n  const Eigen::SparseMatrix<double>& constraintMatrix,\n  const Eigen::Matrix<double,Eigen::Dynamic,1>& constraintTargets,\n  Energy energyType,\n  double tolerance,\n  int maxIteration,\n  bool findLocalMinima)\n{\n  return (State)ComputeLIM(\n    vertices,\n    initialVertices,\n    elements,\n    borderVertices,\n    gradients,\n    constraintMatrix,\n    constraintTargets,\n    (EnergyType)energyType,\n    tolerance,\n    maxIteration,\n    findLocalMinima\n    );\n}\n\nIGL_INLINE igl::lim::State igl::lim::lim(\n  Eigen::Matrix<double,Eigen::Dynamic,3>& vertices,\n  const Eigen::Matrix<double,Eigen::Dynamic,3>& initialVertices,\n  const Eigen::Matrix<int,Eigen::Dynamic,Eigen::Dynamic>& elements,\n  const std::vector<int>& borderVertices,\n  const Eigen::Matrix<double,Eigen::Dynamic,1>& gradients,\n  const Eigen::SparseMatrix<double>& constraintMatrix,\n  const Eigen::Matrix<double,Eigen::Dynamic,1>& constraintTargets,\n  Energy energyType,\n  double tolerance,\n  int maxIteration,\n  bool findLocalMinima,\n  bool enableOuput,\n  bool enableBarriers,\n  bool enableAlphaUpdate,\n  double beta,\n  double eps)\n{\n  return (State)ComputeLIM(\n    vertices,\n    initialVertices,\n    elements,\n    borderVertices,\n    gradients,\n    constraintMatrix,\n    constraintTargets,\n    (EnergyType)energyType,\n    tolerance,\n    maxIteration,\n    findLocalMinima,\n    enableOuput,\n    enableBarriers,\n    enableAlphaUpdate,\n    beta,\n    eps);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/lim/lim.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Christian Schüller <schuellchr@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_LIM_LIM_H\n#define IGL_LIM_LIM_H\n#include <igl/igl_inline.h>\n#include <Eigen/Core>\n#include <Eigen/Sparse>\n\nnamespace igl\n{\n  namespace lim\n  {\n    // Computes a locally injective mapping of a triangle or tet-mesh based on\n    // a deformation energy subject to some provided linear positional\n    // constraints Cv-d.\n    //\n    // Inputs:\n    //   vertices          vx3 matrix containing vertex position of the mesh\n    //   initialVertices   vx3 matrix containing vertex position of initial\n    //                     rest pose mesh\n    //   elements          exd matrix containing vertex indices of all elements\n    //   borderVertices    (only needed for 2D LSCM) vector containing indices\n    //                     of border vertices\n    //   gradients         (only needed for 2D Poisson) vector containing\n    //                     partial derivatives of target element gradients\n    //                     (structure is: [xx_0, xy_0, xx_1, xy_1, ..., xx_v,\n    //                     xy_v, yx_0, yy_0, yx_1, yy_1, ..., yx_v, yy_v]')\n    //   constraintMatrix  C: (c)x(v*(d-1)) sparse linear positional constraint\n    //                     matrix. X an Y-coordinates are alternatingly stacked\n    //                     per row (structure for triangles: [x_1, y_1, x_2,\n    //                     y_2, ..., x_v,y_v])\n    //   constraintTargets d: c vector target positions\n    //   energyType        type of used energy:\n    //                     Dirichlet, Laplacian, Green, ARAP, LSCM, Poisson (only 2D), UniformLaplacian, Identity\n    //   tolerance         max squared positional constraints error\n    //   maxIteration      max number of iterations\n    //   findLocalMinima   iterating until a local minima is found. If not\n    //                     enabled only tolerance must be fulfilled.\n    //   enableOutput      (optional) enables the output (#iteration / hessian correction / step size / positional constraints / barrier constraints / deformation energy) (default : true)\n    //   enableBarriers    (optional) enables the non-flip constraints (default = true)\n    //   enableAlphaUpdate (optional) enables dynamic alpha weight adjustment (default = true)\n    //   beta              (optional) steepness factor of barrier slopes (default: ARAP/LSCM = 0.01, Green = 1)\n    //   eps               (optional) smallest valid triangle area (default: 1e-5 * smallest triangle)\n    //\n    // where:\n    //   v : # vertices\n    //   c : # linear constraints\n    //   e : # elements of mesh\n    //   d : # vertices per element (triangle = 3, tet = 4)\n    //--------------------------------------------------------------------------\n    // Output:\n    // vertices          vx3 matrix containing resulting vertex position of the\n    //                   mesh\n    //--------------------------------------------------------------------------\n    // Return values:\n    //  Succeeded : Successful optimization with fulfilled tolerance\n    //  LocalMinima : Convergenged to a local minima / tolerance not fullfilled\n    //  IterationLimit : Max iteration reached before tolerance was fulfilled\n    //  Infeasible : not feasible -> has inverted elements (decrease eps?)\n  \n    enum Energy { Dirichlet = 0, Laplacian=1, Green=2, ARAP=3, LSCM=4, Poisson=5, UniformLaplacian=6, Identity=7 };\n    enum State { Uninitialized = -4, Infeasible = -3, IterationLimit = -2, LocalMinima = -1, Running = 0, Succeeded = 1 };\n\n    State lim(\n      Eigen::Matrix<double,Eigen::Dynamic,3>& vertices,\n      const Eigen::Matrix<double,Eigen::Dynamic,3>& initialVertices,\n      const Eigen::Matrix<int,Eigen::Dynamic,Eigen::Dynamic>& elements,\n      const Eigen::SparseMatrix<double>& constraintMatrix,\n      const Eigen::Matrix<double,Eigen::Dynamic,1>& constraintTargets,\n      Energy energyType,\n      double tolerance,\n      int maxIteration,\n      bool findLocalMinima);\n  \n    State lim(\n      Eigen::Matrix<double,Eigen::Dynamic,3>& vertices,\n      const Eigen::Matrix<double,Eigen::Dynamic,3>& initialVertices,\n      const Eigen::Matrix<int,Eigen::Dynamic,Eigen::Dynamic>& elements,\n      const Eigen::SparseMatrix<double>& constraintMatrix,\n      const Eigen::Matrix<double,Eigen::Dynamic,1>& constraintTargets,\n      Energy energyType,\n      double tolerance,\n      int maxIteration,\n      bool findLocalMinima,\n      bool enableOuput,\n      bool enableBarriers,\n      bool enableAlphaUpdate,\n      double beta,\n      double eps);\n  \n    State lim(\n      Eigen::Matrix<double,Eigen::Dynamic,3>& vertices,\n      const Eigen::Matrix<double,Eigen::Dynamic,3>& initialVertices,\n      const Eigen::Matrix<int,Eigen::Dynamic,Eigen::Dynamic>& elements,\n      const std::vector<int>& borderVertices,\n      const Eigen::Matrix<double,Eigen::Dynamic,1>& gradients,\n      const Eigen::SparseMatrix<double>& constraintMatrix,\n      const Eigen::Matrix<double,Eigen::Dynamic,1>& constraintTargets,\n      Energy energyType,\n      double tolerance,\n      int maxIteration,\n      bool findLocalMinima);\n  \n    State lim(\n      Eigen::Matrix<double,Eigen::Dynamic,3>& vertices,\n      const Eigen::Matrix<double,Eigen::Dynamic,3>& initialVertices,\n      const Eigen::Matrix<int,Eigen::Dynamic,Eigen::Dynamic>& elements,\n      const std::vector<int>& borderVertices,\n      const Eigen::Matrix<double,Eigen::Dynamic,1>& gradients,\n      const Eigen::SparseMatrix<double>& constraintMatrix,\n      const Eigen::Matrix<double,Eigen::Dynamic,1>& constraintTargets,\n      Energy energyType,\n      double tolerance,\n      int maxIteration,\n      bool findLocalMinima,\n      bool enableOuput,\n      bool enableBarriers,\n      bool enableAlphaUpdate,\n      double beta,\n      double eps);\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"lim.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/limit_faces.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"limit_faces.h\"\n\n#include <vector>\n#include <Eigen/Dense>\n\ntemplate <typename MatF, typename VecL>\nIGL_INLINE void igl::limit_faces(\n  const MatF & F, \n  const VecL & L, \n  const bool exclusive,\n  MatF & LF)\n{\n  using namespace std;\n  using namespace Eigen;\n  vector<bool> in(F.rows(),false);\n  int num_in = 0;\n  // loop over faces\n  for(int i = 0;i<F.rows();i++)\n  {\n    bool all = true;\n    bool any = false;\n    for(int j = 0;j<F.cols();j++)\n    {\n      bool found = false;\n      // loop over L\n      for(int l = 0;l<L.size();l++)\n      {\n        if(F(i,j) == L(l))\n        {\n          found = true;\n          break;\n        }\n      }\n      any |= found;\n      all &= found;\n    }\n    in[i] = (exclusive?all:any);\n    num_in += (in[i]?1:0);\n  }\n\n  LF.resize(num_in,F.cols());\n  // loop over faces\n  int lfi = 0;\n  for(int i = 0;i<F.rows();i++)\n  {\n    if(in[i])\n    {\n      LF.row(lfi) = F.row(i);\n      lfi++;\n    }\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/limit_faces.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_LIMIT_FACES_H\n#define IGL_LIMIT_FACES_H\n#include \"igl_inline.h\"\nnamespace igl\n{\n  // LIMIT_FACES limit given faces F to those which contain (only) indices found\n  // in L.\n  //\n  // [LF] = limit_faces(F,L,exclusive);\n  // [LF,in] = limit_faces(F,L,exclusive);\n  //\n  // Templates:\n  //   MatF matrix type of faces, matrixXi\n  //   VecL  matrix type of vertex indices, VectorXi\n  // Inputs:\n  //   F  #F by 3 list of face indices\n  //   L  #L by 1 list of allowed indices\n  //   exclusive  flag specifying whether a face is included only if all its\n  //     indices are in L, default is false\n  // Outputs:\n  //   LF  #LF by 3 list of remaining faces after limiting\n  //   in  #F list of whether given face was included\n  //\n  template <typename MatF, typename VecL>\n  IGL_INLINE void limit_faces(\n    const MatF & F, \n    const VecL & L, \n    const bool exclusive,\n    MatF & LF);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"limit_faces.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/line_field_missmatch.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Nico Pietroni <nico.pietroni@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"line_field_missmatch.h\"\n\n#include <vector>\n#include <deque>\n#include <igl/comb_line_field.h>\n#include <igl/rotate_vectors.h>\n#include <igl/comb_cross_field.h>\n#include <igl/comb_line_field.h>\n#include <igl/per_face_normals.h>\n#include <igl/is_border_vertex.h>\n#include <igl/vertex_triangle_adjacency.h>\n#include <igl/triangle_triangle_adjacency.h>\n#include <igl/rotation_matrix_from_directions.h>\n#include <igl/local_basis.h>\n\nnamespace igl {\ntemplate <typename DerivedV, typename DerivedF, typename DerivedO>\nclass MissMatchCalculatorLine\n{\npublic:\n\n    const Eigen::PlainObjectBase<DerivedV> &V;\n    const Eigen::PlainObjectBase<DerivedF> &F;\n    const Eigen::PlainObjectBase<DerivedV> &PD1;\n    const Eigen::PlainObjectBase<DerivedV> &PD2;\n    DerivedV N;\n\nprivate:\n    // internal\n    std::vector<bool> V_border; // bool\n    std::vector<std::vector<int> > VF;\n    std::vector<std::vector<int> > VFi;\n    DerivedF TT;\n    DerivedF TTi;\n\n\nprivate:\n\n    //compute the mismatch between 2 faces\n    inline int MissMatchByLine(const int f0,\n                               const int f1)\n    {\n        Eigen::Matrix<typename DerivedV::Scalar, 3, 1> dir0 = PD1.row(f0);\n        Eigen::Matrix<typename DerivedV::Scalar, 3, 1> dir1 = PD1.row(f1);\n        Eigen::Matrix<typename DerivedV::Scalar, 3, 1> n0 = N.row(f0);\n        Eigen::Matrix<typename DerivedV::Scalar, 3, 1> n1 = N.row(f1);\n\n        Eigen::Matrix<typename DerivedV::Scalar, 3, 1> dir1Rot = igl::rotation_matrix_from_directions(n1,n0)*dir1;\n        dir1Rot.normalize();\n\n        // TODO: this should be equivalent to the other code below, to check!\n        // Compute the angle between the two vectors\n        //    double a0 = atan2(dir0.dot(B2.row(f0)),dir0.dot(B1.row(f0)));\n        //    double a1 = atan2(dir1Rot.dot(B2.row(f0)),dir1Rot.dot(B1.row(f0)));\n        //\n        //    double angle_diff = a1-a0;   //VectToAngle(f0,dir1Rot);\n\n        double angle_diff = atan2(dir1Rot.dot(PD2.row(f0)),dir1Rot.dot(PD1.row(f0)));\n\n        double step=M_PI;\n        int i=(int)std::floor((angle_diff/step)+0.5);\n        assert((i>=-2)&&(i<=2));\n        int k=0;\n        if (i>=0)\n            k=i%2;\n        else\n            k=(2+i)%2;\n\n        assert((k==0)||(k==1));\n        return (k*2);\n    }\n\npublic:\n\n    inline MissMatchCalculatorLine(const Eigen::PlainObjectBase<DerivedV> &_V,\n                               const Eigen::PlainObjectBase<DerivedF> &_F,\n                               const Eigen::PlainObjectBase<DerivedV> &_PD1,\n                               const Eigen::PlainObjectBase<DerivedV> &_PD2\n                               ):\n        V(_V),\n        F(_F),\n        PD1(_PD1),\n        PD2(_PD2)\n    {\n        igl::per_face_normals(V,F,N);\n        V_border = igl::is_border_vertex(V,F);\n        igl::vertex_triangle_adjacency(V,F,VF,VFi);\n        igl::triangle_triangle_adjacency(F,TT,TTi);\n    }\n\n    inline void calculateMissmatchLine(Eigen::PlainObjectBase<DerivedO> &Handle_MMatch)\n    {\n        Handle_MMatch.setConstant(F.rows(),3,-1);\n        for (unsigned int i=0;i<F.rows();i++)\n        {\n            for (int j=0;j<3;j++)\n            {\n                if (i==TT(i,j) || TT(i,j) == -1)\n                    Handle_MMatch(i,j)=0;\n                else\n                    Handle_MMatch(i,j) = MissMatchByLine(i,TT(i,j));\n            }\n        }\n    }\n\n};\n}\n\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedO>\nIGL_INLINE void igl::line_field_missmatch(const Eigen::PlainObjectBase<DerivedV> &V,\n                                const Eigen::PlainObjectBase<DerivedF> &F,\n                                const Eigen::PlainObjectBase<DerivedV> &PD1,\n                                const bool isCombed,\n                                Eigen::PlainObjectBase<DerivedO> &missmatch)\n{\n    DerivedV PD1_combed;\n    DerivedV PD2_combed;\n\n    if (!isCombed)\n        igl::comb_line_field(V,F,PD1,PD1_combed);\n    else\n    {\n        PD1_combed = PD1;\n    }\n    Eigen::MatrixXd B1,B2,B3;\n    igl::local_basis(V,F,B1,B2,B3);\n    PD2_combed = igl::rotate_vectors(PD1_combed, Eigen::VectorXd::Constant(1,M_PI/2), B1, B2);\n    igl::MissMatchCalculatorLine<DerivedV, DerivedF, DerivedO> sf(V, F, PD1_combed, PD2_combed);\n    sf.calculateMissmatchLine(missmatch);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/line_field_missmatch.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Nico Pietroni <nico.pietroni@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_LINE_FIELD_MISSMATCH_H\n#define IGL_LINE_FIELD_MISSMATCH_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Calculates the missmatch (integer), at each face edge, of a cross field defined on the mesh faces.\n  // The integer missmatch is a multiple of pi/2 that transforms the cross on one side of the edge to\n  // the cross on the other side. It represents the deviation from a Lie connection across the edge.\n\n  // Inputs:\n  //   V         #V by 3 eigen Matrix of mesh vertex 3D positions\n  //   F         #F by 3 eigen Matrix of face (quad) indices\n  //   PD1       #F by 3 eigen Matrix of the first per face cross field vector\n  //   PD2       #F by 3 eigen Matrix of the second per face cross field vector\n  //   isCombed  boolean, specifying whether the field is combed (i.e. matching has been precomputed.\n  //             If not, the field is combed first.\n  // Output:\n  //   Handle_MMatch    #F by 3 eigen Matrix containing the integer missmatch of the cross field\n  //                    across all face edges\n  //\n\n    template <typename DerivedV, typename DerivedF, typename DerivedO>\n    IGL_INLINE void line_field_missmatch(const Eigen::PlainObjectBase<DerivedV> &V,\n                                         const Eigen::PlainObjectBase<DerivedF> &F,\n                                         const Eigen::PlainObjectBase<DerivedV> &PD1,\n                                         const bool isCombed,\n                                         Eigen::PlainObjectBase<DerivedO> &missmatch);\n}\n#ifndef IGL_STATIC_LIBRARY\n#include \"line_field_missmatch.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/line_search.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2016 Michael Rabinovich\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"line_search.h\"\n\nIGL_INLINE double igl::line_search(\n  Eigen::MatrixXd& x,\n  const Eigen::MatrixXd& d,\n  double step_size,\n  std::function<double(Eigen::MatrixXd&)> energy,\n  double cur_energy)\n{\n  double old_energy;\n  if (cur_energy > 0)\n  {\n    old_energy = cur_energy;\n  }\n  else\n  {\n    old_energy = energy(x); // no energy was given -> need to compute the current energy\n  }\n  double new_energy = old_energy;\n  int cur_iter = 0; int MAX_STEP_SIZE_ITER = 12;\n\n  while (new_energy >= old_energy && cur_iter < MAX_STEP_SIZE_ITER)\n  {\n    Eigen::MatrixXd new_x = x + step_size * d;\n\n    double cur_e = energy(new_x);\n    if ( cur_e >= old_energy)\n    {\n      step_size /= 2;\n    }\n    else\n    {\n      x = new_x;\n      new_energy = cur_e;\n    }\n    cur_iter++;\n  }\n  return new_energy;\n}\n\n\n#ifdef IGL_STATIC_LIBRARY\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/line_search.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2016 Michael Rabinovich\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_LINE_SEARCH_H\n#define IGL_LINE_SEARCH_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Dense>\n\nnamespace igl\n{\n  // Implement a bisection linesearch to minimize a mesh-based energy on vertices given at 'x' at a search direction 'd',\n  // with initial step size. Stops when a point with lower energy is found, or after maximal iterations have been reached.\n  //\n  // Inputs:\n  //   x  \t\t\t\t\t\t#X by dim list of variables\n  //   d  \t\t\t\t\t\t#X by dim list of a given search direction\n  //   i_step_size  \t\t\tinitial step size\n  //   energy       \t\t\tA function to compute the mesh-based energy (return an energy that is bigger than 0)\n  //   cur_energy(OPTIONAL)     The energy at the given point. Helps save redundant computations.\n  //\t\t\t\t\t\t\tThis is optional. If not specified, the function will compute it.\n  // Outputs:\n  //\t\tx  \t\t\t\t\t\t#X by dim list of variables at the new location\n  // Returns the energy at the new point 'x'\n  IGL_INLINE double line_search(\n    Eigen::MatrixXd& x,\n    const Eigen::MatrixXd& d,\n    double i_step_size,\n    std::function<double(Eigen::MatrixXd&)> energy,\n    double cur_energy = -1);\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"line_search.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/line_segment_in_rectangle.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"line_segment_in_rectangle.h\"\n\nIGL_INLINE bool igl::line_segment_in_rectangle(\n  const Eigen::Vector2d & s,\n  const Eigen::Vector2d & d,\n  const Eigen::Vector2d & A,\n  const Eigen::Vector2d & B)\n{\n  using namespace std;\n  using namespace Eigen;\n  // http://stackoverflow.com/a/100165/148668\n  const auto SegmentIntersectRectangle = [](double a_rectangleMinX,\n                                 double a_rectangleMinY,\n                                 double a_rectangleMaxX,\n                                 double a_rectangleMaxY,\n                                 double a_p1x,\n                                 double a_p1y,\n                                 double a_p2x,\n                                 double a_p2y)->bool\n  {\n    // Find min and max X for the segment\n\n    double minX = a_p1x;\n    double maxX = a_p2x;\n\n    if(a_p1x > a_p2x)\n    {\n      minX = a_p2x;\n      maxX = a_p1x;\n    }\n\n    // Find the intersection of the segment's and rectangle's x-projections\n\n    if(maxX > a_rectangleMaxX)\n    {\n      maxX = a_rectangleMaxX;\n    }\n\n    if(minX < a_rectangleMinX)\n    {\n      minX = a_rectangleMinX;\n    }\n\n    if(minX > maxX) // If their projections do not intersect return false\n    {\n      return false;\n    }\n\n    // Find corresponding min and max Y for min and max X we found before\n\n    double minY = a_p1y;\n    double maxY = a_p2y;\n\n    double dx = a_p2x - a_p1x;\n\n    if(fabs(dx) > 0.0000001)\n    {\n      double a = (a_p2y - a_p1y) / dx;\n      double b = a_p1y - a * a_p1x;\n      minY = a * minX + b;\n      maxY = a * maxX + b;\n    }\n\n    if(minY > maxY)\n    {\n      double tmp = maxY;\n      maxY = minY;\n      minY = tmp;\n    }\n\n    // Find the intersection of the segment's and rectangle's y-projections\n\n    if(maxY > a_rectangleMaxY)\n    {\n      maxY = a_rectangleMaxY;\n    }\n\n    if(minY < a_rectangleMinY)\n    {\n      minY = a_rectangleMinY;\n    }\n\n    if(minY > maxY) // If Y-projections do not intersect return false\n    {\n      return false;\n    }\n\n    return true;\n  };\n  const double minX = min(A(0),B(0));\n  const double minY = min(A(1),B(1));\n  const double maxX = max(A(0),B(0));\n  const double maxY = max(A(1),B(1));\n  bool ret = SegmentIntersectRectangle(minX,minY,maxX,maxY,s(0),s(1),d(0),d(1));\n  return ret;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/line_segment_in_rectangle.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_LINE_SEGMENT_IN_RECTANGLE_H\n#define IGL_LINE_SEGMENT_IN_RECTANGLE_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Determine whether a line segment overlaps with a rectangle.\n  //\n  // Inputs:\n  //   s  source point of line segment\n  //   d  dest point of line segment\n  //   A  first corner of rectangle\n  //   B  opposite corner of rectangle\n  // Returns true if line segment is at all inside rectangle\n  IGL_INLINE bool line_segment_in_rectangle(\n    const Eigen::Vector2d & s,\n    const Eigen::Vector2d & d,\n    const Eigen::Vector2d & A,\n    const Eigen::Vector2d & B);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"line_segment_in_rectangle.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/linprog.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"linprog.h\"\n#include \"slice.h\"\n#include \"slice_into.h\"\n#include \"find.h\"\n#include \"colon.h\"\n#include <iostream>\n\n//#define IGL_LINPROG_VERBOSE\nIGL_INLINE bool igl::linprog(\n  const Eigen::VectorXd & c,\n  const Eigen::MatrixXd & _A,\n  const Eigen::VectorXd & b,\n  const int k,\n  Eigen::VectorXd & x)\n{\n  // This is a very literal translation of\n  // http://www.mathworks.com/matlabcentral/fileexchange/2166-introduction-to-linear-algebra/content/strang/linprog.m\n  using namespace Eigen;\n  using namespace std;\n  bool success = true;\n  // number of constraints\n  const int m = _A.rows();\n  // number of original variables\n  const int n = _A.cols();\n  // number of iterations\n  int it = 0;\n  // maximum number of iterations\n  //const int MAXIT = 10*m;\n  const int MAXIT = 100*m;\n  // residual tolerance\n  const double tol = 1e-10;\n  const auto & sign = [](const Eigen::VectorXd & B) -> Eigen::VectorXd\n  {\n    Eigen::VectorXd Bsign(B.size());\n    for(int i = 0;i<B.size();i++)\n    {\n      Bsign(i) = B(i)>0?1:(B(i)<0?-1:0);\n    }\n    return Bsign;\n  };\n  // initial (inverse) basis matrix\n  VectorXd Dv = sign(sign(b).array()+0.5);\n  Dv.head(k).setConstant(1.);\n  MatrixXd D = Dv.asDiagonal();\n  // Incorporate slack variables\n  MatrixXd A(_A.rows(),_A.cols()+D.cols());\n  A<<_A,D;\n  // Initial basis\n  VectorXi B = igl::colon<int>(n,n+m-1);\n  // non-basis, may turn out that vector<> would be better here\n  VectorXi N = igl::colon<int>(0,n-1);\n  int j;\n  double bmin = b.minCoeff(&j);\n  int phase;\n  VectorXd xb;\n  VectorXd s;\n  VectorXi J;\n  if(k>0 && bmin<0)\n  {\n    phase = 1;\n    xb = VectorXd::Ones(m);\n    // super cost\n    s.resize(n+m+1);\n    s<<VectorXd::Zero(n+k),VectorXd::Ones(m-k+1);\n    N.resize(n+1);\n    N<<igl::colon<int>(0,n-1),B(j);\n    J.resize(B.size()-1);\n    // [0 1 2 3 4]\n    //      ^\n    // [0 1]\n    //      [3 4]\n    J.head(j) = B.head(j);\n    J.tail(B.size()-j-1) = B.tail(B.size()-j-1);\n    B(j) = n+m;\n    MatrixXd AJ;\n    igl::slice(A,J,2,AJ);\n    const VectorXd a = b - AJ.rowwise().sum();\n    {\n      MatrixXd old_A = A;\n      A.resize(A.rows(),A.cols()+a.cols());\n      A<<old_A,a;\n    }\n    D.col(j) = -a/a(j);\n    D(j,j) = 1./a(j);\n  }else if(k==m)\n  {\n    phase = 2;\n    xb = b;\n    s.resize(c.size()+m);\n    // cost function\n    s<<c,VectorXd::Zero(m);\n  }else //k = 0 or bmin >=0\n  {\n    phase = 1;\n    xb = b.array().abs();\n    s.resize(n+m);\n    // super cost\n    s<<VectorXd::Zero(n+k),VectorXd::Ones(m-k);\n  }\n  while(phase<3)\n  {\n    double df = -1;\n    int t = std::numeric_limits<int>::max();\n    // Lagrange mutipliers fro Ax=b\n    VectorXd yb = D.transpose() * igl::slice(s,B);\n    while(true)\n    {\n      if(MAXIT>0 && it>=MAXIT)\n      {\n#ifdef IGL_LINPROG_VERBOSE\n        cerr<<\"linprog: warning! maximum iterations without convergence.\"<<endl;\n#endif\n        success = false;\n        break;\n      }\n      // no freedom for minimization\n      if(N.size() == 0)\n      {\n        break;\n      }\n      // reduced costs\n      VectorXd sN = igl::slice(s,N);\n      MatrixXd AN = igl::slice(A,N,2);\n      VectorXd r = sN - AN.transpose() * yb;\n      int q;\n      // determine new basic variable\n      double rmin = r.minCoeff(&q);\n      // optimal! infinity norm\n      if(rmin>=-tol*(sN.array().abs().maxCoeff()+1))\n      {\n        break;\n      }\n      // increment iteration count\n      it++;\n      // apply Bland's rule to avoid cycling\n      if(df>=0)\n      {\n        if(MAXIT == -1)\n        {\n#ifdef IGL_LINPROG_VERBOSE\n          cerr<<\"linprog: warning! degenerate vertex\"<<endl;\n#endif\n          success = false;\n        }\n        igl::find((r.array()<0).eval(),J);\n        double Nq = igl::slice(N,J).minCoeff();\n        // again seems like q is assumed to be a scalar though matlab code\n        // could produce a vector for multiple matches\n        (N.array()==Nq).cast<int>().maxCoeff(&q);\n      }\n      VectorXd d = D*A.col(N(q));\n      VectorXi I;\n      igl::find((d.array()>tol).eval(),I);\n      if(I.size() == 0)\n      {\n#ifdef IGL_LINPROG_VERBOSE\n        cerr<<\"linprog: warning! solution is unbounded\"<<endl;\n#endif\n        // This seems dubious:\n        it=-it;\n        success = false;\n        break;\n      }\n      VectorXd xbd = igl::slice(xb,I).array()/igl::slice(d,I).array();\n      // new use of r\n      int p;\n      {\n        double r;\n        r = xbd.minCoeff(&p);\n        p = I(p);\n        // apply Bland's rule to avoid cycling\n        if(df>=0)\n        {\n          igl::find((xbd.array()==r).eval(),J);\n          double Bp = igl::slice(B,igl::slice(I,J)).minCoeff();\n          // idiotic way of finding index in B of Bp\n          // code down the line seems to assume p is a scalar though the matlab\n          // code could find a vector of matches)\n          (B.array()==Bp).cast<int>().maxCoeff(&p);\n        }\n        // update x\n        xb -= r*d;\n        xb(p) = r;\n        // change in f\n        df = r*rmin;\n      }\n      // row vector\n      RowVectorXd v = D.row(p)/d(p);\n      yb += v.transpose() * (s(N(q)) - d.transpose()*igl::slice(s,B));\n      d(p)-=1;\n      // update inverse basis matrix\n      D = D - d*v;\n      t = B(p);\n      B(p) = N(q);\n      if(t>(n+k-1))\n      {\n        // remove qth entry from N\n        VectorXi old_N = N;\n        N.resize(N.size()-1);\n        N.head(q) = old_N.head(q);\n        N.head(q) = old_N.head(q);\n        N.tail(old_N.size()-q-1) = old_N.tail(old_N.size()-q-1);\n      }else\n      {\n        N(q) = t;\n      }\n    }\n    // iterative refinement\n    xb = (xb+D*(b-igl::slice(A,B,2)*xb)).eval();\n    // must be due to rounding\n    VectorXi I;\n    igl::find((xb.array()<0).eval(),I);\n    if(I.size()>0)\n    {\n      // so correct\n      VectorXd Z = VectorXd::Zero(I.size(),1);\n      igl::slice_into(Z,I,xb);\n    }\n    // B, xb,n,m,res=A(:,B)*xb-b\n    if(phase == 2 || it<0)\n    {\n      break;\n    }\n    if(xb.transpose()*igl::slice(s,B) > tol)\n    {\n      it = -it;\n#ifdef IGL_LINPROG_VERBOSE\n      cerr<<\"linprog: warning, no feasible solution\"<<endl;\n#endif\n      success = false;\n      break;\n    }\n    // re-initialize for Phase 2\n    phase = phase+1;\n    s*=1e6*c.array().abs().maxCoeff();\n    s.head(n) = c;\n  }\n  x.resize(std::max(B.maxCoeff()+1,n));\n  igl::slice_into(xb,B,x);\n  x = x.head(n).eval();\n  return success;\n}\n\nIGL_INLINE bool igl::linprog(\n  const Eigen::VectorXd & f,\n  const Eigen::MatrixXd & A,\n  const Eigen::VectorXd & b,\n  const Eigen::MatrixXd & B,\n  const Eigen::VectorXd & c,\n  Eigen::VectorXd & x)\n{\n  using namespace Eigen;\n  using namespace std;\n  const int m = A.rows();\n  const int n = A.cols();\n  const int p = B.rows();\n  MatrixXd Im = MatrixXd::Identity(m,m);\n  MatrixXd AS(m,n+m);\n  AS<<A,Im;\n  MatrixXd bS = b.array().abs();\n  for(int i = 0;i<m;i++)\n  {\n    const auto & sign = [](double x)->double\n    {\n      return (x<0?-1:(x>0?1:0));\n    };\n    AS.row(i) *= sign(b(i));\n  }\n  MatrixXd In = MatrixXd::Identity(n,n);\n  MatrixXd P(n+m,2*n+m);\n  P<<              In, -In, MatrixXd::Zero(n,m),\n     MatrixXd::Zero(m,2*n), Im;\n  MatrixXd ASP = AS*P;\n  MatrixXd BSP(0,2*n+m);\n  if(p>0)\n  {\n    MatrixXd BS(p,2*n);\n    BS<<B,MatrixXd::Zero(p,n);\n    BSP = BS*P;\n  }\n\n  VectorXd fSP = VectorXd::Ones(2*n+m);\n  fSP.head(2*n) = P.block(0,0,n,2*n).transpose()*f;\n  const VectorXd & cc = fSP;\n\n  MatrixXd AA(m+p,2*n+m);\n  AA<<ASP,BSP;\n  VectorXd bb(m+p);\n  bb<<bS,c;\n\n  VectorXd xxs;\n  bool ret = linprog(cc,AA,bb,0,xxs);\n  x = P.block(0,0,n,2*n+m)*xxs;\n  return ret;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/linprog.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_LINPROG_H\n#define IGL_LINPROG_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Solve a linear program given in \"standard form\"\n  //\n  // min  f'x\n  // s.t. A(    1:k,:) x <= b(1:k)\n  //      A(k+1:end,:) x = b(k+1:end)\n  //   ** x >= 0 **\n  //\n  // In contrast to other APIs the entries in b may be negative.\n  //\n  // Inputs:\n  //   c  #x list of linear coefficients\n  //   A  #A by #x matrix of linear constraint coefficients\n  //   b  #A list of linear constraint right-hand sides\n  //   k  number of inequality constraints as first rows of A,b\n  // Outputs:\n  //   x  #x solution vector\n  //\n  IGL_INLINE bool linprog(\n    const Eigen::VectorXd & c,\n    const Eigen::MatrixXd & A,\n    const Eigen::VectorXd & b,\n    const int k,\n    Eigen::VectorXd & f);\n  \n  // Wrapper in friendlier general form (no implicit bounds on x)\n  //\n  // min  f'x\n  // s.t. A x <= b\n  //      B x = c\n  //\n  // Inputs:\n  //   f  #x list of linear coefficients\n  //   A  #A by #x matrix of linear inequality constraint coefficients\n  //   b  #A list of linear constraint right-hand sides\n  //   B  #B by #x matrix of linear equality constraint coefficients\n  //   c  #B list of linear constraint right-hand sides\n  // Outputs:\n  //   x  #x solution vector\n  //\n  IGL_INLINE bool linprog(\n    const Eigen::VectorXd & f,\n    const Eigen::MatrixXd & A,\n    const Eigen::VectorXd & b,\n    const Eigen::MatrixXd & B,\n    const Eigen::VectorXd & c,\n    Eigen::VectorXd & x);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"linprog.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/list_to_matrix.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"list_to_matrix.h\"\n\n#include <cassert>\n#include <cstdio>\n\n#include <Eigen/Dense>\n\n#include \"max_size.h\"\n#include \"min_size.h\"\n\ntemplate <typename T, typename Derived>\nIGL_INLINE bool igl::list_to_matrix(const std::vector<std::vector<T > > & V,Eigen::PlainObjectBase<Derived>& M)\n{\n  // number of rows\n  int m = V.size();\n  if(m == 0)\n  {\n    M.resize(0,0);\n    return true;\n  }\n  // number of columns\n  int n = igl::min_size(V);\n  if(n != igl::max_size(V))\n  {\n    return false;\n  }\n  assert(n != -1);\n  // Resize output\n  M.resize(m,n);\n\n  // Loop over rows\n  for(int i = 0;i<m;i++)\n  {\n    // Loop over cols\n    for(int j = 0;j<n;j++)\n    {\n      M(i,j) = V[i][j];\n    }\n  }\n\n  return true;\n}\n\ntemplate <typename T, typename Derived>\nIGL_INLINE bool igl::list_to_matrix(\n  const std::vector<std::vector<T > > & V,\n  const int n,\n  const T & padding,\n  Eigen::PlainObjectBase<Derived>& M)\n{\n  const int m = V.size();\n  M.resize(m,n);\n  for(int i = 0;i<m;i++)\n  {\n    const auto & row = V[i];\n    if(row.size()>n)\n    {\n      return false;\n    }\n    int j = 0;\n    for(;j<row.size();j++)\n    {\n      M(i,j) = row[j];\n    }\n    for(;j<n;j++)\n    {\n      M(i,j) = padding;\n    }\n  }\n  return true;\n}\n\ntemplate <typename T, typename Derived>\nIGL_INLINE bool igl::list_to_matrix(const std::vector<T > & V,Eigen::PlainObjectBase<Derived>& M)\n{\n  // number of rows\n  int m = V.size();\n  if(m == 0)\n  {\n    //fprintf(stderr,\"Error: list_to_matrix() list is empty()\\n\");\n    //return false;\n    if(Derived::ColsAtCompileTime == 1)\n    {\n      M.resize(0,1);\n    }else if(Derived::RowsAtCompileTime == 1)\n    {\n      M.resize(1,0);\n    }else\n    {\n      M.resize(0,0);\n    }\n    return true;\n  }\n  // Resize output\n  if(Derived::RowsAtCompileTime == 1)\n  {\n    M.resize(1,m);\n  }else\n  {\n    M.resize(m,1);\n  }\n\n  // Loop over rows\n  for(int i = 0;i<m;i++)\n  {\n    M(i) = V[i];\n  }\n\n  return true;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate bool igl::list_to_matrix<bool, Eigen::Array<bool, -1, 3, 0, -1, 3> >(std::vector<std::vector<bool, std::allocator<bool> >, std::allocator<std::vector<bool, std::allocator<bool> > > > const&, Eigen::PlainObjectBase<Eigen::Array<bool, -1, 3, 0, -1, 3> >&);\n// generated by autoexplicit.sh\ntemplate bool igl::list_to_matrix<double, Eigen::Matrix<double, -1, -1, 1, -1, -1> >(std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> >&);\n// generated by autoexplicit.sh\ntemplate bool igl::list_to_matrix<int, Eigen::Matrix<int, -1, 2, 0, -1, 2> >(std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> >&);\n// generated by autoexplicit.sh\ntemplate bool igl::list_to_matrix<double, Eigen::Matrix<double, -1, 2, 0, -1, 2> >(std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> >&);\n// generated by autoexplicit.sh\ntemplate bool igl::list_to_matrix<double, Eigen::Matrix<double, 4, 1, 0, 4, 1> >(std::vector<double, std::allocator<double> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 4, 1, 0, 4, 1> >&);\n// generated by autoexplicit.sh\ntemplate bool igl::list_to_matrix<double, Eigen::Matrix<double, 3, 1, 0, 3, 1> >(std::vector<double, std::allocator<double> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 1, 0, 3, 1> >&);\n// generated by autoexplicit.sh\ntemplate bool igl::list_to_matrix<double, Eigen::Matrix<double, 2, 1, 0, 2, 1> >(std::vector<double, std::allocator<double> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 1, 0, 2, 1> >&);\ntemplate bool igl::list_to_matrix<double, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\ntemplate bool igl::list_to_matrix<double, Eigen::Matrix<double, -1, 3, 1, -1, 3> >(std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> >&);\ntemplate bool igl::list_to_matrix<double, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate bool igl::list_to_matrix<int, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&);\ntemplate bool igl::list_to_matrix<int, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate bool igl::list_to_matrix<int, Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1> >(std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1> >&);\ntemplate bool igl::list_to_matrix<double, Eigen::Matrix<float, -1, 3, 1, -1, 3> >(std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> >&);\ntemplate bool igl::list_to_matrix<float, Eigen::Matrix<float, -1, 3, 1, -1, 3> >(std::vector<std::vector<float, std::allocator<float> >, std::allocator<std::vector<float, std::allocator<float> > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> >&);\ntemplate bool igl::list_to_matrix<unsigned int, Eigen::Matrix<unsigned int, -1, 3, 1, -1, 3> >(std::vector<std::vector<unsigned int, std::allocator<unsigned int> >, std::allocator<std::vector<unsigned int, std::allocator<unsigned int> > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<unsigned int, -1, 3, 1, -1, 3> >&);\ntemplate bool igl::list_to_matrix<int, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(std::vector<int, std::allocator<int> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate bool igl::list_to_matrix<unsigned long, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(std::vector<unsigned long, std::allocator<unsigned long> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate bool igl::list_to_matrix<float, Eigen::Matrix<float, -1, -1, 0, -1, -1> >(std::vector<std::vector<float, std::allocator<float> >, std::allocator<std::vector<float, std::allocator<float> > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, -1, 0, -1, -1> >&);\ntemplate bool igl::list_to_matrix<bool, Eigen::Array<bool, -1, 1, 0, -1, 1> >(std::vector<bool, std::allocator<bool> > const&, Eigen::PlainObjectBase<Eigen::Array<bool, -1, 1, 0, -1, 1> >&);\ntemplate bool igl::list_to_matrix<bool, Eigen::Array<bool, -1, -1, 0, -1, -1> >(std::vector<std::vector<bool, std::allocator<bool> >, std::allocator<std::vector<bool, std::allocator<bool> > > > const&, Eigen::PlainObjectBase<Eigen::Array<bool, -1, -1, 0, -1, -1> >&);\ntemplate bool igl::list_to_matrix<bool, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(std::vector<bool, std::allocator<bool> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate bool igl::list_to_matrix<bool, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(std::vector<std::vector<bool, std::allocator<bool> >, std::allocator<std::vector<bool, std::allocator<bool> > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate bool igl::list_to_matrix<double, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(std::vector<double, std::allocator<double> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\ntemplate bool igl::list_to_matrix<double, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(std::vector<double, std::allocator<double> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate bool igl::list_to_matrix<int, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(std::vector<int, std::allocator<int> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate bool igl::list_to_matrix<unsigned long, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(std::vector<unsigned long, std::allocator<unsigned long> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate bool igl::list_to_matrix<int, Eigen::Matrix<int, -1, 3, 1, -1, 3> >(std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> >&);\ntemplate bool igl::list_to_matrix<unsigned long, Eigen::Matrix<long, -1, 1, 0, -1, 1> >(std::vector<unsigned long, std::allocator<unsigned long> > const&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&);\n\n#ifdef WIN32\ntemplate bool igl::list_to_matrix<unsigned long long,class Eigen::Matrix<int,-1,1,0,-1,1> >(class std::vector<unsigned long long,class std::allocator<unsigned long long> > const &,class Eigen::PlainObjectBase<class Eigen::Matrix<int,-1,1,0,-1,1> > &);\ntemplate bool igl::list_to_matrix<double, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(std::vector<double, std::allocator<double> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate bool igl::list_to_matrix<double, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(std::vector<double, std::allocator<double> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate bool igl::list_to_matrix<double, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(std::vector<double, std::allocator<double> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate bool igl::list_to_matrix<double, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(std::vector<double, std::allocator<double> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate bool igl::list_to_matrix<unsigned long, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(std::vector<unsigned long, std::allocator<unsigned long> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate bool igl::list_to_matrix<unsigned __int64, class Eigen::Matrix<int, -1, -1, 0, -1, -1> >(class std::vector<unsigned __int64, class std::allocator<unsigned __int64> > const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1> > &);\ntemplate bool igl::list_to_matrix<unsigned __int64,class Eigen::Matrix<long,-1,1,0,-1,1> >(class std::vector<unsigned __int64,class std::allocator<unsigned __int64> > const &,class Eigen::PlainObjectBase<class Eigen::Matrix<long,-1,1,0,-1,1> > &);\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/list_to_matrix.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_LIST_TO_MATRIX_H\n#define IGL_LIST_TO_MATRIX_H\n#include \"igl_inline.h\"\n#include <vector>\n#include <Eigen/Core>\n\nnamespace igl\n{\n  // Convert a list (std::vector) of row vectors of the same length to a matrix\n  // Template:\n  //   T  type that can be safely cast to type in Mat via '='\n  //   Mat  Matrix type, must implement:\n  //     .resize(m,n)\n  //     .row(i) = Row\n  // Inputs:\n  //   V  a m-long list of vectors of size n\n  // Outputs:\n  //   M  an m by n matrix\n  // Returns true on success, false on errors\n  template <typename T, typename Derived>\n  IGL_INLINE bool list_to_matrix(\n    const std::vector<std::vector<T > > & V,\n    Eigen::PlainObjectBase<Derived>& M);\n  // Convert a list of row vectors of `n` or less to a matrix and pad on\n  // the right with `padding`:\n  //\n  // Inputs:\n  //   V  a m-long list of vectors of size <=n\n  //   n  number of columns\n  //   padding  value to fill in from right for short rows\n  // Outputs:\n  //   M  an m by n matrix\n  template <typename T, typename Derived>\n  IGL_INLINE bool list_to_matrix(\n    const std::vector<std::vector<T > > & V,\n    const int n,\n    const T & padding,\n    Eigen::PlainObjectBase<Derived>& M);\n  // Vector wrapper\n  template <typename T, typename Derived>\n  IGL_INLINE bool list_to_matrix(const std::vector<T > & V,Eigen::PlainObjectBase<Derived>& M);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"list_to_matrix.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/load_shader.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"load_shader.h\"\n#ifndef IGL_NO_OPENGL\n\n// Copyright Denis Kovacs 4/10/08\n#include \"print_shader_info_log.h\"\n#include <cstdio>\nIGL_INLINE GLuint igl::load_shader(const char *src,const GLenum type)\n{\n  GLuint s = glCreateShader(type);\n  if(s == 0)\n  {\n    fprintf(stderr,\"Error: load_shader() failed to create shader.\\n\");\n    return 0;\n  }\n  // Pass shader source string\n  glShaderSource(s, 1, &src, NULL);\n  glCompileShader(s);\n  // Print info log (if any)\n  igl::print_shader_info_log(s);\n  return s;\n}\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/load_shader.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_LOAD_SHADER_H \n#define IGL_LOAD_SHADER_H\n#ifndef IGL_NO_OPENGL\n#include \"igl_inline.h\" \n\n#include \"OpenGL_convenience.h\"\n\nnamespace igl\n{\n  // Creates and compiles a shader from a given string\n  // Inputs:\n  //   src  string containing GLSL shader code\n  //   type  GLSL type of shader, one of:\n  //     GL_VERTEX_SHADER\n  //     GL_FRAGMENT_SHADER\n  //     GL_GEOMETRY_SHADER\n  // Returns  index id of the newly created shader, 0 on error\n  IGL_INLINE GLuint load_shader(const char *src,const GLenum type);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"load_shader.cpp\"\n#endif\n\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/local_basis.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"local_basis.h\"\n\n#include <sstream>\n#include <string>\n#include <fstream>\n\n#include <vector>\n#include <Eigen/Geometry>\n\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::local_basis(\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  Eigen::PlainObjectBase<DerivedV>& B1,\n  Eigen::PlainObjectBase<DerivedV>& B2,\n  Eigen::PlainObjectBase<DerivedV>& B3\n  )\n{\n  using namespace Eigen;\n  using namespace std;\n  B1.resize(F.rows(),3);\n  B2.resize(F.rows(),3);\n  B3.resize(F.rows(),3);\n\n  for (unsigned i=0;i<F.rows();++i)\n  {\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> v1 = (V.row(F(i,1)) - V.row(F(i,0))).normalized();\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> t = V.row(F(i,2)) - V.row(F(i,0));\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> v3 = v1.cross(t).normalized();\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> v2 = v1.cross(v3).normalized();\n\n      B1.row(i) = v1;\n      B2.row(i) = -v2;\n      B3.row(i) = v3;\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::local_basis<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\ntemplate void igl::local_basis<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/local_basis.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_LOCALBASIS_H\n#define IGL_LOCALBASIS_H\n\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <string>\n#include <vector>\n\nnamespace igl \n{\n  // Compute a local orthogonal reference system for each triangle in the given mesh\n  // Templates:\n  //   DerivedV derived from vertex positions matrix type: i.e. MatrixXd\n  //   DerivedF derived from face indices matrix type: i.e. MatrixXi\n  // Inputs:\n  //   V  eigen matrix #V by 3\n  //   F  #F by 3 list of mesh faces (must be triangles)\n  // Outputs:\n  //   B1 eigen matrix #F by 3, each vector is tangent to the triangle\n  //   B2 eigen matrix #F by 3, each vector is tangent to the triangle and perpendicular to B1\n  //   B3 eigen matrix #F by 3, normal of the triangle\n  //\n  // See also: adjacency_matrix\n  template <typename DerivedV, typename DerivedF>\n  IGL_INLINE void local_basis(\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    Eigen::PlainObjectBase<DerivedV>& B1,\n    Eigen::PlainObjectBase<DerivedV>& B2,\n    Eigen::PlainObjectBase<DerivedV>& B3\n    );\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"local_basis.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/look_at.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"look_at.h\"\n\ntemplate <\n  typename Derivedeye,\n  typename Derivedcenter,\n  typename Derivedup,\n  typename DerivedR>\nIGL_INLINE void igl::look_at(\n  const Eigen::PlainObjectBase<Derivedeye> & eye,\n  const Eigen::PlainObjectBase<Derivedcenter> & center,\n  const Eigen::PlainObjectBase<Derivedup> & up,\n  Eigen::PlainObjectBase<DerivedR> & R)\n{\n  typedef Eigen::Matrix<typename DerivedR::Scalar,3,1> Vector3S;\n  Vector3S f = (center - eye).normalized();\n  Vector3S s = f.cross(up).normalized();\n  Vector3S u = s.cross(f);\n  R = Eigen::Matrix<typename DerivedR::Scalar,4,4>::Identity();\n  R(0,0) = s(0);\n  R(0,1) = s(1);\n  R(0,2) = s(2);\n  R(1,0) = u(0);\n  R(1,1) = u(1);\n  R(1,2) = u(2);\n  R(2,0) =-f(0);\n  R(2,1) =-f(1);\n  R(2,2) =-f(2);\n  R(0,3) =-s.transpose() * eye;\n  R(1,3) =-u.transpose() * eye;\n  R(2,3) = f.transpose() * eye;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::look_at<Eigen::Matrix<float, 3, 1, 0, 3, 1>, Eigen::Matrix<float, 3, 1, 0, 3, 1>, Eigen::Matrix<float, 3, 1, 0, 3, 1>, Eigen::Matrix<float, 4, 4, 0, 4, 4> >(Eigen::PlainObjectBase<Eigen::Matrix<float, 3, 1, 0, 3, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, 3, 1, 0, 3, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, 3, 1, 0, 3, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, 4, 4, 0, 4, 4> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/look_at.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_LOOK_AT_H\n#define IGL_LOOK_AT_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Dense>\n\nnamespace igl \n{\n  // Implementation of the deprecated gluLookAt function.\n  //\n  // Inputs:\n  //   eye  3-vector of eye position\n  //   center  3-vector of center reference point\n  //   up  3-vector of up vector\n  // Outputs:\n  //   R  4x4 rotation matrix\n  //\n  template <\n    typename Derivedeye,\n    typename Derivedcenter,\n    typename Derivedup,\n    typename DerivedR >\n  IGL_INLINE void look_at(\n    const Eigen::PlainObjectBase<Derivedeye> & eye,\n    const Eigen::PlainObjectBase<Derivedcenter> & center,\n    const Eigen::PlainObjectBase<Derivedup> & up,\n    Eigen::PlainObjectBase<DerivedR> & R);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"look_at.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/loop.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2016 Oded Stein <oded.stein@columbia.edu>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"loop.h\"\n\n#include <igl/adjacency_list.h>\n#include <igl/triangle_triangle_adjacency.h>\n#include <igl/unique.h>\n\n#include <vector>\n\ntemplate <\n  typename DerivedF,\n  typename SType,\n  typename DerivedNF>\nIGL_INLINE void igl::loop(\n  const int n_verts,\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  Eigen::SparseMatrix<SType>& S,\n  Eigen::PlainObjectBase<DerivedNF> & NF)\n{\n  typedef Eigen::SparseMatrix<SType> SparseMat;\n  typedef Eigen::Triplet<SType> Triplet_t;\n  \n  //Ref. https://graphics.stanford.edu/~mdfisher/subdivision.html\n  //Heavily borrowing from igl::upsample\n  \n  DerivedF FF, FFi;\n  triangle_triangle_adjacency(F, FF, FFi);\n  std::vector<std::vector<typename DerivedF::Scalar>> adjacencyList;\n  adjacency_list(F, adjacencyList, true);\n  \n  //Compute the number and positions of the vertices to insert (on edges)\n  Eigen::MatrixXi NI = Eigen::MatrixXi::Constant(FF.rows(), FF.cols(), -1);\n  Eigen::MatrixXi NIdoubles = Eigen::MatrixXi::Zero(FF.rows(), FF.cols());\n  Eigen::VectorXi vertIsOnBdry = Eigen::VectorXi::Zero(n_verts);\n  int counter = 0;\n  for(int i=0; i<FF.rows(); ++i)\n  {\n    for(int j=0; j<3; ++j)\n    {\n      if(NI(i,j) == -1)\n      {\n        NI(i,j) = counter;\n        NIdoubles(i,j) = 0;\n        if (FF(i,j) != -1) \n        {\n          //If it is not a boundary\n          NI(FF(i,j), FFi(i,j)) = counter;\n          NIdoubles(i,j) = 1;\n        } else \n        {\n          //Mark boundary vertices for later\n          vertIsOnBdry(F(i,j)) = 1;\n          vertIsOnBdry(F(i,(j+1)%3)) = 1;\n        }\n        ++counter;\n      }\n    }\n  }\n  \n  const int& n_odd = n_verts;\n  const int& n_even = counter;\n  const int n_newverts = n_odd + n_even;\n  \n  //Construct vertex positions\n  std::vector<Triplet_t> tripletList;\n  for(int i=0; i<n_odd; ++i) \n  {\n    //Old vertices\n    const std::vector<int>& localAdjList = adjacencyList[i];\n    if(vertIsOnBdry(i)==1) \n    {\n      //Boundary vertex\n      tripletList.emplace_back(i, localAdjList.front(), 1./8.);\n      tripletList.emplace_back(i, localAdjList.back(), 1./8.);\n      tripletList.emplace_back(i, i, 3./4.);\n    } else \n    {\n      const int n = localAdjList.size();\n      const SType dn = n;\n      SType beta;\n      if(n==3)\n      {\n        beta = 3./16.;\n      } else\n      {\n        beta = 3./8./dn;\n      }\n      for(int j=0; j<n; ++j)\n      {\n        tripletList.emplace_back(i, localAdjList[j], beta);\n      }\n      tripletList.emplace_back(i, i, 1.-dn*beta);\n    }\n  }\n  for(int i=0; i<FF.rows(); ++i) \n  {\n    //New vertices\n    for(int j=0; j<3; ++j) \n    {\n      if(NIdoubles(i,j)==0) \n      {\n        if(FF(i,j)==-1) \n        {\n          //Boundary vertex\n          tripletList.emplace_back(NI(i,j) + n_odd, F(i,j), 1./2.);\n          tripletList.emplace_back(NI(i,j) + n_odd, F(i, (j+1)%3), 1./2.);\n        } else \n        {\n          tripletList.emplace_back(NI(i,j) + n_odd, F(i,j), 3./8.);\n          tripletList.emplace_back(NI(i,j) + n_odd, F(i, (j+1)%3), 3./8.);\n          tripletList.emplace_back(NI(i,j) + n_odd, F(i, (j+2)%3), 1./8.);\n          tripletList.emplace_back(NI(i,j) + n_odd, F(FF(i,j), (FFi(i,j)+2)%3), 1./8.);\n        }\n      }\n    }\n  }\n  S.resize(n_newverts, n_verts);\n  S.setFromTriplets(tripletList.begin(), tripletList.end());\n  \n  // Build the new topology (Every face is replaced by four)\n  NF.resize(F.rows()*4, 3);\n  for(int i=0; i<F.rows();++i)\n  {\n    Eigen::VectorXi VI(6);\n    VI << F(i,0), F(i,1), F(i,2), NI(i,0) + n_odd, NI(i,1) + n_odd, NI(i,2) + n_odd;\n    \n    Eigen::VectorXi f0(3), f1(3), f2(3), f3(3);\n    f0 << VI(0), VI(3), VI(5);\n    f1 << VI(1), VI(4), VI(3);\n    f2 << VI(3), VI(4), VI(5);\n    f3 << VI(4), VI(2), VI(5);\n    \n    NF.row((i*4)+0) = f0;\n    NF.row((i*4)+1) = f1;\n    NF.row((i*4)+2) = f2;\n    NF.row((i*4)+3) = f3;\n  }\n}\n\ntemplate <\n  typename DerivedV, \n  typename DerivedF,\n  typename DerivedNV,\n  typename DerivedNF>\nIGL_INLINE void igl::loop(\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  Eigen::PlainObjectBase<DerivedNV>& NV,\n  Eigen::PlainObjectBase<DerivedNF>& NF,\n  const int number_of_subdivs)\n{\n  NV = V;\n  NF = F;\n  for(int i=0; i<number_of_subdivs; ++i) \n  {\n    DerivedNF tempF = NF;\n    Eigen::SparseMatrix<typename DerivedV::Scalar> S;\n    loop(NV.rows(), tempF, S, NF);\n    // This .eval is super important\n    NV = (S*NV).eval();\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\ntemplate void igl::loop<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, int);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/loop.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2016 Oded Stein <oded.stein@columbia.edu>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_LOOP_H\n#define IGL_LOOP_H\n\n#include <igl/igl_inline.h>\n#include <Eigen/Core>\n#include <Eigen/Sparse>\n\nnamespace igl\n{\n  // LOOP Given the triangle mesh [V, F], where n_verts = V.rows(), computes\n  // newV and a sparse matrix S s.t. [newV, newF] is the subdivided mesh where\n  // newV = S*V.\n  //\n  // Inputs:\n  //   n_verts  an integer (number of mesh vertices)\n  //   F  an m by 3 matrix of integers of triangle faces\n  // Outputs:\n  //   S  a sparse matrix (will become the subdivision matrix)\n  //   newF  a matrix containing the new faces\n  template <\n    typename DerivedF,\n    typename SType,\n    typename DerivedNF>\n  IGL_INLINE void loop(\n    const int n_verts,\n    const Eigen::PlainObjectBase<DerivedF> & F,\n    Eigen::SparseMatrix<SType>& S,\n    Eigen::PlainObjectBase<DerivedNF> & NF);\n  // LOOP Given the triangle mesh [V, F], computes number_of_subdivs steps of loop subdivision and outputs the new mesh [newV, newF]\n  //\n  // Inputs:\n  //  V an n by 3 matrix of vertices\n  //  F an m by 3 matrix of integers of triangle faces\n  //  number_of_subdivs an integer that specifies how many subdivision steps to do\n  // Outputs:\n  //  NV a matrix containing the new vertices\n  //  NF a matrix containing the new faces\n  template <\n    typename DerivedV, \n    typename DerivedF,\n    typename DerivedNV,\n    typename DerivedNF>\n  IGL_INLINE void loop(\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    Eigen::PlainObjectBase<DerivedNV>& NV,\n    Eigen::PlainObjectBase<DerivedNF>& NF,\n    const int number_of_subdivs = 1);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"loop.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/lscm.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"lscm.h\"\n\n#include \"vector_area_matrix.h\"\n#include \"cotmatrix.h\"\n#include \"repdiag.h\"\n#include \"min_quad_with_fixed.h\"\n#include <iostream>\n\nIGL_INLINE bool igl::lscm(\n  const Eigen::MatrixXd& V,\n  const Eigen::MatrixXi& F,\n  const Eigen::VectorXi& b,\n  const Eigen::MatrixXd& bc,\n  Eigen::MatrixXd & V_uv)\n{\n  using namespace Eigen;\n  using namespace std;\n  \n  // Assemble the area matrix (note that A is #Vx2 by #Vx2)\n  SparseMatrix<double> A;\n  igl::vector_area_matrix(F,A);\n\n  // Assemble the cotan laplacian matrix\n  SparseMatrix<double> L;\n  igl::cotmatrix(V,F,L);\n\n  SparseMatrix<double> L_flat;\n  repdiag(L,2,L_flat);\n\n  VectorXi b_flat(b.size()*bc.cols(),1);\n  VectorXd bc_flat(bc.size(),1);\n  for(int c = 0;c<bc.cols();c++)\n  {\n    b_flat.block(c*b.size(),0,b.rows(),1) = c*V.rows() + b.array();\n    bc_flat.block(c*bc.rows(),0,bc.rows(),1) = bc.col(c);\n  }\n  \n  // Minimize the LSCM energy\n  SparseMatrix<double> Q = -L_flat + 2.*A;\n  const VectorXd B_flat = VectorXd::Zero(V.rows()*2);\n  igl::min_quad_with_fixed_data<double> data;\n  if(!igl::min_quad_with_fixed_precompute(Q,b_flat,SparseMatrix<double>(),true,data))\n  {\n    return false;\n  }\n\n  MatrixXd W_flat;\n  if(!min_quad_with_fixed_solve(data,B_flat,bc_flat,VectorXd(),W_flat))\n  {\n    return false;\n  }\n\n\n  assert(W_flat.rows() == V.rows()*2);\n  V_uv.resize(V.rows(),2);\n  for (unsigned i=0;i<V_uv.cols();++i)\n  {\n    V_uv.col(V_uv.cols()-i-1) = W_flat.block(V_uv.rows()*i,0,V_uv.rows(),1);\n  }\n  return true;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/lscm.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n//               2015 Alec Jacobson\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_LSCM_H\n#define IGL_LSCM_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Dense>\n#include <Eigen/Sparse>\n\nnamespace igl \n{\n  // Compute a Least-squares conformal map parametrization (equivalently\n  // derived in \"Intrinsic Parameterizations of Surface Meshes\" [Desbrun et al.\n  // 2002] and \"Least Squares Conformal Maps for Automatic Texture Atlas\n  // Generation\" [Lévy et al. 2002]), though this implementation follows the\n  // derivation in: \"Spectral Conformal Parameterization\" [Mullen et al. 2008]\n  // (note, this does **not** implement the Eigen-decomposition based method in\n  // [Mullen et al. 2008], which is not equivalent). Input should be a manifold\n  // mesh (also no unreferenced vertices) and \"boundary\" (fixed vertices) `b`\n  // should contain at least two vertices per connected component.\n  //\n  // Inputs:\n  //   V  #V by 3 list of mesh vertex positions\n  //   F  #F by 3 list of mesh faces (must be triangles)\n  //   b  #b boundary indices into V\n  //   bc #b by 3 list of boundary values\n  // Outputs:\n  //   UV #V by 2 list of 2D mesh vertex positions in UV space\n  // Returns true only on solver success.\n  //\n  IGL_INLINE bool lscm( \n      const Eigen::MatrixXd& V, \n      const Eigen::MatrixXi& F,\n      const Eigen::VectorXi& b, \n      const Eigen::MatrixXd& bc, \n      Eigen::MatrixXd& V_uv);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"lscm.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/lu_lagrange.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"lu_lagrange.h\"\n\n// Cholesky LLT decomposition for symmetric positive definite\n//#include <Eigen/SparseExtra>\n// Bug in unsupported/Eigen/SparseExtra needs iostream first\n#include <iostream>\n#include <unsupported/Eigen/SparseExtra>\n#include <cassert>\n#include <cstdio>\n#include \"find.h\"\n#include \"sparse.h\"\n\ntemplate <typename T>\nIGL_INLINE bool igl::lu_lagrange(\n  const Eigen::SparseMatrix<T> & ATA,\n  const Eigen::SparseMatrix<T> & C,\n  Eigen::SparseMatrix<T> & L,\n  Eigen::SparseMatrix<T> & U)\n{\n#if EIGEN_VERSION_AT_LEAST(3,0,92)\n#  warning lu_lagrange has not yet been implemented for your Eigen Version\n  return false;\n#else\n  // number of unknowns\n  int n = ATA.rows();\n  // number of lagrange multipliers\n  int m = C.cols();\n\n  assert(ATA.cols() == n);\n  if(m != 0)\n  {\n    assert(C.rows() == n);\n    if(C.nonZeros() == 0)\n    {\n      // See note above about empty columns in C\n      fprintf(stderr,\"Error: lu_lagrange() C has columns but no entries\\n\");\n      return false;\n    }\n  }\n\n  // Check that each column of C has at least one entry\n  std::vector<bool> has_entry; has_entry.resize(C.cols(),false);\n  // Iterate over outside\n  for(int k=0; k<C.outerSize(); ++k)\n  {\n    // Iterate over inside\n    for(typename Eigen::SparseMatrix<T>::InnerIterator it (C,k); it; ++it)\n    {\n      has_entry[it.col()] = true;\n    }\n  }\n  for(int i=0;i<(int)has_entry.size();i++)\n  {\n    if(!has_entry[i])\n    {\n      // See note above about empty columns in C\n      fprintf(stderr,\"Error: lu_lagrange() C(:,%d) has no entries\\n\",i);\n      return false;\n    }\n  }\n\n\n\n  // Cholesky factorization of ATA\n  //// Eigen fails if you give a full view of the matrix like this:\n  //Eigen::SparseLLT<SparseMatrix<T> > ATA_LLT(ATA);\n  Eigen::SparseMatrix<T> ATA_LT = ATA.template triangularView<Eigen::Lower>();\n  Eigen::SparseLLT<Eigen::SparseMatrix<T> > ATA_LLT(ATA_LT);\n\n  Eigen::SparseMatrix<T> J = ATA_LLT.matrixL();\n\n  //if(!ATA_LLT.succeeded())\n  if(!((J*0).eval().nonZeros() == 0))\n  {\n    fprintf(stderr,\"Error: lu_lagrange() failed to factor ATA\\n\");\n    return false;\n  }\n\n  if(m == 0)\n  {\n    // If there are no constraints (C is empty) then LU decomposition is just L\n    // and L' from cholesky decomposition\n    L = J;\n    U = J.transpose();\n  }else\n  {\n    // Construct helper matrix M\n    Eigen::SparseMatrix<T> M = C;\n    J.template triangularView<Eigen::Lower>().solveInPlace(M);\n\n    // Compute cholesky factorizaiton of M'*M\n    Eigen::SparseMatrix<T> MTM = M.transpose() * M;\n\n    Eigen::SparseLLT<Eigen::SparseMatrix<T> > MTM_LLT(MTM.template triangularView<Eigen::Lower>());\n\n    Eigen::SparseMatrix<T> K = MTM_LLT.matrixL();\n\n    //if(!MTM_LLT.succeeded())\n    if(!((K*0).eval().nonZeros() == 0))\n    {\n      fprintf(stderr,\"Error: lu_lagrange() failed to factor MTM\\n\");\n      return false;\n    }\n\n    // assemble LU decomposition of Q\n    Eigen::Matrix<int,Eigen::Dynamic,1> MI;\n    Eigen::Matrix<int,Eigen::Dynamic,1> MJ;\n    Eigen::Matrix<T,Eigen::Dynamic,1> MV;\n    igl::find(M,MI,MJ,MV);\n\n    Eigen::Matrix<int,Eigen::Dynamic,1> KI;\n    Eigen::Matrix<int,Eigen::Dynamic,1> KJ;\n    Eigen::Matrix<T,Eigen::Dynamic,1> KV;\n    igl::find(K,KI,KJ,KV);\n\n    Eigen::Matrix<int,Eigen::Dynamic,1> JI;\n    Eigen::Matrix<int,Eigen::Dynamic,1> JJ;\n    Eigen::Matrix<T,Eigen::Dynamic,1> JV;\n    igl::find(J,JI,JJ,JV);\n\n    int nnz = JV.size()  + MV.size() + KV.size();\n\n    Eigen::Matrix<int,Eigen::Dynamic,1> UI(nnz);\n    Eigen::Matrix<int,Eigen::Dynamic,1> UJ(nnz);\n    Eigen::Matrix<T,Eigen::Dynamic,1> UV(nnz);\n    UI << JJ,                        MI, (KJ.array() + n).matrix();\n    UJ << JI, (MJ.array() + n).matrix(), (KI.array() + n).matrix(); \n    UV << JV,                        MV,                     KV*-1;\n    igl::sparse(UI,UJ,UV,U);\n\n    Eigen::Matrix<int,Eigen::Dynamic,1> LI(nnz);\n    Eigen::Matrix<int,Eigen::Dynamic,1> LJ(nnz);\n    Eigen::Matrix<T,Eigen::Dynamic,1> LV(nnz);\n    LI << JI, (MJ.array() + n).matrix(), (KI.array() + n).matrix();\n    LJ << JJ,                        MI, (KJ.array() + n).matrix(); \n    LV << JV,                        MV,                        KV;\n    igl::sparse(LI,LJ,LV,L);\n  }\n\n  return true;\n  #endif\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template specialization\ntemplate bool igl::lu_lagrange<double>(Eigen::SparseMatrix<double, 0, int> const&, Eigen::SparseMatrix<double, 0, int> const&, Eigen::SparseMatrix<double, 0, int>&, Eigen::SparseMatrix<double, 0, int>&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/lu_lagrange.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_LU_LAGRANGE_H\n#define IGL_LU_LAGRANGE_H\n#include \"igl_inline.h\"\n\n#define EIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET\n#include <Eigen/Dense>\n#include <Eigen/Sparse>\nnamespace igl\n{\n  // KNOWN BUGS: This does not seem to be correct for non-empty C\n  //\n  // LU_LAGRANGE Compute a LU decomposition for a special type of\n  // matrix Q that is symmetric but not positive-definite:\n  // Q = [A'*A C\n  //      C'   0];\n  // where A'*A, or ATA, is given as a symmetric positive definite matrix and C\n  // has full column-rank(?)\n  //\n  // [J] = lu_lagrange(ATA,C)\n  //\n  // Templates:\n  //   T  should be a eigen matrix primitive type like int or double\n  // Inputs:\n  //   ATA   n by n square, symmetric, positive-definite system matrix, usually\n  //     the quadratic coefficients corresponding to the original unknowns in a\n  //     system\n  //   C  n by m rectangular matrix corresponding the quadratic coefficients of\n  //     the original unknowns times the lagrange multipliers enforcing linear\n  //     equality constraints\n  // Outputs:\n  //   L  lower triangular matrix such that Q = L*U\n  //   U  upper triangular matrix such that Q = L*U\n  // Returns true on success, false on error\n  //\n  // Note: C should *not* have any empty columns. Typically C is the slice of\n  // the linear constraints matrix Aeq concerning the unknown variables of a\n  // quadratic optimization. Generally constraints may deal with unknowns as\n  // well as knowns. Each linear constraint corresponds to a column of Aeq. As\n  // long as each constraint concerns at least one unknown then the\n  // corresponding column in C will have at least one non zero entry. If a\n  // constraint concerns *no* unknowns, you should double check that this is a\n  // valid constraint. How can you constrain known values to each other? This\n  // is either a contradiction to the knowns' values or redundent. In either\n  // case, it's not this functions responsiblilty to handle empty constraints\n  // so you will get an error.\n  //\n  template <typename T>\n  IGL_INLINE bool lu_lagrange(\n    const Eigen::SparseMatrix<T> & ATA,\n    const Eigen::SparseMatrix<T> & C,\n    Eigen::SparseMatrix<T> & L,\n    Eigen::SparseMatrix<T> & U);\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"lu_lagrange.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/map_vertices_to_circle.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Stefan Brugger <stefanbrugger@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"map_vertices_to_circle.h\"\n\nIGL_INLINE void igl::map_vertices_to_circle(\n  const Eigen::MatrixXd& V,\n  const Eigen::VectorXi& bnd,\n  Eigen::MatrixXd& UV)\n{\n  // Get sorted list of boundary vertices\n  std::vector<int> interior,map_ij;\n  map_ij.resize(V.rows());\n\n  std::vector<bool> isOnBnd(V.rows(),false);\n  for (int i = 0; i < bnd.size(); i++)\n  {\n    isOnBnd[bnd[i]] = true;\n    map_ij[bnd[i]] = i;\n  }\n\n  for (int i = 0; i < (int)isOnBnd.size(); i++)\n  {\n    if (!isOnBnd[i])\n    {\n      map_ij[i] = interior.size();\n      interior.push_back(i);\n    }\n  }\n\n  // Map boundary to unit circle\n  std::vector<double> len(bnd.size());\n  len[0] = 0.;\n\n  for (int i = 1; i < bnd.size(); i++)\n  {\n    len[i] = len[i-1] + (V.row(bnd[i-1]) - V.row(bnd[i])).norm();\n  }\n  double total_len = len[len.size()-1] + (V.row(bnd[0]) - V.row(bnd[bnd.size()-1])).norm();\n\n  UV.resize(bnd.size(),2);\n  for (int i = 0; i < bnd.size(); i++)\n  {\n    double frac = len[i] * 2. * M_PI / total_len;\n    UV.row(map_ij[bnd[i]]) << cos(frac), sin(frac);\n  }\n\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/map_vertices_to_circle.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Stefan Brugger <stefanbrugger@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_MAP_VERTICES_TO_CIRCLE_H\n#define IGL_MAP_VERTICES_TO_CIRCLE_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Dense>\n#include <vector>\n\nnamespace igl\n{\n\n  // Map the vertices whose indices are in a given boundary loop (bnd) on the\n  // unit circle with spacing proportional to the original boundary edge\n  // lengths.\n  //\n  // Inputs:\n  //   V  #V by dim list of mesh vertex positions\n  //   b  #W list of vertex ids\n  // Outputs:\n  //   UV   #W by 2 list of 2D position on the unit circle for the vertices in b\n  IGL_INLINE void map_vertices_to_circle(\n  \tconst Eigen::MatrixXd& V,\n    const Eigen::VectorXi& bnd,\n  \tEigen::MatrixXd& UV);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"map_vertices_to_circle.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/marching_cubes.cpp",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                                IsoEx                                      *\n *        Copyright (C) 2002 by Computer Graphics Group, RWTH Aachen         *\n *                         www.rwth-graphics.de                              *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *                                                                           *\n *                                License                                    *\n *                                                                           *\n *  This library is free software; you can redistribute it and/or modify it  *\n *  under the terms of the GNU Library General Public License as published   *\n *  by the Free Software Foundation, version 2.                              *\n *                                                                           *\n *  This library is distributed in the hope that it will be useful, but      *\n *  WITHOUT ANY WARRANTY; without even the implied warranty of               *\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU        *\n *  Library General Public License for more details.                         *\n *                                                                           *\n *  You should have received a copy of the GNU Library General Public        *\n *  License along with this library; if not, write to the Free Software      *\n *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.                *\n *                                                                           *\n \\*===========================================================================*/\n\n#include \"marching_cubes.h\"\n#include <map>\n\nextern int edgeTable[256];\nextern int triTable[256][2][17];\nextern int polyTable[8][16];\n\nclass EdgeKey \n{\npublic:\n  \n  EdgeKey(unsigned i0, unsigned i1) {\n    if (i0 < i1)  { i0_ = i0;  i1_ = i1; }\n    else            { i0_ = i1;  i1_ = i0; }\n  }\n  \n  bool operator<(const EdgeKey& _rhs) const \n  {\n    if (i0_ != _rhs.i0_)\n      return (i0_ < _rhs.i0_);\n    else\n      return (i1_ < _rhs.i1_);\n  }\n  \nprivate:\n  unsigned i0_, i1_;\n};\n\n\ntemplate <typename DerivedV, typename DerivedF>\nclass MarchingCubes\n{\n  typedef Eigen::PlainObjectBase<DerivedV> PointMatrixType;\n  typedef Eigen::PlainObjectBase<DerivedF> FaceMatrixType;\n  typedef std::map<EdgeKey, unsigned>  MyMap;\n  typedef typename MyMap::const_iterator   MyMapIterator;\n  \npublic:\n  MarchingCubes(const Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 1> &values,\n                const Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 3> &points,\n                const unsigned x_res,\n                const unsigned y_res,\n                const unsigned z_res,\n                PointMatrixType &vertices,\n                FaceMatrixType &faces)\n  {\n    \n    if(x_res <2 || y_res<2 ||z_res<2)\n      return;\n    faces.resize(10000,3);\n    int num_faces = 0;\n    \n    vertices.resize(10000,3);\n    int num_vertices = 0;\n    \n    \n    unsigned n_cubes  = (x_res-1) * (y_res-1) * (z_res-1);\n    assert(unsigned(points.rows()) == x_res * y_res * z_res);\n    \n    unsigned int         offsets_[8];\n    offsets_[0] = 0;\n    offsets_[1] = 1;\n    offsets_[2] = 1 + x_res;\n    offsets_[3] =     x_res;\n    offsets_[4] =             x_res*y_res;\n    offsets_[5] = 1         + x_res*y_res;\n    offsets_[6] = 1 + x_res + x_res*y_res;\n    offsets_[7] =     x_res + x_res*y_res;\n    \n    for (unsigned cube_it =0 ; cube_it < n_cubes; ++cube_it)\n    {\n      \n      unsigned         corner[8];\n      typename DerivedF::Scalar samples[12];\n      unsigned char    cubetype(0);\n      unsigned int     i;\n      \n      \n      // get point indices of corner vertices\n      for (i=0; i<8; ++i)\n      {\n        // get cube coordinates\n        unsigned int _idx = cube_it;\n        unsigned int X(x_res-1), Y(y_res-1);\n        unsigned int x = _idx % X;  _idx /= X;\n        unsigned int y = _idx % Y;  _idx /= Y;\n        unsigned int z = _idx;\n        \n        // transform to point coordinates\n        _idx = x + y*x_res + z*x_res*y_res;\n        \n        // add offset\n        corner[i] = _idx + offsets_[i];\n      }\n      \n      \n      // determine cube type\n      for (i=0; i<8; ++i)\n        if (values[corner[i]] > 0.0)\n          cubetype |= (1<<i);\n      \n      \n      // trivial reject ?\n      if (cubetype == 0 || cubetype == 255)\n        continue;\n      \n      \n      // compute samples on cube's edges\n      if (edgeTable[cubetype]&1)  \n        samples[0]  = add_vertex(values, points, corner[0], corner[1], vertices, num_vertices, edge2vertex);\n      if (edgeTable[cubetype]&2)  \n        samples[1]  = add_vertex(values, points, corner[1], corner[2], vertices, num_vertices, edge2vertex);\n      if (edgeTable[cubetype]&4)  \n        samples[2]  = add_vertex(values, points, corner[3], corner[2], vertices, num_vertices, edge2vertex);\n      if (edgeTable[cubetype]&8)  \n        samples[3]  = add_vertex(values, points, corner[0], corner[3], vertices, num_vertices, edge2vertex);\n      if (edgeTable[cubetype]&16) \n        samples[4]  = add_vertex(values, points, corner[4], corner[5], vertices, num_vertices, edge2vertex);\n      if (edgeTable[cubetype]&32)  \n        samples[5]  = add_vertex(values, points, corner[5], corner[6], vertices, num_vertices, edge2vertex);\n      if (edgeTable[cubetype]&64)  \n        samples[6]  = add_vertex(values, points, corner[7], corner[6], vertices, num_vertices, edge2vertex);\n      if (edgeTable[cubetype]&128) \n        samples[7]  = add_vertex(values, points, corner[4], corner[7], vertices, num_vertices, edge2vertex);\n      if (edgeTable[cubetype]&256) \n        samples[8]  = add_vertex(values, points, corner[0], corner[4], vertices, num_vertices, edge2vertex);\n      if (edgeTable[cubetype]&512) \n        samples[9]  = add_vertex(values, points, corner[1], corner[5], vertices, num_vertices, edge2vertex);\n      if (edgeTable[cubetype]&1024)\n        samples[10] = add_vertex(values, points, corner[2], corner[6], vertices, num_vertices, edge2vertex);\n      if (edgeTable[cubetype]&2048)\n        samples[11] = add_vertex(values, points, corner[3], corner[7], vertices, num_vertices, edge2vertex);\n      \n      \n      \n      // connect samples by triangles\n      for (i=0; triTable[cubetype][0][i] != -1; i+=3 )\n      {\n        num_faces++;\n        if (num_faces > faces.rows())\n          faces.conservativeResize(faces.rows()+10000, Eigen::NoChange);\n        \n        faces.row(num_faces-1) << \n        samples[triTable[cubetype][0][i  ]],\n        samples[triTable[cubetype][0][i+1]],\n        samples[triTable[cubetype][0][i+2]];\n        \n      }\n      \n    }\n    \n    vertices.conservativeResize(num_vertices, Eigen::NoChange);\n    faces.conservativeResize(num_faces, Eigen::NoChange);\n    \n  };\n  \n  static typename DerivedF::Scalar  add_vertex(const Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 1> &values,\n                                               const Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 3> &points,\n                                               unsigned int i0,\n                                               unsigned int i1,\n                                               PointMatrixType &vertices,\n                                               int &num_vertices,\n                                               MyMap &edge2vertex)\n  {\n    // find vertex if it has been computed already\n    MyMapIterator it = edge2vertex.find(EdgeKey(i0, i1));\n    if (it != edge2vertex.end()) \n      return it->second;\n    ;\n    \n    // generate new vertex\n    const Eigen::Matrix<typename DerivedV::Scalar, 1, 3> & p0 = points.row(i0);\n    const Eigen::Matrix<typename DerivedV::Scalar, 1, 3> & p1 = points.row(i1);\n    \n    typename DerivedV::Scalar s0 = fabs(values[i0]);\n    typename DerivedV::Scalar s1 = fabs(values[i1]);\n    typename DerivedV::Scalar t  = s0 / (s0+s1);\n    \n    \n    num_vertices++;\n    if (num_vertices > vertices.rows())\n      vertices.conservativeResize(vertices.rows()+10000, Eigen::NoChange);\n    \n    vertices.row(num_vertices-1)  = (1.0f-t)*p0 + t*p1;\n    edge2vertex[EdgeKey(i0, i1)] = num_vertices-1;\n    \n    return num_vertices-1;\n  }\n  ;\n  \n  // maps an edge to the sample vertex generated on it\n  MyMap  edge2vertex;\n};\n\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::marching_cubes(const Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 1> &values,\n                                    const Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 3> &points,\n                                    const unsigned x_res,\n                                    const unsigned y_res,\n                                    const unsigned z_res,\n                                    Eigen::PlainObjectBase<DerivedV> &vertices,\n                                    Eigen::PlainObjectBase<DerivedF> &faces)\n{\n  MarchingCubes<DerivedV, DerivedF> mc(values, \n                                       points, \n                                       x_res, \n                                       y_res, \n                                       z_res, \n                                       vertices, \n                                       faces);\n}\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template specialization\ntemplate void igl::marching_cubes<Eigen::Matrix<float, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::Matrix<Eigen::Matrix<float, -1, 3, 0, -1, 3>::Scalar, -1, 1, 0, -1, 1> const&, Eigen::Matrix<Eigen::Matrix<float, -1, 3, 0, -1, 3>::Scalar, -1, 3, 0, -1, 3> const&, unsigned int, unsigned int, unsigned int, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&);\ntemplate void igl::marching_cubes<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::Matrix<Eigen::Matrix<double, -1, 3, 0, -1, 3>::Scalar, -1, 1, 0, -1, 1> const&, Eigen::Matrix<Eigen::Matrix<double, -1, 3, 0, -1, 3>::Scalar, -1, 3, 0, -1, 3> const&, unsigned int, unsigned int, unsigned int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&);\ntemplate void igl::marching_cubes<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<unsigned int, -1, 3, 0, -1, 3> >(Eigen::Matrix<Eigen::Matrix<double, -1, 3, 0, -1, 3>::Scalar, -1, 1, 0, -1, 1> const&, Eigen::Matrix<Eigen::Matrix<double, -1, 3, 0, -1, 3>::Scalar, -1, 3, 0, -1, 3> const&, unsigned int, unsigned int, unsigned int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<unsigned int, -1, 3, 0, -1, 3> >&);\ntemplate void igl::marching_cubes<Eigen::Matrix<float, -1, 3, 0, -1, 3>, Eigen::Matrix<unsigned int, -1, 3, 0, -1, 3> >(Eigen::Matrix<Eigen::Matrix<float, -1, 3, 0, -1, 3>::Scalar, -1, 1, 0, -1, 1> const&, Eigen::Matrix<Eigen::Matrix<float, -1, 3, 0, -1, 3>::Scalar, -1, 3, 0, -1, 3> const&, unsigned int, unsigned int, unsigned int, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<unsigned int, -1, 3, 0, -1, 3> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/marching_cubes.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_MARCHINGCUBES_H\n#define IGL_MARCHINGCUBES_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Core>\nnamespace igl \n{\n  // marching_cubes( values, points, x_res, y_res, z_res, vertices, faces )\n  //\n  // performs marching cubes reconstruction on the grid defined by values, and\n  // points, and generates vertices and faces\n  //\n  // Input:\n  //  xres, yres, zres  resolutions of the grid in x,y,z dimensions\n  //  values  #number_of_grid_points x 1 array -- the scalar values of an\n  //    implicit function defined on the grid points (<0 in the inside of the\n  //    surface, 0 on the border, >0 outside)\n  //  points  #number_of_grid_points x 3 array -- 3-D positions of the grid\n  //    points, ordered in x,y,z order:\n  //      points[index] = the point at (x,y,z) where :\n  //      x = (index % (xres -1), \n  //      y = (index / (xres-1)) %(yres-1),\n  //      z = index / (xres -1) / (yres -1) ).\n  //      where x,y,z index x, y, z dimensions\n  //      i.e. index = x + y*xres + z*xres*yres\n  // Output:\n  //   vertices  #V by 3 list of mesh vertex positions\n  //   faces  #F by 3 list of mesh triangle indices\n  //\n  template <typename DerivedV, typename DerivedF>\n  IGL_INLINE void marching_cubes(\n    const Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 1> &values,\n    const Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 3> &points,\n    const unsigned x_res,\n    const unsigned y_res,\n    const unsigned z_res,\n    Eigen::PlainObjectBase<DerivedV> &vertices,\n    Eigen::PlainObjectBase<DerivedF> &faces);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"marching_cubes.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/massmatrix.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"massmatrix.h\"\n#include \"normalize_row_sums.h\"\n#include \"sparse.h\"\n#include \"doublearea.h\"\n#include \"repmat.h\"\n#include <Eigen/Geometry>\n#include <iostream>\n\ntemplate <typename DerivedV, typename DerivedF, typename Scalar>\nIGL_INLINE void igl::massmatrix(\n  const Eigen::MatrixBase<DerivedV> & V, \n  const Eigen::MatrixBase<DerivedF> & F, \n  const MassMatrixType type,\n  Eigen::SparseMatrix<Scalar>& M)\n{\n  using namespace Eigen;\n  using namespace std;\n\n  const int n = V.rows();\n  const int m = F.rows();\n  const int simplex_size = F.cols();\n\n  MassMatrixType eff_type = type;\n  // Use voronoi of for triangles by default, otherwise barycentric\n  if(type == MASSMATRIX_TYPE_DEFAULT)\n  {\n    eff_type = (simplex_size == 3?MASSMATRIX_TYPE_VORONOI:MASSMATRIX_TYPE_BARYCENTRIC);\n  }\n\n  // Not yet supported\n  assert(type!=MASSMATRIX_TYPE_FULL);\n\n  Matrix<int,Dynamic,1> MI;\n  Matrix<int,Dynamic,1> MJ;\n  Matrix<Scalar,Dynamic,1> MV;\n  if(simplex_size == 3)\n  {\n    // Triangles\n    // edge lengths numbered same as opposite vertices\n    Matrix<Scalar,Dynamic,3> l(m,3);\n    // loop over faces\n    for(int i = 0;i<m;i++)\n    {\n      l(i,0) = (V.row(F(i,1))-V.row(F(i,2))).norm();\n      l(i,1) = (V.row(F(i,2))-V.row(F(i,0))).norm();\n      l(i,2) = (V.row(F(i,0))-V.row(F(i,1))).norm();\n    }\n    Matrix<Scalar,Dynamic,1> dblA;\n    doublearea(l,0.,dblA);\n\n    switch(eff_type)\n    {\n      case MASSMATRIX_TYPE_BARYCENTRIC:\n        // diagonal entries for each face corner\n        MI.resize(m*3,1); MJ.resize(m*3,1); MV.resize(m*3,1);\n        MI.block(0*m,0,m,1) = F.col(0);\n        MI.block(1*m,0,m,1) = F.col(1);\n        MI.block(2*m,0,m,1) = F.col(2);\n        MJ = MI;\n        repmat(dblA,3,1,MV);\n        MV.array() /= 6.0;\n        break;\n      case MASSMATRIX_TYPE_VORONOI:\n        {\n          // diagonal entries for each face corner\n          // http://www.alecjacobson.com/weblog/?p=874\n          MI.resize(m*3,1); MJ.resize(m*3,1); MV.resize(m*3,1);\n          MI.block(0*m,0,m,1) = F.col(0);\n          MI.block(1*m,0,m,1) = F.col(1);\n          MI.block(2*m,0,m,1) = F.col(2);\n          MJ = MI;\n\n          // Holy shit this needs to be cleaned up and optimized\n          Matrix<Scalar,Dynamic,3> cosines(m,3);\n          cosines.col(0) = \n            (l.col(2).array().pow(2)+l.col(1).array().pow(2)-l.col(0).array().pow(2))/(l.col(1).array()*l.col(2).array()*2.0);\n          cosines.col(1) = \n            (l.col(0).array().pow(2)+l.col(2).array().pow(2)-l.col(1).array().pow(2))/(l.col(2).array()*l.col(0).array()*2.0);\n          cosines.col(2) = \n            (l.col(1).array().pow(2)+l.col(0).array().pow(2)-l.col(2).array().pow(2))/(l.col(0).array()*l.col(1).array()*2.0);\n          Matrix<Scalar,Dynamic,3> barycentric = cosines.array() * l.array();\n          normalize_row_sums(barycentric,barycentric);\n          Matrix<Scalar,Dynamic,3> partial = barycentric;\n          partial.col(0).array() *= dblA.array() * 0.5;\n          partial.col(1).array() *= dblA.array() * 0.5;\n          partial.col(2).array() *= dblA.array() * 0.5;\n          Matrix<Scalar,Dynamic,3> quads(partial.rows(),partial.cols());\n          quads.col(0) = (partial.col(1)+partial.col(2))*0.5;\n          quads.col(1) = (partial.col(2)+partial.col(0))*0.5;\n          quads.col(2) = (partial.col(0)+partial.col(1))*0.5;\n\n          quads.col(0) = (cosines.col(0).array()<0).select( 0.25*dblA,quads.col(0));\n          quads.col(1) = (cosines.col(0).array()<0).select(0.125*dblA,quads.col(1));\n          quads.col(2) = (cosines.col(0).array()<0).select(0.125*dblA,quads.col(2));\n\n          quads.col(0) = (cosines.col(1).array()<0).select(0.125*dblA,quads.col(0));\n          quads.col(1) = (cosines.col(1).array()<0).select(0.25*dblA,quads.col(1));\n          quads.col(2) = (cosines.col(1).array()<0).select(0.125*dblA,quads.col(2));\n\n          quads.col(0) = (cosines.col(2).array()<0).select(0.125*dblA,quads.col(0));\n          quads.col(1) = (cosines.col(2).array()<0).select(0.125*dblA,quads.col(1));\n          quads.col(2) = (cosines.col(2).array()<0).select( 0.25*dblA,quads.col(2));\n\n          MV.block(0*m,0,m,1) = quads.col(0);\n          MV.block(1*m,0,m,1) = quads.col(1);\n          MV.block(2*m,0,m,1) = quads.col(2);\n          \n          break;\n        }\n      case MASSMATRIX_TYPE_FULL:\n        assert(false && \"Implementation incomplete\");\n        break;\n      default:\n        assert(false && \"Unknown Mass matrix eff_type\");\n    }\n\n  }else if(simplex_size == 4)\n  {\n    assert(V.cols() == 3);\n    assert(eff_type == MASSMATRIX_TYPE_BARYCENTRIC);\n    MI.resize(m*4,1); MJ.resize(m*4,1); MV.resize(m*4,1);\n    MI.block(0*m,0,m,1) = F.col(0);\n    MI.block(1*m,0,m,1) = F.col(1);\n    MI.block(2*m,0,m,1) = F.col(2);\n    MI.block(3*m,0,m,1) = F.col(3);\n    MJ = MI;\n    // loop over tets\n    for(int i = 0;i<m;i++)\n    {\n      // http://en.wikipedia.org/wiki/Tetrahedron#Volume\n      Matrix<Scalar,3,1> v0m3,v1m3,v2m3;\n      v0m3.head(V.cols()) = V.row(F(i,0)) - V.row(F(i,3));\n      v1m3.head(V.cols()) = V.row(F(i,1)) - V.row(F(i,3));\n      v2m3.head(V.cols()) = V.row(F(i,2)) - V.row(F(i,3));\n      Scalar v = fabs(v0m3.dot(v1m3.cross(v2m3)))/6.0;\n      MV(i+0*m) = v/4.0;\n      MV(i+1*m) = v/4.0;\n      MV(i+2*m) = v/4.0;\n      MV(i+3*m) = v/4.0;\n    }\n  }else\n  {\n    // Unsupported simplex size\n    assert(false && \"Unsupported simplex size\");\n  }\n  sparse(MI,MJ,MV,n,n,M);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::massmatrix<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, double>(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, igl::MassMatrixType, Eigen::SparseMatrix<double, 0, int>&);\n// generated by autoexplicit.sh\ntemplate void igl::massmatrix<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 4, 0, -1, 4>, double>(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 4, 0, -1, 4> > const&, igl::MassMatrixType, Eigen::SparseMatrix<double, 0, int>&);\n// generated by autoexplicit.sh\ntemplate void igl::massmatrix<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, double>(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, igl::MassMatrixType, Eigen::SparseMatrix<double, 0, int>&);\ntemplate void igl::massmatrix<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 3, 1, -1, 3>, double>(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&, igl::MassMatrixType, Eigen::SparseMatrix<double, 0, int>&);\ntemplate void igl::massmatrix<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, double>(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, igl::MassMatrixType, Eigen::SparseMatrix<double, 0, int>&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/massmatrix.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_MASSMATRIX_TYPE_H\n#define IGL_MASSMATRIX_TYPE_H\n#include \"igl_inline.h\"\n\n#define EIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET\n#include <Eigen/Dense>\n#include <Eigen/Sparse>\n\nnamespace igl \n{\n\n  enum MassMatrixType\n  {\n    MASSMATRIX_TYPE_BARYCENTRIC = 0,\n    MASSMATRIX_TYPE_VORONOI = 1,\n    MASSMATRIX_TYPE_FULL = 2,\n    MASSMATRIX_TYPE_DEFAULT = 3,\n    NUM_MASSMATRIX_TYPE = 4\n  };\n\n  // Constructs the mass (area) matrix for a given mesh (V,F).\n  //\n  // Templates:\n  //   DerivedV  derived type of eigen matrix for V (e.g. derived from\n  //     MatrixXd)\n  //   DerivedF  derived type of eigen matrix for F (e.g. derived from\n  //     MatrixXi)\n  //   Scalar  scalar type for eigen sparse matrix (e.g. double)\n  // Inputs:\n  //   V  #V by dim list of mesh vertex positions\n  //   F  #F by simplex_size list of mesh faces (must be triangles)\n  //   type  one of the following ints:\n  //     MASSMATRIX_TYPE_BARYCENTRIC  barycentric\n  //     MASSMATRIX_TYPE_VORONOI voronoi-hybrid {default}\n  //     MASSMATRIX_TYPE_FULL full {not implemented}\n  // Outputs: \n  //   M  #V by #V mass matrix\n  //\n  // See also: adjacency_matrix\n  //\n  template <typename DerivedV, typename DerivedF, typename Scalar>\n  IGL_INLINE void massmatrix(\n    const Eigen::MatrixBase<DerivedV> & V, \n    const Eigen::MatrixBase<DerivedF> & F, \n    const MassMatrixType type,\n    Eigen::SparseMatrix<Scalar>& M);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"massmatrix.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/mat_max.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"mat_max.h\"\n\ntemplate <typename DerivedX, typename DerivedY, typename DerivedI>\nIGL_INLINE void igl::mat_max(\n  const Eigen::DenseBase<DerivedX> & X,\n  const int dim,\n  Eigen::PlainObjectBase<DerivedY> & Y,\n  Eigen::PlainObjectBase<DerivedI> & I)\n{\n  assert(dim==1||dim==2);\n\n  // output size\n  int n = (dim==1?X.cols():X.rows());\n  // resize output\n  Y.resize(n);\n  I.resize(n);\n\n  // loop over dimension opposite of dim\n  for(int j = 0;j<n;j++)\n  {\n    typename DerivedX::Index PHONY,i;\n    typename DerivedX::Scalar  m;\n    if(dim==1)\n    {\n      m = X.col(j).maxCoeff(&i,&PHONY);\n    }else\n    {\n      m = X.row(j).maxCoeff(&PHONY,&i);\n    }\n    Y(j) = m;\n    I(j) = i;\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::mat_max<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/mat_max.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_MAT_MAX_H\n#define IGL_MAT_MAX_H\n#include \"igl_inline.h\"\n#include <Eigen/Dense>\n\nnamespace igl\n{\n  // Ideally this becomes a super overloaded function supporting everything\n  // that matlab's max supports\n\n  // Max function for matrices to act like matlab's max function. Specifically\n  // like [Y,I] = max(X,[],dim);\n  //\n  // Templates:\n  //   T  should be a eigen matrix primitive type like int or double\n  // Inputs:\n  //   X  m by n matrix\n  //   dim  dimension along which to take max\n  // Outputs:\n  //   Y  n-long vector (if dim == 1) \n  //   or\n  //   Y  m-long vector (if dim == 2)\n  //   I  vector the same size as Y containing the indices along dim of maximum\n  //     entries\n  template <typename DerivedX, typename DerivedY, typename DerivedI>\n  IGL_INLINE void mat_max(\n    const Eigen::DenseBase<DerivedX> & X,\n    const int dim,\n    Eigen::PlainObjectBase<DerivedY> & Y,\n    Eigen::PlainObjectBase<DerivedI> & I);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"mat_max.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/mat_min.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"mat_min.h\"\n\ntemplate <typename DerivedX, typename DerivedY, typename DerivedI>\nIGL_INLINE void igl::mat_min(\n  const Eigen::DenseBase<DerivedX> & X,\n  const int dim,\n  Eigen::PlainObjectBase<DerivedY> & Y,\n  Eigen::PlainObjectBase<DerivedI> & I)\n{\n  assert(dim==1||dim==2);\n\n  // output size\n  int n = (dim==1?X.cols():X.rows());\n  // resize output\n  Y.resize(n);\n  I.resize(n);\n\n  // loop over dimension opposite of dim\n  for(int j = 0;j<n;j++)\n  {\n    typename DerivedX::Index PHONY,i;\n    typename DerivedX::Scalar  m;\n    if(dim==1)\n    {\n      m = X.col(j).minCoeff(&i,&PHONY);\n    }else\n    {\n      m = X.row(j).minCoeff(&PHONY,&i);\n    }\n    Y(j) = m;\n    I(j) = i;\n  }\n}\n\n//template <typename T>\n//IGL_INLINE Eigen::Matrix<T,Eigen::Dynamic,1> igl::mat_min(\n//  const Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> & X,\n//  const int dim)\n//{\n//  Eigen::Matrix<T,Eigen::Dynamic,1> Y;\n//  Eigen::Matrix<int,Eigen::Dynamic,1> I;\n//  mat_min(X,dim,Y,I);\n//  return Y;\n//}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::mat_min<Eigen::Array<bool, -1, 3, 0, -1, 3>, Eigen::Array<bool, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Array<bool, -1, 3, 0, -1, 3> > const&, int, Eigen::PlainObjectBase<Eigen::Array<bool, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::mat_min<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/mat_min.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_MAT_MIN_H\n#define IGL_MAT_MIN_H\n#include \"igl_inline.h\"\n#include <Eigen/Dense>\n\nnamespace igl\n{\n  // Ideally this becomes a super overloaded function supporting everything\n  // that matlab's min supports\n\n  // Min function for matrices to act like matlab's min function. Specifically\n  // like [Y,I] = min(X,[],dim);\n  //\n  // Templates:\n  //   T  should be a eigen matrix primitive type like int or double\n  // Inputs:\n  //   X  m by n matrix\n  //   dim  dimension along which to take min \n  // Outputs:\n  //   Y  n-long sparse vector (if dim == 1) \n  //   or\n  //   Y  m-long sparse vector (if dim == 2)\n  //   I  vector the same size as Y containing the indices along dim of minimum\n  //     entries\n  //\n  // See also: mat_max\n  template <typename DerivedX, typename DerivedY, typename DerivedI>\n  IGL_INLINE void mat_min(\n    const Eigen::DenseBase<DerivedX> & X,\n    const int dim,\n    Eigen::PlainObjectBase<DerivedY> & Y,\n    Eigen::PlainObjectBase<DerivedI> & I);\n  // Use Y = X.colwise().minCoeff() instead\n  //// In-line wrapper\n  //template <typename T>\n  //IGL_INLINE Eigen::Matrix<T,Eigen::Dynamic,1> mat_min(\n  //  const Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> & X,\n  //  const int dim);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"mat_min.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/mat_to_quat.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"mat_to_quat.h\"\n#include <cmath>\n\n// This could be replaced by something fast\ntemplate <typename Q_type>\nstatic inline Q_type ReciprocalSqrt( const Q_type x )\n{\n  return 1.0/sqrt(x);\n}\n\n//// Converts row major order matrix to quat\n//// http://software.intel.com/sites/default/files/m/d/4/1/d/8/293748.pdf\n//template <typename Q_type>\n//IGL_INLINE void igl::mat4_to_quat(const Q_type * m, Q_type * q)\n//{\n//  Q_type t = + m[0 * 4 + 0] + m[1 * 4 + 1] + m[2 * 4 + 2] + 1.0f; \n//  Q_type s = ReciprocalSqrt( t ) * 0.5f;\n//  q[3] = s * t;\n//  q[2] = ( m[0 * 4 + 1] - m[1 * 4 + 0] ) * s; \n//  q[1] = ( m[2 * 4 + 0] - m[0 * 4 + 2] ) * s; \n//  q[0] = ( m[1 * 4 + 2] - m[2 * 4 + 1] ) * s;\n//}\n\n// https://bmgame.googlecode.com/svn/idlib/math/Simd_AltiVec.cpp\ntemplate <typename Q_type>\nIGL_INLINE void igl::mat4_to_quat(const Q_type * mat, Q_type * q)\n{\n  Q_type trace;\n  Q_type s;\n  Q_type t;\n  int i;\n  int j;\n  int k;\n  \n  static int next[3] = { 1, 2, 0 };\n\n  trace = mat[0 * 4 + 0] + mat[1 * 4 + 1] + mat[2 * 4 + 2];\n\n  if ( trace > 0.0f ) {\n\n    t = trace + 1.0f;\n    s = ReciprocalSqrt( t ) * 0.5f;\n\n    q[3] = s * t;\n    q[0] = ( mat[1 * 4 + 2] - mat[2 * 4 + 1] ) * s;\n    q[1] = ( mat[2 * 4 + 0] - mat[0 * 4 + 2] ) * s;\n    q[2] = ( mat[0 * 4 + 1] - mat[1 * 4 + 0] ) * s;\n\n  } else {\n\n    i = 0;\n    if ( mat[1 * 4 + 1] > mat[0 * 4 + 0] ) {\n      i = 1;\n    }\n    if ( mat[2 * 4 + 2] > mat[i * 4 + i] ) {\n      i = 2;\n    }\n    j = next[i];\n    k = next[j];\n\n    t = ( mat[i * 4 + i] - ( mat[j * 4 + j] + mat[k * 4 + k] ) ) + 1.0f;\n    s = ReciprocalSqrt( t ) * 0.5f;\n\n    q[i] = s * t;\n    q[3] = ( mat[j * 4 + k] - mat[k * 4 + j] ) * s;\n    q[j] = ( mat[i * 4 + j] + mat[j * 4 + i] ) * s;\n    q[k] = ( mat[i * 4 + k] + mat[k * 4 + i] ) * s;\n  }\n\n  //// Unused translation\n  //jq.t[0] = mat[0 * 4 + 3];\n  //jq.t[1] = mat[1 * 4 + 3];\n  //jq.t[2] = mat[2 * 4 + 3];\n}\n\ntemplate <typename Q_type>\nIGL_INLINE void igl::mat3_to_quat(const Q_type * mat, Q_type * q)\n{\n  Q_type trace;\n  Q_type s;\n  Q_type t;\n  int i;\n  int j;\n  int k;\n  \n  static int next[3] = { 1, 2, 0 };\n\n  trace = mat[0 * 3 + 0] + mat[1 * 3 + 1] + mat[2 * 3 + 2];\n\n  if ( trace > 0.0f ) {\n\n    t = trace + 1.0f;\n    s = ReciprocalSqrt( t ) * 0.5f;\n\n    q[3] = s * t;\n    q[0] = ( mat[1 * 3 + 2] - mat[2 * 3 + 1] ) * s;\n    q[1] = ( mat[2 * 3 + 0] - mat[0 * 3 + 2] ) * s;\n    q[2] = ( mat[0 * 3 + 1] - mat[1 * 3 + 0] ) * s;\n\n  } else {\n\n    i = 0;\n    if ( mat[1 * 3 + 1] > mat[0 * 3 + 0] ) {\n      i = 1;\n    }\n    if ( mat[2 * 3 + 2] > mat[i * 3 + i] ) {\n      i = 2;\n    }\n    j = next[i];\n    k = next[j];\n\n    t = ( mat[i * 3 + i] - ( mat[j * 3 + j] + mat[k * 3 + k] ) ) + 1.0f;\n    s = ReciprocalSqrt( t ) * 0.5f;\n\n    q[i] = s * t;\n    q[3] = ( mat[j * 3 + k] - mat[k * 3 + j] ) * s;\n    q[j] = ( mat[i * 3 + j] + mat[j * 3 + i] ) * s;\n    q[k] = ( mat[i * 3 + k] + mat[k * 3 + i] ) * s;\n  }\n\n  //// Unused translation\n  //jq.t[0] = mat[0 * 4 + 3];\n  //jq.t[1] = mat[1 * 4 + 3];\n  //jq.t[2] = mat[2 * 4 + 3];\n}\n\n\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::mat4_to_quat<double>(double const*, double*);\ntemplate void igl::mat4_to_quat<float>(float const*, float*);\ntemplate void igl::mat3_to_quat<double>(double const*, double*);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/mat_to_quat.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_MAT_TO_QUAT_H\n#define IGL_MAT_TO_QUAT_H\n#include \"igl_inline.h\"\nnamespace igl\n{\n  // Convert a OpenGL (rotation) matrix to a quaternion\n  //\n  // Input:\n  //   m  16-element opengl rotation matrix\n  // Output:\n  //   q  4-element  quaternion (not normalized)\n  template <typename Q_type>\n  IGL_INLINE void mat4_to_quat(const Q_type * m, Q_type * q);\n  // Input:\n  //   m  9-element opengl rotation matrix\n  template <typename Q_type>\n  IGL_INLINE void mat3_to_quat(const Q_type * m, Q_type * q);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"mat_to_quat.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/material_colors.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_MATERIAL_COLORS_H\n#define IGL_MATERIAL_COLORS_H\n#include <Eigen/Core>\n// Define constant material colors for use with opengl glMaterialfv\n// Most of these colors come from IGL publications\nnamespace igl\n{\n  // Gold/Silver used in BBW/MONO/STBS/FAST\n  const float GOLD_AMBIENT[4] =   {  51.0/255.0, 43.0/255.0,33.3/255.0,1.0f };\n  const float GOLD_DIFFUSE[4] =   { 255.0/255.0,228.0/255.0,58.0/255.0,1.0f };\n  const float GOLD_SPECULAR[4] =  { 255.0/255.0,235.0/255.0,80.0/255.0,1.0f };\n  const float SILVER_AMBIENT[4] = { 0.2f, 0.2f, 0.2f, 1.0f };\n  const float SILVER_DIFFUSE[4] = { 1.0f, 1.0f, 1.0f, 1.0f };\n  const float SILVER_SPECULAR[4] = { 1.0f, 1.0f, 1.0f, 1.0f };\n  // Blue/Cyan more similar to Jovan Popovic's blue than to Mario Botsch's blue\n  const float CYAN_AMBIENT[4] =   {  59.0/255.0, 68.0/255.0,255.0/255.0,1.0f };\n  const float CYAN_DIFFUSE[4] =   {  94.0/255.0,185.0/255.0,238.0/255.0,1.0f };\n  const float CYAN_SPECULAR[4] =   { 163.0/255.0,221.0/255.0,255.0/255.0,1.0f };\n  const float DENIS_PURPLE_DIFFUSE[4] =   { 80.0/255.0,64.0/255.0,255.0/255.0,1.0f };\n  const float LADISLAV_ORANGE_DIFFUSE[4] = {1.0f, 125.0f / 255.0f, 19.0f / 255.0f, 0.0f};\n  // FAST armadillos colors\n  const float FAST_GREEN_DIFFUSE[4] = { 113.0f/255.0f, 239.0f/255.0f,  46.0f/255.0f, 1.0f};\n  const float FAST_RED_DIFFUSE[4]   = { 255.0f/255.0f,  65.0f/255.0f,  46.0f/255.0f, 1.0f};\n  const float FAST_BLUE_DIFFUSE[4]  = { 106.0f/255.0f, 106.0f/255.0f, 255.0f/255.0f, 1.0f};\n  const float FAST_GRAY_DIFFUSE[4]  = { 150.0f/255.0f, 150.0f/255.0f, 150.0f/255.0f, 1.0f};\n  // Basic colors\n  const float WHITE[4] =   { 255.0/255.0,255.0/255.0,255.0/255.0,1.0f };\n  const float BLACK[4] =   { 0.0/255.0,0.0/255.0,0.0/255.0,1.0f };\n  const float WHITE_AMBIENT[4] =   { 255.0/255.0,255.0/255.0,255.0/255.0,1.0f };\n  const float WHITE_DIFFUSE[4] =   { 255.0/255.0,255.0/255.0,255.0/255.0,1.0f };\n  const float WHITE_SPECULAR[4] =  { 255.0/255.0,255.0/255.0,255.0/255.0,1.0f };\n  const float BBW_POINT_COLOR[4] = {239./255.,213./255.,46./255.,255.0/255.0};\n  const float BBW_LINE_COLOR[4] = {106./255.,106./255.,255./255.,255./255.};\n  const float MIDNIGHT_BLUE_DIFFUSE[4]  = { 21.0f/255.0f, 27.0f/255.0f, 84.0f/255.0f, 1.0f};\n  // Winding number colors\n  const float EASTER_RED_DIFFUSE[4] = {0.603922,0.494118f,0.603922f,1.0f};\n  const float WN_OPEN_BOUNDARY_COLOR[4] = {154./255.,0./255.,0./255.,1.0f};\n  const float WN_NON_MANIFOLD_EDGE_COLOR[4] = {201./255., 51./255.,255./255.,1.0f};\n  const Eigen::Vector4f \n    MAYA_GREEN(128./255.,242./255.,0./255.,1.),\n    MAYA_YELLOW(255./255.,247./255.,50./255.,1.),\n    MAYA_RED(234./255.,63./255.,52./255.,1.),\n    MAYA_BLUE(0./255.,73./255.,252./255.,1.),\n    MAYA_PURPLE(180./255.,73./255.,200./255.,1.),\n    MAYA_VIOLET(31./255.,15./255.,66./255.,1.),\n    MAYA_GREY(0.5,0.5,0.5,1.0),\n    MAYA_CYAN(131./255.,219./255.,252./255.,1.),\n    MAYA_SEA_GREEN(70./255.,252./255.,167./255.,1.);\n}\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/matlab/MatlabWorkspace.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_MATLAB_MATLAB_WORKSPACE_H\n#define IGL_MATLAB_MATLAB_WORKSPACE_H\n\n#include <Eigen/Dense>\n#include <Eigen/Sparse>\n\n#include <mat.h>\n\n#include <string>\n#include <vector>\n\nnamespace igl\n{\n  namespace matlab\n  {\n    // It would be really great to replicate this for a simple XML-based\n    // workspace.\n    //\n    // Class which contains data of a matlab workspace which can be written to a\n    // .mat file and loaded from matlab\n    // \n    // This depends on matlab at compile time (though it shouldn't necessarily\n    // have to) but it does not depend on running the matlab engine at run-time.\n    //\n    // Known bugs: Treats all matrices as doubles (this may actually be desired\n    // for some \"index\" matrices since matlab's sparse command takes doubles\n    // rather than int class matrices). It is of course not desired when dealing\n    // with logicals or uint's for images.\n    class MatlabWorkspace\n    {\n      private:\n        // KNOWN BUG: Why not use a map? Any reason to allow duplicate names?\n        //\n        // List of names\n        std::vector<std::string> names;\n        // List of data pointers\n        std::vector<mxArray*> data;\n      public:\n        MatlabWorkspace();\n        ~MatlabWorkspace();\n        // Clear names and data of variables in workspace\n        inline void clear();\n        // Save current list of variables\n        //\n        // Inputs:\n        //   path  path to .mat file\n        // Returns true on success, false on failure\n        inline bool write(const std::string & path) const;\n        // Load list of variables from .mat file\n        //\n        // Inputs:\n        //   path  path to .mat file\n        // Returns true on success, false on failure\n        inline bool read(const std::string & path);\n        // Assign data to a variable name in the workspace\n        //\n        // Template: \n        //   DerivedM  eigen matrix (e.g. MatrixXd)\n        // Inputs:\n        //   M  data (usually a matrix)\n        //   name  variable name to save into work space\n        // Returns true on success, false on failure\n        //\n        // Known Bugs: Assumes Eigen is using column major ordering\n        template <typename DerivedM>\n        inline MatlabWorkspace& save(\n          const Eigen::PlainObjectBase<DerivedM>& M,\n          const std::string & name);\n        // Template:\n        //   MT  sparse matrix type (e.g. double)\n        template <typename MT>\n        inline MatlabWorkspace& save(\n          const Eigen::SparseMatrix<MT>& M,\n          const std::string & name);\n        // Templates:\n        //   ScalarM  scalar type, e.g. double\n        template <typename ScalarM>\n        inline MatlabWorkspace& save(\n          const std::vector<std::vector<ScalarM> > & vM,\n          const std::string & name);\n        // Templates:\n        //   ScalarV  scalar type, e.g. double\n        template <typename ScalarV>\n        inline MatlabWorkspace& save(\n          const std::vector<ScalarV> & vV,\n          const std::string & name);\n        // NOTE: Eigen stores quaternions coefficients as (i,j,k,1), but most of\n        // our matlab code stores them as (1,i,j,k) This takes a quaternion and\n        // saves it as a (1,i,j,k) row vector\n        //\n        // Templates:\n        //   Q  quaternion type\n        template <typename Q>\n        inline MatlabWorkspace& save(\n          const Eigen::Quaternion<Q> & q,\n          const std::string & name);\n        inline MatlabWorkspace& save(\n          const double d,\n          const std::string & name);\n        // Same as save() but adds 1 to each element, useful for saving \"index\"\n        // matrices like lists of faces or elements\n        template <typename DerivedM>\n        inline MatlabWorkspace& save_index(\n          const Eigen::DenseBase<DerivedM>& M,\n          const std::string & name);\n        template <typename ScalarM>\n        inline MatlabWorkspace& save_index(\n          const std::vector<std::vector<ScalarM> > & vM,\n          const std::string & name);\n        template <typename ScalarV>\n        inline MatlabWorkspace& save_index(\n          const std::vector<ScalarV> & vV,\n          const std::string & name);\n        // Find a certain matrix by name.\n        //\n        // KNOWN BUG: Outputs the first found (not necessarily unique lists).\n        //\n        // Template: \n        //   DerivedM  eigen matrix (e.g. MatrixXd)\n        // Inputs:\n        //   name  exact name of matrix as string\n        // Outputs:\n        //   M  matrix\n        // Returns true only if found.\n        template <typename DerivedM>\n        inline bool find( \n          const std::string & name,\n          Eigen::PlainObjectBase<DerivedM>& M);\n        template <typename MT>\n        inline bool find( \n          const std::string & name,\n          Eigen::SparseMatrix<MT>& M);\n        inline bool find( \n          const std::string & name,\n          double & d);\n        inline bool find( \n          const std::string & name,\n          int & v);\n        // Subtracts 1 from all entries\n        template <typename DerivedM>\n        inline bool find_index( \n          const std::string & name,\n          Eigen::PlainObjectBase<DerivedM>& M);\n    };\n  }\n}\n\n// Implementation\n\n// Be sure that this is not compiled into libigl.a\n// http://stackoverflow.com/a/3318993/148668\n\n// IGL\n#include \"igl/list_to_matrix.h\"\n\n// MATLAB\n#include \"mat.h\"\n\n// STL\n#include <iostream>\n#include <algorithm>\n#include <vector>\n\ninline igl::matlab::MatlabWorkspace::MatlabWorkspace():\n  names(),\n  data()\n{\n}\n\ninline igl::matlab::MatlabWorkspace::~MatlabWorkspace()\n{\n  // clean up data\n  clear();\n}\n\ninline void igl::matlab::MatlabWorkspace::clear()\n{\n  for_each(data.begin(),data.end(),&mxDestroyArray);\n  data.clear();\n  names.clear();\n}\n\ninline bool igl::matlab::MatlabWorkspace::write(const std::string & path) const\n{\n  using namespace std;\n  MATFile * mat_file = matOpen(path.c_str(), \"w\");\n  if(mat_file == NULL)\n  {\n    fprintf(stderr,\"Error opening file %s\\n\",path.c_str());\n    return false;\n  }\n  assert(names.size() == data.size());\n  // loop over names and data\n  for(int i = 0;i < (int)names.size(); i++)\n  {\n    // Put variable as LOCAL variable\n    int status = matPutVariable(mat_file,names[i].c_str(), data[i]);\n    if(status != 0) \n    {\n      cerr<<\"^MatlabWorkspace::save Error: matPutVariable (\"<<names[i]<<\n        \") failed\"<<endl;\n      return false;\n    } \n  }\n  if(matClose(mat_file) != 0)\n  {\n    fprintf(stderr,\"Error closing file %s\\n\",path.c_str());\n    return false;\n  }\n  return true;\n}\n\ninline bool igl::matlab::MatlabWorkspace::read(const std::string & path)\n{\n  using namespace std;\n\n  MATFile * mat_file;\n\n  mat_file = matOpen(path.c_str(), \"r\");\n  if (mat_file == NULL) \n  {\n    cerr<<\"Error: failed to open \"<<path<<endl;\n    return false;\n  }\n\n  int ndir;\n  const char ** dir = (const char **)matGetDir(mat_file, &ndir);\n  if (dir == NULL) {\n    cerr<<\"Error reading directory of file \"<< path<<endl;\n    return false;\n  }\n  mxFree(dir);\n\n  // Must close and reopen\n  if(matClose(mat_file) != 0)\n  {\n    cerr<<\"Error: failed to close file \"<<path<<endl;\n    return false;\n  }\n  mat_file = matOpen(path.c_str(), \"r\");\n  if (mat_file == NULL) \n  {\n    cerr<<\"Error: failed to open \"<<path<<endl;\n    return false;\n  }\n  \n\n  /* Read in each array. */\n  for (int i=0; i<ndir; i++) \n  {\n    const char * name;\n    mxArray * mx_data = matGetNextVariable(mat_file, &name);\n    if (mx_data == NULL) \n    {\n      cerr<<\"Error: matGetNextVariable failed in \"<<path<<endl;\n      return false;\n    } \n    const int dims = mxGetNumberOfDimensions(mx_data);\n    assert(dims == 2);\n    if(dims != 2)\n    {\n      fprintf(stderr,\"Variable '%s' has %d ≠ 2 dimensions. Skipping\\n\",\n          name,dims);\n      mxDestroyArray(mx_data);\n      continue;\n    }\n    // don't destroy\n    names.push_back(name);\n    data.push_back(mx_data);\n  }\n\n  if(matClose(mat_file) != 0)\n  {\n    cerr<<\"Error: failed to close file \"<<path<<endl;\n    return false;\n  }\n\n  return true;\n}\n\n// Treat everything as a double\ntemplate <typename DerivedM>\ninline igl::matlab::MatlabWorkspace& igl::matlab::MatlabWorkspace::save(\n  const Eigen::PlainObjectBase<DerivedM>& M,\n  const std::string & name)\n{\n  using namespace std;\n  const int m = M.rows();\n  const int n = M.cols();\n  mxArray * mx_data = mxCreateDoubleMatrix(m,n,mxREAL);\n  data.push_back(mx_data);\n  names.push_back(name);\n  // Copy data immediately\n  // Use Eigen's map and cast to copy\n  Eigen::Map< Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic> > \n    map(mxGetPr(mx_data),m,n);\n  map = M.template cast<double>();\n  return *this;\n}\n\n// Treat everything as a double\ntemplate <typename MT>\ninline igl::matlab::MatlabWorkspace& igl::matlab::MatlabWorkspace::save(\n  const Eigen::SparseMatrix<MT>& M,\n  const std::string & name)\n{\n  using namespace std;\n  const int m = M.rows();\n  const int n = M.cols();\n  // THIS WILL NOT WORK FOR ROW-MAJOR\n  assert(n==M.outerSize());\n  const int nzmax = M.nonZeros();\n  mxArray * mx_data = mxCreateSparse(m, n, nzmax, mxREAL);\n  data.push_back(mx_data);\n  names.push_back(name);\n  // Copy data immediately\n  double * pr = mxGetPr(mx_data);\n  mwIndex * ir = mxGetIr(mx_data);\n  mwIndex * jc = mxGetJc(mx_data);\n\n  // Iterate over outside\n  int k = 0;\n  for(int j=0; j<M.outerSize();j++)\n  {\n    jc[j] = k;\n    // Iterate over inside\n    for(typename Eigen::SparseMatrix<MT>::InnerIterator it (M,j); it; ++it)\n    {\n      pr[k] = it.value();\n      ir[k] = it.row();\n      k++;\n    }\n  }\n  jc[M.outerSize()] = k;\n\n  return *this;\n}\n\ntemplate <typename ScalarM>\ninline igl::matlab::MatlabWorkspace& igl::matlab::MatlabWorkspace::save(\n  const std::vector<std::vector<ScalarM> > & vM,\n  const std::string & name)\n{\n  Eigen::MatrixXd M;\n  list_to_matrix(vM,M);\n  return this->save(M,name);\n}\n\ntemplate <typename ScalarV>\ninline igl::matlab::MatlabWorkspace& igl::matlab::MatlabWorkspace::save(\n  const std::vector<ScalarV> & vV,\n  const std::string & name)\n{\n  Eigen::MatrixXd V;\n  list_to_matrix(vV,V);\n  return this->save(V,name);\n}\n\ntemplate <typename Q>\ninline igl::matlab::MatlabWorkspace& igl::matlab::MatlabWorkspace::save(\n  const Eigen::Quaternion<Q> & q,\n  const std::string & name)\n{\n  Eigen::Matrix<Q,1,4> qm;\n  qm(0,0) = q.w();\n  qm(0,1) = q.x();\n  qm(0,2) = q.y();\n  qm(0,3) = q.z();\n  return save(qm,name);\n}\n\ninline igl::matlab::MatlabWorkspace& igl::matlab::MatlabWorkspace::save(\n  const double d,\n  const std::string & name)\n{\n  Eigen::VectorXd v(1);\n  v(0) = d;\n  return save(v,name);\n}\n\ntemplate <typename DerivedM>\ninline igl::matlab::MatlabWorkspace& \n  igl::matlab::MatlabWorkspace::save_index(\n    const Eigen::DenseBase<DerivedM>& M,\n    const std::string & name)\n{\n  DerivedM Mp1 = M;\n  Mp1.array() += 1;\n  return this->save(Mp1,name);\n}\n\ntemplate <typename ScalarM>\ninline igl::matlab::MatlabWorkspace& igl::matlab::MatlabWorkspace::save_index(\n  const std::vector<std::vector<ScalarM> > & vM,\n  const std::string & name)\n{\n  Eigen::MatrixXd M;\n  list_to_matrix(vM,M);\n  return this->save_index(M,name);\n}\n\ntemplate <typename ScalarV>\ninline igl::matlab::MatlabWorkspace& igl::matlab::MatlabWorkspace::save_index(\n  const std::vector<ScalarV> & vV,\n  const std::string & name)\n{\n  Eigen::MatrixXd V;\n  list_to_matrix(vV,V);\n  return this->save_index(V,name);\n}\n\ntemplate <typename DerivedM>\ninline bool igl::matlab::MatlabWorkspace::find( \n  const std::string & name,\n  Eigen::PlainObjectBase<DerivedM>& M)\n{\n  using namespace std;\n  const int i = std::find(names.begin(), names.end(), name)-names.begin();\n  if(i>=(int)names.size())\n  {\n    return false;\n  }\n  assert(i<=(int)data.size());\n  mxArray * mx_data = data[i];\n  assert(!mxIsSparse(mx_data));\n  assert(mxGetNumberOfDimensions(mx_data) == 2);\n  //cout<<name<<\": \"<<mxGetM(mx_data)<<\" \"<<mxGetN(mx_data)<<endl;\n  const int m = mxGetM(mx_data);\n  const int n = mxGetN(mx_data);\n  // Handle vectors: in the sense that anything found becomes a column vector,\n  // whether it was column vector, row vector or matrix\n  if(DerivedM::IsVectorAtCompileTime)\n  {\n    assert(m==1 || n==1 || (m==0 && n==0));\n    M.resize(m*n,1);\n  }else\n  {\n    M.resize(m,n);\n  }\n  assert(mxGetNumberOfElements(mx_data) == M.size());\n  // Use Eigen's map and cast to copy\n  M = Eigen::Map< Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic> > \n    (mxGetPr(mx_data),M.rows(),M.cols()).cast<typename DerivedM::Scalar>();\n  return true;\n}\n\ntemplate <typename MT>\ninline bool igl::matlab::MatlabWorkspace::find( \n  const std::string & name,\n  Eigen::SparseMatrix<MT>& M)\n{\n  using namespace std;\n  using namespace Eigen;\n  const int i = std::find(names.begin(), names.end(), name)-names.begin();\n  if(i>=(int)names.size())\n  {\n    return false;\n  }\n  assert(i<=(int)data.size());\n  mxArray * mx_data = data[i];\n  // Handle boring case where matrix is actually an empty dense matrix\n  if(mxGetNumberOfElements(mx_data) == 0)\n  {\n    M.resize(0,0);\n    return true;\n  }\n  assert(mxIsSparse(mx_data));\n  assert(mxGetNumberOfDimensions(mx_data) == 2);\n  //cout<<name<<\": \"<<mxGetM(mx_data)<<\" \"<<mxGetN(mx_data)<<endl;\n  const int m = mxGetM(mx_data);\n  const int n = mxGetN(mx_data);\n\n  // Copy data immediately\n  double * pr = mxGetPr(mx_data);\n  mwIndex * ir = mxGetIr(mx_data);\n  mwIndex * jc = mxGetJc(mx_data);\n\n  vector<Triplet<MT> > MIJV;\n  MIJV.reserve(mxGetNumberOfElements(mx_data));\n\n  // Iterate over outside\n  int k = 0;\n  for(int j=0; j<n;j++)\n  {\n    // Iterate over inside\n    while(k<(int)jc[j+1])\n    {\n      //cout<<ir[k]<<\" \"<<j<<\" \"<<pr[k]<<endl;\n      assert((int)ir[k]<m);\n      assert((int)j<n);\n      MIJV.push_back(Triplet<MT >(ir[k],j,pr[k]));\n      k++;\n    }\n  }\n  M.resize(m,n);\n  M.setFromTriplets(MIJV.begin(),MIJV.end());\n  return true;\n\n}\n\ninline bool igl::matlab::MatlabWorkspace::find( \n  const std::string & name,\n  int & v)\n{\n  using namespace std;\n  const int i = std::find(names.begin(), names.end(), name)-names.begin();\n  if(i>=(int)names.size())\n  {\n    return false;\n  }\n  assert(i<=(int)data.size());\n  mxArray * mx_data = data[i];\n  assert(!mxIsSparse(mx_data));\n  assert(mxGetNumberOfDimensions(mx_data) == 2);\n  //cout<<name<<\": \"<<mxGetM(mx_data)<<\" \"<<mxGetN(mx_data)<<endl;\n  assert(mxGetNumberOfElements(mx_data) == 1);\n  copy(\n    mxGetPr(mx_data),\n    mxGetPr(mx_data)+mxGetNumberOfElements(mx_data),\n    &v);\n  return true;\n}\n\ninline bool igl::matlab::MatlabWorkspace::find( \n  const std::string & name,\n  double & d)\n{\n  using namespace std;\n  const int i = std::find(names.begin(), names.end(), name)-names.begin();\n  if(i>=(int)names.size())\n  {\n    return false;\n  }\n  assert(i<=(int)data.size());\n  mxArray * mx_data = data[i];\n  assert(!mxIsSparse(mx_data));\n  assert(mxGetNumberOfDimensions(mx_data) == 2);\n  //cout<<name<<\": \"<<mxGetM(mx_data)<<\" \"<<mxGetN(mx_data)<<endl;\n  assert(mxGetNumberOfElements(mx_data) == 1);\n  copy(\n    mxGetPr(mx_data),\n    mxGetPr(mx_data)+mxGetNumberOfElements(mx_data),\n    &d);\n  return true;\n}\n\ntemplate <typename DerivedM>\ninline bool igl::matlab::MatlabWorkspace::find_index( \n  const std::string & name,\n  Eigen::PlainObjectBase<DerivedM>& M)\n{\n  if(!find(name,M))\n  {\n    return false;\n  }\n  M.array() -= 1;\n  return true;\n}\n\n\n//template <typename Data>\n//bool igl::matlab::MatlabWorkspace::save(const Data & M, const std::string & name)\n//{\n//  using namespace std;\n//  // If I don't know the type then I can't save it\n//  cerr<<\"^MatlabWorkspace::save Error: Unknown data type. \"<<\n//    name<<\" not saved.\"<<endl;\n//  return false;\n//}\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/matlab/MexStream.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_MATLAB_MEX_STREAM_H\n#define IGL_MATLAB_MEX_STREAM_H\n#include <iostream>\nnamespace igl\n{\n  namespace matlab\n  {\n    // http://stackoverflow.com/a/249008/148668\n    \n    // Class to implement \"cout\" for mex files to print to the matlab terminal\n    // window.\n    //\n    // Insert at the beginning of mexFunction():\n    //  MexStream mout;\n    //  std::streambuf *outbuf = std::cout.rdbuf(&mout); \n    //  ...\n    //  ALWAYS restore original buffer to avoid memory leak problems in matlab\n    //  std::cout.rdbuf(outbuf);\n    //\n    class MexStream : public std::streambuf\n    {\n      public:\n      protected:\n        inline virtual std::streamsize xsputn(const char *s, std::streamsize n); \n        inline virtual int overflow(int c = EOF);\n    }; \n  }\n}\n\n// Implementation \n#include <mex.h>\ninline std::streamsize igl::matlab::MexStream::xsputn(\n  const char *s, \n  std::streamsize n) \n{\n  mexPrintf(\"%.*s\",n,s);\n  mexEvalString(\"drawnow;\"); // to dump string.\n  return n;\n}\n\ninline int igl::matlab::MexStream::overflow(int c) \n{\n    if (c != EOF) {\n      mexPrintf(\"%.1s\",&c);\n      mexEvalString(\"drawnow;\"); // to dump string.\n    }\n    return 1;\n}\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/matlab/matlabinterface.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include <igl/matlab/matlabinterface.h>\n\n// Implementation\n\n// Init the MATLAB engine\n// (no need to call it directly since it is automatically invoked by any other command)\nIGL_INLINE void igl::matlab::mlinit(Engine** mlengine)\n{\n  *mlengine = engOpen(\"\\0\");\n}\n\n// Closes the MATLAB engine\nIGL_INLINE void igl::matlab::mlclose(Engine** mlengine)\n{\n  engClose(*mlengine);\n  *mlengine = 0;\n}\n\n// Send a matrix to MATLAB\nIGL_INLINE void igl::matlab::mlsetmatrix(Engine** mlengine, std::string name, const Eigen::MatrixXd& M)\n{\n  if (*mlengine == 0)\n    mlinit(mlengine);\n\n  mxArray *A = mxCreateDoubleMatrix(M.rows(), M.cols(), mxREAL);\n  double *pM = mxGetPr(A);\n\n  int c = 0;\n  for(int j=0; j<M.cols();++j)\n    for(int i=0; i<M.rows();++i)\n      pM[c++] = double(M(i,j));\n\n  engPutVariable(*mlengine, name.c_str(), A);\n  mxDestroyArray(A);\n}\n\n// Send a matrix to MATLAB\nIGL_INLINE void igl::matlab::mlsetmatrix(Engine** mlengine, std::string name, const Eigen::MatrixXf& M)\n{\n  if (*mlengine == 0)\n    mlinit(mlengine);\n\n  mxArray *A = mxCreateDoubleMatrix(M.rows(), M.cols(), mxREAL);\n  double *pM = mxGetPr(A);\n\n  int c = 0;\n  for(int j=0; j<M.cols();++j)\n    for(int i=0; i<M.rows();++i)\n      pM[c++] = double(M(i,j));\n\n  engPutVariable(*mlengine, name.c_str(), A);\n  mxDestroyArray(A);\n}\n\n// Send a matrix to MATLAB\nIGL_INLINE void igl::matlab::mlsetmatrix(Engine** mlengine, std::string name, const Eigen::MatrixXi& M)\n{\n  if (*mlengine == 0)\n    mlinit(mlengine);\n\n  mxArray *A = mxCreateDoubleMatrix(M.rows(), M.cols(), mxREAL);\n  double *pM = mxGetPr(A);\n\n  int c = 0;\n  for(int j=0; j<M.cols();++j)\n    for(int i=0; i<M.rows();++i)\n      pM[c++] = double(M(i,j))+1;\n\n  engPutVariable(*mlengine, name.c_str(), A);\n  mxDestroyArray(A);\n}\n\n// Send a matrix to MATLAB\nIGL_INLINE void igl::matlab::mlsetmatrix(Engine** mlengine, std::string name, const Eigen::Matrix<unsigned int, Eigen::Dynamic, Eigen::Dynamic >& M)\n{\n  if (*mlengine == 0)\n    mlinit(mlengine);\n\n  mxArray *A = mxCreateDoubleMatrix(M.rows(), M.cols(), mxREAL);\n  double *pM = mxGetPr(A);\n\n  int c = 0;\n  for(int j=0; j<M.cols();++j)\n    for(int i=0; i<M.rows();++i)\n      pM[c++] = double(M(i,j))+1;\n\n  engPutVariable(*mlengine, name.c_str(), A);\n  mxDestroyArray(A);\n}\n\n// Receive a matrix from MATLAB\nIGL_INLINE void igl::matlab::mlgetmatrix(Engine** mlengine, std::string name, Eigen::MatrixXd& M)\n{\n  if (*mlengine == 0)\n    mlinit(mlengine);\n\n  unsigned long m = 0;\n  unsigned long n = 0;\n  std::vector<double> t;\n\n  mxArray *ary = engGetVariable(*mlengine, name.c_str());\n  if (ary == NULL)\n  {\n    m = 0;\n    n = 0;\n    M = Eigen::MatrixXd(0,0);\n  }\n  else\n  {\n    m = mxGetM(ary);\n    n = mxGetN(ary);\n    M = Eigen::MatrixXd(m,n);\n\n    double *pM = mxGetPr(ary);\n\n    int c = 0;\n    for(int j=0; j<M.cols();++j)\n      for(int i=0; i<M.rows();++i)\n        M(i,j) = pM[c++];\n  }\n\n  mxDestroyArray(ary);\n}\n\nIGL_INLINE void igl::matlab::mlgetmatrix(Engine** mlengine, std::string name, Eigen::MatrixXf& M)\n{\n  if (*mlengine == 0)\n    mlinit(mlengine);\n\n  unsigned long m = 0;\n  unsigned long n = 0;\n  std::vector<double> t;\n\n  mxArray *ary = engGetVariable(*mlengine, name.c_str());\n  if (ary == NULL)\n  {\n    m = 0;\n    n = 0;\n    M = Eigen::MatrixXf(0,0);\n  }\n  else\n  {\n    m = mxGetM(ary);\n    n = mxGetN(ary);\n    M = Eigen::MatrixXf(m,n);\n\n    double *pM = mxGetPr(ary);\n\n    int c = 0;\n    for(int j=0; j<M.cols();++j)\n      for(int i=0; i<M.rows();++i)\n        M(i,j) = pM[c++];\n  }\n\n  mxDestroyArray(ary);\n}\n\n// Receive a matrix from MATLAB\nIGL_INLINE void igl::matlab::mlgetmatrix(Engine** mlengine, std::string name, Eigen::MatrixXi& M)\n{\n  if (*mlengine == 0)\n    mlinit(mlengine);\n\n  unsigned long m = 0;\n  unsigned long n = 0;\n  std::vector<double> t;\n\n  mxArray *ary = engGetVariable(*mlengine, name.c_str());\n  if (ary == NULL)\n  {\n    m = 0;\n    n = 0;\n    M = Eigen::MatrixXi(0,0);\n  }\n  else\n  {\n    m = mxGetM(ary);\n    n = mxGetN(ary);\n    M = Eigen::MatrixXi(m,n);\n\n    double *pM = mxGetPr(ary);\n\n    int c = 0;\n    for(int j=0; j<M.cols();++j)\n      for(int i=0; i<M.rows();++i)\n        M(i,j) = int(pM[c++])-1;\n  }\n\n  mxDestroyArray(ary);\n}\n\n// Receive a matrix from MATLAB\nIGL_INLINE void igl::matlab::mlgetmatrix(Engine** mlengine, std::string name, Eigen::Matrix<unsigned int, Eigen::Dynamic, Eigen::Dynamic >& M)\n{\n  if (*mlengine == 0)\n    mlinit(mlengine);\n\n  unsigned long m = 0;\n  unsigned long n = 0;\n  std::vector<double> t;\n\n  mxArray *ary = engGetVariable(*mlengine, name.c_str());\n  if (ary == NULL)\n  {\n    m = 0;\n    n = 0;\n    M = Eigen::Matrix<unsigned int, Eigen::Dynamic, Eigen::Dynamic >(0,0);\n  }\n  else\n  {\n    m = mxGetM(ary);\n    n = mxGetN(ary);\n    M = Eigen::Matrix<unsigned int, Eigen::Dynamic, Eigen::Dynamic >(m,n);\n\n    double *pM = mxGetPr(ary);\n\n    int c = 0;\n    for(int j=0; j<M.cols();++j)\n      for(int i=0; i<M.rows();++i)\n        M(i,j) = (unsigned int)(pM[c++])-1;\n  }\n\n  mxDestroyArray(ary);\n}\n\n\n// Send a single scalar to MATLAB\nIGL_INLINE void igl::matlab::mlsetscalar(Engine** mlengine, std::string name, double s)\n{\n  if (*mlengine == 0)\n    mlinit(mlengine);\n\n  Eigen::MatrixXd M(1,1);\n  M(0,0) = s;\n  mlsetmatrix(mlengine, name, M);\n}\n\n// Receive a single scalar from MATLAB\nIGL_INLINE double igl::matlab::mlgetscalar(Engine** mlengine, std::string name)\n{\n  if (*mlengine == 0)\n    mlinit(mlengine);\n\n  Eigen::MatrixXd M;\n  mlgetmatrix(mlengine, name,M);\n  return M(0,0);\n}\n\n// Execute arbitrary MATLAB code and return the MATLAB output\nIGL_INLINE std::string igl::matlab::mleval(Engine** mlengine, std::string code)\n{\n  if (*mlengine == 0)\n    mlinit(mlengine);\n\n  const char *matlab_code = code.c_str();\n  const int BUF_SIZE = 4096*4096;\n  // allocate on the heap to avoid running out of stack\n  std::string bufauto(BUF_SIZE+1, '\\0');\n  char *buf = &bufauto[0];\n\n  assert(matlab_code != NULL);\n\n  // Use RAII ensure that on leaving this scope, the output buffer is\n  // always nullified (to prevent Matlab from accessing memory that might\n  // have already been deallocated).\n  struct cleanup {\n    Engine *m_ep;\n    cleanup(Engine *ep) : m_ep(ep) { }\n    ~cleanup() { engOutputBuffer(m_ep, NULL, 0); }\n  } cleanup_obj(*mlengine);\n\n  if (buf != NULL)\n    engOutputBuffer(*mlengine, buf, BUF_SIZE);\n\n  int res = engEvalString(*mlengine, matlab_code);\n\n  if (res != 0) {\n    std::ostringstream oss;\n    oss << \"ERROR: Matlab command failed with error code \" << res << \".\\n\";\n    return oss.str();\n  }\n\n  if (buf[0] == '>' && buf[1] == '>' && buf[2] == ' ')\n    buf += 3;\n  if (buf[0] == '\\n') ++buf;\n\n  return std::string(buf);\n}\n\n// Send a sparse matrix\nIGL_INLINE void igl::matlab::mlsetmatrix(Engine** mlengine, std::string name, const Eigen::SparseMatrix<double>& M)\n{\n  int count = 0;\n//  // Count non-zero\n//  for (unsigned k=0; k<M.outerSize(); ++k)\n//    for (Eigen::SparseMatrix<double>::InnerIterator it(M,k); it; ++it)\n//      if (it.value() != 0)\n//        ++count;\n  \n  Eigen::MatrixXd T(M.nonZeros(),3);\n  for (unsigned k=0; k<(unsigned)M.outerSize(); ++k)\n  {\n    for (Eigen::SparseMatrix<double>::InnerIterator it(M,k); it; ++it)\n    {\n      T(count,0) = it.row();\n      T(count,1) = it.col();\n      T(count,2) = it.value();\n      ++count;\n    }\n  }\n\n  T.col(0) = T.col(0).array()+1;\n  T.col(1) = T.col(1).array()+1;\n\n  mlsetmatrix(mlengine,\"temp93765\",T);\n  \n  std::string temp = name + \" = sparse(temp93765(:,1),temp93765(:,2),temp93765(:,3),\"\n                          + std::to_string(M.rows()) + \",\"\n                          + std::to_string(M.cols()) + \");\";\n  \n  mleval(mlengine,temp);\n  mleval(mlengine,\"clear temp93765\");\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/matlab/matlabinterface.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_MATLAB_MATLAB_INTERFACE_H\n#define IGL_MATLAB_MATLAB_INTERFACE_H\n#include \"../igl_inline.h\"\n// WARNING: These functions require matlab installed\n// Additional header folder required:\n//   /Applications/MATLAB_R2011a.app/extern/include\n// Additional binary lib to be linked with:\n// /Applications/MATLAB_R2011a.app/bin/maci64/libeng.dylib\n// /Applications/MATLAB_R2011a.app/bin/maci64/libmx.dylib\n\n// MAC ONLY:\n// Add to the environment variables:\n// DYLD_LIBRARY_PATH = /Applications/MATLAB_R2011a.app/bin/maci64/\n// PATH = /opt/local/bin:/opt/local/sbin:/Applications/MATLAB_R2011a.app/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/texbin:/usr/X11/bin\n\n#include <Eigen/Core>\n#include <Eigen/Sparse>\n#include <string>\n\n#include <complex>\n#include <cassert>\n#include <map>\n#include <string>\n#include <vector>\n\n#include <engine.h>  // Matlab engine header\n\nnamespace igl\n{\n  namespace matlab\n  {\n    // Init the MATLAB engine\n    // (no need to call it directly since it is automatically invoked by any other command)\n    IGL_INLINE void mlinit(Engine** engine);\n  \n    // Closes the MATLAB engine\n    IGL_INLINE void mlclose(Engine** engine);\n  \n    // Send a matrix to MATLAB\n    IGL_INLINE void mlsetmatrix(Engine** engine, std::string name, const Eigen::MatrixXd& M);\n  \n    // Send a matrix to MATLAB\n    IGL_INLINE void mlsetmatrix(Engine** engine, std::string name, const Eigen::MatrixXf& M);\n  \n    // Send a matrix to MATLAB\n    IGL_INLINE void mlsetmatrix(Engine** engine, std::string name, const Eigen::MatrixXi& M);\n  \n    // Send a matrix to MATLAB\n    IGL_INLINE void mlsetmatrix(Engine** mlengine, std::string name, const Eigen::Matrix<unsigned int, Eigen::Dynamic, Eigen::Dynamic >& M);\n  \n    // Receive a matrix from MATLAB\n    IGL_INLINE void mlgetmatrix(Engine** engine, std::string name, Eigen::MatrixXd& M);\n  \n    // Receive a matrix from MATLAB\n    IGL_INLINE void mlgetmatrix(Engine** engine, std::string name, Eigen::MatrixXf& M);\n  \n    // Receive a matrix from MATLAB\n    IGL_INLINE void mlgetmatrix(Engine** engine, std::string name, Eigen::MatrixXi& M);\n  \n    // Receive a matrix from MATLAB\n    IGL_INLINE void mlgetmatrix(Engine** mlengine, std::string name, Eigen::Matrix<unsigned int, Eigen::Dynamic, Eigen::Dynamic >& M);\n  \n    // Send a single scalar to MATLAB\n    IGL_INLINE void mlsetscalar(Engine** engine, std::string name, double s);\n  \n    // Receive a single scalar from MATLAB\n    IGL_INLINE double mlgetscalar(Engine** engine, std::string name);\n  \n    // Execute arbitrary MATLAB code and return the MATLAB output\n    IGL_INLINE std::string mleval(Engine** engine, std::string code);\n  \n    // Send a sparse matrix to MATLAB\n    IGL_INLINE void mlsetmatrix(Engine** mlengine, std::string name, const Eigen::SparseMatrix<double>& M);\n  \n  }\n}\n\n// Be sure that this is not compiled into libigl.a\n#ifndef IGL_STATIC_LIBRARY\n#  include \"matlabinterface.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/matlab/mexErrMsgTxt.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"mexErrMsgTxt.h\"\n\n// Overload mexErrMsgTxt to check an assertion then print text only if\n// assertion fails\n#include \"mex.h\"\nIGL_INLINE void igl::matlab::mexErrMsgTxt(bool assertion, const char * text)\n{\n  if(!assertion)\n  {\n    ::mexErrMsgTxt(text);\n  }\n}\n\n"
  },
  {
    "path": "libs/libigl/include/igl/matlab/mexErrMsgTxt.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_MATLAB_MEXERRMSGTXT_H\n#define IGL_MATLAB_MEXERRMSGTXT_H\n#include \"../igl_inline.h\"\nnamespace igl\n{\n  namespace matlab\n  {\n    // Wrapper for mexErrMsgTxt that only calls error if test fails\n    IGL_INLINE void mexErrMsgTxt(bool test, const char * message);\n  }\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"mexErrMsgTxt.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/matlab/parse_rhs.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"parse_rhs.h\"\n#include <algorithm>\n\ntemplate <typename DerivedV>\nIGL_INLINE void igl::matlab::parse_rhs_double(\n    const mxArray *prhs[], \n    Eigen::PlainObjectBase<DerivedV> & V)\n{\n  using namespace Eigen;\n  // Use Eigen's map and cast to copy\n  V = Map< Matrix<double,Dynamic,Dynamic> >\n    (mxGetPr(prhs[0]),mxGetM(prhs[0]),mxGetN(prhs[0]))\n    .cast<typename DerivedV::Scalar>();\n}\n\ntemplate <typename DerivedV>\nIGL_INLINE void igl::matlab::parse_rhs_index(\n    const mxArray *prhs[], \n    Eigen::PlainObjectBase<DerivedV> & V)\n{\n  parse_rhs_double(prhs,V);\n  V.array() -= 1;\n}\n\n#ifdef IGL_STATIC_LIBRARY\ntemplate void igl::matlab::parse_rhs_index<Eigen::Matrix<int, -1, 1, 0, -1, 1> >(mxArray_tag const**, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::matlab::parse_rhs_index<Eigen::Matrix<int, -1, -1, 0, -1, -1> >(mxArray_tag const**, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::matlab::parse_rhs_double<Eigen::Matrix<double, -1, -1, 0, -1, -1> >(mxArray_tag const**, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::matlab::parse_rhs_index<Eigen::Matrix<int, -1, 3, 1, -1, 3> >(mxArray_tag const**, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> >&);\ntemplate void igl::matlab::parse_rhs_double<Eigen::Matrix<double, -1, 3, 1, -1, 3> >(mxArray_tag const**, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/matlab/parse_rhs.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_MATLAB_PARSE_RHS_H\n#define IGL_MATLAB_PARSE_RHS_H\n#include <igl/igl_inline.h>\n#include <mex.h>\n#include <Eigen/Dense>\nnamespace igl\n{\n  namespace matlab\n  {\n    // Reads in a matrix as a double\n    //\n    // Inputs:\n    //   prhs  points to rhs argument\n    // Outputs:\n    //   V  M by N matrix \n    template <typename DerivedV>\n    IGL_INLINE void parse_rhs_double(\n      const mxArray *prhs[], \n      Eigen::PlainObjectBase<DerivedV> & V);\n    // Reads in a matrix and subtracts 1\n    template <typename DerivedV>\n    IGL_INLINE void parse_rhs_index(\n      const mxArray *prhs[], \n      Eigen::PlainObjectBase<DerivedV> & V);\n  }\n};\n#ifndef IGL_STATIC_LIBRARY\n#  include \"parse_rhs.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/matlab/prepare_lhs.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"prepare_lhs.h\"\n#include <algorithm>\ntemplate <typename DerivedV>\nIGL_INLINE void igl::matlab::prepare_lhs_double(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  mxArray *plhs[])\n{\n  using namespace std;\n  using namespace Eigen;\n  const int m = V.rows();\n  const int n = V.cols();\n  plhs[0] = mxCreateDoubleMatrix(m,n, mxREAL);\n  Eigen::Map< Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic> > \n    map(mxGetPr(plhs[0]),m,n);\n  map = V.template cast<double>();\n}\n\ntemplate <typename DerivedV>\nIGL_INLINE void igl::matlab::prepare_lhs_logical(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  mxArray *plhs[])\n{\n  using namespace std;\n  using namespace Eigen;\n  const int m = V.rows();\n  const int n = V.cols();\n  plhs[0] = mxCreateLogicalMatrix(m,n);\n  mxLogical * Vp = static_cast<mxLogical*>(mxGetData(plhs[0]));\n  Eigen::Map< Eigen::Matrix<mxLogical,Eigen::Dynamic,Eigen::Dynamic> > \n    map(static_cast<mxLogical*>(mxGetData(plhs[0])),m,n);\n  map = V.template cast<mxLogical>();\n}\n\ntemplate <typename DerivedV>\nIGL_INLINE void igl::matlab::prepare_lhs_index(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  mxArray *plhs[])\n{\n  // Treat indices as reals\n  const auto Vd = (V.template cast<double>().array()+1).eval();\n  return prepare_lhs_double(Vd,plhs);\n}\n\ntemplate <typename Vtype>\nIGL_INLINE void igl::matlab::prepare_lhs_double(\n  const Eigen::SparseMatrix<Vtype> & M,\n  mxArray *plhs[])\n{\n  using namespace std;\n  const int m = M.rows();\n  const int n = M.cols();\n  // THIS WILL NOT WORK FOR ROW-MAJOR\n  assert(n==M.outerSize());\n  const int nzmax = M.nonZeros();\n  plhs[0] = mxCreateSparse(m, n, nzmax, mxREAL);\n  mxArray * mx_data = plhs[0];\n  // Copy data immediately\n  double * pr = mxGetPr(mx_data);\n  mwIndex * ir = mxGetIr(mx_data);\n  mwIndex * jc = mxGetJc(mx_data);\n\n  // Iterate over outside\n  int k = 0;\n  for(int j=0; j<M.outerSize();j++)\n  {\n    jc[j] = k;\n    // Iterate over inside\n    for(typename Eigen::SparseMatrix<Vtype>::InnerIterator it (M,j); it; ++it)\n    {\n      // copy (cast to double)\n      pr[k] = it.value();\n      ir[k] = it.row();\n      k++;\n    }\n  }\n  jc[M.outerSize()] = k;\n\n}\n\n#ifdef IGL_STATIC_LIBRARY\ntemplate void igl::matlab::prepare_lhs_index<Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, mxArray_tag**);\ntemplate void igl::matlab::prepare_lhs_index<Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, mxArray_tag**);\ntemplate void igl::matlab::prepare_lhs_double<Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, mxArray_tag**);\ntemplate void igl::matlab::prepare_lhs_index<Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, mxArray_tag**);\ntemplate void igl::matlab::prepare_lhs_logical<Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, mxArray_tag**);\ntemplate void igl::matlab::prepare_lhs_double<Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, mxArray_tag**);\ntemplate void igl::matlab::prepare_lhs_logical<Eigen::Matrix<bool, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<bool, -1, 1, 0, -1, 1> > const&, mxArray_tag**);\ntemplate void igl::matlab::prepare_lhs_index<Eigen::Matrix<int, -1, 3, 1, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&, mxArray_tag**);\ntemplate void igl::matlab::prepare_lhs_double<Eigen::Matrix<double, -1, 3, 1, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, mxArray_tag**);\ntemplate void igl::matlab::prepare_lhs_double<Eigen::Matrix<int, 1, -1, 1, 1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, 1, -1, 1, 1, -1> > const&, mxArray_tag**);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/matlab/prepare_lhs.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_MATLAB_PREPARE_LHS_H\n#define IGL_MATLAB_PREPARE_LHS_H\n#include <igl/igl_inline.h>\n#include <mex.h>\n#include <Eigen/Dense>\n#include <Eigen/Sparse>\nnamespace igl\n{\n  namespace matlab\n  {\n    // Writes out a matrix as a double\n    //\n    // Inputs:\n    //   prhs  points to rhs argument\n    // Outputs:\n    //   V  M by N matrix \n    template <typename DerivedV>\n    IGL_INLINE void prepare_lhs_double(\n      const Eigen::PlainObjectBase<DerivedV> & V,\n      mxArray *plhs[]);\n    // Casts to logical\n    template <typename DerivedV>\n    IGL_INLINE void prepare_lhs_logical(\n      const Eigen::PlainObjectBase<DerivedV> & V,\n      mxArray *plhs[]);\n    // Writes out a matrix and adds 1\n    template <typename DerivedV>\n    IGL_INLINE void prepare_lhs_index(\n      const Eigen::PlainObjectBase<DerivedV> & V,\n      mxArray *plhs[]);\n    // SparseMatrix\n    template <typename Vtype>\n    IGL_INLINE void prepare_lhs_double(\n      const Eigen::SparseMatrix<Vtype> & V,\n      mxArray *plhs[]);\n  };\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"prepare_lhs.cpp\"\n#endif\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/matlab/requires_arg.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"requires_arg.h\"\n#include \"mexErrMsgTxt.h\"\n#include \"../C_STR.h\"\n\nIGL_INLINE void igl::matlab::requires_arg(const int i, const int nrhs, const char *name)\n{\n  mexErrMsgTxt((i+1)<nrhs,\n      C_STR(\"Parameter '\"<<name<<\"' requires argument\"));\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/matlab/requires_arg.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_REQUIRES_ARG_H\n#define IGL_REQUIRES_ARG_H\n#include \"../igl_inline.h\"\n#include <mex.h>\nnamespace igl\n{\n  namespace matlab\n  {\n    // Simply throw an error if (i+1)<rhs \n    //\n    // Input:\n    //   i  index of current arg\n    //   nrhs  total number of args\n    //   name of current arg\n    IGL_INLINE void requires_arg(const int i, const int nrhs, const char *name);\n  }\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"requires_arg.cpp\"\n#endif\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/matlab/validate_arg.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"validate_arg.h\"\n#include \"requires_arg.h\"\n#include \"mexErrMsgTxt.h\"\n#include \"../C_STR.h\"\n\nIGL_INLINE void igl::matlab::validate_arg_scalar(\n    const int i, const int nrhs, const mxArray * prhs[], const char * name)\n{\n  requires_arg(i,nrhs,name);\n  mexErrMsgTxt(mxGetN(prhs[i+1])==1 && mxGetM(prhs[i+1])==1,\n      C_STR(\"Parameter '\"<<name<<\"' requires scalar argument\"));\n}\n\nIGL_INLINE void igl::matlab::validate_arg_logical(\n    const int i, const int nrhs, const mxArray * prhs[], const char * name)\n{\n  requires_arg(i,nrhs,name);\n  mexErrMsgTxt(mxIsLogical(prhs[i+1]),\n    C_STR(\"Parameter '\"<<name<<\"' requires Logical argument\"));\n}\n\nIGL_INLINE void igl::matlab::validate_arg_char(\n    const int i, const int nrhs, const mxArray * prhs[], const char * name)\n{\n  requires_arg(i,nrhs,name);\n  mexErrMsgTxt(mxIsChar(prhs[i+1]),\n    C_STR(\"Parameter '\"<<name<<\"' requires char argument\"));\n}\n\nIGL_INLINE void igl::matlab::validate_arg_double(\n    const int i, const int nrhs, const mxArray * prhs[], const char * name)\n{\n  requires_arg(i,nrhs,name);\n  mexErrMsgTxt(mxIsDouble(prhs[i+1]),\n    C_STR(\"Parameter '\"<<name<<\"' requires double argument\"));\n}\nIGL_INLINE void igl::matlab::validate_arg_function_handle(\n    const int i, const int nrhs, const mxArray * prhs[], const char * name)\n{\n  requires_arg(i,nrhs,name);\n  mexErrMsgTxt(mxIsClass(prhs[i+1],\"function_handle\"),\n    C_STR(\"Parameter '\"<<name<<\"' requires function handle argument\"));\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/matlab/validate_arg.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_VALIDATE_ARG_H\n#define IGL_VALIDATE_ARG_H\n#include \"../igl_inline.h\"\n#include <mex.h>\nnamespace igl\n{\n  namespace matlab\n  {\n    // Throw an error if arg i+1 is not a scalar\n    //\n    // Inputs:\n    //   i  index of current arguement\n    //   nrhs  total number of arguments\n    //   prhs  pointer to arguements array\n    //   name   name of current argument\n    IGL_INLINE void validate_arg_scalar(\n      const int i, const int nrhs, const mxArray * prhs[], const char * name);\n    IGL_INLINE void validate_arg_logical(\n      const int i, const int nrhs, const mxArray * prhs[], const char * name);\n    IGL_INLINE void validate_arg_char(\n      const int i, const int nrhs, const mxArray * prhs[], const char * name);\n    IGL_INLINE void validate_arg_double(\n      const int i, const int nrhs, const mxArray * prhs[], const char * name);\n    IGL_INLINE void validate_arg_function_handle(\n      const int i, const int nrhs, const mxArray * prhs[], const char * name);\n  }\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"validate_arg.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/matlab_format.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"matlab_format.h\"\n#include \"STR.h\"\n#include \"find.h\"\n\ntemplate <typename DerivedM>\nIGL_INLINE const Eigen::WithFormat< DerivedM > igl::matlab_format(\n  const Eigen::DenseBase<DerivedM> & M,\n  const std::string name)\n{\n  using namespace std;\n  string prefix = \"\";\n  if(!name.empty())\n  {\n    prefix = name + \" = \";\n  }\n\n  return M.format(Eigen::IOFormat(\n    Eigen::FullPrecision,\n    0,\n    \" \",\n    \"\\n\",\n    \"\",\n    \"\",\n    // This seems like a bit of a hack since I would expect the rows to align\n    // with out this extra spacing on the first line\n    prefix + \"[\\n  \",\n    \"\\n];\"));\n}\n\ntemplate <typename DerivedS>\nIGL_INLINE const std::string\nigl::matlab_format(\n  const Eigen::SparseMatrix<DerivedS> & S,\n  const std::string name)\n{\n  using namespace Eigen;\n  using namespace std;\n  Matrix<typename Eigen::SparseMatrix<DerivedS>::Scalar,Dynamic,1> I,J,V;\n  Matrix<DerivedS,Dynamic,Dynamic> SIJV;\n  find(S,I,J,V);\n  I.array() += 1;\n  J.array() += 1;\n  SIJV.resize(V.rows(),3);\n  SIJV << I,J,V;\n  string prefix = \"\";\n  string suffix = \"\";\n  if(!name.empty())\n  {\n    prefix = name + \"IJV = \";\n    suffix = \"\\n\"+name + \" = sparse(\"+name+\"IJV(:,1),\"+name+\"IJV(:,2),\"+name+\"IJV(:,3),\"+std::to_string(S.rows())+\",\"+std::to_string(S.cols())+\" );\";\n  }\n  return STR(\"\"<<\n    SIJV.format(Eigen::IOFormat(\n    Eigen::FullPrecision,\n    0,\n    \" \",\n    \"\\n\",\n    \"\",\n    \"\",\n    // This seems like a bit of a hack since I would expect the rows to align\n    // with out this extra spacing on the first line\n    prefix + \"[\\n  \",\n    \"\\n];\"))<<suffix);\n}\n\nIGL_INLINE Eigen::IOFormat igl::matlab_format()\n{\n  // M = [1 2 3;4 5 6];\n  // M.format(matlab_format()) produces:\n  // [\n  //   1 2 3\n  //   4 5 6\n  // ];\n  return Eigen::IOFormat(\n    Eigen::FullPrecision,\n    0,\n    \" \",\n    \"\\n\",\n    \"\",\n    \"\",\n    // This seems like a bit of a hack since I would expect the rows to align\n    // with out this extra spacing on the first line\n    \"[\\n  \",\n    \"\\n];\");\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate Eigen::WithFormat<Eigen::Matrix<int, 4, 1, 0, 4, 1> > const igl::matlab_format<Eigen::Matrix<int, 4, 1, 0, 4, 1> >(Eigen::DenseBase<Eigen::Matrix<int, 4, 1, 0, 4, 1> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);\ntemplate std::basic_string<char, std::char_traits<char>, std::allocator<char> > const igl::matlab_format<double>(Eigen::SparseMatrix<double, 0, int> const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);\ntemplate Eigen::WithFormat<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const igl::matlab_format<Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, std::string);\ntemplate Eigen::WithFormat<Eigen::Array<int, -1, -1, 0, -1, -1> > const igl::matlab_format<Eigen::Array<int, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Array<int, -1, -1, 0, -1, -1> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);\ntemplate Eigen::WithFormat<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const igl::matlab_format<Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);\ntemplate Eigen::WithFormat<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const igl::matlab_format<Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);\ntemplate Eigen::WithFormat<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const igl::matlab_format<Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);\ntemplate Eigen::WithFormat<Eigen::Array<int, -1, 1, 0, -1, 1> > const igl::matlab_format<Eigen::Array<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Array<int, -1, 1, 0, -1, 1> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);\ntemplate Eigen::WithFormat<Eigen::Matrix<double, 4, 4, 0, 4, 4> > const igl::matlab_format<Eigen::Matrix<double, 4, 4, 0, 4, 4> >(Eigen::DenseBase<Eigen::Matrix<double, 4, 4, 0, 4, 4> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);\ntemplate Eigen::WithFormat<Eigen::Matrix<double, -1, 4, 0, -1, 4> > const igl::matlab_format<Eigen::Matrix<double, -1, 4, 0, -1, 4> >(Eigen::DenseBase<Eigen::Matrix<double, -1, 4, 0, -1, 4> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);\ntemplate Eigen::WithFormat<Eigen::Matrix<double, -1, 2, 0, -1, 2> > const igl::matlab_format<Eigen::Matrix<double, -1, 2, 0, -1, 2> >(Eigen::DenseBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);\ntemplate Eigen::WithFormat<Eigen::Matrix<double, 2, 1, 0, 2, 1> > const igl::matlab_format<Eigen::Matrix<double, 2, 1, 0, 2, 1> >(Eigen::DenseBase<Eigen::Matrix<double, 2, 1, 0, 2, 1> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);\ntemplate Eigen::WithFormat<Eigen::Matrix<int, 1, -1, 1, 1, -1> > const igl::matlab_format<Eigen::Matrix<int, 1, -1, 1, 1, -1> >(Eigen::DenseBase<Eigen::Matrix<int, 1, -1, 1, 1, -1> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);\ntemplate Eigen::WithFormat<Eigen::Matrix<double, 1, -1, 1, 1, -1> > const igl::matlab_format<Eigen::Matrix<double, 1, -1, 1, 1, -1> >(Eigen::DenseBase<Eigen::Matrix<double, 1, -1, 1, 1, -1> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);\ntemplate Eigen::WithFormat<Eigen::Matrix<double, 3, 3, 0, 3, 3> > const igl::matlab_format<Eigen::Matrix<double, 3, 3, 0, 3, 3> >(Eigen::DenseBase<Eigen::Matrix<double, 3, 3, 0, 3, 3> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);\ntemplate Eigen::WithFormat<Eigen::Matrix<double, 2, 2, 0, 2, 2> > const igl::matlab_format<Eigen::Matrix<double, 2, 2, 0, 2, 2> >(Eigen::DenseBase<Eigen::Matrix<double, 2, 2, 0, 2, 2> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);\ntemplate Eigen::WithFormat<Eigen::Matrix<float, 2, 2, 0, 2, 2> > const igl::matlab_format<Eigen::Matrix<float, 2, 2, 0, 2, 2> >(Eigen::DenseBase<Eigen::Matrix<float, 2, 2, 0, 2, 2> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);\ntemplate Eigen::WithFormat<Eigen::Matrix<double, 2, 2, 1, 2, 2> > const igl::matlab_format<Eigen::Matrix<double, 2, 2, 1, 2, 2> >(Eigen::DenseBase<Eigen::Matrix<double, 2, 2, 1, 2, 2> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);\ntemplate Eigen::WithFormat<Eigen::Matrix<double, 3, 1, 0, 3, 1> > const igl::matlab_format<Eigen::Matrix<double, 3, 1, 0, 3, 1> >(Eigen::DenseBase<Eigen::Matrix<double, 3, 1, 0, 3, 1> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);\ntemplate Eigen::WithFormat<Eigen::Matrix<float, 2, 1, 0, 2, 1> > const igl::matlab_format<Eigen::Matrix<float, 2, 1, 0, 2, 1> >(Eigen::DenseBase<Eigen::Matrix<float, 2, 1, 0, 2, 1> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);\ntemplate Eigen::WithFormat<Eigen::Matrix<float, 2, 2, 1, 2, 2> > const igl::matlab_format<Eigen::Matrix<float, 2, 2, 1, 2, 2> >(Eigen::DenseBase<Eigen::Matrix<float, 2, 2, 1, 2, 2> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);\ntemplate Eigen::WithFormat<Eigen::Matrix<float, -1, -1, 0, -1, -1> > const igl::matlab_format<Eigen::Matrix<float, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<float, -1, -1, 0, -1, -1> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);\ntemplate Eigen::WithFormat<Eigen::Matrix<double, 3, 3, 1, 3, 3> > const igl::matlab_format<Eigen::Matrix<double, 3, 3, 1, 3, 3> >(Eigen::DenseBase<Eigen::Matrix<double, 3, 3, 1, 3, 3> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);\ntemplate Eigen::WithFormat<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const igl::matlab_format<Eigen::Matrix<double, -1, -1, 1, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);\ntemplate Eigen::WithFormat<Eigen::Matrix<int, -1, -1, 1, -1, -1> > const igl::matlab_format<Eigen::Matrix<int, -1, -1, 1, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, -1, 1, -1, -1> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);\ntemplate Eigen::WithFormat<Eigen::Array<double, -1, 1, 0, -1, 1> > const igl::matlab_format<Eigen::Array<double, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Array<double, -1, 1, 0, -1, 1> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);\ntemplate Eigen::WithFormat<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const igl::matlab_format<Eigen::Matrix<double, 1, 3, 1, 1, 3> >(Eigen::DenseBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);\ntemplate Eigen::WithFormat<Eigen::Matrix<double, 1, 2, 1, 1, 2> > const igl::matlab_format<Eigen::Matrix<double, 1, 2, 1, 1, 2> >(Eigen::DenseBase<Eigen::Matrix<double, 1, 2, 1, 1, 2> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);\ntemplate Eigen::WithFormat<Eigen::Matrix<int, -1, 2, 0, -1, 2> > const igl::matlab_format<Eigen::Matrix<int, -1, 2, 0, -1, 2> >(Eigen::DenseBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);\ntemplate Eigen::WithFormat<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const igl::matlab_format<Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::DenseBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);\ntemplate Eigen::WithFormat<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const igl::matlab_format<Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::DenseBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);\ntemplate Eigen::WithFormat<Eigen::Matrix<double, 2, 3, 0, 2, 3> > const igl::matlab_format<Eigen::Matrix<double, 2, 3, 0, 2, 3> >(Eigen::DenseBase<Eigen::Matrix<double, 2, 3, 0, 2, 3> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);\ntemplate Eigen::WithFormat<Eigen::Matrix<double, 3, 2, 0, 3, 2> > const igl::matlab_format<Eigen::Matrix<double, 3, 2, 0, 3, 2> >(Eigen::DenseBase<Eigen::Matrix<double, 3, 2, 0, 3, 2> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);\ntemplate Eigen::WithFormat<Eigen::Matrix<float, -1, 1, 0, -1, 1> > const igl::matlab_format<Eigen::Matrix<float, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<float, -1, 1, 0, -1, 1> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);\ntemplate Eigen::WithFormat<Eigen::Matrix<int, 2, 2, 0, 2, 2> > const igl::matlab_format<Eigen::Matrix<int, 2, 2, 0, 2, 2> >(Eigen::DenseBase<Eigen::Matrix<int, 2, 2, 0, 2, 2> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/matlab_format.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_MATLAB_FORMAT_H\n#define IGL_MATLAB_FORMAT_H\n\n#include \"igl_inline.h\"\n\n#include <Eigen/Core>\n#include <Eigen/Sparse>\n#include <string>\n\nnamespace igl\n{\n  // This is a routine to print a matrix using format suitable for pasting into\n  // the matlab IDE\n  //\n  // Templates:\n  //   DerivedM  e.g. derived from MatrixXd\n  // Input:\n  //   input  some matrix to be formated\n  //   name  name of matrix\n  // Returns  Formated matrix\n  //\n  // Example:\n  // // M := [1 2 3;4 5 6];\n  // cout<<matlab_format(M)<<endl;\n  // // Prints:\n  // // [\n  // //   1 2 3\n  // //   4 5 6\n  // // ];\n  // cout<<matlab_format(M,\"M\")<<endl;\n  // // Prints:\n  // // M = [\n  // //   1 2 3\n  // //   4 5 6\n  // // ];\n  template <typename DerivedM>\n  IGL_INLINE const Eigen::WithFormat< DerivedM > matlab_format(\n    const Eigen::DenseBase<DerivedM> & M,\n    const std::string name = \"\");\n  // Same but for sparse matrices. Print IJV format into an auxillary variable\n  // and then print a call to sparse which will construct the sparse matrix\n  // Example:\n  // // S := [0 2 3;4 5 0];\n  // cout<<matlab_format(S,\"S\")<<endl;\n  // // Prints:\n  // // SIJV = [\n  // //   2 1 4\n  // //   1 2 2\n  // //   2 2 5\n  // //   1 3 3\n  // // ];\n  // // S = sparse(SIJV(:,1),SIJV(:,2),SIJV(:,3));\n  //\n  template <typename DerivedS>\n  IGL_INLINE const std::string matlab_format(\n    const Eigen::SparseMatrix<DerivedS> & S,\n    const std::string name = \"\");\n  // Return just IOFormat \n  //\n  // Example:\n  // // M := [1 2 3;4 5 6];\n  // cout<<M.format(matlab_format())<<endl;\n  // // Prints:\n  // // [\n  // //   1 2 3\n  // //   4 5 6\n  // // ];\n  IGL_INLINE Eigen::IOFormat matlab_format();\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"matlab_format.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/matrix_to_list.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"matrix_to_list.h\"\n\n#include <Eigen/Dense>\n\ntemplate <typename DerivedM>\nIGL_INLINE void igl::matrix_to_list(\n  const Eigen::DenseBase<DerivedM> & M,\n  std::vector<std::vector<typename DerivedM::Scalar > > & V)\n{\n  using namespace std;\n  V.resize(M.rows(),vector<typename DerivedM::Scalar >(M.cols()));\n  // loop over rows\n  for(int i = 0;i<M.rows();i++)\n  {\n    // loop over cols\n    for(int j = 0;j<M.cols();j++)\n    {\n      V[i][j] = M(i,j);\n    }\n  }\n}\n\ntemplate <typename DerivedM>\nIGL_INLINE void igl::matrix_to_list(\n  const Eigen::DenseBase<DerivedM> & M,\n  std::vector<typename DerivedM::Scalar > & V)\n{\n  using namespace std;\n  V.resize(M.size());\n  // loop over cols then rows\n  for(int j = 0;j<M.cols();j++)\n  {\n    for(int i = 0;i<M.rows();i++)\n    {\n      V[i+j*M.rows()] = M(i,j);\n    }\n  }\n}\n\ntemplate <typename DerivedM>\nIGL_INLINE std::vector<typename DerivedM::Scalar > igl::matrix_to_list(\n    const Eigen::DenseBase<DerivedM> & M)\n{\n  std::vector<typename DerivedM::Scalar> V;\n  matrix_to_list(M,V);\n  return V;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::matrix_to_list<Eigen::Matrix<int, -1, 2, 0, -1, 2> >(Eigen::DenseBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> > const&, std::vector<Eigen::Matrix<int, -1, 2, 0, -1, 2>::Scalar, std::allocator<Eigen::Matrix<int, -1, 2, 0, -1, 2>::Scalar> >&);\n// generated by autoexplicit.sh\ntemplate std::vector<Eigen::Matrix<double, -1, 1, 0, -1, 1>::Scalar, std::allocator<Eigen::Matrix<double, -1, 1, 0, -1, 1>::Scalar> > igl::matrix_to_list<Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&);\n// generated by autoexplicit.sh\ntemplate std::vector<Eigen::Matrix<int, -1, 1, 0, -1, 1>::Scalar, std::allocator<Eigen::Matrix<int, -1, 1, 0, -1, 1>::Scalar> > igl::matrix_to_list<Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&);\n//template void igl::matrix_to_list<Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >, double>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > >&);\n//template void igl::matrix_to_list<Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >, int>(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&);\ntemplate void igl::matrix_to_list<Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, std::vector<std::vector<Eigen::Matrix<double, -1, -1, 0, -1, -1>::Scalar, std::allocator<Eigen::Matrix<double, -1, -1, 0, -1, -1>::Scalar> >, std::allocator<std::vector<Eigen::Matrix<double, -1, -1, 0, -1, -1>::Scalar, std::allocator<Eigen::Matrix<double, -1, -1, 0, -1, -1>::Scalar> > > >&);\ntemplate void igl::matrix_to_list<Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<std::vector<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Scalar, std::allocator<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Scalar> >, std::allocator<std::vector<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Scalar, std::allocator<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Scalar> > > >&);\ntemplate void igl::matrix_to_list<Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, std::vector<Eigen::Matrix<double, -1, 1, 0, -1, 1>::Scalar, std::allocator<Eigen::Matrix<double, -1, 1, 0, -1, 1>::Scalar> >&);\ntemplate void igl::matrix_to_list<Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Scalar, std::allocator<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Scalar> >&);\ntemplate void igl::matrix_to_list<Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, std::vector<Eigen::Matrix<int, -1, 1, 0, -1, 1>::Scalar, std::allocator<Eigen::Matrix<int, -1, 1, 0, -1, 1>::Scalar> >&);\ntemplate void igl::matrix_to_list<Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, std::vector<std::vector<Eigen::Matrix<int, -1, 1, 0, -1, 1>::Scalar, std::allocator<Eigen::Matrix<int, -1, 1, 0, -1, 1>::Scalar> >, std::allocator<std::vector<Eigen::Matrix<int, -1, 1, 0, -1, 1>::Scalar, std::allocator<Eigen::Matrix<int, -1, 1, 0, -1, 1>::Scalar> > > >&);\ntemplate void igl::matrix_to_list<Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, std::vector<Eigen::Matrix<double, -1, -1, 0, -1, -1>::Scalar, std::allocator<Eigen::Matrix<double, -1, -1, 0, -1, -1>::Scalar> >&);\ntemplate void igl::matrix_to_list<Eigen::Matrix<int, 1, -1, 1, 1, -1> >(Eigen::DenseBase<Eigen::Matrix<int, 1, -1, 1, 1, -1> > const&, std::vector<Eigen::Matrix<int, 1, -1, 1, 1, -1>::Scalar, std::allocator<Eigen::Matrix<int, 1, -1, 1, 1, -1>::Scalar> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/matrix_to_list.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_MATRIX_TO_LIST_H\n#define IGL_MATRIX_TO_LIST_H\n#include \"igl_inline.h\"\n#include <vector>\n#include <Eigen/Dense>\n\nnamespace igl\n{\n  // Convert a matrix to a list (std::vector) of row vectors of the same size\n  //\n  // Template: \n  //   Mat  Matrix type, must implement:\n  //     .resize(m,n)\n  //     .row(i) = Row\n  //   T  type that can be safely cast to type in Mat via '='\n  // Inputs:\n  //   M  an m by n matrix\n  // Outputs:\n  //   V  a m-long list of vectors of size n\n  //\n  // See also: list_to_matrix\n  template <typename DerivedM>\n  IGL_INLINE void matrix_to_list(\n    const Eigen::DenseBase<DerivedM> & M, \n    std::vector<std::vector<typename DerivedM::Scalar > > & V);\n  // Convert a matrix to a list (std::vector) of elements in column-major\n  // ordering.\n  //\n  // Inputs:\n  //    M  an m by n matrix\n  // Outputs:\n  //    V  an m*n list of elements\n  template <typename DerivedM>\n  IGL_INLINE void matrix_to_list(\n    const Eigen::DenseBase<DerivedM> & M, \n    std::vector<typename DerivedM::Scalar > & V);\n  // Return wrapper\n  template <typename DerivedM>\n  IGL_INLINE std::vector<typename DerivedM::Scalar > matrix_to_list(\n      const Eigen::DenseBase<DerivedM> & M);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"matrix_to_list.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/max.cpp",
    "content": "#include \"max.h\"\n#include \"for_each.h\"\n#include \"find_zero.h\"\n\ntemplate <typename AType, typename DerivedB, typename DerivedI>\nIGL_INLINE void igl::max(\n  const Eigen::SparseMatrix<AType> & A,\n  const int dim,\n  Eigen::PlainObjectBase<DerivedB> & B,\n  Eigen::PlainObjectBase<DerivedI> & I)\n{\n  const int n = A.cols();\n  const int m = A.rows();\n  B.resize(dim==1?n:m);\n  B.setConstant(std::numeric_limits<typename DerivedB::Scalar>::lowest());\n  I.resize(dim==1?n:m);\n  for_each(A,[&B,&I,&dim](int i, int j,const typename DerivedB::Scalar v)\n    {\n      if(dim == 2)\n      {\n        std::swap(i,j);\n      }\n      // Coded as if dim == 1, assuming swap for dim == 2\n      if(v > B(j))\n      {\n        B(j) = v;\n        I(j) = i;\n      }\n    });\n  Eigen::VectorXi Z;\n  find_zero(A,dim,Z);\n  for(int j = 0;j<I.size();j++)\n  {\n    if(Z(j) != (dim==1?m:n) && 0 > B(j))\n    {\n      B(j) = 0;\n      I(j) = Z(j);\n    }\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::max<bool, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::SparseMatrix<bool, 0, int> const&, int, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/max.h",
    "content": "#ifndef IGL_MAX_H\n#define IGL_MAX_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <Eigen/Sparse>\nnamespace igl\n{\n  // Inputs:\n  //   X  m by n matrix\n  //   dim  dimension along which to take max\n  // Outputs:\n  //   Y  n-long vector (if dim == 1) \n  //   or\n  //   Y  m-long vector (if dim == 2)\n  //   I  vector the same size as Y containing the indices along dim of maximum\n  //     entries\n  template <typename AType, typename DerivedB, typename DerivedI>\n  IGL_INLINE void max(\n    const Eigen::SparseMatrix<AType> & A,\n    const int dim,\n    Eigen::PlainObjectBase<DerivedB> & B,\n    Eigen::PlainObjectBase<DerivedI> & I);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"max.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/max_faces_stopping_condition.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"max_faces_stopping_condition.h\"\n\nIGL_INLINE void igl::max_faces_stopping_condition(\n  int & m,\n  const int orig_m,\n  const int max_m,\n  std::function<bool(\n    const Eigen::MatrixXd &,\n    const Eigen::MatrixXi &,\n    const Eigen::MatrixXi &,\n    const Eigen::VectorXi &,\n    const Eigen::MatrixXi &,\n    const Eigen::MatrixXi &,\n    const std::set<std::pair<double,int> > &,\n    const std::vector<std::set<std::pair<double,int> >::iterator > &,\n    const Eigen::MatrixXd &,\n    const int,\n    const int,\n    const int,\n    const int,\n    const int)> & stopping_condition)\n{\n  stopping_condition = \n    [orig_m,max_m,&m](\n    const Eigen::MatrixXd &,\n    const Eigen::MatrixXi &,\n    const Eigen::MatrixXi &,\n    const Eigen::VectorXi &,\n    const Eigen::MatrixXi &,\n    const Eigen::MatrixXi &,\n    const std::set<std::pair<double,int> > &,\n    const std::vector<std::set<std::pair<double,int> >::iterator > &,\n    const Eigen::MatrixXd &,\n    const int,\n    const int,\n    const int,\n    const int f1,\n    const int f2)->bool\n    {\n      // Only subtract if we're collapsing a real face\n      if(f1 < orig_m) m-=1;\n      if(f2 < orig_m) m-=1;\n      return m<=(int)max_m;\n    };\n}\n\nIGL_INLINE \n  std::function<bool(\n    const Eigen::MatrixXd &,\n    const Eigen::MatrixXi &,\n    const Eigen::MatrixXi &,\n    const Eigen::VectorXi &,\n    const Eigen::MatrixXi &,\n    const Eigen::MatrixXi &,\n    const std::set<std::pair<double,int> > &,\n    const std::vector<std::set<std::pair<double,int> >::iterator > &,\n    const Eigen::MatrixXd &,\n    const int,\n    const int,\n    const int,\n    const int,\n    const int)> \n  igl::max_faces_stopping_condition(\n    int & m,\n    const int orig_m,\n    const int max_m)\n{\n  std::function<bool(\n    const Eigen::MatrixXd &,\n    const Eigen::MatrixXi &,\n    const Eigen::MatrixXi &,\n    const Eigen::VectorXi &,\n    const Eigen::MatrixXi &,\n    const Eigen::MatrixXi &,\n    const std::set<std::pair<double,int> > &,\n    const std::vector<std::set<std::pair<double,int> >::iterator > &,\n    const Eigen::MatrixXd &,\n    const int,\n    const int,\n    const int,\n    const int,\n    const int)> stopping_condition;\n  max_faces_stopping_condition(\n      m,orig_m,max_m,stopping_condition);\n  return stopping_condition;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/max_faces_stopping_condition.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_MAX_FACES_STOPPING_CONDITION_H\n#define IGL_MAX_FACES_STOPPING_CONDITION_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <vector>\n#include <set>\n#include <functional>\nnamespace igl\n{\n  // Stopping condition function compatible with igl::decimate. The outpute\n  // function handle will return true if number of faces is less than max_m\n  //\n  // Inputs:\n  //   m  reference to working variable initially should be set to current\n  //    number of faces.\n  //   orig_m  number (size) of original face list _**not**_ including any\n  //     faces added to handle phony boundary faces connecting to point at\n  //     infinity. For closed meshes it's safe to set this to F.rows()\n  //   max_m  maximum number of faces\n  // Outputs:\n  //   stopping_condition\n  //\n  IGL_INLINE void max_faces_stopping_condition(\n    int & m,\n    const int orig_m,\n    const int max_m,\n    std::function<bool(\n      const Eigen::MatrixXd &,\n      const Eigen::MatrixXi &,\n      const Eigen::MatrixXi &,\n      const Eigen::VectorXi &,\n      const Eigen::MatrixXi &,\n      const Eigen::MatrixXi &,\n      const std::set<std::pair<double,int> > &,\n      const std::vector<std::set<std::pair<double,int> >::iterator > &,\n      const Eigen::MatrixXd &,\n      const int,\n      const int,\n      const int,\n      const int,\n      const int)> & stopping_condition);\n  IGL_INLINE \n    std::function<bool(\n      const Eigen::MatrixXd &,\n      const Eigen::MatrixXi &,\n      const Eigen::MatrixXi &,\n      const Eigen::VectorXi &,\n      const Eigen::MatrixXi &,\n      const Eigen::MatrixXi &,\n      const std::set<std::pair<double,int> > &,\n      const std::vector<std::set<std::pair<double,int> >::iterator > &,\n      const Eigen::MatrixXd &,\n      const int,\n      const int,\n      const int,\n      const int,\n      const int)> \n    max_faces_stopping_condition(\n      int & m,\n      const int orign_m,\n      const int max_m);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"max_faces_stopping_condition.cpp\"\n#endif\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/max_size.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"max_size.h\"\n\n\ntemplate <typename T>\nIGL_INLINE int igl::max_size(const std::vector<T> & V)\n{\n  int max_size = -1;\n  for(\n    typename std::vector<T>::const_iterator iter = V.begin();\n    iter != V.end(); \n    iter++)\n  {\n    int size = (int)iter->size();\n    max_size = (max_size > size ? max_size : size);\n  }\n  return max_size;\n}\n\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate int igl::max_size<std::vector<unsigned int, std::allocator<unsigned int> > >(std::vector<std::vector<unsigned int, std::allocator<unsigned int> >, std::allocator<std::vector<unsigned int, std::allocator<unsigned int> > > > const&);\n// generated by autoexplicit.sh\ntemplate int igl::max_size<std::vector<int, std::allocator<int> > >(std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > const&);\n// generated by autoexplicit.sh\ntemplate int igl::max_size<std::vector<double, std::allocator<double> > >(std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > > const&);\ntemplate int igl::max_size<std::vector<bool, std::allocator<bool> > >(std::vector<std::vector<bool, std::allocator<bool> >, std::allocator<std::vector<bool, std::allocator<bool> > > > const&);\ntemplate int igl::max_size<std::vector<float, std::allocator<float> > >(std::vector<std::vector<float, std::allocator<float> >, std::allocator<std::vector<float, std::allocator<float> > > > const&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/max_size.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_MAX_SIZE_H\n#define IGL_MAX_SIZE_H\n#include \"igl_inline.h\"\n#include <vector>\n\nnamespace igl\n{\n  // Determine max size of lists in a vector\n  // Template:\n  //   T  some list type object that implements .size()\n  // Inputs:\n  //   V  vector of list types T\n  // Returns max .size() found in V, returns -1 if V is empty\n  template <typename T>\n  IGL_INLINE int max_size(const std::vector<T> & V);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"max_size.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/median.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"median.h\"\n#include \"matrix_to_list.h\"\n\n#include <vector>\n#include <algorithm>\n\nIGL_INLINE bool igl::median(const Eigen::VectorXd & V, double & m)\n{\n  using namespace std;\n  if(V.size() == 0)\n  {\n    return false;\n  }\n  vector<double> vV;\n  matrix_to_list(V,vV);\n  // http://stackoverflow.com/a/1719155/148668\n  size_t n = vV.size()/2;\n  nth_element(vV.begin(),vV.begin()+n,vV.end());\n  if(vV.size()%2==0)\n  {\n    nth_element(vV.begin(),vV.begin()+n-1,vV.end());\n    m = 0.5*(vV[n]+vV[n-1]);\n  }else\n  {\n    m = vV[n];\n  }\n  return true;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/median.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_MEDIAN_H\n#define IGL_MEDIAN_H\n#include \"igl_inline.h\"\n#include <Eigen/Dense>\nnamespace igl\n{\n  // Compute the median of an eigen vector\n  //\n  // Inputs:\n  //   V  #V list of unsorted values\n  // Outputs:\n  //   m  median of those values\n  // Returns true on success, false on failure\n  IGL_INLINE bool median(const Eigen::VectorXd & V, double & m);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"median.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/min.cpp",
    "content": "#include \"min.h\"\n#include \"for_each.h\"\n#include \"find_zero.h\"\n\ntemplate <typename AType, typename DerivedB, typename DerivedI>\nIGL_INLINE void igl::min(\n  const Eigen::SparseMatrix<AType> & A,\n  const int dim,\n  Eigen::PlainObjectBase<DerivedB> & B,\n  Eigen::PlainObjectBase<DerivedI> & I)\n{\n  const int n = A.cols();\n  const int m = A.rows();\n  B.resize(dim==1?n:m);\n  B.setConstant(std::numeric_limits<typename DerivedB::Scalar>::max());\n  I.resize(dim==1?n:m);\n  for_each(A,[&B,&I,&dim](int i, int j,const typename DerivedB::Scalar v)\n    {\n      if(dim == 2)\n      {\n        std::swap(i,j);\n      }\n      // Coded as if dim == 1, assuming swap for dim == 2\n      if(v < B(j))\n      {\n        B(j) = v;\n        I(j) = i;\n      }\n    });\n  Eigen::VectorXi Z;\n  find_zero(A,dim,Z);\n  for(int j = 0;j<I.size();j++)\n  {\n    if(Z(j) != (dim==1?m:n) && 0 < B(j))\n    {\n      B(j) = 0;\n      I(j) = Z(j);\n    }\n  }\n}\n\n"
  },
  {
    "path": "libs/libigl/include/igl/min.h",
    "content": "#ifndef IGL_MIN_H\n#define IGL_MIN_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <Eigen/Sparse>\nnamespace igl\n{\n  // Inputs:\n  //   X  m by n matrix\n  //   dim  dimension along which to take min\n  // Outputs:\n  //   Y  n-long vector (if dim == 1) \n  //   or\n  //   Y  m-long vector (if dim == 2)\n  //   I  vector the same size as Y containing the indices along dim of minimum\n  //     entries\n  template <typename AType, typename DerivedB, typename DerivedI>\n  IGL_INLINE void min(\n    const Eigen::SparseMatrix<AType> & A,\n    const int dim,\n    Eigen::PlainObjectBase<DerivedB> & B,\n    Eigen::PlainObjectBase<DerivedI> & I);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"min.cpp\"\n#endif\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/min_quad_dense.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"min_quad_dense.h\"\n\n#include <Eigen/Core>\n#include <Eigen/LU>\n#include \"EPS.h\"\n#include <cstdio>\n\ntemplate <typename T>\nIGL_INLINE void igl::min_quad_dense_precompute(\n  const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& A,\n  const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& Aeq,    \n  const bool use_lu_decomposition,\n  Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& S)\n{\n  typedef Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> Mat;\n        // This threshold seems to matter a lot but I'm not sure how to\n        // set it\n  const T treshold = igl::FLOAT_EPS;\n  //const T treshold = igl::DOUBLE_EPS;\n\n  const int n = A.rows();\n  assert(A.cols() == n);\n  const int m = Aeq.rows();\n  assert(Aeq.cols() == n);\n\n  // Lagrange multipliers method:\n  Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> LM(n + m, n + m);\n  LM.block(0, 0, n, n) = A;\n  LM.block(0, n, n, m) = Aeq.transpose();\n  LM.block(n, 0, m, n) = Aeq;\n  LM.block(n, n, m, m).setZero();\n\n  Mat LMpinv;\n  if(use_lu_decomposition)\n  {\n    // if LM is close to singular, use at your own risk :)\n    LMpinv = LM.inverse();\n  }else\n  {\n    // use SVD\n    typedef Eigen::Matrix<T, Eigen::Dynamic, 1> Vec; \n    Vec singValues;\n    Eigen::JacobiSVD<Mat> svd;\n    svd.compute(LM, Eigen::ComputeFullU | Eigen::ComputeFullV );\n    const Mat& u = svd.matrixU();\n    const Mat& v = svd.matrixV();\n    const Vec& singVals = svd.singularValues();\n\n    Vec pi_singVals(n + m);\n    int zeroed = 0;\n    for (int i=0; i<n + m; i++)\n    {\n      T sv = singVals(i, 0);\n      assert(sv >= 0);      \n                 // printf(\"sv: %lg ? %lg\\n\",(double) sv,(double)treshold);\n      if (sv > treshold) pi_singVals(i, 0) = T(1) / sv;\n      else \n      {\n        pi_singVals(i, 0) = T(0);\n        zeroed++;\n      }\n    }\n\n    printf(\"min_quad_dense_precompute: %i singular values zeroed (threshold = %e)\\n\", zeroed, treshold);\n    Eigen::DiagonalMatrix<T, Eigen::Dynamic> pi_diag(pi_singVals);\n\n    LMpinv = v * pi_diag * u.transpose();\n  }\n  S = LMpinv.block(0, 0, n, n + m);\n\n  //// debug:\n  //mlinit(&g_pEngine);\n  //\n  //mlsetmatrix(&g_pEngine, \"A\", A);\n  //mlsetmatrix(&g_pEngine, \"Aeq\", Aeq);\n  //mlsetmatrix(&g_pEngine, \"LM\", LM);\n  //mlsetmatrix(&g_pEngine, \"u\", u);\n  //mlsetmatrix(&g_pEngine, \"v\", v);\n  //MatrixXd svMat = singVals;\n  //mlsetmatrix(&g_pEngine, \"singVals\", svMat);\n  //mlsetmatrix(&g_pEngine, \"LMpinv\", LMpinv);\n  //mlsetmatrix(&g_pEngine, \"S\", S);\n\n  //int hu = 1;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::min_quad_dense_precompute<double>(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, bool, Eigen::Matrix<double, -1, -1, 0, -1, -1>&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/min_quad_dense.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_MIN_QUAD_DENSE_H\n#define IGL_MIN_QUAD_DENSE_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Dense>\n\n//// debug\n//#include <matlabinterface.h>\n//Engine *g_pEngine;\n\n\nnamespace igl\n{\n  // MIN_QUAD_WITH_FIXED Minimize quadratic energy Z'*A*Z + Z'*B + C\n  // subject to linear constraints Aeq*Z = Beq\n  //\n  // Templates:\n  //   T  should be a eigen matrix primitive type like float or double\n  // Inputs:\n  //   A  n by n matrix of quadratic coefficients\n  //   B  n by 1 column of linear coefficients\n  //   Aeq  m by n list of linear equality constraint coefficients\n  //   Beq  m by 1 list of linear equality constraint constant values\n  //   use_lu_decomposition  use lu rather than SVD\n  // Outputs:\n  //   S  n by (n + m) \"solve\" matrix, such that S*[B', Beq'] is a solution\n  // Returns true on success, false on error\n  template <typename T>\n  IGL_INLINE void min_quad_dense_precompute(\n    const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& A,\n    const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& Aeq,    \n    const bool use_lu_decomposition,\n    Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& S);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"min_quad_dense.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/min_quad_with_fixed.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"min_quad_with_fixed.h\"\n\n#include \"slice.h\"\n#include \"is_symmetric.h\"\n#include \"find.h\"\n#include \"sparse.h\"\n#include \"repmat.h\"\n#include \"matlab_format.h\"\n#include \"EPS.h\"\n#include \"cat.h\"\n\n//#include <Eigen/SparseExtra>\n// Bug in unsupported/Eigen/SparseExtra needs iostream first\n#include <iostream>\n#include <unsupported/Eigen/SparseExtra>\n#include <cassert>\n#include <cstdio>\n#include <iostream>\n\ntemplate <typename T, typename Derivedknown>\nIGL_INLINE bool igl::min_quad_with_fixed_precompute(\n  const Eigen::SparseMatrix<T>& A2,\n  const Eigen::MatrixBase<Derivedknown> & known,\n  const Eigen::SparseMatrix<T>& Aeq,\n  const bool pd,\n  min_quad_with_fixed_data<T> & data\n  )\n{\n//#define MIN_QUAD_WITH_FIXED_CPP_DEBUG\n  using namespace Eigen;\n  using namespace std;\n  const Eigen::SparseMatrix<T> A = 0.5*A2;\n#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG\n  cout<<\"    pre\"<<endl;\n#endif\n  // number of rows\n  int n = A.rows();\n  // cache problem size\n  data.n = n;\n\n  int neq = Aeq.rows();\n  // default is to have 0 linear equality constraints\n  if(Aeq.size() != 0)\n  {\n    assert(n == Aeq.cols() && \"#Aeq.cols() should match A.rows()\");\n  }\n\n  assert(A.rows() == n && \"A should be square\");\n  assert(A.cols() == n && \"A should be square\");\n\n  // number of known rows\n  int kr = known.size();\n\n  assert((kr == 0 || known.minCoeff() >= 0)&& \"known indices should be in [0,n)\");\n  assert((kr == 0 || known.maxCoeff() < n) && \"known indices should be in [0,n)\");\n  assert(neq <= n && \"Number of equality constraints should be less than DOFs\");\n\n\n  // cache known\n  data.known = known;\n  // get list of unknown indices\n  data.unknown.resize(n-kr);\n  std::vector<bool> unknown_mask;\n  unknown_mask.resize(n,true);\n  for(int i = 0;i<kr;i++)\n  {\n    unknown_mask[known(i)] = false;\n  }\n  int u = 0;\n  for(int i = 0;i<n;i++)\n  {\n    if(unknown_mask[i])\n    {\n      data.unknown(u) = i;\n      u++;\n    }\n  }\n  // get list of lagrange multiplier indices\n  data.lagrange.resize(neq);\n  for(int i = 0;i<neq;i++)\n  {\n    data.lagrange(i) = n + i;\n  }\n  // cache unknown followed by lagrange indices\n  data.unknown_lagrange.resize(data.unknown.size()+data.lagrange.size());\n  // Would like to do:\n  //data.unknown_lagrange << data.unknown, data.lagrange;\n  // but Eigen can't handle empty vectors in comma initialization\n  // https://forum.kde.org/viewtopic.php?f=74&t=107974&p=364947#p364947\n  if(data.unknown.size() > 0)\n  {\n    data.unknown_lagrange.head(data.unknown.size()) = data.unknown;\n  }\n  if(data.lagrange.size() > 0)\n  {\n    data.unknown_lagrange.tail(data.lagrange.size()) = data.lagrange;\n  }\n\n  SparseMatrix<T> Auu;\n  slice(A,data.unknown,data.unknown,Auu);\n  assert(Auu.size() != 0 && Auu.rows() > 0 && \"There should be at least one unknown.\");\n\n  // Positive definiteness is *not* determined, rather it is given as a\n  // parameter\n  data.Auu_pd = pd;\n  if(data.Auu_pd)\n  {\n    // PD implies symmetric\n    data.Auu_sym = true;\n    // This is an annoying assertion unless EPS can be chosen in a nicer way.\n    //assert(is_symmetric(Auu,EPS<double>()));\n    assert(is_symmetric(Auu,1.0) &&\n      \"Auu should be symmetric if positive definite\");\n  }else\n  {\n    // determine if A(unknown,unknown) is symmetric and/or positive definite\n    VectorXi AuuI,AuuJ;\n    MatrixXd AuuV;\n    find(Auu,AuuI,AuuJ,AuuV);\n    data.Auu_sym = is_symmetric(Auu,EPS<double>()*AuuV.maxCoeff());\n  }\n\n  // Determine number of linearly independent constraints\n  int nc = 0;\n  if(neq>0)\n  {\n#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG\n    cout<<\"    qr\"<<endl;\n#endif\n    // QR decomposition to determine row rank in Aequ\n    slice(Aeq,data.unknown,2,data.Aequ);\n    assert(data.Aequ.rows() == neq &&\n      \"#Rows in Aequ should match #constraints\");\n    assert(data.Aequ.cols() == data.unknown.size() &&\n      \"#cols in Aequ should match #unknowns\");\n    data.AeqTQR.compute(data.Aequ.transpose().eval());\n#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG\n    cout<<endl<<matlab_format(SparseMatrix<T>(data.Aequ.transpose().eval()),\"AeqT\")<<endl<<endl;\n#endif\n    switch(data.AeqTQR.info())\n    {\n      case Eigen::Success:\n        break;\n      case Eigen::NumericalIssue:\n        cerr<<\"Error: Numerical issue.\"<<endl;\n        return false;\n      case Eigen::InvalidInput:\n        cerr<<\"Error: Invalid input.\"<<endl;\n        return false;\n      default:\n        cerr<<\"Error: Other.\"<<endl;\n        return false;\n    }\n    nc = data.AeqTQR.rank();\n    assert(nc<=neq &&\n      \"Rank of reduced constraints should be <= #original constraints\");\n    data.Aeq_li = nc == neq;\n    //cout<<\"data.Aeq_li: \"<<data.Aeq_li<<endl;\n  }else\n  {\n    data.Aeq_li = true;\n  }\n\n  if(data.Aeq_li)\n  {\n#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG\n    cout<<\"    Aeq_li=true\"<<endl;\n#endif\n    // Append lagrange multiplier quadratic terms\n    SparseMatrix<T> new_A;\n    SparseMatrix<T> AeqT = Aeq.transpose();\n    SparseMatrix<T> Z(neq,neq);\n    // This is a bit slower. But why isn't cat fast?\n    new_A = cat(1, cat(2,   A, AeqT ),\n                   cat(2, Aeq,    Z ));\n\n    // precompute RHS builders\n    if(kr > 0)\n    {\n      SparseMatrix<T> Aulk,Akul;\n      // Slow\n      slice(new_A,data.unknown_lagrange,data.known,Aulk);\n      //// This doesn't work!!!\n      //data.preY = Aulk + Akul.transpose();\n      // Slow\n      if(data.Auu_sym)\n      {\n        data.preY = Aulk*2;\n      }else\n      {\n        slice(new_A,data.known,data.unknown_lagrange,Akul);\n        SparseMatrix<T> AkulT = Akul.transpose();\n        data.preY = Aulk + AkulT;\n      }\n    }else\n    {\n      data.preY.resize(data.unknown_lagrange.size(),0);\n    }\n\n    // Positive definite and no equality constraints (Postive definiteness\n    // implies symmetric)\n#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG\n    cout<<\"    factorize\"<<endl;\n#endif\n    if(data.Auu_pd && neq == 0)\n    {\n#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG\n    cout<<\"    llt\"<<endl;\n#endif\n      data.llt.compute(Auu);\n      switch(data.llt.info())\n      {\n        case Eigen::Success:\n          break;\n        case Eigen::NumericalIssue:\n          cerr<<\"Error: Numerical issue.\"<<endl;\n          return false;\n        default:\n          cerr<<\"Error: Other.\"<<endl;\n          return false;\n      }\n      data.solver_type = min_quad_with_fixed_data<T>::LLT;\n    }else\n    {\n#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG\n    cout<<\"    ldlt\"<<endl;\n#endif\n      // Either not PD or there are equality constraints\n      SparseMatrix<T> NA;\n      slice(new_A,data.unknown_lagrange,data.unknown_lagrange,NA);\n      data.NA = NA;\n      // Ideally we'd use LDLT but Eigen doesn't support positive semi-definite\n      // matrices:\n      // http://forum.kde.org/viewtopic.php?f=74&t=106962&p=291990#p291990\n      if(data.Auu_sym && false)\n      {\n        data.ldlt.compute(NA);\n        switch(data.ldlt.info())\n        {\n          case Eigen::Success:\n            break;\n          case Eigen::NumericalIssue:\n            cerr<<\"Error: Numerical issue.\"<<endl;\n            return false;\n          default:\n            cerr<<\"Error: Other.\"<<endl;\n            return false;\n        }\n        data.solver_type = min_quad_with_fixed_data<T>::LDLT;\n      }else\n      {\n#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG\n    cout<<\"    lu\"<<endl;\n#endif\n        // Resort to LU\n        // Bottleneck >1/2\n        data.lu.compute(NA);\n        //std::cout<<\"NA=[\"<<std::endl<<NA<<std::endl<<\"];\"<<std::endl;\n        switch(data.lu.info())\n        {\n          case Eigen::Success:\n            break;\n          case Eigen::NumericalIssue:\n            cerr<<\"Error: Numerical issue.\"<<endl;\n            return false;\n          case Eigen::InvalidInput:\n            cerr<<\"Error: Invalid Input.\"<<endl;\n            return false;\n          default:\n            cerr<<\"Error: Other.\"<<endl;\n            return false;\n        }\n        data.solver_type = min_quad_with_fixed_data<T>::LU;\n      }\n    }\n  }else\n  {\n#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG\n    cout<<\"    Aeq_li=false\"<<endl;\n#endif\n    data.neq = neq;\n    const int nu = data.unknown.size();\n    //cout<<\"nu: \"<<nu<<endl;\n    //cout<<\"neq: \"<<neq<<endl;\n    //cout<<\"nc: \"<<nc<<endl;\n    //cout<<\"    matrixR\"<<endl;\n    SparseMatrix<T> AeqTR,AeqTQ;\n    AeqTR = data.AeqTQR.matrixR();\n    // This shouldn't be necessary\n    AeqTR.prune(0.0);\n#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG\n    cout<<\"    matrixQ\"<<endl;\n#endif\n    // THIS IS ESSENTIALLY DENSE AND THIS IS BY FAR THE BOTTLENECK\n    // http://forum.kde.org/viewtopic.php?f=74&t=117500\n    AeqTQ = data.AeqTQR.matrixQ();\n#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG\n    cout<<\"    prune\"<<endl;\n    cout<<\"      nnz: \"<<AeqTQ.nonZeros()<<endl;\n#endif\n    // This shouldn't be necessary\n    AeqTQ.prune(0.0);\n    //cout<<\"AeqTQ: \"<<AeqTQ.rows()<<\" \"<<AeqTQ.cols()<<endl;\n    //cout<<matlab_format(AeqTQ,\"AeqTQ\")<<endl;\n    //cout<<\"    perms\"<<endl;\n#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG\n    cout<<\"      nnz: \"<<AeqTQ.nonZeros()<<endl;\n    cout<<\"    perm\"<<endl;\n#endif\n    SparseMatrix<double> I(neq,neq);\n    I.setIdentity();\n    data.AeqTE = data.AeqTQR.colsPermutation() * I;\n    data.AeqTET = data.AeqTQR.colsPermutation().transpose() * I;\n    assert(AeqTR.rows() == nu   && \"#rows in AeqTR should match #unknowns\");\n    assert(AeqTR.cols() == neq  && \"#cols in AeqTR should match #constraints\");\n    assert(AeqTQ.rows() == nu && \"#rows in AeqTQ should match #unknowns\");\n    assert(AeqTQ.cols() == nu && \"#cols in AeqTQ should match #unknowns\");\n    //cout<<\"    slice\"<<endl;\n#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG\n    cout<<\"    slice\"<<endl;\n#endif\n    data.AeqTQ1 = AeqTQ.topLeftCorner(nu,nc);\n    data.AeqTQ1T = data.AeqTQ1.transpose().eval();\n    // ALREADY TRIM (Not 100% sure about this)\n    data.AeqTR1 = AeqTR.topLeftCorner(nc,nc);\n    data.AeqTR1T = data.AeqTR1.transpose().eval();\n    //cout<<\"AeqTR1T.size() \"<<data.AeqTR1T.rows()<<\" \"<<data.AeqTR1T.cols()<<endl;\n    // Null space\n    data.AeqTQ2 = AeqTQ.bottomRightCorner(nu,nu-nc);\n    data.AeqTQ2T = data.AeqTQ2.transpose().eval();\n#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG\n    cout<<\"    proj\"<<endl;\n#endif\n    // Projected hessian\n    SparseMatrix<T> QRAuu = data.AeqTQ2T * Auu * data.AeqTQ2;\n    {\n#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG\n      cout<<\"    factorize\"<<endl;\n#endif\n      // QRAuu should always be PD\n      data.llt.compute(QRAuu);\n      switch(data.llt.info())\n      {\n        case Eigen::Success:\n          break;\n        case Eigen::NumericalIssue:\n          cerr<<\"Error: Numerical issue.\"<<endl;\n          return false;\n        default:\n          cerr<<\"Error: Other.\"<<endl;\n          return false;\n      }\n      data.solver_type = min_quad_with_fixed_data<T>::QR_LLT;\n    }\n#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG\n    cout<<\"    smash\"<<endl;\n#endif\n    // Known value multiplier\n    SparseMatrix<T> Auk;\n    slice(A,data.unknown,data.known,Auk);\n    SparseMatrix<T> Aku;\n    slice(A,data.known,data.unknown,Aku);\n    SparseMatrix<T> AkuT = Aku.transpose();\n    data.preY = Auk + AkuT;\n    // Needed during solve\n    data.Auu = Auu;\n    slice(Aeq,data.known,2,data.Aeqk);\n    assert(data.Aeqk.rows() == neq);\n    assert(data.Aeqk.cols() == data.known.size());\n  }\n  return true;\n}\n\n\ntemplate <\n  typename T,\n  typename DerivedB,\n  typename DerivedY,\n  typename DerivedBeq,\n  typename DerivedZ,\n  typename Derivedsol>\nIGL_INLINE bool igl::min_quad_with_fixed_solve(\n  const min_quad_with_fixed_data<T> & data,\n  const Eigen::MatrixBase<DerivedB> & B,\n  const Eigen::MatrixBase<DerivedY> & Y,\n  const Eigen::MatrixBase<DerivedBeq> & Beq,\n  Eigen::PlainObjectBase<DerivedZ> & Z,\n  Eigen::PlainObjectBase<Derivedsol> & sol)\n{\n  using namespace std;\n  using namespace Eigen;\n  typedef Matrix<T,Dynamic,1> VectorXT;\n  typedef Matrix<T,Dynamic,Dynamic> MatrixXT;\n  // number of known rows\n  int kr = data.known.size();\n  if(kr!=0)\n  {\n    assert(kr == Y.rows());\n  }\n  // number of columns to solve\n  int cols = Y.cols();\n  assert(B.cols() == 1);\n  assert(Beq.size() == 0 || Beq.cols() == 1);\n\n  // resize output\n  Z.resize(data.n,cols);\n  // Set known values\n  for(int i = 0;i < kr;i++)\n  {\n    for(int j = 0;j < cols;j++)\n    {\n      Z(data.known(i),j) = Y(i,j);\n    }\n  }\n\n  if(data.Aeq_li)\n  {\n    // number of lagrange multipliers aka linear equality constraints\n    int neq = data.lagrange.size();\n    // append lagrange multiplier rhs's\n    VectorXT BBeq;//(B.size() + Beq.size());\n    // Would like to do:\n    //BBeq << B, (Beq*-2.0);\n    // but Eigen can't handle empty vectors in comma initialization\n    // https://forum.kde.org/viewtopic.php?f=74&t=107974&p=364947#p364947\n\n    if((B.size() > 0) && (Beq.size() > 0))\n    {\n      BBeq.resize(B.size() + Beq.size());\n      BBeq << B, (Beq*-2.0);\n    }\n    else\n    if ((B.size() > 0) && (Beq.size() == 0))\n    {\n      BBeq.resize(B.size());\n      BBeq << B;\n    }\n    else\n    if ((B.size() == 0) && (Beq.size() > 0))\n    {\n      BBeq.resize(Beq.size());\n      BBeq << (Beq*-2.0);\n    }\n    // Build right hand side\n    VectorXT BBequl;\n    igl::slice(BBeq,data.unknown_lagrange,BBequl);\n    MatrixXT BBequlcols;\n    igl::repmat(BBequl,1,cols,BBequlcols);\n    MatrixXT NB;\n    if(kr == 0)\n    {\n      NB = BBequlcols;\n    }else\n    {\n      NB = data.preY * Y + BBequlcols;\n    }\n\n    //std::cout<<\"NB=[\"<<std::endl<<NB<<std::endl<<\"];\"<<std::endl;\n    //cout<<matlab_format(NB,\"NB\")<<endl;\n    switch(data.solver_type)\n    {\n      case igl::min_quad_with_fixed_data<T>::LLT:\n        sol = data.llt.solve(NB);\n        break;\n      case igl::min_quad_with_fixed_data<T>::LDLT:\n        sol = data.ldlt.solve(NB);\n        break;\n      case igl::min_quad_with_fixed_data<T>::LU:\n        // Not a bottleneck\n        sol = data.lu.solve(NB);\n        break;\n      default:\n        cerr<<\"Error: invalid solver type\"<<endl;\n        return false;\n    }\n    //std::cout<<\"sol=[\"<<std::endl<<sol<<std::endl<<\"];\"<<std::endl;\n    // Now sol contains sol/-0.5\n    sol *= -0.5;\n    // Now sol contains solution\n    // Place solution in Z\n    for(int i = 0;i<(sol.rows()-neq);i++)\n    {\n      for(int j = 0;j<sol.cols();j++)\n      {\n        Z(data.unknown_lagrange(i),j) = sol(i,j);\n      }\n    }\n  }else\n  {\n    assert(data.solver_type == min_quad_with_fixed_data<T>::QR_LLT);\n    DerivedBeq eff_Beq;\n    // Adjust Aeq rhs to include known parts\n    eff_Beq =\n      //data.AeqTQR.colsPermutation().transpose() * (-data.Aeqk * Y + Beq);\n      data.AeqTET * (-data.Aeqk * Y + Beq);\n    // Where did this -0.5 come from? Probably the same place as above.\n    DerivedB Bu;\n    slice(B,data.unknown,Bu);\n    DerivedB NB;\n    NB = -0.5*(Bu + data.preY * Y);\n    // Trim eff_Beq\n    const int nc = data.AeqTQR.rank();\n    const int neq = Beq.rows();\n    eff_Beq = eff_Beq.topLeftCorner(nc,1).eval();\n    data.AeqTR1T.template triangularView<Lower>().solveInPlace(eff_Beq);\n    // Now eff_Beq = (data.AeqTR1T \\ (data.AeqTET * (-data.Aeqk * Y + Beq)))\n    DerivedB lambda_0;\n    lambda_0 = data.AeqTQ1 * eff_Beq;\n    //cout<<matlab_format(lambda_0,\"lambda_0\")<<endl;\n    DerivedB QRB;\n    QRB = -data.AeqTQ2T * (data.Auu * lambda_0) + data.AeqTQ2T * NB;\n    Derivedsol lambda;\n    lambda = data.llt.solve(QRB);\n    // prepare output\n    Derivedsol solu;\n    solu = data.AeqTQ2 * lambda + lambda_0;\n    //  http://www.math.uh.edu/~rohop/fall_06/Chapter3.pdf\n    Derivedsol solLambda;\n    {\n      Derivedsol temp1,temp2;\n      temp1 = (data.AeqTQ1T * NB - data.AeqTQ1T * data.Auu * solu);\n      data.AeqTR1.template triangularView<Upper>().solveInPlace(temp1);\n      //cout<<matlab_format(temp1,\"temp1\")<<endl;\n      temp2 = Derivedsol::Zero(neq,1);\n      temp2.topLeftCorner(nc,1) = temp1;\n      //solLambda = data.AeqTQR.colsPermutation() * temp2;\n      solLambda = data.AeqTE * temp2;\n    }\n    // sol is [Z(unknown);Lambda]\n    assert(data.unknown.size() == solu.rows());\n    assert(cols == solu.cols());\n    assert(data.neq == neq);\n    assert(data.neq == solLambda.rows());\n    assert(cols == solLambda.cols());\n    sol.resize(data.unknown.size()+data.neq,cols);\n    sol.block(0,0,solu.rows(),solu.cols()) = solu;\n    sol.block(solu.rows(),0,solLambda.rows(),solLambda.cols()) = solLambda;\n    for(int u = 0;u<data.unknown.size();u++)\n    {\n      for(int j = 0;j<Z.cols();j++)\n      {\n        Z(data.unknown(u),j) = solu(u,j);\n      }\n    }\n  }\n  return true;\n}\n\ntemplate <\n  typename T,\n  typename DerivedB,\n  typename DerivedY,\n  typename DerivedBeq,\n  typename DerivedZ>\nIGL_INLINE bool igl::min_quad_with_fixed_solve(\n  const min_quad_with_fixed_data<T> & data,\n  const Eigen::MatrixBase<DerivedB> & B,\n  const Eigen::MatrixBase<DerivedY> & Y,\n  const Eigen::MatrixBase<DerivedBeq> & Beq,\n  Eigen::PlainObjectBase<DerivedZ> & Z)\n{\n  Eigen::Matrix<typename DerivedZ::Scalar, Eigen::Dynamic, Eigen::Dynamic> sol;\n  return min_quad_with_fixed_solve(data,B,Y,Beq,Z,sol);\n}\n\ntemplate <\n  typename T,\n  typename Derivedknown,\n  typename DerivedB,\n  typename DerivedY,\n  typename DerivedBeq,\n  typename DerivedZ>\nIGL_INLINE bool igl::min_quad_with_fixed(\n  const Eigen::SparseMatrix<T>& A,\n  const Eigen::MatrixBase<DerivedB> & B,\n  const Eigen::MatrixBase<Derivedknown> & known,\n  const Eigen::MatrixBase<DerivedY> & Y,\n  const Eigen::SparseMatrix<T>& Aeq,\n  const Eigen::MatrixBase<DerivedBeq> & Beq,\n  const bool pd,\n  Eigen::PlainObjectBase<DerivedZ> & Z)\n{\n  min_quad_with_fixed_data<T> data;\n  if(!min_quad_with_fixed_precompute(A,known,Aeq,pd,data))\n  {\n    return false;\n  }\n  return min_quad_with_fixed_solve(data,B,Y,Beq,Z);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate bool igl::min_quad_with_fixed<double, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::SparseMatrix<double, 0, int> const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::SparseMatrix<double, 0, int> const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate bool igl::min_quad_with_fixed_solve<double, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(igl::min_quad_with_fixed_data<double> const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\ntemplate bool igl::min_quad_with_fixed_precompute<double, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::SparseMatrix<double, 0, int> const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::SparseMatrix<double, 0, int> const&, bool, igl::min_quad_with_fixed_data<double>&);\ntemplate bool igl::min_quad_with_fixed_solve<double, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(igl::min_quad_with_fixed_data<double> const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\ntemplate bool igl::min_quad_with_fixed_solve<double, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(igl::min_quad_with_fixed_data<double> const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate bool igl::min_quad_with_fixed_precompute<double, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::SparseMatrix<double, 0, int> const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::SparseMatrix<double, 0, int> const&, bool, igl::min_quad_with_fixed_data<double>&);\ntemplate bool igl::min_quad_with_fixed_solve<double, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(igl::min_quad_with_fixed_data<double> const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate bool igl::min_quad_with_fixed_solve<double, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(igl::min_quad_with_fixed_data<double> const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/min_quad_with_fixed.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_MIN_QUAD_WITH_FIXED_H\n#define IGL_MIN_QUAD_WITH_FIXED_H\n#include \"igl_inline.h\"\n\n#define EIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET\n#include <Eigen/Core>\n#include <Eigen/Dense>\n#include <Eigen/Sparse>\n// Bug in unsupported/Eigen/SparseExtra needs iostream first\n#include <iostream>\n#include <unsupported/Eigen/SparseExtra>\n\nnamespace igl\n{\n  template <typename T>\n  struct min_quad_with_fixed_data;\n  // Known Bugs: rows of Aeq **should probably** be linearly independent.\n  // During precomputation, the rows of a Aeq are checked via QR. But in case\n  // they're not then resulting probably will no longer be sparse: it will be\n  // slow.\n  //\n  // MIN_QUAD_WITH_FIXED Minimize quadratic energy \n  //\n  // 0.5*Z'*A*Z + Z'*B + C with\n  //\n  // constraints that Z(known) = Y, optionally also subject to the constraints\n  // Aeq*Z = Beq\n  //\n  // Templates:\n  //   T  should be a eigen matrix primitive type like int or double\n  // Inputs:\n  //   A  n by n matrix of quadratic coefficients\n  //   known list of indices to known rows in Z\n  //   Y  list of fixed values corresponding to known rows in Z\n  //   Aeq  m by n list of linear equality constraint coefficients\n  //   pd flag specifying whether A(unknown,unknown) is positive definite\n  // Outputs:\n  //   data  factorization struct with all necessary information to solve\n  //     using min_quad_with_fixed_solve\n  // Returns true on success, false on error\n  //\n  // Benchmark: For a harmonic solve on a mesh with 325K facets, matlab 2.2\n  // secs, igl/min_quad_with_fixed.h 7.1 secs\n  //\n  template <typename T, typename Derivedknown>\n  IGL_INLINE bool min_quad_with_fixed_precompute(\n    const Eigen::SparseMatrix<T>& A,\n    const Eigen::MatrixBase<Derivedknown> & known,\n    const Eigen::SparseMatrix<T>& Aeq,\n    const bool pd,\n    min_quad_with_fixed_data<T> & data\n    );\n\n  // Solves a system previously factored using min_quad_with_fixed_precompute\n  //\n  // Template:\n  //   T  type of sparse matrix (e.g. double)\n  //   DerivedY  type of Y (e.g. derived from VectorXd or MatrixXd)\n  //   DerivedZ  type of Z (e.g. derived from VectorXd or MatrixXd)\n  // Inputs:\n  //   data  factorization struct with all necessary precomputation to solve\n  //   B  n by 1 column of linear coefficients\n  //   Y  b by 1 list of constant fixed values\n  //   Beq  m by 1 list of linear equality constraint constant values\n  // Outputs:\n  //   Z  n by cols solution\n  //   sol  #unknowns+#lagrange by cols solution to linear system\n  // Returns true on success, false on error\n  template <\n    typename T,\n    typename DerivedB,\n    typename DerivedY,\n    typename DerivedBeq,\n    typename DerivedZ,\n    typename Derivedsol>\n  IGL_INLINE bool min_quad_with_fixed_solve(\n    const min_quad_with_fixed_data<T> & data,\n    const Eigen::MatrixBase<DerivedB> & B,\n    const Eigen::MatrixBase<DerivedY> & Y,\n    const Eigen::MatrixBase<DerivedBeq> & Beq,\n    Eigen::PlainObjectBase<DerivedZ> & Z,\n    Eigen::PlainObjectBase<Derivedsol> & sol);\n  // Wrapper without sol\n  template <\n    typename T,\n    typename DerivedB,\n    typename DerivedY,\n    typename DerivedBeq,\n    typename DerivedZ>\n  IGL_INLINE bool min_quad_with_fixed_solve(\n    const min_quad_with_fixed_data<T> & data,\n    const Eigen::MatrixBase<DerivedB> & B,\n    const Eigen::MatrixBase<DerivedY> & Y,\n    const Eigen::MatrixBase<DerivedBeq> & Beq,\n    Eigen::PlainObjectBase<DerivedZ> & Z);\n  template <\n    typename T,\n    typename Derivedknown,\n    typename DerivedB,\n    typename DerivedY,\n    typename DerivedBeq,\n    typename DerivedZ>\n  IGL_INLINE bool min_quad_with_fixed(\n    const Eigen::SparseMatrix<T>& A,\n    const Eigen::MatrixBase<DerivedB> & B,\n    const Eigen::MatrixBase<Derivedknown> & known,\n    const Eigen::MatrixBase<DerivedY> & Y,\n    const Eigen::SparseMatrix<T>& Aeq,\n    const Eigen::MatrixBase<DerivedBeq> & Beq,\n    const bool pd,\n    Eigen::PlainObjectBase<DerivedZ> & Z);\n}\n\ntemplate <typename T>\nstruct igl::min_quad_with_fixed_data\n{\n  // Size of original system: number of unknowns + number of knowns\n  int n;\n  // Whether A(unknown,unknown) is positive definite\n  bool Auu_pd;\n  // Whether A(unknown,unknown) is symmetric\n  bool Auu_sym;\n  // Indices of known variables\n  Eigen::VectorXi known;\n  // Indices of unknown variables\n  Eigen::VectorXi unknown;\n  // Indices of lagrange variables\n  Eigen::VectorXi lagrange;\n  // Indices of unknown variable followed by Indices of lagrange variables\n  Eigen::VectorXi unknown_lagrange;\n  // Matrix multiplied against Y when constructing right hand side\n  Eigen::SparseMatrix<T> preY;\n  enum SolverType\n  {\n    LLT = 0,\n    LDLT = 1,\n    LU = 2,\n    QR_LLT = 3,\n    NUM_SOLVER_TYPES = 4\n  } solver_type;\n  // Solvers\n  Eigen::SimplicialLLT <Eigen::SparseMatrix<T > > llt;\n  Eigen::SimplicialLDLT<Eigen::SparseMatrix<T > > ldlt;\n  Eigen::SparseLU<Eigen::SparseMatrix<T, Eigen::ColMajor>, Eigen::COLAMDOrdering<int> >   lu;\n  // QR factorization\n  // Are rows of Aeq linearly independent?\n  bool Aeq_li;\n  // Columns of Aeq corresponding to unknowns\n  int neq;\n  Eigen::SparseQR<Eigen::SparseMatrix<T>, Eigen::COLAMDOrdering<int> >  AeqTQR;\n  Eigen::SparseMatrix<T> Aeqk;\n  Eigen::SparseMatrix<T> Aequ;\n  Eigen::SparseMatrix<T> Auu;\n  Eigen::SparseMatrix<T> AeqTQ1;\n  Eigen::SparseMatrix<T> AeqTQ1T;\n  Eigen::SparseMatrix<T> AeqTQ2;\n  Eigen::SparseMatrix<T> AeqTQ2T;\n  Eigen::SparseMatrix<T> AeqTR1;\n  Eigen::SparseMatrix<T> AeqTR1T;\n  Eigen::SparseMatrix<T> AeqTE;\n  Eigen::SparseMatrix<T> AeqTET;\n  // Debug\n  Eigen::SparseMatrix<T> NA;\n  Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> NB;\n};\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"min_quad_with_fixed.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/min_size.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"min_size.h\"\n\ntemplate <typename T>\nIGL_INLINE int igl::min_size(const std::vector<T> & V)\n{\n  int min_size = -1;\n  for(\n    typename std::vector<T>::const_iterator iter = V.begin();\n    iter != V.end(); \n    iter++)\n  {\n    int size = (int)iter->size();\n    // have to handle base case\n    if(min_size == -1)\n    {\n      min_size = size;\n    }else{\n      min_size = (min_size < size ? min_size : size);\n    }\n  }\n  return min_size;\n}\n\n\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate int igl::min_size<std::vector<unsigned int, std::allocator<unsigned int> > >(std::vector<std::vector<unsigned int, std::allocator<unsigned int> >, std::allocator<std::vector<unsigned int, std::allocator<unsigned int> > > > const&);\n// generated by autoexplicit.sh\ntemplate int igl::min_size<std::vector<int, std::allocator<int> > >(std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > const&);\n// generated by autoexplicit.sh\ntemplate int igl::min_size<std::vector<double, std::allocator<double> > >(std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > > const&);\ntemplate int igl::min_size<std::vector<bool, std::allocator<bool> > >(std::vector<std::vector<bool, std::allocator<bool> >, std::allocator<std::vector<bool, std::allocator<bool> > > > const&);\ntemplate int igl::min_size<std::vector<float, std::allocator<float> > >(std::vector<std::vector<float, std::allocator<float> >, std::allocator<std::vector<float, std::allocator<float> > > > const&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/min_size.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_MIN_SIZE_H\n#define IGL_MIN_SIZE_H\n#include \"igl_inline.h\"\n#include <vector>\n\nnamespace igl\n{\n  // Determine min size of lists in a vector\n  // Template:\n  //   T  some list type object that implements .size()\n  // Inputs:\n  //   V  vector of list types T\n  // Returns min .size() found in V, returns -1 if V is empty\n  template <typename T>\n  IGL_INLINE int min_size(const std::vector<T> & V);\n}\n\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"min_size.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/mod.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"mod.h\"\n\ntemplate <typename DerivedA, typename DerivedB>\nIGL_INLINE void igl::mod(\n  const Eigen::PlainObjectBase<DerivedA> & A,\n  const int base,\n  Eigen::PlainObjectBase<DerivedB> & B)\n{\n  B.resizeLike(A);\n  for(int i = 0;i<A.rows();i++)\n  {\n    for(int j = 0;j<A.cols();j++)\n    {\n      B(i,j) = A(i,j)%base;\n    }\n  }\n}\ntemplate <typename DerivedA>\nIGL_INLINE DerivedA igl::mod(\n  const Eigen::PlainObjectBase<DerivedA> & A, const int base)\n{\n  DerivedA B;\n  mod(A,base,B);\n  return B;\n}\n#ifdef IGL_STATIC_LIBRARY\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/mod.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_MOD_H\n#define IGL_MOD_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Compute elementwise mod: B = A % base\n  //\n  // Inputs:\n  //    A  m by n matrix\n  //    base  number to mod against\n  // Outputs:\n  //    B  m by n matrix\n  template <typename DerivedA, typename DerivedB>\n  IGL_INLINE void mod(\n    const Eigen::PlainObjectBase<DerivedA> & A,\n    const int base,\n    Eigen::PlainObjectBase<DerivedB> & B);\n  template <typename DerivedA>\n  IGL_INLINE DerivedA mod(\n    const Eigen::PlainObjectBase<DerivedA> & A, const int base);\n}\n#ifndef IGL_STATIC_LIBRARY\n#include \"mod.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/mode.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"mode.h\"\n\n// Implementation \n#include <vector>\n\ntemplate <typename T>\nIGL_INLINE void igl::mode(\n  const Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> & X,\n  const int d, \n  Eigen::Matrix<T,Eigen::Dynamic,1> & M)\n{\n  assert(d==1 || d==2);\n  using namespace std;\n  int m = X.rows();\n  int n = X.cols();\n  M.resize((d==1)?n:m,1);\n  for(int i = 0;i<((d==2)?m:n);i++)\n  {\n    vector<int> counts(((d==2)?n:m),0);\n    for(int j = 0;j<((d==2)?n:m);j++)\n    {\n      T v = (d==2)?X(i,j):X(j,i);\n      for(int k = 0;k<((d==2)?n:m);k++)\n      {\n        T u = (d==2)?X(i,k):X(k,i);\n        if(v == u)\n        {\n          counts[k]++;\n        }\n      }\n    }\n    assert(counts.size() > 0);\n    int max_count = -1;\n    int max_count_j = -1;\n    int j =0;\n    for(vector<int>::iterator it = counts.begin();it<counts.end();it++)\n    {\n      if(max_count < *it)\n      {\n        max_count = *it;\n        max_count_j = j;\n      }\n      j++;\n    }\n    M(i,0) = (d==2)?X(i,max_count_j):X(max_count_j,i);\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::mode<double>(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, int, Eigen::Matrix<double, -1, 1, 0, -1, 1>&);\n// generated by autoexplicit.sh\ntemplate void igl::mode<int>(Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, int, Eigen::Matrix<int, -1, 1, 0, -1, 1>&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/mode.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_MODE_H\n#define IGL_MODE_H\n#include \"igl_inline.h\"\n#include <Eigen/Dense>\nnamespace igl\n{\n  // Takes mode of coefficients in a matrix along a given dension\n  //\n  // Templates:\n  //   T  should be a eigen matrix primitive type like int or double\n  // Inputs:\n  //   X  m by n original matrix\n  //   d  dension along which to take mode, m or n\n  // Outputs:\n  //   M  vector containing mode along dension d, if d==1 then this will be a\n  //     n-long vector if d==2 then this will be a m-long vector\n  template <typename T>\n  IGL_INLINE void mode(\n    const Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> & X,\n    const int d, \n    Eigen::Matrix<T,Eigen::Dynamic,1> & M);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"mode.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/mosek/bbw.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"bbw.h\"\n#include \"mosek_quadprog.h\"\n#include \"../harmonic.h\"\n#include \"../slice_into.h\"\n#include <Eigen/Sparse>\n#include <iostream>\n#include <cstdio>\n\n\ntemplate <\n  typename DerivedV,\n  typename DerivedEle,\n  typename Derivedb,\n  typename Derivedbc,\n  typename DerivedW>\nIGL_INLINE bool igl::mosek::bbw(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedEle> & Ele,\n  const Eigen::PlainObjectBase<Derivedb> & b,\n  const Eigen::PlainObjectBase<Derivedbc> & bc,\n  igl::BBWData & data,\n  igl::mosek::MosekData & mosek_data,\n  Eigen::PlainObjectBase<DerivedW> & W\n  )\n{\n  using namespace std;\n  using namespace Eigen;\n  assert(!data.partition_unity && \"partition_unity not implemented yet\");\n  // number of domain vertices\n  int n = V.rows();\n  // number of handles\n  int m = bc.cols();\n  // Build biharmonic operator\n  Eigen::SparseMatrix<typename DerivedV::Scalar> Q;\n  harmonic(V,Ele,2,Q);\n  W.derived().resize(n,m);\n  // No linear terms\n  VectorXd c = VectorXd::Zero(n);\n  // No linear constraints\n  SparseMatrix<typename DerivedW::Scalar> A(0,n);\n  VectorXd uc(0,1),lc(0,1);\n  // Upper and lower box constraints (Constant bounds)\n  VectorXd ux = VectorXd::Ones(n);\n  VectorXd lx = VectorXd::Zero(n);\n  // Loop over handles\n  for(int i = 0;i<m;i++)\n  {\n    if(data.verbosity >= 1)\n    {\n      cout<<\"BBW: Computing weight for handle \"<<i+1<<\" out of \"<<m<<\n        \".\"<<endl;\n    }\n    VectorXd bci = bc.col(i);\n    VectorXd Wi;\n    // impose boundary conditions via bounds\n    slice_into(bci,b,ux);\n    slice_into(bci,b,lx);\n    bool r = mosek_quadprog(Q,c,0,A,lc,uc,lx,ux,mosek_data,Wi);\n    if(!r)\n    {\n      return false;\n    }\n    W.col(i) = Wi;\n  }\n#ifndef NDEBUG\n    const double min_rowsum = W.rowwise().sum().array().abs().minCoeff();\n    if(min_rowsum < 0.1)\n    {\n      cerr<<\"bbw.cpp: Warning, minimum row sum is very low. Consider more \"\n        \"active set iterations or enforcing partition of unity.\"<<endl;\n    }\n#endif\n\n  return true;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate bool igl::mosek::bbw<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, igl::BBWData&, igl::mosek::MosekData&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/mosek/bbw.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_MOSEK_BBW_H\n#define IGL_MOSEK_BBW_H\n#include \"../igl_inline.h\"\n#include \"mosek_quadprog.h\"\n#include \"../bbw.h\"\n#include <Eigen/Dense>\n\nnamespace igl\n{\n  namespace mosek\n  {\n    // Compute Bounded Biharmonic Weights on a given domain (V,Ele) with a given\n    // set of boundary conditions\n    //\n    // Templates\n    //   DerivedV  derived type of eigen matrix for V (e.g. MatrixXd)\n    //   DerivedF  derived type of eigen matrix for F (e.g. MatrixXi)\n    //   Derivedb  derived type of eigen matrix for b (e.g. VectorXi)\n    //   Derivedbc  derived type of eigen matrix for bc (e.g. MatrixXd)\n    //   DerivedW  derived type of eigen matrix for W (e.g. MatrixXd)\n    // Inputs:\n    //   V  #V by dim vertex positions\n    //   Ele  #Elements by simplex-size list of element indices\n    //   b  #b boundary indices into V\n    //   bc #b by #W list of boundary values\n    //   data  object containing options, intial guess --> solution and results\n    //   mosek_data  object containing mosek options\n    // Outputs:\n    //   W  #V by #W list of *unnormalized* weights to normalize use\n    //    igl::normalize_row_sums(W,W);\n    // Returns true on success, false on failure\n    template <\n      typename DerivedV,\n      typename DerivedEle,\n      typename Derivedb,\n      typename Derivedbc,\n      typename DerivedW>\n    IGL_INLINE bool bbw(\n      const Eigen::PlainObjectBase<DerivedV> & V,\n      const Eigen::PlainObjectBase<DerivedEle> & Ele,\n      const Eigen::PlainObjectBase<Derivedb> & b,\n      const Eigen::PlainObjectBase<Derivedbc> & bc,\n      igl::BBWData & data,\n      igl::mosek::MosekData & mosek_data,\n      Eigen::PlainObjectBase<DerivedW> & W);\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"bbw.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/mosek/mosek_guarded.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"mosek_guarded.h\"\n#include <iostream>\n\nIGL_INLINE MSKrescodee igl::mosek::mosek_guarded(const MSKrescodee r)\n{\n  using namespace std;\n  if(r != MSK_RES_OK)\n  {\n    /* In case of an error print error code and description. */      \n    char symname[MSK_MAX_STR_LEN];\n    char desc[MSK_MAX_STR_LEN];\n    MSK_getcodedesc(r,symname,desc);\n    cerr<<\"MOSEK ERROR (\"<<r<<\"): \"<<symname<<\" - '\"<<desc<<\"'\"<<endl;\n  }\n  return r;\n}\n\n"
  },
  {
    "path": "libs/libigl/include/igl/mosek/mosek_guarded.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_MOSEK_MOSEK_GUARDED_H\n#define IGL_MOSEK_MOSEK_GUARDED_H\n#include \"../igl_inline.h\"\n\n#include \"mosek.h\"\nnamespace igl\n{\n  namespace mosek\n  {\n    // Little function to wrap around mosek call to handle errors\n    // \n    // Inputs:\n    //   r  mosek error code returned from mosek call\n    // Returns r untouched\n    IGL_INLINE MSKrescodee mosek_guarded(const MSKrescodee r);\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"mosek_guarded.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/mosek/mosek_linprog.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"mosek_linprog.h\"\n#include \"../mosek/mosek_guarded.h\"\n#include \"../harwell_boeing.h\"\n#include <limits>\n#include <cmath>\n#include <vector>\n\nIGL_INLINE bool igl::mosek::mosek_linprog(\n  const Eigen::VectorXd & c,\n  const Eigen::SparseMatrix<double> & A,\n  const Eigen::VectorXd & lc,\n  const Eigen::VectorXd & uc,\n  const Eigen::VectorXd & lx,\n  const Eigen::VectorXd & ux,\n  Eigen::VectorXd & x,\n  Eigen::VectorXd & slc,\n  Eigen::VectorXd & suc)\n{\n  // variables for mosek task, env and result code\n  MSKenv_t env;\n  // Create the MOSEK environment\n  mosek_guarded(MSK_makeenv(&env,NULL));\n  // initialize mosek environment\n  mosek_guarded(MSK_initenv(env));\n  const bool ret = mosek_linprog(c,A,lc,uc,lx,ux,env,x,slc,suc);\n  MSK_deleteenv(&env);\n  return ret;\n}\n\nIGL_INLINE bool igl::mosek::mosek_linprog(\n  const Eigen::VectorXd & c,\n  const Eigen::SparseMatrix<double> & A,\n  const Eigen::VectorXd & lc,\n  const Eigen::VectorXd & uc,\n  const Eigen::VectorXd & lx,\n  const Eigen::VectorXd & ux,\n  const MSKenv_t & env,\n  Eigen::VectorXd & x,\n  Eigen::VectorXd & slc,\n  Eigen::VectorXd & suc)\n{\n  // following http://docs.mosek.com/7.1/capi/Linear_optimization.html\n  using namespace std;\n  // number of constraints\n  const int m = A.rows();\n  // number of variables\n  const int n = A.cols();\n\n\n  vector<double> vAv;\n  vector<int> vAri,vAcp;\n  int nr;\n  harwell_boeing(A,nr,vAv,vAri,vAcp);\n\n  MSKtask_t task;\n  // Create the optimization task\n  mosek_guarded(MSK_maketask(env,m,n,&task));\n  // no threads\n  mosek_guarded(MSK_putintparam(task,MSK_IPAR_NUM_THREADS,1));\n  if(m>0)\n  {\n    // Append 'm' empty constraints, the constrainst will initially have no\n    // bounds\n    mosek_guarded(MSK_appendcons(task,m));\n  }\n  mosek_guarded(MSK_appendvars(task,n));\n\n  \n  const auto & key = [](const double lxj, const double uxj) ->\n    MSKboundkeye\n  {\n    MSKboundkeye k = MSK_BK_FR;\n    if(isfinite(lxj) && isfinite(uxj))\n    {\n      if(lxj < uxj)\n      {\n        k = MSK_BK_RA;\n      }else{\n        k = MSK_BK_FX;\n      }\n    }else if(isfinite(lxj))\n    {\n      k = MSK_BK_LO;\n    }else if(isfinite(uxj))\n    {\n      k = MSK_BK_UP;\n    }\n    return k;\n  };\n\n  //mosek_guarded(mosek.iparam.optimizer,mosek.optimizertype.dual_simplex);\n\n  // loop over variables\n  for(int j = 0;j<n;j++)\n  {\n    if(c.size() > 0)\n    {\n      // Set linear term c_j in the objective\n      mosek_guarded(MSK_putcj(task,j,c(j)));\n    }\n\n    // Set constant bounds on variable j\n    const double lxj = lx.size()>0?lx[j]:-numeric_limits<double>::infinity();\n    const double uxj = ux.size()>0?ux[j]: numeric_limits<double>::infinity();\n    mosek_guarded(MSK_putvarbound(task,j,key(lxj,uxj),lxj,uxj));\n\n    if(m>0)\n    {\n      // Input column j of A\n      mosek_guarded(\n        MSK_putacol(\n          task,\n          j,\n          vAcp[j+1]-vAcp[j],\n          &vAri[vAcp[j]],\n          &vAv[vAcp[j]])\n        );\n    }\n  }\n  // loop over constraints\n  for(int i = 0;i<m;i++)\n  {\n//    // Set constraint bounds for row i\n//    const double lci = lc.size()>0?lc[i]:-numeric_limits<double>::infinity();\n//    const double uci = uc.size()>0?uc[i]: numeric_limits<double>::infinity();\n//    //mosek_guarded(MSK_putconbound(task,i,key(lci,uci),lci,uci));\n//    mosek_guarded(MSK_putconbound(task,i,MSK_BK_RA,lci,uci));\n\n      // Set constraint bounds for row i\n      const double lci = lc.size()>0?lc[i]:-numeric_limits<double>::infinity();\n      const double uci = uc.size()>0?uc[i]: numeric_limits<double>::infinity();\n\n      mosek_guarded(MSK_putconbound(task,i,key(lci,uci),lci,uci));\n      //mosek_guarded(MSK_putconbound(task,i,MSK_BK_RA,lci,uci));\n  }\n\n  // Now the optimizer has been prepared\n  MSKrescodee trmcode;\n\n  //MSK_putobjsense(task, MSK_OBJECTIVE_SENSE_MINIMIZE);\n  //MSK_putparam(task,)\n  MSK_putintparam(task, MSK_IPAR_OPTIMIZER, MSK_OPTIMIZER_FREE);\n  //MSK_putintparam(task,MSK_IPAR_INTPNT_SOLVE_FORM,MSK_SOLVE_DUAL);\n  // run the optimizer\n  mosek_guarded(MSK_optimizetrm(task,&trmcode));\n  // Get status\n  MSKsolstae solsta;\n  MSK_getsolsta (task,MSK_SOL_ITR,&solsta);\n  bool success = false;\n\n  switch(solsta)\n  {\n    case MSK_SOL_STA_OPTIMAL:   \n    case MSK_SOL_STA_NEAR_OPTIMAL:\n      x.resize(n);\n      slc.resize(m);\n      suc.resize(m);\n      /* Request the basic solution. */ \n      //MSK_getxx(task,MSK_SOL_BAS,x.data());\n\n      MSK_getsolution(task,MSK_SOL_ITR,NULL,NULL,NULL,\n                       NULL,NULL,NULL,x.data(),NULL,\n                       slc.data(),suc.data(),NULL,NULL,NULL);\n\n//      std::cout<<\"SLC \"<<std::endl;\n//      std::cout<<slc<<std::endl;\n//      std::cout<<\"SUC \"<<std::endl;\n//      std::cout<<suc<<std::endl;\n//      }\n      success = true;\n      break;\n    case MSK_SOL_STA_DUAL_INFEAS_CER:\n    case MSK_SOL_STA_PRIM_INFEAS_CER:\n    case MSK_SOL_STA_NEAR_DUAL_INFEAS_CER:\n    case MSK_SOL_STA_NEAR_PRIM_INFEAS_CER:  \n      printf(\"Primal or dual infeasibility certificate found.\\n\");\n      break;\n    case MSK_SOL_STA_UNKNOWN:\n      printf(\"The status of the solution could not be determined.\\n\");\n      break;\n    default:\n      printf(\"Other solution status.\");\n      break;\n  }\n\n  MSK_deletetask(&task);\n\n  return success;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/mosek/mosek_linprog.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_MOSEK_MOSEK_LINPROG_H\n#define IGL_MOSEK_MOSEK_LINPROG_H\n#include \"../igl_inline.h\"\n#include <Eigen/Core>\n#include <Eigen/Sparse>\n#include <mosek.h>\nnamespace igl\n{\n  namespace mosek\n  {\n    // Solve a linear program using mosek:\n    // \n    // min c'x\n    // s.t. lc <= A x <= uc\n    //      lx <= x <= ux\n    //\n    // Inputs:\n    //   c  #x list of linear objective coefficients\n    //   A  #A by #x matrix of linear inequality constraint coefficients\n    //   lc  #A list of lower constraint bounds\n    //   uc  #A list of upper constraint bounds\n    //   lx  #x list of lower variable bounds\n    //   ux  #x list of upper variable bounds\n    // Outputs:\n    //   x  #x list of solution values\n    // Returns true iff success.\n    IGL_INLINE bool mosek_linprog(\n        const Eigen::VectorXd & c,\n        const Eigen::SparseMatrix<double> & A,\n        const Eigen::VectorXd & lc,\n        const Eigen::VectorXd & uc,\n        const Eigen::VectorXd & lx,\n        const Eigen::VectorXd & ux,\n        Eigen::VectorXd & x,\n        Eigen::VectorXd & slc,\n        Eigen::VectorXd & suc);\n\n    // Wrapper that keeps mosek environment alive (if licence checking is\n    // becoming a bottleneck)\n    IGL_INLINE bool mosek_linprog(\n        const Eigen::VectorXd & c,\n        const Eigen::SparseMatrix<double> & A,\n        const Eigen::VectorXd & lc,\n        const Eigen::VectorXd & uc,\n        const Eigen::VectorXd & lx,\n        const Eigen::VectorXd & ux,\n        const MSKenv_t & env,\n        Eigen::VectorXd & x,\n        Eigen::VectorXd & slc,\n        Eigen::VectorXd & suc);\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"mosek_linprog.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/mosek/mosek_quadprog.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"mosek_quadprog.h\"\n#include \"mosek_guarded.h\"\n#include <cstdio>\n#include \"../find.h\"\n#include \"../verbose.h\"\n#include \"../speye.h\"\n#include \"../matrix_to_list.h\"\n#include \"../list_to_matrix.h\"\n#include \"../harwell_boeing.h\"\n#include \"../EPS.h\"\n\n\nigl::mosek::MosekData::MosekData()\n{\n\n\n  // These are the default settings that worked well for BBW. Your miles may\n  // very well be kilometers.\n\n  // >1e0 NONSOLUTION\n  // 1e-1 artifacts in deformation\n  // 1e-3 artifacts in isolines\n  // 1e-4 seems safe\n  // 1e-8 MOSEK DEFAULT SOLUTION\n  douparam[MSK_DPAR_INTPNT_TOL_REL_GAP]=1e-8;\n  // Force using multiple threads, not sure if MOSEK is properly destorying\n  //extra threads...\n#if MSK_VERSION_MAJOR >= 7\n  intparam[MSK_IPAR_NUM_THREADS] = 6;\n#elif MSK_VERSION_MAJOR == 6\n  intparam[MSK_IPAR_INTPNT_NUM_THREADS] = 6;\n#endif\n#if MSK_VERSION_MAJOR == 6\n  // Force turn off data check\n  intparam[MSK_IPAR_DATA_CHECK]=MSK_OFF;\n#endif\n  // Turn off presolving\n  // intparam[MSK_IPAR_PRESOLVE_USE] = MSK_PRESOLVE_MODE_OFF;\n  // Force particular matrix reordering method\n  // MSK_ORDER_METHOD_NONE cuts time in half roughly, since half the time is\n  //   usually spent reordering the matrix\n  // !! WARNING Setting this parameter to anything but MSK_ORDER_METHOD_FREE\n  //   seems to have the effect of setting it to MSK_ORDER_METHOD_NONE\n  //   *Or maybe Mosek is spending a bunch of time analyzing the matrix to\n  //   choose the right ordering method when really any of them are\n  //   instantaneous\n  intparam[MSK_IPAR_INTPNT_ORDER_METHOD] = MSK_ORDER_METHOD_NONE;\n  // 1.0 means optimizer is very leniant about declaring model infeasible\n  douparam[MSK_DPAR_INTPNT_TOL_INFEAS] = 1e-8;\n  // Hard to say if this is doing anything, probably nothing dramatic\n  douparam[MSK_DPAR_INTPNT_TOL_PSAFE]= 1e2;\n  // Turn off convexity check\n  intparam[MSK_IPAR_CHECK_CONVEXITY] = MSK_CHECK_CONVEXITY_NONE;\n}\n\n  /* Directs the log stream to the 'printstr' function. */\n  // Little function mosek needs in order to know how to print to std out\n  void printstr(void *handle,const char str[])\n  {\n    printf(\"%s\",str);\n  }\n\ntemplate <typename Index, typename Scalar>\nIGL_INLINE bool igl::mosek::mosek_quadprog(\n  const Index n,\n  std::vector<Index> & Qi,\n  std::vector<Index> & Qj,\n  std::vector<Scalar> & Qv,\n  const std::vector<Scalar> & c,\n  const Scalar cf,\n  const Index m,\n  std::vector<Scalar> & Av,\n  std::vector<Index> & Ari,\n  const std::vector<Index> & Acp,\n  const std::vector<Scalar> & lc,\n  const std::vector<Scalar> & uc,\n  const std::vector<Scalar> & lx,\n  const std::vector<Scalar> & ux,\n  MosekData & mosek_data,\n  std::vector<Scalar> & x,\n  std::vector<Scalar> *slc,\n  std::vector<Scalar> *suc)\n{\n    const auto & key = [](const double lxj, const double uxj) ->\n      MSKboundkeye\n    {\n      MSKboundkeye k = MSK_BK_FR;\n      if(isfinite(lxj) && isfinite(uxj))\n      {\n        if(lxj < uxj)\n        {\n          k = MSK_BK_RA;\n        }else{\n          k = MSK_BK_FX;\n        }\n      }else if(isfinite(lxj))\n      {\n        k = MSK_BK_LO;\n      }else if(isfinite(uxj))\n      {\n        k = MSK_BK_UP;\n      }\n      return k;\n    };\n  // I J V vectors of Q should all be same length\n  assert(Qv.size() == Qi.size());\n  assert(Qv.size() == Qj.size());\n  // number of columns in linear constraint matrix must be ≤ number of\n  // variables\n  assert( (int)Acp.size() == (n+1));\n  // linear bound vectors must be size of number of constraints or empty\n  assert( ((int)lc.size() == m) || ((int)lc.size() == 0));\n  assert( ((int)uc.size() == m) || ((int)uc.size() == 0));\n  // constant bound vectors must be size of number of variables or empty\n  assert( ((int)lx.size() == n) || ((int)lx.size() == 0));\n  assert( ((int)ux.size() == n) || ((int)ux.size() == 0));\n\n  // allocate space for solution in x\n  x.resize(n);\n\n  if (slc!=NULL)slc->resize(m);\n  if (suc!=NULL)suc->resize(m);\n\n  // variables for mosek task, env and result code\n  MSKenv_t env;\n  MSKtask_t task;\n\n  // Create the MOSEK environment\n#if MSK_VERSION_MAJOR >= 7\n  mosek_guarded(MSK_makeenv(&env,NULL));\n#elif MSK_VERSION_MAJOR == 6\n  mosek_guarded(MSK_makeenv(&env,NULL,NULL,NULL,NULL));\n#endif\n\n//  /* Directs the log stream to the 'printstr' function. */\n//  // Little function mosek needs in order to know how to print to std out\n//  const auto & printstr = [](void *handle, char str[])\n//  {\n//    printf(\"%s\",str);\n//  };\n\n//  mosek_guarded(MSK_linkfunctoenvstream(env,MSK_STREAM_LOG,NULL,printstr));\n\n\n  // initialize mosek environment\n  mosek_guarded(MSK_initenv(env));\n  // Create the optimization task\n  mosek_guarded(MSK_maketask(env,m,n,&task));\n  verbose(\"Creating task with %ld linear constraints and %ld variables...\\n\",m,n);\n\n  MSK_linkfunctotaskstream(task,MSK_STREAM_LOG,NULL,&printstr);\n\n  // Tell mosek how to print to std out\n  //mosek_guarded(MSK_linkfunctotaskstream(task,MSK_STREAM_LOG,NULL,printstr));\n  // Give estimate of number of variables\n  mosek_guarded(MSK_putmaxnumvar(task,n));\n  if(m>0)\n  {\n    // Give estimate of number of constraints\n    mosek_guarded(MSK_putmaxnumcon(task,m));\n    // Give estimate of number of non zeros in A\n    mosek_guarded(MSK_putmaxnumanz(task,Av.size()));\n  }\n  // Give estimate of number of non zeros in Q\n  mosek_guarded(MSK_putmaxnumqnz(task,Qv.size()));\n  if(m>0)\n  {\n    // Append 'm' empty constraints, the constrainst will initially have no\n    // bounds\n#if MSK_VERSION_MAJOR >= 7\n    mosek_guarded(MSK_appendcons(task,m));\n#elif MSK_VERSION_MAJOR == 6\n    mosek_guarded(MSK_append(task,MSK_ACC_CON,m));\n#endif\n  }\n  // Append 'n' variables\n#if MSK_VERSION_MAJOR >= 7\n  mosek_guarded(MSK_appendvars(task,n));\n#elif MSK_VERSION_MAJOR == 6\n  mosek_guarded(MSK_append(task,MSK_ACC_VAR,n));\n#endif\n  // add a contant term to the objective\n  mosek_guarded(MSK_putcfix(task,cf));\n\n  // loop over variables\n  for(int j = 0;j<n;j++)\n  {\n    if(c.size() > 0)\n    {\n      // Set linear term c_j in the objective\n      mosek_guarded(MSK_putcj(task,j,c[j]));\n    }\n\n    // Set constant bounds on variable j\n    mosek_guarded(MSK_putbound(task,MSK_ACC_VAR,j,key(lx[j],ux[j]),lx[j],ux[j]));\n//    if(lx[j] == ux[j])\n//    {\n//      mosek_guarded(MSK_putbound(task,MSK_ACC_VAR,j,MSK_BK_FX,lx[j],ux[j]));\n//    }else\n//    {\n//      mosek_guarded(MSK_putbound(task,MSK_ACC_VAR,j,MSK_BK_RA,lx[j],ux[j]));\n//    }\n\n    if(m>0)\n    {\n      // Input column j of A\n#if MSK_VERSION_MAJOR >= 7\n      mosek_guarded(\n        MSK_putacol(\n          task,\n          j,\n          Acp[j+1]-Acp[j],\n          &Ari[Acp[j]],\n          &Av[Acp[j]])\n        );\n#elif MSK_VERSION_MAJOR == 6\n      mosek_guarded(\n        MSK_putavec(\n          task,\n          MSK_ACC_VAR,\n          j,\n          Acp[j+1]-Acp[j],\n          &Ari[Acp[j]],\n          &Av[Acp[j]])\n        );\n#endif\n    }\n  }\n\n  // loop over constraints\n  for(int i = 0;i<m;i++)\n  {\n    // put bounds  on constraints\n    //mosek_guarded(MSK_putbound(task,MSK_ACC_CON,i,MSK_BK_RA,lc[i],uc[i]));\n      mosek_guarded(MSK_putbound(task,MSK_ACC_CON,i,key(lc[i],uc[i]),lc[i],uc[i]));\n  }\n\n  // Input Q for the objective (REMEMBER Q SHOULD ONLY BE LOWER TRIANGLE)\n  mosek_guarded(MSK_putqobj(task,Qv.size(),&Qi[0],&Qj[0],&Qv[0]));\n\n  // Set up task parameters\n  for(\n    std::map<MSKiparame,int>::iterator pit = mosek_data.intparam.begin();\n    pit != mosek_data.intparam.end(); \n    pit++)\n  {\n    mosek_guarded(MSK_putintparam(task,pit->first,pit->second));\n  }\n  for(\n    std::map<MSKdparame,double>::iterator pit = mosek_data.douparam.begin();\n    pit != mosek_data.douparam.end(); \n    pit++)\n  {\n    mosek_guarded(MSK_putdouparam(task,pit->first,pit->second));\n  }\n\n  // Now the optimizer has been prepared\n  MSKrescodee trmcode;\n  // run the optimizer\n  mosek_guarded(MSK_optimizetrm(task,&trmcode));\n\n  //// Print a summary containing information about the solution for debugging\n  //// purposes\n  MSK_solutionsummary(task,MSK_STREAM_LOG);\n\n  // Get status of solution\n  MSKsolstae solsta;\n#if MSK_VERSION_MAJOR >= 7\n  MSK_getsolsta (task,MSK_SOL_ITR,&solsta);\n#elif MSK_VERSION_MAJOR == 6\n  MSK_getsolutionstatus(task,MSK_SOL_ITR,NULL,&solsta);\n#endif\n\n  //MSK_printdata(task, MSK_STREAM_LOG, 0, m, 0, n,0, 0, 1, 0, 1, 0, 1, 1, 0, 0);\n\n//  MSK_getsolutionslice(task,MSK_SOL_ITR,MSK_SOL_ITEM_XX,0,n,&x[0]);\n//if (slc!=NULL)\n//  MSK_getsolutionslice(task,MSK_SOL_ITR,MSK_SOL_ITEM_SLC,0,m,&(*slc)[0]);\n//if (suc!=NULL)\n//  MSK_getsolutionslice(task,MSK_SOL_ITR,MSK_SOL_ITEM_SUC,0,m,&(*suc)[0]);\n\n  bool success = false;\n  switch(solsta)\n  {\n    case MSK_SOL_STA_OPTIMAL:\n    case MSK_SOL_STA_NEAR_OPTIMAL:\n    case MSK_SOL_STA_UNKNOWN:\n        MSK_getsolutionslice(task,MSK_SOL_ITR,MSK_SOL_ITEM_XX,0,n,&x[0]);\n      if (slc!=NULL)\n        MSK_getsolutionslice(task,MSK_SOL_ITR,MSK_SOL_ITEM_SLC,0,m,&(*slc)[0]);\n      if (suc!=NULL)\n        MSK_getsolutionslice(task,MSK_SOL_ITR,MSK_SOL_ITEM_SUC,0,m,&(*suc)[0]);\n      MSK_getsolutionslice(task,MSK_SOL_ITR,MSK_SOL_ITEM_XX,0,n,&x[0]);\n    if (slc!=NULL)\n      MSK_getsolutionslice(task,MSK_SOL_ITR,MSK_SOL_ITEM_SLC,0,m,&(*slc)[0]);\n    if (suc!=NULL)\n      MSK_getsolutionslice(task,MSK_SOL_ITR,MSK_SOL_ITEM_SUC,0,m,&(*suc)[0]);\n      //printf(\"Optimal primal solution\\n\");\n      //for(size_t j=0; j<n; ++j)\n      //{\n      //  printf(\"x[%ld]: %g\\n\",j,x[j]);\n      //}\n      success = true;\n      break;\n    case MSK_SOL_STA_DUAL_INFEAS_CER:\n    case MSK_SOL_STA_PRIM_INFEAS_CER:\n    case MSK_SOL_STA_NEAR_DUAL_INFEAS_CER:\n    case MSK_SOL_STA_NEAR_PRIM_INFEAS_CER:\n      printf(\"Primal or dual infeasibility certificate found.\\n\");\n      break;\n      //printf(\"The status of the solution could not be determined.\\n\");\n      break;\n    default:\n      //printf(\"Other solution status.\");\n      break;\n  }\n\n  MSK_deletetask(&task);\n  MSK_deleteenv(&env);\n\n  return success;\n  //return true;\n}\n\nIGL_INLINE bool igl::mosek::mosek_quadprog(\n  const Eigen::SparseMatrix<double> & Q,\n  const Eigen::VectorXd & c,\n  const double cf,\n  const Eigen::SparseMatrix<double> & A,\n  const Eigen::VectorXd & lc,\n  const Eigen::VectorXd & uc,\n  const Eigen::VectorXd & lx,\n  const Eigen::VectorXd & ux,\n  MosekData & mosek_data,\n  Eigen::VectorXd & x,\n  std::vector<double> *slc,\n  std::vector<double> *suc)\n{\n  using namespace Eigen;\n  using namespace std;\n\n  // Q should be square\n  assert(Q.rows() == Q.cols());\n  // Q should be symmetric\n#ifdef EIGEN_HAS_A_BUG_AND_FAILS_TO_LET_ME_COMPUTE_Q_MINUS_Q_TRANSPOSE\n  assert( (Q-Q.transpose()).sum() < FLOAT_EPS);\n#endif\n  // Only keep lower triangular part of Q\n  SparseMatrix<double> QL;\n  //QL = Q.template triangularView<Lower>();\n  QL = Q.triangularView<Lower>();\n  VectorXi Qi,Qj;\n  VectorXd Qv;\n  find(QL,Qi,Qj,Qv);\n  vector<int> vQi = matrix_to_list(Qi);\n  vector<int> vQj = matrix_to_list(Qj);\n  vector<double> vQv = matrix_to_list(Qv);\n\n  // Convert linear term\n  vector<double> vc = matrix_to_list(c);\n\n  assert(lc.size() == A.rows());\n  assert(uc.size() == A.rows());\n  // Convert A to harwell boeing format\n  vector<double> vAv;\n  vector<int> vAr,vAc;\n  int nr;\n  harwell_boeing(A,nr,vAv,vAr,vAc);\n\n  assert(lx.size() == Q.rows());\n  assert(ux.size() == Q.rows());\n  vector<double> vlc = matrix_to_list(lc);\n  vector<double> vuc = matrix_to_list(uc);\n  vector<double> vlx = matrix_to_list(lx);\n  vector<double> vux = matrix_to_list(ux);\n\n  vector<double> vx;\n  bool ret = mosek_quadprog(\n    Q.rows(),vQi,vQj,vQv,\n    vc,\n    cf,\n    nr,\n    vAv, vAr, vAc,\n    vlc,vuc,\n    vlx,vux,\n    mosek_data,\n    vx,\n    slc,\n    suc);\n  list_to_matrix(vx,x);\n  return ret;\n}\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template declarations\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/mosek/mosek_quadprog.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_MOSEK_MOSEK_QUADPROG_H\n#define IGL_MOSEK_MOSEK_QUADPROG_H\n#include \"../igl_inline.h\"\n#include <vector>\n#include <map>\n#include <mosek.h>\n\n\n#define EIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET\n#include <Eigen/Dense>\n#include <Eigen/Sparse>\n\nnamespace igl\n{\n  namespace mosek\n  {\n    struct MosekData\n    {\n      // Integer parameters\n      std::map<MSKiparame,int> intparam;\n      // Double parameters\n      std::map<MSKdparame,double> douparam;\n      // Default values\n      IGL_INLINE MosekData();\n    };\n    // Solve a convex quadratic optimization problem with linear and constant\n    // bounds, that is:\n    //\n    // Minimize: ½ * xT * Q⁰ * x + cT * x + cf\n    //\n    // Subject to: lc ≤ Ax ≤ uc\n    //             lx ≤ x ≤ ux\n    //\n    // where we are trying to find the optimal vector of values x. \n    //\n    // Note: Q⁰ must be symmetric and the ½ is a convention of MOSEK\n    //\n    // Note: Because of how MOSEK accepts different parts of the system, Q\n    // should be stored in IJV (aka Coordinate) format and should only include\n    // entries in the lower triangle. A should be stored in Column compressed\n    // (aka Harwell Boeing) format. As described:\n    // http://netlib.org/linalg/html_templates/node92.html\n    // or\n    // http://en.wikipedia.org/wiki/Sparse_matrix\n    //   #Compressed_sparse_column_.28CSC_or_CCS.29\n    // \n    //\n    // Templates:\n    //   Index  type for index variables\n    //   Scalar  type for floating point variables (gets cast to double?)\n    // Input:\n    //   n  number of variables, i.e. size of x\n    //   Qi  vector of qnnz row indices of non-zeros in LOWER TRIANGLE ONLY of\n    //       Q⁰\n    //   Qj  vector of qnnz column indices of non-zeros in LOWER TRIANGLE ONLY\n    //       of Q⁰\n    //   Qv  vector of qnnz values of non-zeros in LOWER TRIANGLE ONLY of Q⁰, \n    //       such that:\n    //\n    //           Q⁰(Qi[k],Qj[k]) = Qv[k] for k ∈ [0,Qnnz-1], where Qnnz is the\n    // \n    //       number of non-zeros in Q⁰\n    //   c   (optional) vector of n values of c, transpose of coefficient row\n    //       vector of linear terms, EMPTY means c == 0\n    //   cf  (ignored) value of constant term in objective, 0 means cf == 0, so\n    //       optional only in the sense that it is mandatory\n    //   m  number of constraints, therefore also number of rows in linear\n    //      constraint coefficient matrix A, and in linear constraint bound\n    //      vectors lc and uc\n    //   Av  vector of non-zero values of A, in column compressed order\n    //   Ari  vector of row indices corresponding to non-zero values of A,\n    //   Acp  vector of indices into Ari and Av of the first entry for each\n    //        column of A, size(Acp) = (# columns of A) + 1 = n + 1\n    //   lc  vector of m linear constraint lower bounds\n    //   uc  vector of m linear constraint upper bounds\n    //   lx  vector of n constant lower bounds\n    //   ux  vector of n constant upper bounds\n    // Output:\n    //   x  vector of size n to hold output of optimization\n    // Return:\n    //   true only if optimization was successful with no errors\n    // \n    // Note: All indices are 0-based\n    //\n    template <typename Index, typename Scalar>\n    IGL_INLINE bool mosek_quadprog(\n      const Index n,\n      /* mosek won't allow this to be const*/ std::vector<Index> & Qi,\n      /* mosek won't allow this to be const*/ std::vector<Index> & Qj,\n      /* mosek won't allow this to be const*/ std::vector<Scalar> & Qv,\n      const std::vector<Scalar> & c,\n      const Scalar cf,\n      const Index m,\n      /* mosek won't allow this to be const*/ std::vector<Scalar> & Av,\n      /* mosek won't allow this to be const*/ std::vector<Index> & Ari,\n      const std::vector<Index> & Acp,\n      const std::vector<Scalar> & lc,\n      const std::vector<Scalar> & uc,\n      const std::vector<Scalar> & lx,\n      const std::vector<Scalar> & ux,\n      MosekData & mosek_data,\n      std::vector<Scalar> & x,\n      std::vector<Scalar> *slc=NULL,\n      std::vector<Scalar> *suc=NULL);\n    // Wrapper with Eigen elements\n    //\n    // Inputs:\n    //   Q  n by n square quadratic coefficients matrix **only lower triangle\n    //      is used**.\n    //   c  n-long vector of linear coefficients\n    //   cf  constant coefficient\n    //   A  m by n square linear coefficienst matrix of inequality constraints\n    //   lc  m-long vector of lower bounds for linear inequality constraints\n    //   uc  m-long vector of upper bounds for linear inequality constraints\n    //   lx  n-long vector of lower bounds\n    //   ux  n-long vector of upper bounds\n    //   mosek_data  parameters struct\n    // Outputs:\n    //   x  n-long solution vector\n    // Returns true only if optimization finishes without error\n    //\n    IGL_INLINE bool mosek_quadprog(\n      const Eigen::SparseMatrix<double> & Q,\n      const Eigen::VectorXd & c,\n      const double cf,\n      const Eigen::SparseMatrix<double> & A,\n      const Eigen::VectorXd & lc,\n      const Eigen::VectorXd & uc,\n      const Eigen::VectorXd & lx,\n      const Eigen::VectorXd & ux,\n      MosekData & mosek_data,\n      Eigen::VectorXd & x,\n      std::vector<double> *slc=NULL,\n      std::vector<double> *suc=NULL);\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"mosek_quadprog.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/mvc.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"mvc.h\"\n#include <vector>\n#include <cassert>\n#include <iostream>\n\n// Broken Implementation\nIGL_INLINE void igl::mvc(const Eigen::MatrixXd &V, const Eigen::MatrixXd &C, Eigen::MatrixXd &W)\n{\n  \n  // at least three control points\n  assert(C.rows()>2);\n  \n  // dimension of points\n  assert(C.cols() == 3 || C.cols() == 2);\n  assert(V.cols() == 3 || V.cols() == 2);\n  \n  // number of polygon points\n  int num = C.rows();\n  \n  Eigen::MatrixXd V1,C1;\n  int i_prev, i_next;\n  \n  // check if either are 3D but really all z's are 0\n  bool V_flat = (V.cols() == 3) && (std::sqrt( (V.col(3)).dot(V.col(3)) ) < 1e-10);\n  bool C_flat = (C.cols() == 3) && (std::sqrt( (C.col(3)).dot(C.col(3)) ) < 1e-10);\n\n  // if both are essentially 2D then ignore z-coords\n  if((C.cols() == 2 || C_flat) && (V.cols() == 2 || V_flat))\n  {\n    // ignore z coordinate\n    V1 = V.block(0,0,V.rows(),2);\n    C1 = C.block(0,0,C.rows(),2);\n  }\n  else\n  {\n    // give dummy z coordinate to either mesh or poly\n    if(V.rows() == 2)\n    {\n      V1 = Eigen::MatrixXd(V.rows(),3);\n      V1.block(0,0,V.rows(),2) = V;\n    }\n    else\n      V1 = V;\n\n    if(C.rows() == 2)\n    {\n      C1 = Eigen::MatrixXd(C.rows(),3);\n      C1.block(0,0,C.rows(),2) = C;\n    }\n    else\n      C1 = C;\n\n    // check that C is planar\n    // average normal around poly corners\n\n    Eigen::Vector3d n = Eigen::Vector3d::Zero();\n    // take centroid as point on plane\n    Eigen::Vector3d p = Eigen::Vector3d::Zero();\n    for (int i = 0; i<num; ++i)\n    {\n      i_prev = (i>0)?(i-1):(num-1);\n      i_next = (i<num-1)?(i+1):0;\n      Eigen::Vector3d vnext = (C1.row(i_next) - C1.row(i)).transpose();\n      Eigen::Vector3d vprev = (C1.row(i_prev) - C1.row(i)).transpose();\n      n += vnext.cross(vprev);\n      p += C1.row(i);\n    }\n    p/=num;\n    n/=num;\n    // normalize n\n    n /= std::sqrt(n.dot(n));\n    \n    // check that poly is really coplanar\n#ifndef NDEBUG\n    for (int i = 0; i<num; ++i)\n    {\n      double dist_to_plane_C = std::abs((C1.row(i)-p.transpose()).dot(n));\n      assert(dist_to_plane_C<1e-10);\n    }\n#endif\n    \n    // check that poly is really coplanar\n    for (int i = 0; i<V1.rows(); ++i)\n    {\n      double dist_to_plane_V = std::abs((V1.row(i)-p.transpose()).dot(n));\n      if(dist_to_plane_V>1e-10)\n        std::cerr<<\"Distance from V to plane of C is large...\"<<std::endl;\n    }\n    \n    // change of basis\n    Eigen::Vector3d b1 = C1.row(1)-C1.row(0);\n    Eigen::Vector3d b2 = n.cross(b1);\n    // normalize basis rows\n    b1 /= std::sqrt(b1.dot(b1));\n    b2 /= std::sqrt(b2.dot(b2));\n    n /= std::sqrt(n.dot(n));\n    \n    //transpose of the basis matrix in the m-file\n    Eigen::Matrix3d basis = Eigen::Matrix3d::Zero();\n    basis.col(0) = b1;\n    basis.col(1) = b2;\n    basis.col(2) = n;\n    \n    // change basis of rows vectors by right multiplying with inverse of matrix\n    // with basis vectors as rows\n    Eigen::ColPivHouseholderQR<Eigen::Matrix3d> solver = basis.colPivHouseholderQr();\n    // Throw away coordinates in normal direction\n    V1 = solver.solve(V1.transpose()).transpose().block(0,0,V1.rows(),2);\n    C1 = solver.solve(C1.transpose()).transpose().block(0,0,C1.rows(),2);\n    \n  }\n  \n  // vectors from V to every C, where CmV(i,j,:) is the vector from domain\n  // vertex j to handle i\n  double EPS = 1e-10;\n  Eigen::MatrixXd WW = Eigen::MatrixXd(C1.rows(), V1.rows());\n  Eigen::MatrixXd dist_C_V (C1.rows(), V1.rows());\n  std::vector< std::pair<int,int> > on_corner(0);\n  std::vector< std::pair<int,int> > on_segment(0);\n  for (int i = 0; i<C1.rows(); ++i)\n  {\n    i_prev = (i>0)?(i-1):(num-1);\n    i_next = (i<num-1)?(i+1):0;\n    // distance from each corner in C to the next corner so that edge_length(i) \n    // is the distance from C(i,:) to C(i+1,:) defined cyclically\n    double edge_length = std::sqrt((C1.row(i) - C1.row(i_next)).dot(C1.row(i) - C1.row(i_next)));\n    for (int j = 0; j<V1.rows(); ++j)\n    {\n      Eigen::VectorXd v = C1.row(i) - V1.row(j);\n      Eigen::VectorXd vnext = C1.row(i_next) - V1.row(j);\n      Eigen::VectorXd vprev = C1.row(i_prev) - V1.row(j);\n      // distance from V to every C, where dist_C_V(i,j) is the distance from domain\n      // vertex j to handle i\n      dist_C_V(i,j) = std::sqrt(v.dot(v));\n      double dist_C_V_next = std::sqrt(vnext.dot(vnext));\n      double a_prev = std::atan2(vprev[1],vprev[0]) - std::atan2(v[1],v[0]);\n      double a_next = std::atan2(v[1],v[0]) - std::atan2(vnext[1],vnext[0]);\n      // mean value coordinates\n      WW(i,j) = (std::tan(a_prev/2.0) + std::tan(a_next/2.0)) / dist_C_V(i,j);\n      \n      if (dist_C_V(i,j) < EPS)\n        on_corner.push_back(std::make_pair(j,i));\n      else\n        // only in case of no-corner (no need for checking for multiple segments afterwards --\n        // should only be on one segment (otherwise must be on a corner and we already\n        // handled that)\n        // domain vertex j is on the segment from i to i+1 if the distances from vj to\n        // pi and pi+1 are about \n        if(std::abs((dist_C_V(i,j) + dist_C_V_next) / edge_length - 1) < EPS)\n          on_segment.push_back(std::make_pair(j,i));\n      \n    }\n  }\n  \n  // handle degenerate cases\n  // snap vertices close to corners\n  for (unsigned i = 0; i<on_corner.size(); ++i)\n  {\n    int vi = on_corner[i].first;\n    int ci = on_corner[i].second;\n    for (int ii = 0; ii<C.rows(); ++ii)\n      WW(ii,vi) = (ii==ci)?1:0;\n  }\n  \n  // snap vertices close to segments\n  for (unsigned i = 0; i<on_segment.size(); ++i)\n  {\n    int vi = on_segment[i].first;\n    int ci = on_segment[i].second;\n    int ci_next = (ci<num-1)?(ci+1):0;\n    for (int ii = 0; ii<C.rows(); ++ii)\n      if (ii == ci)\n        WW(ii,vi) = dist_C_V(ci_next,vi);\n      else\n      {\n        if ( ii == ci_next)\n          WW(ii,vi)  = dist_C_V(ci,vi);\n        else\n          WW(ii,vi) = 0;\n      }\n  }\n  \n  // normalize W\n  for (int i = 0; i<V.rows(); ++i)\n    WW.col(i) /= WW.col(i).sum();\n  \n  // we've made W transpose\n  W = WW.transpose();\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/mvc.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_MVC_H\n#define IGL_MVC_H\n\n#include \"igl_inline.h\"\n#include <Eigen/Dense>\n\nnamespace igl \n{\n  //   MVC - MEAN VALUE COORDINATES\n  //  \n  //   mvc(V,C,W)\n  //  \n  //   Inputs:\n  //    V  #V x dim list of vertex positions (dim = 2 or dim = 3)\n  //    C  #C x dim list of polygon vertex positions in counter-clockwise order\n  //      (dim = 2 or dim = 3)\n  //  \n  //   Outputs:\n  //    W  weights, #V by #C matrix of weights\n  //  \n  //  Known Bugs: implementation is listed as \"Broken\"\n  IGL_INLINE void mvc(\n    const Eigen::MatrixXd &V, \n    const Eigen::MatrixXd &C, \n    Eigen::MatrixXd &W);\n  \n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"mvc.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/n_polyvector.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"LinSpaced.h\"\n#include \"n_polyvector.h\"\n#include \"edge_topology.h\"\n#include \"local_basis.h\"\n#include \"nchoosek.h\"\n#include \"slice.h\"\n#include \"polyroots.h\"\n#include \"igl_inline.h\"\n#include <Eigen/Sparse>\n\n#include <Eigen/Geometry>\n#include <iostream>\n#include <complex>\n\nnamespace igl {\n  template <typename DerivedV, typename DerivedF>\n  class PolyVectorFieldFinder\n  {\n  private:\n    const Eigen::PlainObjectBase<DerivedV> &V;\n    const Eigen::PlainObjectBase<DerivedF> &F; int numF;\n    const int n;\n\n    Eigen::MatrixXi EV; int numE;\n    Eigen::MatrixXi F2E;\n    Eigen::MatrixXi E2F;\n    Eigen::VectorXd K;\n\n    Eigen::VectorXi isBorderEdge;\n    int numInteriorEdges;\n    Eigen::Matrix<int,Eigen::Dynamic,2> E2F_int;\n    Eigen::VectorXi indInteriorToFull;\n    Eigen::VectorXi indFullToInterior;\n\n    DerivedV B1, B2, FN;\n\n    IGL_INLINE void computek();\n    IGL_INLINE void setFieldFromGeneralCoefficients(const  std::vector<Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic,1> > &coeffs,\n                                                    std::vector<Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 2> > &pv);\n    IGL_INLINE void computeCoefficientLaplacian(int n, Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > &D);\n    IGL_INLINE void getGeneralCoeffConstraints(const Eigen::VectorXi &isConstrained,\n                                    const Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, Eigen::Dynamic> &cfW,\n                                    int k,\n                                    Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic,1> &Ck);\n    IGL_INLINE void precomputeInteriorEdges();\n\n\n    IGL_INLINE void minQuadWithKnownMini(const Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > &Q,\n                                         const Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > &f,\n                                         const Eigen::VectorXi isConstrained,\n                                         const Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic, 1> &xknown,\n                                         Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic, 1> &x);\n\n  public:\n    IGL_INLINE PolyVectorFieldFinder(const Eigen::PlainObjectBase<DerivedV> &_V,\n                                     const Eigen::PlainObjectBase<DerivedF> &_F,\n                                     const int &_n);\n    IGL_INLINE bool solve(const Eigen::VectorXi &isConstrained,\n               const Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, Eigen::Dynamic> &cfW,\n               Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, Eigen::Dynamic> &output);\n\n  };\n}\n\ntemplate<typename DerivedV, typename DerivedF>\nIGL_INLINE igl::PolyVectorFieldFinder<DerivedV, DerivedF>::\n          PolyVectorFieldFinder(const Eigen::PlainObjectBase<DerivedV> &_V,\n                                const Eigen::PlainObjectBase<DerivedF> &_F,\n                                const int &_n):\nV(_V),\nF(_F),\nnumF(_F.rows()),\nn(_n)\n{\n\n  igl::edge_topology(V,F,EV,F2E,E2F);\n  numE = EV.rows();\n\n\n  precomputeInteriorEdges();\n\n  igl::local_basis(V,F,B1,B2,FN);\n\n  computek();\n\n};\n\n\ntemplate<typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::PolyVectorFieldFinder<DerivedV, DerivedF>::\nprecomputeInteriorEdges()\n{\n  // Flag border edges\n  numInteriorEdges = 0;\n  isBorderEdge.setZero(numE,1);\n  indFullToInterior = -1*Eigen::VectorXi::Ones(numE,1);\n\n  for(unsigned i=0; i<numE; ++i)\n  {\n    if ((E2F(i,0) == -1) || ((E2F(i,1) == -1)))\n      isBorderEdge[i] = 1;\n      else\n      {\n        indFullToInterior[i] = numInteriorEdges;\n        numInteriorEdges++;\n      }\n  }\n\n  E2F_int.resize(numInteriorEdges, 2);\n  indInteriorToFull.setZero(numInteriorEdges,1);\n  int ii = 0;\n  for (int k=0; k<numE; ++k)\n  {\n    if (isBorderEdge[k])\n      continue;\n    E2F_int.row(ii) = E2F.row(k);\n    indInteriorToFull[ii] = k;\n    ii++;\n  }\n\n}\n\n\ntemplate<typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::PolyVectorFieldFinder<DerivedV, DerivedF>::\nminQuadWithKnownMini(const Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > &Q,\n                          const Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > &f,\n                     const Eigen::VectorXi isConstrained,\n                          const Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic, 1> &xknown,\n                          Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic, 1> &x)\n{\n  int N = Q.rows();\n\n  int nc = xknown.rows();\n  Eigen::VectorXi known; known.setZero(nc,1);\n  Eigen::VectorXi unknown; unknown.setZero(N-nc,1);\n\n  int indk = 0, indu = 0;\n  for (int i = 0; i<N; ++i)\n    if (isConstrained[i])\n    {\n      known[indk] = i;\n      indk++;\n    }\n    else\n    {\n      unknown[indu] = i;\n      indu++;\n    }\n\n  Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > Quu, Quk;\n\n  igl::slice(Q,unknown, unknown, Quu);\n  igl::slice(Q,unknown, known, Quk);\n\n\n  std::vector<typename Eigen::Triplet<std::complex<typename DerivedV::Scalar> > > tripletList;\n\n  Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > fu(N-nc,1);\n\n  igl::slice(f,unknown, Eigen::VectorXi::Zero(1,1), fu);\n\n  Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > rhs = (Quk*xknown).sparseView()+.5*fu;\n\n  Eigen::SparseLU< Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > > solver;\n  solver.compute(-Quu);\n  if(solver.info()!=Eigen::Success)\n  {\n    std::cerr<<\"Decomposition failed!\"<<std::endl;\n    return;\n  }\n  Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> >  b  = solver.solve(rhs);\n  if(solver.info()!=Eigen::Success)\n  {\n    std::cerr<<\"Solving failed!\"<<std::endl;\n    return;\n  }\n\n  indk = 0, indu = 0;\n  x.setZero(N,1);\n  for (int i = 0; i<N; ++i)\n    if (isConstrained[i])\n      x[i] = xknown[indk++];\n    else\n      x[i] = b.coeff(indu++,0);\n\n}\n\n\n\ntemplate<typename DerivedV, typename DerivedF>\nIGL_INLINE bool igl::PolyVectorFieldFinder<DerivedV, DerivedF>::\n                     solve(const Eigen::VectorXi &isConstrained,\n                           const Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, Eigen::Dynamic> &cfW,\n                           Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, Eigen::Dynamic> &output)\n{\n\n  // polynomial is of the form:\n  // (-1)^0 z^(2n) +\n  // (-1)^1 c[0]z^(2n-2) +\n  // (-1)^2 c[1]z^(2n-4) +\n  // (-1)^3 c[2]z^(2n-6) +\n  // ... +\n  // (-1)^n c[n-1]\n\n  std::vector<Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic,1> > coeffs(n,Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic,1>::Zero(numF, 1));\n\n  for (int i =0; i<n; ++i)\n  {\n    int degree = 2*(i+1);\n\n    Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic,1> Ck;\n    getGeneralCoeffConstraints(isConstrained,\n                               cfW,\n                               i,\n                               Ck);\n\n    Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > DD;\n    computeCoefficientLaplacian(degree, DD);\n    Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > f; f.resize(numF,1);\n\n    minQuadWithKnownMini(DD, f, isConstrained, Ck, coeffs[i]);\n  }\n\n  std::vector<Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 2> > pv;\n  setFieldFromGeneralCoefficients(coeffs, pv);\n\n  output.setZero(numF,3*n);\n  for (int fi=0; fi<numF; ++fi)\n  {\n    const Eigen::Matrix<typename DerivedV::Scalar, 1, 3> &b1 = B1.row(fi);\n    const Eigen::Matrix<typename DerivedV::Scalar, 1, 3> &b2 = B2.row(fi);\n    for (int i=0; i<n; ++i)\n      output.block(fi,3*i, 1, 3) = pv[i](fi,0)*b1 + pv[i](fi,1)*b2;\n  }\n  return true;\n}\n\ntemplate<typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::PolyVectorFieldFinder<DerivedV, DerivedF>::setFieldFromGeneralCoefficients(const  std::vector<Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic,1> > &coeffs,\n                                                            std::vector<Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 2> > &pv)\n{\n  pv.assign(n, Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 2>::Zero(numF, 2));\n  for (int i = 0; i <numF; ++i)\n  {\n\n    //    poly coefficients: 1, 0, -Acoeff, 0, Bcoeff\n    //    matlab code from roots (given there are no trailing zeros in the polynomial coefficients)\n    Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic,1> polyCoeff;\n    polyCoeff.setZero(2*n+1,1);\n    polyCoeff[0] = 1.;\n    int sign = 1;\n    for (int k =0; k<n; ++k)\n    {\n      sign = -sign;\n      int degree = 2*(k+1);\n      polyCoeff[degree] = (1.*sign)*coeffs[k](i);\n    }\n\n    Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic,1> roots;\n    igl::polyRoots<std::complex<typename DerivedV::Scalar>, typename DerivedV::Scalar >(polyCoeff,roots);\n\n    Eigen::VectorXi done; done.setZero(2*n,1);\n\n    Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic,1> u(n,1);\n    int ind =0;\n    for (int k=0; k<2*n; ++k)\n    {\n      if (done[k])\n        continue;\n      u[ind] = roots[k];\n      done[k] = 1;\n\n      int mini = -1;\n      double mind = 1e10;\n      for (int l =k+1; l<2*n; ++l)\n      {\n        double dist = abs(roots[l]+u[ind]);\n        if (dist<mind)\n        {\n          mind = dist;\n          mini = l;\n        }\n      }\n      done[mini] = 1;\n      ind ++;\n    }\n    for (int k=0; k<n; ++k)\n    {\n      pv[k](i,0) = real(u[k]);\n      pv[k](i,1) = imag(u[k]);\n    }\n  }\n\n}\n\n\ntemplate<typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::PolyVectorFieldFinder<DerivedV, DerivedF>::computeCoefficientLaplacian(int n, Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > &D)\n{\n  std::vector<Eigen::Triplet<std::complex<typename DerivedV::Scalar> > > tripletList;\n\n  // For every non-border edge\n  for (unsigned eid=0; eid<numE; ++eid)\n  {\n    if (!isBorderEdge[eid])\n    {\n      int fid0 = E2F(eid,0);\n      int fid1 = E2F(eid,1);\n\n      tripletList.push_back(Eigen::Triplet<std::complex<typename DerivedV::Scalar> >(fid0,\n                                           fid0,\n                                           std::complex<typename DerivedV::Scalar>(1.)));\n      tripletList.push_back(Eigen::Triplet<std::complex<typename DerivedV::Scalar> >(fid1,\n                                           fid1,\n                                           std::complex<typename DerivedV::Scalar>(1.)));\n      tripletList.push_back(Eigen::Triplet<std::complex<typename DerivedV::Scalar> >(fid0,\n                                           fid1,\n                                                                                     -1.*std::polar(1.,-1.*n*K[eid])));\n      tripletList.push_back(Eigen::Triplet<std::complex<typename DerivedV::Scalar> >(fid1,\n                                           fid0,\n                                                                                     -1.*std::polar(1.,1.*n*K[eid])));\n\n    }\n  }\n  D.resize(numF,numF);\n  D.setFromTriplets(tripletList.begin(), tripletList.end());\n\n\n}\n\ntemplate<typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::PolyVectorFieldFinder<DerivedV, DerivedF>::getGeneralCoeffConstraints(const Eigen::VectorXi &isConstrained,\n                                                       const Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, Eigen::Dynamic> &cfW,\n                                                       int k,\n                                                       Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic,1> &Ck)\n{\n  int numConstrained = isConstrained.sum();\n  Ck.resize(numConstrained,1);\n  int n = cfW.cols()/3;\n\n  Eigen::MatrixXi allCombs;\n  {\n    Eigen::VectorXi V = igl::LinSpaced<Eigen::VectorXi >(n,0,n-1);\n    igl::nchoosek(V,k+1,allCombs);\n  }\n\n\n  int ind = 0;\n  for (int fi = 0; fi <numF; ++fi)\n  {\n    const Eigen::Matrix<typename DerivedV::Scalar, 1, 3> &b1 = B1.row(fi);\n    const Eigen::Matrix<typename DerivedV::Scalar, 1, 3> &b2 = B2.row(fi);\n    if(isConstrained[fi])\n    {\n      std::complex<typename DerivedV::Scalar> ck(0);\n\n      for (int j = 0; j < allCombs.rows(); ++j)\n      {\n        std::complex<typename DerivedV::Scalar> tk(1.);\n        //collect products\n        for (int i = 0; i < allCombs.cols(); ++i)\n        {\n          int index = allCombs(j,i);\n\n          const Eigen::Matrix<typename DerivedV::Scalar, 1, 3> &w = cfW.block(fi,3*index,1,3);\n          typename DerivedV::Scalar w0 = w.dot(b1);\n          typename DerivedV::Scalar w1 = w.dot(b2);\n          std::complex<typename DerivedV::Scalar> u(w0,w1);\n          tk*= u*u;\n        }\n        //collect sum\n        ck += tk;\n      }\n      Ck(ind) = ck;\n      ind ++;\n    }\n  }\n\n\n}\n\ntemplate<typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::PolyVectorFieldFinder<DerivedV, DerivedF>::computek()\n{\n  K.setZero(numE);\n  // For every non-border edge\n  for (unsigned eid=0; eid<numE; ++eid)\n  {\n    if (!isBorderEdge[eid])\n    {\n      int fid0 = E2F(eid,0);\n      int fid1 = E2F(eid,1);\n\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> N0 = FN.row(fid0);\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> N1 = FN.row(fid1);\n\n      // find common edge on triangle 0 and 1\n      int fid0_vc = -1;\n      int fid1_vc = -1;\n      for (unsigned i=0;i<3;++i)\n      {\n        if (F2E(fid0,i) == eid)\n          fid0_vc = i;\n        if (F2E(fid1,i) == eid)\n          fid1_vc = i;\n      }\n      assert(fid0_vc != -1);\n      assert(fid1_vc != -1);\n\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> common_edge = V.row(F(fid0,(fid0_vc+1)%3)) - V.row(F(fid0,fid0_vc));\n      common_edge.normalize();\n\n      // Map the two triangles in a new space where the common edge is the x axis and the N0 the z axis\n      Eigen::Matrix<typename DerivedV::Scalar, 3, 3> P;\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> o = V.row(F(fid0,fid0_vc));\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> tmp = -N0.cross(common_edge);\n      P << common_edge, tmp, N0;\n//      P.transposeInPlace();\n\n\n      Eigen::Matrix<typename DerivedV::Scalar, 3, 3> V0;\n      V0.row(0) = V.row(F(fid0,0)) -o;\n      V0.row(1) = V.row(F(fid0,1)) -o;\n      V0.row(2) = V.row(F(fid0,2)) -o;\n\n      V0 = (P*V0.transpose()).transpose();\n\n//      assert(V0(0,2) < 1e-10);\n//      assert(V0(1,2) < 1e-10);\n//      assert(V0(2,2) < 1e-10);\n\n      Eigen::Matrix<typename DerivedV::Scalar, 3, 3> V1;\n      V1.row(0) = V.row(F(fid1,0)) -o;\n      V1.row(1) = V.row(F(fid1,1)) -o;\n      V1.row(2) = V.row(F(fid1,2)) -o;\n      V1 = (P*V1.transpose()).transpose();\n\n//      assert(V1(fid1_vc,2) < 10e-10);\n//      assert(V1((fid1_vc+1)%3,2) < 10e-10);\n\n      // compute rotation R such that R * N1 = N0\n      // i.e. map both triangles to the same plane\n      double alpha = -atan2(V1((fid1_vc+2)%3,2),V1((fid1_vc+2)%3,1));\n\n      Eigen::Matrix<typename DerivedV::Scalar, 3, 3> R;\n      R << 1,          0,            0,\n      0, cos(alpha), -sin(alpha) ,\n      0, sin(alpha),  cos(alpha);\n      V1 = (R*V1.transpose()).transpose();\n\n//      assert(V1(0,2) < 1e-10);\n//      assert(V1(1,2) < 1e-10);\n//      assert(V1(2,2) < 1e-10);\n\n      // measure the angle between the reference frames\n      // k_ij is the angle between the triangle on the left and the one on the right\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> ref0 = V0.row(1) - V0.row(0);\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> ref1 = V1.row(1) - V1.row(0);\n\n      ref0.normalize();\n      ref1.normalize();\n\n      double ktemp = atan2(ref1(1),ref1(0)) - atan2(ref0(1),ref0(0));\n\n      // just to be sure, rotate ref0 using angle ktemp...\n      Eigen::Matrix<typename DerivedV::Scalar, 2, 2> R2;\n      R2 << cos(ktemp), -sin(ktemp), sin(ktemp), cos(ktemp);\n\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 2> tmp1 = R2*(ref0.head(2)).transpose();\n\n//      assert(tmp1(0) - ref1(0) < 1e-10);\n//      assert(tmp1(1) - ref1(1) < 1e-10);\n\n      K[eid] = ktemp;\n    }\n  }\n\n}\n\n\nIGL_INLINE void igl::n_polyvector(const Eigen::MatrixXd &V,\n                             const Eigen::MatrixXi &F,\n                             const Eigen::VectorXi& b,\n                             const Eigen::MatrixXd& bc,\n                             Eigen::MatrixXd &output)\n{\n  Eigen::VectorXi isConstrained = Eigen::VectorXi::Constant(F.rows(),0);\n  Eigen::MatrixXd cfW = Eigen::MatrixXd::Constant(F.rows(),bc.cols(),0);\n\n  for(unsigned i=0; i<b.size();++i)\n  {\n    isConstrained(b(i)) = 1;\n    cfW.row(b(i)) << bc.row(i);\n  }\n  if (b.size() == F.rows())\n  {\n    output = cfW;\n    return;\n  }\n\n  int n = cfW.cols()/3;\n  igl::PolyVectorFieldFinder<Eigen::MatrixXd, Eigen::MatrixXi> pvff(V,F,n);\n  pvff.solve(isConstrained, cfW, output);\n}\n\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/n_polyvector.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_N_POLYVECTOR\n#define IGL_N_POLYVECTOR\n#include \"igl_inline.h\"\n\n#include <Eigen/Core>\n#include <vector>\n\nnamespace igl {\n  //todo\n  /// Given 2 vectors centered on origin calculate the rotation matrix from first to the second\n\n  // Inputs:\n  //   v0, v1         the two #3 by 1 vectors\n  //   normalized     boolean, if false, then the vectors are normalized prior to the calculation\n  // Output:\n  //                  3 by 3 rotation matrix that takes v0 to v1\n  //\n\n  IGL_INLINE void n_polyvector(const Eigen::MatrixXd& V,\n                               const Eigen::MatrixXi& F,\n                               const Eigen::VectorXi& b,\n                               const Eigen::MatrixXd& bc,\n                               Eigen::MatrixXd &output);\n\n};\n\n\n#ifndef IGL_STATIC_LIBRARY\n#include \"n_polyvector.cpp\"\n#endif\n\n\n#endif /* defined(IGL_N_POLYVECTOR) */\n"
  },
  {
    "path": "libs/libigl/include/igl/n_polyvector_general.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"LinSpaced.h\"\n#include \"n_polyvector_general.h\"\n#include \"edge_topology.h\"\n#include \"local_basis.h\"\n#include \"nchoosek.h\"\n#include \"slice.h\"\n#include \"polyroots.h\"\n#include <Eigen/Sparse>\n#include <Eigen/Geometry>\n#include <iostream>\n#include <iostream>\n\nnamespace igl {\n  template <typename DerivedV, typename DerivedF>\n  class GeneralPolyVectorFieldFinder\n  {\n  private:\n    const Eigen::PlainObjectBase<DerivedV> &V;\n    const Eigen::PlainObjectBase<DerivedF> &F; int numF;\n    const int n;\n\n    Eigen::MatrixXi EV; int numE;\n    Eigen::MatrixXi F2E;\n    Eigen::MatrixXi E2F;\n    Eigen::VectorXd K;\n\n    Eigen::VectorXi isBorderEdge;\n    int numInteriorEdges;\n    Eigen::Matrix<int,Eigen::Dynamic,2> E2F_int;\n    Eigen::VectorXi indInteriorToFull;\n    Eigen::VectorXi indFullToInterior;\n\n    DerivedV B1, B2, FN;\n\n    IGL_INLINE void computek();\n    IGL_INLINE void setFieldFromGeneralCoefficients(const  std::vector<Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic,1>> &coeffs,\n                                                    std::vector<Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 2> > &pv);\n    IGL_INLINE void computeCoefficientLaplacian(int n, Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > &D);\n    IGL_INLINE void getGeneralCoeffConstraints(const Eigen::VectorXi &isConstrained,\n                                    const Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, Eigen::Dynamic> &cfW,\n                                    int k,\n                                    const Eigen::VectorXi &rootsIndex,\n                                    Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic,1> &Ck);\n    IGL_INLINE void precomputeInteriorEdges();\n\n\n    IGL_INLINE void minQuadWithKnownMini(const Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > &Q,\n                                         const Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > &f,\n                                         const Eigen::VectorXi isConstrained,\n                                         const Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic, 1> &xknown,\n                                         Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic, 1> &x);\n\n  public:\n    IGL_INLINE GeneralPolyVectorFieldFinder(const Eigen::PlainObjectBase<DerivedV> &_V,\n                                     const Eigen::PlainObjectBase<DerivedF> &_F,\n                                     const int &_n);\n    IGL_INLINE bool solve(const Eigen::VectorXi &isConstrained,\n               const Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, Eigen::Dynamic> &cfW,\n               const Eigen::VectorXi &rootsIndex,\n               Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, Eigen::Dynamic> &output);\n\n  };\n}\n\ntemplate<typename DerivedV, typename DerivedF>\nIGL_INLINE igl::GeneralPolyVectorFieldFinder<DerivedV, DerivedF>::\n          GeneralPolyVectorFieldFinder(const Eigen::PlainObjectBase<DerivedV> &_V,\n                                const Eigen::PlainObjectBase<DerivedF> &_F,\n                                const int &_n):\nV(_V),\nF(_F),\nnumF(_F.rows()),\nn(_n)\n{\n\n  igl::edge_topology(V,F,EV,F2E,E2F);\n  numE = EV.rows();\n\n\n  precomputeInteriorEdges();\n\n  igl::local_basis(V,F,B1,B2,FN);\n\n  computek();\n\n};\n\n\ntemplate<typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::GeneralPolyVectorFieldFinder<DerivedV, DerivedF>::\nprecomputeInteriorEdges()\n{\n  // Flag border edges\n  numInteriorEdges = 0;\n  isBorderEdge.setZero(numE,1);\n  indFullToInterior = -1*Eigen::VectorXi::Ones(numE,1);\n\n  for(unsigned i=0; i<numE; ++i)\n  {\n    if ((E2F(i,0) == -1) || ((E2F(i,1) == -1)))\n      isBorderEdge[i] = 1;\n      else\n      {\n        indFullToInterior[i] = numInteriorEdges;\n        numInteriorEdges++;\n      }\n  }\n\n  E2F_int.resize(numInteriorEdges, 2);\n  indInteriorToFull.setZero(numInteriorEdges,1);\n  int ii = 0;\n  for (int k=0; k<numE; ++k)\n  {\n    if (isBorderEdge[k])\n      continue;\n    E2F_int.row(ii) = E2F.row(k);\n    indInteriorToFull[ii] = k;\n    ii++;\n  }\n\n}\n\n\ntemplate<typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::GeneralPolyVectorFieldFinder<DerivedV, DerivedF>::\nminQuadWithKnownMini(const Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > &Q,\n                          const Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > &f,\n                     const Eigen::VectorXi isConstrained,\n                          const Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic, 1> &xknown,\n                          Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic, 1> &x)\n{\n  int N = Q.rows();\n\n  int nc = xknown.rows();\n  Eigen::VectorXi known; known.setZero(nc,1);\n  Eigen::VectorXi unknown; unknown.setZero(N-nc,1);\n\n  int indk = 0, indu = 0;\n  for (int i = 0; i<N; ++i)\n    if (isConstrained[i])\n    {\n      known[indk] = i;\n      indk++;\n    }\n    else\n    {\n      unknown[indu] = i;\n      indu++;\n    }\n\n  Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar>> Quu, Quk;\n\n  igl::slice(Q,unknown, unknown, Quu);\n  igl::slice(Q,unknown, known, Quk);\n\n\n  std::vector<typename Eigen::Triplet<std::complex<typename DerivedV::Scalar> > > tripletList;\n\n  Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > fu(N-nc,1);\n\n  igl::slice(f,unknown, Eigen::VectorXi::Zero(1,1), fu);\n\n  Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > rhs = (Quk*xknown).sparseView()+.5*fu;\n\n  Eigen::SparseLU< Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar>>> solver;\n  solver.compute(-Quu);\n  if(solver.info()!=Eigen::Success)\n  {\n    std::cerr<<\"Decomposition failed!\"<<std::endl;\n    return;\n  }\n  Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar>>  b  = solver.solve(rhs);\n  if(solver.info()!=Eigen::Success)\n  {\n    std::cerr<<\"Solving failed!\"<<std::endl;\n    return;\n  }\n\n  indk = 0, indu = 0;\n  x.setZero(N,1);\n  for (int i = 0; i<N; ++i)\n    if (isConstrained[i])\n      x[i] = xknown[indk++];\n    else\n      x[i] = b.coeff(indu++,0);\n\n}\n\n\n\ntemplate<typename DerivedV, typename DerivedF>\nIGL_INLINE bool igl::GeneralPolyVectorFieldFinder<DerivedV, DerivedF>::\n                     solve(const Eigen::VectorXi &isConstrained,\n                           const Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, Eigen::Dynamic> &cfW,\n                           const Eigen::VectorXi &rootsIndex,\n                           Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, Eigen::Dynamic> &output)\n{\n  // polynomial is of the form:\n  // z^(2n) +\n  // -c[0]z^(2n-1) +\n  // c[1]z^(2n-2) +\n  // -c[2]z^(2n-3) +\n  // ... +\n  // (-1)^n c[n-1]\n  std::vector<Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic,1>> coeffs(n,Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic,1>::Zero(numF, 1));\n  for (int i =0; i<n; ++i)\n  {\n    int degree = i+1;\n    Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic,1> Ck;\n    getGeneralCoeffConstraints(isConstrained,\n                               cfW,\n                               i,\n                               rootsIndex,\n                               Ck);\n\n    Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > DD;\n    computeCoefficientLaplacian(degree, DD);\n    Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > f; f.resize(numF,1);\n\n    if (isConstrained.sum() == numF)\n      coeffs[i] = Ck;\n    else\n      minQuadWithKnownMini(DD, f, isConstrained, Ck, coeffs[i]);\n  }\n  std::vector<Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 2> > pv;\n  setFieldFromGeneralCoefficients(coeffs, pv);\n  output.setZero(numF,3*n);\n  for (int fi=0; fi<numF; ++fi)\n  {\n    const Eigen::Matrix<typename DerivedV::Scalar, 1, 3> &b1 = B1.row(fi);\n    const Eigen::Matrix<typename DerivedV::Scalar, 1, 3> &b2 = B2.row(fi);\n    for (int i=0; i<n; ++i)\n      output.block(fi,3*i, 1, 3) = pv[i](fi,0)*b1 + pv[i](fi,1)*b2;\n  }\n  return true;\n}\n\ntemplate<typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::GeneralPolyVectorFieldFinder<DerivedV, DerivedF>::setFieldFromGeneralCoefficients(const  std::vector<Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic,1>> &coeffs,\n                                                            std::vector<Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 2>> &pv)\n{\n  pv.assign(n, Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 2>::Zero(numF, 2));\n  for (int i = 0; i <numF; ++i)\n  {\n\n    //    poly coefficients: 1, 0, -Acoeff, 0, Bcoeff\n    //    matlab code from roots (given there are no trailing zeros in the polynomial coefficients)\n    Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic,1> polyCoeff;\n    polyCoeff.setZero(n+1,1);\n    polyCoeff[0] = 1.;\n    int sign = 1;\n    for (int k =0; k<n; ++k)\n    {\n      sign = -sign;\n      int degree = k+1;\n      polyCoeff[degree] = (1.*sign)*coeffs[k](i);\n    }\n\n    Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic,1> roots;\n    igl::polyRoots<std::complex<typename DerivedV::Scalar>, typename DerivedV::Scalar >(polyCoeff,roots);\n    for (int k=0; k<n; ++k)\n    {\n      pv[k](i,0) = real(roots[k]);\n      pv[k](i,1) = imag(roots[k]);\n    }\n  }\n\n}\n\n\ntemplate<typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::GeneralPolyVectorFieldFinder<DerivedV, DerivedF>::computeCoefficientLaplacian(int n, Eigen::SparseMatrix<std::complex<typename DerivedV::Scalar> > &D)\n{\n  std::vector<Eigen::Triplet<std::complex<typename DerivedV::Scalar> >> tripletList;\n\n  // For every non-border edge\n  for (unsigned eid=0; eid<numE; ++eid)\n  {\n    if (!isBorderEdge[eid])\n    {\n      int fid0 = E2F(eid,0);\n      int fid1 = E2F(eid,1);\n\n      tripletList.push_back(Eigen::Triplet<std::complex<typename DerivedV::Scalar> >(fid0,\n                                           fid0,\n                                           std::complex<typename DerivedV::Scalar>(1.)));\n      tripletList.push_back(Eigen::Triplet<std::complex<typename DerivedV::Scalar> >(fid1,\n                                           fid1,\n                                           std::complex<typename DerivedV::Scalar>(1.)));\n      tripletList.push_back(Eigen::Triplet<std::complex<typename DerivedV::Scalar> >(fid0,\n                                           fid1,\n                                                                                     -1.*std::polar(1.,-1.*n*K[eid])));\n      tripletList.push_back(Eigen::Triplet<std::complex<typename DerivedV::Scalar> >(fid1,\n                                           fid0,\n                                                                                     -1.*std::polar(1.,1.*n*K[eid])));\n\n    }\n  }\n  D.resize(numF,numF);\n  D.setFromTriplets(tripletList.begin(), tripletList.end());\n\n\n}\n\n//this gives the coefficients without the (-1)^k that multiplies them\ntemplate<typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::GeneralPolyVectorFieldFinder<DerivedV, DerivedF>::getGeneralCoeffConstraints(const Eigen::VectorXi &isConstrained,\n                                                       const Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, Eigen::Dynamic> &cfW,\n                                                       int k,\n                                                       const Eigen::VectorXi &rootsIndex,\n                                                       Eigen::Matrix<std::complex<typename DerivedV::Scalar>, Eigen::Dynamic,1> &Ck)\n{\n  int numConstrained = isConstrained.sum();\n  Ck.resize(numConstrained,1);\n  // int n = rootsIndex.cols();\n\n  Eigen::MatrixXi allCombs;\n  {\n    Eigen::VectorXi V = igl::LinSpaced<Eigen::VectorXi >(n,0,n-1);\n    igl::nchoosek(V,k+1,allCombs);\n  }\n\n  int ind = 0;\n  for (int fi = 0; fi <numF; ++fi)\n  {\n    const Eigen::Matrix<typename DerivedV::Scalar, 1, 3> &b1 = B1.row(fi);\n    const Eigen::Matrix<typename DerivedV::Scalar, 1, 3> &b2 = B2.row(fi);\n    if(isConstrained[fi])\n    {\n      std::complex<typename DerivedV::Scalar> ck(0);\n\n      for (int j = 0; j < allCombs.rows(); ++j)\n      {\n        std::complex<typename DerivedV::Scalar> tk(1.);\n        //collect products\n        for (int i = 0; i < allCombs.cols(); ++i)\n        {\n          int index = allCombs(j,i);\n\n          int ri = rootsIndex[index];\n          Eigen::Matrix<typename DerivedV::Scalar, 1, 3> w;\n          if (ri>0)\n            w = cfW.block(fi,3*(ri-1),1,3);\n          else\n            w = -cfW.block(fi,3*(-ri-1),1,3);\n          typename DerivedV::Scalar w0 = w.dot(b1);\n          typename DerivedV::Scalar w1 = w.dot(b2);\n          std::complex<typename DerivedV::Scalar> u(w0,w1);\n          tk*= u;\n        }\n        //collect sum\n        ck += tk;\n      }\n      Ck(ind) = ck;\n      ind ++;\n    }\n  }\n\n\n}\n\ntemplate<typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::GeneralPolyVectorFieldFinder<DerivedV, DerivedF>::computek()\n{\n  K.setZero(numE);\n  // For every non-border edge\n  for (unsigned eid=0; eid<numE; ++eid)\n  {\n    if (!isBorderEdge[eid])\n    {\n      int fid0 = E2F(eid,0);\n      int fid1 = E2F(eid,1);\n\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> N0 = FN.row(fid0);\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> N1 = FN.row(fid1);\n\n      // find common edge on triangle 0 and 1\n      int fid0_vc = -1;\n      int fid1_vc = -1;\n      for (unsigned i=0;i<3;++i)\n      {\n        if (F2E(fid0,i) == eid)\n          fid0_vc = i;\n        if (F2E(fid1,i) == eid)\n          fid1_vc = i;\n      }\n      assert(fid0_vc != -1);\n      assert(fid1_vc != -1);\n\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> common_edge = V.row(F(fid0,(fid0_vc+1)%3)) - V.row(F(fid0,fid0_vc));\n      common_edge.normalize();\n\n      // Map the two triangles in a new space where the common edge is the x axis and the N0 the z axis\n      Eigen::Matrix<typename DerivedV::Scalar, 3, 3> P;\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> o = V.row(F(fid0,fid0_vc));\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> tmp = -N0.cross(common_edge);\n      P << common_edge, tmp, N0;\n//      P.transposeInPlace();\n\n\n      Eigen::Matrix<typename DerivedV::Scalar, 3, 3> V0;\n      V0.row(0) = V.row(F(fid0,0)) -o;\n      V0.row(1) = V.row(F(fid0,1)) -o;\n      V0.row(2) = V.row(F(fid0,2)) -o;\n\n      V0 = (P*V0.transpose()).transpose();\n\n//      assert(V0(0,2) < 1e-10);\n//      assert(V0(1,2) < 1e-10);\n//      assert(V0(2,2) < 1e-10);\n\n      Eigen::Matrix<typename DerivedV::Scalar, 3, 3> V1;\n      V1.row(0) = V.row(F(fid1,0)) -o;\n      V1.row(1) = V.row(F(fid1,1)) -o;\n      V1.row(2) = V.row(F(fid1,2)) -o;\n      V1 = (P*V1.transpose()).transpose();\n\n//      assert(V1(fid1_vc,2) < 10e-10);\n//      assert(V1((fid1_vc+1)%3,2) < 10e-10);\n\n      // compute rotation R such that R * N1 = N0\n      // i.e. map both triangles to the same plane\n      double alpha = -atan2(V1((fid1_vc+2)%3,2),V1((fid1_vc+2)%3,1));\n\n      Eigen::Matrix<typename DerivedV::Scalar, 3, 3> R;\n      R << 1,          0,            0,\n      0, cos(alpha), -sin(alpha) ,\n      0, sin(alpha),  cos(alpha);\n      V1 = (R*V1.transpose()).transpose();\n\n//      assert(V1(0,2) < 1e-10);\n//      assert(V1(1,2) < 1e-10);\n//      assert(V1(2,2) < 1e-10);\n\n      // measure the angle between the reference frames\n      // k_ij is the angle between the triangle on the left and the one on the right\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> ref0 = V0.row(1) - V0.row(0);\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> ref1 = V1.row(1) - V1.row(0);\n\n      ref0.normalize();\n      ref1.normalize();\n\n      double ktemp = atan2(ref1(1),ref1(0)) - atan2(ref0(1),ref0(0));\n\n      // just to be sure, rotate ref0 using angle ktemp...\n      Eigen::Matrix<typename DerivedV::Scalar, 2, 2> R2;\n      R2 << cos(ktemp), -sin(ktemp), sin(ktemp), cos(ktemp);\n\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 2> tmp1 = R2*(ref0.head(2)).transpose();\n\n//      assert(tmp1(0) - ref1(0) < 1e-10);\n//      assert(tmp1(1) - ref1(1) < 1e-10);\n\n      K[eid] = ktemp;\n    }\n  }\n\n}\n\n\nIGL_INLINE void igl::n_polyvector_general(const Eigen::MatrixXd &V,\n                             const Eigen::MatrixXi &F,\n                             const Eigen::VectorXi& b,\n                             const Eigen::MatrixXd& bc,\n                             const Eigen::VectorXi &I,\n                             Eigen::MatrixXd &output)\n{\n  Eigen::VectorXi isConstrained = Eigen::VectorXi::Constant(F.rows(),0);\n  Eigen::MatrixXd cfW = Eigen::MatrixXd::Constant(F.rows(),bc.cols(),0);\n\n  for(unsigned i=0; i<b.size();++i)\n  {\n    isConstrained(b(i)) = 1;\n    cfW.row(b(i)) << bc.row(i);\n  }\n  int n = I.rows();\n  igl::GeneralPolyVectorFieldFinder<Eigen::MatrixXd, Eigen::MatrixXi> pvff(V,F,n);\n  pvff.solve(isConstrained, cfW, I, output);\n}\n\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/n_polyvector_general.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_N_POLYVECTOR_GENERAL\n#define IGL_N_POLYVECTOR_GENERAL\n#include \"igl_inline.h\"\n\n#include <Eigen/Core>\n\nnamespace igl {\n  //todo\n  /// Given 2 vectors centered on origin calculate the rotation matrix from first to the second\n\n  // Inputs:\n  //   v0, v1         the two #3 by 1 vectors\n  //   normalized     boolean, if false, then the vectors are normalized prior to the calculation\n  // Output:\n  //                  3 by 3 rotation matrix that takes v0 to v1\n  //\n\n  IGL_INLINE void n_polyvector_general(const Eigen::MatrixXd& V,\n                               const Eigen::MatrixXi& F,\n                               const Eigen::VectorXi& b,\n                               const Eigen::MatrixXd& bc,\n                               const Eigen::VectorXi &I,\n                               Eigen::MatrixXd &output);\n\n};\n\n\n#ifndef IGL_STATIC_LIBRARY\n#include \"n_polyvector_general.cpp\"\n#endif\n\n\n#endif /* defined(IGL_N_POLYVECTOR) */\n"
  },
  {
    "path": "libs/libigl/include/igl/nchoosek.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2015 Olga Diamanti, Alec Jacobson\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"nchoosek.h\"\n#include <cmath>\n#include <cassert>\n\nIGL_INLINE double igl::nchoosek(const int n, const int k)\n{\n  if(k>n/2)\n  {\n    return nchoosek(n,n-k);\n  }else if(k==1)\n  {\n    return n;\n  }else\n  {\n    double c = 1;\n    for(int i = 1;i<=k;i++)\n    {\n      c *= (((double)n-k+i)/((double)i));\n    }\n    return std::round(c);\n  }\n}\n\ntemplate < typename DerivedV, typename DerivedU>\nIGL_INLINE void igl::nchoosek(\n  const Eigen::MatrixBase<DerivedV> & V,\n  const int k,\n  Eigen::PlainObjectBase<DerivedU> & U)\n{\n  using namespace Eigen;\n  if(V.size() == 0)\n  {\n    U.resize(0,k);\n    return;\n  }\n  assert((V.cols() == 1 || V.rows() == 1) && \"V must be a vector\");\n  U.resize(nchoosek(V.size(),k),k);\n  int running_i  = 0;\n  int running_j = 0;\n  Matrix<typename DerivedU::Scalar,1,Dynamic> running(1,k);\n  int N = V.size();\n  const std::function<void(int,int)> doCombs =\n    [&running,&N,&doCombs,&running_i,&running_j,&U,&V](int offset, int k)\n  {\n    if(k==0)\n    {\n      U.row(running_i) = running;\n      running_i++;\n      return;\n    }\n    for (int i = offset; i <= N - k; ++i)\n    {\n      running(running_j) = V(i);\n      running_j++;\n      doCombs(i+1,k-1);\n      running_j--;\n    }\n  };\n  doCombs(0,k);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::nchoosek<Eigen::CwiseNullaryOp<Eigen::internal::linspaced_op<int, true>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::CwiseNullaryOp<Eigen::internal::linspaced_op<int, true>, Eigen::Matrix<int, -1, 1, 0, -1, 1> > > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::nchoosek<Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/nchoosek.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2015 Olga Diamanti, Alec Jacobson\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_NCHOOSEK\n#define IGL_NCHOOSEK\n#include \"igl_inline.h\"\n#include \"deprecated.h\"\n#include <vector>\n\n#include <Eigen/Core>\n\nnamespace igl \n{\n  // NCHOOSEK  Like matlab's nchoosek.\n  //\n  // Inputs:\n  //   n  total number elements\n  //   k  size of sub-set to consider\n  // Returns number of k-size combinations out of the set [1,...,n]\n  IGL_INLINE double nchoosek(const int n, const int k);\n  // \n  // Inputs:\n  //   V  n-long vector of elements\n  //   k  size of sub-set to consider\n  // Outputs:\n  //   U  nchoosek by k long matrix where each row is a unique k-size\n  //     combination\n  template < typename DerivedV, typename DerivedU>\n  IGL_INLINE void nchoosek(\n    const Eigen::MatrixBase<DerivedV> & V,\n    const int k,\n    Eigen::PlainObjectBase<DerivedU> & U);\n}\n\n\n#ifndef IGL_STATIC_LIBRARY\n#include \"nchoosek.cpp\"\n#endif\n\n\n#endif /* defined(IGL_NCHOOSEK) */\n"
  },
  {
    "path": "libs/libigl/include/igl/next_filename.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"next_filename.h\"\n#include \"STR.h\"\n#include \"file_exists.h\"\n#include <cmath>\n#include <iomanip>\n\nbool igl::next_filename(\n  const std::string & prefix, \n  const int zeros,\n  const std::string & suffix,\n  std::string & next)\n{\n  using namespace std;\n  // O(n), for huge lists could at least find bounds with exponential search\n  // and then narrow with binary search O(log(n))\n  int i = 0;\n  while(true)\n  {\n    next = STR(prefix << setfill('0') << setw(zeros)<<i<<suffix);\n    if(!file_exists(next))\n    {\n      return true;\n    }\n    i++;\n    if(zeros > 0 && i >= pow(10,zeros))\n    {\n      return false;\n    }\n  }\n}\n\n"
  },
  {
    "path": "libs/libigl/include/igl/next_filename.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_NEXT_FILENAME_H\n#define IGL_NEXT_FILENAME_H\n#include \"igl_inline.h\"\n#include <string>\nnamespace igl\n{\n  // Find the file with the first filename of the form\n  // \"prefix-%0[zeros]dsuffix\"\n  // \n  // Inputs:\n  //   prefix  path to containing dir and filename prefix\n  //   zeros number of leading zeros as if digit printed with printf\n  //   suffix  suffix of filename and extension\n  // Outputs:\n  //   next  path to next file\n  // Returns true if found, false if exceeding range in zeros\n  IGL_INLINE bool next_filename(\n    const std::string & prefix, \n    const int zeros,\n    const std::string & suffix,\n    std::string & next);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"next_filename.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/normal_derivative.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"LinSpaced.h\"\n#include \"normal_derivative.h\"\n#include \"cotmatrix_entries.h\"\n#include \"slice.h\"\n#include <cassert>\n\ntemplate <\n  typename DerivedV,\n  typename DerivedEle,\n  typename Scalar>\nIGL_INLINE void igl::normal_derivative(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedEle> & Ele,\n  Eigen::SparseMatrix<Scalar>& DD)\n{\n  using namespace Eigen;\n  using namespace std;\n  // Element simplex-size\n  const size_t ss = Ele.cols();\n  assert( ((ss==3) || (ss==4)) && \"Only triangles or tets\");\n  // cotangents\n  Matrix<Scalar,Dynamic,Dynamic> C;\n  cotmatrix_entries(V,Ele,C);\n  vector<Triplet<Scalar> > IJV;\n  // Number of elements\n  const size_t m = Ele.rows();\n  // Number of vertices\n  const size_t n = V.rows();\n  switch(ss)\n  {\n    default:\n      assert(false);\n      return;\n    case 4:\n    {\n      const MatrixXi DDJ =\n        slice(\n          Ele,\n          (VectorXi(24)<<\n            1,0,2,0,3,0,2,1,3,1,0,1,3,2,0,2,1,2,0,3,1,3,2,3).finished(),\n          2);\n      MatrixXi DDI(m,24);\n      for(size_t f = 0;f<4;f++)\n      {\n        const auto & I = (igl::LinSpaced<VectorXi >(m,0,m-1).array()+f*m).eval();\n        for(size_t r = 0;r<6;r++)\n        {\n          DDI.col(f*6+r) = I;\n        }\n      }\n      const DiagonalMatrix<Scalar,24,24> S =\n        (Matrix<Scalar,2,1>(1,-1).template replicate<12,1>()).asDiagonal();\n      Matrix<Scalar,Dynamic,Dynamic> DDV =\n        slice(\n          C,\n          (VectorXi(24)<<\n            2,2,1,1,3,3,0,0,4,4,2,2,5,5,1,1,0,0,3,3,4,4,5,5).finished(),\n          2);\n      DDV *= S;\n\n      IJV.reserve(DDV.size());\n      for(size_t f = 0;f<6*4;f++)\n      {\n        for(size_t e = 0;e<m;e++)\n        {\n          IJV.push_back(Triplet<Scalar>(DDI(e,f),DDJ(e,f),DDV(e,f)));\n        }\n      }\n      DD.resize(m*4,n);\n      DD.setFromTriplets(IJV.begin(),IJV.end());\n      break;\n    }\n    case 3:\n    {\n      const MatrixXi DDJ =\n        slice(Ele,(VectorXi(12)<<2,0,1,0,0,1,2,1,1,2,0,2).finished(),2);\n      MatrixXi DDI(m,12);\n      for(size_t f = 0;f<3;f++)\n      {\n        const auto & I = (igl::LinSpaced<VectorXi >(m,0,m-1).array()+f*m).eval();\n        for(size_t r = 0;r<4;r++)\n        {\n          DDI.col(f*4+r) = I;\n        }\n      }\n      const DiagonalMatrix<Scalar,12,12> S =\n        (Matrix<Scalar,2,1>(1,-1).template replicate<6,1>()).asDiagonal();\n      Matrix<Scalar,Dynamic,Dynamic> DDV =\n        slice(C,(VectorXi(12)<<1,1,2,2,2,2,0,0,0,0,1,1).finished(),2);\n      DDV *= S;\n\n      IJV.reserve(DDV.size());\n      for(size_t f = 0;f<12;f++)\n      {\n        for(size_t e = 0;e<m;e++)\n        {\n          IJV.push_back(Triplet<Scalar>(DDI(e,f),DDJ(e,f),DDV(e,f)));\n        }\n      }\n      DD.resize(m*3,n);\n      DD.setFromTriplets(IJV.begin(),IJV.end());\n      break;\n    }\n  }\n\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::normal_derivative<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, double>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::SparseMatrix<double, 0, int>&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/normal_derivative.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_NORMAL_DERIVATIVE_H\n#define IGL_NORMAL_DERIVATIVE_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Core>\n#include <Eigen/Sparse>\nnamespace igl \n{\n  // NORMAL_DERIVATIVE Computes the directional derivative **normal** to\n  // **all** (half-)edges of a triangle mesh (not just boundary edges). These\n  // are integrated along the edge: they're the per-face constant gradient dot\n  // the rotated edge vector (unit rotated edge vector for direction then\n  // magnitude for integration).\n  //\n  // Inputs:\n  //   V  #V by dim list of mesh vertex positions\n  //   F  #F by 3|4 list of triangle|tetrahedron indices into V\n  // Outputs:\n  //   DD  #F*3|4 by #V sparse matrix representing operator to compute\n  //     directional derivative with respect to each facet of each element.\n  //\n  template <\n    typename DerivedV, \n    typename DerivedEle, \n    typename Scalar>\n  IGL_INLINE void normal_derivative(\n    const Eigen::PlainObjectBase<DerivedV> & V,\n    const Eigen::PlainObjectBase<DerivedEle> & Ele,\n    Eigen::SparseMatrix<Scalar>& DD);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"normal_derivative.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/normalize_quat.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"normalize_quat.h\"\n\n#include \"EPS.h\"\n#include <cmath>\n\ntemplate <typename Q_type>\nIGL_INLINE bool igl::normalize_quat(\n  const Q_type *q,\n  Q_type *out)\n{\n  // Get length\n  Q_type len = sqrt(\n    q[0]*q[0]+\n    q[1]*q[1]+\n    q[2]*q[2]+\n    q[3]*q[3]);\n\n  // Noramlize each coordinate\n  out[0] = q[0]/len;\n  out[1] = q[1]/len;\n  out[2] = q[2]/len;\n  out[3] = q[3]/len;\n\n  // Test whether length was below Epsilon\n  return (len > igl::EPS<Q_type>());\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate bool igl::normalize_quat<double>(double const*, double*);\n// generated by autoexplicit.sh\ntemplate bool igl::normalize_quat<float>(float const*, float*);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/normalize_quat.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_NORMALIZE_QUAT_H\n#define IGL_NORMALIZE_QUAT_H\n#include \"igl_inline.h\"\n\nnamespace igl\n{\n  // Normalize a quaternion\n  // A Quaternion, q, is defined here as an arrays of four scalars (x,y,z,w),\n  // such that q = x*i + y*j + z*k + w\n  // Inputs:\n  //   q  input quaternion\n  // Outputs:\n  //   out  result of normalization, allowed to be same as q\n  // Returns true on success, false if len(q) < EPS\n  template <typename Q_type>\n  IGL_INLINE bool normalize_quat(\n    const Q_type *q,\n    Q_type *out);\n};\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"normalize_quat.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/normalize_row_lengths.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"normalize_row_lengths.h\"\n\ntemplate <typename DerivedV>\nIGL_INLINE void igl::normalize_row_lengths(\n  const Eigen::PlainObjectBase<DerivedV>& A,\n  Eigen::PlainObjectBase<DerivedV> & B)\n{\n  // Resize output\n  B.resizeLike(A);\n\n  // loop over rows\n  for(int i = 0; i < A.rows();i++)\n  {\n    B.row(i) = A.row(i).normalized();\n  }\n  //// Or just:\n  //B = A;\n  //B.rowwise().normalize();\n}\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::normalize_row_lengths<Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::normalize_row_lengths<Eigen::Matrix<double, -1, 3, 1, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> >&);\ntemplate void igl::normalize_row_lengths<Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/normalize_row_lengths.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_NORMALIZE_ROW_LENGTHS_H\n#define IGL_NORMALIZE_ROW_LENGTHS_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n\n// History:\n// March 24, 2012: Alec changed function name from normalize_rows to\n//   normalize_row_lengths to avoid confusion with normalize_row_sums\n\nnamespace igl\n{\n  // Obsolete: just use A.rowwise().normalize() or B=A.rowwise().normalized();\n  //\n  // Normalize the rows in A so that their lengths are each 1 and place the new\n  // entries in B\n  // Inputs:\n  //   A  #rows by k input matrix\n  // Outputs:\n  //   B  #rows by k input matrix, can be the same as A\n  template <typename DerivedV>\n  IGL_INLINE void normalize_row_lengths(\n   const Eigen::PlainObjectBase<DerivedV>& A,\n   Eigen::PlainObjectBase<DerivedV> & B);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"normalize_row_lengths.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/normalize_row_sums.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"normalize_row_sums.h\"\n\ntemplate <typename DerivedA, typename DerivedB>\nIGL_INLINE void igl::normalize_row_sums(\n  const Eigen::MatrixBase<DerivedA>& A,\n  Eigen::MatrixBase<DerivedB> & B)\n{\n#ifndef NDEBUG\n  // loop over rows\n  for(int i = 0; i < A.rows();i++)\n  {\n    typename DerivedB::Scalar sum = A.row(i).sum();\n    assert(sum != 0);\n  }\n#endif\n  B = (A.array().colwise() / A.rowwise().sum().array()).eval();\n}\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::normalize_row_sums<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::normalize_row_sums<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/normalize_row_sums.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_NORMALIZE_ROW_SUMS_H\n#define IGL_NORMALIZE_ROW_SUMS_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n\nnamespace igl\n{\n  // Normalize the rows in A so that their sums are each 1 and place the new\n  // entries in B\n  // Inputs:\n  //   A  #rows by k input matrix\n  // Outputs:\n  //   B  #rows by k input matrix, can be the same as A\n  //\n  // Note: This is just calling an Eigen one-liner.\n  template <typename DerivedA, typename DerivedB>\n  IGL_INLINE void normalize_row_sums(\n    const Eigen::MatrixBase<DerivedA>& A,\n    Eigen::MatrixBase<DerivedB> & B);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"normalize_row_sums.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/null.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"null.h\"\n#include \"EPS.h\"\n\ntemplate <typename DerivedA, typename DerivedN>\nIGL_INLINE void igl::null(\n  const Eigen::PlainObjectBase<DerivedA> & A,\n  Eigen::PlainObjectBase<DerivedN> & N)\n{\n  using namespace Eigen;\n  typedef typename DerivedA::Scalar Scalar;\n  JacobiSVD<MatrixXd> svd(A, ComputeFullV);\n  svd.setThreshold(A.cols() * svd.singularValues().maxCoeff() * EPS<Scalar>());\n  N = svd.matrixV().rightCols(A.cols()-svd.rank());\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/null.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_NULL_H\n#define IGL_NULL_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Dense>\n\nnamespace igl \n{\n  // Like MATLAB's null\n  //\n  // Compute a basis for the null space for the given matrix A: the columns of\n  // the output N form a basis for the space orthogonal to that spanned by the\n  // rows of A.\n  //\n  // Inputs:\n  //   A  m by n matrix\n  // Outputs:\n  //   N  n by r matrix, where r is the row rank of A\n  template <typename DerivedA, typename DerivedN>\n  IGL_INLINE void null(\n    const Eigen::PlainObjectBase<DerivedA> & A,\n    Eigen::PlainObjectBase<DerivedN> & N);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"null.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/on_boundary.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"on_boundary.h\"\n\n// IGL includes\n#include \"sort.h\"\n#include \"face_occurrences.h\"\n\n// STL includes\n\ntemplate <typename IntegerT>\nIGL_INLINE void igl::on_boundary(\n  const std::vector<std::vector<IntegerT> > & T,\n  std::vector<bool> & I,\n  std::vector<std::vector<bool> > & C)\n{\n  using namespace std;\n  if(T.empty())\n  {\n    I.clear();\n    C.clear();\n    return;\n  }\n\n  switch(T[0].size())\n  {\n    case 3:\n    {\n      // Get a list of all faces\n      vector<vector<IntegerT> > F(T.size()*3,vector<IntegerT>(2));\n      // Gather faces, loop over tets\n      for(int i = 0; i< (int)T.size();i++)\n      {\n        assert(T[i].size() == 3);\n        // get face in correct order\n        F[i*3+0][0] = T[i][1];\n        F[i*3+0][1] = T[i][2];\n        F[i*3+1][0] = T[i][2];\n        F[i*3+1][1] = T[i][0];\n        F[i*3+2][0] = T[i][0];\n        F[i*3+2][1] = T[i][1];\n      }\n      // Counts\n      vector<int> FC;\n      face_occurrences(F,FC);\n      C.resize(T.size(),vector<bool>(3));\n      I.resize(T.size(),false);\n      for(int i = 0; i< (int)T.size();i++)\n      {\n        for(int j = 0;j<3;j++)\n        {\n          assert(FC[i*3+j] == 2 || FC[i*3+j] == 1);\n          C[i][j] = FC[i*3+j]==1;\n          // if any are on boundary set to true\n          I[i] = I[i] || C[i][j];\n        }\n      }\n      return;\n    }\n    case 4:\n    {\n      // Get a list of all faces\n      vector<vector<IntegerT> > F(T.size()*4,vector<IntegerT>(3));\n      // Gather faces, loop over tets\n      for(int i = 0; i< (int)T.size();i++)\n      {\n        assert(T[i].size() == 4);\n        // get face in correct order\n        F[i*4+0][0] = T[i][1];\n        F[i*4+0][1] = T[i][3];\n        F[i*4+0][2] = T[i][2];\n        // get face in correct order\n        F[i*4+1][0] = T[i][0];\n        F[i*4+1][1] = T[i][2];\n        F[i*4+1][2] = T[i][3];\n        // get face in correct order\n        F[i*4+2][0] = T[i][0];\n        F[i*4+2][1] = T[i][3];\n        F[i*4+2][2] = T[i][1];\n        // get face in correct order\n        F[i*4+3][0] = T[i][0];\n        F[i*4+3][1] = T[i][1];\n        F[i*4+3][2] = T[i][2];\n      }\n      // Counts\n      vector<int> FC;\n      face_occurrences(F,FC);\n      C.resize(T.size(),vector<bool>(4));\n      I.resize(T.size(),false);\n      for(int i = 0; i< (int)T.size();i++)\n      {\n        for(int j = 0;j<4;j++)\n        {\n          assert(FC[i*4+j] == 2 || FC[i*4+j] == 1);\n          C[i][j] = FC[i*4+j]==1;\n          // if any are on boundary set to true\n          I[i] = I[i] || C[i][j];\n        }\n      }\n      return;\n    }\n  }\n\n\n}\n\n#include \"list_to_matrix.h\"\n#include \"matrix_to_list.h\"\n\ntemplate <typename DerivedT, typename DerivedI, typename DerivedC>\nIGL_INLINE void igl::on_boundary(\n  const Eigen::MatrixBase<DerivedT>& T,\n  Eigen::PlainObjectBase<DerivedI>& I,\n  Eigen::PlainObjectBase<DerivedC>& C)\n{\n  assert(T.cols() == 0 || T.cols() == 4 || T.cols() == 3);\n  using namespace std;\n  using namespace Eigen;\n  // Cop out: use vector of vectors version\n  vector<vector<typename DerivedT::Scalar> > vT;\n  matrix_to_list(T,vT);\n  vector<bool> vI;\n  vector<vector<bool> > vC;\n  on_boundary(vT,vI,vC);\n  list_to_matrix(vI,I);\n  list_to_matrix(vC,C);\n}\n\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::on_boundary<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Array<bool, -1, 1, 0, -1, 1>, Eigen::Array<bool, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Array<bool, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Array<bool, -1, 3, 0, -1, 3> >&);\ntemplate void igl::on_boundary<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::on_boundary<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Array<bool, -1, 1, 0, -1, 1>, Eigen::Array<bool, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Array<bool, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Array<bool, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/on_boundary.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_ON_BOUNDARY_H\n#define IGL_ON_BOUNDARY_H\n#include \"igl_inline.h\"\n#include <Eigen/Dense>\n\n#include <vector>\n\nnamespace igl\n{\n  // ON_BOUNDARY Determine boundary facets of mesh elements stored in T\n  //\n  // Templates:\n  //   IntegerT  integer-value: i.e. int\n  //   IntegerF  integer-value: i.e. int\n  // Input:\n  //  T  triangle|tetrahedron index list, m by 3|4, where m is the number of\n  //    elements\n  // Output:\n  //  I  m long list of bools whether tet is on boundary\n  //  C  m by 3|4 list of bools whether opposite facet is on boundary\n  //\n  template <typename IntegerT>\n  IGL_INLINE void on_boundary(\n    const std::vector<std::vector<IntegerT> > & T,\n    std::vector<bool> & I,\n    std::vector<std::vector<bool> > & C);\n  // Templates:\n  //   DerivedT  integer-value: i.e. from MatrixXi\n  //   DerivedI  bool-value: i.e. from MatrixXi\n  //   DerivedC  bool-value: i.e. from MatrixXi\n  template <typename DerivedT, typename DerivedI, typename DerivedC>\n  IGL_INLINE void on_boundary(\n    const Eigen::MatrixBase<DerivedT>& T,\n    Eigen::PlainObjectBase<DerivedI>& I,\n    Eigen::PlainObjectBase<DerivedC>& C);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"on_boundary.cpp\"\n#endif\n\n#endif\n\n\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl/compile_and_link_program.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"compile_and_link_program.h\"\n#include \"compile_shader.h\"\n#include \"report_gl_error.h\"\n#include <iostream>\n#include <cassert>\n\n\nIGL_INLINE GLuint igl::opengl::compile_and_link_program(\n  const char * v_str, const char * f_str)\n{\n  GLuint vid = compile_shader(GL_VERTEX_SHADER,v_str);\n  GLuint fid = compile_shader(GL_FRAGMENT_SHADER,f_str);\n\n  GLuint prog_id = glCreateProgram();\n  assert(prog_id != 0 && \"Failed to create shader.\");\n  glAttachShader(prog_id,vid);\n  report_gl_error(\"glAttachShader (vid): \");\n  glAttachShader(prog_id,fid);\n  report_gl_error(\"glAttachShader (fid): \");\n\n  glLinkProgram(prog_id);\n  report_gl_error(\"glLinkProgram: \");\n\n  GLint status;\n  glGetProgramiv(prog_id, GL_LINK_STATUS, &status);\n  if (status != GL_TRUE)\n  {\n    char buffer[512];\n    glGetProgramInfoLog(prog_id, 512, NULL, buffer);\n    std::cerr << \"Linker error: \" << std::endl << buffer << std::endl;\n    prog_id = 0;\n  }\n  return prog_id;\n}\n\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl/compile_and_link_program.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL_COMPILE_AND_LINK_PROGRAM_H\n#define IGL_OPENGL_COMPILE_AND_LINK_PROGRAM_H\n#include \"../igl_inline.h\"\n#include \"gl.h\"\nnamespace igl\n{\n  namespace opengl\n  {\n    // Compile and link very simple vertex/fragment shaders\n    //\n    // Inputs:\n    //   v_str  string of vertex shader contents\n    //   f_str  string of fragment shader contents\n    // Returns id of program\n    //\n    // Known bugs: this seems to duplicate `create_shader_program` with less\n    // functionality.\n    IGL_INLINE GLuint compile_and_link_program(\n      const char * v_str, const char * f_str);\n  }\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"compile_and_link_program.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl/compile_shader.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"compile_shader.h\"\n#include \"report_gl_error.h\"\n#include <iostream>\n\nIGL_INLINE GLuint igl::opengl::compile_shader(\n  const GLint type, const char * str)\n{\n  GLuint id = glCreateShader(type);\n  report_gl_error(\"glCreateShader: \");\n  glShaderSource(id,1,&str,NULL);\n  report_gl_error(\"glShaderSource: \");\n  glCompileShader(id);\n  report_gl_error(\"glCompileShader: \");\n\n  GLint status;\n  glGetShaderiv(id, GL_COMPILE_STATUS, &status);\n  if (status != GL_TRUE)\n  {\n    char buffer[512];\n    if (type == GL_VERTEX_SHADER)\n      std::cerr << \"Vertex shader:\" << std::endl;\n    else if (type == GL_FRAGMENT_SHADER)\n      std::cerr << \"Fragment shader:\" << std::endl;\n    std::cerr << str << std::endl << std::endl;\n    glGetShaderInfoLog(id, 512, NULL, buffer);\n    std::cerr << \"Error: \" << std::endl << buffer << std::endl;\n  }\n  return id;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl/compile_shader.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL_COMPILE_SHADER_H\n#define IGL_OPENGL_COMPILE_SHADER_H\n#include \"../igl_inline.h\"\n#include \"gl.h\"\nnamespace igl\n{\n  namespace opengl\n  {\n    // Compile a shader given type and string of shader code\n    //\n    // Inputs:\n    //   type  either GL_VERTEX_SHADER or GL_FRAGMENT_SHADER\n    //   str  contents of shader code\n    // Returns result of glCreateShader (id of shader)\n    //\n    // Example:\n    //     GLuint vid = compile_shader(GL_VERTEX_SHADER,vertex_shader.c_str());\n    //     GLuint fid = compile_shader(GL_FRAGMENT_SHADER,fragment_shader.c_str());\n    //     GLuint prog_id = glCreateProgram();\n    //     glAttachShader(prog_id,vid);\n    //     glAttachShader(prog_id,fid);\n    //     glLinkProgram(prog_id);\n    //\n    // Known bugs: seems to be duplicate of `load_shader`\n    IGL_INLINE GLuint compile_shader(const GLint type, const char * str);\n  }\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"compile_shader.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl/create_index_vbo.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"create_index_vbo.h\"\n\n// http://www.songho.ca/opengl/gl_vbo.html#create\nIGL_INLINE void igl::opengl::create_index_vbo(\n  const Eigen::MatrixXi & F,\n  GLuint & F_vbo_id)\n{\n  // Generate Buffers\n  glGenBuffers(1,&F_vbo_id);\n  // Bind Buffers\n  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,F_vbo_id);\n  // Copy data to buffers\n  // We expect a matrix with each vertex position on a row, we then want to\n  // pass this data to OpenGL reading across rows (row-major)\n  if(F.Options & Eigen::RowMajor)\n  {\n    glBufferData(\n      GL_ELEMENT_ARRAY_BUFFER,\n      sizeof(int)*F.size(),\n      F.data(),\n      GL_STATIC_DRAW);\n  }else\n  {\n    // Create temporary copy of transpose\n    Eigen::MatrixXi FT = F.transpose();\n    // If its column major then we need to temporarily store a transpose\n    glBufferData(\n      GL_ELEMENT_ARRAY_BUFFER,\n      sizeof(int)*F.size(),\n      FT.data(),\n      GL_STATIC_DRAW);\n  }\n  // bind with 0, so, switch back to normal pointer operation\n  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl/create_index_vbo.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL_CREATE_INDEX_VBO_H\n#define IGL_OPENGL_CREATE_INDEX_VBO_H\n#include \"../igl_inline.h\"\n#include \"gl.h\"\n#include <Eigen/Core>\n\n// Create a VBO (Vertex Buffer Object) for a list of indices:\n// GL_ELEMENT_ARRAY_BUFFER_ARB for the triangle indices (F)\nnamespace igl\n{\n  namespace opengl\n  {\n    // Inputs:\n    //   F  #F by 3 eigen Matrix of face (triangle) indices\n    // Outputs:\n    //   F_vbo_id  buffer id for face indices\n    //\n    IGL_INLINE void create_index_vbo(\n      const Eigen::MatrixXi & F,\n      GLuint & F_vbo_id);\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"create_index_vbo.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl/create_mesh_vbo.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"create_mesh_vbo.h\"\n\n#include \"create_vector_vbo.h\"\n#include \"create_index_vbo.h\"\n\n// http://www.songho.ca/opengl/gl_vbo.html#create\nIGL_INLINE void igl::opengl::create_mesh_vbo(\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  GLuint & V_vbo_id,\n  GLuint & F_vbo_id)\n{\n  // Create VBO for vertex position vectors\n  create_vector_vbo(V,V_vbo_id);\n  // Create VBO for face index lists\n  create_index_vbo(F,F_vbo_id);\n}\n\n// http://www.songho.ca/opengl/gl_vbo.html#create\nIGL_INLINE void igl::opengl::create_mesh_vbo(\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  const Eigen::MatrixXd & N,\n  GLuint & V_vbo_id,\n  GLuint & F_vbo_id,\n  GLuint & N_vbo_id)\n{\n  // Create VBOs for faces and vertices\n  create_mesh_vbo(V,F,V_vbo_id,F_vbo_id);\n  // Create VBO for normal vectors\n  create_vector_vbo(N,N_vbo_id);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl/create_mesh_vbo.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL_CREATE_MESH_VBO_H\n#define IGL_OPENGL_CREATE_MESH_VBO_H\n#include \"../igl_inline.h\"\n#include \"gl.h\"\n#include <Eigen/Core>\n\n// Create a VBO (Vertex Buffer Object) for a mesh. Actually two VBOs: one \n// GL_ARRAY_BUFFER for the vertex positions (V) and one\n// GL_ELEMENT_ARRAY_BUFFER for the triangle indices (F)\nnamespace igl\n{\n  namespace opengl\n  {\n  \n    // Inputs:\n    //   V  #V by 3 eigen Matrix of mesh vertex 3D positions\n    //   F  #F by 3 eigne Matrix of face (triangle) indices\n    // Outputs:\n    //   V_vbo_id  buffer id for vertex positions\n    //   F_vbo_id  buffer id for face indices\n    //\n    // NOTE: when using glDrawElements VBOs for V and F using MatrixXd and\n    // MatrixXi will have types GL_DOUBLE and GL_UNSIGNED_INT respectively\n    //\n    IGL_INLINE void create_mesh_vbo(\n      const Eigen::MatrixXd & V,\n      const Eigen::MatrixXi & F,\n      GLuint & V_vbo_id,\n      GLuint & F_vbo_id);\n  \n    // Inputs:\n    //   V  #V by 3 eigen Matrix of mesh vertex 3D positions\n    //   F  #F by 3 eigne Matrix of face (triangle) indices\n    //   N  #V by 3 eigen Matrix of mesh vertex 3D normals\n    // Outputs:\n    //   V_vbo_id  buffer id for vertex positions\n    //   F_vbo_id  buffer id for face indices\n    //   N_vbo_id  buffer id for vertex positions\n    IGL_INLINE void create_mesh_vbo(\n      const Eigen::MatrixXd & V,\n      const Eigen::MatrixXi & F,\n      const Eigen::MatrixXd & N,\n      GLuint & V_vbo_id,\n      GLuint & F_vbo_id,\n      GLuint & N_vbo_id);\n  }\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"create_mesh_vbo.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl/create_shader_program.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"create_shader_program.h\"\n\n#include \"load_shader.h\"\n#include \"print_program_info_log.h\"\n#include <iostream>\n#include <cstdio>\n\nIGL_INLINE bool igl::opengl::create_shader_program(\n  const std::string & geom_source,\n  const std::string & vert_source,\n  const std::string & frag_source,\n  const std::map<std::string,GLuint> & attrib,\n  GLuint & id)\n{\n  using namespace std;\n  if(vert_source == \"\" && frag_source == \"\")\n  {\n    cerr<<\n      \"create_shader_program() could not create shader program,\"\n      \" both .vert and .frag source given were empty\"<<endl;\n    return false;\n  }\n\n  // create program\n  id = glCreateProgram();\n  if(id == 0)\n  {\n    cerr<<\"create_shader_program() could not create shader program.\"<<endl;\n    return false;\n  }\n  GLuint g = 0,f = 0,v = 0;\n\n  if(geom_source != \"\")\n  {\n    // load vertex shader\n    g = igl::opengl::load_shader(geom_source.c_str(),GL_GEOMETRY_SHADER);\n    if(g == 0)\n    {\n      cerr<<\"geometry shader failed to compile.\"<<endl;\n      return false;\n    }\n    glAttachShader(id,g);\n  }\n\n  if(vert_source != \"\")\n  {\n    // load vertex shader\n    v = igl::opengl::load_shader(vert_source.c_str(),GL_VERTEX_SHADER);\n    if(v == 0)\n    {\n      cerr<<\"vertex shader failed to compile.\"<<endl;\n      return false;\n    }\n    glAttachShader(id,v);\n  }\n\n  if(frag_source != \"\")\n  {\n    // load fragment shader\n    f = igl::opengl::load_shader(frag_source.c_str(),GL_FRAGMENT_SHADER);\n    if(f == 0)\n    {\n      cerr<<\"fragment shader failed to compile.\"<<endl;\n      return false;\n    }\n    glAttachShader(id,f);\n  }\n\n  // loop over attributes\n  for(\n    std::map<std::string,GLuint>::const_iterator ait = attrib.begin();\n    ait != attrib.end();\n    ait++)\n  {\n    glBindAttribLocation(\n      id,\n      (*ait).second,\n      (*ait).first.c_str());\n  }\n  // Link program\n  glLinkProgram(id);\n  const auto & detach = [&id](const GLuint shader)\n  {\n    if(shader)\n    {\n      glDetachShader(id,shader);\n      glDeleteShader(shader);\n    }\n  };\n  detach(g);\n  detach(f);\n  detach(v);\n\n  // print log if any\n  igl::opengl::print_program_info_log(id);\n\n  return true;\n}\n\nIGL_INLINE bool igl::opengl::create_shader_program(\n  const std::string & vert_source,\n  const std::string & frag_source,\n  const std::map<std::string,GLuint> & attrib,\n  GLuint & prog_id)\n{\n  return create_shader_program(\"\",vert_source,frag_source,attrib,prog_id);\n}\n\n\nIGL_INLINE GLuint igl::opengl::create_shader_program(\n  const std::string & geom_source,\n  const std::string & vert_source,\n  const std::string & frag_source,\n  const std::map<std::string,GLuint> & attrib)\n{\n  GLuint prog_id = 0;\n  create_shader_program(geom_source,vert_source,frag_source,attrib,prog_id);\n  return prog_id;\n}\n\nIGL_INLINE GLuint igl::opengl::create_shader_program(\n  const std::string & vert_source,\n  const std::string & frag_source,\n  const std::map<std::string,GLuint> & attrib)\n{\n  GLuint prog_id = 0;\n  create_shader_program(vert_source,frag_source,attrib,prog_id);\n  return prog_id;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl/create_shader_program.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL_CREATE_SHADER_PROGRAM_H\n#define IGL_OPENGL_CREATE_SHADER_PROGRAM_H\n#include \"../igl_inline.h\"\n#include \"gl.h\"\n#include <string>\n#include <map>\n\nnamespace igl\n{\n  namespace opengl\n  {\n    // Create a shader program with a vertex and fragments shader loading from\n    // source strings and vertex attributes assigned from a map before linking the\n    // shaders to the program, making it ready to use with glUseProgram(id)\n    // Inputs:\n    //   geom_source  string containing source code of geometry shader (can be\n    //     \"\" to mean use default pass-through)\n    //   vert_source  string containing source code of vertex shader\n    //   frag_source  string containing source code of fragment shader\n    //   attrib  map containing table of vertex attribute strings add their\n    //   correspondingly ids (generated previously using glBindAttribLocation)\n    // Outputs:\n    //   id  index id of created shader, set to 0 on error\n    // Returns true on success, false on error\n    //\n    // Note: Caller is responsible for making sure that current value of id is not\n    // leaking a shader (since it will be overwritten)\n    //\n    // See also: destroy_shader_program\n    IGL_INLINE bool create_shader_program(\n      const std::string &geom_source,\n      const std::string &vert_source,\n      const std::string &frag_source,\n      const std::map<std::string,GLuint> &attrib,\n      GLuint & id);\n    IGL_INLINE bool create_shader_program(\n      const std::string &vert_source,\n      const std::string &frag_source,\n      const std::map<std::string,GLuint> &attrib,\n      GLuint & id);\n    IGL_INLINE GLuint create_shader_program(\n      const std::string & geom_source,\n      const std::string & vert_source,\n      const std::string & frag_source,\n      const std::map<std::string,GLuint> &attrib);\n    IGL_INLINE GLuint create_shader_program(\n      const std::string & vert_source,\n      const std::string & frag_source,\n      const std::map<std::string,GLuint> &attrib);\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"create_shader_program.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl/create_vector_vbo.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"create_vector_vbo.h\"\n\n#include <cassert>\n\n// http://www.songho.ca/opengl/gl_vbo.html#create\ntemplate <typename T>\nIGL_INLINE void igl::opengl::create_vector_vbo(\n  const Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> & V,\n  GLuint & V_vbo_id)\n{\n  //// Expects that input is list of 3D vectors along rows\n  //assert(V.cols() == 3);\n\n  // Generate Buffers\n  glGenBuffers(1,&V_vbo_id);\n  // Bind Buffers\n  glBindBuffer(GL_ARRAY_BUFFER,V_vbo_id);\n  // Copy data to buffers\n  // We expect a matrix with each vertex position on a row, we then want to\n  // pass this data to OpenGL reading across rows (row-major)\n  if(V.Options & Eigen::RowMajor)\n  {\n    glBufferData(\n      GL_ARRAY_BUFFER,\n      sizeof(T)*V.size(),\n      V.data(),\n      GL_STATIC_DRAW);\n  }else\n  {\n    // Create temporary copy of transpose\n    Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> VT = V.transpose();\n    // If its column major then we need to temporarily store a transpose\n    glBufferData(\n      GL_ARRAY_BUFFER,\n      sizeof(T)*V.size(),\n      VT.data(),\n      GL_STATIC_DRAW);\n  }\n  // bind with 0, so, switch back to normal pointer operation\n  glBindBuffer(GL_ARRAY_BUFFER, 0);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::opengl::create_vector_vbo<int>(Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, unsigned int&);\n// generated by autoexplicit.sh\ntemplate void igl::opengl::create_vector_vbo<double>(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, unsigned int&);\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl/create_vector_vbo.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL_CREATE_VECTOR_VBO_H\n#define IGL_OPENGL_CREATE_VECTOR_VBO_H\n#include \"../igl_inline.h\"\n#include \"gl.h\"\n#include <Eigen/Core>\n\n// Create a VBO (Vertex Buffer Object) for a list of vectors:\n// GL_ARRAY_BUFFER for the vectors (V)\nnamespace igl\n{\n  namespace opengl\n  {\n    // Templates:\n    //   T  should be a eigen matrix primitive type like int or double\n    // Inputs:\n    //   V  m by n eigen Matrix of type T values\n    // Outputs:\n    //   V_vbo_id  buffer id for vectors\n    //\n    template <typename T>\n    IGL_INLINE void create_vector_vbo(\n      const Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> & V,\n      GLuint & V_vbo_id);\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"create_vector_vbo.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl/destroy_shader_program.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"destroy_shader_program.h\"\n#include \"report_gl_error.h\"\n#include <cstdio>\n\nIGL_INLINE bool igl::opengl::destroy_shader_program(const GLuint id)\n{\n  // Don't try to destroy id == 0 (no shader program)\n  if(id == 0)\n  {\n    fprintf(stderr,\"Error: destroy_shader_program() id = %d\"\n      \" but must should be positive\\n\",id);\n    return false;\n  }\n  // Get each attached shader one by one and detach and delete it\n  GLsizei count;\n  // shader id\n  GLuint s;\n  do\n  {\n    // Try to get at most *1* attached shader\n    glGetAttachedShaders(id,1,&count,&s);\n    GLenum err = igl::opengl::report_gl_error();\n    if (GL_NO_ERROR != err)\n    {\n      return false;\n    }\n    // Check that we actually got *1*\n    if(count == 1)\n    {\n      // Detach and delete this shader\n      glDetachShader(id,s);\n      glDeleteShader(s);\n    }\n  }while(count > 0);\n  // Now that all of the shaders are gone we can just delete the program\n  glDeleteProgram(id);\n  return true;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl/destroy_shader_program.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL_DESTROY_SHADER_PROGRAM_H\n#define IGL_OPENGL_DESTROY_SHADER_PROGRAM_H\n#include \"../igl_inline.h\"\n#include \"gl.h\"\n\nnamespace igl\n{\n  namespace opengl\n  {\n    // Properly destroy a shader program. Detach and delete each of its shaders\n    // and delete it\n    // Inputs:\n    //   id  index id of created shader, set to 0 on error\n    // Returns true on success, false on error\n    // \n    // Note: caller is responsible for making sure he doesn't foolishly continue\n    // to use id as if it still contains a program\n    // \n    // See also: create_shader_program\n    IGL_INLINE bool destroy_shader_program(const GLuint id);\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"destroy_shader_program.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl/gl 12.56.14.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013, 2017 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL_GL_H\n#define IGL_OPENGL_GL_H\n\n#ifdef IGL_OPENGL2_GL_H\n#  error \"igl/opengl2/gl.h already included\"\n#endif\n\n// Always use this:\n//     #include \"gl.h\"\n// Instead of:\n//     #include <OpenGL/gl3.h>\n// or \n//     #include <GL/gl.h>\n//\n\n// For now this includes glu, glew and glext (perhaps these should be\n// separated)\n#ifdef _WIN32\n#    define NOMINMAX\n#    include <Windows.h>\n#    undef DrawText\n#    undef NOMINMAX\n#endif\n\n#ifndef __APPLE__\n#  define GLEW_STATIC\n#  include <GL/glew.h>\n#endif\n\n#ifdef __APPLE__\n#  include <OpenGL/gl3.h>\n#  define __gl_h_ /* Prevent inclusion of the old gl.h */\n#else\n#  include <GL/gl.h>\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl/gl_type_size.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"gl_type_size.h\"\n#include <cassert>\n\nIGL_INLINE int igl::opengl::gl_type_size(const GLenum type)\n{\n  switch(type)\n  {\n    case GL_DOUBLE:\n      return 8;\n      break;\n    case GL_FLOAT:\n      return 4;\n      break;\n    case GL_INT:\n      return 4;\n      break;\n    default:\n      // should handle all other GL_[types]\n      assert(false && \"Implementation incomplete.\");\n      break;\n  }\n  return -1;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl/gl_type_size.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL_GL_TYPE_SIZE_H\n#define IGL_OPENGL_GL_TYPE_SIZE_H\n#include \"../igl_inline.h\"\n#include \"gl.h\"\n\nnamespace igl\n{\n  namespace opengl\n  {\n    // Return the number of bytes for a given OpenGL type // Inputs:\n    //   type  enum value of opengl type\n    // Returns size in bytes of type\n    IGL_INLINE int gl_type_size(const GLenum type);\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"gl_type_size.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl/glfw/map_texture.cpp",
    "content": "#include \"map_texture.h\"\n#include \"../create_shader_program.h\"\n#include \"../gl.h\"\n\n#define GLFW_INCLUDE_GLU\n#include <GLFW/glfw3.h>\n\n#include <iostream>\n#include <string>\n  \ntemplate <typename DerivedV, typename DerivedF, typename DerivedU>\nIGL_INLINE bool igl::opengl::glfw::map_texture(\n  const Eigen::MatrixBase<DerivedV> & _V,\n  const Eigen::MatrixBase<DerivedF> & _F,\n  const Eigen::MatrixBase<DerivedU> & _U,\n  const unsigned char * in_data,\n  const int w,\n  const int h,\n  const int nc,\n  std::vector<unsigned char> & out_data)\n{\n  int out_w = w;\n  int out_h = h;\n  int out_nc = nc;\n  return map_texture(_V,_F,_U,in_data,w,h,nc,out_data,out_w,out_h,out_nc);\n}\n\n  \ntemplate <typename DerivedV, typename DerivedF, typename DerivedU>\nIGL_INLINE bool igl::opengl::glfw::map_texture(\n  const Eigen::MatrixBase<DerivedV> & _V,\n  const Eigen::MatrixBase<DerivedF> & _F,\n  const Eigen::MatrixBase<DerivedU> & _U,\n  const unsigned char * in_data,\n  const int w,\n  const int h,\n  const int nc,\n  std::vector<unsigned char> & out_data,\n  int & out_w,\n  int & out_h,\n  int & out_nc)\n{\n  const auto fail = [](const std::string msg)\n  {\n    std::cerr<<msg<<std::endl;\n    glfwTerminate();\n    return false;\n  };\n  // Force inputs to be RowMajor at the cost of a copy \n  Eigen::Matrix<\n    double,\n    DerivedV::RowsAtCompileTime,\n    DerivedV::ColsAtCompileTime,\n    Eigen::RowMajor> V = _V.template cast<double>();\n  Eigen::Matrix<\n    double,\n    DerivedU::RowsAtCompileTime,\n    DerivedU::ColsAtCompileTime,\n    Eigen::RowMajor> U = _U.template cast<double>();\n  Eigen::Matrix<\n    int,\n    DerivedF::RowsAtCompileTime,\n    DerivedF::ColsAtCompileTime,\n    Eigen::RowMajor> F = _F.template cast<int>();\n  const int dim = U.cols();\n  // Set up glfw\n  if(!glfwInit()) fail(\"Could not initialize glfw\");\n  glfwSetErrorCallback([](int id,const char* m){std::cerr<<m<<std::endl;});\n  glfwWindowHint(GLFW_SAMPLES, 4);\n  glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);\n  glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);\n  glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);\n  glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);\n  glfwWindowHint(GLFW_VISIBLE, GL_FALSE);\n  GLFWwindow* window = glfwCreateWindow(1, 1,\"\", NULL, NULL);\n  if(!window) fail(\"Could not create glfw window\");\n  glfwMakeContextCurrent(window);\n  // Compile each shader\n  std::string vertex_shader = dim == 2 ? \n    R\"(\n#version 330 core\nlayout(location = 0) in vec2 position;\nlayout(location = 1) in vec2 tex_coord_v;\nout vec2 tex_coord_f;\nvoid main()\n{\n  tex_coord_f = vec2(tex_coord_v.x,1.-tex_coord_v.y);\n  gl_Position = vec4( 2.*position.x-1., 2.*(1.-position.y)-1., 0.,1.);\n}\n)\"\n    :\n    R\"(\n#version 330 core\nlayout(location = 0) in vec3 position;\nlayout(location = 1) in vec2 tex_coord_v;\nout vec2 tex_coord_f;\nvoid main()\n{\n  tex_coord_f = vec2(tex_coord_v.x,1.-tex_coord_v.y);\n  gl_Position = vec4( 2.*position.x-1., 2.*(1.-position.y)-1., position.z,1.);\n}\n)\"\n    ;\n  std::string fragment_shader = R\"(\n#version 330 core\nlayout(location = 0) out vec3 color;\nuniform sampler2D tex;\nin vec2 tex_coord_f;\nvoid main()\n{\n  color = texture(tex,tex_coord_f).rgb;\n}\n)\";\n  GLuint prog_id = \n    igl::opengl::create_shader_program(vertex_shader,fragment_shader,{});\n  glUniform1i(glGetUniformLocation(prog_id, \"tex\"),0);\n  // Generate and attach buffers to vertex array\n  glDisable(GL_CULL_FACE);\n  GLuint VAO = 0;\n  glGenVertexArrays(1,&VAO);\n  glBindVertexArray(VAO);\n  GLuint ibo,vbo,tbo;\n  glGenBuffers(1,&ibo);\n  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);\n  glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint)*F.size(), F.data(), GL_STATIC_DRAW);\n  glGenBuffers(1,&vbo);\n  glEnableVertexAttribArray(0);\n  glBindBuffer(GL_ARRAY_BUFFER,vbo);\n  glBufferData(GL_ARRAY_BUFFER, sizeof(double)*U.size(), U.data(), GL_STATIC_DRAW);\n  glVertexAttribLPointer(0, U.cols(), GL_DOUBLE, U.cols() * sizeof(GLdouble), (GLvoid*)0);\n  glGenBuffers(1,&tbo);\n  glEnableVertexAttribArray(1);\n  glBindBuffer(GL_ARRAY_BUFFER,tbo);\n  glBufferData(GL_ARRAY_BUFFER, sizeof(double)*V.size(), V.data(), GL_STATIC_DRAW);\n  glVertexAttribLPointer(1, V.cols(), GL_DOUBLE, V.cols() * sizeof(GLdouble), (GLvoid*)0);\n  glBindVertexArray(0);\n  glBindBuffer(GL_ARRAY_BUFFER, 0); \n  glBindVertexArray(0);\n  // Prepare texture\n  GLuint in_tex;\n  GLenum format;\n  {\n    format = nc==1 ? GL_RED : (nc==3 ? GL_RGB : (nc == 4 ? GL_RGBA : GL_FALSE));\n    glGenTextures(1, &in_tex);\n    glBindTexture(GL_TEXTURE_2D, in_tex);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);\n    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);\n    glTexImage2D(GL_TEXTURE_2D, 0,GL_RGB, w, h, 0,format, GL_UNSIGNED_BYTE, in_data);\n  }\n  // Prepare framebuffer\n  GLuint fb = 0;\n  glGenFramebuffers(1, &fb);\n  glBindFramebuffer(GL_FRAMEBUFFER, fb);\n  GLuint out_tex;\n  glGenTextures(1, &out_tex);\n  glBindTexture(GL_TEXTURE_2D, out_tex);\n  // always use float for internal storage\n  assert(out_nc == 3);\n  glTexImage2D(GL_TEXTURE_2D, 0,GL_RGB, out_w, out_h, 0,GL_RGB, GL_FLOAT, 0);\n  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);\n  glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, out_tex, 0);\n  {\n    GLenum bufs[1] = {GL_COLOR_ATTACHMENT0};\n    glDrawBuffers(1, bufs);\n  }\n  if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) \n  {\n    fail(\"framebuffer setup failed.\");\n  }\n  glBindFramebuffer(GL_FRAMEBUFFER, fb);\n  // clear screen and set viewport\n  glClearColor(0.0,1.0,0.0,0.);\n  glClear(GL_COLOR_BUFFER_BIT);\n  glViewport(0,0,out_w,out_h);\n  // Attach shader program\n  glUseProgram(prog_id);\n  glActiveTexture(GL_TEXTURE0 + 0);\n  glBindTexture(GL_TEXTURE_2D, in_tex);\n  // Draw mesh as wireframe\n  glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\n  glBindVertexArray(VAO);\n  glDrawElements(GL_TRIANGLES, F.size(), GL_UNSIGNED_INT, 0);\n  glBindVertexArray(0);\n  // Write into memory\n  assert(out_nc == 3);\n  out_data.resize(out_nc*out_w*out_h);\n  glBindTexture(GL_TEXTURE_2D, out_tex);\n  glGetTexImage(GL_TEXTURE_2D, 0, format, GL_UNSIGNED_BYTE, &out_data[0]);\n  // OpenGL cleanup\n  glDeleteBuffers(1,&fb);\n  glDeleteBuffers(1,&ibo);\n  glDeleteBuffers(1,&vbo);\n  glDeleteBuffers(1,&tbo);\n  glDeleteTextures(1,&in_tex);\n  glDeleteTextures(1,&out_tex);\n  glDeleteVertexArrays(1,&VAO);\n  glUseProgram(0);\n  glDeleteProgram(prog_id);\n  // GLFW cleanup\n  glfwDestroyWindow(window);\n  glfwTerminate();\n  return true;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate bool igl::opengl::glfw::map_texture<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, 3, 1, -1, 3>, Eigen::Matrix<double, -1, -1, 1, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, unsigned char const*, int, int, int, std::vector<unsigned char, std::allocator<unsigned char> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl/glfw/map_texture.h",
    "content": "#ifndef IGL_OPENGL_GLFW_MAP_TEXTURE_H\n#define IGL_OPENGL_GLFW_MAP_TEXTURE_H\n\n#include \"../../igl_inline.h\"\n#include <Eigen/Core>\n#include <vector>\n\nnamespace igl\n{\n  namespace opengl\n  {\n    namespace glfw\n    {\n      // Given a mesh (V,F) in [0,1]² and new positions (U) and a texture image\n      // (in_data), _render_ a new image (out_data) of the same size.\n      // Inputs:\n      //   V  #V by 2 list of undeformed mesh vertex positions (matching texture)\n      //   F  #F by 3 list of mesh triangle indices into V\n      //   U  #U by 2 list of deformed vertex positions\n      //   in_data  w*h*nc array of color values, channels, then columns, then\n      //     rows (e.g., what stbi_image returns and expects)\n      //   w  width\n      //   h  height\n      //   nc  number of channels\n      // Outputs:\n      //   out_data  h*w*nc list of output colors in same order as input\n      //\n      template <typename DerivedV, typename DerivedF, typename DerivedU>\n      IGL_INLINE bool map_texture(\n        const Eigen::MatrixBase<DerivedV> & V,\n        const Eigen::MatrixBase<DerivedF> & F,\n        const Eigen::MatrixBase<DerivedU> & U,\n        const unsigned char * in_data,\n        const int w,\n        const int h,\n        const int nc,\n        std::vector<unsigned char> & out_data);\n      template <typename DerivedV, typename DerivedF, typename DerivedU>\n      IGL_INLINE bool map_texture(\n        const Eigen::MatrixBase<DerivedV> & _V,\n        const Eigen::MatrixBase<DerivedF> & _F,\n        const Eigen::MatrixBase<DerivedU> & _U,\n        const unsigned char * in_data,\n        const int w,\n        const int h,\n        const int nc,\n        std::vector<unsigned char> & out_data,\n        int & out_w,\n        int & out_h,\n        int & out_nc);\n    }\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"map_texture.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl/init_render_to_texture.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"init_render_to_texture.h\"\n#include \"gl.h\"\n#include <cassert>\n\nIGL_INLINE void igl::opengl::init_render_to_texture(\n  const size_t width,\n  const size_t height,\n  GLuint & tex_id,\n  GLuint & fbo_id,\n  GLuint & dfbo_id)\n{\n  using namespace std;\n  // Delete if already exists\n  glDeleteTextures(1,&tex_id);\n  glDeleteFramebuffers(1,&fbo_id);\n  glDeleteFramebuffers(1,&dfbo_id);\n  // http://www.opengl.org/wiki/Framebuffer_Object_Examples#Quick_example.2C_render_to_texture_.282D.29\n  glGenTextures(1, &tex_id);\n  glBindTexture(GL_TEXTURE_2D, tex_id);\n  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);\n  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);\n  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);\n  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);\n  //NULL means reserve texture memory, but texels are undefined\n  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, width, height, 0, GL_BGRA, GL_FLOAT, NULL);\n  glBindTexture(GL_TEXTURE_2D, 0);\n  glGenFramebuffers(1, &fbo_id);\n  glBindFramebuffer(GL_FRAMEBUFFER, fbo_id);\n  //Attach 2D texture to this FBO\n  glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex_id, 0);\n\n  glGenRenderbuffers(1, &dfbo_id);\n  glBindRenderbuffer(GL_RENDERBUFFER, dfbo_id);\n  glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, width, height);\n  //Attach depth buffer to FBO (for this example it's not really needed, but if\n  //drawing a 3D scene it would be necessary to attach something)\n  glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, dfbo_id);\n\n  //Does the GPU support current FBO configuration?\n  GLenum status;\n  status = glCheckFramebufferStatus(GL_FRAMEBUFFER);\n  assert(status == GL_FRAMEBUFFER_COMPLETE);\n  // Unbind to clean up\n  glBindRenderbuffer(GL_RENDERBUFFER, 0);\n  glBindFramebuffer(GL_FRAMEBUFFER, 0);\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl/init_render_to_texture.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL_INIT_RENDER_TO_TEXTURE_H\n#define IGL_OPENGL_INIT_RENDER_TO_TEXTURE_H\n#include \"../igl_inline.h\"\n#include \"gl.h\"\n#include <cstdlib>\nnamespace igl\n{\n  namespace opengl\n  {\n    // Create a frame buffer that renders color to a RGBA texture a depth to a\n    // \"render buffer\".\n    //\n    // Inputs:\n    //   width  image width\n    //   height image height\n    // Outputs:\n    //   tex_id  id of the texture\n    //   fbo_id  id of the frame buffer object\n    //   dfbo_id  id of the depth frame buffer object\n    IGL_INLINE void init_render_to_texture(\n      const size_t width,\n      const size_t height,\n      GLuint & tex_id,\n      GLuint & fbo_id,\n      GLuint & dfbo_id);\n  }\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"init_render_to_texture.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl/load_shader.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"load_shader.h\"\n\n// Copyright Denis Kovacs 4/10/08\n#include \"print_shader_info_log.h\"\n#include <cstdio>\nIGL_INLINE GLuint igl::opengl::load_shader(const char *src,const GLenum type)\n{\n  GLuint s = glCreateShader(type);\n  if(s == 0)\n  {\n    fprintf(stderr,\"Error: load_shader() failed to create shader.\\n\");\n    return 0;\n  }\n  // Pass shader source string\n  glShaderSource(s, 1, &src, NULL);\n  glCompileShader(s);\n  // Print info log (if any)\n  igl::opengl::print_shader_info_log(s);\n  return s;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl/load_shader.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL_LOAD_SHADER_H \n#define IGL_OPENGL_LOAD_SHADER_H\n#include \"../igl_inline.h\" \n#include \"gl.h\"\n\nnamespace igl\n{\n  namespace opengl\n  {\n    // Creates and compiles a shader from a given string\n    // Inputs:\n    //   src  string containing GLSL shader code\n    //   type  GLSL type of shader, one of:\n    //     GL_VERTEX_SHADER\n    //     GL_FRAGMENT_SHADER\n    //     GL_GEOMETRY_SHADER\n    // Returns  index id of the newly created shader, 0 on error\n    IGL_INLINE GLuint load_shader(const char *src,const GLenum type);\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"load_shader.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl/print_program_info_log.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"print_program_info_log.h\"\n\n#include <cstdio>\n#include <stdlib.h>\n// Copyright Denis Kovacs 4/10/08\nIGL_INLINE void igl::opengl::print_program_info_log(const GLuint obj)\n{\n  GLint infologLength = 0;\n  GLint charsWritten  = 0;\n  char *infoLog;\n  \n  glGetProgramiv(obj, GL_INFO_LOG_LENGTH,&infologLength);\n  \n  if (infologLength > 0)\n  {\n    infoLog = (char *)malloc(infologLength);\n    glGetProgramInfoLog(obj, infologLength, &charsWritten, infoLog);\n    printf(\"%s\\n\",infoLog);\n    free(infoLog);\n  }\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl/print_program_info_log.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL_PRINT_PROGRAM_INFO_LOG_H\n#define IGL_OPENGL_PRINT_PROGRAM_INFO_LOG_H\n#include \"../igl_inline.h\"\n#include \"gl.h\"\n\nnamespace igl\n{\n  namespace opengl\n  {\n    // Inputs:\n    //   obj  OpenGL index of program to print info log about\n    IGL_INLINE void print_program_info_log(const GLuint obj);\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"print_program_info_log.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl/print_shader_info_log.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"print_shader_info_log.h\"\n\n#include <cstdio>\n#include <stdlib.h>\n// Copyright Denis Kovacs 4/10/08\nIGL_INLINE void igl::opengl::print_shader_info_log(const GLuint obj)\n{\n  GLint infologLength = 0;\n  GLint charsWritten  = 0;\n  char *infoLog;\n  \n  // Get shader info log from opengl\n  glGetShaderiv(obj, GL_INFO_LOG_LENGTH,&infologLength);\n  // Only print if there is something in the log\n  if (infologLength > 0)\n  {\n    infoLog = (char *)malloc(infologLength);\n    glGetShaderInfoLog(obj, infologLength, &charsWritten, infoLog);\n    printf(\"%s\\n\",infoLog);\n    free(infoLog);\n  }\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl/print_shader_info_log.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL_PRINT_SHADER_INFO_LOG_H\n#define IGL_OPENGL_PRINT_SHADER_INFO_LOG_H\n#include \"../igl_inline.h\"\n#include \"gl.h\"\n\nnamespace igl\n{\n  namespace opengl\n  {\n    // Inputs:\n    //   obj  OpenGL index of shader to print info log about\n    IGL_INLINE void print_shader_info_log(const GLuint obj);\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"print_shader_info_log.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl/report_gl_error.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"report_gl_error.h\"\n#include \"../verbose.h\"\n#include <cstdio>\n\nIGL_INLINE GLenum igl::opengl::report_gl_error(const std::string id)\n{\n  // http://stackoverflow.com/q/28485180/148668\n\n  // gluErrorString was deprecated\n  const auto gluErrorString = [](GLenum errorCode)->const char *\n  {\n    switch(errorCode)\n    {\n      default:\n        return \"unknown error code\";\n      case GL_NO_ERROR:\n        return \"no error\";\n      case GL_INVALID_ENUM:\n        return \"invalid enumerant\";\n      case GL_INVALID_VALUE:\n        return \"invalid value\";\n      case GL_INVALID_OPERATION:\n        return \"invalid operation\";\n#ifndef GL_VERSION_3_0\n      case GL_STACK_OVERFLOW:\n        return \"stack overflow\";\n      case GL_STACK_UNDERFLOW:\n        return \"stack underflow\";\n      case GL_TABLE_TOO_LARGE:\n        return \"table too large\";\n#endif\n      case GL_OUT_OF_MEMORY:\n        return \"out of memory\";\n#ifdef GL_EXT_framebuffer_object\n      case GL_INVALID_FRAMEBUFFER_OPERATION_EXT:\n        return \"invalid framebuffer operation\";\n#endif\n    }\n  };\n\n  GLenum err = glGetError();\n  if(GL_NO_ERROR != err)\n  {\n    verbose(\"GL_ERROR: \");\n    fprintf(stderr,\"%s%s\\n\",id.c_str(),gluErrorString(err));\n  }\n  return err;\n}\n\nIGL_INLINE GLenum igl::opengl::report_gl_error()\n{\n  return igl::opengl::report_gl_error(std::string(\"\"));\n}\n\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl/report_gl_error.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL_REPORT_GL_ERROR_H\n#define IGL_OPENGL_REPORT_GL_ERROR_H\n#include \"../igl_inline.h\"\n\n// Hack to allow both opengl/ and opengl2 to use this (we shouldn't allow this)\n#ifndef __gl_h_ \n#  include \"gl.h\"\n#endif\n#include <string>\n\nnamespace igl\n{\n  namespace opengl\n  {\n    // Print last OpenGL error to stderr prefixed by specified id string\n    // Inputs:\n    //   id   string to appear before any error msgs\n    // Returns result of glGetError() \n    IGL_INLINE GLenum report_gl_error(const std::string id);\n    // No prefix\n    IGL_INLINE GLenum report_gl_error();\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"report_gl_error.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl/uniform_type_to_string.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"uniform_type_to_string.h\"\n\nIGL_INLINE std::string igl::opengl::uniform_type_to_string(const GLenum type)\n{\n  switch(type)\n  {\n    case GL_FLOAT:\n      return \"GL_FLOAT\";\n    case GL_FLOAT_VEC2:\n      return \"GL_FLOAT_VEC2\";\n    case GL_FLOAT_VEC3:\n      return \"GL_FLOAT_VEC3\";\n    case GL_FLOAT_VEC4:\n      return \"GL_FLOAT_VEC4\";\n    case GL_INT:\n      return \"GL_INT\";\n    case GL_INT_VEC2:\n      return \"GL_INT_VEC2\";\n    case GL_INT_VEC3:\n      return \"GL_INT_VEC3\";\n    case GL_INT_VEC4:\n      return \"GL_INT_VEC4\";\n    case GL_BOOL:\n      return \"GL_BOOL\";\n    case GL_BOOL_VEC2:\n      return \"GL_BOOL_VEC2\";\n    case GL_BOOL_VEC3:\n      return \"GL_BOOL_VEC3\";\n    case GL_BOOL_VEC4:\n      return \"GL_BOOL_VEC4\";\n    case GL_FLOAT_MAT2:\n      return \"GL_FLOAT_MAT2\";\n    case GL_FLOAT_MAT3:\n      return \"GL_FLOAT_MAT3\";\n    case GL_FLOAT_MAT4:\n      return \"GL_FLOAT_MAT4\";\n    case GL_FLOAT_MAT2x3:\n      return \"GL_FLOAT_MAT2x3\";\n    case GL_FLOAT_MAT2x4:\n      return \"GL_FLOAT_MAT2x4\";\n    case GL_FLOAT_MAT3x2:\n      return \"GL_FLOAT_MAT3x2\";\n    case GL_FLOAT_MAT3x4:\n      return \"GL_FLOAT_MAT3x4\";\n    case GL_FLOAT_MAT4x2:\n      return \"GL_FLOAT_MAT4x2\";\n    case GL_FLOAT_MAT4x3:\n      return \"GL_FLOAT_MAT4x3\";\n    case GL_SAMPLER_1D:\n      return \"GL_SAMPLER_1D\";\n    case GL_SAMPLER_2D:\n      return \"GL_SAMPLER_2D\";\n    case GL_SAMPLER_3D:\n      return \"GL_SAMPLER_3D\";\n    case GL_SAMPLER_CUBE:\n      return \"GL_SAMPLER_CUBE\";\n    case GL_SAMPLER_1D_SHADOW:\n      return \"GL_SAMPLER_1D_SHADOW\";\n    case GL_SAMPLER_2D_SHADOW:\n      return \"GL_SAMPLER_2D_SHADOW\";\n    default:\n      return \"UNKNOWN_TYPE\";\n  }\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl/uniform_type_to_string.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL_UNIFORM_TYPE_TO_STRING_H\n#define IGL_OPENGL_UNIFORM_TYPE_TO_STRING_H\n#include \"../igl_inline.h\"\n#include \"gl.h\"\n#include <string>\n\nnamespace igl\n{\n  namespace opengl\n  {\n    // Convert a GL uniform variable type (say, returned from\n    // glGetActiveUniform) and output a string naming that type\n    // Inputs:\n    //   type  enum for given type\n    // Returns string name of that type\n    IGL_INLINE std::string uniform_type_to_string(const GLenum type);\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"uniform_type_to_string.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/MouseController.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL2_MOUSECONTROLLER_H\n#define IGL_OPENGL2_MOUSECONTROLLER_H\n// Needs to be included before others\n#include <Eigen/StdVector>\n#include \"RotateWidget.h\"\n#include \"TranslateWidget.h\"\n#include <Eigen/Core>\n#include <Eigen/Geometry>\n#include <vector>\n\n// Class for control a skeletal FK rig with the mouse.\nnamespace igl\n{\n  namespace opengl2\n  {\n    class MouseController\n    {\n      public:\n        typedef Eigen::VectorXi VectorXb;\n        // Propogate selection to descendants so that selected bones and their\n        // subtrees are all selected.\n        //\n        // Input:\n        //   S  #S list of whether selected\n        //   P  #S list of bone parents\n        // Output:\n        //   T  #S list of whether selected\n        static inline void propogate_to_descendants_if(\n          const VectorXb & S,\n          const Eigen::VectorXi & P,\n          VectorXb & T);\n        // Create a matrix of colors for the selection and their descendants.\n        //\n        // Inputs:\n        //   selection  #S list of whether a bone is selected\n        //   selected_color  color for selected bones\n        //   unselected_color  color for unselected bones\n        // Outputs:\n        //   C  #P by 4 list of colors\n        static inline void color_if(\n          const VectorXb & S,\n          const Eigen::Vector4f & selected_color,\n          const Eigen::Vector4f & unselected_color,\n          Eigen::MatrixXf & C);\n        enum WidgetMode\n        {\n          WIDGET_MODE_ROTATE = 0,\n          WIDGET_MODE_TRANSLATE = 1,\n          NUM_WIDGET_MODES = 2,\n        };\n      private:\n        // m_is_selecting  whether currently selecting \n        // m_selection  #m_rotations list of whether a bone is selected\n        // m_down_x  x-coordinate of mouse location at down\n        // m_down_y  y-coordinate 〃\n        // m_drag_x  x-coordinate of mouse location at drag\n        // m_drag_y  y-coordinate 〃\n        // m_widget  rotation widget for selected bone\n        // m_width  width of containing window\n        // m_height  height 〃\n        // m_rotations  list of rotations for each bone\n        // m_rotations_at_selection  list of rotations for each bone at time of\n        //   selection\n        // m_translations   list of translations for each bone\n        // m_fk_rotations_at_selection  list of rotations for each bone at time of\n        //   selection\n        // m_root_enabled  Whether root is enabled\n        bool m_is_selecting;\n        VectorXb m_selection;\n        int m_down_x,m_down_y,m_drag_x,m_drag_y;\n        int m_width,m_height;\n        igl::opengl2::RotateWidget m_widget;\n        igl::opengl2::TranslateWidget m_trans_widget;\n        Eigen::Quaterniond m_widget_rot_at_selection;\n        //Eigen::Vector3d m_trans_widget_trans_at_selection;\n        typedef std::vector<\n          Eigen::Quaterniond,\n          Eigen::aligned_allocator<Eigen::Quaterniond> > RotationList;\n        typedef std::vector< Eigen::Vector3d > TranslationList;\n        RotationList \n          m_rotations,\n          m_rotations_at_selection,\n          m_fk_rotations_at_selection,\n          m_parent_rotations_at_selection;\n        TranslationList \n          m_translations, \n          m_translations_at_selection,\n          m_fk_translations_at_selection;\n        bool m_root_enabled;\n        WidgetMode m_widget_mode;\n      public:\n        MouseController();\n        // Returns const reference to m_selection\n        inline const VectorXb & selection() const{return m_selection;};\n        //                          〃 m_is_selecting\n        inline const bool & is_selecting() const{return m_is_selecting;}\n        inline bool is_widget_down() const{return m_widget.is_down();}\n        inline bool is_trans_widget_down() const{return m_trans_widget.is_down();}\n        //                          〃 m_rotations\n        inline const RotationList & rotations() const{return m_rotations;}\n        inline const TranslationList & translations() const{return m_translations;}\n        // Returns non-const reference to m_root_enabled\n        inline bool & root_enabled(){ return m_root_enabled;}\n        inline void reshape(const int w, const int h);\n        // Process down, drag, up mouse events\n        //\n        // Inputs:\n        //   x  x-coordinate of mouse click with respect to container\n        //   y  y-coordinate 〃 \n        // Returns true if accepted (action taken).\n        inline bool down(const int x, const int y);\n        inline bool drag(const int x, const int y);\n        inline bool up(const int x, const int y);\n        // Draw selection box and widget\n        inline void draw() const;\n        // Set `m_selection` based on the last drag selection and initialize\n        // widget.\n        //\n        // Inputs:\n        //   C  #C by dim list of joint positions at rest\n        //   BE  #BE by 2 list of bone indices at rest\n        //   P  #P list of bone parents\n        inline void set_selection_from_last_drag(\n          const Eigen::MatrixXd & C,\n          const Eigen::MatrixXi & BE,\n          const Eigen::VectorXi & P,\n          const Eigen::VectorXi & RP);\n        // Set from explicit selection\n        inline void set_selection(\n          const Eigen::VectorXi & S,\n          const Eigen::MatrixXd & C,\n          const Eigen::MatrixXi & BE,\n          const Eigen::VectorXi & P,\n          const Eigen::VectorXi & RP);\n        // Set size of skeleton\n        //\n        // Inputs:\n        //  n  number of bones\n        inline void set_size(const int n);\n        // Resets m_rotation elements to identity\n        inline void reset();\n        inline void reset_selected();\n        inline void reset_rotations();\n        inline void reset_selected_rotations();\n        inline void reset_translations();\n        inline void reset_selected_translations();\n        inline bool set_rotations(const RotationList & vQ);\n        inline bool set_translations(const TranslationList & vT);\n        // Sets all entries in m_selection to false\n        inline void clear_selection();\n        // Returns true iff some element in m_selection is true\n        inline bool any_selection() const;\n        inline void set_widget_mode(const WidgetMode & mode);\n      public:\n          EIGEN_MAKE_ALIGNED_OPERATOR_NEW\n    };\n  }\n}\n\n// Implementation\n#include \"../line_segment_in_rectangle.h\"\n#include \"draw_rectangular_marquee.h\"\n#include \"project.h\"\n#include \"../forward_kinematics.h\"\n#include \"../matlab_format.h\"\n#include <iostream>\n#include <algorithm>\n#include <functional>\n\ninline void igl::opengl2::MouseController::propogate_to_descendants_if(\n  const VectorXb & S,\n  const Eigen::VectorXi & P,\n  VectorXb & T)\n{\n  using namespace std;\n  const int n = S.rows();\n  assert(P.rows() == n);\n  // dynamic programming\n  T = S;\n  vector<bool> seen(n,false);\n  // Recursively look up chain and see if ancestor is selected\n  const function<bool(int)> look_up = [&](int e) -> bool\n  {\n    if(e==-1)\n    {\n      return false;\n    }\n    if(!seen[e])\n    {\n      seen[e] = true;\n      T(e) |= look_up(P(e));\n    }\n    return T(e);\n  };\n  for(int e = 0;e<n;e++)\n  {\n    if(!seen[e])\n    {\n      T(e) = look_up(e);\n    }\n  }\n}\n\ninline void igl::opengl2::MouseController::color_if(\n  const VectorXb & S,\n  const Eigen::Vector4f & selected_color,\n  const Eigen::Vector4f & unselected_color,\n  Eigen::MatrixXf & C)\n{\n  C.resize(S.rows(),4);\n  for(int e=0;e<S.rows();e++)\n  {\n    C.row(e) = S(e)?selected_color:unselected_color;\n  }\n}\n\ninline igl::opengl2::MouseController::MouseController():\n  m_is_selecting(false),\n  m_selection(),\n  m_down_x(-1),m_down_y(-1),m_drag_x(-1),m_drag_y(-1),\n  m_width(-1),m_height(-1),\n  m_widget(),\n  m_widget_rot_at_selection(),\n  //m_trans_widget_trans_at_selection(),\n  m_trans_widget(),\n  m_rotations(),\n  m_translations(),\n  m_rotations_at_selection(),\n  m_root_enabled(true),\n  m_widget_mode(WIDGET_MODE_ROTATE)\n{\n}\n\ninline void igl::opengl2::MouseController::reshape(const int w, const int h)\n{\n  m_width = w;\n  m_height = h;\n}\n\ninline bool igl::opengl2::MouseController::down(const int x, const int y)\n{\n  using namespace std;\n  m_down_x = m_drag_x =x;\n  m_down_y = m_drag_y =y;\n  const bool widget_down = any_selection() && \n    (\n     (m_widget_mode == WIDGET_MODE_ROTATE && m_widget.down(x,m_height-y)) ||\n     (m_widget_mode == WIDGET_MODE_TRANSLATE && \n        m_trans_widget.down(x,m_height-y))\n    );\n  if(!widget_down)\n  {\n    m_is_selecting = true;\n  }\n  return m_is_selecting || widget_down;\n}\n\ninline bool igl::opengl2::MouseController::drag(const int x, const int y)\n{\n  using namespace std;\n  using namespace Eigen;\n  m_drag_x = x;\n  m_drag_y = y;\n  if(m_is_selecting)\n  {\n    return m_is_selecting;\n  }else\n  {\n    switch(m_widget_mode)\n    {\n      default: // fall through\n      case WIDGET_MODE_ROTATE:\n      {\n        if(!m_widget.drag(x,m_height-y))\n        {\n          return false;\n        }\n        assert(any_selection());\n        assert(m_selection.size() == (int)m_rotations.size());\n        assert(m_selection.size() == (int)m_translations.size());\n        for(int e = 0;e<m_selection.size();e++)\n        {\n          if(m_selection(e))\n          {\n            // Let:\n            //     w.θr = w.θ ⋅ w.θ₀*  \n            // w.θr takes (absolute) frame of w.θ₀ to w.θ:\n            //     w.θ = w.θr ⋅ w.θ₀ \n            // Define:\n            //     w.θ₀ = θfk ⋅ θx,\n            // the absolute rotation of the x axis to the deformed bone at\n            // selection. Likewise,\n            //     w.θ = θfk' ⋅ θx,\n            // the current absolute rotation of the x axis to the deformed bone.\n            // Define recursively:\n            //     θfk = θfk(p) ⋅ Θr,\n            // then because we're only changeing this relative rotation\n            //     θfk' = θfk(p) ⋅ Θr ⋅ θr* ⋅ θr'\n            //     θfk' = θfk ⋅ θr* ⋅ θr'\n            //     w.θ ⋅ θx* = θfk ⋅ θr* ⋅ θr'\n            //     θr ⋅ θfk* ⋅ w.θ ⋅ θx* = θr'\n            //     θr ⋅ θfk* ⋅ w.θr ⋅ w.θ₀ ⋅ θx* = θr'\n            //     θr ⋅ θfk* ⋅ w.θr ⋅ θfk ⋅θx ⋅ θx* = θr'\n            //     θr ⋅ θfk* ⋅ w.θr ⋅ θfk = θr'\n            // which I guess is the right multiply change after being changed to\n            // the bases of θfk, the rotation of the bone relative to its rest\n            // frame.\n            //\n            const Quaterniond & frame = m_fk_rotations_at_selection[e];\n            m_rotations[e] = \n              m_rotations_at_selection[e] *\n              frame.conjugate() * \n              (m_widget.rot*m_widget_rot_at_selection.conjugate()) *\n              frame;\n          }\n        }\n      }\n      case WIDGET_MODE_TRANSLATE:\n      {\n        if(!m_trans_widget.drag(x,m_height-y))\n        {\n          return false;\n        }\n        assert(any_selection());\n        assert(m_selection.size() == (int)m_rotations.size());\n        assert(m_selection.size() == (int)m_translations.size());\n        for(int e = 0;e<m_selection.size();e++)\n        {\n          if(m_selection(e))\n          {\n            m_translations[e] = \n              m_translations_at_selection[e] + \n              m_parent_rotations_at_selection[e].conjugate()*\n                m_trans_widget.m_trans;\n          }\n        }\n      }\n    }\n    return true;\n  }\n}\n\ninline bool igl::opengl2::MouseController::up(const int x, const int y)\n{\n  m_is_selecting = false;\n  m_widget.up(x,m_height-y);\n  m_trans_widget.up(x,m_height-y);\n  return false;\n}\n\ninline void igl::opengl2::MouseController::draw() const\n{\n  if(any_selection())\n  {\n    switch(m_widget_mode)\n    {\n      default:\n      case WIDGET_MODE_ROTATE:\n        m_widget.draw();\n        break;\n      case WIDGET_MODE_TRANSLATE:\n        m_trans_widget.draw();\n        break;\n    }\n  }\n  if(m_is_selecting)\n  {\n    // Remember settings\n    GLboolean dt;\n    glGetBooleanv(GL_DEPTH_TEST,&dt);\n    int old_vp[4];\n    glGetIntegerv(GL_VIEWPORT,old_vp);\n\n    // True screen space\n    glViewport(0,0,m_width,m_height);\n    glMatrixMode(GL_PROJECTION);\n    glPushMatrix();\n    glLoadIdentity();\n    gluOrtho2D(0,m_width,0,m_height);\n    glMatrixMode(GL_MODELVIEW);\n    glPushMatrix();\n    glLoadIdentity();\n\n    glDisable(GL_DEPTH_TEST);\n    draw_rectangular_marquee(\n      m_down_x,\n      m_height-m_down_y,\n      m_drag_x,\n      m_height-m_drag_y);\n\n    // Restore settings\n    glMatrixMode(GL_PROJECTION);\n    glPopMatrix();\n    glMatrixMode(GL_MODELVIEW);\n    glPopMatrix();\n    glViewport(old_vp[0],old_vp[1],old_vp[2],old_vp[3]);\n    dt?glEnable(GL_DEPTH_TEST):glDisable(GL_DEPTH_TEST);\n\n  }\n}\n\ninline void igl::opengl2::MouseController::set_selection_from_last_drag(\n  const Eigen::MatrixXd & C,\n  const Eigen::MatrixXi & BE,\n  const Eigen::VectorXi & P,\n  const Eigen::VectorXi & RP)\n{\n  using namespace Eigen;\n  using namespace std;\n  m_rotations_at_selection = m_rotations;\n  m_translations_at_selection = m_translations;\n  assert(BE.rows() == P.rows());\n  m_selection = VectorXb::Zero(BE.rows());\n  // m_rotation[e]  is the relative rotation stored at bone e (as seen by the\n  //   joint traveling with its parent)\n  // vQ[e]  is the absolute rotation of a bone at rest to its current position:\n  //   vQ[e] = vQ[p(e)] * m_rotation[e]\n  vector<Quaterniond,aligned_allocator<Quaterniond> > vQ;\n  vector<Vector3d> vT;\n  forward_kinematics(C,BE,P,m_rotations,m_translations,vQ,vT);\n  // Loop over deformed bones\n  for(int e = 0;e<BE.rows();e++)\n  {\n    Affine3d a = Affine3d::Identity();\n    a.translate(vT[e]);\n    a.rotate(vQ[e]);\n    Vector3d s = a * (Vector3d)C.row(BE(e,0));\n    Vector3d d = a * (Vector3d)C.row(BE(e,1));\n    Vector3d projs = project(s);\n    Vector3d projd = project(d);\n    m_selection(e) = line_segment_in_rectangle(\n      projs.head(2),projd.head(2),\n      Vector2d(m_down_x,m_height-m_down_y),\n      Vector2d(m_drag_x,m_height-m_drag_y));\n  }\n  return set_selection(m_selection,C,BE,P,RP);\n}\n\ninline void igl::opengl2::MouseController::set_selection(\n    const Eigen::VectorXi & S,\n    const Eigen::MatrixXd & C,\n    const Eigen::MatrixXi & BE,\n    const Eigen::VectorXi & P,\n    const Eigen::VectorXi & RP)\n{\n  using namespace Eigen;\n  using namespace std;\n  vector<Quaterniond,aligned_allocator<Quaterniond> > & vQ = \n    m_fk_rotations_at_selection;\n  vector<Vector3d> & vT = m_fk_translations_at_selection;\n  forward_kinematics(C,BE,P,m_rotations,m_translations,vQ,vT);\n  m_parent_rotations_at_selection.resize(\n    m_rotations.size(),Quaterniond::Identity());\n  for(size_t r = 0;r<vQ.size();r++)\n  {\n    if(P(r)>=0)\n    {\n      m_parent_rotations_at_selection[r] = vQ[P(r)];\n    }\n  }\n\n\n  if(&m_selection != &S)\n  {\n    m_selection = S;\n  }\n  assert(m_selection.rows() == BE.rows());\n  assert(BE.rows() == P.rows());\n  assert(BE.rows() == RP.rows());\n  // Zero-out S up a path of ones from e\n  auto propagate = [&](const int e, const VectorXb & S, VectorXb & N)\n  {\n    if(S(e))\n    {\n      int f = e;\n      while(true)\n      {\n        int p = P(f);\n        if(p==-1||!S(p))\n        {\n          break;\n        }\n        N(f) = false;\n        f = p;\n      }\n    }\n  };\n  VectorXb prev_selection = m_selection;\n  // Combine upward, group rigid parts, repeat\n  while(true)\n  {\n    // Spread selection accross rigid pieces\n    VectorXb SRP(VectorXb::Zero(RP.maxCoeff()+1));\n    for(int e = 0;e<BE.rows();e++)\n    {\n      SRP(RP(e)) |= m_selection(e);\n    }\n    for(int e = 0;e<BE.rows();e++)\n    {\n      m_selection(e) = SRP(RP(e));\n    }\n    // Clear selections below m_selection ancestors\n    VectorXb new_selection = m_selection;\n    for(int e = 0;e<P.rows();e++)\n    {\n      propagate(e,m_selection,new_selection);\n    }\n    m_selection = new_selection;\n    if(m_selection==prev_selection)\n    {\n      break;\n    }\n    prev_selection = m_selection;\n  }\n\n  // Now selection should contain just bone roots of m_selection subtrees\n  if(m_selection.array().any())\n  {\n    // Taking average \n    Vector3d avg_pos(0,0,0);\n    //m_trans_widget_trans_at_selection.setConstant(0);\n    m_widget_rot_at_selection.coeffs().setConstant(0);\n    m_widget.rot.coeffs().array().setConstant(0);\n    Quaterniond cur_rot(0,0,0,0);\n    int num_selection = 0;\n    // Compute average widget for selection\n    for(int e = 0;e<BE.rows();e++)\n    {\n      if(m_selection(e))\n      {\n        Vector3d s = C.row(BE(e,0));\n        Vector3d d = C.row(BE(e,1));\n        auto b = (d-s).transpose().eval();\n        {\n          Affine3d a = Affine3d::Identity();\n          a.translate(vT[e]);\n          a.rotate(vQ[e]);\n          avg_pos += a*s;\n        }\n        // Rotation of x axis to this bone\n        Quaterniond rot_at_bind;\n        rot_at_bind.setFromTwoVectors(Vector3d(1,0,0),b);\n        const Quaterniond abs_rot = vQ[e] * rot_at_bind;\n        m_widget_rot_at_selection.coeffs() += abs_rot.coeffs();\n        //m_trans_widget_trans_at_selection += vT[e];\n        num_selection++;\n      }\n    }\n    // Take average\n    avg_pos.array() /= (double)num_selection;\n    //m_trans_widget_trans_at_selection.array() /= (double)num_selection;\n    m_widget_rot_at_selection.coeffs().array() /= (double)num_selection;\n    m_widget_rot_at_selection.normalize();\n    m_widget.rot = m_widget_rot_at_selection;\n    m_widget.pos      = avg_pos;\n    m_trans_widget.m_pos = avg_pos;\n    //m_trans_widget.m_trans = m_trans_widget_trans_at_selection;\n    m_trans_widget.m_trans.setConstant(0);\n  }\n  m_widget.m_is_enabled = true;\n  m_trans_widget.m_is_enabled = true;\n  for(int s = 0;s<m_selection.rows();s++)\n  {\n    // a root is selected then disable.\n    if(!m_root_enabled && m_selection(s) && P(s) == -1)\n    {\n      m_widget.m_is_enabled = false;\n      m_trans_widget.m_is_enabled = false;\n      break;\n    }\n  }\n}\n\ninline void igl::opengl2::MouseController::set_size(const int n)\n{\n  using namespace Eigen;\n  clear_selection();\n  m_rotations.clear();\n  m_rotations.resize(n,Quaterniond::Identity());\n  m_translations.clear();\n  m_translations.resize(n,Vector3d(0,0,0));\n  m_selection = VectorXb::Zero(n);\n}\n\ninline void igl::opengl2::MouseController::reset()\n{\n  reset_rotations();\n  reset_translations();\n}\n\ninline void igl::opengl2::MouseController::reset_selected()\n{\n  reset_selected_rotations();\n  reset_selected_translations();\n}\n\ninline void igl::opengl2::MouseController::reset_rotations()\n{\n  using namespace Eigen;\n  using namespace std;\n  fill(m_rotations.begin(),m_rotations.end(),Quaterniond::Identity());\n  // cop out. just clear selection\n  clear_selection();\n}\n\ninline void igl::opengl2::MouseController::reset_selected_rotations()\n{\n  using namespace Eigen;\n  for(int e = 0;e<m_selection.size();e++)\n  {\n    if(m_selection(e))\n    {\n      m_rotations[e] = Quaterniond::Identity();\n    }\n  }\n}\n\ninline void igl::opengl2::MouseController::reset_translations()\n{\n  using namespace Eigen;\n  using namespace std;\n  fill(m_translations.begin(),m_translations.end(),Vector3d(0,0,0));\n  // cop out. just clear selection\n  clear_selection();\n}\n\ninline void igl::opengl2::MouseController::reset_selected_translations()\n{\n  using namespace Eigen;\n  for(int e = 0;e<m_selection.size();e++)\n  {\n    if(m_selection(e))\n    {\n      m_translations[e] = Vector3d(0,0,0);\n    }\n  }\n}\n\ninline bool igl::opengl2::MouseController::set_rotations(const RotationList & vQ)\n{\n  if(vQ.size() != m_rotations.size())\n  {\n    return false;\n  }\n  assert(!any_selection());\n  m_rotations = vQ;\n  return true;\n}\n\ninline bool igl::opengl2::MouseController::set_translations(const TranslationList & vT)\n{\n  if(vT.size() != m_translations.size())\n  {\n    return false;\n  }\n  assert(!any_selection());\n  m_translations = vT;\n  return true;\n}\n\ninline void igl::opengl2::MouseController::clear_selection()\n{\n  m_selection.setConstant(false);\n}\n\ninline bool igl::opengl2::MouseController::any_selection() const\n{\n  return m_selection.array().any();\n}\n\ninline void igl::opengl2::MouseController::set_widget_mode(const WidgetMode & mode)\n{\n  switch(m_widget_mode)\n  {\n    default:\n    case WIDGET_MODE_TRANSLATE:\n      m_widget.pos = m_trans_widget.m_pos+m_trans_widget.m_trans;\n      break;\n    case WIDGET_MODE_ROTATE:\n      break;\n  }\n  m_widget_mode = mode;\n}\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/RotateWidget.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL2_ROTATE_WIDGET_H\n#define IGL_OPENGL2_ROTATE_WIDGET_H\n#include \"../material_colors.h\"\n#include <Eigen/Geometry>\n#include <Eigen/Core>\n#include <vector>\n\nnamespace igl\n{\n  namespace opengl2\n  {\n    // 3D Rotate tool widget similar to Maya's. Works best if field of view angle\n    // is less than ~25.\n    class RotateWidget\n    {\n        // If a is true then use A else use desaturated A\n        static inline void glColor4fv(const bool a, const Eigen::Vector4f & A);\n      public:\n        inline static Eigen::Quaterniond axis_q(const int a);\n        inline static Eigen::Vector3d view_direction(const int x, const int y);\n        inline static Eigen::Vector3d view_direction(const Eigen::Vector3d & pos);\n        Eigen::Vector3d pos;\n        Eigen::Quaterniond rot,down_rot;\n        Eigen::Vector2d down_xy,drag_xy,down_dir;\n        Eigen::Vector3d udown,udrag;\n        double outer_radius_on_screen;\n        double outer_over_inner;\n        bool m_is_enabled;\n        enum DownType\n        {\n          DOWN_TYPE_X = 0,\n          DOWN_TYPE_Y = 1,\n          DOWN_TYPE_Z = 2,\n          DOWN_TYPE_OUTLINE = 3,\n          DOWN_TYPE_TRACKBALL = 4,\n          DOWN_TYPE_NONE = 5,\n          NUM_DOWN_TYPES = 6\n        } down_type, selected_type;\n        inline RotateWidget();\n        // Vector from origin to mouse click \"Unprojected\" onto plane with depth of\n        // origin and scale to so that outer radius is 1\n        // \n        // Inputs:\n        //   x  mouse x position\n        //   y  mouse y position\n        // Returns vector\n        inline Eigen::Vector3d unproject_onto(const int x, const int y) const;\n        // Shoot ray from mouse click to sphere\n        //\n        // Inputs:\n        //   x  mouse x position\n        //   y  mouse y position\n        // Outputs:\n        //   hit  position of hit\n        // Returns true only if there was a hit\n        inline bool intersect(\n          const int x, \n          const int y, \n          Eigen::Vector3d & hit) const;\n        inline double unprojected_inner_radius() const;\n        inline bool down(const int x, const int y);\n        inline bool drag(const int x, const int y);\n        inline bool up(const int x, const int y);\n        inline bool is_down() const;\n        inline void draw() const;\n        inline void draw_guide() const;\n      public:\n          EIGEN_MAKE_ALIGNED_OPERATOR_NEW\n    };\n  }\n}\n\n// Implementation\n#include \"../PI.h\"\n#include \"../EPS.h\"\n#include \"../ray_sphere_intersect.h\"\n#include \"../mat_to_quat.h\"\n#include \"../trackball.h\"\n#include \"gl.h\"\n#include \"project.h\"\n#include \"unproject.h\"\n#include <iostream>\n#include <cassert>\n\ninline void igl::opengl2::RotateWidget::glColor4fv(\n    const bool a,\n    const Eigen::Vector4f & A)\n{\n  if(a)\n  {\n    ::glColor4fv(A.data());\n  }else\n  {\n    Eigen::Vector4f B;\n    const double f = 0.95; // desaturate by 95%\n    const double L = 0.3*A(0) + 0.6*A(1) + 0.1*A(2);\n    B.head(3) = A.head(3).array() + f*(L-A.head(3).array());\n    B(3) = A(3);\n    ::glColor4fv(B.data());\n  }\n}\n\ninline Eigen::Quaterniond igl::opengl2::RotateWidget::axis_q(const int a)\n{\n  assert(a<3 && a>=0);\n  const Eigen::Quaterniond axes[3] = {\n    Eigen::Quaterniond(Eigen::AngleAxisd(igl::PI*0.5,Eigen::Vector3d(0,1,0))),\n    Eigen::Quaterniond(Eigen::AngleAxisd(igl::PI*0.5,Eigen::Vector3d(1,0,0))),\n    Eigen::Quaterniond::Identity()};\n  return axes[a];\n}\n\ninline Eigen::Vector3d igl::opengl2::RotateWidget::view_direction(const int x, const int y)\n{\n  using namespace Eigen;\n  const Vector3d win_s(x,y,0), win_d(x,y,1);\n  const Vector3d s = unproject(win_s);\n  const Vector3d d = unproject(win_d);\n  return d-s;\n}\n\ninline Eigen::Vector3d igl::opengl2::RotateWidget::view_direction(const Eigen::Vector3d & pos)\n{\n  using namespace Eigen;\n  const Vector3d ppos = project(pos);\n  return view_direction(ppos(0),ppos(1));\n}\n\ninline igl::opengl2::RotateWidget::RotateWidget():\n  pos(0,0,0),\n  rot(Eigen::Quaterniond::Identity()),\n  down_rot(rot),\n  down_xy(-1,-1),drag_xy(-1,-1),\n  outer_radius_on_screen(91.),\n  outer_over_inner(1.13684210526),\n  m_is_enabled(true),\n  down_type(DOWN_TYPE_NONE), \n  selected_type(DOWN_TYPE_NONE)\n{\n}\n\ninline Eigen::Vector3d igl::opengl2::RotateWidget::unproject_onto(\n  const int x, \n  const int y) const\n{\n  using namespace Eigen;\n  // KNOWN BUG: This projects to same depths as pos. I think what we actually\n  // want is The intersection with the plane perpendicular to the view\n  // direction at pos. If the field of view angle is small then this difference\n  // is negligible.\n  //const Vector3d ppos = project(pos);\n  //const Vector3d uxy = unproject( Vector3d(x,y,ppos(2)));\n  // http://en.wikipedia.org/wiki/Line-plane_intersection\n  //\n  // Hrrmmm. There's still something wrong here if the ball's in the corner of\n  // the screen. Am I somehow not accounting for perspective correctly?\n  //\n  // Q: What about just projecting the circle's equation and solving for the\n  // distance?\n  const Vector3d l0 = unproject(Vector3d(x,y,0));\n  const Vector3d l = unproject(Vector3d(x,y,1))-l0;\n  const Vector3d n = view_direction(pos);\n  const double t = (pos-l0).dot(n)/l.dot(n);\n  const Vector3d uxy = l0+t*l;\n  return (uxy-pos)/unprojected_inner_radius()*outer_over_inner*outer_over_inner;\n}\n\ninline bool igl::opengl2::RotateWidget::intersect(\n  const int x, \n  const int y,\n  Eigen::Vector3d & hit) const\n{\n  using namespace Eigen;\n  Vector3d view = view_direction(x,y);\n  const Vector3d ppos = project(pos);\n  Vector3d uxy = unproject(Vector3d(x,y,ppos(2)));\n  double t0,t1;\n  if(!ray_sphere_intersect(uxy,view,pos,unprojected_inner_radius(),t0,t1))\n  {\n    return false;\n  }\n  hit = uxy+t0*view;\n  return true;\n}\n\n\ninline double igl::opengl2::RotateWidget::unprojected_inner_radius() const\n{\n  using namespace Eigen;\n  Vector3d off,ppos,ppos_off,pos_off;\n  project(pos,ppos);\n  ppos_off = ppos;\n  ppos_off(0) += outer_radius_on_screen/outer_over_inner;\n  unproject(ppos_off,pos_off);\n  return (pos-pos_off).norm();\n}\ninline bool igl::opengl2::RotateWidget::down(const int x, const int y)\n{\n  using namespace Eigen;\n  using namespace std;\n  if(!m_is_enabled)\n  {\n    return false;\n  }\n  down_type = DOWN_TYPE_NONE;\n  selected_type = DOWN_TYPE_NONE;\n  down_xy = Vector2d(x,y);\n  drag_xy = down_xy;\n  down_rot = rot;\n  Vector3d ppos = project(pos);\n  const double r = (ppos.head(2) - down_xy).norm();\n  const double thresh = 3;\n  if(fabs(r - outer_radius_on_screen)<thresh)\n  {\n    udown = unproject_onto(x,y);\n    udrag = udown;\n    down_type = DOWN_TYPE_OUTLINE;\n    selected_type = DOWN_TYPE_OUTLINE;\n    // project mouse to same depth as pos\n    return true;\n  }else if(r < outer_radius_on_screen/outer_over_inner+thresh*0.5)\n  {\n    Vector3d hit;\n    const bool is_hit = intersect(down_xy(0),down_xy(1),hit);\n    if(!is_hit)\n    {\n      //cout<<\"~~~!is_hit\"<<endl;\n    }\n    auto on_meridian = [&](\n      const Vector3d & hit, \n      const Quaterniond & rot, \n      const Quaterniond & m,\n      Vector3d & pl_hit) -> bool\n    {\n      // project onto rotate plane\n      pl_hit = hit-pos;\n      pl_hit = (m.conjugate()*rot.conjugate()*pl_hit).eval();\n      pl_hit(2) = 0;\n      pl_hit = (rot*m*pl_hit).eval();\n      pl_hit.normalize();\n      pl_hit *= unprojected_inner_radius();\n      pl_hit += pos;\n      return (project(pl_hit).head(2)-project(hit).head(2)).norm()<2*thresh;\n    };\n    udown = (hit-pos).normalized()/outer_radius_on_screen;\n    udrag = udown;\n    for(int a = 0;a<3;a++)\n    {\n      Vector3d pl_hit;\n      if(on_meridian(hit,rot,Quaterniond(axis_q(a)),pl_hit))\n      {\n        udown = (pl_hit-pos).normalized()/outer_radius_on_screen;\n        udrag = udown;\n        down_type = DownType(DOWN_TYPE_X+a);\n        selected_type = down_type;\n        {\n          Vector3d dir3 = axis_q(a).conjugate()*down_rot.conjugate()*(hit-pos);\n          dir3 = AngleAxisd(-PI*0.5,Vector3d(0,0,1))*dir3;\n          dir3 = (rot*axis_q(a)*dir3).eval();\n          down_dir = (project((hit+dir3).eval())-project(hit)).head(2);\n          down_dir.normalize();\n          //// flip y because y coordinate is going to be given backwards in\n          //// drag()\n          //down_dir(1) *= -1;\n        }\n        return true;\n      }\n    }\n    //assert(is_hit);\n    down_type = DOWN_TYPE_TRACKBALL;\n    selected_type = DOWN_TYPE_TRACKBALL;\n    return true;\n  }else\n  {\n    return false;\n  }\n}\n\ninline bool igl::opengl2::RotateWidget::drag(const int x, const int y)\n{\n  using namespace std;\n  using namespace Eigen;\n  if(!m_is_enabled)\n  {\n    return false;\n  }\n  drag_xy = Vector2d(x,y);\n  switch(down_type)\n  {\n    case DOWN_TYPE_NONE:\n      return false;\n    default:\n    {\n      const Quaterniond & q = axis_q(down_type-DOWN_TYPE_X);\n      const double dtheta = -(drag_xy - down_xy).dot(down_dir)/\n        outer_radius_on_screen/outer_over_inner*PI/2.;\n      Quaterniond dq(AngleAxisd(dtheta,down_rot*q*Vector3d(0,0,1)));\n      rot = dq * down_rot;\n      udrag = dq * udown;\n      return true;\n    }\n    case DOWN_TYPE_OUTLINE:\n      {\n        Vector3d ppos = project(pos);\n        // project mouse to same depth as pos\n        udrag = unproject_onto(x,y);\n        const Vector2d A = down_xy - ppos.head(2);\n        const Vector2d B = drag_xy - ppos.head(2);\n        const double dtheta = atan2(A(0)*B(1)-A(1)*B(0),A(0)*B(0)+A(1)*B(1));\n        Vector3d n = view_direction(pos).normalized();\n        Quaterniond dq(AngleAxisd(dtheta,-n));\n        //Vector3d n = udrag.cross(udown).normalized();\n        //Quaterniond dq(AngleAxisd(fabs(dtheta),-n));\n        rot = dq * down_rot;\n      }\n      return true;\n    case DOWN_TYPE_TRACKBALL:\n      {\n        Vector3d ppos = project(pos);\n        const double r = (double)outer_radius_on_screen/outer_over_inner*2.0;\n        //const int h = w;\n        Vector4i vp;\n        glGetIntegerv(GL_VIEWPORT,vp.data());\n        const int h = vp(3);\n        Quaterniond dq;\n        trackball(\n          r,r,\n          1,\n          Quaterniond::Identity(),\n          double(    down_xy(0)-ppos(0)    )+r/2.,\n          double((h-down_xy(1))-(h-ppos(1)))+r/2.,\n          double(             x-ppos(0)    )+r/2.,\n          double(         (h-y)-(h-ppos(1)))+r/2.,\n          dq);\n        // We've computed change in rotation according to this view:\n        // R = mv * r, R' = rot * (mv * r)\n        // But we only want new value for r:\n        // R' = mv * r'\n        // mv * r' = rot * (mv * r)\n        // r' = mv* * rot * mv * r\n        Matrix4d mv;\n        glGetDoublev(GL_MODELVIEW_MATRIX,mv.data());\n        Quaterniond scene_rot;\n        // Convert modelview matrix to quaternion\n        mat4_to_quat(mv.data(),scene_rot.coeffs().data());\n        scene_rot.normalize();\n        rot = scene_rot.conjugate() * dq * scene_rot * down_rot;\n      }\n      return true;\n  }\n}\n\ninline bool igl::opengl2::RotateWidget::up(const int /*x*/, const int /*y*/)\n{\n  // even if disabled process up\n  down_type = DOWN_TYPE_NONE;\n  return false;\n}\n\ninline bool igl::opengl2::RotateWidget::is_down() const\n{\n  return down_type != DOWN_TYPE_NONE;\n}\n\ninline void igl::opengl2::RotateWidget::draw() const\n{\n  using namespace Eigen;\n  using namespace std;\n  glPushAttrib(GL_ENABLE_BIT | GL_LIGHTING_BIT | GL_DEPTH_BUFFER_BIT | GL_LINE_BIT);\n  glDisable(GL_CLIP_PLANE0);\n\n  glDisable(GL_LIGHTING);\n  glDisable(GL_DEPTH_TEST);\n  glLineWidth(2.0);\n\n  double r = unprojected_inner_radius();\n  Vector3d view = view_direction(pos).normalized();\n\n  auto draw_circle = [&](const bool cull)\n  {\n    Vector3d view = view_direction(pos).normalized();\n    glBegin(GL_LINES);\n    const double th_step = (2.0*igl::PI/100.0);\n    for(double th = 0;th<2.0*igl::PI+th_step;th+=th_step)\n    {\n      Vector3d a(cos(th),sin(th),0.0);\n      Vector3d b(cos(th+th_step),sin(th+th_step),0.0);\n      if(!cull || (0.5*(a+b)).dot(view)<FLOAT_EPS)\n      {\n        glVertex3dv(a.data());\n        glVertex3dv(b.data());\n      }\n    }\n    glEnd();\n  };\n\n\n  glPushMatrix();\n  glTranslated(pos(0),pos(1),pos(2));\n\n  glScaled(r,r,r);\n  // Draw outlines\n  {\n    glPushMatrix();\n    glColor4fv(m_is_enabled,MAYA_GREY);\n    Quaterniond q;\n    q.setFromTwoVectors(Vector3d(0,0,1),view);\n    glMultMatrixd(Affine3d(q).matrix().data());\n    draw_circle(false);\n    glScaled(outer_over_inner,outer_over_inner,outer_over_inner);\n    if(selected_type == DOWN_TYPE_OUTLINE)\n    {\n      glColor4fv(m_is_enabled,MAYA_YELLOW);\n    }else\n    {\n      glColor4fv(m_is_enabled,MAYA_CYAN);\n    }\n    draw_circle(false);\n    glPopMatrix();\n  }\n  // Draw quartiles\n  {\n    glPushMatrix();\n    glMultMatrixd(Affine3d(rot).matrix().data());\n    if(selected_type == DOWN_TYPE_Z)\n    {\n      glColor4fv(m_is_enabled,MAYA_YELLOW);\n    }else\n    {\n      glColor4fv(m_is_enabled,MAYA_BLUE);\n    }\n    draw_circle(true);\n    if(selected_type == DOWN_TYPE_Y)\n    {\n      glColor4fv(m_is_enabled,MAYA_YELLOW);\n    }else\n    {\n      glColor4fv(m_is_enabled,MAYA_GREEN);\n    }\n    glRotated(90.0,1.0,0.0,0.0);\n    draw_circle(true);\n    if(selected_type == DOWN_TYPE_X)\n    {\n      glColor4fv(m_is_enabled,MAYA_YELLOW);\n    }else\n    {\n      glColor4fv(m_is_enabled,MAYA_RED);\n    }\n    glRotated(90.0,0.0,1.0,0.0);\n    draw_circle(true);\n    glPopMatrix();\n  }\n  glColor4fv(m_is_enabled,MAYA_GREY);\n  draw_guide();\n  glPopMatrix();\n\n  glPopAttrib();\n};\n\ninline void igl::opengl2::RotateWidget::draw_guide() const\n{\n  using namespace Eigen;\n  using namespace std;\n  glPushAttrib(\n    GL_DEPTH_BUFFER_BIT | \n    GL_ENABLE_BIT | \n    GL_POLYGON_BIT | \n    GL_POINT_BIT | \n    GL_TRANSFORM_BIT |\n    GL_STENCIL_BUFFER_BIT |\n    GL_LIGHTING_BIT);\n\n  // http://www.codeproject.com/Articles/23444/A-Simple-OpenGL-Stipple-Polygon-Example-EP_OpenGL_\n  const GLubyte halftone[] = {\n    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,\n    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,\n    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,\n    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,\n    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,\n    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,\n    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,\n    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,\n    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,\n    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,\n    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,\n    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,\n    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,\n    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,\n    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,\n    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55};\n\n\n  switch(down_type)\n  {\n    case DOWN_TYPE_NONE:\n    case DOWN_TYPE_TRACKBALL:\n      goto finish;\n    case DOWN_TYPE_OUTLINE:\n      glScaled(outer_over_inner,outer_over_inner,outer_over_inner);\n      break;\n    default:\n      break;\n  }\n  {\n    const Vector3d nudown(udown.normalized()), \n      nudrag(udrag.normalized());\n    glPushMatrix();\n    glDisable(GL_CULL_FACE);\n    glDisable(GL_POINT_SMOOTH);\n    glPointSize(5.);\n    glBegin(GL_POINTS);\n    glVertex3dv(nudown.data());\n    glVertex3d(0,0,0);\n    glVertex3dv(nudrag.data());\n    glEnd();\n    glBegin(GL_LINE_STRIP);\n    glVertex3dv(nudown.data());\n    glVertex3d(0,0,0);\n    glVertex3dv(nudrag.data());\n    glEnd();\n    glEnable(GL_POLYGON_STIPPLE);\n    glPolygonStipple(halftone);\n    glBegin(GL_TRIANGLE_FAN);\n    glVertex3d(0,0,0);\n    Quaterniond dq = rot * down_rot.conjugate();\n    //dq.setFromTwoVectors(nudown,nudrag);\n    for(double t = 0;t<1;t+=0.1)\n    {\n      const Vector3d p = Quaterniond::Identity().slerp(t,dq) * nudown;\n      glVertex3dv(p.data());\n    }\n    glVertex3dv(nudrag.data());\n    glEnd();\n    glPopMatrix();\n  }\nfinish:\n  glPopAttrib();\n}\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/TranslateWidget.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL2_TRANSLATE_WIDGET_H\n#define IGL_OPENGL2_TRANSLATE_WIDGET_H\n#include \"../material_colors.h\"\n#include <Eigen/Geometry>\n#include <Eigen/Core>\n#include <vector>\n\nnamespace igl\n{\n  namespace opengl2\n  {\n    class TranslateWidget\n    {\npublic:\n      // m_pos  position of center\n      // m_trans  translation vector\n      // m_down_xy  mouse position on down\n      // m_drag_xy  mouse position on drag\n      // m_is_enabled  whether enabled\n      Eigen::Vector3d m_pos,m_trans,m_down_trans;\n      Eigen::Vector2d m_down_xy, m_drag_xy;\n      bool m_is_enabled;\n      double m_len;\n      enum DownType\n      {\n        DOWN_TYPE_X = 0,\n        DOWN_TYPE_Y = 1,\n        DOWN_TYPE_Z = 2,\n        DOWN_TYPE_CENTER = 3,\n        DOWN_TYPE_NONE = 4,\n        NUM_DOWN_TYPES = 5\n      } m_down_type, m_selected_type;\n      inline TranslateWidget(const Eigen::Vector3d & pos = Eigen::Vector3d(0,0,0));\n      inline bool down(const int x, const int y);\n      inline bool drag(const int x, const int y);\n      inline bool up(const int x, const int y);\n      inline bool is_down() const;\n      inline void draw() const;\npublic:\n      EIGEN_MAKE_ALIGNED_OPERATOR_NEW;\n    };\n  }\n}\n\n// Implementation\n#include \"project.h\"\n#include \"unproject.h\"\n\ninline igl::opengl2::TranslateWidget::TranslateWidget(\n  const Eigen::Vector3d & pos):\n  m_pos(pos),\n  m_trans(0,0,0),\n  m_down_xy(-1,-1),\n  m_drag_xy(-1,-1),\n  m_is_enabled(true),\n  m_len(50),\n  m_down_type(DOWN_TYPE_NONE), \n  m_selected_type(DOWN_TYPE_NONE)\n{\n}\n\ninline bool igl::opengl2::TranslateWidget::down(const int x, const int y)\n{\n  using namespace Eigen;\n  using namespace std;\n  if(!m_is_enabled)\n  {\n    return false;\n  }\n  m_down_trans = m_trans;\n  m_down_xy = Vector2d(x,y);\n  m_drag_xy = m_down_xy;\n  m_down_type = DOWN_TYPE_NONE;\n  m_selected_type = DOWN_TYPE_NONE;\n  Vector3d ppos = project((m_pos+m_trans).eval());\n  const double r = (ppos.head(2) - m_down_xy).norm();\n  const double center_thresh = 10;\n  if(r < center_thresh)\n  {\n    m_down_type = DOWN_TYPE_CENTER;\n    m_selected_type = m_down_type;\n    return true;\n  }else if(r < m_len)\n  {\n    // Might be hit on lines\n  }\n  return false;\n}\n\ninline bool igl::opengl2::TranslateWidget::drag(const int x, const int y)\n{\n  using namespace std;\n  using namespace Eigen;\n  if(!m_is_enabled)\n  {\n    return false;\n  }\n  m_drag_xy = Vector2d(x,y);\n  switch(m_down_type)\n  {\n    case DOWN_TYPE_NONE:\n      return false;\n    default:\n    {\n      Vector3d ppos = project((m_pos+m_trans).eval());\n      Vector3d drag3(m_drag_xy(0),m_drag_xy(1),ppos(2));\n      Vector3d down3(m_down_xy(0),m_down_xy(1),ppos(2));\n      m_trans = m_down_trans + unproject(drag3)-unproject(down3);\n      return true;\n    }\n  }\n}\n\ninline bool igl::opengl2::TranslateWidget::up(const int /*x*/, const int /*y*/)\n{\n  // even if disabled process up\n  m_down_type = DOWN_TYPE_NONE;\n  return false;\n}\n\ninline bool igl::opengl2::TranslateWidget::is_down() const\n{\n  return m_down_type != DOWN_TYPE_NONE;\n}\n\ninline void igl::opengl2::TranslateWidget::draw() const\n{\n  using namespace Eigen;\n  using namespace std;\n  glPushAttrib(GL_ENABLE_BIT | GL_LIGHTING_BIT | GL_DEPTH_BUFFER_BIT | GL_LINE_BIT);\n  glDisable(GL_LIGHTING);\n  glDisable(GL_DEPTH_TEST);\n  glLineWidth(2.0);\n  auto draw_axes = [&]()\n  {\n    glBegin(GL_LINES);\n    glColor3f(1,0,0);\n    glVertex3f(0,0,0);\n    glVertex3f(1,0,0);\n    glColor3f(0,1,0);\n    glVertex3f(0,0,0);\n    glVertex3f(0,1,0);\n    glColor3f(0,0,1);\n    glVertex3f(0,0,0);\n    glVertex3f(0,0,1);\n    glEnd();\n  };\n  auto draw_cube = []\n  {\n    glBegin(GL_LINES);\n    glVertex3f(-1.0f, 1.0f, 1.0f);\n    glVertex3f(1.0f, 1.0f, 1.0f);\n    glVertex3f(1.0f, 1.0f, 1.0f);\n    glVertex3f(1.0f, -1.0f, 1.0f);\n    glVertex3f(1.0f, -1.0f, 1.0f);\n    glVertex3f(-1.0f, -1.0f, 1.0f);\n    glVertex3f(-1.0f, -1.0f, 1.0f);\n    glVertex3f(-1.0f, 1.0f, 1.0f);\n    glVertex3f(1.0f, 1.0f, 1.0f);\n    glVertex3f(1.0f, 1.0f, -1.0f);\n    glVertex3f(1.0f, 1.0f, -1.0f);\n    glVertex3f(1.0f, -1.0f, -1.0f);\n    glVertex3f(1.0f, -1.0f, -1.0f);\t\n    glVertex3f(1.0f, -1.0f, 1.0f);\n    glVertex3f(1.0f, 1.0f, -1.0f);\n    glVertex3f(-1.0f, 1.0f, -1.0f);\n    glVertex3f(-1.0f, -1.0f, -1.0f);\n    glVertex3f(1.0f, -1.0f, -1.0f);\n    glVertex3f(-1.0f, -1.0f, -1.0f);\n    glVertex3f(-1.0f, 1.0f, -1.0f);\n    glVertex3f(-1.0f, 1.0f, -1.0f);\n    glVertex3f(-1.0f, 1.0f, 1.0f);\n    glVertex3f(-1.0f, -1.0f, 1.0f);\n    glVertex3f(-1.0f, -1.0f, -1.0f);\n    glEnd();\n  };\n  glPushMatrix();\n  glTranslated( m_pos(0)+m_trans(0), m_pos(1)+m_trans(1), m_pos(2)+m_trans(2));\n\n  {\n    Vector3d off,ppos,ppos_off,pos_off;\n    project((m_pos+m_trans).eval(),ppos);\n    ppos_off = ppos;\n    ppos_off(0) += m_len;\n    unproject(ppos_off,pos_off);\n    const double r = (m_pos+m_trans-pos_off).norm();\n    glScaled(r,r,r);\n  }\n\n  draw_axes();\n  glScaled(0.05,0.05,0.05);\n  if(m_selected_type == DOWN_TYPE_CENTER)\n  {\n    glColor3fv(MAYA_YELLOW.data());\n  }else\n  {\n    glColor3fv(MAYA_GREY.data());\n  }\n  draw_cube();\n  glPopMatrix();\n  glPopAttrib();\n}\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/draw_beach_ball.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"draw_beach_ball.h\"\n#include \"gl.h\"\n\n// I'm not sure why windows would need it this way:\n// http://lists.cairographics.org/archives/cairo/2008-January/012722.html\n#ifdef _MSC_VER\n#define SAFE_INLINE __inline\n#else\n#define SAFE_INLINE inline\n#endif\n\n#include <vector>\n#include <cmath>\n#include <iostream>\n\n// Most of this implementation comes from the AntTweakBar source code:\n// TwMgr.cpp, TwMgr.h, TwColor.h, TwColor.cpp, TwOpenGL.h and TwOpenGL.cpp\n\n////////////////////////////////////////////////////////////////////////////\n// Begin Copied Straight from AntTweakBar\n////////////////////////////////////////////////////////////////////////////\nenum EArrowParts     { ARROW_CONE, ARROW_CONE_CAP, ARROW_CYL, ARROW_CYL_CAP };\n\ntemplate <typename T> SAFE_INLINE const T& TClamp(const T& X, const T& Limit1, const T& Limit2)\n{\n    if( Limit1<Limit2 )\n        return (X<=Limit1) ? Limit1 : ( (X>=Limit2) ? Limit2 : X );\n    else\n        return (X<=Limit2) ? Limit2 : ( (X>=Limit1) ? Limit1 : X );\n}\n\ntypedef unsigned int color32;\nstatic SAFE_INLINE color32 Color32FromARGBi(int A, int R, int G, int B)\n{\n    return (((color32)TClamp(A, 0, 255))<<24) | (((color32)TClamp(R, 0, 255))<<16) | (((color32)TClamp(G, 0, 255))<<8) | ((color32)TClamp(B, 0, 255));\n}\n\nstatic SAFE_INLINE color32 Color32FromARGBf(float A, float R, float G, float B)\n{\n    return (((color32)TClamp(A*256.0f, 0.0f, 255.0f))<<24) | (((color32)TClamp(R*256.0f, 0.0f, 255.0f))<<16) | (((color32)TClamp(G*256.0f, 0.0f, 255.0f))<<8) | ((color32)TClamp(B*256.0f, 0.0f, 255.0f));\n}\n\nstatic SAFE_INLINE void Color32ToARGBi(color32 Color, int *A, int *R, int *G, int *B)\n{\n    if(A) *A = (Color>>24)&0xff;\n    if(R) *R = (Color>>16)&0xff;\n    if(G) *G = (Color>>8)&0xff;\n    if(B) *B = Color&0xff;\n}\n\nstatic SAFE_INLINE void Color32ToARGBf(color32 Color, float *A, float *R, float *G, float *B)\n{\n    if(A) *A = (1.0f/255.0f)*float((Color>>24)&0xff);\n    if(R) *R = (1.0f/255.0f)*float((Color>>16)&0xff);\n    if(G) *G = (1.0f/255.0f)*float((Color>>8)&0xff);\n    if(B) *B = (1.0f/255.0f)*float(Color&0xff);\n}\n\nstatic color32 ColorBlend(color32 Color1, color32 Color2, float S)\n{\n    float a1, r1, g1, b1, a2, r2, g2, b2;\n    Color32ToARGBf(Color1, &a1, &r1, &g1, &b1);\n    Color32ToARGBf(Color2, &a2, &r2, &g2, &b2);\n    float t = 1.0f-S;\n    return Color32FromARGBf(t*a1+S*a2, t*r1+S*r2, t*g1+S*g2, t*b1+S*b2);\n}\n\nstatic std::vector<float>   s_SphTri;\nstatic std::vector<color32> s_SphCol;\nstatic void CreateSphere()\n{\n    const int SUBDIV = 7;\n    s_SphTri.clear();\n    s_SphCol.clear();\n\n    const float A[8*3] = { 1,0,0, 0,0,-1, -1,0,0, 0,0,1,   0,0,1,  1,0,0,  0,0,-1, -1,0,0 };\n    const float B[8*3] = { 0,1,0, 0,1,0,  0,1,0,  0,1,0,   0,-1,0, 0,-1,0, 0,-1,0, 0,-1,0 };\n    const float C[8*3] = { 0,0,1, 1,0,0,  0,0,-1, -1,0,0,  1,0,0,  0,0,-1, -1,0,0, 0,0,1  };\n    //const color32 COL_A[8] = { 0xffff8080, 0xff000080, 0xff800000, 0xff8080ff,  0xff8080ff, 0xffff8080, 0xff000080, 0xff800000 };\n    //const color32 COL_B[8] = { 0xff80ff80, 0xff80ff80, 0xff80ff80, 0xff80ff80,  0xff008000, 0xff008000, 0xff008000, 0xff008000 };\n    //const color32 COL_C[8] = { 0xff8080ff, 0xffff8080, 0xff000080, 0xff800000,  0xffff8080, 0xff000080, 0xff800000, 0xff8080ff };\n    const color32 COL_A[8] = { 0xffffffff, 0xffffff40, 0xff40ff40, 0xff40ffff,  0xffff40ff, 0xffff4040, 0xff404040, 0xff4040ff };\n    const color32 COL_B[8] = { 0xffffffff, 0xffffff40, 0xff40ff40, 0xff40ffff,  0xffff40ff, 0xffff4040, 0xff404040, 0xff4040ff };\n    const color32 COL_C[8] = { 0xffffffff, 0xffffff40, 0xff40ff40, 0xff40ffff,  0xffff40ff, 0xffff4040, 0xff404040, 0xff4040ff };\n\n    int i, j, k, l;\n    float xa, ya, za, xb, yb, zb, xc, yc, zc, x, y, z, norm, u[3], v[3];\n    color32 col;\n    for( i=0; i<8; ++i )\n    {\n        xa = A[3*i+0]; ya = A[3*i+1]; za = A[3*i+2];\n        xb = B[3*i+0]; yb = B[3*i+1]; zb = B[3*i+2];\n        xc = C[3*i+0]; yc = C[3*i+1]; zc = C[3*i+2];\n        for( j=0; j<=SUBDIV; ++j )\n            for( k=0; k<=2*(SUBDIV-j); ++k )\n            {\n                if( k%2==0 )\n                {\n                    u[0] = ((float)j)/(SUBDIV+1);\n                    v[0] = ((float)(k/2))/(SUBDIV+1);\n                    u[1] = ((float)(j+1))/(SUBDIV+1);\n                    v[1] = ((float)(k/2))/(SUBDIV+1);\n                    u[2] = ((float)j)/(SUBDIV+1);\n                    v[2] = ((float)(k/2+1))/(SUBDIV+1);\n                }\n                else\n                {\n                    u[0] = ((float)j)/(SUBDIV+1);\n                    v[0] = ((float)(k/2+1))/(SUBDIV+1);\n                    u[1] = ((float)(j+1))/(SUBDIV+1);\n                    v[1] = ((float)(k/2))/(SUBDIV+1);\n                    u[2] = ((float)(j+1))/(SUBDIV+1);\n                    v[2] = ((float)(k/2+1))/(SUBDIV+1);\n                }\n\n                for( l=0; l<3; ++l )\n                {\n                    x = (1.0f-u[l]-v[l])*xa + u[l]*xb + v[l]*xc;\n                    y = (1.0f-u[l]-v[l])*ya + u[l]*yb + v[l]*yc;\n                    z = (1.0f-u[l]-v[l])*za + u[l]*zb + v[l]*zc;\n                    norm = sqrtf(x*x+y*y+z*z);\n                    x /= norm; y /= norm; z /= norm;\n                    s_SphTri.push_back(x); s_SphTri.push_back(y); s_SphTri.push_back(z);\nstatic const float  FLOAT_EPS     = 1.0e-7f;\n                    if( u[l]+v[l]>FLOAT_EPS )\n                        col = ColorBlend(COL_A[i], ColorBlend(COL_B[i], COL_C[i], v[l]/(u[l]+v[l])), u[l]+v[l]);\n                    else\n                        col = COL_A[i];\n                    //if( (j==0 && k==0) || (j==0 && k==2*SUBDIV) || (j==SUBDIV && k==0) )\n                    //  col = 0xffff0000;\n                    s_SphCol.push_back(col);\n                }\n            }\n    }\n    //s_SphTriProj.clear();\n    //s_SphTriProj.resize(2*s_SphCol.size(), 0);\n    //s_SphColLight.clear();\n    //s_SphColLight.resize(s_SphCol.size(), 0);\n}\n\nstatic std::vector<float> s_ArrowTri[4];\nstatic std::vector<float> s_ArrowNorm[4];\nstatic void CreateArrow()\n{\n    const int   SUBDIV  = 15;\n    const float CYL_RADIUS  = 0.08f;\n    const float CONE_RADIUS = 0.16f;\n    const float CONE_LENGTH = 0.25f;\n    const float ARROW_BGN = -1.1f;\n    const float ARROW_END = 1.15f;\n    int i;\n    for(i=0; i<4; ++i)\n    {\n        s_ArrowTri[i].clear();\n        s_ArrowNorm[i].clear();\n    }\n    \n    float x0, x1, y0, y1, z0, z1, a0, a1, nx, nn;\n    for(i=0; i<SUBDIV; ++i)\n    {\nstatic const float  FLOAT_PI      = 3.14159265358979323846f;\n        a0 = 2.0f*FLOAT_PI*(float(i))/SUBDIV;\n        a1 = 2.0f*FLOAT_PI*(float(i+1))/SUBDIV;\n        x0 = ARROW_BGN;\n        x1 = ARROW_END-CONE_LENGTH;\n        y0 = cosf(a0);\n        z0 = sinf(a0);\n        y1 = cosf(a1);\n        z1 = sinf(a1);\n        s_ArrowTri[ARROW_CYL].push_back(x1); s_ArrowTri[ARROW_CYL].push_back(CYL_RADIUS*y0); s_ArrowTri[ARROW_CYL].push_back(CYL_RADIUS*z0);\n        s_ArrowTri[ARROW_CYL].push_back(x0); s_ArrowTri[ARROW_CYL].push_back(CYL_RADIUS*y0); s_ArrowTri[ARROW_CYL].push_back(CYL_RADIUS*z0);\n        s_ArrowTri[ARROW_CYL].push_back(x0); s_ArrowTri[ARROW_CYL].push_back(CYL_RADIUS*y1); s_ArrowTri[ARROW_CYL].push_back(CYL_RADIUS*z1);\n        s_ArrowTri[ARROW_CYL].push_back(x1); s_ArrowTri[ARROW_CYL].push_back(CYL_RADIUS*y0); s_ArrowTri[ARROW_CYL].push_back(CYL_RADIUS*z0);\n        s_ArrowTri[ARROW_CYL].push_back(x0); s_ArrowTri[ARROW_CYL].push_back(CYL_RADIUS*y1); s_ArrowTri[ARROW_CYL].push_back(CYL_RADIUS*z1);\n        s_ArrowTri[ARROW_CYL].push_back(x1); s_ArrowTri[ARROW_CYL].push_back(CYL_RADIUS*y1); s_ArrowTri[ARROW_CYL].push_back(CYL_RADIUS*z1);\n        s_ArrowNorm[ARROW_CYL].push_back(0); s_ArrowNorm[ARROW_CYL].push_back(y0); s_ArrowNorm[ARROW_CYL].push_back(z0);\n        s_ArrowNorm[ARROW_CYL].push_back(0); s_ArrowNorm[ARROW_CYL].push_back(y0); s_ArrowNorm[ARROW_CYL].push_back(z0);\n        s_ArrowNorm[ARROW_CYL].push_back(0); s_ArrowNorm[ARROW_CYL].push_back(y1); s_ArrowNorm[ARROW_CYL].push_back(z1);\n        s_ArrowNorm[ARROW_CYL].push_back(0); s_ArrowNorm[ARROW_CYL].push_back(y0); s_ArrowNorm[ARROW_CYL].push_back(z0);\n        s_ArrowNorm[ARROW_CYL].push_back(0); s_ArrowNorm[ARROW_CYL].push_back(y1); s_ArrowNorm[ARROW_CYL].push_back(z1);\n        s_ArrowNorm[ARROW_CYL].push_back(0); s_ArrowNorm[ARROW_CYL].push_back(y1); s_ArrowNorm[ARROW_CYL].push_back(z1);\n        s_ArrowTri[ARROW_CYL_CAP].push_back(x0); s_ArrowTri[ARROW_CYL_CAP].push_back(0); s_ArrowTri[ARROW_CYL_CAP].push_back(0);\n        s_ArrowTri[ARROW_CYL_CAP].push_back(x0); s_ArrowTri[ARROW_CYL_CAP].push_back(CYL_RADIUS*y1); s_ArrowTri[ARROW_CYL_CAP].push_back(CYL_RADIUS*z1);\n        s_ArrowTri[ARROW_CYL_CAP].push_back(x0); s_ArrowTri[ARROW_CYL_CAP].push_back(CYL_RADIUS*y0); s_ArrowTri[ARROW_CYL_CAP].push_back(CYL_RADIUS*z0);\n        s_ArrowNorm[ARROW_CYL_CAP].push_back(-1); s_ArrowNorm[ARROW_CYL_CAP].push_back(0); s_ArrowNorm[ARROW_CYL_CAP].push_back(0);\n        s_ArrowNorm[ARROW_CYL_CAP].push_back(-1); s_ArrowNorm[ARROW_CYL_CAP].push_back(0); s_ArrowNorm[ARROW_CYL_CAP].push_back(0);\n        s_ArrowNorm[ARROW_CYL_CAP].push_back(-1); s_ArrowNorm[ARROW_CYL_CAP].push_back(0); s_ArrowNorm[ARROW_CYL_CAP].push_back(0);\n        x0 = ARROW_END-CONE_LENGTH;\n        x1 = ARROW_END;\n        nx = CONE_RADIUS/(x1-x0);\n        nn = 1.0f/sqrtf(nx*nx+1);\n        s_ArrowTri[ARROW_CONE].push_back(x1); s_ArrowTri[ARROW_CONE].push_back(0); s_ArrowTri[ARROW_CONE].push_back(0);\n        s_ArrowTri[ARROW_CONE].push_back(x0); s_ArrowTri[ARROW_CONE].push_back(CONE_RADIUS*y0); s_ArrowTri[ARROW_CONE].push_back(CONE_RADIUS*z0);\n        s_ArrowTri[ARROW_CONE].push_back(x0); s_ArrowTri[ARROW_CONE].push_back(CONE_RADIUS*y1); s_ArrowTri[ARROW_CONE].push_back(CONE_RADIUS*z1);\n        s_ArrowTri[ARROW_CONE].push_back(x1); s_ArrowTri[ARROW_CONE].push_back(0); s_ArrowTri[ARROW_CONE].push_back(0);\n        s_ArrowTri[ARROW_CONE].push_back(x0); s_ArrowTri[ARROW_CONE].push_back(CONE_RADIUS*y1); s_ArrowTri[ARROW_CONE].push_back(CONE_RADIUS*z1);\n        s_ArrowTri[ARROW_CONE].push_back(x1); s_ArrowTri[ARROW_CONE].push_back(0); s_ArrowTri[ARROW_CONE].push_back(0);\n        s_ArrowNorm[ARROW_CONE].push_back(nn*nx); s_ArrowNorm[ARROW_CONE].push_back(nn*y0); s_ArrowNorm[ARROW_CONE].push_back(nn*z0);\n        s_ArrowNorm[ARROW_CONE].push_back(nn*nx); s_ArrowNorm[ARROW_CONE].push_back(nn*y0); s_ArrowNorm[ARROW_CONE].push_back(nn*z0);\n        s_ArrowNorm[ARROW_CONE].push_back(nn*nx); s_ArrowNorm[ARROW_CONE].push_back(nn*y1); s_ArrowNorm[ARROW_CONE].push_back(nn*z1);\n        s_ArrowNorm[ARROW_CONE].push_back(nn*nx); s_ArrowNorm[ARROW_CONE].push_back(nn*y0); s_ArrowNorm[ARROW_CONE].push_back(nn*z0);\n        s_ArrowNorm[ARROW_CONE].push_back(nn*nx); s_ArrowNorm[ARROW_CONE].push_back(nn*y1); s_ArrowNorm[ARROW_CONE].push_back(nn*z1);\n        s_ArrowNorm[ARROW_CONE].push_back(nn*nx); s_ArrowNorm[ARROW_CONE].push_back(nn*y1); s_ArrowNorm[ARROW_CONE].push_back(nn*z1);\n        s_ArrowTri[ARROW_CONE_CAP].push_back(x0); s_ArrowTri[ARROW_CONE_CAP].push_back(0); s_ArrowTri[ARROW_CONE_CAP].push_back(0);\n        s_ArrowTri[ARROW_CONE_CAP].push_back(x0); s_ArrowTri[ARROW_CONE_CAP].push_back(CONE_RADIUS*y1); s_ArrowTri[ARROW_CONE_CAP].push_back(CONE_RADIUS*z1);\n        s_ArrowTri[ARROW_CONE_CAP].push_back(x0); s_ArrowTri[ARROW_CONE_CAP].push_back(CONE_RADIUS*y0); s_ArrowTri[ARROW_CONE_CAP].push_back(CONE_RADIUS*z0);\n        s_ArrowNorm[ARROW_CONE_CAP].push_back(-1); s_ArrowNorm[ARROW_CONE_CAP].push_back(0); s_ArrowNorm[ARROW_CONE_CAP].push_back(0);\n        s_ArrowNorm[ARROW_CONE_CAP].push_back(-1); s_ArrowNorm[ARROW_CONE_CAP].push_back(0); s_ArrowNorm[ARROW_CONE_CAP].push_back(0);\n        s_ArrowNorm[ARROW_CONE_CAP].push_back(-1); s_ArrowNorm[ARROW_CONE_CAP].push_back(0); s_ArrowNorm[ARROW_CONE_CAP].push_back(0);\n    }\n\n    //for(i=0; i<4; ++i)\n    //{\n    //    s_ArrowTriProj[i].clear();\n    //    s_ArrowTriProj[i].resize(2*(s_ArrowTri[i].size()/3), 0);\n    //    s_ArrowColLight[i].clear();\n    //    s_ArrowColLight[i].resize(s_ArrowTri[i].size()/3, 0);\n    //}\n}\n\n////////////////////////////////////////////////////////////////////////////\n// End Copied Straight from AntTweakBar\n////////////////////////////////////////////////////////////////////////////\n\nIGL_INLINE void igl::opengl2::draw_beach_ball()\n{\n  using namespace std;\n\n  CreateSphere();\n  // Keep track of opengl settings\n  int cm;\n  glGetIntegerv(GL_COLOR_MATERIAL,&cm);\n  // Draw triangles\n  glEnable(GL_COLOR_MATERIAL);\n  glColorMaterial(GL_FRONT_AND_BACK,GL_DIFFUSE);\n  float mat_ambient[4] = {0.1,0.1,0.1,1.0};\n  float mat_specular[4] = {0.0,0.0,0.0,1.0};\n  float mat_shininess = 1;\n  glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT,  mat_ambient);\n  glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);\n  glMaterialf( GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);\n\n  glPushMatrix();\n  glScalef(0.7,0.7,0.7);\n  glEnable(GL_NORMALIZE);\n  glBegin(GL_TRIANGLES);\n  for(int i = 0;i<(int)s_SphCol.size();i++)\n  {\n    glNormal3fv(&s_SphTri[i*3]);\n    glColor4ub(GLubyte(s_SphCol[i]>>16), GLubyte(s_SphCol[i]>>8), GLubyte(s_SphCol[i]), GLubyte(s_SphCol[i]>>24));\n    glVertex3fv(&s_SphTri[i*3]);\n  }\n  glEnd();\n  glPopMatrix();\n\n  CreateArrow();\n  for(int k = 0;k<3;k++)\n  {\n    glPushMatrix();\n    glColor3f(k==0,k==1,k==2);\n    glRotatef((k==2?-1.0:1.0)*90,k==0,k==2,k==1);\n    glBegin(GL_TRIANGLES);\n    for(int j = 0;j<4;j++)\n    {\n      for(int i = 0;i<(int)s_ArrowTri[j].size();i+=3)\n      {\n        glNormal3fv(&s_ArrowNorm[j][i]);\n        glVertex3fv(&s_ArrowTri[j][i]);\n      }\n    }\n    glEnd();\n    glPopMatrix();\n  }\n\n  (cm ? glEnable(GL_COLOR_MATERIAL):glDisable(GL_COLOR_MATERIAL));\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/draw_beach_ball.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL2_DRAW_BEACH_BALL_H\n#define IGL_OPENGL2_DRAW_BEACH_BALL_H\n#include \"../igl_inline.h\"\n\nnamespace igl\n{\n  namespace opengl2\n  {\n    // Draw a beach ball icon/glyph (from AntTweakBar) at the current origin\n    // according to the current orientation: ball has radius 0.75 and axis have\n    // length 1.15\n    IGL_INLINE void draw_beach_ball();\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"draw_beach_ball.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/draw_floor.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"draw_floor.h\"\n#include \"gl.h\"\n\nIGL_INLINE void igl::opengl2::draw_floor(const float * colorA, const float * colorB,\n  const int GridSizeX,\n  const int GridSizeY)\n{\n  const float SizeX = 0.5f*100./(double)GridSizeX;\n  const float SizeY = 0.5f*100./(double)GridSizeY;\n  // old settings\n  int old_lighting=0,old_color_material=0;\n  glGetIntegerv(GL_LIGHTING,&old_lighting);\n  glGetIntegerv(GL_COLOR_MATERIAL,&old_color_material);\n  glDisable(GL_LIGHTING);\n  glColorMaterial( GL_FRONT, GL_EMISSION);\n  glEnable(GL_COLOR_MATERIAL);\n  glColorMaterial( GL_FRONT, GL_AMBIENT_AND_DIFFUSE);\n  // Set material\n  const float black[] = {0.,0.,0.,1.};\n  glMaterialfv(GL_FRONT, GL_AMBIENT, black);\n  glMaterialfv(GL_FRONT, GL_DIFFUSE, black);\n  glMaterialfv(GL_FRONT, GL_SPECULAR, black);\n  glMaterialfv(GL_FRONT, GL_EMISSION, black);\n  glMaterialf(GL_FRONT, GL_SHININESS,0);\n  const bool use_lighting = false;\n  if(use_lighting)\n  {\n    glEnable(GL_LIGHTING);\n  }else\n  {\n    glDisable(GL_LIGHTING);\n  }\n\n\n  glBegin(GL_QUADS);\n  glNormal3f(0,1,0);\n  for (int x =-GridSizeX/2;x<GridSizeX/2;++x)\n  {\n    for (int y =-GridSizeY/2;y<GridSizeY/2;++y)\n    {\n      if ((x+y)&0x00000001) //modulo 2\n      {\n        glColor4fv(colorA);\n      }else\n      {\n        glColor4fv(colorB);\n      }\n      glVertex3f(    x*SizeX,0,(y+1)*SizeY);\n      glVertex3f((x+1)*SizeX,0,(y+1)*SizeY);\n      glVertex3f((x+1)*SizeX,0,    y*SizeY);\n      glVertex3f(    x*SizeX,0,    y*SizeY);\n    }\n  }\n  glEnd();\n\n  (old_lighting ? glEnable(GL_LIGHTING) : glDisable(GL_LIGHTING));\n  (old_color_material? glEnable(GL_COLOR_MATERIAL) : glDisable(GL_COLOR_MATERIAL));\n}\n\nIGL_INLINE void igl::opengl2::draw_floor()\n{\n  const float grey[] = {0.80,0.80,0.80,1.};\n  const float white[] = {0.95,0.95,0.95,1.};\n  igl::opengl2::draw_floor(grey,white);\n}\n\nIGL_INLINE void igl::opengl2::draw_floor_outline(const float * colorA, const float * colorB,\n  const int GridSizeX,\n  const int GridSizeY)\n{\n  const float SizeX = 0.5f*100./(double)GridSizeX;\n  const float SizeY = 0.5f*100./(double)GridSizeY;\n  float old_line_width =0;\n  // old settings\n  int old_lighting=0,old_color_material=0;\n  glGetIntegerv(GL_LIGHTING,&old_lighting);\n  glGetIntegerv(GL_COLOR_MATERIAL,&old_color_material);\n  glDisable(GL_LIGHTING);\n\n  // Set material\n  const float black[] = {0.,0.,0.,1.};\n  glMaterialfv(GL_FRONT, GL_AMBIENT, black);\n  glMaterialfv(GL_FRONT, GL_DIFFUSE, black);\n  glMaterialfv(GL_FRONT, GL_SPECULAR, black);\n  glMaterialfv(GL_FRONT, GL_EMISSION, black);\n  glMaterialf(GL_FRONT, GL_SHININESS,0);\n  const bool use_lighting = false;\n  if(use_lighting)\n  {\n    glEnable(GL_LIGHTING);\n  }else\n  {\n    glDisable(GL_LIGHTING);\n  }\n\n  glLineWidth(2.0f);\n  glBegin(GL_LINES);\n  for (int x =-GridSizeX/2;x<=GridSizeX/2;++x)\n  {\n    if(x!=(GridSizeX/2))\n    {\n      for(int s = -1;s<2;s+=2)\n      {\n        int y = s*(GridSizeY/2);\n        int cy = y==(GridSizeY/2) ? y-1 : y;\n        if ((x+cy)&0x00000001) //modulo 2\n        {\n          glColor4fv(colorA);\n          //glColor3f(1,0,0);\n        }else\n        {\n          glColor4fv(colorB);\n          //glColor3f(0,0,1);\n        }\n        glVertex3f((x+1)*SizeX,0,y*SizeY);\n        glVertex3f(    x*SizeX,0,y*SizeY);\n      }\n    }\n    if(x==-(GridSizeX/2) || x==(GridSizeX/2))\n    {\n      int cx = x==(GridSizeX/2) ? x-1 : x;\n      for (int y =-GridSizeY/2;y<GridSizeY/2;++y)\n      {\n        if ((cx+y)&0x00000001) //modulo 2\n        {\n          glColor4fv(colorA);\n          //glColor3f(1,0,0);\n        }else\n        {\n          glColor4fv(colorB);\n          //glColor3f(0,0,1);\n        }\n        glVertex3f(x*SizeX,0,(y+1)*SizeY);\n        glVertex3f(x*SizeX,0,    y*SizeY);\n      }\n    }\n  }\n  glEnd();\n\n  glGetFloatv(GL_LINE_WIDTH,&old_line_width);\n  glLineWidth(old_line_width);\n  (old_lighting ? glEnable(GL_LIGHTING) : glDisable(GL_LIGHTING));\n  (old_color_material? glEnable(GL_COLOR_MATERIAL) : glDisable(GL_COLOR_MATERIAL));\n}\n\nIGL_INLINE void igl::opengl2::draw_floor_outline()\n{\n  const float grey[] = {0.80,0.80,0.80,1.};\n  const float white[] = {0.95,0.95,0.95,1.};\n  igl::opengl2::draw_floor_outline(grey,white);\n}\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/draw_floor.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL2_DRAW_FLOOR_H\n#define IGL_OPENGL2_DRAW_FLOOR_H\n#include \"../igl_inline.h\"\nnamespace igl\n{\n  namespace opengl2\n  {\n\n    // Draw a checkerboard floor aligned with current (X,Z) plane using ../opengl/OpenGL_\n    // calls. side=50 centered at (0,0):\n    //   (-25,-25)-->(-25,25)-->(25,25)-->(25,-25)\n    //\n    // Use glPushMatrix(), glScaled(), glTranslated() to arrange the floor.\n    // \n    // Inputs:\n    //   colorA  float4 color\n    //   colorB  float4 color\n    //\n    // Example:\n    //   // Draw a nice floor\n    //   glPushMatrix();\n    //   glCullFace(GL_BACK);\n    //   glEnable(GL_CULL_FACE);\n    //   glEnable(GL_LIGHTING);\n    //   glTranslated(0,-1,0);\n    //   if(project(Vector3d(0,0,0))(2) - project(Vector3d(0,1,0))(2) > -FLOAT_EPS)\n    //   {\n    //     draw_floor_outline();\n    //   }\n    //   draw_floor();\n    //   glPopMatrix();\n    //   glDisable(GL_CULL_FACE);\n    //\n    IGL_INLINE void draw_floor(\n      const float * colorA, \n      const float * colorB, \n      const int GridSizeX=100, \n      const int GridSizeY=100);\n    // Wrapper with default colors\n    IGL_INLINE void draw_floor();\n    IGL_INLINE void draw_floor_outline(\n      const float * colorA, \n      const float * colorB, \n      const int GridSizeX=100, \n      const int GridSizeY=100);\n    // Wrapper with default colors\n    IGL_INLINE void draw_floor_outline();\n  }\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"draw_floor.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/draw_mesh.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"draw_mesh.h\"\n\nIGL_INLINE void igl::opengl2::draw_mesh(\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  const Eigen::MatrixXd & N)\n{\n  using namespace Eigen;\n  MatrixXd _d;\n  MatrixXi _i;\n  return draw_mesh(V,F,N,_i,_d,_d,_i,_d,0,_i,0);\n}\n\nIGL_INLINE void igl::opengl2::draw_mesh(\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  const Eigen::MatrixXd & N,\n  const Eigen::MatrixXd & C)\n{\n  using namespace Eigen;\n  MatrixXd _d;\n  MatrixXi _i;\n  return draw_mesh(V,F,N,_i,C,_d,_i,_d,0,_i,0);\n}\n\nIGL_INLINE void igl::opengl2::draw_mesh(\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  const Eigen::MatrixXd & N,\n  const Eigen::MatrixXd & C,\n  const Eigen::MatrixXd & TC)\n{\n  using namespace Eigen;\n  MatrixXd _d;\n  MatrixXi _i;\n  return draw_mesh(V,F,N,_i,C,TC,_i,_d,0,_i,0);\n}\n\nIGL_INLINE void igl::opengl2::draw_mesh(\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  const Eigen::MatrixXd & N,\n  const Eigen::MatrixXd & C,\n  const Eigen::MatrixXd & TC,\n  const Eigen::MatrixXd & W,\n  const GLuint W_index,\n  const Eigen::MatrixXi & WI,\n  const GLuint WI_index)\n{\n  using namespace Eigen;\n  return draw_mesh(V,F,N,MatrixXi(),C,TC,MatrixXi(),W,W_index,WI,WI_index);\n}\n\nIGL_INLINE void igl::opengl2::draw_mesh(\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  const Eigen::MatrixXd & N,\n  const Eigen::MatrixXi & NF,\n  const Eigen::MatrixXd & C,\n  const Eigen::MatrixXd & TC,\n  const Eigen::MatrixXi & TF,\n  const Eigen::MatrixXd & W,\n  const GLuint W_index,\n  const Eigen::MatrixXi & WI,\n  const GLuint WI_index)\n{\n  using namespace std;\n  using namespace Eigen;\n  const int rF = F.rows();\n  const int cF = F.cols();\n  const int cC = C.cols();\n  const int rC = C.rows();\n  const int cW = W.cols();\n  const int rW = W.rows();\n  const int rV = V.rows();\n  const int rTC = TC.rows();\n  const int rTF = TF.rows();\n  const int rNF = NF.rows();\n  const int rN = N.rows();\n\n  if(F.size() > 0)\n  {\n    assert(F.maxCoeff() < V.rows());\n    assert(V.cols() == 3);\n    assert(rC == rV || rC == rF || rC == rF*3 || rC==1 || C.size() == 0);\n    assert(C.cols() >= 3 || C.size() == 0);\n    assert(N.cols() == 3 || N.size() == 0);\n    assert(TC.cols() == 2 || TC.size() == 0);\n    assert(cF == 3 || cF == 4);\n    assert(TF.size() == 0 || TF.cols() == F.cols());\n    assert(NF.size() == 0 || NF.cols() == NF.cols());\n  }\n  if(W.size()>0)\n  {\n    assert(W.rows() == V.rows());\n    assert(WI.rows() == V.rows());\n    assert(W.cols() == WI.cols());\n  }\n\n  switch(F.cols())\n  {\n    default:\n    case 3:\n      glBegin(GL_TRIANGLES);\n      break;\n    case 4:\n      glBegin(GL_QUADS);\n      break;\n  }\n  // loop over faces\n  for(int i = 0; i<rF;i++)\n  {\n    // loop over corners of triangle\n    for(int j = 0;j<cF;j++)\n    {\n\n      int tc = -1;\n      if(rTF != 0)\n      {\n        tc = TF(i,j);\n      } else if(rTC == 1)\n      {\n        tc = 0;\n      }else if(rTC == rV)\n      {\n        tc = F(i,j);\n      }else if(rTC == rF*cF)\n      {\n        tc = i*cF + j;\n      }else if(rTC == rF)\n      {\n        tc = i;\n      }else\n      {\n        assert(TC.size() == 0);\n      }\n\n      // RGB(A)\n      Matrix<MatrixXd::Scalar,1,Dynamic> color;\n      if(rC == 1)\n      {\n        color = C.row(0);\n      }else if(rC == rV)\n      {\n        color = C.row(F(i,j));\n      }else if(rC == rF*cF)\n      {\n        color = C.row(i*cF+j);\n      }else if(rC == rF)\n      {\n        color = C.row(i);\n      }else\n      {\n        assert(C.size() == 0);\n      }\n\n      int n = -1;\n      if(rNF != 0)\n      {\n        n = NF(i,j); // indexed normals\n      } else if(rN == 1) \n      {\n        n = 0; // uniform normals\n      }else if(rN == rF)\n      {\n        n = i; // face normals\n      }else if(rN == rV)\n      {\n        n = F(i,j); // vertex normals\n      }else if(rN == rF*cF)\n      {\n        n = i*cF + j; // corner normals\n      }else\n      {\n        assert(N.size() == 0);\n      }\n\n      {\n        if(rW>0 && W_index !=0 && WI_index != 0)\n        {\n          int weights_left = cW;\n          while(weights_left != 0)\n          {\n            int pass_size = std::min(4,weights_left);\n            int weights_already_passed = cW-weights_left;\n            // Get attribute location of next 4 weights\n            int pass_W_index = W_index + weights_already_passed/4;\n            int pass_WI_index = WI_index + weights_already_passed/4;\n            switch(pass_size)\n            {\n              case 1:\n                glVertexAttrib1d(\n                  pass_W_index,\n                  W(F(i,j),0+weights_already_passed));\n                glVertexAttrib1d(\n                  pass_WI_index,\n                  WI(F(i,j),0+weights_already_passed));\n                break;\n              case 2:\n                glVertexAttrib2d(\n                  pass_W_index,\n                  W(F(i,j),0+weights_already_passed),\n                  W(F(i,j),1+weights_already_passed));\n                glVertexAttrib2d(\n                  pass_WI_index,\n                  WI(F(i,j),0+weights_already_passed),\n                  WI(F(i,j),1+weights_already_passed));\n                break;\n              case 3:\n                glVertexAttrib3d(\n                  pass_W_index,\n                  W(F(i,j),0+weights_already_passed),\n                  W(F(i,j),1+weights_already_passed),\n                  W(F(i,j),2+weights_already_passed));\n                glVertexAttrib3d(\n                  pass_WI_index,\n                  WI(F(i,j),0+weights_already_passed),\n                  WI(F(i,j),1+weights_already_passed),\n                  WI(F(i,j),2+weights_already_passed));\n                break;\n              default:\n                glVertexAttrib4d(\n                  pass_W_index,\n                  W(F(i,j),0+weights_already_passed),\n                  W(F(i,j),1+weights_already_passed),\n                  W(F(i,j),2+weights_already_passed),\n                  W(F(i,j),3+weights_already_passed));\n                glVertexAttrib4d(\n                  pass_WI_index,\n                  WI(F(i,j),0+weights_already_passed),\n                  WI(F(i,j),1+weights_already_passed),\n                  WI(F(i,j),2+weights_already_passed),\n                  WI(F(i,j),3+weights_already_passed));\n                break;\n            }\n            weights_left -= pass_size;\n          }\n        }\n        if(tc != -1)\n        {\n          glTexCoord2d(TC(tc,0),TC(tc,1));\n        }\n        if(rC>0)\n        {\n          switch(cC)\n          {\n            case 3:\n              glColor3dv(color.data());\n              break;\n            case 4:\n              glColor4dv(color.data());\n              break;\n            default:\n              break;\n          }\n        }\n        if(n != -1)\n        {\n          glNormal3d(N(n,0),N(n,1),N(n,2));\n        }\n        glVertex3d(V(F(i,j),0),V(F(i,j),1),V(F(i,j),2));\n      }\n    }\n  }\n  glEnd();\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/draw_mesh.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL2_DRAW_MESH_H\n#define IGL_OPENGL2_DRAW_MESH_H\n#include \"../igl_inline.h\"\n#include \"gl.h\"\n#include <Eigen/Dense>\n\n\nnamespace igl\n{\n  namespace opengl2\n  {\n\n    // Draw ../opengl/OpenGL_ commands needed to display a mesh with normals\n    //\n    // Inputs:\n    //   V  #V by 3 eigen Matrix of mesh vertex 3D positions\n    //   F  #F by 3|4 eigen Matrix of face (triangle/quad) indices\n    //   N  #V|#F by 3 eigen Matrix of 3D normals\n    IGL_INLINE void draw_mesh(\n      const Eigen::MatrixXd & V,\n      const Eigen::MatrixXi & F,\n      const Eigen::MatrixXd & N);\n    \n    // Draw ../opengl/OpenGL_ commands needed to display a mesh with normals and per-vertex\n    // colors\n    //\n    // Inputs:\n    //   V  #V by 3 eigen Matrix of mesh vertex 3D positions\n    //   F  #F by 3|4 eigen Matrix of face (triangle/quad) indices\n    //   N  #V|#F by 3 eigen Matrix of 3D normals\n    //   C  #V|#F|1 by 3 eigen Matrix of RGB colors\n    IGL_INLINE void draw_mesh(\n      const Eigen::MatrixXd & V,\n      const Eigen::MatrixXi & F,\n      const Eigen::MatrixXd & N,\n      const Eigen::MatrixXd & C);\n    // Inputs:\n    //   V  #V by 3 eigen Matrix of mesh vertex 3D positions\n    //   F  #F by 3|4 eigen Matrix of face (triangle/quad) indices\n    //   N  #V|#F by 3 eigen Matrix of 3D normals\n    //   C  #V|#F|1 by 3 eigen Matrix of RGB colors\n    //   TC  #V|#F|1 by 3 eigen Matrix of Texture Coordinates\n    IGL_INLINE void draw_mesh(\n      const Eigen::MatrixXd & V,\n      const Eigen::MatrixXi & F,\n      const Eigen::MatrixXd & N,\n      const Eigen::MatrixXd & C,\n      const Eigen::MatrixXd & TC);\n    \n    // Draw ../opengl/OpenGL_ commands needed to display a mesh with normals, per-vertex\n    // colors and LBS weights\n    //\n    // Inputs:\n    //   V  #V by 3 eigen Matrix of mesh vertex 3D positions\n    //   F  #F by 3|4 eigen Matrix of face (triangle/quad) indices\n    //   N  #V by 3 eigen Matrix of mesh vertex 3D normals\n    //   C  #V by 3 eigen Matrix of mesh vertex RGB colors\n    //   TC  #V by 3 eigen Matrix of mesh vertex UC coorindates between 0 and 1\n    //   W  #V by #H eigen Matrix of per mesh vertex, per handle weights\n    //   W_index  Specifies the index of the \"weight\" vertex attribute: see\n    //     glBindAttribLocation, if W_index is 0 then weights are ignored\n    //   WI  #V by #H eigen Matrix of per mesh vertex, per handle weight ids\n    //   WI_index  Specifies the index of the \"weight\" vertex attribute: see\n    //     glBindAttribLocation, if WI_index is 0 then weight indices are ignored\n    IGL_INLINE void draw_mesh(\n      const Eigen::MatrixXd & V,\n      const Eigen::MatrixXi & F,\n      const Eigen::MatrixXd & N,\n      const Eigen::MatrixXd & C,\n      const Eigen::MatrixXd & TC,\n      const Eigen::MatrixXd & W,\n      const GLuint W_index,\n      const Eigen::MatrixXi & WI,\n      const GLuint WI_index);\n    \n    // Draw ../opengl/OpenGL_ commands needed to display a mesh with normals, per-vertex\n    // colors and LBS weights\n    //\n    // Inputs:\n    //   V  #V by 3 eigen Matrix of mesh vertex 3D positions\n    //   F  #F by 3|4 eigen Matrix of face (triangle/quad) indices\n    //   N  #V by 3 eigen Matrix of mesh vertex 3D normals\n    //   NF  #F by 3 eigen Matrix of face (triangle/quad) normal indices, <0\n    //     means no normal\n    //   C  #V by 3 eigen Matrix of mesh vertex RGB colors\n    //   TC  #V by 3 eigen Matrix of mesh vertex UC coorindates between 0 and 1\n    //   TF  #F by 3 eigen Matrix of face (triangle/quad) texture indices, <0\n    //     means no texture\n    //   W  #V by #H eigen Matrix of per mesh vertex, per handle weights\n    //   W_index  Specifies the index of the \"weight\" vertex attribute: see\n    //     glBindAttribLocation, if W_index is 0 then weights are ignored\n    //   WI  #V by #H eigen Matrix of per mesh vertex, per handle weight ids\n    //   WI_index  Specifies the index of the \"weight\" vertex attribute: see\n    //     glBindAttribLocation, if WI_index is 0 then weight indices are ignored\n    IGL_INLINE void draw_mesh(\n      const Eigen::MatrixXd & V,\n      const Eigen::MatrixXi & F,\n      const Eigen::MatrixXd & N,\n      const Eigen::MatrixXi & NF,\n      const Eigen::MatrixXd & C,\n      const Eigen::MatrixXd & TC,\n      const Eigen::MatrixXi & TF,\n      const Eigen::MatrixXd & W,\n      const GLuint W_index,\n      const Eigen::MatrixXi & WI,\n      const GLuint WI_index);\n\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"draw_mesh.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/draw_point.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"draw_point.h\"\n\n// Implementation\n#include \"gl.h\"\n\n#include <cassert>\n#include <cmath>\n\nIGL_INLINE void igl::opengl2::draw_point(\n  const double x,\n  const double y,\n  const double z,\n  const double requested_r,\n  const bool selected)\n{\n  // Push GL settings\n  glPushAttrib(GL_ENABLE_BIT | GL_LIGHTING_BIT);\n\n  float f;\n  glGetFloatv(GL_POINT_SIZE_MAX,&f);\n  // THIS IS OVERZEALOUS on Mac OS X: OpenGL reports a smaller point size than\n  // possible.\n  //assert(requested_r<=0.5*f);\n  double r = (requested_r<0.5*f?requested_r:0.5*f);\n\n  //glDisable(GL_DEPTH_TEST);\n  glDisable(GL_LIGHTING);\n\n  // get current color\n  float color[4];\n  glGetFloatv(GL_CURRENT_COLOR,color);\n\n  double outline_size = (r>7 ? sqrt(r/7.0) : 1.0);\n\n  // White outline\n  glColor4f(1,1,1,color[3]);\n  glPointSize(2*r);\n  glBegin(GL_POINTS);\n  glVertex3d(x,y,z);\n  glEnd();\n  // Black outline\n  glColor4f(0,0,0,color[3]);\n  glPointSize(2*r-2*outline_size);\n  glBegin(GL_POINTS);\n  glVertex3d(x,y,z);\n  glEnd();\n  \n  // Foreground\n  glColor4fv(color);\n  glPointSize(2*r-4*outline_size);\n  glBegin(GL_POINTS);\n  glVertex3d(x,y,z);\n  glEnd();\n  // Selection inner circle\n  if(selected)\n  {\n    glColor4f(0,0,0,color[3]);\n    double selected_size = 2*r-7*outline_size;\n    selected_size = (selected_size>3?selected_size:3);\n    glPointSize(selected_size);\n    glBegin(GL_POINTS);\n    glVertex3d(x,y,z);\n    glEnd();\n  }\n\n  // reset color\n  glColor4fv(color);\n\n  // Pop GL settings\n  glPopAttrib();\n}\n\ntemplate <typename DerivedP>\nIGL_INLINE void igl::opengl2::draw_point(\n  const Eigen::PlainObjectBase<DerivedP> & P,\n  const double requested_r,\n  const bool selected)\n{\n  switch(P.size())\n  {\n    case 2:\n      return draw_point(P(0),P(1),0,requested_r,selected);\n    default:\n      return draw_point(P(0),P(1),P(2),requested_r,selected);\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::opengl2::draw_point<Eigen::Matrix<double, 3, 1, 0, 3, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 1, 0, 3, 1> > const&, double, bool);\ntemplate void igl::opengl2::draw_point<Eigen::Matrix<double, 2, 1, 0, 2, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 1, 0, 2, 1> > const&, double, bool); \n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/draw_point.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL2_DRAW_POINT_H\n#define IGL_OPENGL2_DRAW_POINT_H\n#include \"../igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  namespace opengl2\n  {\n\n    //double POINT_COLOR[3] = {239./255.,213./255.,46./255.};\n    // Draw a nice looking, colored dot at a given point in 3d.\n    //\n    // Note: expects that GL_CURRENT_COLOR is set with the desired foreground color\n    // \n    // Inputs:\n    //   x  x-coordinate of point, modelview coordinates\n    //   y  y-coordinate of point, modelview coordinates\n    //   z  z-coordinate of point, modelview coordinates\n    //   requested_r  outer-most radius of dot {7}, measured in screen space pixels\n    //   selected  fills inner circle with black {false}\n    // Asserts that requested_r does not exceed 0.5*GL_POINT_SIZE_MAX\n    IGL_INLINE void draw_point(\n      const double x,\n      const double y,\n      const double z,\n      const double requested_r = 7,\n      const bool selected = false);\n    template <typename DerivedP>\n    IGL_INLINE void draw_point(\n      const Eigen::PlainObjectBase<DerivedP> & P,\n      const double requested_r = 7,\n      const bool selected = false);\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"draw_point.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/draw_rectangular_marquee.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n\n#include \"draw_rectangular_marquee.h\"\n#include \"gl.h\"\n#include \"glu.h\"\n#include \"../material_colors.h\"\n\nIGL_INLINE void igl::opengl2::draw_rectangular_marquee(\n  const int from_x,\n  const int from_y,\n  const int to_x,\n  const int to_y)\n{\n  using namespace std;\n  int l;\n  glGetIntegerv(GL_LIGHTING,&l);\n  int s;\n  glGetIntegerv(GL_LINE_STIPPLE,&s);\n  double lw;\n  glGetDoublev(GL_LINE_WIDTH,&lw);\n  glDisable(GL_LIGHTING);\n  // Screen space for this viewport\n  GLint viewport[4];\n  glGetIntegerv(GL_VIEWPORT,viewport);\n  const int width = viewport[2];\n  const int height = viewport[3];\n  glMatrixMode(GL_PROJECTION);\n  glPushMatrix();\n  glLoadIdentity();\n  gluOrtho2D(0,width,0,height);\n  glMatrixMode(GL_MODELVIEW);\n  glPushMatrix();\n  glLoadIdentity();\n\n  glEnable(GL_LINE_STIPPLE);\n  glLineStipple(3,0xAAAA);\n  glLineWidth(1);\n  glColor4f(0.2,0.2,0.2,1);\n  glBegin(GL_LINE_STRIP);\n  glVertex2d(from_x,from_y);\n  glVertex2d(to_x,from_y);\n  glVertex2d(to_x,to_y);\n  glVertex2d(from_x,to_y);\n  glVertex2d(from_x,from_y);\n  glEnd();\n\n  glPopMatrix();\n  glMatrixMode(GL_PROJECTION);\n  glPopMatrix();\n  glMatrixMode(GL_MODELVIEW);\n  glLineWidth(lw);\n  (s ? glEnable(GL_LINE_STIPPLE):glDisable(GL_LINE_STIPPLE));\n  (l ? glEnable(GL_LIGHTING):glDisable(GL_LIGHTING));\n}\n\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/draw_rectangular_marquee.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL2_DRAW_RECTANGULAR_MARQUEE_H\n#define IGL_OPENGL2_DRAW_RECTANGULAR_MARQUEE_H\n#include \"../igl_inline.h\"\nnamespace igl\n{\n  namespace opengl2\n  {\n    // Draw a rectangular marquee (selection box) in screen space. This sets up\n    // screen space using current viewport.\n    //\n    // Inputs:\n    //   from_x  x coordinate of from point\n    //   from_y  y coordinate of from point\n    //   to_x  x coordinate of to point\n    //   to_y  y coordinate of to point\n    IGL_INLINE void draw_rectangular_marquee(\n      const int from_x,\n      const int from_y,\n      const int to_x,\n      const int to_y);\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"draw_rectangular_marquee.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/draw_skeleton_3d.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"draw_skeleton_3d.h\"\n#include \"../PI.h\"\n#include \"../material_colors.h\"\n#include \"gl.h\"\n#include <Eigen/Geometry>\n#include <iostream>\n\n\ntemplate <\n  typename DerivedC,\n  typename DerivedBE,\n  typename DerivedT,\n  typename Derivedcolor>\nIGL_INLINE void igl::opengl2::draw_skeleton_3d(\n  const Eigen::PlainObjectBase<DerivedC> & C,\n  const Eigen::PlainObjectBase<DerivedBE> & BE,\n  const Eigen::PlainObjectBase<DerivedT> & T,\n  const Eigen::PlainObjectBase<Derivedcolor> & color,\n  const double half_bbd)\n{\n  // Note: Maya's skeleton *does* scale with the mesh suggesting a scale\n  // parameter. Further, its joint balls are not rotated with the bones.\n  using namespace Eigen;\n  using namespace std;\n  if(color.size() == 0)\n  {\n    return draw_skeleton_3d(C,BE,T,MAYA_SEA_GREEN,half_bbd);\n  }\n  assert(color.cols() == 4 || color.size() == 4);\n  if(T.size() == 0)\n  {\n    typedef Eigen::Matrix<typename DerivedT::Scalar,Dynamic,Dynamic> Mat;\n    Mat I = Mat::Identity(C.cols()+1,C.cols());\n    Mat T = I.replicate(BE.rows(),1);\n    // insane base case\n    if(T.size() == 0)\n    {\n      return;\n    }\n    return draw_skeleton_3d(C,BE,T,color,half_bbd);\n  }\n  assert(T.rows() == BE.rows()*(C.cols()+1));\n  assert(T.cols() == C.cols());\n  // push old settings\n  glPushAttrib(GL_LIGHTING_BIT);\n  glPushAttrib(GL_LINE_BIT);\n  glDisable(GL_LIGHTING);\n  glLineWidth(1.0);\n\n  auto draw_sphere = [](const double r)\n  {\n    auto draw_circle = []()\n    {\n      glBegin(GL_LINE_STRIP);\n      for(double th = 0;th<2.0*igl::PI;th+=(2.0*igl::PI/30.0))\n      {\n        glVertex3d(cos(th),sin(th),0.0);\n      }\n      glVertex3d(cos(0),sin(0),0.0);\n      glEnd();\n    };\n    glPushMatrix();\n    glScaled(r,r,r);\n    draw_circle();\n    glRotated(90.0,1.0,0.0,0.0);\n    draw_circle();\n    glRotated(90.0,0.0,1.0,0.0);\n    draw_circle();\n    glPopMatrix();\n  };\n  auto draw_pyramid = []()\n  {\n    glBegin(GL_LINE_STRIP);\n    glVertex3d(0, 1,-1);\n    glVertex3d(0,-1,-1);\n    glVertex3d(0,-1, 1);\n    glVertex3d(0, 1, 1);\n    glVertex3d(0, 1,-1);\n    glEnd();\n    glBegin(GL_LINES);\n    glVertex3d(0, 1,-1);\n    glVertex3d(1,0,0);\n    glVertex3d(0,-1,-1);\n    glVertex3d(1,0,0);\n    glVertex3d(0,-1, 1);\n    glVertex3d(1,0,0);\n    glVertex3d(0, 1, 1);\n    glVertex3d(1,0,0);\n    glEnd();\n  };\n\n  // Loop over bones\n  for(int e = 0;e < BE.rows();e++)\n  {\n    // Draw a sphere\n    auto s = C.row(BE(e,0));\n    auto d = C.row(BE(e,1));\n    auto b = (d-s).transpose().eval();\n    double r = 0.02*half_bbd;\n    Matrix4d Te = Matrix4d::Identity();\n    Te.block(0,0,3,4) = T.block(e*4,0,4,3).transpose();\n    Quaterniond q;\n    q.setFromTwoVectors(Vector3d(1,0,0),b);\n    glPushMatrix();\n    glMultMatrixd(Te.data());\n    glTranslated(s(0),s(1),s(2));\n    if(color.size() == 4)\n    {\n      glColor4d( color(0), color(1), color(2), color(3));\n    }else\n    {\n      glColor4d( color(e,0), color(e,1), color(e,2), color(e,3));\n    }\n    draw_sphere(r);\n    const double len = b.norm()-2.*r;\n    if(len>=0)\n    {\n      auto u = b.normalized()*r;\n      glPushMatrix();\n      glTranslated(u(0),u(1),u(2));\n      glMultMatrixd(Affine3d(q).matrix().data());\n      glScaled(b.norm()-2.*r,r,r);\n      draw_pyramid();\n      glPopMatrix();\n    }\n    glTranslated(b(0),b(1),b(2));\n    draw_sphere(r);\n    glPopMatrix();\n  }\n  // Reset settings\n  glPopAttrib();\n  glPopAttrib();\n}\n\ntemplate <typename DerivedC, typename DerivedBE, typename DerivedT>\nIGL_INLINE void igl::opengl2::draw_skeleton_3d(\n  const Eigen::PlainObjectBase<DerivedC> & C,\n  const Eigen::PlainObjectBase<DerivedBE> & BE,\n  const Eigen::PlainObjectBase<DerivedT> & T)\n{\n  return draw_skeleton_3d(C,BE,T,MAYA_SEA_GREEN);\n}\n\ntemplate <typename DerivedC, typename DerivedBE>\nIGL_INLINE void igl::opengl2::draw_skeleton_3d(\n  const Eigen::PlainObjectBase<DerivedC> & C,\n  const Eigen::PlainObjectBase<DerivedBE> & BE)\n{\n  return draw_skeleton_3d(C,BE,Eigen::MatrixXd(),MAYA_SEA_GREEN);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::opengl2::draw_skeleton_3d<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&);\ntemplate void igl::opengl2::draw_skeleton_3d<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&);\ntemplate void igl::opengl2::draw_skeleton_3d<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<float, 4, 1, 0, 4, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, 4, 1, 0, 4, 1> > const&, double);\ntemplate void igl::opengl2::draw_skeleton_3d<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<float, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, -1, 0, -1, -1> > const&, double);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/draw_skeleton_3d.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL2_DRAW_SKELETON_3D_H\n#define IGL_OPENGL2_DRAW_SKELETON_3D_H\n#include \"../igl_inline.h\"\n#include \"../material_colors.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  namespace opengl2\n  {\n\n    // Draw a skeleton\n    //\n    // Inputs:\n    //   C  #C by dim List of joint rest positions\n    //   BE  #BE by 2 list of bone edge indices into C\n    //   T  #BE*(dim+1) by dim  matrix of stacked transposed bone transformations\n    //   color  #BE|1 by 4 list of color\n    //   half_bbd  half bounding box diagonal to determine scaling {1.0}\n    template <\n      typename DerivedC,\n      typename DerivedBE,\n      typename DerivedT,\n      typename Derivedcolor>\n    IGL_INLINE void draw_skeleton_3d(\n      const Eigen::PlainObjectBase<DerivedC> & C,\n      const Eigen::PlainObjectBase<DerivedBE> & BE,\n      const Eigen::PlainObjectBase<DerivedT> & T,\n      const Eigen::PlainObjectBase<Derivedcolor> & color,\n      const double half_bbd=0.5);\n    // Default color\n    template <typename DerivedC, typename DerivedBE, typename DerivedT>\n    IGL_INLINE void draw_skeleton_3d(\n      const Eigen::PlainObjectBase<DerivedC> & C,\n      const Eigen::PlainObjectBase<DerivedBE> & BE,\n      const Eigen::PlainObjectBase<DerivedT> & T);\n    template <typename DerivedC, typename DerivedBE>\n    IGL_INLINE void draw_skeleton_3d(\n      const Eigen::PlainObjectBase<DerivedC> & C,\n      const Eigen::PlainObjectBase<DerivedBE> & BE);\n  }\n}\n  \n#ifndef IGL_STATIC_LIBRARY\n#  include \"draw_skeleton_3d.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/draw_skeleton_vector_graphics.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"draw_skeleton_vector_graphics.h\"\n#include \"draw_point.h\"\n#include \"gl.h\"\n#include \"../material_colors.h\"\n\nIGL_INLINE void igl::opengl2::draw_skeleton_vector_graphics(\n  const Eigen::MatrixXd & C,\n  const Eigen::MatrixXi & BE)\n{\n  return draw_skeleton_vector_graphics(C,BE,BBW_POINT_COLOR,BBW_LINE_COLOR);\n}\n\nIGL_INLINE void igl::opengl2::draw_skeleton_vector_graphics(\n  const Eigen::MatrixXd & C,\n  const Eigen::MatrixXi & BE,\n  const float * point_color,\n  const float * line_color)\n{\n  using namespace Eigen;\n\n  int old_lighting=0;\n  double old_line_width=1;\n  glGetIntegerv(GL_LIGHTING,&old_lighting);\n  glGetDoublev(GL_LINE_WIDTH,&old_line_width);\n  int cm;\n  glGetIntegerv(GL_COLOR_MATERIAL,&cm);\n  glDisable(GL_LIGHTING);\n  glDisable(GL_LINE_STIPPLE);\n  //glEnable(GL_POLYGON_OFFSET_FILL);\n  glEnable(GL_COLOR_MATERIAL);\n  glLineWidth(10.0);\n  glColorMaterial(GL_FRONT_AND_BACK,GL_DIFFUSE);\n  float mat_ambient[4] = {0.1,0.1,0.1,1.0};\n  float mat_specular[4] = {0.0,0.0,0.0,1.0};\n  float mat_shininess = 1;\n  glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT,  mat_ambient);\n  glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT,  mat_ambient);\n  glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);\n  glMaterialf( GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);\n\n  for(int i = 0;i<3;i++)\n  {\n    switch(i)\n    {\n      case 0: glColor3fv(WHITE);      glLineWidth(10); break;\n      case 1: glColor3fv(BLACK);      glLineWidth( 6); break;\n      case 2: glColor3fv(line_color); glLineWidth( 4); break;\n    }\n    // Loop over bone edges\n    glBegin(GL_LINES);\n    for(int e = 0;e<BE.rows();e++)\n    {\n      RowVector3d tip = C.row(BE(e,0));\n      RowVector3d tail = C.row(BE(e,1));\n      glVertex3dv(tip.data());\n      glVertex3dv(tail.data());\n    }\n    glEnd();\n  }\n\n  glColor3fv(point_color);\n  for(int i = 0;i<C.rows();i++)\n  {\n    RowVector3d p = C.row(i);\n    draw_point(p(0),p(1),p(2));\n  }\n\n  (cm ? glEnable(GL_COLOR_MATERIAL):glDisable(GL_COLOR_MATERIAL));\n  //glDisable(GL_POLYGON_OFFSET_FILL);\n  glEnable(GL_LIGHTING);\n  (old_lighting ? glEnable(GL_LIGHTING) : glDisable(GL_LIGHTING));\n  glLineWidth(old_line_width);\n}\n\ntemplate <typename DerivedC, typename DerivedBE, typename DerivedT>\nIGL_INLINE void igl::opengl2::draw_skeleton_vector_graphics(\n  const Eigen::PlainObjectBase<DerivedC> & C,\n  const Eigen::PlainObjectBase<DerivedBE> & BE,\n  const Eigen::PlainObjectBase<DerivedT> & T)\n{\n  return draw_skeleton_vector_graphics(C,BE,T,BBW_POINT_COLOR,BBW_LINE_COLOR);\n}\n\ntemplate <typename DerivedC, typename DerivedBE, typename DerivedT>\nIGL_INLINE void igl::opengl2::draw_skeleton_vector_graphics(\n  const Eigen::PlainObjectBase<DerivedC> & C,\n  const Eigen::PlainObjectBase<DerivedBE> & BE,\n  const Eigen::PlainObjectBase<DerivedT> & T,\n  const float * point_color,\n  const float * line_color)\n{\n  DerivedC CT;\n  DerivedBE BET;\n  const int dim = T.cols();\n  assert(dim == C.cols());\n  CT.resize(2*BE.rows(),C.cols());\n  BET.resize(BE.rows(),2);\n  for(int e = 0;e<BE.rows();e++)\n  {\n    BET(e,0) = 2*e;\n    BET(e,1) = 2*e+1;\n    const auto & c0 = C.row(BE(e,0));\n    const auto & c1 = C.row(BE(e,1));\n    const auto & L = T.block(e*(dim+1),0,dim,dim);\n    const auto & t = T.block(e*(dim+1)+dim,0,1,dim);\n    CT.row(2*e) =   c0 * L + t;\n    CT.row(2*e+1) = c1 * L + t;\n  }\n  draw_skeleton_vector_graphics(CT,BET,point_color,line_color);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::opengl2::draw_skeleton_vector_graphics<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/draw_skeleton_vector_graphics.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL2_DRAW_SKELETON_VECTOR_GRAPHICS_H\n#define IGL_OPENGL2_DRAW_SKELETON_VECTOR_GRAPHICS_H\n#include \"../igl_inline.h\"\n#include <Eigen/Core>\n\nnamespace igl\n{\n  namespace opengl2\n  {\n    // Draw a skeleton with a 2D vector graphcis style à la BBW, STBS, Monotonic,\n    // FAST papers.\n    //\n    // Inputs:\n    //   C  #C by dim list of joint positions\n    //   BE #BE by 2 list of bone edge indices into C\n    //  point_color  color of points\n    //  line_color  color of lines\n    IGL_INLINE void draw_skeleton_vector_graphics(\n      const Eigen::MatrixXd & C,\n      const Eigen::MatrixXi & BE,\n      const float * point_color,\n      const float * line_color);\n    // Use default colors (originally from BBW paper)\n    IGL_INLINE void draw_skeleton_vector_graphics(\n      const Eigen::MatrixXd & C,\n      const Eigen::MatrixXi & BE);\n    //   T  #BE*(dim+1) by dim  matrix of stacked transposed bone transformations\n    template <typename DerivedC, typename DerivedBE, typename DerivedT>\n    IGL_INLINE void draw_skeleton_vector_graphics(\n      const Eigen::PlainObjectBase<DerivedC> & C,\n      const Eigen::PlainObjectBase<DerivedBE> & BE,\n      const Eigen::PlainObjectBase<DerivedT> & T,\n      const float * point_color,\n      const float * line_color);\n    template <typename DerivedC, typename DerivedBE, typename DerivedT>\n    IGL_INLINE void draw_skeleton_vector_graphics(\n      const Eigen::PlainObjectBase<DerivedC> & C,\n      const Eigen::PlainObjectBase<DerivedBE> & BE,\n      const Eigen::PlainObjectBase<DerivedT> & T);\n  }\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"draw_skeleton_vector_graphics.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/flare_textures.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL2_FLARE_TEXTURES_H\n#define IGL_OPENGL2_FLARE_TEXTURES_H\n#include <cstdint>\nnamespace igl\n{\n    namespace opengl2\n    {\n\n      const uint8_t FLARE_TEXTURE_0[16384] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,12,12,12,12,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,12,12,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,12,15,15,15,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,15,15,12,12,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,15,15,20,20,20,20,20,20,20,20,23,23,23,23,23,23,23,23,23,23,23,23,23,23,20,20,20,20,20,20,20,20,15,15,12,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,15,20,20,20,20,20,20,23,23,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,23,23,23,20,20,20,20,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,20,20,20,23,23,28,28,28,28,28,28,28,31,31,31,31,31,31,31,31,31,31,31,31,31,31,28,28,28,28,28,28,28,28,23,23,20,20,20,20,15,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,20,20,23,28,28,28,28,28,28,31,31,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,31,31,31,28,28,28,28,28,23,23,20,20,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,15,20,20,20,23,23,28,28,28,28,31,31,36,36,36,36,36,36,36,36,39,39,39,39,39,39,39,39,39,39,39,39,39,36,36,36,36,36,36,36,36,31,28,28,28,28,28,23,20,20,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,20,23,28,28,28,28,31,31,36,36,36,36,36,39,39,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,39,39,36,36,36,36,36,36,31,28,28,28,28,23,20,20,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,20,23,28,28,28,28,31,36,36,36,36,39,39,44,44,44,44,44,44,44,44,47,47,47,47,47,47,47,47,47,47,47,47,47,44,44,44,44,44,44,44,39,39,36,36,36,36,31,31,28,28,28,23,23,20,20,20,15,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,15,20,20,20,23,28,28,28,31,31,36,36,36,36,39,44,44,44,44,44,47,47,47,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,47,47,44,44,44,44,44,39,39,36,36,36,36,31,28,28,28,23,20,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,23,28,28,28,28,31,36,36,36,39,44,44,44,44,44,47,47,52,52,52,52,52,52,52,55,55,55,55,55,55,55,55,55,55,55,55,55,52,52,52,52,52,52,52,47,47,44,44,44,44,39,36,36,36,36,31,28,28,28,23,20,20,20,15,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,15,20,20,20,23,28,28,28,31,36,36,36,39,44,44,44,44,47,52,52,52,52,52,52,55,55,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,55,55,52,52,52,52,52,47,47,44,44,44,39,39,36,36,36,31,28,28,28,23,20,20,15,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,15,20,20,23,28,28,28,31,36,36,36,39,44,44,44,44,47,52,52,52,52,55,55,60,60,60,60,60,60,60,63,63,63,63,63,63,63,63,63,63,63,63,60,60,60,60,60,60,60,60,55,52,52,52,52,52,47,44,44,44,39,36,36,36,31,28,28,28,23,20,20,20,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,15,20,20,23,28,28,28,36,36,36,39,44,44,44,47,47,52,52,52,55,55,60,60,60,60,60,63,63,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,63,63,63,60,60,60,60,60,55,52,52,52,52,47,44,44,44,39,36,36,36,31,28,28,28,20,20,20,15,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,20,20,20,23,28,28,31,36,36,36,39,44,44,44,47,52,52,52,55,60,60,60,60,63,63,68,68,68,68,68,68,68,71,71,71,71,71,71,71,71,71,71,71,71,68,68,68,68,68,68,68,63,63,60,60,60,60,55,52,52,52,52,47,44,44,44,39,36,36,36,28,28,28,23,20,20,15,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,20,20,28,28,28,31,36,36,39,44,44,44,47,52,52,52,55,60,60,60,60,63,68,68,68,68,68,71,71,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,71,71,68,68,68,68,68,63,63,60,60,60,55,55,52,52,52,47,44,44,39,36,36,36,31,28,28,23,20,20,15,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,20,23,28,28,31,36,36,36,39,44,44,47,52,52,52,55,60,60,60,63,63,68,68,68,68,71,76,76,76,76,76,76,76,79,79,79,79,79,79,79,79,79,79,79,79,76,76,76,76,76,76,76,71,71,68,68,68,68,63,60,60,60,55,52,52,52,47,44,44,44,39,36,36,31,28,28,23,20,20,15,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,20,23,28,28,31,36,36,39,44,44,44,47,52,52,55,60,60,60,63,63,68,68,68,71,71,76,76,76,76,79,79,79,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,79,79,76,76,76,76,76,71,68,68,68,68,63,60,60,60,55,52,52,52,47,44,44,39,36,36,31,28,28,23,20,20,15,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,20,23,28,28,31,36,36,39,44,44,47,52,52,52,55,60,60,60,63,68,68,68,71,76,76,76,76,79,79,84,84,84,84,84,84,84,87,87,87,87,87,87,87,87,87,87,87,84,84,84,84,84,84,84,79,76,76,76,76,71,71,68,68,68,63,60,60,60,55,52,52,47,44,44,44,36,36,36,28,28,28,20,20,15,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,20,23,28,28,31,36,36,39,44,44,47,52,52,55,60,60,60,63,68,68,68,71,76,76,76,76,79,84,84,84,84,84,87,87,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,87,87,84,84,84,84,84,79,76,76,76,71,71,68,68,68,60,60,60,55,52,52,52,44,44,44,36,36,36,28,28,28,20,20,15,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,20,20,23,28,28,31,36,36,39,44,44,47,52,52,55,60,60,63,68,68,68,71,76,76,76,79,79,84,84,84,84,87,92,92,92,92,92,92,92,95,95,95,95,95,95,95,95,95,95,95,92,92,92,92,92,92,87,87,84,84,84,84,79,76,76,76,71,68,68,68,63,60,60,60,52,52,52,47,44,44,39,36,36,28,28,28,20,20,15,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,20,20,23,28,28,31,36,36,39,44,44,47,52,52,55,60,60,63,68,68,68,71,76,76,79,79,84,84,84,87,92,92,92,92,92,95,95,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,95,95,92,92,92,92,92,87,84,84,84,84,79,76,76,76,71,68,68,68,60,60,60,55,52,52,47,44,44,39,36,36,28,28,23,20,20,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,15,20,20,28,28,31,36,36,39,44,44,52,52,52,60,60,60,63,68,68,71,76,76,76,79,84,84,84,87,92,92,92,92,95,100,100,100,100,100,100,100,103,103,103,103,103,103,103,103,103,103,100,100,100,100,100,100,100,95,95,92,92,92,87,87,84,84,84,79,76,76,71,68,68,68,63,60,60,55,52,52,47,44,44,39,36,36,28,28,23,20,20,15,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,20,28,28,31,36,36,39,44,44,52,52,52,60,60,60,68,68,68,71,76,76,79,84,84,84,87,92,92,92,95,95,100,100,100,100,103,103,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,103,103,100,100,100,100,100,95,92,92,92,87,84,84,84,79,76,76,76,71,68,68,63,60,60,55,52,52,47,44,44,39,36,36,28,28,23,20,20,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,15,20,20,23,28,31,36,36,39,44,44,52,52,52,60,60,63,68,68,68,76,76,76,79,84,84,87,92,92,92,95,95,100,100,100,103,103,108,108,108,108,108,108,111,111,111,111,111,111,111,111,111,111,108,108,108,108,108,108,108,103,100,100,100,100,95,92,92,92,87,84,84,84,79,76,76,71,68,68,63,60,60,55,52,52,47,44,44,36,36,31,28,28,23,20,15,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,20,20,23,28,28,36,36,39,44,44,47,52,52,60,60,63,68,68,71,76,76,79,84,84,84,87,92,92,92,95,100,100,100,103,108,108,108,108,108,111,111,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,111,111,108,108,108,108,103,103,100,100,100,95,92,92,92,87,84,84,79,76,76,71,68,68,63,60,60,55,52,52,47,44,44,36,36,31,28,28,20,20,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,23,28,28,31,36,39,44,44,47,52,52,60,60,63,68,68,71,76,76,79,84,84,87,92,92,92,95,100,100,100,103,108,108,108,108,111,116,116,116,116,116,116,119,119,119,119,119,119,119,119,119,119,116,116,116,116,116,116,111,111,108,108,108,103,103,100,100,100,95,92,92,87,84,84,79,76,76,71,68,68,63,60,60,55,52,52,44,44,39,36,36,31,28,23,20,20,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,15,20,20,28,28,31,36,36,44,44,47,52,52,60,60,63,68,68,71,76,76,79,84,84,87,92,92,92,100,100,100,103,108,108,108,111,111,116,116,116,116,119,119,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,119,119,116,116,116,116,111,108,108,108,103,100,100,100,95,92,92,87,84,84,84,76,76,76,68,68,63,60,60,55,52,52,44,44,39,36,36,28,28,23,20,20,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,20,20,23,28,28,36,36,39,44,47,52,52,55,60,60,68,68,71,76,76,79,84,84,87,92,92,95,100,100,100,108,108,108,111,116,116,116,116,119,119,124,124,124,124,124,124,127,127,127,127,127,127,127,127,127,124,124,124,124,124,124,119,116,116,116,116,111,108,108,108,103,100,100,100,92,92,92,84,84,84,76,76,76,68,68,63,60,60,55,52,47,44,44,39,36,31,28,28,20,20,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,23,28,28,36,36,39,44,44,52,52,55,60,60,68,68,71,76,76,79,84,84,87,92,92,95,100,100,103,108,108,108,111,116,116,116,119,124,124,124,124,127,127,132,132,132,132,132,132,132,132,132,132,132,132,132,132,127,127,124,124,124,124,119,119,116,116,116,111,108,108,103,100,100,100,95,92,92,87,84,84,76,76,71,68,68,63,60,60,52,52,47,44,44,36,36,31,28,23,20,20,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,20,20,28,28,31,36,36,44,44,47,52,55,60,60,63,68,68,76,76,79,84,84,87,92,92,95,100,100,103,108,108,111,116,116,116,119,124,124,124,124,127,132,132,132,132,132,132,135,135,135,135,135,135,135,135,135,132,132,132,132,132,132,127,124,124,124,119,119,116,116,111,108,108,108,103,100,100,95,92,92,87,84,84,76,76,71,68,68,63,60,55,52,52,44,44,39,36,36,28,28,23,20,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,23,28,28,36,36,39,44,47,52,52,60,60,63,68,68,76,76,79,84,84,87,92,92,100,100,100,108,108,108,111,116,116,119,124,124,124,127,127,132,132,132,132,135,140,140,140,140,140,140,140,140,140,140,140,140,140,140,135,135,132,132,132,132,127,124,124,124,119,116,116,116,111,108,108,103,100,100,95,92,92,87,84,84,76,76,71,68,68,60,60,55,52,52,44,44,39,36,31,28,28,20,20,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,15,20,20,28,28,31,36,39,44,44,52,52,55,60,63,68,68,71,76,79,84,84,87,92,92,100,100,100,108,108,108,116,116,116,119,124,124,124,127,132,132,132,135,140,140,140,140,140,140,143,143,143,143,143,143,143,143,140,140,140,140,140,140,135,135,132,132,132,127,124,124,124,119,116,116,111,108,108,103,100,100,95,92,92,84,84,79,76,76,71,68,63,60,60,52,52,47,44,44,36,36,28,28,23,20,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,23,28,28,36,36,44,44,47,52,55,60,60,68,68,71,76,76,84,84,87,92,92,95,100,100,108,108,111,116,116,116,124,124,124,127,132,132,132,135,140,140,140,140,143,143,148,148,148,148,148,148,148,148,148,148,148,148,148,143,143,140,140,140,140,135,132,132,132,127,124,124,119,116,116,111,108,108,103,100,100,95,92,92,84,84,79,76,76,68,68,63,60,55,52,52,44,44,39,36,31,28,28,20,20,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,20,20,28,28,31,36,39,44,44,52,52,60,60,63,68,68,76,76,79,84,87,92,92,95,100,100,108,108,111,116,116,119,124,124,124,132,132,132,135,140,140,140,143,143,148,148,148,148,148,151,151,151,151,151,151,151,151,148,148,148,148,148,148,143,140,140,140,135,132,132,132,127,124,124,119,116,116,111,108,108,103,100,100,92,92,87,84,84,79,76,71,68,68,60,60,55,52,47,44,44,36,36,31,28,23,20,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,23,28,31,36,36,44,44,47,52,55,60,60,68,68,71,76,79,84,84,92,92,95,100,100,108,108,111,116,116,119,124,124,127,132,132,132,140,140,140,143,148,148,148,148,151,151,156,156,156,156,156,156,156,156,156,156,156,156,151,151,148,148,148,148,143,140,140,140,135,132,132,127,124,124,119,116,116,111,108,108,103,100,100,92,92,87,84,84,76,76,71,68,63,60,60,52,52,47,44,39,36,31,28,28,20,20,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,20,20,28,28,31,36,39,44,47,52,52,60,60,63,68,71,76,76,84,84,87,92,92,100,100,103,108,108,116,116,119,124,124,127,132,132,135,140,140,140,143,148,148,148,151,156,156,156,156,156,156,159,159,159,159,159,159,159,156,156,156,156,156,151,151,148,148,148,143,140,140,135,132,132,132,124,124,119,116,116,111,108,108,100,100,95,92,92,84,84,79,76,76,68,68,60,60,55,52,47,44,44,36,36,28,28,23,20,15,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,15,20,23,28,28,36,36,44,44,47,52,55,60,63,68,68,76,76,79,84,87,92,92,100,100,103,108,108,116,116,119,124,124,127,132,132,135,140,140,143,148,148,148,151,156,156,156,156,159,164,164,164,164,164,164,164,164,164,164,164,164,159,159,156,156,156,156,151,148,148,143,140,140,140,132,132,132,124,124,119,116,116,111,108,108,100,100,95,92,87,84,84,76,76,71,68,63,60,60,52,52,47,44,39,36,31,28,28,20,20,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,20,20,23,28,31,36,39,44,44,52,52,60,60,63,68,71,76,79,84,84,92,92,95,100,100,108,108,111,116,116,124,124,127,132,132,135,140,140,143,148,148,151,156,156,156,159,159,164,164,164,164,164,167,167,167,167,167,167,167,164,164,164,164,164,159,156,156,156,151,148,148,148,143,140,140,135,132,132,124,124,119,116,116,108,108,103,100,100,92,92,87,84,79,76,76,68,68,63,60,55,52,47,44,44,36,36,28,28,23,20,15,12,7,0,0,0,0,0,0,0,0,0,0,0,0,7,12,15,20,20,28,28,36,36,44,44,47,52,55,60,63,68,68,76,76,79,84,87,92,92,100,100,108,108,111,116,116,124,124,127,132,132,135,140,140,143,148,148,151,156,156,159,164,164,164,164,167,167,172,172,172,172,172,172,172,172,172,172,172,167,164,164,164,164,159,156,156,156,151,148,148,143,140,140,135,132,132,124,124,119,116,116,108,108,103,100,95,92,92,84,84,79,76,71,68,63,60,60,52,52,44,44,39,36,31,28,23,20,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,7,12,15,20,23,28,31,36,36,44,44,52,52,60,60,63,68,71,76,79,84,84,92,92,95,100,103,108,108,116,116,119,124,124,132,132,135,140,140,143,148,148,156,156,156,159,164,164,164,167,172,172,172,172,172,175,175,175,175,175,175,175,172,172,172,172,172,167,164,164,164,159,156,156,151,148,148,143,140,140,132,132,127,124,124,116,116,111,108,108,100,100,95,92,87,84,79,76,76,68,68,60,60,55,52,47,44,39,36,36,28,28,20,20,12,12,0,0,0,0,0,0,0,0,0,0,0,0,12,12,20,20,28,28,31,36,39,44,47,52,55,60,60,68,68,76,76,79,84,87,92,95,100,100,108,108,111,116,119,124,124,132,132,135,140,140,143,148,148,156,156,156,164,164,164,167,172,172,172,175,175,180,180,180,180,180,180,180,180,180,180,180,175,172,172,172,167,164,164,164,159,156,156,151,148,148,143,140,140,132,132,127,124,124,116,116,108,108,103,100,95,92,92,84,84,79,76,71,68,63,60,60,52,52,44,44,36,36,28,28,23,20,15,12,7,0,0,0,0,0,0,0,0,0,0,7,12,15,20,20,28,28,36,36,44,44,52,52,55,60,63,68,71,76,76,84,84,92,92,95,100,103,108,111,116,116,124,124,127,132,132,140,140,143,148,148,156,156,156,164,164,164,172,172,172,175,180,180,180,180,180,183,183,183,183,183,183,180,180,180,180,180,175,172,172,172,167,164,164,159,156,156,151,148,148,140,140,135,132,132,124,124,119,116,111,108,108,100,100,95,92,87,84,79,76,76,68,68,60,60,52,52,47,44,39,36,31,28,23,20,15,12,12,0,0,0,0,0,0,0,0,0,0,7,12,15,20,23,28,31,36,39,44,44,52,52,60,60,68,68,71,76,79,84,87,92,95,100,100,108,108,116,116,119,124,124,132,132,140,140,143,148,148,156,156,156,164,164,167,172,172,172,175,180,180,180,183,188,188,188,188,188,188,188,188,188,188,183,183,180,180,180,175,172,172,167,164,164,159,156,156,151,148,148,140,140,135,132,127,124,124,116,116,111,108,103,100,95,92,92,84,84,76,76,71,68,63,60,55,52,47,44,39,36,36,28,28,20,20,12,12,0,0,0,0,0,0,0,0,0,0,12,12,20,20,23,28,31,36,39,44,47,52,55,60,63,68,68,76,76,84,84,92,92,95,100,103,108,111,116,116,124,124,127,132,135,140,140,148,148,151,156,156,164,164,167,172,172,175,180,180,180,183,188,188,188,188,191,191,191,191,191,191,188,188,188,188,188,183,180,180,175,172,172,167,164,164,159,156,156,148,148,143,140,140,132,132,127,124,119,116,111,108,108,100,100,92,92,87,84,79,76,71,68,63,60,60,52,52,44,44,36,36,28,28,20,20,15,12,7,0,0,0,0,0,0,0,0,0,12,12,20,20,28,28,36,36,44,44,47,52,55,60,63,68,71,76,79,84,84,92,92,100,100,108,108,111,116,119,124,127,132,132,140,140,143,148,151,156,156,164,164,167,172,172,175,180,180,183,188,188,188,191,191,196,196,196,196,196,196,196,196,196,191,188,188,188,183,180,180,180,172,172,167,164,164,159,156,156,148,148,143,140,135,132,132,124,124,116,116,111,108,103,100,95,92,87,84,84,76,76,68,68,60,60,52,52,47,44,39,36,31,28,23,20,15,12,7,0,0,0,0,0,0,0,0,7,12,15,20,20,28,28,36,36,44,44,52,52,60,60,68,68,76,76,79,84,87,92,95,100,103,108,108,116,116,124,124,127,132,135,140,143,148,148,156,156,159,164,164,172,172,175,180,180,183,188,188,191,196,196,196,196,196,199,199,199,199,199,196,196,196,196,191,188,188,188,180,180,180,172,172,167,164,164,156,156,151,148,143,140,140,132,132,127,124,119,116,111,108,108,100,100,92,92,84,84,76,76,71,68,63,60,55,52,47,44,39,36,31,28,23,20,20,12,12,0,0,0,0,0,0,0,0,7,12,15,20,23,28,31,36,39,44,47,52,52,60,60,68,68,76,76,84,84,92,92,100,100,103,108,111,116,119,124,124,132,132,140,140,148,148,151,156,159,164,164,172,172,175,180,180,183,188,188,191,196,196,196,199,204,204,204,204,204,204,204,204,199,199,196,196,196,191,188,188,180,180,180,172,172,167,164,159,156,156,148,148,143,140,135,132,127,124,124,116,116,108,108,100,100,95,92,87,84,79,76,71,68,63,60,55,52,52,44,44,36,36,28,28,20,20,12,12,0,0,0,0,0,0,0,0,7,12,15,20,23,28,31,36,39,44,47,52,55,60,63,68,71,76,79,84,84,92,92,100,100,108,108,116,116,119,124,127,132,135,140,143,148,148,156,156,164,164,167,172,172,180,180,183,188,188,191,196,196,199,204,204,204,204,207,207,207,207,207,204,204,204,204,196,196,196,191,188,188,180,180,175,172,172,164,164,159,156,151,148,143,140,140,132,132,124,124,119,116,111,108,103,100,95,92,87,84,79,76,76,68,68,60,60,52,52,44,44,36,36,28,28,20,20,12,12,0,0,0,0,0,0,0,0,12,12,20,20,28,28,36,36,44,44,47,52,55,60,63,68,71,76,79,84,87,92,95,100,103,108,108,116,116,124,124,132,132,140,140,143,148,151,156,159,164,164,172,172,175,180,183,188,188,191,196,196,199,204,204,207,212,212,212,212,212,212,212,212,207,204,204,204,199,196,196,191,188,188,180,180,175,172,167,164,164,156,156,148,148,140,140,135,132,127,124,119,116,111,108,108,100,100,92,92,84,84,76,76,68,68,60,60,52,52,44,44,39,36,31,28,23,20,15,12,7,0,0,0,0,0,0,0,12,12,20,20,28,28,36,36,44,44,52,52,60,60,68,68,76,76,79,84,87,92,95,100,103,108,111,116,119,124,127,132,132,140,140,148,148,156,156,159,164,167,172,175,180,180,188,188,191,196,196,204,204,204,207,212,212,212,215,215,215,215,212,212,212,212,207,204,204,199,196,196,188,188,183,180,180,172,172,164,164,159,156,151,148,143,140,135,132,132,124,124,116,116,108,108,100,100,92,92,84,84,76,76,71,68,63,60,55,52,47,44,39,36,31,28,23,20,15,12,7,0,0,0,0,0,0,0,12,12,20,20,28,28,36,36,44,44,52,52,60,60,68,68,76,76,84,84,92,92,100,100,108,108,111,116,119,124,127,132,135,140,143,148,151,156,156,164,164,172,172,180,180,183,188,191,196,196,199,204,204,212,212,212,215,220,220,220,220,220,220,220,215,212,212,207,204,204,199,196,191,188,188,180,180,175,172,167,164,159,156,156,148,148,140,140,132,132,124,124,116,116,108,108,103,100,95,92,87,84,79,76,71,68,63,60,55,52,47,44,39,36,31,28,23,20,15,12,7,0,0,0,0,0,0,7,12,15,20,23,28,31,36,36,44,44,52,52,60,60,68,68,76,76,84,84,92,92,100,100,108,108,116,116,124,124,132,132,140,140,143,148,151,156,159,164,167,172,175,180,180,188,188,196,196,199,204,204,212,212,215,220,220,220,220,223,223,223,220,220,220,215,212,212,207,204,204,196,196,191,188,183,180,175,172,172,164,164,156,156,148,148,140,140,135,132,127,124,119,116,111,108,103,100,95,92,87,84,79,76,71,68,63,60,55,52,47,44,39,36,36,28,28,20,20,12,12,0,0,0,0,0,0,7,12,15,20,23,28,31,36,39,44,47,52,55,60,63,68,71,76,79,84,84,92,92,100,100,108,108,116,116,124,124,132,132,140,140,148,148,156,156,164,164,167,172,175,180,183,188,191,196,196,204,204,207,212,215,220,220,223,228,228,228,228,228,228,223,220,220,215,212,212,207,204,199,196,196,188,188,180,180,172,172,164,164,159,156,151,148,143,140,135,132,127,124,119,116,111,108,103,100,95,92,87,84,79,76,76,68,68,60,60,52,52,44,44,36,36,28,28,20,20,12,12,0,0,0,0,0,0,7,12,15,20,23,28,31,36,39,44,47,52,55,60,63,68,71,76,79,84,87,92,95,100,103,108,111,116,119,124,124,132,132,140,140,148,148,156,156,164,164,172,172,180,180,188,188,191,196,199,204,207,212,212,220,220,223,228,228,228,231,231,231,228,228,228,220,220,215,212,212,204,204,196,196,188,188,183,180,175,172,167,164,159,156,151,148,143,140,135,132,127,124,119,116,116,108,108,100,100,92,92,84,84,76,76,68,68,60,60,52,52,44,44,36,36,28,28,20,20,12,12,0,0,0,0,0,0,7,12,15,20,23,28,31,36,39,44,47,52,55,60,63,68,71,76,79,84,87,92,95,100,103,108,111,116,119,124,127,132,135,140,143,148,151,156,156,164,164,172,172,180,180,188,188,196,196,204,204,212,212,215,220,223,228,228,231,236,236,236,236,236,228,228,223,220,220,212,212,207,204,199,196,191,188,183,180,175,172,167,164,159,156,156,148,148,140,140,132,132,124,124,116,116,108,108,100,100,92,92,84,84,76,76,68,68,60,60,52,52,44,44,36,36,28,28,20,20,12,12,0,0,0,0,0,0,7,12,15,20,23,28,31,36,39,44,47,52,55,60,63,68,71,76,79,84,87,92,95,100,103,108,111,116,119,124,127,132,135,140,143,148,151,156,159,164,167,172,175,180,183,188,191,196,196,204,204,212,212,220,220,228,228,231,236,236,239,239,236,236,236,228,228,223,220,215,212,207,204,199,196,196,188,188,180,180,172,172,164,164,156,156,148,148,140,140,132,132,124,124,116,116,108,108,100,100,92,92,84,84,76,76,68,68,60,60,52,52,44,44,36,36,28,28,20,20,12,12,0,0,0,0,0,0,7,12,15,20,23,28,31,36,39,44,47,52,55,60,63,68,71,76,79,84,87,92,95,100,103,108,111,116,119,124,127,132,135,140,143,148,151,156,159,164,167,172,175,180,183,188,191,196,199,204,207,212,215,220,220,228,228,236,236,239,244,244,244,239,236,231,228,223,220,220,212,212,204,204,196,196,188,188,180,180,172,172,164,164,156,156,148,148,140,140,132,132,124,124,116,116,108,108,100,100,92,92,84,84,76,76,68,68,60,60,52,52,44,44,36,36,28,28,20,20,12,12,0,0,0,0,0,0,7,12,15,20,23,28,31,36,39,44,47,52,55,60,63,68,71,76,79,84,87,92,95,100,103,108,111,116,119,124,127,132,135,140,143,148,151,156,159,164,167,172,175,180,183,188,191,196,199,204,207,212,215,220,223,228,231,236,239,244,244,247,244,244,236,236,228,228,220,220,212,212,204,204,196,196,188,188,180,180,172,172,164,164,156,156,148,148,140,140,132,132,124,124,116,116,108,108,100,100,92,92,84,84,76,76,68,68,60,60,52,52,44,44,36,36,28,28,20,20,12,12,0,0,0,0,0,0,7,12,15,20,23,28,31,36,39,44,47,52,55,60,63,68,71,76,79,84,87,92,95,100,103,108,111,116,119,124,127,132,135,140,143,148,151,156,159,164,167,172,175,180,183,188,191,196,199,204,207,212,215,220,223,228,231,236,239,244,247,252,244,244,236,236,228,228,220,220,212,212,204,204,196,196,188,188,180,180,172,172,164,164,156,156,148,148,140,140,132,132,124,124,116,116,108,108,100,100,92,92,84,84,76,76,68,68,60,60,52,52,44,44,36,36,28,28,20,20,12,12,0,0,0,0,0,0,7,12,15,20,23,28,31,36,39,44,47,52,55,60,63,68,71,76,79,84,87,92,95,100,103,108,111,116,119,124,127,132,135,140,143,148,151,156,159,164,167,172,175,180,183,188,191,196,199,204,207,212,215,220,223,228,231,236,236,244,244,244,244,239,236,236,228,228,220,220,212,212,204,204,196,196,188,188,180,180,172,172,164,164,156,156,148,148,140,140,132,132,124,124,116,116,108,108,100,100,92,92,84,84,76,76,68,68,60,60,52,52,44,44,36,36,28,28,20,20,12,12,0,0,0,0,0,0,7,12,15,20,23,28,31,36,39,44,47,52,55,60,63,68,71,76,79,84,87,92,95,100,103,108,111,116,119,124,127,132,135,140,143,148,151,156,159,164,167,172,175,180,183,188,191,196,199,204,207,212,212,220,220,228,228,236,236,239,244,244,239,236,236,231,228,223,220,215,212,207,204,204,196,196,188,188,180,180,172,172,164,164,156,156,148,148,140,140,132,132,124,124,116,116,108,108,100,100,92,92,84,84,76,76,68,68,60,60,52,52,44,44,36,36,28,28,20,20,12,12,0,0,0,0,0,0,7,12,15,20,23,28,31,36,39,44,47,52,55,60,63,68,71,76,79,84,87,92,95,100,103,108,111,116,119,124,127,132,135,140,143,148,151,156,159,164,167,172,175,180,180,188,188,196,196,204,204,212,212,220,220,223,228,228,236,236,236,236,236,236,231,228,228,220,220,215,212,207,204,199,196,191,188,183,180,175,172,172,164,164,156,156,148,148,140,140,132,132,124,124,116,116,108,108,100,100,92,92,84,84,76,76,68,68,60,60,52,52,44,44,36,36,28,28,20,20,12,12,0,0,0,0,0,0,7,12,15,20,23,28,31,36,39,44,47,52,55,60,63,68,71,76,79,84,87,92,95,100,103,108,111,116,119,124,127,132,135,140,140,148,148,156,156,164,164,172,172,180,180,188,188,196,196,199,204,207,212,215,220,220,228,228,228,231,236,236,236,231,228,228,223,220,220,212,212,204,204,199,196,191,188,183,180,175,172,167,164,159,156,151,148,143,140,140,132,132,124,124,116,116,108,108,100,100,92,92,84,84,76,76,68,68,60,60,52,52,44,44,36,36,28,28,20,20,12,12,0,0,0,0,0,0,7,12,15,20,23,28,31,36,39,44,47,52,55,60,63,68,71,76,79,84,87,92,95,100,100,108,108,116,116,124,124,132,132,140,140,148,148,156,156,164,164,172,172,180,180,183,188,191,196,199,204,204,212,212,215,220,220,223,228,228,228,228,228,228,228,223,220,220,212,212,207,204,204,196,196,188,188,180,180,175,172,167,164,159,156,151,148,143,140,135,132,127,124,119,116,111,108,103,100,100,92,92,84,84,76,76,68,68,60,60,52,52,44,44,36,36,28,28,20,20,12,12,0,0,0,0,0,0,7,12,15,20,23,28,31,36,39,44,47,52,55,60,60,68,68,76,76,84,84,92,92,100,100,108,108,116,116,124,124,132,132,140,140,148,148,151,156,159,164,167,172,175,180,183,188,188,196,196,204,204,207,212,212,215,220,220,223,223,228,228,228,223,220,220,220,215,212,212,204,204,199,196,191,188,188,180,180,172,172,164,164,156,156,151,148,143,140,135,132,127,124,119,116,111,108,103,100,95,92,87,84,79,76,71,68,63,60,60,52,52,44,44,36,36,28,28,20,20,12,12,0,0,0,0,0,0,7,12,15,20,20,28,28,36,36,44,44,52,52,60,60,68,68,76,76,84,84,92,92,100,100,108,108,116,116,124,124,127,132,135,140,143,148,151,156,159,164,164,172,172,180,180,188,188,191,196,196,204,204,207,212,212,215,220,220,220,220,220,220,220,220,220,212,212,212,204,204,199,196,196,188,188,183,180,175,172,167,164,164,156,156,148,148,140,140,132,132,124,124,119,116,111,108,103,100,95,92,87,84,79,76,71,68,63,60,55,52,47,44,39,36,31,28,23,20,20,12,12,0,0,0,0,0,0,0,12,12,20,20,28,28,36,36,44,44,52,52,60,60,68,68,76,76,84,84,92,92,95,100,103,108,111,116,119,124,127,132,135,140,143,148,148,156,156,164,164,172,172,175,180,183,188,188,196,196,199,204,204,207,212,212,212,215,220,220,220,220,215,215,212,212,212,204,204,204,196,196,191,188,188,180,180,172,172,167,164,159,156,151,148,143,140,140,132,132,124,124,116,116,108,108,100,100,92,92,87,84,79,76,71,68,63,60,55,52,47,44,39,36,31,28,23,20,15,12,7,0,0,0,0,0,0,0,12,12,20,20,28,28,36,36,44,44,52,52,60,60,63,68,71,76,79,84,87,92,95,100,103,108,111,116,119,124,124,132,132,140,140,148,148,151,156,159,164,167,172,172,180,180,183,188,191,196,196,199,204,204,207,212,212,212,212,212,212,212,212,212,212,207,204,204,204,196,196,191,188,188,180,180,175,172,172,164,164,156,156,151,148,143,140,135,132,127,124,119,116,116,108,108,100,100,92,92,84,84,76,76,68,68,60,60,55,52,47,44,39,36,31,28,23,20,15,12,7,0,0,0,0,0,0,0,12,12,20,20,23,28,31,36,39,44,47,52,55,60,63,68,71,76,79,84,87,92,92,100,100,108,108,116,116,124,124,132,132,135,140,143,148,151,156,156,164,164,167,172,175,180,180,188,188,191,196,196,199,204,204,204,207,207,212,212,212,212,207,207,204,204,204,199,196,196,191,188,188,183,180,180,172,172,167,164,159,156,156,148,148,140,140,132,132,127,124,119,116,111,108,103,100,95,92,92,84,84,76,76,68,68,60,60,52,52,44,44,36,36,28,28,23,20,15,12,7,0,0,0,0,0,0,0,7,12,15,20,23,28,31,36,39,44,47,52,55,60,63,68,68,76,76,84,84,92,92,100,100,108,108,111,116,119,124,127,132,135,140,140,148,148,156,156,159,164,164,172,172,175,180,180,188,188,191,196,196,196,199,204,204,204,204,204,204,204,204,204,204,204,199,196,196,191,188,188,183,180,180,175,172,167,164,164,156,156,151,148,143,140,135,132,132,124,124,116,116,108,108,103,100,95,92,87,84,79,76,71,68,68,60,60,52,52,44,44,36,36,28,28,20,20,12,12,0,0,0,0,0,0,0,0,7,12,15,20,23,28,31,36,36,44,44,52,52,60,60,68,68,76,76,84,84,87,92,95,100,103,108,111,116,116,124,124,132,132,140,140,143,148,151,156,156,164,164,167,172,172,180,180,180,188,188,188,191,196,196,196,199,199,204,204,204,204,204,199,199,196,196,196,191,188,188,183,180,180,175,172,172,164,164,159,156,151,148,148,140,140,135,132,127,124,119,116,116,108,108,100,100,92,92,84,84,79,76,71,68,63,60,55,52,47,44,39,36,36,28,28,20,20,12,12,0,0,0,0,0,0,0,0,0,12,12,20,20,28,28,36,36,44,44,52,52,60,60,63,68,71,76,79,84,87,92,95,100,100,108,108,116,116,119,124,127,132,135,140,140,148,148,151,156,159,164,164,167,172,172,180,180,180,188,188,188,191,196,196,196,196,196,196,196,196,196,196,196,196,191,188,188,188,183,180,180,175,172,172,167,164,159,156,156,148,148,143,140,140,132,132,124,124,119,116,111,108,103,100,95,92,92,84,84,76,76,68,68,60,60,55,52,47,44,39,36,31,28,23,20,15,12,7,0,0,0,0,0,0,0,0,0,12,12,20,20,28,28,36,36,39,44,47,52,55,60,63,68,71,76,76,84,84,92,92,100,100,103,108,111,116,119,124,124,132,132,135,140,143,148,148,156,156,159,164,164,167,172,172,180,180,180,183,188,188,188,188,191,196,196,196,196,196,196,191,191,188,188,188,188,180,180,180,175,172,172,167,164,164,156,156,151,148,148,140,140,135,132,127,124,124,116,116,108,108,100,100,95,92,87,84,79,76,76,68,68,60,60,52,52,44,44,36,36,31,28,23,20,15,12,7,0,0,0,0,0,0,0,0,0,7,12,15,20,23,28,31,36,39,44,47,52,52,60,60,68,68,76,76,84,84,87,92,95,100,103,108,108,116,116,119,124,127,132,132,140,140,143,148,151,156,156,159,164,164,167,172,172,175,180,180,180,183,188,188,188,188,188,188,188,188,188,188,188,188,188,183,180,180,180,175,172,172,167,164,164,156,156,151,148,148,143,140,135,132,132,124,124,119,116,111,108,103,100,100,92,92,84,84,79,76,71,68,63,60,55,52,52,44,44,36,36,28,28,20,20,12,12,7,0,0,0,0,0,0,0,0,0,7,12,15,20,23,28,28,36,36,44,44,52,52,60,60,63,68,71,76,79,84,84,92,92,100,100,103,108,111,116,119,124,124,132,132,135,140,140,148,148,151,156,156,159,164,164,167,172,172,175,180,180,180,180,183,183,188,188,188,188,188,188,183,183,180,180,180,180,175,172,172,172,167,164,164,159,156,156,148,148,143,140,140,132,132,127,124,119,116,116,108,108,103,100,95,92,87,84,84,76,76,68,68,60,60,55,52,47,44,39,36,31,28,28,20,20,12,12,0,0,0,0,0,0,0,0,0,0,0,12,12,20,20,28,28,36,36,39,44,47,52,55,60,63,68,68,76,76,84,84,87,92,95,100,103,108,108,116,116,119,124,127,132,132,135,140,143,148,148,151,156,156,159,164,164,167,172,172,172,175,175,180,180,180,180,180,180,180,180,180,180,180,180,180,175,172,172,172,167,164,164,164,156,156,156,148,148,143,140,140,135,132,127,124,124,116,116,111,108,103,100,100,92,92,87,84,79,76,71,68,68,60,60,52,52,44,44,39,36,31,28,23,20,15,12,7,0,0,0,0,0,0,0,0,0,0,0,12,12,20,20,23,28,31,36,39,44,47,52,52,60,60,68,68,71,76,79,84,87,92,92,100,100,103,108,111,116,116,124,124,127,132,132,140,140,143,148,148,151,156,156,159,164,164,164,167,172,172,172,172,175,175,180,180,180,180,180,180,175,175,175,172,172,172,172,167,164,164,159,156,156,156,148,148,143,140,140,135,132,132,124,124,119,116,116,108,108,100,100,95,92,87,84,84,76,76,68,68,63,60,55,52,47,44,44,36,36,28,28,20,20,15,12,7,0,0,0,0,0,0,0,0,0,0,0,7,12,15,20,23,28,28,36,36,44,44,52,52,55,60,63,68,71,76,76,84,84,87,92,95,100,100,108,108,111,116,119,124,124,127,132,132,140,140,143,148,148,151,156,156,156,159,164,164,164,167,172,172,172,172,172,172,172,172,172,172,172,172,172,172,167,167,164,164,164,159,156,156,151,148,148,143,140,140,135,132,132,127,124,119,116,116,111,108,103,100,100,92,92,87,84,79,76,71,68,68,60,60,52,52,47,44,39,36,31,28,28,20,20,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,20,20,28,28,31,36,39,44,47,52,52,60,60,68,68,71,76,79,84,84,92,92,100,100,103,108,108,116,116,119,124,124,132,132,135,140,140,143,148,148,148,156,156,156,159,164,164,164,164,164,167,167,172,172,172,172,172,172,172,167,167,164,164,164,164,159,156,156,156,151,148,148,143,140,140,135,132,132,127,124,124,116,116,111,108,108,100,100,95,92,87,84,84,76,76,71,68,63,60,55,52,52,44,44,36,36,31,28,23,20,15,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,23,28,31,36,36,44,44,52,52,55,60,63,68,71,76,76,84,84,87,92,95,100,100,103,108,111,116,116,119,124,124,132,132,135,140,140,140,148,148,148,151,156,156,156,159,159,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,159,156,156,156,151,148,148,148,143,140,140,135,132,132,127,124,124,119,116,111,108,108,103,100,95,92,92,84,84,79,76,71,68,68,60,60,55,52,47,44,39,36,36,28,28,20,20,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,15,20,20,28,28,36,36,39,44,47,52,55,60,60,68,68,71,76,79,84,84,92,92,95,100,100,108,108,111,116,116,119,124,124,132,132,132,140,140,140,143,148,148,148,151,156,156,156,156,159,159,159,164,164,164,164,164,164,164,159,159,156,156,156,156,156,151,148,148,148,143,140,140,135,132,132,127,124,124,119,116,116,108,108,103,100,100,92,92,87,84,84,76,76,68,68,63,60,55,52,52,44,44,36,36,31,28,23,20,20,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,20,20,23,28,31,36,39,44,44,52,52,55,60,63,68,68,76,76,79,84,87,92,92,100,100,103,108,108,111,116,116,119,124,124,132,132,132,135,140,140,143,143,148,148,148,151,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,151,151,148,148,148,143,140,140,140,135,132,132,127,124,124,119,116,116,108,108,103,100,100,95,92,87,84,84,79,76,71,68,68,60,60,55,52,47,44,39,36,36,28,28,20,20,15,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,15,20,20,28,28,36,36,39,44,47,52,52,60,60,68,68,71,76,76,84,84,87,92,92,100,100,103,108,108,111,116,116,119,124,124,127,132,132,135,140,140,140,143,143,148,148,148,148,151,151,156,156,156,156,156,156,156,156,151,151,151,148,148,148,148,143,140,140,140,135,132,132,132,127,124,124,119,116,116,111,108,108,100,100,95,92,92,84,84,79,76,76,68,68,63,60,55,52,52,44,44,39,36,31,28,23,20,20,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,20,20,23,28,31,36,36,44,44,52,52,55,60,60,68,68,71,76,79,84,84,87,92,95,100,100,103,108,108,111,116,116,119,124,124,127,132,132,132,135,140,140,140,140,143,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,143,143,140,140,140,140,135,132,132,127,124,124,124,119,116,116,111,108,108,100,100,95,92,92,87,84,84,76,76,71,68,63,60,60,52,52,47,44,39,36,36,28,28,23,20,15,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,15,20,23,28,28,36,36,39,44,47,52,52,60,60,63,68,68,76,76,79,84,84,92,92,95,100,100,103,108,108,111,116,116,119,124,124,124,127,132,132,132,135,140,140,140,140,140,143,143,148,148,148,148,148,148,148,148,143,143,143,140,140,140,140,135,135,132,132,132,127,124,124,119,116,116,116,108,108,108,100,100,95,92,92,87,84,84,76,76,71,68,68,60,60,55,52,52,44,44,36,36,31,28,23,20,20,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,20,20,23,28,31,36,36,44,44,47,52,55,60,60,68,68,71,76,76,79,84,84,92,92,95,100,100,103,108,108,111,116,116,116,124,124,124,127,132,132,132,132,135,135,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,135,132,132,132,132,127,124,124,124,119,116,116,111,108,108,108,100,100,100,92,92,87,84,84,79,76,76,68,68,63,60,55,52,52,44,44,39,36,36,28,28,20,20,15,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,15,20,20,28,28,31,36,39,44,44,52,52,55,60,60,68,68,71,76,76,84,84,87,92,92,95,100,100,103,108,108,108,116,116,116,119,124,124,124,127,127,132,132,132,132,135,135,135,140,140,140,140,140,140,140,140,140,135,135,132,132,132,132,132,127,124,124,124,119,116,116,116,111,108,108,103,100,100,95,92,92,87,84,84,79,76,76,68,68,63,60,60,52,52,47,44,44,36,36,31,28,23,20,20,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,20,20,23,28,28,36,36,39,44,47,52,52,60,60,63,68,68,71,76,76,84,84,87,92,92,95,100,100,100,108,108,108,111,116,116,116,119,124,124,124,124,127,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,127,127,124,124,124,124,119,116,116,116,111,108,108,103,100,100,95,92,92,87,84,84,79,76,76,71,68,68,60,60,55,52,52,44,44,39,36,31,28,28,20,20,15,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,15,20,20,28,28,31,36,36,44,44,47,52,52,60,60,63,68,68,71,76,76,84,84,87,92,92,92,100,100,100,103,108,108,108,111,116,116,116,119,124,124,124,124,124,127,127,127,132,132,132,132,132,132,132,132,132,127,127,124,124,124,124,124,119,119,116,116,116,111,108,108,108,103,100,100,95,92,92,87,84,84,79,76,76,71,68,68,60,60,55,52,52,44,44,39,36,36,28,28,23,20,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,23,28,28,36,36,39,44,44,52,52,55,60,60,63,68,68,76,76,76,84,84,84,92,92,92,95,100,100,103,108,108,108,111,111,116,116,116,119,119,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,119,119,116,116,116,116,111,108,108,108,103,100,100,100,95,92,92,87,84,84,79,76,76,71,68,68,60,60,55,52,52,47,44,44,36,36,31,28,23,20,20,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,20,20,23,28,28,36,36,39,44,44,52,52,55,60,60,63,68,68,76,76,76,84,84,84,87,92,92,95,100,100,100,103,108,108,108,111,111,116,116,116,116,116,119,119,119,124,124,124,124,124,124,124,124,124,119,119,119,116,116,116,116,116,111,108,108,108,103,100,100,100,95,92,92,92,87,84,84,79,76,76,71,68,68,63,60,60,52,52,47,44,44,36,36,31,28,28,20,20,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,15,20,20,28,28,31,36,36,44,44,47,52,52,55,60,60,63,68,68,71,76,76,79,84,84,87,92,92,92,95,100,100,100,103,108,108,108,108,111,111,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,111,108,108,108,108,103,103,100,100,100,95,92,92,87,84,84,84,79,76,76,71,68,68,63,60,60,52,52,47,44,44,39,36,36,28,28,23,20,20,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,20,28,28,31,36,36,44,44,47,52,52,55,60,60,63,68,68,71,76,76,79,84,84,84,87,92,92,95,95,100,100,100,103,108,108,108,108,108,108,111,111,116,116,116,116,116,116,116,116,116,116,111,111,111,108,108,108,108,108,103,100,100,100,100,95,92,92,92,87,84,84,84,76,76,76,71,68,68,63,60,60,52,52,47,44,44,39,36,36,28,28,23,20,20,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,20,20,23,28,28,31,36,36,44,44,47,52,52,55,60,60,63,68,68,71,76,76,79,84,84,84,87,92,92,92,95,95,100,100,100,100,103,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,103,103,100,100,100,100,95,92,92,92,87,84,84,84,79,76,76,76,68,68,68,60,60,60,52,52,52,44,44,39,36,36,31,28,28,20,20,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,20,20,23,28,28,36,36,39,44,44,47,52,52,55,60,60,63,68,68,71,76,76,76,79,84,84,84,87,92,92,92,92,95,100,100,100,100,100,103,103,103,108,108,108,108,108,108,108,108,108,108,103,103,103,100,100,100,100,100,95,95,92,92,92,87,87,84,84,84,79,76,76,71,68,68,68,60,60,60,52,52,52,44,44,39,36,36,31,28,28,20,20,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,20,23,28,28,36,36,39,44,44,47,52,52,55,60,60,63,68,68,68,71,76,76,76,79,84,84,84,87,92,92,92,92,95,95,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,95,95,92,92,92,92,87,87,84,84,84,79,76,76,76,71,68,68,63,60,60,55,52,52,47,44,44,39,36,36,31,28,28,23,20,20,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,20,23,28,28,36,36,39,44,44,47,52,52,55,60,60,60,63,68,68,71,76,76,76,79,79,84,84,84,87,87,92,92,92,92,92,95,95,95,100,100,100,100,100,100,100,100,100,100,100,95,95,92,92,92,92,92,92,87,84,84,84,84,79,76,76,76,71,68,68,68,63,60,60,55,52,52,47,44,44,39,36,36,31,28,28,23,20,20,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,15,20,20,28,28,28,36,36,39,44,44,44,52,52,52,55,60,60,63,68,68,68,71,76,76,76,79,79,84,84,84,84,87,87,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,87,84,84,84,84,84,79,76,76,76,71,68,68,68,63,60,60,60,55,52,52,47,44,44,39,36,36,31,28,28,23,20,20,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,15,20,20,28,28,28,36,36,36,44,44,44,47,52,52,55,60,60,60,63,68,68,68,71,76,76,76,76,79,84,84,84,84,84,84,87,87,87,92,92,92,92,92,92,92,92,92,92,92,87,87,87,84,84,84,84,84,79,79,76,76,76,71,71,68,68,68,63,60,60,55,52,52,52,47,44,44,39,36,36,31,28,28,23,20,20,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,15,20,20,28,28,28,36,36,36,39,44,44,47,52,52,52,55,60,60,60,63,68,68,68,71,76,76,76,76,76,79,79,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,79,79,76,76,76,76,71,68,68,68,68,63,60,60,60,55,52,52,52,44,44,44,39,36,36,31,28,28,23,20,20,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,15,20,20,23,28,28,31,36,36,39,44,44,44,52,52,52,55,60,60,60,63,63,68,68,68,71,71,76,76,76,76,76,76,79,79,79,84,84,84,84,84,84,84,84,84,84,84,79,79,79,76,76,76,76,76,76,71,68,68,68,68,63,60,60,60,55,52,52,52,47,44,44,44,36,36,36,31,28,28,23,20,20,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,15,20,20,23,28,28,31,36,36,39,44,44,44,47,52,52,52,55,60,60,60,60,63,68,68,68,68,71,71,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,71,71,68,68,68,68,68,63,60,60,60,55,55,52,52,52,44,44,44,39,36,36,36,28,28,28,23,20,20,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,15,20,20,23,28,28,31,36,36,36,39,44,44,44,47,52,52,52,55,60,60,60,60,63,63,68,68,68,68,68,71,71,71,76,76,76,76,76,76,76,76,76,76,76,76,71,71,71,68,68,68,68,68,68,63,60,60,60,60,55,55,52,52,52,47,44,44,44,39,36,36,31,28,28,28,20,20,20,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,15,20,20,23,28,28,28,31,36,36,39,44,44,44,47,47,52,52,52,55,60,60,60,60,60,63,63,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,63,60,60,60,60,60,55,52,52,52,52,47,44,44,44,39,36,36,36,31,28,28,23,20,20,20,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,15,20,20,20,23,28,28,31,36,36,36,39,44,44,44,47,47,52,52,52,52,55,60,60,60,60,60,60,63,63,63,68,68,68,68,68,68,68,68,68,68,68,68,63,63,63,60,60,60,60,60,60,55,55,52,52,52,52,47,44,44,44,39,36,36,36,31,28,28,28,23,20,20,15,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,23,28,28,28,31,36,36,36,39,44,44,44,44,47,52,52,52,52,52,55,55,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,55,55,52,52,52,52,47,47,44,44,44,39,39,36,36,36,31,28,28,23,20,20,20,15,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,15,20,20,20,23,28,28,28,31,36,36,36,39,44,44,44,44,47,47,52,52,52,52,52,52,55,55,55,60,60,60,60,60,60,60,60,60,60,60,60,60,55,55,55,52,52,52,52,52,52,47,44,44,44,44,39,36,36,36,36,31,28,28,28,23,20,20,20,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,20,20,20,23,28,28,28,31,31,36,36,36,39,39,44,44,44,44,47,47,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,47,47,44,44,44,44,44,39,36,36,36,36,31,28,28,28,23,20,20,20,15,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,20,23,28,28,28,28,31,36,36,36,36,39,39,44,44,44,44,44,44,47,47,47,52,52,52,52,52,52,52,52,52,52,52,52,52,47,47,47,44,44,44,44,44,44,39,39,36,36,36,36,31,28,28,28,23,20,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,20,23,28,28,28,28,31,36,36,36,36,36,39,39,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,39,39,36,36,36,36,36,31,31,28,28,28,23,23,20,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,20,23,28,28,28,28,28,31,36,36,36,36,36,36,39,39,39,39,44,44,44,44,44,44,44,44,44,44,44,44,44,39,39,39,36,36,36,36,36,36,31,31,28,28,28,28,23,20,20,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,20,23,23,28,28,28,28,28,31,31,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,31,31,28,28,28,28,28,23,20,20,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,20,20,23,23,28,28,28,28,28,28,31,31,31,36,36,36,36,36,36,36,36,36,36,36,36,36,36,31,31,31,28,28,28,28,28,28,28,23,20,20,20,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,15,20,20,20,20,20,23,23,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,23,23,20,20,20,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,15,15,20,20,20,20,20,20,23,23,23,28,28,28,28,28,28,28,28,28,28,28,28,28,28,23,23,23,23,20,20,20,20,20,20,15,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,12,15,15,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,15,15,12,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,12,12,12,15,15,15,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,15,15,15,12,12,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};\n      const uint8_t FLARE_TEXTURE_1[16384] ={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,7,7,7,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,7,7,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,7,7,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,7,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,7,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,12,12,12,12,12,12,12,12,12,12,12,15,15,15,15,15,15,15,15,15,15,15,15,12,12,12,12,12,12,12,12,12,12,12,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,12,12,12,12,12,12,12,12,12,15,15,15,15,20,20,20,20,20,20,20,20,20,20,20,20,20,15,15,15,15,12,12,12,12,12,12,12,12,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,12,12,12,12,15,15,15,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,15,15,15,12,12,12,12,12,12,12,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,12,12,12,12,12,12,12,15,15,20,20,20,20,20,20,20,20,20,20,20,23,23,23,23,23,20,20,20,20,20,20,20,20,20,20,20,15,15,12,12,12,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,12,12,12,15,15,20,20,20,20,20,20,20,23,23,23,23,28,28,28,28,28,28,28,28,28,23,23,23,23,20,20,20,20,20,20,20,15,15,12,12,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,12,12,15,15,20,20,20,20,20,20,23,23,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,23,23,23,20,20,20,20,20,20,15,15,12,12,12,12,12,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,12,15,15,20,20,20,20,20,23,23,28,28,28,28,28,28,28,28,31,31,31,31,31,31,31,31,28,28,28,28,28,28,28,28,23,23,20,20,20,20,20,15,15,12,12,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,12,15,15,20,20,20,20,23,23,28,28,28,28,28,28,31,31,36,36,36,36,36,36,36,36,36,36,36,36,31,31,31,28,28,28,28,28,28,23,20,20,20,20,20,15,15,12,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,12,15,20,20,20,20,20,23,28,28,28,28,28,31,31,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,31,31,28,28,28,28,23,23,20,20,20,20,15,15,12,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,15,15,20,20,20,20,23,28,28,28,28,28,31,36,36,36,36,36,39,39,39,44,44,44,44,44,44,44,44,44,39,39,36,36,36,36,36,36,31,28,28,28,28,23,20,20,20,20,20,15,12,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,15,15,20,20,20,20,23,28,28,28,28,31,36,36,36,36,39,39,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,39,36,36,36,36,36,31,28,28,28,28,23,20,20,20,20,15,12,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,15,15,20,20,20,23,23,28,28,28,31,36,36,36,36,39,44,44,44,44,44,47,47,52,52,52,52,52,52,52,52,47,47,47,44,44,44,44,39,39,36,36,36,31,28,28,28,28,23,20,20,20,20,15,12,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,15,15,20,20,20,23,28,28,28,28,31,36,36,36,39,44,44,44,44,47,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,47,47,44,44,44,39,39,36,36,36,31,28,28,28,23,20,20,20,20,15,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,12,15,20,20,20,23,28,28,28,31,36,36,36,39,44,44,44,44,47,52,52,52,52,55,55,60,60,60,60,60,60,60,60,60,55,55,52,52,52,52,47,44,44,44,39,36,36,36,31,28,28,28,23,20,20,20,20,15,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,15,20,20,20,23,28,28,28,31,36,36,36,39,44,44,44,47,52,52,52,55,60,60,60,60,60,63,63,63,63,63,63,60,60,60,60,60,55,55,52,52,52,47,44,44,44,39,36,36,31,28,28,28,23,20,20,20,15,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,15,20,20,20,23,28,28,28,31,36,36,36,39,44,44,47,52,52,52,55,60,60,60,63,68,68,68,68,68,68,68,68,68,68,68,68,63,60,60,60,60,55,52,52,47,44,44,44,39,36,36,31,28,28,28,23,20,20,20,15,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,15,20,20,20,23,28,28,31,36,36,36,44,44,44,47,52,52,55,60,60,60,63,68,68,68,71,71,76,76,76,76,76,76,71,71,68,68,68,68,63,60,60,60,52,52,52,47,44,44,39,36,36,31,28,28,28,23,20,20,20,15,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,15,20,20,20,23,28,28,31,36,36,36,44,44,44,52,52,52,60,60,60,63,68,68,71,76,76,76,76,76,79,79,79,79,76,76,76,76,76,71,68,68,68,63,60,60,55,52,52,47,44,44,39,36,36,31,28,28,28,23,20,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,20,23,28,28,28,36,36,36,44,44,44,52,52,55,60,60,63,68,68,71,76,76,76,79,84,84,84,84,84,84,84,84,84,84,84,79,76,76,76,68,68,68,60,60,55,52,52,47,44,44,39,36,36,31,28,28,23,20,20,20,15,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,15,20,20,20,28,28,28,31,36,36,39,44,44,52,52,55,60,60,68,68,68,76,76,79,84,84,84,87,87,92,92,92,92,92,92,92,87,84,84,84,79,76,76,71,68,68,63,60,60,52,52,47,44,44,39,36,36,31,28,28,23,20,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,20,23,28,28,31,36,36,39,44,44,52,52,55,60,60,68,68,71,76,76,84,84,84,92,92,92,95,95,100,100,100,100,95,95,92,92,92,87,84,84,79,76,76,68,68,63,60,60,52,52,47,44,44,36,36,36,28,28,28,23,20,20,15,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,15,20,20,23,28,28,28,36,36,39,44,44,47,52,55,60,60,68,68,71,76,79,84,84,92,92,95,100,100,100,100,103,103,103,103,103,100,100,100,95,92,92,87,84,84,76,76,71,68,63,60,60,52,52,47,44,39,36,36,31,28,28,23,20,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,20,23,28,28,31,36,36,44,44,47,52,52,60,60,68,68,76,76,79,84,87,92,92,100,100,103,108,108,108,108,111,111,108,108,108,108,103,100,100,95,92,92,84,84,76,76,71,68,63,60,55,52,52,44,44,39,36,36,28,28,28,23,20,20,15,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,23,28,28,28,36,36,39,44,44,52,52,60,60,68,68,71,76,84,84,87,92,95,100,103,108,108,111,116,116,116,116,116,116,116,116,116,111,108,108,100,100,92,92,87,84,76,76,68,68,63,60,55,52,47,44,44,36,36,31,28,28,23,20,20,20,15,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,20,23,28,28,31,36,36,44,44,47,52,55,60,63,68,71,76,79,84,92,92,100,100,108,108,116,116,119,124,124,124,124,124,124,124,124,119,116,116,111,108,103,100,95,92,87,84,76,76,68,68,60,60,52,52,44,44,39,36,36,28,28,28,23,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,20,28,28,28,36,36,39,44,44,52,52,60,60,68,68,76,79,84,87,92,100,100,108,111,116,119,124,124,127,132,132,132,132,132,132,132,127,124,124,116,116,108,103,100,95,92,84,84,76,76,68,63,60,55,52,47,44,44,36,36,31,28,28,23,20,20,20,15,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,23,28,28,31,36,36,44,44,47,52,55,60,63,68,76,76,84,87,92,100,100,108,111,116,124,124,132,132,135,140,140,140,140,140,140,140,132,132,127,124,119,116,108,108,100,95,92,84,79,76,71,68,60,60,52,52,44,44,39,36,36,28,28,23,20,20,20,15,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,20,23,28,28,31,36,39,44,44,52,52,60,60,68,71,76,84,84,92,95,100,108,111,116,124,127,132,135,140,143,148,148,148,148,148,148,148,140,140,132,132,124,119,116,108,103,100,92,87,84,76,76,68,63,60,55,52,47,44,44,36,36,31,28,28,23,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,20,28,28,28,36,36,39,44,47,52,55,60,63,68,76,79,84,92,92,100,108,111,116,124,127,132,140,143,148,151,156,156,156,156,156,156,156,148,148,140,135,132,124,119,116,108,103,100,92,84,84,76,71,68,60,60,52,52,44,44,36,36,31,28,28,23,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,23,28,28,31,36,36,44,44,52,52,60,60,68,71,76,84,84,92,100,103,108,116,124,127,132,140,143,148,156,159,164,164,167,167,164,164,164,156,151,148,140,135,132,124,116,111,108,100,95,92,84,76,76,68,63,60,55,52,47,44,39,36,36,28,28,23,20,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,23,28,28,31,36,39,44,44,52,52,60,63,68,76,76,84,92,95,100,108,116,119,124,132,140,143,151,156,164,167,172,172,175,175,175,172,172,164,159,156,148,140,135,127,124,116,108,103,100,92,84,84,76,68,68,60,55,52,47,44,39,36,36,31,28,28,20,20,20,15,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,20,23,28,28,36,36,39,44,47,52,55,60,68,68,76,79,84,92,100,103,108,116,124,132,135,143,148,156,164,172,175,180,183,188,188,183,180,180,172,164,159,156,148,140,132,124,119,116,108,100,92,87,84,76,71,68,60,60,52,52,44,44,36,36,31,28,28,23,20,20,15,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,20,23,28,28,36,36,39,44,47,52,55,60,68,71,76,84,87,92,100,108,111,119,124,132,140,148,156,164,172,175,180,188,191,196,196,196,188,188,180,172,164,156,151,143,135,132,124,116,108,100,95,92,84,79,76,68,63,60,52,52,44,44,36,36,31,28,28,23,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,20,28,28,31,36,36,44,44,52,52,60,60,68,71,76,84,87,95,100,108,116,124,127,135,143,151,159,167,175,180,188,196,204,204,204,204,199,196,188,180,172,164,156,148,140,132,124,116,111,103,100,92,84,79,76,68,63,60,55,52,47,44,39,36,31,28,28,23,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,20,28,28,31,36,36,44,44,52,52,60,63,68,76,76,84,92,95,100,108,116,124,132,140,148,156,164,172,180,188,196,204,212,215,220,212,207,199,191,183,175,167,156,148,140,132,127,119,111,108,100,92,87,84,76,68,68,60,55,52,47,44,39,36,36,28,28,23,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,23,28,28,31,36,36,44,44,52,52,60,63,68,76,79,84,92,100,103,108,116,124,132,140,148,156,164,172,183,191,204,212,220,228,228,223,215,204,196,188,180,172,164,151,143,135,127,124,116,108,100,92,87,84,76,71,68,60,55,52,47,44,39,36,36,28,28,23,20,20,20,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,23,28,28,31,36,36,44,44,52,52,60,63,68,76,79,84,92,100,103,111,116,124,132,140,148,156,167,175,188,196,204,215,228,236,236,231,220,212,199,188,180,172,164,156,148,140,132,124,116,108,100,92,87,84,76,71,68,60,55,52,47,44,39,36,36,28,28,23,20,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,23,28,28,31,36,36,44,44,52,52,60,63,68,76,79,84,92,100,103,111,116,124,132,140,148,156,167,175,188,196,204,220,228,236,244,236,220,212,204,191,180,172,164,156,148,140,132,124,116,108,100,92,87,84,76,71,68,60,55,52,47,44,39,36,36,28,28,23,20,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,23,28,28,31,36,36,44,44,52,52,60,63,68,76,79,84,92,100,103,108,116,124,132,140,148,156,164,175,183,196,204,212,223,231,236,228,220,212,199,188,180,172,164,156,148,135,132,124,116,108,100,92,87,84,76,71,68,60,55,52,47,44,39,36,36,28,28,23,20,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,23,28,28,31,36,36,44,44,52,52,60,63,68,76,76,84,92,95,103,108,116,124,132,140,148,156,164,172,180,188,199,207,215,220,220,220,212,204,196,188,180,167,159,151,143,135,127,119,116,108,100,92,87,84,76,68,68,60,55,52,47,44,39,36,36,28,28,23,20,20,20,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,20,28,28,31,36,36,44,44,52,52,60,60,68,71,76,84,92,95,100,108,116,124,132,140,148,156,164,172,180,188,196,199,204,212,212,212,204,196,188,180,172,164,156,148,140,132,124,116,111,108,100,92,84,79,76,68,68,60,55,52,47,44,39,36,31,28,28,23,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,20,28,28,28,36,36,44,44,47,52,60,60,68,71,76,84,87,92,100,108,116,119,127,132,140,148,156,164,172,180,188,191,196,199,204,199,196,188,183,175,167,164,156,148,140,132,124,116,108,103,100,92,84,79,76,68,63,60,55,52,44,44,39,36,31,28,28,23,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,20,23,28,28,36,36,39,44,47,52,55,60,68,68,76,84,84,92,100,103,111,116,124,132,140,148,151,159,164,172,180,183,188,188,191,188,188,180,175,172,164,156,148,140,132,127,124,116,108,100,95,92,84,76,76,68,63,60,52,52,44,44,36,36,31,28,28,23,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,20,20,20,23,28,28,31,36,39,44,47,52,55,60,63,68,76,79,84,92,95,100,108,116,124,127,132,140,148,156,159,164,172,175,180,180,180,180,180,172,167,164,156,148,143,140,132,124,116,111,108,100,92,87,84,76,71,68,60,60,52,52,44,44,36,36,31,28,28,20,20,20,15,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,23,28,28,31,36,36,44,44,52,52,60,60,68,71,76,84,87,92,100,108,111,116,124,132,135,140,148,156,156,164,167,172,172,172,172,167,164,164,156,148,148,140,132,124,119,116,108,100,95,92,84,79,76,68,68,60,55,52,47,44,39,36,36,28,28,23,20,20,20,15,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,23,28,28,31,36,36,44,44,47,52,55,60,68,68,76,79,84,92,95,100,108,116,119,124,132,135,140,148,151,156,156,164,164,164,164,159,156,156,148,143,140,132,127,124,116,108,103,100,92,87,84,76,71,68,63,60,52,52,44,44,39,36,31,28,28,23,20,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,20,23,28,28,36,36,39,44,47,52,55,60,63,68,76,76,84,87,92,100,103,108,116,119,124,132,135,140,143,148,148,151,156,156,156,151,148,148,140,140,132,127,124,116,111,108,100,95,92,84,79,76,68,68,60,60,52,52,44,44,36,36,31,28,28,23,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,20,23,28,28,31,36,36,44,44,52,52,60,60,68,68,76,79,84,92,92,100,103,108,116,119,124,127,132,135,140,140,143,148,148,148,143,140,140,132,132,124,124,116,111,108,100,100,92,87,84,76,71,68,63,60,55,52,47,44,39,36,36,28,28,28,20,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,23,28,28,31,36,36,39,44,47,52,55,60,63,68,71,76,84,84,92,95,100,108,108,116,116,124,124,132,132,132,135,140,140,135,135,132,132,127,124,119,116,111,108,100,100,92,87,84,79,76,68,68,60,60,52,52,44,44,39,36,31,28,28,23,20,20,20,15,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,20,23,28,28,36,36,39,44,44,52,52,60,60,68,68,76,76,84,87,92,95,100,103,108,111,116,119,124,124,127,127,132,132,132,127,124,124,124,116,116,108,108,100,100,92,92,84,79,76,71,68,63,60,55,52,47,44,39,36,36,31,28,28,23,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,20,23,28,28,31,36,36,39,44,47,52,52,60,60,68,68,76,76,84,87,92,95,100,103,108,108,116,116,116,119,124,124,124,124,119,116,116,116,111,108,103,100,100,92,92,84,79,76,71,68,63,60,55,52,52,44,44,39,36,36,28,28,23,20,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,20,28,28,28,36,36,39,44,44,47,52,55,60,63,68,71,76,76,84,84,92,92,100,100,103,108,108,111,111,116,116,116,116,116,111,108,108,108,100,100,95,92,87,84,79,76,76,68,68,60,60,52,52,47,44,39,36,36,31,28,28,23,20,20,20,15,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,20,23,28,28,31,36,36,39,44,44,52,52,55,60,63,68,71,76,76,84,84,87,92,95,100,100,100,103,108,108,108,108,108,108,108,103,100,100,95,92,92,87,84,79,76,76,68,68,60,60,55,52,47,44,44,36,36,31,28,28,28,20,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,20,23,28,28,31,36,36,44,44,47,52,52,60,60,63,68,68,76,76,79,84,84,92,92,92,95,100,100,100,100,100,100,100,100,100,95,92,92,87,84,84,79,76,71,68,68,60,60,55,52,52,44,44,39,36,36,31,28,28,23,20,20,20,15,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,20,23,28,28,28,36,36,39,44,44,47,52,52,60,60,63,68,68,76,76,76,84,84,84,87,92,92,92,92,92,92,92,92,92,92,92,87,84,84,79,76,76,71,68,68,60,60,55,52,52,44,44,39,36,36,31,28,28,23,20,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,20,23,28,28,31,36,36,39,44,44,47,52,52,60,60,63,68,68,71,76,76,76,84,84,84,84,87,87,87,87,87,87,84,84,84,84,79,76,76,71,68,68,63,60,60,55,52,52,44,44,44,36,36,31,28,28,28,23,20,20,20,15,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,15,20,20,20,28,28,28,31,36,36,39,44,44,47,52,52,55,60,60,63,68,68,71,76,76,76,79,79,84,84,84,84,84,84,79,79,76,76,76,71,68,68,68,63,60,60,55,52,52,44,44,44,36,36,36,28,28,28,23,20,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,20,23,28,28,28,31,36,36,39,44,44,47,52,52,55,60,60,60,63,68,68,68,71,76,76,76,76,76,76,76,76,76,76,76,71,68,68,68,63,60,60,55,52,52,52,44,44,44,36,36,36,31,28,28,23,20,20,20,15,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,15,20,20,20,23,28,28,28,31,36,36,39,44,44,47,52,52,52,55,60,60,60,63,68,68,68,68,68,71,71,71,71,68,68,68,68,68,68,63,60,60,60,55,52,52,47,44,44,44,36,36,36,31,28,28,23,20,20,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,15,20,20,20,23,28,28,28,31,36,36,39,44,44,44,47,52,52,52,55,60,60,60,60,63,63,68,68,68,68,68,68,68,63,63,60,60,60,60,55,52,52,52,47,44,44,39,36,36,36,31,28,28,28,23,20,20,20,15,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,15,20,20,20,20,23,28,28,28,31,36,36,36,39,44,44,44,47,52,52,52,55,55,60,60,60,60,60,60,60,60,60,60,60,60,60,55,52,52,52,52,47,44,44,44,39,36,36,36,31,28,28,28,23,20,20,20,15,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,15,20,20,20,20,23,28,28,28,31,36,36,36,39,44,44,44,44,47,52,52,52,52,52,55,55,55,55,55,55,55,55,55,52,52,52,52,52,47,44,44,44,39,36,36,36,31,28,28,28,28,23,20,20,20,15,12,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,15,20,20,20,20,23,28,28,28,31,36,36,36,36,39,44,44,44,44,47,47,52,52,52,52,52,52,52,52,52,52,52,52,52,47,44,44,44,44,39,39,36,36,36,31,28,28,28,23,23,20,20,20,15,15,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,12,15,20,20,20,20,23,28,28,28,28,31,36,36,36,36,39,44,44,44,44,44,44,47,47,47,47,47,47,47,47,44,44,44,44,44,44,39,39,36,36,36,31,31,28,28,28,23,20,20,20,20,15,15,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,12,15,20,20,20,20,23,23,28,28,28,28,31,36,36,36,36,36,39,39,44,44,44,44,44,44,44,44,44,44,44,44,44,39,39,36,36,36,36,36,31,28,28,28,28,23,20,20,20,20,15,15,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,12,15,15,20,20,20,20,23,28,28,28,28,28,31,36,36,36,36,36,36,36,39,39,39,39,39,39,39,39,39,36,36,36,36,36,36,31,31,28,28,28,28,23,23,20,20,20,20,15,12,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,12,15,15,20,20,20,20,23,23,28,28,28,28,28,31,31,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,31,31,28,28,28,28,28,28,23,20,20,20,20,20,15,12,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,12,12,15,20,20,20,20,20,23,23,28,28,28,28,28,28,31,31,31,31,36,36,36,36,36,36,31,31,31,31,28,28,28,28,28,28,23,23,20,20,20,20,20,15,15,12,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,12,12,15,15,20,20,20,20,20,23,23,23,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,23,23,20,20,20,20,20,20,15,12,12,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,12,12,12,12,12,12,15,15,20,20,20,20,20,20,23,23,23,28,28,28,28,28,28,28,28,28,28,28,28,28,28,23,23,23,20,20,20,20,20,20,20,15,15,12,12,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,12,12,12,15,15,20,20,20,20,20,20,20,20,23,23,23,23,23,23,23,23,23,23,23,23,20,20,20,20,20,20,20,20,20,15,15,12,12,12,12,12,12,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,12,12,12,12,12,12,12,15,15,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,15,15,15,12,12,12,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,12,12,12,12,15,15,15,15,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,15,15,15,12,12,12,12,12,12,12,12,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,12,12,12,12,12,12,12,12,12,12,15,15,15,15,15,15,20,20,20,20,20,15,15,15,15,15,15,12,12,12,12,12,12,12,12,12,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,15,15,15,12,12,12,12,12,12,12,12,12,12,12,12,12,12,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,7,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,7,7,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,7,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,7,7,7,7,12,12,12,12,12,12,12,12,12,12,12,7,7,7,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};\n      const uint8_t FLARE_TEXTURE_2[16384] ={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,20,20,23,28,28,28,28,28,28,28,28,28,28,23,23,20,20,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,28,28,31,36,36,36,36,39,39,44,44,44,44,44,44,39,39,39,36,36,36,36,28,28,23,20,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,23,28,31,36,36,39,44,44,44,47,47,52,52,52,52,52,52,52,52,52,52,52,52,47,47,44,44,44,44,36,36,36,28,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,23,28,36,36,39,44,44,47,52,52,52,55,55,60,60,60,60,60,60,60,60,60,60,60,60,60,60,55,55,52,52,52,52,47,44,44,39,36,31,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,28,36,36,44,44,47,52,52,55,60,60,60,60,63,63,68,68,68,68,68,68,68,68,68,68,68,68,68,68,63,63,60,60,60,60,55,52,52,52,44,44,39,36,31,28,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,31,36,44,44,47,52,52,60,60,60,63,68,68,68,68,68,71,71,76,76,76,76,76,76,76,76,76,76,76,76,71,71,68,68,68,68,68,63,60,60,60,55,52,52,47,44,39,36,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,36,39,44,47,52,52,60,60,60,63,68,68,68,71,76,76,76,76,76,76,79,79,79,79,84,84,84,84,84,79,79,79,79,76,76,76,76,76,71,71,68,68,68,63,60,60,55,52,52,44,44,36,31,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,36,39,44,52,52,55,60,60,63,68,68,71,76,76,76,76,79,79,84,84,84,84,84,84,84,84,84,87,87,87,84,84,84,84,84,84,84,84,84,79,79,76,76,76,71,68,68,68,63,60,60,52,52,47,44,36,31,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,36,39,44,52,52,60,60,63,68,68,71,76,76,76,79,84,84,84,84,84,87,87,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,87,87,84,84,84,84,79,76,76,76,71,68,68,68,60,60,55,52,47,44,36,28,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,31,36,44,52,52,60,60,63,68,68,76,76,76,79,84,84,84,84,87,92,92,92,92,92,92,95,95,95,100,100,100,100,100,100,100,100,95,95,95,95,92,92,92,92,92,92,87,84,84,84,79,76,76,76,71,68,68,60,60,55,52,47,44,36,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,36,44,47,52,60,60,63,68,71,76,76,76,84,84,84,87,92,92,92,92,92,95,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,95,95,92,92,92,92,87,84,84,84,79,76,76,71,68,68,63,60,55,52,44,39,36,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,36,39,44,52,55,60,63,68,71,76,76,79,84,84,84,87,92,92,92,95,100,100,100,100,100,100,103,103,108,108,108,108,108,108,108,108,108,108,108,108,108,108,103,103,103,100,100,100,100,100,95,92,92,92,92,87,84,84,79,76,76,71,68,68,60,60,52,52,44,36,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,36,44,52,52,60,63,68,68,76,76,79,84,84,87,92,92,92,95,100,100,100,100,103,103,108,108,108,108,108,108,108,108,111,111,111,111,111,111,111,111,111,108,108,108,108,108,108,108,108,103,100,100,100,100,95,92,92,92,87,84,84,84,76,76,71,68,68,60,55,52,44,39,36,23,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,31,39,44,52,55,60,68,68,76,76,79,84,84,87,92,92,92,95,100,100,100,103,108,108,108,108,108,111,111,111,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,111,111,108,108,108,108,108,103,100,100,100,100,95,92,92,87,84,84,79,76,76,71,68,63,60,52,52,44,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,23,36,44,47,52,60,63,68,71,76,76,84,84,87,92,92,92,100,100,100,103,103,108,108,108,108,111,116,116,116,116,116,116,116,116,119,119,119,119,119,119,119,119,119,119,119,116,116,116,116,116,116,116,111,111,108,108,108,108,103,100,100,100,95,92,92,87,84,84,79,76,76,68,68,60,55,52,44,36,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,44,52,55,60,68,68,76,76,79,84,84,92,92,92,100,100,100,103,108,108,108,108,111,116,116,116,116,116,119,119,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,119,119,116,116,116,116,116,111,111,108,108,108,103,100,100,100,95,92,92,87,84,84,76,76,71,68,63,60,52,47,39,31,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,44,52,60,60,68,71,76,76,84,84,87,92,92,95,100,100,103,108,108,108,111,116,116,116,116,119,119,124,124,124,124,124,124,124,124,127,127,127,127,127,127,127,127,127,127,127,124,124,124,124,124,124,124,119,119,116,116,116,116,111,108,108,108,103,100,100,100,95,92,92,84,84,79,76,76,68,63,60,52,47,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,36,44,52,60,63,68,71,76,79,84,84,92,92,95,100,100,103,108,108,108,111,116,116,116,116,119,124,124,124,124,124,127,127,127,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,127,127,124,124,124,124,124,119,119,116,116,116,111,111,108,108,103,100,100,100,92,92,87,84,84,76,76,68,68,60,55,52,44,36,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,39,44,52,60,63,68,76,76,84,84,87,92,92,100,100,100,108,108,108,111,116,116,116,119,124,124,124,124,124,127,132,132,132,132,132,132,132,132,132,135,135,135,135,135,135,135,135,135,132,132,132,132,132,132,132,132,127,127,124,124,124,124,119,116,116,116,111,108,108,108,103,100,100,95,92,92,84,84,79,76,71,68,60,55,52,44,36,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,39,47,52,60,63,68,76,76,84,84,92,92,95,100,100,103,108,108,111,116,116,116,119,124,124,124,124,127,132,132,132,132,132,132,135,135,135,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,135,135,135,132,132,132,132,132,127,127,124,124,124,119,116,116,116,111,108,108,108,100,100,100,92,92,87,84,79,76,71,68,60,55,52,44,36,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,39,47,52,60,68,68,76,76,84,84,92,92,95,100,100,108,108,108,111,116,116,119,124,124,124,124,127,132,132,132,132,135,135,140,140,140,140,140,140,140,140,140,140,140,143,143,140,140,140,140,140,140,140,140,140,140,140,135,135,132,132,132,132,132,127,124,124,124,119,116,116,116,111,108,108,103,100,100,95,92,87,84,84,76,71,68,60,55,52,44,36,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,44,52,60,68,68,76,79,84,87,92,92,100,100,103,108,108,111,116,116,116,119,124,124,124,127,132,132,132,132,135,140,140,140,140,140,140,143,143,143,148,148,148,148,148,148,148,148,148,148,148,148,143,143,143,140,140,140,140,140,140,135,135,132,132,132,132,127,124,124,124,119,116,116,111,108,108,108,100,100,95,92,92,84,84,76,71,68,60,55,52,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,36,44,52,60,68,68,76,79,84,87,92,92,100,100,103,108,108,111,116,116,119,124,124,124,127,132,132,132,135,135,140,140,140,140,143,143,143,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,143,143,140,140,140,140,140,135,132,132,132,132,127,124,124,124,116,116,116,111,108,108,100,100,95,92,92,84,84,76,71,68,60,55,52,44,31,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,36,44,52,60,63,68,76,79,84,87,92,95,100,100,108,108,108,116,116,116,124,124,124,127,132,132,132,135,135,140,140,140,140,143,148,148,148,148,148,148,148,151,151,151,151,151,151,156,156,156,151,151,151,151,151,148,148,148,148,148,148,148,143,143,140,140,140,140,135,132,132,132,127,124,124,124,119,116,116,111,108,108,103,100,100,92,92,84,84,76,71,68,60,55,52,39,28,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,44,52,60,63,68,76,79,84,87,92,95,100,100,108,108,111,116,116,119,124,124,124,127,132,132,132,135,140,140,140,143,143,148,148,148,148,148,151,151,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,151,151,148,148,148,148,148,148,143,140,140,140,140,135,132,132,132,127,124,124,119,116,116,111,108,108,103,100,100,92,92,84,84,76,71,68,60,52,47,39,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,31,44,52,60,63,68,76,76,84,87,92,95,100,100,108,108,111,116,116,119,124,124,127,132,132,132,135,140,140,140,143,143,148,148,148,148,151,151,156,156,156,156,156,156,156,156,156,159,159,159,159,159,159,159,156,156,156,156,156,156,156,156,156,151,148,148,148,148,148,143,140,140,140,140,135,132,132,127,124,124,124,116,116,116,108,108,103,100,100,92,92,84,84,76,71,68,60,52,44,36,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,39,47,55,60,68,76,76,84,87,92,95,100,100,108,108,111,116,116,119,124,124,127,132,132,135,140,140,140,140,143,148,148,148,148,151,156,156,156,156,156,156,159,159,159,164,164,164,164,164,164,164,164,164,164,164,164,159,159,159,156,156,156,156,156,156,151,151,148,148,148,148,143,140,140,140,135,132,132,132,127,124,124,119,116,116,108,108,103,100,100,92,92,84,79,76,68,68,60,52,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,36,44,52,60,68,71,76,84,84,92,92,100,100,108,108,111,116,116,124,124,124,127,132,132,135,140,140,140,143,148,148,148,148,151,156,156,156,156,156,159,159,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,159,159,156,156,156,156,156,151,148,148,148,143,143,140,140,140,132,132,132,127,124,124,119,116,116,108,108,103,100,95,92,87,84,79,76,68,63,60,52,44,31,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,44,52,60,68,71,76,84,84,92,92,100,100,108,108,111,116,116,124,124,124,132,132,132,135,140,140,143,148,148,148,148,151,156,156,156,156,159,159,164,164,164,164,164,164,164,167,167,167,167,167,167,167,167,167,167,167,167,164,164,164,164,164,164,164,164,159,156,156,156,156,151,151,148,148,148,143,140,140,140,135,132,132,127,124,124,119,116,116,108,108,103,100,95,92,87,84,76,76,68,60,55,47,36,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,39,52,55,63,68,76,79,84,92,92,100,100,108,108,111,116,116,124,124,124,132,132,132,140,140,140,143,148,148,148,151,156,156,156,156,159,159,164,164,164,164,164,167,167,167,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,167,167,164,164,164,164,164,164,159,156,156,156,156,151,148,148,148,143,140,140,140,135,132,132,127,124,124,119,116,116,108,108,103,100,95,92,87,84,76,71,68,60,52,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,36,44,52,60,68,76,76,84,87,92,95,100,103,108,111,116,116,124,124,124,132,132,132,140,140,140,143,148,148,148,151,156,156,156,159,159,164,164,164,164,167,167,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,167,167,164,164,164,164,164,159,156,156,156,156,151,148,148,148,143,140,140,135,132,132,127,124,124,119,116,116,108,108,100,100,92,92,84,84,76,68,63,60,52,44,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,31,44,52,60,68,71,76,84,84,92,95,100,103,108,108,116,116,119,124,124,132,132,135,140,140,140,143,148,148,151,156,156,156,156,159,164,164,164,164,167,167,172,172,172,172,172,172,175,175,175,175,175,180,180,180,180,180,175,175,175,175,172,172,172,172,172,172,172,167,164,164,164,164,164,159,156,156,156,151,148,148,148,143,140,140,135,132,132,127,124,124,119,116,111,108,108,100,100,92,92,84,79,76,68,60,55,47,36,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,36,47,55,63,68,76,79,84,92,92,100,100,108,108,116,116,119,124,124,132,132,132,140,140,140,143,148,148,151,156,156,156,159,164,164,164,164,167,167,172,172,172,172,172,175,175,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,175,175,175,172,172,172,172,172,167,164,164,164,164,159,156,156,156,151,148,148,148,143,140,140,135,132,132,127,124,124,116,116,111,108,103,100,95,92,87,84,76,71,68,60,52,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,44,52,60,68,76,76,84,87,92,100,100,108,108,111,116,119,124,124,127,132,132,140,140,140,148,148,148,151,156,156,156,159,164,164,164,167,167,172,172,172,172,175,175,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,175,175,172,172,172,172,172,167,164,164,164,164,159,156,156,156,148,148,148,143,140,140,135,132,132,127,124,124,116,116,111,108,103,100,95,92,84,84,76,68,63,55,52,39,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,39,52,60,63,68,76,84,84,92,95,100,103,108,111,116,116,124,124,127,132,132,140,140,140,143,148,148,151,156,156,156,159,164,164,164,167,172,172,172,172,175,175,180,180,180,180,180,180,183,183,183,183,188,188,188,188,188,188,188,183,183,183,180,180,180,180,180,180,180,175,172,172,172,172,167,167,164,164,164,159,156,156,156,148,148,148,143,140,140,135,132,132,124,124,119,116,116,108,108,100,100,92,92,84,79,76,68,60,52,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,44,52,60,68,76,79,84,92,92,100,100,108,108,116,116,124,124,127,132,132,135,140,140,143,148,148,151,156,156,156,159,164,164,164,167,172,172,172,175,175,180,180,180,180,180,183,183,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,183,183,183,180,180,180,180,180,175,172,172,172,172,167,164,164,164,159,156,156,156,148,148,148,143,140,140,135,132,132,124,124,119,116,111,108,103,100,95,92,87,84,76,68,63,60,52,39,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,39,52,60,63,71,76,84,87,92,95,100,108,108,111,116,119,124,124,132,132,135,140,140,143,148,148,151,156,156,156,164,164,164,167,172,172,172,172,175,180,180,180,180,180,183,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,183,183,180,180,180,180,175,175,172,172,172,167,164,164,164,159,156,156,156,148,148,148,140,140,140,132,132,127,124,124,116,116,111,108,103,100,92,92,84,79,76,68,60,52,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,20,36,44,52,60,68,76,79,84,92,92,100,103,108,111,116,116,124,124,127,132,135,140,140,143,148,148,151,156,156,156,164,164,164,167,172,172,172,175,175,180,180,180,180,183,188,188,188,188,188,188,191,191,191,191,196,196,196,196,196,196,191,191,191,191,188,188,188,188,188,188,183,183,180,180,180,180,175,172,172,172,167,164,164,164,159,156,156,151,148,148,148,140,140,135,132,132,127,124,119,116,116,108,108,100,100,92,87,84,76,71,63,60,52,39,28,0,0,0,0,0,0,0,0,0,0,0,0,28,39,52,60,63,71,76,84,87,92,100,100,108,108,116,116,119,124,127,132,132,140,140,143,148,148,151,156,156,156,159,164,164,167,172,172,172,175,180,180,180,180,183,188,188,188,188,188,191,191,191,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,191,191,188,188,188,188,188,183,180,180,180,180,175,172,172,172,167,164,164,164,159,156,156,151,148,148,143,140,140,135,132,132,124,124,119,116,111,108,103,100,92,92,84,79,76,68,60,52,44,36,15,0,0,0,0,0,0,0,0,0,0,12,31,44,52,60,68,76,79,84,92,92,100,103,108,111,116,119,124,124,132,132,135,140,140,148,148,148,156,156,156,159,164,164,167,172,172,172,175,180,180,180,180,183,188,188,188,188,191,191,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,191,191,188,188,188,188,188,183,180,180,180,175,172,172,172,167,164,164,164,159,156,156,151,148,148,143,140,140,132,132,127,124,124,116,116,108,108,100,100,92,87,84,76,68,63,55,47,36,23,0,0,0,0,0,0,0,0,0,0,23,36,47,55,63,68,76,84,87,92,100,100,108,108,116,116,124,124,127,132,132,140,140,143,148,148,151,156,156,159,164,164,167,172,172,172,175,180,180,180,183,188,188,188,188,191,191,196,196,196,196,196,196,199,199,199,199,199,204,204,199,199,199,199,199,196,196,196,196,196,196,196,191,188,188,188,188,183,180,180,180,175,172,172,172,167,164,164,164,156,156,156,151,148,148,140,140,135,132,132,124,124,119,116,111,108,103,100,92,92,84,79,76,68,60,52,44,31,12,0,0,0,0,0,0,0,0,0,28,44,52,60,68,76,76,84,92,92,100,103,108,111,116,119,124,124,132,132,135,140,140,148,148,151,156,156,159,164,164,164,172,172,172,175,180,180,180,183,188,188,188,188,191,196,196,196,196,196,199,199,199,204,204,204,204,204,204,204,204,204,204,204,204,204,199,199,196,196,196,196,196,191,191,188,188,188,183,180,180,180,175,172,172,172,167,164,164,159,156,156,151,148,148,143,140,140,135,132,127,124,124,116,116,108,108,100,95,92,87,84,76,68,63,55,44,36,20,0,0,0,0,0,0,0,0,20,36,44,52,60,68,76,84,84,92,95,100,108,108,116,116,124,124,127,132,135,140,140,143,148,148,156,156,156,164,164,164,167,172,172,175,180,180,180,183,188,188,188,188,191,196,196,196,196,199,199,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,199,199,196,196,196,196,196,191,188,188,188,183,180,180,180,175,172,172,172,167,164,164,159,156,156,151,148,148,143,140,135,132,132,124,124,119,116,111,108,103,100,92,92,84,76,71,68,60,52,39,28,0,0,0,0,0,0,0,0,23,36,47,60,63,71,76,84,87,92,100,103,108,111,116,119,124,124,132,132,135,140,143,148,148,151,156,156,159,164,164,167,172,172,175,180,180,180,183,188,188,188,191,191,196,196,196,196,199,204,204,204,204,204,204,204,207,207,207,207,207,207,207,207,207,204,204,204,204,204,204,199,199,196,196,196,196,191,188,188,188,183,180,180,180,175,172,172,172,164,164,164,159,156,156,148,148,143,140,140,135,132,127,124,124,116,116,108,108,100,95,92,84,79,76,68,60,52,44,31,12,0,0,0,0,0,0,7,28,44,52,60,68,76,79,84,92,95,100,103,108,116,116,124,124,127,132,135,140,140,143,148,148,156,156,159,164,164,167,172,172,172,175,180,180,183,188,188,188,191,196,196,196,196,199,204,204,204,204,204,204,207,207,212,212,212,212,212,212,212,212,212,212,207,207,207,204,204,204,204,204,199,196,196,196,196,191,188,188,188,183,180,180,180,175,172,172,167,164,164,159,156,156,151,148,148,143,140,135,132,132,124,124,119,116,111,108,100,100,92,87,84,76,68,63,55,47,36,20,0,0,0,0,0,0,20,36,44,52,60,68,76,84,87,92,100,100,108,108,116,116,124,124,132,132,135,140,143,148,148,151,156,156,159,164,164,167,172,172,175,180,180,180,188,188,188,191,196,196,196,196,199,204,204,204,204,207,207,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,207,207,204,204,204,204,199,199,196,196,196,191,188,188,188,183,180,180,180,172,172,172,167,164,164,159,156,156,148,148,143,140,140,135,132,127,124,119,116,111,108,103,100,92,92,84,76,71,68,60,52,39,28,0,0,0,0,0,0,23,36,47,60,63,71,76,84,92,92,100,103,108,111,116,119,124,127,132,132,140,140,143,148,148,156,156,159,164,164,167,172,172,175,180,180,180,183,188,188,188,191,196,196,196,199,204,204,204,204,207,212,212,212,212,212,212,212,212,215,215,215,215,215,212,212,212,212,212,212,212,207,207,204,204,204,204,199,196,196,196,191,188,188,188,183,180,180,175,172,172,167,164,164,159,156,156,151,148,148,143,140,135,132,132,124,124,116,116,108,108,100,95,92,84,79,76,68,60,52,44,31,12,0,0,0,0,0,28,39,52,60,68,76,79,84,92,95,100,108,108,116,116,124,124,132,132,135,140,140,148,148,151,156,156,159,164,164,167,172,172,175,180,180,183,188,188,188,191,196,196,196,199,204,204,204,204,207,212,212,212,212,212,215,215,215,220,220,220,220,220,220,215,215,215,212,212,212,212,212,212,207,204,204,204,204,199,196,196,196,191,188,188,183,180,180,180,175,172,172,167,164,164,159,156,156,148,148,143,140,140,132,132,127,124,119,116,111,108,100,100,92,87,84,76,68,63,55,44,36,20,0,0,0,0,12,31,44,52,60,68,76,84,84,92,100,100,108,108,116,119,124,124,132,132,140,140,143,148,148,156,156,159,164,164,167,172,172,175,180,180,180,188,188,188,191,196,196,196,199,204,204,204,207,207,212,212,212,212,215,215,220,220,220,220,220,220,220,220,220,220,220,220,220,215,212,212,212,212,212,207,204,204,204,199,199,196,196,191,188,188,188,183,180,180,175,172,172,167,164,164,159,156,156,151,148,148,140,140,135,132,127,124,124,116,111,108,103,100,92,92,84,76,71,68,60,47,36,23,0,0,0,0,20,36,44,55,63,68,76,84,87,92,100,103,108,111,116,119,124,127,132,135,140,140,148,148,151,156,156,159,164,164,167,172,172,175,180,180,183,188,188,191,196,196,196,199,204,204,204,207,207,212,212,212,215,215,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,215,215,212,212,212,212,207,204,204,204,199,196,196,196,191,188,188,188,180,180,180,175,172,172,167,164,164,159,156,156,148,148,143,140,135,132,132,124,124,116,116,108,108,100,95,92,84,79,76,68,60,52,39,28,0,0,0,0,20,36,47,60,68,71,76,84,92,92,100,103,108,116,116,124,124,132,132,135,140,143,148,148,151,156,156,164,164,167,172,172,175,180,180,180,188,188,188,191,196,196,196,204,204,204,204,207,212,212,212,215,215,220,220,220,220,220,223,223,223,223,223,223,223,223,220,220,220,220,220,220,215,212,212,212,212,207,204,204,204,199,196,196,196,191,188,188,183,180,180,175,172,172,167,164,164,159,156,156,151,148,143,140,140,132,132,127,124,119,116,111,108,100,100,92,84,84,76,68,60,52,44,31,12,0,0,0,28,39,52,60,68,76,79,84,92,95,100,108,108,116,116,124,124,132,132,140,140,143,148,148,156,156,159,164,164,167,172,172,175,180,180,183,188,188,191,196,196,196,199,204,204,204,207,212,212,212,215,220,220,220,220,220,223,223,228,228,228,228,228,228,228,228,228,223,223,220,220,220,220,215,212,212,212,212,207,204,204,204,199,196,196,191,188,188,188,180,180,180,175,172,172,164,164,164,156,156,151,148,148,140,140,135,132,127,124,119,116,111,108,103,100,92,87,84,76,68,60,52,44,36,15,0,0,0,28,44,52,60,68,76,79,84,92,100,100,108,111,116,119,124,127,132,132,140,140,143,148,151,156,156,159,164,164,172,172,172,180,180,180,188,188,188,191,196,196,199,204,204,204,207,212,212,212,215,220,220,220,220,223,223,228,228,228,228,228,228,228,228,228,228,228,228,228,223,220,220,220,220,215,212,212,212,207,204,204,204,199,196,196,196,191,188,188,183,180,180,175,172,172,167,164,164,159,156,156,148,148,143,140,135,132,132,124,124,116,116,108,103,100,92,92,84,76,71,63,55,47,36,20,0,0,12,31,44,52,60,68,76,84,87,92,100,100,108,111,116,119,124,127,132,135,140,140,148,148,151,156,156,164,164,167,172,172,175,180,180,183,188,188,191,196,196,196,199,204,204,207,212,212,212,215,215,220,220,220,223,228,228,228,228,228,228,228,231,231,228,228,228,228,228,228,228,223,220,220,220,220,215,212,212,212,207,204,204,204,199,196,196,191,188,188,183,180,180,180,172,172,167,164,164,159,156,156,148,148,143,140,140,132,132,124,124,116,116,108,108,100,95,92,84,79,71,68,60,52,36,23,0,0,15,36,44,55,63,68,76,84,87,92,100,103,108,111,116,124,124,127,132,135,140,143,148,148,156,156,159,164,164,167,172,172,175,180,180,183,188,188,191,196,196,199,204,204,204,207,212,212,212,215,220,220,220,223,228,228,228,228,228,231,231,231,236,236,236,231,231,231,228,228,228,228,223,220,220,220,220,215,212,212,212,207,204,204,199,196,196,196,188,188,188,183,180,180,175,172,172,164,164,159,156,156,151,148,143,140,140,132,132,127,124,119,116,108,108,100,95,92,84,79,76,68,60,52,39,28,0,0,20,36,47,55,63,71,76,84,92,92,100,103,108,116,116,124,124,132,132,135,140,143,148,148,156,156,159,164,164,167,172,172,180,180,180,188,188,188,191,196,196,199,204,204,204,212,212,212,215,220,220,220,223,228,228,228,228,231,231,236,236,236,236,236,236,236,236,236,231,228,228,228,228,223,220,220,220,215,212,212,212,207,204,204,204,196,196,196,191,188,188,183,180,180,175,172,172,167,164,164,156,156,151,148,148,140,140,135,132,127,124,119,116,111,108,100,100,92,84,79,76,68,60,52,44,28,0,0,20,36,47,60,68,71,76,84,92,95,100,108,108,116,116,124,124,132,132,140,140,143,148,151,156,156,159,164,164,172,172,175,180,180,183,188,188,191,196,196,196,199,204,204,207,212,212,212,215,220,220,220,223,228,228,228,231,231,236,236,236,236,236,236,236,236,236,236,236,231,228,228,228,228,223,220,220,220,215,212,212,207,204,204,204,199,196,196,191,188,188,183,180,180,175,172,172,167,164,164,159,156,151,148,148,140,140,135,132,127,124,119,116,111,108,100,100,92,87,84,76,68,60,52,44,28,7,0,23,36,52,60,68,76,79,84,92,95,100,108,108,116,116,124,124,132,132,140,140,148,148,151,156,156,164,164,167,172,172,175,180,180,183,188,188,191,196,196,199,204,204,204,207,212,212,215,220,220,220,223,228,228,228,231,231,236,236,236,236,239,239,239,239,236,236,236,236,236,231,228,228,228,223,220,220,220,215,212,212,212,207,204,204,199,196,196,191,188,188,188,180,180,180,172,172,167,164,164,159,156,156,148,148,143,140,135,132,127,124,119,116,111,108,103,100,92,87,84,76,68,60,52,44,31,12,0,28,39,52,60,68,76,79,84,92,95,100,108,108,116,119,124,127,132,132,140,140,148,148,151,156,156,164,164,167,172,172,175,180,180,183,188,188,191,196,196,199,204,204,204,212,212,212,215,220,220,220,223,228,228,228,231,236,236,236,236,239,244,244,244,244,239,239,236,236,236,236,231,228,228,228,223,220,220,220,212,212,212,207,204,204,199,196,196,196,188,188,188,183,180,180,172,172,172,164,164,159,156,156,148,148,143,140,135,132,132,124,124,116,116,108,103,100,92,87,84,76,68,63,52,44,36,12,0,28,39,52,60,68,76,79,84,92,100,100,108,111,116,119,124,127,132,135,140,140,148,148,151,156,156,164,164,167,172,172,175,180,180,183,188,188,191,196,196,199,204,204,207,212,212,212,215,220,220,223,228,228,228,231,236,236,236,236,239,244,244,244,244,244,244,244,239,236,236,236,231,228,228,228,223,220,220,220,215,212,212,207,204,204,204,199,196,196,191,188,188,183,180,180,175,172,172,164,164,159,156,156,148,148,143,140,140,132,132,124,124,116,116,108,103,100,92,92,84,76,68,63,55,44,36,15,0,28,44,52,60,68,76,79,84,92,100,100,108,111,116,119,124,127,132,135,140,140,148,148,151,156,159,164,164,167,172,172,175,180,180,188,188,188,196,196,196,199,204,204,207,212,212,212,220,220,220,223,228,228,228,231,236,236,236,239,244,244,244,244,244,244,244,244,239,239,236,236,236,231,228,228,223,220,220,220,215,212,212,212,204,204,204,199,196,196,191,188,188,183,180,180,175,172,172,164,164,159,156,156,151,148,143,140,140,132,132,124,124,116,116,108,103,100,92,92,84,76,71,63,55,44,36,20,0,28,44,52,60,68,76,84,84,92,100,100,108,111,116,119,124,127,132,135,140,140,148,148,151,156,159,164,164,167,172,172,180,180,180,188,188,188,196,196,196,199,204,204,207,212,212,215,220,220,220,223,228,228,228,231,236,236,239,244,244,244,244,247,247,244,244,244,244,239,236,236,236,231,228,228,228,223,220,220,215,212,212,212,204,204,204,199,196,196,191,188,188,183,180,180,175,172,172,164,164,159,156,156,151,148,143,140,140,132,132,124,124,116,116,108,103,100,95,92,84,76,71,63,55,47,36,20,0,28,44,52,60,68,76,84,87,92,100,100,108,111,116,119,124,127,132,135,140,143,148,148,156,156,159,164,164,167,172,172,180,180,180,188,188,188,196,196,196,204,204,204,207,212,212,215,220,220,220,223,228,228,231,236,236,236,239,244,244,244,247,252,252,247,244,244,244,239,236,236,236,231,228,228,228,223,220,220,215,212,212,212,207,204,204,199,196,196,191,188,188,183,180,180,175,172,172,167,164,164,156,156,151,148,143,140,140,132,132,124,124,116,116,108,108,100,95,92,84,76,71,63,55,47,36,20,0,28,44,52,60,68,76,84,87,92,100,100,108,111,116,119,124,127,132,135,140,143,148,148,156,156,159,164,164,167,172,172,180,180,180,188,188,188,196,196,196,204,204,204,207,212,212,215,220,220,220,223,228,228,231,236,236,236,239,244,244,244,247,252,252,247,244,244,244,239,236,236,236,231,228,228,228,223,220,220,215,212,212,212,207,204,204,199,196,196,191,188,188,183,180,180,175,172,172,167,164,164,156,156,151,148,143,140,140,132,132,124,124,116,116,108,108,100,95,92,84,76,71,63,55,47,36,20,0,28,44,52,60,68,76,84,87,92,100,100,108,111,116,119,124,127,132,135,140,140,148,148,156,156,159,164,164,167,172,172,180,180,180,188,188,188,196,196,196,199,204,204,207,212,212,215,220,220,220,223,228,228,228,236,236,236,239,244,244,244,244,247,247,247,244,244,244,239,236,236,236,231,228,228,228,223,220,220,215,212,212,212,207,204,204,199,196,196,191,188,188,183,180,180,175,172,172,167,164,159,156,156,151,148,143,140,140,132,132,124,124,116,116,108,103,100,95,92,84,76,71,63,55,47,36,20,0,28,44,52,60,68,76,84,84,92,100,100,108,111,116,119,124,127,132,135,140,140,148,148,151,156,159,164,164,167,172,172,180,180,180,188,188,188,196,196,196,199,204,204,207,212,212,215,220,220,220,223,228,228,228,231,236,236,236,239,244,244,244,244,244,244,244,244,244,239,236,236,236,231,228,228,228,220,220,220,215,212,212,212,204,204,204,199,196,196,191,188,188,183,180,180,175,172,172,164,164,159,156,156,151,148,143,140,140,132,132,124,124,116,116,108,103,100,92,92,84,76,71,63,55,44,36,20,0,28,39,52,60,68,76,79,84,92,100,100,108,111,116,119,124,127,132,135,140,140,148,148,151,156,159,164,164,167,172,172,175,180,180,188,188,188,191,196,196,199,204,204,207,212,212,212,215,220,220,223,228,228,228,231,236,236,236,239,244,244,244,244,244,244,244,244,239,236,236,236,231,228,228,228,223,220,220,220,215,212,212,207,204,204,204,199,196,196,191,188,188,183,180,180,175,172,172,164,164,159,156,156,151,148,143,140,140,132,132,124,124,116,116,108,103,100,92,92,84,76,71,63,55,44,36,20,0,28,39,52,60,68,76,79,84,92,95,100,108,111,116,119,124,127,132,135,140,140,148,148,151,156,156,164,164,167,172,172,175,180,180,183,188,188,191,196,196,199,204,204,207,212,212,212,215,220,220,220,228,228,228,231,236,236,236,236,239,239,244,244,244,244,244,239,236,236,236,236,231,228,228,228,223,220,220,220,215,212,212,207,204,204,204,196,196,196,191,188,188,183,180,180,175,172,172,164,164,159,156,156,148,148,143,140,135,132,132,124,124,116,116,108,103,100,92,87,84,76,68,63,55,44,36,15,0,23,39,52,60,68,76,79,84,92,95,100,108,108,116,119,124,127,132,132,140,140,148,148,151,156,156,164,164,167,172,172,175,180,180,183,188,188,191,196,196,199,204,204,204,207,212,212,215,220,220,220,223,228,228,228,231,236,236,236,236,239,239,239,239,239,239,236,236,236,236,231,228,228,228,228,223,220,220,215,212,212,212,207,204,204,199,196,196,196,188,188,188,180,180,180,172,172,167,164,164,159,156,156,148,148,143,140,135,132,132,124,124,116,111,108,103,100,92,87,84,76,68,60,52,44,31,12,0,23,36,47,60,68,71,79,84,92,95,100,108,108,116,116,124,124,132,132,140,140,143,148,151,156,156,159,164,164,172,172,175,180,180,183,188,188,191,196,196,196,204,204,204,207,212,212,212,220,220,220,223,228,228,228,228,231,236,236,236,236,236,236,236,236,236,236,236,236,231,231,228,228,228,223,220,220,220,215,212,212,212,207,204,204,199,196,196,191,188,188,183,180,180,175,172,172,167,164,164,159,156,156,148,148,143,140,135,132,127,124,119,116,111,108,103,100,92,87,84,76,68,60,52,44,31,12,0,20,36,47,55,63,71,76,84,92,95,100,103,108,116,116,124,124,132,132,140,140,143,148,148,156,156,159,164,164,172,172,172,180,180,180,188,188,188,196,196,196,199,204,204,207,212,212,212,215,220,220,220,223,228,228,228,228,231,236,236,236,236,236,236,236,236,236,236,231,231,228,228,228,223,220,220,220,220,215,212,212,207,204,204,204,199,196,196,191,188,188,183,180,180,175,172,172,167,164,164,156,156,151,148,148,140,140,135,132,127,124,119,116,111,108,100,100,92,87,84,76,68,60,52,44,28,0,0,20,36,44,55,63,68,76,84,92,92,100,103,108,116,116,124,124,132,132,135,140,143,148,148,156,156,159,164,164,167,172,172,175,180,180,183,188,188,191,196,196,199,204,204,204,207,212,212,212,215,220,220,220,223,228,228,228,228,231,231,236,236,236,236,236,236,231,231,228,228,228,228,228,223,220,220,220,215,212,212,212,207,204,204,199,196,196,196,191,188,188,183,180,180,175,172,172,167,164,164,156,156,151,148,148,140,140,132,132,127,124,119,116,108,108,100,95,92,84,79,76,68,60,52,44,28,0,0,12,36,44,52,60,68,76,84,87,92,100,103,108,111,116,119,124,127,132,135,140,140,148,148,151,156,156,164,164,167,172,172,175,180,180,183,188,188,191,196,196,196,199,204,204,207,212,212,212,215,220,220,220,220,223,228,228,228,228,228,231,231,231,231,231,231,228,228,228,228,228,228,223,220,220,220,215,212,212,212,207,204,204,204,199,196,196,191,188,188,188,180,180,180,172,172,172,164,164,159,156,156,151,148,143,140,140,132,132,124,124,116,116,108,108,100,95,92,84,79,76,68,60,52,39,28,0,0,7,28,44,52,60,68,76,84,87,92,100,100,108,111,116,119,124,127,132,135,140,140,148,148,151,156,156,164,164,164,172,172,175,180,180,183,188,188,188,191,196,196,199,204,204,204,207,212,212,212,215,220,220,220,220,223,228,228,228,228,228,228,228,228,228,228,228,228,228,228,223,223,220,220,220,220,215,212,212,212,207,204,204,204,196,196,196,191,188,188,183,180,180,175,172,172,167,164,164,159,156,156,148,148,143,140,135,132,132,124,124,116,116,108,103,100,95,92,84,76,71,68,60,47,36,20,0,0,0,28,44,52,60,68,76,79,84,92,95,100,108,108,116,116,124,124,132,132,140,140,143,148,148,156,156,159,164,164,167,172,172,175,180,180,183,188,188,191,196,196,196,199,204,204,207,212,212,212,212,215,220,220,220,220,223,223,228,228,228,228,228,228,228,228,228,228,228,223,220,220,220,220,220,215,212,212,212,207,204,204,204,199,196,196,196,188,188,188,183,180,180,175,172,172,167,164,164,156,156,151,148,148,140,140,135,132,127,124,119,116,111,108,103,100,92,87,84,76,68,63,55,44,36,20,0,0,0,23,36,52,60,68,71,79,84,92,95,100,108,108,116,116,124,124,132,132,135,140,143,148,148,156,156,159,164,164,167,172,172,175,180,180,183,188,188,188,196,196,196,199,204,204,204,207,212,212,212,212,215,220,220,220,220,220,223,223,223,228,228,228,228,228,223,223,223,220,220,220,220,220,215,212,212,212,207,204,204,204,199,196,196,196,191,188,188,183,180,180,180,172,172,172,164,164,159,156,156,151,148,148,140,140,132,132,127,124,119,116,111,108,100,100,92,87,84,76,68,60,52,44,31,12,0,0,0,20,36,47,55,63,71,76,84,92,92,100,103,108,111,116,119,124,127,132,135,140,140,148,148,151,156,156,164,164,164,172,172,172,180,180,180,183,188,188,191,196,196,196,199,204,204,204,207,212,212,212,212,215,220,220,220,220,220,220,220,223,223,223,223,220,220,220,220,220,220,220,215,215,212,212,212,207,207,204,204,204,199,196,196,191,188,188,188,183,180,180,175,172,172,167,164,164,159,156,156,148,148,143,140,140,132,132,124,124,116,116,108,108,100,95,92,84,79,76,68,60,52,44,28,0,0,0,0,15,36,44,52,60,68,76,84,87,92,100,100,108,111,116,119,124,127,132,132,140,140,143,148,148,156,156,159,164,164,167,172,172,175,180,180,183,188,188,188,191,196,196,196,199,204,204,204,207,212,212,212,212,215,215,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,215,212,212,212,212,207,207,204,204,204,199,196,196,196,191,188,188,183,180,180,180,172,172,172,164,164,164,156,156,151,148,148,143,140,135,132,132,124,124,116,116,108,103,100,95,92,84,79,71,68,60,52,39,28,0,0,0,0,0,28,44,52,60,68,76,79,84,92,95,100,108,108,116,116,124,124,132,132,135,140,143,148,148,151,156,156,164,164,164,172,172,172,180,180,180,183,188,188,191,196,196,196,199,204,204,204,204,207,212,212,212,212,212,215,215,220,220,220,220,220,220,220,220,220,220,215,215,215,212,212,212,212,207,207,204,204,204,199,196,196,196,191,188,188,188,183,180,180,175,172,172,167,164,164,159,156,156,151,148,148,140,140,135,132,127,124,119,116,111,108,103,100,92,87,84,76,71,63,55,47,36,20,0,0,0,0,0,28,39,52,60,68,71,76,84,92,92,100,103,108,111,116,119,124,127,132,135,140,140,148,148,151,156,156,159,164,164,167,172,172,175,180,180,180,188,188,188,191,196,196,196,199,204,204,204,204,207,207,212,212,212,212,212,212,215,215,215,215,215,215,215,215,215,212,212,212,212,212,212,207,204,204,204,204,199,196,196,196,191,188,188,188,183,180,180,180,172,172,172,164,164,164,156,156,151,148,148,143,140,140,132,132,124,124,119,116,108,108,100,100,92,87,84,76,68,60,52,44,36,15,0,0,0,0,0,20,36,44,55,63,68,76,84,87,92,100,100,108,111,116,119,124,127,132,132,140,140,143,148,148,156,156,156,164,164,164,172,172,172,175,180,180,183,188,188,188,191,196,196,196,199,199,204,204,204,204,207,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,207,207,204,204,204,204,199,196,196,196,191,191,188,188,183,180,180,180,175,172,172,167,164,164,159,156,156,151,148,148,140,140,135,132,127,124,124,116,116,108,108,100,95,92,84,79,76,68,60,52,44,28,0,0,0,0,0,0,12,31,44,52,60,68,76,79,84,92,95,100,108,108,116,116,124,124,132,132,135,140,140,148,148,151,156,156,159,164,164,167,172,172,175,180,180,180,183,188,188,188,191,196,196,196,199,199,204,204,204,204,207,207,207,212,212,212,212,212,212,212,212,212,212,212,212,212,207,207,204,204,204,204,204,199,196,196,196,196,191,188,188,188,183,180,180,175,172,172,172,164,164,164,156,156,156,148,148,143,140,140,132,132,127,124,119,116,111,108,103,100,92,92,84,76,71,63,60,47,36,23,0,0,0,0,0,0,0,28,39,52,60,68,71,76,84,92,92,100,103,108,111,116,119,124,127,132,132,140,140,143,148,148,151,156,156,164,164,164,167,172,172,175,180,180,180,183,188,188,188,191,196,196,196,196,199,204,204,204,204,204,204,207,207,207,212,212,212,212,212,212,207,207,207,207,204,204,204,204,204,199,199,196,196,196,191,191,188,188,188,183,180,180,180,172,172,172,167,164,164,159,156,156,151,148,148,140,140,135,132,132,124,124,116,116,108,108,100,100,92,87,84,76,68,60,52,44,36,20,0,0,0,0,0,0,0,20,36,47,55,63,68,76,84,87,92,100,100,108,108,116,116,124,124,132,132,135,140,140,148,148,151,156,156,159,164,164,167,172,172,172,175,180,180,180,183,188,188,188,191,196,196,196,196,199,199,204,204,204,204,204,204,204,204,204,207,207,207,204,204,204,204,204,204,204,204,204,199,196,196,196,196,191,191,188,188,188,183,180,180,180,175,172,172,167,164,164,159,156,156,151,148,148,143,140,140,132,132,127,124,119,116,111,108,103,100,95,92,84,79,76,68,60,52,44,28,7,0,0,0,0,0,0,0,12,31,44,52,60,68,76,79,84,92,95,100,103,108,111,116,119,124,127,132,132,140,140,143,148,148,151,156,156,159,164,164,167,172,172,172,175,180,180,180,183,188,188,188,191,191,196,196,196,196,199,199,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,199,199,196,196,196,196,196,191,188,188,188,188,183,180,180,180,175,172,172,167,164,164,164,159,156,156,151,148,148,140,140,135,132,132,124,124,116,116,108,108,100,100,92,87,84,76,71,63,60,47,36,23,0,0,0,0,0,0,0,0,0,28,39,52,60,68,71,76,84,87,92,100,100,108,111,116,116,124,124,132,132,135,140,140,143,148,148,156,156,156,164,164,164,167,172,172,172,175,180,180,180,183,188,188,188,188,191,196,196,196,196,196,196,199,199,199,204,204,204,204,204,204,204,204,204,199,199,199,196,196,196,196,196,191,191,188,188,188,188,183,180,180,180,175,172,172,172,167,164,164,159,156,156,151,148,148,143,140,140,132,132,127,124,119,116,111,108,103,100,95,92,84,79,76,68,60,52,44,36,15,0,0,0,0,0,0,0,0,0,20,36,44,52,60,68,76,79,84,92,95,100,103,108,111,116,119,124,127,132,132,140,140,143,148,148,151,156,156,159,164,164,164,167,172,172,172,175,180,180,180,183,188,188,188,188,191,191,196,196,196,196,196,196,196,199,199,199,199,199,199,199,199,196,196,196,196,196,196,196,196,191,188,188,188,188,183,183,180,180,180,175,172,172,172,167,164,164,159,156,156,151,148,148,143,140,140,135,132,132,124,124,116,116,108,108,100,100,92,87,84,76,71,68,60,52,39,28,0,0,0,0,0,0,0,0,0,0,7,28,44,52,60,68,71,76,84,87,92,100,100,108,108,116,116,124,124,127,132,135,140,140,143,148,148,151,156,156,159,164,164,164,167,172,172,172,175,180,180,180,183,183,188,188,188,188,191,191,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,191,191,188,188,188,188,188,183,180,180,180,180,175,172,172,172,167,164,164,159,156,156,156,148,148,148,140,140,135,132,132,127,124,119,116,111,108,103,100,95,92,84,84,76,68,60,55,44,36,20,0,0,0,0,0,0,0,0,0,0,0,20,36,47,55,60,68,76,84,84,92,95,100,103,108,111,116,119,124,124,132,132,135,140,140,143,148,148,151,156,156,159,164,164,164,167,172,172,172,175,180,180,180,180,183,188,188,188,188,188,188,191,191,191,196,196,196,196,196,196,196,196,196,196,196,191,191,191,188,188,188,188,188,183,183,180,180,180,180,175,172,172,172,167,164,164,164,156,156,156,151,148,148,143,140,140,132,132,127,124,124,116,116,108,108,100,100,92,87,84,76,71,68,60,52,44,28,12,0,0,0,0,0,0,0,0,0,0,0,12,31,44,52,60,68,71,76,84,87,92,100,100,108,108,116,116,124,124,127,132,132,140,140,140,148,148,148,156,156,156,159,164,164,164,167,172,172,172,175,180,180,180,180,180,183,188,188,188,188,188,188,188,188,191,191,191,191,191,191,191,191,191,188,188,188,188,188,188,188,183,183,180,180,180,180,175,172,172,172,172,167,164,164,164,156,156,156,151,148,148,143,140,140,135,132,132,124,124,119,116,111,108,103,100,95,92,84,84,76,68,63,55,47,36,23,0,0,0,0,0,0,0,0,0,0,0,0,0,23,36,47,55,63,68,76,79,84,92,95,100,103,108,111,116,116,124,124,127,132,132,140,140,143,148,148,148,156,156,156,159,164,164,164,167,172,172,172,172,175,180,180,180,180,180,183,183,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,183,183,180,180,180,180,180,175,172,172,172,167,167,164,164,164,156,156,156,151,148,148,143,140,140,135,132,132,127,124,119,116,116,108,108,100,100,92,87,84,76,71,68,60,52,44,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,44,52,60,68,71,76,84,87,92,100,100,108,108,111,116,119,124,124,132,132,135,140,140,143,148,148,148,156,156,156,159,164,164,164,167,172,172,172,172,175,175,180,180,180,180,180,183,183,183,188,188,188,188,188,188,188,188,188,188,188,188,183,183,183,180,180,180,180,180,180,175,172,172,172,172,167,164,164,164,159,156,156,156,151,148,148,143,140,140,135,132,132,127,124,124,116,116,111,108,103,100,95,92,84,79,76,68,60,55,47,36,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,36,47,55,60,68,76,79,84,92,92,100,100,108,108,116,116,119,124,127,132,132,135,140,140,143,148,148,148,156,156,156,159,164,164,164,164,167,172,172,172,172,175,175,180,180,180,180,180,180,180,183,183,183,183,183,183,183,183,183,183,180,180,180,180,180,180,180,180,175,172,172,172,172,172,167,164,164,164,159,156,156,156,151,148,148,148,140,140,140,132,132,127,124,124,119,116,111,108,103,100,95,92,87,84,76,71,68,60,52,44,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,44,52,60,68,71,76,84,84,92,95,100,103,108,111,116,116,124,124,127,132,132,135,140,140,143,148,148,148,151,156,156,156,159,164,164,164,167,167,172,172,172,172,175,175,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,175,175,172,172,172,172,172,167,164,164,164,164,159,156,156,156,151,148,148,148,140,140,140,132,132,132,124,124,119,116,116,108,108,100,100,92,92,84,79,76,68,60,52,44,36,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,44,52,60,68,76,76,84,87,92,100,100,108,108,111,116,116,124,124,127,132,132,135,140,140,143,148,148,148,151,156,156,156,159,164,164,164,164,167,167,172,172,172,172,172,175,175,175,180,180,180,180,180,180,180,180,180,180,180,180,175,175,175,172,172,172,172,172,172,167,164,164,164,164,159,159,156,156,156,151,148,148,143,140,140,140,132,132,132,124,124,119,116,116,108,108,103,100,95,92,84,84,76,68,63,60,52,44,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,39,52,55,63,68,76,79,84,92,92,100,100,108,108,111,116,119,124,124,127,132,132,135,140,140,143,148,148,148,151,156,156,156,159,159,164,164,164,164,167,167,172,172,172,172,172,172,172,172,175,175,175,175,175,175,175,175,175,172,172,172,172,172,172,172,172,167,164,164,164,164,164,159,156,156,156,151,148,148,148,143,140,140,140,132,132,132,124,124,119,116,116,111,108,103,100,95,92,87,84,76,71,68,60,52,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,44,52,60,68,71,76,84,84,92,95,100,100,108,108,116,116,119,124,124,127,132,132,135,140,140,140,148,148,148,151,151,156,156,156,159,159,164,164,164,164,164,167,167,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,167,167,164,164,164,164,164,159,156,156,156,156,151,148,148,148,143,140,140,140,132,132,132,124,124,124,116,116,111,108,103,100,100,92,87,84,79,76,68,60,55,47,36,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,36,44,52,60,68,76,76,84,87,92,95,100,103,108,108,116,116,119,124,124,127,132,132,135,140,140,140,143,148,148,148,151,156,156,156,156,159,159,164,164,164,164,164,164,167,167,167,172,172,172,172,172,172,172,172,172,172,167,167,167,167,164,164,164,164,164,164,159,156,156,156,156,151,151,148,148,148,143,140,140,135,132,132,132,124,124,124,116,116,111,108,108,100,100,92,92,84,79,76,68,63,60,52,44,31,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,39,52,55,63,68,76,79,84,87,92,95,100,103,108,108,116,116,119,124,124,127,132,132,135,140,140,140,143,148,148,148,148,151,156,156,156,156,159,159,164,164,164,164,164,164,164,164,164,164,164,167,167,167,164,164,164,164,164,164,164,164,164,164,159,159,156,156,156,156,156,151,148,148,148,143,140,140,140,135,132,132,132,124,124,124,116,116,111,108,108,100,100,92,92,84,84,76,71,68,60,52,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,44,52,60,63,68,76,79,84,92,92,100,100,103,108,108,116,116,119,124,124,127,132,132,132,135,140,140,140,143,148,148,148,148,151,156,156,156,156,156,159,159,159,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,159,159,156,156,156,156,156,151,151,148,148,148,148,143,140,140,140,135,132,132,127,124,124,119,116,116,111,108,108,100,100,95,92,87,84,76,71,68,60,52,47,36,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,36,44,52,60,68,71,76,84,84,92,92,100,100,103,108,108,116,116,119,124,124,124,132,132,132,135,140,140,140,143,143,148,148,148,148,151,156,156,156,156,156,156,156,159,159,159,159,159,159,164,164,159,159,159,159,159,159,156,156,156,156,156,156,156,151,151,148,148,148,148,143,140,140,140,135,132,132,132,127,124,124,119,116,116,111,108,108,100,100,95,92,87,84,76,76,68,60,55,52,39,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,36,47,52,60,68,71,76,84,84,92,92,100,100,103,108,108,116,116,116,124,124,124,127,132,132,132,135,140,140,140,143,143,148,148,148,148,151,151,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,151,151,148,148,148,148,148,143,140,140,140,140,135,132,132,132,127,124,124,119,116,116,111,108,108,100,100,95,92,87,84,79,76,68,63,60,52,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,39,47,55,60,68,71,76,84,84,92,92,100,100,103,108,108,111,116,116,119,124,124,127,132,132,132,135,135,140,140,140,143,143,148,148,148,148,148,148,151,151,151,156,156,156,156,156,156,156,156,156,156,156,156,156,151,151,151,148,148,148,148,148,148,143,140,140,140,140,135,132,132,132,127,124,124,124,119,116,116,111,108,108,100,100,95,92,87,84,79,76,68,63,60,52,44,36,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,31,44,52,55,60,68,71,76,84,84,92,92,95,100,103,108,108,111,116,116,119,124,124,124,127,132,132,132,135,135,140,140,140,140,143,143,148,148,148,148,148,148,148,148,148,151,151,151,151,151,151,151,148,148,148,148,148,148,148,148,148,143,143,140,140,140,140,135,132,132,132,132,127,124,124,119,116,116,116,108,108,103,100,100,95,92,87,84,79,76,68,68,60,52,44,36,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,44,52,55,60,68,71,76,84,84,92,92,95,100,100,108,108,111,116,116,116,119,124,124,124,127,132,132,132,135,135,140,140,140,140,140,143,143,143,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,143,143,140,140,140,140,140,140,135,132,132,132,132,127,124,124,124,119,116,116,111,108,108,103,100,100,92,92,87,84,79,76,68,68,60,52,44,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,44,52,55,60,68,71,76,84,84,87,92,95,100,100,103,108,108,111,116,116,119,124,124,124,124,127,132,132,132,132,135,135,140,140,140,140,140,140,140,143,143,143,143,143,143,143,143,143,143,143,143,143,140,140,140,140,140,140,140,135,135,132,132,132,132,127,124,124,124,119,116,116,116,111,108,108,103,100,100,92,92,87,84,79,76,68,68,60,52,47,39,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,36,44,52,55,60,68,71,76,79,84,87,92,92,100,100,103,108,108,111,116,116,116,119,124,124,124,124,127,132,132,132,132,132,135,135,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,135,135,132,132,132,132,132,127,127,124,124,124,119,116,116,116,111,108,108,103,100,100,95,92,92,84,84,76,76,68,68,60,52,47,39,28,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,36,44,52,55,60,68,71,76,79,84,87,92,92,95,100,100,103,108,108,111,116,116,116,119,124,124,124,124,127,127,132,132,132,132,132,132,135,135,135,135,140,140,140,140,140,140,140,140,135,135,135,135,132,132,132,132,132,132,132,127,124,124,124,124,119,116,116,116,111,108,108,108,103,100,100,95,92,87,84,84,76,76,68,63,60,52,47,39,28,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,36,44,52,55,60,68,68,76,76,84,84,92,92,95,100,100,103,108,108,108,111,116,116,116,119,119,124,124,124,124,127,127,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,127,127,124,124,124,124,124,119,116,116,116,111,108,108,108,103,100,100,95,92,92,87,84,79,76,71,68,63,60,52,44,39,28,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,36,44,52,52,60,68,68,76,76,84,84,87,92,92,95,100,100,103,108,108,108,111,116,116,116,116,119,124,124,124,124,124,124,127,127,127,127,132,132,132,132,132,132,132,132,132,132,132,127,127,127,124,124,124,124,124,124,119,119,116,116,116,111,108,108,108,103,100,100,100,95,92,92,84,84,79,76,71,68,60,60,52,44,36,28,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,31,39,47,52,60,63,68,71,76,79,84,84,92,92,92,100,100,100,103,108,108,108,111,111,116,116,116,116,119,119,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,119,119,116,116,116,116,116,111,108,108,108,103,100,100,100,95,92,92,87,84,84,76,76,68,68,60,55,52,44,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,39,44,52,60,60,68,68,76,76,84,84,87,92,92,92,100,100,100,103,108,108,108,108,111,111,116,116,116,116,116,119,119,119,119,124,124,124,124,124,124,124,124,124,124,124,119,119,119,116,116,116,116,116,116,111,108,108,108,108,103,100,100,100,95,92,92,87,84,84,79,76,71,68,63,60,52,52,44,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,36,44,52,55,60,63,68,71,76,79,84,84,87,92,92,92,95,100,100,100,103,108,108,108,108,111,111,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,111,111,108,108,108,108,108,103,100,100,100,95,92,92,87,84,84,79,76,76,68,68,60,60,52,47,39,36,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,44,47,52,60,60,68,68,76,76,79,84,84,87,92,92,92,95,100,100,100,100,103,108,108,108,108,108,108,111,111,111,116,116,116,116,116,116,116,116,116,116,111,111,111,108,108,108,108,108,108,103,103,100,100,100,100,95,92,92,87,84,84,84,76,76,71,68,63,60,55,52,44,36,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,31,36,44,52,55,60,63,68,68,76,76,79,84,84,87,92,92,92,92,95,100,100,100,100,103,103,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,103,103,100,100,100,100,100,95,92,92,92,87,84,84,84,76,76,71,68,68,60,60,52,47,44,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,36,44,47,52,55,60,63,68,71,76,76,79,84,84,84,87,92,92,92,92,95,100,100,100,100,100,100,100,103,103,103,103,103,108,108,103,103,103,103,103,103,100,100,100,100,100,100,95,95,92,92,92,92,87,84,84,79,76,76,71,68,68,60,60,52,52,44,36,31,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,31,36,44,52,52,60,60,63,68,68,76,76,76,79,84,84,84,87,92,92,92,92,92,95,95,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,95,95,95,92,92,92,92,87,87,84,84,84,79,76,76,71,68,68,63,60,55,52,44,44,36,28,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,39,44,52,52,60,60,63,68,68,71,76,76,76,79,84,84,84,84,87,92,92,92,92,92,92,92,92,92,95,95,95,95,92,92,92,92,92,92,92,92,92,87,87,84,84,84,84,79,76,76,76,71,68,68,60,60,55,52,47,44,36,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,36,39,44,52,52,55,60,63,68,68,68,71,76,76,76,79,84,84,84,84,84,84,87,87,87,92,92,92,92,92,92,92,92,87,87,87,87,84,84,84,84,84,79,79,76,76,76,71,68,68,63,60,60,55,52,47,44,36,31,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,36,39,44,47,52,55,60,60,63,68,68,68,71,76,76,76,76,79,79,79,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,79,79,76,76,76,76,71,71,68,68,63,60,60,60,52,52,44,44,36,31,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,36,36,44,44,52,52,55,60,60,63,68,68,68,68,71,71,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,71,68,68,68,68,63,60,60,60,52,52,47,44,39,36,28,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,23,31,36,39,44,47,52,52,55,60,60,60,60,63,68,68,68,68,68,68,68,71,71,71,71,71,71,71,68,68,68,68,68,68,68,63,60,60,60,55,52,52,47,44,44,36,36,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,31,36,39,44,44,47,52,52,52,55,60,60,60,60,60,63,63,63,63,63,63,63,63,63,63,60,60,60,60,60,60,55,52,52,52,47,44,44,36,36,28,23,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,31,36,36,39,44,44,47,52,52,52,52,52,52,55,55,55,55,55,55,55,55,55,52,52,52,52,52,47,44,44,44,39,36,36,28,23,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,23,28,31,36,36,36,39,44,44,44,44,44,44,47,47,47,47,44,44,44,44,44,44,44,39,36,36,31,28,28,20,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,20,23,28,28,28,31,36,36,36,36,36,36,36,36,36,36,31,31,28,28,28,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,15,20,20,20,20,20,20,20,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};\n      const uint8_t FLARE_TEXTURE_3[16384] ={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,28,36,39,44,52,55,60,60,60,60,60,60,60,52,52,44,36,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,36,44,60,68,76,84,92,95,100,108,108,108,111,111,111,108,108,103,100,92,84,79,71,60,52,44,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,44,60,71,84,95,108,116,124,132,140,148,148,156,156,159,164,164,164,159,156,151,148,140,135,127,119,111,100,92,76,68,52,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,44,60,76,92,108,119,132,143,156,164,172,180,188,196,199,204,207,212,212,212,212,212,204,204,196,191,188,180,172,159,148,140,124,116,100,84,68,52,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,36,55,76,92,108,124,140,156,167,180,191,204,212,220,228,236,244,252,252,244,244,244,244,244,244,247,252,247,244,236,228,220,207,196,188,172,164,148,132,116,100,84,63,44,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,39,60,84,100,119,140,156,172,188,204,215,228,244,252,244,231,223,215,212,204,199,196,196,191,191,196,196,196,204,207,212,220,228,236,244,244,236,220,212,196,180,164,148,132,108,92,71,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,39,60,84,108,124,148,164,183,204,220,236,252,239,228,212,204,191,183,172,167,159,156,148,148,143,140,140,143,148,148,151,156,164,172,180,188,196,207,220,236,247,244,228,212,196,175,156,135,116,95,76,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,36,60,84,108,132,151,172,191,212,228,247,236,220,204,191,180,164,156,143,132,124,116,111,108,100,100,92,92,92,92,95,100,103,108,116,124,132,140,148,159,172,188,199,212,228,244,239,220,204,180,164,140,116,92,71,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,52,76,100,124,148,172,196,220,236,244,228,207,191,172,159,143,132,116,108,95,84,76,68,60,55,52,47,44,44,44,44,44,52,52,60,68,71,79,92,100,111,124,140,151,164,180,199,220,236,247,228,204,183,164,140,116,92,63,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,39,68,92,119,148,172,196,220,239,244,220,199,180,164,143,127,111,95,84,68,60,44,36,28,20,12,0,0,0,0,0,0,0,0,0,0,12,15,23,31,44,52,63,76,92,103,119,135,156,172,188,212,228,252,228,204,180,156,132,108,79,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,79,108,135,164,188,212,236,244,220,196,175,156,132,116,100,79,63,52,36,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,44,55,71,92,108,124,143,164,188,207,228,252,228,204,175,148,124,92,68,36,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,60,92,124,148,180,204,228,247,220,196,172,151,132,108,87,68,52,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,44,60,79,100,119,140,164,188,212,236,244,220,191,164,135,108,76,47,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,39,71,100,132,164,188,220,244,228,204,180,156,132,108,84,63,44,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,52,76,95,119,140,164,191,220,244,231,204,175,148,116,87,55,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,44,79,108,140,172,204,231,244,215,188,164,135,111,84,63,39,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,52,76,100,124,148,175,204,228,244,215,188,156,124,92,63,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,84,116,148,180,212,244,231,204,172,148,119,92,68,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,31,55,79,108,132,159,188,220,247,228,196,164,132,100,68,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,87,124,156,188,220,252,220,191,164,132,108,76,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,63,92,119,148,180,207,236,236,204,172,140,108,71,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,55,92,124,156,191,228,244,212,183,151,124,92,63,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,76,108,140,167,196,228,244,207,175,140,108,71,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,92,124,159,196,228,244,207,175,143,116,84,52,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,68,100,127,159,191,228,244,212,180,143,108,71,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,52,87,124,159,196,228,236,204,172,140,108,76,44,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,60,92,124,156,188,220,247,212,180,140,108,68,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,44,84,124,156,196,228,236,204,167,132,100,68,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,84,116,151,188,220,247,212,175,140,103,68,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,79,116,156,191,228,236,204,167,132,100,63,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,47,79,116,148,183,220,247,212,172,135,100,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,71,108,148,188,228,244,204,167,132,95,60,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,44,79,116,148,188,223,244,204,167,132,92,52,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,60,100,140,180,220,244,207,172,132,100,60,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,44,79,116,151,188,228,236,199,164,124,84,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,52,92,132,172,212,252,212,175,140,100,63,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,44,84,119,156,196,236,231,191,151,111,71,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,79,124,164,204,244,220,183,143,108,68,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,52,87,124,164,204,244,220,180,140,100,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,68,108,148,188,231,231,191,151,116,76,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,55,92,132,172,212,252,212,172,132,87,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,52,92,135,180,220,244,204,164,124,84,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,60,100,140,180,223,239,196,156,116,71,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,76,119,164,204,244,215,172,132,92,52,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,71,116,156,196,236,228,183,140,100,55,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,60,100,148,188,228,228,188,148,108,63,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,84,124,167,212,252,212,164,124,79,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,84,124,172,212,247,204,164,119,76,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,60,100,140,183,228,236,191,148,108,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,60,108,148,196,236,220,180,135,92,52,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,71,116,156,199,244,215,172,127,84,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,84,132,172,220,244,196,156,111,68,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,132,175,220,239,196,151,108,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,60,108,151,196,239,220,172,132,84,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,68,108,151,196,244,220,172,127,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,124,172,220,244,196,151,108,63,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,84,132,172,220,239,196,148,103,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,55,100,148,191,236,220,175,132,84,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,60,108,151,196,244,215,172,124,76,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,119,164,212,244,199,156,108,63,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,84,132,180,223,236,188,143,95,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,140,183,228,228,180,132,87,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,68,111,156,204,252,207,164,116,68,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,108,156,204,247,207,164,116,68,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,140,188,231,228,180,132,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,124,172,220,236,191,143,100,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,124,167,212,244,196,148,100,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,140,188,236,220,172,127,79,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,103,151,196,244,212,164,116,68,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,108,156,204,252,204,159,111,63,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,87,135,180,228,228,180,132,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,71,119,167,215,239,191,143,95,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,71,119,167,215,239,191,143,95,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,132,180,228,228,180,132,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,108,156,204,252,204,156,108,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,95,143,191,244,212,164,116,68,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,140,188,236,215,167,119,71,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,60,108,156,204,252,204,156,108,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,132,180,228,228,180,132,84,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,68,116,164,212,244,191,143,95,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,68,119,167,220,236,188,140,92,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,124,172,220,231,183,132,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,108,156,207,247,196,148,100,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,132,180,228,223,172,124,76,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,100,148,199,247,204,156,108,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,92,140,188,236,215,167,116,68,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,140,191,244,212,164,116,68,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,95,148,196,244,212,159,111,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,135,188,236,220,172,119,71,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,100,148,199,252,204,156,108,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,79,132,180,228,223,175,124,76,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,55,108,156,204,252,199,148,100,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,124,175,228,228,180,132,79,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,60,108,156,207,244,196,148,100,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,71,124,172,220,231,180,132,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,108,159,212,244,196,143,92,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,68,119,172,220,236,188,135,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,111,164,212,244,191,140,92,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,68,116,167,220,236,188,135,87,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,111,164,212,244,191,140,92,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,68,116,167,220,236,188,140,87,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,111,164,212,244,196,143,92,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,68,116,167,220,236,188,135,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,108,159,212,244,196,148,95,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,68,119,172,220,236,183,132,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,60,108,156,204,247,196,148,100,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,76,124,172,223,231,180,132,84,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,103,151,204,252,204,151,103,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,127,180,228,228,180,127,76,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,100,148,196,247,207,156,108,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,132,180,231,220,172,124,76,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,140,191,244,212,164,116,68,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,92,140,188,236,215,167,116,68,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,135,188,236,220,172,124,71,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,47,100,148,196,244,212,159,111,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,79,127,180,228,228,180,132,79,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,55,108,156,204,252,204,156,103,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,71,119,172,220,236,188,140,92,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,68,116,164,212,244,196,143,95,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,111,159,207,244,196,148,100,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,124,172,220,236,183,135,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,100,148,196,244,207,159,111,63,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,87,135,183,231,220,172,124,76,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,140,188,236,220,172,124,76,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,100,148,196,244,212,164,116,68,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,124,172,220,236,188,140,92,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,68,116,164,212,244,196,148,100,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,68,116,164,212,247,199,151,103,55,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,79,127,175,223,236,188,140,92,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,100,148,196,244,212,164,119,71,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,47,95,143,188,236,220,172,124,76,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,132,180,228,228,180,135,92,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,68,111,159,204,252,204,156,108,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,68,116,164,212,244,199,156,108,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,132,175,223,236,188,140,92,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,100,148,196,239,220,172,124,79,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,55,100,148,196,239,215,172,124,76,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,132,175,220,236,188,143,100,52,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,124,167,212,244,196,151,108,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,63,108,156,204,247,212,164,119,76,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,52,100,140,188,231,228,180,132,87,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,135,180,228,228,188,140,95,52,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,116,164,207,252,204,159,116,68,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,71,116,164,204,252,207,164,119,76,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,52,100,140,188,228,228,183,140,92,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,95,140,183,228,228,188,140,100,55,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,76,119,164,207,252,207,164,116,71,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,116,164,204,252,212,164,124,79,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,60,100,148,188,231,228,183,140,95,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,92,140,180,228,236,191,148,108,63,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,84,127,172,212,247,204,159,116,71,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,71,116,156,204,244,220,175,132,92,52,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,68,111,156,196,236,220,180,135,92,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,132,175,220,244,204,159,119,76,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,60,100,140,180,223,236,196,156,111,68,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,63,108,148,191,231,228,188,148,108,68,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,47,87,127,167,212,252,212,172,127,84,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,79,124,164,204,244,220,180,140,100,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,76,116,156,196,236,228,183,140,100,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,52,92,135,175,215,247,207,167,127,92,52,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,68,108,148,188,228,236,196,156,116,76,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,68,108,148,188,228,236,196,159,124,84,47,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,68,103,140,180,220,244,207,167,127,84,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,76,116,156,196,236,228,191,156,116,79,44,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,60,100,135,172,212,252,215,175,140,100,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,47,87,124,164,204,244,228,188,151,116,79,44,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,60,100,132,172,204,244,220,183,148,108,68,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,55,92,132,172,207,244,220,188,148,116,79,44,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,60,100,132,167,204,239,228,188,151,116,76,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,63,100,140,175,212,247,220,183,148,116,84,52,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,68,100,132,167,204,236,228,196,156,119,84,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,68,108,140,180,212,247,220,188,151,119,87,55,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,39,68,103,135,172,204,236,231,196,159,124,84,52,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,71,108,143,180,212,247,223,188,156,124,92,60,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,47,76,108,140,172,204,239,228,196,159,124,92,52,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,71,108,140,175,212,244,228,196,164,132,100,71,44,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,60,87,116,148,180,212,244,228,196,159,124,92,52,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,71,108,140,172,204,236,236,204,172,140,116,84,60,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,44,68,100,127,156,188,220,252,220,188,156,124,92,52,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,68,103,135,167,199,231,244,212,180,156,124,100,71,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,60,84,111,140,167,196,228,244,215,183,151,119,84,52,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,68,100,132,164,191,220,252,223,196,167,140,116,92,68,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,52,76,100,127,156,180,212,236,236,207,175,148,116,84,52,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,60,92,124,151,180,212,239,236,212,183,156,132,108,84,60,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,52,76,100,119,148,172,196,223,252,228,196,167,140,108,76,44,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,84,111,140,172,196,228,252,228,199,175,151,132,108,84,68,44,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,55,76,100,116,140,164,188,212,236,236,212,183,156,127,100,68,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,44,71,100,132,156,183,212,236,244,220,196,172,151,132,111,92,76,60,39,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,31,47,68,84,100,124,140,164,188,207,231,247,220,196,172,140,116,84,60,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,60,87,116,140,164,191,215,239,244,220,196,180,156,140,124,103,87,71,60,44,36,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,15,28,39,52,68,79,95,111,132,148,167,188,207,228,252,228,204,180,156,127,100,76,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,71,100,124,148,172,196,220,239,244,223,204,188,167,151,135,119,108,92,84,68,60,52,44,36,31,28,20,20,20,20,20,20,23,28,36,39,47,55,68,76,87,100,116,127,143,159,175,196,212,231,252,228,207,183,159,135,111,84,60,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,55,79,108,127,151,172,196,215,236,252,231,212,196,180,167,156,140,132,119,108,100,92,84,79,76,71,68,68,68,68,68,76,76,84,92,100,108,116,124,135,148,164,175,188,204,223,239,244,228,204,183,164,140,116,92,68,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,60,84,108,127,148,172,188,207,228,244,244,228,215,204,188,180,167,156,148,140,135,132,124,124,119,116,116,116,119,124,127,132,140,148,156,164,172,183,196,212,223,236,252,236,215,196,180,159,140,116,95,71,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,39,60,84,103,124,143,164,180,196,212,228,239,252,236,228,220,207,199,191,188,180,175,172,172,167,167,167,172,172,180,180,188,196,204,212,220,231,244,244,236,220,204,188,172,151,132,116,92,71,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,60,76,95,116,132,148,164,180,191,204,215,228,236,247,247,244,236,228,228,220,220,220,220,220,220,223,228,231,236,244,252,244,236,220,212,196,188,172,156,140,124,108,87,68,47,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,52,68,84,100,116,132,143,156,167,180,188,196,204,212,220,223,228,231,236,236,236,236,236,231,228,220,215,212,204,196,183,172,164,148,140,124,108,92,76,60,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,52,68,84,95,108,119,132,140,148,156,164,172,175,180,180,188,188,188,188,183,180,180,172,167,159,156,143,135,124,116,100,92,76,60,44,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,47,60,71,84,92,100,108,116,119,124,132,132,135,135,140,135,132,132,127,124,116,111,103,95,84,76,68,52,44,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,31,44,52,60,68,71,76,79,84,84,87,87,84,84,84,76,76,68,60,52,44,36,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,20,28,28,36,36,36,36,36,36,31,28,23,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};\n      const uint8_t FLARE_TEXTURE_4[16384] ={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,28,36,39,44,52,55,60,60,60,60,60,60,60,52,52,44,36,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,36,44,60,68,76,84,92,95,100,108,108,108,111,111,111,108,108,103,100,92,84,79,71,60,52,44,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,44,60,71,84,95,108,116,124,132,140,148,148,156,156,159,164,164,164,159,156,151,148,140,135,127,119,111,100,92,76,68,52,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,44,60,76,92,108,119,132,143,156,164,172,180,188,196,199,204,207,212,212,212,212,212,204,204,196,191,188,180,172,159,148,140,124,116,100,84,68,52,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,36,55,76,92,108,124,140,156,167,180,191,204,212,220,228,236,244,252,252,252,252,252,252,252,252,252,252,247,244,236,228,220,207,196,188,172,164,148,132,116,100,84,63,44,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,39,60,84,100,119,140,156,172,188,204,215,228,244,252,252,252,252,247,247,247,244,244,244,244,244,244,244,244,247,247,247,247,252,252,252,244,236,220,212,196,180,164,148,132,108,92,71,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,39,60,84,108,124,148,164,183,204,220,236,252,252,252,247,247,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,247,247,252,252,244,228,212,196,175,156,135,116,95,76,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,36,60,84,108,132,151,172,191,212,228,247,252,247,247,244,244,244,244,244,239,239,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,239,239,244,244,244,244,244,247,252,252,239,220,204,180,164,140,116,92,71,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,52,76,100,124,148,172,196,220,236,252,252,247,244,244,244,244,239,236,236,236,236,236,236,231,231,231,231,231,231,231,231,231,231,231,231,236,236,236,236,236,236,239,239,244,244,244,244,247,252,247,228,204,183,164,140,116,92,63,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,39,68,92,119,148,172,196,220,239,252,247,244,244,244,244,239,236,236,236,236,231,231,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,231,236,236,236,236,236,239,244,244,244,247,252,252,228,204,180,156,132,108,79,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,79,108,135,164,188,212,236,252,247,244,244,244,239,236,236,236,236,231,228,228,228,228,228,223,223,223,220,220,220,220,220,220,220,220,220,220,220,223,223,228,228,228,228,228,228,231,236,236,236,239,244,244,244,247,252,252,228,204,175,148,124,92,68,36,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,60,92,124,148,180,204,228,252,252,244,244,244,239,236,236,236,231,228,228,228,228,223,220,220,220,220,220,220,220,220,215,215,215,215,215,215,215,220,220,220,220,220,220,220,223,223,228,228,228,231,231,236,236,236,239,244,244,247,252,244,220,191,164,135,108,76,47,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,39,71,100,132,164,188,220,244,252,247,244,244,239,236,236,236,231,228,228,228,223,220,220,220,220,215,215,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,215,215,220,220,220,220,223,223,228,228,228,231,236,236,236,244,244,244,247,252,231,204,175,148,116,87,55,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,44,79,108,140,172,204,231,252,247,244,244,239,236,236,236,228,228,228,223,220,220,220,220,215,212,212,212,212,212,212,207,207,207,204,204,204,204,204,204,204,207,207,207,212,212,212,212,212,215,215,220,220,220,223,228,228,228,231,236,236,239,244,244,247,252,244,215,188,156,124,92,63,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,84,116,148,180,212,244,252,247,244,244,236,236,236,231,228,228,223,220,220,220,215,212,212,212,212,207,207,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,207,212,212,212,212,215,220,220,220,223,228,228,228,231,236,236,239,244,244,247,252,228,196,164,132,100,68,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,87,124,156,188,220,252,252,244,244,239,236,236,231,228,228,223,220,220,220,215,212,212,212,207,204,204,204,204,204,199,199,196,196,196,196,196,196,196,196,196,196,196,196,196,199,199,204,204,204,204,207,207,212,212,212,215,220,220,223,228,228,228,236,236,236,244,244,247,252,236,204,172,140,108,71,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,55,92,124,156,191,228,252,247,244,244,239,236,236,228,228,228,220,220,220,215,212,212,207,204,204,204,204,199,196,196,196,196,196,196,191,191,191,191,191,191,191,191,191,191,196,196,196,196,196,196,199,199,204,204,204,207,212,212,212,215,220,220,223,228,228,231,236,236,239,244,244,252,244,207,175,140,108,71,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,92,124,159,196,228,252,247,244,244,236,236,231,228,228,223,220,220,215,212,212,207,204,204,204,199,196,196,196,196,191,191,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,191,196,196,196,196,199,204,204,204,207,212,212,212,215,220,220,223,228,228,236,236,239,244,244,252,244,212,180,143,108,71,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,52,87,124,159,196,228,252,247,244,239,236,236,231,228,228,220,220,215,212,212,207,204,204,204,199,196,196,196,191,188,188,188,188,188,183,183,180,180,180,180,180,180,180,180,180,180,183,183,188,188,188,188,188,191,196,196,196,196,199,204,204,207,212,212,215,220,220,223,228,228,231,236,239,244,244,247,247,212,180,140,108,68,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,44,84,124,156,196,228,252,247,244,239,236,236,228,228,223,220,220,215,212,212,207,204,204,199,196,196,196,191,188,188,188,183,183,180,180,180,180,180,180,175,175,175,175,175,175,180,180,180,180,180,180,180,183,188,188,188,188,191,196,196,196,199,204,204,207,212,212,215,220,220,228,228,231,236,236,244,244,247,247,212,175,140,103,68,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,79,116,156,191,228,252,247,244,239,236,236,228,228,223,220,220,212,212,207,204,204,199,196,196,196,188,188,188,183,180,180,180,180,175,175,172,172,172,172,172,172,172,172,172,172,172,172,172,172,175,175,180,180,180,180,183,188,188,188,191,196,196,199,204,204,204,212,212,215,220,220,223,228,231,236,236,244,244,247,247,212,172,135,100,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,71,108,148,188,228,252,247,244,239,236,231,228,228,220,220,215,212,212,207,204,204,196,196,196,188,188,188,183,180,180,180,175,172,172,172,172,172,167,167,167,164,164,164,164,164,164,167,167,167,172,172,172,172,172,175,180,180,180,183,188,188,188,191,196,196,199,204,204,207,212,212,220,220,223,228,231,236,236,244,244,252,244,204,167,132,92,52,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,60,100,140,180,220,252,247,244,239,236,231,228,228,220,220,215,212,212,204,204,199,196,196,191,188,188,183,180,180,180,175,172,172,172,167,167,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,167,172,172,172,172,175,180,180,183,188,188,188,196,196,196,204,204,207,212,212,220,220,223,228,231,236,236,244,244,252,236,199,164,124,84,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,52,92,132,172,212,252,247,244,239,236,236,228,228,220,220,215,212,207,204,204,199,196,196,188,188,183,180,180,180,175,172,172,172,167,164,164,164,164,159,159,156,156,156,156,156,156,156,156,156,156,156,159,159,164,164,164,164,167,172,172,172,175,180,180,183,188,188,191,196,196,199,204,207,212,212,220,220,223,228,231,236,236,244,244,252,231,191,151,111,71,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,79,124,164,204,244,252,244,244,236,236,228,228,220,220,215,212,207,204,204,196,196,191,188,188,183,180,180,175,172,172,167,164,164,164,159,159,156,156,156,156,156,151,151,151,151,151,151,151,151,156,156,156,156,156,156,159,164,164,164,167,172,172,172,175,180,180,183,188,188,196,196,199,204,204,212,212,220,220,223,228,231,236,239,244,247,252,220,180,140,100,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,68,108,148,188,231,252,244,244,236,236,228,228,220,220,215,212,207,204,204,196,196,191,188,188,180,180,175,172,172,167,164,164,164,159,156,156,156,151,151,148,148,148,148,148,148,148,148,148,148,148,148,148,148,151,151,156,156,156,156,159,164,164,167,172,172,175,180,180,183,188,188,196,196,199,204,204,212,212,220,220,223,228,231,236,239,244,247,252,212,172,132,87,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,52,92,135,180,220,252,247,244,239,236,231,228,223,220,215,212,207,204,204,196,196,188,188,183,180,180,175,172,172,164,164,164,159,156,156,156,151,148,148,148,148,143,143,140,140,140,140,140,140,140,140,143,143,148,148,148,148,148,151,156,156,156,159,164,164,167,172,172,175,180,180,188,188,191,196,199,204,204,212,212,220,220,228,228,236,236,244,244,252,239,196,156,116,71,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,76,119,164,204,244,247,244,239,236,231,228,223,220,215,212,207,204,204,196,196,188,188,183,180,180,172,172,167,164,164,159,156,156,151,148,148,148,148,143,140,140,140,140,140,140,135,135,135,135,140,140,140,140,140,140,140,143,148,148,148,151,156,156,156,164,164,164,172,172,175,180,180,188,188,191,196,199,204,204,212,212,220,220,228,228,236,236,244,244,252,228,183,140,100,55,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,60,100,148,188,228,252,244,244,236,236,228,228,220,220,212,212,204,204,196,196,188,188,183,180,175,172,172,167,164,164,156,156,156,148,148,148,143,140,140,140,140,135,132,132,132,132,132,132,132,132,132,132,132,132,135,135,140,140,140,143,148,148,148,151,156,156,159,164,164,167,172,175,180,180,188,188,191,196,199,204,207,212,215,220,223,228,231,236,239,244,247,252,212,164,124,79,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,84,124,172,212,252,247,244,236,236,228,228,220,220,212,212,204,204,196,196,188,188,183,180,175,172,172,164,164,159,156,156,151,148,148,143,140,140,140,135,132,132,132,132,127,127,127,124,124,124,124,127,127,127,132,132,132,132,132,135,140,140,140,148,148,148,156,156,156,164,164,167,172,172,180,180,188,188,191,196,199,204,207,212,215,220,223,228,231,236,239,244,252,236,191,148,108,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,60,108,148,196,236,252,244,239,236,231,228,223,220,215,212,207,204,199,196,191,188,183,180,175,172,172,164,164,159,156,156,148,148,143,140,140,140,135,132,132,132,127,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,127,132,132,132,135,140,140,143,148,148,151,156,156,164,164,167,172,172,180,180,188,188,196,196,204,204,212,212,220,220,228,228,236,236,244,244,252,215,172,127,84,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,84,132,172,220,252,244,244,236,236,228,228,220,215,212,207,204,199,196,191,188,183,180,175,172,172,164,164,159,156,151,148,148,143,140,140,135,132,132,127,124,124,124,124,119,119,116,116,116,116,116,116,116,116,116,119,119,124,124,124,127,132,132,132,135,140,140,143,148,151,156,156,159,164,167,172,175,180,180,188,188,196,196,204,204,212,212,220,220,228,231,236,239,244,247,239,196,151,108,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,60,108,151,196,239,247,244,239,236,231,228,220,220,212,212,204,204,196,196,188,188,180,180,172,172,164,164,156,156,151,148,148,140,140,135,132,132,127,124,124,124,119,116,116,116,116,116,111,111,111,111,111,111,111,116,116,116,116,119,119,124,124,127,132,132,135,140,140,143,148,148,156,156,159,164,167,172,175,180,183,188,191,196,199,204,207,212,215,220,223,228,236,236,244,244,252,220,172,127,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,124,172,220,252,244,244,236,236,228,223,220,215,212,207,204,196,196,188,188,180,180,172,172,164,164,159,156,151,148,148,140,140,135,132,132,124,124,124,119,116,116,116,111,108,108,108,108,108,108,108,108,108,108,108,108,111,111,116,116,116,119,124,124,127,132,132,140,140,143,148,148,156,156,159,164,167,172,175,180,183,188,191,196,199,204,212,212,220,220,228,228,236,239,244,247,239,196,148,103,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,55,100,148,191,236,247,244,239,236,228,228,220,220,212,207,204,199,196,191,188,183,180,175,172,167,164,159,156,151,148,143,140,140,132,132,127,124,124,119,116,116,111,108,108,108,108,103,103,100,100,100,100,100,100,103,103,108,108,108,108,111,116,116,116,124,124,124,132,132,135,140,143,148,148,156,156,164,164,172,172,180,180,188,188,196,196,204,204,212,215,220,223,228,236,236,244,244,252,215,172,124,76,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,119,164,212,252,244,244,236,236,228,223,220,215,212,204,204,196,196,188,183,180,175,172,167,164,159,156,151,148,148,140,140,132,132,127,124,124,116,116,116,108,108,108,103,100,100,100,100,100,100,95,95,95,100,100,100,100,100,103,108,108,108,111,116,116,119,124,124,132,132,135,140,143,148,148,156,156,164,164,172,172,180,180,188,191,196,199,204,207,212,220,220,228,228,236,239,244,252,236,188,143,95,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,140,183,228,252,244,239,236,231,228,220,220,212,207,204,199,196,188,188,180,180,172,172,164,164,156,156,148,148,140,140,132,132,127,124,119,116,116,111,108,108,103,100,100,100,95,92,92,92,92,92,92,92,92,92,92,95,100,100,100,100,108,108,108,116,116,119,124,124,132,132,135,140,143,148,151,156,159,164,167,172,175,180,183,188,196,196,204,204,212,215,220,223,228,236,236,244,247,252,207,164,116,68,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,108,156,204,247,247,244,236,236,228,223,220,215,212,204,204,196,196,188,183,180,175,172,164,164,156,156,148,148,140,140,132,132,127,124,119,116,116,108,108,103,100,100,100,95,92,92,92,87,87,87,84,84,84,87,87,92,92,92,92,95,100,100,103,108,108,111,116,116,124,124,132,132,135,140,143,148,151,156,159,164,172,172,180,180,188,188,196,199,204,207,212,220,220,228,231,236,239,244,252,228,180,132,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,124,172,220,252,244,244,236,231,228,220,220,212,207,204,199,196,188,188,180,180,172,167,164,159,156,151,148,143,140,135,132,127,124,119,116,116,108,108,103,100,100,95,92,92,87,84,84,84,84,84,84,84,84,84,84,84,84,87,92,92,92,95,100,100,108,108,111,116,116,124,124,132,132,140,140,148,148,156,156,164,164,172,175,180,183,188,196,196,204,204,212,215,220,223,228,236,236,244,247,244,196,148,100,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,140,188,236,247,244,239,236,228,228,220,215,212,204,204,196,196,188,183,180,175,172,164,164,156,156,148,143,140,135,132,127,124,119,116,116,108,108,100,100,95,92,92,87,84,84,84,79,79,76,76,76,76,76,76,76,79,84,84,84,87,92,92,95,100,100,103,108,111,116,116,124,124,132,132,140,140,148,151,156,159,164,167,172,180,180,188,188,196,199,204,212,212,220,223,228,231,236,244,244,252,212,164,116,68,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,108,156,204,252,247,244,236,236,228,223,220,212,212,204,199,196,191,188,180,180,172,167,164,159,156,148,148,140,140,132,132,124,124,116,116,108,108,100,100,95,92,92,84,84,84,79,76,76,76,76,71,71,71,71,71,76,76,76,76,79,84,84,87,92,92,100,100,103,108,111,116,119,124,127,132,135,140,143,148,156,156,164,164,172,175,180,183,188,196,196,204,207,212,215,220,228,228,236,239,244,252,228,180,132,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,71,119,167,215,252,244,244,236,231,228,220,220,212,207,204,196,196,188,183,180,175,172,164,164,156,151,148,143,140,135,132,124,124,116,116,108,108,100,100,95,92,87,84,84,79,76,76,71,71,68,68,68,68,68,68,68,68,68,71,76,76,76,84,84,87,92,92,100,100,103,108,111,116,119,124,127,132,140,140,148,148,156,159,164,167,172,180,180,188,191,196,204,204,212,215,220,223,228,236,236,244,247,239,191,143,95,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,132,180,228,252,244,239,236,228,228,220,215,212,204,204,196,191,188,180,180,172,172,164,159,156,148,148,140,140,132,127,124,119,116,111,108,103,100,95,92,87,84,84,76,76,76,68,68,68,63,63,60,60,60,60,60,63,68,68,68,71,76,76,79,84,84,92,92,100,100,108,108,116,116,124,124,132,135,140,143,148,156,156,164,164,172,175,180,188,188,196,199,204,207,212,220,223,228,231,236,244,247,252,204,156,108,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,95,143,191,244,247,244,236,236,228,223,220,212,212,204,199,196,188,188,180,175,172,167,164,156,156,148,143,140,135,132,124,124,116,116,108,103,100,95,92,87,84,84,76,76,71,68,68,63,60,60,60,60,55,55,60,60,60,60,60,63,68,68,76,76,79,84,84,92,92,100,100,108,111,116,119,124,127,132,140,140,148,151,156,159,164,172,172,180,183,188,196,196,204,207,212,215,220,228,231,236,244,244,252,215,167,119,71,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,60,108,156,204,252,247,244,236,231,228,220,220,212,207,204,196,196,188,183,180,172,172,164,159,156,151,148,140,140,132,127,124,119,116,108,108,100,100,92,92,84,84,76,76,71,68,63,60,60,60,55,52,52,52,52,52,52,52,55,60,60,63,68,68,71,76,79,84,87,92,95,100,103,108,111,116,124,124,132,135,140,143,148,156,156,164,167,172,180,180,188,191,196,204,204,212,215,220,228,228,236,239,244,252,228,180,132,84,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,68,116,164,212,252,244,244,236,231,228,220,215,212,207,204,196,191,188,183,180,172,167,164,159,156,148,148,140,135,132,124,124,116,111,108,103,100,95,92,84,84,76,76,71,68,63,60,60,55,52,52,47,47,47,44,47,47,52,52,52,55,60,60,68,68,71,76,79,84,87,92,100,100,108,108,116,119,124,127,132,140,140,148,151,156,164,164,172,175,180,188,188,196,199,204,212,212,220,223,228,236,236,244,247,236,188,140,92,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,124,172,220,252,244,239,236,228,228,220,215,212,204,204,196,191,188,180,175,172,167,164,156,151,148,143,140,132,132,124,119,116,108,108,100,100,92,87,84,79,76,71,68,63,60,55,52,52,47,44,44,44,44,44,44,44,44,47,52,52,55,60,60,68,68,76,76,84,84,92,95,100,103,108,116,116,124,124,132,135,140,148,148,156,159,164,172,172,180,183,188,196,196,204,207,212,220,223,228,231,236,244,247,247,196,148,100,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,132,180,228,252,244,239,236,228,223,220,212,212,204,199,196,188,188,180,175,172,164,164,156,151,148,140,140,132,127,124,116,116,108,103,100,95,92,84,84,76,76,68,63,60,55,52,52,44,44,44,39,36,36,36,36,36,39,44,44,47,52,55,60,60,68,68,76,79,84,87,92,100,100,108,111,116,119,124,132,132,140,143,148,156,156,164,167,172,180,183,188,191,196,204,207,212,220,220,228,231,236,244,244,252,204,156,108,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,92,140,188,236,247,244,236,236,228,223,220,212,212,204,199,196,188,183,180,172,172,164,159,156,148,148,140,135,132,124,124,116,111,108,100,100,92,87,84,79,76,68,68,60,60,52,52,44,44,39,36,36,36,31,31,31,36,36,36,44,44,47,52,55,60,63,68,71,76,84,84,92,95,100,103,108,116,119,124,127,132,140,143,148,151,156,164,167,172,180,180,188,191,196,204,204,212,215,220,228,231,236,244,244,252,212,164,116,68,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,95,148,196,244,247,244,236,231,228,223,220,212,207,204,196,196,188,183,180,172,167,164,159,156,148,143,140,132,132,124,119,116,108,108,100,95,92,84,84,76,71,68,63,60,55,52,44,44,39,36,31,28,28,28,28,28,28,31,36,36,44,44,47,52,60,60,68,68,76,79,84,92,92,100,103,108,111,116,124,127,132,140,140,148,151,156,164,164,172,175,180,188,191,196,199,204,212,215,220,228,228,236,239,244,252,220,172,119,71,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,100,148,199,252,247,244,236,231,228,220,220,212,207,204,196,191,188,180,180,172,167,164,156,156,148,143,140,132,127,124,119,116,108,103,100,92,92,84,79,76,71,68,60,60,52,47,44,39,36,31,28,28,23,20,20,20,23,28,28,36,36,44,44,52,52,60,63,68,76,76,84,87,92,100,100,108,111,116,124,124,132,135,140,148,148,156,159,164,172,175,180,188,188,196,199,204,212,215,220,223,228,236,239,244,252,223,175,124,76,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,55,108,156,204,252,244,244,236,231,228,220,220,212,207,204,196,191,188,180,180,172,167,164,156,151,148,140,140,132,127,124,116,116,108,103,100,92,87,84,79,76,68,63,60,55,52,44,44,36,31,28,28,20,20,20,20,20,20,23,28,28,36,39,44,47,52,60,60,68,71,76,84,84,92,95,100,108,108,116,119,124,132,135,140,148,148,156,159,164,172,172,180,183,188,196,199,204,212,212,220,223,228,236,239,244,252,228,180,132,79,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,60,108,156,207,252,244,244,236,231,228,220,215,212,204,204,196,191,188,180,175,172,164,164,156,151,148,140,140,132,127,124,116,111,108,100,100,92,87,84,76,76,68,63,60,52,47,44,39,36,28,28,20,20,12,12,12,12,15,20,23,28,31,36,44,44,52,55,60,68,68,76,79,84,92,95,100,108,108,116,119,124,132,132,140,143,148,156,159,164,172,172,180,183,188,196,199,204,212,212,220,223,228,236,239,244,247,231,180,132,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,108,159,212,252,244,244,236,231,228,220,215,212,204,204,196,191,188,180,175,172,164,164,156,151,148,140,135,132,124,124,116,111,108,100,100,92,87,84,76,71,68,60,60,52,47,44,36,36,28,23,20,12,12,7,7,12,12,20,20,28,28,36,39,44,52,55,60,63,68,76,79,84,92,92,100,103,108,116,119,124,132,132,140,143,148,156,159,164,172,172,180,183,188,196,196,204,207,212,220,223,228,236,236,244,247,236,188,135,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,111,164,212,252,244,244,236,231,228,220,215,212,204,204,196,191,188,180,175,172,164,164,156,151,148,140,135,132,124,124,116,111,108,100,95,92,84,84,76,71,68,60,55,52,47,44,36,31,28,20,20,12,7,0,0,0,12,15,20,23,28,36,39,44,52,52,60,63,68,76,79,84,92,92,100,103,108,116,119,124,132,132,140,143,148,156,156,164,167,172,180,183,188,196,196,204,207,212,220,223,228,236,236,244,247,236,188,135,87,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,111,164,212,252,244,244,236,231,228,220,215,212,204,204,196,191,188,180,175,172,164,164,156,151,148,140,135,132,124,124,116,111,108,100,95,92,84,84,76,71,68,60,55,52,44,44,36,31,28,20,20,12,7,0,0,0,12,12,20,23,28,36,39,44,52,52,60,63,68,76,79,84,92,92,100,103,108,116,119,124,132,132,140,143,148,156,156,164,167,172,180,183,188,196,196,204,207,212,220,223,228,236,236,244,247,236,188,140,87,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,111,164,212,252,244,244,236,231,228,220,215,212,204,204,196,191,188,180,175,172,164,164,156,151,148,140,135,132,124,124,116,111,108,100,95,92,84,84,76,71,68,60,60,52,47,44,36,31,28,20,20,12,12,0,0,7,12,15,20,28,28,36,39,44,52,52,60,63,68,76,79,84,92,92,100,103,108,116,119,124,132,132,140,143,148,156,159,164,167,172,180,183,188,196,196,204,207,212,220,223,228,236,236,244,247,236,188,135,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,108,159,212,252,244,244,236,231,228,220,215,212,204,204,196,191,188,180,175,172,164,164,156,151,148,140,140,132,127,124,116,111,108,100,100,92,87,84,76,71,68,60,60,52,47,44,36,36,28,23,20,15,12,12,12,12,12,20,20,28,31,36,44,44,52,55,60,68,68,76,79,84,92,92,100,103,108,116,119,124,132,132,140,143,148,156,159,164,172,172,180,183,188,196,199,204,212,212,220,223,228,236,236,244,247,236,183,132,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,60,108,156,204,252,244,244,236,231,228,220,215,212,204,204,196,191,188,180,180,172,167,164,156,151,148,140,140,132,127,124,116,111,108,103,100,92,87,84,76,76,68,63,60,52,52,44,39,36,31,28,23,20,20,15,12,15,20,20,28,28,36,36,44,47,52,55,60,68,71,76,84,84,92,95,100,108,108,116,119,124,132,135,140,143,148,156,159,164,172,172,180,183,188,196,199,204,212,212,220,223,228,236,239,244,252,231,180,132,84,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,103,151,204,252,247,244,236,231,228,220,220,212,207,204,196,191,188,180,180,172,167,164,156,156,148,143,140,132,127,124,116,116,108,103,100,92,92,84,79,76,68,68,60,55,52,47,44,36,36,28,28,23,20,20,20,20,20,28,28,31,36,39,44,52,52,60,63,68,71,76,84,84,92,95,100,108,111,116,124,124,132,135,140,148,148,156,159,164,172,175,180,188,188,196,199,204,212,212,220,223,228,236,239,244,252,228,180,127,76,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,100,148,196,247,247,244,236,231,228,220,220,212,207,204,196,196,188,183,180,172,167,164,156,156,148,143,140,132,132,124,119,116,108,108,100,95,92,84,84,76,71,68,60,60,52,52,44,44,36,36,28,28,28,23,23,28,28,28,31,36,39,44,47,52,55,60,68,68,76,76,84,87,92,100,100,108,111,116,124,124,132,135,140,148,151,156,164,164,172,175,180,188,188,196,199,204,212,215,220,228,228,236,239,244,252,220,172,124,76,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,140,191,244,247,244,236,236,228,223,220,212,207,204,196,196,188,183,180,172,172,164,159,156,148,148,140,135,132,124,119,116,111,108,100,100,92,87,84,76,76,68,63,60,55,52,47,44,44,36,36,31,28,28,28,28,31,36,36,39,44,44,52,52,60,60,68,71,76,79,84,92,92,100,103,108,116,116,124,127,132,140,140,148,151,156,164,164,172,175,180,188,191,196,204,204,212,215,220,228,228,236,239,244,252,215,167,116,68,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,135,188,236,247,244,236,236,228,223,220,212,212,204,199,196,188,188,180,175,172,164,159,156,151,148,140,135,132,124,124,116,111,108,103,100,92,92,84,79,76,71,68,63,60,55,52,47,44,44,39,36,36,36,36,36,36,36,39,44,44,52,52,60,60,68,68,76,76,84,87,92,95,100,108,108,116,119,124,132,132,140,143,148,156,156,164,167,172,180,180,188,191,196,204,207,212,215,220,228,231,236,244,244,252,212,159,111,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,79,127,180,228,252,244,239,236,228,228,220,215,212,204,199,196,188,188,180,175,172,164,164,156,151,148,140,140,132,127,124,119,116,108,108,100,95,92,87,84,76,76,68,68,60,60,55,52,47,44,44,44,39,39,39,39,44,44,44,47,52,52,55,60,63,68,71,76,79,84,92,92,100,100,108,111,116,124,124,132,135,140,148,148,156,159,164,172,172,180,183,188,196,196,204,207,212,220,220,228,231,236,244,247,252,204,156,103,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,71,119,172,220,252,244,239,236,228,228,220,215,212,204,204,196,191,188,180,180,172,167,164,156,156,148,143,140,132,132,124,119,116,111,108,100,100,92,92,84,84,76,76,68,68,60,60,55,52,52,47,44,44,44,44,44,44,47,52,52,52,60,60,63,68,71,76,79,84,87,92,95,100,108,108,116,116,124,127,132,140,140,148,151,156,159,164,172,175,180,183,188,196,199,204,212,212,220,223,228,236,236,244,247,244,196,143,95,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,111,159,207,252,244,244,236,231,228,220,220,212,207,204,196,196,188,183,180,172,172,164,159,156,148,148,140,135,132,127,124,116,116,108,108,100,95,92,87,84,79,76,71,68,68,60,60,60,52,52,52,52,52,52,52,52,52,52,55,60,60,63,68,68,76,76,84,84,92,92,100,100,108,111,116,119,124,132,132,140,143,148,151,156,164,167,172,175,180,188,188,196,199,204,212,215,220,223,228,236,239,244,252,236,183,135,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,100,148,196,244,247,244,236,236,228,223,220,212,212,204,199,196,188,188,180,175,172,164,164,156,151,148,143,140,132,132,124,119,116,111,108,103,100,95,92,87,84,79,76,71,68,68,63,60,60,60,55,55,52,52,52,55,55,60,60,60,68,68,71,76,76,84,84,92,92,100,100,108,108,116,116,124,127,132,135,140,148,148,156,159,164,167,172,180,180,188,191,196,204,204,212,215,220,228,228,236,239,244,252,220,172,124,76,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,140,188,236,247,244,239,236,228,223,220,215,212,204,199,196,191,188,180,180,172,167,164,156,156,148,148,140,135,132,127,124,116,116,108,108,100,100,92,92,84,84,79,76,76,68,68,68,63,60,60,60,60,60,60,60,60,63,68,68,68,71,76,76,84,84,87,92,95,100,103,108,111,116,119,124,132,132,140,140,148,151,156,164,164,172,175,180,183,188,196,196,204,207,212,220,220,228,231,236,244,244,252,212,164,116,68,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,124,172,220,252,244,239,236,228,228,220,215,212,207,204,196,196,188,183,180,172,172,164,159,156,151,148,140,140,132,132,124,124,116,116,108,108,100,100,92,92,84,84,79,76,76,71,68,68,68,68,63,63,63,63,68,68,68,68,71,76,76,79,84,84,87,92,95,100,103,108,111,116,119,124,127,132,135,140,148,148,156,156,164,167,172,175,180,188,188,196,199,204,212,212,220,223,228,236,236,244,247,244,196,148,100,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,68,116,164,212,252,244,244,236,231,228,223,220,212,207,204,199,196,188,188,180,175,172,167,164,156,156,148,148,140,135,132,127,124,119,116,111,108,103,100,100,92,92,87,84,84,79,76,76,76,71,68,68,68,68,68,68,71,71,76,76,76,79,84,84,92,92,95,100,100,108,108,116,116,124,124,132,132,140,143,148,151,156,159,164,172,172,180,183,188,191,196,204,204,212,215,220,228,228,236,239,244,252,236,188,140,92,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,100,148,196,244,247,244,236,236,228,223,220,215,212,204,204,196,191,188,183,180,172,172,164,159,156,151,148,143,140,135,132,124,124,119,116,111,108,103,100,100,92,92,87,84,84,84,79,76,76,76,76,76,76,76,76,76,76,76,79,84,84,87,92,92,95,100,100,108,108,116,116,124,124,132,132,140,140,148,148,156,156,164,167,172,175,180,188,188,196,199,204,207,212,220,220,228,231,236,244,244,252,220,172,124,76,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,132,180,228,252,244,239,236,231,228,220,220,212,207,204,196,196,188,188,180,175,172,167,164,156,156,148,148,140,140,132,132,124,124,116,116,111,108,103,100,100,95,92,92,87,84,84,84,84,79,79,79,79,79,79,84,84,84,84,87,92,92,92,100,100,103,108,108,116,116,119,124,127,132,135,140,143,148,151,156,164,164,172,172,180,180,188,191,196,204,204,212,212,220,223,228,236,236,244,247,252,204,156,108,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,68,116,164,212,252,244,244,236,231,228,223,220,212,212,204,199,196,191,188,183,180,172,172,164,164,156,156,148,143,140,140,132,132,124,124,116,116,111,108,108,100,100,100,95,92,92,92,87,84,84,84,84,84,84,84,84,84,87,92,92,92,95,100,100,103,108,108,116,116,119,124,127,132,135,140,140,148,151,156,159,164,167,172,175,180,188,188,196,196,204,207,212,215,220,228,228,236,239,244,252,236,188,140,92,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,100,148,196,239,247,244,239,236,228,228,220,215,212,207,204,196,196,188,188,180,175,172,167,164,159,156,151,148,143,140,135,132,132,124,124,116,116,111,108,108,103,100,100,100,95,92,92,92,92,92,92,92,92,92,92,92,92,92,95,100,100,100,108,108,111,116,116,119,124,127,132,132,140,140,148,148,156,156,164,164,172,172,180,183,188,191,196,199,204,212,212,220,223,228,231,236,244,244,252,215,172,124,76,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,132,175,220,252,244,244,236,231,228,223,220,212,212,204,199,196,191,188,183,180,175,172,164,164,156,156,151,148,143,140,135,132,132,124,124,119,116,116,111,108,108,103,100,100,100,100,95,95,92,92,92,92,92,95,95,100,100,100,100,108,108,108,111,116,116,124,124,127,132,132,140,140,148,148,151,156,159,164,167,172,180,180,188,188,196,196,204,207,212,215,220,228,228,236,236,244,247,244,196,151,108,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,63,108,156,204,247,247,244,236,236,228,228,220,215,212,207,204,199,196,188,188,180,180,172,172,164,164,156,156,148,148,143,140,135,132,132,124,124,119,116,116,111,108,108,108,103,103,100,100,100,100,100,100,100,100,100,100,100,103,108,108,108,111,116,116,119,124,124,127,132,132,140,140,143,148,151,156,159,164,167,172,175,180,183,188,191,196,204,204,212,212,220,223,228,231,236,244,244,252,228,180,132,87,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,135,180,228,252,244,239,236,231,228,223,220,212,212,204,204,196,196,188,183,180,175,172,167,164,164,156,156,148,148,143,140,135,132,132,127,124,124,119,116,116,116,111,108,108,108,108,108,103,103,103,103,103,108,108,108,108,108,111,116,116,116,119,124,124,132,132,135,140,140,143,148,151,156,159,164,164,172,172,180,180,188,191,196,199,204,207,212,215,220,228,228,236,236,244,247,252,204,159,116,68,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,71,116,164,204,252,247,244,236,236,228,228,220,215,212,207,204,199,196,191,188,183,180,175,172,167,164,159,156,156,148,148,143,140,140,132,132,127,124,124,124,119,116,116,116,111,111,108,108,108,108,108,108,108,108,111,111,116,116,116,116,119,124,124,127,132,132,135,140,140,148,148,151,156,159,164,164,172,172,180,180,188,188,196,196,204,204,212,212,220,223,228,231,236,239,244,252,228,183,140,92,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,95,140,183,228,252,244,244,236,231,228,223,220,215,212,204,204,196,196,188,188,180,180,175,172,167,164,159,156,156,148,148,143,140,140,135,132,132,127,124,124,124,119,119,116,116,116,116,116,116,116,116,116,116,116,116,116,119,124,124,124,127,132,132,132,140,140,140,148,148,151,156,159,164,164,172,172,180,180,183,188,191,196,199,204,212,212,220,220,228,228,236,236,244,247,252,207,164,116,71,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,116,164,204,252,247,244,239,236,228,228,220,220,212,212,204,204,196,196,188,188,180,180,172,172,167,164,159,156,156,151,148,148,140,140,140,135,132,132,127,124,124,124,124,124,119,119,119,119,119,119,119,119,124,124,124,124,124,127,132,132,132,135,140,140,143,148,148,151,156,159,164,164,172,172,175,180,183,188,191,196,199,204,207,212,215,220,223,228,231,236,244,244,252,228,183,140,95,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,92,140,180,228,252,244,244,236,236,228,223,220,215,212,207,204,199,196,196,188,188,180,180,172,172,167,164,164,156,156,151,148,148,143,140,140,140,135,132,132,132,127,127,124,124,124,124,124,124,124,124,124,124,124,127,132,132,132,132,135,140,140,143,148,148,151,156,156,159,164,164,172,172,175,180,183,188,191,196,196,204,204,212,212,220,220,228,231,236,239,244,247,247,204,159,116,71,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,71,116,156,204,244,247,244,239,236,231,228,223,220,215,212,207,204,199,196,191,188,188,180,180,175,172,167,164,164,159,156,156,151,148,148,143,140,140,140,135,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,135,140,140,140,140,148,148,148,151,156,156,159,164,164,172,172,175,180,183,188,188,196,196,204,204,212,212,220,220,228,228,236,236,244,244,252,220,180,135,92,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,132,175,220,252,247,244,236,236,228,228,220,220,212,212,207,204,199,196,191,188,188,180,180,175,172,172,164,164,159,156,156,156,148,148,148,143,140,140,140,140,140,135,135,132,132,132,132,132,132,135,135,135,140,140,140,140,143,148,148,148,151,156,156,159,164,164,167,172,172,180,180,183,188,188,196,196,204,204,212,212,215,220,223,228,231,236,239,244,252,236,196,156,111,68,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,63,108,148,191,231,252,244,244,236,236,228,228,220,220,212,212,204,204,199,196,191,188,188,180,180,175,172,172,167,164,164,159,156,156,156,151,148,148,148,143,143,140,140,140,140,140,140,140,140,140,140,140,140,140,143,148,148,148,148,151,156,156,156,164,164,164,167,172,172,180,180,183,188,188,196,196,204,204,207,212,215,220,223,228,231,236,239,244,247,252,212,172,127,84,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,79,124,164,204,244,247,244,239,236,231,228,223,220,220,212,212,204,204,199,196,191,188,188,183,180,180,172,172,172,164,164,164,159,156,156,156,151,148,148,148,148,148,148,143,143,143,143,143,143,143,148,148,148,148,148,151,151,156,156,156,159,164,164,167,172,172,175,180,180,183,188,191,196,196,204,204,207,212,215,220,223,228,228,236,236,244,244,252,228,183,140,100,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,52,92,135,175,215,252,247,244,239,236,231,228,223,220,220,212,212,204,204,199,196,196,188,188,183,180,180,175,172,172,167,164,164,164,159,156,156,156,156,151,151,148,148,148,148,148,148,148,148,148,148,151,151,156,156,156,156,159,164,164,164,167,172,172,172,180,180,180,188,188,191,196,196,204,204,207,212,215,220,220,228,228,236,236,244,244,252,236,196,156,116,76,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,68,108,148,188,228,252,244,244,239,236,231,228,223,220,220,212,212,204,204,199,196,196,191,188,188,180,180,180,175,172,172,167,164,164,164,164,159,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,159,159,164,164,164,167,172,172,172,175,180,180,183,188,188,191,196,196,204,204,207,212,215,220,220,228,228,236,236,239,244,247,244,207,167,127,84,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,76,116,156,196,236,252,244,244,236,236,231,228,223,220,220,212,212,207,204,204,196,196,191,188,188,183,180,180,180,175,172,172,172,167,164,164,164,164,164,159,159,159,159,156,156,159,159,159,159,164,164,164,164,164,167,167,172,172,172,175,180,180,183,188,188,191,196,196,199,204,204,212,212,215,220,220,228,228,236,236,239,244,247,252,215,175,140,100,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,47,87,124,164,204,244,252,244,244,236,236,231,228,223,220,220,212,212,207,204,204,199,196,196,191,188,188,183,180,180,180,175,172,172,172,172,167,167,164,164,164,164,164,164,164,164,164,164,164,164,164,167,172,172,172,172,175,175,180,180,180,188,188,188,191,196,196,199,204,204,212,212,215,220,220,228,228,231,236,239,244,247,252,220,183,148,108,68,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,55,92,132,172,207,244,247,244,244,236,236,231,228,223,220,220,215,212,212,204,204,199,196,196,196,188,188,188,183,180,180,180,180,175,172,172,172,172,172,172,172,172,167,167,167,172,172,172,172,172,172,172,175,175,180,180,180,183,188,188,188,191,196,196,199,204,204,207,212,212,215,220,223,228,228,236,236,239,244,247,252,228,188,151,116,76,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,63,100,140,175,212,247,247,244,244,236,236,231,228,228,220,220,215,212,212,207,204,204,199,196,196,196,188,188,188,188,183,180,180,180,180,180,175,175,172,172,172,172,172,172,172,172,175,175,175,180,180,180,180,180,183,188,188,188,191,196,196,196,204,204,204,212,212,212,220,220,223,228,228,236,236,239,244,247,252,228,196,156,119,84,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,68,108,140,180,212,247,247,244,244,236,236,231,228,228,223,220,220,212,212,212,204,204,204,199,196,196,196,191,188,188,188,188,183,183,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,183,183,188,188,188,188,191,196,196,196,199,204,204,207,212,212,215,220,220,223,228,228,236,236,239,244,247,252,231,196,159,124,84,52,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,71,108,143,180,212,247,252,244,244,239,236,236,228,228,223,220,220,215,212,212,207,204,204,204,199,196,196,196,196,191,188,188,188,188,188,188,183,183,183,183,183,183,183,183,188,188,188,188,188,188,188,191,196,196,196,199,204,204,204,207,212,212,212,220,220,220,228,228,231,236,236,239,244,247,252,228,196,159,124,92,52,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,71,108,140,175,212,244,252,244,244,239,236,236,231,228,228,220,220,220,215,212,212,207,204,204,204,204,199,196,196,196,196,191,191,191,188,188,188,188,188,188,188,188,188,188,188,191,191,196,196,196,196,196,199,204,204,204,207,212,212,212,215,220,220,223,228,228,231,236,236,244,244,247,252,228,196,159,124,92,52,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,71,108,140,172,204,236,252,247,244,244,236,236,231,228,228,223,220,220,220,215,212,212,212,207,204,204,204,204,199,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,199,199,204,204,204,204,207,212,212,212,215,220,220,223,228,228,231,236,236,239,244,244,247,252,220,188,156,124,92,52,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,68,103,135,167,199,231,252,247,244,244,239,236,236,231,228,228,223,220,220,220,215,212,212,212,207,207,204,204,204,204,204,199,199,199,199,196,196,196,196,199,199,199,199,204,204,204,204,204,204,207,212,212,212,212,215,220,220,223,228,228,228,231,236,236,239,244,244,252,244,215,183,151,119,84,52,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,68,100,132,164,191,220,252,252,244,244,239,236,236,236,228,228,228,223,220,220,220,215,215,212,212,212,212,207,207,204,204,204,204,204,204,204,204,204,204,204,204,204,204,207,207,212,212,212,212,212,215,220,220,220,223,228,228,228,231,236,236,239,244,244,247,252,236,207,175,148,116,84,52,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,60,92,124,151,180,212,239,252,247,244,244,239,236,236,236,228,228,228,223,223,220,220,220,215,215,212,212,212,212,212,212,212,212,207,207,207,207,212,212,212,212,212,212,212,212,215,215,220,220,220,220,223,228,228,228,231,236,236,236,244,244,244,252,252,228,196,167,140,108,76,44,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,84,111,140,172,196,228,252,252,244,244,244,239,236,236,236,231,228,228,228,223,223,220,220,220,220,220,215,215,215,212,212,212,212,212,212,212,212,212,215,215,215,220,220,220,220,220,223,228,228,228,228,231,236,236,236,239,244,244,247,252,236,212,183,156,127,100,68,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,44,71,100,132,156,183,212,236,252,247,244,244,244,239,236,236,236,231,228,228,228,228,228,223,223,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,223,223,228,228,228,228,231,236,236,236,236,244,244,244,247,252,247,220,196,172,140,116,84,60,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,60,87,116,140,164,191,215,239,252,247,244,244,244,239,236,236,236,236,231,231,228,228,228,228,228,228,223,223,223,223,223,223,223,223,223,223,228,228,228,228,228,228,228,231,236,236,236,236,239,244,244,244,247,252,252,228,204,180,156,127,100,76,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,71,100,124,148,172,196,220,239,252,252,247,244,244,244,239,236,236,236,236,236,231,231,231,228,228,228,228,228,228,228,228,228,228,228,228,228,231,231,236,236,236,236,236,239,244,244,244,244,247,252,252,228,207,183,159,135,111,84,60,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,55,79,108,127,151,172,196,215,236,252,252,247,244,244,244,244,244,239,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,239,239,244,244,244,244,247,252,252,244,228,204,183,164,140,116,92,68,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,60,84,108,127,148,172,188,207,228,244,252,252,247,247,244,244,244,244,244,244,239,239,239,239,236,236,236,236,236,239,239,239,239,244,244,244,244,244,244,247,252,252,252,236,215,196,180,159,140,116,95,71,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,39,60,84,103,124,143,164,180,196,212,228,239,252,252,252,247,247,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,247,247,252,252,252,244,236,220,204,188,172,151,132,116,92,71,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,60,76,95,116,132,148,164,180,191,204,215,228,236,247,252,252,252,252,252,247,247,247,247,247,247,252,252,252,252,252,252,244,236,220,212,196,188,172,156,140,124,108,87,68,47,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,52,68,84,100,116,132,143,156,167,180,188,196,204,212,220,223,228,231,236,236,236,236,236,231,228,220,215,212,204,196,183,172,164,148,140,124,108,92,76,60,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,52,68,84,95,108,119,132,140,148,156,164,172,175,180,180,188,188,188,188,183,180,180,172,167,159,156,143,135,124,116,100,92,76,60,44,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,47,60,71,84,92,100,108,116,119,124,132,132,135,135,140,135,132,132,127,124,116,111,103,95,84,76,68,52,44,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,31,44,52,60,68,71,76,79,84,84,87,87,84,84,84,76,76,68,60,52,44,36,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,20,28,28,36,36,36,36,36,36,31,28,23,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};\n      const uint8_t FLARE_TEXTURE_5[16384] ={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,28,36,39,44,52,55,60,60,60,60,60,60,60,52,52,44,36,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,36,44,60,68,76,84,92,95,100,108,108,108,111,111,111,108,108,103,100,92,84,79,71,60,52,44,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,44,60,71,84,95,108,116,124,132,140,148,148,156,156,159,164,164,164,159,156,151,148,140,135,127,119,111,100,92,76,68,52,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,44,60,76,92,108,119,132,143,156,164,172,180,188,196,199,204,207,212,212,212,212,212,204,204,196,191,188,180,172,159,148,140,124,116,100,84,68,52,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,36,55,76,92,108,124,140,156,167,180,191,204,212,220,228,236,244,252,252,252,252,252,252,252,252,252,252,247,244,236,228,220,207,196,188,172,164,148,132,116,100,84,63,44,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,39,60,84,100,119,140,156,172,188,204,215,228,244,252,247,244,244,244,239,236,236,236,236,236,236,236,236,236,236,236,239,244,244,247,252,244,236,220,212,196,180,164,148,132,108,92,71,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,39,60,84,108,124,148,164,183,204,220,236,252,247,244,239,236,236,231,228,228,228,223,220,220,220,220,220,220,220,220,223,223,228,228,228,236,236,239,244,244,252,244,228,212,196,175,156,135,116,95,76,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,36,60,84,108,132,151,172,191,212,228,247,247,244,236,236,228,228,223,220,220,215,212,212,212,212,207,207,207,207,207,207,207,212,212,212,212,220,220,220,228,228,231,236,239,244,252,239,220,204,180,164,140,116,92,71,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,52,76,100,124,148,172,196,220,236,252,244,239,236,228,228,220,220,212,212,207,204,204,199,199,196,196,196,196,196,196,196,196,196,196,196,199,204,204,204,212,212,215,220,223,228,231,236,244,247,247,228,204,183,164,140,116,92,63,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,39,68,92,119,148,172,196,220,239,247,244,236,231,228,220,215,212,207,204,204,196,196,191,188,188,188,188,183,183,180,180,180,180,180,183,183,188,188,188,191,196,196,199,204,204,212,212,220,223,228,236,239,244,252,228,204,180,156,132,108,79,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,79,108,135,164,188,212,236,252,244,236,228,223,220,212,207,204,199,196,191,188,188,183,180,180,175,172,172,172,172,172,172,172,172,172,172,172,172,175,180,180,180,183,188,188,196,196,204,204,212,215,220,228,231,236,244,252,228,204,175,148,124,92,68,36,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,60,92,124,148,180,204,228,252,244,236,228,223,220,212,204,204,196,191,188,183,180,180,172,172,172,164,164,164,164,159,159,159,156,156,159,159,159,164,164,164,164,167,172,172,175,180,180,188,188,196,196,204,207,212,220,228,231,239,244,244,220,191,164,135,108,76,47,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,39,71,100,132,164,188,220,244,244,236,228,223,220,212,204,199,196,188,183,180,175,172,172,164,164,159,156,156,156,151,151,148,148,148,148,148,148,148,148,148,151,156,156,156,159,164,164,167,172,172,180,180,188,191,196,204,207,212,220,228,236,244,252,231,204,175,148,116,87,55,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,44,79,108,140,172,204,231,252,244,236,228,220,212,204,199,196,188,183,180,172,172,164,164,156,156,151,148,148,148,143,140,140,140,140,140,140,140,140,140,140,140,140,140,143,148,148,151,156,156,159,164,167,172,175,180,188,188,196,204,207,215,220,228,236,244,244,215,188,156,124,92,63,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,84,116,148,180,212,244,244,236,228,220,212,207,199,196,188,180,180,172,167,164,156,156,151,148,148,140,140,140,135,132,132,132,132,127,127,127,127,127,127,132,132,132,132,132,135,140,140,143,148,148,156,156,164,164,172,172,180,188,191,196,204,212,220,228,236,244,252,228,196,164,132,100,68,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,87,124,156,188,220,252,244,236,228,220,212,204,196,188,183,180,172,164,164,156,151,148,148,140,140,135,132,132,127,124,124,124,124,119,119,119,116,116,116,119,119,119,124,124,124,124,132,132,132,135,140,143,148,148,156,159,164,172,172,180,188,196,199,204,212,220,228,236,247,236,204,172,140,108,71,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,55,92,124,156,191,228,252,239,231,223,215,207,199,191,188,180,172,167,164,156,151,148,143,140,135,132,127,124,124,119,116,116,116,116,111,111,108,108,108,108,108,108,111,111,116,116,116,116,119,124,124,127,132,132,140,140,148,148,156,159,164,172,175,180,188,196,204,212,220,228,236,244,244,207,175,140,108,71,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,92,124,159,196,228,247,239,228,220,212,204,196,188,180,175,172,164,156,151,148,140,140,132,132,124,124,119,116,116,111,108,108,108,108,103,100,100,100,100,100,100,100,100,103,103,108,108,108,111,116,116,116,124,124,127,132,135,140,148,148,156,159,164,172,180,188,196,199,207,215,228,236,244,244,212,180,143,108,71,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,52,87,124,159,196,228,247,236,228,220,212,204,196,188,180,172,164,159,156,148,143,140,132,132,124,124,116,116,111,108,108,103,100,100,100,100,95,92,92,92,92,92,92,92,92,95,95,100,100,100,100,108,108,108,116,116,119,124,127,132,135,140,148,151,156,164,172,175,183,188,196,204,212,223,236,244,247,212,180,140,108,68,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,44,84,124,156,196,228,247,236,228,220,212,199,191,183,180,172,164,156,148,148,140,132,132,124,119,116,116,108,108,103,100,100,95,92,92,92,92,87,87,84,84,84,84,84,84,84,87,87,92,92,92,95,100,100,100,103,108,111,116,116,124,127,132,140,140,148,156,159,164,172,180,188,196,204,212,220,231,244,247,212,175,140,103,68,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,79,116,156,191,228,247,236,228,220,207,199,191,183,175,167,164,156,148,140,135,132,124,124,116,111,108,108,100,100,95,92,92,87,84,84,84,84,79,79,79,76,76,76,76,79,79,79,84,84,84,84,87,92,92,92,100,100,103,108,108,116,119,124,127,132,140,148,151,156,164,172,180,188,196,204,212,220,231,244,247,212,172,135,100,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,71,108,148,188,228,247,236,228,220,207,199,188,180,172,164,159,151,148,140,132,127,124,116,116,108,108,100,100,92,92,87,84,84,84,79,76,76,76,76,76,71,71,71,71,71,71,71,76,76,76,76,76,79,84,84,87,92,92,95,100,103,108,111,116,119,124,132,135,140,148,156,164,172,180,188,196,204,212,220,231,244,244,204,167,132,92,52,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,60,100,140,180,220,252,239,228,220,207,199,188,180,172,164,156,151,143,140,132,124,119,116,108,108,100,100,92,92,87,84,84,79,76,76,76,71,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,71,76,76,76,79,84,84,92,92,95,100,103,108,116,116,124,127,132,140,148,156,164,172,180,188,196,204,212,223,236,244,236,199,164,124,84,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,52,92,132,172,212,252,239,228,220,212,199,188,180,172,164,156,148,143,135,132,124,116,116,108,103,100,92,92,87,84,79,76,76,71,68,68,68,68,63,60,60,60,60,60,60,60,60,60,60,60,60,63,63,68,68,68,71,76,76,79,84,84,92,92,95,100,108,108,116,124,127,132,140,148,156,164,172,180,188,196,204,212,223,236,244,231,191,151,111,71,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,79,124,164,204,244,244,231,220,212,199,191,180,172,164,156,148,140,135,127,124,116,111,108,100,95,92,87,84,79,76,76,71,68,68,63,60,60,60,60,55,55,55,52,52,52,52,52,52,52,55,55,60,60,60,60,63,68,68,68,76,76,79,84,84,92,92,100,103,108,116,119,124,132,140,148,156,164,172,180,188,196,204,215,228,236,252,220,180,140,100,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,68,108,148,188,231,244,236,223,212,204,191,183,172,164,156,148,140,135,127,124,116,108,103,100,92,92,84,84,76,76,71,68,68,63,60,60,60,55,52,52,52,52,52,52,47,47,47,47,47,52,52,52,52,52,52,55,60,60,60,63,68,68,76,76,79,84,87,92,100,100,108,111,116,124,132,140,148,156,164,172,180,188,196,207,220,228,239,252,212,172,132,87,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,52,92,135,180,220,252,236,228,215,204,196,183,175,164,156,148,140,135,127,124,116,108,103,100,92,87,84,79,76,71,68,68,63,60,60,55,52,52,52,47,47,44,44,44,44,44,44,44,44,44,44,44,44,44,47,52,52,52,52,55,60,60,63,68,68,76,76,84,84,92,95,100,108,111,116,124,132,140,148,156,164,172,180,188,199,212,220,231,244,239,196,156,116,71,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,76,119,164,204,244,244,228,220,207,196,188,180,167,159,151,143,135,127,124,116,108,100,100,92,87,84,76,76,68,68,63,60,60,55,52,52,47,44,44,44,44,44,39,39,39,39,36,36,36,39,39,39,44,44,44,44,44,47,52,52,52,55,60,60,68,68,71,76,79,84,92,92,100,108,111,116,124,132,140,148,156,164,172,180,191,204,212,223,236,247,228,183,140,100,55,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,60,100,148,188,228,244,236,220,212,199,188,180,172,164,151,143,135,127,124,116,108,100,100,92,84,84,76,76,68,68,60,60,55,52,52,47,44,44,44,39,39,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,39,44,44,44,47,52,52,52,60,60,63,68,71,76,79,84,92,92,100,108,111,116,124,132,140,148,156,164,172,183,196,204,215,228,239,252,212,164,124,79,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,84,124,172,212,252,236,228,212,204,191,180,172,164,156,148,140,132,124,116,108,100,100,92,84,84,76,71,68,63,60,60,52,52,47,44,44,44,39,36,36,36,36,36,31,31,31,28,28,28,28,28,31,31,31,36,36,36,36,36,39,44,44,47,52,52,55,60,60,68,68,76,76,84,87,92,100,108,111,119,124,132,140,148,156,167,180,188,196,207,220,231,244,236,191,148,108,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,60,108,148,196,236,244,228,220,207,196,188,175,164,156,148,140,132,124,116,108,103,100,92,84,79,76,71,68,63,60,55,52,52,44,44,44,39,36,36,36,31,31,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,31,36,36,36,36,39,44,44,47,52,52,60,60,68,68,76,76,84,87,92,100,108,116,119,127,135,143,151,164,172,180,191,204,212,223,236,252,215,172,127,84,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,84,132,172,220,252,236,223,212,199,188,180,172,159,148,140,132,124,116,111,103,100,92,84,84,76,71,68,60,60,52,52,47,44,44,39,36,36,36,31,28,28,28,28,28,23,23,23,23,23,23,23,23,23,23,28,28,28,28,28,31,31,36,36,36,44,44,44,52,52,55,60,63,68,76,76,84,92,95,100,108,116,124,132,140,148,156,164,172,183,196,204,220,228,244,239,196,151,108,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,60,108,151,196,239,244,228,220,204,196,183,172,164,156,148,135,127,119,116,108,100,92,87,84,76,71,68,60,60,52,52,47,44,44,36,36,36,31,28,28,28,28,23,23,20,20,20,20,20,20,20,20,20,20,20,20,20,23,28,28,28,28,31,36,36,36,39,44,44,52,52,55,60,63,68,76,79,84,92,95,100,108,116,124,132,140,148,156,167,180,188,199,212,223,236,247,220,172,127,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,124,172,220,247,236,223,212,199,188,180,167,156,148,140,132,124,116,108,100,92,87,84,76,71,68,60,60,52,52,44,44,39,36,36,31,28,28,28,28,23,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,23,23,28,28,28,31,36,36,39,44,44,47,52,55,60,63,68,76,79,84,92,100,103,111,119,127,135,143,156,164,172,183,196,204,220,228,244,239,196,148,103,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,55,100,148,191,236,244,228,220,204,196,180,172,164,151,143,132,124,116,108,103,95,92,84,76,76,68,63,60,52,52,44,44,39,36,36,31,28,28,28,23,20,20,20,20,20,15,15,15,15,12,12,12,12,12,15,15,15,20,20,20,20,20,23,23,28,28,28,36,36,36,44,44,47,52,55,60,68,68,76,84,87,92,100,108,116,124,132,140,148,156,167,180,188,199,212,223,236,252,215,172,124,76,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,119,164,212,252,236,223,212,199,188,180,164,156,148,140,132,124,116,108,100,92,84,79,76,68,63,60,52,52,44,44,39,36,36,31,28,28,23,20,20,20,20,20,15,15,12,12,12,12,12,12,12,12,12,12,12,12,12,15,15,20,20,20,20,23,28,28,28,31,36,36,44,44,47,52,60,60,68,71,76,84,92,95,100,108,116,124,132,140,151,164,172,180,196,204,220,228,244,236,188,143,95,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,140,183,228,244,231,220,204,196,183,172,164,151,140,132,124,116,108,100,92,87,84,76,68,68,60,55,52,47,44,39,36,36,31,28,28,23,20,20,20,20,15,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,15,15,20,20,20,20,28,28,28,31,36,36,44,44,52,52,60,60,68,76,79,84,92,100,108,116,124,132,140,148,156,167,180,188,199,212,223,236,252,207,164,116,68,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,108,156,204,247,239,228,212,204,188,180,167,156,148,140,132,119,111,108,100,92,84,76,71,68,60,60,52,47,44,39,36,36,31,28,28,23,20,20,20,15,12,12,12,12,12,12,12,7,7,7,7,7,7,7,7,12,12,12,12,12,12,12,15,15,20,20,20,23,28,28,31,36,36,44,44,52,52,60,63,68,76,84,87,92,100,108,116,124,132,140,151,164,172,183,196,207,220,231,244,228,180,132,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,124,172,220,247,236,220,207,196,183,172,164,151,143,132,124,116,108,100,92,87,79,76,68,63,60,52,52,44,44,36,36,31,28,28,23,20,20,20,15,12,12,12,12,12,7,7,7,7,0,0,0,0,0,0,0,7,7,7,12,12,12,12,12,12,15,20,20,20,23,28,28,31,36,39,44,47,52,55,60,68,71,76,84,92,100,108,111,124,132,140,148,156,167,180,188,204,212,228,239,244,196,148,100,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,140,188,236,244,228,215,204,191,180,172,156,148,140,132,124,116,108,100,92,84,76,71,68,60,55,52,44,44,36,36,31,28,28,23,20,20,20,15,12,12,12,12,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,12,15,20,20,20,23,28,28,36,36,39,44,47,52,60,63,68,76,79,87,92,100,108,116,124,132,143,156,164,172,188,196,212,220,236,252,212,164,116,68,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,108,156,204,252,236,228,212,199,188,175,164,156,148,135,124,116,108,100,92,87,79,76,68,63,60,52,47,44,39,36,31,28,28,23,20,20,20,15,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,15,20,20,20,28,28,31,36,36,44,44,52,55,60,68,71,76,84,92,100,108,116,124,132,140,148,159,172,180,196,204,220,231,244,228,180,132,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,71,119,167,215,247,236,220,207,196,183,172,164,151,140,132,124,116,108,100,92,84,76,71,68,60,55,52,44,44,36,36,28,28,23,20,20,20,15,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,15,20,20,23,28,28,31,36,39,44,47,52,60,63,68,76,84,87,95,100,108,116,127,135,148,156,167,180,188,204,212,228,244,239,191,143,95,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,132,180,228,244,228,220,204,191,180,172,156,148,140,127,119,111,103,95,87,84,76,68,63,60,52,47,44,39,36,31,28,28,20,20,20,15,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,23,28,28,36,36,44,44,52,55,60,68,71,76,84,92,100,108,116,124,132,143,156,164,172,188,196,212,223,236,252,204,156,108,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,95,143,191,244,239,228,212,204,188,180,164,156,148,135,124,116,108,100,92,84,79,71,68,60,55,52,44,44,36,36,28,28,23,20,20,15,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,20,28,28,31,36,39,44,47,52,60,63,68,76,84,92,95,103,111,124,132,140,148,159,172,183,196,207,220,236,247,215,167,119,71,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,60,108,156,204,252,236,223,212,196,188,172,164,151,140,132,124,116,108,100,92,84,76,68,63,60,52,47,44,39,36,31,28,28,20,20,20,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,23,28,28,36,36,44,44,52,55,60,68,76,79,87,92,100,108,116,127,140,148,156,167,180,191,204,220,228,244,228,180,132,84,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,68,116,164,212,247,236,220,207,196,183,172,159,148,140,132,119,111,103,95,87,84,76,68,60,60,52,44,44,36,36,28,28,23,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,28,28,31,36,39,44,52,52,60,68,71,76,84,92,100,108,116,124,132,143,156,164,180,188,204,212,228,244,236,188,140,92,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,124,172,220,244,231,220,204,191,180,172,156,148,140,127,116,108,100,92,84,79,76,68,60,55,52,44,39,36,31,28,28,20,20,20,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,23,28,28,36,36,44,47,52,60,63,68,76,84,92,100,108,116,124,132,140,151,164,172,188,196,212,228,236,247,196,148,100,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,132,180,228,244,228,215,204,188,180,164,156,148,135,124,116,108,100,92,84,76,71,68,60,52,47,44,39,36,31,28,23,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,20,20,20,28,28,36,36,44,44,52,55,60,68,76,84,87,95,103,111,124,132,140,148,164,172,183,196,212,220,236,252,204,156,108,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,92,140,188,236,244,228,212,199,188,175,164,156,143,132,124,116,108,100,92,84,76,68,63,60,52,47,44,36,36,28,28,23,20,20,15,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,28,28,31,36,39,44,52,55,60,68,76,79,87,92,100,108,119,127,140,148,159,172,180,196,207,220,236,247,212,164,116,68,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,95,148,196,244,239,228,212,199,188,172,164,151,140,132,124,116,108,100,92,84,76,68,60,55,52,44,44,36,36,28,28,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,23,28,31,36,39,44,47,52,60,68,71,76,84,92,100,108,116,127,140,148,156,172,180,191,204,220,231,244,220,172,119,71,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,100,148,199,252,236,223,212,196,188,172,164,151,140,132,124,111,103,95,87,79,76,68,60,55,52,44,39,36,31,28,23,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,20,20,23,28,28,36,36,44,47,52,60,63,68,76,84,92,100,108,116,124,135,148,156,167,180,191,204,220,228,244,223,175,124,76,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,55,108,156,204,252,236,220,212,196,183,172,159,148,140,132,119,111,100,92,87,79,76,68,60,55,52,44,39,36,31,28,23,20,20,15,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,28,28,36,36,44,47,52,60,63,68,76,84,92,100,108,116,124,132,143,156,164,180,188,204,215,228,244,228,180,132,79,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,60,108,156,207,252,236,220,207,196,183,172,159,148,140,127,119,108,100,92,84,79,71,68,60,52,52,44,39,36,31,28,23,20,20,15,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,28,28,36,36,44,44,52,60,63,68,76,84,92,100,108,116,124,132,143,156,164,180,188,204,212,228,244,231,180,132,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,108,159,212,252,236,220,207,196,180,172,159,148,140,127,119,108,100,92,84,76,71,68,60,52,47,44,39,36,28,28,23,20,20,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,28,28,31,36,44,44,52,55,60,68,76,84,92,100,108,116,124,132,143,156,164,175,188,204,212,228,244,236,188,135,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,111,164,212,252,236,220,207,196,180,172,156,148,140,127,116,108,100,92,84,76,71,68,60,52,47,44,36,36,28,28,23,20,20,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,28,28,31,36,44,44,52,55,60,68,76,84,92,100,108,116,124,132,140,156,164,175,188,199,212,228,244,236,188,135,87,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,111,164,212,252,236,220,207,196,180,172,156,148,140,127,116,108,100,92,84,76,71,68,60,52,47,44,36,36,28,28,23,20,20,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,23,28,31,36,44,44,52,55,60,68,76,84,92,100,108,116,124,132,140,156,164,175,188,199,212,228,244,236,188,140,87,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,111,164,212,252,236,220,207,196,180,172,159,148,140,127,116,108,100,92,84,76,71,68,60,52,47,44,36,36,28,28,23,20,20,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,28,28,31,36,44,44,52,55,60,68,76,84,92,100,108,116,124,132,143,156,164,175,188,199,212,228,244,236,188,135,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,108,159,212,252,236,220,207,196,180,172,159,148,140,127,119,108,100,92,84,79,71,68,60,52,47,44,39,36,28,28,23,20,20,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,28,28,31,36,44,44,52,55,60,68,76,84,92,100,108,116,124,132,143,156,164,175,188,204,212,228,244,236,183,132,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,60,108,156,204,252,236,220,207,196,183,172,159,148,140,132,119,111,100,92,84,79,71,68,60,52,52,44,39,36,31,28,23,20,20,15,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,28,28,36,36,44,44,52,60,63,68,76,84,92,100,108,116,124,132,143,156,164,180,188,204,215,228,244,231,180,132,84,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,103,151,204,252,236,223,212,196,183,172,164,148,140,132,119,111,103,95,87,79,76,68,60,55,52,44,39,36,31,28,23,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,20,20,23,28,28,36,36,44,47,52,60,63,68,76,84,92,100,108,116,124,135,148,156,164,180,188,204,215,228,244,228,180,127,76,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,100,148,196,247,236,223,212,196,188,172,164,151,140,132,124,116,103,95,87,84,76,68,60,55,52,44,44,36,31,28,28,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,15,20,20,23,28,28,36,36,44,47,52,60,68,71,76,84,92,100,108,116,124,135,148,156,167,180,191,204,220,231,244,220,172,124,76,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,140,191,244,239,228,212,199,188,175,164,156,140,132,124,116,108,100,92,84,76,68,63,60,52,44,44,36,36,28,28,20,20,20,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,23,28,31,36,39,44,52,52,60,68,71,79,84,92,100,108,116,127,140,148,156,172,180,196,204,220,236,247,215,167,116,68,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,135,188,236,244,228,212,204,188,180,164,156,143,132,124,116,108,100,92,84,76,68,63,60,52,47,44,36,36,28,28,23,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,28,28,31,36,44,44,52,55,60,68,76,79,87,95,103,111,119,132,140,148,159,172,183,196,207,220,236,252,212,159,111,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,79,127,180,228,244,228,220,204,191,180,167,156,148,135,124,116,108,100,92,84,76,71,68,60,52,52,44,39,36,31,28,28,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,23,28,28,36,36,44,44,52,60,60,68,76,84,92,100,108,116,124,132,140,151,164,172,188,196,212,223,236,252,204,156,103,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,71,119,172,220,247,236,220,204,196,180,172,159,148,140,132,119,111,100,95,87,79,76,68,60,55,52,44,44,36,36,28,28,23,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,23,28,31,36,39,44,47,52,60,63,68,76,84,92,100,108,116,124,132,143,156,164,175,188,199,212,228,239,244,196,143,95,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,111,159,207,252,236,220,212,196,183,172,164,151,140,132,124,116,108,100,92,84,76,68,63,60,52,47,44,36,36,31,28,23,20,20,15,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,15,20,20,23,28,28,31,36,44,44,52,55,60,68,71,79,84,92,100,108,116,124,135,148,156,167,180,188,204,215,228,244,236,183,135,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,100,148,196,244,239,228,212,199,188,175,164,156,143,132,124,116,108,100,92,84,76,71,68,60,52,52,44,39,36,31,28,28,23,20,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,23,28,31,36,36,44,47,52,60,60,68,76,84,87,95,103,111,119,132,140,148,159,172,180,196,204,220,231,244,220,172,124,76,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,140,188,236,244,228,215,204,188,180,167,156,148,135,127,116,108,100,92,87,79,76,68,60,55,52,47,44,36,36,31,28,23,20,20,15,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,23,28,28,31,36,39,44,52,52,60,68,68,76,84,92,100,108,116,124,132,140,151,164,172,183,196,212,220,236,252,212,164,116,68,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,124,172,220,244,231,220,204,196,180,172,159,148,140,132,124,116,103,100,92,84,76,68,63,60,52,52,44,39,36,36,28,28,23,20,20,15,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,15,20,20,20,28,28,31,36,36,44,44,52,55,60,68,76,79,84,92,100,108,116,124,135,143,156,164,175,188,199,212,228,239,244,196,148,100,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,68,116,164,212,252,236,223,212,196,188,172,164,156,143,132,124,116,108,100,92,84,79,76,68,60,55,52,47,44,36,36,31,28,28,20,20,20,15,12,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,15,20,20,20,23,28,28,36,36,39,44,52,52,60,63,68,76,84,92,95,103,111,119,132,140,148,156,172,180,191,204,215,228,244,236,188,140,92,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,100,148,196,244,239,228,212,204,188,180,167,156,148,140,127,119,111,103,95,92,84,76,68,63,60,52,52,44,44,36,36,28,28,28,20,20,20,15,12,12,12,12,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,15,20,20,20,23,28,28,31,36,39,44,47,52,55,60,68,76,79,84,92,100,108,116,124,132,140,151,164,172,183,196,207,220,236,247,220,172,124,76,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,132,180,228,244,231,220,204,196,180,172,164,148,140,132,124,116,108,100,92,84,79,76,68,60,60,52,47,44,39,36,36,28,28,23,20,20,20,15,12,12,12,12,12,7,7,7,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,12,15,20,20,20,23,28,28,31,36,36,44,44,52,52,60,63,68,76,84,87,95,103,108,119,127,135,148,156,164,180,188,199,212,228,236,252,204,156,108,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,68,116,164,212,252,236,223,212,196,188,175,164,156,148,135,127,116,108,103,95,92,84,76,68,68,60,55,52,44,44,39,36,31,28,28,23,20,20,20,15,15,12,12,12,12,12,12,7,7,7,7,7,7,7,7,7,7,7,12,12,12,12,12,12,15,20,20,20,23,28,28,31,36,36,44,44,47,52,60,60,68,76,79,84,92,100,108,116,124,132,140,148,159,172,180,191,204,220,228,244,236,188,140,92,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,100,148,196,239,244,228,215,204,191,180,172,159,148,140,132,124,116,108,100,92,84,79,76,68,63,60,52,52,44,44,36,36,31,28,28,23,20,20,20,20,15,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,15,15,20,20,20,23,28,28,31,36,36,39,44,47,52,55,60,68,71,76,84,92,95,103,108,116,127,135,148,156,164,175,188,196,212,220,236,247,215,172,124,76,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,132,175,220,247,236,220,207,196,188,172,164,156,148,135,127,119,111,103,95,92,84,76,71,68,60,60,52,52,44,44,36,36,31,28,28,28,23,20,20,20,15,15,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,15,15,20,20,20,20,23,28,28,31,36,36,39,44,47,52,55,60,63,68,76,84,87,92,100,108,116,124,132,140,148,159,172,180,191,204,212,228,239,244,196,151,108,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,63,108,156,204,247,239,228,212,204,188,180,172,159,148,140,132,124,116,108,100,92,87,84,76,71,68,60,55,52,47,44,44,36,36,31,28,28,28,23,20,20,20,20,20,15,15,12,12,12,12,12,12,12,12,12,12,15,15,15,20,20,20,20,23,28,28,28,31,36,36,39,44,44,52,52,60,63,68,76,79,84,92,100,103,111,119,127,135,148,156,164,172,188,196,207,220,236,244,228,180,132,87,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,135,180,228,244,231,220,207,196,188,172,164,156,148,140,127,119,116,108,100,92,84,79,76,68,68,60,55,52,47,44,44,36,36,36,31,28,28,28,23,20,20,20,20,20,20,15,15,15,15,15,15,15,15,20,20,20,20,20,20,23,23,28,28,28,31,36,36,39,44,44,52,52,60,60,68,71,76,84,92,95,100,108,116,124,132,140,148,159,172,180,188,204,212,228,239,252,204,159,116,68,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,71,116,164,204,252,236,228,212,204,191,180,172,159,151,140,132,124,116,108,103,100,92,84,79,76,68,63,60,55,52,47,44,44,39,36,36,31,28,28,28,28,23,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,23,23,28,28,28,31,36,36,36,44,44,47,52,52,60,60,68,71,76,84,87,92,100,108,116,124,132,140,148,156,164,175,188,196,207,220,231,244,228,183,140,92,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,95,140,183,228,244,231,220,207,196,188,175,164,156,148,140,132,124,116,108,100,95,92,84,76,76,68,63,60,55,52,52,44,44,39,36,36,36,31,28,28,28,28,28,23,23,20,20,20,20,20,20,20,20,23,23,23,28,28,28,28,31,31,36,36,39,44,44,47,52,52,60,60,68,71,76,84,84,92,100,108,111,119,127,135,143,151,164,172,180,191,204,212,228,239,252,207,164,116,71,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,116,164,204,252,239,228,215,204,196,180,172,164,156,148,135,127,124,116,108,100,92,92,84,76,76,68,63,60,60,52,52,47,44,44,39,36,36,36,31,28,28,28,28,28,28,28,28,28,23,28,28,28,28,28,28,28,28,31,31,36,36,36,39,44,44,47,52,55,60,60,68,71,76,84,84,92,100,103,108,116,124,132,140,148,156,167,180,188,196,212,220,236,244,228,183,140,95,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,92,140,180,228,244,236,220,212,199,188,180,172,159,151,140,132,127,119,111,108,100,92,87,84,76,76,68,68,60,60,52,52,47,44,44,44,39,36,36,36,36,31,31,28,28,28,28,28,28,28,28,28,28,28,31,31,36,36,36,36,39,44,44,47,52,52,55,60,63,68,71,76,84,84,92,100,103,108,116,124,132,140,148,156,164,172,183,196,204,215,228,239,247,204,159,116,71,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,71,116,156,204,244,244,228,220,204,196,188,175,164,156,148,140,132,124,116,111,108,100,92,87,84,79,76,68,68,60,60,55,52,52,47,44,44,44,39,36,36,36,36,36,36,36,31,31,31,31,31,36,36,36,36,36,36,39,44,44,44,44,52,52,52,60,60,63,68,71,76,84,84,92,100,100,108,116,124,132,140,148,156,164,172,180,188,204,212,223,236,247,220,180,135,92,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,132,175,220,252,236,228,212,204,196,183,172,164,156,148,140,132,124,116,111,108,100,92,92,84,79,76,71,68,63,60,60,55,52,52,47,44,44,44,44,39,39,36,36,36,36,36,36,36,36,36,36,36,39,44,44,44,44,47,52,52,52,55,60,60,68,68,76,76,84,84,92,100,100,108,116,124,127,135,143,151,159,172,180,188,196,207,220,231,244,236,196,156,111,68,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,63,108,148,191,231,244,236,220,212,199,188,180,172,164,156,148,140,132,124,116,111,108,100,95,92,84,84,76,76,68,68,63,60,60,55,52,52,52,47,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,47,52,52,52,55,60,60,63,68,71,76,79,84,87,92,100,103,108,116,124,127,135,140,148,156,167,175,188,196,204,215,228,239,252,212,172,127,84,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,79,124,164,204,244,244,228,220,207,196,188,180,172,164,156,148,140,132,124,116,111,108,100,95,92,87,84,79,76,71,68,68,63,60,60,55,52,52,52,52,47,47,47,44,44,44,44,44,44,44,47,47,52,52,52,52,55,60,60,60,63,68,68,76,76,84,84,92,92,100,103,108,116,124,127,132,140,148,156,164,172,183,196,204,212,223,236,247,228,183,140,100,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,52,92,135,175,215,252,236,228,215,204,196,188,180,172,164,156,148,140,132,124,119,116,108,100,100,92,92,84,84,76,76,71,68,68,63,60,60,60,55,55,52,52,52,52,52,52,52,52,52,52,52,52,52,55,60,60,60,60,68,68,68,76,76,79,84,87,92,95,100,108,108,116,124,127,135,140,148,156,164,172,180,191,204,212,220,236,244,236,196,156,116,76,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,68,108,148,188,228,247,236,228,212,204,196,188,180,172,164,156,148,140,132,124,119,116,108,103,100,95,92,87,84,79,76,76,71,68,68,68,63,60,60,60,60,60,60,55,55,55,55,55,60,60,60,60,60,60,63,68,68,68,76,76,79,84,84,92,92,100,100,108,111,116,124,132,135,140,148,156,164,172,180,188,199,212,220,228,244,244,207,167,127,84,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,76,116,156,196,236,244,236,223,212,204,196,188,180,172,164,156,148,140,132,127,124,116,111,108,100,100,92,92,87,84,84,76,76,76,71,68,68,68,68,63,63,63,60,60,60,60,60,63,63,68,68,68,68,68,71,76,76,79,84,84,87,92,95,100,103,108,116,119,124,132,140,143,148,156,164,172,180,188,199,207,220,228,239,252,215,175,140,100,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,47,87,124,164,204,244,244,236,220,212,204,196,188,180,172,164,156,148,140,135,132,124,119,116,108,108,100,100,92,92,87,84,84,79,76,76,76,76,71,68,68,68,68,68,68,68,68,68,68,71,71,76,76,76,79,84,84,84,92,92,95,100,103,108,111,116,124,127,132,140,148,151,156,164,172,180,188,199,207,220,228,236,252,220,183,148,108,68,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,55,92,132,172,207,244,244,231,220,212,204,196,188,180,172,164,156,148,143,140,132,127,124,116,116,108,108,100,100,95,92,92,87,84,84,84,79,76,76,76,76,76,76,76,76,76,76,76,76,79,79,84,84,84,87,92,92,95,100,103,108,108,116,119,124,132,135,140,148,156,159,167,172,180,188,199,207,220,228,236,247,228,188,151,116,76,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,63,100,140,175,212,247,244,231,220,212,204,196,188,180,172,164,156,151,148,140,135,132,124,124,116,111,108,108,100,100,95,92,92,92,87,87,84,84,84,84,84,84,84,84,84,84,84,84,84,87,92,92,92,95,100,100,103,108,108,116,116,124,127,132,140,143,148,156,164,172,175,183,191,199,207,220,228,236,247,228,196,156,119,84,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,68,108,140,180,212,247,244,231,223,212,204,196,188,180,172,167,164,156,148,143,140,132,132,124,124,116,116,108,108,103,100,100,100,95,92,92,92,92,92,92,92,92,92,92,92,92,92,92,95,100,100,100,103,108,108,111,116,119,124,127,132,135,140,148,151,156,164,172,180,188,196,204,212,220,228,236,247,231,196,159,124,84,52,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,71,108,143,180,212,247,244,236,223,215,207,199,191,183,180,172,164,156,156,148,140,140,132,132,124,124,116,116,111,108,108,108,103,100,100,100,100,100,100,100,100,100,100,100,100,100,100,103,108,108,108,111,116,116,119,124,127,132,135,140,148,148,156,164,167,172,180,188,196,204,212,220,228,236,247,228,196,159,124,92,52,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,71,108,140,175,212,244,244,236,228,220,212,204,196,188,180,172,167,164,156,151,148,140,140,132,132,127,124,124,116,116,116,111,108,108,108,108,108,108,108,108,108,108,108,108,108,108,111,116,116,116,119,124,124,132,132,135,140,148,148,156,159,164,172,180,183,188,196,204,212,220,228,239,252,228,196,159,124,92,52,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,71,108,140,172,204,236,244,236,228,220,212,204,196,191,183,180,172,167,164,156,151,148,143,140,135,132,132,127,124,124,124,119,116,116,116,116,116,116,116,116,116,116,116,116,116,119,124,124,124,132,132,135,140,140,148,148,156,159,164,172,175,180,188,196,204,207,215,223,236,244,252,220,188,156,124,92,52,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,68,103,135,167,199,231,252,239,231,223,215,207,204,196,188,183,180,172,167,164,156,156,148,148,143,140,140,132,132,132,127,127,124,124,124,124,124,124,124,124,124,124,124,127,132,132,132,135,140,140,143,148,151,156,159,164,172,172,180,188,191,196,204,212,220,228,236,244,244,215,183,151,119,84,52,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,68,100,132,164,191,220,252,244,236,228,220,212,204,199,196,188,180,180,172,167,164,159,156,156,148,148,143,140,140,140,140,135,132,132,132,132,132,132,132,132,135,135,140,140,140,143,148,148,151,156,156,164,164,172,175,180,188,188,196,204,212,215,223,231,239,247,236,207,175,148,116,84,52,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,60,92,124,151,180,212,239,247,239,231,223,220,212,204,199,196,188,183,180,172,172,167,164,159,156,156,151,148,148,148,148,143,143,143,140,140,143,143,143,148,148,148,148,151,156,156,159,164,164,172,172,180,180,188,191,196,204,207,212,220,228,236,244,252,228,196,167,140,108,76,44,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,84,111,140,172,196,228,252,244,236,228,223,220,212,204,199,196,188,188,180,180,172,172,167,164,164,164,159,156,156,156,156,156,156,156,156,156,156,156,156,156,159,164,164,167,172,172,175,180,183,188,191,196,204,207,212,220,228,236,239,247,236,212,183,156,127,100,68,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,44,71,100,132,156,183,212,236,252,244,236,228,223,220,212,207,204,196,196,188,188,183,180,180,172,172,172,172,167,164,164,164,164,164,164,164,164,164,167,172,172,172,175,180,180,183,188,191,196,199,204,212,212,220,228,231,239,244,247,220,196,172,140,116,84,60,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,60,87,116,140,164,191,215,239,247,244,236,228,223,220,212,212,204,204,196,196,191,188,188,183,180,180,180,180,180,175,175,175,175,175,180,180,180,180,183,188,188,188,196,196,199,204,207,212,220,220,228,236,239,244,252,228,204,180,156,127,100,76,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,71,100,124,148,172,196,220,239,252,244,236,231,228,220,220,212,212,207,204,204,196,196,196,191,191,188,188,188,188,188,188,188,188,188,191,196,196,196,199,204,204,212,212,215,220,228,228,236,239,244,252,228,207,183,159,135,111,84,60,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,55,79,108,127,151,172,196,215,236,252,244,239,236,231,228,223,220,220,212,212,212,207,204,204,204,204,204,199,199,199,204,204,204,204,204,207,212,212,215,220,220,228,228,236,236,244,247,244,228,204,183,164,140,116,92,68,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,60,84,108,127,148,172,188,207,228,244,252,244,244,236,236,228,228,228,220,220,220,220,215,212,212,212,212,212,212,215,215,220,220,220,223,228,228,231,236,239,244,247,252,236,215,196,180,159,140,116,95,71,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,39,60,84,103,124,143,164,180,196,212,228,239,252,247,244,244,236,236,236,231,228,228,228,228,228,228,228,228,228,228,231,236,236,236,239,244,244,252,244,236,220,204,188,172,151,132,116,92,71,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,60,76,95,116,132,148,164,180,191,204,215,228,236,247,252,247,244,244,244,244,244,244,244,244,244,244,244,244,247,252,252,244,236,220,212,196,188,172,156,140,124,108,87,68,47,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,52,68,84,100,116,132,143,156,167,180,188,196,204,212,220,223,228,231,236,236,236,236,236,231,228,220,215,212,204,196,183,172,164,148,140,124,108,92,76,60,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,52,68,84,95,108,119,132,140,148,156,164,172,175,180,180,188,188,188,188,183,180,180,172,167,159,156,143,135,124,116,100,92,76,60,44,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,47,60,71,84,92,100,108,116,119,124,132,132,135,135,140,135,132,132,127,124,116,111,103,95,84,76,68,52,44,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,31,44,52,60,68,71,76,79,84,84,87,87,84,84,84,76,76,68,60,52,44,36,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,20,28,28,36,36,36,36,36,36,31,28,23,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};\n      const uint8_t * FLARE_TEXTURES[6] ={\n        FLARE_TEXTURE_0,\n        FLARE_TEXTURE_1,\n        FLARE_TEXTURE_2,\n        FLARE_TEXTURE_3,\n        FLARE_TEXTURE_4,\n        FLARE_TEXTURE_5,\n      };\n      const int FLARE_TEXTURE_WIDTHS[10] = {\n        128,\n        128,\n        128,\n        128,\n        128,\n        128,\n      };\n      const int FLARE_TEXTURE_HEIGHTS[10] = {\n        128,\n        128,\n        128,\n        128,\n        128,\n        128,\n      };\n    }\n}\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/gl.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL2_GL_H\n#define IGL_OPENGL2_GL_H\n\n#ifdef IGL_OPENGL_GL_H\n#  error \"igl/opengl/gl.h already included\"\n#endif\n\n// Always use this:\n//     #include \"gl.h\"\n// Instead of:\n//     #include <OpenGL/gl.h>\n// or \n//     #include <GL/gl.h>\n//\n\n// For now this includes glu, glew and glext (perhaps these should be\n// separated)\n#ifdef _WIN32\n#    define NOMINMAX\n#    include <Windows.h>\n#    undef DrawText\n#    undef NOMINMAX\n#endif\n\n#ifndef __APPLE__\n#  define GLEW_STATIC\n#  include <GL/glew.h>\n#endif\n\n#ifdef __APPLE__\n#  include <OpenGL/gl.h>\n#  define __gl_h_ /* Prevent inclusion of the old gl.h */\n#else\n#  include <GL/gl.h>\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/glext.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2017 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL_GLEXT_H\n#define IGL_OPENGL_GLEXT_H\n\n#ifdef IGL_OPENGL2_GLEXT_H\n#  error \"igl/opengl2/glext.h already included\"\n#endif\n\n// Always use this:\n//     #include \"gl.h\"\n// Instead of:\n//     #include <OpenGL/glext.h>\n// or \n//     #include <GL/glext.h>\n//\n\n#ifdef __APPLE__\n#  include <OpenGL/glext.h>\n#elif _WIN32\n// do nothing(?)\n#else \n#  include <GL/glext.h>\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/glu.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2017 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL2_GLU_H\n#define IGL_OPENGL2_GLU_H\n\n#ifdef IGL_OPENGL_GLU_H\n#  error \"igl/opengl/glu.h already included\"\n#endif\n\n// Always use this:\n//     #include \"glu.h\"\n// Instead of:\n//     #include <OpenGL/glu.h>\n// or \n//     #include <GL/glu.h>\n//\n\n#ifdef __APPLE__\n#  include <OpenGL/glu.h>\n#else\n#  include <GL/glu.h>\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/lens_flare.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"lens_flare.h\"\n\n#include \"../C_STR.h\"\n#include \"unproject.h\"\n#include \"project.h\"\n#include \"shine_textures.h\"\n#include \"flare_textures.h\"\n\n#include <iostream>\n#include <stdint.h>\n\n// http://www.opengl.org/archives/resources/features/KilgardTechniques/LensFlare/glflare.c\n\nIGL_INLINE void igl::opengl2::lens_flare_load_textures(\n  std::vector<GLuint> & shine_id,\n  std::vector<GLuint> & flare_id)\n{\n\n  const auto setup_texture =[](\n    const uint8_t * texture,\n    const int width,\n    const int height,\n    GLuint texobj,\n    GLenum minFilter, GLenum maxFilter)\n  {\n    glBindTexture(GL_TEXTURE_2D, texobj);\n    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);\n    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minFilter);\n    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, maxFilter);\n    glTexImage2D(GL_TEXTURE_2D, 0, 1, width, height, 0,\n      GL_LUMINANCE, GL_UNSIGNED_BYTE, texture);\n  };\n\n  glPixelStorei(GL_UNPACK_ALIGNMENT, 1);\n  shine_id.resize(10);\n  glGenTextures(10,&shine_id[0]);\n  for (int i = 0; i < (int)shine_id.size(); i++) {\n    setup_texture(\n      SHINE_TEXTURES[i],\n      SHINE_TEXTURE_WIDTHS[i],\n      SHINE_TEXTURE_HEIGHTS[i],\n      shine_id[i], GL_LINEAR, GL_LINEAR);\n  }\n  flare_id.resize(6);\n  glGenTextures(6,&flare_id[0]);\n  for (int i = 0; i < (int)flare_id.size(); i++) {\n    setup_texture(\n      FLARE_TEXTURES[i],\n      FLARE_TEXTURE_WIDTHS[i],\n      FLARE_TEXTURE_HEIGHTS[i],\n      flare_id[i], GL_LINEAR, GL_LINEAR);\n  }\n}\n\nIGL_INLINE void igl::opengl2::lens_flare_create(\n  const float * A,\n  const float * B,\n  const float * C,\n  std::vector<igl::opengl2::Flare> & flares)\n{\n  using namespace std;\n  flares.resize(12);\n  /* Shines */\n  flares[0] = Flare(-1, 1.0f, 0.1f, C, 1.0);\n  flares[1] = Flare(-1, 1.0f, 0.15f, B, 1.0);\n  flares[2] = Flare(-1, 1.0f, 0.35f, A, 1.0);\n\n  /* Flares */\n  flares[3] =  Flare(2, 1.3f, 0.04f, A, 0.6);\n  flares[4] =  Flare(3, 1.0f, 0.1f, A, 0.4);\n  flares[5] =  Flare(1, 0.5f, 0.2f, A, 0.3);\n  flares[6] =  Flare(3, 0.2f, 0.05f, A, 0.3);\n  flares[7] =  Flare(0, 0.0f, 0.04f, A, 0.3);\n  flares[8] =  Flare(5, -0.25f, 0.07f, A, 0.5);\n  flares[9] =  Flare(5, -0.4f, 0.02f, A, 0.6);\n  flares[10] = Flare(5, -0.6f, 0.04f, A, 0.4);\n  flares[11] = Flare(5, -1.0f, 0.03f, A, 0.2);\n}\n\nIGL_INLINE void igl::opengl2::lens_flare_draw(\n  const std::vector<igl::opengl2::Flare> & flares,\n  const std::vector<GLuint> & shine_ids,\n  const std::vector<GLuint> & flare_ids,\n  const Eigen::Vector3f & light,\n  const float near_clip,\n  int & shine_tic)\n{\n  bool ot2 = glIsEnabled(GL_TEXTURE_2D);\n  bool ob = glIsEnabled(GL_BLEND);\n  bool odt = glIsEnabled(GL_DEPTH_TEST);\n  bool ocm = glIsEnabled(GL_COLOR_MATERIAL);\n  bool ol = glIsEnabled(GL_LIGHTING);\n  int obsa,obda,odf,odwm;\n  glGetIntegerv(GL_BLEND_SRC_ALPHA,&obsa);\n  glGetIntegerv(GL_BLEND_DST_ALPHA,&obda);\n  glGetIntegerv(GL_DEPTH_FUNC,&odf);\n  glGetIntegerv(GL_DEPTH_WRITEMASK,&odwm);\n\n  glDisable(GL_COLOR_MATERIAL);\n  glEnable(GL_DEPTH_TEST);\n  //glDepthFunc(GL_LEQUAL);\n  glDepthMask(GL_FALSE);\n  glEnable(GL_TEXTURE_2D);\n  glDisable(GL_LIGHTING);\n  glEnable(GL_BLEND);\n  glBlendFunc(GL_ONE, GL_ONE);\n\n  using namespace Eigen;\n  using namespace std;\n\n  //// view_dir  direction from eye to position is is looking at\n  //const Vector3f view_dir =  (at - from).normalized();\n\n  //// near_clip  distance from eye to near clipping plane along view_dir\n  //// center   position on near clipping plane along viewdir from eye\n  //const Vector3f center =  from + near_clip*view_dir;\n\n  Vector3f plight = project(light);\n  // Orthogonal vectors to view direction at light\n  Vector3f psx = plight;\n  psx(0) += 1;\n  Vector3f psy = plight;\n  psy(1) += 1;\n\n  // axis toward center\n  int vp[4];\n  glGetIntegerv(GL_VIEWPORT,vp);\n  Vector3f center = unproject(Vector3f(0.5*vp[2],0.5*vp[3],plight[2]-1e-3));\n  //Vector3f center(0,0,1);\n  Vector3f axis = light-center;\n  //glLineWidth(4.);\n  //glColor3f(1,0,0);\n  //glBegin(GL_LINES);\n  //glVertex3fv(center.data());\n  //glVertex3fv(light.data());\n  //glEnd();\n\n  const Vector3f SX = unproject(psx).normalized();\n  const Vector3f SY = unproject(psy).normalized();\n\n  for(int i = 0; i < (int)flares.size(); i++)\n  {\n    const Vector3f sx = flares[i].scale * SX;\n    const Vector3f sy = flares[i].scale * SY;\n    glColor3fv(flares[i].color);\n    if (flares[i].type < 0) {\n      glBindTexture(GL_TEXTURE_2D, shine_ids[shine_tic]);\n      shine_tic = (shine_tic + 1) % shine_ids.size();\n    } else \n    {\n      glBindTexture(GL_TEXTURE_2D, flare_ids[flares[i].type]);\n    }\n\n    /* position = center + flare[i].loc * axis */\n    const Vector3f position = center + flares[i].loc * axis;\n    Vector3f tmp;\n\n    glBegin(GL_QUADS);\n    glTexCoord2f(0.0, 0.0);\n    tmp =  position +  sx;\n    tmp =  tmp +  sy;\n    glVertex3fv(tmp.data());\n\n    glTexCoord2f(1.0, 0.0);\n    tmp =  position -  sx;\n    tmp =  tmp +  sy;\n    glVertex3fv(tmp.data());\n\n    glTexCoord2f(1.0, 1.0);\n    tmp =  position -  sx;\n    tmp =  tmp -  sy;\n    glVertex3fv(tmp.data());\n\n    glTexCoord2f(0.0, 1.0);\n    tmp =  position +  sx;\n    tmp =  tmp -  sy;\n    glVertex3fv(tmp.data());\n    glEnd();\n  }\n  ot2?glEnable(GL_TEXTURE_2D):glDisable(GL_TEXTURE_2D);\n  ob?glEnable(GL_BLEND):glDisable(GL_BLEND);\n  odt?glEnable(GL_DEPTH_TEST):glDisable(GL_DEPTH_TEST);\n  ocm?glEnable(GL_COLOR_MATERIAL):glDisable(GL_COLOR_MATERIAL);\n  ol?glEnable(GL_LIGHTING):glDisable(GL_LIGHTING);\n  glBlendFunc(obsa,obda);\n  glDepthFunc(odf);\n  glDepthMask(odwm);\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/lens_flare.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL2_LENS_FLARE_H\n#define IGL_OPENGL2_LENS_FLARE_H\n\n#include \"../igl_inline.h\"\n#include \"gl.h\"\n#include <Eigen/Core>\n#include <vector>\n\nnamespace igl\n{\n  namespace opengl2\n  {\n\n    struct Flare{\n      int type;             /* flare texture index, 0..5 */\n      float scale;\n      float loc;            /* postion on axis */\n      float color[3];\n      Flare():\n        type(-1),\n        scale(0),\n        loc(0)\n      {}\n      Flare(int type, float location, float scale, const float color[3], float colorScale) :\n        type(type),\n        scale(scale),\n        loc(location)\n      {\n        this->color[0] = color[0] * colorScale;\n        this->color[1] = color[1] * colorScale;\n        this->color[2] = color[2] * colorScale;\n      }\n    };\n    \n    \n    // Initialize shared data for lens flates\n    //\n    // Inputs:\n    //   start_id   starting texture id location (should have at least id:id+16 free)\n    // Outputs:\n    //   shine  list of texture ids for shines\n    //   flare  list of texture ids for flares\n    IGL_INLINE void lens_flare_load_textures(\n      std::vector<GLuint> & shine_ids,\n      std::vector<GLuint> & flare_ids);\n    \n    // Create a set of lens flares\n    //\n    // Inputs:\n    //   A  primary color\n    //   B  secondary color\n    //   C  secondary color\n    // Outputs:\n    //   flares  list of flare objects\n    IGL_INLINE void lens_flare_create(\n      const float * A,\n      const float * B,\n      const float * C,\n      std::vector<Flare> & flares);\n    \n    // Draw lens flares\n    //\n    // Inputs:\n    //   flares  list of Flare objects\n    //   shine_ids  list of shine textures\n    //   flare_ids  list of flare texture ids\n    //   light  position of light\n    //   near_clip  near clipping plane\n    //   shine_tic  current \"tic\" in shine textures\n    // Outputs:\n    //   shine_tic  current \"tic\" in shine textures\n    IGL_INLINE void lens_flare_draw(\n      const std::vector<Flare> & flares,\n      const std::vector<GLuint> & shine_ids,\n      const std::vector<GLuint> & flare_ids,\n      const Eigen::Vector3f & light,\n      const float near_clip,\n      int & shine_tic);\n  }\n};\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"lens_flare.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/model_proj_viewport.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"model_proj_viewport.h\"\n#include \"gl.h\"\n\ntemplate <typename Derivedmodel, typename Derivedproj, typename Derivedviewport>\nIGL_INLINE void igl::opengl2::model_proj_viewport(\n    Eigen::PlainObjectBase<Derivedmodel> & model,\n    Eigen::PlainObjectBase<Derivedproj> & proj,\n    Eigen::PlainObjectBase<Derivedviewport> & viewport)\n{\n  Eigen::Matrix4d MV,P;\n  Eigen::Vector4i VPi;\n  glGetDoublev(GL_MODELVIEW_MATRIX,MV.data());\n  glGetDoublev(GL_PROJECTION_MATRIX,P.data());\n  glGetIntegerv(GL_VIEWPORT,VPi.data());\n  viewport = VPi.cast<typename Derivedviewport::Scalar>();\n  model = MV.cast<typename Derivedmodel::Scalar>();\n  proj = P.cast<typename Derivedproj::Scalar>();\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::opengl2::model_proj_viewport<Eigen::Matrix<double, 4, 4, 0, 4, 4>, Eigen::Matrix<double, 4, 4, 0, 4, 4>, Eigen::Matrix<double, 4, 1, 0, 4, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 4, 4, 0, 4, 4> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, 4, 4, 0, 4, 4> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, 4, 1, 0, 4, 1> >&);\ntemplate void igl::opengl2::model_proj_viewport<Eigen::Matrix<float, 4, 4, 0, 4, 4>, Eigen::Matrix<float, 4, 4, 0, 4, 4>, Eigen::Matrix<float, 4, 1, 0, 4, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<float, 4, 4, 0, 4, 4> >&, Eigen::PlainObjectBase<Eigen::Matrix<float, 4, 4, 0, 4, 4> >&, Eigen::PlainObjectBase<Eigen::Matrix<float, 4, 1, 0, 4, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/model_proj_viewport.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL2_MODEL_PROJ_VIEW_H\n#define IGL_OPENGL2_MODEL_PROJ_VIEW_H\n#include \"../igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  namespace opengl2\n  {\n    // Collect the model-view, projection and viewport matrices\n    //\n    // Outputs:\n    //   model  4x4 modelview matrix\n    //   proj   4x4 projection matrix\n    //   viewport  4x1 viewport vector\n    //\n    template <typename Derivedmodel, typename Derivedproj, typename Derivedviewport>\n    IGL_INLINE void model_proj_viewport(\n      Eigen::PlainObjectBase<Derivedmodel> & model, \n      Eigen::PlainObjectBase<Derivedproj> & proj, \n      Eigen::PlainObjectBase<Derivedviewport> & viewport);\n  }\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"model_proj_viewport.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/print_gl_get.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"print_gl_get.h\"\n\n#include <cstdio>\nIGL_INLINE void igl::opengl2::print_gl_get(GLenum pname)\n{\n  double dM[16];\n\n  int rows = 4;\n  int cols = 4;\n  switch(pname)\n  {\n    case GL_MODELVIEW_MATRIX:\n    case GL_PROJECTION_MATRIX:\n    {\n      rows = 4;\n      cols = 4;\n      glGetDoublev(pname,dM);\n      for(int i = 0;i<rows;i++)\n      {\n        for(int j = 0;j<cols;j++)\n        {\n          printf(\"%lg \",dM[j*rows+i]);\n        }\n        printf(\"\\n\");\n      }\n      break;\n    }\n    default:\n      fprintf(stderr,\"ERROR in print_gl_get(), gl enum not recognized.\\n\");\n  }\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/print_gl_get.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL2_PRINT_GL_GET_H\n#define IGL_OPENGL2_PRINT_GL_GET_H\n#include \"gl.h\"\n#include \"../igl_inline.h\"\n\nnamespace igl\n{\n  namespace opengl2\n  {\n    // Prints the value of pname found by issuing glGet*(pname,*)\n    // Inputs:\n    //   pname  enum key to gl parameter\n    IGL_INLINE void print_gl_get(GLenum pname);\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"print_gl_get.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/project.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"project.h\"\n#include \"../project.h\"\n#include \"gl.h\"\n#include \"glu.h\"\n#include <iostream>\n\nIGL_INLINE int igl::opengl2::project(\n  const double objX,\n  const double objY,\n  const double objZ,\n  double* winX,\n  double* winY,\n  double* winZ)\n{\n  using namespace std;\n  // Put model, projection, and viewport matrices into double arrays\n  double MV[16];\n  double P[16];\n  int VP[4];\n  glGetDoublev(GL_MODELVIEW_MATRIX,  MV);\n  glGetDoublev(GL_PROJECTION_MATRIX, P);\n  glGetIntegerv(GL_VIEWPORT, VP);\n  int ret = gluProject(objX,objY,objZ,MV,P,VP,winX,winY,winZ);\n  return ret;\n}\n\ntemplate <typename Derivedobj, typename Derivedwin>\nIGL_INLINE int igl::opengl2::project(\n  const Eigen::PlainObjectBase<Derivedobj> & obj,\n  Eigen::PlainObjectBase<Derivedwin> & win)\n{\n  assert(obj.size() >= 3);\n  Eigen::Vector3d dobj(obj(0),obj(1),obj(2));\n  Eigen::Vector3d dwin;\n  int ret = igl::opengl2::project(dobj(0),dobj(1),dobj(2),\n      &dwin.data()[0],\n      &dwin.data()[1],\n      &dwin.data()[2]);\n  win(0) = dwin(0);\n  win(1) = dwin(1);\n  win(2) = dwin(2);\n  return ret;\n}\n\ntemplate <typename Derivedobj>\nIGL_INLINE Derivedobj igl::opengl2::project(\n  const Eigen::PlainObjectBase<Derivedobj> & obj)\n{\n  Derivedobj win;\n  igl::opengl2::project(obj,win);\n  return win;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate int igl::opengl2::project<Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 1, 0, 3, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 1, 0, 3, 1> >&);\ntemplate int igl::opengl2::project<Eigen::Matrix<float, 3, 1, 0, 3, 1>, Eigen::Matrix<float, 3, 1, 0, 3, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<float, 3, 1, 0, 3, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, 3, 1, 0, 3, 1> >&);\ntemplate int igl::opengl2::project<Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix<double, 1, 3, 1, 1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> >&);\ntemplate Eigen::Matrix<double, 3, 1, 0, 3, 1>  igl::opengl2::project<Eigen::Matrix<double, 3, 1, 0, 3, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 1, 0, 3, 1> > const&);\ntemplate Eigen::Matrix<float, 3, 1, 0, 3, 1>  igl::opengl2::project<Eigen::Matrix<float, 3, 1, 0, 3, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<float, 3, 1, 0, 3, 1> > const&);\ntemplate Eigen::Matrix<double, 1, -1, 1, 1, -1>  igl::opengl2::project<Eigen::Matrix<double, 1, -1, 1, 1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 1, -1, 1, 1, -1> > const&);\ntemplate Eigen::Matrix<double, 1, 3, 1, 1, 3>  igl::opengl2::project<Eigen::Matrix<double, 1, 3, 1, 1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&);\ntemplate Eigen::Matrix<double, 1, 2, 1, 1, 2>  igl::opengl2::project<Eigen::Matrix<double, 1, 2, 1, 1, 2> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 2, 1, 1, 2> > const&);\ntemplate Eigen::Matrix<double, 2, 1, 0, 2, 1>  igl::opengl2::project<Eigen::Matrix<double, 2, 1, 0, 2, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 1, 0, 2, 1> > const&);\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/project.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL2_PROJECT_H\n#define IGL_OPENGL2_PROJECT_H\n#include \"../igl_inline.h\"\n#include <Eigen/Dense>\nnamespace igl\n{\n  namespace opengl2\n  {\n    // Wrapper for gluProject that uses the current GL_MODELVIEW_MATRIX,\n    // GL_PROJECTION_MATRIX, and GL_VIEWPORT\n    // Inputs:\n    //   obj*  3D objects' x, y, and z coordinates respectively\n    // Outputs:\n    //   win*  pointers to screen space x, y, and z coordinates respectively\n    // Returns return value of gluProject call\n    IGL_INLINE int project(\n      const double objX,\n      const double objY,\n      const double objZ,\n      double* winX,\n      double* winY,\n      double* winZ);\n    // Eigen wrapper\n    template <typename Derivedobj, typename Derivedwin>\n    IGL_INLINE int project(\n      const Eigen::PlainObjectBase<Derivedobj> & obj,\n      Eigen::PlainObjectBase<Derivedwin> & win);\n    // Eigen wrapper  with return\n    template <typename Derivedobj>\n    IGL_INLINE Derivedobj project(\n      const Eigen::PlainObjectBase<Derivedobj> & obj);\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"project.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/render_to_tga.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"render_to_tga.h\"\n#include \"tga.h\"\n\n#include \"gl.h\"\n\n#include <cstdlib>\n\nIGL_INLINE bool igl::opengl::render_to_tga(\n  const std::string tga_file,\n  const int width,\n  const int height,\n  const bool alpha)\n{\n\n  size_t components = 3;\n  GLenum format = GL_BGR;\n  if(alpha)\n  {\n    format = GL_BGRA;\n    components = 4;\n  }\n  GLubyte * cmap = NULL;\n\n  // OpenGL by default tries to read data in multiples of 4, if our data is\n  // only RGB or BGR and the width is not divible by 4 then we need to alert\n  // opengl\n  if((width % 4) != 0 && \n   (format == GL_RGB || \n    format == GL_BGR))\n  {\n    glPixelStorei(GL_PACK_ALIGNMENT, 1);\n  }\n  GLubyte *pixels;\n  pixels = (unsigned char *) malloc (width * height * components);\n  glReadPixels(\n    0,\n    0,\n    width,\n    height,\n    format,\n    GL_UNSIGNED_BYTE,\n    pixels);\n\n  // set up generic image struct\n  gliGenericImage * genericImage;\n  genericImage = (gliGenericImage*) malloc(sizeof(gliGenericImage));\n  genericImage->width = width;\n  genericImage->height = height;\n  genericImage->format = format;\n  genericImage->components = components;\n  genericImage->pixels = pixels;\n  // CMAP is not supported, but we need to put something here\n  genericImage->cmapEntries = 0;\n  genericImage->cmapFormat = GL_BGR;\n  genericImage->cmap = cmap;\n\n  // write pixels to tga file\n  FILE * imgFile;\n  // \"-\" as output file name is code for write to stdout\n  if(tga_file.compare(\"-\") == 0)\n  {\n    imgFile = stdout;\n  }else{\n    imgFile = fopen(tga_file.c_str(),\"w\");\n    if(NULL==imgFile)\n    {\n      printf(\"IOError: %s could not be opened...\\n\",tga_file.c_str());\n      return false;\n    }\n  }\n\n  writeTGA(genericImage,imgFile);\n\n  free(genericImage);\n  return fclose(imgFile) == 0;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/render_to_tga.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL_RENDER_TO_TGA_H\n#define IGL_OPENGL_RENDER_TO_TGA_H\n#include \"../igl_inline.h\"\n#include <string>\n\nnamespace igl\n{\n  namespace opengl\n  {\n    // Render current open GL image to .tga file\n    // Inputs:\n    //   tga_file  path to output .tga file\n    //   width  width of scene and resulting image\n    //   height height of scene and resulting image\n    ///  alpha  whether to include alpha channel\n    // Returns true only if no errors occured\n    //\n    // See also: png/render_to_png which is slower but writes .png files\n    IGL_INLINE bool render_to_tga(\n      const std::string tga_file,\n      const int width,\n      const int height,\n      const bool alpha);\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"render_to_tga.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/right_axis.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"right_axis.h\"\n#include \"gl.h\"\n\nIGL_INLINE void igl::opengl2::right_axis(double * x, double * y, double * z)\n{\n  double mv[16];\n  glGetDoublev(GL_MODELVIEW_MATRIX, mv);\n  igl::opengl2::right_axis(mv,x,y,z);\n}\n\nIGL_INLINE void igl::opengl2::right_axis(const double * mv,double * x, double * y, double * z)\n{\n  *x = -mv[0*4+0];\n  *y = -mv[1*4+0];\n  *z = -mv[2*4+0];\n}\n\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/right_axis.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL2_RIGHT_AXIS_H\n#define IGL_OPENGL2_RIGHT_AXIS_H \n#include \"../igl_inline.h\"\nnamespace igl\n{\n  namespace opengl2\n  {\n    // Determines the right axis or depth axis of the current gl matrix\n    // Outputs:\n    //   x  pointer to x-coordinate in scene coordinates of the un-normalized\n    //     right axis \n    //   y  pointer to y-coordinate in scene coordinates of the un-normalized\n    //     right axis \n    //   z  pointer to z-coordinate in scene coordinates of the un-normalized\n    //     right axis\n    //   mv pointer to modelview matrix\n    //\n    // Note: Right axis is returned *UN-normalized*\n    IGL_INLINE void right_axis(double * x, double * y, double * z);\n    IGL_INLINE void right_axis(const double * mv, double * x, double * y, double * z);\n  }\n};\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"right_axis.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/shine_textures.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL2_SHINE_TEXTURES_H\n#define IGL_OPENGL2_SHINE_TEXTURES_H\n\n#include <cstdint>\n\nnamespace igl\n{\n  namespace opengl2\n  {\n\n    const uint8_t SHINE_TEXTURE_0[16384] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,36,0,0,0,0,0,0,0,0,0,0,0,0,7,20,15,7,0,0,0,0,0,0,0,0,0,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,20,36,36,0,0,0,0,0,0,0,0,0,0,0,0,20,20,15,12,20,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,36,28,36,36,0,0,0,0,0,0,0,0,0,0,0,12,28,20,12,20,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,39,28,31,28,0,0,0,0,0,0,0,0,0,0,0,28,28,20,15,28,28,12,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,44,31,36,28,0,0,0,0,0,0,0,0,0,0,15,31,28,20,36,36,20,0,0,0,0,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,36,20,0,0,0,0,0,0,0,0,12,12,7,12,12,47,47,44,44,36,0,0,0,0,0,0,0,0,0,0,31,36,28,28,44,28,12,0,0,0,12,23,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,36,0,0,0,0,0,0,0,0,15,15,15,20,20,47,47,44,44,23,0,0,0,0,0,0,7,12,7,20,36,36,28,44,39,20,0,0,0,0,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,39,23,0,0,0,0,0,0,0,12,15,12,12,12,47,47,44,44,15,0,0,0,0,0,0,12,12,12,36,36,36,44,52,28,7,0,0,7,20,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,44,39,7,0,0,0,0,0,0,12,20,20,0,0,47,47,47,47,7,0,0,0,0,0,12,15,15,23,36,44,44,60,44,20,0,0,0,28,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,44,28,0,0,0,0,0,0,12,23,23,12,12,52,52,52,52,0,0,0,0,0,0,20,23,23,39,47,47,60,60,28,0,0,0,28,44,23,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,44,44,12,0,0,0,0,0,0,28,31,31,23,52,60,52,52,0,0,0,0,0,0,28,28,36,44,60,55,68,44,12,0,0,28,44,28,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,52,36,0,0,0,0,0,0,31,39,52,36,60,68,52,52,0,0,0,0,0,20,28,36,44,60,63,76,60,23,0,0,23,47,36,12,0,0,0,0,0,0,0,0,0,0,0,12,23,23,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,52,52,20,0,0,15,15,0,36,44,60,36,71,76,55,52,0,0,0,0,0,31,36,44,52,71,76,76,36,0,0,23,47,39,12,0,7,12,0,0,0,0,0,0,0,7,20,28,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,52,39,0,0,20,20,12,36,55,92,39,79,100,68,60,0,0,0,0,20,36,47,52,76,84,92,60,20,0,20,47,44,20,0,12,20,15,0,0,0,0,0,0,20,28,28,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,52,55,20,0,20,23,20,31,79,111,44,84,127,84,55,0,0,0,0,36,39,60,68,92,92,79,28,0,20,47,52,23,0,0,12,20,7,0,0,0,0,20,36,36,31,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,7,0,0,0,0,0,0,0,31,60,47,0,7,28,28,20,84,116,52,100,164,100,52,0,0,0,12,44,60,63,92,103,100,52,7,20,47,60,28,0,12,15,7,7,0,0,0,15,36,47,44,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,7,0,0,0,12,12,7,0,0,0,0,0,7,52,60,28,0,28,28,20,84,119,79,119,188,116,44,0,0,0,36,44,76,76,111,108,76,20,12,44,60,31,12,20,28,12,0,0,0,12,36,52,52,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,15,7,0,0,0,0,20,20,12,0,0,0,12,20,7,0,0,0,0,0,28,63,52,0,28,36,28,76,116,100,124,188,116,36,0,0,7,47,68,79,108,119,100,36,12,44,68,36,20,28,39,23,0,0,7,31,60,68,52,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,15,20,20,12,0,0,12,15,23,20,12,0,0,20,23,12,0,0,0,0,0,55,68,31,12,39,39,76,119,132,127,180,100,28,0,0,28,55,92,95,140,124,68,20,44,68,44,28,31,44,28,7,0,20,52,76,71,52,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,20,28,20,12,0,0,20,36,31,15,0,7,23,28,12,0,0,0,0,28,68,60,12,44,44,71,116,151,140,175,100,20,0,7,55,84,108,140,148,100,36,44,71,52,36,36,47,28,0,12,39,76,87,71,39,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,31,23,12,0,20,36,39,28,7,12,28,36,20,0,0,0,0,55,71,39,36,44,76,116,167,156,180,100,15,12,39,76,111,127,167,132,60,44,76,60,44,44,52,28,7,28,68,92,92,63,28,0,0,7,15,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,36,36,20,7,12,31,44,36,15,12,28,36,20,0,0,0,28,71,68,36,52,76,119,172,180,188,108,20,28,76,108,140,172,164,103,60,76,68,52,52,52,28,20,52,95,108,84,47,12,0,12,20,20,15,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,39,39,23,15,28,47,44,28,20,36,44,23,12,12,12,55,76,52,60,76,124,164,188,180,100,20,60,103,143,164,183,132,92,87,84,68,60,52,31,36,84,116,108,76,28,7,15,28,23,20,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,44,44,39,28,28,44,52,36,28,36,52,36,28,20,36,76,76,84,84,148,175,207,172,100,36,108,140,175,191,164,124,108,100,76,68,52,44,60,100,124,100,52,20,20,31,28,28,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,36,52,52,44,39,44,60,52,44,44,60,47,39,28,68,84,108,100,172,196,228,167,108,76,156,188,204,196,156,132,124,92,76,60,60,84,116,116,84,52,31,36,36,31,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,44,55,55,52,55,60,60,55,60,71,68,52,52,84,108,127,188,220,239,164,116,119,188,228,212,188,156,140,111,84,71,79,100,124,111,84,63,52,44,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,31,52,60,68,68,76,71,76,84,87,79,63,84,100,148,188,236,252,172,140,164,220,236,212,180,164,132,100,87,100,116,132,124,100,84,68,52,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,0,0,0,0,0,12,39,60,68,84,92,87,92,100,108,95,87,108,148,191,244,252,183,172,212,244,236,212,188,148,124,108,116,135,151,140,111,87,68,44,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,20,28,28,20,0,0,0,20,52,68,84,108,111,116,116,132,116,124,148,204,239,252,204,199,244,252,236,215,172,148,135,143,156,164,140,108,87,68,44,20,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,28,36,36,39,31,12,0,28,63,95,127,140,143,143,164,156,164,212,244,252,228,228,252,252,244,212,188,167,180,180,156,124,108,92,60,36,28,20,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,31,36,39,44,47,52,44,44,63,100,140,167,191,204,204,212,223,252,252,244,244,252,252,244,228,212,204,183,156,132,108,68,44,36,36,31,23,20,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,47,52,55,60,76,100,132,156,188,228,244,239,244,252,252,252,252,252,252,252,244,228,204,164,116,79,68,79,76,60,44,31,20,20,12,7,0,0,0,0,7,15,15,7,0,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,55,60,68,87,132,180,228,244,252,252,252,252,252,252,252,252,252,244,212,172,143,135,127,108,87,76,68,68,68,68,68,60,55,52,68,68,60,55,52,47,39,28,36,36,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,0,0,0,0,0,0,0,0,0,0,0,15,28,28,28,28,28,28,28,23,20,15,15,15,15,15,15,15,15,12,20,44,68,79,103,164,220,244,252,252,252,252,252,252,252,252,244,223,204,191,180,172,180,180,172,151,135,132,132,127,124,116,108,124,119,108,95,92,76,60,44,39,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,0,0,0,0,0,0,0,0,0,0,31,68,84,84,84,84,84,84,92,92,92,84,84,84,84,84,92,95,100,92,87,84,87,103,140,188,228,244,252,252,252,252,252,252,252,252,239,212,191,191,180,159,140,124,124,124,124,132,132,124,111,100,84,87,76,60,52,52,47,47,39,28,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,47,52,52,52,52,52,52,60,63,68,68,68,71,84,95,116,132,148,159,172,188,207,223,231,244,247,252,252,252,252,252,252,252,252,252,244,220,172,132,108,92,84,76,60,44,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,31,44,63,71,76,76,76,84,103,132,156,164,172,167,172,196,228,244,252,252,252,252,252,252,252,252,252,252,244,220,188,159,132,100,76,55,47,44,39,36,36,28,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,0,28,44,44,52,52,71,84,103,127,140,148,143,140,132,119,132,148,172,196,228,244,252,252,244,244,252,252,252,239,220,223,244,244,223,204,183,164,140,127,108,84,60,39,36,28,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,0,28,47,55,84,100,111,100,92,79,71,68,68,71,84,87,100,140,196,228,236,236,252,228,220,228,247,247,252,239,212,183,188,212,228,228,228,223,196,159,124,92,68,63,60,44,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,36,52,52,52,52,60,60,60,60,55,39,28,36,52,71,108,164,204,215,207,212,236,244,188,180,212,239,236,236,247,212,167,132,140,164,188,191,188,188,180,167,164,148,116,84,63,60,52,44,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,44,44,44,47,52,52,52,52,44,28,7,0,12,28,44,60,92,124,151,188,188,172,175,204,228,215,148,156,220,236,212,212,236,220,180,127,92,92,103,132,151,148,140,151,148,132,132,148,140,111,76,60,52,52,47,39,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,36,36,36,39,44,44,44,44,36,15,0,0,0,0,12,28,36,44,71,92,108,140,172,164,140,148,180,204,215,164,108,148,239,244,188,188,204,204,188,156,108,68,63,68,87,111,119,108,100,124,140,132,108,111,124,124,103,71,52,44,44,44,39,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,20,23,28,31,36,36,36,36,20,0,0,0,0,0,0,0,12,23,28,36,60,71,76,100,148,164,135,108,111,156,180,196,183,108,84,164,252,252,183,164,175,196,180,172,140,92,60,39,44,68,79,95,100,84,68,87,116,124,116,103,103,103,100,84,63,44,39,36,36,36,31,28,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,20,23,28,23,12,0,0,0,0,0,0,0,0,0,0,0,15,23,44,52,52,71,108,135,140,116,84,84,132,156,164,188,148,52,84,180,252,252,196,140,148,188,164,172,164,108,76,60,31,20,44,68,76,79,76,68,52,60,79,100,108,103,108,103,95,84,63,52,39,36,31,31,23,20,12,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,36,39,52,76,100,116,116,87,55,68,116,127,127,172,175,95,20,100,204,252,252,220,132,116,172,156,140,156,140,84,63,55,31,12,12,44,68,68,68,60,52,44,44,52,68,87,95,100,100,92,84,68,47,31,28,23,20,12,20,12,15,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,36,60,71,92,100,92,52,39,52,100,116,108,143,188,140,44,20,119,220,252,252,236,140,92,132,167,124,116,143,119,68,52,52,31,12,0,20,44,63,63,55,44,36,36,36,36,44,55,76,84,87,84,76,71,63,44,20,7,12,12,15,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,28,36,52,71,84,84,63,28,28,44,84,103,87,108,167,167,84,7,36,140,236,252,244,228,148,76,87,156,132,100,111,135,103,52,39,44,31,12,0,0,20,47,60,60,47,31,23,31,28,28,28,28,36,52,68,71,68,68,60,52,36,12,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,36,52,60,71,60,36,12,20,36,76,92,79,76,127,172,116,28,0,60,151,236,231,220,204,143,68,52,116,156,100,79,116,124,84,39,28,39,28,12,0,0,0,28,52,60,55,39,20,12,20,28,20,20,12,0,12,36,55,60,55,52,44,36,23,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,36,52,63,55,39,12,0,12,36,60,84,76,60,87,151,132,60,0,0,68,148,220,212,204,188,148,68,31,79,140,119,79,68,116,108,68,28,20,28,23,12,0,0,0,0,28,52,52,52,36,12,0,12,20,12,0,0,0,0,7,28,44,44,39,36,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,52,52,39,20,0,0,12,28,52,71,76,44,55,116,143,87,20,0,0,76,143,196,196,183,183,143,76,28,52,100,132,87,52,68,116,95,52,20,12,20,12,0,0,0,0,0,7,28,47,47,44,28,7,0,0,0,0,0,0,0,0,0,0,20,28,28,20,15,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,44,52,39,20,0,0,0,7,23,39,60,71,44,28,76,132,103,44,0,0,12,71,132,183,188,156,167,140,84,44,23,76,116,95,60,44,79,108,84,44,15,0,0,12,12,0,0,0,0,0,12,28,44,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,7,12,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,44,44,23,0,0,0,0,7,20,28,52,68,44,12,44,100,116,68,12,0,0,20,71,132,167,172,132,140,116,100,52,0,55,79,100,71,36,39,84,100,68,36,12,0,12,12,0,0,0,0,0,0,0,12,31,44,39,31,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,44,31,12,0,0,0,0,0,12,20,44,63,44,12,20,63,108,84,36,0,0,0,12,60,124,148,164,124,119,100,108,52,0,28,68,92,76,60,20,52,92,84,52,20,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,36,36,20,0,0,0,0,0,0,0,12,36,60,47,15,0,44,87,92,52,7,0,0,0,20,60,124,140,156,116,100,92,108,47,15,0,55,68,76,60,36,15,60,92,68,36,15,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,31,28,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,23,12,0,0,0,0,0,0,0,0,23,52,47,20,0,28,63,95,68,28,0,0,0,0,20,52,135,135,148,111,84,100,108,47,36,0,36,60,68,52,47,20,20,68,84,52,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,28,28,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,20,12,0,0,0,0,0,0,0,0,0,20,47,52,20,0,12,44,84,76,44,0,0,0,0,0,23,44,124,116,108,108,71,108,92,52,44,0,7,55,60,47,44,36,0,28,76,79,52,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,23,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,7,0,0,0,0,0,0,0,0,0,0,15,44,52,23,0,0,36,60,84,55,20,0,0,0,0,0,28,44,108,87,76,103,68,108,71,60,44,0,0,36,55,52,36,44,20,0,39,79,68,36,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,7,0,0,0,0,0,0,0,0,0,0,12,36,52,28,0,0,20,44,76,63,36,0,0,0,0,0,0,28,52,76,68,55,100,68,108,60,71,44,7,0,12,52,52,31,36,36,0,0,52,84,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,7,28,47,28,0,0,12,36,60,68,52,12,0,0,0,0,0,0,15,52,63,55,44,92,63,100,52,84,36,23,0,0,36,52,36,28,36,20,0,12,60,79,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,44,28,0,0,0,28,44,63,52,28,0,0,0,0,0,0,0,12,60,52,47,39,79,60,84,52,76,36,36,0,0,12,52,47,20,28,28,7,0,23,68,76,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,28,7,0,0,12,36,52,55,44,7,0,0,0,0,0,0,7,20,68,47,44,36,68,60,68,47,60,31,31,0,0,0,36,47,28,15,28,20,0,0,31,68,63,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,20,7,0,0,0,28,36,52,44,20,0,0,0,0,0,0,0,0,12,60,47,36,28,52,52,44,47,52,28,28,0,0,0,15,44,44,12,20,20,0,0,0,36,76,52,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,20,0,0,0,0,15,28,44,44,36,0,0,0,0,0,0,0,0,0,0,52,47,23,28,52,47,31,47,44,28,20,7,0,0,0,36,44,20,7,20,12,0,0,7,47,76,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,28,12,0,0,0,0,20,28,44,39,15,0,0,0,0,0,0,0,0,0,0,44,44,12,28,47,44,28,47,44,36,20,15,0,0,0,20,39,36,0,12,12,12,0,0,15,52,68,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,12,0,0,0,0,12,20,31,36,28,0,0,0,0,0,0,0,0,0,0,0,44,39,0,28,47,52,36,52,44,36,12,12,0,0,0,0,36,36,15,0,12,12,0,0,0,20,60,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,12,15,20,36,36,12,0,0,0,0,0,0,0,0,0,0,0,39,39,0,23,44,47,28,52,39,39,12,12,0,0,0,0,20,36,28,0,0,0,0,0,0,0,28,55,44,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,15,20,28,31,20,0,0,0,0,0,0,0,0,0,0,0,12,36,36,0,20,36,44,20,44,36,36,7,7,0,0,0,0,0,31,36,12,0,0,0,0,0,0,0,31,52,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,15,12,0,0,0,0,0,0,12,20,28,28,0,0,0,0,0,0,0,0,0,0,0,0,23,36,36,0,15,36,28,12,20,28,28,0,7,0,0,0,0,0,20,31,23,0,0,0,0,0,0,0,7,31,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,7,7,23,28,15,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,0,15,36,15,0,0,28,28,0,0,0,0,0,0,0,0,28,28,0,0,0,0,0,0,0,0,12,31,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,15,20,15,0,15,36,23,0,0,23,23,7,0,0,0,0,0,0,0,20,28,20,0,0,0,0,0,0,0,0,12,23,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,23,23,15,0,12,28,28,12,12,31,31,20,0,0,0,0,0,0,0,7,28,23,0,0,0,0,0,0,0,0,0,7,20,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,12,0,0,28,28,20,20,23,23,20,0,0,0,0,0,0,0,0,20,20,12,0,0,0,0,0,0,0,0,0,12,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,20,20,7,7,15,20,20,0,0,0,0,0,0,0,0,7,20,20,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,23,20,0,0,12,28,28,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,28,20,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,0,0,0,31,28,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,0,0,0,20,12,0,0,0,15,15,7,0,0,0,0,0,0,0,0,0,0,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};\n    const uint8_t SHINE_TEXTURE_1[16384] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,20,20,7,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,12,12,0,0,0,0,12,12,12,0,0,0,0,0,0,0,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,20,20,15,0,0,0,0,12,12,0,0,0,0,12,12,0,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,12,20,20,0,0,0,0,12,15,15,0,0,12,20,20,0,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,12,0,20,20,0,0,0,0,28,31,28,0,0,0,12,12,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,0,20,20,0,0,0,12,36,44,28,0,0,0,0,0,12,28,28,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,0,28,28,20,0,0,20,47,60,28,0,0,7,7,0,20,20,20,0,0,0,0,0,0,0,0,0,0,0,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,12,28,31,28,0,0,15,44,68,36,0,0,20,20,12,20,20,12,0,0,0,0,0,0,0,0,0,0,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,15,36,36,0,0,12,44,68,36,0,0,28,28,12,23,23,12,0,0,0,12,12,0,0,0,0,12,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,7,36,36,0,0,0,44,68,36,0,0,23,23,0,28,28,0,0,0,0,12,7,0,0,0,0,20,23,12,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,12,0,0,0,0,0,0,12,7,0,0,0,0,0,0,0,28,31,15,36,36,12,0,0,28,60,36,0,0,20,20,12,28,28,0,0,0,12,12,0,0,0,0,12,28,23,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,31,28,7,0,0,0,0,0,12,12,0,0,0,0,0,0,0,23,36,28,36,36,28,0,0,28,60,36,0,0,20,20,28,36,36,0,0,0,20,20,0,0,0,0,28,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,36,23,12,0,0,0,0,0,15,12,0,0,0,0,0,0,12,36,36,36,44,39,0,0,44,52,20,0,12,36,36,36,36,36,0,0,15,20,20,0,0,0,15,28,23,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,39,28,12,0,0,0,0,15,15,0,0,0,0,0,0,0,36,36,31,44,44,0,12,52,60,28,0,28,36,36,39,39,20,0,0,28,28,12,0,0,0,28,31,12,0,0,0,0,0,0,0,12,20,15,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,36,44,44,28,7,0,0,0,7,20,12,0,0,0,0,0,0,36,39,36,44,44,0,0,52,84,55,12,44,39,39,44,44,7,0,0,28,28,0,0,0,20,36,28,0,0,0,0,0,0,0,12,31,28,12,0,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,36,44,39,31,20,0,0,0,12,20,12,0,0,0,0,0,20,44,44,47,44,20,0,52,92,71,15,47,31,39,44,44,0,0,20,31,28,0,0,7,36,36,12,0,0,0,0,0,0,12,36,44,20,7,20,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,28,52,52,36,20,7,0,12,28,28,0,0,0,0,0,0,44,44,55,52,36,12,60,100,84,12,52,36,55,44,44,0,0,31,36,12,0,0,28,39,28,0,0,0,0,0,0,7,28,52,28,12,20,31,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,44,63,52,44,28,0,0,20,36,23,0,0,0,0,0,44,44,63,52,52,23,76,108,87,0,52,44,76,47,44,0,12,36,36,0,0,12,44,44,12,0,0,0,0,0,7,36,52,36,20,20,31,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,60,76,68,52,28,7,0,36,36,12,0,0,0,0,31,47,63,52,52,20,68,124,108,0,44,44,76,52,36,0,28,44,36,0,0,28,44,28,0,0,0,0,0,0,36,60,44,20,20,31,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,68,79,71,52,28,7,20,44,36,0,0,0,0,12,52,55,60,52,28,63,140,116,0,47,47,68,52,20,0,44,44,20,0,12,44,44,12,0,0,0,0,0,36,68,52,28,23,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,60,76,87,84,60,28,12,44,52,28,0,0,0,0,52,52,79,55,44,60,143,124,0,52,55,60,52,0,12,44,44,0,0,36,52,28,0,0,0,0,0,36,76,71,44,36,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,68,92,95,92,60,20,28,60,52,12,0,0,0,44,52,92,55,71,71,159,124,0,52,71,60,52,0,36,47,39,0,20,52,47,12,0,0,0,0,31,76,84,55,36,44,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,79,103,108,100,60,20,52,68,39,0,0,0,20,55,92,60,71,68,164,119,20,60,92,60,55,0,47,52,20,0,44,55,28,0,0,0,0,28,79,92,68,44,47,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,44,84,116,116,108,60,36,68,68,20,0,0,0,60,76,76,68,68,164,124,47,76,108,60,47,15,52,52,0,23,60,52,7,0,0,0,23,76,100,76,52,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,52,100,132,140,108,52,55,76,52,0,0,0,52,63,103,63,92,172,140,76,92,119,60,36,39,52,44,0,52,60,28,0,0,0,20,71,103,87,63,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,63,108,148,156,108,60,71,76,28,0,0,36,60,119,63,116,180,159,92,92,124,60,23,55,60,20,28,63,52,0,0,0,20,68,108,92,68,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,76,124,172,167,103,68,76,60,12,0,12,63,116,76,127,172,172,111,108,116,63,28,60,60,12,55,68,28,0,0,15,63,108,103,76,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,84,148,196,167,100,84,79,44,0,0,60,100,103,124,156,180,127,127,116,68,47,60,44,36,68,52,0,0,12,60,108,111,84,55,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,100,180,212,164,100,92,76,20,0,44,84,132,124,156,188,140,148,108,68,60,63,36,60,68,28,0,20,68,108,119,95,60,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,132,212,220,151,108,92,55,0,20,76,140,124,172,196,148,159,100,76,68,63,47,71,52,0,20,76,119,132,108,68,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,60,148,220,212,156,124,87,31,0,68,148,148,183,199,175,180,100,87,68,68,68,71,28,20,76,124,143,119,76,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,68,159,223,212,167,124,68,12,60,135,164,191,199,204,196,108,87,76,76,76,52,20,71,132,159,132,76,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,71,167,228,212,172,111,44,36,124,183,207,212,228,191,127,79,92,79,76,44,71,140,167,140,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,7,0,0,15,84,180,223,212,164,92,36,100,180,220,220,231,183,148,84,116,92,84,79,156,196,156,84,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,23,12,0,20,92,188,220,220,151,68,84,172,239,236,244,204,164,108,124,116,108,156,212,180,95,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,15,31,36,23,7,28,100,191,236,212,127,84,148,236,244,252,228,172,143,132,151,164,212,191,108,31,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,20,20,20,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,20,20,28,36,44,39,23,36,111,199,239,188,111,135,223,252,252,236,183,172,180,188,207,188,108,31,0,0,0,0,15,20,15,7,0,0,0,0,0,0,0,0,12,20,20,12,7,20,28,44,44,39,36,28,23,20,20,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,28,31,20,0,0,0,0,0,12,20,28,28,39,44,52,52,39,52,124,204,228,156,143,196,252,252,236,212,204,220,215,188,108,31,0,0,12,28,28,23,20,12,0,0,0,0,0,20,31,36,36,44,60,63,60,52,52,44,44,36,36,36,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,28,36,39,44,44,44,28,7,0,0,20,28,36,44,68,76,68,60,76,140,212,204,172,188,247,252,236,236,231,236,188,108,31,0,20,39,44,36,28,15,0,0,7,28,44,52,60,76,84,92,87,84,76,63,52,44,44,44,36,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,31,39,44,47,60,71,76,76,60,36,23,28,39,47,68,92,100,92,111,172,212,207,212,244,252,247,247,236,188,103,44,36,52,52,44,39,28,20,36,60,79,100,116,124,108,103,100,92,76,60,52,47,44,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,68,76,84,84,84,84,84,76,76,76,76,100,132,143,164,204,223,236,244,252,252,236,188,116,84,76,76,68,68,71,76,92,111,124,132,132,132,124,116,84,68,60,52,36,23,20,15,12,0,12,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,68,84,84,84,84,87,100,127,143,156,172,196,215,236,252,252,252,244,212,159,132,140,148,148,132,119,119,124,132,140,148,143,135,119,108,92,71,52,44,31,36,44,44,39,28,23,39,52,47,44,44,44,55,60,52,55,52,36,23,28,47,39,28,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,68,84,92,100,108,132,172,212,244,247,252,252,252,244,215,196,207,228,212,196,196,204,204,196,188,175,164,148,143,143,148,148,140,140,140,116,108,108,103,100,84,76,76,79,68,60,60,60,60,60,55,55,52,36,23,28,47,39,28,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,12,12,12,20,20,20,20,20,44,60,76,76,76,76,76,76,76,76,76,76,76,71,68,68,76,76,84,92,92,92,92,92,92,92,92,92,92,92,100,111,132,156,180,199,223,244,252,252,252,252,247,244,244,252,247,247,252,247,231,204,175,156,156,156,159,164,167,164,151,132,116,108,84,76,68,68,71,71,68,63,63,60,60,60,55,52,52,44,44,36,23,12,7,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,12,12,20,23,23,20,20,20,39,60,68,68,68,76,84,92,92,100,103,108,135,159,167,172,172,164,156,164,180,180,175,172,164,164,156,151,151,156,172,188,204,220,236,244,247,252,252,252,252,252,252,252,252,252,247,244,239,220,188,164,124,92,63,44,28,28,20,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,23,28,36,39,68,92,100,100,100,84,68,68,84,84,79,76,84,100,116,124,127,124,127,148,175,204,220,228,236,252,252,252,252,252,252,252,252,247,244,228,199,164,135,124,108,92,68,52,44,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,12,7,0,0,0,12,31,52,60,68,68,68,68,76,100,132,164,172,164,164,183,215,236,244,244,244,252,252,252,252,252,239,212,196,188,188,172,140,108,79,60,52,47,44,36,36,28,20,20,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,44,52,55,60,60,60,63,68,71,92,116,132,132,116,108,111,135,156,183,215,236,220,215,239,252,252,252,252,252,239,220,191,164,148,148,135,108,68,28,12,20,28,36,36,28,20,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,44,44,47,52,52,52,52,55,60,60,60,60,76,92,100,100,100,100,92,95,111,132,164,212,236,196,175,204,244,252,252,252,252,252,252,228,196,164,140,132,143,156,143,116,76,36,12,0,0,0,0,0,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,36,36,39,44,44,44,47,52,52,44,28,15,23,44,68,84,100,100,100,87,63,52,76,108,140,164,199,220,188,140,156,215,228,236,252,252,252,252,252,231,215,196,151,103,92,116,143,164,159,140,100,60,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,20,20,23,28,28,36,36,39,44,36,20,0,0,0,20,36,52,60,68,76,92,84,63,31,20,47,100,127,140,156,180,204,183,116,116,167,220,188,212,252,252,252,252,252,236,204,196,188,156,92,52,60,92,135,164,172,156,124,84,44,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,15,20,20,23,23,20,12,0,0,0,0,0,20,36,44,47,52,55,60,52,39,23,7,0,36,84,124,132,127,132,164,196,175,100,71,135,183,188,143,188,244,236,236,236,236,252,223,188,164,172,156,100,39,20,39,79,124,156,172,159,132,95,60,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,0,7,0,0,0,0,0,0,0,12,28,36,36,44,44,44,39,20,12,0,0,0,23,68,116,140,124,100,103,148,191,167,95,44,87,180,172,148,127,167,228,220,220,199,220,247,247,212,164,143,156,156,108,44,0,0,28,63,100,140,159,156,116,84,55,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,28,28,31,36,36,28,12,0,0,0,0,0,12,47,95,132,132,100,68,87,140,172,148,92,28,44,127,180,148,108,132,156,212,204,204,164,191,228,252,247,207,148,116,148,148,108,44,0,0,0,15,52,79,108,132,132,108,76,52,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,28,28,28,28,20,12,0,0,0,0,0,0,0,31,79,116,124,108,68,44,79,132,159,127,84,28,20,76,156,140,127,84,116,132,180,196,188,151,148,191,244,252,244,204,132,100,124,132,100,47,15,0,0,0,12,31,60,79,100,108,95,68,44,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,15,23,23,20,0,0,0,0,0,0,0,0,0,20,55,92,119,108,68,28,20,68,132,148,116,68,28,0,44,108,159,108,100,76,84,100,140,180,180,148,100,156,220,252,252,244,196,119,76,95,116,103,60,20,0,0,0,0,0,28,44,63,76,84,76,52,36,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,7,0,0,0,0,0,0,0,0,0,0,12,39,71,100,100,79,36,12,15,68,116,119,84,44,20,0,20,76,140,132,87,84,76,52,76,103,148,172,143,71,108,172,244,252,252,244,196,108,60,76,108,100,68,28,0,0,0,0,0,0,15,36,52,60,68,68,47,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,60,79,92,76,44,15,0,15,60,108,111,68,28,0,0,0,52,95,135,100,68,71,71,44,76,84,127,172,151,79,55,127,204,236,244,252,244,188,100,52,55,92,92,71,36,12,0,0,0,0,0,0,12,28,44,52,55,55,36,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,68,84,76,52,20,0,0,20,55,92,92,68,36,7,0,0,28,68,116,103,63,60,68,60,44,76,76,100,151,159,92,23,79,156,215,228,244,244,228,164,84,36,44,84,87,71,39,20,0,0,0,0,0,0,0,0,20,36,36,39,44,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,52,68,68,52,28,12,0,0,20,52,79,71,47,36,20,0,0,0,52,84,108,76,28,63,68,44,44,76,68,63,108,151,103,20,36,108,180,212,223,231,212,188,135,63,28,36,68,76,68,44,23,0,0,0,0,0,0,0,0,0,12,28,31,31,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,39,60,68,52,31,12,0,0,0,23,55,68,52,28,20,12,0,0,0,28,63,100,84,55,12,68,68,20,44,68,55,39,71,148,119,28,7,60,132,180,196,212,199,172,151,116,52,20,28,52,68,68,47,28,7,0,0,0,0,0,0,0,0,0,12,20,28,28,20,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,44,55,52,36,20,0,0,0,0,28,52,60,36,12,12,7,0,0,0,12,52,76,92,68,28,20,63,63,0,44,60,31,20,47,132,127,44,0,20,84,140,172,196,204,172,143,127,100,44,12,20,44,60,60,47,28,12,0,0,0,0,0,0,0,0,0,0,0,12,20,20,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,31,44,44,36,20,7,0,0,0,0,28,52,52,28,0,0,0,0,0,0,0,36,60,79,68,52,0,44,63,55,0,44,60,15,0,20,103,124,60,0,0,39,100,148,172,191,180,140,116,108,92,44,12,12,36,47,44,39,23,7,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,20,31,28,28,20,12,0,0,0,0,0,28,52,44,20,0,0,0,0,0,0,0,12,52,60,76,63,28,0,55,60,36,0,47,60,20,7,0,76,116,76,7,0,12,68,124,143,172,183,148,111,100,100,84,36,0,7,20,31,36,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,28,28,20,12,0,0,0,0,0,0,7,28,52,36,15,0,0,0,0,0,0,0,0,36,52,68,63,55,0,0,60,60,12,0,52,60,23,15,0,60,103,84,23,0,0,36,92,124,143,172,164,116,84,87,87,76,28,0,0,12,20,15,20,20,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,12,7,0,0,0,0,0,0,12,31,52,31,12,0,0,0,0,0,0,0,0,20,52,52,68,60,31,0,20,60,60,0,0,52,60,23,20,0,44,84,92,31,0,0,7,60,103,116,148,164,140,87,68,76,76,63,23,0,0,0,0,7,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,44,28,7,0,0,0,0,0,0,0,0,0,36,47,52,60,52,0,0,36,55,52,0,0,52,52,12,12,0,20,68,84,28,0,0,0,28,76,108,111,148,156,108,68,60,68,71,60,23,0,0,0,0,0,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,39,23,0,0,0,0,0,0,0,0,0,0,20,44,39,52,55,36,0,0,52,52,36,0,0,52,52,0,0,0,0,55,76,28,0,0,0,0,47,92,92,116,140,132,76,52,52,68,68,44,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,31,36,20,0,0,0,0,0,0,0,0,0,0,0,36,44,36,52,52,12,0,0,52,52,12,0,0,52,52,0,0,0,0,52,68,44,7,0,0,0,28,68,92,84,119,132,100,60,44,44,63,47,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,28,12,0,0,0,0,0,0,0,0,0,0,0,20,39,28,44,52,36,0,0,12,52,52,0,0,0,52,52,0,0,0,0,44,60,52,0,0,0,0,0,44,76,76,92,116,111,68,36,28,36,44,28,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,23,20,12,0,0,0,0,0,0,0,0,0,0,0,7,36,36,28,52,52,12,0,0,36,47,44,0,0,0,47,47,0,0,0,0,28,52,52,0,0,0,0,0,20,52,79,68,87,108,87,44,28,28,36,44,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,23,36,20,31,47,36,0,0,0,44,47,28,0,0,0,44,44,0,0,0,0,7,47,47,0,0,0,0,0,0,36,63,68,68,84,92,63,36,20,20,36,52,44,23,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,31,15,44,44,15,0,0,0,44,44,12,0,0,0,44,44,0,0,0,0,0,44,44,12,0,0,0,0,0,15,44,68,52,63,76,76,39,20,20,28,31,44,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,31,15,23,44,36,0,0,0,12,44,44,0,0,0,0,44,44,0,0,0,0,0,44,44,28,0,0,0,0,0,0,36,52,60,52,60,71,55,28,20,12,20,28,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,23,7,39,44,20,0,0,0,28,39,36,0,0,0,0,44,44,0,0,0,0,0,28,44,39,0,0,0,0,0,0,12,36,60,44,52,60,68,44,20,12,12,15,15,12,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,12,20,39,36,0,0,0,0,36,39,28,0,0,0,0,39,39,0,0,0,0,0,12,39,39,0,0,0,0,0,0,0,28,44,52,36,44,52,52,20,7,0,0,0,12,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,20,0,31,36,20,0,0,0,0,36,36,12,0,0,0,0,36,36,0,0,0,0,0,0,36,36,0,0,0,0,0,0,0,12,36,52,39,36,39,44,31,12,0,0,0,15,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,0,12,36,31,0,0,0,0,12,36,36,0,0,0,0,0,28,28,0,0,0,0,0,0,36,36,20,0,0,0,0,0,0,0,20,36,44,28,36,36,36,15,0,0,0,0,12,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,0,0,28,36,20,0,0,0,0,15,28,28,0,0,0,0,0,12,12,0,0,0,0,0,0,28,36,28,0,0,0,0,0,0,0,12,28,44,36,31,31,36,28,7,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,12,31,31,0,0,0,0,0,23,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,20,31,31,0,0,0,0,0,0,0,0,20,28,36,23,28,28,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,20,28,20,0,0,0,0,0,23,23,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,0,0,0,0,0,0,0,0,0,23,31,28,20,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,0,0,0,0,0,0,0,0,0,12,23,28,15,15,12,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,20,0,0,0,0,0,12,20,20,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,20,20,12,0,0,0,0,0,0,0,0,0,20,20,20,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,23,0,0,0,0,0,0,20,20,12,0,0,0,0,0,0,28,28,0,0,0,0,0,0,0,12,20,20,0,0,0,0,0,0,0,0,0,12,20,20,15,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,28,28,0,0,0,0,0,0,0,7,20,20,0,0,0,0,0,0,0,0,0,0,12,15,12,7,0,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,7,0,0,0,0,0,0,15,15,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,7,12,12,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,7,0,0,0,0,0,0,12,20,20,0,0,0,0,0,0,0,0,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,15,20,20,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,7,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};\n    const uint8_t SHINE_TEXTURE_2[16384] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,0,0,0,0,0,0,0,7,7,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,15,15,0,0,0,0,0,0,0,0,7,23,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,7,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,15,15,0,0,0,0,0,0,0,0,20,28,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,15,0,0,0,0,0,0,12,12,0,0,0,0,28,28,12,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,28,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,23,12,0,0,0,0,0,12,12,0,0,0,0,20,23,20,0,0,0,0,12,12,0,0,7,7,0,0,0,0,0,0,0,15,28,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,20,0,0,0,0,0,12,15,12,0,0,0,15,23,23,0,0,0,0,28,28,0,0,20,20,0,0,0,0,0,0,0,28,31,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,15,0,0,0,0,0,20,20,0,0,0,12,23,23,0,0,0,0,36,36,0,20,28,28,0,0,0,0,12,12,12,36,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,28,7,0,0,0,0,28,28,12,0,0,0,28,28,0,0,0,0,36,36,0,20,20,20,0,0,0,7,12,12,28,36,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,31,20,0,0,0,0,20,28,23,0,0,0,28,28,12,0,0,0,36,36,0,23,28,20,0,0,0,20,20,20,36,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,36,12,0,0,0,0,28,28,0,0,0,36,36,28,0,0,0,36,36,0,36,36,23,0,0,0,15,15,28,39,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,28,0,0,0,0,28,36,20,0,0,28,44,44,0,0,0,36,36,0,36,36,12,0,0,0,12,12,36,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,28,39,20,0,0,0,20,36,31,0,0,20,44,52,12,0,0,36,36,0,36,36,0,0,0,12,20,28,44,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,20,12,0,0,0,12,44,39,12,0,0,0,36,36,12,0,0,44,52,12,0,0,36,36,0,39,39,0,0,0,20,20,39,44,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,15,0,0,0,0,28,44,28,0,0,0,36,39,28,0,0,44,60,28,0,0,36,36,7,44,44,0,0,7,31,36,52,47,20,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,12,28,20,0,0,0,12,44,44,20,0,0,20,44,39,0,0,44,71,55,12,0,44,44,20,44,44,0,0,20,36,55,52,47,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,15,12,0,0,0,0,0,0,0,0,0,0,20,36,20,0,0,0,28,52,39,0,0,0,44,44,15,0,39,68,68,15,0,52,52,31,44,44,0,0,36,36,68,52,31,0,0,12,12,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,12,12,0,0,0,0,0,0,0,0,0,28,39,20,0,0,0,44,52,28,0,0,31,44,36,0,28,68,76,20,0,60,60,44,52,52,0,0,36,52,60,52,12,0,12,20,12,0,0,0,0,0,0,0,0,0,20,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,15,0,0,0,0,0,0,0,0,7,31,39,20,0,0,20,52,47,12,0,12,52,47,0,12,76,92,44,0,60,60,47,52,47,0,23,44,76,52,44,0,0,28,28,7,0,0,0,0,0,0,0,0,20,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,28,23,12,0,0,0,0,0,0,0,12,36,44,20,0,0,36,55,36,0,0,47,52,23,0,68,100,60,0,60,60,52,60,36,7,44,52,84,55,23,0,20,28,20,0,0,0,0,0,0,0,7,28,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,31,20,0,0,0,0,0,0,0,20,44,44,15,0,15,52,55,20,0,31,52,44,0,60,108,84,0,60,60,52,68,36,20,52,76,71,55,0,12,36,31,0,0,0,0,0,0,0,12,28,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,36,28,7,0,0,0,0,0,0,31,52,39,12,0,36,60,44,0,12,55,55,12,52,116,108,23,60,63,55,76,31,39,60,100,60,44,0,28,36,20,0,0,0,0,0,0,12,36,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,44,36,15,0,0,0,0,12,28,52,60,36,7,12,52,60,28,0,52,60,36,36,124,127,44,60,76,60,84,36,60,79,108,60,15,20,44,36,0,0,0,0,0,0,20,39,44,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,44,44,28,0,0,0,12,23,44,55,60,36,0,28,68,55,12,28,60,55,20,116,140,68,60,87,68,92,52,79,103,92,55,12,39,44,15,0,0,0,0,0,20,44,44,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,52,36,12,0,0,12,28,52,68,60,31,7,52,68,39,12,60,60,28,100,135,84,68,108,87,108,87,100,124,76,36,36,52,31,0,0,0,0,0,28,52,47,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,52,44,23,0,0,12,36,63,76,60,28,23,68,68,20,52,63,47,84,135,100,79,124,108,132,116,124,124,68,39,60,52,12,0,0,0,0,28,55,52,20,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,52,60,36,12,0,15,44,76,87,60,28,44,76,52,31,68,63,76,132,116,92,132,116,148,135,156,108,63,60,76,36,0,0,0,0,36,60,52,20,0,0,7,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,52,60,47,20,0,20,52,87,100,60,36,68,76,39,68,68,76,132,124,108,143,124,164,143,164,87,68,84,60,7,0,0,12,39,68,52,20,0,7,12,20,12,0,7,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,20,20,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,44,63,60,31,7,20,60,100,108,52,52,76,63,60,71,87,124,127,124,156,135,188,175,156,95,84,84,36,0,0,12,44,71,52,20,0,20,31,28,15,12,12,20,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,28,20,20,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,60,68,44,20,28,76,111,108,60,71,79,68,76,84,124,124,140,172,167,212,204,140,111,108,76,12,0,15,52,76,52,20,12,28,36,36,28,23,23,20,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,20,20,23,36,36,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,28,55,76,60,36,36,87,124,111,76,84,79,100,84,140,124,156,188,196,236,199,140,124,108,44,0,20,55,79,60,28,28,44,44,39,36,31,28,23,12,0,0,0,7,20,20,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,36,36,36,39,44,36,15,0,0,0,0,0,0,0,0,0,0,15,47,76,71,44,47,100,140,116,100,92,124,103,156,132,172,199,223,244,188,156,132,92,20,28,60,100,68,52,47,52,52,52,44,36,31,20,0,0,12,23,28,23,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,0,7,20,36,39,44,44,44,47,39,20,0,0,0,0,0,0,0,0,0,36,68,84,63,68,119,156,132,116,132,148,172,172,204,220,236,228,188,164,140,60,36,76,108,100,68,63,68,68,60,44,36,28,12,12,28,36,36,31,28,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,23,20,20,20,28,28,28,36,44,47,52,52,52,47,28,7,0,0,0,0,0,0,28,60,84,79,92,140,159,148,135,172,196,220,236,244,247,220,204,172,116,68,92,124,124,100,92,92,87,63,47,36,28,31,44,44,36,36,36,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,28,28,36,44,52,52,47,39,44,52,60,60,55,55,60,60,55,36,12,0,0,0,0,12,52,84,92,111,156,172,164,183,215,244,252,252,252,228,212,156,108,119,159,156,124,124,124,100,68,55,52,52,52,47,44,44,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,12,12,20,20,15,28,44,55,60,68,68,84,79,84,84,92,92,79,68,63,68,60,44,20,0,0,0,36,76,103,132,172,188,204,228,252,252,252,252,236,196,148,148,196,196,172,156,132,116,103,92,68,52,52,52,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,0,7,20,20,20,28,52,52,52,60,76,92,92,100,108,108,111,124,132,132,119,100,84,76,68,52,28,7,28,63,108,156,196,223,239,252,252,252,252,231,191,180,212,236,212,180,156,148,124,84,63,60,52,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,7,20,20,15,20,36,28,28,36,52,76,84,108,127,148,156,156,140,132,132,151,167,164,143,124,108,92,68,52,68,108,172,228,247,252,252,252,252,228,215,228,252,252,228,204,172,124,84,76,55,36,23,20,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,28,44,44,44,47,52,63,84,108,132,156,172,180,188,196,204,212,212,196,167,135,111,116,156,207,244,252,252,252,252,244,244,252,252,244,215,180,159,132,84,55,36,28,23,20,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,20,28,44,52,44,20,20,44,60,60,60,60,60,68,84,95,100,100,100,108,116,132,156,180,196,204,223,244,247,236,204,180,180,212,244,252,252,252,252,252,252,252,252,239,207,156,111,68,47,44,36,28,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,20,28,44,52,44,20,20,44,60,60,68,68,60,68,68,71,68,68,76,76,92,103,116,132,159,196,231,244,252,252,252,252,244,244,247,252,252,252,252,252,252,252,252,236,204,172,140,103,76,68,60,60,52,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,44,52,68,76,100,111,132,140,140,143,156,180,204,215,236,252,252,252,252,252,252,252,252,252,252,252,252,252,252,239,215,188,159,148,132,116,100,87,68,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,28,28,44,55,76,79,95,103,116,140,159,172,172,172,199,228,239,239,244,252,252,252,252,252,252,252,252,244,236,231,223,196,156,127,100,92,87,84,84,84,76,63,47,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,20,44,68,84,84,92,92,87,84,100,132,164,183,172,180,207,239,252,252,252,252,252,252,252,252,244,231,212,196,188,188,188,172,156,140,111,92,84,84,84,84,84,79,79,76,71,60,44,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,23,28,36,44,52,63,84,111,132,140,127,116,116,132,156,196,236,252,252,252,252,252,252,252,252,247,236,207,183,164,156,159,156,148,116,100,95,95,92,79,76,79,79,79,79,79,79,76,76,76,71,55,52,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,20,20,20,23,28,36,36,47,71,95,108,108,108,100,100,100,116,164,220,247,252,252,252,252,252,239,239,244,252,252,239,196,143,124,116,111,124,135,140,124,95,71,63,60,47,36,28,36,52,68,76,76,76,71,60,60,55,36,28,31,20,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,20,12,12,0,0,20,52,79,100,108,100,79,60,60,76,111,140,188,223,247,239,239,252,252,252,228,215,220,236,236,239,228,196,148,100,84,79,71,76,92,116,124,108,84,63,60,55,47,28,12,0,0,12,23,36,47,52,36,28,31,20,12,20,12,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,47,63,76,84,84,60,28,31,60,79,108,124,156,196,236,228,220,228,252,252,252,228,188,172,199,204,204,220,204,188,156,108,79,60,44,47,60,63,71,92,108,92,68,55,52,52,47,36,20,0,0,0,0,0,0,12,12,12,20,12,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,44,52,60,60,52,28,7,12,44,68,79,100,108,132,172,220,231,196,196,223,244,252,252,244,180,143,143,156,164,172,196,183,164,140,116,84,68,47,23,23,44,55,55,60,68,84,76,60,52,44,44,44,39,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,44,44,47,47,36,15,0,0,28,52,68,71,84,92,108,148,204,244,204,172,180,220,220,239,252,244,188,124,100,132,127,140,140,164,164,148,124,108,92,71,63,36,12,0,28,44,52,52,47,52,60,60,52,44,44,39,36,36,28,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,31,36,36,44,39,20,0,0,0,12,39,60,63,60,68,84,95,116,180,236,228,156,156,180,191,172,220,244,236,196,116,84,100,116,108,116,124,140,135,127,108,95,84,71,68,55,31,0,0,7,28,44,44,44,39,39,39,39,36,36,36,36,36,31,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,28,31,36,36,23,12,0,0,0,0,23,52,60,52,47,60,84,84,92,140,204,228,175,127,164,183,156,132,199,231,212,188,116,71,60,95,95,92,100,108,116,108,108,100,84,71,63,63,60,52,23,0,0,0,12,28,39,36,36,36,31,23,20,28,31,31,28,28,20,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,23,28,28,28,12,0,0,0,0,0,12,36,52,55,36,36,52,84,60,60,100,172,212,196,124,116,183,159,119,116,196,212,180,172,116,60,39,68,87,84,76,92,92,100,84,84,76,84,63,52,52,60,60,44,20,0,0,0,0,12,28,36,31,28,28,20,7,7,15,23,20,20,20,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,20,23,15,0,0,0,0,0,0,0,23,44,52,44,23,28,55,76,52,31,60,124,175,196,140,76,127,188,124,84,108,188,204,172,172,116,63,44,28,68,76,76,63,84,84,84,68,60,60,84,68,44,39,52,55,52,36,12,0,0,0,0,0,12,28,28,20,12,15,12,7,0,0,15,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,12,28,44,44,28,12,28,60,76,44,20,39,92,135,180,164,87,68,156,172,84,63,103,172,188,164,180,108,79,44,20,36,63,68,60,52,71,68,76,63,44,47,71,76,52,28,31,52,52,44,28,0,0,0,0,0,0,0,0,12,15,12,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,44,36,15,0,31,63,68,36,12,31,79,108,156,175,116,39,84,172,143,52,55,100,156,175,164,172,103,87,36,15,12,36,63,63,47,52,60,63,68,60,36,31,60,76,60,28,15,36,44,44,36,20,0,0,0,0,0,0,0,0,12,15,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,36,20,0,0,36,68,60,31,0,28,60,84,124,172,148,60,28,116,175,116,28,52,100,151,164,164,156,108,84,36,20,0,0,36,68,52,36,52,52,52,60,60,31,20,44,68,60,28,0,12,36,44,39,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,31,23,12,0,12,36,68,55,28,0,20,52,68,87,143,164,92,12,44,140,159,76,20,52,100,148,156,156,148,119,60,44,28,0,0,0,44,60,36,28,52,44,44,52,60,31,12,28,52,52,28,12,0,15,36,36,36,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,20,12,0,0,12,39,63,47,20,0,12,44,60,63,103,156,116,36,0,79,164,140,44,31,47,100,148,148,148,143,132,44,60,28,0,0,0,15,52,55,28,23,44,36,39,47,60,36,7,15,36,44,31,12,0,0,20,31,36,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,20,7,0,0,0,15,44,60,39,12,0,12,36,52,52,76,140,132,60,0,20,108,164,100,15,39,44,92,143,140,132,140,127,47,60,23,15,0,0,0,28,52,44,15,20,44,36,28,44,60,36,7,0,20,36,28,15,0,0,0,20,28,28,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,15,0,0,0,0,20,44,55,36,7,0,0,28,52,36,44,108,140,87,20,0,55,132,148,60,0,44,44,79,140,140,111,135,119,60,44,20,15,0,0,0,0,31,52,31,7,23,44,28,23,36,55,36,12,0,12,28,28,20,0,0,0,0,20,28,23,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,20,44,52,28,0,0,0,23,44,31,36,79,132,108,44,0,0,84,148,116,36,0,44,44,68,140,140,100,132,119,76,36,20,7,0,0,0,0,12,39,47,20,0,20,36,20,20,36,52,36,12,0,0,20,28,20,0,0,0,0,7,20,20,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,47,44,23,0,0,0,20,39,31,15,39,103,124,63,7,0,20,100,143,76,15,0,28,28,52,132,135,92,119,124,84,28,28,0,0,0,0,0,0,20,44,39,12,0,20,36,20,12,28,47,36,12,0,0,12,15,12,0,0,0,0,0,0,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,44,39,20,0,0,0,12,36,31,15,20,71,108,84,23,0,0,52,108,124,44,0,0,28,28,39,124,132,84,100,124,79,20,20,0,0,0,0,0,0,0,23,44,28,0,0,20,23,7,0,28,44,36,12,0,0,0,7,0,0,0,0,0,0,0,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,44,36,12,0,0,0,0,20,28,15,12,44,92,92,44,0,0,0,71,116,92,28,0,12,36,36,36,116,124,68,76,116,68,20,20,0,0,0,0,0,0,0,0,28,39,20,0,0,12,7,0,0,20,39,36,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,44,28,12,0,0,0,0,12,23,12,0,20,68,100,68,12,0,0,20,84,116,55,12,0,15,23,23,36,116,119,52,60,111,60,20,12,0,0,0,0,0,0,0,0,12,36,36,12,0,0,0,0,0,0,20,36,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,20,0,0,0,0,0,15,20,7,0,0,39,84,79,28,0,0,0,44,84,100,36,0,0,20,20,20,36,108,116,44,47,108,63,36,12,12,0,0,0,0,0,0,0,0,20,36,28,0,0,0,0,7,0,0,15,28,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,20,0,0,0,0,0,0,20,12,0,0,12,63,84,52,0,0,0,0,60,92,68,23,0,0,20,20,12,20,84,103,39,44,95,68,36,7,7,0,0,0,0,0,0,0,0,0,20,28,12,0,0,0,12,7,0,0,12,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,12,0,0,0,0,0,0,0,0,0,0,0,44,84,68,15,0,0,0,15,60,84,39,12,0,0,20,20,0,0,52,92,39,44,76,68,36,0,0,0,0,0,0,0,0,0,0,0,0,20,20,12,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,0,0,0,0,0,0,0,0,0,0,0,20,68,79,36,0,0,0,0,31,55,68,20,0,0,0,0,0,0,0,39,79,36,31,52,60,28,0,0,0,0,0,0,0,0,0,0,0,0,12,28,20,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,44,76,52,0,0,0,0,0,39,55,44,12,0,0,0,0,0,0,0,36,76,36,28,36,55,23,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,7,0,0,0,0,0,0,0,0,0,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,23,68,63,20,0,0,0,0,7,36,52,15,0,0,0,0,7,7,0,0,36,68,28,20,36,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,12,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,52,63,36,0,0,0,0,0,20,36,39,7,0,0,0,0,0,0,0,12,47,68,28,7,36,52,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,60,44,0,0,0,0,0,0,31,39,28,7,0,0,0,0,0,0,0,15,52,68,28,0,20,36,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,47,52,20,0,0,0,0,0,12,31,36,0,0,0,0,0,0,0,0,0,12,52,63,28,0,15,28,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,47,28,0,0,0,0,0,0,20,28,23,0,0,0,0,0,0,0,0,0,12,47,47,12,0,20,23,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,36,7,0,0,0,0,0,0,28,28,7,0,0,0,0,0,0,0,0,0,0,44,36,0,0,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,28,12,0,0,0,0,0,0,12,28,28,0,0,0,0,0,0,0,0,0,0,0,36,36,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,15,0,0,0,0,0,0,0,15,20,12,0,0,0,0,0,0,0,0,0,0,0,28,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,20,0,0,0,0,0,0,0,0,15,15,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,12,0,0,0,0,0,0,0,0,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};\n    const uint8_t SHINE_TEXTURE_3[16384] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,12,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,7,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,20,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,15,12,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,20,20,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,20,0,7,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,28,0,28,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,20,7,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,28,0,28,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,31,20,20,15,15,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,31,0,36,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,28,31,28,28,20,20,12,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,23,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,0,36,36,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,31,44,28,23,15,7,0,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,28,36,36,36,44,36,31,20,0,0,12,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,15,0,12,12,0,0,0,0,0,0,0,0,0,7,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,39,52,39,52,44,39,28,12,0,12,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,28,12,12,20,12,12,12,0,0,0,0,0,0,12,0,0,0,39,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,52,55,52,52,44,36,20,0,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,36,28,12,20,20,20,20,12,0,0,0,0,0,12,12,0,0,39,39,12,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,68,55,60,52,44,28,7,12,23,15,0,0,0,0,0,0,0,7,12,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,23,12,0,0,0,0,0,0,0,0,0,0,7,7,0,0,28,36,20,15,28,28,20,20,0,0,0,0,12,15,20,12,0,44,44,23,28,23,0,0,0,0,0,0,0,0,0,0,0,44,68,71,63,60,55,36,12,15,28,20,0,0,0,0,0,0,0,7,20,15,20,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,28,15,0,0,0,0,0,0,0,0,0,7,12,12,0,15,36,36,20,28,28,31,23,12,0,0,0,0,12,28,12,0,44,44,36,44,44,0,0,0,0,0,0,0,0,0,0,20,60,87,71,71,60,47,28,20,36,36,12,0,0,0,0,0,0,0,12,20,23,28,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,20,36,39,23,0,0,0,0,0,0,0,0,0,7,20,12,7,20,44,31,23,31,36,28,28,0,0,0,0,20,36,15,0,44,44,44,47,44,0,0,0,0,0,0,0,0,0,0,47,79,92,79,76,60,36,28,44,44,20,0,0,0,0,0,0,15,15,15,23,31,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,7,0,0,0,0,0,15,36,44,28,12,0,0,0,0,0,0,0,0,15,28,28,12,36,44,31,31,36,44,28,12,0,0,0,20,44,31,12,44,47,52,52,39,0,0,0,0,0,0,0,0,0,28,68,100,84,84,68,52,36,44,52,23,0,0,0,0,0,0,20,31,28,31,36,23,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,0,0,0,0,0,12,31,47,36,20,0,0,0,0,0,0,0,12,36,44,31,28,44,44,36,36,47,36,28,0,0,0,20,44,44,23,44,52,60,52,36,0,0,0,0,0,0,0,0,0,60,100,108,92,87,60,44,44,60,31,0,0,0,0,0,0,20,28,39,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,20,15,0,0,0,0,0,28,47,44,23,0,0,0,0,0,0,0,15,47,60,36,36,52,47,47,52,55,36,12,0,0,12,44,60,31,36,52,68,47,28,0,0,0,0,0,0,0,0,28,92,124,108,100,79,52,55,60,44,12,0,0,0,0,12,23,36,36,44,36,20,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,28,28,12,0,0,0,0,23,47,52,31,7,0,0,0,0,0,0,23,60,60,36,47,60,60,52,60,44,31,0,0,7,39,71,36,36,52,71,47,28,0,0,0,0,0,0,0,0,68,116,132,116,100,76,68,68,52,20,0,0,0,0,20,36,47,47,44,31,15,0,0,0,0,0,0,0,0,0,0,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,0,0,0,0,0,15,28,28,23,12,0,0,0,20,44,55,39,20,0,0,0,0,0,0,36,68,60,44,55,68,68,60,68,44,15,0,0,36,76,47,36,52,76,52,28,0,0,0,0,0,0,0,31,100,148,132,116,92,76,79,68,28,0,0,0,0,23,44,60,60,47,28,12,0,0,7,15,12,7,12,12,12,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,20,20,7,0,0,0,12,20,31,36,20,7,0,0,12,36,60,52,23,0,0,0,0,0,12,44,76,63,52,60,79,76,84,55,36,0,0,39,84,68,47,60,84,60,28,0,0,0,0,0,0,0,71,132,151,132,108,87,92,84,36,0,0,0,7,28,52,63,63,47,28,0,0,0,15,20,20,20,20,23,28,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,20,20,12,0,0,0,15,31,36,36,20,0,0,0,31,60,60,36,0,0,0,0,0,15,60,87,68,63,79,95,84,79,47,12,0,39,92,84,52,60,92,60,28,0,0,0,0,0,0,36,108,167,159,132,108,103,92,52,7,0,0,12,36,63,68,68,44,20,0,0,20,28,28,28,28,28,36,39,31,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,23,28,28,15,0,0,7,23,36,44,36,15,0,0,28,52,68,44,23,20,15,0,0,23,76,95,84,79,103,103,100,68,36,0,28,87,95,60,60,92,60,28,0,0,0,7,12,15,76,148,180,156,124,116,108,63,15,0,0,15,39,76,76,68,44,20,0,12,28,36,36,36,36,39,47,44,28,15,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,28,28,28,20,0,0,12,31,44,44,28,12,0,20,47,68,60,44,28,20,7,0,36,92,100,87,92,119,108,100,55,12,20,79,108,68,63,100,63,28,0,0,0,12,15,39,119,191,188,148,135,124,84,23,0,0,20,52,84,84,68,36,12,7,28,44,44,52,44,44,55,52,36,20,12,7,12,15,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,31,36,36,20,0,0,20,44,47,44,23,0,12,44,68,68,52,31,20,0,0,52,108,111,103,119,132,124,79,36,20,84,124,84,76,108,63,20,0,0,12,20,31,84,172,220,188,156,148,108,36,0,0,28,63,92,92,68,31,12,20,39,47,60,55,60,63,63,44,28,20,12,20,20,20,15,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,39,39,28,7,12,31,47,52,44,20,7,36,68,76,60,44,23,15,12,68,119,124,116,148,148,124,60,28,76,148,108,95,108,60,20,0,0,28,28,60,140,220,215,183,159,124,55,0,0,36,76,100,100,60,28,20,36,52,60,68,71,71,76,55,36,23,20,23,23,20,20,12,0,0,7,12,15,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,44,44,44,28,12,20,44,52,52,36,15,28,60,76,71,60,39,20,20,84,132,132,143,172,164,92,44,68,156,132,116,116,63,28,7,12,31,44,100,191,239,212,180,140,71,12,12,44,92,111,100,52,28,28,52,68,76,84,84,87,68,44,31,31,31,28,28,23,12,0,12,20,20,20,15,15,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,44,44,52,36,23,28,52,60,52,31,28,52,84,87,76,52,23,36,95,140,148,188,199,148,68,60,148,148,140,124,68,36,20,31,36,79,143,228,239,212,164,87,20,12,52,108,119,95,47,36,44,68,84,100,100,100,76,60,44,44,36,36,31,28,12,12,23,28,28,23,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,12,0,0,0,0,12,36,52,52,52,39,36,44,60,63,52,36,47,76,100,92,63,36,52,108,148,180,204,196,108,76,132,172,159,140,84,39,20,44,55,119,196,244,236,188,108,31,20,68,124,124,92,52,47,68,92,111,116,108,92,71,60,52,39,36,36,28,23,28,36,36,28,28,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,20,23,20,0,0,0,12,36,52,52,60,52,52,55,68,63,52,52,71,103,103,84,44,68,119,167,204,215,167,95,124,172,180,164,108,44,44,47,95,156,236,244,212,124,47,31,92,140,132,87,60,63,92,124,135,132,116,100,76,60,44,44,39,36,36,36,36,36,36,31,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,15,20,28,28,28,28,20,7,0,12,36,55,60,60,60,63,68,68,68,68,76,108,124,108,63,84,140,196,223,220,132,124,167,196,196,140,60,76,68,140,196,252,228,156,68,47,108,156,140,92,76,92,132,159,159,140,132,108,84,55,47,52,55,52,44,44,36,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,28,36,39,44,39,28,12,12,36,60,60,63,76,84,79,76,76,84,119,148,135,92,100,172,220,239,183,148,164,212,215,156,63,100,108,180,236,239,180,87,63,119,164,148,108,100,132,172,188,188,172,140,100,68,68,71,68,52,52,44,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,39,47,55,60,52,47,31,20,36,60,68,76,95,100,87,87,100,132,164,156,116,132,196,239,228,167,172,212,228,159,84,116,164,212,244,196,116,84,132,172,164,132,140,175,196,207,204,172,119,92,92,87,68,52,52,52,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,52,60,76,79,84,60,44,52,68,71,84,111,116,100,116,148,175,164,140,164,215,247,196,188,199,236,172,124,140,204,236,212,140,108,140,180,175,172,188,212,231,220,188,148,124,116,92,68,55,52,47,28,0,0,0,0,0,12,12,15,12,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,23,52,76,95,95,100,100,84,79,84,92,111,132,132,132,156,188,172,164,191,231,223,212,212,247,196,172,188,236,223,172,135,159,196,196,196,220,244,239,220,188,156,124,92,68,60,52,36,12,0,15,28,39,44,39,39,36,36,28,20,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,7,7,0,0,12,12,12,20,44,63,84,100,108,108,108,108,124,132,127,143,159,164,175,196,196,196,228,247,231,231,252,228,223,228,236,199,172,188,220,215,220,236,252,244,228,188,132,92,68,60,44,36,36,55,71,84,87,84,76,68,52,44,36,28,20,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,0,12,20,20,20,44,39,36,39,36,28,39,60,92,124,132,124,119,132,156,180,196,204,207,212,228,228,236,252,247,247,252,244,244,247,231,204,212,236,239,239,252,247,228,188,140,103,84,84,76,84,92,100,100,100,95,92,92,84,68,52,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,15,20,31,28,28,47,60,68,84,87,92,92,95,111,135,156,167,175,199,220,236,236,244,247,252,252,252,252,252,252,252,252,236,236,244,252,252,236,212,188,164,148,132,116,103,100,100,100,100,100,100,87,68,47,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,20,28,36,44,44,44,52,71,92,103,108,116,140,175,204,220,236,244,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,239,220,196,164,132,108,100,100,100,100,87,71,52,31,12,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,20,12,0,0,0,0,0,7,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,15,15,15,15,15,15,15,15,15,15,15,12,0,0,0,0,0,0,0,7,20,36,52,60,60,68,79,108,132,148,156,188,228,252,252,252,252,252,252,252,252,252,252,252,252,252,252,236,212,172,143,132,135,132,116,100,84,68,60,60,63,68,63,68,68,63,63,63,60,31,28,36,36,36,36,36,28,28,20,12,0,0,0,0,0,7,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,20,23,28,36,36,36,36,36,44,44,44,36,36,39,44,47,47,47,52,55,60,60,60,63,71,84,100,116,132,156,183,212,231,236,244,252,252,252,252,252,252,252,252,252,252,252,236,220,204,188,164,151,148,132,124,124,119,100,84,76,68,68,68,68,63,63,63,60,31,28,36,36,36,36,36,28,28,20,12,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,15,15,20,23,28,28,28,28,36,39,44,44,44,44,52,52,52,52,60,68,84,100,116,132,156,175,196,212,228,244,252,252,252,252,252,252,252,252,252,236,223,220,228,244,228,191,156,148,132,124,116,116,100,76,68,63,60,52,52,52,44,44,44,36,15,12,28,36,28,28,28,28,23,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,36,52,60,76,92,111,127,148,164,175,180,180,199,231,252,252,252,252,252,252,252,252,247,231,199,183,180,172,159,140,116,95,100,100,92,84,76,60,52,55,60,52,52,52,52,44,44,44,36,15,12,28,36,28,28,28,28,23,20,7,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,39,44,47,52,52,68,87,108,124,156,183,204,207,199,183,175,183,204,220,244,252,244,239,239,252,252,252,252,247,231,196,140,108,103,116,116,92,68,60,52,52,47,44,44,36,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,7,12,15,15,12,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,20,36,36,36,39,44,52,71,92,108,111,124,143,159,159,164,159,143,132,132,148,156,172,196,228,247,244,207,204,228,236,236,252,252,252,247,220,172,132,100,76,71,68,63,52,44,39,44,44,44,36,28,23,20,15,12,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,12,12,20,20,20,20,44,60,76,87,92,92,92,95,100,100,103,108,103,92,84,84,92,100,100,124,164,196,220,244,236,188,156,180,220,204,204,247,244,244,252,252,231,180,116,68,60,60,63,60,60,52,28,0,0,0,12,20,20,15,12,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,15,12,20,36,52,52,52,60,47,47,52,68,68,76,76,76,60,47,44,44,47,60,68,76,100,140,156,164,188,215,220,172,116,140,204,212,172,180,244,220,212,228,231,239,236,196,135,68,28,28,47,60,55,52,52,36,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,20,28,28,23,28,36,36,44,52,55,60,47,39,20,23,28,31,20,12,36,55,63,68,84,108,116,108,124,156,196,199,156,87,84,164,223,167,140,172,236,188,172,180,196,215,228,236,196,148,92,44,0,7,28,47,52,44,44,39,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,15,15,20,20,20,20,23,28,36,31,20,15,12,20,12,20,7,0,0,20,44,60,60,63,76,84,84,76,95,116,132,164,172,132,63,47,116,196,204,116,108,180,204,156,135,132,167,172,204,228,223,183,148,103,60,15,0,0,12,31,44,44,36,36,28,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,15,15,20,20,12,12,0,0,0,0,0,12,0,0,0,0,0,28,44,52,55,60,60,63,60,60,76,84,100,116,148,140,100,44,28,76,156,220,164,63,92,196,180,140,103,108,140,140,156,196,228,212,164,132,100,68,28,0,0,0,0,15,31,36,31,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,47,52,52,52,44,44,52,55,63,68,68,84,108,127,116,76,28,7,36,108,191,212,119,28,100,196,156,124,84,108,100,127,124,148,196,231,188,132,100,92,68,36,12,0,0,0,0,0,15,28,20,15,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,44,44,47,44,28,28,39,47,52,55,52,52,76,100,108,100,60,20,0,12,60,148,220,175,76,15,108,196,140,92,79,92,71,108,108,116,135,188,199,132,79,68,68,60,44,20,0,0,0,0,0,0,0,12,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,39,44,44,36,15,15,31,44,44,44,36,28,52,68,92,92,84,44,12,0,0,28,92,172,212,127,31,20,116,180,108,60,76,68,63,76,100,100,103,124,164,156,100,60,44,47,52,44,20,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,36,36,36,36,20,0,12,28,36,36,39,28,20,20,52,63,79,76,68,28,7,0,0,7,52,119,183,164,84,0,31,116,180,84,28,63,55,55,60,79,87,100,87,108,140,132,84,44,20,28,36,31,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,28,31,36,28,12,0,7,20,31,36,36,20,12,0,20,39,60,68,63,47,23,0,0,0,0,20,76,140,172,119,44,0,44,119,172,71,20,52,52,47,52,60,76,92,87,71,108,132,124,76,36,0,7,20,28,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,28,28,28,15,0,0,0,15,28,28,31,20,0,0,0,20,36,47,55,52,36,15,0,0,0,0,0,47,108,148,143,84,12,0,52,116,164,60,7,28,52,47,28,60,60,68,100,76,60,108,124,116,60,20,0,0,12,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,15,23,20,7,0,0,0,12,20,23,23,15,0,0,0,0,20,36,47,36,28,15,12,0,0,0,0,0,28,76,116,143,116,52,0,0,60,100,140,60,0,0,44,44,15,52,55,44,79,92,55,55,108,116,100,52,12,0,0,0,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,0,0,0,0,0,7,12,15,20,15,0,0,0,0,0,20,36,44,36,20,0,0,0,0,0,0,0,7,52,92,108,124,84,15,0,0,63,76,100,55,0,0,44,44,23,28,52,44,44,92,76,39,60,108,108,92,47,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,12,12,12,0,0,0,0,0,0,20,36,31,20,12,12,0,0,0,0,0,0,0,36,68,84,103,100,60,0,0,0,60,60,68,52,0,0,28,39,36,0,44,44,28,60,92,60,28,63,103,100,84,44,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,7,20,31,23,7,0,0,0,0,0,0,0,0,0,15,52,76,68,100,84,23,0,0,0,60,60,52,47,0,0,12,36,36,0,28,44,36,20,76,87,39,28,60,92,84,68,36,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,15,0,0,0,0,0,0,0,0,0,0,0,36,60,52,68,87,63,0,0,0,7,60,60,44,47,0,0,0,31,31,7,0,39,39,12,39,84,71,20,23,60,84,68,52,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,12,12,0,0,0,0,0,0,0,0,0,0,0,20,52,47,28,76,79,36,0,0,0,20,60,60,44,44,0,0,0,28,28,20,0,23,36,28,0,52,76,47,7,28,60,68,52,44,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,39,52,23,36,76,68,0,0,0,0,28,55,60,36,39,0,0,0,15,20,20,0,7,36,36,7,15,60,68,31,0,23,52,55,47,44,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,47,36,7,63,76,44,0,0,0,0,39,52,52,28,36,0,0,0,0,20,20,0,0,20,28,20,0,28,60,52,15,0,20,44,52,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,44,44,15,28,76,68,12,0,0,0,0,44,52,44,28,36,0,0,0,0,12,12,0,0,0,28,28,0,0,28,52,36,0,0,20,44,39,36,31,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,44,28,0,55,76,47,0,0,0,0,0,47,47,31,28,36,0,0,0,0,12,12,12,0,0,15,20,12,0,0,36,44,20,0,0,20,39,36,28,31,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,36,7,20,68,68,20,0,0,0,0,0,44,44,20,23,28,0,0,0,0,0,0,0,0,0,0,20,20,0,0,12,39,39,12,0,0,20,36,28,28,31,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,36,20,0,44,68,52,0,0,0,0,0,0,44,44,7,20,23,0,0,0,0,0,0,0,0,0,0,12,20,12,0,0,20,44,28,0,0,0,20,36,28,23,28,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,36,28,0,12,68,68,28,0,0,0,0,0,0,44,44,0,15,20,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,28,36,20,0,0,0,20,23,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,12,0,36,68,60,0,0,0,0,0,0,0,39,39,0,15,20,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,12,31,31,12,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,20,0,0,60,68,31,0,0,0,0,0,0,15,36,36,0,12,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,31,20,0,0,0,0,7,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,0,0,28,63,60,0,0,0,0,0,0,0,28,36,36,0,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,12,0,0,0,7,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,7,0,0,44,60,36,0,0,0,0,0,0,0,28,28,28,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,28,7,0,0,0,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,0,0,12,47,47,12,0,0,0,0,0,0,0,28,28,20,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,31,44,28,0,0,0,0,0,0,0,0,31,31,20,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,7,36,36,7,0,0,0,0,0,0,0,0,28,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,31,23,0,0,0,0,0,0,0,0,0,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,7,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,20,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,7,0,0,0,0,0,0,0,0,0,7,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,7,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};\n    const uint8_t SHINE_TEXTURE_4[16384] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,15,12,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,12,0,0,0,0,7,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,0,12,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,0,20,23,12,0,0,0,12,23,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,15,0,31,31,7,0,0,0,23,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,7,36,36,0,0,0,12,28,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,31,20,15,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,12,23,36,36,0,0,0,28,31,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,36,28,23,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,12,36,36,28,0,0,7,36,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,36,28,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,23,0,39,39,12,0,0,23,36,28,0,0,0,0,0,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,39,36,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,12,44,44,0,0,0,36,36,12,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,44,39,31,28,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,12,36,36,28,44,44,0,0,20,44,36,0,0,0,0,7,12,12,0,0,0,7,12,12,0,0,0,0,0,0,0,0,0,0,20,36,31,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,44,44,44,36,20,0,0,0,0,0,0,0,12,12,12,0,0,0,0,0,0,20,28,28,44,44,31,0,0,39,44,20,0,0,0,0,20,20,7,0,0,7,20,20,12,0,0,0,0,0,0,0,0,12,28,36,31,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,47,52,47,36,7,0,0,0,0,0,0,15,20,20,12,12,0,0,0,0,28,31,28,47,47,12,0,20,44,44,0,0,0,0,20,28,12,0,0,0,15,20,15,12,0,0,0,0,0,0,0,20,36,44,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,36,52,60,44,28,0,0,0,0,0,0,7,20,28,12,12,0,0,0,0,36,36,36,52,52,0,0,36,44,28,0,0,0,12,28,23,0,0,0,12,15,20,15,12,0,0,0,0,0,7,28,44,47,31,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,63,60,44,15,0,0,0,0,0,0,28,28,12,7,0,0,0,0,44,44,52,52,47,0,12,52,52,12,0,0,7,28,36,12,0,0,20,20,12,20,15,0,0,0,0,0,15,36,60,52,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,39,60,71,60,36,0,0,0,0,0,0,31,31,28,15,0,0,0,0,44,44,55,52,36,0,36,52,36,0,0,0,28,36,20,0,0,28,44,31,23,15,0,0,0,0,0,23,52,63,55,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,52,68,76,52,23,0,0,0,0,0,36,36,60,28,12,0,0,0,47,52,55,55,20,0,52,52,20,0,0,20,39,36,7,0,28,44,44,28,20,0,0,0,0,12,36,63,68,52,23,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,39,68,79,76,47,12,0,0,0,0,28,36,76,36,28,0,0,20,52,68,60,60,0,28,55,47,0,0,12,36,39,20,0,28,47,44,36,23,12,0,0,0,20,52,76,68,44,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,60,76,87,68,36,0,0,0,0,12,44,76,36,36,0,0,52,68,92,60,55,0,52,60,28,0,0,36,52,28,12,28,52,52,44,28,12,0,0,7,36,68,84,68,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,44,68,92,95,60,20,0,0,0,0,44,71,47,39,0,0,68,71,100,60,44,28,60,55,0,0,28,52,52,23,31,52,60,52,28,12,0,0,20,52,84,87,60,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,60,84,100,92,52,12,0,0,0,44,63,68,44,0,0,68,76,100,60,23,52,60,36,0,20,52,60,39,39,60,68,60,36,12,0,0,31,76,100,84,52,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,36,76,100,116,87,44,12,0,0,44,55,92,44,0,0,68,84,92,68,28,63,63,12,7,44,76,52,44,68,76,68,36,12,0,12,55,100,111,79,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,52,92,124,124,92,44,7,0,28,52,100,52,7,28,84,124,79,63,47,68,52,0,36,76,76,68,76,87,76,36,12,0,28,79,124,111,76,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,15,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,23,68,111,140,124,76,28,0,7,52,108,60,20,60,108,156,71,63,68,68,23,23,71,87,84,84,92,84,44,15,12,52,100,127,108,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,20,23,20,12,0,0,12,7,0,0,0,0,0,0,0,0,31,95,140,156,127,60,12,0,60,116,76,36,71,111,156,71,68,71,60,20,60,95,100,92,108,92,44,20,28,76,124,132,92,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,36,31,28,20,12,15,12,0,0,0,0,0,0,12,52,127,175,172,116,39,0,52,116,100,52,100,140,143,84,76,76,44,47,100,119,108,124,103,52,23,44,100,140,124,76,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,20,15,0,0,0,12,20,31,36,39,44,31,28,28,23,12,0,0,0,0,0,20,84,164,207,172,87,20,44,108,124,63,132,180,135,108,76,79,52,100,132,132,135,111,60,36,68,119,140,108,52,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,20,36,28,31,28,12,7,7,20,47,68,60,60,44,36,36,23,7,0,0,0,0,36,124,207,220,148,60,28,100,135,84,148,212,140,132,84,92,108,148,164,159,124,68,52,87,132,127,84,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,28,44,63,68,55,36,12,20,47,68,79,76,76,60,47,39,20,0,0,0,0,68,164,228,212,116,36,92,143,108,164,228,164,135,111,124,172,191,188,148,87,76,108,132,108,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,15,20,36,60,68,71,76,76,63,47,44,60,84,92,100,92,76,60,36,15,0,0,20,103,199,244,175,76,87,148,140,172,231,191,140,151,183,220,220,175,124,103,124,127,92,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,20,20,20,15,12,12,15,12,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,20,20,28,36,60,84,84,84,84,84,79,76,71,76,92,108,124,124,92,63,36,12,0,44,140,223,223,132,95,140,164,188,231,199,164,188,236,244,204,151,127,132,116,68,20,0,0,0,0,0,0,0,0,0,0,0,12,28,36,36,36,31,28,28,39,52,52,44,31,31,28,20,20,15,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,15,20,28,31,44,47,63,103,124,124,108,92,84,92,100,108,116,132,148,140,100,63,28,12,68,164,228,188,124,143,191,212,239,212,204,223,244,220,180,151,132,95,44,0,0,0,0,0,0,0,0,0,20,36,44,44,44,44,52,63,84,92,92,84,79,68,60,47,36,31,23,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,44,52,76,76,87,116,143,148,132,108,108,124,148,148,156,164,148,108,60,36,84,180,220,159,164,204,236,252,236,236,244,228,196,164,119,71,20,0,0,0,0,0,0,20,39,52,52,55,68,84,100,116,124,116,95,87,84,79,79,79,63,47,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,52,71,79,79,92,119,151,164,156,148,164,183,183,188,188,156,108,76,116,196,196,196,212,252,252,252,252,247,220,172,108,52,12,0,0,0,28,44,68,76,92,100,116,135,140,140,119,100,92,92,92,84,79,68,47,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,60,79,84,100,124,164,188,196,204,212,228,228,204,148,124,156,196,228,228,252,252,252,252,228,180,100,39,12,28,52,76,100,124,143,159,164,156,143,124,108,92,92,87,79,68,44,28,12,0,0,0,0,0,12,20,15,7,0,0,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,7,0,12,23,31,36,47,60,76,111,143,164,183,191,204,220,236,252,231,191,180,207,239,247,252,252,244,212,164,116,87,84,108,132,148,156,164,167,164,148,132,124,116,111,100,87,71,60,52,52,60,68,76,76,52,39,47,60,52,39,20,12,0,15,31,36,28,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,7,0,12,23,31,36,44,52,52,76,100,116,143,172,204,228,239,252,252,247,228,228,244,252,252,252,236,204,164,148,159,183,207,223,228,207,196,183,172,164,148,140,132,135,140,148,151,148,148,140,148,135,119,108,76,60,68,103,108,76,44,36,20,28,44,39,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,36,44,47,63,84,92,100,100,116,140,164,196,220,239,252,252,252,252,252,252,236,220,215,236,247,252,252,244,228,207,199,196,204,204,204,204,204,207,204,199,196,191,175,156,156,135,108,84,60,44,44,71,76,44,20,20,20,20,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,31,44,52,63,76,84,92,92,92,108,127,143,156,172,180,196,220,244,252,252,252,252,252,252,252,252,252,252,252,239,236,236,236,228,212,207,204,204,191,172,156,140,127,124,108,92,84,76,68,52,36,28,23,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,39,52,60,71,84,87,92,92,92,92,92,92,92,95,108,132,148,167,188,191,188,172,164,180,204,228,244,252,252,252,252,252,252,252,252,252,252,252,236,215,196,172,156,140,143,148,148,132,116,92,84,79,76,76,71,76,76,63,63,60,52,44,36,44,36,28,28,15,0,0,7,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,12,44,60,52,36,55,84,92,92,92,92,92,92,92,92,92,92,92,103,124,140,148,143,135,124,116,108,108,103,108,119,148,175,204,228,247,252,252,252,252,247,247,252,252,252,252,252,228,196,164,140,116,100,87,76,60,44,44,52,52,52,60,60,60,60,52,44,44,44,31,23,20,36,36,28,28,15,0,0,12,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,28,28,20,28,60,79,60,39,55,84,92,92,87,84,76,68,68,71,84,92,87,79,76,76,76,76,76,76,68,52,52,68,100,132,172,196,215,236,252,244,236,236,252,228,228,231,252,252,252,252,244,220,188,148,116,92,76,55,52,44,36,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,20,12,0,0,12,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,28,28,28,20,23,47,60,44,28,23,28,20,12,20,36,52,60,68,68,68,68,68,71,71,68,52,31,12,0,20,60,103,132,159,172,172,172,204,236,252,212,204,212,236,220,191,196,236,252,252,247,231,207,191,167,127,100,87,84,71,52,28,20,15,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,0,0,12,7,0,0,0,0,0,12,28,36,36,44,44,52,60,60,68,68,63,52,31,12,0,0,0,0,28,60,92,124,148,156,148,124,132,167,212,244,244,172,167,199,220,204,172,148,188,244,247,236,228,220,196,164,148,132,92,60,44,44,44,39,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,20,20,23,28,36,36,36,44,44,52,44,28,12,0,0,0,0,0,0,0,28,60,84,108,124,132,124,100,84,108,143,180,215,244,212,132,140,212,196,180,180,116,124,199,244,231,212,204,196,188,159,132,108,87,60,44,28,20,12,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,20,20,20,20,20,23,28,36,28,12,0,0,0,0,0,0,0,0,0,0,7,31,55,76,100,108,100,92,84,68,63,95,140,164,175,212,236,164,95,132,220,175,156,188,108,92,124,212,236,204,183,188,188,180,156,124,95,76,55,31,20,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,20,20,20,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,52,68,84,92,76,68,63,55,47,52,87,143,156,148,180,220,204,116,60,132,212,148,148,180,132,84,63,143,220,220,188,151,164,180,172,135,108,84,68,52,39,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,36,47,60,71,76,60,52,47,47,44,36,39,87,148,151,132,143,183,212,156,63,31,124,180,103,127,156,140,84,52,63,164,220,204,143,108,116,156,167,148,108,76,52,39,36,28,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,44,52,60,60,39,28,31,36,36,36,20,31,92,156,148,116,119,156,180,172,108,23,28,127,156,60,95,140,127,92,68,20,79,172,207,164,111,71,76,124,156,156,124,76,36,23,28,28,20,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,39,44,44,31,20,15,12,20,23,28,20,12,31,95,156,140,95,100,140,151,172,140,63,0,28,116,140,44,68,132,108,100,84,31,20,100,180,196,140,92,60,55,92,140,156,140,103,52,20,12,20,20,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,31,36,36,36,20,0,0,0,7,7,15,20,12,0,36,100,148,135,76,84,124,132,148,156,100,20,0,31,100,127,31,52,119,108,100,79,60,0,31,116,183,180,124,84,52,39,68,108,140,143,116,76,28,0,12,15,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,28,31,28,15,0,0,0,0,0,0,7,0,0,0,39,103,148,132,68,68,108,127,116,148,124,60,0,0,36,87,116,28,44,95,116,84,76,76,23,0,44,132,180,156,103,79,39,28,44,79,116,132,124,92,47,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,20,23,28,20,12,0,0,0,0,0,0,0,0,0,0,0,44,108,148,124,55,52,95,119,108,124,135,92,20,0,0,44,84,108,20,28,63,116,71,68,76,55,0,0,60,140,164,124,92,76,36,20,28,60,84,108,116,100,68,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,20,20,15,0,0,0,0,0,0,0,0,0,0,0,0,0,47,108,140,116,52,36,84,108,103,92,132,116,60,0,0,0,52,84,92,15,12,44,108,68,52,76,71,20,0,12,68,148,156,108,68,68,39,12,20,39,60,84,100,100,76,39,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,12,52,111,132,108,44,20,60,100,100,79,108,124,92,20,0,0,0,60,84,79,12,0,36,92,76,55,55,76,47,0,0,20,84,148,132,76,55,68,39,12,12,28,44,60,76,84,76,60,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,55,108,124,100,36,7,31,79,87,76,79,124,116,60,0,0,0,0,60,84,68,0,0,28,60,76,63,28,71,68,12,0,0,28,92,132,95,52,44,60,36,12,0,20,36,39,52,76,79,63,36,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,108,111,87,36,0,15,55,68,68,60,100,119,95,20,0,0,0,0,60,87,55,0,0,20,31,84,63,20,60,68,39,0,0,0,28,92,111,76,39,36,60,36,12,0,12,20,28,36,55,68,68,52,23,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,60,108,108,76,28,0,7,44,63,60,60,68,111,116,60,0,0,0,0,0,55,76,31,0,0,12,20,76,60,36,28,68,60,7,0,0,0,36,92,103,63,31,36,55,36,12,0,0,12,20,28,36,52,63,52,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,52,92,92,68,28,0,0,31,60,52,52,52,84,116,92,20,0,0,0,0,0,52,60,7,0,0,0,12,52,60,52,0,60,68,31,0,0,0,7,44,92,95,52,23,31,52,36,12,0,0,0,12,12,20,39,52,52,39,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,44,79,76,60,20,0,0,20,52,52,44,52,60,100,108,55,0,0,0,0,0,12,52,52,0,0,0,0,12,28,60,60,0,31,63,55,0,0,0,0,12,52,92,92,44,20,28,47,31,12,0,0,0,0,0,12,20,36,44,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,63,60,52,20,0,0,12,44,52,39,44,47,71,108,92,20,0,0,0,0,0,23,52,52,0,0,0,0,0,12,60,60,23,0,52,60,23,0,0,0,0,20,55,87,79,36,12,23,44,36,12,0,0,0,0,0,0,7,20,28,36,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,52,47,36,20,0,0,0,36,52,36,36,44,44,84,100,52,0,0,0,0,0,0,36,52,52,0,0,0,0,0,0,52,55,44,0,28,52,39,0,0,0,0,0,20,60,79,68,28,7,20,44,31,12,0,0,0,0,0,0,0,0,20,15,20,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,39,44,36,20,0,0,0,28,52,36,28,39,36,60,95,76,15,0,0,0,0,0,0,44,47,44,0,0,0,0,0,0,28,52,52,0,0,39,44,15,0,0,0,0,0,28,63,76,60,23,0,20,36,28,12,0,0,0,0,0,0,0,0,0,12,20,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,28,20,20,15,0,0,0,20,44,44,20,31,36,36,76,92,44,0,0,0,0,0,0,0,44,44,36,0,0,0,0,0,0,7,52,52,12,0,20,36,28,0,0,0,0,0,0,28,63,68,47,20,0,15,28,28,12,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,12,0,0,0,0,0,12,36,44,20,20,36,28,44,84,68,15,0,0,0,0,0,0,0,44,44,28,0,0,0,0,0,0,0,47,52,28,0,0,36,36,12,0,0,0,0,0,12,31,60,63,39,15,0,12,28,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,28,44,23,12,28,28,28,68,79,39,0,0,0,0,0,0,0,0,36,36,12,0,0,0,0,0,0,0,31,47,44,0,0,20,31,23,0,0,0,0,0,0,12,36,60,55,36,12,0,12,28,23,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,7,0,0,0,0,0,0,0,20,39,28,7,20,28,20,36,76,60,12,0,0,0,0,0,0,0,0,28,28,0,0,0,0,0,0,0,0,12,44,44,0,0,0,28,28,7,0,0,0,0,0,0,15,28,44,47,28,7,0,12,20,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,12,0,0,0,0,0,0,0,12,36,31,12,12,28,20,15,52,68,36,0,0,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,44,44,15,0,0,20,28,20,0,0,0,0,0,0,0,12,28,44,44,23,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,7,28,36,12,0,15,20,12,31,68,52,12,0,0,0,0,0,0,0,0,0,15,15,0,0,0,0,0,0,0,0,0,36,44,36,0,0,0,23,23,0,0,0,0,0,0,0,0,20,31,36,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,20,0,0,12,0,12,52,60,31,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,20,44,44,0,0,0,15,20,12,0,0,0,0,0,0,0,0,12,28,28,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,20,0,0,12,12,0,28,60,44,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,39,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,12,23,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,15,0,0,12,12,0,12,44,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,36,20,0,0,0,12,15,7,0,0,0,0,0,0,0,0,7,12,20,20,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,12,0,0,7,0,0,23,47,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,36,31,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,7,15,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,0,0,0,0,0,0,7,31,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,36,36,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,15,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,15,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};\n    const uint8_t SHINE_TEXTURE_5[16384] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,7,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,15,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,15,0,0,0,0,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,12,0,0,0,0,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,7,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,31,0,0,0,0,12,20,20,0,0,0,0,0,0,0,0,0,0,12,7,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,36,0,0,0,0,20,20,20,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,20,20,0,0,0,0,23,23,7,0,0,0,0,0,0,0,0,7,15,12,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,12,0,0,0,0,0,0,0,36,36,0,0,0,0,0,0,0,0,0,20,20,0,0,0,0,0,12,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,15,12,7,0,0,0,0,0,0,7,36,36,0,0,0,0,0,0,0,0,12,20,12,0,0,0,0,12,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,28,28,0,0,0,23,36,36,0,12,12,0,0,0,0,0,20,20,0,0,0,0,12,28,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,12,0,0,0,0,7,12,7,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,44,44,0,0,0,36,36,28,0,12,12,0,0,0,0,15,28,20,0,0,0,0,28,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,20,12,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,12,23,15,15,0,39,39,0,0,0,39,39,20,12,12,12,0,0,0,0,28,28,7,0,0,0,20,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,15,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,7,20,44,28,28,0,44,44,0,0,0,44,44,0,12,12,0,0,0,0,20,28,20,0,0,0,15,36,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,12,28,44,36,12,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,12,28,31,31,0,44,44,0,0,12,44,47,0,12,12,0,0,0,7,31,36,7,0,0,12,36,36,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,47,31,12,0,0,12,28,20,0,0,0,0,0,0,0,0,0,15,20,36,36,0,52,52,0,0,31,52,52,20,20,15,0,0,0,23,36,23,0,0,0,28,44,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,52,52,28,0,0,0,23,28,12,0,0,0,0,0,0,0,0,23,28,39,28,0,52,52,0,0,44,60,47,28,23,0,0,0,12,36,36,12,0,0,23,44,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,60,52,20,0,0,12,28,23,0,0,0,0,0,0,0,0,23,23,47,28,0,52,52,0,0,60,76,55,31,31,0,0,0,28,44,28,0,0,20,44,39,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,20,52,60,52,20,0,0,28,36,15,0,0,0,0,0,0,0,23,28,68,39,0,52,52,0,0,76,84,63,36,31,0,0,12,44,44,12,0,12,39,52,36,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,7,0,0,0,0,0,0,0,0,7,23,60,68,44,12,0,15,36,31,0,0,0,0,0,0,0,20,28,76,44,12,55,55,0,20,92,92,60,36,20,0,0,36,44,28,0,0,36,52,44,31,28,12,0,0,0,0,0,0,0,0,0,0,0,0,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,0,0,0,0,0,0,15,20,15,31,68,71,36,7,0,28,36,20,0,0,0,0,0,0,12,36,84,44,23,60,60,0,44,92,92,52,39,0,0,15,52,47,12,0,28,60,60,47,36,12,12,20,12,0,0,0,0,0,0,0,0,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,0,0,0,0,0,12,23,28,20,0,0,0,0,15,31,23,23,44,79,76,28,0,15,44,39,7,0,0,0,0,0,0,39,92,47,36,55,52,0,76,108,100,44,39,0,0,36,52,31,0,20,52,71,63,47,20,15,31,31,12,0,0,0,0,0,0,12,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,7,0,0,0,12,31,44,31,12,0,0,0,20,39,28,28,60,87,68,23,0,31,44,28,0,0,0,0,0,0,44,92,55,44,55,52,20,108,119,100,44,28,0,20,52,52,12,7,44,76,79,60,36,20,36,44,20,0,0,0,0,0,7,20,28,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,20,15,0,0,0,12,36,55,44,20,0,0,0,28,44,31,36,76,95,60,15,12,44,44,12,0,0,0,0,0,44,92,71,52,60,52,36,124,132,95,44,12,0,44,60,36,0,36,76,92,76,39,28,44,47,20,0,0,0,0,0,15,28,36,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,23,23,12,0,0,12,36,60,60,31,0,0,0,28,44,36,52,92,100,47,7,36,52,36,0,0,0,0,0,44,87,87,63,63,52,60,135,148,76,47,0,20,60,55,12,28,76,108,100,60,39,52,63,31,0,0,0,0,7,23,36,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,28,28,12,0,0,31,60,68,44,12,0,7,28,52,52,68,108,95,36,20,52,55,36,12,0,0,0,44,84,103,71,63,47,79,140,148,60,39,0,47,60,36,15,60,111,119,84,60,63,84,47,12,0,0,0,15,36,44,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,31,36,23,12,0,23,52,71,52,20,0,12,39,68,68,87,116,92,28,36,55,63,28,12,0,0,36,76,108,76,60,52,100,140,140,55,20,23,68,60,20,52,108,132,108,84,84,92,60,20,0,0,0,28,44,44,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,36,20,0,15,47,76,60,28,0,12,47,76,84,111,132,87,31,52,71,52,28,0,0,20,76,116,84,68,63,116,156,119,55,7,52,68,47,44,108,143,132,100,92,92,60,20,0,0,20,36,52,44,20,0,0,0,0,0,0,0,0,0,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,44,36,20,12,44,71,71,44,12,15,55,92,100,135,132,68,44,63,84,47,28,0,7,84,132,108,71,84,127,172,100,52,28,68,68,60,111,164,159,124,100,100,52,12,0,0,28,52,52,36,12,0,0,0,0,0,0,0,12,20,12,12,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,44,47,36,28,36,68,76,52,20,20,63,100,119,148,124,60,60,84,79,44,12,0,76,140,124,68,100,132,180,84,36,52,68,68,100,172,188,156,124,116,71,20,0,15,44,60,52,28,0,0,0,0,0,12,20,28,36,28,23,23,20,15,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,52,52,39,44,68,84,63,28,28,68,108,140,156,108,68,76,108,68,31,0,68,140,164,92,116,148,164,68,44,68,84,100,180,212,180,156,140,95,36,12,28,52,60,44,20,0,0,0,12,20,28,44,44,36,39,44,36,23,20,28,20,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,55,63,60,60,68,92,76,44,36,71,119,156,148,100,79,100,108,60,12,60,140,199,116,132,172,148,68,60,84,108,164,223,212,180,156,108,44,23,44,63,60,36,12,0,0,15,28,44,55,52,47,52,55,44,36,44,44,28,20,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,63,76,76,92,95,87,52,52,76,132,164,148,103,100,140,108,47,52,140,228,143,148,196,132,79,76,116,156,223,244,220,172,116,52,39,60,68,52,28,0,7,20,39,60,71,68,68,68,63,52,55,60,52,36,20,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,60,84,100,108,111,103,68,60,84,148,180,140,111,135,148,84,52,140,236,164,167,196,124,92,108,151,207,252,244,204,124,68,60,68,68,44,15,7,23,52,71,84,84,84,84,76,71,76,68,52,36,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,44,79,103,124,132,124,87,79,108,180,196,151,140,175,127,68,127,228,180,183,196,140,116,156,196,244,247,212,143,92,79,84,68,36,20,36,68,84,100,103,108,100,95,92,84,71,52,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,63,100,140,159,148,111,95,135,196,196,164,183,164,92,119,220,196,191,204,167,164,196,231,247,212,156,108,100,92,60,39,44,84,108,124,132,132,124,124,116,100,76,47,36,20,0,0,0,0,0,0,0,0,12,15,20,20,20,15,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,39,92,132,172,175,148,124,164,204,196,188,196,127,127,204,228,220,228,204,212,223,247,212,164,124,103,84,68,68,100,132,156,167,180,167,159,140,116,84,60,36,7,0,0,0,0,15,28,36,36,39,44,47,39,31,28,20,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,12,20,23,28,44,76,116,164,196,180,159,183,204,212,212,159,156,191,244,239,244,236,239,239,220,180,140,108,95,92,111,151,188,204,212,188,172,143,119,87,60,28,7,0,20,36,60,68,79,84,76,60,52,52,47,47,28,23,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,15,12,20,12,12,15,23,36,47,68,92,119,156,196,199,188,204,220,236,204,183,196,252,252,252,252,247,228,191,148,124,124,132,164,207,236,223,196,164,140,108,71,52,36,44,60,79,92,100,100,100,103,100,95,84,60,36,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,15,12,20,23,36,36,44,52,55,60,76,100,127,164,191,204,212,228,244,236,220,220,252,252,252,252,244,212,175,156,159,172,212,231,215,180,148,124,108,92,79,84,92,116,124,132,140,148,140,119,108,92,60,36,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,23,36,36,44,44,52,76,108,132,140,156,180,212,223,236,247,252,244,244,252,252,252,252,244,220,196,196,212,212,196,180,164,148,132,124,127,143,164,175,180,183,175,159,135,116,84,39,23,28,20,7,0,0,0,0,0,0,0,12,12,0,0,0,0,0,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,44,47,52,63,92,143,188,204,215,236,247,252,252,252,252,252,252,252,252,247,236,228,236,228,207,196,180,167,172,188,204,215,228,236,223,199,172,132,116,116,108,84,52,44,52,44,44,36,28,12,0,20,28,28,23,20,0,0,0,0,0,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,39,55,76,108,140,172,196,223,244,252,252,252,252,252,252,252,252,252,252,244,228,212,212,228,244,247,244,236,215,204,196,180,159,124,87,68,79,76,60,52,44,47,44,39,36,28,12,0,20,28,28,23,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,92,132,167,212,244,252,252,252,252,252,252,252,252,252,252,252,244,239,231,228,220,204,196,183,172,156,148,135,116,100,92,92,87,84,79,68,52,36,28,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,23,39,60,76,92,116,143,172,180,196,220,244,252,252,252,252,252,239,228,223,239,252,244,220,183,151,132,108,92,76,68,60,52,39,36,36,36,36,36,36,36,31,28,20,12,12,12,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,44,60,76,92,108,124,140,159,175,191,212,236,252,252,252,252,252,252,252,252,252,252,239,215,188,164,164,180,172,156,132,108,87,84,84,76,76,60,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,44,60,79,92,100,116,132,151,164,180,191,220,236,252,252,247,236,231,236,244,252,252,252,252,252,252,252,252,244,212,172,148,127,103,92,103,116,116,116,111,100,87,84,76,71,47,44,44,28,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,23,52,60,68,92,100,100,108,132,148,156,172,180,188,196,212,212,231,244,236,212,199,188,188,204,231,239,236,236,252,252,252,252,252,247,236,204,164,132,108,71,44,36,36,36,36,36,47,60,63,68,47,44,44,28,20,20,20,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,20,36,47,55,63,84,84,92,127,148,143,140,124,124,132,140,140,140,148,172,191,199,180,172,159,140,132,156,188,204,204,204,228,252,252,244,236,236,247,223,196,180,164,140,119,84,36,7,0,12,12,15,12,0,0,0,0,12,12,15,20,20,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,20,28,36,36,39,44,55,76,92,108,103,87,79,71,76,92,95,100,92,84,100,127,148,148,132,127,124,108,92,100,124,151,180,172,156,188,228,244,236,236,212,212,236,228,196,172,156,140,124,111,95,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,20,15,20,28,36,44,60,60,55,52,44,36,52,68,76,68,60,52,47,63,84,100,103,95,87,87,84,76,60,68,76,95,124,148,148,124,151,212,223,223,220,228,196,188,207,239,207,172,156,132,108,92,92,92,76,44,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,23,28,28,23,20,20,28,36,44,52,44,28,28,31,36,39,52,60,68,68,68,68,68,60,52,44,52,44,52,76,108,124,124,100,116,180,220,204,204,196,204,188,148,159,228,228,188,143,127,119,92,71,68,76,76,68,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,20,20,12,15,15,23,20,20,28,23,28,44,55,55,60,55,47,36,36,36,39,28,20,28,63,84,100,111,84,76,127,212,196,180,196,188,180,196,119,111,196,223,196,156,100,87,92,84,52,47,60,76,76,60,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,20,12,12,36,47,52,52,52,44,28,20,20,28,31,23,12,0,28,52,68,79,100,84,55,84,172,220,164,164,204,175,164,212,124,76,148,199,188,164,132,68,55,76,92,60,31,36,60,71,68,52,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,44,44,47,44,28,12,0,12,20,23,20,7,0,0,23,44,47,55,76,84,44,52,124,196,204,140,148,223,164,124,196,124,60,100,180,180,156,143,108,52,36,68,84,63,28,12,36,60,68,68,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,39,44,44,36,15,0,0,0,0,12,12,0,0,0,0,28,44,39,36,52,68,44,36,84,148,199,172,124,140,231,156,84,164,116,68,52,148,188,148,140,132,92,44,20,47,76,68,36,7,12,36,60,63,60,39,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,31,36,36,36,20,0,0,0,0,0,0,0,0,0,0,0,7,23,39,28,28,36,52,28,12,60,108,156,188,132,103,143,228,143,55,119,108,87,20,100,172,164,119,124,124,76,28,0,31,63,71,44,15,0,12,39,60,60,55,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,28,28,28,31,23,12,0,0,0,0,0,0,0,0,0,0,0,0,12,23,36,20,20,31,47,28,0,36,84,124,159,164,95,92,151,212,140,52,92,111,100,12,47,132,167,132,100,111,111,68,23,0,20,52,68,52,20,0,0,15,44,60,55,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,20,23,28,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,28,15,12,28,44,28,0,20,68,100,116,172,140,68,95,164,188,132,44,68,116,100,31,12,84,148,132,100,92,103,100,60,20,0,12,44,68,60,28,0,0,0,20,44,52,52,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,12,12,0,20,39,28,0,0,44,76,100,124,156,108,52,100,172,172,124,44,47,108,100,52,0,36,95,132,95,84,84,95,87,52,12,0,0,31,60,60,36,12,0,0,0,20,44,52,44,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,15,31,20,0,0,28,68,84,92,148,135,68,52,100,180,164,116,36,36,92,84,55,0,12,63,108,103,79,68,84,84,76,44,0,0,0,20,47,60,44,15,0,0,0,0,20,39,39,36,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,20,0,0,12,52,71,76,100,140,108,36,68,100,180,159,111,20,20,60,76,68,0,0,36,76,108,76,68,63,76,68,63,31,0,0,0,12,36,55,44,20,0,0,0,0,0,20,31,31,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,0,0,0,36,60,71,68,116,124,76,12,84,108,151,148,92,12,12,39,68,68,12,0,12,52,84,84,68,55,60,60,52,52,23,0,0,0,0,28,52,52,28,0,0,0,0,0,0,20,28,28,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,55,60,60,79,116,100,44,12,92,111,127,140,76,12,15,28,52,52,12,0,0,28,52,79,68,55,47,60,44,39,44,20,0,0,0,0,20,44,52,28,12,0,0,0,0,0,0,20,23,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,55,52,47,92,108,71,20,15,79,108,108,127,68,15,28,28,44,47,15,0,0,7,44,63,76,60,44,52,52,36,36,36,12,0,0,0,0,12,31,44,36,12,0,0,0,0,0,0,0,12,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,52,52,44,60,92,92,44,0,31,76,108,100,124,68,0,20,20,28,31,20,0,0,0,28,44,68,60,47,36,52,39,28,31,28,7,0,0,0,0,0,28,44,36,20,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,44,52,36,36,76,87,71,28,0,44,68,108,95,116,68,0,0,0,20,28,28,0,0,0,7,44,52,60,55,36,31,47,28,20,20,7,0,0,0,0,0,0,20,36,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,52,36,28,44,71,87,44,7,0,52,63,100,100,108,63,0,0,0,7,20,20,0,0,0,0,28,39,52,52,52,23,36,44,20,0,12,7,0,0,0,0,0,0,12,28,36,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,44,44,28,28,60,71,68,28,0,0,44,47,84,108,92,60,0,0,0,0,20,20,0,0,0,0,7,36,39,52,52,36,15,36,36,12,7,20,12,0,0,0,0,0,0,0,20,31,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,44,28,20,36,60,76,44,15,0,12,47,44,63,108,76,52,0,0,0,0,20,20,0,0,0,0,0,20,36,39,44,47,20,20,36,28,12,12,15,0,0,0,0,0,0,0,0,12,28,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,28,15,20,44,52,60,20,0,0,7,31,31,52,108,68,44,0,0,0,0,12,12,0,0,0,0,0,0,31,31,36,47,36,7,20,36,20,0,0,0,0,0,0,0,0,0,0,0,12,15,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,36,15,20,23,52,55,36,12,0,0,12,28,36,44,108,60,36,0,0,0,0,0,12,12,0,0,0,0,0,20,28,28,36,44,20,0,28,31,12,0,0,0,0,0,0,0,0,0,0,0,0,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,36,20,7,12,31,44,52,15,0,0,0,7,20,36,44,103,60,28,0,0,0,0,0,7,7,0,0,0,0,0,0,28,28,28,44,36,7,12,28,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,28,0,12,12,39,44,36,12,0,0,0,12,12,39,39,100,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,20,28,39,28,0,12,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,12,0,0,20,36,44,12,0,0,0,0,12,12,44,36,95,55,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,15,36,36,12,0,12,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,20,0,0,0,28,36,28,0,0,0,0,0,0,0,39,36,92,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,12,20,36,28,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,23,0,0,0,7,31,36,12,0,0,0,0,0,0,0,36,44,76,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,12,28,36,12,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,23,12,0,0,0,20,28,28,0,0,0,0,0,0,0,0,28,39,68,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,7,12,28,28,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,15,0,0,0,0,28,28,12,0,0,0,0,0,0,0,0,15,36,55,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,12,28,23,0,0,0,0,0,0,0,0,0,12,39,52,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,20,23,12,0,0,0,0,0,0,0,0,7,28,60,52,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,12,20,60,47,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,12,0,0,0,0,0,0,0,0,0,0,7,52,47,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,52,47,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,7,0,0,0,0,0,0,0,0,0,0,12,12,55,44,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,12,12,52,44,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,31,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};\n    const uint8_t SHINE_TEXTURE_6[16384] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,23,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,44,0,0,0,0,0,0,0,7,12,7,0,7,7,0,0,0,0,7,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,44,44,0,0,0,0,0,0,0,12,12,0,0,7,7,0,0,0,0,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,36,36,0,0,0,0,0,0,0,12,12,0,12,12,7,0,0,0,12,20,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,31,0,0,12,12,0,0,0,12,12,0,12,12,0,0,0,0,20,23,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,47,20,0,28,28,0,0,12,20,20,0,20,20,0,0,0,12,23,20,0,0,0,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,76,44,0,44,39,7,0,20,20,20,20,28,23,0,0,0,23,28,12,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,7,0,0,0,68,84,60,0,39,36,0,0,23,23,15,20,20,12,0,0,12,28,28,0,0,0,12,12,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,60,76,63,0,36,28,0,0,28,28,20,28,28,0,0,0,28,31,15,0,0,15,20,7,0,0,0,0,0,0,0,0,0,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,28,12,0,0,0,0,0,0,0,0,0,0,0,0,15,15,0,0,0,52,76,68,12,44,28,0,0,28,28,28,36,28,0,0,12,36,36,0,0,12,23,15,0,0,0,0,0,0,0,0,12,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,36,28,7,0,0,0,0,0,0,0,0,0,0,0,12,12,7,0,0,44,84,76,20,52,36,0,12,31,28,44,44,28,0,0,28,36,20,0,7,28,28,0,0,0,0,0,0,0,0,12,20,12,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,39,28,0,0,0,0,0,0,0,0,0,0,0,12,20,20,0,0,39,92,92,20,68,44,12,31,44,44,47,47,12,0,12,36,36,0,0,23,31,15,0,0,0,0,0,0,0,20,28,12,0,0,0,0,7,12,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,44,28,0,0,0,0,0,0,0,0,0,0,0,28,28,0,0,36,95,95,28,79,60,20,44,47,55,52,52,0,0,31,44,28,0,20,36,28,0,0,0,0,0,0,0,20,31,15,0,0,0,0,7,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,31,44,23,0,0,0,0,0,0,0,0,0,0,31,31,12,0,28,100,100,44,84,60,20,60,60,63,52,44,0,12,44,44,12,12,36,36,12,0,0,0,0,0,12,28,36,20,0,0,0,0,20,23,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,39,44,20,0,0,0,0,0,0,0,0,0,28,36,28,0,15,100,100,60,87,60,23,60,63,60,52,23,0,36,47,36,0,28,39,20,0,0,0,0,0,12,31,39,20,0,0,0,12,20,23,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,44,20,0,0,0,0,0,0,0,0,12,36,36,0,7,100,100,68,84,52,36,68,79,60,55,0,12,47,47,12,20,44,36,0,0,0,0,0,12,36,44,23,0,0,0,20,36,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,0,0,0,0,0,0,0,0,0,23,52,44,20,0,0,0,0,0,0,0,0,39,39,12,0,95,100,84,84,52,52,68,100,60,55,0,36,52,36,12,39,44,20,0,0,0,0,12,36,44,23,0,0,12,28,39,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,7,0,0,0,0,0,0,0,0,28,60,44,15,0,0,0,0,0,0,0,36,44,28,0,87,100,95,95,60,68,76,111,71,44,12,52,55,20,31,52,28,0,0,0,0,15,36,44,20,0,0,20,36,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,12,0,0,0,0,0,0,0,0,36,68,44,20,0,0,0,0,0,0,23,44,44,0,79,100,111,111,68,68,92,116,84,36,36,60,44,28,52,44,12,0,0,0,20,44,44,20,0,7,28,44,52,36,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,28,12,0,0,0,0,0,0,12,44,68,55,28,7,0,0,0,0,7,52,52,0,68,100,124,132,100,76,119,124,92,28,55,60,36,47,55,23,0,0,0,28,47,52,28,0,15,36,60,52,39,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,20,31,36,20,7,0,0,0,0,0,20,52,79,63,28,0,0,0,0,0,52,55,28,60,100,132,124,108,84,143,124,87,52,60,52,44,60,39,0,0,0,28,52,52,28,0,28,52,68,60,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,20,12,0,0,0,0,0,12,28,36,36,15,0,0,0,0,0,23,68,87,68,23,0,0,0,0,47,63,52,47,100,143,124,124,108,188,135,84,63,68,52,60,55,20,12,12,28,55,60,28,12,36,68,76,63,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,20,23,23,15,0,0,0,0,7,28,44,44,28,7,0,0,0,0,31,76,92,68,20,0,0,0,36,76,71,44,100,151,124,135,135,204,132,84,68,71,60,63,31,12,28,52,68,60,31,23,52,84,84,60,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,28,31,20,7,0,0,0,28,52,55,36,20,7,0,0,0,39,92,100,60,12,0,0,15,84,87,60,100,156,124,148,175,212,127,84,71,76,71,52,28,36,68,79,68,36,36,68,92,84,55,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,31,36,36,28,12,0,0,28,52,68,55,31,7,0,12,20,52,108,108,52,7,0,0,79,100,84,108,156,124,164,199,188,132,79,92,76,76,47,52,76,84,63,52,52,92,108,84,44,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,39,39,31,20,12,23,52,76,76,44,28,20,28,31,68,124,111,47,0,0,60,100,108,116,159,140,180,220,172,127,92,100,87,76,60,92,95,71,60,76,116,116,76,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,39,44,47,39,28,20,52,84,92,71,52,44,36,44,87,140,111,36,0,28,95,124,140,175,167,196,220,164,116,116,108,108,87,108,108,84,76,103,132,116,68,23,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,44,52,52,47,44,47,76,100,92,76,60,52,63,116,148,100,23,0,84,140,180,199,196,212,204,164,116,135,124,124,135,132,108,100,127,143,108,55,20,12,15,7,0,12,12,12,12,0,0,0,0,7,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,52,52,60,60,60,76,103,119,108,79,68,84,140,148,79,12,63,140,212,228,228,223,204,164,151,151,164,164,167,148,135,140,140,92,44,23,20,20,28,31,31,23,20,12,12,20,28,20,20,15,7,12,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,52,60,68,76,92,116,135,132,108,92,116,164,140,60,44,127,220,244,244,236,212,180,191,196,207,196,188,172,151,124,84,47,36,36,47,52,44,36,28,36,39,39,36,28,28,20,20,20,15,20,12,20,20,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,20,15,20,7,0,0,0,0,0,0,31,60,76,84,108,132,143,148,140,140,164,191,132,60,108,207,252,252,244,231,220,228,244,239,223,188,151,116,76,55,60,76,79,68,60,68,71,60,44,36,36,39,52,55,60,60,55,44,44,36,31,23,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,23,28,36,44,52,52,44,28,12,0,0,12,44,76,100,116,148,164,167,172,196,220,204,116,119,188,252,252,252,247,244,244,252,236,196,156,124,92,87,111,124,116,116,116,92,68,60,68,84,95,100,95,92,84,84,79,60,44,39,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,31,44,60,63,76,79,92,84,68,44,28,28,60,92,124,159,191,204,212,236,244,191,172,196,252,252,252,252,252,252,236,212,175,148,140,156,172,175,172,151,140,127,132,132,132,119,103,100,95,95,92,84,76,55,31,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,12,0,12,20,20,12,0,0,0,0,0,12,28,44,68,76,92,92,95,95,95,92,87,87,108,124,148,188,228,247,252,236,220,223,252,252,252,252,252,247,231,204,188,196,207,220,228,228,212,188,172,148,124,108,100,100,95,84,68,47,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,28,28,20,0,0,12,28,44,44,28,31,44,52,44,44,36,36,44,44,47,47,47,52,52,68,84,100,103,103,116,116,116,127,148,164,183,204,231,247,252,244,244,252,252,252,252,252,247,236,231,236,244,244,231,212,180,143,119,108,103,92,68,52,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,15,20,15,0,0,0,12,36,44,39,47,68,76,79,84,79,92,124,140,135,132,140,143,140,132,124,119,119,132,164,175,196,212,212,196,191,207,231,247,252,252,252,252,252,252,252,252,252,252,236,220,188,164,140,116,100,84,68,47,28,20,15,15,15,15,15,20,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,0,0,0,0,20,31,36,36,36,39,39,44,44,63,92,116,124,132,151,164,164,164,156,156,151,148,151,164,204,231,252,252,252,244,244,247,252,252,252,252,252,252,252,252,252,252,228,191,156,124,92,71,60,60,60,52,47,44,44,36,36,28,23,28,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,23,20,44,76,87,71,76,100,119,132,156,172,180,183,199,220,236,244,247,247,252,252,252,252,252,252,252,252,252,236,212,164,124,84,60,52,47,44,36,28,28,20,15,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,12,0,20,47,60,39,44,60,84,108,132,148,164,180,199,204,196,191,207,236,252,252,252,252,252,252,252,252,252,252,236,196,156,108,76,60,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,12,0,12,20,31,44,60,79,100,124,148,167,180,172,164,148,148,164,204,228,244,244,252,252,252,247,228,223,236,252,252,239,220,183,148,108,76,60,52,47,39,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,52,71,92,108,140,172,191,204,191,167,135,108,92,92,116,164,220,220,220,236,252,244,244,247,220,188,180,212,236,228,215,204,204,188,164,135,100,71,52,44,44,36,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,36,60,68,84,108,140,180,204,204,188,156,132,100,68,44,47,68,108,164,212,199,180,196,244,252,228,228,252,231,175,124,132,167,191,188,188,188,188,175,151,116,103,103,92,68,44,36,36,23,20,20,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,28,60,100,132,164,175,172,156,143,116,92,60,28,7,20,47,76,108,156,204,196,148,151,207,252,252,196,199,244,236,196,119,71,76,116,140,143,140,148,148,148,143,132,100,68,60,68,71,60,36,20,20,20,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,52,84,108,124,116,116,116,108,84,55,23,0,0,0,31,60,76,108,148,196,204,140,108,164,236,247,236,164,172,212,231,196,156,79,36,36,76,108,124,111,100,108,103,87,92,108,103,76,52,47,44,44,36,23,15,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,44,52,71,84,87,92,87,76,60,36,12,0,0,0,0,20,44,60,71,92,143,204,212,148,76,108,188,231,228,220,148,148,172,220,196,172,124,60,12,15,47,76,100,103,84,68,84,87,76,68,76,92,84,60,44,39,36,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,23,36,55,68,71,76,68,55,39,23,0,0,0,0,0,0,12,28,52,55,60,79,140,212,220,148,60,68,127,188,212,204,204,148,119,148,196,191,172,148,100,52,7,0,28,60,76,84,84,60,52,60,68,68,60,60,68,68,60,44,36,36,31,28,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,20,23,39,36,44,60,47,36,28,15,0,0,0,0,0,0,0,0,20,39,47,47,44,63,132,204,223,156,63,36,95,148,156,196,183,188,156,95,116,180,172,164,159,116,87,44,0,0,7,36,60,68,76,63,44,36,44,52,60,55,52,52,52,47,39,31,28,28,23,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,20,23,28,28,36,20,20,20,12,0,0,0,0,0,0,0,0,0,12,28,39,44,31,36,60,124,188,212,164,68,15,60,116,140,124,188,175,172,167,87,79,148,156,156,148,132,95,76,36,0,0,0,20,44,60,60,55,44,36,31,28,28,39,47,47,44,44,36,28,23,23,20,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,20,20,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,15,31,36,36,20,23,60,111,164,196,164,76,12,28,92,111,100,119,183,172,159,172,92,47,111,148,124,132,135,95,84,71,28,0,0,0,0,28,52,55,52,44,31,28,23,20,20,28,39,44,44,44,36,23,12,7,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,28,31,20,12,20,63,100,143,172,156,79,20,0,60,92,84,60,124,188,164,140,180,100,20,84,148,108,116,127,108,76,76,63,23,0,0,0,0,12,36,52,52,36,28,20,20,20,12,0,12,28,39,39,36,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,20,12,0,20,60,92,132,156,143,79,20,0,28,76,76,44,44,132,188,140,124,183,108,12,68,116,116,100,100,124,79,60,76,55,20,0,0,0,0,0,20,36,47,44,28,15,12,12,12,0,0,0,15,31,36,36,31,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,12,0,0,20,60,84,116,140,140,84,23,0,0,60,76,44,28,52,127,183,111,103,188,116,12,44,84,132,84,79,108,103,52,52,76,47,12,0,0,0,0,0,0,20,39,44,31,15,0,7,0,0,0,0,0,0,20,31,31,28,28,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,7,12,44,68,95,124,132,84,28,0,0,28,68,60,12,20,68,127,183,92,87,183,116,20,15,68,124,84,76,76,108,76,39,47,71,44,7,0,0,0,0,0,0,12,28,36,36,23,7,0,0,0,0,0,0,0,0,12,20,28,28,20,15,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,55,79,116,119,84,28,0,0,0,55,68,36,0,12,79,132,167,76,76,180,108,31,0,60,87,108,68,55,84,95,52,31,47,68,36,0,0,0,0,0,0,0,0,15,28,36,28,12,0,0,0,0,0,0,0,0,0,0,12,20,15,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,36,55,71,100,108,84,31,0,0,0,28,63,55,0,0,7,92,135,140,60,68,167,100,39,0,39,68,108,68,52,60,92,76,36,28,52,60,28,0,0,0,0,0,0,0,0,0,20,28,28,20,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,60,92,103,84,36,0,0,0,7,52,60,28,0,0,15,92,135,108,60,68,159,92,47,0,12,60,92,76,60,36,68,84,52,20,20,52,55,23,0,0,0,0,0,0,0,0,0,7,20,23,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,63,92,87,36,0,0,0,0,31,60,52,0,0,0,28,95,140,84,55,68,156,92,52,0,0,55,68,92,63,36,44,76,71,36,12,23,52,52,20,0,0,0,0,0,0,0,0,0,0,12,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,31,68,84,36,0,0,0,0,12,52,60,23,0,0,0,52,84,132,63,44,60,140,95,55,0,0,36,60,87,60,52,20,55,76,52,23,0,28,52,44,12,0,0,0,0,0,0,0,0,0,0,0,7,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,12,20,52,76,39,0,0,0,0,0,36,55,44,0,0,0,0,60,76,108,52,28,44,103,84,55,0,0,12,55,68,68,60,20,36,60,60,28,12,0,28,52,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,15,15,28,52,36,0,0,0,0,0,12,52,52,20,0,0,0,0,68,68,68,44,12,36,68,60,52,0,0,0,52,55,68,55,44,12,47,60,36,12,0,0,28,47,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,12,15,36,47,20,7,0,0,0,0,0,36,52,36,0,0,0,0,20,63,68,52,39,0,36,47,52,52,0,0,0,36,52,60,55,52,12,28,52,52,23,12,0,0,28,44,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,52,36,0,0,0,0,0,0,12,47,47,12,0,0,0,0,36,60,71,44,36,0,36,39,52,52,0,0,0,12,47,52,52,52,31,0,39,52,36,7,0,0,7,28,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,44,28,7,0,0,0,0,0,0,31,44,28,0,0,0,0,0,52,60,68,36,36,0,36,44,52,47,0,0,0,0,44,47,47,52,47,0,20,44,47,20,7,0,0,12,28,36,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,31,28,0,0,0,0,0,0,0,12,44,44,12,0,0,0,0,0,52,55,44,28,23,0,36,52,60,44,12,0,0,0,31,44,44,44,52,23,0,28,44,36,0,0,0,0,12,28,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,7,0,0,0,0,0,0,0,31,44,28,0,0,0,0,0,7,52,52,28,20,20,0,28,52,71,44,20,0,0,0,12,44,44,31,47,44,0,12,39,44,15,0,0,0,0,12,28,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,39,36,0,0,0,0,0,0,28,52,52,28,28,15,0,12,36,68,44,28,0,0,0,0,39,44,28,44,44,15,0,20,39,31,0,0,0,0,0,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,36,20,0,0,0,0,0,0,44,52,44,20,20,0,0,0,15,52,31,28,0,0,0,0,28,39,36,28,44,31,0,0,28,36,20,0,0,0,0,0,0,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,28,0,0,0,0,0,0,0,47,52,28,12,12,0,0,0,12,44,31,28,0,0,0,0,7,36,36,12,44,39,7,0,12,36,31,0,0,0,0,0,0,12,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,36,12,0,0,0,0,0,0,0,47,47,12,12,12,0,0,0,7,31,28,28,0,0,0,0,0,36,36,15,31,36,23,0,0,20,31,20,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,28,0,0,0,0,0,0,0,12,47,47,0,12,12,0,0,0,0,28,36,36,0,0,0,0,0,23,36,28,12,36,36,0,0,7,28,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,12,0,0,0,0,0,0,0,31,44,44,0,0,0,0,0,0,0,12,36,36,0,0,0,0,0,7,31,31,0,31,36,15,0,0,15,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,20,0,0,0,0,0,0,0,0,44,44,31,0,0,0,0,0,0,0,0,23,23,0,0,0,0,0,0,28,28,12,15,36,28,0,0,0,20,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,23,7,0,0,0,0,0,0,0,0,44,44,12,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,20,28,23,0,31,31,12,0,0,12,23,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,15,0,0,0,0,0,0,0,0,0,44,44,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,28,28,0,20,28,20,0,0,0,15,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,20,39,39,0,0,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,23,23,12,0,28,28,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,36,31,0,0,0,0,0,0,0,0,0,28,28,12,0,0,0,0,0,0,15,20,20,0,20,28,15,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,36,15,0,0,0,0,0,0,0,0,0,20,20,12,0,0,0,0,0,0,0,20,20,0,7,23,23,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,0,0,0,0,0,0,0,0,0,0,36,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,15,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,0,0,0,0,0,0,0,0,0,0,12,36,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,31,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,20,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};\n    const uint8_t SHINE_TEXTURE_7[16384] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,12,28,28,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,12,12,0,0,0,0,0,0,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,23,7,0,0,0,0,0,0,0,0,0,0,0,28,28,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,12,15,7,0,0,0,0,0,7,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,28,12,0,0,0,0,0,0,0,0,0,0,28,28,7,0,0,0,0,0,0,0,0,7,15,15,0,0,0,0,0,20,20,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,47,28,0,0,0,0,0,0,0,0,0,0,36,36,20,0,0,0,0,0,0,0,0,12,20,20,0,0,0,0,12,28,20,0,0,0,0,0,12,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,52,44,12,0,0,0,0,0,0,0,0,0,36,36,36,0,0,0,0,0,0,0,0,20,20,12,0,0,0,0,31,28,12,0,0,0,0,12,23,20,0,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,44,60,31,0,0,0,0,0,0,0,0,0,31,39,39,0,0,0,0,0,0,0,0,20,20,12,0,0,0,20,36,28,0,0,0,0,0,23,28,12,0,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,60,52,15,0,0,0,0,0,0,0,0,20,44,44,0,0,0,0,0,0,0,0,28,23,0,0,0,12,36,36,20,0,0,0,0,20,28,20,12,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,52,68,36,0,0,0,0,0,0,0,0,7,44,44,0,0,0,0,0,0,0,15,28,28,7,7,0,20,47,36,7,0,0,0,12,31,28,12,20,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,0,0,0,0,0,0,28,68,60,15,0,0,0,0,0,0,0,0,44,44,0,0,0,0,0,0,0,23,31,28,7,7,12,36,52,31,0,0,0,0,28,36,20,20,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,0,0,0,15,12,0,0,0,0,0,0,12,55,76,44,0,0,0,0,0,0,0,0,47,47,12,0,0,0,0,0,0,44,44,36,12,12,12,52,44,20,0,0,0,20,36,28,20,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,7,0,7,12,7,0,0,0,0,0,0,31,76,68,20,0,0,0,0,0,0,0,47,47,28,0,0,0,0,0,7,60,60,28,12,12,36,60,44,0,0,0,12,36,36,28,28,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,20,7,0,0,15,20,0,0,0,0,0,12,63,92,55,0,0,0,0,0,0,0,47,52,44,0,0,0,0,0,23,63,68,20,15,23,60,63,28,0,0,0,28,44,36,28,36,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,20,12,0,20,36,20,0,0,0,0,0,36,92,84,23,0,0,0,0,0,0,39,52,52,0,0,0,0,0,52,76,84,20,23,36,76,55,12,0,0,20,44,44,36,36,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,12,7,20,28,12,0,0,0,0,12,68,100,60,0,0,0,0,0,0,28,52,52,0,0,0,0,0,68,84,84,28,39,60,79,44,0,0,7,39,44,44,39,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,28,12,7,20,28,20,7,0,0,0,36,92,92,28,0,0,0,0,0,12,55,55,0,0,0,0,0,79,84,71,31,44,84,71,23,0,0,28,52,52,44,39,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,28,15,15,36,39,28,12,0,0,12,76,111,76,0,0,0,0,0,0,60,60,0,0,0,0,12,84,100,60,44,60,92,60,0,0,20,52,60,52,52,31,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,15,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,20,20,44,39,28,15,7,0,36,108,108,36,0,0,0,0,0,60,60,20,0,0,0,31,84,119,52,60,84,92,36,0,0,44,60,60,52,52,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,39,23,28,47,44,28,12,0,7,84,119,76,0,0,0,0,0,60,60,36,0,0,0,52,92,132,52,79,100,79,20,0,31,60,68,60,52,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,20,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,44,28,36,52,44,36,20,0,36,108,108,36,0,0,0,0,55,60,47,0,0,0,68,108,127,76,92,108,60,12,28,60,76,71,76,52,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,28,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,15,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,44,36,44,60,60,39,20,7,76,119,84,12,12,12,0,47,63,60,0,0,0,84,132,116,108,111,108,44,23,60,71,84,87,76,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,31,28,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,23,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,52,44,52,68,63,39,15,31,108,111,39,15,15,12,36,68,63,0,0,12,87,156,108,132,124,92,31,52,76,92,100,100,63,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,36,31,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,28,31,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,60,52,60,76,71,36,20,76,116,84,28,28,20,20,68,68,0,0,28,95,164,111,140,124,76,44,79,100,124,124,84,28,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,44,36,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,36,44,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,47,68,63,71,84,76,31,36,103,108,52,28,28,12,68,68,12,0,44,116,164,140,132,116,60,76,100,124,140,124,44,0,0,0,0,0,0,0,0,0,0,0,0,7,28,44,44,44,28,7,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,44,52,52,44,23,0,0,0,0,0,0,0,0,0,0,0,0,0,28,55,76,76,84,92,71,36,71,116,87,44,36,20,68,68,23,0,68,148,167,164,124,103,68,103,132,156,148,76,12,0,0,0,0,0,0,0,0,0,0,0,28,44,47,44,28,12,0,0,0,0,0,7,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,52,63,68,60,36,12,0,0,0,0,0,0,0,0,0,12,15,36,60,84,84,100,100,68,52,103,111,71,36,36,68,71,39,0,84,172,180,164,132,92,108,132,172,156,92,23,0,0,0,0,0,0,0,7,7,12,28,47,52,52,36,15,0,0,0,0,7,20,28,23,20,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,39,60,71,76,76,52,20,0,0,0,0,0,0,0,7,12,20,36,68,87,92,116,108,63,84,116,100,60,44,76,76,52,0,103,180,196,148,132,103,140,172,180,124,39,0,0,0,0,0,0,12,20,20,36,52,60,52,39,20,0,0,0,0,20,28,28,28,28,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,39,63,84,92,87,68,28,0,0,0,0,0,0,0,12,28,52,76,100,111,135,116,84,108,108,92,52,92,84,68,20,124,191,199,148,140,143,180,196,156,71,7,0,0,0,0,12,28,39,60,68,63,60,47,23,0,0,0,20,36,36,36,28,28,20,7,0,0,0,0,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,71,92,95,92,76,44,12,0,0,0,0,0,20,39,63,84,116,135,156,124,108,116,124,71,100,92,76,44,140,215,196,164,156,188,212,180,108,28,0,0,0,12,28,52,76,87,84,68,52,28,0,0,20,36,44,39,36,36,28,12,0,0,0,12,20,20,20,20,15,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,68,92,95,100,84,52,20,0,0,0,0,20,44,76,100,132,164,172,132,132,124,108,116,119,92,60,164,236,199,191,204,228,207,140,44,0,0,0,28,60,95,116,108,79,60,31,7,12,36,47,44,44,44,36,20,0,0,20,36,36,31,23,20,20,20,20,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,60,84,100,100,92,68,28,0,0,0,20,44,84,108,148,180,172,148,132,148,135,159,108,79,180,236,212,220,244,231,164,68,7,0,20,60,116,148,140,100,71,36,23,36,52,52,52,47,44,31,20,20,36,44,39,36,36,36,36,36,23,23,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,44,79,95,100,95,76,39,12,0,15,44,92,127,180,204,180,164,164,164,183,124,100,204,239,236,236,236,180,84,15,12,47,108,156,164,140,92,55,44,55,68,71,63,52,52,44,44,44,44,44,44,44,52,63,63,47,36,28,15,12,12,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,71,92,100,100,84,52,23,28,60,100,148,212,212,199,180,196,212,140,124,220,244,244,236,188,92,28,36,87,140,172,156,116,84,79,87,100,92,92,92,84,63,55,52,52,63,76,84,79,60,44,36,36,36,31,28,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,20,20,20,12,12,0,0,0,0,0,0,0,0,0,0,0,28,60,92,100,100,95,84,76,84,124,180,231,228,220,223,236,159,151,236,252,244,196,108,52,68,124,167,172,156,127,111,108,116,132,148,132,100,84,84,92,103,108,95,76,55,44,44,44,39,36,28,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,20,20,20,23,36,36,36,36,39,36,23,12,0,0,0,0,0,0,15,52,84,100,116,132,132,135,164,204,236,244,244,252,188,188,247,247,207,135,87,108,164,204,212,183,156,148,156,172,175,159,140,132,124,124,111,92,68,52,52,47,44,36,20,0,0,0,0,0,0,12,12,0,0,12,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,23,36,36,36,36,39,44,44,47,52,52,52,52,36,20,7,0,12,44,84,116,140,164,183,204,228,244,252,252,220,220,252,223,172,135,151,204,236,231,220,212,220,220,212,180,156,140,124,108,79,63,60,55,47,36,28,28,36,39,39,36,36,28,12,12,20,28,20,7,0,12,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,44,44,47,52,52,55,60,60,60,60,68,68,68,63,84,119,164,196,215,231,244,252,252,244,244,247,220,188,196,231,252,252,244,236,220,196,175,164,151,132,124,116,108,92,68,60,52,52,52,47,44,44,44,39,36,36,28,12,12,20,28,20,7,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,52,60,60,60,68,68,68,76,87,108,140,188,228,252,252,252,252,252,252,247,236,236,247,252,252,252,244,228,196,175,156,127,108,84,68,60,60,60,55,52,52,52,52,47,44,44,39,36,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,52,63,71,76,100,132,175,215,239,252,252,252,252,252,252,252,244,228,207,188,159,127,100,84,71,68,68,68,60,60,52,39,28,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,28,44,52,63,76,92,100,111,124,124,124,119,116,132,183,228,252,252,252,252,252,252,252,244,223,196,156,116,68,31,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,47,52,52,55,60,68,84,100,124,140,140,140,140,135,132,132,124,124,132,151,180,220,244,252,252,252,252,252,252,252,247,236,199,156,127,108,95,92,87,76,52,23,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,28,36,36,39,44,44,44,47,60,71,87,100,108,111,116,119,124,132,135,124,108,100,84,68,60,68,92,124,156,196,236,252,252,252,252,252,252,252,236,220,212,199,175,148,119,100,92,92,92,92,92,87,79,63,44,23,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,20,7,12,20,28,31,28,28,36,44,60,76,84,84,92,92,92,84,76,68,63,55,55,55,52,44,28,12,0,0,36,76,119,164,204,236,239,239,247,252,252,252,252,252,252,236,212,180,172,180,167,132,100,76,68,71,84,92,87,87,87,84,84,84,76,52,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,15,20,7,12,28,36,44,44,44,52,44,44,36,36,36,39,44,44,44,36,28,12,0,0,0,0,0,0,12,44,84,127,159,191,207,220,212,212,228,247,252,252,252,244,244,247,244,228,188,148,140,172,196,180,132,87,52,23,15,31,52,68,84,84,84,84,60,60,44,44,36,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,12,12,0,0,12,12,12,20,20,20,23,36,36,28,15,0,0,0,0,0,0,0,0,0,0,0,20,52,84,124,156,180,183,180,172,164,172,204,236,252,252,244,244,220,220,236,231,236,228,180,116,100,127,180,196,172,124,84,55,28,0,0,0,12,28,47,44,52,44,44,39,36,20,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,60,84,116,148,156,156,148,140,132,124,132,172,220,244,247,252,220,220,196,196,228,207,212,236,223,180,108,68,84,124,164,180,156,111,76,60,36,12,0,0,0,0,0,0,7,20,23,20,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,36,68,84,108,132,132,116,116,108,108,103,100,100,156,204,228,231,247,252,188,188,172,172,220,196,180,196,220,212,188,108,52,44,84,124,148,156,140,100,71,55,39,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,44,68,84,100,124,116,84,84,84,79,84,84,71,84,140,204,220,212,220,244,244,167,167,156,148,199,207,164,156,183,196,199,180,119,52,20,39,84,116,132,127,116,87,68,52,44,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,44,68,76,95,108,95,68,60,63,63,68,71,68,52,68,124,199,215,188,188,204,220,223,148,148,156,119,167,228,164,135,143,156,156,180,180,132,60,12,12,44,84,108,111,100,92,76,60,52,44,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,39,55,68,84,92,76,52,44,44,52,52,60,52,47,36,52,116,196,220,180,159,172,180,188,196,119,124,159,92,124,215,196,124,108,124,116,132,167,175,140,68,12,0,15,44,76,92,92,76,68,63,52,44,44,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,44,52,68,71,60,44,36,36,36,44,47,39,31,28,28,44,100,180,204,164,132,148,156,156,167,164,92,111,164,68,76,175,228,143,92,92,100,87,124,156,172,148,79,20,0,0,20,44,68,76,71,52,44,44,44,39,36,31,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,23,28,36,47,52,44,36,31,23,28,36,44,39,28,15,20,12,31,100,167,196,156,116,116,148,132,140,156,135,71,108,172,71,36,132,220,180,100,71,87,76,71,116,148,172,156,92,28,0,0,0,15,36,52,60,52,28,12,28,36,36,31,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,36,36,31,28,28,20,15,23,36,39,28,12,0,12,0,20,92,164,180,140,84,84,119,132,108,124,156,108,60,108,180,76,12,100,183,204,132,60,71,71,52,68,108,132,164,156,92,36,0,0,0,0,12,28,36,36,28,12,0,15,28,28,28,28,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,12,7,12,23,15,0,12,28,36,31,15,0,0,0,0,20,76,151,180,135,79,63,87,132,108,92,111,148,76,36,108,183,84,0,68,140,212,159,79,44,76,60,44,68,100,116,148,148,100,39,0,0,0,0,0,12,28,28,28,20,7,0,7,20,28,23,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,23,20,0,0,0,0,0,12,63,135,164,132,84,44,60,108,108,79,84,103,135,60,20,108,164,60,0,36,108,191,180,124,36,52,71,44,36,71,87,95,127,140,100,44,0,0,0,0,0,0,12,28,23,20,12,0,0,0,12,15,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,0,0,0,0,0,0,12,60,119,140,116,84,36,44,76,116,79,47,87,108,108,55,0,108,143,44,0,12,92,156,183,148,63,28,63,68,28,36,71,84,79,108,132,100,44,7,0,0,0,0,0,0,12,20,12,0,0,0,0,0,0,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,12,52,108,124,103,84,44,28,60,100,92,63,31,92,124,76,52,0,108,140,36,0,0,71,119,172,156,100,20,36,68,52,15,36,76,71,68,100,116,92,39,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,44,100,108,92,71,44,20,44,68,100,68,36,44,84,124,60,44,0,108,148,47,0,0,44,100,156,148,127,55,7,47,63,36,0,36,71,68,60,84,100,79,39,12,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,92,100,79,68,47,20,20,60,84,84,60,12,68,84,108,52,28,0,108,148,44,7,0,12,92,132,132,143,84,15,20,55,55,20,0,44,68,60,47,76,87,76,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,84,92,76,55,47,28,0,44,63,84,60,36,12,84,87,79,47,7,0,108,140,39,12,0,0,76,108,132,127,108,44,0,28,60,44,7,12,44,68,52,36,60,76,68,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,71,84,68,52,44,28,0,23,55,71,68,52,7,31,84,95,55,44,0,0,108,132,28,0,0,0,44,100,132,100,119,68,12,0,39,60,31,0,12,44,68,44,31,52,68,55,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,68,76,63,44,44,31,12,0,44,55,68,52,31,0,60,84,95,44,44,0,0,92,108,20,0,0,0,15,92,116,95,111,84,36,0,15,47,52,20,0,12,44,60,36,28,44,52,52,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,60,76,63,28,28,28,12,0,28,52,52,44,39,12,0,76,84,79,39,36,0,0,76,92,15,0,0,0,0,76,100,108,84,95,55,0,0,28,52,44,7,0,15,44,60,31,20,36,47,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,68,60,31,23,28,12,0,12,44,47,39,31,23,0,20,84,84,52,36,20,0,0,68,84,15,0,0,0,0,44,100,116,63,92,60,28,0,0,36,52,28,0,0,20,44,55,28,15,36,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,52,44,23,20,20,12,0,0,28,47,36,28,23,7,0,47,84,76,36,36,0,0,0,68,87,20,0,0,0,0,15,92,100,71,68,68,44,0,0,12,44,44,15,0,0,20,47,52,20,12,20,23,20,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,36,47,39,12,20,20,12,0,0,15,44,44,20,15,12,0,0,68,84,60,36,36,0,0,0,68,87,20,0,0,0,0,0,71,87,84,44,76,44,20,0,0,20,44,36,0,0,0,20,52,44,20,7,20,20,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,52,36,12,0,12,12,0,0,0,31,44,23,0,0,0,0,12,79,84,44,31,31,0,0,0,68,87,20,0,0,0,0,0,44,84,84,44,60,52,36,0,0,0,28,39,20,0,0,0,23,47,39,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,44,39,20,12,0,12,0,0,0,15,39,36,0,0,0,0,0,36,79,76,36,28,23,0,0,0,68,84,15,0,0,0,0,0,15,76,76,47,36,60,44,20,0,0,12,36,36,12,0,0,0,23,47,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,28,15,7,0,0,0,0,0,0,31,36,15,0,0,0,0,0,60,76,60,20,20,12,0,0,0,68,84,15,0,0,0,0,0,0,60,76,60,28,52,44,36,0,0,0,15,36,28,0,0,0,0,23,44,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,20,0,0,0,0,0,0,0,0,0,20,36,28,0,0,0,0,0,0,71,76,28,12,12,0,0,0,0,68,92,20,0,0,0,0,0,0,39,76,68,36,36,52,36,12,0,0,0,20,36,20,0,0,0,0,28,44,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,12,0,0,0,0,0,0,0,0,7,31,31,12,0,0,0,0,0,20,68,68,12,12,12,0,0,0,0,60,87,28,0,0,0,0,0,0,15,60,60,36,20,39,36,28,0,0,0,7,28,28,12,0,0,0,0,28,44,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,23,12,0,0,0,0,0,0,0,0,20,28,20,0,0,0,0,0,0,44,68,52,0,12,12,0,0,0,0,44,60,15,0,0,0,0,0,0,0,44,55,36,20,28,39,36,12,0,0,0,12,28,20,0,0,0,0,0,23,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,12,7,0,0,0,0,0,0,0,0,12,28,28,0,0,0,0,0,0,0,60,68,36,7,7,0,0,0,0,0,23,28,0,0,0,0,0,0,0,0,20,36,36,15,15,36,28,20,0,0,0,0,15,23,12,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,12,0,0,0,0,0,0,0,0,0,0,12,20,12,0,0,0,0,0,0,12,52,52,12,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,7,28,28,15,12,20,28,28,0,0,0,0,0,20,20,7,0,0,0,0,0,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,12,0,0,0,0,0,0,0,0,0,0,0,20,15,0,0,0,0,0,0,0,28,47,44,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,23,28,12,12,12,28,28,15,0,0,0,0,7,20,15,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,0,0,0,0,0,0,0,0,28,31,20,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,12,28,20,12,12,20,23,23,0,0,0,0,0,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,12,0,0,0,0,0,0,0,0,36,36,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,20,0,0,0,15,20,12,0,0,0,0,0,12,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,12,36,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,7,20,20,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,20,20,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,0,0,0,12,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,15,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};\n    const uint8_t SHINE_TEXTURE_8[16384] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,23,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,23,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,12,23,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,12,39,39,0,0,0,0,12,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,7,7,0,0,0,0,7,44,44,7,0,0,0,15,20,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,20,12,7,0,0,0,7,7,44,44,20,0,0,0,15,20,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,23,23,12,7,0,0,7,7,47,47,36,0,0,0,15,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,28,12,12,0,0,12,12,60,63,60,0,0,0,15,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,20,12,0,0,0,12,44,68,68,0,0,0,15,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,36,20,12,0,0,20,31,68,68,0,0,0,15,36,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,12,31,36,23,20,0,0,20,23,84,71,20,0,0,12,28,20,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,28,36,47,28,12,0,20,20,84,71,36,0,0,0,28,23,28,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,7,7,0,0,0,0,0,0,0,23,36,55,28,23,0,12,20,84,71,55,0,0,0,20,28,28,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,15,12,0,0,0,0,0,12,15,44,47,44,31,0,7,31,84,76,68,0,0,0,28,39,28,28,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,0,0,7,12,12,0,0,0,0,12,12,39,36,63,36,15,0,31,68,84,76,0,0,0,28,52,28,28,0,0,0,0,0,0,0,0,0,0,0,0,7,36,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,20,0,0,20,20,12,0,0,0,0,20,36,44,68,44,31,0,36,52,100,76,12,0,0,36,52,28,28,0,7,7,0,0,0,0,0,0,0,0,0,28,39,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,7,0,12,28,23,0,0,0,0,20,20,52,52,63,36,0,28,44,111,76,28,0,0,36,44,12,12,0,12,12,0,0,0,0,0,0,0,0,12,39,39,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,12,0,20,31,20,0,0,0,12,23,47,47,84,44,20,20,36,116,76,44,0,0,36,44,12,12,0,12,12,0,0,0,0,0,0,0,0,31,44,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,12,0,28,36,15,0,0,0,20,36,60,76,60,36,0,39,108,84,60,0,0,36,63,28,28,12,12,12,0,0,0,0,0,0,0,15,44,44,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,28,12,12,36,31,7,0,0,12,28,63,60,84,44,7,44,92,95,71,0,0,44,79,44,28,20,20,12,0,0,0,0,0,0,0,36,47,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,39,28,12,23,44,28,0,0,0,28,52,68,95,55,28,39,76,116,76,0,0,44,84,44,23,20,20,0,0,0,0,0,0,0,20,52,44,0,0,0,0,0,0,0,0,0,0,12,20,23,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,44,28,15,36,44,20,0,0,15,36,76,84,76,44,28,60,124,76,12,0,47,92,44,23,28,28,0,0,0,0,0,0,0,44,52,23,0,0,0,0,0,0,0,0,0,7,28,36,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,47,28,20,44,44,12,0,0,36,68,84,100,52,23,52,132,84,31,0,47,92,47,28,36,36,0,0,0,0,0,0,28,55,44,0,0,0,0,0,0,0,0,0,12,39,52,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,47,28,31,52,36,0,0,23,52,92,108,71,36,52,127,95,47,0,47,92,47,39,36,36,0,0,0,0,0,12,52,55,23,0,0,0,0,0,0,0,0,20,52,63,44,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,44,47,36,44,55,28,0,0,44,87,103,100,52,52,116,116,68,0,52,100,52,44,36,31,0,0,0,0,0,36,60,44,0,0,0,0,0,0,0,0,20,60,76,60,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,44,44,52,52,20,0,28,68,108,119,68,60,100,132,76,0,55,108,52,44,44,20,0,0,0,0,15,60,60,20,0,0,0,0,0,0,0,28,63,76,60,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,55,47,52,60,44,7,12,52,108,132,95,63,92,148,87,12,60,111,60,44,44,12,0,0,0,0,44,68,44,0,0,0,0,0,0,0,36,87,108,68,20,0,0,0,0,0,0,0,0,0,0,0,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,63,52,60,63,36,0,36,87,135,124,71,92,156,108,23,60,116,68,47,47,15,15,12,0,20,68,63,20,0,0,0,0,0,0,36,92,116,84,31,0,0,0,0,0,0,0,0,0,0,12,20,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,44,68,60,68,60,23,15,68,132,156,95,100,159,127,44,60,116,84,52,52,12,12,0,0,52,68,44,0,0,0,0,0,7,47,100,108,79,36,7,0,0,0,0,0,0,0,0,15,28,28,23,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,52,68,71,76,52,12,44,124,183,132,108,148,140,60,60,119,103,52,60,20,20,0,28,71,68,12,0,0,0,0,12,60,116,127,84,31,0,0,0,0,0,0,0,0,15,31,36,28,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,60,76,84,76,44,28,103,196,183,132,151,156,76,68,124,116,55,68,31,28,0,60,76,44,0,0,0,0,12,68,135,148,100,36,0,0,0,0,0,0,0,20,36,36,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,7,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,28,68,84,92,68,36,68,172,220,156,164,156,95,79,140,124,60,63,36,15,36,76,68,15,0,0,0,20,76,156,164,108,36,0,0,0,0,0,0,20,39,44,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,23,20,7,0,0,0,12,12,0,0,12,7,12,12,12,7,0,0,0,0,0,36,76,100,95,60,47,124,220,196,188,164,116,103,156,124,71,52,39,15,68,84,47,7,0,0,23,79,156,172,116,44,7,0,7,0,0,20,44,52,47,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,28,28,28,15,0,0,0,0,0,20,28,28,15,20,15,20,20,0,0,0,0,44,92,108,95,55,87,180,228,207,188,132,132,180,124,92,52,44,44,92,92,36,12,0,23,87,159,164,100,39,15,15,12,12,28,52,63,60,44,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,31,31,31,36,28,12,0,0,20,28,39,39,36,28,36,36,28,15,0,0,12,68,119,132,92,76,140,228,220,212,143,148,191,124,116,52,44,84,111,84,44,28,39,95,164,159,92,36,23,28,20,31,60,79,84,68,36,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,39,44,39,39,39,28,12,12,28,36,52,60,55,55,55,44,28,7,0,31,92,148,135,87,116,191,236,236,164,167,204,132,116,55,68,116,124,71,52,68,116,164,151,87,44,36,36,44,68,92,100,84,60,28,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,20,44,55,52,52,44,39,28,28,36,52,68,71,76,71,63,39,20,0,52,116,159,132,108,156,231,247,180,183,212,148,108,76,103,148,116,76,92,135,167,143,87,52,44,55,76,92,100,100,71,31,0,0,0,0,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,44,71,79,71,60,52,44,44,44,60,84,95,100,87,68,31,20,60,132,172,140,148,204,252,207,207,220,172,103,111,148,159,116,116,148,167,140,92,63,68,92,108,100,95,76,39,7,0,12,28,31,23,20,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,31,44,68,92,95,84,68,63,60,68,84,111,124,124,92,52,36,71,156,180,167,188,239,236,236,236,191,124,143,180,172,156,172,172,148,100,84,100,116,111,100,79,39,12,20,36,39,36,36,31,23,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,44,68,92,111,116,95,92,92,100,116,151,159,135,92,60,95,172,188,196,223,252,252,244,196,164,180,215,204,196,196,151,124,119,127,116,100,84,52,36,44,47,44,44,39,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,44,68,108,140,148,140,140,140,148,167,188,188,132,100,124,180,220,228,252,252,247,204,199,220,236,228,212,180,164,151,140,108,92,76,63,55,52,52,47,44,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,47,79,116,148,164,172,175,188,204,223,212,172,140,156,207,244,252,252,247,228,228,244,244,231,212,191,164,140,124,116,103,92,76,68,52,36,15,12,12,20,20,12,0,0,0,0,0,0,0,0,0,7,20,20,15,15,28,28,15,0,0,12,15,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,36,68,100,132,156,167,188,228,244,239,204,180,199,236,252,252,252,247,247,252,247,228,212,191,172,156,140,124,124,108,92,68,47,44,36,36,28,23,28,31,36,44,52,47,47,44,44,36,31,36,36,28,20,15,28,28,15,0,0,12,15,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,12,0,0,0,0,0,0,0,0,15,23,20,12,12,20,20,12,7,0,12,36,68,100,140,180,228,244,247,228,220,236,252,252,252,252,252,252,252,239,220,196,180,175,188,183,167,140,116,103,100,100,103,100,87,79,68,63,52,52,52,47,44,44,44,36,31,36,36,28,20,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,23,23,28,28,28,15,0,15,31,52,60,76,68,60,76,103,119,116,108,100,92,87,79,84,108,148,188,212,236,247,247,247,252,252,252,252,252,252,252,239,236,236,236,220,204,196,196,180,159,132,108,84,68,60,60,60,55,55,52,52,47,39,31,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,23,23,28,28,28,12,0,15,31,44,52,63,68,60,76,103,124,119,116,116,116,116,116,124,132,156,183,212,236,252,252,252,252,252,252,252,252,252,247,244,244,244,244,236,215,188,164,132,100,76,60,52,39,28,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,36,44,52,60,68,76,84,84,92,92,100,100,108,116,132,156,191,228,244,252,252,252,252,252,252,252,252,252,252,252,239,220,188,151,116,100,63,31,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,7,0,20,44,60,71,76,76,76,76,84,84,84,84,84,84,84,84,84,84,84,87,95,116,132,156,164,167,180,207,236,252,252,252,252,252,252,252,252,252,252,252,247,239,212,164,108,71,68,52,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,23,47,47,23,0,20,52,76,84,79,76,76,76,84,84,84,84,84,76,76,68,76,92,100,100,92,92,87,100,124,151,183,212,236,252,252,252,252,252,252,236,236,252,252,252,247,228,204,191,172,132,87,63,52,52,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,23,47,47,23,0,20,44,60,55,47,36,31,20,20,12,7,20,36,52,55,60,60,60,63,68,92,116,132,135,127,140,180,212,220,231,239,244,252,252,228,204,204,252,244,244,244,228,204,172,151,140,116,92,71,60,44,44,36,36,31,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,44,47,52,52,52,55,60,60,68,84,100,92,76,68,68,95,132,151,167,183,196,204,220,239,252,244,183,159,188,244,223,223,228,228,212,180,148,132,124,108,71,31,20,31,36,36,31,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,36,44,44,44,44,47,52,52,52,52,55,55,52,52,55,60,60,76,84,92,95,124,148,148,156,188,220,239,247,220,127,127,188,228,188,196,191,204,220,220,172,124,100,92,95,84,52,12,0,0,12,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,20,23,23,28,36,36,36,44,44,44,36,20,20,28,44,44,47,52,52,52,44,44,60,68,76,100,116,108,92,116,156,196,223,244,236,167,79,103,172,188,172,172,164,172,172,212,231,188,119,76,68,76,79,71,44,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,20,20,20,23,23,28,36,28,15,0,0,12,28,36,36,44,44,44,44,36,20,28,52,68,71,84,92,92,76,63,84,124,180,196,212,223,204,108,52,95,143,140,172,156,143,151,135,148,215,244,204,132,68,44,60,76,76,68,44,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,20,20,20,20,15,12,0,0,0,0,12,23,23,28,36,36,36,36,23,0,0,28,52,63,68,71,76,71,63,60,44,55,108,164,188,172,191,212,156,52,44,95,108,84,164,164,116,132,127,100,148,220,244,212,156,84,31,31,60,76,71,68,39,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,0,0,0,0,0,0,0,0,0,15,20,28,28,23,28,28,15,0,0,0,28,52,60,63,60,60,52,52,55,44,28,44,103,143,164,148,156,199,188,95,12,55,87,84,60,148,180,108,84,124,84,76,148,191,207,199,159,92,36,7,28,55,68,68,60,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,15,20,23,20,12,0,0,0,0,28,52,60,60,55,44,36,44,52,44,23,20,47,103,124,140,124,132,172,204,140,44,0,60,71,44,31,124,196,116,44,76,87,60,63,124,156,180,188,151,108,52,12,0,23,52,63,60,60,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,7,0,0,0,0,0,12,28,47,52,55,52,31,28,36,44,44,28,7,15,52,100,116,116,103,108,148,204,180,84,7,0,55,55,12,12,100,188,140,52,28,71,68,39,52,108,132,148,164,148,116,60,20,0,0,20,44,60,60,60,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,44,47,52,44,20,12,23,36,36,28,12,0,20,52,100,100,100,92,92,116,180,204,124,28,0,12,52,52,0,0,79,167,156,76,0,36,68,52,23,52,95,116,124,143,140,124,76,31,0,0,0,20,44,60,55,52,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,44,44,44,36,15,0,12,28,31,28,15,0,0,28,60,92,92,84,79,84,92,148,204,156,68,0,0,28,44,44,0,0,60,132,164,103,12,7,52,68,31,15,47,87,100,108,124,127,124,84,44,7,0,0,0,20,44,52,47,44,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,39,44,44,31,12,0,7,20,28,28,15,0,0,0,28,60,84,76,68,68,76,76,116,180,180,100,20,0,0,36,44,44,0,0,47,100,175,119,36,0,23,60,60,15,20,44,76,84,92,103,116,119,95,60,20,0,0,0,0,15,36,47,47,44,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,36,36,28,7,0,0,7,20,20,20,0,0,0,0,31,60,76,68,52,60,68,60,84,140,172,119,44,0,0,0,39,39,28,0,0,28,71,164,124,68,0,0,36,60,39,0,20,44,68,68,76,87,103,111,103,68,28,0,0,0,0,0,15,36,47,44,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,31,31,31,20,0,0,0,0,0,7,15,7,0,0,0,7,36,60,68,60,44,52,60,52,68,116,156,135,76,12,0,0,0,36,36,12,0,0,12,60,132,124,84,0,0,12,52,60,23,0,20,44,60,55,68,76,92,100,103,76,39,0,0,0,0,0,0,15,36,44,36,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,28,28,28,15,0,0,0,0,0,0,0,0,0,0,0,0,12,36,60,60,44,31,44,55,52,52,92,135,140,92,36,0,0,0,0,36,36,0,0,0,0,52,103,127,100,23,0,0,28,52,44,7,0,20,39,52,44,60,68,79,92,100,84,52,12,0,0,0,0,0,0,12,28,36,36,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,20,23,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,60,44,36,20,31,47,52,36,68,116,132,103,60,7,0,0,0,12,28,28,0,0,0,0,52,76,124,103,44,0,0,0,36,52,28,0,0,20,36,36,36,52,60,68,76,92,87,60,23,0,0,0,0,0,0,0,12,28,36,36,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,15,15,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,39,52,36,20,12,23,39,52,28,47,100,119,111,76,28,0,0,0,0,15,20,20,0,0,0,0,44,55,103,92,52,0,0,0,12,44,44,15,0,0,12,20,20,28,44,52,60,68,84,87,68,36,0,0,0,0,0,0,0,0,12,23,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,39,44,28,12,7,12,36,52,28,36,84,108,108,84,44,0,0,0,0,0,15,15,12,0,0,0,0,28,44,87,84,68,15,0,0,0,28,44,36,0,0,0,0,15,28,28,36,39,52,60,71,84,68,36,0,0,0,0,0,0,0,0,0,7,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,39,20,0,0,12,28,47,28,20,63,100,100,87,63,20,0,0,0,0,0,15,15,0,0,0,0,0,12,44,76,76,76,36,0,0,0,0,36,44,20,0,0,0,15,28,20,20,20,31,44,52,60,68,63,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,39,36,15,0,0,0,20,44,28,12,44,92,92,84,68,36,0,0,0,0,0,0,7,7,0,0,0,0,0,0,36,55,60,76,39,0,0,0,0,15,36,36,7,0,0,0,12,23,20,12,12,23,36,44,44,52,60,44,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,36,28,12,0,0,0,20,36,28,12,31,76,92,71,71,52,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,44,55,71,44,12,0,0,0,0,23,36,20,0,0,0,0,12,12,0,0,0,15,28,39,36,44,52,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,23,7,0,0,0,12,36,28,12,15,63,92,68,63,60,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,36,60,63,55,23,0,0,0,0,7,28,31,12,0,0,0,0,0,0,0,0,0,7,23,28,23,28,44,39,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,15,23,20,0,0,0,0,12,28,28,12,0,47,84,68,52,60,44,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,31,52,47,60,31,0,0,0,0,0,12,28,20,0,0,0,0,0,0,0,0,0,0,0,12,23,20,28,28,31,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,20,7,0,0,0,0,0,12,20,12,0,36,76,71,39,52,52,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,23,36,23,52,28,0,0,0,0,0,0,20,28,12,0,0,0,0,0,0,0,0,0,0,0,12,20,23,20,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,12,0,0,0,0,0,7,12,0,0,20,63,76,44,31,52,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,15,36,28,7,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,12,20,12,7,7,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,12,20,7,0,0,47,76,52,20,44,44,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,20,28,28,20,0,0,0,0,0,0,12,15,12,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,0,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,15,12,0,0,36,71,60,15,28,44,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,36,20,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,0,0,0,0,0,0,0,0,0,0,0,20,60,68,28,12,36,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,0,23,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,68,44,0,28,36,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,60,52,12,12,36,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,44,52,20,0,28,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,44,28,0,12,28,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,36,28,0,0,23,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,31,31,12,0,12,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,15,0,0,23,23,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,12,0,0,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};\n    const uint8_t SHINE_TEXTURE_9[16384] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,0,0,0,0,12,7,0,0,0,0,0,0,0,0,0,7,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,20,0,0,0,7,0,0,0,0,0,0,0,0,0,0,12,20,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,23,0,0,0,28,28,20,0,0,0,0,0,0,0,0,20,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,12,0,0,36,36,28,0,0,0,0,0,0,0,0,20,23,12,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,36,15,0,0,36,31,23,0,0,0,0,0,0,0,0,20,20,0,0,0,0,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,36,28,0,12,23,20,12,0,0,0,0,0,0,0,0,36,36,0,0,0,7,20,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,36,0,12,20,36,28,0,0,0,0,0,0,0,12,52,52,7,0,12,12,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,12,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,39,20,0,20,71,60,12,0,0,0,0,0,0,20,52,52,7,0,12,12,23,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,52,28,0,23,84,68,12,0,0,0,0,0,0,36,60,52,0,0,20,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,7,0,0,0,12,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,60,47,12,23,55,31,7,0,0,0,0,0,0,63,79,60,7,15,12,28,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,7,0,0,0,0,12,23,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,71,12,15,52,36,20,0,0,0,0,0,0,60,68,44,12,28,28,39,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,20,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,15,76,79,28,20,76,68,44,0,0,0,0,0,0,68,68,36,15,36,39,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,0,0,0,0,0,0,7,28,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,76,84,52,31,100,100,68,0,0,0,0,0,20,92,92,39,28,36,60,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,15,12,0,15,20,0,0,0,12,36,31,12,0,0,0,0,0,0,0,0,0,0,0,0,60,92,68,28,84,108,76,0,0,0,0,0,36,92,92,36,39,36,60,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,20,36,23,0,0,0,20,44,28,0,0,0,0,0,0,0,0,0,7,7,0,39,92,87,36,68,111,79,0,0,0,0,0,55,108,103,31,52,44,52,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,23,31,36,20,0,0,0,28,44,20,0,0,0,0,0,0,0,0,12,12,7,20,92,95,52,68,124,84,0,0,0,0,0,76,116,108,28,60,68,44,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,31,28,31,39,28,0,0,12,39,44,15,0,0,0,0,0,0,0,12,20,15,0,92,100,63,60,127,84,12,0,0,0,0,92,124,108,44,60,76,39,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,36,39,44,23,0,0,20,44,36,12,0,0,0,0,0,0,0,23,23,0,68,100,79,60,140,100,23,0,0,0,12,108,132,103,68,76,76,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,36,36,44,23,0,0,28,52,31,0,0,0,0,0,0,0,20,20,7,44,100,92,68,140,108,36,0,0,0,23,124,140,92,79,84,63,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,28,23,36,44,28,0,7,39,52,28,0,0,0,0,0,0,12,23,20,20,100,100,76,132,116,47,0,0,0,39,127,156,84,92,92,52,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,28,39,52,47,23,0,20,52,52,20,0,0,0,0,0,0,31,31,12,92,100,95,132,140,60,0,0,0,60,127,156,92,108,92,44,0,0,0,0,0,0,0,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,44,52,52,55,52,23,0,28,60,44,12,0,0,0,0,0,28,36,23,76,100,111,132,151,71,0,0,0,76,127,148,95,116,84,36,0,0,0,0,0,0,7,20,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,60,63,60,68,52,20,0,36,60,36,7,15,15,0,0,15,39,39,52,100,116,124,151,79,0,0,12,100,143,140,103,108,68,20,0,0,0,0,0,12,23,23,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,63,71,71,71,52,28,12,52,60,28,20,28,15,0,0,44,44,44,100,108,124,148,92,0,0,28,127,164,140,127,108,60,0,0,0,0,0,15,28,28,23,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,76,84,84,76,52,20,23,60,60,28,28,28,12,0,44,55,52,92,100,140,151,108,0,0,39,140,188,148,148,108,47,0,0,0,0,12,28,44,39,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,76,92,92,84,52,23,36,68,52,31,36,28,0,28,63,60,84,100,156,151,119,20,0,44,132,180,151,148,103,36,7,0,0,7,28,52,52,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,84,100,108,92,52,28,44,71,52,44,44,20,0,68,68,84,100,156,156,132,28,0,71,156,188,164,140,92,23,0,0,0,28,52,60,39,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,23,20,15,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,7,0,0,0,0,0,12,36,87,111,116,100,55,39,60,68,60,52,44,7,52,76,87,100,151,164,140,39,0,100,183,204,191,148,76,23,0,0,20,52,71,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,28,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,20,20,15,12,12,0,0,0,36,92,124,127,108,60,52,68,76,76,60,36,23,76,84,108,140,180,140,52,20,119,204,220,196,148,60,12,0,12,44,76,71,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,44,36,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,28,36,36,36,28,12,0,0,36,92,132,135,111,60,60,76,84,84,68,20,68,79,124,124,196,140,63,31,132,228,236,199,132,44,0,0,36,76,84,44,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,44,55,52,44,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,52,60,47,28,7,0,36,92,132,148,116,71,76,87,108,92,52,47,79,127,116,199,140,76,44,148,244,244,196,108,28,0,28,76,95,68,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,52,60,60,52,31,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,63,76,76,52,23,0,31,87,148,180,148,92,84,108,116,84,44,76,116,127,196,156,87,60,164,252,244,188,87,12,15,68,103,92,44,12,0,0,0,0,0,0,0,0,0,0,0,0,28,52,68,68,60,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,60,92,100,84,44,20,28,95,175,204,156,108,103,132,116,68,76,92,151,183,180,100,76,180,252,244,164,68,7,55,111,116,68,28,7,0,0,0,0,0,0,0,0,0,0,36,68,84,76,68,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,87,116,116,84,36,36,100,180,207,164,124,132,143,100,79,84,164,188,204,111,87,188,252,228,132,36,36,108,140,92,39,12,0,0,0,0,0,0,0,0,7,39,76,92,92,79,47,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,76,124,148,124,68,55,100,180,204,172,140,156,143,95,100,148,196,220,124,100,204,252,199,100,36,100,159,132,60,12,0,0,0,0,0,0,0,12,44,84,100,100,87,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,20,60,116,156,151,108,76,108,180,196,180,164,172,132,116,132,212,228,132,116,220,244,164,71,76,156,156,92,28,0,0,0,0,0,0,12,47,84,103,108,92,63,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,20,15,12,0,36,92,140,164,135,116,132,180,204,196,196,191,148,140,204,231,148,132,231,223,127,76,140,180,124,39,0,0,0,0,0,12,52,87,103,103,92,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,20,20,20,31,36,31,44,76,124,151,159,151,156,196,212,223,236,188,172,196,244,159,156,244,188,116,119,188,156,60,12,0,0,0,20,55,92,103,103,92,55,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,20,36,39,36,44,60,71,84,116,148,164,172,196,228,244,252,228,196,199,239,180,180,236,164,135,172,172,84,20,0,0,20,60,92,103,103,87,52,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,20,20,12,12,12,0,0,0,0,0,0,0,0,0,12,12,12,20,23,47,68,76,76,84,100,127,159,180,196,228,244,252,252,228,228,244,204,204,220,172,167,172,100,23,0,23,63,92,108,108,87,47,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,20,20,12,15,28,28,28,28,36,39,36,28,12,0,0,0,0,12,20,31,36,52,76,103,124,124,140,172,207,228,244,252,252,244,244,244,228,228,212,199,172,116,39,28,68,100,124,124,100,52,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,28,28,28,28,36,39,44,44,44,47,52,52,52,47,36,31,36,44,44,52,76,108,151,175,196,220,244,252,252,252,252,252,244,244,231,196,132,76,79,119,140,140,116,63,28,0,0,0,0,0,0,0,7,20,20,28,28,31,23,15,12,20,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,0,0,0,0,7,20,36,44,44,44,47,52,52,52,55,60,60,68,76,84,95,108,103,111,132,164,204,231,252,252,252,252,252,252,252,231,188,140,132,148,148,124,76,44,31,28,31,44,52,52,52,52,52,52,52,47,52,52,52,28,15,20,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,20,28,15,0,0,0,20,36,44,44,55,71,92,103,108,116,124,127,124,132,127,127,143,164,180,204,228,244,252,252,252,252,252,252,236,207,188,188,180,156,124,108,103,116,124,132,132,124,116,108,103,100,92,87,76,68,60,39,12,0,7,15,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,23,23,28,39,36,20,15,28,47,68,71,76,84,87,95,95,100,124,159,180,188,207,220,223,223,220,212,212,228,244,252,252,252,252,252,252,244,244,236,212,188,175,180,196,204,215,220,228,223,196,167,148,132,124,108,100,95,92,92,76,60,36,20,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,20,28,28,36,36,44,52,60,68,76,84,100,108,124,127,140,172,207,228,228,236,244,239,244,236,236,247,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,236,212,175,156,124,100,87,84,84,84,84,84,84,84,84,68,44,36,23,0,0,0,0,0,0,0,0,12,20,20,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,68,84,60,31,47,84,100,100,92,92,92,92,92,92,100,108,124,143,164,164,172,172,172,196,207,220,223,236,244,244,252,252,252,252,252,252,252,252,252,236,212,204,215,236,252,236,215,180,159,140,116,87,76,76,71,60,44,36,28,28,28,28,31,20,0,0,0,0,0,0,0,0,12,20,20,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,28,60,76,44,12,28,60,84,84,84,84,84,87,84,76,76,68,63,60,68,92,127,148,143,140,148,172,188,196,215,244,252,252,252,252,252,252,252,252,252,236,212,183,164,156,164,188,212,223,223,191,156,119,103,92,79,60,52,52,47,44,44,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,20,44,52,31,7,12,20,20,12,0,0,0,7,7,12,20,28,52,68,79,79,84,95,119,140,140,124,140,167,204,236,247,236,236,231,236,252,252,247,247,244,228,191,156,140,119,108,116,135,148,151,143,124,111,100,92,76,76,71,68,60,52,44,39,36,28,28,31,23,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,36,52,60,60,63,68,79,100,108,92,79,100,124,140,159,204,228,231,207,212,207,212,244,244,236,220,212,220,212,196,180,148,111,76,60,60,60,63,60,68,76,76,60,44,28,28,39,52,47,44,39,28,28,31,23,15,12,23,12,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,39,52,52,52,55,60,60,60,68,68,63,68,76,92,95,116,140,167,188,228,196,172,196,188,180,223,228,220,191,156,167,172,172,180,188,180,156,116,68,28,15,28,39,39,36,36,36,39,36,31,20,12,0,0,0,0,12,12,12,12,23,12,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,39,44,44,47,52,52,47,36,31,44,52,60,60,60,60,68,84,108,124,140,156,212,215,148,148,204,172,148,204,196,188,180,124,100,132,140,140,148,164,180,188,159,111,68,31,0,0,12,28,31,28,20,15,12,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,36,36,39,44,44,44,36,20,7,20,39,52,52,55,47,36,44,68,84,100,108,116,132,180,215,172,108,143,228,156,124,188,164,156,167,124,76,68,111,116,111,111,132,148,175,180,148,100,68,36,7,0,0,0,0,12,12,12,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,20,28,36,36,36,36,23,0,0,0,20,39,44,47,52,36,15,23,52,76,79,84,92,100,116,159,204,188,108,92,164,244,143,100,156,140,124,124,143,84,44,55,95,103,100,87,95,111,127,156,156,132,92,68,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,20,28,20,20,23,23,12,0,0,0,7,20,36,39,44,44,28,0,0,36,68,76,68,68,79,84,95,140,188,191,132,60,92,188,215,116,76,119,143,92,95,132,116,60,20,52,84,92,84,76,76,76,87,108,132,140,116,84,60,39,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,15,20,20,12,0,0,0,0,0,12,20,28,36,36,36,20,0,0,20,52,68,68,52,60,76,76,76,124,175,188,143,76,36,108,196,180,84,44,100,143,68,84,92,124,84,31,7,44,76,76,71,68,68,60,60,76,95,116,119,108,76,55,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,0,0,0,0,0,0,0,0,15,23,28,28,23,12,0,0,0,36,60,68,52,39,47,76,68,63,103,164,180,148,92,28,52,124,180,151,55,20,92,124,76,68,68,100,92,60,12,0,36,68,68,60,55,63,52,44,44,63,84,95,100,87,63,44,31,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,15,12,20,23,15,0,0,0,0,20,44,63,60,36,28,47,76,60,47,76,148,164,148,108,52,0,68,140,148,116,23,0,87,100,92,52,52,68,92,68,36,0,0,28,60,68,52,44,60,60,36,28,36,60,68,71,76,68,52,36,28,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,12,0,0,0,0,0,0,31,52,60,47,20,20,52,76,52,36,60,132,143,132,116,76,12,15,76,156,124,92,12,0,79,92,100,47,44,52,76,76,60,23,0,0,23,52,68,44,36,44,52,44,23,15,28,44,55,52,52,52,44,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,20,44,55,52,31,7,20,52,71,47,28,47,116,132,124,116,92,36,0,44,79,164,116,63,7,0,63,92,100,44,39,31,52,68,60,47,12,0,0,20,47,63,39,28,31,52,47,28,12,12,28,28,36,36,44,44,28,20,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,52,52,44,20,0,23,52,68,39,12,36,95,124,108,108,100,60,0,0,60,92,151,111,39,0,0,44,92,92,44,39,20,44,55,60,55,36,0,0,0,12,39,60,44,20,20,44,44,31,12,0,0,12,20,36,28,28,28,23,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,36,52,44,28,0,0,28,55,60,36,0,20,68,116,108,92,100,76,20,0,12,68,111,127,108,12,0,0,23,87,87,44,36,20,23,44,52,47,52,20,0,0,0,12,36,60,44,15,12,28,44,36,20,0,0,0,12,15,20,20,20,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,44,44,36,12,0,0,28,60,55,28,0,12,44,92,100,76,92,92,44,0,0,36,68,124,108,92,0,0,0,7,87,87,47,31,28,0,36,39,39,47,39,12,0,0,0,0,28,52,44,20,0,20,36,36,23,7,0,0,0,0,12,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,44,39,20,0,0,0,31,55,52,23,0,0,28,76,92,68,79,92,63,7,0,0,52,63,119,100,76,0,0,0,0,84,87,52,28,28,0,20,36,36,31,44,28,0,0,0,0,0,28,44,44,20,0,12,28,36,28,12,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,39,28,12,0,0,12,36,55,44,20,0,0,20,60,84,68,60,84,79,28,0,0,0,60,63,100,87,52,0,0,0,0,68,87,68,20,23,12,0,28,36,28,36,44,20,0,0,0,0,0,20,39,39,20,0,0,15,23,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,31,20,0,0,0,12,36,52,36,12,0,0,12,36,68,71,47,68,84,44,0,0,0,28,60,63,84,79,36,0,0,0,0,47,87,79,12,15,15,0,12,28,28,20,36,31,7,0,0,0,0,0,12,36,39,20,0,0,0,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,31,20,7,0,0,0,12,36,52,31,12,0,0,12,28,52,68,39,44,76,63,12,0,0,0,44,60,52,71,71,15,0,0,0,0,28,84,84,12,12,12,0,0,20,23,12,20,36,20,0,0,0,0,0,0,12,28,36,20,0,0,0,7,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,23,12,0,0,0,0,15,36,44,28,0,0,0,7,23,52,63,44,28,55,63,28,0,0,0,0,52,55,36,60,60,0,0,0,0,0,12,84,84,20,0,0,0,0,7,20,20,12,28,31,12,0,0,0,0,0,0,7,23,36,20,0,0,0,7,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,23,15,0,0,0,0,0,15,36,44,20,0,0,0,0,7,31,60,47,20,31,55,39,0,0,0,0,20,52,52,20,44,44,0,0,0,0,0,0,84,84,44,0,0,0,0,0,12,20,12,12,28,28,0,0,0,0,0,0,0,0,20,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,20,7,0,0,0,0,0,12,31,36,20,0,0,0,0,0,15,44,52,28,15,44,44,12,0,0,0,0,36,52,44,20,36,31,0,0,0,0,0,0,68,84,60,0,0,0,0,0,0,12,12,0,12,20,12,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,7,0,0,0,0,0,0,12,28,20,12,0,0,0,0,0,12,31,47,28,0,28,44,28,0,0,0,0,0,47,52,20,23,28,20,0,0,0,0,0,0,52,84,76,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,20,28,20,0,0,0,0,0,0,7,28,47,36,12,15,39,36,0,0,0,0,0,12,47,47,0,20,20,7,0,0,0,0,0,0,31,84,79,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,31,20,7,0,0,0,0,0,0,15,39,36,12,0,31,36,15,0,0,0,0,0,28,44,44,0,12,12,0,0,0,0,0,0,0,12,76,76,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,0,0,0,0,0,0,0,0,28,36,20,0,20,36,23,0,0,0,0,0,0,44,44,23,0,12,12,0,0,0,0,0,0,0,0,60,60,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,0,0,0,0,0,0,0,0,20,36,20,0,7,28,28,7,0,0,0,0,0,0,44,44,0,0,7,7,0,0,0,0,0,0,0,0,44,55,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,12,0,0,0,0,0,0,0,0,0,12,31,23,0,0,20,28,12,0,0,0,0,0,0,20,39,36,0,0,0,0,0,0,0,0,0,0,0,0,28,44,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,0,0,0,0,0,0,0,0,0,12,28,28,7,0,12,28,20,0,0,0,0,0,0,0,36,36,23,0,0,0,0,0,0,0,0,0,0,0,0,12,36,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,12,0,0,20,23,7,0,0,0,0,0,0,0,36,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,7,0,0,12,20,12,0,0,0,0,0,0,0,15,36,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,12,0,0,0,12,12,0,0,0,0,0,0,0,0,28,36,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,23,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,7,12,0,0,0,0,0,0,0,0,0,28,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,15,20,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};\n    const uint8_t * SHINE_TEXTURES[10] = {\n      SHINE_TEXTURE_0,\n      SHINE_TEXTURE_1,\n      SHINE_TEXTURE_2,\n      SHINE_TEXTURE_3,\n      SHINE_TEXTURE_4,\n      SHINE_TEXTURE_5,\n      SHINE_TEXTURE_6,\n      SHINE_TEXTURE_7,\n      SHINE_TEXTURE_8,\n      SHINE_TEXTURE_9,\n    };\n    const int SHINE_TEXTURE_WIDTHS[10] = {\n      128,\n      128,\n      128,\n      128,\n      128,\n      128,\n      128,\n      128,\n      128,\n      128,\n    };\n    const int SHINE_TEXTURE_HEIGHTS[10] = {\n      128,\n      128,\n      128,\n      128,\n      128,\n      128,\n      128,\n      128,\n      128,\n      128,\n    };\n  }\n}\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/sort_triangles.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"sort_triangles.h\"\n#include \"project.h\"\n#include \"../sort_triangles.h\"\n#include \"gl.h\"\n#include \"../sort.h\"\n#include \"../slice.h\"\n#include \"../barycenter.h\"\n#include <iostream>\ntemplate <\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedFF,\n  typename DerivedI>\nvoid igl::opengl2::sort_triangles(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  Eigen::PlainObjectBase<DerivedFF> & FF,\n  Eigen::PlainObjectBase<DerivedI> & I)\n{\n  using namespace Eigen;\n  using namespace std;\n  // Put model, projection, and viewport matrices into double arrays\n  Matrix4d MV;\n  Matrix4d P;\n  glGetDoublev(GL_MODELVIEW_MATRIX,  MV.data());\n  glGetDoublev(GL_PROJECTION_MATRIX, P.data());\n  if(V.cols() == 3)\n  {\n    Matrix<typename DerivedV::Scalar, DerivedV::RowsAtCompileTime,4> hV;\n    hV.resize(V.rows(),4);\n    hV.block(0,0,V.rows(),V.cols()) = V;\n    hV.col(3).setConstant(1);\n    return igl::sort_triangles(hV,F,MV,P,FF,I);\n  }else\n  {\n    return igl::sort_triangles(V,F,MV,P,FF,I);\n  }\n}\n\ntemplate <\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedFF,\n  typename DerivedI>\nvoid igl::opengl2::sort_triangles_slow(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  Eigen::PlainObjectBase<DerivedFF> & FF,\n  Eigen::PlainObjectBase<DerivedI> & I)\n{\n  using namespace Eigen;\n  using namespace std;\n  // Barycenter, centroid\n  Eigen::Matrix<typename DerivedV::Scalar, DerivedF::RowsAtCompileTime,1> D,sD;\n  Eigen::Matrix<typename DerivedV::Scalar, DerivedF::RowsAtCompileTime,3> BC;\n  D.resize(F.rows(),3);\n  barycenter(V,F,BC);\n  for(int f = 0;f<F.rows();f++)\n  {\n    Eigen::Matrix<typename DerivedV::Scalar, 3,1> bc,pbc;\n    bc = BC.row(f);\n    project(bc,pbc);\n    D(f) = pbc(2);\n  }\n  sort(D,1,false,sD,I);\n  slice(F,I,1,FF);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::opengl2::sort_triangles<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::opengl2::sort_triangles_slow<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/sort_triangles.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL2_SORT_TRIANGLES_H\n#define IGL_OPENGL2_SORT_TRIANGLES_H\n\n#include \"../igl_inline.h\"\n#include <Eigen/Core>\n\nnamespace igl\n{\n  namespace opengl2\n  {\n    template <\n      typename DerivedV,\n      typename DerivedF,\n      typename DerivedFF,\n      typename DerivedI>\n    IGL_INLINE void sort_triangles(\n      const Eigen::PlainObjectBase<DerivedV> & V,\n      const Eigen::PlainObjectBase<DerivedF> & F,\n      Eigen::PlainObjectBase<DerivedFF> & FF,\n      Eigen::PlainObjectBase<DerivedI> & I);\n    template <\n      typename DerivedV,\n      typename DerivedF,\n      typename DerivedFF,\n      typename DerivedI>\n    IGL_INLINE void sort_triangles_slow(\n      const Eigen::PlainObjectBase<DerivedV> & V,\n      const Eigen::PlainObjectBase<DerivedF> & F,\n      Eigen::PlainObjectBase<DerivedFF> & FF,\n      Eigen::PlainObjectBase<DerivedI> & I);\n    //template <\n    //  typename DerivedV,\n    //  typename DerivedF,\n    //  typename DerivedMV,\n    //  typename DerivedP,\n    //  typename DerivedFF,\n    //  typename DerivedI>\n    //IGL_INLINE void sort_triangles_robust(\n    //  const Eigen::PlainObjectBase<DerivedV> & V,\n    //  const Eigen::PlainObjectBase<DerivedF> & F,\n    //  const Eigen::PlainObjectBase<DerivedMV> & MV,\n    //  const Eigen::PlainObjectBase<DerivedP> & P,\n    //  Eigen::PlainObjectBase<DerivedFF> & FF,\n    //  Eigen::PlainObjectBase<DerivedI> & I);\n    //template <\n    //  typename DerivedV,\n    //  typename DerivedF,\n    //  typename DerivedFF,\n    //  typename DerivedI>\n    //IGL_INLINE void sort_triangles_robust(\n    //  const Eigen::PlainObjectBase<DerivedV> & V,\n    //  const Eigen::PlainObjectBase<DerivedF> & F,\n    //  Eigen::PlainObjectBase<DerivedFF> & FF,\n    //  Eigen::PlainObjectBase<DerivedI> & I);\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"sort_triangles.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/texture_from_tga.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"texture_from_tga.h\"\n#include \"tga.h\"\n#include <cstring>\n\nIGL_INLINE bool igl::opengl::texture_from_tga(const std::string tga_file, GLuint & id)\n{\n  using namespace std;\n\n  // read pixels to tga file\n  FILE * imgFile;\n  // \"-\" as input file name is code for read from stdin\n  imgFile = fopen(tga_file.c_str(),\"r\");\n  if(NULL==imgFile)\n  {\n    printf(\"IOError: %s could not be opened...\",tga_file.c_str());\n    return false;\n  }\n\n  // gliReadTGA annoyingly uses char * instead of const char *\n  size_t len = tga_file.length();\n  char* tga_file_char = new char [ len + 1 ];\n  strcpy( tga_file_char, tga_file.c_str() );\n  // read image\n  gliGenericImage* img = gliReadTGA(imgFile, tga_file_char, 0, 0);\n  // clean up filename buffer\n  delete[] tga_file_char;\n  fclose( imgFile );\n\n  // set up texture mapping parameters and generate texture id\n  glGenTextures(1,&id);\n  glBindTexture(GL_TEXTURE_2D, id);\n  // Texture parameters\n  float empty[] = {1.0f,1.0f,1.0f,0.0f};\n  glTexParameterfv(GL_TEXTURE_2D,GL_TEXTURE_BORDER_COLOR,empty);\n  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);\n  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);\n  //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,\n  //  GL_LINEAR_MIPMAP_NEAREST);\n  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,\n    GL_LINEAR);\n\n  // OpenGL by default tries to read data in multiples of 4, if our data is\n  // only RGB or BGR and the width is not divible by 4 then we need to alert\n  // opengl\n  if((img->width % 4) != 0 && \n   (img->format == GL_RGB || \n    img->format == GL_BGR))\n  {\n    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);\n  }\n\n  // Load texture\n  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, img->width,\n    img->height, 0, img->format, GL_UNSIGNED_BYTE,\n    img->pixels);\n  return id;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/texture_from_tga.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL_TEXTURE_FROM_TGA_H\n#define IGL_OPENGL_TEXTURE_FROM_TGA_H\n#include \"../igl_inline.h\"\n#include \"gl.h\"\n#include <string>\n\nnamespace igl\n{\n  namespace opengl\n  {\n    // Read an image from a .tga file and use it as a texture\n    //\n    // Input:\n    //  tga_file  path to .tga file\n    // Output:\n    //  id  of generated openGL texture\n    // Returns true on success, false on failure\n    IGL_INLINE bool texture_from_tga(const std::string tga_file, GLuint & id);\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"texture_from_tga.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/tga.cpp",
    "content": "////////////////////////////////////////////////////////////////////////////////\n//\n// WARNING\n//\n// THIS DOES NOT DEAL WITH VERTICALLY FLIPPED DATA CORRECTLY\n//\n////////////////////////////////////////////////////////////////////////////////\n\n/* This file is derived from (actually an earlier version of)... */\n\n/* The GIMP -- an image manipulation program\n * Copyright (C) 1995 Spencer Kimball and Peter Mattis\n *\n * $Id: tga.cpp,v 1.1.2.5 2007-05-10 02:10:07 elif Exp $\n * TrueVision Targa loading and saving file filter for the Gimp.\n * Targa code Copyright (C) 1997 Raphael FRANCOIS and Gordon Matzigkeit\n *\n * The Targa reading and writing code was written from scratch by\n * Raphael FRANCOIS <fraph@ibm.net> and Gordon Matzigkeit\n * <gord@gnu.ai.mit.edu> based on the TrueVision TGA File Format\n * Specification, Version 2.0:\n *\n *   <URL:ftp://ftp.truevision.com/pub/TGA.File.Format.Spec/>\n *\n * It does not contain any code written for other TGA file loaders.\n * Not even the RLE handling. ;)\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 2 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, write to the Free Software\n * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n */\n\n#include \"tga.h\"\n#include \"glext.h\"\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <assert.h>\n\nstatic char error[256];\nstatic unsigned int _verbose = 0;\nstatic int totbytes = 0;\n\ntypedef struct {\n  unsigned char *statebuf;\n  int statelen;\n  int laststate;\n} RLEstate;\n\nIGL_INLINE static int\nstd_fread(RLEstate * /*rleInfo*/, unsigned char *buf, size_t datasize, size_t nelems, FILE *fp)\n{\n  if (_verbose > 1) {\n    totbytes += nelems * datasize;\n    printf(\"TGA: std_fread %d (total %d)\\n\",\n      (int)(nelems * datasize), totbytes);\n  }\n  return fread(buf, datasize, nelems, fp);\n}\n\n#define MIN(a,b) (((a) < (b)) ? (a) : (b))\n\n#define RLE_PACKETSIZE 0x80\n\n/* Decode a bufferful of file. */\nIGL_INLINE static int\nrle_fread(RLEstate *rleInfo, unsigned char *vbuf, size_t datasize, size_t nelems, FILE *fp)\n{\n\n  unsigned char *buf = vbuf;\n  int j, k;\n  int buflen, count, bytes, curbytes;\n  unsigned char *p;\n\n  /* Scale the buffer length. */\n  buflen = nelems * datasize;\n\n  j = 0;\n  curbytes = totbytes;\n  while (j < buflen) {\n    if (rleInfo->laststate < rleInfo->statelen) {\n      /* Copy bytes from our previously decoded buffer. */\n      bytes = MIN(buflen - j, rleInfo->statelen - rleInfo->laststate);\n      memcpy(buf + j, rleInfo->statebuf + rleInfo->laststate, bytes);\n      j += bytes;\n      rleInfo->laststate += bytes;\n\n      /* If we used up all of our state bytes, then reset them. */\n      if (rleInfo->laststate >= rleInfo->statelen) {\n        rleInfo->laststate = 0;\n        rleInfo->statelen = 0;\n      }\n\n      /* If we filled the buffer, then exit the loop. */\n      if (j >= buflen) break;\n    }\n\n    /* Decode the next packet. */\n    count = fgetc(fp);\n    if (count == EOF) {\n      if (_verbose) printf(\"TGA: hit EOF while looking for count\\n\");\n      return j / datasize;\n    }\n\n    /* Scale the byte length to the size of the data. */\n    bytes = ((count & ~RLE_PACKETSIZE) + 1) * datasize;\n\n    if (j + bytes <= buflen) {\n      /* We can copy directly into the image buffer. */\n      p = buf + j;\n    } else {\n#ifdef PROFILE\n      printf(\"TGA: needed to use statebuf for %d bytes\\n\", buflen - j);\n#endif\n      /* Allocate the state buffer if we haven't already. */\n      if (!rleInfo->statebuf) {\n        rleInfo->statebuf = (unsigned char *) malloc(RLE_PACKETSIZE * datasize);\n      }\n      p = rleInfo->statebuf;\n    }\n\n    if (count & RLE_PACKETSIZE) {\n      /* Fill the buffer with the next value. */\n      if (fread(p, datasize, 1, fp) != 1) {\n        if (_verbose) {\n          printf(\"TGA: EOF while reading %d/%d element RLE packet\\n\",\n            bytes, (int)datasize);\n        }\n        return j / datasize;\n      }\n\n      /* Optimized case for single-byte encoded data. */\n      if (datasize == 1) {\n        memset(p + 1, *p, bytes - 1);\n      } else {\n        for (k = datasize; k < bytes; k += datasize) {\n          memcpy(p + k, p, datasize);\n        }\n      }\n    } else {\n      /* Read in the buffer. */\n      if (fread(p, bytes, 1, fp) != 1) {\n        if (_verbose) {\n          printf(\"TGA: EOF while reading %d/%d element raw packet\\n\",\n            bytes, (int)datasize);\n        }\n        return j / datasize;\n      }\n    }\n\n    if (_verbose > 1) {\n      totbytes += bytes;\n      if (_verbose > 2) {\n        printf(\"TGA: %s packet %d/%d\\n\",\n          (count & RLE_PACKETSIZE) ? \"RLE\" : \"raw\",\n          bytes, totbytes);\n      }\n    }\n\n    /* We may need to copy bytes from the state buffer. */\n    if (p == rleInfo->statebuf) {\n      rleInfo->statelen = bytes;\n    } else {\n      j += bytes;\n    }\n  }\n\n  if (_verbose > 1) {\n    printf(\"TGA: rle_fread %d/%d (total %d)\\n\",\n    (int) ( nelems * datasize), totbytes - curbytes, totbytes);\n  }\n  return nelems;\n}\n\nIGL_INLINE igl::opengl::gliGenericImage *\nigl::opengl::gliReadTGA(FILE *fp, char *name, int /*hflip*/, int vflip)\n{\n  igl::opengl::TgaHeader tgaHeader;\n  igl::opengl::TgaFooter tgaFooter;\n  char horzrev, vertrev;\n  int width, height, bpp;\n  int start, end, dir;\n  int i, j, k;\n  int pelbytes, wbytes;\n  GLenum format;\n  int components;\n  RLEstate rleRec;\n  RLEstate *rleInfo;\n  int rle;\n  int index, colors, length;\n  GLubyte *cmap, *pixels, *data;\n  int (*myfread)(RLEstate *rleInfo, unsigned char*, size_t, size_t, FILE*);\n  igl::opengl::gliGenericImage *genericImage;\n\n  /* Check the footer. */\n  if (fseek(fp, 0L - sizeof(tgaFooter), SEEK_END)\n      || fread(&tgaFooter, sizeof(tgaFooter), 1, fp) != 1) {\n    sprintf(error, \"TGA: Cannot read footer from \\\"%s\\\"\", name);\n    if (_verbose) printf(\"%s\\n\", error);\n    return NULL;\n  }  \n\n  /* Check the signature. */\n  if (memcmp(tgaFooter.signature, TGA_SIGNATURE,\n             sizeof(tgaFooter.signature)) == 0) {\n    if (_verbose) printf(\"TGA: found New TGA\\n\");\n  } else {\n    if (_verbose) printf(\"TGA: found Original TGA\\n\");\n  }\n\n  if (fseek(fp, 0, SEEK_SET) ||\n      fread(&tgaHeader, sizeof(tgaHeader), 1, fp) != 1) {\n    sprintf(error, \"TGA: Cannot read header from \\\"%s\\\"\", name);\n    if (_verbose) printf(\"%s\\n\", error);\n    return NULL;\n  }\n\n  if (_verbose && tgaHeader.idLength) {\n    char *idString = (char*) malloc(tgaHeader.idLength);\n    \n    if (fread(idString, tgaHeader.idLength, 1, fp) != 1) {\n      sprintf(error, \"TGA: Cannot read ID field in \\\"%s\\\"\", name);\n      printf(\"%s\\n\", error);\n    } else {\n      printf(\"TGA: ID field: \\\"%*s\\\"\\n\", tgaHeader.idLength, idString);\n    }\n    free(idString);\n  } else {\n    /* Skip the image ID field. */\n    if (tgaHeader.idLength && fseek(fp, tgaHeader.idLength, SEEK_CUR)) {\n      sprintf(error, \"TGA: Cannot skip ID field in \\\"%s\\\"\", name);\n      if (_verbose) printf(\"%s\\n\", error);\n      return NULL;\n    }\n  }\n  \n  /* Reassemble the multi-byte values correctly, regardless of\n     host endianness. */\n  width = (tgaHeader.widthHi << 8) | tgaHeader.widthLo;\n  height = (tgaHeader.heightHi << 8) | tgaHeader.heightLo;\n  bpp = tgaHeader.bpp;\n  if (_verbose) {\n    printf(\"TGA: width=%d, height=%d, bpp=%d\\n\", width, height, bpp);\n  }\n\n  horzrev = tgaHeader.descriptor & TGA_DESC_HORIZONTAL;\n  vertrev = tgaHeader.descriptor & TGA_DESC_VERTICAL;\n  //vertrev=0;\n\n//   // JASON - we can force this stuff if we want\n//   if( hflip )\n//       horzrev = 1;\n  if( vflip )\n      vertrev = 1;\n\n  if (_verbose && horzrev) printf(\"TGA: horizontal reversed\\n\");\n  if (_verbose && vertrev) printf(\"TGA: vertical reversed\\n\");\n\n  rle = 0;\n  switch (tgaHeader.imageType) {\n  case TGA_TYPE_MAPPED_RLE:\n    rle = 1;\n    if (_verbose) printf(\"TGA: run-length encoded\\n\");\n  case TGA_TYPE_MAPPED:\n    /* Test for alpha channel. */\n    format = GL_COLOR_INDEX;\n    components = 1;\n    if (_verbose) {\n      printf(\"TGA: %d bit indexed image (%d bit palette)\\n\",\n        tgaHeader.colorMapSize, bpp);\n    }\n    break;\n\n  case TGA_TYPE_GRAY_RLE:\n    rle = 1;\n    if (_verbose) printf(\"TGA: run-length encoded\\n\");\n  case TGA_TYPE_GRAY:\n    format = GL_LUMINANCE;\n    components = 1;\n    if (_verbose) printf(\"TGA: %d bit grayscale image\\n\", bpp);\n    break;\n\n  case TGA_TYPE_COLOR_RLE:\n    rle = 1;\n    if (_verbose) printf(\"TGA: run-length encoded\\n\");\n  case TGA_TYPE_COLOR:\n    /* Test for alpha channel. */\n    if (bpp == 32) {\n      format = GL_BGRA_EXT;\n      components = 4;\n      if (_verbose) {\n        printf(\"TGA: %d bit color image with alpha channel\\n\", bpp);\n      }\n    } else {\n      format = GL_BGR_EXT;\n      components = 3;\n      if (_verbose) printf(\"TGA: %d bit color image\\n\", bpp);\n    }\n    break;\n\n  default:\n    sprintf(error,\n      \"TGA: unrecognized image type %d\\n\", tgaHeader.imageType);\n    if (_verbose) printf(\"%s\\n\", error);\n    return NULL;\n  }\n\n  if ((format == GL_BGRA_EXT && bpp != 32) ||\n      (format == GL_BGR_EXT && bpp != 24) ||\n      ((format == GL_LUMINANCE || format == GL_COLOR_INDEX) && bpp != 8)) {\n    /* FIXME: We haven't implemented bit-packed fields yet. */\n    fprintf(stderr, \"bpp %d, format %x\\n\", bpp, (unsigned int)format); \n    sprintf(error, \"TGA: channel sizes other than 8 bits are unimplemented\");\n    if (_verbose) printf(\"%s\\n\", error);\n    return NULL;\n  }\n\n  /* Check that we have a color map only when we need it. */\n  if (format == GL_COLOR_INDEX) {\n    if (tgaHeader.colorMapType != 1) {\n      sprintf(error, \"TGA: indexed image has invalid color map type %d\\n\",\n        tgaHeader.colorMapType);\n      if (_verbose) printf(\"%s\\n\", error);\n      return NULL;\n    }\n  } else if (tgaHeader.colorMapType != 0) {\n    sprintf(error, \"TGA: non-indexed image has invalid color map type %d\\n\",\n      tgaHeader.colorMapType);\n    if (_verbose) printf(\"%s\\n\", error);\n    return NULL;\n  }\n\n  if (tgaHeader.colorMapType == 1) {\n    /* We need to read in the colormap. */\n    index = (tgaHeader.colorMapIndexHi << 8) | tgaHeader.colorMapIndexLo;\n    length = (tgaHeader.colorMapLengthHi << 8) | tgaHeader.colorMapLengthLo;\n\n    if (_verbose) {\n      printf(\"TGA: reading color map (%d + %d) * (%d / 8)\\n\",\n        index, length, tgaHeader.colorMapSize);\n    }\n    if (length == 0) {\n      sprintf(error, \"TGA: invalid color map length %d\", length);\n      if (_verbose) printf(\"%s\\n\", error);\n      return NULL;\n    }\n    if (tgaHeader.colorMapSize != 24) {\n      /* We haven't implemented bit-packed fields yet. */\n      sprintf(error, \"TGA: channel sizes other than 8 bits are unimplemented\");\n      if (_verbose) printf(\"%s\\n\", error);\n      return NULL;\n    }\n\n    pelbytes = tgaHeader.colorMapSize / 8;\n    colors = length + index;\n    cmap = (GLubyte*)malloc (colors * pelbytes);\n\n    /* Zero the entries up to the beginning of the map. */\n    memset(cmap, 0, index * pelbytes);\n\n    /* Read in the rest of the colormap. */\n    if (fread(cmap, pelbytes, length, fp) != (size_t) length) {\n      sprintf(error, \"TGA: error reading colormap (ftell == %ld)\\n\",\n        ftell (fp));\n      if (_verbose) printf(\"%s\\n\", error);\n      return NULL;\n    }\n\n    if (pelbytes >= 3) {\n      /* Rearrange the colors from BGR to RGB. */\n      int tmp;\n      for (j = index; j < length * pelbytes; j += pelbytes) {\n        tmp = cmap[j];\n        cmap[j] = cmap[j + 2];\n        cmap[j + 2] = tmp;\n      }\n    }\n  } else {\n    colors = 0;\n    cmap = NULL;\n  }\n\n  /* Allocate the data. */\n  pelbytes = bpp / 8;\n  pixels = (unsigned char *) malloc (width * height * pelbytes);\n\n  if (rle) {\n    rleRec.statebuf = 0;\n    rleRec.statelen = 0;\n    rleRec.laststate = 0;\n    rleInfo = &rleRec;\n    myfread = rle_fread;\n  } else {\n    rleInfo = NULL;\n    myfread = std_fread;\n  }\n\n  wbytes = width * pelbytes;\n\n  if (vertrev) {\n    start = 0;\n    end = height;\n    dir = 1;\n  } else {\n    /* We need to reverse loading order of rows. */\n    start = height-1;\n    end = -1;\n    dir = -1;\n  }\n\n  for (i = start; i != end; i += dir) {\n    data = pixels + i*wbytes;\n\n    /* Suck in the data one row at a time. */\n    if (myfread(rleInfo, data, pelbytes, width, fp) != width) {\n      /* Probably premature end of file. */\n      if (_verbose) {\n        printf (\"TGA: error reading (ftell == %ld, width=%d)\\n\",\n          ftell(fp), width);\n      }\n      return NULL;\n    }  \n\n    if (horzrev) {\n      /* We need to mirror row horizontally. */\n      for (j = 0; j < width/2; j++) {\n        GLubyte tmp;\n\n        for (k = 0; k < pelbytes; k++) {\n          tmp = data[j*pelbytes+k];\n          data[j*pelbytes+k] = data[(width-j-1)*pelbytes+k];\n          data[(width-j-1)*pelbytes+k] = tmp;\n        }\n      }\n    }\n  }\n\n  if (rle) {\n    free(rleInfo->statebuf);\n  }\n\n  if (fgetc (fp) != EOF) {\n    if (_verbose) printf (\"TGA: too much input data, ignoring extra...\\n\");\n  }\n\n  genericImage = (igl::opengl::gliGenericImage*) malloc(sizeof(igl::opengl::gliGenericImage));\n  genericImage->width = width;\n  genericImage->height = height;\n  genericImage->format = format;\n  genericImage->components = components;\n  genericImage->cmapEntries = colors;\n  genericImage->cmapFormat = GL_BGR_EXT;  // XXX fix me\n  genericImage->cmap = cmap;\n  genericImage->pixels = pixels;\n\n  return genericImage;\n}\n\nIGL_INLINE int igl::opengl::gli_verbose(int new_verbose)\n{\n  _verbose = new_verbose;\n  return _verbose;\n}\n\n\n\n// added 10/2005, Denis Zorin\n// a very simple TGA output, supporting \n// uncompressed luminance RGB and RGBA \n// G22.2270 students: this is C (no C++) \n// so this is not the style I would encourage\n// you to use; I used it for consistency \n// with the rest of the code in this file \n\n\n// fixed header values for the subset of TGA we use for writing\nunsigned char TGAHeaderColor[12] = \n  { 0,// 0 ID length = no id\n    0,// 1 color map type = no color map\n    2,// 2 image type = uncompressed true color\n    0, 0, 0, 0, 0,// color map spec = empty\n    0, 0,  // x origin of image \n    0, 0   // y origin of image\n  };\n\nunsigned char TGAHeaderBW[12] = \n  { 0,// 0 ID length = no id\n    0,// 1 color map type = no color map\n    3,// 3 image type = uncompressed black and white\n    0, 0, 0, 0, 0,// color map spec = empty\n    0, 0,  // x origin of image \n    0, 0   // y origin of image\n  };\n\n// this makes sure that \n// image size is written in correct format \n// and byte order (least first)\nIGL_INLINE void write16bit(int n, FILE* fp) { \n  unsigned char bytes[] = { static_cast<unsigned char>(n % 256), static_cast<unsigned char>(n / 256) };\n  fwrite(bytes, 2, sizeof(unsigned char),fp);\n}\n\n\n\nIGL_INLINE void igl::opengl::writeTGA( igl::opengl::gliGenericImage* image, FILE *fp) {\n\n  assert(!image->cmap); // we do not deal with color map images\n    \n  if(image->components == 3 || image->components == 4) \n    fwrite(TGAHeaderColor, 12, sizeof(unsigned char),fp);\n  else { \n    if(image->components == 1 ) \n      fwrite(TGAHeaderBW, 12, sizeof(unsigned char),fp);        \n    else { fprintf(stderr,\"Supported component number: 1,3 or 4\\n\"); exit(1); }\n  }\n\n  write16bit(image->width,fp);  \n  write16bit(image->height,fp);  \n  switch (image->components ) { \n  case 1: \n    putc(8,fp);\n    break;\n  case 3: \n    putc(24,fp); \n    break;\n  case 4:\n    putc(32,fp);\n    break;\n  default: fprintf(stderr,\"Supported component number: 1,3 or 4\\n\"); exit(1); \n  };\n  \n  if(image-> components == 4) \n    putc(0x04,fp); // bottom left image (0x00) + 8 bit alpha (0x4)\n  else \n    putc(0x00,fp);\n\n  fwrite(image->pixels, image->height*image->width*image->components, sizeof(char),fp);\n}\n\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/tga.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\r\n// \r\n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\r\n// \r\n// This Source Code Form is subject to the terms of the Mozilla Public License \r\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \r\n// obtain one at http://mozilla.org/MPL/2.0/.\r\n#ifndef IGL_OPENGL_TGA_H\r\n#define IGL_OPENGL_TGA_H\r\n#include \"../igl_inline.h\"\r\n\r\n#include \"gl.h\"\r\n// See license in tga.cpp\r\n/* tga.h - interface for TrueVision (TGA) image file loader */\r\n#include <stdio.h>\r\n#ifdef _WIN32\r\n#include <windows.h>\r\n#endif\r\n\r\nnamespace igl\r\n{\r\nnamespace opengl\r\n{\r\n\r\ntypedef struct {\r\n\r\n  GLsizei  width;\r\n  GLsizei  height;\r\n  GLint    components;\r\n  GLenum   format;\r\n\r\n  GLsizei  cmapEntries;\r\n  GLenum   cmapFormat;\r\n  GLubyte *cmap;\r\n\r\n  GLubyte *pixels;\r\n  \r\n} gliGenericImage;\r\n\r\ntypedef struct {\r\n  unsigned char idLength;\r\n  unsigned char colorMapType;\r\n\r\n  /* The image type. */\r\n#define TGA_TYPE_MAPPED 1\r\n#define TGA_TYPE_COLOR 2\r\n#define TGA_TYPE_GRAY 3\r\n#define TGA_TYPE_MAPPED_RLE 9\r\n#define TGA_TYPE_COLOR_RLE 10\r\n#define TGA_TYPE_GRAY_RLE 11\r\n  unsigned char imageType;\r\n\r\n  /* Color Map Specification. */\r\n  /* We need to separately specify high and low bytes to avoid endianness\r\n     and alignment problems. */\r\n  unsigned char colorMapIndexLo, colorMapIndexHi;\r\n  unsigned char colorMapLengthLo, colorMapLengthHi;\r\n  unsigned char colorMapSize;\r\n\r\n  /* Image Specification. */\r\n  unsigned char xOriginLo, xOriginHi;\r\n  unsigned char yOriginLo, yOriginHi;\r\n\r\n  unsigned char widthLo, widthHi;\r\n  unsigned char heightLo, heightHi;\r\n\r\n  unsigned char bpp;\r\n\r\n  /* Image descriptor.\r\n     3-0: attribute bpp\r\n     4:   left-to-right ordering\r\n     5:   top-to-bottom ordering\r\n     7-6: zero\r\n     */\r\n#define TGA_DESC_ABITS 0x0f\r\n#define TGA_DESC_HORIZONTAL 0x10\r\n#define TGA_DESC_VERTICAL 0x20\r\n  unsigned char descriptor;\r\n\r\n} TgaHeader;\r\n\r\ntypedef struct {\r\n  unsigned int extensionAreaOffset;\r\n  unsigned int developerDirectoryOffset;\r\n#define TGA_SIGNATURE \"TRUEVISION-XFILE\"\r\n  char signature[16];\r\n  char dot;\r\n  char null;\r\n} TgaFooter;\r\n\r\nIGL_INLINE extern gliGenericImage *gliReadTGA(FILE *fp, char *name, int hflip, int vflip);\r\nIGL_INLINE int gli_verbose(int new_verbose);\r\nIGL_INLINE extern int gliVerbose(int newVerbose);\r\n\r\nIGL_INLINE void writeTGA( gliGenericImage* image, FILE *fp);\r\n\r\n\r\n\r\n} // end of igl namespace\r\n}\r\n\r\n#ifndef IGL_STATIC_LIBRARY\r\n#  include \"tga.cpp\"\r\n#endif\r\n\r\n#endif \r\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/unproject.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"unproject.h\"\n#include \"model_proj_viewport.h\"\n#include \"../unproject.h\"\n#include \"gl.h\"\n\n#include <Eigen/Dense>\n#include <Eigen/LU>\n\nIGL_INLINE void igl::opengl2::unproject(\n  const double winX,\n  const double winY,\n  const double winZ,\n  double* objX,\n  double* objY,\n  double* objZ)\n{\n  Eigen::Vector3d obj;\n  igl::opengl2::unproject(Eigen::Vector3d(winX,winY,winZ),obj);\n  *objX = obj(0);\n  *objY = obj(1);\n  *objZ = obj(2);\n}\n\ntemplate <typename Derivedwin, typename Derivedobj>\nIGL_INLINE void igl::opengl2::unproject(\n  const Eigen::PlainObjectBase<Derivedwin> & win,\n  Eigen::PlainObjectBase<Derivedobj> & obj)\n{\n  const auto ret = igl::opengl2::unproject(win);\n  obj = ret.template cast<typename Derivedobj::Scalar>();\n}\n\n\ntemplate <typename Derivedwin>\nIGL_INLINE Derivedwin igl::opengl2::unproject(\n  const Eigen::PlainObjectBase<Derivedwin> & win)\n{\n  using namespace Eigen;\n  typedef typename Derivedwin::Scalar Scalar;\n  Matrix4d MV,P;\n  Vector4d VPd;\n  model_proj_viewport(MV,P,VPd);\n  Vector3d wind = win.template cast<double>();\n  Vector3d objd = igl::unproject(wind,MV,P,VPd);\n  return objd.template cast<Scalar>();\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::opengl2::unproject<Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<float, 3, 1, 0, 3, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 1, 0, 3, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, 3, 1, 0, 3, 1> >&);\ntemplate void igl::opengl2::unproject<Eigen::Matrix<float, 3, 1, 0, 3, 1>, Eigen::Matrix<float, 3, 1, 0, 3, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<float, 3, 1, 0, 3, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, 3, 1, 0, 3, 1> >&);\ntemplate Eigen::Matrix<float, 3, 1, 0, 3, 1> igl::opengl2::unproject<Eigen::Matrix<float, 3, 1, 0, 3, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<float, 3, 1, 0, 3, 1> > const&);\ntemplate Eigen::Matrix<double, 3, 1, 0, 3, 1> igl::opengl2::unproject<Eigen::Matrix<double, 3, 1, 0, 3, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 1, 0, 3, 1> > const&);\ntemplate void igl::opengl2::unproject<Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 1, 0, 3, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 1, 0, 3, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/unproject.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL2_UNPROJECT_H\n#define IGL_OPENGL2_UNPROJECT_H\n#include \"../igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  namespace opengl2\n  {\n    // Wrapper for gluUnproject that uses the current GL_MODELVIEW_MATRIX,\n    // GL_PROJECTION_MATRIX, and GL_VIEWPORT\n    // Inputs:\n    //   win*  screen space x, y, and z coordinates respectively\n    // Outputs:\n    //   obj*  pointers to 3D objects' x, y, and z coordinates respectively\n    // Returns return value of gluUnProject call\n    IGL_INLINE void unproject(\n      const double winX,\n      const double winY,\n      const double winZ,\n      double* objX,\n      double* objY,\n      double* objZ);\n    template <typename Derivedwin, typename Derivedobj>\n    IGL_INLINE void unproject(\n      const Eigen::PlainObjectBase<Derivedwin> & win,\n      Eigen::PlainObjectBase<Derivedobj> & obj);\n    template <typename Derivedwin>\n    IGL_INLINE Derivedwin unproject(\n      const Eigen::PlainObjectBase<Derivedwin> & win);\n  }\n}\n\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"unproject.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/unproject_to_zero_plane.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"unproject_to_zero_plane.h\"\n\n#include \"gl.h\"\n\n#include \"project.h\"\n#include \"unproject.h\"\n\nIGL_INLINE void igl::opengl2::unproject_to_zero_plane(\n  const double winX,\n  const double winY,\n  double* objX,\n  double* objY,\n  double* objZ)\n{\n  double winOrigin[3]; \n  igl::opengl2::project(0,0,0,&winOrigin[0],&winOrigin[1],&winOrigin[2]);\n  return igl::opengl2::unproject(winX, winY, winOrigin[2], objX, objY, objZ);\n}\n\ntemplate <typename Derivedwin, typename Derivedobj>\nIGL_INLINE void igl::opengl2::unproject_to_zero_plane(\n  const Eigen::PlainObjectBase<Derivedwin> & win,\n  Eigen::PlainObjectBase<Derivedobj> & obj)\n{\n  return unproject_to_zero_plane(win(0),win(1),\n      &obj.data()[0],\n      &obj.data()[1],\n      &obj.data()[2]);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::opengl2::unproject_to_zero_plane<Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 1, 0, 3, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 1, 0, 3, 1> >&);\ntemplate void igl::opengl2::unproject_to_zero_plane<Eigen::Matrix<double, 2, 1, 0, 2, 1>, Eigen::Matrix<double, 1, 3, 1, 1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 1, 0, 2, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> >&);\ntemplate void igl::opengl2::unproject_to_zero_plane<Eigen::Matrix<double, 2, 1, 0, 2, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 1, 0, 2, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 1, 0, 3, 1> >&);\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/unproject_to_zero_plane.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL2_UNPROJECT_TO_ZERO_PLANE_H\n#define IGL_OPENGL2_UNPROJECT_TO_ZERO_PLANE_H\n#include \"../igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  namespace opengl2\n  {\n  // Wrapper for gluUnproject that uses the current GL_MODELVIEW_MATRIX,\n    // GL_PROJECTION_MATRIX, and GL_VIEWPORT to unproject a screen postion\n    // (winX,winY) to a 3d location at same depth as the current origin.\n    // Inputs:\n    //   win*  screen space x, y, and z coordinates respectively\n    // Outputs:\n    //   obj*  pointers to 3D objects' x, y, and z coordinates respectively\n    // Returns return value of gluUnProject call\n    IGL_INLINE void unproject_to_zero_plane(\n      const double winX,\n      const double winY,\n      double* objX,\n      double* objY,\n      double* objZ);\n    template <typename Derivedwin, typename Derivedobj>\n    IGL_INLINE void unproject_to_zero_plane(\n      const Eigen::PlainObjectBase<Derivedwin> & win,\n      Eigen::PlainObjectBase<Derivedobj> & obj);\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"unproject_to_zero_plane.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/up_axis.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"up_axis.h\"\n#include \"gl.h\"\n\nIGL_INLINE void igl::opengl2::up_axis(double * x, double * y, double * z)\n{\n  double mv[16];\n  glGetDoublev(GL_MODELVIEW_MATRIX, mv);\n  igl::opengl2::up_axis(mv,x,y,z);\n}\n\nIGL_INLINE void igl::opengl2::up_axis(const double *mv, double * x, double * y, double * z)\n{\n  *x = -mv[0*4+1];\n  *y = -mv[1*4+1];\n  *z = -mv[2*4+1];\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/up_axis.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL2_UP_AXIS_H\n#define IGL_OPENGL2_UP_AXIS_H \n#include \"../igl_inline.h\"\nnamespace igl\n{\n  namespace opengl2\n  {\n    // Determines the up axis or depth axis of the current gl matrix\n    // Outputs:\n    //   x  pointer to x-coordinate in scene coordinates of the un-normalized\n    //     up axis \n    //   y  pointer to y-coordinate in scene coordinates of the un-normalized\n    //     up axis \n    //   z  pointer to z-coordinate in scene coordinates of the un-normalized\n    //     up axis\n      //   mv pointer to modelview matrix\n    //\n    // Note: Up axis is returned *UN-normalized*\n    IGL_INLINE void up_axis(double * x, double * y, double * z);\n    IGL_INLINE void up_axis(const double * mv, double * x, double * y, double * z);\n  }\n};\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"up_axis.cpp\"\n#endif\n#endif\n\n\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/view_axis.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"view_axis.h\"\n#include \"gl.h\"\n\nIGL_INLINE void igl::opengl2::view_axis(double * x, double * y, double * z)\n{\n  double mv[16];\n  glGetDoublev(GL_MODELVIEW_MATRIX, mv);\n  igl::opengl2::view_axis(mv,x,y,z);\n}\n\nIGL_INLINE void igl::opengl2::view_axis(const double * mv, double * x, double * y, double * z)\n{\n  *x = -mv[0*4+2];\n  *y = -mv[1*4+2];\n  *z = -mv[2*4+2];\n}\n\ntemplate <typename DerivedV>\nIGL_INLINE void igl::opengl2::view_axis(Eigen::PlainObjectBase<DerivedV> & V)\n{\n  double x,y,z;\n  view_axis(&x,&y,&z);\n  V(0) = x;\n  V(1) = y;\n  V(2) = z;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::opengl2::view_axis<Eigen::Matrix<double, 3, 1, 0, 3, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 1, 0, 3, 1> >&);\ntemplate void igl::opengl2::view_axis<Eigen::Matrix<double, 1, 3, 1, 1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/opengl2/view_axis.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OPENGL2_VIEW_AXIS_H\n#define IGL_OPENGL2_VIEW_AXIS_H \n#include \"../igl_inline.h\"\n#include <Eigen/Core>\n\nnamespace igl\n{\n  namespace opengl2\n  {\n    // Determines the view axis or depth axis of the current gl matrix\n    // Inputs:\n    //   mv pointer to modelview matrix\n    // Outputs:\n    //   x  pointer to x-coordinate in scene coordinates of the un-normalized\n    //     viewing axis \n    //   y  pointer to y-coordinate in scene coordinates of the un-normalized\n    //     viewing axis \n    //   z  pointer to z-coordinate in scene coordinates of the un-normalized\n    //     viewing axis\n    //\n    // Note: View axis is returned *UN-normalized*\n    IGL_INLINE void view_axis(const double * mv, double * x, double * y, double * z);\n    // Extract mv from current GL state.\n    IGL_INLINE void view_axis(double * x, double * y, double * z);\n    template <typename DerivedV>\n    IGL_INLINE void view_axis(Eigen::PlainObjectBase<DerivedV> & V);\n  }\n};\n\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"view_axis.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/orient_outward.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"orient_outward.h\"\n#include \"per_face_normals.h\"\n#include \"barycenter.h\"\n#include \"doublearea.h\"\n#include <iostream>\n\ntemplate <\n  typename DerivedV, \n  typename DerivedF, \n  typename DerivedC, \n  typename DerivedFF, \n  typename DerivedI>\nIGL_INLINE void igl::orient_outward(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  const Eigen::PlainObjectBase<DerivedC> & C,\n  Eigen::PlainObjectBase<DerivedFF> & FF,\n  Eigen::PlainObjectBase<DerivedI> & I)\n{\n  using namespace Eigen;\n  using namespace std;\n  assert(C.rows() == F.rows());\n  assert(F.cols() == 3);\n  assert(V.cols() == 3);\n\n  // number of faces\n  const int m = F.rows();\n  // number of patches\n  const int num_cc = C.maxCoeff()+1;\n  I.resize(num_cc);\n  if(&FF != &F)\n  {\n    FF = F;\n  }\n  DerivedV N,BC,BCmean;\n  Matrix<typename DerivedV::Scalar,Dynamic,1> A;\n  VectorXd totA(num_cc), dot(num_cc);\n  Matrix<typename DerivedV::Scalar,3,1> Z(1,1,1);\n  per_face_normals(V,F,Z.normalized(),N);\n  barycenter(V,F,BC);\n  doublearea(V,F,A);\n  BCmean.setConstant(num_cc,3,0);\n  dot.setConstant(num_cc,1,0);\n  totA.setConstant(num_cc,1,0);\n  // loop over faces\n  for(int f = 0;f<m;f++)\n  {\n    BCmean.row(C(f)) += A(f)*BC.row(f);\n    totA(C(f))+=A(f);\n  }\n  // take area weighted average\n  for(int c = 0;c<num_cc;c++)\n  {\n    BCmean.row(c) /= (typename DerivedV::Scalar) totA(c);\n  }\n  // subtract bcmean\n  for(int f = 0;f<m;f++)\n  {\n    BC.row(f) -= BCmean.row(C(f));\n    dot(C(f)) += A(f)*N.row(f).dot(BC.row(f));\n  }\n  // take area weighted average\n  for(int c = 0;c<num_cc;c++)\n  {\n    dot(c) /= (typename DerivedV::Scalar) totA(c);\n    if(dot(c) < 0)\n    {\n      I(c) = true;\n    }else\n    {\n      I(c) = false;\n    }\n  }\n  // flip according to I\n  for(int f = 0;f<m;f++)\n  {\n    if(I(C(f)))\n    {\n      FF.row(f) = FF.row(f).reverse().eval();\n    }\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::orient_outward<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/orient_outward.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_ORIENT_OUTWARD_H\n#define IGL_ORIENT_OUTWARD_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Orient each component (identified by C) of a mesh (V,F) so the normals on\n  // average point away from the patch's centroid.\n  //\n  // Inputs:\n  //   V  #V by 3 list of vertex positions\n  //   F  #F by 3 list of triangle indices\n  //   C  #F list of components (output of orientable_patches)\n  // Outputs:\n  //   FF  #F by 3 list of new triangle indices such that FF(~I,:) = F(~I,:) and\n  //     FF(I,:) = fliplr(F(I,:)) (OK if &FF = &F)\n  //   I  max(C)+1 list of whether face has been flipped\n  template <\n    typename DerivedV, \n    typename DerivedF, \n    typename DerivedC, \n    typename DerivedFF, \n    typename DerivedI>\n  IGL_INLINE void orient_outward(\n    const Eigen::PlainObjectBase<DerivedV> & V,\n    const Eigen::PlainObjectBase<DerivedF> & F,\n    const Eigen::PlainObjectBase<DerivedC> & C,\n    Eigen::PlainObjectBase<DerivedFF> & FF,\n    Eigen::PlainObjectBase<DerivedI> & I);\n};\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"orient_outward.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/orientable_patches.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"orientable_patches.h\"\n#include \"components.h\"\n#include \"sort.h\"\n#include \"unique.h\"\n#include <vector>\n#include <iostream>\n\ntemplate <typename DerivedF, typename DerivedC, typename AScalar>\nIGL_INLINE void igl::orientable_patches(\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  Eigen::PlainObjectBase<DerivedC> & C,\n  Eigen::SparseMatrix<AScalar> & A)\n{\n  using namespace Eigen;\n  using namespace std;\n\n  // simplex size\n  assert(F.cols() == 3);\n\n  // List of all \"half\"-edges: 3*#F by 2\n  Matrix<typename DerivedF::Scalar, Dynamic, 2> allE,sortallE,uE;\n  allE.resize(F.rows()*3,2);\n  Matrix<int,Dynamic,2> IX;\n  VectorXi IA,IC;\n  allE.block(0*F.rows(),0,F.rows(),1) = F.col(1);\n  allE.block(0*F.rows(),1,F.rows(),1) = F.col(2);\n  allE.block(1*F.rows(),0,F.rows(),1) = F.col(2);\n  allE.block(1*F.rows(),1,F.rows(),1) = F.col(0);\n  allE.block(2*F.rows(),0,F.rows(),1) = F.col(0);\n  allE.block(2*F.rows(),1,F.rows(),1) = F.col(1);\n  // Sort each row\n  sort(allE,2,true,sortallE,IX);\n  //IC(i) tells us where to find sortallE(i,:) in uE: \n  // so that sortallE(i,:) = uE(IC(i),:)\n  unique_rows(sortallE,uE,IA,IC);\n  // uE2FT(e,f) = 1 means face f is adjacent to unique edge e\n  vector<Triplet<AScalar> > uE2FTijv(IC.rows());\n  for(int e = 0;e<IC.rows();e++)\n  {\n    uE2FTijv[e] = Triplet<AScalar>(e%F.rows(),IC(e),1);\n  }\n  SparseMatrix<AScalar> uE2FT(F.rows(),uE.rows());\n  uE2FT.setFromTriplets(uE2FTijv.begin(),uE2FTijv.end());\n  // kill non-manifold edges\n  for(int j=0; j<(int)uE2FT.outerSize();j++)\n  {\n    int degree = 0;\n    for(typename SparseMatrix<AScalar>::InnerIterator it (uE2FT,j); it; ++it)\n    {\n      degree++;\n    }\n    // Iterate over inside\n    if(degree > 2)\n    {\n      for(typename SparseMatrix<AScalar>::InnerIterator it (uE2FT,j); it; ++it)\n      {\n        uE2FT.coeffRef(it.row(),it.col()) = 0;\n      }\n    }\n  }\n  // Face-face Adjacency matrix\n  SparseMatrix<AScalar> uE2F;\n  uE2F = uE2FT.transpose().eval();\n  A = uE2FT*uE2F;\n  // All ones\n  for(int j=0; j<A.outerSize();j++)\n  {\n    // Iterate over inside\n    for(typename SparseMatrix<AScalar>::InnerIterator it (A,j); it; ++it)\n    {\n      if(it.value() > 1)\n      {\n        A.coeffRef(it.row(),it.col()) = 1;\n      }\n    }\n  }\n  //% Connected components are patches\n  //%C = components(A); % alternative to graphconncomp from matlab_bgl\n  //[~,C] = graphconncomp(A);\n  // graph connected components \n  components(A,C);\n\n}\n\ntemplate <typename DerivedF, typename DerivedC>\nIGL_INLINE void igl::orientable_patches(\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  Eigen::PlainObjectBase<DerivedC> & C)\n{\n  Eigen::SparseMatrix<typename DerivedF::Scalar> A;\n  return orientable_patches(F,C,A);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::orientable_patches<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, int>(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::SparseMatrix<int, 0, int>&);\ntemplate void igl::orientable_patches<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/orientable_patches.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_ORIENTABLE_PATCHES_H\n#define IGL_ORIENTABLE_PATCHES_H\n#include <igl/igl_inline.h>\n#include <Eigen/Core>\n#include <Eigen/Sparse>\nnamespace igl\n{\n  //  Compute connected components of facets connected by manifold edges.\n  // \n  //  Known bugs: This will detect a moebius strip as a single patch (manifold,\n  //  non-orientable) and also non-manfiold, yet orientable patches. \n  // \n  //  Q: Does this find exactly (manifold || orientable) patches?\n  // \n  //  Inputs:\n  //    F  #F by simplex-size list of facets\n  //  Outputs:\n  //    C  #F list of component ids\n  //    A  #F by #F adjacency matrix\n  // \n  template <typename DerivedF, typename DerivedC, typename AScalar>\n  IGL_INLINE void orientable_patches(\n    const Eigen::PlainObjectBase<DerivedF> & F,\n    Eigen::PlainObjectBase<DerivedC> & C,\n    Eigen::SparseMatrix<AScalar> & A);\n  template <typename DerivedF, typename DerivedC>\n  IGL_INLINE void orientable_patches(\n    const Eigen::PlainObjectBase<DerivedF> & F,\n    Eigen::PlainObjectBase<DerivedC> & C);\n};\n#ifndef IGL_STATIC_LIBRARY\n#  include \"orientable_patches.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/orth.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"orth.h\"\n\n// Broken Implementation\nIGL_INLINE void igl::orth(const Eigen::MatrixXd &A, Eigen::MatrixXd &Q)\n{\n\n  //perform svd on A = U*S*V' (V is not computed and only the thin U is computed)\n  Eigen::JacobiSVD<Eigen::MatrixXd> svd(A, Eigen::ComputeThinU );\n  Eigen::MatrixXd U = svd.matrixU();\n  const Eigen::VectorXd S = svd.singularValues();\n  \n  //get rank of A\n  int m = A.rows();\n  int n = A.cols();\n  double tol = std::max(m,n) * S.maxCoeff() *  2.2204e-16;\n  int r = 0;\n  for (int i = 0; i < S.rows(); ++r,++i)\n  {\n    if (S[i] < tol)\n      break;\n  }\n  \n  //keep r first columns of U\n  Q = U.block(0,0,U.rows(),r);\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/orth.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_ORTH_H\n#define IGL_ORTH_H\n\n#include \"igl_inline.h\"\n#include <Eigen/Dense>\n\nnamespace igl\n{\n  //  ORTH   Orthogonalization.\n  //     ORTH(A,Q) produces Q as an orthonormal basis for the range of A.\n  //     That is, Q'*Q = I, the columns of Q span the same space as \n  //     the columns of A, and the number of columns of Q is the \n  //     rank of A.\n  //  \n  //  \n  //   The algorithm  uses singular value decomposition, SVD, instead of orthogonal\n  //   factorization, QR.  This doubles the computation time, but\n  //   provides more reliable and consistent rank determination.\n  //   Closely follows MATLAB implementation in orth.m\n  //\n  // Inputs:\n  //   A  m by n matrix \n  // Outputs:\n  //   Q  m by n matrix with orthonormal columns spanning same column space as\n  //     A\n  //  \n  // Known bugs: Implementation listed as \"Broken\"\n  IGL_INLINE void orth(const Eigen::MatrixXd &A, Eigen::MatrixXd &Q);\n}\n\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"orth.cpp\"\n#endif\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/ortho.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"ortho.h\"\n\ntemplate < typename DerivedP>\nIGL_INLINE void igl::ortho(\n  const typename DerivedP::Scalar left,\n  const typename DerivedP::Scalar right,\n  const typename DerivedP::Scalar bottom,\n  const typename DerivedP::Scalar top,\n  const typename DerivedP::Scalar nearVal,\n  const typename DerivedP::Scalar farVal,\n  Eigen::PlainObjectBase<DerivedP> & P)\n{\n  P.setIdentity();\n  P(0,0) = 2. / (right - left);\n  P(1,1) = 2. / (top - bottom);\n  P(2,2) = - 2./ (farVal - nearVal);\n  P(0,3) = - (right + left) / (right - left);\n  P(1,3) = - (top + bottom) / (top - bottom);\n  P(2,3) = - (farVal + nearVal) / (farVal - nearVal);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::ortho<Eigen::Matrix<float, 4, 4, 0, 4, 4> >(Eigen::Matrix<float, 4, 4, 0, 4, 4>::Scalar, Eigen::Matrix<float, 4, 4, 0, 4, 4>::Scalar, Eigen::Matrix<float, 4, 4, 0, 4, 4>::Scalar, Eigen::Matrix<float, 4, 4, 0, 4, 4>::Scalar, Eigen::Matrix<float, 4, 4, 0, 4, 4>::Scalar, Eigen::Matrix<float, 4, 4, 0, 4, 4>::Scalar, Eigen::PlainObjectBase<Eigen::Matrix<float, 4, 4, 0, 4, 4> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/ortho.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_ORTHO_H\n#define IGL_ORTHO_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Dense>\n\nnamespace igl \n{\n  // Implementation of the deprecated glOrtho function.\n  //\n  // Inputs:\n  //   left  coordinate of left vertical clipping plane\n  //   right  coordinate of right vertical clipping plane\n  //   bottom  coordinate of bottom vertical clipping plane\n  //   top  coordinate of top vertical clipping plane\n  //   nearVal  distance to near plane\n  //   farVal  distance to far plane\n  // Outputs:\n  //   P  4x4 perspective matrix\n  template < typename DerivedP>\n  IGL_INLINE void ortho(\n    const typename DerivedP::Scalar left,\n    const typename DerivedP::Scalar right,\n    const typename DerivedP::Scalar bottom,\n    const typename DerivedP::Scalar top,\n    const typename DerivedP::Scalar nearVal,\n    const typename DerivedP::Scalar farVal,\n    Eigen::PlainObjectBase<DerivedP> & P);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"ortho.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/outer_element.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Qingnan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"outer_element.h\"\n#include <iostream>\n#include <vector>\n\ntemplate <\n     typename DerivedV,\n     typename DerivedF,\n     typename DerivedI,\n     typename IndexType,\n     typename DerivedA\n     >\nIGL_INLINE void igl::outer_vertex(\n        const Eigen::PlainObjectBase<DerivedV> & V,\n        const Eigen::PlainObjectBase<DerivedF> & F,\n        const Eigen::PlainObjectBase<DerivedI> & I,\n        IndexType & v_index,\n        Eigen::PlainObjectBase<DerivedA> & A)\n{\n    // Algorithm: \n    //    Find an outer vertex (i.e. vertex reachable from infinity)\n    //    Return the vertex with the largest X value.\n    //    If there is a tie, pick the one with largest Y value.\n    //    If there is still a tie, pick the one with the largest Z value.\n    //    If there is still a tie, then there are duplicated vertices within the\n    //    mesh, which violates the precondition.\n    typedef typename DerivedF::Scalar Index;\n    const Index INVALID = std::numeric_limits<Index>::max();\n    const size_t num_selected_faces = I.rows();\n    std::vector<size_t> candidate_faces;\n    Index outer_vid = INVALID;\n    typename DerivedV::Scalar outer_val = 0;\n    for (size_t i=0; i<num_selected_faces; i++)\n    {\n        size_t f = I(i);\n        for (size_t j=0; j<3; j++)\n        {\n            Index v = F(f, j);\n            auto vx = V(v, 0);\n            if (outer_vid == INVALID || vx > outer_val)\n            {\n                outer_val = vx;\n                outer_vid = v;\n                candidate_faces = {f};\n            } else if (v == outer_vid)\n            {\n                candidate_faces.push_back(f);\n            } else if (vx == outer_val)\n            {\n                // Break tie.\n                auto vy = V(v,1);\n                auto vz = V(v, 2);\n                auto outer_y = V(outer_vid, 1);\n                auto outer_z = V(outer_vid, 2);\n                assert(!(vy == outer_y && vz == outer_z));\n                bool replace = (vy > outer_y) ||\n                    ((vy == outer_y) && (vz > outer_z));\n                if (replace)\n                {\n                    outer_val = vx;\n                    outer_vid = v;\n                    candidate_faces = {f};\n                }\n            }\n        }\n    }\n\n    assert(outer_vid != INVALID);\n    assert(candidate_faces.size() > 0);\n    v_index = outer_vid;\n    A.resize(candidate_faces.size());\n    std::copy(candidate_faces.begin(), candidate_faces.end(), A.data());\n}\n\ntemplate<\n    typename DerivedV,\n    typename DerivedF,\n    typename DerivedI,\n    typename IndexType,\n    typename DerivedA\n    >\nIGL_INLINE void igl::outer_edge(\n        const Eigen::PlainObjectBase<DerivedV> & V,\n        const Eigen::PlainObjectBase<DerivedF> & F,\n        const Eigen::PlainObjectBase<DerivedI> & I,\n        IndexType & v1,\n        IndexType & v2,\n        Eigen::PlainObjectBase<DerivedA> & A) {\n    // Algorithm:\n    //    Find an outer vertex first.\n    //    Find the incident edge with largest abs slope when projected onto XY plane.\n    //    If there is a tie, check the signed slope and use the positive one.\n    //    If there is still a tie, break it using the projected slope onto ZX plane.\n    //    If there is still a tie, again check the signed slope and use the positive one.\n    //    If there is still a tie, then there are multiple overlapping edges,\n    //    which violates the precondition.\n    typedef typename DerivedV::Scalar Scalar;\n    typedef typename DerivedV::Index Index;\n    typedef typename Eigen::Matrix<Scalar, 3, 1> ScalarArray3;\n    typedef typename Eigen::Matrix<typename DerivedF::Scalar, 3, 1> IndexArray3;\n    const Index INVALID = std::numeric_limits<Index>::max();\n\n    Index outer_vid;\n    Eigen::Matrix<Index,Eigen::Dynamic,1> candidate_faces;\n    outer_vertex(V, F, I, outer_vid, candidate_faces);\n    const ScalarArray3& outer_v = V.row(outer_vid);\n    assert(candidate_faces.size() > 0);\n\n    auto get_vertex_index = [&](const IndexArray3& f, Index vid) -> Index \n    {\n        if (f[0] == vid) return 0;\n        if (f[1] == vid) return 1;\n        if (f[2] == vid) return 2;\n        assert(false);\n        return -1;\n    };\n\n    auto unsigned_value = [](Scalar v) -> Scalar {\n        if (v < 0) return v * -1;\n        else return v;\n    };\n\n    Scalar outer_slope_YX = 0;\n    Scalar outer_slope_ZX = 0;\n    Index outer_opp_vid = INVALID;\n    bool infinite_slope_detected = false;\n    std::vector<Index> incident_faces;\n    auto check_and_update_outer_edge = [&](Index opp_vid, Index fid) {\n        if (opp_vid == outer_opp_vid)\n        {\n            incident_faces.push_back(fid);\n            return;\n        }\n\n        const ScalarArray3 opp_v = V.row(opp_vid);\n        if (!infinite_slope_detected && outer_v[0] != opp_v[0])\n        {\n            // Finite slope\n            const ScalarArray3 diff = opp_v - outer_v;\n            const Scalar slope_YX = diff[1] / diff[0];\n            const Scalar slope_ZX = diff[2] / diff[0];\n            const Scalar u_slope_YX = unsigned_value(slope_YX);\n            const Scalar u_slope_ZX = unsigned_value(slope_ZX);\n            bool update = false;\n            if (outer_opp_vid == INVALID) {\n                update = true;\n            } else {\n                const Scalar u_outer_slope_YX = unsigned_value(outer_slope_YX);\n                if (u_slope_YX > u_outer_slope_YX) {\n                    update = true;\n                } else if (u_slope_YX == u_outer_slope_YX &&\n                        slope_YX > outer_slope_YX) {\n                    update = true;\n                } else if (slope_YX == outer_slope_YX) {\n                    const Scalar u_outer_slope_ZX =\n                        unsigned_value(outer_slope_ZX);\n                    if (u_slope_ZX > u_outer_slope_ZX) {\n                        update = true;\n                    } else if (u_slope_ZX == u_outer_slope_ZX &&\n                            slope_ZX > outer_slope_ZX) {\n                        update = true;\n                    } else if (slope_ZX == u_outer_slope_ZX) {\n                        assert(false);\n                    }\n                }\n            }\n\n            if (update) {\n                outer_opp_vid = opp_vid;\n                outer_slope_YX = slope_YX;\n                outer_slope_ZX = slope_ZX;\n                incident_faces = {fid};\n            }\n        } else if (!infinite_slope_detected)\n        {\n            // Infinite slope\n            outer_opp_vid = opp_vid;\n            infinite_slope_detected = true;\n            incident_faces = {fid};\n        }\n    };\n\n    const size_t num_candidate_faces = candidate_faces.size();\n    for (size_t i=0; i<num_candidate_faces; i++)\n    {\n        const Index fid = candidate_faces(i);\n        const IndexArray3& f = F.row(fid);\n        size_t id = get_vertex_index(f, outer_vid);\n        Index next_vid = f((id+1)%3);\n        Index prev_vid = f((id+2)%3);\n        check_and_update_outer_edge(next_vid, fid);\n        check_and_update_outer_edge(prev_vid, fid);\n    }\n\n    v1 = outer_vid;\n    v2 = outer_opp_vid;\n    A.resize(incident_faces.size());\n    std::copy(incident_faces.begin(), incident_faces.end(), A.data());\n}\n\ntemplate<\n    typename DerivedV,\n    typename DerivedF,\n    typename DerivedN,\n    typename DerivedI,\n    typename IndexType\n    >\nIGL_INLINE void igl::outer_facet(\n        const Eigen::PlainObjectBase<DerivedV> & V,\n        const Eigen::PlainObjectBase<DerivedF> & F,\n        const Eigen::PlainObjectBase<DerivedN> & N,\n        const Eigen::PlainObjectBase<DerivedI> & I,\n        IndexType & f,\n        bool & flipped) {\n    // Algorithm:\n    //    Find an outer edge.\n    //    Find the incident facet with the largest absolute X normal component.\n    //    If there is a tie, keep the one with positive X component.\n    //    If there is still a tie, pick the face with the larger signed index\n    //    (flipped face has negative index).\n    typedef typename DerivedV::Scalar Scalar;\n    typedef typename DerivedV::Index Index;\n    const size_t INVALID = std::numeric_limits<size_t>::max();\n\n    Index v1,v2;\n    Eigen::Matrix<Index,Eigen::Dynamic,1> incident_faces;\n    outer_edge(V, F, I, v1, v2, incident_faces);\n    assert(incident_faces.size() > 0);\n\n    auto generic_fabs = [&](const Scalar& val) -> const Scalar {\n        if (val >= 0) return val;\n        else return -val;\n    };\n\n    Scalar max_nx = 0;\n    size_t outer_fid = INVALID;\n    const size_t num_incident_faces = incident_faces.size();\n    for (size_t i=0; i<num_incident_faces; i++) \n    {\n        const auto& fid = incident_faces(i);\n        const Scalar nx = N(fid, 0);\n        if (outer_fid == INVALID) {\n            max_nx = nx;\n            outer_fid = fid;\n        } else {\n            if (generic_fabs(nx) > generic_fabs(max_nx)) {\n                max_nx = nx;\n                outer_fid = fid;\n            } else if (nx == -max_nx && nx > 0) {\n                max_nx = nx;\n                outer_fid = fid;\n            } else if (nx == max_nx) {\n                if ((max_nx >= 0 && outer_fid < fid) ||\n                    (max_nx <  0 && outer_fid > fid)) {\n                    max_nx = nx;\n                    outer_fid = fid;\n                }\n            }\n        }\n    }\n\n    assert(outer_fid != INVALID);\n    f = outer_fid;\n    flipped = max_nx < 0;\n}\n\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::outer_facet<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, int>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> > const&, int&, bool&);\ntemplate void igl::outer_facet<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 1, -1, -1>, Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 1, -1, -1>, unsigned long>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 1, -1, -1> > const&, unsigned long&, bool&);\ntemplate void igl::outer_facet<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, int>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int&, bool&);\ntemplate void igl::outer_facet<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, int>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int&, bool&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/outer_element.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Qingan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_OUTER_ELEMENT_H\n#define IGL_OUTER_ELEMENT_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Find a vertex that is reachable from infinite without crossing any faces.\n  // Such vertex is called \"outer vertex.\"\n  //\n  // Precondition: The input mesh must have all self-intersection resolved and\n  // no duplicated vertices.  See cgal::remesh_self_intersections.h for how to\n  // obtain such input.\n  //\n  // Inputs:\n  //   V  #V by 3 list of vertex positions\n  //   F  #F by 3 list of triangle indices into V\n  //   I  #I list of facets to consider\n  // Outputs:\n  //   v_index  index of outer vertex\n  //   A  #A list of facets incident to the outer vertex\n  template <\n      typename DerivedV,\n      typename DerivedF,\n      typename DerivedI,\n      typename IndexType,\n      typename DerivedA\n      >\n  IGL_INLINE void outer_vertex(\n          const Eigen::PlainObjectBase<DerivedV> & V,\n          const Eigen::PlainObjectBase<DerivedF> & F,\n          const Eigen::PlainObjectBase<DerivedI> & I,\n          IndexType & v_index,\n          Eigen::PlainObjectBase<DerivedA> & A);\n\n\n  // Find an edge that is reachable from infinity without crossing any faces.\n  // Such edge is called \"outer edge.\"\n  //\n  // Precondition: The input mesh must have all self-intersection resolved and\n  // no duplicated vertices.  The correctness of the output depends on the fact\n  // that there is no edge overlap.  See cgal::remesh_self_intersections.h for\n  // how to obtain such input.\n  //\n  // Inputs:\n  //   V  #V by 3 list of vertex positions\n  //   F  #F by 3 list of triangle indices into V\n  //   I  #I list of facets to consider\n  // Outputs:\n  //   v1 index of the first end point of outer edge\n  //   v2 index of the second end point of outer edge\n  //   A  #A list of facets incident to the outer edge\n  template<\n      typename DerivedV,\n      typename DerivedF,\n      typename DerivedI,\n      typename IndexType,\n      typename DerivedA\n      >\n  IGL_INLINE void outer_edge(\n          const Eigen::PlainObjectBase<DerivedV> & V,\n          const Eigen::PlainObjectBase<DerivedF> & F,\n          const Eigen::PlainObjectBase<DerivedI> & I,\n          IndexType & v1,\n          IndexType & v2,\n          Eigen::PlainObjectBase<DerivedA> & A);\n\n\n  // Find a facet that is reachable from infinity without crossing any faces.\n  // Such facet is called \"outer facet.\"\n  //\n  // Precondition: The input mesh must have all self-intersection resolved.  I.e\n  // there is no duplicated vertices, no overlapping edge and no intersecting\n  // faces (the only exception is there could be topologically duplicated faces).\n  // See cgal::remesh_self_intersections.h for how to obtain such input.\n  //\n  // Inputs:\n  //   V  #V by 3 list of vertex positions\n  //   F  #F by 3 list of triangle indices into V\n  //   N  #N by 3 list of face normals\n  //   I  #I list of facets to consider\n  // Outputs:\n  //   f  Index of the outer facet.\n  //   flipped  true iff the normal of f points inwards.\n  template<\n      typename DerivedV,\n      typename DerivedF,\n      typename DerivedN,\n      typename DerivedI,\n      typename IndexType\n      >\n  IGL_INLINE void outer_facet(\n          const Eigen::PlainObjectBase<DerivedV> & V,\n          const Eigen::PlainObjectBase<DerivedF> & F,\n          const Eigen::PlainObjectBase<DerivedN> & N,\n          const Eigen::PlainObjectBase<DerivedI> & I,\n          IndexType & f,\n          bool & flipped);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"outer_element.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/outer_facet.cpp",
    "content": "#include \"outer_facet.h\"\n#include \"sort.h\"\n#include \"vertex_triangle_adjacency.h\"\n#include <iostream>\n#define IGL_OUTER_FACET_DEBUG\n\ntemplate <\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedN,\n  typename DerivedI,\n  typename f_type>\nIGL_INLINE void igl::outer_facet(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  const Eigen::PlainObjectBase<DerivedN> & N,\n  const Eigen::PlainObjectBase<DerivedI> & I,\n  f_type & max_f,\n  bool & flip)\n{\n  using namespace std;\n  typedef typename DerivedV::Scalar Scalar;\n  typedef typename DerivedV::Index Index;\n  typedef \n    typename Eigen::Matrix<Index, DerivedV::RowsAtCompileTime,1> VectorXI;\n  typedef \n    typename Eigen::Matrix<Scalar, DerivedV::RowsAtCompileTime,1> VectorXS;\n  // \"Direct repair of self-intersecting meshes\" [Attene 14]\n  const Index mi = I.size();\n  assert(V.cols() == 3);\n  assert(N.cols() == 3);\n  Index max_v = -1;\n  auto generic_fabs = [&](Scalar val) { \n      if (val >= 0) return val;\n      else return -val;\n  };\n  for(size_t d = 0;d<(size_t)V.cols();d++)\n  {\n    Scalar max_d = -1e26;\n    Scalar max_nd = -1e26;\n    for(Index i = 0;i<mi;i++)\n    {\n      const Index f = I(i);\n      const Scalar nd = N(f,d);\n      if(generic_fabs(nd)>0)\n      {\n        for(Index c = 0;c<3;c++)\n        {\n          const Index v = F(f,c);\n          if(v == max_v)\n          {\n            if(generic_fabs(nd) > max_nd)\n            {\n              // Just update max face and normal\n              max_f = f;\n              max_nd = generic_fabs(nd);\n              flip = nd<0;\n            } else if (generic_fabs(nd) == max_nd) {\n                if (nd == max_nd) {\n                    if (flip) {\n                        max_f = f;\n                        max_nd = nd;\n                        flip = false;\n                    } else if (f > (Index)max_f){\n                        max_f = f;\n                        max_nd = nd;\n                        flip = false;\n                    }\n                } else {\n                    if (flip && f < (Index)max_f) {\n                        max_f = f;\n                        max_nd = generic_fabs(nd);\n                        flip = true;\n                    }\n                }\n            }\n          }else\n          {\n            const Scalar vd = V(v,d);\n            if(vd>max_d)\n            {\n              // update max vertex, face and normal\n              max_v = v;\n              max_d = vd;\n              max_f = f;\n              max_nd = generic_fabs(nd);\n              flip = nd<0;\n            }\n          }\n        }\n      }\n    }\n    if(max_v >= 0)\n    {\n      break;\n    }\n    // if we get here and max_v is still -1 then there were no faces with\n    // |N(d)| > 0\n  }\n#ifdef IGL_OUTER_FACET_DEBUG\n  if(max_v <0)\n  {\n    cerr<<\"Very degenerate case, no suitable face found.\"<<endl;\n  }\n#endif\n  assert(max_v >=0 && \"Very degenerate case, no suitable face found.\");\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template specialization\ntemplate void igl::outer_facet<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, int>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> > const&, int&, bool&);\ntemplate void igl::outer_facet<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 1, -1, -1>, Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 1, -1, -1>, unsigned long>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 1, -1, -1> > const&, unsigned long&, bool&);\ntemplate void igl::outer_facet<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, int>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int&, bool&);\ntemplate void igl::outer_facet<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, int>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int&, bool&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/outer_facet.h",
    "content": "#ifndef IGL_OUTER_FACET_H\n#define IGL_OUTER_FACET_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Compute a single facet which is guaranteed to be part of the \"outer hull of\n  // a mesh (V,F). This implementation follows Section 3.6 of \"Direct repair of\n  // self-intersecting meshes\" [Attene 2014].\n  //\n  // Inputs:\n  //   V  #V by 3 list of vertex positions\n  //   F  #F by 3 list of triangle indices into V\n  //   N  #F by 3 list of face normals\n  //   I  #I list of facets to actually consider\n  // Outputs:\n  //   f  index of facet into V\n  //   flip  whether facet's orientation should be flipped so that\n  //     counter-clockwise normal points outward.\n  //\n  // See also: cgal/outer_hull.h\n  template <\n    typename DerivedV,\n    typename DerivedF,\n    typename DerivedN,\n    typename DerivedI,\n    typename f_type>\n  IGL_INLINE void outer_facet(\n    const Eigen::PlainObjectBase<DerivedV> & V,\n    const Eigen::PlainObjectBase<DerivedF> & F,\n    const Eigen::PlainObjectBase<DerivedN> & N,\n    const Eigen::PlainObjectBase<DerivedI> & I,\n    f_type & f,\n    bool & flip);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"outer_facet.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/parallel_for.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_PARALLEL_FOR_H\n#define IGL_PARALLEL_FOR_H\n#include \"igl_inline.h\"\n#include <functional>\n\nnamespace igl\n{\n  // PARALLEL_FOR Functional implementation of a basic, open-mp style, parallel\n  // for loop. If the inner block of a for-loop can be rewritten/encapsulated in\n  // a single (anonymous/lambda) function call `func` so that the serial code\n  // looks like:\n  // \n  //     for(int i = 0;i<loop_size;i++)\n  //     {\n  //       func(i);\n  //     }\n  //\n  // then `parallel_for(loop_size,func,min_parallel)` will use as many threads as\n  // available on the current hardware to parallelize this for loop so long as\n  // loop_size<min_parallel, otherwise it will just use a serial for loop.\n  //\n  // Inputs:\n  //   loop_size  number of iterations. I.e. for(int i = 0;i<loop_size;i++) ...\n  //   func  function handle taking iteration index as only arguement to compute\n  //     inner block of for loop I.e. for(int i ...){ func(i); }\n  //   min_parallel  min size of loop_size such that parallel (non-serial)\n  //     thread pooling should be attempted {0}\n  // Returns true iff thread pool was invoked\n  template<typename Index, typename FunctionType >\n  inline bool parallel_for(\n    const Index loop_size, \n    const FunctionType & func,\n    const size_t min_parallel=0);\n  // PARALLEL_FOR Functional implementation of an open-mp style, parallel for\n  // loop with accumulation. For example, serial code separated into n chunks\n  // (each to be parallelized with a thread) might look like:\n  //     \n  //     Eigen::VectorXd S;\n  //     const auto & prep_func = [&S](int n){ S = Eigen:VectorXd::Zero(n); };\n  //     const auto & func = [&X,&S](int i, int t){ S(t) += X(i); };\n  //     const auto & accum_func = [&S,&sum](int t){ sum += S(t); };\n  //     prep_func(n);\n  //     for(int i = 0;i<loop_size;i++)\n  //     {\n  //       func(i,i%n);\n  //     }\n  //     double sum = 0;\n  //     for(int t = 0;t<n;t++)\n  //     {\n  //       accum_func(t);\n  //     }\n  // \n  // Inputs:\n  //   loop_size  number of iterations. I.e. for(int i = 0;i<loop_size;i++) ...\n  //   prep_func function handle taking n >= number of threads as only\n  //     argument \n  //   func  function handle taking iteration index i and thread id t as only\n  //     arguements to compute inner block of for loop I.e. \n  //     for(int i ...){ func(i,t); }\n  //   accum_func  function handle taking thread index as only argument, to be\n  //     called after all calls of func, e.g., for serial accumulation across\n  //     all n (potential) threads, see n in description of prep_func.\n  //   min_parallel  min size of loop_size such that parallel (non-serial)\n  //     thread pooling should be attempted {0}\n  // Returns true iff thread pool was invoked\n  template<\n    typename Index, \n    typename PrepFunctionType, \n    typename FunctionType, \n    typename AccumFunctionType \n    >\n  inline bool parallel_for(\n    const Index loop_size, \n    const PrepFunctionType & prep_func,\n    const FunctionType & func,\n    const AccumFunctionType & accum_func,\n    const size_t min_parallel=0);\n}\n\n// Implementation\n\n#include <cmath>\n#include <cassert>\n#include <thread>\n#include <vector>\n#include <algorithm>\n\ntemplate<typename Index, typename FunctionType >\ninline bool igl::parallel_for(\n  const Index loop_size, \n  const FunctionType & func,\n  const size_t min_parallel)\n{\n  using namespace std;\n  // no op preparation/accumulation\n  const auto & no_op = [](const size_t /*n/t*/){};\n  // two-parameter wrapper ignoring thread id\n  const auto & wrapper = [&func](Index i,size_t /*t*/){ func(i); };\n  return parallel_for(loop_size,no_op,wrapper,no_op,min_parallel);\n}\n\ntemplate<\n  typename Index, \n  typename PreFunctionType,\n  typename FunctionType, \n  typename AccumFunctionType>\ninline bool igl::parallel_for(\n  const Index loop_size, \n  const PreFunctionType & prep_func,\n  const FunctionType & func,\n  const AccumFunctionType & accum_func,\n  const size_t min_parallel)\n{\n  assert(loop_size>=0);\n  if(loop_size==0) return false;\n  // Estimate number of threads in the pool\n  // http://ideone.com/Z7zldb\n  const static size_t sthc = std::thread::hardware_concurrency();\n  const size_t nthreads = \n#ifdef IGL_PARALLEL_FOR_FORCE_SERIAL\n    0;\n#else\n    loop_size<min_parallel?0:(sthc==0?8:sthc);\n#endif\n  if(nthreads==0)\n  {\n    // serial\n    prep_func(1);\n    for(Index i = 0;i<loop_size;i++) func(i,0);\n    accum_func(0);\n    return false;\n  }else\n  {\n    // Size of a slice for the range functions\n    Index slice = \n      std::max(\n        (Index)std::round((loop_size+1)/static_cast<double>(nthreads)),(Index)1);\n \n    // [Helper] Inner loop\n    const auto & range = [&func](const Index k1, const Index k2, const size_t t)\n    {\n      for(Index k = k1; k < k2; k++) func(k,t);\n    };\n    prep_func(nthreads);\n    // Create pool and launch jobs\n    std::vector<std::thread> pool;\n    pool.reserve(nthreads);\n    // Inner range extents\n    Index i1 = 0;\n    Index i2 = std::min(0 + slice, loop_size);\n    {\n      size_t t = 0;\n      for (; t+1 < nthreads && i1 < loop_size; ++t)\n      {\n        pool.emplace_back(range, i1, i2, t);\n        i1 = i2;\n        i2 = std::min(i2 + slice, loop_size);\n      }\n      if (i1 < loop_size)\n      {\n        pool.emplace_back(range, i1, loop_size, t);\n      }\n    }\n    // Wait for jobs to finish\n    for (std::thread &t : pool) if (t.joinable()) t.join();\n    // Accumulate across threads\n    for(size_t t = 0;t<nthreads;t++)\n    {\n      accum_func(t);\n    }\n    return true;\n  }\n}\n \n//#ifndef IGL_STATIC_LIBRARY\n//#include \"parallel_for.cpp\"\n//#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/parallel_transport_angles.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include <igl/parallel_transport_angles.h>\n#include <Eigen/Geometry>\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedK>\nIGL_INLINE void igl::parallel_transport_angles(\nconst Eigen::PlainObjectBase<DerivedV>& V,\nconst Eigen::PlainObjectBase<DerivedF>& F,\nconst Eigen::PlainObjectBase<DerivedV>& FN,\nconst Eigen::MatrixXi &E2F,\nconst Eigen::MatrixXi &F2E,\nEigen::PlainObjectBase<DerivedK> &K)\n{\n  int numE = E2F.rows();\n\n  Eigen::VectorXi isBorderEdge;\n  isBorderEdge.setZero(numE,1);\n  for(unsigned i=0; i<numE; ++i)\n  {\n    if ((E2F(i,0) == -1) || ((E2F(i,1) == -1)))\n      isBorderEdge[i] = 1;\n  }\n\n  K.setZero(numE);\n  // For every non-border edge\n  for (unsigned eid=0; eid<numE; ++eid)\n  {\n    if (!isBorderEdge[eid])\n    {\n      int fid0 = E2F(eid,0);\n      int fid1 = E2F(eid,1);\n\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> N0 = FN.row(fid0);\n//      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> N1 = FN.row(fid1);\n\n      // find common edge on triangle 0 and 1\n      int fid0_vc = -1;\n      int fid1_vc = -1;\n      for (unsigned i=0;i<3;++i)\n      {\n        if (F2E(fid0,i) == eid)\n          fid0_vc = i;\n        if (F2E(fid1,i) == eid)\n          fid1_vc = i;\n      }\n      assert(fid0_vc != -1);\n      assert(fid1_vc != -1);\n\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> common_edge = V.row(F(fid0,(fid0_vc+1)%3)) - V.row(F(fid0,fid0_vc));\n      common_edge.normalize();\n\n      // Map the two triangles in a new space where the common edge is the x axis and the N0 the z axis\n      Eigen::Matrix<typename DerivedV::Scalar, 3, 3> P;\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> o = V.row(F(fid0,fid0_vc));\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> tmp = -N0.cross(common_edge);\n      P << common_edge, tmp, N0;\n      //      P.transposeInPlace();\n\n\n      Eigen::Matrix<typename DerivedV::Scalar, 3, 3> V0;\n      V0.row(0) = V.row(F(fid0,0)) -o;\n      V0.row(1) = V.row(F(fid0,1)) -o;\n      V0.row(2) = V.row(F(fid0,2)) -o;\n\n      V0 = (P*V0.transpose()).transpose();\n\n      //      assert(V0(0,2) < 1e-10);\n      //      assert(V0(1,2) < 1e-10);\n      //      assert(V0(2,2) < 1e-10);\n\n      Eigen::Matrix<typename DerivedV::Scalar, 3, 3> V1;\n      V1.row(0) = V.row(F(fid1,0)) -o;\n      V1.row(1) = V.row(F(fid1,1)) -o;\n      V1.row(2) = V.row(F(fid1,2)) -o;\n      V1 = (P*V1.transpose()).transpose();\n\n      //      assert(V1(fid1_vc,2) < 10e-10);\n      //      assert(V1((fid1_vc+1)%3,2) < 10e-10);\n\n      // compute rotation R such that R * N1 = N0\n      // i.e. map both triangles to the same plane\n      double alpha = -atan2(V1((fid1_vc+2)%3,2),V1((fid1_vc+2)%3,1));\n\n      Eigen::Matrix<typename DerivedV::Scalar, 3, 3> R;\n      R << 1,          0,            0,\n      0, cos(alpha), -sin(alpha) ,\n      0, sin(alpha),  cos(alpha);\n      V1 = (R*V1.transpose()).transpose();\n\n      //      assert(V1(0,2) < 1e-10);\n      //      assert(V1(1,2) < 1e-10);\n      //      assert(V1(2,2) < 1e-10);\n\n      // measure the angle between the reference frames\n      // k_ij is the angle between the triangle on the left and the one on the right\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> ref0 = V0.row(1) - V0.row(0);\n      Eigen::Matrix<typename DerivedV::Scalar, 1, 3> ref1 = V1.row(1) - V1.row(0);\n\n      ref0.normalize();\n      ref1.normalize();\n\n      double ktemp = atan2(ref1(1),ref1(0)) - atan2(ref0(1),ref0(0));\n\n      // just to be sure, rotate ref0 using angle ktemp...\n      Eigen::Matrix<typename DerivedV::Scalar,2,2> R2;\n      R2 << cos(ktemp), -sin(ktemp), sin(ktemp), cos(ktemp);\n\n//      Eigen::Matrix<typename DerivedV::Scalar, 1, 2> tmp1 = R2*(ref0.head(2)).transpose();\n\n      //      assert(tmp1(0) - ref1(0) < 1e-10);\n      //      assert(tmp1(1) - ref1(1) < 1e-10);\n\n      K[eid] = ktemp;\n    }\n  }\n\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::parallel_transport_angles<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/parallel_transport_angles.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2015 Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_PARALLEL_TRANSPORT_ANGLE\n#define IGL_PARALLEL_TRANSPORT_ANGLE\n#include \"igl_inline.h\"\n\n#include <Eigen/Core>\n#include <vector>\n\nnamespace igl {\n  // Given the per-face local bases computed via igl::local_basis, this function\n  // computes the angle between the two reference frames across each edge.\n  // Any two vectors across the edge whose 2D representation only differs by\n  // this angle are considered to be parallel.\n\n  // Inputs:\n  //   V               #V by 3 list of mesh vertex coordinates\n  //   F               #F by 3 list of mesh faces (must be triangles)\n  //   FN              #F by 3 list of face normals\n  //   E2F             #E by 2 list of the edge-to-face relation (e.g. computed\n  //                   via igl::edge_topology)\n  //   F2E             #F by 3 list of the face-to-edge relation (e.g. computed\n  //                   via igl::edge_topology)\n  // Output:\n  //   K               #E by 1 list of the parallel transport angles (zero\n  //                   for all boundary edges)\n  //\ntemplate <typename DerivedV, typename DerivedF, typename DerivedK>\nIGL_INLINE void parallel_transport_angles(\nconst Eigen::PlainObjectBase<DerivedV>&V,\nconst Eigen::PlainObjectBase<DerivedF>&F,\nconst Eigen::PlainObjectBase<DerivedV>&FN,\nconst Eigen::MatrixXi &E2F,\nconst Eigen::MatrixXi &F2E,\nEigen::PlainObjectBase<DerivedK>&K);\n\n};\n\n\n#ifndef IGL_STATIC_LIBRARY\n#include \"parallel_transport_angles.cpp\"\n#endif\n\n\n#endif /* defined(IGL_PARALLEL_TRANSPORT_ANGLE) */\n"
  },
  {
    "path": "libs/libigl/include/igl/partition.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"partition.h\"\n#include \"mat_min.h\"\n\nIGL_INLINE void igl::partition(\n  const Eigen::MatrixXd & W,\n  const int k,\n  Eigen::Matrix<int,Eigen::Dynamic,1> & G,\n  Eigen::Matrix<int,Eigen::Dynamic,1> & S,\n  Eigen::Matrix<double,Eigen::Dynamic,1> & D)\n{\n  // number of mesh vertices\n  int n = W.rows();\n\n  // Resize output\n  G.resize(n);\n  S.resize(k);\n\n  // \"Randomly\" choose first seed\n  // Pick a vertex farthest from 0\n  int s;\n  (W.array().square().matrix()).rowwise().sum().maxCoeff(&s);\n\n  S(0) = s;\n  // Initialize distance to closest seed\n  D = ((W.rowwise() - W.row(s)).array().square()).matrix().rowwise().sum();\n  G.setZero();\n\n  // greedily choose the remaining k-1 seeds\n  for(int i = 1;i<k;i++)\n  {\n    // Find maximum in D\n    D.maxCoeff(&s);\n    S(i) = s;\n    // distance to this seed\n    Eigen::Matrix<double,Eigen::Dynamic,1> Ds =\n      ((W.rowwise() - W.row(s)).array().square()).matrix().rowwise().sum();\n    // Concatenation of D and Ds: DDs = [D Ds];\n    Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic> DDs;\n    // Make space for two columns\n    DDs.resize(D.rows(),2);\n    DDs.col(0) = D;\n    DDs.col(1) = Ds;\n    // Update D\n    // get minimum of old D and distance to this seed, C == 1 if new distance\n    // was smaller\n    Eigen::Matrix<int,Eigen::Dynamic,1> C;\n    igl::mat_min(DDs,2,D,C);\n    G = (C.array() ==0).select(G,i);\n  }\n\n\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/partition.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_PARTITION_H\n#define IGL_PARTITION_H\n#include \"igl_inline.h\"\n#include <Eigen/Dense>\n\nnamespace igl\n{\n  // PARTITION partition vertices into groups based on each\n  // vertex's vector: vertices with similar coordinates (close in \n  // space) will be put in the same group.\n  //\n  // Inputs:\n  //   W  #W by dim coordinate matrix\n  //   k  desired number of groups default is dim\n  // Output:\n  //   G  #W list of group indices (1 to k) for each vertex, such that vertex i \n  //     is assigned to group G(i)\n  //   S  k  list of seed vertices\n  //   D  #W list of squared distances for each vertex to it's corresponding\n  //     closest seed\n  IGL_INLINE void partition(\n    const Eigen::MatrixXd & W,\n    const int k,\n    Eigen::Matrix<int,Eigen::Dynamic,1> & G,\n    Eigen::Matrix<int,Eigen::Dynamic,1> & S,\n    Eigen::Matrix<double,Eigen::Dynamic,1> & D);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#include \"partition.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/parula.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"parula.h\"\n\n\ntemplate <typename T>\nIGL_INLINE void igl::parula(const T x, T * rgb)\n{\n  return parula(x,rgb[0],rgb[1],rgb[2]);\n}\n\ntemplate <typename T>\nIGL_INLINE void igl::parula(const T f, T & r, T & g, T & b)\n{\n  // clamp to (0,1)\n  const float eff_f = (f>=1.?1.:(f<=0.?0.:f));\n  // continuous index into array\n  const float ff = eff_f*(PARULA_COLOR_MAP.rows()-1);\n  size_t s = std::floor(ff);\n  size_t d = std::ceil(ff);\n  const float t = (s==d ? 0. : (ff-s)/float(d-s));\n\n  assert(t>=0 && t<=1);\n  const auto rgb_s = PARULA_COLOR_MAP.row(s);\n  const auto rgb_d = PARULA_COLOR_MAP.row(d);\n  const auto rgb = rgb_s + t*(rgb_d-rgb_s);\n  r = rgb(0);\n  g = rgb(1);\n  b = rgb(2);\n}\n\n\ntemplate <typename DerivedZ, typename DerivedC>\nIGL_INLINE void igl::parula(\n  const Eigen::PlainObjectBase<DerivedZ> & Z,\n  const bool normalize,\n  Eigen::PlainObjectBase<DerivedC> & C)\n{\n  const double min_z = (normalize?Z.minCoeff():0);\n  const double max_z = (normalize?Z.maxCoeff():1);\n  return parula(Z,min_z,max_z,C);\n}\ntemplate <typename DerivedZ, typename DerivedC>\nIGL_INLINE void igl::parula(\n  const Eigen::PlainObjectBase<DerivedZ> & Z,\n  const double min_z,\n  const double max_z,\n  Eigen::PlainObjectBase<DerivedC> & C)\n{\n  C.resize(Z.rows(),3);\n  double denom = (max_z-min_z);\n  denom = denom==0?1:denom;\n  for(int r = 0;r<Z.rows();r++)\n  {\n    parula(\n      (typename DerivedC::Scalar)((-min_z+Z(r,0))/denom),\n      C(r,0),\n      C(r,1),\n      C(r,2));\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::parula<Eigen::Array<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Array<int, -1, 1, 0, -1, 1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::parula<double>(double, double*);\ntemplate void igl::parula<double>(double, double&, double&, double&);\ntemplate void igl::parula<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::parula<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::parula<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, double, double, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/parula.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_PARULA_H\n#define IGL_PARULA_H\n#include \"igl_inline.h\"\n//#ifndef IGL_NO_EIGEN\n#  include <Eigen/Dense>\n//#endif\nnamespace igl\n{\n  // PARULA like MATLAB's parula\n  //\n  // Inputs:\n  //   m  number of colors \n  // Outputs:\n  //   J  m by list of RGB colors between 0 and 1\n  //\n  // Wrapper for directly computing [r,g,b] values for a given factor f between\n  // 0 and 1\n  //\n  // Inputs:\n  //   f  factor determining color value as if 0 was min and 1 was max\n  // Outputs:\n  //   r  red value\n  //   g  green value\n  //   b  blue value\n  template <typename T>\n  IGL_INLINE void parula(const T f, T * rgb);\n  template <typename T>\n  IGL_INLINE void parula(const T f, T & r, T & g, T & b);\n  // Inputs:\n  //   Z  #Z list of factors \n  //   normalize  whether to normalize Z to be tightly between [0,1]\n  // Outputs:\n  //   C  #C by 3 list of rgb colors\n  template <typename DerivedZ, typename DerivedC>\n  IGL_INLINE void parula(\n    const Eigen::PlainObjectBase<DerivedZ> & Z,\n    const bool normalize,\n    Eigen::PlainObjectBase<DerivedC> & C);\n  // Inputs:\n  //   min_Z  value at blue\n  //   max_Z  value at red\n  template <typename DerivedZ, typename DerivedC>\n  IGL_INLINE void parula(\n    const Eigen::PlainObjectBase<DerivedZ> & Z,\n    const double min_Z,\n    const double max_Z,\n    Eigen::PlainObjectBase<DerivedC> & C);\n  // adapted from parula.m\n  const Eigen::Matrix<float,256,4> PARULA_COLOR_MAP = \n    (Eigen::Matrix<float,256,4>()<<\n      0.2081,0.1663,0.5292,1,\n      0.2091,0.1721,0.5411,1,\n      0.2101,0.1779,0.553,1,\n      0.2109,0.1837,0.565,1,\n      0.2116,0.1895,0.5771,1,\n      0.2121,0.1954,0.5892,1,\n      0.2124,0.2013,0.6013,1,\n      0.2125,0.2072,0.6135,1,\n      0.2123,0.2132,0.6258,1,\n      0.2118,0.2192,0.6381,1,\n      0.2111,0.2253,0.6505,1,\n      0.2099,0.2315,0.6629,1,\n      0.2084,0.2377,0.6753,1,\n      0.2063,0.244,0.6878,1,\n      0.2038,0.2503,0.7003,1,\n      0.2006,0.2568,0.7129,1,\n      0.1968,0.2632,0.7255,1,\n      0.1921,0.2698,0.7381,1,\n      0.1867,0.2764,0.7507,1,\n      0.1802,0.2832,0.7634,1,\n      0.1728,0.2902,0.7762,1,\n      0.1641,0.2975,0.789,1,\n      0.1541,0.3052,0.8017,1,\n      0.1427,0.3132,0.8145,1,\n      0.1295,0.3217,0.8269,1,\n      0.1147,0.3306,0.8387,1,\n      0.0986,0.3397,0.8495,1,\n      0.0816,0.3486,0.8588,1,\n      0.0646,0.3572,0.8664,1,\n      0.0482,0.3651,0.8722,1,\n      0.0329,0.3724,0.8765,1,\n      0.0213,0.3792,0.8796,1,\n      0.0136,0.3853,0.8815,1,\n      0.0086,0.3911,0.8827,1,\n      0.006,0.3965,0.8833,1,\n      0.0051,0.4017,0.8834,1,\n      0.0054,0.4066,0.8831,1,\n      0.0067,0.4113,0.8825,1,\n      0.0089,0.4159,0.8816,1,\n      0.0116,0.4203,0.8805,1,\n      0.0148,0.4246,0.8793,1,\n      0.0184,0.4288,0.8779,1,\n      0.0223,0.4329,0.8763,1,\n      0.0264,0.437,0.8747,1,\n      0.0306,0.441,0.8729,1,\n      0.0349,0.4449,0.8711,1,\n      0.0394,0.4488,0.8692,1,\n      0.0437,0.4526,0.8672,1,\n      0.0477,0.4564,0.8652,1,\n      0.0514,0.4602,0.8632,1,\n      0.0549,0.464,0.8611,1,\n      0.0582,0.4677,0.8589,1,\n      0.0612,0.4714,0.8568,1,\n      0.064,0.4751,0.8546,1,\n      0.0666,0.4788,0.8525,1,\n      0.0689,0.4825,0.8503,1,\n      0.071,0.4862,0.8481,1,\n      0.0729,0.4899,0.846,1,\n      0.0746,0.4937,0.8439,1,\n      0.0761,0.4974,0.8418,1,\n      0.0773,0.5012,0.8398,1,\n      0.0782,0.5051,0.8378,1,\n      0.0789,0.5089,0.8359,1,\n      0.0794,0.5129,0.8341,1,\n      0.0795,0.5169,0.8324,1,\n      0.0793,0.521,0.8308,1,\n      0.0788,0.5251,0.8293,1,\n      0.0778,0.5295,0.828,1,\n      0.0764,0.5339,0.827,1,\n      0.0746,0.5384,0.8261,1,\n      0.0724,0.5431,0.8253,1,\n      0.0698,0.5479,0.8247,1,\n      0.0668,0.5527,0.8243,1,\n      0.0636,0.5577,0.8239,1,\n      0.06,0.5627,0.8237,1,\n      0.0562,0.5677,0.8234,1,\n      0.0523,0.5727,0.8231,1,\n      0.0484,0.5777,0.8228,1,\n      0.0445,0.5826,0.8223,1,\n      0.0408,0.5874,0.8217,1,\n      0.0372,0.5922,0.8209,1,\n      0.0342,0.5968,0.8198,1,\n      0.0317,0.6012,0.8186,1,\n      0.0296,0.6055,0.8171,1,\n      0.0279,0.6097,0.8154,1,\n      0.0265,0.6137,0.8135,1,\n      0.0255,0.6176,0.8114,1,\n      0.0248,0.6214,0.8091,1,\n      0.0243,0.625,0.8066,1,\n      0.0239,0.6285,0.8039,1,\n      0.0237,0.6319,0.801,1,\n      0.0235,0.6352,0.798,1,\n      0.0233,0.6384,0.7948,1,\n      0.0231,0.6415,0.7916,1,\n      0.023,0.6445,0.7881,1,\n      0.0229,0.6474,0.7846,1,\n      0.0227,0.6503,0.781,1,\n      0.0227,0.6531,0.7773,1,\n      0.0232,0.6558,0.7735,1,\n      0.0238,0.6585,0.7696,1,\n      0.0246,0.6611,0.7656,1,\n      0.0263,0.6637,0.7615,1,\n      0.0282,0.6663,0.7574,1,\n      0.0306,0.6688,0.7532,1,\n      0.0338,0.6712,0.749,1,\n      0.0373,0.6737,0.7446,1,\n      0.0418,0.6761,0.7402,1,\n      0.0467,0.6784,0.7358,1,\n      0.0516,0.6808,0.7313,1,\n      0.0574,0.6831,0.7267,1,\n      0.0629,0.6854,0.7221,1,\n      0.0692,0.6877,0.7173,1,\n      0.0755,0.6899,0.7126,1,\n      0.082,0.6921,0.7078,1,\n      0.0889,0.6943,0.7029,1,\n      0.0956,0.6965,0.6979,1,\n      0.1031,0.6986,0.6929,1,\n      0.1104,0.7007,0.6878,1,\n      0.118,0.7028,0.6827,1,\n      0.1258,0.7049,0.6775,1,\n      0.1335,0.7069,0.6723,1,\n      0.1418,0.7089,0.6669,1,\n      0.1499,0.7109,0.6616,1,\n      0.1585,0.7129,0.6561,1,\n      0.1671,0.7148,0.6507,1,\n      0.1758,0.7168,0.6451,1,\n      0.1849,0.7186,0.6395,1,\n      0.1938,0.7205,0.6338,1,\n      0.2033,0.7223,0.6281,1,\n      0.2128,0.7241,0.6223,1,\n      0.2224,0.7259,0.6165,1,\n      0.2324,0.7275,0.6107,1,\n      0.2423,0.7292,0.6048,1,\n      0.2527,0.7308,0.5988,1,\n      0.2631,0.7324,0.5929,1,\n      0.2735,0.7339,0.5869,1,\n      0.2845,0.7354,0.5809,1,\n      0.2953,0.7368,0.5749,1,\n      0.3064,0.7381,0.5689,1,\n      0.3177,0.7394,0.563,1,\n      0.3289,0.7406,0.557,1,\n      0.3405,0.7417,0.5512,1,\n      0.352,0.7428,0.5453,1,\n      0.3635,0.7438,0.5396,1,\n      0.3753,0.7446,0.5339,1,\n      0.3869,0.7454,0.5283,1,\n      0.3986,0.7461,0.5229,1,\n      0.4103,0.7467,0.5175,1,\n      0.4218,0.7473,0.5123,1,\n      0.4334,0.7477,0.5072,1,\n      0.4447,0.7482,0.5021,1,\n      0.4561,0.7485,0.4972,1,\n      0.4672,0.7487,0.4924,1,\n      0.4783,0.7489,0.4877,1,\n      0.4892,0.7491,0.4831,1,\n      0.5,0.7491,0.4786,1,\n      0.5106,0.7492,0.4741,1,\n      0.5212,0.7492,0.4698,1,\n      0.5315,0.7491,0.4655,1,\n      0.5418,0.749,0.4613,1,\n      0.5519,0.7489,0.4571,1,\n      0.5619,0.7487,0.4531,1,\n      0.5718,0.7485,0.449,1,\n      0.5816,0.7482,0.4451,1,\n      0.5913,0.7479,0.4412,1,\n      0.6009,0.7476,0.4374,1,\n      0.6103,0.7473,0.4335,1,\n      0.6197,0.7469,0.4298,1,\n      0.629,0.7465,0.4261,1,\n      0.6382,0.746,0.4224,1,\n      0.6473,0.7456,0.4188,1,\n      0.6564,0.7451,0.4152,1,\n      0.6653,0.7446,0.4116,1,\n      0.6742,0.7441,0.4081,1,\n      0.683,0.7435,0.4046,1,\n      0.6918,0.743,0.4011,1,\n      0.7004,0.7424,0.3976,1,\n      0.7091,0.7418,0.3942,1,\n      0.7176,0.7412,0.3908,1,\n      0.7261,0.7405,0.3874,1,\n      0.7346,0.7399,0.384,1,\n      0.743,0.7392,0.3806,1,\n      0.7513,0.7385,0.3773,1,\n      0.7596,0.7378,0.3739,1,\n      0.7679,0.7372,0.3706,1,\n      0.7761,0.7364,0.3673,1,\n      0.7843,0.7357,0.3639,1,\n      0.7924,0.735,0.3606,1,\n      0.8005,0.7343,0.3573,1,\n      0.8085,0.7336,0.3539,1,\n      0.8166,0.7329,0.3506,1,\n      0.8246,0.7322,0.3472,1,\n      0.8325,0.7315,0.3438,1,\n      0.8405,0.7308,0.3404,1,\n      0.8484,0.7301,0.337,1,\n      0.8563,0.7294,0.3336,1,\n      0.8642,0.7288,0.33,1,\n      0.872,0.7282,0.3265,1,\n      0.8798,0.7276,0.3229,1,\n      0.8877,0.7271,0.3193,1,\n      0.8954,0.7266,0.3156,1,\n      0.9032,0.7262,0.3117,1,\n      0.911,0.7259,0.3078,1,\n      0.9187,0.7256,0.3038,1,\n      0.9264,0.7256,0.2996,1,\n      0.9341,0.7256,0.2953,1,\n      0.9417,0.7259,0.2907,1,\n      0.9493,0.7264,0.2859,1,\n      0.9567,0.7273,0.2808,1,\n      0.9639,0.7285,0.2754,1,\n      0.9708,0.7303,0.2696,1,\n      0.9773,0.7326,0.2634,1,\n      0.9831,0.7355,0.257,1,\n      0.9882,0.739,0.2504,1,\n      0.9922,0.7431,0.2437,1,\n      0.9952,0.7476,0.2373,1,\n      0.9973,0.7524,0.231,1,\n      0.9986,0.7573,0.2251,1,\n      0.9991,0.7624,0.2195,1,\n      0.999,0.7675,0.2141,1,\n      0.9985,0.7726,0.209,1,\n      0.9976,0.7778,0.2042,1,\n      0.9964,0.7829,0.1995,1,\n      0.995,0.788,0.1949,1,\n      0.9933,0.7931,0.1905,1,\n      0.9914,0.7981,0.1863,1,\n      0.9894,0.8032,0.1821,1,\n      0.9873,0.8083,0.178,1,\n      0.9851,0.8133,0.174,1,\n      0.9828,0.8184,0.17,1,\n      0.9805,0.8235,0.1661,1,\n      0.9782,0.8286,0.1622,1,\n      0.9759,0.8337,0.1583,1,\n      0.9736,0.8389,0.1544,1,\n      0.9713,0.8441,0.1505,1,\n      0.9692,0.8494,0.1465,1,\n      0.9672,0.8548,0.1425,1,\n      0.9654,0.8603,0.1385,1,\n      0.9638,0.8659,0.1343,1,\n      0.9623,0.8716,0.1301,1,\n      0.9611,0.8774,0.1258,1,\n      0.96,0.8834,0.1215,1,\n      0.9593,0.8895,0.1171,1,\n      0.9588,0.8958,0.1126,1,\n      0.9586,0.9022,0.1082,1,\n      0.9587,0.9088,0.1036,1,\n      0.9591,0.9155,0.099,1,\n      0.9599,0.9225,0.0944,1,\n      0.961,0.9296,0.0897,1,\n      0.9624,0.9368,0.085,1,\n      0.9641,0.9443,0.0802,1,\n      0.9662,0.9518,0.0753,1,\n      0.9685,0.9595,0.0703,1,\n      0.971,0.9673,0.0651,1,\n      0.9736,0.9752,0.0597,1,\n      0.9763,0.9831,0.0538,1).finished();\n};\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"parula.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/path_to_executable.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"path_to_executable.h\"\n#ifdef __APPLE__\n#  include <mach-o/dyld.h>\n#endif\n#if defined(_WIN32)\n#  include <windows.h>\n#endif\n#include <stdint.h>\nIGL_INLINE std::string igl::path_to_executable()\n{\n  // http://pastebin.com/ffzzxPzi\n  using namespace std;\n  std::string path;\n  char buffer[1024];\n  uint32_t size = sizeof(buffer);\n#if defined (WIN32)\n  GetModuleFileName(nullptr,buffer,size);\n  path = buffer;\n#elif defined (__APPLE__)\n  if(_NSGetExecutablePath(buffer, &size) == 0)\n  {\n    path = buffer;\n  }\n#elif defined(UNIX)\n  if (readlink(\"/proc/self/exe\", buffer, sizeof(buffer)) == -1)\n  {\n    path = buffer;\n  }\n#elif defined(__FreeBSD__)\n  int mib[4];\n  mib[0] = CTL_KERN;\n  mib[1] = KERN_PROC;\n  mib[2] = KERN_PROC_PATHNAME;\n  mib[3] = -1;\n  sysctl(mib, 4, buffer, sizeof(buffer), NULL, 0);\n  path = buffer;\n#elif defined(SUNOS)\n  path = getexecname();\n#endif\n  return path;\n}\n\n"
  },
  {
    "path": "libs/libigl/include/igl/path_to_executable.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_PATH_TO_EXECUTABLE_H\n#define IGL_PATH_TO_EXECUTABLE_H\n#include \"igl_inline.h\"\n#include <string>\nnamespace igl\n{\n  // Return the path of the current executable.\n  // Note: Tested for Mac OS X\n  IGL_INLINE std::string path_to_executable();\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"path_to_executable.cpp\"\n#endif\n#endif \n"
  },
  {
    "path": "libs/libigl/include/igl/pathinfo.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"pathinfo.h\"\n\n#include \"dirname.h\"\n#include \"basename.h\"\n// Verbose should be removed once everythings working correctly\n#include \"verbose.h\"\n#include <algorithm>\n\nIGL_INLINE void igl::pathinfo(\n  const std::string & path,\n  std::string & dirname,\n  std::string & basename,\n  std::string & extension,\n  std::string & filename)\n{\n  dirname = igl::dirname(path);\n  basename = igl::basename(path);\n  std::string::reverse_iterator last_dot =\n    std::find(\n      basename.rbegin(), \n      basename.rend(), '.');\n  // Was a dot found?\n  if(last_dot == basename.rend())\n  {\n    // filename is same as basename\n    filename = basename;\n    // no extension\n    extension = \"\";\n  }else\n  {\n  // extension is substring of basename\n    extension = std::string(last_dot.base(),basename.end());\n    // filename is substring of basename\n    filename = std::string(basename.begin(),last_dot.base()-1);\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/pathinfo.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_PATHINFO_H\n#define IGL_PATHINFO_H\n#include \"igl_inline.h\"\n\n#include <string>\n\nnamespace igl\n{\n  //// Decided not to use these\n  //const int PATHINFO_DIRNAME 01\n  //const int PATHINFO_BASENAME 02\n  //const int PATHINFO_EXTENSION 04\n  //const int PATHINFO_FILENAME 08\n\n  // Function like PHP's pathinfo\n  //  returns information about path\n  // Input:\n  //  path  string containing input path\n  // Outputs:\n  //  dirname  string containing dirname (see dirname.h)\n  //  basename  string containing basename (see basename.h)\n  //  extension  string containing extension (characters after last '.')\n  //  filename  string containing filename (characters of basename before last\n  //    '.')\n  //\n  //\n  // Examples:\n  //\n  // input                     | dirname        basename       ext    filename\n  // \"/\"                       | \"/\"            \"\"             \"\"     \"\"\n  // \"//\"                      | \"/\"            \"\"             \"\"     \"\"\n  // \"/foo\"                    | \"/\"            \"foo\"          \"\"     \"foo\"\n  // \"/foo/\"                   | \"/\"            \"foo\"          \"\"     \"foo\"\n  // \"/foo//\"                  | \"/\"            \"foo\"          \"\"     \"foo\"\n  // \"/foo/./\"                 | \"/foo\"         \".\"            \"\"     \"\"\n  // \"/foo/bar\"                | \"/foo\"         \"bar\"          \"\"     \"bar\"\n  // \"/foo/bar.\"               | \"/foo\"         \"bar.\"         \"\"     \"bar\"\n  // \"/foo/bar.txt\"            | \"/foo\"         \"bar.txt\"      \"txt\"  \"bar\"\n  // \"/foo/bar.txt.zip\"        | \"/foo\"         \"bar.txt.zip\"  \"zip\"  \"bar.txt\"\n  // \"/foo/bar.dir/\"           | \"/foo\"         \"bar.dir\"      \"dir\"  \"bar\"\n  // \"/foo/bar.dir/file\"       | \"/foo/bar.dir\" \"file\"         \"\"     \"file\"\n  // \"/foo/bar.dir/file.txt\"   | \"/foo/bar.dir\" \"file.txt\"     \"txt\"  \"file\"\n  //  See also: basename, dirname\n  IGL_INLINE void pathinfo(\n    const std::string & path,\n    std::string & dirname,\n    std::string & basename,\n    std::string & extension,\n    std::string & filename);\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"pathinfo.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/per_corner_normals.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"per_corner_normals.h\"\n\n#include \"vertex_triangle_adjacency.h\"\n#include \"per_face_normals.h\"\n#include \"PI.h\"\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedCN>\nIGL_INLINE void igl::per_corner_normals(\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  const double corner_threshold,\n  Eigen::PlainObjectBase<DerivedCN> & CN)\n{\n  using namespace Eigen;\n  using namespace std;\n  Eigen::Matrix<typename DerivedV::Scalar,Eigen::Dynamic,3> FN;\n  per_face_normals(V,F,FN);\n  vector<vector<int> > VF,VFi;\n  vertex_triangle_adjacency(V,F,VF,VFi);\n  return per_corner_normals(V,F,FN,VF,corner_threshold,CN);\n}\n\ntemplate <\n  typename DerivedV, \n  typename DerivedF, \n  typename DerivedFN, \n  typename DerivedCN>\nIGL_INLINE void igl::per_corner_normals(\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  const Eigen::PlainObjectBase<DerivedFN>& FN,\n  const double corner_threshold,\n  Eigen::PlainObjectBase<DerivedCN> & CN)\n{\n  using namespace Eigen;\n  using namespace std;\n  vector<vector<int> > VF,VFi;\n  vertex_triangle_adjacency(V,F,VF,VFi);\n  return per_corner_normals(V,F,FN,VF,corner_threshold,CN);\n}\n\ntemplate <\n  typename DerivedV, \n  typename DerivedF, \n  typename DerivedFN, \n  typename IndexType,\n  typename DerivedCN>\nIGL_INLINE void igl::per_corner_normals(\n  const Eigen::PlainObjectBase<DerivedV>& /*V*/,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  const Eigen::PlainObjectBase<DerivedFN>& FN,\n  const std::vector<std::vector<IndexType> >& VF,\n  const double corner_threshold,\n  Eigen::PlainObjectBase<DerivedCN> & CN)\n{\n  using namespace Eigen;\n  using namespace std;\n\n  // number of faces\n  const int m = F.rows();\n  // valence of faces\n  const int n = F.cols();\n\n  // initialize output to ***zero***\n  CN.setZero(m*n,3);\n\n  // loop over faces\n  for(size_t i = 0;int(i)<m;i++)\n  {\n    // Normal of this face\n    Eigen::Matrix<typename DerivedV::Scalar,3,1> fn = FN.row(i);\n    // loop over corners\n    for(size_t j = 0;int(j)<n;j++)\n    {\n      const std::vector<IndexType> &incident_faces = VF[F(i,j)];\n      // loop over faces sharing vertex of this corner\n      for(int k = 0;k<(int)incident_faces.size();k++)\n      {\n        Eigen::Matrix<typename DerivedV::Scalar,3,1> ifn = FN.row(incident_faces[k]);\n        // dot product between face's normal and other face's normal\n        double dp = fn.dot(ifn);\n        // if difference in normal is slight then add to average\n        if(dp > cos(corner_threshold*PI/180))\n        {\n          // add to running sum\n          CN.row(i*n+j) += ifn;\n        // else ignore\n        }else\n        {\n        }\n      }\n      // normalize to take average\n      CN.row(i*n+j).normalize();\n    }\n  }\n}\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::per_corner_normals<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, double, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::per_corner_normals<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, double, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::per_corner_normals<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, double, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\ntemplate void igl::per_corner_normals<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, double, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/per_corner_normals.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_PER_CORNER_NORMALS_H\n#define IGL_PER_CORNER_NORMALS_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <vector>\n\nnamespace igl\n{\n  // Compute vertex normals via vertex position list, face list\n  // Inputs:\n  //   V  #V by 3 eigen Matrix of mesh vertex 3D positions\n  //   F  #F by 3 eigne Matrix of face (triangle) indices\n  //   corner_threshold  threshold in degrees on sharp angles\n  // Output:\n  //   CN  #F*3 by 3 eigen Matrix of mesh vertex 3D normals, where the normal\n  //     for corner F(i,j) is at CN(i*3+j,:) \n  template <typename DerivedV, typename DerivedF, typename DerivedCN>\n  IGL_INLINE void per_corner_normals(\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    const double corner_threshold,\n    Eigen::PlainObjectBase<DerivedCN> & CN);\n  // Other Inputs:\n  //   FN  #F by 3 eigen Matrix of face normals\n  template <\n    typename DerivedV, \n    typename DerivedF, \n    typename DerivedFN, \n    typename DerivedCN>\n  IGL_INLINE void per_corner_normals(\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    const Eigen::PlainObjectBase<DerivedFN>& FN,\n    const double corner_threshold,\n    Eigen::PlainObjectBase<DerivedCN> & CN);\n  // Other Inputs:\n  //   VF  map from vertices to list of incident faces\n  template <\n    typename DerivedV, \n    typename DerivedF, \n    typename DerivedFN, \n    typename IndexType,\n    typename DerivedCN>\n  IGL_INLINE void per_corner_normals(\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    const Eigen::PlainObjectBase<DerivedFN>& FN,\n    const std::vector<std::vector<IndexType> >& VF,\n    const double corner_threshold,\n    Eigen::PlainObjectBase<DerivedCN> & CN);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"per_corner_normals.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/per_edge_normals.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"all_edges.h\"\n#include \"doublearea.h\"\n#include \"per_edge_normals.h\"\n#include \"get_seconds.h\"\n#include \"per_face_normals.h\"\n#include \"unique_simplices.h\"\n#include <vector>\n\ntemplate <\n  typename DerivedV, \n  typename DerivedF, \n  typename DerivedFN, \n  typename DerivedN,\n  typename DerivedE,\n  typename DerivedEMAP>\nIGL_INLINE void igl::per_edge_normals(\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  const PerEdgeNormalsWeightingType weighting,\n  const Eigen::PlainObjectBase<DerivedFN>& FN,\n  Eigen::PlainObjectBase<DerivedN> & N,\n  Eigen::PlainObjectBase<DerivedE> & E,\n  Eigen::PlainObjectBase<DerivedEMAP> & EMAP)\n\n{\n  using namespace Eigen;\n  using namespace std;\n  assert(F.cols() == 3 && \"Faces must be triangles\");\n  // number of faces\n  const int m = F.rows();\n  // All occurances of directed edges\n  MatrixXi allE;\n  all_edges(F,allE);\n  // Find unique undirected edges and mapping\n  VectorXi _;\n  unique_simplices(allE,E,_,EMAP);\n  // now sort(allE,2) == E(EMAP,:), that is, if EMAP(i) = j, then E.row(j) is\n  // the undirected edge corresponding to the directed edge allE.row(i).\n\n  Eigen::VectorXd W;\n  switch(weighting)\n  {\n    case PER_EDGE_NORMALS_WEIGHTING_TYPE_UNIFORM:\n      // Do nothing\n      break;\n    default:\n      assert(false && \"Unknown weighting type\");\n    case PER_EDGE_NORMALS_WEIGHTING_TYPE_DEFAULT:\n    case PER_EDGE_NORMALS_WEIGHTING_TYPE_AREA:\n    {\n      doublearea(V,F,W);\n      break;\n    }\n  }\n\n  N.setZero(E.rows(),3);\n  for(int f = 0;f<m;f++)\n  {\n    for(int c = 0;c<3;c++)\n    {\n      if(weighting == PER_EDGE_NORMALS_WEIGHTING_TYPE_UNIFORM)\n      {\n        N.row(EMAP(f+c*m)) += FN.row(f);\n      }else\n      {\n        N.row(EMAP(f+c*m)) += W(f) * FN.row(f);\n      }\n    }\n  }\n}\n\ntemplate <\n  typename DerivedV, \n  typename DerivedF, \n  typename DerivedN,\n  typename DerivedE,\n  typename DerivedEMAP>\nIGL_INLINE void igl::per_edge_normals(\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  const PerEdgeNormalsWeightingType weighting,\n  Eigen::PlainObjectBase<DerivedN> & N,\n  Eigen::PlainObjectBase<DerivedE> & E,\n  Eigen::PlainObjectBase<DerivedEMAP> & EMAP)\n{\n  Eigen::Matrix<typename DerivedN::Scalar,Eigen::Dynamic,3> FN;\n  per_face_normals(V,F,FN);\n  return per_edge_normals(V,F,weighting,FN,N,E,EMAP);\n}\n\ntemplate <\n  typename DerivedV, \n  typename DerivedF, \n  typename DerivedN,\n  typename DerivedE,\n  typename DerivedEMAP>\nIGL_INLINE void igl::per_edge_normals(\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  Eigen::PlainObjectBase<DerivedN> & N,\n  Eigen::PlainObjectBase<DerivedE> & E,\n  Eigen::PlainObjectBase<DerivedEMAP> & EMAP)\n{\n  return \n    per_edge_normals(V,F,PER_EDGE_NORMALS_WEIGHTING_TYPE_DEFAULT,N,E,EMAP);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::per_edge_normals<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::per_edge_normals<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, igl::PerEdgeNormalsWeightingType, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::per_edge_normals<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, igl::PerEdgeNormalsWeightingType, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::per_edge_normals<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, igl::PerEdgeNormalsWeightingType, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::per_edge_normals<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/per_edge_normals.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_PER_EDGE_NORMALS_H\n#define IGL_PER_EDGE_NORMALS_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  enum PerEdgeNormalsWeightingType\n  {\n    // Incident face normals have uniform influence on edge normal\n    PER_EDGE_NORMALS_WEIGHTING_TYPE_UNIFORM = 0,\n    // Incident face normals are averaged weighted by area\n    PER_EDGE_NORMALS_WEIGHTING_TYPE_AREA = 1,\n    // Area weights\n    PER_EDGE_NORMALS_WEIGHTING_TYPE_DEFAULT = 2,\n    NUM_PER_EDGE_NORMALS_WEIGHTING_TYPE = 3\n  };\n  // Compute face normals via vertex position list, face list\n  // Inputs:\n  //   V  #V by 3 eigen Matrix of mesh vertex 3D positions\n  //   F  #F by 3 eigen Matrix of face (triangle) indices\n  //   weight  weighting type\n  //   FN  #F by 3 matrix of 3D face normals per face\n  // Output:\n  //   N  #2 by 3 matrix of mesh edge 3D normals per row\n  //   E  #E by 2 matrix of edge indices per row\n  //   EMAP  #E by 1 matrix of indices from all edges to E\n  //\n  template <\n    typename DerivedV, \n    typename DerivedF, \n    typename DerivedFN,\n    typename DerivedN,\n    typename DerivedE,\n    typename DerivedEMAP>\n  IGL_INLINE void per_edge_normals(\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    const PerEdgeNormalsWeightingType weight,\n    const Eigen::PlainObjectBase<DerivedFN>& FN,\n    Eigen::PlainObjectBase<DerivedN> & N,\n    Eigen::PlainObjectBase<DerivedE> & E,\n    Eigen::PlainObjectBase<DerivedEMAP> & EMAP);\n  template <\n    typename DerivedV, \n    typename DerivedF, \n    typename DerivedN,\n    typename DerivedE,\n    typename DerivedEMAP>\n  IGL_INLINE void per_edge_normals(\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    const PerEdgeNormalsWeightingType weight,\n    Eigen::PlainObjectBase<DerivedN> & N,\n    Eigen::PlainObjectBase<DerivedE> & E,\n    Eigen::PlainObjectBase<DerivedEMAP> & EMAP);\n  template <\n    typename DerivedV, \n    typename DerivedF, \n    typename DerivedN,\n    typename DerivedE,\n    typename DerivedEMAP>\n  IGL_INLINE void per_edge_normals(\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    Eigen::PlainObjectBase<DerivedN> & N,\n    Eigen::PlainObjectBase<DerivedE> & E,\n    Eigen::PlainObjectBase<DerivedEMAP> & EMAP);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"per_edge_normals.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/per_face_normals.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"per_face_normals.h\"\n#include <Eigen/Geometry>\n\n#define SQRT_ONE_OVER_THREE 0.57735026918962573\ntemplate <typename DerivedV, typename DerivedF, typename DerivedZ, typename DerivedN>\nIGL_INLINE void igl::per_face_normals(\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  const Eigen::PlainObjectBase<DerivedZ> & Z,\n  Eigen::PlainObjectBase<DerivedN> & N)\n{\n  N.resize(F.rows(),3);\n  // loop over faces\n  int Frows = F.rows();\n#pragma omp parallel for if (Frows>10000)\n  for(int i = 0; i < Frows;i++)\n  {\n    const Eigen::Matrix<typename DerivedV::Scalar, 1, 3> v1 = V.row(F(i,1)) - V.row(F(i,0));\n    const Eigen::Matrix<typename DerivedV::Scalar, 1, 3> v2 = V.row(F(i,2)) - V.row(F(i,0));\n    N.row(i) = v1.cross(v2);//.normalized();\n    typename DerivedV::Scalar r = N.row(i).norm();\n    if(r == 0)\n    {\n      N.row(i) = Z;\n    }else\n    {\n      N.row(i) /= r;\n    }\n  }\n}\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedN>\nIGL_INLINE void igl::per_face_normals(\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  Eigen::PlainObjectBase<DerivedN> & N)\n{\n  using namespace Eigen;\n  Matrix<typename DerivedN::Scalar,3,1> Z(0,0,0);\n  return per_face_normals(V,F,Z,N);\n}\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedN>\nIGL_INLINE void igl::per_face_normals_stable(\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  Eigen::PlainObjectBase<DerivedN> & N)\n{\n  using namespace Eigen;\n  typedef Matrix<typename DerivedV::Scalar,1,3> RowVectorV3;\n  typedef typename DerivedV::Scalar Scalar;\n\n  const size_t m = F.rows();\n\n  N.resize(F.rows(),3);\n  // Grad all points\n  for(size_t f = 0;f<m;f++)\n  {\n    const RowVectorV3 p0 = V.row(F(f,0));\n    const RowVectorV3 p1 = V.row(F(f,1));\n    const RowVectorV3 p2 = V.row(F(f,2));\n    const RowVectorV3 n0 = (p1 - p0).cross(p2 - p0);\n    const RowVectorV3 n1 = (p2 - p1).cross(p0 - p1);\n    const RowVectorV3 n2 = (p0 - p2).cross(p1 - p2);\n\n    // careful sum\n    for(int d = 0;d<3;d++)\n    {\n      // This is a little _silly_ in terms of complexity, but its recursive\n      // implementation is clean looking...\n      const std::function<Scalar(Scalar,Scalar,Scalar)> sum3 =\n        [&sum3](Scalar a, Scalar b, Scalar c)->Scalar\n      {\n        if(fabs(c)>fabs(a))\n        {\n          return sum3(c,b,a);\n        }\n        // c < a\n        if(fabs(c)>fabs(b))\n        {\n          return sum3(a,c,b);\n        }\n        // c < a, c < b\n        if(fabs(b)>fabs(a))\n        {\n          return sum3(b,a,c);\n        }\n        return (a+b)+c;\n      };\n\n      N(f,d) = sum3(n0(d),n1(d),n2(d));\n    }\n    // sum better not be sure, or else NaN\n    N.row(f) /= N.row(f).norm();\n  }\n\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::per_face_normals<Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<unsigned int, -1, 3, 1, -1, 3>, Eigen::Matrix<float, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<unsigned int, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 0, -1, 3> >&);\n// generated by autoexplicit.sh\ntemplate void igl::per_face_normals<Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<unsigned int, -1, 3, 1, -1, 3>, Eigen::Matrix<float, -1, 3, 1, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<unsigned int, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> >&);\ntemplate void igl::per_face_normals<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::per_face_normals<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 1, 0, 3, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::per_face_normals<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\ntemplate void igl::per_face_normals<Eigen::Matrix<float, -1, -1, 1, -1, -1>, Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1>, Eigen::Matrix<float, -1, -1, 1, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<float, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, -1, 1, -1, -1> >&);\ntemplate void igl::per_face_normals<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\ntemplate void igl::per_face_normals_stable<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\ntemplate void igl::per_face_normals_stable<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\ntemplate void igl::per_face_normals<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::per_face_normals_stable<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::per_face_normals<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, 1, 3, 1, 1, 3>, Eigen::Matrix<double, 1, -1, 1, 1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, 1, 3, 1, 1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, -1, 1, 1, -1> >&);\ntemplate void igl::per_face_normals<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 3, 1, -1, 3>, Eigen::Matrix<double, -1, 3, 1, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> >&);\ntemplate void igl::per_face_normals<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 3, 1, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\ntemplate void igl::per_face_normals<class Eigen::Matrix<double,-1,3,0,-1,3>,class Eigen::Matrix<int,-1,-1,0,-1,-1>,class Eigen::Matrix<double,-1,-1,0,-1,-1> >(class Eigen::PlainObjectBase<class Eigen::Matrix<double,-1,3,0,-1,3> > const &,class Eigen::PlainObjectBase<class Eigen::Matrix<int,-1,-1,0,-1,-1> > const &,class Eigen::PlainObjectBase<class Eigen::Matrix<double,-1,-1,0,-1,-1> > &);\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/per_face_normals.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_PER_FACE_NORMALS_H\n#define IGL_PER_FACE_NORMALS_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Compute face normals via vertex position list, face list\n  // Inputs:\n  //   V  #V by 3 eigen Matrix of mesh vertex 3D positions\n  //   F  #F by 3 eigen Matrix of face (triangle) indices\n  //   Z  3 vector normal given to faces with degenerate normal.\n  // Output:\n  //   N  #F by 3 eigen Matrix of mesh face (triangle) 3D normals\n  //\n  // Example:\n  //   // Give degenerate faces (1/3,1/3,1/3)^0.5\n  //   per_face_normals(V,F,Vector3d(1,1,1).normalized(),N);\n  template <typename DerivedV, typename DerivedF, typename DerivedZ, typename DerivedN>\n  IGL_INLINE void per_face_normals(\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    const Eigen::PlainObjectBase<DerivedZ> & Z,\n    Eigen::PlainObjectBase<DerivedN> & N);\n  // Wrapper with Z = (0,0,0). Note that this means that row norms will be zero\n  // (i.e. not 1) for degenerate normals.\n  template <typename DerivedV, typename DerivedF, typename DerivedN>\n  IGL_INLINE void per_face_normals(\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    Eigen::PlainObjectBase<DerivedN> & N);\n  // Special version where order of face indices is guaranteed not to effect\n  // output.\n  template <typename DerivedV, typename DerivedF, typename DerivedN>\n  IGL_INLINE void per_face_normals_stable(\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    Eigen::PlainObjectBase<DerivedN> & N);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"per_face_normals.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/per_vertex_attribute_smoothing.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"per_vertex_attribute_smoothing.h\"\n#include <vector>\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::per_vertex_attribute_smoothing(\n    const Eigen::PlainObjectBase<DerivedV>& Ain,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    Eigen::PlainObjectBase<DerivedV> & Aout)\n{\n    std::vector<double> denominator(Ain.rows(), 0);\n    Aout = DerivedV::Zero(Ain.rows(), Ain.cols());\n    for (int i = 0; i < F.rows(); ++i) {\n        for (int j = 0; j < 3; ++j) {\n            int j1 = (j + 1) % 3;\n            int j2 = (j + 2) % 3;\n            Aout.row(F(i, j)) += Ain.row(F(i, j1)) + Ain.row(F(i, j2));\n            denominator[F(i, j)] += 2;\n        }\n    }\n    for (int i = 0; i < Ain.rows(); ++i)\n        Aout.row(i) /= denominator[i];\n}\n\n#ifdef IGL_STATIC_LIBRARY\ntemplate void igl::per_vertex_attribute_smoothing<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/per_vertex_attribute_smoothing.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_PER_VERTEX_ATTRIBUTE_SMOOTHING_H\n#define IGL_PER_VERTEX_ATTRIBUTE_SMOOTHING_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n\nnamespace igl\n{\n  // Smooth vertex attributes using uniform Laplacian\n  // Inputs:\n  //   Ain  #V by #A eigen Matrix of mesh vertex attributes (each vertex has #A attributes)\n  //   F    #F by 3 eigne Matrix of face (triangle) indices\n  // Output:\n  //   Aout #V by #A eigen Matrix of mesh vertex attributes\n  template <typename DerivedV, typename DerivedF>\n  IGL_INLINE void per_vertex_attribute_smoothing(\n    const Eigen::PlainObjectBase<DerivedV>& Ain,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    Eigen::PlainObjectBase<DerivedV> & Aout);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"per_vertex_attribute_smoothing.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/per_vertex_normals.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"per_vertex_normals.h\"\n\n#include \"get_seconds.h\"\n#include \"per_face_normals.h\"\n#include \"doublearea.h\"\n#include \"parallel_for.h\"\n#include \"internal_angles.h\"\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::per_vertex_normals(\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  const igl::PerVertexNormalsWeightingType weighting,\n  Eigen::PlainObjectBase<DerivedV> & N)\n{\n  Eigen::Matrix<typename DerivedV::Scalar,Eigen::Dynamic,3> PFN;\n  igl::per_face_normals(V,F,PFN);\n  return per_vertex_normals(V,F,weighting,PFN,N);\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::per_vertex_normals(\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  Eigen::PlainObjectBase<DerivedV> & N)\n{\n  return per_vertex_normals(V,F,PER_VERTEX_NORMALS_WEIGHTING_TYPE_DEFAULT,N);\n}\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedFN, typename DerivedN>\nIGL_INLINE void igl::per_vertex_normals(\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  const igl::PerVertexNormalsWeightingType weighting,\n  const Eigen::PlainObjectBase<DerivedFN>& FN,\n  Eigen::PlainObjectBase<DerivedN> & N)\n{\n  using namespace std;\n  // Resize for output\n  N.setZero(V.rows(),3);\n\n  Eigen::Matrix<typename DerivedN::Scalar,DerivedF::RowsAtCompileTime,3>\n    W(F.rows(),3);\n  switch(weighting)\n  {\n    case PER_VERTEX_NORMALS_WEIGHTING_TYPE_UNIFORM:\n      W.setConstant(1.);\n      break;\n    default:\n      assert(false && \"Unknown weighting type\");\n    case PER_VERTEX_NORMALS_WEIGHTING_TYPE_DEFAULT:\n    case PER_VERTEX_NORMALS_WEIGHTING_TYPE_AREA:\n    {\n      Eigen::Matrix<typename DerivedN::Scalar,DerivedF::RowsAtCompileTime,1> A;\n      doublearea(V,F,A);\n      W = A.replicate(1,3);\n      break;\n    }\n    case PER_VERTEX_NORMALS_WEIGHTING_TYPE_ANGLE:\n      internal_angles(V,F,W);\n      break;\n  }\n\n  // loop over faces\n  for(int i = 0;i<F.rows();i++)\n  {\n    // throw normal at each corner\n    for(int j = 0; j < 3;j++)\n    {\n      N.row(F(i,j)) += W(i,j) * FN.row(i);\n    }\n  }\n\n  //// loop over faces\n  //std::mutex critical;\n  //std::vector<DerivedN> NN;\n  //parallel_for(\n  //  F.rows(),\n  //  [&NN,&N](const size_t n){ NN.resize(n,DerivedN::Zero(N.rows(),3));},\n  //  [&F,&W,&FN,&NN,&critical](const int i, const size_t t)\n  //  {\n  //    // throw normal at each corner\n  //    for(int j = 0; j < 3;j++)\n  //    {\n  //      // Q: Does this need to be critical?\n  //      // A: Yes. Different (i,j)'s could produce the same F(i,j)\n  //      NN[t].row(F(i,j)) += W(i,j) * FN.row(i);\n  //    }\n  //  },\n  //  [&N,&NN](const size_t t){ N += NN[t]; },\n  //  1000l);\n\n  // take average via normalization\n  N.rowwise().normalize();\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::per_vertex_normals(\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  const Eigen::PlainObjectBase<DerivedV>& FN,\n  Eigen::PlainObjectBase<DerivedV> & N)\n{\n  return\n    per_vertex_normals(V,F,PER_VERTEX_NORMALS_WEIGHTING_TYPE_DEFAULT,FN,N);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::per_vertex_normals<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::per_vertex_normals<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::per_vertex_normals<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, igl::PerVertexNormalsWeightingType, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\ntemplate void igl::per_vertex_normals<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\ntemplate void igl::per_vertex_normals<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\ntemplate void igl::per_vertex_normals<Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<unsigned int, -1, 3, 1, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<unsigned int, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> >&);\ntemplate void igl::per_vertex_normals<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, igl::PerVertexNormalsWeightingType, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::per_vertex_normals<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, igl::PerVertexNormalsWeightingType, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::per_vertex_normals<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 3, 1, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/per_vertex_normals.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_PER_VERTEX_NORMALS_H\n#define IGL_PER_VERTEX_NORMALS_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n// Note: It would be nice to support more or all of the methods here:\n// \"A comparison of algorithms for vertex normal computation\"\nnamespace igl\n{\n  enum PerVertexNormalsWeightingType\n  {\n    // Incident face normals have uniform influence on vertex normal\n    PER_VERTEX_NORMALS_WEIGHTING_TYPE_UNIFORM = 0,\n    // Incident face normals are averaged weighted by area\n    PER_VERTEX_NORMALS_WEIGHTING_TYPE_AREA = 1,\n    // Incident face normals are averaged weighted by incident angle of vertex\n    PER_VERTEX_NORMALS_WEIGHTING_TYPE_ANGLE = 2,\n    // Area weights\n    PER_VERTEX_NORMALS_WEIGHTING_TYPE_DEFAULT = 3,\n    NUM_PER_VERTEX_NORMALS_WEIGHTING_TYPE = 4\n  };\n  // Compute vertex normals via vertex position list, face list\n  // Inputs:\n  //   V  #V by 3 eigen Matrix of mesh vertex 3D positions\n  //   F  #F by 3 eigne Matrix of face (triangle) indices\n  //   weighting  Weighting type\n  // Output:\n  //   N  #V by 3 eigen Matrix of mesh vertex 3D normals\n  template <typename DerivedV, typename DerivedF>\n  IGL_INLINE void per_vertex_normals(\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    const igl::PerVertexNormalsWeightingType weighting,\n    Eigen::PlainObjectBase<DerivedV> & N);\n  // Without weighting\n  template <typename DerivedV, typename DerivedF>\n  IGL_INLINE void per_vertex_normals(\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    Eigen::PlainObjectBase<DerivedV> & N);\n  // Inputs:\n  //   FN  #F by 3 matrix of face (triangle) normals\n  template <typename DerivedV, typename DerivedF, typename DerivedFN, typename DerivedN>\n  IGL_INLINE void per_vertex_normals(\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    const PerVertexNormalsWeightingType weighting,\n    const Eigen::PlainObjectBase<DerivedFN>& FN,\n    Eigen::PlainObjectBase<DerivedN> & N);\n  // Without weighting\n  template <typename DerivedV, typename DerivedF>\n  IGL_INLINE void per_vertex_normals(\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    const Eigen::PlainObjectBase<DerivedV>& FN,\n    Eigen::PlainObjectBase<DerivedV> & N);\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"per_vertex_normals.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/per_vertex_point_to_plane_quadrics.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"per_vertex_point_to_plane_quadrics.h\"\n#include \"quadric_binary_plus_operator.h\"\n#include <Eigen/QR>\n#include <cassert>\n#include <cmath>\n\n\nIGL_INLINE void igl::per_vertex_point_to_plane_quadrics(\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  const Eigen::MatrixXi & EMAP,\n  const Eigen::MatrixXi & EF,\n  const Eigen::MatrixXi & EI,\n  std::vector<\n    std::tuple<Eigen::MatrixXd,Eigen::RowVectorXd,double> > & quadrics)\n{\n  using namespace std;\n  typedef std::tuple<Eigen::MatrixXd,Eigen::RowVectorXd,double> Quadric;\n  const int dim = V.cols();\n  //// Quadrics per face\n  //std::vector<Quadric> face_quadrics(F.rows());\n  // Initialize each vertex quadric to zeros\n  quadrics.resize(\n    V.rows(),\n    // gcc <=4.8 can't handle initializer lists correctly\n    Quadric{Eigen::MatrixXd::Zero(dim,dim),Eigen::RowVectorXd::Zero(dim),0});\n  Eigen::MatrixXd I = Eigen::MatrixXd::Identity(dim,dim);\n  // Rather initial with zeros, initial with a small amount of energy pull\n  // toward original vertex position\n  const double w = 1e-10;\n  for(int v = 0;v<V.rows();v++)\n  {\n    std::get<0>(quadrics[v]) = w*I;\n    Eigen::RowVectorXd Vv = V.row(v);\n    std::get<1>(quadrics[v]) = w*-Vv;\n    std::get<2>(quadrics[v]) = w*Vv.dot(Vv);\n  }\n  // Generic nD qslim from \"Simplifying Surfaces with Color and Texture\n  // using Quadric Error Metric\" (follow up to original QSlim)\n  for(int f = 0;f<F.rows();f++)\n  {\n    int infinite_corner = -1;\n    for(int c = 0;c<3;c++)\n    {\n      if(\n         std::isinf(V(F(f,c),0)) || \n         std::isinf(V(F(f,c),1)) || \n         std::isinf(V(F(f,c),2)))\n      {\n        assert(infinite_corner == -1 && \"Should only be one infinite corner\");\n        infinite_corner = c;\n      }\n    }\n    // Inputs:\n    //   p  1 by n row point on the subspace \n    //   S  m by n matrix where rows coorespond to orthonormal spanning\n    //     vectors of the subspace to which we're measuring distance (usually\n    //     a plane, m=2)\n    //   weight  scalar weight\n    // Returns quadric triple {A,b,c} so that A-2*b+c measures the quadric\n    const auto subspace_quadric = [&I](\n      const Eigen::RowVectorXd & p,\n      const Eigen::MatrixXd & S,\n      const double  weight)->Quadric\n    {\n      // Dimension of subspace\n      const int m = S.rows();\n      // Weight face's quadric (v'*A*v + 2*b'*v + c) by area\n      // e1 and e2 should be perpendicular\n      Eigen::MatrixXd A = I;\n      Eigen::RowVectorXd b = -p;\n      double c = p.dot(p);\n      for(int i = 0;i<m;i++)\n      {\n        Eigen::RowVectorXd ei = S.row(i);\n        for(int j = 0;j<i;j++) assert(std::abs(S.row(j).dot(ei)) < 1e-10);\n        A += -ei.transpose()*ei;\n        b += p.dot(ei)*ei;\n        c += -pow(p.dot(ei),2);\n      }\n      // gcc <=4.8 can't handle initializer lists correctly: needs explicit\n      // cast\n      return Quadric{ weight*A, weight*b, weight*c };\n    };\n    if(infinite_corner == -1)\n    {\n      // Finite (non-boundary) face\n      Eigen::RowVectorXd p = V.row(F(f,0));\n      Eigen::RowVectorXd q = V.row(F(f,1));\n      Eigen::RowVectorXd r = V.row(F(f,2));\n      Eigen::RowVectorXd pq = q-p;\n      Eigen::RowVectorXd pr = r-p;\n      // Gram Determinant = squared area of parallelogram \n      double area = sqrt(pq.squaredNorm()*pr.squaredNorm()-pow(pr.dot(pq),2));\n      Eigen::RowVectorXd e1 = pq.normalized();\n      Eigen::RowVectorXd e2 = (pr-e1.dot(pr)*e1).normalized();\n      Eigen::MatrixXd S(2,V.cols());\n      S<<e1,e2;\n      Quadric face_quadric = subspace_quadric(p,S,area);\n      // Throw at each corner\n      for(int c = 0;c<3;c++)\n      {\n        quadrics[F(f,c)] = quadrics[F(f,c)] + face_quadric;\n      }\n    }else\n    {\n      // cth corner is infinite --> edge opposite cth corner is boundary\n      // Boundary edge vector\n      const Eigen::RowVectorXd p = V.row(F(f,(infinite_corner+1)%3));\n      Eigen::RowVectorXd ev = V.row(F(f,(infinite_corner+2)%3)) - p;\n      const double length = ev.norm();\n      ev /= length;\n      // Face neighbor across boundary edge\n      int e = EMAP(f+F.rows()*infinite_corner);\n      int opp = EF(e,0) == f ? 1 : 0;\n      int n =  EF(e,opp);\n      int nc = EI(e,opp);\n      assert(\n        ((F(f,(infinite_corner+1)%3) == F(n,(nc+1)%3) && \n          F(f,(infinite_corner+2)%3) == F(n,(nc+2)%3)) || \n          (F(f,(infinite_corner+1)%3) == F(n,(nc+2)%3) \n          && F(f,(infinite_corner+2)%3) == F(n,(nc+1)%3))) && \n        \"Edge flaps not agreeing on shared edge\");\n      // Edge vector on opposite face\n      const Eigen::RowVectorXd eu = V.row(F(n,nc)) - p;\n      assert(!std::isinf(eu(0)));\n      // Matrix with vectors spanning plane as columns\n      Eigen::MatrixXd A(ev.size(),2);\n      A<<ev.transpose(),eu.transpose();\n      // Use QR decomposition to find basis for orthogonal space\n      Eigen::HouseholderQR<Eigen::MatrixXd> qr(A);\n      const Eigen::MatrixXd Q = qr.householderQ();\n      const Eigen::MatrixXd N = \n        Q.topRightCorner(ev.size(),ev.size()-2).transpose();\n      assert(N.cols() == ev.size());\n      assert(N.rows() == ev.size()-2);\n      Eigen::MatrixXd S(N.rows()+1,ev.size());\n      S<<ev,N;\n      Quadric boundary_edge_quadric = subspace_quadric(p,S,length);\n      for(int c = 0;c<3;c++)\n      {\n        if(c != infinite_corner)\n        {\n          quadrics[F(f,c)] = quadrics[F(f,c)] + boundary_edge_quadric;\n        }\n      }\n    }\n  }\n}\n\n"
  },
  {
    "path": "libs/libigl/include/igl/per_vertex_point_to_plane_quadrics.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_PER_VERTEX_POINT_TO_PLANE_QUADRICS_H\n#define IGL_PER_VERTEX_POINT_TO_PLANE_QUADRICS_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <vector>\n#include <tuple>\nnamespace igl\n{\n  // Compute quadrics per vertex of a \"closed\" triangle mesh (V,F). Rather than\n  // follow the qslim paper, this implements the lesser-known _follow up_\n  // \"Simplifying Surfaces with Color and Texture using Quadric Error Metrics\".\n  // This allows V to be n-dimensional (where the extra coordiantes store\n  // texture UVs, color RGBs, etc.\n  //\n  // Inputs:\n  //   V  #V by n list of vertex positions. Assumes that vertices with\n  //     infinite coordinates are \"points at infinity\" being used to close up\n  //     boundary edges with faces. This allows special subspace quadrice for\n  //     boundary edges: There should never be more than one \"point at\n  //     infinity\" in a single triangle.\n  //   F  #F by 3 list of triangle indices into V\n  //   E  #E by 2 list of edge indices into V.\n  //   EMAP #F*3 list of indices into E, mapping each directed edge to unique\n  //     unique edge in E\n  //   EF  #E by 2 list of edge flaps, EF(e,0)=f means e=(i-->j) is the edge of\n  //     F(f,:) opposite the vth corner, where EI(e,0)=v. Similarly EF(e,1) \"\n  //     e=(j->i)\n  //   EI  #E by 2 list of edge flap corners (see above).\n  // Outputs:\n  //   quadrics  #V list of quadrics, where a quadric is a tuple {A,b,c} such\n  //     that the quadratic energy of moving this vertex to position x is\n  //     given by x'Ax - 2b + c\n  //\n  IGL_INLINE void per_vertex_point_to_plane_quadrics(\n    const Eigen::MatrixXd & V,\n    const Eigen::MatrixXi & F,\n    const Eigen::MatrixXi & EMAP,\n    const Eigen::MatrixXi & EF,\n    const Eigen::MatrixXi & EI,\n    std::vector<\n      std::tuple<Eigen::MatrixXd,Eigen::RowVectorXd,double> > & quadrics);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"per_vertex_point_to_plane_quadrics.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/piecewise_constant_winding_number.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"piecewise_constant_winding_number.h\"\n#include \"unique_edge_map.h\"\n\ntemplate <\n  typename DerivedF,\n  typename DeriveduE,\n  typename uE2EType>\nIGL_INLINE bool igl::piecewise_constant_winding_number(\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  const Eigen::PlainObjectBase<DeriveduE>& uE,\n  const std::vector<std::vector<uE2EType> >& uE2E)\n{\n  const size_t num_faces = F.rows();\n  const size_t num_edges = uE.rows();\n  const auto edge_index_to_face_index = [&](size_t ei)\n  {\n    return ei % num_faces;\n  };\n  const auto is_consistent = [&](size_t fid, size_t s, size_t d)\n  {\n    if ((size_t)F(fid, 0) == s && (size_t)F(fid, 1) == d) return true;\n    if ((size_t)F(fid, 1) == s && (size_t)F(fid, 2) == d) return true;\n    if ((size_t)F(fid, 2) == s && (size_t)F(fid, 0) == d) return true;\n\n    if ((size_t)F(fid, 0) == d && (size_t)F(fid, 1) == s) return false;\n    if ((size_t)F(fid, 1) == d && (size_t)F(fid, 2) == s) return false;\n    if ((size_t)F(fid, 2) == d && (size_t)F(fid, 0) == s) return false;\n    throw \"Invalid face!!\";\n  };\n  for (size_t i=0; i<num_edges; i++)\n  {\n    const size_t s = uE(i,0);\n    const size_t d = uE(i,1);\n    int count=0;\n    for (const auto& ei : uE2E[i])\n    {\n      const size_t fid = edge_index_to_face_index(ei);\n      if (is_consistent(fid, s, d))\n      {\n        count++;\n      }\n      else\n      {\n        count--;\n      }\n    }\n    if (count != 0)\n    {\n      return false;\n    }\n  }\n  return true;\n}\ntemplate <typename DerivedF>\nIGL_INLINE bool igl::piecewise_constant_winding_number(\n  const Eigen::PlainObjectBase<DerivedF>& F)\n{\n  Eigen::Matrix<typename DerivedF::Scalar,Eigen::Dynamic,2> E, uE;\n  Eigen::Matrix<typename DerivedF::Scalar,Eigen::Dynamic,1> EMAP;\n  std::vector<std::vector<size_t> > uE2E;\n  unique_edge_map(F, E, uE, EMAP, uE2E);\n  return piecewise_constant_winding_number(F,uE,uE2E);\n}\n\n#ifdef IGL_STATIC_LIBRARY\ntemplate bool igl::piecewise_constant_winding_number<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, unsigned long>(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<std::vector<unsigned long, std::allocator<unsigned long> >, std::allocator<std::vector<unsigned long, std::allocator<unsigned long> > > > const&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/piecewise_constant_winding_number.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_PIECEWISE_CONSTANT_WINDING_NUMBER_H\n#define IGL_PIECEWISE_CONSTANT_WINDING_NUMBER_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <vector>\nnamespace igl\n{\n  // PIECEWISE_CONSTANT_WINDING_NUMBER Determine if a given mesh induces a\n  // piecewise constant winding number field: Is this mesh valid input to solid\n  // set operations.  **Assumes** that `(V,F)` contains no self-intersections\n  // (including degeneracies and co-incidences).  If there are co-planar and\n  // co-incident vertex placements, a mesh could _fail_ this combinatorial test\n  // but still induce a piecewise-constant winding number _geometrically_. For\n  // example, consider a hemisphere with boundary and then pinch the boundary\n  // \"shut\" along a line segment. The **_bullet-proof_** check is to first\n  // resolve all self-intersections in `(V,F) -> (SV,SF)` (i.e. what the\n  // `igl::copyleft::cgal::piecewise_constant_winding_number` overload does).\n  //\n  // Inputs:\n  //   F  #F by 3 list of triangle indices into some (abstract) list of\n  //     vertices V\n  //   uE  #uE by 2 list of unique edges indices into V\n  //   uE2E  #uE list of lists of indices into directed edges (#F * 3)\n  // Returns true if the mesh _combinatorially_ induces a piecewise constant\n  // winding number field.\n  //\n  template <\n    typename DerivedF,\n    typename DeriveduE,\n    typename uE2EType>\n  IGL_INLINE bool piecewise_constant_winding_number(\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    const Eigen::PlainObjectBase<DeriveduE>& uE,\n    const std::vector<std::vector<uE2EType> >& uE2E);\n  template <typename DerivedF>\n  IGL_INLINE bool piecewise_constant_winding_number(\n    const Eigen::PlainObjectBase<DerivedF>& F);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"piecewise_constant_winding_number.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/planarize_quad_mesh.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"planarize_quad_mesh.h\"\n#include \"quad_planarity.h\"\n#include <Eigen/Sparse>\n#include <Eigen/Eigenvalues> \n#include <iostream>\n\nnamespace igl\n{\n  template <typename DerivedV, typename DerivedF>\n  class PlanarizerShapeUp\n  {\n  protected:\n    // number of faces, number of vertices\n    long numV, numF;\n    // references to the input faces and vertices\n    const Eigen::PlainObjectBase<DerivedV> &Vin;\n    const Eigen::PlainObjectBase<DerivedF> &Fin;\n    \n    // vector consisting of the vertex positions stacked: [x;y;z;x;y;z...]\n    // vector consisting of a weight per face (currently all set to 1)\n    // vector consisting of the projected face vertices (might be different for the same vertex belonging to different faces)\n    Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 1> Vv, weightsSqrt, P;\n    \n    // Matrices as in the paper\n    // Q: lhs matrix\n    // Ni: matrix that subtracts the mean of a face from the 4 vertices of a face\n    Eigen::SparseMatrix<typename DerivedV::Scalar > Q, Ni;\n    Eigen::SimplicialLDLT<Eigen::SparseMatrix<typename DerivedV::Scalar > > solver;\n    \n    int maxIter;\n    double threshold;\n    const int ni = 4;\n    \n    // Matrix assemblers\n    inline void assembleQ();\n    inline void assembleP();\n    inline void assembleNi();\n\n    // Selects out of Vv the 4 vertices belonging to face fi\n    inline void assembleSelector(int fi,\n                          Eigen::SparseMatrix<typename DerivedV::Scalar > &S);\n    \n    \n  public:\n    // Init - assemble stacked vector and lhs matrix, factorize\n    inline PlanarizerShapeUp(const Eigen::PlainObjectBase<DerivedV> &V_,\n                             const Eigen::PlainObjectBase<DerivedF> &F_,\n                             const int maxIter_,\n                             const double &threshold_);\n    // Planarization - output to Vout\n    inline void planarize(Eigen::PlainObjectBase<DerivedV> &Vout);\n  };\n}\n\n//Implementation\n\ntemplate <typename DerivedV, typename DerivedF>\ninline igl::PlanarizerShapeUp<DerivedV, DerivedF>::PlanarizerShapeUp(const Eigen::PlainObjectBase<DerivedV> &V_,\n                                                                     const Eigen::PlainObjectBase<DerivedF> &F_,\n                                                                     const int maxIter_,\n                                                                     const double &threshold_):\nnumV(V_.rows()),\nnumF(F_.rows()),\nVin(V_),\nFin(F_),\nweightsSqrt(Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 1>::Ones(numF,1)),\nmaxIter(maxIter_),\nthreshold(threshold_)\n{\n  // assemble stacked vertex position vector\n  Vv.setZero(3*numV,1);\n  for (int i =0;i<numV;++i)\n    Vv.segment(3*i,3) = Vin.row(i);\n  // assemble and factorize lhs matrix\n  assembleQ();\n};\n\ntemplate <typename DerivedV, typename DerivedF>\ninline void igl::PlanarizerShapeUp<DerivedV, DerivedF>::assembleQ()\n{\n  std::vector<Eigen::Triplet<typename DerivedV::Scalar> > tripletList;\n  \n  // assemble the Ni matrix\n  assembleNi();\n  \n  for (int fi = 0; fi< numF; fi++)\n  {\n    Eigen::SparseMatrix<typename DerivedV::Scalar > Sfi;\n    assembleSelector(fi, Sfi);\n    \n    // the final matrix per face\n    Eigen::SparseMatrix<typename DerivedV::Scalar > Qi = weightsSqrt(fi)*Ni*Sfi;\n    // put it in the correct block of Q\n    // todo: this can be made faster by omitting the selector matrix\n    for (int k=0; k<Qi.outerSize(); ++k)\n      for (typename Eigen::SparseMatrix<typename DerivedV::Scalar >::InnerIterator it(Qi,k); it; ++it)\n      {\n        typename DerivedV::Scalar val = it.value();\n        int row = it.row();\n        int col = it.col();\n        tripletList.push_back(Eigen::Triplet<typename DerivedV::Scalar>(row+3*ni*fi,col,val));\n      }\n  }\n  \n  Q.resize(3*ni*numF,3*numV);\n  Q.setFromTriplets(tripletList.begin(), tripletList.end());\n  // the actual lhs matrix is Q'*Q\n  // prefactor that matrix\n  solver.compute(Q.transpose()*Q);\n  if(solver.info()!=Eigen::Success)\n  {\n    std::cerr << \"Cholesky failed - PlanarizerShapeUp.cpp\" << std::endl;\n    assert(0);\n  }\n}\n\ntemplate <typename DerivedV, typename DerivedF>\ninline void igl::PlanarizerShapeUp<DerivedV, DerivedF>::assembleNi()\n{\n  std::vector<Eigen::Triplet<typename DerivedV::Scalar>> tripletList;\n  for (int ii = 0; ii< ni; ii++)\n  {\n    for (int jj = 0; jj< ni; jj++)\n    {\n      tripletList.push_back(Eigen::Triplet<typename DerivedV::Scalar>(3*ii+0,3*jj+0,-1./ni));\n      tripletList.push_back(Eigen::Triplet<typename DerivedV::Scalar>(3*ii+1,3*jj+1,-1./ni));\n      tripletList.push_back(Eigen::Triplet<typename DerivedV::Scalar>(3*ii+2,3*jj+2,-1./ni));\n    }\n    tripletList.push_back(Eigen::Triplet<typename DerivedV::Scalar>(3*ii+0,3*ii+0,1.));\n    tripletList.push_back(Eigen::Triplet<typename DerivedV::Scalar>(3*ii+1,3*ii+1,1.));\n    tripletList.push_back(Eigen::Triplet<typename DerivedV::Scalar>(3*ii+2,3*ii+2,1.));\n  }\n  Ni.resize(3*ni,3*ni);\n  Ni.setFromTriplets(tripletList.begin(), tripletList.end());\n}\n\n//assumes V stacked [x;y;z;x;y;z...];\ntemplate <typename DerivedV, typename DerivedF>\ninline void igl::PlanarizerShapeUp<DerivedV, DerivedF>::assembleSelector(int fi,\n                                                                            Eigen::SparseMatrix<typename DerivedV::Scalar > &S)\n{\n  \n  std::vector<Eigen::Triplet<typename DerivedV::Scalar>> tripletList;\n  for (int fvi = 0; fvi< ni; fvi++)\n  {\n    int vi = Fin(fi,fvi);\n    tripletList.push_back(Eigen::Triplet<typename DerivedV::Scalar>(3*fvi+0,3*vi+0,1.));\n    tripletList.push_back(Eigen::Triplet<typename DerivedV::Scalar>(3*fvi+1,3*vi+1,1.));\n    tripletList.push_back(Eigen::Triplet<typename DerivedV::Scalar>(3*fvi+2,3*vi+2,1.));\n  }\n  \n  S.resize(3*ni,3*numV);\n  S.setFromTriplets(tripletList.begin(), tripletList.end());\n  \n}\n\n//project all faces to their closest planar face\ntemplate <typename DerivedV, typename DerivedF>\ninline void igl::PlanarizerShapeUp<DerivedV, DerivedF>::assembleP()\n{\n  P.setZero(3*ni*numF);\n  for (int fi = 0; fi< numF; fi++)\n  {\n    // todo: this can be made faster by omitting the selector matrix\n    Eigen::SparseMatrix<typename DerivedV::Scalar > Sfi;\n    assembleSelector(fi, Sfi);\n    Eigen::SparseMatrix<typename DerivedV::Scalar > NSi = Ni*Sfi;\n    \n    Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 1> Vi = NSi*Vv;\n    Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, Eigen::Dynamic> CC(3,ni);\n    for (int i = 0; i <ni; ++i)\n      CC.col(i) = Vi.segment(3*i, 3);\n    Eigen::Matrix<typename DerivedV::Scalar, 3, 3> C = CC*CC.transpose();\n    \n    // Alec: Doesn't compile\n    Eigen::EigenSolver<Eigen::Matrix<typename DerivedV::Scalar, 3, 3>> es(C);\n    // the real() is for compilation purposes\n    Eigen::Matrix<typename DerivedV::Scalar, 3, 1> lambda = es.eigenvalues().real();\n    Eigen::Matrix<typename DerivedV::Scalar, 3, 3> U = es.eigenvectors().real();\n    int min_i;\n    lambda.cwiseAbs().minCoeff(&min_i);\n    U.col(min_i).setZero();\n    Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, Eigen::Dynamic> PP = U*U.transpose()*CC;\n    for (int i = 0; i <ni; ++i)\n     P.segment(3*ni*fi+3*i, 3) =  weightsSqrt[fi]*PP.col(i);\n    \n  }\n}\n\n\ntemplate <typename DerivedV, typename DerivedF>\ninline void igl::PlanarizerShapeUp<DerivedV, DerivedF>::planarize(Eigen::PlainObjectBase<DerivedV> &Vout)\n{\n  Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 1> planarity;\n  Vout = Vin;\n  \n  for (int iter =0; iter<maxIter; ++iter)\n  {\n    igl::quad_planarity(Vout, Fin, planarity);\n    typename DerivedV::Scalar nonPlanarity = planarity.cwiseAbs().maxCoeff();\n    //std::cerr<<\"iter #\"<<iter<<\": max non-planarity: \"<<nonPlanarity<<std::endl;\n    if (nonPlanarity<threshold)\n      break;\n    assembleP();\n    Vv = solver.solve(Q.transpose()*P);\n    if(solver.info()!=Eigen::Success)\n    {\n      std::cerr << \"Linear solve failed - PlanarizerShapeUp.cpp\" << std::endl;\n      assert(0);\n    }\n    for (int i =0;i<numV;++i)\n      Vout.row(i) << Vv.segment(3*i,3).transpose();\n  }\n  // set the mean of Vout to the mean of Vin\n  Eigen::Matrix<typename DerivedV::Scalar, 1, 3> oldMean, newMean;\n  oldMean = Vin.colwise().mean();\n  newMean = Vout.colwise().mean();\n  Vout.rowwise() += (oldMean - newMean);\n  \n};\n\n  \n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::planarize_quad_mesh(const Eigen::PlainObjectBase<DerivedV> &Vin,\n                                    const Eigen::PlainObjectBase<DerivedF> &Fin,\n                                    const int maxIter,\n                                    const double &threshold,\n                                    Eigen::PlainObjectBase<DerivedV> &Vout)\n{\n  PlanarizerShapeUp<DerivedV, DerivedF> planarizer(Vin, Fin, maxIter, threshold);\n  planarizer.planarize(Vout);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::planarize_quad_mesh<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, int, double const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/planarize_quad_mesh.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_PLANARIZE_QUAD_MESH_H\n#define IGL_PLANARIZE_QUAD_MESH_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Planarizes a given quad mesh using the algorithm described in the paper\n  // \"Shape-Up: Shaping Discrete Geometry with Projections\" by S. Bouaziz,\n  // M. Deuss, Y. Schwartzburg, T. Weise, M. Pauly, Computer Graphics Forum,\n  // Volume 31, Issue 5, August 2012, p. 1657-1667\n  // (http://dl.acm.org/citation.cfm?id=2346802).\n  // The algorithm iterates between projecting each quad to its closest planar\n  // counterpart and stitching those quads together via a least squares\n  // optimization. It stops whenever all quads' non-planarity is less than a\n  // given threshold (suggested value: 0.01), or a maximum number of iterations\n  // is reached.\n\n  \n  // Inputs:\n  //   Vin        #V by 3 eigen Matrix of mesh vertex 3D positions\n  //   F          #F by 4 eigen Matrix of face (quad) indices\n  //   maxIter    maximum numbers of iterations\n  //   threshold  minimum allowed threshold for non-planarity\n  // Output:\n  //   Vout       #V by 3 eigen Matrix of planar mesh vertex 3D positions\n  //\n  \n  template <typename DerivedV, typename DerivedF>\n  IGL_INLINE void planarize_quad_mesh(const Eigen::PlainObjectBase<DerivedV> &Vin,\n                                      const Eigen::PlainObjectBase<DerivedF> &F,\n                                      const int maxIter,\n                                      const double &threshold,\n                                      Eigen::PlainObjectBase<DerivedV> &Vout);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"planarize_quad_mesh.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/ply.h",
    "content": "#ifndef IGL_PLY_H\n#define IGL_PLY_H\n/*\n\nHeader for PLY polygon files.\n\n- Greg Turk, March 1994\n\nA PLY file contains a single polygonal _object_.\n\nAn object is composed of lists of _elements_.  Typical elements are\nvertices, faces, edges and materials.\n\nEach type of element for a given object has one or more _properties_\nassociated with the element type.  For instance, a vertex element may\nhave as properties three floating-point values x,y,z and three unsigned\nchars for red, green and blue.\n\n---------------------------------------------------------------\n\nCopyright (c) 1994 The Board of Trustees of The Leland Stanford\nJunior University.  All rights reserved.   \n  \nPermission to use, copy, modify and distribute this software and its   \ndocumentation for any purpose is hereby granted without fee, provided   \nthat the above copyright notice and this permission notice appear in   \nall copies of this software and that you do not sell the software.   \n  \nTHE SOFTWARE IS PROVIDED \"AS IS\" AND WITHOUT WARRANTY OF ANY KIND,   \nEXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY   \nWARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.   \n\n*/\n\n/*\n--------------------------------------------------------------------------------\nJoao Fradinho Oliveira, July 2005\nCopyright (c) 2005 University College London \ncopyright conditions as above\n\nupdate for ply reading of multi OS ply files, in any OS (Unix, Macintosh, PC)\n--------------------------------------------------------------------------------\n\nply_open_for_reading\n\n* was changed to always open files in binary mode, files written in ascii can also be\nread with this binary mode.\n\n* allows opening of filenames that are alias files in macintosh\n\n* code tested on pc and mac\n\n\nget_words\n\n* was changed to handle line breaks in UNIX, MACINTOSH, PC, it resets the file pointer\naccordingly for the next read.\n\n\nNOTES:\nThe ply file, has always an ascii part for the header, and a binary or ascii\npart for the data.\nThe header part in ascii, dictates that linebreaks are used, this make models \noperating system dependent, as a line break in unix is indicated with the escape character \\n,\non a macintosh, with \\r, and on a pc with \\r\\n  <--2 unsigned chars, 2 bytes, instead of 1 byte.\n\nget_words allows reading of any OS, text editors such as BBEdit do not save the linebreaks\nproperly to target OSs with binary files.  \n\n*/\n\n#ifndef __PLY_H__\n#define __PLY_H__\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <stddef.h>\n#include <string.h>\n    \n#define PLY_ASCII         1      /* ascii PLY file */\n#define PLY_BINARY_BE     2      /* binary PLY file, big endian */\n#define PLY_BINARY_LE     3      /* binary PLY file, little endian */\n#define PLY_BINARY_NATIVE 4      /* binary PLY file, same endianness as\n\t\t\t\t    current architecture */\n    \n#define PLY_OKAY    0           /* ply routine worked okay */\n#define PLY_ERROR  -1           /* error in ply routine */\n\n/* scalar data types supported by PLY format */\n\n#define PLY_START_TYPE 0\n#define PLY_CHAR       1\n#define PLY_SHORT      2\n#define PLY_INT        3\n#define PLY_UCHAR      4\n#define PLY_USHORT     5\n#define PLY_UINT       6\n#define PLY_FLOAT      7\n#define PLY_DOUBLE     8\n#define PLY_END_TYPE   9\n\n#define  PLY_SCALAR  0\n#define  PLY_LIST    1\n\n\ntypedef struct PlyProperty {    /* description of a property */\n\n  const char *name;                           /* property name */\n  int external_type;                    /* file's data type */\n  int internal_type;                    /* program's data type */\n  int offset;                           /* offset bytes of prop in a struct */\n\n  int is_list;                          /* 1 = list, 0 = scalar */\n  int count_external;                   /* file's count type */\n  int count_internal;                   /* program's count type */\n  int count_offset;                     /* offset byte for list count */\n\n} PlyProperty;\n\ntypedef struct PlyElement {     /* description of an element */\n  const char *name;                   /* element name */\n  int num;                      /* number of elements in this object */\n  int size;                     /* size of element (bytes) or -1 if variable */\n  int nprops;                   /* number of properties for this element */\n  PlyProperty **props;          /* list of properties in the file */\n  char *store_prop;             /* flags: property wanted by user? */\n  int other_offset;             /* offset to un-asked-for props, or -1 if none*/\n  int other_size;               /* size of other_props structure */\n} PlyElement;\n\ntypedef struct PlyOtherProp {   /* describes other properties in an element */\n  const char *name;                   /* element name */\n  int size;                     /* size of other_props */\n  int nprops;                   /* number of properties in other_props */\n  PlyProperty **props;          /* list of properties in other_props */\n} PlyOtherProp;\n\ntypedef struct OtherData { /* for storing other_props for an other element */\n  void *other_props;\n} OtherData;\n\ntypedef struct OtherElem {     /* data for one \"other\" element */\n  char *elem_name;             /* names of other elements */\n  int elem_count;              /* count of instances of each element */\n  OtherData **other_data;      /* actual property data for the elements */\n  PlyOtherProp *other_props;   /* description of the property data */\n} OtherElem;\n\ntypedef struct PlyOtherElems {  /* \"other\" elements, not interpreted by user */\n  int num_elems;                /* number of other elements */\n  OtherElem *other_list;        /* list of data for other elements */\n} PlyOtherElems;\n\ntypedef struct PlyFile {        /* description of PLY file */\n  FILE *fp;                     /* file pointer */\n  int file_type;                /* ascii or binary */\n  float version;                /* version number of file */\n  int nelems;                   /* number of elements of object */\n  PlyElement **elems;           /* list of elements */\n  int num_comments;             /* number of comments */\n  char **comments;              /* list of comments */\n  int num_obj_info;             /* number of items of object information */\n  char **obj_info;              /* list of object info items */\n  PlyElement *which_elem;       /* which element we're currently writing */\n  PlyOtherElems *other_elems;   /* \"other\" elements from a PLY file */\n} PlyFile;\n\n/* memory allocation */\nextern char *my_alloc();\n#define myalloc(mem_size) my_alloc((mem_size), __LINE__, __FILE__)\n\n#ifndef ALLOCN\n#define REALLOCN(PTR,TYPE,OLD_N,NEW_N)\t\t\t\t\t\t\t\\\n        {\t\t\t\t\t\t\t\t\t\t\\\n\t    if ((OLD_N) == 0)                                           \t\t\\\n\t    {   ALLOCN((PTR),TYPE,(NEW_N));}                            \t\t\\\n\t    else\t\t\t\t\t\t\t\t\t\\\n\t    {\t\t\t\t\t\t\t\t    \t\t\\\n\t       (PTR) = (TYPE *)realloc((PTR),(NEW_N)*sizeof(TYPE));\t\t\t\\\n\t       if (((PTR) == NULL) && ((NEW_N) != 0))\t\t\t\t\t\\\n\t       {\t\t\t\t\t\t\t\t\t\\\n\t\t   fprintf(stderr, \"Memory reallocation failed on line %d in %s\\n\", \t\\\n\t\t           __LINE__, __FILE__);                             \t\t\\\n\t\t   fprintf(stderr, \"  tried to reallocate %d->%d\\n\",       \t\t\\\n\t\t\t   (OLD_N), (NEW_N));                              \t\t\\\n\t\t   exit(-1);\t\t\t\t\t\t\t\t\\\n\t       }\t\t\t\t\t\t\t\t\t\\\n\t       if ((NEW_N)>(OLD_N))\t\t\t\t\t\t\t\\\n\t\t   memset((char *)(PTR)+(OLD_N)*sizeof(TYPE), 0,\t\t\t\\\n\t\t          ((NEW_N)-(OLD_N))*sizeof(TYPE));\t\t\t\t\\\n\t    }\t\t\t\t\t\t\t\t\t\t\\\n\t}\n\n#define  ALLOCN(PTR,TYPE,N) \t\t\t\t\t\\\n\t{ (PTR) = (TYPE *) calloc(((unsigned)(N)),sizeof(TYPE));\\\n\t  if ((PTR) == NULL) {    \t\t\t\t\\\n\t  fprintf(stderr, \"Memory allocation failed on line %d in %s\\n\", \\\n\t\t __LINE__, __FILE__);                           \\\n\t  exit(-1);                                             \\\n\t  }\t\t\t\t\t\t\t\\\n\t}\n\n\n#define FREE(PTR)  { free((PTR)); (PTR) = NULL; }\n#endif\n    \n\n/*** delcaration of routines ***/\n\ninline int get_native_binary_type2();\n\ninline PlyFile *ply_write(FILE *, int,const char **, int);\ninline PlyFile *ply_open_for_writing(char *, int,const char **, int, float *);\ninline void ply_describe_element(PlyFile *, const char *, int, int, PlyProperty *);\ninline void ply_describe_property(PlyFile *, const char *, PlyProperty *);\ninline void ply_element_count(PlyFile *, const char *, int);\ninline void ply_header_complete(PlyFile *);\ninline void ply_put_element_setup(PlyFile *, const char *);\ninline void ply_put_element(PlyFile *, void *);\ninline void ply_put_comment(PlyFile *, char *);\ninline void ply_put_obj_info(PlyFile *, char *);\ninline PlyFile *ply_read(FILE *, int *, char ***);\ninline PlyFile *ply_open_for_reading( const char *, int *, char ***, int *, float *);\ninline PlyProperty **ply_get_element_description(PlyFile *, const char *, int*, int*);\ninline void ply_get_element_setup( PlyFile *, const char *, int, PlyProperty *);\ninline void ply_get_property(PlyFile *, const char *, PlyProperty *);\ninline PlyOtherProp *ply_get_other_properties(PlyFile *, const char *, int);\ninline void ply_get_element(PlyFile *, void *);\ninline char **ply_get_comments(PlyFile *, int *);\ninline char **ply_get_obj_info(PlyFile *, int *);\ninline void ply_close(PlyFile *);\ninline void ply_get_info(PlyFile *, float *, int *);\ninline PlyOtherElems *ply_get_other_element (PlyFile *, const char *, int);\ninline void ply_describe_other_elements ( PlyFile *, PlyOtherElems *);\ninline void ply_put_other_elements (PlyFile *);\ninline void ply_free_other_elements (PlyOtherElems *);\ninline void ply_describe_other_properties(PlyFile *, PlyOtherProp *, int);\n\ninline int equal_strings(const char *, const char *);\n\n\n#ifdef __cplusplus\n}\n#endif\n#endif /* !__PLY_H__ */\n/*\n\nThe interface routines for reading and writing PLY polygon files.\n\nGreg Turk, February 1994\n\n---------------------------------------------------------------\n\nA PLY file contains a single polygonal _object_.\n\nAn object is composed of lists of _elements_.  Typical elements are\nvertices, faces, edges and materials.\n\nEach type of element for a given object has one or more _properties_\nassociated with the element type.  For instance, a vertex element may\nhave as properties the floating-point values x,y,z and the three unsigned\nchars representing red, green and blue.\n\n---------------------------------------------------------------\n\nCopyright (c) 1994 The Board of Trustees of The Leland Stanford\nJunior University.  All rights reserved.   \n  \nPermission to use, copy, modify and distribute this software and its   \ndocumentation for any purpose is hereby granted without fee, provided   \nthat the above copyright notice and this permission notice appear in   \nall copies of this software and that you do not sell the software.   \n  \nTHE SOFTWARE IS PROVIDED \"AS IS\" AND WITHOUT WARRANTY OF ANY KIND,   \nEXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY   \nWARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.   \n\n*/\n\n/*\n--------------------------------------------------------------------------------\nJoao Fradinho Oliveira, July 2005\nUniversity College London \n\nupdate for ply reading of multi OS ply files, in any OS (Unix, Macintosh, PC)\n--------------------------------------------------------------------------------\n\nply_open_for_reading\n\n* was changed to always open files in binary mode, files written in ascii can also be\nread with this binary mode.\n\n* allows opening of filenames that are alias files in macintosh\n\n* code tested on pc and mac\n\n\nget_words\n\n* was changed to handle line breaks in UNIX, MACINTOSH, PC, it resets the file pointer\naccordingly for the next read.\n\n\nNOTES:\nThe ply file, has always an ascii part for the header, and a binary or ascii\npart for the data.\nThe header part in ascii, dictates that linebreaks are used, this make models \noperating system dependent, as a line break in unix is indicated with the escape character \\n,\non a macintosh, with \\r, and on a pc with \\r\\n  <--2 unsigned chars, 2 bytes, instead of 1 byte.\n\nget_words allows reading of any OS, text editors such as BBEdit do not save the linebreaks\nproperly to target OSs with binary files.  \n\n*/\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <math.h>\n#include <string.h>\n//#include \"ply.h\"\n\n// Use unnamed namespace to avoid duplicate symbols\nnamespace\n{\nconst char *type_names[] = {\n\"invalid\",\n\"char\", \"short\", \"int\",\n\"uchar\", \"ushort\", \"uint\",\n\"float\", \"double\",\n};\n\nconst char *alt_type_names[] = {  /* names of scalar types */\n\"invalid\",\n\"int8\", \"int16\", \"int32\", \"uint8\", \"uint16\", \"uint32\", \"float32\", \"float64\",\n};\n\nint ply_type_size[] = {\n  0, 1, 2, 4, 1, 2, 4, 4, 8\n};\n}\n\ntypedef union\n{\n      int  int_value;\n      char byte_values[sizeof(int)];\n} endian_test_type;\n\n\nnamespace\n{\nstatic int native_binary_type = -1;\nstatic int types_checked = 0;\n}\n\n#define NO_OTHER_PROPS  -1\n\n#define DONT_STORE_PROP  0\n#define STORE_PROP       1\n\n#define OTHER_PROP       0\n#define NAMED_PROP       1\n\n/* returns 1 if strings are equal, 0 if not */\ninline int equal_strings(const char *, const char *);\n\n/* find an element in a plyfile's list */\ninline PlyElement *find_element(PlyFile *, const char *);\n\n/* find a property in an element's list */\ninline PlyProperty *find_property(PlyElement *, const char *, int *);\n\n/* write to a file the word describing a PLY file data type */\ninline void write_scalar_type (FILE *, int);\n\n/* read a line from a file and break it up into separate words */\ninline char **get_words(FILE *, int *, char **);\ninline char **old_get_words(FILE *, int *);\n\n/* write an item to a file */\ninline void write_binary_item(FILE *, int, int, unsigned int, double, int);\ninline void write_ascii_item(FILE *, int, unsigned int, double, int);\ninline double old_write_ascii_item(FILE *, char *, int);\n\n/* add information to a PLY file descriptor */\ninline void add_element(PlyFile *, char **);\ninline void add_property(PlyFile *, char **);\ninline void add_comment(PlyFile *, char *);\ninline void add_obj_info(PlyFile *, char *);\n\n/* copy a property */\ninline void copy_property(PlyProperty *, PlyProperty *);\n\n/* store a value into where a pointer and a type specify */\ninline void store_item(char *, int, int, unsigned int, double);\n\n/* return the value of a stored item */\ninline void get_stored_item( void *, int, int *, unsigned int *, double *);\n\n/* return the value stored in an item, given ptr to it and its type */\ninline double get_item_value(char *, int);\n\n/* get binary or ascii item and store it according to ptr and type */\ninline void get_ascii_item(char *, int, int *, unsigned int *, double *);\ninline void get_binary_item(FILE *, int, int, int *, unsigned int *, double *);\n\n/* get a bunch of elements from a file */\ninline void ascii_get_element(PlyFile *, char *);\ninline void binary_get_element(PlyFile *, char *);\n\n/* memory allocation */\ninline char *my_alloc(int, int, const char *);\n\n/* byte ordering */\ninline void get_native_binary_type();\ninline void swap_bytes(char *, int);\n\ninline void check_types();\n\n\n/*************/\n/*  Writing  */\n/*************/\n\n\n/******************************************************************************\nGiven a file pointer, get ready to write PLY data to the file.\n\nEntry:\n  fp         - the given file pointer\n  nelems     - number of elements in object\n  elem_names - list of element names\n  file_type  - file type, either ascii or binary\n\nExit:\n  returns a pointer to a PlyFile, used to refer to this file, or NULL if error\n******************************************************************************/\n\ninline PlyFile *ply_write(\n  FILE *fp,\n  int nelems,\n  const char **elem_names,\n  int file_type\n)\n{\n  int i;\n  PlyFile *plyfile;\n  PlyElement *elem;\n\n  /* check for NULL file pointer */\n  if (fp == NULL)\n    return (NULL);\n\n  if (native_binary_type == -1)\n     get_native_binary_type();\n  if (!types_checked)\n     check_types();\n  \n  /* create a record for this object */\n\n  plyfile = (PlyFile *) myalloc (sizeof (PlyFile));\n  if (file_type == PLY_BINARY_NATIVE)\n     plyfile->file_type = native_binary_type;\n  else\n     plyfile->file_type = file_type;\n  plyfile->num_comments = 0;\n  plyfile->num_obj_info = 0;\n  plyfile->nelems = nelems;\n  plyfile->version = 1.0;\n  plyfile->fp = fp;\n  plyfile->other_elems = NULL;\n\n  /* tuck aside the names of the elements */\n\n  plyfile->elems = (PlyElement **) myalloc (sizeof (PlyElement *) * nelems);\n  for (i = 0; i < nelems; i++) {\n    elem = (PlyElement *) myalloc (sizeof (PlyElement));\n    plyfile->elems[i] = elem;\n    elem->name = strdup (elem_names[i]);\n    elem->num = 0;\n    elem->nprops = 0;\n  }\n\n  /* return pointer to the file descriptor */\n  return (plyfile);\n}\n\n\n/******************************************************************************\nOpen a polygon file for writing.\n\nEntry:\n  filename   - name of file to read from\n  nelems     - number of elements in object\n  elem_names - list of element names\n  file_type  - file type, either ascii or binary\n\nExit:\n  version - version number of PLY file\n  returns a file identifier, used to refer to this file, or NULL if error\n******************************************************************************/\n\ninline PlyFile *ply_open_for_writing(\n  const char *filename,\n  int nelems,\n  const char **elem_names,\n  int file_type,\n  float *version\n)\n{\n  PlyFile *plyfile;\n  char *name;\n  FILE *fp;\n\n  /* tack on the extension .ply, if necessary */\n\n  name = (char *) myalloc (sizeof (char) * (strlen (filename) + 5));\n  strcpy (name, filename);\n  if (strlen (name) < 4 ||\n      strcmp (name + strlen (name) - 4, \".ply\") != 0)\n      strcat (name, \".ply\");\n\n  /* open the file for writing */\n\n  fp = fopen (name, \"w\");\n  if (fp == NULL) {\n    return (NULL);\n  }\n\n  /* create the actual PlyFile structure */\n\n  plyfile = ply_write (fp, nelems, elem_names, file_type);\n  if (plyfile == NULL)\n    return (NULL);\n\n  /* say what PLY file version number we're writing */\n  *version = plyfile->version;\n\n  /* return pointer to the file descriptor */\n  return (plyfile);\n}\n\n\n/******************************************************************************\nDescribe an element, including its properties and how many will be written\nto the file.\n\nEntry:\n  plyfile   - file identifier\n  elem_name - name of element that information is being specified about\n  nelems    - number of elements of this type to be written\n  nprops    - number of properties contained in the element\n  prop_list - list of properties\n******************************************************************************/\n\ninline void ply_describe_element(\n  PlyFile *plyfile,\n  const char *elem_name,\n  int nelems,\n  int nprops,\n  PlyProperty *prop_list\n)\n{\n  int i;\n  PlyElement *elem;\n  PlyProperty *prop;\n\n  /* look for appropriate element */\n  elem = find_element (plyfile, elem_name);\n  if (elem == NULL) {\n    fprintf(stderr,\"ply_describe_element: can't find element '%s'\\n\",elem_name);\n    exit (-1);\n  }\n\n  elem->num = nelems;\n\n  /* copy the list of properties */\n\n  elem->nprops = nprops;\n  elem->props = (PlyProperty **) myalloc (sizeof (PlyProperty *) * nprops);\n  elem->store_prop = (char *) myalloc (sizeof (char) * nprops);\n\n  for (i = 0; i < nprops; i++) {\n    prop = (PlyProperty *) myalloc (sizeof (PlyProperty));\n    elem->props[i] = prop;\n    elem->store_prop[i] = NAMED_PROP;\n    copy_property (prop, &prop_list[i]);\n  }\n}\n\n\n/******************************************************************************\nDescribe a property of an element.\n\nEntry:\n  plyfile   - file identifier\n  elem_name - name of element that information is being specified about\n  prop      - the new property\n******************************************************************************/\n\ninline void ply_describe_property(\n  PlyFile *plyfile,\n  const char *elem_name,\n  PlyProperty *prop\n)\n{\n  PlyElement *elem;\n  PlyProperty *elem_prop;\n\n  /* look for appropriate element */\n  elem = find_element (plyfile, elem_name);\n  if (elem == NULL) {\n    fprintf(stderr, \"ply_describe_property: can't find element '%s'\\n\",\n            elem_name);\n    return;\n  }\n\n  /* create room for new property */\n\n  if (elem->nprops == 0) {\n    elem->props = (PlyProperty **) myalloc (sizeof (PlyProperty *));\n    elem->store_prop = (char *) myalloc (sizeof (char));\n    elem->nprops = 1;\n  }\n  else {\n    elem->nprops++;\n    elem->props = (PlyProperty **)\n                  realloc (elem->props, sizeof (PlyProperty *) * elem->nprops);\n    elem->store_prop = (char *)\n                  realloc (elem->store_prop, sizeof (char) * elem->nprops);\n  }\n\n  /* copy the new property */\n\n  elem_prop = (PlyProperty *) myalloc (sizeof (PlyProperty));\n  elem->props[elem->nprops - 1] = elem_prop;\n  elem->store_prop[elem->nprops - 1] = NAMED_PROP;\n  copy_property (elem_prop, prop);\n}\n\n\n/******************************************************************************\nDescribe what the \"other\" properties are that are to be stored, and where\nthey are in an element.\n******************************************************************************/\n\ninline void ply_describe_other_properties(\n  PlyFile *plyfile,\n  PlyOtherProp *other,\n  int offset\n)\n{\n  int i;\n  PlyElement *elem;\n  PlyProperty *prop;\n\n  /* look for appropriate element */\n  elem = find_element (plyfile, other->name);\n  if (elem == NULL) {\n    fprintf(stderr, \"ply_describe_other_properties: can't find element '%s'\\n\",\n            other->name);\n    return;\n  }\n\n  /* create room for other properties */\n\n  if (elem->nprops == 0) {\n    elem->props = (PlyProperty **)\n                  myalloc (sizeof (PlyProperty *) * other->nprops);\n    elem->store_prop = (char *) myalloc (sizeof (char) * other->nprops);\n    elem->nprops = 0;\n  }\n  else {\n    int newsize;\n    newsize = elem->nprops + other->nprops;\n    elem->props = (PlyProperty **)\n                  realloc (elem->props, sizeof (PlyProperty *) * newsize);\n    elem->store_prop = (char *)\n                  realloc (elem->store_prop, sizeof (char) * newsize);\n  }\n\n  /* copy the other properties */\n\n  for (i = 0; i < other->nprops; i++) {\n    prop = (PlyProperty *) myalloc (sizeof (PlyProperty));\n    copy_property (prop, other->props[i]);\n    elem->props[elem->nprops] = prop;\n    elem->store_prop[elem->nprops] = OTHER_PROP;\n    elem->nprops++;\n  }\n\n  /* save other info about other properties */\n  elem->other_size = other->size;\n  elem->other_offset = offset;\n}\n\n\n/******************************************************************************\nState how many of a given element will be written.\n\nEntry:\n  plyfile   - file identifier\n  elem_name - name of element that information is being specified about\n  nelems    - number of elements of this type to be written\n******************************************************************************/\n\ninline void ply_element_count(\n  PlyFile *plyfile,\n  const char *elem_name,\n  int nelems\n)\n{\n  PlyElement *elem;\n\n  /* look for appropriate element */\n  elem = find_element (plyfile, elem_name);\n  if (elem == NULL) {\n    fprintf(stderr,\"ply_element_count: can't find element '%s'\\n\",elem_name);\n    exit (-1);\n  }\n\n  elem->num = nelems;\n}\n\n\n/******************************************************************************\nSignal that we've described everything a PLY file's header and that the\nheader should be written to the file.\n\nEntry:\n  plyfile - file identifier\n******************************************************************************/\n\ninline void ply_header_complete(PlyFile *plyfile)\n{\n  int i,j;\n  FILE *fp = plyfile->fp;\n  PlyElement *elem;\n  PlyProperty *prop;\n\n  fprintf (fp, \"ply\\n\");\n\n  switch (plyfile->file_type) {\n    case PLY_ASCII:\n      fprintf (fp, \"format ascii 1.0\\n\");\n      break;\n    case PLY_BINARY_BE:\n      fprintf (fp, \"format binary_big_endian 1.0\\n\");\n      break;\n    case PLY_BINARY_LE:\n      fprintf (fp, \"format binary_little_endian 1.0\\n\");\n      break;\n    default:\n      fprintf (stderr, \"ply_header_complete: bad file type = %d\\n\",\n               plyfile->file_type);\n      exit (-1);\n  }\n\n  /* write out the comments */\n\n  for (i = 0; i < plyfile->num_comments; i++)\n    fprintf (fp, \"comment %s\\n\", plyfile->comments[i]);\n\n  /* write out object information */\n\n  for (i = 0; i < plyfile->num_obj_info; i++)\n    fprintf (fp, \"obj_info %s\\n\", plyfile->obj_info[i]);\n\n  /* write out information about each element */\n\n  for (i = 0; i < plyfile->nelems; i++) {\n\n    elem = plyfile->elems[i];\n    fprintf (fp, \"element %s %d\\n\", elem->name, elem->num);\n\n    /* write out each property */\n    for (j = 0; j < elem->nprops; j++) {\n      prop = elem->props[j];\n      if (prop->is_list) {\n        fprintf (fp, \"property list \");\n        write_scalar_type (fp, prop->count_external);\n        fprintf (fp, \" \");\n        write_scalar_type (fp, prop->external_type);\n        fprintf (fp, \" %s\\n\", prop->name);\n      }\n      else {\n        fprintf (fp, \"property \");\n        write_scalar_type (fp, prop->external_type);\n        fprintf (fp, \" %s\\n\", prop->name);\n      }\n    }\n  }\n\n  fprintf (fp, \"end_header\\n\");\n}\n\n\n/******************************************************************************\nSpecify which elements are going to be written.  This should be called\nbefore a call to the routine ply_put_element().\n\nEntry:\n  plyfile   - file identifier\n  elem_name - name of element we're talking about\n******************************************************************************/\n\ninline void ply_put_element_setup(PlyFile *plyfile, const char *elem_name)\n{\n  PlyElement *elem;\n\n  elem = find_element (plyfile, elem_name);\n  if (elem == NULL) {\n    fprintf(stderr, \"ply_elements_setup: can't find element '%s'\\n\", elem_name);\n    exit (-1);\n  }\n\n  plyfile->which_elem = elem;\n}\n\n\n/******************************************************************************\nWrite an element to the file.  This routine assumes that we're\nwriting the type of element specified in the last call to the routine\nply_put_element_setup().\n\nEntry:\n  plyfile  - file identifier\n  elem_ptr - pointer to the element\n******************************************************************************/\n\ninline void ply_put_element(PlyFile *plyfile, void *elem_ptr)\n{\n  int j,k;\n  FILE *fp = plyfile->fp;\n  PlyElement *elem;\n  PlyProperty *prop;\n  char *elem_data,*item;\n  char **item_ptr;\n  int list_count;\n  int item_size;\n  int int_val;\n  unsigned int uint_val;\n  double double_val;\n  char **other_ptr;\n\n  elem = plyfile->which_elem;\n  elem_data = (char *)elem_ptr;\n  other_ptr = (char **) (((char *) elem_ptr) + elem->other_offset);\n\n  /* write out either to an ascii or binary file */\n\n  if (plyfile->file_type == PLY_ASCII) {\n\n    /* write an ascii file */\n\n    /* write out each property of the element */\n    for (j = 0; j < elem->nprops; j++) {\n      prop = elem->props[j];\n      if (elem->store_prop[j] == OTHER_PROP)\n        elem_data = *other_ptr;\n      else\n        elem_data = (char *)elem_ptr;\n      if (prop->is_list) {\n        item = elem_data + prop->count_offset;\n        get_stored_item ((void *) item, prop->count_internal,\n                         &int_val, &uint_val, &double_val);\n        write_ascii_item (fp, int_val, uint_val, double_val,\n                          prop->count_external);\n        list_count = uint_val;\n        item_ptr = (char **) (elem_data + prop->offset);\n        item = item_ptr[0];\n        item_size = ply_type_size[prop->internal_type];\n        for (k = 0; k < list_count; k++) {\n          get_stored_item ((void *) item, prop->internal_type,\n                           &int_val, &uint_val, &double_val);\n          write_ascii_item (fp, int_val, uint_val, double_val,\n                            prop->external_type);\n          item += item_size;\n        }\n      }\n      else {\n        item = elem_data + prop->offset;\n        get_stored_item ((void *) item, prop->internal_type,\n                         &int_val, &uint_val, &double_val);\n        write_ascii_item (fp, int_val, uint_val, double_val,\n                          prop->external_type);\n      }\n    }\n\n    fprintf (fp, \"\\n\");\n  }\n  else {\n\n    /* write a binary file */\n\n    /* write out each property of the element */\n    for (j = 0; j < elem->nprops; j++) {\n      prop = elem->props[j];\n      if (elem->store_prop[j] == OTHER_PROP)\n        elem_data = *other_ptr;\n      else\n        elem_data = (char *)elem_ptr;\n      if (prop->is_list) {\n        item = elem_data + prop->count_offset;\n        item_size = ply_type_size[prop->count_internal];\n        get_stored_item ((void *) item, prop->count_internal,\n                         &int_val, &uint_val, &double_val);\n        write_binary_item (fp, plyfile->file_type, int_val, uint_val,\n\t\t\t   double_val, prop->count_external);\n        list_count = uint_val;\n        item_ptr = (char **) (elem_data + prop->offset);\n        item = item_ptr[0];\n        item_size = ply_type_size[prop->internal_type];\n        for (k = 0; k < list_count; k++) {\n          get_stored_item ((void *) item, prop->internal_type,\n                           &int_val, &uint_val, &double_val);\n          write_binary_item (fp, plyfile->file_type, int_val, uint_val,\n\t\t\t     double_val, prop->external_type);\n          item += item_size;\n        }\n      }\n      else {\n        item = elem_data + prop->offset;\n        item_size = ply_type_size[prop->internal_type];\n        get_stored_item ((void *) item, prop->internal_type,\n                         &int_val, &uint_val, &double_val);\n        write_binary_item (fp, plyfile->file_type, int_val, uint_val,\n\t\t\t   double_val, prop->external_type);\n      }\n    }\n\n  }\n}\n\n\n/******************************************************************************\nSpecify a comment that will be written in the header.\n\nEntry:\n  plyfile - file identifier\n  comment - the comment to be written\n******************************************************************************/\n\ninline void ply_put_comment(PlyFile *plyfile, char *comment)\n{\n  /* (re)allocate space for new comment */\n  if (plyfile->num_comments == 0)\n    plyfile->comments = (char **) myalloc (sizeof (char *));\n  else\n    plyfile->comments = (char **) realloc (plyfile->comments,\n                         sizeof (char *) * (plyfile->num_comments + 1));\n\n  /* add comment to list */\n  plyfile->comments[plyfile->num_comments] = strdup (comment);\n  plyfile->num_comments++;\n}\n\n\n/******************************************************************************\nSpecify a piece of object information (arbitrary text) that will be written\nin the header.\n\nEntry:\n  plyfile  - file identifier\n  obj_info - the text information to be written\n******************************************************************************/\n\ninline void ply_put_obj_info(PlyFile *plyfile, char *obj_info)\n{\n  /* (re)allocate space for new info */\n  if (plyfile->num_obj_info == 0)\n    plyfile->obj_info = (char **) myalloc (sizeof (char *));\n  else\n    plyfile->obj_info = (char **) realloc (plyfile->obj_info,\n                         sizeof (char *) * (plyfile->num_obj_info + 1));\n\n  /* add info to list */\n  plyfile->obj_info[plyfile->num_obj_info] = strdup (obj_info);\n  plyfile->num_obj_info++;\n}\n\n\n\n\n\n\n\n/*************/\n/*  Reading  */\n/*************/\n\n\n\n/******************************************************************************\nGiven a file pointer, get ready to read PLY data from the file.\n\nEntry:\n  fp - the given file pointer\n\nExit:\n  nelems     - number of elements in object\n  elem_names - list of element names\n  returns a pointer to a PlyFile, used to refer to this file, or NULL if error\n******************************************************************************/\n\ninline PlyFile *ply_read(FILE *fp, int *nelems, char ***elem_names)\n{\n  int i,j;\n  PlyFile *plyfile;\n  int nwords;\n  char **words;\n  char **elist;\n  PlyElement *elem;\n  char *orig_line;\n\n  /* check for NULL file pointer */\n  if (fp == NULL)\n    return (NULL);\n\n  if (native_binary_type == -1)\n     get_native_binary_type();\n  if (!types_checked)\n     check_types();\n  \n  /* create record for this object */\n\n  plyfile = (PlyFile *) myalloc (sizeof (PlyFile));\n  plyfile->nelems = 0;\n  plyfile->comments = NULL;\n  plyfile->num_comments = 0;\n  plyfile->obj_info = NULL;\n  plyfile->num_obj_info = 0;\n  plyfile->fp = fp;\n  plyfile->other_elems = NULL;\n\n  /* read and parse the file's header */\n\n  words = get_words (plyfile->fp, &nwords, &orig_line);\n  if (nwords == 0 || !words || !equal_strings (words[0], \"ply\"))\n  {\n       if (words)\n\t free(words);\n     \n     \n      return (NULL);\n  }\n  \n  while (words) {\n\n    /* parse words */\n\n    if (equal_strings (words[0], \"format\")) {\n      if (nwords != 3) {\n\tfree(words);\n\treturn (NULL);\n      }\n      if (equal_strings (words[1], \"ascii\"))\n        plyfile->file_type = PLY_ASCII;\n      else if (equal_strings (words[1], \"binary_big_endian\"))\n        plyfile->file_type = PLY_BINARY_BE;\n      else if (equal_strings (words[1], \"binary_little_endian\"))\n        plyfile->file_type = PLY_BINARY_LE;\n      else {\n\tfree(words);\n        return (NULL);\n      }\n      plyfile->version = atof (words[2]);\n    }\n    else if (equal_strings (words[0], \"element\"))\n      add_element (plyfile, words);\n    else if (equal_strings (words[0], \"property\"))\n      add_property (plyfile, words);\n    else if (equal_strings (words[0], \"comment\"))\n      add_comment (plyfile, orig_line);\n    else if (equal_strings (words[0], \"obj_info\"))\n      add_obj_info (plyfile, orig_line);\n    else if (equal_strings (words[0], \"end_header\")) {\n      free(words);\n      break;\n    }\n    \n    /* free up words space */\n    free (words);\n\n    words = get_words (plyfile->fp, &nwords, &orig_line);\n  }\n\n  /* create tags for each property of each element, to be used */\n  /* later to say whether or not to store each property for the user */\n\n  for (i = 0; i < plyfile->nelems; i++) {\n    elem = plyfile->elems[i];\n    elem->store_prop = (char *) myalloc (sizeof (char) * elem->nprops);\n    for (j = 0; j < elem->nprops; j++)\n      elem->store_prop[j] = DONT_STORE_PROP;\n    elem->other_offset = NO_OTHER_PROPS; /* no \"other\" props by default */\n  }\n\n  /* set return values about the elements */\n\n  elist = (char **) myalloc (sizeof (char *) * plyfile->nelems);\n  for (i = 0; i < plyfile->nelems; i++)\n    elist[i] = strdup (plyfile->elems[i]->name);\n\n  *elem_names = elist;\n  *nelems = plyfile->nelems;\n\n  /* return a pointer to the file's information */\n\n  return (plyfile);\n}\n\n\n/******************************************************************************\nOpen a polygon file for reading.\n\nEntry:\n  filename - name of file to read from\n\nExit:\n  nelems     - number of elements in object\n  elem_names - list of element names\n  file_type  - file type, either ascii or binary\n  version    - version number of PLY file\n  returns a file identifier, used to refer to this file, or NULL if error\n******************************************************************************/\n\ninline PlyFile *ply_open_for_reading(\n  char *filename,\n  int *nelems,\n  char ***elem_names,\n  int *file_type,\n  float *version\n)\n{\n  FILE *fp;\n  PlyFile *plyfile;\n  //char *name;\n  \n  \n\n   /* tack on the extension .ply, if necessary */\n\n  // removing below, to handle also macintosh alias filenames\n  //name = (char *) myalloc (sizeof (char) * (strlen (filename) + 5));\n  //strcpy (name, filename);\n  //if (strlen (name) < 4 ||\n  //    strcmp (name + strlen (name) - 4, \".ply\") != 0)\n  //    strcat (name, \".ply\");\n\n  /* open the file for reading */\n\n  //fp = fopen (name, \"r\");\n  \n  //opening file in binary, ascii data can be read in binary with get_words\n  fp = fopen (filename, \"rb\");\n\n  if (fp == NULL)\n    return (NULL);\n  \n  /* create the PlyFile data structure */\n\n  plyfile = ply_read (fp, nelems, elem_names);\n\n  /* determine the file type and version */\n\n  *file_type = plyfile->file_type;\n  *version = plyfile->version;\n\n  /* return a pointer to the file's information */\n\n  return (plyfile);\n}\n\n\n/******************************************************************************\nGet information about a particular element.\n\nEntry:\n  plyfile   - file identifier\n  elem_name - name of element to get information about\n\nExit:\n  nelems   - number of elements of this type in the file\n  nprops   - number of properties\n  returns a list of properties, or NULL if the file doesn't contain that elem\n******************************************************************************/\n\ninline PlyProperty **ply_get_element_description(\n  PlyFile *plyfile,\n  const char *elem_name,\n  int *nelems,\n  int *nprops\n)\n{\n  int i;\n  PlyElement *elem;\n  PlyProperty *prop;\n  PlyProperty **prop_list;\n\n  /* find information about the element */\n  elem = find_element (plyfile, elem_name);\n  if (elem == NULL)\n    return (NULL);\n\n  *nelems = elem->num;\n  *nprops = elem->nprops;\n\n  /* make a copy of the element's property list */\n  prop_list = (PlyProperty **) myalloc (sizeof (PlyProperty *) * elem->nprops);\n  for (i = 0; i < elem->nprops; i++) {\n    prop = (PlyProperty *) myalloc (sizeof (PlyProperty));\n    copy_property (prop, elem->props[i]);\n    prop_list[i] = prop;\n  }\n\n  /* return this duplicate property list */\n  return (prop_list);\n}\n\n\n/******************************************************************************\nSpecify which properties of an element are to be returned.  This should be\ncalled before a call to the routine ply_get_element().\n\nEntry:\n  plyfile   - file identifier\n  elem_name - which element we're talking about\n  nprops    - number of properties\n  prop_list - list of properties\n******************************************************************************/\n\ninline void ply_get_element_setup(\n  PlyFile *plyfile,\n  const char *elem_name,\n  int nprops,\n  PlyProperty *prop_list\n)\n{\n  int i;\n  PlyElement *elem;\n  PlyProperty *prop;\n  int index;\n\n  /* find information about the element */\n  elem = find_element (plyfile, elem_name);\n  plyfile->which_elem = elem;\n\n  /* deposit the property information into the element's description */\n  for (i = 0; i < nprops; i++) {\n\n    /* look for actual property */\n    prop = find_property (elem, prop_list[i].name, &index);\n    if (prop == NULL) {\n      fprintf (stderr, \"Warning:  Can't find property '%s' in element '%s'\\n\",\n               prop_list[i].name, elem_name);\n      continue;\n    }\n\n    /* store its description */\n    prop->internal_type = prop_list[i].internal_type;\n    prop->offset = prop_list[i].offset;\n    prop->count_internal = prop_list[i].count_internal;\n    prop->count_offset = prop_list[i].count_offset;\n\n    /* specify that the user wants this property */\n    elem->store_prop[index] = STORE_PROP;\n  }\n}\n\n\n/******************************************************************************\nSpecify a property of an element that is to be returned.  This should be\ncalled (usually multiple times) before a call to the routine ply_get_element().\nThis routine should be used in preference to the less flexible old routine\ncalled ply_get_element_setup().\n\nEntry:\n  plyfile   - file identifier\n  elem_name - which element we're talking about\n  prop      - property to add to those that will be returned\n******************************************************************************/\n\ninline void ply_get_property(\n  PlyFile *plyfile,\n  const char *elem_name,\n  PlyProperty *prop\n)\n{\n  PlyElement *elem;\n  PlyProperty *prop_ptr;\n  int index;\n\n  /* find information about the element */\n  elem = find_element (plyfile, elem_name);\n  plyfile->which_elem = elem;\n\n  /* deposit the property information into the element's description */\n\n  prop_ptr = find_property (elem, prop->name, &index);\n  if (prop_ptr == NULL) {\n    fprintf (stderr, \"Warning:  Can't find property '%s' in element '%s'\\n\",\n             prop->name, elem_name);\n    return;\n  }\n  prop_ptr->internal_type  = prop->internal_type;\n  prop_ptr->offset         = prop->offset;\n  prop_ptr->count_internal = prop->count_internal;\n  prop_ptr->count_offset   = prop->count_offset;\n\n  /* specify that the user wants this property */\n  elem->store_prop[index] = STORE_PROP;\n}\n\n\n/******************************************************************************\nRead one element from the file.  This routine assumes that we're reading\nthe type of element specified in the last call to the routine\nply_get_element_setup().\n\nEntry:\n  plyfile  - file identifier\n  elem_ptr - pointer to location where the element information should be put\n******************************************************************************/\n\ninline void ply_get_element(PlyFile *plyfile, void *elem_ptr)\n{\n  if (plyfile->file_type == PLY_ASCII)\n    ascii_get_element (plyfile, (char *) elem_ptr);\n  else\n    binary_get_element (plyfile, (char *) elem_ptr);\n}\n\n\n/******************************************************************************\nExtract the comments from the header information of a PLY file.\n\nEntry:\n  plyfile - file identifier\n\nExit:\n  num_comments - number of comments returned\n  returns a pointer to a list of comments\n******************************************************************************/\n\ninline char **ply_get_comments(PlyFile *plyfile, int *num_comments)\n{\n  *num_comments = plyfile->num_comments;\n  return (plyfile->comments);\n}\n\n\n/******************************************************************************\nExtract the object information (arbitrary text) from the header information\nof a PLY file.\n\nEntry:\n  plyfile - file identifier\n\nExit:\n  num_obj_info - number of lines of text information returned\n  returns a pointer to a list of object info lines\n******************************************************************************/\n\ninline char **ply_get_obj_info(PlyFile *plyfile, int *num_obj_info)\n{\n  *num_obj_info = plyfile->num_obj_info;\n  return (plyfile->obj_info);\n}\n\n\n/******************************************************************************\nMake ready for \"other\" properties of an element-- those properties that\nthe user has not explicitly asked for, but that are to be stashed away\nin a special structure to be carried along with the element's other\ninformation.\n\nEntry:\n  plyfile - file identifier\n  elem    - element for which we want to save away other properties\n******************************************************************************/\n\ninline void setup_other_props(PlyElement *elem)\n{\n  int i;\n  PlyProperty *prop;\n  int size = 0;\n  int type_size;\n\n  /* Examine each property in decreasing order of size. */\n  /* We do this so that all data types will be aligned by */\n  /* word, half-word, or whatever within the structure. */\n\n  for (type_size = 8; type_size > 0; type_size /= 2) {\n\n    /* add up the space taken by each property, and save this information */\n    /* away in the property descriptor */\n\n    for (i = 0; i < elem->nprops; i++) {\n\n      /* don't bother with properties we've been asked to store explicitly */\n      if (elem->store_prop[i])\n        continue;\n\n      prop = elem->props[i];\n\n      /* internal types will be same as external */\n      prop->internal_type = prop->external_type;\n      prop->count_internal = prop->count_external;\n\n      /* check list case */\n      if (prop->is_list) {\n\n        /* pointer to list */\n        if (type_size == sizeof (void *)) {\n          prop->offset = size;\n          size += sizeof (void *);    /* always use size of a pointer here */\n        }\n\n        /* count of number of list elements */\n        if (type_size == ply_type_size[prop->count_external]) {\n          prop->count_offset = size;\n          size += ply_type_size[prop->count_external];\n        }\n      }\n      /* not list */\n      else if (type_size == ply_type_size[prop->external_type]) {\n        prop->offset = size;\n        size += ply_type_size[prop->external_type];\n      }\n    }\n\n  }\n\n  /* save the size for the other_props structure */\n  elem->other_size = size;\n}\n\n\n/******************************************************************************\nSpecify that we want the \"other\" properties of an element to be tucked\naway within the user's structure.  The user needn't be concerned for how\nthese properties are stored.\n\nEntry:\n  plyfile   - file identifier\n  elem_name - name of element that we want to store other_props in\n  offset    - offset to where other_props will be stored inside user's structure\n\nExit:\n  returns pointer to structure containing description of other_props\n******************************************************************************/\n\ninline PlyOtherProp *ply_get_other_properties(\n  PlyFile *plyfile,\n  const char *elem_name,\n  int offset\n)\n{\n  int i;\n  PlyElement *elem;\n  PlyOtherProp *other;\n  PlyProperty *prop;\n  int nprops;\n\n  /* find information about the element */\n  elem = find_element (plyfile, elem_name);\n  if (elem == NULL) {\n    fprintf (stderr, \"ply_get_other_properties: Can't find element '%s'\\n\",\n             elem_name);\n    return (NULL);\n  }\n\n  /* remember that this is the \"current\" element */\n  plyfile->which_elem = elem;\n\n  /* save the offset to where to store the other_props */\n  elem->other_offset = offset;\n\n  /* place the appropriate pointers, etc. in the element's property list */\n  setup_other_props (elem);\n\n  /* create structure for describing other_props */\n  other = (PlyOtherProp *) myalloc (sizeof (PlyOtherProp));\n  other->name = strdup (elem_name);\n#if 0\n  if (elem->other_offset == NO_OTHER_PROPS) {\n    other->size = 0;\n    other->props = NULL;\n    other->nprops = 0;\n    return (other);\n  }\n#endif\n  other->size = elem->other_size;\n  other->props = (PlyProperty **) myalloc (sizeof(PlyProperty) * elem->nprops);\n  \n  /* save descriptions of each \"other\" property */\n  nprops = 0;\n  for (i = 0; i < elem->nprops; i++) {\n    if (elem->store_prop[i])\n      continue;\n    prop = (PlyProperty *) myalloc (sizeof (PlyProperty));\n    copy_property (prop, elem->props[i]);\n    other->props[nprops] = prop;\n    nprops++;\n  }\n  other->nprops = nprops;\n\n#if 1\n  /* set other_offset pointer appropriately if there are NO other properties */\n  if (other->nprops == 0) {\n    elem->other_offset = NO_OTHER_PROPS;\n  }\n#endif\n  \n  /* return structure */\n  return (other);\n}\n\n\n\n\n/*************************/\n/*  Other Element Stuff  */\n/*************************/\n\n\n\n\n/******************************************************************************\nGrab all the data for an element that a user does not want to explicitly\nread in.\n\nEntry:\n  plyfile    - pointer to file\n  elem_name  - name of element whose data is to be read in\n  elem_count - number of instances of this element stored in the file\n\nExit:\n  returns pointer to ALL the \"other\" element data for this PLY file\n******************************************************************************/\n\ninline PlyOtherElems *ply_get_other_element (\n  PlyFile *plyfile,\n  char *elem_name,\n  int elem_count\n)\n{\n  int i;\n  PlyElement *elem;\n  PlyOtherElems *other_elems;\n  OtherElem *other;\n\n  /* look for appropriate element */\n  elem = find_element (plyfile, elem_name);\n  if (elem == NULL) {\n    fprintf (stderr,\n             \"ply_get_other_element: can't find element '%s'\\n\", elem_name);\n    exit (-1);\n  }\n\n  /* create room for the new \"other\" element, initializing the */\n  /* other data structure if necessary */\n\n  if (plyfile->other_elems == NULL) {\n    plyfile->other_elems = (PlyOtherElems *) myalloc (sizeof (PlyOtherElems));\n    other_elems = plyfile->other_elems;\n    other_elems->other_list = (OtherElem *) myalloc (sizeof (OtherElem));\n    other = &(other_elems->other_list[0]);\n    other_elems->num_elems = 1;\n  }\n  else {\n    other_elems = plyfile->other_elems;\n    other_elems->other_list = (OtherElem *) realloc (other_elems->other_list,\n                              sizeof (OtherElem) * (other_elems->num_elems + 1));\n    other = &(other_elems->other_list[other_elems->num_elems]);\n    other_elems->num_elems++;\n  }\n\n  /* count of element instances in file */\n  other->elem_count = elem_count;\n\n  /* save name of element */\n  other->elem_name = strdup (elem_name);\n\n  /* create a list to hold all the current elements */\n  other->other_data = (OtherData **)\n                  malloc (sizeof (OtherData *) * other->elem_count);\n\n  /* set up for getting elements */\n  other->other_props = ply_get_other_properties (plyfile, elem_name,\n                         offsetof(OtherData,other_props));\n\n  /* grab all these elements */\n  for (i = 0; i < other->elem_count; i++) {\n    /* grab and element from the file */\n    other->other_data[i] = (OtherData *) malloc (sizeof (OtherData));\n    ply_get_element (plyfile, (void *) other->other_data[i]);\n  }\n\n  /* return pointer to the other elements data */\n  return (other_elems);\n}\n\n\n/******************************************************************************\nPass along a pointer to \"other\" elements that we want to save in a given\nPLY file.  These other elements were presumably read from another PLY file.\n\nEntry:\n  plyfile     - file pointer in which to store this other element info\n  other_elems - info about other elements that we want to store\n******************************************************************************/\n\ninline void ply_describe_other_elements (\n  PlyFile *plyfile,\n  PlyOtherElems *other_elems\n)\n{\n  int i;\n  OtherElem *other;\n  PlyElement *elem;\n  \n  /* ignore this call if there is no other element */\n  if (other_elems == NULL)\n    return;\n\n  /* save pointer to this information */\n  plyfile->other_elems = other_elems;\n\n  /* describe the other properties of this element */\n  /* store them in the main element list as elements with\n     only other properties */\n  \n  REALLOCN(plyfile->elems, PlyElement *,\n\t   plyfile->nelems, plyfile->nelems + other_elems->num_elems);\n  for (i = 0; i < other_elems->num_elems; i++) {\n      other = &(other_elems->other_list[i]);\n      elem = (PlyElement *) myalloc (sizeof (PlyElement));\n      plyfile->elems[plyfile->nelems++] = elem;\n      elem->name = strdup (other->elem_name);\n      elem->num = other->elem_count;\n      elem->nprops = 0;\n      ply_describe_other_properties (plyfile, other->other_props,\n\t\t\t\t     offsetof(OtherData,other_props));\n  }\n}\n\n\n/******************************************************************************\nWrite out the \"other\" elements specified for this PLY file.\n\nEntry:\n  plyfile - pointer to PLY file to write out other elements for\n******************************************************************************/\n\ninline void ply_put_other_elements (PlyFile *plyfile)\n{\n  int i,j;\n  OtherElem *other;\n\n  /* make sure we have other elements to write */\n  if (plyfile->other_elems == NULL)\n    return;\n\n  /* write out the data for each \"other\" element */\n\n  for (i = 0; i < plyfile->other_elems->num_elems; i++) {\n\n    other = &(plyfile->other_elems->other_list[i]);\n    ply_put_element_setup (plyfile, other->elem_name);\n\n    /* write out each instance of the current element */\n    for (j = 0; j < other->elem_count; j++)\n      ply_put_element (plyfile, (void *) other->other_data[j]);\n  }\n}\n\n\n/******************************************************************************\nFree up storage used by an \"other\" elements data structure.\n\nEntry:\n  other_elems - data structure to free up\n******************************************************************************/\n\ninline void ply_free_other_elements (PlyOtherElems *other_elems)\n{\n  // Alec: \n  //other_elems = other_elems;\n  delete(other_elems);\n}\n\n\n\n/*******************/\n/*  Miscellaneous  */\n/*******************/\n\n\n\n/******************************************************************************\nClose a PLY file.\n\nEntry:\n  plyfile - identifier of file to close\n******************************************************************************/\n\ninline void ply_close(PlyFile *plyfile)\n{\n  fclose (plyfile->fp);\n  // Alec:\n  plyfile->fp = NULL;\n\n  /* free up memory associated with the PLY file */\n  free (plyfile);\n}\n\n\n/******************************************************************************\nGet version number and file type of a PlyFile.\n\nEntry:\n  ply - pointer to PLY file\n\nExit:\n  version - version of the file\n  file_type - PLY_ASCII, PLY_BINARY_BE, or PLY_BINARY_LE\n******************************************************************************/\n\ninline void ply_get_info(PlyFile *ply, float *version, int *file_type)\n{\n  if (ply == NULL)\n    return;\n\n  *version = ply->version;\n  *file_type = ply->file_type;\n}\n\n\n/******************************************************************************\nCompare two strings.  Returns 1 if they are the same, 0 if not.\n******************************************************************************/\n\ninline int equal_strings(const char *s1, const char *s2)\n{\n\n  while (*s1 && *s2)\n    if (*s1++ != *s2++)\n      return (0);\n\n  if (*s1 != *s2)\n    return (0);\n  else\n    return (1);\n}\n\n\n/******************************************************************************\nFind an element from the element list of a given PLY object.\n\nEntry:\n  plyfile - file id for PLY file\n  element - name of element we're looking for\n\nExit:\n  returns the element, or NULL if not found\n******************************************************************************/\n\ninline PlyElement *find_element(PlyFile *plyfile, const char *element)\n{\n  int i;\n\n  for (i = 0; i < plyfile->nelems; i++)\n    if (equal_strings (element, plyfile->elems[i]->name))\n      return (plyfile->elems[i]);\n\n  return (NULL);\n}\n\n\n/******************************************************************************\nFind a property in the list of properties of a given element.\n\nEntry:\n  elem      - pointer to element in which we want to find the property\n  prop_name - name of property to find\n\nExit:\n  index - index to position in list\n  returns a pointer to the property, or NULL if not found\n******************************************************************************/\n\ninline PlyProperty *find_property(PlyElement *elem, const char *prop_name, int *index)\n{\n  int i;\n\n  for (i = 0; i < elem->nprops; i++)\n    if (equal_strings (prop_name, elem->props[i]->name)) {\n      *index = i;\n      return (elem->props[i]);\n    }\n\n  *index = -1;\n  return (NULL);\n}\n\n\n/******************************************************************************\nRead an element from an ascii file.\n\nEntry:\n  plyfile  - file identifier\n  elem_ptr - pointer to element\n******************************************************************************/\n\ninline void ascii_get_element(PlyFile *plyfile, char *elem_ptr)\n{\n  int j,k;\n  PlyElement *elem;\n  PlyProperty *prop;\n  char **words;\n  int nwords;\n  int which_word;\n  char *elem_data,*item=NULL;\n  char *item_ptr;\n  int item_size;\n  int int_val;\n  unsigned int uint_val;\n  double double_val;\n  int list_count;\n  int store_it;\n  char **store_array;\n  char *orig_line;\n  char *other_data=NULL;\n  int other_flag;\n\n  /* the kind of element we're reading currently */\n  elem = plyfile->which_elem;\n\n  /* do we need to setup for other_props? */\n\n  if (elem->other_offset != NO_OTHER_PROPS) {\n    char **ptr;\n    other_flag = 1;\n    /* make room for other_props */\n    other_data = (char *) myalloc (elem->other_size);\n    /* store pointer in user's structure to the other_props */\n    ptr = (char **) (elem_ptr + elem->other_offset);\n    *ptr = other_data;\n  }\n  else\n    other_flag = 0;\n\n  /* read in the element */\n\n  words = get_words (plyfile->fp, &nwords, &orig_line);\n  if (words == NULL) {\n    fprintf (stderr, \"ply_get_element: unexpected end of file\\n\");\n    exit (-1);\n  }\n\n  which_word = 0;\n\n  for (j = 0; j < elem->nprops; j++) {\n\n    prop = elem->props[j];\n    store_it = (elem->store_prop[j] | other_flag);\n\n    /* store either in the user's structure or in other_props */\n  //  if (elem->store_prop[j])\n      elem_data = elem_ptr;\n    //else\n      //elem_data = other_data;\n\n    if (prop->is_list) {       /* a list */\n\n      /* get and store the number of items in the list */\n      get_ascii_item (words[which_word++], prop->count_external,\n                      &int_val, &uint_val, &double_val);\n      if (store_it) {\n        item = elem_data + prop->count_offset;\n        store_item(item, prop->count_internal, int_val, uint_val, double_val);\n      }\n\n      /* allocate space for an array of items and store a ptr to the array */\n      list_count = int_val;\n      item_size = ply_type_size[prop->internal_type];\n      store_array = (char **) (elem_data + prop->offset);\n\n      if (list_count == 0) {\n        if (store_it)\n          *store_array = NULL;\n      }\n      else {\n        if (store_it) {\n          item_ptr = (char *) myalloc (sizeof (char) * item_size * list_count);\n           \n          item = item_ptr;\n          *store_array = item_ptr;\n        }\n\n        /* read items and store them into the array */\n        for (k = 0; k < list_count; k++) {\n          get_ascii_item (words[which_word++], prop->external_type,\n                          &int_val, &uint_val, &double_val);\n          if (store_it) {\n            store_item (item, prop->internal_type,\n                        int_val, uint_val, double_val);\n            item += item_size;\n          }\n        }\n      }\n\n    }\n    else {                     /* not a list */\n      get_ascii_item (words[which_word++], prop->external_type,\n                      &int_val, &uint_val, &double_val);\n      if (store_it) {\n        item = elem_data + prop->offset;\n        store_item (item, prop->internal_type, int_val, uint_val, double_val);\n      }\n    }\n\n  }\n\n  free (words);\n}\n\n\n/******************************************************************************\nRead an element from a binary file.\n\nEntry:\n  plyfile  - file identifier\n  elem_ptr - pointer to an element\n******************************************************************************/\n\ninline void binary_get_element(PlyFile *plyfile, char *elem_ptr)\n{\n  int j,k;\n  PlyElement *elem;\n  PlyProperty *prop;\n  FILE *fp = plyfile->fp;\n  char *elem_data,*item=NULL;\n  char *item_ptr;\n  int item_size;\n  int int_val;\n  unsigned int uint_val;\n  double double_val;\n  int list_count;\n  int store_it;\n  char **store_array;\n  char *other_data=NULL;\n  int other_flag;\n\n  /* the kind of element we're reading currently */\n  elem = plyfile->which_elem;\n\n  /* do we need to setup for other_props? */\n\n  if (elem->other_offset != NO_OTHER_PROPS) {\n    char **ptr;\n    other_flag = 1;\n    /* make room for other_props */\n    other_data = (char *) myalloc (elem->other_size);\n    /* store pointer in user's structure to the other_props */\n    ptr = (char **) (elem_ptr + elem->other_offset);\n    *ptr = other_data;\n  }\n  else\n    other_flag = 0;\n\n  /* read in a number of elements */\n\n  for (j = 0; j < elem->nprops; j++) {\n\n    prop = elem->props[j];\n    store_it = (elem->store_prop[j] | other_flag);\n\n    /* store either in the user's structure or in other_props */\n//    if (elem->store_prop[j])\n      elem_data = elem_ptr;\n//    else\n//      elem_data = other_data;\n\n    if (prop->is_list) {       /* a list */\n\n      /* get and store the number of items in the list */\n      get_binary_item (fp, plyfile->file_type, prop->count_external,\n                      &int_val, &uint_val, &double_val);\n      if (store_it) {\n        item = elem_data + prop->count_offset;\n        store_item(item, prop->count_internal, int_val, uint_val, double_val);\n      }\n\n      /* allocate space for an array of items and store a ptr to the array */\n      list_count = int_val;\n       \n      item_size = ply_type_size[prop->internal_type];\n      store_array = (char **) (elem_data + prop->offset);\n      if (list_count == 0) {\n        if (store_it)\n          *store_array = NULL;\n      }\n      else {\n        if (store_it) {\n          item_ptr = (char *) myalloc (sizeof (char) * item_size * list_count);\n           \n          item = item_ptr;\n          *store_array = item_ptr;\n        }\n\n        // read items and store them into the array  \n        for (k = 0; k < list_count; k++) {\n          get_binary_item (fp, plyfile->file_type, prop->external_type,\n                          &int_val, &uint_val, &double_val);\n          if (store_it) {\n             store_item (item, prop->internal_type,\n                       int_val, uint_val, double_val);\n            item += item_size;\n          }\n        }\n        \n         \n        \n      }\n\n    }\n    else {                     /* not a list */\n      get_binary_item (fp, plyfile->file_type, prop->external_type,\n                      &int_val, &uint_val, &double_val);\n      if (store_it) {\n        item = elem_data + prop->offset;\n        store_item (item, prop->internal_type, int_val, uint_val, double_val);\n      }\n    }\n\n  }\n}\n\n\n/******************************************************************************\nWrite to a file the word that represents a PLY data type.\n\nEntry:\n  fp   - file pointer\n  code - code for type\n******************************************************************************/\n\ninline void write_scalar_type (FILE *fp, int code)\n{\n  /* make sure this is a valid code */\n\n  if (code <= PLY_START_TYPE || code >= PLY_END_TYPE) {\n    fprintf (stderr, \"write_scalar_type: bad data code = %d\\n\", code);\n    exit (-1);\n  }\n\n  /* write the code to a file */\n\n  fprintf (fp, \"%s\", type_names[code]);\n}\n\n/******************************************************************************\n  Reverse the order in an array of bytes.  This is the conversion from big\n  endian to little endian and vice versa\n\nEntry:\n  bytes     - array of bytes to reverse (in place)\n  num_bytes - number of bytes in array\n******************************************************************************/\n\ninline void swap_bytes(char *bytes, int num_bytes)\n{\n    int i;\n    char temp;\n    \n    for (i=0; i < num_bytes/2; i++)\n    {\n\ttemp = bytes[i];\n\tbytes[i] = bytes[(num_bytes-1)-i];\n\tbytes[(num_bytes-1)-i] = temp;\n    }\n}\n\n/******************************************************************************\n  Find out if this machine is big endian or little endian\n\n  Exit:\n    set global variable, native_binary_type =\n                              either PLY_BINARY_BE or PLY_BINARY_LE\n\n******************************************************************************/\n\ninline void get_native_binary_type()\n{\n    endian_test_type test;\n\n    test.int_value = 0;\n    test.int_value = 1;\n    if (test.byte_values[0] == 1)\n       native_binary_type = PLY_BINARY_LE;\n    else if (test.byte_values[sizeof(int)-1] == 1)\n       native_binary_type = PLY_BINARY_BE;\n    else\n    {\n\tfprintf(stderr, \"ply: Couldn't determine machine endianness.\\n\");\n\tfprintf(stderr, \"ply: Exiting...\\n\");\n\texit(1);\n    }\n}\n\ninline int get_native_binary_type2()\n{\n    endian_test_type test;\n\n    test.int_value = 0;\n    test.int_value = 1;\n    if (test.byte_values[0] == 1)\n       return PLY_BINARY_LE;\n    else if (test.byte_values[sizeof(int)-1] == 1)\n       return PLY_BINARY_BE;\n    else\n    {\n\tfprintf(stderr, \"ply: Couldn't determine machine endianness.\\n\");\n\tfprintf(stderr, \"ply: Exiting...\\n\");\n\texit(1);\n    }\n}\n\n/******************************************************************************\n  Verify that all the native types are the sizes we need\n\n\n******************************************************************************/\n\ninline void check_types()\n{\n    if ((ply_type_size[PLY_CHAR] != sizeof(char)) ||\n\t(ply_type_size[PLY_SHORT] != sizeof(short)) ||\t\n\t(ply_type_size[PLY_INT] != sizeof(int)) ||\t\n\t(ply_type_size[PLY_UCHAR] != sizeof(unsigned char)) ||\t\n\t(ply_type_size[PLY_USHORT] != sizeof(unsigned short)) ||\t\n\t(ply_type_size[PLY_UINT] != sizeof(unsigned int)) ||\t\n\t(ply_type_size[PLY_FLOAT] != sizeof(float)) ||\t\n\t(ply_type_size[PLY_DOUBLE] != sizeof(double)))\n    {\n\tfprintf(stderr, \"ply: Type sizes do not match built-in types\\n\");\n\tfprintf(stderr, \"ply: Exiting...\\n\");\n\texit(1);\n    }\n    \n    types_checked = 1;\n}\n\n/******************************************************************************\nGet a text line from a file and break it up into words.\n\nIMPORTANT: The calling routine call \"free\" on the returned pointer once\nfinished with it.\n\nEntry:\n  fp - file to read from\n\nExit:\n  nwords    - number of words returned\n  orig_line - the original line of characters\n  returns a list of words from the line, or NULL if end-of-file\n******************************************************************************/\n\ninline char **get_words(FILE *fp, int *nwords, char **orig_line)\n{\n  #define BIG_STRING 4096\n  static char str[BIG_STRING];\n  static char str_copy[BIG_STRING];\n  char **words;\n  int max_words = 10;\n  int num_words = 0;\n  char *ptr,*ptr2;\n  char *result;\n  \n  fpos_t pos; //keep track of file pointer\n  int nbytes;\n  int nonUNIX;\n  nonUNIX=0;\n  nbytes=0;\n  fgetpos(fp, &pos);\n\n  words = (char **) myalloc (sizeof (char *) * max_words);\n\n  /* read in a line */\n  result = fgets (str, BIG_STRING, fp);\n  if (result == NULL) {\n    *nwords = 0;\n    *orig_line = NULL;\n    return (NULL);\n  }\n\n  /* convert line-feed and tabs into spaces */\n  /* (this guarentees that there will be a space before the */\n  /*  null character at the end of the string) */\n\n  str[BIG_STRING-2] = ' ';\n  str[BIG_STRING-1] = '\\0';\n\n  for (ptr = str, ptr2 = str_copy; *ptr != '\\0'; ptr++, ptr2++) {\n    *ptr2 = *ptr;\n    nbytes++;\n    if (*ptr == '\\t') {\n      *ptr = ' ';\n      *ptr2 = ' ';\n    }\n    else if (*ptr == '\\n') {\n      *ptr = ' '; //has to have a space, to be caught later when grouping words\n      *ptr2 = '\\0';\n      break;\n    }\n    else if (*ptr == '\\r') \n    {\t  //MAC line break\n      nonUNIX=1;\n      if(*(ptr+1)=='\\n')\t\t  //actuall PC line break\n      {\t\n      \tnbytes++;\n      }\n       \n     *ptr = ' '; \n     \n     *(ptr+1) = '\\0';\t//when reading mac, best end string here\n     *ptr2 = '\\0'; \t\t//note a pc \\r is followed by \\n\n      \n      break;\n    }\n  }\n\n\n  /*check to see if a PC or MAC header was detected instead of UNIX*/\n  if(nonUNIX==1)\n  {\n  \tfsetpos(fp, &pos);\n  \tfseek(fp, nbytes, SEEK_CUR);\t\n  }\n\n  /* find the words in the line */\n\n  ptr = str;\n  while (*ptr != '\\0') {\n\n    /* jump over leading spaces */\n    while (*ptr == ' ')\n      ptr++;\n\n    /* break if we reach the end */\n    if (*ptr == '\\0')\n      break;\n\n    /* save pointer to beginning of word */\n    if (num_words >= max_words) {\n      max_words += 10;\n      words = (char **) realloc (words, sizeof (char *) * max_words);\n    }\n    words[num_words++] = ptr;\n\n    /* jump over non-spaces */\n    while (*ptr != ' ')\n      ptr++;\n\n    /* place a null character here to mark the end of the word */\n    *ptr++ = '\\0';\n  }\n\n  /* return the list of words */\n  *nwords = num_words;\n  *orig_line = str_copy;\n  return (words);\n}\n\n/*\nchar **get_words(FILE *fp, int *nwords, char **orig_line)\n{\n#define BIG_STRING 4096\n  static char str[BIG_STRING];\n  static char str_copy[BIG_STRING];\n  char **words;\n  int max_words = 10;\n  int num_words = 0;\n  char *ptr,*ptr2;\n  char *result;\n\n  words = (char **) myalloc (sizeof (char *) * max_words);\n\n  // read in a line  \n  result = fgets (str, BIG_STRING, fp);\n  if (result == NULL) {\n    *nwords = 0;\n    *orig_line = NULL;\n    return (NULL);\n  }\n\n  // convert line-feed and tabs into spaces  \n  // (this guarentees that there will be a space before the  \n  //  null character at the end of the string)  \n\n  str[BIG_STRING-2] = ' ';\n  str[BIG_STRING-1] = '\\0';\n\n  for (ptr = str, ptr2 = str_copy; *ptr != '\\0'; ptr++, ptr2++) {\n    *ptr2 = *ptr;\n    if (*ptr == '\\t') {\n      *ptr = ' ';\n      *ptr2 = ' ';\n    }\n    else if (*ptr == '\\n') {\n      *ptr = ' ';\n      *ptr2 = '\\0';\n      break;\n    }\n    else if (*ptr == '\\r') {\n      *ptr = '\\0';\n      *ptr2 = '\\0'; //note dont break yet, on a pc \\r is followed by \\n\n    }\n  }\n\n  // find the words in the line  \n\n  ptr = str;\n  while (*ptr != '\\0') {\n\n    // jump over leading spaces  \n    while (*ptr == ' ')\n      ptr++;\n\n    // break if we reach the end  \n    if (*ptr == '\\0')\n      break;\n\n    // save pointer to beginning of word  \n    if (num_words >= max_words) {\n      max_words += 10;\n      words = (char **) realloc (words, sizeof (char *) * max_words);\n    }\n    words[num_words++] = ptr;\n\n    // jump over non-spaces  \n    while (*ptr != ' ')\n      ptr++;\n\n    // place a null character here to mark the end of the word  \n    *ptr++ = '\\0';\n  }\n\n  // return the list of words  \n  *nwords = num_words;\n  *orig_line = str_copy;\n  return (words);\n}*/\n\n/******************************************************************************\nReturn the value of an item, given a pointer to it and its type.\n\nEntry:\n  item - pointer to item\n  type - data type that \"item\" points to\n\nExit:\n  returns a double-precision float that contains the value of the item\n******************************************************************************/\n\ninline double get_item_value(char *item, int type)\n{\n  unsigned char *puchar;\n  char *pchar;\n  short int *pshort;\n  unsigned short int *pushort;\n  int *pint;\n  unsigned int *puint;\n  float *pfloat;\n  double *pdouble;\n  int int_value;\n  unsigned int uint_value;\n  double double_value;\n\n  switch (type) {\n    case PLY_CHAR:\n      pchar = (char *) item;\n      int_value = *pchar;\n      return ((double) int_value);\n    case PLY_UCHAR:\n      puchar = (unsigned char *) item;\n      int_value = *puchar;\n      return ((double) int_value);\n    case PLY_SHORT:\n      pshort = (short int *) item;\n      int_value = *pshort;\n      return ((double) int_value);\n    case PLY_USHORT:\n      pushort = (unsigned short int *) item;\n      int_value = *pushort;\n      return ((double) int_value);\n    case PLY_INT:\n      pint = (int *) item;\n      int_value = *pint;\n      return ((double) int_value);\n    case PLY_UINT:\n      puint = (unsigned int *) item;\n      uint_value = *puint;\n      return ((double) uint_value);\n    case PLY_FLOAT:\n      pfloat = (float *) item;\n      double_value = *pfloat;\n      return (double_value);\n    case PLY_DOUBLE:\n      pdouble = (double *) item;\n      double_value = *pdouble;\n      return (double_value);\n    default:\n      fprintf (stderr, \"get_item_value: bad type = %d\\n\", type);\n      exit (-1);\n  }\n}\n\n\n/******************************************************************************\nWrite out an item to a file as raw binary bytes.\n\nEntry:\n  fp         - file to write to\n  int_val    - integer version of item\n  uint_val   - unsigned integer version of item\n  double_val - double-precision float version of item\n  type       - data type to write out\n******************************************************************************/\n\ninline void write_binary_item(\n  FILE *fp,\n  int file_type,\n  int int_val,\n  unsigned int uint_val,\n  double double_val,\n  int type\n)\n{\n  unsigned char uchar_val;\n  char char_val;\n  unsigned short ushort_val;\n  short short_val;\n  float float_val;\n  void  *value;\n  \n  switch (type) {\n    case PLY_CHAR:\n      char_val = int_val;\n      value = &char_val;\n      break;\n    case PLY_SHORT:\n      short_val = int_val;\n      value = &short_val;\n      break;\n    case PLY_INT:\n      value = &int_val;\n      break;\n    case PLY_UCHAR:\n      uchar_val = uint_val;\n      value = &uchar_val;\n      break;\n    case PLY_USHORT:\n      ushort_val = uint_val;\n      value = &ushort_val;\n      break;\n    case PLY_UINT:\n      value = &uint_val;\n      break;\n    case PLY_FLOAT:\n      float_val = double_val;\n      value = &float_val;\n      break;\n    case PLY_DOUBLE:\n      value = &double_val;\n      break;\n    default:\n      fprintf (stderr, \"write_binary_item: bad type = %d\\n\", type);\n      exit (-1);\n  }\n\n  if ((file_type != native_binary_type) && (ply_type_size[type] > 1))\n     swap_bytes((char *)value, ply_type_size[type]);\n  \n  if (fwrite (value, ply_type_size[type], 1, fp) != 1)\n  {\n      fprintf(stderr, \"PLY ERROR: fwrite() failed -- aborting.\\n\");\n      exit(1);\n  }\n}\n\n\n/******************************************************************************\nWrite out an item to a file as ascii characters.\n\nEntry:\n  fp         - file to write to\n  int_val    - integer version of item\n  uint_val   - unsigned integer version of item\n  double_val - double-precision float version of item\n  type       - data type to write out\n******************************************************************************/\n\ninline void write_ascii_item(\n  FILE *fp,\n  int int_val,\n  unsigned int uint_val,\n  double double_val,\n  int type\n)\n{\n  switch (type) {\n    case PLY_CHAR:\n    case PLY_SHORT:\n    case PLY_INT:\n      if (fprintf (fp, \"%d \", int_val) <= 0)\n      {\n\t  fprintf(stderr, \"PLY ERROR: fprintf() failed -- aborting.\\n\");\n\t  exit(1);\n      }\n      break;\n    case PLY_UCHAR:\n    case PLY_USHORT:\n    case PLY_UINT:\n      if (fprintf (fp, \"%u \", uint_val) <= 0)\n      {\n\t  fprintf(stderr, \"PLY ERROR: fprintf() failed -- aborting.\\n\");\n\t  exit(1);\n      }\n      break;\n    case PLY_FLOAT:\n    case PLY_DOUBLE:\n      if (fprintf (fp, \"%g \", double_val) <= 0)\n      {\n\t  fprintf(stderr, \"PLY ERROR: fprintf() failed -- aborting.\\n\");\n\t  exit(1);\n      }\n      break;\n    default:\n      fprintf (stderr, \"write_ascii_item: bad type = %d\\n\", type);\n      exit (-1);\n  }\n}\n\n\n/******************************************************************************\nWrite out an item to a file as ascii characters.\n\nEntry:\n  fp   - file to write to\n  item - pointer to item to write\n  type - data type that \"item\" points to\n\nExit:\n  returns a double-precision float that contains the value of the written item\n******************************************************************************/\n\ninline double old_write_ascii_item(FILE *fp, char *item, int type)\n{\n  unsigned char *puchar;\n  char *pchar;\n  short int *pshort;\n  unsigned short int *pushort;\n  int *pint;\n  unsigned int *puint;\n  float *pfloat;\n  double *pdouble;\n  int int_value;\n  unsigned int uint_value;\n  double double_value;\n\n  switch (type) {\n    case PLY_CHAR:\n      pchar = (char *) item;\n      int_value = *pchar;\n      fprintf (fp, \"%d \", int_value);\n      return ((double) int_value);\n    case PLY_UCHAR:\n      puchar = (unsigned char *) item;\n      int_value = *puchar;\n      fprintf (fp, \"%d \", int_value);\n      return ((double) int_value);\n    case PLY_SHORT:\n      pshort = (short int *) item;\n      int_value = *pshort;\n      fprintf (fp, \"%d \", int_value);\n      return ((double) int_value);\n    case PLY_USHORT:\n      pushort = (unsigned short int *) item;\n      int_value = *pushort;\n      fprintf (fp, \"%d \", int_value);\n      return ((double) int_value);\n    case PLY_INT:\n      pint = (int *) item;\n      int_value = *pint;\n      fprintf (fp, \"%d \", int_value);\n      return ((double) int_value);\n    case PLY_UINT:\n      puint = (unsigned int *) item;\n      uint_value = *puint;\n      fprintf (fp, \"%u \", uint_value);\n      return ((double) uint_value);\n    case PLY_FLOAT:\n      pfloat = (float *) item;\n      double_value = *pfloat;\n      fprintf (fp, \"%g \", double_value);\n      return (double_value);\n    case PLY_DOUBLE:\n      pdouble = (double *) item;\n      double_value = *pdouble;\n      fprintf (fp, \"%g \", double_value);\n      return (double_value);\n    default:\n      fprintf (stderr, \"old_write_ascii_item: bad type = %d\\n\", type);\n      exit (-1);\n  }\n}\n\n\n/******************************************************************************\nGet the value of an item that is in memory, and place the result\ninto an integer, an unsigned integer and a double.\n\nEntry:\n  ptr  - pointer to the item\n  type - data type supposedly in the item\n\nExit:\n  int_val    - integer value\n  uint_val   - unsigned integer value\n  double_val - double-precision floating point value\n******************************************************************************/\n\ninline void get_stored_item(\n  void *ptr,\n  int type,\n  int *int_val,\n  unsigned int *uint_val,\n  double *double_val\n)\n{\n  switch (type) {\n    case PLY_CHAR:\n      *int_val = *((char *) ptr);\n      *uint_val = *int_val;\n      *double_val = *int_val;\n      break;\n    case PLY_UCHAR:\n      *uint_val = *((unsigned char *) ptr);\n      *int_val = *uint_val;\n      *double_val = *uint_val;\n      break;\n    case PLY_SHORT:\n      *int_val = *((short int *) ptr);\n      *uint_val = *int_val;\n      *double_val = *int_val;\n      break;\n    case PLY_USHORT:\n      *uint_val = *((unsigned short int *) ptr);\n      *int_val = *uint_val;\n      *double_val = *uint_val;\n      break;\n    case PLY_INT:\n      *int_val = *((int *) ptr);\n      *uint_val = *int_val;\n      *double_val = *int_val;\n      break;\n    case PLY_UINT:\n      *uint_val = *((unsigned int *) ptr);\n      *int_val = *uint_val;\n      *double_val = *uint_val;\n      break;\n    case PLY_FLOAT:\n      *double_val = *((float *) ptr);\n      *int_val = (int) *double_val;\n      *uint_val = (unsigned int) *double_val;\n      break;\n    case PLY_DOUBLE:\n      *double_val = *((double *) ptr);\n      *int_val = (int) *double_val;\n      *uint_val = (unsigned int) *double_val;\n      break;\n    default:\n      fprintf (stderr, \"get_stored_item: bad type = %d\\n\", type);\n      exit (-1);\n  }\n}\n\n\n/******************************************************************************\nGet the value of an item from a binary file, and place the result\ninto an integer, an unsigned integer and a double.\n\nEntry:\n  fp   - file to get item from\n  type - data type supposedly in the word\n\nExit:\n  int_val    - integer value\n  uint_val   - unsigned integer value\n  double_val - double-precision floating point value\n******************************************************************************/\n\ninline void get_binary_item(\n  FILE *fp,\n  int file_type,\n  int type,\n  int *int_val,\n  unsigned int *uint_val,\n  double *double_val\n)\n{\n  char c[8];\n  void *ptr;\n\n  ptr = (void *) c;\n\n  if (fread (ptr, ply_type_size[type], 1, fp) != 1)\n  {\n      fprintf(stderr, \"PLY ERROR: fread() failed -- aborting.\\n\");\n      exit(1);\n  }\n  \n\n  if ((file_type != native_binary_type) && (ply_type_size[type] > 1))\n     swap_bytes((char *)ptr, ply_type_size[type]);\n\n  switch (type) {\n    case PLY_CHAR:\n      *int_val = *((char *) ptr);\n      *uint_val = *int_val;\n      *double_val = *int_val;\n      break;\n    case PLY_UCHAR:\n      *uint_val = *((unsigned char *) ptr);\n      *int_val = *uint_val;\n      *double_val = *uint_val;\n      break;\n    case PLY_SHORT:\n      *int_val = *((short int *) ptr);\n      *uint_val = *int_val;\n      *double_val = *int_val;\n      break;\n    case PLY_USHORT:\n      *uint_val = *((unsigned short int *) ptr);\n      *int_val = *uint_val;\n      *double_val = *uint_val;\n      break;\n    case PLY_INT:\n      *int_val = *((int *) ptr);\n      *uint_val = *int_val;\n      *double_val = *int_val;\n      break;\n    case PLY_UINT:\n      *uint_val = *((unsigned int *) ptr);\n      *int_val = *uint_val;\n      *double_val = *uint_val;\n      break;\n    case PLY_FLOAT:\n      *double_val = *((float *) ptr);\n      *int_val = (int) *double_val;\n      *uint_val = (unsigned int) *double_val;\n      break;\n    case PLY_DOUBLE:\n      *double_val = *((double *) ptr);\n      *int_val = (int) *double_val;\n      *uint_val = (unsigned int) *double_val;\n      break;\n    default:\n      fprintf (stderr, \"get_binary_item: bad type = %d\\n\", type);\n      exit (-1);\n  }\n}\n\n\n/******************************************************************************\nExtract the value of an item from an ascii word, and place the result\ninto an integer, an unsigned integer and a double.\n\nEntry:\n  word - word to extract value from\n  type - data type supposedly in the word\n\nExit:\n  int_val    - integer value\n  uint_val   - unsigned integer value\n  double_val - double-precision floating point value\n******************************************************************************/\n\ninline void get_ascii_item(\n  char *word,\n  int type,\n  int *int_val,\n  unsigned int *uint_val,\n  double *double_val\n)\n{\n  switch (type) {\n    case PLY_CHAR:\n    case PLY_UCHAR:\n    case PLY_SHORT:\n    case PLY_USHORT:\n    case PLY_INT:\n      *int_val = atoi (word);\n      *uint_val = (unsigned int) *int_val;\n      *double_val = (double) *int_val;\n      break;\n\n    case PLY_UINT:\n      *uint_val = strtol (word, (char **) NULL, 10);\n      *int_val = (int) *uint_val;\n      *double_val = (double) *uint_val;\n      break;\n\n    case PLY_FLOAT:\n    case PLY_DOUBLE:\n      *double_val = atof (word);\n      *int_val = (int) *double_val;\n      *uint_val = (unsigned int) *double_val;\n      break;\n\n    default:\n      fprintf (stderr, \"get_ascii_item: bad type = %d\\n\", type);\n      exit (-1);\n  }\n}\n\n\n/******************************************************************************\nStore a value into a place being pointed to, guided by a data type.\n\nEntry:\n  item       - place to store value\n  type       - data type\n  int_val    - integer version of value\n  uint_val   - unsigned integer version of value\n  double_val - double version of value\n\nExit:\n  item - pointer to stored value\n******************************************************************************/\n\ninline void store_item (\n  char *item,\n  int type,\n  int int_val,\n  unsigned int uint_val,\n  double double_val\n)\n{\n  unsigned char *puchar;\n  short int *pshort;\n  unsigned short int *pushort;\n  int *pint;\n  unsigned int *puint;\n  float *pfloat;\n  double *pdouble;\n\n  switch (type) {\n    case PLY_CHAR:\n      *item = int_val;\n      break;\n    case PLY_UCHAR:\n      puchar = (unsigned char *) item;\n      *puchar = uint_val;\n      break;\n    case PLY_SHORT:\n      pshort = (short *) item;\n      *pshort = int_val;\n      break;\n    case PLY_USHORT:\n      pushort = (unsigned short *) item;\n      *pushort = uint_val;\n      break;\n    case PLY_INT:\n      pint = (int *) item;\n      *pint = int_val;\n      break;\n    case PLY_UINT:\n      puint = (unsigned int *) item;\n      *puint = uint_val;\n      break;\n    case PLY_FLOAT:\n      pfloat = (float *) item;\n      *pfloat = double_val;\n      break;\n    case PLY_DOUBLE:\n      pdouble = (double *) item;\n      *pdouble = double_val;\n      break;\n    default:\n      fprintf (stderr, \"store_item: bad type = %d\\n\", type);\n      exit (-1);\n  }\n}\n\n\n/******************************************************************************\nAdd an element to a PLY file descriptor.\n\nEntry:\n  plyfile - PLY file descriptor\n  words   - list of words describing the element\n  nwords  - number of words in the list\n******************************************************************************/\n\ninline void add_element (PlyFile *plyfile, char **words)\n{\n  PlyElement *elem;\n\n  /* create the new element */\n  elem = (PlyElement *) myalloc (sizeof (PlyElement));\n  elem->name = strdup (words[1]);\n  elem->num = atoi (words[2]);\n  elem->nprops = 0;\n\n  /* make room for new element in the object's list of elements */\n  if (plyfile->nelems == 0)\n    plyfile->elems = (PlyElement **) myalloc (sizeof (PlyElement *));\n  else\n    plyfile->elems = (PlyElement **) realloc (plyfile->elems,\n                     sizeof (PlyElement *) * (plyfile->nelems + 1));\n\n  /* add the new element to the object's list */\n  plyfile->elems[plyfile->nelems] = elem;\n  plyfile->nelems++;\n}\n\n\n/******************************************************************************\nReturn the type of a property, given the name of the property.\n\nEntry:\n  name - name of property type\n\nExit:\n  returns integer code for property, or 0 if not found\n******************************************************************************/\n\ninline int get_prop_type(char *type_name)\n{\n  int i;\n\n  for (i = PLY_START_TYPE + 1; i < PLY_END_TYPE; i++)\n    if (equal_strings (type_name, type_names[i]))\n      return (i);\n\n  for (i = PLY_START_TYPE + 1; i < PLY_END_TYPE; i++)\n    if (equal_strings (type_name, alt_type_names[i]))\n      return (i);\n\n  /* if we get here, we didn't find the type */\n  return (0);\n}\n\n\n/******************************************************************************\nAdd a property to a PLY file descriptor.\n\nEntry:\n  plyfile - PLY file descriptor\n  words   - list of words describing the property\n  nwords  - number of words in the list\n******************************************************************************/\n\ninline void add_property (PlyFile *plyfile, char **words)\n{\n  PlyProperty *prop;\n  PlyElement *elem;\n\n  /* create the new property */\n\n  prop = (PlyProperty *) myalloc (sizeof (PlyProperty));\n\n  if (equal_strings (words[1], \"list\")) {       /* is a list */\n    prop->count_external = get_prop_type (words[2]);\n    prop->external_type = get_prop_type (words[3]);\n    prop->name = strdup (words[4]);\n    prop->is_list = 1;\n  }\n  else {                                        /* not a list */\n    prop->external_type = get_prop_type (words[1]);\n    prop->name = strdup (words[2]);\n    prop->is_list = 0;\n  }\n\n  /* add this property to the list of properties of the current element */\n\n  elem = plyfile->elems[plyfile->nelems - 1];\n\n  if (elem->nprops == 0)\n    elem->props = (PlyProperty **) myalloc (sizeof (PlyProperty *));\n  else\n    elem->props = (PlyProperty **) realloc (elem->props,\n                  sizeof (PlyProperty *) * (elem->nprops + 1));\n\n  elem->props[elem->nprops] = prop;\n  elem->nprops++;\n}\n\n\n/******************************************************************************\nAdd a comment to a PLY file descriptor.\n\nEntry:\n  plyfile - PLY file descriptor\n  line    - line containing comment\n******************************************************************************/\n\ninline void add_comment (PlyFile *plyfile, char *line)\n{\n  int i;\n\n  /* skip over \"comment\" and leading spaces and tabs */\n  i = 7;\n  while (line[i] == ' ' || line[i] == '\\t')\n    i++;\n\n  ply_put_comment (plyfile, &line[i]);\n}\n\n\n/******************************************************************************\nAdd a some object information to a PLY file descriptor.\n\nEntry:\n  plyfile - PLY file descriptor\n  line    - line containing text info\n******************************************************************************/\n\ninline void add_obj_info (PlyFile *plyfile, char *line)\n{\n  int i;\n\n  /* skip over \"obj_info\" and leading spaces and tabs */\n  i = 8;\n  while (line[i] == ' ' || line[i] == '\\t')\n    i++;\n\n  ply_put_obj_info (plyfile, &line[i]);\n}\n\n\n/******************************************************************************\nCopy a property.\n******************************************************************************/\n\ninline void copy_property(PlyProperty *dest, PlyProperty *src)\n{\n  dest->name = strdup (src->name);\n  dest->external_type = src->external_type;\n  dest->internal_type = src->internal_type;\n  dest->offset = src->offset;\n\n  dest->is_list = src->is_list;\n  dest->count_external = src->count_external;\n  dest->count_internal = src->count_internal;\n  dest->count_offset = src->count_offset;\n}\n\n\n/******************************************************************************\nAllocate some memory.\n\nEntry:\n  size  - amount of memory requested (in bytes)\n  lnum  - line number from which memory was requested\n  fname - file name from which memory was requested\n******************************************************************************/\n\ninline char *my_alloc(int size, int lnum, const char *fe)\n{\n  char *ptr;\n\n  ptr = (char *) malloc (size);\n\n  if (ptr == 0) {\n    fprintf(stderr, \"Memory allocation bombed on line %d in %s\\n\", lnum, fe);\n  }\n\n  return (ptr);\n}\n\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/png/readPNG.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2016 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"readPNG.h\"\n#include <stb_image.h>\n\nIGL_INLINE bool igl::png::readPNG(\n  const std::string png_file,\n  Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>& R,\n  Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>& G,\n  Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>& B,\n  Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>& A\n)\n{\n  int cols,rows,n;\n  unsigned char *data = stbi_load(png_file.c_str(), &cols, &rows, &n, 4);\n  if(data == NULL) {\n    return false;\n  }\n\n  R.resize(cols,rows);\n  G.resize(cols,rows);\n  B.resize(cols,rows);\n  A.resize(cols,rows);\n\n  for (unsigned i=0; i<rows; ++i) {\n    for (unsigned j=0; j<cols; ++j) {\n      R(j,rows-1-i) = data[4*(j + cols * i) + 0];\n      G(j,rows-1-i) = data[4*(j + cols * i) + 1];\n      B(j,rows-1-i) = data[4*(j + cols * i) + 2];\n      A(j,rows-1-i) = data[4*(j + cols * i) + 3];\n    }\n  }\n\n  stbi_image_free(data);\n\n  return true;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/png/readPNG.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2016 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_PNG_READ_PNG_H\n#define IGL_PNG_READ_PNG_H\n#include \"../igl_inline.h\"\n#include <Eigen/Core>\n#include <string>\n\nnamespace igl\n{\n  namespace png\n  {\n    // Read an image from a .png file into 4 memory buffers\n    //\n    // Input:\n    //  png_file  path to .png file\n    // Output:\n    //  R,G,B,A texture channels\n    // Returns true on success, false on failure\n    //\n    IGL_INLINE bool readPNG(const std::string png_file,\n    Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>& R,\n    Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>& G,\n    Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>& B,\n    Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>& A\n    );\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"readPNG.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/png/render_to_png.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"render_to_png.h\"\n#include <stb_image_write.h>\n\n#include \"../opengl/gl.h\"\n\nIGL_INLINE bool igl::png::render_to_png(\n  const std::string png_file,\n  const int width,\n  const int height,\n  const bool alpha,\n  const bool fast)\n{\n  unsigned char * data = new unsigned char[4*width*height];\n  glReadPixels(\n    0,\n    0,\n    width,\n    height,\n    GL_RGBA,\n    GL_UNSIGNED_BYTE,\n    data);\n  //img->flip();\n  if(!alpha)\n  {\n    for(int i = 0;i<width;i++)\n    for(int j = 0;j<height;j++)\n    {\n      data[4*(i+j*width)+3] = 255;\n    }\n  }\n  bool ret = stbi_write_png(png_file.c_str(), width, height, 4, data, 4*width*sizeof(unsigned char));\n  delete [] data;\n  return ret;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/png/render_to_png.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_PNG_RENDER_TO_PNG_H\n#define IGL_PNG_RENDER_TO_PNG_H\n#include <igl/igl_inline.h>\n\n#include <string>\nnamespace igl\n{\n  namespace png\n  {\n    //\n    // Render current open GL image to .png file\n    // Inputs:\n    //   png_file  path to output .png file\n    //   width  width of scene and resulting image\n    //   height height of scene and resulting image\n    //   alpha  whether to include alpha channel\n    //   fast  sacrifice compression ratio for speed\n    // Returns true only if no errors occured\n    //\n    // See also: igl/render_to_tga which is faster but writes .tga files\n    IGL_INLINE bool render_to_png(\n      const std::string png_file,\n      const int width,\n      const int height,\n      const bool alpha = true,\n      const bool fast = false);\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"render_to_png.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/png/render_to_png_async.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"render_to_png_async.h\"\n#include \"../opengl/gl.h\"\n#include <stb_image_write.h>\n\nstatic IGL_INLINE bool render_to_png_async_helper(\n  unsigned char * img, int width, int height,\n  const std::string png_file,\n  const bool alpha,\n  const bool fast)\n{\n  //img->flip();\n  if(!alpha)\n  {\n    for(int i = 0;i<width;i++)\n    for(int j = 0;j<height;j++)\n    {\n      img[4*(i+j*width)+3] = 255;\n    }\n  }\n\n  bool ret = stbi_write_png(png_file.c_str(), width, height, 4, img, width*sizeof(unsigned char));\n  delete [] img;\n  return ret;\n}\n\nIGL_INLINE std::thread igl::png::render_to_png_async(\n  const std::string png_file,\n  const int width,\n  const int height,\n  const bool alpha,\n  const bool fast)\n{\n  // Part that should serial\n  unsigned char * data = new unsigned char[width*height];\n  glReadPixels(\n    0,\n    0,\n    width,\n    height,\n    GL_RGBA,\n    GL_UNSIGNED_BYTE,\n    data);\n  // Part that should be asynchronous\n  std::thread t(render_to_png_async_helper,data,width,height,png_file,alpha,fast);\n  t.detach();\n  return t;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/png/render_to_png_async.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_PNG_RENDER_TO_PNG_ASYNC_H\n#define IGL_PNG_RENDER_TO_PNG_ASYNC_H\n#include <igl/igl_inline.h>\n#include <thread>\n//#include <boost/thread/thread.hpp>\n\n#include <string>\nnamespace igl\n{\n  namespace png\n  {\n    // History:\n    //  added multithreaded parameter and support, Alec Sept 3, 2012\n    //\n    // Render current open GL image to .png file\n    // Inputs:\n    //   png_file  path to output .png file\n    //   width  width of scene and resulting image\n    //   height height of scene and resulting image\n    //   alpha  whether to include alpha channel\n    //   fast  sacrifice compression ratio for speed\n    // Returns true only if no errors occured\n    //\n    // See also: igl/render_to_tga which is faster but writes .tga files\n    IGL_INLINE std::thread render_to_png_async(\n      const std::string png_file,\n      const int width,\n      const int height,\n      const bool alpha = true,\n      const bool fast = false);\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"render_to_png_async.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/png/texture_from_file.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"texture_from_file.h\"\n\n#include \"texture_from_png.h\"\n#include \"../STR.h\"\n#include \"../pathinfo.h\"\n#include \"../opengl/report_gl_error.h\"\n//#include \"../opengl2/texture_from_tga.h\"\n#include <string>\n#include <algorithm>\n#include <iostream>\n\nIGL_INLINE bool igl::png::texture_from_file(const std::string filename, GLuint & id)\n{\n  using namespace igl::opengl;\n  using namespace std;\n  // dirname, basename, extension and filename\n  string d,b,ext,f;\n  pathinfo(filename,d,b,ext,f);\n  // Convert extension to lower case\n  transform(ext.begin(), ext.end(), ext.begin(), ::tolower);\n  //if(ext == \"tga\")\n  //{\n  //  return texture_from_tga(filename,id);\n  //}else \n  if(ext == \"png\")\n  {\n    return texture_from_png(filename,id);\n  }else\n  {\n#ifdef __APPLE__\n    // Convert to a temporary png file\n    string tmp = \"/var/tmp/.texture_from_file.png\";\n#define PATH_TO_CONVERT \"/opt/local/bin/convert\"\n    string command = STR(PATH_TO_CONVERT<<\" \\\"\"<<filename<<\"\\\" \\\"\"<<tmp<<\"\\\"\");\n    try\n    {\n      if(system(command.c_str())==0)\n      {\n        return texture_from_file(tmp.c_str(),id);\n      }else\n      {\n        cerr<<\"texture_from_file: calling to convert ('\"<<command<<\"') failed...\"<<endl;\n        return false;\n      }\n    }catch(int e)\n    {\n      cerr<<\"^\"<<__FUNCTION__<<\": Calling to convert crashed...\"<<endl;\n      return false;\n    }\n#else\n    return false;\n#endif\n  }\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/png/texture_from_file.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_PNG_TEXTURE_FROM_FILE_H\n#define IGL_PNG_TEXTURE_FROM_FILE_H\n#include \"../igl_inline.h\"\n#include \"../opengl/gl.h\"\n\n#include <string>\n\nnamespace igl\n{\n  namespace png\n  {\n    // Read an image from an image file and use it as a texture. Officially,\n    // only <del>.tga and</del> .png are supported. Any filetype read by\n    // ImageMagick's `convert` will work via an unsafe system call.\n    //\n    // Input:\n    //  filename  path to image file\n    // Output:\n    //  id  of generated openGL texture\n    // Returns true on success, false on failure\n    IGL_INLINE bool texture_from_file(const std::string filename, GLuint & id);\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"texture_from_file.cpp\"\n#endif\n\n#endif\n\n\n\n"
  },
  {
    "path": "libs/libigl/include/igl/png/texture_from_png.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"texture_from_png.h\"\n\n#include \"../opengl/report_gl_error.h\"\n#include <stb_image.h>\n\nIGL_INLINE bool igl::png::texture_from_png(const std::string png_file, const bool flip, GLuint & id)\n{\n  int width,height,n;\n  unsigned char *data = stbi_load(png_file.c_str(), &width, &height, &n, 4);\n  if(data == NULL) {\n    return false;\n  }\n\n  // Why do I need to flip?\n  /*if(flip)\n  {\n    yimg.flip();\n  }*/\n  \n  glGenTextures(1, &id);\n  glBindTexture(GL_TEXTURE_2D, id);\n  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);\n  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);\n  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);\n  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);\n  glTexImage2D(\n    GL_TEXTURE_2D, 0, GL_RGB,\n    width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);\n  glBindTexture(GL_TEXTURE_2D, 0);\n\n  stbi_image_free(data);\n\n  return true;\n}\n\nIGL_INLINE bool igl::png::texture_from_png(const std::string png_file, GLuint & id)\n{\n  return texture_from_png(png_file,false,id);\n}\n\n\nIGL_INLINE bool igl::png::texture_from_png(\n  const std::string png_file,\n  Eigen::Matrix<char,Eigen::Dynamic,Eigen::Dynamic>& R,\n  Eigen::Matrix<char,Eigen::Dynamic,Eigen::Dynamic>& G,\n  Eigen::Matrix<char,Eigen::Dynamic,Eigen::Dynamic>& B,\n  Eigen::Matrix<char,Eigen::Dynamic,Eigen::Dynamic>& A\n)\n{\n  int width,height,n;\n  unsigned char *data = stbi_load(png_file.c_str(), &width, &height, &n, 4);\n  if(data == NULL) {\n    return false;\n  }\n\n  R.resize(height,width);\n  G.resize(height,width);\n  B.resize(height,width);\n  A.resize(height,width);\n\n  for (unsigned j=0; j<height; ++j) {\n    for (unsigned i=0; i<width; ++i) {\n      // used to flip with libPNG, but I'm not sure if\n      // simply j*width + i wouldn't be better\n      // stb_image uses horizontal scanline an starts top-left corner\n      R(i,j) = data[4*( (width-1-i) + width * (height-1-j) )];\n      G(i,j) = data[4*( (width-1-i) + width * (height-1-j) ) + 1];\n      B(i,j) = data[4*( (width-1-i) + width * (height-1-j) ) + 2];\n      //A(i,j) = data[4*( (width-1-i) + width * (height-1-j) ) + 3];\n    }\n  }\n\n  stbi_image_free(data);\n\n  return true;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/png/texture_from_png.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_PNG_TEXTURE_FROM_PNG_H\n#define IGL_PNG_TEXTURE_FROM_PNG_H\n#include \"../igl_inline.h\"\n#include <Eigen/Core>\n#include <string>\n\n#include \"../opengl/gl.h\"\n\nnamespace igl\n{\n  namespace png\n  {\n    // Read an image from a .png file and use it as a texture\n    //\n    // Input:\n    //  png_file  path to .png file\n    //  flip  whether to flip the image vertically (A --> ∀)\n    // Output:\n    //  id  of generated openGL texture\n    // Returns true on success, false on failure\n    IGL_INLINE bool texture_from_png(const std::string png_file, const bool flip, GLuint & id);\n    IGL_INLINE bool texture_from_png(const std::string png_file, GLuint & id);\n\n    // Read an image from a .png file and use it as a texture\n    //\n    // Input:\n    //  png_file  path to .png file\n    // Output:\n    //  R,G,B,A texture channels\n    // Returns true on success, false on failure\n    //\n    // Todo: this is an inappropriate function name. This is really just\n    // reading a png.... Not necessarily as a texture.\n    IGL_INLINE bool texture_from_png(const std::string png_file,\n    Eigen::Matrix<char,Eigen::Dynamic,Eigen::Dynamic>& R,\n    Eigen::Matrix<char,Eigen::Dynamic,Eigen::Dynamic>& G,\n    Eigen::Matrix<char,Eigen::Dynamic,Eigen::Dynamic>& B,\n    Eigen::Matrix<char,Eigen::Dynamic,Eigen::Dynamic>& A\n    );\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"texture_from_png.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/png/writePNG.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2016 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"writePNG.h\"\n#include <stb_image_write.h>\n#include <vector>\n\nIGL_INLINE bool igl::png::writePNG(\n  const Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>& R,\n  const Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>& G,\n  const Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>& B,\n  const Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>& A,\n  const std::string png_file\n)\n{\n  assert((R.rows() == G.rows()) && (G.rows() == B.rows()) && (B.rows() == A.rows()));\n  assert((R.cols() == G.cols()) && (G.cols() == B.cols()) && (B.cols() == A.cols()));\n\n  const int comp = 4;                                  // 4 Channels Red, Green, Blue, Alpha\n  const int stride_in_bytes = R.rows()*comp;           // Lenght of one row in bytes\n  std::vector<unsigned char> data(R.size()*comp,0);     // The image itself;\n\n  for (unsigned i = 0; i<R.rows();++i)\n  {\n    for (unsigned j = 0; j < R.cols(); ++j)\n    {\n        data[(j * R.rows() * comp) + (i * comp) + 0] = R(i,R.cols()-1-j);\n        data[(j * R.rows() * comp) + (i * comp) + 1] = G(i,R.cols()-1-j);\n        data[(j * R.rows() * comp) + (i * comp) + 2] = B(i,R.cols()-1-j);\n        data[(j * R.rows() * comp) + (i * comp) + 3] = A(i,R.cols()-1-j);\n    }\n  }\n\n  stbi_write_png(png_file.c_str(), R.rows(), R.cols(), comp, data.data(), stride_in_bytes);\n\n  return true;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/png/writePNG.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2016 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_PNG_WRITE_PNG_H\n#define IGL_PNG_WRITE_PNG_H\n#include \"../igl_inline.h\"\n#include <Eigen/Core>\n#include <string>\n\nnamespace igl\n{\n  namespace png\n  {\n    // Writes an image to a png file\n    //\n    // Input:\n    //  R,G,B,A texture channels\n    // Output:\n    //  png_file  path to .png file\n    // Returns true on success, false on failure\n    //\n    IGL_INLINE bool writePNG\n    (\n      const Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>& R,\n      const Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>& G,\n      const Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>& B,\n      const Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>& A,\n      const std::string png_file\n    );\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"writePNG.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/point_in_circle.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"point_in_circle.h\"\n\nIGL_INLINE bool igl::point_in_circle(\n  const double qx, \n  const double qy,\n  const double cx, \n  const double cy,\n  const double r)\n{\n  return (qx-cx)*(qx-cx) + (qy-cy)*(qy-cy) - r*r < 0;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/point_in_circle.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_POINT_IN_CIRCLE_H\n#define IGL_POINT_IN_CIRCLE_H\n#include \"igl_inline.h\"\n\nnamespace igl\n{\n  // Determine if 2d point is in a circle\n  // Inputs:\n  //   qx  x-coordinate of query point\n  //   qy  y-coordinate of query point\n  //   cx  x-coordinate of circle center\n  //   cy  y-coordinate of circle center\n  //   r  radius of circle\n  // Returns true if query point is in circle, false otherwise\n  IGL_INLINE bool point_in_circle(\n    const double qx, \n    const double qy,\n    const double cx, \n    const double cy,\n    const double r);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"point_in_circle.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/point_in_poly.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"point_in_poly.h\"\n\nbool IGL_INLINE igl::point_in_poly( const std::vector<std::vector<unsigned int > >&poly, \n            const unsigned int xt, \n            const unsigned int yt)\n{\n  int npoints= poly.size();\n  unsigned int xnew,ynew;\n  unsigned int xold,yold;\n  unsigned int x1,y1;\n  unsigned int x2,y2;\n  int i;\n  int inside=0;\n  \n  if (npoints < 3) {\n    return(0);\n  }\n  xold=poly[npoints-1][0];\n  yold=poly[npoints-1][1];\n  for (i=0 ; i < npoints ; i++) {\n    xnew=poly[i][0];\n    ynew=poly[i][1];\n    if (xnew > xold) {\n      x1=xold;\n      x2=xnew;\n      y1=yold;\n      y2=ynew;\n    }\n    else {\n      x1=xnew;\n      x2=xold;\n      y1=ynew;\n      y2=yold;\n    }\n    if ((xnew < xt) == (xt <= xold)          /* edge \"open\" at one end */\n        && ((long)yt-(long)y1)*(long)(x2-x1)\n        < ((long)y2-(long)y1)*(long)(xt-x1)) {\n      inside=!inside;\n    }\n    xold=xnew;\n    yold=ynew;\n  }\n  return (inside != 0);\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/point_in_poly.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_POINT_IN_POLY_H\n#define IGL_POINT_IN_POLY_H\n#include \"igl_inline.h\"\n\n#include <vector>\n\nnamespace igl\n{\n  // Determine if 2d point is inside a 2D polygon\n  // Inputs:\n  //   poly  vector of polygon points, [0]=x, [1]=y. \n  //         Polyline need not be closed (i.e. first point != last point), \n  //         the line segment between last and first selected points is constructed \n  //         within this function.\n  //   x     x-coordinate of query point\n  //   y     y-coordinate of query point\n  // Returns true if query point is in polygon, false otherwise\n  // from http://www.visibone.com/inpoly/\nbool IGL_INLINE point_in_poly( const std::vector<std::vector<unsigned int > >&poly, \n            const unsigned int xt, \n            const unsigned int yt);\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"point_in_poly.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/point_mesh_squared_distance.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"point_mesh_squared_distance.h\"\n#include \"AABB.h\"\n\ntemplate <\n  typename DerivedP,\n  typename DerivedV,\n  typename DerivedsqrD,\n  typename DerivedI,\n  typename DerivedC>\nIGL_INLINE void igl::point_mesh_squared_distance(\n  const Eigen::PlainObjectBase<DerivedP> & P,\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::MatrixXi & Ele,\n  Eigen::PlainObjectBase<DerivedsqrD> & sqrD,\n  Eigen::PlainObjectBase<DerivedI> & I,\n  Eigen::PlainObjectBase<DerivedC> & C)\n{\n  using namespace std;\n  const size_t dim = P.cols();\n  assert((dim == 2 || dim == 3) && \"P.cols() should be 2 or 3\");\n  assert(P.cols() == V.cols() && \"P.cols() should equal V.cols()\");\n  switch(dim)\n  {\n    default:\n      // fall-through and pray\n    case 3:\n    {\n      AABB<DerivedV,3> tree;\n      tree.init(V,Ele);\n      return tree.squared_distance(V,Ele,P,sqrD,I,C);\n    }\n    case 2:\n    {\n      AABB<DerivedV,2> tree;\n      tree.init(V,Ele);\n      return tree.squared_distance(V,Ele,P,sqrD,I,C);\n    }\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\ntemplate void igl::point_mesh_squared_distance<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::point_mesh_squared_distance<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::point_mesh_squared_distance<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/point_mesh_squared_distance.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_POINT_MESH_SQUARED_DISTANCE_H\n#define IGL_POINT_MESH_SQUARED_DISTANCE_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <vector>\n\nnamespace igl\n{\n  // Compute distances from a set of points P to a triangle mesh (V,F)\n  //\n  // Inputs:\n  //   P  #P by 3 list of query point positions\n  //   V  #V by 3 list of vertex positions\n  //   Ele  #Ele by (3|2|1) list of (triangle|edge|point) indices\n  // Outputs:\n  //   sqrD  #P list of smallest squared distances\n  //   I  #P list of primitive indices corresponding to smallest distances\n  //   C  #P by 3 list of closest points\n  //\n  // Known bugs: This only computes distances to given primitivess. So\n  // unreferenced vertices are ignored. However, degenerate primitives are\n  // handled correctly: triangle [1 2 2] is treated as a segment [1 2], and\n  // triangle [1 1 1] is treated as a point. So one _could_ add extra\n  // combinatorially degenerate rows to Ele for all unreferenced vertices to\n  // also get distances to points.\n  template <\n    typename DerivedP,\n    typename DerivedV,\n    typename DerivedsqrD,\n    typename DerivedI,\n    typename DerivedC>\n  IGL_INLINE void point_mesh_squared_distance(\n    const Eigen::PlainObjectBase<DerivedP> & P,\n    const Eigen::PlainObjectBase<DerivedV> & V,\n    const Eigen::MatrixXi & Ele, \n    Eigen::PlainObjectBase<DerivedsqrD> & sqrD,\n    Eigen::PlainObjectBase<DerivedI> & I,\n    Eigen::PlainObjectBase<DerivedC> & C);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"point_mesh_squared_distance.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/point_simplex_squared_distance.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"point_simplex_squared_distance.h\"\n#include \"project_to_line_segment.h\"\n#include \"barycentric_coordinates.h\"\n#include <Eigen/Geometry>\n#include <limits>\n#include <cassert>\n\n\n\ntemplate <\n  int DIM,\n  typename Derivedp,\n  typename DerivedV,\n  typename DerivedEle,\n  typename Derivedsqr_d,\n  typename Derivedc,\n  typename Derivedb>\nIGL_INLINE void igl::point_simplex_squared_distance(\n  const Eigen::MatrixBase<Derivedp> & p,\n  const Eigen::MatrixBase<DerivedV> & V,\n  const Eigen::MatrixBase<DerivedEle> & Ele,\n  const typename DerivedEle::Index primitive,\n  Derivedsqr_d & sqr_d,\n  Eigen::MatrixBase<Derivedc> & c,\n  Eigen::PlainObjectBase<Derivedb> & bary)\n{\n  typedef typename Derivedp::Scalar Scalar;\n  typedef typename Eigen::Matrix<Scalar,1,DIM> Vector;\n  typedef Vector Point;\n  //typedef Derivedb BaryPoint;\n  typedef Eigen::Matrix<typename Derivedb::Scalar,1,3> BaryPoint;\n\n  const auto & Dot = [](const Point & a, const Point & b)->Scalar\n  {\n    return a.dot(b);\n  };\n  // Real-time collision detection, Ericson, Chapter 5\n  const auto & ClosestBaryPtPointTriangle = \n    [&Dot](Point p, Point a, Point b, Point c, BaryPoint& bary_out )->Point \n  {\n    // Check if P in vertex region outside A\n    Vector ab = b - a;\n    Vector ac = c - a;\n    Vector ap = p - a;\n    Scalar d1 = Dot(ab, ap);\n    Scalar d2 = Dot(ac, ap);\n    if (d1 <= 0.0 && d2 <= 0.0) {\n      // barycentric coordinates (1,0,0)\n      bary_out << 1, 0, 0;\n      return a;\n    }\n    // Check if P in vertex region outside B\n    Vector bp = p - b;\n    Scalar d3 = Dot(ab, bp);\n    Scalar d4 = Dot(ac, bp);\n    if (d3 >= 0.0 && d4 <= d3) {\n      // barycentric coordinates (0,1,0)\n      bary_out << 0, 1, 0;\n      return b;\n    }\n    // Check if P in edge region of AB, if so return projection of P onto AB\n    Scalar vc = d1*d4 - d3*d2;\n    if( a != b)\n    {\n      if (vc <= 0.0 && d1 >= 0.0 && d3 <= 0.0) {\n        Scalar v = d1 / (d1 - d3);\n        // barycentric coordinates (1-v,v,0)\n        bary_out << 1-v, v, 0;\n        return a + v * ab;\n      }\n    }\n    // Check if P in vertex region outside C\n    Vector cp = p - c;\n    Scalar d5 = Dot(ab, cp);\n    Scalar d6 = Dot(ac, cp);\n    if (d6 >= 0.0 && d5 <= d6) {\n      // barycentric coordinates (0,0,1)\n      bary_out << 0, 0, 1;\n      return c;\n    }\n    // Check if P in edge region of AC, if so return projection of P onto AC\n    Scalar vb = d5*d2 - d1*d6;\n    if (vb <= 0.0 && d2 >= 0.0 && d6 <= 0.0) {\n      Scalar w = d2 / (d2 - d6);\n      // barycentric coordinates (1-w,0,w)\n      bary_out << 1-w, 0, w;\n      return a + w * ac;\n    }\n    // Check if P in edge region of BC, if so return projection of P onto BC\n    Scalar va = d3*d6 - d5*d4;\n    if (va <= 0.0 && (d4 - d3) >= 0.0 && (d5 - d6) >= 0.0) {\n      Scalar w = (d4 - d3) / ((d4 - d3) + (d5 - d6));\n      // barycentric coordinates (0,1-w,w)\n      bary_out << 0, 1-w, w;\n      return b + w * (c - b);\n    }\n    // P inside face region. Compute Q through its barycentric coordinates (u,v,w)\n    Scalar denom = 1.0 / (va + vb + vc);\n    Scalar v = vb * denom;\n    Scalar w = vc * denom;\n    bary_out << 1.0-v-w, v, w;\n    return a + ab * v + ac * w; // = u*a + v*b + w*c, u = va * denom = 1.0-v-w\n  };\n\n  assert(p.size() == DIM);\n  assert(V.cols() == DIM);\n  assert(Ele.cols() <= DIM+1);\n  assert(Ele.cols() <= 3 && \"Only simplices up to triangles are considered\");\n\n  assert((Derivedb::RowsAtCompileTime == 1 || Derivedb::ColsAtCompileTime == 1) && \"bary must be Eigen Vector or Eigen RowVector\");\n  assert(\n    ((Derivedb::RowsAtCompileTime == -1 || Derivedb::ColsAtCompileTime == -1) ||\n      (Derivedb::RowsAtCompileTime == Ele.cols() || Derivedb::ColsAtCompileTime == -Ele.cols())\n    ) && \"bary must be Dynamic or size of Ele.cols()\");\n\n  BaryPoint tmp_bary;\n  c = (const Derivedc &)ClosestBaryPtPointTriangle(\n    p,\n    V.row(Ele(primitive,0)),\n    // modulo is a HACK to handle points, segments and triangles. Because of\n    // this, we need 3d buffer for bary\n    V.row(Ele(primitive,1%Ele.cols())),\n    V.row(Ele(primitive,2%Ele.cols())),\n    tmp_bary);\n  bary.resize( Derivedb::RowsAtCompileTime == 1 ? 1 : Ele.cols(), Derivedb::ColsAtCompileTime == 1 ? 1 : Ele.cols());\n  bary.head(Ele.cols()) = tmp_bary.head(Ele.cols());\n  sqr_d = (p-c).squaredNorm();\n}\n\ntemplate <\n  int DIM,\n  typename Derivedp,\n  typename DerivedV,\n  typename DerivedEle,\n  typename Derivedsqr_d,\n  typename Derivedc>\nIGL_INLINE void igl::point_simplex_squared_distance(\n  const Eigen::MatrixBase<Derivedp> & p,\n  const Eigen::MatrixBase<DerivedV> & V,\n  const Eigen::MatrixBase<DerivedEle> & Ele,\n  const typename DerivedEle::Index primitive,\n  Derivedsqr_d & sqr_d,\n  Eigen::MatrixBase<Derivedc> & c)\n{\n  // Use Dynamic because we don't know Ele.cols() at compile time.\n  Eigen::Matrix<typename Derivedc::Scalar,1,Eigen::Dynamic> b;\n  point_simplex_squared_distance<DIM>( p, V, Ele, primitive, sqr_d, c, b );\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::point_simplex_squared_distance<3, Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, double, Eigen::Matrix<double, 1, 3, 1, 1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, double&, Eigen::MatrixBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> >&);\ntemplate void igl::point_simplex_squared_distance<2, Eigen::Matrix<double, 1, 2, 1, 1, 2>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, double, Eigen::Matrix<double, 1, 2, 1, 1, 2> >(Eigen::MatrixBase<Eigen::Matrix<double, 1, 2, 1, 1, 2> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, double&, Eigen::MatrixBase<Eigen::Matrix<double, 1, 2, 1, 1, 2> >&);\ntemplate void igl::point_simplex_squared_distance<3, Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, double, Eigen::Matrix<double, 1, 3, 1, 1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, double&, Eigen::MatrixBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> >&);\ntemplate void igl::point_simplex_squared_distance<3, Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, double, Eigen::Matrix<double, 1, 3, 1, 1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, double&, Eigen::MatrixBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 1, 1, 1, 3> >&);\ntemplate void igl::point_simplex_squared_distance<2, Eigen::Matrix<double, 1, 2, 1, 1, 2>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, double, Eigen::Matrix<double, 1, 2, 1, 1, 2> >(Eigen::MatrixBase<Eigen::Matrix<double, 1, 2, 1, 1, 2> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, double&, Eigen::MatrixBase<Eigen::Matrix<double, 1, 2, 1, 1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 2, 1, 1, 2> >&);\ntemplate void igl::point_simplex_squared_distance<2, Eigen::Matrix<double, 1, 2, 1, 1, 2>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, double, Eigen::Matrix<double, 1, 2, 1, 1, 2> >(Eigen::MatrixBase<Eigen::Matrix<double, 1, 2, 1, 1, 2> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>::Index, double&, Eigen::MatrixBase<Eigen::Matrix<double, 1, 2, 1, 1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 1, 1, 1, 2> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/point_simplex_squared_distance.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_POINT_SIMPLEX_SQUARED_DISTANCE_H\n#define IGL_POINT_SIMPLEX_SQUARED_DISTANCE_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Determine squared distance from a point to linear simplex. \n  //\n  // Inputs:\n  //   p  d-long query point\n  //   V  #V by d list of vertices\n  //   Ele  #Ele by ss<=d+1 list of simplex indices into V\n  //   i  index into Ele of simplex\n  // Outputs:\n  //   sqr_d  squared distance of Ele(i) to p\n  //   c  closest point on Ele(i) \n  //\n  template <\n    int DIM,\n    typename Derivedp,\n    typename DerivedV,\n    typename DerivedEle,\n    typename Derivedsqr_d,\n    typename Derivedc>\n  IGL_INLINE void point_simplex_squared_distance(\n    const Eigen::MatrixBase<Derivedp> & p,\n    const Eigen::MatrixBase<DerivedV> & V,\n    const Eigen::MatrixBase<DerivedEle> & Ele,\n    const typename DerivedEle::Index i,\n    Derivedsqr_d & sqr_d,\n    Eigen::MatrixBase<Derivedc> & c);\n  // Determine squared distance from a point to linear simplex.\n  // Also return barycentric coordinate of closest point. \n  //\n  // Inputs:\n  //   p  d-long query point\n  //   V  #V by d list of vertices\n  //   Ele  #Ele by ss<=d+1 list of simplex indices into V\n  //   i  index into Ele of simplex\n  // Outputs:\n  //   sqr_d  squared distance of Ele(i) to p\n  //   c  closest point on Ele(i) \n  //   b  barycentric coordinates of closest point on Ele(i) \n  //\n  template <\n    int DIM,\n    typename Derivedp,\n    typename DerivedV,\n    typename DerivedEle,\n    typename Derivedsqr_d,\n    typename Derivedc,\n    typename Derivedb>\n  IGL_INLINE void point_simplex_squared_distance(\n    const Eigen::MatrixBase<Derivedp> & p,\n    const Eigen::MatrixBase<DerivedV> & V,\n    const Eigen::MatrixBase<DerivedEle> & Ele,\n    const typename DerivedEle::Index i,\n    Derivedsqr_d & sqr_d,\n    Eigen::MatrixBase<Derivedc> & c,\n    Eigen::PlainObjectBase<Derivedb> & b);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"point_simplex_squared_distance.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/polar_dec.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"polar_dec.h\"\n#include \"polar_svd.h\"\n#ifdef _WIN32\n#else\n#  include <fenv.h>\n#endif\n#include <cmath>\n#include <Eigen/Eigenvalues>\n#include <iostream>\n#include <cfenv>\n\n// From Olga's CGAL mentee's ARAP code\ntemplate <\n  typename DerivedA,\n  typename DerivedR,\n  typename DerivedT,\n  typename DerivedU,\n  typename DerivedS,\n  typename DerivedV>\nIGL_INLINE void igl::polar_dec(\n  const Eigen::PlainObjectBase<DerivedA> & A,\n  Eigen::PlainObjectBase<DerivedR> & R,\n  Eigen::PlainObjectBase<DerivedT> & T,\n  Eigen::PlainObjectBase<DerivedU> & U,\n  Eigen::PlainObjectBase<DerivedS> & S,\n  Eigen::PlainObjectBase<DerivedV> & V)\n{\n  using namespace std;\n  using namespace Eigen;\n  typedef typename DerivedA::Scalar Scalar;\n\n  const Scalar th = std::sqrt(Eigen::NumTraits<Scalar>::dummy_precision());\n\n  Eigen::SelfAdjointEigenSolver<DerivedA> eig;\n  feclearexcept(FE_UNDERFLOW);\n  eig.computeDirect(A.transpose()*A);\n  if(fetestexcept(FE_UNDERFLOW) || eig.eigenvalues()(0)/eig.eigenvalues()(2)<th)\n  {\n    cout<<\"resorting to svd 1...\"<<endl;\n    return polar_svd(A,R,T,U,S,V);\n  }\n\n  S = eig.eigenvalues().cwiseSqrt();\n\n  V = eig.eigenvectors();\n  U = A * V;\n  R = U * S.asDiagonal().inverse() * V.transpose();\n  T = V * S.asDiagonal() * V.transpose();\n\n  S = S.reverse().eval();\n  V = V.rowwise().reverse().eval();\n  U = U.rowwise().reverse().eval() * S.asDiagonal().inverse();\n\n  if(R.determinant() < 0)\n  {\n    // Annoyingly the .eval() is necessary\n    auto W = V.eval();\n    const auto & SVT = S.asDiagonal() * V.adjoint();\n    W.col(V.cols()-1) *= -1.;\n    R = U*W.transpose();\n    T = W*SVT;\n  }\n\n  if(std::fabs(R.squaredNorm()-3.) > th)\n  {\n    cout<<\"resorting to svd 2...\"<<endl;\n    return polar_svd(A,R,T,U,S,V);\n  }\n}\n\ntemplate <\n  typename DerivedA,\n  typename DerivedR,\n  typename DerivedT>\nIGL_INLINE void igl::polar_dec(\n  const Eigen::PlainObjectBase<DerivedA> & A,\n  Eigen::PlainObjectBase<DerivedR> & R,\n  Eigen::PlainObjectBase<DerivedT> & T)\n{\n  DerivedA U;\n  DerivedA V;\n  Eigen::Matrix<typename DerivedA::Scalar,DerivedA::RowsAtCompileTime,1> S;\n  return igl::polar_dec(A,R,T,U,S,V);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate  void igl::polar_dec<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::polar_dec<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, 2, 2, 0, 2, 2>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 2, 0, 2, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/polar_dec.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_POLAR_DEC\n#define IGL_POLAR_DEC\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n\nnamespace igl\n{\n  // Computes the polar decomposition (R,T) of a matrix A\n  // Inputs:\n  //   A  3 by 3 matrix to be decomposed\n  // Outputs:\n  //   R  3 by 3 orthonormal matrix part of decomposition\n  //   T  3 by 3 stretch matrix part of decomposition\n  //   U  3 by 3 left-singular vectors\n  //   S  3 by 1 singular values\n  //   V  3 by 3 right-singular vectors\n  //\n  //\n  template <\n    typename DerivedA,\n    typename DerivedR,\n    typename DerivedT,\n    typename DerivedU,\n    typename DerivedS,\n    typename DerivedV>\n  IGL_INLINE void polar_dec(\n    const Eigen::PlainObjectBase<DerivedA> & A,\n    Eigen::PlainObjectBase<DerivedR> & R,\n    Eigen::PlainObjectBase<DerivedT> & T,\n    Eigen::PlainObjectBase<DerivedU> & U,\n    Eigen::PlainObjectBase<DerivedS> & S,\n    Eigen::PlainObjectBase<DerivedV> & V);\n  template <\n    typename DerivedA,\n    typename DerivedR,\n    typename DerivedT>\n  IGL_INLINE void polar_dec(\n    const Eigen::PlainObjectBase<DerivedA> & A,\n    Eigen::PlainObjectBase<DerivedR> & R,\n    Eigen::PlainObjectBase<DerivedT> & T);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"polar_dec.cpp\"\n#endif\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/polar_svd.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"polar_svd.h\"\n#include <Eigen/SVD>\n#include <Eigen/Geometry>\n#include <iostream>\n\n// Adapted from Olga's CGAL mentee's ARAP code\ntemplate <\n  typename DerivedA,\n  typename DerivedR,\n  typename DerivedT>\nIGL_INLINE void igl::polar_svd(\n  const Eigen::PlainObjectBase<DerivedA> & A,\n  Eigen::PlainObjectBase<DerivedR> & R,\n  Eigen::PlainObjectBase<DerivedT> & T)\n{\n  DerivedA U;\n  DerivedA V;\n  Eigen::Matrix<typename DerivedA::Scalar,DerivedA::RowsAtCompileTime,1> S;\n  return igl::polar_svd(A,R,T,U,S,V);\n}\n\ntemplate <\n  typename DerivedA,\n  typename DerivedR,\n  typename DerivedT,\n  typename DerivedU,\n  typename DerivedS,\n  typename DerivedV>\nIGL_INLINE void igl::polar_svd(\n  const Eigen::PlainObjectBase<DerivedA> & A,\n  Eigen::PlainObjectBase<DerivedR> & R,\n  Eigen::PlainObjectBase<DerivedT> & T,\n  Eigen::PlainObjectBase<DerivedU> & U,\n  Eigen::PlainObjectBase<DerivedS> & S,\n  Eigen::PlainObjectBase<DerivedV> & V)\n{\n  using namespace std;\n  Eigen::JacobiSVD<DerivedA> svd;\n  svd.compute(A, Eigen::ComputeFullU | Eigen::ComputeFullV );\n  U = svd.matrixU();\n  V = svd.matrixV();\n  S = svd.singularValues();\n  R = U*V.transpose();\n  const auto & SVT = S.asDiagonal() * V.adjoint();\n  // Check for reflection\n  if(R.determinant() < 0)\n  {\n    // Annoyingly the .eval() is necessary\n    auto W = V.eval();\n    W.col(V.cols()-1) *= -1.;\n    R = U*W.transpose();\n    T = W*SVT;\n  }else\n  {\n    T = V*SVT;\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::polar_svd<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::polar_svd<Eigen::Matrix<double, 2, 2, 0, 2, 2>, Eigen::Matrix<double, 2, 2, 0, 2, 2>, Eigen::Matrix<double, 2, 2, 0, 2, 2> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 2, 0, 2, 2> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 2, 0, 2, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 2, 0, 2, 2> >&);\ntemplate void igl::polar_svd<Eigen::Matrix<double, 3, 3, 0, 3, 3>, Eigen::Matrix<double, 3, 3, 0, 3, 3>, Eigen::Matrix<double, 3, 3, 0, 3, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 3, 0, 3, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 3, 0, 3, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 3, 0, 3, 3> >&);\ntemplate void igl::polar_svd<Eigen::Matrix<float, 2, 2, 0, 2, 2>, Eigen::Matrix<float, 2, 2, 0, 2, 2>, Eigen::Matrix<float, 2, 2, 0, 2, 2> >(Eigen::PlainObjectBase<Eigen::Matrix<float, 2, 2, 0, 2, 2> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, 2, 2, 0, 2, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<float, 2, 2, 0, 2, 2> >&);\ntemplate void igl::polar_svd<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, 2, 2, 0, 2, 2>, Eigen::Matrix<double, 2, 2, 0, 2, 2> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 2, 0, 2, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 2, 0, 2, 2> >&);\ntemplate void igl::polar_svd<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, 2, 2, 0, 2, 2>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 2, 0, 2, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::polar_svd<Eigen::Matrix<float,3,3,0,3,3>,Eigen::Matrix<float,3,3,0,3,3>,Eigen::Matrix<float,3,3,0,3,3>,Eigen::Matrix<float,3,3,0,3,3>,Eigen::Matrix<float,3,1,0,3,1>,Eigen::Matrix<float,3,3,0,3,3> >(Eigen::PlainObjectBase<Eigen::Matrix<float,3,3,0,3,3> > const &,Eigen::PlainObjectBase<Eigen::Matrix<float,3,3,0,3,3> > &,Eigen::PlainObjectBase<Eigen::Matrix<float,3,3,0,3,3> > &,Eigen::PlainObjectBase<Eigen::Matrix<float,3,3,0,3,3> > &,Eigen::PlainObjectBase<Eigen::Matrix<float,3,1,0,3,1> > &,Eigen::PlainObjectBase<Eigen::Matrix<float,3,3,0,3,3> >&);\ntemplate void igl::polar_svd<Eigen::Matrix<double, 3, 3, 0, 3, 3>, Eigen::Matrix<double, 3, 3, 0, 3, 3>, Eigen::Matrix<double, 3, 3, 0, 3, 3>, Eigen::Matrix<double, 3, 3, 0, 3, 3>, Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 3, 0, 3, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 3, 0, 3, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 3, 0, 3, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 3, 0, 3, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 3, 0, 3, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 1, 0, 3, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 3, 0, 3, 3> >&);\ntemplate void igl::polar_svd<Eigen::Matrix<float, 2, 2, 0, 2, 2>, Eigen::Matrix<float, 2, 2, 0, 2, 2>, Eigen::Matrix<float, 2, 2, 0, 2, 2>, Eigen::Matrix<float, 2, 2, 0, 2, 2>, Eigen::Matrix<float, 2, 1, 0, 2, 1>, Eigen::Matrix<float, 2, 2, 0, 2, 2> >(Eigen::PlainObjectBase<Eigen::Matrix<float, 2, 2, 0, 2, 2> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, 2, 2, 0, 2, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<float, 2, 2, 0, 2, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<float, 2, 2, 0, 2, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<float, 2, 1, 0, 2, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<float, 2, 2, 0, 2, 2> >&);\ntemplate void igl::polar_svd<Eigen::Matrix<double, 2, 2, 0, 2, 2>, Eigen::Matrix<double, 2, 2, 0, 2, 2>, Eigen::Matrix<double, 2, 2, 0, 2, 2>, Eigen::Matrix<double, 2, 2, 0, 2, 2>, Eigen::Matrix<double, 2, 1, 0, 2, 1>, Eigen::Matrix<double, 2, 2, 0, 2, 2> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 2, 0, 2, 2> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 2, 0, 2, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 2, 0, 2, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 2, 0, 2, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 1, 0, 2, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 2, 0, 2, 2> >&);\ntemplate void igl::polar_svd<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::polar_svd<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/polar_svd.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_POLAR_SVD\n#define IGL_POLAR_SVD\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n\nnamespace igl\n{\n  // Computes the polar decomposition (R,T) of a matrix A using SVD singular\n  // value decomposition\n  //\n  // Inputs:\n  //   A  3 by 3 matrix to be decomposed\n  // Outputs:\n  //   R  3 by 3 rotation matrix part of decomposition (**always rotataion**)\n  //   T  3 by 3 stretch matrix part of decomposition\n  //   U  3 by 3 left-singular vectors\n  //   S  3 by 1 singular values\n  //   V  3 by 3 right-singular vectors\n  //\n  //\n  template <\n    typename DerivedA,\n    typename DerivedR,\n    typename DerivedT,\n    typename DerivedU,\n    typename DerivedS,\n    typename DerivedV>\n  IGL_INLINE void polar_svd(\n    const Eigen::PlainObjectBase<DerivedA> & A,\n    Eigen::PlainObjectBase<DerivedR> & R,\n    Eigen::PlainObjectBase<DerivedT> & T,\n    Eigen::PlainObjectBase<DerivedU> & U,\n    Eigen::PlainObjectBase<DerivedS> & S,\n    Eigen::PlainObjectBase<DerivedV> & V);\n  template <\n    typename DerivedA,\n    typename DerivedR,\n    typename DerivedT>\n  IGL_INLINE void polar_svd(\n    const Eigen::PlainObjectBase<DerivedA> & A,\n    Eigen::PlainObjectBase<DerivedR> & R,\n    Eigen::PlainObjectBase<DerivedT> & T);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"polar_svd.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/polar_svd3x3.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"polar_svd3x3.h\"\n#include \"svd3x3.h\"\n#ifdef __SSE__\n#  include \"svd3x3_sse.h\"\n#endif\n#ifdef __AVX__\n#  include \"svd3x3_avx.h\"\n#endif\n\ntemplate<typename Mat>\nIGL_INLINE void igl::polar_svd3x3(const Mat& A, Mat& R)\n{\n  // should be caught at compile time, but just to be 150% sure:\n  assert(A.rows() == 3 && A.cols() == 3);\n\n  Eigen::Matrix<typename Mat::Scalar, 3, 3> U, Vt;\n  Eigen::Matrix<typename Mat::Scalar, 3, 1> S;\n  svd3x3(A, U, S, Vt);\n  R = U * Vt.transpose();\n}\n\n#ifdef __SSE__\ntemplate<typename T>\nIGL_INLINE void igl::polar_svd3x3_sse(const Eigen::Matrix<T, 3*4, 3>& A, Eigen::Matrix<T, 3*4, 3> &R)\n{\n  // should be caught at compile time, but just to be 150% sure:\n  assert(A.rows() == 3*4 && A.cols() == 3);\n\n  Eigen::Matrix<T, 3*4, 3> U, Vt;\n  Eigen::Matrix<T, 3*4, 1> S;\n  svd3x3_sse(A, U, S, Vt);\n\n  for (int k=0; k<4; k++)\n  {\n    R.block(3*k, 0, 3, 3) = U.block(3*k, 0, 3, 3) * Vt.block(3*k, 0, 3, 3).transpose();\n  }\n\n  //// test:\n  //for (int k=0; k<4; k++)\n  //{\n  //  Eigen::Matrix3f Apart = A.block(3*k, 0, 3, 3);\n  //  Eigen::Matrix3f Rpart;\n  //  polar_svd3x3(Apart, Rpart);\n\n  //  Eigen::Matrix3f Rpart_SSE = R.block(3*k, 0, 3, 3);\n  //  Eigen::Matrix3f diff = Rpart - Rpart_SSE;\n  //  float diffNorm = diff.norm();\n\n  //  int hu = 1;\n  //}\n  //// eof test\n}\n#endif\n\n#ifdef __AVX__\ntemplate<typename T>\nIGL_INLINE void igl::polar_svd3x3_avx(const Eigen::Matrix<T, 3*8, 3>& A, Eigen::Matrix<T, 3*8, 3> &R)\n{\n  // should be caught at compile time, but just to be 150% sure:\n  assert(A.rows() == 3*8 && A.cols() == 3);\n\n  Eigen::Matrix<T, 3*8, 3> U, Vt;\n  Eigen::Matrix<T, 3*8, 1> S;\n  svd3x3_avx(A, U, S, Vt);\n\n  for (int k=0; k<8; k++)\n  {\n    R.block(3*k, 0, 3, 3) = U.block(3*k, 0, 3, 3) * Vt.block(3*k, 0, 3, 3).transpose();\n  }\n\n  // test:\n  for (int k=0; k<8; k++)\n  {\n    Eigen::Matrix3f Apart = A.block(3*k, 0, 3, 3);\n    Eigen::Matrix3f Rpart;\n    polar_svd3x3(Apart, Rpart);\n\n    Eigen::Matrix3f Rpart_SSE = R.block(3*k, 0, 3, 3);\n    Eigen::Matrix3f diff = Rpart - Rpart_SSE;\n    float diffNorm = diff.norm();\n    if (std::abs(diffNorm) > 0.001)\n    {\n      printf(\"Huh: diffNorm = %15f (k = %i)\\n\", diffNorm, k);\n    }\n\n    // Unused\n    //int hu = 1;\n  }\n  // eof test\n}\n#endif\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::polar_svd3x3<Eigen::Matrix<double, 3, 3, 0, 3, 3> >(Eigen::Matrix<double, 3, 3, 0, 3, 3> const&, Eigen::Matrix<double, 3, 3, 0, 3, 3>&);\ntemplate void igl::polar_svd3x3<Eigen::Matrix<float,3,3,0,3,3> >(Eigen::Matrix<float,3,3,0,3,3> const &,Eigen::Matrix<float,3,3,0,3,3> &);\n\n#ifdef __SSE__\ntemplate void igl::polar_svd3x3_sse<float>(Eigen::Matrix<float, 12, 3, 0, 12, 3> const&, Eigen::Matrix<float, 12, 3, 0, 12, 3>&);\n#endif\n\n#ifdef __AVX__\ntemplate void igl::polar_svd3x3_avx<float>(Eigen::Matrix<float, 24, 3, 0, 24, 3> const&, Eigen::Matrix<float, 24, 3, 0, 24, 3>&);\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/polar_svd3x3.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_POLAR_SVD3X3_H\n#define IGL_POLAR_SVD3X3_H\n#include <Eigen/Core>\n#include \"igl_inline.h\"\nnamespace igl\n{\n  // Computes the closest rotation to input matrix A using specialized 3x3 SVD\n  // singular value decomposition (WunderSVD3x3)\n  //\n  // Inputs:\n  //   A  3 by 3 matrix to be decomposed\n  // Outputs:\n  //   R  3 by 3 closest element in SO(3) (closeness in terms of Frobenius\n  //   metric)\n  //\n  //  This means that det(R) = 1. Technically it's not polar decomposition\n  //  which guarantees positive semidefinite stretch factor (at the cost of\n  //  having det(R) = -1). \"• The orthogonal factors U and V will be true\n  //  rotation matrices...\" [McAdams, Selle, Tamstorf, Teran, Sefakis 2011]\n  //\n  template<typename Mat>\n  IGL_INLINE void polar_svd3x3(const Mat& A, Mat& R);\n  #ifdef __SSE__\n  template<typename T>\n  IGL_INLINE void polar_svd3x3_sse(const Eigen::Matrix<T, 3*4, 3>& A, Eigen::Matrix<T, 3*4, 3> &R);\n  #endif\n  #ifdef __AVX__\n  template<typename T>\n  IGL_INLINE void polar_svd3x3_avx(const Eigen::Matrix<T, 3*8, 3>& A, Eigen::Matrix<T, 3*8, 3> &R);\n  #endif\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"polar_svd3x3.cpp\"\n#endif\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/polygon_mesh_to_triangle_mesh.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"polygon_mesh_to_triangle_mesh.h\"\n#include \"matrix_to_list.h\"\n\ntemplate <typename Index, typename DerivedF>\nIGL_INLINE void igl::polygon_mesh_to_triangle_mesh(\n  const std::vector<std::vector<Index> > & vF,\n  Eigen::PlainObjectBase<DerivedF>& F)\n{\n  using namespace std;\n  using namespace Eigen;\n  int m = 0;\n  // estimate of size\n  for(typename vector<vector<Index > >::const_iterator fit = vF.begin();\n    fit!=vF.end();\n    fit++)\n  {\n    if(fit->size() >= 3)\n    {\n      m += fit->size() - 2;\n    }\n  }\n  // Resize output\n  F.resize(m,3);\n  {\n    int k = 0;\n    for(typename vector<vector<Index > >::const_iterator fit = vF.begin();\n      fit!=vF.end();\n      fit++)\n    {\n      if(fit->size() >= 3)\n      {\n        typename vector<Index >::const_iterator cit = fit->begin();\n        cit++;\n        typename vector<Index >::const_iterator pit = cit++;\n        for(;\n          cit!=fit->end();\n          cit++,pit++)\n        {\n          F(k,0) = *(fit->begin());\n          F(k,1) = *pit;\n          F(k,2) = *cit;\n          k++;\n        }\n      }\n    }\n    assert(k==m);\n  }\n\n}\n\ntemplate <typename DerivedP, typename DerivedF>\nIGL_INLINE void igl::polygon_mesh_to_triangle_mesh(\n  const Eigen::PlainObjectBase<DerivedP>& P,\n  Eigen::PlainObjectBase<DerivedF>& F)\n{\n  std::vector<std::vector<typename DerivedP::Scalar> > vP;\n  matrix_to_list(P,vP);\n  return polygon_mesh_to_triangle_mesh(vP,F);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::polygon_mesh_to_triangle_mesh<int, Eigen::Matrix<unsigned int, -1, 3, 1, -1, 3> >(std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<unsigned int, -1, 3, 1, -1, 3> >&);\n// generated by autoexplicit.sh\ntemplate void igl::polygon_mesh_to_triangle_mesh<int, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&);\ntemplate void igl::polygon_mesh_to_triangle_mesh<int, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::polygon_mesh_to_triangle_mesh<int, Eigen::Matrix<int, -1, 3, 1, -1, 3> >(std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/polygon_mesh_to_triangle_mesh.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_POLYGON_MESH_TO_TRIANGLE_MESH_H\n#define IGL_POLYGON_MESH_TO_TRIANGLE_MESH_H\n#include \"igl_inline.h\"\n\n#ifndef IGL_NO_EIGEN\n#  include <Eigen/Core>\n#endif\n#include <vector>\n\nnamespace igl\n{\n  // Triangulate a general polygonal mesh into a triangle mesh.\n  //\n  // Inputs:\n  //   vF  list of polygon index lists\n  // Outputs:\n  //   F  eigen int matrix #F by 3\n  //\n  // Example:\n  //   vector<vector<double > > vV;\n  //   vector<vector<int > > vF;\n  //   read_triangle_mesh(\"poly.obj\",vV,vF);\n  //   MatrixXd V;\n  //   MatrixXi F;\n  //   list_to_matrix(vV,V);\n  //   triangulate(vF,F);\n  template <typename Index, typename DerivedF>\n  IGL_INLINE void polygon_mesh_to_triangle_mesh(\n    const std::vector<std::vector<Index> > & vF,\n    Eigen::PlainObjectBase<DerivedF>& F);\n  template <typename DerivedP, typename DerivedF>\n  IGL_INLINE void polygon_mesh_to_triangle_mesh(\n    const Eigen::PlainObjectBase<DerivedP>& P,\n    Eigen::PlainObjectBase<DerivedF>& F);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"polygon_mesh_to_triangle_mesh.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/polyroots.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"polyroots.h\"\n#include <Eigen/Eigenvalues>\n\ntemplate <typename S, typename T>\nIGL_INLINE void igl::polyRoots(Eigen::Matrix<S, Eigen::Dynamic,1> &polyCoeff, //real or comples coefficients\n                          Eigen::Matrix<std::complex<T>, Eigen::Dynamic,1> &roots // complex roots (double or float)\n)\n{\n  //  degree\n  int n = polyCoeff.rows() - 1;\n\n  Eigen::Matrix<S, Eigen::Dynamic, 1> d (n,1);\n  d = polyCoeff.tail(n)/polyCoeff(0);\n\n  Eigen::Matrix<S, Eigen::Dynamic, Eigen::Dynamic> I; I.setIdentity(n-1,n-1);\n  Eigen::Matrix<S, Eigen::Dynamic, 1> z; z.setZero(n-1,1);\n\n  Eigen::Matrix<S, Eigen::Dynamic, Eigen::Dynamic> a(n,n);\n  a<<-d.transpose(),I,z;\n  roots = a.eigenvalues();\n\n}\n\n\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::polyRoots<std::complex<double>, double>(Eigen::Matrix<std::complex<double>, -1, 1, 0, -1, 1>&, Eigen::Matrix<std::complex<double>, -1, 1, 0, -1, 1>&);\ntemplate void igl::polyRoots<double, double>(Eigen::Matrix<double, -1, 1, 0, -1, 1>&, Eigen::Matrix<std::complex<double>, -1, 1, 0, -1, 1>&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/polyroots.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_POLYROOTS\n#define IGL_POLYROOTS\n#include \"igl_inline.h\"\n\n#include <Eigen/Core>\n\nnamespace igl {\n  //todo\n  /// Given 2 vectors centered on origin calculate the rotation matrix from first to the second\n\n  // Inputs:\n  //   v0, v1         the two #3 by 1 vectors\n  //   normalized     boolean, if false, then the vectors are normalized prior to the calculation\n  // Output:\n  //                  3 by 3 rotation matrix that takes v0 to v1\n  //\n  template <typename S, typename T>\n  IGL_INLINE void polyRoots(Eigen::Matrix<S, Eigen::Dynamic,1> &polyCoeff, //real or comples coefficients\n                            Eigen::Matrix<std::complex<T>, Eigen::Dynamic,1> &roots // complex roots (double or float)\n                            );\n}\n\n\n#ifndef IGL_STATIC_LIBRARY\n#include \"polyroots.cpp\"\n#endif\n\n\n#endif /* defined(IGL_NCHOOSEK) */\n"
  },
  {
    "path": "libs/libigl/include/igl/polyvector_field_comb_from_matchings_and_cuts.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include <igl/colon.h>\n#include <algorithm>\n#include <deque>\n#include <igl/polyvector_field_comb_from_matchings_and_cuts.h>\n#include <igl/edge_topology.h>\n#include <igl/triangle_triangle_adjacency.h>\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedTT, typename DerivedS, typename DerivedM, typename DerivedC>\nIGL_INLINE void igl::polyvector_field_comb_from_matchings_and_cuts(\n  const Eigen::PlainObjectBase<DerivedV> &V,\n  const Eigen::PlainObjectBase<DerivedF> &F,\n  const Eigen::PlainObjectBase<DerivedTT> &TT,\n  const Eigen::MatrixXi &E2F,\n  const Eigen::MatrixXi &F2E,\n  const Eigen::PlainObjectBase<DerivedS> &sol3D,\n  const Eigen::PlainObjectBase<DerivedM> &match_ab,\n  const Eigen::PlainObjectBase<DerivedM> &match_ba,\n  const Eigen::PlainObjectBase<DerivedC> &cuts,\n  Eigen::PlainObjectBase<DerivedS> &sol3D_combed)\n{\n\n  int half_degree = sol3D.cols()/3;\n  int full_degree = 2*half_degree;\n\n  Eigen::MatrixXi used; used.setConstant(F.rows(),half_degree,-1);\n\n  //  Eigen::VectorXi mark;\n  std::deque<int> d;\n  sol3D_combed.setZero(sol3D.rows(), sol3D.cols());\n\n  int start = 0;\n  d.push_back(start);\n  used.row(start) = igl::colon<int>(0, half_degree-1);\n  sol3D_combed.row(start) = sol3D.row(start);\n  while (!d.empty())\n  {\n    int f0 = d.at(0);\n    d.pop_front();\n    for (int k=0; k<3; k++)\n    {\n      int f1 = TT(f0,k);\n      if (f1==-1) continue;\n      //do not comb across cuts\n      if ((used.row(f1).array()!=-1).any()||cuts(f0,k))\n        continue;\n\n\n      // look at the edge between the two faces\n      const int &current_edge = F2E(f0,k);\n\n      // check its orientation to determine whether match_ab or match_ba should be used\n      if ((E2F(current_edge,0) == f0) &&\n          (E2F(current_edge,1) == f1) )\n      {\n        //look at match_ab\n        for(int i=0; i<half_degree; ++i)\n        {\n          int ii = used(f0,i);\n          used(f1,i) = (match_ab(current_edge,ii%half_degree) + (ii>=half_degree)*half_degree)%full_degree;\n        }\n      }\n      else\n      {\n        assert((E2F(current_edge,1) == f0) &&\n               (E2F(current_edge,0) == f1));\n        //look at match_ba\n        for(int i=0; i<half_degree; ++i)\n        {\n          int ii = used(f0,i);\n          used(f1,i) = (match_ba(current_edge,ii%half_degree)+ (ii>=half_degree)*half_degree)%full_degree;\n        }\n      }\n\n      for (int i = 0; i<half_degree; ++i)\n      {\n        int sign = (used(f1,i)<half_degree)?1:-1;\n        sol3D_combed.block(f1,i*3,1,3) = sign*sol3D.block(f1,(used(f1,i)%half_degree)*3,1,3);\n      }\n      d.push_back(f1);\n    }\n  }\n\n  // everything should be marked\n  assert((used.rowwise().minCoeff().array()>=0).all());\n}\n\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedS, typename DerivedM, typename DerivedC>\nIGL_INLINE void igl::polyvector_field_comb_from_matchings_and_cuts(\n  const Eigen::PlainObjectBase<DerivedV> &V,\n  const Eigen::PlainObjectBase<DerivedF> &F,\n  const Eigen::PlainObjectBase<DerivedS> &sol3D,\n  const Eigen::PlainObjectBase<DerivedM> &match_ab,\n  const Eigen::PlainObjectBase<DerivedM> &match_ba,\n  const Eigen::PlainObjectBase<DerivedC> &cuts,\n  Eigen::PlainObjectBase<DerivedS> &sol3D_combed)\n  {\n    Eigen::MatrixXi TT, TTi;\n    igl::triangle_triangle_adjacency(F,TT,TTi);\n\n    Eigen::MatrixXi E, E2F, F2E;\n    igl::edge_topology(V,F,E,F2E,E2F);\n\n    igl::polyvector_field_comb_from_matchings_and_cuts(V, F, TT, E2F, F2E, sol3D, match_ab, match_ba, cuts, sol3D_combed);\n  }\n\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::polyvector_field_comb_from_matchings_and_cuts<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::polyvector_field_comb_from_matchings_and_cuts<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/polyvector_field_comb_from_matchings_and_cuts.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2015 Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_POLYVECTOR_FIELD_COMB_FROM_MATCHINGS_AND_CUTS\n#define IGL_POLYVECTOR_FIELD_COMB_FROM_MATCHINGS_AND_CUTS\n#include \"igl_inline.h\"\n\n#include <Eigen/Core>\n#include <vector>\n\nnamespace igl {\n  // Given an mesh, an N- polyvector field with given matchings between\n  // the vector sets across interior edges, and corresponding mesh cuts,\n  // compute a \"combed\" polyvector field, i.e.\n  // separate the vector set field into N vector fields, where the separation is defined\n  // by the matchings. The cuts have previously been generated based on the field\n  // singularities, see igl::polyvector_field_cut_mesh_with_singularities.\n  // Inputs:\n  //   V                #V by 3 list of the vertex positions\n  //   F                #F by 3 list of the faces (must be triangles)\n  //   TT               #F by 3 triangle to triangle adjacent matrix (e.g. computed\n  //                    via igl:triangle_triangle_adjacency).\n  //   E2F              #E by 2 list of the edge-to-face relation (e.g. computed\n  //                    via igl::edge_topology)\n  //   F2E              #F by 3 list of the face-to-edge relation (e.g. computed\n  //                    via igl::edge_topology)\n  //   sol3D            #F by 3n list of the 3D coordinates of the per-face vectors of the input vector set field\n  //                    (stacked horizontally for each triangle). Vector #1 in one face does not necessarily match\n  //                    vector #1 in the adjacent face.\n  //   match_ab         #E by N matrix, describing for each edge the matching a->b, where a\n  //                    and b are the faces adjacent to the edge (i.e. vector #i of\n  //                    the vector set in a is matched to vector #mab[i] in b)\n  //   match_ba         #E by N matrix, describing for each edge the matching b->a, where a\n  //                    and b are the faces adjacent to the edge (i.e. vector #mba[i] of\n  //                    the vector set in a is matched to vector #i in b)\n  //   cuts             #F by 3 list of boolean flags, indicating the edges that need to be cut\n  // Outputs:\n  //   sol3D_combed     #F by 3n list of the 3D coordinates of the per-face vectors of the combed vector set field\n  //                    (stacked horizontally for each triangle). Vector #1 in one face will match vector #1 in\n  //                    the adjacent face.\n  //\n  template <typename DerivedV, typename DerivedF, typename DerivedTT, typename DerivedS, typename DerivedM, typename DerivedC>\n  IGL_INLINE void polyvector_field_comb_from_matchings_and_cuts(\n                                                                const Eigen::PlainObjectBase<DerivedV> &V,\n                                                                const Eigen::PlainObjectBase<DerivedF> &F,\n                                                                const Eigen::PlainObjectBase<DerivedTT> &TT,\n                                                                const Eigen::MatrixXi &E2F,\n                                                                const Eigen::MatrixXi &F2E,\n                                                                const Eigen::PlainObjectBase<DerivedS> &sol3D,\n                                                                const Eigen::PlainObjectBase<DerivedM> &match_ab,\n                                                                const Eigen::PlainObjectBase<DerivedM> &match_ba,\n                                                                const Eigen::PlainObjectBase<DerivedC> &cuts,\n                                                                Eigen::PlainObjectBase<DerivedS> &sol3D_combed);\n  \n  //Wrapper with only the mesh as input\n  template <typename DerivedV, typename DerivedF, typename DerivedS, typename DerivedM, typename DerivedC>\n  IGL_INLINE void polyvector_field_comb_from_matchings_and_cuts(\n                                                                const Eigen::PlainObjectBase<DerivedV> &V,\n                                                                const Eigen::PlainObjectBase<DerivedF> &F,\n                                                                const Eigen::PlainObjectBase<DerivedS> &sol3D,\n                                                                const Eigen::PlainObjectBase<DerivedM> &match_ab,\n                                                                const Eigen::PlainObjectBase<DerivedM> &match_ba,\n                                                                const Eigen::PlainObjectBase<DerivedC> &cuts,\n                                                                Eigen::PlainObjectBase<DerivedS> &sol3D_combed);\n};\n\n\n#ifndef IGL_STATIC_LIBRARY\n#include \"polyvector_field_comb_from_matchings_and_cuts.cpp\"\n#endif\n\n\n#endif /* defined(IGL_POLYVECTOR_FIELD_COMB_FROM_MATCHINGS_AND_CUTS) */\n"
  },
  {
    "path": "libs/libigl/include/igl/polyvector_field_cut_mesh_with_singularities.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include <igl/polyvector_field_cut_mesh_with_singularities.h>\n#include <igl/dijkstra.h>\n#include <igl/vertex_triangle_adjacency.h>\n#include <igl/adjacency_list.h>\n#include <igl/triangle_triangle_adjacency.h>\n#include <igl/is_border_vertex.h>\n#include <igl/cut_mesh_from_singularities.h>\n#include <set>\n\n\ntemplate <typename DerivedV, typename DerivedF, typename VFType, typename VVType, typename DerivedTT, typename DerivedC, typename DerivedS>\nIGL_INLINE void igl::polyvector_field_cut_mesh_with_singularities(\n                                                                  const Eigen::PlainObjectBase<DerivedV> &V,\n                                                                  const Eigen::PlainObjectBase<DerivedF> &F,\n                                                                  const std::vector<std::vector<VFType> >& VF,\n                                                                  const std::vector<std::vector<VVType> >& VV,\n                                                                  const Eigen::PlainObjectBase<DerivedTT>& TT,\n                                                                  const Eigen::PlainObjectBase<DerivedTT>& TTi,\n                                                                  const Eigen::PlainObjectBase<DerivedS> &singularities,\n                                                                  Eigen::PlainObjectBase<DerivedC> &cuts)\n{\n\n  //first, get a spanning tree for the mesh (no missmatch needed)\n  igl::cut_mesh_from_singularities(V, F, Eigen::MatrixXd::Zero(F.rows(), 3).eval(), cuts);\n\n  std::set<int> vertices_in_cut;\n  for (int i =0; i< cuts.rows(); ++i)\n    for (int j =0;j< cuts.cols(); ++j)\n      if (cuts(i,j))\n        vertices_in_cut.insert(F(i,j));\n\n  //then, add all singularities one by one by using Dijkstra's algorithm\n  for (int i = 0; i<singularities.rows(); ++i)\n  {\n    std::vector<int> path;\n    Eigen::VectorXd min_distance;\n    Eigen::VectorXi previous;\n    int vertex_found = igl::dijkstra_compute_paths(singularities[i], vertices_in_cut, VV, min_distance, previous);\n    if(vertex_found ==-1)\n      // this means that there are no cuts\n      path.push_back(singularities[i]);\n    else\n      igl::dijkstra_get_shortest_path_to(vertex_found, previous, path);\n\n    vertices_in_cut.insert(path.begin(), path.end());\n\n    //insert to cut\n    for (int ii = 0; ii<path.size()-1; ++ii)\n    {\n      const int &v0 = path[ii];\n      const int &v1 = path[ii+1];\n\n      std::vector<int> vf0 = VF[v0];\n      std::sort(vf0.begin(), vf0.end());\n      std::vector<int> vf1 = VF[v1];\n      std::sort(vf1.begin(), vf1.end());\n      std::vector<int> common_face_v(std::max(vf0.size(),vf1.size()));\n      std::vector<int>::iterator it;\n      it=std::set_intersection (vf0.begin(), vf0.end(), vf1.begin(), vf1.end(), common_face_v.begin());\n      common_face_v.resize(it-common_face_v.begin());\n      assert(common_face_v.size() == 2);\n\n      const int &fi = common_face_v[0];\n      int j=-1;\n      for (unsigned z=0; z<3; ++z)\n        if (((F(fi,z) == v0) && (F(fi,(z+1)%3) == v1)) ||((F(fi,z) == v1) && (F(fi,(z+1)%3) == v0)))\n          j=z;\n      assert(j!=-1);\n      cuts(fi,j) = 1;\n      cuts(TT(fi,j), TTi(fi,j)) = 1;\n\n    }\n  }\n\n}\n\n\n//Wrapper of the above with only vertices and faces as mesh input\ntemplate <typename DerivedV, typename DerivedF, typename DerivedC, typename DerivedS>\nIGL_INLINE void igl::polyvector_field_cut_mesh_with_singularities(\n                                                                  const Eigen::PlainObjectBase<DerivedV> &V,\n                                                                  const Eigen::PlainObjectBase<DerivedF> &F,\n                                                                  const Eigen::PlainObjectBase<DerivedS> &singularities,\n                                                                  Eigen::PlainObjectBase<DerivedC> &cuts)\n{\n\n  std::vector<std::vector<int> > VF, VFi;\n  igl::vertex_triangle_adjacency(V,F,VF,VFi);\n\n  std::vector<std::vector<int> > VV;\n  igl::adjacency_list(F, VV);\n\n  Eigen::MatrixXi TT, TTi;\n  igl::triangle_triangle_adjacency(F,TT,TTi);\n\n  igl::polyvector_field_cut_mesh_with_singularities(V, F, VF, VV, TT, TTi, singularities, cuts);\n\n\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::polyvector_field_cut_mesh_with_singularities<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, int, int, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::polyvector_field_cut_mesh_with_singularities<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/polyvector_field_cut_mesh_with_singularities.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2015 Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_POLYVECTOR_FIELD_CUT_MESH_WITH_SINGULARITIES\n#define IGL_POLYVECTOR_FIELD_CUT_MESH_WITH_SINGULARITIES\n#include \"igl_inline.h\"\n\n#include <Eigen/Core>\n#include <vector>\n\nnamespace igl {\n  // Given a mesh and the singularities of a polyvector field, cut the mesh\n  // to disk topology in such a way that the singularities lie at the boundary of\n  // the disk, as described in the paper \"Mixed Integer Quadrangulation\" by\n  // Bommes et al. 2009.\n  // Inputs:\n  //   V                #V by 3 list of the vertex positions\n  //   F                #F by 3 list of the faces (must be triangles)\n  //   VF               #V list of lists of incident faces (adjacency list), e.g.\n  //                    as returned by igl::vertex_triangle_adjacency\n  //   VV               #V list of lists of incident vertices (adjacency list), e.g.\n  //                    as returned by igl::adjacency_list\n  //   TT               #F by 3 triangle to triangle adjacent matrix (e.g. computed\n  //                    via igl:triangle_triangle_adjacency)\n  //   TTi              #F by 3 adjacent matrix, the element i,j is the id of edge of the\n  //                    triangle TT(i,j) that is adjacent with triangle i (e.g. computed\n  //                    via igl:triangle_triangle_adjacency)\n  //   singularities    #S by 1 list of the indices of the singular vertices\n  // Outputs:\n  //   cuts             #F by 3 list of boolean flags, indicating the edges that need to be cut\n  //                    (has 1 at the face edges that are to be cut, 0 otherwise)\n  //\n  template <typename DerivedV, typename DerivedF, typename VFType, typename VVType, typename DerivedTT, typename DerivedC, typename DerivedS>\n  IGL_INLINE void polyvector_field_cut_mesh_with_singularities(\n                                                               const Eigen::PlainObjectBase<DerivedV> &V,\n                                                               const Eigen::PlainObjectBase<DerivedF> &F,\n                                                               const std::vector<std::vector<VFType> >& VF,\n                                                               const std::vector<std::vector<VVType> >& VV,\n                                                               const Eigen::PlainObjectBase<DerivedTT>& TT,\n                                                               const Eigen::PlainObjectBase<DerivedTT>& TTi,\n                                                               const Eigen::PlainObjectBase<DerivedS> &singularities,\n                                                               Eigen::PlainObjectBase<DerivedC> &cuts);\n  \n  \n  //Wrapper of the above with only vertices and faces as mesh input\n  template <typename DerivedV, typename DerivedF, typename DerivedC, typename DerivedS>\n  IGL_INLINE void polyvector_field_cut_mesh_with_singularities(\n                                                               const Eigen::PlainObjectBase<DerivedV> &V,\n                                                               const Eigen::PlainObjectBase<DerivedF> &F,\n                                                               const Eigen::PlainObjectBase<DerivedS> &singularities,\n                                                               Eigen::PlainObjectBase<DerivedC> &cuts);\n  \n};\n\n\n#ifndef IGL_STATIC_LIBRARY\n#include \"polyvector_field_cut_mesh_with_singularities.cpp\"\n#endif\n\n\n#endif /* defined(IGL_POLYVECTOR_FIELD_CUT_MESH_WITH_SINGULARITIES) */\n"
  },
  {
    "path": "libs/libigl/include/igl/polyvector_field_matchings.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include <igl/polyvector_field_matchings.h>\n#include <igl/edge_topology.h>\n#include <igl/per_face_normals.h>\n#include <igl/sort_vectors_ccw.h>\n#include <igl/rotation_matrix_from_directions.h>\n\ntemplate <typename DerivedS, typename DerivedV, typename DerivedM>\nIGL_INLINE void igl::polyvector_field_matching(\n                                               const Eigen::PlainObjectBase<DerivedS>& _ua,\n                                               const Eigen::PlainObjectBase<DerivedS>& _ub,\n                                               const Eigen::PlainObjectBase<DerivedV>& na,\n                                               const Eigen::PlainObjectBase<DerivedV>& nb,\n                                               const Eigen::PlainObjectBase<DerivedV>& e,\n                                               bool match_with_curl,\n                                               Eigen::PlainObjectBase<DerivedM>& mab,\n                                               Eigen::PlainObjectBase<DerivedM>& mba,\n                                               bool is_symmetric)\n{\n  // make sure the matching preserve ccw order of the vectors across the edge\n  // 1) order vectors in a, ccw  e.g. (0,1,2,3)_a not ccw --> (0,3,2,1)_a ccw\n  // 2) order vectors in b, ccw  e.g. (0,1,2,3)_b not ccw --> (0,2,1,3)_b ccw\n  // 3) the vectors in b that match the ordered vectors in a (in this case  (0,3,2,1)_a ) must be a circular shift of the ccw ordered vectors in b  - so we need to explicitely check only these matchings to find the best ccw one, there are N of them\n  int hN = _ua.cols()/3;\n  int N;\n  if (is_symmetric)\n    N = 2*hN;\n  else\n    N = hN;\n\n  Eigen::Matrix<typename DerivedS::Scalar,1,Eigen::Dynamic> ua (1,N*3);\n  Eigen::Matrix<typename DerivedS::Scalar,1,Eigen::Dynamic> ub (1,N*3);\n  if (is_symmetric)\n  {\n    ua <<_ua, -_ua;\n    ub <<_ub, -_ub;\n  }\n  else\n  {\n    ua =_ua;\n    ub =_ub;\n  }\n\n  Eigen::Matrix<typename DerivedM::Scalar,Eigen::Dynamic,1> order_a, order_b;\n  igl::sort_vectors_ccw(ua, na, order_a);\n  igl::sort_vectors_ccw(ub, nb, order_b);\n\n  //checking all possible circshifts of order_b as matches for order_a\n  Eigen::Matrix<typename DerivedM::Scalar,Eigen::Dynamic,Eigen::Dynamic> all_matches(N,N);\n  Eigen::Matrix<typename DerivedS::Scalar,1,Eigen::Dynamic> all_scores(1,N);\n  for (int s =0; s< N; ++s)\n  {\n    all_matches.row(s) = order_b;\n    typename DerivedS::Scalar current_score=0;\n    for (int i=0; i< N; ++i)\n    {\n      if (match_with_curl)\n        current_score += fabs(ua.segment(order_a[i]*3, 3).dot(e) - ub.segment(order_b[i]*3, 3).dot(e));\n      else\n      {\n        Eigen::Matrix<typename DerivedS::Scalar,3,1> na_ = na.transpose();\n        Eigen::Matrix<typename DerivedS::Scalar,3,1> nb_ = nb.transpose();\n\n        Eigen::Matrix<typename DerivedS::Scalar,1,3> uaRot = igl::rotation_matrix_from_directions(na_, nb_)*ua.segment(order_a[i]*3, 3).transpose();\n        current_score += (uaRot-ub.segment(order_b[i]*3, 3)).norm();\n      }\n    }\n    all_scores[s] = current_score;\n    // do a circshift on order_b to check the next preserving matching\n    int temp = order_b[0];\n    for (int i =0; i< N-1; ++i)\n      order_b[i] = order_b[i+1];\n    order_b(N-1) = temp;\n  }\n  Eigen::Matrix<typename DerivedM::Scalar,1,Eigen::Dynamic> best_matching_for_sorted_a;\n  int best_i;\n  all_scores.minCoeff(&best_i);\n  best_matching_for_sorted_a = all_matches.row(best_i);\n  // best_matching_for_sorted_a is the matching for the sorted vectors in a\n  // get the matching for the initial (unsorted) vectors\n  mab.resize(1,N);\n  for (int i=0; i< N; ++i)\n    mab[order_a[i]] = best_matching_for_sorted_a[i];\n\n  //mab contains the best matching a->b, get the opposite too\n  mba.resize(1, N);\n  for (int i=0; i< N; ++i)\n    mba[mab[i]] = i;\n\n  if (is_symmetric)\n  {\n  mab = mab.head(hN);\n  mba = mba.head(hN);\n}\n}\n\n\ntemplate <typename DerivedS, typename DerivedV, typename DerivedF, typename DerivedE, typename DerivedM>\nIGL_INLINE void igl::polyvector_field_matchings(\n                                                                     const Eigen::PlainObjectBase<DerivedS>& sol3D,\n                                                                     const Eigen::PlainObjectBase<DerivedV>&V,\n                                                                     const Eigen::PlainObjectBase<DerivedF>&F,\n                                                                     const Eigen::PlainObjectBase<DerivedE>&E,\n                                                                     const Eigen::PlainObjectBase<DerivedV>& FN,\n                                                                     const Eigen::MatrixXi &E2F,\n                                                                     bool match_with_curl,\n                                                bool is_symmetric,\n                                                                     Eigen::PlainObjectBase<DerivedM>& match_ab,\n                                                Eigen::PlainObjectBase<DerivedM>& match_ba)\n{\n  int numEdges = E.rows();\n  int half_degree = sol3D.cols()/3;\n\n  Eigen::VectorXi isBorderEdge;\n  isBorderEdge.setZero(numEdges,1);\n  for(unsigned i=0; i<numEdges; ++i)\n  {\n    if ((E2F(i,0) == -1) || ((E2F(i,1) == -1)))\n      isBorderEdge[i] = 1;\n  }\n\n  match_ab.setZero(numEdges, half_degree);\n  match_ba.setZero(numEdges, half_degree);\n\n  for (int ei=0; ei<numEdges; ++ei)\n  {\n    if (isBorderEdge[ei])\n      continue;\n    // the two faces of the flap\n    int a = E2F(ei,0);\n    int b = E2F(ei,1);\n\n    Eigen::Matrix<typename DerivedV::Scalar, 1, Eigen::Dynamic> ce = (V.row(E(ei,1))-V.row(E(ei,0))).normalized().template cast<typename DerivedV::Scalar>();\n\n    Eigen::Matrix<typename DerivedM::Scalar, 1, Eigen::Dynamic> mab, mba;\n    igl::polyvector_field_matching(sol3D.row(a).eval(),\n                                   sol3D.row(b).eval(),\n                                   FN.row(a).eval(),\n                                   FN.row(b).eval(),\n                                   ce,\n                                   match_with_curl,\n                                   mab,\n                                   mba,\n                                   is_symmetric);\n\n    match_ab.row(ei) = mab;\n    match_ba.row(ei) = mba;\n  }\n}\n\n\ntemplate <typename DerivedS, typename DerivedV, typename DerivedF, typename DerivedE, typename DerivedM, typename DerivedC>\nIGL_INLINE typename DerivedC::Scalar igl::polyvector_field_matchings(\n                                                                     const Eigen::PlainObjectBase<DerivedS>& sol3D,\n                                                                     const Eigen::PlainObjectBase<DerivedV>&V,\n                                                                     const Eigen::PlainObjectBase<DerivedF>&F,\n                                                                     const Eigen::PlainObjectBase<DerivedE>&E,\n                                                                     const Eigen::PlainObjectBase<DerivedV>& FN,\n                                                                     const Eigen::MatrixXi &E2F,\n                                                                     bool match_with_curl,\n                                                                     bool is_symmetric,\n                                                                     Eigen::PlainObjectBase<DerivedM>& match_ab,\n                                                                     Eigen::PlainObjectBase<DerivedM>& match_ba,\n                                                                     Eigen::PlainObjectBase<DerivedC>& curl)\n{\n  int numEdges = E.rows();\n  int half_degree = sol3D.cols()/3;\n\n  Eigen::VectorXi isBorderEdge;\n  isBorderEdge.setZero(numEdges,1);\n  for(unsigned i=0; i<numEdges; ++i)\n  {\n    if ((E2F(i,0) == -1) || ((E2F(i,1) == -1)))\n      isBorderEdge[i] = 1;\n  }\n\n  igl::polyvector_field_matchings(sol3D, V, F, E, FN, E2F, match_with_curl, is_symmetric, match_ab, match_ba);\n  curl.setZero(numEdges,1);\n  typename DerivedC::Scalar meanCurl = 0;\n  for (int ei=0; ei<numEdges; ++ei)\n  {\n    if (isBorderEdge[ei])\n      continue;\n    // the two faces of the flap\n    int a = E2F(ei,0);\n    int b = E2F(ei,1);\n\n    const Eigen::Matrix<typename DerivedM::Scalar, 1, Eigen::Dynamic> &mab = match_ab.row(ei);\n    const Eigen::Matrix<typename DerivedM::Scalar, 1, Eigen::Dynamic> &mba = match_ba.row(ei);\n\n    Eigen::Matrix<typename DerivedS::Scalar, 1, Eigen::Dynamic> matched;\n    matched.resize(1, 3*half_degree);\n    for (int i = 0; i<half_degree; ++i)\n    {\n      int sign = 1;\n      int m = mab[i];\n      if (is_symmetric)\n      {\n        sign = (mab[i]<half_degree)?1:-1;\n        m = m%half_degree;\n    }\n      matched.segment(i*3, 3) = sign*sol3D.row(b).segment(m*3, 3);\n    }\n\n    Eigen::Matrix<typename DerivedV::Scalar, 1, Eigen::Dynamic> ce = (V.row(E(ei,1))-V.row(E(ei,0))).normalized().template cast<typename DerivedV::Scalar>();\n    typename DerivedC::Scalar avgCurl = 0;\n    for (int i = 0; i<half_degree; ++i)\n      avgCurl += fabs(sol3D.row(a).segment(i*3, 3).dot(ce) - matched.segment(i*3, 3).dot(ce));\n\n    avgCurl = avgCurl/half_degree;\n\n\n    curl[ ei ] = avgCurl;\n\n    meanCurl+= avgCurl;\n\n  }\n\n  meanCurl /= 1.*(numEdges - isBorderEdge.sum());\n  return meanCurl;\n}\n\ntemplate <typename DerivedS, typename DerivedV, typename DerivedF, typename DerivedM, typename DerivedC>\nIGL_INLINE typename DerivedC::Scalar igl::polyvector_field_matchings(\n                                                                     const Eigen::PlainObjectBase<DerivedS>& sol3D,\n                                                                     const Eigen::PlainObjectBase<DerivedV>&V,\n                                                                     const Eigen::PlainObjectBase<DerivedF>&F,\n                                                                     bool match_with_curl,\n                                                                     bool is_symmetric,\n                                                                     Eigen::PlainObjectBase<DerivedM>& match_ab,\n                                                                     Eigen::PlainObjectBase<DerivedM>& match_ba,\n                                                                     Eigen::PlainObjectBase<DerivedC>& curl)\n{\n  Eigen::MatrixXi E, E2F, F2E;\n  igl::edge_topology(V,F,E,F2E,E2F);\n\n//#warning \"Poor templating of igl::polyvector_field_matchings forces FN to be DerivedV (this could cause issues if DerivedV has fixed number of rows)\"\n  DerivedV FN;\n  igl::per_face_normals(V,F,FN);\n\n  return igl::polyvector_field_matchings(sol3D, V, F, E, FN, E2F, match_with_curl, is_symmetric, match_ab, match_ba, curl);\n}\n\ntemplate <typename DerivedS, typename DerivedV, typename DerivedF, typename DerivedM>\nIGL_INLINE void igl::polyvector_field_matchings(\n                                                const Eigen::PlainObjectBase<DerivedS>& sol3D,\n                                                const Eigen::PlainObjectBase<DerivedV>&V,\n                                                const Eigen::PlainObjectBase<DerivedF>&F,\n                                                bool match_with_curl,\n                                                bool is_symmetric,\n                                                Eigen::PlainObjectBase<DerivedM>& match_ab,\n                                                Eigen::PlainObjectBase<DerivedM>& match_ba)\n{\n  Eigen::MatrixXi E, E2F, F2E;\n  igl::edge_topology(V,F,E,F2E,E2F);\n\n  DerivedV FN;\n  igl::per_face_normals(V,F,FN);\n\n  igl::polyvector_field_matchings(sol3D, V, F, E, FN, E2F, match_with_curl, is_symmetric, match_ab, match_ba);\n}\n\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::polyvector_field_matchings<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, bool, bool, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate Eigen::Matrix<double, -1, 1, 0, -1, 1>::Scalar igl::polyvector_field_matchings<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, bool, bool, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/polyvector_field_matchings.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2015 Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_POLYVECTOR_FIELD_MATCHINGS\n#define IGL_POLYVECTOR_FIELD_MATCHINGS\n#include \"igl_inline.h\"\n\n#include <Eigen/Core>\n#include <vector>\n\nnamespace igl {\n  // Given a pair of adjacent faces a and b, and a set of N unordered vectors\n  // of a vector set defined on each face, the function computes the best order-preserving\n  // matching between them, where \"best\" means \"minimum curl\", or \"smoothest\".\n  // Inputs:\n  //   _ua              1 by 3N row vector of the vectors on face a, stacked horizontally\n  //   _ub              1 by 3N row vector of the vectors on face b, stacked horizontally\n  //   na               1 by 3, normal of face a\n  //   nb               1 by 3, normal of face b\n  //   e                1 by 3, the vector corresponding to the shared edge between a and b\n  //   match_with_curl  boolean flag, determines whether a curl or a smoothness matching will\n  //                    be computed\n  //   is_symmetric     boolean flag, determines whether the input vector set field is symmetric(\n  //                    =consists of pairwise collinear vectors in each set, in which case only one\n  //                    of the vectors in the pair is stored) or not, i.e. the set contains all the vectors\n  // )\n  // Outputs:\n  //   mab              1 by N row vector, describing the matching a->b (i.e. vector #i of the\n  //                    vector set in a is matched to vector #mab[i] in b)\n  //   mba              1 by N row vector, describing the matching b->a (i.e. vector #mba[i]\n  //                    of the vector set in a is matched to vector #i in b)\n  //\n  template <typename DerivedS, typename DerivedV, typename DerivedM>\n  IGL_INLINE void polyvector_field_matching(\n                                            const Eigen::PlainObjectBase<DerivedS>& _ua,\n                                            const Eigen::PlainObjectBase<DerivedS>& _ub,\n                                            const Eigen::PlainObjectBase<DerivedV>& na,\n                                            const Eigen::PlainObjectBase<DerivedV>& nb,\n                                            const Eigen::PlainObjectBase<DerivedV>& e,\n                                            bool match_with_curl,\n                                            Eigen::PlainObjectBase<DerivedM>& mab,\n                                            Eigen::PlainObjectBase<DerivedM>& mba,\n                                            bool is_symmetric);\n\n\n  // Given a mesh and a vector set field consisting of unordered N-vector sets defined\n  // on the faces of the mesh, the function computes, for each (non-boundary) edge\n  // the best order-preserving matching between the vector sets of the faces across\n  // the edge, where \"best\" means to \"with minimum curl\", or \"smoothest\"\n  // Inputs:\n  //   sol3D            #F by 3n list of the 3D coordinates of the per-face vectors\n  //                    (stacked horizontally for each triangle)\n  //   V                #V by 3 list of mesh vertex coordinates\n  //   F                #F by 3 list of mesh faces\n  //   E                #E by 2 list of mesh edges (pairs of vertex indices)\n  //   FN               #F by 3 list of face normals\n  //   E2F              #E by 2 list of the edge-to-face relation (e.g. computed\n  //                    via igl::edge_topology)\n  //   match_with_curl  boolean flag, determines whether curl or smoothness matchings will\n  //                    be computed\n  //   is_symmetric     boolean flag, determines whether the input vector set field is symmetric(\n  //                    =consists of pairwise collinear vectors in each set, in which case only one\n  //                    of the vectors in the pair is stored) or not, i.e. the set contains all the vectors\n  // Outputs:\n  //   match_ab         #E by N matrix, describing for each edge the matching a->b, where a\n  //                    and b are the faces adjacent to the edge (i.e. vector #i of\n  //                    the vector set in a is matched to vector #mab[i] in b)\n  //   match_ba         #E by N matrix, describing for each edge the matching b->a, where a\n  //                    and b are the faces adjacent to the edge (i.e. vector #mba[i] of\n  //                    the vector set in a is matched to vector #i in b)\n  //   curl             the per-edge curl of the matchings (zero for boundary edges)\n  // Returns:\n  //   meanCurl         the average of the per-edge curl values (only non-boundary edges are counted)\n  //\n  template <typename DerivedS, typename DerivedV, typename DerivedF, typename DerivedE, typename DerivedM, typename DerivedC>\n  IGL_INLINE typename DerivedC::Scalar polyvector_field_matchings(\n                                                                  const Eigen::PlainObjectBase<DerivedS>& sol3D,\n                                                                  const Eigen::PlainObjectBase<DerivedV>&V,\n                                                                  const Eigen::PlainObjectBase<DerivedF>&F,\n                                                                  const Eigen::PlainObjectBase<DerivedE>&E,\n                                                                  const Eigen::PlainObjectBase<DerivedV>& FN,\n                                                                  const Eigen::MatrixXi &E2F,\n                                                                  bool match_with_curl,\n                                                                  bool is_symmetric,\n                                                                  Eigen::PlainObjectBase<DerivedM>& match_ab,\n                                                                  Eigen::PlainObjectBase<DerivedM>& match_ba,\n                                                                  Eigen::PlainObjectBase<DerivedC>& curl);\n\n\n  //Wrapper of the above with only vertices and faces as mesh input\n  template <typename DerivedS, typename DerivedV, typename DerivedF, typename DerivedM, typename DerivedC>\n  IGL_INLINE typename DerivedC::Scalar polyvector_field_matchings(\n                                                                  const Eigen::PlainObjectBase<DerivedS>& sol3D,\n                                                                  const Eigen::PlainObjectBase<DerivedV>&V,\n                                                                  const Eigen::PlainObjectBase<DerivedF>&F,\n                                                                  bool match_with_curl,\n                                                                  bool is_symmetric,\n                                                                  Eigen::PlainObjectBase<DerivedM>& match_ab,\n                                                                  Eigen::PlainObjectBase<DerivedM>& match_ba,\n                                                                  Eigen::PlainObjectBase<DerivedC>& curl);\n\n  //Wrappers with no curl output\n  template <typename DerivedS, typename DerivedV, typename DerivedF, typename DerivedM>\n  IGL_INLINE void polyvector_field_matchings(\n                                             const Eigen::PlainObjectBase<DerivedS>& sol3D,\n                                             const Eigen::PlainObjectBase<DerivedV>&V,\n                                             const Eigen::PlainObjectBase<DerivedF>&F,\n                                             bool match_with_curl,\n                                             bool is_symmetric,\n                                             Eigen::PlainObjectBase<DerivedM>& match_ab,\n                                             Eigen::PlainObjectBase<DerivedM>& match_ba);\n  template <typename DerivedS, typename DerivedV, typename DerivedF, typename DerivedE, typename DerivedM>\n  IGL_INLINE void polyvector_field_matchings(\n                                             const Eigen::PlainObjectBase<DerivedS>& sol3D,\n                                             const Eigen::PlainObjectBase<DerivedV>&V,\n                                             const Eigen::PlainObjectBase<DerivedF>&F,\n                                             const Eigen::PlainObjectBase<DerivedE>&E,\n                                             const Eigen::PlainObjectBase<DerivedV>& FN,\n                                             const Eigen::MatrixXi &E2F,\n                                             bool match_with_curl,\n                                             bool is_symmetric,\n                                             Eigen::PlainObjectBase<DerivedM>& match_ab,\n                                             Eigen::PlainObjectBase<DerivedM>& match_ba);\n  \n};\n\n\n#ifndef IGL_STATIC_LIBRARY\n#include \"polyvector_field_matchings.cpp\"\n#endif\n\n\n#endif /* defined(IGL_POLYVECTOR_FIELD_MATCHINGS) */\n"
  },
  {
    "path": "libs/libigl/include/igl/polyvector_field_poisson_reconstruction.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\r\n// \r\n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\r\n// \r\n// This Source Code Form is subject to the terms of the Mozilla Public License \r\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \r\n// obtain one at http://mozilla.org/MPL/2.0/.\r\n#include <igl/polyvector_field_poisson_reconstruction.h>\r\n#include <igl/grad.h>\r\n#include <igl/doublearea.h>\r\n#include <igl/sparse.h>\r\n#include <igl/repdiag.h>\r\n#include <igl/slice.h>\r\n#include <igl/slice_into.h>\r\n#include <igl/colon.h>\r\n\r\n#include <Eigen/Sparse>\r\n\r\ntemplate <typename DerivedV, typename DerivedF, typename DerivedSF, typename DerivedS>\r\nIGL_INLINE void igl::polyvector_field_poisson_reconstruction(\r\n  const Eigen::PlainObjectBase<DerivedV> &Vcut,\r\n  const Eigen::PlainObjectBase<DerivedF> &Fcut,\r\n  const Eigen::PlainObjectBase<DerivedS> &sol3D_combed,\r\n                                                               Eigen::PlainObjectBase<DerivedSF> &scalars)\r\n  {\r\n    Eigen::SparseMatrix<typename DerivedV::Scalar> gradMatrix;\r\n    igl::grad(Vcut, Fcut, gradMatrix);\r\n\r\n    Eigen::VectorXd FAreas;\r\n    igl::doublearea(Vcut, Fcut, FAreas);\r\n    FAreas = FAreas.array() * .5;\r\n\r\n    int nf = FAreas.rows();\r\n    Eigen::SparseMatrix<typename DerivedV::Scalar> M,M1;\r\n    Eigen::VectorXi II = igl::colon<int>(0, nf-1);\r\n\r\n    igl::sparse(II, II, FAreas, M1);\r\n    igl::repdiag(M1, 3, M) ;\r\n\r\n    int half_degree = sol3D_combed.cols()/3;\r\n\r\n    int numF = Fcut.rows();\r\n    scalars.setZero(Vcut.rows(),half_degree);\r\n\r\n    Eigen::SparseMatrix<typename DerivedV::Scalar> Q = gradMatrix.transpose()* M *gradMatrix;\r\n\r\n    //fix one point at Ik=fix, value at fixed xk=0\r\n    int fix = 0;\r\n    Eigen::VectorXi Ik(1);Ik<<fix;\r\n    Eigen::VectorXd xk(1);xk<<0;\r\n\r\n    //unknown indices\r\n    Eigen::VectorXi Iu(Vcut.rows()-1,1);\r\n    Iu<<igl::colon<int>(0, fix-1),  igl::colon<int>(fix+1,Vcut.rows()-1);\r\n\r\n    Eigen::SparseMatrix<typename DerivedV::Scalar> Quu, Quk;\r\n    igl::slice(Q, Iu, Iu, Quu);\r\n    igl::slice(Q, Iu, Ik, Quk);\r\n    Eigen::SimplicialLDLT<Eigen::SparseMatrix<typename DerivedV::Scalar> > solver;\r\n    solver.compute(Quu);\r\n\r\n\r\n    Eigen::VectorXd vec; vec.setZero(3*numF,1);\r\n    for (int i =0; i<half_degree; ++i)\r\n    {\r\n      vec<<sol3D_combed.col(i*3+0),sol3D_combed.col(i*3+1),sol3D_combed.col(i*3+2);\r\n      Eigen::VectorXd b = gradMatrix.transpose()* M * vec;\r\n      Eigen::VectorXd bu = igl::slice(b, Iu);\r\n\r\n      Eigen::VectorXd rhs = bu-Quk*xk;\r\n      Eigen::VectorXd yu = solver.solve(rhs);\r\n\r\n      Eigen::VectorXd y(Vcut.rows(),1);\r\n      igl::slice_into(yu, Iu, 1, y);y(Ik[0])=xk[0];\r\n      scalars.col(i) = y;\r\n    }\r\n}\r\n\r\ntemplate <typename DerivedV, typename DerivedF, typename DerivedSF, typename DerivedS, typename DerivedE>\r\nIGL_INLINE double igl::polyvector_field_poisson_reconstruction(\r\n                                                               const Eigen::PlainObjectBase<DerivedV> &Vcut,\r\n                                                               const Eigen::PlainObjectBase<DerivedF> &Fcut,\r\n                                                               const Eigen::PlainObjectBase<DerivedS> &sol3D_combed,\r\n                                                               Eigen::PlainObjectBase<DerivedSF> &scalars,\r\n                                                               Eigen::PlainObjectBase<DerivedS> &sol3D_recon,\r\n                                                               Eigen::PlainObjectBase<DerivedE> &max_error )\r\n{\r\n  \r\n  igl::polyvector_field_poisson_reconstruction(Vcut, Fcut, sol3D_combed, scalars);\r\n\r\n  Eigen::SparseMatrix<typename DerivedV::Scalar> gradMatrix;\r\n  igl::grad(Vcut, Fcut, gradMatrix);\r\n  int numF = Fcut.rows();\r\n  int half_degree = sol3D_combed.cols()/3;\r\n\r\n    //    evaluate gradient of found scalar function\r\n  sol3D_recon.setZero(sol3D_combed.rows(),sol3D_combed.cols());\r\n  \r\n    for (int i =0; i<half_degree; ++i)\r\n    {\r\n      Eigen::VectorXd vec_poisson = gradMatrix*scalars.col(i);\r\n      sol3D_recon.col(i*3+0) = vec_poisson.segment(0*numF, numF);\r\n      sol3D_recon.col(i*3+1) = vec_poisson.segment(1*numF, numF);\r\n      sol3D_recon.col(i*3+2) = vec_poisson.segment(2*numF, numF);\r\n    }\r\n\r\n    max_error.setZero(numF,1);\r\n    for (int i =0; i<half_degree; ++i)\r\n    {\r\n      Eigen::VectorXd diff = (sol3D_recon.block(0, i*3, numF, 3)-sol3D_combed.block(0, i*3, numF, 3)).rowwise().norm();\r\n      diff = diff.array() / sol3D_combed.block(0, i*3, numF, 3).rowwise().norm().array();\r\n      max_error = max_error.cwiseMax(diff.cast<typename DerivedE::Scalar>());\r\n    }\r\n\r\n    return max_error.mean();\r\n  }\r\n\r\n\r\n  #ifdef IGL_STATIC_LIBRARY\r\n  // Explicit template instantiation\r\n  template double igl::polyvector_field_poisson_reconstruction<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<float, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 1, 0, -1, 1> >&);\r\ntemplate double igl::polyvector_field_poisson_reconstruction<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\r\n  #endif\r\n"
  },
  {
    "path": "libs/libigl/include/igl/polyvector_field_poisson_reconstruction.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2015 Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_POLYVECTOR_FIELD_POISSON_RECONSTRUCTION\n#define IGL_POLYVECTOR_FIELD_POISSON_RECONSTRUCTION\n#include \"igl_inline.h\"\n\n#include <Eigen/Core>\n#include <vector>\n\nnamespace igl {\n  // Poisson integration on a combed n-polyvector field, defined on a cut mesh.\n  // The function finds n new integrable vector fields that are as close as possible to the\n  // N-vector fields of the original combed polyvector field. Integrable means\n  // that the vector fields are gradients of scalar functions. The deviation from the input\n  // field measures how much the input field deviates from integrability.\n  // Inputs:\n  //   Vcut             #V by 3 list of the vertex positions\n  //   Fcut             #F by 3 list of the faces (must be triangles)\n  //   sol3D_combed     #F by 3n list of the 3D coordinates of the per-face vectors of the combed vector set field\n  //                    (stacked horizontally for each triangle). Vector #1 in one face will match vector #1 in\n  //                    the adjacent face.\n  // Outputs:\n  //   scalars          #V by n list of the per-vertex scalar functions of which the input field\n  //                    is approximately the gradients\n  //   sol3D_recon      #F by 3n list of the 3D coordinates of the per-face vectors of the reconstructed\n  //                    vector set fields (stacked horizontally for each triangle). The fields are the\n  //                    gradients of the scalar functions sF.\n  //   max_error        #V by 1 list of the maximal (across the n vector fields) reconstruction error.\n  //\n  template <typename DerivedV, typename DerivedF, typename DerivedSF, typename DerivedS, typename DerivedE>\n  IGL_INLINE double polyvector_field_poisson_reconstruction(\n                                                            const Eigen::PlainObjectBase<DerivedV> &Vcut,\n                                                            const Eigen::PlainObjectBase<DerivedF> &Fcut,\n                                                            const Eigen::PlainObjectBase<DerivedS> &sol3D_combed,\n                                                            Eigen::PlainObjectBase<DerivedSF> &scalars,\n                                                            Eigen::PlainObjectBase<DerivedS> &sol3D_recon,\n                                                            Eigen::PlainObjectBase<DerivedE> &max_error );\n  //Wrappers with less output\n  template <typename DerivedV, typename DerivedF, typename DerivedSF, typename DerivedS>\n  IGL_INLINE void polyvector_field_poisson_reconstruction(\n                                                            const Eigen::PlainObjectBase<DerivedV> &Vcut,\n                                                            const Eigen::PlainObjectBase<DerivedF> &Fcut,\n                                                            const Eigen::PlainObjectBase<DerivedS> &sol3D_combed,\n                                                            Eigen::PlainObjectBase<DerivedSF> &scalars);\n\n\n};\n\n\n#ifndef IGL_STATIC_LIBRARY\n#include \"polyvector_field_poisson_reconstruction.cpp\"\n#endif\n\n\n#endif /* defined(IGL_POLYVECTOR_FIELD_POISSON_RECONSTRUCTION) */\n"
  },
  {
    "path": "libs/libigl/include/igl/polyvector_field_singularities_from_matchings.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include <iostream>\n#include <igl/polyvector_field_singularities_from_matchings.h>\n#include <igl/is_border_vertex.h>\n#include <igl/vertex_triangle_adjacency.h>\n#include <igl/list_to_matrix.h>\n#include <igl/triangle_triangle_adjacency.h>\n#include <igl/edge_topology.h>\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedM, typename VFType, typename DerivedTT>\nvoid igl::polyvector_field_one_ring_matchings(const Eigen::PlainObjectBase<DerivedV> &V,\n                                              const Eigen::PlainObjectBase<DerivedF> &F,\n                                              const std::vector<std::vector<VFType> >& VF,\n                                              const Eigen::MatrixXi& E2F,\n                                              const Eigen::MatrixXi& F2E,\n                                              const Eigen::PlainObjectBase<DerivedTT>& TT,\n                                              const Eigen::PlainObjectBase<DerivedM> &match_ab,\n                                              const Eigen::PlainObjectBase<DerivedM> &match_ba,\n                                              const int vi,\n                                              Eigen::MatrixXi &mvi,\n                                              Eigen::VectorXi &fi)\n{\n  int half_degree = match_ab.cols();\n  mvi.resize(VF[vi].size()+1,half_degree);\n  fi.resize(VF[vi].size()+1,1);\n  //start from one face\n  //first, check if the vertex is on a boundary\n  //then there must be two faces that are on the boundary\n  //(other cases not supported)\n\n  int fstart = -1;\n  int ind = 0;\n  for (int i =0; i<VF[vi].size(); ++i)\n  {\n    int fi = VF[vi][i];\n    for (int  j=0; j<3; ++j)\n      if (F(fi,j)==vi && TT(fi,j) == -1)\n      {\n        ind ++;\n        fstart = fi;\n        //        break;\n      }\n  }\n  if (ind >1 )\n  {\n    std::cerr<<\"igl::polyvector_field_one_ring_matchings -- vertex \"<<vi<< \" is on an unusual boundary\"<<std::endl;\n    exit(1);\n  }\n  if (fstart == -1)\n    fstart = VF[vi][0];\n  int current_face = fstart;\n  int i =0;\n  fi[i] = current_face;\n  for (int j=0; j<half_degree; ++j)\n    mvi(i,j) = j;\n\n  int next_face = -1;\n  while (next_face != fstart && current_face!=-1)\n  {\n    // look for the vertex\n    int j=-1;\n    for (unsigned z=0; z<3; ++z)\n      if (F(current_face,(z+1)%3) == vi)\n      {\n        j=z;\n        break;\n      }\n    assert(j!=-1);\n\n    next_face = TT(current_face, j);\n    ++i;\n\n    if (next_face == -1)\n      mvi.row(i).setConstant(-1);\n    else\n    {\n      // look at the edge between the two faces\n      const int &current_edge = F2E(current_face,j);\n\n      for (int k=0; k<half_degree; ++k)\n      {\n        // check its orientation to determine whether match_ab or match_ba should be used\n        if ((E2F(current_edge,0) == current_face) &&\n            (E2F(current_edge,1) == next_face) )\n        {\n          //look at match_ab\n          mvi(i,k) = match_ab(current_edge,(mvi(i-1,k))%half_degree);\n        }\n        else\n        {\n          assert((E2F(current_edge,1) == current_face) &&\n                 (E2F(current_edge,0) == next_face));\n          //look at match_ba\n          mvi(i,k) = match_ba(current_edge,(mvi(i-1,k))%half_degree);\n        }\n        if (mvi(i-1,k)>=half_degree)\n          mvi(i,k) = (mvi(i,k)+half_degree)%(2*half_degree);\n      }\n    }\n    current_face = next_face;\n    fi[i] = current_face;\n  }\n}\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedM, typename DerivedS>\nIGL_INLINE void igl::polyvector_field_singularities_from_matchings(\n                                                                   const Eigen::PlainObjectBase<DerivedV> &V,\n                                                                   const Eigen::PlainObjectBase<DerivedF> &F,\n                                                                   const Eigen::PlainObjectBase<DerivedM> &match_ab,\n                                                                   const Eigen::PlainObjectBase<DerivedM> &match_ba,\n                                                                   Eigen::PlainObjectBase<DerivedS> &singularities)\n{\n\n  std::vector<bool> V_border = igl::is_border_vertex(V,F);\n  std::vector<std::vector<int> > VF, VFi;\n  igl::vertex_triangle_adjacency(V,F,VF,VFi);\n\n  Eigen::MatrixXi TT, TTi;\n  igl::triangle_triangle_adjacency(F,TT,TTi);\n\n  Eigen::MatrixXi E, E2F, F2E;\n  igl::edge_topology(V,F,E,F2E,E2F);\n\n  igl::polyvector_field_singularities_from_matchings(V, F, V_border, VF, TT, E2F, F2E, match_ab, match_ba, singularities);\n}\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedM, typename VFType, typename DerivedS>\nIGL_INLINE void igl::polyvector_field_singularities_from_matchings(\n                                                                   const Eigen::PlainObjectBase<DerivedV> &V,\n                                                                   const Eigen::PlainObjectBase<DerivedF> &F,\n                                                                   const std::vector<bool> &V_border,\n                                                                   const std::vector<std::vector<VFType> > &VF,\n                                                                   const Eigen::MatrixXi &TT,\n                                                                   const Eigen::MatrixXi &E2F,\n                                                                   const Eigen::MatrixXi &F2E,\n                                                                   const Eigen::PlainObjectBase<DerivedM> &match_ab,\n                                                                   const Eigen::PlainObjectBase<DerivedM> &match_ba,\n                                                                   Eigen::PlainObjectBase<DerivedS> &singularities)\n{\n\n  int numV = V.rows();\n\n  std::vector<int> singularities_v;\n  int half_degree = match_ab.cols();\n  for (int vi =0; vi<numV; ++vi)\n  {\n    ///check that is on border..\n    if (V_border[vi])\n      continue;\n    Eigen::VectorXi fi;\n    Eigen::MatrixXi mvi;\n    igl::polyvector_field_one_ring_matchings(V, F, VF, E2F, F2E, TT, match_ab, match_ba, vi, mvi, fi);\n\n    int num = fi.size();\n    //pick one of the vectors to check for singularities\n    for (int vector_to_match = 0; vector_to_match < half_degree; ++vector_to_match)\n    {\n      if(mvi(num-1,vector_to_match) != mvi(0,vector_to_match))\n      {\n        singularities_v.push_back(vi);\n        break;\n      }\n    }\n  }\n  std::sort(singularities_v.begin(), singularities_v.end());\n  auto last = std::unique(singularities_v.begin(), singularities_v.end());\n  singularities_v.erase(last, singularities_v.end());\n\n  igl::list_to_matrix(singularities_v, singularities);\n}\n\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedM, typename DerivedS>\nIGL_INLINE void igl::polyvector_field_singularities_from_matchings(\n                                                                   const Eigen::PlainObjectBase<DerivedV> &V,\n                                                                   const Eigen::PlainObjectBase<DerivedF> &F,\n                                                                   const Eigen::PlainObjectBase<DerivedM> &match_ab,\n                                                                   const Eigen::PlainObjectBase<DerivedM> &match_ba,\n                                                                   Eigen::PlainObjectBase<DerivedS> &singularities,\n                                                                   Eigen::PlainObjectBase<DerivedS> &singularity_indices)\n{\n\n  std::vector<bool> V_border = igl::is_border_vertex(V,F);\n  std::vector<std::vector<int> > VF, VFi;\n  igl::vertex_triangle_adjacency(V,F,VF,VFi);\n\n  Eigen::MatrixXi TT, TTi;\n  igl::triangle_triangle_adjacency(V,F,TT,TTi);\n\n  Eigen::MatrixXi E, E2F, F2E;\n  igl::edge_topology(V,F,E,F2E,E2F);\n\n  igl::polyvector_field_singularities_from_matchings(V, F, V_border, VF, TT, E2F, F2E, match_ab, match_ba, singularities, singularity_indices);\n}\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedM, typename VFType, typename DerivedS>\nIGL_INLINE void igl::polyvector_field_singularities_from_matchings(\n                                                                   const Eigen::PlainObjectBase<DerivedV> &V,\n                                                                   const Eigen::PlainObjectBase<DerivedF> &F,\n                                                                   const std::vector<bool> &V_border,\n                                                                   const std::vector<std::vector<VFType> > &VF,\n                                                                   const Eigen::MatrixXi &TT,\n                                                                   const Eigen::MatrixXi &E2F,\n                                                                   const Eigen::MatrixXi &F2E,\n                                                                   const Eigen::PlainObjectBase<DerivedM> &match_ab,\n                                                                   const Eigen::PlainObjectBase<DerivedM> &match_ba,\n                                                                   Eigen::PlainObjectBase<DerivedS> &singularities,\n                                                                   Eigen::PlainObjectBase<DerivedS> &singularity_indices)\n{\n  igl::polyvector_field_singularities_from_matchings(V, F, V_border, VF, TT, E2F, F2E, match_ab, match_ba, singularities);\n\n  singularity_indices.setZero(singularities.size(), 1);\n\n  //get index from first vector only\n  int vector_to_match = 0;\n  for (int i =0; i<singularities.size(); ++i)\n  {\n    int vi = singularities[i];\n\n    // Eigen::VectorXi mvi,fi;\n    // igl::polyvector_field_one_ring_matchings(V, F, VF, E2F, F2E, TT, match_ab, match_ba, vi, vector_to_match, mvi, fi);\n    Eigen::VectorXi fi;\n    Eigen::MatrixXi mvi;\n    igl::polyvector_field_one_ring_matchings(V, F, VF, E2F, F2E, TT, match_ab, match_ba, vi, mvi, fi);\n\n    singularity_indices[i] = (mvi(mvi.rows()-1,vector_to_match) - vector_to_match);\n  }\n\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::polyvector_field_singularities_from_matchings<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/polyvector_field_singularities_from_matchings.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2015 Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_POLYVECTOR_FIELD_SINGULARITIES_FROM_MATCHINGS\n#define IGL_POLYVECTOR_FIELD_SINGULARITIES_FROM_MATCHINGS\n#include \"igl_inline.h\"\n\n#include <Eigen/Core>\n#include <vector>\n\nnamespace igl {\n  \n  // We are given a polyvector field on a mesh (with N vectors per face), and matchings between the vector sets\n  // across all non-boundary edges.  The function computes, for the one-ring\n  // neighborhood of a given vertex, and for each of the vectors of the vector set,\n  // the sequence of the vectors that match to it around the one-ring. If the vector that\n  // we land on by following the matchings is not the original vector that we started from,\n  // the vertex is a singularity.\n  //\n  // Inputs:\n  //   V                #V by 3 list of the vertex positions\n  //   F                #F by 3 list of the faces (must be triangles)\n  //   VF               #V list of lists of incident faces (adjacency list), e.g.\n  //                    as returned by igl::vertex_triangle_adjacency\n  //   E2F              #E by 2 list of the edge-to-face relation (e.g. computed\n  //                    via igl::edge_topology)\n  //   F2E              #F by 3 list of the face-to-edge relation (e.g. computed\n  //                    via igl::edge_topology)\n  //   TT               #F by 3 triangle to triangle adjacent matrix (e.g. computed\n  //                    via igl:triangle_triangle_adjacency)\n  //   match_ab         #E by N matrix, describing for each edge the matching a->b, where a\n  //                    and b are the faces adjacent to the edge (i.e. vector #i of\n  //                    the vector set in a is matched to vector #mab[i] in b)\n  //   match_ba         #E by N matrix, describing for each edge the matching b->a, where a\n  //                    and b are the faces adjacent to the edge (i.e. vector #mba[i] of\n  //                    the vector set in a is matched to vector #i in b)\n  //   vi               the selected one ring\n  //\n  // Output:\n  //   mvi              #numOneRingFaces by 1 list of the indices of the sequentially matching vectors\n  //                    in the faces of the one ring (first enty is always vector_id, then the vector matching\n  //                    vector_id in the next face, then the vector matching that in the third face etc.)\n  //   fi               #numOneRingFaces by 1 list of the sequentially visited faces in the one ring neighborhood.\n  //                    The one-ring is traversed in CLOCKWISE order with respect to the outward normal. (=opposite)\n  //\n  template <typename DerivedV, typename DerivedF, typename DerivedM, typename VFType, typename DerivedTT>\n  void polyvector_field_one_ring_matchings(const Eigen::PlainObjectBase<DerivedV> &V,\n                                           const Eigen::PlainObjectBase<DerivedF> &F,\n                                           const std::vector<std::vector<VFType> >& VF,\n                                           const Eigen::MatrixXi& E2F,\n                                           const Eigen::MatrixXi& F2E,\n                                           const Eigen::PlainObjectBase<DerivedTT>& TT,\n                                           const Eigen::PlainObjectBase<DerivedM> &match_ab,\n                                           const Eigen::PlainObjectBase<DerivedM> &match_ba,\n                                           const int vi,\n                                           Eigen::MatrixXi &mvi,\n                                           Eigen::VectorXi &fi);\n  \n  \n  // Given a polyvector field on a mesh, and matchings between the vector sets\n  // across all non-boundary edges, the function computes the singularities of the\n  // polyvector field, by computing the one ring matchings.\n  //\n  // Inputs:\n  //   V                #V by 3 list of the vertex positions\n  //   F                #F by 3 list of the faces (must be triangles)\n  //   V_border         #V by 1 list of booleans, indicating if the corresponging vertex is\n  //                    at the mesh boundary, e.g. as returned by igl::is_border_vertex\n  //   VF               #V list of lists of incident faces (adjacency list), e.g.\n  //                    as returned by igl::vertex_triangle_adjacency\n  //   TT               #F by 3 triangle to triangle adjacent matrix (e.g. computed\n  //                    via igl:triangle_triangle_adjacency)\n  //   E2F              #E by 2 list of the edge-to-face relation (e.g. computed\n  //                    via igl::edge_topology)\n  //   F2E              #F by 3 list of the face-to-edge relation (e.g. computed\n  //                    via igl::edge_topology)\n  //   match_ab         #E by N matrix, describing for each edge the matching a->b, where a\n  //                    and b are the faces adjacent to the edge (i.e. vector #i of\n  //                    the vector set in a is matched to vector #mab[i] in b)\n  //   match_ba         #E by N matrix, describing for each edge the matching b->a, where a\n  //                    and b are the faces adjacent to the edge (i.e. vector #mba[i] of\n  //                    the vector set in a is matched to vector #i in b)\n  //\n  // Output:\n  //   singularities    #S by 1 list of the indices of the singular vertices\n  //\n  template <typename DerivedV, typename DerivedF, typename DerivedM, typename VFType, typename DerivedS>\n  IGL_INLINE void polyvector_field_singularities_from_matchings(\n                                                                const Eigen::PlainObjectBase<DerivedV> &V,\n                                                                const Eigen::PlainObjectBase<DerivedF> &F,\n                                                                const std::vector<bool> &V_border,\n                                                                const std::vector<std::vector<VFType> > &VF,\n                                                                const Eigen::MatrixXi &TT,\n                                                                const Eigen::MatrixXi &E2F,\n                                                                const Eigen::MatrixXi &F2E,\n                                                                const Eigen::PlainObjectBase<DerivedM> &match_ab,\n                                                                const Eigen::PlainObjectBase<DerivedM> &match_ba,\n                                                                Eigen::PlainObjectBase<DerivedS> &singularities);\n  \n  \n  // Wrapper with only V,F and the matchings as input\n  template <typename DerivedV, typename DerivedF, typename DerivedM, typename DerivedS>\n  IGL_INLINE void polyvector_field_singularities_from_matchings(\n                                                                const Eigen::PlainObjectBase<DerivedV> &V,\n                                                                const Eigen::PlainObjectBase<DerivedF> &F,\n                                                                const Eigen::PlainObjectBase<DerivedM> &match_ab,\n                                                                const Eigen::PlainObjectBase<DerivedM> &match_ba,\n                                                                Eigen::PlainObjectBase<DerivedS> &singularities);\n  \n  \n  // Same pair as above but also returns singularity indices\n  template <typename DerivedV, typename DerivedF, typename DerivedM, typename DerivedS>\n  IGL_INLINE void polyvector_field_singularities_from_matchings(\n                                                                const Eigen::PlainObjectBase<DerivedV> &V,\n                                                                const Eigen::PlainObjectBase<DerivedF> &F,\n                                                                const Eigen::PlainObjectBase<DerivedM> &match_ab,\n                                                                const Eigen::PlainObjectBase<DerivedM> &match_ba,\n                                                                Eigen::PlainObjectBase<DerivedS> &singularities,\n                                                                Eigen::PlainObjectBase<DerivedS> &singularity_indices);\n  \n  template <typename DerivedV, typename DerivedF, typename DerivedM, typename VFType, typename DerivedS>\n  IGL_INLINE void polyvector_field_singularities_from_matchings(\n                                                                const Eigen::PlainObjectBase<DerivedV> &V,\n                                                                const Eigen::PlainObjectBase<DerivedF> &F,\n                                                                const std::vector<bool> &V_border,\n                                                                const std::vector<std::vector<VFType> > &VF,\n                                                                const Eigen::MatrixXi &TT,\n                                                                const Eigen::MatrixXi &E2F,\n                                                                const Eigen::MatrixXi &F2E,\n                                                                const Eigen::PlainObjectBase<DerivedM> &match_ab,\n                                                                const Eigen::PlainObjectBase<DerivedM> &match_ba,\n                                                                Eigen::PlainObjectBase<DerivedS> &singularities,\n                                                                Eigen::PlainObjectBase<DerivedS> &singularity_indices);\n\n  \n  \n};\n\n\n#ifndef IGL_STATIC_LIBRARY\n#include \"polyvector_field_singularities_from_matchings.cpp\"\n#endif\n\n\n#endif /* defined(IGL_POLYVECTOR_FIELD_SINGULARITIES_FROM_MATCHINGS) */\n"
  },
  {
    "path": "libs/libigl/include/igl/principal_curvature.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"principal_curvature.h\"\n#include <iostream>\n#include <fstream>\n#include <iomanip>\n#include <iostream>\n#include <queue>\n#include <list>\n#include <cmath>\n#include <limits>\n\n#include <Eigen/SparseCholesky>\n\n// Lib IGL includes\n#include <igl/adjacency_list.h>\n#include <igl/per_face_normals.h>\n#include <igl/per_vertex_normals.h>\n#include <igl/avg_edge_length.h>\n#include <igl/vertex_triangle_adjacency.h>\n\ntypedef enum\n{\n  SPHERE_SEARCH,\n  K_RING_SEARCH\n} searchType;\n\ntypedef enum\n{\n  AVERAGE,\n  PROJ_PLANE\n} normalType;\n\nclass CurvatureCalculator\n{\npublic:\n  /* Row number i represents the i-th vertex, whose columns are:\n   curv[i][0] : K2\n   curv[i][1] : K1\n   curvDir[i][0] : PD1\n   curvDir[i][1] : PD2\n   */\n  std::vector< std::vector<double> > curv;\n  std::vector< std::vector<Eigen::Vector3d> > curvDir;\n  bool curvatureComputed;\n  class Quadric\n  {\n  public:\n\n    IGL_INLINE Quadric ()\n    {\n      a() = b() = c() = d() = e() = 1.0;\n    }\n\n    IGL_INLINE Quadric(double av, double bv, double cv, double dv, double ev)\n    {\n      a() = av;\n      b() = bv;\n      c() = cv;\n      d() = dv;\n      e() = ev;\n    }\n\n    IGL_INLINE double& a() { return data[0];}\n    IGL_INLINE double& b() { return data[1];}\n    IGL_INLINE double& c() { return data[2];}\n    IGL_INLINE double& d() { return data[3];}\n    IGL_INLINE double& e() { return data[4];}\n\n    double data[5];\n\n    IGL_INLINE double evaluate(double u, double v)\n    {\n      return a()*u*u + b()*u*v + c()*v*v + d()*u + e()*v;\n    }\n\n    IGL_INLINE double du(double u, double v)\n    {\n      return 2.0*a()*u + b()*v + d();\n    }\n\n    IGL_INLINE double dv(double u, double v)\n    {\n      return 2.0*c()*v + b()*u + e();\n    }\n\n    IGL_INLINE double duv(double u, double v)\n    {\n      return b();\n    }\n\n    IGL_INLINE double duu(double u, double v)\n    {\n      return 2.0*a();\n    }\n\n    IGL_INLINE double dvv(double u, double v)\n    {\n      return 2.0*c();\n    }\n\n\n    IGL_INLINE static Quadric fit(std::vector<Eigen::Vector3d> &VV, bool zeroDetCheck, bool svd)\n    {\n      using namespace std;\n      assert(VV.size() >= 5);\n      if (VV.size() < 5)\n      {\n        cerr << \"ASSERT FAILED!\" << endl;\n        exit(0);\n      }\n\n      Eigen::MatrixXd A(VV.size(),5);\n      Eigen::MatrixXd b(VV.size(),1);\n      Eigen::MatrixXd sol(5,1);\n\n      for(unsigned int c=0; c < VV.size(); ++c)\n      {\n        double u = VV[c][0];\n        double v = VV[c][1];\n        double n = VV[c][2];\n\n        A(c,0) = u*u;\n        A(c,1) = u*v;\n        A(c,2) = v*v;\n        A(c,3) = u;\n        A(c,4) = v;\n\n        b(c) = n;\n      }\n\n      sol=A.jacobiSvd(Eigen::ComputeThinU | Eigen::ComputeThinV).solve(b);\n\n      return Quadric(sol(0),sol(1),sol(2),sol(3),sol(4));\n    }\n  };\n\npublic:\n\n  Eigen::MatrixXd vertices;\n  // Face list of current mesh    (#F x 3) or (#F x 4)\n  // The i-th row contains the indices of the vertices that forms the i-th face in ccw order\n  Eigen::MatrixXi faces;\n\n  std::vector<std::vector<int> > vertex_to_vertices;\n  std::vector<std::vector<int> > vertex_to_faces;\n  std::vector<std::vector<int> > vertex_to_faces_index;\n  Eigen::MatrixXd face_normals;\n  Eigen::MatrixXd vertex_normals;\n\n  /* Size of the neighborhood */\n  double sphereRadius;\n  int kRing;\n\n  bool localMode; /* Use local mode */\n  bool projectionPlaneCheck; /* Check collected vertices on tangent plane */\n  bool montecarlo;\n  bool svd; /* Use svd calculation instead of pseudoinverse */\n  bool zeroDetCheck; /* Check if the determinant is close to zero */\n  unsigned int montecarloN;\n\n  searchType st; /* Use either a sphere search or a k-ring search */\n  normalType nt;\n\n  double lastRadius;\n  double scaledRadius;\n  std::string lastMeshName;\n\n  /* Benchmark related variables */\n  bool expStep; /* True if we want the radius to increase exponentially */\n  int step;  /* If expStep==false, by how much rhe radius increases on every step */\n  int maxSize; /* The maximum limit of the radius in the benchmark */\n\n  IGL_INLINE CurvatureCalculator();\n  IGL_INLINE void init(const Eigen::MatrixXd& V, const Eigen::MatrixXi& F);\n\n  IGL_INLINE void finalEigenStuff (int, std::vector<Eigen::Vector3d>, Quadric );\n  IGL_INLINE void fitQuadric (Eigen::Vector3d, std::vector<Eigen::Vector3d> ref, const  std::vector<int>& , Quadric *);\n  IGL_INLINE void applyProjOnPlane(Eigen::Vector3d, std::vector<int>, std::vector<int>&);\n  IGL_INLINE void getSphere(const int, const double, std::vector<int>&, int min);\n  IGL_INLINE void getKRing(const int, const double,std::vector<int>&);\n  IGL_INLINE Eigen::Vector3d project(Eigen::Vector3d, Eigen::Vector3d, Eigen::Vector3d);\n  IGL_INLINE void computeReferenceFrame(int, Eigen::Vector3d, std::vector<Eigen::Vector3d>&);\n  IGL_INLINE void getAverageNormal(int, std::vector<int>, Eigen::Vector3d&);\n  IGL_INLINE void getProjPlane(int, std::vector<int>, Eigen::Vector3d&);\n  IGL_INLINE void applyMontecarlo(std::vector<int>&,std::vector<int>*);\n  IGL_INLINE void computeCurvature();\n  IGL_INLINE void printCurvature(std::string outpath);\n  IGL_INLINE double getAverageEdge();\n\n  IGL_INLINE static int rotateForward (float *v0, float *v1, float *v2)\n  {\n    float t;\n\n    if (std::abs(*v2) >= std::abs(*v1) && std::abs(*v2) >= std::abs(*v0))\n      return 0;\n\n    t = *v0;\n    *v0 = *v2;\n    *v2 = *v1;\n    *v1 = t;\n\n    return 1 + rotateForward (v0, v1, v2);\n  }\n\n  IGL_INLINE static void rotateBackward (int nr, float *v0, float *v1, float *v2)\n  {\n    float t;\n\n    if (nr == 0)\n      return;\n\n    t = *v2;\n    *v2 = *v0;\n    *v0 = *v1;\n    *v1 = t;\n\n    rotateBackward (nr - 1, v0, v1, v2);\n  }\n\n  IGL_INLINE static Eigen::Vector3d chooseMax (Eigen::Vector3d n, Eigen::Vector3d abc, float ab)\n  {\n    int i, max_i;\n    float max_sp;\n    Eigen::Vector3d nt[8];\n\n    n.normalize ();\n    abc.normalize ();\n\n    max_sp = - std::numeric_limits<float>::max();\n\n    for (i = 0; i < 4; i++)\n    {\n      nt[i] = n;\n      if (ab > 0)\n      {\n        switch (i)\n        {\n          case 0:\n            break;\n\n          case 1:\n            nt[i][2] = -n[2];\n            break;\n\n          case 2:\n            nt[i][0] = -n[0];\n            nt[i][1] = -n[1];\n            break;\n\n          case 3:\n            nt[i][0] = -n[0];\n            nt[i][1] = -n[1];\n            nt[i][2] = -n[2];\n            break;\n        }\n      }\n      else\n      {\n        switch (i)\n        {\n          case 0:\n            nt[i][0] = -n[0];\n            break;\n\n          case 1:\n            nt[i][1] = -n[1];\n            break;\n\n          case 2:\n            nt[i][0] = -n[0];\n            nt[i][2] = -n[2];\n            break;\n\n          case 3:\n            nt[i][1] = -n[1];\n            nt[i][2] = -n[2];\n            break;\n        }\n      }\n\n      if (nt[i].dot(abc) > max_sp)\n      {\n        max_sp = nt[i].dot(abc);\n        max_i = i;\n      }\n    }\n\n    return nt[max_i];\n  }\n\n};\n\nclass comparer\n{\npublic:\n  IGL_INLINE bool operator() (const std::pair<int, double>& lhs, const std::pair<int, double>&rhs) const\n  {\n    return lhs.second>rhs.second;\n  }\n};\n\nIGL_INLINE CurvatureCalculator::CurvatureCalculator()\n{\n  this->localMode=true;\n  this->projectionPlaneCheck=true;\n  this->sphereRadius=5;\n  this->st=SPHERE_SEARCH;\n  this->nt=AVERAGE;\n  this->montecarlo=false;\n  this->montecarloN=0;\n  this->kRing=3;\n  this->svd=true;\n  this->zeroDetCheck=true;\n  this->curvatureComputed=false;\n  this->expStep=true;\n}\n\nIGL_INLINE void CurvatureCalculator::init(const Eigen::MatrixXd& V, const Eigen::MatrixXi& F)\n{\n  // Normalize vertices\n  vertices = V;\n\n//  vertices = vertices.array() - vertices.minCoeff();\n//  vertices = vertices.array() / vertices.maxCoeff();\n//  vertices = vertices.array() * (1.0/igl::avg_edge_length(V,F));\n\n  faces = F;\n  igl::adjacency_list(F, vertex_to_vertices);\n  igl::vertex_triangle_adjacency(V, F, vertex_to_faces, vertex_to_faces_index);\n  igl::per_face_normals(V, F, face_normals);\n  igl::per_vertex_normals(V, F, face_normals, vertex_normals);\n}\n\nIGL_INLINE void CurvatureCalculator::fitQuadric (Eigen::Vector3d v, std::vector<Eigen::Vector3d> ref, const std::vector<int>& vv, Quadric *q)\n{\n  std::vector<Eigen::Vector3d> points;\n  points.reserve (vv.size());\n\n  for (unsigned int i = 0; i < vv.size(); ++i) {\n\n    Eigen::Vector3d  cp = vertices.row(vv[i]);\n\n    // vtang non e` il v tangente!!!\n    Eigen::Vector3d  vTang = cp - v;\n\n    double x = vTang.dot(ref[0]);\n    double y = vTang.dot(ref[1]);\n    double z = vTang.dot(ref[2]);\n    points.push_back(Eigen::Vector3d (x,y,z));\n  }\n  *q = Quadric::fit (points, zeroDetCheck, svd);\n}\n\nIGL_INLINE void CurvatureCalculator::finalEigenStuff (int i, std::vector<Eigen::Vector3d> ref, Quadric q)\n{\n\n  double a = q.a();\n  double b = q.b();\n  double c = q.c();\n  double d = q.d();\n  double e = q.e();\n\n//  if (fabs(a) < 10e-8 || fabs(b) < 10e-8)\n//  {\n//    std::cout << \"Degenerate quadric: \" << i << std::endl;\n//  }\n\n  double E = 1.0 + d*d;\n  double F = d*e;\n  double G = 1.0 + e*e;\n\n  Eigen::Vector3d n = Eigen::Vector3d(-d,-e,1.0).normalized();\n\n  double L = 2.0 * a * n[2];\n  double M = b * n[2];\n  double N = 2 * c * n[2];\n\n\n  // ----------------- Eigen stuff\n  Eigen::Matrix2d m;\n  m << L*G - M*F, M*E-L*F, M*E-L*F, N*E-M*F;\n  m = m / (E*G-F*F);\n  Eigen::SelfAdjointEigenSolver<Eigen::Matrix2d> eig(m);\n\n  Eigen::Vector2d c_val = eig.eigenvalues();\n  Eigen::Matrix2d c_vec = eig.eigenvectors();\n\n  // std::cerr << \"c_val:\" << c_val << std::endl;\n  // std::cerr << \"c_vec:\" << c_vec << std::endl;\n\n  // std::cerr << \"c_vec:\" << c_vec(0) << \" \"  << c_vec(1) << std::endl;\n\n  c_val = -c_val;\n\n  Eigen::Vector3d v1, v2;\n  v1[0] = c_vec(0);\n  v1[1] = c_vec(1);\n  v1[2] = 0; //d * v1[0] + e * v1[1];\n\n  v2[0] = c_vec(2);\n  v2[1] = c_vec(3);\n  v2[2] = 0; //d * v2[0] + e * v2[1];\n\n\n  // v1 = v1.normalized();\n  // v2 = v2.normalized();\n\n  Eigen::Vector3d v1global = ref[0] * v1[0] + ref[1] * v1[1] + ref[2] * v1[2];\n  Eigen::Vector3d v2global = ref[0] * v2[0] + ref[1] * v2[1] + ref[2] * v2[2];\n\n  v1global.normalize();\n  v2global.normalize();\n\n  v1global *= c_val(0);\n  v2global *= c_val(1);\n\n  if (c_val[0] > c_val[1])\n  {\n    curv[i]=std::vector<double>(2);\n    curv[i][0]=c_val(1);\n    curv[i][1]=c_val(0);\n    curvDir[i]=std::vector<Eigen::Vector3d>(2);\n    curvDir[i][0]=v2global;\n    curvDir[i][1]=v1global;\n  }\n  else\n  {\n    curv[i]=std::vector<double>(2);\n    curv[i][0]=c_val(0);\n    curv[i][1]=c_val(1);\n    curvDir[i]=std::vector<Eigen::Vector3d>(2);\n    curvDir[i][0]=v1global;\n    curvDir[i][1]=v2global;\n  }\n  // ---- end Eigen stuff\n}\n\nIGL_INLINE void CurvatureCalculator::getKRing(const int start, const double r, std::vector<int>&vv)\n{\n  int bufsize=vertices.rows();\n  vv.reserve(bufsize);\n  std::list<std::pair<int,int> > queue;\n  bool* visited = (bool*)calloc(bufsize,sizeof(bool));\n  queue.push_back(std::pair<int,int>(start,0));\n  visited[start]=true;\n  while (!queue.empty())\n  {\n    int toVisit=queue.front().first;\n    int distance=queue.front().second;\n    queue.pop_front();\n    vv.push_back(toVisit);\n    if (distance<(int)r)\n    {\n      for (unsigned int i=0; i<vertex_to_vertices[toVisit].size(); i++)\n      {\n        int neighbor=vertex_to_vertices[toVisit][i];\n        if (!visited[neighbor])\n        {\n          queue.push_back(std::pair<int,int> (neighbor,distance+1));\n          visited[neighbor]=true;\n        }\n      }\n    }\n  }\n  free(visited);\n  return;\n}\n\n\nIGL_INLINE void CurvatureCalculator::getSphere(const int start, const double r, std::vector<int> &vv, int min)\n{\n  int bufsize=vertices.rows();\n  vv.reserve(bufsize);\n  std::list<int>* queue= new std::list<int>();\n  bool* visited = (bool*)calloc(bufsize,sizeof(bool));\n  queue->push_back(start);\n  visited[start]=true;\n  Eigen::Vector3d me=vertices.row(start);\n  std::priority_queue<std::pair<int, double>, std::vector<std::pair<int, double> >, comparer >* extra_candidates= new  std::priority_queue<std::pair<int, double>, std::vector<std::pair<int, double> >, comparer >();\n  while (!queue->empty())\n  {\n    int toVisit=queue->front();\n    queue->pop_front();\n    vv.push_back(toVisit);\n    for (unsigned int i=0; i<vertex_to_vertices[toVisit].size(); i++)\n    {\n      int neighbor=vertex_to_vertices[toVisit][i];\n      if (!visited[neighbor])\n      {\n        Eigen::Vector3d neigh=vertices.row(neighbor);\n        float distance=(me-neigh).norm();\n        if (distance<r)\n          queue->push_back(neighbor);\n        else if ((int)vv.size()<min)\n          extra_candidates->push(std::pair<int,double>(neighbor,distance));\n        visited[neighbor]=true;\n      }\n    }\n  }\n  while (!extra_candidates->empty() && (int)vv.size()<min)\n  {\n    std::pair<int, double> cand=extra_candidates->top();\n    extra_candidates->pop();\n    vv.push_back(cand.first);\n    for (unsigned int i=0; i<vertex_to_vertices[cand.first].size(); i++)\n    {\n      int neighbor=vertex_to_vertices[cand.first][i];\n      if (!visited[neighbor])\n      {\n        Eigen::Vector3d neigh=vertices.row(neighbor);\n        float distance=(me-neigh).norm();\n        extra_candidates->push(std::pair<int,double>(neighbor,distance));\n        visited[neighbor]=true;\n      }\n    }\n  }\n  free(extra_candidates);\n  free(queue);\n  free(visited);\n}\n\nIGL_INLINE Eigen::Vector3d CurvatureCalculator::project(Eigen::Vector3d v, Eigen::Vector3d  vp, Eigen::Vector3d ppn)\n{\n  return (vp - (ppn * ((vp - v).dot(ppn))));\n}\n\nIGL_INLINE void CurvatureCalculator::computeReferenceFrame(int i, Eigen::Vector3d normal, std::vector<Eigen::Vector3d>& ref )\n{\n\n  Eigen::Vector3d longest_v=Eigen::Vector3d::Zero();\n  longest_v=Eigen::Vector3d(vertices.row(vertex_to_vertices[i][0]));\n\n  longest_v=(project(vertices.row(i),longest_v,normal)-Eigen::Vector3d(vertices.row(i))).normalized();\n\n  /* L'ultimo asse si ottiene come prodotto vettoriale tra i due\n   * calcolati */\n  Eigen::Vector3d y_axis=(normal.cross(longest_v)).normalized();\n  ref[0]=longest_v;\n  ref[1]=y_axis;\n  ref[2]=normal;\n}\n\nIGL_INLINE void CurvatureCalculator::getAverageNormal(int j, std::vector<int> vv, Eigen::Vector3d& normal)\n{\n  normal=(vertex_normals.row(j)).normalized();\n  if (localMode)\n    return;\n\n  for (unsigned int i=0; i<vv.size(); i++)\n  {\n    normal+=vertex_normals.row(vv[i]).normalized();\n  }\n  normal.normalize();\n}\n\nIGL_INLINE void CurvatureCalculator::getProjPlane(int j, std::vector<int> vv, Eigen::Vector3d& ppn)\n{\n  int nr;\n  float a, b, c;\n  float nx, ny, nz;\n  float abcq;\n\n  a = b = c = 0;\n\n  if (localMode)\n  {\n    for (unsigned int i=0; i<vertex_to_faces.at(j).size(); ++i)\n    {\n      Eigen::Vector3d faceNormal=face_normals.row(vertex_to_faces.at(j).at(i));\n      a += faceNormal[0];\n      b += faceNormal[1];\n      c += faceNormal[2];\n    }\n  }\n  else\n  {\n    for (unsigned int i=0; i<vv.size(); ++i)\n    {\n      a+= vertex_normals.row(vv[i])[0];\n      b+= vertex_normals.row(vv[i])[1];\n      c+= vertex_normals.row(vv[i])[2];\n    }\n  }\n  nr = rotateForward (&a, &b, &c);\n  abcq = a*a + b*b + c*c;\n  nx = sqrt (a*a / abcq);\n  ny = sqrt (b*b / abcq);\n  nz = sqrt (1 - nx*nx - ny*ny);\n  rotateBackward (nr, &a, &b, &c);\n  rotateBackward (nr, &nx, &ny, &nz);\n\n  ppn = chooseMax (Eigen::Vector3d(nx, ny, nz), Eigen::Vector3d (a, b, c), a * b);\n  ppn.normalize();\n}\n\n\nIGL_INLINE double CurvatureCalculator::getAverageEdge()\n{\n  double sum = 0;\n  int count = 0;\n\n  for (int i = 0; i<faces.rows(); i++)\n  {\n    for (short unsigned j=0; j<3; j++)\n    {\n      Eigen::Vector3d p1=vertices.row(faces.row(i)[j]);\n      Eigen::Vector3d p2=vertices.row(faces.row(i)[(j+1)%3]);\n\n      double l = (p1-p2).norm();\n\n      sum+=l;\n      ++count;\n    }\n  }\n\n  return (sum/(double)count);\n}\n\n\nIGL_INLINE void CurvatureCalculator::applyProjOnPlane(Eigen::Vector3d ppn, std::vector<int> vin, std::vector<int> &vout)\n{\n  for (std::vector<int>::iterator vpi = vin.begin(); vpi != vin.end(); ++vpi)\n    if (vertex_normals.row(*vpi) * ppn > 0.0f)\n      vout.push_back (*vpi);\n}\n\nIGL_INLINE void CurvatureCalculator::applyMontecarlo(std::vector<int>& vin, std::vector<int> *vout)\n{\n  if (montecarloN >= vin.size ())\n  {\n    *vout = vin;\n    return;\n  }\n\n  float p = ((float) montecarloN) / (float) vin.size();\n  for (std::vector<int>::iterator vpi = vin.begin(); vpi != vin.end(); ++vpi)\n  {\n    float r;\n    if ((r = ((float)rand () / RAND_MAX)) < p)\n    {\n      vout->push_back (*vpi);\n    }\n  }\n}\n\nIGL_INLINE void CurvatureCalculator::computeCurvature()\n{\n  using namespace std;\n\n  //CHECK che esista la mesh\n  size_t vertices_count=vertices.rows() ;\n\n  if (vertices_count <=0)\n    return;\n\n  curvDir=std::vector< std::vector<Eigen::Vector3d> >(vertices_count);\n  curv=std::vector<std::vector<double> >(vertices_count);\n\n\n\n  scaledRadius=getAverageEdge()*sphereRadius;\n\n  std::vector<int> vv;\n  std::vector<int> vvtmp;\n  Eigen::Vector3d normal;\n\n  //double time_spent;\n  //double searchtime=0, ref_time=0, fit_time=0, final_time=0;\n\n  for (size_t i=0; i<vertices_count; ++i)\n  {\n    vv.clear();\n    vvtmp.clear();\n    Eigen::Vector3d me=vertices.row(i);\n    switch (st)\n    {\n      case SPHERE_SEARCH:\n        getSphere(i,scaledRadius,vv,6);\n        break;\n      case K_RING_SEARCH:\n        getKRing(i,kRing,vv);\n        break;\n      default:\n        fprintf(stderr,\"Error: search type not recognized\");\n        return;\n    }\n\n    std::vector<Eigen::Vector3d> ref(3);\n    if (vv.size()<6)\n    {\n      std::cerr << \"Could not compute curvature of radius \" << scaledRadius << endl;\n      return;\n    }\n\n\n    if (projectionPlaneCheck)\n    {\n      vvtmp.reserve (vv.size ());\n      applyProjOnPlane (vertex_normals.row(i), vv, vvtmp);\n      if (vvtmp.size() >= 6 && vvtmp.size()<vv.size())\n\t  vv = vvtmp;\n\n    }\n\n\n    switch (nt)\n    {\n      case AVERAGE:\n        getAverageNormal(i,vv,normal);\n        break;\n      case PROJ_PLANE:\n        getProjPlane(i,vv,normal);\n        break;\n      default:\n        fprintf(stderr,\"Error: normal type not recognized\");\n        return;\n    }\n    if (vv.size()<6)\n    {\n      std::cerr << \"Could not compute curvature of radius \" << scaledRadius << endl;\n      return;\n    }\n    if (montecarlo)\n    {\n      if(montecarloN<6)\n        break;\n      vvtmp.reserve(vv.size());\n      applyMontecarlo(vv,&vvtmp);\n      vv=vvtmp;\n    }\n\n    if (vv.size()<6)\n      return;\n    computeReferenceFrame(i,normal,ref);\n\n    Quadric q;\n    fitQuadric (me, ref, vv, &q);\n    finalEigenStuff(i,ref,q);\n  }\n\n  lastRadius=sphereRadius;\n  curvatureComputed=true;\n}\n\nIGL_INLINE void CurvatureCalculator::printCurvature(std::string outpath)\n{\n  using namespace std;\n  if (!curvatureComputed)\n    return;\n\n  std::ofstream of;\n  of.open(outpath.c_str());\n\n  if (!of)\n  {\n    fprintf(stderr, \"Error: could not open output file %s\\n\", outpath.c_str());\n    return;\n  }\n\n  int vertices_count=vertices.rows();\n  of << vertices_count << endl;\n  for (int i=0; i<vertices_count; i++)\n  {\n    of << curv[i][0] << \" \" << curv[i][1] << \" \" << curvDir[i][0][0] << \" \" << curvDir[i][0][1] << \" \" << curvDir[i][0][2] << \" \" <<\n    curvDir[i][1][0] << \" \" << curvDir[i][1][1] << \" \" << curvDir[i][1][2] << endl;\n  }\n\n  of.close();\n\n}\n\ntemplate <\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedPD1,\n  typename DerivedPD2,\n  typename DerivedPV1,\n  typename DerivedPV2>\nIGL_INLINE void igl::principal_curvature(\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  Eigen::PlainObjectBase<DerivedPD1>& PD1,\n  Eigen::PlainObjectBase<DerivedPD2>& PD2,\n  Eigen::PlainObjectBase<DerivedPV1>& PV1,\n  Eigen::PlainObjectBase<DerivedPV2>& PV2,\n  unsigned radius,\n  bool useKring)\n{\n  using namespace std;\n\n  if (radius < 2)\n  {\n    radius = 2;\n    cout << \"WARNING: igl::principal_curvature needs a radius >= 2, fixing it to 2.\" << endl;\n  }\n\n  // Preallocate memory\n  PD1.resize(V.rows(),3);\n  PD2.resize(V.rows(),3);\n\n  // Preallocate memory\n  PV1.resize(V.rows(),1);\n  PV2.resize(V.rows(),1);\n\n  // Precomputation\n  CurvatureCalculator cc;\n  cc.init(V.template cast<double>(),F.template cast<int>());\n  cc.sphereRadius = radius;\n\n  if (useKring)\n  {\n    cc.kRing = radius;\n    cc.st = K_RING_SEARCH;\n  }\n\n  // Compute\n  cc.computeCurvature();\n\n  // Copy it back\n  for (unsigned i=0; i<V.rows(); i++)\n  {\n    Eigen::Vector3d d1;\n    Eigen::Vector3d d2;\n    PD1.row(i) << cc.curvDir[i][0][0], cc.curvDir[i][0][1], cc.curvDir[i][0][2];\n    PD2.row(i) << cc.curvDir[i][1][0], cc.curvDir[i][1][1], cc.curvDir[i][1][2];\n    PD1.row(i).normalize();\n    PD2.row(i).normalize();\n\n    if (std::isnan(PD1(i,0)) || std::isnan(PD1(i,1)) || std::isnan(PD1(i,2)) || std::isnan(PD2(i,0)) || std::isnan(PD2(i,1)) || std::isnan(PD2(i,2)))\n    {\n      PD1.row(i) << 0,0,0;\n      PD2.row(i) << 0,0,0;\n    }\n\n    PV1(i) = cc.curv[i][0];\n    PV2(i) = cc.curv[i][1];\n\n    if (PD1.row(i) * PD2.row(i).transpose() > 10e-6)\n    {\n      cerr << \"PRINCIPAL_CURVATURE: Something is wrong with vertex: i\" << endl;\n      PD1.row(i) *= 0;\n      PD2.row(i) *= 0;\n    }\n  }\n\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::principal_curvature<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, unsigned int, bool);\ntemplate void igl::principal_curvature<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, unsigned int, bool);\ntemplate void igl::principal_curvature<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, unsigned int, bool);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/principal_curvature.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_PRINCIPAL_CURVATURE_H\n#define IGL_PRINCIPAL_CURVATURE_H\n\n\n#include <Eigen/Geometry>\n#include <Eigen/Dense>\n\n#include \"igl_inline.h\"\n//#include <igl/cotmatrix.h>\n//#include <igl/writeOFF.h>\n\n\n\nnamespace igl\n{\n\n  // Compute the principal curvature directions and magnitude of the given triangle mesh\n  //   DerivedV derived from vertex positions matrix type: i.e. MatrixXd\n  //   DerivedF derived from face indices matrix type: i.e. MatrixXi\n  // Inputs:\n  //   V       eigen matrix #V by 3\n  //   F       #F by 3 list of mesh faces (must be triangles)\n  //   radius  controls the size of the neighbourhood used, 1 = average edge lenght\n  //\n  // Outputs:\n  //   PD1 #V by 3 maximal curvature direction for each vertex.\n  //   PD2 #V by 3 minimal curvature direction for each vertex.\n  //   PV1 #V by 1 maximal curvature value for each vertex.\n  //   PV2 #V by 1 minimal curvature value for each vertex.\n  //\n  // See also: average_onto_faces, average_onto_vertices\n  //\n  // This function has been developed by: Nikolas De Giorgis, Luigi Rocca and Enrico Puppo.\n  // The algorithm is based on:\n  // Efficient Multi-scale Curvature and Crease Estimation\n  // Daniele Panozzo, Enrico Puppo, Luigi Rocca\n  // GraVisMa, 2010\ntemplate <\n  typename DerivedV, \n  typename DerivedF,\n  typename DerivedPD1, \n  typename DerivedPD2, \n  typename DerivedPV1, \n  typename DerivedPV2>\nIGL_INLINE void principal_curvature(\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  Eigen::PlainObjectBase<DerivedPD1>& PD1,\n  Eigen::PlainObjectBase<DerivedPD2>& PD2,\n  Eigen::PlainObjectBase<DerivedPV1>& PV1,\n  Eigen::PlainObjectBase<DerivedPV2>& PV2,\n  unsigned radius = 5,\n  bool useKring = true);\n}\n\n\n#ifndef IGL_STATIC_LIBRARY\n#include \"principal_curvature.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/print_gl_get.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"print_gl_get.h\"\n#ifndef IGL_NO_OPENGL\n\n#include <cstdio>\nIGL_INLINE void igl::print_gl_get(GLenum pname)\n{\n  double dM[16];\n\n  int rows = 4;\n  int cols = 4;\n  switch(pname)\n  {\n    case GL_MODELVIEW_MATRIX:\n    case GL_PROJECTION_MATRIX:\n    {\n      rows = 4;\n      cols = 4;\n      glGetDoublev(pname,dM);\n      for(int i = 0;i<rows;i++)\n      {\n        for(int j = 0;j<cols;j++)\n        {\n          printf(\"%lg \",dM[j*rows+i]);\n        }\n        printf(\"\\n\");\n      }\n      break;\n    }\n    default:\n      fprintf(stderr,\"ERROR in print_gl_get(), gl enum not recognized.\\n\");\n  }\n}\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/print_gl_get.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_PRINT_GL_GET_H\n#define IGL_PRINT_GL_GET_H\n#ifndef IGL_NO_OPENGL\n#include \"igl_inline.h\"\n\n#include \"OpenGL_convenience.h\"\n\nnamespace igl\n{\n  // Prints the value of pname found by issuing glGet*(pname,*)\n  // Inputs:\n  //   pname  enum key to gl parameter\n  IGL_INLINE void print_gl_get(GLenum pname);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"print_gl_get.cpp\"\n#endif\n\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/print_ijv.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"print_ijv.h\"\n\n#include \"find.h\"\n#include <iostream>\n\ntemplate <typename T>\nIGL_INLINE void igl::print_ijv(\n  const Eigen::SparseMatrix<T>& X,\n  const int offset)\n{\n  Eigen::Matrix<int,Eigen::Dynamic,1> I;\n  Eigen::Matrix<int,Eigen::Dynamic,1> J;\n  Eigen::Matrix<T,Eigen::Dynamic,1> V;\n  igl::find(X,I,J,V);\n  // Concatenate I,J,V\n  Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> IJV(I.size(),3);\n  IJV.col(0) = I.cast<T>();\n  IJV.col(1) = J.cast<T>();\n  IJV.col(2) = V;\n  // Offset\n  if(offset != 0)\n  {\n    IJV.col(0).array() += offset;\n    IJV.col(1).array() += offset;\n  }\n  std::cout<<IJV;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::print_ijv<double>(Eigen::SparseMatrix<double, 0, int> const&, int);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/print_ijv.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_PRINT_IJV_H\n#define IGL_PRINT_IJV_H\n#include \"igl_inline.h\"\n#define EIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET\n#include <Eigen/Dense>\n#include <Eigen/Sparse>\nnamespace igl\n{\n  // Prints a 3 column matrix representing [I,J,V] = find(X). That is, each\n  // row is the row index, column index and value for each non zero entry. Each\n  // row is printed on a new line\n  //\n  // Templates:\n  //   T  should be a eigen sparse matrix primitive type like int or double\n  // Input:\n  //   X  m by n matrix whose entries are to be sorted\n  //   offset  optional offset for I and J indices {0}\n  template <typename T>\n  IGL_INLINE void print_ijv(\n    const Eigen::SparseMatrix<T>& X, \n    const int offset=0);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"print_ijv.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/print_program_info_log.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"print_program_info_log.h\"\n#ifndef IGL_NO_OPENGL\n\n#include <cstdio>\n#include <stdlib.h>\n// Copyright Denis Kovacs 4/10/08\nIGL_INLINE void igl::print_program_info_log(const GLuint obj)\n{\n  GLint infologLength = 0;\n  GLint charsWritten  = 0;\n  char *infoLog;\n  \n  glGetProgramiv(obj, GL_INFO_LOG_LENGTH,&infologLength);\n  \n  if (infologLength > 0)\n  {\n    infoLog = (char *)malloc(infologLength);\n    glGetProgramInfoLog(obj, infologLength, &charsWritten, infoLog);\n    printf(\"%s\\n\",infoLog);\n    free(infoLog);\n  }\n}\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/print_program_info_log.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_PRINT_PROGRAM_INFO_LOG_H\n#define IGL_PRINT_PROGRAM_INFO_LOG_H\n#ifndef IGL_NO_OPENGL\n#include \"igl_inline.h\"\n\n#include \"OpenGL_convenience.h\"\n\nnamespace igl\n{\n  // Inputs:\n  //   obj  OpenGL index of program to print info log about\n  IGL_INLINE void print_program_info_log(const GLuint obj);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"print_program_info_log.cpp\"\n#endif\n\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/print_shader_info_log.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"print_shader_info_log.h\"\n#ifndef IGL_NO_OPENGL\n\n#include <cstdio>\n#include <stdlib.h>\n// Copyright Denis Kovacs 4/10/08\nIGL_INLINE void igl::print_shader_info_log(const GLuint obj)\n{\n  GLint infologLength = 0;\n  GLint charsWritten  = 0;\n  char *infoLog;\n  \n  // Get shader info log from opengl\n  glGetShaderiv(obj, GL_INFO_LOG_LENGTH,&infologLength);\n  // Only print if there is something in the log\n  if (infologLength > 0)\n  {\n    infoLog = (char *)malloc(infologLength);\n    glGetShaderInfoLog(obj, infologLength, &charsWritten, infoLog);\n    printf(\"%s\\n\",infoLog);\n    free(infoLog);\n  }\n}\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/print_shader_info_log.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_PRINT_SHADER_INFO_LOG_H\n#define IGL_PRINT_SHADER_INFO_LOG_H\n#ifndef IGL_NO_OPENGL\n#include \"igl_inline.h\"\n\n#include \"OpenGL_convenience.h\"\n\nnamespace igl\n{\n  // Inputs:\n  //   obj  OpenGL index of shader to print info log about\n  IGL_INLINE void print_shader_info_log(const GLuint obj);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"print_shader_info_log.cpp\"\n#endif\n\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/print_vector.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"print_vector.h\"\n#include <iostream>\n#include <vector>\n\n\ntemplate <typename T>\nIGL_INLINE void igl::print_vector( std::vector<T>& v)\n{\n  using namespace std;\n  for (int i=0; i<v.size(); ++i)\n    std::cerr << v[i] << \" \";\n  std::cerr << std::endl;\n}\n\ntemplate <typename T>\nIGL_INLINE void igl::print_vector( std::vector< std::vector<T> >& v)\n{\n  using namespace std;\n  for (int i=0; i<v.size(); ++i)\n  {\n    std::cerr << i << \": \";\n    for (int j=0; j<v[i].size(); ++j)\n      std::cerr << v[i][j] << \" \";\n    std::cerr << std::endl;\n  }\n}\n\n\ntemplate <typename T>\nIGL_INLINE void igl::print_vector( std::vector< std::vector< std::vector<T> > >& v)\n{\n  using namespace std;\n  for (int m=0; m<v.size(); ++m)\n  {\n    std::cerr << \"Matrix \" << m << std::endl;\n\n    for (int i=0; i<v[m].size(); ++i)\n    {\n      std::cerr << i << \": \";\n      for (int j=0; j<v[m][i].size(); ++j)\n        std::cerr << v[m][i][j] << \" \";\n      std::cerr << std::endl;\n    }\n    \n    std::cerr << \"---- end \" << m << std::endl;\n\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/print_vector.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_PRINT_VECTOR_H\n#define IGL_PRINT_VECTOR_H\n#include \"igl_inline.h\"\n\n#include <vector>\nnamespace igl \n{\n  // Not clear what these are supposed to be doing. Currently they print\n  // vectors to standard error...\n  template <typename T>\n  IGL_INLINE void print_vector( std::vector<T>& v);\n  template <typename T>\n  IGL_INLINE void print_vector( std::vector< std::vector<T> >& v);\n  template <typename T>\n  IGL_INLINE void print_vector(std::vector< std::vector< std::vector<T> > >& v);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"print_vector.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/procrustes.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Stefan Brugger <stefanbrugger@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"procrustes.h\"\n#include \"polar_svd.h\"\n#include \"polar_dec.h\"\n\ntemplate <\n  typename DerivedX,\n  typename DerivedY,\n  typename Scalar,\n  typename DerivedR,\n  typename DerivedT>\nIGL_INLINE void igl::procrustes(\n    const Eigen::PlainObjectBase<DerivedX>& X,\n    const Eigen::PlainObjectBase<DerivedY>& Y,\n    bool includeScaling,\n    bool includeReflections,\n    Scalar& scale,\n    Eigen::PlainObjectBase<DerivedR>& R,\n    Eigen::PlainObjectBase<DerivedT>& t)\n{\n  using namespace Eigen;\n  assert (X.rows() == Y.rows() && \"Same number of points\");\n  assert(X.cols() == Y.cols() && \"Points have same dimensions\");\n\n  // Center data\n  const VectorXd Xmean = X.colwise().mean();\n  const VectorXd Ymean = Y.colwise().mean();\n  MatrixXd XC = X.rowwise() - Xmean.transpose();\n  MatrixXd YC = Y.rowwise() - Ymean.transpose();\n\n  // Scale\n  scale = 1.;\n  if (includeScaling)\n  {\n     double scaleX = XC.norm() / XC.rows();\n     double scaleY = YC.norm() / YC.rows();\n     scale = scaleY/scaleX;\n     XC *= scale;\n     assert (std::abs(XC.norm() / XC.rows() - scaleY) < 1e-8);\n  }\n\n  // Rotation\n  MatrixXd S = XC.transpose() * YC;\n  MatrixXd T;\n  if (includeReflections)\n  {\n    polar_dec(S,R,T);\n  }else\n  {\n    polar_svd(S,R,T);\n  }\n//  R.transposeInPlace();\n\n  // Translation\n  t = Ymean - scale*R.transpose()*Xmean;\n}\n\n\ntemplate <\n  typename DerivedX,\n  typename DerivedY,\n  typename Scalar,\n  int DIM,\n  int TType>\nIGL_INLINE void igl::procrustes(\n    const Eigen::PlainObjectBase<DerivedX>& X,\n    const Eigen::PlainObjectBase<DerivedY>& Y,\n    bool includeScaling,\n    bool includeReflections,\n    Eigen::Transform<Scalar,DIM,TType>& T)\n{\n  using namespace Eigen;\n  double scale;\n  MatrixXd R;\n  VectorXd t;\n  procrustes(X,Y,includeScaling,includeReflections,scale,R,t);\n\n  // Combine\n  T = Translation<Scalar,DIM>(t) * R * Scaling(scale);\n}\n\ntemplate <\n  typename DerivedX,\n  typename DerivedY,\n  typename DerivedR,\n  typename DerivedT>\nIGL_INLINE void igl::procrustes(\n    const Eigen::PlainObjectBase<DerivedX>& X,\n    const Eigen::PlainObjectBase<DerivedY>& Y,\n    bool includeScaling,\n    bool includeReflections,\n    Eigen::PlainObjectBase<DerivedR>& S,\n    Eigen::PlainObjectBase<DerivedT>& t)\n{\n  double scale;\n  procrustes(X,Y,includeScaling,includeReflections,scale,S,t);\n  S *= scale;\n}\n\ntemplate <\n  typename DerivedX,\n  typename DerivedY,\n  typename DerivedR,\n  typename DerivedT>\nIGL_INLINE void igl::procrustes(\n    const Eigen::PlainObjectBase<DerivedX>& X,\n    const Eigen::PlainObjectBase<DerivedY>& Y,\n    Eigen::PlainObjectBase<DerivedR>& R,\n    Eigen::PlainObjectBase<DerivedT>& t)\n{\n  procrustes(X,Y,false,false,R,t);\n}\n\ntemplate <\n  typename DerivedX,\n  typename DerivedY,\n  typename Scalar,\n  typename DerivedT>\nIGL_INLINE void igl::procrustes(\n    const Eigen::PlainObjectBase<DerivedX>& X,\n    const Eigen::PlainObjectBase<DerivedY>& Y,\n    Eigen::Rotation2D<Scalar>& R,\n    Eigen::PlainObjectBase<DerivedT>& t)\n{\n  using namespace Eigen;\n  assert (X.cols() == 2 && Y.cols() == 2 && \"Points must have dimension 2\");\n  Matrix2d Rmat;\n  procrustes(X,Y,false,false,Rmat,t);\n  R.fromRotationMatrix(Rmat);\n}\n\n#ifdef IGL_STATIC_LIBRARY\ntemplate void igl::procrustes<Eigen::Matrix<double, 3, 2, 0, 3, 2>, Eigen::Matrix<double, 3, 2, 0, 3, 2>, double, Eigen::Matrix<double, 2, 2, 0, 2, 2>, Eigen::Matrix<double, 2, 1, 0, 2, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 2, 0, 3, 2> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 2, 0, 3, 2> > const&, bool, bool, double&, Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 2, 0, 2, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 1, 0, 2, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/procrustes.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Stefan Brugger <stefanbrugger@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_PROCRUSTES_H\n#define IGL_PROCRUSTES_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Dense>\n#include <Eigen/Geometry>\n\nnamespace igl\n{\n  // Solve Procrustes problem in d dimensions.  Given two point sets X,Y in R^d\n  // find best scale s, orthogonal R  and translation t s.t. |s*X*R + t - Y|^2\n  // is minimized.\n  //\n  // Templates:\n  //    DerivedV point type\n  //    Scalar   scalar type\n  //    DerivedR type of R\n  //    DerivedT type of t\n  // Inputs:\n  //    X  #V by DIM first list of points\n  //    Y  #V by DIM second list of points\n  //    includeScaling  if scaling should be allowed\n  //    includeReflections  if R is allowed to be a reflection\n  // Outputs:\n  //    scale  scaling\n  //    R      orthogonal matrix\n  //    t      translation\n  //\n  // Example:\n  //   MatrixXd X, Y; (containing 3d points as rows)\n  //   double scale;\n  //   MatrixXd R;\n  //   VectorXd t;\n  //   igl::procrustes(X,Y,true,false,scale,R,t);\n  //   R *= scale;\n  //   MatrixXd Xprime = (X * R).rowwise() + t.transpose();\n  //\n  template <\n    typename DerivedX, \n    typename DerivedY, \n    typename Scalar, \n    typename DerivedR, \n    typename DerivedT>\n  IGL_INLINE void procrustes(\n    const Eigen::PlainObjectBase<DerivedX>& X,\n    const Eigen::PlainObjectBase<DerivedY>& Y,\n    bool includeScaling,\n    bool includeReflections,\n    Scalar& scale,\n    Eigen::PlainObjectBase<DerivedR>& R,\n    Eigen::PlainObjectBase<DerivedT>& t);\n  // Same as above but returns Eigen transformation object.\n  //\n  // Templates:\n  //    DerivedV point type\n  //    Scalar   scalar type\n  //    DIM      point dimension\n  //    TType    type of transformation\n  //             (Isometry,Affine,AffineCompact,Projective)\n  // Inputs:\n  //    X  #V by DIM first list of points\n  //    Y  #V by DIM second list of points\n  //    includeScaling  if scaling should be allowed\n  //    includeReflections  if R is allowed to be a reflection\n  // Outputs:\n  //    T  transformation that minimizes error    \n  //\n  // Example:\n  //   MatrixXd X, Y; (containing 3d points as rows)\n  //   AffineCompact3d T;\n  //   igl::procrustes(X,Y,true,false,T);\n  //   MatrixXd Xprime = (X * T.linear()).rowwise() + T.translation().transpose();\n  template <\n    typename DerivedX, \n    typename DerivedY, \n    typename Scalar, \n    int DIM, \n    int TType>\n  IGL_INLINE void procrustes(\n    const Eigen::PlainObjectBase<DerivedX>& X,\n    const Eigen::PlainObjectBase<DerivedY>& Y,\n    bool includeScaling,\n    bool includeReflections,\n    Eigen::Transform<Scalar,DIM,TType>& T);\n\n\n  // Convenient wrapper that returns S=scale*R instead of scale and R separately\n  template <\n    typename DerivedX, \n    typename DerivedY, \n    typename DerivedR, \n    typename DerivedT>\n  IGL_INLINE void procrustes(\n    const Eigen::PlainObjectBase<DerivedX>& X,\n    const Eigen::PlainObjectBase<DerivedY>& Y,\n    bool includeScaling,\n    bool includeReflections,\n    Eigen::PlainObjectBase<DerivedR>& S,\n    Eigen::PlainObjectBase<DerivedT>& t);\n\n  // Convenient wrapper for rigid case (no scaling, no reflections)\n  template <\n    typename DerivedX, \n    typename DerivedY, \n    typename DerivedR, \n    typename DerivedT>\n  IGL_INLINE void procrustes(\n    const Eigen::PlainObjectBase<DerivedX>& X,\n    const Eigen::PlainObjectBase<DerivedY>& Y,\n    Eigen::PlainObjectBase<DerivedR>& R,\n    Eigen::PlainObjectBase<DerivedT>& t);\n\n  // Convenient wrapper for 2D case.\n  template <\n    typename DerivedX, \n    typename DerivedY, \n    typename Scalar, \n    typename DerivedT>\n  IGL_INLINE void procrustes(\n    const Eigen::PlainObjectBase<DerivedX>& X,\n    const Eigen::PlainObjectBase<DerivedY>& Y,\n    Eigen::Rotation2D<Scalar>& R,\n    Eigen::PlainObjectBase<DerivedT>& t);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n  #include \"procrustes.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/project.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"project.h\"\n\ntemplate <typename Scalar>\nEigen::Matrix<Scalar,3,1> igl::project(\n  const    Eigen::Matrix<Scalar,3,1>&  obj,\n  const    Eigen::Matrix<Scalar,4,4>& model,\n  const    Eigen::Matrix<Scalar,4,4>& proj,\n  const    Eigen::Matrix<Scalar,4,1>&  viewport)\n{\n  Eigen::Matrix<Scalar,4,1> tmp;\n  tmp << obj,1;\n\n  tmp = model * tmp;\n\n  tmp = proj * tmp;\n\n  tmp = tmp.array() / tmp(3);\n  tmp = tmp.array() * 0.5f + 0.5f;\n  tmp(0) = tmp(0) * viewport(2) + viewport(0);\n  tmp(1) = tmp(1) * viewport(3) + viewport(1);\n\n  return tmp.head(3);\n}\n\ntemplate <typename DerivedV, typename DerivedM, typename DerivedN, typename DerivedO, typename DerivedP>\nIGL_INLINE void igl::project(\n  const    Eigen::PlainObjectBase<DerivedV>&  V,\n  const    Eigen::MatrixBase<DerivedM>& model,\n  const    Eigen::MatrixBase<DerivedN>& proj,\n  const    Eigen::MatrixBase<DerivedO>&  viewport,\n  Eigen::PlainObjectBase<DerivedP> & P)\n{\n  typedef typename DerivedP::Scalar PScalar;\n  Eigen::Matrix<PScalar,DerivedV::RowsAtCompileTime,4> HV(V.rows(),4);\n  HV.leftCols(3) = V.template cast<PScalar>();\n  HV.col(3).setConstant(1);\n  HV = (HV*model.template cast<PScalar>().transpose()*\n      proj.template cast<PScalar>().transpose()).eval();\n  HV = (HV.array().colwise()/HV.col(3).array()).eval();\n  HV = (HV.array() * 0.5 + 0.5).eval();\n  HV.col(0) = (HV.array().col(0) * viewport(2) + viewport(0)).eval();\n  HV.col(1) = (HV.array().col(1) * viewport(3) + viewport(1)).eval();\n  P = HV.leftCols(3);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate Eigen::Matrix<double, 3, 1, 0, 3, 1> igl::project<double>(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, Eigen::Matrix<double, 4, 4, 0, 4, 4> const&, Eigen::Matrix<double, 4, 4, 0, 4, 4> const&, Eigen::Matrix<double, 4, 1, 0, 4, 1> const&);\ntemplate Eigen::Matrix<float, 3, 1, 0, 3, 1> igl::project<float>(Eigen::Matrix<float, 3, 1, 0, 3, 1> const&, Eigen::Matrix<float, 4, 4, 0, 4, 4> const&, Eigen::Matrix<float, 4, 4, 0, 4, 4> const&, Eigen::Matrix<float, 4, 1, 0, 4, 1> const&);\ntemplate void igl::project<Eigen::Matrix<float, -1, -1, 0, -1, -1>, Eigen::Matrix<float, 4, 4, 0, 4, 4>, Eigen::Matrix<float, 4, 4, 0, 4, 4>, Eigen::Matrix<float, 4, 1, 0, 4, 1>, Eigen::Matrix<float, -1, -1, 0, -1, -1>>(const Eigen::PlainObjectBase<Eigen::Matrix<float, -1, -1, 0, -1, -1>>&, const Eigen::MatrixBase<Eigen::Matrix<float, 4, 4, 0, 4, 4>>&, const Eigen::MatrixBase<Eigen::Matrix<float, 4, 4, 0, 4, 4>>&, const Eigen::MatrixBase<Eigen::Matrix<float, 4, 1, 0, 4, 1>>&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, -1, 0, -1, -1>>&);\ntemplate void igl::project<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, 4, 4, 0, 4, 4>, Eigen::Matrix<double, 4, 4, 0, 4, 4>, Eigen::Matrix<double, 4, 1, 0, 4, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>>(const Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1>>&, const Eigen::MatrixBase<Eigen::Matrix<double, 4, 4, 0, 4, 4>>&, const Eigen::MatrixBase<Eigen::Matrix<double, 4, 4, 0, 4, 4>>&, const Eigen::MatrixBase<Eigen::Matrix<double, 4, 1, 0, 4, 1>>&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1>>&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/project.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_PROJECT_H\n#define IGL_PROJECT_H\n#include \"igl_inline.h\"\n#include <Eigen/Dense>\nnamespace igl\n{\n  // Eigen reimplementation of gluProject\n  // Inputs:\n  //   obj*  3D objects' x, y, and z coordinates respectively\n  //   model  model matrix\n  //   proj  projection matrix\n  //   viewport  viewport vector\n  // Returns:\n  //   screen space x, y, and z coordinates respectively\n  template <typename Scalar>\n  IGL_INLINE Eigen::Matrix<Scalar,3,1> project(\n    const    Eigen::Matrix<Scalar,3,1>&  obj,\n    const    Eigen::Matrix<Scalar,4,4>& model,\n    const    Eigen::Matrix<Scalar,4,4>& proj,\n    const    Eigen::Matrix<Scalar,4,1>&  viewport);\n  // Inputs:\n  //   V  #V by 3 list of object points\n  //   model  model matrix\n  //   proj  projection matrix\n  //   viewport  viewport vector\n  // Outputs:\n  //   P  #V by 3 list of screen space points\n  template <typename DerivedV, typename DerivedM, typename DerivedN, typename DerivedO, typename DerivedP>\n  IGL_INLINE void project(\n    const    Eigen::PlainObjectBase<DerivedV>&  V,\n    const    Eigen::MatrixBase<DerivedM>& model,\n    const    Eigen::MatrixBase<DerivedN>& proj,\n    const    Eigen::MatrixBase<DerivedO>&  viewport,\n    Eigen::PlainObjectBase<DerivedP> & P);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"project.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/project_isometrically_to_plane.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"project_isometrically_to_plane.h\"\n#include \"edge_lengths.h\"\n\ntemplate <\n  typename DerivedV, \n  typename DerivedF,\n  typename DerivedU,\n  typename DerivedUF,\n  typename Scalar>\nIGL_INLINE void igl::project_isometrically_to_plane(\n  const Eigen::PlainObjectBase<DerivedV> & V, \n  const Eigen::PlainObjectBase<DerivedF> & F, \n  Eigen::PlainObjectBase<DerivedU> & U,\n  Eigen::PlainObjectBase<DerivedUF> & UF, \n  Eigen::SparseMatrix<Scalar>& I)\n{\n  using namespace std;\n  using namespace Eigen;\n  assert(F.cols() == 3 && \"F should contain triangles\");\n  typedef DerivedV MatrixX;\n  MatrixX l;\n  edge_lengths(V,F,l);\n  // Number of faces\n  const int m = F.rows();\n\n  // First corner at origin\n  U = DerivedU::Zero(m*3,2);\n  // Second corner along x-axis\n  U.block(m,0,m,1) = l.col(2);\n  // Third corner rotated onto plane\n  U.block(m*2,0,m,1) = \n    (-l.col(0).array().square() + \n     l.col(1).array().square() + \n     l.col(2).array().square())/(2.*l.col(2).array());\n  U.block(m*2,1,m,1) =\n    (l.col(1).array().square()-U.block(m*2,0,m,1).array().square()).sqrt();\n\n  typedef Triplet<Scalar> IJV;\n  vector<IJV > ijv;\n  ijv.reserve(3*m);\n  UF.resize(m,3);\n  for(int f = 0;f<m;f++)\n  {\n    for(int c = 0;c<3;c++)\n    {\n      UF(f,c) = c*m+f;\n      ijv.push_back(IJV(F(f,c),c*m+f,1));\n    }\n  }\n  I.resize(V.rows(),m*3);\n  I.setFromTriplets(ijv.begin(),ijv.end());\n}\n\n#ifdef IGL_STATIC_LIBRARY\ntemplate void igl::project_isometrically_to_plane<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, double>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::SparseMatrix<double, 0, int>&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/project_isometrically_to_plane.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_PROJECT_ISOMETRICALLY_TO_PLANE_H\n#define IGL_PROJECT_ISOMETRICALLY_TO_PLANE_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Dense>\n#include <Eigen/Sparse>\n\nnamespace igl \n{\n  // Project each triangle to the plane\n  //\n  // [U,UF,I] = project_isometrically_to_plane(V,F)\n  //\n  // Inputs:\n  //   V  #V by 3 list of vertex positions\n  //   F  #F by 3 list of mesh indices\n  // Outputs:\n  //   U  #F*3 by 2 list of triangle positions\n  //   UF  #F by 3 list of mesh indices into U\n  //   I  #V by #F such that I(i,j) = 1 implies U(j,:) corresponds to V(i,:)\n  //\n  template <\n    typename DerivedV, \n    typename DerivedF,\n    typename DerivedU,\n    typename DerivedUF,\n    typename Scalar>\n  IGL_INLINE void project_isometrically_to_plane(\n    const Eigen::PlainObjectBase<DerivedV> & V, \n    const Eigen::PlainObjectBase<DerivedF> & F, \n    Eigen::PlainObjectBase<DerivedU> & U,\n    Eigen::PlainObjectBase<DerivedUF> & UF, \n    Eigen::SparseMatrix<Scalar>& I);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"project_isometrically_to_plane.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/project_to_line.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"project_to_line.h\"\n#include <cassert>\n#include <Eigen/Core>\n\ntemplate <\n  typename DerivedP, \n  typename DerivedS, \n  typename DerivedD, \n  typename Derivedt, \n  typename DerivedsqrD>\nIGL_INLINE void igl::project_to_line(\n  const Eigen::MatrixBase<DerivedP> & P,\n  const Eigen::MatrixBase<DerivedS> & S,\n  const Eigen::MatrixBase<DerivedD> & D,\n  Eigen::PlainObjectBase<Derivedt> & t,\n  Eigen::PlainObjectBase<DerivedsqrD> & sqrD)\n{\n  // http://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html\n\n  // number of dimensions\n#ifndef NDEBUG\n  int dim = P.cols();\n  assert(dim == S.size());\n  assert(dim == D.size());\n#endif\n  // number of points\n  int np  = P.rows();\n  // vector from source to destination\n  DerivedD DmS = D-S;\n  double v_sqrlen = (double)(DmS.squaredNorm());\n  assert(v_sqrlen != 0);\n  // resize output\n  t.resize(np,1);\n  sqrD.resize(np,1);\n  // loop over points\n#pragma omp parallel for if (np>10000)\n  for(int i = 0;i<np;i++)\n  {\n    const typename DerivedP::ConstRowXpr Pi = P.row(i);\n    // vector from point i to source\n    const DerivedD SmPi = S-Pi;\n    t(i) = -(DmS.array()*SmPi.array()).sum() / v_sqrlen;\n    // P projected onto line\n    const DerivedD projP = (1-t(i))*S + t(i)*D;\n    sqrD(i) = (Pi-projP).squaredNorm();\n  }\n}\n\ntemplate <typename Scalar>\nIGL_INLINE void igl::project_to_line(\n  const Scalar px,\n  const Scalar py,\n  const Scalar pz,\n  const Scalar sx,\n  const Scalar sy,\n  const Scalar sz,\n  const Scalar dx,\n  const Scalar dy,\n  const Scalar dz,\n  Scalar & projpx,\n  Scalar & projpy,\n  Scalar & projpz,\n  Scalar & t,\n  Scalar & sqrd)\n{\n  // vector from source to destination\n  Scalar dms[3];\n  dms[0] = dx-sx;\n  dms[1] = dy-sy;\n  dms[2] = dz-sz;\n  Scalar v_sqrlen = dms[0]*dms[0] + dms[1]*dms[1] + dms[2]*dms[2];\n  // line should have some length\n  assert(v_sqrlen != 0);\n  // vector from point to source\n  Scalar smp[3];\n  smp[0] = sx-px;\n  smp[1] = sy-py;\n  smp[2] = sz-pz;\n  t = -(dms[0]*smp[0]+dms[1]*smp[1]+dms[2]*smp[2])/v_sqrlen;\n  // P projectred onto line\n  projpx = (1.0-t)*sx + t*dx;\n  projpy = (1.0-t)*sy + t*dy;\n  projpz = (1.0-t)*sz + t*dz;\n  // vector from projected point to p\n  Scalar pmprojp[3];\n  pmprojp[0] = px-projpx;\n  pmprojp[1] = py-projpy;\n  pmprojp[2] = pz-projpz;\n  sqrd = pmprojp[0]*pmprojp[0] + pmprojp[1]*pmprojp[1] + pmprojp[2]*pmprojp[2];\n}\n\ntemplate <typename Scalar>\nIGL_INLINE void igl::project_to_line(\n  const Scalar px,\n  const Scalar py,\n  const Scalar pz,\n  const Scalar sx,\n  const Scalar sy,\n  const Scalar sz,\n  const Scalar dx,\n  const Scalar dy,\n  const Scalar dz,\n  Scalar & t,\n  Scalar & sqrd)\n{\n  Scalar projpx;\n  Scalar projpy;\n  Scalar projpz;\n  return igl::project_to_line(\n    px, py, pz, sx, sy, sz, dx, dy, dz,\n    projpx, projpy, projpz, t, sqrd);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::project_to_line<Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, -1, -1, false>, Eigen::Matrix<double, 1, -1, 1, 1, -1>, Eigen::Matrix<double, 1, -1, 1, 1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, -1, -1, false> > const&, Eigen::MatrixBase<Eigen::Matrix<double, 1, -1, 1, 1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, 1, -1, 1, 1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::project_to_line<Eigen::Block<Eigen::Matrix<double, -1, 2, 0, -1, 2> const, -1, -1, false>, Eigen::Matrix<double, 1, 2, 1, 1, 2>, Eigen::Matrix<double, 1, 2, 1, 1, 2>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Block<Eigen::Matrix<double, -1, 2, 0, -1, 2> const, -1, -1, false> > const&, Eigen::MatrixBase<Eigen::Matrix<double, 1, 2, 1, 1, 2> > const&, Eigen::MatrixBase<Eigen::Matrix<double, 1, 2, 1, 1, 2> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::project_to_line<Eigen::Matrix<double, 1, 2, 1, 1, 2>, Eigen::Matrix<double, 1, 2, 1, 1, 2>, Eigen::Matrix<double, 1, 2, 1, 1, 2>, Eigen::Matrix<double, 1, 1, 0, 1, 1>, Eigen::Matrix<double, 1, 1, 0, 1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, 1, 2, 1, 1, 2> > const&, Eigen::MatrixBase<Eigen::Matrix<double, 1, 2, 1, 1, 2> > const&, Eigen::MatrixBase<Eigen::Matrix<double, 1, 2, 1, 1, 2> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 1, 0, 1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 1, 0, 1, 1> >&);\ntemplate void igl::project_to_line<double>(double, double, double, double, double, double, double, double, double, double&, double&);\ntemplate void igl::project_to_line<double>(double, double, double, double, double, double, double, double, double, double&, double&,double&,double&, double&);\ntemplate void igl::project_to_line<Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix<double, 1, 1, 0, 1, 1>, Eigen::Matrix<double, 1, 1, 0, 1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 1, 0, 1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 1, 0, 1, 1> >&);\ntemplate void igl::project_to_line<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/project_to_line.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_PROJECT_TO_LINE_H\n#define IGL_PROJECT_TO_LINE_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n\nnamespace igl\n{\n  // PROJECT_TO_LINE  project points onto vectors, that is find the paramter\n  // t for a point p such that proj_p = (y-x).*t, additionally compute the\n  // squared distance from p to the line of the vector, such that \n  // |p - proj_p|² = sqr_d\n  //\n  // [T,sqrD] = project_to_line(P,S,D)\n  //\n  // Inputs:\n  //   P  #P by dim list of points to be projected\n  //   S  size dim start position of line vector\n  //   D  size dim destination position of line vector\n  // Outputs:\n  //   T  #P by 1 list of parameters\n  //   sqrD  #P by 1 list of squared distances\n  //\n  //\n  template <\n    typename DerivedP, \n    typename DerivedS, \n    typename DerivedD, \n    typename Derivedt, \n    typename DerivedsqrD>\n  IGL_INLINE void project_to_line(\n    const Eigen::MatrixBase<DerivedP> & P,\n    const Eigen::MatrixBase<DerivedS> & S,\n    const Eigen::MatrixBase<DerivedD> & D,\n    Eigen::PlainObjectBase<Derivedt> & t,\n    Eigen::PlainObjectBase<DerivedsqrD> & sqrD);\n\n  // Same as above but for a single query point\n  template <typename Scalar>\n  IGL_INLINE void project_to_line(\n    const Scalar px,\n    const Scalar py,\n    const Scalar pz,\n    const Scalar sx,\n    const Scalar sy,\n    const Scalar sz,\n    const Scalar dx,\n    const Scalar dy,\n    const Scalar dz,\n    Scalar & projpx,\n    Scalar & projpy,\n    Scalar & projpz,\n    Scalar & t,\n    Scalar & sqrd);\n  \n  // Same as above but for a single query point\n  template <typename Scalar>\n  IGL_INLINE void project_to_line(\n    const Scalar px,\n    const Scalar py,\n    const Scalar pz,\n    const Scalar sx,\n    const Scalar sy,\n    const Scalar sz,\n    const Scalar dx,\n    const Scalar dy,\n    const Scalar dz,\n    Scalar & t,\n    Scalar & sqrd);\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"project_to_line.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/project_to_line_segment.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"project_to_line_segment.h\"\n#include \"project_to_line.h\"\n#include <Eigen/Core>\n\ntemplate <\n  typename DerivedP,\n  typename DerivedS,\n  typename DerivedD,\n  typename Derivedt,\n  typename DerivedsqrD>\nIGL_INLINE void igl::project_to_line_segment(\n  const Eigen::MatrixBase<DerivedP> & P,\n  const Eigen::MatrixBase<DerivedS> & S,\n  const Eigen::MatrixBase<DerivedD> & D,\n  Eigen::PlainObjectBase<Derivedt> & t,\n  Eigen::PlainObjectBase<DerivedsqrD> & sqrD)\n{\n  project_to_line(P,S,D,t,sqrD);\n  const int np = P.rows();\n  // loop over points and fix those that projected beyond endpoints\n#pragma omp parallel for if (np>10000)\n  for(int p = 0;p<np;p++)\n  {\n    const DerivedP Pp = P.row(p);\n    if(t(p)<0)\n    {\n      sqrD(p) = (Pp-S).squaredNorm();\n      t(p) = 0;\n    }else if(t(p)>1)\n    {\n      sqrD(p) = (Pp-D).squaredNorm();\n      t(p) = 1;\n    }\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::project_to_line_segment<Eigen::Matrix<double, 1, 2, 1, 1, 2>, Eigen::Matrix<double, 1, 2, 1, 1, 2>, Eigen::Matrix<double, 1, 2, 1, 1, 2>, Eigen::Matrix<double, 1, 1, 0, 1, 1>, Eigen::Matrix<double, 1, 1, 0, 1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, 1, 2, 1, 1, 2> > const&, Eigen::MatrixBase<Eigen::Matrix<double, 1, 2, 1, 1, 2> > const&, Eigen::MatrixBase<Eigen::Matrix<double, 1, 2, 1, 1, 2> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 1, 0, 1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 1, 0, 1, 1> >&);\ntemplate void igl::project_to_line_segment<Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix<double, 1, 1, 0, 1, 1>, Eigen::Matrix<double, 1, 1, 0, 1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 1, 0, 1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 1, 0, 1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/project_to_line_segment.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_PROJECT_TO_LINE_SEGMENT_H\n#define IGL_PROJECT_TO_LINE_SEGMENT_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n\nnamespace igl\n{\n  // PROJECT_TO_LINE_SEGMENT project points onto vectors, that is find the paramter\n  // t for a point p such that proj_p = (y-x).*t, additionally compute the\n  // squared distance from p to the line of the vector, such that \n  // |p - proj_p|² = sqr_d\n  //\n  // [T,sqrD] = project_to_line_segment(P,S,D)\n  //\n  // Inputs:\n  //   P  #P by dim list of points to be projected\n  //   S  size dim start position of line vector\n  //   D  size dim destination position of line vector\n  // Outputs:\n  //   T  #P by 1 list of parameters\n  //   sqrD  #P by 1 list of squared distances\n  //\n  //\n  template <\n    typename DerivedP, \n    typename DerivedS, \n    typename DerivedD, \n    typename Derivedt, \n    typename DerivedsqrD>\n  IGL_INLINE void project_to_line_segment(\n    const Eigen::MatrixBase<DerivedP> & P,\n    const Eigen::MatrixBase<DerivedS> & S,\n    const Eigen::MatrixBase<DerivedD> & D,\n    Eigen::PlainObjectBase<Derivedt> & t,\n    Eigen::PlainObjectBase<DerivedsqrD> & sqrD);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"project_to_line_segment.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/pseudonormal_test.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"pseudonormal_test.h\"\n#include \"barycentric_coordinates.h\"\n#include \"doublearea.h\"\n#include \"project_to_line_segment.h\"\n#include <cassert>\n\nIGL_INLINE void igl::pseudonormal_test(\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  const Eigen::MatrixXd & FN,\n  const Eigen::MatrixXd & VN,\n  const Eigen::MatrixXd & EN,\n  const Eigen::VectorXi & EMAP,\n  const Eigen::RowVector3d & q,\n  const int f,\n  const Eigen::RowVector3d & c,\n  double & s,\n  Eigen::RowVector3d & n)\n{\n  using namespace Eigen;\n  const auto & qc = q-c;\n  RowVector3d b;\n  // Using barycentric coorindates to determine whether close to a vertex/edge\n  // seems prone to error when dealing with nearly degenerate triangles: Even\n  // the barycenter (1/3,1/3,1/3) can be made arbitrarily close to an\n  // edge/vertex\n  //\n  const RowVector3d A = V.row(F(f,0));\n  const RowVector3d B = V.row(F(f,1));\n  const RowVector3d C = V.row(F(f,2));\n\n  const double area = [&A,&B,&C]()\n  {\n    Matrix<double,1,1> area;\n    doublearea(A,B,C,area);\n    return area(0);\n  }();\n  // These were chosen arbitrarily. In a floating point scenario, I'm not sure\n  // the best way to determine if c is on a vertex/edge or in the middle of the\n  // face: specifically, I'm worrying about degenerate triangles where\n  // barycentric coordinates are error-prone.\n  const double MIN_DOUBLE_AREA = 1e-4;\n  const double epsilon = 1e-12;\n  if(area>MIN_DOUBLE_AREA)\n  {\n    barycentric_coordinates( c,A,B,C,b);\n    // Determine which normal to use\n    const int type = (b.array()<=epsilon).cast<int>().sum();\n    switch(type)\n    {\n      case 2:\n        // Find vertex\n        for(int x = 0;x<3;x++)\n        {\n          if(b(x)>epsilon)\n          {\n            n = VN.row(F(f,x));\n            break;\n          }\n        }\n        break;\n      case 1:\n        // Find edge\n        for(int x = 0;x<3;x++)\n        {\n          if(b(x)<=epsilon)\n          {\n            n = EN.row(EMAP(F.rows()*x+f));\n            break;\n          }\n        }\n        break;\n      default:\n        assert(false && \"all barycentric coords zero.\");\n      case 0:\n        n = FN.row(f);\n        break;\n    }\n  }else\n  {\n    // Check each vertex\n    bool found = false;\n    for(int v = 0;v<3 && !found;v++)\n    {\n      if( (c-V.row(F(f,v))).norm() < epsilon)\n      {\n        found = true;\n        n = VN.row(F(f,v));\n      }\n    }\n    // Check each edge\n    for(int e = 0;e<3 && !found;e++)\n    {\n      const RowVector3d s = V.row(F(f,(e+1)%3));\n      const RowVector3d d = V.row(F(f,(e+2)%3));\n      Matrix<double,1,1> sqr_d_j_x(1,1);\n      Matrix<double,1,1> t(1,1);\n      project_to_line_segment(c,s,d,t,sqr_d_j_x);\n      if(sqrt(sqr_d_j_x(0)) < epsilon)\n      {\n        n = EN.row(EMAP(F.rows()*e+f));\n        found = true;\n      }\n    }\n    // Finally just use face\n    if(!found)\n    {\n      n = FN.row(f);\n    }\n  }\n  s = (qc.dot(n) >= 0 ? 1. : -1.);\n}\n\nIGL_INLINE void igl::pseudonormal_test(\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & E,\n  const Eigen::MatrixXd & EN,\n  const Eigen::MatrixXd & VN,\n  const Eigen::RowVector2d & q,\n  const int e,\n  const Eigen::RowVector2d & c,\n  double & s,\n  Eigen::RowVector2d & n)\n{\n  using namespace Eigen;\n  const auto & qc = q-c;\n  const double len = (V.row(E(e,1))-V.row(E(e,0))).norm();\n  // barycentric coordinates\n  RowVector2d b((c-V.row(E(e,1))).norm()/len,(c-V.row(E(e,0))).norm()/len);\n  // Determine which normal to use\n  const double epsilon = 1e-12;\n  const int type = (b.array()<=epsilon).cast<int>().sum();\n  switch(type)\n  {\n    case 1:\n      // Find vertex\n      for(int x = 0;x<2;x++)\n      {\n        if(b(x)>epsilon)\n        {\n          n = VN.row(E(e,x));\n          break;\n        }\n      }\n      break;\n    default:\n      assert(false && \"all barycentric coords zero.\");\n    case 0:\n      n = EN.row(e);\n      break;\n  }\n  s = (qc.dot(n) >= 0 ? 1. : -1.);\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/pseudonormal_test.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_PSEUDONORMAL_TEST_H\n#define IGL_PSEUDONORMAL_TEST_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Given a mesh (V,F), a query point q, and a point on (V,F) c, determine\n  // whether q is inside (V,F) --> s=-1 or outside (V,F) s=1, based on the\n  // sign of the dot product between (q-c) and n, where n is the normal _at c_,\n  // carefully chosen according to [Bærentzen & Aanæs 2005]\n  //\n  // Inputs:\n  //   V  #V by 3 list of vertex positions\n  //   F  #F by 3 list of triangle indices\n  //   FN  #F by 3 list of triangle normals \n  //   VN  #V by 3 list of vertex normals (ANGLE WEIGHTING)\n  //   EN  #E by 3 list of edge normals (UNIFORM WEIGHTING)\n  //   EMAP  #F*3 mapping edges in F to E\n  //   q  Query point\n  //   i  index into F to face to which c belongs\n  //   c  Point on (V,F)\n  // Outputs:\n  //   s  sign\n  //   n  normal\n  IGL_INLINE void pseudonormal_test(\n    const Eigen::MatrixXd & V,\n    const Eigen::MatrixXi & F,\n    const Eigen::MatrixXd & FN,\n    const Eigen::MatrixXd & VN,\n    const Eigen::MatrixXd & EN,\n    const Eigen::VectorXi & EMAP,\n    const Eigen::RowVector3d & q,\n    const int i,\n    const Eigen::RowVector3d & c,\n    double & s,\n    Eigen::RowVector3d & n);\n  IGL_INLINE void pseudonormal_test(\n    const Eigen::MatrixXd & V,\n    const Eigen::MatrixXi & E,\n    const Eigen::MatrixXd & EN,\n    const Eigen::MatrixXd & VN,\n    const Eigen::RowVector2d & q,\n    const int i,\n    const Eigen::RowVector2d & c,\n    double & s,\n    Eigen::RowVector2d & n);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"pseudonormal_test.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/qslim.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"qslim.h\"\n\n#include \"collapse_edge.h\"\n#include \"connect_boundary_to_infinity.h\"\n#include \"decimate.h\"\n#include \"edge_flaps.h\"\n#include \"max_faces_stopping_condition.h\"\n#include \"per_vertex_point_to_plane_quadrics.h\"\n#include \"qslim_optimal_collapse_edge_callbacks.h\"\n#include \"quadric_binary_plus_operator.h\"\n#include \"remove_unreferenced.h\"\n#include \"slice.h\"\n#include \"slice_mask.h\"\n\nIGL_INLINE bool igl::qslim(\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  const size_t max_m,\n  Eigen::MatrixXd & U,\n  Eigen::MatrixXi & G,\n  Eigen::VectorXi & J,\n  Eigen::VectorXi & I)\n{\n  using namespace igl;\n\n  // Original number of faces\n  const int orig_m = F.rows();\n  // Tracking number of faces\n  int m = F.rows();\n  typedef Eigen::MatrixXd DerivedV;\n  typedef Eigen::MatrixXi DerivedF;\n  DerivedV VO;\n  DerivedF FO;\n  igl::connect_boundary_to_infinity(V,F,VO,FO);\n  Eigen::VectorXi EMAP;\n  Eigen::MatrixXi E,EF,EI;\n  edge_flaps(FO,E,EMAP,EF,EI);\n  // Quadrics per vertex\n  typedef std::tuple<Eigen::MatrixXd,Eigen::RowVectorXd,double> Quadric;\n  std::vector<Quadric> quadrics;\n  per_vertex_point_to_plane_quadrics(VO,FO,EMAP,EF,EI,quadrics);\n  // State variables keeping track of edge we just collapsed\n  int v1 = -1;\n  int v2 = -1;\n  // Callbacks for computing and updating metric\n  std::function<void(\n    const int e,\n    const Eigen::MatrixXd &,\n    const Eigen::MatrixXi &,\n    const Eigen::MatrixXi &,\n    const Eigen::VectorXi &,\n    const Eigen::MatrixXi &,\n    const Eigen::MatrixXi &,\n    double &,\n    Eigen::RowVectorXd &)> cost_and_placement;\n  std::function<bool(\n    const Eigen::MatrixXd &                                         ,/*V*/\n    const Eigen::MatrixXi &                                         ,/*F*/\n    const Eigen::MatrixXi &                                         ,/*E*/\n    const Eigen::VectorXi &                                         ,/*EMAP*/\n    const Eigen::MatrixXi &                                         ,/*EF*/\n    const Eigen::MatrixXi &                                         ,/*EI*/\n    const std::set<std::pair<double,int> > &                        ,/*Q*/\n    const std::vector<std::set<std::pair<double,int> >::iterator > &,/*Qit*/\n    const Eigen::MatrixXd &                                         ,/*C*/\n    const int                                                        /*e*/\n    )> pre_collapse;\n  std::function<void(\n    const Eigen::MatrixXd &                                         ,   /*V*/\n    const Eigen::MatrixXi &                                         ,   /*F*/\n    const Eigen::MatrixXi &                                         ,   /*E*/\n    const Eigen::VectorXi &                                         ,/*EMAP*/\n    const Eigen::MatrixXi &                                         ,  /*EF*/\n    const Eigen::MatrixXi &                                         ,  /*EI*/\n    const std::set<std::pair<double,int> > &                        ,   /*Q*/\n    const std::vector<std::set<std::pair<double,int> >::iterator > &, /*Qit*/\n    const Eigen::MatrixXd &                                         ,   /*C*/\n    const int                                                       ,   /*e*/\n    const int                                                       ,  /*e1*/\n    const int                                                       ,  /*e2*/\n    const int                                                       ,  /*f1*/\n    const int                                                       ,  /*f2*/\n    const bool                                                  /*collapsed*/\n    )> post_collapse;\n  qslim_optimal_collapse_edge_callbacks(\n    E,quadrics,v1,v2, cost_and_placement, pre_collapse,post_collapse);\n  // Call to greedy decimator\n  bool ret = decimate(\n    VO, FO,\n    cost_and_placement,\n    max_faces_stopping_condition(m,orig_m,max_m),\n    pre_collapse,\n    post_collapse,\n    E, EMAP, EF, EI,\n    U, G, J, I);\n  // Remove phony boundary faces and clean up\n  const Eigen::Array<bool,Eigen::Dynamic,1> keep = (J.array()<orig_m);\n  igl::slice_mask(Eigen::MatrixXi(G),keep,1,G);\n  igl::slice_mask(Eigen::VectorXi(J),keep,1,J);\n  Eigen::VectorXi _1,I2;\n  igl::remove_unreferenced(Eigen::MatrixXd(U),Eigen::MatrixXi(G),U,G,_1,I2);\n  igl::slice(Eigen::VectorXi(I),I2,1,I);\n\n  return ret;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/qslim.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_QSLIM_H\n#define IGL_QSLIM_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n\n  // Decimate (simplify) a triangle mesh in nD according to the paper\n  // \"Simplifying Surfaces with Color and Texture using Quadric Error Metrics\"\n  // by [Garland and Heckbert, 1987] (technically a followup to qslim). The\n  // mesh can have open boundaries but should be edge-manifold.\n  //\n  // Inputs:\n  //   V  #V by dim list of vertex positions. Assumes that vertices w\n  //   F  #F by 3 list of triangle indices into V\n  //   max_m  desired number of output faces\n  // Outputs:\n  //   U  #U by dim list of output vertex posistions (can be same ref as V)\n  //   G  #G by 3 list of output face indices into U (can be same ref as G)\n  //   J  #G list of indices into F of birth face\n  //   I  #U list of indices into V of birth vertices\n  IGL_INLINE bool qslim(\n    const Eigen::MatrixXd & V,\n    const Eigen::MatrixXi & F,\n    const size_t max_m,\n    Eigen::MatrixXd & U,\n    Eigen::MatrixXi & G,\n    Eigen::VectorXi & J,\n    Eigen::VectorXi & I);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"qslim.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/qslim_optimal_collapse_edge_callbacks.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"qslim_optimal_collapse_edge_callbacks.h\"\n#include \"quadric_binary_plus_operator.h\"\n#include <Eigen/LU>\n\nIGL_INLINE void igl::qslim_optimal_collapse_edge_callbacks(\n  Eigen::MatrixXi & E,\n  std::vector<std::tuple<Eigen::MatrixXd,Eigen::RowVectorXd,double> > & \n    quadrics,\n  int & v1,\n  int & v2,\n  std::function<void(\n    const int e,\n    const Eigen::MatrixXd &,\n    const Eigen::MatrixXi &,\n    const Eigen::MatrixXi &,\n    const Eigen::VectorXi &,\n    const Eigen::MatrixXi &,\n    const Eigen::MatrixXi &,\n    double &,\n    Eigen::RowVectorXd &)> & cost_and_placement,\n  std::function<bool(\n    const Eigen::MatrixXd &                                         ,/*V*/\n    const Eigen::MatrixXi &                                         ,/*F*/\n    const Eigen::MatrixXi &                                         ,/*E*/\n    const Eigen::VectorXi &                                         ,/*EMAP*/\n    const Eigen::MatrixXi &                                         ,/*EF*/\n    const Eigen::MatrixXi &                                         ,/*EI*/\n    const std::set<std::pair<double,int> > &                        ,/*Q*/\n    const std::vector<std::set<std::pair<double,int> >::iterator > &,/*Qit*/\n    const Eigen::MatrixXd &                                         ,/*C*/\n    const int                                                        /*e*/\n    )> & pre_collapse,\n  std::function<void(\n    const Eigen::MatrixXd &                                         ,   /*V*/\n    const Eigen::MatrixXi &                                         ,   /*F*/\n    const Eigen::MatrixXi &                                         ,   /*E*/\n    const Eigen::VectorXi &                                         ,/*EMAP*/\n    const Eigen::MatrixXi &                                         ,  /*EF*/\n    const Eigen::MatrixXi &                                         ,  /*EI*/\n    const std::set<std::pair<double,int> > &                        ,   /*Q*/\n    const std::vector<std::set<std::pair<double,int> >::iterator > &, /*Qit*/\n    const Eigen::MatrixXd &                                         ,   /*C*/\n    const int                                                       ,   /*e*/\n    const int                                                       ,  /*e1*/\n    const int                                                       ,  /*e2*/\n    const int                                                       ,  /*f1*/\n    const int                                                       ,  /*f2*/\n    const bool                                                  /*collapsed*/\n    )> & post_collapse)\n{\n  typedef std::tuple<Eigen::MatrixXd,Eigen::RowVectorXd,double> Quadric;\n  cost_and_placement = [&quadrics,&v1,&v2](\n    const int e,\n    const Eigen::MatrixXd & V,\n    const Eigen::MatrixXi & /*F*/,\n    const Eigen::MatrixXi & E,\n    const Eigen::VectorXi & /*EMAP*/,\n    const Eigen::MatrixXi & /*EF*/,\n    const Eigen::MatrixXi & /*EI*/,\n    double & cost,\n    Eigen::RowVectorXd & p)\n  {\n    // Combined quadric\n    Quadric quadric_p;\n    quadric_p = quadrics[E(e,0)] + quadrics[E(e,1)];\n    // Quadric: p'Ap + 2b'p + c\n    // optimal point: Ap = -b, or rather because we have row vectors: pA=-b\n    const auto & A = std::get<0>(quadric_p);\n    const auto & b = std::get<1>(quadric_p);\n    const auto & c = std::get<2>(quadric_p);\n    p = -b*A.inverse();\n    cost = p.dot(p*A) + 2*p.dot(b) + c;\n    // Force infs and nans to infinity\n    if(std::isinf(cost) || cost!=cost)\n    {\n      cost = std::numeric_limits<double>::infinity();\n      // Prevent NaNs. Actually NaNs might be useful for debugging.\n      p.setConstant(0);\n    }\n  };\n  // Remember endpoints\n  pre_collapse = [&v1,&v2](\n    const Eigen::MatrixXd &                                         ,/*V*/\n    const Eigen::MatrixXi &                                         ,/*F*/\n    const Eigen::MatrixXi & E,\n    const Eigen::VectorXi &                                         ,/*EMAP*/\n    const Eigen::MatrixXi &                                         ,/*EF*/\n    const Eigen::MatrixXi &                                         ,/*EI*/\n    const std::set<std::pair<double,int> > &                        ,/*Q*/\n    const std::vector<std::set<std::pair<double,int> >::iterator > &,/*Qit*/\n    const Eigen::MatrixXd &                                         ,/*C*/\n    const int e)->bool\n  {\n    v1 = E(e,0);\n    v2 = E(e,1);\n    return true;\n  };\n  // update quadric\n  post_collapse = [&v1,&v2,&quadrics](\n      const Eigen::MatrixXd &                                         ,   /*V*/\n      const Eigen::MatrixXi &                                         ,   /*F*/\n      const Eigen::MatrixXi &                                         ,   /*E*/\n      const Eigen::VectorXi &                                         ,/*EMAP*/\n      const Eigen::MatrixXi &                                         ,  /*EF*/\n      const Eigen::MatrixXi &                                         ,  /*EI*/\n      const std::set<std::pair<double,int> > &                        ,   /*Q*/\n      const std::vector<std::set<std::pair<double,int> >::iterator > &, /*Qit*/\n      const Eigen::MatrixXd &                                         ,   /*C*/\n      const int                                                       ,   /*e*/\n      const int                                                       ,  /*e1*/\n      const int                                                       ,  /*e2*/\n      const int                                                       ,  /*f1*/\n      const int                                                       ,  /*f2*/\n      const bool                                                  collapsed\n      )->void\n  {\n    if(collapsed)\n    {\n      quadrics[v1<v2?v1:v2] = quadrics[v1] + quadrics[v2];\n    }\n  };\n}\n\n"
  },
  {
    "path": "libs/libigl/include/igl/qslim_optimal_collapse_edge_callbacks.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_QSLIM_OPTIMAL_COLLAPSE_EDGE_CALLBACKS_H\n#define IGL_QSLIM_OPTIMAL_COLLAPSE_EDGE_CALLBACKS_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <functional>\n#include <vector>\n#include <tuple>\n#include <set>\nnamespace igl\n{\n\n  // Prepare callbacks for decimating edges using the qslim optimal placement\n  // metric.\n  //\n  // Inputs:\n  //   E  #E by 2 list of working edges\n  //   quadrics  reference to list of working per vertex quadrics \n  //   v1  working variable to maintain end point of collapsed edge\n  //   v2  working variable to maintain end point of collapsed edge\n  // Outputs\n  //   cost_and_placement  callback for evaluating cost of edge collapse and\n  //     determining placement of vertex (see collapse_edge)\n  //   pre_collapse  callback before edge collapse (see collapse_edge)\n  //   post_collapse  callback after edge collapse (see collapse_edge)\n  IGL_INLINE void qslim_optimal_collapse_edge_callbacks(\n    Eigen::MatrixXi & E,\n    std::vector<std::tuple<Eigen::MatrixXd,Eigen::RowVectorXd,double> > & \n      quadrics,\n    int & v1,\n    int & v2,\n    std::function<void(\n      const int e,\n      const Eigen::MatrixXd &,\n      const Eigen::MatrixXi &,\n      const Eigen::MatrixXi &,\n      const Eigen::VectorXi &,\n      const Eigen::MatrixXi &,\n      const Eigen::MatrixXi &,\n      double &,\n      Eigen::RowVectorXd &)> & cost_and_placement,\n    std::function<bool(\n      const Eigen::MatrixXd &                                         ,/*V*/\n      const Eigen::MatrixXi &                                         ,/*F*/\n      const Eigen::MatrixXi &                                         ,/*E*/\n      const Eigen::VectorXi &                                         ,/*EMAP*/\n      const Eigen::MatrixXi &                                         ,/*EF*/\n      const Eigen::MatrixXi &                                         ,/*EI*/\n      const std::set<std::pair<double,int> > &                        ,/*Q*/\n      const std::vector<std::set<std::pair<double,int> >::iterator > &,/*Qit*/\n      const Eigen::MatrixXd &                                         ,/*C*/\n      const int                                                        /*e*/\n      )> & pre_collapse,\n    std::function<void(\n      const Eigen::MatrixXd &                                         ,   /*V*/\n      const Eigen::MatrixXi &                                         ,   /*F*/\n      const Eigen::MatrixXi &                                         ,   /*E*/\n      const Eigen::VectorXi &                                         ,/*EMAP*/\n      const Eigen::MatrixXi &                                         ,  /*EF*/\n      const Eigen::MatrixXi &                                         ,  /*EI*/\n      const std::set<std::pair<double,int> > &                        ,   /*Q*/\n      const std::vector<std::set<std::pair<double,int> >::iterator > &, /*Qit*/\n      const Eigen::MatrixXd &                                         ,   /*C*/\n      const int                                                       ,   /*e*/\n      const int                                                       ,  /*e1*/\n      const int                                                       ,  /*e2*/\n      const int                                                       ,  /*f1*/\n      const int                                                       ,  /*f2*/\n      const bool                                                  /*collapsed*/\n      )> & post_collapse);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"qslim_optimal_collapse_edge_callbacks.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/quad_planarity.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"quad_planarity.h\"\n#include <Eigen/Geometry>\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedP>\nIGL_INLINE void igl::quad_planarity(\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  Eigen::PlainObjectBase<DerivedP> & P)\n{\n  int nf = F.rows();\n  P.setZero(nf,1);\n  for (int i =0; i<nf; ++i)\n  {\n    const Eigen::Matrix<typename DerivedV::Scalar,1,3> &v1 = V.row(F(i,0));\n    const Eigen::Matrix<typename DerivedV::Scalar,1,3> &v2 = V.row(F(i,1));\n    const Eigen::Matrix<typename DerivedV::Scalar,1,3> &v3 = V.row(F(i,2));\n    const Eigen::Matrix<typename DerivedV::Scalar,1,3> &v4 = V.row(F(i,3));\n    Eigen::Matrix<typename DerivedV::Scalar,1,3> diagCross=(v3-v1).cross(v4-v2);\n    typename DerivedV::Scalar denom = \n      diagCross.norm()*(((v3-v1).norm()+(v4-v2).norm())/2);\n    if (fabs(denom)<1e-8)\n      //degenerate quad is still planar\n      P[i] = 0;\n    else\n      P[i] = (diagCross.dot(v2-v1)/denom);\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::quad_planarity<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/quad_planarity.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_QUAD_PLANARITY_H\n#define IGL_QUAD_PLANARITY_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Compute planarity of the faces of a quad mesh\n  // Inputs:\n  //   V  #V by 3 eigen Matrix of mesh vertex 3D positions\n  //   F  #F by 4 eigen Matrix of face (quad) indices\n  // Output:\n  //   P  #F by 1 eigen Matrix of mesh face (quad) planarities\n  //\n  template <typename DerivedV, typename DerivedF, typename DerivedP>\n  IGL_INLINE void quad_planarity(\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    Eigen::PlainObjectBase<DerivedP> & P);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"quad_planarity.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/quadric_binary_plus_operator.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"quadric_binary_plus_operator.h\"\n\nIGL_INLINE std::tuple< Eigen::MatrixXd, Eigen::RowVectorXd, double> \n  igl::operator+(\n    const std::tuple< Eigen::MatrixXd, Eigen::RowVectorXd, double>  & a, \n    const std::tuple< Eigen::MatrixXd, Eigen::RowVectorXd, double>  & b)\n{\n  std::tuple<\n    Eigen::MatrixXd,\n    Eigen::RowVectorXd,\n    double>  c;\n  std::get<0>(c) = (std::get<0>(a) + std::get<0>(b)).eval();\n  std::get<1>(c) = (std::get<1>(a) + std::get<1>(b)).eval();\n  std::get<2>(c) = (std::get<2>(a) + std::get<2>(b));\n  return c;\n}\n\n"
  },
  {
    "path": "libs/libigl/include/igl/quadric_binary_plus_operator.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_QUADRIC_BINARY_PLUS_OPERATOR_H\n#define IGL_QUADRIC_BINARY_PLUS_OPERATOR_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <tuple>\n\nnamespace igl\n{\n  // A binary addition operator for Quadric tuples compatible with qslim,\n  // computing c = a+b\n  //\n  // Inputs:\n  //   a  QSlim quadric\n  //   b  QSlim quadric\n  // Output\n  //   c  QSlim quadric\n  //\n  IGL_INLINE std::tuple< Eigen::MatrixXd, Eigen::RowVectorXd, double> \n    operator+(\n      const std::tuple< Eigen::MatrixXd, Eigen::RowVectorXd, double>  & a, \n      const std::tuple< Eigen::MatrixXd, Eigen::RowVectorXd, double>  & b);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"quadric_binary_plus_operator.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/quat_conjugate.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"quat_conjugate.h\"\n\ntemplate <typename Q_type>\nIGL_INLINE void igl::quat_conjugate(\n  const Q_type *q1, \n  Q_type *out)\n{\n  out[0] = -q1[0];\n  out[1] = -q1[1];\n  out[2] = -q1[2];\n  out[3] = q1[3];\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::quat_conjugate<double>(double const*, double*);\n// generated by autoexplicit.sh\ntemplate void igl::quat_conjugate<float>(float const*, float*);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/quat_conjugate.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_QUAT_CONJUGATE_H\n#define IGL_QUAT_CONJUGATE_H\n#include \"igl_inline.h\"\n\nnamespace igl\n{\n  // Compute conjugate of given quaternion\n  // http://en.wikipedia.org/wiki/Quaternion#Conjugation.2C_the_norm.2C_and_reciprocal\n  // A Quaternion, q, is defined here as an arrays of four scalars (x,y,z,w),\n  // such that q = x*i + y*j + z*k + w\n  // Inputs:\n  //   q1  input quaternion\n  // Outputs:\n  //   out  result of conjugation, allowed to be same as input\n  template <typename Q_type>\n  IGL_INLINE void quat_conjugate(\n    const Q_type *q1, \n    Q_type *out);\n};\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"quat_conjugate.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/quat_mult.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"quat_mult.h\"\n\n#include <cassert>\n// http://www.antisphere.com/Wiki/tools:anttweakbar\ntemplate <typename Q_type>\nIGL_INLINE void igl::quat_mult(\n  const Q_type *q1, \n  const Q_type *q2,\n  Q_type *out)\n{\n  // output can't be either of the inputs\n  assert(q1 != out);\n  assert(q2 != out);\n\n  out[0] = q1[3]*q2[0] + q1[0]*q2[3] + q1[1]*q2[2] - q1[2]*q2[1];\n  out[1] = q1[3]*q2[1] + q1[1]*q2[3] + q1[2]*q2[0] - q1[0]*q2[2];\n  out[2] = q1[3]*q2[2] + q1[2]*q2[3] + q1[0]*q2[1] - q1[1]*q2[0];\n  out[3] = q1[3]*q2[3] - (q1[0]*q2[0] + q1[1]*q2[1] + q1[2]*q2[2]);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::quat_mult<double>(double const*, double const*, double*);\n// generated by autoexplicit.sh\ntemplate void igl::quat_mult<float>(float const*, float const*, float*);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/quat_mult.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_QUAT_MULT_H\n#define IGL_QUAT_MULT_H\n#include \"igl_inline.h\"\n\nnamespace igl\n{\n  // Computes out = q1 * q2 with quaternion multiplication\n  // A Quaternion, q, is defined here as an arrays of four scalars (x,y,z,w),\n  // such that q = x*i + y*j + z*k + w\n  // Inputs:\n  //   q1  left quaternion\n  //   q2  right quaternion\n  // Outputs:\n  //   out  result of multiplication\n  template <typename Q_type>\n  IGL_INLINE void quat_mult(\n    const Q_type *q1, \n    const Q_type *q2,\n    Q_type *out);\n};\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"quat_mult.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/quat_to_axis_angle.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"quat_to_axis_angle.h\"\n#include \"EPS.h\"\n#include \"PI.h\"\n#include <cmath>\n#include <cstdio>\n//\n// http://www.antisphere.com/Wiki/tools:anttweakbar\ntemplate <typename Q_type>\nIGL_INLINE void igl::quat_to_axis_angle(\n  const Q_type *q,\n  Q_type *axis, \n  Q_type & angle)\n{\n    if( fabs(q[3])>(1.0 + igl::EPS<Q_type>()) )\n    {\n        //axis[0] = axis[1] = axis[2] = 0; // no, keep the previous value\n        angle = 0;\n    }\n    else\n    {\n        double a;\n        if( q[3]>=1.0f )\n            a = 0; // and keep V\n        else if( q[3]<=-1.0f )\n            a = PI; // and keep V\n        else if( fabs(q[0]*q[0]+q[1]*q[1]+q[2]*q[2]+q[3]*q[3])<igl::EPS_SQ<Q_type>())\n        {\n            a = 0;\n        }else\n        {\n            a = acos(q[3]);\n            if( a*angle<0 ) // Preserve the sign of angle\n                a = -a;\n            double f = 1.0f / sin(a);\n            axis[0] = q[0] * f;\n            axis[1] = q[1] * f;\n            axis[2] = q[2] * f;\n        }\n        angle = 2.0*a;\n    }\n\n    //  if( angle>FLOAT_PI )\n    //      angle -= 2.0f*FLOAT_PI;\n    //  else if( angle<-FLOAT_PI )\n    //      angle += 2.0f*FLOAT_PI;\n    //angle = RadToDeg(angle);\n\n    if( fabs(angle)<igl::EPS<Q_type>()&& fabs(axis[0]*axis[0]+axis[1]*axis[1]+axis[2]*axis[2])<igl::EPS_SQ<Q_type>())\n    {\n        axis[0] = 1.0e-7;    // all components cannot be null\n    }\n}\n\ntemplate <typename Q_type>\nIGL_INLINE void igl::quat_to_axis_angle_deg(\n  const Q_type *q,\n  Q_type *axis, \n  Q_type & angle)\n{\n  igl::quat_to_axis_angle(q,axis,angle);\n  angle = angle*(180.0/PI);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::quat_to_axis_angle<float>(float const*, float*, float&);\ntemplate void igl::quat_to_axis_angle_deg<float>(float const*, float*, float&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/quat_to_axis_angle.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_QUAT_TO_AXIS_ANGLE_H\n#define IGL_QUAT_TO_AXIS_ANGLE_H\n#include \"igl_inline.h\"\n\nnamespace igl\n{\n  // Convert quat representation of a rotation to axis angle\n  // A Quaternion, q, is defined here as an arrays of four scalars (x,y,z,w),\n  // such that q = x*i + y*j + z*k + w\n  // Inputs:\n  //   q quaternion\n  // Outputs:\n  //   axis  3d vector\n  //   angle  scalar in radians\n  template <typename Q_type>\n  IGL_INLINE void quat_to_axis_angle(\n    const Q_type *q,\n    Q_type *axis, \n    Q_type & angle);\n  // Wrapper with angle in degrees\n  template <typename Q_type>\n  IGL_INLINE void quat_to_axis_angle_deg(\n    const Q_type *q,\n    Q_type *axis, \n    Q_type & angle);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"quat_to_axis_angle.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/quat_to_mat.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"quat_to_mat.h\"\n\ntemplate <typename Q_type>\nIGL_INLINE void igl::quat_to_mat(const Q_type * quat, Q_type * mat)\n{\n  Q_type yy2 = 2.0f * quat[1] * quat[1];\n  Q_type xy2 = 2.0f * quat[0] * quat[1];\n  Q_type xz2 = 2.0f * quat[0] * quat[2];\n  Q_type yz2 = 2.0f * quat[1] * quat[2];\n  Q_type zz2 = 2.0f * quat[2] * quat[2];\n  Q_type wz2 = 2.0f * quat[3] * quat[2];\n  Q_type wy2 = 2.0f * quat[3] * quat[1];\n  Q_type wx2 = 2.0f * quat[3] * quat[0];\n  Q_type xx2 = 2.0f * quat[0] * quat[0];\n  mat[0*4+0] = - yy2 - zz2 + 1.0f;\n  mat[0*4+1] = xy2 + wz2;\n  mat[0*4+2] = xz2 - wy2;\n  mat[0*4+3] = 0;\n  mat[1*4+0] = xy2 - wz2;\n  mat[1*4+1] = - xx2 - zz2 + 1.0f;\n  mat[1*4+2] = yz2 + wx2;\n  mat[1*4+3] = 0;\n  mat[2*4+0] = xz2 + wy2;\n  mat[2*4+1] = yz2 - wx2;\n  mat[2*4+2] = - xx2 - yy2 + 1.0f;\n  mat[2*4+3] = 0;\n  mat[3*4+0] = mat[3*4+1] = mat[3*4+2] = 0;\n  mat[3*4+3] = 1;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::quat_to_mat<double>(double const*, double*);\n// generated by autoexplicit.sh\ntemplate void igl::quat_to_mat<float>(float const*, float*);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/quat_to_mat.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_QUAT_TO_MAT_H\n#define IGL_QUAT_TO_MAT_H\n#include \"igl_inline.h\"\n// Name history:\n//   quat2mat  until 16 Sept 2011\nnamespace igl\n{\n  // Convert a quaternion to a 4x4 matrix\n  // A Quaternion, q, is defined here as an arrays of four scalars (x,y,z,w),\n  // such that q = x*i + y*j + z*k + w\n  // Input:\n  //   quat  pointer to four elements of quaternion (x,y,z,w)  \n  // Output:\n  //   mat  pointer to 16 elements of matrix\n  template <typename Q_type>\n  IGL_INLINE void quat_to_mat(const Q_type * quat, Q_type * mat);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"quat_to_mat.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/quats_to_column.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"quats_to_column.h\"\n\nIGL_INLINE void igl::quats_to_column(\n  const std::vector<\n    Eigen::Quaterniond,Eigen::aligned_allocator<Eigen::Quaterniond> > vQ,\n    Eigen::VectorXd & Q)\n{\n  Q.resize(vQ.size()*4);\n  for(int q = 0;q<(int)vQ.size();q++)\n  {\n    auto & xyzw = vQ[q].coeffs();\n    for(int c = 0;c<4;c++)\n    {\n      Q(q*4+c) = xyzw(c);\n    }\n  }\n}\n\nIGL_INLINE Eigen::VectorXd igl::quats_to_column(\n  const std::vector<\n    Eigen::Quaterniond,Eigen::aligned_allocator<Eigen::Quaterniond> > vQ)\n{\n  Eigen::VectorXd Q;\n  quats_to_column(vQ,Q);\n  return Q;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/quats_to_column.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_QUATS_TO_COLUMN_H\n#define IGL_QUATS_TO_COLUMN_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <Eigen/Geometry>\n#include <Eigen/StdVector>\n#include <vector>\nnamespace igl\n{\n  // \"Columnize\" a list of quaternions (q1x,q1y,q1z,q1w,q2x,q2y,q2z,q2w,...)\n  //\n  // Inputs:\n  //   vQ  n-long list of quaternions\n  // Outputs:\n  //   Q  n*4-long list of coefficients\n  IGL_INLINE void quats_to_column(\n    const std::vector<\n      Eigen::Quaterniond,Eigen::aligned_allocator<Eigen::Quaterniond> > vQ,\n      Eigen::VectorXd & Q);\n  IGL_INLINE Eigen::VectorXd quats_to_column(\n    const std::vector<\n      Eigen::Quaterniond,Eigen::aligned_allocator<Eigen::Quaterniond> > vQ);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"quats_to_column.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/ramer_douglas_peucker.cpp",
    "content": "#include \"ramer_douglas_peucker.h\"\n\n#include \"LinSpaced.h\"\n#include \"find.h\"\n#include \"cumsum.h\"\n#include \"histc.h\"\n#include \"slice.h\"\n#include \"project_to_line.h\"\n#include \"EPS.h\"\n#include \"slice_mask.h\"\n\ntemplate <typename DerivedP, typename DerivedS, typename DerivedJ>\nIGL_INLINE void igl::ramer_douglas_peucker(\n  const Eigen::MatrixBase<DerivedP> & P,\n  const typename DerivedP::Scalar tol,\n  Eigen::PlainObjectBase<DerivedS> & S,\n  Eigen::PlainObjectBase<DerivedJ> & J)\n{\n  typedef typename DerivedP::Scalar Scalar;\n  // number of vertices\n  const int n = P.rows();\n  // Trivial base case\n  if(n <= 1)\n  {\n    J = DerivedJ::Zero(n);\n    S = P;\n    return;\n  }\n  // number of dimensions\n  const int m = P.cols();\n  Eigen::Array<bool,Eigen::Dynamic,1> I =\n    Eigen::Array<bool,Eigen::Dynamic,1>::Constant(n,1,true);\n  const auto stol = tol*tol;\n  std::function<void(const int,const int)> simplify;\n  simplify = [&I,&P,&stol,&simplify](const int ixs, const int ixe)->void\n  {\n    assert(ixe>ixs);\n    Scalar sdmax = 0;\n    typename Eigen::Matrix<Scalar,Eigen::Dynamic,1>::Index ixc = -1;\n    if((ixe-ixs)>1)\n    {\n      Scalar sdes = (P.row(ixe)-P.row(ixs)).squaredNorm();\n      Eigen::Matrix<Scalar,Eigen::Dynamic,1> sD;\n      const auto & Pblock = P.block(ixs+1,0,((ixe+1)-ixs)-2,P.cols());\n      if(sdes<=EPS<Scalar>())\n      {\n        sD = (Pblock.rowwise()-P.row(ixs)).rowwise().squaredNorm();\n      }else\n      {\n        Eigen::Matrix<Scalar,Eigen::Dynamic,1> T;\n        project_to_line(Pblock,P.row(ixs).eval(),P.row(ixe).eval(),T,sD);\n      }\n      sdmax = sD.maxCoeff(&ixc);\n      // Index full P\n      ixc = ixc+(ixs+1);\n    }\n    if(sdmax <= stol)\n    {\n      if(ixs != ixe-1)\n      {\n        I.block(ixs+1,0,((ixe+1)-ixs)-2,1).setConstant(false);\n      }\n    }else\n    {\n      simplify(ixs,ixc);\n      simplify(ixc,ixe);\n    }\n  };\n  simplify(0,n-1);\n  slice_mask(P,I,1,S);\n  find(I,J);\n}\n\ntemplate <\n  typename DerivedP, \n  typename DerivedS, \n  typename DerivedJ,\n  typename DerivedQ>\nIGL_INLINE void igl::ramer_douglas_peucker(\n  const Eigen::MatrixBase<DerivedP> & P,\n  const typename DerivedP::Scalar tol,\n  Eigen::PlainObjectBase<DerivedS> & S,\n  Eigen::PlainObjectBase<DerivedJ> & J,\n  Eigen::PlainObjectBase<DerivedQ> & Q)\n{\n  typedef typename DerivedP::Scalar Scalar;\n  ramer_douglas_peucker(P,tol,S,J);\n  const int n = P.rows();\n  assert(n>=2 && \"Curve should be at least 2 points\");\n  typedef Eigen::Matrix<Scalar,Eigen::Dynamic,1> VectorXS;\n  // distance traveled along high-res curve\n  VectorXS L(n);\n  L(0) = 0;\n  L.block(1,0,n-1,1) = (P.bottomRows(n-1)-P.topRows(n-1)).rowwise().norm();\n  // Give extra on end\n  VectorXS T;\n  cumsum(L,1,T);\n  T.conservativeResize(T.size()+1);\n  T(T.size()-1) = T(T.size()-2);\n  // index of coarse point before each fine vertex\n  Eigen::VectorXi B;\n  {\n    Eigen::VectorXi N;\n    histc(igl::LinSpaced<Eigen::VectorXi >(n,0,n-1),J,N,B);\n  }\n  // Add extra point at end\n  J.conservativeResize(J.size()+1);\n  J(J.size()-1) = J(J.size()-2);\n  Eigen::VectorXi s,d;\n  // Find index in original list of \"start\" vertices\n  slice(J,B,s);\n  // Find index in original list of \"destination\" vertices\n  slice(J,(B.array()+1).eval(),d);\n  // Parameter between start and destination is linear in arc-length\n  VectorXS Ts,Td;\n  slice(T,s,Ts);\n  slice(T,d,Td);\n  T = ((T.head(T.size()-1)-Ts).array()/(Td-Ts).array()).eval();\n  for(int t =0;t<T.size();t++)\n  {\n    if(!std::isfinite(T(t)) || T(t)!=T(t))\n    {\n      T(t) = 0;\n    }\n  }\n  DerivedS SB;\n  slice(S,B,1,SB);\n  Eigen::VectorXi MB = B.array()+1;\n  for(int b = 0;b<MB.size();b++)\n  {\n    if(MB(b) >= S.rows())\n    {\n      MB(b) = S.rows()-1;\n    }\n  }\n  DerivedS SMB;\n  slice(S,MB,1,SMB);\n  Q = SB.array() + ((SMB.array()-SB.array()).colwise()*T.array());\n\n  // Remove extra point at end\n  J.conservativeResize(J.size()-1);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::ramer_douglas_peucker<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<double, -1, -1, 0, -1, -1>::Scalar, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::ramer_douglas_peucker<Eigen::Matrix<double, -1, 2, 0, -1, 2>, Eigen::Matrix<double, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 2, 0, -1, 2> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> > const&, Eigen::Matrix<double, -1, 2, 0, -1, 2>::Scalar, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/ramer_douglas_peucker.h",
    "content": "#ifndef IGL_RAMER_DOUGLAS_PEUCKER_H\n#define IGL_RAMER_DOUGLAS_PEUCKER_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Ramer-Douglas-Peucker piecewise-linear curve simplification.\n  //\n  // Inputs:\n  //   P  #P by dim ordered list of vertices along the curve\n  //   tol  tolerance (maximal euclidean distance allowed between the new line\n  //     and a vertex)\n  // Outputs:\n  //   S  #S by dim ordered list of points along the curve\n  //   J  #S list of indices into P so that S = P(J,:)\n  template <typename DerivedP, typename DerivedS, typename DerivedJ>\n  IGL_INLINE void ramer_douglas_peucker(\n    const Eigen::MatrixBase<DerivedP> & P,\n    const typename DerivedP::Scalar tol,\n    Eigen::PlainObjectBase<DerivedS> & S,\n    Eigen::PlainObjectBase<DerivedJ> & J);\n  // Run (Ramer-)Duglass-Peucker curve simplification but keep track of where\n  // every point on the original curve maps to on the simplified curve.\n  //\n  // Inputs:\n  //   P  #P by dim list of points, (use P([1:end 1],:) for loops)\n  //   tol  DP tolerance\n  // Outputs:\n  //   S  #S by dim list of points along simplified curve\n  //   J  #S indices into P of simplified points\n  //   Q  #P by dim list of points mapping along simplified curve\n  //\n  template <\n    typename DerivedP, \n    typename DerivedS, \n    typename DerivedJ,\n    typename DerivedQ>\n  IGL_INLINE void ramer_douglas_peucker(\n    const Eigen::MatrixBase<DerivedP> & P,\n    const typename DerivedP::Scalar tol,\n    Eigen::PlainObjectBase<DerivedS> & S,\n    Eigen::PlainObjectBase<DerivedJ> & J,\n    Eigen::PlainObjectBase<DerivedQ> & Q);\n\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"ramer_douglas_peucker.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/random_dir.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"random_dir.h\"\n#include <igl/PI.h>\n#include <cmath>\n\nIGL_INLINE Eigen::Vector3d igl::random_dir()\n{\n  using namespace Eigen;\n  double z =  (double)rand() / (double)RAND_MAX*2.0 - 1.0;\n  double t =  (double)rand() / (double)RAND_MAX*2.0*PI;\n  // http://www.altdevblogaday.com/2012/05/03/generating-uniformly-distributed-points-on-sphere/\n  double r = sqrt(1.0-z*z);\n  double x = r * cos(t);\n  double y = r * sin(t);\n  return Vector3d(x,y,z);\n}\n\nIGL_INLINE Eigen::MatrixXd igl::random_dir_stratified(const int n)\n{\n  using namespace Eigen;\n  using namespace std;\n  const double m = std::floor(sqrt(double(n)));\n  MatrixXd N(n,3);\n  int row = 0;\n  for(int i = 0;i<m;i++)\n  {\n    const double x = double(i)*1./m;\n    for(int j = 0;j<m;j++)\n    {\n      const double y = double(j)*1./m;\n      double z = (x+(1./m)*(double)rand() / (double)RAND_MAX)*2.0 - 1.0;\n      double t = (y+(1./m)*(double)rand() / (double)RAND_MAX)*2.0*PI;\n      double r = sqrt(1.0-z*z);\n      N(row,0) = r * cos(t);\n      N(row,1) = r * sin(t);\n      N(row,2) = z;\n      row++;\n    }\n  }\n  // Finish off with uniform random directions\n  for(;row<n;row++)\n  {\n    N.row(row) = random_dir();\n  }\n  return N;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/random_dir.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_RANDOM_DIR_H\n#define IGL_RANDOM_DIR_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Core>\n\nnamespace igl\n{\n  // Generate a uniformly random unit direction in 3D, return as vector\n  IGL_INLINE Eigen::Vector3d random_dir();\n  // Generate n stratified uniformly random unit directions in 3d, return as rows\n  // of an n by 3 matrix\n  //\n  // Inputs:\n  //   n  number of directions\n  // Return n by 3 matrix of random directions\n  IGL_INLINE Eigen::MatrixXd random_dir_stratified(const int n);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"random_dir.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/random_points_on_mesh.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"random_points_on_mesh.h\"\n#include \"doublearea.h\"\n#include \"cumsum.h\"\n#include \"histc.h\"\n#include <iostream>\n#include <cassert>\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedB, typename DerivedFI>\nIGL_INLINE void igl::random_points_on_mesh(\n  const int n,\n  const Eigen::PlainObjectBase<DerivedV > & V,\n  const Eigen::PlainObjectBase<DerivedF > & F,\n  Eigen::PlainObjectBase<DerivedB > & B,\n  Eigen::PlainObjectBase<DerivedFI > & FI)\n{\n  using namespace Eigen;\n  using namespace std;\n  typedef typename DerivedV::Scalar Scalar;\n  typedef Matrix<Scalar,Dynamic,1> VectorXs;\n  VectorXs A;\n  doublearea(V,F,A);\n  A /= A.array().sum();\n  // Should be traingle mesh. Although Turk's method 1 generalizes...\n  assert(F.cols() == 3);\n  VectorXs C;\n  VectorXs A0(A.size()+1);\n  A0(0) = 0;\n  A0.bottomRightCorner(A.size(),1) = A;\n  // Even faster would be to use the \"Alias Table Method\"\n  cumsum(A0,1,C);\n  const VectorXs R = (VectorXs::Random(n,1).array() + 1.)/2.;\n  assert(R.minCoeff() >= 0);\n  assert(R.maxCoeff() <= 1);\n  histc(R,C,FI);\n  const VectorXs S = (VectorXs::Random(n,1).array() + 1.)/2.;\n  const VectorXs T = (VectorXs::Random(n,1).array() + 1.)/2.;\n  B.resize(n,3);\n  B.col(0) = 1.-T.array().sqrt();\n  B.col(1) = (1.-S.array()) * T.array().sqrt();\n  B.col(2) = S.array() * T.array().sqrt();\n}\n\ntemplate <typename DerivedV, typename DerivedF, typename ScalarB, typename DerivedFI>\nIGL_INLINE void igl::random_points_on_mesh(\n  const int n,\n  const Eigen::PlainObjectBase<DerivedV > & V,\n  const Eigen::PlainObjectBase<DerivedF > & F,\n  Eigen::SparseMatrix<ScalarB > & B,\n  Eigen::PlainObjectBase<DerivedFI > & FI)\n{\n  using namespace Eigen;\n  using namespace std;\n  Matrix<ScalarB,Dynamic,3> BC;\n  random_points_on_mesh(n,V,F,BC,FI);\n  vector<Triplet<ScalarB> > BIJV;\n  BIJV.reserve(n*3);\n  for(int s = 0;s<n;s++)\n  {\n    for(int c = 0;c<3;c++)\n    {\n      assert(FI(s) < F.rows());\n      assert(FI(s) >= 0);\n      const int v = F(FI(s),c);\n      BIJV.push_back(Triplet<ScalarB>(s,v,BC(s,c)));\n    }\n  }\n  B.resize(n,V.rows());\n  B.reserve(n*3);\n  B.setFromTriplets(BIJV.begin(),BIJV.end());\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::random_points_on_mesh<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, double, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::SparseMatrix<double, 0, int>&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::random_points_on_mesh<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, double, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::SparseMatrix<double, 0, int>&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/random_points_on_mesh.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_RANDOM_POINTS_ON_MESH_H\n#define IGL_RANDOM_POINTS_ON_MESH_H\n\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <Eigen/Sparse>\n\nnamespace igl\n{\n  // RANDOM_POINTS_ON_MESH Randomly sample a mesh (V,F) n times.\n  //\n  // Inputs:\n  //   n  number of samples\n  //   V  #V by dim list of mesh vertex positions\n  //   F  #F by 3 list of mesh triangle indices\n  // Outputs:\n  //   B  n by 3 list of barycentric coordinates, ith row are coordinates of\n  //     ith sampled point in face FI(i)\n  //   FI  n list of indices into F \n  //\n  template <typename DerivedV, typename DerivedF, typename DerivedB, typename DerivedFI>\n  IGL_INLINE void random_points_on_mesh(\n    const int n,\n    const Eigen::PlainObjectBase<DerivedV > & V,\n    const Eigen::PlainObjectBase<DerivedF > & F,\n    Eigen::PlainObjectBase<DerivedB > & B,\n    Eigen::PlainObjectBase<DerivedFI > & FI);\n  // Outputs:\n  //   B n by #V sparse matrix so that  B*V produces a list of sample points\n  template <typename DerivedV, typename DerivedF, typename ScalarB, typename DerivedFI>\n  IGL_INLINE void random_points_on_mesh(\n    const int n,\n    const Eigen::PlainObjectBase<DerivedV > & V,\n    const Eigen::PlainObjectBase<DerivedF > & F,\n    Eigen::SparseMatrix<ScalarB > & B,\n    Eigen::PlainObjectBase<DerivedFI > & FI);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"random_points_on_mesh.cpp\"\n#endif\n\n#endif\n\n\n"
  },
  {
    "path": "libs/libigl/include/igl/random_quaternion.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"random_quaternion.h\"\n\ntemplate <typename Scalar>\nIGL_INLINE Eigen::Quaternion<Scalar> igl::random_quaternion()\n{\n  const auto & unit_rand = []()->Scalar\n  {\n    return ((Scalar)rand() / (Scalar)RAND_MAX);\n  };\n#ifdef false\n  // http://mathproofs.blogspot.com/2005/05/uniformly-distributed-random-unit.html\n  const Scalar t0 = 2.*M_PI*unit_rand();\n  const Scalar t1 = acos(1.-2.*unit_rand());\n  const Scalar t2 = 0.5*(M_PI*unit_rand() + acos(unit_rand()));\n  return Eigen::Quaternion<Scalar>(\n    1.*sin(t0)*sin(t1)*sin(t2),\n    1.*cos(t0)*sin(t1)*sin(t2),\n    1.*cos(t1)*sin(t2),\n    1.*cos(t2));\n#elif false\n  // \"Uniform Random Rotations\" [Shoemake 1992] method 1\n  const auto & uurand = [&unit_rand]()->Scalar\n  {\n    return unit_rand()*2.-1.; \n  };\n  Scalar x = uurand();\n  Scalar y = uurand();\n  Scalar z = uurand();\n  Scalar w = uurand();\n  const auto & hype = [&uurand](Scalar & x, Scalar & y)->Scalar\n  {\n    Scalar s1;\n    while((s1 = x*x + y*y) > 1.0)\n    {\n      x = uurand();\n      y = uurand();\n    }\n    return s1;\n  };\n  Scalar s1 = hype(x,y);\n  Scalar s2 = hype(z,w);\n  Scalar num1 = -2.*log(s1);\n  Scalar num2 = -2.*log(s2);\n  Scalar r = num1 + num2;\n  Scalar root1 = sqrt((num1/s1)/r);\n  Scalar root2 = sqrt((num2/s2)/r);\n  return Eigen::Quaternion<Scalar>(\n    x*root1,\n    y*root1,\n    z*root2,\n    w*root2);\n#else\n  // Shoemake method 2\n  const Scalar x0 = unit_rand();\n  const Scalar x1 = unit_rand();\n  const Scalar x2 = unit_rand();\n  const Scalar r1 = sqrt(1.0 - x0);\n  const Scalar r2 = sqrt(x0);\n  const Scalar t1 = 2.*M_PI*x1;\n  const Scalar t2 = 2.*M_PI*x2;\n  const Scalar c1 = cos(t1);\n  const Scalar s1 = sin(t1);\n  const Scalar c2 = cos(t2);\n  const Scalar s2 = sin(t2);\n  return Eigen::Quaternion<Scalar>(\n    s1*r1,\n    c1*r1,\n    s2*r2,\n    c2*r2);\n#endif\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate Eigen::Quaternion<double, 0> igl::random_quaternion<double>();\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/random_quaternion.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_RANDOM_QUATERNION_H\n#define IGL_RANDOM_QUATERNION_H\n#include \"igl_inline.h\"\n#include <Eigen/Geometry>\nnamespace igl\n{\n  // Return a random quaternion via uniform sampling of the 4-sphere\n  template <typename Scalar>\n  IGL_INLINE Eigen::Quaternion<Scalar> random_quaternion();\n}\n#ifndef IGL_STATIC_LIBRARY\n#include \"random_quaternion.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/randperm.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"randperm.h\"\n#include \"colon.h\"\n#include <algorithm> \n\ntemplate <typename DerivedI>\nIGL_INLINE void igl::randperm(\n  const int n,\n  Eigen::PlainObjectBase<DerivedI> & I)\n{\n  Eigen::VectorXi II;\n  igl::colon(0,1,n-1,II);\n  I = II;\n  std::random_shuffle(I.data(),I.data()+n);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::randperm<Eigen::Matrix<int, -1, 1, 0, -1, 1> >(int, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::randperm<Eigen::Matrix<int, -1, -1, 0, -1, -1> >(int, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/randperm.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_RANDPERM_H\n#define IGL_RANDPERM_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Like matlab's randperm(n) but minus 1\n  //\n  // Inputs:\n  //   n  number of elements\n  // Outputs:\n  //   I  n list of rand permutation of 0:n-1\n  template <typename DerivedI>\n  IGL_INLINE void randperm(\n    const int n,\n    Eigen::PlainObjectBase<DerivedI> & I);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"randperm.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/ray_box_intersect.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"ray_box_intersect.h\"\n#include <vector>\n\ntemplate <\n  typename Derivedsource,\n  typename Deriveddir,\n  typename Scalar>\nIGL_INLINE bool igl::ray_box_intersect(\n  const Eigen::PlainObjectBase<Derivedsource> & origin,\n  const Eigen::PlainObjectBase<Deriveddir> & dir,\n  const Eigen::AlignedBox<Scalar,3> & box,\n  const Scalar & t0,\n  const Scalar & t1,\n  Scalar & tmin,\n  Scalar & tmax)\n{\n#ifdef false\n  // https://github.com/RMonica/basic_next_best_view/blob/master/src/RayTracer.cpp\n  const auto & intersectRayBox = [](\n    const Eigen::Vector3f& rayo,\n    const Eigen::Vector3f& rayd,\n    const Eigen::Vector3f& bmin,\n    const Eigen::Vector3f& bmax, \n    float & tnear,\n    float & tfar\n    )->bool\n  {\n    Eigen::Vector3f bnear;\n    Eigen::Vector3f bfar;\n    // Checks for intersection testing on each direction coordinate\n    // Computes \n    float t1, t2;\n    tnear = -1e+6f, tfar = 1e+6f; //, tCube;\n    bool intersectFlag = true;\n    for (int i = 0; i < 3; ++i) {\n  //    std::cout << \"coordinate \" << i << \": bmin \" << bmin(i) << \", bmax \" << bmax(i) << std::endl; \n      assert(bmin(i) <= bmax(i));\n      if (::fabs(rayd(i)) < 1e-6) {   // Ray parallel to axis i-th\n        if (rayo(i) < bmin(i) || rayo(i) > bmax(i)) {\n          intersectFlag = false;\n        }\n      }\n      else {\n        // Finds the nearest and the farthest vertices of the box from the ray origin\n        if (::fabs(bmin(i) - rayo(i)) < ::fabs(bmax(i) - rayo(i))) {\n          bnear(i) = bmin(i);\n          bfar(i) = bmax(i);\n        }\n        else {\n          bnear(i) = bmax(i);\n          bfar(i) = bmin(i);\n        }\n  //      std::cout << \"  bnear \" << bnear(i) << \", bfar \" << bfar(i) << std::endl;\n        // Finds the distance parameters t1 and t2 of the two ray-box intersections:\n        // t1 must be the closest to the ray origin rayo. \n        t1 = (bnear(i) - rayo(i)) / rayd(i);\n        t2 = (bfar(i) - rayo(i)) / rayd(i);\n        if (t1 > t2) {\n          std::swap(t1,t2);\n        } \n        // The two intersection values are used to saturate tnear and tfar\n        if (t1 > tnear) {\n          tnear = t1;\n        }\n        if (t2 < tfar) {\n          tfar = t2;\n        }\n  //      std::cout << \"  t1 \" << t1 << \", t2 \" << t2 << \", tnear \" << tnear << \", tfar \" << tfar \n  //        << \"  tnear > tfar? \" << (tnear > tfar) << \", tfar < 0? \" << (tfar < 0) << std::endl;\n        if(tnear > tfar) {\n          intersectFlag = false;\n        }\n        if(tfar < 0) {\n        intersectFlag = false;\n        }\n      }\n    }\n    // Checks whether intersection occurs or not\n    return intersectFlag;\n  };\n  float tmin_f, tmax_f;\n  bool ret = intersectRayBox(\n      origin.   template cast<float>(),\n      dir.      template cast<float>(),\n      box.min().template cast<float>(),\n      box.max().template cast<float>(),\n      tmin_f,\n      tmax_f);\n  tmin = tmin_f;\n  tmax = tmax_f;\n  return ret;\n#else\n  using namespace Eigen;\n  // This should be precomputed and provided as input\n  typedef Matrix<Scalar,1,3>  RowVector3S;\n  const RowVector3S inv_dir( 1./dir(0),1./dir(1),1./dir(2));\n  const std::vector<bool> sign = { inv_dir(0)<0, inv_dir(1)<0, inv_dir(2)<0};\n  // http://people.csail.mit.edu/amy/papers/box-jgt.pdf\n  // \"An Efficient and Robust Ray–Box Intersection Algorithm\"\n  Scalar tymin, tymax, tzmin, tzmax;\n  std::vector<RowVector3S> bounds = {box.min(),box.max()};\n  tmin = ( bounds[sign[0]](0)   - origin(0)) * inv_dir(0);\n  tmax = ( bounds[1-sign[0]](0) - origin(0)) * inv_dir(0);\n  tymin = (bounds[sign[1]](1)   - origin(1)) * inv_dir(1);\n  tymax = (bounds[1-sign[1]](1) - origin(1)) * inv_dir(1);\n  if ( (tmin > tymax) || (tymin > tmax) )\n  {\n    return false;\n  }\n  if (tymin > tmin)\n  {\n    tmin = tymin;\n  }\n  if (tymax < tmax)\n  {\n    tmax = tymax;\n  }\n  tzmin = (bounds[sign[2]](2) - origin(2))   * inv_dir(2);\n  tzmax = (bounds[1-sign[2]](2) - origin(2)) * inv_dir(2);\n  if ( (tmin > tzmax) || (tzmin > tmax) )\n  {\n    return false;\n  }\n  if (tzmin > tmin)\n  {\n    tmin = tzmin;\n  }\n  if (tzmax < tmax)\n  {\n    tmax = tzmax;\n  }\n  if(!( (tmin < t1) && (tmax > t0) ))\n  {\n    return false;\n  }\n  return true;\n#endif\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/ray_box_intersect.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_RAY_BOX_INTERSECT_H\n#define IGL_RAY_BOX_INTERSECT_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <Eigen/Geometry>\nnamespace igl\n{\n  // Determine whether a ray origin+t*dir and box intersect within the ray's parameterized\n  // range (t0,t1)\n  //\n  // Inputs:\n  //   source  3-vector origin of ray\n  //   dir  3-vector direction of ray\n  //   box  axis aligned box\n  //   t0  hit only if hit.t less than t0\n  //   t1  hit only if hit.t greater than t1\n  // Outputs:\n  //   tmin  minimum of interval of overlap within [t0,t1]\n  //   tmax  maximum of interval of overlap within [t0,t1]\n  // Returns true if hit\n  template <\n    typename Derivedsource,\n    typename Deriveddir,\n    typename Scalar>\n  IGL_INLINE bool ray_box_intersect(\n    const Eigen::PlainObjectBase<Derivedsource> & source,\n    const Eigen::PlainObjectBase<Deriveddir> & dir,\n    const Eigen::AlignedBox<Scalar,3> & box,\n    const Scalar & t0,\n    const Scalar & t1,\n    Scalar & tmin,\n    Scalar & tmax);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"ray_box_intersect.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/ray_mesh_intersect.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"ray_mesh_intersect.h\"\n\nextern \"C\"\n{\n#include \"raytri.c\"\n}\n\ntemplate <\n  typename Derivedsource,\n  typename Deriveddir,\n  typename DerivedV, \n  typename DerivedF> \nIGL_INLINE bool igl::ray_mesh_intersect(\n  const Eigen::MatrixBase<Derivedsource> & s,\n  const Eigen::MatrixBase<Deriveddir> & dir,\n  const Eigen::MatrixBase<DerivedV> & V,\n  const Eigen::MatrixBase<DerivedF> & F,\n  std::vector<igl::Hit> & hits)\n{\n  using namespace Eigen;\n  using namespace std;\n  // Should be but can't be const \n  Vector3d s_d = s.template cast<double>();\n  Vector3d dir_d = dir.template cast<double>();\n  hits.clear();\n  // loop over all triangles\n  for(int f = 0;f<F.rows();f++)\n  {\n    // Should be but can't be const \n    RowVector3d v0 = V.row(F(f,0)).template cast<double>();\n    RowVector3d v1 = V.row(F(f,1)).template cast<double>();\n    RowVector3d v2 = V.row(F(f,2)).template cast<double>();\n    // shoot ray, record hit\n    double t,u,v;\n    if(intersect_triangle1(\n      s_d.data(), dir_d.data(), v0.data(), v1.data(), v2.data(), &t, &u, &v) &&\n      t>0)\n    {\n      hits.push_back({(int)f,(int)-1,(float)u,(float)v,(float)t});\n    }\n  }\n  // Sort hits based on distance\n  std::sort(\n    hits.begin(),\n    hits.end(),\n    [](const Hit & a, const Hit & b)->bool{ return a.t < b.t;});\n  return hits.size() > 0;\n}\n\ntemplate <\n  typename Derivedsource,\n  typename Deriveddir,\n  typename DerivedV, \n  typename DerivedF> \nIGL_INLINE bool igl::ray_mesh_intersect(\n  const Eigen::MatrixBase<Derivedsource> & source,\n  const Eigen::MatrixBase<Deriveddir> & dir,\n  const Eigen::MatrixBase<DerivedV> & V,\n  const Eigen::MatrixBase<DerivedF> & F,\n  igl::Hit & hit)\n{\n  std::vector<igl::Hit> hits;\n  ray_mesh_intersect(source,dir,V,F,hits);\n  if(hits.size() > 0)\n  {\n    hit = hits.front();\n    return true;\n  }else\n  {\n    return false;\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate bool igl::ray_mesh_intersect<Eigen::Matrix<float, 3, 1, 0, 3, 1>, Eigen::Matrix<float, 3, 1, 0, 3, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<float, 3, 1, 0, 3, 1> > const&, Eigen::MatrixBase<Eigen::Matrix<float, 3, 1, 0, 3, 1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<igl::Hit, std::allocator<igl::Hit> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/ray_mesh_intersect.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_RAY_MESH_INTERSECT_H\n#define IGL_RAY_MESH_INTERSECT_H\n#include \"igl_inline.h\"\n#include \"Hit.h\"\n#include <Eigen/Core>\n#include <vector>\nnamespace igl\n{\n  // Shoot a ray against a mesh (V,F) and collect all hits.\n  //\n  // Inputs:\n  //   source  3-vector origin of ray\n  //   dir  3-vector direction of ray\n  //   V  #V by 3 list of mesh vertex positions\n  //   F  #F by 3 list of mesh face indices into V\n  // Outputs:\n  //    hits  **sorted** list of hits\n  // Returns true if there were any hits (hits.size() > 0)\n  //\n  template <\n    typename Derivedsource,\n    typename Deriveddir,\n    typename DerivedV, \n    typename DerivedF> \n  IGL_INLINE bool ray_mesh_intersect(\n    const Eigen::MatrixBase<Derivedsource> & source,\n    const Eigen::MatrixBase<Deriveddir> & dir,\n    const Eigen::MatrixBase<DerivedV> & V,\n    const Eigen::MatrixBase<DerivedF> & F,\n    std::vector<igl::Hit> & hits);\n  // Outputs:\n  //   hit  first hit, set only if it exists\n  // Returns true if there was a hit\n  template <\n    typename Derivedsource,\n    typename Deriveddir,\n    typename DerivedV, \n    typename DerivedF> \n  IGL_INLINE bool ray_mesh_intersect(\n    const Eigen::MatrixBase<Derivedsource> & source,\n    const Eigen::MatrixBase<Deriveddir> & dir,\n    const Eigen::MatrixBase<DerivedV> & V,\n    const Eigen::MatrixBase<DerivedF> & F,\n    igl::Hit & hit);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"ray_mesh_intersect.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/ray_sphere_intersect.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"ray_sphere_intersect.h\"\n\ntemplate <\n  typename Derivedo,\n  typename Derivedd,\n  typename Derivedc, \n  typename r_type, \n  typename t_type>\nIGL_INLINE int igl::ray_sphere_intersect(\n  const Eigen::PlainObjectBase<Derivedo> & ao,\n  const Eigen::PlainObjectBase<Derivedd> & d,\n  const Eigen::PlainObjectBase<Derivedc> & ac,\n  r_type r, \n  t_type & t0,\n  t_type & t1)\n{\n  Eigen::Vector3d o = ao-ac;\n  // http://wiki.cgsociety.org/index.php/Ray_Sphere_Intersection\n  //Compute A, B and C coefficients\n  double a = d.dot(d);\n  double b = 2 * d.dot(o);\n  double c = o.dot(o) - (r * r);\n\n  //Find discriminant\n  double disc = b * b - 4 * a * c;\n    \n  // if discriminant is negative there are no real roots, so return \n  // false as ray misses sphere\n  if (disc < 0)\n  {\n    return 0;\n  }\n\n  // compute q as described above\n  double distSqrt = sqrt(disc);\n  double q;\n  if (b < 0)\n  {\n    q = (-b - distSqrt)/2.0;\n  } else\n  {\n    q = (-b + distSqrt)/2.0;\n  }\n\n  // compute t0 and t1\n  t0 = q / a;\n  double _t1 = c/q;\n  if(_t1 == t0)\n  {\n    return 1;\n  }\n  t1 = _t1;\n  // make sure t0 is smaller than t1\n  if (t0 > t1)\n  {\n    // if t0 is bigger than t1 swap them around\n    double temp = t0;\n    t0 = t1;\n    t1 = temp;\n  }\n  return 2;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate int igl::ray_sphere_intersect<Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1>, double, double>(Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 1, 0, 3, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 1, 0, 3, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 1, 0, 3, 1> > const&, double, double&, double&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/ray_sphere_intersect.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_RAY_SPHERE_INTERSECT_H\n#define IGL_RAY_SPHERE_INTERSECT_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Compute the intersection between a ray from O in direction D and a sphere\n  // centered at C with radius r\n  //\n  // Inputs:\n  //   o  origin of ray\n  //   d  direction of ray\n  //   c  center of sphere\n  //   r  radius of sphere\n  // Outputs:\n  //   t0  parameterization of first hit (set only if exists) so that hit\n  //    position = o + t0*d\n  //   t1  parameterization of second hit (set only if exists)\n  //   \n  // Returns the number of hits\n  template <\n    typename Derivedo,\n    typename Derivedd,\n    typename Derivedc, \n    typename r_type, \n    typename t_type>\n  IGL_INLINE int ray_sphere_intersect(\n    const Eigen::PlainObjectBase<Derivedo> & o,\n    const Eigen::PlainObjectBase<Derivedd> & d,\n    const Eigen::PlainObjectBase<Derivedc> & c,\n    r_type r, \n    t_type & t0,\n    t_type & t1);\n}\n#ifndef IGL_STATIC_LIBRARY\n#include \"ray_sphere_intersect.cpp\"\n#endif\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/raytri.c",
    "content": "/* Ray-Triangle Intersection Test Routines          */\n/* Different optimizations of my and Ben Trumbore's */\n/* code from journals of graphics tools (JGT)       */\n/* http://www.acm.org/jgt/                          */\n/* by Tomas Moller, May 2000                        */\n\n\n// Alec: this file is listed as \"Public Domain\"\n// http://fileadmin.cs.lth.se/cs/Personal/Tomas_Akenine-Moller/code/\n\n// Alec: I've added an include guard, made all functions inline and added\n// IGL_RAY_TRI_ to #define macros\n#ifndef IGL_RAY_TRI_C\n#define IGL_RAY_TRI_C\n\n#include <math.h>\n\n#define IGL_RAY_TRI_EPSILON 0.000001\n#define IGL_RAY_TRI_CROSS(dest,v1,v2) \\\n          dest[0]=v1[1]*v2[2]-v1[2]*v2[1]; \\\n          dest[1]=v1[2]*v2[0]-v1[0]*v2[2]; \\\n          dest[2]=v1[0]*v2[1]-v1[1]*v2[0];\n#define IGL_RAY_TRI_DOT(v1,v2) (v1[0]*v2[0]+v1[1]*v2[1]+v1[2]*v2[2])\n#define IGL_RAY_TRI_SUB(dest,v1,v2) \\\n          dest[0]=v1[0]-v2[0]; \\\n          dest[1]=v1[1]-v2[1]; \\\n          dest[2]=v1[2]-v2[2]; \n\n/* the original jgt code */\ninline int intersect_triangle(double orig[3], double dir[3],\n\t\t       double vert0[3], double vert1[3], double vert2[3],\n\t\t       double *t, double *u, double *v)\n{\n   double edge1[3], edge2[3], tvec[3], pvec[3], qvec[3];\n   double det,inv_det;\n\n   /* find vectors for two edges sharing vert0 */\n   IGL_RAY_TRI_SUB(edge1, vert1, vert0);\n   IGL_RAY_TRI_SUB(edge2, vert2, vert0);\n\n   /* begin calculating determinant - also used to calculate U parameter */\n   IGL_RAY_TRI_CROSS(pvec, dir, edge2);\n\n   /* if determinant is near zero, ray lies in plane of triangle */\n   det = IGL_RAY_TRI_DOT(edge1, pvec);\n\n   if (det > -IGL_RAY_TRI_EPSILON && det < IGL_RAY_TRI_EPSILON)\n     return 0;\n   inv_det = 1.0 / det;\n\n   /* calculate distance from vert0 to ray origin */\n   IGL_RAY_TRI_SUB(tvec, orig, vert0);\n\n   /* calculate U parameter and test bounds */\n   *u = IGL_RAY_TRI_DOT(tvec, pvec) * inv_det;\n   if (*u < 0.0 || *u > 1.0)\n     return 0;\n\n   /* prepare to test V parameter */\n   IGL_RAY_TRI_CROSS(qvec, tvec, edge1);\n\n   /* calculate V parameter and test bounds */\n   *v = IGL_RAY_TRI_DOT(dir, qvec) * inv_det;\n   if (*v < 0.0 || *u + *v > 1.0)\n     return 0;\n\n   /* calculate t, ray intersects triangle */\n   *t = IGL_RAY_TRI_DOT(edge2, qvec) * inv_det;\n\n   return 1;\n}\n\n\n/* code rewritten to do tests on the sign of the determinant */\n/* the division is at the end in the code                    */\ninline int intersect_triangle1(double orig[3], double dir[3],\n\t\t\tdouble vert0[3], double vert1[3], double vert2[3],\n\t\t\tdouble *t, double *u, double *v)\n{\n   double edge1[3], edge2[3], tvec[3], pvec[3], qvec[3];\n   double det,inv_det;\n\n   /* find vectors for two edges sharing vert0 */\n   IGL_RAY_TRI_SUB(edge1, vert1, vert0);\n   IGL_RAY_TRI_SUB(edge2, vert2, vert0);\n\n   /* begin calculating determinant - also used to calculate U parameter */\n   IGL_RAY_TRI_CROSS(pvec, dir, edge2);\n\n   /* if determinant is near zero, ray lies in plane of triangle */\n   det = IGL_RAY_TRI_DOT(edge1, pvec);\n\n   if (det > IGL_RAY_TRI_EPSILON)\n   {\n      /* calculate distance from vert0 to ray origin */\n      IGL_RAY_TRI_SUB(tvec, orig, vert0);\n      \n      /* calculate U parameter and test bounds */\n      *u = IGL_RAY_TRI_DOT(tvec, pvec);\n      if (*u < 0.0 || *u > det)\n\t return 0;\n      \n      /* prepare to test V parameter */\n      IGL_RAY_TRI_CROSS(qvec, tvec, edge1);\n      \n      /* calculate V parameter and test bounds */\n      *v = IGL_RAY_TRI_DOT(dir, qvec);\n      if (*v < 0.0 || *u + *v > det)\n\t return 0;\n      \n   }\n   else if(det < -IGL_RAY_TRI_EPSILON)\n   {\n      /* calculate distance from vert0 to ray origin */\n      IGL_RAY_TRI_SUB(tvec, orig, vert0);\n      \n      /* calculate U parameter and test bounds */\n      *u = IGL_RAY_TRI_DOT(tvec, pvec);\n/*      printf(\"*u=%f\\n\",(float)*u); */\n/*      printf(\"det=%f\\n\",det); */\n      if (*u > 0.0 || *u < det)\n\t return 0;\n      \n      /* prepare to test V parameter */\n      IGL_RAY_TRI_CROSS(qvec, tvec, edge1);\n      \n      /* calculate V parameter and test bounds */\n      *v = IGL_RAY_TRI_DOT(dir, qvec) ;\n      if (*v > 0.0 || *u + *v < det)\n\t return 0;\n   }\n   else return 0;  /* ray is parallell to the plane of the triangle */\n\n\n   inv_det = 1.0 / det;\n\n   /* calculate t, ray intersects triangle */\n   *t = IGL_RAY_TRI_DOT(edge2, qvec) * inv_det;\n   (*u) *= inv_det;\n   (*v) *= inv_det;\n\n   return 1;\n}\n\n/* code rewritten to do tests on the sign of the determinant */\n/* the division is before the test of the sign of the det    */\ninline int intersect_triangle2(double orig[3], double dir[3],\n\t\t\tdouble vert0[3], double vert1[3], double vert2[3],\n\t\t\tdouble *t, double *u, double *v)\n{\n   double edge1[3], edge2[3], tvec[3], pvec[3], qvec[3];\n   double det,inv_det;\n\n   /* find vectors for two edges sharing vert0 */\n   IGL_RAY_TRI_SUB(edge1, vert1, vert0);\n   IGL_RAY_TRI_SUB(edge2, vert2, vert0);\n\n   /* begin calculating determinant - also used to calculate U parameter */\n   IGL_RAY_TRI_CROSS(pvec, dir, edge2);\n\n   /* if determinant is near zero, ray lies in plane of triangle */\n   det = IGL_RAY_TRI_DOT(edge1, pvec);\n\n   /* calculate distance from vert0 to ray origin */\n   IGL_RAY_TRI_SUB(tvec, orig, vert0);\n   inv_det = 1.0 / det;\n   \n   if (det > IGL_RAY_TRI_EPSILON)\n   {\n      /* calculate U parameter and test bounds */\n      *u = IGL_RAY_TRI_DOT(tvec, pvec);\n      if (*u < 0.0 || *u > det)\n\t return 0;\n      \n      /* prepare to test V parameter */\n      IGL_RAY_TRI_CROSS(qvec, tvec, edge1);\n      \n      /* calculate V parameter and test bounds */\n      *v = IGL_RAY_TRI_DOT(dir, qvec);\n      if (*v < 0.0 || *u + *v > det)\n\t return 0;\n      \n   }\n   else if(det < -IGL_RAY_TRI_EPSILON)\n   {\n      /* calculate U parameter and test bounds */\n      *u = IGL_RAY_TRI_DOT(tvec, pvec);\n      if (*u > 0.0 || *u < det)\n\t return 0;\n      \n      /* prepare to test V parameter */\n      IGL_RAY_TRI_CROSS(qvec, tvec, edge1);\n      \n      /* calculate V parameter and test bounds */\n      *v = IGL_RAY_TRI_DOT(dir, qvec) ;\n      if (*v > 0.0 || *u + *v < det)\n\t return 0;\n   }\n   else return 0;  /* ray is parallell to the plane of the triangle */\n\n   /* calculate t, ray intersects triangle */\n   *t = IGL_RAY_TRI_DOT(edge2, qvec) * inv_det;\n   (*u) *= inv_det;\n   (*v) *= inv_det;\n\n   return 1;\n}\n\n/* code rewritten to do tests on the sign of the determinant */\n/* the division is before the test of the sign of the det    */\n/* and one IGL_RAY_TRI_CROSS has been moved out from the if-else if-else */\ninline int intersect_triangle3(double orig[3], double dir[3],\n\t\t\tdouble vert0[3], double vert1[3], double vert2[3],\n\t\t\tdouble *t, double *u, double *v)\n{\n   double edge1[3], edge2[3], tvec[3], pvec[3], qvec[3];\n   double det,inv_det;\n\n   /* find vectors for two edges sharing vert0 */\n   IGL_RAY_TRI_SUB(edge1, vert1, vert0);\n   IGL_RAY_TRI_SUB(edge2, vert2, vert0);\n\n   /* begin calculating determinant - also used to calculate U parameter */\n   IGL_RAY_TRI_CROSS(pvec, dir, edge2);\n\n   /* if determinant is near zero, ray lies in plane of triangle */\n   det = IGL_RAY_TRI_DOT(edge1, pvec);\n\n   /* calculate distance from vert0 to ray origin */\n   IGL_RAY_TRI_SUB(tvec, orig, vert0);\n   inv_det = 1.0 / det;\n   \n   IGL_RAY_TRI_CROSS(qvec, tvec, edge1);\n      \n   if (det > IGL_RAY_TRI_EPSILON)\n   {\n      *u = IGL_RAY_TRI_DOT(tvec, pvec);\n      if (*u < 0.0 || *u > det)\n\t return 0;\n            \n      /* calculate V parameter and test bounds */\n      *v = IGL_RAY_TRI_DOT(dir, qvec);\n      if (*v < 0.0 || *u + *v > det)\n\t return 0;\n      \n   }\n   else if(det < -IGL_RAY_TRI_EPSILON)\n   {\n      /* calculate U parameter and test bounds */\n      *u = IGL_RAY_TRI_DOT(tvec, pvec);\n      if (*u > 0.0 || *u < det)\n\t return 0;\n      \n      /* calculate V parameter and test bounds */\n      *v = IGL_RAY_TRI_DOT(dir, qvec) ;\n      if (*v > 0.0 || *u + *v < det)\n\t return 0;\n   }\n   else return 0;  /* ray is parallell to the plane of the triangle */\n\n   *t = IGL_RAY_TRI_DOT(edge2, qvec) * inv_det;\n   (*u) *= inv_det;\n   (*v) *= inv_det;\n\n   return 1;\n}\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/readBF.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"readBF.h\"\n#include \"list_to_matrix.h\"\n#include <vector>\n#include <cstdio>\n#include <fstream>\n#include <cassert>\n#include <functional>\ntemplate < \n  typename DerivedWI,\n  typename DerivedP,\n  typename DerivedO>\nIGL_INLINE bool igl::readBF(\n  const std::string & filename,\n  Eigen::PlainObjectBase<DerivedWI> & WI,\n  Eigen::PlainObjectBase<DerivedP> & P,\n  Eigen::PlainObjectBase<DerivedO> & O)\n{\n  using namespace std;\n  ifstream is(filename);\n  if(!is.is_open())\n  {\n    return false;\n  }\n  string line;\n  std::vector<typename DerivedWI::Scalar> vWI;\n  std::vector<typename DerivedP::Scalar> vP;\n  std::vector<std::vector<typename DerivedO::Scalar> > vO;\n  while(getline(is, line))\n  {\n    int wi,p;\n    double cx,cy,cz;\n    if(sscanf(line.c_str(), \"%d %d %lg %lg %lg\",&wi,&p,&cx,&cy,&cz) != 5)\n    {\n      return false;\n    }\n    vWI.push_back(wi);\n    vP.push_back(p);\n    vO.push_back({cx,cy,cz});\n  }\n  list_to_matrix(vWI,WI);\n  list_to_matrix(vP,P);\n  list_to_matrix(vO,O);\n  return true;\n}\n\ntemplate < \n  typename DerivedWI,\n  typename DerivedbfP,\n  typename DerivedO,\n  typename DerivedC,\n  typename DerivedBE,\n  typename DerivedP>\nIGL_INLINE bool igl::readBF(\n  const std::string & filename,\n  Eigen::PlainObjectBase<DerivedWI> & WI,\n  Eigen::PlainObjectBase<DerivedbfP> & bfP,\n  Eigen::PlainObjectBase<DerivedO> & offsets,\n  Eigen::PlainObjectBase<DerivedC> & C,\n  Eigen::PlainObjectBase<DerivedBE> & BE,\n  Eigen::PlainObjectBase<DerivedP> & P)\n{\n  using namespace Eigen;\n  using namespace std;\n  if(!readBF(filename,WI,bfP,offsets))\n  {\n    return false;\n  }\n\n  C.resize(WI.rows(),3);\n  vector<bool> computed(C.rows(),false);\n  // better not be cycles in bfP\n  std::function<Eigen::RowVector3d(const int)> locate_tip;\n  locate_tip = \n    [&offsets,&computed,&bfP,&locate_tip,&C](const int w)->Eigen::RowVector3d\n  {\n    if(w<0) return Eigen::RowVector3d(0,0,0);\n    if(computed[w]) return C.row(w);\n    computed[w] = true;\n    return C.row(w) = locate_tip(bfP(w)) + offsets.row(w);\n  };\n  int num_roots = (bfP.array() == -1).count();\n  BE.resize(WI.rows()-num_roots,2);\n  P.resize(BE.rows());\n  for(int c = 0;c<C.rows();c++)\n  {\n    locate_tip(c);\n    assert(c>=0);\n    // weight associated with this bone\n    const int wi = WI(c);\n    if(wi >= 0)\n    {\n      // index into C\n      const int p = bfP(c);\n      assert(p >= 0 && \"No weights for roots allowed\");\n      // index into BE\n      const int pwi = WI(p);\n      P(wi) = pwi;\n      BE(wi,0) = p;\n      BE(wi,1) = c;\n    }\n  }\n  return true;\n}\n\n#ifdef IGL_STATIC_LIBRARY\ntemplate bool igl::readBF<Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/readBF.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_READBF_H\n#define IGL_READBF_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <string>\nnamespace igl\n{\n  // Read a bones forest from a file, returns a list of bone roots\n  // Input:\n  //   file_name  path to .bf bones tree file\n  // Output:\n  //   WI  #B list of unique weight indices\n  //   P  #B list of parent indices into B, -1 for roots\n  //   O  #B by 3 list of tip offset vectors from parent (or position for roots)\n  // Returns true on success, false on errors\n  template < \n    typename DerivedWI,\n    typename DerivedP,\n    typename DerivedO>\n  IGL_INLINE bool readBF(\n    const std::string & filename,\n    Eigen::PlainObjectBase<DerivedWI> & WI,\n    Eigen::PlainObjectBase<DerivedP> & P,\n    Eigen::PlainObjectBase<DerivedO> & O);\n  // Read bone forest into pure bone-skeleton format, expects only bones (no\n  // point handles), and that a root in the .bf <---> no weight attachment.\n  //\n  // Input:\n  //   file_name  path to .bf bones tree file\n  // Output:\n  //   WI  #B list of unique weight indices\n  //   P  #B list of parent indices into B, -1 for roots\n  //   O  #B by 3 list of tip offset vectors from parent (or position for roots)\n  //   C  #C by 3 list of absolute joint locations\n  //   BE  #BE by 3 list of bone indices into C, in order of weight index\n  //   P  #BE list of parent bone indices into BE, -1 means root bone\n  // Returns true on success, false on errors\n  //   \n  // See also: readTGF, bone_parents, forward_kinematics\n  template < \n    typename DerivedWI,\n    typename DerivedbfP,\n    typename DerivedO,\n    typename DerivedC,\n    typename DerivedBE,\n    typename DerivedP>\n  IGL_INLINE bool readBF(\n    const std::string & filename,\n    Eigen::PlainObjectBase<DerivedWI> & WI,\n    Eigen::PlainObjectBase<DerivedbfP> & bfP,\n    Eigen::PlainObjectBase<DerivedO> & O,\n    Eigen::PlainObjectBase<DerivedC> & C,\n    Eigen::PlainObjectBase<DerivedBE> & BE,\n    Eigen::PlainObjectBase<DerivedP> & P);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"readBF.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/readCSV.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"readCSV.h\"\n\n#include <sstream>\n#include <string>\n#include <fstream>\n#include <iostream>\n\n#include <vector>\n\ntemplate <typename Scalar>\nIGL_INLINE bool igl::readCSV(\n  const std::string str, \n  Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic>& M)\n{\n  using namespace std;\n\n  std::vector<std::vector<Scalar> > Mt;\n  \n  std::ifstream infile(str.c_str());\n  std::string line;\n  while (std::getline(infile, line))\n  {\n    std::istringstream iss(line);\n    vector<Scalar> temp;\n    Scalar a;\n    while (iss >> a)\n      temp.push_back(a);\n\n    if (temp.size() != 0) // skip empty lines\n      Mt.push_back(temp);\n  }\n  \n  if (Mt.size() != 0)\n  {\n    // Verify that it is indeed a matrix\n    for (unsigned i = 0; i<Mt.size(); ++i)\n    {\n      if (Mt[i].size() != Mt[0].size())\n      {\n        infile.close();\n        return false;\n      }\n    }\n    \n    M.resize(Mt.size(),Mt[0].size());\n    for (unsigned i = 0; i<Mt.size(); ++i)\n      for (unsigned j = 0; j<Mt[i].size(); ++j)\n        M(i,j) = Mt[i][j];\n    \n//    cerr << \"TRUE!\" << endl;\n    return true;\n  }\n  \n  infile.close();\n  return false;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/readCSV.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_READ_CSV_H\n#define IGL_READ_CSV_H\n\n#include \"igl/igl_inline.h\"\n#include <Eigen/Core>\n#include <string>\n#include <vector>\n\nnamespace igl \n{\n  // read a matrix from a csv file into a Eigen matrix\n  // Templates:\n  //   Scalar  type for the matrix\n  // Inputs:\n  //   str  path to .csv file\n  // Outputs:\n  //   M  eigen matrix \n  template <typename Scalar>\n  IGL_INLINE bool readCSV(\n    const std::string str, \n    Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic>& M);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"readCSV.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/readDMAT.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"readDMAT.h\"\n\n#include \"verbose.h\"\n#include <cstdio>\n#include <iostream>\n#include <cassert>\n\n// Static helper method reads the first to elements in the given file\n// Inputs:\n//   fp  file pointer of .dmat file that was just opened\n// Outputs:\n//   num_rows  number of rows\n//   num_cols number of columns\n// Returns \n//   0  success\n//   1  did not find header\n//   2  bad num_cols\n//   3  bad num_rows\n//   4  bad line ending\nstatic inline int readDMAT_read_header(FILE * fp, int & num_rows, int & num_cols)\n{\n  // first line contains number of rows and number of columns\n  int res = fscanf(fp,\"%d %d\",&num_cols,&num_rows);\n  if(res != 2)\n  {\n    return 1;\n  }\n  // check that number of columns and rows are sane\n  if(num_cols < 0)\n  {\n    fprintf(stderr,\"IOError: readDMAT() number of columns %d < 0\\n\",num_cols);\n    return 2;\n  }\n  if(num_rows < 0)\n  {\n    fprintf(stderr,\"IOError: readDMAT() number of rows %d < 0\\n\",num_rows);\n    return 3;\n  }\n  // finish reading header\n  char lf;\n\n  if(fread(&lf, sizeof(char), 1, fp)!=1 || !(lf == '\\n' || lf == '\\r'))\n  {\n    fprintf(stderr,\"IOError: bad line ending in header\\n\");\n    return 4;\n  }\n\n  return 0;\n}\n\n#ifndef IGL_NO_EIGEN\ntemplate <typename DerivedW>\nIGL_INLINE bool igl::readDMAT(const std::string file_name,\n  Eigen::PlainObjectBase<DerivedW> & W)\n{\n  FILE * fp = fopen(file_name.c_str(),\"rb\");\n  if(fp == NULL)\n  {\n    fprintf(stderr,\"IOError: readDMAT() could not open %s...\\n\",file_name.c_str());\n    return false; \n  }\n  int num_rows,num_cols;\n  int head_success = readDMAT_read_header(fp,num_rows,num_cols);\n  if(head_success != 0)\n  {\n    if(head_success == 1)\n    {\n      fprintf(stderr,\n        \"IOError: readDMAT() first row should be [num cols] [num rows]...\\n\");\n    }\n    fclose(fp);\n    return false;\n  }\n\n  // Resize output to fit matrix, only if non-empty since this will trigger an\n  // error on fixed size matrices before reaching binary data.\n  bool empty = num_rows == 0 || num_cols == 0;\n  if(!empty)\n  {\n    W.resize(num_rows,num_cols);\n  }\n\n  // Loop over columns slowly\n  for(int j = 0;j < num_cols;j++)\n  {\n    // loop over rows (down columns) quickly\n    for(int i = 0;i < num_rows;i++)\n    {\n      double d;\n      if(fscanf(fp,\" %lg\",&d) != 1)\n      {\n        fclose(fp);\n        fprintf(\n          stderr,\n          \"IOError: readDMAT() bad format after reading %d entries\\n\",\n          j*num_rows + i);\n        return false;\n      }\n      W(i,j) = d;\n    }\n  }\n\n  // Try to read header for binary part\n  head_success = readDMAT_read_header(fp,num_rows,num_cols);\n  if(head_success == 0)\n  {\n    assert(W.size() == 0);\n    // Resize for output\n    W.resize(num_rows,num_cols);\n    double * Wraw = new double[num_rows*num_cols];\n    fread(Wraw, sizeof(double), num_cols*num_rows, fp);\n    // Loop over columns slowly\n    for(int j = 0;j < num_cols;j++)\n    {\n      // loop over rows (down columns) quickly\n      for(int i = 0;i < num_rows;i++)\n      {\n        W(i,j) = Wraw[j*num_rows+i];\n      }\n    }\n  }else\n  {\n    // we skipped resizing before in case there was binary data\n    if(empty)\n    {\n      // This could trigger an error if using fixed size matrices.\n      W.resize(num_rows,num_cols);\n    }\n  }\n\n  fclose(fp);\n  return true;\n}\n#endif\n\ntemplate <typename Scalar>\nIGL_INLINE bool igl::readDMAT(\n  const std::string file_name, \n  std::vector<std::vector<Scalar> > & W)\n{\n  FILE * fp = fopen(file_name.c_str(),\"r\");\n  if(fp == NULL)\n  {\n    fprintf(stderr,\"IOError: readDMAT() could not open %s...\\n\",file_name.c_str());\n    return false; \n  }\n  int num_rows,num_cols;\n  bool head_success = readDMAT_read_header(fp,num_rows,num_cols);\n  if(head_success != 0)\n  {\n    if(head_success == 1)\n    {\n      fprintf(stderr,\n        \"IOError: readDMAT() first row should be [num cols] [num rows]...\\n\");\n    }\n    fclose(fp);\n    return false;\n  }\n\n  // Resize for output\n  W.resize(num_rows,typename std::vector<Scalar>(num_cols));\n\n  // Loop over columns slowly\n  for(int j = 0;j < num_cols;j++)\n  {\n    // loop over rows (down columns) quickly\n    for(int i = 0;i < num_rows;i++)\n    {\n      double d;\n      if(fscanf(fp,\" %lg\",&d) != 1)\n      {\n        fclose(fp);\n        fprintf(\n          stderr,\n          \"IOError: readDMAT() bad format after reading %d entries\\n\",\n          j*num_rows + i);\n        return false;\n      }\n      W[i][j] = (Scalar)d;\n    }\n  }\n\n  // Try to read header for binary part\n  head_success = readDMAT_read_header(fp,num_rows,num_cols);\n  if(head_success == 0)\n  {\n    assert(W.size() == 0);\n    // Resize for output\n    W.resize(num_rows,typename std::vector<Scalar>(num_cols));\n    double * Wraw = new double[num_rows*num_cols];\n    fread(Wraw, sizeof(double), num_cols*num_rows, fp);\n    // Loop over columns slowly\n    for(int j = 0;j < num_cols;j++)\n    {\n      // loop over rows (down columns) quickly\n      for(int i = 0;i < num_rows;i++)\n      {\n        W[i][j] = Wraw[j*num_rows+i];\n      }\n    }\n  }\n\n  fclose(fp);\n  return true;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate bool igl::readDMAT<Eigen::Matrix<double, -1, -1, 0, -1, -1> >(std::string, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate bool igl::readDMAT<double>(std::string, std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > >&);\ntemplate bool igl::readDMAT<Eigen::Matrix<int, -1, -1, 0, -1, -1> >(std::string, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate bool igl::readDMAT<Eigen::Matrix<double, 4, 1, 0, 4, 1> >(std::string, Eigen::PlainObjectBase<Eigen::Matrix<double, 4, 1, 0, 4, 1> >&);\ntemplate bool igl::readDMAT<Eigen::Matrix<double, -1, 1, 0, -1, 1> >(std::string, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\ntemplate bool igl::readDMAT<Eigen::Matrix<int, -1, 1, 0, -1, 1> >(std::string, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate bool igl::readDMAT<Eigen::Matrix<int, -1, 2, 0, -1, 2> >(std::string, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> >&);\ntemplate bool igl::readDMAT<Eigen::Matrix<double, -1, -1, 1, -1, -1> >(std::string, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> >&);\ntemplate bool igl::readDMAT<Eigen::Matrix<int, -1, -1, 1, -1, -1> >(std::string, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 1, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/readDMAT.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_READDMAT_H\n#define IGL_READDMAT_H\n#include \"igl_inline.h\"\n// .dmat is a simple ascii matrix file type, defined as follows. The first line\n// is always:\n// <#columns> <#rows>\n// Then the coefficients of the matrix are given separated by whitespace with\n// columns running fastest.\n//\n// Example:\n//   The matrix m = [1 2 3; 4 5 6];\n//   corresponds to a .dmat file containing:\n//   3 2\n//   1 4 2 5 3 6\n#include <string>\n#include <vector>\n#ifndef IGL_NO_EIGEN\n#  include <Eigen/Core>\n#endif\nnamespace igl\n{\n  // Read a matrix from an ascii dmat file\n  //\n  // Inputs:\n  //   file_name  path to .dmat file\n  // Outputs:\n  //   W  eigen matrix containing read-in coefficients\n  // Returns true on success, false on error\n  //\n#ifndef IGL_NO_EIGEN\n  template <typename DerivedW>\n  IGL_INLINE bool readDMAT(const std::string file_name, \n    Eigen::PlainObjectBase<DerivedW> & W);\n#endif\n  // Wrapper for vector of vectors\n  template <typename Scalar>\n  IGL_INLINE bool readDMAT(\n    const std::string file_name, \n    std::vector<std::vector<Scalar> > & W);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"readDMAT.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/readMESH.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"readMESH.h\"\n\ntemplate <typename Scalar, typename Index>\nIGL_INLINE bool igl::readMESH(\n  const std::string mesh_file_name,\n  std::vector<std::vector<Scalar > > & V,\n  std::vector<std::vector<Index > > & T,\n  std::vector<std::vector<Index > > & F)\n{\n  using namespace std;\n  FILE * mesh_file = fopen(mesh_file_name.c_str(),\"r\");\n  if(NULL==mesh_file)\n  {\n    fprintf(stderr,\"IOError: %s could not be opened...\",mesh_file_name.c_str());\n    return false;\n  }\n  return igl::readMESH(mesh_file,V,T,F);\n}\n\ntemplate <typename Scalar, typename Index>\nIGL_INLINE bool igl::readMESH(\n  FILE * mesh_file,\n  std::vector<std::vector<Scalar > > & V,\n  std::vector<std::vector<Index > > & T,\n  std::vector<std::vector<Index > > & F)\n{\n  using namespace std;\n#ifndef LINE_MAX\n#  define LINE_MAX 2048\n#endif\n  char line[LINE_MAX];\n  bool still_comments;\n  V.clear();\n  T.clear();\n  F.clear();\n\n  // eat comments at beginning of file\n  still_comments= true;\n  while(still_comments)\n  {\n    if(fgets(line,LINE_MAX,mesh_file) == NULL)\n    {\n      fprintf(stderr, \"Error: couldn't find start of .mesh file\");\n      fclose(mesh_file);\n      return false;\n    }\n    still_comments = (line[0] == '#' || line[0] == '\\n');\n  }\n  char str[LINE_MAX];\n  sscanf(line,\" %s\",str);\n  // check that first word is MeshVersionFormatted\n  if(0!=strcmp(str,\"MeshVersionFormatted\"))\n  {\n    fprintf(stderr,\n      \"Error: first word should be MeshVersionFormatted not %s\\n\",str);\n    fclose(mesh_file);\n    return false;\n  }\n\n  int one = -1;\n  if(2 != sscanf(line,\"%s %d\",str,&one))\n  {\n    // 1 appears on next line?\n    fscanf(mesh_file,\" %d\",&one);\n  }\n  if(one != 1)\n  {\n    fprintf(stderr,\"Error: second word should be 1 not %d\\n\",one);\n    fclose(mesh_file);\n    return false;\n  }\n\n  // eat comments\n  still_comments= true;\n  while(still_comments)\n  {\n    fgets(line,LINE_MAX,mesh_file);\n    still_comments = (line[0] == '#' || line[0] == '\\n');\n  }\n\n  sscanf(line,\" %s\",str);\n  // check that third word is Dimension\n  if(0!=strcmp(str,\"Dimension\"))\n  {\n    fprintf(stderr,\"Error: third word should be Dimension not %s\\n\",str);\n    fclose(mesh_file);\n    return false;\n  }\n  int three = -1;\n  if(2 != sscanf(line,\"%s %d\",str,&three))\n  {\n    // 1 appears on next line?\n    fscanf(mesh_file,\" %d\",&three);\n  }\n  if(three != 3)\n  {\n    fprintf(stderr,\"Error: only Dimension 3 supported not %d\\n\",three);\n    fclose(mesh_file);\n    return false;\n  }\n\n  // eat comments\n  still_comments= true;\n  while(still_comments)\n  {\n    fgets(line,LINE_MAX,mesh_file);\n    still_comments = (line[0] == '#' || line[0] == '\\n');\n  }\n\n  sscanf(line,\" %s\",str);\n  // check that fifth word is Vertices\n  if(0!=strcmp(str,\"Vertices\"))\n  {\n    fprintf(stderr,\"Error: fifth word should be Vertices not %s\\n\",str);\n    fclose(mesh_file);\n    return false;\n  }\n\n  //fgets(line,LINE_MAX,mesh_file);\n\n  int number_of_vertices;\n  if(1 != fscanf(mesh_file,\" %d\",&number_of_vertices) || number_of_vertices > 1000000000)\n  {\n    fprintf(stderr,\"Error: expecting number of vertices less than 10^9...\\n\");\n    fclose(mesh_file);\n    return false;\n  }\n  // allocate space for vertices\n  V.resize(number_of_vertices,vector<Scalar>(3,0));\n  int extra;\n  for(int i = 0;i<number_of_vertices;i++)\n  {\n    double x,y,z;\n    if(4 != fscanf(mesh_file,\" %lg %lg %lg %d\",&x,&y,&z,&extra))\n    {\n      fprintf(stderr,\"Error: expecting vertex position...\\n\");\n      fclose(mesh_file);\n      return false;\n    }\n    V[i][0] = x;\n    V[i][1] = y;\n    V[i][2] = z;\n  }\n\n  // eat comments\n  still_comments= true;\n  while(still_comments)\n  {\n    fgets(line,LINE_MAX,mesh_file);\n    still_comments = (line[0] == '#' || line[0] == '\\n');\n  }\n\n  sscanf(line,\" %s\",str);\n  // check that sixth word is Triangles\n  if(0!=strcmp(str,\"Triangles\"))\n  {\n    fprintf(stderr,\"Error: sixth word should be Triangles not %s\\n\",str);\n    fclose(mesh_file);\n    return false;\n  }\n  int number_of_triangles;\n  if(1 != fscanf(mesh_file,\" %d\",&number_of_triangles))\n  {\n    fprintf(stderr,\"Error: expecting number of triangles...\\n\");\n    fclose(mesh_file);\n    return false;\n  }\n  // allocate space for triangles\n  F.resize(number_of_triangles,vector<Index>(3));\n  // triangle indices\n  int tri[3];\n  for(int i = 0;i<number_of_triangles;i++)\n  {\n    if(4 != fscanf(mesh_file,\" %d %d %d %d\",&tri[0],&tri[1],&tri[2],&extra))\n    {\n      printf(\"Error: expecting triangle indices...\\n\");\n      return false;\n    }\n    for(int j = 0;j<3;j++)\n    {\n      F[i][j] = tri[j]-1;\n    }\n  }\n\n  // eat comments\n  still_comments= true;\n  while(still_comments)\n  {\n    fgets(line,LINE_MAX,mesh_file);\n    still_comments = (line[0] == '#' || line[0] == '\\n');\n  }\n\n  sscanf(line,\" %s\",str);\n  // check that sixth word is Triangles\n  if(0!=strcmp(str,\"Tetrahedra\"))\n  {\n    fprintf(stderr,\"Error: seventh word should be Tetrahedra not %s\\n\",str);\n    fclose(mesh_file);\n    return false;\n  }\n  int number_of_tetrahedra;\n  if(1 != fscanf(mesh_file,\" %d\",&number_of_tetrahedra))\n  {\n    fprintf(stderr,\"Error: expecting number of tetrahedra...\\n\");\n    fclose(mesh_file);\n    return false;\n  }\n  // allocate space for tetrahedra\n  T.resize(number_of_tetrahedra,vector<Index>(4));\n  // tet indices\n  int a,b,c,d;\n  for(int i = 0;i<number_of_tetrahedra;i++)\n  {\n    if(5 != fscanf(mesh_file,\" %d %d %d %d %d\",&a,&b,&c,&d,&extra))\n    {\n      fprintf(stderr,\"Error: expecting tetrahedra indices...\\n\");\n      fclose(mesh_file);\n      return false;\n    }\n    T[i][0] = a-1;\n    T[i][1] = b-1;\n    T[i][2] = c-1;\n    T[i][3] = d-1;\n  }\n  fclose(mesh_file);\n  return true;\n}\n\n#include <Eigen/Core>\n#include \"list_to_matrix.h\"\n\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedT>\nIGL_INLINE bool igl::readMESH(\n  const std::string mesh_file_name,\n  Eigen::PlainObjectBase<DerivedV>& V,\n  Eigen::PlainObjectBase<DerivedT>& T,\n  Eigen::PlainObjectBase<DerivedF>& F)\n{\n  using namespace std;\n  FILE * mesh_file = fopen(mesh_file_name.c_str(),\"r\");\n  if(NULL==mesh_file)\n  {\n    fprintf(stderr,\"IOError: %s could not be opened...\",mesh_file_name.c_str());\n    return false;\n  }\n  return readMESH(mesh_file,V,T,F);\n}\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedT>\nIGL_INLINE bool igl::readMESH(\n  FILE * mesh_file,\n  Eigen::PlainObjectBase<DerivedV>& V,\n  Eigen::PlainObjectBase<DerivedT>& T,\n  Eigen::PlainObjectBase<DerivedF>& F)\n{\n  using namespace std;\n#ifndef LINE_MAX\n#  define LINE_MAX 2048\n#endif\n  char line[LINE_MAX];\n  bool still_comments;\n\n  // eat comments at beginning of file\n  still_comments= true;\n  while(still_comments)\n  {\n    fgets(line,LINE_MAX,mesh_file);\n    still_comments = (line[0] == '#' || line[0] == '\\n');\n  }\n\n  char str[LINE_MAX];\n  sscanf(line,\" %s\",str);\n  // check that first word is MeshVersionFormatted\n  if(0!=strcmp(str,\"MeshVersionFormatted\"))\n  {\n    fprintf(stderr,\n      \"Error: first word should be MeshVersionFormatted not %s\\n\",str);\n    fclose(mesh_file);\n    return false;\n  }\n  int one = -1;\n  if(2 != sscanf(line,\"%s %d\",str,&one))\n  {\n    // 1 appears on next line?\n    fscanf(mesh_file,\" %d\",&one);\n  }\n  if(one != 1)\n  {\n    fprintf(stderr,\"Error: second word should be 1 not %d\\n\",one);\n    fclose(mesh_file);\n    return false;\n  }\n\n  // eat comments\n  still_comments= true;\n  while(still_comments)\n  {\n    fgets(line,LINE_MAX,mesh_file);\n    still_comments = (line[0] == '#' || line[0] == '\\n');\n  }\n\n  sscanf(line,\" %s\",str);\n  // check that third word is Dimension\n  if(0!=strcmp(str,\"Dimension\"))\n  {\n    fprintf(stderr,\"Error: third word should be Dimension not %s\\n\",str);\n    fclose(mesh_file);\n    return false;\n  }\n  int three = -1;\n  if(2 != sscanf(line,\"%s %d\",str,&three))\n  {\n    // 1 appears on next line?\n    fscanf(mesh_file,\" %d\",&three);\n  }\n  if(three != 3)\n  {\n    fprintf(stderr,\"Error: only Dimension 3 supported not %d\\n\",three);\n    fclose(mesh_file);\n    return false;\n  }\n\n  // eat comments\n  still_comments= true;\n  while(still_comments)\n  {\n    fgets(line,LINE_MAX,mesh_file);\n    still_comments = (line[0] == '#' || line[0] == '\\n');\n  }\n\n  sscanf(line,\" %s\",str);\n  // check that fifth word is Vertices\n  if(0!=strcmp(str,\"Vertices\"))\n  {\n    fprintf(stderr,\"Error: fifth word should be Vertices not %s\\n\",str);\n    fclose(mesh_file);\n    return false;\n  }\n\n  //fgets(line,LINE_MAX,mesh_file);\n\n  int number_of_vertices;\n  if(1 != fscanf(mesh_file,\" %d\",&number_of_vertices) || number_of_vertices > 1000000000)\n  {\n    fprintf(stderr,\"Error: expecting number of vertices less than 10^9...\\n\");\n    fclose(mesh_file);\n    return false;\n  }\n  // allocate space for vertices\n  V.resize(number_of_vertices,3);\n  int extra;\n  for(int i = 0;i<number_of_vertices;i++)\n  {\n    double x,y,z;\n    if(4 != fscanf(mesh_file,\" %lg %lg %lg %d\",&x,&y,&z,&extra))\n    {\n      fprintf(stderr,\"Error: expecting vertex position...\\n\");\n      fclose(mesh_file);\n      return false;\n    }\n    V(i,0) = x;\n    V(i,1) = y;\n    V(i,2) = z;\n  }\n\n  // eat comments\n  still_comments= true;\n  while(still_comments)\n  {\n    fgets(line,LINE_MAX,mesh_file);\n    still_comments = (line[0] == '#' || line[0] == '\\n');\n  }\n\n  sscanf(line,\" %s\",str);\n  // check that sixth word is Triangles\n  if(0!=strcmp(str,\"Triangles\"))\n  {\n    fprintf(stderr,\"Error: sixth word should be Triangles not %s\\n\",str);\n    fclose(mesh_file);\n    return false;\n  }\n  int number_of_triangles;\n  if(1 != fscanf(mesh_file,\" %d\",&number_of_triangles))\n  {\n    fprintf(stderr,\"Error: expecting number of triangles...\\n\");\n    fclose(mesh_file);\n    return false;\n  }\n  // allocate space for triangles\n  F.resize(number_of_triangles,3);\n  // triangle indices\n  int tri[3];\n  for(int i = 0;i<number_of_triangles;i++)\n  {\n    if(4 != fscanf(mesh_file,\" %d %d %d %d\",&tri[0],&tri[1],&tri[2],&extra))\n    {\n      printf(\"Error: expecting triangle indices...\\n\");\n      return false;\n    }\n    for(int j = 0;j<3;j++)\n    {\n      F(i,j) = tri[j]-1;\n    }\n  }\n\n  // eat comments\n  still_comments= true;\n  while(still_comments)\n  {\n    fgets(line,LINE_MAX,mesh_file);\n    still_comments = (line[0] == '#' || line[0] == '\\n');\n  }\n\n  sscanf(line,\" %s\",str);\n  // check that sixth word is Triangles\n  if(0!=strcmp(str,\"Tetrahedra\"))\n  {\n    fprintf(stderr,\"Error: seventh word should be Tetrahedra not %s\\n\",str);\n    fclose(mesh_file);\n    return false;\n  }\n  int number_of_tetrahedra;\n  if(1 != fscanf(mesh_file,\" %d\",&number_of_tetrahedra))\n  {\n    fprintf(stderr,\"Error: expecting number of tetrahedra...\\n\");\n    fclose(mesh_file);\n    return false;\n  }\n  // allocate space for tetrahedra\n  T.resize(number_of_tetrahedra,4);\n  // tet indices\n  int a,b,c,d;\n  for(int i = 0;i<number_of_tetrahedra;i++)\n  {\n    if(5 != fscanf(mesh_file,\" %d %d %d %d %d\",&a,&b,&c,&d,&extra))\n    {\n      fprintf(stderr,\"Error: expecting tetrahedra indices...\\n\");\n      fclose(mesh_file);\n      return false;\n    }\n    T(i,0) = a-1;\n    T(i,1) = b-1;\n    T(i,2) = c-1;\n    T(i,3) = d-1;\n  }\n  fclose(mesh_file);\n  return true;\n}\n//{\n//  std::vector<std::vector<double> > vV,vT,vF;\n//  bool success = igl::readMESH(mesh_file_name,vV,vT,vF);\n//  if(!success)\n//  {\n//    // readMESH already printed error message to std err\n//    return false;\n//  }\n//  bool V_rect = igl::list_to_matrix(vV,V);\n//  if(!V_rect)\n//  {\n//    // igl::list_to_matrix(vV,V) already printed error message to std err\n//    return false;\n//  }\n//  bool T_rect = igl::list_to_matrix(vT,T);\n//  if(!T_rect)\n//  {\n//    // igl::list_to_matrix(vT,T) already printed error message to std err\n//    return false;\n//  }\n//  bool F_rect = igl::list_to_matrix(vF,F);\n//  if(!F_rect)\n//  {\n//    // igl::list_to_matrix(vF,F) already printed error message to std err\n//    return false;\n//  }\n//  assert(V.cols() == 3);\n//  assert(T.cols() == 4);\n//  assert(F.cols() == 3);\n//  return true;\n//}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate bool igl::readMESH<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n// generated by autoexplicit.sh\ntemplate bool igl::readMESH<Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<unsigned int, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<unsigned int, -1, 3, 1, -1, 3> >&);\n// generated by autoexplicit.sh\ntemplate bool igl::readMESH<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&);\n// generated by autoexplicit.sh\ntemplate bool igl::readMESH<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate bool igl::readMESH<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate bool igl::readMESH<double, int>(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > >&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&);\ntemplate bool igl::readMESH<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/readMESH.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_READMESH_H\n#define IGL_READMESH_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Core>\n#include <string>\n#include <vector>\n#include <cstdio>\n\nnamespace igl\n{\n  // load a tetrahedral volume mesh from a .mesh file\n  //\n  // Templates:\n  //   Scalar  type for positions and vectors (will be read as double and cast\n  //     to Scalar)\n  //   Index  type for indices (will be read as int and cast to Index)\n  // Input:\n  //   mesh_file_name  path of .mesh file\n  // Outputs:\n  //   V  double matrix of vertex positions  #V by 3\n  //   T  #T list of tet indices into vertex positions\n  //   F  #F list of face indices into vertex positions\n  //\n  // Known bugs: Holes and regions are not supported\n  template <typename Scalar, typename Index>\n  IGL_INLINE bool readMESH(\n    const std::string mesh_file_name,\n    std::vector<std::vector<Scalar > > & V,\n    std::vector<std::vector<Index > > & T,\n    std::vector<std::vector<Index > > & F);\n  // Inputs:\n  //   mesh_file  pointer to already opened .mesh file \n  // Outputs:\n  //   mesh_file  closed file\n  template <typename Scalar, typename Index>\n  IGL_INLINE bool readMESH(\n    FILE * mesh_file,\n    std::vector<std::vector<Scalar > > & V,\n    std::vector<std::vector<Index > > & T,\n    std::vector<std::vector<Index > > & F);\n\n  // Input:\n  //   mesh_file_name  path of .mesh file\n  // Outputs:\n  //   V  eigen double matrix #V by 3\n  //   T  eigen int matrix #T by 4\n  //   F  eigen int matrix #F by 3\n  template <typename DerivedV, typename DerivedF, typename DerivedT>\n  IGL_INLINE bool readMESH(\n    const std::string mesh_file_name,\n    Eigen::PlainObjectBase<DerivedV>& V,\n    Eigen::PlainObjectBase<DerivedT>& T,\n    Eigen::PlainObjectBase<DerivedF>& F);\n  // Inputs:\n  //   mesh_file  pointer to already opened .mesh file \n  // Outputs:\n  //   mesh_file  closed file\n  template <typename DerivedV, typename DerivedF, typename DerivedT>\n  IGL_INLINE bool readMESH(\n    FILE * mesh_file,\n    Eigen::PlainObjectBase<DerivedV>& V,\n    Eigen::PlainObjectBase<DerivedT>& T,\n    Eigen::PlainObjectBase<DerivedF>& F);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"readMESH.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/readNODE.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"readNODE.h\"\n#include \"matrix_to_list.h\"\n#include <stdio.h>\n\ntemplate <typename Scalar, typename Index>\nIGL_INLINE bool igl::readNODE(\n  const std::string node_file_name,\n  std::vector<std::vector<Scalar > > & V,\n  std::vector<std::vector<Index > > & I)\n{\n  // TODO: should be templated\n  Eigen::MatrixXd mV;\n  Eigen::MatrixXi mI;\n  if(igl::readNODE(node_file_name,mV,mI))\n  {\n    matrix_to_list(mV,V);\n    matrix_to_list(mI,I);\n    return true;\n  }else\n  {\n    return false;\n  }\n}\n\ntemplate <typename DerivedV, typename DerivedI>\nIGL_INLINE bool igl::readNODE(\n  const std::string node_file_name,\n  Eigen::PlainObjectBase<DerivedV>& V,\n  Eigen::PlainObjectBase<DerivedI>& I)\n{\n  using namespace std;\n  FILE * node_file = fopen(node_file_name.c_str(),\"r\");\n  if(NULL==node_file)\n  {\n    fprintf(stderr,\"readNODE: IOError: %s could not be opened...\\n\",\n      node_file_name.c_str());\n    return false;\n  }\n#ifndef LINE_MAX\n#  define LINE_MAX 2048\n#endif\n  char line[LINE_MAX];\n  bool still_comments;\n\n  // eat comments at beginning of file\n  still_comments= true;\n  while(still_comments)\n  {\n    fgets(line,LINE_MAX,node_file);\n    still_comments = (line[0] == '#' || line[0] == '\\n');\n  }\n\n  // Read header\n  // n  number of points\n  // dim  dimension\n  // num_attr  number of attributes\n  // num_bm  number of boundary markers\n  int n,dim,num_attr,num_bm;\n  int head_count = sscanf(line,\"%d %d %d %d\", &n, &dim, &num_attr, &num_bm);\n  if(head_count!=4)\n  {\n    fprintf(stderr,\"readNODE: Error: incorrect header in %s...\\n\",\n      node_file_name.c_str());\n    fclose(node_file);\n    return false;\n  }\n  if(num_attr)\n  {\n    fprintf(stderr,\"readNODE: Error: %d attributes found in %s. \"\n      \"Attributes are not supported...\\n\",\n      num_attr,\n      node_file_name.c_str());\n    fclose(node_file);\n    return false;\n  }\n  // Just quietly ignore boundary markers\n  //if(num_bm)\n  //{\n  //  fprintf(stderr,\"readNODE: Warning: %d boundary markers found in %s. \"\n  //    \"Boundary markers are ignored...\\n\",\n  //    num_bm,\n  //    node_file_name.c_str());\n  //}\n\n  // resize output\n  V.resize(n,dim);\n  I.resize(n,1);\n\n  int line_no = 0;\n  int p = 0;\n  while (fgets(line, LINE_MAX, node_file) != NULL) \n  {\n    line_no++;\n    // Skip comments and blank lines\n    if(line[0] == '#' || line[0] == '\\n')\n    {\n      continue;\n    }\n    char * l = line;\n    int offset;\n\n    if(sscanf(l,\"%d%n\",&I(p),&offset) != 1)\n    {\n      fprintf(stderr,\"readNODE Error: bad index (%d) in %s...\\n\",\n        line_no,\n        node_file_name.c_str());\n      fclose(node_file);\n      return false;\n    }\n    // adjust offset\n    l += offset;\n\n    // Read coordinates\n    for(int d = 0;d<dim;d++)\n    {\n      if(sscanf(l,\"%lf%n\",&V(p,d),&offset) != 1)\n      {\n        fprintf(stderr,\"readNODE Error: bad coordinates (%d) in %s...\\n\",\n          line_no,\n          node_file_name.c_str());\n        fclose(node_file);\n        return false;\n      }\n      // adjust offset\n      l += offset;\n    }\n    // Read boundary markers\n    for(int b = 0;b<num_bm;b++)\n    {\n      int dummy;\n      if(sscanf(l,\"%d%n\",&dummy,&offset) != 1)\n      {\n        fprintf(stderr,\"readNODE Error: bad boundary markers (%d) in %s...\\n\",\n          line_no,\n          node_file_name.c_str());\n        fclose(node_file);\n        return false;\n      }\n      // adjust offset\n      l += offset;\n    }\n    p++;\n  }\n\n  assert(p == V.rows());\n\n  fclose(node_file);\n  return true;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate bool igl::readNODE<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/readNODE.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_READNODE_H\n#define IGL_READNODE_H\n#include \"igl_inline.h\"\n\n#include <string>\n#include <vector>\n#include <Eigen/Core>\n\nnamespace igl\n{\n  // load a list of points from a .node file\n  //\n  // Templates:\n  //   Scalar  type for positions and vectors (will be read as double and cast\n  //     to Scalar)\n  //   Index  type for indices (will be read as int and cast to Index)\n  // Input:\n  //   node_file_name  path of .node file\n  // Outputs:\n  //   V  double matrix of vertex positions  #V by dim\n  //   I  list of indices (first tells whether 0 or 1 indexed)\n  template <typename Scalar, typename Index>\n  IGL_INLINE bool readNODE(\n    const std::string node_file_name,\n    std::vector<std::vector<Scalar > > & V,\n    std::vector<std::vector<Index > > & I);\n\n  // Input:\n  //   node_file_name  path of .node file\n  // Outputs:\n  //   V  eigen double matrix #V by dim\n  template <typename DerivedV, typename DerivedI>\n  IGL_INLINE bool readNODE(\n    const std::string node_file_name,\n    Eigen::PlainObjectBase<DerivedV>& V,\n    Eigen::PlainObjectBase<DerivedI>& I);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"readNODE.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/readOBJ.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"readOBJ.h\"\n\n#include \"list_to_matrix.h\"\n#include \"max_size.h\"\n#include \"min_size.h\"\n\n#include <iostream>\n#include <cstdio>\n#include <fstream>\n\ntemplate <typename Scalar, typename Index>\nIGL_INLINE bool igl::readOBJ(\n  const std::string obj_file_name,\n  std::vector<std::vector<Scalar > > & V,\n  std::vector<std::vector<Scalar > > & TC,\n  std::vector<std::vector<Scalar > > & N,\n  std::vector<std::vector<Index > > & F,\n  std::vector<std::vector<Index > > & FTC,\n  std::vector<std::vector<Index > > & FN)\n{\n  // Open file, and check for error\n  FILE * obj_file = fopen(obj_file_name.c_str(),\"r\");\n  if(NULL==obj_file)\n  {\n    fprintf(stderr,\"IOError: %s could not be opened...\\n\",\n            obj_file_name.c_str());\n    return false;\n  }\n  return igl::readOBJ(obj_file,V,TC,N,F,FTC,FN);\n}\n\ntemplate <typename Scalar, typename Index>\nIGL_INLINE bool igl::readOBJ(\n  FILE * obj_file,\n  std::vector<std::vector<Scalar > > & V,\n  std::vector<std::vector<Scalar > > & TC,\n  std::vector<std::vector<Scalar > > & N,\n  std::vector<std::vector<Index > > & F,\n  std::vector<std::vector<Index > > & FTC,\n  std::vector<std::vector<Index > > & FN)\n{\n  // File open was succesfull so clear outputs\n  V.clear();\n  TC.clear();\n  N.clear();\n  F.clear();\n  FTC.clear();\n  FN.clear();\n\n  // variables an constants to assist parsing the .obj file\n  // Constant strings to compare against\n  std::string v(\"v\");\n  std::string vn(\"vn\");\n  std::string vt(\"vt\");\n  std::string f(\"f\");\n  std::string tic_tac_toe(\"#\");\n#ifndef IGL_LINE_MAX\n#  define IGL_LINE_MAX 2048\n#endif\n\n  char line[IGL_LINE_MAX];\n  int line_no = 1;\n  while (fgets(line, IGL_LINE_MAX, obj_file) != NULL)\n  {\n    char type[IGL_LINE_MAX];\n    // Read first word containing type\n    if(sscanf(line, \"%s\",type) == 1)\n    {\n      // Get pointer to rest of line right after type\n      char * l = &line[strlen(type)];\n      if(type == v)\n      {\n        double x[4];\n        int count =\n        sscanf(l,\"%lf %lf %lf %lf\\n\",&x[0],&x[1],&x[2],&x[3]);\n        if(count != 3 && count != 4)\n        {\n          fprintf(stderr,\n                  \"Error: readOBJ() vertex on line %d should have 3 or 4 coordinates\",\n                  line_no);\n          fclose(obj_file);\n          return false;\n        }\n        std::vector<Scalar > vertex(count);\n        for(int i = 0;i<count;i++)\n        {\n          vertex[i] = x[i];\n        }\n        V.push_back(vertex);\n      }else if(type == vn)\n      {\n        double x[3];\n        int count =\n        sscanf(l,\"%lf %lf %lf\\n\",&x[0],&x[1],&x[2]);\n        if(count != 3)\n        {\n          fprintf(stderr,\n                  \"Error: readOBJ() normal on line %d should have 3 coordinates\",\n                  line_no);\n          fclose(obj_file);\n          return false;\n        }\n        std::vector<Scalar > normal(count);\n        for(int i = 0;i<count;i++)\n        {\n          normal[i] = x[i];\n        }\n        N.push_back(normal);\n      }else if(type == vt)\n      {\n        double x[3];\n        int count =\n        sscanf(l,\"%lf %lf %lf\\n\",&x[0],&x[1],&x[2]);\n        if(count != 2 && count != 3)\n        {\n          fprintf(stderr,\n                  \"Error: readOBJ() texture coords on line %d should have 2 \"\n                  \"or 3 coordinates (%d)\",\n                  line_no,count);\n          fclose(obj_file);\n          return false;\n        }\n        std::vector<Scalar > tex(count);\n        for(int i = 0;i<count;i++)\n        {\n          tex[i] = x[i];\n        }\n        TC.push_back(tex);\n      }else if(type == f)\n      {\n        const auto & shift = [&V](const int i)->int\n        {\n          return i<0 ? i+V.size() : i-1;\n        };\n        const auto & shift_t = [&TC](const int i)->int\n        {\n          return i<0 ? i+TC.size() : i-1;\n        };\n        const auto & shift_n = [&N](const int i)->int\n        {\n          return i<0 ? i+N.size() : i-1;\n        };\n        std::vector<Index > f;\n        std::vector<Index > ftc;\n        std::vector<Index > fn;\n        // Read each \"word\" after type\n        char word[IGL_LINE_MAX];\n        int offset;\n        while(sscanf(l,\"%s%n\",word,&offset) == 1)\n        {\n          // adjust offset\n          l += offset;\n          // Process word\n          long int i,it,in;\n          if(sscanf(word,\"%ld/%ld/%ld\",&i,&it,&in) == 3)\n          {\n            f.push_back(shift(i));\n            ftc.push_back(shift_t(it));\n            fn.push_back(shift_n(in));\n          }else if(sscanf(word,\"%ld/%ld\",&i,&it) == 2)\n          {\n            f.push_back(shift(i));\n            ftc.push_back(shift_t(it));\n          }else if(sscanf(word,\"%ld//%ld\",&i,&in) == 2)\n          {\n            f.push_back(shift(i));\n            fn.push_back(shift_n(in));\n          }else if(sscanf(word,\"%ld\",&i) == 1)\n          {\n            f.push_back(shift(i));\n          }else\n          {\n            fprintf(stderr,\n                    \"Error: readOBJ() face on line %d has invalid element format\\n\",\n                    line_no);\n            fclose(obj_file);\n            return false;\n          }\n        }\n        if(\n           (f.size()>0 && fn.size() == 0 && ftc.size() == 0) ||\n           (f.size()>0 && fn.size() == f.size() && ftc.size() == 0) ||\n           (f.size()>0 && fn.size() == 0 && ftc.size() == f.size()) ||\n           (f.size()>0 && fn.size() == f.size() && ftc.size() == f.size()))\n        {\n          // No matter what add each type to lists so that lists are the\n          // correct lengths\n          F.push_back(f);\n          FTC.push_back(ftc);\n          FN.push_back(fn);\n        }else\n        {\n          fprintf(stderr,\n                  \"Error: readOBJ() face on line %d has invalid format\\n\", line_no);\n          fclose(obj_file);\n          return false;\n        }\n      }else if(strlen(type) >= 1 && (type[0] == '#' ||\n            type[0] == 'g'  ||\n            type[0] == 's'  ||\n            strcmp(\"usemtl\",type)==0 ||\n            strcmp(\"mtllib\",type)==0))\n      {\n        //ignore comments or other shit\n      }else\n      {\n        //ignore any other lines\n        fprintf(stderr,\n                \"Warning: readOBJ() ignored non-comment line %d:\\n  %s\",\n                line_no,\n                line);\n      }\n    }else\n    {\n      // ignore empty line\n    }\n    line_no++;\n  }\n  fclose(obj_file);\n\n  assert(F.size() == FN.size());\n  assert(F.size() == FTC.size());\n\n  return true;\n}\n\ntemplate <typename Scalar, typename Index>\nIGL_INLINE bool igl::readOBJ(\n  const std::string obj_file_name,\n  std::vector<std::vector<Scalar > > & V,\n  std::vector<std::vector<Index > > & F)\n{\n  std::vector<std::vector<Scalar > > TC,N;\n  std::vector<std::vector<Index > > FTC,FN;\n  return readOBJ(obj_file_name,V,TC,N,F,FTC,FN);\n}\n\ntemplate <\n  typename DerivedV, \n  typename DerivedTC, \n  typename DerivedCN, \n  typename DerivedF,\n  typename DerivedFTC,\n  typename DerivedFN>\nIGL_INLINE bool igl::readOBJ(\n  const std::string str,\n  Eigen::PlainObjectBase<DerivedV>& V,\n  Eigen::PlainObjectBase<DerivedTC>& TC,\n  Eigen::PlainObjectBase<DerivedCN>& CN,\n  Eigen::PlainObjectBase<DerivedF>& F,\n  Eigen::PlainObjectBase<DerivedFTC>& FTC,\n  Eigen::PlainObjectBase<DerivedFN>& FN)\n{\n  std::vector<std::vector<double> > vV,vTC,vN;\n  std::vector<std::vector<int> > vF,vFTC,vFN;\n  bool success = igl::readOBJ(str,vV,vTC,vN,vF,vFTC,vFN);\n  if(!success)\n  {\n    // readOBJ(str,vV,vTC,vN,vF,vFTC,vFN) should have already printed an error\n    // message to stderr\n    return false;\n  }\n  bool V_rect = igl::list_to_matrix(vV,V);\n  const char * format = \"Failed to cast %s to matrix: min (%d) != max (%d)\\n\";\n  if(!V_rect)\n  {\n    printf(format,\"V\",igl::min_size(vV),igl::max_size(vV));\n    return false;\n  }\n  bool F_rect = igl::list_to_matrix(vF,F);\n  if(!F_rect)\n  {\n    printf(format,\"F\",igl::min_size(vF),igl::max_size(vF));\n    return false;\n  }\n  if(!vN.empty())\n  {\n    bool VN_rect = igl::list_to_matrix(vN,CN);\n    if(!VN_rect)\n    {\n      printf(format,\"CN\",igl::min_size(vN),igl::max_size(vN));\n      return false;\n    }\n  }\n\n  if(!vFN.empty() && !vFN[0].empty())\n  {\n    bool FN_rect = igl::list_to_matrix(vFN,FN);\n    if(!FN_rect)\n    {\n      printf(format,\"FN\",igl::min_size(vFN),igl::max_size(vFN));\n      return false;\n    }\n  }\n\n  if(!vTC.empty())\n  {\n\n    bool T_rect = igl::list_to_matrix(vTC,TC);\n    if(!T_rect)\n    {\n      printf(format,\"TC\",igl::min_size(vTC),igl::max_size(vTC));\n      return false;\n    }\n  }\n  if(!vFTC.empty()&& !vFTC[0].empty())\n  {\n\n    bool FTC_rect = igl::list_to_matrix(vFTC,FTC);\n    if(!FTC_rect)\n    {\n      printf(format,\"FTC\",igl::min_size(vFTC),igl::max_size(vFTC));\n      return false;\n    }\n  }\n  return true;\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE bool igl::readOBJ(\n  const std::string str,\n  Eigen::PlainObjectBase<DerivedV>& V,\n  Eigen::PlainObjectBase<DerivedF>& F)\n{\n  std::vector<std::vector<double> > vV,vTC,vN;\n  std::vector<std::vector<int> > vF,vFTC,vFN;\n  bool success = igl::readOBJ(str,vV,vTC,vN,vF,vFTC,vFN);\n  if(!success)\n  {\n    // readOBJ(str,vV,vTC,vN,vF,vFTC,vFN) should have already printed an error\n    // message to stderr\n    return false;\n  }\n  bool V_rect = igl::list_to_matrix(vV,V);\n  if(!V_rect)\n  {\n    // igl::list_to_matrix(vV,V) already printed error message to std err\n    return false;\n  }\n  bool F_rect = igl::list_to_matrix(vF,F);\n  if(!F_rect)\n  {\n    // igl::list_to_matrix(vF,F) already printed error message to std err\n    return false;\n  }\n  return true;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate bool igl::readOBJ<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n// generated by autoexplicit.sh\ntemplate bool igl::readOBJ<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n// generated by autoexplicit.sh\ntemplate bool igl::readOBJ<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n// generated by autoexplicit.sh\ntemplate bool igl::readOBJ<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n// generated by autoexplicit.sh\ntemplate bool igl::readOBJ<double, int>(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > >&, std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > >&, std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > >&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/readOBJ.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_READOBJ_H\n#define IGL_READOBJ_H\n#include \"igl_inline.h\"\n#include \"deprecated.h\"\n// History:\n//  return type changed from void to bool  Alec 18 Sept 2011\n//  added pure vector of vectors version that has much more support Alec 31 Oct\n//    2011\n\n#ifndef IGL_NO_EIGEN\n#  include <Eigen/Core>\n#endif\n#include <string>\n#include <vector>\n#include <cstdio>\n\nnamespace igl \n{\n  // Read a mesh from an ascii obj file, filling in vertex positions, normals\n  // and texture coordinates. Mesh may have faces of any number of degree\n  //\n  // Templates:\n  //   Scalar  type for positions and vectors (will be read as double and cast\n  //     to Scalar)\n  //   Index  type for indices (will be read as int and cast to Index)\n  // Inputs:\n  //  str  path to .obj file\n  // Outputs:\n  //   V  double matrix of vertex positions  #V by 3\n  //   TC  double matrix of texture coordinats #TC by 2\n  //   N  double matrix of corner normals #N by 3\n  //   F  #F list of face indices into vertex positions\n  //   FTC  #F list of face indices into vertex texture coordinates\n  //   FN  #F list of face indices into vertex normals\n  // Returns true on success, false on errors\n  template <typename Scalar, typename Index>\n  IGL_INLINE bool readOBJ(\n    const std::string obj_file_name, \n    std::vector<std::vector<Scalar > > & V,\n    std::vector<std::vector<Scalar > > & TC,\n    std::vector<std::vector<Scalar > > & N,\n    std::vector<std::vector<Index > > & F,\n    std::vector<std::vector<Index > > & FTC,\n    std::vector<std::vector<Index > > & FN);\n  // Inputs:\n  //   obj_file  pointer to already opened .obj file \n  // Outputs:\n  //   obj_file  closed file\n  template <typename Scalar, typename Index>\n  IGL_INLINE bool readOBJ(\n    FILE * obj_file,\n    std::vector<std::vector<Scalar > > & V,\n    std::vector<std::vector<Scalar > > & TC,\n    std::vector<std::vector<Scalar > > & N,\n    std::vector<std::vector<Index > > & F,\n    std::vector<std::vector<Index > > & FTC,\n    std::vector<std::vector<Index > > & FN);\n  // Just V and F\n  template <typename Scalar, typename Index>\n  IGL_INLINE bool readOBJ(\n    const std::string obj_file_name, \n    std::vector<std::vector<Scalar > > & V,\n    std::vector<std::vector<Index > > & F);\n  // Eigen Wrappers. These will return true only if the data is perfectly\n  // \"rectangular\": All faces are the same degree, all have the same number of\n  // textures/normals etc.\n  template <\n    typename DerivedV, \n    typename DerivedTC, \n    typename DerivedCN, \n    typename DerivedF,\n    typename DerivedFTC,\n    typename DerivedFN>\n  IGL_INLINE bool readOBJ(\n    const std::string str,\n    Eigen::PlainObjectBase<DerivedV>& V,\n    Eigen::PlainObjectBase<DerivedTC>& TC,\n    Eigen::PlainObjectBase<DerivedCN>& CN,\n    Eigen::PlainObjectBase<DerivedF>& F,\n    Eigen::PlainObjectBase<DerivedFTC>& FTC,\n    Eigen::PlainObjectBase<DerivedFN>& FN);\n  template <typename DerivedV, typename DerivedF>\n  IGL_INLINE bool readOBJ(\n    const std::string str,\n    Eigen::PlainObjectBase<DerivedV>& V,\n    Eigen::PlainObjectBase<DerivedF>& F);\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"readOBJ.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/readOFF.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"readOFF.h\"\n#include \"list_to_matrix.h\"\n\ntemplate <typename Scalar, typename Index>\nIGL_INLINE bool igl::readOFF(\n  const std::string off_file_name,\n  std::vector<std::vector<Scalar > > & V,\n  std::vector<std::vector<Index > > & F,\n  std::vector<std::vector<Scalar > > & N,\n  std::vector<std::vector<Scalar > > & C)\n{\n  using namespace std;\n  FILE * off_file = fopen(off_file_name.c_str(),\"r\");\n  if(NULL==off_file)\n  {\n    printf(\"IOError: %s could not be opened...\\n\",off_file_name.c_str());\n    return false;\n  }\n  return readOFF(off_file,V,F,N,C);\n}\n\ntemplate <typename Scalar, typename Index>\nIGL_INLINE bool igl::readOFF(\n  FILE * off_file,\n  std::vector<std::vector<Scalar > > & V,\n  std::vector<std::vector<Index > > & F,\n  std::vector<std::vector<Scalar > > & N,\n  std::vector<std::vector<Scalar > > & C)\n{\n  using namespace std;\n  V.clear();\n  F.clear();\n  N.clear();\n  C.clear();\n\n  // First line is always OFF\n  char header[1000];\n  const std::string OFF(\"OFF\");\n  const std::string NOFF(\"NOFF\");\n  const std::string COFF(\"COFF\");\n  if(fscanf(off_file,\"%s\\n\",header)!=1\n     || !(\n       string(header).compare(0, OFF.length(), OFF)==0 ||\n       string(header).compare(0, COFF.length(), COFF)==0 ||\n       string(header).compare(0,NOFF.length(),NOFF)==0))\n  {\n    printf(\"Error: readOFF() first line should be OFF or NOFF or COFF, not %s...\",header);\n    fclose(off_file);\n    return false;\n  }\n  bool has_normals = string(header).compare(0,NOFF.length(),NOFF)==0;\n  bool has_vertexColors = string(header).compare(0,COFF.length(),COFF)==0;\n  // Second line is #vertices #faces #edges\n  int number_of_vertices;\n  int number_of_faces;\n  int number_of_edges;\n  char tic_tac_toe;\n  char line[1000];\n  bool still_comments = true;\n  while(still_comments)\n  {\n    fgets(line,1000,off_file);\n    still_comments = line[0] == '#';\n  }\n  sscanf(line,\"%d %d %d\",&number_of_vertices,&number_of_faces,&number_of_edges);\n  V.resize(number_of_vertices);\n  if (has_normals)\n    N.resize(number_of_vertices);\n  if (has_vertexColors)\n    C.resize(number_of_vertices);\n  F.resize(number_of_faces);\n  //printf(\"%s %d %d %d\\n\",(has_normals ? \"NOFF\" : \"OFF\"),number_of_vertices,number_of_faces,number_of_edges);\n  // Read vertices\n  for(int i = 0;i<number_of_vertices;)\n  {\n    fgets(line, 1000, off_file);\n    double x,y,z,nx,ny,nz;\n    if(sscanf(line, \"%lg %lg %lg %lg %lg %lg\",&x,&y,&z,&nx,&ny,&nz)>= 3)\n    {\n      std::vector<Scalar > vertex;\n      vertex.resize(3);\n      vertex[0] = x;\n      vertex[1] = y;\n      vertex[2] = z;\n      V[i] = vertex;\n\n      if (has_normals)\n      {\n        std::vector<Scalar > normal;\n        normal.resize(3);\n        normal[0] = nx;\n        normal[1] = ny;\n        normal[2] = nz;\n        N[i] = normal;\n      }\n\n      if (has_vertexColors)\n      {\n        C[i].resize(3);\n        C[i][0] = nx / 255.0;\n        C[i][1] = ny / 255.0;\n        C[i][2] = nz / 255.0;\n      }\n      i++;\n    }else if(\n        fscanf(off_file,\"%[#]\",&tic_tac_toe)==1)\n    {\n      char comment[1000];\n      fscanf(off_file,\"%[^\\n]\",comment);\n    }else\n    {\n      printf(\"Error: bad line (%d)\\n\",i);\n      if(feof(off_file))\n      {\n        fclose(off_file);\n        return false;\n      }\n    }\n  }\n  // Read faces\n  for(int i = 0;i<number_of_faces;)\n  {\n    std::vector<Index > face;\n    int valence;\n    if(fscanf(off_file,\"%d\",&valence)==1)\n    {\n      face.resize(valence);\n      for(int j = 0;j<valence;j++)\n      {\n        int index;\n        if(j<valence-1)\n        {\n          fscanf(off_file,\"%d\",&index);\n        }else{\n          fscanf(off_file,\"%d%*[^\\n]\",&index);\n        }\n\n        face[j] = index;\n      }\n      F[i] = face;\n      i++;\n    }else if(\n             fscanf(off_file,\"%[#]\",&tic_tac_toe)==1)\n    {\n      char comment[1000];\n      fscanf(off_file,\"%[^\\n]\",comment);\n    }else\n    {\n      printf(\"Error: bad line\\n\");\n      fclose(off_file);\n      return false;\n    }\n  }\n  fclose(off_file);\n  return true;\n}\n\n\n#ifndef IGL_NO_EIGEN\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE bool igl::readOFF(\n  const std::string str,\n  Eigen::PlainObjectBase<DerivedV>& V,\n  Eigen::PlainObjectBase<DerivedF>& F)\n{\n  std::vector<std::vector<double> > vV;\n  std::vector<std::vector<double> > vN;\n  std::vector<std::vector<int> > vF;\n  std::vector<std::vector<double> > vC;\n  bool success = igl::readOFF(str,vV,vF,vN,vC);\n  if(!success)\n  {\n    // readOFF(str,vV,vF,vN,vC) should have already printed an error\n    // message to stderr\n    return false;\n  }\n  bool V_rect = igl::list_to_matrix(vV,V);\n  if(!V_rect)\n  {\n    // igl::list_to_matrix(vV,V) already printed error message to std err\n    return false;\n  }\n  bool F_rect = igl::list_to_matrix(vF,F);\n  if(!F_rect)\n  {\n    // igl::list_to_matrix(vF,F) already printed error message to std err\n    return false;\n  }\n  return true;\n}\n\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE bool igl::readOFF(\n  const std::string str,\n  Eigen::PlainObjectBase<DerivedV>& V,\n  Eigen::PlainObjectBase<DerivedF>& F,\n  Eigen::PlainObjectBase<DerivedV>& N)\n{\n  std::vector<std::vector<double> > vV;\n  std::vector<std::vector<double> > vN;\n  std::vector<std::vector<int> > vF;\n  std::vector<std::vector<double> > vC;\n  bool success = igl::readOFF(str,vV,vF,vN,vC);\n  if(!success)\n  {\n    // readOFF(str,vV,vF,vC) should have already printed an error\n    // message to stderr\n    return false;\n  }\n  bool V_rect = igl::list_to_matrix(vV,V);\n  if(!V_rect)\n  {\n    // igl::list_to_matrix(vV,V) already printed error message to std err\n    return false;\n  }\n  bool F_rect = igl::list_to_matrix(vF,F);\n  if(!F_rect)\n  {\n    // igl::list_to_matrix(vF,F) already printed error message to std err\n    return false;\n  }\n\n  if (vN.size())\n  {\n    bool N_rect = igl::list_to_matrix(vN,N);\n    if(!N_rect)\n    {\n      // igl::list_to_matrix(vN,N) already printed error message to std err\n      return false;\n    }\n  }\n\n  //Warning: RGB colors will be returned in the N matrix\n  if (vC.size())\n  {\n    bool C_rect = igl::list_to_matrix(vC,N);\n    if(!C_rect)\n    {\n      // igl::list_to_matrix(vC,N) already printed error message to std err\n      return false;\n    }\n  }\n\n  return true;\n}\n#endif\n\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate bool igl::readOFF<double, int>(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > >&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&, std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > >&, std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > >&);\n// generated by autoexplicit.sh\ntemplate bool igl::readOFF<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n// generated by autoexplicit.sh\ntemplate bool igl::readOFF<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate bool igl::readOFF<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1> >&);\ntemplate bool igl::readOFF<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(std::string, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&);\ntemplate bool igl::readOFF<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/readOFF.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_READOFF_H\n#define IGL_READOFF_H\n#include \"igl_inline.h\"\n// History:\n//  return type changed from void to bool  Alec 18 Sept 2011\n\n#ifndef IGL_NO_EIGEN\n#  include <Eigen/Core>\n#endif\n#include <string>\n#include <vector>\n#include <cstdio>\n\nnamespace igl \n{\n  \n  // Read a mesh from an ascii OFF file, filling in vertex positions, normals\n  // and texture coordinates. Mesh may have faces of any number of degree\n  //\n  // Templates:\n  //   Scalar  type for positions and vectors (will be read as double and cast\n  //     to Scalar)\n  //   Index  type for indices (will be read as int and cast to Index)\n  // Inputs:\n  //  str  path to .obj file\n  // Outputs:\n  //   V  double matrix of vertex positions  #V by 3\n  //   F  #F list of face indices into vertex positions\n  //   N  list of vertex normals #V by 3\n  //   C  list of rgb color values per vertex #V by 3\n  // Returns true on success, false on errors\n  template <typename Scalar, typename Index>\n  IGL_INLINE bool readOFF(\n    const std::string off_file_name, \n    std::vector<std::vector<Scalar > > & V,\n    std::vector<std::vector<Index > > & F,\n    std::vector<std::vector<Scalar > > & N,\n    std::vector<std::vector<Scalar > > & C);\n  // Inputs:\n  //   off_file  pointer to already opened .off file \n  // Outputs:\n  //   off_file  closed file\n  template <typename Scalar, typename Index>\n  IGL_INLINE bool readOFF(\n    FILE * off_file,\n    std::vector<std::vector<Scalar > > & V,\n    std::vector<std::vector<Index > > & F,\n    std::vector<std::vector<Scalar > > & N,\n    std::vector<std::vector<Scalar > > & C);\n  \n  \n#ifndef IGL_NO_EIGEN\n  // read mesh from a ascii off file\n  // Inputs:\n  //   str  path to .off file\n  // Outputs:\n  //   V  eigen double matrix #V by 3\n  //   F  eigen int matrix #F by 3\n  template <typename DerivedV, typename DerivedF>\n  IGL_INLINE bool readOFF(\n    const std::string str,\n    Eigen::PlainObjectBase<DerivedV>& V,\n    Eigen::PlainObjectBase<DerivedF>& F);\n\n  template <typename DerivedV, typename DerivedF>\n  IGL_INLINE bool readOFF(\n    const std::string str,\n    Eigen::PlainObjectBase<DerivedV>& V,\n    Eigen::PlainObjectBase<DerivedF>& F,\n    Eigen::PlainObjectBase<DerivedV>& N);\n#endif\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"readOFF.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/readPLY.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"readPLY.h\"\n#include \"list_to_matrix.h\"\n#include \"ply.h\"\n#include <iostream>\n\ntemplate <\n  typename Vtype,\n  typename Ftype,\n  typename Ntype,\n  typename UVtype>\nIGL_INLINE bool igl::readPLY(\n  const std::string & filename,\n  std::vector<std::vector<Vtype> > & V,\n  std::vector<std::vector<Ftype> > & F,\n  std::vector<std::vector<Ntype> > & N,\n  std::vector<std::vector<UVtype> >  & UV)\n{\n  using namespace std;\n  // Largely follows ply2iv.c\n  FILE * ply_file = fopen(filename.c_str(),\"r\");\n  if(ply_file == NULL)\n  {\n    return false;\n  }\n  return readPLY(ply_file,V,F,N,UV);\n}\n\ntemplate <\n  typename Vtype,\n  typename Ftype,\n  typename Ntype,\n  typename UVtype>\nIGL_INLINE bool igl::readPLY(\n  FILE * ply_file,\n  std::vector<std::vector<Vtype> > & V,\n  std::vector<std::vector<Ftype> > & F,\n  std::vector<std::vector<Ntype> > & N,\n  std::vector<std::vector<UVtype> >  & UV)\n{\n  using namespace std;\n   typedef struct Vertex {\n     double x,y,z;          /* position */\n     double nx,ny,nz;         /* surface normal */\n     double s,t;              /* texture coordinates */\n     void *other_props;       /* other properties */\n   } Vertex;\n\n   typedef struct Face {\n     unsigned char nverts;    /* number of vertex indices in list */\n     int *verts;              /* vertex index list */\n     void *other_props;       /* other properties */\n   } Face;\n\n  PlyProperty vert_props[] = { /* list of property information for a vertex */\n    {\"x\", PLY_DOUBLE, PLY_DOUBLE, offsetof(Vertex,x), 0, 0, 0, 0},\n    {\"y\", PLY_DOUBLE, PLY_DOUBLE, offsetof(Vertex,y), 0, 0, 0, 0},\n    {\"z\", PLY_DOUBLE, PLY_DOUBLE, offsetof(Vertex,z), 0, 0, 0, 0},\n    {\"nx\", PLY_DOUBLE, PLY_DOUBLE, offsetof(Vertex,nx), 0, 0, 0, 0},\n    {\"ny\", PLY_DOUBLE, PLY_DOUBLE, offsetof(Vertex,ny), 0, 0, 0, 0},\n    {\"nz\", PLY_DOUBLE, PLY_DOUBLE, offsetof(Vertex,nz), 0, 0, 0, 0},\n    {\"s\", PLY_DOUBLE, PLY_DOUBLE, offsetof(Vertex,s), 0, 0, 0, 0},\n    {\"t\", PLY_DOUBLE, PLY_DOUBLE, offsetof(Vertex,t), 0, 0, 0, 0},\n  };\n\n  PlyProperty face_props[] = { /* list of property information for a face */\n    {\"vertex_indices\", PLY_INT, PLY_INT, offsetof(Face,verts),\n      1, PLY_UCHAR, PLY_UCHAR, offsetof(Face,nverts)},\n  };\n\n  int nelems;\n  char ** elem_names;\n  PlyFile * in_ply = ply_read(ply_file,&nelems,&elem_names);\n  if(in_ply==NULL)\n  {\n    return false;\n  }\n\n  bool has_normals = false;\n  bool has_texture_coords = false;\n  PlyProperty **plist;\n  int nprops;\n  int elem_count;\n  plist = ply_get_element_description (in_ply,\"vertex\", &elem_count, &nprops);\n  if (plist != NULL)\n  {\n    /* set up for getting vertex elements */\n    ply_get_property (in_ply,\"vertex\",&vert_props[0]);\n    ply_get_property (in_ply,\"vertex\",&vert_props[1]);\n    ply_get_property (in_ply,\"vertex\",&vert_props[2]);\n    for (int j = 0; j < nprops; j++)\n    {\n      PlyProperty * prop = plist[j];\n      if (equal_strings (\"nx\", prop->name) \n        || equal_strings (\"ny\", prop->name)\n        || equal_strings (\"nz\", prop->name))\n      {\n        ply_get_property (in_ply,\"vertex\",&vert_props[3]);\n        ply_get_property (in_ply,\"vertex\",&vert_props[4]);\n        ply_get_property (in_ply,\"vertex\",&vert_props[5]);\n        has_normals = true;\n      }\n      if (equal_strings (\"s\", prop->name) ||\n        equal_strings (\"t\", prop->name))\n      {\n        ply_get_property(in_ply,\"vertex\",&vert_props[6]);\n        ply_get_property(in_ply,\"vertex\",&vert_props[7]);\n        has_texture_coords = true;\n      }\n    }\n    // Is this call necessary?\n    ply_get_other_properties(in_ply,\"vertex\",\n\t\t\t\t     offsetof(Vertex,other_props));\n    V.resize(elem_count,std::vector<Vtype>(3));\n    if(has_normals)\n    {\n      N.resize(elem_count,std::vector<Ntype>(3));\n    }else\n    {\n      N.resize(0);\n    }\n    if(has_texture_coords)\n    {\n      UV.resize(elem_count,std::vector<UVtype>(2));\n    }else\n    {\n      UV.resize(0);\n    }\n    for(int j = 0;j<elem_count;j++)\n    {\n      Vertex v;\n      ply_get_element_setup(in_ply,\"vertex\",3,vert_props);\n      ply_get_element(in_ply,(void*)&v);\n      V[j][0] = v.x;\n      V[j][1] = v.y;\n      V[j][2] = v.z;\n      if(has_normals)\n      {\n        N[j][0] = v.nx;\n        N[j][1] = v.ny;\n        N[j][2] = v.nz;\n      }\n      if(has_texture_coords)\n      {\n        UV[j][0] = v.s;\n        UV[j][1] = v.t;\n      }\n    }\n  }\n  plist = ply_get_element_description (in_ply,\"face\", &elem_count, &nprops);\n  if (plist != NULL)\n  {\n    F.resize(elem_count);\n    ply_get_property(in_ply,\"face\",&face_props[0]);\n    for (int j = 0; j < elem_count; j++) \n    {\n      Face f;\n      ply_get_element(in_ply, (void *) &f);\n      for(size_t c = 0;c<f.nverts;c++)\n      {\n        F[j].push_back(f.verts[c]);\n      }\n    }\n  }\n  ply_close(in_ply);\n  return true;\n}\n\ntemplate <\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedN,\n  typename DerivedUV>\nIGL_INLINE bool igl::readPLY(\n  const std::string & filename,\n  Eigen::PlainObjectBase<DerivedV> & V,\n  Eigen::PlainObjectBase<DerivedF> & F,\n  Eigen::PlainObjectBase<DerivedN> & N,\n  Eigen::PlainObjectBase<DerivedUV> & UV)\n{\n  std::vector<std::vector<typename DerivedV::Scalar> > vV;\n  std::vector<std::vector<typename DerivedF::Scalar> > vF;\n  std::vector<std::vector<typename DerivedN::Scalar> > vN;\n  std::vector<std::vector<typename DerivedUV::Scalar> > vUV;\n  if(!readPLY(filename,vV,vF,vN,vUV))\n  {\n    return false;\n  }\n  return \n    list_to_matrix(vV,V) &&\n    list_to_matrix(vF,F) &&\n    list_to_matrix(vN,N) &&\n    list_to_matrix(vUV,UV);\n}\n\ntemplate <\n  typename DerivedV,\n  typename DerivedF>\nIGL_INLINE bool igl::readPLY(\n  const std::string & filename,\n  Eigen::PlainObjectBase<DerivedV> & V,\n  Eigen::PlainObjectBase<DerivedF> & F)\n{\n  Eigen::MatrixXd N,UV;\n  return readPLY(filename,V,F,N,UV);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate bool igl::readPLY<double, int, double, double>(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > >&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&, std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > >&, std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/readPLY.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_READPLY_H\n#define IGL_READPLY_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <string>\n#include <vector>\n#include <cstdio>\n\nnamespace igl\n{\n  // Read a mesh from a .ply file. \n  //\n  // Inputs:\n  //   filename  path to .ply file\n  // Outputs:\n  //   V  #V by 3 list of vertex positions\n  //   F  #F list of lists of triangle indices\n  //   N  #V by 3 list of vertex normals\n  //   UV  #V by 2 list of vertex texture coordinates\n  // Returns true iff success\n  template <\n    typename Vtype,\n    typename Ftype,\n    typename Ntype,\n    typename UVtype>\n  IGL_INLINE bool readPLY(\n    const std::string & filename,\n    std::vector<std::vector<Vtype> > & V,\n    std::vector<std::vector<Ftype> > & F,\n    std::vector<std::vector<Ntype> > & N,\n    std::vector<std::vector<UVtype> >  & UV);\n  template <\n    typename Vtype,\n    typename Ftype,\n    typename Ntype,\n    typename UVtype>\n  // Inputs:\n  //   ply_file  pointer to already opened .ply file \n  // Outputs:\n  //   ply_file  closed file\n  IGL_INLINE bool readPLY(\n    FILE * ply_file,\n    std::vector<std::vector<Vtype> > & V,\n    std::vector<std::vector<Ftype> > & F,\n    std::vector<std::vector<Ntype> > & N,\n    std::vector<std::vector<UVtype> >  & UV);\n    template <\n    typename DerivedV,\n    typename DerivedF,\n    typename DerivedN,\n    typename DerivedUV>\n  IGL_INLINE bool readPLY(\n    const std::string & filename,\n    Eigen::PlainObjectBase<DerivedV> & V,\n    Eigen::PlainObjectBase<DerivedF> & F,\n    Eigen::PlainObjectBase<DerivedN> & N,\n    Eigen::PlainObjectBase<DerivedUV> & UV);\n  template <\n    typename DerivedV,\n    typename DerivedF>\n  IGL_INLINE bool readPLY(\n    const std::string & filename,\n    Eigen::PlainObjectBase<DerivedV> & V,\n    Eigen::PlainObjectBase<DerivedF> & F);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"readPLY.cpp\"\n#endif\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/readSTL.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"readSTL.h\"\n#include \"list_to_matrix.h\"\n\n#include <iostream>\ntemplate <typename DerivedV, typename DerivedF, typename DerivedN>\nIGL_INLINE bool igl::readSTL(\n  const std::string & filename,\n  Eigen::PlainObjectBase<DerivedV> & V,\n  Eigen::PlainObjectBase<DerivedF> & F,\n  Eigen::PlainObjectBase<DerivedN> & N)\n{\n  using namespace std;\n  vector<vector<typename DerivedV::Scalar> > vV;\n  vector<vector<typename DerivedN::Scalar> > vN;\n  vector<vector<typename DerivedF::Scalar> > vF;\n  if(!readSTL(filename,vV,vF,vN))\n  {\n    return false;\n  }\n\n  if(!list_to_matrix(vV,V))\n  {\n    return false;\n  }\n\n  if(!list_to_matrix(vF,F))\n  {\n    return false;\n  }\n\n  if(!list_to_matrix(vN,N))\n  {\n    return false;\n  }\n  return true;\n}\n\ntemplate <typename TypeV, typename TypeF, typename TypeN>\nIGL_INLINE bool igl::readSTL(\n  const std::string & filename,\n  std::vector<std::vector<TypeV> > & V,\n  std::vector<std::vector<TypeF> > & F,\n  std::vector<std::vector<TypeN> > & N)\n{\n  using namespace std;\n  // Should test for ascii\n\n  // Open file, and check for error\n  FILE * stl_file = fopen(filename.c_str(),\"rb\");\n  if(NULL==stl_file)\n  {\n    fprintf(stderr,\"IOError: %s could not be opened...\\n\",\n            filename.c_str());\n    return false;\n  }\n  return readSTL(stl_file,V,F,N);\n}\n\ntemplate <typename TypeV, typename TypeF, typename TypeN>\nIGL_INLINE bool igl::readSTL(\n  FILE * stl_file, \n  std::vector<std::vector<TypeV> > & V,\n  std::vector<std::vector<TypeF> > & F,\n  std::vector<std::vector<TypeN> > & N)\n{\n  using namespace std;\n  stl_file = freopen(NULL,\"rb\",stl_file);\n  if(NULL==stl_file)\n  {\n    fprintf(stderr,\"IOError: stl file could not be reopened as binary (1) ...\\n\");\n    return false;\n  }\n\n  V.clear();\n  F.clear();\n  N.clear();\n\n\n  // Specifically 80 character header\n  char header[80];\n  char solid[80];\n  bool is_ascii = true;\n  if(fread(header,1,80,stl_file) != 80)\n  {\n    cerr<<\"IOError: too short (1).\"<<endl;\n    goto close_false;\n  }\n  sscanf(header,\"%s\",solid);\n  if(string(\"solid\") != solid)\n  {\n    // definitely **not** ascii \n    is_ascii = false;\n  }else\n  {\n    // might still be binary\n    char buf[4];\n    if(fread(buf,1,4,stl_file) != 4)\n    {\n      cerr<<\"IOError: too short (3).\"<<endl;\n      goto close_false;\n    }\n    size_t num_faces = *reinterpret_cast<unsigned int*>(buf);\n    fseek(stl_file,0,SEEK_END);\n    int file_size = ftell(stl_file);\n    if(file_size == 80 + 4 + (4*12 + 2) * num_faces)\n    {\n      is_ascii = false;\n    }else\n    {\n      is_ascii = true;\n    }\n  }\n\n  if(is_ascii)\n  {\n    // Rewind to end of header\n    //stl_file = fopen(filename.c_str(),\"r\");\n    stl_file = freopen(NULL,\"r\",stl_file);\n    if(NULL==stl_file)\n    {\n      fprintf(stderr,\"IOError: stl file could not be reopened as ascii ...\\n\");\n      return false;\n    }\n    // Read 80 header\n    // Eat file name\n#ifndef IGL_LINE_MAX\n#  define IGL_LINE_MAX 2048\n#endif\n    char name[IGL_LINE_MAX];\n    if(NULL==fgets(name,IGL_LINE_MAX,stl_file))\n    {\n      cerr<<\"IOError: ascii too short (2).\"<<endl;\n      goto close_false;\n    }\n    // ascii\n    while(true)\n    {\n      int ret;\n      char facet[IGL_LINE_MAX],normal[IGL_LINE_MAX];\n      vector<TypeN > n(3);\n      double nd[3];\n      ret = fscanf(stl_file,\"%s %s %lg %lg %lg\",facet,normal,nd,nd+1,nd+2);\n      if(string(\"endsolid\") == facet)\n      {\n        break;\n      }\n      if(ret != 5 || \n          !(string(\"facet\") == facet || \n          string(\"faced\") == facet) ||\n          string(\"normal\") != normal)\n      {\n        cout<<\"facet: \"<<facet<<endl;\n        cout<<\"normal: \"<<normal<<endl;\n        cerr<<\"IOError: bad format (1).\"<<endl;\n        goto close_false;\n      }\n      // copy casts to Type\n      n[0] = nd[0]; n[1] = nd[1]; n[2] = nd[2];\n      N.push_back(n);\n      char outer[IGL_LINE_MAX], loop[IGL_LINE_MAX];\n      ret = fscanf(stl_file,\"%s %s\",outer,loop);\n      if(ret != 2 || string(\"outer\") != outer || string(\"loop\") != loop)\n      {\n        cerr<<\"IOError: bad format (2).\"<<endl;\n        goto close_false;\n      }\n      vector<TypeF> f;\n      while(true)\n      {\n        char word[IGL_LINE_MAX];\n        int ret = fscanf(stl_file,\"%s\",word);\n        if(ret == 1 && string(\"endloop\") == word)\n        {\n          break;\n        }else if(ret == 1 && string(\"vertex\") == word)\n        {\n          vector<TypeV> v(3);\n          double vd[3];\n          int ret = fscanf(stl_file,\"%lg %lg %lg\",vd,vd+1,vd+2);\n          if(ret != 3)\n          {\n            cerr<<\"IOError: bad format (3).\"<<endl;\n            goto close_false;\n          }\n          f.push_back(V.size());\n          // copy casts to Type\n          v[0] = vd[0]; v[1] = vd[1]; v[2] = vd[2];\n          V.push_back(v);\n        }else\n        {\n          cerr<<\"IOError: bad format (4).\"<<endl;\n          goto close_false;\n        }\n      }\n      F.push_back(f);\n      char endfacet[IGL_LINE_MAX];\n      ret = fscanf(stl_file,\"%s\",endfacet);\n      if(ret != 1 || string(\"endfacet\") != endfacet)\n      {\n        cerr<<\"IOError: bad format (5).\"<<endl;\n        goto close_false;\n      }\n    }\n    // read endfacet\n    goto close_true;\n  }else\n  {\n    // Binary\n    stl_file = freopen(NULL,\"rb\",stl_file);\n    // Read 80 header\n    char header[80];\n    if(fread(header,sizeof(char),80,stl_file)!=80)\n    {\n      cerr<<\"IOError: bad format (6).\"<<endl;\n      goto close_false;\n    }\n    // Read number of triangles\n    unsigned int num_tri;\n    if(fread(&num_tri,sizeof(unsigned int),1,stl_file)!=1)\n    {\n      cerr<<\"IOError: bad format (7).\"<<endl;\n      goto close_false;\n    }\n    V.resize(num_tri*3,vector<TypeV >(3,0));\n    N.resize(num_tri,vector<TypeN >(3,0));\n    F.resize(num_tri,vector<TypeF >(3,0));\n    for(int t = 0;t<(int)num_tri;t++)\n    {\n      // Read normal\n      float n[3];\n      if(fread(n,sizeof(float),3,stl_file)!=3)\n      {\n        cerr<<\"IOError: bad format (8).\"<<endl;\n        goto close_false;\n      }\n      // Read each vertex\n      for(int c = 0;c<3;c++)\n      {\n        F[t][c] = 3*t+c;\n        N[t][c] = n[c];\n        float v[3];\n        if(fread(v,sizeof(float),3,stl_file)!=3)\n        {\n          cerr<<\"IOError: bad format (9).\"<<endl;\n          goto close_false;\n        }\n        V[3*t+c][0] = v[0];\n        V[3*t+c][1] = v[1];\n        V[3*t+c][2] = v[2];\n      }\n      // Read attribute size\n      unsigned short att_count;\n      if(fread(&att_count,sizeof(unsigned short),1,stl_file)!=1)\n      {\n        cerr<<\"IOError: bad format (10).\"<<endl;\n        goto close_false;\n      }\n    }\n    goto close_true;\n  }\nclose_false:\n  fclose(stl_file);\n  return false;\nclose_true:\n  fclose(stl_file);\n  return true;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate bool igl::readSTL<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n// generated by autoexplicit.sh\ntemplate bool igl::readSTL<Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<unsigned int, -1, 3, 1, -1, 3>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<unsigned int, -1, 3, 1, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n// generated by autoexplicit.sh\ntemplate bool igl::readSTL<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n// generated by autoexplicit.sh\ntemplate bool igl::readSTL<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate bool igl::readSTL<Eigen::Matrix<float, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<float, -1, -1, 0, -1, -1> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, -1, 0, -1, -1> >&);\ntemplate bool igl::readSTL<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 3, 1, -1, 3>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/readSTL.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_READSTL_H\n#define IGL_READSTL_H\n#include \"igl_inline.h\"\n\n#ifndef IGL_NO_EIGEN\n#  include <Eigen/Core>\n#endif\n#include <string>\n#include <cstdio>\n#include <vector>\n\nnamespace igl \n{\n  // Read a mesh from an ascii/binary stl file.\n  //\n  // Templates:\n  //   Scalar  type for positions and vectors (will be read as double and cast\n  //     to Scalar)\n  // Inputs:\n  //   filename path to .stl file\n  // Outputs:\n  //   V  double matrix of vertex positions  #V*3 by 3\n  //   F  index matrix of triangle indices #F by 3\n  //   N  double matrix of vertex positions  #F by 3\n  // Returns true on success, false on errors\n  //\n  // Example:\n  //   bool success = readSTL(filename,temp_V,F,N);\n  //   remove_duplicate_vertices(temp_V,0,V,SVI,SVJ);\n  //   for_each(F.data(),F.data()+F.size(),[&SVJ](int & f){f=SVJ(f);});\n  //   writeOBJ(\"Downloads/cat.obj\",V,F);\n  template <typename DerivedV, typename DerivedF, typename DerivedN>\n  IGL_INLINE bool readSTL(\n    const std::string & filename,\n    Eigen::PlainObjectBase<DerivedV> & V,\n    Eigen::PlainObjectBase<DerivedF> & F,\n    Eigen::PlainObjectBase<DerivedN> & N);\n  // Inputs:\n  //   stl_file  pointer to already opened .stl file \n  // Outputs:\n  //   stl_file  closed file\n  template <typename TypeV, typename TypeF, typename TypeN>\n  IGL_INLINE bool readSTL(\n    FILE * stl_file, \n    std::vector<std::vector<TypeV> > & V,\n    std::vector<std::vector<TypeF> > & F,\n    std::vector<std::vector<TypeN> > & N);\n  template <typename TypeV, typename TypeF, typename TypeN>\n  IGL_INLINE bool readSTL(\n    const std::string & filename,\n    std::vector<std::vector<TypeV> > & V,\n    std::vector<std::vector<TypeF> > & F,\n    std::vector<std::vector<TypeN> > & N);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"readSTL.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/readTGF.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"readTGF.h\"\n\n#include <cstdio>\n\nIGL_INLINE bool igl::readTGF(\n  const std::string tgf_filename,\n  std::vector<std::vector<double> > & C,\n  std::vector<std::vector<int> > & E,\n  std::vector<int> & P,\n  std::vector<std::vector<int> > & BE,\n  std::vector<std::vector<int> > & CE,\n  std::vector<std::vector<int> > & PE)\n{\n  using namespace std;\n  // clear output\n  C.clear();\n  E.clear();\n  P.clear();\n  BE.clear();\n  CE.clear();\n  PE.clear();\n\n  FILE * tgf_file = fopen(tgf_filename.c_str(),\"r\");                                       \n  if(NULL==tgf_file)\n  {\n    printf(\"IOError: %s could not be opened\\n\",tgf_filename.c_str());\n    return false;  \n  }\n\n  bool reading_vertices = true;\n  bool reading_edges = true;\n  const int MAX_LINE_LENGTH = 500;\n  char line[MAX_LINE_LENGTH];\n  // read until seeing end of file\n  while(fgets(line,MAX_LINE_LENGTH,tgf_file)!=NULL)\n  {\n    // comment signifies end of vertices, next line is start of edges\n    if(line[0] == '#')\n    {\n      if(reading_vertices)\n      {\n        reading_vertices = false;\n        reading_edges = true;\n      }else if(reading_edges)\n      {\n        reading_edges = false;\n      }\n    // process vertex line\n    }else if(reading_vertices)\n    {\n      int index;\n      vector<double> position(3);\n      int count = \n        sscanf(line,\"%d %lg %lg %lg\",\n          &index,\n          &position[0],\n          &position[1],\n          &position[2]);\n      if(count != 4)\n      {\n        fprintf(stderr,\"Error: readTGF.h: bad format in vertex line\\n\");\n        fclose(tgf_file);\n        return false;\n      }\n      // index is ignored since vertices must already be in order\n      C.push_back(position);\n    }else if(reading_edges)\n    {\n      vector<int> edge(2);\n      int is_BE = 0;\n      int is_PE = 0;\n      int is_CE = 0;\n      int count = sscanf(line,\"%d %d %d %d %d\\n\",\n        &edge[0],\n        &edge[1],\n        &is_BE,\n        &is_PE,\n        &is_CE);\n      if(count<2)\n      {\n        fprintf(stderr,\"Error: readTGF.h: bad format in edge line\\n\");\n        fclose(tgf_file);\n        return false;\n      }\n      // .tgf is one indexed\n      edge[0]--;\n      edge[1]--;\n      E.push_back(edge);\n      if(is_BE == 1)\n      {\n        BE.push_back(edge);\n      }\n      if(is_PE == 1)\n      {\n        // PE should index P\n        fprintf(stderr,\n          \"Warning: readTGF.h found pseudo edges but does not support \"\n          \"them\\n\");\n      }\n      if(is_CE == 1)\n      {\n        // CE should index P\n        fprintf(stderr,\n          \"Warning: readTGF.h found cage edges but does not support them\\n\");\n      }\n    }else\n    {\n      // ignore faces\n    }\n  }\n  fclose(tgf_file);\n  // Construct P, indices not in BE\n  for(int i = 0;i<(int)C.size();i++)\n  {\n    bool in_edge = false;\n    for(int j = 0;j<(int)BE.size();j++)\n    {\n      if(i == BE[j][0] || i == BE[j][1])\n      {\n        in_edge = true;\n        break;\n      }\n    }\n    if(!in_edge)\n    {\n      P.push_back(i);\n    }\n  }\n  return true;\n}\n\n#ifndef IGL_NO_EIGEN\n#include \"list_to_matrix.h\"\n\nIGL_INLINE bool igl::readTGF(\n  const std::string tgf_filename,\n  Eigen::MatrixXd & C,\n  Eigen::MatrixXi & E,\n  Eigen::VectorXi & P,\n  Eigen::MatrixXi & BE,\n  Eigen::MatrixXi & CE,\n  Eigen::MatrixXi & PE)\n{\n  std::vector<std::vector<double> > vC;\n  std::vector<std::vector<int> > vE;\n  std::vector<int> vP;\n  std::vector<std::vector<int> > vBE;\n  std::vector<std::vector<int> > vCE;\n  std::vector<std::vector<int> > vPE;\n  bool success = readTGF(tgf_filename,vC,vE,vP,vBE,vCE,vPE);\n  if(!success)\n  {\n    return false;\n  }\n\n  if(!list_to_matrix(vC,C))\n  {\n    return false;\n  }\n  if(!list_to_matrix(vE,E))\n  {\n    return false;\n  }\n  if(!list_to_matrix(vP,P))\n  {\n    return false;\n  }\n  if(!list_to_matrix(vBE,BE))\n  {\n    return false;\n  }\n  if(!list_to_matrix(vCE,CE))\n  {\n    return false;\n  }\n  if(!list_to_matrix(vPE,PE))\n  {\n    return false;\n  }\n\n  return true;\n}\n\nIGL_INLINE bool igl::readTGF(\n  const std::string tgf_filename,\n  Eigen::MatrixXd & C,\n  Eigen::MatrixXi & E)\n{\n  Eigen::VectorXi P;\n  Eigen::MatrixXi BE,CE,PE;\n  return readTGF(tgf_filename,C,E,P,BE,CE,PE);\n}\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/readTGF.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_READTGF_H\n#define IGL_READTGF_H\n#include \"igl_inline.h\"\n\n#include <vector>\n#include <string>\n#ifndef IGL_NO_EIGEN\n#include <Eigen/Dense>\n#endif\n\nnamespace igl\n{\n  // READTGF\n  //\n  // [V,E,P,BE,CE,PE] = readTGF(filename)\n  //\n  // Read a graph from a .tgf file\n  //\n  // Input:\n  //  filename  .tgf file name\n  // Ouput:\n  //  V  # vertices by 3 list of vertex positions\n  //  E  # edges by 2 list of edge indices\n  //  P  # point-handles list of point handle indices\n  //  BE # bone-edges by 2 list of bone-edge indices\n  //  CE # cage-edges by 2 list of cage-edge indices\n  //  PE # pseudo-edges by 2 list of pseudo-edge indices\n  // \n  // Assumes that graph vertices are 3 dimensional\n  IGL_INLINE bool readTGF(\n    const std::string tgf_filename,\n    std::vector<std::vector<double> > & C,\n    std::vector<std::vector<int> > & E,\n    std::vector<int> & P,\n    std::vector<std::vector<int> > & BE,\n    std::vector<std::vector<int> > & CE,\n    std::vector<std::vector<int> > & PE);\n\n  #ifndef IGL_NO_EIGEN\n  IGL_INLINE bool readTGF(\n    const std::string tgf_filename,\n    Eigen::MatrixXd & C,\n    Eigen::MatrixXi & E,\n    Eigen::VectorXi & P,\n    Eigen::MatrixXi & BE,\n    Eigen::MatrixXi & CE,\n    Eigen::MatrixXi & PE);\n  IGL_INLINE bool readTGF(\n    const std::string tgf_filename,\n    Eigen::MatrixXd & C,\n    Eigen::MatrixXi & E);\n  #endif\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"readTGF.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/readWRL.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"readWRL.h\"\n#include <iostream>\n\ntemplate <typename Scalar, typename Index>\nIGL_INLINE bool igl::readWRL(\n  const std::string wrl_file_name,\n  std::vector<std::vector<Scalar > > & V,\n  std::vector<std::vector<Index > > & F)\n{\n  using namespace std;\n  FILE * wrl_file = fopen(wrl_file_name.c_str(),\"r\");\n  if(NULL==wrl_file)\n  {\n    printf(\"IOError: %s could not be opened...\",wrl_file_name.c_str());\n    return false;\n  }\n  return readWRL(wrl_file,V,F);\n}\n\ntemplate <typename Scalar, typename Index>\nIGL_INLINE bool igl::readWRL(\n  FILE * wrl_file,\n  std::vector<std::vector<Scalar > > & V,\n  std::vector<std::vector<Index > > & F)\n{\n  using namespace std;\n\n  char line[1000];\n  // Read lines until seeing \"point [\"\n  // treat other lines in file as \"comments\"\n  bool still_comments = true;\n  string needle(\"point [\");\n  string haystack;\n  while(still_comments)\n  {\n    if(fgets(line,1000,wrl_file) == NULL)\n    {\n      std::cerr<<\"readWRL, reached EOF without finding \\\"point [\\\"\"<<std::endl;\n      fclose(wrl_file);\n      return false;\n    }\n    haystack = string(line);\n    still_comments = string::npos == haystack.find(needle);\n  }\n\n  // read points in sets of 3\n  int floats_read = 3;\n  double x,y,z;\n  while(floats_read == 3)\n  {\n    floats_read = fscanf(wrl_file,\" %lf %lf %lf,\",&x,&y,&z);\n    if(floats_read == 3)\n    {\n      vector<Scalar > point;\n      point.resize(3);\n      point[0] = x;\n      point[1] = y;\n      point[2] = z;\n      V.push_back(point);\n      //printf(\"(%g, %g, %g)\\n\",x,y,z);\n    }else if(floats_read != 0)\n    {\n      printf(\"ERROR: unrecognized format...\\n\");\n      return false;\n    }\n  }\n  // Read lines until seeing \"coordIndex [\"\n  // treat other lines in file as \"comments\"\n  still_comments = true;\n  needle = string(\"coordIndex [\");\n  while(still_comments)\n  {\n    fgets(line,1000,wrl_file);\n    haystack = string(line);\n    still_comments = string::npos == haystack.find(needle);\n  }\n  // read F\n  int ints_read = 1;\n  while(ints_read > 0)\n  {\n    // read new face indices (until hit -1)\n    vector<Index > face;\n    while(true)\n    {\n      // indices are 0-indexed\n      int i;\n      ints_read = fscanf(wrl_file,\" %d,\",&i);\n      if(ints_read > 0)\n      {\n        if(i>=0)\n        {\n          face.push_back(i);\n        }else\n        {\n          F.push_back(face);\n          break;\n        }\n      }else\n      {\n        break;\n      }\n    }\n  }\n\n\n\n  fclose(wrl_file);\n  return true;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate bool igl::readWRL<double, int>(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > >&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/readWRL.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_READWRL_H\n#define IGL_READWRL_H\n#include \"igl_inline.h\"\n\n#include <string>\n#include <vector>\n#include <cstdio>\n\nnamespace igl \n{\n  // Read a mesh from an ascii wrl file, filling in vertex positions and face\n  // indices of the first model. Mesh may have faces of any number of degree\n  //\n  // Templates:\n  //   Scalar  type for positions and vectors (will be read as double and cast\n  //     to Scalar)\n  //   Index  type for indices (will be read as int and cast to Index)\n  // Inputs:\n  //  str  path to .wrl file\n  // Outputs:\n  //   V  double matrix of vertex positions  #V by 3\n  //   F  #F list of face indices into vertex positions\n  // Returns true on success, false on errors\n  template <typename Scalar, typename Index>\n  IGL_INLINE bool readWRL(\n    const std::string wrl_file_name, \n    std::vector<std::vector<Scalar > > & V,\n    std::vector<std::vector<Index > > & F);\n  // Inputs:\n  //   wrl_file  pointer to already opened .wrl file \n  // Outputs:\n  //   wrl_file  closed file\n  template <typename Scalar, typename Index>\n  IGL_INLINE bool readWRL(\n    FILE * wrl_file,\n    std::vector<std::vector<Scalar > > & V,\n    std::vector<std::vector<Index > > & F);\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"readWRL.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/read_triangle_mesh.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"read_triangle_mesh.h\"\n\n#include \"list_to_matrix.h\"\n#include \"readMESH.h\"\n#include \"readOBJ.h\"\n#include \"readOFF.h\"\n#include \"readSTL.h\"\n#include \"readPLY.h\"\n#include \"readWRL.h\"\n#include \"pathinfo.h\"\n#include \"boundary_facets.h\"\n#include \"polygon_mesh_to_triangle_mesh.h\"\n\n#include <algorithm>\n#include <iostream>\n\n\ntemplate <typename Scalar, typename Index>\nIGL_INLINE bool igl::read_triangle_mesh(\n  const std::string str,\n  std::vector<std::vector<Scalar> > & V,\n  std::vector<std::vector<Index> > & F)\n{\n  using namespace std;\n  // dirname, basename, extension and filename\n  string d,b,e,f;\n  pathinfo(str,d,b,e,f);\n  // Convert extension to lower case\n  std::transform(e.begin(), e.end(), e.begin(), ::tolower);\n  vector<vector<Scalar> > TC, N, C;\n  vector<vector<Index> > FTC, FN;\n  if(e == \"obj\")\n  {\n    // Annoyingly obj can store 4 coordinates, truncate to xyz for this generic\n    // read_triangle_mesh\n    bool success = readOBJ(str,V,TC,N,F,FTC,FN);\n    for(auto & v : V)\n    {\n      v.resize(std::min(v.size(),(size_t)3));\n    }\n    return success;\n  }else if(e == \"off\")\n  {\n    return readOFF(str,V,F,N,C);\n  }\n  cerr<<\"Error: \"<<__FUNCTION__<<\": \"<<\n    str<<\" is not a recognized mesh file format.\"<<endl;\n  return false;\n}\n\n\n#ifndef IGL_NO_EIGN\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE bool igl::read_triangle_mesh(\n  const std::string str,\n  Eigen::PlainObjectBase<DerivedV>& V,\n  Eigen::PlainObjectBase<DerivedF>& F)\n{\n  std::string _1,_2,_3,_4;\n  return read_triangle_mesh(str,V,F,_1,_2,_3,_4);\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE bool igl::read_triangle_mesh(\n  const std::string filename,\n  Eigen::PlainObjectBase<DerivedV>& V,\n  Eigen::PlainObjectBase<DerivedF>& F,\n  std::string & dir,\n  std::string & base,\n  std::string & ext,\n  std::string & name)\n{\n  using namespace std;\n  using namespace Eigen;\n\n  // dirname, basename, extension and filename\n  pathinfo(filename,dir,base,ext,name);\n  // Convert extension to lower case\n  transform(ext.begin(), ext.end(), ext.begin(), ::tolower);\n  FILE * fp = fopen(filename.c_str(),\"r\");\n  return read_triangle_mesh(ext,fp,V,F);\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE bool igl::read_triangle_mesh(\n  const std::string & ext,\n  FILE * fp,\n  Eigen::PlainObjectBase<DerivedV>& V,\n  Eigen::PlainObjectBase<DerivedF>& F)\n{\n  using namespace std;\n  using namespace Eigen;\n  vector<vector<double > > vV,vN,vTC,vC;\n  vector<vector<int > > vF,vFTC,vFN;\n  if(ext == \"mesh\")\n  {\n    // Convert extension to lower case\n    MatrixXi T;\n    if(!readMESH(fp,V,T,F))\n    {\n      return 1;\n    }\n    //if(F.size() > T.size() || F.size() == 0)\n    {\n      boundary_facets(T,F);\n    }\n  }else if(ext == \"obj\")\n  {\n    if(!readOBJ(fp,vV,vTC,vN,vF,vFTC,vFN))\n    {\n      return false;\n    }\n    // Annoyingly obj can store 4 coordinates, truncate to xyz for this generic\n    // read_triangle_mesh\n    for(auto & v : vV)\n    {\n      v.resize(std::min(v.size(),(size_t)3));\n    }\n  }else if(ext == \"off\")\n  {\n    if(!readOFF(fp,vV,vF,vN,vC))\n    {\n      return false;\n    }\n  }else if(ext == \"ply\")\n  {\n    if(!readPLY(fp,vV,vF,vN,vTC))\n    {\n      return false;\n    }\n  }else if(ext == \"stl\")\n  {\n    if(!readSTL(fp,vV,vF,vN))\n    {\n      return false;\n    }\n  }else if(ext == \"wrl\")\n  {\n    if(!readWRL(fp,vV,vF))\n    {\n      return false;\n    }\n  }else\n  {\n    cerr<<\"Error: unknown extension: \"<<ext<<endl;\n    return false;\n  }\n  if(vV.size() > 0)\n  {\n    if(!list_to_matrix(vV,V))\n    {\n      return false;\n    }\n    polygon_mesh_to_triangle_mesh(vF,F);\n  }\n  return true;\n}\n\n#endif\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate bool igl::read_triangle_mesh<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate bool igl::read_triangle_mesh<double, int>(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > >&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&);\ntemplate bool igl::read_triangle_mesh<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(std::string, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&);\ntemplate bool igl::read_triangle_mesh<Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<unsigned int, -1, 3, 1, -1, 3> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<unsigned int, -1, 3, 1, -1, 3> >&);\ntemplate bool igl::read_triangle_mesh<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 3, 1, -1, 3> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> >&);\ntemplate bool igl::read_triangle_mesh<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 3, 1, -1, 3> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&);\ntemplate bool igl::read_triangle_mesh<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/read_triangle_mesh.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_READ_TRIANGLE_MESH_H\n#define IGL_READ_TRIANGLE_MESH_H\n#include \"igl_inline.h\"\n\n#ifndef IGL_NO_EIGEN\n#  include <Eigen/Core>\n#endif\n#include <string>\n#include <cstdio>\n#include <vector>\n// History:\n//  renamed read -> read_triangle_mesh     Daniele 24 June 2014\n//  return type changed from void to bool  Alec 18 Sept 2011\n\nnamespace igl\n{\n  // read mesh from an ascii file with automatic detection of file format.\n  // supported: obj, off, stl, wrl, ply, mesh)\n  // \n  // Templates:\n  //   Scalar  type for positions and vectors (will be read as double and cast\n  //     to Scalar)\n  //   Index  type for indices (will be read as int and cast to Index)\n  // Inputs:\n  //   str  path to file\n  // Outputs:\n  //   V  eigen double matrix #V by 3\n  //   F  eigen int matrix #F by 3\n  // Returns true iff success\n  template <typename Scalar, typename Index>\n  IGL_INLINE bool read_triangle_mesh(\n    const std::string str,\n    std::vector<std::vector<Scalar> > & V,\n    std::vector<std::vector<Index> > & F);\n#ifndef IGL_NO_EIGEN\n  template <typename DerivedV, typename DerivedF>\n  IGL_INLINE bool read_triangle_mesh(\n    const std::string str,\n    Eigen::PlainObjectBase<DerivedV>& V,\n    Eigen::PlainObjectBase<DerivedF>& F);\n  // Outputs:\n  //  dir  directory path (see pathinfo.h)\n  //  base  base name (see pathinfo.h)\n  //  ext  extension (see pathinfo.h)\n  //  name  filename (see pathinfo.h)\n  template <typename DerivedV, typename DerivedF>\n  IGL_INLINE bool read_triangle_mesh(\n    const std::string str,\n    Eigen::PlainObjectBase<DerivedV>& V,\n    Eigen::PlainObjectBase<DerivedF>& F,\n    std::string & dir,\n    std::string & base,\n    std::string & ext,\n    std::string & name);\n  // Inputs:\n  //   ext  file extension\n  //   fp  pointer to already opened .ext file \n  // Outputs:\n  //   fp  closed file\n  template <typename DerivedV, typename DerivedF>\n  IGL_INLINE bool read_triangle_mesh(\n    const std::string & ext,\n    FILE * fp,\n    Eigen::PlainObjectBase<DerivedV>& V,\n    Eigen::PlainObjectBase<DerivedF>& F);\n#endif\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"read_triangle_mesh.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/redux.h",
    "content": "#ifndef IGL_REDUX_H\n#define IGL_REDUX_H\n#include <Eigen/Core>\n#include <Eigen/Sparse>\nnamespace igl\n{\n  // REDUX Perform reductions on the rows or columns of a SparseMatrix. This is\n  // _similar_ to DenseBase::redux, but different in two important ways:\n  //  1. (unstored) Zeros are **not** \"visited\", however if the first element\n  //     in the column/row  does not appear in the first row/column then the\n  //     reduction is assumed to start with zero. In this way, \"any\", \"all\",\n  //     \"count\"(non-zeros) work as expected. This means it is **not** possible\n  //     to use this to count (implicit) zeros.\n  //  2. This redux is more powerful in the sense that A and B may have\n  //     different types. This makes it possible to count the number of\n  //     non-zeros in a SparseMatrix<bool> A into a VectorXi B.\n  //\n  // Inputs:\n  //   A  m by n sparse matrix\n  //   dim  dimension along which to sum (1 or 2)\n  //   func  function handle with the prototype `X(Y a, I i, J j, Z b)` where a\n  //     is the running value, b is A(i,j)\n  // Output:\n  //   S  n-long sparse vector (if dim == 1) \n  //   or\n  //   S  m-long sparse vector (if dim == 2)\n  template <typename AType, typename Func, typename DerivedB>\n  inline void redux(\n    const Eigen::SparseMatrix<AType> & A,\n    const int dim,\n    const Func & func,\n    Eigen::PlainObjectBase<DerivedB> & B);\n}\n\n// Implementation\n\n#include \"redux.h\"\n#include \"for_each.h\"\n\ntemplate <typename AType, typename Func, typename DerivedB>\ninline void igl::redux(\n  const Eigen::SparseMatrix<AType> & A,\n  const int dim,\n  const Func & func,\n  Eigen::PlainObjectBase<DerivedB> & B)\n{\n  assert((dim == 1 || dim == 2) && \"dim must be 2 or 1\");\n  // Get size of input\n  int m = A.rows();\n  int n = A.cols();\n  // resize output\n  B = DerivedB::Zero(dim==1?n:m);\n  const auto func_wrap = [&func,&B,&dim](const int i, const int j, const int v)\n  {\n    if(dim == 1)\n    {\n      B(j) = i == 0? v : func(B(j),v);\n    }else\n    {\n      B(i) = j == 0? v : func(B(i),v);\n    }\n  };\n  for_each(A,func_wrap);\n}\n\n\n//#ifndef IGL_STATIC_LIBRARY\n//#  include \"redux.cpp\"\n//#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/remove_duplicate_vertices.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"remove_duplicate_vertices.h\"\n#include \"round.h\"\n#include \"unique.h\"\n#include \"colon.h\"\n#include \"slice.h\"\n#include <functional>\n\ntemplate <\n  typename DerivedV, \n  typename DerivedSV, \n  typename DerivedSVI, \n  typename DerivedSVJ>\nIGL_INLINE void igl::remove_duplicate_vertices(\n  const Eigen::MatrixBase<DerivedV>& V,\n  const double epsilon,\n  Eigen::PlainObjectBase<DerivedSV>& SV,\n  Eigen::PlainObjectBase<DerivedSVI>& SVI,\n  Eigen::PlainObjectBase<DerivedSVJ>& SVJ)\n{\n  if(epsilon > 0)\n  {\n    DerivedV rV,rSV;\n    round((V/(10.0*epsilon)).eval(),rV);\n    unique_rows(rV,rSV,SVI,SVJ);\n    slice(V,SVI,colon<int>(0,V.cols()-1),SV);\n  }else\n  {\n    unique_rows(V,SV,SVI,SVJ);\n  }\n}\n\ntemplate <\n  typename DerivedV, \n  typename DerivedF,\n  typename DerivedSV, \n  typename DerivedSVI, \n  typename DerivedSVJ,\n  typename DerivedSF>\nIGL_INLINE void igl::remove_duplicate_vertices(\n  const Eigen::MatrixBase<DerivedV>& V,\n  const Eigen::MatrixBase<DerivedF>& F,\n  const double epsilon,\n  Eigen::PlainObjectBase<DerivedSV>& SV,\n  Eigen::PlainObjectBase<DerivedSVI>& SVI,\n  Eigen::PlainObjectBase<DerivedSVJ>& SVJ,\n  Eigen::PlainObjectBase<DerivedSF>& SF)\n{\n  using namespace Eigen;\n  using namespace std;\n  remove_duplicate_vertices(V,epsilon,SV,SVI,SVJ);\n  SF.resizeLike(F);\n  for(int f = 0;f<F.rows();f++)\n  {\n    for(int c = 0;c<F.cols();c++)\n    {\n      SF(f,c) = SVJ(F(f,c));\n    }\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::remove_duplicate_vertices<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, double, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::remove_duplicate_vertices<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, double, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::remove_duplicate_vertices<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, double, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&);\ntemplate void igl::remove_duplicate_vertices<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, double, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/remove_duplicate_vertices.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_REMOVE_DUPLICATE_VERTICES_H\n#define IGL_REMOVE_DUPLICATE_VERTICES_H\n#include \"igl_inline.h\"\n#include <Eigen/Dense>\nnamespace igl\n{\n  // REMOVE_DUPLICATE_VERTICES Remove duplicate vertices upto a uniqueness\n  // tolerance (epsilon)\n  //\n  // Inputs:\n  //   V  #V by dim list of vertex positions\n  //   epsilon  uniqueness tolerance (significant digit), can probably think of\n  //     this as a tolerance on L1 distance\n  // Outputs:\n  //   SV  #SV by dim new list of vertex positions\n  //   SVI #V by 1 list of indices so SV = V(SVI,:) \n  //   SVJ #SV by 1 list of indices so V = SV(SVJ,:)\n  //\n  // Example:\n  //   % Mesh in (V,F)\n  //   [SV,SVI,SVJ] = remove_duplicate_vertices(V,1e-7);\n  //   % remap faces\n  //   SF = SVJ(F);\n  //\n  template <\n    typename DerivedV, \n    typename DerivedSV, \n    typename DerivedSVI, \n    typename DerivedSVJ>\n  IGL_INLINE void remove_duplicate_vertices(\n    const Eigen::MatrixBase<DerivedV>& V,\n    const double epsilon,\n    Eigen::PlainObjectBase<DerivedSV>& SV,\n    Eigen::PlainObjectBase<DerivedSVI>& SVI,\n    Eigen::PlainObjectBase<DerivedSVJ>& SVJ);\n  // Wrapper that also remaps given faces (F) --> (SF) so that SF index SV\n  template <\n    typename DerivedV, \n    typename DerivedF,\n    typename DerivedSV, \n    typename DerivedSVI, \n    typename DerivedSVJ,\n    typename DerivedSF>\n  IGL_INLINE void remove_duplicate_vertices(\n    const Eigen::MatrixBase<DerivedV>& V,\n    const Eigen::MatrixBase<DerivedF>& F,\n    const double epsilon,\n    Eigen::PlainObjectBase<DerivedSV>& SV,\n    Eigen::PlainObjectBase<DerivedSVI>& SVI,\n    Eigen::PlainObjectBase<DerivedSVJ>& SVJ,\n    Eigen::PlainObjectBase<DerivedSF>& SF);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"remove_duplicate_vertices.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/remove_duplicates.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"remove_duplicates.h\"\n#include <vector>\n\n//template <typename T, typename S>\n//IGL_INLINE void igl::remove_duplicates(\n//                                 const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> &V,\n//                                 const Eigen::Matrix<S, Eigen::Dynamic, Eigen::Dynamic> &F,\n//                                 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> &NV,\n//                                 Eigen::Matrix<S, Eigen::Dynamic, Eigen::Dynamic> &NF,\n//                                 Eigen::Matrix<S, Eigen::Dynamic, 1> &I,\n//                                 const double epsilon)\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE void igl::remove_duplicates(\n  const Eigen::PlainObjectBase<DerivedV> &V,\n  const Eigen::PlainObjectBase<DerivedF> &F,\n  Eigen::PlainObjectBase<DerivedV> &NV,\n  Eigen::PlainObjectBase<DerivedF> &NF,\n  Eigen::Matrix<typename DerivedF::Scalar, Eigen::Dynamic, 1> &I,\n  const double epsilon)\n{\n  using namespace std;\n  //// build collapse map\n  int n = V.rows();\n  \n  I = Eigen::Matrix<typename DerivedF::Scalar, Eigen::Dynamic, 1>(n);\n  I[0] = 0;\n  \n  bool *VISITED = new bool[n];\n  for (int i =0; i <n; ++i)\n    VISITED[i] = false;\n  \n  NV.resize(n,V.cols());\n  int count = 0;\n  Eigen::VectorXd d(n);\n  for (int i =0; i <n; ++i)\n  {\n    if(!VISITED[i])\n    {\n      NV.row(count) = V.row(i);\n      I[i] = count;\n      VISITED[i] = true;\n      for (int j = i+1; j <n; ++j)\n      {\n        if((V.row(j) - V.row(i)).norm() < epsilon)\n        {\n          VISITED[j] = true;\n          I[j] = count;\n        }\n      }\n      count ++;\n    }\n  }\n  \n  NV.conservativeResize  (  count , Eigen::NoChange );\n\n  count = 0;\n  std::vector<typename DerivedF::Scalar> face;\n  NF.resizeLike(F);\n  for (int i =0; i <F.rows(); ++i)\n  {\n    face.clear();\n    for (int j = 0; j< F.cols(); ++j)\n      if(std::find(face.begin(), face.end(), I[F(i,j)]) == face.end())\n         face.push_back(I[F(i,j)]);\n    if (face.size() == size_t(F.cols()))\n    {\n      for (unsigned j = 0; j< F.cols(); ++j)\n        NF(count,j) = face[j];\n      count ++;\n    }\n  }\n  NF.conservativeResize  (  count , Eigen::NoChange );\n  \n  delete [] VISITED;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::remove_duplicates<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::Matrix<Eigen::Matrix<int, -1, -1, 0, -1, -1>::Scalar, -1, 1, 0, -1, 1>&, double);\ntemplate void igl::remove_duplicates<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 3, 1, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> >&, Eigen::Matrix<Eigen::Matrix<int, -1, 3, 1, -1, 3>::Scalar, -1, 1, 0, -1, 1>&, double);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/remove_duplicates.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_REMOVE_DUPLICATES_H\n#define IGL_REMOVE_DUPLICATES_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Core>\nnamespace igl \n{\n  // [ NV, NF ] = remove_duplicates( V,F,epsilon )\n  // Merge the duplicate vertices from V, fixing the topology accordingly\n  //\n  // Input:\n  // V,F: mesh description\n  // epsilon: minimal distance to consider two vertices identical\n  //\n  // Output:\n  // NV, NF: new mesh without duplicate vertices\n  \n//  template <typename T, typename S>\n//  IGL_INLINE void remove_duplicates(\n//                                   const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> &V,\n//                                   const Eigen::Matrix<S, Eigen::Dynamic, Eigen::Dynamic> &F,\n//                                   Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> &NV,\n//                                   Eigen::Matrix<S, Eigen::Dynamic, Eigen::Dynamic> &NF,\n//                                   Eigen::Matrix<S, Eigen::Dynamic, 1> &I,\n//                                   const double epsilon = 2.2204e-15);\n  \n  template <typename DerivedV, typename DerivedF>\n  IGL_INLINE void remove_duplicates(\n    const Eigen::PlainObjectBase<DerivedV> &V,\n    const Eigen::PlainObjectBase<DerivedF> &F,\n    Eigen::PlainObjectBase<DerivedV> &NV,\n    Eigen::PlainObjectBase<DerivedF> &NF,\n    Eigen::Matrix<typename DerivedF::Scalar, Eigen::Dynamic, 1> &I,\n    const double epsilon = 2.2204e-15);\n  \n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"remove_duplicates.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/remove_unreferenced.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"remove_unreferenced.h\"\n#include \"slice.h\"\n#include <algorithm>\n\ntemplate <\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedNV,\n  typename DerivedNF,\n  typename DerivedI>\nIGL_INLINE void igl::remove_unreferenced(\n  const Eigen::MatrixBase<DerivedV> &V,\n  const Eigen::MatrixBase<DerivedF> &F,\n  Eigen::PlainObjectBase<DerivedNV> &NV,\n  Eigen::PlainObjectBase<DerivedNF> &NF,\n  Eigen::PlainObjectBase<DerivedI> &I)\n{\n  Eigen::Matrix<typename DerivedI::Scalar,Eigen::Dynamic,1> J;\n  remove_unreferenced(V,F,NV,NF,I,J);\n}\n\ntemplate <\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedNV,\n  typename DerivedNF,\n  typename DerivedI,\n  typename DerivedJ>\nIGL_INLINE void igl::remove_unreferenced(\n  const Eigen::MatrixBase<DerivedV> &V,\n  const Eigen::MatrixBase<DerivedF> &F,\n  Eigen::PlainObjectBase<DerivedNV> &NV,\n  Eigen::PlainObjectBase<DerivedNF> &NF,\n  Eigen::PlainObjectBase<DerivedI> &I,\n  Eigen::PlainObjectBase<DerivedJ> &J)\n{\n  using namespace std;\n  const size_t n = V.rows();\n  remove_unreferenced(n,F,I,J);\n  NF = F;\n  for_each(NF.data(),NF.data()+NF.size(),\n    [&I](typename DerivedNF::Scalar & a){a=I(a);});\n  slice(V,J,1,NV);\n}\n\ntemplate <\n  typename DerivedF,\n  typename DerivedI,\n  typename DerivedJ>\nIGL_INLINE void igl::remove_unreferenced(\n  const size_t n,\n  const Eigen::MatrixBase<DerivedF> &F,\n  Eigen::PlainObjectBase<DerivedI> &I,\n  Eigen::PlainObjectBase<DerivedJ> &J)\n{\n  // Mark referenced vertices\n  typedef Eigen::Matrix<bool,Eigen::Dynamic,1> MatrixXb;\n  MatrixXb mark = MatrixXb::Zero(n,1);\n  for(int i=0; i<F.rows(); ++i)\n  {\n    for(int j=0; j<F.cols(); ++j)\n    {\n      if (F(i,j) != -1)\n      {\n        mark(F(i,j)) = 1;\n      }\n    }\n  }\n\n  // Sum the occupied cells\n  int newsize = mark.count();\n\n  I.resize(n,1);\n  J.resize(newsize,1);\n\n  // Do a pass on the marked vector and remove the unreferenced vertices\n  int count = 0;\n  for(int i=0;i<mark.rows();++i)\n  {\n    if (mark(i) == 1)\n    {\n      I(i) = count;\n      J(count) = i;\n      count++;\n    }\n    else\n    {\n      I(i) = -1;\n    }\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::remove_unreferenced<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::remove_unreferenced<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(unsigned long, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::remove_unreferenced<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::remove_unreferenced<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<long, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&);\ntemplate void igl::remove_unreferenced<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::remove_unreferenced<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::remove_unreferenced<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::remove_unreferenced<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::remove_unreferenced<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/remove_unreferenced.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n//\n//  remove_unreferenced.h\n//  Preview3D\n//\n//  Created by Daniele Panozzo on 17/11/11.\n\n#ifndef IGL_REMOVE_UNREFERENCED_H\n#define IGL_REMOVE_UNREFERENCED_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Core>\nnamespace igl \n{\n  // Remove unreferenced vertices from V, updating F accordingly\n  //\n  // Input:\n  //   V  #V by dim list of mesh vertex positions\n  //   F  #F by ss list of simplices (Values of -1 are quitely skipped)\n  // Outputs:\n  //   NV  #NV by dim list of mesh vertex positions\n  //   NF  #NF by ss list of simplices\n  //   IM  #V by 1 list of indices such that: NF = IM(F) and NT = IM(T)\n  //      and V(find(IM<=size(NV,1)),:) = NV\n  //\n  template <\n    typename DerivedV,\n    typename DerivedF,\n    typename DerivedNV,\n    typename DerivedNF,\n    typename DerivedI>\n  IGL_INLINE void remove_unreferenced(\n    const Eigen::MatrixBase<DerivedV> &V,\n    const Eigen::MatrixBase<DerivedF> &F,\n    Eigen::PlainObjectBase<DerivedNV> &NV,\n    Eigen::PlainObjectBase<DerivedNF> &NF,\n    Eigen::PlainObjectBase<DerivedI> &I);\n  template <\n    typename DerivedV,\n    typename DerivedF,\n    typename DerivedNV,\n    typename DerivedNF,\n    typename DerivedI,\n    typename DerivedJ>\n  IGL_INLINE void remove_unreferenced(\n    const Eigen::MatrixBase<DerivedV> &V,\n    const Eigen::MatrixBase<DerivedF> &F,\n    Eigen::PlainObjectBase<DerivedNV> &NV,\n    Eigen::PlainObjectBase<DerivedNF> &NF,\n    Eigen::PlainObjectBase<DerivedI> &I,\n    Eigen::PlainObjectBase<DerivedJ> &J);\n  // Inputs:\n  //   n  number of vertices (possibly greater than F.maxCoeff()+1)\n  //   F  #F by ss list of simplices\n  // Outputs:\n  //   IM  #V by 1 list of indices such that: NF = IM(F) and NT = IM(T)\n  //      and V(find(IM<=size(NV,1)),:) = NV\n  //   J  #RV by 1 list, such that RV = V(J,:)\n  //   \n  template <\n    typename DerivedF,\n    typename DerivedI,\n    typename DerivedJ>\n  IGL_INLINE void remove_unreferenced(\n    const size_t n,\n    const Eigen::MatrixBase<DerivedF> &F,\n    Eigen::PlainObjectBase<DerivedI> &I,\n    Eigen::PlainObjectBase<DerivedJ> &J);\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"remove_unreferenced.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/render_to_tga.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"render_to_tga.h\"\n#ifndef IGL_NO_OPENGL\n#include \"tga.h\"\n\n#include \"OpenGL_convenience.h\"\n\n#include <cstdlib>\n\nIGL_INLINE bool igl::render_to_tga(\n  const std::string tga_file,\n  const int width,\n  const int height,\n  const bool alpha)\n{\n\n  size_t components = 3;\n  GLenum format = GL_BGR;\n  if(alpha)\n  {\n    format = GL_BGRA;\n    components = 4;\n  }\n  GLubyte * cmap = NULL;\n\n  // OpenGL by default tries to read data in multiples of 4, if our data is\n  // only RGB or BGR and the width is not divible by 4 then we need to alert\n  // opengl\n  if((width % 4) != 0 && \n   (format == GL_RGB || \n    format == GL_BGR))\n  {\n    glPixelStorei(GL_PACK_ALIGNMENT, 1);\n  }\n  GLubyte *pixels;\n  pixels = (unsigned char *) malloc (width * height * components);\n  glReadPixels(\n    0,\n    0,\n    width,\n    height,\n    format,\n    GL_UNSIGNED_BYTE,\n    pixels);\n\n  // set up generic image struct\n  gliGenericImage * genericImage;\n  genericImage = (gliGenericImage*) malloc(sizeof(gliGenericImage));\n  genericImage->width = width;\n  genericImage->height = height;\n  genericImage->format = format;\n  genericImage->components = components;\n  genericImage->pixels = pixels;\n  // CMAP is not supported, but we need to put something here\n  genericImage->cmapEntries = 0;\n  genericImage->cmapFormat = GL_BGR_EXT;  // XXX fix me\n  genericImage->cmap = cmap;\n\n  // write pixels to tga file\n  FILE * imgFile;\n  // \"-\" as output file name is code for write to stdout\n  if(tga_file.compare(\"-\") == 0)\n  {\n    imgFile = stdout;\n  }else{\n    imgFile = fopen(tga_file.c_str(),\"w\");\n    if(NULL==imgFile)\n    {\n      printf(\"IOError: %s could not be opened...\\n\",tga_file.c_str());\n      return false;\n    }\n  }\n\n  writeTGA(genericImage,imgFile);\n\n  free(genericImage);\n  return fclose(imgFile) == 0;\n}\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/render_to_tga.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_RENDER_TO_TGA_H\n#define IGL_RENDER_TO_TGA_H\n#include \"igl_inline.h\"\n\n#include <string>\nnamespace igl\n{\n  // Render current open GL image to .tga file\n  // Inputs:\n  //   tga_file  path to output .tga file\n  //   width  width of scene and resulting image\n  //   height height of scene and resulting image\n  ///  alpha  whether to include alpha channel\n  // Returns true only if no errors occured\n  //\n  // See also: png/render_to_png which is slower but writes .png files\n  IGL_INLINE bool render_to_tga(\n    const std::string tga_file,\n    const int width,\n    const int height,\n    const bool alpha);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"render_to_tga.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/reorder.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"reorder.h\"\n#include \"SortableRow.h\"\n#ifndef IGL_NO_EIGEN\n#include <Eigen/Core>\n#endif\n\n// This implementation is O(n), but also uses O(n) extra memory\ntemplate< class T >\nIGL_INLINE void igl::reorder(\n  const std::vector<T> & unordered,\n  std::vector<size_t> const & index_map,\n  std::vector<T> & ordered)\n{\n  // copy for the reorder according to index_map, because unsorted may also be\n  // sorted\n  std::vector<T> copy = unordered;\n  ordered.resize(index_map.size());\n  for(int i = 0; i<(int)index_map.size();i++)\n  {\n    ordered[i] = copy[index_map[i]];\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::reorder<double>(std::vector<double, std::allocator<double> > const&, std::vector<size_t, std::allocator<size_t> > const&, std::vector<double, std::allocator<double> >&);\ntemplate void igl::reorder<int>(std::vector<int, std::allocator<int> > const&, std::vector<size_t, std::allocator<size_t> > const&, std::vector<int, std::allocator<int> >&);\n#  ifndef IGL_NO_EIGEN\n  template void igl::reorder<igl::SortableRow<Eigen::Matrix<int, -1, 1, 0, -1, 1> > >(std::vector<igl::SortableRow<Eigen::Matrix<int, -1, 1, 0, -1, 1> >, std::allocator<igl::SortableRow<Eigen::Matrix<int, -1, 1, 0, -1, 1> > > > const&, std::vector<unsigned long, std::allocator<unsigned long> > const&, std::vector<igl::SortableRow<Eigen::Matrix<int, -1, 1, 0, -1, 1> >, std::allocator<igl::SortableRow<Eigen::Matrix<int, -1, 1, 0, -1, 1> > > >&);\n  template void igl::reorder<igl::SortableRow<Eigen::Matrix<double, -1, 1, 0, -1, 1> > >(std::vector<igl::SortableRow<Eigen::Matrix<double, -1, 1, 0, -1, 1> >, std::allocator<igl::SortableRow<Eigen::Matrix<double, -1, 1, 0, -1, 1> > > > const&, std::vector<unsigned long, std::allocator<unsigned long> > const&, std::vector<igl::SortableRow<Eigen::Matrix<double, -1, 1, 0, -1, 1> >, std::allocator<igl::SortableRow<Eigen::Matrix<double, -1, 1, 0, -1, 1> > > >&);\n#  endif\ntemplate void igl::reorder<long>(std::vector<long, std::allocator<long> > const&, std::vector<unsigned long, std::allocator<unsigned long> > const&, std::vector<long, std::allocator<long> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/reorder.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_REORDER_H\n#define IGL_REORDER_H\n#include \"igl_inline.h\"\n#include <vector>\n// For size_t\n#include <stddef.h>\n#include <cstdlib>\n\nnamespace igl\n{\n  // Act like matlab's Y = X(I) for std vectors\n  // where I contains a vector of indices so that after,\n  // Y[j] = X[I[j]] for index j\n  // this implies that Y.size() == I.size()\n  // X and Y are allowed to be the same reference\n  template< class T >\n  IGL_INLINE void reorder(\n    const std::vector<T> & unordered,\n    std::vector<size_t> const & index_map,\n    std::vector<T> & ordered);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"reorder.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/repdiag.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"repdiag.h\"\n#include <vector>\n\ntemplate <typename T>\nIGL_INLINE void igl::repdiag(\n  const Eigen::SparseMatrix<T>& A,\n  const int d,\n  Eigen::SparseMatrix<T>& B)\n{\n  using namespace std;\n  using namespace Eigen;\n  int m = A.rows();\n  int n = A.cols();\n#if false\n  vector<Triplet<T> > IJV;\n  IJV.reserve(A.nonZeros()*d);\n  // Loop outer level\n  for (int k=0; k<A.outerSize(); ++k)\n  {\n    // loop inner level\n    for (typename Eigen::SparseMatrix<T>::InnerIterator it(A,k); it; ++it)\n    {\n      for(int i = 0;i<d;i++)\n      {\n        IJV.push_back(Triplet<T>(i*m+it.row(),i*n+it.col(),it.value()));\n      }\n    }\n  }\n  B.resize(m*d,n*d);\n  B.setFromTriplets(IJV.begin(),IJV.end());\n#else\n  // This will not work for RowMajor\n  B.resize(m*d,n*d);\n  Eigen::VectorXi per_col = Eigen::VectorXi::Zero(n*d);\n  for (int k=0; k<A.outerSize(); ++k)\n  {\n    for (typename Eigen::SparseMatrix<T>::InnerIterator it(A,k); it; ++it)\n    {\n      for(int r = 0;r<d;r++) per_col(n*r + k)++;\n    }\n  }\n  B.reserve(per_col);\n  for(int r = 0;r<d;r++)\n  {\n    const int mr = m*r;\n    const int nr = n*r;\n    for (int k=0; k<A.outerSize(); ++k)\n    {\n      for (typename Eigen::SparseMatrix<T>::InnerIterator it(A,k); it; ++it)\n      {\n        B.insert(it.row()+mr,k+nr) = it.value();\n      }\n    }\n  }\n  B.makeCompressed();\n#endif\n}\n\ntemplate <typename T>\nIGL_INLINE void igl::repdiag(\n  const Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> & A,\n  const int d,\n  Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> & B)\n{\n  int m = A.rows();\n  int n = A.cols();\n  B.resize(m*d,n*d);\n  B.array() *= 0;\n  for(int i = 0;i<d;i++)\n  {\n    B.block(i*m,i*n,m,n) = A;\n  }\n}\n\n// Wrapper with B as output\ntemplate <class Mat>\nIGL_INLINE Mat igl::repdiag(const Mat & A, const int d)\n{\n  Mat B;\n  repdiag(A,d,B);\n  return B;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::repdiag<double>(Eigen::SparseMatrix<double, 0, int> const&, int, Eigen::SparseMatrix<double, 0, int>&);\n// generated by autoexplicit.sh\ntemplate Eigen::SparseMatrix<double, 0, int> igl::repdiag<Eigen::SparseMatrix<double, 0, int> >(Eigen::SparseMatrix<double, 0, int> const&, int);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/repdiag.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_REPDIAG_H\n#define IGL_REPDIAG_H\n#include \"igl_inline.h\"\n\n#define EIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET\n#include <Eigen/Dense>\n#include <Eigen/Sparse>\n\nnamespace igl\n{\n  // REPDIAG repeat a matrix along the diagonal a certain number of times, so\n  // that if A is a m by n matrix and we want to repeat along the diagonal d\n  // times, we get a m*d by n*d matrix B such that:\n  // B( (k*m+1):(k*m+1+m-1), (k*n+1):(k*n+1+n-1)) = A \n  // for k from 0 to d-1\n  //\n  // Inputs:\n  //   A  m by n matrix we are repeating along the diagonal. May be dense or\n  //     sparse\n  //   d  number of times to repeat A along the diagonal\n  // Outputs:\n  //   B  m*d by n*d matrix with A repeated d times along the diagonal,\n  //     will be dense or sparse to match A\n  //\n\n  // Sparse version\n  template <typename T>\n  IGL_INLINE void repdiag(\n    const Eigen::SparseMatrix<T>& A,\n    const int d,\n    Eigen::SparseMatrix<T>& B);\n  // Dense version\n  template <typename T>\n  IGL_INLINE void repdiag(\n    const Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> & A,\n    const int d,\n    Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> & B);\n  // Wrapper with B as output\n  template <class Mat>\n  IGL_INLINE Mat repdiag(const Mat & A, const int d);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"repdiag.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/repmat.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"repmat.h\"\n\ntemplate <typename DerivedA, typename DerivedB>\nIGL_INLINE void igl::repmat(\n  const Eigen::MatrixBase<DerivedA> & A,\n  const int r,\n  const int c,\n  Eigen::PlainObjectBase<DerivedB> & B)\n{\n  assert(r>0);\n  assert(c>0);\n  // Make room for output\n  B.resize(r*A.rows(),c*A.cols());\n\n  // copy tiled blocks\n  for(int i = 0;i<r;i++)\n  {\n    for(int j = 0;j<c;j++)\n    {\n      B.block(i*A.rows(),j*A.cols(),A.rows(),A.cols()) = A;\n    }\n  }\n}\n\ntemplate <typename T>\nIGL_INLINE void igl::repmat(\n  const Eigen::SparseMatrix<T> & A,\n  const int r,\n  const int c,\n  Eigen::SparseMatrix<T> & B)\n{\n  assert(r>0);\n  assert(c>0);\n  B.resize(r*A.rows(),c*A.cols());\n  B.reserve(r*c*A.nonZeros());\n  for(int i = 0;i<r;i++)\n  {\n    for(int j = 0;j<c;j++)\n    {\n      // Loop outer level\n      for (int k=0; k<A.outerSize(); ++k)\n      {\n        // loop inner level\n        for (typename Eigen::SparseMatrix<T>::InnerIterator it(A,k); it; ++it)\n        {\n          B.insert(i*A.rows()+it.row(),j*A.cols() + it.col()) = it.value();\n        }\n      }\n    }\n  }\n  B.finalize();\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::repmat<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, int, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::repmat<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, int, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\ntemplate void igl::repmat<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, int, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/repmat.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_REPMAT_H\n#define IGL_REPMAT_H\n#include \"igl_inline.h\"\n\n#define EIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET\n#include <Eigen/Dense>\n#include <Eigen/Sparse>\n\nnamespace igl\n{\n  // At least for Dense matrices this is replaced by `replicate` e.g., dst = src.replicate(n,m);\n  // http://forum.kde.org/viewtopic.php?f=74&t=90876#p173517\n\n  // Ideally this is a super overloaded function that behaves just like\n  // matlab's repmat\n\n  // Replicate and tile a matrix\n  //\n  // Templates:\n  //   T  should be a eigen matrix primitive type like int or double\n  // Inputs:\n  //   A  m by n input matrix\n  //   r  number of row-direction copies\n  //   c  number of col-direction copies\n  // Outputs:\n  //   B  r*m by c*n output matrix\n  //\n  template <typename DerivedA,typename DerivedB>\n  IGL_INLINE void repmat(\n    const Eigen::MatrixBase<DerivedA> & A,\n    const int r,\n    const int c,\n    Eigen::PlainObjectBase<DerivedB> & B);\n  template <typename T>\n  IGL_INLINE void repmat(\n    const Eigen::SparseMatrix<T> & A,\n    const int r,\n    const int c,\n    Eigen::SparseMatrix<T> & B);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"repmat.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/report_gl_error.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"report_gl_error.h\"\n#ifndef IGL_NO_OPENGL\n\n#include <cstdio>\n#include \"verbose.h\"\n\nIGL_INLINE GLenum igl::report_gl_error(const std::string id)\n{\n  GLenum err = glGetError();\n  if(GL_NO_ERROR != err)\n  {\n    verbose(\"GL_ERROR: \");\n    fprintf(stderr,\"%s%s\\n\",id.c_str(),gluErrorString(err));\n  }\n  return err;\n}\n\nIGL_INLINE GLenum igl::report_gl_error()\n{\n  return igl::report_gl_error(std::string(\"\"));\n}\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/report_gl_error.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_REPORT_GL_ERROR_H\n#define IGL_REPORT_GL_ERROR_H\n#ifndef IGL_NO_OPENGL\n#include \"igl_inline.h\"\n\n#include \"OpenGL_convenience.h\"\n\n#include <string>\n\nnamespace igl\n{\n  // Print last OpenGL error to stderr prefixed by specified id string\n  // Inputs:\n  //   id   string to appear before any error msgs\n  // Returns result of glGetError() \n  IGL_INLINE GLenum report_gl_error(const std::string id);\n  // No prefix\n  IGL_INLINE GLenum report_gl_error();\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"report_gl_error.cpp\"\n#endif\n\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/resolve_duplicated_faces.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Qingnan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n//\n\n#include \"resolve_duplicated_faces.h\"\n\n#include \"slice.h\"\n#include \"unique_simplices.h\"\n\ntemplate<\n  typename DerivedF1,\n  typename DerivedF2,\n  typename DerivedJ >\nIGL_INLINE void igl::resolve_duplicated_faces(\n    const Eigen::PlainObjectBase<DerivedF1>& F1,\n    Eigen::PlainObjectBase<DerivedF2>& F2,\n    Eigen::PlainObjectBase<DerivedJ>& J) {\n\n  //typedef typename DerivedF1::Scalar Index;\n  Eigen::VectorXi IA,IC;\n  DerivedF1 uF;\n  igl::unique_simplices(F1,uF,IA,IC);\n\n  const size_t num_faces = F1.rows();\n  const size_t num_unique_faces = uF.rows();\n  assert((size_t) IA.rows() == num_unique_faces);\n  // faces on top of each unique face\n  std::vector<std::vector<int> > uF2F(num_unique_faces);\n  // signed counts\n  Eigen::VectorXi counts = Eigen::VectorXi::Zero(num_unique_faces);\n  Eigen::VectorXi ucounts = Eigen::VectorXi::Zero(num_unique_faces);\n  // loop over all faces\n  for (size_t i=0; i<num_faces; i++) {\n    const size_t ui = IC(i);\n    const bool consistent = \n      (F1(i,0) == uF(ui, 0) && F1(i,1) == uF(ui, 1) && F1(i,2) == uF(ui, 2)) ||\n      (F1(i,0) == uF(ui, 1) && F1(i,1) == uF(ui, 2) && F1(i,2) == uF(ui, 0)) ||\n      (F1(i,0) == uF(ui, 2) && F1(i,1) == uF(ui, 0) && F1(i,2) == uF(ui, 1));\n    uF2F[ui].push_back(int(i+1) * (consistent?1:-1));\n    counts(ui) += consistent ? 1:-1;\n    ucounts(ui)++;\n  }\n\n  std::vector<size_t> kept_faces;\n  for (size_t i=0; i<num_unique_faces; i++) {\n    if (ucounts[i] == 1) {\n      kept_faces.push_back(abs(uF2F[i][0])-1);\n      continue;\n    }\n    if (counts[i] == 1) {\n      bool found = false;\n      for (auto fid : uF2F[i]) {\n        if (fid > 0) {\n          kept_faces.push_back(abs(fid)-1);\n          found = true;\n          break;\n        }\n      }\n      assert(found);\n    } else if (counts[i] == -1) {\n      bool found = false;\n      for (auto fid : uF2F[i]) {\n        if (fid < 0) {\n          kept_faces.push_back(abs(fid)-1);\n          found = true;\n          break;\n        }\n      }\n      assert(found);\n    } else {\n      assert(counts[i] == 0);\n    }\n  }\n\n  const size_t num_kept = kept_faces.size();\n  J.resize(num_kept, 1);\n  std::copy(kept_faces.begin(), kept_faces.end(), J.data());\n  igl::slice(F1, J, 1, F2);\n}\n\n#ifdef IGL_STATIC_LIBRARY\ntemplate void igl::resolve_duplicated_faces<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::resolve_duplicated_faces<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<long, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&);\ntemplate void igl::resolve_duplicated_faces<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/resolve_duplicated_faces.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Qingnan Zhou <qnzhou@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n//\n#ifndef IGL_COPYLEFT_RESOLVE_DUPLICATED_FACES\n#define IGL_COPYLEFT_RESOLVE_DUPLICATED_FACES\n\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n\nnamespace igl {\n\n  // Resolve duplicated faces according to the following rules per unique face:\n  //\n  // 1. If the number of positively oriented faces equals the number of\n  //    negatively oriented faces, remove all duplicated faces at this triangle.\n  // 2. If the number of positively oriented faces equals the number of\n  //    negatively oriented faces plus 1, keeps one of the positively oriented\n  //    face.\n  // 3. If the number of positively oriented faces equals the number of\n  //    negatively oriented faces minus 1, keeps one of the negatively oriented\n  //    face.\n  // 4. If the number of postively oriented faces differ with the number of\n  //    negativley oriented faces by more than 1, the mesh is not orientable.\n  //    An exception will be thrown.\n  //\n  // Inputs:\n  //   F1  #F1 by 3 array of input faces.\n  //\n  // Outputs:\n  //   F2  #F2 by 3 array of output faces without duplicated faces.\n  //   J   #F2 list of indices into F1.\n  template<\n    typename DerivedF1,\n    typename DerivedF2,\n    typename DerivedJ >\n  IGL_INLINE void resolve_duplicated_faces(\n      const Eigen::PlainObjectBase<DerivedF1>& F1,\n      Eigen::PlainObjectBase<DerivedF2>& F2,\n      Eigen::PlainObjectBase<DerivedJ>& J);\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"resolve_duplicated_faces.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/rgb_to_hsv.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"rgb_to_hsv.h\"\n\ntemplate <typename R,typename H>\nIGL_INLINE void igl::rgb_to_hsv(const R * rgb, H * hsv)\n{\n  // http://en.literateprograms.org/RGB_to_HSV_color_space_conversion_%28C%29\n  R rgb_max = 0.0;\n  R rgb_min = 1.0;\n  rgb_max = (rgb[0]>rgb_max?rgb[0]:rgb_max);\n  rgb_max = (rgb[1]>rgb_max?rgb[1]:rgb_max);\n  rgb_max = (rgb[2]>rgb_max?rgb[2]:rgb_max);\n  rgb_min = (rgb[0]<rgb_min?rgb[0]:rgb_min);\n  rgb_min = (rgb[1]<rgb_min?rgb[1]:rgb_min);\n  rgb_min = (rgb[2]<rgb_min?rgb[2]:rgb_min);\n  //hsv[2] = rgb_max;\n  hsv[2] = rgb_max;\n  if(hsv[2] == 0)\n  {\n    hsv[0]=hsv[1]=0;\n    return;\n  }\n  // normalize\n  R rgb_n[3];\n  rgb_n[0] = rgb[0]/hsv[2];\n  rgb_n[1] = rgb[1]/hsv[2];\n  rgb_n[2] = rgb[2]/hsv[2];\n  // Recomput max min?\n  rgb_max = 0;\n  rgb_max = (rgb_n[0]>rgb_max?rgb_n[0]:rgb_max);\n  rgb_max = (rgb_n[1]>rgb_max?rgb_n[1]:rgb_max);\n  rgb_max = (rgb_n[2]>rgb_max?rgb_n[2]:rgb_max);\n  rgb_min = 1;\n  rgb_min = (rgb_n[0]<rgb_min?rgb_n[0]:rgb_min);\n  rgb_min = (rgb_n[1]<rgb_min?rgb_n[1]:rgb_min);\n  rgb_min = (rgb_n[2]<rgb_min?rgb_n[2]:rgb_min);\n  hsv[1] = rgb_max - rgb_min;\n  if(hsv[1] == 0)\n  {\n    hsv[0] = 0;\n    return;\n  }\n  rgb_n[0] = (rgb_n[0] - rgb_min)/(rgb_max - rgb_min);\n  rgb_n[1] = (rgb_n[1] - rgb_min)/(rgb_max - rgb_min);\n  rgb_n[2] = (rgb_n[2] - rgb_min)/(rgb_max - rgb_min);\n  // Recomput max min?\n  rgb_max = 0;\n  rgb_max = (rgb_n[0]>rgb_max?rgb_n[0]:rgb_max);\n  rgb_max = (rgb_n[1]>rgb_max?rgb_n[1]:rgb_max);\n  rgb_max = (rgb_n[2]>rgb_max?rgb_n[2]:rgb_max);\n  rgb_min = 1;\n  rgb_min = (rgb_n[0]<rgb_min?rgb_n[0]:rgb_min);\n  rgb_min = (rgb_n[1]<rgb_min?rgb_n[1]:rgb_min);\n  rgb_min = (rgb_n[2]<rgb_min?rgb_n[2]:rgb_min);\n  if (rgb_max == rgb_n[0]) {\n    hsv[0] = 0.0 + 60.0*(rgb_n[1] - rgb_n[2]);\n    if (hsv[0] < 0.0) {\n      hsv[0] += 360.0;\n    }\n  } else if (rgb_max == rgb_n[1]) {\n    hsv[0] = 120.0 + 60.0*(rgb_n[2] - rgb_n[0]);\n  } else /* rgb_max == rgb_n[2] */ {\n    hsv[0] = 240.0 + 60.0*(rgb_n[0] - rgb_n[1]);\n  }\n}\n\n\ntemplate <typename DerivedR,typename DerivedH>\nIGL_INLINE void igl::rgb_to_hsv(\n  const Eigen::PlainObjectBase<DerivedR> & R,\n  Eigen::PlainObjectBase<DerivedH> & H)\n{\n  assert(R.cols() == 3);\n  H.resizeLike(R);\n  for(typename DerivedR::Index r = 0;r<R.rows();r++)\n  {\n    typename DerivedR::Scalar rgb[3];\n    rgb[0] = R(r,0);\n    rgb[1] = R(r,1);\n    rgb[2] = R(r,2);\n    typename DerivedH::Scalar hsv[] = {0,0,0};\n    rgb_to_hsv(rgb,hsv);\n    H(r,0) = hsv[0];\n    H(r,1) = hsv[1];\n    H(r,2) = hsv[2];\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::rgb_to_hsv<float, double>(float const*, double*);\ntemplate void igl::rgb_to_hsv<double, double>(double const*, double*);\ntemplate void igl::rgb_to_hsv<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::rgb_to_hsv<Eigen::Matrix<float, -1, -1, 0, -1, -1>, Eigen::Matrix<float, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<float, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, -1, 0, -1, -1> >&);\ntemplate void igl::rgb_to_hsv<Eigen::Matrix<float, 64, 3, 1, 64, 3>, Eigen::Matrix<float, 64, 3, 1, 64, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<float, 64, 3, 1, 64, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, 64, 3, 1, 64, 3> >&); \n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/rgb_to_hsv.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_RGB_TO_HSV_H\n#define IGL_RGB_TO_HSV_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Convert RGB to HSV\n  //\n  // Inputs:\n  //   r  red value ([0,1]) \n  //   g  green value ([0,1])\n  //   b  blue value ([0,1])\n  // Outputs:\n  //   h  hue value (degrees: [0,360])\n  //   s  saturation value ([0,1])\n  //   v  value value ([0,1])\n  template <typename R,typename H>\n  IGL_INLINE void rgb_to_hsv(const R * rgb, H * hsv);\n  template <typename DerivedR,typename DerivedH>\n  IGL_INLINE void rgb_to_hsv(\n    const Eigen::PlainObjectBase<DerivedR> & R,\n    Eigen::PlainObjectBase<DerivedH> & H);\n};\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"rgb_to_hsv.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/right_axis.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"right_axis.h\"\n#ifndef IGL_NO_OPENGL\n\n#include \"OpenGL_convenience.h\"\n\nIGL_INLINE void igl::right_axis(double * x, double * y, double * z)\n{\n  double mv[16];\n  glGetDoublev(GL_MODELVIEW_MATRIX, mv);\n  igl::right_axis(mv,x,y,z);\n}\n\nIGL_INLINE void igl::right_axis(const double * mv,double * x, double * y, double * z)\n{\n  *x = -mv[0*4+0];\n  *y = -mv[1*4+0];\n  *z = -mv[2*4+0];\n}\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/right_axis.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_RIGHT_AXIS_H\n#define IGL_RIGHT_AXIS_H \n#include \"igl_inline.h\"\nnamespace igl\n{\n  // Determines the right axis or depth axis of the current gl matrix\n  // Outputs:\n  //   x  pointer to x-coordinate in scene coordinates of the un-normalized\n  //     right axis \n  //   y  pointer to y-coordinate in scene coordinates of the un-normalized\n  //     right axis \n  //   z  pointer to z-coordinate in scene coordinates of the un-normalized\n  //     right axis\n  //   mv pointer to modelview matrix\n  //\n  // Note: Right axis is returned *UN-normalized*\n  IGL_INLINE void right_axis(double * x, double * y, double * z);\n  IGL_INLINE void right_axis(const double * mv, double * x, double * y, double * z);\n};\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"right_axis.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/rotate_by_quat.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"rotate_by_quat.h\"\n\n#include \"quat_conjugate.h\"\n#include \"quat_mult.h\"\n#include \"normalize_quat.h\"\n#include <cassert>\n\ntemplate <typename Q_type>\nIGL_INLINE void igl::rotate_by_quat(\n  const Q_type *v,\n  const Q_type *q,\n  Q_type *out)\n{\n  // Quaternion form of v, copy data in v, (as a result out can be same pointer\n  // as v)\n  Q_type quat_v[4] = {v[0],v[1],v[2],0};\n\n  // normalize input \n  Q_type normalized_q[4];\n\n#ifndef NDEBUG\n  bool normalized = \n#endif\n  igl::normalize_quat<Q_type>(q,normalized_q);\n#ifndef NDEBUG\n  assert(normalized);\n#endif\n\n  // Conjugate of q\n  Q_type q_conj[4];\n  igl::quat_conjugate<Q_type>(normalized_q,q_conj);\n\n  // Rotate of vector v by quaternion q is:\n  // q*v*conj(q)\n  // Compute q*v\n  Q_type q_mult_quat_v[4];\n  igl::quat_mult<Q_type>(normalized_q,quat_v,q_mult_quat_v);\n  // Compute (q*v) * conj(q)\n  igl::quat_mult<Q_type>(q_mult_quat_v,q_conj,out);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::rotate_by_quat<double>(double const*, double const*, double*);\n// generated by autoexplicit.sh\ntemplate void igl::rotate_by_quat<float>(float const*, float const*, float*);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/rotate_by_quat.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_ROTATE_BY_QUAT_H\n#define IGL_ROTATE_BY_QUAT_H\n#include \"igl_inline.h\"\n\nnamespace igl\n{\n  // Compute rotation of a given vector/point by a quaternion\n  // A Quaternion, q, is defined here as an arrays of four scalars (x,y,z,w),\n  // such that q = x*i + y*j + z*k + w\n  // Inputs:\n  //   v  input 3d point/vector\n  //   q  input quaternion\n  // Outputs:\n  //   out  result of rotation, allowed to be same as v\n  template <typename Q_type>\n  IGL_INLINE void rotate_by_quat(\n    const Q_type *v,\n    const Q_type *q, \n    Q_type *out);\n};\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"rotate_by_quat.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/rotate_vectors.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"rotate_vectors.h\"\nIGL_INLINE Eigen::MatrixXd igl::rotate_vectors(\n                    const Eigen::MatrixXd& V,\n                    const Eigen::VectorXd& A,\n                    const Eigen::MatrixXd& B1,\n                    const Eigen::MatrixXd& B2)\n{\n  Eigen::MatrixXd RV(V.rows(),V.cols());\n\n  for (unsigned i=0; i<V.rows();++i)\n  {\n    double norm = V.row(i).norm();\n    \n    // project onto the tangent plane and convert to angle\n    double a = atan2(B2.row(i).dot(V.row(i)),B1.row(i).dot(V.row(i)));\n\n    // rotate\n    a += (A.size() == 1) ? A(0) : A(i);\n\n    // move it back to global coordinates\n    RV.row(i) = norm*cos(a) * B1.row(i) + norm*sin(a) * B2.row(i);\n  }\n\n  return RV;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/rotate_vectors.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_ROTATE_VECTORS_H\n#define IGL_ROTATE_VECTORS_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Rotate the vectors V by A radiants on the tangent plane spanned by B1 and\n  // B2\n  //\n  // Inputs:\n  //   V     #V by 3 eigen Matrix of vectors\n  //   A     #V eigen vector of rotation angles or a single angle to be applied\n  //     to all vectors\n  //   B1    #V by 3 eigen Matrix of base vector 1\n  //   B2    #V by 3 eigen Matrix of base vector 2\n  //\n  // Output:\n  //   Returns the rotated vectors\n  //\n  IGL_INLINE Eigen::MatrixXd rotate_vectors(\n                                            const Eigen::MatrixXd& V,\n                                            const Eigen::VectorXd& A,\n                                            const Eigen::MatrixXd& B1,\n                                            const Eigen::MatrixXd& B2);\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"rotate_vectors.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/rotation_matrix_from_directions.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>, Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"rotation_matrix_from_directions.h\"\n#include <Eigen/Geometry>\n#include <iostream>\n\ntemplate <typename Scalar>\nIGL_INLINE Eigen::Matrix<Scalar, 3, 3> igl::rotation_matrix_from_directions(\n  const Eigen::Matrix<Scalar, 3, 1> v0,\n  const Eigen::Matrix<Scalar, 3, 1> v1)\n{\n  Eigen::Matrix<Scalar, 3, 3> rotM;\n  const double epsilon=1e-8;\n  Scalar dot=v0.normalized().dot(v1.normalized());\n  ///control if there is no rotation\n  if ((v0-v1).norm()<epsilon)\n  {\n    rotM = Eigen::Matrix<Scalar, 3, 3>::Identity();\n    return rotM;\n  }\n  if ((v0+v1).norm()<epsilon)\n  {\n    rotM = -Eigen::Matrix<Scalar, 3, 3>::Identity();\n    rotM(0,0) = 1.;\n    std::cerr<<\"igl::rotation_matrix_from_directions: rotating around x axis by 180o\"<<std::endl;\n    return rotM;\n  }\n  ///find the axis of rotation\n  Eigen::Matrix<Scalar, 3, 1> axis;\n  axis=v0.cross(v1);\n  axis.normalize();\n\n  ///construct rotation matrix\n  Scalar u=axis(0);\n  Scalar v=axis(1);\n  Scalar w=axis(2);\n  Scalar phi=acos(dot);\n  Scalar rcos = cos(phi);\n  Scalar rsin = sin(phi);\n\n  rotM(0,0) =      rcos + u*u*(1-rcos);\n  rotM(1,0) =  w * rsin + v*u*(1-rcos);\n  rotM(2,0) = -v * rsin + w*u*(1-rcos);\n  rotM(0,1) = -w * rsin + u*v*(1-rcos);\n  rotM(1,1) =      rcos + v*v*(1-rcos);\n  rotM(2,1) =  u * rsin + w*v*(1-rcos);\n  rotM(0,2) =  v * rsin + u*w*(1-rcos);\n  rotM(1,2) = -u * rsin + v*w*(1-rcos);\n  rotM(2,2) =      rcos + w*w*(1-rcos);\n\n  return rotM;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate Eigen::Matrix<double, 3, 3, 0, 3, 3> igl::rotation_matrix_from_directions<double>(const Eigen::Matrix<double, 3, 1, 0, 3, 1>, const Eigen::Matrix<double, 3, 1, 0, 3, 1>);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/rotation_matrix_from_directions.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2016 Alec Jacobson, Daniele Panozzo, Olga Diamanti \n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_ROTATION_MATRIX_FROM_DIRECTIONS_H\n#define IGL_ROTATION_MATRIX_FROM_DIRECTIONS_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Core>\n\nnamespace igl \n{\n  // Given 2 vectors centered on origin calculate the rotation matrix from\n  // first to the second\n  //\n  // Inputs:\n  //   v0  3D column vector\n  //   v1  3D column vector\n  // Output:\n  //   3 by 3 rotation matrix that takes v0 to v1\n  //\n  template <typename Scalar>\n  IGL_INLINE Eigen::Matrix<Scalar, 3, 3> rotation_matrix_from_directions(\n    const Eigen::Matrix<Scalar, 3, 1> v0,\n    const Eigen::Matrix<Scalar, 3, 1> v1);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#include \"rotation_matrix_from_directions.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/round.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"round.h\"\n#include <cmath>\n\n\n// http://stackoverflow.com/a/485549\ntemplate <typename DerivedX >\nIGL_INLINE DerivedX igl::round(const DerivedX r)\n{\n  return (r > 0.0) ? std::floor(r + 0.5) : std::ceil(r - 0.5);\n}\n\ntemplate < typename DerivedX, typename DerivedY>\nIGL_INLINE void igl::round(\n  const Eigen::PlainObjectBase<DerivedX>& X,\n  Eigen::PlainObjectBase<DerivedY>& Y)\n{\n  Y.resizeLike(X);\n  // loop over rows\n  for(int i = 0;i<X.rows();i++)\n  {\n    // loop over cols\n    for(int j = 0;j<X.cols();j++)\n    {\n      Y(i,j) = igl::round(X(i,j));\n    }\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::round<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<double, -1, -1, 1, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> >&);\ntemplate void igl::round<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::round<Eigen::Matrix<double, -1, 2, 0, -1, 2>, Eigen::Matrix<double, -1, 2, 0, -1, 2> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> >&);\ntemplate void igl::round<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/round.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_ROUND_H\n#define IGL_ROUND_H\n#include \"igl_inline.h\"\n#include <Eigen/Dense>\nnamespace igl\n{\n  // Round a scalar value\n  //\n  // Inputs:\n  //   x  number\n  // Returns x rounded to integer\n  template <typename DerivedX>\n  DerivedX round(const DerivedX r);\n  // Round a given matrix to nearest integers\n  //\n  // Inputs:\n  //   X  m by n matrix of scalars\n  // Outputs:\n  //   Y  m by n matrix of rounded integers\n  template < typename DerivedX, typename DerivedY>\n  IGL_INLINE void round(\n    const Eigen::PlainObjectBase<DerivedX>& X,\n    Eigen::PlainObjectBase<DerivedY>& Y);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"round.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/rows_to_matrix.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"rows_to_matrix.h\"\n\n#include <cassert>\n#include <cstdio>\n\n#include \"max_size.h\"\n#include \"min_size.h\"\n\ntemplate <class Row, class Mat>\nIGL_INLINE bool igl::rows_to_matrix(const std::vector<Row> & V,Mat & M)\n{\n  // number of columns\n  int m = V.size();\n  if(m == 0)\n  {\n    fprintf(stderr,\"Error: rows_to_matrix() list is empty()\\n\");\n    return false;\n  }\n  // number of rows\n  int n = igl::min_size(V);\n  if(n != igl::max_size(V))\n  {\n    fprintf(stderr,\"Error: rows_to_matrix()\"\n      \" list elements are not all the same size\\n\");\n    return false;\n  }\n  assert(n != -1);\n  // Resize output\n  M.resize(m,n);\n\n  // Loop over rows\n  int i = 0;\n  typename std::vector<Row>::const_iterator iter = V.begin();\n  while(iter != V.end())\n  {\n    M.row(i) = V[i];\n    // increment index and iterator\n    i++;\n    iter++;\n  }\n\n  return true;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/rows_to_matrix.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_ROWS_TO_MATRIX_H\n#define IGL_ROWS_TO_MATRIX_H\n#include \"igl_inline.h\"\n#include <vector>\nnamespace igl\n{\n  // Convert a list (std::vector) of row vectors of the same length to a matrix\n  // Template: \n  //   Row  row vector type, must implement:\n  //     .size()\n  //   Mat  Matrix type, must implement:\n  //     .resize(m,n)\n  //     .row(i) = Row\n  // Inputs:\n  //   V  a m-long list of vectors of size n\n  // Outputs:\n  //   M  an m by n matrix\n  // Returns true on success, false on errors\n  template <class Row, class Mat>\n  IGL_INLINE bool rows_to_matrix(const std::vector<Row> & V,Mat & M);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"rows_to_matrix.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/sample_edges.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"sample_edges.h\"\n\nIGL_INLINE void igl::sample_edges(\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & E,\n  const int k,\n  Eigen::MatrixXd & S)\n{\n  using namespace Eigen;\n  // Resize output\n  S.resize(V.rows() + k * E.rows(),V.cols());\n  // Copy V at front of S\n  S.block(0,0,V.rows(),V.cols()) = V;\n\n  // loop over edges\n  for(int i = 0;i<E.rows();i++)\n  {\n    VectorXd tip = V.row(E(i,0));\n    VectorXd tail = V.row(E(i,1));\n    for(int s=0;s<k;s++)\n    {\n      double f = double(s+1)/double(k+1);\n      S.row(V.rows()+k*i+s) = f*tail + (1.0-f)*tip;\n    }\n  }\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/sample_edges.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_SAMPLE_EDGES_H\n#define IGL_SAMPLE_EDGES_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Dense>\n\nnamespace igl\n{\n  // Compute samples_per_edge extra points along each edge in E defined over\n  // vertices of V.\n  //\n  // Inputs:\n  //   V  vertices over which edges are defined, # vertices by dim\n  //   E  edge list, # edges by 2\n  //   k  number of extra samples to be computed along edge not\n  //        including start and end points\n  // Output:\n  //   S  sampled vertices, size less than # edges * (2+k) by dim always begins\n  //        with V so that E is also defined over S\n  IGL_INLINE void sample_edges(\n    const Eigen::MatrixXd & V,\n    const Eigen::MatrixXi & E,\n    const int k,\n    Eigen::MatrixXd & S);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"sample_edges.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/seam_edges.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Yotam Gingold <yotam@yotamgingold.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"seam_edges.h\"\n#include <unordered_map>\n#include <unordered_set>\n#include <cassert>\n\n// Yotam has verified that this function produces the exact same output as\n// `find_seam_fast.py` for `cow_triangled.obj`.\ntemplate <\n  typename DerivedV, \n  typename DerivedTC,\n  typename DerivedF, \n  typename DerivedFTC,\n  typename Derivedseams,\n  typename Derivedboundaries,\n  typename Derivedfoldovers>\nIGL_INLINE void igl::seam_edges(\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedTC>& TC,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  const Eigen::PlainObjectBase<DerivedFTC>& FTC,\n  Eigen::PlainObjectBase<Derivedseams>& seams,\n  Eigen::PlainObjectBase<Derivedboundaries>& boundaries,\n  Eigen::PlainObjectBase<Derivedfoldovers>& foldovers)\n{\n  // Assume triangles.\n  assert( F.cols() == 3 );\n  assert( F.cols() == FTC.cols() );\n  assert( F.rows() == FTC.rows() );\n    \n  // Assume 2D texture coordinates (foldovers tests).\n  assert( TC.cols() == 2 );\n  typedef Eigen::Matrix< typename DerivedTC::Scalar, 2, 1 > Vector2S;\n  // Computes the orientation of `c` relative to the line between `a` and `b`.\n  // Assumes 2D vector input.\n  // Based on: https://www.cs.cmu.edu/~quake/robust.html\n  const auto& Orientation = []( \n    const Vector2S& a, \n    const Vector2S& b, \n    const Vector2S& c ) -> typename DerivedTC::Scalar\n  {\n      const Vector2S row0 = a - c;\n      const Vector2S row1 = b - c;\n      return row0(0)*row1(1) - row1(0)*row0(1);\n  };\n    \n  seams     .setZero( 3*F.rows(), 4 );\n  boundaries.setZero( 3*F.rows(), 2 );\n  foldovers .setZero( 3*F.rows(), 4 );\n    \n  int num_seams = 0;\n  int num_boundaries = 0;\n  int num_foldovers = 0;\n    \n  // A map from a pair of vertex indices to the index (face and endpoints)\n  // into face_position_indices.\n  // The following should be true for every key, value pair:\n  //    key == face_position_indices[ value ]\n  // This gives us a \"reverse map\" so that we can look up other face\n  // attributes based on position edges.\n  // The value are written in the format returned by numpy.where(),\n  // which stores multi-dimensional indices such as array[a0,b0], array[a1,b1]\n  // as ( (a0,a1), (b0,b1) ).\n    \n  // We need to make a hash function for our directed edges.\n  // We'll use i*V.rows() + j.\n  typedef std::pair< typename DerivedF::Scalar, typename DerivedF::Scalar > \n    directed_edge;\n\tconst int numV = V.rows();\n\tconst int numF = F.rows();\n\tconst auto& edge_hasher = \n    [numV]( directed_edge const& e ) { return e.first*numV + e.second; };\n  // When we pass a hash function object, we also need to specify the number of\n  // buckets. The Euler characteristic says that the number of undirected edges\n  // is numV + numF -2*genus.\n\tstd::unordered_map<directed_edge,std::pair<int,int>,decltype(edge_hasher) > \n    directed_position_edge2face_position_index(2*( numV + numF ), edge_hasher);\n  for( int fi = 0; fi < F.rows(); ++fi ) \n  {\n    for( int i = 0; i < 3; ++i )\n    {\n      const int j = ( i+1 ) % 3;\n      directed_position_edge2face_position_index[ \n        std::make_pair( F(fi,i), F(fi,j) ) ] = std::make_pair( fi, i );\n    }\n  }\n    \n  // First find all undirected position edges (collect a canonical orientation\n  // of the directed edges).\n  std::unordered_set< directed_edge, decltype( edge_hasher ) > \n    undirected_position_edges( numV + numF, edge_hasher );\n  for( const auto& el : directed_position_edge2face_position_index ) \n  {\n    // The canonical orientation is the one where the smaller of\n    // the two vertex indices is first.\n    undirected_position_edges.insert( std::make_pair( \n      std::min( el.first.first, el.first.second ), \n      std::max( el.first.first, el.first.second ) ) );\n  }\n    \n  // Now we will iterate over all position edges.\n  // Seam edges are the edges whose two opposite directed edges have different\n  // texcoord indices (or one doesn't exist at all in the case of a mesh\n  // boundary).\n  for( const auto& vp_edge : undirected_position_edges ) \n  {\n    // We should only see canonical edges,\n    // where the first vertex index is smaller.\n    assert( vp_edge.first < vp_edge.second );\n        \n    const auto vp_edge_reverse = std::make_pair(vp_edge.second, vp_edge.first);\n    // If it and its opposite exist as directed edges, check if their\n    // texture coordinate indices match.\n    if( directed_position_edge2face_position_index.count( vp_edge ) &&\n      directed_position_edge2face_position_index.count( vp_edge_reverse ) ) \n    {\n      const auto forwards = \n        directed_position_edge2face_position_index[ vp_edge ];\n      const auto backwards = \n        directed_position_edge2face_position_index[ vp_edge_reverse ];\n            \n      // NOTE: They should never be equal.\n      assert( forwards != backwards );\n            \n      // If the texcoord indices match (are similarly flipped),\n      // this edge is not a seam. It could be a foldover.\n      if( \n        std::make_pair( \n          FTC( forwards.first, forwards.second ), \n          FTC( forwards.first, ( forwards.second+1 ) % 3 ) )\n        ==\n        std::make_pair( \n          FTC( backwards.first, ( backwards.second+1 ) % 3 ), \n          FTC( backwards.first, backwards.second ) )) \n      {\n        // Check for foldovers in UV space.\n        // Get the edge (a,b) and the two opposite vertices's texture\n        // coordinates.\n        const Vector2S a = TC.row( FTC( forwards.first,  forwards.second ) );\n        const Vector2S b = \n          TC.row( FTC( forwards.first, (forwards.second+1) % 3 ) );\n        const Vector2S c_forwards  = \n          TC.row( FTC( forwards .first, (forwards .second+2) % 3 ) );\n        const Vector2S c_backwards = \n          TC.row( FTC( backwards.first, (backwards.second+2) % 3 ) );\n        // If the opposite vertices' texture coordinates fall on the same side\n        // of the edge, we have a UV-space foldover.\n        const auto orientation_forwards = Orientation( a, b, c_forwards );\n        const auto orientation_backwards = Orientation( a, b, c_backwards );\n        if( ( orientation_forwards > 0 && orientation_backwards > 0 ) ||\n            ( orientation_forwards < 0 && orientation_backwards < 0 )\n            ) {\n            foldovers( num_foldovers, 0 ) = forwards.first;\n            foldovers( num_foldovers, 1 ) = forwards.second;\n            foldovers( num_foldovers, 2 ) = backwards.first;\n            foldovers( num_foldovers, 3 ) = backwards.second;\n            num_foldovers += 1;\n        }\n      }\n      // Otherwise, we have a non-matching seam edge.\n      else \n      {\n        seams( num_seams, 0 ) = forwards.first;\n        seams( num_seams, 1 ) = forwards.second;\n        seams( num_seams, 2 ) = backwards.first;\n        seams( num_seams, 3 ) = backwards.second;\n        num_seams += 1;\n      }\n    }\n    // Otherwise, the edge and its opposite aren't both in the directed edges.\n    // One of them should be.\n    else if( directed_position_edge2face_position_index.count( vp_edge ) ) \n    {\n      const auto forwards = directed_position_edge2face_position_index[vp_edge];\n      boundaries( num_boundaries, 0 ) = forwards.first;\n      boundaries( num_boundaries, 1 ) = forwards.second;\n      num_boundaries += 1;\n    } else if( \n      directed_position_edge2face_position_index.count( vp_edge_reverse ) ) \n    {\n      const auto backwards = \n        directed_position_edge2face_position_index[ vp_edge_reverse ];\n      boundaries( num_boundaries, 0 ) = backwards.first;\n      boundaries( num_boundaries, 1 ) = backwards.second;\n      num_boundaries += 1;\n    } else {\n      // This should never happen! One of these two must have been seen.\n      assert(\n        directed_position_edge2face_position_index.count( vp_edge ) ||\n        directed_position_edge2face_position_index.count( vp_edge_reverse )\n      );\n    }\n  }\n    \n  seams     .conservativeResize( num_seams,      Eigen::NoChange_t() );\n  boundaries.conservativeResize( num_boundaries, Eigen::NoChange_t() );\n  foldovers .conservativeResize( num_foldovers,  Eigen::NoChange_t() );\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::seam_edges<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/seam_edges.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Yotam Gingold <yotam@yotamgingold.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_SEAM_EDGES_H\n#define IGL_SEAM_EDGES_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Finds all UV-space boundaries of a mesh.\n  //\n  // Inputs:\n  //   V  #V by dim list of positions of the input mesh.\n  //   TC  #TC by 2 list of 2D texture coordinates of the input mesh\n  //   F  #F by 3 list of triange indices into V representing a\n  //     manifold-with-boundary triangle mesh\n  //   FTC  #F by 3 list of indices into TC for each corner\n  // Outputs:\n  //   seams  Edges where the forwards and backwards directions have different\n  //     texture coordinates, as a #seams-by-4 matrix of indices. Each row is\n  //     organized as [ forward_face_index, forward_face_vertex_index,\n  //     backwards_face_index, backwards_face_vertex_index ] such that one side\n  //     of the seam is the edge:\n  //         F[ seams( i, 0 ), seams( i, 1 ) ], F[ seams( i, 0 ), (seams( i, 1 ) + 1) % 3 ]\n  //     and the other side is the edge:\n  //         F[ seams( i, 2 ), seams( i, 3 ) ], F[ seams( i, 2 ), (seams( i, 3 ) + 1) % 3 ]\n  //   boundaries  Edges with only one incident triangle, as a #boundaries-by-2\n  //     matrix of indices. Each row is organized as \n  //         [ face_index, face_vertex_index ]\n  //     such that the edge is:\n  //         F[ boundaries( i, 0 ), boundaries( i, 1 ) ], F[ boundaries( i, 0 ), (boundaries( i, 1 ) + 1) % 3 ]\n  //   foldovers  Edges where the two incident triangles fold over each other\n  //     in UV-space, as a #foldovers-by-4 matrix of indices.\n  //     Each row is organized as [ forward_face_index, forward_face_vertex_index,\n  //     backwards_face_index, backwards_face_vertex_index ]\n  //     such that one side of the foldover is the edge:\n  //       F[ foldovers( i, 0 ), foldovers( i, 1 ) ], F[ foldovers( i, 0 ), (foldovers( i, 1 ) + 1) % 3 ]\n  //     and the other side is the edge:\n  //       F[ foldovers( i, 2 ), foldovers( i, 3 ) ], F[ foldovers( i, 2 ), (foldovers( i, 3 ) + 1) % 3 ]\n  template <\n    typename DerivedV, \n    typename DerivedTC,\n    typename DerivedF, \n    typename DerivedFTC,\n    typename Derivedseams,\n    typename Derivedboundaries,\n    typename Derivedfoldovers>\n  IGL_INLINE void seam_edges(\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedTC>& TC,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    const Eigen::PlainObjectBase<DerivedFTC>& FTC,\n    Eigen::PlainObjectBase<Derivedseams>& seams,\n    Eigen::PlainObjectBase<Derivedboundaries>& boundaries,\n    Eigen::PlainObjectBase<Derivedfoldovers>& foldovers);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"seam_edges.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/segment_segment_intersect.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2016 Francisca Gil Ureta <gilureta@cs.nyu.edu>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"segment_segment_intersect.h\"\n\n#include <Eigen/Geometry>\n\ntemplate<typename DerivedSource, typename DerivedDir>\nIGL_INLINE bool igl::segments_intersect(\n        const Eigen::PlainObjectBase <DerivedSource> &p,\n        const Eigen::PlainObjectBase <DerivedDir> &r,\n        const Eigen::PlainObjectBase <DerivedSource> &q,\n        const Eigen::PlainObjectBase <DerivedDir> &s,\n        double &a_t,\n        double &a_u,\n        double eps\n)\n{\n    // http://stackoverflow.com/questions/563198/how-do-you-detect-where-two-line-segments-intersect\n    // Search intersection between two segments\n    // p + t*r :  t \\in [0,1]\n    // q + u*s :  u \\in [0,1]\n\n    // p + t * r = q + u * s  // x s\n    // t(r x s) = (q - p) x s\n    // t = (q - p) x s / (r x s)\n\n    // (r x s) ~ 0 --> directions are parallel, they will never cross\n    Eigen::RowVector3d rxs = r.cross(s);\n    if (rxs.norm() <= eps)\n        return false;\n\n    int sign;\n\n    double u;\n    // u = (q − p) × r / (r × s)\n    Eigen::RowVector3d u1 = (q - p).cross(r);\n    sign = ((u1.dot(rxs)) > 0) ? 1 : -1;\n    u = u1.norm() / rxs.norm();\n    u = u * sign;\n\n    if ((u - 1.) > eps || u < -eps)\n        return false;\n\n    double t;\n    // t = (q - p) x s / (r x s)\n    Eigen::RowVector3d t1 = (q - p).cross(s);\n    sign = ((t1.dot(rxs)) > 0) ? 1 : -1;\n    t = t1.norm() / rxs.norm();\n    t = t * sign;\n\n    if (t < -eps || fabs(t) < eps)\n        return false;\n\n    a_t = t;\n    a_u = u;\n\n    return true;\n};\n\n#ifdef IGL_STATIC_LIBRARY\ntemplate bool igl::segments_intersect<Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix<double, 1, 3, 1, 1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, double&, double&, double);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/segment_segment_intersect.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2016 Francisca Gil Ureta <gilureta@cs.nyu.edu>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_SEGMENT_SEGMENT_INTERSECT_H\n#define IGL_SEGMENT_SEGMENT_INTERSECT_H\n\n\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n\n    // Determine whether two line segments A,B intersect\n    // A: p + t*r :  t \\in [0,1]\n    // B: q + u*s :  u \\in [0,1]\n    // Inputs:\n    //   p  3-vector origin of segment A\n    //   r  3-vector direction of segment A\n    //   q  3-vector origin of segment B\n    //   s  3-vector direction of segment B\n    //  eps precision\n    // Outputs:\n    //   t  scalar point of intersection along segment A, t \\in [0,1]\n    //   u  scalar point of intersection along segment B, u \\in [0,1]\n    // Returns true if intersection\n    template<typename DerivedSource, typename DerivedDir>\n    IGL_INLINE bool segments_intersect(\n            const Eigen::PlainObjectBase <DerivedSource> &p,\n            const Eigen::PlainObjectBase <DerivedDir> &r,\n            const Eigen::PlainObjectBase <DerivedSource> &q,\n            const Eigen::PlainObjectBase <DerivedDir> &s,\n            double &t,\n            double &u,\n            double eps = 1e-6\n    );\n\n}\n#ifndef IGL_STATIC_LIBRARY\n#   include \"segment_segment_intersect.cpp\"\n#endif\n#endif //IGL_SEGMENT_SEGMENT_INTERSECT_H\n"
  },
  {
    "path": "libs/libigl/include/igl/serialize.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Christian Schüller <schuellchr@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_SERIALIZE_H\n#define IGL_SERIALIZE_H\n \n// -----------------------------------------------------------------------------\n// Functions to save and load a serialization of fundamental c++ data types to\n// and from a binary file. STL containers, Eigen matrix types and nested data\n// structures are also supported. To serialize a user defined class implement\n// the interface Serializable or SerializableBase.\n//\n// See also: xml/serialize_xml.h\n// -----------------------------------------------------------------------------\n// TODOs:\n// * arbitrary pointer graph structures\n// -----------------------------------------------------------------------------\n \n// Known issues: This is not written in libigl-style so it isn't (easily)\n// \"dualized\" into the static library.\n//\n \n#include <type_traits>\n#include <iostream>\n#include <fstream>\n#include <cstdint>\n#include <numeric>\n#include <vector>\n#include <set>\n#include <map>\n#include <memory>\n#include <cstdint>\n#include <list>\n \n#include <Eigen/Dense>\n#include <Eigen/Sparse>\n \n#include \"igl_inline.h\"\n \n// non-intrusive serialization helper macros\n \n#define SERIALIZE_TYPE(Type,Params) \\\nnamespace igl { namespace serialization { \\\n  void _serialization(bool s,Type& obj,std::vector<char>& buffer) {Params} \\\n  template<> inline void serialize(const Type& obj,std::vector<char>& buffer) { \\\n    _serialization(true,const_cast<Type&>(obj),buffer); \\\n    } \\\n  template<> inline void deserialize(Type& obj,const std::vector<char>& buffer) { \\\n    _serialization(false,obj,const_cast<std::vector<char>&>(buffer)); \\\n    } \\\n}}\n \n#define SERIALIZE_TYPE_SOURCE(Type,Params) \\\nnamespace igl { namespace serialization { \\\n  void _serialization(bool s,Type& obj,std::vector<char>& buffer) {Params} \\\n  void _serialize(const Type& obj,std::vector<char>& buffer) { \\\n    _serialization(true,const_cast<Type&>(obj),buffer); \\\n    } \\\n  void _deserialize(Type& obj,const std::vector<char>& buffer) { \\\n    _serialization(false,obj,const_cast<std::vector<char>&>(buffer)); \\\n    } \\\n}}\n \n#define SERIALIZE_MEMBER(Object) igl::serializer(s,obj.Object,std::string(#Object),buffer);\n#define SERIALIZE_MEMBER_NAME(Object,Name) igl::serializer(s,obj.Object,std::string(Name),buffer);\n \n \nnamespace igl\n{\n  struct IndexedPointerBase;\n \n  // Serializes the given object either to a file or to a provided buffer\n  // Templates:\n  //   T  type of the object to serialize\n  // Inputs:\n  //   obj        object to serialize\n  //   objectName unique object name,used for the identification\n  //   overwrite  set to true to overwrite an existing file\n  //   filename   name of the file containing the serialization\n  // Outputs:\n  //   buffer     binary serialization\n  //\n  template <typename T>\n  inline bool serialize(const T& obj,const std::string& filename);\n  template <typename T>\n  inline bool serialize(const T& obj,const std::string& objectName,const std::string& filename,bool overwrite = false);\n  template <typename T>\n  inline bool serialize(const T& obj,const std::string& objectName,std::vector<char>& buffer);\n  template <typename T>\n  inline bool serialize(const T& obj,const std::string& objectName,std::vector<char>& buffer);\n \n  // Deserializes the given data from a file or buffer back to the provided object\n  //\n  // Templates:\n  //   T  type of the object to serialize\n  // Inputs:\n  //   buffer     binary serialization\n  //   objectName unique object name, used for the identification\n  //   filename   name of the file containing the serialization\n  // Outputs:\n  //   obj        object to load back serialization to\n  //\n  template <typename T>\n  inline bool deserialize(T& obj,const std::string& filename);\n  template <typename T>\n  inline bool deserialize(T& obj,const std::string& objectName,const std::string& filename);\n  template <typename T>\n  inline bool deserialize(T& obj,const std::string& objectName,const std::vector<char>& buffer);\n \n  // Wrapper to expose both, the de- and serialization as one function\n  //\n  template <typename T>\n  inline bool serializer(bool serialize,T& obj,const std::string& filename);\n  template <typename T>\n  inline bool serializer(bool serialize,T& obj,const std::string& objectName,const std::string& filename,bool overwrite = false);\n  template <typename T>\n  inline bool serializer(bool serialize,T& obj,const std::string& objectName,std::vector<char>& buffer);\n \n  // User defined types have to either overload the function igl::serialization::serialize()\n  // and igl::serialization::deserialize() for their type (non-intrusive serialization):\n  //\n  // namespace igl { namespace serialization\n  // {\n  //   template<>\n  //   inline void serialize(const UserType& obj,std::vector<char>& buffer) {\n  //     ::igl::serialize(obj.var,\"var\",buffer);\n  //   }\n  //\n  //   template<>\n  //   inline void deserialize(UserType& obj,const std::vector<char>& buffer) {\n  //     ::igl::deserialize(obj.var,\"var\",buffer);\n  //   }\n  // }}\n  //\n  // or use this macro for convenience:\n  //\n  // SERIALIZE_TYPE(UserType,\n  //   SERIALIZE_MEMBER(var)\n  // )\n  //\n  // or to derive from the class Serializable and add their the members\n  // in InitSerialization like the following:\n  //\n  // class UserType : public igl::Serializable {\n  //\n  //   int var;\n  //\n  //   void InitSerialization() {\n  //     this->Add(var,\"var\");\n  //   }\n  // };\n \n  // Base interface for user defined types\n  struct SerializableBase\n  {\n    virtual void Serialize(std::vector<char>& buffer) const = 0;\n    virtual void Deserialize(const std::vector<char>& buffer) = 0;\n  };\n \n  // Convenient interface for user defined types\n  class Serializable: public SerializableBase\n  {\n  private:\n \n    template <typename T>\n    struct SerializationObject : public SerializableBase\n    {\n      bool Binary;\n      std::string Name;\n      std::unique_ptr<T> Object;\n \n      void Serialize(std::vector<char>& buffer) const override {\n        igl::serialize(*Object,Name,buffer);\n      }\n \n      void Deserialize(const std::vector<char>& buffer) override {\n        igl::deserialize(*Object,Name,buffer);\n      }\n    };\n \n    mutable bool initialized;\n    mutable std::vector<SerializableBase*> objects;\n \n  public:\n \n    // You **MUST** Override this function to add your member variables which\n    // should be serialized\n    //\n    // http://stackoverflow.com/a/6634382/148668\n    virtual void InitSerialization() = 0;\n \n    // Following functions can be overridden to handle the specific events.\n    // Return false to prevent the de-/serialization of an object.\n    inline virtual bool PreSerialization() const;\n    inline virtual void PostSerialization() const;\n    inline virtual bool PreDeserialization();\n    inline virtual void PostDeserialization();\n \n    // Default implementation of SerializableBase interface\n    inline void Serialize(std::vector<char>& buffer) const override final;\n    inline void Deserialize(const std::vector<char>& buffer) override final;\n \n    // Default constructor, destructor, assignment and copy constructor\n    inline Serializable();\n    inline Serializable(const Serializable& obj);\n    inline ~Serializable();\n    inline Serializable& operator=(const Serializable& obj);\n \n    // Use this function to add your variables which should be serialized\n    template <typename T>\n    inline void Add(T& obj,std::string name,bool binary = false);\n  };\n \n  // structure for pointer handling\n  struct IndexedPointerBase\n  {\n    enum { BEGIN,END } Type;\n    size_t Index;\n  };\n  template<typename T>\n  struct IndexedPointer: public IndexedPointerBase\n  {\n    const T* Object;\n  };\n \n  // internal functions\n  namespace serialization\n  {\n    // compile time type checks\n    template <typename T>\n    struct is_stl_container { static const bool value = false; };\n    template <typename T1,typename T2>\n    struct is_stl_container<std::pair<T1,T2> > { static const bool value = true; };\n    template <typename T1,typename T2>\n    struct is_stl_container<std::vector<T1,T2> > { static const bool value = true; };\n    template <typename T>\n    struct is_stl_container<std::set<T> > { static const bool value = true; };\n    template <typename T1,typename T2>\n    struct is_stl_container<std::map<T1,T2> > { static const bool value = true; };\n    template <typename T>\n    struct is_stl_container<std::list<T> > { static const bool value = true; };\n \n    template <typename T>\n    struct is_eigen_type { static const bool value = false; };\n    template <typename T,int R,int C,int P,int MR,int MC>\n    struct is_eigen_type<Eigen::Matrix<T,R,C,P,MR,MC> > { static const bool value = true; };\n    template <typename T,int P,typename I>\n    struct is_eigen_type<Eigen::SparseMatrix<T,P,I> > { static const bool value = true; };\n \n    template <typename T>\n    struct is_smart_ptr { static const bool value = false; };\n    template <typename T>\n    struct is_smart_ptr<std::shared_ptr<T> > { static const bool value = true; };\n    template <typename T>\n    struct is_smart_ptr<std::unique_ptr<T> > { static const bool value = true; };\n    template <typename T>\n    struct is_smart_ptr<std::weak_ptr<T> > { static const bool value = true; };\n \n    template <typename T>\n    struct is_serializable {\n      static const bool value = std::is_fundamental<T>::value || std::is_same<std::string,T>::value || std::is_enum<T>::value || std::is_base_of<SerializableBase,T>::value\n        || is_stl_container<T>::value || is_eigen_type<T>::value || std::is_pointer<T>::value || serialization::is_smart_ptr<T>::value;\n    };\n \n    // non serializable types\n    template <typename T>\n    inline typename std::enable_if<!is_serializable<T>::value,size_t>::type getByteSize(const T& obj);\n    template <typename T>\n    inline typename std::enable_if<!is_serializable<T>::value>::type serialize(const T& obj,std::vector<char>& buffer,std::vector<char>::iterator& iter);\n    template <typename T>\n    inline typename std::enable_if<!is_serializable<T>::value>::type deserialize(T& obj,std::vector<char>::const_iterator& iter);\n \n    // fundamental types\n    template <typename T>\n    inline typename std::enable_if<std::is_fundamental<T>::value,size_t>::type getByteSize(const T& obj);\n    template <typename T>\n    inline typename std::enable_if<std::is_fundamental<T>::value>::type serialize(const T& obj,std::vector<char>& buffer,std::vector<char>::iterator& iter);\n    template <typename T>\n    inline typename std::enable_if<std::is_fundamental<T>::value>::type deserialize(T& obj,std::vector<char>::const_iterator& iter);\n \n    // std::string\n    inline size_t getByteSize(const std::string& obj);\n    inline void serialize(const std::string& obj,std::vector<char>& buffer,std::vector<char>::iterator& iter);\n    inline void deserialize(std::string& obj,std::vector<char>::const_iterator& iter);\n \n    // enum types\n    template <typename T>\n    inline typename std::enable_if<std::is_enum<T>::value,size_t>::type getByteSize(const T& obj);\n    template <typename T>\n    inline typename std::enable_if<std::is_enum<T>::value>::type serialize(const T& obj,std::vector<char>& buffer,std::vector<char>::iterator& iter);\n    template <typename T>\n    inline typename std::enable_if<std::is_enum<T>::value>::type deserialize(T& obj,std::vector<char>::const_iterator& iter);\n \n    // SerializableBase\n    template <typename T>\n    inline typename std::enable_if<std::is_base_of<SerializableBase,T>::value,size_t>::type getByteSize(const T& obj);\n    template <typename T>\n    inline typename std::enable_if<std::is_base_of<SerializableBase,T>::value>::type serialize(const T& obj,std::vector<char>& buffer,std::vector<char>::iterator& iter);\n    template <typename T>\n    inline typename std::enable_if<std::is_base_of<SerializableBase,T>::value>::type deserialize(T& obj,std::vector<char>::const_iterator& iter);\n \n    // stl containers\n    // std::pair\n    template <typename T1,typename T2>\n    inline size_t getByteSize(const std::pair<T1,T2>& obj);\n    template <typename T1,typename T2>\n    inline void serialize(const std::pair<T1,T2>& obj,std::vector<char>& buffer,std::vector<char>::iterator& iter);\n    template <typename T1,typename T2>\n    inline void deserialize(std::pair<T1,T2>& obj,std::vector<char>::const_iterator& iter);\n \n    // std::vector\n    template <typename T1,typename T2>\n    inline size_t getByteSize(const std::vector<T1,T2>& obj);\n    template <typename T1,typename T2>\n    inline void serialize(const std::vector<T1,T2>& obj,std::vector<char>& buffer,std::vector<char>::iterator& iter);\n    template <typename T1,typename T2>\n    inline void deserialize(std::vector<T1,T2>& obj,std::vector<char>::const_iterator& iter);\n    template <typename T2>\n    inline void deserialize(std::vector<bool,T2>& obj,std::vector<char>::const_iterator& iter);\n \n    // std::set\n    template <typename T>\n    inline size_t getByteSize(const std::set<T>& obj);\n    template <typename T>\n    inline void serialize(const std::set<T>& obj,std::vector<char>& buffer,std::vector<char>::iterator& iter);\n    template <typename T>\n    inline void deserialize(std::set<T>& obj,std::vector<char>::const_iterator& iter);\n \n    // std::map\n    template <typename T1,typename T2>\n    inline size_t getByteSize(const std::map<T1,T2>& obj);\n    template <typename T1,typename T2>\n    inline void serialize(const std::map<T1,T2>& obj,std::vector<char>& buffer,std::vector<char>::iterator& iter);\n    template <typename T1,typename T2>\n    inline void deserialize(std::map<T1,T2>& obj,std::vector<char>::const_iterator& iter);\n \n    // std::list\n    template <typename T>\n    inline size_t getByteSize(const std::list<T>& obj);\n    template <typename T>\n    inline void serialize(const std::list<T>& obj, std::vector<char>& buffer, std::vector<char>::iterator& iter);\n    template <typename T>\n    inline void deserialize(std::list<T>& obj, std::vector<char>::const_iterator& iter);\n \n    // Eigen types\n    template<typename T,int R,int C,int P,int MR,int MC>\n    inline size_t getByteSize(const Eigen::Matrix<T,R,C,P,MR,MC>& obj);\n    template<typename T,int R,int C,int P,int MR,int MC>\n    inline void serialize(const Eigen::Matrix<T,R,C,P,MR,MC>& obj,std::vector<char>& buffer,std::vector<char>::iterator& iter);\n    template<typename T,int R,int C,int P,int MR,int MC>\n    inline void deserialize(Eigen::Matrix<T,R,C,P,MR,MC>& obj,std::vector<char>::const_iterator& iter);\n \n    template<typename T,int P,typename I>\n    inline size_t getByteSize(const Eigen::SparseMatrix<T,P,I>& obj);\n    template<typename T,int P,typename I>\n    inline void serialize(const Eigen::SparseMatrix<T,P,I>& obj,std::vector<char>& buffer,std::vector<char>::iterator& iter);\n    template<typename T,int P,typename I>\n    inline void deserialize(Eigen::SparseMatrix<T,P,I>& obj,std::vector<char>::const_iterator& iter);\n \n    template<typename T,int P>\n    inline size_t getByteSize(const Eigen::Quaternion<T,P>& obj);\n    template<typename T,int P>\n    inline void serialize(const Eigen::Quaternion<T,P>& obj,std::vector<char>& buffer,std::vector<char>::iterator& iter);\n    template<typename T,int P>\n    inline void deserialize(Eigen::Quaternion<T,P>& obj,std::vector<char>::const_iterator& iter);\n \n    // raw pointers\n    template <typename T>\n    inline typename std::enable_if<std::is_pointer<T>::value,size_t>::type getByteSize(const T& obj);\n    template <typename T>\n    inline typename std::enable_if<std::is_pointer<T>::value>::type serialize(const T& obj,std::vector<char>& buffer,std::vector<char>::iterator& iter);\n    template <typename T>\n    inline typename std::enable_if<std::is_pointer<T>::value>::type deserialize(T& obj,std::vector<char>::const_iterator& iter);\n \n    // std::shared_ptr and std::unique_ptr\n    template <typename T>\n    inline typename std::enable_if<serialization::is_smart_ptr<T>::value,size_t>::type getByteSize(const T& obj);\n    template <typename T>\n    inline typename std::enable_if<serialization::is_smart_ptr<T>::value>::type serialize(const T& obj,std::vector<char>& buffer,std::vector<char>::iterator& iter);\n    template <template<typename> class T0, typename T1>\n    inline typename std::enable_if<serialization::is_smart_ptr<T0<T1> >::value>::type deserialize(T0<T1>& obj,std::vector<char>::const_iterator& iter);\n \n    // std::weak_ptr\n    template <typename T>\n    inline size_t getByteSize(const std::weak_ptr<T>& obj);\n    template <typename T>\n    inline void serialize(const std::weak_ptr<T>& obj,std::vector<char>& buffer,std::vector<char>::iterator& iter);\n    template <typename T>\n    inline void deserialize(std::weak_ptr<T>& obj,std::vector<char>::const_iterator& iter);\n \n    // functions to overload for non-intrusive serialization\n    template <typename T>\n    inline void serialize(const T& obj,std::vector<char>& buffer);\n    template <typename T>\n    inline void deserialize(T& obj,const std::vector<char>& buffer);\n \n    // helper functions\n    template <typename T>\n    inline void updateMemoryMap(T& obj,size_t size);\n  }\n}\n \n// Always include inlines for these functions\n \n// IMPLEMENTATION\n \nnamespace igl\n{\n  template <typename T>\n  inline bool serialize(const T& obj,const std::string& filename)\n  {\n    return serialize(obj,\"obj\",filename,true);\n  }\n \n  template <typename T>\n  inline bool serialize(const T& obj,const std::string& objectName,const std::string& filename,bool overwrite)\n  {\n    bool success = false;\n \n    std::vector<char> buffer;\n \n    std::ios_base::openmode mode = std::ios::out | std::ios::binary;\n \n    if(overwrite)\n      mode |= std::ios::trunc;\n    else\n      mode |= std::ios::app;\n \n    std::ofstream file(filename.c_str(),mode);\n \n    if(file.is_open())\n    {\n      serialize(obj,objectName,buffer);\n \n      file.write(&buffer[0],buffer.size());\n \n      file.close();\n \n      success = true;\n    }\n    else\n    {\n      std::cerr << \"serialization: file \" << filename << \" not found!\" << std::endl;\n    }\n \n    return success;\n  }\n \n  template <typename T>\n  inline bool serialize(const T& obj,const std::string& objectName,std::vector<char>& buffer)\n  {\n    // serialize object data\n    size_t size = serialization::getByteSize(obj);\n    std::vector<char> tmp(size);\n    auto it = tmp.begin();\n    serialization::serialize(obj,tmp,it);\n \n    std::string objectType(typeid(obj).name());\n    size_t newObjectSize = tmp.size();\n    size_t newHeaderSize = serialization::getByteSize(objectName) + serialization::getByteSize(objectType) + sizeof(size_t);\n    size_t curSize = buffer.size();\n    size_t newSize = curSize + newHeaderSize + newObjectSize;\n \n    buffer.resize(newSize);\n \n    std::vector<char>::iterator iter = buffer.begin()+curSize;\n \n    // serialize object header (name/type/size)\n    serialization::serialize(objectName,buffer,iter);\n    serialization::serialize(objectType,buffer,iter);\n    serialization::serialize(newObjectSize,buffer,iter);\n \n    // copy serialized data to buffer\n    iter = std::copy(tmp.begin(),tmp.end(),iter);\n \n    return true;\n  }\n \n  template <typename T>\n  inline bool deserialize(T& obj,const std::string& filename)\n  {\n    return deserialize(obj,\"obj\",filename);\n  }\n \n  template <typename T>\n  inline bool deserialize(T& obj,const std::string& objectName,const std::string& filename)\n  {\n    bool success = false;\n \n    std::ifstream file(filename.c_str(),std::ios::binary);\n \n    if(file.is_open())\n    {\n      file.seekg(0,std::ios::end);\n      std::streamoff size = file.tellg();\n      file.seekg(0,std::ios::beg);\n \n      std::vector<char> buffer(size);\n      file.read(&buffer[0],size);\n \n      deserialize(obj,objectName,buffer);\n      file.close();\n \n      success = true;\n    }\n    else\n    {\n      std::cerr << \"serialization: file \" << filename << \" not found!\" << std::endl;\n    }\n \n    return success;\n  }\n \n  template <typename T>\n  inline bool deserialize(T& obj,const std::string& objectName,const std::vector<char>& buffer)\n  {\n    bool success = false;\n \n    // find suitable object header\n    auto objectIter = buffer.cend();\n    auto iter = buffer.cbegin();\n    while(iter != buffer.end())\n    {\n      std::string name;\n      std::string type;\n      size_t size;\n      serialization::deserialize(name,iter);\n      serialization::deserialize(type,iter);\n      serialization::deserialize(size,iter);\n \n      if(name == objectName && type == typeid(obj).name())\n      {\n        objectIter = iter;\n        //break; // find first suitable object header\n      }\n \n      iter+=size;\n    }\n \n    if(objectIter != buffer.end())\n    {\n      serialization::deserialize(obj,objectIter);\n      success = true;\n    }\n    else\n    {\n      obj = T();\n    }\n \n    return success;\n  }\n \n  // Wrapper function which combines both, de- and serialization\n  template <typename T>\n  inline bool serializer(bool s,T& obj,const std::string& filename)\n  {\n    return s ? serialize(obj,filename) : deserialize(obj,filename);\n  }\n \n  template <typename T>\n  inline bool serializer(bool s,T& obj,const std::string& objectName,const std::string& filename,bool overwrite)\n  {\n    return s ? serialize(obj,objectName,filename,overwrite) : deserialize(obj,objectName,filename);\n  }\n \n  template <typename T>\n  inline bool serializer(bool s,T& obj,const std::string& objectName,std::vector<char>& buffer)\n  {\n    return s ? serialize(obj,objectName,buffer) : deserialize(obj,objectName,buffer);\n  }\n \n  inline bool Serializable::PreSerialization() const\n  {\n    return true;\n  }\n \n  inline void Serializable::PostSerialization() const\n  {\n  }\n \n  inline bool Serializable::PreDeserialization()\n  {\n    return true;\n  }\n \n  inline void Serializable::PostDeserialization()\n  {\n  }\n \n  inline void Serializable::Serialize(std::vector<char>& buffer) const\n  {\n    if(this->PreSerialization())\n    {\n      if(initialized == false)\n      {\n        objects.clear();\n        (const_cast<Serializable*>(this))->InitSerialization();\n        initialized = true;\n      }\n \n      for(const auto& v : objects)\n      {\n        v->Serialize(buffer);\n      }\n \n      this->PostSerialization();\n    }\n  }\n \n  inline void Serializable::Deserialize(const std::vector<char>& buffer)\n  {\n    if(this->PreDeserialization())\n    {\n      if(initialized == false)\n      {\n        objects.clear();\n        (const_cast<Serializable*>(this))->InitSerialization();\n        initialized = true;\n      }\n \n      for(auto& v : objects)\n      {\n        v->Deserialize(buffer);\n      }\n \n      this->PostDeserialization();\n    }\n  }\n \n  inline Serializable::Serializable()\n  {\n    initialized = false;\n  }\n \n  inline Serializable::Serializable(const Serializable& obj)\n  {\n    initialized = false;\n    objects.clear();\n  }\n \n  inline Serializable::~Serializable()\n  {\n    initialized = false;\n    objects.clear();\n  }\n \n  inline Serializable& Serializable::operator=(const Serializable& obj)\n  {\n    if(this != &obj)\n    {\n      if(initialized)\n      {\n        initialized = false;\n        objects.clear();\n      }\n    }\n    return *this;\n  }\n \n  template <typename T>\n  inline void Serializable::Add(T& obj,const std::string name,bool binary)\n  {\n    auto object = new SerializationObject<T>();\n    object->Binary = binary;\n    object->Name = name;\n    object->Object = std::unique_ptr<T>(&obj);\n \n    objects.push_back(object);\n  }\n \n  namespace serialization\n  {\n    template <typename T>\n    inline typename std::enable_if<!is_serializable<T>::value,size_t>::type getByteSize(const T& obj)\n    {\n      return sizeof(std::vector<char>::size_type);\n    }\n \n    template <typename T>\n    inline typename std::enable_if<!is_serializable<T>::value>::type serialize(const T& obj,std::vector<char>& buffer,std::vector<char>::iterator& iter)\n    {\n      // data\n      std::vector<char> tmp;\n      serialize<>(obj,tmp);\n \n      // size\n      size_t size = buffer.size();\n      serialization::serialize(tmp.size(),buffer,iter);\n      size_t cur = iter - buffer.begin();\n \n      buffer.resize(size+tmp.size());\n      iter = buffer.begin()+cur;\n      iter = std::copy(tmp.begin(),tmp.end(),iter);\n    }\n \n    template <typename T>\n    inline typename std::enable_if<!is_serializable<T>::value>::type deserialize(T& obj,std::vector<char>::const_iterator& iter)\n    {\n      std::vector<char>::size_type size;\n      serialization::deserialize<>(size,iter);\n \n      std::vector<char> tmp;\n      tmp.resize(size);\n      std::copy(iter,iter+size,tmp.begin());\n \n      deserialize<>(obj,tmp);\n      iter += size;\n    }\n \n    // fundamental types\n \n    template <typename T>\n    inline typename std::enable_if<std::is_fundamental<T>::value,size_t>::type getByteSize(const T& obj)\n    {\n      return sizeof(T);\n    }\n \n    template <typename T>\n    inline typename std::enable_if<std::is_fundamental<T>::value>::type serialize(const T& obj,std::vector<char>& buffer,std::vector<char>::iterator& iter)\n    {\n      //serialization::updateMemoryMap(obj,sizeof(T));\n      const uint8_t* ptr = reinterpret_cast<const uint8_t*>(&obj);\n      iter = std::copy(ptr,ptr+sizeof(T),iter);\n    }\n \n    template <typename T>\n    inline typename std::enable_if<std::is_fundamental<T>::value>::type deserialize(T& obj,std::vector<char>::const_iterator& iter)\n    {\n      uint8_t* ptr = reinterpret_cast<uint8_t*>(&obj);\n      std::copy(iter,iter+sizeof(T),ptr);\n      iter += sizeof(T);\n    }\n \n    // std::string\n \n    inline size_t getByteSize(const std::string& obj)\n    {\n      return getByteSize(obj.length())+obj.length()*sizeof(uint8_t);\n    }\n \n    inline void serialize(const std::string& obj,std::vector<char>& buffer,std::vector<char>::iterator& iter)\n    {\n      serialization::serialize(obj.length(),buffer,iter);\n      for(const auto& cur : obj)\n      {\n        serialization::serialize(cur,buffer,iter);\n      }\n    }\n \n    inline void deserialize(std::string& obj,std::vector<char>::const_iterator& iter)\n    {\n      size_t size;\n      serialization::deserialize(size,iter);\n \n      std::string str(size,'\\0');\n      for(size_t i=0; i<size; ++i)\n      {\n        serialization::deserialize(str.at(i),iter);\n      }\n \n      obj = str;\n    }\n \n    // enum types\n \n    template <typename T>\n    inline typename std::enable_if<std::is_enum<T>::value,size_t>::type getByteSize(const T& obj)\n    {\n      return sizeof(T);\n    }\n \n    template <typename T>\n    inline typename std::enable_if<std::is_enum<T>::value>::type serialize(const T& obj,std::vector<char>& buffer,std::vector<char>::iterator& iter)\n    {\n      const uint8_t* ptr = reinterpret_cast<const uint8_t*>(&obj);\n      iter = std::copy(ptr,ptr+sizeof(T),iter);\n    }\n \n    template <typename T>\n    inline typename std::enable_if<std::is_enum<T>::value>::type deserialize(T& obj,std::vector<char>::const_iterator& iter)\n    {\n      uint8_t* ptr = reinterpret_cast<uint8_t*>(&obj);\n      std::copy(iter,iter+sizeof(T),ptr);\n      iter += sizeof(T);\n    }\n \n    // SerializableBase\n \n    template <typename T>\n    inline typename std::enable_if<std::is_base_of<SerializableBase,T>::value,size_t>::type getByteSize(const T& obj)\n    {\n      return sizeof(std::vector<char>::size_type);\n    }\n \n    template <typename T>\n    inline typename std::enable_if<std::is_base_of<SerializableBase,T>::value>::type serialize(const T& obj,std::vector<char>& buffer,std::vector<char>::iterator& iter)\n    {\n      // data\n      std::vector<char> tmp;\n      obj.Serialize(tmp);\n \n      // size\n      size_t size = buffer.size();\n      serialization::serialize(tmp.size(),buffer,iter);\n      size_t cur = iter - buffer.begin();\n \n      buffer.resize(size+tmp.size());\n      iter = buffer.begin()+cur;\n      iter = std::copy(tmp.begin(),tmp.end(),iter);\n    }\n \n    template <typename T>\n    inline typename std::enable_if<std::is_base_of<SerializableBase,T>::value>::type deserialize(T& obj,std::vector<char>::const_iterator& iter)\n    {\n      std::vector<char>::size_type size;\n      serialization::deserialize(size,iter);\n \n      std::vector<char> tmp;\n      tmp.resize(size);\n      std::copy(iter,iter+size,tmp.begin());\n \n      obj.Deserialize(tmp);\n      iter += size;\n    }\n \n    // STL containers\n \n    // std::pair\n \n    template <typename T1,typename T2>\n    inline size_t getByteSize(const std::pair<T1,T2>& obj)\n    {\n      return getByteSize(obj.first)+getByteSize(obj.second);\n    }\n \n    template <typename T1,typename T2>\n    inline void serialize(const std::pair<T1,T2>& obj,std::vector<char>& buffer,std::vector<char>::iterator& iter)\n    {\n      serialization::serialize(obj.first,buffer,iter);\n      serialization::serialize(obj.second,buffer,iter);\n    }\n \n    template <typename T1,typename T2>\n    inline void deserialize(std::pair<T1,T2>& obj,std::vector<char>::const_iterator& iter)\n    {\n      serialization::deserialize(obj.first,iter);\n      serialization::deserialize(obj.second,iter);\n    }\n \n    // std::vector\n \n    template <typename T1,typename T2>\n    inline size_t getByteSize(const std::vector<T1,T2>& obj)\n    {\n      return std::accumulate(obj.begin(),obj.end(),sizeof(size_t),[](const size_t& acc,const T1& cur) { return acc+getByteSize(cur); });\n    }\n \n    template <typename T1,typename T2>\n    inline void serialize(const std::vector<T1,T2>& obj,std::vector<char>& buffer,std::vector<char>::iterator& iter)\n    {\n      size_t size = obj.size();\n      serialization::serialize(size,buffer,iter);\n      for(const T1& cur : obj)\n      {\n        serialization::serialize(cur,buffer,iter);\n      }\n    }\n \n    template <typename T1,typename T2>\n    inline void deserialize(std::vector<T1,T2>& obj,std::vector<char>::const_iterator& iter)\n    {\n      size_t size;\n      serialization::deserialize(size,iter);\n \n      obj.resize(size);\n      for(T1& v : obj)\n      {\n        serialization::deserialize(v,iter);\n      }\n    }\n \n    template <typename T2>\n    inline void deserialize(std::vector<bool,T2>& obj,std::vector<char>::const_iterator& iter)\n    {\n      size_t size;\n      serialization::deserialize(size,iter);\n \n      obj.resize(size);\n      for(int i=0;i<obj.size();i++)\n      {\n        bool val;\n        serialization::deserialize(val,iter);\n        obj[i] = val;\n      }\n    }\n \n    //std::set\n \n    template <typename T>\n    inline size_t getByteSize(const std::set<T>& obj)\n    {\n      return std::accumulate(obj.begin(),obj.end(),getByteSize(obj.size()),[](const size_t& acc,const T& cur) { return acc+getByteSize(cur); });\n    }\n \n    template <typename T>\n    inline void serialize(const std::set<T>& obj,std::vector<char>& buffer,std::vector<char>::iterator& iter)\n    {\n      serialization::serialize(obj.size(),buffer,iter);\n      for(const T& cur : obj)\n      {\n        serialization::serialize(cur,buffer,iter);\n      }\n    }\n \n    template <typename T>\n    inline void deserialize(std::set<T>& obj,std::vector<char>::const_iterator& iter)\n    {\n      size_t size;\n      serialization::deserialize(size,iter);\n \n      obj.clear();\n      for(size_t i=0; i<size; ++i)\n      {\n        T val;\n        serialization::deserialize(val,iter);\n        obj.insert(val);\n      }\n    }\n \n    // std::map\n \n    template <typename T1,typename T2>\n    inline size_t getByteSize(const std::map<T1,T2>& obj)\n    {\n      return std::accumulate(obj.begin(),obj.end(),sizeof(size_t),[](const size_t& acc,const std::pair<T1,T2>& cur) { return acc+getByteSize(cur); });\n    }\n \n    template <typename T1,typename T2>\n    inline void serialize(const std::map<T1,T2>& obj,std::vector<char>& buffer,std::vector<char>::iterator& iter)\n    {\n      serialization::serialize(obj.size(),buffer,iter);\n      for(const auto& cur : obj)\n      {\n        serialization::serialize(cur,buffer,iter);\n      }\n    }\n \n    template <typename T1,typename T2>\n    inline void deserialize(std::map<T1,T2>& obj,std::vector<char>::const_iterator& iter)\n    {\n      size_t size;\n      serialization::deserialize(size,iter);\n \n      obj.clear();\n      for(size_t i=0; i<size; ++i)\n      {\n        std::pair<T1,T2> pair;\n        serialization::deserialize(pair,iter);\n        obj.insert(pair);\n      }\n    }\n \n    //std::list\n \n    template <typename T>\n    inline size_t getByteSize(const std::list<T>& obj)\n    {\n        return std::accumulate(obj.begin(), obj.end(), getByteSize(obj.size()), [](const size_t& acc, const T& cur) { return acc + getByteSize(cur); });\n    }\n \n    template <typename T>\n    inline void serialize(const std::list<T>& obj, std::vector<char>& buffer, std::vector<char>::iterator& iter)\n    {\n        serialization::serialize(obj.size(), buffer, iter);\n        for (const T& cur : obj)\n        {\n            serialization::serialize(cur, buffer, iter);\n        }\n    }\n \n    template <typename T>\n    inline void deserialize(std::list<T>& obj, std::vector<char>::const_iterator& iter)\n    {\n        size_t size;\n        serialization::deserialize(size, iter);\n \n        obj.clear();\n        for (size_t i = 0; i < size; ++i)\n        {\n            T val;\n            serialization::deserialize(val, iter);\n            obj.emplace_back(val);\n        }\n    }\n \n \n    // Eigen types\n    template<typename T,int R,int C,int P,int MR,int MC>\n    inline size_t getByteSize(const Eigen::Matrix<T,R,C,P,MR,MC>& obj)\n    {\n      // space for numbers of rows,cols and data\n      return 2*sizeof(typename Eigen::Matrix<T,R,C,P,MR,MC>::Index)+sizeof(T)*obj.rows()*obj.cols();\n    }\n \n    template<typename T,int R,int C,int P,int MR,int MC>\n    inline void serialize(const Eigen::Matrix<T,R,C,P,MR,MC>& obj,std::vector<char>& buffer,std::vector<char>::iterator& iter)\n    {\n      serialization::serialize(obj.rows(),buffer,iter);\n      serialization::serialize(obj.cols(),buffer,iter);\n      size_t size = sizeof(T)*obj.rows()*obj.cols();\n      auto ptr = reinterpret_cast<const uint8_t*>(obj.data());\n      iter = std::copy(ptr,ptr+size,iter);\n    }\n \n    template<typename T,int R,int C,int P,int MR,int MC>\n    inline void deserialize(Eigen::Matrix<T,R,C,P,MR,MC>& obj,std::vector<char>::const_iterator& iter)\n    {\n      typename Eigen::Matrix<T,R,C,P,MR,MC>::Index rows,cols;\n      serialization::deserialize(rows,iter);\n      serialization::deserialize(cols,iter);\n      size_t size = sizeof(T)*rows*cols;\n      obj.resize(rows,cols);\n      auto ptr = reinterpret_cast<uint8_t*>(obj.data());\n      std::copy(iter,iter+size,ptr);\n      iter+=size;\n    }\n \n    template<typename T,int P,typename I>\n    inline size_t getByteSize(const Eigen::SparseMatrix<T,P,I>& obj)\n    {\n      // space for numbers of rows,cols,nonZeros and tripplets with data (rowIdx,colIdx,value)\n      size_t size = sizeof(typename Eigen::SparseMatrix<T,P,I>::Index);\n      return 3*size+(sizeof(T)+2*size)*obj.nonZeros();\n    }\n \n    template<typename T,int P,typename I>\n    inline void serialize(const Eigen::SparseMatrix<T,P,I>& obj,std::vector<char>& buffer,std::vector<char>::iterator& iter)\n    {\n      serialization::serialize(obj.rows(),buffer,iter);\n      serialization::serialize(obj.cols(),buffer,iter);\n      serialization::serialize(obj.nonZeros(),buffer,iter);\n \n      for(int k=0;k<obj.outerSize();++k)\n      {\n        for(typename Eigen::SparseMatrix<T,P,I>::InnerIterator it(obj,k);it;++it)\n        {\n          serialization::serialize(it.row(),buffer,iter);\n          serialization::serialize(it.col(),buffer,iter);\n          serialization::serialize(it.value(),buffer,iter);\n        }\n      }\n    }\n \n    template<typename T,int P,typename I>\n    inline void deserialize(Eigen::SparseMatrix<T,P,I>& obj,std::vector<char>::const_iterator& iter)\n    {\n      typename Eigen::SparseMatrix<T,P,I>::Index rows,cols,nonZeros;\n      serialization::deserialize(rows,iter);\n      serialization::deserialize(cols,iter);\n      serialization::deserialize(nonZeros,iter);\n \n      obj.resize(rows,cols);\n      obj.setZero();\n \n      std::vector<Eigen::Triplet<T,I> > triplets;\n      for(int i=0;i<nonZeros;i++)\n      {\n        typename Eigen::SparseMatrix<T,P,I>::Index rowId,colId;\n        serialization::deserialize(rowId,iter);\n        serialization::deserialize(colId,iter);\n        T value;\n        serialization::deserialize(value,iter);\n        triplets.push_back(Eigen::Triplet<T,I>(rowId,colId,value));\n      }\n      obj.setFromTriplets(triplets.begin(),triplets.end());\n    }\n \n    template<typename T,int P>\n    inline size_t getByteSize(const Eigen::Quaternion<T,P>& obj)\n    {\n      return sizeof(T)*4;\n    }\n \n    template<typename T,int P>\n    inline void serialize(const Eigen::Quaternion<T,P>& obj,std::vector<char>& buffer,std::vector<char>::iterator& iter)\n    {\n      serialization::serialize(obj.w(),buffer,iter);\n      serialization::serialize(obj.x(),buffer,iter);\n      serialization::serialize(obj.y(),buffer,iter);\n      serialization::serialize(obj.z(),buffer,iter);\n    }\n \n    template<typename T,int P>\n    inline void deserialize(Eigen::Quaternion<T,P>& obj,std::vector<char>::const_iterator& iter)\n    {\n      serialization::deserialize(obj.w(),iter);\n      serialization::deserialize(obj.x(),iter);\n      serialization::deserialize(obj.y(),iter);\n      serialization::deserialize(obj.z(),iter);\n    }\n \n    // pointers\n \n    template <typename T>\n    inline typename std::enable_if<std::is_pointer<T>::value,size_t>::type getByteSize(const T& obj)\n    {\n      size_t size = sizeof(bool);\n \n      if(obj)\n        size += getByteSize(*obj);\n \n      return size;\n    }\n \n    template <typename T>\n    inline typename std::enable_if<std::is_pointer<T>::value>::type serialize(const T& obj,std::vector<char>& buffer,std::vector<char>::iterator& iter)\n    {\n      serialization::serialize(obj == nullptr,buffer,iter);\n \n      if(obj)\n        serialization::serialize(*obj,buffer,iter);\n    }\n \n    template <typename T>\n    inline typename std::enable_if<std::is_pointer<T>::value>::type deserialize(T& obj,std::vector<char>::const_iterator& iter)\n    {\n      bool isNullPtr;\n      serialization::deserialize(isNullPtr,iter);\n \n      if(isNullPtr)\n      {\n        if(obj)\n        {\n          std::cout << \"serialization: possible memory leak in serialization for '\" << typeid(obj).name() << \"'\" << std::endl;\n          obj = nullptr;\n        }\n      }\n      else\n      {\n        if(obj)\n        {\n          std::cout << \"serialization: possible memory corruption in deserialization for '\" << typeid(obj).name() << \"'\" << std::endl;\n        }\n        else\n        {\n          obj = new typename std::remove_pointer<T>::type();\n        }\n        serialization::deserialize(*obj,iter);\n      }\n    }\n \n    // std::shared_ptr and std::unique_ptr\n \n    template <typename T>\n    inline typename std::enable_if<serialization::is_smart_ptr<T>::value,size_t>::type getByteSize(const T& obj)\n    {\n      return getByteSize(obj.get());\n    }\n \n    template <typename T>\n    inline typename std::enable_if<serialization::is_smart_ptr<T>::value>::type serialize(const T& obj,std::vector<char>& buffer,std::vector<char>::iterator& iter)\n    {\n      serialize(obj.get(),buffer,iter);\n    }\n \n    template <template<typename> class T0,typename T1>\n    inline typename std::enable_if<serialization::is_smart_ptr<T0<T1> >::value>::type deserialize(T0<T1>& obj,std::vector<char>::const_iterator& iter)\n    {\n      bool isNullPtr;\n      serialization::deserialize(isNullPtr,iter);\n \n      if(isNullPtr)\n      {\n        obj.reset();\n      }\n      else\n      {\n        obj = T0<T1>(new T1());\n        serialization::deserialize(*obj,iter);\n      }\n    }\n \n    // std::weak_ptr\n \n    template <typename T>\n    inline size_t getByteSize(const std::weak_ptr<T>& obj)\n    {\n      return sizeof(size_t);\n    }\n \n    template <typename T>\n    inline void serialize(const std::weak_ptr<T>& obj,std::vector<char>& buffer,std::vector<char>::iterator& iter)\n    {\n \n    }\n \n    template <typename T>\n    inline void deserialize(std::weak_ptr<T>& obj,std::vector<char>::const_iterator& iter)\n    {\n \n    }\n \n    // functions to overload for non-intrusive serialization\n    template <typename T>\n    inline void serialize(const T& obj,std::vector<char>& buffer)\n    {\n      std::cerr << typeid(obj).name() << \" is not serializable: derive from igl::Serializable or spezialize the template function igl::serialization::serialize(const T& obj,std::vector<char>& buffer)\" << std::endl;\n    }\n \n    template <typename T>\n    inline void deserialize(T& obj,const std::vector<char>& buffer)\n    {\n      std::cerr << typeid(obj).name() << \" is not deserializable: derive from igl::Serializable or spezialize the template function igl::serialization::deserialize(T& obj, const std::vector<char>& buffer)\" << std::endl;\n    }\n \n    // helper functions\n \n    template <typename T>\n    inline void updateMemoryMap(T& obj,size_t size,std::map<std::uintptr_t,IndexedPointerBase*>& memoryMap)\n    {\n      // check if object is already serialized\n      auto startPtr = new IndexedPointer<T>();\n      startPtr->Object = &obj;\n      auto startBasePtr = static_cast<IndexedPointerBase*>(startPtr);\n      startBasePtr->Type = IndexedPointerBase::BEGIN;\n      auto startAddress = reinterpret_cast<std::uintptr_t>(&obj);\n      auto p = std::pair<std::uintptr_t,IndexedPointerBase*>(startAddress,startBasePtr);\n \n      auto el = memoryMap.insert(p);\n      auto iter = ++el.first; // next elememt\n      if(el.second && (iter == memoryMap.end() || iter->second->Type != IndexedPointerBase::END))\n      {\n        // not yet serialized\n        auto endPtr = new IndexedPointer<T>();\n        auto endBasePtr = static_cast<IndexedPointerBase*>(endPtr);\n        endBasePtr->Type = IndexedPointerBase::END;\n        auto endAddress = reinterpret_cast<std::uintptr_t>(&obj) + size - 1;\n        auto p = std::pair<std::uintptr_t,IndexedPointerBase*>(endAddress,endBasePtr);\n \n        // insert end address\n        memoryMap.insert(el.first,p);\n      }\n      else\n      {\n        // already serialized\n \n        // remove inserted address\n        memoryMap.erase(el.first);\n      }\n    }\n  }\n}\n \n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/setdiff.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"setdiff.h\"\n#include \"LinSpaced.h\"\n#include \"list_to_matrix.h\"\n#include \"sort.h\"\n#include \"unique.h\"\n\ntemplate <\n  typename DerivedA,\n  typename DerivedB,\n  typename DerivedC,\n  typename DerivedIA>\nIGL_INLINE void igl::setdiff(\n  const Eigen::DenseBase<DerivedA> & A,\n  const Eigen::DenseBase<DerivedB> & B,\n  Eigen::PlainObjectBase<DerivedC> & C,\n  Eigen::PlainObjectBase<DerivedIA> & IA)\n{\n  using namespace Eigen;\n  using namespace std;\n  // boring base cases\n  if(A.size() == 0)\n  {\n    C.resize(0,1);\n    IA.resize(0,1);\n  }\n  if(B.size() == 0)\n  {\n    C.resize(A.size(),1);\n    int k = 0;\n    for(int j = 0;j<A.cols();j++)\n    {\n      for(int i = 0;i<A.rows();i++)\n      {\n        C(k++) = A(i,j);\n      }\n    }\n    assert(k == C.size());\n    IA = igl::LinSpaced<Eigen::Matrix<typename DerivedIA::Scalar,Eigen::Dynamic,1> >(\n      C.size(),0,C.size()-1);\n  }\n\n  // Get rid of any duplicates\n  typedef Matrix<typename DerivedA::Scalar,Dynamic,1> VectorA;\n  typedef Matrix<typename DerivedB::Scalar,Dynamic,1> VectorB;\n  VectorA uA;\n  VectorB uB;\n  typedef DerivedIA IAType;\n  IAType uIA,uIuA,uIB,uIuB;\n  unique(A,uA,uIA,uIuA);\n  unique(B,uB,uIB,uIuB);\n\n  // Sort both\n  VectorA sA;\n  VectorB sB;\n  IAType sIA,sIB;\n  sort(uA,1,true,sA,sIA);\n  sort(uB,1,true,sB,sIB);\n\n  vector<typename DerivedB::Scalar> vC;\n  vector<typename DerivedIA::Scalar> vIA;\n  int bi = 0;\n  // loop over sA\n  bool past = false;\n  for(int a = 0;a<sA.size();a++)\n  {\n    while(!past && sA(a)>sB(bi))\n    {\n      bi++;\n      past = bi>=sB.size();\n    }\n    if(past || sA(a)<sB(bi))\n    {\n      // then sA(a) did not appear in sB\n      vC.push_back(sA(a));\n      vIA.push_back(uIA(sIA(a)));\n    }\n  }\n  list_to_matrix(vC,C);\n  list_to_matrix(vIA,IA);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::setdiff<Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> > const&, Eigen::DenseBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::setdiff<Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::setdiff<Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::DenseBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::setdiff<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::DenseBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/setdiff.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_SETDIFF_H\n#define IGL_SETDIFF_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Set difference of elements of matrices\n  //\n  // Inputs:\n  //   A  m-long vector of indices\n  //   B  n-long vector of indices\n  // Outputs:\n  //   C  (k<=m)-long vector of unique elements appearing in A but not in B\n  //   IA  (k<=m)-long list of indices into A so that C = A(IA)\n  //\n  template <\n    typename DerivedA,\n    typename DerivedB,\n    typename DerivedC,\n    typename DerivedIA>\n  IGL_INLINE void setdiff(\n    const Eigen::DenseBase<DerivedA> & A,\n    const Eigen::DenseBase<DerivedB> & B,\n    Eigen::PlainObjectBase<DerivedC> & C,\n    Eigen::PlainObjectBase<DerivedIA> & IA);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"setdiff.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/setunion.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"setunion.h\"\n#include \"unique.h\"\n\ntemplate <\n  typename DerivedA,\n  typename DerivedB,\n  typename DerivedC,\n  typename DerivedIA,\n  typename DerivedIB>\nIGL_INLINE void igl::setunion(\n  const Eigen::DenseBase<DerivedA> & A,\n  const Eigen::DenseBase<DerivedB> & B,\n  Eigen::PlainObjectBase<DerivedC> & C,\n  Eigen::PlainObjectBase<DerivedIA> & IA,\n  Eigen::PlainObjectBase<DerivedIB> & IB)\n{\n  DerivedC CS(A.size()+B.size(),1);\n  {\n    int k = 0;\n    for(int j = 0;j<A.cols();j++)\n    {\n      for(int i = 0;i<A.rows();i++)\n      {\n        CS(k++) = A(i,j);\n      }\n    }\n    for(int j = 0;j<B.cols();j++)\n    {\n      for(int i = 0;i<B.rows();i++)\n      {\n        CS(k++) = B(i,j);\n      }\n    }\n    assert(k==CS.size());\n  }\n  DerivedIA IAC;\n  {\n    DerivedIA IC;\n    unique(CS,C,IAC,IC);\n  }\n  const int nia = (IAC.array()<A.size()).count();\n  IA.resize(nia);\n  IB.resize(IAC.size() - nia);\n  {\n    int ka = 0;\n    int kb = 0;\n    for(int i = 0;i<IAC.size();i++)\n    {\n      if(IAC(i)<A.size())\n      {\n        IA(ka++) = IAC(i);\n      }else\n      {\n        IB(kb++) = IAC(i)-A.size();\n      }\n    }\n    assert(ka == IA.size());\n    assert(kb == IB.size());\n  }\n\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::setunion<Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/setunion.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_SETUNION_H\n#define IGL_SETUNION_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Union of elements of matrices (like matlab's `union`)\n  //\n  // Inputs:\n  //   A  m-long vector of indices\n  //   B  n-long vector of indices\n  // Outputs:\n  //   C  (k>=m)-long vector of unique elements appearing in A and/or B\n  //   IA  (<k>=m)-long list of indices into A so that C = sort([A(IA);B(IB)])\n  //   IB  (<k>=m)-long list of indices into B so that C = sort([A(IA);B(IB)])\n  //\n  template <\n    typename DerivedA,\n    typename DerivedB,\n    typename DerivedC,\n    typename DerivedIA,\n    typename DerivedIB>\n  IGL_INLINE void setunion(\n    const Eigen::DenseBase<DerivedA> & A,\n    const Eigen::DenseBase<DerivedB> & B,\n    Eigen::PlainObjectBase<DerivedC> & C,\n    Eigen::PlainObjectBase<DerivedIA> & IA,\n    Eigen::PlainObjectBase<DerivedIB> & IB);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"setunion.cpp\"\n#endif\n#endif\n\n\n"
  },
  {
    "path": "libs/libigl/include/igl/setxor.cpp",
    "content": "#include \"setxor.h\"\n#include \"setdiff.h\"\n#include \"setunion.h\"\n#include \"slice.h\"\n\ntemplate <\n  typename DerivedA,\n  typename DerivedB,\n  typename DerivedC,\n  typename DerivedIA,\n  typename DerivedIB>\nIGL_INLINE void igl::setxor(\n  const Eigen::DenseBase<DerivedA> & A,\n  const Eigen::DenseBase<DerivedB> & B,\n  Eigen::PlainObjectBase<DerivedC> & C,\n  Eigen::PlainObjectBase<DerivedIA> & IA,\n  Eigen::PlainObjectBase<DerivedIB> & IB)\n{\n  DerivedC AB,BA;\n  DerivedIA IAB,IBA;\n  setdiff(A,B,AB,IAB);\n  setdiff(B,A,BA,IBA);\n  setunion(AB,BA,C,IA,IB);\n  slice(IAB,DerivedIA(IA),IA);\n  slice(IBA,DerivedIB(IB),IB);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::setxor<Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> > const&, Eigen::DenseBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/setxor.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_SETXOR_H\n#define IGL_SETXOR_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Set xor of elements of matrices\n  //\n  // Inputs:\n  //   A  m-long vector of indices\n  //   B  n-long vector of indices\n  // Outputs:\n  //   C  (k<=m)-long vector of unique elements appearing in A but not in B or\n  //     B but not in A\n  //   IA  (<k<=m)-long list of indices into A so that C = sort([A(IA);B(IB)])\n  //   IB  (<k<=m)-long list of indices into B so that C = sort([A(IA);B(IB)])\n  //\n  template <\n    typename DerivedA,\n    typename DerivedB,\n    typename DerivedC,\n    typename DerivedIA,\n    typename DerivedIB>\n  IGL_INLINE void setxor(\n    const Eigen::DenseBase<DerivedA> & A,\n    const Eigen::DenseBase<DerivedB> & B,\n    Eigen::PlainObjectBase<DerivedC> & C,\n    Eigen::PlainObjectBase<DerivedIA> & IA,\n    Eigen::PlainObjectBase<DerivedIB> & IB);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"setxor.cpp\"\n#endif\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/shine_textures.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_SHINE_TEXTURES_H\n#define IGL_SHINE_TEXTURES_H\nnamespace igl\n{\n  const uint8_t SHINE_TEXTURE_0[16384] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,36,0,0,0,0,0,0,0,0,0,0,0,0,7,20,15,7,0,0,0,0,0,0,0,0,0,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,20,36,36,0,0,0,0,0,0,0,0,0,0,0,0,20,20,15,12,20,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,36,28,36,36,0,0,0,0,0,0,0,0,0,0,0,12,28,20,12,20,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,39,28,31,28,0,0,0,0,0,0,0,0,0,0,0,28,28,20,15,28,28,12,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,44,31,36,28,0,0,0,0,0,0,0,0,0,0,15,31,28,20,36,36,20,0,0,0,0,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,36,20,0,0,0,0,0,0,0,0,12,12,7,12,12,47,47,44,44,36,0,0,0,0,0,0,0,0,0,0,31,36,28,28,44,28,12,0,0,0,12,23,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,36,0,0,0,0,0,0,0,0,15,15,15,20,20,47,47,44,44,23,0,0,0,0,0,0,7,12,7,20,36,36,28,44,39,20,0,0,0,0,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,39,23,0,0,0,0,0,0,0,12,15,12,12,12,47,47,44,44,15,0,0,0,0,0,0,12,12,12,36,36,36,44,52,28,7,0,0,7,20,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,44,39,7,0,0,0,0,0,0,12,20,20,0,0,47,47,47,47,7,0,0,0,0,0,12,15,15,23,36,44,44,60,44,20,0,0,0,28,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,44,28,0,0,0,0,0,0,12,23,23,12,12,52,52,52,52,0,0,0,0,0,0,20,23,23,39,47,47,60,60,28,0,0,0,28,44,23,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,44,44,12,0,0,0,0,0,0,28,31,31,23,52,60,52,52,0,0,0,0,0,0,28,28,36,44,60,55,68,44,12,0,0,28,44,28,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,52,36,0,0,0,0,0,0,31,39,52,36,60,68,52,52,0,0,0,0,0,20,28,36,44,60,63,76,60,23,0,0,23,47,36,12,0,0,0,0,0,0,0,0,0,0,0,12,23,23,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,52,52,20,0,0,15,15,0,36,44,60,36,71,76,55,52,0,0,0,0,0,31,36,44,52,71,76,76,36,0,0,23,47,39,12,0,7,12,0,0,0,0,0,0,0,7,20,28,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,52,39,0,0,20,20,12,36,55,92,39,79,100,68,60,0,0,0,0,20,36,47,52,76,84,92,60,20,0,20,47,44,20,0,12,20,15,0,0,0,0,0,0,20,28,28,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,52,55,20,0,20,23,20,31,79,111,44,84,127,84,55,0,0,0,0,36,39,60,68,92,92,79,28,0,20,47,52,23,0,0,12,20,7,0,0,0,0,20,36,36,31,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,7,0,0,0,0,0,0,0,31,60,47,0,7,28,28,20,84,116,52,100,164,100,52,0,0,0,12,44,60,63,92,103,100,52,7,20,47,60,28,0,12,15,7,7,0,0,0,15,36,47,44,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,7,0,0,0,12,12,7,0,0,0,0,0,7,52,60,28,0,28,28,20,84,119,79,119,188,116,44,0,0,0,36,44,76,76,111,108,76,20,12,44,60,31,12,20,28,12,0,0,0,12,36,52,52,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,15,7,0,0,0,0,20,20,12,0,0,0,12,20,7,0,0,0,0,0,28,63,52,0,28,36,28,76,116,100,124,188,116,36,0,0,7,47,68,79,108,119,100,36,12,44,68,36,20,28,39,23,0,0,7,31,60,68,52,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,15,20,20,12,0,0,12,15,23,20,12,0,0,20,23,12,0,0,0,0,0,55,68,31,12,39,39,76,119,132,127,180,100,28,0,0,28,55,92,95,140,124,68,20,44,68,44,28,31,44,28,7,0,20,52,76,71,52,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,20,28,20,12,0,0,20,36,31,15,0,7,23,28,12,0,0,0,0,28,68,60,12,44,44,71,116,151,140,175,100,20,0,7,55,84,108,140,148,100,36,44,71,52,36,36,47,28,0,12,39,76,87,71,39,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,31,23,12,0,20,36,39,28,7,12,28,36,20,0,0,0,0,55,71,39,36,44,76,116,167,156,180,100,15,12,39,76,111,127,167,132,60,44,76,60,44,44,52,28,7,28,68,92,92,63,28,0,0,7,15,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,36,36,20,7,12,31,44,36,15,12,28,36,20,0,0,0,28,71,68,36,52,76,119,172,180,188,108,20,28,76,108,140,172,164,103,60,76,68,52,52,52,28,20,52,95,108,84,47,12,0,12,20,20,15,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,39,39,23,15,28,47,44,28,20,36,44,23,12,12,12,55,76,52,60,76,124,164,188,180,100,20,60,103,143,164,183,132,92,87,84,68,60,52,31,36,84,116,108,76,28,7,15,28,23,20,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,44,44,39,28,28,44,52,36,28,36,52,36,28,20,36,76,76,84,84,148,175,207,172,100,36,108,140,175,191,164,124,108,100,76,68,52,44,60,100,124,100,52,20,20,31,28,28,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,36,52,52,44,39,44,60,52,44,44,60,47,39,28,68,84,108,100,172,196,228,167,108,76,156,188,204,196,156,132,124,92,76,60,60,84,116,116,84,52,31,36,36,31,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,44,55,55,52,55,60,60,55,60,71,68,52,52,84,108,127,188,220,239,164,116,119,188,228,212,188,156,140,111,84,71,79,100,124,111,84,63,52,44,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,31,52,60,68,68,76,71,76,84,87,79,63,84,100,148,188,236,252,172,140,164,220,236,212,180,164,132,100,87,100,116,132,124,100,84,68,52,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,0,0,0,0,0,12,39,60,68,84,92,87,92,100,108,95,87,108,148,191,244,252,183,172,212,244,236,212,188,148,124,108,116,135,151,140,111,87,68,44,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,20,28,28,20,0,0,0,20,52,68,84,108,111,116,116,132,116,124,148,204,239,252,204,199,244,252,236,215,172,148,135,143,156,164,140,108,87,68,44,20,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,28,36,36,39,31,12,0,28,63,95,127,140,143,143,164,156,164,212,244,252,228,228,252,252,244,212,188,167,180,180,156,124,108,92,60,36,28,20,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,31,36,39,44,47,52,44,44,63,100,140,167,191,204,204,212,223,252,252,244,244,252,252,244,228,212,204,183,156,132,108,68,44,36,36,31,23,20,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,47,52,55,60,76,100,132,156,188,228,244,239,244,252,252,252,252,252,252,252,244,228,204,164,116,79,68,79,76,60,44,31,20,20,12,7,0,0,0,0,7,15,15,7,0,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,55,60,68,87,132,180,228,244,252,252,252,252,252,252,252,252,252,244,212,172,143,135,127,108,87,76,68,68,68,68,68,60,55,52,68,68,60,55,52,47,39,28,36,36,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,0,0,0,0,0,0,0,0,0,0,0,15,28,28,28,28,28,28,28,23,20,15,15,15,15,15,15,15,15,12,20,44,68,79,103,164,220,244,252,252,252,252,252,252,252,252,244,223,204,191,180,172,180,180,172,151,135,132,132,127,124,116,108,124,119,108,95,92,76,60,44,39,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,0,0,0,0,0,0,0,0,0,0,31,68,84,84,84,84,84,84,92,92,92,84,84,84,84,84,92,95,100,92,87,84,87,103,140,188,228,244,252,252,252,252,252,252,252,252,239,212,191,191,180,159,140,124,124,124,124,132,132,124,111,100,84,87,76,60,52,52,47,47,39,28,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,47,52,52,52,52,52,52,60,63,68,68,68,71,84,95,116,132,148,159,172,188,207,223,231,244,247,252,252,252,252,252,252,252,252,252,244,220,172,132,108,92,84,76,60,44,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,31,44,63,71,76,76,76,84,103,132,156,164,172,167,172,196,228,244,252,252,252,252,252,252,252,252,252,252,244,220,188,159,132,100,76,55,47,44,39,36,36,28,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,0,28,44,44,52,52,71,84,103,127,140,148,143,140,132,119,132,148,172,196,228,244,252,252,244,244,252,252,252,239,220,223,244,244,223,204,183,164,140,127,108,84,60,39,36,28,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,0,28,47,55,84,100,111,100,92,79,71,68,68,71,84,87,100,140,196,228,236,236,252,228,220,228,247,247,252,239,212,183,188,212,228,228,228,223,196,159,124,92,68,63,60,44,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,36,52,52,52,52,60,60,60,60,55,39,28,36,52,71,108,164,204,215,207,212,236,244,188,180,212,239,236,236,247,212,167,132,140,164,188,191,188,188,180,167,164,148,116,84,63,60,52,44,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,44,44,44,47,52,52,52,52,44,28,7,0,12,28,44,60,92,124,151,188,188,172,175,204,228,215,148,156,220,236,212,212,236,220,180,127,92,92,103,132,151,148,140,151,148,132,132,148,140,111,76,60,52,52,47,39,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,36,36,36,39,44,44,44,44,36,15,0,0,0,0,12,28,36,44,71,92,108,140,172,164,140,148,180,204,215,164,108,148,239,244,188,188,204,204,188,156,108,68,63,68,87,111,119,108,100,124,140,132,108,111,124,124,103,71,52,44,44,44,39,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,20,23,28,31,36,36,36,36,20,0,0,0,0,0,0,0,12,23,28,36,60,71,76,100,148,164,135,108,111,156,180,196,183,108,84,164,252,252,183,164,175,196,180,172,140,92,60,39,44,68,79,95,100,84,68,87,116,124,116,103,103,103,100,84,63,44,39,36,36,36,31,28,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,12,20,23,28,23,12,0,0,0,0,0,0,0,0,0,0,0,15,23,44,52,52,71,108,135,140,116,84,84,132,156,164,188,148,52,84,180,252,252,196,140,148,188,164,172,164,108,76,60,31,20,44,68,76,79,76,68,52,60,79,100,108,103,108,103,95,84,63,52,39,36,31,31,23,20,12,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,36,39,52,76,100,116,116,87,55,68,116,127,127,172,175,95,20,100,204,252,252,220,132,116,172,156,140,156,140,84,63,55,31,12,12,44,68,68,68,60,52,44,44,52,68,87,95,100,100,92,84,68,47,31,28,23,20,12,20,12,15,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,36,60,71,92,100,92,52,39,52,100,116,108,143,188,140,44,20,119,220,252,252,236,140,92,132,167,124,116,143,119,68,52,52,31,12,0,20,44,63,63,55,44,36,36,36,36,44,55,76,84,87,84,76,71,63,44,20,7,12,12,15,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,28,36,52,71,84,84,63,28,28,44,84,103,87,108,167,167,84,7,36,140,236,252,244,228,148,76,87,156,132,100,111,135,103,52,39,44,31,12,0,0,20,47,60,60,47,31,23,31,28,28,28,28,36,52,68,71,68,68,60,52,36,12,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,36,52,60,71,60,36,12,20,36,76,92,79,76,127,172,116,28,0,60,151,236,231,220,204,143,68,52,116,156,100,79,116,124,84,39,28,39,28,12,0,0,0,28,52,60,55,39,20,12,20,28,20,20,12,0,12,36,55,60,55,52,44,36,23,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,36,52,63,55,39,12,0,12,36,60,84,76,60,87,151,132,60,0,0,68,148,220,212,204,188,148,68,31,79,140,119,79,68,116,108,68,28,20,28,23,12,0,0,0,0,28,52,52,52,36,12,0,12,20,12,0,0,0,0,7,28,44,44,39,36,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,52,52,39,20,0,0,12,28,52,71,76,44,55,116,143,87,20,0,0,76,143,196,196,183,183,143,76,28,52,100,132,87,52,68,116,95,52,20,12,20,12,0,0,0,0,0,7,28,47,47,44,28,7,0,0,0,0,0,0,0,0,0,0,20,28,28,20,15,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,44,52,39,20,0,0,0,7,23,39,60,71,44,28,76,132,103,44,0,0,12,71,132,183,188,156,167,140,84,44,23,76,116,95,60,44,79,108,84,44,15,0,0,12,12,0,0,0,0,0,12,28,44,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,7,12,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,44,44,23,0,0,0,0,7,20,28,52,68,44,12,44,100,116,68,12,0,0,20,71,132,167,172,132,140,116,100,52,0,55,79,100,71,36,39,84,100,68,36,12,0,12,12,0,0,0,0,0,0,0,12,31,44,39,31,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,44,31,12,0,0,0,0,0,12,20,44,63,44,12,20,63,108,84,36,0,0,0,12,60,124,148,164,124,119,100,108,52,0,28,68,92,76,60,20,52,92,84,52,20,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,36,36,20,0,0,0,0,0,0,0,12,36,60,47,15,0,44,87,92,52,7,0,0,0,20,60,124,140,156,116,100,92,108,47,15,0,55,68,76,60,36,15,60,92,68,36,15,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,31,28,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,23,12,0,0,0,0,0,0,0,0,23,52,47,20,0,28,63,95,68,28,0,0,0,0,20,52,135,135,148,111,84,100,108,47,36,0,36,60,68,52,47,20,20,68,84,52,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,28,28,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,20,12,0,0,0,0,0,0,0,0,0,20,47,52,20,0,12,44,84,76,44,0,0,0,0,0,23,44,124,116,108,108,71,108,92,52,44,0,7,55,60,47,44,36,0,28,76,79,52,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,23,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,7,0,0,0,0,0,0,0,0,0,0,15,44,52,23,0,0,36,60,84,55,20,0,0,0,0,0,28,44,108,87,76,103,68,108,71,60,44,0,0,36,55,52,36,44,20,0,39,79,68,36,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,7,0,0,0,0,0,0,0,0,0,0,12,36,52,28,0,0,20,44,76,63,36,0,0,0,0,0,0,28,52,76,68,55,100,68,108,60,71,44,7,0,12,52,52,31,36,36,0,0,52,84,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,7,28,47,28,0,0,12,36,60,68,52,12,0,0,0,0,0,0,15,52,63,55,44,92,63,100,52,84,36,23,0,0,36,52,36,28,36,20,0,12,60,79,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,44,28,0,0,0,28,44,63,52,28,0,0,0,0,0,0,0,12,60,52,47,39,79,60,84,52,76,36,36,0,0,12,52,47,20,28,28,7,0,23,68,76,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,28,7,0,0,12,36,52,55,44,7,0,0,0,0,0,0,7,20,68,47,44,36,68,60,68,47,60,31,31,0,0,0,36,47,28,15,28,20,0,0,31,68,63,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,20,7,0,0,0,28,36,52,44,20,0,0,0,0,0,0,0,0,12,60,47,36,28,52,52,44,47,52,28,28,0,0,0,15,44,44,12,20,20,0,0,0,36,76,52,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,20,0,0,0,0,15,28,44,44,36,0,0,0,0,0,0,0,0,0,0,52,47,23,28,52,47,31,47,44,28,20,7,0,0,0,36,44,20,7,20,12,0,0,7,47,76,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,28,12,0,0,0,0,20,28,44,39,15,0,0,0,0,0,0,0,0,0,0,44,44,12,28,47,44,28,47,44,36,20,15,0,0,0,20,39,36,0,12,12,12,0,0,15,52,68,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,12,0,0,0,0,12,20,31,36,28,0,0,0,0,0,0,0,0,0,0,0,44,39,0,28,47,52,36,52,44,36,12,12,0,0,0,0,36,36,15,0,12,12,0,0,0,20,60,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,12,15,20,36,36,12,0,0,0,0,0,0,0,0,0,0,0,39,39,0,23,44,47,28,52,39,39,12,12,0,0,0,0,20,36,28,0,0,0,0,0,0,0,28,55,44,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,15,20,28,31,20,0,0,0,0,0,0,0,0,0,0,0,12,36,36,0,20,36,44,20,44,36,36,7,7,0,0,0,0,0,31,36,12,0,0,0,0,0,0,0,31,52,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,15,12,0,0,0,0,0,0,12,20,28,28,0,0,0,0,0,0,0,0,0,0,0,0,23,36,36,0,15,36,28,12,20,28,28,0,7,0,0,0,0,0,20,31,23,0,0,0,0,0,0,0,7,31,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,7,7,23,28,15,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,0,15,36,15,0,0,28,28,0,0,0,0,0,0,0,0,28,28,0,0,0,0,0,0,0,0,12,31,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,15,20,15,0,15,36,23,0,0,23,23,7,0,0,0,0,0,0,0,20,28,20,0,0,0,0,0,0,0,0,12,23,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,23,23,15,0,12,28,28,12,12,31,31,20,0,0,0,0,0,0,0,7,28,23,0,0,0,0,0,0,0,0,0,7,20,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,12,0,0,28,28,20,20,23,23,20,0,0,0,0,0,0,0,0,20,20,12,0,0,0,0,0,0,0,0,0,12,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,20,20,7,7,15,20,20,0,0,0,0,0,0,0,0,7,20,20,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,23,20,0,0,12,28,28,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,28,20,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,0,0,0,31,28,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,0,0,0,20,12,0,0,0,15,15,7,0,0,0,0,0,0,0,0,0,0,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};\n  const uint8_t SHINE_TEXTURE_1[16384] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,20,20,7,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,12,12,0,0,0,0,12,12,12,0,0,0,0,0,0,0,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,20,20,15,0,0,0,0,12,12,0,0,0,0,12,12,0,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,12,20,20,0,0,0,0,12,15,15,0,0,12,20,20,0,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,12,0,20,20,0,0,0,0,28,31,28,0,0,0,12,12,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,0,20,20,0,0,0,12,36,44,28,0,0,0,0,0,12,28,28,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,0,28,28,20,0,0,20,47,60,28,0,0,7,7,0,20,20,20,0,0,0,0,0,0,0,0,0,0,0,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,12,28,31,28,0,0,15,44,68,36,0,0,20,20,12,20,20,12,0,0,0,0,0,0,0,0,0,0,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,15,36,36,0,0,12,44,68,36,0,0,28,28,12,23,23,12,0,0,0,12,12,0,0,0,0,12,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,7,36,36,0,0,0,44,68,36,0,0,23,23,0,28,28,0,0,0,0,12,7,0,0,0,0,20,23,12,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,12,0,0,0,0,0,0,12,7,0,0,0,0,0,0,0,28,31,15,36,36,12,0,0,28,60,36,0,0,20,20,12,28,28,0,0,0,12,12,0,0,0,0,12,28,23,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,31,28,7,0,0,0,0,0,12,12,0,0,0,0,0,0,0,23,36,28,36,36,28,0,0,28,60,36,0,0,20,20,28,36,36,0,0,0,20,20,0,0,0,0,28,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,36,23,12,0,0,0,0,0,15,12,0,0,0,0,0,0,12,36,36,36,44,39,0,0,44,52,20,0,12,36,36,36,36,36,0,0,15,20,20,0,0,0,15,28,23,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,39,28,12,0,0,0,0,15,15,0,0,0,0,0,0,0,36,36,31,44,44,0,12,52,60,28,0,28,36,36,39,39,20,0,0,28,28,12,0,0,0,28,31,12,0,0,0,0,0,0,0,12,20,15,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,36,44,44,28,7,0,0,0,7,20,12,0,0,0,0,0,0,36,39,36,44,44,0,0,52,84,55,12,44,39,39,44,44,7,0,0,28,28,0,0,0,20,36,28,0,0,0,0,0,0,0,12,31,28,12,0,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,36,44,39,31,20,0,0,0,12,20,12,0,0,0,0,0,20,44,44,47,44,20,0,52,92,71,15,47,31,39,44,44,0,0,20,31,28,0,0,7,36,36,12,0,0,0,0,0,0,12,36,44,20,7,20,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,28,52,52,36,20,7,0,12,28,28,0,0,0,0,0,0,44,44,55,52,36,12,60,100,84,12,52,36,55,44,44,0,0,31,36,12,0,0,28,39,28,0,0,0,0,0,0,7,28,52,28,12,20,31,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,44,63,52,44,28,0,0,20,36,23,0,0,0,0,0,44,44,63,52,52,23,76,108,87,0,52,44,76,47,44,0,12,36,36,0,0,12,44,44,12,0,0,0,0,0,7,36,52,36,20,20,31,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,60,76,68,52,28,7,0,36,36,12,0,0,0,0,31,47,63,52,52,20,68,124,108,0,44,44,76,52,36,0,28,44,36,0,0,28,44,28,0,0,0,0,0,0,36,60,44,20,20,31,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,68,79,71,52,28,7,20,44,36,0,0,0,0,12,52,55,60,52,28,63,140,116,0,47,47,68,52,20,0,44,44,20,0,12,44,44,12,0,0,0,0,0,36,68,52,28,23,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,60,76,87,84,60,28,12,44,52,28,0,0,0,0,52,52,79,55,44,60,143,124,0,52,55,60,52,0,12,44,44,0,0,36,52,28,0,0,0,0,0,36,76,71,44,36,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,68,92,95,92,60,20,28,60,52,12,0,0,0,44,52,92,55,71,71,159,124,0,52,71,60,52,0,36,47,39,0,20,52,47,12,0,0,0,0,31,76,84,55,36,44,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,79,103,108,100,60,20,52,68,39,0,0,0,20,55,92,60,71,68,164,119,20,60,92,60,55,0,47,52,20,0,44,55,28,0,0,0,0,28,79,92,68,44,47,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,44,84,116,116,108,60,36,68,68,20,0,0,0,60,76,76,68,68,164,124,47,76,108,60,47,15,52,52,0,23,60,52,7,0,0,0,23,76,100,76,52,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,52,100,132,140,108,52,55,76,52,0,0,0,52,63,103,63,92,172,140,76,92,119,60,36,39,52,44,0,52,60,28,0,0,0,20,71,103,87,63,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,63,108,148,156,108,60,71,76,28,0,0,36,60,119,63,116,180,159,92,92,124,60,23,55,60,20,28,63,52,0,0,0,20,68,108,92,68,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,76,124,172,167,103,68,76,60,12,0,12,63,116,76,127,172,172,111,108,116,63,28,60,60,12,55,68,28,0,0,15,63,108,103,76,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,84,148,196,167,100,84,79,44,0,0,60,100,103,124,156,180,127,127,116,68,47,60,44,36,68,52,0,0,12,60,108,111,84,55,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,100,180,212,164,100,92,76,20,0,44,84,132,124,156,188,140,148,108,68,60,63,36,60,68,28,0,20,68,108,119,95,60,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,132,212,220,151,108,92,55,0,20,76,140,124,172,196,148,159,100,76,68,63,47,71,52,0,20,76,119,132,108,68,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,60,148,220,212,156,124,87,31,0,68,148,148,183,199,175,180,100,87,68,68,68,71,28,20,76,124,143,119,76,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,68,159,223,212,167,124,68,12,60,135,164,191,199,204,196,108,87,76,76,76,52,20,71,132,159,132,76,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,71,167,228,212,172,111,44,36,124,183,207,212,228,191,127,79,92,79,76,44,71,140,167,140,84,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,7,0,0,15,84,180,223,212,164,92,36,100,180,220,220,231,183,148,84,116,92,84,79,156,196,156,84,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,23,12,0,20,92,188,220,220,151,68,84,172,239,236,244,204,164,108,124,116,108,156,212,180,95,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,15,31,36,23,7,28,100,191,236,212,127,84,148,236,244,252,228,172,143,132,151,164,212,191,108,31,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,20,20,20,12,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,20,20,28,36,44,39,23,36,111,199,239,188,111,135,223,252,252,236,183,172,180,188,207,188,108,31,0,0,0,0,15,20,15,7,0,0,0,0,0,0,0,0,12,20,20,12,7,20,28,44,44,39,36,28,23,20,20,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,28,31,20,0,0,0,0,0,12,20,28,28,39,44,52,52,39,52,124,204,228,156,143,196,252,252,236,212,204,220,215,188,108,31,0,0,12,28,28,23,20,12,0,0,0,0,0,20,31,36,36,44,60,63,60,52,52,44,44,36,36,36,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,28,36,39,44,44,44,28,7,0,0,20,28,36,44,68,76,68,60,76,140,212,204,172,188,247,252,236,236,231,236,188,108,31,0,20,39,44,36,28,15,0,0,7,28,44,52,60,76,84,92,87,84,76,63,52,44,44,44,36,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,31,39,44,47,60,71,76,76,60,36,23,28,39,47,68,92,100,92,111,172,212,207,212,244,252,247,247,236,188,103,44,36,52,52,44,39,28,20,36,60,79,100,116,124,108,103,100,92,76,60,52,47,44,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,68,76,84,84,84,84,84,76,76,76,76,100,132,143,164,204,223,236,244,252,252,236,188,116,84,76,76,68,68,71,76,92,111,124,132,132,132,124,116,84,68,60,52,36,23,20,15,12,0,12,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,68,84,84,84,84,87,100,127,143,156,172,196,215,236,252,252,252,244,212,159,132,140,148,148,132,119,119,124,132,140,148,143,135,119,108,92,71,52,44,31,36,44,44,39,28,23,39,52,47,44,44,44,55,60,52,55,52,36,23,28,47,39,28,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,68,84,92,100,108,132,172,212,244,247,252,252,252,244,215,196,207,228,212,196,196,204,204,196,188,175,164,148,143,143,148,148,140,140,140,116,108,108,103,100,84,76,76,79,68,60,60,60,60,60,55,55,52,36,23,28,47,39,28,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,12,12,12,20,20,20,20,20,44,60,76,76,76,76,76,76,76,76,76,76,76,71,68,68,76,76,84,92,92,92,92,92,92,92,92,92,92,92,100,111,132,156,180,199,223,244,252,252,252,252,247,244,244,252,247,247,252,247,231,204,175,156,156,156,159,164,167,164,151,132,116,108,84,76,68,68,71,71,68,63,63,60,60,60,55,52,52,44,44,36,23,12,7,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,12,12,12,20,23,23,20,20,20,39,60,68,68,68,76,84,92,92,100,103,108,135,159,167,172,172,164,156,164,180,180,175,172,164,164,156,151,151,156,172,188,204,220,236,244,247,252,252,252,252,252,252,252,252,252,247,244,239,220,188,164,124,92,63,44,28,28,20,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,23,28,36,39,68,92,100,100,100,84,68,68,84,84,79,76,84,100,116,124,127,124,127,148,175,204,220,228,236,252,252,252,252,252,252,252,252,247,244,228,199,164,135,124,108,92,68,52,44,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,12,7,0,0,0,12,31,52,60,68,68,68,68,76,100,132,164,172,164,164,183,215,236,244,244,244,252,252,252,252,252,239,212,196,188,188,172,140,108,79,60,52,47,44,36,36,28,20,20,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,44,52,55,60,60,60,63,68,71,92,116,132,132,116,108,111,135,156,183,215,236,220,215,239,252,252,252,252,252,239,220,191,164,148,148,135,108,68,28,12,20,28,36,36,28,20,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,44,44,47,52,52,52,52,55,60,60,60,60,76,92,100,100,100,100,92,95,111,132,164,212,236,196,175,204,244,252,252,252,252,252,252,228,196,164,140,132,143,156,143,116,76,36,12,0,0,0,0,0,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,36,36,39,44,44,44,47,52,52,44,28,15,23,44,68,84,100,100,100,87,63,52,76,108,140,164,199,220,188,140,156,215,228,236,252,252,252,252,252,231,215,196,151,103,92,116,143,164,159,140,100,60,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,20,20,23,28,28,36,36,39,44,36,20,0,0,0,20,36,52,60,68,76,92,84,63,31,20,47,100,127,140,156,180,204,183,116,116,167,220,188,212,252,252,252,252,252,236,204,196,188,156,92,52,60,92,135,164,172,156,124,84,44,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,15,20,20,23,23,20,12,0,0,0,0,0,20,36,44,47,52,55,60,52,39,23,7,0,36,84,124,132,127,132,164,196,175,100,71,135,183,188,143,188,244,236,236,236,236,252,223,188,164,172,156,100,39,20,39,79,124,156,172,159,132,95,60,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,0,7,0,0,0,0,0,0,0,12,28,36,36,44,44,44,39,20,12,0,0,0,23,68,116,140,124,100,103,148,191,167,95,44,87,180,172,148,127,167,228,220,220,199,220,247,247,212,164,143,156,156,108,44,0,0,28,63,100,140,159,156,116,84,55,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,28,28,31,36,36,28,12,0,0,0,0,0,12,47,95,132,132,100,68,87,140,172,148,92,28,44,127,180,148,108,132,156,212,204,204,164,191,228,252,247,207,148,116,148,148,108,44,0,0,0,15,52,79,108,132,132,108,76,52,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,28,28,28,28,20,12,0,0,0,0,0,0,0,31,79,116,124,108,68,44,79,132,159,127,84,28,20,76,156,140,127,84,116,132,180,196,188,151,148,191,244,252,244,204,132,100,124,132,100,47,15,0,0,0,12,31,60,79,100,108,95,68,44,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,15,23,23,20,0,0,0,0,0,0,0,0,0,20,55,92,119,108,68,28,20,68,132,148,116,68,28,0,44,108,159,108,100,76,84,100,140,180,180,148,100,156,220,252,252,244,196,119,76,95,116,103,60,20,0,0,0,0,0,28,44,63,76,84,76,52,36,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,7,0,0,0,0,0,0,0,0,0,0,12,39,71,100,100,79,36,12,15,68,116,119,84,44,20,0,20,76,140,132,87,84,76,52,76,103,148,172,143,71,108,172,244,252,252,244,196,108,60,76,108,100,68,28,0,0,0,0,0,0,15,36,52,60,68,68,47,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,60,79,92,76,44,15,0,15,60,108,111,68,28,0,0,0,52,95,135,100,68,71,71,44,76,84,127,172,151,79,55,127,204,236,244,252,244,188,100,52,55,92,92,71,36,12,0,0,0,0,0,0,12,28,44,52,55,55,36,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,68,84,76,52,20,0,0,20,55,92,92,68,36,7,0,0,28,68,116,103,63,60,68,60,44,76,76,100,151,159,92,23,79,156,215,228,244,244,228,164,84,36,44,84,87,71,39,20,0,0,0,0,0,0,0,0,20,36,36,39,44,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,52,68,68,52,28,12,0,0,20,52,79,71,47,36,20,0,0,0,52,84,108,76,28,63,68,44,44,76,68,63,108,151,103,20,36,108,180,212,223,231,212,188,135,63,28,36,68,76,68,44,23,0,0,0,0,0,0,0,0,0,12,28,31,31,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,39,60,68,52,31,12,0,0,0,23,55,68,52,28,20,12,0,0,0,28,63,100,84,55,12,68,68,20,44,68,55,39,71,148,119,28,7,60,132,180,196,212,199,172,151,116,52,20,28,52,68,68,47,28,7,0,0,0,0,0,0,0,0,0,12,20,28,28,20,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,44,55,52,36,20,0,0,0,0,28,52,60,36,12,12,7,0,0,0,12,52,76,92,68,28,20,63,63,0,44,60,31,20,47,132,127,44,0,20,84,140,172,196,204,172,143,127,100,44,12,20,44,60,60,47,28,12,0,0,0,0,0,0,0,0,0,0,0,12,20,20,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,31,44,44,36,20,7,0,0,0,0,28,52,52,28,0,0,0,0,0,0,0,36,60,79,68,52,0,44,63,55,0,44,60,15,0,20,103,124,60,0,0,39,100,148,172,191,180,140,116,108,92,44,12,12,36,47,44,39,23,7,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,20,31,28,28,20,12,0,0,0,0,0,28,52,44,20,0,0,0,0,0,0,0,12,52,60,76,63,28,0,55,60,36,0,47,60,20,7,0,76,116,76,7,0,12,68,124,143,172,183,148,111,100,100,84,36,0,7,20,31,36,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,28,28,20,12,0,0,0,0,0,0,7,28,52,36,15,0,0,0,0,0,0,0,0,36,52,68,63,55,0,0,60,60,12,0,52,60,23,15,0,60,103,84,23,0,0,36,92,124,143,172,164,116,84,87,87,76,28,0,0,12,20,15,20,20,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,12,7,0,0,0,0,0,0,12,31,52,31,12,0,0,0,0,0,0,0,0,20,52,52,68,60,31,0,20,60,60,0,0,52,60,23,20,0,44,84,92,31,0,0,7,60,103,116,148,164,140,87,68,76,76,63,23,0,0,0,0,7,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,44,28,7,0,0,0,0,0,0,0,0,0,36,47,52,60,52,0,0,36,55,52,0,0,52,52,12,12,0,20,68,84,28,0,0,0,28,76,108,111,148,156,108,68,60,68,71,60,23,0,0,0,0,0,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,39,23,0,0,0,0,0,0,0,0,0,0,20,44,39,52,55,36,0,0,52,52,36,0,0,52,52,0,0,0,0,55,76,28,0,0,0,0,47,92,92,116,140,132,76,52,52,68,68,44,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,31,36,20,0,0,0,0,0,0,0,0,0,0,0,36,44,36,52,52,12,0,0,52,52,12,0,0,52,52,0,0,0,0,52,68,44,7,0,0,0,28,68,92,84,119,132,100,60,44,44,63,47,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,28,12,0,0,0,0,0,0,0,0,0,0,0,20,39,28,44,52,36,0,0,12,52,52,0,0,0,52,52,0,0,0,0,44,60,52,0,0,0,0,0,44,76,76,92,116,111,68,36,28,36,44,28,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,23,20,12,0,0,0,0,0,0,0,0,0,0,0,7,36,36,28,52,52,12,0,0,36,47,44,0,0,0,47,47,0,0,0,0,28,52,52,0,0,0,0,0,20,52,79,68,87,108,87,44,28,28,36,44,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,23,36,20,31,47,36,0,0,0,44,47,28,0,0,0,44,44,0,0,0,0,7,47,47,0,0,0,0,0,0,36,63,68,68,84,92,63,36,20,20,36,52,44,23,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,31,15,44,44,15,0,0,0,44,44,12,0,0,0,44,44,0,0,0,0,0,44,44,12,0,0,0,0,0,15,44,68,52,63,76,76,39,20,20,28,31,44,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,31,15,23,44,36,0,0,0,12,44,44,0,0,0,0,44,44,0,0,0,0,0,44,44,28,0,0,0,0,0,0,36,52,60,52,60,71,55,28,20,12,20,28,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,23,7,39,44,20,0,0,0,28,39,36,0,0,0,0,44,44,0,0,0,0,0,28,44,39,0,0,0,0,0,0,12,36,60,44,52,60,68,44,20,12,12,15,15,12,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,12,20,39,36,0,0,0,0,36,39,28,0,0,0,0,39,39,0,0,0,0,0,12,39,39,0,0,0,0,0,0,0,28,44,52,36,44,52,52,20,7,0,0,0,12,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,20,0,31,36,20,0,0,0,0,36,36,12,0,0,0,0,36,36,0,0,0,0,0,0,36,36,0,0,0,0,0,0,0,12,36,52,39,36,39,44,31,12,0,0,0,15,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,0,12,36,31,0,0,0,0,12,36,36,0,0,0,0,0,28,28,0,0,0,0,0,0,36,36,20,0,0,0,0,0,0,0,20,36,44,28,36,36,36,15,0,0,0,0,12,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,0,0,28,36,20,0,0,0,0,15,28,28,0,0,0,0,0,12,12,0,0,0,0,0,0,28,36,28,0,0,0,0,0,0,0,12,28,44,36,31,31,36,28,7,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,12,31,31,0,0,0,0,0,23,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,20,31,31,0,0,0,0,0,0,0,0,20,28,36,23,28,28,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,20,28,20,0,0,0,0,0,23,23,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,0,0,0,0,0,0,0,0,0,23,31,28,20,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,0,0,0,0,0,0,0,0,0,12,23,28,15,15,12,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,20,0,0,0,0,0,12,20,20,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,20,20,12,0,0,0,0,0,0,0,0,0,20,20,20,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,23,0,0,0,0,0,0,20,20,12,0,0,0,0,0,0,28,28,0,0,0,0,0,0,0,12,20,20,0,0,0,0,0,0,0,0,0,12,20,20,15,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,28,28,0,0,0,0,0,0,0,7,20,20,0,0,0,0,0,0,0,0,0,0,12,15,12,7,0,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,7,0,0,0,0,0,0,15,15,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,7,12,12,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,7,0,0,0,0,0,0,12,20,20,0,0,0,0,0,0,0,0,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,15,20,20,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,7,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};\n  const uint8_t SHINE_TEXTURE_2[16384] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,0,0,0,0,0,0,0,7,7,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,15,15,0,0,0,0,0,0,0,0,7,23,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,7,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,15,15,0,0,0,0,0,0,0,0,20,28,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,15,0,0,0,0,0,0,12,12,0,0,0,0,28,28,12,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,28,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,23,12,0,0,0,0,0,12,12,0,0,0,0,20,23,20,0,0,0,0,12,12,0,0,7,7,0,0,0,0,0,0,0,15,28,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,20,0,0,0,0,0,12,15,12,0,0,0,15,23,23,0,0,0,0,28,28,0,0,20,20,0,0,0,0,0,0,0,28,31,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,15,0,0,0,0,0,20,20,0,0,0,12,23,23,0,0,0,0,36,36,0,20,28,28,0,0,0,0,12,12,12,36,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,28,7,0,0,0,0,28,28,12,0,0,0,28,28,0,0,0,0,36,36,0,20,20,20,0,0,0,7,12,12,28,36,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,31,20,0,0,0,0,20,28,23,0,0,0,28,28,12,0,0,0,36,36,0,23,28,20,0,0,0,20,20,20,36,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,36,12,0,0,0,0,28,28,0,0,0,36,36,28,0,0,0,36,36,0,36,36,23,0,0,0,15,15,28,39,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,28,0,0,0,0,28,36,20,0,0,28,44,44,0,0,0,36,36,0,36,36,12,0,0,0,12,12,36,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,28,39,20,0,0,0,20,36,31,0,0,20,44,52,12,0,0,36,36,0,36,36,0,0,0,12,20,28,44,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,20,12,0,0,0,12,44,39,12,0,0,0,36,36,12,0,0,44,52,12,0,0,36,36,0,39,39,0,0,0,20,20,39,44,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,15,0,0,0,0,28,44,28,0,0,0,36,39,28,0,0,44,60,28,0,0,36,36,7,44,44,0,0,7,31,36,52,47,20,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,12,28,20,0,0,0,12,44,44,20,0,0,20,44,39,0,0,44,71,55,12,0,44,44,20,44,44,0,0,20,36,55,52,47,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,15,12,0,0,0,0,0,0,0,0,0,0,20,36,20,0,0,0,28,52,39,0,0,0,44,44,15,0,39,68,68,15,0,52,52,31,44,44,0,0,36,36,68,52,31,0,0,12,12,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,12,12,0,0,0,0,0,0,0,0,0,28,39,20,0,0,0,44,52,28,0,0,31,44,36,0,28,68,76,20,0,60,60,44,52,52,0,0,36,52,60,52,12,0,12,20,12,0,0,0,0,0,0,0,0,0,20,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,15,0,0,0,0,0,0,0,0,7,31,39,20,0,0,20,52,47,12,0,12,52,47,0,12,76,92,44,0,60,60,47,52,47,0,23,44,76,52,44,0,0,28,28,7,0,0,0,0,0,0,0,0,20,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,28,23,12,0,0,0,0,0,0,0,12,36,44,20,0,0,36,55,36,0,0,47,52,23,0,68,100,60,0,60,60,52,60,36,7,44,52,84,55,23,0,20,28,20,0,0,0,0,0,0,0,7,28,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,31,20,0,0,0,0,0,0,0,20,44,44,15,0,15,52,55,20,0,31,52,44,0,60,108,84,0,60,60,52,68,36,20,52,76,71,55,0,12,36,31,0,0,0,0,0,0,0,12,28,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,36,28,7,0,0,0,0,0,0,31,52,39,12,0,36,60,44,0,12,55,55,12,52,116,108,23,60,63,55,76,31,39,60,100,60,44,0,28,36,20,0,0,0,0,0,0,12,36,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,44,36,15,0,0,0,0,12,28,52,60,36,7,12,52,60,28,0,52,60,36,36,124,127,44,60,76,60,84,36,60,79,108,60,15,20,44,36,0,0,0,0,0,0,20,39,44,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,44,44,28,0,0,0,12,23,44,55,60,36,0,28,68,55,12,28,60,55,20,116,140,68,60,87,68,92,52,79,103,92,55,12,39,44,15,0,0,0,0,0,20,44,44,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,52,36,12,0,0,12,28,52,68,60,31,7,52,68,39,12,60,60,28,100,135,84,68,108,87,108,87,100,124,76,36,36,52,31,0,0,0,0,0,28,52,47,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,52,44,23,0,0,12,36,63,76,60,28,23,68,68,20,52,63,47,84,135,100,79,124,108,132,116,124,124,68,39,60,52,12,0,0,0,0,28,55,52,20,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,52,60,36,12,0,15,44,76,87,60,28,44,76,52,31,68,63,76,132,116,92,132,116,148,135,156,108,63,60,76,36,0,0,0,0,36,60,52,20,0,0,7,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,52,60,47,20,0,20,52,87,100,60,36,68,76,39,68,68,76,132,124,108,143,124,164,143,164,87,68,84,60,7,0,0,12,39,68,52,20,0,7,12,20,12,0,7,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,20,20,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,44,63,60,31,7,20,60,100,108,52,52,76,63,60,71,87,124,127,124,156,135,188,175,156,95,84,84,36,0,0,12,44,71,52,20,0,20,31,28,15,12,12,20,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,28,20,20,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,60,68,44,20,28,76,111,108,60,71,79,68,76,84,124,124,140,172,167,212,204,140,111,108,76,12,0,15,52,76,52,20,12,28,36,36,28,23,23,20,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,20,20,23,36,36,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,28,55,76,60,36,36,87,124,111,76,84,79,100,84,140,124,156,188,196,236,199,140,124,108,44,0,20,55,79,60,28,28,44,44,39,36,31,28,23,12,0,0,0,7,20,20,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,36,36,36,39,44,36,15,0,0,0,0,0,0,0,0,0,0,15,47,76,71,44,47,100,140,116,100,92,124,103,156,132,172,199,223,244,188,156,132,92,20,28,60,100,68,52,47,52,52,52,44,36,31,20,0,0,12,23,28,23,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,12,0,7,20,36,39,44,44,44,47,39,20,0,0,0,0,0,0,0,0,0,36,68,84,63,68,119,156,132,116,132,148,172,172,204,220,236,228,188,164,140,60,36,76,108,100,68,63,68,68,60,44,36,28,12,12,28,36,36,31,28,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,23,20,20,20,28,28,28,36,44,47,52,52,52,47,28,7,0,0,0,0,0,0,28,60,84,79,92,140,159,148,135,172,196,220,236,244,247,220,204,172,116,68,92,124,124,100,92,92,87,63,47,36,28,31,44,44,36,36,36,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,28,28,36,44,52,52,47,39,44,52,60,60,55,55,60,60,55,36,12,0,0,0,0,12,52,84,92,111,156,172,164,183,215,244,252,252,252,228,212,156,108,119,159,156,124,124,124,100,68,55,52,52,52,47,44,44,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,12,12,20,20,15,28,44,55,60,68,68,84,79,84,84,92,92,79,68,63,68,60,44,20,0,0,0,36,76,103,132,172,188,204,228,252,252,252,252,236,196,148,148,196,196,172,156,132,116,103,92,68,52,52,52,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,0,7,20,20,20,28,52,52,52,60,76,92,92,100,108,108,111,124,132,132,119,100,84,76,68,52,28,7,28,63,108,156,196,223,239,252,252,252,252,231,191,180,212,236,212,180,156,148,124,84,63,60,52,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,7,20,20,15,20,36,28,28,36,52,76,84,108,127,148,156,156,140,132,132,151,167,164,143,124,108,92,68,52,68,108,172,228,247,252,252,252,252,228,215,228,252,252,228,204,172,124,84,76,55,36,23,20,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,28,44,44,44,47,52,63,84,108,132,156,172,180,188,196,204,212,212,196,167,135,111,116,156,207,244,252,252,252,252,244,244,252,252,244,215,180,159,132,84,55,36,28,23,20,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,20,28,44,52,44,20,20,44,60,60,60,60,60,68,84,95,100,100,100,108,116,132,156,180,196,204,223,244,247,236,204,180,180,212,244,252,252,252,252,252,252,252,252,239,207,156,111,68,47,44,36,28,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,20,28,44,52,44,20,20,44,60,60,68,68,60,68,68,71,68,68,76,76,92,103,116,132,159,196,231,244,252,252,252,252,244,244,247,252,252,252,252,252,252,252,252,236,204,172,140,103,76,68,60,60,52,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,44,52,68,76,100,111,132,140,140,143,156,180,204,215,236,252,252,252,252,252,252,252,252,252,252,252,252,252,252,239,215,188,159,148,132,116,100,87,68,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,28,28,44,55,76,79,95,103,116,140,159,172,172,172,199,228,239,239,244,252,252,252,252,252,252,252,252,244,236,231,223,196,156,127,100,92,87,84,84,84,76,63,47,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,20,44,68,84,84,92,92,87,84,100,132,164,183,172,180,207,239,252,252,252,252,252,252,252,252,244,231,212,196,188,188,188,172,156,140,111,92,84,84,84,84,84,79,79,76,71,60,44,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,23,28,36,44,52,63,84,111,132,140,127,116,116,132,156,196,236,252,252,252,252,252,252,252,252,247,236,207,183,164,156,159,156,148,116,100,95,95,92,79,76,79,79,79,79,79,79,76,76,76,71,55,52,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,20,20,20,23,28,36,36,47,71,95,108,108,108,100,100,100,116,164,220,247,252,252,252,252,252,239,239,244,252,252,239,196,143,124,116,111,124,135,140,124,95,71,63,60,47,36,28,36,52,68,76,76,76,71,60,60,55,36,28,31,20,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,20,12,12,0,0,20,52,79,100,108,100,79,60,60,76,111,140,188,223,247,239,239,252,252,252,228,215,220,236,236,239,228,196,148,100,84,79,71,76,92,116,124,108,84,63,60,55,47,28,12,0,0,12,23,36,47,52,36,28,31,20,12,20,12,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,47,63,76,84,84,60,28,31,60,79,108,124,156,196,236,228,220,228,252,252,252,228,188,172,199,204,204,220,204,188,156,108,79,60,44,47,60,63,71,92,108,92,68,55,52,52,47,36,20,0,0,0,0,0,0,12,12,12,20,12,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,44,52,60,60,52,28,7,12,44,68,79,100,108,132,172,220,231,196,196,223,244,252,252,244,180,143,143,156,164,172,196,183,164,140,116,84,68,47,23,23,44,55,55,60,68,84,76,60,52,44,44,44,39,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,44,44,47,47,36,15,0,0,28,52,68,71,84,92,108,148,204,244,204,172,180,220,220,239,252,244,188,124,100,132,127,140,140,164,164,148,124,108,92,71,63,36,12,0,28,44,52,52,47,52,60,60,52,44,44,39,36,36,28,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,31,36,36,44,39,20,0,0,0,12,39,60,63,60,68,84,95,116,180,236,228,156,156,180,191,172,220,244,236,196,116,84,100,116,108,116,124,140,135,127,108,95,84,71,68,55,31,0,0,7,28,44,44,44,39,39,39,39,36,36,36,36,36,31,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,28,31,36,36,23,12,0,0,0,0,23,52,60,52,47,60,84,84,92,140,204,228,175,127,164,183,156,132,199,231,212,188,116,71,60,95,95,92,100,108,116,108,108,100,84,71,63,63,60,52,23,0,0,0,12,28,39,36,36,36,31,23,20,28,31,31,28,28,20,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,23,28,28,28,12,0,0,0,0,0,12,36,52,55,36,36,52,84,60,60,100,172,212,196,124,116,183,159,119,116,196,212,180,172,116,60,39,68,87,84,76,92,92,100,84,84,76,84,63,52,52,60,60,44,20,0,0,0,0,12,28,36,31,28,28,20,7,7,15,23,20,20,20,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,20,23,15,0,0,0,0,0,0,0,23,44,52,44,23,28,55,76,52,31,60,124,175,196,140,76,127,188,124,84,108,188,204,172,172,116,63,44,28,68,76,76,63,84,84,84,68,60,60,84,68,44,39,52,55,52,36,12,0,0,0,0,0,12,28,28,20,12,15,12,7,0,0,15,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,12,28,44,44,28,12,28,60,76,44,20,39,92,135,180,164,87,68,156,172,84,63,103,172,188,164,180,108,79,44,20,36,63,68,60,52,71,68,76,63,44,47,71,76,52,28,31,52,52,44,28,0,0,0,0,0,0,0,0,12,15,12,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,44,36,15,0,31,63,68,36,12,31,79,108,156,175,116,39,84,172,143,52,55,100,156,175,164,172,103,87,36,15,12,36,63,63,47,52,60,63,68,60,36,31,60,76,60,28,15,36,44,44,36,20,0,0,0,0,0,0,0,0,12,15,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,36,20,0,0,36,68,60,31,0,28,60,84,124,172,148,60,28,116,175,116,28,52,100,151,164,164,156,108,84,36,20,0,0,36,68,52,36,52,52,52,60,60,31,20,44,68,60,28,0,12,36,44,39,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,31,23,12,0,12,36,68,55,28,0,20,52,68,87,143,164,92,12,44,140,159,76,20,52,100,148,156,156,148,119,60,44,28,0,0,0,44,60,36,28,52,44,44,52,60,31,12,28,52,52,28,12,0,15,36,36,36,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,20,12,0,0,12,39,63,47,20,0,12,44,60,63,103,156,116,36,0,79,164,140,44,31,47,100,148,148,148,143,132,44,60,28,0,0,0,15,52,55,28,23,44,36,39,47,60,36,7,15,36,44,31,12,0,0,20,31,36,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,20,7,0,0,0,15,44,60,39,12,0,12,36,52,52,76,140,132,60,0,20,108,164,100,15,39,44,92,143,140,132,140,127,47,60,23,15,0,0,0,28,52,44,15,20,44,36,28,44,60,36,7,0,20,36,28,15,0,0,0,20,28,28,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,15,0,0,0,0,20,44,55,36,7,0,0,28,52,36,44,108,140,87,20,0,55,132,148,60,0,44,44,79,140,140,111,135,119,60,44,20,15,0,0,0,0,31,52,31,7,23,44,28,23,36,55,36,12,0,12,28,28,20,0,0,0,0,20,28,23,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,20,44,52,28,0,0,0,23,44,31,36,79,132,108,44,0,0,84,148,116,36,0,44,44,68,140,140,100,132,119,76,36,20,7,0,0,0,0,12,39,47,20,0,20,36,20,20,36,52,36,12,0,0,20,28,20,0,0,0,0,7,20,20,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,47,44,23,0,0,0,20,39,31,15,39,103,124,63,7,0,20,100,143,76,15,0,28,28,52,132,135,92,119,124,84,28,28,0,0,0,0,0,0,20,44,39,12,0,20,36,20,12,28,47,36,12,0,0,12,15,12,0,0,0,0,0,0,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,44,39,20,0,0,0,12,36,31,15,20,71,108,84,23,0,0,52,108,124,44,0,0,28,28,39,124,132,84,100,124,79,20,20,0,0,0,0,0,0,0,23,44,28,0,0,20,23,7,0,28,44,36,12,0,0,0,7,0,0,0,0,0,0,0,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,44,36,12,0,0,0,0,20,28,15,12,44,92,92,44,0,0,0,71,116,92,28,0,12,36,36,36,116,124,68,76,116,68,20,20,0,0,0,0,0,0,0,0,28,39,20,0,0,12,7,0,0,20,39,36,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,44,28,12,0,0,0,0,12,23,12,0,20,68,100,68,12,0,0,20,84,116,55,12,0,15,23,23,36,116,119,52,60,111,60,20,12,0,0,0,0,0,0,0,0,12,36,36,12,0,0,0,0,0,0,20,36,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,20,0,0,0,0,0,15,20,7,0,0,39,84,79,28,0,0,0,44,84,100,36,0,0,20,20,20,36,108,116,44,47,108,63,36,12,12,0,0,0,0,0,0,0,0,20,36,28,0,0,0,0,7,0,0,15,28,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,20,0,0,0,0,0,0,20,12,0,0,12,63,84,52,0,0,0,0,60,92,68,23,0,0,20,20,12,20,84,103,39,44,95,68,36,7,7,0,0,0,0,0,0,0,0,0,20,28,12,0,0,0,12,7,0,0,12,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,12,0,0,0,0,0,0,0,0,0,0,0,44,84,68,15,0,0,0,15,60,84,39,12,0,0,20,20,0,0,52,92,39,44,76,68,36,0,0,0,0,0,0,0,0,0,0,0,0,20,20,12,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,0,0,0,0,0,0,0,0,0,0,0,20,68,79,36,0,0,0,0,31,55,68,20,0,0,0,0,0,0,0,39,79,36,31,52,60,28,0,0,0,0,0,0,0,0,0,0,0,0,12,28,20,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,44,76,52,0,0,0,0,0,39,55,44,12,0,0,0,0,0,0,0,36,76,36,28,36,55,23,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,7,0,0,0,0,0,0,0,0,0,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,23,68,63,20,0,0,0,0,7,36,52,15,0,0,0,0,7,7,0,0,36,68,28,20,36,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,12,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,52,63,36,0,0,0,0,0,20,36,39,7,0,0,0,0,0,0,0,12,47,68,28,7,36,52,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,60,44,0,0,0,0,0,0,31,39,28,7,0,0,0,0,0,0,0,15,52,68,28,0,20,36,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,47,52,20,0,0,0,0,0,12,31,36,0,0,0,0,0,0,0,0,0,12,52,63,28,0,15,28,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,47,28,0,0,0,0,0,0,20,28,23,0,0,0,0,0,0,0,0,0,12,47,47,12,0,20,23,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,36,7,0,0,0,0,0,0,28,28,7,0,0,0,0,0,0,0,0,0,0,44,36,0,0,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,28,12,0,0,0,0,0,0,12,28,28,0,0,0,0,0,0,0,0,0,0,0,36,36,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,15,0,0,0,0,0,0,0,15,20,12,0,0,0,0,0,0,0,0,0,0,0,28,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,20,0,0,0,0,0,0,0,0,15,15,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,12,0,0,0,0,0,0,0,0,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};\n  const uint8_t SHINE_TEXTURE_3[16384] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,12,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,7,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,20,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,15,12,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,20,20,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,20,0,7,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,28,0,28,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,20,7,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,28,0,28,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,31,20,20,15,15,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,31,0,36,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,28,31,28,28,20,20,12,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,23,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,0,36,36,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,31,44,28,23,15,7,0,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,28,36,36,36,44,36,31,20,0,0,12,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,15,0,12,12,0,0,0,0,0,0,0,0,0,7,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,39,52,39,52,44,39,28,12,0,12,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,28,12,12,20,12,12,12,0,0,0,0,0,0,12,0,0,0,39,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,52,55,52,52,44,36,20,0,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,36,28,12,20,20,20,20,12,0,0,0,0,0,12,12,0,0,39,39,12,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,68,55,60,52,44,28,7,12,23,15,0,0,0,0,0,0,0,7,12,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,23,12,0,0,0,0,0,0,0,0,0,0,7,7,0,0,28,36,20,15,28,28,20,20,0,0,0,0,12,15,20,12,0,44,44,23,28,23,0,0,0,0,0,0,0,0,0,0,0,44,68,71,63,60,55,36,12,15,28,20,0,0,0,0,0,0,0,7,20,15,20,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,28,15,0,0,0,0,0,0,0,0,0,7,12,12,0,15,36,36,20,28,28,31,23,12,0,0,0,0,12,28,12,0,44,44,36,44,44,0,0,0,0,0,0,0,0,0,0,20,60,87,71,71,60,47,28,20,36,36,12,0,0,0,0,0,0,0,12,20,23,28,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,20,36,39,23,0,0,0,0,0,0,0,0,0,7,20,12,7,20,44,31,23,31,36,28,28,0,0,0,0,20,36,15,0,44,44,44,47,44,0,0,0,0,0,0,0,0,0,0,47,79,92,79,76,60,36,28,44,44,20,0,0,0,0,0,0,15,15,15,23,31,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,7,0,0,0,0,0,15,36,44,28,12,0,0,0,0,0,0,0,0,15,28,28,12,36,44,31,31,36,44,28,12,0,0,0,20,44,31,12,44,47,52,52,39,0,0,0,0,0,0,0,0,0,28,68,100,84,84,68,52,36,44,52,23,0,0,0,0,0,0,20,31,28,31,36,23,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,0,0,0,0,0,12,31,47,36,20,0,0,0,0,0,0,0,12,36,44,31,28,44,44,36,36,47,36,28,0,0,0,20,44,44,23,44,52,60,52,36,0,0,0,0,0,0,0,0,0,60,100,108,92,87,60,44,44,60,31,0,0,0,0,0,0,20,28,39,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,20,15,0,0,0,0,0,28,47,44,23,0,0,0,0,0,0,0,15,47,60,36,36,52,47,47,52,55,36,12,0,0,12,44,60,31,36,52,68,47,28,0,0,0,0,0,0,0,0,28,92,124,108,100,79,52,55,60,44,12,0,0,0,0,12,23,36,36,44,36,20,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,28,28,12,0,0,0,0,23,47,52,31,7,0,0,0,0,0,0,23,60,60,36,47,60,60,52,60,44,31,0,0,7,39,71,36,36,52,71,47,28,0,0,0,0,0,0,0,0,68,116,132,116,100,76,68,68,52,20,0,0,0,0,20,36,47,47,44,31,15,0,0,0,0,0,0,0,0,0,0,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,0,0,0,0,0,15,28,28,23,12,0,0,0,20,44,55,39,20,0,0,0,0,0,0,36,68,60,44,55,68,68,60,68,44,15,0,0,36,76,47,36,52,76,52,28,0,0,0,0,0,0,0,31,100,148,132,116,92,76,79,68,28,0,0,0,0,23,44,60,60,47,28,12,0,0,7,15,12,7,12,12,12,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,20,20,7,0,0,0,12,20,31,36,20,7,0,0,12,36,60,52,23,0,0,0,0,0,12,44,76,63,52,60,79,76,84,55,36,0,0,39,84,68,47,60,84,60,28,0,0,0,0,0,0,0,71,132,151,132,108,87,92,84,36,0,0,0,7,28,52,63,63,47,28,0,0,0,15,20,20,20,20,23,28,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,20,20,12,0,0,0,15,31,36,36,20,0,0,0,31,60,60,36,0,0,0,0,0,15,60,87,68,63,79,95,84,79,47,12,0,39,92,84,52,60,92,60,28,0,0,0,0,0,0,36,108,167,159,132,108,103,92,52,7,0,0,12,36,63,68,68,44,20,0,0,20,28,28,28,28,28,36,39,31,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,23,28,28,15,0,0,7,23,36,44,36,15,0,0,28,52,68,44,23,20,15,0,0,23,76,95,84,79,103,103,100,68,36,0,28,87,95,60,60,92,60,28,0,0,0,7,12,15,76,148,180,156,124,116,108,63,15,0,0,15,39,76,76,68,44,20,0,12,28,36,36,36,36,39,47,44,28,15,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,28,28,28,20,0,0,12,31,44,44,28,12,0,20,47,68,60,44,28,20,7,0,36,92,100,87,92,119,108,100,55,12,20,79,108,68,63,100,63,28,0,0,0,12,15,39,119,191,188,148,135,124,84,23,0,0,20,52,84,84,68,36,12,7,28,44,44,52,44,44,55,52,36,20,12,7,12,15,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,31,36,36,20,0,0,20,44,47,44,23,0,12,44,68,68,52,31,20,0,0,52,108,111,103,119,132,124,79,36,20,84,124,84,76,108,63,20,0,0,12,20,31,84,172,220,188,156,148,108,36,0,0,28,63,92,92,68,31,12,20,39,47,60,55,60,63,63,44,28,20,12,20,20,20,15,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,39,39,28,7,12,31,47,52,44,20,7,36,68,76,60,44,23,15,12,68,119,124,116,148,148,124,60,28,76,148,108,95,108,60,20,0,0,28,28,60,140,220,215,183,159,124,55,0,0,36,76,100,100,60,28,20,36,52,60,68,71,71,76,55,36,23,20,23,23,20,20,12,0,0,7,12,15,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,44,44,44,28,12,20,44,52,52,36,15,28,60,76,71,60,39,20,20,84,132,132,143,172,164,92,44,68,156,132,116,116,63,28,7,12,31,44,100,191,239,212,180,140,71,12,12,44,92,111,100,52,28,28,52,68,76,84,84,87,68,44,31,31,31,28,28,23,12,0,12,20,20,20,15,15,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,44,44,52,36,23,28,52,60,52,31,28,52,84,87,76,52,23,36,95,140,148,188,199,148,68,60,148,148,140,124,68,36,20,31,36,79,143,228,239,212,164,87,20,12,52,108,119,95,47,36,44,68,84,100,100,100,76,60,44,44,36,36,31,28,12,12,23,28,28,23,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,12,0,0,0,0,12,36,52,52,52,39,36,44,60,63,52,36,47,76,100,92,63,36,52,108,148,180,204,196,108,76,132,172,159,140,84,39,20,44,55,119,196,244,236,188,108,31,20,68,124,124,92,52,47,68,92,111,116,108,92,71,60,52,39,36,36,28,23,28,36,36,28,28,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,20,23,20,0,0,0,12,36,52,52,60,52,52,55,68,63,52,52,71,103,103,84,44,68,119,167,204,215,167,95,124,172,180,164,108,44,44,47,95,156,236,244,212,124,47,31,92,140,132,87,60,63,92,124,135,132,116,100,76,60,44,44,39,36,36,36,36,36,36,31,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,15,20,28,28,28,28,20,7,0,12,36,55,60,60,60,63,68,68,68,68,76,108,124,108,63,84,140,196,223,220,132,124,167,196,196,140,60,76,68,140,196,252,228,156,68,47,108,156,140,92,76,92,132,159,159,140,132,108,84,55,47,52,55,52,44,44,36,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,28,36,39,44,39,28,12,12,36,60,60,63,76,84,79,76,76,84,119,148,135,92,100,172,220,239,183,148,164,212,215,156,63,100,108,180,236,239,180,87,63,119,164,148,108,100,132,172,188,188,172,140,100,68,68,71,68,52,52,44,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,39,47,55,60,52,47,31,20,36,60,68,76,95,100,87,87,100,132,164,156,116,132,196,239,228,167,172,212,228,159,84,116,164,212,244,196,116,84,132,172,164,132,140,175,196,207,204,172,119,92,92,87,68,52,52,52,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,52,60,76,79,84,60,44,52,68,71,84,111,116,100,116,148,175,164,140,164,215,247,196,188,199,236,172,124,140,204,236,212,140,108,140,180,175,172,188,212,231,220,188,148,124,116,92,68,55,52,47,28,0,0,0,0,0,12,12,15,12,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,23,52,76,95,95,100,100,84,79,84,92,111,132,132,132,156,188,172,164,191,231,223,212,212,247,196,172,188,236,223,172,135,159,196,196,196,220,244,239,220,188,156,124,92,68,60,52,36,12,0,15,28,39,44,39,39,36,36,28,20,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,7,7,0,0,12,12,12,20,44,63,84,100,108,108,108,108,124,132,127,143,159,164,175,196,196,196,228,247,231,231,252,228,223,228,236,199,172,188,220,215,220,236,252,244,228,188,132,92,68,60,44,36,36,55,71,84,87,84,76,68,52,44,36,28,20,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,0,12,20,20,20,44,39,36,39,36,28,39,60,92,124,132,124,119,132,156,180,196,204,207,212,228,228,236,252,247,247,252,244,244,247,231,204,212,236,239,239,252,247,228,188,140,103,84,84,76,84,92,100,100,100,95,92,92,84,68,52,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,15,20,31,28,28,47,60,68,84,87,92,92,95,111,135,156,167,175,199,220,236,236,244,247,252,252,252,252,252,252,252,252,236,236,244,252,252,236,212,188,164,148,132,116,103,100,100,100,100,100,100,87,68,47,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,20,28,36,44,44,44,52,71,92,103,108,116,140,175,204,220,236,244,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,239,220,196,164,132,108,100,100,100,100,87,71,52,31,12,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,20,12,0,0,0,0,0,7,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,15,15,15,15,15,15,15,15,15,15,15,12,0,0,0,0,0,0,0,7,20,36,52,60,60,68,79,108,132,148,156,188,228,252,252,252,252,252,252,252,252,252,252,252,252,252,252,236,212,172,143,132,135,132,116,100,84,68,60,60,63,68,63,68,68,63,63,63,60,31,28,36,36,36,36,36,28,28,20,12,0,0,0,0,0,7,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,20,23,28,36,36,36,36,36,44,44,44,36,36,39,44,47,47,47,52,55,60,60,60,63,71,84,100,116,132,156,183,212,231,236,244,252,252,252,252,252,252,252,252,252,252,252,236,220,204,188,164,151,148,132,124,124,119,100,84,76,68,68,68,68,63,63,63,60,31,28,36,36,36,36,36,28,28,20,12,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,15,15,20,23,28,28,28,28,36,39,44,44,44,44,52,52,52,52,60,68,84,100,116,132,156,175,196,212,228,244,252,252,252,252,252,252,252,252,252,236,223,220,228,244,228,191,156,148,132,124,116,116,100,76,68,63,60,52,52,52,44,44,44,36,15,12,28,36,28,28,28,28,23,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,36,52,60,76,92,111,127,148,164,175,180,180,199,231,252,252,252,252,252,252,252,252,247,231,199,183,180,172,159,140,116,95,100,100,92,84,76,60,52,55,60,52,52,52,52,44,44,44,36,15,12,28,36,28,28,28,28,23,20,7,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,39,44,47,52,52,68,87,108,124,156,183,204,207,199,183,175,183,204,220,244,252,244,239,239,252,252,252,252,247,231,196,140,108,103,116,116,92,68,60,52,52,47,44,44,36,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,7,12,15,15,12,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,20,36,36,36,39,44,52,71,92,108,111,124,143,159,159,164,159,143,132,132,148,156,172,196,228,247,244,207,204,228,236,236,252,252,252,247,220,172,132,100,76,71,68,63,52,44,39,44,44,44,36,28,23,20,15,12,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,12,12,20,20,20,20,44,60,76,87,92,92,92,95,100,100,103,108,103,92,84,84,92,100,100,124,164,196,220,244,236,188,156,180,220,204,204,247,244,244,252,252,231,180,116,68,60,60,63,60,60,52,28,0,0,0,12,20,20,15,12,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,15,12,20,36,52,52,52,60,47,47,52,68,68,76,76,76,60,47,44,44,47,60,68,76,100,140,156,164,188,215,220,172,116,140,204,212,172,180,244,220,212,228,231,239,236,196,135,68,28,28,47,60,55,52,52,36,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,20,28,28,23,28,36,36,44,52,55,60,47,39,20,23,28,31,20,12,36,55,63,68,84,108,116,108,124,156,196,199,156,87,84,164,223,167,140,172,236,188,172,180,196,215,228,236,196,148,92,44,0,7,28,47,52,44,44,39,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,15,15,20,20,20,20,23,28,36,31,20,15,12,20,12,20,7,0,0,20,44,60,60,63,76,84,84,76,95,116,132,164,172,132,63,47,116,196,204,116,108,180,204,156,135,132,167,172,204,228,223,183,148,103,60,15,0,0,12,31,44,44,36,36,28,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,15,15,20,20,12,12,0,0,0,0,0,12,0,0,0,0,0,28,44,52,55,60,60,63,60,60,76,84,100,116,148,140,100,44,28,76,156,220,164,63,92,196,180,140,103,108,140,140,156,196,228,212,164,132,100,68,28,0,0,0,0,15,31,36,31,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,47,52,52,52,44,44,52,55,63,68,68,84,108,127,116,76,28,7,36,108,191,212,119,28,100,196,156,124,84,108,100,127,124,148,196,231,188,132,100,92,68,36,12,0,0,0,0,0,15,28,20,15,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,44,44,47,44,28,28,39,47,52,55,52,52,76,100,108,100,60,20,0,12,60,148,220,175,76,15,108,196,140,92,79,92,71,108,108,116,135,188,199,132,79,68,68,60,44,20,0,0,0,0,0,0,0,12,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,39,44,44,36,15,15,31,44,44,44,36,28,52,68,92,92,84,44,12,0,0,28,92,172,212,127,31,20,116,180,108,60,76,68,63,76,100,100,103,124,164,156,100,60,44,47,52,44,20,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,36,36,36,36,20,0,12,28,36,36,39,28,20,20,52,63,79,76,68,28,7,0,0,7,52,119,183,164,84,0,31,116,180,84,28,63,55,55,60,79,87,100,87,108,140,132,84,44,20,28,36,31,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,28,31,36,28,12,0,7,20,31,36,36,20,12,0,20,39,60,68,63,47,23,0,0,0,0,20,76,140,172,119,44,0,44,119,172,71,20,52,52,47,52,60,76,92,87,71,108,132,124,76,36,0,7,20,28,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,28,28,28,15,0,0,0,15,28,28,31,20,0,0,0,20,36,47,55,52,36,15,0,0,0,0,0,47,108,148,143,84,12,0,52,116,164,60,7,28,52,47,28,60,60,68,100,76,60,108,124,116,60,20,0,0,12,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,15,23,20,7,0,0,0,12,20,23,23,15,0,0,0,0,20,36,47,36,28,15,12,0,0,0,0,0,28,76,116,143,116,52,0,0,60,100,140,60,0,0,44,44,15,52,55,44,79,92,55,55,108,116,100,52,12,0,0,0,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,0,0,0,0,0,7,12,15,20,15,0,0,0,0,0,20,36,44,36,20,0,0,0,0,0,0,0,7,52,92,108,124,84,15,0,0,63,76,100,55,0,0,44,44,23,28,52,44,44,92,76,39,60,108,108,92,47,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,12,12,12,0,0,0,0,0,0,20,36,31,20,12,12,0,0,0,0,0,0,0,36,68,84,103,100,60,0,0,0,60,60,68,52,0,0,28,39,36,0,44,44,28,60,92,60,28,63,103,100,84,44,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,7,20,31,23,7,0,0,0,0,0,0,0,0,0,15,52,76,68,100,84,23,0,0,0,60,60,52,47,0,0,12,36,36,0,28,44,36,20,76,87,39,28,60,92,84,68,36,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,15,0,0,0,0,0,0,0,0,0,0,0,36,60,52,68,87,63,0,0,0,7,60,60,44,47,0,0,0,31,31,7,0,39,39,12,39,84,71,20,23,60,84,68,52,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,12,12,0,0,0,0,0,0,0,0,0,0,0,20,52,47,28,76,79,36,0,0,0,20,60,60,44,44,0,0,0,28,28,20,0,23,36,28,0,52,76,47,7,28,60,68,52,44,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,39,52,23,36,76,68,0,0,0,0,28,55,60,36,39,0,0,0,15,20,20,0,7,36,36,7,15,60,68,31,0,23,52,55,47,44,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,47,36,7,63,76,44,0,0,0,0,39,52,52,28,36,0,0,0,0,20,20,0,0,20,28,20,0,28,60,52,15,0,20,44,52,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,44,44,15,28,76,68,12,0,0,0,0,44,52,44,28,36,0,0,0,0,12,12,0,0,0,28,28,0,0,28,52,36,0,0,20,44,39,36,31,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,44,28,0,55,76,47,0,0,0,0,0,47,47,31,28,36,0,0,0,0,12,12,12,0,0,15,20,12,0,0,36,44,20,0,0,20,39,36,28,31,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,36,7,20,68,68,20,0,0,0,0,0,44,44,20,23,28,0,0,0,0,0,0,0,0,0,0,20,20,0,0,12,39,39,12,0,0,20,36,28,28,31,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,36,20,0,44,68,52,0,0,0,0,0,0,44,44,7,20,23,0,0,0,0,0,0,0,0,0,0,12,20,12,0,0,20,44,28,0,0,0,20,36,28,23,28,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,36,28,0,12,68,68,28,0,0,0,0,0,0,44,44,0,15,20,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,28,36,20,0,0,0,20,23,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,12,0,36,68,60,0,0,0,0,0,0,0,39,39,0,15,20,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,12,31,31,12,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,20,0,0,60,68,31,0,0,0,0,0,0,15,36,36,0,12,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,31,20,0,0,0,0,7,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,0,0,28,63,60,0,0,0,0,0,0,0,28,36,36,0,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,12,0,0,0,7,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,7,0,0,44,60,36,0,0,0,0,0,0,0,28,28,28,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,28,7,0,0,0,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,0,0,12,47,47,12,0,0,0,0,0,0,0,28,28,20,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,31,44,28,0,0,0,0,0,0,0,0,31,31,20,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,7,36,36,7,0,0,0,0,0,0,0,0,28,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,31,23,0,0,0,0,0,0,0,0,0,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,7,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,20,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,7,0,0,0,0,0,0,0,0,0,7,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,7,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};\n  const uint8_t SHINE_TEXTURE_4[16384] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,15,12,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,12,0,0,0,0,7,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,0,12,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,0,20,23,12,0,0,0,12,23,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,15,0,31,31,7,0,0,0,23,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,7,36,36,0,0,0,12,28,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,31,20,15,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,12,23,36,36,0,0,0,28,31,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,36,28,23,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,12,36,36,28,0,0,7,36,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,36,28,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,23,0,39,39,12,0,0,23,36,28,0,0,0,0,0,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,39,36,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,12,44,44,0,0,0,36,36,12,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,44,39,31,28,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,12,36,36,28,44,44,0,0,20,44,36,0,0,0,0,7,12,12,0,0,0,7,12,12,0,0,0,0,0,0,0,0,0,0,20,36,31,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,44,44,44,36,20,0,0,0,0,0,0,0,12,12,12,0,0,0,0,0,0,20,28,28,44,44,31,0,0,39,44,20,0,0,0,0,20,20,7,0,0,7,20,20,12,0,0,0,0,0,0,0,0,12,28,36,31,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,47,52,47,36,7,0,0,0,0,0,0,15,20,20,12,12,0,0,0,0,28,31,28,47,47,12,0,20,44,44,0,0,0,0,20,28,12,0,0,0,15,20,15,12,0,0,0,0,0,0,0,20,36,44,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,36,52,60,44,28,0,0,0,0,0,0,7,20,28,12,12,0,0,0,0,36,36,36,52,52,0,0,36,44,28,0,0,0,12,28,23,0,0,0,12,15,20,15,12,0,0,0,0,0,7,28,44,47,31,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,63,60,44,15,0,0,0,0,0,0,28,28,12,7,0,0,0,0,44,44,52,52,47,0,12,52,52,12,0,0,7,28,36,12,0,0,20,20,12,20,15,0,0,0,0,0,15,36,60,52,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,39,60,71,60,36,0,0,0,0,0,0,31,31,28,15,0,0,0,0,44,44,55,52,36,0,36,52,36,0,0,0,28,36,20,0,0,28,44,31,23,15,0,0,0,0,0,23,52,63,55,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,52,68,76,52,23,0,0,0,0,0,36,36,60,28,12,0,0,0,47,52,55,55,20,0,52,52,20,0,0,20,39,36,7,0,28,44,44,28,20,0,0,0,0,12,36,63,68,52,23,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,39,68,79,76,47,12,0,0,0,0,28,36,76,36,28,0,0,20,52,68,60,60,0,28,55,47,0,0,12,36,39,20,0,28,47,44,36,23,12,0,0,0,20,52,76,68,44,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,60,76,87,68,36,0,0,0,0,12,44,76,36,36,0,0,52,68,92,60,55,0,52,60,28,0,0,36,52,28,12,28,52,52,44,28,12,0,0,7,36,68,84,68,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,44,68,92,95,60,20,0,0,0,0,44,71,47,39,0,0,68,71,100,60,44,28,60,55,0,0,28,52,52,23,31,52,60,52,28,12,0,0,20,52,84,87,60,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,60,84,100,92,52,12,0,0,0,44,63,68,44,0,0,68,76,100,60,23,52,60,36,0,20,52,60,39,39,60,68,60,36,12,0,0,31,76,100,84,52,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,36,76,100,116,87,44,12,0,0,44,55,92,44,0,0,68,84,92,68,28,63,63,12,7,44,76,52,44,68,76,68,36,12,0,12,55,100,111,79,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,52,92,124,124,92,44,7,0,28,52,100,52,7,28,84,124,79,63,47,68,52,0,36,76,76,68,76,87,76,36,12,0,28,79,124,111,76,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,15,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,23,68,111,140,124,76,28,0,7,52,108,60,20,60,108,156,71,63,68,68,23,23,71,87,84,84,92,84,44,15,12,52,100,127,108,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,20,23,20,12,0,0,12,7,0,0,0,0,0,0,0,0,31,95,140,156,127,60,12,0,60,116,76,36,71,111,156,71,68,71,60,20,60,95,100,92,108,92,44,20,28,76,124,132,92,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,36,31,28,20,12,15,12,0,0,0,0,0,0,12,52,127,175,172,116,39,0,52,116,100,52,100,140,143,84,76,76,44,47,100,119,108,124,103,52,23,44,100,140,124,76,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,20,15,0,0,0,12,20,31,36,39,44,31,28,28,23,12,0,0,0,0,0,20,84,164,207,172,87,20,44,108,124,63,132,180,135,108,76,79,52,100,132,132,135,111,60,36,68,119,140,108,52,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,20,36,28,31,28,12,7,7,20,47,68,60,60,44,36,36,23,7,0,0,0,0,36,124,207,220,148,60,28,100,135,84,148,212,140,132,84,92,108,148,164,159,124,68,52,87,132,127,84,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,28,44,63,68,55,36,12,20,47,68,79,76,76,60,47,39,20,0,0,0,0,68,164,228,212,116,36,92,143,108,164,228,164,135,111,124,172,191,188,148,87,76,108,132,108,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,15,20,36,60,68,71,76,76,63,47,44,60,84,92,100,92,76,60,36,15,0,0,20,103,199,244,175,76,87,148,140,172,231,191,140,151,183,220,220,175,124,103,124,127,92,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,20,20,20,15,12,12,15,12,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,20,20,28,36,60,84,84,84,84,84,79,76,71,76,92,108,124,124,92,63,36,12,0,44,140,223,223,132,95,140,164,188,231,199,164,188,236,244,204,151,127,132,116,68,20,0,0,0,0,0,0,0,0,0,0,0,12,28,36,36,36,31,28,28,39,52,52,44,31,31,28,20,20,15,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,15,20,28,31,44,47,63,103,124,124,108,92,84,92,100,108,116,132,148,140,100,63,28,12,68,164,228,188,124,143,191,212,239,212,204,223,244,220,180,151,132,95,44,0,0,0,0,0,0,0,0,0,20,36,44,44,44,44,52,63,84,92,92,84,79,68,60,47,36,31,23,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,44,52,76,76,87,116,143,148,132,108,108,124,148,148,156,164,148,108,60,36,84,180,220,159,164,204,236,252,236,236,244,228,196,164,119,71,20,0,0,0,0,0,0,20,39,52,52,55,68,84,100,116,124,116,95,87,84,79,79,79,63,47,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,52,71,79,79,92,119,151,164,156,148,164,183,183,188,188,156,108,76,116,196,196,196,212,252,252,252,252,247,220,172,108,52,12,0,0,0,28,44,68,76,92,100,116,135,140,140,119,100,92,92,92,84,79,68,47,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,60,79,84,100,124,164,188,196,204,212,228,228,204,148,124,156,196,228,228,252,252,252,252,228,180,100,39,12,28,52,76,100,124,143,159,164,156,143,124,108,92,92,87,79,68,44,28,12,0,0,0,0,0,12,20,15,7,0,0,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,7,0,12,23,31,36,47,60,76,111,143,164,183,191,204,220,236,252,231,191,180,207,239,247,252,252,244,212,164,116,87,84,108,132,148,156,164,167,164,148,132,124,116,111,100,87,71,60,52,52,60,68,76,76,52,39,47,60,52,39,20,12,0,15,31,36,28,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,7,0,12,23,31,36,44,52,52,76,100,116,143,172,204,228,239,252,252,247,228,228,244,252,252,252,236,204,164,148,159,183,207,223,228,207,196,183,172,164,148,140,132,135,140,148,151,148,148,140,148,135,119,108,76,60,68,103,108,76,44,36,20,28,44,39,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,36,44,47,63,84,92,100,100,116,140,164,196,220,239,252,252,252,252,252,252,236,220,215,236,247,252,252,244,228,207,199,196,204,204,204,204,204,207,204,199,196,191,175,156,156,135,108,84,60,44,44,71,76,44,20,20,20,20,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,31,44,52,63,76,84,92,92,92,108,127,143,156,172,180,196,220,244,252,252,252,252,252,252,252,252,252,252,252,239,236,236,236,228,212,207,204,204,191,172,156,140,127,124,108,92,84,76,68,52,36,28,23,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,39,52,60,71,84,87,92,92,92,92,92,92,92,95,108,132,148,167,188,191,188,172,164,180,204,228,244,252,252,252,252,252,252,252,252,252,252,252,236,215,196,172,156,140,143,148,148,132,116,92,84,79,76,76,71,76,76,63,63,60,52,44,36,44,36,28,28,15,0,0,7,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,12,44,60,52,36,55,84,92,92,92,92,92,92,92,92,92,92,92,103,124,140,148,143,135,124,116,108,108,103,108,119,148,175,204,228,247,252,252,252,252,247,247,252,252,252,252,252,228,196,164,140,116,100,87,76,60,44,44,52,52,52,60,60,60,60,52,44,44,44,31,23,20,36,36,28,28,15,0,0,12,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,28,28,20,28,60,79,60,39,55,84,92,92,87,84,76,68,68,71,84,92,87,79,76,76,76,76,76,76,68,52,52,68,100,132,172,196,215,236,252,244,236,236,252,228,228,231,252,252,252,252,244,220,188,148,116,92,76,55,52,44,36,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,20,12,0,0,12,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,28,28,28,20,23,47,60,44,28,23,28,20,12,20,36,52,60,68,68,68,68,68,71,71,68,52,31,12,0,20,60,103,132,159,172,172,172,204,236,252,212,204,212,236,220,191,196,236,252,252,247,231,207,191,167,127,100,87,84,71,52,28,20,15,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,0,0,12,7,0,0,0,0,0,12,28,36,36,44,44,52,60,60,68,68,63,52,31,12,0,0,0,0,28,60,92,124,148,156,148,124,132,167,212,244,244,172,167,199,220,204,172,148,188,244,247,236,228,220,196,164,148,132,92,60,44,44,44,39,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,20,20,23,28,36,36,36,44,44,52,44,28,12,0,0,0,0,0,0,0,28,60,84,108,124,132,124,100,84,108,143,180,215,244,212,132,140,212,196,180,180,116,124,199,244,231,212,204,196,188,159,132,108,87,60,44,28,20,12,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,20,20,20,20,20,23,28,36,28,12,0,0,0,0,0,0,0,0,0,0,7,31,55,76,100,108,100,92,84,68,63,95,140,164,175,212,236,164,95,132,220,175,156,188,108,92,124,212,236,204,183,188,188,180,156,124,95,76,55,31,20,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,20,20,20,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,52,68,84,92,76,68,63,55,47,52,87,143,156,148,180,220,204,116,60,132,212,148,148,180,132,84,63,143,220,220,188,151,164,180,172,135,108,84,68,52,39,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,36,47,60,71,76,60,52,47,47,44,36,39,87,148,151,132,143,183,212,156,63,31,124,180,103,127,156,140,84,52,63,164,220,204,143,108,116,156,167,148,108,76,52,39,36,28,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,44,52,60,60,39,28,31,36,36,36,20,31,92,156,148,116,119,156,180,172,108,23,28,127,156,60,95,140,127,92,68,20,79,172,207,164,111,71,76,124,156,156,124,76,36,23,28,28,20,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,39,44,44,31,20,15,12,20,23,28,20,12,31,95,156,140,95,100,140,151,172,140,63,0,28,116,140,44,68,132,108,100,84,31,20,100,180,196,140,92,60,55,92,140,156,140,103,52,20,12,20,20,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,31,36,36,36,20,0,0,0,7,7,15,20,12,0,36,100,148,135,76,84,124,132,148,156,100,20,0,31,100,127,31,52,119,108,100,79,60,0,31,116,183,180,124,84,52,39,68,108,140,143,116,76,28,0,12,15,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,28,31,28,15,0,0,0,0,0,0,7,0,0,0,39,103,148,132,68,68,108,127,116,148,124,60,0,0,36,87,116,28,44,95,116,84,76,76,23,0,44,132,180,156,103,79,39,28,44,79,116,132,124,92,47,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,20,23,28,20,12,0,0,0,0,0,0,0,0,0,0,0,44,108,148,124,55,52,95,119,108,124,135,92,20,0,0,44,84,108,20,28,63,116,71,68,76,55,0,0,60,140,164,124,92,76,36,20,28,60,84,108,116,100,68,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,20,20,15,0,0,0,0,0,0,0,0,0,0,0,0,0,47,108,140,116,52,36,84,108,103,92,132,116,60,0,0,0,52,84,92,15,12,44,108,68,52,76,71,20,0,12,68,148,156,108,68,68,39,12,20,39,60,84,100,100,76,39,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,12,52,111,132,108,44,20,60,100,100,79,108,124,92,20,0,0,0,60,84,79,12,0,36,92,76,55,55,76,47,0,0,20,84,148,132,76,55,68,39,12,12,28,44,60,76,84,76,60,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,55,108,124,100,36,7,31,79,87,76,79,124,116,60,0,0,0,0,60,84,68,0,0,28,60,76,63,28,71,68,12,0,0,28,92,132,95,52,44,60,36,12,0,20,36,39,52,76,79,63,36,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,60,108,111,87,36,0,15,55,68,68,60,100,119,95,20,0,0,0,0,60,87,55,0,0,20,31,84,63,20,60,68,39,0,0,0,28,92,111,76,39,36,60,36,12,0,12,20,28,36,55,68,68,52,23,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,60,108,108,76,28,0,7,44,63,60,60,68,111,116,60,0,0,0,0,0,55,76,31,0,0,12,20,76,60,36,28,68,60,7,0,0,0,36,92,103,63,31,36,55,36,12,0,0,12,20,28,36,52,63,52,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,52,92,92,68,28,0,0,31,60,52,52,52,84,116,92,20,0,0,0,0,0,52,60,7,0,0,0,12,52,60,52,0,60,68,31,0,0,0,7,44,92,95,52,23,31,52,36,12,0,0,0,12,12,20,39,52,52,39,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,44,79,76,60,20,0,0,20,52,52,44,52,60,100,108,55,0,0,0,0,0,12,52,52,0,0,0,0,12,28,60,60,0,31,63,55,0,0,0,0,12,52,92,92,44,20,28,47,31,12,0,0,0,0,0,12,20,36,44,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,63,60,52,20,0,0,12,44,52,39,44,47,71,108,92,20,0,0,0,0,0,23,52,52,0,0,0,0,0,12,60,60,23,0,52,60,23,0,0,0,0,20,55,87,79,36,12,23,44,36,12,0,0,0,0,0,0,7,20,28,36,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,52,47,36,20,0,0,0,36,52,36,36,44,44,84,100,52,0,0,0,0,0,0,36,52,52,0,0,0,0,0,0,52,55,44,0,28,52,39,0,0,0,0,0,20,60,79,68,28,7,20,44,31,12,0,0,0,0,0,0,0,0,20,15,20,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,39,44,36,20,0,0,0,28,52,36,28,39,36,60,95,76,15,0,0,0,0,0,0,44,47,44,0,0,0,0,0,0,28,52,52,0,0,39,44,15,0,0,0,0,0,28,63,76,60,23,0,20,36,28,12,0,0,0,0,0,0,0,0,0,12,20,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,28,20,20,15,0,0,0,20,44,44,20,31,36,36,76,92,44,0,0,0,0,0,0,0,44,44,36,0,0,0,0,0,0,7,52,52,12,0,20,36,28,0,0,0,0,0,0,28,63,68,47,20,0,15,28,28,12,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,12,0,0,0,0,0,12,36,44,20,20,36,28,44,84,68,15,0,0,0,0,0,0,0,44,44,28,0,0,0,0,0,0,0,47,52,28,0,0,36,36,12,0,0,0,0,0,12,31,60,63,39,15,0,12,28,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,28,44,23,12,28,28,28,68,79,39,0,0,0,0,0,0,0,0,36,36,12,0,0,0,0,0,0,0,31,47,44,0,0,20,31,23,0,0,0,0,0,0,12,36,60,55,36,12,0,12,28,23,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,7,0,0,0,0,0,0,0,20,39,28,7,20,28,20,36,76,60,12,0,0,0,0,0,0,0,0,28,28,0,0,0,0,0,0,0,0,12,44,44,0,0,0,28,28,7,0,0,0,0,0,0,15,28,44,47,28,7,0,12,20,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,12,0,0,0,0,0,0,0,12,36,31,12,12,28,20,15,52,68,36,0,0,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,44,44,15,0,0,20,28,20,0,0,0,0,0,0,0,12,28,44,44,23,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,7,28,36,12,0,15,20,12,31,68,52,12,0,0,0,0,0,0,0,0,0,15,15,0,0,0,0,0,0,0,0,0,36,44,36,0,0,0,23,23,0,0,0,0,0,0,0,0,20,31,36,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,20,0,0,12,0,12,52,60,31,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,20,44,44,0,0,0,15,20,12,0,0,0,0,0,0,0,0,12,28,28,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,20,0,0,12,12,0,28,60,44,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,39,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,12,23,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,15,0,0,12,12,0,12,44,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,36,20,0,0,0,12,15,7,0,0,0,0,0,0,0,0,7,12,20,20,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,12,0,0,7,0,0,23,47,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,36,31,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,7,15,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,0,0,0,0,0,0,7,31,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,36,36,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,15,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,15,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};\n  const uint8_t SHINE_TEXTURE_5[16384] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,7,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,15,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,15,0,0,0,0,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,12,0,0,0,0,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,7,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,31,0,0,0,0,12,20,20,0,0,0,0,0,0,0,0,0,0,12,7,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,36,0,0,0,0,20,20,20,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,20,20,0,0,0,0,23,23,7,0,0,0,0,0,0,0,0,7,15,12,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,12,0,0,0,0,0,0,0,36,36,0,0,0,0,0,0,0,0,0,20,20,0,0,0,0,0,12,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,15,12,7,0,0,0,0,0,0,7,36,36,0,0,0,0,0,0,0,0,12,20,12,0,0,0,0,12,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,28,28,0,0,0,23,36,36,0,12,12,0,0,0,0,0,20,20,0,0,0,0,12,28,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,12,0,0,0,0,7,12,7,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,44,44,0,0,0,36,36,28,0,12,12,0,0,0,0,15,28,20,0,0,0,0,28,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,20,12,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,12,23,15,15,0,39,39,0,0,0,39,39,20,12,12,12,0,0,0,0,28,28,7,0,0,0,20,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,15,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,7,20,44,28,28,0,44,44,0,0,0,44,44,0,12,12,0,0,0,0,20,28,20,0,0,0,15,36,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,12,28,44,36,12,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,12,28,31,31,0,44,44,0,0,12,44,47,0,12,12,0,0,0,7,31,36,7,0,0,12,36,36,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,47,31,12,0,0,12,28,20,0,0,0,0,0,0,0,0,0,15,20,36,36,0,52,52,0,0,31,52,52,20,20,15,0,0,0,23,36,23,0,0,0,28,44,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,52,52,28,0,0,0,23,28,12,0,0,0,0,0,0,0,0,23,28,39,28,0,52,52,0,0,44,60,47,28,23,0,0,0,12,36,36,12,0,0,23,44,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,60,52,20,0,0,12,28,23,0,0,0,0,0,0,0,0,23,23,47,28,0,52,52,0,0,60,76,55,31,31,0,0,0,28,44,28,0,0,20,44,39,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,20,52,60,52,20,0,0,28,36,15,0,0,0,0,0,0,0,23,28,68,39,0,52,52,0,0,76,84,63,36,31,0,0,12,44,44,12,0,12,39,52,36,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,7,0,0,0,0,0,0,0,0,7,23,60,68,44,12,0,15,36,31,0,0,0,0,0,0,0,20,28,76,44,12,55,55,0,20,92,92,60,36,20,0,0,36,44,28,0,0,36,52,44,31,28,12,0,0,0,0,0,0,0,0,0,0,0,0,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,0,0,0,0,0,0,15,20,15,31,68,71,36,7,0,28,36,20,0,0,0,0,0,0,12,36,84,44,23,60,60,0,44,92,92,52,39,0,0,15,52,47,12,0,28,60,60,47,36,12,12,20,12,0,0,0,0,0,0,0,0,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,0,0,0,0,0,12,23,28,20,0,0,0,0,15,31,23,23,44,79,76,28,0,15,44,39,7,0,0,0,0,0,0,39,92,47,36,55,52,0,76,108,100,44,39,0,0,36,52,31,0,20,52,71,63,47,20,15,31,31,12,0,0,0,0,0,0,12,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,7,0,0,0,12,31,44,31,12,0,0,0,20,39,28,28,60,87,68,23,0,31,44,28,0,0,0,0,0,0,44,92,55,44,55,52,20,108,119,100,44,28,0,20,52,52,12,7,44,76,79,60,36,20,36,44,20,0,0,0,0,0,7,20,28,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,20,15,0,0,0,12,36,55,44,20,0,0,0,28,44,31,36,76,95,60,15,12,44,44,12,0,0,0,0,0,44,92,71,52,60,52,36,124,132,95,44,12,0,44,60,36,0,36,76,92,76,39,28,44,47,20,0,0,0,0,0,15,28,36,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,23,23,12,0,0,12,36,60,60,31,0,0,0,28,44,36,52,92,100,47,7,36,52,36,0,0,0,0,0,44,87,87,63,63,52,60,135,148,76,47,0,20,60,55,12,28,76,108,100,60,39,52,63,31,0,0,0,0,7,23,36,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,28,28,12,0,0,31,60,68,44,12,0,7,28,52,52,68,108,95,36,20,52,55,36,12,0,0,0,44,84,103,71,63,47,79,140,148,60,39,0,47,60,36,15,60,111,119,84,60,63,84,47,12,0,0,0,15,36,44,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,31,36,23,12,0,23,52,71,52,20,0,12,39,68,68,87,116,92,28,36,55,63,28,12,0,0,36,76,108,76,60,52,100,140,140,55,20,23,68,60,20,52,108,132,108,84,84,92,60,20,0,0,0,28,44,44,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,36,20,0,15,47,76,60,28,0,12,47,76,84,111,132,87,31,52,71,52,28,0,0,20,76,116,84,68,63,116,156,119,55,7,52,68,47,44,108,143,132,100,92,92,60,20,0,0,20,36,52,44,20,0,0,0,0,0,0,0,0,0,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,44,36,20,12,44,71,71,44,12,15,55,92,100,135,132,68,44,63,84,47,28,0,7,84,132,108,71,84,127,172,100,52,28,68,68,60,111,164,159,124,100,100,52,12,0,0,28,52,52,36,12,0,0,0,0,0,0,0,12,20,12,12,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,44,47,36,28,36,68,76,52,20,20,63,100,119,148,124,60,60,84,79,44,12,0,76,140,124,68,100,132,180,84,36,52,68,68,100,172,188,156,124,116,71,20,0,15,44,60,52,28,0,0,0,0,0,12,20,28,36,28,23,23,20,15,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,52,52,39,44,68,84,63,28,28,68,108,140,156,108,68,76,108,68,31,0,68,140,164,92,116,148,164,68,44,68,84,100,180,212,180,156,140,95,36,12,28,52,60,44,20,0,0,0,12,20,28,44,44,36,39,44,36,23,20,28,20,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,55,63,60,60,68,92,76,44,36,71,119,156,148,100,79,100,108,60,12,60,140,199,116,132,172,148,68,60,84,108,164,223,212,180,156,108,44,23,44,63,60,36,12,0,0,15,28,44,55,52,47,52,55,44,36,44,44,28,20,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,63,76,76,92,95,87,52,52,76,132,164,148,103,100,140,108,47,52,140,228,143,148,196,132,79,76,116,156,223,244,220,172,116,52,39,60,68,52,28,0,7,20,39,60,71,68,68,68,63,52,55,60,52,36,20,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,60,84,100,108,111,103,68,60,84,148,180,140,111,135,148,84,52,140,236,164,167,196,124,92,108,151,207,252,244,204,124,68,60,68,68,44,15,7,23,52,71,84,84,84,84,76,71,76,68,52,36,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,44,79,103,124,132,124,87,79,108,180,196,151,140,175,127,68,127,228,180,183,196,140,116,156,196,244,247,212,143,92,79,84,68,36,20,36,68,84,100,103,108,100,95,92,84,71,52,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,63,100,140,159,148,111,95,135,196,196,164,183,164,92,119,220,196,191,204,167,164,196,231,247,212,156,108,100,92,60,39,44,84,108,124,132,132,124,124,116,100,76,47,36,20,0,0,0,0,0,0,0,0,12,15,20,20,20,15,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,39,92,132,172,175,148,124,164,204,196,188,196,127,127,204,228,220,228,204,212,223,247,212,164,124,103,84,68,68,100,132,156,167,180,167,159,140,116,84,60,36,7,0,0,0,0,15,28,36,36,39,44,47,39,31,28,20,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,12,20,23,28,44,76,116,164,196,180,159,183,204,212,212,159,156,191,244,239,244,236,239,239,220,180,140,108,95,92,111,151,188,204,212,188,172,143,119,87,60,28,7,0,20,36,60,68,79,84,76,60,52,52,47,47,28,23,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,15,12,20,12,12,15,23,36,47,68,92,119,156,196,199,188,204,220,236,204,183,196,252,252,252,252,247,228,191,148,124,124,132,164,207,236,223,196,164,140,108,71,52,36,44,60,79,92,100,100,100,103,100,95,84,60,36,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,15,12,20,23,36,36,44,52,55,60,76,100,127,164,191,204,212,228,244,236,220,220,252,252,252,252,244,212,175,156,159,172,212,231,215,180,148,124,108,92,79,84,92,116,124,132,140,148,140,119,108,92,60,36,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,23,36,36,44,44,52,76,108,132,140,156,180,212,223,236,247,252,244,244,252,252,252,252,244,220,196,196,212,212,196,180,164,148,132,124,127,143,164,175,180,183,175,159,135,116,84,39,23,28,20,7,0,0,0,0,0,0,0,12,12,0,0,0,0,0,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,44,47,52,63,92,143,188,204,215,236,247,252,252,252,252,252,252,252,252,247,236,228,236,228,207,196,180,167,172,188,204,215,228,236,223,199,172,132,116,116,108,84,52,44,52,44,44,36,28,12,0,20,28,28,23,20,0,0,0,0,0,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,39,55,76,108,140,172,196,223,244,252,252,252,252,252,252,252,252,252,252,244,228,212,212,228,244,247,244,236,215,204,196,180,159,124,87,68,79,76,60,52,44,47,44,39,36,28,12,0,20,28,28,23,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,92,132,167,212,244,252,252,252,252,252,252,252,252,252,252,252,244,239,231,228,220,204,196,183,172,156,148,135,116,100,92,92,87,84,79,68,52,36,28,20,15,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,23,39,60,76,92,116,143,172,180,196,220,244,252,252,252,252,252,239,228,223,239,252,244,220,183,151,132,108,92,76,68,60,52,39,36,36,36,36,36,36,36,31,28,20,12,12,12,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,44,60,76,92,108,124,140,159,175,191,212,236,252,252,252,252,252,252,252,252,252,252,239,215,188,164,164,180,172,156,132,108,87,84,84,76,76,60,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,44,60,79,92,100,116,132,151,164,180,191,220,236,252,252,247,236,231,236,244,252,252,252,252,252,252,252,252,244,212,172,148,127,103,92,103,116,116,116,111,100,87,84,76,71,47,44,44,28,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,23,52,60,68,92,100,100,108,132,148,156,172,180,188,196,212,212,231,244,236,212,199,188,188,204,231,239,236,236,252,252,252,252,252,247,236,204,164,132,108,71,44,36,36,36,36,36,47,60,63,68,47,44,44,28,20,20,20,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,20,36,47,55,63,84,84,92,127,148,143,140,124,124,132,140,140,140,148,172,191,199,180,172,159,140,132,156,188,204,204,204,228,252,252,244,236,236,247,223,196,180,164,140,119,84,36,7,0,12,12,15,12,0,0,0,0,12,12,15,20,20,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,20,28,36,36,39,44,55,76,92,108,103,87,79,71,76,92,95,100,92,84,100,127,148,148,132,127,124,108,92,100,124,151,180,172,156,188,228,244,236,236,212,212,236,228,196,172,156,140,124,111,95,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,20,15,20,28,36,44,60,60,55,52,44,36,52,68,76,68,60,52,47,63,84,100,103,95,87,87,84,76,60,68,76,95,124,148,148,124,151,212,223,223,220,228,196,188,207,239,207,172,156,132,108,92,92,92,76,44,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,23,28,28,23,20,20,28,36,44,52,44,28,28,31,36,39,52,60,68,68,68,68,68,60,52,44,52,44,52,76,108,124,124,100,116,180,220,204,204,196,204,188,148,159,228,228,188,143,127,119,92,71,68,76,76,68,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,20,20,12,15,15,23,20,20,28,23,28,44,55,55,60,55,47,36,36,36,39,28,20,28,63,84,100,111,84,76,127,212,196,180,196,188,180,196,119,111,196,223,196,156,100,87,92,84,52,47,60,76,76,60,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,20,12,12,36,47,52,52,52,44,28,20,20,28,31,23,12,0,28,52,68,79,100,84,55,84,172,220,164,164,204,175,164,212,124,76,148,199,188,164,132,68,55,76,92,60,31,36,60,71,68,52,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,44,44,47,44,28,12,0,12,20,23,20,7,0,0,23,44,47,55,76,84,44,52,124,196,204,140,148,223,164,124,196,124,60,100,180,180,156,143,108,52,36,68,84,63,28,12,36,60,68,68,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,39,44,44,36,15,0,0,0,0,12,12,0,0,0,0,28,44,39,36,52,68,44,36,84,148,199,172,124,140,231,156,84,164,116,68,52,148,188,148,140,132,92,44,20,47,76,68,36,7,12,36,60,63,60,39,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,31,36,36,36,20,0,0,0,0,0,0,0,0,0,0,0,7,23,39,28,28,36,52,28,12,60,108,156,188,132,103,143,228,143,55,119,108,87,20,100,172,164,119,124,124,76,28,0,31,63,71,44,15,0,12,39,60,60,55,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,28,28,28,31,23,12,0,0,0,0,0,0,0,0,0,0,0,0,12,23,36,20,20,31,47,28,0,36,84,124,159,164,95,92,151,212,140,52,92,111,100,12,47,132,167,132,100,111,111,68,23,0,20,52,68,52,20,0,0,15,44,60,55,52,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,20,23,28,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,28,15,12,28,44,28,0,20,68,100,116,172,140,68,95,164,188,132,44,68,116,100,31,12,84,148,132,100,92,103,100,60,20,0,12,44,68,60,28,0,0,0,20,44,52,52,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,12,12,0,20,39,28,0,0,44,76,100,124,156,108,52,100,172,172,124,44,47,108,100,52,0,36,95,132,95,84,84,95,87,52,12,0,0,31,60,60,36,12,0,0,0,20,44,52,44,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,15,31,20,0,0,28,68,84,92,148,135,68,52,100,180,164,116,36,36,92,84,55,0,12,63,108,103,79,68,84,84,76,44,0,0,0,20,47,60,44,15,0,0,0,0,20,39,39,36,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,20,0,0,12,52,71,76,100,140,108,36,68,100,180,159,111,20,20,60,76,68,0,0,36,76,108,76,68,63,76,68,63,31,0,0,0,12,36,55,44,20,0,0,0,0,0,20,31,31,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,0,0,0,36,60,71,68,116,124,76,12,84,108,151,148,92,12,12,39,68,68,12,0,12,52,84,84,68,55,60,60,52,52,23,0,0,0,0,28,52,52,28,0,0,0,0,0,0,20,28,28,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,55,60,60,79,116,100,44,12,92,111,127,140,76,12,15,28,52,52,12,0,0,28,52,79,68,55,47,60,44,39,44,20,0,0,0,0,20,44,52,28,12,0,0,0,0,0,0,20,23,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,55,52,47,92,108,71,20,15,79,108,108,127,68,15,28,28,44,47,15,0,0,7,44,63,76,60,44,52,52,36,36,36,12,0,0,0,0,12,31,44,36,12,0,0,0,0,0,0,0,12,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,52,52,44,60,92,92,44,0,31,76,108,100,124,68,0,20,20,28,31,20,0,0,0,28,44,68,60,47,36,52,39,28,31,28,7,0,0,0,0,0,28,44,36,20,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,44,52,36,36,76,87,71,28,0,44,68,108,95,116,68,0,0,0,20,28,28,0,0,0,7,44,52,60,55,36,31,47,28,20,20,7,0,0,0,0,0,0,20,36,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,52,36,28,44,71,87,44,7,0,52,63,100,100,108,63,0,0,0,7,20,20,0,0,0,0,28,39,52,52,52,23,36,44,20,0,12,7,0,0,0,0,0,0,12,28,36,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,44,44,28,28,60,71,68,28,0,0,44,47,84,108,92,60,0,0,0,0,20,20,0,0,0,0,7,36,39,52,52,36,15,36,36,12,7,20,12,0,0,0,0,0,0,0,20,31,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,44,28,20,36,60,76,44,15,0,12,47,44,63,108,76,52,0,0,0,0,20,20,0,0,0,0,0,20,36,39,44,47,20,20,36,28,12,12,15,0,0,0,0,0,0,0,0,12,28,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,28,15,20,44,52,60,20,0,0,7,31,31,52,108,68,44,0,0,0,0,12,12,0,0,0,0,0,0,31,31,36,47,36,7,20,36,20,0,0,0,0,0,0,0,0,0,0,0,12,15,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,36,15,20,23,52,55,36,12,0,0,12,28,36,44,108,60,36,0,0,0,0,0,12,12,0,0,0,0,0,20,28,28,36,44,20,0,28,31,12,0,0,0,0,0,0,0,0,0,0,0,0,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,36,20,7,12,31,44,52,15,0,0,0,7,20,36,44,103,60,28,0,0,0,0,0,7,7,0,0,0,0,0,0,28,28,28,44,36,7,12,28,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,28,0,12,12,39,44,36,12,0,0,0,12,12,39,39,100,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,20,28,39,28,0,12,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,12,0,0,20,36,44,12,0,0,0,0,12,12,44,36,95,55,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,15,36,36,12,0,12,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,20,0,0,0,28,36,28,0,0,0,0,0,0,0,39,36,92,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,12,20,36,28,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,23,0,0,0,7,31,36,12,0,0,0,0,0,0,0,36,44,76,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,12,28,36,12,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,23,12,0,0,0,20,28,28,0,0,0,0,0,0,0,0,28,39,68,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,7,12,28,28,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,15,0,0,0,0,28,28,12,0,0,0,0,0,0,0,0,15,36,55,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,12,28,23,0,0,0,0,0,0,0,0,0,12,39,52,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,20,23,12,0,0,0,0,0,0,0,0,7,28,60,52,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,12,20,60,47,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,12,0,0,0,0,0,0,0,0,0,0,7,52,47,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,52,47,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,7,0,0,0,0,0,0,0,0,0,0,12,12,55,44,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,12,12,52,44,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,31,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};\n  const uint8_t SHINE_TEXTURE_6[16384] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,23,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,44,0,0,0,0,0,0,0,7,12,7,0,7,7,0,0,0,0,7,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,44,44,0,0,0,0,0,0,0,12,12,0,0,7,7,0,0,0,0,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,36,36,0,0,0,0,0,0,0,12,12,0,12,12,7,0,0,0,12,20,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,31,0,0,12,12,0,0,0,12,12,0,12,12,0,0,0,0,20,23,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,47,20,0,28,28,0,0,12,20,20,0,20,20,0,0,0,12,23,20,0,0,0,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,76,44,0,44,39,7,0,20,20,20,20,28,23,0,0,0,23,28,12,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,7,0,0,0,68,84,60,0,39,36,0,0,23,23,15,20,20,12,0,0,12,28,28,0,0,0,12,12,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,60,76,63,0,36,28,0,0,28,28,20,28,28,0,0,0,28,31,15,0,0,15,20,7,0,0,0,0,0,0,0,0,0,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,28,12,0,0,0,0,0,0,0,0,0,0,0,0,15,15,0,0,0,52,76,68,12,44,28,0,0,28,28,28,36,28,0,0,12,36,36,0,0,12,23,15,0,0,0,0,0,0,0,0,12,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,36,28,7,0,0,0,0,0,0,0,0,0,0,0,12,12,7,0,0,44,84,76,20,52,36,0,12,31,28,44,44,28,0,0,28,36,20,0,7,28,28,0,0,0,0,0,0,0,0,12,20,12,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,39,28,0,0,0,0,0,0,0,0,0,0,0,12,20,20,0,0,39,92,92,20,68,44,12,31,44,44,47,47,12,0,12,36,36,0,0,23,31,15,0,0,0,0,0,0,0,20,28,12,0,0,0,0,7,12,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,44,28,0,0,0,0,0,0,0,0,0,0,0,28,28,0,0,36,95,95,28,79,60,20,44,47,55,52,52,0,0,31,44,28,0,20,36,28,0,0,0,0,0,0,0,20,31,15,0,0,0,0,7,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,31,44,23,0,0,0,0,0,0,0,0,0,0,31,31,12,0,28,100,100,44,84,60,20,60,60,63,52,44,0,12,44,44,12,12,36,36,12,0,0,0,0,0,12,28,36,20,0,0,0,0,20,23,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,39,44,20,0,0,0,0,0,0,0,0,0,28,36,28,0,15,100,100,60,87,60,23,60,63,60,52,23,0,36,47,36,0,28,39,20,0,0,0,0,0,12,31,39,20,0,0,0,12,20,23,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,44,20,0,0,0,0,0,0,0,0,12,36,36,0,7,100,100,68,84,52,36,68,79,60,55,0,12,47,47,12,20,44,36,0,0,0,0,0,12,36,44,23,0,0,0,20,36,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,0,0,0,0,0,0,0,0,0,23,52,44,20,0,0,0,0,0,0,0,0,39,39,12,0,95,100,84,84,52,52,68,100,60,55,0,36,52,36,12,39,44,20,0,0,0,0,12,36,44,23,0,0,12,28,39,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,7,0,0,0,0,0,0,0,0,28,60,44,15,0,0,0,0,0,0,0,36,44,28,0,87,100,95,95,60,68,76,111,71,44,12,52,55,20,31,52,28,0,0,0,0,15,36,44,20,0,0,20,36,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,12,0,0,0,0,0,0,0,0,36,68,44,20,0,0,0,0,0,0,23,44,44,0,79,100,111,111,68,68,92,116,84,36,36,60,44,28,52,44,12,0,0,0,20,44,44,20,0,7,28,44,52,36,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,28,12,0,0,0,0,0,0,12,44,68,55,28,7,0,0,0,0,7,52,52,0,68,100,124,132,100,76,119,124,92,28,55,60,36,47,55,23,0,0,0,28,47,52,28,0,15,36,60,52,39,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,20,31,36,20,7,0,0,0,0,0,20,52,79,63,28,0,0,0,0,0,52,55,28,60,100,132,124,108,84,143,124,87,52,60,52,44,60,39,0,0,0,28,52,52,28,0,28,52,68,60,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,20,12,0,0,0,0,0,12,28,36,36,15,0,0,0,0,0,23,68,87,68,23,0,0,0,0,47,63,52,47,100,143,124,124,108,188,135,84,63,68,52,60,55,20,12,12,28,55,60,28,12,36,68,76,63,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,20,23,23,15,0,0,0,0,7,28,44,44,28,7,0,0,0,0,31,76,92,68,20,0,0,0,36,76,71,44,100,151,124,135,135,204,132,84,68,71,60,63,31,12,28,52,68,60,31,23,52,84,84,60,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,28,31,20,7,0,0,0,28,52,55,36,20,7,0,0,0,39,92,100,60,12,0,0,15,84,87,60,100,156,124,148,175,212,127,84,71,76,71,52,28,36,68,79,68,36,36,68,92,84,55,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,31,36,36,28,12,0,0,28,52,68,55,31,7,0,12,20,52,108,108,52,7,0,0,79,100,84,108,156,124,164,199,188,132,79,92,76,76,47,52,76,84,63,52,52,92,108,84,44,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,39,39,31,20,12,23,52,76,76,44,28,20,28,31,68,124,111,47,0,0,60,100,108,116,159,140,180,220,172,127,92,100,87,76,60,92,95,71,60,76,116,116,76,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,39,44,47,39,28,20,52,84,92,71,52,44,36,44,87,140,111,36,0,28,95,124,140,175,167,196,220,164,116,116,108,108,87,108,108,84,76,103,132,116,68,23,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,44,52,52,47,44,47,76,100,92,76,60,52,63,116,148,100,23,0,84,140,180,199,196,212,204,164,116,135,124,124,135,132,108,100,127,143,108,55,20,12,15,7,0,12,12,12,12,0,0,0,0,7,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,52,52,60,60,60,76,103,119,108,79,68,84,140,148,79,12,63,140,212,228,228,223,204,164,151,151,164,164,167,148,135,140,140,92,44,23,20,20,28,31,31,23,20,12,12,20,28,20,20,15,7,12,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,52,60,68,76,92,116,135,132,108,92,116,164,140,60,44,127,220,244,244,236,212,180,191,196,207,196,188,172,151,124,84,47,36,36,47,52,44,36,28,36,39,39,36,28,28,20,20,20,15,20,12,20,20,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,20,15,20,7,0,0,0,0,0,0,31,60,76,84,108,132,143,148,140,140,164,191,132,60,108,207,252,252,244,231,220,228,244,239,223,188,151,116,76,55,60,76,79,68,60,68,71,60,44,36,36,39,52,55,60,60,55,44,44,36,31,23,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,23,28,36,44,52,52,44,28,12,0,0,12,44,76,100,116,148,164,167,172,196,220,204,116,119,188,252,252,252,247,244,244,252,236,196,156,124,92,87,111,124,116,116,116,92,68,60,68,84,95,100,95,92,84,84,79,60,44,39,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,31,44,60,63,76,79,92,84,68,44,28,28,60,92,124,159,191,204,212,236,244,191,172,196,252,252,252,252,252,252,236,212,175,148,140,156,172,175,172,151,140,127,132,132,132,119,103,100,95,95,92,84,76,55,31,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,12,0,12,20,20,12,0,0,0,0,0,12,28,44,68,76,92,92,95,95,95,92,87,87,108,124,148,188,228,247,252,236,220,223,252,252,252,252,252,247,231,204,188,196,207,220,228,228,212,188,172,148,124,108,100,100,95,84,68,47,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,28,28,20,0,0,12,28,44,44,28,31,44,52,44,44,36,36,44,44,47,47,47,52,52,68,84,100,103,103,116,116,116,127,148,164,183,204,231,247,252,244,244,252,252,252,252,252,247,236,231,236,244,244,231,212,180,143,119,108,103,92,68,52,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,15,20,15,0,0,0,12,36,44,39,47,68,76,79,84,79,92,124,140,135,132,140,143,140,132,124,119,119,132,164,175,196,212,212,196,191,207,231,247,252,252,252,252,252,252,252,252,252,252,236,220,188,164,140,116,100,84,68,47,28,20,15,15,15,15,15,20,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,0,0,0,0,20,31,36,36,36,39,39,44,44,63,92,116,124,132,151,164,164,164,156,156,151,148,151,164,204,231,252,252,252,244,244,247,252,252,252,252,252,252,252,252,252,252,228,191,156,124,92,71,60,60,60,52,47,44,44,36,36,28,23,28,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,23,20,44,76,87,71,76,100,119,132,156,172,180,183,199,220,236,244,247,247,252,252,252,252,252,252,252,252,252,236,212,164,124,84,60,52,47,44,36,28,28,20,15,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,12,0,20,47,60,39,44,60,84,108,132,148,164,180,199,204,196,191,207,236,252,252,252,252,252,252,252,252,252,252,236,196,156,108,76,60,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,12,0,12,20,31,44,60,79,100,124,148,167,180,172,164,148,148,164,204,228,244,244,252,252,252,247,228,223,236,252,252,239,220,183,148,108,76,60,52,47,39,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,52,71,92,108,140,172,191,204,191,167,135,108,92,92,116,164,220,220,220,236,252,244,244,247,220,188,180,212,236,228,215,204,204,188,164,135,100,71,52,44,44,36,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,36,60,68,84,108,140,180,204,204,188,156,132,100,68,44,47,68,108,164,212,199,180,196,244,252,228,228,252,231,175,124,132,167,191,188,188,188,188,175,151,116,103,103,92,68,44,36,36,23,20,20,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,28,60,100,132,164,175,172,156,143,116,92,60,28,7,20,47,76,108,156,204,196,148,151,207,252,252,196,199,244,236,196,119,71,76,116,140,143,140,148,148,148,143,132,100,68,60,68,71,60,36,20,20,20,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,52,84,108,124,116,116,116,108,84,55,23,0,0,0,31,60,76,108,148,196,204,140,108,164,236,247,236,164,172,212,231,196,156,79,36,36,76,108,124,111,100,108,103,87,92,108,103,76,52,47,44,44,36,23,15,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,44,52,71,84,87,92,87,76,60,36,12,0,0,0,0,20,44,60,71,92,143,204,212,148,76,108,188,231,228,220,148,148,172,220,196,172,124,60,12,15,47,76,100,103,84,68,84,87,76,68,76,92,84,60,44,39,36,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,23,36,55,68,71,76,68,55,39,23,0,0,0,0,0,0,12,28,52,55,60,79,140,212,220,148,60,68,127,188,212,204,204,148,119,148,196,191,172,148,100,52,7,0,28,60,76,84,84,60,52,60,68,68,60,60,68,68,60,44,36,36,31,28,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,20,23,39,36,44,60,47,36,28,15,0,0,0,0,0,0,0,0,20,39,47,47,44,63,132,204,223,156,63,36,95,148,156,196,183,188,156,95,116,180,172,164,159,116,87,44,0,0,7,36,60,68,76,63,44,36,44,52,60,55,52,52,52,47,39,31,28,28,23,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,20,23,28,28,36,20,20,20,12,0,0,0,0,0,0,0,0,0,12,28,39,44,31,36,60,124,188,212,164,68,15,60,116,140,124,188,175,172,167,87,79,148,156,156,148,132,95,76,36,0,0,0,20,44,60,60,55,44,36,31,28,28,39,47,47,44,44,36,28,23,23,20,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,20,20,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,15,31,36,36,20,23,60,111,164,196,164,76,12,28,92,111,100,119,183,172,159,172,92,47,111,148,124,132,135,95,84,71,28,0,0,0,0,28,52,55,52,44,31,28,23,20,20,28,39,44,44,44,36,23,12,7,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,28,31,20,12,20,63,100,143,172,156,79,20,0,60,92,84,60,124,188,164,140,180,100,20,84,148,108,116,127,108,76,76,63,23,0,0,0,0,12,36,52,52,36,28,20,20,20,12,0,12,28,39,39,36,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,20,12,0,20,60,92,132,156,143,79,20,0,28,76,76,44,44,132,188,140,124,183,108,12,68,116,116,100,100,124,79,60,76,55,20,0,0,0,0,0,20,36,47,44,28,15,12,12,12,0,0,0,15,31,36,36,31,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,12,0,0,20,60,84,116,140,140,84,23,0,0,60,76,44,28,52,127,183,111,103,188,116,12,44,84,132,84,79,108,103,52,52,76,47,12,0,0,0,0,0,0,20,39,44,31,15,0,7,0,0,0,0,0,0,20,31,31,28,28,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,7,12,44,68,95,124,132,84,28,0,0,28,68,60,12,20,68,127,183,92,87,183,116,20,15,68,124,84,76,76,108,76,39,47,71,44,7,0,0,0,0,0,0,12,28,36,36,23,7,0,0,0,0,0,0,0,0,12,20,28,28,20,15,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,55,79,116,119,84,28,0,0,0,55,68,36,0,12,79,132,167,76,76,180,108,31,0,60,87,108,68,55,84,95,52,31,47,68,36,0,0,0,0,0,0,0,0,15,28,36,28,12,0,0,0,0,0,0,0,0,0,0,12,20,15,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,36,55,71,100,108,84,31,0,0,0,28,63,55,0,0,7,92,135,140,60,68,167,100,39,0,39,68,108,68,52,60,92,76,36,28,52,60,28,0,0,0,0,0,0,0,0,0,20,28,28,20,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,60,92,103,84,36,0,0,0,7,52,60,28,0,0,15,92,135,108,60,68,159,92,47,0,12,60,92,76,60,36,68,84,52,20,20,52,55,23,0,0,0,0,0,0,0,0,0,7,20,23,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,63,92,87,36,0,0,0,0,31,60,52,0,0,0,28,95,140,84,55,68,156,92,52,0,0,55,68,92,63,36,44,76,71,36,12,23,52,52,20,0,0,0,0,0,0,0,0,0,0,12,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,31,68,84,36,0,0,0,0,12,52,60,23,0,0,0,52,84,132,63,44,60,140,95,55,0,0,36,60,87,60,52,20,55,76,52,23,0,28,52,44,12,0,0,0,0,0,0,0,0,0,0,0,7,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,12,20,52,76,39,0,0,0,0,0,36,55,44,0,0,0,0,60,76,108,52,28,44,103,84,55,0,0,12,55,68,68,60,20,36,60,60,28,12,0,28,52,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,15,15,28,52,36,0,0,0,0,0,12,52,52,20,0,0,0,0,68,68,68,44,12,36,68,60,52,0,0,0,52,55,68,55,44,12,47,60,36,12,0,0,28,47,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,12,15,36,47,20,7,0,0,0,0,0,36,52,36,0,0,0,0,20,63,68,52,39,0,36,47,52,52,0,0,0,36,52,60,55,52,12,28,52,52,23,12,0,0,28,44,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,52,36,0,0,0,0,0,0,12,47,47,12,0,0,0,0,36,60,71,44,36,0,36,39,52,52,0,0,0,12,47,52,52,52,31,0,39,52,36,7,0,0,7,28,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,44,28,7,0,0,0,0,0,0,31,44,28,0,0,0,0,0,52,60,68,36,36,0,36,44,52,47,0,0,0,0,44,47,47,52,47,0,20,44,47,20,7,0,0,12,28,36,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,31,28,0,0,0,0,0,0,0,12,44,44,12,0,0,0,0,0,52,55,44,28,23,0,36,52,60,44,12,0,0,0,31,44,44,44,52,23,0,28,44,36,0,0,0,0,12,28,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,7,0,0,0,0,0,0,0,31,44,28,0,0,0,0,0,7,52,52,28,20,20,0,28,52,71,44,20,0,0,0,12,44,44,31,47,44,0,12,39,44,15,0,0,0,0,12,28,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,39,36,0,0,0,0,0,0,28,52,52,28,28,15,0,12,36,68,44,28,0,0,0,0,39,44,28,44,44,15,0,20,39,31,0,0,0,0,0,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,36,20,0,0,0,0,0,0,44,52,44,20,20,0,0,0,15,52,31,28,0,0,0,0,28,39,36,28,44,31,0,0,28,36,20,0,0,0,0,0,0,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,28,0,0,0,0,0,0,0,47,52,28,12,12,0,0,0,12,44,31,28,0,0,0,0,7,36,36,12,44,39,7,0,12,36,31,0,0,0,0,0,0,12,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,36,12,0,0,0,0,0,0,0,47,47,12,12,12,0,0,0,7,31,28,28,0,0,0,0,0,36,36,15,31,36,23,0,0,20,31,20,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,28,0,0,0,0,0,0,0,12,47,47,0,12,12,0,0,0,0,28,36,36,0,0,0,0,0,23,36,28,12,36,36,0,0,7,28,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,12,0,0,0,0,0,0,0,31,44,44,0,0,0,0,0,0,0,12,36,36,0,0,0,0,0,7,31,31,0,31,36,15,0,0,15,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,20,0,0,0,0,0,0,0,0,44,44,31,0,0,0,0,0,0,0,0,23,23,0,0,0,0,0,0,28,28,12,15,36,28,0,0,0,20,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,23,7,0,0,0,0,0,0,0,0,44,44,12,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,20,28,23,0,31,31,12,0,0,12,23,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,15,0,0,0,0,0,0,0,0,0,44,44,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,28,28,0,20,28,20,0,0,0,15,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,20,39,39,0,0,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,23,23,12,0,28,28,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,36,31,0,0,0,0,0,0,0,0,0,28,28,12,0,0,0,0,0,0,15,20,20,0,20,28,15,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,36,15,0,0,0,0,0,0,0,0,0,20,20,12,0,0,0,0,0,0,0,20,20,0,7,23,23,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,0,0,0,0,0,0,0,0,0,0,36,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,15,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,0,0,0,0,0,0,0,0,0,0,12,36,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,31,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,20,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};\n  const uint8_t SHINE_TEXTURE_7[16384] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,12,28,28,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,12,12,0,0,0,0,0,0,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,23,7,0,0,0,0,0,0,0,0,0,0,0,28,28,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,12,15,7,0,0,0,0,0,7,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,28,12,0,0,0,0,0,0,0,0,0,0,28,28,7,0,0,0,0,0,0,0,0,7,15,15,0,0,0,0,0,20,20,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,47,28,0,0,0,0,0,0,0,0,0,0,36,36,20,0,0,0,0,0,0,0,0,12,20,20,0,0,0,0,12,28,20,0,0,0,0,0,12,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,52,44,12,0,0,0,0,0,0,0,0,0,36,36,36,0,0,0,0,0,0,0,0,20,20,12,0,0,0,0,31,28,12,0,0,0,0,12,23,20,0,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,44,60,31,0,0,0,0,0,0,0,0,0,31,39,39,0,0,0,0,0,0,0,0,20,20,12,0,0,0,20,36,28,0,0,0,0,0,23,28,12,0,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,60,52,15,0,0,0,0,0,0,0,0,20,44,44,0,0,0,0,0,0,0,0,28,23,0,0,0,12,36,36,20,0,0,0,0,20,28,20,12,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,52,68,36,0,0,0,0,0,0,0,0,7,44,44,0,0,0,0,0,0,0,15,28,28,7,7,0,20,47,36,7,0,0,0,12,31,28,12,20,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,0,0,0,0,0,0,28,68,60,15,0,0,0,0,0,0,0,0,44,44,0,0,0,0,0,0,0,23,31,28,7,7,12,36,52,31,0,0,0,0,28,36,20,20,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,0,0,0,15,12,0,0,0,0,0,0,12,55,76,44,0,0,0,0,0,0,0,0,47,47,12,0,0,0,0,0,0,44,44,36,12,12,12,52,44,20,0,0,0,20,36,28,20,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,7,0,7,12,7,0,0,0,0,0,0,31,76,68,20,0,0,0,0,0,0,0,47,47,28,0,0,0,0,0,7,60,60,28,12,12,36,60,44,0,0,0,12,36,36,28,28,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,20,7,0,0,15,20,0,0,0,0,0,12,63,92,55,0,0,0,0,0,0,0,47,52,44,0,0,0,0,0,23,63,68,20,15,23,60,63,28,0,0,0,28,44,36,28,36,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,20,12,0,20,36,20,0,0,0,0,0,36,92,84,23,0,0,0,0,0,0,39,52,52,0,0,0,0,0,52,76,84,20,23,36,76,55,12,0,0,20,44,44,36,36,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,12,7,20,28,12,0,0,0,0,12,68,100,60,0,0,0,0,0,0,28,52,52,0,0,0,0,0,68,84,84,28,39,60,79,44,0,0,7,39,44,44,39,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,28,12,7,20,28,20,7,0,0,0,36,92,92,28,0,0,0,0,0,12,55,55,0,0,0,0,0,79,84,71,31,44,84,71,23,0,0,28,52,52,44,39,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,28,15,15,36,39,28,12,0,0,12,76,111,76,0,0,0,0,0,0,60,60,0,0,0,0,12,84,100,60,44,60,92,60,0,0,20,52,60,52,52,31,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,15,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,20,20,44,39,28,15,7,0,36,108,108,36,0,0,0,0,0,60,60,20,0,0,0,31,84,119,52,60,84,92,36,0,0,44,60,60,52,52,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,39,23,28,47,44,28,12,0,7,84,119,76,0,0,0,0,0,60,60,36,0,0,0,52,92,132,52,79,100,79,20,0,31,60,68,60,52,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,20,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,44,28,36,52,44,36,20,0,36,108,108,36,0,0,0,0,55,60,47,0,0,0,68,108,127,76,92,108,60,12,28,60,76,71,76,52,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,28,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,15,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,44,36,44,60,60,39,20,7,76,119,84,12,12,12,0,47,63,60,0,0,0,84,132,116,108,111,108,44,23,60,71,84,87,76,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,31,28,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,23,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,52,44,52,68,63,39,15,31,108,111,39,15,15,12,36,68,63,0,0,12,87,156,108,132,124,92,31,52,76,92,100,100,63,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,36,31,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,28,31,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,60,52,60,76,71,36,20,76,116,84,28,28,20,20,68,68,0,0,28,95,164,111,140,124,76,44,79,100,124,124,84,28,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,44,36,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,36,44,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,47,68,63,71,84,76,31,36,103,108,52,28,28,12,68,68,12,0,44,116,164,140,132,116,60,76,100,124,140,124,44,0,0,0,0,0,0,0,0,0,0,0,0,7,28,44,44,44,28,7,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,44,52,52,44,23,0,0,0,0,0,0,0,0,0,0,0,0,0,28,55,76,76,84,92,71,36,71,116,87,44,36,20,68,68,23,0,68,148,167,164,124,103,68,103,132,156,148,76,12,0,0,0,0,0,0,0,0,0,0,0,28,44,47,44,28,12,0,0,0,0,0,7,12,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,52,63,68,60,36,12,0,0,0,0,0,0,0,0,0,12,15,36,60,84,84,100,100,68,52,103,111,71,36,36,68,71,39,0,84,172,180,164,132,92,108,132,172,156,92,23,0,0,0,0,0,0,0,7,7,12,28,47,52,52,36,15,0,0,0,0,7,20,28,23,20,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,39,60,71,76,76,52,20,0,0,0,0,0,0,0,7,12,20,36,68,87,92,116,108,63,84,116,100,60,44,76,76,52,0,103,180,196,148,132,103,140,172,180,124,39,0,0,0,0,0,0,12,20,20,36,52,60,52,39,20,0,0,0,0,20,28,28,28,28,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,39,63,84,92,87,68,28,0,0,0,0,0,0,0,12,28,52,76,100,111,135,116,84,108,108,92,52,92,84,68,20,124,191,199,148,140,143,180,196,156,71,7,0,0,0,0,12,28,39,60,68,63,60,47,23,0,0,0,20,36,36,36,28,28,20,7,0,0,0,0,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,71,92,95,92,76,44,12,0,0,0,0,0,20,39,63,84,116,135,156,124,108,116,124,71,100,92,76,44,140,215,196,164,156,188,212,180,108,28,0,0,0,12,28,52,76,87,84,68,52,28,0,0,20,36,44,39,36,36,28,12,0,0,0,12,20,20,20,20,15,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,68,92,95,100,84,52,20,0,0,0,0,20,44,76,100,132,164,172,132,132,124,108,116,119,92,60,164,236,199,191,204,228,207,140,44,0,0,0,28,60,95,116,108,79,60,31,7,12,36,47,44,44,44,36,20,0,0,20,36,36,31,23,20,20,20,20,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,60,84,100,100,92,68,28,0,0,0,20,44,84,108,148,180,172,148,132,148,135,159,108,79,180,236,212,220,244,231,164,68,7,0,20,60,116,148,140,100,71,36,23,36,52,52,52,47,44,31,20,20,36,44,39,36,36,36,36,36,23,23,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,44,79,95,100,95,76,39,12,0,15,44,92,127,180,204,180,164,164,164,183,124,100,204,239,236,236,236,180,84,15,12,47,108,156,164,140,92,55,44,55,68,71,63,52,52,44,44,44,44,44,44,44,52,63,63,47,36,28,15,12,12,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,71,92,100,100,84,52,23,28,60,100,148,212,212,199,180,196,212,140,124,220,244,244,236,188,92,28,36,87,140,172,156,116,84,79,87,100,92,92,92,84,63,55,52,52,63,76,84,79,60,44,36,36,36,31,28,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,20,20,20,12,12,0,0,0,0,0,0,0,0,0,0,0,28,60,92,100,100,95,84,76,84,124,180,231,228,220,223,236,159,151,236,252,244,196,108,52,68,124,167,172,156,127,111,108,116,132,148,132,100,84,84,92,103,108,95,76,55,44,44,44,39,36,28,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,20,20,20,23,36,36,36,36,39,36,23,12,0,0,0,0,0,0,15,52,84,100,116,132,132,135,164,204,236,244,244,252,188,188,247,247,207,135,87,108,164,204,212,183,156,148,156,172,175,159,140,132,124,124,111,92,68,52,52,47,44,36,20,0,0,0,0,0,0,12,12,0,0,12,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,23,36,36,36,36,39,44,44,47,52,52,52,52,36,20,7,0,12,44,84,116,140,164,183,204,228,244,252,252,220,220,252,223,172,135,151,204,236,231,220,212,220,220,212,180,156,140,124,108,79,63,60,55,47,36,28,28,36,39,39,36,36,28,12,12,20,28,20,7,0,12,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,44,44,47,52,52,55,60,60,60,60,68,68,68,63,84,119,164,196,215,231,244,252,252,244,244,247,220,188,196,231,252,252,244,236,220,196,175,164,151,132,124,116,108,92,68,60,52,52,52,47,44,44,44,39,36,36,28,12,12,20,28,20,7,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,52,60,60,60,68,68,68,76,87,108,140,188,228,252,252,252,252,252,252,247,236,236,247,252,252,252,244,228,196,175,156,127,108,84,68,60,60,60,55,52,52,52,52,47,44,44,39,36,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,52,63,71,76,100,132,175,215,239,252,252,252,252,252,252,252,244,228,207,188,159,127,100,84,71,68,68,68,60,60,52,39,28,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,28,44,52,63,76,92,100,111,124,124,124,119,116,132,183,228,252,252,252,252,252,252,252,244,223,196,156,116,68,31,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,47,52,52,55,60,68,84,100,124,140,140,140,140,135,132,132,124,124,132,151,180,220,244,252,252,252,252,252,252,252,247,236,199,156,127,108,95,92,87,76,52,23,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,28,36,36,39,44,44,44,47,60,71,87,100,108,111,116,119,124,132,135,124,108,100,84,68,60,68,92,124,156,196,236,252,252,252,252,252,252,252,236,220,212,199,175,148,119,100,92,92,92,92,92,87,79,63,44,23,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,20,7,12,20,28,31,28,28,36,44,60,76,84,84,92,92,92,84,76,68,63,55,55,55,52,44,28,12,0,0,36,76,119,164,204,236,239,239,247,252,252,252,252,252,252,236,212,180,172,180,167,132,100,76,68,71,84,92,87,87,87,84,84,84,76,52,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,15,20,7,12,28,36,44,44,44,52,44,44,36,36,36,39,44,44,44,36,28,12,0,0,0,0,0,0,12,44,84,127,159,191,207,220,212,212,228,247,252,252,252,244,244,247,244,228,188,148,140,172,196,180,132,87,52,23,15,31,52,68,84,84,84,84,60,60,44,44,36,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,12,12,0,0,12,12,12,20,20,20,23,36,36,28,15,0,0,0,0,0,0,0,0,0,0,0,20,52,84,124,156,180,183,180,172,164,172,204,236,252,252,244,244,220,220,236,231,236,228,180,116,100,127,180,196,172,124,84,55,28,0,0,0,12,28,47,44,52,44,44,39,36,20,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,60,84,116,148,156,156,148,140,132,124,132,172,220,244,247,252,220,220,196,196,228,207,212,236,223,180,108,68,84,124,164,180,156,111,76,60,36,12,0,0,0,0,0,0,7,20,23,20,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,36,68,84,108,132,132,116,116,108,108,103,100,100,156,204,228,231,247,252,188,188,172,172,220,196,180,196,220,212,188,108,52,44,84,124,148,156,140,100,71,55,39,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,44,68,84,100,124,116,84,84,84,79,84,84,71,84,140,204,220,212,220,244,244,167,167,156,148,199,207,164,156,183,196,199,180,119,52,20,39,84,116,132,127,116,87,68,52,44,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,44,68,76,95,108,95,68,60,63,63,68,71,68,52,68,124,199,215,188,188,204,220,223,148,148,156,119,167,228,164,135,143,156,156,180,180,132,60,12,12,44,84,108,111,100,92,76,60,52,44,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,39,55,68,84,92,76,52,44,44,52,52,60,52,47,36,52,116,196,220,180,159,172,180,188,196,119,124,159,92,124,215,196,124,108,124,116,132,167,175,140,68,12,0,15,44,76,92,92,76,68,63,52,44,44,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,44,52,68,71,60,44,36,36,36,44,47,39,31,28,28,44,100,180,204,164,132,148,156,156,167,164,92,111,164,68,76,175,228,143,92,92,100,87,124,156,172,148,79,20,0,0,20,44,68,76,71,52,44,44,44,39,36,31,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,23,28,36,47,52,44,36,31,23,28,36,44,39,28,15,20,12,31,100,167,196,156,116,116,148,132,140,156,135,71,108,172,71,36,132,220,180,100,71,87,76,71,116,148,172,156,92,28,0,0,0,15,36,52,60,52,28,12,28,36,36,31,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,36,36,31,28,28,20,15,23,36,39,28,12,0,12,0,20,92,164,180,140,84,84,119,132,108,124,156,108,60,108,180,76,12,100,183,204,132,60,71,71,52,68,108,132,164,156,92,36,0,0,0,0,12,28,36,36,28,12,0,15,28,28,28,28,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,12,7,12,23,15,0,12,28,36,31,15,0,0,0,0,20,76,151,180,135,79,63,87,132,108,92,111,148,76,36,108,183,84,0,68,140,212,159,79,44,76,60,44,68,100,116,148,148,100,39,0,0,0,0,0,12,28,28,28,20,7,0,7,20,28,23,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,23,20,0,0,0,0,0,12,63,135,164,132,84,44,60,108,108,79,84,103,135,60,20,108,164,60,0,36,108,191,180,124,36,52,71,44,36,71,87,95,127,140,100,44,0,0,0,0,0,0,12,28,23,20,12,0,0,0,12,15,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,0,0,0,0,0,0,12,60,119,140,116,84,36,44,76,116,79,47,87,108,108,55,0,108,143,44,0,12,92,156,183,148,63,28,63,68,28,36,71,84,79,108,132,100,44,7,0,0,0,0,0,0,12,20,12,0,0,0,0,0,0,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,12,52,108,124,103,84,44,28,60,100,92,63,31,92,124,76,52,0,108,140,36,0,0,71,119,172,156,100,20,36,68,52,15,36,76,71,68,100,116,92,39,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,44,100,108,92,71,44,20,44,68,100,68,36,44,84,124,60,44,0,108,148,47,0,0,44,100,156,148,127,55,7,47,63,36,0,36,71,68,60,84,100,79,39,12,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,92,100,79,68,47,20,20,60,84,84,60,12,68,84,108,52,28,0,108,148,44,7,0,12,92,132,132,143,84,15,20,55,55,20,0,44,68,60,47,76,87,76,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,84,92,76,55,47,28,0,44,63,84,60,36,12,84,87,79,47,7,0,108,140,39,12,0,0,76,108,132,127,108,44,0,28,60,44,7,12,44,68,52,36,60,76,68,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,71,84,68,52,44,28,0,23,55,71,68,52,7,31,84,95,55,44,0,0,108,132,28,0,0,0,44,100,132,100,119,68,12,0,39,60,31,0,12,44,68,44,31,52,68,55,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,68,76,63,44,44,31,12,0,44,55,68,52,31,0,60,84,95,44,44,0,0,92,108,20,0,0,0,15,92,116,95,111,84,36,0,15,47,52,20,0,12,44,60,36,28,44,52,52,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,60,76,63,28,28,28,12,0,28,52,52,44,39,12,0,76,84,79,39,36,0,0,76,92,15,0,0,0,0,76,100,108,84,95,55,0,0,28,52,44,7,0,15,44,60,31,20,36,47,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,68,60,31,23,28,12,0,12,44,47,39,31,23,0,20,84,84,52,36,20,0,0,68,84,15,0,0,0,0,44,100,116,63,92,60,28,0,0,36,52,28,0,0,20,44,55,28,15,36,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,52,44,23,20,20,12,0,0,28,47,36,28,23,7,0,47,84,76,36,36,0,0,0,68,87,20,0,0,0,0,15,92,100,71,68,68,44,0,0,12,44,44,15,0,0,20,47,52,20,12,20,23,20,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,36,47,39,12,20,20,12,0,0,15,44,44,20,15,12,0,0,68,84,60,36,36,0,0,0,68,87,20,0,0,0,0,0,71,87,84,44,76,44,20,0,0,20,44,36,0,0,0,20,52,44,20,7,20,20,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,52,36,12,0,12,12,0,0,0,31,44,23,0,0,0,0,12,79,84,44,31,31,0,0,0,68,87,20,0,0,0,0,0,44,84,84,44,60,52,36,0,0,0,28,39,20,0,0,0,23,47,39,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,44,39,20,12,0,12,0,0,0,15,39,36,0,0,0,0,0,36,79,76,36,28,23,0,0,0,68,84,15,0,0,0,0,0,15,76,76,47,36,60,44,20,0,0,12,36,36,12,0,0,0,23,47,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,28,15,7,0,0,0,0,0,0,31,36,15,0,0,0,0,0,60,76,60,20,20,12,0,0,0,68,84,15,0,0,0,0,0,0,60,76,60,28,52,44,36,0,0,0,15,36,28,0,0,0,0,23,44,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,20,0,0,0,0,0,0,0,0,0,20,36,28,0,0,0,0,0,0,71,76,28,12,12,0,0,0,0,68,92,20,0,0,0,0,0,0,39,76,68,36,36,52,36,12,0,0,0,20,36,20,0,0,0,0,28,44,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,12,0,0,0,0,0,0,0,0,7,31,31,12,0,0,0,0,0,20,68,68,12,12,12,0,0,0,0,60,87,28,0,0,0,0,0,0,15,60,60,36,20,39,36,28,0,0,0,7,28,28,12,0,0,0,0,28,44,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,23,12,0,0,0,0,0,0,0,0,20,28,20,0,0,0,0,0,0,44,68,52,0,12,12,0,0,0,0,44,60,15,0,0,0,0,0,0,0,44,55,36,20,28,39,36,12,0,0,0,12,28,20,0,0,0,0,0,23,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,12,7,0,0,0,0,0,0,0,0,12,28,28,0,0,0,0,0,0,0,60,68,36,7,7,0,0,0,0,0,23,28,0,0,0,0,0,0,0,0,20,36,36,15,15,36,28,20,0,0,0,0,15,23,12,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,12,0,0,0,0,0,0,0,0,0,0,12,20,12,0,0,0,0,0,0,12,52,52,12,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,7,28,28,15,12,20,28,28,0,0,0,0,0,20,20,7,0,0,0,0,0,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,12,0,0,0,0,0,0,0,0,0,0,0,20,15,0,0,0,0,0,0,0,28,47,44,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,23,28,12,12,12,28,28,15,0,0,0,0,7,20,15,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,0,0,0,0,0,0,0,0,28,31,20,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,12,28,20,12,12,20,23,23,0,0,0,0,0,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,12,0,0,0,0,0,0,0,0,36,36,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,20,0,0,0,15,20,12,0,0,0,0,0,12,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,12,36,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,7,20,20,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,20,20,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,0,0,0,12,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,15,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};\n  const uint8_t SHINE_TEXTURE_8[16384] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,23,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,23,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,12,23,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,12,39,39,0,0,0,0,12,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,7,7,0,0,0,0,7,44,44,7,0,0,0,15,20,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,20,12,7,0,0,0,7,7,44,44,20,0,0,0,15,20,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,23,23,12,7,0,0,7,7,47,47,36,0,0,0,15,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,28,12,12,0,0,12,12,60,63,60,0,0,0,15,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,20,12,0,0,0,12,44,68,68,0,0,0,15,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,36,20,12,0,0,20,31,68,68,0,0,0,15,36,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,12,31,36,23,20,0,0,20,23,84,71,20,0,0,12,28,20,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,28,36,47,28,12,0,20,20,84,71,36,0,0,0,28,23,28,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,7,7,0,0,0,0,0,0,0,23,36,55,28,23,0,12,20,84,71,55,0,0,0,20,28,28,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,15,12,0,0,0,0,0,12,15,44,47,44,31,0,7,31,84,76,68,0,0,0,28,39,28,28,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,0,0,7,12,12,0,0,0,0,12,12,39,36,63,36,15,0,31,68,84,76,0,0,0,28,52,28,28,0,0,0,0,0,0,0,0,0,0,0,0,7,36,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,20,0,0,20,20,12,0,0,0,0,20,36,44,68,44,31,0,36,52,100,76,12,0,0,36,52,28,28,0,7,7,0,0,0,0,0,0,0,0,0,28,39,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,7,0,12,28,23,0,0,0,0,20,20,52,52,63,36,0,28,44,111,76,28,0,0,36,44,12,12,0,12,12,0,0,0,0,0,0,0,0,12,39,39,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,12,0,20,31,20,0,0,0,12,23,47,47,84,44,20,20,36,116,76,44,0,0,36,44,12,12,0,12,12,0,0,0,0,0,0,0,0,31,44,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,12,0,28,36,15,0,0,0,20,36,60,76,60,36,0,39,108,84,60,0,0,36,63,28,28,12,12,12,0,0,0,0,0,0,0,15,44,44,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,28,12,12,36,31,7,0,0,12,28,63,60,84,44,7,44,92,95,71,0,0,44,79,44,28,20,20,12,0,0,0,0,0,0,0,36,47,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,39,28,12,23,44,28,0,0,0,28,52,68,95,55,28,39,76,116,76,0,0,44,84,44,23,20,20,0,0,0,0,0,0,0,20,52,44,0,0,0,0,0,0,0,0,0,0,12,20,23,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,44,28,15,36,44,20,0,0,15,36,76,84,76,44,28,60,124,76,12,0,47,92,44,23,28,28,0,0,0,0,0,0,0,44,52,23,0,0,0,0,0,0,0,0,0,7,28,36,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,47,28,20,44,44,12,0,0,36,68,84,100,52,23,52,132,84,31,0,47,92,47,28,36,36,0,0,0,0,0,0,28,55,44,0,0,0,0,0,0,0,0,0,12,39,52,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,47,28,31,52,36,0,0,23,52,92,108,71,36,52,127,95,47,0,47,92,47,39,36,36,0,0,0,0,0,12,52,55,23,0,0,0,0,0,0,0,0,20,52,63,44,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,44,47,36,44,55,28,0,0,44,87,103,100,52,52,116,116,68,0,52,100,52,44,36,31,0,0,0,0,0,36,60,44,0,0,0,0,0,0,0,0,20,60,76,60,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,44,44,52,52,20,0,28,68,108,119,68,60,100,132,76,0,55,108,52,44,44,20,0,0,0,0,15,60,60,20,0,0,0,0,0,0,0,28,63,76,60,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,55,47,52,60,44,7,12,52,108,132,95,63,92,148,87,12,60,111,60,44,44,12,0,0,0,0,44,68,44,0,0,0,0,0,0,0,36,87,108,68,20,0,0,0,0,0,0,0,0,0,0,0,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,63,52,60,63,36,0,36,87,135,124,71,92,156,108,23,60,116,68,47,47,15,15,12,0,20,68,63,20,0,0,0,0,0,0,36,92,116,84,31,0,0,0,0,0,0,0,0,0,0,12,20,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,44,68,60,68,60,23,15,68,132,156,95,100,159,127,44,60,116,84,52,52,12,12,0,0,52,68,44,0,0,0,0,0,7,47,100,108,79,36,7,0,0,0,0,0,0,0,0,15,28,28,23,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,52,68,71,76,52,12,44,124,183,132,108,148,140,60,60,119,103,52,60,20,20,0,28,71,68,12,0,0,0,0,12,60,116,127,84,31,0,0,0,0,0,0,0,0,15,31,36,28,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,60,76,84,76,44,28,103,196,183,132,151,156,76,68,124,116,55,68,31,28,0,60,76,44,0,0,0,0,12,68,135,148,100,36,0,0,0,0,0,0,0,20,36,36,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,7,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,28,68,84,92,68,36,68,172,220,156,164,156,95,79,140,124,60,63,36,15,36,76,68,15,0,0,0,20,76,156,164,108,36,0,0,0,0,0,0,20,39,44,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,20,23,20,7,0,0,0,12,12,0,0,12,7,12,12,12,7,0,0,0,0,0,36,76,100,95,60,47,124,220,196,188,164,116,103,156,124,71,52,39,15,68,84,47,7,0,0,23,79,156,172,116,44,7,0,7,0,0,20,44,52,47,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,28,28,28,15,0,0,0,0,0,20,28,28,15,20,15,20,20,0,0,0,0,44,92,108,95,55,87,180,228,207,188,132,132,180,124,92,52,44,44,92,92,36,12,0,23,87,159,164,100,39,15,15,12,12,28,52,63,60,44,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,31,31,31,36,28,12,0,0,20,28,39,39,36,28,36,36,28,15,0,0,12,68,119,132,92,76,140,228,220,212,143,148,191,124,116,52,44,84,111,84,44,28,39,95,164,159,92,36,23,28,20,31,60,79,84,68,36,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,39,44,39,39,39,28,12,12,28,36,52,60,55,55,55,44,28,7,0,31,92,148,135,87,116,191,236,236,164,167,204,132,116,55,68,116,124,71,52,68,116,164,151,87,44,36,36,44,68,92,100,84,60,28,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,20,44,55,52,52,44,39,28,28,36,52,68,71,76,71,63,39,20,0,52,116,159,132,108,156,231,247,180,183,212,148,108,76,103,148,116,76,92,135,167,143,87,52,44,55,76,92,100,100,71,31,0,0,0,0,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,44,71,79,71,60,52,44,44,44,60,84,95,100,87,68,31,20,60,132,172,140,148,204,252,207,207,220,172,103,111,148,159,116,116,148,167,140,92,63,68,92,108,100,95,76,39,7,0,12,28,31,23,20,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,31,44,68,92,95,84,68,63,60,68,84,111,124,124,92,52,36,71,156,180,167,188,239,236,236,236,191,124,143,180,172,156,172,172,148,100,84,100,116,111,100,79,39,12,20,36,39,36,36,31,23,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,44,68,92,111,116,95,92,92,100,116,151,159,135,92,60,95,172,188,196,223,252,252,244,196,164,180,215,204,196,196,151,124,119,127,116,100,84,52,36,44,47,44,44,39,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,44,68,108,140,148,140,140,140,148,167,188,188,132,100,124,180,220,228,252,252,247,204,199,220,236,228,212,180,164,151,140,108,92,76,63,55,52,52,47,44,31,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,47,79,116,148,164,172,175,188,204,223,212,172,140,156,207,244,252,252,247,228,228,244,244,231,212,191,164,140,124,116,103,92,76,68,52,36,15,12,12,20,20,12,0,0,0,0,0,0,0,0,0,7,20,20,15,15,28,28,15,0,0,12,15,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,36,68,100,132,156,167,188,228,244,239,204,180,199,236,252,252,252,247,247,252,247,228,212,191,172,156,140,124,124,108,92,68,47,44,36,36,28,23,28,31,36,44,52,47,47,44,44,36,31,36,36,28,20,15,28,28,15,0,0,12,15,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,12,0,0,0,0,0,0,0,0,15,23,20,12,12,20,20,12,7,0,12,36,68,100,140,180,228,244,247,228,220,236,252,252,252,252,252,252,252,239,220,196,180,175,188,183,167,140,116,103,100,100,103,100,87,79,68,63,52,52,52,47,44,44,44,36,31,36,36,28,20,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,23,23,28,28,28,15,0,15,31,52,60,76,68,60,76,103,119,116,108,100,92,87,79,84,108,148,188,212,236,247,247,247,252,252,252,252,252,252,252,239,236,236,236,220,204,196,196,180,159,132,108,84,68,60,60,60,55,55,52,52,47,39,31,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,23,23,28,28,28,12,0,15,31,44,52,63,68,60,76,103,124,119,116,116,116,116,116,124,132,156,183,212,236,252,252,252,252,252,252,252,252,252,247,244,244,244,244,236,215,188,164,132,100,76,60,52,39,28,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,36,44,52,60,68,76,84,84,92,92,100,100,108,116,132,156,191,228,244,252,252,252,252,252,252,252,252,252,252,252,239,220,188,151,116,100,63,31,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,7,0,20,44,60,71,76,76,76,76,84,84,84,84,84,84,84,84,84,84,84,87,95,116,132,156,164,167,180,207,236,252,252,252,252,252,252,252,252,252,252,252,247,239,212,164,108,71,68,52,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,23,47,47,23,0,20,52,76,84,79,76,76,76,84,84,84,84,84,76,76,68,76,92,100,100,92,92,87,100,124,151,183,212,236,252,252,252,252,252,252,236,236,252,252,252,247,228,204,191,172,132,87,63,52,52,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,23,47,47,23,0,20,44,60,55,47,36,31,20,20,12,7,20,36,52,55,60,60,60,63,68,92,116,132,135,127,140,180,212,220,231,239,244,252,252,228,204,204,252,244,244,244,228,204,172,151,140,116,92,71,60,44,44,36,36,31,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,44,47,52,52,52,55,60,60,68,84,100,92,76,68,68,95,132,151,167,183,196,204,220,239,252,244,183,159,188,244,223,223,228,228,212,180,148,132,124,108,71,31,20,31,36,36,31,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,36,44,44,44,44,47,52,52,52,52,55,55,52,52,55,60,60,76,84,92,95,124,148,148,156,188,220,239,247,220,127,127,188,228,188,196,191,204,220,220,172,124,100,92,95,84,52,12,0,0,12,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,20,23,23,28,36,36,36,44,44,44,36,20,20,28,44,44,47,52,52,52,44,44,60,68,76,100,116,108,92,116,156,196,223,244,236,167,79,103,172,188,172,172,164,172,172,212,231,188,119,76,68,76,79,71,44,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,20,20,20,23,23,28,36,28,15,0,0,12,28,36,36,44,44,44,44,36,20,28,52,68,71,84,92,92,76,63,84,124,180,196,212,223,204,108,52,95,143,140,172,156,143,151,135,148,215,244,204,132,68,44,60,76,76,68,44,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,12,20,20,20,20,15,12,0,0,0,0,12,23,23,28,36,36,36,36,23,0,0,28,52,63,68,71,76,71,63,60,44,55,108,164,188,172,191,212,156,52,44,95,108,84,164,164,116,132,127,100,148,220,244,212,156,84,31,31,60,76,71,68,39,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,0,0,0,0,0,0,0,0,0,15,20,28,28,23,28,28,15,0,0,0,28,52,60,63,60,60,52,52,55,44,28,44,103,143,164,148,156,199,188,95,12,55,87,84,60,148,180,108,84,124,84,76,148,191,207,199,159,92,36,7,28,55,68,68,60,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,15,20,23,20,12,0,0,0,0,28,52,60,60,55,44,36,44,52,44,23,20,47,103,124,140,124,132,172,204,140,44,0,60,71,44,31,124,196,116,44,76,87,60,63,124,156,180,188,151,108,52,12,0,23,52,63,60,60,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,12,7,0,0,0,0,0,12,28,47,52,55,52,31,28,36,44,44,28,7,15,52,100,116,116,103,108,148,204,180,84,7,0,55,55,12,12,100,188,140,52,28,71,68,39,52,108,132,148,164,148,116,60,20,0,0,20,44,60,60,60,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,44,47,52,44,20,12,23,36,36,28,12,0,20,52,100,100,100,92,92,116,180,204,124,28,0,12,52,52,0,0,79,167,156,76,0,36,68,52,23,52,95,116,124,143,140,124,76,31,0,0,0,20,44,60,55,52,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,44,44,44,36,15,0,12,28,31,28,15,0,0,28,60,92,92,84,79,84,92,148,204,156,68,0,0,28,44,44,0,0,60,132,164,103,12,7,52,68,31,15,47,87,100,108,124,127,124,84,44,7,0,0,0,20,44,52,47,44,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,39,44,44,31,12,0,7,20,28,28,15,0,0,0,28,60,84,76,68,68,76,76,116,180,180,100,20,0,0,36,44,44,0,0,47,100,175,119,36,0,23,60,60,15,20,44,76,84,92,103,116,119,95,60,20,0,0,0,0,15,36,47,47,44,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,36,36,28,7,0,0,7,20,20,20,0,0,0,0,31,60,76,68,52,60,68,60,84,140,172,119,44,0,0,0,39,39,28,0,0,28,71,164,124,68,0,0,36,60,39,0,20,44,68,68,76,87,103,111,103,68,28,0,0,0,0,0,15,36,47,44,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,31,31,31,20,0,0,0,0,0,7,15,7,0,0,0,7,36,60,68,60,44,52,60,52,68,116,156,135,76,12,0,0,0,36,36,12,0,0,12,60,132,124,84,0,0,12,52,60,23,0,20,44,60,55,68,76,92,100,103,76,39,0,0,0,0,0,0,15,36,44,36,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,28,28,28,15,0,0,0,0,0,0,0,0,0,0,0,0,12,36,60,60,44,31,44,55,52,52,92,135,140,92,36,0,0,0,0,36,36,0,0,0,0,52,103,127,100,23,0,0,28,52,44,7,0,20,39,52,44,60,68,79,92,100,84,52,12,0,0,0,0,0,0,12,28,36,36,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,20,23,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,60,44,36,20,31,47,52,36,68,116,132,103,60,7,0,0,0,12,28,28,0,0,0,0,52,76,124,103,44,0,0,0,36,52,28,0,0,20,36,36,36,52,60,68,76,92,87,60,23,0,0,0,0,0,0,0,12,28,36,36,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,15,15,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,39,52,36,20,12,23,39,52,28,47,100,119,111,76,28,0,0,0,0,15,20,20,0,0,0,0,44,55,103,92,52,0,0,0,12,44,44,15,0,0,12,20,20,28,44,52,60,68,84,87,68,36,0,0,0,0,0,0,0,0,12,23,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,39,44,28,12,7,12,36,52,28,36,84,108,108,84,44,0,0,0,0,0,15,15,12,0,0,0,0,28,44,87,84,68,15,0,0,0,28,44,36,0,0,0,0,15,28,28,36,39,52,60,71,84,68,36,0,0,0,0,0,0,0,0,0,7,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,39,20,0,0,12,28,47,28,20,63,100,100,87,63,20,0,0,0,0,0,15,15,0,0,0,0,0,12,44,76,76,76,36,0,0,0,0,36,44,20,0,0,0,15,28,20,20,20,31,44,52,60,68,63,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,39,36,15,0,0,0,20,44,28,12,44,92,92,84,68,36,0,0,0,0,0,0,7,7,0,0,0,0,0,0,36,55,60,76,39,0,0,0,0,15,36,36,7,0,0,0,12,23,20,12,12,23,36,44,44,52,60,44,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,36,28,12,0,0,0,20,36,28,12,31,76,92,71,71,52,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,44,55,71,44,12,0,0,0,0,23,36,20,0,0,0,0,12,12,0,0,0,15,28,39,36,44,52,44,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,23,7,0,0,0,12,36,28,12,15,63,92,68,63,60,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,36,60,63,55,23,0,0,0,0,7,28,31,12,0,0,0,0,0,0,0,0,0,7,23,28,23,28,44,39,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,15,23,20,0,0,0,0,12,28,28,12,0,47,84,68,52,60,44,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,31,52,47,60,31,0,0,0,0,0,12,28,20,0,0,0,0,0,0,0,0,0,0,0,12,23,20,28,28,31,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,20,7,0,0,0,0,0,12,20,12,0,36,76,71,39,52,52,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,23,36,23,52,28,0,0,0,0,0,0,20,28,12,0,0,0,0,0,0,0,0,0,0,0,12,20,23,20,20,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,12,0,0,0,0,0,7,12,0,0,20,63,76,44,31,52,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,15,36,28,7,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,12,20,12,7,7,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,12,20,7,0,0,47,76,52,20,44,44,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,20,28,28,20,0,0,0,0,0,0,12,15,12,0,0,0,0,0,0,0,0,0,0,0,0,7,7,12,0,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,15,12,0,0,36,71,60,15,28,44,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,36,20,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,0,0,0,0,0,0,0,0,0,0,0,20,60,68,28,12,36,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,0,23,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,68,44,0,28,36,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,60,52,12,12,36,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,44,52,20,0,28,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,44,28,0,12,28,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,36,28,0,0,23,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,31,31,12,0,12,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,15,0,0,23,23,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,12,0,0,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};\n  const uint8_t SHINE_TEXTURE_9[16384] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,0,0,0,0,12,7,0,0,0,0,0,0,0,0,0,7,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,23,20,0,0,0,7,0,0,0,0,0,0,0,0,0,0,12,20,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,23,0,0,0,28,28,20,0,0,0,0,0,0,0,0,20,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,12,0,0,36,36,28,0,0,0,0,0,0,0,0,20,23,12,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,36,15,0,0,36,31,23,0,0,0,0,0,0,0,0,20,20,0,0,0,0,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,36,28,0,12,23,20,12,0,0,0,0,0,0,0,0,36,36,0,0,0,7,20,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,36,0,12,20,36,28,0,0,0,0,0,0,0,12,52,52,7,0,12,12,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,12,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,39,20,0,20,71,60,12,0,0,0,0,0,0,20,52,52,7,0,12,12,23,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,12,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,52,28,0,23,84,68,12,0,0,0,0,0,0,36,60,52,0,0,20,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,7,0,0,0,12,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,60,47,12,23,55,31,7,0,0,0,0,0,0,63,79,60,7,15,12,28,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,7,0,0,0,0,12,23,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,76,71,12,15,52,36,20,0,0,0,0,0,0,60,68,44,12,28,28,39,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,20,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,15,76,79,28,20,76,68,44,0,0,0,0,0,0,68,68,36,15,36,39,28,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,0,0,0,0,0,0,7,28,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,76,84,52,31,100,100,68,0,0,0,0,0,20,92,92,39,28,36,60,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,15,12,0,15,20,0,0,0,12,36,31,12,0,0,0,0,0,0,0,0,0,0,0,0,60,92,68,28,84,108,76,0,0,0,0,0,36,92,92,36,39,36,60,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,20,36,23,0,0,0,20,44,28,0,0,0,0,0,0,0,0,0,7,7,0,39,92,87,36,68,111,79,0,0,0,0,0,55,108,103,31,52,44,52,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,23,31,36,20,0,0,0,28,44,20,0,0,0,0,0,0,0,0,12,12,7,20,92,95,52,68,124,84,0,0,0,0,0,76,116,108,28,60,68,44,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,31,28,31,39,28,0,0,12,39,44,15,0,0,0,0,0,0,0,12,20,15,0,92,100,63,60,127,84,12,0,0,0,0,92,124,108,44,60,76,39,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,36,39,44,23,0,0,20,44,36,12,0,0,0,0,0,0,0,23,23,0,68,100,79,60,140,100,23,0,0,0,12,108,132,103,68,76,76,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,36,36,44,23,0,0,28,52,31,0,0,0,0,0,0,0,20,20,7,44,100,92,68,140,108,36,0,0,0,23,124,140,92,79,84,63,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,28,23,36,44,28,0,7,39,52,28,0,0,0,0,0,0,12,23,20,20,100,100,76,132,116,47,0,0,0,39,127,156,84,92,92,52,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,28,39,52,47,23,0,20,52,52,20,0,0,0,0,0,0,31,31,12,92,100,95,132,140,60,0,0,0,60,127,156,92,108,92,44,0,0,0,0,0,0,0,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,44,52,52,55,52,23,0,28,60,44,12,0,0,0,0,0,28,36,23,76,100,111,132,151,71,0,0,0,76,127,148,95,116,84,36,0,0,0,0,0,0,7,20,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,28,60,63,60,68,52,20,0,36,60,36,7,15,15,0,0,15,39,39,52,100,116,124,151,79,0,0,12,100,143,140,103,108,68,20,0,0,0,0,0,12,23,23,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,63,71,71,71,52,28,12,52,60,28,20,28,15,0,0,44,44,44,100,108,124,148,92,0,0,28,127,164,140,127,108,60,0,0,0,0,0,15,28,28,23,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,76,84,84,76,52,20,23,60,60,28,28,28,12,0,44,55,52,92,100,140,151,108,0,0,39,140,188,148,148,108,47,0,0,0,0,12,28,44,39,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,76,92,92,84,52,23,36,68,52,31,36,28,0,28,63,60,84,100,156,151,119,20,0,44,132,180,151,148,103,36,7,0,0,7,28,52,52,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,84,100,108,92,52,28,44,71,52,44,44,20,0,68,68,84,100,156,156,132,28,0,71,156,188,164,140,92,23,0,0,0,28,52,60,39,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,23,20,15,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,7,0,0,0,0,0,12,36,87,111,116,100,55,39,60,68,60,52,44,7,52,76,87,100,151,164,140,39,0,100,183,204,191,148,76,23,0,0,20,52,71,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,28,23,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,20,20,15,12,12,0,0,0,36,92,124,127,108,60,52,68,76,76,60,36,23,76,84,108,140,180,140,52,20,119,204,220,196,148,60,12,0,12,44,76,71,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,44,36,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,28,36,36,36,28,12,0,0,36,92,132,135,111,60,60,76,84,84,68,20,68,79,124,124,196,140,63,31,132,228,236,199,132,44,0,0,36,76,84,44,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,44,55,52,44,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,52,60,47,28,7,0,36,92,132,148,116,71,76,87,108,92,52,47,79,127,116,199,140,76,44,148,244,244,196,108,28,0,28,76,95,68,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,52,60,60,52,31,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,63,76,76,52,23,0,31,87,148,180,148,92,84,108,116,84,44,76,116,127,196,156,87,60,164,252,244,188,87,12,15,68,103,92,44,12,0,0,0,0,0,0,0,0,0,0,0,0,28,52,68,68,60,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,60,92,100,84,44,20,28,95,175,204,156,108,103,132,116,68,76,92,151,183,180,100,76,180,252,244,164,68,7,55,111,116,68,28,7,0,0,0,0,0,0,0,0,0,0,36,68,84,76,68,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,52,87,116,116,84,36,36,100,180,207,164,124,132,143,100,79,84,164,188,204,111,87,188,252,228,132,36,36,108,140,92,39,12,0,0,0,0,0,0,0,0,7,39,76,92,92,79,47,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,36,76,124,148,124,68,55,100,180,204,172,140,156,143,95,100,148,196,220,124,100,204,252,199,100,36,100,159,132,60,12,0,0,0,0,0,0,0,12,44,84,100,100,87,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,20,60,116,156,151,108,76,108,180,196,180,164,172,132,116,132,212,228,132,116,220,244,164,71,76,156,156,92,28,0,0,0,0,0,0,12,47,84,103,108,92,63,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,20,15,12,0,36,92,140,164,135,116,132,180,204,196,196,191,148,140,204,231,148,132,231,223,127,76,140,180,124,39,0,0,0,0,0,12,52,87,103,103,92,60,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,20,20,20,31,36,31,44,76,124,151,159,151,156,196,212,223,236,188,172,196,244,159,156,244,188,116,119,188,156,60,12,0,0,0,20,55,92,103,103,92,55,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,20,36,39,36,44,60,71,84,116,148,164,172,196,228,244,252,228,196,199,239,180,180,236,164,135,172,172,84,20,0,0,20,60,92,103,103,87,52,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,20,20,12,12,12,0,0,0,0,0,0,0,0,0,12,12,12,20,23,47,68,76,76,84,100,127,159,180,196,228,244,252,252,228,228,244,204,204,220,172,167,172,100,23,0,23,63,92,108,108,87,47,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,20,20,12,15,28,28,28,28,36,39,36,28,12,0,0,0,0,12,20,31,36,52,76,103,124,124,140,172,207,228,244,252,252,244,244,244,228,228,212,199,172,116,39,28,68,100,124,124,100,52,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,28,28,28,28,36,39,44,44,44,47,52,52,52,47,36,31,36,44,44,52,76,108,151,175,196,220,244,252,252,252,252,252,244,244,231,196,132,76,79,119,140,140,116,63,28,0,0,0,0,0,0,0,7,20,20,28,28,31,23,15,12,20,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,0,0,0,0,7,20,36,44,44,44,47,52,52,52,55,60,60,68,76,84,95,108,103,111,132,164,204,231,252,252,252,252,252,252,252,231,188,140,132,148,148,124,76,44,31,28,31,44,52,52,52,52,52,52,52,47,52,52,52,28,15,20,44,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,20,28,15,0,0,0,20,36,44,44,55,71,92,103,108,116,124,127,124,132,127,127,143,164,180,204,228,244,252,252,252,252,252,252,236,207,188,188,180,156,124,108,103,116,124,132,132,124,116,108,103,100,92,87,76,68,60,39,12,0,7,15,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,23,23,28,39,36,20,15,28,47,68,71,76,84,87,95,95,100,124,159,180,188,207,220,223,223,220,212,212,228,244,252,252,252,252,252,252,244,244,236,212,188,175,180,196,204,215,220,228,223,196,167,148,132,124,108,100,95,92,92,76,60,36,20,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,20,28,28,36,36,44,52,60,68,76,84,100,108,124,127,140,172,207,228,228,236,244,239,244,236,236,247,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,236,212,175,156,124,100,87,84,84,84,84,84,84,84,84,68,44,36,23,0,0,0,0,0,0,0,0,12,20,20,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,44,68,84,60,31,47,84,100,100,92,92,92,92,92,92,100,108,124,143,164,164,172,172,172,196,207,220,223,236,244,244,252,252,252,252,252,252,252,252,252,236,212,204,215,236,252,236,215,180,159,140,116,87,76,76,71,60,44,36,28,28,28,28,31,20,0,0,0,0,0,0,0,0,12,20,20,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,28,60,76,44,12,28,60,84,84,84,84,84,87,84,76,76,68,63,60,68,92,127,148,143,140,148,172,188,196,215,244,252,252,252,252,252,252,252,252,252,236,212,183,164,156,164,188,212,223,223,191,156,119,103,92,79,60,52,52,47,44,44,36,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,20,44,52,31,7,12,20,20,12,0,0,0,7,7,12,20,28,52,68,79,79,84,95,119,140,140,124,140,167,204,236,247,236,236,231,236,252,252,247,247,244,228,191,156,140,119,108,116,135,148,151,143,124,111,100,92,76,76,71,68,60,52,44,39,36,28,28,31,23,15,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,36,52,60,60,63,68,79,100,108,92,79,100,124,140,159,204,228,231,207,212,207,212,244,244,236,220,212,220,212,196,180,148,111,76,60,60,60,63,60,68,76,76,60,44,28,28,39,52,47,44,39,28,28,31,23,15,12,23,12,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,39,52,52,52,55,60,60,60,68,68,63,68,76,92,95,116,140,167,188,228,196,172,196,188,180,223,228,220,191,156,167,172,172,180,188,180,156,116,68,28,15,28,39,39,36,36,36,39,36,31,20,12,0,0,0,0,12,12,12,12,23,12,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,39,44,44,47,52,52,47,36,31,44,52,60,60,60,60,68,84,108,124,140,156,212,215,148,148,204,172,148,204,196,188,180,124,100,132,140,140,148,164,180,188,159,111,68,31,0,0,12,28,31,28,20,15,12,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,28,36,36,39,44,44,44,36,20,7,20,39,52,52,55,47,36,44,68,84,100,108,116,132,180,215,172,108,143,228,156,124,188,164,156,167,124,76,68,111,116,111,111,132,148,175,180,148,100,68,36,7,0,0,0,0,12,12,12,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,20,28,36,36,36,36,23,0,0,0,20,39,44,47,52,36,15,23,52,76,79,84,92,100,116,159,204,188,108,92,164,244,143,100,156,140,124,124,143,84,44,55,95,103,100,87,95,111,127,156,156,132,92,68,36,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,20,28,20,20,23,23,12,0,0,0,7,20,36,39,44,44,28,0,0,36,68,76,68,68,79,84,95,140,188,191,132,60,92,188,215,116,76,119,143,92,95,132,116,60,20,52,84,92,84,76,76,76,87,108,132,140,116,84,60,39,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,15,15,20,20,12,0,0,0,0,0,12,20,28,36,36,36,20,0,0,20,52,68,68,52,60,76,76,76,124,175,188,143,76,36,108,196,180,84,44,100,143,68,84,92,124,84,31,7,44,76,76,71,68,68,60,60,76,95,116,119,108,76,55,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,0,0,0,0,0,0,0,0,15,23,28,28,23,12,0,0,0,36,60,68,52,39,47,76,68,63,103,164,180,148,92,28,52,124,180,151,55,20,92,124,76,68,68,100,92,60,12,0,36,68,68,60,55,63,52,44,44,63,84,95,100,87,63,44,31,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,15,12,20,23,15,0,0,0,0,20,44,63,60,36,28,47,76,60,47,76,148,164,148,108,52,0,68,140,148,116,23,0,87,100,92,52,52,68,92,68,36,0,0,28,60,68,52,44,60,60,36,28,36,60,68,71,76,68,52,36,28,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,12,0,0,0,0,0,0,31,52,60,47,20,20,52,76,52,36,60,132,143,132,116,76,12,15,76,156,124,92,12,0,79,92,100,47,44,52,76,76,60,23,0,0,23,52,68,44,36,44,52,44,23,15,28,44,55,52,52,52,44,28,20,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,20,44,55,52,31,7,20,52,71,47,28,47,116,132,124,116,92,36,0,44,79,164,116,63,7,0,63,92,100,44,39,31,52,68,60,47,12,0,0,20,47,63,39,28,31,52,47,28,12,12,28,28,36,36,44,44,28,20,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,52,52,44,20,0,23,52,68,39,12,36,95,124,108,108,100,60,0,0,60,92,151,111,39,0,0,44,92,92,44,39,20,44,55,60,55,36,0,0,0,12,39,60,44,20,20,44,44,31,12,0,0,12,20,36,28,28,28,23,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,36,52,44,28,0,0,28,55,60,36,0,20,68,116,108,92,100,76,20,0,12,68,111,127,108,12,0,0,23,87,87,44,36,20,23,44,52,47,52,20,0,0,0,12,36,60,44,15,12,28,44,36,20,0,0,0,12,15,20,20,20,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,44,44,36,12,0,0,28,60,55,28,0,12,44,92,100,76,92,92,44,0,0,36,68,124,108,92,0,0,0,7,87,87,47,31,28,0,36,39,39,47,39,12,0,0,0,0,28,52,44,20,0,20,36,36,23,7,0,0,0,0,12,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,31,44,39,20,0,0,0,31,55,52,23,0,0,28,76,92,68,79,92,63,7,0,0,52,63,119,100,76,0,0,0,0,84,87,52,28,28,0,20,36,36,31,44,28,0,0,0,0,0,28,44,44,20,0,12,28,36,28,12,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,36,39,28,12,0,0,12,36,55,44,20,0,0,20,60,84,68,60,84,79,28,0,0,0,60,63,100,87,52,0,0,0,0,68,87,68,20,23,12,0,28,36,28,36,44,20,0,0,0,0,0,20,39,39,20,0,0,15,23,20,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,28,36,31,20,0,0,0,12,36,52,36,12,0,0,12,36,68,71,47,68,84,44,0,0,0,28,60,63,84,79,36,0,0,0,0,47,87,79,12,15,15,0,12,28,28,20,36,31,7,0,0,0,0,0,12,36,39,20,0,0,0,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,28,31,20,7,0,0,0,12,36,52,31,12,0,0,12,28,52,68,39,44,76,63,12,0,0,0,44,60,52,71,71,15,0,0,0,0,28,84,84,12,12,12,0,0,20,23,12,20,36,20,0,0,0,0,0,0,12,28,36,20,0,0,0,7,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,28,23,12,0,0,0,0,15,36,44,28,0,0,0,7,23,52,63,44,28,55,63,28,0,0,0,0,52,55,36,60,60,0,0,0,0,0,12,84,84,20,0,0,0,0,7,20,20,12,28,31,12,0,0,0,0,0,0,7,23,36,20,0,0,0,7,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,23,15,0,0,0,0,0,15,36,44,20,0,0,0,0,7,31,60,47,20,31,55,39,0,0,0,0,20,52,52,20,44,44,0,0,0,0,0,0,84,84,44,0,0,0,0,0,12,20,12,12,28,28,0,0,0,0,0,0,0,0,20,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,20,7,0,0,0,0,0,12,31,36,20,0,0,0,0,0,15,44,52,28,15,44,44,12,0,0,0,0,36,52,44,20,36,31,0,0,0,0,0,0,68,84,60,0,0,0,0,0,0,12,12,0,12,20,12,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,7,0,0,0,0,0,0,12,28,20,12,0,0,0,0,0,12,31,47,28,0,28,44,28,0,0,0,0,0,47,52,20,23,28,20,0,0,0,0,0,0,52,84,76,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,7,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,20,28,20,0,0,0,0,0,0,7,28,47,36,12,15,39,36,0,0,0,0,0,12,47,47,0,20,20,7,0,0,0,0,0,0,31,84,79,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,31,20,7,0,0,0,0,0,0,15,39,36,12,0,31,36,15,0,0,0,0,0,28,44,44,0,12,12,0,0,0,0,0,0,0,12,76,76,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,0,0,0,0,0,0,0,0,28,36,20,0,20,36,23,0,0,0,0,0,0,44,44,23,0,12,12,0,0,0,0,0,0,0,0,60,60,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,7,0,0,0,0,0,0,0,0,20,36,20,0,7,28,28,7,0,0,0,0,0,0,44,44,0,0,7,7,0,0,0,0,0,0,0,0,44,55,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,12,0,0,0,0,0,0,0,0,0,12,31,23,0,0,20,28,12,0,0,0,0,0,0,20,39,36,0,0,0,0,0,0,0,0,0,0,0,0,28,44,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,0,0,0,0,0,0,0,0,0,12,28,28,7,0,12,28,20,0,0,0,0,0,0,0,36,36,23,0,0,0,0,0,0,0,0,0,0,0,0,12,36,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,12,0,0,20,23,7,0,0,0,0,0,0,0,36,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,7,0,0,12,20,12,0,0,0,0,0,0,0,15,36,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,28,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,12,0,0,0,12,12,0,0,0,0,0,0,0,0,28,36,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,23,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,7,12,0,0,0,0,0,0,0,0,0,28,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,15,20,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,15,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};\n  const uint8_t * SHINE_TEXTURES[10] = {\n    SHINE_TEXTURE_0,\n    SHINE_TEXTURE_1,\n    SHINE_TEXTURE_2,\n    SHINE_TEXTURE_3,\n    SHINE_TEXTURE_4,\n    SHINE_TEXTURE_5,\n    SHINE_TEXTURE_6,\n    SHINE_TEXTURE_7,\n    SHINE_TEXTURE_8,\n    SHINE_TEXTURE_9,\n  };\n  const int SHINE_TEXTURE_WIDTHS[10] = {\n    128,\n    128,\n    128,\n    128,\n    128,\n    128,\n    128,\n    128,\n    128,\n    128,\n  };\n  const int SHINE_TEXTURE_HEIGHTS[10] = {\n    128,\n    128,\n    128,\n    128,\n    128,\n    128,\n    128,\n    128,\n    128,\n    128,\n  };\n}\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/shortest_edge_and_midpoint.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"shortest_edge_and_midpoint.h\"\n\nIGL_INLINE void igl::shortest_edge_and_midpoint(\n  const int e,\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & /*F*/,\n  const Eigen::MatrixXi & E,\n  const Eigen::VectorXi & /*EMAP*/,\n  const Eigen::MatrixXi & /*EF*/,\n  const Eigen::MatrixXi & /*EI*/,\n  double & cost,\n  Eigen::RowVectorXd & p)\n{\n  cost = (V.row(E(e,0))-V.row(E(e,1))).norm();\n  p = 0.5*(V.row(E(e,0))+V.row(E(e,1)));\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/shortest_edge_and_midpoint.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_SHORTEST_EDGE_AND_MIDPOINT_H\n#define IGL_SHORTEST_EDGE_AND_MIDPOINT_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <vector>\nnamespace igl\n{\n  // Cost and placement function compatible with igl::decimate. The cost of\n  // collapsing an edge is its length (prefer to collapse short edges) and the\n  // placement strategy for the new vertex is the midpoint of the collapsed\n  // edge.\n  //\n  // Inputs:\n  //   e  index into E of edge to be considered for collapse\n  //   V  #V by dim list of vertex positions\n  //   F  #F by 3 list of faces (ignored)\n  //   E  #E by 2 list of edge indices into V\n  //   EMAP  #F*3 list of half-edges indices into E (ignored)\n  //   EF  #E by 2 list of edge-face flaps into F (ignored)\n  //   EI  #E by 2 list of edge-face opposite corners (ignored)\n  // Outputs:\n  //   cost  set to edge length\n  //   p  placed point set to edge midpoint\n  IGL_INLINE void shortest_edge_and_midpoint(\n    const int e,\n    const Eigen::MatrixXd & V,\n    const Eigen::MatrixXi & /*F*/,\n    const Eigen::MatrixXi & E,\n    const Eigen::VectorXi & /*EMAP*/,\n    const Eigen::MatrixXi & /*EF*/,\n    const Eigen::MatrixXi & /*EI*/,\n    double & cost,\n    Eigen::RowVectorXd & p);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"shortest_edge_and_midpoint.cpp\"\n#endif\n#endif\n\n\n"
  },
  {
    "path": "libs/libigl/include/igl/signed_distance.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"signed_distance.h\"\n#include \"get_seconds.h\"\n#include \"per_edge_normals.h\"\n#include \"per_face_normals.h\"\n#include \"per_vertex_normals.h\"\n#include \"point_mesh_squared_distance.h\"\n#include \"pseudonormal_test.h\"\n\n\nIGL_INLINE void igl::signed_distance(\n  const Eigen::MatrixXd & P,\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  const SignedDistanceType sign_type,\n  Eigen::VectorXd & S,\n  Eigen::VectorXi & I,\n  Eigen::MatrixXd & C,\n  Eigen::MatrixXd & N)\n{\n  using namespace Eigen;\n  using namespace std;\n  const int dim = V.cols();\n  assert((V.cols() == 3||V.cols() == 2) && \"V should have 3d or 2d positions\");\n  assert((P.cols() == 3||P.cols() == 2) && \"P should have 3d or 2d positions\");\n  assert(V.cols() == P.cols() && \"V should have same dimension as P\");\n  // Only unsigned distance is supported for non-triangles\n  if(sign_type != SIGNED_DISTANCE_TYPE_UNSIGNED)\n  {\n    assert(F.cols() == dim && \"F should have co-dimension 0 simplices\");\n  }\n\n  // Prepare distance computation\n  AABB<MatrixXd,3> tree3;\n  AABB<MatrixXd,2> tree2;\n  switch(dim)\n  {\n    default:\n    case 3:\n      tree3.init(V,F);\n      break;\n    case 2:\n      tree2.init(V,F);\n      break;\n  }\n\n  Eigen::MatrixXd FN,VN,EN;\n  Eigen::MatrixXi E;\n  Eigen::VectorXi EMAP;\n  WindingNumberAABB<Eigen::Vector3d> hier3;\n  switch(sign_type)\n  {\n    default:\n      assert(false && \"Unknown SignedDistanceType\");\n    case SIGNED_DISTANCE_TYPE_UNSIGNED:\n      // do nothing\n      break;\n    case SIGNED_DISTANCE_TYPE_DEFAULT:\n    case SIGNED_DISTANCE_TYPE_WINDING_NUMBER:\n      switch(dim)\n      {\n        default:\n        case 3:\n          hier3.set_mesh(V,F);\n          hier3.grow();\n          break;\n        case 2:\n          // no precomp, no hierarchy\n          break;\n      }\n      break;\n    case SIGNED_DISTANCE_TYPE_PSEUDONORMAL:\n      switch(dim)\n      {\n        default:\n        case 3:\n          // \"Signed Distance Computation Using the Angle Weighted Pseudonormal\"\n          // [Bærentzen & Aanæs 2005]\n          per_face_normals(V,F,FN);\n          per_vertex_normals(V,F,PER_VERTEX_NORMALS_WEIGHTING_TYPE_ANGLE,FN,VN);\n          per_edge_normals(\n            V,F,PER_EDGE_NORMALS_WEIGHTING_TYPE_UNIFORM,FN,EN,E,EMAP);\n          break;\n        case 2:\n          FN.resize(F.rows(),2);\n          VN = MatrixXd::Zero(V.rows(),2);\n          for(int e = 0;e<F.rows();e++)\n          {\n            // rotate edge vector\n            FN(e,0) =  (V(F(e,1),1)-V(F(e,0),1));\n            FN(e,1) = -(V(F(e,1),0)-V(F(e,0),0));\n            FN.row(e).normalize();\n            // add to vertex normal\n            VN.row(F(e,1)) += FN.row(e);\n            VN.row(F(e,0)) += FN.row(e);\n          }\n          // normalize to average\n          VN.rowwise().normalize();\n          break;\n      }\n      N.resize(P.rows(),dim);\n      break;\n  }\n\n  S.resize(P.rows(),1);\n  I.resize(P.rows(),1);\n  C.resize(P.rows(),dim);\n  for(int p = 0;p<P.rows();p++)\n  {\n    RowVector3d q3;\n    RowVector2d q2;\n    switch(P.cols())\n    {\n      default:\n      case 3:\n        q3 = P.row(p);\n        break;\n      case 2:\n        q2 = P.row(p);\n        break;\n    }\n    double s,sqrd;\n    RowVectorXd c;\n    RowVector3d c3;\n    RowVector2d c2;\n    int i=-1;\n    switch(sign_type)\n    {\n      default:\n        assert(false && \"Unknown SignedDistanceType\");\n      case SIGNED_DISTANCE_TYPE_UNSIGNED:\n        s = 1.;\n        sqrd = dim==3?\n          tree3.squared_distance(V,F,q3,i,c3):\n          tree2.squared_distance(V,F,q2,i,c2);\n        break;\n      case SIGNED_DISTANCE_TYPE_DEFAULT:\n      case SIGNED_DISTANCE_TYPE_WINDING_NUMBER:\n        dim==3 ? \n          signed_distance_winding_number(tree3,V,F,hier3,q3,s,sqrd,i,c3):\n          signed_distance_winding_number(tree2,V,F,q2,s,sqrd,i,c2);\n        break;\n      case SIGNED_DISTANCE_TYPE_PSEUDONORMAL:\n      {\n        RowVector3d n3;\n        RowVector2d n2;\n        dim==3 ?\n          signed_distance_pseudonormal(tree3,V,F,FN,VN,EN,EMAP,q3,s,sqrd,i,c3,n3):\n          signed_distance_pseudonormal(tree2,V,F,FN,VN,q2,s,sqrd,i,c2,n2);\n        Eigen::RowVectorXd n;\n        (dim==3 ? n = n3 : n = n2);\n        N.row(p) = n;\n        break;\n      }\n    }\n    I(p) = i;\n    S(p) = s*sqrt(sqrd);\n    C.row(p) = (dim==3 ? c=c3 : c=c2);\n  }\n}\n\n\nIGL_INLINE double igl::signed_distance_pseudonormal(\n  const AABB<Eigen::MatrixXd,3> & tree,\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  const Eigen::MatrixXd & FN,\n  const Eigen::MatrixXd & VN,\n  const Eigen::MatrixXd & EN,\n  const Eigen::VectorXi & EMAP,\n  const Eigen::RowVector3d & q)\n{\n  double s,sqrd;\n  Eigen::RowVector3d n,c;\n  int i = -1;\n  signed_distance_pseudonormal(tree,V,F,FN,VN,EN,EMAP,q,s,sqrd,i,c,n);\n  return s*sqrt(sqrd);\n}\n\nIGL_INLINE void igl::signed_distance_pseudonormal(\n  const Eigen::MatrixXd & P,\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  const AABB<Eigen::MatrixXd,3> & tree,\n  const Eigen::MatrixXd & FN,\n  const Eigen::MatrixXd & VN,\n  const Eigen::MatrixXd & EN,\n  const Eigen::VectorXi & EMAP,\n  Eigen::VectorXd & S,\n  Eigen::VectorXi & I,\n  Eigen::MatrixXd & C,\n  Eigen::MatrixXd & N)\n{\n  using namespace Eigen;\n  const size_t np = P.rows();\n  S.resize(np,1);\n  I.resize(np,1);\n  N.resize(np,3);\n  C.resize(np,3);\n# pragma omp parallel for if(np>1000)\n  for(size_t p = 0;p<np;p++)\n  {\n    double s,sqrd;\n    RowVector3d n,c;\n    int i = -1;\n    RowVector3d q = P.row(p);\n    signed_distance_pseudonormal(tree,V,F,FN,VN,EN,EMAP,q,s,sqrd,i,c,n);\n    S(p) = s*sqrt(sqrd);\n    I(p) = i;\n    N.row(p) = n;\n    C.row(p) = c;\n  }\n//  igl::AABB<MatrixXd,3> tree_P;\n//  MatrixXi J = igl::LinSpaced<VectorXi >(P.rows(),0,P.rows()-1);\n//  tree_P.init(P,J);\n//  tree.squared_distance(V,F,tree_P,P,J,S,I,C);\n//# pragma omp parallel for if(np>1000)\n//  for(size_t p = 0;p<np;p++)\n//  {\n//    RowVector3d c = C.row(p);\n//    RowVector3d q = P.row(p);\n//    const int f = I(p);\n//    double s;\n//    RowVector3d n;\n//    pseudonormal_test(V,F,FN,VN,EN,EMAP,q,f,c,s,n);\n//    N.row(p) = n;\n//    S(p) = s*sqrt(S(p));\n//  }\n\n}\n\nIGL_INLINE void igl::signed_distance_pseudonormal(\n  const AABB<Eigen::MatrixXd,3> & tree,\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  const Eigen::MatrixXd & FN,\n  const Eigen::MatrixXd & VN,\n  const Eigen::MatrixXd & EN,\n  const Eigen::VectorXi & EMAP,\n  const Eigen::RowVector3d & q,\n  double & s,\n  double & sqrd,\n  int & f,\n  Eigen::RowVector3d & c,\n  Eigen::RowVector3d & n)\n{\n  using namespace Eigen;\n  using namespace std;\n  sqrd = tree.squared_distance(V,F,q,f,c);\n  pseudonormal_test(V,F,FN,VN,EN,EMAP,q,f,c,s,n);\n}\n\nIGL_INLINE void igl::signed_distance_pseudonormal(\n  const AABB<Eigen::MatrixXd,2> & tree,\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  const Eigen::MatrixXd & FN,\n  const Eigen::MatrixXd & VN,\n  const Eigen::RowVector2d & q,\n  double & s,\n  double & sqrd,\n  int & f,\n  Eigen::RowVector2d & c,\n  Eigen::RowVector2d & n)\n{\n  using namespace Eigen;\n  using namespace std;\n  sqrd = tree.squared_distance(V,F,q,f,c);\n  pseudonormal_test(V,F,FN,VN,q,f,c,s,n);\n}\n\nIGL_INLINE double igl::signed_distance_winding_number(\n  const AABB<Eigen::MatrixXd,3> & tree,\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  const igl::WindingNumberAABB<Eigen::Vector3d> & hier,\n  const Eigen::RowVector3d & q)\n{\n  double s,sqrd;\n  Eigen::RowVector3d c;\n  int i=-1;\n  signed_distance_winding_number(tree,V,F,hier,q,s,sqrd,i,c);\n  return s*sqrt(sqrd);\n}\n\n\nIGL_INLINE void igl::signed_distance_winding_number(\n  const AABB<Eigen::MatrixXd,3> & tree,\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  const igl::WindingNumberAABB<Eigen::Matrix<double,3,1> > & hier,\n  const Eigen::Matrix<double,1,3> & q,\n  double & s,\n  double & sqrd,\n  int & i,\n  Eigen::Matrix<double,1,3> & c)\n{\n  using namespace Eigen;\n  using namespace std;\n  sqrd = tree.squared_distance(V,F,q,i,c);\n  const double w = hier.winding_number(q.transpose());\n  s = 1.-2.*w;\n}\n\nIGL_INLINE void igl::signed_distance_winding_number(\n  const AABB<Eigen::MatrixXd,2> & tree,\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  const Eigen::Matrix<double,1,2> & q,\n  double & s,\n  double & sqrd,\n  int & i,\n  Eigen::Matrix<double,1,2> & c)\n{\n  using namespace Eigen;\n  using namespace std;\n  sqrd = tree.squared_distance(V,F,q,i,c);\n  double w;\n  winding_number_2(V.data(), V.rows(), F.data(), F.rows(), q.data(), 1, &w);\n  s = 1.-2.*w;\n\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// This template is necessary for the others to compile with clang\n// http://stackoverflow.com/questions/27748442/is-clangs-c11-support-reliable\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/signed_distance.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_SIGNED_DISTANCE_H\n#define IGL_SIGNED_DISTANCE_H\n\n#include \"igl_inline.h\"\n#include \"AABB.h\"\n#include \"WindingNumberAABB.h\"\n#include <Eigen/Core>\n#include <vector>\nnamespace igl\n{\n  enum SignedDistanceType\n  {\n    // Use fast pseudo-normal test [Bærentzen & Aanæs 2005]\n    SIGNED_DISTANCE_TYPE_PSEUDONORMAL   = 0,\n    SIGNED_DISTANCE_TYPE_WINDING_NUMBER = 1,\n    SIGNED_DISTANCE_TYPE_DEFAULT        = 2,\n    SIGNED_DISTANCE_TYPE_UNSIGNED       = 3,\n    NUM_SIGNED_DISTANCE_TYPE            = 4\n  };\n  // Computes signed distance to a mesh\n  //\n  // Inputs:\n  //   P  #P by 3 list of query point positions\n  //   V  #V by 3 list of vertex positions\n  //   F  #F by ss list of triangle indices, ss should be 3 unless sign_type ==\n  //     SIGNED_DISTANCE_TYPE_UNSIGNED\n  //   sign_type  method for computing distance _sign_ S\n  // Outputs:\n  //   S  #P list of smallest signed distances\n  //   I  #P list of facet indices corresponding to smallest distances\n  //   C  #P by 3 list of closest points\n  //   N  #P by 3 list of closest normals (only set if\n  //     sign_type=SIGNED_DISTANCE_TYPE_PSEUDONORMAL)\n  //\n  // Known bugs: This only computes distances to triangles. So unreferenced\n  // vertices and degenerate triangles are ignored.\n  IGL_INLINE void signed_distance(\n    const Eigen::MatrixXd & P,\n    const Eigen::MatrixXd & V,\n    const Eigen::MatrixXi & F,\n    const SignedDistanceType sign_type,\n    Eigen::VectorXd & S,\n    Eigen::VectorXi & I,\n    Eigen::MatrixXd & C,\n    Eigen::MatrixXd & N);\n  // Computes signed distance to mesh\n  //\n  // Inputs:\n  //   tree  AABB acceleration tree (see AABB.h)\n  //   F  #F by 3 list of triangle indices\n  //   FN  #F by 3 list of triangle normals \n  //   VN  #V by 3 list of vertex normals (ANGLE WEIGHTING)\n  //   EN  #E by 3 list of edge normals (UNIFORM WEIGHTING)\n  //   EMAP  #F*3 mapping edges in F to E\n  //   q  Query point\n  // Returns signed distance to mesh\n  //\n  IGL_INLINE double signed_distance_pseudonormal(\n    const AABB<Eigen::MatrixXd,3> & tree,\n    const Eigen::MatrixXd & V,\n    const Eigen::MatrixXi & F,\n    const Eigen::MatrixXd & FN,\n    const Eigen::MatrixXd & VN,\n    const Eigen::MatrixXd & EN,\n    const Eigen::VectorXi & EMAP,\n    const Eigen::RowVector3d & q);\n  // Outputs:\n  //   s  sign\n  //   sqrd  squared distance\n  //   i  closest primitive\n  //   c  closest point\n  //   n  normal\n  IGL_INLINE void signed_distance_pseudonormal(\n    const Eigen::MatrixXd & P,\n    const Eigen::MatrixXd & V,\n    const Eigen::MatrixXi & F,\n    const AABB<Eigen::MatrixXd,3> & tree,\n    const Eigen::MatrixXd & FN,\n    const Eigen::MatrixXd & VN,\n    const Eigen::MatrixXd & EN,\n    const Eigen::VectorXi & EMAP,\n    Eigen::VectorXd & S,\n    Eigen::VectorXi & I,\n    Eigen::MatrixXd & C,\n    Eigen::MatrixXd & N);\n  IGL_INLINE void signed_distance_pseudonormal(\n    const AABB<Eigen::MatrixXd,3> & tree,\n    const Eigen::MatrixXd & V,\n    const Eigen::MatrixXi & F,\n    const Eigen::MatrixXd & FN,\n    const Eigen::MatrixXd & VN,\n    const Eigen::MatrixXd & EN,\n    const Eigen::VectorXi & EMAP,\n    const Eigen::RowVector3d & q,\n    double & s,\n    double & sqrd,\n    int & i,\n    Eigen::RowVector3d & c,\n    Eigen::RowVector3d & n);\n  IGL_INLINE void signed_distance_pseudonormal(\n    const AABB<Eigen::MatrixXd,2> & tree,\n    const Eigen::MatrixXd & V,\n    const Eigen::MatrixXi & F,\n    const Eigen::MatrixXd & FN,\n    const Eigen::MatrixXd & VN,\n    const Eigen::RowVector2d & q,\n    double & s,\n    double & sqrd,\n    int & i,\n    Eigen::RowVector2d & c,\n    Eigen::RowVector2d & n);\n\n  // Inputs:\n  //   tree  AABB acceleration tree (see cgal/point_mesh_squared_distance.h)\n  //   hier  Winding number evaluation hierarchy\n  //   q  Query point\n  // Returns signed distance to mesh\n  IGL_INLINE double signed_distance_winding_number(\n    const AABB<Eigen::MatrixXd,3> & tree,\n    const Eigen::MatrixXd & V,\n    const Eigen::MatrixXi & F,\n    const igl::WindingNumberAABB<Eigen::Vector3d> & hier,\n    const Eigen::RowVector3d & q);\n  // Outputs:\n  //   s  sign\n  //   sqrd  squared distance\n  //   pp  closest point and primitve\n  IGL_INLINE void signed_distance_winding_number(\n    const AABB<Eigen::MatrixXd,3> & tree,\n    const Eigen::MatrixXd & V,\n    const Eigen::MatrixXi & F,\n    const igl::WindingNumberAABB<Eigen::Matrix<double,3,1> > & hier,\n    const Eigen::Matrix<double,1,3> & q,\n    double & s,\n    double & sqrd,\n    int & i,\n    Eigen::Matrix<double,1,3> & c);\n  IGL_INLINE void signed_distance_winding_number(\n    const AABB<Eigen::MatrixXd,2> & tree,\n    const Eigen::MatrixXd & V,\n    const Eigen::MatrixXi & F,\n    const Eigen::Matrix<double,1,2> & q,\n    double & s,\n    double & sqrd,\n    int & i,\n    Eigen::Matrix<double,1,2> & c);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"signed_distance.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/simplify_polyhedron.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"simplify_polyhedron.h\"\n#include \"decimate.h\"\n#include \"circulation.h\"\n#include \"per_face_normals.h\"\n#include \"infinite_cost_stopping_condition.h\"\n#include <functional>\n\nIGL_INLINE void igl::simplify_polyhedron(\n  const Eigen::MatrixXd & OV,\n  const Eigen::MatrixXi & OF,\n  Eigen::MatrixXd & V,\n  Eigen::MatrixXi & F,\n  Eigen::VectorXi & J)\n{\n  // TODO: to generalize to open meshes, 0-cost should keep all incident\n  // boundary edges on their original lines. (for non-manifold meshes,\n  // igl::decimate needs to be generalized)\n\n  Eigen::MatrixXd N;\n  // Function for computing cost of collapsing edge (0 if at least one\n  // direction doesn't change pointset, inf otherwise) and placement (in lowest\n  // cost direction).\n  const auto & perfect= [&N](\n    const int e,\n    const Eigen::MatrixXd & V,\n    const Eigen::MatrixXi & F,\n    const Eigen::MatrixXi & E,\n    const Eigen::VectorXi & EMAP,\n    const Eigen::MatrixXi & EF,\n    const Eigen::MatrixXi & EI,\n    double & cost,\n    Eigen::RowVectorXd & p)\n  {\n    // Function for ocmputing cost (0 or inf) of collapsing edge by placing\n    // vertex at `positive` end of edge.\n    const auto & perfect_directed = [&N](\n      const int e,\n      const bool positive,\n      const Eigen::MatrixXd & V,\n      const Eigen::MatrixXi & F,\n      const Eigen::MatrixXi & E,\n      const Eigen::VectorXi & EMAP,\n      const Eigen::MatrixXi & EF,\n      const Eigen::MatrixXi & EI,\n      double & cost,\n      Eigen::RowVectorXd & p)\n    {\n      const auto vi = E(e,positive);\n      const auto vj = E(e,!positive);\n      p = V.row(vj);\n      std::vector<int> faces = igl::circulation(e,positive,F,E,EMAP,EF,EI);\n      cost = 0;\n      for(auto f : faces)\n      {\n        // Skip the faces being collapsed\n        if(f == EF(e,0) || f == EF(e,1))\n        {\n          continue;\n        }\n        const Eigen::RowVectorXd nbefore = N.row(f);\n        // Face with vi replaced with vj\n        const Eigen::RowVector3i fafter(\n            F(f,0) == vi ? vj : F(f,0),\n            F(f,1) == vi ? vj : F(f,1),\n            F(f,2) == vi ? vj : F(f,2));\n        Eigen::RowVectorXd nafter;\n        igl::per_face_normals(V,fafter,nafter);\n        const double epsilon = 1e-10;\n        // if normal changed then not feasible, break\n        if((nbefore-nafter).norm() > epsilon)\n        {\n          cost = std::numeric_limits<double>::infinity();\n          break;\n        }\n      }\n    }; \n    p.resize(3);\n    double cost0, cost1;\n    Eigen::RowVectorXd p0, p1;\n    perfect_directed(e,false,V,F,E,EMAP,EF,EI,cost0,p0);\n    perfect_directed(e,true,V,F,E,EMAP,EF,EI,cost1,p1);\n    if(cost0 < cost1)\n    {\n      cost = cost0;\n      p = p0;\n    }else\n    {\n      cost = cost1;\n      p = p1;\n    }\n  };\n  igl::per_face_normals(OV,OF,N);\n  Eigen::VectorXi I;\n  igl::decimate(\n    OV,OF,\n    perfect,\n    igl::infinite_cost_stopping_condition(perfect),\n    V,F,J,I);\n}\n\n"
  },
  {
    "path": "libs/libigl/include/igl/simplify_polyhedron.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_SIMPLIFY_POLYHEDRON_H\n#define IGL_SIMPLIFY_POLYHEDRON_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Simplify a polyhedron represented as a triangle mesh (OV,OF) by collapsing\n  // any edge that doesn't contribute to defining surface's pointset. This\n  // _would_ also make sense for open and non-manifold meshes, but the current\n  // implementation only works with closed manifold surfaces with well defined\n  // triangle normals.\n  //\n  // Inputs:\n  //   OV  #OV by 3 list of input mesh vertex positions\n  //   OF  #OF by 3 list of input mesh triangle indices into OV\n  // Outputs:\n  //   V  #V by 3 list of output mesh vertex positions\n  //   F  #F by 3 list of input mesh triangle indices into V\n  //   J  #F list of indices into OF of birth parents\n  IGL_INLINE void simplify_polyhedron(\n    const Eigen::MatrixXd & OV,\n    const Eigen::MatrixXi & OF,\n    Eigen::MatrixXd & V,\n    Eigen::MatrixXi & F,\n    Eigen::VectorXi & J);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"simplify_polyhedron.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/slice.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"slice.h\"\n#include \"colon.h\"\n\n#include <vector>\n#include <unsupported/Eigen/SparseExtra>\n\ntemplate <typename TX, typename TY>\nIGL_INLINE void igl::slice(\n  const Eigen::SparseMatrix<TX>& X,\n  const Eigen::Matrix<int,Eigen::Dynamic,1> & R,\n  const Eigen::Matrix<int,Eigen::Dynamic,1> & C,\n  Eigen::SparseMatrix<TY>& Y)\n{\n#if 1\n  int xm = X.rows();\n  int xn = X.cols();\n  int ym = R.size();\n  int yn = C.size();\n\n  // special case when R or C is empty\n  if(ym == 0 || yn == 0)\n  {\n    Y.resize(ym,yn);\n    return;\n  }\n\n  assert(R.minCoeff() >= 0);\n  assert(R.maxCoeff() < xm);\n  assert(C.minCoeff() >= 0);\n  assert(C.maxCoeff() < xn);\n\n  // Build reindexing maps for columns and rows, -1 means not in map\n  std::vector<std::vector<int> > RI;\n  RI.resize(xm);\n  for(int i = 0;i<ym;i++)\n  {\n    RI[R(i)].push_back(i);\n  }\n  std::vector<std::vector<int> > CI;\n  CI.resize(xn);\n  // initialize to -1\n  for(int i = 0;i<yn;i++)\n  {\n    CI[C(i)].push_back(i);\n  }\n  // Resize output\n  Eigen::DynamicSparseMatrix<TY, Eigen::RowMajor> dyn_Y(ym,yn);\n  // Take a guess at the number of nonzeros (this assumes uniform distribution\n  // not banded or heavily diagonal)\n  dyn_Y.reserve((X.nonZeros()/(X.rows()*X.cols())) * (ym*yn));\n  // Iterate over outside\n  for(int k=0; k<X.outerSize(); ++k)\n  {\n    // Iterate over inside\n    for(typename Eigen::SparseMatrix<TX>::InnerIterator it (X,k); it; ++it)\n    {\n      std::vector<int>::iterator rit, cit;\n      for(rit = RI[it.row()].begin();rit != RI[it.row()].end(); rit++)\n      {\n        for(cit = CI[it.col()].begin();cit != CI[it.col()].end(); cit++)\n        {\n          dyn_Y.coeffRef(*rit,*cit) = it.value();\n        }\n      }\n    }\n  }\n  Y = Eigen::SparseMatrix<TY>(dyn_Y);\n#else\n\n  // Alec: This is _not_ valid for arbitrary R,C since they don't necessary\n  // representation a strict permutation of the rows and columns: rows or\n  // columns could be removed or replicated. The removal of rows seems to be\n  // handled here (although it's not clear if there is a performance gain when\n  // the #removals >> #remains). If this is sufficiently faster than the\n  // correct code above, one could test whether all entries in R and C are\n  // unique and apply the permutation version if appropriate.\n  //\n\n  int xm = X.rows();\n  int xn = X.cols();\n  int ym = R.size();\n  int yn = C.size();\n\n  // special case when R or C is empty\n  if(ym == 0 || yn == 0)\n  {\n    Y.resize(ym,yn);\n    return;\n  }\n\n  assert(R.minCoeff() >= 0);\n  assert(R.maxCoeff() < xm);\n  assert(C.minCoeff() >= 0);\n  assert(C.maxCoeff() < xn);\n\n  // initialize row and col permutation vectors\n  Eigen::VectorXi rowIndexVec = igl::LinSpaced<Eigen::VectorXi >(xm,0,xm-1);\n  Eigen::VectorXi rowPermVec  = igl::LinSpaced<Eigen::VectorXi >(xm,0,xm-1);\n  for(int i=0;i<ym;i++)\n  {\n    int pos = rowIndexVec.coeffRef(R(i));\n    if(pos != i)\n    {\n      int& val = rowPermVec.coeffRef(i);\n      std::swap(rowIndexVec.coeffRef(val),rowIndexVec.coeffRef(R(i)));\n      std::swap(rowPermVec.coeffRef(i),rowPermVec.coeffRef(pos));\n    }\n  }\n  Eigen::PermutationMatrix<Eigen::Dynamic,Eigen::Dynamic,int> rowPerm(rowIndexVec);\n\n  Eigen::VectorXi colIndexVec = igl::LinSpaced<Eigen::VectorXi >(xn,0,xn-1);\n  Eigen::VectorXi colPermVec =  igl::LinSpaced<Eigen::VectorXi >(xn,0,xn-1);\n  for(int i=0;i<yn;i++)\n  {\n    int pos = colIndexVec.coeffRef(C(i));\n    if(pos != i)\n    {\n      int& val = colPermVec.coeffRef(i);\n      std::swap(colIndexVec.coeffRef(val),colIndexVec.coeffRef(C(i)));\n      std::swap(colPermVec.coeffRef(i),colPermVec.coeffRef(pos));\n    }\n  }\n  Eigen::PermutationMatrix<Eigen::Dynamic,Eigen::Dynamic,int> colPerm(colPermVec);\n\n  Eigen::SparseMatrix<T> M = (rowPerm * X);\n  Y = (M * colPerm).block(0,0,ym,yn);\n#endif\n}\n\ntemplate <typename MatX, typename DerivedR, typename MatY>\nIGL_INLINE void igl::slice(\n  const MatX& X,\n  const Eigen::DenseBase<DerivedR> & R,\n  const int dim,\n  MatY& Y)\n{\n  Eigen::Matrix<typename DerivedR::Scalar,Eigen::Dynamic,1> C;\n  switch(dim)\n  {\n    case 1:\n      // boring base case\n      if(X.cols() == 0)\n      {\n        Y.resize(R.size(),0);\n        return;\n      }\n      igl::colon(0,X.cols()-1,C);\n      return slice(X,R,C,Y);\n    case 2:\n      // boring base case\n      if(X.rows() == 0)\n      {\n        Y.resize(0,R.size());\n        return;\n      }\n      igl::colon(0,X.rows()-1,C);\n      return slice(X,C,R,Y);\n    default:\n      assert(false && \"Unsupported dimension\");\n      return;\n  }\n}\n\ntemplate <\n  typename DerivedX,\n  typename DerivedR,\n  typename DerivedC,\n  typename DerivedY>\nIGL_INLINE void igl::slice(\n  const Eigen::DenseBase<DerivedX> & X,\n  const Eigen::DenseBase<DerivedR> & R,\n  const Eigen::DenseBase<DerivedC> & C,\n  Eigen::PlainObjectBase<DerivedY> & Y)\n{\n#ifndef NDEBUG\n  int xm = X.rows();\n  int xn = X.cols();\n#endif\n  int ym = R.size();\n  int yn = C.size();\n\n  // special case when R or C is empty\n  if(ym == 0 || yn == 0)\n  {\n    Y.resize(ym,yn);\n    return;\n  }\n\n  assert(R.minCoeff() >= 0);\n  assert(R.maxCoeff() < xm);\n  assert(C.minCoeff() >= 0);\n  assert(C.maxCoeff() < xn);\n\n  // Resize output\n  Y.resize(ym,yn);\n  // loop over output rows, then columns\n  for(int i = 0;i<ym;i++)\n  {\n    for(int j = 0;j<yn;j++)\n    {\n      Y(i,j) = X(R(i),C(j));\n    }\n  }\n}\n\n\ntemplate <typename DerivedX, typename DerivedY>\nIGL_INLINE void igl::slice(\n  const Eigen::DenseBase<DerivedX> & X,\n  const Eigen::Matrix<int,Eigen::Dynamic,1> & R,\n  Eigen::PlainObjectBase<DerivedY> & Y)\n{\n  // phony column indices\n  Eigen::Matrix<int,Eigen::Dynamic,1> C;\n  C.resize(1);\n  C(0) = 0;\n  return igl::slice(X,R,C,Y);\n}\n\ntemplate <typename DerivedX>\nIGL_INLINE DerivedX igl::slice(\n  const Eigen::DenseBase<DerivedX> & X,\n  const Eigen::Matrix<int,Eigen::Dynamic,1> & R)\n{\n  DerivedX Y;\n  igl::slice(X,R,Y);\n  return Y;\n}\n\ntemplate <typename DerivedX>\nIGL_INLINE DerivedX igl::slice(\n  const Eigen::DenseBase<DerivedX>& X,\n  const Eigen::Matrix<int,Eigen::Dynamic,1> & R,\n  const int dim)\n{\n  DerivedX Y;\n  igl::slice(X,R,dim,Y);\n  return Y;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::slice<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 1, -1, -1> >(Eigen::Matrix<double, -1, -1, 1, -1, -1> const&, Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int, Eigen::Matrix<double, -1, -1, 1, -1, -1>&);\n// generated by autoexplicit.sh\ntemplate void igl::slice<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 1, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::slice<Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::slice<Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, Eigen::DenseBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, int, Eigen::Matrix<int, -1, 1, 0, -1, 1>&);\n// generated by autoexplicit.sh\ntemplate void igl::slice<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 1, -1, -1> >(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int, Eigen::Matrix<double, -1, -1, 1, -1, -1>&);\n// generated by autoexplicit.sh\ntemplate void igl::slice<Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> >, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::slice<Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::DenseBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::slice<Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::slice<Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\n// generated by autoexplicit.sh\ntemplate void igl::slice<Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::slice<Eigen::Array<bool, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Array<bool, -1, 3, 0, -1, 3> >(Eigen::Array<bool, -1, 3, 0, -1, 3> const&, Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int, Eigen::Array<bool, -1, 3, 0, -1, 3>&);\n// generated by autoexplicit.sh\ntemplate void igl::slice<Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int, Eigen::Matrix<double, -1, -1, 0, -1, -1>&);\n// generated by autoexplicit.sh\ntemplate void igl::slice<Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> >, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 2, 0, -1, 2> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> > const&, Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int, Eigen::Matrix<double, -1, 2, 0, -1, 2>&);\n// generated by autoexplicit.sh\ntemplate void igl::slice<Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 2, 0, -1, 2> >(Eigen::Matrix<int, -1, 2, 0, -1, 2> const&, Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int, Eigen::Matrix<int, -1, 2, 0, -1, 2>&);\n// generated by autoexplicit.sh\ntemplate void igl::slice<Eigen::Array<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::Array<int, -1, 1, 0, -1, 1> const&, Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int, Eigen::Matrix<int, -1, 1, 0, -1, 1>&);\n// generated by autoexplicit.sh\ntemplate void igl::slice<Eigen::Array<bool, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Array<bool, -1, 1, 0, -1, 1> >(Eigen::Array<bool, -1, 1, 0, -1, 1> const&, Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int, Eigen::Array<bool, -1, 1, 0, -1, 1>&);\n// generated by autoexplicit.sh\ntemplate void igl::slice<Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 2, 0, -1, 2> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int, Eigen::Matrix<int, -1, 2, 0, -1, 2>&);\n// generated by autoexplicit.sh\ntemplate void igl::slice<Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> >, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int, Eigen::Matrix<double, -1, -1, 0, -1, -1>&);\n// generated by autoexplicit.sh\ntemplate void igl::slice<Eigen::SparseMatrix<bool, 0, int>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::SparseMatrix<bool, 0, int> >(Eigen::SparseMatrix<bool, 0, int> const&, Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int, Eigen::SparseMatrix<bool, 0, int>&);\n// generated by autoexplicit.sh\ntemplate void igl::slice<Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> >, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int, Eigen::Matrix<double, -1, -1, 0, -1, -1>&);\n// generated by autoexplicit.sh\ntemplate void igl::slice<Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> >, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 2, 0, -1, 2> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int, Eigen::Matrix<double, -1, 2, 0, -1, 2>&);\n// generated by autoexplicit.sh\ntemplate void igl::slice<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::Matrix<double, -1, -1, 1, -1, -1> const&, Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int, Eigen::Matrix<double, -1, -1, 0, -1, -1>&);\n// generated by autoexplicit.sh\ntemplate void igl::slice<Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int, Eigen::Matrix<int, -1, 1, 0, -1, 1>&);\n// generated by autoexplicit.sh\ntemplate Eigen::Matrix<int, -1, -1, 0, -1, -1> igl::slice<Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&);\n// generated by autoexplicit.sh\ntemplate void igl::slice<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::DenseBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::slice<Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> > >(Eigen::Matrix<long, -1, 1, 0, -1, 1> const&, Eigen::DenseBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&);\ntemplate void igl::slice<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > >(Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, Eigen::DenseBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::slice<Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > >(Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::slice<Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::DenseBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::slice<Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::DenseBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::slice<Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate Eigen::Matrix<double, -1, 1, 0, -1, 1> igl::slice<Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, int);\ntemplate Eigen::Matrix<double, -1, 1, 0, -1, 1> igl::slice<Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&);\ntemplate Eigen::Matrix<int, -1, -1, 0, -1, -1> igl::slice<Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, int);\ntemplate void igl::slice<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::slice<Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::DenseBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::slice<Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::slice<Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\ntemplate void igl::slice<Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::slice<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int, Eigen::Matrix<double, -1, -1, 0, -1, -1>&);\ntemplate void igl::slice<Eigen::Matrix<float, -1, 1, 0, -1, 1>, Eigen::Matrix<float, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<float, -1, 1, 0, -1, 1> > const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 1, 0, -1, 1> >&);\ntemplate void igl::slice<std::complex<double>, std::complex<double> >(Eigen::SparseMatrix<std::complex<double>, 0, int> const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, Eigen::SparseMatrix<std::complex<double>, 0, int>&);\ntemplate Eigen::Matrix<double, -1, -1, 0, -1, -1> igl::slice<Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, int);\ntemplate void igl::slice<Eigen::SparseMatrix<double, 0, int>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::SparseMatrix<double, 0, int> >(Eigen::SparseMatrix<double, 0, int> const&, Eigen::DenseBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, int, Eigen::SparseMatrix<double, 0, int>&);\ntemplate void igl::slice<double, double>(Eigen::SparseMatrix<double, 0, int> const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, Eigen::SparseMatrix<double, 0, int>&);\ntemplate void igl::slice<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::slice<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\ntemplate void igl::slice<Eigen::SparseMatrix<double, 0, int>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::SparseMatrix<double, 0, int> >(Eigen::SparseMatrix<double, 0, int> const&, Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int, Eigen::SparseMatrix<double, 0, int>&);\ntemplate void igl::slice<Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/slice.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_SLICE_H\n#define IGL_SLICE_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Sparse>\nnamespace igl\n{\n  // Act like the matlab X(row_indices,col_indices) operator, where\n  // row_indices, col_indices are non-negative integer indices.\n  // \n  // Inputs:\n  //   X  m by n matrix\n  //   R  list of row indices\n  //   C  list of column indices\n  // Output:\n  //   Y  #R by #C matrix\n  //\n  // See also: slice_mask\n  template <\n    typename TX, \n    typename TY>\n  IGL_INLINE void slice(\n    const Eigen::SparseMatrix<TX>& X,\n    const Eigen::Matrix<int,Eigen::Dynamic,1> & R,\n    const Eigen::Matrix<int,Eigen::Dynamic,1> & C,\n    Eigen::SparseMatrix<TY>& Y);\n  // Wrapper to only slice in one direction\n  //\n  // Inputs:\n  //   dim  dimension to slice in 1 or 2, dim=1 --> X(R,:), dim=2 --> X(:,R)\n  //\n  // Note: For now this is just a cheap wrapper.\n  template <\n    typename MatX, \n    typename DerivedR,\n    typename MatY>\n  IGL_INLINE void slice(\n    const MatX& X,\n    const Eigen::DenseBase<DerivedR> & R,\n    const int dim,\n    MatY& Y);\n  template <\n    typename DerivedX, \n    typename DerivedR, \n    typename DerivedC, \n    typename DerivedY>\n  IGL_INLINE void slice(\n    const Eigen::DenseBase<DerivedX> & X,\n    const Eigen::DenseBase<DerivedR> & R,\n    const Eigen::DenseBase<DerivedC> & C,\n    Eigen::PlainObjectBase<DerivedY> & Y);\n\n  template <typename DerivedX, typename DerivedY>\n  IGL_INLINE void slice(\n    const Eigen::DenseBase<DerivedX> & X,\n    const Eigen::Matrix<int,Eigen::Dynamic,1> & R,\n    Eigen::PlainObjectBase<DerivedY> & Y);\n  // VectorXi Y = slice(X,R);\n  //\n  // This templating is bad because the return type might not have the same\n  // size as `DerivedX`. This will probably only work if DerivedX has Dynamic\n  // as it's non-trivial sizes or if the number of rows in R happens to equal\n  // the number of rows in `DerivedX`.\n  template <typename DerivedX>\n  IGL_INLINE DerivedX slice(\n    const Eigen::DenseBase<DerivedX> & X,\n    const Eigen::Matrix<int,Eigen::Dynamic,1> & R);\n  template <typename DerivedX>\n  IGL_INLINE DerivedX slice(\n    const Eigen::DenseBase<DerivedX>& X,\n    const Eigen::Matrix<int,Eigen::Dynamic,1> & R,\n    const int dim);\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"slice.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/slice_into.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"slice_into.h\"\n#include \"colon.h\"\n\n// Bug in unsupported/Eigen/SparseExtra needs iostream first\n#include <iostream>\n#include <unsupported/Eigen/SparseExtra>\n\ntemplate <typename T>\nIGL_INLINE void igl::slice_into(\n  const Eigen::SparseMatrix<T>& X,\n  const Eigen::Matrix<int,Eigen::Dynamic,1> & R,\n  const Eigen::Matrix<int,Eigen::Dynamic,1> & C,\n  Eigen::SparseMatrix<T>& Y)\n{\n\n#ifndef NDEBUG\n  int xm = X.rows();\n  int xn = X.cols();\n  assert(R.size() == xm);\n  assert(C.size() == xn);\n  int ym = Y.size();\n  int yn = Y.size();\n  assert(R.minCoeff() >= 0);\n  assert(R.maxCoeff() < ym);\n  assert(C.minCoeff() >= 0);\n  assert(C.maxCoeff() < yn);\n#endif\n\n  // create temporary dynamic sparse matrix\n  Eigen::DynamicSparseMatrix<T, Eigen::RowMajor>  dyn_Y(Y);\n  // Iterate over outside\n  for(int k=0; k<X.outerSize(); ++k)\n  {\n    // Iterate over inside\n    for(typename Eigen::SparseMatrix<T>::InnerIterator it (X,k); it; ++it)\n    {\n      dyn_Y.coeffRef(R(it.row()),C(it.col())) = it.value();\n    }\n  }\n  Y = Eigen::SparseMatrix<T>(dyn_Y);\n}\n\ntemplate <typename DerivedX, typename DerivedY>\nIGL_INLINE void igl::slice_into(\n  const Eigen::DenseBase<DerivedX> & X,\n  const Eigen::Matrix<int,Eigen::Dynamic,1> & R,\n  const Eigen::Matrix<int,Eigen::Dynamic,1> & C,\n  Eigen::PlainObjectBase<DerivedY> & Y)\n{\n\n  int xm = X.rows();\n  int xn = X.cols();\n#ifndef NDEBUG\n  assert(R.size() == xm);\n  assert(C.size() == xn);\n  int ym = Y.size();\n  int yn = Y.size();\n  assert(R.minCoeff() >= 0);\n  assert(R.maxCoeff() < ym);\n  assert(C.minCoeff() >= 0);\n  assert(C.maxCoeff() < yn);\n#endif\n\n  // Build reindexing maps for columns and rows, -1 means not in map\n  Eigen::Matrix<int,Eigen::Dynamic,1> RI;\n  RI.resize(xm);\n  for(int i = 0;i<xm;i++)\n  {\n    for(int j = 0;j<xn;j++)\n    {\n      Y(R(i),C(j)) = X(i,j);\n    }\n  }\n}\n\ntemplate <typename MatX, typename MatY>\nIGL_INLINE void igl::slice_into(\n  const MatX& X,\n  const Eigen::Matrix<int,Eigen::Dynamic,1> & R,\n  const int dim,\n  MatY& Y)\n{\n  Eigen::VectorXi C;\n  switch(dim)\n  {\n    case 1:\n      assert(R.size() == X.rows());\n      // boring base case\n      if(X.cols() == 0)\n      {\n        return;\n      }\n      igl::colon(0,X.cols()-1,C);\n      return slice_into(X,R,C,Y);\n    case 2:\n      assert(R.size() == X.cols());\n      // boring base case\n      if(X.rows() == 0)\n      {\n        return;\n      }\n      igl::colon(0,X.rows()-1,C);\n      return slice_into(X,C,R,Y);\n    default:\n      assert(false && \"Unsupported dimension\");\n      return;\n  }\n}\n\ntemplate <typename DerivedX, typename DerivedY>\nIGL_INLINE void igl::slice_into(\n  const Eigen::DenseBase<DerivedX> & X,\n  const Eigen::Matrix<int,Eigen::Dynamic,1> & R,\n  Eigen::PlainObjectBase<DerivedY> & Y)\n{\n  // phony column indices\n  Eigen::Matrix<int,Eigen::Dynamic,1> C;\n  C.resize(1);\n  C(0) = 0;\n  return igl::slice_into(X,R,C,Y);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::slice_into<Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, int, Eigen::Matrix<int, -1, 1, 0, -1, 1>&);\n// generated by autoexplicit.sh\ntemplate void igl::slice_into<Eigen::Matrix<double, -1, 2, 0, -1, 2>, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > >(Eigen::Matrix<double, -1, 2, 0, -1, 2> const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::slice_into<Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1>, -1, -1, true>, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > >(Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1>, -1, -1, true> const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::slice_into<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > >(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::slice_into<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > >(Eigen::Matrix<double, -1, 1, 0, -1, 1> const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\ntemplate void igl::slice_into<double>(Eigen::SparseMatrix<double, 0, int> const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, Eigen::SparseMatrix<double, 0, int>&);\ntemplate void igl::slice_into<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::Matrix<double, -1, 1, 0, -1, 1> const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, int, Eigen::Matrix<double, -1, 1, 0, -1, 1>&);\ntemplate void igl::slice_into<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\ntemplate void igl::slice_into<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, int, Eigen::Matrix<double, -1, -1, 0, -1, -1>&);\ntemplate void igl::slice_into<Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::slice_into<Eigen::SparseMatrix<double, 0, int>, Eigen::SparseMatrix<double, 0, int> >(Eigen::SparseMatrix<double, 0, int> const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, int, Eigen::SparseMatrix<double, 0, int>&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/slice_into.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_SLICE_INTO_H\n#define IGL_SLICE_INTO_H\n#include \"igl_inline.h\"\n\n#define EIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET\n#include <Eigen/Dense>\n#include <Eigen/Sparse>\nnamespace igl\n{\n  // Act like the matlab Y(row_indices,col_indices) = X\n  // \n  // Inputs:\n  //   X  xm by xn rhs matrix\n  //   R  list of row indices\n  //   C  list of column indices\n  //   Y  ym by yn lhs matrix\n  // Output:\n  //   Y  ym by yn lhs matrix, same as input but Y(R,C) = X\n  template <typename T>\n  IGL_INLINE void slice_into(\n    const Eigen::SparseMatrix<T>& X,\n    const Eigen::Matrix<int,Eigen::Dynamic,1> & R,\n    const Eigen::Matrix<int,Eigen::Dynamic,1> & C,\n    Eigen::SparseMatrix<T>& Y);\n\n  template <typename DerivedX, typename DerivedY>\n  IGL_INLINE void slice_into(\n    const Eigen::DenseBase<DerivedX> & X,\n    const Eigen::Matrix<int,Eigen::Dynamic,1> & R,\n    const Eigen::Matrix<int,Eigen::Dynamic,1> & C,\n    Eigen::PlainObjectBase<DerivedY> & Y);\n  // Wrapper to only slice in one direction\n  //\n  // Inputs:\n  //   dim  dimension to slice in 1 or 2, dim=1 --> X(R,:), dim=2 --> X(:,R)\n  //\n  // Note: For now this is just a cheap wrapper.\n  template <typename MatX, typename MatY>\n  IGL_INLINE void slice_into(\n    const MatX & X,\n    const Eigen::Matrix<int,Eigen::Dynamic,1> & R,\n    const int dim,\n    MatY& Y);\n\n  template <typename DerivedX, typename DerivedY>\n  IGL_INLINE void slice_into(\n    const Eigen::DenseBase<DerivedX> & X,\n    const Eigen::Matrix<int,Eigen::Dynamic,1> & R,\n    Eigen::PlainObjectBase<DerivedY> & Y);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"slice_into.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/slice_mask.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"slice_mask.h\"\n#include \"slice.h\"\n#include \"find.h\"\n#include <cassert>\n\ntemplate <typename DerivedX,typename DerivedY>\nIGL_INLINE void igl::slice_mask(\n  const Eigen::DenseBase<DerivedX> & X,\n  const Eigen::Array<bool,Eigen::Dynamic,1> & R,\n  const Eigen::Array<bool,Eigen::Dynamic,1> & C,\n  Eigen::PlainObjectBase<DerivedY> & Y)\n{\n  int xm = X.rows();\n  int xn = X.cols();\n  int ym = R.count();\n  int yn = C.count();\n  assert(R.size() == X.rows() && \"R.size() should match X.rows()\");\n  assert(C.size() == X.cols() && \"C.size() should match X.cols()\");\n  Y.resize(ym,yn);\n  {\n    int yi = 0;\n    for(int i = 0;i<xm;i++)\n    {\n      if(R(i))\n      {\n        int yj = 0;\n        for(int j = 0;j<xn;j++)\n        {\n          if(C(j))\n          {\n            Y(yi,yj) = X(i,j);\n            yj++;\n          }\n        }\n        yi++;\n      }\n    }\n  }\n}\n\ntemplate <typename DerivedX, typename DerivedY>\nIGL_INLINE void igl::slice_mask(\n  const Eigen::DenseBase<DerivedX> & X,\n  const Eigen::Array<bool,Eigen::Dynamic,1> & R,\n  const int dim,\n  Eigen::PlainObjectBase<DerivedY> & Y)\n{\n  switch(dim)\n  {\n    case 1:\n    {\n      const int ym = R.count();\n      assert(X.rows() == R.size() && \"X.rows() should match R.size()\");\n      Y.resize(ym,X.cols());\n      {\n        int yi = 0;\n        for(int i = 0;i<X.rows();i++)\n        {\n          if(R(i))\n          {\n            Y.row(yi++) = X.row(i);\n          }\n        }\n      }\n      return;\n    }\n    case 2:\n    {\n      const auto & C = R;\n      const int yn = C.count();\n      Y.resize(X.rows(),yn);\n      assert(X.cols() == R.size() && \"X.cols() should match R.size()\");\n      {\n        int yj = 0;\n        for(int j = 0;j<X.cols();j++)\n        {\n          if(C(j))\n          {\n            Y.col(yj++) = X.col(j);\n          }\n        }\n      }\n      return;\n    }\n    default:\n      assert(false && \"Unsupported dimension\");\n      return;\n  }\n}\n\ntemplate <typename DerivedX>\nIGL_INLINE DerivedX igl::slice_mask(\n  const Eigen::DenseBase<DerivedX> & X,\n  const Eigen::Array<bool,Eigen::Dynamic,1> & R,\n  const Eigen::Array<bool,Eigen::Dynamic,1> & C)\n{\n  DerivedX Y;\n  igl::slice_mask(X,R,C,Y);\n  return Y;\n}\n\ntemplate <typename DerivedX>\nIGL_INLINE DerivedX igl::slice_mask(\n  const Eigen::DenseBase<DerivedX>& X,\n  const Eigen::Array<bool,Eigen::Dynamic,1> & R,\n  const int dim)\n{\n  DerivedX Y;\n  igl::slice_mask(X,R,dim,Y);\n  return Y;\n}\n\n\ntemplate <typename XType, typename YType>\nIGL_INLINE void igl::slice_mask(\n  const Eigen::SparseMatrix<XType> & X,\n  const Eigen::Array<bool,Eigen::Dynamic,1> & R,\n  const int dim,\n  Eigen::SparseMatrix<YType> & Y)\n{\n  // Cheapskate solution\n  Eigen::VectorXi Ri;\n  find(R,Ri);\n  return slice(X,Ri,dim,Y);\n}\n\ntemplate <typename XType, typename YType>\nIGL_INLINE void igl::slice_mask(\n  const Eigen::SparseMatrix<XType> & X,\n  const Eigen::Array<bool,Eigen::Dynamic,1> & R,\n  const Eigen::Array<bool,Eigen::Dynamic,1> & C,\n  Eigen::SparseMatrix<YType> & Y)\n{\n  // Cheapskate solution\n  Eigen::VectorXi Ri;\n  find(R,Ri);\n  Eigen::VectorXi Ci;\n  find(C,Ci);\n  return slice(X,Ri,Ci,Y);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::slice_mask<bool, bool>(Eigen::SparseMatrix<bool, 0, int> const&, Eigen::Array<bool, -1, 1, 0, -1, 1> const&, int, Eigen::SparseMatrix<bool, 0, int>&);\ntemplate void igl::slice_mask<Eigen::Matrix<double, -1, 2, 0, -1, 2>, Eigen::Matrix<double, -1, 2, 0, -1, 2> >(Eigen::DenseBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> > const&, Eigen::Array<bool, -1, 1, 0, -1, 1> const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> >&);\ntemplate void igl::slice_mask<Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, 2, 0, -1, 2> >(Eigen::DenseBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> > const&, Eigen::Array<bool, -1, 1, 0, -1, 1> const&, int, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> >&);\ntemplate void igl::slice_mask<Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> > const&, Eigen::Array<bool, -1, 1, 0, -1, 1> const&, int, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::slice_mask<Eigen::Array<bool, -1, 1, 0, -1, 1>, Eigen::Array<bool, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Array<bool, -1, 1, 0, -1, 1> > const&, Eigen::Array<bool, -1, 1, 0, -1, 1> const&, int, Eigen::PlainObjectBase<Eigen::Array<bool, -1, 1, 0, -1, 1> >&);\ntemplate void igl::slice_mask<Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::Array<bool, -1, 1, 0, -1, 1> const&, int, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::slice_mask<Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::Array<bool, -1, 1, 0, -1, 1> const&, Eigen::Array<bool, -1, 1, 0, -1, 1> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::slice_mask<Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::Array<bool, -1, 1, 0, -1, 1> const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::slice_mask<Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::Array<bool, -1, 1, 0, -1, 1> const&, Eigen::Array<bool, -1, 1, 0, -1, 1> const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::slice_mask<Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::Array<bool, -1, 1, 0, -1, 1> const&, int, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/slice_mask.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_SLICE_MASK_H\n#define IGL_SLICE_MASK_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Sparse>\n#include <Eigen/Core>\nnamespace igl\n{\n  // Act like the matlab X(row_mask,col_mask) operator, where\n  // row_mask, col_mask are non-negative integer indices.\n  // \n  // Inputs:\n  //   X  m by n matrix\n  //   R  m list of row bools\n  //   C  n list of column bools\n  // Output:\n  //   Y  #trues-in-R by #trues-in-C matrix\n  //\n  // See also: slice_mask\n  \n  template <typename DerivedX,typename DerivedY>\n  IGL_INLINE void slice_mask(\n    const Eigen::DenseBase<DerivedX> & X,\n    const Eigen::Array<bool,Eigen::Dynamic,1> & R,\n    const Eigen::Array<bool,Eigen::Dynamic,1> & C,\n    Eigen::PlainObjectBase<DerivedY> & Y);\n  template <typename DerivedX,typename DerivedY>\n  IGL_INLINE void slice_mask(\n    const Eigen::DenseBase<DerivedX> & X,\n    const Eigen::Array<bool,Eigen::Dynamic,1> & R,\n    const int dim,\n    Eigen::PlainObjectBase<DerivedY> & Y);\n  //\n  // This templating is bad because the return type might not have the same\n  // size as `DerivedX`. This will probably only work if DerivedX has Dynamic\n  // as it's non-trivial sizes or if the number of rows in R happens to equal\n  // the number of rows in `DerivedX`.\n  template <typename DerivedX>\n  IGL_INLINE DerivedX slice_mask(\n    const Eigen::DenseBase<DerivedX> & X,\n    const Eigen::Array<bool,Eigen::Dynamic,1> & R,\n    const Eigen::Array<bool,Eigen::Dynamic,1> & C);\n  template <typename DerivedX>\n  IGL_INLINE DerivedX slice_mask(\n    const Eigen::DenseBase<DerivedX> & X,\n    const Eigen::Array<bool,Eigen::Dynamic,1> & R,\n    const int dim);\n  template <typename XType, typename YType>\n  IGL_INLINE void slice_mask(\n    const Eigen::SparseMatrix<XType> & X,\n    const Eigen::Array<bool,Eigen::Dynamic,1> & R,\n    const int dim,\n    Eigen::SparseMatrix<YType> & Y);\n  template <typename XType, typename YType>\n  IGL_INLINE void slice_mask(\n    const Eigen::SparseMatrix<XType> & X,\n    const Eigen::Array<bool,Eigen::Dynamic,1> & R,\n    const Eigen::Array<bool,Eigen::Dynamic,1> & C,\n    Eigen::SparseMatrix<YType> & Y);\n}\n\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"slice_mask.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/slice_tets.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"slice_tets.h\"\n#include \"LinSpaced.h\"\n#include \"sort.h\"\n#include \"cat.h\"\n#include \"per_face_normals.h\"\n#include <cassert>\n#include <algorithm>\n#include <vector>\n\ntemplate <\n  typename DerivedV, \n  typename DerivedT, \n  typename Derivedplane,\n  typename DerivedU,\n  typename DerivedG,\n  typename DerivedJ,\n  typename BCType>\nIGL_INLINE void igl::slice_tets(\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedT>& T,\n  const Eigen::PlainObjectBase<Derivedplane> & plane,\n  Eigen::PlainObjectBase<DerivedU>& U,\n  Eigen::PlainObjectBase<DerivedG>& G,\n  Eigen::PlainObjectBase<DerivedJ>& J,\n  Eigen::SparseMatrix<BCType> & BC)\n{\n  using namespace Eigen;\n  using namespace std;\n  assert(V.cols() == 3 && \"V should be #V by 3\");\n  assert(T.cols() == 4 && \"T should be #T by 4\");\n  assert(plane.size() == 4 && \"Plane equation should be 4 coefficients\");\n\n  // number of tets\n  const size_t m = T.rows();\n\n  typedef typename DerivedV::Scalar Scalar;\n  typedef typename DerivedT::Scalar Index;\n  typedef Matrix<Scalar,Dynamic,1> VectorXS;\n  typedef Matrix<Scalar,Dynamic,4> MatrixX4S;\n  typedef Matrix<Scalar,Dynamic,3> MatrixX3S;\n  typedef Matrix<Scalar,Dynamic,2> MatrixX2S;\n  typedef Matrix<Index,Dynamic,4> MatrixX4I;\n  typedef Matrix<Index,Dynamic,3> MatrixX3I;\n  typedef Matrix<Index,Dynamic,1> VectorXI;\n  typedef Matrix<bool,Dynamic,1> VectorXb;\n  \n  // Value of plane's implicit function at all vertices\n  VectorXS IV = \n    (V.col(0)*plane(0) + \n     V.col(1)*plane(1) + \n     V.col(2)*plane(2)).array()\n    + plane(3);\n  MatrixX4S IT(m,4);\n  for(size_t t = 0;t<m;t++)\n  {\n    for(size_t c = 0;c<4;c++)\n    {\n      IT(t,c) = IV(T(t,c));\n    }\n  }\n\n  const auto & extract_rows = [](\n    const PlainObjectBase<DerivedT> & T,\n    const MatrixX4S & IT,\n    const VectorXb & I,\n    MatrixX4I  & TI,\n    MatrixX4S & ITI,\n    VectorXI & JI)\n  {\n    const Index num_I = std::count(I.data(),I.data()+I.size(),true);\n    TI.resize(num_I,4);\n    ITI.resize(num_I,4);\n    JI.resize(num_I,1);\n    {\n      size_t k = 0;\n      for(size_t t = 0;t<(size_t)T.rows();t++)\n      {\n        if(I(t))\n        {\n          TI.row(k) = T.row(t);\n          ITI.row(k) = IT.row(t);\n          JI(k) = t;\n          k++;\n        }\n      }\n      assert(k == num_I);\n    }\n  };\n\n  VectorXb I13 = (IT.array()<0).rowwise().count()==1;\n  VectorXb I31 = (IT.array()>0).rowwise().count()==1;\n  VectorXb I22 = (IT.array()<0).rowwise().count()==2;\n  MatrixX4I T13,T31,T22;\n  MatrixX4S IT13,IT31,IT22;\n  VectorXI J13,J31,J22;\n  extract_rows(T,IT,I13,T13,IT13,J13);\n  extract_rows(T,IT,I31,T31,IT31,J31);\n  extract_rows(T,IT,I22,T22,IT22,J22);\n\n  const auto & apply_sort = [] (\n     const MatrixX4I & T, \n     const MatrixX4I & sJ, \n     MatrixX4I & sT)\n  {\n    sT.resize(T.rows(),4);\n    for(size_t t = 0;t<(size_t)T.rows();t++)\n    {\n      for(size_t c = 0;c<4;c++)\n      {\n        sT(t,c) = T(t,sJ(t,c));\n      }\n    }\n  };\n\n  const auto & one_below = [&V,&apply_sort](\n    const MatrixX4I & T,\n    const MatrixX4S & IT,\n    MatrixX3I & G,\n    SparseMatrix<BCType> & BC)\n  {\n    // Number of tets\n    const size_t m = T.rows();\n    MatrixX4S sIT;\n    MatrixX4I sJ;\n    sort(IT,2,true,sIT,sJ);\n    MatrixX4I sT;\n    apply_sort(T,sJ,sT);\n    MatrixX3S lambda = \n      sIT.rightCols(3).array() /\n      (sIT.rightCols(3).colwise()-sIT.col(0)).array();\n    vector<Triplet<BCType> > IJV;\n    IJV.reserve(m*3*2);\n    for(size_t c = 0;c<3;c++)\n    {\n      for(size_t t = 0;t<(size_t)m;t++)\n      {\n        IJV.push_back(Triplet<BCType>(c*m+t,  sT(t,0),  lambda(t,c)));\n        IJV.push_back(Triplet<BCType>(c*m+t,sT(t,c+1),1-lambda(t,c)));\n      }\n    }\n    BC.resize(m*3,V.rows());\n    BC.reserve(m*3*2);\n    BC.setFromTriplets(IJV.begin(),IJV.end());\n    G.resize(m,3);\n    for(size_t c = 0;c<3;c++)\n    {\n      G.col(c) = \n        igl::LinSpaced<\n        Eigen::Matrix<typename DerivedG::Scalar,Eigen::Dynamic,1> >\n        (m,0+c*m,(m-1)+c*m);\n    }\n  };\n\n  const auto & two_below = [&V,&apply_sort](\n    const MatrixX4I & T,\n    const MatrixX4S & IT,\n    MatrixX3I & G,\n    SparseMatrix<BCType> & BC)\n  {\n    // Number of tets\n    const size_t m = T.rows();\n    MatrixX4S sIT;\n    MatrixX4I sJ;\n    sort(IT,2,true,sIT,sJ);\n    MatrixX4I sT;\n    apply_sort(T,sJ,sT);\n    MatrixX2S lambda = \n      sIT.rightCols(2).array() /\n      (sIT.rightCols(2).colwise()-sIT.col(0)).array();\n    MatrixX2S gamma = \n      sIT.rightCols(2).array() /\n      (sIT.rightCols(2).colwise()-sIT.col(1)).array();\n    vector<Triplet<BCType> > IJV;\n    IJV.reserve(m*4*2);\n    for(size_t c = 0;c<2;c++)\n    {\n      for(size_t t = 0;t<(size_t)m;t++)\n      {\n        IJV.push_back(Triplet<BCType>(0*2*m+c*m+t,  sT(t,0),  lambda(t,c)));\n        IJV.push_back(Triplet<BCType>(0*2*m+c*m+t,sT(t,c+2),1-lambda(t,c)));\n        IJV.push_back(Triplet<BCType>(1*2*m+c*m+t,  sT(t,1),   gamma(t,c)));\n        IJV.push_back(Triplet<BCType>(1*2*m+c*m+t,sT(t,c+2),1- gamma(t,c)));\n      }\n    }\n    BC.resize(m*4,V.rows());\n    BC.reserve(m*4*2);\n    BC.setFromTriplets(IJV.begin(),IJV.end());\n    G.resize(2*m,3);\n    G.block(0,0,m,1) = igl::LinSpaced<VectorXI >(m,0+0*m,(m-1)+0*m);\n    G.block(0,1,m,1) = igl::LinSpaced<VectorXI >(m,0+1*m,(m-1)+1*m);\n    G.block(0,2,m,1) = igl::LinSpaced<VectorXI >(m,0+3*m,(m-1)+3*m);\n    G.block(m,0,m,1) = igl::LinSpaced<VectorXI >(m,0+0*m,(m-1)+0*m);\n    G.block(m,1,m,1) = igl::LinSpaced<VectorXI >(m,0+3*m,(m-1)+3*m);\n    G.block(m,2,m,1) = igl::LinSpaced<VectorXI >(m,0+2*m,(m-1)+2*m);\n  };\n\n  MatrixX3I G13,G31,G22;\n  SparseMatrix<BCType> BC13,BC31,BC22;\n  one_below(T13,IT13,G13,BC13);\n  one_below(T31,-IT31,G31,BC31);\n  two_below(T22,IT22,G22,BC22);\n\n  BC = cat(1,cat(1,BC13,BC31),BC22);\n  U = BC*V;\n  G.resize(G13.rows()+G31.rows()+G22.rows(),3);\n  G<<G13,(G31.array()+BC13.rows()),(G22.array()+BC13.rows()+BC31.rows());\n  MatrixX3S N;\n  per_face_normals(U,G,N);\n  Matrix<Scalar,1,3> planeN(plane(0),plane(1),plane(2));\n  VectorXb flip = (N.array().rowwise() * planeN.array()).rowwise().sum()<0;\n  for(size_t g = 0;g<(size_t)G.rows();g++)\n  {\n    if(flip(g))\n    {\n      G.row(g) = G.row(g).reverse().eval();\n    }\n  }\n\n  J.resize(G.rows());\n  J<<J13,J31,J22,J22;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::slice_tets<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, 4, 1, 0, 4, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, double>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 4, 1, 0, 4, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::SparseMatrix<double, 0, int>&);\ntemplate void igl::slice_tets<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, double>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::SparseMatrix<double, 0, int>&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/slice_tets.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_SLICE_TETS_H\n#define IGL_SLICE_TETS_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Dense>\n#include <Eigen/Sparse>\n\n#include <vector>\n\nnamespace igl\n{\n  // SLICE_TETS Slice through a tet mesh (V,T) along a given plane (via its\n  // implicit equation).\n  //\n  // Inputs:\n  //   V  #V by 3 list of tet mesh vertices\n  //   T  #T by 4 list of tet indices into V \n  //   plane  list of 4 coefficients in the plane equation: [x y z 1]'*plane = 0\n  //   Optional:\n  //     'Manifold' followed by whether to stitch together triangles into a\n  //       manifold mesh {true}: results in more compact U but slightly slower.\n  // Outputs:\n  //   U  #U by 3 list of triangle mesh vertices along slice\n  //   G  #G by 3 list of triangles indices into U\n  //   J  #G list of indices into T revealing from which tet each faces comes\n  //   BC  #U by #V list of barycentric coordinates (or more generally: linear\n  //     interpolation coordinates) so that U = BC*V\n  // \n  template <\n    typename DerivedV, \n    typename DerivedT, \n    typename Derivedplane,\n    typename DerivedU,\n    typename DerivedG,\n    typename DerivedJ,\n    typename BCType>\n  IGL_INLINE void slice_tets(\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedT>& T,\n    const Eigen::PlainObjectBase<Derivedplane> & plane,\n    Eigen::PlainObjectBase<DerivedU>& U,\n    Eigen::PlainObjectBase<DerivedG>& G,\n    Eigen::PlainObjectBase<DerivedJ>& J,\n    Eigen::SparseMatrix<BCType> & BC);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"slice_tets.cpp\"\n#endif\n\n#endif\n\n\n"
  },
  {
    "path": "libs/libigl/include/igl/slim.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2016 Michael Rabinovich\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"slim.h\"\n\n#include \"boundary_loop.h\"\n#include \"cotmatrix.h\"\n#include \"edge_lengths.h\"\n#include \"grad.h\"\n#include \"local_basis.h\"\n#include \"repdiag.h\"\n#include \"vector_area_matrix.h\"\n#include \"arap.h\"\n#include \"cat.h\"\n#include \"doublearea.h\"\n#include \"grad.h\"\n#include \"local_basis.h\"\n#include \"per_face_normals.h\"\n#include \"slice_into.h\"\n#include \"volume.h\"\n#include \"polar_svd.h\"\n#include \"flip_avoiding_line_search.h\"\n\n#include <iostream>\n#include <map>\n#include <set>\n#include <vector>\n\n#include <Eigen/IterativeLinearSolvers>\n#include <Eigen/SparseCholesky>\n#include <Eigen/IterativeLinearSolvers>\n\nnamespace igl\n{\n  namespace slim\n  {\n    // Definitions of internal functions\n    IGL_INLINE void compute_surface_gradient_matrix(const Eigen::MatrixXd &V, const Eigen::MatrixXi &F,\n                                                    const Eigen::MatrixXd &F1, const Eigen::MatrixXd &F2,\n                                                    Eigen::SparseMatrix<double> &D1, Eigen::SparseMatrix<double> &D2);\n    IGL_INLINE void buildA(igl::SLIMData& s, Eigen::SparseMatrix<double> &A);\n    IGL_INLINE void buildRhs(igl::SLIMData& s, const Eigen::SparseMatrix<double> &At);\n    IGL_INLINE void add_soft_constraints(igl::SLIMData& s, Eigen::SparseMatrix<double> &L);\n    IGL_INLINE double compute_energy(igl::SLIMData& s, Eigen::MatrixXd &V_new);\n    IGL_INLINE double compute_soft_const_energy(igl::SLIMData& s,\n                                                const Eigen::MatrixXd &V,\n                                                const Eigen::MatrixXi &F,\n                                                Eigen::MatrixXd &V_o);\n    IGL_INLINE double compute_energy_with_jacobians(igl::SLIMData& s,\n                                                    const Eigen::MatrixXd &V,\n                                                    const Eigen::MatrixXi &F, const Eigen::MatrixXd &Ji,\n                                                    Eigen::MatrixXd &uv, Eigen::VectorXd &areas);\n    IGL_INLINE void solve_weighted_arap(igl::SLIMData& s,\n                                        const Eigen::MatrixXd &V,\n                                        const Eigen::MatrixXi &F,\n                                        Eigen::MatrixXd &uv,\n                                        Eigen::VectorXi &soft_b_p,\n                                        Eigen::MatrixXd &soft_bc_p);\n    IGL_INLINE void update_weights_and_closest_rotations( igl::SLIMData& s,\n                                                          const Eigen::MatrixXd &V,\n                                                          const Eigen::MatrixXi &F,\n                                                          Eigen::MatrixXd &uv);\n    IGL_INLINE void compute_jacobians(igl::SLIMData& s, const Eigen::MatrixXd &uv);\n    IGL_INLINE void build_linear_system(igl::SLIMData& s, Eigen::SparseMatrix<double> &L);\n    IGL_INLINE void pre_calc(igl::SLIMData& s);\n\n    // Implementation\n    IGL_INLINE void compute_surface_gradient_matrix(const Eigen::MatrixXd &V, const Eigen::MatrixXi &F,\n                                                    const Eigen::MatrixXd &F1, const Eigen::MatrixXd &F2,\n                                         Eigen::SparseMatrix<double> &D1, Eigen::SparseMatrix<double> &D2)\n    {\n\n      Eigen::SparseMatrix<double> G;\n      igl::grad(V, F, G);\n      Eigen::SparseMatrix<double> Dx = G.block(0, 0, F.rows(), V.rows());\n      Eigen::SparseMatrix<double> Dy = G.block(F.rows(), 0, F.rows(), V.rows());\n      Eigen::SparseMatrix<double> Dz = G.block(2 * F.rows(), 0, F.rows(), V.rows());\n\n      D1 = F1.col(0).asDiagonal() * Dx + F1.col(1).asDiagonal() * Dy + F1.col(2).asDiagonal() * Dz;\n      D2 = F2.col(0).asDiagonal() * Dx + F2.col(1).asDiagonal() * Dy + F2.col(2).asDiagonal() * Dz;\n    }\n\n    IGL_INLINE void compute_jacobians(igl::SLIMData& s, const Eigen::MatrixXd &uv)\n    {\n      if (s.F.cols() == 3)\n      {\n        // Ji=[D1*u,D2*u,D1*v,D2*v];\n        s.Ji.col(0) = s.Dx * uv.col(0);\n        s.Ji.col(1) = s.Dy * uv.col(0);\n        s.Ji.col(2) = s.Dx * uv.col(1);\n        s.Ji.col(3) = s.Dy * uv.col(1);\n      }\n      else /*tet mesh*/{\n        // Ji=[D1*u,D2*u,D3*u, D1*v,D2*v, D3*v, D1*w,D2*w,D3*w];\n        s.Ji.col(0) = s.Dx * uv.col(0);\n        s.Ji.col(1) = s.Dy * uv.col(0);\n        s.Ji.col(2) = s.Dz * uv.col(0);\n        s.Ji.col(3) = s.Dx * uv.col(1);\n        s.Ji.col(4) = s.Dy * uv.col(1);\n        s.Ji.col(5) = s.Dz * uv.col(1);\n        s.Ji.col(6) = s.Dx * uv.col(2);\n        s.Ji.col(7) = s.Dy * uv.col(2);\n        s.Ji.col(8) = s.Dz * uv.col(2);\n      }\n    }\n\n    IGL_INLINE void update_weights_and_closest_rotations(igl::SLIMData& s,\n                                              const Eigen::MatrixXd &V,\n                                              const Eigen::MatrixXi &F,\n                                              Eigen::MatrixXd &uv)\n    {\n      compute_jacobians(s, uv);\n\n      const double eps = 1e-8;\n      double exp_f = s.exp_factor;\n\n      if (s.dim == 2)\n      {\n        for (int i = 0; i < s.Ji.rows(); ++i)\n        {\n          typedef Eigen::Matrix<double, 2, 2> Mat2;\n          typedef Eigen::Matrix<double, 2, 1> Vec2;\n          Mat2 ji, ri, ti, ui, vi;\n          Vec2 sing;\n          Vec2 closest_sing_vec;\n          Mat2 mat_W;\n          Vec2 m_sing_new;\n          double s1, s2;\n\n          ji(0, 0) = s.Ji(i, 0);\n          ji(0, 1) = s.Ji(i, 1);\n          ji(1, 0) = s.Ji(i, 2);\n          ji(1, 1) = s.Ji(i, 3);\n\n          igl::polar_svd(ji, ri, ti, ui, sing, vi);\n\n          s1 = sing(0);\n          s2 = sing(1);\n\n          // Update Weights according to energy\n          switch (s.slim_energy)\n          {\n            case igl::SLIMData::ARAP:\n            {\n              m_sing_new << 1, 1;\n              break;\n            }\n            case igl::SLIMData::SYMMETRIC_DIRICHLET:\n            {\n              double s1_g = 2 * (s1 - pow(s1, -3));\n              double s2_g = 2 * (s2 - pow(s2, -3));\n              m_sing_new << sqrt(s1_g / (2 * (s1 - 1))), sqrt(s2_g / (2 * (s2 - 1)));\n              break;\n            }\n            case igl::SLIMData::LOG_ARAP:\n            {\n              double s1_g = 2 * (log(s1) / s1);\n              double s2_g = 2 * (log(s2) / s2);\n              m_sing_new << sqrt(s1_g / (2 * (s1 - 1))), sqrt(s2_g / (2 * (s2 - 1)));\n              break;\n            }\n            case igl::SLIMData::CONFORMAL:\n            {\n              double s1_g = 1 / (2 * s2) - s2 / (2 * pow(s1, 2));\n              double s2_g = 1 / (2 * s1) - s1 / (2 * pow(s2, 2));\n\n              double geo_avg = sqrt(s1 * s2);\n              double s1_min = geo_avg;\n              double s2_min = geo_avg;\n\n              m_sing_new << sqrt(s1_g / (2 * (s1 - s1_min))), sqrt(s2_g / (2 * (s2 - s2_min)));\n\n              // change local step\n              closest_sing_vec << s1_min, s2_min;\n              ri = ui * closest_sing_vec.asDiagonal() * vi.transpose();\n              break;\n            }\n            case igl::SLIMData::EXP_CONFORMAL:\n            {\n              double s1_g = 2 * (s1 - pow(s1, -3));\n              double s2_g = 2 * (s2 - pow(s2, -3));\n\n              double geo_avg = sqrt(s1 * s2);\n              double s1_min = geo_avg;\n              double s2_min = geo_avg;\n\n              double in_exp = exp_f * ((pow(s1, 2) + pow(s2, 2)) / (2 * s1 * s2));\n              double exp_thing = exp(in_exp);\n\n              s1_g *= exp_thing * exp_f;\n              s2_g *= exp_thing * exp_f;\n\n              m_sing_new << sqrt(s1_g / (2 * (s1 - 1))), sqrt(s2_g / (2 * (s2 - 1)));\n              break;\n            }\n            case igl::SLIMData::EXP_SYMMETRIC_DIRICHLET:\n            {\n              double s1_g = 2 * (s1 - pow(s1, -3));\n              double s2_g = 2 * (s2 - pow(s2, -3));\n\n              double in_exp = exp_f * (pow(s1, 2) + pow(s1, -2) + pow(s2, 2) + pow(s2, -2));\n              double exp_thing = exp(in_exp);\n\n              s1_g *= exp_thing * exp_f;\n              s2_g *= exp_thing * exp_f;\n\n              m_sing_new << sqrt(s1_g / (2 * (s1 - 1))), sqrt(s2_g / (2 * (s2 - 1)));\n              break;\n            }\n          }\n\n          if (std::abs(s1 - 1) < eps) m_sing_new(0) = 1;\n          if (std::abs(s2 - 1) < eps) m_sing_new(1) = 1;\n          mat_W = ui * m_sing_new.asDiagonal() * ui.transpose();\n\n          s.W_11(i) = mat_W(0, 0);\n          s.W_12(i) = mat_W(0, 1);\n          s.W_21(i) = mat_W(1, 0);\n          s.W_22(i) = mat_W(1, 1);\n\n          // 2) Update local step (doesn't have to be a rotation, for instance in case of conformal energy)\n          s.Ri(i, 0) = ri(0, 0);\n          s.Ri(i, 1) = ri(1, 0);\n          s.Ri(i, 2) = ri(0, 1);\n          s.Ri(i, 3) = ri(1, 1);\n        }\n      }\n      else\n      {\n        typedef Eigen::Matrix<double, 3, 1> Vec3;\n        typedef Eigen::Matrix<double, 3, 3> Mat3;\n        Mat3 ji;\n        Vec3 m_sing_new;\n        Vec3 closest_sing_vec;\n        const double sqrt_2 = sqrt(2);\n        for (int i = 0; i < s.Ji.rows(); ++i)\n        {\n          ji(0, 0) = s.Ji(i, 0);\n          ji(0, 1) = s.Ji(i, 1);\n          ji(0, 2) = s.Ji(i, 2);\n          ji(1, 0) = s.Ji(i, 3);\n          ji(1, 1) = s.Ji(i, 4);\n          ji(1, 2) = s.Ji(i, 5);\n          ji(2, 0) = s.Ji(i, 6);\n          ji(2, 1) = s.Ji(i, 7);\n          ji(2, 2) = s.Ji(i, 8);\n\n          Mat3 ri, ti, ui, vi;\n          Vec3 sing;\n          igl::polar_svd(ji, ri, ti, ui, sing, vi);\n\n          double s1 = sing(0);\n          double s2 = sing(1);\n          double s3 = sing(2);\n\n          // 1) Update Weights\n          switch (s.slim_energy)\n          {\n            case igl::SLIMData::ARAP:\n            {\n              m_sing_new << 1, 1, 1;\n              break;\n            }\n            case igl::SLIMData::LOG_ARAP:\n            {\n              double s1_g = 2 * (log(s1) / s1);\n              double s2_g = 2 * (log(s2) / s2);\n              double s3_g = 2 * (log(s3) / s3);\n              m_sing_new << sqrt(s1_g / (2 * (s1 - 1))), sqrt(s2_g / (2 * (s2 - 1))), sqrt(s3_g / (2 * (s3 - 1)));\n              break;\n            }\n            case igl::SLIMData::SYMMETRIC_DIRICHLET:\n            {\n              double s1_g = 2 * (s1 - pow(s1, -3));\n              double s2_g = 2 * (s2 - pow(s2, -3));\n              double s3_g = 2 * (s3 - pow(s3, -3));\n              m_sing_new << sqrt(s1_g / (2 * (s1 - 1))), sqrt(s2_g / (2 * (s2 - 1))), sqrt(s3_g / (2 * (s3 - 1)));\n              break;\n            }\n            case igl::SLIMData::EXP_SYMMETRIC_DIRICHLET:\n            {\n              double s1_g = 2 * (s1 - pow(s1, -3));\n              double s2_g = 2 * (s2 - pow(s2, -3));\n              double s3_g = 2 * (s3 - pow(s3, -3));\n              m_sing_new << sqrt(s1_g / (2 * (s1 - 1))), sqrt(s2_g / (2 * (s2 - 1))), sqrt(s3_g / (2 * (s3 - 1)));\n\n              double in_exp = exp_f * (pow(s1, 2) + pow(s1, -2) + pow(s2, 2) + pow(s2, -2) + pow(s3, 2) + pow(s3, -2));\n              double exp_thing = exp(in_exp);\n\n              s1_g *= exp_thing * exp_f;\n              s2_g *= exp_thing * exp_f;\n              s3_g *= exp_thing * exp_f;\n\n              m_sing_new << sqrt(s1_g / (2 * (s1 - 1))), sqrt(s2_g / (2 * (s2 - 1))), sqrt(s3_g / (2 * (s3 - 1)));\n\n              break;\n            }\n            case igl::SLIMData::CONFORMAL:\n            {\n              double common_div = 9 * (pow(s1 * s2 * s3, 5. / 3.));\n\n              double s1_g = (-2 * s2 * s3 * (pow(s2, 2) + pow(s3, 2) - 2 * pow(s1, 2))) / common_div;\n              double s2_g = (-2 * s1 * s3 * (pow(s1, 2) + pow(s3, 2) - 2 * pow(s2, 2))) / common_div;\n              double s3_g = (-2 * s1 * s2 * (pow(s1, 2) + pow(s2, 2) - 2 * pow(s3, 2))) / common_div;\n\n              double closest_s = sqrt(pow(s1, 2) + pow(s3, 2)) / sqrt_2;\n              double s1_min = closest_s;\n              double s2_min = closest_s;\n              double s3_min = closest_s;\n\n              m_sing_new << sqrt(s1_g / (2 * (s1 - s1_min))), sqrt(s2_g / (2 * (s2 - s2_min))), sqrt(\n                  s3_g / (2 * (s3 - s3_min)));\n\n              // change local step\n              closest_sing_vec << s1_min, s2_min, s3_min;\n              ri = ui * closest_sing_vec.asDiagonal() * vi.transpose();\n              break;\n            }\n            case igl::SLIMData::EXP_CONFORMAL:\n            {\n              // E_conf = (s1^2 + s2^2 + s3^2)/(3*(s1*s2*s3)^(2/3) )\n              // dE_conf/ds1 = (-2*(s2*s3)*(s2^2+s3^2 -2*s1^2) ) / (9*(s1*s2*s3)^(5/3))\n              // Argmin E_conf(s1): s1 = sqrt(s1^2+s2^2)/sqrt(2)\n              double common_div = 9 * (pow(s1 * s2 * s3, 5. / 3.));\n\n              double s1_g = (-2 * s2 * s3 * (pow(s2, 2) + pow(s3, 2) - 2 * pow(s1, 2))) / common_div;\n              double s2_g = (-2 * s1 * s3 * (pow(s1, 2) + pow(s3, 2) - 2 * pow(s2, 2))) / common_div;\n              double s3_g = (-2 * s1 * s2 * (pow(s1, 2) + pow(s2, 2) - 2 * pow(s3, 2))) / common_div;\n\n              double in_exp = exp_f * ((pow(s1, 2) + pow(s2, 2) + pow(s3, 2)) / (3 * pow((s1 * s2 * s3), 2. / 3)));;\n              double exp_thing = exp(in_exp);\n\n              double closest_s = sqrt(pow(s1, 2) + pow(s3, 2)) / sqrt_2;\n              double s1_min = closest_s;\n              double s2_min = closest_s;\n              double s3_min = closest_s;\n\n              s1_g *= exp_thing * exp_f;\n              s2_g *= exp_thing * exp_f;\n              s3_g *= exp_thing * exp_f;\n\n              m_sing_new << sqrt(s1_g / (2 * (s1 - s1_min))), sqrt(s2_g / (2 * (s2 - s2_min))), sqrt(\n                  s3_g / (2 * (s3 - s3_min)));\n\n              // change local step\n              closest_sing_vec << s1_min, s2_min, s3_min;\n              ri = ui * closest_sing_vec.asDiagonal() * vi.transpose();\n            }\n          }\n          if (std::abs(s1 - 1) < eps) m_sing_new(0) = 1;\n          if (std::abs(s2 - 1) < eps) m_sing_new(1) = 1;\n          if (std::abs(s3 - 1) < eps) m_sing_new(2) = 1;\n          Mat3 mat_W;\n          mat_W = ui * m_sing_new.asDiagonal() * ui.transpose();\n\n          s.W_11(i) = mat_W(0, 0);\n          s.W_12(i) = mat_W(0, 1);\n          s.W_13(i) = mat_W(0, 2);\n          s.W_21(i) = mat_W(1, 0);\n          s.W_22(i) = mat_W(1, 1);\n          s.W_23(i) = mat_W(1, 2);\n          s.W_31(i) = mat_W(2, 0);\n          s.W_32(i) = mat_W(2, 1);\n          s.W_33(i) = mat_W(2, 2);\n\n          // 2) Update closest rotations (not rotations in case of conformal energy)\n          s.Ri(i, 0) = ri(0, 0);\n          s.Ri(i, 1) = ri(1, 0);\n          s.Ri(i, 2) = ri(2, 0);\n          s.Ri(i, 3) = ri(0, 1);\n          s.Ri(i, 4) = ri(1, 1);\n          s.Ri(i, 5) = ri(2, 1);\n          s.Ri(i, 6) = ri(0, 2);\n          s.Ri(i, 7) = ri(1, 2);\n          s.Ri(i, 8) = ri(2, 2);\n        } // for loop end\n\n      } // if dim end\n\n    }\n\n    IGL_INLINE void solve_weighted_arap(igl::SLIMData& s,\n                                        const Eigen::MatrixXd &V,\n                                        const Eigen::MatrixXi &F,\n                                        Eigen::MatrixXd &uv,\n                                        Eigen::VectorXi &soft_b_p,\n                                        Eigen::MatrixXd &soft_bc_p)\n    {\n      using namespace Eigen;\n\n      Eigen::SparseMatrix<double> L;\n      build_linear_system(s,L);\n\n      // solve\n      Eigen::VectorXd Uc;\n      if (s.dim == 2)\n      {\n        SimplicialLDLT<Eigen::SparseMatrix<double> > solver;\n        Uc = solver.compute(L).solve(s.rhs);\n      }\n      else\n      { // seems like CG performs much worse for 2D and way better for 3D\n        Eigen::VectorXd guess(uv.rows() * s.dim);\n        for (int i = 0; i < s.dim; i++) for (int j = 0; j < s.dim; j++) guess(uv.rows() * i + j) = uv(i, j); // flatten vector\n        ConjugateGradient<Eigen::SparseMatrix<double>, Eigen::Lower | Upper> solver;\n        solver.setTolerance(1e-8);\n        Uc = solver.compute(L).solveWithGuess(s.rhs, guess);\n      }\n\n      for (int i = 0; i < s.dim; i++)\n        uv.col(i) = Uc.block(i * s.v_n, 0, s.v_n, 1);\n    }\n\n\n    IGL_INLINE void pre_calc(igl::SLIMData& s)\n    {\n      if (!s.has_pre_calc)\n      {\n        s.v_n = s.v_num;\n        s.f_n = s.f_num;\n\n        if (s.F.cols() == 3)\n        {\n          s.dim = 2;\n          Eigen::MatrixXd F1, F2, F3;\n          igl::local_basis(s.V, s.F, F1, F2, F3);\n          compute_surface_gradient_matrix(s.V, s.F, F1, F2, s.Dx, s.Dy);\n\n          s.W_11.resize(s.f_n);\n          s.W_12.resize(s.f_n);\n          s.W_21.resize(s.f_n);\n          s.W_22.resize(s.f_n);\n        }\n        else\n        {\n          s.dim = 3;\n          Eigen::SparseMatrix<double> G;\n          igl::grad(s.V, s.F, G,\n                    s.mesh_improvement_3d /*use normal gradient, or one from a \"regular\" tet*/);\n          s.Dx = G.block(0, 0, s.F.rows(), s.V.rows());\n          s.Dy = G.block(s.F.rows(), 0, s.F.rows(), s.V.rows());\n          s.Dz = G.block(2 * s.F.rows(), 0, s.F.rows(), s.V.rows());\n\n\n          s.W_11.resize(s.f_n);\n          s.W_12.resize(s.f_n);\n          s.W_13.resize(s.f_n);\n          s.W_21.resize(s.f_n);\n          s.W_22.resize(s.f_n);\n          s.W_23.resize(s.f_n);\n          s.W_31.resize(s.f_n);\n          s.W_32.resize(s.f_n);\n          s.W_33.resize(s.f_n);\n        }\n\n        s.Dx.makeCompressed();\n        s.Dy.makeCompressed();\n        s.Dz.makeCompressed();\n        s.Ri.resize(s.f_n, s.dim * s.dim);\n        s.Ji.resize(s.f_n, s.dim * s.dim);\n        s.rhs.resize(s.dim * s.v_num);\n\n        // flattened weight matrix\n        s.WGL_M.resize(s.dim * s.dim * s.f_n);\n        for (int i = 0; i < s.dim * s.dim; i++)\n          for (int j = 0; j < s.f_n; j++)\n            s.WGL_M(i * s.f_n + j) = s.M(j);\n\n        s.first_solve = true;\n        s.has_pre_calc = true;\n      }\n    }\n\n    IGL_INLINE void build_linear_system(igl::SLIMData& s, Eigen::SparseMatrix<double> &L)\n    {\n      // formula (35) in paper\n      Eigen::SparseMatrix<double> A(s.dim * s.dim * s.f_n, s.dim * s.v_n);\n      buildA(s,A);\n\n      Eigen::SparseMatrix<double> At = A.transpose();\n      At.makeCompressed();\n\n      Eigen::SparseMatrix<double> id_m(At.rows(), At.rows());\n      id_m.setIdentity();\n\n      // add proximal penalty\n      L = At * s.WGL_M.asDiagonal() * A + s.proximal_p * id_m; //add also a proximal term\n      L.makeCompressed();\n\n      buildRhs(s, At);\n      Eigen::SparseMatrix<double> OldL = L;\n      add_soft_constraints(s,L);\n      L.makeCompressed();\n    }\n\n    IGL_INLINE void add_soft_constraints(igl::SLIMData& s, Eigen::SparseMatrix<double> &L)\n    {\n      int v_n = s.v_num;\n      for (int d = 0; d < s.dim; d++)\n      {\n        for (int i = 0; i < s.b.rows(); i++)\n        {\n          int v_idx = s.b(i);\n          s.rhs(d * v_n + v_idx) += s.soft_const_p * s.bc(i, d); // rhs\n          L.coeffRef(d * v_n + v_idx, d * v_n + v_idx) += s.soft_const_p; // diagonal of matrix\n        }\n      }\n    }\n\n    IGL_INLINE double compute_energy(igl::SLIMData& s, Eigen::MatrixXd &V_new)\n    {\n      compute_jacobians(s,V_new);\n      return compute_energy_with_jacobians(s, s.V, s.F, s.Ji, V_new, s.M) +\n             compute_soft_const_energy(s, s.V, s.F, V_new);\n    }\n\n    IGL_INLINE double compute_soft_const_energy(igl::SLIMData& s,\n                                                const Eigen::MatrixXd &V,\n                                                const Eigen::MatrixXi &F,\n                                                Eigen::MatrixXd &V_o)\n    {\n      double e = 0;\n      for (int i = 0; i < s.b.rows(); i++)\n      {\n        e += s.soft_const_p * (s.bc.row(i) - V_o.row(s.b(i))).squaredNorm();\n      }\n      return e;\n    }\n\n    IGL_INLINE double compute_energy_with_jacobians(igl::SLIMData& s,\n                                                    const Eigen::MatrixXd &V,\n                                                    const Eigen::MatrixXi &F, const Eigen::MatrixXd &Ji,\n                                                    Eigen::MatrixXd &uv, Eigen::VectorXd &areas)\n    {\n\n      double energy = 0;\n      if (s.dim == 2)\n      {\n        Eigen::Matrix<double, 2, 2> ji;\n        for (int i = 0; i < s.f_n; i++)\n        {\n          ji(0, 0) = Ji(i, 0);\n          ji(0, 1) = Ji(i, 1);\n          ji(1, 0) = Ji(i, 2);\n          ji(1, 1) = Ji(i, 3);\n\n          typedef Eigen::Matrix<double, 2, 2> Mat2;\n          typedef Eigen::Matrix<double, 2, 1> Vec2;\n          Mat2 ri, ti, ui, vi;\n          Vec2 sing;\n          igl::polar_svd(ji, ri, ti, ui, sing, vi);\n          double s1 = sing(0);\n          double s2 = sing(1);\n\n          switch (s.slim_energy)\n          {\n            case igl::SLIMData::ARAP:\n            {\n              energy += areas(i) * (pow(s1 - 1, 2) + pow(s2 - 1, 2));\n              break;\n            }\n            case igl::SLIMData::SYMMETRIC_DIRICHLET:\n            {\n              energy += areas(i) * (pow(s1, 2) + pow(s1, -2) + pow(s2, 2) + pow(s2, -2));\n              break;\n            }\n            case igl::SLIMData::EXP_SYMMETRIC_DIRICHLET:\n            {\n              energy += areas(i) * exp(s.exp_factor * (pow(s1, 2) + pow(s1, -2) + pow(s2, 2) + pow(s2, -2)));\n              break;\n            }\n            case igl::SLIMData::LOG_ARAP:\n            {\n              energy += areas(i) * (pow(log(s1), 2) + pow(log(s2), 2));\n              break;\n            }\n            case igl::SLIMData::CONFORMAL:\n            {\n              energy += areas(i) * ((pow(s1, 2) + pow(s2, 2)) / (2 * s1 * s2));\n              break;\n            }\n            case igl::SLIMData::EXP_CONFORMAL:\n            {\n              energy += areas(i) * exp(s.exp_factor * ((pow(s1, 2) + pow(s2, 2)) / (2 * s1 * s2)));\n              break;\n            }\n\n          }\n\n        }\n      }\n      else\n      {\n        Eigen::Matrix<double, 3, 3> ji;\n        for (int i = 0; i < s.f_n; i++)\n        {\n          ji(0, 0) = Ji(i, 0);\n          ji(0, 1) = Ji(i, 1);\n          ji(0, 2) = Ji(i, 2);\n          ji(1, 0) = Ji(i, 3);\n          ji(1, 1) = Ji(i, 4);\n          ji(1, 2) = Ji(i, 5);\n          ji(2, 0) = Ji(i, 6);\n          ji(2, 1) = Ji(i, 7);\n          ji(2, 2) = Ji(i, 8);\n\n          typedef Eigen::Matrix<double, 3, 3> Mat3;\n          typedef Eigen::Matrix<double, 3, 1> Vec3;\n          Mat3 ri, ti, ui, vi;\n          Vec3 sing;\n          igl::polar_svd(ji, ri, ti, ui, sing, vi);\n          double s1 = sing(0);\n          double s2 = sing(1);\n          double s3 = sing(2);\n\n          switch (s.slim_energy)\n          {\n            case igl::SLIMData::ARAP:\n            {\n              energy += areas(i) * (pow(s1 - 1, 2) + pow(s2 - 1, 2) + pow(s3 - 1, 2));\n              break;\n            }\n            case igl::SLIMData::SYMMETRIC_DIRICHLET:\n            {\n              energy += areas(i) * (pow(s1, 2) + pow(s1, -2) + pow(s2, 2) + pow(s2, -2) + pow(s3, 2) + pow(s3, -2));\n              break;\n            }\n            case igl::SLIMData::EXP_SYMMETRIC_DIRICHLET:\n            {\n              energy += areas(i) * exp(s.exp_factor *\n                                       (pow(s1, 2) + pow(s1, -2) + pow(s2, 2) + pow(s2, -2) + pow(s3, 2) + pow(s3, -2)));\n              break;\n            }\n            case igl::SLIMData::LOG_ARAP:\n            {\n              energy += areas(i) * (pow(log(s1), 2) + pow(log(std::abs(s2)), 2) + pow(log(std::abs(s3)), 2));\n              break;\n            }\n            case igl::SLIMData::CONFORMAL:\n            {\n              energy += areas(i) * ((pow(s1, 2) + pow(s2, 2) + pow(s3, 2)) / (3 * pow(s1 * s2 * s3, 2. / 3.)));\n              break;\n            }\n            case igl::SLIMData::EXP_CONFORMAL:\n            {\n              energy += areas(i) * exp((pow(s1, 2) + pow(s2, 2) + pow(s3, 2)) / (3 * pow(s1 * s2 * s3, 2. / 3.)));\n              break;\n            }\n          }\n        }\n      }\n\n      return energy;\n    }\n\n    IGL_INLINE void buildA(igl::SLIMData& s, Eigen::SparseMatrix<double> &A)\n    {\n      // formula (35) in paper\n      std::vector<Eigen::Triplet<double> > IJV;\n      if (s.dim == 2)\n      {\n        IJV.reserve(4 * (s.Dx.outerSize() + s.Dy.outerSize()));\n\n        /*A = [W11*Dx, W12*Dx;\n             W11*Dy, W12*Dy;\n             W21*Dx, W22*Dx;\n             W21*Dy, W22*Dy];*/\n        for (int k = 0; k < s.Dx.outerSize(); ++k)\n        {\n          for (Eigen::SparseMatrix<double>::InnerIterator it(s.Dx, k); it; ++it)\n          {\n            int dx_r = it.row();\n            int dx_c = it.col();\n            double val = it.value();\n\n            IJV.push_back(Eigen::Triplet<double>(dx_r, dx_c, val * s.W_11(dx_r)));\n            IJV.push_back(Eigen::Triplet<double>(dx_r, s.v_n + dx_c, val * s.W_12(dx_r)));\n\n            IJV.push_back(Eigen::Triplet<double>(2 * s.f_n + dx_r, dx_c, val * s.W_21(dx_r)));\n            IJV.push_back(Eigen::Triplet<double>(2 * s.f_n + dx_r, s.v_n + dx_c, val * s.W_22(dx_r)));\n          }\n        }\n\n        for (int k = 0; k < s.Dy.outerSize(); ++k)\n        {\n          for (Eigen::SparseMatrix<double>::InnerIterator it(s.Dy, k); it; ++it)\n          {\n            int dy_r = it.row();\n            int dy_c = it.col();\n            double val = it.value();\n\n            IJV.push_back(Eigen::Triplet<double>(s.f_n + dy_r, dy_c, val * s.W_11(dy_r)));\n            IJV.push_back(Eigen::Triplet<double>(s.f_n + dy_r, s.v_n + dy_c, val * s.W_12(dy_r)));\n\n            IJV.push_back(Eigen::Triplet<double>(3 * s.f_n + dy_r, dy_c, val * s.W_21(dy_r)));\n            IJV.push_back(Eigen::Triplet<double>(3 * s.f_n + dy_r, s.v_n + dy_c, val * s.W_22(dy_r)));\n          }\n        }\n      }\n      else\n      {\n\n        /*A = [W11*Dx, W12*Dx, W13*Dx;\n               W11*Dy, W12*Dy, W13*Dy;\n               W11*Dz, W12*Dz, W13*Dz;\n               W21*Dx, W22*Dx, W23*Dx;\n               W21*Dy, W22*Dy, W23*Dy;\n               W21*Dz, W22*Dz, W23*Dz;\n               W31*Dx, W32*Dx, W33*Dx;\n               W31*Dy, W32*Dy, W33*Dy;\n               W31*Dz, W32*Dz, W33*Dz;];*/\n        IJV.reserve(9 * (s.Dx.outerSize() + s.Dy.outerSize() + s.Dz.outerSize()));\n        for (int k = 0; k < s.Dx.outerSize(); k++)\n        {\n          for (Eigen::SparseMatrix<double>::InnerIterator it(s.Dx, k); it; ++it)\n          {\n            int dx_r = it.row();\n            int dx_c = it.col();\n            double val = it.value();\n\n            IJV.push_back(Eigen::Triplet<double>(dx_r, dx_c, val * s.W_11(dx_r)));\n            IJV.push_back(Eigen::Triplet<double>(dx_r, s.v_n + dx_c, val * s.W_12(dx_r)));\n            IJV.push_back(Eigen::Triplet<double>(dx_r, 2 * s.v_n + dx_c, val * s.W_13(dx_r)));\n\n            IJV.push_back(Eigen::Triplet<double>(3 * s.f_n + dx_r, dx_c, val * s.W_21(dx_r)));\n            IJV.push_back(Eigen::Triplet<double>(3 * s.f_n + dx_r, s.v_n + dx_c, val * s.W_22(dx_r)));\n            IJV.push_back(Eigen::Triplet<double>(3 * s.f_n + dx_r, 2 * s.v_n + dx_c, val * s.W_23(dx_r)));\n\n            IJV.push_back(Eigen::Triplet<double>(6 * s.f_n + dx_r, dx_c, val * s.W_31(dx_r)));\n            IJV.push_back(Eigen::Triplet<double>(6 * s.f_n + dx_r, s.v_n + dx_c, val * s.W_32(dx_r)));\n            IJV.push_back(Eigen::Triplet<double>(6 * s.f_n + dx_r, 2 * s.v_n + dx_c, val * s.W_33(dx_r)));\n          }\n        }\n\n        for (int k = 0; k < s.Dy.outerSize(); k++)\n        {\n          for (Eigen::SparseMatrix<double>::InnerIterator it(s.Dy, k); it; ++it)\n          {\n            int dy_r = it.row();\n            int dy_c = it.col();\n            double val = it.value();\n\n            IJV.push_back(Eigen::Triplet<double>(s.f_n + dy_r, dy_c, val * s.W_11(dy_r)));\n            IJV.push_back(Eigen::Triplet<double>(s.f_n + dy_r, s.v_n + dy_c, val * s.W_12(dy_r)));\n            IJV.push_back(Eigen::Triplet<double>(s.f_n + dy_r, 2 * s.v_n + dy_c, val * s.W_13(dy_r)));\n\n            IJV.push_back(Eigen::Triplet<double>(4 * s.f_n + dy_r, dy_c, val * s.W_21(dy_r)));\n            IJV.push_back(Eigen::Triplet<double>(4 * s.f_n + dy_r, s.v_n + dy_c, val * s.W_22(dy_r)));\n            IJV.push_back(Eigen::Triplet<double>(4 * s.f_n + dy_r, 2 * s.v_n + dy_c, val * s.W_23(dy_r)));\n\n            IJV.push_back(Eigen::Triplet<double>(7 * s.f_n + dy_r, dy_c, val * s.W_31(dy_r)));\n            IJV.push_back(Eigen::Triplet<double>(7 * s.f_n + dy_r, s.v_n + dy_c, val * s.W_32(dy_r)));\n            IJV.push_back(Eigen::Triplet<double>(7 * s.f_n + dy_r, 2 * s.v_n + dy_c, val * s.W_33(dy_r)));\n          }\n        }\n\n        for (int k = 0; k < s.Dz.outerSize(); k++)\n        {\n          for (Eigen::SparseMatrix<double>::InnerIterator it(s.Dz, k); it; ++it)\n          {\n            int dz_r = it.row();\n            int dz_c = it.col();\n            double val = it.value();\n\n            IJV.push_back(Eigen::Triplet<double>(2 * s.f_n + dz_r, dz_c, val * s.W_11(dz_r)));\n            IJV.push_back(Eigen::Triplet<double>(2 * s.f_n + dz_r, s.v_n + dz_c, val * s.W_12(dz_r)));\n            IJV.push_back(Eigen::Triplet<double>(2 * s.f_n + dz_r, 2 * s.v_n + dz_c, val * s.W_13(dz_r)));\n\n            IJV.push_back(Eigen::Triplet<double>(5 * s.f_n + dz_r, dz_c, val * s.W_21(dz_r)));\n            IJV.push_back(Eigen::Triplet<double>(5 * s.f_n + dz_r, s.v_n + dz_c, val * s.W_22(dz_r)));\n            IJV.push_back(Eigen::Triplet<double>(5 * s.f_n + dz_r, 2 * s.v_n + dz_c, val * s.W_23(dz_r)));\n\n            IJV.push_back(Eigen::Triplet<double>(8 * s.f_n + dz_r, dz_c, val * s.W_31(dz_r)));\n            IJV.push_back(Eigen::Triplet<double>(8 * s.f_n + dz_r, s.v_n + dz_c, val * s.W_32(dz_r)));\n            IJV.push_back(Eigen::Triplet<double>(8 * s.f_n + dz_r, 2 * s.v_n + dz_c, val * s.W_33(dz_r)));\n          }\n        }\n      }\n      A.setFromTriplets(IJV.begin(), IJV.end());\n    }\n\n    IGL_INLINE void buildRhs(igl::SLIMData& s, const Eigen::SparseMatrix<double> &At)\n    {\n      Eigen::VectorXd f_rhs(s.dim * s.dim * s.f_n);\n      f_rhs.setZero();\n      if (s.dim == 2)\n      {\n        /*b = [W11*R11 + W12*R21; (formula (36))\n             W11*R12 + W12*R22;\n             W21*R11 + W22*R21;\n             W21*R12 + W22*R22];*/\n        for (int i = 0; i < s.f_n; i++)\n        {\n          f_rhs(i + 0 * s.f_n) = s.W_11(i) * s.Ri(i, 0) + s.W_12(i) * s.Ri(i, 1);\n          f_rhs(i + 1 * s.f_n) = s.W_11(i) * s.Ri(i, 2) + s.W_12(i) * s.Ri(i, 3);\n          f_rhs(i + 2 * s.f_n) = s.W_21(i) * s.Ri(i, 0) + s.W_22(i) * s.Ri(i, 1);\n          f_rhs(i + 3 * s.f_n) = s.W_21(i) * s.Ri(i, 2) + s.W_22(i) * s.Ri(i, 3);\n        }\n      }\n      else\n      {\n        /*b = [W11*R11 + W12*R21 + W13*R31;\n             W11*R12 + W12*R22 + W13*R32;\n             W11*R13 + W12*R23 + W13*R33;\n             W21*R11 + W22*R21 + W23*R31;\n             W21*R12 + W22*R22 + W23*R32;\n             W21*R13 + W22*R23 + W23*R33;\n             W31*R11 + W32*R21 + W33*R31;\n             W31*R12 + W32*R22 + W33*R32;\n             W31*R13 + W32*R23 + W33*R33;];*/\n        for (int i = 0; i < s.f_n; i++)\n        {\n          f_rhs(i + 0 * s.f_n) = s.W_11(i) * s.Ri(i, 0) + s.W_12(i) * s.Ri(i, 1) + s.W_13(i) * s.Ri(i, 2);\n          f_rhs(i + 1 * s.f_n) = s.W_11(i) * s.Ri(i, 3) + s.W_12(i) * s.Ri(i, 4) + s.W_13(i) * s.Ri(i, 5);\n          f_rhs(i + 2 * s.f_n) = s.W_11(i) * s.Ri(i, 6) + s.W_12(i) * s.Ri(i, 7) + s.W_13(i) * s.Ri(i, 8);\n          f_rhs(i + 3 * s.f_n) = s.W_21(i) * s.Ri(i, 0) + s.W_22(i) * s.Ri(i, 1) + s.W_23(i) * s.Ri(i, 2);\n          f_rhs(i + 4 * s.f_n) = s.W_21(i) * s.Ri(i, 3) + s.W_22(i) * s.Ri(i, 4) + s.W_23(i) * s.Ri(i, 5);\n          f_rhs(i + 5 * s.f_n) = s.W_21(i) * s.Ri(i, 6) + s.W_22(i) * s.Ri(i, 7) + s.W_23(i) * s.Ri(i, 8);\n          f_rhs(i + 6 * s.f_n) = s.W_31(i) * s.Ri(i, 0) + s.W_32(i) * s.Ri(i, 1) + s.W_33(i) * s.Ri(i, 2);\n          f_rhs(i + 7 * s.f_n) = s.W_31(i) * s.Ri(i, 3) + s.W_32(i) * s.Ri(i, 4) + s.W_33(i) * s.Ri(i, 5);\n          f_rhs(i + 8 * s.f_n) = s.W_31(i) * s.Ri(i, 6) + s.W_32(i) * s.Ri(i, 7) + s.W_33(i) * s.Ri(i, 8);\n        }\n      }\n      Eigen::VectorXd uv_flat(s.dim *s.v_n);\n      for (int i = 0; i < s.dim; i++)\n        for (int j = 0; j < s.v_n; j++)\n          uv_flat(s.v_n * i + j) = s.V_o(j, i);\n\n      s.rhs = (At * s.WGL_M.asDiagonal() * f_rhs + s.proximal_p * uv_flat);\n    }\n\n  }\n}\n\n/// Slim Implementation\n\nIGL_INLINE void igl::slim_precompute(\n  const Eigen::MatrixXd &V, \n  const Eigen::MatrixXi &F, \n  const Eigen::MatrixXd &V_init, \n  SLIMData &data,\n  SLIMData::SLIM_ENERGY slim_energy, \n  Eigen::VectorXi &b, \n  Eigen::MatrixXd &bc,\n  double soft_p)\n{\n\n  data.V = V;\n  data.F = F;\n  data.V_o = V_init;\n\n  data.v_num = V.rows();\n  data.f_num = F.rows();\n\n  data.slim_energy = slim_energy;\n\n  data.b = b;\n  data.bc = bc;\n  data.soft_const_p = soft_p;\n\n  data.proximal_p = 0.0001;\n\n  igl::doublearea(V, F, data.M);\n  data.M /= 2.;\n  data.mesh_area = data.M.sum();\n  data.mesh_improvement_3d = false; // whether to use a jacobian derived from a real mesh or an abstract regular mesh (used for mesh improvement)\n  data.exp_factor = 1.0; // param used only for exponential energies (e.g exponential symmetric dirichlet)\n\n  assert (F.cols() == 3 || F.cols() == 4);\n\n  igl::slim::pre_calc(data);\n  data.energy = igl::slim::compute_energy(data,data.V_o) / data.mesh_area;\n}\n\nIGL_INLINE Eigen::MatrixXd igl::slim_solve(SLIMData &data, int iter_num)\n{\n  for (int i = 0; i < iter_num; i++)\n  {\n    Eigen::MatrixXd dest_res;\n    dest_res = data.V_o;\n\n    // Solve Weighted Proxy\n    igl::slim::update_weights_and_closest_rotations(data,data.V, data.F, dest_res);\n    igl::slim::solve_weighted_arap(data,data.V, data.F, dest_res, data.b, data.bc);\n\n    double old_energy = data.energy;\n\n    std::function<double(Eigen::MatrixXd &)> compute_energy = [&](\n        Eigen::MatrixXd &aaa) { return igl::slim::compute_energy(data,aaa); };\n\n    data.energy = igl::flip_avoiding_line_search(data.F, data.V_o, dest_res, compute_energy,\n                                                 data.energy * data.mesh_area) / data.mesh_area;\n  }\n  return data.V_o;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/slim.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2016 Michael Rabinovich\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef SLIM_H\n#define SLIM_H\n\n#include \"igl_inline.h\"\n#include <Eigen/Dense>\n#include <Eigen/Sparse>\n\nnamespace igl\n{\n\n// Compute a SLIM map as derived in \"Scalable Locally Injective Maps\" [Rabinovich et al. 2016].\nstruct SLIMData\n{\n  // Input\n  Eigen::MatrixXd V; // #V by 3 list of mesh vertex positions\n  Eigen::MatrixXi F; // #F by 3/3 list of mesh faces (triangles/tets)\n  enum SLIM_ENERGY\n  {\n    ARAP,\n    LOG_ARAP,\n    SYMMETRIC_DIRICHLET,\n    CONFORMAL,\n    EXP_CONFORMAL,\n    EXP_SYMMETRIC_DIRICHLET\n  };\n  SLIM_ENERGY slim_energy;\n\n  // Optional Input\n  // soft constraints\n  Eigen::VectorXi b;\n  Eigen::MatrixXd bc;\n  double soft_const_p;\n\n  double exp_factor; // used for exponential energies, ignored otherwise\n  bool mesh_improvement_3d; // only supported for 3d\n\n  // Output\n  Eigen::MatrixXd V_o; // #V by dim list of mesh vertex positions (dim = 2 for parametrization, 3 otherwise)\n  double energy; // objective value\n\n  // INTERNAL\n  Eigen::VectorXd M;\n  double mesh_area;\n  double avg_edge_length;\n  int v_num;\n  int f_num;\n  double proximal_p;\n\n  Eigen::VectorXd WGL_M;\n  Eigen::VectorXd rhs;\n  Eigen::MatrixXd Ri,Ji;\n  Eigen::VectorXd W_11; Eigen::VectorXd W_12; Eigen::VectorXd W_13;\n  Eigen::VectorXd W_21; Eigen::VectorXd W_22; Eigen::VectorXd W_23;\n  Eigen::VectorXd W_31; Eigen::VectorXd W_32; Eigen::VectorXd W_33;\n  Eigen::SparseMatrix<double> Dx,Dy,Dz;\n  int f_n,v_n;\n  bool first_solve;\n  bool has_pre_calc = false;\n  int dim;\n};\n\n// Compute necessary information to start using SLIM\n// Inputs:\n//\t\tV           #V by 3 list of mesh vertex positions\n//\t\tF           #F by 3/3 list of mesh faces (triangles/tets)\n//    b           list of boundary indices into V\n//    bc          #b by dim list of boundary conditions\n//    soft_p      Soft penalty factor (can be zero)\n//    slim_energy Energy to minimize\nIGL_INLINE void slim_precompute(\n  const Eigen::MatrixXd& V,\n  const Eigen::MatrixXi& F,\n  const Eigen::MatrixXd& V_init,\n  SLIMData& data,\n  SLIMData::SLIM_ENERGY slim_energy,\n  Eigen::VectorXi& b,\n  Eigen::MatrixXd& bc,\n  double soft_p);\n\n// Run iter_num iterations of SLIM\n// Outputs:\n//    V_o (in SLIMData): #V by dim list of mesh vertex positions\nIGL_INLINE Eigen::MatrixXd slim_solve(SLIMData& data, int iter_num);\n\n} // END NAMESPACE\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"slim.cpp\"\n#endif\n\n#endif // SLIM_H\n"
  },
  {
    "path": "libs/libigl/include/igl/snap_points.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"snap_points.h\"\n#include <cassert>\n#include <limits>\n\ntemplate <\n  typename DerivedC, \n  typename DerivedV, \n  typename DerivedI, \n  typename DerivedminD, \n  typename DerivedVI>\nIGL_INLINE void igl::snap_points(\n  const Eigen::PlainObjectBase<DerivedC > & C,\n  const Eigen::PlainObjectBase<DerivedV > & V,\n  Eigen::PlainObjectBase<DerivedI > & I,\n  Eigen::PlainObjectBase<DerivedminD > & minD,\n  Eigen::PlainObjectBase<DerivedVI > & VI)\n{\n  snap_points(C,V,I,minD);\n  const int m = C.rows();\n  VI.resize(m,V.cols());\n  for(int c = 0;c<m;c++)\n  {\n    VI.row(c) = V.row(I(c));\n  }\n}\n\ntemplate <\n  typename DerivedC, \n  typename DerivedV, \n  typename DerivedI, \n  typename DerivedminD>\nIGL_INLINE void igl::snap_points(\n  const Eigen::PlainObjectBase<DerivedC > & C,\n  const Eigen::PlainObjectBase<DerivedV > & V,\n  Eigen::PlainObjectBase<DerivedI > & I,\n  Eigen::PlainObjectBase<DerivedminD > & minD)\n{\n  using namespace std;\n  const int n = V.rows();\n  const int m = C.rows();\n  assert(V.cols() == C.cols() && \"Dimensions should match\");\n  // O(m*n)\n  //\n  // I believe there should be a way to do this in O(m*log(n) + n) assuming\n  // reasonably distubed points.\n  I.resize(m,1);\n  typedef typename DerivedV::Scalar Scalar;\n  minD.setConstant(m,1,numeric_limits<Scalar>::max());\n  for(int v = 0;v<n;v++)\n  {\n    for(int c = 0;c<m;c++)\n    {\n      const Scalar d = (C.row(c) - V.row(v)).squaredNorm();\n      if(d < minD(c))\n      {\n        minD(c,0) = d;\n        I(c,0) = v;\n      }\n    }\n  }\n}\n\ntemplate <\n  typename DerivedC, \n  typename DerivedV, \n  typename DerivedI>\nIGL_INLINE void igl::snap_points(\n  const Eigen::PlainObjectBase<DerivedC > & C,\n  const Eigen::PlainObjectBase<DerivedV > & V,\n  Eigen::PlainObjectBase<DerivedI > & I)\n{\n  Eigen::Matrix<typename DerivedC::Scalar,DerivedC::RowsAtCompileTime,1> minD;\n  return igl::snap_points(C,V,I,minD);\n}\n\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::snap_points<Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\ntemplate void igl::snap_points<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/snap_points.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_SNAP_POINTS_H\n#define IGL_SNAP_POINTS_H\n\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n\nnamespace igl\n{\n  // SNAP_POINTS snap list of points C to closest of another list of points V\n  //\n  // [I,minD,VI] = snap_points(C,V)\n  // \n  // Inputs:\n  //   C  #C by dim list of query point positions\n  //   V  #V by dim list of data point positions\n  // Outputs:\n  //   I  #C list of indices into V of closest points to C\n  //   minD  #C list of squared (^p) distances to closest points\n  //   VI  #C by dim list of new point positions, VI = V(I,:)\n  template <\n    typename DerivedC, \n    typename DerivedV, \n    typename DerivedI, \n    typename DerivedminD, \n    typename DerivedVI>\n  IGL_INLINE void snap_points(\n    const Eigen::PlainObjectBase<DerivedC > & C,\n    const Eigen::PlainObjectBase<DerivedV > & V,\n    Eigen::PlainObjectBase<DerivedI > & I,\n    Eigen::PlainObjectBase<DerivedminD > & minD,\n    Eigen::PlainObjectBase<DerivedVI > & VI);\n  template <\n    typename DerivedC, \n    typename DerivedV, \n    typename DerivedI, \n    typename DerivedminD>\n  IGL_INLINE void snap_points(\n    const Eigen::PlainObjectBase<DerivedC > & C,\n    const Eigen::PlainObjectBase<DerivedV > & V,\n    Eigen::PlainObjectBase<DerivedI > & I,\n    Eigen::PlainObjectBase<DerivedminD > & minD);\n  template <\n    typename DerivedC, \n    typename DerivedV, \n    typename DerivedI >\n  IGL_INLINE void snap_points(\n    const Eigen::PlainObjectBase<DerivedC > & C,\n    const Eigen::PlainObjectBase<DerivedV > & V,\n    Eigen::PlainObjectBase<DerivedI > & I);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"snap_points.cpp\"\n#endif\n\n#endif\n\n\n\n\n"
  },
  {
    "path": "libs/libigl/include/igl/snap_to_canonical_view_quat.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"snap_to_canonical_view_quat.h\"\n\n#include \"canonical_quaternions.h\"\n#include \"normalize_quat.h\"\n\n#include <cstdio>\n#include <cassert>\n\n// Note: For the canonical view quaternions it should be completely possible to\n// determine this anaylitcally. That is the max_distance should be a\n// theoretical known value\n// Also: I'm not sure it matters in this case, but. We are dealing with\n// quaternions on the 4d unit sphere, but measuring distance in general 4d\n// space (i.e. not geodesics on the sphere). Probably something with angles\n// would be better.\ntemplate <typename Q_type>\nIGL_INLINE bool igl::snap_to_canonical_view_quat(\n  const Q_type* q,\n  const Q_type threshold,\n  Q_type* s)\n{\n  // Copy input into output\n  // CANNOT use std::copy here according to:\n  // http://www.cplusplus.com/reference/algorithm/copy/\n  s[0] = q[0];\n  s[1] = q[1];\n  s[2] = q[2];\n  s[3] = q[3];\n\n  // Normalize input quaternion\n  Q_type qn[4];\n  bool valid_len =\n    igl::normalize_quat(q,qn);\n  // If normalizing valid then don't bother\n  if(!valid_len)\n  {\n    return false;\n  }\n\n  // 0.290019\n  const Q_type MAX_DISTANCE = 0.4;\n  Q_type min_distance = 2*MAX_DISTANCE;\n  int min_index = -1;\n  double min_sign = 0;\n  // loop over canonical view quaternions\n  for(double sign = -1;sign<=1;sign+=2)\n  {\n    for(int i = 0; i<NUM_CANONICAL_VIEW_QUAT; i++)\n    {\n      Q_type distance = 0.0;\n      // loop over coordinates\n      for(int j = 0;j<4;j++)\n      {\n        // Double cast because of bug in llvm version 4.2 with -O3\n        distance +=\n          (qn[j]-sign*igl::CANONICAL_VIEW_QUAT<Q_type>(i,j))*\n          (qn[j]-sign*igl::CANONICAL_VIEW_QUAT<Q_type>(i,j));\n      }\n      if(min_distance > distance)\n      {\n        min_distance = distance;\n        min_index = i;\n        min_sign = sign;\n      }\n    }\n  }\n\n  if(MAX_DISTANCE < min_distance)\n  {\n    fprintf(\n      stderr,\n      \"ERROR: found new max MIN_DISTANCE: %g\\n\"\n      \"PLEASE update snap_to_canonical_quat()\",\n      min_distance);\n  }\n\n  assert(min_distance < MAX_DISTANCE);\n  assert(min_index >= 0);\n\n  if( min_distance/MAX_DISTANCE <= threshold)\n  {\n    // loop over coordinates\n    for(int j = 0;j<4;j++)\n    {\n      s[j] = min_sign*igl::CANONICAL_VIEW_QUAT<Q_type>(min_index,j);\n    }\n    return true;\n  }\n  return false;\n}\n\ntemplate <typename Scalarq, typename Scalars>\nIGL_INLINE bool igl::snap_to_canonical_view_quat(\n  const Eigen::Quaternion<Scalarq> & q,\n  const double threshold,\n  Eigen::Quaternion<Scalars> & s)\n{\n  return snap_to_canonical_view_quat<Scalars>(\n    q.coeffs().data(),threshold,s.coeffs().data());\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate bool igl::snap_to_canonical_view_quat<double>(const double*, double, double*);\n// generated by autoexplicit.sh\ntemplate bool igl::snap_to_canonical_view_quat<float>(const float*, float, float*);\ntemplate bool igl::snap_to_canonical_view_quat<float, float>(Eigen::Quaternion<float, 0> const&, double, Eigen::Quaternion<float, 0>&);\ntemplate bool igl::snap_to_canonical_view_quat<double, double>(Eigen::Quaternion<double, 0> const&, double, Eigen::Quaternion<double, 0>&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/snap_to_canonical_view_quat.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_SNAP_TO_CANONICAL_VIEW_QUAT_H\n#define IGL_SNAP_TO_CANONICAL_VIEW_QUAT_H\n#include \"igl_inline.h\"\n#include <Eigen/Geometry>\n// A Quaternion, q, is defined here as an arrays of four scalars (x,y,z,w),\n// such that q = x*i + y*j + z*k + w\nnamespace igl\n{\n  // Snap the quaternion q to the nearest canonical view quaternion\n  // Input:\n  //   q  quaternion to be snapped (also see Outputs)\n  //   threshold  (optional) threshold:\n  //     1.0 --> snap any input\n  //     0.5 --> snap inputs somewhat close to canonical views\n  //     0.0 --> snap no input\n  // Output:\n  //   q  quaternion possibly set to nearest canonical view\n  // Return:\n  //   true only if q was snapped to the nearest canonical view\n  template <typename Q_type>\n  IGL_INLINE bool snap_to_canonical_view_quat(\n    const Q_type* q,\n    const Q_type threshold,\n    Q_type* s);\n\n  template <typename Scalarq, typename Scalars>\n  IGL_INLINE bool snap_to_canonical_view_quat(\n    const Eigen::Quaternion<Scalarq> & q,\n    const double threshold,\n    Eigen::Quaternion<Scalars> & s);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"snap_to_canonical_view_quat.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/snap_to_fixed_up.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"snap_to_fixed_up.h\"\n\ntemplate <typename Qtype>\nIGL_INLINE void igl::snap_to_fixed_up(\n  const Eigen::Quaternion<Qtype> & q,\n  Eigen::Quaternion<Qtype> & s)\n{\n  using namespace Eigen;\n  typedef Eigen::Matrix<Qtype,3,1> Vector3Q;\n  const Vector3Q up = q.matrix() * Vector3Q(0,1,0);\n  Vector3Q proj_up(0,up(1),up(2));\n  if(proj_up.norm() == 0)\n  {\n    proj_up = Vector3Q(0,1,0);\n  }\n  proj_up.normalize();\n  Quaternion<Qtype> dq;\n  dq = Quaternion<Qtype>::FromTwoVectors(up,proj_up);\n  s = dq * q;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiations\ntemplate void igl::snap_to_fixed_up<float>(Eigen::Quaternion<float, 0> const&, Eigen::Quaternion<float, 0>&);\ntemplate void igl::snap_to_fixed_up<double>(Eigen::Quaternion<double, 0> const&, Eigen::Quaternion<double, 0>&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/snap_to_fixed_up.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_SNAP_TO_FIXED_UP_H\n#define IGL_SNAP_TO_FIXED_UP_H\n\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <Eigen/Geometry>\n\nnamespace igl\n{\n  // Snap an arbitrary rotation to a rotation resulting from a rotation about\n  // the y-axis then the x-axis (maintaining fixed up like\n  // two_axis_valuator_fixed_up.)\n  //\n  // Inputs:\n  //   q  General rotation as quaternion\n  // Outputs:\n  //   s the resulting rotation (as quaternion)\n  //\n  // See also: two_axis_valuator_fixed_up\n  template <typename Qtype>\n  IGL_INLINE void snap_to_fixed_up(\n    const Eigen::Quaternion<Qtype> & q,\n    Eigen::Quaternion<Qtype> & s);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"snap_to_fixed_up.cpp\"\n#endif\n\n#endif\n\n\n"
  },
  {
    "path": "libs/libigl/include/igl/sort.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"sort.h\"\n\n#include \"SortableRow.h\"\n#include \"reorder.h\"\n#include \"IndexComparison.h\"\n#include \"colon.h\"\n#include \"parallel_for.h\"\n\n#include <cassert>\n#include <algorithm>\n#include <iostream>\n\ntemplate <typename DerivedX, typename DerivedY, typename DerivedIX>\nIGL_INLINE void igl::sort(\n  const Eigen::DenseBase<DerivedX>& X,\n  const int dim,\n  const bool ascending,\n  Eigen::PlainObjectBase<DerivedY>& Y,\n  Eigen::PlainObjectBase<DerivedIX>& IX)\n{\n  // get number of rows (or columns)\n  int num_inner = (dim == 1 ? X.rows() : X.cols() );\n  // Special case for swapping\n  switch(num_inner)\n  {\n    default:\n      break;\n    case 2:\n      return igl::sort2(X,dim,ascending,Y,IX);\n    case 3:\n      return igl::sort3(X,dim,ascending,Y,IX);\n  }\n  using namespace Eigen;\n  // get number of columns (or rows)\n  int num_outer = (dim == 1 ? X.cols() : X.rows() );\n  // dim must be 2 or 1\n  assert(dim == 1 || dim == 2);\n  // Resize output\n  Y.resizeLike(X);\n  IX.resizeLike(X);\n  // idea is to process each column (or row) as a std vector\n  // loop over columns (or rows)\n  for(int i = 0; i<num_outer;i++)\n  {\n    // Unsorted index map for this column (or row)\n    std::vector<size_t> index_map(num_inner);\n    std::vector<double> data(num_inner);\n    for(int j = 0;j<num_inner;j++)\n    {\n      if(dim == 1)\n      {\n        data[j] = (double) X(j,i);\n      }else\n      {\n        data[j] = (double) X(i,j);\n      }\n    }\n    // sort this column (or row)\n    igl::sort( data, ascending, data, index_map);\n    // Copy into Y and IX\n    for(int j = 0;j<num_inner;j++)\n    {\n      if(dim == 1)\n      {\n        Y(j,i) = data[j];\n        IX(j,i) = index_map[j];\n      }else\n      {\n        Y(i,j) = data[j];\n        IX(i,j) = index_map[j];\n      }\n    }\n  }\n}\n\ntemplate <typename DerivedX, typename DerivedY, typename DerivedIX>\nIGL_INLINE void igl::sort_new(\n  const Eigen::DenseBase<DerivedX>& X,\n  const int dim,\n  const bool ascending,\n  Eigen::PlainObjectBase<DerivedY>& Y,\n  Eigen::PlainObjectBase<DerivedIX>& IX)\n{\n  // get number of rows (or columns)\n  int num_inner = (dim == 1 ? X.rows() : X.cols() );\n  // Special case for swapping\n  switch(num_inner)\n  {\n    default:\n      break;\n    case 2:\n      return igl::sort2(X,dim,ascending,Y,IX);\n    case 3:\n      return igl::sort3(X,dim,ascending,Y,IX);\n  }\n  using namespace Eigen;\n  // get number of columns (or rows)\n  int num_outer = (dim == 1 ? X.cols() : X.rows() );\n  // dim must be 2 or 1\n  assert(dim == 1 || dim == 2);\n  // Resize output\n  Y.resizeLike(X);\n  IX.resizeLike(X);\n  // idea is to process each column (or row) as a std vector\n  // loop over columns (or rows)\n  for(int i = 0; i<num_outer;i++)\n  {\n    Eigen::VectorXi ix;\n    colon(0,num_inner-1,ix);\n    // Sort the index map, using unsorted for comparison\n    if(dim == 1)\n    {\n      std::sort(\n        ix.data(),\n        ix.data()+ix.size(),\n        igl::IndexVectorLessThan<const typename DerivedX::ConstColXpr >(X.col(i)));\n    }else\n    {\n      std::sort(\n        ix.data(),\n        ix.data()+ix.size(),\n        igl::IndexVectorLessThan<const typename DerivedX::ConstRowXpr >(X.row(i)));\n    }\n    // if not ascending then reverse\n    if(!ascending)\n    {\n      std::reverse(ix.data(),ix.data()+ix.size());\n    }\n    for(int j = 0;j<num_inner;j++)\n    {\n      if(dim == 1)\n      {\n        Y(j,i) = X(ix[j],i);\n        IX(j,i) = ix[j];\n      }else\n      {\n        Y(i,j) = X(i,ix[j]);\n        IX(i,j) = ix[j];\n      }\n    }\n  }\n}\n\ntemplate <typename DerivedX, typename DerivedY, typename DerivedIX>\nIGL_INLINE void igl::sort2(\n  const Eigen::DenseBase<DerivedX>& X,\n  const int dim,\n  const bool ascending,\n  Eigen::PlainObjectBase<DerivedY>& Y,\n  Eigen::PlainObjectBase<DerivedIX>& IX)\n{\n  using namespace Eigen;\n  using namespace std;\n  typedef typename DerivedY::Scalar YScalar;\n  Y = X.derived().template cast<YScalar>();\n\n\n  // get number of columns (or rows)\n  int num_outer = (dim == 1 ? X.cols() : X.rows() );\n  // get number of rows (or columns)\n  int num_inner = (dim == 1 ? X.rows() : X.cols() );\n  assert(num_inner == 2);(void)num_inner;\n  typedef typename DerivedIX::Scalar Index;\n  IX.resizeLike(X);\n  if(dim==1)\n  {\n    IX.row(0).setConstant(0);// = DerivedIX::Zero(1,IX.cols());\n    IX.row(1).setConstant(1);// = DerivedIX::Ones (1,IX.cols());\n  }else\n  {\n    IX.col(0).setConstant(0);// = DerivedIX::Zero(IX.rows(),1);\n    IX.col(1).setConstant(1);// = DerivedIX::Ones (IX.rows(),1);\n  }\n  // loop over columns (or rows)\n  for(int i = 0;i<num_outer;i++)\n  {\n    YScalar & a = (dim==1 ? Y(0,i) : Y(i,0));\n    YScalar & b = (dim==1 ? Y(1,i) : Y(i,1));\n    Index & ai = (dim==1 ? IX(0,i) : IX(i,0));\n    Index & bi = (dim==1 ? IX(1,i) : IX(i,1));\n    if((ascending && a>b) || (!ascending && a<b))\n    {\n      std::swap(a,b);\n      std::swap(ai,bi);\n    }\n  }\n}\n\ntemplate <typename DerivedX, typename DerivedY, typename DerivedIX>\nIGL_INLINE void igl::sort3(\n  const Eigen::DenseBase<DerivedX>& X,\n  const int dim,\n  const bool ascending,\n  Eigen::PlainObjectBase<DerivedY>& Y,\n  Eigen::PlainObjectBase<DerivedIX>& IX)\n{\n  using namespace Eigen;\n  using namespace std;\n  typedef typename DerivedY::Scalar YScalar;\n  Y = X.derived().template cast<YScalar>();\n  Y.resizeLike(X);\n  for(int j=0;j<X.cols();j++)for(int i=0;i<X.rows();i++)Y(i,j)=(YScalar)X(i,j);\n\n  // get number of columns (or rows)\n  int num_outer = (dim == 1 ? X.cols() : X.rows() );\n  // get number of rows (or columns)\n  int num_inner = (dim == 1 ? X.rows() : X.cols() );\n  assert(num_inner == 3);(void)num_inner;\n  typedef typename DerivedIX::Scalar Index;\n  IX.resizeLike(X);\n  if(dim==1)\n  {\n    IX.row(0).setConstant(0);// = DerivedIX::Zero(1,IX.cols());\n    IX.row(1).setConstant(1);// = DerivedIX::Ones (1,IX.cols());\n    IX.row(2).setConstant(2);// = DerivedIX::Ones (1,IX.cols());\n  }else\n  {\n    IX.col(0).setConstant(0);// = DerivedIX::Zero(IX.rows(),1);\n    IX.col(1).setConstant(1);// = DerivedIX::Ones (IX.rows(),1);\n    IX.col(2).setConstant(2);// = DerivedIX::Ones (IX.rows(),1);\n  }\n\n\n  const auto & inner = [&IX,&Y,&dim,&ascending](const Index & i)\n  {\n    YScalar & a = (dim==1 ? Y(0,i) : Y(i,0));\n    YScalar & b = (dim==1 ? Y(1,i) : Y(i,1));\n    YScalar & c = (dim==1 ? Y(2,i) : Y(i,2));\n    Index & ai = (dim==1 ? IX(0,i) : IX(i,0));\n    Index & bi = (dim==1 ? IX(1,i) : IX(i,1));\n    Index & ci = (dim==1 ? IX(2,i) : IX(i,2));\n    if(ascending)\n    {\n      // 123 132 213 231 312 321\n      if(a > b)\n      {\n        std::swap(a,b);\n        std::swap(ai,bi);\n      }\n      // 123 132 123 231 132 231\n      if(b > c)\n      {\n        std::swap(b,c);\n        std::swap(bi,ci);\n        // 123 123 123 213 123 213\n        if(a > b)\n        {\n          std::swap(a,b);\n          std::swap(ai,bi);\n        }\n        // 123 123 123 123 123 123\n      }\n    }else\n    {\n      // 123 132 213 231 312 321\n      if(a < b)\n      {\n        std::swap(a,b);\n        std::swap(ai,bi);\n      }\n      // 213 312 213 321 312 321\n      if(b < c)\n      {\n        std::swap(b,c);\n        std::swap(bi,ci);\n        // 231 321 231 321 321 321\n        if(a < b)\n        {\n          std::swap(a,b);\n          std::swap(ai,bi);\n        }\n        // 321 321 321 321 321 321\n      }\n    }\n  };\n  parallel_for(num_outer,inner,16000);\n}\n\ntemplate <class T>\nIGL_INLINE void igl::sort(\nconst std::vector<T> & unsorted,\nconst bool ascending,\nstd::vector<T> & sorted,\nstd::vector<size_t> & index_map)\n{\n// Original unsorted index map\nindex_map.resize(unsorted.size());\nfor(size_t i=0;i<unsorted.size();i++)\n{\n  index_map[i] = i;\n}\n// Sort the index map, using unsorted for comparison\nstd::sort(\n  index_map.begin(),\n  index_map.end(),\n  igl::IndexLessThan<const std::vector<T>& >(unsorted));\n\n// if not ascending then reverse\nif(!ascending)\n{\n  std::reverse(index_map.begin(),index_map.end());\n}\n  // make space for output without clobbering\n  sorted.resize(unsorted.size());\n  // reorder unsorted into sorted using index map\n  igl::reorder(unsorted,index_map,sorted);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::sort<Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> > const&, int, bool, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::sort<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, int, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::sort<Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, int, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::sort<int>(std::vector<int, std::allocator<int> > const&, bool, std::vector<int, std::allocator<int> >&, std::vector<size_t,class std::allocator<size_t> > &);\ntemplate void igl::sort<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, int, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::sort<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, int, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::sort<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, int, bool, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::sort<Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> > const&, int, bool, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::sort<Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int, bool, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::sort<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, int, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::sort_new<Eigen::Matrix<int, 1, 6, 1, 1, 6>, Eigen::Matrix<int, 1, 6, 1, 1, 6>, Eigen::Matrix<int, 1, 6, 1, 1, 6> >(Eigen::DenseBase<Eigen::Matrix<int, 1, 6, 1, 1, 6> > const&, int, bool, Eigen::PlainObjectBase<Eigen::Matrix<int, 1, 6, 1, 1, 6> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, 1, 6, 1, 1, 6> >&);\ntemplate void igl::sort<Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, 2, 0, -1, 2> >(Eigen::DenseBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> > const&, int, bool, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> >&);\ntemplate void igl::sort<Eigen::Matrix<double, -1, 4, 0, -1, 4>, Eigen::Matrix<double, -1, 4, 0, -1, 4>, Eigen::Matrix<int, -1, 4, 0, -1, 4> >(Eigen::DenseBase<Eigen::Matrix<double, -1, 4, 0, -1, 4> > const&, int, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 4, 0, -1, 4> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 4, 0, -1, 4> >&);\ntemplate void igl::sort<Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, int, bool, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::sort<long>(std::vector<long, std::allocator<long> > const&, bool, std::vector<long, std::allocator<long> >&, std::vector<unsigned long, std::allocator<unsigned long> >&);\ntemplate void igl::sort<Eigen::Matrix<double, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> > const&, int, bool, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::sort<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, int, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::sort<Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> > const&, int, bool, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::sort<Eigen::Matrix<double, -1, 2, 0, -1, 2>, Eigen::Matrix<double, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> > const&, int, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::sort<Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, int, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::sort<Eigen::Matrix<float, -1, 3, 0, -1, 3>, Eigen::Matrix<float, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<float, -1, 3, 0, -1, 3> > const&, int, bool, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::sort<Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int, bool, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::sort<Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<long, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int, bool, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/sort.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_SORT_H\n#define IGL_SORT_H\n#include \"igl_inline.h\"\n\n#include <vector>\n#include <Eigen/Core>\nnamespace igl\n{\n\n  // Sort the elements of a matrix X along a given dimension like matlabs sort\n  // function\n  //\n  // Templates:\n  //   DerivedX derived scalar type, e.g. MatrixXi or MatrixXd\n  //   DerivedIX derived integer type, e.g. MatrixXi\n  // Inputs:\n  //   X  m by n matrix whose entries are to be sorted\n  //   dim  dimensional along which to sort:\n  //     1  sort each column (matlab default)\n  //     2  sort each row\n  //   ascending  sort ascending (true, matlab default) or descending (false)\n  // Outputs:\n  //   Y  m by n matrix whose entries are sorted\n  //   IX  m by n matrix of indices so that if dim = 1, then in matlab notation\n  //     for j = 1:n, Y(:,j) = X(I(:,j),j); end\n  template <typename DerivedX, typename DerivedY, typename DerivedIX>\n  IGL_INLINE void sort(\n    const Eigen::DenseBase<DerivedX>& X,\n    const int dim,\n    const bool ascending,\n    Eigen::PlainObjectBase<DerivedY>& Y,\n    Eigen::PlainObjectBase<DerivedIX>& IX);\n  template <typename DerivedX, typename DerivedY, typename DerivedIX>\n  // Only better if size(X,dim) is small\n  IGL_INLINE void sort_new(\n    const Eigen::DenseBase<DerivedX>& X,\n    const int dim,\n    const bool ascending,\n    Eigen::PlainObjectBase<DerivedY>& Y,\n    Eigen::PlainObjectBase<DerivedIX>& IX);\n  // Special case if size(X,dim) == 2\n  template <typename DerivedX, typename DerivedY, typename DerivedIX>\n  IGL_INLINE void sort2(\n    const Eigen::DenseBase<DerivedX>& X,\n    const int dim,\n    const bool ascending,\n    Eigen::PlainObjectBase<DerivedY>& Y,\n    Eigen::PlainObjectBase<DerivedIX>& IX);\n  // Special case if size(X,dim) == 3\n  template <typename DerivedX, typename DerivedY, typename DerivedIX>\n  IGL_INLINE void sort3(\n    const Eigen::DenseBase<DerivedX>& X,\n    const int dim,\n    const bool ascending,\n    Eigen::PlainObjectBase<DerivedY>& Y,\n    Eigen::PlainObjectBase<DerivedIX>& IX);\n\n\n  // Act like matlab's [Y,I] = SORT(X) for std library vectors\n  // Templates:\n  //   T  should be a class that implements the '<' comparator operator\n  // Input:\n  //   unsorted  unsorted vector\n  //   ascending  sort ascending (true, matlab default) or descending (false)\n  // Output:\n  //   sorted     sorted vector, allowed to be same as unsorted\n  //   index_map  an index map such that sorted[i] = unsorted[index_map[i]]\n  template <class T>\n  IGL_INLINE void sort(\n    const std::vector<T> &unsorted,\n    const bool ascending,\n    std::vector<T> &sorted,\n    std::vector<size_t> &index_map);\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"sort.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/sort_angles.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"sort_angles.h\"\n#include \"LinSpaced.h\"\n#include <algorithm>\n\ntemplate <typename DerivedM, typename DerivedR>\nIGL_INLINE void igl::sort_angles(\n        const Eigen::PlainObjectBase<DerivedM>& M,\n        Eigen::PlainObjectBase<DerivedR>& R) {\n    const size_t num_rows = M.rows();\n    const size_t num_cols = M.cols();\n    assert(num_cols >= 2);\n\n    R.resize(num_rows);\n    R = igl::LinSpaced<\n      Eigen::Matrix<typename DerivedR::Scalar, Eigen::Dynamic, 1> >\n      (num_rows, 0, num_rows-1);\n\n    //              |\n    // (pi/2, pi)   | (0, pi/2)\n    //              |\n    // -------------+--------------\n    //              |\n    // (-pi, -pi/2) | (-pi/2, 0)\n    //              |\n    auto comp = [&](size_t i, size_t j) {\n        auto yi = M(i, 0);\n        auto xi = M(i, 1);\n        auto yj = M(j, 0);\n        auto xj = M(j, 1);\n\n        if (xi == xj && yi == yj) {\n            for (size_t idx=2; idx<num_cols; idx++) {\n                auto i_val = M(i, idx);\n                auto j_val = M(j, idx);\n                if (i_val != j_val) {\n                    return i_val < j_val;\n                }\n            }\n            // If the entire rows are equal, use the row index.\n            return i < j;\n        }\n\n        if (xi >= 0 && yi >= 0) {\n            if (xj >=0 && yj >= 0) {\n                if (xi != xj) {\n                    return xi > xj;\n                } else {\n                    return yi < yj;\n                }\n            } else if (xj < 0 && yj >= 0) {\n                return true;\n            } else if (xj < 0 && yj < 0) {\n                return false;\n            } else {\n                return false;\n            }\n        } else if (xi < 0 && yi >= 0) {\n            if (xj >= 0 && yj >= 0) {\n                return false;\n            } else if (xj < 0 && yj >= 0) {\n                if (xi != xj) {\n                    return xi > xj;\n                } else {\n                    return yi > yj;\n                }\n            } else if (xj < 0 && yj < 0) {\n                return false;\n            } else {\n                return false;\n            }\n        } else if (xi < 0 && yi < 0) {\n            if (xj >= 0 && yj >= 0) {\n                return true;\n            } else if (xj < 0 && yj >= 0) {\n                return true;\n            } else if (xj < 0 && yj < 0) {\n                if (xi != xj) {\n                    return xi < xj;\n                } else {\n                    return yi > yj;\n                }\n            } else {\n                return true;\n            }\n        } else {\n            if (xj >= 0 && yj >= 0) {\n                return true;\n            } else if (xj < 0 && yj >= 0) {\n                return true;\n            } else if (xj < 0 && yj < 0) {\n                return false;\n            } else {\n                if (xi != xj) {\n                    return xi < xj;\n                } else {\n                    return yi < yj;\n                }\n            }\n        }\n    };\n    std::sort(R.data(), R.data() + num_rows, comp);\n}\n\n#ifdef IGL_STATIC_LIBRARY\ntemplate void igl::sort_angles<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/sort_angles.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef SORT_ANGLES_H\n#define SORT_ANGLES_H\n\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n\nnamespace igl {\n    // Sort angles in ascending order in a numerically robust way.\n    //\n    // Instead of computing angles using atan2(y, x), sort directly on (y, x).\n    //\n    // Inputs:\n    //   M: m by n matrix of scalars. (n >= 2).  Assuming the first column of M\n    //      contains values for y, and the second column is x.  Using the rest\n    //      of the columns as tie-breaker.\n    //   R: an array of m indices.  M.row(R[i]) contains the i-th smallest\n    //      angle.\n    template<typename DerivedM, typename DerivedR>\n    IGL_INLINE void sort_angles(\n            const Eigen::PlainObjectBase<DerivedM>& M,\n            Eigen::PlainObjectBase<DerivedR>& R);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#include \"sort_angles.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/sort_triangles.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"sort_triangles.h\"\n#include \"barycenter.h\"\n#include \"sort.h\"\n#include \"sortrows.h\"\n#include \"slice.h\"\n#include \"round.h\"\n#include \"colon.h\"\n\n#include <iostream>\n\ntemplate <\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedMV,\n  typename DerivedP,\n  typename DerivedFF,\n  typename DerivedI>\nIGL_INLINE void igl::sort_triangles(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  const Eigen::PlainObjectBase<DerivedMV> & MV,\n  const Eigen::PlainObjectBase<DerivedP> & P,\n  Eigen::PlainObjectBase<DerivedFF> & FF,\n  Eigen::PlainObjectBase<DerivedI> & I)\n{\n  using namespace Eigen;\n  using namespace std;\n\n\n  // Barycenter, centroid\n  Eigen::Matrix<typename DerivedV::Scalar, DerivedF::RowsAtCompileTime,1> D,sD;\n  Eigen::Matrix<typename DerivedV::Scalar, DerivedF::RowsAtCompileTime,4> BC,PBC;\n  barycenter(V,F,BC);\n  D = BC*(MV.transpose()*P.transpose().eval().col(2));\n  sort(D,1,false,sD,I);\n\n  //// Closest corner\n  //Eigen::Matrix<typename DerivedV::Scalar, DerivedF::RowsAtCompileTime,1> D,sD;\n  //D.setConstant(F.rows(),1,-1e26);\n  //for(int c = 0;c<3;c++)\n  //{\n  //  Eigen::Matrix<typename DerivedV::Scalar, DerivedF::RowsAtCompileTime,4> C;\n  //  Eigen::Matrix<typename DerivedV::Scalar, DerivedF::RowsAtCompileTime,1> DC;\n  //  C.resize(F.rows(),4);\n  //  for(int f = 0;f<F.rows();f++)\n  //  {\n  //    C(f,0) = V(F(f,c),0);\n  //    C(f,1) = V(F(f,c),1);\n  //    C(f,2) = V(F(f,c),2);\n  //    C(f,3) = 1;\n  //  }\n  //  DC = C*(MV.transpose()*P.transpose().eval().col(2));\n  //  D = (DC.array()>D.array()).select(DC,D).eval();\n  //}\n  //sort(D,1,false,sD,I);\n\n  //// Closest corner with tie breaks\n  //Eigen::Matrix<typename DerivedV::Scalar, DerivedF::RowsAtCompileTime,3> D,sD,ssD;\n  //D.resize(F.rows(),3);\n  //for(int c = 0;c<3;c++)\n  //{\n  //  Eigen::Matrix<typename DerivedV::Scalar, DerivedF::RowsAtCompileTime,4> C;\n  //  C.resize(F.rows(),4);\n  //  for(int f = 0;f<F.rows();f++)\n  //  {\n  //    C(f,0) = V(F(f,c),0);\n  //    C(f,1) = V(F(f,c),1);\n  //    C(f,2) = V(F(f,c),2);\n  //    C(f,3) = 1;\n  //  }\n  //  D.col(c) = C*(MV.transpose()*P.transpose().eval().col(2));\n  //}\n  //VectorXi _;\n  //sort(D,2,false,sD,_);\n  //sortrows(sD,false,ssD,I);\n\n\n  slice(F,I,1,FF);\n}\n\n//#include \"EPS.h\"\n//#include <functional>\n//#include <algorithm>\n//\n//static int tough_count = 0;\n//template <typename Vec3>\n//class Triangle\n//{\n//  public:\n//    static inline bool z_comp(const Vec3 & A, const Vec3 & B)\n//    {\n//      return A(2) > B(2);\n//    }\n//   static typename Vec3::Scalar ZERO()\n//   {\n//     return igl::EPS<typename Vec3::Scalar>();\n//     return 0;\n//   }\n//  public:\n//    int id;\n//    // Sorted projected coners: c[0] has smallest z value\n//    Vec3 c[3];\n//    Vec3 n;\n//  public:\n//    Triangle():id(-1) { };\n//    Triangle(int id, const Vec3 c0, const Vec3 c1, const Vec3 c2):\n//      id(id)\n//    {\n//      using namespace std;\n//      c[0] = c0;\n//      c[1] = c1;\n//      c[2] = c2;\n//      sort(c,c+3,Triangle<Vec3>::z_comp);\n//      // normal pointed toward viewpoint\n//      n = (c0-c1).cross(c2-c0);\n//      if(n(2) < 0)\n//      {\n//        n *= -1.0;\n//      }\n//      // Avoid NaNs\n//      typename Vec3::Scalar len = n.norm();\n//      if(len == 0)\n//      {\n//        cout<<\"avoid NaN\"<<endl;\n//        assert(false);\n//        len = 1;\n//      }\n//      n /= len;\n//    };\n//\n//    typename Vec3::Scalar project(const Vec3 & r) const\n//    {\n//      //return n.dot(r-c[2]);\n//      int closest = -1;\n//      typename Vec3::Scalar min_dist = 1e26;\n//      for(int ci = 0;ci<3;ci++)\n//      {\n//        typename Vec3::Scalar dist = (c[ci]-r).norm();\n//        if(dist < min_dist)\n//        {\n//          min_dist = dist;\n//          closest = ci;\n//        }\n//      }\n//      assert(closest>=0);\n//      return n.dot(r-c[closest]);\n//    }\n//\n//    // Z-values of this are < z-values of that\n//    bool is_completely_behind(const Triangle & that) const\n//    {\n//      const typename Vec3::Scalar ac0 = that.c[0](2);\n//      const typename Vec3::Scalar ac1 = that.c[1](2);\n//      const typename Vec3::Scalar ac2 = that.c[2](2);\n//      const typename Vec3::Scalar ic0 = this->c[0](2);\n//      const typename Vec3::Scalar ic1 = this->c[1](2);\n//      const typename Vec3::Scalar ic2 = this->c[2](2);\n//      return\n//        (ic0 <  ac2 && ic1 <= ac2 && ic2 <= ac2) ||\n//        (ic0 <= ac2 && ic1 <  ac2 && ic2 <= ac2) ||\n//        (ic0 <= ac2 && ic1 <= ac2 && ic2 <  ac2);\n//    }\n//\n//    bool is_behind_plane(const Triangle &that) const\n//    {\n//      using namespace std;\n//      const typename Vec3::Scalar apc0 = that.project(this->c[0]);\n//      const typename Vec3::Scalar apc1 = that.project(this->c[1]);\n//      const typename Vec3::Scalar apc2 = that.project(this->c[2]);\n//      cout<<\"    \"<<\n//        apc0<<\", \"<<\n//        apc1<<\", \"<<\n//        apc2<<\", \"<<endl;\n//      return (apc0 <  ZERO() && apc1 < ZERO() && apc2 < ZERO());\n//    }\n//\n//    bool is_in_front_of_plane(const Triangle &that) const\n//    {\n//      using namespace std;\n//      const typename Vec3::Scalar apc0 = that.project(this->c[0]);\n//      const typename Vec3::Scalar apc1 = that.project(this->c[1]);\n//      const typename Vec3::Scalar apc2 = that.project(this->c[2]);\n//      cout<<\"    \"<<\n//        apc0<<\", \"<<\n//        apc1<<\", \"<<\n//        apc2<<\", \"<<endl;\n//      return (apc0 >  ZERO() && apc1 > ZERO() && apc2 > ZERO());\n//    }\n//\n//    bool is_coplanar(const Triangle &that) const\n//    {\n//      using namespace std;\n//      const typename Vec3::Scalar apc0 = that.project(this->c[0]);\n//      const typename Vec3::Scalar apc1 = that.project(this->c[1]);\n//      const typename Vec3::Scalar apc2 = that.project(this->c[2]);\n//      return (fabs(apc0)<=ZERO() && fabs(apc1)<=ZERO() && fabs(apc2)<=ZERO());\n//    }\n//\n//    // http://stackoverflow.com/a/14561664/148668\n//    // a1 is line1 start, a2 is line1 end, b1 is line2 start, b2 is line2 end\n//    static bool seg_seg_intersect(const Vec3 &  a1, const Vec3 &  a2, const Vec3 &  b1, const Vec3 &  b2)\n//    {\n//      Vec3 b = a2-a1;\n//      Vec3 d = b2-b1;\n//      typename Vec3::Scalar bDotDPerp = b(0) * d(1) - b(1) * d(0);\n//\n//      // if b dot d == 0, it means the lines are parallel so have infinite intersection points\n//      if (bDotDPerp == 0)\n//        return false;\n//\n//      Vec3 c = b1-a1;\n//      typename Vec3::Scalar t = (c(0) * d(1) - c(1) * d(0)) / bDotDPerp;\n//      if (t < 0 || t > 1)\n//        return false;\n//\n//      typename Vec3::Scalar u = (c(0) * b(1) - c(1) * b(0)) / bDotDPerp;\n//      if (u < 0 || u > 1)\n//        return false;\n//\n//      return true;\n//    }\n//    bool has_corner_inside(const Triangle & that) const\n//    {\n//      // http://www.blackpawn.com/texts/pointinpoly/\n//      // Compute vectors        \n//      Vec3 A = that.c[0];\n//      Vec3 B = that.c[1];\n//      Vec3 C = that.c[2];\n//      A(2) = B(2) = C(2) = 0;\n//      for(int ci = 0;ci<3;ci++)\n//      {\n//        Vec3 P = this->c[ci];\n//        P(2) = 0;\n//\n//        Vec3 v0 = C - A;\n//        Vec3 v1 = B - A;\n//        Vec3 v2 = P - A;\n//        \n//        // Compute dot products\n//        typename Vec3::Scalar dot00 = v0.dot(v0);\n//        typename Vec3::Scalar dot01 = v0.dot(v1);\n//        typename Vec3::Scalar dot02 = v0.dot(v2);\n//        typename Vec3::Scalar dot11 = v1.dot(v1);\n//        typename Vec3::Scalar dot12 = v1.dot(v2);\n//        \n//        // Compute barycentric coordinates\n//        typename Vec3::Scalar invDenom = 1 / (dot00 * dot11 - dot01 * dot01);\n//        typename Vec3::Scalar u = (dot11 * dot02 - dot01 * dot12) * invDenom;\n//        typename Vec3::Scalar v = (dot00 * dot12 - dot01 * dot02) * invDenom;\n//        \n//        // Check if point is in triangle\n//        if((u >= 0) && (v >= 0) && (u + v < 1))\n//        {\n//          return true;\n//        }\n//      }\n//      return false;\n//    }\n//\n//    bool overlaps(const Triangle &that) const\n//    {\n//      // Edges cross\n//      for(int e = 0;e<3;e++)\n//      {\n//        for(int f = 0;f<3;f++)\n//        {\n//          if(seg_seg_intersect(\n//            this->c[e],this->c[(e+1)%3],\n//            that.c[e],that.c[(e+1)%3]))\n//          {\n//            return true;\n//          }\n//        }\n//      }\n//      // This could be entirely inside that\n//      if(this->has_corner_inside(that))\n//      {\n//        return true;\n//      }\n//      // vice versa\n//      if(that.has_corner_inside(*this))\n//      {\n//        return true;\n//      }\n//      return false;\n//    }\n//\n//\n//    bool operator< (const Triangle &that) const\n//    {\n//      // THIS < THAT if \"depth\" of THIS  < \"depth\" of THAT\n//      //      \"      if THIS should be draw before THAT\n//      using namespace std;\n//      bool ret = false;\n//      // Self compare\n//      if(that.id == this->id)\n//      {\n//        ret = false;\n//      }\n//      if(this->is_completely_behind(that))\n//      {\n//        cout<<\" \"<<this->id<<\" completely behind \"<<that.id<<endl;\n//        ret = false;\n//      }else if(that.is_completely_behind(*this))\n//      {\n//        cout<<\" \"<<that.id<<\" completely behind \"<<this->id<<endl;\n//        ret = true;\n//      }else\n//      {\n//        if(!this->overlaps(that))\n//        {\n//          assert(!that.overlaps(*this));\n//          cout<<\"  THIS does not overlap THAT\"<<endl;\n//          // No overlap use barycenter\n//          return \n//            1./3.*(this->c[0](2) + this->c[1](2) + this->c[2](2)) >\n//            1./3.*(that.c[0](2) + that.c[1](2) + that.c[2](2));\n//        }else\n//        {\n//          if(this->is_coplanar(that) || that.is_coplanar(*this))\n//          { \n//            cout<<\"  coplanar\"<<endl;\n//            // co-planar: decide based on barycenter depth\n//            ret = \n//              1./3.*(this->c[0](2) + this->c[1](2) + this->c[2](2)) >\n//              1./3.*(that.c[0](2) + that.c[1](2) + that.c[2](2));\n//          }else if(this->is_behind_plane(that))\n//          {\n//            cout<<\"  THIS behind plane of THAT\"<<endl;\n//            ret = true;\n//          }else if(that.is_behind_plane(*this))\n//          { \n//            cout<<\"  THAT behind of plane of THIS\"<<endl;\n//            ret = false;\n//          // THAT is in front of plane of THIS\n//          }else if(that.is_in_front_of_plane(*this))\n//          { \n//            cout<<\"  THAT in front of plane of THIS\"<<endl;\n//            ret = true;\n//          // THIS is in front of plane of THAT\n//          }else if(this->is_in_front_of_plane(that))\n//          {\n//            cout<<\"  THIS in front plane of THAT\"<<endl;\n//            ret = false;\n//          }else\n//          {\n//            cout<<\"  compare bary\"<<endl;\n//            ret = \n//              1./3.*(this->c[0](2) + this->c[1](2) + this->c[2](2)) >\n//              1./3.*(that.c[0](2) + that.c[1](2) + that.c[2](2));\n//          }\n//        }\n//      }\n//      if(ret)\n//      {\n//        // THIS < THAT so better not be THAT < THIS\n//        cout<<this->id<<\" < \"<<that.id<<endl;\n//        assert(!(that < *this));\n//      }else\n//      {\n//        // THIS >= THAT so could be THAT < THIS or THAT == THIS\n//      }\n//      return ret;\n//    }\n//};\n//#include <igl/matlab/MatlabWorkspace.h>\n//\n//template <\n//  typename DerivedV,\n//  typename DerivedF,\n//  typename DerivedMV,\n//  typename DerivedP,\n//  typename DerivedFF,\n//  typename DerivedI>\n//IGL_INLINE void igl::sort_triangles_robust(\n//  const Eigen::PlainObjectBase<DerivedV> & V,\n//  const Eigen::PlainObjectBase<DerivedF> & F,\n//  const Eigen::PlainObjectBase<DerivedMV> & MV,\n//  const Eigen::PlainObjectBase<DerivedP> & P,\n//  Eigen::PlainObjectBase<DerivedFF> & FF,\n//  Eigen::PlainObjectBase<DerivedI> & I)\n//{\n//  assert(false && \n//    \"THIS WILL NEVER WORK because depth sorting is not a numerical sort where\"\n//    \"pairwise comparisons of triangles are transitive.  Rather it is a\"\n//    \"topological sort on a dependecy graph. Dependency encodes 'This triangle\"\n//    \"must be drawn before that one'\");\n//  using namespace std;\n//  using namespace Eigen;\n//  typedef Matrix<typename DerivedV::Scalar,3,1> Vec3;\n//  assert(V.cols() == 4);\n//  Matrix<typename DerivedV::Scalar, DerivedV::RowsAtCompileTime,3> VMVP =\n//    V*(MV.transpose()*P.transpose().eval().block(0,0,4,3));\n//\n//  MatrixXd projV(V.rows(),3);\n//  for(int v = 0;v<V.rows();v++)\n//  {\n//    Vector3d vv;\n//    vv(0) = V(v,0);\n//    vv(1) = V(v,1);\n//    vv(2) = V(v,2);\n//    Vector3d p;\n//    project(vv,p);\n//    projV.row(v) = p;\n//  }\n//\n//  vector<Triangle<Vec3> > vF(F.rows());\n//  MatrixXd N(F.rows(),3);\n//  MatrixXd C(F.rows()*3,3);\n//  for(int f = 0;f<F.rows();f++)\n//  {\n//    vF[f] = \n//      //Triangle<Vec3>(f,VMVP.row(F(f,0)),VMVP.row(F(f,1)),VMVP.row(F(f,2)));\n//      Triangle<Vec3>(f,projV.row(F(f,0)),projV.row(F(f,1)),projV.row(F(f,2)));\n//    N.row(f) = vF[f].n;\n//    for(int c = 0;c<3;c++)\n//      for(int d = 0;d<3;d++)\n//        C(f*3+c,d) = vF[f].c[c](d);\n//  }\n//  MatlabWorkspace mw;\n//  mw.save_index(F,\"F\");\n//  mw.save(V,\"V\");\n//  mw.save(MV,\"MV\");\n//  mw.save(P,\"P\");\n//  Vector4i VP;\n//  glGetIntegerv(GL_VIEWPORT, VP.data());\n//  mw.save(projV,\"projV\");\n//  mw.save(VP,\"VP\");\n//  mw.save(VMVP,\"VMVP\");\n//  mw.save(N,\"N\");\n//  mw.save(C,\"C\");\n//  mw.write(\"ao.mat\");\n//  sort(vF.begin(),vF.end());\n//\n//  // check\n//  for(int f = 0;f<F.rows();f++)\n//  {\n//    for(int g = f+1;g<F.rows();g++)\n//    {\n//      assert(!(vF[g] < vF[f])); // should never happen\n//    }\n//  }\n//  FF.resize(F.rows(),3);\n//  I.resize(F.rows(),1);\n//  for(int f = 0;f<F.rows();f++)\n//  {\n//    FF.row(f) = F.row(vF[f].id);\n//    I(f) = vF[f].id;\n//  }\n//\n//  mw.save_index(FF,\"FF\");\n//  mw.save_index(I,\"I\");\n//  mw.write(\"ao.mat\");\n//}\n\n//template <\n//  typename DerivedV,\n//  typename DerivedF,\n//  typename DerivedFF,\n//  typename DerivedI>\n//IGL_INLINE void igl::sort_triangles_robust(\n//  const Eigen::PlainObjectBase<DerivedV> & V,\n//  const Eigen::PlainObjectBase<DerivedF> & F,\n//  Eigen::PlainObjectBase<DerivedFF> & FF,\n//  Eigen::PlainObjectBase<DerivedI> & I)\n//{\n//  using namespace Eigen;\n//  using namespace std;\n//  // Put model, projection, and viewport matrices into double arrays\n//  Matrix4d MV;\n//  Matrix4d P;\n//  glGetDoublev(GL_MODELVIEW_MATRIX,  MV.data());\n//  glGetDoublev(GL_PROJECTION_MATRIX, P.data());\n//  if(V.cols() == 3)\n//  {\n//    Matrix<typename DerivedV::Scalar, DerivedV::RowsAtCompileTime,4> hV;\n//    hV.resize(V.rows(),4);\n//    hV.block(0,0,V.rows(),V.cols()) = V;\n//    hV.col(3).setConstant(1);\n//    return sort_triangles_robust(hV,F,MV,P,FF,I);\n//  }else\n//  {\n//    return sort_triangles_robust(V,F,MV,P,FF,I);\n//  }\n//}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::sort_triangles<Eigen::Matrix<double, -1, 4, 0, -1, 4>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, 4, 4, 0, 4, 4>, Eigen::Matrix<double, 4, 4, 0, 4, 4>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 4, 0, -1, 4> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 4, 4, 0, 4, 4> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 4, 4, 0, 4, 4> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::sort_triangles<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, 4, 4, 0, 4, 4>, Eigen::Matrix<double, 4, 4, 0, 4, 4>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 4, 4, 0, 4, 4> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 4, 4, 0, 4, 4> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/sort_triangles.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_SORT_TRIANGLES_H\n#define IGL_SORT_TRIANGLES_H\n\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n\nnamespace igl\n{\n  // Inputs:\n  //   V  #V by **4** list of homogeneous vertex positions\n  //   F  #F by 3 list of triangle indices\n  //   MV  4 by 4 model view matrix\n  //   P  4 by 4 projection matrix\n  // Outputs:\n  //   FF  #F by 3 list of sorted triangles indices\n  //   I  #F list of sorted indices\n  template <\n    typename DerivedV,\n    typename DerivedF,\n    typename DerivedMV,\n    typename DerivedP,\n    typename DerivedFF,\n    typename DerivedI>\n  IGL_INLINE void sort_triangles(\n    const Eigen::PlainObjectBase<DerivedV> & V,\n    const Eigen::PlainObjectBase<DerivedF> & F,\n    const Eigen::PlainObjectBase<DerivedMV> & MV,\n    const Eigen::PlainObjectBase<DerivedP> & P,\n    Eigen::PlainObjectBase<DerivedFF> & FF,\n    Eigen::PlainObjectBase<DerivedI> & I);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"sort_triangles.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/sort_vectors_ccw.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include <igl/sort_vectors_ccw.h>\n#include <igl/sort.h>\n#include <Eigen/Dense>\n\ntemplate <typename DerivedS, typename DerivedI>\nIGL_INLINE void igl::sort_vectors_ccw(\n  const Eigen::PlainObjectBase<DerivedS>& P,\n  const Eigen::PlainObjectBase<DerivedS>& N,\n  Eigen::PlainObjectBase<DerivedI> &order)\n{\n  int half_degree = P.cols()/3;\n  //local frame\n  Eigen::Matrix<typename DerivedS::Scalar,1,3> e1 = P.head(3).normalized();\n  Eigen::Matrix<typename DerivedS::Scalar,1,3> e3 = N.normalized();\n  Eigen::Matrix<typename DerivedS::Scalar,1,3> e2 = e3.cross(e1);\n\n  Eigen::Matrix<typename DerivedS::Scalar,3,3> F; F<<e1.transpose(),e2.transpose(),e3.transpose();\n\n  Eigen::Matrix<typename DerivedS::Scalar,Eigen::Dynamic,1> angles(half_degree,1);\n  for (int i=0; i<half_degree; ++i)\n  {\n    Eigen::Matrix<typename DerivedS::Scalar,1,3> Pl = F.colPivHouseholderQr().solve(P.segment(i*3,3).transpose()).transpose();\n//    assert(fabs(Pl(2))/Pl.cwiseAbs().maxCoeff() <1e-5);\n    angles[i] = atan2(Pl(1),Pl(0));\n  }\n\n  igl::sort( angles, 1, true, angles, order);\n  //make sure that the first element is always  at the top\n  while (order[0] != 0)\n  {\n    //do a circshift\n    int temp = order[0];\n    for (int i =0; i< half_degree-1; ++i)\n      order[i] = order[i+1];\n    order(half_degree-1) = temp;\n  }\n}\n\ntemplate <typename DerivedS, typename DerivedI>\nIGL_INLINE void igl::sort_vectors_ccw(\n  const Eigen::PlainObjectBase<DerivedS>& P,\n  const Eigen::PlainObjectBase<DerivedS>& N,\n  Eigen::PlainObjectBase<DerivedI> &order,\n  Eigen::PlainObjectBase<DerivedS> &sorted)\n  {\n  int half_degree = P.cols()/3;\n  igl::sort_vectors_ccw(P,N,order);\n    sorted.resize(1,half_degree*3);\n    for (int i=0; i<half_degree; ++i)\n      sorted.segment(i*3,3) = P.segment(order[i]*3,3);\n  }\n\ntemplate <typename DerivedS, typename DerivedI>\nIGL_INLINE void igl::sort_vectors_ccw(\n  const Eigen::PlainObjectBase<DerivedS>& P,\n  const Eigen::PlainObjectBase<DerivedS>& N,\n  Eigen::PlainObjectBase<DerivedI> &order,\n  Eigen::PlainObjectBase<DerivedI> &inv_order)\n  {\n  int half_degree = P.cols()/3;\n  igl::sort_vectors_ccw(P,N,order);\n    inv_order.resize(half_degree,1);\n    for (int i=0; i<half_degree; ++i)\n    {\n      for (int j=0; j<half_degree; ++j)\n        if (order[j] ==i)\n        {\n          inv_order(i) = j;\n          break;\n        }\n    }\n    assert(inv_order[0] == 0);\n  }\n\ntemplate <typename DerivedS, typename DerivedI>\nIGL_INLINE void igl::sort_vectors_ccw(\n  const Eigen::PlainObjectBase<DerivedS>& P,\n  const Eigen::PlainObjectBase<DerivedS>& N,\n  Eigen::PlainObjectBase<DerivedI> &order,\n  Eigen::PlainObjectBase<DerivedS> &sorted,\n  Eigen::PlainObjectBase<DerivedI> &inv_order)\n{\n  int half_degree = P.cols()/3;\n\n  igl::sort_vectors_ccw(P,N,order,inv_order);\n\n  sorted.resize(1,half_degree*3);\n  for (int i=0; i<half_degree; ++i)\n    sorted.segment(i*3,3) = P.segment(order[i]*3,3);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::sort_vectors_ccw<Eigen::Matrix<double, 1, -1, 1, 1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 1, -1, 1, 1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, -1, 1, 1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::sort_vectors_ccw<Eigen::Matrix<double, 1, -1, 1, 1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 1, -1, 1, 1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, -1, 1, 1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, -1, 1, 1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/sort_vectors_ccw.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2015 Olga Diamanti <olga.diam@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_SORT_VECTORS_CCW\n#define IGL_SORT_VECTORS_CCW\n#include \"igl_inline.h\"\n\n#include <Eigen/Core>\n\nnamespace igl {\n  // Sorts a set of N coplanar vectors in a ccw order, and returns their order.\n  // Optionally it also returns a copy of the ordered vector set, or the indices,\n  // in the original unordered set, of the vectors in the ordered set (called here\n  // the \"inverse\" set of indices).\n  \n  // Inputs:\n  //   P               1 by 3N row vector of the vectors to be sorted, stacked horizontally\n  //   N               #1 by 3 normal of the plane where the vectors lie\n  // Output:\n  //   order           N by 1 order of the vectors (indices of the unordered vectors into\n  //                   the ordered vector set)\n  //   sorted          1 by 3N row vector of the ordered vectors, stacked horizontally\n  //   inv_order       N by 1 \"inverse\" order of the vectors (the indices of the ordered\n  //                   vectors into the unordered vector set)\n  //\n  template <typename DerivedS, typename DerivedI>\n  IGL_INLINE void sort_vectors_ccw(\n                                   const Eigen::PlainObjectBase<DerivedS>& P,\n                                   const Eigen::PlainObjectBase<DerivedS>& N,\n                                   Eigen::PlainObjectBase<DerivedI> &order,\n                                   Eigen::PlainObjectBase<DerivedS> &sorted,\n                                   Eigen::PlainObjectBase<DerivedI> &inv_order);\n\n   template <typename DerivedS, typename DerivedI>\n   IGL_INLINE void sort_vectors_ccw(\n                                    const Eigen::PlainObjectBase<DerivedS>& P,\n                                    const Eigen::PlainObjectBase<DerivedS>& N,\n                                    Eigen::PlainObjectBase<DerivedI> &order,\n                                    Eigen::PlainObjectBase<DerivedS> &sorted);\n\n    template <typename DerivedS, typename DerivedI>\n    IGL_INLINE void sort_vectors_ccw(\n                                     const Eigen::PlainObjectBase<DerivedS>& P,\n                                     const Eigen::PlainObjectBase<DerivedS>& N,\n                                     Eigen::PlainObjectBase<DerivedI> &order,\n                                     Eigen::PlainObjectBase<DerivedI> &inv_order);\n\n\n     template <typename DerivedS, typename DerivedI>\n     IGL_INLINE void sort_vectors_ccw(\n                                      const Eigen::PlainObjectBase<DerivedS>& P,\n                                      const Eigen::PlainObjectBase<DerivedS>& N,\n                                      Eigen::PlainObjectBase<DerivedI> &order);\n\n};\n\n\n#ifndef IGL_STATIC_LIBRARY\n#include \"sort_vectors_ccw.cpp\"\n#endif\n\n\n#endif /* defined(IGL_FIELD_LOCAL_GLOBAL_CONVERSIONS) */\n"
  },
  {
    "path": "libs/libigl/include/igl/sortrows.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"sortrows.h\"\n#include \"get_seconds.h\"\n\n#include \"SortableRow.h\"\n#include \"sort.h\"\n#include \"colon.h\"\n#include \"IndexComparison.h\"\n\n#include <vector>\n\n// Obsolete slower version converst to vector\n//template <typename DerivedX, typename DerivedIX>\n//IGL_INLINE void igl::sortrows(\n//  const Eigen::DenseBase<DerivedX>& X,\n//  const bool ascending,\n//  Eigen::PlainObjectBase<DerivedX>& Y,\n//  Eigen::PlainObjectBase<DerivedIX>& IX)\n//{\n//  using namespace std;\n//  using namespace Eigen;\n//  typedef Eigen::Matrix<typename DerivedX::Scalar, Eigen::Dynamic, 1> RowVector;\n//  vector<SortableRow<RowVector> > rows;\n//  rows.resize(X.rows());\n//  // Loop over rows\n//  for(int i = 0;i<X.rows();i++)\n//  {\n//    RowVector ri = X.row(i);\n//    rows[i] = SortableRow<RowVector>(ri);\n//  }\n//  vector<SortableRow<RowVector> > sorted;\n//  std::vector<size_t> index_map;\n//  // Perform sort on rows\n//  igl::sort(rows,ascending,sorted,index_map);\n//  // Resize output\n//  Y.resizeLike(X);\n//  IX.resize(X.rows(),1);\n//  // Convert to eigen\n//  for(int i = 0;i<X.rows();i++)\n//  {\n//    Y.row(i) = sorted[i].data;\n//    IX(i,0) = index_map[i];\n//  }\n//}\n\ntemplate <typename DerivedX, typename DerivedIX>\nIGL_INLINE void igl::sortrows(\n  const Eigen::DenseBase<DerivedX>& X,\n  const bool ascending,\n  Eigen::PlainObjectBase<DerivedX>& Y,\n  Eigen::PlainObjectBase<DerivedIX>& IX)\n{\n  // This is already 2x faster than matlab's builtin `sortrows`. I have tried\n  // implementing a \"multiple-pass\" sort on each column, but see no performance\n  // improvement.\n  using namespace std;\n  using namespace Eigen;\n  // Resize output\n  const size_t num_rows = X.rows();\n  const size_t num_cols = X.cols();\n  Y.resize(num_rows,num_cols);\n  IX.resize(num_rows,1);\n  for(int i = 0;i<num_rows;i++)\n  {\n    IX(i) = i;\n  }\n  if (ascending) {\n    auto index_less_than = [&X, num_cols](size_t i, size_t j) {\n      for (size_t c=0; c<num_cols; c++) {\n        if (X.coeff(i, c) < X.coeff(j, c)) return true;\n        else if (X.coeff(j,c) < X.coeff(i,c)) return false;\n      }\n      return false;\n    };\n      std::sort(\n        IX.data(),\n        IX.data()+IX.size(),\n        index_less_than\n        );\n  } else {\n    auto index_greater_than = [&X, num_cols](size_t i, size_t j) {\n      for (size_t c=0; c<num_cols; c++) {\n        if (X.coeff(i, c) > X.coeff(j, c)) return true;\n        else if (X.coeff(j,c) > X.coeff(i,c)) return false;\n      }\n      return false;\n    };\n      std::sort(\n        IX.data(),\n        IX.data()+IX.size(),\n        index_greater_than\n        );\n  }\n  for (size_t j=0; j<num_cols; j++) {\n      for(int i = 0;i<num_rows;i++)\n      {\n          Y(i,j) = X(IX(i), j);\n      }\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::sortrows<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::sortrows<Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<long, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&);\ntemplate void igl::sortrows<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::sortrows<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::sortrows<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::sortrows<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::sortrows<Eigen::Matrix<double, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::sortrows<Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::sortrows<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/sortrows.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_SORTROWS_H\n#define IGL_SORTROWS_H\n#include \"igl_inline.h\"\n\n#include <vector>\n#include <Eigen/Core>\nnamespace igl\n{\n  // Act like matlab's [Y,I] = sortrows(X)\n  //\n  // Templates:\n  //   DerivedX derived scalar type, e.g. MatrixXi or MatrixXd\n  //   DerivedI derived integer type, e.g. MatrixXi\n  // Inputs:\n  //   X  m by n matrix whose entries are to be sorted\n  //   ascending  sort ascending (true, matlab default) or descending (false)\n  // Outputs:\n  //   Y  m by n matrix whose entries are sorted (**should not** be same\n  //     reference as X)\n  //   I  m list of indices so that\n  //     Y = X(I,:);\n  template <typename DerivedX, typename DerivedI>\n  IGL_INLINE void sortrows(\n    const Eigen::DenseBase<DerivedX>& X,\n    const bool ascending,\n    Eigen::PlainObjectBase<DerivedX>& Y,\n    Eigen::PlainObjectBase<DerivedI>& I);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"sortrows.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/sparse.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"sparse.h\"\n\n#include <iostream>\n#include <vector>\n\ntemplate <class IndexVector, class ValueVector, typename T>\nIGL_INLINE void igl::sparse(\n  const IndexVector & I,\n  const IndexVector & J,\n  const ValueVector & V,\n  Eigen::SparseMatrix<T>& X)\n{\n  size_t m = (size_t)I.maxCoeff()+1;\n  size_t n = (size_t)J.maxCoeff()+1;\n  return igl::sparse(I,J,V,m,n,X);\n}\n\n#include \"verbose.h\"\ntemplate <\n  class IndexVectorI, \n  class IndexVectorJ, \n  class ValueVector, \n  typename T>\nIGL_INLINE void igl::sparse(\n  const IndexVectorI & I,\n  const IndexVectorJ & J,\n  const ValueVector & V,\n  const size_t m,\n  const size_t n,\n  Eigen::SparseMatrix<T>& X)\n{\n  using namespace std;\n  using namespace Eigen;\n  assert((int)I.maxCoeff() < (int)m);\n  assert((int)I.minCoeff() >= 0);\n  assert((int)J.maxCoeff() < (int)n);\n  assert((int)J.minCoeff() >= 0);\n  assert(I.size() == J.size());\n  assert(J.size() == V.size());\n  // Really we just need .size() to be the same, but this is safer\n  assert(I.rows() == J.rows());\n  assert(J.rows() == V.rows());\n  assert(I.cols() == J.cols());\n  assert(J.cols() == V.cols());\n  //// number of values\n  //int nv = V.size();\n\n  //Eigen::DynamicSparseMatrix<T, Eigen::RowMajor> dyn_X(m,n);\n  //// over estimate the number of entries\n  //dyn_X.reserve(I.size());\n  //for(int i = 0;i < nv;i++)\n  //{\n  //  dyn_X.coeffRef((int)I(i),(int)J(i)) += (T)V(i);\n  //}\n  //X = Eigen::SparseMatrix<T>(dyn_X);\n  vector<Triplet<T> > IJV;\n  IJV.reserve(I.size());\n  for(int x = 0;x<I.size();x++)\n  {\n    IJV.push_back(Triplet<T >(I(x),J(x),V(x)));\n  }\n  X.resize(m,n);\n  X.setFromTriplets(IJV.begin(),IJV.end());\n}\n\ntemplate <typename DerivedD, typename T>\nIGL_INLINE void igl::sparse(\n  const Eigen::PlainObjectBase<DerivedD>& D,\n  Eigen::SparseMatrix<T>& X)\n{\n  assert(false && \"Obsolete. Just call D.sparseView() directly\");\n  using namespace std;\n  using namespace Eigen;\n  vector<Triplet<T> > DIJV;\n  const int m = D.rows();\n  const int n = D.cols();\n  for(int i = 0;i<m;i++)\n  {\n    for(int j = 0;j<n;j++)\n    {\n      if(D(i,j)!=0)\n      {\n        DIJV.push_back(Triplet<T>(i,j,D(i,j)));\n      }\n    }\n  }\n  X.resize(m,n);\n  X.setFromTriplets(DIJV.begin(),DIJV.end());\n}\n\ntemplate <typename DerivedD>\nIGL_INLINE Eigen::SparseMatrix<typename DerivedD::Scalar > igl::sparse(\n  const Eigen::PlainObjectBase<DerivedD>& D)\n{\n  assert(false && \"Obsolete. Just call D.sparseView() directly\");\n  Eigen::SparseMatrix<typename DerivedD::Scalar > X;\n  igl::sparse(D,X);\n  return X;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::sparse<Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<bool>, Eigen::Array<bool, -1, 2, 0, -1, 2> >, bool>(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<bool>, Eigen::Array<bool, -1, 2, 0, -1, 2> > const&, unsigned long, unsigned long, Eigen::SparseMatrix<bool, 0, int>&);\n// generated by autoexplicit.sh\ntemplate void igl::sparse<Eigen::CwiseNullaryOp<Eigen::internal::linspaced_op<int, true>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<bool>, Eigen::Array<bool, -1, 1, 0, -1, 1> >, bool>(Eigen::CwiseNullaryOp<Eigen::internal::linspaced_op<int, true>, Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<bool>, Eigen::Array<bool, -1, 1, 0, -1, 1> > const&, unsigned long, unsigned long, Eigen::SparseMatrix<bool, 0, int>&);\n// generated by autoexplicit.sh\ntemplate void igl::sparse<Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<bool>, Eigen::Array<bool, -1, 3, 0, -1, 3> >, bool>(Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<bool>, Eigen::Array<bool, -1, 3, 0, -1, 3> > const&, unsigned long, unsigned long, Eigen::SparseMatrix<bool, 0, int>&);\ntemplate void igl::sparse<Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, std::complex<double> >(Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, Eigen::Matrix<double, -1, 1, 0, -1, 1> const&, size_t, size_t, Eigen::SparseMatrix<std::complex<double>, 0, int>&);\ntemplate void igl::sparse<Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, double>(Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, Eigen::Matrix<double, -1, 1, 0, -1, 1> const&, Eigen::SparseMatrix<double, 0, int>&);\ntemplate void igl::sparse<Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, double>(Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, Eigen::Matrix<double, -1, 1, 0, -1, 1> const&, size_t, size_t, Eigen::SparseMatrix<double, 0, int>&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/sparse.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_SPARSE_H\n#define IGL_SPARSE_H\n#include \"igl_inline.h\"\n#define EIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET\n#include <Eigen/Dense>\n#include <Eigen/Sparse>\nnamespace igl\n{\n  // Build a sparse matrix from list of indices and values (I,J,V), functions\n  // like the sparse function in matlab\n  //\n  // Templates:\n  //   IndexVector  list of indices, value should be non-negative and should\n  //     expect to be cast to an index. Must implement operator(i) to retrieve\n  //     ith element\n  //   ValueVector  list of values, value should be expect to be cast to type\n  //     T. Must implement operator(i) to retrieve ith element\n  //   T  should be a eigen sparse matrix primitive type like int or double\n  // Input:\n  //   I  nnz vector of row indices of non zeros entries in X\n  //   J  nnz vector of column indices of non zeros entries in X\n  //   V  nnz vector of non-zeros entries in X\n  //   Optional:\n  //     m  number of rows\n  //     n  number of cols\n  // Outputs:\n  //   X  m by n matrix of type T whose entries are to be found \n  //\n  template <class IndexVector, class ValueVector, typename T>\n  IGL_INLINE void sparse(\n    const IndexVector & I,\n    const IndexVector & J,\n    const ValueVector & V,\n    Eigen::SparseMatrix<T>& X);\n  template <\n    class IndexVectorI, \n    class IndexVectorJ, \n    class ValueVector, \n    typename T>\n  IGL_INLINE void sparse(\n    const IndexVectorI & I,\n    const IndexVectorJ & J,\n    const ValueVector & V,\n    const size_t m,\n    const size_t n,\n    Eigen::SparseMatrix<T>& X);\n  // THIS MAY BE SUPERSEDED BY EIGEN'S .sparseView Indeed it is.\n  // Convert a full, dense matrix to a sparse one\n  //\n  // Templates:\n  //   T  should be a eigen sparse matrix primitive type like int or double\n  // Input:\n  //   D  m by n full, dense matrix\n  // Output:\n  //   X  m by n sparse matrix\n  template <typename DerivedD, typename T>\n  IGL_INLINE void sparse(\n    const Eigen::PlainObjectBase<DerivedD>& D,\n    Eigen::SparseMatrix<T>& X);\n  // Wrapper with return\n  template <typename DerivedD>\n  IGL_INLINE Eigen::SparseMatrix<typename DerivedD::Scalar > sparse(\n    const Eigen::PlainObjectBase<DerivedD>& D);\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"sparse.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/speye.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"speye.h\"\n\ntemplate <typename T>\nIGL_INLINE void igl::speye(const int m, const int n, Eigen::SparseMatrix<T> & I)\n{\n  // size of diagonal\n  int d = (m<n?m:n);\n  I = Eigen::SparseMatrix<T>(m,n);\n  I.reserve(d);\n  for(int i = 0;i<d;i++)\n  {\n    I.insert(i,i) = 1.0;\n  }\n  I.finalize();\n}\n\ntemplate <typename T>\nIGL_INLINE void igl::speye(const int n, Eigen::SparseMatrix<T> & I)\n{\n  return igl::speye(n,n,I);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::speye<double>(int, Eigen::SparseMatrix<double, 0, int>&);\ntemplate void igl::speye<std::complex<double> >(int, int, Eigen::SparseMatrix<std::complex<double>, 0, int>&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/speye.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_SPEYE_H\n#define IGL_SPEYE_H\n#include \"igl_inline.h\"\n\n#define EIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET\n#include <Eigen/Sparse>\n\nnamespace igl\n{\n  // Builds an m by n sparse identity matrix like matlab's speye function\n  // Templates:\n  //   T  should be a eigen sparse matrix primitive type like int or double\n  // Inputs:\n  //   m  number of rows\n  //   n  number of cols\n  // Outputs:\n  //   I  m by n sparse matrix with 1's on the main diagonal\n  template <typename T>\n  IGL_INLINE void speye(const int n,const int m, Eigen::SparseMatrix<T> & I);\n  // Builds an n by n sparse identity matrix like matlab's speye function\n  // Templates:\n  //   T  should be a eigen sparse matrix primitive type like int or double\n  // Inputs:\n  //   n  number of rows and cols\n  // Outputs:\n  //   I  n by n sparse matrix with 1's on the main diagonal\n  template <typename T>\n  IGL_INLINE void speye(const int n, Eigen::SparseMatrix<T> & I);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"speye.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/squared_edge_lengths.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"squared_edge_lengths.h\"\n#include \"parallel_for.h\"\n#include <iostream>\n  \ntemplate <typename DerivedV, typename DerivedF, typename DerivedL>\nIGL_INLINE void igl::squared_edge_lengths(\n  const Eigen::MatrixBase<DerivedV>& V,\n  const Eigen::MatrixBase<DerivedF>& F,\n  Eigen::PlainObjectBase<DerivedL>& L)\n{\n  using namespace std;\n  const int m = F.rows();\n  switch(F.cols())\n  {\n    case 2:\n    {\n      L.resize(F.rows(),1);\n      for(int i = 0;i<F.rows();i++)\n      {\n        L(i,0) = (V.row(F(i,1))-V.row(F(i,0))).squaredNorm();\n      }\n      break;\n    }\n    case 3:\n    {\n      L.resize(m,3);\n      // loop over faces\n      parallel_for(\n        m,\n        [&V,&F,&L](const int i)\n        {\n          L(i,0) = (V.row(F(i,1))-V.row(F(i,2))).squaredNorm();\n          L(i,1) = (V.row(F(i,2))-V.row(F(i,0))).squaredNorm();\n          L(i,2) = (V.row(F(i,0))-V.row(F(i,1))).squaredNorm();\n        },\n        1000);\n      break;\n    }\n    case 4:\n    {\n      L.resize(m,6);\n      // loop over faces\n      parallel_for(\n        m,\n        [&V,&F,&L](const int i)\n        {\n          L(i,0) = (V.row(F(i,3))-V.row(F(i,0))).squaredNorm();\n          L(i,1) = (V.row(F(i,3))-V.row(F(i,1))).squaredNorm();\n          L(i,2) = (V.row(F(i,3))-V.row(F(i,2))).squaredNorm();\n          L(i,3) = (V.row(F(i,1))-V.row(F(i,2))).squaredNorm();\n          L(i,4) = (V.row(F(i,2))-V.row(F(i,0))).squaredNorm();\n          L(i,5) = (V.row(F(i,0))-V.row(F(i,1))).squaredNorm();\n        },\n        1000);\n      break;\n    }\n    default:\n    {\n      cerr<< \"squared_edge_lengths.h: Error: Simplex size (\"<<F.cols()<<\n        \") not supported\"<<endl;\n      assert(false);\n    }\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::squared_edge_lengths<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 6, 0, -1, 6> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 6, 0, -1, 6> >&);\n// generated by autoexplicit.sh\ntemplate void igl::squared_edge_lengths<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\ntemplate void igl::squared_edge_lengths<Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<unsigned int, -1, 3, 1, -1, 3>, Eigen::Matrix<float, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<unsigned int, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 0, -1, 3> >&);\ntemplate void igl::squared_edge_lengths<Eigen::Matrix<float, -1, 2, 0, -1, 2>, Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1>, Eigen::Matrix<float, -1, 2, 0, -1, 2> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 2, 0, -1, 2> > const&, Eigen::MatrixBase<Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 2, 0, -1, 2> >&);\ntemplate void igl::squared_edge_lengths<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\ntemplate void igl::squared_edge_lengths<Eigen::Matrix<double, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 2, 0, -1, 2> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> >&);\ntemplate void igl::squared_edge_lengths<Eigen::Matrix<double, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 2, 0, -1, 2> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> >&);\ntemplate void igl::squared_edge_lengths<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 6, 0, -1, 6> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 6, 0, -1, 6> >&);\ntemplate void igl::squared_edge_lengths<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\ntemplate void igl::squared_edge_lengths<Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1>, Eigen::Matrix<float, -1, 3, 1, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> >&);\ntemplate void igl::squared_edge_lengths<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::squared_edge_lengths<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 4, 0, -1, 4>, Eigen::Matrix<double, -1, 6, 0, -1, 6> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 4, 0, -1, 4> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 6, 0, -1, 6> >&);\ntemplate void igl::squared_edge_lengths<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::squared_edge_lengths<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\ntemplate void igl::squared_edge_lengths<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 3, 1, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> >&);\ntemplate void igl::squared_edge_lengths<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1>, Eigen::Matrix<double, -1, 3, 1, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> >&);\ntemplate void igl::squared_edge_lengths<Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<float, -1, 3, 1, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> >&);\ntemplate void igl::squared_edge_lengths<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 6, 0, -1, 6> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 6, 0, -1, 6> >&);\ntemplate void igl::squared_edge_lengths<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 4, 0, -1, 4>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 4, 0, -1, 4> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\ntemplate void igl::squared_edge_lengths<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\ntemplate void igl::squared_edge_lengths<Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<float, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 0, -1, 3> >&);\ntemplate void igl::squared_edge_lengths<Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1>, Eigen::Matrix<float, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 0, -1, 3> >&);\ntemplate void igl::squared_edge_lengths<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\ntemplate void igl::squared_edge_lengths<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 3, 1, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/squared_edge_lengths.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_SQUARED_EDGE_LENGTHS_H\n#define IGL_SQUARED_EDGE_LENGTHS_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Dense>\n\nnamespace igl\n{\n  // Constructs a list of squared lengths of edges opposite each index in a face\n  // (triangle/tet) list\n  //\n  // Templates:\n  //   DerivedV derived from vertex positions matrix type: i.e. MatrixXd\n  //   DerivedF derived from face indices matrix type: i.e. MatrixXi\n  //   DerivedL derived from edge lengths matrix type: i.e. MatrixXd\n  // Inputs:\n  //   V  eigen matrix #V by 3\n  //   F  #F by 2 list of mesh edges\n  //    or\n  //   F  #F by 3 list of mesh faces (must be triangles)\n  //    or\n  //   T  #T by 4 list of mesh elements (must be tets)\n  // Outputs:\n  //   L  #F by {1|3|6} list of edge lengths squared\n  //     for edges, column of lengths\n  //     for triangles, columns correspond to edges [1,2],[2,0],[0,1]\n  //     for tets, columns correspond to edges\n  //     [3 0],[3 1],[3 2],[1 2],[2 0],[0 1]\n  //\n  template <typename DerivedV, typename DerivedF, typename DerivedL>\n  IGL_INLINE void squared_edge_lengths(\n    const Eigen::MatrixBase<DerivedV>& V,\n    const Eigen::MatrixBase<DerivedF>& F,\n    Eigen::PlainObjectBase<DerivedL>& L);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"squared_edge_lengths.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/stdin_to_temp.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"stdin_to_temp.h\"\n\n#include <iostream>\n\nIGL_INLINE bool igl::stdin_to_temp(FILE ** temp_file)\n{\n  // get a temporary file\n  *temp_file = tmpfile();\n  if(*temp_file == NULL)\n  {\n    fprintf(stderr,\"IOError: temp file could not be created.\\n\");\n    return false;\n  }\n  char c;\n  // c++'s cin handles the stdind input in a reasonable way\n  while (std::cin.good())\n  {\n    c = std::cin.get();\n    if(std::cin.good())\n    {\n      if(1 != fwrite(&c,sizeof(char),1,*temp_file))\n      {\n        fprintf(stderr,\"IOError: error writing to tempfile.\\n\");\n        return false;\n      }\n    }\n  }\n  // rewind file getting it ready to read from\n  rewind(*temp_file);\n  return true;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/stdin_to_temp.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_STDIN_TO_TEMP_H\n#define IGL_STDIN_TO_TEMP_H\n#include \"igl_inline.h\"\n#include <cstdio>\nnamespace igl\n{\n  // Write stdin/piped input to a temporary file which can than be preprocessed as it\n  // is (a normal file). This is often useful if you want to process stdin/piped\n  // with library functions that expect to be able to fseek(), rewind() etc..\n  //\n  // If your application is not using fseek(), rewind(), etc. but just reading\n  // from stdin then this will likely cause a bottle neck as it defeats the whole\n  // purpose of piping.\n  //\n  // Outputs:\n  //   temp_file  pointer to temp file pointer, rewound to beginning of file so\n  //     its ready to be read\n  // Return true only if no errors were found\n  //\n  // Note: Caller is responsible for closing the file (tmpfile() automatically\n  // unlinks the file so there is no need to remove/delete/unlink the file)\n  IGL_INLINE bool stdin_to_temp(FILE ** temp_file);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"stdin_to_temp.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/straighten_seams.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2017 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"straighten_seams.h\"\n#include \"LinSpaced.h\"\n#include \"on_boundary.h\"\n#include \"sparse.h\"\n#include \"max.h\"\n#include \"count.h\"\n#include \"any.h\"\n#include \"slice_mask.h\"\n#include \"slice_into.h\"\n#include \"unique_simplices.h\"\n#include \"adjacency_matrix.h\"\n#include \"setxor.h\"\n#include \"edges_to_path.h\"\n#include \"ramer_douglas_peucker.h\"\n#include \"components.h\"\n#include \"list_to_matrix.h\"\n#include \"ears.h\"\n#include \"slice.h\"\n#include \"sum.h\"\n#include \"find.h\"\n#include <iostream>\n\ntemplate <\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedVT,\n  typename DerivedFT,\n  typename Scalar,\n  typename DerivedUE,\n  typename DerivedUT,\n  typename DerivedOT>\nIGL_INLINE void igl::straighten_seams(\n  const Eigen::MatrixBase<DerivedV> & V,\n  const Eigen::MatrixBase<DerivedF> & F,\n  const Eigen::MatrixBase<DerivedVT> & VT,\n  const Eigen::MatrixBase<DerivedFT> & FT,\n  const Scalar tol,\n  Eigen::PlainObjectBase<DerivedUE> & UE,\n  Eigen::PlainObjectBase<DerivedUT> & UT,\n  Eigen::PlainObjectBase<DerivedOT> & OT)\n{\n  using namespace Eigen;\n  // number of faces\n  assert(FT.rows() == F.rows() && \"#FT must == #F\");\n  assert(F.cols() == 3 && \"F should contain triangles\");\n  assert(FT.cols() == 3 && \"FT should contain triangles\");\n  const int m = F.rows();\n  // Boundary edges of the texture map and 3d meshes\n  Array<bool,Dynamic,1> _;\n  Array<bool,Dynamic,3> BT,BF;\n  on_boundary(FT,_,BT);\n  on_boundary(F,_,BF);\n  assert((!((BF && (BT!=true)).any())) && \n    \"Not dealing with boundaries of mesh that get 'stitched' in texture mesh\");\n  typedef Matrix<typename DerivedF::Scalar,Dynamic,2> MatrixX2I; \n  const MatrixX2I ET = (MatrixX2I(FT.rows()*3,2)\n    <<FT.col(1),FT.col(2),FT.col(2),FT.col(0),FT.col(0),FT.col(1)).finished();\n  // \"half\"-edges with indices into 3D-mesh\n  const MatrixX2I EF = (MatrixX2I(F.rows()*3,2)\n    <<F.col(1),F.col(2),F.col(2),F.col(0),F.col(0),F.col(1)).finished();\n  // Find unique (undirected) edges in F\n  VectorXi EFMAP;\n  {\n    MatrixX2I _1;\n    VectorXi _2;\n    unique_simplices(EF,_1,_2,EFMAP);\n  }\n  Array<bool,Dynamic,1>vBT = Map<Array<bool,Dynamic,1> >(BT.data(),BT.size(),1);\n  Array<bool,Dynamic,1>vBF = Map<Array<bool,Dynamic,1> >(BF.data(),BF.size(),1);\n  MatrixX2I OF;\n  slice_mask(ET,vBT,1,OT);\n  slice_mask(EF,vBT,1,OF);\n  VectorXi OFMAP;\n  slice_mask(EFMAP,vBT,1,OFMAP);\n  // Two boundary edges on the texture-mapping are \"equivalent\" to each other on\n  // the 3D-mesh if their 3D-mesh vertex indices match\n  SparseMatrix<bool> OEQ;\n  {\n    SparseMatrix<bool> OEQR;\n    sparse(\n      igl::LinSpaced<VectorXi >(OT.rows(),0,OT.rows()-1),\n      OFMAP,\n      Array<bool,Dynamic,1>::Ones(OT.rows(),1),\n      OT.rows(),\n      m*3,\n      OEQR);\n    OEQ = OEQR * OEQR.transpose();\n    // Remove diagonal\n    OEQ.prune([](const int r, const int c, const bool)->bool{return r!=c;});\n  }\n  // For each edge in OT, for each endpoint, how many _other_ texture-vertices\n  // are images of all the 3d-mesh vertices in F who map from \"corners\" in F/FT\n  // mapping to this endpoint.\n  //\n  // Adjacency matrix between 3d-vertices and texture-vertices\n  SparseMatrix<bool> V2VT;\n  sparse(\n    F,\n    FT,\n    Array<bool,Dynamic,3>::Ones(F.rows(),F.cols()), \n    V.rows(),\n    VT.rows(),\n    V2VT);\n  // For each 3d-vertex count how many different texture-coordinates its getting\n  // from different incident corners\n  VectorXi DV;\n  count(V2VT,2,DV);\n  VectorXi M,I;\n  max(V2VT,1,M,I);\n  assert( (M.array() == 1).all() );\n  VectorXi DT;\n  // Map counts onto texture-vertices\n  slice(DV,I,1,DT);\n  // Boundary in 3D && UV\n  Array<bool,Dynamic,1> BTF;\n  slice_mask(vBF, vBT, 1, BTF);\n  // Texture-vertex is \"sharp\" if incident on \"half-\"edge that is not a\n  // boundary in the 3D mesh but is a boundary in the texture-mesh AND is not\n  // \"cut cleanly\" (the vertex is mapped to exactly 2 locations)\n  Array<bool,Dynamic,1> SV = Array<bool,Dynamic,1>::Zero(VT.rows(),1);\n  //std::cout<<\"#SV: \"<<SV.count()<<std::endl;\n  assert(BTF.size() == OT.rows());\n  for(int h = 0;h<BTF.size();h++)\n  {\n    if(!BTF(h))\n    {\n      SV(OT(h,0)) = true;\n      SV(OT(h,1)) = true;\n    }\n  }\n  //std::cout<<\"#SV: \"<<SV.count()<<std::endl;\n  Array<bool,Dynamic,1> CL = DT.array()==2;\n  SparseMatrix<bool> VTOT;\n  {\n    Eigen::MatrixXi I = \n      igl::LinSpaced<VectorXi >(OT.rows(),0,OT.rows()-1).replicate(1,2);\n    sparse(\n      OT,\n      I,\n      Array<bool,Dynamic,2>::Ones(OT.rows(),OT.cols()),\n      VT.rows(),\n      OT.rows(),\n      VTOT);\n    Array<int,Dynamic,1> cuts;\n    count( (VTOT*OEQ).eval(), 2, cuts);\n    CL = (CL && (cuts.array() == 2)).eval();\n  }\n  //std::cout<<\"#CL: \"<<CL.count()<<std::endl;\n  assert(CL.size() == SV.size());\n  for(int c = 0;c<CL.size();c++) if(CL(c)) SV(c) = false;\n  {}\n  //std::cout<<\"#SV: \"<<SV.count()<<std::endl;\n\n  {\n    // vertices at the corner of ears are declared to be sharp. This is\n    // conservative: for example, if the ear is strictly convex and stays\n    // strictly convex then the ear won't be flipped.\n    VectorXi ear,ear_opp;\n    ears(FT,ear,ear_opp);\n    //std::cout<<\"#ear: \"<<ear.size()<<std::endl;\n    // There might be an ear on one copy, so mark vertices on other copies, too\n    // ears as they live on the 3D mesh\n    Array<bool,Dynamic,1> earT = Array<bool,Dynamic,1>::Zero(VT.rows(),1);\n    for(int e = 0;e<ear.size();e++) earT(FT(ear(e),ear_opp(e))) = 1;\n    //std::cout<<\"#earT: \"<<earT.count()<<std::endl;\n    // Even if ear-vertices are marked as sharp if it changes, e.g., from\n    // convex to concave then it will _force_ a flip of the ear triangle. So,\n    // declare that neighbors of ears are also sharp.\n    SparseMatrix<bool> A;\n    adjacency_matrix(FT,A);\n    earT = (earT || (A*earT.matrix()).array()).eval();\n    //std::cout<<\"#earT: \"<<earT.count()<<std::endl;\n    assert(earT.size() == SV.size());\n    for(int e = 0;e<earT.size();e++) if(earT(e)) SV(e) = true;\n    //std::cout<<\"#SV: \"<<SV.count()<<std::endl;\n  }\n\n  {\n    SparseMatrix<bool> V2VTSV,V2VTC;\n    slice_mask(V2VT,SV,2,V2VTSV);\n    Array<bool,Dynamic,1> Cb;\n    any(V2VTSV,2,Cb);\n    slice_mask(V2VT,Cb,1,V2VTC);\n    any(V2VTC,1,SV);\n  }\n  //std::cout<<\"#SV: \"<<SV.count()<<std::endl;\n\n  SparseMatrix<bool> OTVT = VTOT.transpose();\n  int nc;\n  ArrayXi C;\n  {\n    // Doesn't Compile on older Eigen:\n    //SparseMatrix<bool> A = OTVT * (!SV).matrix().asDiagonal() * VTOT;\n    SparseMatrix<bool> A = OTVT * (SV!=true).matrix().asDiagonal() * VTOT;\n    components(A,C);\n    nc = C.maxCoeff()+1;\n  }\n  //std::cout<<\"nc: \"<<nc<<std::endl;\n  // New texture-vertex locations\n  UT = VT;\n  // Indices into UT of coarse output polygon edges\n  std::vector<std::vector<typename DerivedUE::Scalar> > vUE;\n  // loop over each component\n  std::vector<bool> done(nc,false);\n  for(int c = 0;c<nc;c++)\n  {\n    if(done[c])\n    {\n      continue;\n    }\n    done[c] = true;\n    // edges of this component\n    Eigen::VectorXi Ic;\n    find(C==c,Ic);\n    if(Ic.size() == 0)\n    {\n      continue;\n    }\n    SparseMatrix<bool> OEQIc;\n    slice(OEQ,Ic,1,OEQIc);\n    Eigen::VectorXi N;\n    sum(OEQIc,2,N);\n    const int ncopies = N(0)+1;\n    assert((N.array() == ncopies-1).all());\n    assert((ncopies == 1 || ncopies == 2) && \n      \"Not dealing with non-manifold meshes\");\n    Eigen::VectorXi vpath,epath,eend;\n    typedef Eigen::Matrix<Scalar,Eigen::Dynamic,2> MatrixX2S;\n    switch(ncopies)\n    {\n      case 1:\n        {\n          MatrixX2I OTIc;\n          slice(OT,Ic,1,OTIc);\n          edges_to_path(OTIc,vpath,epath,eend);\n          Array<bool,Dynamic,1> SVvpath;\n          slice(SV,vpath,1,SVvpath);\n          assert(\n            (vpath(0) != vpath(vpath.size()-1) || !SVvpath.any()) && \n            \"Not dealing with 1-loops touching 'sharp' corners\");\n          // simple open boundary\n          MatrixX2S PI;\n          slice(VT,vpath,1,PI);\n          const Scalar bbd = \n            (PI.colwise().maxCoeff() - PI.colwise().minCoeff()).norm();\n          // Do not collapse boundaries to fewer than 3 vertices\n          const bool allow_boundary_collapse = false;\n          assert(PI.size() >= 2);\n          const bool is_closed = PI(0) == PI(PI.size()-1);\n          assert(!is_closed ||  vpath.size() >= 4);\n          Scalar eff_tol = std::min(tol,2.);\n          VectorXi UIc;\n          while(true)\n          {\n            MatrixX2S UPI,UTvpath;\n            ramer_douglas_peucker(PI,eff_tol*bbd,UPI,UIc,UTvpath);\n            slice_into(UTvpath,vpath,1,UT);\n            if(!is_closed || allow_boundary_collapse)\n            {\n              break;\n            }\n            if(UPI.rows()>=4)\n            {\n              break;\n            }\n            eff_tol = eff_tol*0.5;\n          }\n          for(int i = 0;i<UIc.size()-1;i++)\n          {\n            vUE.push_back({vpath(UIc(i)),vpath(UIc(i+1))});\n          }\n        }\n        break;\n      case 2:\n        {\n          // Find copies\n          VectorXi Icc;\n          {\n            VectorXi II;\n            Array<bool,Dynamic,1> IV;\n            SparseMatrix<bool> OEQIcT = OEQIc.transpose().eval();\n            find(OEQIcT,Icc,II,IV);\n            assert(II.size() == Ic.size() && \n              (II.array() ==\n              igl::LinSpaced<VectorXi >(Ic.size(),0,Ic.size()-1).array()).all());\n            assert(Icc.size() == Ic.size());\n            const int cc = C(Icc(0));\n            Eigen::VectorXi CIcc;\n            slice(C,Icc,1,CIcc);\n            assert((CIcc.array() == cc).all());\n            assert(!done[cc]);\n            done[cc] = true;\n          }\n          Array<bool,Dynamic,1> flipped;\n          {\n            MatrixX2I OFIc,OFIcc;\n            slice(OF,Ic,1,OFIc);\n            slice(OF,Icc,1,OFIcc);\n            Eigen::VectorXi XOR,IA,IB;\n            setxor(OFIc,OFIcc,XOR,IA,IB);\n            assert(XOR.size() == 0);\n            flipped = OFIc.array().col(0) != OFIcc.array().col(0);\n          }\n          if(Ic.size() == 1)\n          {\n            // No change to UT\n            vUE.push_back({OT(Ic(0),0),OT(Ic(0),1)});\n            assert(Icc.size() == 1);\n            vUE.push_back({OT(Icc(0),flipped(0)?1:0),OT(Icc(0),flipped(0)?0:1)});\n          }else\n          {\n            MatrixX2I OTIc;\n            slice(OT,Ic,1,OTIc);\n            edges_to_path(OTIc,vpath,epath,eend);\n            // Flip endpoints if needed\n            for(int e = 0;e<eend.size();e++)if(flipped(e))eend(e)=1-eend(e);\n            VectorXi vpathc(epath.size()+1);\n            for(int e = 0;e<epath.size();e++)\n            {\n              vpathc(e) = OT(Icc(epath(e)),eend(e));\n            }\n            vpathc(epath.size()) =\n              OT(Icc(epath(epath.size()-1)),1-eend(eend.size()-1));\n            assert(vpath.size() == vpathc.size());\n            Matrix<Scalar,Dynamic,Dynamic> PI(vpath.size(),VT.cols()*2);\n            for(int p = 0;p<PI.rows();p++)\n            {\n              for(int d = 0;d<VT.cols();d++)\n              {\n                PI(p,          d) = VT( vpath(p),d);\n                PI(p,VT.cols()+d) = VT(vpathc(p),d);\n              }\n            }\n            const Scalar bbd = \n              (PI.colwise().maxCoeff() - PI.colwise().minCoeff()).norm();\n            Matrix<Scalar,Dynamic,Dynamic> UPI,SI;\n            VectorXi UIc;\n            ramer_douglas_peucker(PI,tol*bbd,UPI,UIc,SI);\n            slice_into(SI.leftCols (VT.cols()), vpath,1,UT);\n            slice_into(SI.rightCols(VT.cols()),vpathc,1,UT);\n            for(int i = 0;i<UIc.size()-1;i++)\n            {\n              vUE.push_back({vpath(UIc(i)),vpath(UIc(i+1))});\n            }\n            for(int i = 0;i<UIc.size()-1;i++)\n            {\n              vUE.push_back({vpathc(UIc(i)),vpathc(UIc(i+1))});\n            }\n          }\n        }\n        break;\n      default:\n        assert(false && \"Should never reach here\");\n    }\n  }\n  list_to_matrix(vUE,UE);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::straighten_seams<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, double, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, double, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/straighten_seams.h",
    "content": "#ifndef IGL_STRAIGHTEN_SEAMS_H\n#define IGL_STRAIGHTEN_SEAMS_H\n\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n\nnamespace igl\n{\n  // STRAIGHTEN_SEAMS Given a obj-style mesh with (V,F) defining the geometric\n  // surface of the mesh and (VT,FT) defining the\n  // parameterization/texture-mapping of the mesh in the uv-domain, find all\n  // seams and boundaries in the texture-mapping and \"straighten\" them,\n  // remapping vertices along the boundary and in the interior. This will be\n  // careful to consistently straighten multiple seams in the texture-mesh\n  // corresponding to the same edge chains in the surface-mesh. \n  //\n  // [UT] = straighten_seams(V,F,VT,FT)\n  //\n  // Inputs:\n  //  V  #V by 3 list of vertices\n  //  F  #F by 3 list of triangle indices\n  //  VT  #VT by 2 list of texture coordinates\n  //  FT  #F by 3 list of triangle texture coordinates\n  //  Optional:\n  //    'Tol'  followed by Ramer-Douglas-Peucker tolerance as a fraction of the\n  //      curves bounding box diagonal (see dpsimplify)\n  // Outputs:\n  //   UE  #UE by 2 list of indices into VT of coarse output polygon edges\n  //   UT  #VT by 3 list of new texture coordinates\n  //   OT  #OT by 2 list of indices into VT of boundary edges \n  //\n  // See also: simplify_curve, dpsimplify\n  template <\n    typename DerivedV,\n    typename DerivedF,\n    typename DerivedVT,\n    typename DerivedFT,\n    typename Scalar,\n    typename DerivedUE,\n    typename DerivedUT,\n    typename DerivedOT>\n  IGL_INLINE void straighten_seams(\n    const Eigen::MatrixBase<DerivedV> & V,\n    const Eigen::MatrixBase<DerivedF> & F,\n    const Eigen::MatrixBase<DerivedVT> & VT,\n    const Eigen::MatrixBase<DerivedFT> & FT,\n    const Scalar tol,\n    Eigen::PlainObjectBase<DerivedUE> & UE,\n    Eigen::PlainObjectBase<DerivedUT> & UT,\n    Eigen::PlainObjectBase<DerivedOT> & OT);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"straighten_seams.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/streamlines.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2016 Francisca Gil Ureta <gilureta@cs.nyu.edu>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"edge_topology.h\"\n#include \"sort_vectors_ccw.h\"\n#include \"streamlines.h\"\n#include \"per_face_normals.h\"\n#include \"polyvector_field_matchings.h\"\n#include \"segment_segment_intersect.h\"\n#include \"triangle_triangle_adjacency.h\"\n#include \"barycenter.h\"\n#include \"slice.h\"\n\n#include <Eigen/Geometry>\n\n\n\nIGL_INLINE void igl::streamlines_init(\n                                      const Eigen::MatrixXd V,\n                                      const Eigen::MatrixXi F,\n                                      const Eigen::MatrixXd &temp_field,\n                                      const bool treat_as_symmetric,\n                                      StreamlineData &data,\n                                      StreamlineState &state,\n                                      double percentage\n                                      ){\n  using namespace Eigen;\n  using namespace std;\n  \n  igl::edge_topology(V, F, data.E, data.F2E, data.E2F);\n  igl::triangle_triangle_adjacency(F, data.TT);\n  \n  // prepare vector field\n  // --------------------------\n  int half_degree = temp_field.cols() / 3;\n  int degree = treat_as_symmetric ? half_degree * 2 : half_degree;\n  data.degree = degree;\n  \n  Eigen::MatrixXd FN;\n  Eigen::VectorXi order;\n  Eigen::RowVectorXd sorted;\n  \n  igl::per_face_normals(V, F, FN);\n  data.field.setZero(F.rows(), degree * 3);\n  for (unsigned i = 0; i < F.rows(); ++i){\n    const Eigen::RowVectorXd &n = FN.row(i);\n    Eigen::RowVectorXd temp(1, degree * 3);\n    if (treat_as_symmetric)\n      temp << temp_field.row(i), -temp_field.row(i);\n    else\n      temp = temp_field.row(i);\n    igl::sort_vectors_ccw(temp, n, order, sorted);\n    \n    // project vectors to tangent plane\n    for (int j = 0; j < degree; ++j)\n    {\n      Eigen::RowVector3d pd = sorted.segment(j * 3, 3);\n      pd = (pd - (n.dot(pd)) * n).normalized();\n      data.field.block(i, j * 3, 1, 3) = pd;\n    }\n  }\n  Eigen::VectorXd curl;\n  igl::polyvector_field_matchings(data.field, V, F, false, treat_as_symmetric, data.match_ab, data.match_ba, curl);\n  \n  // create seeds for tracing\n  // --------------------------\n  Eigen::VectorXi samples;\n  int nsamples;\n  \n  nsamples = percentage * F.rows();\n  Eigen::VectorXd r;\n  r.setRandom(nsamples, 1);\n  r = (1 + r.array()) / 2.;\n  samples = (r.array() * F.rows()).cast<int>();\n  data.nsample = nsamples;\n  \n  Eigen::MatrixXd BC, BC_sample;\n  igl::barycenter(V, F, BC);\n  igl::slice(BC, samples, 1, BC_sample);\n  \n  // initialize state for tracing vector field\n  \n  state.start_point = BC_sample.replicate(degree,1);\n  state.end_point = state.start_point;\n  \n  state.current_face = samples.replicate(1, degree);\n  \n  state.current_direction.setZero(nsamples, degree);\n  for (int i = 0; i < nsamples; ++i)\n    for (int j = 0; j < degree; ++j)\n      state.current_direction(i, j) = j;\n  \n}\n\nIGL_INLINE void igl::streamlines_next(\n                                      const Eigen::MatrixXd V,\n                                      const Eigen::MatrixXi F,\n                                      const StreamlineData & data,\n                                      StreamlineState & state\n                                      ){\n  using namespace Eigen;\n  using namespace std;\n  \n  int degree = data.degree;\n  int nsample = data.nsample;\n  \n  state.start_point = state.end_point;\n  \n  for (int i = 0; i < degree; ++i)\n  {\n    for (int j = 0; j < nsample; ++j)\n    {\n      int f0 = state.current_face(j,i);\n      if (f0 == -1) // reach boundary\n        continue;\n      int m0 = state.current_direction(j, i);\n      \n      // the starting point of the vector\n      const Eigen::RowVector3d &p = state.start_point.row(j + nsample * i);\n      // the direction where we are trying to go\n      const Eigen::RowVector3d &r = data.field.block(f0, 3 * m0, 1, 3);\n      \n      \n      // new state,\n      int f1, m1;\n      \n      for (int k = 0; k < 3; ++k)\n      {\n        f1 = data.TT(f0, k);\n        \n        // edge vertices\n        const Eigen::RowVector3d &q = V.row(F(f0, k));\n        const Eigen::RowVector3d &qs = V.row(F(f0, (k + 1) % 3));\n        // edge direction\n        Eigen::RowVector3d s = qs - q;\n        \n        double u;\n        double t;\n        if (igl::segments_intersect(p, r, q, s, t, u))\n        {\n          // point on next face\n          state.end_point.row(j + nsample * i) = p + t * r;\n          state.current_face(j,i) = f1;\n          \n          // matching direction on next face\n          int e1 = data.F2E(f0, k);\n          if (data.E2F(e1, 0) == f0)\n            m1 = data.match_ab(e1, m0);\n          else\n            m1 = data.match_ba(e1, m0);\n          \n          state.current_direction(j, i) = m1;\n          break;\n        }\n        \n      }\n      \n      \n    }\n  }\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/streamlines.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2016 Francisca Gil Ureta <gilureta@cs.nyu.edu>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_STREAMLINES_H\n#define IGL_STREAMLINES_H\n\n#include \"igl_inline.h\"\n\n#include <Eigen/Core>\n#include <vector>\n\nnamespace igl\n{\n    struct StreamlineData\n    {\n        Eigen::MatrixXi TT;         //  #F by #3 adjacent matrix\n        Eigen::MatrixXi E;          //  #E by #3\n        Eigen::MatrixXi F2E;        //  #Fx3, Stores the Triangle-Edge relation\n        Eigen::MatrixXi E2F;        //  #Ex2, Stores the Edge-Triangle relation\n        Eigen::MatrixXd field;      //  #F by 3N list of the 3D coordinates of the per-face vectors\n                                    //      (N degrees stacked horizontally for each triangle)\n        Eigen::MatrixXi match_ab;   //  #E by N matrix, describing for each edge the matching a->b, where a\n                                    //      and b are the faces adjacent to the edge (i.e. vector #i of\n                                    //      the vector set in a is matched to vector #mab[i] in b)\n        Eigen::MatrixXi match_ba;   //  #E by N matrix, describing the inverse relation to match_ab\n        int nsample;                //  #S, number of sample points\n        int degree;                 //  #N, degrees of the vector field\n    };\n\n    struct StreamlineState\n    {\n        Eigen::MatrixXd start_point;        //  #N*S by 3 starting points of segment (stacked vertically for each degree)\n        Eigen::MatrixXd end_point;          //  #N*S by 3 endpoints points of segment (stacked vertically for each degree)\n        Eigen::MatrixXi current_face;       //  #S by N face indices (stacked horizontally for each degree)\n        Eigen::MatrixXi current_direction;  //  #S by N field direction indices (stacked horizontally for each degree)\n\n    };\n\n\n    // Given a mesh and a field the function computes the /data/ necessary for tracing the field'\n    // streamlines, and creates the initial /state/ for the tracing.\n    // Inputs:\n    //   V             #V by 3 list of mesh vertex coordinates\n    //   F             #F by 3 list of mesh faces\n    //   temp_field    #F by 3n list of the 3D coordinates of the per-face vectors\n    //                    (n-degrees stacked horizontally for each triangle)\n    //   treat_as_symmetric\n    //              if true, adds n symmetry directions to the field (N = 2n). Else N = n\n    //   percentage    [0-1] percentage of faces sampled\n    // Outputs:\n    //   data          struct containing topology information of the mesh and field\n    //   state         struct containing the state of the tracing\n    IGL_INLINE void streamlines_init(\n            const Eigen::MatrixXd V,\n            const Eigen::MatrixXi F,\n            const Eigen::MatrixXd &temp_field,\n            const bool treat_as_symmetric,\n            StreamlineData &data,\n            StreamlineState &state,\n            double percentage = 0.3\n\n    );\n\n    // The function computes the next state for each point in the sample\n    //   V             #V by 3 list of mesh vertex coordinates\n    //   F             #F by 3 list of mesh faces\n    //   data          struct containing topology information\n    //   state         struct containing the state of the tracing\n    IGL_INLINE void streamlines_next(\n            const Eigen::MatrixXd V,\n            const Eigen::MatrixXi F,\n            const StreamlineData & data,\n            StreamlineState & state\n\n    );\n}\n\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"streamlines.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/sum.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"sum.h\"\n#include \"redux.h\"\n\ntemplate <typename T>\nIGL_INLINE void igl::sum(\n  const Eigen::SparseMatrix<T>& X, \n  const int dim,\n  Eigen::SparseVector<T>& S)\n{\n  assert((dim == 1 || dim == 2) && \"dim must be 2 or 1\");\n  // Get size of input\n  int m = X.rows();\n  int n = X.cols();\n  // resize output\n  if(dim==1)\n  {\n    S = Eigen::SparseVector<T>(n);\n  }else\n  {\n    S = Eigen::SparseVector<T>(m);\n  }\n\n  // Iterate over outside\n  for(int k=0; k<X.outerSize(); ++k)\n  {\n    // Iterate over inside\n    for(typename Eigen::SparseMatrix<T>::InnerIterator it (X,k); it; ++it)\n    {\n      if(dim == 1)\n      {\n        S.coeffRef(it.col()) += it.value();\n      }else\n      {\n        S.coeffRef(it.row()) += it.value();\n      }\n    }\n  }\n}\n\ntemplate <typename AType, typename DerivedB>\nIGL_INLINE void igl::sum(\n  const Eigen::SparseMatrix<AType> & A, \n  const int dim,\n  Eigen::PlainObjectBase<DerivedB>& B)\n{\n  typedef typename DerivedB::Scalar Scalar;\n  igl::redux(A,dim,[](Scalar a, Scalar b){ return a+b;},B);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::sum<bool, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::SparseMatrix<bool, 0, int> const&, int, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::sum<double>(Eigen::SparseMatrix<double, 0, int> const&, int, Eigen::SparseVector<double, 0, int>&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/sum.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_SUM_H\n#define IGL_SUM_H\n#include \"igl_inline.h\"\n#include <Eigen/Sparse>\n\nnamespace igl\n{\n  // Note: If your looking for dense matrix matlab like sum for eigen matrics\n  // just use:\n  //   M.colwise().sum() or M.rowwise().sum()\n  // \n\n  // Sum the columns or rows of a sparse matrix\n  // Templates:\n  //   T  should be a eigen sparse matrix primitive type like int or double\n  // Inputs:\n  //   X  m by n sparse matrix\n  //   dim  dimension along which to sum (1 or 2)\n  // Output:\n  //   S  n-long sparse vector (if dim == 1) \n  //   or\n  //   S  m-long sparse vector (if dim == 2)\n  template <typename T>\n  IGL_INLINE void sum(\n    const Eigen::SparseMatrix<T>& X, \n    const int dim,\n    Eigen::SparseVector<T>& S);\n  // Sum is \"conducted\" in the type of DerivedB::Scalar \n  template <typename AType, typename DerivedB>\n  IGL_INLINE void sum(\n    const Eigen::SparseMatrix<AType> & A, \n    const int dim,\n    Eigen::PlainObjectBase<DerivedB>& B);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"sum.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/svd3x3/arap.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"arap.h\"\n#include <igl/colon.h>\n#include <igl/cotmatrix.h>\n#include <igl/massmatrix.h>\n#include <igl/group_sum_matrix.h>\n#include <igl/covariance_scatter_matrix.h>\n#include <igl/speye.h>\n#include <igl/mode.h>\n#include <igl/project_isometrically_to_plane.h>\n#include <igl/slice.h>\n#include <igl/arap_rhs.h>\n#include <igl/repdiag.h>\n#include <igl/columnize.h>\n#include \"fit_rotations.h\"\n#include <cassert>\n#include <iostream>\n\ntemplate <\n  typename DerivedV,\n  typename DerivedF,\n  typename Derivedb>\nIGL_INLINE bool igl::arap_precomputation(\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  const int dim,\n  const Eigen::PlainObjectBase<Derivedb> & b,\n  ARAPData & data)\n{\n  using namespace std;\n  using namespace Eigen;\n  typedef typename DerivedV::Scalar Scalar;\n  // number of vertices\n  const int n = V.rows();\n  data.n = n;\n  assert((b.size() == 0 || b.maxCoeff() < n) && \"b out of bounds\");\n  assert((b.size() == 0 || b.minCoeff() >=0) && \"b out of bounds\");\n  // remember b\n  data.b = b;\n  //assert(F.cols() == 3 && \"For now only triangles\");\n  // dimension\n  //const int dim = V.cols();\n  assert((dim == 3 || dim ==2) && \"dim should be 2 or 3\");\n  data.dim = dim;\n  //assert(dim == 3 && \"Only 3d supported\");\n  // Defaults\n  data.f_ext = MatrixXd::Zero(n,data.dim);\n\n  assert(data.dim <= V.cols() && \"solve dim should be <= embedding\");\n  bool flat = (V.cols() - data.dim)==1;\n\n  PlainObjectBase<DerivedV> plane_V;\n  PlainObjectBase<DerivedF> plane_F;\n  typedef SparseMatrix<Scalar> SparseMatrixS;\n  SparseMatrixS ref_map,ref_map_dim;\n  if(flat)\n  {\n    project_isometrically_to_plane(V,F,plane_V,plane_F,ref_map);\n    repdiag(ref_map,dim,ref_map_dim);\n  }\n  const PlainObjectBase<DerivedV>& ref_V = (flat?plane_V:V);\n  const PlainObjectBase<DerivedF>& ref_F = (flat?plane_F:F);\n  SparseMatrixS L;\n  cotmatrix(V,F,L);\n\n  ARAPEnergyType eff_energy = data.energy;\n  if(eff_energy == ARAP_ENERGY_TYPE_DEFAULT)\n  {\n    switch(F.cols())\n    {\n      case 3:\n        if(data.dim == 3)\n        {\n          eff_energy = ARAP_ENERGY_TYPE_SPOKES_AND_RIMS;\n        }else\n        {\n          eff_energy = ARAP_ENERGY_TYPE_ELEMENTS;\n        }\n        break;\n      case 4:\n        eff_energy = ARAP_ENERGY_TYPE_ELEMENTS;\n        break;\n      default:\n        assert(false);\n    }\n  }\n\n\n  // Get covariance scatter matrix, when applied collects the covariance\n  // matrices used to fit rotations to during optimization\n  covariance_scatter_matrix(ref_V,ref_F,eff_energy,data.CSM);\n  if(flat)\n  {\n    data.CSM = (data.CSM * ref_map_dim.transpose()).eval();\n  }\n  assert(data.CSM.cols() == V.rows()*data.dim);\n\n  // Get group sum scatter matrix, when applied sums all entries of the same\n  // group according to G\n  SparseMatrix<double> G_sum;\n  if(data.G.size() == 0)\n  {\n    if(eff_energy == ARAP_ENERGY_TYPE_ELEMENTS)\n    {\n      speye(F.rows(),G_sum);\n    }else\n    {\n      speye(n,G_sum);\n    }\n  }else\n  {\n    // groups are defined per vertex, convert to per face using mode\n    if(eff_energy == ARAP_ENERGY_TYPE_ELEMENTS)\n    {\n      Eigen::Matrix<int,Eigen::Dynamic,1> GG;\n      MatrixXi GF(F.rows(),F.cols());\n      for(int j = 0;j<F.cols();j++)\n      {\n        Matrix<int,Eigen::Dynamic,1> GFj;\n        slice(data.G,F.col(j),GFj);\n        GF.col(j) = GFj;\n      }\n      mode<int>(GF,2,GG);\n      data.G=GG;\n    }\n    //printf(\"group_sum_matrix()\\n\");\n    group_sum_matrix(data.G,G_sum);\n  }\n  SparseMatrix<double> G_sum_dim;\n  repdiag(G_sum,data.dim,G_sum_dim);\n  assert(G_sum_dim.cols() == data.CSM.rows());\n  data.CSM = (G_sum_dim * data.CSM).eval();\n\n\n  arap_rhs(ref_V,ref_F,data.dim,eff_energy,data.K);\n  if(flat)\n  {\n    data.K = (ref_map_dim * data.K).eval();\n  }\n  assert(data.K.rows() == data.n*data.dim);\n\n  SparseMatrix<double> Q = (-L).eval();\n\n  if(data.with_dynamics)\n  {\n    const double h = data.h;\n    assert(h != 0);\n    SparseMatrix<double> M;\n    massmatrix(V,F,MASSMATRIX_TYPE_DEFAULT,data.M);\n    SparseMatrix<double> DQ = 1./(h*h)*data.M;\n    Q += DQ;\n    // Dummy external forces\n    data.f_ext = MatrixXd::Zero(n,data.dim);\n    data.vel = MatrixXd::Zero(n,data.dim);\n  }\n\n  return min_quad_with_fixed_precompute(\n    Q,b,SparseMatrix<double>(),true,data.solver_data);\n}\n\ntemplate <\n  typename Derivedbc,\n  typename DerivedU>\nIGL_INLINE bool igl::arap_solve(\n  const Eigen::PlainObjectBase<Derivedbc> & bc,\n  ARAPData & data,\n  Eigen::PlainObjectBase<DerivedU> & U)\n{\n  using namespace igl;\n  using namespace Eigen;\n  using namespace std;\n  assert(data.b.size() == bc.rows());\n  if(bc.size() > 0)\n  {\n    assert(bc.cols() == data.dim && \"bc.cols() match data.dim\");\n  }\n  const int n = data.n;\n  int iter = 0;\n  if(U.size() == 0)\n  {\n    // terrible initial guess.. should at least copy input mesh\n#ifndef NDEBUG\n    cerr<<\"arap_solve: Using terrible initial guess for U. Try U = V.\"<<endl;\n#endif\n    U = MatrixXd::Zero(data.n,data.dim);\n  }else\n  {\n    assert(U.cols() == data.dim && \"U.cols() match data.dim\");\n  }\n  // changes each arap iteration\n  MatrixXd U_prev = U;\n  // doesn't change for fixed with_dynamics timestep\n  MatrixXd U0;\n  if(data.with_dynamics)\n  {\n    U0 = U_prev;\n  }\n  while(iter < data.max_iter)\n  {\n    U_prev = U;\n    // enforce boundary conditions exactly\n    for(int bi = 0;bi<bc.rows();bi++)\n    {\n      U.row(data.b(bi)) = bc.row(bi);\n    }\n\n    const auto & Udim = U.replicate(data.dim,1);\n    assert(U.cols() == data.dim);\n    // As if U.col(2) was 0\n    MatrixXd S = data.CSM * Udim;\n    // THIS NORMALIZATION IS IMPORTANT TO GET SINGLE PRECISION SVD CODE TO WORK\n    // CORRECTLY.\n    S /= S.array().abs().maxCoeff();\n\n    const int Rdim = data.dim;\n    MatrixXd R(Rdim,data.CSM.rows());\n    if(R.rows() == 2)\n    {\n      fit_rotations_planar(S,R);\n    }else\n    {\n      fit_rotations(S,true,R);\n//#ifdef __SSE__ // fit_rotations_SSE will convert to float if necessary\n//      fit_rotations_SSE(S,R);\n//#else\n//      fit_rotations(S,true,R);\n//#endif\n    }\n    //for(int k = 0;k<(data.CSM.rows()/dim);k++)\n    //{\n    //  R.block(0,dim*k,dim,dim) = MatrixXd::Identity(dim,dim);\n    //}\n\n\n    // Number of rotations: #vertices or #elements\n    int num_rots = data.K.cols()/Rdim/Rdim;\n    // distribute group rotations to vertices in each group\n    MatrixXd eff_R;\n    if(data.G.size() == 0)\n    {\n      // copy...\n      eff_R = R;\n    }else\n    {\n      eff_R.resize(Rdim,num_rots*Rdim);\n      for(int r = 0;r<num_rots;r++)\n      {\n        eff_R.block(0,Rdim*r,Rdim,Rdim) =\n          R.block(0,Rdim*data.G(r),Rdim,Rdim);\n      }\n    }\n\n    MatrixXd Dl;\n    if(data.with_dynamics)\n    {\n      assert(data.M.rows() == n &&\n        \"No mass matrix. Call arap_precomputation if changing with_dynamics\");\n      const double h = data.h;\n      assert(h != 0);\n      //Dl = 1./(h*h*h)*M*(-2.*V0 + Vm1) - fext;\n      // data.vel = (V0-Vm1)/h\n      // h*data.vel = (V0-Vm1)\n      // -h*data.vel = -V0+Vm1)\n      // -V0-h*data.vel = -2V0+Vm1\n      Dl = 1./(h*h)*data.M*(-U0 - h*data.vel) - data.f_ext;\n    }\n\n    VectorXd Rcol;\n    columnize(eff_R,num_rots,2,Rcol);\n    VectorXd Bcol = -data.K * Rcol;\n    assert(Bcol.size() == data.n*data.dim);\n    for(int c = 0;c<data.dim;c++)\n    {\n      VectorXd Uc,Bc,bcc,Beq;\n      Bc = Bcol.block(c*n,0,n,1);\n      if(data.with_dynamics)\n      {\n        Bc += Dl.col(c);\n      }\n      if(bc.size()>0)\n      {\n        bcc = bc.col(c);\n      }\n      min_quad_with_fixed_solve(\n        data.solver_data,\n        Bc,bcc,Beq,\n        Uc);\n      U.col(c) = Uc;\n    }\n\n    iter++;\n  }\n  if(data.with_dynamics)\n  {\n    // Keep track of velocity for next time\n    data.vel = (U-U0)/data.h;\n  }\n\n  return true;\n}\n\n#ifdef IGL_STATIC_LIBRARY\ntemplate bool igl::arap_solve<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, igl::ARAPData&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate bool igl::arap_precomputation<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, igl::ARAPData&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/svd3x3/arap.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_ARAP_H\n#define IGL_ARAP_H\n#include <igl/igl_inline.h>\n#include <igl/min_quad_with_fixed.h>\n#include <igl/ARAPEnergyType.h>\n#include <Eigen/Core>\n#include <Eigen/Sparse>\n\nnamespace igl\n{\n  struct ARAPData\n  {\n    // n  #V\n    // G  #V list of group indices (1 to k) for each vertex, such that vertex i\n    //    is assigned to group G(i)\n    // energy  type of energy to use\n    // with_dynamics  whether using dynamics (need to call arap_precomputation\n    //   after changing)\n    // f_ext  #V by dim list of external forces\n    // vel  #V by dim list of velocities\n    // h  dynamics time step\n    // max_iter  maximum inner iterations\n    // K  rhs pre-multiplier\n    // M  mass matrix\n    // solver_data  quadratic solver data\n    // b  list of boundary indices into V\n    // dim  dimension being used for solving\n    int n;\n    Eigen::VectorXi G;\n    ARAPEnergyType energy;\n    bool with_dynamics;\n    Eigen::MatrixXd f_ext,vel;\n    double h;\n    int max_iter;\n    Eigen::SparseMatrix<double> K,M;\n    Eigen::SparseMatrix<double> CSM;\n    min_quad_with_fixed_data<double> solver_data;\n    Eigen::VectorXi b;\n    int dim;\n      ARAPData():\n        n(0),\n        G(),\n        energy(ARAP_ENERGY_TYPE_DEFAULT),\n        with_dynamics(false),\n        f_ext(),\n        h(1),\n        max_iter(10),\n        K(),\n        CSM(),\n        solver_data(),\n        b(),\n        dim(-1) // force this to be set by _precomputation\n    {\n    };\n  };\n  \n  // Compute necessary information to start using an ARAP deformation\n  //\n  // Inputs:\n  //   V  #V by dim list of mesh positions\n  //   F  #F by simplex-size list of triangle|tet indices into V\n  //   dim  dimension being used at solve time. For deformation usually dim =\n  //     V.cols(), for surface parameterization V.cols() = 3 and dim = 2\n  //   b  #b list of \"boundary\" fixed vertex indices into V\n  // Outputs:\n  //   data  struct containing necessary precomputation\n  template <\n    typename DerivedV,\n    typename DerivedF,\n    typename Derivedb>\n  IGL_INLINE bool arap_precomputation(\n    const Eigen::PlainObjectBase<DerivedV> & V,\n    const Eigen::PlainObjectBase<DerivedF> & F,\n    const int dim,\n    const Eigen::PlainObjectBase<Derivedb> & b,\n    ARAPData & data);\n  // Inputs:\n  //   bc  #b by dim list of boundary conditions\n  //   data  struct containing necessary precomputation and parameters\n  //   U  #V by dim initial guess\n  template <\n    typename Derivedbc,\n    typename DerivedU>\n  IGL_INLINE bool arap_solve(\n    const Eigen::PlainObjectBase<Derivedbc> & bc,\n    ARAPData & data,\n    Eigen::PlainObjectBase<DerivedU> & U);\n};\n\n#ifndef IGL_STATIC_LIBRARY\n#include \"arap.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/svd3x3/arap_dof.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"arap_dof.h\"\n\n#include <igl/cotmatrix.h>\n#include <igl/massmatrix.h>\n#include <igl/speye.h>\n#include <igl/repdiag.h>\n#include <igl/repmat.h>\n#include <igl/slice.h>\n#include <igl/colon.h>\n#include <igl/full.h>\n#include <igl/is_sparse.h>\n#include <igl/mode.h>\n#include <igl/is_symmetric.h>\n#include <igl/group_sum_matrix.h>\n#include <igl/arap_rhs.h>\n#include <igl/covariance_scatter_matrix.h>\n#include <igl/svd3x3/fit_rotations.h>\n\n#include <igl/verbose.h>\n#include <igl/print_ijv.h>\n\n#include <igl/get_seconds_hires.h>\n//#include \"MKLEigenInterface.h\"\n#include <igl/min_quad_dense.h>\n#include <igl/get_seconds.h>\n#include <igl/columnize.h>\n\n// defined if no early exit is supported, i.e., always take a fixed number of iterations\n#define IGL_ARAP_DOF_FIXED_ITERATIONS_COUNT\n\n// A carefull derivation of this implementation is given in the corresponding\n// matlab function arap_dof.m\ntemplate <typename LbsMatrixType, typename SSCALAR>\nIGL_INLINE bool igl::arap_dof_precomputation(\n  const Eigen::MatrixXd & V, \n  const Eigen::MatrixXi & F,\n  const LbsMatrixType & M,\n  const Eigen::Matrix<int,Eigen::Dynamic,1> & G,\n  ArapDOFData<LbsMatrixType, SSCALAR> & data)\n{\n  using namespace Eigen;\n  typedef Matrix<SSCALAR, Dynamic, Dynamic> MatrixXS;\n  // number of mesh (domain) vertices\n  int n = V.rows();\n  // cache problem size\n  data.n = n;\n  // dimension of mesh\n  data.dim = V.cols();\n  assert(data.dim == M.rows()/n);\n  assert(data.dim*n == M.rows());\n  if(data.dim == 3)\n  {\n    // Check if z-coordinate is all zeros\n    if(V.col(2).minCoeff() == 0 && V.col(2).maxCoeff() == 0)\n    {\n      data.effective_dim = 2;\n    }\n  }else\n  {\n    data.effective_dim = data.dim;\n  }\n  // Number of handles\n  data.m = M.cols()/data.dim/(data.dim+1);\n  assert(data.m*data.dim*(data.dim+1) == M.cols());\n  //assert(m == C.rows());\n\n  //printf(\"n=%d; dim=%d; m=%d;\\n\",n,data.dim,data.m);\n\n  // Build cotangent laplacian\n  SparseMatrix<double> Lcot;\n  //printf(\"cotmatrix()\\n\");\n  cotmatrix(V,F,Lcot);\n  // Discrete laplacian (should be minus matlab version)\n  SparseMatrix<double> Lapl = -2.0*Lcot;\n#ifdef EXTREME_VERBOSE\n  cout<<\"LaplIJV=[\"<<endl;print_ijv(Lapl,1);cout<<endl<<\"];\"<<\n    endl<<\"Lapl=sparse(LaplIJV(:,1),LaplIJV(:,2),LaplIJV(:,3),\"<<\n    Lapl.rows()<<\",\"<<Lapl.cols()<<\");\"<<endl;\n#endif\n\n  // Get group sum scatter matrix, when applied sums all entries of the same\n  // group according to G\n  SparseMatrix<double> G_sum;\n  if(G.size() == 0)\n  {\n    speye(n,G_sum);\n  }else\n  {\n    // groups are defined per vertex, convert to per face using mode\n    Eigen::Matrix<int,Eigen::Dynamic,1> GG;\n    if(data.energy == ARAP_ENERGY_TYPE_ELEMENTS)\n    {\n      MatrixXi GF(F.rows(),F.cols());\n      for(int j = 0;j<F.cols();j++)\n      {\n        Matrix<int,Eigen::Dynamic,1> GFj;\n        slice(G,F.col(j),GFj);\n        GF.col(j) = GFj;\n      }\n      mode<int>(GF,2,GG);\n    }else\n    {\n      GG=G;\n    }\n    //printf(\"group_sum_matrix()\\n\");\n    group_sum_matrix(GG,G_sum);\n  }\n\n#ifdef EXTREME_VERBOSE\n  cout<<\"G_sumIJV=[\"<<endl;print_ijv(G_sum,1);cout<<endl<<\"];\"<<\n    endl<<\"G_sum=sparse(G_sumIJV(:,1),G_sumIJV(:,2),G_sumIJV(:,3),\"<<\n    G_sum.rows()<<\",\"<<G_sum.cols()<<\");\"<<endl;\n#endif\n\n  // Get covariance scatter matrix, when applied collects the covariance matrices\n  // used to fit rotations to during optimization\n  SparseMatrix<double> CSM;\n  //printf(\"covariance_scatter_matrix()\\n\");\n  covariance_scatter_matrix(V,F,data.energy,CSM);\n#ifdef EXTREME_VERBOSE\n  cout<<\"CSMIJV=[\"<<endl;print_ijv(CSM,1);cout<<endl<<\"];\"<<\n    endl<<\"CSM=sparse(CSMIJV(:,1),CSMIJV(:,2),CSMIJV(:,3),\"<<\n    CSM.rows()<<\",\"<<CSM.cols()<<\");\"<<endl;\n#endif\n  \n\n  // Build the covariance matrix \"constructor\". This is a set of *scatter*\n  // matrices that when multiplied on the right by column of the transformation\n  // matrix entries (the degrees of freedom) L, we get a stack of dim by 1\n  // covariance matrix column, with a column in the stack for each rotation\n  // *group*. The output is a list of matrices because we construct each column\n  // in the stack of covariance matrices with an independent matrix-vector\n  // multiplication.\n  //\n  // We want to build S which is a stack of dim by dim covariance matrices.\n  // Thus S is dim*g by dim, where dim is the number of dimensions and g is the\n  // number of groups. We can precompute dim matrices CSM_M such that column i\n  // in S is computed as S(:,i) = CSM_M{i} * L, where L is a column of the\n  // skinning transformation matrix values. To be clear, the covariance matrix\n  // for group k is then given as the dim by dim matrix pulled from the stack:\n  // S((k-1)*dim + 1:dim,:)\n\n  // Apply group sum to each dimension's block of covariance scatter matrix\n  SparseMatrix<double> G_sum_dim;\n  repdiag(G_sum,data.dim,G_sum_dim);\n  CSM = G_sum_dim * CSM;\n#ifdef EXTREME_VERBOSE\n  cout<<\"CSMIJV=[\"<<endl;print_ijv(CSM,1);cout<<endl<<\"];\"<<\n    endl<<\"CSM=sparse(CSMIJV(:,1),CSMIJV(:,2),CSMIJV(:,3),\"<<\n    CSM.rows()<<\",\"<<CSM.cols()<<\");\"<<endl;\n#endif\n\n  //printf(\"CSM_M()\\n\");\n  // Precompute CSM times M for each dimension\n  data.CSM_M.resize(data.dim);\n#ifdef EXTREME_VERBOSE\n  cout<<\"data.CSM_M = cell(\"<<data.dim<<\",1);\"<<endl;\n#endif\n  // span of integers from 0 to n-1\n  Eigen::Matrix<int,Eigen::Dynamic,1> span_n(n);\n  for(int i = 0;i<n;i++)\n  {\n    span_n(i) = i;\n  }\n\n  // span of integers from 0 to M.cols()-1\n  Eigen::Matrix<int,Eigen::Dynamic,1> span_mlbs_cols(M.cols());\n  for(int i = 0;i<M.cols();i++)\n  {\n    span_mlbs_cols(i) = i;\n  }\n\n  // number of groups\n  int k = CSM.rows()/data.dim;\n  for(int i = 0;i<data.dim;i++)\n  {\n    //printf(\"CSM_M(): Mi\\n\");\n    LbsMatrixType M_i;\n    //printf(\"CSM_M(): slice\\n\");\n    slice(M,(span_n.array()+i*n).matrix(),span_mlbs_cols,M_i);\n    LbsMatrixType M_i_dim;\n    data.CSM_M[i].resize(k*data.dim,data.m*data.dim*(data.dim+1));\n    assert(data.CSM_M[i].cols() == M.cols());\n    for(int j = 0;j<data.dim;j++)\n    {\n      SparseMatrix<double> CSMj;\n      //printf(\"CSM_M(): slice\\n\");\n      slice(\n        CSM,\n        colon<int>(j*k,(j+1)*k-1),\n        colon<int>(j*n,(j+1)*n-1),\n        CSMj);\n      assert(CSMj.rows() == k);\n      assert(CSMj.cols() == n);\n      LbsMatrixType CSMjM_i = CSMj * M_i;\n      if(is_sparse(CSMjM_i))\n      {\n        // Convert to full\n        MatrixXd CSMjM_ifull;\n        //printf(\"CSM_M(): full\\n\");\n        full(CSMjM_i,CSMjM_ifull);\n//        printf(\"CSM_M[%d]: %d %d\\n\",i,data.CSM_M[i].rows(),data.CSM_M[i].cols());\n//        printf(\"CSM_M[%d].block(%d*%d=%d,0,%d,%d): %d %d\\n\",i,j,k,CSMjM_i.rows(),CSMjM_i.cols(),\n//            data.CSM_M[i].block(j*k,0,CSMjM_i.rows(),CSMjM_i.cols()).rows(),\n//            data.CSM_M[i].block(j*k,0,CSMjM_i.rows(),CSMjM_i.cols()).cols());\n//        printf(\"CSM_MjMi: %d %d\\n\",i,CSMjM_i.rows(),CSMjM_i.cols());\n//        printf(\"CSM_MjM_ifull: %d %d\\n\",i,CSMjM_ifull.rows(),CSMjM_ifull.cols());\n        data.CSM_M[i].block(j*k,0,CSMjM_i.rows(),CSMjM_i.cols()) = CSMjM_ifull;\n      }else\n      {\n        data.CSM_M[i].block(j*k,0,CSMjM_i.rows(),CSMjM_i.cols()) = CSMjM_i;\n      }\n    }\n#ifdef EXTREME_VERBOSE\n    cout<<\"CSM_Mi=[\"<<endl<<data.CSM_M[i]<<endl<<\"];\"<<endl;\n#endif\n  }\n\n  // precompute arap_rhs matrix\n  //printf(\"arap_rhs()\\n\");\n  SparseMatrix<double> K;\n  arap_rhs(V,F,V.cols(),data.energy,K);\n//#ifdef EXTREME_VERBOSE\n//  cout<<\"KIJV=[\"<<endl;print_ijv(K,1);cout<<endl<<\"];\"<<\n//    endl<<\"K=sparse(KIJV(:,1),KIJV(:,2),KIJV(:,3),\"<<\n//    K.rows()<<\",\"<<K.cols()<<\");\"<<endl;\n//#endif\n  // Precompute left muliplication by M and right multiplication by G_sum\n  SparseMatrix<double> G_sumT = G_sum.transpose();\n  SparseMatrix<double> G_sumT_dim_dim;\n  repdiag(G_sumT,data.dim*data.dim,G_sumT_dim_dim);\n  LbsMatrixType MT = M.transpose();\n  // If this is a bottle neck then consider reordering matrix multiplication\n  data.M_KG = -4.0 * (MT * (K * G_sumT_dim_dim));\n//#ifdef EXTREME_VERBOSE\n//  cout<<\"data.M_KGIJV=[\"<<endl;print_ijv(data.M_KG,1);cout<<endl<<\"];\"<<\n//    endl<<\"data.M_KG=sparse(data.M_KGIJV(:,1),data.M_KGIJV(:,2),data.M_KGIJV(:,3),\"<<\n//    data.M_KG.rows()<<\",\"<<data.M_KG.cols()<<\");\"<<endl;\n//#endif\n\n  // Precompute system matrix\n  //printf(\"A()\\n\");\n  SparseMatrix<double> A;\n  repdiag(Lapl,data.dim,A);\n  data.Q = MT * (A * M);\n//#ifdef EXTREME_VERBOSE\n//  cout<<\"QIJV=[\"<<endl;print_ijv(data.Q,1);cout<<endl<<\"];\"<<\n//    endl<<\"Q=sparse(QIJV(:,1),QIJV(:,2),QIJV(:,3),\"<<\n//    data.Q.rows()<<\",\"<<data.Q.cols()<<\");\"<<endl;\n//#endif\n\n  // Always do dynamics precomputation so we can hot-switch\n  //if(data.with_dynamics)\n  //{\n    // Build cotangent laplacian\n    SparseMatrix<double> Mass;\n    //printf(\"massmatrix()\\n\");\n    massmatrix(V,F,(F.cols()>3?MASSMATRIX_TYPE_BARYCENTRIC:MASSMATRIX_TYPE_VORONOI),Mass);\n    //cout<<\"MIJV=[\"<<endl;print_ijv(Mass,1);cout<<endl<<\"];\"<<\n    //  endl<<\"M=sparse(MIJV(:,1),MIJV(:,2),MIJV(:,3),\"<<\n    //  Mass.rows()<<\",\"<<Mass.cols()<<\");\"<<endl;\n    //speye(data.n,Mass);\n    SparseMatrix<double> Mass_rep;\n    repdiag(Mass,data.dim,Mass_rep);\n\n    // Multiply either side by weights matrix (should be dense)\n    data.Mass_tilde = MT * Mass_rep * M;\n    MatrixXd ones(data.dim*data.n,data.dim);\n    for(int i = 0;i<data.n;i++)\n    {\n      for(int d = 0;d<data.dim;d++)\n      {\n        ones(i+d*data.n,d) = 1;\n      }\n    }\n    data.fgrav = MT * (Mass_rep * ones);\n    data.fext = MatrixXS::Zero(MT.rows(),1);\n    //data.fgrav = MT * (ones);\n  //}\n\n\n  // This may/should be superfluous\n  //printf(\"is_symmetric()\\n\");\n  if(!is_symmetric(data.Q))\n  {\n    //printf(\"Fixing symmetry...\\n\");\n    // \"Fix\" symmetry\n    LbsMatrixType QT = data.Q.transpose();\n    LbsMatrixType Q_copy = data.Q;\n    data.Q = 0.5*(Q_copy+QT);\n    // Check that ^^^ this really worked. It doesn't always\n    //assert(is_symmetric(*Q));\n  }\n\n  //printf(\"arap_dof_precomputation() succeeded... so far...\\n\");\n  verbose(\"Number of handles: %i\\n\", data.m);\n  return true;\n}\n\n/////////////////////////////////////////////////////////////////////////\n//\n// STATIC FUNCTIONS (These should be removed or properly defined)\n//\n/////////////////////////////////////////////////////////////////////////\nnamespace igl\n{\n  // returns maximal difference of 'blok' from scalar times 3x3 identity:\n  template <typename SSCALAR>\n  inline static SSCALAR maxBlokErr(const Eigen::Matrix3f &blok)\n  {\n    SSCALAR mD;\n    SSCALAR value = blok(0,0);\n    SSCALAR diff1 = fabs(blok(1,1) - value);\n    SSCALAR diff2 = fabs(blok(2,2) - value);\n    if (diff1 > diff2) mD = diff1;\n    else mD = diff2;\n    \n    for (int v=0; v<3; v++)\n    {\n      for (int w=0; w<3; w++)\n      {\n        if (v == w)\n        {\n          continue;\n        }\n        if (mD < fabs(blok(v, w)))\n        {\n          mD = fabs(blok(v, w));\n        }\n      }\n    }\n    \n    return mD;\n  }\n  \n  // converts CSM_M_SSCALAR[0], CSM_M_SSCALAR[1], CSM_M_SSCALAR[2] into one\n  // \"condensed\" matrix CSM while checking we're not loosing any information by\n  // this process; specifically, returns maximal difference from scaled 3x3\n  // identity blocks, which should be pretty small number\n  template <typename MatrixXS>\n  static typename MatrixXS::Scalar condense_CSM(\n    const std::vector<MatrixXS> &CSM_M_SSCALAR, \n    int numBones, \n    int dim, \n    MatrixXS &CSM)\n  {\n    const int numRows = CSM_M_SSCALAR[0].rows();\n    assert(CSM_M_SSCALAR[0].cols() == dim*(dim+1)*numBones);\n    assert(CSM_M_SSCALAR[1].cols() == dim*(dim+1)*numBones);\n    assert(CSM_M_SSCALAR[2].cols() == dim*(dim+1)*numBones);\n    assert(CSM_M_SSCALAR[1].rows() == numRows);\n    assert(CSM_M_SSCALAR[2].rows() == numRows);\n  \n    const int numCols = (dim + 1)*numBones;\n    CSM.resize(numRows, numCols);\n  \n    typedef typename MatrixXS::Scalar SSCALAR;\n    SSCALAR maxDiff = 0.0f;\n  \n    for (int r=0; r<numRows; r++)\n    {\n      for (int coord=0; coord<dim+1; coord++)\n      {\n        for (int b=0; b<numBones; b++)\n        {\n          // this is just a test if we really have a multiple of 3x3 identity\n          Eigen::Matrix3f blok;\n          for (int v=0; v<3; v++)\n          {\n            for (int w=0; w<3; w++)\n            {\n              blok(v,w) = CSM_M_SSCALAR[v](r, coord*(numBones*dim) + b + w*numBones);\n            }          \n          }\n  \n          //SSCALAR value[3];\n          //for (int v=0; v<3; v++)\n          //  CSM_M_SSCALAR[v](r, coord*(numBones*dim) + b + v*numBones);\n  \n          SSCALAR mD = maxBlokErr<SSCALAR>(blok);\n          if (mD > maxDiff) maxDiff = mD;\n  \n          // use the first value:\n          CSM(r, coord*numBones + b) = blok(0,0);\n        }\n      }\n    }\n  \n    return maxDiff;\n  }\n  \n  // splits x_0, ... , x_dim coordinates in column vector 'L' into a numBones*(dimp1) x dim matrix 'Lsep';\n  // assumes 'Lsep' has already been preallocated\n  //\n  // is this the same as uncolumnize? no.\n  template <typename MatL, typename MatLsep>\n  static void splitColumns(\n   const MatL &L, \n   int numBones, \n   int dim, \n   int dimp1, \n   MatLsep &Lsep)\n  {\n    assert(L.cols() == 1);\n    assert(L.rows() == dim*(dimp1)*numBones);\n  \n    assert(Lsep.rows() == (dimp1)*numBones && Lsep.cols() == dim);\n  \n    for (int b=0; b<numBones; b++)\n    {\n      for (int coord=0; coord<dimp1; coord++)\n      {\n        for (int c=0; c<dim; c++)\n        {\n          Lsep(coord*numBones + b, c) = L(coord*numBones*dim + c*numBones + b, 0);\n        }\n      }\n    }\n  }\n  \n  \n  // the inverse of splitColumns, i.e., takes numBones*(dimp1) x dim matrix 'Lsep' and merges the dimensions\n  // into columns vector 'L' (which is assumed to be already allocated):\n  //\n  // is this the same as columnize? no.\n  template <typename MatrixXS>\n  static void mergeColumns(const MatrixXS &Lsep, int numBones, int dim, int dimp1, MatrixXS &L)\n  {\n    assert(L.cols() == 1);\n    assert(L.rows() == dim*(dimp1)*numBones);\n  \n    assert(Lsep.rows() == (dimp1)*numBones && Lsep.cols() == dim);\n  \n    for (int b=0; b<numBones; b++)\n    {\n      for (int coord=0; coord<dimp1; coord++)\n      {\n        for (int c=0; c<dim; c++)\n        {\n          L(coord*numBones*dim + c*numBones + b, 0) = Lsep(coord*numBones + b, c);\n        }\n      }\n    }\n  }\n  \n  // converts \"Solve1\" the \"rotations\" part of FullSolve matrix (the first part)\n  // into one \"condensed\" matrix CSolve1 while checking we're not loosing any\n  // information by this process; specifically, returns maximal difference from\n  // scaled 3x3 identity blocks, which should be pretty small number\n  template <typename MatrixXS>\n  static typename MatrixXS::Scalar condense_Solve1(MatrixXS &Solve1, int numBones, int numGroups, int dim, MatrixXS &CSolve1)\n  {\n    assert(Solve1.rows() == dim*(dim + 1)*numBones);\n    assert(Solve1.cols() == dim*dim*numGroups);\n  \n    typedef typename MatrixXS::Scalar SSCALAR;\n    SSCALAR maxDiff = 0.0f;\n  \n    CSolve1.resize((dim + 1)*numBones, dim*numGroups);  \n    for (int rowCoord=0; rowCoord<dim+1; rowCoord++)\n    {\n      for (int b=0; b<numBones; b++)\n      {\n        for (int colCoord=0; colCoord<dim; colCoord++)\n        {\n          for (int g=0; g<numGroups; g++)\n          {\n            Eigen::Matrix3f blok;\n            for (int r=0; r<3; r++)\n            {\n              for (int c=0; c<3; c++)\n              {\n                blok(r, c) = Solve1(rowCoord*numBones*dim + r*numBones + b, colCoord*numGroups*dim + c*numGroups + g);\n              }\n            }\n  \n            SSCALAR mD = maxBlokErr<SSCALAR>(blok);\n            if (mD > maxDiff) maxDiff = mD;\n  \n            CSolve1(rowCoord*numBones + b, colCoord*numGroups + g) = blok(0,0);\n          }\n        }\n      }\n    }  \n    \n    return maxDiff;\n  }\n}\n\ntemplate <typename LbsMatrixType, typename SSCALAR>\nIGL_INLINE bool igl::arap_dof_recomputation(\n  const Eigen::Matrix<int,Eigen::Dynamic,1> & fixed_dim,\n  const Eigen::SparseMatrix<double> & A_eq,\n  ArapDOFData<LbsMatrixType, SSCALAR> & data)\n{\n  using namespace Eigen;\n  typedef Matrix<SSCALAR, Dynamic, Dynamic> MatrixXS;\n\n  LbsMatrixType * Q;\n  LbsMatrixType Qdyn;\n  if(data.with_dynamics)\n  {\n    // multiply by 1/timestep and to quadratic coefficients matrix\n    // Might be missing a 0.5 here\n    LbsMatrixType Q_copy = data.Q;\n    Qdyn = Q_copy + (1.0/(data.h*data.h))*data.Mass_tilde;\n    Q = &Qdyn;\n\n    // This may/should be superfluous\n    //printf(\"is_symmetric()\\n\");\n    if(!is_symmetric(*Q))\n    {\n      //printf(\"Fixing symmetry...\\n\");\n      // \"Fix\" symmetry\n      LbsMatrixType QT = (*Q).transpose();\n      LbsMatrixType Q_copy = *Q;\n      *Q = 0.5*(Q_copy+QT);\n      // Check that ^^^ this really worked. It doesn't always\n      //assert(is_symmetric(*Q));\n    }\n  }else\n  {\n    Q = &data.Q;\n  }\n\n  assert((int)data.CSM_M.size() == data.dim);\n  assert(A_eq.cols() == data.m*data.dim*(data.dim+1));\n  data.fixed_dim = fixed_dim;\n\n  if(fixed_dim.size() > 0)\n  {\n    assert(fixed_dim.maxCoeff() < data.m*data.dim*(data.dim+1));\n    assert(fixed_dim.minCoeff() >= 0);\n  }\n\n#ifdef EXTREME_VERBOSE\n  cout<<\"data.fixed_dim=[\"<<endl<<data.fixed_dim<<endl<<\"]+1;\"<<endl;\n#endif\n\n  // Compute dense solve matrix (alternative of matrix factorization)\n  //printf(\"min_quad_dense_precompute()\\n\");\n  MatrixXd Qfull; full(*Q, Qfull);  \n  MatrixXd A_eqfull; full(A_eq, A_eqfull);\n  MatrixXd M_Solve;\n\n  double timer0_start = get_seconds_hires();\n  bool use_lu = data.effective_dim != 2;\n  //use_lu = false;\n  //printf(\"use_lu: %s\\n\",(use_lu?\"TRUE\":\"FALSE\"));\n  min_quad_dense_precompute(Qfull, A_eqfull, use_lu,M_Solve);\n  double timer0_end = get_seconds_hires();\n  verbose(\"Bob timing: %.20f\\n\", (timer0_end - timer0_start)*1000.0);\n\n  // Precompute full solve matrix:\n  const int fsRows = data.m * data.dim * (data.dim + 1); // 12 * number_of_bones\n  const int fsCols1 = data.M_KG.cols(); // 9 * number_of_posConstraints\n  const int fsCols2 = A_eq.rows(); // number_of_posConstraints\n  data.M_FullSolve.resize(fsRows, fsCols1 + fsCols2);\n  // note the magical multiplicative constant \"-0.5\", I've no idea why it has\n  // to be there :)\n  data.M_FullSolve << \n    (-0.5 * M_Solve.block(0, 0, fsRows, fsRows) * data.M_KG).template cast<SSCALAR>(), \n    M_Solve.block(0, fsRows, fsRows, fsCols2).template cast<SSCALAR>();\n\n  if(data.with_dynamics)\n  {\n    printf(\n      \"---------------------------------------------------------------------\\n\"\n      \"\\n\\n\\nWITH DYNAMICS recomputation\\n\\n\\n\"\n      \"---------------------------------------------------------------------\\n\"\n      );\n    // Also need to save Π1 before it gets multiplied by Ktilde (aka M_KG)\n    data.Pi_1 = M_Solve.block(0, 0, fsRows, fsRows).template cast<SSCALAR>();\n  }\n\n  // Precompute condensed matrices,\n  // first CSM:\n  std::vector<MatrixXS> CSM_M_SSCALAR;\n  CSM_M_SSCALAR.resize(data.dim);\n  for (int i=0; i<data.dim; i++) CSM_M_SSCALAR[i] = data.CSM_M[i].template cast<SSCALAR>();\n  SSCALAR maxErr1 = condense_CSM(CSM_M_SSCALAR, data.m, data.dim, data.CSM);  \n  verbose(\"condense_CSM maxErr = %.15f (this should be close to zero)\\n\", maxErr1);\n  assert(fabs(maxErr1) < 1e-5);\n  \n  // and then solveBlock1:\n  // number of groups\n  const int k = data.CSM_M[0].rows()/data.dim;\n  MatrixXS SolveBlock1 = data.M_FullSolve.block(0, 0, data.M_FullSolve.rows(), data.dim * data.dim * k);\n  SSCALAR maxErr2 = condense_Solve1(SolveBlock1, data.m, k, data.dim, data.CSolveBlock1);  \n  verbose(\"condense_Solve1 maxErr = %.15f (this should be close to zero)\\n\", maxErr2);\n  assert(fabs(maxErr2) < 1e-5);\n\n  return true;\n}\n\ntemplate <typename LbsMatrixType, typename SSCALAR>\nIGL_INLINE bool igl::arap_dof_update(\n  const ArapDOFData<LbsMatrixType, SSCALAR> & data,\n  const Eigen::Matrix<double,Eigen::Dynamic,1> & B_eq,\n  const Eigen::MatrixXd & L0,\n  const int max_iters,\n  const double \n#ifdef IGL_ARAP_DOF_FIXED_ITERATIONS_COUNT\n  tol,\n#else\n  /*tol*/,\n#endif\n  Eigen::MatrixXd & L\n  )\n{\n  using namespace Eigen;\n  typedef Matrix<SSCALAR, Dynamic, Dynamic> MatrixXS;\n#ifdef ARAP_GLOBAL_TIMING\n  double timer_start = get_seconds_hires();\n#endif\n\n  // number of dimensions\n  assert((int)data.CSM_M.size() == data.dim);\n  assert((int)L0.size() == (data.m)*data.dim*(data.dim+1));\n  assert(max_iters >= 0);\n  assert(tol >= 0);\n\n  // timing variables\n  double \n    sec_start, \n    sec_covGather, \n    sec_fitRotations, \n    //sec_rhs, \n    sec_prepMult, \n    sec_solve, sec_end;\n\n  assert(L0.cols() == 1);\n#ifdef EXTREME_VERBOSE\n  cout<<\"dim=\"<<data.dim<<\";\"<<endl;\n  cout<<\"m=\"<<data.m<<\";\"<<endl;\n#endif\n\n  // number of groups\n  const int k = data.CSM_M[0].rows()/data.dim;\n  for(int i = 0;i<data.dim;i++)\n  {\n    assert(data.CSM_M[i].rows()/data.dim == k);\n  }\n#ifdef EXTREME_VERBOSE\n  cout<<\"k=\"<<k<<\";\"<<endl;\n#endif\n\n  // resize output and initialize with initial guess\n  L = L0;\n#ifndef IGL_ARAP_DOF_FIXED_ITERATIONS_COUNT\n  // Keep track of last solution\n  MatrixXS L_prev;\n#endif\n  // We will be iterating on L_SSCALAR, only at the end we convert back to double\n  MatrixXS L_SSCALAR = L.cast<SSCALAR>();\n\n  int iters = 0;\n#ifndef IGL_ARAP_DOF_FIXED_ITERATIONS_COUNT\n  double max_diff = tol+1;  \n#endif\n\n  MatrixXS S(k*data.dim,data.dim);\n  MatrixXS R(data.dim,data.dim*k);\n  Eigen::Matrix<SSCALAR,Eigen::Dynamic,1> Rcol(data.dim * data.dim * k);\n  Matrix<SSCALAR,Dynamic,1> B_eq_SSCALAR = B_eq.cast<SSCALAR>();\n  Matrix<SSCALAR,Dynamic,1> B_eq_fix_SSCALAR;\n  Matrix<SSCALAR,Dynamic,1> L0SSCALAR = L0.cast<SSCALAR>();\n  slice(L0SSCALAR, data.fixed_dim, B_eq_fix_SSCALAR);    \n  //MatrixXS rhsFull(Rcol.rows() + B_eq.rows() + B_eq_fix_SSCALAR.rows(), 1); \n\n  MatrixXS Lsep(data.m*(data.dim + 1), 3);  \n  const MatrixXS L_part2 = \n    data.M_FullSolve.block(0, Rcol.rows(), data.M_FullSolve.rows(), B_eq_SSCALAR.rows()) * B_eq_SSCALAR;\n  const MatrixXS L_part3 = \n    data.M_FullSolve.block(0, Rcol.rows() + B_eq_SSCALAR.rows(), data.M_FullSolve.rows(), B_eq_fix_SSCALAR.rows()) * B_eq_fix_SSCALAR;\n  MatrixXS L_part2and3 = L_part2 + L_part3;\n\n  // preallocate workspace variables:\n  MatrixXS Rxyz(k*data.dim, data.dim);  \n  MatrixXS L_part1xyz((data.dim + 1) * data.m, data.dim);\n  MatrixXS L_part1(data.dim * (data.dim + 1) * data.m, 1);\n\n#ifdef ARAP_GLOBAL_TIMING\n    double timer_prepFinished = get_seconds_hires();\n#endif\n\n#ifdef IGL_ARAP_DOF_FIXED_ITERATIONS_COUNT\n  while(iters < max_iters)\n#else\n  while(iters < max_iters && max_diff > tol)\n#endif\n  {  \n    if(data.print_timings)\n    {\n      sec_start = get_seconds_hires();\n    }\n\n#ifndef IGL_ARAP_DOF_FIXED_ITERATIONS_COUNT\n    L_prev = L_SSCALAR;\n#endif\n    ///////////////////////////////////////////////////////////////////////////\n    // Local step: Fix positions, fit rotations\n    ///////////////////////////////////////////////////////////////////////////    \n  \n    // Gather covariance matrices    \n\n    splitColumns(L_SSCALAR, data.m, data.dim, data.dim + 1, Lsep);\n\n    S = data.CSM * Lsep; \n    // interestingly, this doesn't seem to be so slow, but\n    //MKL is still 2x faster (probably due to AVX)\n    //#ifdef IGL_ARAP_DOF_DOUBLE_PRECISION_SOLVE\n    //    MKL_matMatMult_double(S, data.CSM, Lsep);\n    //#else\n    //    MKL_matMatMult_single(S, data.CSM, Lsep);\n    //#endif\n    \n    if(data.print_timings)\n    {\n      sec_covGather = get_seconds_hires();\n    }\n\n#ifdef EXTREME_VERBOSE\n    cout<<\"S=[\"<<endl<<S<<endl<<\"];\"<<endl;\n#endif\n    // Fit rotations to covariance matrices\n    if(data.effective_dim == 2)\n    {\n      fit_rotations_planar(S,R);\n    }else\n    {\n#ifdef __SSE__ // fit_rotations_SSE will convert to float if necessary\n      fit_rotations_SSE(S,R);\n#else\n      fit_rotations(S,false,R);\n#endif\n    }\n\n#ifdef EXTREME_VERBOSE\n    cout<<\"R=[\"<<endl<<R<<endl<<\"];\"<<endl;\n#endif  \n\n    if(data.print_timings)\n    {\n      sec_fitRotations = get_seconds_hires();\n    }\n  \n    ///////////////////////////////////////////////////////////////////////////\n    // \"Global\" step: fix rotations per mesh vertex, solve for\n    // linear transformations at handles\n    ///////////////////////////////////////////////////////////////////////////\n\n    // all this shuffling is retarded and not completely negligible time-wise;\n    // TODO: change fit_rotations_XXX so it returns R in the format ready for\n    // CSolveBlock1 multiplication\n    columnize(R, k, 2, Rcol);\n#ifdef EXTREME_VERBOSE\n    cout<<\"Rcol=[\"<<endl<<Rcol<<endl<<\"];\"<<endl;\n#endif  \n    splitColumns(Rcol, k, data.dim, data.dim, Rxyz);\n    \n    if(data.print_timings)\n    {\n      sec_prepMult = get_seconds_hires();\n    }  \n    \n    L_part1xyz = data.CSolveBlock1 * Rxyz;\n    //#ifdef IGL_ARAP_DOF_DOUBLE_PRECISION_SOLVE\n    //    MKL_matMatMult_double(L_part1xyz, data.CSolveBlock1, Rxyz);    \n    //#else\n    //    MKL_matMatMult_single(L_part1xyz, data.CSolveBlock1, Rxyz);    \n    //#endif\n    mergeColumns(L_part1xyz, data.m, data.dim, data.dim + 1, L_part1);\n\n    if(data.with_dynamics)\n    {\n      // Consider reordering or precomputing matrix multiplications\n      MatrixXS L_part1_dyn(data.dim * (data.dim + 1) * data.m, 1);\n      // Eigen can't parse this:\n      //L_part1_dyn = \n      //  -(2.0/(data.h*data.h)) * data.Pi_1 * data.Mass_tilde * data.L0 +\n      //   (1.0/(data.h*data.h)) * data.Pi_1 * data.Mass_tilde * data.Lm1;\n      // -1.0 because we've moved these linear terms to the right hand side\n      //MatrixXS temp = -1.0 * \n      //    ((-2.0/(data.h*data.h)) * data.L0.array() + \n      //      (1.0/(data.h*data.h)) * data.Lm1.array()).matrix();\n      //MatrixXS temp = -1.0 * \n      //    ( (-1.0/(data.h*data.h)) * data.L0.array() + \n      //      (1.0/(data.h*data.h)) * data.Lm1.array()\n      //      (-1.0/(data.h*data.h)) * data.L0.array() + \n      //      ).matrix();\n      //Lvel0 = (1.0/(data.h)) * data.Lm1.array() - data.L0.array();\n      MatrixXS temp = -1.0 * \n          ( (-1.0/(data.h*data.h)) * data.L0.array() + \n            (1.0/(data.h)) * data.Lvel0.array()\n            ).matrix();\n      MatrixXd temp_d = temp.template cast<double>();\n\n      MatrixXd temp_g = data.fgrav*(data.grav_mag*data.grav_dir);\n\n      assert(data.fext.rows() == temp_g.rows());\n      assert(data.fext.cols() == temp_g.cols());\n      MatrixXd temp2 = data.Mass_tilde * temp_d + temp_g + data.fext.template cast<double>();\n      MatrixXS temp2_f = temp2.template cast<SSCALAR>();\n      L_part1_dyn = data.Pi_1 * temp2_f;\n      L_part1.array() = L_part1.array() + L_part1_dyn.array();\n    }\n\n    //L_SSCALAR = L_part1 + L_part2and3;\n    assert(L_SSCALAR.rows() == L_part1.rows() && L_SSCALAR.rows() == L_part2and3.rows());\n    for (int i=0; i<L_SSCALAR.rows(); i++)\n    {\n      L_SSCALAR(i, 0) = L_part1(i, 0) + L_part2and3(i, 0);\n    }\n\n#ifdef EXTREME_VERBOSE\n    cout<<\"L=[\"<<endl<<L<<endl<<\"];\"<<endl;\n#endif  \n\n    if(data.print_timings)\n    {\n      sec_solve = get_seconds_hires();\n    }\n\n#ifndef IGL_ARAP_DOF_FIXED_ITERATIONS_COUNT\n    // Compute maximum absolute difference with last iteration's solution\n    max_diff = (L_SSCALAR-L_prev).eval().array().abs().matrix().maxCoeff();\n#endif\n    iters++;  \n\n    if(data.print_timings)\n    {\n      sec_end = get_seconds_hires();\n#ifndef WIN32\n      // trick to get sec_* variables to compile without warning on mac\n      if(false)\n#endif\n      printf(\n        \"\\ntotal iteration time = %f \"\n        \"[local: covGather = %f, \"\n        \"fitRotations = %f, \"\n        \"global: prep = %f, \"\n        \"solve = %f, \"\n        \"error = %f [ms]]\\n\", \n        (sec_end - sec_start)*1000.0, \n        (sec_covGather - sec_start)*1000.0, \n        (sec_fitRotations - sec_covGather)*1000.0, \n        (sec_prepMult - sec_fitRotations)*1000.0, \n        (sec_solve - sec_prepMult)*1000.0, \n        (sec_end - sec_solve)*1000.0 );\n    }\n  }\n\n\n  L = L_SSCALAR.template cast<double>();\n  assert(L.cols() == 1);\n\n#ifdef ARAP_GLOBAL_TIMING\n  double timer_finito = get_seconds_hires();\n  printf(\n    \"ARAP preparation = %f, \"\n    \"all %i iterations = %f [ms]\\n\", \n    (timer_prepFinished - timer_start)*1000.0, \n    max_iters, \n    (timer_finito - timer_prepFinished)*1000.0);  \n#endif\n\n  return true;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit instanciation\ntemplate bool igl::arap_dof_update<Eigen::Matrix<double, -1, -1, 0, -1, -1>, double>(ArapDOFData<Eigen::Matrix<double, -1, -1, 0, -1, -1>, double> const&, Eigen::Matrix<double, -1, 1, 0, -1, 1> const&, Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, int, double, Eigen::Matrix<double, -1, -1, 0, -1, -1>&);\ntemplate bool igl::arap_dof_recomputation<Eigen::Matrix<double, -1, -1, 0, -1, -1>, double>(Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, Eigen::SparseMatrix<double, 0, int> const&, ArapDOFData<Eigen::Matrix<double, -1, -1, 0, -1, -1>, double>&);\ntemplate bool igl::arap_dof_precomputation<Eigen::Matrix<double, -1, -1, 0, -1, -1>, double>(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, ArapDOFData<Eigen::Matrix<double, -1, -1, 0, -1, -1>, double>&);\ntemplate bool igl::arap_dof_update<Eigen::Matrix<double, -1, -1, 0, -1, -1>, float>(igl::ArapDOFData<Eigen::Matrix<double, -1, -1, 0, -1, -1>, float> const&, Eigen::Matrix<double, -1, 1, 0, -1, 1> const&, Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, int, double, Eigen::Matrix<double, -1, -1, 0, -1, -1>&);\ntemplate bool igl::arap_dof_recomputation<Eigen::Matrix<double, -1, -1, 0, -1, -1>, float>(Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, Eigen::SparseMatrix<double, 0, int> const&, igl::ArapDOFData<Eigen::Matrix<double, -1, -1, 0, -1, -1>, float>&);\ntemplate bool igl::arap_dof_precomputation<Eigen::Matrix<double, -1, -1, 0, -1, -1>, float>(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, 1, 0, -1, 1> const&, igl::ArapDOFData<Eigen::Matrix<double, -1, -1, 0, -1, -1>, float>&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/svd3x3/arap_dof.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_ARAP_ENERGY_TYPE_DOF_H\n#define IGL_ARAP_ENERGY_TYPE_DOF_H\n#include <igl/igl_inline.h>\n\n#include <Eigen/Dense>\n#include <Eigen/Sparse>\n#include <igl/ARAPEnergyType.h>\n#include <vector>\n\nnamespace igl\n{\n  // Caller example:\n  //\n  // Once:\n  // arap_dof_precomputation(...)\n  //\n  // Each frame:\n  // while(not satisfied)\n  //   arap_dof_update(...)\n  // end\n  \n  template <typename LbsMatrixType, typename SSCALAR>\n  struct ArapDOFData;\n  \n  ///////////////////////////////////////////////////////////////////////////\n  //\n  // Arap DOF precomputation consists of two parts the computation. The first is\n  // that which depends solely on the mesh (V,F), the linear blend skinning\n  // weights (M) and the groups G. Then there's the part that depends on the\n  // previous precomputation and the list of free and fixed vertices. \n  //\n  ///////////////////////////////////////////////////////////////////////////\n  \n  \n  // The code and variables differ from the description in Section 3 of \"Fast\n  // Automatic Skinning Transformations\" by [Jacobson et al. 2012]\n  // \n  // Here is a useful conversion table:\n  //\n  // [article]                             [code]\n  // S = \\tilde{K} T                       S = CSM * Lsep\n  // S --> R                               S --> R --shuffled--> Rxyz\n  // Gamma_solve RT = Pi_1 \\tilde{K} RT    L_part1xyz = CSolveBlock1 * Rxyz \n  // Pi_1 \\tilde{K}                        CSolveBlock1\n  // Peq = [T_full; P_pos]                 \n  // T_full                                B_eq_fix <--- L0\n  // P_pos                                 B_eq\n  // Pi_2 * P_eq =                         Lpart2and3 = Lpart2 + Lpart3\n  //   Pi_2_left T_full +                  Lpart3 = M_fullsolve(right) * B_eq_fix\n  //   Pi_2_right P_pos                    Lpart2 = M_fullsolve(left) * B_eq\n  // T = [Pi_1 Pi_2] [\\tilde{K}TRT P_eq]   L = Lpart1 + Lpart2and3\n  //\n  \n  // Precomputes the system we are going to optimize. This consists of building\n  // constructor matrices (to compute covariance matrices from transformations\n  // and to build the poisson solve right hand side from rotation matrix entries)\n  // and also prefactoring the poisson system.\n  //\n  // Inputs:\n  //   V  #V by dim list of vertex positions\n  //   F  #F by {3|4} list of face indices\n  //   M  #V * dim by #handles * dim * (dim+1) matrix such that\n  //     new_V(:) = LBS(V,W,A) = reshape(M * A,size(V)), where A is a column\n  //     vectors formed by the entries in each handle's dim by dim+1 \n  //     transformation matrix. Specifcally, A =\n  //       reshape(permute(Astack,[3 1 2]),n*dim*(dim+1),1)\n  //     or A = [Lxx;Lyx;Lxy;Lyy;tx;ty], and likewise for other dim\n  //     if Astack(:,:,i) is the dim by (dim+1) transformation at handle i\n  //     handles are ordered according to P then BE (point handles before bone\n  //     handles)\n  //   G  #V list of group indices (1 to k) for each vertex, such that vertex i \n  //     is assigned to group G(i)\n  // Outputs:\n  //   data  structure containing all necessary precomputation for calling\n  //     arap_dof_update\n  // Returns true on success, false on error\n  //\n  // See also: lbs_matrix_column\n  template <typename LbsMatrixType, typename SSCALAR>\n  IGL_INLINE bool arap_dof_precomputation(\n    const Eigen::MatrixXd & V, \n    const Eigen::MatrixXi & F,\n    const LbsMatrixType & M,\n    const Eigen::Matrix<int,Eigen::Dynamic,1> & G,\n    ArapDOFData<LbsMatrixType, SSCALAR> & data);\n  \n  // Should always be called after arap_dof_precomputation, but may be called in\n  // between successive calls to arap_dof_update, recomputes precomputation\n  // given that there are only changes in free and fixed\n  //\n  // Inputs:\n  //   fixed_dim  list of transformation element indices for fixed (or partailly\n  //   fixed) handles: not necessarily the complement of 'free'\n  //    NOTE: the constraints for fixed transformations still need to be\n  //    present in A_eq\n  //   A_eq  dim*#constraint_points by m*dim*(dim+1)  matrix of linear equality\n  //     constraint coefficients. Each row corresponds to a linear constraint,\n  //     so that A_eq * L = Beq says that the linear transformation entries in\n  //     the column L should produce the user supplied positional constraints\n  //     for each handle in Beq. The row A_eq(i*dim+d) corresponds to the\n  //     constrain on coordinate d of position i\n  // Outputs:\n  //   data  structure containing all necessary precomputation for calling\n  //     arap_dof_update\n  // Returns true on success, false on error\n  //\n  // See also: lbs_matrix_column\n  template <typename LbsMatrixType, typename SSCALAR>\n  IGL_INLINE bool arap_dof_recomputation(\n    const Eigen::Matrix<int,Eigen::Dynamic,1> & fixed_dim,\n    const Eigen::SparseMatrix<double> & A_eq,\n    ArapDOFData<LbsMatrixType, SSCALAR> & data);\n  \n  // Optimizes the transformations attached to each weight function based on\n  // precomputed system.\n  //\n  // Inputs:\n  //   data  precomputation data struct output from arap_dof_precomputation\n  //   Beq  dim*#constraint_points constraint values.\n  //   L0  #handles * dim * dim+1 list of initial guess transformation entries,\n  //     also holds fixed transformation entries for fixed handles\n  //   max_iters  maximum number of iterations\n  //   tol  stopping critera parameter. If variables (linear transformation\n  //     matrix entries) change by less than 'tol' the optimization terminates,\n  //       0.75 (weak tolerance)\n  //       0.0 (extreme tolerance)\n  // Outputs:\n  //   L  #handles * dim * dim+1 list of final optimized transformation entries,\n  //     allowed to be the same as L\n  template <typename LbsMatrixType, typename SSCALAR>\n  IGL_INLINE bool arap_dof_update(\n    const ArapDOFData<LbsMatrixType,SSCALAR> & data,\n    const Eigen::Matrix<double,Eigen::Dynamic,1> & B_eq,\n    const Eigen::MatrixXd & L0,\n    const int max_iters,\n    const double tol,\n    Eigen::MatrixXd & L\n    );\n  \n  // Structure that contains fields for all precomputed data or data that needs\n  // to be remembered at update\n  template <typename LbsMatrixType, typename SSCALAR>\n  struct ArapDOFData\n  {\n    typedef Eigen::Matrix<SSCALAR, Eigen::Dynamic, Eigen::Dynamic> MatrixXS;\n    // Type of arap energy we're solving\n    igl::ARAPEnergyType energy;\n    //// LU decomposition precomptation data; note: not used by araf_dop_update\n    //// any more, replaced by M_FullSolve\n    //igl::min_quad_with_fixed_data<double> lu_data;\n    // List of indices of fixed transformation entries\n    Eigen::Matrix<int,Eigen::Dynamic,1> fixed_dim;\n    // List of precomputed covariance scatter matrices multiplied by lbs\n    // matrices\n    //std::vector<Eigen::SparseMatrix<double> > CSM_M;\n    std::vector<Eigen::MatrixXd> CSM_M;\n    LbsMatrixType M_KG;\n    // Number of mesh vertices\n    int n;\n    // Number of weight functions\n    int m;\n    // Number of dimensions\n    int dim;\n    // Effective dimensions\n    int effective_dim;\n    // List of indices into C of positional constraints\n    Eigen::Matrix<int,Eigen::Dynamic,1> interpolated;\n    std::vector<bool> free_mask;\n    // Full quadratic coefficients matrix before lagrangian (should be dense)\n    LbsMatrixType Q;\n  \n  \n    //// Solve matrix for the global step\n    //Eigen::MatrixXd M_Solve; // TODO: remove from here\n  \n    // Full solve matrix that contains also conversion from rotations to the right hand side, \n    // i.e., solves Poisson transformations just from rotations and positional constraints\n    MatrixXS M_FullSolve;\n  \n    // Precomputed condensed matrices (3x3 commutators folded to 1x1):\n    MatrixXS CSM;\n    MatrixXS CSolveBlock1;\n  \n    // Print timings at each update\n    bool print_timings;\n  \n    // Dynamics\n    bool with_dynamics;\n    // I'm hiding the extra dynamics stuff in this struct, which sort of defeats\n    // the purpose of this function-based coding style...\n  \n    // Time step\n    double h;\n  \n    // L0  #handles * dim * dim+1 list of transformation entries from\n    // previous solve\n    MatrixXS L0;\n    //// Lm1  #handles * dim * dim+1 list of transformation entries from\n    //// previous-previous solve\n    //MatrixXS Lm1;\n    // \"Velocity\"\n    MatrixXS Lvel0;\n  \n    // #V by dim matrix of external forces\n    // fext\n    MatrixXS fext;\n  \n    // Mass_tilde: MT * Mass * M\n    LbsMatrixType Mass_tilde;\n  \n    // Force due to gravity (premultiplier)\n    Eigen::MatrixXd fgrav;\n    // Direction of gravity\n    Eigen::Vector3d grav_dir;\n    // Magnitude of gravity\n    double grav_mag;\n    \n    // Π1 from the paper\n    MatrixXS Pi_1;\n  \n    // Default values\n    ArapDOFData(): \n      energy(igl::ARAP_ENERGY_TYPE_SPOKES), \n      with_dynamics(false),\n      h(1),\n      grav_dir(0,-1,0),\n      grav_mag(0)\n    {\n    }\n  };\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"arap_dof.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/svd3x3/fit_rotations.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"fit_rotations.h\"\n#include \"polar_svd3x3.h\"\n#include <igl/repmat.h>\n#include <igl/verbose.h>\n#include <igl/polar_dec.h>\n#include <igl/polar_svd.h>\n#include <igl/matlab_format.h>\n#include <igl/C_STR.h>\n#include <iostream>\n\ntemplate <typename DerivedS, typename DerivedD>\nIGL_INLINE void igl::fit_rotations(\n  const Eigen::PlainObjectBase<DerivedS> & S,\n  const bool single_precision,\n  Eigen::PlainObjectBase<DerivedD> & R)\n{\n  using namespace std;\n  const int dim = S.cols();\n  const int nr = S.rows()/dim;\n  assert(nr * dim == S.rows());\n  assert(dim == 3);\n\n  // resize output\n  R.resize(dim,dim*nr); // hopefully no op (should be already allocated)\n\n  //std::cout<<\"S=[\"<<std::endl<<S<<std::endl<<\"];\"<<std::endl;\n  //MatrixXd si(dim,dim);\n  Eigen::Matrix<typename DerivedS::Scalar,3,3> si;// = Eigen::Matrix3d::Identity();\n  // loop over number of rotations we're computing\n  for(int r = 0;r<nr;r++)\n  {\n    // build this covariance matrix\n    for(int i = 0;i<dim;i++)\n    {\n      for(int j = 0;j<dim;j++)\n      {\n        si(i,j) = S(i*nr+r,j);\n      }\n    }\n    typedef Eigen::Matrix<typename DerivedD::Scalar,3,3> Mat3;\n    typedef Eigen::Matrix<typename DerivedD::Scalar,3,1> Vec3;\n    Mat3 ri;\n    if(single_precision)\n    {\n      polar_svd3x3(si, ri);\n    }else\n    {\n      Mat3 ti,ui,vi;\n      Vec3 _;\n      igl::polar_svd(si,ri,ti,ui,_,vi);\n    }\n    assert(ri.determinant() >= 0);\n    R.block(0,r*dim,dim,dim) = ri.block(0,0,dim,dim).transpose();\n    //cout<<matlab_format(si,C_STR(\"si_\"<<r))<<endl;\n    //cout<<matlab_format(ri.transpose().eval(),C_STR(\"ri_\"<<r))<<endl;\n  }\n}\n\ntemplate <typename DerivedS, typename DerivedD>\nIGL_INLINE void igl::fit_rotations_planar(\n  const Eigen::PlainObjectBase<DerivedS> & S,\n        Eigen::PlainObjectBase<DerivedD> & R)\n{ \n  using namespace std;\n  const int dim = S.cols();\n  const int nr = S.rows()/dim;\n  assert(dim == 2 && \"_planar input should be 2D\");\n  assert(nr * dim == S.rows());\n\n  // resize output\n  R.resize(dim,dim*nr); // hopefully no op (should be already allocated)\n\n  Eigen::Matrix<typename DerivedS::Scalar,2,2> si;\n  // loop over number of rotations we're computing\n  for(int r = 0;r<nr;r++)\n  {\n    // build this covariance matrix\n    for(int i = 0;i<2;i++)\n    {\n      for(int j = 0;j<2;j++)\n      {\n        si(i,j) = S(i*nr+r,j);\n      }\n    }\n    typedef Eigen::Matrix<typename DerivedD::Scalar,2,2> Mat2;\n    typedef Eigen::Matrix<typename DerivedD::Scalar,2,1> Vec2;\n    Mat2 ri,ti,ui,vi;\n    Vec2 _;\n    igl::polar_svd(si,ri,ti,ui,_,vi);\n#ifndef FIT_ROTATIONS_ALLOW_FLIPS\n    // Check for reflection\n    if(ri.determinant() < 0)\n    {\n      vi.col(1) *= -1.;\n      ri = ui * vi.transpose();\n    }\n    assert(ri.determinant() >= 0);\n#endif  \n\n    // Not sure why polar_dec computes transpose...\n    R.block(0,r*dim,2,2) = ri.transpose();\n  }\n}\n\n\n#ifdef __SSE__\nIGL_INLINE void igl::fit_rotations_SSE(\n  const Eigen::MatrixXf & S, \n  Eigen::MatrixXf & R)\n{\n  const int cStep = 4;\n\n  assert(S.cols() == 3);\n  const int dim = 3; //S.cols();\n  const int nr = S.rows()/dim;  \n  assert(nr * dim == S.rows());\n\n  // resize output\n  R.resize(dim,dim*nr); // hopefully no op (should be already allocated)\n\n  Eigen::Matrix<float, 3*cStep, 3> siBig;\n  // using SSE decompose cStep matrices at a time:\n  int r = 0;\n  for( ; r<nr; r+=cStep)\n  {\n    int numMats = cStep;\n    if (r + cStep >= nr) numMats = nr - r;\n    // build siBig:\n    for (int k=0; k<numMats; k++)\n    {\n      for(int i = 0;i<dim;i++)\n      {\n        for(int j = 0;j<dim;j++)\n        {\n          siBig(i + 3*k, j) = S(i*nr + r + k, j);\n        }\n      }\n    }\n    Eigen::Matrix<float, 3*cStep, 3> ri;\n    polar_svd3x3_sse(siBig, ri);    \n\n    for (int k=0; k<cStep; k++)\n      assert(ri.block(3*k, 0, 3, 3).determinant() >= 0);\n\n    // Not sure why polar_dec computes transpose...\n    for (int k=0; k<numMats; k++)\n    {\n      R.block(0, (r + k)*dim, dim, dim) = ri.block(3*k, 0, dim, dim).transpose();\n    }    \n  }\n}\n\nIGL_INLINE void igl::fit_rotations_SSE(\n  const Eigen::MatrixXd & S,\n  Eigen::MatrixXd & R)\n{\n  const Eigen::MatrixXf Sf = S.cast<float>();\n  Eigen::MatrixXf Rf;\n  fit_rotations_SSE(Sf,Rf);\n  R = Rf.cast<double>();\n}\n#endif\n\n#ifdef __AVX__\nIGL_INLINE void igl::fit_rotations_AVX(\n  const Eigen::MatrixXf & S,\n  Eigen::MatrixXf & R)\n{\n  const int cStep = 8;\n\n  assert(S.cols() == 3);\n  const int dim = 3; //S.cols();\n  const int nr = S.rows()/dim;  \n  assert(nr * dim == S.rows());\n\n  // resize output\n  R.resize(dim,dim*nr); // hopefully no op (should be already allocated)\n\n  Eigen::Matrix<float, 3*cStep, 3> siBig;\n  // using SSE decompose cStep matrices at a time:\n  int r = 0;\n  for( ; r<nr; r+=cStep)\n  {\n    int numMats = cStep;\n    if (r + cStep >= nr) numMats = nr - r;\n    // build siBig:\n    for (int k=0; k<numMats; k++)\n    {\n      for(int i = 0;i<dim;i++)\n      {\n        for(int j = 0;j<dim;j++)\n        {\n          siBig(i + 3*k, j) = S(i*nr + r + k, j);\n        }\n      }\n    }\n    Eigen::Matrix<float, 3*cStep, 3> ri;\n    polar_svd3x3_avx(siBig, ri);    \n\n    for (int k=0; k<cStep; k++)\n      assert(ri.block(3*k, 0, 3, 3).determinant() >= 0);\n\n    // Not sure why polar_dec computes transpose...\n    for (int k=0; k<numMats; k++)\n    {\n      R.block(0, (r + k)*dim, dim, dim) = ri.block(3*k, 0, dim, dim).transpose();\n    }    \n  }\n}\n#endif\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instanciation\ntemplate void igl::fit_rotations<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::fit_rotations_planar<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::fit_rotations_planar<Eigen::Matrix<float, -1, -1, 0, -1, -1>, Eigen::Matrix<float, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<float, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/svd3x3/fit_rotations.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_FIT_ROTATIONS_H\n#define IGL_FIT_ROTATIONS_H\n#include <igl/igl_inline.h>\n#include <Eigen/Core>\n\nnamespace igl\n{\n  // FIT_ROTATIONS Given an input mesh and new positions find rotations for\n  // every covariance matrix in a stack of covariance matrices\n  // \n  // Inputs:\n  //   S  nr*dim by dim stack of covariance matrices\n  //   single_precision  whether to use single precision (faster)\n  // Outputs:\n  //   R  dim by dim * nr list of rotations\n  //\n  template <typename DerivedS, typename DerivedD>\n  IGL_INLINE void fit_rotations(\n    const Eigen::PlainObjectBase<DerivedS> & S,\n    const bool single_precision,\n          Eigen::PlainObjectBase<DerivedD> & R);\n  \n  // FIT_ROTATIONS Given an input mesh and new positions find 2D rotations for\n  // every vertex that best maps its one ring to the new one ring\n  // \n  // Inputs:\n  //   S  nr*dim by dim stack of covariance matrices, third column and every\n  //   third row will be ignored\n  // Outputs:\n  //   R  dim by dim * nr list of rotations, third row and third column of each\n  //   rotation will just be identity\n  //\n  template <typename DerivedS, typename DerivedD>\n  IGL_INLINE void fit_rotations_planar(\n    const Eigen::PlainObjectBase<DerivedS> & S,\n          Eigen::PlainObjectBase<DerivedD> & R);\n#ifdef __SSE__\n  IGL_INLINE void fit_rotations_SSE( const Eigen::MatrixXf & S, Eigen::MatrixXf & R);\n  IGL_INLINE void fit_rotations_SSE( const Eigen::MatrixXd & S, Eigen::MatrixXd & R);\n#endif\n#ifdef __AVX__\n  IGL_INLINE void fit_rotations_AVX( const Eigen::MatrixXf & S, Eigen::MatrixXf & R);\n#endif\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"fit_rotations.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/svd3x3/polar_svd3x3.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"polar_svd3x3.h\"\n#include \"svd3x3.h\"\n#ifdef __SSE__\n#  include \"svd3x3_sse.h\"\n#endif\n#ifdef __AVX__\n#  include \"svd3x3_avx.h\"\n#endif\n\ntemplate<typename Mat>\nIGL_INLINE void igl::polar_svd3x3(const Mat& A, Mat& R)\n{\n  // should be caught at compile time, but just to be 150% sure:\n  assert(A.rows() == 3 && A.cols() == 3);\n\n  Eigen::Matrix<typename Mat::Scalar, 3, 3> U, Vt;\n  Eigen::Matrix<typename Mat::Scalar, 3, 1> S;  \n  svd3x3(A, U, S, Vt);\n  R = U * Vt.transpose();\n}\n\n#ifdef __SSE__\ntemplate<typename T>\nIGL_INLINE void igl::polar_svd3x3_sse(const Eigen::Matrix<T, 3*4, 3>& A, Eigen::Matrix<T, 3*4, 3> &R)\n{\n  // should be caught at compile time, but just to be 150% sure:\n  assert(A.rows() == 3*4 && A.cols() == 3);\n\n  Eigen::Matrix<T, 3*4, 3> U, Vt;\n  Eigen::Matrix<T, 3*4, 1> S;  \n  svd3x3_sse(A, U, S, Vt);\n\n  for (int k=0; k<4; k++)\n  {\n    R.block(3*k, 0, 3, 3) = U.block(3*k, 0, 3, 3) * Vt.block(3*k, 0, 3, 3).transpose();\n  }\n\n  //// test:\n  //for (int k=0; k<4; k++)\n  //{\n  //  Eigen::Matrix3f Apart = A.block(3*k, 0, 3, 3);\n  //  Eigen::Matrix3f Rpart;\n  //  polar_svd3x3(Apart, Rpart);\n\n  //  Eigen::Matrix3f Rpart_SSE = R.block(3*k, 0, 3, 3);\n  //  Eigen::Matrix3f diff = Rpart - Rpart_SSE;\n  //  float diffNorm = diff.norm();\n\n  //  int hu = 1;\n  //}\n  //// eof test\n}\n#endif\n\n#ifdef __AVX__\ntemplate<typename T>\nIGL_INLINE void igl::polar_svd3x3_avx(const Eigen::Matrix<T, 3*8, 3>& A, Eigen::Matrix<T, 3*8, 3> &R)\n{\n  // should be caught at compile time, but just to be 150% sure:\n  assert(A.rows() == 3*8 && A.cols() == 3);\n\n  Eigen::Matrix<T, 3*8, 3> U, Vt;\n  Eigen::Matrix<T, 3*8, 1> S;  \n  svd3x3_avx(A, U, S, Vt);\n\n  for (int k=0; k<8; k++)\n  {\n    R.block(3*k, 0, 3, 3) = U.block(3*k, 0, 3, 3) * Vt.block(3*k, 0, 3, 3).transpose();\n  }\n\n  // test:\n  for (int k=0; k<8; k++)\n  {\n    Eigen::Matrix3f Apart = A.block(3*k, 0, 3, 3);\n    Eigen::Matrix3f Rpart;\n    polar_svd3x3(Apart, Rpart);\n\n    Eigen::Matrix3f Rpart_SSE = R.block(3*k, 0, 3, 3);\n    Eigen::Matrix3f diff = Rpart - Rpart_SSE;\n    float diffNorm = diff.norm();\n    if (abs(diffNorm) > 0.001) \n    {\n      printf(\"Huh: diffNorm = %15f (k = %i)\\n\", diffNorm, k);\n    }\n\n    // Unused\n    //int hu = 1;\n  }\n  // eof test\n}\n#endif\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instanciation\ntemplate void igl::polar_svd3x3<Eigen::Matrix<double, 3, 3, 0, 3, 3> >(Eigen::Matrix<double, 3, 3, 0, 3, 3> const&, Eigen::Matrix<double, 3, 3, 0, 3, 3>&);\n\n#ifdef __SSE__\ntemplate void igl::polar_svd3x3_sse<float>(Eigen::Matrix<float, 12, 3, 0, 12, 3> const&, Eigen::Matrix<float, 12, 3, 0, 12, 3>&);\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/svd3x3/polar_svd3x3.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_POLAR_SVD3X3_H\n#define IGL_POLAR_SVD3X3_H\n#include <Eigen/Core>\n#include <igl/igl_inline.h>\nnamespace igl\n{\n  // Computes the closest rotation to input matrix A using specialized 3x3 SVD\n  // singular value decomposition (WunderSVD3x3)\n  //\n  // Inputs:\n  //   A  3 by 3 matrix to be decomposed\n  // Outputs:\n  //   R  3 by 3 closest element in SO(3) (closeness in terms of Frobenius\n  //   metric)\n  //\n  //  This means that det(R) = 1. Technically it's not polar decomposition\n  //  which guarantees positive semidefinite stretch factor (at the cost of\n  //  having det(R) = -1). \"• The orthogonal factors U and V will be true\n  //  rotation matrices...\" [McAdams, Selle, Tamstorf, Teran, Sefakis 2011]\n  //\n  template<typename Mat>\n  IGL_INLINE void polar_svd3x3(const Mat& A, Mat& R);\n  #ifdef __SSE__\n  template<typename T>\n  IGL_INLINE void polar_svd3x3_sse(const Eigen::Matrix<T, 3*4, 3>& A, Eigen::Matrix<T, 3*4, 3> &R);\n  #endif\n  #ifdef __AVX__\n  template<typename T>\n  IGL_INLINE void polar_svd3x3_avx(const Eigen::Matrix<T, 3*8, 3>& A, Eigen::Matrix<T, 3*8, 3> &R);\n  #endif\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"polar_svd3x3.cpp\"\n#endif\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/svd3x3/svd3x3.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"svd3x3.h\"\n\n#include <cmath>\n#include <algorithm>\n\n#define USE_SCALAR_IMPLEMENTATION\n#undef USE_SSE_IMPLEMENTATION\n#undef USE_AVX_IMPLEMENTATION\n#define COMPUTE_U_AS_MATRIX\n#define COMPUTE_V_AS_MATRIX\n#include <Singular_Value_Decomposition_Preamble.hpp>\n\n#pragma runtime_checks( \"u\", off )  // disable runtime asserts on xor eax,eax type of stuff (doesn't always work, disable explicitly in compiler settings)\ntemplate<typename T>\nIGL_INLINE void igl::svd3x3(const Eigen::Matrix<T, 3, 3>& A, Eigen::Matrix<T, 3, 3> &U, Eigen::Matrix<T, 3, 1> &S, Eigen::Matrix<T, 3, 3>&V)\n{\n  // this code only supports the scalar version (otherwise we'd need to pass arrays of matrices)  \n\n#include <Singular_Value_Decomposition_Kernel_Declarations.hpp>\n\n  ENABLE_SCALAR_IMPLEMENTATION(Sa11.f=A(0,0);)                                      ENABLE_SSE_IMPLEMENTATION(Va11=_mm_loadu_ps(a11);)                                  ENABLE_AVX_IMPLEMENTATION(Va11=_mm256_loadu_ps(a11);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa21.f=A(1,0);)                                      ENABLE_SSE_IMPLEMENTATION(Va21=_mm_loadu_ps(a21);)                                  ENABLE_AVX_IMPLEMENTATION(Va21=_mm256_loadu_ps(a21);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa31.f=A(2,0);)                                      ENABLE_SSE_IMPLEMENTATION(Va31=_mm_loadu_ps(a31);)                                  ENABLE_AVX_IMPLEMENTATION(Va31=_mm256_loadu_ps(a31);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa12.f=A(0,1);)                                      ENABLE_SSE_IMPLEMENTATION(Va12=_mm_loadu_ps(a12);)                                  ENABLE_AVX_IMPLEMENTATION(Va12=_mm256_loadu_ps(a12);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa22.f=A(1,1);)                                      ENABLE_SSE_IMPLEMENTATION(Va22=_mm_loadu_ps(a22);)                                  ENABLE_AVX_IMPLEMENTATION(Va22=_mm256_loadu_ps(a22);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa32.f=A(2,1);)                                      ENABLE_SSE_IMPLEMENTATION(Va32=_mm_loadu_ps(a32);)                                  ENABLE_AVX_IMPLEMENTATION(Va32=_mm256_loadu_ps(a32);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa13.f=A(0,2);)                                      ENABLE_SSE_IMPLEMENTATION(Va13=_mm_loadu_ps(a13);)                                  ENABLE_AVX_IMPLEMENTATION(Va13=_mm256_loadu_ps(a13);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa23.f=A(1,2);)                                      ENABLE_SSE_IMPLEMENTATION(Va23=_mm_loadu_ps(a23);)                                  ENABLE_AVX_IMPLEMENTATION(Va23=_mm256_loadu_ps(a23);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa33.f=A(2,2);)                                      ENABLE_SSE_IMPLEMENTATION(Va33=_mm_loadu_ps(a33);)                                  ENABLE_AVX_IMPLEMENTATION(Va33=_mm256_loadu_ps(a33);)\n\n#include <Singular_Value_Decomposition_Main_Kernel_Body.hpp>\n\n    ENABLE_SCALAR_IMPLEMENTATION(U(0,0)=Su11.f;)                                      ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(u11,Vu11);)                                 ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(u11,Vu11);)\n    ENABLE_SCALAR_IMPLEMENTATION(U(1,0)=Su21.f;)                                      ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(u21,Vu21);)                                 ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(u21,Vu21);)\n    ENABLE_SCALAR_IMPLEMENTATION(U(2,0)=Su31.f;)                                      ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(u31,Vu31);)                                 ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(u31,Vu31);)\n    ENABLE_SCALAR_IMPLEMENTATION(U(0,1)=Su12.f;)                                      ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(u12,Vu12);)                                 ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(u12,Vu12);)\n    ENABLE_SCALAR_IMPLEMENTATION(U(1,1)=Su22.f;)                                      ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(u22,Vu22);)                                 ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(u22,Vu22);)\n    ENABLE_SCALAR_IMPLEMENTATION(U(2,1)=Su32.f;)                                      ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(u32,Vu32);)                                 ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(u32,Vu32);)\n    ENABLE_SCALAR_IMPLEMENTATION(U(0,2)=Su13.f;)                                      ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(u13,Vu13);)                                 ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(u13,Vu13);)\n    ENABLE_SCALAR_IMPLEMENTATION(U(1,2)=Su23.f;)                                      ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(u23,Vu23);)                                 ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(u23,Vu23);)\n    ENABLE_SCALAR_IMPLEMENTATION(U(2,2)=Su33.f;)                                      ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(u33,Vu33);)                                 ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(u33,Vu33);)\n\n    ENABLE_SCALAR_IMPLEMENTATION(V(0,0)=Sv11.f;)                                      ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(v11,Vv11);)                                 ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(v11,Vv11);)\n    ENABLE_SCALAR_IMPLEMENTATION(V(1,0)=Sv21.f;)                                      ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(v21,Vv21);)                                 ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(v21,Vv21);)\n    ENABLE_SCALAR_IMPLEMENTATION(V(2,0)=Sv31.f;)                                      ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(v31,Vv31);)                                 ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(v31,Vv31);)\n    ENABLE_SCALAR_IMPLEMENTATION(V(0,1)=Sv12.f;)                                      ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(v12,Vv12);)                                 ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(v12,Vv12);)\n    ENABLE_SCALAR_IMPLEMENTATION(V(1,1)=Sv22.f;)                                      ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(v22,Vv22);)                                 ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(v22,Vv22);)\n    ENABLE_SCALAR_IMPLEMENTATION(V(2,1)=Sv32.f;)                                      ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(v32,Vv32);)                                 ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(v32,Vv32);)\n    ENABLE_SCALAR_IMPLEMENTATION(V(0,2)=Sv13.f;)                                      ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(v13,Vv13);)                                 ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(v13,Vv13);)\n    ENABLE_SCALAR_IMPLEMENTATION(V(1,2)=Sv23.f;)                                      ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(v23,Vv23);)                                 ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(v23,Vv23);)\n    ENABLE_SCALAR_IMPLEMENTATION(V(2,2)=Sv33.f;)                                      ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(v33,Vv33);)                                 ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(v33,Vv33);)\n\n    ENABLE_SCALAR_IMPLEMENTATION(S(0,0)=Sa11.f;)                                   ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(sigma1,Va11);)                              ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(sigma1,Va11);)\n    ENABLE_SCALAR_IMPLEMENTATION(S(1,0)=Sa22.f;)                                   ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(sigma2,Va22);)                              ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(sigma2,Va22);)\n    ENABLE_SCALAR_IMPLEMENTATION(S(2,0)=Sa33.f;)                                   ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(sigma3,Va33);)                              ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(sigma3,Va33);)\n}\n#pragma runtime_checks( \"u\", restore ) \n\n// forced instantiation\ntemplate void igl::svd3x3(const Eigen::Matrix<float, 3, 3>& A, Eigen::Matrix<float, 3, 3> &U, Eigen::Matrix<float, 3, 1> &S, Eigen::Matrix<float, 3, 3>&V);\ntemplate void igl::svd3x3<double>(Eigen::Matrix<double, 3, 3, 0, 3, 3> const&, Eigen::Matrix<double, 3, 3, 0, 3, 3>&, Eigen::Matrix<double, 3, 1, 0, 3, 1>&, Eigen::Matrix<double, 3, 3, 0, 3, 3>&);\n// doesn't even make sense with double because this SVD code is only single precision anyway...\n"
  },
  {
    "path": "libs/libigl/include/igl/svd3x3/svd3x3.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_SVD3X3_H\n#define IGL_SVD3X3_H\n#include <igl/igl_inline.h>\n#include <Eigen/Dense>\n\nnamespace igl\n{\n  // Super fast 3x3 SVD according to http://pages.cs.wisc.edu/~sifakis/project_pages/svd.html\n  // The resulting decomposition is A = U * diag(S[0], S[1], S[2]) * V'\n  // BEWARE: this SVD algorithm guarantees that det(U) = det(V) = 1, but this \n  // comes at the cost that 'sigma3' can be negative\n  // for computing polar decomposition it's great because all we need to do is U*V'\n  // and the result will automatically have positive determinant\n  //\n  // Inputs:\n  //   A  3x3 matrix\n  // Outputs:\n  //   U  3x3 left singular vectors\n  //   S  3x1 singular values\n  //   V  3x3 right singular vectors\n  //\n  // Known bugs: this will not work correctly for double precision.\n  template<typename T>\n  IGL_INLINE void svd3x3(\n    const Eigen::Matrix<T, 3, 3>& A, \n    Eigen::Matrix<T, 3, 3> &U, \n    Eigen::Matrix<T, 3, 1> &S, \n    Eigen::Matrix<T, 3, 3>&V);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"svd3x3.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/svd3x3/svd3x3_avx.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifdef __AVX__\n#include \"svd3x3_avx.h\"\n\n#include <cmath>\n#include <algorithm>\n\n#undef USE_SCALAR_IMPLEMENTATION\n#undef USE_SSE_IMPLEMENTATION\n#define USE_AVX_IMPLEMENTATION\n#define COMPUTE_U_AS_MATRIX\n#define COMPUTE_V_AS_MATRIX\n#include \"Singular_Value_Decomposition_Preamble.hpp\"\n\n#pragma runtime_checks( \"u\", off )  // disable runtime asserts on xor eax,eax type of stuff (doesn't always work, disable explicitly in compiler settings)\ntemplate<typename T>\nIGL_INLINE void igl::svd3x3_avx(\n  const Eigen::Matrix<T, 3*8, 3>& A, \n  Eigen::Matrix<T, 3*8, 3> &U, \n  Eigen::Matrix<T, 3*8, 1> &S, \n  Eigen::Matrix<T, 3*8, 3>&V)\n{\n  // this code assumes USE_AVX_IMPLEMENTATION is defined \n  float Ashuffle[9][8], Ushuffle[9][8], Vshuffle[9][8], Sshuffle[3][8];\n  for (int i=0; i<3; i++)\n  {\n    for (int j=0; j<3; j++)\n    {\n      for (int k=0; k<8; k++)\n      {\n        Ashuffle[i + j*3][k] = A(i + 3*k, j);\n      }\n    }\n  }\n\n#include \"Singular_Value_Decomposition_Kernel_Declarations.hpp\"\n\n  ENABLE_AVX_IMPLEMENTATION(Va11=_mm256_loadu_ps(Ashuffle[0]);)\n  ENABLE_AVX_IMPLEMENTATION(Va21=_mm256_loadu_ps(Ashuffle[1]);)\n  ENABLE_AVX_IMPLEMENTATION(Va31=_mm256_loadu_ps(Ashuffle[2]);)\n  ENABLE_AVX_IMPLEMENTATION(Va12=_mm256_loadu_ps(Ashuffle[3]);)\n  ENABLE_AVX_IMPLEMENTATION(Va22=_mm256_loadu_ps(Ashuffle[4]);)\n  ENABLE_AVX_IMPLEMENTATION(Va32=_mm256_loadu_ps(Ashuffle[5]);)\n  ENABLE_AVX_IMPLEMENTATION(Va13=_mm256_loadu_ps(Ashuffle[6]);)\n  ENABLE_AVX_IMPLEMENTATION(Va23=_mm256_loadu_ps(Ashuffle[7]);)\n  ENABLE_AVX_IMPLEMENTATION(Va33=_mm256_loadu_ps(Ashuffle[8]);)\n\n#include \"Singular_Value_Decomposition_Main_Kernel_Body.hpp\"\n\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Ushuffle[0],Vu11);)\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Ushuffle[1],Vu21);)\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Ushuffle[2],Vu31);)\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Ushuffle[3],Vu12);)\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Ushuffle[4],Vu22);)\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Ushuffle[5],Vu32);)\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Ushuffle[6],Vu13);)\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Ushuffle[7],Vu23);)\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Ushuffle[8],Vu33);)\n\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Vshuffle[0],Vv11);)\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Vshuffle[1],Vv21);)\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Vshuffle[2],Vv31);)\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Vshuffle[3],Vv12);)\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Vshuffle[4],Vv22);)\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Vshuffle[5],Vv32);)\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Vshuffle[6],Vv13);)\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Vshuffle[7],Vv23);)\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Vshuffle[8],Vv33);)\n\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Sshuffle[0],Va11);)\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Sshuffle[1],Va22);)\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Sshuffle[2],Va33);)\n\n  for (int i=0; i<3; i++)\n  {\n    for (int j=0; j<3; j++)\n    {\n      for (int k=0; k<8; k++)\n      {\n        U(i + 3*k, j) = Ushuffle[i + j*3][k];\n        V(i + 3*k, j) = Vshuffle[i + j*3][k];\n      }\n    }\n  }\n\n  for (int i=0; i<3; i++)\n  {\n    for (int k=0; k<8; k++)\n    {\n      S(i + 3*k, 0) = Sshuffle[i][k];\n    }\n  }\n}\n#pragma runtime_checks( \"u\", restore )\n\n#ifdef IGL_STATIC_LIBRARY\n// forced instantiation\ntemplate void igl::svd3x3_avx(const Eigen::Matrix<float, 3*8, 3>& A, Eigen::Matrix<float, 3*8, 3> &U, Eigen::Matrix<float, 3*8, 1> &S, Eigen::Matrix<float, 3*8, 3>&V);\n// doesn't even make sense with double because the wunder-SVD code is only single precision anyway...\ntemplate void igl::svd3x3_avx<float>(Eigen::Matrix<float, 24, 3, 0, 24, 3> const&, Eigen::Matrix<float, 24, 3, 0, 24, 3>&, Eigen::Matrix<float, 24, 1, 0, 24, 1>&, Eigen::Matrix<float, 24, 3, 0, 24, 3>&);\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/svd3x3/svd3x3_avx.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_SVD3X3_AVX_H\n#define IGL_SVD3X3_AVX_H\n#include <igl/igl_inline.h>\n#include <Eigen/Dense>\n\nnamespace igl\n{\n  // Super fast 3x3 SVD according to\n  // http://pages.cs.wisc.edu/~sifakis/project_pages/svd.html This is AVX\n  // version of svd3x3 (see svd3x3.h) which works on 8 matrices at a time These\n  // eight matrices are simply stacked in columns, the rest is the same as for\n  // svd3x3\n  //\n  // Inputs:\n  //   A  12 by 3 stack of 3x3 matrices\n  // Outputs:\n  //   U  12x3 left singular vectors stacked\n  //   S  12x1 singular values stacked\n  //   V  12x3 right singular vectors stacked\n  //\n  // Known bugs: this will not work correctly for double precision.\n  template<typename T>\n  IGL_INLINE void svd3x3_avx(\n    const Eigen::Matrix<T, 3*8, 3>& A, \n    Eigen::Matrix<T, 3*8, 3> &U, \n    Eigen::Matrix<T, 3*8, 1> &S, \n    Eigen::Matrix<T, 3*8, 3>&V);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"svd3x3_avx.cpp\"\n#endif\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/svd3x3/svd3x3_sse.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifdef __SSE__\n#include \"svd3x3_sse.h\"\n\n#include <cmath>\n#include <algorithm>\n\n#undef USE_SCALAR_IMPLEMENTATION\n#define USE_SSE_IMPLEMENTATION\n#undef USE_AVX_IMPLEMENTATION\n#define COMPUTE_U_AS_MATRIX\n#define COMPUTE_V_AS_MATRIX\n#include \"Singular_Value_Decomposition_Preamble.hpp\"\n\n// disable runtime asserts on xor eax,eax type of stuff (doesn't always work,\n// disable explicitly in compiler settings)\n#pragma runtime_checks( \"u\", off )  \ntemplate<typename T>\nIGL_INLINE void igl::svd3x3_sse(\n  const Eigen::Matrix<T, 3*4, 3>& A, \n  Eigen::Matrix<T, 3*4, 3> &U, \n  Eigen::Matrix<T, 3*4, 1> &S, \n  Eigen::Matrix<T, 3*4, 3>&V)\n{\n  // this code assumes USE_SSE_IMPLEMENTATION is defined \n  float Ashuffle[9][4], Ushuffle[9][4], Vshuffle[9][4], Sshuffle[3][4];\n  for (int i=0; i<3; i++)\n  {\n    for (int j=0; j<3; j++)\n    {\n      for (int k=0; k<4; k++)\n      {\n        Ashuffle[i + j*3][k] = A(i + 3*k, j);\n      }\n    }\n  }\n\n#include \"Singular_Value_Decomposition_Kernel_Declarations.hpp\"\n\n  ENABLE_SSE_IMPLEMENTATION(Va11=_mm_loadu_ps(Ashuffle[0]);)\n  ENABLE_SSE_IMPLEMENTATION(Va21=_mm_loadu_ps(Ashuffle[1]);)\n  ENABLE_SSE_IMPLEMENTATION(Va31=_mm_loadu_ps(Ashuffle[2]);)\n  ENABLE_SSE_IMPLEMENTATION(Va12=_mm_loadu_ps(Ashuffle[3]);)\n  ENABLE_SSE_IMPLEMENTATION(Va22=_mm_loadu_ps(Ashuffle[4]);)\n  ENABLE_SSE_IMPLEMENTATION(Va32=_mm_loadu_ps(Ashuffle[5]);)\n  ENABLE_SSE_IMPLEMENTATION(Va13=_mm_loadu_ps(Ashuffle[6]);)\n  ENABLE_SSE_IMPLEMENTATION(Va23=_mm_loadu_ps(Ashuffle[7]);)\n  ENABLE_SSE_IMPLEMENTATION(Va33=_mm_loadu_ps(Ashuffle[8]);)\n\n#include \"Singular_Value_Decomposition_Main_Kernel_Body.hpp\"\n\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Ushuffle[0],Vu11);)\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Ushuffle[1],Vu21);)\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Ushuffle[2],Vu31);)\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Ushuffle[3],Vu12);)\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Ushuffle[4],Vu22);)\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Ushuffle[5],Vu32);)\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Ushuffle[6],Vu13);)\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Ushuffle[7],Vu23);)\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Ushuffle[8],Vu33);)\n\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Vshuffle[0],Vv11);)\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Vshuffle[1],Vv21);)\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Vshuffle[2],Vv31);)\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Vshuffle[3],Vv12);)\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Vshuffle[4],Vv22);)\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Vshuffle[5],Vv32);)\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Vshuffle[6],Vv13);)\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Vshuffle[7],Vv23);)\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Vshuffle[8],Vv33);)\n\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Sshuffle[0],Va11);)\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Sshuffle[1],Va22);)\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Sshuffle[2],Va33);)\n\n  for (int i=0; i<3; i++)\n  {\n    for (int j=0; j<3; j++)\n    {\n      for (int k=0; k<4; k++)\n      {\n        U(i + 3*k, j) = Ushuffle[i + j*3][k];\n        V(i + 3*k, j) = Vshuffle[i + j*3][k];\n      }\n    }\n  }\n\n  for (int i=0; i<3; i++)\n  {\n    for (int k=0; k<4; k++)\n    {\n      S(i + 3*k, 0) = Sshuffle[i][k];\n    }\n  }\n}\n#pragma runtime_checks( \"u\", restore )\n\n// forced instantiation\ntemplate void igl::svd3x3_sse(const Eigen::Matrix<float, 3*4, 3>& A, Eigen::Matrix<float, 3*4, 3> &U, Eigen::Matrix<float, 3*4, 1> &S, Eigen::Matrix<float, 3*4, 3>&V);\n//// doesn't even make sense with double because the wunder-SVD code is only single precision anyway...\n//template void wunderSVD3x3_SSE<float>(Eigen::Matrix<float, 12, 3, 0, 12, 3> const&, Eigen::Matrix<float, 12, 3, 0, 12, 3>&, Eigen::Matrix<float, 12, 1, 0, 12, 1>&, Eigen::Matrix<float, 12, 3, 0, 12, 3>&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/svd3x3/svd3x3_sse.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_SVD3X3_SSE_H\n#define IGL_SVD3X3_SSE_H\n#include <igl/igl_inline.h>\n#include <Eigen/Dense>\n\nnamespace igl\n{\n  // Super fast 3x3 SVD according to http://pages.cs.wisc.edu/~sifakis/project_pages/svd.html\n  // This is SSE version of svd3x3 (see svd3x3.h) which works on 4 matrices at a time\n  // These four matrices are simply stacked in columns, the rest is the same as for svd3x3\n  //\n  // Inputs:\n  //   A  12 by 3 stack of 3x3 matrices\n  // Outputs:\n  //   U  12x3 left singular vectors stacked\n  //   S  12x1 singular values stacked\n  //   V  12x3 right singular vectors stacked\n  //\n  // Known bugs: this will not work correctly for double precision.\n  template<typename T>\n  IGL_INLINE void svd3x3_sse(\n    const Eigen::Matrix<T, 3*4, 3>& A, \n    Eigen::Matrix<T, 3*4, 3> &U, \n    Eigen::Matrix<T, 3*4, 1> &S, \n    Eigen::Matrix<T, 3*4, 3>&V);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"svd3x3_sse.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/svd3x3.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"svd3x3.h\"\n\n#include <cmath>\n#include <algorithm>\n\n#define USE_SCALAR_IMPLEMENTATION\n#undef USE_SSE_IMPLEMENTATION\n#undef USE_AVX_IMPLEMENTATION\n#define COMPUTE_U_AS_MATRIX\n#define COMPUTE_V_AS_MATRIX\n#include \"Singular_Value_Decomposition_Preamble.hpp\"\n\n#pragma runtime_checks( \"u\", off )  // disable runtime asserts on xor eax,eax type of stuff (doesn't always work, disable explicitly in compiler settings)\ntemplate<typename T>\nIGL_INLINE void igl::svd3x3(const Eigen::Matrix<T, 3, 3>& A, Eigen::Matrix<T, 3, 3> &U, Eigen::Matrix<T, 3, 1> &S, Eigen::Matrix<T, 3, 3>&V)\n{\n  // this code only supports the scalar version (otherwise we'd need to pass arrays of matrices)  \n\n#include \"Singular_Value_Decomposition_Kernel_Declarations.hpp\"\n\n  ENABLE_SCALAR_IMPLEMENTATION(Sa11.f=A(0,0);)                                      ENABLE_SSE_IMPLEMENTATION(Va11=_mm_loadu_ps(a11);)                                  ENABLE_AVX_IMPLEMENTATION(Va11=_mm256_loadu_ps(a11);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa21.f=A(1,0);)                                      ENABLE_SSE_IMPLEMENTATION(Va21=_mm_loadu_ps(a21);)                                  ENABLE_AVX_IMPLEMENTATION(Va21=_mm256_loadu_ps(a21);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa31.f=A(2,0);)                                      ENABLE_SSE_IMPLEMENTATION(Va31=_mm_loadu_ps(a31);)                                  ENABLE_AVX_IMPLEMENTATION(Va31=_mm256_loadu_ps(a31);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa12.f=A(0,1);)                                      ENABLE_SSE_IMPLEMENTATION(Va12=_mm_loadu_ps(a12);)                                  ENABLE_AVX_IMPLEMENTATION(Va12=_mm256_loadu_ps(a12);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa22.f=A(1,1);)                                      ENABLE_SSE_IMPLEMENTATION(Va22=_mm_loadu_ps(a22);)                                  ENABLE_AVX_IMPLEMENTATION(Va22=_mm256_loadu_ps(a22);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa32.f=A(2,1);)                                      ENABLE_SSE_IMPLEMENTATION(Va32=_mm_loadu_ps(a32);)                                  ENABLE_AVX_IMPLEMENTATION(Va32=_mm256_loadu_ps(a32);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa13.f=A(0,2);)                                      ENABLE_SSE_IMPLEMENTATION(Va13=_mm_loadu_ps(a13);)                                  ENABLE_AVX_IMPLEMENTATION(Va13=_mm256_loadu_ps(a13);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa23.f=A(1,2);)                                      ENABLE_SSE_IMPLEMENTATION(Va23=_mm_loadu_ps(a23);)                                  ENABLE_AVX_IMPLEMENTATION(Va23=_mm256_loadu_ps(a23);)\n    ENABLE_SCALAR_IMPLEMENTATION(Sa33.f=A(2,2);)                                      ENABLE_SSE_IMPLEMENTATION(Va33=_mm_loadu_ps(a33);)                                  ENABLE_AVX_IMPLEMENTATION(Va33=_mm256_loadu_ps(a33);)\n\n#include \"Singular_Value_Decomposition_Main_Kernel_Body.hpp\"\n\n    ENABLE_SCALAR_IMPLEMENTATION(U(0,0)=Su11.f;)                                      ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(u11,Vu11);)                                 ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(u11,Vu11);)\n    ENABLE_SCALAR_IMPLEMENTATION(U(1,0)=Su21.f;)                                      ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(u21,Vu21);)                                 ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(u21,Vu21);)\n    ENABLE_SCALAR_IMPLEMENTATION(U(2,0)=Su31.f;)                                      ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(u31,Vu31);)                                 ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(u31,Vu31);)\n    ENABLE_SCALAR_IMPLEMENTATION(U(0,1)=Su12.f;)                                      ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(u12,Vu12);)                                 ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(u12,Vu12);)\n    ENABLE_SCALAR_IMPLEMENTATION(U(1,1)=Su22.f;)                                      ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(u22,Vu22);)                                 ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(u22,Vu22);)\n    ENABLE_SCALAR_IMPLEMENTATION(U(2,1)=Su32.f;)                                      ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(u32,Vu32);)                                 ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(u32,Vu32);)\n    ENABLE_SCALAR_IMPLEMENTATION(U(0,2)=Su13.f;)                                      ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(u13,Vu13);)                                 ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(u13,Vu13);)\n    ENABLE_SCALAR_IMPLEMENTATION(U(1,2)=Su23.f;)                                      ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(u23,Vu23);)                                 ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(u23,Vu23);)\n    ENABLE_SCALAR_IMPLEMENTATION(U(2,2)=Su33.f;)                                      ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(u33,Vu33);)                                 ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(u33,Vu33);)\n\n    ENABLE_SCALAR_IMPLEMENTATION(V(0,0)=Sv11.f;)                                      ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(v11,Vv11);)                                 ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(v11,Vv11);)\n    ENABLE_SCALAR_IMPLEMENTATION(V(1,0)=Sv21.f;)                                      ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(v21,Vv21);)                                 ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(v21,Vv21);)\n    ENABLE_SCALAR_IMPLEMENTATION(V(2,0)=Sv31.f;)                                      ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(v31,Vv31);)                                 ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(v31,Vv31);)\n    ENABLE_SCALAR_IMPLEMENTATION(V(0,1)=Sv12.f;)                                      ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(v12,Vv12);)                                 ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(v12,Vv12);)\n    ENABLE_SCALAR_IMPLEMENTATION(V(1,1)=Sv22.f;)                                      ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(v22,Vv22);)                                 ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(v22,Vv22);)\n    ENABLE_SCALAR_IMPLEMENTATION(V(2,1)=Sv32.f;)                                      ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(v32,Vv32);)                                 ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(v32,Vv32);)\n    ENABLE_SCALAR_IMPLEMENTATION(V(0,2)=Sv13.f;)                                      ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(v13,Vv13);)                                 ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(v13,Vv13);)\n    ENABLE_SCALAR_IMPLEMENTATION(V(1,2)=Sv23.f;)                                      ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(v23,Vv23);)                                 ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(v23,Vv23);)\n    ENABLE_SCALAR_IMPLEMENTATION(V(2,2)=Sv33.f;)                                      ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(v33,Vv33);)                                 ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(v33,Vv33);)\n\n    ENABLE_SCALAR_IMPLEMENTATION(S(0,0)=Sa11.f;)                                   ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(sigma1,Va11);)                              ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(sigma1,Va11);)\n    ENABLE_SCALAR_IMPLEMENTATION(S(1,0)=Sa22.f;)                                   ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(sigma2,Va22);)                              ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(sigma2,Va22);)\n    ENABLE_SCALAR_IMPLEMENTATION(S(2,0)=Sa33.f;)                                   ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(sigma3,Va33);)                              ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(sigma3,Va33);)\n}\n#pragma runtime_checks( \"u\", restore ) \n\n// forced instantiation\ntemplate void igl::svd3x3(const Eigen::Matrix<float, 3, 3>& A, Eigen::Matrix<float, 3, 3> &U, Eigen::Matrix<float, 3, 1> &S, Eigen::Matrix<float, 3, 3>&V);\ntemplate void igl::svd3x3<double>(Eigen::Matrix<double, 3, 3, 0, 3, 3> const&, Eigen::Matrix<double, 3, 3, 0, 3, 3>&, Eigen::Matrix<double, 3, 1, 0, 3, 1>&, Eigen::Matrix<double, 3, 3, 0, 3, 3>&);\n// doesn't even make sense with double because this SVD code is only single precision anyway...\n"
  },
  {
    "path": "libs/libigl/include/igl/svd3x3.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\r\n// \r\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\r\n// \r\n// This Source Code Form is subject to the terms of the Mozilla Public License \r\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \r\n// obtain one at http://mozilla.org/MPL/2.0/.\r\n#ifndef IGL_SVD3X3_H\r\n#define IGL_SVD3X3_H\r\n#include \"igl_inline.h\"\r\n#include <Eigen/Dense>\r\n\r\nnamespace igl\r\n{\r\n  // Super fast 3x3 SVD according to http://pages.cs.wisc.edu/~sifakis/project_pages/svd.html\r\n  // The resulting decomposition is A = U * diag(S[0], S[1], S[2]) * V'\r\n  // BEWARE: this SVD algorithm guarantees that det(U) = det(V) = 1, but this \r\n  // comes at the cost that 'sigma3' can be negative\r\n  // for computing polar decomposition it's great because all we need to do is U*V'\r\n  // and the result will automatically have positive determinant\r\n  //\r\n  // Inputs:\r\n  //   A  3x3 matrix\r\n  // Outputs:\r\n  //   U  3x3 left singular vectors\r\n  //   S  3x1 singular values\r\n  //   V  3x3 right singular vectors\r\n  //\r\n  // Known bugs: this will not work correctly for double precision.\r\n  template<typename T>\r\n  IGL_INLINE void svd3x3(\r\n    const Eigen::Matrix<T, 3, 3>& A, \r\n    Eigen::Matrix<T, 3, 3> &U, \r\n    Eigen::Matrix<T, 3, 1> &S, \r\n    Eigen::Matrix<T, 3, 3>&V);\r\n}\r\n#ifndef IGL_STATIC_LIBRARY\r\n#  include \"svd3x3.cpp\"\r\n#endif\r\n#endif\r\n"
  },
  {
    "path": "libs/libigl/include/igl/svd3x3_avx.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifdef __AVX__\n#include \"svd3x3_avx.h\"\n\n#include <cmath>\n#include <algorithm>\n\n#undef USE_SCALAR_IMPLEMENTATION\n#undef USE_SSE_IMPLEMENTATION\n#define USE_AVX_IMPLEMENTATION\n#define COMPUTE_U_AS_MATRIX\n#define COMPUTE_V_AS_MATRIX\n#include \"Singular_Value_Decomposition_Preamble.hpp\"\n\n#pragma runtime_checks( \"u\", off )  // disable runtime asserts on xor eax,eax type of stuff (doesn't always work, disable explicitly in compiler settings)\ntemplate<typename T>\nIGL_INLINE void igl::svd3x3_avx(\n  const Eigen::Matrix<T, 3*8, 3>& A,\n  Eigen::Matrix<T, 3*8, 3> &U,\n  Eigen::Matrix<T, 3*8, 1> &S,\n  Eigen::Matrix<T, 3*8, 3>&V)\n{\n  // this code assumes USE_AVX_IMPLEMENTATION is defined\n  float Ashuffle[9][8], Ushuffle[9][8], Vshuffle[9][8], Sshuffle[3][8];\n  for (int i=0; i<3; i++)\n  {\n    for (int j=0; j<3; j++)\n    {\n      for (int k=0; k<8; k++)\n      {\n        Ashuffle[i + j*3][k] = A(i + 3*k, j);\n      }\n    }\n  }\n\n#include \"Singular_Value_Decomposition_Kernel_Declarations.hpp\"\n\n  ENABLE_AVX_IMPLEMENTATION(Va11=_mm256_loadu_ps(Ashuffle[0]);)\n  ENABLE_AVX_IMPLEMENTATION(Va21=_mm256_loadu_ps(Ashuffle[1]);)\n  ENABLE_AVX_IMPLEMENTATION(Va31=_mm256_loadu_ps(Ashuffle[2]);)\n  ENABLE_AVX_IMPLEMENTATION(Va12=_mm256_loadu_ps(Ashuffle[3]);)\n  ENABLE_AVX_IMPLEMENTATION(Va22=_mm256_loadu_ps(Ashuffle[4]);)\n  ENABLE_AVX_IMPLEMENTATION(Va32=_mm256_loadu_ps(Ashuffle[5]);)\n  ENABLE_AVX_IMPLEMENTATION(Va13=_mm256_loadu_ps(Ashuffle[6]);)\n  ENABLE_AVX_IMPLEMENTATION(Va23=_mm256_loadu_ps(Ashuffle[7]);)\n  ENABLE_AVX_IMPLEMENTATION(Va33=_mm256_loadu_ps(Ashuffle[8]);)\n\n#include \"Singular_Value_Decomposition_Main_Kernel_Body.hpp\"\n\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Ushuffle[0],Vu11);)\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Ushuffle[1],Vu21);)\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Ushuffle[2],Vu31);)\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Ushuffle[3],Vu12);)\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Ushuffle[4],Vu22);)\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Ushuffle[5],Vu32);)\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Ushuffle[6],Vu13);)\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Ushuffle[7],Vu23);)\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Ushuffle[8],Vu33);)\n\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Vshuffle[0],Vv11);)\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Vshuffle[1],Vv21);)\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Vshuffle[2],Vv31);)\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Vshuffle[3],Vv12);)\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Vshuffle[4],Vv22);)\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Vshuffle[5],Vv32);)\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Vshuffle[6],Vv13);)\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Vshuffle[7],Vv23);)\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Vshuffle[8],Vv33);)\n\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Sshuffle[0],Va11);)\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Sshuffle[1],Va22);)\n  ENABLE_AVX_IMPLEMENTATION(_mm256_storeu_ps(Sshuffle[2],Va33);)\n\n  for (int i=0; i<3; i++)\n  {\n    for (int j=0; j<3; j++)\n    {\n      for (int k=0; k<8; k++)\n      {\n        U(i + 3*k, j) = Ushuffle[i + j*3][k];\n        V(i + 3*k, j) = Vshuffle[i + j*3][k];\n      }\n    }\n  }\n\n  for (int i=0; i<3; i++)\n  {\n    for (int k=0; k<8; k++)\n    {\n      S(i + 3*k, 0) = Sshuffle[i][k];\n    }\n  }\n}\n#pragma runtime_checks( \"u\", restore )\n\n#ifdef IGL_STATIC_LIBRARY\n// forced instantiation\n//template void igl::svd3x3_avx(const Eigen::Matrix<float, 3*8, 3>& A, Eigen::Matrix<float, 3*8, 3> &U, Eigen::Matrix<float, 3*8, 1> &S, Eigen::Matrix<float, 3*8, 3>&V);\n// doesn't even make sense with double because the wunder-SVD code is only single precision anyway...\ntemplate void igl::svd3x3_avx<float>(Eigen::Matrix<float, 24, 3, 0, 24, 3> const&, Eigen::Matrix<float, 24, 3, 0, 24, 3>&, Eigen::Matrix<float, 24, 1, 0, 24, 1>&, Eigen::Matrix<float, 24, 3, 0, 24, 3>&);\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/svd3x3_avx.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\r\n// \r\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\r\n// \r\n// This Source Code Form is subject to the terms of the Mozilla Public License \r\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \r\n// obtain one at http://mozilla.org/MPL/2.0/.\r\n#ifndef IGL_SVD3X3_AVX_H\r\n#define IGL_SVD3X3_AVX_H\r\n#include \"igl_inline.h\"\r\n#include <Eigen/Dense>\r\n\r\nnamespace igl\r\n{\r\n  // Super fast 3x3 SVD according to\r\n  // http://pages.cs.wisc.edu/~sifakis/project_pages/svd.html This is AVX\r\n  // version of svd3x3 (see svd3x3.h) which works on 8 matrices at a time These\r\n  // eight matrices are simply stacked in columns, the rest is the same as for\r\n  // svd3x3\r\n  //\r\n  // Inputs:\r\n  //   A  12 by 3 stack of 3x3 matrices\r\n  // Outputs:\r\n  //   U  12x3 left singular vectors stacked\r\n  //   S  12x1 singular values stacked\r\n  //   V  12x3 right singular vectors stacked\r\n  //\r\n  // Known bugs: this will not work correctly for double precision.\r\n  template<typename T>\r\n  IGL_INLINE void svd3x3_avx(\r\n    const Eigen::Matrix<T, 3*8, 3>& A, \r\n    Eigen::Matrix<T, 3*8, 3> &U, \r\n    Eigen::Matrix<T, 3*8, 1> &S, \r\n    Eigen::Matrix<T, 3*8, 3>&V);\r\n}\r\n#ifndef IGL_STATIC_LIBRARY\r\n#  include \"svd3x3_avx.cpp\"\r\n#endif\r\n#endif\r\n\r\n"
  },
  {
    "path": "libs/libigl/include/igl/svd3x3_sse.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifdef __SSE__\n#include \"svd3x3_sse.h\"\n\n#include <cmath>\n#include <algorithm>\n\n#undef USE_SCALAR_IMPLEMENTATION\n#define USE_SSE_IMPLEMENTATION\n#undef USE_AVX_IMPLEMENTATION\n#define COMPUTE_U_AS_MATRIX\n#define COMPUTE_V_AS_MATRIX\n#include \"Singular_Value_Decomposition_Preamble.hpp\"\n\n// disable runtime asserts on xor eax,eax type of stuff (doesn't always work,\n// disable explicitly in compiler settings)\n#pragma runtime_checks( \"u\", off )  \ntemplate<typename T>\nIGL_INLINE void igl::svd3x3_sse(\n  const Eigen::Matrix<T, 3*4, 3>& A, \n  Eigen::Matrix<T, 3*4, 3> &U, \n  Eigen::Matrix<T, 3*4, 1> &S, \n  Eigen::Matrix<T, 3*4, 3>&V)\n{\n  // this code assumes USE_SSE_IMPLEMENTATION is defined \n  float Ashuffle[9][4], Ushuffle[9][4], Vshuffle[9][4], Sshuffle[3][4];\n  for (int i=0; i<3; i++)\n  {\n    for (int j=0; j<3; j++)\n    {\n      for (int k=0; k<4; k++)\n      {\n        Ashuffle[i + j*3][k] = A(i + 3*k, j);\n      }\n    }\n  }\n\n#include \"Singular_Value_Decomposition_Kernel_Declarations.hpp\"\n\n  ENABLE_SSE_IMPLEMENTATION(Va11=_mm_loadu_ps(Ashuffle[0]);)\n  ENABLE_SSE_IMPLEMENTATION(Va21=_mm_loadu_ps(Ashuffle[1]);)\n  ENABLE_SSE_IMPLEMENTATION(Va31=_mm_loadu_ps(Ashuffle[2]);)\n  ENABLE_SSE_IMPLEMENTATION(Va12=_mm_loadu_ps(Ashuffle[3]);)\n  ENABLE_SSE_IMPLEMENTATION(Va22=_mm_loadu_ps(Ashuffle[4]);)\n  ENABLE_SSE_IMPLEMENTATION(Va32=_mm_loadu_ps(Ashuffle[5]);)\n  ENABLE_SSE_IMPLEMENTATION(Va13=_mm_loadu_ps(Ashuffle[6]);)\n  ENABLE_SSE_IMPLEMENTATION(Va23=_mm_loadu_ps(Ashuffle[7]);)\n  ENABLE_SSE_IMPLEMENTATION(Va33=_mm_loadu_ps(Ashuffle[8]);)\n\n#include \"Singular_Value_Decomposition_Main_Kernel_Body.hpp\"\n\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Ushuffle[0],Vu11);)\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Ushuffle[1],Vu21);)\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Ushuffle[2],Vu31);)\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Ushuffle[3],Vu12);)\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Ushuffle[4],Vu22);)\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Ushuffle[5],Vu32);)\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Ushuffle[6],Vu13);)\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Ushuffle[7],Vu23);)\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Ushuffle[8],Vu33);)\n\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Vshuffle[0],Vv11);)\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Vshuffle[1],Vv21);)\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Vshuffle[2],Vv31);)\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Vshuffle[3],Vv12);)\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Vshuffle[4],Vv22);)\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Vshuffle[5],Vv32);)\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Vshuffle[6],Vv13);)\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Vshuffle[7],Vv23);)\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Vshuffle[8],Vv33);)\n\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Sshuffle[0],Va11);)\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Sshuffle[1],Va22);)\n  ENABLE_SSE_IMPLEMENTATION(_mm_storeu_ps(Sshuffle[2],Va33);)\n\n  for (int i=0; i<3; i++)\n  {\n    for (int j=0; j<3; j++)\n    {\n      for (int k=0; k<4; k++)\n      {\n        U(i + 3*k, j) = Ushuffle[i + j*3][k];\n        V(i + 3*k, j) = Vshuffle[i + j*3][k];\n      }\n    }\n  }\n\n  for (int i=0; i<3; i++)\n  {\n    for (int k=0; k<4; k++)\n    {\n      S(i + 3*k, 0) = Sshuffle[i][k];\n    }\n  }\n}\n#pragma runtime_checks( \"u\", restore )\n\n// forced instantiation\ntemplate void igl::svd3x3_sse(const Eigen::Matrix<float, 3*4, 3>& A, Eigen::Matrix<float, 3*4, 3> &U, Eigen::Matrix<float, 3*4, 1> &S, Eigen::Matrix<float, 3*4, 3>&V);\n//// doesn't even make sense with double because the wunder-SVD code is only single precision anyway...\n//template void wunderSVD3x3_SSE<float>(Eigen::Matrix<float, 12, 3, 0, 12, 3> const&, Eigen::Matrix<float, 12, 3, 0, 12, 3>&, Eigen::Matrix<float, 12, 1, 0, 12, 1>&, Eigen::Matrix<float, 12, 3, 0, 12, 3>&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/svd3x3_sse.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\r\n// \r\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\r\n// \r\n// This Source Code Form is subject to the terms of the Mozilla Public License \r\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \r\n// obtain one at http://mozilla.org/MPL/2.0/.\r\n#ifndef IGL_SVD3X3_SSE_H\r\n#define IGL_SVD3X3_SSE_H\r\n#include \"igl_inline.h\"\r\n#include <Eigen/Dense>\r\n\r\nnamespace igl\r\n{\r\n  // Super fast 3x3 SVD according to http://pages.cs.wisc.edu/~sifakis/project_pages/svd.html\r\n  // This is SSE version of svd3x3 (see svd3x3.h) which works on 4 matrices at a time\r\n  // These four matrices are simply stacked in columns, the rest is the same as for svd3x3\r\n  //\r\n  // Inputs:\r\n  //   A  12 by 3 stack of 3x3 matrices\r\n  // Outputs:\r\n  //   U  12x3 left singular vectors stacked\r\n  //   S  12x1 singular values stacked\r\n  //   V  12x3 right singular vectors stacked\r\n  //\r\n  // Known bugs: this will not work correctly for double precision.\r\n  template<typename T>\r\n  IGL_INLINE void svd3x3_sse(\r\n    const Eigen::Matrix<T, 3*4, 3>& A, \r\n    Eigen::Matrix<T, 3*4, 3> &U, \r\n    Eigen::Matrix<T, 3*4, 1> &S, \r\n    Eigen::Matrix<T, 3*4, 3>&V);\r\n}\r\n#ifndef IGL_STATIC_LIBRARY\r\n#  include \"svd3x3_sse.cpp\"\r\n#endif\r\n#endif\r\n"
  },
  {
    "path": "libs/libigl/include/igl/swept_volume_bounding_box.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"swept_volume_bounding_box.h\"\n#include \"LinSpaced.h\"\n\nIGL_INLINE void igl::swept_volume_bounding_box(\n  const size_t & n,\n  const std::function<Eigen::RowVector3d(const size_t vi, const double t)> & V,\n  const size_t & steps,\n  Eigen::AlignedBox3d & box)\n{\n  using namespace Eigen;\n  box.setEmpty();\n  const VectorXd t = igl::LinSpaced<VectorXd >(steps,0,1);\n  // Find extent over all time steps\n  for(int ti = 0;ti<t.size();ti++)\n  {\n    for(size_t vi = 0;vi<n;vi++)\n    {\n      box.extend(V(vi,t(ti)).transpose());\n    }\n  }\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/swept_volume_bounding_box.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_SWEPT_VOLUME_BOUNDING_BOX_H\n#define IGL_SWEPT_VOLUME_BOUNDING_BOX_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <Eigen/Geometry>\n#include <functional>\nnamespace igl\n{\n  // Construct an axis-aligned bounding box containing a shape undergoing a\n  // motion sampled at `steps` discrete momements.\n  //\n  // Inputs:\n  //   n  number of mesh vertices\n  //   V  function handle so that V(i,t) returns the 3d position of vertex\n  //     i at time t, for t∈[0,1]\n  //   steps  number of time steps: steps=3 --> t∈{0,0.5,1}\n  // Outputs:\n  //   box  box containing mesh under motion\n  IGL_INLINE void swept_volume_bounding_box(\n    const size_t & n,\n    const std::function<\n      Eigen::RowVector3d(const size_t vi, const double t)> & V,\n    const size_t & steps,\n    Eigen::AlignedBox3d & box);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"swept_volume_bounding_box.cpp\"\n#endif\n\n#endif \n"
  },
  {
    "path": "libs/libigl/include/igl/swept_volume_signed_distance.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"swept_volume_signed_distance.h\"\n#include \"LinSpaced.h\"\n#include \"flood_fill.h\"\n#include \"signed_distance.h\"\n#include \"AABB.h\"\n#include \"pseudonormal_test.h\"\n#include \"per_face_normals.h\"\n#include \"per_vertex_normals.h\"\n#include \"per_edge_normals.h\"\n#include <Eigen/Geometry>\n#include <cmath>\n\nIGL_INLINE void igl::swept_volume_signed_distance(\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  const std::function<Eigen::Affine3d(const double t)> & transform,\n  const size_t & steps,\n  const Eigen::MatrixXd & GV,\n  const Eigen::RowVector3i & res,\n  const double h,\n  const double isolevel,\n  const Eigen::VectorXd & S0,\n  Eigen::VectorXd & S)\n{\n  using namespace std;\n  using namespace igl;\n  using namespace Eigen;\n  S = S0;\n  const VectorXd t = igl::LinSpaced<VectorXd >(steps,0,1);\n  const bool finite_iso = isfinite(isolevel);\n  const double extension = (finite_iso ? isolevel : 0) + sqrt(3.0)*h;\n  Eigen::AlignedBox3d box(\n    V.colwise().minCoeff().array()-extension,\n    V.colwise().maxCoeff().array()+extension);\n  // Precomputation\n  Eigen::MatrixXd FN,VN,EN;\n  Eigen::MatrixXi E;\n  Eigen::VectorXi EMAP;\n  per_face_normals(V,F,FN);\n  per_vertex_normals(V,F,PER_VERTEX_NORMALS_WEIGHTING_TYPE_ANGLE,FN,VN);\n  per_edge_normals(\n    V,F,PER_EDGE_NORMALS_WEIGHTING_TYPE_UNIFORM,FN,EN,E,EMAP);\n  AABB<MatrixXd,3> tree;\n  tree.init(V,F);\n  for(int ti = 0;ti<t.size();ti++)\n  {\n    const Affine3d At = transform(t(ti));\n    for(int g = 0;g<GV.rows();g++)\n    {\n      // Don't bother finding out how deep inside points are.\n      if(finite_iso && S(g)==S(g) && S(g)<isolevel-sqrt(3.0)*h)\n      {\n        continue;\n      }\n      const RowVector3d gv = \n        (GV.row(g) - At.translation().transpose())*At.linear();\n      // If outside of extended box, then consider it \"far away enough\"\n      if(finite_iso && !box.contains(gv.transpose()))\n      {\n        continue;\n      }\n      RowVector3d c,n;\n      int i;\n      double sqrd,s;\n      //signed_distance_pseudonormal(tree,V,F,FN,VN,EN,EMAP,gv,s,sqrd,i,c,n);\n      const double min_sqrd = \n        finite_iso ? \n        pow(sqrt(3.)*h+isolevel,2) : \n        numeric_limits<double>::infinity();\n      sqrd = tree.squared_distance(V,F,gv,min_sqrd,i,c);\n      if(sqrd<min_sqrd)\n      {\n        pseudonormal_test(V,F,FN,VN,EN,EMAP,gv,i,c,s,n);\n        if(S(g) == S(g))\n        {\n          S(g) = min(S(g),s*sqrt(sqrd));\n        }else\n        {\n          S(g) = s*sqrt(sqrd);\n        }\n      }\n    }\n  }\n\n  if(finite_iso)\n  {\n    flood_fill(res,S);\n  }else\n  {\n#ifndef NDEBUG\n    // Check for nans\n    for_each(S.data(),S.data()+S.size(),[](const double s){assert(s==s);});\n#endif\n  }\n}\n\nIGL_INLINE void igl::swept_volume_signed_distance(\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  const std::function<Eigen::Affine3d(const double t)> & transform,\n  const size_t & steps,\n  const Eigen::MatrixXd & GV,\n  const Eigen::RowVector3i & res,\n  const double h,\n  const double isolevel,\n  Eigen::VectorXd & S)\n{\n  using namespace std;\n  using namespace igl;\n  using namespace Eigen;\n  S = VectorXd::Constant(GV.rows(),1,numeric_limits<double>::quiet_NaN());\n  return \n    swept_volume_signed_distance(V,F,transform,steps,GV,res,h,isolevel,S,S);\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/swept_volume_signed_distance.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_SWEPT_VOLUME_SIGNED_DISTANCE_H\n#define IGL_SWEPT_VOLUME_SIGNED_DISTANCE_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <Eigen/Geometry>\n#include <functional>\nnamespace igl\n{\n  // Compute the signed distance to a sweep surface of a mesh under-going\n  // an arbitrary motion V(t) discretely sampled at `steps`-many moments in\n  // time at a grid.\n  //\n  // Inputs:\n  //   V  #V by 3 list of mesh positions in reference pose\n  //   F  #F by 3 list of triangle indices [0,n)\n  //   transform  function handle so that transform(t) returns the rigid\n  //     transformation at time t∈[0,1]\n  //   steps  number of time steps: steps=3 --> t∈{0,0.5,1}\n  //   GV  #GV by 3 list of evaluation point grid positions\n  //   res  3-long resolution of GV grid\n  //   h  edge-length of grid\n  //   isolevel  isolevel to \"focus\" on; grid positions far enough away from\n  //     isolevel (based on h) will get approximate values). Set\n  //     isolevel=infinity to get good values everywhere (slow and\n  //     unnecessary if just trying to extract isolevel-level set).\n  //   S0  #GV initial values (will take minimum with these), can be same\n  //     as S)\n  // Outputs:\n  //   S  #GV list of signed distances\n  IGL_INLINE void swept_volume_signed_distance(\n    const Eigen::MatrixXd & V,\n    const Eigen::MatrixXi & F,\n    const std::function<Eigen::Affine3d(const double t)> & transform,\n    const size_t & steps,\n    const Eigen::MatrixXd & GV,\n    const Eigen::RowVector3i & res,\n    const double h,\n    const double isolevel,\n    const Eigen::VectorXd & S0,\n    Eigen::VectorXd & S);\n  IGL_INLINE void swept_volume_signed_distance(\n    const Eigen::MatrixXd & V,\n    const Eigen::MatrixXi & F,\n    const std::function<Eigen::Affine3d(const double t)> & transform,\n    const size_t & steps,\n    const Eigen::MatrixXd & GV,\n    const Eigen::RowVector3i & res,\n    const double h,\n    const double isolevel,\n    Eigen::VectorXd & S);\n  }\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"swept_volume_signed_distance.cpp\"\n#endif \n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/tetgen/README",
    "content": "IGL interface to tetgen library\n\nDependencies:\n  tetgen  \n  \nTravel to $IGL/external/tetgen and issue:\n  make -f Makefile.igl tetlib\n"
  },
  {
    "path": "libs/libigl/include/igl/tetgen/cdt.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"cdt.h\"\n#include \"../bounding_box.h\"\n#include \"../writeOBJ.h\"\n\ntemplate <\n  typename DerivedV, \n  typename DerivedF, \n  typename DerivedTV, \n  typename DerivedTT, \n  typename DerivedTF>\nIGL_INLINE bool igl::cdt(\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  const igl::CDTParam & param,\n  Eigen::PlainObjectBase<DerivedTV>& TV,\n  Eigen::PlainObjectBase<DerivedTT>& TT,\n  Eigen::PlainObjectBase<DerivedTF>& TF)\n{\n  using namespace Eigen;\n  using namespace std;\n  typedef Eigen::PlainObjectBase<DerivedV> MatrixXS;\n  typedef Eigen::PlainObjectBase<DerivedF> MatrixXI;\n  // Effective input mesh\n  MatrixXS U;\n  MatrixXI G;\n  if(param.use_bounding_box)\n  {\n    // Construct bounding box mesh\n    MatrixXS BV;\n    MatrixXI BF;\n    bounding_box(V,BV,BF);\n    // scale bounding box\n    const RowVector3d mid = \n     (BV.colwise().minCoeff() + BV.colwise().maxCoeff()).eval()*0.5;\n    BV.rowwise() -= mid;\n    assert(param.bounding_box_scale >= 1.);\n    BV.array() *= param.bounding_box_scale;\n    BV.rowwise() += mid;\n    // Append bounding box to mesh\n    U.resize(V.rows()+BV.rows(),V.cols());\n    U<<V,BV;\n    BF.array() += V.rows();\n    G.resize(F.rows()+BF.rows(),F.cols());\n    G<<F,BF;\n  }else\n  {\n    // needless copies\n    U = V;\n    G = F;\n  }\n  // effective flags;\n  string flags = param.flags + (param.use_bounding_box ? \"\" : \"c\");\n  writeOBJ(\"UG.obj\",U,G);\n  return tetrahedralize(U,G,flags,TV,TT,TF);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template specialization\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/tetgen/cdt.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_CDT_H\n#define IGL_CDT_H\n#include \"../igl_inline.h\"\n\n#include <Eigen/Core>\n#include <string>\n#ifndef TETLIBRARY\n#define TETLIBRARY \n#endif\n#include \"tetgen.h\" // Defined REAL\n\nnamespace igl\n{\n  struct CDTParam\n  {\n    // Tetgen can compute mesh of convex hull of input (i.e. \"c\") but often\n    // chokes. One workaround is to force it to mesh the entire bounding box.\n    // {false}\n    bool use_bounding_box = false;\n    // Scale the bounding box a bit so that vertices near it do not give tetgen\n    // problems. {1.01}\n    double bounding_box_scale = 1.01;\n    // Flags to tetgen. Do not include the \"c\" flag here! {\"Y\"}\n    std::string flags = \"Y\";\n  };\n  // Create a constrained delaunay tesselation containing convex hull of the\n  // given **non-selfintersecting** mesh.\n  //\n  // Inputs:\n  //    V  #V by 3 list of input mesh vertices\n  //    F  #F by 3 list of input mesh facets\n  //    param  see above\n  //    TV  #TV by 3 list of output mesh vertices (V come first)\n  //    TT  #TT by 3 list of tetrahedra indices into TV.\n  //    TF  #TF by 3 list of facets from F potentially subdivided.\n  // \n  template <\n    typename DerivedV, \n    typename DerivedF, \n    typename DerivedTV, \n    typename DerivedTT, \n    typename DerivedTF>\n  IGL_INLINE bool cdt(\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    const igl::CDTParam & param,\n    Eigen::PlainObjectBase<DerivedTV>& TV,\n    Eigen::PlainObjectBase<DerivedTT>& TT,\n    Eigen::PlainObjectBase<DerivedTF>& TF);\n}\n\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"cdt.cpp\"\n#endif\n\n#endif\n\n\n"
  },
  {
    "path": "libs/libigl/include/igl/tetgen/mesh_to_tetgenio.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"mesh_to_tetgenio.h\"\n\n// IGL includes \n#include <igl/matrix_to_list.h>\n\n// STL includes\n#include <cassert>\n\nIGL_INLINE bool igl::mesh_to_tetgenio(\n  const std::vector<std::vector<REAL > > & V, \n  const std::vector<std::vector<int> > & F, \n  tetgenio & in)\n{\n  using namespace std;\n  // all indices start from 0\n  in.firstnumber = 0;\n\n  in.numberofpoints = V.size();\n  in.pointlist = new REAL[in.numberofpoints * 3];\n  // loop over points\n  for(int i = 0; i < (int)V.size(); i++)\n  {\n    assert(V[i].size() == 3);\n    in.pointlist[i*3+0] = V[i][0];\n    in.pointlist[i*3+1] = V[i][1];\n    in.pointlist[i*3+2] = V[i][2];\n  }\n\n  in.numberoffacets = F.size();\n  in.facetlist = new tetgenio::facet[in.numberoffacets];\n  in.facetmarkerlist = new int[in.numberoffacets];\n\n  // loop over face\n  for(int i = 0;i < (int)F.size(); i++)\n  {\n    in.facetmarkerlist[i] = i;\n    tetgenio::facet * f = &in.facetlist[i];\n    f->numberofpolygons = 1;\n    f->polygonlist = new tetgenio::polygon[f->numberofpolygons];\n    f->numberofholes = 0;\n    f->holelist = NULL;\n    tetgenio::polygon * p = &f->polygonlist[0];\n    p->numberofvertices = F[i].size();\n    p->vertexlist = new int[p->numberofvertices];\n    // loop around face\n    for(int j = 0;j < (int)F[i].size(); j++)\n    {\n      p->vertexlist[j] = F[i][j];\n    }\n  }\n  return true;\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE bool igl::mesh_to_tetgenio(\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  tetgenio & in)\n{\n  using namespace igl;\n  using namespace std;\n  vector<vector<REAL> > vV;\n  vector<vector<int> > vF;\n  matrix_to_list(V,vV);\n  matrix_to_list(F,vF);\n  return mesh_to_tetgenio(vV,vF,in);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template specialization\ntemplate bool igl::mesh_to_tetgenio<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, tetgenio&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/tetgen/mesh_to_tetgenio.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_MESH_TO_TETGENIO_H\n#define IGL_MESH_TO_TETGENIO_H\n#include \"../igl_inline.h\"\n\n#define TETLIBRARY \n#include \"tetgen.h\" // Defined tetgenio, REAL\n#include <vector>\n#include <Eigen/Core>\n\nnamespace igl\n{\n  // Load a vertex list and face list into a tetgenio object\n  // Inputs:\n  //   V  #V by 3 vertex position list\n  //   F  #F list of polygon face indices into V (0-indexed)\n  // Outputs:\n  //   in  tetgenio input object\n  // Returns true on success, false on error\n  IGL_INLINE bool mesh_to_tetgenio(\n    const std::vector<std::vector<REAL > > & V, \n    const std::vector<std::vector<int> > & F, \n    tetgenio & in);\n  \n  // Wrapper with Eigen types\n  // Templates:\n  //   DerivedV  real-value: i.e. from MatrixXd\n  //   DerivedF  integer-value: i.e. from MatrixXi\n  template <typename DerivedV, typename DerivedF>\n  IGL_INLINE bool mesh_to_tetgenio(\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    tetgenio & in);\n}\n\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"mesh_to_tetgenio.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/tetgen/mesh_with_skeleton.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"mesh_with_skeleton.h\"\n\n#include <igl/sample_edges.h>\n#include <igl/cat.h>\n#include <igl/tetgen/tetrahedralize.h>\n#include <igl/writeOFF.h>\n#include <igl/writeOBJ.h>\n\n#include <iostream>\n// Default settings pq2Y tell tetgen to mesh interior of triangle mesh and\n// to produce a graded tet mesh\nconst static std::string DEFAULT_TETGEN_FLAGS = \"pq2Y\";\n\nIGL_INLINE bool igl::mesh_with_skeleton(\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  const Eigen::MatrixXd & C,\n  const Eigen::VectorXi & /*P*/,\n  const Eigen::MatrixXi & BE,\n  const Eigen::MatrixXi & CE,\n  const int samples_per_bone,\n  const std::string & tetgen_flags,\n  Eigen::MatrixXd & VV,\n  Eigen::MatrixXi & TT,\n  Eigen::MatrixXi & FF)\n{\n  using namespace Eigen;\n  using namespace igl;\n  using namespace std;\n  const string eff_tetgen_flags = \n    (tetgen_flags.length() == 0?DEFAULT_TETGEN_FLAGS:tetgen_flags);\n  // Collect all edges that need samples:\n  MatrixXi BECE = cat(1,BE,CE);\n  MatrixXd S;\n  // Sample each edge with 10 samples. (Choice of 10 doesn't seem to matter so\n  // much, but could under some circumstances)\n  sample_edges(C,BECE,samples_per_bone,S);\n  // Vertices we'll constrain tet mesh to meet\n  MatrixXd VS = cat(1,V,S);\n  // Use tetgen to mesh the interior of surface, this assumes surface:\n  //   * has no holes\n  //   * has no non-manifold edges or vertices\n  //   * has consistent orientation\n  //   * has no self-intersections\n  //   * has no 0-volume pieces\n  //writeOBJ(\"mesh_with_skeleton.obj\",VS,F);\n  cerr<<\"tetgen begin()\"<<endl;\n  int status = tetrahedralize( VS,F,eff_tetgen_flags,VV,TT,FF);\n  cerr<<\"tetgen end()\"<<endl;\n  if(FF.rows() != F.rows())\n  {\n    // Issue a warning if the surface has changed\n    cerr<<\"mesh_with_skeleton: Warning: boundary faces != input faces\"<<endl;\n  }\n  if(status != 0)\n  {\n    cerr<<\n      \"***************************************************************\"<<endl<<\n      \"***************************************************************\"<<endl<<\n      \"***************************************************************\"<<endl<<\n      \"***************************************************************\"<<endl<<\n      \"* mesh_with_skeleton: tetgen failed. Just meshing convex hull *\"<<endl<<\n      \"***************************************************************\"<<endl<<\n      \"***************************************************************\"<<endl<<\n      \"***************************************************************\"<<endl<<\n      \"***************************************************************\"<<endl;\n    // If meshing convex hull then use more regular mesh\n    status = tetrahedralize(VS,F,\"q1.414\",VV,TT,FF);\n    // I suppose this will fail if the skeleton is outside the mesh\n    assert(FF.maxCoeff() < VV.rows());\n    if(status != 0)\n    {\n      cerr<<\"mesh_with_skeleton: tetgen failed again.\"<<endl;\n      return false;\n    }\n  }\n\n  return true;\n}\n\nIGL_INLINE bool igl::mesh_with_skeleton(\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  const Eigen::MatrixXd & C,\n  const Eigen::VectorXi & P,\n  const Eigen::MatrixXi & BE,\n  const Eigen::MatrixXi & CE,\n  const int samples_per_bone,\n  Eigen::MatrixXd & VV,\n  Eigen::MatrixXi & TT,\n  Eigen::MatrixXi & FF)\n{\n  return igl::mesh_with_skeleton(\n    V,F,C,P,BE,CE,samples_per_bone,DEFAULT_TETGEN_FLAGS,VV,TT,FF);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instanciation\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/tetgen/mesh_with_skeleton.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_MESH_WITH_SKELETON_H\n#define IGL_MESH_WITH_SKELETON_H\n#include \"../igl_inline.h\"\n#include <Eigen/Dense>\n#include <string>\n\nnamespace igl\n{\n  // Mesh the interior of a given surface with tetrahedra which are graded (tend\n  // to be small near the surface and large inside) and conform to the given\n  // handles and samplings thereof.\n  //\n  // Inputs:\n  //  V  #V by 3 list of mesh vertex positions\n  //  F  #F by 3 list of triangle indices\n  //  C  #C by 3 list of vertex positions\n  //  P  #P list of point handle indices\n  //  BE #BE by 2 list of bone-edge indices\n  //  CE #CE by 2 list of cage-edge indices\n  //  samples_per_bone  #samples to add per bone\n  //  tetgen_flags  flags to pass to tetgen {\"\"-->\"pq2Y\"} otherwise you're on\n  //    your own and it's your funeral if you pass nonsense flags\n  // Outputs:\n  //  VV  #VV by 3 list of tet-mesh vertex positions\n  //  TT  #TT by 4 list of tetrahedra indices\n  //  FF  #FF by 3 list of surface triangle indices\n  // Returns true only on success\n  IGL_INLINE bool mesh_with_skeleton(\n    const Eigen::MatrixXd & V,\n    const Eigen::MatrixXi & F,\n    const Eigen::MatrixXd & C,\n    const Eigen::VectorXi & /*P*/,\n    const Eigen::MatrixXi & BE,\n    const Eigen::MatrixXi & CE,\n    const int samples_per_bone,\n    const std::string & tetgen_flags,\n    Eigen::MatrixXd & VV,\n    Eigen::MatrixXi & TT,\n    Eigen::MatrixXi & FF);\n  // Wrapper using default tetgen_flags\n  IGL_INLINE bool mesh_with_skeleton(\n    const Eigen::MatrixXd & V,\n    const Eigen::MatrixXi & F,\n    const Eigen::MatrixXd & C,\n    const Eigen::VectorXi & /*P*/,\n    const Eigen::MatrixXi & BE,\n    const Eigen::MatrixXi & CE,\n    const int samples_per_bone,\n    Eigen::MatrixXd & VV,\n    Eigen::MatrixXi & TT,\n    Eigen::MatrixXi & FF);\n}\n\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"mesh_with_skeleton.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/tetgen/read_into_tetgenio.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"read_into_tetgenio.h\"\n#include \"mesh_to_tetgenio.h\"\n\n// IGL includes\n#include <igl/pathinfo.h>\n#ifndef IGL_NO_EIGEN\n#  define IGL_NO_EIGEN_WAS_NOT_ALREADY_DEFINED\n#  define IGL_NO_EIGEN\n#endif \n// Include igl headers without including Eigen\n#include <igl/readOBJ.h>\n#ifdef IGL_NO_EIGEN_WAS_NOT_ALREADY_DEFINED\n#  undef IGL_NO_EIGEN\n#endif\n\n// STL includes\n#include <algorithm>\n#include <iostream>\n#include <vector>\n\nIGL_INLINE bool igl::read_into_tetgenio(\n  const std::string & path,\n  tetgenio & in)\n{\n  using namespace igl;\n  using namespace std;\n  // get file extension\n  string dirname,basename,ext,filename;\n  pathinfo(path,dirname,basename,ext,filename);\n  // convert to lower case for easy comparison\n  transform(ext.begin(), ext.end(), ext.begin(), ::tolower);\n  bool success = false;\n\n  char basename_char[1024];\n  strcpy(basename_char,basename.c_str());\n\n  if(ext == \"obj\")\n  {\n    // read obj into vertex list and face list\n    vector<vector<REAL> > V,TC,N;\n    vector<vector<int>  > F,FTC,FN;\n    success = readOBJ(path,V,TC,N,F,FTC,FN);\n    success &= mesh_to_tetgenio(V,F,in);\n  }else if(ext == \"off\")\n  {\n    success = in.load_off(basename_char);\n  }else if(ext == \"node\")\n  {\n    success = in.load_node(basename_char);\n  }else \n  {\n    if(ext.length() > 0)\n    {\n      cerr<<\"^read_into_tetgenio Warning: Unsupported extension (\"<<ext<<\n        \"): try to load as basename...\"<<endl;\n    }\n    // This changed as of (the so far unreleased) tetgen 1.5\n    //success = in.load_tetmesh(basename_char);\n    //int object = tetgenbehavior::NODES;\n    //if(ext == \"mesh\")\n    //{\n    //  object = tetgenbehavior::MEDIT;\n    //}\n    success = in.load_tetmesh(basename_char,!tetgenbehavior::MEDIT);\n  }\n\n  return success;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/tetgen/read_into_tetgenio.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_READ_INTO_TETGENIO_H\n#define IGL_READ_INTO_TETGENIO_H\n#include \"../igl_inline.h\"\n\n#include <string>\n#define TETLIBRARY \n#include \"tetgen.h\" // Defined tetgenio, REAL\n\nnamespace igl\n{\n  // Read a mesh or point set into tetgenio (input object for calling tetgen).\n  // Many file formats are already supported by tetgen:\n  //   .off\n  //   .ply\n  //   .node\n  //   .ply\n  //   .medit\n  //   .vtk\n  //   etc.\n  // Noteably it does not support .obj which is loaded by hand here (also\n  // demonstrating how to load points/faces programatically)\n  //\n  // If the file extension is not recognized the filename is assumed to be the\n  // basename of a collection describe a tetmesh, (of which at least the .node\n  // file must exist):\n  //   [filename].node\n  //   [filename].ele\n  //   [filename].face\n  //   [filename].edge\n  //   [filename].vol\n  //\n  // Inputs:\n  //   path  path to file or basename to files\n  // Outputs:\n  //   in  tetgenio input object\n  // Returns true on success, false on error\n  IGL_INLINE bool read_into_tetgenio(const std::string & path, tetgenio & in);\n}\n\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"read_into_tetgenio.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/tetgen/tetgenio_to_tetmesh.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"tetgenio_to_tetmesh.h\"\n\n// IGL includes\n#include <igl/list_to_matrix.h>\n\n// STL includes\n#include <iostream>\n\nIGL_INLINE bool igl::tetgenio_to_tetmesh(\n  const tetgenio & out,\n  std::vector<std::vector<REAL > > & V, \n  std::vector<std::vector<int> > & T,\n  std::vector<std::vector<int> > & F)\n{\n  using namespace std;\n  // process points\n  if(out.pointlist == NULL)\n  {\n    cerr<<\"^tetgenio_to_tetmesh Error: point list is NULL\\n\"<<endl;\n    return false;\n  }\n  V.resize(out.numberofpoints,vector<REAL>(3));\n  // loop over points\n  for(int i = 0;i < out.numberofpoints; i++)\n  {\n    V[i][0] = out.pointlist[i*3+0];\n    V[i][1] = out.pointlist[i*3+1];\n    V[i][2] = out.pointlist[i*3+2];\n  }\n\n\n  // process tets\n  if(out.tetrahedronlist == NULL)\n  {\n    cerr<<\"^tetgenio_to_tetmesh Error: tet list is NULL\\n\"<<endl;\n    return false;\n  }\n\n  // When would this not be 4?\n  assert(out.numberofcorners == 4);\n  T.resize(out.numberoftetrahedra,vector<int>(out.numberofcorners));\n  int min_index = 1e7;\n  int max_index = -1e7;\n  // loop over tetrahedra\n  for(int i = 0; i < out.numberoftetrahedra; i++)\n  {\n    for(int j = 0; j<out.numberofcorners; j++)\n    {\n      int index = out.tetrahedronlist[i * out.numberofcorners + j];\n      T[i][j] = index;\n      min_index = (min_index > index ? index : min_index);\n      max_index = (max_index < index ? index : max_index);\n    }\n  }\n  assert(min_index >= 0);\n  assert(max_index >= 0);\n  assert(max_index < (int)V.size());\n\n  cout<<out.numberoftrifaces<<endl;\n\n  // When would this not be 4?\n  F.clear();\n  // loop over tetrahedra\n  for(int i = 0; i < out.numberoftrifaces; i++)\n  {\n    if(out.trifacemarkerlist[i]>=0)\n    {\n      vector<int> face(3);\n      for(int j = 0; j<3; j++)\n      {\n        face[j] = out.trifacelist[i * 3 + j];\n      }\n      F.push_back(face);\n    }\n  }\n\n  return true;\n}\n\nIGL_INLINE bool igl::tetgenio_to_tetmesh(\n  const tetgenio & out,\n  std::vector<std::vector<REAL > > & V, \n  std::vector<std::vector<int> > & T)\n{\n  std::vector<std::vector<int> > F;\n  return igl::tetgenio_to_tetmesh(out,V,T,F);\n}\n\ntemplate <typename DerivedV, typename DerivedT, typename DerivedF>\nIGL_INLINE bool igl::tetgenio_to_tetmesh(\n  const tetgenio & out,\n  Eigen::PlainObjectBase<DerivedV>& V,\n  Eigen::PlainObjectBase<DerivedT>& T,\n  Eigen::PlainObjectBase<DerivedF>& F)\n{\n  using namespace igl;\n  using namespace std;\n  vector<vector<REAL> > vV;\n  vector<vector<int> > vT;\n  bool success = tetgenio_to_tetmesh(out,vV,vT);\n  if(!success)\n  {\n    return false;\n  }\n  bool V_rect = list_to_matrix(vV,V);\n  if(!V_rect)\n  {\n    // igl::list_to_matrix(vV,V) already printed error message to std err\n    return false;\n  }\n  bool T_rect = list_to_matrix(vT,T);\n  if(!T_rect)\n  {\n    // igl::list_to_matrix(vT,T) already printed error message to std err\n    return false;\n  }\n  return true;\n}\n\ntemplate <typename DerivedV, typename DerivedT>\nIGL_INLINE bool igl::tetgenio_to_tetmesh(\n  const tetgenio & out,\n  Eigen::PlainObjectBase<DerivedV>& V,\n  Eigen::PlainObjectBase<DerivedT>& T)\n{\n  Eigen::PlainObjectBase<DerivedT> F;\n  return tetgenio_to_tetmesh(out,V,T,F);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template specialization\ntemplate bool igl::tetgenio_to_tetmesh<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(tetgenio const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/tetgen/tetgenio_to_tetmesh.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_TETGENIO_TO_TETMESH_H\n#define IGL_TETGENIO_TO_TETMESH_H\n#include \"../igl_inline.h\"\n\n#define TETLIBRARY \n#include \"tetgen.h\" // Defined tetgenio, REAL\n#include <vector>\n#include <Eigen/Core>\nnamespace igl\n{\n  // Extract a tetrahedral mesh from a tetgenio object\n  // Inputs:\n  //   out tetgenio output object\n  // Outputs:\n  //   V  #V by 3 vertex position list\n  //   T  #T by 4 list of tetrahedra indices into V\n  //   F  #F by 3 list of marked facets\n  // Returns true on success, false on error\n  IGL_INLINE bool tetgenio_to_tetmesh(\n    const tetgenio & out,\n    std::vector<std::vector<REAL > > & V, \n    std::vector<std::vector<int> > & T,\n    std::vector<std::vector<int> > & F);\n  IGL_INLINE bool tetgenio_to_tetmesh(\n    const tetgenio & out,\n    std::vector<std::vector<REAL > > & V, \n    std::vector<std::vector<int> > & T);\n  \n  // Wrapper with Eigen types\n  // Templates:\n  //   DerivedV  real-value: i.e. from MatrixXd\n  //   DerivedT  integer-value: i.e. from MatrixXi\n  template <typename DerivedV, typename DerivedT, typename DerivedF>\n  IGL_INLINE bool tetgenio_to_tetmesh(\n    const tetgenio & out,\n    Eigen::PlainObjectBase<DerivedV>& V,\n    Eigen::PlainObjectBase<DerivedT>& T,\n    Eigen::PlainObjectBase<DerivedF>& F);\n  template <typename DerivedV, typename DerivedT>\n  IGL_INLINE bool tetgenio_to_tetmesh(\n    const tetgenio & out,\n    Eigen::PlainObjectBase<DerivedV>& V,\n    Eigen::PlainObjectBase<DerivedT>& T);\n}\n\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"tetgenio_to_tetmesh.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/tetgen/tetrahedralize.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"tetrahedralize.h\"\n#include \"mesh_to_tetgenio.h\"\n#include \"tetgenio_to_tetmesh.h\"\n\n// IGL includes \n#include <igl/matrix_to_list.h>\n#include <igl/list_to_matrix.h>\n#include <igl/boundary_facets.h>\n\n// STL includes\n#include <cassert>\n#include <iostream>\n\nIGL_INLINE int igl::tetrahedralize(\n  const std::vector<std::vector<REAL > > & V, \n  const std::vector<std::vector<int> > & F, \n  const std::string switches,\n  std::vector<std::vector<REAL > > & TV, \n  std::vector<std::vector<int > > & TT, \n  std::vector<std::vector<int> > & TF)\n{\n  using namespace std;\n  tetgenio in,out;\n  bool success;\n  success = mesh_to_tetgenio(V,F,in);\n  if(!success)\n  {\n    return -1;\n  }\n  try\n  {\n    char * cswitches = new char[switches.size() + 1];\n    std::strcpy(cswitches,switches.c_str());\n    ::tetrahedralize(cswitches,&in, &out);\n    delete[] cswitches;\n  }catch(int e)\n  {\n    cerr<<\"^\"<<__FUNCTION__<<\": TETGEN CRASHED... KABOOOM!!!\"<<endl;\n    return 1;\n  }\n  if(out.numberoftetrahedra == 0)\n  {\n    cerr<<\"^\"<<__FUNCTION__<<\": Tetgen failed to create tets\"<<endl;\n    return 2;\n  }\n  success = tetgenio_to_tetmesh(out,TV,TT,TF);\n  if(!success)\n  {\n    return -1;\n  }\n  //boundary_facets(TT,TF);\n  return 0;\n}\n\ntemplate <\n  typename DerivedV, \n  typename DerivedF, \n  typename DerivedTV, \n  typename DerivedTT, \n  typename DerivedTF>\nIGL_INLINE int igl::tetrahedralize(\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  const std::string switches,\n  Eigen::PlainObjectBase<DerivedTV>& TV,\n  Eigen::PlainObjectBase<DerivedTT>& TT,\n  Eigen::PlainObjectBase<DerivedTF>& TF)\n{\n  using namespace igl;\n  using namespace std;\n  vector<vector<REAL> > vV,vTV;\n  vector<vector<int> > vF,vTT,vTF;\n  matrix_to_list(V,vV);\n  matrix_to_list(F,vF);\n  int e = tetrahedralize(vV,vF,switches,vTV,vTT,vTF);\n  if(e == 0)\n  {\n    bool TV_rect = list_to_matrix(vTV,TV);\n    if(!TV_rect)\n    {\n      return false;\n    }\n    bool TT_rect = list_to_matrix(vTT,TT);\n    if(!TT_rect)\n    {\n      return false;\n    }\n    bool TF_rect = list_to_matrix(vTF,TF);\n    if(!TF_rect)\n    {\n      return false;\n    }\n  }\n  return e;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template specialization\ntemplate int igl::tetrahedralize<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/tetgen/tetrahedralize.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_TETRAHEDRALIZE_H\n#define IGL_TETRAHEDRALIZE_H\n#include \"../igl_inline.h\"\n\n#include <vector>\n#include <string>\n#include <Eigen/Core>\n#ifndef TETLIBRARY\n#define TETLIBRARY \n#endif\n#include \"tetgen.h\" // Defined REAL\n\nnamespace igl\n{\n  // Mesh the interior of a surface mesh (V,F) using tetgen\n  //\n  // Inputs:\n  //   V  #V by 3 vertex position list\n  //   F  #F list of polygon face indices into V (0-indexed)\n  //   switches  string of tetgen options (See tetgen documentation) e.g.\n  //     \"pq1.414a0.01\" tries to mesh the interior of a given surface with\n  //       quality and area constraints\n  //     \"\" will mesh the convex hull constrained to pass through V (ignores F)\n  // Outputs:\n  //   TV  #V by 3 vertex position list\n  //   TT  #T by 4 list of tet face indices\n  //   TF  #F by 3 list of trianlge face indices\n  // Returns status:\n  //   0 success\n  //   1 tetgen threw exception\n  //   2 tetgen did not crash but could not create any tets (probably there are\n  //     holes, duplicate faces etc.)\n  //   -1 other error\n  IGL_INLINE int tetrahedralize(\n    const std::vector<std::vector<REAL > > & V, \n    const std::vector<std::vector<int> > & F, \n    const std::string switches,\n    std::vector<std::vector<REAL > > & TV, \n    std::vector<std::vector<int > > & TT, \n    std::vector<std::vector<int> > & TF);\n  \n  // Wrapper with Eigen types\n  // Templates:\n  //   DerivedV  real-value: i.e. from MatrixXd\n  //   DerivedF  integer-value: i.e. from MatrixXi\n  template <\n    typename DerivedV, \n    typename DerivedF, \n    typename DerivedTV, \n    typename DerivedTT, \n    typename DerivedTF>\n  IGL_INLINE int tetrahedralize(\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    const std::string switches,\n    Eigen::PlainObjectBase<DerivedTV>& TV,\n    Eigen::PlainObjectBase<DerivedTT>& TT,\n    Eigen::PlainObjectBase<DerivedTF>& TF);\n}\n\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"tetrahedralize.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/texture_from_tga.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"texture_from_tga.h\"\n#ifndef IGL_NO_OPENGL\n\n#include \"tga.h\"\n#include \"report_gl_error.h\"\n#include <cstring>\n\nIGL_INLINE bool igl::texture_from_tga(const std::string tga_file, GLuint & id)\n{\n  using namespace std;\n\n  // read pixels to tga file\n  FILE * imgFile;\n  // \"-\" as input file name is code for read from stdin\n  imgFile = fopen(tga_file.c_str(),\"r\");\n  if(NULL==imgFile)\n  {\n    printf(\"IOError: %s could not be opened...\",tga_file.c_str());\n    return false;\n  }\n\n  // gliReadTGA annoyingly uses char * instead of const char *\n  size_t len = tga_file.length();\n  char* tga_file_char = new char [ len + 1 ];\n  strcpy( tga_file_char, tga_file.c_str() );\n  // read image\n  gliGenericImage* img = gliReadTGA(imgFile, tga_file_char, 0, 0);\n  // clean up filename buffer\n  delete[] tga_file_char;\n  fclose( imgFile );\n\n  // set up texture mapping parameters and generate texture id\n  glGenTextures(1,&id);\n  glBindTexture(GL_TEXTURE_2D, id);\n  // Texture parameters\n  float empty[] = {1.0f,1.0f,1.0f,0.0f};\n  glTexParameterfv(GL_TEXTURE_2D,GL_TEXTURE_BORDER_COLOR,empty);\n  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);\n  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);\n  //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,\n  //  GL_LINEAR_MIPMAP_NEAREST);\n  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,\n    GL_LINEAR);\n\n  // OpenGL by default tries to read data in multiples of 4, if our data is\n  // only RGB or BGR and the width is not divible by 4 then we need to alert\n  // opengl\n  if((img->width % 4) != 0 && \n   (img->format == GL_RGB || \n    img->format == GL_BGR))\n  {\n    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);\n    igl::report_gl_error();\n  }\n\n  // Load texture\n  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, img->width,\n    img->height, 0, img->format, GL_UNSIGNED_BYTE,\n    img->pixels);\n  return id;\n}\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/texture_from_tga.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_TEXTURE_FROM_TGA_H\n#define IGL_TEXTURE_FROM_TGA_H\n#ifndef IGL_NO_OPENGL\n#include \"igl_inline.h\"\n\n#include \"OpenGL_convenience.h\"\n\n#include <string>\n\nnamespace igl\n{\n  // Read an image from a .tga file and use it as a texture\n  //\n  // Input:\n  //  tga_file  path to .tga file\n  // Output:\n  //  id  of generated openGL texture\n  // Returns true on success, false on failure\n  IGL_INLINE bool texture_from_tga(const std::string tga_file, GLuint & id);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"texture_from_tga.cpp\"\n#endif\n\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/tga.cpp",
    "content": "////////////////////////////////////////////////////////////////////////////////\n//\n// WARNING\n//\n// THIS DOES NOT DEAL WITH VERTICALLY FLIPPED DATA CORRECTLY\n//\n////////////////////////////////////////////////////////////////////////////////\n\n/* This file is derived from (actually an earlier version of)... */\n\n/* The GIMP -- an image manipulation program\n * Copyright (C) 1995 Spencer Kimball and Peter Mattis\n *\n * $Id: tga.cpp,v 1.1.2.5 2007-05-10 02:10:07 elif Exp $\n * TrueVision Targa loading and saving file filter for the Gimp.\n * Targa code Copyright (C) 1997 Raphael FRANCOIS and Gordon Matzigkeit\n *\n * The Targa reading and writing code was written from scratch by\n * Raphael FRANCOIS <fraph@ibm.net> and Gordon Matzigkeit\n * <gord@gnu.ai.mit.edu> based on the TrueVision TGA File Format\n * Specification, Version 2.0:\n *\n *   <URL:ftp://ftp.truevision.com/pub/TGA.File.Format.Spec/>\n *\n * It does not contain any code written for other TGA file loaders.\n * Not even the RLE handling. ;)\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 2 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, write to the Free Software\n * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n */\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <assert.h>\n\n#include \"tga.h\"\n#ifndef IGL_NO_OPENGL\n\n\nstatic char error[256];\nstatic unsigned int _verbose = 0;\nstatic int totbytes = 0;\n\ntypedef struct {\n  unsigned char *statebuf;\n  int statelen;\n  int laststate;\n} RLEstate;\n\nIGL_INLINE static int\nstd_fread(RLEstate * /*rleInfo*/, unsigned char *buf, size_t datasize, size_t nelems, FILE *fp)\n{\n  if (_verbose > 1) {\n    totbytes += nelems * datasize;\n    printf(\"TGA: std_fread %d (total %d)\\n\",\n      (int)(nelems * datasize), totbytes);\n  }\n  return fread(buf, datasize, nelems, fp);\n}\n\n#define MIN(a,b) (((a) < (b)) ? (a) : (b))\n\n#define RLE_PACKETSIZE 0x80\n\n/* Decode a bufferful of file. */\nIGL_INLINE static int\nrle_fread(RLEstate *rleInfo, unsigned char *vbuf, size_t datasize, size_t nelems, FILE *fp)\n{\n\n  unsigned char *buf = vbuf;\n  int j, k;\n  int buflen, count, bytes, curbytes;\n  unsigned char *p;\n\n  /* Scale the buffer length. */\n  buflen = nelems * datasize;\n\n  j = 0;\n  curbytes = totbytes;\n  while (j < buflen) {\n    if (rleInfo->laststate < rleInfo->statelen) {\n      /* Copy bytes from our previously decoded buffer. */\n      bytes = MIN(buflen - j, rleInfo->statelen - rleInfo->laststate);\n      memcpy(buf + j, rleInfo->statebuf + rleInfo->laststate, bytes);\n      j += bytes;\n      rleInfo->laststate += bytes;\n\n      /* If we used up all of our state bytes, then reset them. */\n      if (rleInfo->laststate >= rleInfo->statelen) {\n        rleInfo->laststate = 0;\n        rleInfo->statelen = 0;\n      }\n\n      /* If we filled the buffer, then exit the loop. */\n      if (j >= buflen) break;\n    }\n\n    /* Decode the next packet. */\n    count = fgetc(fp);\n    if (count == EOF) {\n      if (_verbose) printf(\"TGA: hit EOF while looking for count\\n\");\n      return j / datasize;\n    }\n\n    /* Scale the byte length to the size of the data. */\n    bytes = ((count & ~RLE_PACKETSIZE) + 1) * datasize;\n\n    if (j + bytes <= buflen) {\n      /* We can copy directly into the image buffer. */\n      p = buf + j;\n    } else {\n#ifdef PROFILE\n      printf(\"TGA: needed to use statebuf for %d bytes\\n\", buflen - j);\n#endif\n      /* Allocate the state buffer if we haven't already. */\n      if (!rleInfo->statebuf) {\n        rleInfo->statebuf = (unsigned char *) malloc(RLE_PACKETSIZE * datasize);\n      }\n      p = rleInfo->statebuf;\n    }\n\n    if (count & RLE_PACKETSIZE) {\n      /* Fill the buffer with the next value. */\n      if (fread(p, datasize, 1, fp) != 1) {\n        if (_verbose) {\n          printf(\"TGA: EOF while reading %d/%d element RLE packet\\n\",\n            bytes, (int)datasize);\n        }\n        return j / datasize;\n      }\n\n      /* Optimized case for single-byte encoded data. */\n      if (datasize == 1) {\n        memset(p + 1, *p, bytes - 1);\n      } else {\n        for (k = datasize; k < bytes; k += datasize) {\n          memcpy(p + k, p, datasize);\n        }\n      }\n    } else {\n      /* Read in the buffer. */\n      if (fread(p, bytes, 1, fp) != 1) {\n        if (_verbose) {\n          printf(\"TGA: EOF while reading %d/%d element raw packet\\n\",\n            bytes, (int)datasize);\n        }\n        return j / datasize;\n      }\n    }\n\n    if (_verbose > 1) {\n      totbytes += bytes;\n      if (_verbose > 2) {\n        printf(\"TGA: %s packet %d/%d\\n\",\n          (count & RLE_PACKETSIZE) ? \"RLE\" : \"raw\",\n          bytes, totbytes);\n      }\n    }\n\n    /* We may need to copy bytes from the state buffer. */\n    if (p == rleInfo->statebuf) {\n      rleInfo->statelen = bytes;\n    } else {\n      j += bytes;\n    }\n  }\n\n  if (_verbose > 1) {\n    printf(\"TGA: rle_fread %d/%d (total %d)\\n\",\n    (int) ( nelems * datasize), totbytes - curbytes, totbytes);\n  }\n  return nelems;\n}\n\nIGL_INLINE igl::gliGenericImage *\nigl::gliReadTGA(FILE *fp, char *name, int /*hflip*/, int vflip)\n{\n  igl::TgaHeader tgaHeader;\n  igl::TgaFooter tgaFooter;\n  char horzrev, vertrev;\n  int width, height, bpp;\n  int start, end, dir;\n  int i, j, k;\n  int pelbytes, wbytes;\n  GLenum format;\n  int components;\n  RLEstate rleRec;\n  RLEstate *rleInfo;\n  int rle;\n  int index, colors, length;\n  GLubyte *cmap, *pixels, *data;\n  int (*myfread)(RLEstate *rleInfo, unsigned char*, size_t, size_t, FILE*);\n  igl::gliGenericImage *genericImage;\n\n  /* Check the footer. */\n  if (fseek(fp, 0L - sizeof(tgaFooter), SEEK_END)\n      || fread(&tgaFooter, sizeof(tgaFooter), 1, fp) != 1) {\n    sprintf(error, \"TGA: Cannot read footer from \\\"%s\\\"\", name);\n    if (_verbose) printf(\"%s\\n\", error);\n    return NULL;\n  }  \n\n  /* Check the signature. */\n  if (memcmp(tgaFooter.signature, TGA_SIGNATURE,\n             sizeof(tgaFooter.signature)) == 0) {\n    if (_verbose) printf(\"TGA: found New TGA\\n\");\n  } else {\n    if (_verbose) printf(\"TGA: found Original TGA\\n\");\n  }\n\n  if (fseek(fp, 0, SEEK_SET) ||\n      fread(&tgaHeader, sizeof(tgaHeader), 1, fp) != 1) {\n    sprintf(error, \"TGA: Cannot read header from \\\"%s\\\"\", name);\n    if (_verbose) printf(\"%s\\n\", error);\n    return NULL;\n  }\n\n  if (_verbose && tgaHeader.idLength) {\n    char *idString = (char*) malloc(tgaHeader.idLength);\n    \n    if (fread(idString, tgaHeader.idLength, 1, fp) != 1) {\n      sprintf(error, \"TGA: Cannot read ID field in \\\"%s\\\"\", name);\n      printf(\"%s\\n\", error);\n    } else {\n      printf(\"TGA: ID field: \\\"%*s\\\"\\n\", tgaHeader.idLength, idString);\n    }\n    free(idString);\n  } else {\n    /* Skip the image ID field. */\n    if (tgaHeader.idLength && fseek(fp, tgaHeader.idLength, SEEK_CUR)) {\n      sprintf(error, \"TGA: Cannot skip ID field in \\\"%s\\\"\", name);\n      if (_verbose) printf(\"%s\\n\", error);\n      return NULL;\n    }\n  }\n  \n  /* Reassemble the multi-byte values correctly, regardless of\n     host endianness. */\n  width = (tgaHeader.widthHi << 8) | tgaHeader.widthLo;\n  height = (tgaHeader.heightHi << 8) | tgaHeader.heightLo;\n  bpp = tgaHeader.bpp;\n  if (_verbose) {\n    printf(\"TGA: width=%d, height=%d, bpp=%d\\n\", width, height, bpp);\n  }\n\n  horzrev = tgaHeader.descriptor & TGA_DESC_HORIZONTAL;\n  vertrev = tgaHeader.descriptor & TGA_DESC_VERTICAL;\n  //vertrev=0;\n\n//   // JASON - we can force this stuff if we want\n//   if( hflip )\n//       horzrev = 1;\n  if( vflip )\n      vertrev = 1;\n\n  if (_verbose && horzrev) printf(\"TGA: horizontal reversed\\n\");\n  if (_verbose && vertrev) printf(\"TGA: vertical reversed\\n\");\n\n  rle = 0;\n  switch (tgaHeader.imageType) {\n  case TGA_TYPE_MAPPED_RLE:\n    rle = 1;\n    if (_verbose) printf(\"TGA: run-length encoded\\n\");\n  case TGA_TYPE_MAPPED:\n    /* Test for alpha channel. */\n    format = GL_COLOR_INDEX;\n    components = 1;\n    if (_verbose) {\n      printf(\"TGA: %d bit indexed image (%d bit palette)\\n\",\n        tgaHeader.colorMapSize, bpp);\n    }\n    break;\n\n  case TGA_TYPE_GRAY_RLE:\n    rle = 1;\n    if (_verbose) printf(\"TGA: run-length encoded\\n\");\n  case TGA_TYPE_GRAY:\n    format = GL_LUMINANCE;\n    components = 1;\n    if (_verbose) printf(\"TGA: %d bit grayscale image\\n\", bpp);\n    break;\n\n  case TGA_TYPE_COLOR_RLE:\n    rle = 1;\n    if (_verbose) printf(\"TGA: run-length encoded\\n\");\n  case TGA_TYPE_COLOR:\n    /* Test for alpha channel. */\n    if (bpp == 32) {\n      format = GL_BGRA_EXT;\n      components = 4;\n      if (_verbose) {\n        printf(\"TGA: %d bit color image with alpha channel\\n\", bpp);\n      }\n    } else {\n      format = GL_BGR_EXT;\n      components = 3;\n      if (_verbose) printf(\"TGA: %d bit color image\\n\", bpp);\n    }\n    break;\n\n  default:\n    sprintf(error,\n      \"TGA: unrecognized image type %d\\n\", tgaHeader.imageType);\n    if (_verbose) printf(\"%s\\n\", error);\n    return NULL;\n  }\n\n  if ((format == GL_BGRA_EXT && bpp != 32) ||\n      (format == GL_BGR_EXT && bpp != 24) ||\n      ((format == GL_LUMINANCE || format == GL_COLOR_INDEX) && bpp != 8)) {\n    /* FIXME: We haven't implemented bit-packed fields yet. */\n    fprintf(stderr, \"bpp %d, format %x\\n\", bpp, (unsigned int)format); \n    sprintf(error, \"TGA: channel sizes other than 8 bits are unimplemented\");\n    if (_verbose) printf(\"%s\\n\", error);\n    return NULL;\n  }\n\n  /* Check that we have a color map only when we need it. */\n  if (format == GL_COLOR_INDEX) {\n    if (tgaHeader.colorMapType != 1) {\n      sprintf(error, \"TGA: indexed image has invalid color map type %d\\n\",\n        tgaHeader.colorMapType);\n      if (_verbose) printf(\"%s\\n\", error);\n      return NULL;\n    }\n  } else if (tgaHeader.colorMapType != 0) {\n    sprintf(error, \"TGA: non-indexed image has invalid color map type %d\\n\",\n      tgaHeader.colorMapType);\n    if (_verbose) printf(\"%s\\n\", error);\n    return NULL;\n  }\n\n  if (tgaHeader.colorMapType == 1) {\n    /* We need to read in the colormap. */\n    index = (tgaHeader.colorMapIndexHi << 8) | tgaHeader.colorMapIndexLo;\n    length = (tgaHeader.colorMapLengthHi << 8) | tgaHeader.colorMapLengthLo;\n\n    if (_verbose) {\n      printf(\"TGA: reading color map (%d + %d) * (%d / 8)\\n\",\n        index, length, tgaHeader.colorMapSize);\n    }\n    if (length == 0) {\n      sprintf(error, \"TGA: invalid color map length %d\", length);\n      if (_verbose) printf(\"%s\\n\", error);\n      return NULL;\n    }\n    if (tgaHeader.colorMapSize != 24) {\n      /* We haven't implemented bit-packed fields yet. */\n      sprintf(error, \"TGA: channel sizes other than 8 bits are unimplemented\");\n      if (_verbose) printf(\"%s\\n\", error);\n      return NULL;\n    }\n\n    pelbytes = tgaHeader.colorMapSize / 8;\n    colors = length + index;\n    cmap = (GLubyte*)malloc (colors * pelbytes);\n\n    /* Zero the entries up to the beginning of the map. */\n    memset(cmap, 0, index * pelbytes);\n\n    /* Read in the rest of the colormap. */\n    if (fread(cmap, pelbytes, length, fp) != (size_t) length) {\n      sprintf(error, \"TGA: error reading colormap (ftell == %ld)\\n\",\n        ftell (fp));\n      if (_verbose) printf(\"%s\\n\", error);\n      return NULL;\n    }\n\n    if (pelbytes >= 3) {\n      /* Rearrange the colors from BGR to RGB. */\n      int tmp;\n      for (j = index; j < length * pelbytes; j += pelbytes) {\n        tmp = cmap[j];\n        cmap[j] = cmap[j + 2];\n        cmap[j + 2] = tmp;\n      }\n    }\n  } else {\n    colors = 0;\n    cmap = NULL;\n  }\n\n  /* Allocate the data. */\n  pelbytes = bpp / 8;\n  pixels = (unsigned char *) malloc (width * height * pelbytes);\n\n  if (rle) {\n    rleRec.statebuf = 0;\n    rleRec.statelen = 0;\n    rleRec.laststate = 0;\n    rleInfo = &rleRec;\n    myfread = rle_fread;\n  } else {\n    rleInfo = NULL;\n    myfread = std_fread;\n  }\n\n  wbytes = width * pelbytes;\n\n  if (vertrev) {\n    start = 0;\n    end = height;\n    dir = 1;\n  } else {\n    /* We need to reverse loading order of rows. */\n    start = height-1;\n    end = -1;\n    dir = -1;\n  }\n\n  for (i = start; i != end; i += dir) {\n    data = pixels + i*wbytes;\n\n    /* Suck in the data one row at a time. */\n    if (myfread(rleInfo, data, pelbytes, width, fp) != width) {\n      /* Probably premature end of file. */\n      if (_verbose) {\n        printf (\"TGA: error reading (ftell == %ld, width=%d)\\n\",\n          ftell(fp), width);\n      }\n      return NULL;\n    }  \n\n    if (horzrev) {\n      /* We need to mirror row horizontally. */\n      for (j = 0; j < width/2; j++) {\n        GLubyte tmp;\n\n        for (k = 0; k < pelbytes; k++) {\n          tmp = data[j*pelbytes+k];\n          data[j*pelbytes+k] = data[(width-j-1)*pelbytes+k];\n          data[(width-j-1)*pelbytes+k] = tmp;\n        }\n      }\n    }\n  }\n\n  if (rle) {\n    free(rleInfo->statebuf);\n  }\n\n  if (fgetc (fp) != EOF) {\n    if (_verbose) printf (\"TGA: too much input data, ignoring extra...\\n\");\n  }\n\n  genericImage = (igl::gliGenericImage*) malloc(sizeof(igl::gliGenericImage));\n  genericImage->width = width;\n  genericImage->height = height;\n  genericImage->format = format;\n  genericImage->components = components;\n  genericImage->cmapEntries = colors;\n  genericImage->cmapFormat = GL_BGR_EXT;  // XXX fix me\n  genericImage->cmap = cmap;\n  genericImage->pixels = pixels;\n\n  return genericImage;\n}\n\nIGL_INLINE int igl::gli_verbose(int new_verbose)\n{\n  _verbose = new_verbose;\n  return _verbose;\n}\n\n\n\n// added 10/2005, Denis Zorin\n// a very simple TGA output, supporting \n// uncompressed luminance RGB and RGBA \n// G22.2270 students: this is C (no C++) \n// so this is not the style I would encourage\n// you to use; I used it for consistency \n// with the rest of the code in this file \n\n\n// fixed header values for the subset of TGA we use for writing\nunsigned char TGAHeaderColor[12] = \n  { 0,// 0 ID length = no id\n    0,// 1 color map type = no color map\n    2,// 2 image type = uncompressed true color\n    0, 0, 0, 0, 0,// color map spec = empty\n    0, 0,  // x origin of image \n    0, 0   // y origin of image\n  };\n\nunsigned char TGAHeaderBW[12] = \n  { 0,// 0 ID length = no id\n    0,// 1 color map type = no color map\n    3,// 3 image type = uncompressed black and white\n    0, 0, 0, 0, 0,// color map spec = empty\n    0, 0,  // x origin of image \n    0, 0   // y origin of image\n  };\n\n// this makes sure that \n// image size is written in correct format \n// and byte order (least first)\nIGL_INLINE void write16bit(int n, FILE* fp) { \n  unsigned char bytes[] = { static_cast<unsigned char>(n % 256), static_cast<unsigned char>(n / 256) };\n  fwrite(bytes, 2, sizeof(unsigned char),fp);\n}\n\n\n\nIGL_INLINE void igl::writeTGA( igl::gliGenericImage* image, FILE *fp) {\n\n  assert(!image->cmap); // we do not deal with color map images\n    \n  if(image->components == 3 || image->components == 4) \n    fwrite(TGAHeaderColor, 12, sizeof(unsigned char),fp);\n  else { \n    if(image->components == 1 ) \n      fwrite(TGAHeaderBW, 12, sizeof(unsigned char),fp);        \n    else { fprintf(stderr,\"Supported component number: 1,3 or 4\\n\"); exit(1); }\n  }\n\n  write16bit(image->width,fp);  \n  write16bit(image->height,fp);  \n  switch (image->components ) { \n  case 1: \n    putc(8,fp);\n    break;\n  case 3: \n    putc(24,fp); \n    break;\n  case 4:\n    putc(32,fp);\n    break;\n  default: fprintf(stderr,\"Supported component number: 1,3 or 4\\n\"); exit(1); \n  };\n  \n  if(image-> components == 4) \n    putc(0x04,fp); // bottom left image (0x00) + 8 bit alpha (0x4)\n  else \n    putc(0x00,fp);\n\n  fwrite(image->pixels, image->height*image->width*image->components, sizeof(char),fp);\n}\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/tga.h",
    "content": "#ifndef IGL_TGA_H\n#define IGL_TGA_H\n#ifndef IGL_NO_OPENGL\n#include \"igl_inline.h\"\n// See license in tga.cpp\n\n/* tga.h - interface for TrueVision (TGA) image file loader */\n\n#include <stdio.h>\n\n#ifdef _WIN32\n#include <windows.h>\n#endif\n\n#include \"OpenGL_convenience.h\"\n\nnamespace igl\n{\n\ntypedef struct {\n\n  GLsizei  width;\n  GLsizei  height;\n  GLint    components;\n  GLenum   format;\n\n  GLsizei  cmapEntries;\n  GLenum   cmapFormat;\n  GLubyte *cmap;\n\n  GLubyte *pixels;\n  \n} gliGenericImage;\n\ntypedef struct {\n  unsigned char idLength;\n  unsigned char colorMapType;\n\n  /* The image type. */\n#define TGA_TYPE_MAPPED 1\n#define TGA_TYPE_COLOR 2\n#define TGA_TYPE_GRAY 3\n#define TGA_TYPE_MAPPED_RLE 9\n#define TGA_TYPE_COLOR_RLE 10\n#define TGA_TYPE_GRAY_RLE 11\n  unsigned char imageType;\n\n  /* Color Map Specification. */\n  /* We need to separately specify high and low bytes to avoid endianness\n     and alignment problems. */\n  unsigned char colorMapIndexLo, colorMapIndexHi;\n  unsigned char colorMapLengthLo, colorMapLengthHi;\n  unsigned char colorMapSize;\n\n  /* Image Specification. */\n  unsigned char xOriginLo, xOriginHi;\n  unsigned char yOriginLo, yOriginHi;\n\n  unsigned char widthLo, widthHi;\n  unsigned char heightLo, heightHi;\n\n  unsigned char bpp;\n\n  /* Image descriptor.\n     3-0: attribute bpp\n     4:   left-to-right ordering\n     5:   top-to-bottom ordering\n     7-6: zero\n     */\n#define TGA_DESC_ABITS 0x0f\n#define TGA_DESC_HORIZONTAL 0x10\n#define TGA_DESC_VERTICAL 0x20\n  unsigned char descriptor;\n\n} TgaHeader;\n\ntypedef struct {\n  unsigned int extensionAreaOffset;\n  unsigned int developerDirectoryOffset;\n#define TGA_SIGNATURE \"TRUEVISION-XFILE\"\n  char signature[16];\n  char dot;\n  char null;\n} TgaFooter;\n\nIGL_INLINE extern gliGenericImage *gliReadTGA(FILE *fp, char *name, int hflip, int vflip);\nIGL_INLINE int gli_verbose(int new_verbose);\nIGL_INLINE extern int gliVerbose(int newVerbose);\n\nIGL_INLINE void writeTGA( gliGenericImage* image, FILE *fp);\n\n\n\n} // end of igl namespace\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"tga.cpp\"\n#endif\n\n#endif \n#endif \n"
  },
  {
    "path": "libs/libigl/include/igl/trackball.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"trackball.h\"\n\n#include \"EPS.h\"\n#include \"dot.h\"\n#include \"cross.h\"\n#include \"axis_angle_to_quat.h\"\n#include \"quat_mult.h\"\n#include <cmath>\n#include <cstdlib>\n#include <cassert>\n#include <algorithm>\n#include <iostream>\n\n// Utility IGL_INLINE functions\ntemplate <typename Q_type>\nstatic IGL_INLINE Q_type _QuatD(double w, double h)\n{\n  using namespace std;\n  return (Q_type)(std::abs(w) < std::abs(h) ? std::abs(w) : std::abs(h)) - 4;\n}\ntemplate <typename Q_type>\nstatic IGL_INLINE Q_type _QuatIX(double x, double w, double h)\n{\n  return (2.0f*(Q_type)x - (Q_type)w - 1.0f)/_QuatD<Q_type>(w, h);\n}\ntemplate <typename Q_type>\nstatic IGL_INLINE Q_type _QuatIY(double y, double w, double h)\n{\n  return (-2.0f*(Q_type)y + (Q_type)h - 1.0f)/_QuatD<Q_type>(w, h);\n}\n\n// This is largely the trackball as implemented in AntTweakbar. Much of the\n// code is straight from its source in TwMgr.cpp\n// http://www.antisphere.com/Wiki/tools:anttweakbar\ntemplate <typename Q_type>\nIGL_INLINE void igl::trackball(\n  const double w,\n  const double h,\n  const Q_type speed_factor,\n  const double down_mouse_x,\n  const double down_mouse_y,\n  const double mouse_x,\n  const double mouse_y,\n  Q_type * quat)\n{\n  assert(speed_factor > 0);\n\n  double original_x =\n    _QuatIX<Q_type>(speed_factor*(down_mouse_x-w/2)+w/2, w, h);\n  double original_y =\n    _QuatIY<Q_type>(speed_factor*(down_mouse_y-h/2)+h/2, w, h);\n\n  double x = _QuatIX<Q_type>(speed_factor*(mouse_x-w/2)+w/2, w, h);\n  double y = _QuatIY<Q_type>(speed_factor*(mouse_y-h/2)+h/2, w, h);\n\n  double z = 1;\n  double n0 = sqrt(original_x*original_x + original_y*original_y + z*z);\n  double n1 = sqrt(x*x + y*y + z*z);\n  if(n0>igl::DOUBLE_EPS && n1>igl::DOUBLE_EPS)\n  {\n    double v0[] = { original_x/n0, original_y/n0, z/n0 };\n    double v1[] = { x/n1, y/n1, z/n1 };\n    double axis[3];\n    cross(v0,v1,axis);\n    double sa = sqrt(dot(axis, axis));\n    double ca = dot(v0, v1);\n    double angle = atan2(sa, ca);\n    if( x*x+y*y>1.0 )\n    {\n      angle *= 1.0 + 0.2f*(sqrt(x*x+y*y)-1.0);\n    }\n    double qrot[4];\n    axis_angle_to_quat(axis,angle,qrot);\n    quat[0] = qrot[0];\n    quat[1] = qrot[1];\n    quat[2] = qrot[2];\n    quat[3] = qrot[3];\n  }\n}\n\n\ntemplate <typename Q_type>\nIGL_INLINE void igl::trackball(\n  const double w,\n  const double h,\n  const Q_type speed_factor,\n  const Q_type * down_quat,\n  const double down_mouse_x,\n  const double down_mouse_y,\n  const double mouse_x,\n  const double mouse_y,\n  Q_type * quat)\n{\n  double qrot[4], qres[4], qorig[4];\n  igl::trackball<double>(\n    w,h,\n    speed_factor,\n    down_mouse_x,down_mouse_y,\n    mouse_x,mouse_y,\n    qrot);\n  double nqorig =\n    sqrt(down_quat[0]*down_quat[0]+\n    down_quat[1]*down_quat[1]+\n    down_quat[2]*down_quat[2]+\n    down_quat[3]*down_quat[3]);\n\n  if( fabs(nqorig)>igl::DOUBLE_EPS_SQ )\n  {\n      qorig[0] = down_quat[0]/nqorig;\n      qorig[1] = down_quat[1]/nqorig;\n      qorig[2] = down_quat[2]/nqorig;\n      qorig[3] = down_quat[3]/nqorig;\n      igl::quat_mult<double>(qrot,qorig,qres);\n      quat[0] = qres[0];\n      quat[1] = qres[1];\n      quat[2] = qres[2];\n      quat[3] = qres[3];\n  }\n  else\n  {\n      quat[0] = qrot[0];\n      quat[1] = qrot[1];\n      quat[2] = qrot[2];\n      quat[3] = qrot[3];\n  }\n}\n\ntemplate <typename Scalardown_quat, typename Scalarquat>\nIGL_INLINE void igl::trackball(\n  const double w,\n  const double h,\n  const double speed_factor,\n  const Eigen::Quaternion<Scalardown_quat> & down_quat,\n  const double down_mouse_x,\n  const double down_mouse_y,\n  const double mouse_x,\n  const double mouse_y,\n  Eigen::Quaternion<Scalarquat> & quat)\n{\n  using namespace std;\n  return trackball(\n    w,\n    h,\n    (Scalarquat)speed_factor,\n    down_quat.coeffs().data(),\n    down_mouse_x,\n    down_mouse_y,\n    mouse_x,\n    mouse_y,\n    quat.coeffs().data());\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::trackball<double>(double, double, double, double const*, double, double, double, double, double*);\n// generated by autoexplicit.sh\ntemplate void igl::trackball<float>(double, double, float, float const*, double, double, double, double, float*);\ntemplate void igl::trackball<float, float>(double, double, double, Eigen::Quaternion<float, 0> const&, double, double, double, double, Eigen::Quaternion<float, 0>&);\ntemplate void igl::trackball<double, double>(double, double, double, Eigen::Quaternion<double, 0> const&, double, double, double, double, Eigen::Quaternion<double, 0>&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/trackball.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_TRACKBALL_H\n#define IGL_TRACKBALL_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <Eigen/Geometry>\n\nnamespace igl\n{\n  // Applies a trackball drag to identity\n  // Inputs:\n  //   w  width of the trackball context\n  //   h  height of the trackball context\n  //   speed_factor  controls how fast the trackball feels, 1 is normal\n  //   down_mouse_x  x position of mouse down\n  //   down_mouse_y  y position of mouse down\n  //   mouse_x  current x position of mouse\n  //   mouse_y  current y position of mouse\n  // Outputs:\n  //   quat  the resulting rotation (as quaternion)\n  template <typename Q_type>\n  IGL_INLINE void trackball(\n    const double w,\n    const double h,\n    const Q_type speed_factor,\n    const double down_mouse_x,\n    const double down_mouse_y,\n    const double mouse_x,\n    const double mouse_y,\n    Q_type * quat);\n\n  // Applies a trackball drag to a given rotation\n  // Inputs:\n  //   w  width of the trackball context\n  //   h  height of the trackball context\n  //   speed_factor  controls how fast the trackball feels, 1 is normal\n  //   down_quat  rotation at mouse down, i.e. the rotation we're applying the\n  //     trackball motion to (as quaternion)\n  //   down_mouse_x  x position of mouse down\n  //   down_mouse_y  y position of mouse down\n  //   mouse_x  current x position of mouse\n  //   mouse_y  current y position of mouse\n  // Outputs:\n  //   quat  the resulting rotation (as quaternion)\n  template <typename Q_type>\n  IGL_INLINE void trackball(\n    const double w,\n    const double h,\n    const Q_type speed_factor,\n    const Q_type * down_quat,\n    const double down_mouse_x,\n    const double down_mouse_y,\n    const double mouse_x,\n    const double mouse_y,\n    Q_type * quat);\n  // Eigen wrapper.\n  template <typename Scalardown_quat, typename Scalarquat>\n  IGL_INLINE void trackball(\n    const double w,\n    const double h,\n    const double speed_factor,\n    const Eigen::Quaternion<Scalardown_quat> & down_quat,\n    const double down_mouse_x,\n    const double down_mouse_y,\n    const double mouse_x,\n    const double mouse_y,\n    Eigen::Quaternion<Scalarquat> & quat);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"trackball.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/transpose_blocks.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"transpose_blocks.h\"\n\n#include <cassert>\n\ntemplate <typename T>\nIGL_INLINE void igl::transpose_blocks(\n  const Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> & A,\n  const size_t k,\n  const size_t dim,\n  Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> & B)\n{\n  // Eigen matrices must be 2d so dim must be only 1 or 2\n  assert(dim == 1 || dim == 2);\n  // Output is not allowed to be input\n  assert(&A != &B);\n\n\n  // block height, width, and number of blocks\n  int m,n;\n  if(dim == 1)\n  {\n    m = A.rows()/k;\n    n = A.cols();\n  }else// dim == 2\n  {\n    m = A.rows();\n    n = A.cols()/k;\n  }\n\n  // resize output\n  if(dim == 1)\n  {\n    B.resize(n*k,m);\n  }else//dim ==2\n  {\n    B.resize(n,m*k);\n  }\n\n  // loop over blocks\n  for(int b = 0;b<(int)k;b++)\n  {\n    if(dim == 1)\n    {\n      B.block(b*n,0,n,m) = A.block(b*m,0,m,n).transpose();\n    }else//dim ==2\n    {\n      B.block(0,b*m,n,m) = A.block(0,b*n,m,n).transpose();\n    }\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::transpose_blocks<double>(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, size_t, size_t, Eigen::Matrix<double, -1, -1, 0, -1, -1>&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/transpose_blocks.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_TRANSPOSE_BLOCKS_H\n#define IGL_TRANSPOSE_BLOCKS_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Core>\n\nnamespace igl\n{\n  // Templates:\n  //   T  should be a eigen matrix primitive type like int or double\n  // Inputs:\n  //   A  m*k by n (dim: 1) or m by n*k (dim: 2) eigen Matrix of type T values\n  //   k  number of blocks\n  //   dim  dimension in which to transpose\n  // Output\n  //   B  n*k by m (dim: 1) or n by m*k (dim: 2) eigen Matrix of type T values,\n  //   NOT allowed to be the same as A\n  //\n  // Example:\n  // A = [\n  //   1   2   3   4\n  //   5   6   7   8\n  // 101 102 103 104\n  // 105 106 107 108\n  // 201 202 203 204\n  // 205 206 207 208];\n  // transpose_blocks(A,1,3,B);\n  // B -> [\n  //   1   5\n  //   2   6\n  //   3   7\n  //   4   8\n  // 101 105\n  // 102 106\n  // 103 107\n  // 104 108\n  // 201 205\n  // 202 206\n  // 203 207\n  // 204 208];\n  //   \n  template <typename T>\n  IGL_INLINE void transpose_blocks(\n    const Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> & A,\n    const size_t k,\n    const size_t dim,\n    Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> & B);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"transpose_blocks.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/triangle/cdt.cpp",
    "content": "#include \"cdt.h\"\n#include \"../bounding_box.h\"\n#include \"../triangle/triangulate.h\"\n#include \"../remove_duplicate_vertices.h\"\n#include \"../remove_unreferenced.h\"\n#include \"../slice_mask.h\"\n\ntemplate <\n  typename DerivedV, \n  typename DerivedE,\n  typename DerivedWV,\n  typename DerivedWF,\n  typename DerivedWE,\n  typename DerivedJ>\nIGL_INLINE void igl::triangle::cdt(\n  const Eigen::MatrixBase<DerivedV> & V,\n  const Eigen::MatrixBase<DerivedE> & E,\n  const std::string & flags,\n  Eigen::PlainObjectBase<DerivedWV> & WV,\n  Eigen::PlainObjectBase<DerivedWF> & WF,\n  Eigen::PlainObjectBase<DerivedWE> & WE,\n  Eigen::PlainObjectBase<DerivedJ> & J)\n{\n  assert(V.cols() == 2);\n  assert(E.cols() == 2);\n  typedef typename DerivedV::Scalar Scalar;\n  typedef Eigen::Matrix<Scalar,Eigen::Dynamic,2> MatrixX2S;\n  //MatrixX2S BV;\n  //Eigen::MatrixXi BE;\n  //igl::bounding_box(V,BV,BE);\n  //WV.resize(V.rows()+BV.rows(),2);\n  //WV<<V,BV;\n  //WE.resize(E.rows()+BE.rows(),2);\n  //WE<<E,(BE.array()+V.rows());\n  WV = V;\n  WE = E;\n  Eigen::VectorXi _;\n  igl::remove_duplicate_vertices(DerivedWV(WV),DerivedWE(WE),1e-10,WV,_,J,WE);\n  // Remove degenerate edges\n  igl::slice_mask(DerivedWE(WE),(WE.array().col(0) != WE.array().col(1)).eval(),1,WE);\n  // c flag must be present\n  igl::triangle::triangulate(DerivedWV(WV),WE,DerivedWV(),flags,WV,WF);\n  Eigen::VectorXi UJ;\n  igl::remove_unreferenced(DerivedV(WV),Eigen::MatrixXi(WF),WV,WF,UJ);\n  for(int i=0;i<WE.rows();i++) for(int j=0;j<WE.cols();j++) WE(i,j)=UJ(WE(i,j));\n  // Remove edges from box\n  //WE.conservativeResize(WE.rows()-BE.rows(),2);\n  for(int i=0;i<J.size();i++) J(i)=UJ(J(i));\n  //J.conservativeResize(J.size()-BV.rows());\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::triangle::cdt<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::triangle::cdt<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/triangle/cdt.h",
    "content": "#ifndef IGL_TRIANGLE_CDT_H\n#define IGL_TRIANGLE_CDT_H\n\n#include \"../igl_inline.h\"\n#include <Eigen/Core>\n\nnamespace igl\n{\n  namespace triangle\n  {\n    // CDT Construct the constrained delaunay triangulation of the convex hull\n    // of a given set of points and segments in 2D. This differs from a direct\n    // call to triangulate because it will preprocess the input to remove\n    // duplicates and return an adjusted segment list on the output.\n    // \n    //\n    // BACKGROUND_MESH Construct a background mesh for a (messy) texture mesh with\n    // cosntraint edges that are about to deform.\n    // \n    // Inputs:\n    //   V  #V by 2 list of texture mesh vertices\n    //   E  #E by 2 list of constraint edge indices into V\n    //   flags  string of triangle flags should contain \"-c\" unless the\n    //     some subset of segments are known to enclose all other\n    //     points/segments.\n    // Outputs:\n    //   WV  #WV by 2 list of background mesh vertices \n    //   WF  #WF by 2 list of background mesh triangle indices into WV\n    //   WE  #WE by 2 list of constraint edge indices into WV (might be smaller\n    //     than E because degenerate constraints have been removed)\n    //   J  #V list of indices into WF/WE for each vertex in V\n    //\n    template <\n      typename DerivedV, \n      typename DerivedE,\n      typename DerivedWV,\n      typename DerivedWF,\n      typename DerivedWE,\n      typename DerivedJ>\n    IGL_INLINE void cdt(\n      const Eigen::MatrixBase<DerivedV> & V,\n      const Eigen::MatrixBase<DerivedE> & E,\n      const std::string & flags,\n      Eigen::PlainObjectBase<DerivedWV> & WV,\n      Eigen::PlainObjectBase<DerivedWF> & WF,\n      Eigen::PlainObjectBase<DerivedWE> & WE,\n      Eigen::PlainObjectBase<DerivedJ> & J);\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#include \"cdt.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/triangle/triangulate.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"triangulate.h\"\n#ifdef ANSI_DECLARATORS\n#  define IGL_PREVIOUSLY_DEFINED_ANSI_DECLARATORS ANSI_DECLARATORS\n#  undef ANSI_DECLARATORS\n#endif\n#ifdef REAL\n#  define IGL_PREVIOUSLY_DEFINED_REAL REAL\n#  undef REAL\n#endif\n#ifdef VOID\n#  define IGL_PREVIOUSLY_DEFINED_VOID VOID\n#  undef VOID\n#endif\n#define ANSI_DECLARATORS\n#define REAL double\n#define VOID int\n\nextern \"C\"\n{\n#include <triangle.h>\n}\n\n#undef ANSI_DECLARATORS\n#ifdef IGL_PREVIOUSLY_DEFINED_ANSI_DECLARATORS\n#  define ANSI_DECLARATORS IGL_PREVIOUSLY_DEFINED_ANSI_DECLARATORS\n#endif\n\n#undef REAL\n#ifdef IGL_PREVIOUSLY_DEFINED_REAL\n#  define REAL IGL_PREVIOUSLY_DEFINED_REAL\n#endif\n\n#undef VOID\n#ifdef IGL_PREVIOUSLY_DEFINED_VOID\n#  define VOID IGL_PREVIOUSLY_DEFINED_VOID\n#endif\n\ntemplate <\n typename DerivedV,\n typename DerivedE,\n typename DerivedH,\n typename DerivedV2,\n typename DerivedF2>\nIGL_INLINE void igl::triangle::triangulate(\n  const Eigen::MatrixBase<DerivedV> & V,\n  const Eigen::MatrixBase<DerivedE> & E,\n  const Eigen::MatrixBase<DerivedH> & H,\n  const std::string flags,\n  Eigen::PlainObjectBase<DerivedV2> & V2,\n  Eigen::PlainObjectBase<DerivedF2> & F2)\n{\n  Eigen::VectorXi VM,EM,VM2,EM2;\n  return triangulate(V,E,H,VM,EM,flags,V2,F2,VM2,EM2);\n}\n\ntemplate <\n typename DerivedV,\n typename DerivedE,\n typename DerivedH,\n typename DerivedVM,\n typename DerivedEM,\n typename DerivedV2,\n typename DerivedF2,\n typename DerivedVM2,\n typename DerivedEM2>\nIGL_INLINE void igl::triangle::triangulate(\n  const Eigen::MatrixBase<DerivedV> & V,\n  const Eigen::MatrixBase<DerivedE> & E,\n  const Eigen::MatrixBase<DerivedH> & H,\n  const Eigen::MatrixBase<DerivedVM> & VM,\n  const Eigen::MatrixBase<DerivedEM> & EM,\n  const std::string flags,\n  Eigen::PlainObjectBase<DerivedV2> & V2,\n  Eigen::PlainObjectBase<DerivedF2> & F2,\n  Eigen::PlainObjectBase<DerivedVM2> & VM2,\n  Eigen::PlainObjectBase<DerivedEM2> & EM2)\n{\n  using namespace std;\n  using namespace Eigen;\n\n  assert( (VM.size() == 0 || V.rows() == VM.size()) && \n    \"Vertex markers must be empty or same size as V\");\n  assert( (EM.size() == 0 || E.rows() == EM.size()) && \n    \"Segment markers must be empty or same size as E\");\n  assert(V.cols() == 2);\n  assert(E.size() == 0 || E.cols() == 2);\n  assert(H.size() == 0 || H.cols() == 2);\n\n  // Prepare the flags\n  string full_flags = flags + \"pz\" + (EM.size() || VM.size() ? \"B\" : \"\");\n\n  typedef Map< Matrix<double,Dynamic,Dynamic,RowMajor> > MapXdr;\n  typedef Map< Matrix<int,Dynamic,Dynamic,RowMajor> > MapXir;\n\n  // Prepare the input struct\n  triangulateio in;\n  in.numberofpoints = V.rows();\n  in.pointlist = (double*)calloc(V.size(),sizeof(double));\n  {\n    MapXdr inpl(in.pointlist,V.rows(),V.cols());\n    inpl = V.template cast<double>();\n  }\n\n  in.numberofpointattributes = 0;\n  in.pointmarkerlist = (int*)calloc(VM.size(),sizeof(int));\n  for(unsigned i=0;i<VM.rows();++i) in.pointmarkerlist[i] = VM.size()?VM(i):1;\n\n  in.trianglelist = NULL;\n  in.numberoftriangles = 0;\n  in.numberofcorners = 0;\n  in.numberoftriangleattributes = 0;\n  in.triangleattributelist = NULL;\n\n  in.numberofsegments = E.size()?E.rows():0;\n  in.segmentlist = (int*)calloc(E.size(),sizeof(int));\n  {\n    MapXir insl(in.segmentlist,E.rows(),E.cols());\n    insl = E.template cast<int>();\n  }\n  in.segmentmarkerlist = (int*)calloc(E.rows(),sizeof(int));\n  for (unsigned i=0;i<E.rows();++i) in.segmentmarkerlist[i] = EM.size()?EM(i):1;\n\n  in.numberofholes = H.size()?H.rows():0;\n  in.holelist = (double*)calloc(H.size(),sizeof(double));\n  {\n    MapXdr inhl(in.holelist,H.rows(),H.cols());\n    inhl = H.template cast<double>();\n  }\n  in.numberofregions = 0;\n\n  // Prepare the output struct\n  triangulateio out;\n  out.pointlist = NULL;\n  out.trianglelist = NULL;\n  out.segmentlist = NULL;\n  out.segmentmarkerlist = NULL;\n  out.pointmarkerlist = NULL;\n\n  // Call triangle\n  ::triangulate(const_cast<char*>(full_flags.c_str()), &in, &out, 0);\n\n  // Return the mesh\n  V2 = MapXdr(out.pointlist,out.numberofpoints,2).cast<typename DerivedV2::Scalar>();\n  F2 = MapXir(out.trianglelist,out.numberoftriangles,3).cast<typename DerivedF2::Scalar>();\n  if(VM.size())\n  {\n    VM2 = MapXir(out.pointmarkerlist,out.numberofpoints,1).cast<typename DerivedVM2::Scalar>();\n  }\n  if(EM.size())\n  {\n    EM2 = MapXir(out.segmentmarkerlist,out.numberofsegments,1).cast<typename DerivedEM2::Scalar>();\n  }\n\n  // Cleanup in\n  free(in.pointlist);\n  free(in.pointmarkerlist);\n  free(in.segmentlist);\n  free(in.segmentmarkerlist);\n  free(in.holelist);\n  // Cleanup out\n  free(out.pointlist);\n  free(out.trianglelist);\n  free(out.segmentlist);\n  free(out.segmentmarkerlist);\n  free(out.pointmarkerlist);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::triangle::triangulate<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::triangle::triangulate<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/triangle/triangulate.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n// Copyright (C) 2017 Alec Jacobson\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_TRIANGLE_TRIANGULATE_H\n#define IGL_TRIANGLE_TRIANGULATE_H\n#include \"../igl_inline.h\"\n#include <string>\n#include <Eigen/Core>\n\nnamespace igl\n{\n  namespace triangle\n  {\n    // Triangulate the interior of a polygon using the triangle library.\n    //\n    // Inputs:\n    //   V #V by 2 list of 2D vertex positions\n    //   E #E by 2 list of vertex ids forming unoriented edges of the boundary of the polygon\n    //   H #H by 2 coordinates of points contained inside holes of the polygon\n    //   flags  string of options pass to triangle (see triangle documentation)\n    // Outputs:\n    //   V2  #V2 by 2  coordinates of the vertives of the generated triangulation\n    //   F2  #F2 by 3  list of indices forming the faces of the generated triangulation\n    //\n    template <\n      typename DerivedV,\n      typename DerivedE,\n      typename DerivedH,\n      typename DerivedV2,\n      typename DerivedF2>\n    IGL_INLINE void triangulate(\n      const Eigen::MatrixBase<DerivedV> & V,\n      const Eigen::MatrixBase<DerivedE> & E,\n      const Eigen::MatrixBase<DerivedH> & H,\n      const std::string flags,\n      Eigen::PlainObjectBase<DerivedV2> & V2,\n      Eigen::PlainObjectBase<DerivedF2> & F2);\n        \n\t\t// Triangulate the interior of a polygon using the triangle library.\n    //\n    // Inputs:\n    //   V #V by 2 list of 2D vertex positions\n    //   E #E by 2 list of vertex ids forming unoriented edges of the boundary of the polygon\n    //   H #H by 2 coordinates of points contained inside holes of the polygon\n\t\t//   M #V list of markers for input vertices\n    //   flags  string of options pass to triangle (see triangle documentation)\n    // Outputs:\n    //   V2  #V2 by 2  coordinates of the vertives of the generated triangulation\n    //   F2  #F2 by 3  list of indices forming the faces of the generated triangulation\n\t\t//   M2  #V2 list of markers for output vertices\n    //\n    // TODO: expose the option to prevent Steiner points on the boundary\n    //\n    template <\n      typename DerivedV,\n      typename DerivedE,\n      typename DerivedH,\n      typename DerivedVM,\n      typename DerivedEM,\n      typename DerivedV2,\n      typename DerivedF2,\n      typename DerivedVM2,\n      typename DerivedEM2>\n    IGL_INLINE void triangulate(\n      const Eigen::MatrixBase<DerivedV> & V,\n      const Eigen::MatrixBase<DerivedE> & E,\n      const Eigen::MatrixBase<DerivedH> & H,\n      const Eigen::MatrixBase<DerivedVM> & VM,\n      const Eigen::MatrixBase<DerivedEM> & EM,\n      const std::string flags,\n      Eigen::PlainObjectBase<DerivedV2> & V2,\n      Eigen::PlainObjectBase<DerivedF2> & F2,\n      Eigen::PlainObjectBase<DerivedVM2> & VM2,\n      Eigen::PlainObjectBase<DerivedEM2> & EM2);\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"triangulate.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/triangle_fan.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"triangle_fan.h\"\n#include \"exterior_edges.h\"\n#include \"list_to_matrix.h\"\n\nIGL_INLINE void igl::triangle_fan(\n  const Eigen::MatrixXi & E,\n  Eigen::MatrixXi & cap)\n{\n  using namespace std;\n  using namespace Eigen;\n\n  // Handle lame base case\n  if(E.size() == 0)\n  {\n    cap.resize(0,E.cols()+1);\n    return;\n  }\n  // \"Triangulate\" aka \"close\" the E trivially with facets\n  // Note: in 2D we need to know if E endpoints are incoming or\n  // outgoing (left or right). Thus this will not work.\n  assert(E.cols() == 2);\n  // Arbitrary starting vertex\n  //int s = E(int(((double)rand() / RAND_MAX)*E.rows()),0);\n  int s = E(rand()%E.rows(),0);\n  vector<vector<int> >  lcap;\n  for(int i = 0;i<E.rows();i++)\n  {\n    // Skip edges incident on s (they would be zero-area)\n    if(E(i,0) == s || E(i,1) == s)\n    {\n      continue;\n    }\n    vector<int> e(3);\n    e[0] = s;\n    e[1] = E(i,0);\n    e[2] = E(i,1);\n    lcap.push_back(e);\n  }\n  list_to_matrix(lcap,cap);\n}\n\nIGL_INLINE Eigen::MatrixXi igl::triangle_fan( const Eigen::MatrixXi & E)\n{\n  Eigen::MatrixXi cap;\n  triangle_fan(E,cap);\n  return cap;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/triangle_fan.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_TRIANGLE_FAN_H\n#define IGL_TRIANGLE_FAN_H\n#include \"igl_inline.h\"\n#include <Eigen/Dense>\nnamespace igl\n{\n  // Given a list of faces tesselate all of the \"exterior\" edges forming another\n  // list of \n  //\n  // Inputs:\n  //   E  #E by simplex_size-1  list of exterior edges (see exterior_edges.h)\n  // Outputs:\n  //   cap  #cap by simplex_size  list of \"faces\" tessleating the boundary edges\n  IGL_INLINE void triangle_fan(\n    const Eigen::MatrixXi & E,\n    Eigen::MatrixXi & cap);\n  // In-line version\n  IGL_INLINE Eigen::MatrixXi triangle_fan( const Eigen::MatrixXi & E);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"triangle_fan.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/triangle_triangle_adjacency.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"triangle_triangle_adjacency.h\"\n#include \"all_edges.h\"\n#include \"unique_simplices.h\"\n#include \"parallel_for.h\"\n#include \"unique_edge_map.h\"\n#include <algorithm>\n#include <iostream>\n\n// Extract the face adjacencies\ntemplate <typename DerivedF, typename TTT_type, typename DerivedTT>\nIGL_INLINE void igl::triangle_triangle_adjacency_extractTT(\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  std::vector<std::vector<TTT_type> >& TTT,\n  Eigen::PlainObjectBase<DerivedTT>& TT)\n{\n  TT.setConstant((int)(F.rows()),F.cols(),-1);\n\n  for(int i=1;i<(int)TTT.size();++i)\n  {\n    std::vector<int>& r1 = TTT[i-1];\n    std::vector<int>& r2 = TTT[i];\n    if ((r1[0] == r2[0]) && (r1[1] == r2[1]))\n    {\n      TT(r1[2],r1[3]) = r2[2];\n      TT(r2[2],r2[3]) = r1[2];\n    }\n  }\n}\n\ntemplate <typename DerivedF, typename DerivedTT>\nIGL_INLINE void igl::triangle_triangle_adjacency(\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  Eigen::PlainObjectBase<DerivedTT>& TT)\n{\n  DerivedTT TTi;\n  return triangle_triangle_adjacency(F,TT,TTi);\n}\n\ntemplate <typename DerivedF, typename TTT_type>\nIGL_INLINE void igl::triangle_triangle_adjacency_preprocess(\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  std::vector<std::vector<TTT_type> >& TTT)\n{\n  for(int f=0;f<F.rows();++f)\n    for (int i=0;i<F.cols();++i)\n    {\n      // v1 v2 f ei\n      int v1 = F(f,i);\n      int v2 = F(f,(i+1)%F.cols());\n      if (v1 > v2) std::swap(v1,v2);\n      std::vector<int> r(4);\n      r[0] = v1; r[1] = v2;\n      r[2] = f;  r[3] = i;\n      TTT.push_back(r);\n    }\n  std::sort(TTT.begin(),TTT.end());\n}\n\n// Extract the face adjacencies indices (needed for fast traversal)\ntemplate <typename DerivedF, typename TTT_type, typename DerivedTTi>\nIGL_INLINE void igl::triangle_triangle_adjacency_extractTTi(\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  std::vector<std::vector<TTT_type> >& TTT,\n  Eigen::PlainObjectBase<DerivedTTi>& TTi)\n{\n  TTi.setConstant((int)(F.rows()),F.cols(),-1);\n\n  for(int i=1;i<(int)TTT.size();++i)\n  {\n    std::vector<int>& r1 = TTT[i-1];\n    std::vector<int>& r2 = TTT[i];\n    if ((r1[0] == r2[0]) && (r1[1] == r2[1]))\n    {\n      TTi(r1[2],r1[3]) = r2[3];\n      TTi(r2[2],r2[3]) = r1[3];\n    }\n  }\n}\n\n// Compute triangle-triangle adjacency with indices\ntemplate <typename DerivedF, typename DerivedTT, typename DerivedTTi>\nIGL_INLINE void igl::triangle_triangle_adjacency(\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  Eigen::PlainObjectBase<DerivedTT>& TT,\n  Eigen::PlainObjectBase<DerivedTTi>& TTi)\n{\n  std::vector<std::vector<int> > TTT;\n  triangle_triangle_adjacency_preprocess(F,TTT);\n  triangle_triangle_adjacency_extractTT(F,TTT,TT);\n  triangle_triangle_adjacency_extractTTi(F,TTT,TTi);\n}\n\ntemplate <\n  typename DerivedF,\n  typename TTIndex,\n  typename TTiIndex>\n  IGL_INLINE void igl::triangle_triangle_adjacency(\n    const Eigen::PlainObjectBase<DerivedF> & F,\n    std::vector<std::vector<std::vector<TTIndex> > > & TT,\n    std::vector<std::vector<std::vector<TTiIndex> > > & TTi)\n{\n  return triangle_triangle_adjacency(F,true,TT,TTi);\n}\n\ntemplate <\n  typename DerivedF,\n  typename TTIndex>\n  IGL_INLINE void igl::triangle_triangle_adjacency(\n    const Eigen::PlainObjectBase<DerivedF> & F,\n    std::vector<std::vector<std::vector<TTIndex> > > & TT)\n{\n  std::vector<std::vector<std::vector<TTIndex> > > not_used;\n  return triangle_triangle_adjacency(F,false,TT,not_used);\n}\n\ntemplate <\n  typename DerivedF,\n  typename TTIndex,\n  typename TTiIndex>\n  IGL_INLINE void igl::triangle_triangle_adjacency(\n    const Eigen::PlainObjectBase<DerivedF> & F,\n    const bool construct_TTi,\n    std::vector<std::vector<std::vector<TTIndex> > > & TT,\n    std::vector<std::vector<std::vector<TTiIndex> > > & TTi)\n{\n  using namespace Eigen;\n  using namespace std;\n  assert(F.cols() == 3 && \"Faces must be triangles\");\n  // number of faces\n  typedef typename DerivedF::Index Index;\n  typedef Matrix<typename DerivedF::Scalar,Dynamic,2> MatrixX2I;\n  typedef Matrix<typename DerivedF::Index,Dynamic,1> VectorXI;\n  MatrixX2I E,uE;\n  VectorXI EMAP;\n  vector<vector<Index> > uE2E;\n  unique_edge_map(F,E,uE,EMAP,uE2E);\n  return triangle_triangle_adjacency(E,EMAP,uE2E,construct_TTi,TT,TTi);\n}\n\ntemplate <\n  typename DerivedE,\n  typename DerivedEMAP,\n  typename uE2EType,\n  typename TTIndex,\n  typename TTiIndex>\n  IGL_INLINE void igl::triangle_triangle_adjacency(\n    const Eigen::PlainObjectBase<DerivedE> & E,\n    const Eigen::PlainObjectBase<DerivedEMAP> & EMAP,\n    const std::vector<std::vector<uE2EType> > & uE2E,\n    const bool construct_TTi,\n    std::vector<std::vector<std::vector<TTIndex> > > & TT,\n    std::vector<std::vector<std::vector<TTiIndex> > > & TTi)\n{\n  using namespace std;\n  using namespace Eigen;\n  typedef typename DerivedE::Index Index;\n  const size_t m = E.rows()/3;\n  assert((size_t)E.rows() == m*3 && \"E should come from list of triangles.\");\n  // E2E[i] --> {j,k,...} means face edge i corresponds to other faces edges j\n  // and k\n  TT.resize (m,vector<vector<TTIndex> >(3));\n  if(construct_TTi)\n  {\n    TTi.resize(m,vector<vector<TTiIndex> >(3));\n  }\n\n  // No race conditions because TT*[f][c]'s are in bijection with e's\n  // Minimum number of items per thread\n  //const size_t num_e = E.rows();\n  // Slightly better memory access than loop over E\n  igl::parallel_for(\n    m,\n    [&](const Index & f)\n    {\n      for(Index c = 0;c<3;c++)\n      {\n        const Index e = f + m*c;\n        //const Index c = e/m;\n        const vector<uE2EType> & N = uE2E[EMAP(e)];\n        for(const auto & ne : N)\n        {\n          const Index nf = ne%m;\n          // don't add self\n          if(nf != f)\n          {\n            TT[f][c].push_back(nf);\n            if(construct_TTi)\n            {\n              const Index nc = ne/m;\n              TTi[f][c].push_back(nc);\n            }\n          }\n        }\n      }\n    },\n    1000ul);\n\n\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::triangle_triangle_adjacency<Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::triangle_triangle_adjacency<Eigen::Matrix<int, -1, 3, 0, -1, 3>, int>(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, std::vector<std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >, std::allocator<std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > > >&);\n// generated by autoexplicit.sh\ntemplate void igl::triangle_triangle_adjacency<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::triangle_triangle_adjacency<Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&);\ntemplate void igl::triangle_triangle_adjacency<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::triangle_triangle_adjacency<Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, long, long, long>(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> > const&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> > const&, std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > > const&, bool, std::vector<std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > >, std::allocator<std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > > > >&, std::vector<std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > >, std::allocator<std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > > > >&);\ntemplate void igl::triangle_triangle_adjacency<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, unsigned long, int, int>(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, std::vector<std::vector<unsigned long, std::allocator<unsigned long> >, std::allocator<std::vector<unsigned long, std::allocator<unsigned long> > > > const&, bool, std::vector<std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >, std::allocator<std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > > >&, std::vector<std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >, std::allocator<std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > > >&);\ntemplate void igl::triangle_triangle_adjacency<Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&);\ntemplate void igl::triangle_triangle_adjacency<Eigen::Matrix<int, -1, -1, 0, -1, -1>, long, long>(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > >, std::allocator<std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > > > >&, std::vector<std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > >, std::allocator<std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > > > >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/triangle_triangle_adjacency.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_TRIANGLE_TRIANGLE_ADJACENCY_H\n#define IGL_TRIANGLE_TRIANGLE_ADJACENCY_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <vector>\n\nnamespace igl\n{\n  // Constructs the triangle-triangle adjacency matrix for a given\n  // mesh (V,F).\n  //\n  // Templates:\n  //   Scalar derived type of eigen matrix for V (e.g. derived from\n  //     MatrixXd)\n  //   Index  derived type of eigen matrix for F (e.g. derived from\n  //     MatrixXi)\n  // Inputs:\n  //   F  #F by simplex_size list of mesh faces (must be triangles)\n  // Outputs:\n  //   TT   #F by #3 adjacent matrix, the element i,j is the id of the triangle adjacent to the j edge of triangle i\n  //   TTi  #F by #3 adjacent matrix, the element i,j is the id of edge of the triangle TT(i,j) that is adjacent with triangle i\n  // NOTE: the first edge of a triangle is [0,1] the second [1,2] and the third [2,3].\n  //       this convention is DIFFERENT from cotmatrix_entries.h\n  // Known bug: this should not need to take V as input.\n  template <typename DerivedF, typename DerivedTT, typename DerivedTTi>\n  IGL_INLINE void triangle_triangle_adjacency(\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    Eigen::PlainObjectBase<DerivedTT>& TT,\n    Eigen::PlainObjectBase<DerivedTTi>& TTi);\n  template <typename DerivedF, typename DerivedTT>\n  IGL_INLINE void triangle_triangle_adjacency(\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    Eigen::PlainObjectBase<DerivedTT>& TT);\n  // Preprocessing\n  template <typename DerivedF, typename TTT_type>\n  IGL_INLINE void triangle_triangle_adjacency_preprocess(\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    std::vector<std::vector<TTT_type> >& TTT);\n  // Extract the face adjacencies\n  template <typename DerivedF, typename TTT_type, typename DerivedTT>\n  IGL_INLINE void triangle_triangle_adjacency_extractTT(\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    std::vector<std::vector<TTT_type> >& TTT,\n    Eigen::PlainObjectBase<DerivedTT>& TT);\n  // Extract the face adjacencies indices (needed for fast traversal)\n  template <typename DerivedF, typename TTT_type, typename DerivedTTi>\n  IGL_INLINE void triangle_triangle_adjacency_extractTTi(\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    std::vector<std::vector<TTT_type> >& TTT,\n    Eigen::PlainObjectBase<DerivedTTi>& TTi);\n  // Adjacency list version, which works with non-manifold meshes\n  //\n  // Inputs:\n  //   F  #F by 3 list of triangle indices\n  // Outputs:\n  //   TT  #F by 3 list of lists so that TT[i][c] --> {j,k,...} means that\n  //     faces j and k etc. are edge-neighbors of face i on face i's edge\n  //     opposite corner c\n  //   TTj  #F list of lists so that TTj[i][c] --> {j,k,...} means that face\n  //     TT[i][c][0] is an edge-neighbor of face i incident on the edge of face\n  //     TT[i][c][0] opposite corner j, and TT[i][c][1] \" corner k, etc.\n  template <\n    typename DerivedF, \n    typename TTIndex, \n    typename TTiIndex>\n    IGL_INLINE void triangle_triangle_adjacency(\n      const Eigen::PlainObjectBase<DerivedF> & F,\n      std::vector<std::vector<std::vector<TTIndex> > > & TT,\n      std::vector<std::vector<std::vector<TTiIndex> > > & TTi);\n  template < typename DerivedF, typename TTIndex>\n    IGL_INLINE void triangle_triangle_adjacency(\n      const Eigen::PlainObjectBase<DerivedF> & F,\n      std::vector<std::vector<std::vector<TTIndex> > > & TT);\n  // Wrapper with bool to choose whether to compute TTi (this prototype should\n  // be \"hidden\").\n  template <\n    typename DerivedF, \n    typename TTIndex, \n    typename TTiIndex>\n    IGL_INLINE void triangle_triangle_adjacency(\n      const Eigen::PlainObjectBase<DerivedF> & F,\n      const bool construct_TTi,\n      std::vector<std::vector<std::vector<TTIndex> > > & TT,\n      std::vector<std::vector<std::vector<TTiIndex> > > & TTi);\n  // Inputs:\n  //   E  #F*3 by 2 list of all of directed edges in order (see `all_edges`)\n  //   EMAP #F*3 list of indices into uE, mapping each directed edge to unique\n  //     undirected edge\n  //   uE2E  #uE list of lists of indices into E of coexisting edges\n  // See also: unique_edge_map, all_edges\n  template <\n    typename DerivedE, \n    typename DerivedEMAP,\n    typename uE2EType,\n    typename TTIndex, \n    typename TTiIndex>\n    IGL_INLINE void triangle_triangle_adjacency(\n      const Eigen::PlainObjectBase<DerivedE> & E,\n      const Eigen::PlainObjectBase<DerivedEMAP> & EMAP,\n      const std::vector<std::vector<uE2EType > > & uE2E,\n      const bool construct_TTi,\n      std::vector<std::vector<std::vector<TTIndex> > > & TT,\n      std::vector<std::vector<std::vector<TTiIndex> > > & TTi);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"triangle_triangle_adjacency.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/triangles_from_strip.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"triangles_from_strip.h\"\n#include <iostream>\n\ntemplate <typename DerivedS, typename DerivedF>\nIGL_INLINE void igl::triangles_from_strip(\n  const Eigen::MatrixBase<DerivedS>& S,\n  Eigen::PlainObjectBase<DerivedF>& F)\n{\n  using namespace std;\n  F.resize(S.size()-2,3);\n  for(int s = 0;s < S.size()-2;s++)\n  {\n    if(s%2 == 0)\n    {\n      F(s,0) = S(s+2);\n      F(s,1) = S(s+1);\n      F(s,2) = S(s+0);\n    }else\n    {\n      F(s,0) = S(s+0);\n      F(s,1) = S(s+1);\n      F(s,2) = S(s+2);\n    }\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/triangles_from_strip.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_TRIANGLES_FROM_STRIP_H\n#define IGL_TRIANGLES_FROM_STRIP_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // TRIANGLES_FROM_STRIP Create a list of triangles from a stream of indices\n  // along a strip.\n  //\n  // Inputs:\n  //   S  #S list of indices\n  // Outputs:\n  //   F  #S-2 by 3 list of triangle indices\n  //\n  template <typename DerivedS, typename DerivedF>\n  IGL_INLINE void triangles_from_strip(\n    const Eigen::MatrixBase<DerivedS>& S,\n    Eigen::PlainObjectBase<DerivedF>& F);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"triangles_from_strip.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/two_axis_valuator_fixed_up.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"two_axis_valuator_fixed_up.h\"\n#include \"PI.h\"\n\ntemplate <typename Scalardown_quat, typename Scalarquat>\nIGL_INLINE void igl::two_axis_valuator_fixed_up(\n  const int w,\n  const int h,\n  const double speed,\n  const Eigen::Quaternion<Scalardown_quat> & down_quat,\n  const int down_x,\n  const int down_y,\n  const int mouse_x,\n  const int mouse_y,\n  Eigen::Quaternion<Scalarquat> & quat)\n{\n  using namespace Eigen;\n  Matrix<Scalarquat,3,1> axis(0,1,0);\n  quat = down_quat *\n    Quaternion<Scalarquat>(\n      AngleAxis<Scalarquat>(\n        PI*((Scalarquat)(mouse_x-down_x))/(Scalarquat)w*speed/2.0,\n        axis.normalized()));\n  quat.normalize();\n  {\n    Matrix<Scalarquat,3,1> axis(1,0,0);\n    if(axis.norm() != 0)\n    {\n      quat =\n        Quaternion<Scalarquat>(\n          AngleAxis<Scalarquat>(\n            PI*(mouse_y-down_y)/(Scalarquat)h*speed/2.0,\n            axis.normalized())) * quat;\n      quat.normalize();\n    }\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::two_axis_valuator_fixed_up<float, float>(int, int, double, Eigen::Quaternion<float, 0> const&, int, int, int, int, Eigen::Quaternion<float, 0>&);\ntemplate void igl::two_axis_valuator_fixed_up<double, double>(int, int, double, Eigen::Quaternion<double, 0> const&, int, int, int, int, Eigen::Quaternion<double, 0>&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/two_axis_valuator_fixed_up.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_TWO_AXIS_VALUATOR_FIXED_AXIS_UP_H\n#define IGL_TWO_AXIS_VALUATOR_FIXED_AXIS_UP_H\n\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <Eigen/Geometry>\n\nnamespace igl\n{\n  // Applies a two-axis valuator drag rotation (as seen in Maya/Studio max) to a given rotation.\n  // Inputs:\n  //   w  width of the trackball context\n  //   h  height of the trackball context\n  //   speed  controls how fast the trackball feels, 1 is normal\n  //   down_quat  rotation at mouse down, i.e. the rotation we're applying the\n  //     trackball motion to (as quaternion). **Note:** Up-vector that is fixed\n  //     is with respect to this rotation.\n  //   down_x position of mouse down\n  //   down_y position of mouse down\n  //   mouse_x  current x position of mouse\n  //   mouse_y  current y position of mouse\n  // Outputs:\n  //   quat  the resulting rotation (as quaternion)\n  //\n  // See also: snap_to_fixed_up\n  template <typename Scalardown_quat, typename Scalarquat>\n  IGL_INLINE void two_axis_valuator_fixed_up(\n    const int w,\n    const int h,\n    const double speed,\n    const Eigen::Quaternion<Scalardown_quat> & down_quat,\n    const int down_x,\n    const int down_y,\n    const int mouse_x,\n    const int mouse_y,\n    Eigen::Quaternion<Scalarquat> & quat);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"two_axis_valuator_fixed_up.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/uniform_type_to_string.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"uniform_type_to_string.h\"\n#ifndef IGL_NO_OPENGL\n\nIGL_INLINE std::string igl::uniform_type_to_string(const GLenum type)\n{\n  switch(type)\n  {\n    case GL_FLOAT:\n      return \"GL_FLOAT\";\n    case GL_FLOAT_VEC2:\n      return \"GL_FLOAT_VEC2\";\n    case GL_FLOAT_VEC3:\n      return \"GL_FLOAT_VEC3\";\n    case GL_FLOAT_VEC4:\n      return \"GL_FLOAT_VEC4\";\n    case GL_INT:\n      return \"GL_INT\";\n    case GL_INT_VEC2:\n      return \"GL_INT_VEC2\";\n    case GL_INT_VEC3:\n      return \"GL_INT_VEC3\";\n    case GL_INT_VEC4:\n      return \"GL_INT_VEC4\";\n    case GL_BOOL:\n      return \"GL_BOOL\";\n    case GL_BOOL_VEC2:\n      return \"GL_BOOL_VEC2\";\n    case GL_BOOL_VEC3:\n      return \"GL_BOOL_VEC3\";\n    case GL_BOOL_VEC4:\n      return \"GL_BOOL_VEC4\";\n    case GL_FLOAT_MAT2:\n      return \"GL_FLOAT_MAT2\";\n    case GL_FLOAT_MAT3:\n      return \"GL_FLOAT_MAT3\";\n    case GL_FLOAT_MAT4:\n      return \"GL_FLOAT_MAT4\";\n    case GL_FLOAT_MAT2x3:\n      return \"GL_FLOAT_MAT2x3\";\n    case GL_FLOAT_MAT2x4:\n      return \"GL_FLOAT_MAT2x4\";\n    case GL_FLOAT_MAT3x2:\n      return \"GL_FLOAT_MAT3x2\";\n    case GL_FLOAT_MAT3x4:\n      return \"GL_FLOAT_MAT3x4\";\n    case GL_FLOAT_MAT4x2:\n      return \"GL_FLOAT_MAT4x2\";\n    case GL_FLOAT_MAT4x3:\n      return \"GL_FLOAT_MAT4x3\";\n    case GL_SAMPLER_1D:\n      return \"GL_SAMPLER_1D\";\n    case GL_SAMPLER_2D:\n      return \"GL_SAMPLER_2D\";\n    case GL_SAMPLER_3D:\n      return \"GL_SAMPLER_3D\";\n    case GL_SAMPLER_CUBE:\n      return \"GL_SAMPLER_CUBE\";\n    case GL_SAMPLER_1D_SHADOW:\n      return \"GL_SAMPLER_1D_SHADOW\";\n    case GL_SAMPLER_2D_SHADOW:\n      return \"GL_SAMPLER_2D_SHADOW\";\n    default:\n      return \"UNKNOWN_TYPE\";\n  }\n}\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/uniform_type_to_string.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_UNIFORM_TYPE_TO_STRING_H\n#define IGL_UNIFORM_TYPE_TO_STRING_H\n#ifndef IGL_NO_OPENGL\n#include \"igl_inline.h\"\n\n#include <string>\n\n#include \"OpenGL_convenience.h\"\n\nnamespace igl\n{\n  // Convert a GL uniform variable type (say, returned from\n  // glGetActiveUniform) and output a string naming that type\n  // Inputs:\n  //   type  enum for given type\n  // Returns string name of that type\n  IGL_INLINE std::string uniform_type_to_string(const GLenum type);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"uniform_type_to_string.cpp\"\n#endif\n\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/uniformly_sample_two_manifold.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"uniformly_sample_two_manifold.h\"\n#include \"verbose.h\"\n#include \"slice.h\"\n#include \"colon.h\"\n#include \"all_pairs_distances.h\"\n#include \"mat_max.h\"\n#include \"vertex_triangle_adjacency.h\"\n#include \"get_seconds.h\"\n#include \"cat.h\"\n//#include \"MT19937.h\"\n#include \"partition.h\"\n\n//////////////////////////////////////////////////////////////////////////////\n// Helper functions\n//////////////////////////////////////////////////////////////////////////////\n\nIGL_INLINE void igl::uniformly_sample_two_manifold(\n  const Eigen::MatrixXd & W,\n  const Eigen::MatrixXi & F,\n  const int k,\n  const double push,\n  Eigen::MatrixXd & WS)\n{\n  using namespace Eigen;\n  using namespace std;\n\n  // Euclidean distance between two points on a mesh given as barycentric\n  // coordinates\n  // Inputs:\n  //   W  #W by dim positions of mesh in weight space\n  //   F  #F by 3 indices of triangles\n  //   face_A  face index where 1st point lives\n  //   bary_A  barycentric coordinates of 1st point on face_A\n  //   face_B  face index where 2nd point lives\n  //   bary_B  barycentric coordinates of 2nd point on face_B\n  // Returns distance in euclidean space\n  const auto & bary_dist = [] (\n    const Eigen::MatrixXd & W,\n    const Eigen::MatrixXi & F,\n    const int face_A,\n    const Eigen::Vector3d & bary_A,\n    const int face_B,\n    const Eigen::Vector3d & bary_B) -> double\n  {\n    return\n      ((bary_A(0)*W.row(F(face_A,0)) +\n        bary_A(1)*W.row(F(face_A,1)) +\n        bary_A(2)*W.row(F(face_A,2)))\n        -\n        (bary_B(0)*W.row(F(face_B,0)) +\n        bary_B(1)*W.row(F(face_B,1)) +\n        bary_B(2)*W.row(F(face_B,2)))).norm();\n  };\n\n  // Base case if F is a tet list, find all faces and pass as non-manifold\n  // triangle mesh\n  if(F.cols() == 4)\n  {\n    verbose(\"uniform_sample.h: sampling tet mesh\\n\");\n    MatrixXi T0 = F.col(0);\n    MatrixXi T1 = F.col(1);\n    MatrixXi T2 = F.col(2);\n    MatrixXi T3 = F.col(3);\n    // Faces from tets\n    MatrixXi TF =\n      cat(1,\n        cat(1,\n          cat(2,T0, cat(2,T1,T2)),\n          cat(2,T0, cat(2,T2,T3))),\n        cat(1,\n          cat(2,T0, cat(2,T3,T1)),\n          cat(2,T1, cat(2,T3,T2)))\n      );\n    assert(TF.rows() == 4*F.rows());\n    assert(TF.cols() == 3);\n    uniformly_sample_two_manifold(W,TF,k,push,WS);\n    return;\n  }\n\n  double start = get_seconds();\n\n  VectorXi S;\n  // First get sampling as best as possible on mesh\n  uniformly_sample_two_manifold_at_vertices(W,k,push,S);\n  verbose(\"Lap: %g\\n\",get_seconds()-start);\n  slice(W,S,colon<int>(0,W.cols()-1),WS);\n  //cout<<\"WSmesh=[\"<<endl<<WS<<endl<<\"];\"<<endl;\n\n//#ifdef EXTREME_VERBOSE\n  //cout<<\"S=[\"<<endl<<S<<endl<<\"];\"<<endl;\n//#endif\n\n  // Build map from vertices to list of incident faces\n  vector<vector<int> > VF,VFi;\n  vertex_triangle_adjacency(W,F,VF,VFi);\n\n  // List of list of face indices, for each sample gives index to face it is on\n  vector<vector<int> > sample_faces; sample_faces.resize(k);\n  // List of list of barycentric coordinates, for each sample gives b-coords in\n  // face its on\n  vector<vector<Eigen::Vector3d> > sample_barys; sample_barys.resize(k);\n  // List of current maxmins amongst samples\n  vector<int> cur_maxmin; cur_maxmin.resize(k);\n  // List of distance matrices, D(i)(s,j) reveals distance from i's sth sample\n  // to jth seed if j<k or (j-k)th \"pushed\" corner\n  vector<MatrixXd> D; D.resize(k);\n\n  // Precompute an W.cols() by W.cols() identity matrix\n  MatrixXd I(MatrixXd::Identity(W.cols(),W.cols()));\n\n  // Describe each seed as a face index and barycentric coordinates\n  for(int i = 0;i < k;i++)\n  {\n    // Unreferenced vertex?\n    assert(VF[S(i)].size() > 0);\n    sample_faces[i].push_back(VF[S(i)][0]);\n    // We're right on a face vertex so barycentric coordinates are 0, but 1 at\n    // that vertex\n    Eigen::Vector3d bary(0,0,0);\n    bary( VFi[S(i)][0] ) = 1;\n    sample_barys[i].push_back(bary);\n    // initialize this to current maxmin\n    cur_maxmin[i] = 0;\n  }\n\n  // initialize radius\n  double radius = 1.0;\n  // minimum radius (bound on precision)\n  //double min_radius = 1e-5;\n  double min_radius = 1e-5;\n  int max_num_rand_samples_per_triangle = 100;\n  int max_sample_attempts_per_triangle = 1000;\n  // Max number of outer iterations for a given radius\n  int max_iters = 1000;\n\n  // continue iterating until radius is smaller than some threshold\n  while(radius > min_radius)\n  {\n    // initialize each seed\n    for(int i = 0;i < k;i++)\n    {\n      // Keep track of cur_maxmin data\n      int face_i = sample_faces[i][cur_maxmin[i]];\n      Eigen::Vector3d bary(sample_barys[i][cur_maxmin[i]]);\n      // Find index in face of closest mesh vertex (on this face)\n      int index_in_face =\n        (bary(0) > bary(1) ? (bary(0) > bary(2) ? 0 : 2)\n                           : (bary(1) > bary(2) ? 1 : 2));\n      // find closest mesh vertex\n      int vertex_i = F(face_i,index_in_face);\n      // incident triangles\n      vector<int> incident_F = VF[vertex_i];\n      // We're going to try to place num_rand_samples_per_triangle samples on\n      // each sample *after* this location\n      sample_barys[i].clear();\n      sample_faces[i].clear();\n      cur_maxmin[i] = 0;\n      sample_barys[i].push_back(bary);\n      sample_faces[i].push_back(face_i);\n      // Current seed location in weight space\n      VectorXd seed =\n        bary(0)*W.row(F(face_i,0)) +\n        bary(1)*W.row(F(face_i,1)) +\n        bary(2)*W.row(F(face_i,2));\n#ifdef EXTREME_VERBOSE\n      verbose(\"i: %d\\n\",i);\n      verbose(\"face_i: %d\\n\",face_i);\n      //cout<<\"bary: \"<<bary<<endl;\n      verbose(\"index_in_face: %d\\n\",index_in_face);\n      verbose(\"vertex_i: %d\\n\",vertex_i);\n      verbose(\"incident_F.size(): %d\\n\",incident_F.size());\n      //cout<<\"seed: \"<<seed<<endl;\n#endif\n      // loop over indcident triangles\n      for(int f=0;f<(int)incident_F.size();f++)\n      {\n#ifdef EXTREME_VERBOSE\n        verbose(\"incident_F[%d]: %d\\n\",f,incident_F[f]);\n#endif\n        int face_f = incident_F[f];\n        int num_samples_f = 0;\n        for(int s=0;s<max_sample_attempts_per_triangle;s++)\n        {\n          // Randomly sample unit square\n          double u,v;\n//      double ru = fgenrand();\n//      double rv = fgenrand();\n          double ru = (double)rand() / RAND_MAX;\n          double rv = (double)rand() / RAND_MAX;\n          // Reflect to lower triangle if above\n          if((ru+rv)>1)\n          {\n            u = 1-rv;\n            v = 1-ru;\n          }else\n          {\n            u = ru;\n            v = rv;\n          }\n          Eigen::Vector3d sample_bary(u,v,1-u-v);\n          double d = bary_dist(W,F,face_i,bary,face_f,sample_bary);\n          // check that sample is close enough\n          if(d<radius)\n          {\n            // add sample to list\n            sample_faces[i].push_back(face_f);\n            sample_barys[i].push_back(sample_bary);\n            num_samples_f++;\n          }\n          // Keep track of which random samples came from which face\n          if(num_samples_f >= max_num_rand_samples_per_triangle)\n          {\n#ifdef EXTREME_VERBOSE\n            verbose(\"Reached maximum number of samples per face\\n\");\n#endif\n            break;\n          }\n          if(s==(max_sample_attempts_per_triangle-1))\n          {\n#ifdef EXTREME_VERBOSE\n            verbose(\"Reached maximum sample attempts per triangle\\n\");\n#endif\n          }\n        }\n#ifdef EXTREME_VERBOSE\n        verbose(\"sample_faces[%d].size(): %d\\n\",i,sample_faces[i].size());\n        verbose(\"sample_barys[%d].size(): %d\\n\",i,sample_barys[i].size());\n#endif\n      }\n    }\n\n    // Precompute distances from each seed's random samples to each \"pushed\"\n    // corner\n    // Put -1 in entries corresponding distance of a seed's random samples to\n    // self\n    // Loop over seeds\n    for(int i = 0;i < k;i++)\n    {\n      // resize distance matrix for new samples\n      D[i].resize(sample_faces[i].size(),k+W.cols());\n      // Loop over i's samples\n      for(int s = 0;s<(int)sample_faces[i].size();s++)\n      {\n        int sample_face = sample_faces[i][s];\n        Eigen::Vector3d sample_bary = sample_barys[i][s];\n        // Loop over other seeds\n        for(int j = 0;j < k;j++)\n        {\n          // distance from sample(i,s) to seed j\n          double d;\n          if(i==j)\n          {\n            // phony self distance: Ilya's idea of infinite\n            d = 10;\n          }else\n          {\n            int seed_j_face = sample_faces[j][cur_maxmin[j]];\n            Eigen::Vector3d seed_j_bary(sample_barys[j][cur_maxmin[j]]);\n            d = bary_dist(W,F,sample_face,sample_bary,seed_j_face,seed_j_bary);\n          }\n          D[i](s,j) = d;\n        }\n        // Loop over corners\n        for(int j = 0;j < W.cols();j++)\n        {\n          // distance from sample(i,s) to corner j\n          double d =\n            ((sample_bary(0)*W.row(F(sample_face,0)) +\n              sample_bary(1)*W.row(F(sample_face,1)) +\n              sample_bary(2)*W.row(F(sample_face,2)))\n              - I.row(j)).norm()/push;\n          // append after distances to seeds\n          D[i](s,k+j) = d;\n        }\n      }\n    }\n\n    int iters = 0;\n    while(true)\n    {\n      bool has_changed = false;\n      // try to move each seed\n      for(int i = 0;i < k;i++)\n      {\n        // for each sample look at distance to closest seed/corner\n        VectorXd minD = D[i].rowwise().minCoeff();\n        assert(minD.size() == (int)sample_faces[i].size());\n        // find random sample with maximum minimum distance to other seeds\n        int old_cur_maxmin = cur_maxmin[i];\n        double max_min = -2;\n        for(int s = 0;s<(int)sample_faces[i].size();s++)\n        {\n          if(max_min < minD(s))\n          {\n            max_min = minD(s);\n            // Set this as the new seed location\n            cur_maxmin[i] = s;\n          }\n        }\n#ifdef EXTREME_VERBOSE\n        verbose(\"max_min: %g\\n\",max_min);\n        verbose(\"cur_maxmin[%d]: %d->%d\\n\",i,old_cur_maxmin,cur_maxmin[i]);\n#endif\n        // did location change?\n        has_changed |= (old_cur_maxmin!=cur_maxmin[i]);\n        // update distances of random samples of other seeds\n      }\n      // if no seed moved, exit\n      if(!has_changed)\n      {\n        break;\n      }\n      iters++;\n      if(iters>=max_iters)\n      {\n        verbose(\"Hit max iters (%d) before converging\\n\",iters);\n      }\n    }\n    // shrink radius\n    //radius *= 0.9;\n    //radius *= 0.99;\n    radius *= 0.9;\n  }\n  // Collect weight space locations\n  WS.resize(k,W.cols());\n  for(int i = 0;i<k;i++)\n  {\n    int face_i = sample_faces[i][cur_maxmin[i]];\n    Eigen::Vector3d bary(sample_barys[i][cur_maxmin[i]]);\n    WS.row(i) =\n        bary(0)*W.row(F(face_i,0)) +\n        bary(1)*W.row(F(face_i,1)) +\n        bary(2)*W.row(F(face_i,2));\n  }\n  verbose(\"Lap: %g\\n\",get_seconds()-start);\n  //cout<<\"WSafter=[\"<<endl<<WS<<endl<<\"];\"<<endl;\n}\n\nIGL_INLINE void igl::uniformly_sample_two_manifold_at_vertices(\n  const Eigen::MatrixXd & OW,\n  const int k,\n  const double push,\n  Eigen::VectorXi & S)\n{\n  using namespace Eigen;\n  using namespace std;\n\n  // Copy weights and faces\n  const MatrixXd & W = OW;\n  /*const MatrixXi & F = OF;*/\n\n  // Initialize seeds\n  VectorXi G;\n  Matrix<double,Dynamic,1>  ignore;\n  partition(W,k+W.cols(),G,S,ignore);\n  // Remove corners, which better be at top\n  S = S.segment(W.cols(),k).eval();\n\n  MatrixXd WS;\n  slice(W,S,colon<int>(0,W.cols()-1),WS);\n  //cout<<\"WSpartition=[\"<<endl<<WS<<endl<<\"];\"<<endl;\n\n  // number of vertices\n  int n = W.rows();\n  // number of dimensions in weight space\n  int m = W.cols();\n  // Corners of weight space\n  MatrixXd I = MatrixXd::Identity(m,m);\n  // append corners to bottom of weights\n  MatrixXd WI(n+m,m);\n  WI << W,I;\n  // Weights at seeds and corners\n  MatrixXd WSC(k+m,m);\n  for(int i = 0;i<k;i++)\n  {\n    WSC.row(i) = W.row(S(i));\n  }\n  for(int i = 0;i<m;i++)\n  {\n    WSC.row(i+k) = WI.row(n+i);\n  }\n  // initialize all pairs sqaured distances\n  MatrixXd sqrD;\n  all_pairs_distances(WI,WSC,true,sqrD);\n  // bring in corners by push factor (squared because distances are squared)\n  sqrD.block(0,k,sqrD.rows(),m) /= push*push;\n\n  int max_iters = 30;\n  int j = 0;\n  for(;j<max_iters;j++)\n  {\n    bool has_changed = false;\n    // loop over seeds\n    for(int i =0;i<k;i++)\n    {\n      int old_si = S(i);\n      // set distance to ilya's idea of infinity\n      sqrD.col(i).setZero();\n      sqrD.col(i).array() += 10;\n      // find vertex farthers from all other seeds\n      MatrixXd minsqrD = sqrD.rowwise().minCoeff();\n      MatrixXd::Index si,PHONY;\n      minsqrD.maxCoeff(&si,&PHONY);\n      MatrixXd Wsi = W.row(si);\n      MatrixXd sqrDi;\n      all_pairs_distances(WI,Wsi,true,sqrDi);\n      sqrD.col(i) = sqrDi;\n      S(i) = si;\n      has_changed |= si!=old_si;\n    }\n    if(j == max_iters)\n    {\n      verbose(\"uniform_sample.h: Warning: hit max iters\\n\");\n    }\n    if(!has_changed)\n    {\n      break;\n    }\n  }\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/uniformly_sample_two_manifold.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_UNIFORMLY_SAMPLE_TWO_MANIFOLD_H\n#define IGL_UNIFORMLY_SAMPLE_TWO_MANIFOLD_H\n#include \"igl_inline.h\"\n#include <Eigen/Dense>\nnamespace igl\n{\n  // UNIFORMLY_SAMPLE_TWO_MANIFOLD Attempt to sample a mesh uniformly by\n  // furthest point relaxation as described in \"Fast Automatic Skinning\n  // Transformations\"\n  //\n  // [Jacobson et al. 12] Section 3.3.\n  //\n  // Inputs:\n  //   W  #W by dim positions of mesh in weight space\n  //   F  #F by 3 indices of triangles\n  //   k  number of samplse\n  //   push  factor by which corners should be pushed away\n  // Outputs\n  //   WS  k by dim locations in weights space\n  //\n  IGL_INLINE void uniformly_sample_two_manifold(\n    const Eigen::MatrixXd & W,\n    const Eigen::MatrixXi & F, \n    const int k, \n    const double push,\n    Eigen::MatrixXd & WS);\n  // Find uniform sampling up to placing samples on mesh vertices\n  IGL_INLINE void uniformly_sample_two_manifold_at_vertices(\n    const Eigen::MatrixXd & OW,\n    const int k, \n    const double push,\n    Eigen::VectorXi & S);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"uniformly_sample_two_manifold.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/unique.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"unique.h\"\n#include \"sort.h\"\n#include \"IndexComparison.h\"\n#include \"SortableRow.h\"\n#include \"sortrows.h\"\n#include \"list_to_matrix.h\"\n#include \"matrix_to_list.h\"\n\n#include <algorithm>\n#include <iostream>\n#include <map>\n\ntemplate <typename T>\nIGL_INLINE void igl::unique(\n  const std::vector<T> & A,\n  std::vector<T> & C,\n  std::vector<size_t> & IA,\n  std::vector<size_t> & IC)\n{\n  using namespace std;\n  std::vector<size_t> IM;\n  std::vector<T> sortA;\n  igl::sort(A,true,sortA,IM);\n  // Original unsorted index map\n  IA.resize(sortA.size());\n  for(int i=0;i<(int)sortA.size();i++)\n  {\n    IA[i] = i;\n  }\n  IA.erase(\n    std::unique(\n    IA.begin(),\n    IA.end(),\n    igl::IndexEquals<const std::vector<T>& >(sortA)),IA.end());\n\n  IC.resize(A.size());\n  {\n    int j = 0;\n    for(int i = 0;i<(int)sortA.size();i++)\n    {\n      if(sortA[IA[j]] != sortA[i])\n      {\n        j++;\n      }\n      IC[IM[i]] = j;\n    }\n  }\n  C.resize(IA.size());\n  // Reindex IA according to IM\n  for(int i = 0;i<(int)IA.size();i++)\n  {\n    IA[i] = IM[IA[i]];\n    C[i] = A[IA[i]];\n  }\n\n}\n\ntemplate <typename T>\nIGL_INLINE void igl::unique(\n  const std::vector<T> & A,\n  std::vector<T> & C)\n{\n  std::vector<size_t> IA,IC;\n  return igl::unique(A,C,IA,IC);\n}\n\ntemplate <\n  typename DerivedA,\n  typename DerivedC,\n  typename DerivedIA,\n  typename DerivedIC>\nIGL_INLINE void igl::unique(\n    const Eigen::DenseBase<DerivedA> & A,\n    Eigen::PlainObjectBase<DerivedC> & C,\n    Eigen::PlainObjectBase<DerivedIA> & IA,\n    Eigen::PlainObjectBase<DerivedIC> & IC)\n{\n  using namespace std;\n  using namespace Eigen;\n  vector<typename DerivedA::Scalar > vA;\n  vector<typename DerivedC::Scalar > vC;\n  vector<size_t> vIA,vIC;\n  matrix_to_list(A,vA);\n  unique(vA,vC,vIA,vIC);\n  list_to_matrix(vC,C);\n  list_to_matrix(vIA,IA);\n  list_to_matrix(vIC,IC);\n}\n\ntemplate <\n  typename DerivedA,\n  typename DerivedC\n  >\nIGL_INLINE void igl::unique(\n    const Eigen::DenseBase<DerivedA> & A,\n    Eigen::PlainObjectBase<DerivedC> & C)\n{\n  using namespace std;\n  using namespace Eigen;\n  vector<typename DerivedA::Scalar > vA;\n  vector<typename DerivedC::Scalar > vC;\n  vector<size_t> vIA,vIC;\n  matrix_to_list(A,vA);\n  unique(vA,vC,vIA,vIC);\n  list_to_matrix(vC,C);\n}\n\n// Obsolete slow version converting to vectors\n// template <typename DerivedA, typename DerivedIA, typename DerivedIC>\n// IGL_INLINE void igl::unique_rows(\n//   const Eigen::PlainObjectBase<DerivedA>& A,\n//   Eigen::PlainObjectBase<DerivedA>& C,\n//   Eigen::PlainObjectBase<DerivedIA>& IA,\n//   Eigen::PlainObjectBase<DerivedIC>& IC)\n// {\n//   using namespace std;\n//\n//   typedef Eigen::Matrix<typename DerivedA::Scalar, Eigen::Dynamic, 1> RowVector;\n//   vector<SortableRow<RowVector> > rows;\n//   rows.resize(A.rows());\n//   // Loop over rows\n//   for(int i = 0;i<A.rows();i++)\n//   {\n//     RowVector ri = A.row(i);\n//     rows[i] = SortableRow<RowVector>(ri);\n//   }\n//   vector<SortableRow<RowVector> > vC;\n//\n//   // unique on rows\n//   vector<size_t> vIA;\n//   vector<size_t> vIC;\n//   unique(rows,vC,vIA,vIC);\n//\n//   // Convert to eigen\n//   C.resize(vC.size(),A.cols());\n//   IA.resize(vIA.size(),1);\n//   IC.resize(vIC.size(),1);\n//   for(int i = 0;i<C.rows();i++)\n//   {\n//     C.row(i) = vC[i].data;\n//     IA(i) = vIA[i];\n//   }\n//   for(int i = 0;i<A.rows();i++)\n//   {\n//     IC(i) = vIC[i];\n//   }\n// }\n\n// Obsolete\n// template <typename DerivedA, typename DerivedIA, typename DerivedIC>\n// IGL_INLINE void igl::unique_rows_many(\n//   const Eigen::PlainObjectBase<DerivedA>& A,\n//   Eigen::PlainObjectBase<DerivedA>& C,\n//   Eigen::PlainObjectBase<DerivedIA>& IA,\n//   Eigen::PlainObjectBase<DerivedIC>& IC)\n// {\n//   using namespace std;\n//   // frequency map\n//   typedef Eigen::Matrix<typename DerivedA::Scalar, Eigen::Dynamic, 1> RowVector;\n//   IC.resize(A.rows(),1);\n//   map<SortableRow<RowVector>, int> fm;\n//   const int m = A.rows();\n//   for(int i = 0;i<m;i++)\n//   {\n//     RowVector ri = A.row(i);\n//     if(fm.count(SortableRow<RowVector>(ri)) == 0)\n//     {\n//       fm[SortableRow<RowVector>(ri)] = i;\n//     }\n//     IC(i) = fm[SortableRow<RowVector>(ri)];\n//   }\n//   IA.resize(fm.size(),1);\n//   Eigen::VectorXi RIA(m);\n//   C.resize(fm.size(),A.cols());\n//   {\n//     int i = 0;\n//     for(typename map<SortableRow<RowVector > , int >::const_iterator fit = fm.begin();\n//         fit != fm.end();\n//         fit++)\n//     {\n//       IA(i) = fit->second;\n//       RIA(fit->second) = i;\n//       C.row(i) = fit->first.data;\n//       i++;\n//     }\n//   }\n//   // IC should index C\n//   for(int i = 0;i<m;i++)\n//   {\n//     IC(i) = RIA(IC(i));\n//   }\n// }\n\ntemplate <typename DerivedA, typename DerivedIA, typename DerivedIC>\nIGL_INLINE void igl::unique_rows(\n  const Eigen::DenseBase<DerivedA>& A,\n  Eigen::PlainObjectBase<DerivedA>& C,\n  Eigen::PlainObjectBase<DerivedIA>& IA,\n  Eigen::PlainObjectBase<DerivedIC>& IC)\n{\n  using namespace std;\n  using namespace Eigen;\n  VectorXi IM;\n  DerivedA sortA;\n  sortrows(A,true,sortA,IM);\n\n\n  const int num_rows = sortA.rows();\n  const int num_cols = sortA.cols();\n  vector<int> vIA(num_rows);\n  for(int i=0;i<num_rows;i++)\n  {\n    vIA[i] = i;\n  }\n\n  auto index_equal = [&sortA, &num_cols](const size_t i, const size_t j) {\n    for (size_t c=0; c<num_cols; c++) {\n      if (sortA(i,c) != sortA(j,c))\n        return false;\n    }\n    return true;\n  };\n  vIA.erase(\n    std::unique(\n    vIA.begin(),\n    vIA.end(),\n    index_equal\n    ),vIA.end());\n\n  IC.resize(A.rows(),1);\n  {\n    int j = 0;\n    for(int i = 0;i<num_rows;i++)\n    {\n      if(sortA.row(vIA[j]) != sortA.row(i))\n      {\n        j++;\n      }\n      IC(IM(i,0),0) = j;\n    }\n  }\n  const int unique_rows = vIA.size();\n  C.resize(unique_rows,A.cols());\n  IA.resize(unique_rows,1);\n  // Reindex IA according to IM\n  for(int i = 0;i<unique_rows;i++)\n  {\n    IA(i,0) = IM(vIA[i],0);\n    C.row(i) = A.row(IA(i,0));\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::unique<Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::unique<Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::unique<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::unique<int>(std::vector<int, std::allocator<int> > const&, std::vector<int, std::allocator<int> >&, std::vector<size_t, std::allocator<size_t> >&, std::vector<size_t, std::allocator<size_t> >&);\ntemplate void igl::unique_rows<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::unique_rows<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::unique_rows<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::unique_rows<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::unique_rows<Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::unique<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::unique<Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::unique_rows<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<long, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&);\ntemplate void igl::unique<int>(std::vector<int, std::allocator<int> > const&, std::vector<int, std::allocator<int> >&);\ntemplate void igl::unique<long>(std::vector<long, std::allocator<long> > const&, std::vector<long, std::allocator<long> >&, std::vector<unsigned long, std::allocator<unsigned long> >&, std::vector<unsigned long, std::allocator<unsigned long> >&);\ntemplate void igl::unique_rows<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::unique_rows<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::unique<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::unique<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::unique<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::unique<double>(std::vector<double, std::allocator<double> > const&, std::vector<double, std::allocator<double> >&);\ntemplate void igl::unique<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::unique<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::unique_rows<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::unique<Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<long, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&);\n\n#ifdef WIN32\ntemplate void __cdecl igl::unique_rows<class Eigen::Matrix<int, -1, -1, 0, -1, -1>, class Eigen::Matrix<__int64, -1, 1, 0, -1, 1>, class Eigen::Matrix<__int64, -1, 1, 0, -1, 1> >(class Eigen::DenseBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1> > const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1> > &, class Eigen::PlainObjectBase<class Eigen::Matrix<__int64, -1, 1, 0, -1, 1> > &, class Eigen::PlainObjectBase<class Eigen::Matrix<__int64, -1, 1, 0, -1, 1> > &);\n#endif\n\ntemplate void igl::unique_rows<Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<long, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&);\ntemplate void igl::unique_rows<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/unique.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_UNIQUE_H\n#define IGL_UNIQUE_H\n#include \"igl_inline.h\"\n\n#include <vector>\n#include <Eigen/Core>\nnamespace igl\n{\n  // Act like matlab's [C,IA,IC] = unique(X)\n  //\n  // Templates:\n  //   T  comparable type T\n  // Inputs:\n  //   A  #A vector of type T\n  // Outputs:\n  //   C  #C vector of unique entries in A\n  //   IA  #C index vector so that C = A(IA);\n  //   IC  #A index vector so that A = C(IC);\n  template <typename T>\n  IGL_INLINE void unique(\n    const std::vector<T> & A,\n    std::vector<T> & C,\n    std::vector<size_t> & IA,\n    std::vector<size_t> & IC);\n  template <typename T>\n  IGL_INLINE void unique(\n    const std::vector<T> & A,\n    std::vector<T> & C);\n  template <\n    typename DerivedA,\n    typename DerivedC,\n    typename DerivedIA,\n    typename DerivedIC>\n  IGL_INLINE void unique(\n      const Eigen::DenseBase<DerivedA> & A,\n      Eigen::PlainObjectBase<DerivedC> & C,\n      Eigen::PlainObjectBase<DerivedIA> & IA,\n      Eigen::PlainObjectBase<DerivedIC> & IC);\n  template <\n    typename DerivedA,\n    typename DerivedC>\n  IGL_INLINE void unique(\n      const Eigen::DenseBase<DerivedA> & A,\n      Eigen::PlainObjectBase<DerivedC> & C);\n  // Act like matlab's [C,IA,IC] = unique(X,'rows')\n  //\n  // Templates:\n  //   DerivedA derived scalar type, e.g. MatrixXi or MatrixXd\n  //   DerivedIA derived integer type, e.g. MatrixXi\n  //   DerivedIC derived integer type, e.g. MatrixXi\n  // Inputs:\n  //   A  m by n matrix whose entries are to unique'd according to rows\n  // Outputs:\n  //   C  #C vector of unique rows in A\n  //   IA  #C index vector so that C = A(IA,:);\n  //   IC  #A index vector so that A = C(IC,:);\n  template <typename DerivedA, typename DerivedIA, typename DerivedIC>\n  IGL_INLINE void unique_rows(\n    const Eigen::DenseBase<DerivedA>& A,\n    Eigen::PlainObjectBase<DerivedA>& C,\n    Eigen::PlainObjectBase<DerivedIA>& IA,\n    Eigen::PlainObjectBase<DerivedIC>& IC);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"unique.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/unique_edge_map.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"unique_edge_map.h\"\n#include \"all_edges.h\"\n#include \"unique_simplices.h\"\n#include <cassert>\n#include <algorithm>\ntemplate <\n  typename DerivedF,\n  typename DerivedE,\n  typename DeriveduE,\n  typename DerivedEMAP,\n  typename uE2EType>\nIGL_INLINE void igl::unique_edge_map(\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  Eigen::PlainObjectBase<DerivedE> & E,\n  Eigen::PlainObjectBase<DeriveduE> & uE,\n  Eigen::PlainObjectBase<DerivedEMAP> & EMAP,\n  std::vector<std::vector<uE2EType> > & uE2E)\n{\n  using namespace Eigen;\n  using namespace std;\n  // All occurances of directed edges\n  all_edges(F,E);\n  const size_t ne = E.rows();\n  // This is 2x faster to create than a map from pairs to lists of edges and 5x\n  // faster to access (actually access is probably assympotically faster O(1)\n  // vs. O(log m)\n  Matrix<typename DerivedEMAP::Scalar,Dynamic,1> IA;\n  unique_simplices(E,uE,IA,EMAP);\n  uE2E.resize(uE.rows());\n  // This does help a little\n  for_each(uE2E.begin(),uE2E.end(),[](vector<uE2EType > & v){v.reserve(2);});\n  assert((size_t)EMAP.size() == ne);\n  for(uE2EType e = 0;e<(uE2EType)ne;e++)\n  {\n    uE2E[EMAP(e)].push_back(e);\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::unique_edge_map<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, int>(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&);\n// generated by autoexplicit.sh\ntemplate void igl::unique_edge_map<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, unsigned long>(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, std::vector<std::vector<unsigned long, std::allocator<unsigned long> >, std::allocator<std::vector<unsigned long, std::allocator<unsigned long> > > >&);\ntemplate void igl::unique_edge_map<Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, long>(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > >&);\ntemplate void igl::unique_edge_map<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, long>(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > >&);\ntemplate void igl::unique_edge_map<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, int>(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&);\ntemplate void igl::unique_edge_map<Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, int>(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&);\ntemplate void igl::unique_edge_map<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 2, 0, -1, 2>, Eigen::Matrix<double, -1, 2, 0, -1, 2>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, long>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > >&);\ntemplate void igl::unique_edge_map<Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, int>(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&);\ntemplate void igl::unique_edge_map<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, unsigned long>(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, std::vector<std::vector<unsigned long, std::allocator<unsigned long> >, std::allocator<std::vector<unsigned long, std::allocator<unsigned long> > > >&);\n\n#ifdef WIN32\ntemplate void __cdecl igl::unique_edge_map<class Eigen::Matrix<int, -1, 3, 0, -1, 3>, class Eigen::Matrix<int, -1, 2, 0, -1, 2>, class Eigen::Matrix<int, -1, 2, 0, -1, 2>, class Eigen::Matrix<__int64, -1, 1, 0, -1, 1>, __int64>(class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 3, 0, -1, 3> > const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 2, 0, -1, 2> > &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 2, 0, -1, 2> > &, class Eigen::PlainObjectBase<class Eigen::Matrix<__int64, -1, 1, 0, -1, 1> > &, class std::vector<class std::vector<__int64, class std::allocator<__int64> >, class std::allocator<class std::vector<__int64, class std::allocator<__int64> > > > &);\ntemplate void __cdecl igl::unique_edge_map<class Eigen::Matrix<int,-1,-1,0,-1,-1>,class Eigen::Matrix<int,-1,2,0,-1,2>,class Eigen::Matrix<int,-1,2,0,-1,2>,class Eigen::Matrix<__int64,-1,1,0,-1,1>,__int64>(class Eigen::PlainObjectBase<class Eigen::Matrix<int,-1,-1,0,-1,-1> > const &,class Eigen::PlainObjectBase<class Eigen::Matrix<int,-1,2,0,-1,2> > &,class Eigen::PlainObjectBase<class Eigen::Matrix<int,-1,2,0,-1,2> > &,class Eigen::PlainObjectBase<class Eigen::Matrix<__int64,-1,1,0,-1,1> > &,class std::vector<class std::vector<__int64,class std::allocator<__int64> >,class std::allocator<class std::vector<__int64,class std::allocator<__int64> > > > &);\n#endif\n\n#endif \n"
  },
  {
    "path": "libs/libigl/include/igl/unique_edge_map.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_UNIQUE_EDGE_MAP_H\n#define IGL_UNIQUE_EDGE_MAP_H\n#include \"igl_inline.h\"\n#include <Eigen/Dense>\n#include <vector>\nnamespace igl\n{\n  // Constuct relationships between facet \"half\"-(or rather \"viewed\")-edges E\n  // to unique edges of the mesh seen as a graph.\n  //\n  // Inputs:\n  //   F  #F by 3  list of simplices\n  // Outputs:\n  //   E  #F*3 by 2 list of all of directed edges\n  //   uE  #uE by 2 list of unique undirected edges\n  //   EMAP #F*3 list of indices into uE, mapping each directed edge to unique\n  //     undirected edge\n  //   uE2E  #uE list of lists of indices into E of coexisting edges\n  template <\n    typename DerivedF,\n    typename DerivedE,\n    typename DeriveduE,\n    typename DerivedEMAP,\n    typename uE2EType>\n  IGL_INLINE void unique_edge_map(\n    const Eigen::PlainObjectBase<DerivedF> & F,\n    Eigen::PlainObjectBase<DerivedE> & E,\n    Eigen::PlainObjectBase<DeriveduE> & uE,\n    Eigen::PlainObjectBase<DerivedEMAP> & EMAP,\n    std::vector<std::vector<uE2EType> > & uE2E);\n\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"unique_edge_map.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/unique_simplices.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"unique_simplices.h\"\n#include \"sort.h\"\n#include \"unique.h\"\n#include \"parallel_for.h\"\n\ntemplate <\n  typename DerivedF,\n  typename DerivedFF,\n  typename DerivedIA,\n  typename DerivedIC>\nIGL_INLINE void igl::unique_simplices(\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  Eigen::PlainObjectBase<DerivedFF>& FF,\n  Eigen::PlainObjectBase<DerivedIA>& IA,\n  Eigen::PlainObjectBase<DerivedIC>& IC)\n{\n  using namespace Eigen;\n  using namespace std;\n  // Sort each face\n  MatrixXi sortF, unusedI;\n  igl::sort(F,2,true,sortF,unusedI);\n  // Find unique faces\n  MatrixXi C;\n  igl::unique_rows(sortF,C,IA,IC);\n  FF.resize(IA.size(),F.cols());\n  const size_t mff = FF.rows();\n  parallel_for(mff,[&F,&IA,&FF](size_t & i){FF.row(i) = F.row(IA(i));},1000ul);\n}\n\ntemplate <\n  typename DerivedF,\n  typename DerivedFF>\nIGL_INLINE void igl::unique_simplices(\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  Eigen::PlainObjectBase<DerivedFF>& FF)\n{\n  Eigen::VectorXi IA,IC;\n  return unique_simplices(F,FF,IA,IC);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::unique_simplices<Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::unique_simplices<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::unique_simplices<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&);\ntemplate void igl::unique_simplices<Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<long, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&);\ntemplate void igl::unique_simplices<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::unique_simplices<Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::unique_simplices<Eigen::Matrix<double, -1, 2, 0, -1, 2>, Eigen::Matrix<double, -1, 2, 0, -1, 2>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<long, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&);\ntemplate void igl::unique_simplices<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 2, 0, -1, 2>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);\ntemplate void igl::unique_simplices<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\n#ifdef WIN32\ntemplate void __cdecl igl::unique_simplices<class Eigen::Matrix<int, -1, 2, 0, -1, 2>, class Eigen::Matrix<int, -1, 2, 0, -1, 2>, class Eigen::Matrix<__int64, -1, 1, 0, -1, 1>, class Eigen::Matrix<__int64, -1, 1, 0, -1, 1> >(class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 2, 0, -1, 2> > const &, class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, 2, 0, -1, 2> > &, class Eigen::PlainObjectBase<class Eigen::Matrix<__int64, -1, 1, 0, -1, 1> > &, class Eigen::PlainObjectBase<class Eigen::Matrix<__int64, -1, 1, 0, -1, 1> > &);\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/unique_simplices.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_UNIQUE_SIMPLICES_H\n#define IGL_UNIQUE_SIMPLICES_H\n#include \"igl_inline.h\"\n#include <Eigen/Dense>\nnamespace igl\n{\n  // Find *combinatorially* unique simplices in F.  **Order independent**\n  //\n  // Inputs:\n  //   F  #F by simplex-size list of simplices\n  // Outputs:\n  //   FF  #FF by simplex-size list of unique simplices in F\n  //   IA  #FF index vector so that FF == sort(F(IA,:),2);\n  //   IC  #F index vector so that sort(F,2) == FF(IC,:);\n  template <\n    typename DerivedF,\n    typename DerivedFF,\n    typename DerivedIA,\n    typename DerivedIC>\n  IGL_INLINE void unique_simplices(\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    Eigen::PlainObjectBase<DerivedFF>& FF,\n    Eigen::PlainObjectBase<DerivedIA>& IA,\n    Eigen::PlainObjectBase<DerivedIC>& IC);\n  template <\n    typename DerivedF,\n    typename DerivedFF>\n  IGL_INLINE void unique_simplices(\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    Eigen::PlainObjectBase<DerivedFF>& FF);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"unique_simplices.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/unproject.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"unproject.h\"\n\n#include <Eigen/Dense>\n#include <Eigen/LU>\n\ntemplate <\n  typename Derivedwin,\n  typename Derivedmodel,\n  typename Derivedproj,\n  typename Derivedviewport,\n  typename Derivedscene>\nIGL_INLINE void igl::unproject(\n  const Eigen::PlainObjectBase<Derivedwin>&  win,\n  const Eigen::PlainObjectBase<Derivedmodel>& model,\n  const Eigen::PlainObjectBase<Derivedproj>& proj,\n  const Eigen::PlainObjectBase<Derivedviewport>&  viewport,\n  Eigen::PlainObjectBase<Derivedscene> & scene)\n{\n  if(win.cols() != 3)\n  {\n    assert(win.rows() == 3);\n    // needless transposes\n    Eigen::Matrix<typename Derivedscene::Scalar,1,3> sceneT;\n    unproject(win.transpose().eval(),model,proj,viewport,sceneT);\n    scene = sceneT.head(3);\n    return;\n  }\n  assert(win.cols() == 3);\n  const int n = win.rows();\n  scene.resize(n,3);\n  for(int i = 0;i<n;i++)\n  {\n    typedef typename Derivedscene::Scalar Scalar;\n    Eigen::Matrix<Scalar,4,4> Inverse = \n      (proj.template cast<Scalar>() * model.template cast<Scalar>()).inverse();\n\n    Eigen::Matrix<Scalar,4,1> tmp;\n    tmp << win.row(i).head(3).transpose(), 1;\n    tmp(0) = (tmp(0) - viewport(0)) / viewport(2);\n    tmp(1) = (tmp(1) - viewport(1)) / viewport(3);\n    tmp = tmp.array() * 2.0f - 1.0f;\n\n    Eigen::Matrix<Scalar,4,1> obj = Inverse * tmp;\n    obj /= obj(3);\n\n    scene.row(i).head(3) = obj.head(3);\n  }\n}\n\ntemplate <typename Scalar>\nIGL_INLINE Eigen::Matrix<Scalar,3,1> igl::unproject(\n  const    Eigen::Matrix<Scalar,3,1>&  win,\n  const    Eigen::Matrix<Scalar,4,4>& model,\n  const    Eigen::Matrix<Scalar,4,4>& proj,\n  const    Eigen::Matrix<Scalar,4,1>&  viewport)\n{\n  Eigen::Matrix<Scalar,3,1> scene;\n  unproject(win,model,proj,viewport,scene);\n  return scene;\n}\n\n#ifdef IGL_STATIC_LIBRARY\ntemplate Eigen::Matrix<float, 3, 1, 0, 3, 1> igl::unproject<float>(Eigen::Matrix<float, 3, 1, 0, 3, 1> const&, Eigen::Matrix<float, 4, 4, 0, 4, 4> const&, Eigen::Matrix<float, 4, 4, 0, 4, 4> const&, Eigen::Matrix<float, 4, 1, 0, 4, 1> const&);\ntemplate Eigen::Matrix<double, 3, 1, 0, 3, 1> igl::unproject<double>(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&, Eigen::Matrix<double, 4, 4, 0, 4, 4> const&, Eigen::Matrix<double, 4, 4, 0, 4, 4> const&, Eigen::Matrix<double, 4, 1, 0, 4, 1> const&);\ntemplate void igl::unproject<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<float, 4, 4, 0, 4, 4>, Eigen::Matrix<float, 4, 4, 0, 4, 4>, Eigen::Matrix<float, 4, 1, 0, 4, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, 4, 4, 0, 4, 4> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, 4, 4, 0, 4, 4> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, 4, 1, 0, 4, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);\ntemplate void igl::unproject<Eigen::Matrix<float, 3, 1, 0, 3, 1>, Eigen::Matrix<float, 4, 4, 0, 4, 4>, Eigen::Matrix<float, 4, 4, 0, 4, 4>, Eigen::Matrix<float, 4, 1, 0, 4, 1>, Eigen::Matrix<float, 3, 1, 0, 3, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<float, 3, 1, 0, 3, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, 4, 4, 0, 4, 4> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, 4, 4, 0, 4, 4> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, 4, 1, 0, 4, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, 3, 1, 0, 3, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/unproject.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_UNPROJECT_H\n#define IGL_UNPROJECT_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Eigen reimplementation of gluUnproject\n  //\n  // Inputs:\n  //   win  #P by 3 or 3-vector (#P=1) of screen space x, y, and z coordinates\n  //   model  4x4 model-view matrix\n  //   proj  4x4 projection matrix\n  //   viewport  4-long viewport vector\n  // Outputs:\n  //   scene  #P by 3 or 3-vector (#P=1) the unprojected x, y, and z coordinates\n  template <\n    typename Derivedwin,\n    typename Derivedmodel,\n    typename Derivedproj,\n    typename Derivedviewport,\n    typename Derivedscene>\n  IGL_INLINE void unproject(\n    const Eigen::PlainObjectBase<Derivedwin>&  win,\n    const Eigen::PlainObjectBase<Derivedmodel>& model,\n    const Eigen::PlainObjectBase<Derivedproj>& proj,\n    const Eigen::PlainObjectBase<Derivedviewport>&  viewport,\n    Eigen::PlainObjectBase<Derivedscene> & scene);\n  template <typename Scalar>\n  IGL_INLINE Eigen::Matrix<Scalar,3,1> unproject(\n    const Eigen::Matrix<Scalar,3,1>&  win,\n    const Eigen::Matrix<Scalar,4,4>& model,\n    const Eigen::Matrix<Scalar,4,4>& proj,\n    const Eigen::Matrix<Scalar,4,1>&  viewport);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"unproject.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/unproject_in_mesh.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"unproject_in_mesh.h\"\n#include \"unproject_ray.h\"\n#include \"ray_mesh_intersect.h\"\n\ntemplate < typename Derivedobj>\n  IGL_INLINE int igl::unproject_in_mesh(\n      const Eigen::Vector2f& pos,\n      const Eigen::Matrix4f& model,\n      const Eigen::Matrix4f& proj,\n      const Eigen::Vector4f& viewport,\n      const std::function<\n        void(\n          const Eigen::Vector3f&,\n          const Eigen::Vector3f&,\n          std::vector<igl::Hit> &)\n          > & shoot_ray,\n      Eigen::PlainObjectBase<Derivedobj> & obj,\n      std::vector<igl::Hit > & hits)\n{\n  using namespace std;\n  using namespace Eigen;\n  Vector3f s,dir;\n  unproject_ray(pos,model,proj,viewport,s,dir);\n  shoot_ray(s,dir,hits);\n  switch(hits.size())\n  {\n    case 0:\n      break;\n    case 1:\n    {\n      obj = (s + dir*hits[0].t).cast<typename Derivedobj::Scalar>();\n      break;\n    }\n    case 2:\n    default:\n    {\n      obj = 0.5*((s + dir*hits[0].t) + (s + dir*hits[1].t)).cast<typename Derivedobj::Scalar>();\n      break;\n    }\n  }\n  return hits.size();\n}\n\nextern \"C\"\n{\n#include \"raytri.c\"\n}\n\ntemplate < typename DerivedV, typename DerivedF, typename Derivedobj>\n  IGL_INLINE int igl::unproject_in_mesh(\n      const Eigen::Vector2f& pos,\n      const Eigen::Matrix4f& model,\n      const Eigen::Matrix4f& proj,\n      const Eigen::Vector4f& viewport,\n      const Eigen::PlainObjectBase<DerivedV> & V,\n      const Eigen::PlainObjectBase<DerivedF> & F,\n      Eigen::PlainObjectBase<Derivedobj> & obj,\n      std::vector<igl::Hit > & hits)\n{\n  using namespace std;\n  using namespace Eigen;\n  const auto & shoot_ray = [&V,&F](\n    const Eigen::Vector3f& s,\n    const Eigen::Vector3f& dir,\n    std::vector<igl::Hit> & hits)\n  {\n    ray_mesh_intersect(s,dir,V,F,hits);\n  };\n  return unproject_in_mesh(pos,model,proj,viewport,shoot_ray,obj,hits);\n}\n\ntemplate < typename DerivedV, typename DerivedF, typename Derivedobj>\n  IGL_INLINE int igl::unproject_in_mesh(\n      const Eigen::Vector2f& pos,\n      const Eigen::Matrix4f& model,\n      const Eigen::Matrix4f& proj,\n      const Eigen::Vector4f& viewport,\n      const Eigen::PlainObjectBase<DerivedV> & V,\n      const Eigen::PlainObjectBase<DerivedF> & F,\n      Eigen::PlainObjectBase<Derivedobj> & obj)\n{\n  std::vector<igl::Hit> hits;\n  return unproject_in_mesh(pos,model,proj,viewport,V,F,obj,hits);\n}\n#ifdef IGL_STATIC_LIBRARY\ntemplate int igl::unproject_in_mesh<Eigen::Matrix<double, 1, 3, 1, 1, 3> >(Eigen::Matrix<float, 2, 1, 0, 2, 1> const&, Eigen::Matrix<float, 4, 4, 0, 4, 4> const&, Eigen::Matrix<float, 4, 4, 0, 4, 4> const&, Eigen::Matrix<float, 4, 1, 0, 4, 1> const&, std::function<void (Eigen::Matrix<float, 3, 1, 0, 3, 1> const&, Eigen::Matrix<float, 3, 1, 0, 3, 1> const&, std::vector<igl::Hit, std::allocator<igl::Hit> >&)> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> >&, std::vector<igl::Hit, std::allocator<igl::Hit> >&);\ntemplate int igl::unproject_in_mesh<Eigen::Matrix<double, 3, 1, 0, 3, 1> >(Eigen::Matrix<float, 2, 1, 0, 2, 1> const&, Eigen::Matrix<float, 4, 4, 0, 4, 4> const&, Eigen::Matrix<float, 4, 4, 0, 4, 4> const&, Eigen::Matrix<float, 4, 1, 0, 4, 1> const&, std::function<void (Eigen::Matrix<float, 3, 1, 0, 3, 1> const&, Eigen::Matrix<float, 3, 1, 0, 3, 1> const&, std::vector<igl::Hit, std::allocator<igl::Hit> >&)> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 1, 0, 3, 1> >&, std::vector<igl::Hit, std::allocator<igl::Hit> >&);\ntemplate int igl::unproject_in_mesh<Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::Matrix<float, 2, 1, 0, 2, 1> const&, Eigen::Matrix<float, 4, 4, 0, 4, 4> const&, Eigen::Matrix<float, 4, 4, 0, 4, 4> const&, Eigen::Matrix<float, 4, 1, 0, 4, 1> const&, std::function<void (Eigen::Matrix<float, 3, 1, 0, 3, 1> const&, Eigen::Matrix<float, 3, 1, 0, 3, 1> const&, std::vector<igl::Hit, std::allocator<igl::Hit> >&)> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, std::vector<igl::Hit, std::allocator<igl::Hit> >&);\ntemplate int igl::unproject_in_mesh<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, 3, 1, 0, 3, 1> >(Eigen::Matrix<float, 2, 1, 0, 2, 1> const&, Eigen::Matrix<float, 4, 4, 0, 4, 4> const&, Eigen::Matrix<float, 4, 4, 0, 4, 4> const&, Eigen::Matrix<float, 4, 1, 0, 4, 1> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 1, 0, 3, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/unproject_in_mesh.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_UNPROJECT_IN_MESH\n#define IGL_UNPROJECT_IN_MESH\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n\n#include <vector>\n#include \"Hit.h\"\n\nnamespace igl\n{\n  // Unproject a screen location (using current opengl viewport, projection, and\n  // model view) to a 3D position _inside_ a given mesh. If the ray through the\n  // given screen location (x,y) _hits_ the mesh more than twice then the 3D\n  // midpoint between the first two hits is return. If it hits once, then that\n  // point is return. If it does not hit the mesh then obj is not set.\n  //\n  // Inputs:\n  //    pos        screen space coordinates\n  //    model      model matrix\n  //    proj       projection matrix\n  //    viewport   vieweport vector\n  //    V   #V by 3 list of mesh vertex positions\n  //    F   #F by 3 list of mesh triangle indices into V\n  // Outputs:\n  //    obj        3d unprojected mouse point in mesh\n  //    hits       vector of hits\n  // Returns number of hits\n  //\n  template < typename DerivedV, typename DerivedF, typename Derivedobj>\n    IGL_INLINE int unproject_in_mesh(\n        const Eigen::Vector2f& pos,\n        const Eigen::Matrix4f& model,\n        const Eigen::Matrix4f& proj,\n        const Eigen::Vector4f& viewport,\n        const Eigen::PlainObjectBase<DerivedV> & V,\n        const Eigen::PlainObjectBase<DerivedF> & F,\n        Eigen::PlainObjectBase<Derivedobj> & obj,\n        std::vector<igl::Hit > & hits);\n  //\n  // Inputs:\n  //    pos        screen space coordinates\n  //    model      model matrix\n  //    proj       projection matrix\n  //    viewport   vieweport vector\n  //    shoot_ray  function handle that outputs first hit of a given ray\n  //      against a mesh (embedded in function handles as captured\n  //      variable/data)\n  // Outputs:\n  //    obj        3d unprojected mouse point in mesh\n  //    hits       vector of hits\n  // Returns number of hits\n  //\n  template < typename Derivedobj>\n    IGL_INLINE int unproject_in_mesh(\n        const Eigen::Vector2f& pos,\n        const Eigen::Matrix4f& model,\n        const Eigen::Matrix4f& proj,\n        const Eigen::Vector4f& viewport,\n        const std::function<\n          void(\n            const Eigen::Vector3f&,\n            const Eigen::Vector3f&,\n            std::vector<igl::Hit> &)\n            > & shoot_ray,\n        Eigen::PlainObjectBase<Derivedobj> & obj,\n        std::vector<igl::Hit > & hits);\n  template < typename DerivedV, typename DerivedF, typename Derivedobj>\n    IGL_INLINE int unproject_in_mesh(\n        const Eigen::Vector2f& pos,\n        const Eigen::Matrix4f& model,\n        const Eigen::Matrix4f& proj,\n        const Eigen::Vector4f& viewport,\n        const Eigen::PlainObjectBase<DerivedV> & V,\n        const Eigen::PlainObjectBase<DerivedF> & F,\n        Eigen::PlainObjectBase<Derivedobj> & obj);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"unproject_in_mesh.cpp\"\n#endif\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/unproject_onto_mesh.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2016 Alec Jacobson\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"unproject_onto_mesh.h\"\n#include \"unproject.h\"\n#include \"unproject_ray.h\"\n#include \"ray_mesh_intersect.h\"\n#include <vector>\n\ntemplate < typename DerivedV, typename DerivedF, typename Derivedbc>\nIGL_INLINE bool igl::unproject_onto_mesh(\n  const Eigen::Vector2f& pos,\n  const Eigen::Matrix4f& model,\n  const Eigen::Matrix4f& proj,\n  const Eigen::Vector4f& viewport,\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  int & fid,\n  Eigen::PlainObjectBase<Derivedbc> & bc)\n{\n  using namespace std;\n  using namespace Eigen;\n  const auto & shoot_ray = [&V,&F](\n    const Eigen::Vector3f& s,\n    const Eigen::Vector3f& dir,\n    igl::Hit & hit)->bool\n  {\n    std::vector<igl::Hit> hits;\n    if(!ray_mesh_intersect(s,dir,V,F,hits))\n    {\n      return false;\n    }\n    hit = hits[0];\n    return true;\n  };\n  return unproject_onto_mesh(pos,model,proj,viewport,shoot_ray,fid,bc);\n}\n\ntemplate <typename Derivedbc>\nIGL_INLINE bool igl::unproject_onto_mesh(\n  const Eigen::Vector2f& pos,\n  const Eigen::Matrix4f& model,\n  const Eigen::Matrix4f& proj,\n  const Eigen::Vector4f& viewport,\n  const std::function<\n    bool(\n      const Eigen::Vector3f&,\n      const Eigen::Vector3f&,\n      igl::Hit &)\n      > & shoot_ray,\n  int & fid,\n  Eigen::PlainObjectBase<Derivedbc> & bc)\n{\n  using namespace std;\n  using namespace Eigen;\n  Vector3f s,dir;\n  unproject_ray(pos,model,proj,viewport,s,dir);\n  Hit hit;\n  if(!shoot_ray(s,dir,hit))\n  {\n    return false;\n  }\n  bc.resize(3);\n  bc << 1.0-hit.u-hit.v, hit.u, hit.v;\n  fid = hit.id;\n  return true;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate bool igl::unproject_onto_mesh<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<float, 3, 1, 0, 3, 1> >(Eigen::Matrix<float, 2, 1, 0, 2, 1> const&, Eigen::Matrix<float, 4, 4, 0, 4, 4> const&, Eigen::Matrix<float, 4, 4, 0, 4, 4> const&, Eigen::Matrix<float, 4, 1, 0, 4, 1> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, int&, Eigen::PlainObjectBase<Eigen::Matrix<float, 3, 1, 0, 3, 1> >&);\ntemplate bool igl::unproject_onto_mesh<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::Matrix<float, 2, 1, 0, 2, 1> const&, Eigen::Matrix<float, 4, 4, 0, 4, 4> const&, Eigen::Matrix<float, 4, 4, 0, 4, 4> const&, Eigen::Matrix<float, 4, 1, 0, 4, 1> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, int&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/unproject_onto_mesh.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_UNPROJECT_ONTO_MESH\n#define IGL_UNPROJECT_ONTO_MESH\n#include \"igl_inline.h\"\n#include \"Hit.h\"\n#include <Eigen/Core>\n#include <functional>\n\nnamespace igl\n{\n  // Unproject a screen location (using current opengl viewport, projection, and\n  // model view) to a 3D position _onto_ a given mesh, if the ray through the\n  // given screen location (x,y) _hits_ the mesh.\n  //\n  // Inputs:\n  //    pos        screen space coordinates\n  //    model      model matrix\n  //    proj       projection matrix\n  //    viewport   vieweport vector\n  //    V   #V by 3 list of mesh vertex positions\n  //    F   #F by 3 list of mesh triangle indices into V\n  // Outputs:\n  //    fid  id of the first face hit\n  //    bc  barycentric coordinates of hit\n  // Returns true if there's a hit\n  template < typename DerivedV, typename DerivedF, typename Derivedbc>\n  IGL_INLINE bool unproject_onto_mesh(\n    const Eigen::Vector2f& pos,\n    const Eigen::Matrix4f& model,\n    const Eigen::Matrix4f& proj,\n    const Eigen::Vector4f& viewport,\n    const Eigen::PlainObjectBase<DerivedV> & V,\n    const Eigen::PlainObjectBase<DerivedF> & F,\n    int & fid,\n    Eigen::PlainObjectBase<Derivedbc> & bc);\n  //\n  // Inputs:\n  //    pos        screen space coordinates\n  //    model      model matrix\n  //    proj       projection matrix\n  //    viewport   vieweport vector\n  //    shoot_ray  function handle that outputs hits of a given ray against a\n  //      mesh (embedded in function handles as captured variable/data)\n  // Outputs:\n  //    fid  id of the first face hit\n  //    bc  barycentric coordinates of hit\n  // Returns true if there's a hit\n  template <typename Derivedbc>\n  IGL_INLINE bool unproject_onto_mesh(\n    const Eigen::Vector2f& pos,\n    const Eigen::Matrix4f& model,\n    const Eigen::Matrix4f& proj,\n    const Eigen::Vector4f& viewport,\n    const std::function<\n      bool(\n        const Eigen::Vector3f&,\n        const Eigen::Vector3f&,\n        igl::Hit  &)\n        > & shoot_ray,\n    int & fid,\n    Eigen::PlainObjectBase<Derivedbc> & bc);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"unproject_onto_mesh.cpp\"\n#endif\n#endif\n\n\n"
  },
  {
    "path": "libs/libigl/include/igl/unproject_ray.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"unproject_ray.h\"\n#include \"unproject.h\"\n\ntemplate <\n  typename Derivedpos,\n  typename Derivedmodel,\n  typename Derivedproj,\n  typename Derivedviewport,\n  typename Deriveds,\n  typename Deriveddir>\nIGL_INLINE void igl::unproject_ray(\n  const Eigen::PlainObjectBase<Derivedpos> & pos,\n  const Eigen::PlainObjectBase<Derivedmodel> & model,\n  const Eigen::PlainObjectBase<Derivedproj> & proj,\n  const Eigen::PlainObjectBase<Derivedviewport> & viewport,\n  Eigen::PlainObjectBase<Deriveds> & s,\n  Eigen::PlainObjectBase<Deriveddir> & dir)\n{\n  using namespace std;\n  using namespace Eigen;\n  // Source and direction on screen\n  typedef Eigen::Matrix<typename Deriveds::Scalar,3,1> Vec3;\n  Vec3 win_s(pos(0),pos(1),0);\n  Vec3 win_d(pos(0),pos(1),1);\n  // Source, destination and direction in world\n  Vec3 d;\n  igl::unproject(win_s,model,proj,viewport,s);\n  igl::unproject(win_d,model,proj,viewport,d);\n  dir = d-s;\n}\n\n#ifdef IGL_STATIC_LIBRARY\ntemplate void igl::unproject_ray<Eigen::Matrix<float, 2, 1, 0, 2, 1>, Eigen::Matrix<float, 4, 4, 0, 4, 4>, Eigen::Matrix<float, 4, 4, 0, 4, 4>, Eigen::Matrix<float, 4, 1, 0, 4, 1>, Eigen::Matrix<float, 3, 1, 0, 3, 1>, Eigen::Matrix<float, 3, 1, 0, 3, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<float, 2, 1, 0, 2, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, 4, 4, 0, 4, 4> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, 4, 4, 0, 4, 4> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, 4, 1, 0, 4, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, 3, 1, 0, 3, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<float, 3, 1, 0, 3, 1> >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/unproject_ray.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_UNPROJECT_RAY_H\n#define IGL_UNPROJECT_RAY_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Construct a ray (source point + direction vector) given a screen space\n  // positions (e.g. mouse) and a model-view projection constellation.\n  //\n  // Inputs:\n  //   pos  2d screen-space position (x,y) \n  //   model  4x4 model-view matrix\n  //   proj  4x4 projection matrix\n  //   viewport  4-long viewport vector\n  // Outputs:\n  //   s  source of ray (pos unprojected with z=0)\n  ///  dir  direction of ray (d - s) where d is pos unprojected with z=1\n  // \n  template <\n    typename Derivedpos,\n    typename Derivedmodel,\n    typename Derivedproj,\n    typename Derivedviewport,\n    typename Deriveds,\n    typename Deriveddir>\n  IGL_INLINE void unproject_ray(\n    const Eigen::PlainObjectBase<Derivedpos> & pos,\n    const Eigen::PlainObjectBase<Derivedmodel> & model,\n    const Eigen::PlainObjectBase<Derivedproj> & proj,\n    const Eigen::PlainObjectBase<Derivedviewport> & viewport,\n    Eigen::PlainObjectBase<Deriveds> & s,\n    Eigen::PlainObjectBase<Deriveddir> & dir);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"unproject_ray.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/unproject_to_zero_plane.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"unproject_to_zero_plane.h\"\n#ifndef IGL_NO_OPENGL\n\n#include \"OpenGL_convenience.h\"\n\n#include \"project.h\"\n#include \"unproject.h\"\n\nIGL_INLINE void igl::unproject_to_zero_plane(\n  const double winX,\n  const double winY,\n  double* objX,\n  double* objY,\n  double* objZ)\n{\n  double winOrigin[3]; \n  igl::project(0,0,0,&winOrigin[0],&winOrigin[1],&winOrigin[2]);\n  return igl::unproject(winX, winY, winOrigin[2], objX, objY, objZ);\n}\n\ntemplate <typename Derivedwin, typename Derivedobj>\nIGL_INLINE void igl::unproject_to_zero_plane(\n  const Eigen::PlainObjectBase<Derivedwin> & win,\n  Eigen::PlainObjectBase<Derivedobj> & obj)\n{\n  return unproject_to_zero_plane(win(0),win(1),\n      &obj.data()[0],\n      &obj.data()[1],\n      &obj.data()[2]);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instanciation\ntemplate void igl::unproject_to_zero_plane<Eigen::Matrix<double, 3, 1, 0, 3, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 1, 0, 3, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 1, 0, 3, 1> >&);\ntemplate void igl::unproject_to_zero_plane<Eigen::Matrix<double, 2, 1, 0, 2, 1>, Eigen::Matrix<double, 1, 3, 1, 1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 1, 0, 2, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> >&);\ntemplate void igl::unproject_to_zero_plane<Eigen::Matrix<double, 2, 1, 0, 2, 1>, Eigen::Matrix<double, 3, 1, 0, 3, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 1, 0, 2, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 1, 0, 3, 1> >&);\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/unproject_to_zero_plane.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_UNPROJECT_TO_ZERO_PLANE_H\n#define IGL_UNPROJECT_TO_ZERO_PLANE_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // Wrapper for gluUnproject that uses the current GL_MODELVIEW_MATRIX,\n  // GL_PROJECTION_MATRIX, and GL_VIEWPORT to unproject a screen postion\n  // (winX,winY) to a 3d location at same depth as the current origin.\n  // Inputs:\n  //   win*  screen space x, y, and z coordinates respectively\n  // Outputs:\n  //   obj*  pointers to 3D objects' x, y, and z coordinates respectively\n  // Returns return value of gluUnProject call\n  IGL_INLINE void unproject_to_zero_plane(\n    const double winX,\n    const double winY,\n    double* objX,\n    double* objY,\n    double* objZ);\n  template <typename Derivedwin, typename Derivedobj>\n  IGL_INLINE void unproject_to_zero_plane(\n    const Eigen::PlainObjectBase<Derivedwin> & win,\n    Eigen::PlainObjectBase<Derivedobj> & obj);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"unproject_to_zero_plane.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/unzip_corners.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"unzip_corners.h\"\n\n#include \"unique.h\"\n#include \"slice.h\"\n\ntemplate < typename DerivedA, typename DerivedU, typename DerivedG, typename DerivedJ >\nIGL_INLINE void igl::unzip_corners(\n  const std::vector<std::reference_wrapper<DerivedA> > & A,\n  Eigen::PlainObjectBase<DerivedU> & U,\n  Eigen::PlainObjectBase<DerivedG> & G,\n  Eigen::PlainObjectBase<DerivedJ> & J)\n{\n  if(A.size() == 0)\n  {\n    U.resize(0,0);\n    G.resize(0,3);\n    J.resize(0,0);\n    return;\n  }\n  const size_t num_a = A.size();\n  const typename DerivedA::Index m = A[0].get().rows();\n  DerivedU C(m*3,num_a);\n  for(int a = 0;a<num_a;a++)\n  {\n    assert(A[a].get().rows() == m && \"All attributes should be same size\");\n    assert(A[a].get().cols() == 3 && \"Must be triangles\");\n    C.block(0*m,a,m,1) = A[a].get().col(0);\n    C.block(1*m,a,m,1) = A[a].get().col(1);\n    C.block(2*m,a,m,1) = A[a].get().col(2);\n  }\n  DerivedJ I;\n  igl::unique_rows(C,U,I,J);\n  G.resize(m,3);\n  for(int f = 0;f<m;f++)\n  {\n    for(int c = 0;c<3;c++)\n    {\n      G(f,c) = J(f+c*m);\n    }\n  }\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/unzip_corners.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_UNZIP_CORNERS_H\n#define IGL_UNZIP_CORNERS_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <vector>\n#include <functional>\n\nnamespace igl\n{\n  // UNZIP_CORNERS Given a triangle mesh where corners of each triangle index\n  // different matrices of attributes (e.g. read from an OBJ file), unzip the\n  // corners into unique efficiently: attributes become properly vertex valued\n  // (usually creating greater than #V but less than #F*3 vertices).\n  //\n  // To pass a list of attributes this function takes an std::vector of\n  // std::reference_wrapper of an Eigen::... type. This allows you to use list\n  // initializers **without** incurring a copy, but means you'll need to\n  // provide the derived type of A as an explicit template parameter:\n  //\n  //     unzip_corners<Eigen::MatrixXi>({F,FTC,FN},U,G,J);\n  //\n  // Inputs:\n  //   A  #A list of #F by 3 attribute indices, typically {F,FTC,FN}\n  // Outputs:\n  //   U  #U by #A list of indices into each attribute for each unique mesh\n  //     vertex: U(v,a) is the attribute index of vertex v in attribute a.\n  //   G  #F by 3 list of triangle indices into U\n  // Example:\n  //   [V,F,TC,FTC] = readOBJ('~/Downloads/kiwis/kiwi.obj');\n  //   [U,G] = unzip_corners(cat(3,F,FTC));\n  //   % display mesh\n  //   tsurf(G,V(U(:,1),:));\n  //   % display texture coordinates\n  //   tsurf(G,TC(U(:,2),:));\n  //\n  template < typename DerivedA, typename DerivedU, typename DerivedG, typename DerivedJ>\n  IGL_INLINE void unzip_corners(\n    const std::vector<std::reference_wrapper<DerivedA> > & A,\n    Eigen::PlainObjectBase<DerivedU> & U,\n    Eigen::PlainObjectBase<DerivedG> & G,\n    Eigen::PlainObjectBase<DerivedJ> & J);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"unzip_corners.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/up_axis.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"up_axis.h\"\n#ifndef IGL_NO_OPENGL\n\n#include \"OpenGL_convenience.h\"\n\nIGL_INLINE void igl::up_axis(double * x, double * y, double * z)\n{\n  double mv[16];\n  glGetDoublev(GL_MODELVIEW_MATRIX, mv);\n  igl::up_axis(mv,x,y,z);\n}\n\nIGL_INLINE void igl::up_axis(const double *mv, double * x, double * y, double * z)\n{\n  *x = -mv[0*4+1];\n  *y = -mv[1*4+1];\n  *z = -mv[2*4+1];\n}\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/up_axis.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_UP_AXIS_H\n#define IGL_UP_AXIS_H \n#include \"igl_inline.h\"\nnamespace igl\n{\n// Determines the up axis or depth axis of the current gl matrix\n// Outputs:\n//   x  pointer to x-coordinate in scene coordinates of the un-normalized\n//     up axis \n//   y  pointer to y-coordinate in scene coordinates of the un-normalized\n//     up axis \n//   z  pointer to z-coordinate in scene coordinates of the un-normalized\n//     up axis\n  //   mv pointer to modelview matrix\n//\n// Note: Up axis is returned *UN-normalized*\nIGL_INLINE void up_axis(double * x, double * y, double * z);\nIGL_INLINE void up_axis(const double * mv, double * x, double * y, double * z);\n};\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"up_axis.cpp\"\n#endif\n#endif\n\n\n"
  },
  {
    "path": "libs/libigl/include/igl/upsample.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"upsample.h\"\n\n#include \"triangle_triangle_adjacency.h\"\n\n\ntemplate <\n  typename DerivedF,\n  typename SType,\n  typename DerivedNF>\nIGL_INLINE void igl::upsample(\n  const int n_verts,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  Eigen::SparseMatrix<SType>& S,\n  Eigen::PlainObjectBase<DerivedNF>& NF)\n{\n  using namespace std;\n  using namespace Eigen;\n\n  typedef Eigen::Triplet<SType> Triplet_t;\n\n  Eigen::Matrix< typename DerivedF::Scalar,Eigen::Dynamic,Eigen::Dynamic>\n    FF,FFi;\n  triangle_triangle_adjacency(F,FF,FFi);\n\n  // TODO: Cache optimization missing from here, it is a mess\n\n  // Compute the number and positions of the vertices to insert (on edges)\n  Eigen::MatrixXi NI = Eigen::MatrixXi::Constant(FF.rows(),FF.cols(),-1);\n  Eigen::MatrixXi NIdoubles = Eigen::MatrixXi::Zero(FF.rows(), FF.cols());\n  int counter = 0;\n\n  for(int i=0;i<FF.rows();++i)\n  {\n    for(int j=0;j<3;++j)\n    {\n      if(NI(i,j) == -1)\n      {\n        NI(i,j) = counter;\n        NIdoubles(i,j) = 0;\n        if (FF(i,j) != -1) {\n          //If it is not a boundary\n          NI(FF(i,j), FFi(i,j)) = counter;\n          NIdoubles(i,j) = 1;\n        }\n        ++counter;\n      }\n    }\n  }\n\n  const int& n_odd = n_verts;\n  const int& n_even = counter;\n  const int n_newverts = n_odd + n_even;\n\n  //Construct vertex positions\n  std::vector<Triplet_t> tripletList;\n\n  // Fill the odd vertices position\n  for (int i=0; i<n_odd; ++i)\n  {\n    tripletList.emplace_back(i, i, 1.);\n  }\n\n  for(int i=0;i<FF.rows();++i)\n  {\n    for(int j=0;j<3;++j)\n    {\n      if(NIdoubles(i,j)==0) {\n        tripletList.emplace_back(NI(i,j) + n_odd, F(i,j), 1./2.);\n        tripletList.emplace_back(NI(i,j) + n_odd, F(i,(j+1)%3), 1./2.);\n      }\n    }\n  }\n  S.resize(n_newverts, n_verts);\n  S.setFromTriplets(tripletList.begin(), tripletList.end());\n\n  // Build the new topology (Every face is replaced by four)\n  NF.resize(F.rows()*4,3);\n  for(int i=0; i<F.rows();++i)\n  {\n    VectorXi VI(6);\n    VI << F(i,0), F(i,1), F(i,2), NI(i,0) + n_odd, NI(i,1) + n_odd, NI(i,2) + n_odd;\n\n    VectorXi f0(3), f1(3), f2(3), f3(3);\n    f0 << VI(0), VI(3), VI(5);\n    f1 << VI(1), VI(4), VI(3);\n    f2 << VI(3), VI(4), VI(5);\n    f3 << VI(4), VI(2), VI(5);\n\n    NF.row((i*4)+0) = f0;\n    NF.row((i*4)+1) = f1;\n    NF.row((i*4)+2) = f2;\n    NF.row((i*4)+3) = f3;\n  }\n}\n\ntemplate <\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedNV,\n  typename DerivedNF>\nIGL_INLINE void igl::upsample(\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  Eigen::PlainObjectBase<DerivedNV>& NV,\n  Eigen::PlainObjectBase<DerivedNF>& NF,\n  const int number_of_subdivs)\n{\n  NV = V;\n  NF = F;\n  for(int i=0; i<number_of_subdivs; ++i) \n  {\n    DerivedNF tempF = NF;\n    Eigen::SparseMatrix<typename DerivedV::Scalar >S;\n    upsample(NV.rows(), tempF, S, NF);\n    // This .eval is super important\n    NV = (S*NV).eval();\n  }\n}\n\ntemplate <\n  typename MatV,\n  typename MatF>\nIGL_INLINE void igl::upsample(\n  MatV& V,\n  MatF& F,\n  const int number_of_subdivs)\n{\n  const MatV V_copy = V;\n  const MatF F_copy = F;\n  return upsample(V_copy,F_copy,V,F,number_of_subdivs);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::upsample<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, int);\ntemplate void igl::upsample<Eigen::Matrix<int, -1, -1, 0, -1, -1>, double, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(int, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::SparseMatrix<double, 0, int>&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);\ntemplate void igl::upsample<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::Matrix<double, -1, -1, 0, -1, -1>&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&, int);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/upsample.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_UPSAMPLE_H\n#define IGL_UPSAMPLE_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Core>\n#include <Eigen/Sparse>\n\n// History:\n//  changed templates from generic matrices to PlainObjectBase Alec May 7, 2011\nnamespace igl\n{\n  // Subdivide without moving vertices: Given the triangle mesh [V, F],\n  // where n_verts = V.rows(), computes newV and a sparse matrix S s.t.\n  // [newV, newF] is the subdivided mesh where newV = S*V.\n  //\n  // Inputs:\n  //   n_verts  an integer (number of mesh vertices)\n  //   F  an m by 3 matrix of integers of triangle faces\n  // Outputs:\n  //   S  a sparse matrix (will become the subdivision matrix)\n  //   newF  a matrix containing the new faces\n  template <\n    typename DerivedF,\n    typename SType,\n    typename DerivedNF>\n  IGL_INLINE void upsample(\n    const int n_verts,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    Eigen::SparseMatrix<SType>& S,\n    Eigen::PlainObjectBase<DerivedNF>& NF);\n  // Subdivide a mesh without moving vertices: loop subdivision but odd\n  // vertices stay put and even vertices are just edge midpoints\n  // \n  // Templates:\n  //   MatV  matrix for vertex positions, e.g. MatrixXd\n  //   MatF  matrix for vertex positions, e.g. MatrixXi\n  // Inputs:\n  //   V  #V by dim  mesh vertices\n  //   F  #F by 3  mesh triangles\n  // Outputs:\n  //   NV new vertex positions, V is guaranteed to be at top\n  //   NF new list of face indices\n  //\n  // NOTE: V should not be the same as NV,\n  // NOTE: F should not be the same as NF, use other proto\n  //\n  // Known issues:\n  //   - assumes (V,F) is edge-manifold.\n  template <\n    typename DerivedV, \n    typename DerivedF,\n    typename DerivedNV,\n    typename DerivedNF>\n  IGL_INLINE void upsample(\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    Eigen::PlainObjectBase<DerivedNV>& NV,\n    Eigen::PlainObjectBase<DerivedNF>& NF,\n    const int number_of_subdivs = 1);\n\n  // Virtually in place wrapper\n  template <\n    typename MatV, \n    typename MatF>\n  IGL_INLINE void upsample(\n    MatV& V,\n    MatF& F,\n    const int number_of_subdivs = 1);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"upsample.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/vector_area_matrix.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"vector_area_matrix.h\"\n#include <vector>\n\n// Bug in unsupported/Eigen/SparseExtra needs iostream first\n#include <iostream>\n#include <unsupported/Eigen/SparseExtra>\n\n//#include <igl/boundary_loop.h>\n#include <igl/boundary_facets.h>\n\ntemplate <typename DerivedF, typename Scalar>\nIGL_INLINE void igl::vector_area_matrix(\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  Eigen::SparseMatrix<Scalar>& A)\n{\n  using namespace Eigen;\n  using namespace std;\n\n  // number of vertices\n  const int n = F.maxCoeff()+1;\n\n\tSparseMatrix<Scalar> aux (n * 2, n * 2);\n\tSparseMatrix<Scalar> auxT(n * 2, n * 2);\n\n\tvector<Triplet<Scalar> > auxTripletList;\n\tvector<Triplet<Scalar> > auxTTripletList;\n\n  MatrixXi E;\n  boundary_facets(F,E);\n\n\tfor(int k = 0; k < E.rows(); k++)\n  {\n\t\tint i = E(k,0);\n\t\tint j = E(k,1);\n\t\tauxTripletList.push_back(Triplet<Scalar>(i+n, j, -0.5));\n\t\tauxTripletList.push_back(Triplet<Scalar>(i, j+n, 0.5));\n\t\tauxTTripletList.push_back(Triplet<Scalar>(j, i+n, -0.5));\n\t\tauxTTripletList.push_back(Triplet<Scalar>(j+n, i, 0.5));\n\t}\n\n\taux.setFromTriplets(auxTripletList.begin(), auxTripletList.end());\n\tauxT.setFromTriplets(auxTTripletList.begin(), auxTTripletList.end());\n\tA = (aux + auxT)*0.5;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::vector_area_matrix<Eigen::Matrix<int, -1, -1, 0, -1, -1>, double>(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::SparseMatrix<double, 0, int>&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/vector_area_matrix.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_AREAMATRIX_H\n#define IGL_AREAMATRIX_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Dense>\n#include <Eigen/Sparse>\n\nnamespace igl\n{\n  // Constructs the symmetric area matrix A, s.t.  [V.col(0)' V.col(1)'] * A *\n  // [V.col(0); V.col(1)] is the **vector area** of the mesh (V,F).\n  //\n  // Templates:\n  //   DerivedV  derived type of eigen matrix for V (e.g. derived from\n  //     MatrixXd)\n  //   DerivedF  derived type of eigen matrix for F (e.g. derived from\n  //     MatrixXi)\n  //   Scalar  scalar type for eigen sparse matrix (e.g. double)\n  // Inputs:\n  //   F  #F by 3 list of mesh faces (must be triangles)\n  // Outputs:\n  //   A  #Vx2 by #Vx2 area matrix\n  //\n  template <typename DerivedF, typename Scalar>\n  IGL_INLINE void vector_area_matrix(\n    const Eigen::PlainObjectBase<DerivedF> & F,\n    Eigen::SparseMatrix<Scalar>& A);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"vector_area_matrix.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/verbose.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_VERBOSE_H\n#define IGL_VERBOSE_H\n\n// This function is only useful as a header-only inlined function\n\nnamespace igl\n{\n  // Provide a wrapper for printf, called verbose that functions exactly like\n  // printf if VERBOSE is defined and does exactly nothing if VERBOSE is\n  // undefined\n  inline int verbose(const char * msg,...);\n}\n\n\n\n#include <cstdio>\n#ifdef VERBOSE\n#  include <cstdarg>\n#endif\n\n#include <string>\n// http://channel9.msdn.com/forums/techoff/254707-wrapping-printf-in-c/\n#ifdef VERBOSE\ninline int igl::verbose(const char * msg,...)\n{\n  va_list argList;\n  va_start(argList, msg);\n  int count = vprintf(msg, argList);\n  va_end(argList);\n  return count;\n}\n#else\ninline int igl::verbose(const char * /*msg*/,...)\n{\n  return 0;\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/vertex_triangle_adjacency.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"vertex_triangle_adjacency.h\"\n\ntemplate <typename DerivedF, typename VFType, typename VFiType>\nIGL_INLINE void igl::vertex_triangle_adjacency(\n  const typename DerivedF::Scalar n,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  std::vector<std::vector<VFType> >& VF,\n  std::vector<std::vector<VFiType> >& VFi)\n{\n  VF.clear();\n  VFi.clear();\n\n  VF.resize(n);\n  VFi.resize(n);\n\n  typedef typename DerivedF::Index Index;\n  for(Index fi=0; fi<F.rows(); ++fi)\n  {\n    for(Index i = 0; i < F.cols(); ++i)\n    {\n      VF[F(fi,i)].push_back(fi);\n      VFi[F(fi,i)].push_back(i);\n    }\n  }\n}\n\n\ntemplate <typename DerivedV, typename DerivedF, typename IndexType>\nIGL_INLINE void igl::vertex_triangle_adjacency(\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  std::vector<std::vector<IndexType> >& VF,\n  std::vector<std::vector<IndexType> >& VFi)\n{\n  return vertex_triangle_adjacency(V.rows(),F,VF,VFi);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::vertex_triangle_adjacency<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, int>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&);\ntemplate void igl::vertex_triangle_adjacency<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1>, unsigned int>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1> > const&, std::vector<std::vector<unsigned int, std::allocator<unsigned int> >, std::allocator<std::vector<unsigned int, std::allocator<unsigned int> > > >&, std::vector<std::vector<unsigned int, std::allocator<unsigned int> >, std::allocator<std::vector<unsigned int, std::allocator<unsigned int> > > >&);\ntemplate void igl::vertex_triangle_adjacency<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, int>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&);\ntemplate void igl::vertex_triangle_adjacency<Eigen::Matrix<double, -1, -1, 0, -1, -1>, long, long>(Eigen::Matrix<double, -1, -1, 0, -1, -1>::Scalar, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > >&, std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > >&);\ntemplate void igl::vertex_triangle_adjacency<Eigen::Matrix<int, -1, -1, 0, -1, -1>, long, long>(Eigen::Matrix<int, -1, -1, 0, -1, -1>::Scalar, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > >&, std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > >&);\ntemplate void igl::vertex_triangle_adjacency<Eigen::Matrix<int, -1, -1, 0, -1, -1>, unsigned long, unsigned long>(Eigen::Matrix<int, -1, -1, 0, -1, -1>::Scalar, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<std::vector<unsigned long, std::allocator<unsigned long> >, std::allocator<std::vector<unsigned long, std::allocator<unsigned long> > > >&, std::vector<std::vector<unsigned long, std::allocator<unsigned long> >, std::allocator<std::vector<unsigned long, std::allocator<unsigned long> > > >&);\ntemplate void igl::vertex_triangle_adjacency<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, int>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/vertex_triangle_adjacency.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_VERTEX_TRIANGLE_ADJACENCY_H\n#define IGL_VERTEX_TRIANGLE_ADJACENCY_H\n#include <igl/igl_inline.h>\n\n#include <Eigen/Dense>\n#include <vector>\n\nnamespace igl\n{\n  // vertex_face_adjacency constructs the vertex-face topology of a given mesh (V,F)\n  //\n  // Inputs:\n  //   //V  #V by 3 list of vertex coordinates\n  //   n  number of vertices #V (e.g. `F.maxCoeff()+1` or `V.rows()`)\n  //   F  #F by dim list of mesh faces (must be triangles)\n  // Outputs:\n  //   VF  #V list of lists of incident faces (adjacency list)\n  //   VI  #V list of lists of index of incidence within incident faces listed\n  //     in VF\n  //\n  // See also: edges, cotmatrix, diag, vv\n  //\n  // Known bugs: this should not take V as an input parameter.\n  // Known bugs/features: if a facet is combinatorially degenerate then faces\n  // will appear multiple times in VF and correpondingly in VFI (j appears\n  // twice in F.row(i) then i will appear twice in VF[j])\n  template <typename DerivedF, typename VFType, typename VFiType>\n  IGL_INLINE void vertex_triangle_adjacency(\n    const typename DerivedF::Scalar n,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    std::vector<std::vector<VFType> >& VF,\n    std::vector<std::vector<VFiType> >& VFi);\n  template <typename DerivedV, typename DerivedF, typename IndexType>\n  IGL_INLINE void vertex_triangle_adjacency(\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    std::vector<std::vector<IndexType> >& VF,\n    std::vector<std::vector<IndexType> >& VFi);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"vertex_triangle_adjacency.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/view_axis.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"view_axis.h\"\n#ifndef IGL_NO_OPENGL\n\n#include \"OpenGL_convenience.h\"\n\nIGL_INLINE void igl::view_axis(double * x, double * y, double * z)\n{\n  double mv[16];\n  glGetDoublev(GL_MODELVIEW_MATRIX, mv);\n  igl::view_axis(mv,x,y,z);\n}\n\nIGL_INLINE void igl::view_axis(const double * mv, double * x, double * y, double * z)\n{\n  *x = -mv[0*4+2];\n  *y = -mv[1*4+2];\n  *z = -mv[2*4+2];\n}\n\ntemplate <typename DerivedV>\nIGL_INLINE void igl::view_axis(Eigen::PlainObjectBase<DerivedV> & V)\n{\n  double x,y,z;\n  view_axis(&x,&y,&z);\n  V(0) = x;\n  V(1) = y;\n  V(2) = z;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instanciation\ntemplate void igl::view_axis<Eigen::Matrix<double, 3, 1, 0, 3, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 1, 0, 3, 1> >&);\ntemplate void igl::view_axis<Eigen::Matrix<double, 1, 3, 1, 1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> >&);\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/view_axis.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_VIEW_AXIS_H\n#define IGL_VIEW_AXIS_H \n#include \"igl_inline.h\"\n#include <Eigen/Core>\n\nnamespace igl\n{\n  // Determines the view axis or depth axis of the current gl matrix\n  // Inputs:\n  //   mv pointer to modelview matrix\n  // Outputs:\n  //   x  pointer to x-coordinate in scene coordinates of the un-normalized\n  //     viewing axis \n  //   y  pointer to y-coordinate in scene coordinates of the un-normalized\n  //     viewing axis \n  //   z  pointer to z-coordinate in scene coordinates of the un-normalized\n  //     viewing axis\n  //\n  // Note: View axis is returned *UN-normalized*\n  IGL_INLINE void view_axis(const double * mv, double * x, double * y, double * z);\n  // Extract mv from current GL state.\n  IGL_INLINE void view_axis(double * x, double * y, double * z);\n  template <typename DerivedV>\n  IGL_INLINE void view_axis(Eigen::PlainObjectBase<DerivedV> & V);\n};\n\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"view_axis.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/viewer/OpenGL_shader.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Wenzel Jacob <wenzel@inf.ethz.ch>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"OpenGL_shader.h\"\n\n#include <iostream>\n#include <fstream>\n\nIGL_INLINE bool igl::viewer::OpenGL_shader::init_from_files(\n  const std::string &vertex_shader_filename,\n  const std::string &fragment_shader_filename,\n  const std::string &fragment_data_name,\n  const std::string &geometry_shader_filename,\n  int geometry_shader_max_vertices)\n{\n  auto file_to_string = [](const std::string &filename)->std::string\n  {\n    std::ifstream t(filename);\n    return std::string((std::istreambuf_iterator<char>(t)),\n                        std::istreambuf_iterator<char>());\n  };\n\n  return init(\n    file_to_string(vertex_shader_filename),\n    file_to_string(fragment_shader_filename),\n    fragment_data_name,\n    file_to_string(geometry_shader_filename),\n    geometry_shader_max_vertices\n );\n}\n\nIGL_INLINE bool igl::viewer::OpenGL_shader::init(\n  const std::string &vertex_shader_string,\n  const std::string &fragment_shader_string,\n  const std::string &fragment_data_name,\n  const std::string &geometry_shader_string,\n  int geometry_shader_max_vertices)\n{\n  using namespace std;\n  vertex_shader = create_shader_helper(GL_VERTEX_SHADER, vertex_shader_string);\n  geometry_shader = create_shader_helper(GL_GEOMETRY_SHADER, geometry_shader_string);\n  fragment_shader = create_shader_helper(GL_FRAGMENT_SHADER, fragment_shader_string);\n\n  if (!vertex_shader || !fragment_shader)\n    return false;\n\n  program_shader = glCreateProgram();\n\n  glAttachShader(program_shader, vertex_shader);\n  glAttachShader(program_shader, fragment_shader);\n\n  if (geometry_shader)\n  {\n    glAttachShader(program_shader, geometry_shader);\n\n    /* This covers only basic cases and may need to be modified */\n    glProgramParameteri(program_shader, GL_GEOMETRY_INPUT_TYPE, GL_TRIANGLES);\n    glProgramParameteri(program_shader, GL_GEOMETRY_OUTPUT_TYPE, GL_TRIANGLES);\n    glProgramParameteri(program_shader, GL_GEOMETRY_VERTICES_OUT, geometry_shader_max_vertices);\n  }\n\n  glBindFragDataLocation(program_shader, 0, fragment_data_name.c_str());\n  glLinkProgram(program_shader);\n\n  GLint status;\n  glGetProgramiv(program_shader, GL_LINK_STATUS, &status);\n\n  if (status != GL_TRUE)\n  {\n    char buffer[512];\n    glGetProgramInfoLog(program_shader, 512, NULL, buffer);\n    cerr << \"Linker error: \" << endl << buffer << endl;\n    program_shader = 0;\n    return false;\n  }\n\n  return true;\n}\n\nIGL_INLINE void igl::viewer::OpenGL_shader::bind()\n{\n  glUseProgram(program_shader);\n}\n\nIGL_INLINE GLint igl::viewer::OpenGL_shader::attrib(const std::string &name) const\n{\n  return glGetAttribLocation(program_shader, name.c_str());\n}\n\nIGL_INLINE GLint igl::viewer::OpenGL_shader::uniform(const std::string &name) const\n{\n  return glGetUniformLocation(program_shader, name.c_str());\n}\n\nIGL_INLINE GLint igl::viewer::OpenGL_shader::bindVertexAttribArray(\n  const std::string &name, GLuint bufferID, const Eigen::MatrixXf &M, bool refresh) const\n{\n  GLint id = attrib(name);\n  if (id < 0)\n    return id;\n  if (M.size() == 0)\n  {\n    glDisableVertexAttribArray(id);\n    return id;\n  }\n  glBindBuffer(GL_ARRAY_BUFFER, bufferID);\n  if (refresh)\n    glBufferData(GL_ARRAY_BUFFER, sizeof(float)*M.size(), M.data(), GL_DYNAMIC_DRAW);\n  glVertexAttribPointer(id, M.rows(), GL_FLOAT, GL_FALSE, 0, 0);\n  glEnableVertexAttribArray(id);\n  return id;\n}\n\nIGL_INLINE void igl::viewer::OpenGL_shader::free()\n{\n  if (program_shader)\n  {\n    glDeleteProgram(program_shader);\n    program_shader = 0;\n  }\n  if (vertex_shader)\n  {\n    glDeleteShader(vertex_shader);\n    vertex_shader = 0;\n  }\n  if (fragment_shader)\n  {\n    glDeleteShader(fragment_shader);\n    fragment_shader = 0;\n  }\n  if (geometry_shader)\n  {\n    glDeleteShader(geometry_shader);\n    geometry_shader = 0;\n  }\n}\n\nIGL_INLINE GLuint igl::viewer::OpenGL_shader::create_shader_helper(GLint type, const std::string &shader_string)\n{\n  using namespace std;\n  if (shader_string.empty())\n    return (GLuint) 0;\n\n  GLuint id = glCreateShader(type);\n  const char *shader_string_const = shader_string.c_str();\n  glShaderSource(id, 1, &shader_string_const, NULL);\n  glCompileShader(id);\n\n  GLint status;\n  glGetShaderiv(id, GL_COMPILE_STATUS, &status);\n\n  if (status != GL_TRUE)\n  {\n    char buffer[512];\n    if (type == GL_VERTEX_SHADER)\n      cerr << \"Vertex shader:\" << endl;\n    else if (type == GL_FRAGMENT_SHADER)\n      cerr << \"Fragment shader:\" << endl;\n    else if (type == GL_GEOMETRY_SHADER)\n      cerr << \"Geometry shader:\" << endl;\n    cerr << shader_string << endl << endl;\n    glGetShaderInfoLog(id, 512, NULL, buffer);\n    cerr << \"Error: \" << endl << buffer << endl;\n    return (GLuint) 0;\n  }\n\n  return id;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/viewer/OpenGL_shader.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Wenzel Jacob <wenzel@inf.ethz.ch>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_VIEWER_OPENGL_SHADER_H\n#define IGL_VIEWER_OPENGL_SHADER_H\n\n#include <igl/igl_inline.h>\n#include <string>\n#include <Eigen/Core>\n\n#ifdef _WIN32\n#  include <windows.h>\n#  undef max\n#  undef min\n#  undef DrawText\n#endif\n\n#ifndef __APPLE__\n#  define GLEW_STATIC\n#  include <GL/glew.h>\n#endif\n\n#ifdef __APPLE__\n#   include <OpenGL/gl3.h>\n#   define __gl_h_ /* Prevent inclusion of the old gl.h */\n#else\n#   include <GL/gl.h>\n#endif\n\nnamespace igl\n{\nnamespace viewer\n{\n\n// This class wraps an OpenGL program composed of three shaders\n// TODO: write documentation\n\nclass OpenGL_shader\n{\npublic:\n  typedef unsigned int GLuint;\n  typedef int GLint;\n\n  GLuint vertex_shader;\n  GLuint fragment_shader;\n  GLuint geometry_shader;\n  GLuint program_shader;\n\n  IGL_INLINE OpenGL_shader() : vertex_shader(0), fragment_shader(0),\n    geometry_shader(0), program_shader(0) { }\n\n  // Create a new shader from the specified source strings\n  IGL_INLINE bool init(const std::string &vertex_shader_string,\n    const std::string &fragment_shader_string,\n    const std::string &fragment_data_name,\n    const std::string &geometry_shader_string = \"\",\n    int geometry_shader_max_vertices = 3);\n\n  // Create a new shader from the specified files on disk\n  IGL_INLINE bool init_from_files(const std::string &vertex_shader_filename,\n    const std::string &fragment_shader_filename,\n    const std::string &fragment_data_name,\n    const std::string &geometry_shader_filename = \"\",\n    int geometry_shader_max_vertices = 3);\n\n  // Select this shader for subsequent draw calls\n  IGL_INLINE void bind();\n\n  // Release all OpenGL objects\n  IGL_INLINE void free();\n\n  // Return the OpenGL handle of a named shader attribute (-1 if it does not exist)\n  IGL_INLINE GLint attrib(const std::string &name) const;\n\n  // Return the OpenGL handle of a uniform attribute (-1 if it does not exist)\n  IGL_INLINE GLint uniform(const std::string &name) const;\n\n  // Bind a per-vertex array attribute and refresh its contents from an Eigen amtrix\n  IGL_INLINE GLint bindVertexAttribArray(const std::string &name, GLuint bufferID,\n    const Eigen::MatrixXf &M, bool refresh) const;\n\n  IGL_INLINE GLuint create_shader_helper(GLint type, const std::string &shader_string);\n\n};\n\n}\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"OpenGL_shader.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/viewer/OpenGL_state.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"OpenGL_state.h\"\n#include \"ViewerData.h\"\n\nIGL_INLINE void igl::viewer::OpenGL_state::init_buffers()\n{\n  // Mesh: Vertex Array Object & Buffer objects\n  glGenVertexArrays(1, &vao_mesh);\n  glBindVertexArray(vao_mesh);\n  glGenBuffers(1, &vbo_V);\n  glGenBuffers(1, &vbo_V_normals);\n  glGenBuffers(1, &vbo_V_ambient);\n  glGenBuffers(1, &vbo_V_diffuse);\n  glGenBuffers(1, &vbo_V_specular);\n  glGenBuffers(1, &vbo_V_uv);\n  glGenBuffers(1, &vbo_F);\n  glGenTextures(1, &vbo_tex);\n\n  // Line overlay\n  glGenVertexArrays(1, &vao_overlay_lines);\n  glBindVertexArray(vao_overlay_lines);\n  glGenBuffers(1, &vbo_lines_F);\n  glGenBuffers(1, &vbo_lines_V);\n  glGenBuffers(1, &vbo_lines_V_colors);\n\n  // Point overlay\n  glGenVertexArrays(1, &vao_overlay_points);\n  glBindVertexArray(vao_overlay_points);\n  glGenBuffers(1, &vbo_points_F);\n  glGenBuffers(1, &vbo_points_V);\n  glGenBuffers(1, &vbo_points_V_colors);\n\n  dirty = ViewerData::DIRTY_ALL;\n}\n\nIGL_INLINE void igl::viewer::OpenGL_state::free_buffers()\n{\n  glDeleteVertexArrays(1, &vao_mesh);\n  glDeleteVertexArrays(1, &vao_overlay_lines);\n  glDeleteVertexArrays(1, &vao_overlay_points);\n\n  glDeleteBuffers(1, &vbo_V);\n  glDeleteBuffers(1, &vbo_V_normals);\n  glDeleteBuffers(1, &vbo_V_ambient);\n  glDeleteBuffers(1, &vbo_V_diffuse);\n  glDeleteBuffers(1, &vbo_V_specular);\n  glDeleteBuffers(1, &vbo_V_uv);\n  glDeleteBuffers(1, &vbo_F);\n  glDeleteBuffers(1, &vbo_lines_F);\n  glDeleteBuffers(1, &vbo_lines_V);\n  glDeleteBuffers(1, &vbo_lines_V_colors);\n  glDeleteBuffers(1, &vbo_points_F);\n  glDeleteBuffers(1, &vbo_points_V);\n  glDeleteBuffers(1, &vbo_points_V_colors);\n\n  glDeleteTextures(1, &vbo_tex);\n}\n\nIGL_INLINE void igl::viewer::OpenGL_state::set_data(const igl::viewer::ViewerData &data, bool invert_normals)\n{\n  bool per_corner_uv = (data.F_uv.rows() == data.F.rows());\n  bool per_corner_normals = (data.F_normals.rows() == 3 * data.F.rows());\n\n  dirty |= data.dirty;\n\n  if (!data.face_based)\n  {\n    if (!per_corner_uv)\n    {\n      // Vertex positions\n      if (dirty & ViewerData::DIRTY_POSITION)\n        V_vbo = (data.V.transpose()).cast<float>();\n\n      // Vertex normals\n      if (dirty & ViewerData::DIRTY_NORMAL)\n      {\n        V_normals_vbo = (data.V_normals.transpose()).cast<float>();\n        if (invert_normals)\n          V_normals_vbo = -V_normals_vbo;\n      }\n\n      // Per-vertex material settings\n      if (dirty & ViewerData::DIRTY_AMBIENT)\n        V_ambient_vbo = (data.V_material_ambient.transpose()).cast<float>();\n      if (dirty & ViewerData::DIRTY_DIFFUSE)\n        V_diffuse_vbo = (data.V_material_diffuse.transpose()).cast<float>();\n      if (dirty & ViewerData::DIRTY_SPECULAR)\n        V_specular_vbo = (data.V_material_specular.transpose()).cast<float>();\n\n      // Face indices\n      if (dirty & ViewerData::DIRTY_FACE)\n        F_vbo = (data.F.transpose()).cast<unsigned>();\n\n      // Texture coordinates\n      if (dirty & ViewerData::DIRTY_UV)\n        V_uv_vbo = (data.V_uv.transpose()).cast<float>();\n    }\n    else\n    {\n      // Per vertex properties with per corner UVs\n      if (dirty & ViewerData::DIRTY_POSITION)\n      {\n        V_vbo.resize(3,data.F.rows()*3);\n        for (unsigned i=0; i<data.F.rows();++i)\n          for (unsigned j=0;j<3;++j)\n            V_vbo.col(i*3+j) = data.V.row(data.F(i,j)).transpose().cast<float>();\n      }\n\n      if (dirty & ViewerData::DIRTY_AMBIENT)\n      {\n        V_ambient_vbo.resize(3,data.F.rows()*3);\n        for (unsigned i=0; i<data.F.rows();++i)\n          for (unsigned j=0;j<3;++j)\n            V_ambient_vbo.col (i*3+j) = data.V_material_ambient.row(data.F(i,j)).transpose().cast<float>();\n      }\n\n      if (dirty & ViewerData::DIRTY_DIFFUSE)\n      {\n        V_diffuse_vbo.resize(3,data.F.rows()*3);\n        for (unsigned i=0; i<data.F.rows();++i)\n          for (unsigned j=0;j<3;++j)\n            V_diffuse_vbo.col (i*3+j) = data.V_material_diffuse.row(data.F(i,j)).transpose().cast<float>();\n      }\n\n      if (dirty & ViewerData::DIRTY_SPECULAR)\n      {\n        V_specular_vbo.resize(3,data.F.rows()*3);\n        for (unsigned i=0; i<data.F.rows();++i)\n          for (unsigned j=0;j<3;++j)\n            V_specular_vbo.col(i*3+j) = data.V_material_specular.row(data.F(i,j)).transpose().cast<float>();\n      }\n\n      if (dirty & ViewerData::DIRTY_NORMAL)\n      {\n        V_normals_vbo.resize(3,data.F.rows()*3);\n        for (unsigned i=0; i<data.F.rows();++i)\n          for (unsigned j=0;j<3;++j)\n            V_normals_vbo.col (i*3+j) = data.V_normals.row(data.F(i,j)).transpose().cast<float>();\n\n        if (invert_normals)\n          V_normals_vbo = -V_normals_vbo;\n      }\n\n      if (dirty & ViewerData::DIRTY_FACE)\n      {\n        F_vbo.resize(3,data.F.rows());\n        for (unsigned i=0; i<data.F.rows();++i)\n          F_vbo.col(i) << i*3+0, i*3+1, i*3+2;\n      }\n\n      if (dirty & ViewerData::DIRTY_UV)\n      {\n        V_uv_vbo.resize(2,data.F.rows()*3);\n        for (unsigned i=0; i<data.F.rows();++i)\n          for (unsigned j=0;j<3;++j)\n            V_uv_vbo.col(i*3+j) = data.V_uv.row(data.F(i,j)).transpose().cast<float>();\n      }\n    }\n  }\n  else\n  {\n    if (dirty & ViewerData::DIRTY_POSITION)\n    {\n      V_vbo.resize(3,data.F.rows()*3);\n      for (unsigned i=0; i<data.F.rows();++i)\n        for (unsigned j=0;j<3;++j)\n          V_vbo.col(i*3+j) = data.V.row(data.F(i,j)).transpose().cast<float>();\n    }\n\n    if (dirty & ViewerData::DIRTY_AMBIENT)\n    {\n      V_ambient_vbo.resize(3,data.F.rows()*3);\n      for (unsigned i=0; i<data.F.rows();++i)\n        for (unsigned j=0;j<3;++j)\n          V_ambient_vbo.col (i*3+j) = data.F_material_ambient.row(i).transpose().cast<float>();\n    }\n\n    if (dirty & ViewerData::DIRTY_DIFFUSE)\n    {\n      V_diffuse_vbo.resize(3,data.F.rows()*3);\n      for (unsigned i=0; i<data.F.rows();++i)\n        for (unsigned j=0;j<3;++j)\n          V_diffuse_vbo.col (i*3+j) = data.F_material_diffuse.row(i).transpose().cast<float>();\n    }\n\n    if (dirty & ViewerData::DIRTY_SPECULAR)\n    {\n      V_specular_vbo.resize(3,data.F.rows()*3);\n      for (unsigned i=0; i<data.F.rows();++i)\n        for (unsigned j=0;j<3;++j)\n          V_specular_vbo.col(i*3+j) = data.F_material_specular.row(i).transpose().cast<float>();\n    }\n\n    if (dirty & ViewerData::DIRTY_NORMAL)\n    {\n      V_normals_vbo.resize(3,data.F.rows()*3);\n      for (unsigned i=0; i<data.F.rows();++i)\n        for (unsigned j=0;j<3;++j)\n          V_normals_vbo.col (i*3+j) =\n             per_corner_normals ?\n               data.F_normals.row(i*3+j).transpose().cast<float>() :\n               data.F_normals.row(i).transpose().cast<float>();\n\n      if (invert_normals)\n        V_normals_vbo = -V_normals_vbo;\n    }\n\n    if (dirty & ViewerData::DIRTY_FACE)\n    {\n      F_vbo.resize(3,data.F.rows());\n      for (unsigned i=0; i<data.F.rows();++i)\n        F_vbo.col(i) << i*3+0, i*3+1, i*3+2;\n    }\n\n    if (dirty & ViewerData::DIRTY_UV)\n    {\n        V_uv_vbo.resize(2,data.F.rows()*3);\n        for (unsigned i=0; i<data.F.rows();++i)\n          for (unsigned j=0;j<3;++j)\n            V_uv_vbo.col(i*3+j) = data.V_uv.row(per_corner_uv ? data.F_uv(i,j) : data.F(i,j)).transpose().cast<float>();\n    }\n  }\n\n  if (dirty & ViewerData::DIRTY_TEXTURE)\n  {\n    tex_u = data.texture_R.rows();\n    tex_v = data.texture_R.cols();\n    tex.resize(data.texture_R.size()*3);\n    for (unsigned i=0;i<data.texture_R.size();++i)\n    {\n      tex(i*3+0) = data.texture_R(i);\n      tex(i*3+1) = data.texture_G(i);\n      tex(i*3+2) = data.texture_B(i);\n    }\n  }\n\n  if (dirty & ViewerData::DIRTY_OVERLAY_LINES)\n  {\n    lines_V_vbo.resize(3, data.lines.rows()*2);\n    lines_V_colors_vbo.resize(3, data.lines.rows()*2);\n    lines_F_vbo.resize(1, data.lines.rows()*2);\n    for (unsigned i=0; i<data.lines.rows();++i)\n    {\n      lines_V_vbo.col(2*i+0) = data.lines.block<1, 3>(i, 0).transpose().cast<float>();\n      lines_V_vbo.col(2*i+1) = data.lines.block<1, 3>(i, 3).transpose().cast<float>();\n      lines_V_colors_vbo.col(2*i+0) = data.lines.block<1, 3>(i, 6).transpose().cast<float>();\n      lines_V_colors_vbo.col(2*i+1) = data.lines.block<1, 3>(i, 6).transpose().cast<float>();\n      lines_F_vbo(2*i+0) = 2*i+0;\n      lines_F_vbo(2*i+1) = 2*i+1;\n    }\n  }\n\n  if (dirty & ViewerData::DIRTY_OVERLAY_POINTS)\n  {\n    points_V_vbo.resize(3, data.points.rows());\n    points_V_colors_vbo.resize(3, data.points.rows());\n    points_F_vbo.resize(1, data.points.rows());\n    for (unsigned i=0; i<data.points.rows();++i)\n    {\n      points_V_vbo.col(i) = data.points.block<1, 3>(i, 0).transpose().cast<float>();\n      points_V_colors_vbo.col(i) = data.points.block<1, 3>(i, 3).transpose().cast<float>();\n      points_F_vbo(i) = i;\n    }\n  }\n}\n\nIGL_INLINE void igl::viewer::OpenGL_state::bind_mesh()\n{\n  glBindVertexArray(vao_mesh);\n  shader_mesh.bind();\n  shader_mesh.bindVertexAttribArray(\"position\", vbo_V, V_vbo, dirty & ViewerData::DIRTY_POSITION);\n  shader_mesh.bindVertexAttribArray(\"normal\", vbo_V_normals, V_normals_vbo, dirty & ViewerData::DIRTY_NORMAL);\n  shader_mesh.bindVertexAttribArray(\"Ka\", vbo_V_ambient, V_ambient_vbo, dirty & ViewerData::DIRTY_AMBIENT);\n  shader_mesh.bindVertexAttribArray(\"Kd\", vbo_V_diffuse, V_diffuse_vbo, dirty & ViewerData::DIRTY_DIFFUSE);\n  shader_mesh.bindVertexAttribArray(\"Ks\", vbo_V_specular, V_specular_vbo, dirty & ViewerData::DIRTY_SPECULAR);\n  shader_mesh.bindVertexAttribArray(\"texcoord\", vbo_V_uv, V_uv_vbo, dirty & ViewerData::DIRTY_UV);\n\n  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo_F);\n  if (dirty & ViewerData::DIRTY_FACE)\n    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned)*F_vbo.size(), F_vbo.data(), GL_DYNAMIC_DRAW);\n\n  glActiveTexture(GL_TEXTURE0);\n  glBindTexture(GL_TEXTURE_2D, vbo_tex);\n  if (dirty & ViewerData::DIRTY_TEXTURE)\n  {\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);\n    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tex_u, tex_v, 0, GL_RGB, GL_UNSIGNED_BYTE, tex.data());\n  }\n  glUniform1i(shader_mesh.uniform(\"tex\"), 0);\n  dirty &= ~ViewerData::DIRTY_MESH;\n}\n\nIGL_INLINE void igl::viewer::OpenGL_state::bind_overlay_lines()\n{\n  bool is_dirty = dirty & ViewerData::DIRTY_OVERLAY_LINES;\n\n  glBindVertexArray(vao_overlay_lines);\n  shader_overlay_lines.bind();\n  shader_overlay_lines.bindVertexAttribArray(\"position\", vbo_lines_V, lines_V_vbo, is_dirty);\n  shader_overlay_lines.bindVertexAttribArray(\"color\", vbo_lines_V_colors, lines_V_colors_vbo, is_dirty);\n\n  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo_lines_F);\n  if (is_dirty)\n    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned)*lines_F_vbo.size(), lines_F_vbo.data(), GL_DYNAMIC_DRAW);\n\n  dirty &= ~ViewerData::DIRTY_OVERLAY_LINES;\n}\n\nIGL_INLINE void igl::viewer::OpenGL_state::bind_overlay_points()\n{\n  bool is_dirty = dirty & ViewerData::DIRTY_OVERLAY_POINTS;\n\n  glBindVertexArray(vao_overlay_points);\n  shader_overlay_points.bind();\n  shader_overlay_points.bindVertexAttribArray(\"position\", vbo_points_V, points_V_vbo, is_dirty);\n  shader_overlay_points.bindVertexAttribArray(\"color\", vbo_points_V_colors, points_V_colors_vbo, is_dirty);\n\n  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo_points_F);\n  if (is_dirty)\n    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned)*points_F_vbo.size(), points_F_vbo.data(), GL_DYNAMIC_DRAW);\n\n  dirty &= ~ViewerData::DIRTY_OVERLAY_POINTS;\n}\n\nIGL_INLINE void igl::viewer::OpenGL_state::draw_mesh(bool solid)\n{\n  glPolygonMode(GL_FRONT_AND_BACK, solid ? GL_FILL : GL_LINE);\n\n  /* Avoid Z-buffer fighting between filled triangles & wireframe lines */\n  if (solid)\n  {\n    glEnable(GL_POLYGON_OFFSET_FILL);\n    glPolygonOffset(1.0, 1.0);\n  }\n  glDrawElements(GL_TRIANGLES, 3*F_vbo.cols(), GL_UNSIGNED_INT, 0);\n\n  glDisable(GL_POLYGON_OFFSET_FILL);\n  glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\n}\n\nIGL_INLINE void igl::viewer::OpenGL_state::draw_overlay_lines()\n{\n  glDrawElements(GL_LINES, lines_F_vbo.cols(), GL_UNSIGNED_INT, 0);\n}\n\nIGL_INLINE void igl::viewer::OpenGL_state::draw_overlay_points()\n{\n  glDrawElements(GL_POINTS, points_F_vbo.cols(), GL_UNSIGNED_INT, 0);\n}\n\nIGL_INLINE void igl::viewer::OpenGL_state::init()\n{\n  std::string mesh_vertex_shader_string =\n  \"#version 150\\n\"\n  \"uniform mat4 model;\"\n  \"uniform mat4 view;\"\n  \"uniform mat4 proj;\"\n  \"in vec3 position;\"\n  \"in vec3 normal;\"\n  \"out vec3 position_eye;\"\n  \"out vec3 normal_eye;\"\n  \"in vec3 Ka;\"\n  \"in vec3 Kd;\"\n  \"in vec3 Ks;\"\n  \"in vec2 texcoord;\"\n  \"out vec2 texcoordi;\"\n  \"out vec3 Kai;\"\n  \"out vec3 Kdi;\"\n  \"out vec3 Ksi;\"\n\n  \"void main()\"\n  \"{\"\n  \"  position_eye = vec3 (view * model * vec4 (position, 1.0));\"\n  \"  normal_eye = vec3 (view * model * vec4 (normal, 0.0));\"\n  \"  normal_eye = normalize(normal_eye);\"\n  \"  gl_Position = proj * vec4 (position_eye, 1.0);\" //proj * view * model * vec4(position, 1.0);\"\n  \"  Kai = Ka;\"\n  \"  Kdi = Kd;\"\n  \"  Ksi = Ks;\"\n  \"  texcoordi = texcoord;\"\n  \"}\";\n\n  std::string mesh_fragment_shader_string =\n  \"#version 150\\n\"\n  \"uniform mat4 model;\"\n  \"uniform mat4 view;\"\n  \"uniform mat4 proj;\"\n  \"uniform vec4 fixed_color;\"\n  \"in vec3 position_eye;\"\n  \"in vec3 normal_eye;\"\n  \"uniform vec3 light_position_world;\"\n  \"vec3 Ls = vec3 (1, 1, 1);\"\n  \"vec3 Ld = vec3 (1, 1, 1);\"\n  \"vec3 La = vec3 (1, 1, 1);\"\n  \"in vec3 Ksi;\"\n  \"in vec3 Kdi;\"\n  \"in vec3 Kai;\"\n  \"in vec2 texcoordi;\"\n  \"uniform sampler2D tex;\"\n  \"uniform float specular_exponent;\"\n  \"uniform float lighting_factor;\"\n  \"uniform float texture_factor;\"\n  \"out vec4 outColor;\"\n  \"void main()\"\n  \"{\"\n  \"vec3 Ia = La * Kai;\"    // ambient intensity\n\n  \"vec3 light_position_eye = vec3 (view * vec4 (light_position_world, 1.0));\"\n  \"vec3 vector_to_light_eye = light_position_eye - position_eye;\"\n  \"vec3 direction_to_light_eye = normalize (vector_to_light_eye);\"\n  \"float dot_prod = dot (direction_to_light_eye, normal_eye);\"\n  \"float clamped_dot_prod = max (dot_prod, 0.0);\"\n  \"vec3 Id = Ld * Kdi * clamped_dot_prod;\"    // Diffuse intensity\n\n  \"vec3 reflection_eye = reflect (-direction_to_light_eye, normal_eye);\"\n  \"vec3 surface_to_viewer_eye = normalize (-position_eye);\"\n  \"float dot_prod_specular = dot (reflection_eye, surface_to_viewer_eye);\"\n  \"dot_prod_specular = float(abs(dot_prod)==dot_prod) * max (dot_prod_specular, 0.0);\"\n  \"float specular_factor = pow (dot_prod_specular, specular_exponent);\"\n  \"vec3 Is = Ls * Ksi * specular_factor;\"    // specular intensity\n  \"vec4 color = vec4(lighting_factor * (Is + Id) + Ia, 1.0) + vec4((1.0-lighting_factor) * Kdi,1.0);\"\n  \"outColor = mix(vec4(1,1,1,1), texture(tex, texcoordi), texture_factor) * color;\"\n  \"if (fixed_color != vec4(0.0)) outColor = fixed_color;\"\n  \"}\";\n\n  std::string overlay_vertex_shader_string =\n  \"#version 150\\n\"\n  \"uniform mat4 model;\"\n  \"uniform mat4 view;\"\n  \"uniform mat4 proj;\"\n  \"in vec3 position;\"\n  \"in vec3 color;\"\n  \"out vec3 color_frag;\"\n\n  \"void main()\"\n  \"{\"\n  \"  gl_Position = proj * view * model * vec4 (position, 1.0);\"\n  \"  color_frag = color;\"\n  \"}\";\n\n  std::string overlay_fragment_shader_string =\n  \"#version 150\\n\"\n  \"in vec3 color_frag;\"\n  \"out vec4 outColor;\"\n  \"void main()\"\n  \"{\"\n  \"  outColor = vec4(color_frag, 1.0);\"\n  \"}\";\n\n  std::string overlay_point_fragment_shader_string =\n  \"#version 150\\n\"\n  \"in vec3 color_frag;\"\n  \"out vec4 outColor;\"\n  \"void main()\"\n  \"{\"\n  \"  if (length(gl_PointCoord - vec2(0.5)) > 0.5)\"\n  \"    discard;\"\n  \"  outColor = vec4(color_frag, 1.0);\"\n  \"}\";\n\n  init_buffers();\n  shader_mesh.init(mesh_vertex_shader_string,\n      mesh_fragment_shader_string, \"outColor\");\n  shader_overlay_lines.init(overlay_vertex_shader_string,\n      overlay_fragment_shader_string, \"outColor\");\n  shader_overlay_points.init(overlay_vertex_shader_string,\n      overlay_point_fragment_shader_string, \"outColor\");\n}\n\nIGL_INLINE void igl::viewer::OpenGL_state::free()\n{\n  shader_mesh.free();\n  shader_overlay_lines.free();\n  shader_overlay_points.free();\n  free_buffers();\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/viewer/OpenGL_state.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_VIEWER_OPENGL_STATE_H\n#define IGL_VIEWER_OPENGL_STATE_H\n\n// Coverts mesh data inside a igl::viewer::ViewerData class in an OpenGL compatible format\n// The class includes a shader and the opengl calls to plot the data\n\n#include <igl/igl_inline.h>\n#include <igl/viewer/OpenGL_shader.h>\n#include <igl/viewer/ViewerData.h>\n\nnamespace igl\n{\nnamespace viewer\n{\n\nclass OpenGL_state\n{\npublic:\n  typedef unsigned int GLuint;\n\n  GLuint vao_mesh;\n  GLuint vao_overlay_lines;\n  GLuint vao_overlay_points;\n  OpenGL_shader shader_mesh;\n  OpenGL_shader shader_overlay_lines;\n  OpenGL_shader shader_overlay_points;\n\n  GLuint vbo_V; // Vertices of the current mesh (#V x 3)\n  GLuint vbo_V_uv; // UV coordinates for the current mesh (#V x 2)\n  GLuint vbo_V_normals; // Vertices of the current mesh (#V x 3)\n  GLuint vbo_V_ambient; // Ambient material  (#V x 3)\n  GLuint vbo_V_diffuse; // Diffuse material  (#V x 3)\n  GLuint vbo_V_specular; // Specular material  (#V x 3)\n\n  GLuint vbo_F; // Faces of the mesh (#F x 3)\n  GLuint vbo_tex; // Texture\n\n  GLuint vbo_lines_F;         // Indices of the line overlay\n  GLuint vbo_lines_V;         // Vertices of the line overlay\n  GLuint vbo_lines_V_colors;  // Color values of the line overlay\n  GLuint vbo_points_F;        // Indices of the point overlay\n  GLuint vbo_points_V;        // Vertices of the point overlay\n  GLuint vbo_points_V_colors; // Color values of the point overlay\n\n  // Temporary copy of the content of each VBO\n  Eigen::MatrixXf V_vbo;\n  Eigen::MatrixXf V_normals_vbo;\n  Eigen::MatrixXf V_ambient_vbo;\n  Eigen::MatrixXf V_diffuse_vbo;\n  Eigen::MatrixXf V_specular_vbo;\n  Eigen::MatrixXf V_uv_vbo;\n  Eigen::MatrixXf lines_V_vbo;\n  Eigen::MatrixXf lines_V_colors_vbo;\n  Eigen::MatrixXf points_V_vbo;\n  Eigen::MatrixXf points_V_colors_vbo;\n\n  int tex_u;\n  int tex_v;\n  Eigen::Matrix<char,Eigen::Dynamic,1> tex;\n\n  Eigen::Matrix<unsigned, Eigen::Dynamic, Eigen::Dynamic> F_vbo;\n  Eigen::Matrix<unsigned, Eigen::Dynamic, Eigen::Dynamic> lines_F_vbo;\n  Eigen::Matrix<unsigned, Eigen::Dynamic, Eigen::Dynamic> points_F_vbo;\n\n  // Marks dirty buffers that need to be uploaded to OpenGL\n  uint32_t dirty;\n\n  // Initialize shaders and buffers\n  IGL_INLINE void init();\n\n  // Release all resources\n  IGL_INLINE void free();\n\n  // Create a new set of OpenGL buffer objects\n  IGL_INLINE void init_buffers();\n\n  // Update contents from a 'Data' instance\n  IGL_INLINE void set_data(const igl::viewer::ViewerData &data, bool invert_normals);\n\n  // Bind the underlying OpenGL buffer objects for subsequent mesh draw calls\n  IGL_INLINE void bind_mesh();\n\n  /// Draw the currently buffered mesh (either solid or wireframe)\n  IGL_INLINE void draw_mesh(bool solid);\n\n  // Bind the underlying OpenGL buffer objects for subsequent line overlay draw calls\n  IGL_INLINE void bind_overlay_lines();\n\n  /// Draw the currently buffered line overlay\n  IGL_INLINE void draw_overlay_lines();\n\n  // Bind the underlying OpenGL buffer objects for subsequent point overlay draw calls\n  IGL_INLINE void bind_overlay_points();\n\n  /// Draw the currently buffered point overlay\n  IGL_INLINE void draw_overlay_points();\n\n  // Release the OpenGL buffer objects\n  IGL_INLINE void free_buffers();\n\n};\n\n}\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"OpenGL_state.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/viewer/TODOs.txt",
    "content": "- `align_and_center_object` continues to zoom out on repeated calls\n- trackball_angle should be a quaternion\n- data.lines, data.points should not concatenate colors with coordinates\n- snap to canonical recenters origin but trackball does not\n- rewrite in libigl style\n- separate various class into their own .h/.cpp pairs\n- remove use of double underscores (http://stackoverflow.com/a/224420/148668)\n- document inputs and outputs to all functions\n- document all member fields\n- document all classes\n- light direction is backwards\n- remove global variables (not threadsafe)\n- encapsulate (in igl namespace) and move static/global functions, use lambdas?\n- preface macros with \"IGL_\"\n- trackball mouseup captured by tweakbar\n- zoom with pan rather than scaling\n- refresh draw while resizing\n- use constructor initializer list rather than complicated constructor\n- support per-element alpha values\n+ snap to canonical view key shortcut is not working\n+ resize TwBar with window\n+ trackball should be able to drag over TwBar\n+ don't zoom on horizontal scale\n+ remove global `using namespace std`\n+ remove `#define IGL_HEADER_ONLY`\n+ guard `#undef max`\n+ fix all -Wsign-compare\n+ missing `#include <iostream>`\n+ missing `#include <fstream>`\n+ fix all -Wunused-but-set-variable\n+ makefile for libiglviewer.a\n+ Viewer.h should include Viewer.cpp\n+ depth test for overlays cannot be disabled\n"
  },
  {
    "path": "libs/libigl/include/igl/viewer/TextRenderer.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Wenzel Jacob <wenzel@inf.ethz.ch>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifdef IGL_VIEWER_WITH_NANOGUI\n#include \"TextRenderer.h\"\n#include \"TextRenderer_fonts.h\"\n#include <igl/project.h>\n\n#include <nanogui/opengl.h>\n#include <nanovg.h>\n\n#include <Eigen/Dense>\n\n#define NANOVG_GL3\n#include <nanovg_gl.h>\n\n\nIGL_INLINE igl::viewer::TextRenderer::TextRenderer(): ctx(nullptr) {}\n\nIGL_INLINE int igl::viewer::TextRenderer::Init()\n{\n  using namespace std;\n  #ifdef NDEBUG\n    ctx = nvgCreateGL3(NVG_STENCIL_STROKES | NVG_ANTIALIAS);\n  #else\n    ctx = nvgCreateGL3(NVG_STENCIL_STROKES | NVG_ANTIALIAS | NVG_DEBUG);\n  #endif\n\n  nvgCreateFontMem(ctx, \"sans\", igl_roboto_regular_ttf,\n                             igl_roboto_regular_ttf_size, 0);\n\n  return 0;\n}\n\nIGL_INLINE int igl::viewer::TextRenderer::Shut()\n{\n  using namespace std;\n  if(ctx)\n    nvgDeleteGL3(ctx);\n  return 0;\n}\n\nIGL_INLINE void igl::viewer::TextRenderer::BeginDraw(\n  const Eigen::Matrix4f &view,\n  const Eigen::Matrix4f &proj,\n  const Eigen::Vector4f &_viewport,\n  float _object_scale)\n{\n  using namespace std;\n  viewport = _viewport;\n  proj_matrix = proj;\n  view_matrix = view;\n  object_scale = _object_scale;\n\n  Eigen::Vector2i mFBSize;\n  Eigen::Vector2i mSize;\n\n  GLFWwindow* mGLFWWindow = glfwGetCurrentContext();\n  glfwGetFramebufferSize(mGLFWWindow,&mFBSize[0],&mFBSize[1]);\n  glfwGetWindowSize(mGLFWWindow,&mSize[0],&mSize[1]);\n  glViewport(0,0,mFBSize[0],mFBSize[1]);\n\n  glClear(GL_STENCIL_BUFFER_BIT);\n\n  /* Calculate pixel ratio for hi-dpi devices. */\n  mPixelRatio = (float)mFBSize[0] / (float)mSize[0];\n  nvgBeginFrame(ctx,mSize[0],mSize[1],mPixelRatio);\n}\n\nIGL_INLINE void igl::viewer::TextRenderer::EndDraw()\n{\n  using namespace std;\n  nvgEndFrame(ctx);\n}\n\nIGL_INLINE void igl::viewer::TextRenderer::DrawText(\n  Eigen::Vector3d pos, Eigen::Vector3d normal, const std::string &text)\n{\n  using namespace std;\n  pos += normal * 0.005f * object_scale;\n  Eigen::Vector3f coord = igl::project(Eigen::Vector3f(pos(0), pos(1), pos(2)),\n      view_matrix, proj_matrix, viewport);\n\n  nvgFontSize(ctx, 16*mPixelRatio);\n  nvgFontFace(ctx, \"sans\");\n  nvgTextAlign(ctx, NVG_ALIGN_LEFT | NVG_ALIGN_MIDDLE);\n  nvgFillColor(ctx, nvgRGBA(10,10,250,255));\n  nvgText(ctx, coord[0]/mPixelRatio, (viewport[3] - coord[1])/mPixelRatio, text.c_str(), NULL);\n}\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/viewer/TextRenderer.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Wenzel Jacob <wenzel@inf.ethz.ch>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_VIEWER_TEXT_RENDERER_H\n#define IGL_VIEWER_TEXT_RENDERER_H\n#ifdef IGL_VIEWER_WITH_NANOGUI\n\n#include <Eigen/Dense>\n\n#include <igl/igl_inline.h>\n#include <map>\n\nstruct NVGcontext;\n\nnamespace igl\n{\nnamespace viewer\n{\n\n  class TextRenderer\n  {\n  public:\n    IGL_INLINE TextRenderer();\n\n    IGL_INLINE virtual int Init();\n    IGL_INLINE virtual int Shut();\n\n    IGL_INLINE void BeginDraw(const Eigen::Matrix4f &view,const Eigen::Matrix4f &proj,\n      const Eigen::Vector4f &_viewport,float _object_scale);\n\n    IGL_INLINE void EndDraw();\n\n    IGL_INLINE void DrawText(Eigen::Vector3d pos,Eigen::Vector3d normal,const std::string &text);\n\n  protected:\n    std::map<std::string,void *> m_textObjects;\n    Eigen::Matrix4f view_matrix,proj_matrix;\n    Eigen::Vector4f viewport;\n    float object_scale;\n    float mPixelRatio;\n    NVGcontext *ctx;\n  };\n\n}\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"TextRenderer.cpp\"\n#endif\n\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/viewer/TextRenderer_fonts.cpp",
    "content": "/* Autogenerated by bin2c */\n\n#include <stdint.h>\n\nuint8_t igl_entypo_ttf[] = {\n\t0x00, 0x01, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x80, 0x00, 0x03, 0x00, 0x50, \n\t0x46, 0x46, 0x54, 0x4d, 0x5e, 0x30, 0xea, 0x0e, 0x00, 0x00, 0x8a, 0x24, \n\t0x00, 0x00, 0x00, 0x1c, 0x47, 0x44, 0x45, 0x46, 0x00, 0x29, 0x00, 0xf8, \n\t0x00, 0x00, 0x8a, 0x04, 0x00, 0x00, 0x00, 0x1e, 0x4f, 0x53, 0x2f, 0x32, \n\t0x2b, 0xae, 0x50, 0x85, 0x00, 0x00, 0x01, 0x58, 0x00, 0x00, 0x00, 0x60, \n\t0x63, 0x6d, 0x61, 0x70, 0x75, 0xbf, 0xe7, 0x03, 0x00, 0x00, 0x05, 0x80, \n\t0x00, 0x00, 0x09, 0x8e, 0x67, 0x61, 0x73, 0x70, 0xff, 0xff, 0x00, 0x03, \n\t0x00, 0x00, 0x89, 0xfc, 0x00, 0x00, 0x00, 0x08, 0x67, 0x6c, 0x79, 0x66, \n\t0x69, 0xf6, 0xa9, 0x89, 0x00, 0x00, 0x10, 0xf8, 0x00, 0x00, 0x6b, 0x6c, \n\t0x68, 0x65, 0x61, 0x64, 0xfa, 0xd6, 0xad, 0x9c, 0x00, 0x00, 0x00, 0xdc, \n\t0x00, 0x00, 0x00, 0x36, 0x68, 0x68, 0x65, 0x61, 0x05, 0x18, 0x02, 0x53, \n\t0x00, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x24, 0x68, 0x6d, 0x74, 0x78, \n\t0xde, 0x3d, 0x2e, 0x7c, 0x00, 0x00, 0x01, 0xb8, 0x00, 0x00, 0x03, 0xc8, \n\t0x6c, 0x6f, 0x63, 0x61, 0x09, 0x04, 0xee, 0x6e, 0x00, 0x00, 0x0f, 0x10, \n\t0x00, 0x00, 0x01, 0xe6, 0x6d, 0x61, 0x78, 0x70, 0x01, 0x42, 0x00, 0x76, \n\t0x00, 0x00, 0x01, 0x38, 0x00, 0x00, 0x00, 0x20, 0x6e, 0x61, 0x6d, 0x65, \n\t0xc5, 0x58, 0xe9, 0x7c, 0x00, 0x00, 0x7c, 0x64, 0x00, 0x00, 0x03, 0xb1, \n\t0x70, 0x6f, 0x73, 0x74, 0x15, 0xdd, 0xbc, 0x01, 0x00, 0x00, 0x80, 0x18, \n\t0x00, 0x00, 0x09, 0xe3, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x41, \n\t0x55, 0xd7, 0xd2, 0x74, 0x5f, 0x0f, 0x3c, 0xf5, 0x00, 0x0b, 0x03, 0xe8, \n\t0x00, 0x00, 0x00, 0x00, 0xcc, 0xae, 0xb5, 0x41, 0x00, 0x00, 0x00, 0x00, \n\t0xcc, 0xae, 0xb5, 0x41, 0x00, 0x32, 0xff, 0xff, 0x02, 0x28, 0x01, 0xf5, \n\t0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x00, 0x02, 0xee, 0xff, 0x06, 0x00, 0x00, 0x02, 0x5a, \n\t0x00, 0x00, 0x00, 0x00, 0x02, 0x28, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf2, \n\t0x00, 0x01, 0x00, 0x00, 0x00, 0xf2, 0x00, 0x73, 0x00, 0x0e, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, \n\t0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0xfc, \n\t0x01, 0x90, 0x00, 0x05, 0x00, 0x04, 0x02, 0x8a, 0x02, 0x58, 0x00, 0x00, \n\t0x00, 0x4b, 0x02, 0x8a, 0x02, 0x58, 0x00, 0x00, 0x01, 0x5e, 0x00, 0x00, \n\t0x00, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x42, 0x00, 0x00, 0x00, 0x40, \n\t0x20, 0x16, 0xff, 0xff, 0x02, 0xee, 0xff, 0x06, 0x00, 0x00, 0x03, 0xe8, \n\t0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x01, 0x01, 0xf4, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x01, 0x4d, 0x00, 0x00, 0x01, 0x6d, 0x00, 0x32, \n\t0x01, 0x4a, 0x00, 0x32, 0x02, 0x4e, 0x00, 0x32, 0x01, 0x5e, 0x00, 0x32, \n\t0x02, 0x4e, 0x00, 0x32, 0x01, 0x5e, 0x00, 0x32, 0x02, 0x0d, 0x00, 0x32, \n\t0x01, 0xd8, 0x00, 0x32, 0x02, 0x58, 0x00, 0x32, 0x02, 0x58, 0x00, 0x32, \n\t0x02, 0x08, 0x00, 0x32, 0x02, 0x08, 0x00, 0x32, 0x01, 0xf4, 0x00, 0x32, \n\t0x01, 0xf4, 0x00, 0x32, 0x02, 0x27, 0x00, 0x32, 0x02, 0x58, 0x00, 0x32, \n\t0x02, 0x58, 0x00, 0x32, 0x02, 0x1c, 0x00, 0x32, 0x02, 0x1c, 0x00, 0x32, \n\t0x01, 0x90, 0x00, 0x32, 0x01, 0x90, 0x00, 0x32, 0x01, 0x7c, 0x00, 0x32, \n\t0x00, 0xd2, 0x00, 0x32, 0x01, 0x81, 0x00, 0x32, 0x02, 0x30, 0x00, 0x32, \n\t0x02, 0x24, 0x00, 0x32, 0x01, 0x90, 0x00, 0x32, 0x01, 0x4a, 0x00, 0x32, \n\t0x01, 0x5e, 0x00, 0x32, 0x01, 0x2c, 0x00, 0x32, 0x01, 0x4a, 0x00, 0x32, \n\t0x01, 0x2c, 0x00, 0x32, 0x01, 0xc2, 0x00, 0x32, 0x02, 0x58, 0x00, 0x32, \n\t0x02, 0x08, 0x00, 0x32, 0x02, 0x58, 0x00, 0x32, 0x02, 0x1c, 0x00, 0x32, \n\t0x02, 0x1c, 0x00, 0x32, 0x01, 0xba, 0x00, 0x32, 0x01, 0xc2, 0x00, 0x32, \n\t0x01, 0xff, 0x00, 0x32, 0x02, 0x14, 0x00, 0x32, 0x02, 0x14, 0x00, 0x32, \n\t0x01, 0x87, 0x00, 0x32, 0x01, 0xd7, 0x00, 0x32, 0x01, 0x90, 0x00, 0x32, \n\t0x02, 0x27, 0x00, 0x32, 0x02, 0x57, 0x00, 0x32, 0x02, 0x08, 0x00, 0x32, \n\t0x02, 0x46, 0x00, 0x32, 0x01, 0x2e, 0x00, 0x32, 0x02, 0x58, 0x00, 0x32, \n\t0x02, 0x58, 0x00, 0x32, 0x02, 0x58, 0x00, 0x32, 0x02, 0x26, 0x00, 0x32, \n\t0x01, 0xeb, 0x00, 0x32, 0x01, 0xc2, 0x00, 0x32, 0x01, 0xb3, 0x00, 0x32, \n\t0x02, 0x08, 0x00, 0x32, 0x01, 0x50, 0x00, 0x32, 0x01, 0xf4, 0x00, 0x32, \n\t0x01, 0x86, 0x00, 0x32, 0x01, 0xe1, 0x00, 0x32, 0x01, 0x86, 0x00, 0x32, \n\t0x01, 0x86, 0x00, 0x32, 0x01, 0xd1, 0x00, 0x32, 0x02, 0x12, 0x00, 0x32, \n\t0x02, 0x26, 0x00, 0x32, 0x02, 0x3a, 0x00, 0x32, 0x02, 0x3a, 0x00, 0x32, \n\t0x01, 0xd1, 0x00, 0x32, 0x01, 0xae, 0x00, 0x32, 0x01, 0xae, 0x00, 0x32, \n\t0x02, 0x58, 0x00, 0x32, 0x01, 0xc2, 0x00, 0x32, 0x01, 0xd1, 0x00, 0x32, \n\t0x01, 0xd1, 0x00, 0x32, 0x01, 0xe0, 0x00, 0x32, 0x01, 0xe0, 0x00, 0x32, \n\t0x02, 0x58, 0x00, 0x32, 0x02, 0x32, 0x00, 0x32, 0x02, 0x32, 0x00, 0x32, \n\t0x02, 0x58, 0x00, 0x32, 0x02, 0x44, 0x00, 0x32, 0x02, 0x58, 0x00, 0x32, \n\t0x02, 0x26, 0x00, 0x32, 0x02, 0x58, 0x00, 0x32, 0x02, 0x58, 0x00, 0x32, \n\t0x02, 0x58, 0x00, 0x32, 0x02, 0x4e, 0x00, 0x32, 0x02, 0x58, 0x00, 0x32, \n\t0x01, 0xf4, 0x00, 0x32, 0x02, 0x58, 0x00, 0x32, 0x02, 0x58, 0x00, 0x32, \n\t0x02, 0x58, 0x00, 0x32, 0x01, 0x5e, 0x00, 0x32, 0x02, 0x58, 0x00, 0x32, \n\t0x02, 0x46, 0x00, 0x32, 0x01, 0xe0, 0x00, 0x32, 0x01, 0xc2, 0x00, 0x32, \n\t0x01, 0xc2, 0x00, 0x32, 0x02, 0x59, 0x00, 0x32, 0x02, 0x58, 0x00, 0x32, \n\t0x01, 0xe0, 0x00, 0x32, 0x01, 0xf4, 0x00, 0x32, 0x02, 0x26, 0x00, 0x32, \n\t0x02, 0x58, 0x00, 0x32, 0x02, 0x26, 0x00, 0x32, 0x02, 0x26, 0x00, 0x32, \n\t0x01, 0xf0, 0x00, 0x32, 0x02, 0x26, 0x00, 0x32, 0x01, 0xf4, 0x00, 0x32, \n\t0x02, 0x58, 0x00, 0x32, 0x02, 0x58, 0x00, 0x32, 0x01, 0x4a, 0x00, 0x32, \n\t0x02, 0x30, 0x00, 0x32, 0x02, 0x30, 0x00, 0x32, 0x02, 0x30, 0x00, 0x32, \n\t0x02, 0x30, 0x00, 0x32, 0x01, 0x86, 0x00, 0x32, 0x01, 0x0e, 0x00, 0x32, \n\t0x01, 0x0e, 0x00, 0x32, 0x01, 0x86, 0x00, 0x32, 0x01, 0x4c, 0x00, 0x32, \n\t0x00, 0xe8, 0x00, 0x32, 0x00, 0xe8, 0x00, 0x32, 0x01, 0x4c, 0x00, 0x32, \n\t0x02, 0x14, 0x00, 0x32, 0x01, 0x4c, 0x00, 0x32, 0x01, 0x4c, 0x00, 0x32, \n\t0x02, 0x14, 0x00, 0x32, 0x02, 0x58, 0x00, 0x32, 0x02, 0x58, 0x00, 0x32, \n\t0x02, 0x58, 0x00, 0x32, 0x02, 0x58, 0x00, 0x32, 0x02, 0x3a, 0x00, 0x32, \n\t0x02, 0x30, 0x00, 0x32, 0x02, 0x59, 0x00, 0x32, 0x02, 0x27, 0x00, 0x32, \n\t0x02, 0x32, 0x00, 0x32, 0x01, 0x7d, 0x00, 0x32, 0x02, 0x45, 0x00, 0x32, \n\t0x01, 0xfe, 0x00, 0x32, 0x02, 0x4e, 0x00, 0x32, 0x01, 0xf4, 0x00, 0x00, \n\t0x02, 0x26, 0x00, 0x32, 0x02, 0x58, 0x00, 0x32, 0x02, 0x44, 0x00, 0x32, \n\t0x02, 0x3a, 0x00, 0x32, 0x02, 0x58, 0x00, 0x32, 0x02, 0x59, 0x00, 0x32, \n\t0x01, 0xa4, 0x00, 0x32, 0x02, 0x4f, 0x00, 0x32, 0x02, 0x3b, 0x00, 0x32, \n\t0x02, 0x4e, 0x00, 0x32, 0x02, 0x12, 0x00, 0x32, 0x01, 0xc2, 0x00, 0x32, \n\t0x02, 0x26, 0x00, 0x32, 0x01, 0xf4, 0x00, 0x32, 0x01, 0xf4, 0x00, 0x32, \n\t0x02, 0x13, 0x00, 0x32, 0x02, 0x3a, 0x00, 0x32, 0x02, 0x58, 0x00, 0x32, \n\t0x01, 0xc3, 0x00, 0x32, 0x02, 0x28, 0x00, 0x32, 0x02, 0x3a, 0x00, 0x32, \n\t0x01, 0x7c, 0x00, 0x32, 0x02, 0x28, 0x00, 0x32, 0x02, 0x58, 0x00, 0x32, \n\t0x02, 0x58, 0x00, 0x32, 0x02, 0x58, 0x00, 0x32, 0x01, 0xf4, 0x00, 0x32, \n\t0x02, 0x30, 0x00, 0x32, 0x02, 0x5a, 0x00, 0x32, 0x01, 0xc2, 0x00, 0x32, \n\t0x02, 0x26, 0x00, 0x32, 0x02, 0x59, 0x00, 0x32, 0x01, 0xf4, 0x00, 0x32, \n\t0x01, 0xc2, 0x00, 0x32, 0x02, 0x39, 0x00, 0x32, 0x01, 0x77, 0x00, 0x32, \n\t0x01, 0xc2, 0x00, 0x32, 0x02, 0x26, 0x00, 0x32, 0x01, 0xf4, 0x00, 0x32, \n\t0x02, 0x13, 0x00, 0x32, 0x02, 0x59, 0x00, 0x32, 0x02, 0x59, 0x00, 0x32, \n\t0x02, 0x26, 0x00, 0x32, 0x01, 0xf4, 0x00, 0x32, 0x01, 0x86, 0x00, 0x32, \n\t0x02, 0x4e, 0x00, 0x32, 0x02, 0x58, 0x00, 0x32, 0x01, 0xc2, 0x00, 0x32, \n\t0x02, 0x27, 0x00, 0x32, 0x02, 0x2e, 0x00, 0x32, 0x01, 0x72, 0x00, 0x32, \n\t0x02, 0x58, 0x00, 0x32, 0x02, 0x26, 0x00, 0x32, 0x02, 0x00, 0x00, 0x32, \n\t0x01, 0xc2, 0x00, 0x32, 0x02, 0x58, 0x00, 0x32, 0x02, 0x1e, 0x00, 0x32, \n\t0x02, 0x2c, 0x00, 0x32, 0x02, 0x58, 0x00, 0x32, 0x01, 0xef, 0x00, 0x32, \n\t0x01, 0xea, 0x00, 0x32, 0x01, 0xc2, 0x00, 0x32, 0x01, 0xc2, 0x00, 0x32, \n\t0x01, 0xf4, 0x00, 0x32, 0x01, 0x18, 0x00, 0x32, 0x01, 0xf4, 0x00, 0x32, \n\t0x02, 0x0d, 0x00, 0x32, 0x02, 0x27, 0x00, 0x32, 0x02, 0x4e, 0x00, 0x32, \n\t0x02, 0x32, 0x00, 0x32, 0x02, 0x46, 0x00, 0x32, 0x02, 0x44, 0x00, 0x32, \n\t0x02, 0x44, 0x00, 0x32, 0x02, 0x44, 0x00, 0x32, 0x02, 0x44, 0x00, 0x32, \n\t0x02, 0x44, 0x00, 0x32, 0x02, 0x44, 0x00, 0x32, 0x02, 0x44, 0x00, 0x32, \n\t0x02, 0x44, 0x00, 0x32, 0x02, 0x44, 0x00, 0x32, 0x02, 0x44, 0x00, 0x32, \n\t0x02, 0x30, 0x00, 0x32, 0x01, 0xa4, 0x00, 0x32, 0x01, 0xa4, 0x00, 0x32, \n\t0x02, 0x3a, 0x00, 0x32, 0x00, 0xdc, 0x00, 0x32, 0x01, 0xa4, 0x00, 0x32, \n\t0x01, 0xcf, 0x00, 0x32, 0x02, 0x26, 0x00, 0x32, 0x02, 0x13, 0x00, 0x32, \n\t0x02, 0x44, 0x00, 0x32, 0x02, 0x58, 0x00, 0x32, 0x02, 0x58, 0x00, 0x32, \n\t0x02, 0x46, 0x00, 0x32, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, \n\t0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0xb4, \n\t0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x08, 0x88, 0x00, 0x03, 0x00, 0x01, \n\t0x00, 0x00, 0x00, 0x2c, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x00, 0x02, 0xb4, \n\t0x00, 0x04, 0x02, 0x88, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x80, 0x00, 0x06, \n\t0x00, 0x1e, 0x20, 0x16, 0x21, 0x39, 0x21, 0x93, 0x21, 0xb0, 0x21, 0xb3, \n\t0x21, 0xc6, 0x22, 0x1e, 0x22, 0x96, 0x22, 0x9f, 0x23, 0x02, 0x23, 0x28, \n\t0x23, 0x2b, 0x23, 0xea, 0x23, 0xee, 0x23, 0xf7, 0x25, 0xa0, 0x25, 0xb4, \n\t0x25, 0xb6, 0x25, 0xb8, 0x25, 0xbe, 0x25, 0xc2, 0x25, 0xcf, 0x25, 0xd1, \n\t0x25, 0xf4, 0x26, 0x01, 0x26, 0x06, 0x26, 0x15, 0x26, 0x30, 0x26, 0x3d, \n\t0x26, 0x61, 0x26, 0x65, 0x26, 0x6b, 0x26, 0x8f, 0x26, 0x92, 0x26, 0x99, \n\t0x26, 0xa1, 0x26, 0xc8, 0x27, 0x09, 0x27, 0x0e, 0x27, 0x13, 0x27, 0x16, \n\t0x27, 0x4c, 0x27, 0x4e, 0x27, 0x53, 0x27, 0x5e, 0x27, 0x96, 0x27, 0xa2, \n\t0x27, 0xa6, 0x27, 0xf3, 0x2b, 0x07, 0xe0, 0x03, 0xe0, 0x05, 0xe4, 0xb0, \n\t0xe7, 0x00, 0xe7, 0x05, 0xe7, 0x0a, 0xe7, 0x0c, 0xe7, 0x18, 0xe7, 0x20, \n\t0xe7, 0x24, 0xe7, 0x29, 0xe7, 0x31, 0xe7, 0x37, 0xe7, 0x3a, 0xe7, 0x3e, \n\t0xe7, 0x41, 0xe7, 0x44, 0xe7, 0x46, 0xe7, 0x4f, 0xe7, 0x6b, 0xe7, 0x71, \n\t0xe7, 0x78, 0xe7, 0x89, 0xe7, 0x9a, 0xe7, 0xa1, 0xe8, 0x00, 0xf0, 0x20, \n\t0xf6, 0x01, 0xff, 0xff, 0x00, 0x00, 0x20, 0x16, 0x21, 0x39, 0x21, 0x90, \n\t0x21, 0xb0, 0x21, 0xb3, 0x21, 0xc6, 0x22, 0x1e, 0x22, 0x95, 0x22, 0x9e, \n\t0x23, 0x02, 0x23, 0x28, 0x23, 0x2b, 0x23, 0xe9, 0x23, 0xed, 0x23, 0xf3, \n\t0x25, 0xa0, 0x25, 0xb4, 0x25, 0xb6, 0x25, 0xb8, 0x25, 0xbe, 0x25, 0xc2, \n\t0x25, 0xcf, 0x25, 0xd1, 0x25, 0xf4, 0x26, 0x01, 0x26, 0x05, 0x26, 0x15, \n\t0x26, 0x30, 0x26, 0x3d, 0x26, 0x61, 0x26, 0x65, 0x26, 0x6a, 0x26, 0x8f, \n\t0x26, 0x91, 0x26, 0x99, 0x26, 0xa0, 0x26, 0xc8, 0x27, 0x07, 0x27, 0x0e, \n\t0x27, 0x12, 0x27, 0x16, 0x27, 0x4c, 0x27, 0x4e, 0x27, 0x53, 0x27, 0x5e, \n\t0x27, 0x95, 0x27, 0xa1, 0x27, 0xa6, 0x27, 0xf2, 0x2b, 0x05, 0xe0, 0x03, \n\t0xe0, 0x05, 0xe4, 0xad, 0xe7, 0x00, 0xe7, 0x04, 0xe7, 0x0a, 0xe7, 0x0c, \n\t0xe7, 0x11, 0xe7, 0x20, 0xe7, 0x22, 0xe7, 0x27, 0xe7, 0x30, 0xe7, 0x36, \n\t0xe7, 0x3a, 0xe7, 0x3c, 0xe7, 0x40, 0xe7, 0x44, 0xe7, 0x46, 0xe7, 0x4c, \n\t0xe7, 0x58, 0xe7, 0x71, 0xe7, 0x76, 0xe7, 0x88, 0xe7, 0x9a, 0xe7, 0xa1, \n\t0xe8, 0x00, 0xf0, 0x20, 0xf6, 0x01, 0xff, 0xff, 0xdf, 0xed, 0xde, 0xcb, \n\t0xde, 0x75, 0xde, 0x59, 0xde, 0x57, 0xde, 0x45, 0xdd, 0xee, 0xdd, 0x78, \n\t0xdd, 0x71, 0xdd, 0x0f, 0xdc, 0xea, 0xdc, 0xe8, 0xdc, 0x2b, 0xdc, 0x29, \n\t0xdc, 0x25, 0xda, 0x7d, 0xda, 0x6a, 0xda, 0x69, 0xda, 0x68, 0xda, 0x63, \n\t0xda, 0x60, 0xda, 0x54, 0xda, 0x53, 0xda, 0x31, 0xda, 0x25, 0xda, 0x22, \n\t0xda, 0x14, 0xd9, 0xfa, 0xd9, 0xee, 0xd9, 0xcb, 0xd9, 0xc8, 0xd9, 0xc4, \n\t0xd9, 0xa1, 0xd9, 0xa0, 0xd9, 0x9a, 0xd9, 0x94, 0xd9, 0x6e, 0xd9, 0x30, \n\t0xd9, 0x2c, 0xd9, 0x29, 0xd9, 0x27, 0xd8, 0xf2, 0xd8, 0xf1, 0xd8, 0xed, \n\t0xd8, 0xe3, 0xd8, 0xad, 0xd8, 0xa3, 0xd8, 0xa0, 0xd8, 0x55, 0xd5, 0x44, \n\t0x20, 0x49, 0x20, 0x48, 0x1b, 0xa1, 0x19, 0x52, 0x19, 0x4f, 0x19, 0x4b, \n\t0x19, 0x4a, 0x19, 0x46, 0x19, 0x3f, 0x19, 0x3e, 0x19, 0x3c, 0x19, 0x36, \n\t0x19, 0x32, 0x19, 0x30, 0x19, 0x2f, 0x19, 0x2e, 0x19, 0x2c, 0x19, 0x2b, \n\t0x19, 0x26, 0x19, 0x1e, 0x19, 0x19, 0x19, 0x15, 0x19, 0x06, 0x18, 0xf6, \n\t0x18, 0xf0, 0x18, 0x92, 0x10, 0x73, 0x0a, 0x93, 0x00, 0x01, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x05, 0xd4, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x7b, 0x00, 0x00, 0x20, 0x16, 0x00, 0x00, 0x20, 0x16, \n\t0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x21, 0x39, 0x00, 0x00, 0x21, 0x39, \n\t0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x21, 0x90, 0x00, 0x00, 0x21, 0x93, \n\t0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x21, 0xb0, 0x00, 0x00, 0x21, 0xb0, \n\t0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x21, 0xb3, 0x00, 0x00, 0x21, 0xb3, \n\t0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x21, 0xc6, 0x00, 0x00, 0x21, 0xc6, \n\t0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x22, 0x1e, 0x00, 0x00, 0x22, 0x1e, \n\t0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x22, 0x95, 0x00, 0x00, 0x22, 0x96, \n\t0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x22, 0x9e, 0x00, 0x00, 0x22, 0x9f, \n\t0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x23, 0x02, 0x00, 0x00, 0x23, 0x02, \n\t0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x23, 0x28, 0x00, 0x00, 0x23, 0x28, \n\t0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x23, 0x2b, 0x00, 0x00, 0x23, 0x2b, \n\t0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x23, 0xe9, 0x00, 0x00, 0x23, 0xea, \n\t0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x23, 0xed, 0x00, 0x00, 0x23, 0xee, \n\t0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x23, 0xf3, 0x00, 0x00, 0x23, 0xf7, \n\t0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x25, 0xa0, 0x00, 0x00, 0x25, 0xa0, \n\t0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x25, 0xb4, 0x00, 0x00, 0x25, 0xb4, \n\t0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x25, 0xb6, 0x00, 0x00, 0x25, 0xb6, \n\t0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x25, 0xb8, 0x00, 0x00, 0x25, 0xb8, \n\t0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x25, 0xbe, 0x00, 0x00, 0x25, 0xbe, \n\t0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x25, 0xc2, 0x00, 0x00, 0x25, 0xc2, \n\t0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x25, 0xcf, 0x00, 0x00, 0x25, 0xcf, \n\t0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x25, 0xd1, 0x00, 0x00, 0x25, 0xd1, \n\t0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x25, 0xf4, 0x00, 0x00, 0x25, 0xf4, \n\t0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x26, 0x01, 0x00, 0x00, 0x26, 0x01, \n\t0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x26, 0x05, 0x00, 0x00, 0x26, 0x06, \n\t0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x26, 0x15, 0x00, 0x00, 0x26, 0x15, \n\t0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x26, 0x30, 0x00, 0x00, 0x26, 0x30, \n\t0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x26, 0x3d, 0x00, 0x00, 0x26, 0x3d, \n\t0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x26, 0x61, 0x00, 0x00, 0x26, 0x61, \n\t0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x26, 0x65, 0x00, 0x00, 0x26, 0x65, \n\t0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x26, 0x6a, 0x00, 0x00, 0x26, 0x6b, \n\t0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x26, 0x8f, 0x00, 0x00, 0x26, 0x8f, \n\t0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x26, 0x91, 0x00, 0x00, 0x26, 0x92, \n\t0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x26, 0x99, 0x00, 0x00, 0x26, 0x99, \n\t0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x26, 0xa0, 0x00, 0x00, 0x26, 0xa1, \n\t0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x26, 0xc8, 0x00, 0x00, 0x26, 0xc8, \n\t0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x27, 0x07, 0x00, 0x00, 0x27, 0x09, \n\t0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x27, 0x0e, 0x00, 0x00, 0x27, 0x0e, \n\t0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x27, 0x12, 0x00, 0x00, 0x27, 0x13, \n\t0x00, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x27, 0x16, 0x00, 0x00, 0x27, 0x16, \n\t0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x27, 0x4c, 0x00, 0x00, 0x27, 0x4c, \n\t0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x27, 0x4e, 0x00, 0x00, 0x27, 0x4e, \n\t0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x27, 0x53, 0x00, 0x00, 0x27, 0x53, \n\t0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x27, 0x5e, 0x00, 0x00, 0x27, 0x5e, \n\t0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x27, 0x95, 0x00, 0x00, 0x27, 0x96, \n\t0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x27, 0xa1, 0x00, 0x00, 0x27, 0xa2, \n\t0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x27, 0xa6, 0x00, 0x00, 0x27, 0xa6, \n\t0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x27, 0xf2, 0x00, 0x00, 0x27, 0xf3, \n\t0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x2b, 0x05, 0x00, 0x00, 0x2b, 0x07, \n\t0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0xe0, 0x03, \n\t0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0xe0, 0x05, 0x00, 0x00, 0xe0, 0x05, \n\t0x00, 0x00, 0x00, 0x4d, 0x00, 0x00, 0xe4, 0xad, 0x00, 0x00, 0xe4, 0xb0, \n\t0x00, 0x00, 0x00, 0x4e, 0x00, 0x00, 0xe7, 0x00, 0x00, 0x00, 0xe7, 0x00, \n\t0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0xe7, 0x04, 0x00, 0x00, 0xe7, 0x05, \n\t0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0xe7, 0x0a, 0x00, 0x00, 0xe7, 0x0a, \n\t0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0xe7, 0x0c, 0x00, 0x00, 0xe7, 0x0c, \n\t0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0xe7, 0x11, 0x00, 0x00, 0xe7, 0x18, \n\t0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0xe7, 0x20, 0x00, 0x00, 0xe7, 0x20, \n\t0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0xe7, 0x22, 0x00, 0x00, 0xe7, 0x24, \n\t0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0xe7, 0x27, 0x00, 0x00, 0xe7, 0x29, \n\t0x00, 0x00, 0x00, 0x63, 0x00, 0x00, 0xe7, 0x30, 0x00, 0x00, 0xe7, 0x31, \n\t0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0xe7, 0x36, 0x00, 0x00, 0xe7, 0x37, \n\t0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0xe7, 0x3a, 0x00, 0x00, 0xe7, 0x3a, \n\t0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0xe7, 0x3c, 0x00, 0x00, 0xe7, 0x3e, \n\t0x00, 0x00, 0x00, 0x6b, 0x00, 0x00, 0xe7, 0x40, 0x00, 0x00, 0xe7, 0x41, \n\t0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0xe7, 0x44, 0x00, 0x00, 0xe7, 0x44, \n\t0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0xe7, 0x46, 0x00, 0x00, 0xe7, 0x46, \n\t0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0xe7, 0x4c, 0x00, 0x00, 0xe7, 0x4f, \n\t0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0xe7, 0x58, 0x00, 0x00, 0xe7, 0x6b, \n\t0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0xe7, 0x71, 0x00, 0x00, 0xe7, 0x71, \n\t0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0xe7, 0x76, 0x00, 0x00, 0xe7, 0x78, \n\t0x00, 0x00, 0x00, 0x8b, 0x00, 0x00, 0xe7, 0x88, 0x00, 0x00, 0xe7, 0x89, \n\t0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0xe7, 0x9a, 0x00, 0x00, 0xe7, 0x9a, \n\t0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0xe7, 0xa1, 0x00, 0x00, 0xe7, 0xa1, \n\t0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0xe8, 0x00, 0x00, 0x00, 0xe8, 0x00, \n\t0x00, 0x00, 0x00, 0x92, 0x00, 0x00, 0xf0, 0x20, 0x00, 0x00, 0xf0, 0x20, \n\t0x00, 0x00, 0x00, 0x93, 0x00, 0x00, 0xf6, 0x01, 0x00, 0x00, 0xf6, 0x01, \n\t0x00, 0x00, 0x00, 0x94, 0x00, 0x01, 0xf3, 0x04, 0x00, 0x01, 0xf3, 0x04, \n\t0x00, 0x00, 0x00, 0x95, 0x00, 0x01, 0xf3, 0x0e, 0x00, 0x01, 0xf3, 0x0e, \n\t0x00, 0x00, 0x00, 0x96, 0x00, 0x01, 0xf3, 0x42, 0x00, 0x01, 0xf3, 0x42, \n\t0x00, 0x00, 0x00, 0x97, 0x00, 0x01, 0xf3, 0x93, 0x00, 0x01, 0xf3, 0x94, \n\t0x00, 0x00, 0x00, 0x98, 0x00, 0x01, 0xf3, 0xa4, 0x00, 0x01, 0xf3, 0xa4, \n\t0x00, 0x00, 0x00, 0x9a, 0x00, 0x01, 0xf3, 0xa8, 0x00, 0x01, 0xf3, 0xa8, \n\t0x00, 0x00, 0x00, 0x9b, 0x00, 0x01, 0xf3, 0xab, 0x00, 0x01, 0xf3, 0xac, \n\t0x00, 0x00, 0x00, 0x9c, 0x00, 0x01, 0xf3, 0xaf, 0x00, 0x01, 0xf3, 0xaf, \n\t0x00, 0x00, 0x00, 0x9e, 0x00, 0x01, 0xf3, 0xb5, 0x00, 0x01, 0xf3, 0xb5, \n\t0x00, 0x00, 0x00, 0x9f, 0x00, 0x01, 0xf3, 0xc6, 0x00, 0x01, 0xf3, 0xc6, \n\t0x00, 0x00, 0x00, 0xa0, 0x00, 0x01, 0xf4, 0x4d, 0x00, 0x01, 0xf4, 0x4e, \n\t0x00, 0x00, 0x00, 0xa1, 0x00, 0x01, 0xf4, 0x5c, 0x00, 0x01, 0xf4, 0x5c, \n\t0x00, 0x00, 0x00, 0xa3, 0x00, 0x01, 0xf4, 0x64, 0x00, 0x01, 0xf4, 0x65, \n\t0x00, 0x00, 0x00, 0xa4, 0x00, 0x01, 0xf4, 0xa1, 0x00, 0x01, 0xf4, 0xa1, \n\t0x00, 0x00, 0x00, 0xa6, 0x00, 0x01, 0xf4, 0xa5, 0x00, 0x01, 0xf4, 0xa8, \n\t0x00, 0x00, 0x00, 0xa7, 0x00, 0x01, 0xf4, 0xb3, 0x00, 0x01, 0xf4, 0xb3, \n\t0x00, 0x00, 0x00, 0xab, 0x00, 0x01, 0xf4, 0xbb, 0x00, 0x01, 0xf4, 0xbc, \n\t0x00, 0x00, 0x00, 0xac, 0x00, 0x01, 0xf4, 0xbe, 0x00, 0x01, 0xf4, 0xbf, \n\t0x00, 0x00, 0x00, 0xae, 0x00, 0x01, 0xf4, 0xc1, 0x00, 0x01, 0xf4, 0xc1, \n\t0x00, 0x00, 0x00, 0xb0, 0x00, 0x01, 0xf4, 0xc4, 0x00, 0x01, 0xf4, 0xc5, \n\t0x00, 0x00, 0x00, 0xb1, 0x00, 0x01, 0xf4, 0xc8, 0x00, 0x01, 0xf4, 0xc8, \n\t0x00, 0x00, 0x00, 0xb3, 0x00, 0x01, 0xf4, 0xca, 0x00, 0x01, 0xf4, 0xcb, \n\t0x00, 0x00, 0x00, 0xb4, 0x00, 0x01, 0xf4, 0xce, 0x00, 0x01, 0xf4, 0xce, \n\t0x00, 0x00, 0x00, 0xb6, 0x00, 0x01, 0xf4, 0xd1, 0x00, 0x01, 0xf4, 0xd1, \n\t0x00, 0x00, 0x00, 0xb7, 0x00, 0x01, 0xf4, 0xd5, 0x00, 0x01, 0xf4, 0xd6, \n\t0x00, 0x00, 0x00, 0xb8, 0x00, 0x01, 0xf4, 0xde, 0x00, 0x01, 0xf4, 0xde, \n\t0x00, 0x00, 0x00, 0xba, 0x00, 0x01, 0xf4, 0xe3, 0x00, 0x01, 0xf4, 0xe6, \n\t0x00, 0x00, 0x00, 0xbb, 0x00, 0x01, 0xf4, 0xf0, 0x00, 0x01, 0xf4, 0xf1, \n\t0x00, 0x00, 0x00, 0xbf, 0x00, 0x01, 0xf4, 0xf6, 0x00, 0x01, 0xf4, 0xf8, \n\t0x00, 0x00, 0x00, 0xc1, 0x00, 0x01, 0xf4, 0xfd, 0x00, 0x01, 0xf5, 0x01, \n\t0x00, 0x00, 0x00, 0xc4, 0x00, 0x01, 0xf5, 0x04, 0x00, 0x01, 0xf5, 0x07, \n\t0x00, 0x00, 0x00, 0xc9, 0x00, 0x01, 0xf5, 0x0a, 0x00, 0x01, 0xf5, 0x0b, \n\t0x00, 0x00, 0x00, 0xcd, 0x00, 0x01, 0xf5, 0x0d, 0x00, 0x01, 0xf5, 0x0d, \n\t0x00, 0x00, 0x00, 0xcf, 0x00, 0x01, 0xf5, 0x11, 0x00, 0x01, 0xf5, 0x14, \n\t0x00, 0x00, 0x00, 0xd0, 0x00, 0x01, 0xf5, 0x16, 0x00, 0x01, 0xf5, 0x17, \n\t0x00, 0x00, 0x00, 0xd4, 0x00, 0x01, 0xf5, 0x19, 0x00, 0x01, 0xf5, 0x19, \n\t0x00, 0x00, 0x00, 0xd6, 0x00, 0x01, 0xf5, 0x26, 0x00, 0x01, 0xf5, 0x26, \n\t0x00, 0x00, 0x00, 0xd7, 0x00, 0x01, 0xf5, 0x3e, 0x00, 0x01, 0xf5, 0x3f, \n\t0x00, 0x00, 0x00, 0xd8, 0x00, 0x01, 0xf5, 0x45, 0x00, 0x01, 0xf5, 0x4f, \n\t0x00, 0x00, 0x00, 0xda, 0x00, 0x01, 0xf5, 0x54, 0x00, 0x01, 0xf5, 0x54, \n\t0x00, 0x00, 0x00, 0xe5, 0x00, 0x01, 0xf5, 0x68, 0x00, 0x01, 0xf5, 0x6c, \n\t0x00, 0x00, 0x00, 0xe6, 0x00, 0x01, 0xf5, 0xf9, 0x00, 0x01, 0xf5, 0xfa, \n\t0x00, 0x00, 0x00, 0xeb, 0x00, 0x01, 0xf6, 0x80, 0x00, 0x01, 0xf6, 0x80, \n\t0x00, 0x00, 0x00, 0xed, 0x00, 0x01, 0xf6, 0xab, 0x00, 0x01, 0xf6, 0xab, \n\t0x00, 0x00, 0x00, 0xee, 0x00, 0x01, 0xf6, 0xc6, 0x00, 0x01, 0xf6, 0xc8, \n\t0x00, 0x00, 0x00, 0xef, 0x00, 0x00, 0x01, 0x06, 0x00, 0x00, 0x01, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x02, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x1c, 0x00, 0x54, 0x00, 0x66, 0x00, 0x78, 0x00, 0x8a, 0x00, 0x9c, \n\t0x00, 0xb2, 0x00, 0xc8, 0x00, 0xe2, 0x01, 0x22, 0x01, 0x42, 0x01, 0x5a, \n\t0x01, 0x84, 0x01, 0xa6, 0x01, 0xce, 0x02, 0x32, 0x02, 0x64, 0x02, 0x90, \n\t0x02, 0xbc, 0x02, 0xe2, 0x03, 0x06, 0x03, 0x8c, 0x03, 0xa0, 0x03, 0xc0, \n\t0x03, 0xee, 0x04, 0x08, 0x04, 0x1e, 0x04, 0x2a, 0x04, 0x44, 0x04, 0x50, \n\t0x04, 0x5e, 0x04, 0x6a, 0x04, 0x7e, 0x05, 0x26, 0x05, 0x48, 0x05, 0x70, \n\t0x05, 0x86, 0x05, 0xae, 0x05, 0xde, 0x06, 0x14, 0x06, 0x30, 0x06, 0x6a, \n\t0x06, 0x88, 0x06, 0xb8, 0x06, 0xea, 0x07, 0x26, 0x07, 0x50, 0x07, 0xec, \n\t0x08, 0x42, 0x08, 0x6a, 0x08, 0x8c, 0x08, 0xe4, 0x09, 0x26, 0x09, 0x4e, \n\t0x09, 0x88, 0x09, 0xb6, 0x0a, 0x0a, 0x0a, 0x30, 0x0a, 0x56, 0x0a, 0x8a, \n\t0x0a, 0xba, 0x0b, 0x0a, 0x0b, 0x48, 0x0b, 0x66, 0x0b, 0x78, 0x0b, 0x88, \n\t0x0b, 0xb2, 0x0b, 0xca, 0x0b, 0xf2, 0x0c, 0x1a, 0x0c, 0x2a, 0x0c, 0x3a, \n\t0x0c, 0x4c, 0x0c, 0x98, 0x0c, 0xfc, 0x0d, 0x0c, 0x0d, 0x1c, 0x0d, 0x2c, \n\t0x0d, 0x3e, 0x0d, 0x8c, 0x0d, 0xf0, 0x0e, 0x36, 0x0e, 0x7a, 0x0e, 0xc8, \n\t0x0e, 0xf6, 0x0f, 0x12, 0x0f, 0x36, 0x0f, 0x66, 0x0f, 0x9e, 0x0f, 0xe2, \n\t0x10, 0x08, 0x10, 0x26, 0x10, 0x5a, 0x10, 0xa8, 0x10, 0xe8, 0x11, 0x0e, \n\t0x11, 0x58, 0x11, 0xa8, 0x11, 0xec, 0x12, 0x10, 0x12, 0x3c, 0x12, 0x7e, \n\t0x12, 0xa0, 0x12, 0xc8, 0x13, 0x06, 0x13, 0x4c, 0x13, 0x98, 0x13, 0xc6, \n\t0x13, 0xf4, 0x14, 0x10, 0x14, 0x2c, 0x14, 0x58, 0x14, 0xa6, 0x14, 0xea, \n\t0x14, 0xfc, 0x15, 0x26, 0x15, 0x52, 0x15, 0x7e, 0x15, 0xac, 0x15, 0xcc, \n\t0x15, 0xee, 0x16, 0x10, 0x16, 0x30, 0x16, 0x4e, 0x16, 0x6a, 0x16, 0x86, \n\t0x16, 0xa2, 0x16, 0xc0, 0x16, 0xde, 0x16, 0xfa, 0x17, 0x18, 0x17, 0x3c, \n\t0x17, 0x64, 0x17, 0x92, 0x17, 0xc6, 0x17, 0xf8, 0x18, 0x9a, 0x18, 0xd8, \n\t0x19, 0x1c, 0x19, 0x7a, 0x19, 0xb4, 0x19, 0xee, 0x1a, 0x2e, 0x1a, 0x8a, \n\t0x1a, 0x8a, 0x1a, 0xb4, 0x1a, 0xf2, 0x1b, 0x8c, 0x1b, 0xc0, 0x1c, 0x1a, \n\t0x1c, 0xb0, 0x1c, 0xf8, 0x1d, 0x32, 0x1d, 0x74, 0x1d, 0xae, 0x1d, 0xe0, \n\t0x1e, 0x20, 0x1e, 0x84, 0x1e, 0xc4, 0x1f, 0x06, 0x1f, 0x46, 0x1f, 0x88, \n\t0x1f, 0xfe, 0x20, 0x4c, 0x20, 0xd4, 0x21, 0x1c, 0x21, 0x56, 0x21, 0xe0, \n\t0x22, 0x3c, 0x22, 0x6e, 0x22, 0xb4, 0x22, 0xe0, 0x23, 0x00, 0x23, 0x34, \n\t0x23, 0x68, 0x23, 0x9e, 0x23, 0xf0, 0x24, 0x1a, 0x24, 0x44, 0x24, 0x9c, \n\t0x24, 0xc2, 0x24, 0xfe, 0x25, 0x4e, 0x25, 0x8a, 0x25, 0xe8, 0x26, 0x22, \n\t0x26, 0x5a, 0x26, 0x84, 0x26, 0xd2, 0x27, 0x04, 0x27, 0x40, 0x27, 0x8e, \n\t0x27, 0xd2, 0x28, 0x0c, 0x28, 0x6a, 0x28, 0x9c, 0x28, 0xea, 0x29, 0x12, \n\t0x29, 0x48, 0x29, 0xce, 0x2a, 0x7a, 0x2a, 0xca, 0x2b, 0x3c, 0x2b, 0x94, \n\t0x2b, 0xc0, 0x2c, 0x0e, 0x2c, 0x42, 0x2c, 0x74, 0x2c, 0xcc, 0x2c, 0xe2, \n\t0x2d, 0x48, 0x2d, 0x66, 0x2d, 0xb0, 0x2d, 0xd8, 0x2e, 0x12, 0x2e, 0x80, \n\t0x2e, 0xc0, 0x2f, 0x28, 0x2f, 0x8e, 0x2f, 0xe2, 0x30, 0x32, 0x30, 0x62, \n\t0x30, 0xba, 0x31, 0x0c, 0x31, 0x64, 0x31, 0xba, 0x31, 0xe6, 0x32, 0x4a, \n\t0x32, 0xb4, 0x33, 0x42, 0x33, 0x7e, 0x33, 0xf0, 0x34, 0x48, 0x34, 0x60, \n\t0x34, 0xb2, 0x34, 0xe8, 0x35, 0x22, 0x35, 0x6e, 0x35, 0xb6, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x32, 0x00, 0x4b, 0x01, 0x3b, 0x01, 0xa9, 0x00, 0x07, \n\t0x00, 0x0f, 0x00, 0x00, 0x12, 0x32, 0x15, 0x11, 0x14, 0x22, 0x35, 0x11, \n\t0x26, 0x32, 0x15, 0x11, 0x14, 0x22, 0x35, 0x11, 0xe1, 0x5a, 0x5a, 0xaf, \n\t0x5a, 0x5a, 0x01, 0xa9, 0x20, 0xfe, 0xe3, 0x21, 0x21, 0x01, 0x1d, 0x20, \n\t0x20, 0xfe, 0xe3, 0x21, 0x21, 0x01, 0x1d, 0x00, 0x00, 0x02, 0x00, 0x32, \n\t0x00, 0x00, 0x01, 0x18, 0x01, 0xf4, 0x00, 0x0b, 0x00, 0x22, 0x00, 0x00, \n\t0x13, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x37, 0x34, 0x36, \n\t0x03, 0x22, 0x3f, 0x01, 0x36, 0x23, 0x22, 0x06, 0x07, 0x27, 0x3e, 0x01, \n\t0x33, 0x32, 0x0f, 0x01, 0x06, 0x33, 0x32, 0x37, 0x17, 0x0e, 0x01, 0xe2, \n\t0x18, 0x1a, 0x27, 0x1c, 0x18, 0x1a, 0x01, 0x23, 0x48, 0x32, 0x17, 0x1e, \n\t0x07, 0x07, 0x06, 0x2a, 0x0f, 0x0d, 0x2d, 0x63, 0x1a, 0x27, 0x15, 0x23, \n\t0x08, 0x0b, 0x16, 0x25, 0x0f, 0x2a, 0x5b, 0x01, 0xf4, 0x1b, 0x15, 0x19, \n\t0x26, 0x1a, 0x17, 0x17, 0x27, 0xfe, 0x0c, 0x59, 0x7f, 0x1c, 0x12, 0x0a, \n\t0x16, 0x27, 0x30, 0x51, 0x85, 0x20, 0x1e, 0x14, 0x2b, 0x2e, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x32, 0x00, 0x7d, 0x02, 0x1c, 0x01, 0x77, 0x00, 0x06, \n\t0x00, 0x00, 0x37, 0x27, 0x37, 0x15, 0x21, 0x15, 0x21, 0xaa, 0x78, 0x78, \n\t0x01, 0x72, 0xfe, 0x8e, 0x7d, 0x7d, 0x7d, 0x50, 0x59, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x32, 0x00, 0x05, 0x01, 0x2c, 0x01, 0xef, 0x00, 0x06, \n\t0x00, 0x00, 0x01, 0x23, 0x11, 0x23, 0x11, 0x23, 0x37, 0x01, 0x2c, 0x51, \n\t0x58, 0x51, 0x7d, 0x01, 0x78, 0xfe, 0x8d, 0x01, 0x73, 0x77, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x32, 0x00, 0x7d, 0x02, 0x1c, 0x01, 0x77, 0x00, 0x06, \n\t0x00, 0x00, 0x25, 0x35, 0x21, 0x35, 0x21, 0x35, 0x17, 0x01, 0xa5, 0xfe, \n\t0x8d, 0x01, 0x73, 0x77, 0x7d, 0x51, 0x59, 0x50, 0x7d, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x32, 0x00, 0x05, 0x01, 0x2c, 0x01, 0xef, 0x00, 0x06, \n\t0x00, 0x00, 0x25, 0x07, 0x27, 0x33, 0x11, 0x33, 0x11, 0x01, 0x2c, 0x7d, \n\t0x7d, 0x51, 0x58, 0x7d, 0x78, 0x78, 0x01, 0x72, 0xfe, 0x8e, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x32, 0x00, 0x82, 0x01, 0xdb, 0x01, 0x72, 0x00, 0x0b, \n\t0x00, 0x00, 0x37, 0x15, 0x27, 0x37, 0x15, 0x21, 0x32, 0x16, 0x1d, 0x01, \n\t0x23, 0x35, 0x96, 0x64, 0x64, 0x01, 0x13, 0x14, 0x1e, 0x46, 0xfa, 0x2d, \n\t0x50, 0x55, 0x32, 0x1d, 0x15, 0x8c, 0x78, 0x00, 0x00, 0x01, 0x00, 0x32, \n\t0x00, 0x64, 0x01, 0xa6, 0x01, 0x90, 0x00, 0x0b, 0x00, 0x00, 0x37, 0x22, \n\t0x26, 0x3d, 0x01, 0x33, 0x15, 0x33, 0x35, 0x17, 0x07, 0x35, 0x64, 0x15, \n\t0x1d, 0x46, 0xb6, 0x78, 0x78, 0xaf, 0x1e, 0x14, 0xaf, 0x9b, 0x4b, 0x6e, \n\t0x6e, 0x4b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x32, 0x00, 0x51, 0x02, 0x26, \n\t0x01, 0xa5, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x15, 0x23, 0x15, \n\t0x27, 0x37, 0x15, 0x05, 0x07, 0x35, 0x23, 0x35, 0x33, 0x35, 0x01, 0x90, \n\t0xfa, 0x64, 0x64, 0x01, 0x90, 0x64, 0xfa, 0xfa, 0x01, 0x73, 0x46, 0x2d, \n\t0x50, 0x55, 0x32, 0xd2, 0x50, 0x2d, 0x46, 0x32, 0x00, 0x03, 0x00, 0x32, \n\t0x00, 0x8c, 0x02, 0x26, 0x01, 0x68, 0x00, 0x17, 0x00, 0x20, 0x00, 0x29, \n\t0x00, 0x00, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, \n\t0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, \n\t0x3e, 0x01, 0x05, 0x32, 0x36, 0x37, 0x2e, 0x01, 0x23, 0x22, 0x14, 0x21, \n\t0x32, 0x34, 0x23, 0x22, 0x06, 0x07, 0x1e, 0x01, 0x01, 0xc0, 0x2a, 0x3c, \n\t0x3c, 0x2a, 0x27, 0x4f, 0x1e, 0x1d, 0x4f, 0x27, 0x2b, 0x3c, 0x3c, 0x2b, \n\t0x27, 0x4f, 0x1d, 0x1d, 0x50, 0xff, 0x00, 0x1e, 0x43, 0x17, 0x17, 0x42, \n\t0x1f, 0x39, 0x01, 0x60, 0x39, 0x39, 0x1f, 0x43, 0x16, 0x16, 0x43, 0x01, \n\t0x68, 0x35, 0x39, 0x38, 0x36, 0x28, 0x21, 0x21, 0x28, 0x36, 0x38, 0x39, \n\t0x35, 0x27, 0x21, 0x21, 0x27, 0xb0, 0x25, 0x1d, 0x1d, 0x25, 0x84, 0x84, \n\t0x25, 0x1d, 0x1d, 0x25, 0x00, 0x02, 0x00, 0x32, 0x00, 0x28, 0x01, 0xd6, \n\t0x01, 0xcc, 0x00, 0x07, 0x00, 0x13, 0x00, 0x00, 0x12, 0x32, 0x16, 0x14, \n\t0x06, 0x22, 0x26, 0x34, 0x17, 0x33, 0x35, 0x23, 0x35, 0x23, 0x15, 0x23, \n\t0x15, 0x33, 0x15, 0x33, 0xad, 0xae, 0x7b, 0x7b, 0xae, 0x7b, 0xec, 0x64, \n\t0x64, 0x33, 0x65, 0x65, 0x33, 0x01, 0xcc, 0x7b, 0xae, 0x7b, 0x7b, 0xae, \n\t0x70, 0x33, 0x65, 0x65, 0x33, 0x65, 0x00, 0x00, 0x00, 0x02, 0x00, 0x32, \n\t0x00, 0x28, 0x01, 0xd6, 0x01, 0xcc, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, \n\t0x12, 0x32, 0x16, 0x14, 0x06, 0x22, 0x26, 0x34, 0x05, 0x23, 0x15, 0x33, \n\t0xad, 0xae, 0x7b, 0x7b, 0xae, 0x7b, 0x01, 0x50, 0xfc, 0xfc, 0x01, 0xcc, \n\t0x7b, 0xae, 0x7b, 0x7b, 0xae, 0x3d, 0x33, 0x00, 0x00, 0x02, 0x00, 0x32, \n\t0x00, 0x32, 0x01, 0xc2, 0x01, 0xc2, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x00, \n\t0x01, 0x32, 0x16, 0x15, 0x11, 0x14, 0x06, 0x23, 0x21, 0x22, 0x26, 0x35, \n\t0x11, 0x34, 0x36, 0x33, 0x05, 0x35, 0x23, 0x35, 0x23, 0x15, 0x23, 0x15, \n\t0x33, 0x15, 0x33, 0x35, 0x01, 0x90, 0x15, 0x1d, 0x1d, 0x15, 0xfe, 0xd4, \n\t0x14, 0x1e, 0x1e, 0x14, 0x01, 0x13, 0x64, 0x32, 0x64, 0x64, 0x32, 0x01, \n\t0xc2, 0x1d, 0x15, 0xfe, 0xd4, 0x14, 0x1e, 0x1e, 0x14, 0x01, 0x2c, 0x15, \n\t0x1d, 0xe1, 0x32, 0x64, 0x64, 0x32, 0x64, 0x64, 0x00, 0x02, 0x00, 0x32, \n\t0x00, 0x32, 0x01, 0xc2, 0x01, 0xc2, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x00, \n\t0x01, 0x32, 0x16, 0x15, 0x11, 0x14, 0x06, 0x23, 0x21, 0x22, 0x26, 0x35, \n\t0x11, 0x34, 0x36, 0x33, 0x05, 0x35, 0x23, 0x15, 0x01, 0x90, 0x15, 0x1d, \n\t0x1d, 0x15, 0xfe, 0xd4, 0x14, 0x1e, 0x1e, 0x14, 0x01, 0x13, 0xfa, 0x01, \n\t0xc2, 0x1d, 0x15, 0xfe, 0xd4, 0x14, 0x1e, 0x1e, 0x14, 0x01, 0x2c, 0x15, \n\t0x1d, 0xe1, 0x32, 0x32, 0x00, 0x01, 0x00, 0x32, 0x00, 0x31, 0x01, 0xf5, \n\t0x01, 0xc4, 0x00, 0x1a, 0x00, 0x00, 0x25, 0x16, 0x06, 0x2b, 0x01, 0x15, \n\t0x14, 0x0e, 0x01, 0x2b, 0x01, 0x35, 0x23, 0x15, 0x23, 0x22, 0x26, 0x3d, \n\t0x01, 0x23, 0x22, 0x26, 0x3f, 0x01, 0x36, 0x32, 0x17, 0x01, 0xee, 0x08, \n\t0x05, 0x0b, 0x2a, 0x01, 0x07, 0x08, 0x66, 0x66, 0x61, 0x0e, 0x07, 0x2a, \n\t0x0b, 0x05, 0x08, 0xc8, 0x08, 0x16, 0x08, 0xf3, 0x08, 0x0b, 0x9b, 0x07, \n\t0x07, 0x06, 0x9b, 0x9b, 0x0a, 0x0a, 0x9b, 0x0b, 0x08, 0xc9, 0x08, 0x08, \n\t0x00, 0x0e, 0x00, 0x32, 0x00, 0x64, 0x02, 0x26, 0x01, 0x90, 0x00, 0x0f, \n\t0x00, 0x13, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x23, 0x00, 0x27, \n\t0x00, 0x2b, 0x00, 0x2f, 0x00, 0x33, 0x00, 0x37, 0x00, 0x3b, 0x00, 0x3f, \n\t0x00, 0x43, 0x00, 0x00, 0x01, 0x32, 0x16, 0x1d, 0x01, 0x14, 0x06, 0x23, \n\t0x21, 0x22, 0x26, 0x3d, 0x01, 0x34, 0x36, 0x33, 0x17, 0x15, 0x33, 0x35, \n\t0x17, 0x23, 0x15, 0x33, 0x27, 0x15, 0x33, 0x35, 0x17, 0x23, 0x15, 0x33, \n\t0x27, 0x15, 0x33, 0x35, 0x17, 0x23, 0x15, 0x33, 0x27, 0x15, 0x33, 0x35, \n\t0x17, 0x23, 0x15, 0x33, 0x07, 0x35, 0x23, 0x15, 0x21, 0x35, 0x23, 0x15, \n\t0x21, 0x35, 0x23, 0x15, 0x27, 0x33, 0x35, 0x23, 0x37, 0x35, 0x23, 0x15, \n\t0x02, 0x03, 0x0e, 0x15, 0x15, 0x0e, 0xfe, 0x52, 0x0e, 0x15, 0x15, 0x0e, \n\t0xf0, 0x32, 0x19, 0x32, 0x32, 0x96, 0x32, 0x19, 0x32, 0x32, 0x96, 0x32, \n\t0x19, 0x32, 0x32, 0x96, 0x32, 0x19, 0x32, 0x32, 0x19, 0x32, 0x01, 0x45, \n\t0xfa, 0x01, 0x45, 0x32, 0x19, 0x32, 0x32, 0x4b, 0x64, 0x01, 0x90, 0x15, \n\t0x0e, 0xe6, 0x0f, 0x14, 0x14, 0x0f, 0xe6, 0x0e, 0x15, 0x32, 0x32, 0x32, \n\t0x4b, 0x32, 0x7d, 0x32, 0x32, 0x4b, 0x32, 0x7d, 0x32, 0x32, 0x4b, 0x32, \n\t0x7d, 0x32, 0x32, 0x4b, 0x32, 0x4b, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, \n\t0x4b, 0x32, 0x19, 0x32, 0x32, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x32, \n\t0x00, 0x4b, 0x02, 0x26, 0x01, 0xa9, 0x00, 0x10, 0x00, 0x1c, 0x00, 0x00, \n\t0x01, 0x32, 0x16, 0x1d, 0x01, 0x14, 0x06, 0x2b, 0x01, 0x22, 0x2f, 0x01, \n\t0x26, 0x3f, 0x01, 0x36, 0x33, 0x13, 0x37, 0x27, 0x37, 0x27, 0x07, 0x27, \n\t0x07, 0x17, 0x07, 0x17, 0x37, 0x01, 0xf4, 0x15, 0x1d, 0x1d, 0x15, 0xef, \n\t0x13, 0x10, 0xaa, 0x0e, 0x0e, 0xaa, 0x0f, 0x14, 0xa9, 0x24, 0x40, 0x40, \n\t0x24, 0x40, 0x40, 0x24, 0x40, 0x40, 0x24, 0x40, 0x01, 0xa9, 0x1d, 0x15, \n\t0xfa, 0x14, 0x1e, 0x0e, 0x94, 0x0d, 0x0e, 0x94, 0x0d, 0xfe, 0xed, 0x25, \n\t0x3f, 0x40, 0x24, 0x3f, 0x3f, 0x24, 0x40, 0x3f, 0x25, 0x40, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x32, 0x00, 0x6e, 0x01, 0xea, 0x01, 0x87, 0x00, 0x0c, \n\t0x00, 0x19, 0x00, 0x00, 0x01, 0x16, 0x15, 0x14, 0x0f, 0x01, 0x06, 0x26, \n\t0x3d, 0x01, 0x34, 0x36, 0x17, 0x07, 0x16, 0x15, 0x14, 0x0f, 0x01, 0x06, \n\t0x26, 0x3d, 0x01, 0x34, 0x36, 0x17, 0x01, 0xe3, 0x07, 0x07, 0xba, 0x0b, \n\t0x0f, 0x0f, 0x0b, 0x29, 0x07, 0x07, 0xb4, 0x0a, 0x10, 0x10, 0x0a, 0x01, \n\t0x06, 0x05, 0x07, 0x07, 0x04, 0x7c, 0x07, 0x08, 0x0e, 0xf1, 0x0e, 0x08, \n\t0x07, 0x7c, 0x05, 0x07, 0x07, 0x04, 0x7c, 0x07, 0x08, 0x0e, 0xf1, 0x0e, \n\t0x08, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x32, 0x00, 0x6e, 0x01, 0xea, \n\t0x01, 0x87, 0x00, 0x0c, 0x00, 0x19, 0x00, 0x00, 0x37, 0x34, 0x3f, 0x01, \n\t0x36, 0x16, 0x1d, 0x01, 0x14, 0x06, 0x2f, 0x01, 0x26, 0x37, 0x34, 0x3f, \n\t0x01, 0x36, 0x16, 0x1d, 0x01, 0x14, 0x06, 0x2f, 0x01, 0x26, 0x32, 0x07, \n\t0xbb, 0x0a, 0x10, 0x10, 0x0a, 0xbb, 0x07, 0xe3, 0x07, 0xb4, 0x0a, 0x10, \n\t0x10, 0x0a, 0xb4, 0x07, 0xfa, 0x07, 0x05, 0x7c, 0x07, 0x08, 0x0e, 0xf1, \n\t0x0e, 0x08, 0x07, 0x7c, 0x04, 0x07, 0x07, 0x05, 0x7c, 0x07, 0x08, 0x0e, \n\t0xf1, 0x0e, 0x08, 0x07, 0x7c, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x32, \n\t0x00, 0x69, 0x01, 0x5e, 0x01, 0x8c, 0x00, 0x0c, 0x00, 0x16, 0x00, 0x00, \n\t0x01, 0x16, 0x15, 0x14, 0x0f, 0x01, 0x06, 0x26, 0x3d, 0x01, 0x34, 0x36, \n\t0x17, 0x37, 0x32, 0x1d, 0x01, 0x14, 0x23, 0x22, 0x3d, 0x01, 0x34, 0x01, \n\t0x00, 0x07, 0x07, 0xb5, 0x0b, 0x0e, 0x0e, 0x0b, 0xee, 0x25, 0x25, 0x26, \n\t0x01, 0x06, 0x05, 0x07, 0x06, 0x05, 0x72, 0x07, 0x09, 0x0d, 0xdd, 0x0d, \n\t0x09, 0x07, 0x14, 0x1d, 0xe9, 0x1d, 0x1d, 0xe9, 0x1d, 0x00, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x32, 0x00, 0x69, 0x01, 0x5e, 0x01, 0x8c, 0x00, 0x0c, \n\t0x00, 0x16, 0x00, 0x00, 0x37, 0x34, 0x3f, 0x01, 0x36, 0x16, 0x1d, 0x01, \n\t0x14, 0x06, 0x2f, 0x01, 0x26, 0x27, 0x34, 0x33, 0x32, 0x1d, 0x01, 0x14, \n\t0x23, 0x22, 0x35, 0x89, 0x07, 0xb6, 0x0a, 0x0e, 0x0e, 0x0a, 0xb6, 0x07, \n\t0x57, 0x26, 0x25, 0x25, 0x26, 0xfa, 0x07, 0x05, 0x72, 0x07, 0x09, 0x0d, \n\t0xdd, 0x0d, 0x09, 0x07, 0x72, 0x05, 0x7b, 0x1d, 0x1d, 0xe9, 0x1d, 0x1d, \n\t0x00, 0x03, 0x00, 0x32, 0x00, 0x00, 0x01, 0x4a, 0x01, 0xf4, 0x00, 0x1b, \n\t0x00, 0x29, 0x00, 0x63, 0x00, 0x00, 0x01, 0x14, 0x0e, 0x01, 0x14, 0x1e, \n\t0x01, 0x1d, 0x01, 0x14, 0x06, 0x22, 0x26, 0x3d, 0x01, 0x34, 0x3e, 0x01, \n\t0x34, 0x2e, 0x01, 0x3d, 0x01, 0x34, 0x36, 0x32, 0x16, 0x15, 0x07, 0x30, \n\t0x07, 0x06, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x27, 0x26, 0x23, 0x22, \n\t0x17, 0x34, 0x3e, 0x03, 0x37, 0x36, 0x35, 0x37, 0x06, 0x22, 0x27, 0x17, \n\t0x14, 0x17, 0x1e, 0x06, 0x15, 0x14, 0x0e, 0x07, 0x07, 0x06, 0x1d, 0x01, \n\t0x3e, 0x02, 0x35, 0x34, 0x32, 0x15, 0x14, 0x1e, 0x01, 0x17, 0x35, 0x34, \n\t0x27, 0x2e, 0x06, 0x01, 0x4a, 0x30, 0x31, 0x31, 0x30, 0x56, 0x6c, 0x56, \n\t0x30, 0x31, 0x31, 0x30, 0x57, 0x6a, 0x57, 0xf1, 0x09, 0x02, 0x04, 0x2e, \n\t0x3e, 0x42, 0x2c, 0x07, 0x0f, 0x30, 0x35, 0x3c, 0x48, 0x04, 0x0e, 0x06, \n\t0x19, 0x02, 0x2e, 0x01, 0x32, 0x7a, 0x32, 0x02, 0x2d, 0x03, 0x10, 0x07, \n\t0x0c, 0x05, 0x06, 0x03, 0x01, 0x05, 0x03, 0x08, 0x04, 0x0b, 0x05, 0x0d, \n\t0x02, 0x2d, 0x04, 0x3a, 0x22, 0x1a, 0x21, 0x3d, 0x03, 0x2e, 0x02, 0x11, \n\t0x05, 0x0d, 0x05, 0x07, 0x02, 0x01, 0x82, 0x16, 0x34, 0x2f, 0x1e, 0x2e, \n\t0x33, 0x17, 0x3b, 0x11, 0x27, 0x27, 0x11, 0x3b, 0x17, 0x33, 0x2e, 0x1e, \n\t0x2f, 0x34, 0x16, 0x3b, 0x10, 0x27, 0x27, 0x10, 0x03, 0x07, 0x04, 0x03, \n\t0x1a, 0x19, 0x05, 0x0a, 0x1b, 0xdb, 0x09, 0x0f, 0x12, 0x07, 0x18, 0x02, \n\t0x2e, 0x0f, 0x19, 0x1b, 0x1b, 0x19, 0x10, 0x2d, 0x03, 0x0f, 0x07, 0x0c, \n\t0x09, 0x0b, 0x0c, 0x06, 0x05, 0x09, 0x09, 0x07, 0x0a, 0x05, 0x0b, 0x04, \n\t0x0c, 0x02, 0x2d, 0x10, 0x21, 0x02, 0x13, 0x18, 0x11, 0x0f, 0x0f, 0x11, \n\t0x18, 0x13, 0x02, 0x21, 0x0f, 0x2e, 0x02, 0x10, 0x05, 0x0e, 0x08, 0x0c, \n\t0x0b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x32, 0x00, 0xc3, 0x00, 0xa0, \n\t0x01, 0x31, 0x00, 0x09, 0x00, 0x00, 0x12, 0x32, 0x16, 0x15, 0x14, 0x06, \n\t0x22, 0x26, 0x35, 0x34, 0x52, 0x2e, 0x20, 0x20, 0x2e, 0x20, 0x01, 0x31, \n\t0x20, 0x17, 0x16, 0x21, 0x21, 0x16, 0x17, 0x00, 0x00, 0x02, 0x00, 0x32, \n\t0x00, 0xc3, 0x01, 0x4f, 0x01, 0x31, 0x00, 0x08, 0x00, 0x12, 0x00, 0x00, \n\t0x12, 0x32, 0x16, 0x15, 0x14, 0x06, 0x22, 0x26, 0x34, 0x36, 0x32, 0x16, \n\t0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x34, 0x52, 0x2e, 0x20, 0x20, 0x2e, \n\t0x20, 0xcf, 0x2e, 0x20, 0x21, 0x16, 0x17, 0x20, 0x01, 0x31, 0x20, 0x17, \n\t0x16, 0x21, 0x20, 0x2e, 0x20, 0x20, 0x17, 0x16, 0x21, 0x20, 0x2e, 0x00, \n\t0x00, 0x03, 0x00, 0x32, 0x00, 0xc3, 0x01, 0xfe, 0x01, 0x31, 0x00, 0x09, \n\t0x00, 0x13, 0x00, 0x1d, 0x00, 0x00, 0x12, 0x32, 0x16, 0x15, 0x14, 0x06, \n\t0x22, 0x26, 0x35, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x22, 0x26, \n\t0x35, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x22, 0x26, 0x35, 0x34, \n\t0x52, 0x2e, 0x20, 0x20, 0x2e, 0x20, 0xcf, 0x2e, 0x20, 0x21, 0x2c, 0x21, \n\t0xcf, 0x2e, 0x20, 0x20, 0x2e, 0x20, 0x01, 0x31, 0x20, 0x17, 0x16, 0x21, \n\t0x21, 0x16, 0x17, 0x20, 0x20, 0x17, 0x16, 0x21, 0x21, 0x16, 0x17, 0x20, \n\t0x20, 0x17, 0x16, 0x21, 0x21, 0x16, 0x17, 0x00, 0x00, 0x01, 0x00, 0x32, \n\t0x00, 0x7d, 0x01, 0xf2, 0x01, 0x79, 0x00, 0x0c, 0x00, 0x00, 0x25, 0x14, \n\t0x06, 0x23, 0x21, 0x22, 0x26, 0x36, 0x37, 0x25, 0x36, 0x16, 0x15, 0x01, \n\t0xf2, 0x18, 0x10, 0xfe, 0x7a, 0x0b, 0x09, 0x06, 0x09, 0x01, 0x91, 0x0e, \n\t0x14, 0xa5, 0x11, 0x17, 0x05, 0x0a, 0x05, 0xe2, 0x09, 0x0b, 0x11, 0x00, \n\t0x00, 0x01, 0x00, 0x32, 0x00, 0x64, 0x01, 0x5e, 0x01, 0x90, 0x00, 0x0c, \n\t0x00, 0x00, 0x01, 0x32, 0x1d, 0x01, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, \n\t0x34, 0x36, 0x33, 0x01, 0x39, 0x25, 0x25, 0xe1, 0x26, 0x12, 0x14, 0x01, \n\t0x90, 0x20, 0xeb, 0x21, 0x21, 0xeb, 0x12, 0x0e, 0x00, 0x01, 0x00, 0x32, \n\t0x00, 0x96, 0x01, 0x18, 0x01, 0x5e, 0x00, 0x02, 0x00, 0x00, 0x3f, 0x01, \n\t0x17, 0x32, 0x73, 0x73, 0x96, 0xc8, 0xc8, 0x00, 0x00, 0x01, 0x00, 0x32, \n\t0x00, 0x64, 0x01, 0x2c, 0x01, 0x91, 0x00, 0x0c, 0x00, 0x00, 0x01, 0x16, \n\t0x15, 0x14, 0x0f, 0x01, 0x06, 0x26, 0x35, 0x11, 0x34, 0x36, 0x17, 0x01, \n\t0x25, 0x07, 0x07, 0xd6, 0x0c, 0x11, 0x11, 0x0c, 0x01, 0x07, 0x05, 0x08, \n\t0x07, 0x05, 0x85, 0x08, 0x0a, 0x0f, 0x01, 0x01, 0x0f, 0x0a, 0x08, 0x00, \n\t0x00, 0x01, 0x00, 0x32, 0x00, 0x87, 0x00, 0xfa, 0x01, 0x6d, 0x00, 0x02, \n\t0x00, 0x00, 0x13, 0x17, 0x07, 0x32, 0xc8, 0xc8, 0x01, 0x6d, 0x73, 0x73, \n\t0x00, 0x01, 0x00, 0x32, 0x00, 0x96, 0x01, 0x18, 0x01, 0x5e, 0x00, 0x02, \n\t0x00, 0x00, 0x01, 0x07, 0x27, 0x01, 0x18, 0x73, 0x73, 0x01, 0x5e, 0xc8, \n\t0xc8, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x32, 0x00, 0x87, 0x00, 0xfa, \n\t0x01, 0x6d, 0x00, 0x02, 0x00, 0x00, 0x13, 0x15, 0x27, 0xfa, 0xc8, 0x01, \n\t0x6d, 0xe6, 0x73, 0x00, 0x00, 0x01, 0x00, 0x32, 0x00, 0x4b, 0x01, 0x90, \n\t0x01, 0xa9, 0x00, 0x09, 0x00, 0x00, 0x12, 0x32, 0x16, 0x15, 0x14, 0x06, \n\t0x22, 0x26, 0x35, 0x34, 0x98, 0x92, 0x66, 0x66, 0x92, 0x66, 0x01, 0xa9, \n\t0x66, 0x49, 0x48, 0x67, 0x67, 0x48, 0x49, 0x00, 0x00, 0x0a, 0x00, 0x32, \n\t0x00, 0x00, 0x02, 0x26, 0x01, 0xf4, 0x00, 0x0b, 0x00, 0x15, 0x00, 0x1c, \n\t0x00, 0x28, 0x00, 0x34, 0x00, 0x40, 0x00, 0x4a, 0x00, 0x58, 0x00, 0x66, \n\t0x00, 0x6f, 0x00, 0x00, 0x01, 0x32, 0x16, 0x15, 0x14, 0x2b, 0x01, 0x22, \n\t0x35, 0x34, 0x36, 0x33, 0x24, 0x32, 0x16, 0x15, 0x14, 0x06, 0x22, 0x26, \n\t0x35, 0x34, 0x17, 0x35, 0x22, 0x06, 0x15, 0x14, 0x16, 0x27, 0x14, 0x2b, \n\t0x01, 0x22, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x32, 0x16, 0x36, 0x22, 0x26, \n\t0x3d, 0x01, 0x34, 0x36, 0x32, 0x16, 0x1d, 0x01, 0x14, 0x02, 0x32, 0x16, \n\t0x1d, 0x01, 0x14, 0x06, 0x22, 0x26, 0x3d, 0x01, 0x34, 0x13, 0x07, 0x06, \n\t0x27, 0x26, 0x37, 0x36, 0x37, 0x36, 0x16, 0x01, 0x3e, 0x01, 0x17, 0x16, \n\t0x06, 0x0f, 0x01, 0x0e, 0x01, 0x27, 0x26, 0x37, 0x36, 0x13, 0x17, 0x16, \n\t0x07, 0x06, 0x26, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x37, 0x36, 0x16, 0x01, \n\t0x26, 0x36, 0x1f, 0x01, 0x16, 0x06, 0x27, 0x26, 0x02, 0x0d, 0x0a, 0x0f, \n\t0x19, 0x18, 0x19, 0x0f, 0x0a, 0xfe, 0xfe, 0x72, 0x51, 0x51, 0x72, 0x50, \n\t0x8c, 0x2b, 0x3c, 0x3c, 0x87, 0x19, 0x19, 0x19, 0x0f, 0x0a, 0x19, 0x0a, \n\t0x0f, 0xb7, 0x10, 0x0c, 0x0c, 0x10, 0x0c, 0x1c, 0x10, 0x0c, 0x0c, 0x10, \n\t0x0c, 0xcc, 0x11, 0x11, 0x0f, 0x0e, 0x12, 0x02, 0x0f, 0x12, 0x1c, 0xfe, \n\t0x90, 0x07, 0x13, 0x05, 0x06, 0x02, 0x07, 0x12, 0x07, 0x13, 0x05, 0x0f, \n\t0x12, 0x03, 0x19, 0x12, 0x12, 0x0f, 0x05, 0x13, 0x07, 0x0f, 0x03, 0x07, \n\t0x02, 0x06, 0x05, 0x13, 0x01, 0x2e, 0x12, 0x1c, 0x12, 0x11, 0x12, 0x1c, \n\t0x12, 0x0f, 0x01, 0x0e, 0x0c, 0x08, 0x14, 0x14, 0x08, 0x0c, 0x75, 0x50, \n\t0x39, 0x3a, 0x50, 0x50, 0x3a, 0x39, 0x9d, 0xc8, 0x3b, 0x29, 0x2a, 0x3a, \n\t0x64, 0x14, 0x14, 0x08, 0x0c, 0x0c, 0xa7, 0x0f, 0x0a, 0x19, 0x0a, 0x0f, \n\t0x0f, 0x0a, 0x19, 0x0a, 0xfe, 0x93, 0x0f, 0x0a, 0x19, 0x0a, 0x0f, 0x0f, \n\t0x0a, 0x19, 0x0a, 0x01, 0x59, 0x11, 0x11, 0x0d, 0x0e, 0x12, 0x03, 0x0f, \n\t0x11, 0x1c, 0xfe, 0xc8, 0x08, 0x02, 0x06, 0x06, 0x13, 0x07, 0x12, 0x07, \n\t0x02, 0x06, 0x0e, 0x12, 0x02, 0x01, 0x52, 0x12, 0x12, 0x0e, 0x05, 0x02, \n\t0x07, 0x0f, 0x02, 0x07, 0x13, 0x06, 0x06, 0x02, 0xfe, 0x9a, 0x12, 0x1c, \n\t0x12, 0x11, 0x12, 0x1c, 0x11, 0x0f, 0x00, 0x00, 0x00, 0x02, 0x00, 0x32, \n\t0x00, 0x28, 0x01, 0xd6, 0x01, 0xcc, 0x00, 0x04, 0x00, 0x12, 0x00, 0x00, \n\t0x13, 0x15, 0x23, 0x3e, 0x01, 0x37, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, \n\t0x22, 0x26, 0x27, 0x33, 0x32, 0x36, 0x35, 0xea, 0xb8, 0x09, 0x67, 0x7d, \n\t0x4e, 0x69, 0x7b, 0x58, 0x50, 0x76, 0x0b, 0xd4, 0x0a, 0x0f, 0x01, 0xcc, \n\t0xb8, 0x49, 0x67, 0x08, 0x0a, 0x77, 0x50, 0x57, 0x7c, 0x69, 0x4f, 0x0e, \n\t0x0b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x32, 0x00, 0x58, 0x02, 0x26, \n\t0x01, 0x9d, 0x00, 0x18, 0x00, 0x00, 0x01, 0x32, 0x16, 0x14, 0x06, 0x23, \n\t0x21, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x33, 0x26, 0x35, \n\t0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x36, 0x01, 0xae, 0x32, 0x46, 0x46, \n\t0x32, 0xfe, 0xdf, 0x25, 0x36, 0x35, 0x26, 0x01, 0x08, 0x01, 0x01, 0x4e, \n\t0x37, 0x2d, 0x46, 0x0c, 0x0e, 0x01, 0x42, 0x44, 0x62, 0x44, 0x34, 0x24, \n\t0x25, 0x34, 0x01, 0x06, 0x0d, 0x36, 0x4c, 0x34, 0x29, 0x02, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x32, 0x00, 0x1e, 0x01, 0xea, 0x01, 0xd6, 0x00, 0x09, \n\t0x00, 0x00, 0x01, 0x17, 0x33, 0x07, 0x17, 0x27, 0x07, 0x37, 0x27, 0x33, \n\t0x01, 0x0e, 0x3c, 0xa0, 0x83, 0x2f, 0x88, 0x88, 0x2f, 0x83, 0xa0, 0x01, \n\t0xd6, 0xa8, 0x62, 0xae, 0x68, 0x68, 0xae, 0x62, 0x00, 0x02, 0x00, 0x32, \n\t0x00, 0x1e, 0x01, 0xea, 0x01, 0xd6, 0x00, 0x09, 0x00, 0x13, 0x00, 0x00, \n\t0x01, 0x07, 0x17, 0x27, 0x07, 0x37, 0x27, 0x33, 0x37, 0x17, 0x07, 0x17, \n\t0x27, 0x37, 0x07, 0x27, 0x07, 0x27, 0x17, 0x07, 0x01, 0xea, 0x83, 0x2f, \n\t0x88, 0x88, 0x2f, 0x83, 0xa0, 0x3c, 0x3c, 0x3c, 0x4b, 0x1f, 0x48, 0x58, \n\t0x1c, 0x1b, 0x58, 0x47, 0x1f, 0x01, 0x2e, 0x62, 0xae, 0x68, 0x68, 0xae, \n\t0x62, 0xa8, 0xa8, 0x77, 0x3e, 0x59, 0x39, 0x02, 0x65, 0x65, 0x02, 0x39, \n\t0x59, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x32, 0x00, 0x2d, 0x01, 0x88, \n\t0x01, 0xc7, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x00, 0x13, 0x32, 0x16, 0x07, \n\t0x03, 0x0e, 0x02, 0x22, 0x2e, 0x01, 0x27, 0x03, 0x26, 0x3e, 0x01, 0x16, \n\t0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x22, 0x0e, 0x01, 0x14, 0x16, 0xdd, \n\t0x4c, 0x61, 0x03, 0x24, 0x01, 0x20, 0x41, 0x48, 0x40, 0x21, 0x01, 0x24, \n\t0x02, 0x28, 0x51, 0x0f, 0x48, 0x41, 0x21, 0x21, 0x41, 0x48, 0x41, 0x21, \n\t0x21, 0x01, 0xc7, 0x29, 0x17, 0xfe, 0xd7, 0x07, 0x16, 0x14, 0x14, 0x16, \n\t0x07, 0x01, 0x29, 0x0e, 0x1d, 0x15, 0x6c, 0x0f, 0x12, 0x0c, 0x11, 0x0f, \n\t0x0f, 0x11, 0x0c, 0x12, 0x00, 0x03, 0x00, 0x32, 0x00, 0x7d, 0x01, 0x90, \n\t0x01, 0x77, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x23, 0x00, 0x00, 0x01, 0x32, \n\t0x16, 0x14, 0x06, 0x23, 0x21, 0x22, 0x26, 0x34, 0x36, 0x33, 0x35, 0x22, \n\t0x26, 0x34, 0x36, 0x33, 0x21, 0x32, 0x16, 0x14, 0x06, 0x23, 0x15, 0x32, \n\t0x16, 0x14, 0x06, 0x23, 0x21, 0x22, 0x26, 0x34, 0x36, 0x33, 0x01, 0x77, \n\t0x0b, 0x0e, 0x0f, 0x0a, 0xfe, 0xd4, 0x0a, 0x0f, 0x0e, 0x0b, 0x0a, 0x0f, \n\t0x0e, 0x0b, 0x01, 0x2c, 0x0b, 0x0e, 0x0f, 0x0a, 0x0b, 0x0e, 0x0f, 0x0a, \n\t0xfe, 0xd4, 0x0a, 0x0f, 0x0e, 0x0b, 0x01, 0x13, 0x0f, 0x14, 0x0f, 0x0f, \n\t0x14, 0x0f, 0x32, 0x0f, 0x14, 0x0f, 0x0f, 0x14, 0x0f, 0x96, 0x0f, 0x14, \n\t0x0f, 0x0f, 0x14, 0x0f, 0x00, 0x01, 0x00, 0x32, 0x00, 0x2d, 0x01, 0xcd, \n\t0x01, 0xc7, 0x00, 0x0d, 0x00, 0x00, 0x24, 0x3e, 0x01, 0x27, 0x16, 0x17, \n\t0x16, 0x14, 0x06, 0x22, 0x27, 0x26, 0x27, 0x16, 0x01, 0x03, 0x6a, 0x13, \n\t0x24, 0x1a, 0x16, 0x40, 0x80, 0xb6, 0x40, 0x14, 0x10, 0x3e, 0x8d, 0x6a, \n\t0x92, 0x3e, 0x0d, 0x17, 0x40, 0xb5, 0x80, 0x40, 0x14, 0x1b, 0x23, 0x00, \n\t0x00, 0x02, 0x00, 0x32, 0x00, 0x4b, 0x01, 0xe2, 0x01, 0xaa, 0x00, 0x0f, \n\t0x00, 0x23, 0x00, 0x00, 0x01, 0x16, 0x14, 0x0f, 0x01, 0x27, 0x26, 0x34, \n\t0x37, 0x36, 0x32, 0x1f, 0x01, 0x37, 0x36, 0x32, 0x17, 0x36, 0x35, 0x34, \n\t0x27, 0x26, 0x23, 0x22, 0x0f, 0x01, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, \n\t0x15, 0x14, 0x1f, 0x01, 0x01, 0xbe, 0x23, 0x23, 0xb4, 0xb4, 0x23, 0x23, \n\t0x20, 0x58, 0x1f, 0x1d, 0x1c, 0x20, 0x58, 0x05, 0x15, 0x13, 0x13, 0x20, \n\t0x1a, 0x1a, 0x34, 0x35, 0x18, 0x1b, 0x20, 0x14, 0x13, 0x16, 0x99, 0x01, \n\t0x8c, 0x20, 0x5c, 0x20, 0xa5, 0xa5, 0x20, 0x5c, 0x20, 0x1d, 0x1d, 0x1a, \n\t0x1a, 0x1d, 0x9f, 0x14, 0x20, 0x21, 0x11, 0x13, 0x18, 0x2e, 0x2e, 0x18, \n\t0x13, 0x12, 0x20, 0x21, 0x13, 0x8f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x32, \n\t0x00, 0x4b, 0x01, 0xe2, 0x01, 0xaa, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x16, \n\t0x14, 0x0f, 0x01, 0x27, 0x26, 0x34, 0x37, 0x36, 0x32, 0x1f, 0x01, 0x37, \n\t0x36, 0x32, 0x01, 0xbe, 0x23, 0x23, 0xb4, 0xb4, 0x23, 0x23, 0x1f, 0x59, \n\t0x20, 0x1c, 0x1d, 0x1f, 0x58, 0x01, 0x8d, 0x20, 0x5c, 0x21, 0xa5, 0xa5, \n\t0x21, 0x5c, 0x20, 0x1d, 0x1d, 0x1a, 0x1a, 0x1d, 0x00, 0x01, 0x00, 0x32, \n\t0x00, 0x0f, 0x01, 0x55, 0x01, 0xe5, 0x00, 0x1a, 0x00, 0x00, 0x13, 0x14, \n\t0x1e, 0x02, 0x07, 0x06, 0x27, 0x26, 0x37, 0x36, 0x2e, 0x02, 0x27, 0x11, \n\t0x16, 0x06, 0x07, 0x06, 0x2e, 0x01, 0x36, 0x37, 0x36, 0x17, 0x11, 0xf1, \n\t0x2e, 0x2c, 0x11, 0x1c, 0x0a, 0x03, 0x01, 0x01, 0x05, 0x04, 0x09, 0x22, \n\t0x18, 0x01, 0x27, 0x21, 0x25, 0x45, 0x14, 0x28, 0x26, 0x2b, 0x24, 0x01, \n\t0xe5, 0x15, 0x37, 0x2d, 0x4a, 0x28, 0x11, 0x09, 0x03, 0x05, 0x09, 0x26, \n\t0x28, 0x21, 0x04, 0xfe, 0xf4, 0x18, 0x2f, 0x0c, 0x0e, 0x14, 0x38, 0x3b, \n\t0x0d, 0x0f, 0x0d, 0x01, 0x46, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x32, \n\t0x00, 0x0b, 0x01, 0xa5, 0x01, 0xea, 0x00, 0x1b, 0x00, 0x00, 0x13, 0x25, \n\t0x11, 0x16, 0x06, 0x07, 0x06, 0x26, 0x27, 0x26, 0x36, 0x37, 0x36, 0x17, \n\t0x35, 0x07, 0x15, 0x14, 0x06, 0x07, 0x06, 0x26, 0x27, 0x26, 0x36, 0x37, \n\t0x36, 0x17, 0x99, 0x01, 0x0b, 0x01, 0x20, 0x1b, 0x20, 0x2e, 0x08, 0x09, \n\t0x19, 0x1e, 0x1a, 0x1b, 0xb1, 0x20, 0x1b, 0x20, 0x2d, 0x08, 0x09, 0x18, \n\t0x1e, 0x1b, 0x1b, 0x01, 0xb0, 0x3a, 0xfe, 0xa0, 0x15, 0x27, 0x0a, 0x0c, \n\t0x10, 0x18, 0x18, 0x31, 0x0c, 0x0a, 0x05, 0xbc, 0x29, 0xf5, 0x15, 0x27, \n\t0x0a, 0x0b, 0x0f, 0x18, 0x18, 0x31, 0x0c, 0x0a, 0x05, 0x00, 0x00, 0x00, \n\t0x00, 0x04, 0x00, 0x32, 0x00, 0x64, 0x01, 0x5e, 0x01, 0x90, 0x00, 0x0b, \n\t0x00, 0x17, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x00, 0x13, 0x32, 0x1d, 0x01, \n\t0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x1d, 0x01, \n\t0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x33, 0x07, 0x32, 0x1d, 0x01, \n\t0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x1d, 0x01, \n\t0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x33, 0x87, 0x28, 0x28, 0x2d, \n\t0x28, 0x28, 0xdc, 0x28, 0x28, 0x2d, 0x28, 0x28, 0x82, 0x28, 0x28, 0x2d, \n\t0x28, 0x28, 0xdc, 0x28, 0x28, 0x2d, 0x28, 0x28, 0x01, 0x90, 0x28, 0x2d, \n\t0x28, 0x28, 0x2d, 0x28, 0x28, 0x2d, 0x28, 0x28, 0x2d, 0x28, 0xaf, 0x28, \n\t0x2d, 0x28, 0x28, 0x2d, 0x28, 0x28, 0x2d, 0x28, 0x28, 0x2d, 0x28, 0x00, \n\t0x00, 0x01, 0x00, 0x32, 0x00, 0x26, 0x01, 0xf5, 0x01, 0xd0, 0x00, 0x16, \n\t0x00, 0x00, 0x01, 0x36, 0x16, 0x07, 0x0e, 0x02, 0x2e, 0x02, 0x06, 0x07, \n\t0x17, 0x23, 0x03, 0x37, 0x3e, 0x01, 0x1e, 0x03, 0x36, 0x01, 0xe7, 0x07, \n\t0x08, 0x04, 0x30, 0x44, 0x2a, 0x1f, 0x1d, 0x22, 0x3b, 0x28, 0x2d, 0x32, \n\t0x5c, 0x2e, 0x2d, 0x3e, 0x24, 0x1c, 0x22, 0x2d, 0x54, 0x01, 0x7f, 0x03, \n\t0x07, 0x06, 0x45, 0x4b, 0x0f, 0x0d, 0x18, 0x10, 0x14, 0x21, 0xb0, 0x01, \n\t0x68, 0x11, 0x21, 0x14, 0x11, 0x22, 0x25, 0x19, 0x05, 0x00, 0x00, 0x00, \n\t0x00, 0x04, 0x00, 0x32, 0x00, 0x1d, 0x02, 0x25, 0x01, 0xd8, 0x00, 0x2e, \n\t0x00, 0x3a, 0x00, 0x59, 0x00, 0x61, 0x00, 0x00, 0x13, 0x0e, 0x01, 0x14, \n\t0x23, 0x0e, 0x01, 0x07, 0x06, 0x2f, 0x01, 0x26, 0x37, 0x3e, 0x01, 0x37, \n\t0x36, 0x32, 0x37, 0x3e, 0x01, 0x37, 0x32, 0x3e, 0x01, 0x37, 0x36, 0x37, \n\t0x32, 0x17, 0x32, 0x07, 0x06, 0x07, 0x06, 0x17, 0x16, 0x17, 0x16, 0x07, \n\t0x0e, 0x01, 0x07, 0x06, 0x27, 0x2e, 0x01, 0x1f, 0x01, 0x16, 0x0f, 0x01, \n\t0x06, 0x2f, 0x01, 0x26, 0x3f, 0x01, 0x36, 0x25, 0x16, 0x07, 0x06, 0x27, \n\t0x26, 0x0f, 0x01, 0x27, 0x37, 0x3e, 0x01, 0x26, 0x37, 0x36, 0x37, 0x36, \n\t0x16, 0x07, 0x06, 0x07, 0x06, 0x16, 0x17, 0x16, 0x37, 0x3e, 0x01, 0x37, \n\t0x36, 0x16, 0x01, 0x37, 0x17, 0x07, 0x06, 0x2f, 0x01, 0x26, 0x7f, 0x04, \n\t0x03, 0x01, 0x01, 0x0f, 0x02, 0x08, 0x06, 0x23, 0x05, 0x06, 0x01, 0x10, \n\t0x02, 0x03, 0x15, 0x08, 0x07, 0x04, 0x03, 0x01, 0x07, 0x13, 0x0b, 0x43, \n\t0x1a, 0x3d, 0x0d, 0x06, 0x0a, 0x3c, 0x10, 0x28, 0x16, 0x11, 0x02, 0x04, \n\t0x05, 0x01, 0x24, 0x01, 0x07, 0x02, 0x15, 0x1d, 0x7c, 0xcd, 0x09, 0x0a, \n\t0x18, 0x0b, 0x08, 0xcf, 0x04, 0x04, 0x24, 0x06, 0x01, 0x19, 0x08, 0x10, \n\t0x19, 0x34, 0x1c, 0x16, 0x29, 0x22, 0x22, 0x0c, 0x07, 0x01, 0x03, 0x06, \n\t0x40, 0x06, 0x06, 0x02, 0x06, 0x11, 0x07, 0x02, 0x13, 0x1d, 0x13, 0x03, \n\t0x14, 0x01, 0x02, 0x09, 0xfe, 0x54, 0x7f, 0x26, 0x7b, 0x0a, 0x09, 0x17, \n\t0x0b, 0x01, 0x48, 0x04, 0x0e, 0x0b, 0x01, 0x0d, 0x02, 0x07, 0x09, 0x26, \n\t0x06, 0x06, 0x01, 0x0c, 0x02, 0x03, 0x07, 0x07, 0x18, 0x03, 0x07, 0x0f, \n\t0x08, 0x2d, 0x03, 0x01, 0x04, 0x1a, 0x0c, 0x1c, 0x1d, 0x17, 0x01, 0x04, \n\t0x03, 0x01, 0x21, 0x01, 0x04, 0x02, 0x18, 0x0c, 0x19, 0xee, 0x0b, 0x08, \n\t0x15, 0x07, 0x09, 0xec, 0x04, 0x06, 0x1f, 0x04, 0x60, 0x34, 0x1f, 0x2c, \n\t0x0d, 0x06, 0x16, 0x27, 0x27, 0x23, 0x0c, 0x1d, 0x24, 0x0b, 0x1c, 0x1c, \n\t0x03, 0x09, 0x03, 0x06, 0x22, 0x05, 0x19, 0x0e, 0x14, 0x1f, 0x06, 0x1d, \n\t0x02, 0x05, 0x01, 0xfe, 0xa2, 0x7c, 0x2b, 0x79, 0x0a, 0x08, 0x17, 0x09, \n\t0x00, 0x02, 0x00, 0x32, 0x00, 0x28, 0x01, 0xd6, 0x01, 0xcc, 0x00, 0x2d, \n\t0x00, 0x35, 0x00, 0x00, 0x25, 0x14, 0x17, 0x06, 0x07, 0x26, 0x07, 0x06, \n\t0x17, 0x06, 0x07, 0x26, 0x22, 0x07, 0x26, 0x27, 0x36, 0x27, 0x26, 0x07, \n\t0x26, 0x27, 0x36, 0x35, 0x34, 0x27, 0x36, 0x37, 0x16, 0x37, 0x36, 0x27, \n\t0x36, 0x37, 0x16, 0x32, 0x37, 0x16, 0x17, 0x06, 0x17, 0x16, 0x37, 0x16, \n\t0x17, 0x0e, 0x01, 0x32, 0x36, 0x34, 0x26, 0x22, 0x06, 0x14, 0x01, 0xae, \n\t0x28, 0x06, 0x0b, 0x23, 0x21, 0x1b, 0x0a, 0x14, 0x16, 0x17, 0x56, 0x17, \n\t0x16, 0x14, 0x0a, 0x1b, 0x1b, 0x29, 0x07, 0x0a, 0x29, 0x29, 0x0a, 0x07, \n\t0x25, 0x1f, 0x1b, 0x0a, 0x15, 0x15, 0x17, 0x56, 0x17, 0x15, 0x15, 0x0a, \n\t0x1b, 0x21, 0x23, 0x0b, 0x06, 0x28, 0xd0, 0x4c, 0x35, 0x35, 0x4c, 0x35, \n\t0xfa, 0x24, 0x19, 0x14, 0x15, 0x09, 0x1f, 0x1d, 0x27, 0x0a, 0x08, 0x29, \n\t0x29, 0x08, 0x0a, 0x28, 0x1c, 0x1b, 0x0a, 0x0d, 0x1c, 0x1a, 0x28, 0x24, \n\t0x1a, 0x1c, 0x0d, 0x09, 0x1f, 0x1c, 0x28, 0x0b, 0x06, 0x28, 0x28, 0x06, \n\t0x0b, 0x27, 0x1d, 0x1f, 0x09, 0x15, 0x14, 0x19, 0x80, 0x35, 0x4c, 0x36, \n\t0x36, 0x4c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x32, 0x00, 0x26, 0x02, 0x14, \n\t0x01, 0xcf, 0x00, 0x0d, 0x00, 0x11, 0x00, 0x15, 0x00, 0x00, 0x25, 0x16, \n\t0x07, 0x06, 0x23, 0x21, 0x22, 0x27, 0x26, 0x37, 0x13, 0x36, 0x32, 0x17, \n\t0x13, 0x35, 0x23, 0x15, 0x37, 0x35, 0x23, 0x15, 0x02, 0x11, 0x05, 0x05, \n\t0x05, 0x0a, 0xfe, 0x42, 0x09, 0x05, 0x06, 0x05, 0xdf, 0x04, 0x16, 0x04, \n\t0x0d, 0x37, 0x37, 0x37, 0x3f, 0x08, 0x09, 0x08, 0x08, 0x09, 0x08, 0x01, \n\t0x87, 0x09, 0x09, 0xfe, 0x92, 0x32, 0x32, 0x57, 0x96, 0x96, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x32, 0x00, 0x18, 0x00, 0xfc, 0x01, 0xdc, 0x00, 0x11, \n\t0x00, 0x00, 0x37, 0x26, 0x3e, 0x01, 0x2e, 0x01, 0x27, 0x26, 0x3e, 0x01, \n\t0x17, 0x16, 0x06, 0x1e, 0x01, 0x17, 0x16, 0x06, 0x47, 0x02, 0x27, 0x28, \n\t0x02, 0x5c, 0x03, 0x02, 0x58, 0x5c, 0x02, 0x03, 0x50, 0x02, 0x5d, 0x02, \n\t0x02, 0xb2, 0x19, 0x02, 0x5a, 0x5c, 0x06, 0x27, 0x08, 0x06, 0x6c, 0x65, \n\t0x02, 0x02, 0xb6, 0x04, 0x27, 0x09, 0x0a, 0xcf, 0x00, 0x02, 0x00, 0x32, \n\t0x00, 0x58, 0x02, 0x26, 0x01, 0x9d, 0x00, 0x18, 0x00, 0x3b, 0x00, 0x00, \n\t0x01, 0x32, 0x16, 0x14, 0x06, 0x23, 0x21, 0x22, 0x26, 0x35, 0x34, 0x36, \n\t0x33, 0x32, 0x16, 0x33, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, \n\t0x36, 0x07, 0x36, 0x35, 0x34, 0x27, 0x23, 0x26, 0x27, 0x37, 0x32, 0x35, \n\t0x34, 0x27, 0x26, 0x07, 0x0e, 0x02, 0x07, 0x06, 0x15, 0x14, 0x1f, 0x01, \n\t0x16, 0x17, 0x0f, 0x01, 0x06, 0x15, 0x14, 0x17, 0x16, 0x37, 0x36, 0x01, \n\t0xae, 0x32, 0x46, 0x46, 0x32, 0xfe, 0xdf, 0x25, 0x36, 0x35, 0x26, 0x01, \n\t0x08, 0x01, 0x01, 0x4e, 0x37, 0x2d, 0x46, 0x0c, 0x0e, 0x5a, 0x07, 0x0f, \n\t0x02, 0x0d, 0x06, 0x19, 0x03, 0x04, 0x08, 0x09, 0x01, 0x1c, 0x21, 0x06, \n\t0x06, 0x0f, 0x02, 0x04, 0x0f, 0x1a, 0x01, 0x01, 0x04, 0x09, 0x08, 0x32, \n\t0x01, 0x42, 0x44, 0x62, 0x44, 0x34, 0x24, 0x25, 0x34, 0x01, 0x06, 0x0d, \n\t0x36, 0x4c, 0x34, 0x29, 0x02, 0x6c, 0x08, 0x07, 0x0a, 0x06, 0x07, 0x01, \n\t0x3a, 0x0a, 0x07, 0x02, 0x05, 0x09, 0x01, 0x1e, 0x24, 0x08, 0x09, 0x06, \n\t0x0b, 0x04, 0x01, 0x02, 0x06, 0x39, 0x04, 0x04, 0x03, 0x05, 0x04, 0x05, \n\t0x0a, 0x32, 0x00, 0x00, 0x00, 0x03, 0x00, 0x32, 0x00, 0x87, 0x02, 0x26, \n\t0x01, 0x6d, 0x00, 0x17, 0x00, 0x21, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x32, \n\t0x16, 0x15, 0x14, 0x06, 0x23, 0x21, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, \n\t0x32, 0x16, 0x15, 0x14, 0x07, 0x33, 0x26, 0x35, 0x34, 0x36, 0x05, 0x14, \n\t0x16, 0x32, 0x36, 0x35, 0x34, 0x26, 0x22, 0x06, 0x04, 0x32, 0x36, 0x35, \n\t0x34, 0x26, 0x22, 0x06, 0x15, 0x14, 0x01, 0xb3, 0x30, 0x43, 0x43, 0x30, \n\t0xfe, 0xf2, 0x2f, 0x44, 0x44, 0x2f, 0x30, 0x43, 0x14, 0x50, 0x14, 0x44, \n\t0xfe, 0xe0, 0x26, 0x36, 0x26, 0x26, 0x36, 0x26, 0x01, 0x34, 0x36, 0x26, \n\t0x26, 0x36, 0x26, 0x01, 0x6d, 0x43, 0x30, 0x2f, 0x44, 0x44, 0x2f, 0x30, \n\t0x43, 0x43, 0x30, 0x24, 0x1d, 0x20, 0x21, 0x30, 0x43, 0x73, 0x1a, 0x27, \n\t0x27, 0x1a, 0x1b, 0x26, 0x26, 0x5c, 0x27, 0x1a, 0x1b, 0x26, 0x26, 0x1b, \n\t0x1a, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x32, 0x00, 0x0f, 0x02, 0x26, \n\t0x01, 0xe5, 0x00, 0x19, 0x00, 0x00, 0x3f, 0x01, 0x23, 0x07, 0x23, 0x37, \n\t0x27, 0x33, 0x17, 0x33, 0x27, 0x33, 0x17, 0x33, 0x3a, 0x01, 0x1e, 0x02, \n\t0x15, 0x14, 0x06, 0x0f, 0x01, 0x23, 0x07, 0xb8, 0x3e, 0x5a, 0x38, 0x32, \n\t0x28, 0x28, 0x32, 0x38, 0x5a, 0x3e, 0x32, 0x70, 0x81, 0x03, 0x0a, 0x1a, \n\t0x14, 0x10, 0x26, 0x12, 0x13, 0x81, 0x70, 0x0f, 0xc8, 0x32, 0x55, 0x55, \n\t0x32, 0xc8, 0xc8, 0x04, 0x07, 0x0e, 0x0a, 0x10, 0x11, 0x01, 0x01, 0xc8, \n\t0x00, 0x02, 0x00, 0x32, 0x00, 0x69, 0x01, 0xf4, 0x01, 0x8b, 0x00, 0x12, \n\t0x00, 0x24, 0x00, 0x00, 0x13, 0x26, 0x37, 0x36, 0x33, 0x21, 0x32, 0x07, \n\t0x06, 0x07, 0x0e, 0x01, 0x07, 0x06, 0x23, 0x22, 0x27, 0x2e, 0x01, 0x05, \n\t0x36, 0x1d, 0x01, 0x14, 0x06, 0x23, 0x21, 0x22, 0x26, 0x3d, 0x01, 0x34, \n\t0x1f, 0x01, 0x16, 0x32, 0x37, 0x41, 0x10, 0x02, 0x01, 0x0c, 0x01, 0xa7, \n\t0x13, 0x09, 0x04, 0x08, 0x07, 0xb2, 0x02, 0x08, 0x0f, 0x0e, 0x09, 0x02, \n\t0xb2, 0x01, 0xa2, 0x0a, 0x11, 0x08, 0xfe, 0x70, 0x08, 0x11, 0x0a, 0xc0, \n\t0x09, 0x1c, 0x09, 0x01, 0x70, 0x09, 0x0b, 0x07, 0x10, 0x07, 0x04, 0x03, \n\t0x60, 0x01, 0x05, 0x05, 0x01, 0x60, 0x2f, 0x05, 0x0a, 0xb8, 0x08, 0x10, \n\t0x10, 0x08, 0xb8, 0x0a, 0x05, 0x64, 0x05, 0x05, 0x00, 0x02, 0x00, 0x32, \n\t0x00, 0x37, 0x01, 0xb9, 0x01, 0xbe, 0x00, 0x0b, 0x00, 0x19, 0x00, 0x00, \n\t0x01, 0x1e, 0x01, 0x1d, 0x01, 0x0f, 0x02, 0x3f, 0x02, 0x36, 0x03, 0x37, \n\t0x26, 0x27, 0x2e, 0x01, 0x23, 0x27, 0x0f, 0x01, 0x16, 0x17, 0x16, 0x17, \n\t0x01, 0x99, 0x10, 0x0f, 0x7e, 0x91, 0x77, 0x19, 0x91, 0x7e, 0x1b, 0xd3, \n\t0x0c, 0x01, 0x19, 0x0b, 0x17, 0x06, 0x07, 0x0b, 0x09, 0x0e, 0x09, 0x0c, \n\t0x06, 0x01, 0x9f, 0x10, 0x20, 0x08, 0x08, 0x7e, 0x90, 0x1a, 0x78, 0x90, \n\t0x7e, 0x06, 0xfe, 0x9c, 0x0c, 0x16, 0x19, 0x0b, 0x0d, 0x01, 0x0c, 0x28, \n\t0x08, 0x09, 0x0c, 0x0c, 0x00, 0x01, 0x00, 0x32, 0x00, 0x00, 0x01, 0x90, \n\t0x01, 0xf5, 0x00, 0x34, 0x00, 0x00, 0x37, 0x06, 0x27, 0x26, 0x37, 0x36, \n\t0x37, 0x26, 0x37, 0x1e, 0x02, 0x37, 0x36, 0x2e, 0x01, 0x37, 0x3e, 0x01, \n\t0x37, 0x0e, 0x01, 0x16, 0x17, 0x32, 0x36, 0x37, 0x36, 0x16, 0x17, 0x16, \n\t0x06, 0x07, 0x0e, 0x01, 0x07, 0x06, 0x17, 0x16, 0x37, 0x0e, 0x02, 0x07, \n\t0x06, 0x16, 0x37, 0x0e, 0x03, 0x07, 0x06, 0x51, 0x03, 0x0a, 0x09, 0x01, \n\t0x02, 0x17, 0x32, 0x18, 0x05, 0x16, 0x16, 0x05, 0x04, 0x08, 0x03, 0x0e, \n\t0x0b, 0x3a, 0x17, 0x0c, 0x09, 0x05, 0x08, 0x06, 0x48, 0x11, 0x17, 0x44, \n\t0x07, 0x06, 0x0c, 0x0e, 0x16, 0x66, 0x06, 0x08, 0x0e, 0x1b, 0x3d, 0x1c, \n\t0x50, 0x34, 0x01, 0x02, 0x35, 0x18, 0x0f, 0x21, 0x15, 0x37, 0x0f, 0x0a, \n\t0x06, 0x0a, 0x06, 0x04, 0x0d, 0x32, 0x3f, 0x4d, 0x51, 0x10, 0x2e, 0x22, \n\t0x02, 0x02, 0x4f, 0x57, 0x23, 0x16, 0x32, 0x0a, 0x17, 0x30, 0x1e, 0x01, \n\t0x78, 0x01, 0x02, 0x21, 0x10, 0x0c, 0x37, 0x0e, 0x16, 0x12, 0x03, 0x05, \n\t0x0c, 0x18, 0x0e, 0x28, 0x22, 0x04, 0x03, 0x0c, 0x1e, 0x08, 0x1c, 0x1c, \n\t0x07, 0x04, 0x02, 0x20, 0x00, 0x01, 0x00, 0x32, 0x00, 0x4b, 0x01, 0x81, \n\t0x01, 0xaa, 0x00, 0x13, 0x00, 0x00, 0x37, 0x22, 0x2f, 0x01, 0x26, 0x3e, \n\t0x01, 0x16, 0x1f, 0x01, 0x37, 0x3e, 0x01, 0x17, 0x1e, 0x01, 0x07, 0x03, \n\t0x06, 0x23, 0xaf, 0x11, 0x0b, 0x5a, 0x08, 0x04, 0x16, 0x1d, 0x09, 0x3b, \n\t0x94, 0x08, 0x1b, 0x0d, 0x0c, 0x06, 0x07, 0xaf, 0x0a, 0x12, 0x4b, 0x0e, \n\t0x76, 0x0c, 0x1c, 0x12, 0x04, 0x0c, 0x4d, 0xed, 0x0c, 0x06, 0x07, 0x08, \n\t0x1b, 0x0d, 0xfe, 0xe8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x32, \n\t0x00, 0x28, 0x01, 0xd6, 0x01, 0xcc, 0x00, 0x07, 0x00, 0x13, 0x00, 0x00, \n\t0x12, 0x32, 0x16, 0x14, 0x06, 0x22, 0x26, 0x34, 0x17, 0x37, 0x27, 0x07, \n\t0x27, 0x07, 0x17, 0x07, 0x17, 0x37, 0x17, 0x37, 0xad, 0xae, 0x7b, 0x7b, \n\t0xae, 0x7b, 0xfd, 0x4d, 0x2b, 0x4d, 0x4c, 0x2c, 0x4d, 0x4d, 0x2c, 0x4c, \n\t0x4d, 0x2b, 0x01, 0xcc, 0x7b, 0xae, 0x7b, 0x7b, 0xae, 0x57, 0x4d, 0x2b, \n\t0x4c, 0x4c, 0x2b, 0x4d, 0x4c, 0x2b, 0x4c, 0x4c, 0x2b, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x32, 0x00, 0x78, 0x01, 0x1e, 0x01, 0x7d, 0x00, 0x1f, \n\t0x00, 0x00, 0x25, 0x16, 0x14, 0x07, 0x06, 0x22, 0x2f, 0x01, 0x07, 0x06, \n\t0x22, 0x27, 0x26, 0x34, 0x3f, 0x01, 0x27, 0x26, 0x34, 0x37, 0x36, 0x32, \n\t0x1f, 0x01, 0x37, 0x36, 0x32, 0x17, 0x16, 0x14, 0x0f, 0x01, 0x01, 0x15, \n\t0x09, 0x09, 0x09, 0x19, 0x09, 0x42, 0x42, 0x09, 0x19, 0x09, 0x08, 0x08, \n\t0x45, 0x45, 0x08, 0x08, 0x09, 0x19, 0x09, 0x42, 0x42, 0x09, 0x19, 0x09, \n\t0x09, 0x09, 0x45, 0xac, 0x09, 0x19, 0x09, 0x08, 0x08, 0x4c, 0x4c, 0x08, \n\t0x08, 0x09, 0x19, 0x09, 0x4e, 0x4f, 0x09, 0x19, 0x09, 0x08, 0x08, 0x4c, \n\t0x4c, 0x08, 0x08, 0x09, 0x19, 0x09, 0x4f, 0x00, 0x00, 0x02, 0x00, 0x32, \n\t0x00, 0x32, 0x01, 0xc2, 0x01, 0xc2, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x00, \n\t0x01, 0x32, 0x16, 0x15, 0x11, 0x14, 0x06, 0x23, 0x21, 0x22, 0x26, 0x35, \n\t0x11, 0x34, 0x36, 0x33, 0x13, 0x37, 0x27, 0x37, 0x27, 0x07, 0x27, 0x07, \n\t0x17, 0x07, 0x17, 0x37, 0x01, 0x90, 0x15, 0x1d, 0x1d, 0x15, 0xfe, 0xd4, \n\t0x14, 0x1e, 0x1e, 0x14, 0xe3, 0x2b, 0x4d, 0x4d, 0x2b, 0x4d, 0x4c, 0x2c, \n\t0x4d, 0x4d, 0x2c, 0x4c, 0x01, 0xc2, 0x1d, 0x15, 0xfe, 0xd4, 0x14, 0x1e, \n\t0x1e, 0x14, 0x01, 0x2c, 0x15, 0x1d, 0xfe, 0xc1, 0x2b, 0x4c, 0x4d, 0x2b, \n\t0x4c, 0x4c, 0x2b, 0x4d, 0x4c, 0x2b, 0x4c, 0x00, 0x00, 0x02, 0x00, 0x32, \n\t0x00, 0x19, 0x01, 0x54, 0x01, 0xdb, 0x00, 0x28, 0x00, 0x33, 0x00, 0x00, \n\t0x01, 0x16, 0x15, 0x14, 0x07, 0x06, 0x0f, 0x01, 0x06, 0x07, 0x06, 0x07, \n\t0x14, 0x2b, 0x01, 0x22, 0x35, 0x36, 0x37, 0x3e, 0x01, 0x3f, 0x01, 0x36, \n\t0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x23, \n\t0x36, 0x37, 0x36, 0x33, 0x32, 0x03, 0x32, 0x16, 0x07, 0x0e, 0x01, 0x27, \n\t0x22, 0x26, 0x3e, 0x01, 0x01, 0x29, 0x2b, 0x15, 0x06, 0x26, 0x17, 0x14, \n\t0x04, 0x03, 0x01, 0x08, 0x40, 0x08, 0x02, 0x0c, 0x08, 0x20, 0x0c, 0x0c, \n\t0x0b, 0x06, 0x0e, 0x0d, 0x0e, 0x20, 0x22, 0x0d, 0x0e, 0x53, 0x03, 0x36, \n\t0x23, 0x30, 0x41, 0x42, 0x16, 0x1d, 0x01, 0x01, 0x1e, 0x16, 0x16, 0x1d, \n\t0x02, 0x1e, 0x01, 0xbd, 0x1f, 0x3d, 0x20, 0x1e, 0x0a, 0x1e, 0x0f, 0x11, \n\t0x0d, 0x08, 0x0e, 0x07, 0x06, 0x31, 0x0d, 0x0b, 0x1a, 0x08, 0x07, 0x08, \n\t0x09, 0x16, 0x0d, 0x14, 0x13, 0x12, 0x16, 0x15, 0x19, 0x51, 0x23, 0x15, \n\t0xfe, 0xa4, 0x1e, 0x16, 0x17, 0x1b, 0x01, 0x1d, 0x2e, 0x1b, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x32, 0x00, 0x55, 0x01, 0xaf, 0x01, 0x9f, 0x00, 0x13, \n\t0x00, 0x27, 0x00, 0x00, 0x13, 0x32, 0x17, 0x16, 0x07, 0x06, 0x07, 0x06, \n\t0x23, 0x35, 0x32, 0x37, 0x36, 0x27, 0x26, 0x23, 0x22, 0x26, 0x34, 0x36, \n\t0x33, 0x32, 0x17, 0x16, 0x07, 0x06, 0x07, 0x06, 0x23, 0x35, 0x32, 0x37, \n\t0x36, 0x27, 0x26, 0x23, 0x22, 0x26, 0x34, 0x36, 0x7b, 0x49, 0x13, 0x13, \n\t0x27, 0x28, 0x48, 0x10, 0x11, 0x38, 0x23, 0x1b, 0x0e, 0x08, 0x17, 0x1e, \n\t0x2b, 0x2b, 0xf0, 0x49, 0x13, 0x13, 0x27, 0x28, 0x48, 0x10, 0x11, 0x38, \n\t0x23, 0x1b, 0x0e, 0x08, 0x17, 0x1e, 0x2b, 0x2b, 0x01, 0x9f, 0x49, 0x46, \n\t0x51, 0x54, 0x12, 0x04, 0x23, 0x36, 0x2b, 0x1e, 0x12, 0x2c, 0x3e, 0x2c, \n\t0x49, 0x46, 0x51, 0x54, 0x12, 0x04, 0x23, 0x36, 0x2b, 0x1e, 0x12, 0x2c, \n\t0x3e, 0x2c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x32, 0x00, 0x69, 0x01, 0x54, \n\t0x01, 0x8b, 0x00, 0x13, 0x00, 0x00, 0x01, 0x32, 0x14, 0x2b, 0x01, 0x15, \n\t0x14, 0x22, 0x3d, 0x01, 0x23, 0x22, 0x34, 0x3b, 0x01, 0x35, 0x34, 0x32, \n\t0x1d, 0x01, 0x01, 0x45, 0x0f, 0x0f, 0x69, 0x32, 0x69, 0x0f, 0x0f, 0x69, \n\t0x32, 0x01, 0x13, 0x32, 0x69, 0x0f, 0x0f, 0x69, 0x32, 0x69, 0x0f, 0x0f, \n\t0x69, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x32, 0x00, 0xe1, 0x01, 0x54, \n\t0x01, 0x13, 0x00, 0x07, 0x00, 0x00, 0x01, 0x32, 0x14, 0x23, 0x21, 0x22, \n\t0x34, 0x33, 0x01, 0x45, 0x0f, 0x0f, 0xfe, 0xfc, 0x0f, 0x0f, 0x01, 0x13, \n\t0x32, 0x32, 0x00, 0x00, 0x00, 0x01, 0x00, 0x32, 0x00, 0x55, 0x01, 0x9f, \n\t0x01, 0x9f, 0x00, 0x06, 0x00, 0x00, 0x13, 0x17, 0x07, 0x35, 0x23, 0x35, \n\t0x33, 0xe1, 0xbe, 0xbe, 0xaf, 0xaf, 0x01, 0x9f, 0xa5, 0xa5, 0x60, 0x8b, \n\t0x00, 0x02, 0x00, 0x32, 0x00, 0x23, 0x01, 0xe0, 0x01, 0xd2, 0x00, 0x12, \n\t0x00, 0x15, 0x00, 0x00, 0x00, 0x1e, 0x01, 0x0e, 0x02, 0x07, 0x0e, 0x01, \n\t0x0f, 0x01, 0x2f, 0x01, 0x36, 0x37, 0x3e, 0x03, 0x0f, 0x01, 0x17, 0x01, \n\t0xd6, 0x08, 0x03, 0x05, 0x05, 0x0e, 0x05, 0x1b, 0x5d, 0x20, 0x21, 0x1b, \n\t0xbe, 0xdd, 0x7f, 0x0a, 0x1c, 0x0b, 0x0e, 0x21, 0x98, 0x0e, 0x01, 0xcf, \n\t0x08, 0x08, 0x0e, 0x0c, 0x1b, 0x0b, 0x38, 0xae, 0x3b, 0x3b, 0xbe, 0x1c, \n\t0x7b, 0x3d, 0x05, 0x0f, 0x05, 0x04, 0x37, 0x8c, 0x75, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x32, 0x00, 0x50, 0x01, 0xf4, 0x01, 0xa4, 0x00, 0x0c, \n\t0x00, 0x00, 0x25, 0x22, 0x06, 0x07, 0x3e, 0x04, 0x33, 0x35, 0x17, 0x07, \n\t0x01, 0x40, 0x69, 0x7a, 0x2b, 0x02, 0x09, 0x29, 0x37, 0x65, 0x3e, 0xb4, \n\t0xb4, 0xc9, 0x2d, 0x4c, 0x0a, 0x21, 0x54, 0x40, 0x35, 0x60, 0xa1, 0xa7, \n\t0x00, 0x01, 0x00, 0x32, 0x00, 0x21, 0x02, 0x08, 0x01, 0xbb, 0x00, 0x18, \n\t0x00, 0x00, 0x01, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x27, 0x37, 0x16, \n\t0x33, 0x32, 0x36, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x33, 0x07, 0x27, \n\t0x33, 0x3e, 0x01, 0x01, 0x3c, 0x55, 0x77, 0x77, 0x55, 0x47, 0x37, 0x23, \n\t0x2a, 0x31, 0x3f, 0x5a, 0x5a, 0x3f, 0x3e, 0x5a, 0x01, 0x47, 0x5c, 0x5c, \n\t0x3e, 0x01, 0x78, 0x01, 0xbb, 0x78, 0xaa, 0x78, 0x2c, 0x25, 0x1e, 0x5a, \n\t0x80, 0x5a, 0x57, 0x3e, 0x66, 0x66, 0x53, 0x75, 0x00, 0x01, 0x00, 0x32, \n\t0x00, 0x2d, 0x02, 0x08, 0x01, 0xc7, 0x00, 0x18, 0x00, 0x00, 0x12, 0x32, \n\t0x16, 0x17, 0x33, 0x07, 0x27, 0x33, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, \n\t0x14, 0x16, 0x33, 0x32, 0x37, 0x17, 0x06, 0x23, 0x22, 0x26, 0x34, 0xaa, \n\t0xa8, 0x77, 0x02, 0x3d, 0x5c, 0x5c, 0x48, 0x02, 0x5a, 0x3e, 0x3f, 0x5a, \n\t0x5a, 0x3f, 0x34, 0x27, 0x23, 0x37, 0x47, 0x54, 0x78, 0x01, 0xc7, 0x74, \n\t0x53, 0x67, 0x67, 0x3e, 0x56, 0x5a, 0x40, 0x3f, 0x5a, 0x1e, 0x26, 0x2c, \n\t0x78, 0xaa, 0x00, 0x00, 0x00, 0x01, 0x00, 0x32, 0x00, 0x55, 0x01, 0x9f, \n\t0x01, 0x9f, 0x00, 0x06, 0x00, 0x00, 0x37, 0x27, 0x37, 0x15, 0x33, 0x15, \n\t0x23, 0xef, 0xbd, 0xbd, 0xb0, 0xb0, 0x55, 0xa5, 0xa5, 0x5f, 0x8b, 0x00, \n\t0x00, 0x01, 0x00, 0x32, 0x00, 0x44, 0x01, 0x7c, 0x01, 0xb1, 0x00, 0x06, \n\t0x00, 0x00, 0x25, 0x23, 0x15, 0x23, 0x35, 0x23, 0x37, 0x01, 0x7c, 0x60, \n\t0x8a, 0x60, 0xa5, 0xf3, 0xaf, 0xaf, 0xbe, 0x00, 0x00, 0x01, 0x00, 0x32, \n\t0x00, 0x44, 0x01, 0x7c, 0x01, 0xb1, 0x00, 0x06, 0x00, 0x00, 0x01, 0x07, \n\t0x27, 0x33, 0x35, 0x33, 0x15, 0x01, 0x7c, 0xa5, 0xa5, 0x60, 0x8a, 0x01, \n\t0x02, 0xbe, 0xbe, 0xaf, 0xaf, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x32, \n\t0x00, 0x7d, 0x02, 0x26, 0x01, 0x77, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x2b, \n\t0x00, 0x37, 0x00, 0x00, 0x13, 0x32, 0x16, 0x14, 0x06, 0x2b, 0x01, 0x22, \n\t0x26, 0x34, 0x36, 0x33, 0x17, 0x32, 0x16, 0x14, 0x06, 0x2b, 0x01, 0x22, \n\t0x26, 0x34, 0x36, 0x33, 0x25, 0x32, 0x14, 0x2b, 0x01, 0x15, 0x14, 0x22, \n\t0x3d, 0x01, 0x23, 0x22, 0x34, 0x3b, 0x01, 0x35, 0x34, 0x32, 0x1d, 0x01, \n\t0x27, 0x32, 0x16, 0x14, 0x06, 0x2b, 0x01, 0x22, 0x26, 0x34, 0x36, 0x33, \n\t0xe1, 0x0b, 0x0e, 0x0f, 0x0a, 0x96, 0x0a, 0x0f, 0x0e, 0x0b, 0x96, 0x0b, \n\t0x0e, 0x0f, 0x0a, 0x96, 0x0a, 0x0f, 0x0e, 0x0b, 0x01, 0xcc, 0x0f, 0x0f, \n\t0x55, 0x32, 0x52, 0x0f, 0x0f, 0x52, 0x32, 0xe1, 0x0b, 0x0e, 0x0f, 0x0a, \n\t0x96, 0x0a, 0x0f, 0x0e, 0x0b, 0x01, 0x13, 0x0f, 0x14, 0x0f, 0x0f, 0x14, \n\t0x0f, 0x64, 0x0f, 0x14, 0x0f, 0x0f, 0x14, 0x0f, 0x64, 0x32, 0x55, 0x0f, \n\t0x0f, 0x55, 0x32, 0x55, 0x0f, 0x0f, 0x55, 0x64, 0x0f, 0x14, 0x0f, 0x0f, \n\t0x14, 0x0f, 0x00, 0x00, 0x00, 0x06, 0x00, 0x32, 0x00, 0x7d, 0x01, 0x90, \n\t0x01, 0x77, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x3b, \n\t0x00, 0x47, 0x00, 0x00, 0x37, 0x32, 0x16, 0x14, 0x06, 0x2b, 0x01, 0x22, \n\t0x26, 0x34, 0x36, 0x33, 0x37, 0x32, 0x16, 0x14, 0x06, 0x2b, 0x01, 0x22, \n\t0x26, 0x34, 0x36, 0x33, 0x37, 0x32, 0x16, 0x14, 0x06, 0x2b, 0x01, 0x22, \n\t0x26, 0x34, 0x36, 0x33, 0x17, 0x22, 0x26, 0x34, 0x36, 0x3b, 0x01, 0x32, \n\t0x16, 0x14, 0x06, 0x23, 0x15, 0x32, 0x16, 0x14, 0x06, 0x2b, 0x01, 0x22, \n\t0x26, 0x34, 0x36, 0x33, 0x17, 0x32, 0x16, 0x14, 0x06, 0x2b, 0x01, 0x22, \n\t0x26, 0x34, 0x36, 0x33, 0x64, 0x0a, 0x0f, 0x0f, 0x0a, 0x19, 0x0a, 0x0f, \n\t0x0e, 0x0b, 0x19, 0x0a, 0x0f, 0x0f, 0x0a, 0x19, 0x0a, 0x0f, 0x0e, 0x0b, \n\t0x19, 0x0a, 0x0f, 0x0f, 0x0a, 0x19, 0x0a, 0x0f, 0x0e, 0x0b, 0x7d, 0x0a, \n\t0x0f, 0x0f, 0x0a, 0xaf, 0x0b, 0x0e, 0x0f, 0x0a, 0x0b, 0x0e, 0x0f, 0x0a, \n\t0xaf, 0x0a, 0x0f, 0x0f, 0x0a, 0xaf, 0x0b, 0x0e, 0x0f, 0x0a, 0xaf, 0x0a, \n\t0x0f, 0x0f, 0x0a, 0xaf, 0x0f, 0x14, 0x0f, 0x0f, 0x14, 0x0f, 0x64, 0x0f, \n\t0x14, 0x0f, 0x0f, 0x14, 0x0f, 0x64, 0x0f, 0x14, 0x0f, 0x0f, 0x14, 0x0f, \n\t0x32, 0x0f, 0x14, 0x0f, 0x0f, 0x14, 0x0f, 0x32, 0x0f, 0x14, 0x0f, 0x0f, \n\t0x14, 0x0f, 0x64, 0x0f, 0x14, 0x0f, 0x0f, 0x14, 0x0f, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x32, 0x00, 0x3c, 0x01, 0x9f, 0x01, 0xb8, 0x00, 0x06, \n\t0x00, 0x00, 0x13, 0x15, 0x33, 0x15, 0x23, 0x15, 0x27, 0xef, 0xb0, 0xb0, \n\t0xbd, 0x01, 0xb8, 0x5f, 0xbd, 0x60, 0xbe, 0x00, 0x00, 0x01, 0x00, 0x32, \n\t0x00, 0x3c, 0x01, 0x9f, 0x01, 0xb8, 0x00, 0x06, 0x00, 0x00, 0x13, 0x17, \n\t0x07, 0x35, 0x23, 0x35, 0x33, 0xe1, 0xbe, 0xbe, 0xaf, 0xaf, 0x01, 0xb8, \n\t0xbe, 0xbe, 0x60, 0xbd, 0x00, 0x01, 0x00, 0x32, 0x00, 0x44, 0x01, 0xae, \n\t0x01, 0xb1, 0x00, 0x06, 0x00, 0x00, 0x25, 0x23, 0x15, 0x23, 0x35, 0x23, \n\t0x37, 0x01, 0xae, 0x60, 0xbc, 0x60, 0xbe, 0xf3, 0xaf, 0xaf, 0xbe, 0x00, \n\t0x00, 0x01, 0x00, 0x32, 0x00, 0x44, 0x01, 0xae, 0x01, 0xb1, 0x00, 0x06, \n\t0x00, 0x00, 0x01, 0x07, 0x27, 0x33, 0x35, 0x33, 0x15, 0x01, 0xae, 0xbe, \n\t0xbe, 0x60, 0xbc, 0x01, 0x02, 0xbe, 0xbe, 0xaf, 0xaf, 0x00, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x32, 0x00, 0x19, 0x02, 0x26, 0x01, 0xdb, 0x00, 0x28, \n\t0x00, 0x34, 0x00, 0x00, 0x25, 0x16, 0x1d, 0x01, 0x21, 0x35, 0x36, 0x37, \n\t0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x2e, 0x01, 0x27, 0x34, 0x36, 0x3f, \n\t0x01, 0x26, 0x27, 0x26, 0x36, 0x32, 0x16, 0x0f, 0x01, 0x16, 0x15, 0x0e, \n\t0x03, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x37, 0x33, 0x15, 0x23, 0x15, \n\t0x23, 0x35, 0x23, 0x35, 0x33, 0x35, 0x33, 0x01, 0x68, 0x5a, 0xfe, 0x70, \n\t0x12, 0x17, 0x2f, 0x23, 0x17, 0x04, 0x01, 0x15, 0x02, 0x05, 0x02, 0x02, \n\t0x04, 0x02, 0x03, 0x2e, 0x72, 0x2e, 0x02, 0x07, 0x09, 0x01, 0x07, 0x07, \n\t0x07, 0x01, 0x05, 0x17, 0x24, 0xa2, 0x4b, 0x4b, 0x32, 0x4b, 0x4b, 0x32, \n\t0x8b, 0x20, 0x1d, 0x35, 0x65, 0x07, 0x06, 0x11, 0x23, 0x1e, 0x0b, 0x1a, \n\t0x18, 0x06, 0x0d, 0x18, 0x08, 0x0a, 0x01, 0x02, 0x19, 0x13, 0x1b, 0x3a, \n\t0x3a, 0x1b, 0x2c, 0x04, 0x11, 0x0e, 0x0f, 0x02, 0x06, 0x06, 0x17, 0x1b, \n\t0x0b, 0x1e, 0x23, 0x77, 0x32, 0x4b, 0x4b, 0x32, 0x4b, 0x00, 0x00, 0x00, \n\t0x00, 0x03, 0x00, 0x32, 0x00, 0x13, 0x02, 0x00, 0x01, 0xe1, 0x00, 0x0a, \n\t0x00, 0x18, 0x00, 0x43, 0x00, 0x00, 0x12, 0x36, 0x16, 0x17, 0x16, 0x06, \n\t0x07, 0x06, 0x26, 0x27, 0x26, 0x17, 0x32, 0x36, 0x35, 0x36, 0x26, 0x2b, \n\t0x01, 0x22, 0x06, 0x07, 0x14, 0x16, 0x17, 0x37, 0x36, 0x35, 0x34, 0x27, \n\t0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x15, 0x33, 0x35, 0x34, 0x37, 0x36, \n\t0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x0f, 0x01, 0x0e, 0x03, \n\t0x07, 0x06, 0x07, 0x15, 0x33, 0x35, 0x34, 0x37, 0x36, 0x3f, 0x01, 0x36, \n\t0xb7, 0xbe, 0x88, 0x02, 0x01, 0x85, 0x5f, 0x5f, 0x89, 0x01, 0x02, 0xe4, \n\t0x0f, 0x13, 0x01, 0x13, 0x0f, 0x01, 0x0e, 0x13, 0x01, 0x13, 0x0e, 0x54, \n\t0x0d, 0x1b, 0x1a, 0x29, 0x20, 0x14, 0x22, 0x02, 0x37, 0x08, 0x08, 0x13, \n\t0x14, 0x06, 0x08, 0x08, 0x04, 0x06, 0x03, 0x03, 0x0a, 0x0a, 0x0b, 0x03, \n\t0x07, 0x02, 0x36, 0x02, 0x03, 0x0b, 0x0e, 0x17, 0x01, 0xdf, 0x02, 0x84, \n\t0x5f, 0x5f, 0x89, 0x02, 0x01, 0x85, 0x5f, 0x5f, 0xe8, 0x13, 0x0e, 0x0f, \n\t0x13, 0x12, 0x0e, 0x0f, 0x13, 0x01, 0xa4, 0x11, 0x16, 0x27, 0x13, 0x13, \n\t0x0d, 0x15, 0x34, 0x02, 0x02, 0x0d, 0x0e, 0x0c, 0x0a, 0x0a, 0x0c, 0x09, \n\t0x0b, 0x06, 0x04, 0x02, 0x02, 0x07, 0x08, 0x09, 0x04, 0x0a, 0x1d, 0x04, \n\t0x02, 0x06, 0x08, 0x0a, 0x08, 0x09, 0x11, 0x00, 0x00, 0x03, 0x00, 0x32, \n\t0x00, 0x13, 0x02, 0x00, 0x01, 0xe1, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x2b, \n\t0x00, 0x00, 0x12, 0x36, 0x16, 0x17, 0x16, 0x06, 0x07, 0x06, 0x26, 0x27, \n\t0x26, 0x25, 0x22, 0x06, 0x15, 0x06, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, \n\t0x03, 0x32, 0x36, 0x37, 0x27, 0x06, 0x23, 0x22, 0x3f, 0x01, 0x36, 0x23, \n\t0x22, 0x06, 0x07, 0x17, 0x36, 0x33, 0x32, 0x0f, 0x01, 0x06, 0xb7, 0xbe, \n\t0x88, 0x02, 0x01, 0x85, 0x5f, 0x5f, 0x89, 0x01, 0x02, 0x00, 0xff, 0x15, \n\t0x17, 0x01, 0x11, 0x10, 0x13, 0x17, 0x5a, 0x0f, 0x36, 0x1a, 0x09, 0x18, \n\t0x0c, 0x07, 0x05, 0x15, 0x0d, 0x18, 0x0f, 0x3b, 0x1c, 0x08, 0x1a, 0x0b, \n\t0x06, 0x06, 0x12, 0x0d, 0x01, 0xdf, 0x02, 0x84, 0x5f, 0x5f, 0x89, 0x02, \n\t0x01, 0x85, 0x5f, 0x5f, 0x3e, 0x18, 0x0d, 0x0e, 0x10, 0x16, 0x10, 0x1d, \n\t0xfe, 0xd7, 0x1a, 0x1a, 0x0c, 0x12, 0x13, 0x50, 0x30, 0x1d, 0x17, 0x0d, \n\t0x11, 0x11, 0x4c, 0x34, 0x00, 0x03, 0x00, 0x32, 0x00, 0x6e, 0x02, 0x26, \n\t0x01, 0x86, 0x00, 0x13, 0x00, 0x1d, 0x00, 0x2d, 0x00, 0x00, 0x12, 0x32, \n\t0x1e, 0x03, 0x14, 0x0e, 0x03, 0x22, 0x2e, 0x03, 0x34, 0x3e, 0x02, 0x16, \n\t0x32, 0x36, 0x35, 0x34, 0x26, 0x22, 0x06, 0x15, 0x14, 0x37, 0x16, 0x3e, \n\t0x01, 0x17, 0x14, 0x06, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x0e, \n\t0x01, 0xfe, 0x5c, 0x55, 0x38, 0x2b, 0x14, 0x14, 0x2b, 0x38, 0x55, 0x5c, \n\t0x55, 0x38, 0x2b, 0x14, 0x14, 0x2b, 0x38, 0x55, 0x5c, 0x41, 0x41, 0x5c, \n\t0x41, 0x6f, 0x04, 0x1d, 0x15, 0x02, 0x21, 0x2e, 0x20, 0x20, 0x17, 0x07, \n\t0x04, 0x08, 0x01, 0x86, 0x19, 0x25, 0x28, 0x1f, 0x0e, 0x1e, 0x29, 0x25, \n\t0x19, 0x19, 0x25, 0x29, 0x1e, 0x0e, 0x1f, 0x28, 0x25, 0xde, 0x3f, 0x2c, \n\t0x2d, 0x3f, 0x3f, 0x2d, 0x2c, 0x2c, 0x04, 0x06, 0x05, 0x07, 0x16, 0x1f, \n\t0x1f, 0x16, 0x17, 0x1f, 0x17, 0x18, 0x00, 0x00, 0x00, 0x02, 0x00, 0x32, \n\t0x00, 0x00, 0x02, 0x12, 0x01, 0xf5, 0x00, 0x1c, 0x00, 0x2e, 0x00, 0x00, \n\t0x01, 0x16, 0x06, 0x07, 0x17, 0x16, 0x0f, 0x01, 0x06, 0x0f, 0x01, 0x06, \n\t0x2f, 0x01, 0x26, 0x36, 0x3f, 0x01, 0x36, 0x3b, 0x01, 0x32, 0x1f, 0x01, \n\t0x36, 0x27, 0x26, 0x37, 0x36, 0x07, 0x36, 0x27, 0x07, 0x06, 0x23, 0x22, \n\t0x27, 0x26, 0x3f, 0x01, 0x26, 0x07, 0x0e, 0x01, 0x17, 0x1e, 0x01, 0x02, \n\t0x0a, 0x12, 0x2c, 0x2a, 0x09, 0x08, 0x05, 0x18, 0x06, 0x0c, 0xe8, 0x15, \n\t0x0b, 0x69, 0x06, 0x03, 0x09, 0xe8, 0x0d, 0x0e, 0x4f, 0x0f, 0x09, 0x0e, \n\t0x54, 0x1b, 0x05, 0x0e, 0x10, 0x69, 0x14, 0x03, 0x10, 0x04, 0x02, 0x09, \n\t0x05, 0x06, 0x0e, 0x0c, 0x18, 0x16, 0x0e, 0x06, 0x0a, 0x09, 0x21, 0x01, \n\t0xea, 0x35, 0x5d, 0x20, 0x0c, 0x0e, 0x0d, 0x4f, 0x0f, 0x08, 0xa4, 0x0f, \n\t0x11, 0x98, 0x09, 0x15, 0x06, 0xa4, 0x09, 0x0d, 0x14, 0x41, 0x4e, 0x0e, \n\t0x06, 0x04, 0xf8, 0x10, 0x18, 0x08, 0x02, 0x09, 0x0f, 0x05, 0x07, 0x11, \n\t0x11, 0x09, 0x21, 0x0e, 0x0d, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x32, \n\t0x00, 0x58, 0x02, 0x26, 0x01, 0x9d, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x32, \n\t0x16, 0x14, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x27, 0x07, 0x33, 0x15, 0x23, \n\t0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x26, 0x35, 0x34, 0x36, \n\t0x33, 0x32, 0x16, 0x17, 0x36, 0x01, 0xae, 0x32, 0x46, 0x46, 0x32, 0x5f, \n\t0x35, 0x58, 0x57, 0x34, 0x7c, 0x25, 0x36, 0x35, 0x26, 0x07, 0x03, 0x01, \n\t0x4e, 0x37, 0x2d, 0x46, 0x0c, 0x0e, 0x01, 0x42, 0x44, 0x62, 0x44, 0x5f, \n\t0x73, 0x73, 0x5f, 0x34, 0x24, 0x25, 0x34, 0x01, 0x06, 0x0d, 0x36, 0x4c, \n\t0x34, 0x29, 0x02, 0x00, 0x00, 0x01, 0x00, 0x32, 0x00, 0x50, 0x01, 0xf4, \n\t0x01, 0xa4, 0x00, 0x0e, 0x00, 0x00, 0x25, 0x2e, 0x01, 0x23, 0x15, 0x27, \n\t0x37, 0x15, 0x32, 0x1e, 0x04, 0x17, 0x01, 0xf4, 0x2b, 0x7a, 0x68, 0xb5, \n\t0xb5, 0x2d, 0x4e, 0x35, 0x2b, 0x1a, 0x12, 0x03, 0x50, 0x4c, 0x2d, 0x6d, \n\t0xa7, 0xa1, 0x60, 0x1b, 0x2b, 0x34, 0x34, 0x2b, 0x0d, 0x00, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x32, 0x00, 0x50, 0x02, 0x26, 0x01, 0xa4, 0x00, 0x05, \n\t0x00, 0x12, 0x00, 0x00, 0x13, 0x07, 0x17, 0x15, 0x27, 0x37, 0x17, 0x32, \n\t0x1e, 0x02, 0x1f, 0x01, 0x2e, 0x01, 0x23, 0x15, 0x27, 0x37, 0xe7, 0x6a, \n\t0x6a, 0xb5, 0xb5, 0x7d, 0x34, 0x4e, 0x25, 0x17, 0x02, 0x02, 0x2b, 0x52, \n\t0x45, 0xb5, 0xb5, 0x01, 0x61, 0x5e, 0x62, 0x45, 0xa7, 0xa1, 0x60, 0x32, \n\t0x48, 0x48, 0x19, 0x19, 0x4d, 0x2c, 0x6d, 0xa7, 0xa1, 0x00, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x32, 0x00, 0x63, 0x02, 0x26, 0x01, 0x90, 0x00, 0x0d, \n\t0x00, 0x19, 0x00, 0x00, 0x13, 0x16, 0x14, 0x0f, 0x01, 0x17, 0x16, 0x14, \n\t0x07, 0x06, 0x2f, 0x01, 0x37, 0x36, 0x1f, 0x01, 0x07, 0x06, 0x27, 0x26, \n\t0x3f, 0x01, 0x27, 0x26, 0x37, 0x36, 0xf0, 0x08, 0x08, 0x7b, 0x7b, 0x08, \n\t0x08, 0x0f, 0x0f, 0xa0, 0xa0, 0x0f, 0xa6, 0x9f, 0x9f, 0x10, 0x0f, 0x10, \n\t0x10, 0x7c, 0x7c, 0x10, 0x10, 0x0f, 0x01, 0x89, 0x07, 0x12, 0x06, 0x70, \n\t0x71, 0x06, 0x12, 0x07, 0x0f, 0x0f, 0x90, 0x8f, 0x0f, 0x0f, 0x8f, 0x90, \n\t0x0f, 0x0f, 0x10, 0x0f, 0x71, 0x70, 0x0f, 0x10, 0x0f, 0x00, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x32, 0x00, 0x37, 0x02, 0x26, 0x01, 0xbd, 0x00, 0x15, \n\t0x00, 0x24, 0x00, 0x00, 0x25, 0x35, 0x37, 0x15, 0x14, 0x06, 0x23, 0x21, \n\t0x22, 0x26, 0x35, 0x11, 0x34, 0x36, 0x3b, 0x01, 0x0e, 0x01, 0x0f, 0x01, \n\t0x23, 0x15, 0x25, 0x22, 0x06, 0x07, 0x34, 0x3e, 0x05, 0x33, 0x35, 0x17, \n\t0x07, 0x01, 0xa9, 0x32, 0x0f, 0x0a, 0xfe, 0x89, 0x0a, 0x0f, 0x0e, 0x0b, \n\t0x90, 0x10, 0x1b, 0x06, 0x05, 0x41, 0x01, 0x1c, 0x53, 0x4c, 0x2a, 0x01, \n\t0x08, 0x0e, 0x1e, 0x28, 0x43, 0x29, 0xa6, 0xa6, 0x69, 0x1c, 0x29, 0x5e, \n\t0x0a, 0x0f, 0x0f, 0x0a, 0x01, 0x13, 0x0b, 0x0e, 0x0c, 0x19, 0x07, 0x06, \n\t0xe1, 0xae, 0x29, 0x46, 0x04, 0x0e, 0x2a, 0x25, 0x2e, 0x21, 0x17, 0x4e, \n\t0x7d, 0x82, 0x00, 0x00, 0x00, 0x03, 0x00, 0x32, 0x00, 0x26, 0x02, 0x1c, \n\t0x01, 0xcf, 0x00, 0x15, 0x00, 0x29, 0x00, 0x2d, 0x00, 0x00, 0x13, 0x22, \n\t0x37, 0x36, 0x37, 0x32, 0x3e, 0x01, 0x3b, 0x01, 0x35, 0x33, 0x15, 0x33, \n\t0x32, 0x1e, 0x01, 0x33, 0x16, 0x07, 0x06, 0x23, 0x17, 0x32, 0x16, 0x1d, \n\t0x01, 0x14, 0x06, 0x2b, 0x01, 0x17, 0x21, 0x37, 0x23, 0x22, 0x26, 0x3d, \n\t0x01, 0x34, 0x36, 0x33, 0x17, 0x21, 0x27, 0x23, 0x53, 0x0d, 0x02, 0x02, \n\t0x04, 0x01, 0x2f, 0x2e, 0x06, 0x16, 0xbe, 0x17, 0x06, 0x2d, 0x2f, 0x01, \n\t0x09, 0x03, 0x02, 0x08, 0x05, 0x0a, 0x11, 0x11, 0x0a, 0x32, 0x16, 0xfe, \n\t0x84, 0x16, 0x31, 0x0a, 0x12, 0x12, 0x0a, 0x4d, 0x01, 0x18, 0x23, 0xd2, \n\t0x01, 0x52, 0x0b, 0x05, 0x02, 0x11, 0x0f, 0x4b, 0x4b, 0x0f, 0x11, 0x04, \n\t0x09, 0x05, 0x1c, 0x13, 0x0b, 0x57, 0x0b, 0x13, 0x7d, 0x7d, 0x13, 0x0b, \n\t0x57, 0x0b, 0x13, 0xde, 0xa2, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x32, \n\t0x00, 0x64, 0x02, 0x26, 0x01, 0x90, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x00, \n\t0x37, 0x33, 0x17, 0x23, 0x22, 0x26, 0x3d, 0x01, 0x23, 0x37, 0x17, 0x23, \n\t0x05, 0x33, 0x07, 0x27, 0x33, 0x35, 0x23, 0x27, 0x33, 0x32, 0x16, 0x15, \n\t0xaf, 0x88, 0x40, 0xe0, 0x15, 0x1d, 0x33, 0x58, 0x57, 0x32, 0x01, 0x45, \n\t0x32, 0x57, 0x58, 0x33, 0x89, 0x40, 0xe1, 0x14, 0x1e, 0xaa, 0x46, 0x1e, \n\t0x14, 0x97, 0x63, 0x63, 0x65, 0x64, 0x64, 0x82, 0x46, 0x1d, 0x15, 0x00, \n\t0x00, 0x01, 0x00, 0x32, 0x00, 0x4b, 0x01, 0xc2, 0x01, 0xa9, 0x00, 0x12, \n\t0x00, 0x00, 0x01, 0x32, 0x16, 0x1d, 0x01, 0x14, 0x06, 0x2b, 0x01, 0x15, \n\t0x27, 0x23, 0x22, 0x26, 0x3d, 0x01, 0x34, 0x36, 0x33, 0x01, 0x90, 0x15, \n\t0x1d, 0x1d, 0x15, 0x64, 0x64, 0x64, 0x14, 0x1e, 0x1e, 0x14, 0x01, 0xa9, \n\t0x1d, 0x15, 0xaf, 0x14, 0x1e, 0x4b, 0x4b, 0x1e, 0x14, 0xaf, 0x15, 0x1d, \n\t0x00, 0x02, 0x00, 0x32, 0x00, 0x19, 0x02, 0x26, 0x01, 0xdb, 0x00, 0x14, \n\t0x00, 0x24, 0x00, 0x00, 0x37, 0x33, 0x32, 0x37, 0x33, 0x15, 0x14, 0x06, \n\t0x2b, 0x01, 0x07, 0x35, 0x23, 0x22, 0x26, 0x3d, 0x01, 0x34, 0x36, 0x3b, \n\t0x01, 0x25, 0x32, 0x16, 0x1d, 0x01, 0x14, 0x06, 0x2b, 0x01, 0x15, 0x27, \n\t0x23, 0x35, 0x34, 0x36, 0x33, 0xc3, 0xaf, 0x01, 0x02, 0x02, 0x1d, 0x15, \n\t0x7d, 0x4b, 0x19, 0x14, 0x1e, 0x1e, 0x14, 0x5f, 0x01, 0x31, 0x15, 0x1d, \n\t0x1d, 0x15, 0x19, 0x4b, 0xaf, 0x1e, 0x14, 0xc3, 0x01, 0x2e, 0x14, 0x1e, \n\t0x4b, 0x4b, 0x1e, 0x14, 0x96, 0x15, 0x1d, 0x7d, 0x1d, 0x15, 0x96, 0x14, \n\t0x1e, 0x4b, 0x4b, 0xc8, 0x15, 0x1d, 0x00, 0x00, 0x00, 0x06, 0x00, 0x32, \n\t0x00, 0x32, 0x02, 0x26, 0x01, 0xc2, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x17, \n\t0x00, 0x1b, 0x00, 0x1f, 0x00, 0x32, 0x00, 0x00, 0x01, 0x32, 0x16, 0x15, \n\t0x11, 0x14, 0x06, 0x23, 0x21, 0x22, 0x26, 0x35, 0x11, 0x34, 0x36, 0x33, \n\t0x01, 0x11, 0x21, 0x11, 0x37, 0x15, 0x23, 0x35, 0x37, 0x15, 0x23, 0x35, \n\t0x37, 0x15, 0x23, 0x35, 0x05, 0x17, 0x23, 0x34, 0x33, 0x36, 0x35, 0x34, \n\t0x26, 0x35, 0x34, 0x32, 0x15, 0x14, 0x06, 0x15, 0x14, 0x16, 0x17, 0x01, \n\t0xf4, 0x15, 0x1d, 0x1d, 0x15, 0xfe, 0x70, 0x14, 0x1e, 0x1e, 0x14, 0x01, \n\t0x90, 0xfe, 0x70, 0xaf, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x01, 0x2a, 0x02, \n\t0x7d, 0x03, 0x2a, 0x1b, 0x5a, 0x1c, 0x15, 0x0b, 0x01, 0xc2, 0x1d, 0x15, \n\t0xfe, 0xd4, 0x14, 0x1e, 0x1e, 0x14, 0x01, 0x2c, 0x15, 0x1d, 0xfe, 0xa2, \n\t0x01, 0x2c, 0xfe, 0xd4, 0x62, 0x2d, 0x2d, 0x4b, 0x2d, 0x2d, 0x4b, 0x2d, \n\t0x2d, 0xa0, 0x23, 0x23, 0x0b, 0x16, 0x08, 0x28, 0x18, 0x37, 0x37, 0x18, \n\t0x28, 0x08, 0x0a, 0x10, 0x03, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x32, \n\t0x00, 0x19, 0x02, 0x26, 0x01, 0xdb, 0x00, 0x1b, 0x00, 0x2a, 0x00, 0x00, \n\t0x01, 0x32, 0x15, 0x11, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x23, 0x22, \n\t0x27, 0x26, 0x2f, 0x01, 0x26, 0x34, 0x3f, 0x01, 0x36, 0x37, 0x36, 0x3b, \n\t0x01, 0x35, 0x34, 0x33, 0x05, 0x16, 0x14, 0x0f, 0x01, 0x06, 0x23, 0x06, \n\t0x2b, 0x01, 0x27, 0x33, 0x32, 0x16, 0x17, 0x01, 0x07, 0x0a, 0x0a, 0x17, \n\t0x0a, 0x58, 0x08, 0x06, 0x06, 0x07, 0x3c, 0x05, 0x05, 0x3c, 0x07, 0x06, \n\t0x04, 0x0a, 0x58, 0x0a, 0x01, 0x31, 0x05, 0x05, 0x3b, 0x0b, 0x02, 0x07, \n\t0x07, 0x97, 0x14, 0xab, 0x09, 0x0a, 0x08, 0x01, 0xdb, 0x0a, 0xfe, 0x52, \n\t0x0a, 0x0a, 0xdc, 0x03, 0x01, 0x05, 0x29, 0x03, 0x0a, 0x03, 0x29, 0x05, \n\t0x01, 0x02, 0x5f, 0x0a, 0x68, 0x03, 0x0a, 0x03, 0x29, 0x06, 0x03, 0x73, \n\t0x04, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x32, 0x00, 0x32, 0x01, 0x2c, \n\t0x01, 0xc2, 0x00, 0x0e, 0x00, 0x16, 0x00, 0x00, 0x12, 0x32, 0x16, 0x15, \n\t0x14, 0x06, 0x0f, 0x01, 0x2e, 0x04, 0x35, 0x34, 0x16, 0x32, 0x36, 0x34, \n\t0x26, 0x22, 0x06, 0x14, 0x7b, 0x68, 0x49, 0x3e, 0x20, 0x1f, 0x05, 0x11, \n\t0x2b, 0x21, 0x1b, 0x61, 0x38, 0x28, 0x28, 0x38, 0x27, 0x01, 0xc2, 0x49, \n\t0x34, 0x35, 0x89, 0x2b, 0x2a, 0x06, 0x17, 0x42, 0x40, 0x53, 0x21, 0x34, \n\t0x79, 0x28, 0x38, 0x27, 0x27, 0x38, 0x00, 0x00, 0x00, 0x05, 0x00, 0x32, \n\t0x00, 0x32, 0x02, 0x26, 0x01, 0xc3, 0x00, 0x1d, 0x00, 0x21, 0x00, 0x25, \n\t0x00, 0x29, 0x00, 0x2d, 0x00, 0x00, 0x01, 0x16, 0x15, 0x11, 0x14, 0x07, \n\t0x06, 0x23, 0x22, 0x2f, 0x01, 0x07, 0x06, 0x2f, 0x01, 0x07, 0x06, 0x27, \n\t0x26, 0x35, 0x11, 0x34, 0x3f, 0x01, 0x36, 0x1f, 0x01, 0x37, 0x36, 0x17, \n\t0x01, 0x35, 0x07, 0x15, 0x33, 0x35, 0x27, 0x15, 0x33, 0x35, 0x07, 0x15, \n\t0x33, 0x35, 0x27, 0x15, 0x02, 0x1e, 0x08, 0x08, 0x04, 0x04, 0x04, 0x05, \n\t0x6c, 0x6c, 0x09, 0x08, 0x6d, 0x6c, 0x08, 0x09, 0x08, 0x08, 0x75, 0x09, \n\t0x08, 0x6c, 0x6d, 0x08, 0x08, 0xfe, 0xfe, 0x54, 0xc9, 0x54, 0xc9, 0x55, \n\t0xc9, 0x54, 0x01, 0x77, 0x05, 0x0a, 0xfe, 0xdc, 0x0a, 0x05, 0x03, 0x03, \n\t0x44, 0x44, 0x05, 0x05, 0x44, 0x44, 0x05, 0x05, 0x05, 0x0a, 0x01, 0x24, \n\t0x0a, 0x05, 0x49, 0x05, 0x05, 0x44, 0x44, 0x05, 0x05, 0xfe, 0xd6, 0xfd, \n\t0x34, 0xfd, 0xfd, 0x34, 0xfd, 0xfd, 0x34, 0xfd, 0xfd, 0x34, 0xfd, 0x00, \n\t0x00, 0x04, 0x00, 0x32, 0x00, 0x09, 0x02, 0x14, 0x01, 0xeb, 0x00, 0x0b, \n\t0x00, 0x15, 0x00, 0x24, 0x00, 0x2e, 0x00, 0x00, 0x01, 0x36, 0x16, 0x17, \n\t0x16, 0x06, 0x07, 0x06, 0x26, 0x27, 0x26, 0x36, 0x13, 0x3e, 0x01, 0x2e, \n\t0x01, 0x07, 0x0e, 0x01, 0x1e, 0x01, 0x27, 0x3e, 0x04, 0x3f, 0x01, 0x0e, \n\t0x02, 0x07, 0x0e, 0x01, 0x07, 0x37, 0x06, 0x14, 0x17, 0x16, 0x32, 0x37, \n\t0x36, 0x37, 0x06, 0x01, 0x20, 0x63, 0x8e, 0x02, 0x01, 0x8a, 0x64, 0x63, \n\t0x8f, 0x01, 0x02, 0x8b, 0x6a, 0x4e, 0x6e, 0x02, 0x71, 0x4e, 0x4f, 0x6d, \n\t0x02, 0x70, 0x26, 0x02, 0x08, 0x21, 0x2c, 0x51, 0x1e, 0x1e, 0x02, 0x08, \n\t0x21, 0x16, 0x15, 0x52, 0x1e, 0x3c, 0x0b, 0x0b, 0x0a, 0x1d, 0x0a, 0x1a, \n\t0x12, 0x44, 0x01, 0xea, 0x01, 0x8a, 0x63, 0x64, 0x8e, 0x02, 0x01, 0x8b, \n\t0x63, 0x64, 0x8e, 0xfe, 0x54, 0x01, 0x70, 0x9e, 0x6d, 0x01, 0x01, 0x70, \n\t0x9e, 0x6d, 0x4e, 0x0d, 0x28, 0x58, 0x2c, 0x20, 0x05, 0x05, 0x0d, 0x28, \n\t0x58, 0x16, 0x15, 0x20, 0x05, 0x84, 0x0a, 0x1c, 0x0b, 0x0b, 0x0b, 0x1a, \n\t0x43, 0x12, 0x00, 0x00, 0x00, 0x03, 0x00, 0x32, 0x00, 0x0b, 0x01, 0xae, \n\t0x01, 0xeb, 0x00, 0x0b, 0x00, 0x1f, 0x00, 0x2c, 0x00, 0x00, 0x13, 0x16, \n\t0x32, 0x37, 0x07, 0x0e, 0x02, 0x22, 0x2e, 0x01, 0x27, 0x13, 0x1e, 0x01, \n\t0x1d, 0x01, 0x14, 0x06, 0x22, 0x26, 0x3d, 0x01, 0x34, 0x36, 0x3f, 0x01, \n\t0x36, 0x3b, 0x01, 0x32, 0x17, 0x07, 0x33, 0x26, 0x27, 0x26, 0x2b, 0x01, \n\t0x22, 0x0f, 0x01, 0x33, 0x37, 0x33, 0x4b, 0x3d, 0xd0, 0x3d, 0x1b, 0x01, \n\t0x21, 0x43, 0x4a, 0x42, 0x22, 0x01, 0xd9, 0x2f, 0x40, 0x70, 0x9c, 0x70, \n\t0x40, 0x2f, 0x15, 0x0b, 0x18, 0x2e, 0x1a, 0x09, 0x06, 0x2a, 0x2e, 0x06, \n\t0x07, 0x09, 0x33, 0x0b, 0x05, 0x35, 0x2a, 0x20, 0x29, 0x01, 0x30, 0x23, \n\t0x23, 0xf3, 0x07, 0x16, 0x15, 0x15, 0x16, 0x07, 0x01, 0x89, 0x09, 0x25, \n\t0x11, 0x05, 0x1d, 0x29, 0x29, 0x1d, 0x05, 0x11, 0x25, 0x09, 0x18, 0x0d, \n\t0x0d, 0x50, 0x37, 0x08, 0x08, 0x08, 0x3f, 0x21, 0x00, 0x02, 0x00, 0x32, \n\t0x00, 0x19, 0x01, 0x90, 0x01, 0xdb, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x00, \n\t0x01, 0x32, 0x16, 0x15, 0x11, 0x14, 0x06, 0x2b, 0x01, 0x22, 0x26, 0x35, \n\t0x11, 0x34, 0x36, 0x33, 0x13, 0x11, 0x23, 0x11, 0x01, 0x5e, 0x15, 0x1d, \n\t0x1d, 0x15, 0xfa, 0x14, 0x1e, 0x1e, 0x14, 0xfa, 0xfa, 0x01, 0xdb, 0x1d, \n\t0x15, 0xfe, 0xa2, 0x14, 0x1e, 0x1e, 0x14, 0x01, 0x5e, 0x15, 0x1d, 0xfe, \n\t0x70, 0x01, 0x5e, 0xfe, 0xa2, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x32, \n\t0x00, 0x19, 0x01, 0x90, 0x01, 0xdb, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x17, \n\t0x00, 0x1b, 0x00, 0x00, 0x01, 0x32, 0x16, 0x15, 0x11, 0x14, 0x06, 0x2b, \n\t0x01, 0x22, 0x26, 0x35, 0x11, 0x34, 0x36, 0x33, 0x17, 0x15, 0x33, 0x35, \n\t0x15, 0x35, 0x23, 0x15, 0x37, 0x35, 0x23, 0x15, 0x01, 0x5e, 0x15, 0x1d, \n\t0x1d, 0x15, 0xfa, 0x14, 0x1e, 0x1e, 0x14, 0x14, 0xd2, 0xd2, 0xd2, 0xd1, \n\t0x01, 0xdb, 0x1d, 0x15, 0xfe, 0xa2, 0x14, 0x1e, 0x1e, 0x14, 0x01, 0x5e, \n\t0x15, 0x1d, 0x68, 0x2c, 0x2c, 0xf0, 0x2c, 0x2c, 0x62, 0x2d, 0x2d, 0x00, \n\t0x00, 0x03, 0x00, 0x32, 0x00, 0x00, 0x02, 0x27, 0x01, 0xf5, 0x00, 0x16, \n\t0x00, 0x1a, 0x00, 0x22, 0x00, 0x00, 0x01, 0x16, 0x07, 0x03, 0x0e, 0x01, \n\t0x2f, 0x01, 0x2e, 0x01, 0x3f, 0x01, 0x07, 0x06, 0x27, 0x03, 0x26, 0x3f, \n\t0x01, 0x36, 0x16, 0x1f, 0x01, 0x25, 0x13, 0x37, 0x03, 0x13, 0x37, 0x27, \n\t0x17, 0x16, 0x0f, 0x02, 0x02, 0x17, 0x13, 0x04, 0x4b, 0x02, 0x0e, 0x08, \n\t0xcb, 0x08, 0x08, 0x02, 0x0c, 0x5a, 0x14, 0x05, 0x50, 0x05, 0x13, 0xe3, \n\t0x08, 0x0e, 0x02, 0x21, 0xfe, 0xfe, 0x48, 0xc4, 0x48, 0x9b, 0x42, 0x95, \n\t0x26, 0x05, 0x13, 0x62, 0x0d, 0x01, 0x3b, 0x05, 0x12, 0xfe, 0xea, 0x08, \n\t0x07, 0x02, 0x37, 0x02, 0x0e, 0x07, 0x2e, 0x18, 0x05, 0x12, 0x01, 0x2d, \n\t0x12, 0x06, 0x3d, 0x02, 0x07, 0x08, 0x7a, 0x2d, 0xfe, 0xf1, 0x35, 0x01, \n\t0x0e, 0xfe, 0x59, 0xf6, 0x29, 0x8d, 0x11, 0x06, 0x1a, 0x33, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x32, 0x00, 0x4b, 0x02, 0x26, 0x01, 0xa9, 0x00, 0x0f, \n\t0x00, 0x13, 0x00, 0x00, 0x13, 0x34, 0x36, 0x33, 0x21, 0x32, 0x16, 0x1d, \n\t0x01, 0x14, 0x06, 0x23, 0x21, 0x22, 0x26, 0x35, 0x25, 0x21, 0x15, 0x21, \n\t0x32, 0x1e, 0x14, 0x01, 0x90, 0x15, 0x1d, 0x1d, 0x15, 0xfe, 0x70, 0x14, \n\t0x1e, 0x01, 0xc2, 0xfe, 0x70, 0x01, 0x90, 0x01, 0x77, 0x15, 0x1d, 0x1d, \n\t0x15, 0xfa, 0x14, 0x1e, 0x1e, 0x14, 0xfa, 0xfa, 0x00, 0x03, 0x00, 0x32, \n\t0x00, 0x3c, 0x01, 0xae, 0x01, 0xb8, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x19, \n\t0x00, 0x00, 0x13, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x23, 0x15, 0x32, \n\t0x16, 0x15, 0x23, 0x34, 0x26, 0x23, 0x16, 0x32, 0x16, 0x15, 0x14, 0x06, \n\t0x22, 0x26, 0x35, 0x34, 0x32, 0x9d, 0xdf, 0x3b, 0xbc, 0x85, 0x6d, 0x99, \n\t0x3b, 0x77, 0x54, 0x22, 0x2e, 0x22, 0x22, 0x2e, 0x22, 0x01, 0xb8, 0xdf, \n\t0x9d, 0x85, 0xbb, 0x3b, 0x99, 0x6c, 0x53, 0x77, 0x59, 0x21, 0x18, 0x17, \n\t0x21, 0x21, 0x17, 0x18, 0x00, 0x01, 0x00, 0x32, 0x00, 0x19, 0x01, 0xc2, \n\t0x01, 0xdb, 0x00, 0x2a, 0x00, 0x00, 0x25, 0x32, 0x16, 0x15, 0x14, 0x06, \n\t0x22, 0x26, 0x35, 0x34, 0x36, 0x35, 0x27, 0x06, 0x23, 0x22, 0x26, 0x34, \n\t0x36, 0x33, 0x32, 0x17, 0x37, 0x34, 0x26, 0x35, 0x34, 0x36, 0x32, 0x16, \n\t0x15, 0x14, 0x06, 0x23, 0x22, 0x27, 0x07, 0x16, 0x15, 0x14, 0x07, 0x17, \n\t0x36, 0x01, 0x77, 0x1f, 0x2c, 0x2c, 0x3e, 0x2c, 0x01, 0x82, 0x15, 0x19, \n\t0x1f, 0x2c, 0x2c, 0x1f, 0x1b, 0x13, 0x82, 0x01, 0x2c, 0x3e, 0x2c, 0x2c, \n\t0x1f, 0x1a, 0x13, 0x83, 0x01, 0x01, 0x83, 0x12, 0xaf, 0x2b, 0x20, 0x1f, \n\t0x2c, 0x2c, 0x1f, 0x03, 0x08, 0x02, 0x4e, 0x10, 0x2c, 0x3e, 0x2c, 0x0f, \n\t0x4e, 0x02, 0x08, 0x02, 0x1f, 0x2c, 0x2b, 0x20, 0x1f, 0x2c, 0x10, 0x4e, \n\t0x04, 0x09, 0x08, 0x04, 0x4e, 0x0f, 0x00, 0x00, 0x00, 0x03, 0x00, 0x32, \n\t0x00, 0x19, 0x01, 0xf4, 0x01, 0xdb, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x33, \n\t0x00, 0x00, 0x37, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, \n\t0x22, 0x26, 0x37, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, \n\t0x22, 0x26, 0x27, 0x06, 0x16, 0x33, 0x21, 0x15, 0x14, 0x2b, 0x03, 0x22, \n\t0x3d, 0x01, 0x2f, 0x01, 0x23, 0x35, 0x34, 0x3b, 0x01, 0x32, 0x1d, 0x01, \n\t0x21, 0x15, 0x14, 0x07, 0x7d, 0x1e, 0x14, 0x15, 0x1d, 0x1d, 0x15, 0x14, \n\t0x1e, 0xfa, 0x1e, 0x14, 0x15, 0x1d, 0x1d, 0x15, 0x14, 0x1e, 0xa1, 0x12, \n\t0x02, 0x15, 0x01, 0x19, 0x0a, 0x41, 0xfa, 0x0c, 0x0a, 0x05, 0x31, 0x31, \n\t0x0a, 0x4e, 0x0a, 0x01, 0x60, 0x09, 0x4b, 0x14, 0x1e, 0x1e, 0x14, 0x15, \n\t0x1d, 0x1d, 0x15, 0x14, 0x1e, 0x1e, 0x14, 0x15, 0x1d, 0x1d, 0x8b, 0x05, \n\t0x0d, 0x26, 0x0a, 0x0a, 0x26, 0x17, 0xe3, 0x28, 0x0a, 0x0a, 0x2b, 0x89, \n\t0x0b, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x32, 0x00, 0x32, 0x02, 0x26, \n\t0x01, 0xc2, 0x00, 0x09, 0x00, 0x1e, 0x00, 0x33, 0x00, 0x00, 0x37, 0x34, \n\t0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x22, 0x26, 0x27, 0x06, 0x2b, 0x01, \n\t0x35, 0x33, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x14, 0x07, 0x06, 0x22, \n\t0x27, 0x26, 0x23, 0x22, 0x06, 0x05, 0x33, 0x15, 0x23, 0x0e, 0x01, 0x23, \n\t0x22, 0x27, 0x26, 0x34, 0x37, 0x36, 0x32, 0x17, 0x16, 0x33, 0x32, 0x36, \n\t0x37, 0x36, 0xdc, 0x2f, 0x42, 0x2f, 0x2f, 0x42, 0x2f, 0x39, 0x07, 0x1a, \n\t0x50, 0x3b, 0x14, 0x69, 0x42, 0x52, 0x3c, 0x08, 0x08, 0x09, 0x19, 0x09, \n\t0x27, 0x3c, 0x32, 0x4c, 0x01, 0x28, 0x50, 0x3b, 0x14, 0x68, 0x43, 0x52, \n\t0x3b, 0x09, 0x09, 0x08, 0x19, 0x09, 0x29, 0x3a, 0x32, 0x4c, 0x0b, 0x06, \n\t0xfa, 0x22, 0x2e, 0x2e, 0x22, 0x21, 0x2f, 0x2f, 0x3f, 0x1e, 0x3c, 0x3e, \n\t0x4e, 0x3a, 0x09, 0x19, 0x09, 0x08, 0x08, 0x29, 0x3e, 0x4e, 0x3c, 0x3e, \n\t0x4e, 0x3b, 0x09, 0x19, 0x08, 0x09, 0x09, 0x29, 0x3f, 0x2f, 0x1e, 0x00, \n\t0x00, 0x02, 0x00, 0x32, 0x00, 0x19, 0x01, 0xf4, 0x01, 0xdb, 0x00, 0x17, \n\t0x00, 0x1e, 0x00, 0x00, 0x01, 0x32, 0x16, 0x15, 0x11, 0x14, 0x06, 0x2b, \n\t0x01, 0x22, 0x26, 0x3d, 0x01, 0x33, 0x15, 0x33, 0x11, 0x23, 0x15, 0x23, \n\t0x35, 0x34, 0x36, 0x33, 0x13, 0x35, 0x23, 0x35, 0x33, 0x35, 0x17, 0x01, \n\t0xc2, 0x15, 0x1d, 0x1d, 0x15, 0xe1, 0x14, 0x1d, 0x31, 0xe1, 0xe1, 0x31, \n\t0x1d, 0x14, 0x32, 0xe1, 0xe1, 0x64, 0x01, 0xdb, 0x1d, 0x15, 0xfe, 0xa2, \n\t0x14, 0x1e, 0x1e, 0x14, 0x32, 0x32, 0x01, 0x5e, 0x4b, 0x4b, 0x15, 0x1d, \n\t0xfe, 0xb1, 0x3c, 0x4b, 0x3c, 0x61, 0x00, 0x00, 0x00, 0x02, 0x00, 0x32, \n\t0x00, 0x19, 0x01, 0xf4, 0x01, 0xdb, 0x00, 0x17, 0x00, 0x1e, 0x00, 0x00, \n\t0x25, 0x35, 0x33, 0x15, 0x14, 0x06, 0x2b, 0x01, 0x22, 0x26, 0x35, 0x11, \n\t0x34, 0x36, 0x3b, 0x01, 0x32, 0x16, 0x1d, 0x01, 0x23, 0x35, 0x23, 0x11, \n\t0x25, 0x07, 0x35, 0x23, 0x35, 0x33, 0x35, 0x01, 0x2d, 0x31, 0x1d, 0x15, \n\t0xc8, 0x14, 0x1e, 0x1e, 0x14, 0xc8, 0x15, 0x1d, 0x31, 0xc9, 0x01, 0x90, \n\t0x63, 0xe1, 0xe1, 0x4b, 0x32, 0x32, 0x14, 0x1e, 0x1e, 0x14, 0x01, 0x5e, \n\t0x15, 0x1d, 0x1d, 0x15, 0x4b, 0x4b, 0xfe, 0xa2, 0xa3, 0x62, 0x3c, 0x4b, \n\t0x3c, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x32, 0x00, 0x35, 0x01, 0xbe, \n\t0x01, 0xc0, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x33, 0x15, 0x27, \n\t0x07, 0x27, 0x37, 0x07, 0x17, 0x07, 0x17, 0x23, 0x35, 0x17, 0x01, 0x20, \n\t0x9e, 0x32, 0x49, 0x32, 0x4c, 0xb0, 0x32, 0x4c, 0x3d, 0x9e, 0x32, 0x01, \n\t0xc0, 0x9e, 0x3e, 0x4c, 0x32, 0x49, 0xad, 0x32, 0x49, 0x32, 0x9e, 0x3d, \n\t0x00, 0x02, 0x00, 0x32, 0x00, 0x19, 0x01, 0xf4, 0x01, 0xdb, 0x00, 0x06, \n\t0x00, 0x0d, 0x00, 0x00, 0x37, 0x27, 0x33, 0x15, 0x27, 0x07, 0x27, 0x01, \n\t0x07, 0x17, 0x23, 0x35, 0x17, 0x37, 0x80, 0x35, 0x94, 0x32, 0x49, 0x32, \n\t0x01, 0xc2, 0x4d, 0x34, 0x93, 0x32, 0x48, 0x94, 0x32, 0x94, 0x35, 0x4e, \n\t0x32, 0x01, 0x5e, 0x48, 0x32, 0x93, 0x34, 0x4d, 0x00, 0x03, 0x00, 0x32, \n\t0x00, 0x32, 0x01, 0xc2, 0x01, 0xc2, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x1c, \n\t0x00, 0x00, 0x01, 0x32, 0x16, 0x1d, 0x01, 0x14, 0x06, 0x2b, 0x01, 0x22, \n\t0x26, 0x3d, 0x01, 0x34, 0x36, 0x33, 0x17, 0x35, 0x23, 0x15, 0x27, 0x15, \n\t0x33, 0x15, 0x23, 0x22, 0x26, 0x3d, 0x01, 0x01, 0x90, 0x15, 0x1d, 0x1d, \n\t0x15, 0xc8, 0x14, 0x1e, 0x1d, 0x15, 0xc8, 0xc8, 0x64, 0x96, 0x96, 0x14, \n\t0x1e, 0x01, 0xc2, 0x1d, 0x15, 0xc8, 0x14, 0x1e, 0x1e, 0x14, 0xc9, 0x14, \n\t0x1d, 0xfa, 0xc8, 0xc8, 0x32, 0x96, 0x32, 0x1e, 0x14, 0x96, 0x00, 0x00, \n\t0x00, 0x05, 0x00, 0x32, 0x00, 0x19, 0x02, 0x26, 0x01, 0xdb, 0x00, 0x17, \n\t0x00, 0x21, 0x00, 0x2b, 0x00, 0x2f, 0x00, 0x36, 0x00, 0x00, 0x01, 0x32, \n\t0x16, 0x15, 0x11, 0x14, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x35, 0x21, 0x15, \n\t0x33, 0x15, 0x23, 0x22, 0x26, 0x35, 0x11, 0x34, 0x36, 0x33, 0x17, 0x32, \n\t0x35, 0x34, 0x26, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x35, 0x34, \n\t0x26, 0x22, 0x06, 0x15, 0x14, 0x16, 0x25, 0x35, 0x21, 0x15, 0x1f, 0x01, \n\t0x23, 0x15, 0x23, 0x35, 0x23, 0x01, 0xf4, 0x15, 0x1d, 0x1d, 0x15, 0x63, \n\t0x64, 0xfe, 0x6f, 0x64, 0x64, 0x14, 0x1e, 0x1e, 0x14, 0x0f, 0x13, 0x0b, \n\t0x10, 0x0b, 0x0b, 0x3a, 0x13, 0x0b, 0x10, 0x0b, 0x0b, 0x01, 0x58, 0xfe, \n\t0xd3, 0x63, 0x79, 0x4b, 0x5c, 0x4b, 0x01, 0xdb, 0x1e, 0x14, 0xfe, 0xd4, \n\t0x15, 0x1d, 0x31, 0xe7, 0xe7, 0x31, 0x1d, 0x15, 0x01, 0x2c, 0x14, 0x1e, \n\t0x54, 0x13, 0x08, 0x0a, 0x0b, 0x07, 0x08, 0x0b, 0x13, 0x08, 0x0a, 0x0b, \n\t0x07, 0x08, 0x0b, 0x03, 0x1f, 0x1f, 0x63, 0x78, 0x96, 0x96, 0x00, 0x00, \n\t0x00, 0x05, 0x00, 0x32, 0x00, 0x32, 0x02, 0x26, 0x01, 0xc2, 0x00, 0x0f, \n\t0x00, 0x19, 0x00, 0x23, 0x00, 0x27, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x32, \n\t0x16, 0x15, 0x11, 0x14, 0x06, 0x23, 0x21, 0x22, 0x26, 0x35, 0x11, 0x34, \n\t0x36, 0x33, 0x16, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x35, 0x34, \n\t0x07, 0x14, 0x16, 0x33, 0x32, 0x35, 0x34, 0x26, 0x22, 0x06, 0x01, 0x35, \n\t0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x01, 0xf4, 0x15, 0x1d, 0x1d, 0x15, \n\t0xfe, 0x70, 0x14, 0x1e, 0x1e, 0x14, 0x49, 0x10, 0x0b, 0x0b, 0x08, 0x13, \n\t0x58, 0x0b, 0x08, 0x13, 0x0b, 0x10, 0x0b, 0x01, 0x95, 0xfe, 0x6f, 0x01, \n\t0x91, 0xfe, 0xd3, 0x01, 0xc2, 0x1e, 0x14, 0xfe, 0xd4, 0x15, 0x1d, 0x1d, \n\t0x15, 0x01, 0x2c, 0x14, 0x1e, 0x2f, 0x0b, 0x07, 0x08, 0x0b, 0x13, 0x08, \n\t0x08, 0x08, 0x0b, 0x13, 0x08, 0x0a, 0x0b, 0xfe, 0xdc, 0xe6, 0xe6, 0x01, \n\t0x0e, 0x1e, 0x1e, 0x00, 0x00, 0x02, 0x00, 0x32, 0x00, 0x00, 0x01, 0x18, \n\t0x01, 0xf4, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x13, 0x17, 0x23, 0x13, \n\t0x27, 0x33, 0xa5, 0x73, 0xe6, 0x73, 0x73, 0xe6, 0x01, 0xf4, 0xb6, 0xfe, \n\t0xc2, 0xb7, 0x00, 0x00, 0x00, 0x03, 0x00, 0x32, 0x00, 0x14, 0x01, 0xfe, \n\t0x01, 0xe0, 0x00, 0x07, 0x00, 0x11, 0x00, 0x18, 0x00, 0x00, 0x12, 0x32, \n\t0x16, 0x14, 0x06, 0x22, 0x26, 0x34, 0x12, 0x32, 0x36, 0x35, 0x34, 0x26, \n\t0x22, 0x06, 0x15, 0x14, 0x37, 0x15, 0x33, 0x07, 0x27, 0x33, 0x35, 0xb9, \n\t0xbe, 0x87, 0x87, 0xbe, 0x87, 0x9c, 0x94, 0x6a, 0x6a, 0x94, 0x6a, 0xe1, \n\t0x38, 0x65, 0x65, 0x38, 0x01, 0xe0, 0x87, 0xbe, 0x87, 0x87, 0xbe, 0xfe, \n\t0xed, 0x6a, 0x4a, 0x4b, 0x69, 0x69, 0x4b, 0x4a, 0xab, 0x67, 0x5f, 0x5f, \n\t0x67, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x32, 0x00, 0x14, 0x01, 0xfe, \n\t0x01, 0xe0, 0x00, 0x09, 0x00, 0x13, 0x00, 0x1a, 0x00, 0x00, 0x25, 0x14, \n\t0x06, 0x22, 0x26, 0x35, 0x34, 0x36, 0x32, 0x16, 0x05, 0x14, 0x16, 0x32, \n\t0x36, 0x35, 0x34, 0x26, 0x22, 0x06, 0x05, 0x23, 0x15, 0x27, 0x37, 0x15, \n\t0x33, 0x01, 0xfe, 0x87, 0xbe, 0x87, 0x87, 0xbe, 0x87, 0xfe, 0x66, 0x6a, \n\t0x94, 0x6a, 0x6a, 0x94, 0x6a, 0x01, 0x14, 0x66, 0x5f, 0x5f, 0x66, 0xfa, \n\t0x5f, 0x87, 0x87, 0x5f, 0x60, 0x86, 0x86, 0x60, 0x4a, 0x6a, 0x6a, 0x4a, \n\t0x4b, 0x69, 0x69, 0x78, 0x38, 0x65, 0x66, 0x39, 0x00, 0x03, 0x00, 0x32, \n\t0x00, 0x14, 0x01, 0xfe, 0x01, 0xe0, 0x00, 0x07, 0x00, 0x13, 0x00, 0x1a, \n\t0x00, 0x00, 0x36, 0x34, 0x36, 0x32, 0x16, 0x14, 0x06, 0x22, 0x25, 0x34, \n\t0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x25, 0x33, \n\t0x35, 0x17, 0x07, 0x35, 0x23, 0x32, 0x87, 0xbe, 0x87, 0x87, 0xbe, 0x01, \n\t0x13, 0x69, 0x4b, 0x4a, 0x6a, 0x6a, 0x4a, 0x4b, 0x69, 0xfe, 0xec, 0x66, \n\t0x5f, 0x5f, 0x66, 0x9b, 0xbe, 0x87, 0x87, 0xbe, 0x87, 0xe6, 0x4b, 0x69, \n\t0x69, 0x4b, 0x4a, 0x6a, 0x6a, 0x77, 0x39, 0x66, 0x65, 0x38, 0x00, 0x00, \n\t0x00, 0x03, 0x00, 0x32, 0x00, 0x14, 0x01, 0xfe, 0x01, 0xe0, 0x00, 0x09, \n\t0x00, 0x15, 0x00, 0x1c, 0x00, 0x00, 0x24, 0x22, 0x26, 0x35, 0x34, 0x36, \n\t0x32, 0x16, 0x15, 0x14, 0x03, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, \n\t0x36, 0x35, 0x34, 0x26, 0x03, 0x35, 0x23, 0x37, 0x17, 0x23, 0x15, 0x01, \n\t0x77, 0xbe, 0x87, 0x87, 0xbe, 0x87, 0xe6, 0x4a, 0x6a, 0x6a, 0x4a, 0x4b, \n\t0x69, 0x69, 0x78, 0x38, 0x65, 0x65, 0x38, 0x14, 0x87, 0x5f, 0x60, 0x86, \n\t0x86, 0x60, 0x5f, 0x01, 0x13, 0x69, 0x4b, 0x4a, 0x6a, 0x6a, 0x4a, 0x4b, \n\t0x69, 0xfe, 0xec, 0x66, 0x60, 0x60, 0x66, 0x00, 0x00, 0x01, 0x00, 0x32, \n\t0x00, 0xa5, 0x01, 0x54, 0x01, 0x50, 0x00, 0x10, 0x00, 0x00, 0x01, 0x07, \n\t0x06, 0x22, 0x2f, 0x01, 0x26, 0x34, 0x37, 0x36, 0x1f, 0x01, 0x37, 0x36, \n\t0x17, 0x16, 0x14, 0x01, 0x4c, 0x75, 0x09, 0x16, 0x09, 0x75, 0x08, 0x08, \n\t0x13, 0x14, 0x62, 0x62, 0x14, 0x13, 0x08, 0x01, 0x1e, 0x70, 0x09, 0x09, \n\t0x70, 0x08, 0x19, 0x08, 0x13, 0x13, 0x5e, 0x5e, 0x13, 0x13, 0x08, 0x19, \n\t0x00, 0x01, 0x00, 0x32, 0x00, 0x69, 0x00, 0xdc, 0x01, 0x8c, 0x00, 0x12, \n\t0x00, 0x00, 0x13, 0x36, 0x32, 0x17, 0x16, 0x0f, 0x01, 0x17, 0x16, 0x07, \n\t0x06, 0x22, 0x2f, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0xab, 0x07, 0x19, \n\t0x08, 0x13, 0x13, 0x5d, 0x5d, 0x13, 0x13, 0x08, 0x18, 0x08, 0x71, 0x08, \n\t0x08, 0x67, 0x01, 0x84, 0x08, 0x08, 0x12, 0x16, 0x62, 0x61, 0x16, 0x12, \n\t0x08, 0x08, 0x76, 0x08, 0x0b, 0x0c, 0x08, 0x6b, 0x00, 0x01, 0x00, 0x32, \n\t0x00, 0x69, 0x00, 0xdc, 0x01, 0x8c, 0x00, 0x11, 0x00, 0x00, 0x13, 0x17, \n\t0x16, 0x15, 0x14, 0x0f, 0x01, 0x06, 0x22, 0x27, 0x26, 0x3f, 0x01, 0x27, \n\t0x26, 0x37, 0x36, 0x32, 0x63, 0x71, 0x08, 0x08, 0x71, 0x08, 0x18, 0x08, \n\t0x12, 0x12, 0x5d, 0x5d, 0x12, 0x12, 0x08, 0x19, 0x01, 0x84, 0x76, 0x08, \n\t0x0c, 0x0b, 0x08, 0x76, 0x08, 0x08, 0x12, 0x16, 0x61, 0x62, 0x16, 0x12, \n\t0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x32, 0x00, 0xa5, 0x01, 0x54, \n\t0x01, 0x4f, 0x00, 0x10, 0x00, 0x00, 0x25, 0x16, 0x14, 0x07, 0x06, 0x2f, \n\t0x01, 0x07, 0x06, 0x27, 0x26, 0x34, 0x3f, 0x01, 0x36, 0x32, 0x17, 0x01, \n\t0x4c, 0x08, 0x08, 0x13, 0x14, 0x62, 0x62, 0x14, 0x13, 0x08, 0x08, 0x75, \n\t0x08, 0x18, 0x08, 0xd7, 0x08, 0x19, 0x08, 0x13, 0x13, 0x5e, 0x5e, 0x13, \n\t0x13, 0x08, 0x19, 0x08, 0x70, 0x08, 0x08, 0x00, 0x00, 0x01, 0x00, 0x32, \n\t0x00, 0xb9, 0x01, 0x1a, 0x01, 0x3c, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x36, \n\t0x17, 0x16, 0x0f, 0x01, 0x06, 0x2f, 0x01, 0x26, 0x37, 0x36, 0x1f, 0x01, \n\t0xfc, 0x0b, 0x0d, 0x0d, 0x0d, 0x62, 0x0b, 0x0d, 0x62, 0x0d, 0x0d, 0x0c, \n\t0x0d, 0x55, 0x01, 0x36, 0x0d, 0x0d, 0x0b, 0x0d, 0x60, 0x0b, 0x0b, 0x60, \n\t0x0d, 0x0b, 0x0c, 0x0c, 0x4e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x32, \n\t0x00, 0x87, 0x00, 0xb6, 0x01, 0x6e, 0x00, 0x0d, 0x00, 0x00, 0x37, 0x16, \n\t0x07, 0x06, 0x2f, 0x01, 0x26, 0x3f, 0x01, 0x36, 0x17, 0x16, 0x0f, 0x01, \n\t0xb0, 0x0d, 0x0d, 0x0d, 0x0b, 0x60, 0x0c, 0x0c, 0x60, 0x0b, 0x0d, 0x0d, \n\t0x0d, 0x4e, 0xa5, 0x0d, 0x0b, 0x0d, 0x0d, 0x61, 0x0c, 0x0d, 0x61, 0x0d, \n\t0x0d, 0x0b, 0x0d, 0x56, 0x00, 0x01, 0x00, 0x32, 0x00, 0x87, 0x00, 0xb6, \n\t0x01, 0x6e, 0x00, 0x0d, 0x00, 0x00, 0x3f, 0x01, 0x27, 0x26, 0x37, 0x36, \n\t0x1f, 0x01, 0x16, 0x0f, 0x01, 0x06, 0x27, 0x26, 0x38, 0x4f, 0x4f, 0x0d, \n\t0x0d, 0x0d, 0x0b, 0x60, 0x0c, 0x0c, 0x60, 0x0b, 0x0d, 0x0d, 0xa5, 0x55, \n\t0x56, 0x0d, 0x0b, 0x0d, 0x0d, 0x61, 0x0d, 0x0c, 0x61, 0x0d, 0x0d, 0x0b, \n\t0x00, 0x01, 0x00, 0x32, 0x00, 0xb9, 0x01, 0x1a, 0x01, 0x3c, 0x00, 0x0d, \n\t0x00, 0x00, 0x37, 0x06, 0x27, 0x26, 0x3f, 0x01, 0x36, 0x1f, 0x01, 0x16, \n\t0x07, 0x06, 0x2f, 0x01, 0x51, 0x0d, 0x0c, 0x0c, 0x0c, 0x62, 0x0d, 0x0b, \n\t0x62, 0x0c, 0x0c, 0x0c, 0x0d, 0x55, 0xbe, 0x0b, 0x0b, 0x0c, 0x0d, 0x5f, \n\t0x0d, 0x0d, 0x5f, 0x0d, 0x0c, 0x0b, 0x0b, 0x4f, 0x00, 0x01, 0x00, 0x32, \n\t0x00, 0x87, 0x01, 0xe2, 0x01, 0x6e, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x17, \n\t0x37, 0x36, 0x17, 0x16, 0x0f, 0x01, 0x06, 0x2f, 0x01, 0x26, 0x37, 0x36, \n\t0x51, 0xb9, 0xba, 0x0b, 0x0d, 0x0d, 0x0d, 0xc6, 0x0b, 0x0d, 0xc6, 0x0d, \n\t0x0d, 0x0c, 0x01, 0x68, 0xb2, 0xb2, 0x0d, 0x0d, 0x0b, 0x0d, 0xc4, 0x0b, \n\t0x0b, 0xc4, 0x0d, 0x0b, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x32, \n\t0x00, 0x23, 0x01, 0x1a, 0x01, 0xd2, 0x00, 0x0d, 0x00, 0x00, 0x25, 0x16, \n\t0x07, 0x06, 0x2f, 0x01, 0x26, 0x3f, 0x01, 0x36, 0x17, 0x16, 0x0f, 0x01, \n\t0x01, 0x14, 0x0d, 0x0d, 0x0d, 0x0b, 0xc4, 0x0c, 0x0c, 0xc4, 0x0b, 0x0d, \n\t0x0d, 0x0d, 0xb3, 0x41, 0x0d, 0x0b, 0x0d, 0x0d, 0xc5, 0x0c, 0x0d, 0xc5, \n\t0x0d, 0x0d, 0x0b, 0x0d, 0xba, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x32, \n\t0x00, 0x23, 0x01, 0x1a, 0x01, 0xd2, 0x00, 0x0d, 0x00, 0x00, 0x3f, 0x01, \n\t0x27, 0x26, 0x37, 0x36, 0x1f, 0x01, 0x16, 0x0f, 0x01, 0x06, 0x27, 0x26, \n\t0x38, 0xb3, 0xb3, 0x0d, 0x0d, 0x0d, 0x0b, 0xc4, 0x0c, 0x0c, 0xc4, 0x0b, \n\t0x0d, 0x0d, 0x41, 0xb9, 0xba, 0x0d, 0x0b, 0x0d, 0x0d, 0xc5, 0x0d, 0x0c, \n\t0xc5, 0x0d, 0x0d, 0x0b, 0x00, 0x01, 0x00, 0x32, 0x00, 0x87, 0x01, 0xe2, \n\t0x01, 0x6e, 0x00, 0x0d, 0x00, 0x00, 0x25, 0x27, 0x07, 0x06, 0x27, 0x26, \n\t0x3f, 0x01, 0x36, 0x1f, 0x01, 0x16, 0x07, 0x06, 0x01, 0xc4, 0xba, 0xb9, \n\t0x0d, 0x0c, 0x0c, 0x0c, 0xc6, 0x0d, 0x0b, 0xc6, 0x0c, 0x0c, 0x0d, 0x8c, \n\t0xb3, 0xb3, 0x0b, 0x0b, 0x0c, 0x0d, 0xc3, 0x0d, 0x0d, 0xc3, 0x0d, 0x0c, \n\t0x0b, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x32, 0x00, 0x7d, 0x02, 0x26, \n\t0x01, 0x77, 0x00, 0x10, 0x00, 0x14, 0x00, 0x00, 0x01, 0x15, 0x14, 0x06, \n\t0x23, 0x21, 0x22, 0x26, 0x3d, 0x01, 0x34, 0x36, 0x33, 0x21, 0x32, 0x16, \n\t0x15, 0x07, 0x35, 0x21, 0x15, 0x02, 0x26, 0x1d, 0x15, 0xfe, 0x70, 0x14, \n\t0x1e, 0x1e, 0x14, 0x01, 0x90, 0x15, 0x1d, 0x32, 0xfe, 0x70, 0x01, 0x2c, \n\t0x7d, 0x15, 0x1d, 0x1d, 0x15, 0x96, 0x14, 0x1e, 0x1e, 0x14, 0x96, 0x96, \n\t0x96, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x32, 0x00, 0x7d, 0x02, 0x26, \n\t0x01, 0x77, 0x00, 0x10, 0x00, 0x14, 0x00, 0x18, 0x00, 0x00, 0x01, 0x15, \n\t0x14, 0x06, 0x23, 0x21, 0x22, 0x26, 0x3d, 0x01, 0x34, 0x36, 0x33, 0x21, \n\t0x32, 0x16, 0x15, 0x07, 0x35, 0x21, 0x15, 0x37, 0x35, 0x33, 0x15, 0x02, \n\t0x26, 0x1d, 0x15, 0xfe, 0x70, 0x14, 0x1e, 0x1e, 0x14, 0x01, 0x90, 0x15, \n\t0x1d, 0x32, 0xfe, 0x70, 0x19, 0x64, 0x01, 0x2c, 0x7d, 0x15, 0x1d, 0x1d, \n\t0x15, 0x96, 0x14, 0x1e, 0x1e, 0x14, 0x96, 0x96, 0x96, 0x19, 0x63, 0x63, \n\t0x00, 0x04, 0x00, 0x32, 0x00, 0x7d, 0x02, 0x26, 0x01, 0x77, 0x00, 0x10, \n\t0x00, 0x14, 0x00, 0x18, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x15, 0x14, 0x06, \n\t0x23, 0x21, 0x22, 0x26, 0x3d, 0x01, 0x34, 0x36, 0x33, 0x21, 0x32, 0x16, \n\t0x15, 0x07, 0x35, 0x21, 0x15, 0x37, 0x35, 0x33, 0x15, 0x33, 0x35, 0x33, \n\t0x15, 0x02, 0x26, 0x1d, 0x15, 0xfe, 0x70, 0x14, 0x1e, 0x1e, 0x14, 0x01, \n\t0x90, 0x15, 0x1d, 0x32, 0xfe, 0x70, 0x19, 0x64, 0x19, 0x64, 0x01, 0x2c, \n\t0x7d, 0x15, 0x1d, 0x1d, 0x15, 0x96, 0x14, 0x1e, 0x1e, 0x14, 0x96, 0x96, \n\t0x96, 0x19, 0x63, 0x63, 0x63, 0x63, 0x00, 0x00, 0x00, 0x05, 0x00, 0x32, \n\t0x00, 0x7d, 0x02, 0x26, 0x01, 0x77, 0x00, 0x10, 0x00, 0x14, 0x00, 0x18, \n\t0x00, 0x1c, 0x00, 0x20, 0x00, 0x00, 0x01, 0x15, 0x14, 0x06, 0x23, 0x21, \n\t0x22, 0x26, 0x3d, 0x01, 0x34, 0x36, 0x33, 0x21, 0x32, 0x16, 0x15, 0x07, \n\t0x35, 0x21, 0x15, 0x37, 0x35, 0x33, 0x15, 0x33, 0x35, 0x33, 0x15, 0x37, \n\t0x33, 0x15, 0x23, 0x02, 0x26, 0x1d, 0x15, 0xfe, 0x70, 0x14, 0x1e, 0x1e, \n\t0x14, 0x01, 0x90, 0x15, 0x1d, 0x32, 0xfe, 0x70, 0x19, 0x64, 0x19, 0x64, \n\t0x19, 0x64, 0x64, 0x01, 0x2c, 0x7d, 0x15, 0x1d, 0x1d, 0x15, 0x96, 0x14, \n\t0x1e, 0x1e, 0x14, 0x96, 0x96, 0x96, 0x19, 0x63, 0x63, 0x63, 0x63, 0x63, \n\t0x63, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x32, 0x00, 0x2d, 0x02, 0x08, \n\t0x01, 0xc7, 0x00, 0x19, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x32, 0x16, 0x14, \n\t0x06, 0x23, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, \n\t0x23, 0x22, 0x06, 0x07, 0x33, 0x07, 0x27, 0x33, 0x3e, 0x01, 0x17, 0x33, \n\t0x15, 0x17, 0x07, 0x27, 0x01, 0x3c, 0x55, 0x77, 0x77, 0x55, 0x45, 0x39, \n\t0x23, 0x29, 0x32, 0x3f, 0x5a, 0x5a, 0x3f, 0x3e, 0x59, 0x02, 0x47, 0x5c, \n\t0x5c, 0x3e, 0x02, 0x77, 0x41, 0x23, 0x41, 0x19, 0x4b, 0x01, 0xc7, 0x78, \n\t0xaa, 0x78, 0x2c, 0x26, 0x1e, 0x5a, 0x3f, 0x40, 0x5a, 0x56, 0x3e, 0x67, \n\t0x67, 0x53, 0x74, 0x5f, 0x66, 0x41, 0x19, 0x4b, 0x00, 0x08, 0x00, 0x32, \n\t0x00, 0x14, 0x01, 0xfe, 0x01, 0xe0, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x27, \n\t0x00, 0x37, 0x00, 0x42, 0x00, 0x4e, 0x00, 0x5d, 0x00, 0x69, 0x00, 0x00, \n\t0x13, 0x22, 0x07, 0x26, 0x27, 0x36, 0x37, 0x16, 0x17, 0x06, 0x15, 0x14, \n\t0x17, 0x06, 0x07, 0x26, 0x07, 0x14, 0x17, 0x06, 0x07, 0x26, 0x35, 0x34, \n\t0x37, 0x16, 0x17, 0x06, 0x37, 0x22, 0x07, 0x26, 0x27, 0x36, 0x33, 0x32, \n\t0x17, 0x06, 0x07, 0x26, 0x17, 0x26, 0x27, 0x36, 0x35, 0x34, 0x27, 0x36, \n\t0x37, 0x16, 0x33, 0x32, 0x37, 0x16, 0x17, 0x06, 0x17, 0x36, 0x37, 0x36, \n\t0x37, 0x06, 0x07, 0x36, 0x35, 0x34, 0x26, 0x27, 0x06, 0x07, 0x26, 0x27, \n\t0x36, 0x37, 0x16, 0x33, 0x32, 0x37, 0x16, 0x37, 0x16, 0x15, 0x14, 0x07, \n\t0x06, 0x07, 0x26, 0x27, 0x26, 0x27, 0x36, 0x3d, 0x01, 0x36, 0x03, 0x16, \n\t0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x36, 0xa2, 0x0b, \n\t0x0a, 0x18, 0x16, 0x1b, 0x25, 0x2e, 0x1e, 0x03, 0x02, 0x1f, 0x1b, 0x08, \n\t0x37, 0x0a, 0x1e, 0x0a, 0x21, 0x19, 0x13, 0x17, 0x04, 0xa8, 0x0e, 0x0b, \n\t0x1d, 0x1c, 0x2a, 0x27, 0x3c, 0x37, 0x26, 0x2b, 0x0d, 0x35, 0x50, 0x41, \n\t0x02, 0x07, 0x13, 0x1e, 0x0d, 0x0f, 0x07, 0x0c, 0x2f, 0x14, 0x08, 0x3b, \n\t0x13, 0x08, 0x1d, 0x19, 0x17, 0x3c, 0x03, 0x01, 0x4b, 0x5f, 0x39, 0x2d, \n\t0x22, 0x06, 0x22, 0x03, 0x07, 0x0f, 0x0b, 0x47, 0xb0, 0x4b, 0x02, 0x20, \n\t0x21, 0x0c, 0x20, 0x18, 0x32, 0x05, 0x32, 0x0d, 0x07, 0x09, 0x01, 0x07, \n\t0x2b, 0x36, 0x1d, 0x1b, 0x37, 0x01, 0x47, 0x05, 0x1a, 0x26, 0x25, 0x16, \n\t0x13, 0x16, 0x08, 0x08, 0x03, 0x08, 0x18, 0x1c, 0x02, 0x31, 0x11, 0x0d, \n\t0x39, 0x3b, 0x35, 0x41, 0x37, 0x30, 0x1f, 0x19, 0x0c, 0x98, 0x07, 0x15, \n\t0x0e, 0x0f, 0x1f, 0x07, 0x12, 0x0d, 0xe6, 0x0c, 0x2c, 0x0a, 0x05, 0x0c, \n\t0x0e, 0x16, 0x17, 0x0a, 0x04, 0x36, 0x42, 0x07, 0x4b, 0x07, 0x17, 0x02, \n\t0x07, 0x49, 0x2b, 0x18, 0x19, 0x05, 0x12, 0x26, 0x30, 0x58, 0x12, 0x25, \n\t0x48, 0x41, 0x01, 0x07, 0x31, 0xe9, 0x44, 0x66, 0x0b, 0x16, 0x09, 0x03, \n\t0x1c, 0x02, 0x49, 0x3b, 0x0a, 0x0b, 0x05, 0x15, 0xfe, 0xf6, 0x05, 0x04, \n\t0x09, 0x11, 0x28, 0x20, 0x15, 0x06, 0x50, 0x00, 0x00, 0x02, 0x00, 0x32, \n\t0x00, 0x8a, 0x02, 0x27, 0x01, 0x6b, 0x00, 0x1a, 0x00, 0x26, 0x00, 0x00, \n\t0x01, 0x16, 0x0f, 0x01, 0x0e, 0x01, 0x23, 0x21, 0x22, 0x26, 0x2f, 0x01, \n\t0x26, 0x37, 0x3e, 0x02, 0x37, 0x36, 0x3b, 0x02, 0x32, 0x17, 0x1e, 0x02, \n\t0x07, 0x33, 0x27, 0x21, 0x07, 0x33, 0x32, 0x1f, 0x01, 0x33, 0x37, 0x36, \n\t0x02, 0x16, 0x14, 0x05, 0x0e, 0x02, 0x12, 0x0b, 0xfe, 0x68, 0x0b, 0x12, \n\t0x02, 0x0e, 0x04, 0x14, 0x04, 0x1c, 0x28, 0x06, 0x0b, 0x0f, 0x81, 0x81, \n\t0x0f, 0x0b, 0x08, 0x25, 0x1e, 0x81, 0x59, 0x33, 0xfe, 0xea, 0x33, 0x59, \n\t0x04, 0x02, 0x14, 0x96, 0x14, 0x02, 0x01, 0x12, 0x15, 0x0f, 0x4d, 0x0a, \n\t0x0d, 0x0d, 0x0a, 0x4d, 0x10, 0x14, 0x05, 0x1c, 0x27, 0x06, 0x0b, 0x0b, \n\t0x08, 0x24, 0x1d, 0x15, 0x39, 0x39, 0x04, 0x32, 0x32, 0x04, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x32, 0x00, 0x3f, 0x01, 0xf5, 0x01, 0xb6, 0x00, 0x1a, \n\t0x00, 0x2a, 0x00, 0x00, 0x25, 0x16, 0x0f, 0x01, 0x0e, 0x01, 0x23, 0x21, \n\t0x22, 0x26, 0x2f, 0x01, 0x26, 0x3f, 0x01, 0x36, 0x3b, 0x01, 0x07, 0x23, \n\t0x17, 0x37, 0x23, 0x27, 0x33, 0x32, 0x1f, 0x01, 0x36, 0x26, 0x23, 0x21, \n\t0x22, 0x06, 0x1f, 0x01, 0x1e, 0x01, 0x33, 0x21, 0x32, 0x36, 0x37, 0x01, \n\t0xec, 0x0c, 0x05, 0x11, 0x01, 0x11, 0x0b, 0xfe, 0x9c, 0x0b, 0x11, 0x01, \n\t0x11, 0x04, 0x0b, 0x4f, 0x0b, 0x19, 0x34, 0x0a, 0x43, 0x7f, 0x80, 0x44, \n\t0x09, 0x33, 0x19, 0x0c, 0x2c, 0x01, 0x0c, 0x0b, 0xfe, 0xbe, 0x0b, 0x0c, \n\t0x01, 0x07, 0x01, 0x11, 0x0a, 0x01, 0x28, 0x0b, 0x11, 0x01, 0xe4, 0x1a, \n\t0x16, 0x5c, 0x0a, 0x0f, 0x0f, 0x0a, 0x5c, 0x19, 0x17, 0xbb, 0x17, 0x66, \n\t0x69, 0x69, 0x66, 0x17, 0xfd, 0x0b, 0x10, 0x10, 0x0b, 0x25, 0x0b, 0x0f, \n\t0x0f, 0x0b, 0x00, 0x00, 0x00, 0x06, 0x00, 0x32, 0x00, 0x13, 0x02, 0x00, \n\t0x01, 0xe1, 0x00, 0x0a, 0x00, 0x13, 0x00, 0x1d, 0x00, 0x26, 0x00, 0x30, \n\t0x00, 0x3a, 0x00, 0x00, 0x12, 0x36, 0x16, 0x17, 0x16, 0x06, 0x07, 0x06, \n\t0x26, 0x27, 0x26, 0x37, 0x22, 0x07, 0x17, 0x36, 0x32, 0x17, 0x37, 0x26, \n\t0x03, 0x26, 0x35, 0x34, 0x37, 0x27, 0x06, 0x15, 0x16, 0x1f, 0x01, 0x36, \n\t0x37, 0x27, 0x06, 0x22, 0x27, 0x07, 0x16, 0x36, 0x32, 0x36, 0x35, 0x34, \n\t0x26, 0x22, 0x06, 0x15, 0x14, 0x1f, 0x01, 0x36, 0x27, 0x34, 0x27, 0x07, \n\t0x16, 0x15, 0x14, 0xb7, 0xbe, 0x88, 0x02, 0x01, 0x85, 0x5f, 0x5f, 0x89, \n\t0x01, 0x02, 0xe5, 0x2f, 0x2a, 0x1f, 0x1c, 0x42, 0x1c, 0x1f, 0x2c, 0xae, \n\t0x0e, 0x0e, 0x33, 0x17, 0x01, 0x16, 0xb4, 0x31, 0x28, 0x1f, 0x1e, 0x3e, \n\t0x1e, 0x1f, 0x2b, 0x03, 0x5c, 0x40, 0x40, 0x5c, 0x40, 0xec, 0x34, 0x17, \n\t0x01, 0x16, 0x34, 0x0e, 0x01, 0xdf, 0x02, 0x84, 0x5f, 0x5f, 0x89, 0x02, \n\t0x01, 0x85, 0x5f, 0x5f, 0x6c, 0x16, 0x34, 0x0e, 0x0e, 0x34, 0x17, 0xfe, \n\t0xfa, 0x1e, 0x1f, 0x20, 0x1e, 0x1f, 0x2c, 0x33, 0x30, 0x2a, 0x6c, 0x02, \n\t0x15, 0x34, 0x0f, 0x0f, 0x34, 0x17, 0x5a, 0x41, 0x2d, 0x2e, 0x40, 0x40, \n\t0x2e, 0x2d, 0x10, 0x1f, 0x30, 0x2f, 0x30, 0x2a, 0x1f, 0x1e, 0x20, 0x1f, \n\t0x00, 0x02, 0x00, 0x32, 0x00, 0x00, 0x01, 0x4b, 0x01, 0xf5, 0x00, 0x13, \n\t0x00, 0x1f, 0x00, 0x00, 0x25, 0x16, 0x06, 0x07, 0x06, 0x26, 0x2f, 0x01, \n\t0x26, 0x36, 0x37, 0x27, 0x26, 0x37, 0x36, 0x1f, 0x01, 0x36, 0x16, 0x17, \n\t0x07, 0x3e, 0x01, 0x27, 0x2e, 0x01, 0x07, 0x0e, 0x01, 0x17, 0x1e, 0x01, \n\t0x01, 0x45, 0x0e, 0x2d, 0x2f, 0x2f, 0x51, 0x0b, 0x35, 0x0a, 0x1a, 0x1d, \n\t0x30, 0x07, 0x0e, 0x0f, 0x09, 0x31, 0x28, 0x4a, 0x0e, 0x61, 0x0e, 0x0c, \n\t0x04, 0x05, 0x19, 0x0e, 0x0e, 0x0c, 0x04, 0x05, 0x19, 0x8c, 0x28, 0x4d, \n\t0x11, 0x0e, 0x25, 0x28, 0xc0, 0x22, 0x42, 0x14, 0x5d, 0x11, 0x07, 0x09, \n\t0x10, 0x60, 0x0b, 0x26, 0x27, 0x34, 0x05, 0x1a, 0x0e, 0x0e, 0x0d, 0x04, \n\t0x05, 0x1a, 0x0e, 0x0e, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x32, \n\t0x00, 0x0e, 0x02, 0x13, 0x01, 0xe5, 0x00, 0x0e, 0x00, 0x20, 0x00, 0x00, \n\t0x37, 0x36, 0x16, 0x17, 0x1e, 0x01, 0x07, 0x06, 0x07, 0x06, 0x37, 0x34, \n\t0x37, 0x3e, 0x01, 0x01, 0x16, 0x06, 0x07, 0x06, 0x07, 0x06, 0x27, 0x26, \n\t0x27, 0x26, 0x27, 0x26, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x6d, 0x13, 0x2f, \n\t0x14, 0x15, 0x06, 0x12, 0x2b, 0x47, 0x2a, 0x02, 0x03, 0x1a, 0x0c, 0x01, \n\t0xb6, 0x0d, 0xae, 0x3b, 0x13, 0x2b, 0x04, 0x04, 0x09, 0x0f, 0x10, 0x11, \n\t0x08, 0x04, 0x20, 0x14, 0x3b, 0xe2, 0xa0, 0x11, 0x05, 0x14, 0x14, 0x2f, \n\t0x12, 0x2a, 0x09, 0x06, 0x0d, 0x02, 0x03, 0x1e, 0x55, 0x01, 0x54, 0x0d, \n\t0xde, 0x3a, 0x13, 0x21, 0x03, 0x07, 0x11, 0x0f, 0x10, 0x08, 0x03, 0x05, \n\t0x2a, 0x13, 0x3a, 0xab, 0x00, 0x03, 0x00, 0x32, 0x00, 0x1d, 0x01, 0xcc, \n\t0x01, 0xd6, 0x00, 0x07, 0x00, 0x11, 0x00, 0x27, 0x00, 0x00, 0x25, 0x37, \n\t0x17, 0x07, 0x06, 0x2f, 0x01, 0x22, 0x27, 0x37, 0x17, 0x16, 0x06, 0x23, \n\t0x07, 0x06, 0x26, 0x35, 0x27, 0x26, 0x35, 0x34, 0x36, 0x32, 0x16, 0x15, \n\t0x14, 0x0f, 0x01, 0x27, 0x37, 0x35, 0x34, 0x26, 0x22, 0x06, 0x1d, 0x01, \n\t0x17, 0x07, 0x01, 0x35, 0x08, 0x82, 0x08, 0x02, 0x0e, 0x64, 0x0e, 0xf5, \n\t0x81, 0x08, 0x01, 0x08, 0x07, 0x63, 0x06, 0x0a, 0x15, 0x01, 0x78, 0xaa, \n\t0x78, 0x01, 0x08, 0x81, 0x08, 0x2c, 0x3e, 0x2c, 0x08, 0x81, 0x35, 0x52, \n\t0x0a, 0x53, 0x0e, 0x02, 0x08, 0x57, 0x0a, 0x52, 0x06, 0x09, 0x08, 0x01, \n\t0x08, 0x05, 0xda, 0x06, 0x0b, 0x50, 0x71, 0x71, 0x50, 0x0b, 0x06, 0x55, \n\t0x0b, 0x55, 0x06, 0x1d, 0x29, 0x29, 0x1d, 0x06, 0x55, 0x0b, 0x00, 0x00, \n\t0x00, 0x04, 0x00, 0x32, 0x00, 0x32, 0x02, 0x1c, 0x01, 0xc2, 0x00, 0x0b, \n\t0x00, 0x15, 0x00, 0x2f, 0x00, 0x3d, 0x00, 0x00, 0x01, 0x15, 0x21, 0x35, \n\t0x34, 0x36, 0x37, 0x33, 0x21, 0x32, 0x1e, 0x01, 0x27, 0x32, 0x1e, 0x01, \n\t0x15, 0x23, 0x34, 0x36, 0x37, 0x33, 0x05, 0x16, 0x17, 0x16, 0x0f, 0x01, \n\t0x0e, 0x01, 0x07, 0x23, 0x21, 0x22, 0x27, 0x2e, 0x01, 0x27, 0x26, 0x3e, \n\t0x01, 0x37, 0x36, 0x3f, 0x01, 0x15, 0x21, 0x35, 0x07, 0x35, 0x23, 0x15, \n\t0x23, 0x35, 0x23, 0x15, 0x14, 0x3b, 0x01, 0x32, 0x36, 0x35, 0x01, 0xd5, \n\t0xfe, 0xa4, 0x0d, 0x06, 0x06, 0x01, 0x2a, 0x03, 0x08, 0x0e, 0x4a, 0x03, \n\t0x08, 0x0e, 0xf9, 0x0d, 0x06, 0x06, 0x01, 0x43, 0x11, 0x02, 0x03, 0x03, \n\t0x26, 0x02, 0x10, 0x06, 0x07, 0xfe, 0xa4, 0x1a, 0x04, 0x03, 0x21, 0x03, \n\t0x05, 0x07, 0x03, 0x09, 0x03, 0x02, 0x0f, 0x01, 0xa2, 0x6d, 0x23, 0x82, \n\t0x22, 0x18, 0x96, 0x0b, 0x0d, 0x01, 0x77, 0x19, 0x19, 0x0b, 0x0d, 0x01, \n\t0x01, 0x0d, 0x40, 0x01, 0x0d, 0x0b, 0x0b, 0x0d, 0x01, 0x64, 0x10, 0x07, \n\t0x09, 0x12, 0xe1, 0x0b, 0x0d, 0x01, 0x19, 0x0d, 0xc5, 0x0f, 0x0b, 0x16, \n\t0x04, 0x08, 0x03, 0x02, 0x0f, 0x28, 0x28, 0x96, 0x32, 0x28, 0x28, 0x32, \n\t0x19, 0x0c, 0x06, 0x00, 0x00, 0x04, 0x00, 0x32, 0x00, 0x64, 0x01, 0xf4, \n\t0x01, 0x90, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x13, 0x00, 0x19, 0x00, 0x00, \n\t0x01, 0x32, 0x16, 0x1d, 0x01, 0x23, 0x35, 0x03, 0x35, 0x33, 0x15, 0x23, \n\t0x22, 0x33, 0x35, 0x33, 0x15, 0x14, 0x06, 0x23, 0x01, 0x34, 0x3b, 0x01, \n\t0x15, 0x23, 0x01, 0xdb, 0x0a, 0x0f, 0xfa, 0xc8, 0x96, 0x82, 0x14, 0xc8, \n\t0xfa, 0x0e, 0x0b, 0xfe, 0x57, 0x14, 0x82, 0x96, 0x01, 0x90, 0x0f, 0x0a, \n\t0x64, 0x7d, 0xfe, 0xed, 0x64, 0x7d, 0x7d, 0x64, 0x0b, 0x0e, 0x01, 0x13, \n\t0x19, 0x7d, 0x00, 0x00, 0x00, 0x03, 0x00, 0x32, 0x00, 0x0d, 0x02, 0x26, \n\t0x01, 0xe8, 0x00, 0x0e, 0x00, 0x1e, 0x00, 0x26, 0x00, 0x00, 0x01, 0x23, \n\t0x27, 0x07, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x27, 0x26, 0x37, 0x25, 0x36, \n\t0x1f, 0x01, 0x32, 0x16, 0x1d, 0x01, 0x14, 0x06, 0x23, 0x21, 0x22, 0x26, \n\t0x3d, 0x01, 0x34, 0x36, 0x33, 0x05, 0x35, 0x27, 0x0f, 0x01, 0x27, 0x07, \n\t0x15, 0x01, 0xde, 0x32, 0x3e, 0x6b, 0x5a, 0x1a, 0x26, 0x36, 0x05, 0x10, \n\t0x01, 0x54, 0x12, 0x07, 0x68, 0x08, 0x0b, 0x0b, 0x08, 0xfe, 0x96, 0x08, \n\t0x0b, 0x0b, 0x08, 0x01, 0x4e, 0x24, 0x53, 0x41, 0x45, 0x2e, 0x01, 0x4e, \n\t0x4b, 0x4b, 0x27, 0x1a, 0x50, 0x94, 0x13, 0x07, 0x7c, 0x05, 0x11, 0xba, \n\t0x0c, 0x08, 0xec, 0x08, 0x0c, 0x0c, 0x08, 0xec, 0x08, 0x0c, 0xe2, 0x51, \n\t0x50, 0x1e, 0x42, 0x55, 0x6b, 0x2b, 0x00, 0x00, 0x00, 0x04, 0x00, 0x32, \n\t0x00, 0x0a, 0x02, 0x12, 0x01, 0xea, 0x00, 0x0b, 0x00, 0x24, 0x00, 0x59, \n\t0x00, 0x67, 0x00, 0x00, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, \n\t0x26, 0x35, 0x34, 0x36, 0x05, 0x34, 0x26, 0x27, 0x06, 0x17, 0x1e, 0x01, \n\t0x3e, 0x01, 0x17, 0x16, 0x0e, 0x01, 0x17, 0x16, 0x33, 0x1e, 0x01, 0x17, \n\t0x16, 0x07, 0x06, 0x17, 0x36, 0x03, 0x0e, 0x01, 0x07, 0x32, 0x1e, 0x03, \n\t0x17, 0x16, 0x06, 0x15, 0x14, 0x16, 0x15, 0x14, 0x16, 0x15, 0x14, 0x16, \n\t0x33, 0x32, 0x36, 0x26, 0x35, 0x34, 0x37, 0x3e, 0x01, 0x37, 0x36, 0x2e, \n\t0x04, 0x23, 0x2e, 0x01, 0x06, 0x26, 0x35, 0x34, 0x3e, 0x01, 0x37, 0x3e, \n\t0x02, 0x37, 0x3e, 0x01, 0x03, 0x16, 0x33, 0x32, 0x37, 0x26, 0x07, 0x0e, \n\t0x01, 0x07, 0x06, 0x23, 0x0e, 0x01, 0x01, 0x22, 0x64, 0x8c, 0x8c, 0x64, \n\t0x63, 0x8d, 0x8d, 0x01, 0x30, 0x4e, 0x3e, 0x09, 0x01, 0x02, 0x0e, 0x10, \n\t0x10, 0x02, 0x0b, 0x16, 0x17, 0x0b, 0x11, 0x1f, 0x0e, 0x0f, 0x01, 0x05, \n\t0x0c, 0x0b, 0x12, 0x2b, 0xe9, 0x38, 0x57, 0x14, 0x03, 0x10, 0x0c, 0x0e, \n\t0x0a, 0x01, 0x02, 0x12, 0x26, 0x08, 0x24, 0x08, 0x05, 0x01, 0x03, 0x07, \n\t0x06, 0x2f, 0x04, 0x08, 0x07, 0x0a, 0x18, 0x11, 0x14, 0x01, 0x08, 0x1a, \n\t0x0a, 0x11, 0x0f, 0x14, 0x04, 0x04, 0x09, 0x0d, 0x07, 0x02, 0x15, 0x21, \n\t0x21, 0x1f, 0x40, 0x31, 0x0d, 0x2e, 0x0c, 0x29, 0x03, 0x25, 0x01, 0x06, \n\t0x0e, 0x01, 0xea, 0x8d, 0x63, 0x64, 0x8c, 0x8c, 0x64, 0x63, 0x8d, 0xf0, \n\t0x42, 0x6b, 0x15, 0x0c, 0x04, 0x13, 0x0d, 0x06, 0x06, 0x02, 0x0c, 0x17, \n\t0x21, 0x16, 0x20, 0x01, 0x22, 0x10, 0x28, 0x1e, 0x16, 0x10, 0x38, 0x01, \n\t0x0f, 0x07, 0x46, 0x34, 0x02, 0x01, 0x03, 0x05, 0x04, 0x06, 0x21, 0x0e, \n\t0x0f, 0x1a, 0x0a, 0x0e, 0x28, 0x02, 0x06, 0x2a, 0x16, 0x20, 0x04, 0x10, \n\t0x15, 0x15, 0x1c, 0x09, 0x11, 0x1b, 0x10, 0x0c, 0x05, 0x04, 0x03, 0x01, \n\t0x04, 0x0f, 0x07, 0x05, 0x11, 0x14, 0x05, 0x07, 0x07, 0x09, 0x06, 0x02, \n\t0x0d, 0xfe, 0x78, 0x0a, 0x22, 0x16, 0x05, 0x01, 0x0f, 0x01, 0x08, 0x01, \n\t0x0c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x32, 0x00, 0x41, 0x02, 0x08, \n\t0x01, 0xb4, 0x00, 0x1f, 0x00, 0x00, 0x13, 0x36, 0x17, 0x16, 0x17, 0x16, \n\t0x07, 0x0e, 0x03, 0x07, 0x06, 0x27, 0x06, 0x07, 0x06, 0x26, 0x37, 0x3e, \n\t0x03, 0x3f, 0x01, 0x22, 0x0e, 0x03, 0x07, 0x26, 0xa8, 0x5b, 0xa2, 0x54, \n\t0x0e, 0x02, 0x03, 0x26, 0x36, 0x18, 0x29, 0x1a, 0x45, 0x7a, 0x21, 0x18, \n\t0x06, 0x23, 0x05, 0x16, 0x55, 0x5b, 0x55, 0x1c, 0x1b, 0x07, 0x1b, 0x4d, \n\t0x47, 0x5b, 0x23, 0x0b, 0x01, 0x8e, 0x35, 0x14, 0x0b, 0x0e, 0x03, 0x02, \n\t0x14, 0x45, 0x3f, 0x45, 0x12, 0x30, 0x2e, 0x26, 0x32, 0x0c, 0x11, 0x0b, \n\t0x32, 0x5d, 0x3c, 0x2e, 0x0b, 0x0a, 0x01, 0x0d, 0x19, 0x3b, 0x29, 0x79, \n\t0x00, 0x03, 0x00, 0x32, 0x00, 0x3c, 0x02, 0x26, 0x01, 0xb9, 0x00, 0x11, \n\t0x00, 0x2b, 0x00, 0x38, 0x00, 0x00, 0x37, 0x17, 0x37, 0x0e, 0x04, 0x07, \n\t0x0e, 0x02, 0x22, 0x2e, 0x01, 0x27, 0x2e, 0x01, 0x25, 0x16, 0x14, 0x0f, \n\t0x01, 0x27, 0x26, 0x23, 0x22, 0x06, 0x14, 0x16, 0x33, 0x32, 0x37, 0x17, \n\t0x07, 0x06, 0x2f, 0x01, 0x26, 0x34, 0x3f, 0x01, 0x36, 0x17, 0x13, 0x36, \n\t0x26, 0x2f, 0x01, 0x37, 0x1e, 0x02, 0x07, 0x0e, 0x01, 0x26, 0x85, 0xa7, \n\t0x8a, 0x02, 0x04, 0x02, 0x09, 0x0f, 0x0f, 0x14, 0x28, 0x17, 0x10, 0x18, \n\t0x28, 0x14, 0x24, 0x1f, 0x01, 0x8d, 0x0c, 0x0c, 0x27, 0x9a, 0x0b, 0x22, \n\t0x14, 0x1b, 0x1b, 0x14, 0x0d, 0x05, 0x92, 0x86, 0x1e, 0x1e, 0xd0, 0x0c, \n\t0x0c, 0xd0, 0x1e, 0x1e, 0x90, 0x09, 0x05, 0x07, 0x07, 0x23, 0x03, 0x06, \n\t0x0b, 0x09, 0x02, 0x12, 0x11, 0xc2, 0x54, 0x44, 0x0b, 0x19, 0x0a, 0x0d, \n\t0x0a, 0x06, 0x09, 0x17, 0x0b, 0x0d, 0x18, 0x08, 0x10, 0x25, 0x9f, 0x07, \n\t0x13, 0x07, 0x16, 0x33, 0x12, 0x10, 0x18, 0x10, 0x02, 0x22, 0x4c, 0x10, \n\t0x10, 0x75, 0x07, 0x13, 0x07, 0x75, 0x10, 0x10, 0xfe, 0xae, 0x3a, 0x42, \n\t0x0c, 0x0b, 0x13, 0x04, 0x14, 0x51, 0x3a, 0x0d, 0x04, 0x09, 0x00, 0x00, \n\t0x00, 0x05, 0x00, 0x32, 0x00, 0x3b, 0x02, 0x27, 0x01, 0xb8, 0x00, 0x3b, \n\t0x00, 0x44, 0x00, 0x4e, 0x00, 0x67, 0x00, 0x6a, 0x00, 0x00, 0x25, 0x16, \n\t0x06, 0x07, 0x22, 0x2e, 0x01, 0x27, 0x26, 0x37, 0x3e, 0x01, 0x27, 0x0e, \n\t0x03, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x37, 0x36, 0x37, 0x27, 0x06, 0x23, \n\t0x06, 0x27, 0x34, 0x26, 0x35, 0x26, 0x36, 0x33, 0x37, 0x34, 0x27, 0x34, \n\t0x33, 0x32, 0x37, 0x32, 0x1d, 0x01, 0x36, 0x33, 0x36, 0x17, 0x14, 0x16, \n\t0x15, 0x16, 0x0f, 0x01, 0x15, 0x33, 0x32, 0x16, 0x07, 0x16, 0x37, 0x27, \n\t0x06, 0x07, 0x06, 0x15, 0x14, 0x37, 0x3e, 0x02, 0x27, 0x26, 0x23, 0x22, \n\t0x06, 0x23, 0x27, 0x1e, 0x02, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x35, 0x27, \n\t0x23, 0x06, 0x07, 0x14, 0x2b, 0x01, 0x22, 0x35, 0x36, 0x13, 0x36, 0x3b, \n\t0x01, 0x32, 0x07, 0x33, 0x27, 0x02, 0x20, 0x0f, 0x28, 0x2f, 0x05, 0x02, \n\t0x0e, 0x01, 0x01, 0x02, 0x2b, 0x1f, 0x15, 0x08, 0x17, 0x24, 0x32, 0x1c, \n\t0x1a, 0x20, 0x1e, 0x19, 0x20, 0x01, 0x46, 0x03, 0x03, 0x02, 0x05, 0x01, \n\t0x03, 0x02, 0x4e, 0x01, 0x04, 0x17, 0x03, 0x05, 0x4f, 0x03, 0x04, 0x01, \n\t0x04, 0x02, 0x04, 0x58, 0x06, 0x2b, 0x3e, 0xad, 0x0e, 0x11, 0x02, 0x11, \n\t0x0d, 0x16, 0x54, 0x0e, 0x1e, 0x0f, 0x04, 0x12, 0x1e, 0x01, 0x04, 0x01, \n\t0xe1, 0x05, 0x2b, 0x28, 0x02, 0x2b, 0x03, 0x19, 0x58, 0x18, 0x01, 0x03, \n\t0x2b, 0x02, 0x05, 0x53, 0x01, 0x04, 0x30, 0x05, 0x41, 0x48, 0x24, 0xe4, \n\t0x29, 0x5e, 0x21, 0x02, 0x11, 0x01, 0x03, 0x02, 0x1e, 0x5c, 0x1c, 0x13, \n\t0x26, 0x2a, 0x17, 0x04, 0x03, 0x23, 0x1d, 0x2a, 0x20, 0x19, 0x08, 0x32, \n\t0x0c, 0x01, 0x03, 0x01, 0x1b, 0x02, 0x01, 0x02, 0x0e, 0x37, 0x02, 0x04, \n\t0x01, 0x04, 0x34, 0x0b, 0x02, 0x05, 0x01, 0x15, 0x02, 0x05, 0x01, 0x0f, \n\t0x33, 0x24, 0x70, 0x03, 0x06, 0x6b, 0x06, 0x0e, 0x16, 0x20, 0x21, 0x0b, \n\t0x0c, 0x2c, 0x23, 0x03, 0x09, 0x01, 0x59, 0x0e, 0x89, 0x7c, 0x01, 0x02, \n\t0x02, 0x53, 0x52, 0x01, 0x02, 0x02, 0x09, 0x01, 0x0b, 0x04, 0xa2, 0x84, \n\t0x00, 0x03, 0x00, 0x32, 0x00, 0x00, 0x01, 0x72, 0x01, 0xf4, 0x00, 0x27, \n\t0x00, 0x2f, 0x00, 0x37, 0x00, 0x00, 0x01, 0x32, 0x1d, 0x01, 0x14, 0x06, \n\t0x07, 0x15, 0x33, 0x32, 0x1d, 0x01, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, \n\t0x34, 0x3b, 0x01, 0x35, 0x2e, 0x01, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, \n\t0x1d, 0x01, 0x14, 0x16, 0x32, 0x36, 0x3d, 0x01, 0x34, 0x33, 0x06, 0x22, \n\t0x26, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x35, 0x15, 0x23, 0x35, 0x34, 0x36, \n\t0x32, 0x16, 0x01, 0x68, 0x0a, 0x45, 0x42, 0x41, 0x0a, 0x0a, 0xb4, 0x0a, \n\t0x0a, 0x41, 0x42, 0x45, 0x0a, 0x0f, 0x0a, 0x3b, 0x84, 0x3b, 0x0a, 0x5f, \n\t0x50, 0x23, 0x96, 0x96, 0x23, 0x50, 0x23, 0x01, 0x3f, 0x0a, 0x45, 0x2e, \n\t0x48, 0x06, 0x42, 0x0a, 0x1e, 0x0a, 0x0a, 0x1e, 0x0a, 0x42, 0x06, 0x48, \n\t0x2e, 0x45, 0x0a, 0x0a, 0x45, 0x21, 0x39, 0x39, 0x21, 0x45, 0x0a, 0x77, \n\t0x19, 0x0f, 0x4f, 0x4f, 0x0f, 0xeb, 0x6a, 0x6a, 0x0f, 0x19, 0x19, 0x00, \n\t0x00, 0x02, 0x00, 0x32, 0x00, 0x3c, 0x02, 0x1d, 0x01, 0xb9, 0x00, 0x17, \n\t0x00, 0x21, 0x00, 0x00, 0x01, 0x1e, 0x01, 0x06, 0x07, 0x06, 0x26, 0x06, \n\t0x07, 0x06, 0x1e, 0x01, 0x07, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x37, 0x3e, \n\t0x01, 0x37, 0x36, 0x03, 0x32, 0x36, 0x34, 0x26, 0x23, 0x22, 0x06, 0x14, \n\t0x16, 0x01, 0xdf, 0x24, 0x1d, 0x09, 0x0d, 0x08, 0x26, 0x2a, 0x13, 0x0f, \n\t0x09, 0x19, 0x01, 0x01, 0x22, 0x5c, 0x3e, 0x5d, 0x69, 0x05, 0x04, 0x60, \n\t0x3c, 0x91, 0x24, 0x0f, 0x16, 0x16, 0x0f, 0x10, 0x16, 0x16, 0x01, 0x82, \n\t0x18, 0x3e, 0x2a, 0x03, 0x02, 0x0e, 0x04, 0x15, 0x17, 0x1d, 0x24, 0x07, \n\t0x0d, 0x25, 0x25, 0x65, 0x48, 0x3b, 0x75, 0x11, 0x2a, 0xfe, 0xc5, 0x16, \n\t0x20, 0x15, 0x15, 0x20, 0x16, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x32, \n\t0x00, 0x0e, 0x02, 0x09, 0x01, 0xe5, 0x00, 0x03, 0x00, 0x23, 0x00, 0x27, \n\t0x00, 0x00, 0x3f, 0x01, 0x17, 0x07, 0x25, 0x16, 0x14, 0x07, 0x01, 0x06, \n\t0x22, 0x2f, 0x01, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x07, 0x27, 0x26, \n\t0x34, 0x37, 0x01, 0x36, 0x32, 0x1f, 0x01, 0x06, 0x15, 0x14, 0x16, 0x33, \n\t0x32, 0x37, 0x03, 0x37, 0x27, 0x07, 0x9e, 0xa3, 0x59, 0xa3, 0x01, 0x0a, \n\t0x07, 0x07, 0xfe, 0xed, 0x08, 0x14, 0x08, 0x26, 0x06, 0x1d, 0x15, 0x0b, \n\t0x0e, 0x25, 0x08, 0x08, 0x01, 0x13, 0x07, 0x16, 0x07, 0x25, 0x06, 0x1e, \n\t0x15, 0x0d, 0x0b, 0xe4, 0xcb, 0x81, 0xcc, 0xd3, 0xa3, 0x59, 0xa3, 0xd3, \n\t0x07, 0x16, 0x07, 0xfe, 0xed, 0x08, 0x08, 0x26, 0x0a, 0x0e, 0x15, 0x1e, \n\t0x07, 0x26, 0x08, 0x14, 0x08, 0x01, 0x13, 0x07, 0x07, 0x26, 0x0b, 0x0d, \n\t0x15, 0x1d, 0x06, 0xfe, 0xdf, 0xcb, 0x81, 0xcb, 0x00, 0x02, 0x00, 0x32, \n\t0x00, 0x4b, 0x02, 0x1c, 0x01, 0xa9, 0x00, 0x27, 0x00, 0x2a, 0x00, 0x00, \n\t0x01, 0x23, 0x15, 0x33, 0x15, 0x23, 0x15, 0x33, 0x15, 0x23, 0x15, 0x33, \n\t0x15, 0x14, 0x06, 0x23, 0x21, 0x22, 0x26, 0x3d, 0x01, 0x33, 0x35, 0x23, \n\t0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x34, 0x36, 0x33, \n\t0x21, 0x32, 0x16, 0x15, 0x05, 0x37, 0x27, 0x02, 0x1c, 0x32, 0x32, 0x32, \n\t0x32, 0x32, 0x32, 0x0c, 0x08, 0xfe, 0x3e, 0x08, 0x0c, 0x32, 0x32, 0x32, \n\t0x32, 0x32, 0x32, 0x0c, 0x08, 0x01, 0xc2, 0x08, 0x0c, 0xfe, 0xd4, 0x7d, \n\t0x7d, 0x01, 0x77, 0x32, 0x32, 0x32, 0x32, 0x32, 0x1e, 0x08, 0x0c, 0x0c, \n\t0x08, 0x1e, 0x32, 0x32, 0x32, 0x32, 0x32, 0x1e, 0x09, 0x0b, 0x0b, 0x09, \n\t0xe6, 0x4b, 0x4b, 0x00, 0x00, 0x02, 0x00, 0x32, 0x00, 0x23, 0x01, 0xe0, \n\t0x01, 0xd1, 0x00, 0x07, 0x00, 0x1f, 0x00, 0x00, 0x12, 0x32, 0x16, 0x14, \n\t0x06, 0x22, 0x26, 0x34, 0x13, 0x3e, 0x01, 0x37, 0x23, 0x35, 0x33, 0x2e, \n\t0x01, 0x27, 0x15, 0x23, 0x35, 0x0e, 0x01, 0x07, 0x33, 0x15, 0x23, 0x1e, \n\t0x01, 0x17, 0x35, 0x33, 0xb0, 0xb2, 0x7e, 0x7e, 0xb2, 0x7e, 0xe9, 0x3e, \n\t0x58, 0x06, 0x60, 0x60, 0x06, 0x58, 0x3e, 0x23, 0x3e, 0x59, 0x06, 0x61, \n\t0x61, 0x06, 0x59, 0x3e, 0x23, 0x01, 0xd1, 0x7e, 0xb2, 0x7e, 0x7e, 0xb2, \n\t0xfe, 0xf9, 0x07, 0x58, 0x3e, 0x23, 0x3e, 0x58, 0x07, 0x61, 0x61, 0x07, \n\t0x58, 0x3e, 0x23, 0x3e, 0x58, 0x07, 0x61, 0x00, 0x00, 0x02, 0x00, 0x32, \n\t0x00, 0x19, 0x01, 0x90, 0x01, 0xdb, 0x00, 0x0f, 0x00, 0x29, 0x00, 0x00, \n\t0x01, 0x32, 0x16, 0x15, 0x11, 0x14, 0x06, 0x2b, 0x01, 0x22, 0x26, 0x35, \n\t0x11, 0x34, 0x36, 0x33, 0x17, 0x36, 0x2e, 0x02, 0x35, 0x23, 0x15, 0x26, \n\t0x07, 0x0e, 0x01, 0x17, 0x1e, 0x01, 0x37, 0x36, 0x3d, 0x01, 0x1e, 0x01, \n\t0x06, 0x07, 0x06, 0x33, 0x32, 0x01, 0x5e, 0x15, 0x1d, 0x1d, 0x15, 0xfa, \n\t0x14, 0x1e, 0x1e, 0x14, 0xc3, 0x10, 0x09, 0x18, 0x19, 0x1e, 0x15, 0x18, \n\t0x15, 0x16, 0x05, 0x06, 0x29, 0x16, 0x2c, 0x12, 0x13, 0x01, 0x01, 0x02, \n\t0x03, 0x02, 0x01, 0xdb, 0x1d, 0x15, 0xfe, 0xa2, 0x14, 0x1e, 0x1e, 0x14, \n\t0x01, 0x5e, 0x15, 0x1d, 0xee, 0x16, 0x30, 0x20, 0x22, 0x0a, 0xb8, 0x08, \n\t0x09, 0x07, 0x22, 0x0f, 0x10, 0x0d, 0x07, 0x0f, 0x22, 0x83, 0x03, 0x1a, \n\t0x1a, 0x08, 0x05, 0x00, 0x00, 0x04, 0x00, 0x32, 0x00, 0x14, 0x01, 0xf4, \n\t0x01, 0xe0, 0x00, 0x29, 0x00, 0x2f, 0x00, 0x3d, 0x00, 0x43, 0x00, 0x00, \n\t0x25, 0x15, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, \n\t0x36, 0x37, 0x35, 0x34, 0x26, 0x27, 0x2e, 0x03, 0x35, 0x34, 0x36, 0x3b, \n\t0x01, 0x36, 0x33, 0x32, 0x17, 0x33, 0x32, 0x16, 0x15, 0x14, 0x0e, 0x02, \n\t0x07, 0x0e, 0x01, 0x37, 0x3e, 0x01, 0x37, 0x23, 0x06, 0x26, 0x22, 0x0e, \n\t0x01, 0x15, 0x14, 0x1e, 0x01, 0x32, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x05, \n\t0x1e, 0x01, 0x17, 0x26, 0x27, 0x01, 0x31, 0x23, 0x2e, 0x41, 0x2e, 0x2d, \n\t0x42, 0x2e, 0x24, 0x21, 0x28, 0x1c, 0x1f, 0x2c, 0x14, 0x0b, 0x07, 0x56, \n\t0x18, 0x61, 0x62, 0x18, 0x55, 0x07, 0x0b, 0x14, 0x2c, 0x1f, 0x1c, 0x27, \n\t0x21, 0x45, 0x28, 0x2e, 0x04, 0x3f, 0x03, 0x5c, 0x3e, 0x2e, 0x12, 0x12, \n\t0x2e, 0x3e, 0x2e, 0x12, 0x12, 0xfe, 0xf6, 0x04, 0x2e, 0x28, 0x18, 0x03, \n\t0x8e, 0x21, 0x04, 0x18, 0x10, 0x12, 0x1b, 0x1b, 0x12, 0x10, 0x18, 0x04, \n\t0x21, 0x19, 0x22, 0x1b, 0x12, 0x19, 0x2f, 0x3d, 0x26, 0x07, 0x0a, 0x2e, \n\t0x2e, 0x0a, 0x07, 0x26, 0x3d, 0x2f, 0x19, 0x12, 0x1a, 0x23, 0x65, 0x1c, \n\t0x3a, 0x2d, 0x4f, 0x82, 0x0f, 0x11, 0x06, 0x07, 0x11, 0x0f, 0x0f, 0x11, \n\t0x07, 0x06, 0x11, 0x24, 0x2d, 0x3a, 0x1c, 0x34, 0x4f, 0x00, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x32, 0x00, 0x19, 0x01, 0xc2, 0x01, 0xdb, 0x00, 0x18, \n\t0x00, 0x2a, 0x00, 0x00, 0x01, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x23, 0x22, \n\t0x26, 0x3d, 0x01, 0x34, 0x3e, 0x03, 0x37, 0x3e, 0x02, 0x17, 0x16, 0x0e, \n\t0x01, 0x07, 0x32, 0x07, 0x06, 0x1d, 0x01, 0x14, 0x17, 0x16, 0x23, 0x22, \n\t0x2e, 0x01, 0x3d, 0x01, 0x34, 0x3e, 0x01, 0x01, 0x55, 0x01, 0x38, 0x34, \n\t0x3d, 0x17, 0x48, 0x90, 0x0f, 0x1f, 0x16, 0x28, 0x03, 0x19, 0x36, 0x1f, \n\t0x05, 0x18, 0x13, 0x28, 0xd8, 0x07, 0x07, 0x19, 0x1a, 0x05, 0x06, 0x0d, \n\t0x1d, 0x21, 0x21, 0x1e, 0x01, 0x3b, 0x03, 0x07, 0x11, 0x0f, 0x24, 0xd4, \n\t0x2a, 0x17, 0xab, 0x07, 0x14, 0x19, 0x10, 0x1b, 0x02, 0x11, 0x42, 0x26, \n\t0x06, 0x26, 0x3d, 0x3a, 0x03, 0x07, 0x19, 0x1b, 0x9f, 0x19, 0x1b, 0x05, \n\t0x08, 0x25, 0x1f, 0x79, 0x1f, 0x26, 0x09, 0x00, 0x00, 0x02, 0x00, 0x32, \n\t0x00, 0x18, 0x01, 0xc2, 0x01, 0xdb, 0x00, 0x1a, 0x00, 0x2d, 0x00, 0x00, \n\t0x37, 0x2e, 0x02, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x1d, 0x01, 0x14, \n\t0x0e, 0x05, 0x07, 0x0e, 0x02, 0x27, 0x26, 0x3e, 0x01, 0x37, 0x22, 0x37, \n\t0x36, 0x3d, 0x01, 0x34, 0x27, 0x26, 0x33, 0x32, 0x1e, 0x01, 0x1d, 0x01, \n\t0x14, 0x0e, 0x02, 0x9f, 0x01, 0x37, 0x35, 0x3e, 0x16, 0x48, 0x90, 0x08, \n\t0x11, 0x0f, 0x1b, 0x0e, 0x1b, 0x03, 0x19, 0x36, 0x1f, 0x05, 0x18, 0x13, \n\t0x28, 0xd8, 0x06, 0x07, 0x18, 0x1a, 0x05, 0x06, 0x0d, 0x1d, 0x21, 0x12, \n\t0x1b, 0x15, 0xb8, 0x03, 0x07, 0x11, 0x0f, 0x24, 0xd5, 0x2b, 0x17, 0xab, \n\t0x05, 0x0e, 0x10, 0x0d, 0x13, 0x0a, 0x12, 0x02, 0x11, 0x42, 0x26, 0x06, \n\t0x26, 0x3d, 0x3a, 0x03, 0x07, 0x19, 0x1b, 0x9f, 0x19, 0x1b, 0x05, 0x08, \n\t0x25, 0x1f, 0x79, 0x18, 0x21, 0x0f, 0x06, 0x00, 0x00, 0x03, 0x00, 0x32, \n\t0x00, 0x28, 0x01, 0xe1, 0x01, 0xcc, 0x00, 0x15, 0x00, 0x21, 0x00, 0x25, \n\t0x00, 0x00, 0x01, 0x16, 0x07, 0x03, 0x06, 0x23, 0x21, 0x22, 0x27, 0x02, \n\t0x27, 0x26, 0x37, 0x3e, 0x01, 0x37, 0x36, 0x3b, 0x01, 0x32, 0x17, 0x16, \n\t0x07, 0x32, 0x3e, 0x02, 0x37, 0x23, 0x06, 0x22, 0x27, 0x23, 0x16, 0x27, \n\t0x21, 0x27, 0x23, 0x01, 0xd4, 0x0e, 0x02, 0x31, 0x04, 0x0f, 0xfe, 0xdb, \n\t0x0e, 0x06, 0x2f, 0x01, 0x02, 0x0d, 0x03, 0x30, 0x04, 0x09, 0x13, 0xf0, \n\t0x13, 0x09, 0x27, 0xbb, 0x1c, 0x2a, 0x15, 0x09, 0x02, 0x2e, 0x13, 0x4a, \n\t0x13, 0x2e, 0x17, 0x61, 0x01, 0x60, 0x37, 0xf2, 0x01, 0x99, 0x0d, 0x11, \n\t0xfe, 0xbc, 0x0f, 0x0f, 0x01, 0x36, 0x0e, 0x11, 0x0d, 0x03, 0x25, 0x03, \n\t0x08, 0x08, 0x1d, 0xe8, 0x22, 0x37, 0x22, 0x10, 0x5e, 0x5e, 0x8b, 0xb8, \n\t0x3a, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x32, 0x00, 0x19, 0x02, 0x08, \n\t0x01, 0xdb, 0x00, 0x2b, 0x00, 0x00, 0x25, 0x16, 0x1d, 0x01, 0x2b, 0x01, \n\t0x35, 0x34, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x2e, 0x03, 0x27, \n\t0x34, 0x36, 0x3f, 0x01, 0x26, 0x27, 0x26, 0x36, 0x32, 0x16, 0x0f, 0x01, \n\t0x16, 0x15, 0x0e, 0x03, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x01, 0xa2, \n\t0x66, 0xeb, 0xeb, 0x66, 0x2f, 0x22, 0x16, 0x05, 0x01, 0x07, 0x07, 0x07, \n\t0x01, 0x05, 0x02, 0x02, 0x04, 0x02, 0x02, 0x2d, 0x70, 0x2e, 0x03, 0x06, \n\t0x09, 0x01, 0x07, 0x07, 0x07, 0x01, 0x04, 0x17, 0x23, 0x8b, 0x24, 0x19, \n\t0x35, 0x35, 0x19, 0x24, 0x11, 0x23, 0x1e, 0x0b, 0x1b, 0x17, 0x06, 0x06, \n\t0x02, 0x0f, 0x0e, 0x08, 0x0a, 0x01, 0x02, 0x19, 0x13, 0x1b, 0x3a, 0x3a, \n\t0x1b, 0x2c, 0x04, 0x11, 0x0e, 0x0f, 0x02, 0x06, 0x06, 0x18, 0x1a, 0x0b, \n\t0x1e, 0x23, 0x00, 0x00, 0x00, 0x02, 0x00, 0x32, 0x00, 0x1e, 0x02, 0x26, \n\t0x01, 0xd6, 0x00, 0x27, 0x00, 0x4e, 0x00, 0x00, 0x25, 0x23, 0x35, 0x34, \n\t0x26, 0x27, 0x36, 0x35, 0x34, 0x26, 0x27, 0x2e, 0x01, 0x27, 0x34, 0x37, \n\t0x26, 0x27, 0x26, 0x36, 0x32, 0x16, 0x0f, 0x01, 0x16, 0x15, 0x0e, 0x01, \n\t0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x17, \n\t0x27, 0x16, 0x1d, 0x01, 0x21, 0x35, 0x34, 0x37, 0x3e, 0x01, 0x35, 0x34, \n\t0x26, 0x27, 0x2e, 0x01, 0x27, 0x34, 0x36, 0x3f, 0x01, 0x26, 0x27, 0x26, \n\t0x36, 0x32, 0x16, 0x0f, 0x01, 0x16, 0x15, 0x0e, 0x01, 0x07, 0x0e, 0x01, \n\t0x15, 0x14, 0x16, 0x02, 0x26, 0x70, 0x1e, 0x3e, 0x14, 0x0d, 0x03, 0x01, \n\t0x0c, 0x01, 0x06, 0x03, 0x01, 0x02, 0x1b, 0x44, 0x1c, 0x02, 0x04, 0x06, \n\t0x01, 0x0c, 0x01, 0x03, 0x0d, 0x15, 0x1c, 0x38, 0x09, 0x03, 0x03, 0x01, \n\t0xf4, 0x5b, 0xfe, 0xa5, 0x2a, 0x26, 0x1c, 0x13, 0x03, 0x01, 0x10, 0x02, \n\t0x03, 0x02, 0x02, 0x03, 0x02, 0x02, 0x25, 0x5a, 0x25, 0x02, 0x05, 0x07, \n\t0x02, 0x10, 0x01, 0x03, 0x13, 0x1c, 0x1e, 0x4b, 0x1b, 0x1b, 0x1f, 0x0f, \n\t0x1b, 0x08, 0x11, 0x11, 0x04, 0x08, 0x11, 0x0c, 0x03, 0x11, 0x0d, 0x13, \n\t0x28, 0x28, 0x13, 0x1e, 0x03, 0x0c, 0x11, 0x08, 0x04, 0x11, 0x11, 0x08, \n\t0x15, 0x18, 0x0c, 0x17, 0x11, 0x04, 0x35, 0x18, 0x6b, 0x27, 0x17, 0x45, \n\t0x5c, 0x16, 0x11, 0x10, 0x20, 0x1c, 0x0a, 0x18, 0x16, 0x05, 0x0c, 0x16, \n\t0x07, 0x09, 0x02, 0x01, 0x17, 0x12, 0x19, 0x35, 0x35, 0x19, 0x29, 0x04, \n\t0x0f, 0x16, 0x0c, 0x05, 0x16, 0x18, 0x0a, 0x1c, 0x20, 0x00, 0x00, 0x00, \n\t0x00, 0x03, 0x00, 0x32, 0xff, 0xff, 0x01, 0x91, 0x01, 0xf4, 0x00, 0x06, \n\t0x00, 0x18, 0x00, 0x33, 0x00, 0x00, 0x37, 0x35, 0x33, 0x15, 0x06, 0x27, \n\t0x06, 0x37, 0x23, 0x34, 0x2e, 0x02, 0x37, 0x3e, 0x01, 0x33, 0x32, 0x16, \n\t0x17, 0x16, 0x0e, 0x03, 0x27, 0x06, 0x16, 0x06, 0x16, 0x06, 0x1e, 0x04, \n\t0x17, 0x16, 0x17, 0x33, 0x36, 0x37, 0x3e, 0x05, 0x27, 0x26, 0x23, 0x22, \n\t0x9b, 0x8d, 0x23, 0x24, 0x23, 0x67, 0x87, 0x24, 0x2a, 0x20, 0x03, 0x04, \n\t0x56, 0x54, 0x55, 0x55, 0x05, 0x02, 0x14, 0x20, 0x21, 0x18, 0xbd, 0x02, \n\t0x04, 0x02, 0x07, 0x01, 0x09, 0x02, 0x0b, 0x03, 0x0c, 0x02, 0x2c, 0x0c, \n\t0x29, 0x0c, 0x2c, 0x02, 0x15, 0x04, 0x0d, 0x03, 0x03, 0x01, 0x08, 0x72, \n\t0x71, 0x14, 0x34, 0x34, 0x15, 0x01, 0x01, 0x67, 0x24, 0x44, 0x2d, 0x43, \n\t0x24, 0x3c, 0x56, 0x56, 0x3c, 0x1e, 0x35, 0x2b, 0x2a, 0x36, 0xda, 0x02, \n\t0x10, 0x04, 0x0f, 0x03, 0x0f, 0x04, 0x0f, 0x04, 0x11, 0x03, 0x3d, 0x2d, \n\t0x2f, 0x3b, 0x03, 0x1d, 0x07, 0x16, 0x0b, 0x11, 0x09, 0x62, 0x00, 0x00, \n\t0x00, 0x03, 0x00, 0x32, 0x00, 0x0a, 0x01, 0xf6, 0x01, 0xeb, 0x00, 0x4e, \n\t0x00, 0x52, 0x00, 0x56, 0x00, 0x00, 0x25, 0x16, 0x06, 0x0f, 0x01, 0x0e, \n\t0x01, 0x1f, 0x01, 0x16, 0x06, 0x2f, 0x01, 0x26, 0x06, 0x0f, 0x01, 0x0e, \n\t0x01, 0x2f, 0x01, 0x26, 0x0f, 0x01, 0x06, 0x26, 0x3f, 0x01, 0x36, 0x26, \n\t0x2f, 0x01, 0x2e, 0x01, 0x3f, 0x01, 0x36, 0x34, 0x2f, 0x01, 0x26, 0x36, \n\t0x3f, 0x01, 0x3e, 0x01, 0x2f, 0x01, 0x34, 0x36, 0x1f, 0x01, 0x16, 0x36, \n\t0x3f, 0x01, 0x36, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x3f, 0x01, 0x36, 0x16, \n\t0x0f, 0x01, 0x06, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x0f, 0x01, 0x06, 0x14, \n\t0x17, 0x07, 0x35, 0x23, 0x15, 0x37, 0x35, 0x23, 0x15, 0x01, 0xed, 0x0a, \n\t0x04, 0x0c, 0x27, 0x0c, 0x10, 0x01, 0x02, 0x01, 0x10, 0x0b, 0x2b, 0x0b, \n\t0x19, 0x05, 0x17, 0x06, 0x11, 0x08, 0x19, 0x11, 0x1b, 0x3d, 0x0b, 0x0a, \n\t0x04, 0x1b, 0x04, 0x0c, 0x0c, 0x35, 0x0c, 0x05, 0x0a, 0x2b, 0x0a, 0x0a, \n\t0x2b, 0x0a, 0x04, 0x0c, 0x27, 0x0c, 0x11, 0x01, 0x03, 0x0f, 0x0b, 0x28, \n\t0x0c, 0x19, 0x06, 0x17, 0x06, 0x12, 0x06, 0x19, 0x06, 0x17, 0x0b, 0x44, \n\t0x0b, 0x08, 0x04, 0x1e, 0x05, 0x0c, 0x0d, 0x39, 0x0d, 0x04, 0x0a, 0x2b, \n\t0x09, 0x09, 0x95, 0x32, 0x32, 0x32, 0xc0, 0x08, 0x11, 0x03, 0x0b, 0x03, \n\t0x16, 0x0d, 0x29, 0x0c, 0x0a, 0x05, 0x16, 0x06, 0x08, 0x0b, 0x2c, 0x0b, \n\t0x01, 0x0a, 0x27, 0x18, 0x0e, 0x23, 0x07, 0x08, 0x0c, 0x52, 0x0c, 0x14, \n\t0x01, 0x06, 0x02, 0x0e, 0x08, 0x26, 0x08, 0x19, 0x08, 0x26, 0x08, 0x11, \n\t0x03, 0x0b, 0x03, 0x16, 0x0d, 0x29, 0x0d, 0x0a, 0x05, 0x13, 0x05, 0x08, \n\t0x0b, 0x28, 0x0b, 0x01, 0x0b, 0x2b, 0x0b, 0x07, 0x07, 0x2a, 0x07, 0x08, \n\t0x0c, 0x55, 0x0b, 0x13, 0x01, 0x06, 0x01, 0x0e, 0x08, 0x26, 0x08, 0x19, \n\t0x08, 0x54, 0x34, 0x34, 0x50, 0x82, 0x82, 0x00, 0x00, 0x03, 0x00, 0x32, \n\t0x00, 0x00, 0x02, 0x08, 0x01, 0xf4, 0x00, 0x0f, 0x00, 0x20, 0x00, 0x30, \n\t0x00, 0x00, 0x13, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x22, 0x26, 0x35, 0x34, \n\t0x3e, 0x01, 0x37, 0x36, 0x32, 0x05, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x22, \n\t0x26, 0x35, 0x34, 0x3e, 0x02, 0x37, 0x36, 0x32, 0x07, 0x36, 0x32, 0x15, \n\t0x1e, 0x02, 0x15, 0x14, 0x06, 0x22, 0x26, 0x35, 0x34, 0x3e, 0x01, 0x86, \n\t0x05, 0x28, 0x21, 0x30, 0x42, 0x30, 0x21, 0x28, 0x05, 0x01, 0x05, 0x01, \n\t0x34, 0x05, 0x28, 0x21, 0x30, 0x42, 0x30, 0x15, 0x1b, 0x1a, 0x04, 0x01, \n\t0x05, 0xa0, 0x01, 0x05, 0x05, 0x28, 0x21, 0x30, 0x42, 0x30, 0x21, 0x28, \n\t0x01, 0xf1, 0x2b, 0x45, 0x36, 0x1d, 0x21, 0x2f, 0x2f, 0x21, 0x1d, 0x36, \n\t0x45, 0x2b, 0x02, 0x02, 0x2b, 0x45, 0x36, 0x1d, 0x21, 0x2f, 0x2f, 0x21, \n\t0x18, 0x2d, 0x21, 0x3b, 0x22, 0x02, 0xe0, 0x02, 0x02, 0x2b, 0x45, 0x36, \n\t0x1d, 0x21, 0x2f, 0x2f, 0x21, 0x1d, 0x36, 0x45, 0x00, 0x02, 0x00, 0x32, \n\t0x00, 0x0a, 0x01, 0x4a, 0x01, 0xeb, 0x00, 0x11, 0x00, 0x25, 0x00, 0x00, \n\t0x13, 0x1e, 0x03, 0x15, 0x14, 0x06, 0x22, 0x26, 0x35, 0x34, 0x3e, 0x02, \n\t0x37, 0x36, 0x32, 0x07, 0x36, 0x27, 0x26, 0x22, 0x0f, 0x01, 0x0e, 0x02, \n\t0x15, 0x14, 0x16, 0x33, 0x32, 0x35, 0x34, 0x37, 0x3e, 0x01, 0xc3, 0x07, \n\t0x2e, 0x2e, 0x24, 0x53, 0x72, 0x53, 0x24, 0x2e, 0x2e, 0x07, 0x01, 0x09, \n\t0x15, 0x01, 0x02, 0x03, 0x08, 0x02, 0x14, 0x10, 0x10, 0x12, 0x11, 0x0c, \n\t0x1d, 0x15, 0x01, 0x03, 0x01, 0xe6, 0x3b, 0x65, 0x3a, 0x4e, 0x29, 0x39, \n\t0x52, 0x52, 0x39, 0x29, 0x4e, 0x3a, 0x65, 0x3b, 0x04, 0xc8, 0x02, 0x05, \n\t0x03, 0x03, 0x1d, 0x17, 0x18, 0x33, 0x19, 0x0c, 0x11, 0x22, 0x2f, 0x4c, \n\t0x03, 0x0b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x32, 0x00, 0x41, 0x01, 0xf6, \n\t0x01, 0xb4, 0x00, 0x1a, 0x00, 0x39, 0x00, 0x59, 0x00, 0x00, 0x13, 0x06, \n\t0x26, 0x27, 0x26, 0x36, 0x37, 0x3e, 0x02, 0x1e, 0x02, 0x36, 0x37, 0x36, \n\t0x17, 0x16, 0x07, 0x06, 0x23, 0x22, 0x27, 0x2e, 0x01, 0x0e, 0x01, 0x05, \n\t0x36, 0x17, 0x16, 0x07, 0x0e, 0x02, 0x23, 0x22, 0x27, 0x2e, 0x01, 0x0e, \n\t0x01, 0x07, 0x06, 0x26, 0x27, 0x26, 0x37, 0x3e, 0x03, 0x16, 0x17, 0x1e, \n\t0x01, 0x3e, 0x01, 0x17, 0x36, 0x17, 0x16, 0x06, 0x07, 0x0e, 0x02, 0x23, \n\t0x22, 0x27, 0x2e, 0x01, 0x0e, 0x01, 0x07, 0x06, 0x26, 0x27, 0x26, 0x37, \n\t0x3e, 0x03, 0x16, 0x17, 0x1e, 0x01, 0x3e, 0x01, 0x5c, 0x08, 0x14, 0x07, \n\t0x07, 0x02, 0x08, 0x18, 0x1f, 0x3a, 0x47, 0x58, 0x43, 0x21, 0x1c, 0x13, \n\t0x10, 0x10, 0x13, 0x3d, 0x38, 0x32, 0x3d, 0x22, 0x33, 0x2a, 0x17, 0x01, \n\t0x5a, 0x13, 0x10, 0x10, 0x13, 0x14, 0x19, 0x2f, 0x19, 0x30, 0x3f, 0x22, \n\t0x33, 0x2a, 0x17, 0x16, 0x07, 0x15, 0x07, 0x10, 0x13, 0x13, 0x16, 0x2f, \n\t0x29, 0x40, 0x23, 0x22, 0x33, 0x2a, 0x17, 0x16, 0x13, 0x10, 0x07, 0x02, \n\t0x08, 0x14, 0x19, 0x2f, 0x19, 0x30, 0x3f, 0x22, 0x33, 0x2a, 0x18, 0x15, \n\t0x07, 0x15, 0x07, 0x10, 0x13, 0x13, 0x16, 0x2f, 0x29, 0x40, 0x23, 0x22, \n\t0x33, 0x2a, 0x17, 0x01, 0x56, 0x07, 0x02, 0x08, 0x07, 0x16, 0x07, 0x14, \n\t0x14, 0x14, 0x10, 0x32, 0x03, 0x13, 0x18, 0x0f, 0x12, 0x14, 0x10, 0x37, \n\t0x23, 0x13, 0x0e, 0x0e, 0x0f, 0x49, 0x10, 0x13, 0x14, 0x10, 0x11, 0x13, \n\t0x13, 0x23, 0x13, 0x0e, 0x0e, 0x0f, 0x12, 0x07, 0x02, 0x08, 0x14, 0x10, \n\t0x11, 0x10, 0x16, 0x01, 0x10, 0x14, 0x13, 0x0e, 0x0e, 0x0f, 0x6e, 0x10, \n\t0x13, 0x07, 0x16, 0x07, 0x11, 0x13, 0x13, 0x23, 0x13, 0x0e, 0x0d, 0x10, \n\t0x12, 0x07, 0x02, 0x08, 0x14, 0x10, 0x11, 0x10, 0x16, 0x01, 0x10, 0x14, \n\t0x13, 0x0e, 0x0e, 0x0f, 0x00, 0x09, 0x00, 0x32, 0x00, 0x4b, 0x02, 0x26, \n\t0x01, 0xa9, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x27, \n\t0x00, 0x2b, 0x00, 0x2f, 0x00, 0x35, 0x00, 0x41, 0x00, 0x00, 0x01, 0x32, \n\t0x16, 0x1d, 0x01, 0x14, 0x06, 0x23, 0x21, 0x22, 0x26, 0x3d, 0x01, 0x34, \n\t0x36, 0x33, 0x01, 0x35, 0x21, 0x15, 0x25, 0x35, 0x21, 0x15, 0x17, 0x33, \n\t0x15, 0x23, 0x17, 0x33, 0x35, 0x33, 0x35, 0x33, 0x15, 0x23, 0x15, 0x23, \n\t0x15, 0x23, 0x33, 0x23, 0x35, 0x33, 0x07, 0x23, 0x35, 0x33, 0x37, 0x15, \n\t0x23, 0x35, 0x33, 0x15, 0x07, 0x15, 0x23, 0x35, 0x33, 0x35, 0x33, 0x35, \n\t0x33, 0x15, 0x23, 0x15, 0x01, 0xf4, 0x15, 0x1d, 0x1d, 0x15, 0xfe, 0x70, \n\t0x14, 0x1e, 0x1e, 0x14, 0x01, 0x90, 0xfe, 0x70, 0x01, 0x90, 0xfe, 0x70, \n\t0x32, 0x0f, 0x0f, 0x5a, 0x0f, 0x0f, 0x1e, 0x0f, 0x0f, 0x1e, 0x3c, 0x0f, \n\t0x0f, 0x4b, 0x1e, 0x1e, 0x0f, 0x0f, 0x1e, 0x4b, 0x1e, 0x0f, 0x0f, 0x1e, \n\t0x0f, 0x01, 0xa9, 0x1e, 0x14, 0xfa, 0x15, 0x1d, 0x1d, 0x15, 0xfa, 0x14, \n\t0x1e, 0xfe, 0xd4, 0x96, 0x96, 0xe1, 0x19, 0x19, 0x80, 0x0f, 0x0f, 0x0f, \n\t0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x1e, 0x0f, 0x0f, \n\t0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x02, 0x00, 0x32, \n\t0x00, 0x1e, 0x02, 0x26, 0x01, 0xd6, 0x00, 0x19, 0x00, 0x1d, 0x00, 0x00, \n\t0x01, 0x32, 0x16, 0x15, 0x11, 0x14, 0x06, 0x0f, 0x01, 0x30, 0x17, 0x16, \n\t0x2b, 0x01, 0x22, 0x37, 0x36, 0x31, 0x27, 0x2e, 0x01, 0x35, 0x11, 0x34, \n\t0x36, 0x33, 0x01, 0x11, 0x21, 0x11, 0x01, 0xf4, 0x15, 0x1d, 0x1d, 0x14, \n\t0x6d, 0x2b, 0x19, 0x23, 0xfa, 0x31, 0x41, 0x12, 0x6e, 0x14, 0x1d, 0x1e, \n\t0x14, 0x01, 0x90, 0xfe, 0x70, 0x01, 0xd6, 0x1e, 0x14, 0xfe, 0xed, 0x15, \n\t0x23, 0x04, 0x16, 0x13, 0x0e, 0x1a, 0x07, 0x16, 0x04, 0x23, 0x15, 0x01, \n\t0x13, 0x14, 0x1e, 0xfe, 0xbd, 0x01, 0x16, 0xfe, 0xea, 0x00, 0x00, 0x00, \n\t0x00, 0x03, 0x00, 0x32, 0x00, 0x26, 0x02, 0x26, 0x01, 0xcf, 0x00, 0x19, \n\t0x00, 0x21, 0x00, 0x2e, 0x00, 0x00, 0x25, 0x15, 0x23, 0x36, 0x37, 0x36, \n\t0x3b, 0x01, 0x3e, 0x01, 0x37, 0x3e, 0x01, 0x3b, 0x01, 0x32, 0x16, 0x17, \n\t0x16, 0x17, 0x33, 0x32, 0x1f, 0x01, 0x23, 0x35, 0x27, 0x07, 0x33, 0x27, \n\t0x26, 0x2b, 0x01, 0x22, 0x13, 0x35, 0x33, 0x06, 0x07, 0x06, 0x23, 0x21, \n\t0x22, 0x35, 0x27, 0x33, 0x15, 0x01, 0x16, 0xe4, 0x04, 0x01, 0x02, 0x30, \n\t0x50, 0x08, 0x15, 0x01, 0x07, 0x09, 0x0e, 0x6f, 0x0d, 0x0a, 0x06, 0x09, \n\t0x15, 0x50, 0x30, 0x02, 0x05, 0xe3, 0x52, 0x0e, 0x92, 0x0e, 0x07, 0x0e, \n\t0x4c, 0x0e, 0x4b, 0xd7, 0x03, 0x02, 0x03, 0x2a, 0xfe, 0x89, 0x2d, 0x05, \n\t0xd7, 0xee, 0x32, 0x71, 0x21, 0x36, 0x0d, 0x29, 0x02, 0x0d, 0x06, 0x07, \n\t0x0c, 0x10, 0x28, 0x36, 0x92, 0x32, 0xb1, 0x1b, 0x1b, 0x0d, 0xfe, 0xc5, \n\t0x32, 0x2c, 0x27, 0x2a, 0x2a, 0x53, 0x32, 0x00, 0x00, 0x03, 0x00, 0x32, \n\t0x00, 0x32, 0x01, 0xc2, 0x01, 0xc2, 0x00, 0x0d, 0x00, 0x17, 0x00, 0x1b, \n\t0x00, 0x00, 0x01, 0x17, 0x11, 0x14, 0x06, 0x23, 0x21, 0x22, 0x26, 0x35, \n\t0x11, 0x34, 0x36, 0x33, 0x17, 0x35, 0x23, 0x15, 0x14, 0x16, 0x3b, 0x01, \n\t0x32, 0x36, 0x27, 0x15, 0x23, 0x35, 0x01, 0x7b, 0x47, 0x1d, 0x15, 0xfe, \n\t0xd4, 0x14, 0x1e, 0x1e, 0x14, 0xfa, 0xc8, 0x0f, 0x0a, 0x96, 0x0a, 0x0f, \n\t0x19, 0x32, 0x01, 0xc2, 0x4e, 0xfe, 0xf0, 0x14, 0x1e, 0x1e, 0x14, 0x01, \n\t0x2c, 0x15, 0x1d, 0x96, 0x7d, 0x7d, 0x0a, 0x0f, 0x0f, 0x6e, 0x64, 0x64, \n\t0x00, 0x02, 0x00, 0x32, 0x00, 0x14, 0x01, 0xfe, 0x01, 0xe0, 0x00, 0x07, \n\t0x00, 0x11, 0x00, 0x00, 0x12, 0x32, 0x16, 0x14, 0x06, 0x22, 0x26, 0x34, \n\t0x16, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x14, 0xb9, 0xbe, \n\t0x87, 0x87, 0xbe, 0x87, 0xc7, 0x3e, 0x2c, 0x2b, 0x20, 0x1f, 0x2c, 0x01, \n\t0xe0, 0x87, 0xbe, 0x87, 0x87, 0xbe, 0xaa, 0x2c, 0x1f, 0x20, 0x2b, 0x2c, \n\t0x3e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x32, 0x00, 0x32, 0x02, 0x28, \n\t0x01, 0xc2, 0x00, 0x0e, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x32, 0x16, 0x0f, \n\t0x01, 0x0e, 0x01, 0x23, 0x21, 0x22, 0x2f, 0x01, 0x26, 0x36, 0x33, 0x25, \n\t0x17, 0x21, 0x37, 0x3e, 0x01, 0x3b, 0x01, 0x32, 0x1f, 0x01, 0x16, 0x3b, \n\t0x01, 0x32, 0x16, 0x02, 0x10, 0x10, 0x08, 0x01, 0x15, 0x01, 0x0a, 0x10, \n\t0xfe, 0x6d, 0x1a, 0x02, 0x15, 0x01, 0x08, 0x10, 0x01, 0xb5, 0x05, 0xfe, \n\t0x59, 0x07, 0x02, 0x10, 0x0a, 0x52, 0x1a, 0x11, 0x0f, 0x10, 0x1b, 0xaa, \n\t0x0a, 0x12, 0x01, 0x45, 0x0c, 0x0c, 0xe2, 0x0c, 0x0d, 0x19, 0xe2, 0x0c, \n\t0x0c, 0x37, 0x14, 0x42, 0x0a, 0x0e, 0x11, 0x0f, 0x12, 0x0c, 0x00, 0x00, \n\t0x00, 0x05, 0x00, 0x32, 0x00, 0x19, 0x01, 0x90, 0x01, 0xdb, 0x00, 0x03, \n\t0x00, 0x13, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x00, 0x37, 0x35, \n\t0x33, 0x15, 0x37, 0x32, 0x16, 0x15, 0x11, 0x14, 0x06, 0x2b, 0x01, 0x22, \n\t0x26, 0x35, 0x11, 0x34, 0x36, 0x33, 0x13, 0x11, 0x23, 0x11, 0x13, 0x15, \n\t0x23, 0x35, 0x17, 0x15, 0x23, 0x35, 0x9c, 0x8c, 0x36, 0x15, 0x1d, 0x1d, \n\t0x15, 0xfa, 0x14, 0x1e, 0x1e, 0x14, 0xfa, 0xfa, 0xc3, 0x8c, 0x8c, 0x8c, \n\t0xe5, 0x2d, 0x2d, 0xf6, 0x1d, 0x15, 0xfe, 0xa2, 0x14, 0x1e, 0x1e, 0x14, \n\t0x01, 0x5e, 0x15, 0x1d, 0xfe, 0x70, 0x01, 0x5e, 0xfe, 0xa2, 0x01, 0x28, \n\t0x2c, 0x2c, 0xc4, 0x2c, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x32, \n\t0x00, 0x19, 0x01, 0xf4, 0x01, 0xdb, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x1f, \n\t0x00, 0x23, 0x00, 0x00, 0x01, 0x32, 0x16, 0x15, 0x11, 0x14, 0x06, 0x23, \n\t0x21, 0x22, 0x26, 0x35, 0x11, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x33, 0x35, \n\t0x33, 0x15, 0x33, 0x35, 0x13, 0x35, 0x21, 0x15, 0x13, 0x15, 0x23, 0x35, \n\t0x21, 0x15, 0x23, 0x35, 0x01, 0xc2, 0x15, 0x1d, 0x1d, 0x15, 0xfe, 0xa2, \n\t0x14, 0x1e, 0x1e, 0x14, 0x17, 0x50, 0x91, 0x50, 0x16, 0xfe, 0xa2, 0x50, \n\t0x23, 0x01, 0x04, 0x23, 0x01, 0xa9, 0x1d, 0x15, 0xfe, 0xd4, 0x14, 0x1e, \n\t0x1e, 0x14, 0x01, 0x2c, 0x15, 0x1d, 0x32, 0x32, 0x32, 0x32, 0xfe, 0xa2, \n\t0xc8, 0xc8, 0x01, 0x90, 0x55, 0x55, 0x55, 0x55, 0x00, 0x03, 0x00, 0x32, \n\t0x00, 0x23, 0x02, 0x27, 0x01, 0xd2, 0x00, 0x06, 0x00, 0x18, 0x00, 0x30, \n\t0x00, 0x00, 0x37, 0x26, 0x37, 0x36, 0x1f, 0x01, 0x07, 0x25, 0x36, 0x16, \n\t0x17, 0x16, 0x0f, 0x01, 0x06, 0x23, 0x22, 0x2f, 0x02, 0x37, 0x17, 0x16, \n\t0x1f, 0x01, 0x27, 0x03, 0x06, 0x23, 0x22, 0x27, 0x2e, 0x01, 0x37, 0x13, \n\t0x36, 0x37, 0x36, 0x1f, 0x01, 0x37, 0x3e, 0x01, 0x17, 0x16, 0x0f, 0x01, \n\t0x06, 0x27, 0x43, 0x15, 0x05, 0x05, 0x16, 0x31, 0x1a, 0x01, 0x9b, 0x07, \n\t0x13, 0x06, 0x10, 0x11, 0x7e, 0x06, 0x09, 0x07, 0x07, 0x8f, 0x1b, 0x19, \n\t0x12, 0x06, 0x02, 0x84, 0x86, 0xaf, 0x06, 0x0d, 0x06, 0x06, 0x08, 0x04, \n\t0x05, 0xbb, 0x04, 0x0a, 0x09, 0x09, 0x7b, 0x71, 0x05, 0x12, 0x08, 0x13, \n\t0x0d, 0x7e, 0x0c, 0x13, 0xd9, 0x05, 0x17, 0x15, 0x05, 0x0c, 0x28, 0x02, \n\t0x06, 0x01, 0x07, 0x10, 0x10, 0x71, 0x06, 0x05, 0x6e, 0x07, 0x28, 0x04, \n\t0x02, 0x02, 0x66, 0xd3, 0xfe, 0xed, 0x0b, 0x04, 0x05, 0x13, 0x07, 0x01, \n\t0x26, 0x08, 0x02, 0x03, 0x06, 0x4e, 0xa3, 0x08, 0x03, 0x06, 0x0c, 0x13, \n\t0xb5, 0x12, 0x0c, 0x00, 0x00, 0x03, 0x00, 0x32, 0x00, 0x19, 0x01, 0xc2, \n\t0x01, 0xdb, 0x00, 0x08, 0x00, 0x11, 0x00, 0x1a, 0x00, 0x00, 0x01, 0x32, \n\t0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x33, 0x07, 0x32, 0x16, 0x15, 0x11, \n\t0x23, 0x11, 0x34, 0x33, 0x07, 0x32, 0x16, 0x1d, 0x01, 0x23, 0x35, 0x34, \n\t0x33, 0x01, 0xa9, 0x0b, 0x0e, 0x64, 0x14, 0x5f, 0x0b, 0x0e, 0x64, 0x14, \n\t0x5f, 0x0b, 0x0e, 0x64, 0x14, 0x01, 0xdb, 0x0f, 0x0a, 0xfe, 0x57, 0x01, \n\t0xa9, 0x19, 0x96, 0x0f, 0x0a, 0xfe, 0xed, 0x01, 0x13, 0x19, 0x96, 0x0f, \n\t0x0a, 0x7d, 0x7d, 0x19, 0x00, 0x02, 0x00, 0x32, 0x00, 0x00, 0x01, 0x90, \n\t0x01, 0xf4, 0x00, 0x11, 0x00, 0x19, 0x00, 0x00, 0x01, 0x32, 0x16, 0x15, \n\t0x11, 0x14, 0x06, 0x23, 0x21, 0x22, 0x26, 0x35, 0x11, 0x34, 0x36, 0x33, \n\t0x17, 0x33, 0x27, 0x23, 0x27, 0x33, 0x37, 0x33, 0x17, 0x33, 0x01, 0x6d, \n\t0x0e, 0x15, 0x15, 0x0e, 0xfe, 0xe8, 0x0e, 0x15, 0x15, 0x0e, 0x1e, 0xdc, \n\t0x14, 0xb4, 0x16, 0x36, 0x12, 0x50, 0x12, 0x37, 0x01, 0xc2, 0x15, 0x0e, \n\t0xfe, 0x84, 0x0f, 0x14, 0x14, 0x0f, 0x01, 0x7c, 0x0e, 0x15, 0x4b, 0x19, \n\t0x32, 0x32, 0x32, 0x00, 0x00, 0x01, 0x00, 0x32, 0x00, 0x05, 0x02, 0x07, \n\t0x01, 0xf1, 0x00, 0x35, 0x00, 0x00, 0x37, 0x22, 0x27, 0x2e, 0x01, 0x3f, \n\t0x01, 0x36, 0x17, 0x1e, 0x01, 0x17, 0x16, 0x0f, 0x01, 0x06, 0x07, 0x06, \n\t0x27, 0x26, 0x36, 0x3f, 0x01, 0x36, 0x16, 0x0f, 0x01, 0x06, 0x17, 0x16, \n\t0x37, 0x36, 0x3f, 0x01, 0x36, 0x27, 0x26, 0x27, 0x26, 0x0f, 0x01, 0x06, \n\t0x16, 0x17, 0x1e, 0x01, 0x3f, 0x01, 0x36, 0x17, 0x16, 0x0f, 0x01, 0x06, \n\t0xac, 0x33, 0x22, 0x24, 0x02, 0x2b, 0xf8, 0x28, 0x2f, 0x16, 0x23, 0x06, \n\t0x0d, 0x28, 0xed, 0x14, 0x18, 0x18, 0x10, 0x0f, 0x03, 0x16, 0xa6, 0x0c, \n\t0x1a, 0x0d, 0xa6, 0x16, 0x0c, 0x06, 0x06, 0x0c, 0x0b, 0xed, 0x19, 0x08, \n\t0x08, 0x1e, 0x1b, 0x1b, 0xf7, 0x21, 0x02, 0x19, 0x19, 0x43, 0x25, 0xf8, \n\t0x0c, 0x0d, 0x0d, 0x0d, 0xf8, 0x29, 0x05, 0x24, 0x23, 0x60, 0x2f, 0xf8, \n\t0x28, 0x0d, 0x06, 0x23, 0x16, 0x30, 0x28, 0xed, 0x14, 0x03, 0x02, 0x10, \n\t0x0c, 0x32, 0x15, 0xa7, 0x0d, 0x1a, 0x0c, 0xa6, 0x16, 0x0d, 0x04, 0x01, \n\t0x02, 0x0b, 0xed, 0x19, 0x1d, 0x1e, 0x08, 0x07, 0x19, 0xf7, 0x26, 0x43, \n\t0x19, 0x18, 0x02, 0x20, 0xf7, 0x0c, 0x0c, 0x0b, 0x0d, 0xf8, 0x29, 0x00, \n\t0x00, 0x02, 0x00, 0x32, 0x00, 0x00, 0x01, 0x45, 0x01, 0xf4, 0x00, 0x0c, \n\t0x00, 0x16, 0x00, 0x00, 0x01, 0x32, 0x16, 0x15, 0x11, 0x27, 0x11, 0x34, \n\t0x26, 0x2b, 0x01, 0x34, 0x33, 0x07, 0x32, 0x16, 0x15, 0x11, 0x27, 0x07, \n\t0x11, 0x34, 0x33, 0x01, 0x2c, 0x0a, 0x0f, 0x4b, 0x0f, 0x0a, 0x32, 0x14, \n\t0x14, 0x0a, 0x0f, 0x4b, 0x4b, 0x14, 0x01, 0xf4, 0x0f, 0x0a, 0xfe, 0x57, \n\t0x5a, 0x01, 0x36, 0x0a, 0x0f, 0x19, 0x4b, 0x0f, 0x0a, 0xfe, 0x70, 0x5a, \n\t0x5a, 0x01, 0x90, 0x19, 0x00, 0x01, 0x00, 0x32, 0x00, 0x09, 0x01, 0x90, \n\t0x01, 0xed, 0x00, 0x25, 0x00, 0x00, 0x01, 0x16, 0x15, 0x11, 0x14, 0x06, \n\t0x23, 0x22, 0x35, 0x11, 0x34, 0x2f, 0x01, 0x26, 0x07, 0x06, 0x07, 0x17, \n\t0x16, 0x15, 0x11, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x2e, 0x01, 0x27, \n\t0x26, 0x35, 0x03, 0x34, 0x37, 0x3e, 0x01, 0x17, 0x01, 0x87, 0x09, 0x0c, \n\t0x08, 0x17, 0x06, 0xca, 0x10, 0x12, 0x16, 0x06, 0xcc, 0x09, 0x09, 0x03, \n\t0x05, 0x07, 0x03, 0x04, 0xc2, 0x09, 0x0d, 0x03, 0x07, 0x0e, 0x4a, 0x15, \n\t0x01, 0x74, 0x04, 0x0a, 0xfe, 0xe7, 0x07, 0x0b, 0x12, 0x01, 0x05, 0x06, \n\t0x03, 0x6c, 0x05, 0x0a, 0x0a, 0x0c, 0x72, 0x04, 0x0a, 0xfe, 0xed, 0x0b, \n\t0x03, 0x02, 0x02, 0x03, 0x79, 0x05, 0x09, 0x08, 0x01, 0x06, 0x0e, 0x0c, \n\t0x17, 0x1f, 0x0b, 0x00, 0x00, 0x07, 0x00, 0x32, 0x00, 0x19, 0x01, 0xf4, \n\t0x01, 0xdc, 0x00, 0x03, 0x00, 0x07, 0x00, 0x20, 0x00, 0x24, 0x00, 0x28, \n\t0x00, 0x2c, 0x00, 0x30, 0x00, 0x00, 0x37, 0x15, 0x27, 0x35, 0x37, 0x15, \n\t0x27, 0x35, 0x25, 0x16, 0x15, 0x11, 0x14, 0x0f, 0x01, 0x06, 0x22, 0x06, \n\t0x22, 0x26, 0x23, 0x2f, 0x01, 0x26, 0x35, 0x11, 0x34, 0x37, 0x36, 0x1f, \n\t0x01, 0x37, 0x36, 0x03, 0x11, 0x27, 0x11, 0x21, 0x11, 0x07, 0x11, 0x37, \n\t0x15, 0x07, 0x35, 0x37, 0x15, 0x07, 0x35, 0xdc, 0x64, 0x64, 0x64, 0x01, \n\t0x71, 0x0b, 0x10, 0xc7, 0x04, 0x02, 0x03, 0x02, 0x03, 0x01, 0x05, 0xc7, \n\t0x10, 0x0b, 0x0b, 0x0c, 0xbf, 0xbf, 0x0c, 0xe4, 0xa0, 0x01, 0x72, 0xa0, \n\t0x82, 0x64, 0x64, 0x64, 0xc2, 0x22, 0x28, 0x22, 0x40, 0x22, 0x28, 0x22, \n\t0x85, 0x06, 0x0f, 0xfe, 0xc0, 0x11, 0x06, 0x50, 0x01, 0x01, 0x01, 0x01, \n\t0x50, 0x06, 0x11, 0x01, 0x40, 0x0f, 0x06, 0x08, 0x05, 0x4d, 0x4d, 0x05, \n\t0xfe, 0x6e, 0x01, 0x18, 0x40, 0xfe, 0xe8, 0x01, 0x18, 0x40, 0xfe, 0xe8, \n\t0x9d, 0x22, 0x28, 0x22, 0x90, 0x22, 0x28, 0x22, 0x00, 0x01, 0x00, 0x32, \n\t0x00, 0x32, 0x01, 0xc2, 0x01, 0xc3, 0x00, 0x24, 0x00, 0x00, 0x25, 0x36, \n\t0x27, 0x26, 0x27, 0x2e, 0x01, 0x36, 0x37, 0x3e, 0x02, 0x32, 0x1e, 0x02, \n\t0x17, 0x16, 0x06, 0x07, 0x0e, 0x01, 0x27, 0x2e, 0x03, 0x3e, 0x02, 0x37, \n\t0x3e, 0x01, 0x1e, 0x01, 0x17, 0x16, 0x01, 0x19, 0x51, 0x16, 0x01, 0x03, \n\t0x0f, 0x0b, 0x07, 0x15, 0x0a, 0x11, 0x12, 0x0c, 0x11, 0x07, 0x13, 0x01, \n\t0x18, 0x36, 0x4b, 0x4b, 0x91, 0x18, 0x01, 0x15, 0x04, 0x0e, 0x01, 0x01, \n\t0x0e, 0x0c, 0x15, 0x1c, 0x1a, 0x09, 0x0f, 0x16, 0xdc, 0x51, 0x16, 0x01, \n\t0x03, 0x0f, 0x12, 0x24, 0x1a, 0x0c, 0x0f, 0x01, 0x0d, 0x05, 0x14, 0x01, \n\t0x18, 0x92, 0x4a, 0x4b, 0x37, 0x18, 0x01, 0x14, 0x05, 0x13, 0x0c, 0x12, \n\t0x11, 0x0a, 0x11, 0x0d, 0x0b, 0x07, 0x0f, 0x16, 0x00, 0x02, 0x00, 0x32, \n\t0x00, 0x19, 0x01, 0xe1, 0x01, 0xdc, 0x00, 0x2c, 0x00, 0x39, 0x00, 0x00, \n\t0x01, 0x1e, 0x01, 0x07, 0x06, 0x2e, 0x02, 0x07, 0x0e, 0x01, 0x17, 0x16, \n\t0x17, 0x1e, 0x01, 0x17, 0x16, 0x07, 0x06, 0x07, 0x06, 0x27, 0x26, 0x27, \n\t0x2e, 0x01, 0x27, 0x06, 0x07, 0x06, 0x26, 0x27, 0x26, 0x36, 0x37, 0x3e, \n\t0x05, 0x37, 0x36, 0x1e, 0x01, 0x3e, 0x01, 0x26, 0x27, 0x2e, 0x02, 0x0e, \n\t0x01, 0x1e, 0x02, 0x01, 0xbe, 0x1d, 0x09, 0x18, 0x0e, 0x21, 0x20, 0x43, \n\t0x29, 0x0e, 0x0e, 0x04, 0x0b, 0x0c, 0x02, 0x14, 0x02, 0x07, 0x12, 0x19, \n\t0x1a, 0x0f, 0x0c, 0x10, 0x0d, 0x03, 0x1c, 0x09, 0x0f, 0x04, 0x11, 0x28, \n\t0x07, 0x08, 0x0b, 0x10, 0x3f, 0x57, 0x25, 0x16, 0x03, 0x0c, 0x0c, 0x18, \n\t0x52, 0x0c, 0x08, 0x02, 0x0d, 0x0e, 0x0e, 0x27, 0x1c, 0x08, 0x02, 0x0c, \n\t0x1c, 0x28, 0x01, 0x45, 0x45, 0x78, 0x0a, 0x06, 0x0f, 0x19, 0x10, 0x04, \n\t0x02, 0x0f, 0x0b, 0x1c, 0x1a, 0x05, 0x0c, 0x04, 0x11, 0x06, 0x0b, 0x09, \n\t0x05, 0x1a, 0x26, 0x1c, 0x06, 0x05, 0x0d, 0x05, 0x02, 0x06, 0x18, 0x12, \n\t0x10, 0x2f, 0x07, 0x1a, 0x38, 0x2f, 0x2d, 0x21, 0x1a, 0x05, 0x0a, 0x5a, \n\t0xdd, 0x04, 0x22, 0x40, 0x20, 0x21, 0x39, 0x1b, 0x04, 0x26, 0x43, 0x42, \n\t0x35, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x32, 0x00, 0x26, 0x02, 0x27, \n\t0x01, 0xcf, 0x00, 0x06, 0x00, 0x23, 0x00, 0x00, 0x01, 0x17, 0x23, 0x15, \n\t0x23, 0x35, 0x23, 0x05, 0x1e, 0x01, 0x0f, 0x01, 0x0e, 0x01, 0x23, 0x21, \n\t0x22, 0x26, 0x2f, 0x01, 0x26, 0x3f, 0x01, 0x33, 0x07, 0x33, 0x32, 0x1f, \n\t0x01, 0x33, 0x37, 0x36, 0x3b, 0x01, 0x27, 0x33, 0x01, 0x2c, 0x82, 0x52, \n\t0x5f, 0x53, 0x01, 0x6c, 0x09, 0x09, 0x03, 0x0e, 0x02, 0x12, 0x0b, 0xfe, \n\t0x68, 0x0b, 0x12, 0x02, 0x0e, 0x05, 0x15, 0x4f, 0x31, 0x55, 0x59, 0x04, \n\t0x02, 0x14, 0x96, 0x14, 0x04, 0x02, 0x59, 0x55, 0x31, 0x01, 0xcf, 0x7a, \n\t0x80, 0x80, 0xa7, 0x05, 0x16, 0x09, 0x4d, 0x0a, 0x0d, 0x0d, 0x0a, 0x4d, \n\t0x18, 0x0c, 0x36, 0x41, 0x04, 0x37, 0x37, 0x04, 0x41, 0x00, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x32, 0x00, 0x26, 0x02, 0x27, 0x01, 0xcf, 0x00, 0x1c, \n\t0x00, 0x23, 0x00, 0x00, 0x25, 0x1e, 0x01, 0x0f, 0x01, 0x0e, 0x01, 0x23, \n\t0x21, 0x22, 0x26, 0x2f, 0x01, 0x26, 0x3f, 0x01, 0x33, 0x07, 0x33, 0x32, \n\t0x1f, 0x01, 0x33, 0x37, 0x36, 0x3b, 0x01, 0x27, 0x33, 0x27, 0x07, 0x27, \n\t0x33, 0x35, 0x33, 0x15, 0x02, 0x16, 0x09, 0x09, 0x03, 0x0e, 0x02, 0x12, \n\t0x0b, 0xfe, 0x68, 0x0b, 0x12, 0x02, 0x0e, 0x05, 0x15, 0x4f, 0x31, 0x55, \n\t0x59, 0x04, 0x02, 0x14, 0x96, 0x14, 0x04, 0x02, 0x59, 0x55, 0x31, 0x18, \n\t0x82, 0x82, 0x53, 0x5f, 0xae, 0x05, 0x16, 0x09, 0x4d, 0x0a, 0x0d, 0x0d, \n\t0x0a, 0x4d, 0x18, 0x0c, 0x36, 0x41, 0x04, 0x37, 0x37, 0x04, 0x41, 0x6b, \n\t0x7a, 0x7a, 0x80, 0x80, 0x00, 0x03, 0x00, 0x32, 0x00, 0x32, 0x01, 0xf4, \n\t0x01, 0xc2, 0x00, 0x09, 0x00, 0x13, 0x00, 0x17, 0x00, 0x00, 0x01, 0x32, \n\t0x16, 0x1d, 0x01, 0x21, 0x35, 0x34, 0x36, 0x33, 0x13, 0x11, 0x21, 0x11, \n\t0x14, 0x06, 0x23, 0x21, 0x22, 0x26, 0x37, 0x15, 0x33, 0x35, 0x01, 0xe5, \n\t0x06, 0x09, 0xfe, 0x3e, 0x09, 0x06, 0x0a, 0x01, 0x90, 0x15, 0x0e, 0xfe, \n\t0xb6, 0x0e, 0x15, 0x7d, 0x96, 0x01, 0xc2, 0x09, 0x06, 0x3c, 0x3c, 0x06, \n\t0x09, 0xfe, 0x93, 0x01, 0x09, 0xfe, 0xf7, 0x0f, 0x14, 0x14, 0xe6, 0x32, \n\t0x32, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x32, 0x00, 0x19, 0x01, 0xc2, \n\t0x01, 0xdb, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x1f, \n\t0x00, 0x23, 0x00, 0x27, 0x00, 0x2b, 0x00, 0x2f, 0x00, 0x33, 0x00, 0x00, \n\t0x01, 0x32, 0x16, 0x15, 0x11, 0x14, 0x06, 0x23, 0x21, 0x22, 0x26, 0x35, \n\t0x11, 0x34, 0x36, 0x33, 0x01, 0x11, 0x21, 0x11, 0x37, 0x15, 0x23, 0x35, \n\t0x37, 0x15, 0x23, 0x3d, 0x02, 0x33, 0x15, 0x27, 0x15, 0x23, 0x35, 0x17, \n\t0x15, 0x23, 0x35, 0x17, 0x35, 0x33, 0x1d, 0x02, 0x23, 0x35, 0x37, 0x35, \n\t0x33, 0x15, 0x01, 0x90, 0x15, 0x1d, 0x1d, 0x15, 0xfe, 0xd4, 0x14, 0x1e, \n\t0x1e, 0x14, 0x01, 0x2c, 0xfe, 0xd4, 0xaf, 0x7d, 0xc8, 0x64, 0x64, 0x7d, \n\t0x4b, 0x32, 0x32, 0x4b, 0x7d, 0xc8, 0x96, 0x32, 0x01, 0xdb, 0x1d, 0x15, \n\t0xfe, 0xa2, 0x14, 0x1e, 0x1e, 0x14, 0x01, 0x5e, 0x15, 0x1d, 0xfe, 0x70, \n\t0x01, 0x5e, 0xfe, 0xa2, 0x7d, 0x19, 0x19, 0x64, 0x19, 0x19, 0x19, 0x32, \n\t0x32, 0x32, 0x64, 0x64, 0x7d, 0x19, 0x19, 0x19, 0x19, 0x19, 0x4b, 0x19, \n\t0x19, 0x19, 0x19, 0x19, 0x00, 0x03, 0x00, 0x32, 0x00, 0x05, 0x01, 0x54, \n\t0x01, 0xef, 0x00, 0x0f, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x32, \n\t0x16, 0x15, 0x11, 0x14, 0x06, 0x2b, 0x01, 0x22, 0x26, 0x35, 0x11, 0x34, \n\t0x36, 0x33, 0x13, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x14, \n\t0x16, 0x37, 0x11, 0x23, 0x11, 0x01, 0x22, 0x15, 0x1d, 0x1d, 0x15, 0xbe, \n\t0x14, 0x1e, 0x1e, 0x14, 0x5f, 0x0f, 0x14, 0x14, 0x0f, 0x0e, 0x15, 0x15, \n\t0x77, 0xd2, 0x01, 0xef, 0x1d, 0x15, 0xfe, 0x7a, 0x14, 0x1e, 0x1e, 0x14, \n\t0x01, 0x86, 0x15, 0x1d, 0xfe, 0x2a, 0x0f, 0x0a, 0x0b, 0x0e, 0x0f, 0x14, \n\t0x0f, 0x4b, 0x01, 0x4a, 0xfe, 0xb6, 0x00, 0x00, 0x00, 0x04, 0x00, 0x32, \n\t0x00, 0x32, 0x02, 0x1c, 0x01, 0xc2, 0x00, 0x0b, 0x00, 0x13, 0x00, 0x1b, \n\t0x00, 0x23, 0x00, 0x00, 0x25, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, \n\t0x26, 0x35, 0x34, 0x36, 0x27, 0x36, 0x32, 0x17, 0x07, 0x26, 0x22, 0x07, \n\t0x27, 0x36, 0x32, 0x17, 0x07, 0x26, 0x22, 0x07, 0x27, 0x36, 0x20, 0x17, \n\t0x07, 0x26, 0x22, 0x07, 0x01, 0x27, 0x15, 0x1d, 0x1d, 0x15, 0x14, 0x1d, \n\t0x1d, 0x55, 0x2c, 0x7a, 0x2c, 0x23, 0x1d, 0x52, 0x1d, 0x69, 0x49, 0xcd, \n\t0x48, 0x23, 0x3a, 0xa3, 0x3b, 0x69, 0x66, 0x01, 0x1f, 0x65, 0x23, 0x57, \n\t0xf6, 0x57, 0x96, 0x1e, 0x14, 0x15, 0x1d, 0x1d, 0x15, 0x14, 0x1e, 0x38, \n\t0x2c, 0x2c, 0x24, 0x1d, 0x1d, 0x6a, 0x4a, 0x4a, 0x23, 0x3b, 0x3b, 0x6a, \n\t0x67, 0x67, 0x23, 0x58, 0x58, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x32, \n\t0x00, 0x32, 0x02, 0x26, 0x01, 0xc2, 0x00, 0x08, 0x00, 0x24, 0x00, 0x2c, \n\t0x00, 0x35, 0x00, 0x00, 0x01, 0x32, 0x16, 0x14, 0x06, 0x22, 0x26, 0x34, \n\t0x36, 0x37, 0x32, 0x16, 0x1d, 0x01, 0x14, 0x06, 0x23, 0x21, 0x22, 0x26, \n\t0x3d, 0x01, 0x34, 0x36, 0x3b, 0x01, 0x32, 0x3f, 0x01, 0x36, 0x3b, 0x01, \n\t0x32, 0x1f, 0x01, 0x16, 0x33, 0x02, 0x32, 0x36, 0x34, 0x26, 0x22, 0x06, \n\t0x14, 0x24, 0x32, 0x36, 0x34, 0x26, 0x23, 0x22, 0x15, 0x14, 0x01, 0x2c, \n\t0x20, 0x2b, 0x2c, 0x3e, 0x2c, 0x2c, 0xe7, 0x15, 0x1d, 0x1d, 0x15, 0xfe, \n\t0x70, 0x14, 0x1e, 0x1e, 0x14, 0x3c, 0x0e, 0x06, 0x0f, 0x05, 0x0f, 0xaa, \n\t0x0f, 0x05, 0x0f, 0x06, 0x0e, 0xc0, 0x68, 0x49, 0x49, 0x68, 0x49, 0x01, \n\t0x2d, 0x0e, 0x0a, 0x0a, 0x07, 0x12, 0x01, 0x2c, 0x2c, 0x3e, 0x2c, 0x2c, \n\t0x3e, 0x2c, 0x4b, 0x1d, 0x15, 0xe1, 0x14, 0x1e, 0x1e, 0x14, 0xe1, 0x15, \n\t0x1d, 0x0f, 0x2e, 0x0e, 0x0e, 0x2e, 0x0f, 0xfe, 0xed, 0x49, 0x68, 0x49, \n\t0x49, 0x68, 0x75, 0x0b, 0x0e, 0x0a, 0x11, 0x08, 0x00, 0x03, 0x00, 0x32, \n\t0x00, 0x1e, 0x01, 0x90, 0x01, 0xd6, 0x00, 0x11, 0x00, 0x22, 0x00, 0x2e, \n\t0x00, 0x00, 0x25, 0x36, 0x1d, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x3d, \n\t0x01, 0x34, 0x36, 0x17, 0x1e, 0x01, 0x32, 0x36, 0x37, 0x36, 0x17, 0x15, \n\t0x14, 0x06, 0x23, 0x22, 0x26, 0x3d, 0x01, 0x34, 0x17, 0x1e, 0x01, 0x32, \n\t0x36, 0x26, 0x32, 0x16, 0x1d, 0x01, 0x14, 0x06, 0x22, 0x26, 0x3d, 0x01, \n\t0x34, 0x01, 0x89, 0x07, 0x68, 0x47, 0x46, 0x69, 0x04, 0x03, 0x10, 0x5d, \n\t0x76, 0x5d, 0x11, 0x04, 0x02, 0x66, 0x49, 0x48, 0x67, 0x07, 0x0f, 0x5e, \n\t0x76, 0x5e, 0xe1, 0x90, 0x67, 0x67, 0x90, 0x67, 0xb3, 0x0a, 0x0b, 0x32, \n\t0x25, 0x3d, 0x3d, 0x25, 0x32, 0x04, 0x02, 0x05, 0x1a, 0x22, 0x22, 0x99, \n\t0x08, 0x08, 0x3a, 0x22, 0x2e, 0x2e, 0x22, 0x3a, 0x0a, 0x0a, 0x17, 0x1d, \n\t0x1d, 0xbb, 0x27, 0x1b, 0x20, 0x1d, 0x29, 0x29, 0x1d, 0x20, 0x1b, 0x00, \n\t0x00, 0x02, 0x00, 0x32, 0x00, 0x3e, 0x01, 0xf5, 0x01, 0xb5, 0x00, 0x13, \n\t0x00, 0x23, 0x00, 0x00, 0x25, 0x16, 0x0f, 0x01, 0x0e, 0x01, 0x23, 0x21, \n\t0x22, 0x26, 0x2f, 0x01, 0x26, 0x3f, 0x01, 0x36, 0x3b, 0x01, 0x32, 0x1f, \n\t0x01, 0x36, 0x26, 0x23, 0x21, 0x22, 0x06, 0x1f, 0x01, 0x1e, 0x01, 0x33, \n\t0x21, 0x32, 0x36, 0x37, 0x01, 0xec, 0x0d, 0x06, 0x11, 0x01, 0x11, 0x0b, \n\t0xfe, 0x9c, 0x0a, 0x12, 0x01, 0x11, 0x04, 0x0b, 0x4f, 0x0b, 0x19, 0xcc, \n\t0x19, 0x0c, 0x2c, 0x01, 0x0c, 0x0b, 0xfe, 0xbe, 0x0b, 0x0c, 0x01, 0x07, \n\t0x01, 0x11, 0x0b, 0x01, 0x27, 0x0b, 0x11, 0x01, 0xe3, 0x16, 0x1a, 0x5c, \n\t0x0a, 0x0f, 0x0f, 0x0a, 0x5c, 0x1a, 0x16, 0xbb, 0x17, 0x17, 0xfd, 0x0b, \n\t0x10, 0x10, 0x0b, 0x25, 0x0b, 0x0f, 0x0f, 0x0b, 0x00, 0x03, 0x00, 0x32, \n\t0x00, 0x23, 0x01, 0xfc, 0x01, 0xd1, 0x00, 0x29, 0x00, 0x2f, 0x00, 0x3c, \n\t0x00, 0x00, 0x01, 0x32, 0x16, 0x07, 0x06, 0x02, 0x07, 0x0e, 0x02, 0x22, \n\t0x2e, 0x01, 0x27, 0x34, 0x27, 0x16, 0x36, 0x37, 0x32, 0x36, 0x35, 0x34, \n\t0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x17, 0x0e, 0x01, 0x27, 0x2e, 0x01, \n\t0x27, 0x26, 0x37, 0x26, 0x27, 0x26, 0x36, 0x07, 0x1e, 0x01, 0x17, 0x27, \n\t0x06, 0x36, 0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x0e, 0x01, \n\t0x14, 0x16, 0x01, 0x38, 0x57, 0x70, 0x04, 0x03, 0x2a, 0x01, 0x01, 0x23, \n\t0x48, 0x52, 0x47, 0x23, 0x01, 0x02, 0x29, 0x51, 0x1d, 0x0e, 0x14, 0x14, \n\t0x0f, 0x0e, 0x15, 0x05, 0x18, 0x43, 0x20, 0x33, 0x37, 0x02, 0x04, 0x52, \n\t0x09, 0x02, 0x04, 0x70, 0x8c, 0x02, 0x21, 0x1d, 0x10, 0x32, 0xbb, 0x52, \n\t0x4b, 0x26, 0x26, 0x4a, 0x2a, 0x29, 0x4a, 0x26, 0x26, 0x01, 0xd1, 0x31, \n\t0x1c, 0x13, 0xfe, 0xf3, 0x06, 0x09, 0x1a, 0x18, 0x18, 0x1a, 0x09, 0x01, \n\t0x0e, 0x03, 0x29, 0x26, 0x14, 0x0f, 0x0e, 0x15, 0x15, 0x0e, 0x0a, 0x08, \n\t0x1d, 0x1f, 0x02, 0x05, 0x2f, 0x1f, 0x3d, 0x1f, 0x2f, 0x16, 0x1c, 0x31, \n\t0xeb, 0x10, 0x1b, 0x06, 0x66, 0x16, 0x4b, 0x12, 0x15, 0x0e, 0x15, 0x12, \n\t0x12, 0x15, 0x0e, 0x15, 0x00, 0x02, 0x00, 0x32, 0x00, 0x00, 0x01, 0x40, \n\t0x01, 0xf4, 0x00, 0x12, 0x00, 0x20, 0x00, 0x00, 0x37, 0x1e, 0x01, 0x15, \n\t0x14, 0x06, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x35, 0x34, 0x3b, 0x01, \n\t0x32, 0x16, 0x15, 0x02, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x35, 0x23, \n\t0x15, 0x0e, 0x01, 0x15, 0x14, 0xfa, 0x20, 0x26, 0x4f, 0x70, 0x4f, 0x26, \n\t0x20, 0x14, 0x55, 0x0a, 0x0f, 0x64, 0x46, 0x32, 0x20, 0x1a, 0x32, 0x1b, \n\t0x23, 0xfd, 0x12, 0x3e, 0x26, 0x38, 0x4f, 0x4f, 0x38, 0x26, 0x3e, 0x12, \n\t0xde, 0x19, 0x0f, 0x0a, 0xfe, 0x57, 0x32, 0x23, 0x1c, 0x2c, 0x08, 0xb9, \n\t0xb8, 0x08, 0x2d, 0x1c, 0x23, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x32, \n\t0x00, 0x26, 0x02, 0x26, 0x01, 0xcf, 0x00, 0x19, 0x00, 0x25, 0x00, 0x34, \n\t0x00, 0x00, 0x01, 0x22, 0x0e, 0x01, 0x07, 0x0e, 0x03, 0x2b, 0x01, 0x35, \n\t0x33, 0x32, 0x3e, 0x01, 0x37, 0x3e, 0x02, 0x3b, 0x01, 0x35, 0x17, 0x07, \n\t0x35, 0x05, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x17, 0x0e, 0x01, 0x07, \n\t0x06, 0x17, 0x35, 0x17, 0x07, 0x35, 0x23, 0x22, 0x27, 0x36, 0x37, 0x34, \n\t0x36, 0x37, 0x16, 0x33, 0x01, 0xab, 0x1b, 0x33, 0x1d, 0x1b, 0x18, 0x1b, \n\t0x33, 0x38, 0x21, 0x34, 0x34, 0x1b, 0x34, 0x1d, 0x1b, 0x1f, 0x27, 0x4d, \n\t0x2b, 0x12, 0x69, 0x69, 0xfe, 0xfc, 0x25, 0x2e, 0x34, 0x34, 0x46, 0x39, \n\t0x07, 0x17, 0x02, 0x04, 0xfc, 0x69, 0x69, 0x12, 0x46, 0x3c, 0x17, 0x0d, \n\t0x06, 0x01, 0x2a, 0x2d, 0x01, 0x4d, 0x20, 0x22, 0x23, 0x1f, 0x20, 0x2d, \n\t0x15, 0x46, 0x20, 0x22, 0x23, 0x29, 0x2c, 0x2c, 0x3c, 0x5a, 0x5a, 0x32, \n\t0x2c, 0x27, 0x46, 0x36, 0x08, 0x1d, 0x02, 0x06, 0x83, 0x32, 0x5a, 0x5a, \n\t0x3c, 0x3a, 0x1d, 0x11, 0x01, 0x07, 0x02, 0x2c, 0x00, 0x01, 0x00, 0x32, \n\t0x00, 0x64, 0x01, 0xf4, 0x01, 0x90, 0x00, 0x1a, 0x00, 0x00, 0x01, 0x32, \n\t0x16, 0x1d, 0x01, 0x14, 0x06, 0x23, 0x21, 0x22, 0x26, 0x3d, 0x01, 0x34, \n\t0x36, 0x3b, 0x01, 0x35, 0x17, 0x07, 0x35, 0x23, 0x15, 0x21, 0x35, 0x23, \n\t0x35, 0x01, 0xc2, 0x15, 0x1d, 0x1d, 0x15, 0xfe, 0xa2, 0x14, 0x1e, 0x1e, \n\t0x14, 0x7d, 0x64, 0x64, 0x69, 0x01, 0x36, 0x4b, 0x01, 0x59, 0x1d, 0x15, \n\t0x91, 0x14, 0x1e, 0x1e, 0x14, 0x91, 0x15, 0x1d, 0x37, 0x5a, 0x5a, 0x37, \n\t0x69, 0x69, 0x46, 0x00, 0x00, 0x02, 0x00, 0x32, 0x00, 0x2d, 0x01, 0xce, \n\t0x01, 0xc7, 0x00, 0x0e, 0x00, 0x1d, 0x00, 0x00, 0x3f, 0x01, 0x15, 0x27, \n\t0x37, 0x26, 0x36, 0x37, 0x36, 0x37, 0x17, 0x06, 0x07, 0x0e, 0x01, 0x37, \n\t0x17, 0x07, 0x16, 0x06, 0x07, 0x06, 0x07, 0x27, 0x36, 0x37, 0x3e, 0x01, \n\t0x27, 0x07, 0x90, 0x3a, 0x8a, 0x2c, 0x3a, 0x02, 0x3b, 0x32, 0x46, 0x02, \n\t0x32, 0x24, 0x2c, 0x02, 0xd1, 0x8a, 0x2c, 0x3a, 0x02, 0x3b, 0x30, 0x48, \n\t0x01, 0x31, 0x24, 0x2c, 0x02, 0x2b, 0x39, 0x91, 0x3a, 0x92, 0x08, 0x2b, \n\t0x3d, 0xa8, 0x3c, 0x32, 0x08, 0x33, 0x08, 0x24, 0x2c, 0x7d, 0xfd, 0x08, \n\t0x2b, 0x3d, 0xa8, 0x3c, 0x31, 0x0a, 0x34, 0x08, 0x24, 0x2c, 0x7d, 0x2e, \n\t0x3a, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x32, 0x00, 0x4b, 0x01, 0x90, \n\t0x01, 0xa9, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x1f, 0x00, 0x28, 0x00, 0x31, \n\t0x00, 0x39, 0x00, 0x40, 0x00, 0x48, 0x00, 0x50, 0x00, 0x58, 0x00, 0x00, \n\t0x13, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, \n\t0x17, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, \n\t0x26, 0x32, 0x16, 0x15, 0x14, 0x22, 0x35, 0x34, 0x24, 0x16, 0x07, 0x0e, \n\t0x01, 0x27, 0x26, 0x36, 0x37, 0x16, 0x32, 0x16, 0x15, 0x14, 0x23, 0x22, \n\t0x35, 0x34, 0x06, 0x32, 0x16, 0x14, 0x06, 0x22, 0x26, 0x34, 0x26, 0x36, \n\t0x16, 0x07, 0x0e, 0x01, 0x27, 0x26, 0x36, 0x17, 0x1e, 0x01, 0x07, 0x06, \n\t0x27, 0x17, 0x26, 0x36, 0x17, 0x1e, 0x01, 0x07, 0x06, 0x02, 0x22, 0x26, \n\t0x34, 0x36, 0x32, 0x16, 0x14, 0xe1, 0x22, 0x2e, 0x2e, 0x22, 0x21, 0x2f, \n\t0x2f, 0x21, 0x16, 0x1d, 0x1d, 0x16, 0x15, 0x1e, 0x1e, 0x8b, 0x14, 0x0f, \n\t0x32, 0x01, 0x1c, 0x1c, 0x12, 0x07, 0x13, 0x05, 0x06, 0x02, 0x07, 0x31, \n\t0x14, 0x0f, 0x19, 0x18, 0x86, 0x10, 0x0c, 0x0c, 0x10, 0x0c, 0x75, 0x24, \n\t0x1c, 0x12, 0x07, 0x13, 0x05, 0x10, 0x1c, 0x12, 0x07, 0x02, 0x05, 0x0f, \n\t0x11, 0xd4, 0x11, 0x1c, 0x12, 0x07, 0x02, 0x06, 0x0f, 0x65, 0x10, 0x0c, \n\t0x0c, 0x10, 0x0c, 0x01, 0x4a, 0x2f, 0x21, 0x22, 0x2e, 0x2e, 0x22, 0x21, \n\t0x2f, 0x84, 0x1e, 0x16, 0x15, 0x1e, 0x1e, 0x15, 0x16, 0x1e, 0x48, 0x0c, \n\t0x08, 0x14, 0x14, 0x08, 0x80, 0x1c, 0x12, 0x07, 0x02, 0x06, 0x06, 0x13, \n\t0x07, 0x63, 0x0c, 0x08, 0x14, 0x14, 0x08, 0x85, 0x0f, 0x14, 0x0f, 0x0f, \n\t0x14, 0x1c, 0x24, 0x1c, 0x12, 0x07, 0x02, 0x05, 0xe9, 0x1c, 0x12, 0x07, \n\t0x13, 0x05, 0x0e, 0x11, 0xd2, 0x12, 0x1c, 0x12, 0x07, 0x13, 0x05, 0x0e, \n\t0x01, 0x07, 0x0f, 0x14, 0x0f, 0x0f, 0x14, 0x00, 0x00, 0x0a, 0x00, 0x32, \n\t0x00, 0x00, 0x02, 0x26, 0x01, 0xf4, 0x00, 0x0b, 0x00, 0x15, 0x00, 0x1f, \n\t0x00, 0x2b, 0x00, 0x37, 0x00, 0x43, 0x00, 0x4d, 0x00, 0x5b, 0x00, 0x69, \n\t0x00, 0x72, 0x00, 0x00, 0x01, 0x32, 0x16, 0x15, 0x14, 0x2b, 0x01, 0x22, \n\t0x35, 0x34, 0x36, 0x33, 0x24, 0x32, 0x16, 0x15, 0x14, 0x06, 0x22, 0x26, \n\t0x35, 0x34, 0x16, 0x32, 0x36, 0x35, 0x34, 0x26, 0x22, 0x06, 0x15, 0x14, \n\t0x27, 0x14, 0x2b, 0x01, 0x22, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x32, 0x16, \n\t0x36, 0x22, 0x26, 0x3d, 0x01, 0x34, 0x36, 0x32, 0x16, 0x1d, 0x01, 0x14, \n\t0x02, 0x32, 0x16, 0x1d, 0x01, 0x14, 0x06, 0x22, 0x26, 0x3d, 0x01, 0x34, \n\t0x13, 0x07, 0x06, 0x27, 0x26, 0x37, 0x36, 0x37, 0x36, 0x16, 0x01, 0x3e, \n\t0x01, 0x17, 0x16, 0x06, 0x0f, 0x01, 0x0e, 0x01, 0x27, 0x26, 0x37, 0x36, \n\t0x13, 0x17, 0x16, 0x07, 0x06, 0x26, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x37, \n\t0x36, 0x16, 0x01, 0x26, 0x36, 0x1f, 0x01, 0x16, 0x06, 0x27, 0x26, 0x02, \n\t0x0d, 0x0a, 0x0f, 0x19, 0x18, 0x19, 0x0f, 0x0a, 0xfe, 0xfe, 0x72, 0x51, \n\t0x51, 0x72, 0x50, 0x60, 0x52, 0x3b, 0x3b, 0x52, 0x3b, 0x4b, 0x19, 0x19, \n\t0x19, 0x0f, 0x0a, 0x19, 0x0a, 0x0f, 0xb7, 0x10, 0x0c, 0x0c, 0x10, 0x0c, \n\t0x1c, 0x10, 0x0c, 0x0c, 0x10, 0x0c, 0xcc, 0x11, 0x11, 0x0f, 0x0e, 0x12, \n\t0x02, 0x0f, 0x12, 0x1c, 0xfe, 0x90, 0x07, 0x13, 0x05, 0x06, 0x02, 0x07, \n\t0x12, 0x07, 0x13, 0x05, 0x0f, 0x12, 0x03, 0x19, 0x12, 0x12, 0x0f, 0x05, \n\t0x13, 0x07, 0x0f, 0x03, 0x07, 0x02, 0x06, 0x05, 0x13, 0x01, 0x2e, 0x12, \n\t0x1c, 0x12, 0x11, 0x12, 0x1c, 0x12, 0x0f, 0x01, 0x0e, 0x0c, 0x08, 0x14, \n\t0x14, 0x08, 0x0c, 0x75, 0x50, 0x39, 0x3a, 0x50, 0x50, 0x3a, 0x39, 0x9d, \n\t0x3a, 0x2a, 0x29, 0x3b, 0x3b, 0x29, 0x2a, 0x2a, 0x14, 0x14, 0x08, 0x0c, \n\t0x0c, 0xa7, 0x0f, 0x0a, 0x19, 0x0a, 0x0f, 0x0f, 0x0a, 0x19, 0x0a, 0xfe, \n\t0x93, 0x0f, 0x0a, 0x19, 0x0a, 0x0f, 0x0f, 0x0a, 0x19, 0x0a, 0x01, 0x59, \n\t0x11, 0x11, 0x0d, 0x0e, 0x12, 0x03, 0x0f, 0x11, 0x1c, 0xfe, 0xc8, 0x08, \n\t0x02, 0x06, 0x06, 0x13, 0x07, 0x12, 0x07, 0x02, 0x06, 0x0e, 0x12, 0x02, \n\t0x01, 0x52, 0x12, 0x12, 0x0e, 0x05, 0x02, 0x07, 0x0f, 0x02, 0x07, 0x13, \n\t0x06, 0x06, 0x02, 0xfe, 0x9a, 0x12, 0x1c, 0x12, 0x11, 0x12, 0x1c, 0x11, \n\t0x0f, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x32, 0x00, 0x1e, 0x01, 0xec, \n\t0x01, 0xd7, 0x00, 0x0d, 0x00, 0x1f, 0x00, 0x2e, 0x00, 0x00, 0x01, 0x16, \n\t0x14, 0x07, 0x01, 0x06, 0x23, 0x22, 0x27, 0x26, 0x34, 0x37, 0x01, 0x36, \n\t0x07, 0x37, 0x1e, 0x01, 0x07, 0x0e, 0x03, 0x27, 0x37, 0x1e, 0x02, 0x37, \n\t0x36, 0x2e, 0x01, 0x27, 0x07, 0x26, 0x36, 0x37, 0x36, 0x16, 0x17, 0x07, \n\t0x2e, 0x01, 0x07, 0x06, 0x1e, 0x01, 0x01, 0xe4, 0x08, 0x08, 0xfe, 0x79, \n\t0x09, 0x08, 0x09, 0x09, 0x08, 0x08, 0x01, 0x87, 0x11, 0x5a, 0x19, 0x25, \n\t0x1b, 0x11, 0x0c, 0x33, 0x50, 0x51, 0x2a, 0x8b, 0x16, 0x2c, 0x17, 0x05, \n\t0x03, 0x04, 0x16, 0x9a, 0x87, 0x14, 0x44, 0x20, 0x11, 0x47, 0x2c, 0x1a, \n\t0x1d, 0x2f, 0x05, 0x02, 0x02, 0x11, 0x01, 0xd0, 0x08, 0x14, 0x08, 0xfe, \n\t0x79, 0x07, 0x07, 0x07, 0x16, 0x07, 0x01, 0x87, 0x10, 0xd1, 0x19, 0x2e, \n\t0x50, 0x12, 0x0c, 0x21, 0x26, 0x07, 0x0f, 0x8a, 0x10, 0x16, 0x03, 0x02, \n\t0x05, 0x18, 0x2c, 0x35, 0x87, 0x42, 0x97, 0x20, 0x10, 0x15, 0x20, 0x19, \n\t0x13, 0x0f, 0x05, 0x04, 0x14, 0x26, 0x00, 0x00, 0x00, 0x05, 0x00, 0x32, \n\t0x00, 0x11, 0x01, 0xfa, 0x01, 0xe4, 0x00, 0x0d, 0x00, 0x1d, 0x00, 0x2a, \n\t0x00, 0x38, 0x00, 0x46, 0x00, 0x00, 0x13, 0x36, 0x1e, 0x02, 0x07, 0x0e, \n\t0x02, 0x2e, 0x02, 0x3e, 0x01, 0x17, 0x36, 0x2e, 0x01, 0x27, 0x2e, 0x02, \n\t0x07, 0x06, 0x1e, 0x01, 0x17, 0x1e, 0x02, 0x37, 0x22, 0x27, 0x26, 0x34, \n\t0x3f, 0x01, 0x36, 0x17, 0x16, 0x0f, 0x01, 0x06, 0x27, 0x2e, 0x01, 0x3f, \n\t0x01, 0x36, 0x17, 0x1e, 0x01, 0x0f, 0x01, 0x06, 0x23, 0x22, 0x1e, 0x01, \n\t0x06, 0x0f, 0x01, 0x06, 0x23, 0x22, 0x27, 0x26, 0x36, 0x3f, 0x01, 0x36, \n\t0x8a, 0x15, 0x6b, 0x6e, 0x2f, 0x15, 0x0e, 0x40, 0x5c, 0x66, 0x4a, 0x0a, \n\t0x27, 0x27, 0xf6, 0x04, 0x0b, 0x26, 0x1d, 0x1c, 0x3e, 0x27, 0x05, 0x04, \n\t0x0b, 0x26, 0x1c, 0x1d, 0x3e, 0x27, 0x08, 0x09, 0x08, 0x08, 0x08, 0x2f, \n\t0x12, 0x12, 0x10, 0x10, 0x30, 0x08, 0x64, 0x09, 0x05, 0x05, 0x1b, 0x0d, \n\t0x15, 0x09, 0x05, 0x05, 0x1b, 0x07, 0x0e, 0x07, 0xd0, 0x0a, 0x06, 0x09, \n\t0x30, 0x08, 0x04, 0x0e, 0x08, 0x05, 0x06, 0x09, 0x30, 0x09, 0x01, 0x71, \n\t0x15, 0x2f, 0x6e, 0x6b, 0x15, 0x0e, 0x27, 0x27, 0x0a, 0x4a, 0x66, 0x5c, \n\t0x40, 0xe2, 0x05, 0x27, 0x3e, 0x1c, 0x1d, 0x26, 0x0b, 0x04, 0x05, 0x27, \n\t0x3e, 0x1d, 0x1c, 0x26, 0x0b, 0xc9, 0x08, 0x07, 0x15, 0x07, 0x30, 0x10, \n\t0x10, 0x12, 0x12, 0x2f, 0x08, 0x3e, 0x05, 0x14, 0x09, 0x30, 0x16, 0x0c, \n\t0x05, 0x14, 0x09, 0x30, 0x0d, 0x3f, 0x12, 0x14, 0x05, 0x1b, 0x04, 0x0d, \n\t0x09, 0x14, 0x05, 0x1b, 0x05, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x32, \n\t0x00, 0x64, 0x02, 0x26, 0x01, 0x90, 0x00, 0x15, 0x00, 0x2d, 0x00, 0x39, \n\t0x00, 0x00, 0x25, 0x14, 0x16, 0x3b, 0x01, 0x0e, 0x01, 0x2b, 0x01, 0x22, \n\t0x26, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x32, 0x16, 0x17, 0x23, 0x22, 0x06, \n\t0x07, 0x36, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x0e, 0x01, 0x0f, 0x01, 0x27, \n\t0x26, 0x07, 0x06, 0x17, 0x16, 0x17, 0x16, 0x36, 0x3f, 0x01, 0x17, 0x16, \n\t0x37, 0x32, 0x16, 0x14, 0x06, 0x2b, 0x01, 0x22, 0x26, 0x34, 0x36, 0x33, \n\t0x01, 0xb3, 0x24, 0x15, 0x21, 0x0f, 0x22, 0x2a, 0xfa, 0x41, 0x45, 0x45, \n\t0x41, 0xfa, 0x2a, 0x22, 0x0f, 0x21, 0x15, 0x24, 0x44, 0x05, 0x09, 0x44, \n\t0x15, 0x08, 0x0a, 0x08, 0x02, 0x03, 0x0b, 0x4a, 0x0d, 0x04, 0x04, 0x08, \n\t0x44, 0x16, 0x11, 0x08, 0x05, 0x0c, 0x49, 0x0d, 0x9f, 0x0b, 0x11, 0x11, \n\t0x0b, 0x13, 0x0b, 0x10, 0x10, 0x0b, 0xfa, 0x31, 0x3b, 0x17, 0x13, 0x5e, \n\t0x38, 0x37, 0x5f, 0x13, 0x17, 0x3c, 0x5d, 0x06, 0x07, 0x43, 0x0f, 0x05, \n\t0x03, 0x08, 0x04, 0x07, 0x1c, 0x21, 0x06, 0x06, 0x07, 0x07, 0x42, 0x0f, \n\t0x08, 0x05, 0x0d, 0x1d, 0x22, 0x06, 0x67, 0x1b, 0x2c, 0x1c, 0x1c, 0x2c, \n\t0x1b, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x32, 0x00, 0x35, 0x01, 0xbd, \n\t0x01, 0xc0, 0x00, 0x11, 0x00, 0x1a, 0x00, 0x00, 0x25, 0x16, 0x0f, 0x01, \n\t0x06, 0x2f, 0x01, 0x06, 0x23, 0x22, 0x26, 0x34, 0x36, 0x32, 0x16, 0x15, \n\t0x14, 0x07, 0x26, 0x14, 0x16, 0x32, 0x36, 0x35, 0x34, 0x26, 0x22, 0x01, \n\t0xb4, 0x0f, 0x0c, 0x17, 0x12, 0x10, 0x5f, 0x25, 0x29, 0x40, 0x5f, 0x5a, \n\t0x80, 0x60, 0x17, 0xf4, 0x44, 0x58, 0x3f, 0x44, 0x58, 0x72, 0x11, 0x0e, \n\t0x17, 0x10, 0x10, 0x5f, 0x15, 0x5f, 0x80, 0x5b, 0x5f, 0x40, 0x2c, 0x25, \n\t0x81, 0x58, 0x44, 0x3f, 0x2d, 0x2c, 0x43, 0x00, 0x00, 0x02, 0x00, 0x32, \n\t0x00, 0x04, 0x01, 0xb8, 0x01, 0xef, 0x00, 0x19, 0x00, 0x2f, 0x00, 0x00, \n\t0x01, 0x16, 0x06, 0x07, 0x06, 0x27, 0x0f, 0x02, 0x06, 0x0f, 0x01, 0x06, \n\t0x26, 0x2f, 0x01, 0x26, 0x3f, 0x01, 0x26, 0x27, 0x26, 0x36, 0x37, 0x36, \n\t0x16, 0x07, 0x36, 0x26, 0x27, 0x26, 0x06, 0x07, 0x0e, 0x01, 0x1e, 0x04, \n\t0x17, 0x1e, 0x03, 0x32, 0x3e, 0x01, 0x01, 0xb5, 0x0a, 0x30, 0x33, 0x21, \n\t0x20, 0x3b, 0x23, 0x34, 0x07, 0x10, 0x26, 0x06, 0x0a, 0x01, 0x08, 0x04, \n\t0x0a, 0x81, 0x0c, 0x07, 0x09, 0x47, 0x39, 0x35, 0x59, 0x36, 0x0f, 0x09, \n\t0x15, 0x15, 0x32, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x0b, 0x07, 0x0f, 0x04, \n\t0x03, 0x10, 0x07, 0x0c, 0x07, 0x0a, 0x08, 0x01, 0x7d, 0x3a, 0x63, 0x09, \n\t0x06, 0x05, 0x61, 0x06, 0x53, 0x0e, 0x02, 0x07, 0x02, 0x08, 0x07, 0x31, \n\t0x0f, 0x0d, 0xc1, 0x19, 0x23, 0x35, 0x51, 0x0a, 0x0a, 0x41, 0x5e, 0x16, \n\t0x35, 0x0f, 0x10, 0x0a, 0x16, 0x06, 0x0b, 0x09, 0x07, 0x0a, 0x05, 0x0b, \n\t0x03, 0x02, 0x0c, 0x04, 0x08, 0x01, 0x07, 0x00, 0x00, 0x02, 0x00, 0x32, \n\t0x00, 0x26, 0x01, 0x90, 0x01, 0xcf, 0x00, 0x1b, 0x00, 0x23, 0x00, 0x00, \n\t0x01, 0x32, 0x16, 0x1d, 0x01, 0x14, 0x0f, 0x01, 0x06, 0x2b, 0x01, 0x22, \n\t0x2f, 0x01, 0x26, 0x3d, 0x01, 0x34, 0x36, 0x3b, 0x01, 0x35, 0x34, 0x36, \n\t0x32, 0x16, 0x1d, 0x01, 0x27, 0x15, 0x33, 0x35, 0x34, 0x26, 0x22, 0x06, \n\t0x01, 0x72, 0x0a, 0x14, 0x18, 0x1e, 0x15, 0x1b, 0x91, 0x1c, 0x15, 0x1e, \n\t0x18, 0x0f, 0x0a, 0x32, 0x33, 0x62, 0x33, 0x96, 0x64, 0x1b, 0x2e, 0x1b, \n\t0x01, 0x39, 0x13, 0x0b, 0xc3, 0x18, 0x09, 0x09, 0x08, 0x08, 0x09, 0x09, \n\t0x18, 0xc3, 0x0b, 0x13, 0x23, 0x37, 0x3c, 0x3c, 0x37, 0x23, 0x2d, 0x2d, \n\t0x2d, 0x1a, 0x1d, 0x1d, 0x00, 0x01, 0x00, 0x32, 0x00, 0x19, 0x01, 0x90, \n\t0x01, 0xdb, 0x00, 0x23, 0x00, 0x00, 0x01, 0x32, 0x16, 0x1d, 0x01, 0x14, \n\t0x06, 0x0f, 0x01, 0x06, 0x2b, 0x01, 0x22, 0x2f, 0x01, 0x2e, 0x01, 0x3d, \n\t0x01, 0x34, 0x36, 0x3b, 0x01, 0x35, 0x34, 0x22, 0x1d, 0x01, 0x23, 0x35, \n\t0x34, 0x36, 0x33, 0x32, 0x1d, 0x01, 0x01, 0x72, 0x0a, 0x14, 0x0e, 0x0a, \n\t0x1e, 0x1a, 0x16, 0x91, 0x17, 0x1a, 0x1e, 0x0a, 0x0e, 0x0f, 0x0a, 0xc8, \n\t0x64, 0x32, 0x33, 0x31, 0x64, 0x01, 0x2c, 0x14, 0x0a, 0xc3, 0x0a, 0x13, \n\t0x03, 0x0a, 0x08, 0x08, 0x0a, 0x03, 0x13, 0x0a, 0xc3, 0x0b, 0x13, 0x46, \n\t0x37, 0x37, 0x14, 0x0a, 0x37, 0x3c, 0x73, 0x3c, 0x00, 0x03, 0x00, 0x32, \n\t0x00, 0x1d, 0x01, 0xc2, 0x01, 0xd8, 0x00, 0x19, 0x00, 0x28, 0x00, 0x33, \n\t0x00, 0x00, 0x01, 0x1e, 0x03, 0x17, 0x16, 0x06, 0x07, 0x06, 0x26, 0x27, \n\t0x26, 0x36, 0x27, 0x26, 0x36, 0x37, 0x3e, 0x01, 0x37, 0x36, 0x16, 0x37, \n\t0x36, 0x16, 0x02, 0x3e, 0x02, 0x27, 0x2e, 0x01, 0x06, 0x07, 0x0e, 0x02, \n\t0x17, 0x1e, 0x01, 0x37, 0x3e, 0x01, 0x37, 0x17, 0x16, 0x06, 0x07, 0x06, \n\t0x27, 0x36, 0x01, 0x6e, 0x08, 0x18, 0x15, 0x17, 0x06, 0x0b, 0x60, 0x4e, \n\t0x52, 0x85, 0x0b, 0x0a, 0x20, 0x07, 0x1c, 0x09, 0x34, 0x0d, 0x03, 0x0d, \n\t0x0c, 0x16, 0x11, 0x42, 0x42, 0x5a, 0x58, 0x47, 0x1d, 0x02, 0x04, 0x29, \n\t0x53, 0x34, 0x33, 0x47, 0x17, 0x03, 0x02, 0x2e, 0x65, 0x04, 0x0d, 0x02, \n\t0x01, 0x07, 0x1f, 0x1d, 0x30, 0x1c, 0x27, 0x01, 0x20, 0x11, 0x12, 0x04, \n\t0x13, 0x12, 0x1f, 0x63, 0x1d, 0x1d, 0x0d, 0x1f, 0x1b, 0x39, 0x1b, 0x60, \n\t0x6c, 0x2a, 0x0b, 0x1d, 0x05, 0x04, 0x14, 0x01, 0x01, 0x44, 0xfe, 0xc2, \n\t0x20, 0x35, 0x26, 0x06, 0x0b, 0x0b, 0x0a, 0x13, 0x13, 0x31, 0x23, 0x09, \n\t0x06, 0x0a, 0x6d, 0x01, 0x05, 0x01, 0x01, 0x14, 0x2b, 0x0a, 0x12, 0x19, \n\t0x22, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x32, 0x00, 0x19, 0x00, 0xe6, \n\t0x01, 0xdb, 0x00, 0x09, 0x00, 0x00, 0x13, 0x32, 0x16, 0x15, 0x11, 0x27, \n\t0x07, 0x11, 0x34, 0x33, 0xcd, 0x0b, 0x0e, 0x5a, 0x5a, 0x14, 0x01, 0xdb, \n\t0x0f, 0x0a, 0xfe, 0x57, 0x5a, 0x5a, 0x01, 0xa9, 0x19, 0x00, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x32, 0x00, 0x32, 0x01, 0xc2, 0x01, 0xc3, 0x00, 0x1f, \n\t0x00, 0x42, 0x00, 0x00, 0x37, 0x36, 0x32, 0x17, 0x16, 0x0f, 0x01, 0x06, \n\t0x23, 0x22, 0x26, 0x35, 0x34, 0x3f, 0x01, 0x3e, 0x01, 0x17, 0x16, 0x14, \n\t0x07, 0x06, 0x27, 0x26, 0x0f, 0x01, 0x06, 0x14, 0x17, 0x16, 0x32, 0x37, \n\t0x13, 0x16, 0x15, 0x14, 0x0f, 0x01, 0x06, 0x23, 0x22, 0x27, 0x26, 0x34, \n\t0x37, 0x36, 0x32, 0x17, 0x16, 0x3f, 0x01, 0x36, 0x35, 0x34, 0x27, 0x2e, \n\t0x01, 0x0f, 0x01, 0x06, 0x22, 0x27, 0x26, 0x3f, 0x01, 0x36, 0x16, 0xc5, \n\t0x07, 0x14, 0x08, 0x10, 0x10, 0x15, 0x1c, 0x26, 0x27, 0x38, 0x1c, 0x4a, \n\t0x23, 0x4a, 0x1b, 0x08, 0x08, 0x12, 0x11, 0x19, 0x29, 0x4a, 0x0d, 0x0d, \n\t0x0d, 0x25, 0x0d, 0xf6, 0x1c, 0x1c, 0x4f, 0x25, 0x26, 0x1f, 0x19, 0x07, \n\t0x07, 0x07, 0x15, 0x07, 0x19, 0x24, 0x4f, 0x0e, 0x0e, 0x0c, 0x20, 0x0e, \n\t0x19, 0x08, 0x14, 0x07, 0x11, 0x11, 0x19, 0x1b, 0x49, 0x85, 0x07, 0x07, \n\t0x11, 0x12, 0x14, 0x1c, 0x38, 0x26, 0x27, 0x1c, 0x4a, 0x22, 0x09, 0x1a, \n\t0x08, 0x14, 0x08, 0x10, 0x10, 0x18, 0x29, 0x49, 0x0d, 0x26, 0x0c, 0x0d, \n\t0x0d, 0x01, 0x33, 0x1c, 0x26, 0x27, 0x1c, 0x4f, 0x24, 0x19, 0x07, 0x14, \n\t0x08, 0x07, 0x07, 0x18, 0x24, 0x4e, 0x0e, 0x12, 0x13, 0x0c, 0x0d, 0x05, \n\t0x0d, 0x19, 0x07, 0x07, 0x11, 0x12, 0x19, 0x1b, 0x03, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x32, 0x00, 0x64, 0x01, 0xdb, 0x01, 0x90, 0x00, 0x10, \n\t0x00, 0x00, 0x01, 0x32, 0x16, 0x1d, 0x01, 0x14, 0x06, 0x23, 0x21, 0x35, \n\t0x21, 0x35, 0x23, 0x15, 0x27, 0x37, 0x15, 0x01, 0xa9, 0x14, 0x1e, 0x1e, \n\t0x14, 0xfe, 0xa7, 0x01, 0x45, 0xfa, 0x69, 0x69, 0x01, 0x59, 0x1d, 0x15, \n\t0x91, 0x14, 0x1e, 0x46, 0x69, 0x37, 0x5a, 0x5a, 0x37, 0x00, 0x00, 0x00, \n\t0x00, 0x03, 0x00, 0x32, 0x00, 0x19, 0x01, 0xf5, 0x01, 0xdc, 0x00, 0x14, \n\t0x00, 0x1d, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x1e, 0x01, 0x0f, 0x01, 0x0e, \n\t0x01, 0x27, 0x07, 0x06, 0x26, 0x27, 0x2e, 0x01, 0x3f, 0x01, 0x26, 0x36, \n\t0x3f, 0x01, 0x36, 0x03, 0x16, 0x37, 0x36, 0x27, 0x26, 0x0e, 0x02, 0x37, \n\t0x1e, 0x02, 0x37, 0x36, 0x2e, 0x04, 0x06, 0x1e, 0x01, 0x01, 0xa7, 0x3e, \n\t0x17, 0x0e, 0x43, 0x08, 0x2e, 0x19, 0xcc, 0x09, 0x27, 0x12, 0x12, 0x0d, \n\t0x09, 0xcc, 0x03, 0x0a, 0x08, 0x44, 0x0c, 0x7d, 0x10, 0x18, 0x17, 0x10, \n\t0x07, 0x18, 0x14, 0x03, 0xaf, 0x0f, 0x26, 0x18, 0x02, 0x01, 0x06, 0x14, \n\t0x1e, 0x24, 0x17, 0x04, 0x05, 0x14, 0x01, 0xcb, 0x3e, 0x44, 0x0c, 0x43, \n\t0x08, 0x0a, 0x03, 0xcc, 0x09, 0x0c, 0x13, 0x12, 0x26, 0x09, 0xcc, 0x19, \n\t0x2e, 0x08, 0x44, 0x0e, 0xfe, 0xfd, 0x10, 0x17, 0x17, 0x12, 0x07, 0x04, \n\t0x14, 0x17, 0x8d, 0x0f, 0x14, 0x05, 0x02, 0x02, 0x17, 0x25, 0x1e, 0x14, \n\t0x06, 0x04, 0x18, 0x26, 0x00, 0x01, 0x00, 0x32, 0x00, 0x37, 0x02, 0x1c, \n\t0x01, 0xbe, 0x00, 0x14, 0x00, 0x00, 0x01, 0x36, 0x15, 0x11, 0x21, 0x22, \n\t0x26, 0x3f, 0x01, 0x36, 0x1f, 0x01, 0x16, 0x36, 0x3f, 0x01, 0x36, 0x1f, \n\t0x01, 0x16, 0x37, 0x02, 0x14, 0x08, 0xfe, 0x1e, 0x06, 0x03, 0x04, 0x73, \n\t0x0a, 0x0a, 0x25, 0x05, 0x0b, 0x03, 0x4f, 0x08, 0x0b, 0x38, 0x0a, 0x09, \n\t0x01, 0xb9, 0x0b, 0x0d, 0xfe, 0x80, 0x07, 0x05, 0x90, 0x0b, 0x0a, 0x21, \n\t0x04, 0x01, 0x05, 0x77, 0x0d, 0x0b, 0x34, 0x0a, 0x0c, 0x00, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x32, 0x00, 0x41, 0x02, 0x00, 0x01, 0xb4, 0x00, 0x19, \n\t0x00, 0x1f, 0x00, 0x00, 0x01, 0x36, 0x16, 0x07, 0x06, 0x02, 0x07, 0x0e, \n\t0x01, 0x2f, 0x02, 0x37, 0x36, 0x37, 0x36, 0x26, 0x07, 0x05, 0x2f, 0x01, \n\t0x26, 0x34, 0x37, 0x36, 0x24, 0x01, 0x35, 0x17, 0x06, 0x07, 0x06, 0x01, \n\t0xf2, 0x07, 0x08, 0x02, 0x01, 0x46, 0x02, 0x01, 0x0c, 0x06, 0x7c, 0x0f, \n\t0x0b, 0xc2, 0x03, 0x02, 0x05, 0x02, 0xfe, 0xed, 0x38, 0x5f, 0x06, 0x06, \n\t0x04, 0x01, 0xb1, 0xfe, 0xe1, 0x50, 0x41, 0x06, 0x09, 0x01, 0xb3, 0x02, \n\t0x07, 0x06, 0x03, 0xfe, 0xd0, 0x06, 0x07, 0x05, 0x03, 0x43, 0x08, 0x0d, \n\t0xd2, 0x03, 0x02, 0x05, 0x02, 0xc9, 0x16, 0x26, 0x02, 0x08, 0x02, 0x02, \n\t0x99, 0xfe, 0x95, 0x66, 0x29, 0x3a, 0x06, 0x07, 0x00, 0x04, 0x00, 0x32, \n\t0x00, 0x09, 0x02, 0x14, 0x01, 0xeb, 0x00, 0x0b, 0x00, 0x15, 0x00, 0x2e, \n\t0x00, 0x47, 0x00, 0x00, 0x01, 0x36, 0x16, 0x17, 0x16, 0x06, 0x07, 0x06, \n\t0x26, 0x27, 0x26, 0x36, 0x13, 0x3e, 0x01, 0x2e, 0x01, 0x07, 0x0e, 0x01, \n\t0x1e, 0x01, 0x37, 0x32, 0x37, 0x17, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, \n\t0x26, 0x34, 0x36, 0x33, 0x32, 0x17, 0x07, 0x2e, 0x01, 0x23, 0x22, 0x15, \n\t0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x17, 0x0e, 0x01, 0x23, 0x22, 0x27, \n\t0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x07, 0x2e, 0x01, 0x23, \n\t0x22, 0x15, 0x14, 0x16, 0x01, 0x20, 0x63, 0x8e, 0x02, 0x01, 0x8a, 0x64, \n\t0x63, 0x8f, 0x01, 0x02, 0x8b, 0x6a, 0x4e, 0x6e, 0x02, 0x71, 0x4e, 0x4f, \n\t0x6d, 0x02, 0x70, 0x11, 0x14, 0x09, 0x1c, 0x0a, 0x0f, 0x10, 0x13, 0x1f, \n\t0x13, 0x13, 0x26, 0x1d, 0x2b, 0x13, 0x1f, 0x05, 0x0e, 0x07, 0x1e, 0x07, \n\t0x09, 0x93, 0x15, 0x07, 0x1d, 0x09, 0x20, 0x13, 0x20, 0x12, 0x13, 0x13, \n\t0x13, 0x1e, 0x2a, 0x12, 0x1e, 0x05, 0x0e, 0x07, 0x1f, 0x10, 0x01, 0xea, \n\t0x01, 0x8a, 0x63, 0x64, 0x8e, 0x02, 0x01, 0x8b, 0x63, 0x64, 0x8e, 0xfe, \n\t0x54, 0x01, 0x70, 0x9e, 0x6d, 0x01, 0x01, 0x70, 0x9e, 0x6d, 0x96, 0x14, \n\t0x0f, 0x12, 0x08, 0x0a, 0x13, 0x12, 0x44, 0x26, 0x21, 0x10, 0x0a, 0x08, \n\t0x29, 0x13, 0x0a, 0x0b, 0x14, 0x0f, 0x10, 0x14, 0x13, 0x12, 0x22, 0x20, \n\t0x15, 0x13, 0x21, 0x10, 0x0a, 0x08, 0x29, 0x12, 0x16, 0x00, 0x00, 0x00, \n\t0x00, 0x04, 0x00, 0x32, 0x00, 0x0a, 0x02, 0x12, 0x01, 0xea, 0x00, 0x05, \n\t0x00, 0x15, 0x00, 0x21, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x22, 0x34, 0x33, \n\t0x32, 0x14, 0x17, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x23, 0x15, 0x23, 0x35, \n\t0x23, 0x35, 0x34, 0x37, 0x36, 0x33, 0x37, 0x32, 0x16, 0x15, 0x14, 0x06, \n\t0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x12, 0x32, 0x36, 0x35, 0x34, 0x26, \n\t0x22, 0x06, 0x15, 0x14, 0x01, 0x22, 0x21, 0x21, 0x22, 0x0f, 0x07, 0x04, \n\t0x05, 0x1c, 0x4a, 0x1c, 0x05, 0x04, 0x07, 0x31, 0x64, 0x8c, 0x8c, 0x64, \n\t0x63, 0x8d, 0x8d, 0x12, 0xa2, 0x73, 0x73, 0xa2, 0x73, 0x01, 0x52, 0x44, \n\t0x44, 0x0d, 0x04, 0x05, 0x06, 0x62, 0x75, 0x75, 0x62, 0x06, 0x05, 0x04, \n\t0xa5, 0x8c, 0x64, 0x63, 0x8d, 0x8d, 0x63, 0x64, 0x8c, 0xfe, 0x4c, 0x73, \n\t0x51, 0x52, 0x72, 0x72, 0x52, 0x51, 0x00, 0x00, 0x00, 0x03, 0x00, 0x32, \n\t0x00, 0x0a, 0x02, 0x12, 0x01, 0xea, 0x00, 0x0b, 0x00, 0x29, 0x00, 0x48, \n\t0x00, 0x00, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, \n\t0x34, 0x36, 0x07, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x27, \n\t0x06, 0x07, 0x06, 0x07, 0x15, 0x23, 0x35, 0x22, 0x27, 0x37, 0x16, 0x33, \n\t0x32, 0x36, 0x35, 0x34, 0x2f, 0x03, 0x1f, 0x01, 0x36, 0x35, 0x34, 0x26, \n\t0x23, 0x22, 0x06, 0x07, 0x17, 0x36, 0x37, 0x36, 0x37, 0x35, 0x33, 0x15, \n\t0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x1f, 0x02, \n\t0x01, 0x22, 0x64, 0x8c, 0x8c, 0x64, 0x63, 0x8d, 0x8d, 0x56, 0x0b, 0x73, \n\t0x51, 0x37, 0x5c, 0x19, 0x59, 0x04, 0x13, 0x13, 0x18, 0x1c, 0x27, 0x22, \n\t0x21, 0x19, 0x1d, 0x0c, 0x12, 0x07, 0x17, 0x1c, 0x26, 0x83, 0x79, 0x07, \n\t0x73, 0x51, 0x33, 0x56, 0x1b, 0x5b, 0x06, 0x11, 0x10, 0x17, 0x1c, 0x22, \n\t0x1a, 0x1f, 0x16, 0x14, 0x0c, 0x07, 0x09, 0x02, 0x1e, 0x15, 0x01, 0xea, \n\t0x8c, 0x64, 0x63, 0x8d, 0x8d, 0x63, 0x64, 0x8c, 0xaf, 0x1f, 0x22, 0x51, \n\t0x73, 0x38, 0x2e, 0x28, 0x17, 0x0e, 0x0f, 0x02, 0x25, 0x25, 0x1d, 0x21, \n\t0x16, 0x0c, 0x0c, 0x09, 0x06, 0x0a, 0x0d, 0x10, 0x06, 0x36, 0x16, 0x1c, \n\t0x52, 0x72, 0x30, 0x29, 0x29, 0x12, 0x0d, 0x0b, 0x01, 0x25, 0x25, 0x02, \n\t0x14, 0x20, 0x0e, 0x04, 0x05, 0x0a, 0x04, 0x02, 0x0e, 0x09, 0x00, 0x00, \n\t0x00, 0x03, 0x00, 0x32, 0x00, 0x0a, 0x02, 0x12, 0x01, 0xea, 0x00, 0x0b, \n\t0x00, 0x2d, 0x00, 0x48, 0x00, 0x00, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, \n\t0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x07, 0x06, 0x15, 0x14, 0x16, 0x33, \n\t0x32, 0x36, 0x37, 0x27, 0x23, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x17, \n\t0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x23, 0x35, 0x33, 0x35, 0x34, 0x36, \n\t0x35, 0x23, 0x35, 0x33, 0x1f, 0x01, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, \n\t0x06, 0x07, 0x17, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x07, 0x26, 0x23, \n\t0x22, 0x07, 0x06, 0x07, 0x17, 0x33, 0x15, 0x01, 0x22, 0x64, 0x8c, 0x8c, \n\t0x64, 0x63, 0x8d, 0x8d, 0x56, 0x0b, 0x73, 0x51, 0x37, 0x5b, 0x1a, 0x7b, \n\t0x57, 0x05, 0x08, 0x13, 0x21, 0x17, 0x17, 0x09, 0x1c, 0x22, 0x40, 0x22, \n\t0x11, 0x06, 0x1a, 0x16, 0x01, 0x17, 0x05, 0xb5, 0x83, 0x06, 0x73, 0x51, \n\t0x33, 0x57, 0x1b, 0x4f, 0x04, 0x0a, 0x24, 0x38, 0x23, 0x1a, 0x0c, 0x14, \n\t0x18, 0x20, 0x12, 0x05, 0x03, 0x1c, 0x44, 0x01, 0xea, 0x8c, 0x64, 0x63, \n\t0x8d, 0x8d, 0x63, 0x64, 0x8c, 0xb0, 0x1f, 0x21, 0x51, 0x73, 0x37, 0x2f, \n\t0x36, 0x12, 0x0a, 0x14, 0x0a, 0x2d, 0x0f, 0x2e, 0x16, 0x1e, 0x1d, 0x07, \n\t0x02, 0x08, 0x02, 0x1c, 0x1c, 0x3a, 0x18, 0x1a, 0x52, 0x72, 0x30, 0x29, \n\t0x23, 0x07, 0x0c, 0x29, 0x0c, 0x2e, 0x0a, 0x16, 0x05, 0x09, 0x0c, 0x1c, \n\t0x00, 0x04, 0x00, 0x32, 0x00, 0x0a, 0x02, 0x12, 0x01, 0xea, 0x00, 0x0b, \n\t0x00, 0x22, 0x00, 0x26, 0x00, 0x39, 0x00, 0x00, 0x01, 0x32, 0x16, 0x15, \n\t0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x07, 0x06, 0x15, 0x14, \n\t0x16, 0x33, 0x32, 0x36, 0x37, 0x27, 0x15, 0x23, 0x15, 0x23, 0x35, 0x23, \n\t0x35, 0x33, 0x35, 0x27, 0x23, 0x35, 0x33, 0x17, 0x33, 0x27, 0x07, 0x37, \n\t0x17, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x17, 0x27, 0x33, \n\t0x1f, 0x01, 0x37, 0x33, 0x07, 0x33, 0x01, 0x22, 0x64, 0x8c, 0x8c, 0x64, \n\t0x63, 0x8d, 0x8d, 0x58, 0x09, 0x73, 0x51, 0x35, 0x59, 0x1a, 0x4c, 0x3f, \n\t0x3b, 0x3e, 0x3e, 0x06, 0x38, 0x1b, 0x5e, 0x38, 0x35, 0x03, 0x3f, 0x60, \n\t0x08, 0x73, 0x51, 0x35, 0x58, 0x1a, 0x4f, 0x1b, 0x40, 0x26, 0x17, 0x29, \n\t0x40, 0x3d, 0x26, 0x01, 0xea, 0x8c, 0x64, 0x63, 0x8d, 0x8d, 0x63, 0x64, \n\t0x8c, 0xb6, 0x1b, 0x1f, 0x51, 0x73, 0x34, 0x2c, 0x22, 0x22, 0x36, 0x36, \n\t0x25, 0x12, 0x0c, 0x25, 0x43, 0x18, 0x06, 0x20, 0x2b, 0x1d, 0x1b, 0x52, \n\t0x72, 0x33, 0x2b, 0x23, 0x31, 0x53, 0x0a, 0x5d, 0x70, 0x00, 0x00, 0x00, \n\t0x00, 0x03, 0x00, 0x32, 0x00, 0x0a, 0x02, 0x12, 0x01, 0xea, 0x00, 0x20, \n\t0x00, 0x2c, 0x00, 0x36, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x15, 0x14, \n\t0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x33, 0x16, 0x33, 0x32, 0x37, \n\t0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x33, 0x07, 0x27, 0x33, \n\t0x36, 0x37, 0x36, 0x37, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, \n\t0x35, 0x34, 0x36, 0x12, 0x32, 0x36, 0x35, 0x34, 0x26, 0x22, 0x06, 0x15, \n\t0x14, 0x01, 0x21, 0x39, 0x21, 0x21, 0x22, 0x25, 0x35, 0x28, 0x1f, 0x1d, \n\t0x06, 0x3c, 0x03, 0x32, 0x19, 0x10, 0x0f, 0x0e, 0x0f, 0x1a, 0x30, 0x06, \n\t0x12, 0x30, 0x2f, 0x12, 0x07, 0x1d, 0x1d, 0x2a, 0x64, 0x8c, 0x8c, 0x64, \n\t0x63, 0x8d, 0x8d, 0x12, 0xa2, 0x73, 0x73, 0xa2, 0x73, 0x01, 0x79, 0x25, \n\t0x24, 0x39, 0x37, 0x25, 0x25, 0x19, 0x18, 0x2d, 0x2b, 0x15, 0x16, 0x25, \n\t0x26, 0x14, 0x14, 0x2b, 0x2f, 0x2f, 0x2d, 0x18, 0x18, 0x71, 0x8c, 0x64, \n\t0x63, 0x8d, 0x8d, 0x63, 0x64, 0x8c, 0xfe, 0x4c, 0x73, 0x51, 0x52, 0x72, \n\t0x72, 0x52, 0x51, 0x00, 0x00, 0x04, 0x00, 0x32, 0x00, 0x0a, 0x02, 0x12, \n\t0x01, 0xea, 0x00, 0x03, 0x00, 0x07, 0x00, 0x13, 0x00, 0x1d, 0x00, 0x00, \n\t0x13, 0x35, 0x33, 0x15, 0x07, 0x35, 0x33, 0x15, 0x03, 0x32, 0x16, 0x15, \n\t0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x12, 0x32, 0x36, 0x35, \n\t0x34, 0x26, 0x22, 0x06, 0x15, 0x14, 0xcb, 0xae, 0xae, 0xae, 0x57, 0x64, \n\t0x8c, 0x8c, 0x64, 0x63, 0x8d, 0x8d, 0x12, 0xa2, 0x73, 0x73, 0xa2, 0x73, \n\t0x01, 0x0a, 0x29, 0x29, 0x4d, 0x29, 0x29, 0x01, 0x2d, 0x8c, 0x64, 0x63, \n\t0x8d, 0x8d, 0x63, 0x64, 0x8c, 0xfe, 0x4c, 0x73, 0x51, 0x52, 0x72, 0x72, \n\t0x52, 0x51, 0x00, 0x00, 0x00, 0x03, 0x00, 0x32, 0x00, 0x0a, 0x02, 0x12, \n\t0x01, 0xea, 0x00, 0x0b, 0x00, 0x26, 0x00, 0x3b, 0x00, 0x00, 0x01, 0x32, \n\t0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x07, 0x06, \n\t0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x27, 0x1e, 0x01, 0x33, 0x32, \n\t0x3f, 0x01, 0x17, 0x0e, 0x01, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, \n\t0x3f, 0x01, 0x17, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x17, \n\t0x36, 0x33, 0x32, 0x17, 0x07, 0x26, 0x27, 0x26, 0x23, 0x22, 0x01, 0x22, \n\t0x64, 0x8c, 0x8c, 0x64, 0x63, 0x8d, 0x8d, 0x56, 0x0b, 0x73, 0x51, 0x37, \n\t0x5b, 0x1a, 0xd4, 0x01, 0x1a, 0x19, 0x12, 0x0e, 0x03, 0x23, 0x02, 0x06, \n\t0x01, 0x1f, 0x25, 0x2b, 0x49, 0x03, 0x4e, 0xdc, 0x06, 0x73, 0x51, 0x33, \n\t0x57, 0x1b, 0x4a, 0x20, 0x42, 0x2c, 0x1f, 0x27, 0x04, 0x03, 0x0b, 0x0f, \n\t0x1a, 0x01, 0xea, 0x8c, 0x64, 0x63, 0x8d, 0x8d, 0x63, 0x64, 0x8c, 0xb0, \n\t0x1f, 0x21, 0x51, 0x73, 0x37, 0x2f, 0x5e, 0x1b, 0x2a, 0x0d, 0x03, 0x2a, \n\t0x01, 0x05, 0x02, 0x15, 0x3a, 0x41, 0x10, 0x0f, 0x11, 0x61, 0x18, 0x1a, \n\t0x52, 0x72, 0x30, 0x29, 0x21, 0x33, 0x1b, 0x28, 0x04, 0x02, 0x08, 0x00, \n\t0x00, 0x05, 0x00, 0x32, 0x00, 0x0a, 0x02, 0x12, 0x01, 0xea, 0x00, 0x09, \n\t0x00, 0x12, 0x00, 0x20, 0x00, 0x2c, 0x00, 0x36, 0x00, 0x00, 0x12, 0x32, \n\t0x16, 0x15, 0x14, 0x06, 0x22, 0x26, 0x35, 0x34, 0x17, 0x14, 0x17, 0x37, \n\t0x36, 0x27, 0x26, 0x23, 0x22, 0x17, 0x32, 0x35, 0x34, 0x27, 0x07, 0x06, \n\t0x17, 0x16, 0x33, 0x32, 0x15, 0x32, 0x16, 0x13, 0x32, 0x16, 0x15, 0x14, \n\t0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x12, 0x32, 0x36, 0x35, 0x34, \n\t0x26, 0x22, 0x06, 0x15, 0x14, 0xec, 0x6c, 0x2d, 0x2d, 0x6c, 0x2d, 0x38, \n\t0x02, 0x35, 0x07, 0x0a, 0x06, 0x03, 0x2b, 0x2b, 0x2b, 0x03, 0x3b, 0x0b, \n\t0x11, 0x01, 0x02, 0x01, 0x01, 0x06, 0x02, 0x64, 0x8c, 0x8c, 0x64, 0x63, \n\t0x8d, 0x8d, 0x12, 0xa2, 0x73, 0x73, 0xa2, 0x73, 0x01, 0x85, 0x51, 0x3a, \n\t0x39, 0x51, 0x51, 0x39, 0x3a, 0x3a, 0x09, 0x18, 0x61, 0x0c, 0x09, 0x02, \n\t0xad, 0x56, 0x14, 0x16, 0x66, 0x0f, 0x08, 0x01, 0x01, 0x01, 0x01, 0x46, \n\t0x8c, 0x64, 0x63, 0x8d, 0x8d, 0x63, 0x64, 0x8c, 0xfe, 0x4c, 0x73, 0x51, \n\t0x52, 0x72, 0x72, 0x52, 0x51, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x32, \n\t0x00, 0x0a, 0x02, 0x12, 0x01, 0xea, 0x00, 0x1a, 0x00, 0x24, 0x00, 0x28, \n\t0x00, 0x34, 0x00, 0x3e, 0x00, 0x00, 0x01, 0x32, 0x16, 0x1d, 0x01, 0x14, \n\t0x06, 0x2b, 0x01, 0x22, 0x26, 0x3d, 0x01, 0x23, 0x22, 0x26, 0x3d, 0x01, \n\t0x34, 0x37, 0x36, 0x37, 0x33, 0x32, 0x16, 0x1d, 0x01, 0x23, 0x33, 0x35, \n\t0x23, 0x15, 0x33, 0x35, 0x34, 0x37, 0x36, 0x17, 0x35, 0x23, 0x15, 0x13, \n\t0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x12, \n\t0x32, 0x36, 0x35, 0x34, 0x26, 0x22, 0x06, 0x15, 0x14, 0x01, 0x84, 0x06, \n\t0x08, 0x08, 0x06, 0x82, 0x06, 0x08, 0x34, 0x05, 0x08, 0x03, 0x02, 0x07, \n\t0x84, 0x05, 0x08, 0x50, 0x36, 0x69, 0x27, 0x04, 0x02, 0x7d, 0x69, 0x14, \n\t0x64, 0x8c, 0x8c, 0x64, 0x63, 0x8d, 0x8d, 0x12, 0xa2, 0x73, 0x73, 0xa2, \n\t0x73, 0x01, 0x3f, 0x08, 0x05, 0xb1, 0x05, 0x08, 0x08, 0x05, 0x34, 0x08, \n\t0x06, 0xb0, 0x06, 0x03, 0x03, 0x02, 0x08, 0x06, 0x34, 0x27, 0x96, 0x62, \n\t0x05, 0x04, 0x02, 0xaf, 0x97, 0x97, 0x01, 0x5c, 0x8c, 0x64, 0x63, 0x8d, \n\t0x8d, 0x63, 0x64, 0x8c, 0xfe, 0x4c, 0x73, 0x51, 0x52, 0x72, 0x72, 0x52, \n\t0x51, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x32, 0x00, 0x0a, 0x02, 0x12, \n\t0x01, 0xea, 0x00, 0x11, 0x00, 0x19, 0x00, 0x1d, 0x00, 0x21, 0x00, 0x2d, \n\t0x00, 0x37, 0x00, 0x00, 0x25, 0x17, 0x15, 0x0f, 0x02, 0x2f, 0x02, 0x07, \n\t0x27, 0x35, 0x37, 0x27, 0x35, 0x37, 0x17, 0x15, 0x07, 0x35, 0x23, 0x35, \n\t0x27, 0x15, 0x17, 0x35, 0x3f, 0x01, 0x27, 0x07, 0x17, 0x35, 0x07, 0x15, \n\t0x03, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, \n\t0x12, 0x32, 0x36, 0x35, 0x34, 0x26, 0x22, 0x06, 0x15, 0x14, 0x01, 0xbf, \n\t0x05, 0x05, 0x3a, 0x02, 0x03, 0x7e, 0x04, 0x3e, 0x3e, 0x3a, 0x01, 0x41, \n\t0x93, 0x14, 0x01, 0x6e, 0x6e, 0x08, 0x27, 0x24, 0x26, 0x56, 0x2b, 0x68, \n\t0x64, 0x8c, 0x8c, 0x64, 0x63, 0x8d, 0x8d, 0x12, 0xa2, 0x73, 0x73, 0xa2, \n\t0x73, 0xf6, 0x02, 0x44, 0x02, 0x19, 0x01, 0x01, 0x34, 0x02, 0x1a, 0x1b, \n\t0x3d, 0x18, 0x01, 0x44, 0x1c, 0x3d, 0x3b, 0x63, 0x2b, 0x01, 0x2d, 0x2b, \n\t0x2e, 0x01, 0x37, 0x10, 0x0f, 0x10, 0x34, 0x2a, 0x12, 0x2a, 0x01, 0x42, \n\t0x8c, 0x64, 0x63, 0x8d, 0x8d, 0x63, 0x64, 0x8c, 0xfe, 0x4c, 0x73, 0x51, \n\t0x52, 0x72, 0x72, 0x52, 0x51, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x32, \n\t0x00, 0x14, 0x01, 0xfe, 0x01, 0xe0, 0x00, 0x07, 0x00, 0x13, 0x00, 0x19, \n\t0x00, 0x00, 0x12, 0x32, 0x16, 0x14, 0x06, 0x22, 0x26, 0x34, 0x13, 0x32, \n\t0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x13, 0x15, \n\t0x17, 0x07, 0x27, 0x35, 0xb9, 0xbe, 0x87, 0x87, 0xbe, 0x87, 0xe6, 0x4b, \n\t0x69, 0x69, 0x4b, 0x4a, 0x6a, 0x6a, 0x5c, 0x4b, 0x19, 0x55, 0x01, 0xe0, \n\t0x87, 0xbe, 0x87, 0x87, 0xbe, 0xfe, 0xed, 0x6a, 0x4a, 0x4b, 0x69, 0x69, \n\t0x4b, 0x4a, 0x6a, 0x01, 0x36, 0x7a, 0x4b, 0x19, 0x55, 0x89, 0x00, 0x00, \n\t0x00, 0x04, 0x00, 0x32, 0x00, 0x0f, 0x01, 0x72, 0x01, 0xe5, 0x00, 0x2a, \n\t0x00, 0x34, 0x00, 0x3e, 0x00, 0x48, 0x00, 0x00, 0x25, 0x32, 0x16, 0x14, \n\t0x06, 0x23, 0x22, 0x27, 0x23, 0x22, 0x26, 0x3d, 0x01, 0x26, 0x35, 0x34, \n\t0x36, 0x32, 0x16, 0x15, 0x14, 0x07, 0x15, 0x14, 0x3b, 0x01, 0x36, 0x33, \n\t0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x27, 0x23, 0x22, 0x27, 0x15, 0x14, \n\t0x3b, 0x01, 0x3e, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x32, 0x36, 0x35, \n\t0x34, 0x25, 0x14, 0x16, 0x32, 0x36, 0x35, 0x34, 0x26, 0x22, 0x06, 0x12, \n\t0x32, 0x36, 0x35, 0x34, 0x26, 0x22, 0x06, 0x15, 0x14, 0x01, 0x36, 0x19, \n\t0x23, 0x23, 0x19, 0x28, 0x0f, 0x52, 0x2c, 0x2b, 0x24, 0x23, 0x32, 0x23, \n\t0x24, 0x27, 0x52, 0x0f, 0x28, 0x19, 0x23, 0x23, 0x19, 0x28, 0x0f, 0x52, \n\t0x15, 0x12, 0x27, 0x52, 0x0f, 0x36, 0x1c, 0x15, 0x15, 0x1c, 0x15, 0xfe, \n\t0xf2, 0x15, 0x1c, 0x15, 0x15, 0x1c, 0x15, 0xdd, 0x1c, 0x15, 0x15, 0x1c, \n\t0x15, 0x87, 0x23, 0x32, 0x23, 0x25, 0x36, 0x20, 0xe8, 0x11, 0x26, 0x19, \n\t0x23, 0x23, 0x19, 0x26, 0x11, 0x39, 0x27, 0x24, 0x23, 0x32, 0x23, 0x25, \n\t0x08, 0x61, 0x27, 0x24, 0x96, 0x14, 0x0f, 0x0e, 0x14, 0x14, 0x0e, 0x0f, \n\t0xa0, 0x0e, 0x14, 0x14, 0x0e, 0x0f, 0x14, 0x14, 0xfe, 0x71, 0x14, 0x0e, \n\t0x0f, 0x14, 0x14, 0x0f, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x32, \n\t0x00, 0x28, 0x01, 0x72, 0x01, 0xcc, 0x00, 0x2c, 0x00, 0x36, 0x00, 0x40, \n\t0x00, 0x4a, 0x00, 0x00, 0x01, 0x14, 0x07, 0x0e, 0x03, 0x07, 0x0e, 0x03, \n\t0x07, 0x16, 0x15, 0x14, 0x06, 0x22, 0x26, 0x35, 0x34, 0x37, 0x35, 0x26, \n\t0x35, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x07, 0x15, 0x36, 0x37, 0x3e, \n\t0x02, 0x37, 0x26, 0x35, 0x34, 0x36, 0x32, 0x16, 0x05, 0x14, 0x16, 0x32, \n\t0x36, 0x35, 0x34, 0x26, 0x22, 0x06, 0x12, 0x32, 0x36, 0x35, 0x34, 0x26, \n\t0x22, 0x06, 0x15, 0x14, 0x12, 0x32, 0x36, 0x35, 0x34, 0x26, 0x22, 0x06, \n\t0x15, 0x14, 0x01, 0x72, 0x25, 0x03, 0x16, 0x27, 0x1d, 0x17, 0x15, 0x15, \n\t0x1a, 0x0c, 0x02, 0x23, 0x23, 0x32, 0x23, 0x24, 0x24, 0x23, 0x32, 0x23, \n\t0x24, 0x14, 0x31, 0x1d, 0x1a, 0x19, 0x02, 0x23, 0x23, 0x32, 0x23, 0xfe, \n\t0xda, 0x14, 0x1c, 0x15, 0x15, 0x1c, 0x14, 0x14, 0x1c, 0x15, 0x15, 0x1c, \n\t0x14, 0xdc, 0x1c, 0x15, 0x15, 0x1c, 0x14, 0x01, 0x90, 0x28, 0x0f, 0x1d, \n\t0x2b, 0x1a, 0x0c, 0x07, 0x07, 0x08, 0x10, 0x18, 0x12, 0x0f, 0x28, 0x19, \n\t0x23, 0x23, 0x19, 0x27, 0x11, 0xbd, 0x11, 0x26, 0x19, 0x23, 0x23, 0x19, \n\t0x26, 0x11, 0x66, 0x0f, 0x0f, 0x09, 0x0b, 0x1e, 0x17, 0x10, 0x26, 0x19, \n\t0x23, 0x23, 0x19, 0x0e, 0x14, 0x14, 0x0e, 0x0f, 0x14, 0x14, 0xfe, 0xa3, \n\t0x14, 0x0e, 0x0f, 0x14, 0x14, 0x0f, 0x0e, 0x01, 0x18, 0x14, 0x0e, 0x0f, \n\t0x14, 0x14, 0x0f, 0x0e, 0x00, 0x05, 0x00, 0x32, 0x00, 0x0f, 0x02, 0x08, \n\t0x01, 0xe5, 0x00, 0x43, 0x00, 0x4d, 0x00, 0x57, 0x00, 0x61, 0x00, 0x6b, \n\t0x00, 0x00, 0x25, 0x16, 0x15, 0x14, 0x06, 0x22, 0x26, 0x35, 0x34, 0x37, \n\t0x35, 0x34, 0x2b, 0x01, 0x22, 0x27, 0x15, 0x16, 0x15, 0x14, 0x06, 0x22, \n\t0x26, 0x35, 0x34, 0x37, 0x35, 0x06, 0x2b, 0x01, 0x22, 0x0e, 0x01, 0x1d, \n\t0x01, 0x16, 0x15, 0x14, 0x06, 0x22, 0x26, 0x35, 0x34, 0x37, 0x35, 0x34, \n\t0x36, 0x3b, 0x01, 0x32, 0x3d, 0x01, 0x26, 0x35, 0x34, 0x36, 0x32, 0x16, \n\t0x15, 0x14, 0x07, 0x15, 0x14, 0x3b, 0x01, 0x32, 0x16, 0x15, 0x05, 0x34, \n\t0x26, 0x22, 0x06, 0x15, 0x14, 0x16, 0x32, 0x36, 0x13, 0x14, 0x16, 0x32, \n\t0x36, 0x35, 0x34, 0x26, 0x22, 0x06, 0x13, 0x34, 0x26, 0x22, 0x06, 0x15, \n\t0x14, 0x16, 0x32, 0x36, 0x16, 0x32, 0x36, 0x35, 0x34, 0x26, 0x22, 0x06, \n\t0x15, 0x14, 0x01, 0xe4, 0x24, 0x23, 0x32, 0x23, 0x24, 0x26, 0x32, 0x16, \n\t0x11, 0x24, 0x23, 0x32, 0x23, 0x24, 0x0f, 0x17, 0x32, 0x11, 0x13, 0x03, \n\t0x24, 0x23, 0x32, 0x23, 0x24, 0x2b, 0x2c, 0x32, 0x26, 0x24, 0x23, 0x32, \n\t0x23, 0x24, 0x27, 0x32, 0x2b, 0x2b, 0xfe, 0xad, 0x15, 0x1c, 0x14, 0x14, \n\t0x1c, 0x15, 0x6a, 0x14, 0x1c, 0x15, 0x15, 0x1c, 0x14, 0x45, 0x15, 0x1c, \n\t0x14, 0x14, 0x1c, 0x15, 0x7e, 0x1c, 0x15, 0x15, 0x1c, 0x14, 0x83, 0x11, \n\t0x27, 0x19, 0x23, 0x23, 0x19, 0x27, 0x11, 0x39, 0x27, 0x06, 0x66, 0x11, \n\t0x27, 0x19, 0x23, 0x23, 0x19, 0x27, 0x11, 0x66, 0x06, 0x13, 0x0e, 0x06, \n\t0x39, 0x11, 0x27, 0x19, 0x23, 0x23, 0x19, 0x27, 0x11, 0x39, 0x20, 0x36, \n\t0x1a, 0x46, 0x11, 0x26, 0x19, 0x23, 0x23, 0x19, 0x26, 0x11, 0x46, 0x1a, \n\t0x36, 0x20, 0x71, 0x0f, 0x14, 0x14, 0x0f, 0x0e, 0x14, 0x14, 0x01, 0x6c, \n\t0x0e, 0x14, 0x14, 0x0e, 0x0f, 0x14, 0x14, 0xfe, 0x93, 0x0f, 0x14, 0x14, \n\t0x0f, 0x0e, 0x14, 0x14, 0x14, 0x14, 0x0e, 0x0f, 0x14, 0x14, 0x0f, 0x0e, \n\t0x00, 0x03, 0x00, 0x32, 0x00, 0x28, 0x00, 0xaa, 0x01, 0xcc, 0x00, 0x13, \n\t0x00, 0x1d, 0x00, 0x27, 0x00, 0x00, 0x37, 0x16, 0x15, 0x14, 0x06, 0x22, \n\t0x26, 0x35, 0x34, 0x37, 0x35, 0x26, 0x35, 0x34, 0x36, 0x32, 0x16, 0x15, \n\t0x14, 0x07, 0x27, 0x14, 0x16, 0x32, 0x36, 0x35, 0x34, 0x26, 0x22, 0x06, \n\t0x12, 0x32, 0x36, 0x35, 0x34, 0x26, 0x22, 0x06, 0x15, 0x14, 0x86, 0x24, \n\t0x23, 0x32, 0x23, 0x24, 0x24, 0x23, 0x32, 0x23, 0x24, 0x3a, 0x14, 0x1c, \n\t0x15, 0x15, 0x1c, 0x14, 0x14, 0x1c, 0x15, 0x15, 0x1c, 0x14, 0x9c, 0x11, \n\t0x27, 0x19, 0x23, 0x23, 0x19, 0x27, 0x11, 0xbd, 0x11, 0x26, 0x19, 0x23, \n\t0x23, 0x19, 0x26, 0x11, 0x37, 0x0e, 0x14, 0x14, 0x0e, 0x0f, 0x14, 0x14, \n\t0xfe, 0xa3, 0x14, 0x0e, 0x0f, 0x14, 0x14, 0x0f, 0x0e, 0x00, 0x00, 0x00, \n\t0x00, 0x06, 0x00, 0x32, 0x00, 0x28, 0x01, 0x72, 0x01, 0xcc, 0x00, 0x13, \n\t0x00, 0x1d, 0x00, 0x27, 0x00, 0x3b, 0x00, 0x45, 0x00, 0x4f, 0x00, 0x00, \n\t0x13, 0x14, 0x07, 0x15, 0x16, 0x15, 0x14, 0x06, 0x22, 0x26, 0x35, 0x34, \n\t0x37, 0x35, 0x26, 0x35, 0x34, 0x36, 0x32, 0x16, 0x03, 0x34, 0x26, 0x22, \n\t0x06, 0x15, 0x14, 0x16, 0x32, 0x36, 0x02, 0x32, 0x36, 0x35, 0x34, 0x26, \n\t0x22, 0x06, 0x15, 0x14, 0x05, 0x16, 0x15, 0x14, 0x06, 0x22, 0x26, 0x35, \n\t0x34, 0x37, 0x35, 0x26, 0x35, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x07, \n\t0x27, 0x14, 0x16, 0x32, 0x36, 0x35, 0x34, 0x26, 0x22, 0x06, 0x12, 0x32, \n\t0x36, 0x35, 0x34, 0x26, 0x22, 0x06, 0x15, 0x14, 0xaa, 0x24, 0x24, 0x23, \n\t0x32, 0x23, 0x24, 0x24, 0x23, 0x32, 0x23, 0x19, 0x15, 0x1c, 0x14, 0x14, \n\t0x1c, 0x15, 0x31, 0x1c, 0x15, 0x15, 0x1c, 0x14, 0x01, 0x02, 0x24, 0x23, \n\t0x32, 0x23, 0x24, 0x24, 0x23, 0x32, 0x23, 0x24, 0x3a, 0x14, 0x1c, 0x15, \n\t0x15, 0x1c, 0x14, 0x14, 0x1c, 0x15, 0x15, 0x1c, 0x14, 0x01, 0x90, 0x26, \n\t0x11, 0xbd, 0x11, 0x27, 0x19, 0x23, 0x23, 0x19, 0x27, 0x11, 0xbd, 0x11, \n\t0x26, 0x19, 0x23, 0x23, 0xfe, 0xbb, 0x0f, 0x14, 0x14, 0x0f, 0x0e, 0x14, \n\t0x14, 0x01, 0x18, 0x14, 0x0e, 0x0f, 0x14, 0x14, 0x0f, 0x0e, 0xe6, 0x11, \n\t0x27, 0x19, 0x23, 0x23, 0x19, 0x27, 0x11, 0xbd, 0x11, 0x26, 0x19, 0x23, \n\t0x23, 0x19, 0x26, 0x11, 0x37, 0x0e, 0x14, 0x14, 0x0e, 0x0f, 0x14, 0x14, \n\t0xfe, 0xa3, 0x14, 0x0e, 0x0f, 0x14, 0x14, 0x0f, 0x0e, 0x00, 0x00, 0x00, \n\t0x00, 0x04, 0x00, 0x32, 0x00, 0x00, 0x01, 0x9d, 0x01, 0xf4, 0x00, 0x18, \n\t0x00, 0x22, 0x00, 0x2a, 0x00, 0x33, 0x00, 0x00, 0x25, 0x16, 0x07, 0x0e, \n\t0x01, 0x2f, 0x01, 0x07, 0x27, 0x37, 0x06, 0x2f, 0x01, 0x37, 0x17, 0x16, \n\t0x17, 0x37, 0x17, 0x07, 0x17, 0x1e, 0x01, 0x07, 0x06, 0x2f, 0x01, 0x07, \n\t0x14, 0x07, 0x17, 0x16, 0x3e, 0x01, 0x26, 0x07, 0x16, 0x3e, 0x01, 0x26, \n\t0x2f, 0x01, 0x07, 0x17, 0x16, 0x3e, 0x01, 0x26, 0x2f, 0x01, 0x0f, 0x01, \n\t0x01, 0x43, 0x18, 0x1a, 0x15, 0x49, 0x27, 0x20, 0x36, 0x1c, 0x67, 0x22, \n\t0x21, 0x3c, 0x5d, 0x3d, 0x21, 0x0d, 0x67, 0x1d, 0x36, 0x20, 0x26, 0x16, \n\t0x15, 0x18, 0x1e, 0x20, 0x3e, 0x01, 0x1f, 0x1a, 0x30, 0x1c, 0x0d, 0xf5, \n\t0x1a, 0x30, 0x1c, 0x0d, 0x19, 0x20, 0x40, 0x6e, 0x1a, 0x30, 0x1c, 0x0e, \n\t0x19, 0x1f, 0x02, 0x3e, 0xc3, 0x2d, 0x2d, 0x23, 0x12, 0x16, 0x12, 0x5c, \n\t0x10, 0xb3, 0x05, 0x13, 0x23, 0xa2, 0x23, 0x14, 0x1e, 0xb3, 0x11, 0x5d, \n\t0x12, 0x16, 0x4b, 0x22, 0x2c, 0x95, 0x13, 0x6c, 0x01, 0x02, 0x12, 0x0f, \n\t0x0d, 0x30, 0x31, 0x60, 0x0f, 0x0d, 0x30, 0x32, 0x0e, 0x13, 0x6f, 0x99, \n\t0x0f, 0x0d, 0x30, 0x31, 0x0f, 0x12, 0x02, 0x6c, 0x00, 0x01, 0x00, 0x32, \n\t0x00, 0x19, 0x01, 0xf4, 0x01, 0xdb, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x32, \n\t0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x01, 0x13, \n\t0x8a, 0x57, 0x57, 0x8a, 0x89, 0x58, 0x58, 0x01, 0xdb, 0x58, 0x89, 0x8a, \n\t0x57, 0x57, 0x8a, 0x89, 0x58, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x32, \n\t0x00, 0x25, 0x01, 0xe1, 0x01, 0xde, 0x00, 0x29, 0x00, 0x35, 0x00, 0x00, \n\t0x25, 0x1e, 0x01, 0x0e, 0x04, 0x07, 0x06, 0x26, 0x3f, 0x01, 0x27, 0x07, \n\t0x06, 0x26, 0x37, 0x3e, 0x05, 0x3a, 0x01, 0x17, 0x3e, 0x04, 0x17, 0x32, \n\t0x17, 0x16, 0x17, 0x16, 0x0e, 0x02, 0x07, 0x37, 0x16, 0x32, 0x37, 0x36, \n\t0x34, 0x27, 0x26, 0x22, 0x07, 0x06, 0x14, 0x01, 0x42, 0x03, 0x02, 0x0a, \n\t0x03, 0x20, 0x0d, 0x39, 0x0e, 0x10, 0x0d, 0x05, 0x14, 0x41, 0x35, 0x0e, \n\t0x0f, 0x06, 0x06, 0x13, 0x08, 0x0e, 0x0b, 0x12, 0x17, 0x1d, 0x15, 0x05, \n\t0x13, 0x3a, 0x3c, 0x55, 0x28, 0x04, 0x03, 0x02, 0x01, 0x05, 0x1c, 0x30, \n\t0x32, 0x12, 0x07, 0x0b, 0x20, 0x0b, 0x0b, 0x0b, 0x0b, 0x20, 0x0b, 0x0b, \n\t0xc1, 0x19, 0x1f, 0x1c, 0x0c, 0x14, 0x06, 0x19, 0x06, 0x06, 0x10, 0x0e, \n\t0x37, 0x42, 0x14, 0x06, 0x0e, 0x10, 0x0f, 0x31, 0x10, 0x1d, 0x07, 0x0d, \n\t0x03, 0x07, 0x19, 0x3c, 0x2c, 0x1f, 0x06, 0x03, 0x02, 0x05, 0x29, 0x56, \n\t0x41, 0x35, 0x0e, 0x86, 0x0b, 0x0b, 0x0c, 0x20, 0x0c, 0x0b, 0x0b, 0x0c, \n\t0x20, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x32, 0x00, 0x0a, 0x02, 0x12, \n\t0x01, 0xea, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x15, 0x00, 0x1d, \n\t0x00, 0x00, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, \n\t0x34, 0x36, 0x17, 0x05, 0x14, 0x17, 0x01, 0x26, 0x23, 0x22, 0x06, 0x1f, \n\t0x01, 0x32, 0x36, 0x35, 0x34, 0x27, 0x01, 0x16, 0x01, 0x22, 0x64, 0x8c, \n\t0x8c, 0x64, 0x63, 0x8d, 0x8d, 0xe4, 0xfe, 0xc9, 0x29, 0x01, 0x01, 0x32, \n\t0x42, 0x4c, 0x6a, 0x35, 0x81, 0x4c, 0x6b, 0x29, 0xfe, 0xff, 0x31, 0x01, \n\t0xea, 0x8c, 0x64, 0x63, 0x8d, 0x8d, 0x63, 0x64, 0x8c, 0x6e, 0x82, 0x42, \n\t0x31, 0x01, 0x01, 0x29, 0x6b, 0xcd, 0x35, 0x6b, 0x4b, 0x41, 0x33, 0xfe, \n\t0xff, 0x29, 0x00, 0x00, 0x00, 0x04, 0x00, 0x32, 0x00, 0x19, 0x02, 0x26, \n\t0x01, 0xdb, 0x00, 0x09, 0x00, 0x13, 0x00, 0x1d, 0x00, 0x24, 0x00, 0x00, \n\t0x01, 0x32, 0x16, 0x15, 0x11, 0x14, 0x06, 0x2b, 0x01, 0x11, 0x05, 0x34, \n\t0x36, 0x3b, 0x01, 0x11, 0x23, 0x22, 0x26, 0x35, 0x01, 0x15, 0x33, 0x11, \n\t0x21, 0x11, 0x33, 0x35, 0x36, 0x32, 0x17, 0x35, 0x26, 0x23, 0x22, 0x07, \n\t0x15, 0x01, 0xf4, 0x15, 0x1d, 0x1d, 0x15, 0x19, 0xfe, 0x57, 0x1e, 0x14, \n\t0x19, 0x19, 0x14, 0x1e, 0x01, 0x4f, 0x37, 0xfe, 0xe8, 0x37, 0x31, 0x48, \n\t0x13, 0x1a, 0x1d, 0x1b, 0x1c, 0x01, 0x90, 0x1e, 0x14, 0xfe, 0xed, 0x15, \n\t0x1d, 0x01, 0x77, 0x32, 0x14, 0x1e, 0xfe, 0x89, 0x1d, 0x15, 0x01, 0x79, \n\t0x34, 0xfe, 0x89, 0x01, 0x77, 0x34, 0x17, 0x4b, 0x21, 0x0c, 0x0c, 0x21, \n\t0x00, 0x03, 0x00, 0x32, 0x00, 0x54, 0x02, 0x26, 0x01, 0xa1, 0x00, 0x08, \n\t0x00, 0x1d, 0x00, 0x2f, 0x00, 0x00, 0x37, 0x3e, 0x01, 0x17, 0x16, 0x02, \n\t0x07, 0x06, 0x26, 0x37, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x0e, 0x01, \n\t0x26, 0x27, 0x34, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x07, 0x26, \n\t0x17, 0x16, 0x15, 0x14, 0x07, 0x0e, 0x01, 0x2b, 0x01, 0x2e, 0x01, 0x37, \n\t0x36, 0x35, 0x34, 0x27, 0x3e, 0x01, 0xfd, 0x11, 0xb4, 0x07, 0x06, 0x6c, \n\t0x0f, 0x19, 0x56, 0x47, 0x54, 0x74, 0x01, 0x01, 0x0e, 0x14, 0x10, 0x01, \n\t0x01, 0x91, 0x69, 0x24, 0x1f, 0x23, 0x14, 0xa9, 0x45, 0x01, 0x01, 0x0e, \n\t0x0a, 0x02, 0x0b, 0x0d, 0x01, 0x01, 0x28, 0x03, 0x0e, 0xa4, 0x1c, 0xe4, \n\t0x04, 0x03, 0xfe, 0xf0, 0x1b, 0x2b, 0x32, 0xe9, 0x7f, 0x5c, 0x0f, 0x08, \n\t0x0b, 0x0f, 0x02, 0x0e, 0x0a, 0x04, 0x12, 0x05, 0x71, 0x9c, 0x09, 0x2b, \n\t0x02, 0x1f, 0x4d, 0x6f, 0x13, 0x09, 0x0a, 0x0d, 0x02, 0x10, 0x0a, 0x07, \n\t0x10, 0x4b, 0x3b, 0x07, 0x25, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x32, \n\t0x00, 0x18, 0x02, 0x14, 0x01, 0xdb, 0x00, 0x0e, 0x00, 0x17, 0x00, 0x2b, \n\t0x00, 0x00, 0x24, 0x22, 0x26, 0x27, 0x36, 0x37, 0x1e, 0x01, 0x33, 0x32, \n\t0x36, 0x37, 0x16, 0x17, 0x06, 0x26, 0x22, 0x27, 0x37, 0x36, 0x32, 0x17, \n\t0x16, 0x1f, 0x01, 0x1e, 0x01, 0x0f, 0x01, 0x06, 0x22, 0x2f, 0x01, 0x26, \n\t0x36, 0x3f, 0x01, 0x07, 0x14, 0x16, 0x32, 0x36, 0x37, 0x27, 0x01, 0x50, \n\t0x5a, 0x42, 0x02, 0x16, 0x06, 0x05, 0x31, 0x1f, 0x20, 0x30, 0x05, 0x06, \n\t0x16, 0x02, 0x3f, 0x60, 0x0e, 0x1a, 0x05, 0x3e, 0x06, 0x06, 0x13, 0x9e, \n\t0x14, 0x01, 0x13, 0xb0, 0x13, 0x35, 0x13, 0xb1, 0x13, 0x02, 0x14, 0x5e, \n\t0x0b, 0x50, 0x70, 0x50, 0x01, 0x0b, 0xc6, 0x1b, 0x13, 0x3e, 0x11, 0x0e, \n\t0x12, 0x12, 0x0e, 0x11, 0x3e, 0x13, 0x8c, 0x16, 0x47, 0x11, 0x11, 0x13, \n\t0x34, 0xd6, 0x08, 0x19, 0x0b, 0x5e, 0x0b, 0x0b, 0x5e, 0x0a, 0x1a, 0x08, \n\t0x26, 0x1e, 0x18, 0x22, 0x22, 0x18, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x1c, \n\t0x01, 0x56, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, \n\t0x00, 0x3e, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, \n\t0x00, 0x6b, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x07, \n\t0x00, 0x82, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x11, \n\t0x00, 0xae, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x06, \n\t0x00, 0xce, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, \n\t0x00, 0xe1, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, \n\t0x00, 0xf5, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x25, \n\t0x01, 0x48, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0c, \n\t0x01, 0x88, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0c, \n\t0x01, 0xaf, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x12, \n\t0x01, 0xe2, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x12, \n\t0x02, 0x1b, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x06, \n\t0x02, 0x3c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x07, \n\t0x02, 0x53, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x00, 0x00, 0x3c, \n\t0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x01, 0x00, 0x0c, \n\t0x00, 0x5d, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x02, 0x00, 0x0e, \n\t0x00, 0x72, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x03, 0x00, 0x22, \n\t0x00, 0x8a, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x04, 0x00, 0x0c, \n\t0x00, 0xc0, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x05, 0x00, 0x0a, \n\t0x00, 0xd5, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x06, 0x00, 0x0c, \n\t0x00, 0xe7, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x07, 0x00, 0x4a, \n\t0x00, 0xfc, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x08, 0x00, 0x18, \n\t0x01, 0x6e, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x09, 0x00, 0x18, \n\t0x01, 0x95, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x0b, 0x00, 0x24, \n\t0x01, 0xbc, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x0c, 0x00, 0x24, \n\t0x01, 0xf5, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x10, 0x00, 0x0c, \n\t0x02, 0x2e, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x11, 0x00, 0x0e, \n\t0x02, 0x43, 0x00, 0x43, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x74, \n\t0x00, 0x69, 0x00, 0x76, 0x00, 0x65, 0x00, 0x20, 0x00, 0x43, 0x00, 0x6f, \n\t0x00, 0x6d, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x20, \n\t0x00, 0x43, 0x00, 0x43, 0x00, 0x20, 0x00, 0x42, 0x00, 0x59, 0x00, 0x2d, \n\t0x00, 0x53, 0x00, 0x41, 0x00, 0x20, 0x00, 0x32, 0x00, 0x30, 0x00, 0x31, \n\t0x00, 0x32, 0x00, 0x00, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x76, 0x65, \n\t0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x73, 0x20, 0x43, 0x43, 0x20, \n\t0x42, 0x59, 0x2d, 0x53, 0x41, 0x20, 0x32, 0x30, 0x31, 0x32, 0x00, 0x00, \n\t0x45, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x6f, 0x00, \n\t0x00, 0x45, 0x6e, 0x74, 0x79, 0x70, 0x6f, 0x00, 0x00, 0x52, 0x00, 0x65, \n\t0x00, 0x67, 0x00, 0x75, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, \n\t0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x00, 0x00, 0x46, 0x00, 0x4f, \n\t0x00, 0x4e, 0x00, 0x54, 0x00, 0x4c, 0x00, 0x41, 0x00, 0x42, 0x00, 0x3a, \n\t0x00, 0x4f, 0x00, 0x54, 0x00, 0x46, 0x00, 0x45, 0x00, 0x58, 0x00, 0x50, \n\t0x00, 0x4f, 0x00, 0x52, 0x00, 0x54, 0x00, 0x00, 0x46, 0x4f, 0x4e, 0x54, \n\t0x4c, 0x41, 0x42, 0x3a, 0x4f, 0x54, 0x46, 0x45, 0x58, 0x50, 0x4f, 0x52, \n\t0x54, 0x00, 0x00, 0x45, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, \n\t0x00, 0x6f, 0x00, 0x00, 0x45, 0x6e, 0x74, 0x79, 0x70, 0x6f, 0x00, 0x00, \n\t0x32, 0x00, 0x2e, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x32, \n\t0x2e, 0x30, 0x30, 0x30, 0x00, 0x00, 0x45, 0x00, 0x6e, 0x00, 0x74, 0x00, \n\t0x79, 0x00, 0x70, 0x00, 0x6f, 0x00, 0x00, 0x45, 0x6e, 0x74, 0x79, 0x70, \n\t0x6f, 0x00, 0x00, 0x45, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, \n\t0x00, 0x6f, 0x00, 0x20, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x61, \n\t0x00, 0x20, 0x00, 0x74, 0x00, 0x72, 0x00, 0x61, 0x00, 0x64, 0x00, 0x65, \n\t0x00, 0x6d, 0x00, 0x61, 0x00, 0x72, 0x00, 0x6b, 0x00, 0x20, 0x00, 0x6f, \n\t0x00, 0x66, 0x00, 0x20, 0x00, 0x44, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x69, \n\t0x00, 0x65, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x42, 0x00, 0x72, 0x00, 0x75, \n\t0x00, 0x63, 0x00, 0x65, 0x00, 0x00, 0x45, 0x6e, 0x74, 0x79, 0x70, 0x6f, \n\t0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x74, 0x72, 0x61, 0x64, 0x65, 0x6d, \n\t0x61, 0x72, 0x6b, 0x20, 0x6f, 0x66, 0x20, 0x44, 0x61, 0x6e, 0x69, 0x65, \n\t0x6c, 0x20, 0x42, 0x72, 0x75, 0x63, 0x65, 0x00, 0x00, 0x44, 0x00, 0x61, \n\t0x00, 0x6e, 0x00, 0x69, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x42, \n\t0x00, 0x72, 0x00, 0x75, 0x00, 0x63, 0x00, 0x65, 0x00, 0x00, 0x44, 0x61, \n\t0x6e, 0x69, 0x65, 0x6c, 0x20, 0x42, 0x72, 0x75, 0x63, 0x65, 0x00, 0x00, \n\t0x44, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x69, 0x00, 0x65, 0x00, 0x6c, 0x00, \n\t0x20, 0x00, 0x42, 0x00, 0x72, 0x00, 0x75, 0x00, 0x63, 0x00, 0x65, 0x00, \n\t0x00, 0x44, 0x61, 0x6e, 0x69, 0x65, 0x6c, 0x20, 0x42, 0x72, 0x75, 0x63, \n\t0x65, 0x00, 0x00, 0x77, 0x00, 0x77, 0x00, 0x77, 0x00, 0x2e, 0x00, 0x64, \n\t0x00, 0x61, 0x00, 0x6e, 0x00, 0x69, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x62, \n\t0x00, 0x72, 0x00, 0x75, 0x00, 0x63, 0x00, 0x65, 0x00, 0x2e, 0x00, 0x73, \n\t0x00, 0x65, 0x00, 0x00, 0x77, 0x77, 0x77, 0x2e, 0x64, 0x61, 0x6e, 0x69, \n\t0x65, 0x6c, 0x62, 0x72, 0x75, 0x63, 0x65, 0x2e, 0x73, 0x65, 0x00, 0x00, \n\t0x77, 0x00, 0x77, 0x00, 0x77, 0x00, 0x2e, 0x00, 0x64, 0x00, 0x61, 0x00, \n\t0x6e, 0x00, 0x69, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x62, 0x00, 0x72, 0x00, \n\t0x75, 0x00, 0x63, 0x00, 0x65, 0x00, 0x2e, 0x00, 0x73, 0x00, 0x65, 0x00, \n\t0x00, 0x77, 0x77, 0x77, 0x2e, 0x64, 0x61, 0x6e, 0x69, 0x65, 0x6c, 0x62, \n\t0x72, 0x75, 0x63, 0x65, 0x2e, 0x73, 0x65, 0x00, 0x00, 0x45, 0x00, 0x6e, \n\t0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x6f, 0x00, 0x00, 0x45, 0x6e, \n\t0x74, 0x79, 0x70, 0x6f, 0x00, 0x00, 0x52, 0x00, 0x65, 0x00, 0x67, 0x00, \n\t0x75, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x72, 0x00, 0x00, 0x52, 0x65, 0x67, \n\t0x75, 0x6c, 0x61, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0xff, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0xf2, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, \n\t0x01, 0x02, 0x01, 0x03, 0x01, 0x04, 0x01, 0x05, 0x01, 0x06, 0x01, 0x07, \n\t0x01, 0x08, 0x01, 0x09, 0x01, 0x0a, 0x00, 0x92, 0x01, 0x0b, 0x01, 0x0c, \n\t0x01, 0x0d, 0x01, 0x0e, 0x01, 0x0f, 0x01, 0x10, 0x01, 0x11, 0x01, 0x12, \n\t0x01, 0x13, 0x01, 0x14, 0x01, 0x15, 0x01, 0x16, 0x01, 0x17, 0x01, 0x18, \n\t0x01, 0x19, 0x01, 0x1a, 0x01, 0x1b, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x1e, \n\t0x01, 0x1f, 0x01, 0x20, 0x01, 0x21, 0x01, 0x22, 0x01, 0x23, 0x01, 0x24, \n\t0x01, 0x25, 0x01, 0x26, 0x01, 0x27, 0x01, 0x28, 0x01, 0x29, 0x01, 0x2a, \n\t0x01, 0x2b, 0x01, 0x2c, 0x01, 0x2d, 0x01, 0x2e, 0x01, 0x2f, 0x01, 0x30, \n\t0x01, 0x31, 0x01, 0x32, 0x01, 0x33, 0x01, 0x34, 0x01, 0x35, 0x01, 0x36, \n\t0x01, 0x37, 0x01, 0x38, 0x01, 0x39, 0x01, 0x3a, 0x01, 0x3b, 0x01, 0x3c, \n\t0x01, 0x3d, 0x01, 0x3e, 0x01, 0x3f, 0x00, 0x0e, 0x00, 0xef, 0x01, 0x40, \n\t0x01, 0x41, 0x01, 0x42, 0x01, 0x43, 0x01, 0x44, 0x01, 0x45, 0x01, 0x46, \n\t0x01, 0x47, 0x01, 0x48, 0x01, 0x49, 0x01, 0x4a, 0x01, 0x4b, 0x01, 0x4c, \n\t0x01, 0x4d, 0x01, 0x4e, 0x01, 0x4f, 0x01, 0x50, 0x01, 0x51, 0x01, 0x52, \n\t0x01, 0x53, 0x01, 0x54, 0x01, 0x55, 0x01, 0x56, 0x01, 0x57, 0x01, 0x58, \n\t0x01, 0x59, 0x01, 0x5a, 0x01, 0x5b, 0x01, 0x5c, 0x01, 0x5d, 0x01, 0x5e, \n\t0x01, 0x5f, 0x01, 0x60, 0x01, 0x61, 0x01, 0x62, 0x01, 0x63, 0x01, 0x64, \n\t0x01, 0x65, 0x01, 0x66, 0x01, 0x67, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6a, \n\t0x01, 0x6b, 0x01, 0x6c, 0x01, 0x6d, 0x01, 0x6e, 0x01, 0x6f, 0x01, 0x70, \n\t0x01, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x76, \n\t0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, \n\t0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x80, 0x01, 0x81, 0x01, 0x82, \n\t0x01, 0x83, 0x01, 0x84, 0x01, 0x85, 0x01, 0x86, 0x01, 0x87, 0x01, 0x88, \n\t0x01, 0x89, 0x01, 0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, \n\t0x00, 0x03, 0x01, 0x8f, 0x01, 0x90, 0x01, 0x91, 0x01, 0x92, 0x01, 0x93, \n\t0x01, 0x94, 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, 0x01, 0x98, 0x01, 0x99, \n\t0x01, 0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, 0x9e, 0x01, 0x9f, \n\t0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, 0xa3, 0x01, 0xa4, 0x01, 0xa5, \n\t0x01, 0xa6, 0x01, 0xa7, 0x01, 0xa8, 0x01, 0xa9, 0x01, 0xaa, 0x01, 0xab, \n\t0x01, 0xac, 0x01, 0xad, 0x01, 0xae, 0x01, 0xaf, 0x01, 0xb0, 0x01, 0xb1, \n\t0x01, 0xb2, 0x01, 0xb3, 0x01, 0xb4, 0x01, 0xb5, 0x01, 0xb6, 0x01, 0xb7, \n\t0x01, 0xb8, 0x01, 0xb9, 0x01, 0xba, 0x01, 0xbb, 0x01, 0xbc, 0x01, 0xbd, \n\t0x01, 0xbe, 0x01, 0xbf, 0x01, 0xc0, 0x01, 0xc1, 0x01, 0xc2, 0x01, 0xc3, \n\t0x01, 0xc4, 0x01, 0xc5, 0x01, 0xc6, 0x01, 0xc7, 0x01, 0xc8, 0x01, 0xc9, \n\t0x01, 0xca, 0x01, 0xcb, 0x01, 0xcc, 0x01, 0xcd, 0x01, 0xce, 0x01, 0xcf, \n\t0x01, 0xd0, 0x01, 0xd1, 0x01, 0xd2, 0x01, 0xd3, 0x01, 0xd4, 0x01, 0xd5, \n\t0x01, 0xd6, 0x01, 0xd7, 0x01, 0xd8, 0x01, 0xd9, 0x01, 0xda, 0x01, 0xdb, \n\t0x01, 0xdc, 0x01, 0xdd, 0x01, 0xde, 0x01, 0xdf, 0x01, 0xe0, 0x01, 0xe1, \n\t0x01, 0xe2, 0x01, 0xe3, 0x01, 0xe4, 0x01, 0xe5, 0x01, 0xe6, 0x01, 0xe7, \n\t0x01, 0xe8, 0x01, 0xe9, 0x01, 0xea, 0x01, 0xeb, 0x01, 0xec, 0x04, 0x70, \n\t0x61, 0x75, 0x73, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x09, 0x6c, 0x65, 0x66, \n\t0x74, 0x2d, 0x74, 0x68, 0x69, 0x6e, 0x07, 0x75, 0x70, 0x2d, 0x74, 0x68, \n\t0x69, 0x6e, 0x0a, 0x72, 0x69, 0x67, 0x68, 0x74, 0x2d, 0x74, 0x68, 0x69, \n\t0x6e, 0x09, 0x64, 0x6f, 0x77, 0x6e, 0x2d, 0x74, 0x68, 0x69, 0x6e, 0x08, \n\t0x6c, 0x65, 0x76, 0x65, 0x6c, 0x2d, 0x75, 0x70, 0x0a, 0x6c, 0x65, 0x76, \n\t0x65, 0x6c, 0x2d, 0x64, 0x6f, 0x77, 0x6e, 0x06, 0x73, 0x77, 0x69, 0x74, \n\t0x63, 0x68, 0x0c, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x64, 0x2d, 0x70, \n\t0x6c, 0x75, 0x73, 0x0d, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x64, 0x2d, \n\t0x6d, 0x69, 0x6e, 0x75, 0x73, 0x0c, 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, \n\t0x64, 0x2d, 0x70, 0x6c, 0x75, 0x73, 0x0d, 0x73, 0x71, 0x75, 0x61, 0x72, \n\t0x65, 0x64, 0x2d, 0x6d, 0x69, 0x6e, 0x75, 0x73, 0x04, 0x68, 0x6f, 0x6d, \n\t0x65, 0x08, 0x6b, 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x05, 0x65, \n\t0x72, 0x61, 0x73, 0x65, 0x02, 0x66, 0x66, 0x02, 0x66, 0x62, 0x06, 0x74, \n\t0x6f, 0x2d, 0x65, 0x6e, 0x64, 0x08, 0x74, 0x6f, 0x2d, 0x73, 0x74, 0x61, \n\t0x72, 0x74, 0x09, 0x68, 0x6f, 0x75, 0x72, 0x67, 0x6c, 0x61, 0x73, 0x73, \n\t0x03, 0x64, 0x6f, 0x74, 0x08, 0x74, 0x77, 0x6f, 0x2d, 0x64, 0x6f, 0x74, \n\t0x73, 0x0a, 0x74, 0x68, 0x72, 0x65, 0x65, 0x2d, 0x64, 0x6f, 0x74, 0x73, \n\t0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x04, 0x73, 0x74, 0x6f, 0x70, \n\t0x0b, 0x74, 0x72, 0x69, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x2d, 0x75, 0x70, \n\t0x04, 0x70, 0x6c, 0x61, 0x79, 0x0e, 0x74, 0x72, 0x69, 0x61, 0x6e, 0x67, \n\t0x6c, 0x65, 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x0d, 0x74, 0x72, 0x69, \n\t0x61, 0x6e, 0x67, 0x6c, 0x65, 0x2d, 0x64, 0x6f, 0x77, 0x6e, 0x0d, 0x74, \n\t0x72, 0x69, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x2d, 0x6c, 0x65, 0x66, 0x74, \n\t0x06, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x06, 0x61, 0x64, 0x6a, 0x75, \n\t0x73, 0x74, 0x09, 0x70, 0x69, 0x65, 0x2d, 0x63, 0x68, 0x61, 0x72, 0x74, \n\t0x05, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x04, 0x73, 0x74, 0x61, 0x72, 0x0a, \n\t0x73, 0x74, 0x61, 0x72, 0x2d, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x03, 0x63, \n\t0x75, 0x70, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x04, 0x6d, 0x6f, 0x6f, 0x6e, \n\t0x0b, 0x68, 0x65, 0x61, 0x72, 0x74, 0x2d, 0x65, 0x6d, 0x70, 0x74, 0x79, \n\t0x05, 0x68, 0x65, 0x61, 0x72, 0x74, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x0c, \n\t0x62, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x2d, 0x6e, 0x6f, 0x74, 0x65, 0x73, \n\t0x06, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x04, 0x66, 0x6c, 0x61, 0x67, \n\t0x05, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x03, 0x63, 0x6f, 0x67, 0x07, 0x77, \n\t0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x04, 0x62, 0x6f, 0x6c, 0x74, 0x0d, \n\t0x74, 0x68, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6c, 0x6f, 0x75, \n\t0x64, 0x09, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x08, \n\t0x61, 0x69, 0x72, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x04, 0x6d, 0x61, 0x69, \n\t0x6c, 0x06, 0x70, 0x65, 0x6e, 0x63, 0x69, 0x6c, 0x07, 0x66, 0x65, 0x61, \n\t0x74, 0x68, 0x65, 0x72, 0x05, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x0d, 0x63, \n\t0x69, 0x72, 0x63, 0x6c, 0x65, 0x64, 0x2d, 0x63, 0x72, 0x6f, 0x73, 0x73, \n\t0x05, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x0d, 0x73, 0x71, 0x75, 0x61, 0x72, \n\t0x65, 0x64, 0x2d, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x04, 0x68, 0x65, 0x6c, \n\t0x70, 0x05, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x05, 0x72, 0x69, 0x67, 0x68, \n\t0x74, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x07, \n\t0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x03, 0x63, 0x63, 0x77, 0x02, \n\t0x63, 0x77, 0x04, 0x6c, 0x65, 0x66, 0x74, 0x02, 0x75, 0x70, 0x04, 0x64, \n\t0x6f, 0x77, 0x6e, 0x0b, 0x61, 0x64, 0x64, 0x2d, 0x74, 0x6f, 0x2d, 0x6c, \n\t0x69, 0x73, 0x74, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x65, 0x64, \n\t0x2d, 0x6c, 0x69, 0x73, 0x74, 0x09, 0x6c, 0x65, 0x66, 0x74, 0x2d, 0x62, \n\t0x6f, 0x6c, 0x64, 0x0a, 0x72, 0x69, 0x67, 0x68, 0x74, 0x2d, 0x62, 0x6f, \n\t0x6c, 0x64, 0x07, 0x75, 0x70, 0x2d, 0x62, 0x6f, 0x6c, 0x64, 0x09, 0x64, \n\t0x6f, 0x77, 0x6e, 0x2d, 0x62, 0x6f, 0x6c, 0x64, 0x08, 0x61, 0x64, 0x64, \n\t0x2d, 0x75, 0x73, 0x65, 0x72, 0x0c, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, \n\t0x64, 0x2d, 0x68, 0x65, 0x6c, 0x70, 0x0c, 0x63, 0x69, 0x72, 0x63, 0x6c, \n\t0x65, 0x64, 0x2d, 0x69, 0x6e, 0x66, 0x6f, 0x03, 0x65, 0x79, 0x65, 0x03, \n\t0x74, 0x61, 0x67, 0x0c, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x2d, 0x63, \n\t0x6c, 0x6f, 0x75, 0x64, 0x05, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x09, 0x72, \n\t0x65, 0x70, 0x6c, 0x79, 0x2d, 0x61, 0x6c, 0x6c, 0x04, 0x63, 0x6f, 0x64, \n\t0x65, 0x06, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x05, 0x70, 0x72, 0x69, \n\t0x6e, 0x74, 0x07, 0x72, 0x65, 0x74, 0x77, 0x65, 0x65, 0x74, 0x07, 0x63, \n\t0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x04, 0x63, 0x68, 0x61, 0x74, 0x05, \n\t0x76, 0x63, 0x61, 0x72, 0x64, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, \n\t0x73, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x03, 0x6d, \n\t0x61, 0x70, 0x07, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x73, 0x73, 0x05, 0x74, \n\t0x72, 0x61, 0x73, 0x68, 0x03, 0x64, 0x6f, 0x63, 0x11, 0x74, 0x65, 0x78, \n\t0x74, 0x2d, 0x64, 0x6f, 0x63, 0x2d, 0x69, 0x6e, 0x76, 0x65, 0x72, 0x74, \n\t0x65, 0x64, 0x04, 0x64, 0x6f, 0x63, 0x73, 0x0d, 0x6c, 0x61, 0x6e, 0x64, \n\t0x73, 0x63, 0x61, 0x70, 0x65, 0x2d, 0x64, 0x6f, 0x63, 0x03, 0x72, 0x73, \n\t0x73, 0x05, 0x73, 0x68, 0x61, 0x72, 0x65, 0x04, 0x63, 0x61, 0x72, 0x74, \n\t0x09, 0x73, 0x68, 0x61, 0x72, 0x65, 0x61, 0x62, 0x6c, 0x65, 0x05, 0x6c, \n\t0x6f, 0x67, 0x69, 0x6e, 0x06, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x0b, \n\t0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x2d, 0x66, 0x75, 0x6c, 0x6c, 0x0c, \n\t0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x2d, 0x73, 0x6d, 0x61, 0x6c, 0x6c, \n\t0x05, 0x70, 0x6f, 0x70, 0x75, 0x70, 0x07, 0x70, 0x75, 0x62, 0x6c, 0x69, \n\t0x73, 0x68, 0x07, 0x62, 0x72, 0x6f, 0x77, 0x73, 0x65, 0x72, 0x0b, 0x61, \n\t0x72, 0x72, 0x6f, 0x77, 0x2d, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x0c, 0x63, \n\t0x69, 0x72, 0x63, 0x6c, 0x65, 0x64, 0x2d, 0x64, 0x6f, 0x77, 0x6e, 0x0c, \n\t0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x64, 0x2d, 0x6c, 0x65, 0x66, 0x74, \n\t0x0d, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x64, 0x2d, 0x72, 0x69, 0x67, \n\t0x68, 0x74, 0x0a, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x64, 0x2d, 0x75, \n\t0x70, 0x0c, 0x63, 0x68, 0x65, 0x76, 0x72, 0x6f, 0x6e, 0x2d, 0x64, 0x6f, \n\t0x77, 0x6e, 0x0c, 0x63, 0x68, 0x65, 0x76, 0x72, 0x6f, 0x6e, 0x2d, 0x6c, \n\t0x65, 0x66, 0x74, 0x0d, 0x63, 0x68, 0x65, 0x76, 0x72, 0x6f, 0x6e, 0x2d, \n\t0x72, 0x69, 0x67, 0x68, 0x74, 0x0a, 0x63, 0x68, 0x65, 0x76, 0x72, 0x6f, \n\t0x6e, 0x2d, 0x75, 0x70, 0x12, 0x63, 0x68, 0x65, 0x76, 0x72, 0x6f, 0x6e, \n\t0x2d, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x2d, 0x64, 0x6f, 0x77, 0x6e, 0x12, \n\t0x63, 0x68, 0x65, 0x76, 0x72, 0x6f, 0x6e, 0x2d, 0x73, 0x6d, 0x61, 0x6c, \n\t0x6c, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x13, 0x63, 0x68, 0x65, 0x76, 0x72, \n\t0x6f, 0x6e, 0x2d, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x2d, 0x72, 0x69, 0x67, \n\t0x68, 0x74, 0x10, 0x63, 0x68, 0x65, 0x76, 0x72, 0x6f, 0x6e, 0x2d, 0x73, \n\t0x6d, 0x61, 0x6c, 0x6c, 0x2d, 0x75, 0x70, 0x11, 0x63, 0x68, 0x65, 0x76, \n\t0x72, 0x6f, 0x6e, 0x2d, 0x74, 0x68, 0x69, 0x6e, 0x2d, 0x64, 0x6f, 0x77, \n\t0x6e, 0x11, 0x63, 0x68, 0x65, 0x76, 0x72, 0x6f, 0x6e, 0x2d, 0x74, 0x68, \n\t0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x12, 0x63, 0x68, 0x65, 0x76, \n\t0x72, 0x6f, 0x6e, 0x2d, 0x74, 0x68, 0x69, 0x6e, 0x2d, 0x72, 0x69, 0x67, \n\t0x68, 0x74, 0x0f, 0x63, 0x68, 0x65, 0x76, 0x72, 0x6f, 0x6e, 0x2d, 0x74, \n\t0x68, 0x69, 0x6e, 0x2d, 0x75, 0x70, 0x0a, 0x70, 0x72, 0x6f, 0x67, 0x72, \n\t0x65, 0x73, 0x73, 0x2d, 0x30, 0x0a, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, \n\t0x73, 0x73, 0x2d, 0x31, 0x0a, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, \n\t0x73, 0x2d, 0x32, 0x0a, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, \n\t0x2d, 0x33, 0x0c, 0x62, 0x61, 0x63, 0x6b, 0x2d, 0x69, 0x6e, 0x2d, 0x74, \n\t0x69, 0x6d, 0x65, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x05, \n\t0x69, 0x6e, 0x62, 0x6f, 0x78, 0x07, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, \n\t0x6c, 0x08, 0x6c, 0x69, 0x66, 0x65, 0x62, 0x75, 0x6f, 0x79, 0x05, 0x6d, \n\t0x6f, 0x75, 0x73, 0x65, 0x05, 0x62, 0x72, 0x75, 0x73, 0x68, 0x06, 0x6d, \n\t0x61, 0x67, 0x6e, 0x65, 0x74, 0x07, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, \n\t0x65, 0x06, 0x73, 0x77, 0x65, 0x64, 0x65, 0x6e, 0x07, 0x70, 0x69, 0x63, \n\t0x74, 0x75, 0x72, 0x65, 0x05, 0x67, 0x6c, 0x6f, 0x62, 0x65, 0x04, 0x6c, \n\t0x65, 0x61, 0x66, 0x0e, 0x67, 0x72, 0x61, 0x64, 0x75, 0x61, 0x74, 0x69, \n\t0x6f, 0x6e, 0x2d, 0x63, 0x61, 0x70, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, \n\t0x61, 0x67, 0x65, 0x03, 0x6d, 0x69, 0x63, 0x07, 0x70, 0x61, 0x6c, 0x65, \n\t0x74, 0x74, 0x65, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x05, 0x76, \n\t0x69, 0x64, 0x65, 0x6f, 0x0a, 0x68, 0x61, 0x69, 0x72, 0x2d, 0x63, 0x72, \n\t0x6f, 0x73, 0x73, 0x05, 0x6d, 0x75, 0x73, 0x69, 0x63, 0x06, 0x74, 0x72, \n\t0x6f, 0x70, 0x68, 0x79, 0x09, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x73, 0x2d, \n\t0x75, 0x70, 0x0b, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x73, 0x2d, 0x64, 0x6f, \n\t0x77, 0x6e, 0x03, 0x62, 0x61, 0x67, 0x04, 0x75, 0x73, 0x65, 0x72, 0x05, \n\t0x75, 0x73, 0x65, 0x72, 0x73, 0x0a, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x2d, \n\t0x62, 0x75, 0x6c, 0x62, 0x03, 0x6e, 0x65, 0x77, 0x05, 0x77, 0x61, 0x74, \n\t0x65, 0x72, 0x07, 0x64, 0x72, 0x6f, 0x70, 0x6c, 0x65, 0x74, 0x03, 0x61, \n\t0x69, 0x72, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x2d, 0x63, 0x61, \n\t0x72, 0x64, 0x07, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x09, 0x62, \n\t0x72, 0x69, 0x65, 0x66, 0x63, 0x61, 0x73, 0x65, 0x04, 0x73, 0x61, 0x76, \n\t0x65, 0x02, 0x63, 0x64, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x08, \n\t0x74, 0x65, 0x78, 0x74, 0x2d, 0x64, 0x6f, 0x63, 0x08, 0x63, 0x61, 0x6c, \n\t0x65, 0x6e, 0x64, 0x61, 0x72, 0x0a, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x67, \n\t0x72, 0x61, 0x70, 0x68, 0x09, 0x62, 0x61, 0x72, 0x2d, 0x67, 0x72, 0x61, \n\t0x70, 0x68, 0x09, 0x63, 0x6c, 0x69, 0x70, 0x62, 0x6f, 0x61, 0x72, 0x64, \n\t0x06, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x09, 0x62, 0x6f, 0x6f, 0x6b, \n\t0x6d, 0x61, 0x72, 0x6b, 0x73, 0x04, 0x62, 0x6f, 0x6f, 0x6b, 0x09, 0x6f, \n\t0x70, 0x65, 0x6e, 0x2d, 0x62, 0x6f, 0x6f, 0x6b, 0x05, 0x70, 0x68, 0x6f, \n\t0x6e, 0x65, 0x09, 0x6d, 0x65, 0x67, 0x61, 0x70, 0x68, 0x6f, 0x6e, 0x65, \n\t0x06, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x08, 0x64, 0x6f, 0x77, 0x6e, \n\t0x6c, 0x6f, 0x61, 0x64, 0x03, 0x62, 0x6f, 0x78, 0x09, 0x6e, 0x65, 0x77, \n\t0x73, 0x70, 0x61, 0x70, 0x65, 0x72, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, \n\t0x65, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x06, 0x63, 0x61, 0x6d, \n\t0x65, 0x72, 0x61, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, \n\t0x05, 0x64, 0x72, 0x69, 0x76, 0x65, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, \n\t0x74, 0x0b, 0x74, 0x68, 0x65, 0x72, 0x6d, 0x6f, 0x6d, 0x65, 0x74, 0x65, \n\t0x72, 0x07, 0x73, 0x68, 0x75, 0x66, 0x66, 0x6c, 0x65, 0x04, 0x6c, 0x6f, \n\t0x6f, 0x70, 0x05, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x0a, 0x6c, 0x69, 0x67, \n\t0x68, 0x74, 0x2d, 0x64, 0x6f, 0x77, 0x6e, 0x08, 0x6c, 0x69, 0x67, 0x68, \n\t0x74, 0x2d, 0x75, 0x70, 0x04, 0x6d, 0x75, 0x74, 0x65, 0x05, 0x73, 0x6f, \n\t0x75, 0x6e, 0x64, 0x07, 0x62, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x06, \n\t0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x03, 0x6b, 0x65, 0x79, 0x04, 0x6c, \n\t0x6f, 0x63, 0x6b, 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x2d, 0x6f, 0x70, 0x65, \n\t0x6e, 0x04, 0x62, 0x65, 0x6c, 0x6c, 0x08, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, \n\t0x61, 0x72, 0x6b, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x04, 0x62, 0x61, 0x63, \n\t0x6b, 0x0a, 0x66, 0x6c, 0x61, 0x73, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, \n\t0x0a, 0x61, 0x72, 0x65, 0x61, 0x2d, 0x67, 0x72, 0x61, 0x70, 0x68, 0x0b, \n\t0x70, 0x61, 0x70, 0x65, 0x72, 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x02, \n\t0x63, 0x63, 0x05, 0x63, 0x63, 0x2d, 0x62, 0x79, 0x05, 0x63, 0x63, 0x2d, \n\t0x6e, 0x63, 0x08, 0x63, 0x63, 0x2d, 0x6e, 0x63, 0x2d, 0x65, 0x75, 0x08, \n\t0x63, 0x63, 0x2d, 0x6e, 0x63, 0x2d, 0x6a, 0x70, 0x05, 0x63, 0x63, 0x2d, \n\t0x73, 0x61, 0x05, 0x63, 0x63, 0x2d, 0x6e, 0x64, 0x05, 0x63, 0x63, 0x2d, \n\t0x70, 0x64, 0x07, 0x63, 0x63, 0x2d, 0x7a, 0x65, 0x72, 0x6f, 0x08, 0x63, \n\t0x63, 0x2d, 0x73, 0x68, 0x61, 0x72, 0x65, 0x08, 0x63, 0x63, 0x2d, 0x72, \n\t0x65, 0x6d, 0x69, 0x78, 0x05, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x0c, 0x66, \n\t0x6c, 0x6f, 0x77, 0x2d, 0x63, 0x61, 0x73, 0x63, 0x61, 0x64, 0x65, 0x0b, \n\t0x66, 0x6c, 0x6f, 0x77, 0x2d, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x09, \n\t0x66, 0x6c, 0x6f, 0x77, 0x2d, 0x74, 0x72, 0x65, 0x65, 0x09, 0x66, 0x6c, \n\t0x6f, 0x77, 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x0d, 0x66, 0x6c, 0x6f, 0x77, \n\t0x2d, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x07, 0x64, 0x62, \n\t0x2d, 0x6c, 0x6f, 0x67, 0x6f, 0x08, 0x64, 0x62, 0x2d, 0x73, 0x68, 0x61, \n\t0x70, 0x65, 0x06, 0x72, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x05, 0x62, 0x6c, \n\t0x6f, 0x63, 0x6b, 0x08, 0x73, 0x75, 0x69, 0x74, 0x63, 0x61, 0x73, 0x65, \n\t0x05, 0x67, 0x61, 0x75, 0x67, 0x65, 0x0c, 0x74, 0x72, 0x61, 0x66, 0x66, \n\t0x69, 0x63, 0x2d, 0x63, 0x6f, 0x6e, 0x65, 0x00, 0x00, 0x00, 0x00, 0x01, \n\t0xff, 0xff, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, \n\t0x00, 0x16, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0xf1, \n\t0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xdb, 0x94, 0xd7, \n\t0x00, 0x00, 0x00, 0x00, 0xcc, 0xa7, 0xdd, 0x44, 0x00, 0x00, 0x00, 0x00, \n\t0xcc, 0xad, 0x77, 0xf2, \n\t0x00\n};\n\nuint32_t igl_entypo_ttf_size = 35392;\n\nuint8_t igl_roboto_bold_ttf[] = {\n\t0x00, 0x01, 0x00, 0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x04, 0x00, 0x10, \n\t0x47, 0x50, 0x4f, 0x53, 0xe8, 0x84, 0xd5, 0x97, 0x00, 0x01, 0xbe, 0x28, \n\t0x00, 0x00, 0x4f, 0x16, 0x47, 0x53, 0x55, 0x42, 0x38, 0x1a, 0x1f, 0x82, \n\t0x00, 0x02, 0x0d, 0x40, 0x00, 0x00, 0x05, 0x4a, 0x4c, 0x54, 0x53, 0x48, \n\t0x46, 0x47, 0x22, 0xd7, 0x00, 0x00, 0x12, 0x20, 0x00, 0x00, 0x04, 0x0f, \n\t0x4f, 0x53, 0x2f, 0x32, 0xba, 0xf3, 0x01, 0x64, 0x00, 0x00, 0x01, 0x98, \n\t0x00, 0x00, 0x00, 0x60, 0x63, 0x6d, 0x61, 0x70, 0x24, 0x28, 0x33, 0xbe, \n\t0x00, 0x00, 0x16, 0x30, 0x00, 0x00, 0x05, 0xbc, 0x63, 0x76, 0x74, 0x20, \n\t0x1e, 0x90, 0x03, 0xb5, 0x00, 0x00, 0x1f, 0x88, 0x00, 0x00, 0x00, 0x3c, \n\t0x66, 0x70, 0x67, 0x6d, 0x47, 0xec, 0x54, 0xab, 0x00, 0x00, 0x1b, 0xec, \n\t0x00, 0x00, 0x01, 0xbc, 0x67, 0x61, 0x73, 0x70, 0x00, 0x08, 0x00, 0x13, \n\t0x00, 0x01, 0xbe, 0x1c, 0x00, 0x00, 0x00, 0x0c, 0x67, 0x6c, 0x79, 0x66, \n\t0x35, 0xf5, 0xa0, 0xa9, 0x00, 0x00, 0x27, 0xdc, 0x00, 0x01, 0x6e, 0x28, \n\t0x68, 0x65, 0x61, 0x64, 0xf7, 0xb0, 0x28, 0x9f, 0x00, 0x00, 0x01, 0x1c, \n\t0x00, 0x00, 0x00, 0x36, 0x68, 0x68, 0x65, 0x61, 0x0d, 0x18, 0x0a, 0x45, \n\t0x00, 0x00, 0x01, 0x54, 0x00, 0x00, 0x00, 0x24, 0x68, 0x6d, 0x74, 0x78, \n\t0x96, 0xc0, 0x0e, 0x2e, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x28, \n\t0x6c, 0x6f, 0x63, 0x61, 0x05, 0x47, 0x60, 0xe4, 0x00, 0x00, 0x1f, 0xc4, \n\t0x00, 0x00, 0x08, 0x18, 0x6d, 0x61, 0x78, 0x70, 0x06, 0x38, 0x03, 0xfa, \n\t0x00, 0x00, 0x01, 0x78, 0x00, 0x00, 0x00, 0x20, 0x6e, 0x61, 0x6d, 0x65, \n\t0x47, 0x45, 0x05, 0xd0, 0x00, 0x01, 0x96, 0x04, 0x00, 0x00, 0x04, 0x5f, \n\t0x70, 0x6f, 0x73, 0x74, 0xae, 0xf2, 0x34, 0x91, 0x00, 0x01, 0x9a, 0x64, \n\t0x00, 0x00, 0x23, 0xb6, 0x70, 0x72, 0x65, 0x70, 0x20, 0x4a, 0xa6, 0x04, \n\t0x00, 0x00, 0x1d, 0xa8, 0x00, 0x00, 0x01, 0xdd, 0x00, 0x01, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x00, 0xe8, 0xc8, 0xcb, 0x98, 0x5f, 0x0f, 0x3c, 0xf5, \n\t0x00, 0x19, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xf0, 0x11, 0x2e, \n\t0x00, 0x00, 0x00, 0x00, 0xce, 0x14, 0xcc, 0x22, 0xfb, 0xf5, 0xfd, 0xd5, \n\t0x09, 0x88, 0x08, 0x7c, 0x00, 0x01, 0x00, 0x09, 0x00, 0x02, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x08, 0x62, 0xfd, 0xd5, \n\t0x00, 0x00, 0x09, 0x4f, 0xfb, 0xf5, 0xff, 0x17, 0x08, 0xbe, 0x00, 0x01, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x04, 0x09, 0x00, 0x01, 0x00, 0x00, 0x04, 0x0b, 0x00, 0x97, \n\t0x00, 0x16, 0x00, 0x5f, 0x00, 0x05, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x0e, 0x00, 0x00, 0x02, 0x00, 0x03, 0x02, 0x00, 0x03, 0x00, 0x01, \n\t0x00, 0x03, 0x04, 0xa5, 0x02, 0xbc, 0x00, 0x05, 0x00, 0x00, 0x05, 0x9a, \n\t0x05, 0x33, 0x00, 0x00, 0x01, 0x1f, 0x05, 0x9a, 0x05, 0x33, 0x00, 0x00, \n\t0x03, 0xd1, 0x00, 0x66, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x02, 0xef, 0x50, 0x00, \n\t0x20, 0x5b, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x47, 0x6f, \n\t0x6f, 0x67, 0x00, 0x20, 0x00, 0x0d, 0xff, 0xfd, 0x08, 0x62, 0xfd, 0xd5, \n\t0x00, 0x00, 0x08, 0x62, 0x02, 0x2b, 0x20, 0x00, 0x01, 0x9f, 0x4f, 0x01, \n\t0x00, 0x00, 0x04, 0x3a, 0x05, 0xb0, 0x00, 0x20, 0x00, 0x20, 0x00, 0x02, \n\t0x01, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x00, 0x00, \n\t0x01, 0xfe, 0x00, 0x00, 0x02, 0x2d, 0x00, 0x86, 0x02, 0x90, 0x00, 0x32, \n\t0x04, 0xc3, 0x00, 0x30, 0x04, 0x97, 0x00, 0x5c, 0x05, 0xe9, 0x00, 0x5f, \n\t0x05, 0x42, 0x00, 0x3d, 0x01, 0x4a, 0x00, 0x32, 0x02, 0xc7, 0x00, 0x7c, \n\t0x02, 0xc9, 0x00, 0x1f, 0x03, 0x8c, 0x00, 0x1b, 0x04, 0x5d, 0x00, 0x38, \n\t0x02, 0x10, 0x00, 0x3f, 0x03, 0x21, 0x00, 0x71, 0x02, 0x54, 0x00, 0x90, \n\t0x03, 0x39, 0xff, 0xf2, 0x04, 0x97, 0x00, 0x5f, 0x04, 0x97, 0x00, 0xab, \n\t0x04, 0x97, 0x00, 0x47, 0x04, 0x97, 0x00, 0x41, 0x04, 0x97, 0x00, 0x39, \n\t0x04, 0x97, 0x00, 0x69, 0x04, 0x97, 0x00, 0x63, 0x04, 0x97, 0x00, 0x3c, \n\t0x04, 0x97, 0x00, 0x5b, 0x04, 0x97, 0x00, 0x52, 0x02, 0x46, 0x00, 0x90, \n\t0x02, 0x32, 0x00, 0x72, 0x04, 0x13, 0x00, 0x36, 0x04, 0x9d, 0x00, 0x88, \n\t0x04, 0x22, 0x00, 0x77, 0x03, 0xfd, 0x00, 0x1d, 0x07, 0x19, 0x00, 0x31, \n\t0x05, 0x1f, 0x00, 0x0c, 0x05, 0x22, 0x00, 0x88, 0x05, 0x1d, 0x00, 0x5d, \n\t0x05, 0x3e, 0x00, 0x88, 0x04, 0x98, 0x00, 0x88, 0x04, 0x9e, 0x00, 0x88, \n\t0x05, 0x59, 0x00, 0x63, 0x05, 0xaa, 0x00, 0x88, 0x02, 0x59, 0x00, 0x9a, \n\t0x04, 0x91, 0x00, 0x3a, 0x05, 0x2b, 0x00, 0x88, 0x04, 0x54, 0x00, 0x88, \n\t0x06, 0xfb, 0x00, 0x88, 0x05, 0xaa, 0x00, 0x88, 0x05, 0x77, 0x00, 0x5c, \n\t0x05, 0x36, 0x00, 0x88, 0x05, 0x99, 0x00, 0x5c, 0x05, 0x4a, 0x00, 0x88, \n\t0x05, 0x13, 0x00, 0x55, 0x04, 0x91, 0x00, 0x1c, 0x05, 0x7f, 0x00, 0x78, \n\t0x05, 0x17, 0x00, 0x07, 0x07, 0x17, 0x00, 0x18, 0x05, 0x17, 0x00, 0x1f, \n\t0x05, 0x0c, 0x00, 0x05, 0x04, 0xb6, 0x00, 0x4d, 0x02, 0x3a, 0x00, 0x77, \n\t0x03, 0x5f, 0x00, 0x02, 0x02, 0x3a, 0x00, 0x0d, 0x03, 0x80, 0x00, 0x2c, \n\t0x03, 0x92, 0x00, 0x01, 0x02, 0xa6, 0x00, 0x4d, 0x04, 0x4c, 0x00, 0x37, \n\t0x04, 0x84, 0x00, 0x70, 0x04, 0x24, 0x00, 0x3e, 0x04, 0x84, 0x00, 0x43, \n\t0x04, 0x3c, 0x00, 0x4d, 0x02, 0xdc, 0x00, 0x1b, 0x04, 0x84, 0x00, 0x43, \n\t0x04, 0x84, 0x00, 0x69, 0x02, 0x23, 0x00, 0x7f, 0x02, 0x1f, 0xff, 0x9e, \n\t0x04, 0x49, 0x00, 0x70, 0x02, 0x23, 0x00, 0x7f, 0x06, 0xec, 0x00, 0x70, \n\t0x04, 0x84, 0x00, 0x6b, 0x04, 0x84, 0x00, 0x43, 0x04, 0x84, 0x00, 0x70, \n\t0x04, 0x84, 0x00, 0x43, 0x02, 0xcd, 0x00, 0x70, 0x04, 0x20, 0x00, 0x3a, \n\t0x02, 0xcb, 0x00, 0x09, 0x04, 0x84, 0x00, 0x69, 0x04, 0x16, 0x00, 0x10, \n\t0x05, 0xe3, 0x00, 0x1d, 0x04, 0x16, 0x00, 0x13, 0x04, 0x16, 0x00, 0x05, \n\t0x04, 0x16, 0x00, 0x4b, 0x02, 0xa4, 0x00, 0x30, 0x02, 0x07, 0x00, 0xad, \n\t0x02, 0xa4, 0x00, 0x22, 0x05, 0x2f, 0x00, 0x69, 0x01, 0xfe, 0x00, 0x00, \n\t0x02, 0x44, 0x00, 0x8e, 0x04, 0x9d, 0x00, 0x48, 0x04, 0xc0, 0x00, 0x5c, \n\t0x05, 0x89, 0x00, 0x50, 0x04, 0xe5, 0x00, 0x16, 0x02, 0x05, 0x00, 0x7f, \n\t0x05, 0x07, 0x00, 0x5e, 0x04, 0x42, 0x00, 0x9c, 0x06, 0x46, 0x00, 0x56, \n\t0x03, 0x8d, 0x00, 0x70, 0x04, 0x01, 0x00, 0x62, 0x04, 0x69, 0x00, 0x7e, \n\t0x03, 0x21, 0x00, 0x71, 0x06, 0x46, 0x00, 0x56, 0x04, 0x04, 0x00, 0x94, \n\t0x03, 0x1c, 0x00, 0x7e, 0x04, 0x4d, 0x00, 0x5a, 0x03, 0x5c, 0x00, 0x66, \n\t0x03, 0x58, 0x00, 0x59, 0x02, 0xd7, 0x00, 0x6c, 0x04, 0xf0, 0x00, 0x8b, \n\t0x04, 0x36, 0x00, 0x3d, 0x02, 0x6b, 0x00, 0x9f, 0x02, 0x25, 0x00, 0x61, \n\t0x02, 0x3d, 0x00, 0x4e, 0x03, 0xa9, 0x00, 0x76, 0x04, 0x01, 0x00, 0x66, \n\t0x05, 0xd5, 0x00, 0xa7, 0x06, 0x11, 0x00, 0xa7, 0x06, 0xb5, 0x00, 0x69, \n\t0x04, 0x0d, 0x00, 0x4b, 0x05, 0x1f, 0x00, 0x0c, 0x05, 0x1f, 0x00, 0x0c, \n\t0x05, 0x1f, 0x00, 0x0c, 0x05, 0x1f, 0x00, 0x0c, 0x05, 0x1f, 0x00, 0x0c, \n\t0x05, 0x1f, 0x00, 0x0c, 0x07, 0x85, 0x00, 0x03, 0x05, 0x1d, 0x00, 0x5d, \n\t0x04, 0x98, 0x00, 0x88, 0x04, 0x98, 0x00, 0x88, 0x04, 0x98, 0x00, 0x88, \n\t0x04, 0x98, 0x00, 0x88, 0x02, 0x59, 0xff, 0xc6, 0x02, 0x59, 0x00, 0x98, \n\t0x02, 0x59, 0xff, 0xc0, 0x02, 0x59, 0xff, 0xaf, 0x05, 0x5c, 0x00, 0x1f, \n\t0x05, 0xaa, 0x00, 0x88, 0x05, 0x77, 0x00, 0x5c, 0x05, 0x77, 0x00, 0x5c, \n\t0x05, 0x77, 0x00, 0x5c, 0x05, 0x77, 0x00, 0x5c, 0x05, 0x77, 0x00, 0x5c, \n\t0x04, 0x40, 0x00, 0x40, 0x05, 0x82, 0x00, 0x5c, 0x05, 0x7f, 0x00, 0x78, \n\t0x05, 0x7f, 0x00, 0x78, 0x05, 0x7f, 0x00, 0x78, 0x05, 0x7f, 0x00, 0x78, \n\t0x05, 0x0c, 0x00, 0x05, 0x04, 0xdf, 0x00, 0x84, 0x05, 0x0e, 0x00, 0x87, \n\t0x04, 0x4c, 0x00, 0x37, 0x04, 0x4c, 0x00, 0x37, 0x04, 0x4c, 0x00, 0x37, \n\t0x04, 0x4c, 0x00, 0x37, 0x04, 0x4c, 0x00, 0x37, 0x04, 0x4c, 0x00, 0x37, \n\t0x06, 0xc1, 0x00, 0x2e, 0x04, 0x24, 0x00, 0x3e, 0x04, 0x3c, 0x00, 0x4d, \n\t0x04, 0x3c, 0x00, 0x4d, 0x04, 0x3c, 0x00, 0x4d, 0x04, 0x3c, 0x00, 0x4d, \n\t0x02, 0x32, 0xff, 0xb2, 0x02, 0x32, 0x00, 0x84, 0x02, 0x32, 0xff, 0xac, \n\t0x02, 0x32, 0xff, 0x9b, 0x04, 0xc2, 0x00, 0x30, 0x04, 0x84, 0x00, 0x6b, \n\t0x04, 0x84, 0x00, 0x43, 0x04, 0x84, 0x00, 0x43, 0x04, 0x84, 0x00, 0x43, \n\t0x04, 0x84, 0x00, 0x43, 0x04, 0x84, 0x00, 0x43, 0x04, 0x90, 0x00, 0x3f, \n\t0x04, 0x84, 0x00, 0x43, 0x04, 0x84, 0x00, 0x69, 0x04, 0x84, 0x00, 0x69, \n\t0x04, 0x84, 0x00, 0x69, 0x04, 0x84, 0x00, 0x69, 0x04, 0x16, 0x00, 0x05, \n\t0x04, 0x8a, 0x00, 0x79, 0x04, 0x16, 0x00, 0x05, 0x05, 0x1f, 0x00, 0x0c, \n\t0x04, 0x4c, 0x00, 0x37, 0x05, 0x1f, 0x00, 0x0c, 0x04, 0x4c, 0x00, 0x37, \n\t0x05, 0x1f, 0x00, 0x0c, 0x04, 0x4c, 0x00, 0x37, 0x05, 0x1d, 0x00, 0x5d, \n\t0x04, 0x24, 0x00, 0x3e, 0x05, 0x1d, 0x00, 0x5d, 0x04, 0x24, 0x00, 0x3e, \n\t0x05, 0x1d, 0x00, 0x5d, 0x04, 0x24, 0x00, 0x3e, 0x05, 0x1d, 0x00, 0x5d, \n\t0x04, 0x24, 0x00, 0x3e, 0x05, 0x3e, 0x00, 0x88, 0x05, 0x1a, 0x00, 0x43, \n\t0x05, 0x5c, 0x00, 0x1f, 0x04, 0xa2, 0x00, 0x43, 0x04, 0x98, 0x00, 0x88, \n\t0x04, 0x3c, 0x00, 0x4d, 0x04, 0x98, 0x00, 0x88, 0x04, 0x3c, 0x00, 0x4d, \n\t0x04, 0x98, 0x00, 0x88, 0x04, 0x3c, 0x00, 0x4d, 0x04, 0x98, 0x00, 0x88, \n\t0x04, 0x3c, 0x00, 0x4d, 0x04, 0x98, 0x00, 0x88, 0x04, 0x3c, 0x00, 0x4d, \n\t0x05, 0x59, 0x00, 0x63, 0x04, 0x84, 0x00, 0x43, 0x05, 0x59, 0x00, 0x63, \n\t0x04, 0x84, 0x00, 0x43, 0x05, 0x59, 0x00, 0x63, 0x04, 0x84, 0x00, 0x43, \n\t0x05, 0x59, 0x00, 0x63, 0x04, 0x84, 0x00, 0x43, 0x05, 0xaa, 0x00, 0x88, \n\t0x04, 0x84, 0x00, 0x69, 0x05, 0xa5, 0x00, 0x10, 0x04, 0xa2, 0xff, 0xfa, \n\t0x02, 0x59, 0xff, 0xb7, 0x02, 0x32, 0xff, 0xa3, 0x02, 0x59, 0xff, 0xc2, \n\t0x02, 0x32, 0xff, 0xae, 0x02, 0x59, 0xff, 0xd4, 0x02, 0x32, 0xff, 0xc0, \n\t0x02, 0x59, 0x00, 0x29, 0x02, 0x23, 0x00, 0x0e, 0x02, 0x59, 0x00, 0x92, \n\t0x02, 0x32, 0x00, 0x85, 0x06, 0xea, 0x00, 0x9a, 0x04, 0x42, 0x00, 0x7f, \n\t0x04, 0x91, 0x00, 0x3a, 0x02, 0x42, 0xff, 0xa6, 0x05, 0x2b, 0x00, 0x88, \n\t0x04, 0x49, 0x00, 0x70, 0x04, 0xba, 0x00, 0x81, 0x04, 0x54, 0x00, 0x88, \n\t0x02, 0x23, 0x00, 0x7d, 0x04, 0x54, 0x00, 0x88, 0x02, 0x23, 0x00, 0x6e, \n\t0x04, 0x54, 0x00, 0x88, 0x02, 0xb9, 0x00, 0x7f, 0x04, 0x54, 0x00, 0x88, \n\t0x02, 0xff, 0x00, 0x7f, 0x04, 0x10, 0x00, 0x0c, 0x02, 0x52, 0x00, 0x0f, \n\t0x05, 0xaa, 0x00, 0x88, 0x04, 0x84, 0x00, 0x6b, 0x05, 0xaa, 0x00, 0x88, \n\t0x04, 0x84, 0x00, 0x6b, 0x05, 0xaa, 0x00, 0x88, 0x04, 0x84, 0x00, 0x6b, \n\t0x04, 0x84, 0xff, 0xe6, 0x05, 0x9e, 0x00, 0x83, 0x04, 0x84, 0x00, 0x6b, \n\t0x05, 0x77, 0x00, 0x5c, 0x04, 0x84, 0x00, 0x43, 0x05, 0x77, 0x00, 0x5c, \n\t0x04, 0x84, 0x00, 0x43, 0x05, 0x77, 0x00, 0x5c, 0x04, 0x84, 0x00, 0x43, \n\t0x07, 0xc0, 0x00, 0x61, 0x07, 0x38, 0x00, 0x43, 0x05, 0x4a, 0x00, 0x88, \n\t0x02, 0xcd, 0x00, 0x70, 0x05, 0x4a, 0x00, 0x88, 0x02, 0xcd, 0x00, 0x6c, \n\t0x05, 0x4a, 0x00, 0x88, 0x02, 0xcd, 0x00, 0x21, 0x05, 0x13, 0x00, 0x55, \n\t0x04, 0x20, 0x00, 0x3a, 0x05, 0x13, 0x00, 0x55, 0x04, 0x20, 0x00, 0x3a, \n\t0x05, 0x13, 0x00, 0x55, 0x04, 0x20, 0x00, 0x3a, 0x05, 0x13, 0x00, 0x55, \n\t0x04, 0x20, 0x00, 0x3a, 0x04, 0x91, 0x00, 0x1c, 0x02, 0xcb, 0x00, 0x09, \n\t0x04, 0x91, 0x00, 0x1c, 0x02, 0xf3, 0x00, 0x09, 0x04, 0x91, 0x00, 0x1c, \n\t0x02, 0xcb, 0xff, 0xf3, 0x05, 0x7f, 0x00, 0x78, 0x04, 0x84, 0x00, 0x69, \n\t0x05, 0x7f, 0x00, 0x78, 0x04, 0x84, 0x00, 0x69, 0x05, 0x7f, 0x00, 0x78, \n\t0x04, 0x84, 0x00, 0x69, 0x05, 0x7f, 0x00, 0x78, 0x04, 0x84, 0x00, 0x69, \n\t0x05, 0x7f, 0x00, 0x78, 0x04, 0x84, 0x00, 0x69, 0x05, 0x7f, 0x00, 0x78, \n\t0x04, 0x84, 0x00, 0x69, 0x07, 0x17, 0x00, 0x18, 0x05, 0xe3, 0x00, 0x1d, \n\t0x05, 0x0c, 0x00, 0x05, 0x04, 0x16, 0x00, 0x05, 0x05, 0x0c, 0x00, 0x05, \n\t0x04, 0xb6, 0x00, 0x4d, 0x04, 0x16, 0x00, 0x4b, 0x04, 0xb6, 0x00, 0x4d, \n\t0x04, 0x16, 0x00, 0x4b, 0x04, 0xb6, 0x00, 0x4d, 0x04, 0x16, 0x00, 0x4b, \n\t0x02, 0x14, 0x00, 0x74, 0x02, 0xe4, 0xff, 0xce, 0x05, 0x9b, 0x00, 0x57, \n\t0x04, 0xa7, 0x00, 0x43, 0x05, 0xb4, 0x00, 0x78, 0x04, 0x8e, 0x00, 0x69, \n\t0x02, 0x42, 0xff, 0x97, 0x05, 0x1f, 0x00, 0x0c, 0x04, 0x4c, 0x00, 0x37, \n\t0x07, 0x85, 0x00, 0x03, 0x06, 0xc1, 0x00, 0x2e, 0x05, 0x82, 0x00, 0x5c, \n\t0x04, 0x84, 0x00, 0x43, 0x05, 0x13, 0x00, 0x55, 0x04, 0x20, 0x00, 0x3a, \n\t0x02, 0x42, 0xff, 0xac, 0x01, 0x95, 0x00, 0x39, 0x03, 0xf8, 0x00, 0x89, \n\t0x03, 0xc5, 0x00, 0x63, 0x03, 0x8e, 0x00, 0x6a, 0x02, 0x75, 0x00, 0x92, \n\t0x02, 0xaa, 0x00, 0x81, 0x02, 0x6a, 0x00, 0x53, 0x03, 0xda, 0x00, 0x77, \n\t0x03, 0x6c, 0x00, 0x8d, 0x02, 0x98, 0x00, 0x9e, 0x00, 0x00, 0xfc, 0xe9, \n\t0x00, 0x00, 0xfc, 0xf7, 0x00, 0x00, 0xfc, 0x7d, 0x00, 0x00, 0xfd, 0x1d, \n\t0x00, 0x00, 0xfb, 0xf5, 0x00, 0x00, 0xfd, 0x06, 0x02, 0xb7, 0x00, 0xee, \n\t0x04, 0x65, 0x00, 0x99, 0x05, 0x1f, 0x00, 0x0c, 0x02, 0x6b, 0x00, 0x9f, \n\t0x04, 0xfc, 0xff, 0x76, 0x06, 0x0e, 0xff, 0x9f, 0x02, 0xbd, 0xff, 0xa8, \n\t0x05, 0x8b, 0xff, 0xf1, 0x05, 0x70, 0xff, 0x3e, 0x05, 0x74, 0xff, 0xe6, \n\t0x02, 0xa9, 0xff, 0x8f, 0x05, 0x1f, 0x00, 0x0c, 0x05, 0x22, 0x00, 0x88, \n\t0x04, 0x75, 0x00, 0x88, 0x05, 0xd6, 0x00, 0x16, 0x04, 0x98, 0x00, 0x88, \n\t0x04, 0xb6, 0x00, 0x4d, 0x05, 0xaa, 0x00, 0x88, 0x05, 0x82, 0x00, 0x5c, \n\t0x02, 0x59, 0x00, 0x9a, 0x05, 0x2b, 0x00, 0x88, 0x05, 0x30, 0x00, 0x13, \n\t0x06, 0xfb, 0x00, 0x88, 0x05, 0xaa, 0x00, 0x88, 0x04, 0x8b, 0x00, 0x62, \n\t0x05, 0x77, 0x00, 0x5c, 0x05, 0xaa, 0x00, 0x88, 0x05, 0x36, 0x00, 0x88, \n\t0x04, 0x8b, 0x00, 0x48, 0x04, 0x91, 0x00, 0x1c, 0x05, 0x0c, 0x00, 0x05, \n\t0x05, 0xe3, 0x00, 0x3b, 0x05, 0x17, 0x00, 0x1f, 0x05, 0xcb, 0x00, 0x38, \n\t0x05, 0x60, 0x00, 0x68, 0x02, 0x59, 0xff, 0xaf, 0x05, 0x0c, 0x00, 0x05, \n\t0x04, 0x82, 0x00, 0x49, 0x04, 0x74, 0x00, 0x5f, 0x04, 0x84, 0x00, 0x6b, \n\t0x02, 0xa9, 0x00, 0x89, 0x04, 0x84, 0x00, 0x71, 0x04, 0x82, 0x00, 0x49, \n\t0x04, 0xd1, 0x00, 0x8e, 0x04, 0x16, 0x00, 0x10, 0x04, 0x84, 0x00, 0x43, \n\t0x04, 0x74, 0x00, 0x5f, 0x04, 0x0a, 0x00, 0x4b, 0x04, 0x84, 0x00, 0x6b, \n\t0x04, 0xb9, 0x00, 0x65, 0x02, 0xa9, 0x00, 0x89, 0x04, 0xba, 0x00, 0x81, \n\t0x04, 0x4e, 0x00, 0x0c, 0x04, 0xf0, 0x00, 0x8b, 0x04, 0x16, 0x00, 0x10, \n\t0x04, 0x49, 0x00, 0x67, 0x04, 0x84, 0x00, 0x43, 0x05, 0x31, 0x00, 0x4e, \n\t0x04, 0x84, 0x00, 0x70, 0x04, 0x1c, 0x00, 0x3e, 0x04, 0x94, 0x00, 0x41, \n\t0x04, 0x34, 0x00, 0x33, 0x04, 0x84, 0x00, 0x71, 0x05, 0xf9, 0x00, 0x35, \n\t0x04, 0x49, 0x00, 0x17, 0x05, 0xf6, 0x00, 0x44, 0x06, 0xe0, 0x00, 0x50, \n\t0x02, 0xa9, 0xff, 0xac, 0x04, 0x84, 0x00, 0x71, 0x04, 0x84, 0x00, 0x43, \n\t0x04, 0x84, 0x00, 0x71, 0x06, 0xe0, 0x00, 0x50, 0x05, 0x74, 0x00, 0x7a, \n\t0x04, 0xb2, 0xff, 0xf3, 0x06, 0xa0, 0x00, 0x13, 0x04, 0x98, 0x00, 0x88, \n\t0x04, 0x98, 0x00, 0x88, 0x04, 0x75, 0x00, 0x88, 0x05, 0x0a, 0x00, 0x6e, \n\t0x05, 0x13, 0x00, 0x55, 0x02, 0x59, 0x00, 0x9a, 0x02, 0x59, 0xff, 0xaf, \n\t0x04, 0x91, 0x00, 0x3a, 0x08, 0x79, 0x00, 0x2a, 0x08, 0x7b, 0x00, 0x88, \n\t0x05, 0x2b, 0x00, 0x88, 0x05, 0x9c, 0x00, 0x7e, 0x05, 0x0d, 0x00, 0x24, \n\t0x05, 0x9d, 0x00, 0x7b, 0x05, 0x1f, 0x00, 0x0c, 0x05, 0x03, 0x00, 0x77, \n\t0x05, 0x22, 0x00, 0x88, 0x04, 0x75, 0x00, 0x88, 0x04, 0x98, 0x00, 0x88, \n\t0x05, 0x41, 0x00, 0x57, 0x05, 0x9c, 0x00, 0x7e, 0x05, 0x9c, 0x00, 0x7e, \n\t0x05, 0x2b, 0x00, 0x88, 0x05, 0xa7, 0x00, 0x2a, 0x06, 0xfb, 0x00, 0x88, \n\t0x05, 0xaa, 0x00, 0x88, 0x05, 0x77, 0x00, 0x5c, 0x05, 0xaa, 0x00, 0x88, \n\t0x05, 0x36, 0x00, 0x88, 0x05, 0x1d, 0x00, 0x5d, 0x04, 0x91, 0x00, 0x1c, \n\t0x05, 0x17, 0x00, 0x1f, 0x06, 0x21, 0x00, 0x96, 0x05, 0x8f, 0x00, 0x8b, \n\t0x06, 0xf9, 0x00, 0x95, 0x05, 0x08, 0x00, 0x56, 0x07, 0x8f, 0x00, 0x9a, \n\t0x04, 0x4c, 0x00, 0x37, 0x04, 0x84, 0x00, 0x7f, 0x03, 0x57, 0x00, 0x6b, \n\t0x04, 0x3c, 0x00, 0x4d, 0x04, 0x84, 0x00, 0x6b, 0x04, 0x84, 0x00, 0x6b, \n\t0x04, 0x7c, 0x00, 0x81, 0x04, 0x7d, 0x00, 0x0f, 0x06, 0x15, 0x00, 0x81, \n\t0x04, 0x84, 0x00, 0x6b, 0x04, 0x84, 0x00, 0x43, 0x04, 0x84, 0x00, 0x6b, \n\t0x04, 0x84, 0x00, 0x70, 0x04, 0x24, 0x00, 0x3e, 0x04, 0x2e, 0x00, 0x30, \n\t0x04, 0x16, 0x00, 0x05, 0x04, 0x16, 0x00, 0x13, 0x04, 0xdf, 0x00, 0x6b, \n\t0x04, 0x7b, 0x00, 0x67, 0x06, 0x9b, 0x00, 0x6b, 0x07, 0x3f, 0x00, 0x6b, \n\t0x06, 0xa7, 0x00, 0x95, 0x04, 0x77, 0x00, 0x81, 0x04, 0x28, 0x00, 0x3f, \n\t0x06, 0x7e, 0x00, 0x85, 0x04, 0x84, 0x00, 0x33, 0x04, 0x3c, 0x00, 0x4d, \n\t0x04, 0x3c, 0x00, 0x4d, 0x04, 0x84, 0xff, 0xf1, 0x03, 0x57, 0x00, 0x6b, \n\t0x04, 0x28, 0x00, 0x48, 0x04, 0x20, 0x00, 0x3a, 0x02, 0x23, 0x00, 0x7f, \n\t0x02, 0x32, 0xff, 0x9b, 0x02, 0x1f, 0xff, 0x9e, 0x06, 0xeb, 0x00, 0x19, \n\t0x06, 0xe8, 0x00, 0x6b, 0x04, 0x84, 0x00, 0x1d, 0x04, 0x7c, 0x00, 0x81, \n\t0x04, 0x84, 0x00, 0x6b, 0x04, 0x16, 0x00, 0x05, 0x04, 0x84, 0x00, 0x6b, \n\t0x05, 0x03, 0xff, 0xe6, 0x05, 0x42, 0x00, 0x12, 0x04, 0x7a, 0x00, 0x07, \n\t0x07, 0x7f, 0x00, 0xad, 0x06, 0x66, 0x00, 0xa6, 0x06, 0xf8, 0x00, 0x71, \n\t0x05, 0xdd, 0x00, 0x6e, 0x09, 0x4f, 0x00, 0x9a, 0x08, 0x0e, 0x00, 0x85, \n\t0x04, 0x1c, 0x00, 0x05, 0x04, 0x09, 0x00, 0x1c, 0x05, 0xcb, 0x00, 0x38, \n\t0x05, 0xf6, 0x00, 0x44, 0x04, 0x16, 0x00, 0x10, 0x04, 0x16, 0xff, 0xd1, \n\t0x09, 0x8d, 0x00, 0x5c, 0x08, 0x9a, 0x00, 0x43, 0x05, 0x82, 0x00, 0x5c, \n\t0x04, 0x84, 0x00, 0x43, 0x04, 0xfd, 0x00, 0x5c, 0x04, 0x47, 0x00, 0x56, \n\t0x04, 0xfb, 0x00, 0x6b, 0x03, 0x90, 0x00, 0x5c, 0x03, 0xb8, 0x00, 0x66, \n\t0x01, 0xdc, 0x00, 0x7d, 0x01, 0xeb, 0x00, 0x6b, 0x08, 0x14, 0x00, 0x37, \n\t0x07, 0xd0, 0x00, 0x49, 0x05, 0x9c, 0x00, 0x7e, 0x04, 0x84, 0x00, 0x6b, \n\t0x05, 0x03, 0xff, 0xe6, 0x04, 0x72, 0x00, 0x77, 0x03, 0xb2, 0x00, 0x6b, \n\t0x04, 0x75, 0xff, 0xf4, 0x03, 0x57, 0xff, 0xd2, 0x05, 0x2b, 0x00, 0x88, \n\t0x04, 0x7c, 0x00, 0x81, 0x05, 0x47, 0x00, 0x84, 0x04, 0xa0, 0x00, 0x81, \n\t0x05, 0x3f, 0xff, 0xc2, 0x04, 0x5d, 0xff, 0xcd, 0x05, 0xaa, 0x00, 0x88, \n\t0x04, 0x84, 0x00, 0x6b, 0x07, 0xe3, 0x00, 0x88, 0x05, 0xa6, 0x00, 0x6b, \n\t0x04, 0x91, 0x00, 0x1c, 0x04, 0x2e, 0x00, 0x30, 0x05, 0x0c, 0x00, 0x05, \n\t0x04, 0x16, 0x00, 0x10, 0x05, 0x0c, 0x00, 0x05, 0x04, 0x16, 0x00, 0x10, \n\t0x05, 0x17, 0x00, 0x1f, 0x04, 0x16, 0x00, 0x13, 0x07, 0x31, 0x00, 0x2b, \n\t0x05, 0x8c, 0x00, 0x2e, 0x05, 0x8f, 0x00, 0x8b, 0x04, 0x7b, 0x00, 0x67, \n\t0x05, 0x72, 0x00, 0x8b, 0x04, 0x7c, 0x00, 0x67, 0x05, 0x99, 0x00, 0x4e, \n\t0x04, 0x7c, 0x00, 0x5f, 0x06, 0x90, 0xff, 0xee, 0x04, 0xc9, 0xff, 0xbc, \n\t0x02, 0x59, 0x00, 0x9a, 0x05, 0xa7, 0x00, 0x2a, 0x04, 0x7d, 0x00, 0x0f, \n\t0x05, 0xaa, 0x00, 0x88, 0x04, 0x84, 0x00, 0x6b, 0x05, 0xaa, 0x00, 0x88, \n\t0x04, 0x84, 0x00, 0x6b, 0x05, 0x8f, 0x00, 0x8b, 0x04, 0x7b, 0x00, 0x67, \n\t0x06, 0xfb, 0x00, 0x88, 0x06, 0x15, 0x00, 0x81, 0x02, 0x59, 0x00, 0x9a, \n\t0x05, 0x1f, 0x00, 0x0c, 0x04, 0x4c, 0x00, 0x37, 0x05, 0x1f, 0x00, 0x0c, \n\t0x04, 0x4c, 0x00, 0x37, 0x07, 0x85, 0x00, 0x03, 0x06, 0xc1, 0x00, 0x2e, \n\t0x04, 0x98, 0x00, 0x88, 0x04, 0x3c, 0x00, 0x4d, 0x05, 0xe2, 0x00, 0x56, \n\t0x04, 0x39, 0x00, 0x5f, 0x05, 0xe2, 0x00, 0x56, 0x04, 0x39, 0x00, 0x5f, \n\t0x07, 0xf0, 0x00, 0x12, 0x06, 0xda, 0x00, 0x19, 0x05, 0x41, 0x00, 0x57, \n\t0x04, 0x1d, 0x00, 0x46, 0x04, 0xa2, 0x00, 0x54, 0x04, 0xa2, 0x00, 0x54, \n\t0x05, 0x9c, 0x00, 0x7e, 0x04, 0x84, 0x00, 0x6b, 0x05, 0x9c, 0x00, 0x7e, \n\t0x04, 0x84, 0x00, 0x6b, 0x05, 0x77, 0x00, 0x5c, 0x04, 0x84, 0x00, 0x43, \n\t0x05, 0x08, 0x00, 0x56, 0x04, 0x28, 0x00, 0x3f, 0x04, 0x16, 0x00, 0x05, \n\t0x04, 0x16, 0x00, 0x05, 0x04, 0x16, 0x00, 0x05, 0x05, 0x8f, 0x00, 0x8b, \n\t0x04, 0x7b, 0x00, 0x67, 0x04, 0x75, 0x00, 0x88, 0x03, 0x57, 0x00, 0x6b, \n\t0x06, 0xf9, 0x00, 0x95, 0x06, 0xa7, 0x00, 0x95, 0x04, 0xcf, 0x00, 0x4b, \n\t0x03, 0x60, 0x00, 0x4c, 0x05, 0x17, 0x00, 0x1f, 0x04, 0x16, 0x00, 0x13, \n\t0x05, 0x17, 0x00, 0x1f, 0x04, 0x16, 0x00, 0x13, 0x05, 0x03, 0x00, 0x4c, \n\t0x04, 0x84, 0x00, 0x43, 0x07, 0x38, 0x00, 0x72, 0x06, 0xd4, 0x00, 0x5a, \n\t0x06, 0x4f, 0x00, 0x41, 0x05, 0x24, 0x00, 0x2d, 0x04, 0xb3, 0x00, 0x42, \n\t0x04, 0x7d, 0x00, 0x6e, 0x07, 0xba, 0x00, 0x41, 0x06, 0xc9, 0x00, 0x3c, \n\t0x07, 0xf6, 0x00, 0x85, 0x06, 0x9a, 0x00, 0x5c, 0x05, 0x10, 0x00, 0x4b, \n\t0x04, 0x3d, 0x00, 0x46, 0x05, 0xa6, 0x00, 0x20, 0x05, 0x19, 0x00, 0x42, \n\t0x05, 0x41, 0x00, 0x6f, 0x04, 0x74, 0x00, 0x5f, 0x05, 0xa7, 0x00, 0x2a, \n\t0x04, 0x7d, 0x00, 0x0f, 0x05, 0x1f, 0x00, 0x0c, 0x04, 0x4c, 0x00, 0x37, \n\t0x06, 0xfb, 0x00, 0x88, 0x06, 0xec, 0x00, 0x70, 0x07, 0x17, 0x00, 0x18, \n\t0x05, 0xe3, 0x00, 0x1d, 0x07, 0x17, 0x00, 0x18, 0x05, 0xe3, 0x00, 0x1d, \n\t0x07, 0x17, 0x00, 0x18, 0x05, 0xe3, 0x00, 0x1d, 0x05, 0x1f, 0x00, 0x0c, \n\t0x04, 0x4c, 0x00, 0x37, 0x05, 0x1f, 0x00, 0x0c, 0x04, 0x4c, 0x00, 0x37, \n\t0x05, 0x1f, 0x00, 0x0c, 0x04, 0x4c, 0x00, 0x37, 0x05, 0x1f, 0xff, 0xa8, \n\t0x04, 0x4c, 0xff, 0x38, 0x05, 0x1f, 0x00, 0x0c, 0x04, 0x4c, 0x00, 0x37, \n\t0x05, 0x1f, 0x00, 0x0c, 0x04, 0x4c, 0x00, 0x37, 0x05, 0x1f, 0x00, 0x0c, \n\t0x04, 0x4c, 0x00, 0x37, 0x05, 0x1f, 0x00, 0x0c, 0x04, 0x4c, 0x00, 0x37, \n\t0x05, 0x1f, 0x00, 0x0c, 0x04, 0x4c, 0x00, 0x37, 0x05, 0x1f, 0x00, 0x0c, \n\t0x04, 0x4c, 0x00, 0x37, 0x05, 0x1f, 0x00, 0x0c, 0x04, 0x4c, 0x00, 0x37, \n\t0x05, 0x1f, 0x00, 0x0c, 0x04, 0x4c, 0x00, 0x37, 0x04, 0x98, 0x00, 0x88, \n\t0x04, 0x3c, 0x00, 0x4d, 0x04, 0x98, 0x00, 0x88, 0x04, 0x3c, 0x00, 0x4d, \n\t0x04, 0x98, 0x00, 0x88, 0x04, 0x3c, 0x00, 0x4d, 0x04, 0x98, 0x00, 0x88, \n\t0x04, 0x3c, 0x00, 0x4d, 0x04, 0x98, 0xff, 0x74, 0x04, 0x3c, 0xff, 0x3a, \n\t0x04, 0x98, 0x00, 0x88, 0x04, 0x3c, 0x00, 0x4d, 0x04, 0x98, 0x00, 0x88, \n\t0x04, 0x3c, 0x00, 0x4d, 0x04, 0x98, 0x00, 0x88, 0x04, 0x3c, 0x00, 0x4d, \n\t0x02, 0x59, 0x00, 0x9a, 0x02, 0x32, 0x00, 0x85, 0x02, 0x59, 0x00, 0x89, \n\t0x02, 0x23, 0x00, 0x6e, 0x05, 0x77, 0x00, 0x5c, 0x04, 0x84, 0x00, 0x43, \n\t0x05, 0x77, 0x00, 0x5c, 0x04, 0x84, 0x00, 0x43, 0x05, 0x77, 0x00, 0x5c, \n\t0x04, 0x84, 0x00, 0x43, 0x05, 0x77, 0xff, 0xd3, 0x04, 0x84, 0xff, 0x59, \n\t0x05, 0x77, 0x00, 0x5c, 0x04, 0x84, 0x00, 0x43, 0x05, 0x77, 0x00, 0x5c, \n\t0x04, 0x84, 0x00, 0x43, 0x05, 0x77, 0x00, 0x5c, 0x04, 0x84, 0x00, 0x43, \n\t0x05, 0x9b, 0x00, 0x57, 0x04, 0xa7, 0x00, 0x43, 0x05, 0x9b, 0x00, 0x57, \n\t0x04, 0xa7, 0x00, 0x43, 0x05, 0x9b, 0x00, 0x57, 0x04, 0xa7, 0x00, 0x43, \n\t0x05, 0x9b, 0x00, 0x57, 0x04, 0xa7, 0x00, 0x43, 0x05, 0x9b, 0x00, 0x57, \n\t0x04, 0xa7, 0x00, 0x43, 0x05, 0x7f, 0x00, 0x78, 0x04, 0x84, 0x00, 0x69, \n\t0x05, 0x7f, 0x00, 0x78, 0x04, 0x84, 0x00, 0x69, 0x05, 0xb4, 0x00, 0x78, \n\t0x04, 0x8e, 0x00, 0x69, 0x05, 0xb4, 0x00, 0x78, 0x04, 0x8e, 0x00, 0x69, \n\t0x05, 0xb4, 0x00, 0x78, 0x04, 0x8e, 0x00, 0x69, 0x05, 0xb4, 0x00, 0x78, \n\t0x04, 0x8e, 0x00, 0x69, 0x05, 0xb4, 0x00, 0x78, 0x04, 0x8e, 0x00, 0x69, \n\t0x05, 0x0c, 0x00, 0x05, 0x04, 0x16, 0x00, 0x05, 0x05, 0x0c, 0x00, 0x05, \n\t0x04, 0x16, 0x00, 0x05, 0x05, 0x0c, 0x00, 0x05, 0x04, 0x16, 0x00, 0x05, \n\t0x05, 0x0c, 0x00, 0x05, 0x04, 0x16, 0x00, 0x05, 0x05, 0x77, 0xff, 0x41, \n\t0x04, 0x14, 0x00, 0x00, 0x08, 0x29, 0x00, 0x00, 0x04, 0x14, 0x00, 0x00, \n\t0x08, 0x29, 0x00, 0x00, 0x02, 0xb9, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, \n\t0x01, 0x5c, 0x00, 0x00, 0x04, 0x7f, 0x00, 0x00, 0x02, 0x30, 0x00, 0x00, \n\t0x01, 0xa2, 0x00, 0x00, 0x00, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x05, 0x85, 0x00, 0x97, 0x06, 0x86, 0x00, 0x99, 0x06, 0x86, 0x00, 0x99, \n\t0x03, 0x91, 0x00, 0x02, 0x01, 0x95, 0x00, 0x32, 0x01, 0x95, 0x00, 0x39, \n\t0x01, 0x96, 0x00, 0x32, 0x01, 0xad, 0x00, 0x11, 0x02, 0xe6, 0x00, 0x32, \n\t0x02, 0xee, 0x00, 0x39, 0x02, 0xdc, 0x00, 0x32, 0x04, 0x4e, 0x00, 0x39, \n\t0x04, 0xa2, 0x00, 0x62, 0x02, 0xe1, 0x00, 0x87, 0x04, 0x2e, 0x00, 0x90, \n\t0x05, 0xef, 0x00, 0x90, 0x07, 0xae, 0x00, 0x59, 0x01, 0x4a, 0x00, 0x32, \n\t0x02, 0x90, 0x00, 0x32, 0x02, 0x7f, 0x00, 0x6c, 0x02, 0x6b, 0x00, 0x50, \n\t0x04, 0x5a, 0x00, 0x86, 0x03, 0x91, 0x00, 0x1d, 0x03, 0xa5, 0x00, 0x36, \n\t0x03, 0x58, 0x00, 0x56, 0x04, 0x9e, 0x00, 0x12, 0x04, 0xc0, 0x00, 0x58, \n\t0x06, 0xe4, 0x00, 0x8d, 0x04, 0xa2, 0x00, 0x43, 0x04, 0x5c, 0x00, 0x47, \n\t0x05, 0xe0, 0x00, 0x64, 0x03, 0xf4, 0x00, 0x1a, 0x08, 0xc3, 0x00, 0x7f, \n\t0x05, 0x0e, 0x00, 0x60, 0x05, 0x10, 0x00, 0x94, 0x06, 0xd4, 0x00, 0x5a, \n\t0x07, 0x6c, 0x00, 0x5d, 0x07, 0x9c, 0x00, 0x5f, 0x07, 0x00, 0x00, 0x4e, \n\t0x04, 0xd7, 0x00, 0x3f, 0x05, 0x8b, 0x00, 0xa4, 0x05, 0x06, 0x00, 0x39, \n\t0x04, 0x71, 0x00, 0x92, 0x04, 0x83, 0x00, 0x37, 0x08, 0x60, 0x00, 0x60, \n\t0x02, 0x38, 0xff, 0xa5, 0x04, 0x9d, 0x00, 0x65, 0x04, 0x6c, 0x00, 0x88, \n\t0x04, 0x55, 0x00, 0x8d, 0x04, 0x57, 0x00, 0x89, 0x04, 0x30, 0x00, 0x1f, \n\t0x01, 0xd4, 0x00, 0x3d, 0x04, 0xe1, 0x00, 0x14, 0x04, 0xff, 0x00, 0x1b, \n\t0x07, 0xbd, 0x00, 0x1b, 0x07, 0xdb, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, \n\t0x08, 0x2c, 0x00, 0x57, 0x08, 0x35, 0x00, 0x5c, 0x02, 0x27, 0xff, 0xa9, \n\t0x03, 0x46, 0x00, 0x72, 0x03, 0x82, 0x00, 0x5f, 0x03, 0x5e, 0x00, 0x57, \n\t0x04, 0x4c, 0x00, 0x61, 0x04, 0x61, 0x00, 0x2a, 0x04, 0x2d, 0x00, 0x42, \n\t0x04, 0x1b, 0x00, 0x4d, 0x02, 0x99, 0x00, 0x3e, 0x04, 0x95, 0x00, 0x61, \n\t0x04, 0x5c, 0x00, 0x44, 0x04, 0x46, 0x00, 0x07, 0x04, 0x8e, 0x00, 0x1f, \n\t0x06, 0x1d, 0x00, 0x28, 0x04, 0xa6, 0x00, 0x0f, 0x04, 0xfc, 0x00, 0x71, \n\t0x04, 0x34, 0x00, 0x30, 0x04, 0x6f, 0x00, 0x43, 0x04, 0xa2, 0x00, 0x81, \n\t0x04, 0xd5, 0x00, 0x5f, 0x04, 0xbf, 0x00, 0x6e, 0x04, 0xc9, 0x00, 0x5b, \n\t0x05, 0x26, 0x00, 0x81, 0x03, 0xd3, 0x00, 0x9c, 0x06, 0x15, 0x00, 0x81, \n\t0x03, 0xbc, 0x00, 0x81, 0x04, 0x8f, 0x00, 0x81, 0x04, 0x1f, 0x00, 0x1c, \n\t0x02, 0x27, 0x00, 0x81, 0x05, 0x2a, 0x00, 0x81, 0x04, 0xe3, 0x00, 0x5f, \n\t0x04, 0x35, 0x00, 0x81, 0x04, 0x46, 0x00, 0x81, 0x04, 0xb4, 0x00, 0x81, \n\t0x04, 0x96, 0x00, 0x5f, 0x04, 0xa2, 0x00, 0x81, 0x02, 0x01, 0x00, 0x7d, \n\t0x03, 0x9d, 0x00, 0x6a, 0x04, 0xd7, 0x00, 0x0f, 0x04, 0x07, 0x00, 0x5a, \n\t0x04, 0x07, 0xff, 0x10, 0x04, 0x07, 0x00, 0x56, 0x04, 0x07, 0x00, 0x57, \n\t0x03, 0x9d, 0x00, 0x6a, 0x03, 0x9d, 0x00, 0x6b, 0x03, 0x9d, 0x00, 0x6a, \n\t0x01, 0xdb, 0x00, 0x5a, 0x02, 0x6a, 0x00, 0x21, 0x02, 0x1b, 0xff, 0x9e, \n\t0x03, 0x44, 0xff, 0x9c, 0x03, 0x2f, 0x00, 0x2d, 0x04, 0x97, 0x00, 0x4e, \n\t0x04, 0xa2, 0x00, 0x46, 0x04, 0x9f, 0x00, 0x3d, 0x04, 0x9f, 0x00, 0x6e, \n\t0x04, 0x9f, 0x00, 0x6e, 0x03, 0xf0, 0x00, 0x0f, 0x04, 0xbe, 0x00, 0x5b, \n\t0x04, 0x9f, 0x00, 0x56, 0x04, 0xa2, 0x00, 0x81, 0x04, 0x48, 0x00, 0x42, \n\t0x03, 0x6e, 0x00, 0x67, 0x03, 0x6e, 0x00, 0x61, 0x03, 0x80, 0x00, 0x40, \n\t0x03, 0x5e, 0x00, 0x59, 0x03, 0x4d, 0x00, 0x66, 0x02, 0xaa, 0x00, 0x90, \n\t0x02, 0x38, 0x00, 0x4e, 0x03, 0x97, 0x00, 0x67, 0x04, 0x2c, 0x00, 0x36, \n\t0x04, 0x58, 0x00, 0x4c, 0x03, 0x9d, 0x00, 0x30, 0x02, 0xeb, 0x00, 0x42, \n\t0x03, 0x8e, 0x00, 0x6a, 0x04, 0xb4, 0xff, 0xdf, 0x04, 0xb4, 0xff, 0xdf, \n\t0x04, 0x34, 0x00, 0x30, 0x04, 0xd7, 0x00, 0x0f, 0x04, 0xd7, 0x00, 0x0f, \n\t0x04, 0xd7, 0x00, 0x0f, 0x04, 0xd7, 0x00, 0x0f, 0x04, 0xd7, 0x00, 0x0f, \n\t0x04, 0xd7, 0x00, 0x0f, 0x04, 0xd7, 0x00, 0x0f, 0x04, 0x96, 0x00, 0x5f, \n\t0x04, 0x46, 0x00, 0x81, 0x04, 0x46, 0x00, 0x81, 0x04, 0x46, 0x00, 0x81, \n\t0x04, 0x46, 0x00, 0x81, 0x02, 0x27, 0xff, 0xad, 0x02, 0x27, 0x00, 0x7f, \n\t0x02, 0x27, 0xff, 0xa7, 0x02, 0x27, 0xff, 0x96, 0x05, 0x26, 0x00, 0x81, \n\t0x04, 0xc9, 0x00, 0x5b, 0x04, 0xc9, 0x00, 0x5b, 0x04, 0xc9, 0x00, 0x5b, \n\t0x04, 0xc9, 0x00, 0x5b, 0x04, 0xc9, 0x00, 0x5b, 0x04, 0xfc, 0x00, 0x71, \n\t0x04, 0xfc, 0x00, 0x71, 0x04, 0xfc, 0x00, 0x71, 0x04, 0xfc, 0x00, 0x71, \n\t0x04, 0x46, 0x00, 0x07, 0x04, 0xd7, 0x00, 0x0f, 0x04, 0xd7, 0x00, 0x0f, \n\t0x04, 0xd7, 0x00, 0x0f, 0x04, 0x96, 0x00, 0x5f, 0x04, 0x96, 0x00, 0x5f, \n\t0x04, 0x96, 0x00, 0x5f, 0x04, 0x96, 0x00, 0x5f, 0x04, 0xb4, 0x00, 0x81, \n\t0x04, 0x46, 0x00, 0x81, 0x04, 0x46, 0x00, 0x81, 0x04, 0x46, 0x00, 0x81, \n\t0x04, 0x46, 0x00, 0x81, 0x04, 0x46, 0x00, 0x81, 0x04, 0xe3, 0x00, 0x5f, \n\t0x04, 0xe3, 0x00, 0x5f, 0x04, 0xe3, 0x00, 0x5f, 0x04, 0xe3, 0x00, 0x5f, \n\t0x05, 0x2a, 0x00, 0x81, 0x02, 0x27, 0xff, 0x9e, 0x04, 0xfc, 0x00, 0x71, \n\t0x02, 0x27, 0xff, 0xbb, 0x02, 0x27, 0x00, 0x3d, 0x02, 0x27, 0x00, 0x7a, \n\t0x04, 0x1f, 0x00, 0x1c, 0x04, 0x8f, 0x00, 0x81, 0x03, 0xbc, 0x00, 0x50, \n\t0x03, 0xbc, 0x00, 0x81, 0x03, 0xbc, 0x00, 0x81, 0x03, 0xbc, 0x00, 0x81, \n\t0x05, 0x26, 0x00, 0x81, 0x05, 0x26, 0x00, 0x81, 0x05, 0x26, 0x00, 0x81, \n\t0x04, 0xc9, 0x00, 0x5b, 0x04, 0xc9, 0x00, 0x5b, 0x04, 0xc9, 0x00, 0x5b, \n\t0x04, 0xa2, 0x00, 0x81, 0x04, 0xa2, 0x00, 0x81, 0x04, 0xa2, 0x00, 0x81, \n\t0x04, 0x6f, 0x00, 0x43, 0x04, 0x6f, 0x00, 0x43, 0x04, 0x6f, 0x00, 0x43, \n\t0x04, 0x6f, 0x00, 0x43, 0x04, 0x34, 0x00, 0x30, 0x04, 0x34, 0x00, 0x30, \n\t0x04, 0xfc, 0x00, 0x71, 0x04, 0xfc, 0x00, 0x71, 0x04, 0xfc, 0x00, 0x71, \n\t0x04, 0xfc, 0x00, 0x71, 0x08, 0xde, 0x00, 0x43, 0x04, 0x5c, 0x00, 0x44, \n\t0x04, 0x5c, 0x00, 0x44, 0x04, 0x5c, 0x00, 0x44, 0x04, 0x46, 0x00, 0x07, \n\t0x04, 0x46, 0x00, 0x07, 0x06, 0x1d, 0x00, 0x28, 0x04, 0xfc, 0x00, 0x71, \n\t0x05, 0xfc, 0x00, 0x1e, 0x06, 0x33, 0x00, 0x25, 0x05, 0xfd, 0x00, 0x1b, \n\t0x07, 0xf0, 0x00, 0x12, 0x05, 0x0d, 0x00, 0x24, 0x06, 0x8b, 0x00, 0x49, \n\t0x07, 0xa9, 0x00, 0x85, 0x08, 0x2e, 0x00, 0x85, 0x06, 0x2b, 0x00, 0x1a, \n\t0x05, 0x03, 0x00, 0x84, 0x04, 0xcd, 0xff, 0xef, 0x04, 0x8f, 0x00, 0x54, \n\t0x05, 0x0f, 0x00, 0x21, 0x06, 0xda, 0x00, 0x19, 0x04, 0x1d, 0x00, 0x46, \n\t0x05, 0xd9, 0x00, 0x44, 0x05, 0x42, 0x00, 0x22, 0x07, 0x8a, 0x00, 0x7b, \n\t0x06, 0x94, 0x00, 0x63, 0x04, 0x77, 0xff, 0xe6, 0x07, 0x24, 0x00, 0x81, \n\t0x06, 0x0a, 0x00, 0x74, 0x05, 0x82, 0x00, 0x61, 0x04, 0x84, 0x00, 0x41, \n\t0x05, 0x23, 0x00, 0x0d, 0x05, 0x23, 0x00, 0x0d, 0x07, 0x88, 0x00, 0x7b, \n\t0x06, 0x79, 0x00, 0x6c, 0x07, 0x8b, 0x00, 0x7b, 0x06, 0x94, 0x00, 0x63, \n\t0x04, 0x77, 0xff, 0xe6, 0x05, 0x08, 0x00, 0x88, 0x04, 0x82, 0x00, 0x70, \n\t0x04, 0x7d, 0x00, 0x88, 0x04, 0x3d, 0x00, 0x6b, 0x07, 0xf0, 0x00, 0x12, \n\t0x06, 0xda, 0x00, 0x19, 0x04, 0xec, 0x00, 0x57, 0x04, 0x1d, 0x00, 0x46, \n\t0x06, 0x9c, 0x00, 0x25, 0x05, 0xba, 0x00, 0x3a, 0x08, 0x5d, 0x00, 0x88, \n\t0x06, 0xed, 0x00, 0x6b, 0x06, 0x65, 0x00, 0x61, 0x05, 0x2c, 0x00, 0x54, \n\t0x05, 0x1d, 0x00, 0x5d, 0x04, 0x24, 0x00, 0x3e, 0x06, 0x11, 0xff, 0xee, \n\t0x04, 0xc9, 0xff, 0xbc, 0x07, 0xf0, 0x00, 0x12, 0x06, 0xda, 0x00, 0x19, \n\t0x05, 0x30, 0x00, 0x84, 0x04, 0x92, 0x00, 0x81, 0x05, 0x82, 0x00, 0x61, \n\t0x04, 0x84, 0x00, 0x41, 0x05, 0x82, 0x00, 0x61, 0x04, 0x84, 0x00, 0x41, \n\t0x05, 0x0d, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x00, 0x04, 0x0b, \n\t0x07, 0x01, 0x07, 0x07, 0x01, 0x28, 0x16, 0x01, 0x01, 0x01, 0x01, 0x25, \n\t0x01, 0x01, 0x01, 0x01, 0x01, 0x0d, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, \n\t0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0e, 0x1f, 0x06, 0x01, \n\t0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0d, 0x2f, 0x01, 0x01, 0x0d, \n\t0x01, 0x0d, 0x1f, 0x22, 0x1a, 0x20, 0x01, 0x01, 0x09, 0x01, 0x17, 0x01, \n\t0x2b, 0x2e, 0x01, 0x01, 0x01, 0x01, 0x1d, 0x01, 0x01, 0x20, 0x1d, 0x20, \n\t0x01, 0x01, 0x20, 0x20, 0x01, 0x01, 0x2b, 0x01, 0x1b, 0x20, 0x20, 0x20, \n\t0x20, 0x01, 0x01, 0x01, 0x20, 0x2f, 0x01, 0x2f, 0x2f, 0x2f, 0x01, 0x01, \n\t0x01, 0x1c, 0x07, 0x1f, 0x0e, 0x01, 0x01, 0x01, 0x01, 0x01, 0x20, 0x01, \n\t0x01, 0x01, 0x28, 0x01, 0x01, 0x01, 0x1c, 0x01, 0x1a, 0x01, 0x01, 0x12, \n\t0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x19, 0x01, 0x01, 0x01, 0x01, 0x01, \n\t0x01, 0x01, 0x01, 0x01, 0x1a, 0x01, 0x01, 0x01, 0x01, 0x01, 0x2f, 0x2f, \n\t0x2f, 0x2f, 0x01, 0x0d, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x01, 0x01, 0x09, \n\t0x09, 0x09, 0x09, 0x2b, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, \n\t0x01, 0x1d, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x20, \n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x01, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, \n\t0x01, 0x2f, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x1d, 0x01, 0x1d, \n\t0x01, 0x1d, 0x01, 0x1d, 0x01, 0x1e, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, \n\t0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, \n\t0x01, 0x20, 0x0d, 0x20, 0x01, 0x01, 0x2f, 0x01, 0x2f, 0x01, 0x2f, 0x01, \n\t0x2f, 0x01, 0x2f, 0x01, 0x01, 0x20, 0x01, 0x01, 0x01, 0x2b, 0x22, 0x0d, \n\t0x01, 0x0d, 0x01, 0x0d, 0x01, 0x0d, 0x0d, 0x01, 0x01, 0x0d, 0x20, 0x0d, \n\t0x20, 0x0d, 0x20, 0x20, 0x01, 0x20, 0x1f, 0x20, 0x1f, 0x20, 0x1f, 0x20, \n\t0x01, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x01, 0x01, 0x01, 0x01, \n\t0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x09, 0x20, \n\t0x09, 0x20, 0x09, 0x20, 0x09, 0x20, 0x09, 0x20, 0x09, 0x20, 0x17, 0x01, \n\t0x2b, 0x2f, 0x2b, 0x2e, 0x2f, 0x2e, 0x2f, 0x2e, 0x2f, 0x1a, 0x01, 0x01, \n\t0x32, 0x01, 0x25, 0x01, 0x01, 0x01, 0x1a, 0x01, 0x01, 0x20, 0x01, 0x01, \n\t0x01, 0x31, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, \n\t0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0b, 0x01, 0x01, 0x05, 0x01, 0x01, \n\t0x01, 0x01, 0x22, 0x01, 0x01, 0x01, 0x24, 0x01, 0x01, 0x2e, 0x0d, 0x01, \n\t0x2f, 0x01, 0x01, 0x01, 0x0d, 0x17, 0x1f, 0x0d, 0x22, 0x17, 0x01, 0x2b, \n\t0x01, 0x01, 0x01, 0x01, 0x2f, 0x2b, 0x01, 0x2d, 0x20, 0x01, 0x20, 0x01, \n\t0x01, 0x2f, 0x20, 0x2d, 0x01, 0x20, 0x0c, 0x01, 0x22, 0x01, 0x12, 0x2f, \n\t0x2b, 0x20, 0x30, 0x20, 0x25, 0x01, 0x01, 0x20, 0x03, 0x2b, 0x01, 0x01, \n\t0x01, 0x20, 0x20, 0x20, 0x01, 0x22, 0x18, 0x01, 0x01, 0x01, 0x24, 0x01, \n\t0x01, 0x2f, 0x2f, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, \n\t0x01, 0x24, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0d, 0x1f, 0x0d, \n\t0x22, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x20, 0x01, 0x01, 0x20, 0x01, \n\t0x01, 0x20, 0x20, 0x22, 0x01, 0x31, 0x20, 0x20, 0x20, 0x20, 0x1d, 0x17, \n\t0x2f, 0x2f, 0x01, 0x01, 0x01, 0x11, 0x04, 0x01, 0x01, 0x09, 0x20, 0x01, \n\t0x01, 0x20, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0c, 0x20, 0x22, \n\t0x20, 0x2f, 0x20, 0x01, 0x01, 0x01, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, \n\t0x25, 0x01, 0x01, 0x01, 0x2f, 0x2f, 0x32, 0x01, 0x01, 0x20, 0x05, 0x01, \n\t0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x20, 0x01, 0x01, 0x01, \n\t0x24, 0x01, 0x01, 0x22, 0x01, 0x01, 0x11, 0x01, 0x0d, 0x20, 0x01, 0x01, \n\t0x01, 0x17, 0x2b, 0x2f, 0x2b, 0x2f, 0x01, 0x2f, 0x06, 0x20, 0x01, 0x01, \n\t0x01, 0x22, 0x1a, 0x22, 0x01, 0x01, 0x2f, 0x01, 0x01, 0x0d, 0x20, 0x0d, \n\t0x20, 0x01, 0x01, 0x01, 0x31, 0x2f, 0x01, 0x01, 0x01, 0x01, 0x1a, 0x01, \n\t0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, \n\t0x01, 0x20, 0x01, 0x20, 0x1f, 0x20, 0x20, 0x01, 0x2f, 0x2f, 0x2f, 0x01, \n\t0x01, 0x24, 0x01, 0x01, 0x04, 0x01, 0x01, 0x01, 0x2f, 0x01, 0x2f, 0x01, \n\t0x20, 0x01, 0x01, 0x01, 0x16, 0x29, 0x01, 0x2d, 0x01, 0x01, 0x01, 0x10, \n\t0x01, 0x01, 0x01, 0x01, 0x2d, 0x01, 0x01, 0x01, 0x01, 0x01, 0x1b, 0x17, \n\t0x01, 0x17, 0x01, 0x17, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, \n\t0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, \n\t0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, \n\t0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x2f, 0x01, 0x2f, \n\t0x01, 0x1f, 0x20, 0x1f, 0x20, 0x1f, 0x20, 0x1f, 0x20, 0x1f, 0x20, 0x1f, \n\t0x20, 0x1f, 0x20, 0x01, 0x32, 0x01, 0x32, 0x01, 0x32, 0x01, 0x32, 0x01, \n\t0x32, 0x09, 0x20, 0x09, 0x20, 0x01, 0x25, 0x01, 0x25, 0x01, 0x25, 0x01, \n\t0x25, 0x01, 0x25, 0x2b, 0x2f, 0x2b, 0x2f, 0x2b, 0x2f, 0x2b, 0x2f, 0x1f, \n\t0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x09, 0x01, 0x01, 0x01, 0x01, \n\t0x01, 0x14, 0x14, 0x26, 0x31, 0x31, 0x01, 0x20, 0x29, 0x10, 0x01, 0x01, \n\t0x01, 0x01, 0x17, 0x01, 0x01, 0x01, 0x28, 0x09, 0x01, 0x23, 0x26, 0x01, \n\t0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x10, 0x01, \n\t0x08, 0x01, 0x01, 0x14, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0a, 0x0e, 0x01, \n\t0x25, 0x30, 0x01, 0x01, 0x01, 0x0d, 0x2f, 0x1d, 0x01, 0x18, 0x01, 0x28, \n\t0x01, 0x01, 0x01, 0x01, 0x16, 0x01, 0x01, 0x15, 0x31, 0x01, 0x01, 0x25, \n\t0x01, 0x26, 0x05, 0x01, 0x2f, 0x01, 0x19, 0x11, 0x01, 0x01, 0x01, 0x31, \n\t0x01, 0x01, 0x01, 0x28, 0x19, 0x1c, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, \n\t0x01, 0x14, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x1d, 0x01, 0x01, \n\t0x01, 0x32, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x0f, \n\t0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0a, 0x01, 0x01, 0x01, 0x01, 0x26, \n\t0x01, 0x01, 0x01, 0x01, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x01, \n\t0x01, 0x01, 0x01, 0x01, 0x28, 0x28, 0x28, 0x28, 0x01, 0x01, 0x01, 0x01, \n\t0x01, 0x01, 0x05, 0x05, 0x05, 0x05, 0x01, 0x14, 0x14, 0x14, 0x01, 0x01, \n\t0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x1c, 0x1c, 0x1c, 0x1c, \n\t0x19, 0x28, 0x05, 0x28, 0x28, 0x28, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, \n\t0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x2f, 0x2f, 0x2f, \n\t0x2f, 0x01, 0x01, 0x05, 0x05, 0x05, 0x05, 0x18, 0x01, 0x01, 0x01, 0x01, \n\t0x01, 0x01, 0x05, 0x03, 0x15, 0x03, 0x01, 0x01, 0x01, 0x01, 0x17, 0x01, \n\t0x01, 0x01, 0x01, 0x23, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0f, \n\t0x01, 0x01, 0x20, 0x08, 0x08, 0x01, 0x01, 0x01, 0x01, 0x01, 0x20, 0x01, \n\t0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x2d, 0x22, 0x2a, 0x01, 0x01, \n\t0x01, 0x1d, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x20, 0x01, 0x20, \n\t0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, \n\t0x00, 0x00, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0xcc, \n\t0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x04, 0x03, 0xb0, \n\t0x00, 0x00, 0x00, 0xac, 0x00, 0x80, 0x00, 0x06, 0x00, 0x2c, 0x00, 0x0d, \n\t0x00, 0x7e, 0x01, 0x7f, 0x01, 0x92, 0x01, 0xa1, 0x01, 0xb0, 0x01, 0xf0, \n\t0x01, 0xff, 0x02, 0x19, 0x02, 0x37, 0x02, 0xbc, 0x02, 0xc7, 0x02, 0xc9, \n\t0x02, 0xdd, 0x02, 0xf3, 0x03, 0x01, 0x03, 0x03, 0x03, 0x09, 0x03, 0x0f, \n\t0x03, 0x23, 0x03, 0x8a, 0x03, 0x8c, 0x03, 0xa1, 0x03, 0xce, 0x03, 0xd2, \n\t0x03, 0xd6, 0x04, 0x16, 0x04, 0x22, 0x04, 0x37, 0x04, 0x43, 0x04, 0x4a, \n\t0x04, 0x5f, 0x04, 0x65, 0x04, 0x71, 0x04, 0x7f, 0x04, 0x86, 0x04, 0x8c, \n\t0x04, 0xab, 0x04, 0xbd, 0x04, 0xc4, 0x04, 0xe7, 0x04, 0xf2, 0x05, 0x13, \n\t0x1e, 0x01, 0x1e, 0x3f, 0x1e, 0x85, 0x1e, 0xf9, 0x1f, 0x4d, 0x20, 0x0b, \n\t0x20, 0x15, 0x20, 0x1e, 0x20, 0x22, 0x20, 0x26, 0x20, 0x30, 0x20, 0x33, \n\t0x20, 0x3a, 0x20, 0x3c, 0x20, 0x44, 0x20, 0x74, 0x20, 0x7f, 0x20, 0xa4, \n\t0x20, 0xa7, 0x20, 0xac, 0x21, 0x05, 0x21, 0x13, 0x21, 0x16, 0x21, 0x22, \n\t0x21, 0x26, 0x21, 0x2e, 0x21, 0x5e, 0x22, 0x02, 0x22, 0x06, 0x22, 0x0f, \n\t0x22, 0x12, 0x22, 0x1a, 0x22, 0x1e, 0x22, 0x2b, 0x22, 0x48, 0x22, 0x60, \n\t0x22, 0x65, 0x25, 0xca, 0xf6, 0xc3, 0xfb, 0x04, 0xfe, 0xff, 0xff, 0xfd, \n\t0xff, 0xff, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x20, 0x00, 0xa0, 0x01, 0x92, \n\t0x01, 0xa0, 0x01, 0xaf, 0x01, 0xf0, 0x01, 0xfa, 0x02, 0x18, 0x02, 0x37, \n\t0x02, 0xbc, 0x02, 0xc6, 0x02, 0xc9, 0x02, 0xd8, 0x02, 0xf3, 0x03, 0x00, \n\t0x03, 0x03, 0x03, 0x09, 0x03, 0x0f, 0x03, 0x23, 0x03, 0x84, 0x03, 0x8c, \n\t0x03, 0x8e, 0x03, 0xa3, 0x03, 0xd1, 0x03, 0xd6, 0x04, 0x00, 0x04, 0x17, \n\t0x04, 0x23, 0x04, 0x38, 0x04, 0x44, 0x04, 0x4b, 0x04, 0x60, 0x04, 0x66, \n\t0x04, 0x72, 0x04, 0x80, 0x04, 0x88, 0x04, 0x8d, 0x04, 0xac, 0x04, 0xbe, \n\t0x04, 0xc5, 0x04, 0xe8, 0x04, 0xf3, 0x1e, 0x00, 0x1e, 0x3e, 0x1e, 0x80, \n\t0x1e, 0xa0, 0x1f, 0x4d, 0x20, 0x00, 0x20, 0x13, 0x20, 0x17, 0x20, 0x20, \n\t0x20, 0x25, 0x20, 0x30, 0x20, 0x32, 0x20, 0x39, 0x20, 0x3c, 0x20, 0x44, \n\t0x20, 0x74, 0x20, 0x7f, 0x20, 0xa3, 0x20, 0xa7, 0x20, 0xab, 0x21, 0x05, \n\t0x21, 0x13, 0x21, 0x16, 0x21, 0x22, 0x21, 0x26, 0x21, 0x2e, 0x21, 0x5b, \n\t0x22, 0x02, 0x22, 0x06, 0x22, 0x0f, 0x22, 0x11, 0x22, 0x1a, 0x22, 0x1e, \n\t0x22, 0x2b, 0x22, 0x48, 0x22, 0x60, 0x22, 0x64, 0x25, 0xca, 0xf6, 0xc3, \n\t0xfb, 0x01, 0xfe, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xe3, \n\t0xff, 0xc2, 0xff, 0xb0, 0xff, 0xa3, 0xff, 0x96, 0xff, 0x57, 0xff, 0x4e, \n\t0xff, 0x36, 0xff, 0x19, 0xfe, 0x95, 0xfe, 0x8c, 0xfd, 0xa8, 0xfe, 0x7c, \n\t0xfe, 0x67, 0xfe, 0x5b, 0xfe, 0x5a, 0xfe, 0x55, 0xfe, 0x50, 0xfe, 0x3d, \n\t0xfd, 0xdd, 0xfd, 0xdc, 0xfd, 0xdb, 0xfd, 0xda, 0xfd, 0xd8, 0xfd, 0xd5, \n\t0x00, 0x00, 0xfd, 0xa8, 0x00, 0x00, 0xfd, 0x9d, 0x00, 0x00, 0xfd, 0x9b, \n\t0x00, 0x00, 0xfd, 0x96, 0x00, 0x00, 0xfd, 0x8e, 0xfd, 0x8d, 0x00, 0x00, \n\t0xfd, 0x7c, 0x00, 0x00, 0xfd, 0x76, 0x00, 0x00, 0xfd, 0x6f, 0xe4, 0x83, \n\t0xe4, 0x47, 0xe4, 0x07, 0xe3, 0xed, 0xe3, 0x9a, 0xe2, 0xe8, 0xe2, 0xe1, \n\t0xe2, 0xe0, 0xe2, 0xdf, 0xe2, 0xdd, 0xe2, 0xd4, 0xe2, 0xd3, 0xe2, 0xce, \n\t0xe2, 0xcd, 0xe2, 0xc6, 0xe2, 0x97, 0xe2, 0x8d, 0xe2, 0x6a, 0xe2, 0x68, \n\t0xe2, 0x65, 0xe2, 0x0d, 0xe2, 0x00, 0xe1, 0xfe, 0xe1, 0xf3, 0xe0, 0x5d, \n\t0xe1, 0xe8, 0xe1, 0xbc, 0xe1, 0x19, 0xdf, 0x69, 0xe1, 0x0d, 0xe1, 0x0c, \n\t0xe1, 0x05, 0xe1, 0x02, 0xe0, 0xf6, 0xe0, 0xda, 0xe0, 0xc3, 0xe0, 0xc0, \n\t0xdd, 0x5c, 0x0c, 0x64, 0x08, 0x27, 0x04, 0x2d, 0x03, 0x31, 0x00, 0x01, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0xa2, 0x00, 0x00, \n\t0x00, 0xc8, 0x00, 0x00, 0x00, 0xd2, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x01, 0x2a, 0x00, 0x00, 0x01, 0x34, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x01, 0xac, 0x01, 0xad, 0x03, 0xcf, 0x01, 0xae, \n\t0x01, 0xaf, 0x01, 0xb0, 0x01, 0xb1, 0x01, 0xb2, 0x01, 0xb3, 0x01, 0xb4, \n\t0x01, 0xb5, 0x03, 0xd0, 0x01, 0xb6, 0x01, 0xb7, 0x01, 0xb8, 0x01, 0xb9, \n\t0x01, 0xba, 0x01, 0xbb, 0x01, 0xbc, 0x01, 0xbd, 0x03, 0xd1, 0x01, 0xbe, \n\t0x03, 0xd2, 0x03, 0xd3, 0x03, 0xd4, 0x01, 0xcb, 0x01, 0xcc, 0x01, 0xcd, \n\t0x03, 0xd5, 0x03, 0xd6, 0x03, 0xd7, 0x01, 0xce, 0x03, 0xd8, 0x01, 0xcf, \n\t0x01, 0xd0, 0x03, 0xd9, 0x01, 0xd1, 0x03, 0xda, 0x01, 0xd2, 0x01, 0xd3, \n\t0x03, 0xdb, 0x01, 0xd4, 0x03, 0xdc, 0x03, 0xdd, 0x03, 0xde, 0x01, 0xe1, \n\t0x01, 0xe2, 0x01, 0xe3, 0x01, 0xe4, 0x01, 0xe5, 0x03, 0xdf, 0x03, 0xe0, \n\t0x03, 0xe1, 0x01, 0xfb, 0x03, 0xe2, 0x03, 0xe3, 0x03, 0xe4, 0x03, 0xe5, \n\t0x03, 0xe6, 0x03, 0xe7, 0x02, 0x08, 0x03, 0xe8, 0x02, 0x09, 0x02, 0x0a, \n\t0x02, 0x0b, 0x02, 0x0c, 0x02, 0x0d, 0x03, 0xe9, 0x03, 0xea, 0x03, 0xeb, \n\t0x03, 0xec, 0x03, 0xed, 0x03, 0xee, 0x03, 0xef, 0x02, 0x1a, 0x02, 0x1b, \n\t0x02, 0x1c, 0x02, 0x1d, 0x03, 0xf0, 0x03, 0xf1, 0x03, 0xf2, 0x03, 0xf3, \n\t0x03, 0xf4, 0x03, 0xf5, 0x02, 0x1e, 0x02, 0x1f, 0x02, 0x20, 0x02, 0x21, \n\t0x02, 0x22, 0x02, 0x23, 0x03, 0xf6, 0x03, 0xf7, 0x02, 0x24, 0x02, 0x25, \n\t0x02, 0x26, 0x02, 0x27, 0x03, 0xf8, 0x03, 0xf9, 0x03, 0xfa, 0x03, 0xfb, \n\t0x03, 0xfc, 0x03, 0xfd, 0x03, 0xfe, 0x03, 0xff, 0x02, 0x3a, 0x04, 0x00, \n\t0x04, 0x01, 0x04, 0x02, 0x04, 0x03, 0x04, 0x04, 0x04, 0x05, 0x04, 0x06, \n\t0x04, 0x07, 0x02, 0x5e, 0x02, 0x5f, 0x04, 0x08, 0x02, 0x60, 0x04, 0x09, \n\t0x02, 0x61, 0x04, 0x0a, 0x00, 0x06, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x0d, \n\t0x00, 0xf3, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, \n\t0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, \n\t0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x12, \n\t0x00, 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x18, \n\t0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, \n\t0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, \n\t0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, \n\t0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, \n\t0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, \n\t0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, \n\t0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, \n\t0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, \n\t0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, \n\t0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, \n\t0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, \n\t0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x5f, 0x00, 0x60, \n\t0x00, 0x61, 0x00, 0x00, 0x00, 0x86, 0x00, 0x87, 0x00, 0x89, 0x00, 0x8b, \n\t0x00, 0x93, 0x00, 0x98, 0x00, 0x9e, 0x00, 0xa3, 0x00, 0xa2, 0x00, 0xa4, \n\t0x00, 0xa6, 0x00, 0xa5, 0x00, 0xa7, 0x00, 0xa9, 0x00, 0xab, 0x00, 0xaa, \n\t0x00, 0xac, 0x00, 0xad, 0x00, 0xaf, 0x00, 0xae, 0x00, 0xb0, 0x00, 0xb1, \n\t0x00, 0xb3, 0x00, 0xb5, 0x00, 0xb4, 0x00, 0xb6, 0x00, 0xb8, 0x00, 0xb7, \n\t0x00, 0xbc, 0x00, 0xbb, 0x00, 0xbd, 0x00, 0xbe, 0x02, 0xff, 0x00, 0x72, \n\t0x00, 0x64, 0x00, 0x65, 0x00, 0x69, 0x03, 0x01, 0x00, 0x78, 0x00, 0xa1, \n\t0x00, 0x70, 0x00, 0x6b, 0x03, 0x15, 0x00, 0x76, 0x00, 0x6a, 0x03, 0x23, \n\t0x00, 0x88, 0x00, 0x9a, 0x03, 0x20, 0x00, 0x73, 0x03, 0x24, 0x03, 0x25, \n\t0x00, 0x67, 0x00, 0x77, 0x03, 0x1b, 0x03, 0x1d, 0x03, 0x1c, 0x01, 0x9a, \n\t0x03, 0x21, 0x00, 0x6c, 0x00, 0x7c, 0x01, 0x83, 0x00, 0xa8, 0x00, 0xba, \n\t0x00, 0x81, 0x00, 0x63, 0x00, 0x6e, 0x03, 0x1f, 0x01, 0x42, 0x03, 0x22, \n\t0x01, 0x6f, 0x00, 0x6d, 0x00, 0x7d, 0x03, 0x03, 0x00, 0x62, 0x00, 0x82, \n\t0x00, 0x85, 0x00, 0x97, 0x01, 0x14, 0x01, 0x15, 0x02, 0xf4, 0x02, 0xf5, \n\t0x02, 0xfc, 0x02, 0xfd, 0x02, 0xf8, 0x02, 0xf9, 0x00, 0xb9, 0x03, 0x26, \n\t0x00, 0xc1, 0x01, 0x3a, 0x03, 0x0a, 0x03, 0x11, 0x03, 0x07, 0x03, 0x08, \n\t0x03, 0x28, 0x03, 0x29, 0x03, 0x00, 0x00, 0x79, 0x02, 0xfa, 0x02, 0xfe, \n\t0x03, 0x04, 0x00, 0x84, 0x00, 0x8c, 0x00, 0x83, 0x00, 0x8d, 0x00, 0x8a, \n\t0x00, 0x8f, 0x00, 0x90, 0x00, 0x91, 0x00, 0x8e, 0x00, 0x95, 0x00, 0x96, \n\t0x00, 0x00, 0x00, 0x94, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9b, 0x00, 0xf3, \n\t0x01, 0x52, 0x01, 0x58, 0x00, 0x71, 0x01, 0x54, 0x01, 0x55, 0x01, 0x56, \n\t0x00, 0x7a, 0x01, 0x59, 0x01, 0x57, 0x01, 0x53, 0xb0, 0x00, 0x2c, 0x4b, \n\t0xb0, 0x09, 0x50, 0x58, 0xb1, 0x01, 0x01, 0x8e, 0x59, 0xb8, 0x01, 0xff, \n\t0x85, 0xb0, 0x84, 0x1d, 0xb1, 0x09, 0x03, 0x5f, 0x5e, 0x2d, 0xb0, 0x01, \n\t0x2c, 0x20, 0x20, 0x45, 0x69, 0x44, 0xb0, 0x01, 0x60, 0x2d, 0xb0, 0x02, \n\t0x2c, 0xb0, 0x01, 0x2a, 0x21, 0x2d, 0xb0, 0x03, 0x2c, 0x20, 0x46, 0xb0, \n\t0x03, 0x25, 0x46, 0x52, 0x58, 0x23, 0x59, 0x20, 0x8a, 0x20, 0x8a, 0x49, \n\t0x64, 0x8a, 0x20, 0x46, 0x20, 0x68, 0x61, 0x64, 0xb0, 0x04, 0x25, 0x46, \n\t0x20, 0x68, 0x61, 0x64, 0x52, 0x58, 0x23, 0x65, 0x8a, 0x59, 0x2f, 0x20, \n\t0xb0, 0x00, 0x53, 0x58, 0x69, 0x20, 0xb0, 0x00, 0x54, 0x58, 0x21, 0xb0, \n\t0x40, 0x59, 0x1b, 0x69, 0x20, 0xb0, 0x00, 0x54, 0x58, 0x21, 0xb0, 0x40, \n\t0x65, 0x59, 0x59, 0x3a, 0x2d, 0xb0, 0x04, 0x2c, 0x20, 0x46, 0xb0, 0x04, \n\t0x25, 0x46, 0x52, 0x58, 0x23, 0x8a, 0x59, 0x20, 0x46, 0x20, 0x6a, 0x61, \n\t0x64, 0xb0, 0x04, 0x25, 0x46, 0x20, 0x6a, 0x61, 0x64, 0x52, 0x58, 0x23, \n\t0x8a, 0x59, 0x2f, 0xfd, 0x2d, 0xb0, 0x05, 0x2c, 0x4b, 0x20, 0xb0, 0x03, \n\t0x26, 0x50, 0x58, 0x51, 0x58, 0xb0, 0x80, 0x44, 0x1b, 0xb0, 0x40, 0x44, \n\t0x59, 0x1b, 0x21, 0x21, 0x20, 0x45, 0xb0, 0xc0, 0x50, 0x58, 0xb0, 0xc0, \n\t0x44, 0x1b, 0x21, 0x59, 0x59, 0x2d, 0xb0, 0x06, 0x2c, 0x20, 0x20, 0x45, \n\t0x69, 0x44, 0xb0, 0x01, 0x60, 0x20, 0x20, 0x45, 0x7d, 0x69, 0x18, 0x44, \n\t0xb0, 0x01, 0x60, 0x2d, 0xb0, 0x07, 0x2c, 0xb0, 0x06, 0x2a, 0x2d, 0xb0, \n\t0x08, 0x2c, 0x4b, 0x20, 0xb0, 0x03, 0x26, 0x53, 0x58, 0xb0, 0x40, 0x1b, \n\t0xb0, 0x00, 0x59, 0x8a, 0x8a, 0x20, 0xb0, 0x03, 0x26, 0x53, 0x58, 0x23, \n\t0x21, 0xb0, 0x80, 0x8a, 0x8a, 0x1b, 0x8a, 0x23, 0x59, 0x20, 0xb0, 0x03, \n\t0x26, 0x53, 0x58, 0x23, 0x21, 0xb0, 0xc0, 0x8a, 0x8a, 0x1b, 0x8a, 0x23, \n\t0x59, 0x20, 0xb0, 0x03, 0x26, 0x53, 0x58, 0x23, 0x21, 0xb8, 0x01, 0x00, \n\t0x8a, 0x8a, 0x1b, 0x8a, 0x23, 0x59, 0x20, 0xb0, 0x03, 0x26, 0x53, 0x58, \n\t0x23, 0x21, 0xb8, 0x01, 0x40, 0x8a, 0x8a, 0x1b, 0x8a, 0x23, 0x59, 0x20, \n\t0xb0, 0x03, 0x26, 0x53, 0x58, 0xb0, 0x03, 0x25, 0x45, 0xb8, 0x01, 0x80, \n\t0x50, 0x58, 0x23, 0x21, 0xb8, 0x01, 0x80, 0x23, 0x21, 0x1b, 0xb0, 0x03, \n\t0x25, 0x45, 0x23, 0x21, 0x23, 0x21, 0x59, 0x1b, 0x21, 0x59, 0x44, 0x2d, \n\t0xb0, 0x09, 0x2c, 0x4b, 0x53, 0x58, 0x45, 0x44, 0x1b, 0x21, 0x21, 0x59, \n\t0x2d, 0xb0, 0x0a, 0x2c, 0xb0, 0x1c, 0x45, 0x2d, 0xb0, 0x0b, 0x2c, 0xb0, \n\t0x1d, 0x45, 0x2d, 0xb0, 0x0c, 0x2c, 0xb1, 0x27, 0x01, 0x88, 0x20, 0x8a, \n\t0x53, 0x58, 0xb9, 0x40, 0x00, 0x04, 0x00, 0x63, 0xb8, 0x08, 0x00, 0x88, \n\t0x54, 0x58, 0xb9, 0x00, 0x1c, 0x03, 0xe8, 0x70, 0x59, 0x1b, 0xb0, 0x23, \n\t0x53, 0x58, 0xb0, 0x20, 0x88, 0xb8, 0x10, 0x00, 0x54, 0x58, 0xb9, 0x00, \n\t0x1c, 0x03, 0xe8, 0x70, 0x59, 0x59, 0x59, 0x2d, 0xb0, 0x0d, 0x2c, 0xb0, \n\t0x40, 0x88, 0xb8, 0x20, 0x00, 0x5a, 0x58, 0xb1, 0x1d, 0x00, 0x44, 0x1b, \n\t0xb9, 0x00, 0x1d, 0x03, 0xe8, 0x44, 0x59, 0x2d, 0xb0, 0x0c, 0x2b, 0xb0, \n\t0x00, 0x2b, 0x00, 0xb2, 0x01, 0x09, 0x02, 0x2b, 0x00, 0xb7, 0x01, 0x33, \n\t0x2a, 0x24, 0x1a, 0x10, 0x00, 0x08, 0x2b, 0xb7, 0x02, 0x3f, 0x33, 0x24, \n\t0x1a, 0x10, 0x00, 0x08, 0x2b, 0xb7, 0x03, 0x43, 0x37, 0x2d, 0x1f, 0x12, \n\t0x00, 0x08, 0x2b, 0xb7, 0x04, 0x46, 0x39, 0x2d, 0x1f, 0x12, 0x00, 0x08, \n\t0x2b, 0xb7, 0x05, 0x4d, 0x3f, 0x31, 0x23, 0x15, 0x00, 0x08, 0x2b, 0xb7, \n\t0x06, 0x49, 0x3c, 0x2f, 0x22, 0x14, 0x00, 0x08, 0x2b, 0xb7, 0x07, 0x6d, \n\t0x59, 0x45, 0x32, 0x1a, 0x00, 0x08, 0x2b, 0xb7, 0x08, 0x51, 0x42, 0x33, \n\t0x24, 0x17, 0x00, 0x08, 0x2b, 0xb7, 0x09, 0x43, 0x37, 0x2b, 0x1f, 0x17, \n\t0x00, 0x08, 0x2b, 0x00, 0xb2, 0x0a, 0x09, 0x07, 0x2b, 0xb0, 0x00, 0x20, \n\t0x45, 0x7d, 0x69, 0x18, 0x44, 0xb2, 0xd0, 0x0c, 0x01, 0x73, 0xb2, 0x30, \n\t0x0c, 0x01, 0x73, 0xb2, 0x80, 0x0c, 0x01, 0x73, 0xb2, 0x70, 0x0c, 0x01, \n\t0x73, 0xb2, 0x20, 0x0c, 0x01, 0x74, 0xb2, 0x3f, 0x0e, 0x01, 0x73, 0xb2, \n\t0x5f, 0x0e, 0x01, 0x73, 0xb2, 0x7f, 0x0e, 0x01, 0x73, 0xb2, 0x2f, 0x0e, \n\t0x01, 0x74, 0xb2, 0x4f, 0x0e, 0x01, 0x74, 0xb2, 0x6f, 0x0e, 0x01, 0x74, \n\t0xb2, 0x8f, 0x0e, 0x01, 0x74, 0xb2, 0xaf, 0x0e, 0x01, 0x74, 0xb2, 0xff, \n\t0x0e, 0x01, 0x74, 0xb2, 0x1f, 0x0e, 0x01, 0x75, 0xb2, 0x3f, 0x0e, 0x01, \n\t0x75, 0xb2, 0x5f, 0x0e, 0x01, 0x75, 0xb2, 0x7f, 0x0e, 0x01, 0x75, 0xb2, \n\t0x0f, 0x10, 0x01, 0x73, 0xb2, 0x7f, 0x10, 0x01, 0x73, 0xb2, 0xef, 0x10, \n\t0x01, 0x73, 0xb2, 0x1f, 0x10, 0x01, 0x74, 0xb2, 0x5f, 0x10, 0x01, 0x74, \n\t0xb2, 0x8f, 0x10, 0x01, 0x74, 0xb2, 0xcf, 0x10, 0x01, 0x74, 0xb2, 0xff, \n\t0x10, 0x01, 0x74, 0xb2, 0x3f, 0x10, 0x01, 0x75, 0xb2, 0x6f, 0x10, 0x01, \n\t0x75, 0xb2, 0xbf, 0x12, 0x01, 0x73, 0xb2, 0x2f, 0x12, 0x01, 0x74, 0xb2, \n\t0x9f, 0x12, 0x01, 0x74, 0xb2, 0xbf, 0x12, 0x01, 0x74, 0xb2, 0x0f, 0x12, \n\t0x01, 0x75, 0xb2, 0x2f, 0x12, 0x01, 0x75, 0xb2, 0x2f, 0x14, 0x01, 0x73, \n\t0xb2, 0x5f, 0x14, 0x01, 0x73, 0xb2, 0xaf, 0x14, 0x01, 0x73, 0xb2, 0xff, \n\t0x14, 0x01, 0x73, 0xb2, 0x4f, 0x14, 0x01, 0x74, 0xb2, 0xcf, 0x14, 0x01, \n\t0x74, 0xb2, 0x9f, 0x14, 0x01, 0x74, 0xb2, 0x1f, 0x14, 0x01, 0x75, 0xb2, \n\t0x6f, 0x14, 0x01, 0x75, 0xb2, 0x9f, 0x16, 0x01, 0x73, 0xb2, 0xef, 0x16, \n\t0x01, 0x73, 0xb2, 0x3f, 0x16, 0x01, 0x74, 0xb2, 0x5f, 0x16, 0x01, 0x74, \n\t0xb2, 0xcf, 0x16, 0x01, 0x74, 0xb2, 0xff, 0x16, 0x01, 0x74, 0xb2, 0x1f, \n\t0x16, 0x01, 0x75, 0xb2, 0x3f, 0x16, 0x01, 0x75, 0xb2, 0x4f, 0x16, 0x01, \n\t0x75, 0xb2, 0x6f, 0x16, 0x01, 0x75, 0xb2, 0x5f, 0x18, 0x01, 0x73, 0xb2, \n\t0x7f, 0x18, 0x01, 0x73, 0xb2, 0x8f, 0x18, 0x01, 0x73, 0xb2, 0xbf, 0x18, \n\t0x01, 0x73, 0xb2, 0x1f, 0x18, 0x01, 0x74, 0xb2, 0x4f, 0x18, 0x01, 0x74, \n\t0xb2, 0x0f, 0x18, 0x01, 0x75, 0xb2, 0x1f, 0x18, 0x01, 0x75, 0xb2, 0x3f, \n\t0x18, 0x01, 0x75, 0xb2, 0x4f, 0x18, 0x01, 0x75, 0xb2, 0x7f, 0x18, 0x01, \n\t0x75, 0xb2, 0x8f, 0x18, 0x01, 0x75, 0xb2, 0x2f, 0x1a, 0x01, 0x73, 0xb2, \n\t0x3f, 0x1a, 0x01, 0x73, 0xb2, 0x7f, 0x1a, 0x01, 0x73, 0xb2, 0x6f, 0x1a, \n\t0x01, 0x73, 0xb2, 0x7f, 0x1a, 0x01, 0x74, 0xb2, 0xbf, 0x1a, 0x01, 0x74, \n\t0xb2, 0xff, 0x1a, 0x01, 0x74, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x00, 0xe1, \n\t0x00, 0xb5, 0x00, 0xaa, 0x00, 0xa2, 0x00, 0x94, 0x00, 0x9b, 0x00, 0x68, \n\t0x00, 0x8c, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x15, 0xfe, 0x60, 0x00, 0x15, \n\t0x04, 0x3a, 0x00, 0x15, 0x05, 0xb0, 0x00, 0x15, 0x04, 0x8d, 0x00, 0x10, \n\t0x03, 0x21, 0x00, 0x0b, 0x03, 0x48, 0x00, 0x0d, 0x02, 0x90, 0x00, 0x06, \n\t0x06, 0x18, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x5c, 0x00, 0xd2, \n\t0x01, 0x44, 0x01, 0xd4, 0x02, 0x60, 0x02, 0x78, 0x02, 0xa2, 0x02, 0xcc, \n\t0x02, 0xfc, 0x03, 0x22, 0x03, 0x36, 0x03, 0x4c, 0x03, 0x66, 0x03, 0x7e, \n\t0x03, 0xce, 0x03, 0xf8, 0x04, 0x4a, 0x04, 0xc0, 0x05, 0x02, 0x05, 0x62, \n\t0x05, 0xca, 0x06, 0x00, 0x06, 0x7c, 0x06, 0xe2, 0x06, 0xf2, 0x07, 0x02, \n\t0x07, 0x24, 0x07, 0x4c, 0x07, 0x6e, 0x07, 0xcc, 0x08, 0x76, 0x08, 0xb6, \n\t0x09, 0x1a, 0x09, 0x6e, 0x09, 0xb0, 0x09, 0xf6, 0x0a, 0x32, 0x0a, 0x96, \n\t0x0a, 0xda, 0x0a, 0xf6, 0x0b, 0x2e, 0x0b, 0x7a, 0x0b, 0xa0, 0x0b, 0xf2, \n\t0x0c, 0x30, 0x0c, 0x82, 0x0c, 0xc6, 0x0d, 0x22, 0x0d, 0x84, 0x0d, 0xf2, \n\t0x0e, 0x1e, 0x0e, 0x5c, 0x0e, 0x8c, 0x0e, 0xdc, 0x0f, 0x20, 0x0f, 0x58, \n\t0x0f, 0x92, 0x0f, 0xb8, 0x0f, 0xd0, 0x0f, 0xf4, 0x10, 0x16, 0x10, 0x28, \n\t0x10, 0x56, 0x10, 0xdc, 0x11, 0x3c, 0x11, 0x8e, 0x11, 0xec, 0x12, 0x5a, \n\t0x12, 0xba, 0x13, 0x30, 0x13, 0x76, 0x13, 0xa6, 0x13, 0xf0, 0x14, 0x3a, \n\t0x14, 0x56, 0x14, 0xc2, 0x15, 0x08, 0x15, 0x52, 0x15, 0xb2, 0x16, 0x10, \n\t0x16, 0x4a, 0x16, 0xc0, 0x17, 0x10, 0x17, 0x56, 0x17, 0x86, 0x17, 0xd4, \n\t0x18, 0x18, 0x18, 0x64, 0x18, 0x9e, 0x18, 0xde, 0x18, 0xf6, 0x19, 0x34, \n\t0x19, 0x72, 0x19, 0x72, 0x19, 0x9a, 0x19, 0xf0, 0x1a, 0x58, 0x1a, 0xba, \n\t0x1b, 0x1a, 0x1b, 0x42, 0x1b, 0xe2, 0x1c, 0x04, 0x1c, 0x94, 0x1d, 0x0c, \n\t0x1d, 0x18, 0x1d, 0x32, 0x1d, 0x3a, 0x1d, 0xd6, 0x1d, 0xee, 0x1e, 0x3e, \n\t0x1e, 0x7a, 0x1e, 0xce, 0x1f, 0x60, 0x1f, 0x8c, 0x1f, 0xdc, 0x20, 0x02, \n\t0x20, 0x18, 0x20, 0x46, 0x20, 0x76, 0x20, 0xc4, 0x20, 0xd0, 0x20, 0xf2, \n\t0x21, 0x14, 0x21, 0x36, 0x21, 0x8c, 0x21, 0x9e, 0x21, 0xb0, 0x21, 0xc2, \n\t0x21, 0xd4, 0x21, 0xea, 0x22, 0x00, 0x22, 0x68, 0x22, 0x74, 0x22, 0x86, \n\t0x22, 0x98, 0x22, 0xaa, 0x22, 0xc0, 0x22, 0xd2, 0x22, 0xe4, 0x22, 0xf6, \n\t0x23, 0x0c, 0x23, 0x6a, 0x23, 0x7c, 0x23, 0x8e, 0x23, 0xa0, 0x23, 0xb2, \n\t0x23, 0xc4, 0x23, 0xda, 0x24, 0x06, 0x24, 0x78, 0x24, 0x8a, 0x24, 0x9c, \n\t0x24, 0xae, 0x24, 0xc4, 0x24, 0xd6, 0x25, 0x1e, 0x25, 0x7e, 0x25, 0x90, \n\t0x25, 0xa2, 0x25, 0xb4, 0x25, 0xc6, 0x25, 0xda, 0x25, 0xf0, 0x26, 0xc2, \n\t0x26, 0xce, 0x26, 0xe0, 0x26, 0xf2, 0x27, 0x04, 0x27, 0x18, 0x27, 0x2a, \n\t0x27, 0x3c, 0x27, 0x4e, 0x27, 0x64, 0x27, 0xce, 0x27, 0xe0, 0x27, 0xf2, \n\t0x28, 0x04, 0x28, 0x16, 0x28, 0x28, 0x28, 0x3c, 0x28, 0x78, 0x28, 0xe6, \n\t0x28, 0xf8, 0x29, 0x0a, 0x29, 0x1c, 0x29, 0x30, 0x29, 0x42, 0x29, 0xa4, \n\t0x29, 0xb8, 0x29, 0xca, 0x29, 0xdc, 0x29, 0xee, 0x2a, 0x00, 0x2a, 0x0c, \n\t0x2a, 0x18, 0x2a, 0x2a, 0x2a, 0x3c, 0x2a, 0x4e, 0x2a, 0x60, 0x2a, 0x72, \n\t0x2a, 0x84, 0x2a, 0x96, 0x2a, 0xa8, 0x2a, 0xba, 0x2a, 0xd0, 0x2b, 0x2e, \n\t0x2b, 0xae, 0x2b, 0xc0, 0x2b, 0xd2, 0x2b, 0xe4, 0x2b, 0xf6, 0x2c, 0x08, \n\t0x2c, 0x1a, 0x2c, 0x26, 0x2c, 0x32, 0x2c, 0x44, 0x2c, 0x56, 0x2c, 0x68, \n\t0x2c, 0x7a, 0x2c, 0x8c, 0x2c, 0x9e, 0x2c, 0xb0, 0x2c, 0xc2, 0x2c, 0xd8, \n\t0x2c, 0xea, 0x2c, 0xfc, 0x2d, 0x0e, 0x2d, 0x7e, 0x2d, 0xe6, 0x2d, 0xf8, \n\t0x2e, 0x0a, 0x2e, 0x1c, 0x2e, 0x2e, 0x2e, 0x40, 0x2e, 0x52, 0x2e, 0x5e, \n\t0x2e, 0x6a, 0x2e, 0x7c, 0x2e, 0x98, 0x2e, 0xa4, 0x2e, 0xb0, 0x2e, 0xc2, \n\t0x2e, 0xd4, 0x2e, 0xea, 0x2f, 0x00, 0x2f, 0x4c, 0x2f, 0x5e, 0x2f, 0x70, \n\t0x2f, 0x86, 0x2f, 0x9c, 0x2f, 0xb2, 0x2f, 0xc8, 0x2f, 0xd8, 0x2f, 0xe8, \n\t0x30, 0x30, 0x30, 0x6e, 0x30, 0x80, 0x30, 0x92, 0x30, 0xa8, 0x30, 0xbe, \n\t0x30, 0xd0, 0x30, 0xe2, 0x30, 0xf8, 0x31, 0x54, 0x31, 0xb2, 0x31, 0xc4, \n\t0x31, 0xd6, 0x31, 0xe8, 0x31, 0xfa, 0x32, 0x10, 0x32, 0x24, 0x32, 0xac, \n\t0x33, 0x4e, 0x33, 0x60, 0x33, 0x72, 0x33, 0x88, 0x33, 0x9e, 0x33, 0xb0, \n\t0x33, 0xc2, 0x33, 0xd4, 0x33, 0xe6, 0x33, 0xf8, 0x34, 0x0a, 0x34, 0x16, \n\t0x34, 0x22, 0x34, 0x34, 0x34, 0x46, 0x34, 0x5c, 0x34, 0x72, 0x34, 0x84, \n\t0x34, 0x94, 0x34, 0xd4, 0x35, 0x36, 0x35, 0x48, 0x35, 0x5a, 0x35, 0x6c, \n\t0x35, 0x7e, 0x35, 0x90, 0x35, 0xa2, 0x35, 0xb8, 0x35, 0xce, 0x35, 0xe4, \n\t0x35, 0xf8, 0x36, 0x04, 0x36, 0x10, 0x36, 0x22, 0x36, 0x34, 0x36, 0x46, \n\t0x36, 0x58, 0x36, 0x6e, 0x36, 0x80, 0x36, 0x92, 0x36, 0xa4, 0x36, 0xb6, \n\t0x36, 0xc8, 0x36, 0xda, 0x37, 0x0a, 0x37, 0x84, 0x37, 0xe2, 0x38, 0x38, \n\t0x38, 0x82, 0x38, 0xd6, 0x38, 0xe8, 0x39, 0x00, 0x39, 0x18, 0x39, 0x2a, \n\t0x39, 0x3c, 0x39, 0x4e, 0x39, 0x60, 0x39, 0x72, 0x39, 0x84, 0x39, 0xb6, \n\t0x39, 0xc8, 0x39, 0xf4, 0x3a, 0x22, 0x3a, 0x62, 0x3a, 0x78, 0x3a, 0xb2, \n\t0x3a, 0xee, 0x3b, 0x46, 0x3b, 0x74, 0x3b, 0xb2, 0x3b, 0xca, 0x3b, 0xe2, \n\t0x3b, 0xec, 0x3c, 0x24, 0x3c, 0x52, 0x3c, 0x70, 0x3c, 0x86, 0x3c, 0xc0, \n\t0x3c, 0xd2, 0x3c, 0xda, 0x3c, 0xec, 0x3c, 0xfe, 0x3d, 0x10, 0x3d, 0x22, \n\t0x3d, 0x34, 0x3d, 0x46, 0x3d, 0x5e, 0x3d, 0x66, 0x3d, 0x6e, 0x3d, 0x96, \n\t0x3d, 0xc6, 0x3d, 0xce, 0x3d, 0xd6, 0x3d, 0xde, 0x3e, 0x44, 0x3e, 0x4c, \n\t0x3e, 0x54, 0x3e, 0x84, 0x3e, 0x8c, 0x3e, 0x94, 0x3e, 0xda, 0x3e, 0xe2, \n\t0x3f, 0x12, 0x3f, 0x1a, 0x3f, 0x66, 0x3f, 0x6e, 0x3f, 0x76, 0x3f, 0xe2, \n\t0x3f, 0xea, 0x40, 0x44, 0x40, 0xa4, 0x40, 0xba, 0x40, 0xd0, 0x40, 0xe2, \n\t0x40, 0xf4, 0x41, 0x06, 0x41, 0x18, 0x41, 0x2e, 0x41, 0xa2, 0x42, 0x14, \n\t0x42, 0x50, 0x42, 0xb6, 0x43, 0x20, 0x43, 0x7e, 0x43, 0xc4, 0x44, 0x2a, \n\t0x44, 0x5c, 0x44, 0x64, 0x44, 0xc4, 0x44, 0xcc, 0x44, 0xd4, 0x45, 0x48, \n\t0x45, 0x50, 0x45, 0xa0, 0x45, 0xf8, 0x46, 0x54, 0x46, 0xa8, 0x46, 0xd4, \n\t0x47, 0x16, 0x47, 0x80, 0x47, 0xf4, 0x48, 0x52, 0x48, 0xb8, 0x48, 0xce, \n\t0x48, 0xe2, 0x48, 0xf4, 0x49, 0x06, 0x49, 0x18, 0x49, 0x7c, 0x49, 0xe0, \n\t0x4a, 0x4e, 0x4a, 0x60, 0x4a, 0x76, 0x4a, 0x88, 0x4a, 0xee, 0x4b, 0x5c, \n\t0x4b, 0x64, 0x4b, 0x7a, 0x4b, 0x82, 0x4b, 0xee, 0x4c, 0x5a, 0x4c, 0x6c, \n\t0x4c, 0x7e, 0x4c, 0x90, 0x4c, 0xce, 0x4c, 0xd6, 0x4d, 0x26, 0x4d, 0x2e, \n\t0x4d, 0x36, 0x4d, 0x3e, 0x4d, 0xae, 0x4d, 0xec, 0x4d, 0xfe, 0x4e, 0x06, \n\t0x4e, 0x4a, 0x4e, 0x52, 0x4e, 0x5a, 0x4e, 0x62, 0x4e, 0x6a, 0x4e, 0x72, \n\t0x4e, 0x7a, 0x4e, 0x82, 0x4e, 0x8a, 0x4e, 0xc4, 0x4f, 0x06, 0x4f, 0x60, \n\t0x4f, 0xc2, 0x50, 0x38, 0x50, 0x40, 0x50, 0xa8, 0x50, 0xd0, 0x50, 0xd8, \n\t0x51, 0x16, 0x51, 0x28, 0x51, 0x72, 0x51, 0xb4, 0x52, 0x00, 0x52, 0x4a, \n\t0x52, 0x52, 0x52, 0x82, 0x52, 0x8a, 0x52, 0xd6, 0x53, 0x04, 0x53, 0x0c, \n\t0x53, 0x14, 0x53, 0x4e, 0x53, 0x92, 0x53, 0xd2, 0x54, 0x1e, 0x54, 0x76, \n\t0x54, 0xb8, 0x55, 0x24, 0x55, 0x94, 0x55, 0xe6, 0x55, 0xf8, 0x56, 0x0c, \n\t0x56, 0x8e, 0x56, 0xa0, 0x57, 0x0a, 0x57, 0x12, 0x57, 0x1a, 0x57, 0x30, \n\t0x57, 0x38, 0x57, 0xa0, 0x58, 0x02, 0x58, 0x6c, 0x58, 0x7e, 0x58, 0x90, \n\t0x58, 0xa2, 0x58, 0xe2, 0x59, 0x40, 0x59, 0x8e, 0x59, 0xd6, 0x5a, 0x32, \n\t0x5a, 0x8e, 0x5a, 0xfc, 0x5b, 0x62, 0x5b, 0xe6, 0x5c, 0x64, 0x5c, 0xfc, \n\t0x5d, 0xa4, 0x5d, 0xac, 0x5d, 0xb4, 0x5d, 0xfc, 0x5e, 0x12, 0x5e, 0x1e, \n\t0x5e, 0x2a, 0x5e, 0x9a, 0x5f, 0x08, 0x5f, 0x54, 0x5f, 0x9e, 0x5f, 0xd4, \n\t0x5f, 0xfc, 0x60, 0x30, 0x60, 0x48, 0x60, 0x60, 0x61, 0x54, 0x61, 0xc4, \n\t0x61, 0xda, 0x61, 0xf0, 0x62, 0x4e, 0x62, 0x78, 0x62, 0xa8, 0x62, 0xf0, \n\t0x63, 0x2e, 0x63, 0x3a, 0x63, 0x46, 0x63, 0x9c, 0x63, 0xf0, 0x64, 0x54, \n\t0x64, 0xb4, 0x64, 0xc0, 0x64, 0xcc, 0x65, 0x1a, 0x65, 0x84, 0x65, 0x90, \n\t0x65, 0x9c, 0x65, 0xa4, 0x65, 0xac, 0x65, 0xf4, 0x66, 0x3c, 0x66, 0x48, \n\t0x66, 0x54, 0x66, 0x9e, 0x66, 0xe6, 0x66, 0xf2, 0x66, 0xfe, 0x67, 0x52, \n\t0x67, 0xa6, 0x67, 0xe8, 0x67, 0xfc, 0x68, 0x6a, 0x68, 0xe6, 0x68, 0xee, \n\t0x68, 0xfa, 0x69, 0x06, 0x69, 0x60, 0x69, 0xba, 0x69, 0xc6, 0x69, 0xd2, \n\t0x69, 0xde, 0x69, 0xea, 0x69, 0xf6, 0x6a, 0x02, 0x6a, 0x0a, 0x6a, 0x1c, \n\t0x6a, 0x2e, 0x6a, 0x44, 0x6a, 0x58, 0x6a, 0x60, 0x6a, 0x68, 0x6a, 0x7a, \n\t0x6a, 0x8c, 0x6a, 0xec, 0x6b, 0x02, 0x6b, 0x18, 0x6b, 0x52, 0x6b, 0x68, \n\t0x6b, 0x7e, 0x6b, 0x94, 0x6b, 0xa8, 0x6c, 0x06, 0x6c, 0x5c, 0x6c, 0x6e, \n\t0x6c, 0x80, 0x6c, 0x96, 0x6c, 0xaa, 0x6c, 0xc0, 0x6c, 0xd4, 0x6c, 0xea, \n\t0x6c, 0xfe, 0x6d, 0x10, 0x6d, 0x24, 0x6d, 0x38, 0x6d, 0x4e, 0x6d, 0x62, \n\t0x6d, 0x6e, 0x6d, 0x7a, 0x6d, 0x90, 0x6d, 0xaa, 0x6d, 0xba, 0x6d, 0xce, \n\t0x6d, 0xda, 0x6d, 0xe6, 0x6e, 0x44, 0x6e, 0x9c, 0x6e, 0xe0, 0x6e, 0xe8, \n\t0x6f, 0x40, 0x6f, 0xc0, 0x70, 0x36, 0x70, 0xa4, 0x71, 0x08, 0x71, 0x68, \n\t0x71, 0xce, 0x72, 0x32, 0x72, 0x98, 0x72, 0xfe, 0x73, 0x56, 0x73, 0xa8, \n\t0x73, 0xf8, 0x74, 0x46, 0x74, 0xb6, 0x74, 0xbe, 0x74, 0xca, 0x74, 0xd6, \n\t0x74, 0xe2, 0x74, 0xee, 0x75, 0x00, 0x75, 0x12, 0x75, 0x24, 0x75, 0x36, \n\t0x75, 0x48, 0x75, 0x5a, 0x75, 0x70, 0x75, 0x86, 0x75, 0x92, 0x75, 0x9e, \n\t0x75, 0xb0, 0x75, 0xc2, 0x75, 0xd8, 0x75, 0xec, 0x76, 0x02, 0x76, 0x16, \n\t0x76, 0x2c, 0x76, 0x40, 0x76, 0x56, 0x76, 0x6a, 0x76, 0x80, 0x76, 0x96, \n\t0x76, 0xac, 0x76, 0xc0, 0x76, 0xd6, 0x76, 0xea, 0x77, 0x00, 0x77, 0x14, \n\t0x77, 0x2a, 0x77, 0x3e, 0x77, 0x54, 0x77, 0x6a, 0x77, 0x76, 0x77, 0x82, \n\t0x77, 0x94, 0x77, 0xa6, 0x77, 0xb8, 0x77, 0xca, 0x77, 0xe0, 0x77, 0xf4, \n\t0x78, 0x0a, 0x78, 0x1e, 0x78, 0x34, 0x78, 0x48, 0x78, 0x5e, 0x78, 0x72, \n\t0x78, 0x88, 0x78, 0x9e, 0x78, 0xb0, 0x78, 0xc2, 0x78, 0xce, 0x78, 0xda, \n\t0x78, 0xe6, 0x78, 0xf2, 0x79, 0x04, 0x79, 0x16, 0x79, 0x2c, 0x79, 0x40, \n\t0x79, 0x56, 0x79, 0x6a, 0x79, 0x80, 0x79, 0x94, 0x79, 0xaa, 0x79, 0xbe, \n\t0x79, 0xd4, 0x79, 0xea, 0x79, 0xfc, 0x7a, 0x0e, 0x7a, 0x20, 0x7a, 0x32, \n\t0x7a, 0x44, 0x7a, 0x56, 0x7a, 0x68, 0x7a, 0x7a, 0x7a, 0x86, 0x7a, 0x92, \n\t0x7a, 0x9e, 0x7a, 0xaa, 0x7a, 0xbc, 0x7a, 0xce, 0x7a, 0xe0, 0x7a, 0xf2, \n\t0x7b, 0x04, 0x7b, 0x16, 0x7b, 0x28, 0x7b, 0x3a, 0x7b, 0x4c, 0x7b, 0x5e, \n\t0x7b, 0x6a, 0x7b, 0x76, 0x7b, 0x88, 0x7b, 0x9a, 0x7b, 0xa6, 0x7b, 0xb6, \n\t0x7b, 0xc8, 0x7b, 0xda, 0x7b, 0xec, 0x7b, 0xfe, 0x7c, 0x14, 0x7c, 0x14, \n\t0x7c, 0x14, 0x7c, 0x14, 0x7c, 0x14, 0x7c, 0x14, 0x7c, 0x14, 0x7c, 0x14, \n\t0x7c, 0x14, 0x7c, 0x14, 0x7c, 0x14, 0x7c, 0x14, 0x7c, 0x14, 0x7c, 0x1e, \n\t0x7c, 0x28, 0x7c, 0x32, 0x7c, 0x5e, 0x7c, 0x76, 0x7c, 0x90, 0x7c, 0xa4, \n\t0x7c, 0xb0, 0x7c, 0xbc, 0x7c, 0xc8, 0x7c, 0xe8, 0x7d, 0x28, 0x7d, 0x8c, \n\t0x7d, 0xac, 0x7d, 0xb8, 0x7d, 0xc8, 0x7e, 0x8a, 0x7e, 0x92, 0x7e, 0x9a, \n\t0x7e, 0xb2, 0x7e, 0xcc, 0x7e, 0xd8, 0x7e, 0xec, 0x7f, 0x28, 0x7f, 0x7e, \n\t0x7f, 0xce, 0x80, 0x48, 0x80, 0xcc, 0x80, 0xec, 0x81, 0x72, 0x82, 0x08, \n\t0x82, 0x74, 0x82, 0x84, 0x82, 0xd0, 0x83, 0x2e, 0x83, 0x54, 0x83, 0x7a, \n\t0x83, 0xa0, 0x83, 0xc6, 0x84, 0x1c, 0x84, 0x44, 0x84, 0x8c, 0x84, 0xa2, \n\t0x84, 0xd6, 0x85, 0x58, 0x85, 0x9c, 0x86, 0x12, 0x86, 0x52, 0x86, 0x6c, \n\t0x86, 0x84, 0x86, 0xbe, 0x86, 0xd0, 0x87, 0x44, 0x87, 0x50, 0x87, 0x5c, \n\t0x87, 0x6c, 0x87, 0x6c, 0x89, 0x18, 0x89, 0x5e, 0x89, 0x70, 0x89, 0x98, \n\t0x8a, 0x14, 0x8a, 0x78, 0x8a, 0xdc, 0x8b, 0x20, 0x8b, 0xa6, 0x8b, 0xf6, \n\t0x8c, 0x20, 0x8c, 0x6c, 0x8c, 0xa6, 0x8c, 0xde, 0x8d, 0x20, 0x8d, 0x6c, \n\t0x8d, 0x9c, 0x8d, 0xd8, 0x8e, 0x06, 0x8e, 0x6e, 0x8e, 0xe2, 0x8f, 0x3a, \n\t0x8f, 0x8a, 0x8f, 0xd6, 0x90, 0x14, 0x90, 0x2e, 0x90, 0x7a, 0x90, 0xa0, \n\t0x90, 0xe6, 0x91, 0x1a, 0x91, 0x36, 0x91, 0x86, 0x91, 0xe4, 0x92, 0x2c, \n\t0x92, 0x70, 0x92, 0xb0, 0x92, 0xfe, 0x93, 0x76, 0x93, 0x8e, 0x93, 0xd2, \n\t0x94, 0x12, 0x94, 0x58, 0x94, 0x9c, 0x94, 0xfc, 0x95, 0x56, 0x95, 0xb2, \n\t0x96, 0x20, 0x96, 0x9c, 0x96, 0xae, 0x96, 0xe8, 0x97, 0x14, 0x97, 0x3e, \n\t0x97, 0x68, 0x97, 0xba, 0x98, 0x2a, 0x98, 0x6c, 0x98, 0xcc, 0x99, 0x34, \n\t0x99, 0x6a, 0x99, 0xe6, 0x9a, 0x4c, 0x9a, 0x8e, 0x9a, 0xea, 0x9b, 0x52, \n\t0x9b, 0xae, 0x9b, 0xee, 0x9c, 0x6e, 0x9c, 0xbe, 0x9d, 0x16, 0x9d, 0x40, \n\t0x9d, 0x88, 0x9d, 0xea, 0x9e, 0x68, 0x9e, 0x9a, 0x9e, 0xcc, 0x9e, 0xd4, \n\t0x9e, 0xf8, 0x9f, 0x1c, 0x9f, 0x30, 0x9f, 0x42, 0x9f, 0x54, 0x9f, 0x66, \n\t0x9f, 0x78, 0x9f, 0x8c, 0x9f, 0xa2, 0x9f, 0xba, 0x9f, 0xc6, 0x9f, 0xd8, \n\t0x9f, 0xea, 0x9f, 0xfc, 0xa0, 0x10, 0xa0, 0x22, 0xa0, 0x34, 0xa0, 0x46, \n\t0xa0, 0x5c, 0xa0, 0x6e, 0xa0, 0x80, 0xa0, 0x92, 0xa0, 0xa4, 0xa0, 0xb6, \n\t0xa0, 0xca, 0xa0, 0xdc, 0xa0, 0xee, 0xa1, 0x00, 0xa1, 0x14, 0xa1, 0x26, \n\t0xa1, 0x38, 0xa1, 0x4a, 0xa1, 0x56, 0xa1, 0x68, 0xa1, 0x7a, 0xa1, 0x8c, \n\t0xa1, 0x9e, 0xa1, 0xb0, 0xa1, 0xc2, 0xa1, 0xd4, 0xa1, 0xe6, 0xa1, 0xf2, \n\t0xa2, 0x04, 0xa2, 0x16, 0xa2, 0x28, 0xa2, 0x3a, 0xa2, 0x50, 0xa2, 0x62, \n\t0xa2, 0x74, 0xa2, 0x8a, 0xa2, 0x9c, 0xa2, 0xa8, 0xa2, 0xba, 0xa2, 0xcc, \n\t0xa2, 0xe2, 0xa2, 0xf4, 0xa3, 0x0a, 0xa3, 0x20, 0xa3, 0x30, 0xa3, 0x42, \n\t0xa3, 0x58, 0xa3, 0x6a, 0xa3, 0x7c, 0xa3, 0x8e, 0xa3, 0xa4, 0xa3, 0xb6, \n\t0xa3, 0xcc, 0xa3, 0xde, 0xa3, 0xf0, 0xa4, 0x02, 0xa4, 0x0e, 0xa4, 0x20, \n\t0xa4, 0x36, 0xa4, 0x48, 0xa4, 0x5a, 0xa4, 0x6c, 0xa4, 0x7e, 0xa4, 0x94, \n\t0xa4, 0xa0, 0xa4, 0xb2, 0xa4, 0xc4, 0xa4, 0xd6, 0xa4, 0xea, 0xa4, 0xfc, \n\t0xa5, 0x0e, 0xa5, 0x1a, 0xa5, 0x80, 0xa5, 0xd4, 0xa6, 0x26, 0xa6, 0x96, \n\t0xa6, 0xe8, 0xa7, 0x56, 0xa7, 0x8e, 0xa7, 0xcc, 0xa8, 0x1e, 0xa8, 0x62, \n\t0xa8, 0xb6, 0xa9, 0x2e, 0xa9, 0x7c, 0xa9, 0xe8, 0xaa, 0x64, 0xaa, 0xf2, \n\t0xab, 0x42, 0xab, 0x9a, 0xab, 0xf6, 0xac, 0x56, 0xac, 0xdc, 0xad, 0x7a, \n\t0xad, 0xe6, 0xae, 0x60, 0xae, 0xac, 0xae, 0xc2, 0xaf, 0x76, 0xb0, 0x2e, \n\t0xb0, 0xac, 0xb1, 0x2a, 0xb1, 0x84, 0xb1, 0xdc, 0xb2, 0x54, 0xb2, 0xaa, \n\t0xb2, 0xf4, 0xb3, 0x00, 0xb3, 0x0c, 0xb3, 0x18, 0xb3, 0x24, 0xb3, 0x76, \n\t0xb3, 0xc8, 0xb4, 0x28, 0xb4, 0x7c, 0xb5, 0x10, 0xb5, 0xa0, 0xb5, 0xac, \n\t0xb5, 0xb8, 0xb5, 0xc4, 0xb5, 0xd0, 0xb5, 0xe2, 0xb5, 0xf4, 0xb6, 0x4e, \n\t0xb6, 0x9c, 0xb6, 0xa4, 0xb6, 0xac, 0xb6, 0xc2, 0xb6, 0xd6, 0xb6, 0xe8, \n\t0xb6, 0xfe, 0xb7, 0x14, 0x00, 0x02, 0x00, 0x86, 0x00, 0x00, 0x01, 0xaa, \n\t0x05, 0xb0, 0x00, 0x03, 0x00, 0x07, 0x00, 0x31, 0x00, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x10, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0a, 0x3e, 0x59, 0xb0, \n\t0x07, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x00, 0xb0, \n\t0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, 0x01, 0x21, 0x11, \n\t0x21, 0x11, 0x21, 0x11, 0x21, 0x01, 0xaa, 0xfe, 0xdc, 0x01, 0x24, 0xfe, \n\t0xdc, 0x01, 0x24, 0x01, 0xf6, 0x03, 0xba, 0xfa, 0x50, 0x01, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x32, 0x04, 0x0f, 0x02, 0x5e, 0x06, 0x1b, 0x00, 0x04, \n\t0x00, 0x09, 0x00, 0x2d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, \n\t0x1b, 0xb1, 0x03, 0x1a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, \n\t0x2f, 0x1b, 0xb1, 0x08, 0x1a, 0x3e, 0x59, 0xb0, 0x03, 0x10, 0xb0, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x07, 0xd0, 0x30, \n\t0x31, 0x01, 0x07, 0x23, 0x11, 0x33, 0x01, 0x07, 0x23, 0x11, 0x33, 0x01, \n\t0x18, 0x66, 0x80, 0xe6, 0x01, 0x46, 0x66, 0x80, 0xe6, 0x05, 0x08, 0xf9, \n\t0x02, 0x0c, 0xfe, 0xed, 0xf9, 0x02, 0x0c, 0x00, 0x00, 0x02, 0x00, 0x30, \n\t0x00, 0x00, 0x04, 0x8c, 0x05, 0xb0, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x7f, \n\t0x00, 0xb0, 0x0a, 0x2f, 0xb0, 0x06, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0a, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x1b, 0x2f, 0x1b, 0xb1, 0x1b, 0x0a, 0x3e, 0x59, 0xb0, \n\t0x06, 0x10, 0xb1, 0x05, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x01, 0xd0, 0xb0, 0x0a, 0x10, 0xb1, 0x09, 0x03, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0a, 0x10, 0xb0, \n\t0x0e, 0xd0, 0xb0, 0x12, 0xd0, 0xb0, 0x09, 0x10, 0xb0, 0x1f, 0xd0, 0xb0, \n\t0x15, 0xd0, 0xb0, 0x06, 0x10, 0xb0, 0x1c, 0xd0, 0xb0, 0x16, 0xd0, 0xb0, \n\t0x01, 0x10, 0xb0, 0x19, 0xd0, 0x30, 0x31, 0x01, 0x23, 0x03, 0x23, 0x13, \n\t0x23, 0x35, 0x21, 0x13, 0x23, 0x35, 0x21, 0x13, 0x33, 0x03, 0x33, 0x13, \n\t0x33, 0x03, 0x33, 0x15, 0x23, 0x03, 0x33, 0x15, 0x23, 0x03, 0x23, 0x03, \n\t0x33, 0x13, 0x23, 0x02, 0x8a, 0xc0, 0x47, 0xb8, 0x48, 0xe3, 0x01, 0x00, \n\t0x33, 0xe8, 0x01, 0x06, 0x49, 0xb7, 0x49, 0xc0, 0x4a, 0xb7, 0x49, 0xdc, \n\t0xfa, 0x33, 0xe1, 0xfe, 0x48, 0xb8, 0x5a, 0xbf, 0x33, 0xc0, 0x01, 0x9a, \n\t0xfe, 0x66, 0x01, 0x9a, 0xa9, 0x01, 0x22, 0xab, 0x01, 0xa0, 0xfe, 0x60, \n\t0x01, 0xa0, 0xfe, 0x60, 0xab, 0xfe, 0xde, 0xa9, 0xfe, 0x66, 0x02, 0x43, \n\t0x01, 0x22, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5c, 0xff, 0x2a, 0x04, 0x38, \n\t0x06, 0x98, 0x00, 0x2d, 0x00, 0x5d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x23, 0x2f, 0x1b, 0xb1, 0x23, 0x0a, 0x3e, 0x59, 0xb2, 0x1a, 0x23, \n\t0x09, 0x11, 0x12, 0x39, 0xb0, 0x1a, 0x10, 0xb1, 0x03, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x09, 0x10, 0xb0, 0x0c, \n\t0xd0, 0xb0, 0x09, 0x10, 0xb1, 0x14, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x23, 0x10, 0xb0, 0x20, 0xd0, 0xb0, 0x23, \n\t0x10, 0xb1, 0x2b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0x30, 0x31, 0x01, 0x34, 0x26, 0x27, 0x26, 0x26, 0x35, 0x34, 0x36, \n\t0x37, 0x35, 0x33, 0x15, 0x16, 0x16, 0x07, 0x07, 0x21, 0x34, 0x26, 0x23, \n\t0x22, 0x06, 0x15, 0x14, 0x16, 0x17, 0x16, 0x16, 0x15, 0x14, 0x06, 0x07, \n\t0x15, 0x23, 0x35, 0x26, 0x26, 0x37, 0x37, 0x21, 0x14, 0x16, 0x33, 0x32, \n\t0x36, 0x03, 0x15, 0x5d, 0x71, 0xde, 0xd7, 0xd7, 0xb6, 0x9f, 0xb0, 0xc9, \n\t0x02, 0x03, 0xfe, 0xe3, 0x61, 0x54, 0x56, 0x54, 0x59, 0x77, 0xdd, 0xd5, \n\t0xd6, 0xb8, 0x9f, 0xbb, 0xf4, 0x04, 0x02, 0x01, 0x1d, 0x7b, 0x5f, 0x5b, \n\t0x61, 0x01, 0x7f, 0x51, 0x66, 0x2c, 0x51, 0xc7, 0xb5, 0xa8, 0xd7, 0x13, \n\t0xd7, 0xd9, 0x1a, 0xf2, 0xc1, 0x05, 0x76, 0x80, 0x63, 0x52, 0x4e, 0x61, \n\t0x2f, 0x57, 0xc6, 0xb2, 0xae, 0xd0, 0x13, 0xc6, 0xc5, 0x13, 0xe3, 0xdc, \n\t0x05, 0x86, 0x74, 0x61, 0x00, 0x05, 0x00, 0x5f, 0xff, 0xec, 0x05, 0x91, \n\t0x05, 0xc5, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x29, 0x00, 0x37, 0x00, 0x3b, \n\t0x00, 0x76, 0x00, 0xb0, 0x38, 0x2f, 0xb0, 0x3a, 0x2f, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x10, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x26, 0x2f, 0x1b, 0xb1, 0x26, 0x0a, 0x3e, 0x59, 0xb0, \n\t0x03, 0x10, 0xb0, 0x0a, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, \n\t0xb1, 0x11, 0x04, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x03, 0x10, 0xb1, 0x18, 0x04, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x26, 0x10, 0xb0, 0x1f, 0xb0, 0x0a, 0x2b, 0x58, \n\t0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x26, 0x10, 0xb1, 0x2d, 0x04, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x1f, 0x10, 0xb1, 0x34, \n\t0x04, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x13, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x06, 0x23, 0x22, \n\t0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, \n\t0x23, 0x22, 0x06, 0x15, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, \n\t0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, \n\t0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x05, 0x27, 0x01, 0x17, \n\t0x5f, 0xa7, 0x95, 0x97, 0xa6, 0xa6, 0x95, 0x96, 0xa8, 0xc2, 0x40, 0x3c, \n\t0x3a, 0x3f, 0x40, 0x3b, 0x3b, 0x3f, 0x01, 0xf6, 0xa8, 0x95, 0x96, 0xa7, \n\t0xa6, 0x95, 0x96, 0xa9, 0xc2, 0x45, 0x38, 0x41, 0x38, 0x40, 0x3b, 0x3c, \n\t0x3f, 0xfd, 0xf4, 0x8e, 0x02, 0xc7, 0x8e, 0x04, 0x98, 0x81, 0xac, 0xab, \n\t0x82, 0x4d, 0x81, 0xaa, 0xaa, 0x81, 0x3a, 0x4f, 0x4f, 0x3a, 0x4d, 0x3a, \n\t0x51, 0x51, 0x3a, 0xfc, 0xcd, 0x80, 0xac, 0xab, 0x81, 0x4d, 0x82, 0xaa, \n\t0xab, 0x81, 0x39, 0x51, 0x4b, 0x3f, 0x4d, 0x39, 0x51, 0x51, 0x39, 0xf8, \n\t0x4b, 0x04, 0x72, 0x4b, 0x00, 0x03, 0x00, 0x3d, 0xff, 0xeb, 0x05, 0x1c, \n\t0x05, 0xc5, 0x00, 0x21, 0x00, 0x2c, 0x00, 0x39, 0x00, 0x62, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x10, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1f, 0x2f, 0x1b, 0xb1, 0x1f, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1b, 0x2f, 0x1b, 0xb1, 0x1b, 0x0a, \n\t0x3e, 0x59, 0xb2, 0x1c, 0x1f, 0x09, 0x11, 0x12, 0x39, 0xb0, 0x1c, 0x10, \n\t0xb0, 0x11, 0xd0, 0xb0, 0x1f, 0x10, 0xb1, 0x22, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x30, 0x1f, 0x09, 0x11, 0x12, \n\t0x39, 0xb0, 0x30, 0x10, 0xb0, 0x26, 0xd0, 0xb0, 0x09, 0x10, 0xb1, 0x37, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x13, 0x34, 0x36, 0x37, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, \n\t0x15, 0x14, 0x06, 0x07, 0x07, 0x01, 0x36, 0x36, 0x35, 0x33, 0x14, 0x06, \n\t0x07, 0x17, 0x07, 0x21, 0x27, 0x06, 0x06, 0x23, 0x22, 0x24, 0x05, 0x32, \n\t0x36, 0x37, 0x01, 0x07, 0x06, 0x06, 0x15, 0x14, 0x16, 0x03, 0x14, 0x16, \n\t0x17, 0x37, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x3d, 0x82, \n\t0x85, 0x44, 0x43, 0xd8, 0xb5, 0x9f, 0xc7, 0x62, 0x55, 0x5d, 0x01, 0x14, \n\t0x24, 0x28, 0xda, 0x44, 0x46, 0xd0, 0x02, 0xfe, 0xbc, 0x4d, 0x55, 0xb4, \n\t0x67, 0xda, 0xfe, 0xfe, 0x01, 0xeb, 0x35, 0x6a, 0x31, 0xfe, 0xd4, 0x13, \n\t0x33, 0x25, 0x6e, 0x0d, 0x2b, 0x2b, 0x56, 0x38, 0x27, 0x49, 0x3b, 0x41, \n\t0x46, 0x01, 0x88, 0x76, 0xab, 0x5d, 0x5c, 0x98, 0x4f, 0xad, 0xcf, 0xc5, \n\t0x8c, 0x62, 0xa2, 0x3d, 0x42, 0xfe, 0xbe, 0x3c, 0x8c, 0x4e, 0x8a, 0xe8, \n\t0x5a, 0xf4, 0x05, 0x59, 0x37, 0x37, 0xe5, 0x05, 0x1b, 0x1b, 0x01, 0x5c, \n\t0x0d, 0x30, 0x5b, 0x2e, 0x59, 0x73, 0x03, 0x81, 0x2b, 0x5b, 0x37, 0x38, \n\t0x24, 0x4c, 0x2d, 0x32, 0x4e, 0x57, 0x00, 0x00, 0x00, 0x01, 0x00, 0x32, \n\t0x03, 0xf0, 0x01, 0x18, 0x06, 0x18, 0x00, 0x04, 0x00, 0x10, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x1a, 0x3e, 0x59, \n\t0x30, 0x31, 0x01, 0x03, 0x23, 0x11, 0x33, 0x01, 0x18, 0x66, 0x80, 0xe6, \n\t0x05, 0x0b, 0xfe, 0xe5, 0x02, 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x7c, \n\t0xfe, 0x3e, 0x02, 0xa7, 0x06, 0x4c, 0x00, 0x11, 0x00, 0x09, 0x00, 0xb0, \n\t0x03, 0x2f, 0xb0, 0x0d, 0x2f, 0x30, 0x31, 0x13, 0x10, 0x00, 0x37, 0x33, \n\t0x17, 0x06, 0x02, 0x11, 0x15, 0x10, 0x12, 0x17, 0x07, 0x23, 0x26, 0x00, \n\t0x11, 0x7c, 0x01, 0x30, 0xc0, 0x06, 0x35, 0x83, 0xb2, 0xb2, 0x83, 0x35, \n\t0x06, 0xc0, 0xfe, 0xd0, 0x02, 0x50, 0x01, 0x88, 0x02, 0x23, 0x51, 0x92, \n\t0x62, 0xfe, 0x4c, 0xfe, 0xae, 0x1a, 0xfe, 0xad, 0xfe, 0x4d, 0x65, 0x8f, \n\t0x51, 0x02, 0x22, 0x01, 0x89, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1f, \n\t0xfe, 0x3e, 0x02, 0x5a, 0x06, 0x4c, 0x00, 0x11, 0x00, 0x09, 0x00, 0xb0, \n\t0x03, 0x2f, 0xb0, 0x0d, 0x2f, 0x30, 0x31, 0x01, 0x10, 0x00, 0x07, 0x23, \n\t0x27, 0x36, 0x12, 0x11, 0x35, 0x10, 0x02, 0x27, 0x37, 0x33, 0x16, 0x00, \n\t0x11, 0x02, 0x5a, 0xfe, 0xc3, 0xc2, 0x06, 0x36, 0x81, 0xb4, 0xb6, 0x7f, \n\t0x36, 0x06, 0xc2, 0x01, 0x3d, 0x02, 0x3a, 0xfe, 0x81, 0xfd, 0xd3, 0x50, \n\t0x8f, 0x62, 0x01, 0xb6, 0x01, 0x53, 0x1a, 0x01, 0x50, 0x01, 0xb9, 0x63, \n\t0x8e, 0x50, 0xfd, 0xd2, 0xfe, 0x82, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1b, \n\t0x02, 0x43, 0x03, 0x6e, 0x05, 0xb0, 0x00, 0x0e, 0x00, 0x19, 0x00, 0xb0, \n\t0x0d, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, \n\t0x10, 0x3e, 0x59, 0xb0, 0x0d, 0x10, 0xb0, 0x0b, 0xd0, 0x30, 0x31, 0x01, \n\t0x25, 0x37, 0x05, 0x03, 0x33, 0x03, 0x25, 0x17, 0x05, 0x13, 0x07, 0x03, \n\t0x03, 0x27, 0x01, 0x49, 0xfe, 0xd2, 0x39, 0x01, 0x29, 0x12, 0xbb, 0x13, \n\t0x01, 0x23, 0x38, 0xfe, 0xce, 0xc8, 0x98, 0xae, 0xad, 0x99, 0x03, 0xc6, \n\t0x59, 0xb1, 0x7b, 0x01, 0x5b, 0xfe, 0x9f, 0x78, 0xb4, 0x59, 0xfe, 0xf7, \n\t0x6e, 0x01, 0x22, 0xfe, 0xe7, 0x6a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x38, \n\t0x00, 0x92, 0x04, 0x1e, 0x04, 0xb6, 0x00, 0x0b, 0x00, 0x19, 0x00, 0xb0, \n\t0x09, 0x2f, 0xb0, 0x00, 0xd0, 0xb0, 0x09, 0x10, 0xb0, 0x06, 0xb0, 0x0a, \n\t0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x03, 0xd0, 0x30, 0x31, 0x01, \n\t0x21, 0x15, 0x21, 0x11, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x02, \n\t0xb6, 0x01, 0x68, 0xfe, 0x98, 0xfe, 0xec, 0xfe, 0x96, 0x01, 0x6a, 0x01, \n\t0x14, 0x03, 0x2c, 0xfc, 0xfe, 0x62, 0x01, 0x9e, 0xfc, 0x01, 0x8a, 0x00, \n\t0x00, 0x01, 0x00, 0x3f, 0xfe, 0xd2, 0x01, 0xa1, 0x00, 0xfa, 0x00, 0x05, \n\t0x00, 0x06, 0x00, 0xb0, 0x04, 0x2f, 0x30, 0x31, 0x25, 0x03, 0x23, 0x13, \n\t0x35, 0x21, 0x01, 0xa1, 0x9f, 0xc3, 0x46, 0x01, 0x1c, 0x0d, 0xfe, 0xc5, \n\t0x01, 0x44, 0xe4, 0x00, 0x00, 0x01, 0x00, 0x71, 0x01, 0xfe, 0x02, 0xa5, \n\t0x02, 0xdf, 0x00, 0x03, 0x00, 0x10, 0x00, 0xb0, 0x03, 0x2f, 0xb0, 0x00, \n\t0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, 0x01, 0x21, \n\t0x35, 0x21, 0x02, 0xa5, 0xfd, 0xcc, 0x02, 0x34, 0x01, 0xfe, 0xe1, 0x00, \n\t0x00, 0x01, 0x00, 0x90, 0x00, 0x00, 0x01, 0xb4, 0x01, 0x00, 0x00, 0x03, \n\t0x00, 0x1a, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, \n\t0x00, 0x0a, 0x3e, 0x59, 0xb0, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, \n\t0xdc, 0x59, 0x30, 0x31, 0x21, 0x21, 0x11, 0x21, 0x01, 0xb4, 0xfe, 0xdc, \n\t0x01, 0x24, 0x01, 0x00, 0x00, 0x01, 0xff, 0xf2, 0xff, 0x83, 0x03, 0x24, \n\t0x05, 0xb0, 0x00, 0x03, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x10, 0x3e, 0x59, 0x30, \n\t0x31, 0x05, 0x21, 0x01, 0x21, 0x01, 0x0e, 0xfe, 0xe4, 0x02, 0x16, 0x01, \n\t0x1c, 0x7d, 0x06, 0x2d, 0x00, 0x02, 0x00, 0x5f, 0xff, 0xeb, 0x04, 0x38, \n\t0x05, 0xc5, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x3b, 0x00, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x10, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0a, 0x3e, 0x59, 0xb0, \n\t0x0a, 0x10, 0xb1, 0x11, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x18, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x10, 0x00, 0x23, 0x22, \n\t0x00, 0x11, 0x11, 0x10, 0x00, 0x33, 0x32, 0x00, 0x11, 0x25, 0x34, 0x26, \n\t0x23, 0x22, 0x06, 0x15, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x04, \n\t0x38, 0xfe, 0xf7, 0xe2, 0xe4, 0xfe, 0xf6, 0x01, 0x09, 0xe3, 0xe2, 0x01, \n\t0x0b, 0xfe, 0xdd, 0x68, 0x62, 0x63, 0x66, 0x67, 0x64, 0x62, 0x66, 0x02, \n\t0x37, 0xfe, 0xdf, 0xfe, 0xd5, 0x01, 0x2b, 0x01, 0x21, 0x01, 0x41, 0x01, \n\t0x20, 0x01, 0x2d, 0xfe, 0xd3, 0xfe, 0xe0, 0x1e, 0xad, 0xa1, 0xa0, 0xae, \n\t0xfe, 0x85, 0xb0, 0xa0, 0xa0, 0xb0, 0x00, 0x00, 0x00, 0x01, 0x00, 0xab, \n\t0x00, 0x00, 0x02, 0xf7, 0x05, 0xb0, 0x00, 0x05, 0x00, 0x33, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x10, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, \n\t0x59, 0xb2, 0x04, 0x05, 0x00, 0x11, 0x12, 0x39, 0xb0, 0x04, 0x2f, 0xb1, \n\t0x03, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, \n\t0x31, 0x21, 0x21, 0x11, 0x21, 0x35, 0x25, 0x02, 0xf7, 0xfe, 0xdc, 0xfe, \n\t0xd8, 0x02, 0x4c, 0x04, 0xae, 0xce, 0x34, 0x00, 0x00, 0x01, 0x00, 0x47, \n\t0x00, 0x00, 0x04, 0x45, 0x05, 0xc5, 0x00, 0x1a, 0x00, 0x48, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x10, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, \n\t0x59, 0xb2, 0x03, 0x00, 0x11, 0x11, 0x12, 0x39, 0xb0, 0x11, 0x10, 0xb1, \n\t0x09, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x03, 0x10, 0xb0, 0x17, 0xd0, 0xb0, 0x00, 0x10, 0xb1, 0x19, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x21, 0x21, \n\t0x35, 0x01, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x21, \n\t0x27, 0x26, 0x00, 0x33, 0x32, 0x04, 0x15, 0x14, 0x06, 0x07, 0x01, 0x17, \n\t0x21, 0x04, 0x45, 0xfc, 0x1e, 0x01, 0xd7, 0x66, 0x56, 0x63, 0x5b, 0x65, \n\t0x69, 0xfe, 0xe4, 0x02, 0x05, 0x01, 0x0d, 0xe4, 0xe1, 0x01, 0x01, 0x91, \n\t0xa7, 0xfe, 0xfd, 0x02, 0x02, 0x64, 0xbf, 0x01, 0xf9, 0x75, 0xa1, 0x45, \n\t0x5c, 0x75, 0x89, 0x72, 0x06, 0xc5, 0x01, 0x11, 0xea, 0xc3, 0x84, 0xdf, \n\t0xb5, 0xfe, 0xe5, 0x05, 0x00, 0x01, 0x00, 0x41, 0xff, 0xeb, 0x04, 0x35, \n\t0x05, 0xc5, 0x00, 0x2a, 0x00, 0x6a, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x1b, 0x2f, 0x1b, 0xb1, 0x1b, 0x0a, 0x3e, 0x59, 0xb0, 0x0f, \n\t0x10, 0xb1, 0x07, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x0f, 0x10, 0xb0, 0x0a, 0xd0, 0xb0, 0x00, 0x10, 0xb1, 0x29, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x15, \n\t0x29, 0x00, 0x11, 0x12, 0x39, 0xb0, 0x1b, 0x10, 0xb0, 0x20, 0xd0, 0xb0, \n\t0x1b, 0x10, 0xb1, 0x23, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0x30, 0x31, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, \n\t0x22, 0x06, 0x15, 0x21, 0x27, 0x26, 0x24, 0x33, 0x32, 0x04, 0x15, 0x14, \n\t0x06, 0x07, 0x16, 0x16, 0x15, 0x14, 0x04, 0x23, 0x22, 0x24, 0x37, 0x37, \n\t0x21, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x01, \n\t0x8a, 0xa4, 0x68, 0x64, 0x64, 0x5f, 0x52, 0x70, 0xfe, 0xe5, 0x02, 0x06, \n\t0x01, 0x12, 0xcb, 0xe2, 0x01, 0x0d, 0x78, 0x69, 0x79, 0x7f, 0xfe, 0xdd, \n\t0xe3, 0xcb, 0xfe, 0xdd, 0x05, 0x02, 0x01, 0x1b, 0x78, 0x5c, 0x65, 0x75, \n\t0x73, 0x70, 0xa4, 0x03, 0x54, 0x6d, 0x61, 0x58, 0x6a, 0x60, 0x4e, 0x06, \n\t0xab, 0xde, 0xd8, 0xc8, 0x5f, 0xab, 0x30, 0x2b, 0xb2, 0x76, 0xc8, 0xe5, \n\t0xd7, 0xc4, 0x06, 0x54, 0x6d, 0x70, 0x60, 0x73, 0x6b, 0x00, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x39, 0x00, 0x00, 0x04, 0x60, 0x05, 0xb0, 0x00, 0x0a, \n\t0x00, 0x0f, 0x00, 0x41, 0x00, 0xb0, 0x03, 0x2f, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0a, 0x3e, 0x59, 0xb0, 0x03, \n\t0x10, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x03, 0x10, 0xb0, 0x06, 0xd0, 0xb0, 0x00, 0x10, 0xb0, 0x0c, \n\t0xd0, 0xb0, 0x09, 0x10, 0xb0, 0x0e, 0xd0, 0x30, 0x31, 0x01, 0x33, 0x15, \n\t0x23, 0x11, 0x21, 0x11, 0x21, 0x27, 0x01, 0x21, 0x01, 0x21, 0x11, 0x27, \n\t0x07, 0x03, 0xbb, 0xa5, 0xa5, 0xfe, 0xdd, 0xfd, 0xae, 0x0d, 0x02, 0x5c, \n\t0x01, 0x26, 0xfd, 0x8e, 0x01, 0x4f, 0x06, 0x17, 0x02, 0x1e, 0xe2, 0xfe, \n\t0xc4, 0x01, 0x3c, 0xaf, 0x03, 0xc5, 0xfc, 0x6e, 0x02, 0x0c, 0x02, 0x29, \n\t0x00, 0x01, 0x00, 0x69, 0xff, 0xeb, 0x04, 0x3b, 0x05, 0xb0, 0x00, 0x1f, \n\t0x00, 0x55, 0x00, 0xb0, 0x08, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, \n\t0x2f, 0x1b, 0xb1, 0x01, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x0a, 0x3e, 0x59, 0xb0, 0x01, 0x10, 0xb1, \n\t0x03, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, \n\t0x7f, 0x08, 0x01, 0x5d, 0xb0, 0x0e, 0x10, 0xb1, 0x16, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x08, 0x10, 0xb1, 0x1c, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x1f, \n\t0xd0, 0x30, 0x31, 0x13, 0x13, 0x21, 0x15, 0x21, 0x03, 0x36, 0x36, 0x37, \n\t0x36, 0x12, 0x15, 0x14, 0x02, 0x23, 0x22, 0x24, 0x37, 0x37, 0x25, 0x14, \n\t0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x88, \n\t0x54, 0x03, 0x2c, 0xfd, 0xc3, 0x28, 0x28, 0x72, 0x45, 0xd2, 0xe7, 0xfd, \n\t0xee, 0xc9, 0xfe, 0xe2, 0x05, 0x02, 0x01, 0x19, 0x6e, 0x59, 0x66, 0x61, \n\t0x68, 0x66, 0x54, 0x59, 0x13, 0x02, 0x85, 0x03, 0x2b, 0xea, 0xfe, 0xb0, \n\t0x1e, 0x27, 0x01, 0x03, 0xfe, 0xfc, 0xe8, 0xd2, 0xfe, 0xea, 0xdb, 0xc0, \n\t0x05, 0x0e, 0x61, 0x6d, 0x91, 0x75, 0x7e, 0x98, 0x3e, 0x35, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x63, 0xff, 0xeb, 0x04, 0x56, 0x05, 0xc5, 0x00, 0x1a, \n\t0x00, 0x27, 0x00, 0x4d, 0x00, 0xb0, 0x0e, 0x2f, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x14, 0x2f, 0x1b, 0xb1, 0x14, 0x0a, 0x3e, 0x59, 0xb0, 0x00, \n\t0x10, 0xb1, 0x07, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x0e, 0x10, 0xb1, 0x1b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x14, 0x10, 0xb1, 0x22, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x32, 0x16, \n\t0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x06, 0x17, 0x17, 0x36, 0x36, 0x33, \n\t0x32, 0x12, 0x15, 0x14, 0x00, 0x23, 0x22, 0x00, 0x11, 0x11, 0x10, 0x00, \n\t0x13, 0x22, 0x06, 0x07, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, \n\t0x26, 0x02, 0xac, 0x52, 0x8b, 0x46, 0x34, 0x42, 0x67, 0x44, 0x85, 0xa1, \n\t0x06, 0x03, 0x31, 0x96, 0x5e, 0xc3, 0xdd, 0xfe, 0xef, 0xd9, 0xe7, 0xfe, \n\t0xde, 0x01, 0x4a, 0xbc, 0x51, 0x72, 0x1f, 0x7d, 0x68, 0x5a, 0x6d, 0x6e, \n\t0x05, 0xc5, 0x1f, 0x1e, 0xd6, 0x17, 0x17, 0xc7, 0xb0, 0x05, 0x33, 0x3a, \n\t0xfe, 0xeb, 0xd7, 0xdc, 0xfe, 0xe2, 0x01, 0x39, 0x01, 0x15, 0x01, 0x1c, \n\t0x01, 0x1e, 0x01, 0x52, 0xfd, 0x2f, 0x34, 0x2d, 0x61, 0xad, 0xba, 0xa5, \n\t0x75, 0x79, 0x96, 0x00, 0x00, 0x01, 0x00, 0x3c, 0x00, 0x00, 0x04, 0x41, \n\t0x05, 0xb0, 0x00, 0x0c, 0x00, 0x2f, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0a, 0x3e, 0x59, 0xb0, 0x0b, 0x10, \n\t0xb1, 0x09, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x00, 0xd0, 0x30, 0x31, 0x01, 0x02, 0x02, 0x03, 0x07, 0x21, 0x37, \n\t0x12, 0x12, 0x37, 0x21, 0x35, 0x21, 0x04, 0x41, 0xea, 0xab, 0x25, 0x0e, \n\t0xfe, 0xdc, 0x0e, 0x22, 0xe0, 0xc3, 0xfd, 0x14, 0x04, 0x05, 0x04, 0xcf, \n\t0xfe, 0xee, 0xfe, 0x26, 0xfe, 0xb1, 0x94, 0x94, 0x01, 0x41, 0x02, 0x19, \n\t0xe1, 0xe1, 0x00, 0x00, 0x00, 0x03, 0x00, 0x5b, 0xff, 0xeb, 0x04, 0x3c, \n\t0x05, 0xc5, 0x00, 0x17, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x64, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x2d, 0x2f, 0x1b, 0xb1, 0x2d, 0x16, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x15, 0x2f, 0x1b, 0xb1, 0x15, 0x10, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x2d, 0x10, 0xb1, 0x1b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0f, 0x1b, 0x2d, 0x11, 0x12, 0x39, \n\t0xb0, 0x0f, 0x10, 0xb0, 0x03, 0xd0, 0xb0, 0x09, 0x10, 0xb1, 0x21, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x15, 0x10, \n\t0xb1, 0x27, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x01, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, 0x14, 0x04, 0x23, \n\t0x22, 0x24, 0x35, 0x34, 0x36, 0x37, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, \n\t0x32, 0x04, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, \n\t0x32, 0x36, 0x03, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, \n\t0x32, 0x36, 0x04, 0x1a, 0x73, 0x65, 0x74, 0x86, 0xfe, 0xee, 0xdd, 0xdf, \n\t0xfe, 0xed, 0x85, 0x75, 0x66, 0x72, 0xfe, 0xd0, 0xcf, 0x01, 0x00, 0xfe, \n\t0xfe, 0x72, 0x5b, 0x5c, 0x6f, 0x70, 0x5d, 0x5b, 0x70, 0x21, 0x5d, 0x4f, \n\t0x50, 0x5a, 0x5b, 0x51, 0x4f, 0x5b, 0x04, 0x2e, 0x6d, 0xa8, 0x2f, 0x31, \n\t0xb6, 0x75, 0xca, 0xd9, 0xd9, 0xca, 0x76, 0xb5, 0x32, 0x2f, 0xa7, 0x6d, \n\t0xc2, 0xd5, 0xd5, 0xfc, 0xb2, 0x62, 0x76, 0x76, 0x62, 0x64, 0x73, 0x74, \n\t0x02, 0xe2, 0x58, 0x6b, 0x69, 0x5a, 0x5b, 0x6b, 0x6b, 0x00, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x52, 0xff, 0xeb, 0x04, 0x30, 0x05, 0xc5, 0x00, 0x1a, \n\t0x00, 0x27, 0x00, 0x4a, 0x00, 0xb0, 0x07, 0x2f, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x14, 0x2f, 0x1b, 0xb1, 0x14, 0x0a, 0x3e, 0x59, 0xb1, 0x00, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x07, \n\t0x10, 0xb1, 0x1b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x0d, 0x10, 0xb1, 0x22, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x25, 0x32, 0x36, 0x35, 0x35, 0x06, \n\t0x06, 0x23, 0x22, 0x02, 0x35, 0x34, 0x00, 0x33, 0x32, 0x00, 0x11, 0x11, \n\t0x10, 0x00, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x13, 0x32, 0x36, \n\t0x37, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x02, 0x08, \n\t0x73, 0x91, 0x31, 0x87, 0x4e, 0xcb, 0xe9, 0x01, 0x14, 0xd5, 0xdf, 0x01, \n\t0x16, 0xfe, 0xc9, 0xf1, 0x4c, 0xa1, 0x45, 0x22, 0x41, 0x7f, 0x7f, 0x48, \n\t0x6c, 0x21, 0x70, 0x60, 0x58, 0x6f, 0x65, 0xcb, 0xab, 0x9f, 0x48, 0x3e, \n\t0x40, 0x01, 0x09, 0xe2, 0xda, 0x01, 0x21, 0xfe, 0xcd, 0xfe, 0xea, 0xfe, \n\t0xa8, 0xfe, 0xf7, 0xfe, 0xd0, 0x1f, 0x1e, 0xd3, 0x19, 0x17, 0x01, 0xea, \n\t0x36, 0x2d, 0x86, 0xa0, 0xa6, 0xa4, 0x76, 0x7c, 0x99, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x90, 0x00, 0x00, 0x01, 0xb4, 0x04, 0x6c, 0x00, 0x26, \n\t0x00, 0x11, 0x00, 0x00, 0x01, 0x07, 0x00, 0x11, 0x00, 0x00, 0x03, 0x6c, \n\t0x00, 0x06, 0x00, 0xb0, 0x06, 0x2f, 0x30, 0x31, 0xff, 0xff, 0x00, 0x72, \n\t0xfe, 0xd2, 0x01, 0xd4, 0x04, 0x6c, 0x00, 0x27, 0x00, 0x11, 0x00, 0x01, \n\t0x03, 0x6c, 0x01, 0x06, 0x00, 0x0f, 0x33, 0x00, 0x00, 0x06, 0x00, 0xb0, \n\t0x02, 0x2f, 0x30, 0x31, 0x00, 0x01, 0x00, 0x36, 0x00, 0x45, 0x03, 0x94, \n\t0x04, 0x05, 0x00, 0x07, 0x00, 0x19, 0x00, 0xb0, 0x05, 0x2f, 0xb1, 0x04, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x00, \n\t0x05, 0x04, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x15, 0x05, 0x11, 0x01, \n\t0x35, 0x01, 0x11, 0x01, 0x53, 0x02, 0x41, 0xfc, 0xa2, 0x03, 0x5e, 0x02, \n\t0x26, 0x06, 0xcb, 0xfe, 0xf0, 0x01, 0x6f, 0xe3, 0x01, 0x6e, 0xfe, 0xf0, \n\t0x00, 0x02, 0x00, 0x88, 0x01, 0x4c, 0x04, 0x08, 0x03, 0xe0, 0x00, 0x03, \n\t0x00, 0x07, 0x00, 0x26, 0x00, 0xb2, 0x00, 0x07, 0x03, 0x2b, 0xb0, 0x00, \n\t0x10, 0xb1, 0x03, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x07, 0x10, 0xb1, 0x04, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x35, 0x21, 0x11, 0x21, \n\t0x35, 0x21, 0x04, 0x08, 0xfc, 0x80, 0x03, 0x80, 0xfc, 0x80, 0x03, 0x80, \n\t0x02, 0xfb, 0xe5, 0xfd, 0x6c, 0xe5, 0x00, 0x00, 0x00, 0x01, 0x00, 0x77, \n\t0x00, 0x45, 0x03, 0xdf, 0x04, 0x05, 0x00, 0x07, 0x00, 0x19, 0x00, 0xb0, \n\t0x04, 0x2f, 0xb1, 0x05, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb2, 0x01, 0x05, 0x04, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, \n\t0x35, 0x25, 0x11, 0x01, 0x15, 0x01, 0x11, 0x02, 0xc1, 0xfd, 0xb6, 0x03, \n\t0x68, 0xfc, 0x98, 0x02, 0x24, 0x06, 0xce, 0x01, 0x0d, 0xfe, 0x92, 0xe3, \n\t0xfe, 0x91, 0x01, 0x0e, 0x00, 0x02, 0x00, 0x1d, 0x00, 0x00, 0x03, 0xcf, \n\t0x05, 0xc5, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x53, 0x00, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x10, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x1b, 0x2f, 0x1b, 0xb1, 0x1b, 0x0a, 0x3e, 0x59, 0xb0, \n\t0x1d, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x00, 0xb0, \n\t0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb2, 0x04, 0x00, 0x11, 0x11, \n\t0x12, 0x39, 0xb0, 0x11, 0x10, 0xb1, 0x09, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x11, 0x10, 0xb0, 0x0c, 0xd0, 0xb0, \n\t0x04, 0x10, 0xb0, 0x17, 0xd0, 0x30, 0x31, 0x01, 0x36, 0x36, 0x37, 0x36, \n\t0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x21, 0x27, 0x26, 0x24, \n\t0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x06, 0x06, 0x15, 0x13, 0x21, \n\t0x35, 0x21, 0x01, 0x44, 0x01, 0x51, 0x79, 0x47, 0x55, 0x61, 0x5a, 0x4a, \n\t0x67, 0x01, 0xfe, 0xe4, 0x02, 0x03, 0x01, 0x03, 0xd0, 0xe0, 0xff, 0x95, \n\t0x70, 0x3d, 0x26, 0x02, 0xfe, 0xda, 0x01, 0x26, 0x01, 0x9e, 0x8c, 0x82, \n\t0x5d, 0x3a, 0x86, 0x53, 0x5c, 0x68, 0x58, 0x55, 0x06, 0xc0, 0xcc, 0xe3, \n\t0xc3, 0x7f, 0xd8, 0x49, 0x2f, 0x5f, 0x53, 0xfe, 0x62, 0xfa, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x31, 0xfe, 0x3b, 0x06, 0xd2, 0x05, 0x8a, 0x00, 0x33, \n\t0x00, 0x43, 0x00, 0x6e, 0x00, 0xb0, 0x0f, 0x2f, 0xb0, 0x31, 0x2f, 0xb0, \n\t0x2b, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, \n\t0x03, 0x0a, 0x3e, 0x59, 0xb1, 0x18, 0x04, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x31, 0x10, 0xb1, 0x1e, 0x04, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x2b, 0x10, 0xb1, 0x24, \n\t0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x09, \n\t0x10, 0xb1, 0x37, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x0f, 0x10, 0xb1, 0x41, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x06, 0x02, 0x23, 0x22, 0x26, \n\t0x27, 0x06, 0x06, 0x23, 0x22, 0x26, 0x37, 0x36, 0x12, 0x33, 0x32, 0x16, \n\t0x17, 0x07, 0x33, 0x03, 0x06, 0x16, 0x33, 0x32, 0x36, 0x37, 0x12, 0x00, \n\t0x21, 0x20, 0x00, 0x03, 0x02, 0x00, 0x21, 0x32, 0x36, 0x37, 0x17, 0x06, \n\t0x06, 0x23, 0x20, 0x00, 0x13, 0x12, 0x00, 0x21, 0x20, 0x00, 0x01, 0x06, \n\t0x16, 0x33, 0x32, 0x36, 0x37, 0x34, 0x34, 0x37, 0x13, 0x26, 0x26, 0x23, \n\t0x22, 0x06, 0x06, 0xc2, 0x09, 0xee, 0xed, 0x4e, 0x72, 0x18, 0x2c, 0x83, \n\t0x58, 0x8d, 0x97, 0x14, 0x19, 0xed, 0xa9, 0x74, 0x8d, 0x54, 0x03, 0x05, \n\t0x33, 0x07, 0x2a, 0x24, 0x73, 0x8b, 0x08, 0x10, 0xfe, 0xcf, 0xfe, 0xc1, \n\t0xfe, 0xd1, 0xfe, 0x96, 0x0f, 0x11, 0x01, 0x46, 0x01, 0x32, 0x55, 0xb5, \n\t0x41, 0x26, 0x43, 0xcf, 0x63, 0xfe, 0x74, 0xfe, 0x53, 0x11, 0x12, 0x01, \n\t0xdb, 0x01, 0x84, 0x01, 0x83, 0x01, 0x9c, 0xfb, 0xfe, 0x0a, 0x39, 0x40, \n\t0x38, 0x5b, 0x24, 0x01, 0x2c, 0x17, 0x2e, 0x19, 0x6f, 0x74, 0x02, 0x01, \n\t0xda, 0xfe, 0xc4, 0x58, 0x4f, 0x52, 0x52, 0xee, 0xc4, 0xfe, 0x01, 0x32, \n\t0x34, 0x36, 0x04, 0xfd, 0xc3, 0x5f, 0x46, 0xda, 0xa7, 0x01, 0x61, 0x01, \n\t0x8c, 0xfe, 0x56, 0xfe, 0x9a, 0xfe, 0x9d, 0xfe, 0x66, 0x28, 0x1e, 0x93, \n\t0x2a, 0x2f, 0x01, 0xf2, 0x01, 0xb1, 0x01, 0xab, 0x02, 0x01, 0xfe, 0x1b, \n\t0xfd, 0xfb, 0x7f, 0x83, 0x34, 0x46, 0x04, 0x05, 0x04, 0x01, 0xf0, 0x07, \n\t0x08, 0xc1, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x00, 0x05, 0x1f, \n\t0x05, 0xb0, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x42, 0x00, 0xb0, 0x00, 0x2f, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x10, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x09, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb0, 0x0b, 0xd0, \n\t0x30, 0x31, 0x01, 0x21, 0x03, 0x21, 0x01, 0x21, 0x01, 0x21, 0x01, 0x21, \n\t0x03, 0x23, 0x03, 0x95, 0xfe, 0x01, 0x63, 0xfe, 0xd9, 0x01, 0xf5, 0x01, \n\t0x2b, 0x01, 0xf3, 0xfe, 0xd9, 0xfd, 0xe6, 0x01, 0x6f, 0xb4, 0x06, 0x01, \n\t0x3a, 0xfe, 0xc6, 0x05, 0xb0, 0xfa, 0x50, 0x02, 0x1f, 0x02, 0x3c, 0x00, \n\t0x00, 0x03, 0x00, 0x88, 0x00, 0x00, 0x04, 0xca, 0x05, 0xb0, 0x00, 0x0e, \n\t0x00, 0x17, 0x00, 0x20, 0x00, 0x5e, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x18, 0x2f, 0x1b, 0xb1, 0x18, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, 0x59, 0xb0, 0x18, \n\t0x10, 0xb1, 0x0f, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb2, 0x08, 0x0f, 0x18, 0x11, 0x12, 0x39, 0xb0, 0x00, 0x10, 0xb1, \n\t0x10, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x01, 0x10, 0xb1, 0x1f, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0x30, 0x31, 0x33, 0x11, 0x21, 0x20, 0x04, 0x15, 0x14, 0x06, \n\t0x07, 0x16, 0x16, 0x15, 0x14, 0x04, 0x23, 0x01, 0x11, 0x21, 0x32, 0x36, \n\t0x35, 0x34, 0x26, 0x23, 0x25, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, \n\t0x23, 0x88, 0x01, 0xec, 0x01, 0x01, 0x01, 0x20, 0x6b, 0x66, 0x83, 0x83, \n\t0xfe, 0xec, 0xfd, 0xfe, 0xf3, 0x01, 0x0d, 0x74, 0x7a, 0x68, 0x70, 0xfe, \n\t0xdd, 0xd2, 0x75, 0x7e, 0x7f, 0x7e, 0xc8, 0x05, 0xb0, 0xc8, 0xc7, 0x65, \n\t0x9f, 0x28, 0x1c, 0xb8, 0x79, 0xd1, 0xd7, 0x02, 0x84, 0xfe, 0x5c, 0x65, \n\t0x63, 0x6b, 0x71, 0xca, 0x60, 0x5c, 0x65, 0x60, 0x00, 0x01, 0x00, 0x5d, \n\t0xff, 0xeb, 0x04, 0xdb, 0x05, 0xc5, 0x00, 0x1d, 0x00, 0x3b, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x10, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x0b, 0x10, 0xb1, 0x13, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x1a, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x17, 0x16, \n\t0x00, 0x21, 0x20, 0x00, 0x11, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x07, \n\t0x07, 0x21, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x14, 0x16, 0x33, \n\t0x32, 0x36, 0x35, 0x04, 0xd3, 0x02, 0x04, 0xfe, 0xd9, 0xfe, 0xfa, 0xfe, \n\t0xf9, 0xfe, 0xb8, 0x01, 0x40, 0x01, 0x00, 0x01, 0x0e, 0x01, 0x30, 0x04, \n\t0x02, 0xfe, 0xe4, 0x8a, 0x92, 0x83, 0x9a, 0xa2, 0x8a, 0x89, 0x83, 0x01, \n\t0xef, 0x06, 0xeb, 0xfe, 0xed, 0x01, 0x52, 0x01, 0x0a, 0x01, 0x21, 0x01, \n\t0x09, 0x01, 0x54, 0xfe, 0xeb, 0xef, 0x06, 0x90, 0x99, 0xd5, 0xa5, 0xfe, \n\t0xdd, 0xa7, 0xd5, 0x93, 0x91, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x88, \n\t0x00, 0x00, 0x04, 0xe1, 0x05, 0xb0, 0x00, 0x09, 0x00, 0x13, 0x00, 0x3b, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x10, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x01, 0x10, 0xb1, 0x0a, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x0b, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x33, \n\t0x11, 0x21, 0x20, 0x00, 0x11, 0x15, 0x10, 0x00, 0x21, 0x03, 0x11, 0x33, \n\t0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x88, 0x01, 0xf4, 0x01, 0x0b, \n\t0x01, 0x5a, 0xfe, 0xa6, 0xfe, 0xf5, 0xd0, 0xc1, 0x9d, 0xb2, 0xb2, 0x9d, \n\t0x05, 0xb0, 0xfe, 0xab, 0xfe, 0xf5, 0xf1, 0xfe, 0xf4, 0xfe, 0xad, 0x04, \n\t0xcf, 0xfc, 0x11, 0xd4, 0xab, 0xf3, 0xa9, 0xd4, 0x00, 0x01, 0x00, 0x88, \n\t0x00, 0x00, 0x04, 0x6d, 0x05, 0xb0, 0x00, 0x0b, 0x00, 0x57, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x16, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x10, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x0b, 0x10, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x02, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x06, 0x10, 0xb1, \n\t0x08, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, \n\t0x31, 0x01, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, \n\t0x21, 0x04, 0x07, 0xfd, 0xa5, 0x02, 0xc1, 0xfc, 0x1b, 0x03, 0xe3, 0xfd, \n\t0x41, 0x02, 0x5b, 0x02, 0x80, 0xfe, 0x60, 0xe0, 0x05, 0xb0, 0xe1, 0xfe, \n\t0x92, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x88, 0x00, 0x00, 0x04, 0x74, \n\t0x05, 0xb0, 0x00, 0x09, 0x00, 0x48, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0a, 0x3e, 0x59, 0xb0, 0x09, \n\t0x10, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x04, 0x10, 0xb1, 0x06, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x11, 0x21, 0x11, 0x21, \n\t0x15, 0x21, 0x11, 0x21, 0x04, 0x0e, 0xfd, 0x9e, 0xfe, 0xdc, 0x03, 0xec, \n\t0xfd, 0x38, 0x02, 0x62, 0x02, 0x5d, 0xfd, 0xa3, 0x05, 0xb0, 0xe1, 0xfe, \n\t0x6f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x63, 0xff, 0xeb, 0x04, 0xe6, \n\t0x05, 0xc5, 0x00, 0x20, 0x00, 0x57, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0a, 0x3e, 0x59, 0xb0, 0x0a, 0x10, \n\t0xb0, 0x0e, 0xd0, 0xb0, 0x0a, 0x10, 0xb1, 0x12, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x19, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x1f, 0x03, \n\t0x0a, 0x11, 0x12, 0x39, 0xb0, 0x1f, 0x2f, 0xb1, 0x1e, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x25, 0x06, 0x04, \n\t0x23, 0x20, 0x00, 0x11, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x17, 0x07, \n\t0x21, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x14, 0x16, 0x33, 0x32, \n\t0x36, 0x37, 0x11, 0x21, 0x35, 0x21, 0x04, 0xe6, 0x41, 0xfe, 0xed, 0xd2, \n\t0xfe, 0xf5, 0xfe, 0xae, 0x01, 0x45, 0x01, 0x00, 0x01, 0x0a, 0x01, 0x1b, \n\t0x03, 0x02, 0xfe, 0xed, 0x08, 0x84, 0x7f, 0x86, 0xa4, 0xaa, 0x90, 0x66, \n\t0x7c, 0x20, 0xfe, 0xfe, 0x02, 0x26, 0xc7, 0x56, 0x86, 0x01, 0x4c, 0x01, \n\t0x09, 0x01, 0x30, 0x01, 0x08, 0x01, 0x4d, 0xfe, 0xfd, 0xd3, 0x06, 0x74, \n\t0x87, 0xcf, 0xa3, 0xfe, 0xce, 0xa6, 0xcf, 0x2a, 0x1f, 0x01, 0x0e, 0xca, \n\t0x00, 0x01, 0x00, 0x88, 0x00, 0x00, 0x05, 0x21, 0x05, 0xb0, 0x00, 0x0b, \n\t0x00, 0x53, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, \n\t0x09, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, \n\t0xb1, 0x06, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, \n\t0x1b, 0xb1, 0x0a, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, \n\t0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0a, 0x3e, 0x59, 0xb0, 0x09, 0x10, 0xb1, \n\t0x02, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, \n\t0x31, 0x21, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, \n\t0x21, 0x05, 0x21, 0xfe, 0xdd, 0xfd, 0xae, 0xfe, 0xdc, 0x01, 0x24, 0x02, \n\t0x52, 0x01, 0x23, 0x02, 0x5d, 0xfd, 0xa3, 0x05, 0xb0, 0xfd, 0x8e, 0x02, \n\t0x72, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9a, 0x00, 0x00, 0x01, 0xbe, \n\t0x05, 0xb0, 0x00, 0x03, 0x00, 0x1d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, 0x59, 0x30, 0x31, 0x21, \n\t0x21, 0x11, 0x21, 0x01, 0xbe, 0xfe, 0xdc, 0x01, 0x24, 0x05, 0xb0, 0x00, \n\t0x00, 0x01, 0x00, 0x3a, 0xff, 0xeb, 0x04, 0x0d, 0x05, 0xb0, 0x00, 0x10, \n\t0x00, 0x2f, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, \n\t0x00, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, \n\t0xb1, 0x05, 0x0a, 0x3e, 0x59, 0xb0, 0x09, 0xd0, 0xb0, 0x05, 0x10, 0xb1, \n\t0x0d, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, \n\t0x31, 0x01, 0x21, 0x11, 0x14, 0x04, 0x23, 0x22, 0x24, 0x37, 0x37, 0x21, \n\t0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x02, 0xea, 0x01, 0x23, 0xfe, 0xed, \n\t0xd2, 0xe4, 0xfe, 0xf6, 0x05, 0x02, 0x01, 0x1c, 0x6e, 0x5d, 0x51, 0x71, \n\t0x05, 0xb0, 0xfc, 0x05, 0xd3, 0xf7, 0xde, 0xd8, 0x06, 0x73, 0x69, 0x7d, \n\t0x6d, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x88, 0x00, 0x00, 0x05, 0x39, \n\t0x05, 0xb0, 0x00, 0x0c, 0x00, 0x5a, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x10, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0a, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x06, 0x10, 0xb1, 0x01, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb2, 0x0a, 0x01, 0x06, 0x11, 0x12, 0x39, 0x30, 0x31, \n\t0x01, 0x23, 0x11, 0x21, 0x11, 0x21, 0x11, 0x33, 0x01, 0x21, 0x01, 0x01, \n\t0x21, 0x02, 0x4e, 0xa2, 0xfe, 0xdc, 0x01, 0x24, 0x7f, 0x01, 0x82, 0x01, \n\t0x65, 0xfe, 0x16, 0x02, 0x11, 0xfe, 0x9c, 0x02, 0x60, 0xfd, 0xa0, 0x05, \n\t0xb0, 0xfd, 0xad, 0x02, 0x53, 0xfd, 0x5a, 0xfc, 0xf6, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x88, 0x00, 0x00, 0x04, 0x34, 0x05, 0xb0, 0x00, 0x05, \n\t0x00, 0x29, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, \n\t0x04, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, \n\t0xb1, 0x02, 0x0a, 0x3e, 0x59, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x25, 0x21, 0x15, 0x21, 0x11, \n\t0x21, 0x01, 0xac, 0x02, 0x88, 0xfc, 0x54, 0x01, 0x24, 0xe0, 0xe0, 0x05, \n\t0xb0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x88, 0x00, 0x00, 0x06, 0x72, \n\t0x05, 0xb0, 0x00, 0x11, 0x00, 0x56, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x0a, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0a, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x0a, 0x10, 0xb0, 0x01, 0xd0, 0xb0, 0x03, 0x10, 0xb0, 0x09, 0xd0, \n\t0xb0, 0x00, 0x10, 0xb0, 0x0c, 0xd0, 0x30, 0x31, 0x01, 0x01, 0x33, 0x01, \n\t0x21, 0x11, 0x21, 0x11, 0x13, 0x27, 0x01, 0x23, 0x01, 0x07, 0x13, 0x11, \n\t0x21, 0x11, 0x02, 0x05, 0x01, 0x73, 0x06, 0x01, 0x76, 0x01, 0x7e, 0xfe, \n\t0xdc, 0x1c, 0x06, 0xfe, 0x7a, 0xc4, 0xfe, 0x7c, 0x06, 0x1c, 0xfe, 0xdc, \n\t0x05, 0xb0, 0xfb, 0xcf, 0x04, 0x31, 0xfa, 0x50, 0x01, 0xb2, 0x02, 0x83, \n\t0x01, 0xfb, 0xca, 0x04, 0x32, 0x01, 0xfd, 0x81, 0xfe, 0x4e, 0x05, 0xb0, \n\t0x00, 0x01, 0x00, 0x88, 0x00, 0x00, 0x05, 0x21, 0x05, 0xb0, 0x00, 0x0b, \n\t0x00, 0x43, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, \n\t0x06, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, \n\t0xb1, 0x0a, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, \n\t0x1b, 0xb1, 0x00, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, \n\t0x2f, 0x1b, 0xb1, 0x04, 0x0a, 0x3e, 0x59, 0xb0, 0x06, 0x10, 0xb0, 0x02, \n\t0xd0, 0xb0, 0x00, 0x10, 0xb0, 0x08, 0xd0, 0x30, 0x31, 0x21, 0x21, 0x01, \n\t0x07, 0x11, 0x21, 0x11, 0x21, 0x01, 0x37, 0x11, 0x21, 0x05, 0x21, 0xfe, \n\t0xdd, 0xfd, 0xb4, 0x06, 0xfe, 0xdc, 0x01, 0x24, 0x02, 0x4c, 0x06, 0x01, \n\t0x23, 0x03, 0xe3, 0x01, 0xfc, 0x1e, 0x05, 0xb0, 0xfc, 0x1e, 0x01, 0x03, \n\t0xe1, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5c, 0xff, 0xeb, 0x05, 0x1b, \n\t0x05, 0xc5, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x3b, 0x00, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x10, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0a, 0x3e, 0x59, 0xb0, \n\t0x0a, 0x10, 0xb1, 0x11, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x18, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x10, 0x00, 0x21, 0x20, \n\t0x00, 0x11, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x25, 0x34, 0x26, \n\t0x23, 0x22, 0x06, 0x15, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x05, \n\t0x1b, 0xfe, 0xad, 0xfe, 0xf1, 0xfe, 0xf3, 0xfe, 0xb0, 0x01, 0x4f, 0x01, \n\t0x0d, 0x01, 0x0f, 0x01, 0x54, 0xfe, 0xdc, 0xaa, 0x95, 0x95, 0xa4, 0xa6, \n\t0x94, 0x96, 0xa8, 0x02, 0x55, 0xfe, 0xf4, 0xfe, 0xa2, 0x01, 0x5e, 0x01, \n\t0x0c, 0x01, 0x06, 0x01, 0x0b, 0x01, 0x5f, 0xfe, 0xa1, 0xfe, 0xf5, 0x02, \n\t0xaa, 0xda, 0xd9, 0xab, 0xfe, 0xf8, 0xad, 0xda, 0xda, 0xad, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x88, 0x00, 0x00, 0x04, 0xe7, 0x05, 0xb0, 0x00, 0x0a, \n\t0x00, 0x13, 0x00, 0x3e, 0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x0a, 0x3e, 0x59, 0xb0, 0x00, \n\t0x10, 0xb1, 0x0b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x03, 0x10, 0xb1, 0x12, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x11, 0x21, 0x11, 0x21, 0x32, \n\t0x00, 0x15, 0x14, 0x04, 0x23, 0x25, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, \n\t0x23, 0x21, 0x01, 0xac, 0xfe, 0xdc, 0x02, 0x44, 0xfb, 0x01, 0x20, 0xfe, \n\t0xe0, 0xfb, 0xfe, 0xe0, 0x01, 0x20, 0x7a, 0x7e, 0x7d, 0x7b, 0xfe, 0xe0, \n\t0x02, 0x10, 0xfd, 0xf0, 0x05, 0xb0, 0xff, 0x00, 0xd1, 0xd1, 0xfe, 0xe1, \n\t0x85, 0x67, 0x69, 0x89, 0x00, 0x02, 0x00, 0x5c, 0xff, 0x15, 0x05, 0x66, \n\t0x05, 0xc5, 0x00, 0x13, 0x00, 0x21, 0x00, 0x42, 0x00, 0xb0, 0x05, 0x2f, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x10, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0a, \n\t0x3e, 0x59, 0xb1, 0x1e, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb2, 0x03, 0x09, 0x1e, 0x11, 0x12, 0x39, 0xb0, 0x10, 0x10, \n\t0xb1, 0x17, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x01, 0x14, 0x06, 0x07, 0x17, 0x07, 0x25, 0x06, 0x06, 0x23, \n\t0x20, 0x00, 0x11, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x25, 0x34, \n\t0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, \n\t0x05, 0x1b, 0x56, 0x50, 0xf1, 0xbf, 0xfe, 0xfa, 0x36, 0x74, 0x3e, 0xfe, \n\t0xf3, 0xfe, 0xb0, 0x01, 0x4f, 0x01, 0x0d, 0x01, 0x0f, 0x01, 0x54, 0xfe, \n\t0xdc, 0xaa, 0x95, 0x95, 0xa4, 0xa6, 0x94, 0x96, 0xa8, 0x02, 0x55, 0x84, \n\t0xe1, 0x53, 0xec, 0x9c, 0xfe, 0x13, 0x15, 0x01, 0x5e, 0x01, 0x0c, 0x01, \n\t0x06, 0x01, 0x0b, 0x01, 0x5f, 0xfe, 0xa1, 0xfe, 0xf5, 0x02, 0xaa, 0xda, \n\t0xd9, 0xab, 0xfe, 0xf8, 0xad, 0xda, 0xda, 0xad, 0x00, 0x02, 0x00, 0x88, \n\t0x00, 0x00, 0x05, 0x12, 0x05, 0xb0, 0x00, 0x1a, 0x00, 0x23, 0x00, 0x52, \n\t0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, \n\t0xb1, 0x03, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, \n\t0x1b, 0xb1, 0x01, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, \n\t0x2f, 0x1b, 0xb1, 0x12, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x1b, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0a, \n\t0x00, 0x1b, 0x11, 0x12, 0x39, 0xb0, 0x03, 0x10, 0xb1, 0x22, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x11, \n\t0x21, 0x11, 0x21, 0x32, 0x04, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, \n\t0x15, 0x14, 0x16, 0x17, 0x15, 0x21, 0x26, 0x26, 0x35, 0x35, 0x34, 0x26, \n\t0x23, 0x25, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x21, 0x01, 0xac, \n\t0xfe, 0xdc, 0x02, 0x25, 0xf9, 0x01, 0x19, 0x76, 0x72, 0x81, 0x71, 0x21, \n\t0x28, 0xfe, 0xd3, 0x28, 0x18, 0x77, 0x6c, 0xfe, 0xea, 0xfc, 0x7b, 0x79, \n\t0x79, 0x76, 0xfe, 0xff, 0x02, 0x46, 0xfd, 0xba, 0x05, 0xb0, 0xe3, 0xcb, \n\t0x71, 0xa2, 0x32, 0x26, 0xb2, 0x83, 0x6b, 0x3d, 0x85, 0x20, 0x15, 0x20, \n\t0x96, 0x43, 0x67, 0x6d, 0x79, 0xe1, 0x68, 0x66, 0x64, 0x76, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x55, 0xff, 0xeb, 0x04, 0xbe, 0x05, 0xc5, 0x00, 0x27, \n\t0x00, 0x5d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, \n\t0x09, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1d, 0x2f, 0x1b, \n\t0xb1, 0x1d, 0x0a, 0x3e, 0x59, 0xb2, 0x17, 0x1d, 0x09, 0x11, 0x12, 0x39, \n\t0xb0, 0x17, 0x10, 0xb1, 0x03, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x09, 0x10, 0xb0, 0x0d, 0xd0, 0xb0, 0x09, 0x10, \n\t0xb1, 0x11, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x1d, 0x10, 0xb0, 0x21, 0xd0, 0xb0, 0x1d, 0x10, 0xb1, 0x25, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, \n\t0x34, 0x26, 0x27, 0x24, 0x24, 0x35, 0x34, 0x24, 0x33, 0x32, 0x04, 0x07, \n\t0x07, 0x21, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x17, 0x16, \n\t0x16, 0x15, 0x14, 0x04, 0x23, 0x22, 0x24, 0x37, 0x37, 0x21, 0x14, 0x16, \n\t0x33, 0x32, 0x36, 0x03, 0x9a, 0x77, 0x95, 0xfe, 0xfc, 0xfe, 0xf6, 0x01, \n\t0x31, 0xed, 0xf0, 0x01, 0x2e, 0x05, 0x02, 0xfe, 0xe5, 0x87, 0x7a, 0x75, \n\t0x80, 0x89, 0xa8, 0xf1, 0xf8, 0xfe, 0xd9, 0xf2, 0xee, 0xfe, 0x9e, 0x05, \n\t0x02, 0x01, 0x1c, 0x9f, 0x8e, 0x77, 0x7e, 0x01, 0x7c, 0x54, 0x66, 0x2d, \n\t0x4b, 0xce, 0xb3, 0xb3, 0xe3, 0xff, 0xbb, 0x06, 0x65, 0x7d, 0x68, 0x51, \n\t0x4a, 0x5f, 0x35, 0x43, 0xdc, 0xb3, 0xbb, 0xd8, 0xf5, 0xdd, 0x06, 0x82, \n\t0x79, 0x62, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1c, 0x00, 0x00, 0x04, 0x76, \n\t0x05, 0xb0, 0x00, 0x07, 0x00, 0x2f, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0a, 0x3e, 0x59, 0xb0, 0x06, 0x10, \n\t0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x04, 0xd0, 0x30, 0x31, 0x01, 0x21, 0x11, 0x21, 0x11, 0x21, 0x35, \n\t0x21, 0x04, 0x76, 0xfe, 0x64, 0xfe, 0xdc, 0xfe, 0x66, 0x04, 0x5a, 0x04, \n\t0xcf, 0xfb, 0x31, 0x04, 0xcf, 0xe1, 0x00, 0x00, 0x00, 0x01, 0x00, 0x78, \n\t0xff, 0xeb, 0x05, 0x08, 0x05, 0xb0, 0x00, 0x11, 0x00, 0x36, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x10, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x10, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0a, \n\t0x3e, 0x59, 0xb1, 0x0d, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0x30, 0x31, 0x01, 0x11, 0x14, 0x00, 0x21, 0x20, 0x00, 0x35, \n\t0x11, 0x21, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x05, 0x08, \n\t0xfe, 0xbc, 0xfe, 0xfa, 0xfe, 0xfb, 0xfe, 0xbf, 0x01, 0x25, 0x9a, 0x87, \n\t0x89, 0x9c, 0x05, 0xb0, 0xfc, 0x3a, 0xf5, 0xfe, 0xf6, 0x01, 0x0a, 0xf5, \n\t0x03, 0xc6, 0xfc, 0x3a, 0x90, 0x8f, 0x8e, 0x91, 0x03, 0xc6, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x07, 0x00, 0x00, 0x05, 0x10, 0x05, 0xb0, 0x00, 0x09, \n\t0x00, 0x2d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, \n\t0x04, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, \n\t0xb1, 0x08, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, \n\t0x1b, 0xb1, 0x06, 0x0a, 0x3e, 0x59, 0xb0, 0x01, 0xd0, 0x30, 0x31, 0x01, \n\t0x17, 0x33, 0x37, 0x01, 0x21, 0x01, 0x21, 0x01, 0x21, 0x02, 0x76, 0x12, \n\t0x06, 0x11, 0x01, 0x3d, 0x01, 0x34, 0xfe, 0x11, 0xfe, 0xd4, 0xfe, 0x12, \n\t0x01, 0x34, 0x01, 0x83, 0x4f, 0x4d, 0x04, 0x2f, 0xfa, 0x50, 0x05, 0xb0, \n\t0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x06, 0xfb, 0x05, 0xb0, 0x00, 0x0f, \n\t0x00, 0x56, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, \n\t0x02, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, \n\t0xb1, 0x0a, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, \n\t0x1b, 0xb1, 0x0e, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, \n\t0x2f, 0x1b, 0xb1, 0x04, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0a, 0x3e, 0x59, 0xb0, 0x04, 0x10, 0xb0, \n\t0x00, 0xd0, 0xb0, 0x0e, 0x10, 0xb0, 0x06, 0xd0, 0xb0, 0x08, 0x10, 0xb0, \n\t0x0c, 0xd0, 0x30, 0x31, 0x01, 0x33, 0x13, 0x21, 0x01, 0x21, 0x01, 0x23, \n\t0x01, 0x21, 0x01, 0x21, 0x13, 0x17, 0x01, 0x33, 0x05, 0x08, 0x06, 0xd0, \n\t0x01, 0x1d, 0xfe, 0xac, 0xfe, 0xf1, 0xfe, 0xf5, 0x06, 0xfe, 0xf5, 0xfe, \n\t0xf1, 0xfe, 0xab, 0x01, 0x1e, 0xd1, 0x06, 0x01, 0x11, 0xd7, 0x01, 0xca, \n\t0x03, 0xe6, 0xfa, 0x50, 0x03, 0xc1, 0xfc, 0x3f, 0x05, 0xb0, 0xfc, 0x1b, \n\t0x01, 0x03, 0xe6, 0x00, 0x00, 0x01, 0x00, 0x1f, 0x00, 0x00, 0x05, 0x07, \n\t0x05, 0xb0, 0x00, 0x0b, 0x00, 0x44, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0a, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x0a, 0x3e, 0x59, 0xb2, \n\t0x06, 0x07, 0x0a, 0x11, 0x12, 0x39, 0xb0, 0x06, 0x10, 0xb0, 0x00, 0xd0, \n\t0x30, 0x31, 0x01, 0x01, 0x21, 0x01, 0x01, 0x21, 0x01, 0x01, 0x21, 0x01, \n\t0x01, 0x21, 0x02, 0x89, 0x01, 0x11, 0x01, 0x54, 0xfe, 0x50, 0x01, 0xc9, \n\t0xfe, 0x9f, 0xfe, 0xe7, 0xfe, 0xe7, 0xfe, 0xab, 0x01, 0xbb, 0xfe, 0x50, \n\t0x01, 0x52, 0x03, 0xac, 0x02, 0x04, 0xfd, 0x2e, 0xfd, 0x22, 0x02, 0x0d, \n\t0xfd, 0xf3, 0x02, 0xde, 0x02, 0xd2, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, \n\t0x00, 0x00, 0x05, 0x07, 0x05, 0xb0, 0x00, 0x09, 0x00, 0x3d, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x10, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x10, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x0a, \n\t0x3e, 0x59, 0xb2, 0x00, 0x05, 0x02, 0x11, 0x12, 0x39, 0xb0, 0x00, 0x10, \n\t0xb0, 0x04, 0xd0, 0xb0, 0x00, 0x10, 0xb0, 0x07, 0xd0, 0x30, 0x31, 0x01, \n\t0x33, 0x01, 0x21, 0x01, 0x11, 0x21, 0x11, 0x01, 0x21, 0x02, 0x83, 0x06, \n\t0x01, 0x3e, 0x01, 0x40, 0xfe, 0x0c, 0xfe, 0xdd, 0xfe, 0x15, 0x01, 0x40, \n\t0x03, 0x11, 0x02, 0x9f, 0xfc, 0x50, 0xfe, 0x00, 0x02, 0x0f, 0x03, 0xa1, \n\t0x00, 0x01, 0x00, 0x4d, 0x00, 0x00, 0x04, 0x76, 0x05, 0xb0, 0x00, 0x09, \n\t0x00, 0x46, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, \n\t0x07, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, \n\t0xb1, 0x02, 0x0a, 0x3e, 0x59, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x04, 0x00, 0x02, 0x11, 0x12, 0x39, \n\t0xb0, 0x07, 0x10, 0xb1, 0x05, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb2, 0x09, 0x05, 0x07, 0x11, 0x12, 0x39, 0x30, 0x31, \n\t0x25, 0x21, 0x15, 0x21, 0x35, 0x01, 0x21, 0x35, 0x21, 0x15, 0x01, 0xae, \n\t0x02, 0xc8, 0xfb, 0xd7, 0x02, 0xb4, 0xfd, 0x4d, 0x04, 0x17, 0xe0, 0xe0, \n\t0x98, 0x04, 0x37, 0xe1, 0x92, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x77, \n\t0xfe, 0xb0, 0x02, 0x29, 0x06, 0x9b, 0x00, 0x07, 0x00, 0x27, 0x00, 0xb0, \n\t0x07, 0x2f, 0xb0, 0x04, 0x2f, 0xb0, 0x07, 0x10, 0xb1, 0x00, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb1, \n\t0x03, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, \n\t0x31, 0x01, 0x23, 0x11, 0x33, 0x15, 0x21, 0x11, 0x21, 0x02, 0x29, 0x8d, \n\t0x8d, 0xfe, 0x4e, 0x01, 0xb2, 0x05, 0xc3, 0xf9, 0xc5, 0xd8, 0x07, 0xeb, \n\t0x00, 0x01, 0x00, 0x02, 0xff, 0x83, 0x03, 0x83, 0x05, 0xb0, 0x00, 0x03, \n\t0x00, 0x13, 0x00, 0xb0, 0x02, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, \n\t0x2f, 0x1b, 0xb1, 0x00, 0x10, 0x3e, 0x59, 0x30, 0x31, 0x13, 0x21, 0x01, \n\t0x21, 0x02, 0x01, 0x21, 0x02, 0x60, 0xfe, 0xdf, 0x05, 0xb0, 0xf9, 0xd3, \n\t0x00, 0x01, 0x00, 0x0d, 0xfe, 0xb0, 0x01, 0xbf, 0x06, 0x9b, 0x00, 0x07, \n\t0x00, 0x24, 0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x03, 0x2f, 0xb1, 0x04, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, \n\t0xb1, 0x07, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x13, 0x21, 0x11, 0x21, 0x35, 0x33, 0x11, 0x23, 0x0d, 0x01, \n\t0xb2, 0xfe, 0x4e, 0x8e, 0x8e, 0x06, 0x9b, 0xf8, 0x15, 0xd8, 0x06, 0x3b, \n\t0x00, 0x01, 0x00, 0x2c, 0x02, 0xd9, 0x03, 0x56, 0x05, 0xb0, 0x00, 0x09, \n\t0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, \n\t0x02, 0x10, 0x3e, 0x59, 0xb0, 0x07, 0xd0, 0x30, 0x31, 0x01, 0x23, 0x01, \n\t0x33, 0x01, 0x23, 0x03, 0x27, 0x23, 0x07, 0x01, 0x13, 0xe7, 0x01, 0x2b, \n\t0xd4, 0x01, 0x2b, 0xe7, 0xa5, 0x08, 0x06, 0x07, 0x02, 0xd9, 0x02, 0xd7, \n\t0xfd, 0x29, 0x01, 0x9d, 0x22, 0x22, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, \n\t0xff, 0x25, 0x03, 0x8f, 0x00, 0x00, 0x00, 0x03, 0x00, 0x09, 0x00, 0xb3, \n\t0x03, 0x01, 0x00, 0x04, 0x2b, 0x30, 0x31, 0x05, 0x21, 0x35, 0x21, 0x03, \n\t0x8f, 0xfc, 0x72, 0x03, 0x8e, 0xdb, 0xdb, 0x00, 0x00, 0x01, 0x00, 0x4d, \n\t0x04, 0xbc, 0x02, 0x49, 0x05, 0xc6, 0x00, 0x04, 0x00, 0x3a, 0xb0, 0x00, \n\t0x2f, 0x00, 0xb0, 0x00, 0x2f, 0xb2, 0x5f, 0x00, 0x01, 0x5d, 0xb2, 0xaf, \n\t0x00, 0x01, 0x5d, 0xb2, 0x1f, 0x00, 0x01, 0x71, 0xb2, 0x7f, 0x00, 0x01, \n\t0x5d, 0xb2, 0x3f, 0x00, 0x01, 0x5d, 0xb2, 0x0f, 0x00, 0x01, 0x5d, 0xb0, \n\t0x04, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb6, 0x0f, 0x04, \n\t0x1f, 0x04, 0x2f, 0x04, 0x03, 0x5d, 0x30, 0x31, 0x01, 0x23, 0x01, 0x37, \n\t0x21, 0x02, 0x49, 0xed, 0xfe, 0xf1, 0x02, 0x01, 0x35, 0x04, 0xbc, 0x01, \n\t0x04, 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x37, 0xff, 0xeb, 0x04, 0x0f, \n\t0x04, 0x4e, 0x00, 0x20, 0x00, 0x2b, 0x00, 0x88, 0x00, 0xb0, 0x0d, 0x2f, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x19, 0x2f, 0x1b, 0xb1, 0x19, 0x0e, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, \n\t0x0a, 0x3e, 0x59, 0xb4, 0x7f, 0x0d, 0x8f, 0x0d, 0x02, 0x5d, 0xb2, 0x2f, \n\t0x0d, 0x01, 0x71, 0xb4, 0x4f, 0x0d, 0x5f, 0x0d, 0x02, 0x71, 0xb2, 0xff, \n\t0x0d, 0x01, 0x5d, 0xb2, 0xbf, 0x0d, 0x01, 0x5d, 0xb2, 0x5f, 0x0d, 0x01, \n\t0x5d, 0xb2, 0x2f, 0x0d, 0x01, 0x5d, 0xb0, 0x19, 0x10, 0xb1, 0x11, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x14, 0x0d, \n\t0x19, 0x11, 0x12, 0x39, 0xb0, 0x06, 0x10, 0xb1, 0x21, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0d, 0x10, 0xb1, 0x25, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x21, 0x26, 0x26, 0x27, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, \n\t0x33, 0x33, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x25, 0x27, 0x26, \n\t0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x14, 0x16, 0x17, 0x25, 0x32, 0x36, \n\t0x37, 0x35, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x02, 0xeb, 0x10, 0x17, \n\t0x05, 0x2d, 0x93, 0x66, 0xaa, 0xb8, 0xf5, 0xeb, 0xa3, 0x52, 0x50, 0x47, \n\t0x4d, 0xfe, 0xe6, 0x01, 0x07, 0xfc, 0xcd, 0xc2, 0xf2, 0x17, 0x19, 0xfd, \n\t0xd1, 0x4d, 0x78, 0x15, 0xa3, 0x5d, 0x60, 0x48, 0x25, 0x52, 0x2b, 0x4f, \n\t0x68, 0xaf, 0x97, 0x9f, 0xaf, 0x56, 0x4e, 0x56, 0x45, 0x3d, 0x01, 0x06, \n\t0x89, 0xc7, 0xc5, 0xb6, 0xfe, 0x41, 0x4c, 0x86, 0x42, 0xc3, 0x4c, 0x32, \n\t0x99, 0x5d, 0x42, 0x36, 0x42, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x70, \n\t0xff, 0xeb, 0x04, 0x40, 0x06, 0x18, 0x00, 0x11, 0x00, 0x1f, 0x00, 0x55, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x1a, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, \n\t0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, \n\t0x03, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, \n\t0xb1, 0x08, 0x0a, 0x3e, 0x59, 0xb0, 0x0e, 0x10, 0xb1, 0x15, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, \n\t0x1c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, \n\t0x31, 0x01, 0x14, 0x02, 0x23, 0x22, 0x26, 0x27, 0x07, 0x23, 0x11, 0x21, \n\t0x11, 0x36, 0x36, 0x33, 0x32, 0x12, 0x11, 0x21, 0x34, 0x26, 0x23, 0x22, \n\t0x06, 0x07, 0x11, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x04, 0x40, 0xd8, \n\t0xcc, 0x5e, 0x8d, 0x31, 0x16, 0xfa, 0x01, 0x23, 0x2f, 0x83, 0x55, 0xce, \n\t0xd8, 0xfe, 0xdd, 0x5d, 0x70, 0x44, 0x5e, 0x1b, 0x1b, 0x5f, 0x45, 0x71, \n\t0x5a, 0x01, 0xff, 0xf2, 0xfe, 0xde, 0x4f, 0x4c, 0x86, 0x06, 0x18, 0xfd, \n\t0xaf, 0x41, 0x46, 0xfe, 0xc9, 0xfe, 0xfd, 0x9e, 0xb9, 0x39, 0x35, 0xfe, \n\t0x36, 0x31, 0x34, 0x9f, 0x92, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3e, \n\t0xff, 0xeb, 0x03, 0xf2, 0x04, 0x4e, 0x00, 0x1d, 0x00, 0x44, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x0e, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0a, 0x3e, \n\t0x59, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x08, 0x10, 0xb0, 0x03, 0xd0, 0xb0, 0x0f, 0x10, 0xb0, 0x13, \n\t0xd0, 0xb0, 0x0f, 0x10, 0xb1, 0x17, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x25, 0x32, 0x36, 0x35, 0x21, 0x17, \n\t0x16, 0x06, 0x23, 0x22, 0x00, 0x35, 0x35, 0x34, 0x00, 0x33, 0x32, 0x16, \n\t0x07, 0x07, 0x21, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x15, 0x14, 0x16, \n\t0x02, 0x36, 0x4e, 0x5e, 0x01, 0x09, 0x03, 0x04, 0xff, 0xbd, 0xf2, 0xfe, \n\t0xfa, 0x01, 0x05, 0xf2, 0xc8, 0xf5, 0x04, 0x02, 0xfe, 0xf6, 0x5c, 0x51, \n\t0x74, 0x5f, 0x5f, 0xcb, 0x5b, 0x4c, 0x06, 0xa4, 0xdd, 0x01, 0x32, 0xf0, \n\t0x1e, 0xef, 0x01, 0x34, 0xe4, 0xba, 0x06, 0x54, 0x6f, 0xb4, 0x8e, 0x1e, \n\t0x91, 0xb1, 0x00, 0x00, 0x00, 0x02, 0x00, 0x43, 0xff, 0xeb, 0x04, 0x12, \n\t0x06, 0x18, 0x00, 0x11, 0x00, 0x1f, 0x00, 0x55, 0x00, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x1a, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0e, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x0e, 0x10, 0xb1, 0x15, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x1c, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x13, 0x10, 0x12, \n\t0x33, 0x32, 0x16, 0x17, 0x11, 0x21, 0x11, 0x23, 0x27, 0x06, 0x06, 0x23, \n\t0x22, 0x02, 0x35, 0x21, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x11, 0x26, \n\t0x26, 0x23, 0x22, 0x06, 0x15, 0x43, 0xdd, 0xc9, 0x51, 0x82, 0x31, 0x01, \n\t0x25, 0xfb, 0x18, 0x33, 0x8b, 0x5a, 0xc7, 0xdd, 0x01, 0x23, 0x60, 0x6c, \n\t0x3f, 0x5e, 0x1e, 0x1e, 0x5d, 0x3e, 0x6b, 0x63, 0x02, 0x14, 0x01, 0x00, \n\t0x01, 0x3a, 0x46, 0x41, 0x02, 0x51, 0xf9, 0xe8, 0x84, 0x4b, 0x4e, 0x01, \n\t0x24, 0xf0, 0x8e, 0xa3, 0x33, 0x31, 0x01, 0xcd, 0x33, 0x39, 0xbe, 0x99, \n\t0x00, 0x02, 0x00, 0x4d, 0xff, 0xeb, 0x04, 0x02, 0x04, 0x4f, 0x00, 0x16, \n\t0x00, 0x1f, 0x00, 0x6f, 0x00, 0xb0, 0x0b, 0x2f, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, 0x59, 0xb2, 0xff, \n\t0x0b, 0x01, 0x5d, 0xb2, 0x8f, 0x0b, 0x01, 0x71, 0xb2, 0x9f, 0x0b, 0x01, \n\t0x72, 0xb2, 0x1f, 0x0b, 0x01, 0x72, 0xb2, 0x4f, 0x0b, 0x01, 0x71, 0xb2, \n\t0xbf, 0x0b, 0x01, 0x5d, 0xb4, 0x5f, 0x0b, 0x6f, 0x0b, 0x02, 0x5d, 0xb1, \n\t0x10, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x07, 0x10, 0xb1, 0x17, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x0b, 0x10, 0xb1, 0x1c, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x05, 0x22, 0x00, 0x35, 0x35, \n\t0x34, 0x00, 0x17, 0x32, 0x12, 0x15, 0x15, 0x21, 0x07, 0x16, 0x16, 0x33, \n\t0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x03, 0x22, 0x06, 0x07, 0x17, 0x21, \n\t0x35, 0x34, 0x26, 0x02, 0x4f, 0xea, 0xfe, 0xe8, 0x01, 0x09, 0xdf, 0xdb, \n\t0xf2, 0xfd, 0x7a, 0x02, 0x08, 0x7f, 0x6d, 0x61, 0x80, 0x4c, 0x4f, 0x42, \n\t0xd6, 0x9d, 0x51, 0x5e, 0x0b, 0x03, 0x01, 0x66, 0x57, 0x15, 0x01, 0x2c, \n\t0xe7, 0x28, 0xf1, 0x01, 0x38, 0x01, 0xfe, 0xf8, 0xe1, 0x9f, 0x06, 0x6b, \n\t0x8a, 0x27, 0x2a, 0xb4, 0x36, 0x47, 0x03, 0x82, 0x7c, 0x65, 0x05, 0x1a, \n\t0x5d, 0x6f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1b, 0x00, 0x00, 0x02, 0xec, \n\t0x06, 0x2d, 0x00, 0x17, 0x00, 0x79, 0x00, 0xb0, 0x08, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0e, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x13, 0x2f, 0x1b, 0xb1, 0x13, 0x0e, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x03, 0x10, 0xb1, 0x01, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0xf0, 0x08, 0x01, 0x5d, 0xb2, 0xc0, 0x08, \n\t0x01, 0x71, 0xb2, 0x7f, 0x08, 0x01, 0x5d, 0xb4, 0x2f, 0x08, 0x3f, 0x08, \n\t0x02, 0x5d, 0xb2, 0x30, 0x08, 0x01, 0x71, 0xb2, 0xa0, 0x08, 0x01, 0x5d, \n\t0xb2, 0x00, 0x08, 0x01, 0x72, 0xb0, 0x08, 0x10, 0xb1, 0x0f, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x01, 0x10, 0xb0, \n\t0x15, 0xd0, 0xb0, 0x16, 0xd0, 0x30, 0x31, 0x33, 0x11, 0x23, 0x35, 0x33, \n\t0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, \n\t0x06, 0x15, 0x15, 0x33, 0x15, 0x23, 0x11, 0xbc, 0xa1, 0xa1, 0xd2, 0xbe, \n\t0x25, 0x4d, 0x2e, 0x19, 0x18, 0x2d, 0x1e, 0x47, 0x49, 0xd7, 0xd7, 0x03, \n\t0x6d, 0xcd, 0x78, 0xb6, 0xc5, 0x0b, 0x0a, 0xd9, 0x04, 0x06, 0x4e, 0x49, \n\t0x78, 0xcd, 0xfc, 0x93, 0x00, 0x02, 0x00, 0x43, 0xfe, 0x4b, 0x04, 0x14, \n\t0x04, 0x4e, 0x00, 0x1d, 0x00, 0x2b, 0x00, 0x64, 0x00, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0e, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x0e, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x0c, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1a, 0x2f, 0x1b, 0xb1, 0x1a, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x0c, 0x10, 0xb1, 0x13, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x1a, 0x10, 0xb1, 0x21, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x28, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x13, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x37, 0x33, 0x11, 0x14, 0x04, \n\t0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, \n\t0x06, 0x06, 0x23, 0x22, 0x02, 0x35, 0x21, 0x14, 0x16, 0x33, 0x32, 0x36, \n\t0x37, 0x11, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x43, 0xdf, 0xc9, 0x5b, \n\t0x8a, 0x31, 0x17, 0xfc, 0xfe, 0xeb, 0xf7, 0x52, 0xb8, 0x4e, 0x36, 0x43, \n\t0x8b, 0x52, 0x78, 0x71, 0x30, 0x82, 0x54, 0xc7, 0xdf, 0x01, 0x24, 0x60, \n\t0x6c, 0x43, 0x5d, 0x1c, 0x1c, 0x5d, 0x41, 0x6b, 0x63, 0x02, 0x14, 0x01, \n\t0x00, 0x01, 0x3a, 0x52, 0x4c, 0x8a, 0xfb, 0xcb, 0xd3, 0xe7, 0x2d, 0x27, \n\t0xda, 0x20, 0x21, 0x64, 0x6a, 0x62, 0x3d, 0x40, 0x01, 0x25, 0xef, 0x8e, \n\t0xa3, 0x31, 0x2f, 0x01, 0xd6, 0x31, 0x36, 0xbe, 0x99, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x69, 0x00, 0x00, 0x04, 0x18, 0x06, 0x18, 0x00, 0x13, \n\t0x00, 0x46, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, \n\t0x12, 0x1a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, \n\t0xb1, 0x03, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, \n\t0x1b, 0xb1, 0x07, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, \n\t0x2f, 0x1b, 0xb1, 0x10, 0x0a, 0x3e, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x0c, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x01, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x21, 0x11, 0x34, 0x26, \n\t0x23, 0x22, 0x06, 0x07, 0x11, 0x21, 0x11, 0x21, 0x01, 0x8d, 0x33, 0x94, \n\t0x5a, 0xa9, 0xc1, 0xfe, 0xdc, 0x59, 0x58, 0x3c, 0x5c, 0x1e, 0xfe, 0xdc, \n\t0x01, 0x24, 0x03, 0xb1, 0x4a, 0x53, 0xe1, 0xeb, 0xfd, 0x7e, 0x02, 0x84, \n\t0x7e, 0x69, 0x2b, 0x27, 0xfc, 0xe7, 0x06, 0x18, 0x00, 0x02, 0x00, 0x7f, \n\t0x00, 0x00, 0x01, 0xa3, 0x06, 0x18, 0x00, 0x03, 0x00, 0x07, 0x00, 0x37, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0e, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, \n\t0x1a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, \n\t0x00, 0x0a, 0x3e, 0x59, 0xb0, 0x06, 0x10, 0xb0, 0x05, 0xb0, 0x0a, 0x2b, \n\t0x58, 0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, 0x21, 0x21, 0x11, 0x21, 0x11, \n\t0x21, 0x35, 0x21, 0x01, 0xa3, 0xfe, 0xdc, 0x01, 0x24, 0xfe, 0xdc, 0x01, \n\t0x24, 0x04, 0x3a, 0x01, 0x03, 0xdb, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9e, \n\t0xfe, 0x4b, 0x01, 0xab, 0x06, 0x18, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x48, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x0e, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, \n\t0x1a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, \n\t0x04, 0x0c, 0x3e, 0x59, 0xb1, 0x0b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x12, 0x10, 0xb0, 0x11, 0xb0, 0x0a, 0x2b, \n\t0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb2, 0x50, 0x11, 0x01, 0x5d, 0x30, 0x31, \n\t0x01, 0x11, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, \n\t0x32, 0x36, 0x35, 0x11, 0x01, 0x21, 0x35, 0x21, 0x01, 0xab, 0xca, 0xb4, \n\t0x28, 0x42, 0x25, 0x0e, 0x17, 0x2e, 0x1a, 0x3b, 0x40, 0x01, 0x1f, 0xfe, \n\t0xdb, 0x01, 0x25, 0x04, 0x3a, 0xfb, 0x9e, 0xbe, 0xcf, 0x08, 0x09, 0xdf, \n\t0x06, 0x06, 0x53, 0x56, 0x04, 0x62, 0x01, 0x05, 0xd9, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x70, 0x00, 0x00, 0x04, 0x5e, 0x06, 0x18, 0x00, 0x0c, \n\t0x00, 0x5a, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, \n\t0x06, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, \n\t0xb1, 0x04, 0x1a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, \n\t0x1b, 0xb1, 0x08, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, \n\t0x2f, 0x1b, 0xb1, 0x02, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0a, 0x3e, 0x59, 0xb0, 0x06, 0x10, 0xb1, \n\t0x01, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, \n\t0x0a, 0x01, 0x06, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x23, 0x11, 0x21, \n\t0x11, 0x21, 0x11, 0x33, 0x13, 0x21, 0x01, 0x01, 0x21, 0x01, 0xe4, 0x50, \n\t0xfe, 0xdc, 0x01, 0x24, 0x48, 0xfb, 0x01, 0x52, 0xfe, 0xa6, 0x01, 0x8f, \n\t0xfe, 0xb1, 0x01, 0xc5, 0xfe, 0x3b, 0x06, 0x18, 0xfc, 0x8b, 0x01, 0x97, \n\t0xfe, 0x16, 0xfd, 0xb0, 0x00, 0x01, 0x00, 0x7f, 0x00, 0x00, 0x01, 0xa3, \n\t0x06, 0x18, 0x00, 0x03, 0x00, 0x1d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x1a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, 0x59, 0x30, 0x31, 0x21, \n\t0x21, 0x11, 0x21, 0x01, 0xa3, 0xfe, 0xdc, 0x01, 0x24, 0x06, 0x18, 0x00, \n\t0x00, 0x01, 0x00, 0x70, 0x00, 0x00, 0x06, 0x7c, 0x04, 0x4e, 0x00, 0x25, \n\t0x00, 0x63, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, \n\t0x04, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, \n\t0xb1, 0x0a, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x25, 0x2f, \n\t0x1b, 0xb1, 0x25, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, \n\t0x2f, 0x1b, 0xb1, 0x0e, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x1a, 0x2f, 0x1b, 0xb1, 0x1a, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x23, 0x2f, 0x1b, 0xb1, 0x23, 0x0a, 0x3e, 0x59, 0xb0, 0x0a, 0x10, \n\t0xb1, 0x13, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x1f, 0xd0, 0x30, 0x31, 0x01, 0x17, 0x36, 0x36, 0x33, 0x32, 0x16, \n\t0x17, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x21, 0x11, 0x34, 0x26, \n\t0x23, 0x22, 0x06, 0x07, 0x14, 0x16, 0x15, 0x11, 0x21, 0x11, 0x34, 0x26, \n\t0x23, 0x22, 0x06, 0x07, 0x11, 0x21, 0x11, 0x01, 0x7f, 0x0c, 0x34, 0x9d, \n\t0x67, 0x68, 0x94, 0x26, 0x32, 0xa0, 0x6c, 0xa0, 0xb9, 0xfe, 0xdc, 0x50, \n\t0x4f, 0x3e, 0x5b, 0x1b, 0x02, 0xfe, 0xdd, 0x50, 0x50, 0x3b, 0x59, 0x1d, \n\t0xfe, 0xdd, 0x04, 0x3a, 0x8f, 0x4e, 0x55, 0x5c, 0x5d, 0x57, 0x62, 0xdd, \n\t0xe2, 0xfd, 0x71, 0x02, 0x90, 0x7b, 0x60, 0x37, 0x31, 0x13, 0x1b, 0x0e, \n\t0xfd, 0x39, 0x02, 0x90, 0x78, 0x63, 0x2d, 0x29, 0xfc, 0xeb, 0x04, 0x3a, \n\t0x00, 0x01, 0x00, 0x6b, 0x00, 0x00, 0x04, 0x1a, 0x04, 0x4e, 0x00, 0x13, \n\t0x00, 0x46, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, \n\t0x04, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x13, 0x2f, 0x1b, \n\t0xb1, 0x13, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, \n\t0x1b, 0xb1, 0x08, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x11, \n\t0x2f, 0x1b, 0xb1, 0x11, 0x0a, 0x3e, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x0d, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x01, 0x17, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x21, 0x11, 0x34, \n\t0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x21, 0x11, 0x01, 0x7b, 0x0d, 0x36, \n\t0x9e, 0x62, 0xa4, 0xb8, 0xfe, 0xdb, 0x58, 0x59, 0x3a, 0x5c, 0x1f, 0xfe, \n\t0xdc, 0x04, 0x3a, 0x9b, 0x53, 0x5c, 0xce, 0xdc, 0xfd, 0x5c, 0x02, 0xa3, \n\t0x6d, 0x5b, 0x2f, 0x2b, 0xfc, 0xef, 0x04, 0x3a, 0x00, 0x02, 0x00, 0x43, \n\t0xff, 0xeb, 0x04, 0x40, 0x04, 0x4e, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x38, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0e, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, \n\t0x0a, 0x3e, 0x59, 0xb1, 0x11, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x18, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x13, 0x34, 0x00, 0x33, \n\t0x32, 0x00, 0x15, 0x15, 0x14, 0x00, 0x23, 0x22, 0x00, 0x35, 0x21, 0x14, \n\t0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, \n\t0x43, 0x01, 0x0e, 0xef, 0xf0, 0x01, 0x10, 0xfe, 0xf1, 0xef, 0xf0, 0xfe, \n\t0xf1, 0x01, 0x23, 0x68, 0x74, 0x71, 0x69, 0x6a, 0x72, 0x71, 0x69, 0x02, \n\t0x27, 0xf2, 0x01, 0x35, 0xfe, 0xcc, 0xf3, 0x15, 0xf4, 0xfe, 0xcd, 0x01, \n\t0x33, 0xf4, 0x94, 0xb3, 0xb4, 0x93, 0x15, 0x90, 0xb6, 0xb7, 0x8f, 0x00, \n\t0x00, 0x02, 0x00, 0x70, 0xfe, 0x60, 0x04, 0x40, 0x04, 0x4e, 0x00, 0x11, \n\t0x00, 0x1f, 0x00, 0x55, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, \n\t0x1b, 0xb1, 0x0e, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, \n\t0x2f, 0x1b, 0xb1, 0x09, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0a, 0x3e, 0x59, 0xb0, 0x0e, 0x10, \n\t0xb1, 0x15, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x03, 0x10, 0xb1, 0x1c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x14, 0x02, 0x23, 0x22, 0x26, 0x27, \n\t0x11, 0x21, 0x11, 0x21, 0x17, 0x36, 0x36, 0x33, 0x32, 0x12, 0x11, 0x21, \n\t0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x16, 0x16, 0x33, 0x32, 0x36, \n\t0x35, 0x04, 0x40, 0xde, 0xc7, 0x55, 0x84, 0x2f, 0xfe, 0xdd, 0x01, 0x07, \n\t0x11, 0x30, 0x87, 0x5a, 0xc9, 0xde, 0xfe, 0xdc, 0x66, 0x69, 0x42, 0x5d, \n\t0x1b, 0x1b, 0x5d, 0x44, 0x6a, 0x63, 0x01, 0xff, 0xf0, 0xfe, 0xdc, 0x3f, \n\t0x3d, 0xfd, 0xf9, 0x05, 0xda, 0x80, 0x47, 0x4d, 0xfe, 0xc6, 0xff, 0x00, \n\t0x99, 0xbe, 0x36, 0x32, 0xfe, 0x26, 0x2e, 0x30, 0xa6, 0x8e, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x43, 0xfe, 0x60, 0x04, 0x0f, 0x04, 0x4e, 0x00, 0x11, \n\t0x00, 0x1f, 0x00, 0x52, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, \n\t0x1b, 0xb1, 0x03, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, \n\t0x2f, 0x1b, 0xb1, 0x07, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x0a, 0x3e, 0x59, 0xb1, 0x15, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, \n\t0xb1, 0x1c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x13, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x37, 0x33, 0x11, \n\t0x21, 0x11, 0x06, 0x06, 0x23, 0x22, 0x02, 0x35, 0x21, 0x14, 0x16, 0x33, \n\t0x32, 0x36, 0x37, 0x11, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x43, 0xdd, \n\t0xc9, 0x5a, 0x88, 0x31, 0x1b, 0xf8, 0xfe, 0xdc, 0x30, 0x81, 0x53, 0xc7, \n\t0xdd, 0x01, 0x23, 0x60, 0x6c, 0x40, 0x5c, 0x1d, 0x1d, 0x5b, 0x3f, 0x6b, \n\t0x63, 0x02, 0x14, 0x01, 0x00, 0x01, 0x3a, 0x4f, 0x4a, 0x85, 0xfa, 0x26, \n\t0x02, 0x05, 0x3c, 0x3e, 0x01, 0x24, 0xf0, 0x8e, 0xa6, 0x30, 0x2e, 0x01, \n\t0xe0, 0x30, 0x34, 0xc0, 0x99, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x70, \n\t0x00, 0x00, 0x02, 0xc8, 0x04, 0x4e, 0x00, 0x0f, 0x00, 0x37, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0e, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x0e, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x0c, 0x10, 0xb0, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, \n\t0x1b, 0xdc, 0x59, 0x30, 0x31, 0x01, 0x27, 0x22, 0x06, 0x07, 0x11, 0x21, \n\t0x11, 0x21, 0x17, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x02, 0xa9, 0x6b, \n\t0x41, 0x54, 0x16, 0xfe, 0xdd, 0x01, 0x0f, 0x0d, 0x26, 0x79, 0x4f, 0x16, \n\t0x25, 0x13, 0x03, 0x3f, 0x03, 0x36, 0x31, 0xfd, 0x25, 0x04, 0x3a, 0xa0, \n\t0x55, 0x5f, 0x07, 0x05, 0x00, 0x01, 0x00, 0x3a, 0xff, 0xeb, 0x03, 0xd4, \n\t0x04, 0x4e, 0x00, 0x27, 0x00, 0x74, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x1d, 0x2f, 0x1b, 0xb1, 0x1d, 0x0a, 0x3e, 0x59, 0xb2, 0x17, 0x1d, \n\t0x09, 0x11, 0x12, 0x39, 0xb4, 0x79, 0x17, 0x89, 0x17, 0x02, 0x5d, 0xb0, \n\t0x17, 0x10, 0xb1, 0x02, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb2, 0x0e, 0x09, 0x1d, 0x11, 0x12, 0x39, 0xb4, 0x0b, 0x0e, \n\t0x1b, 0x0e, 0x02, 0x5d, 0xb0, 0x09, 0x10, 0xb1, 0x11, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x22, 0x1d, 0x09, 0x11, \n\t0x12, 0x39, 0xb4, 0x04, 0x22, 0x14, 0x22, 0x02, 0x5d, 0xb0, 0x1d, 0x10, \n\t0xb1, 0x25, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x01, 0x34, 0x26, 0x27, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, \n\t0x32, 0x16, 0x07, 0x07, 0x21, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, \n\t0x16, 0x17, 0x16, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x37, 0x37, \n\t0x21, 0x16, 0x16, 0x33, 0x32, 0x36, 0x02, 0xb9, 0x5d, 0x7e, 0xc0, 0xc3, \n\t0xeb, 0xc5, 0xcf, 0xf5, 0x05, 0x02, 0xfe, 0xe6, 0x53, 0x50, 0x47, 0x51, \n\t0x55, 0x82, 0xc8, 0xc2, 0xfa, 0xcd, 0xd8, 0xfb, 0x06, 0x02, 0x01, 0x0b, \n\t0x03, 0x6c, 0x57, 0x51, 0x55, 0x01, 0x2a, 0x30, 0x46, 0x1b, 0x27, 0x99, \n\t0x84, 0x8c, 0xc3, 0xc2, 0x94, 0x06, 0x41, 0x52, 0x45, 0x34, 0x32, 0x40, \n\t0x19, 0x28, 0x9b, 0x88, 0x92, 0xb9, 0xdb, 0x8c, 0x06, 0x57, 0x4e, 0x40, \n\t0x00, 0x01, 0x00, 0x09, 0xff, 0xeb, 0x02, 0x92, 0x05, 0x43, 0x00, 0x17, \n\t0x00, 0x51, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, \n\t0x01, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x15, 0x2f, 0x1b, \n\t0xb1, 0x15, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, \n\t0x1b, 0xb1, 0x0f, 0x0a, 0x3e, 0x59, 0xb0, 0x01, 0x10, 0xb1, 0x03, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0f, 0x10, \n\t0xb1, 0x08, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x03, 0x10, 0xb0, 0x13, 0xd0, 0xb0, 0x14, 0xd0, 0x30, 0x31, 0x01, \n\t0x11, 0x33, 0x15, 0x23, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, \n\t0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x01, \n\t0xcb, 0xb6, 0xb6, 0x34, 0x2c, 0x17, 0x21, 0x16, 0x19, 0x2c, 0x54, 0x31, \n\t0x97, 0xa3, 0x9e, 0x9e, 0x05, 0x43, 0xfe, 0xf7, 0xcd, 0xfd, 0xd9, 0x3f, \n\t0x36, 0x05, 0x06, 0xd3, 0x0f, 0x0f, 0xa6, 0xb4, 0x02, 0x28, 0xcd, 0x01, \n\t0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0xff, 0xeb, 0x04, 0x18, \n\t0x04, 0x3a, 0x00, 0x13, 0x00, 0x46, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0a, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x13, 0x2f, 0x1b, 0xb1, 0x13, 0x0a, 0x3e, 0x59, 0xb0, \n\t0x03, 0x10, 0xb1, 0x0c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0x30, 0x31, 0x25, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x11, \n\t0x21, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x11, 0x21, 0x11, 0x23, \n\t0x03, 0x05, 0x32, 0x9a, 0x64, 0xab, 0xc1, 0x01, 0x23, 0x50, 0x4e, 0x46, \n\t0x64, 0x20, 0x01, 0x24, 0xf9, 0x9c, 0x55, 0x5c, 0xdb, 0xe7, 0x02, 0x8d, \n\t0xfd, 0x71, 0x76, 0x67, 0x2d, 0x2c, 0x03, 0x13, 0xfb, 0xc6, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x04, 0x07, 0x04, 0x3a, 0x00, 0x09, \n\t0x00, 0x2d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, \n\t0x04, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, \n\t0xb1, 0x08, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, \n\t0x1b, 0xb1, 0x06, 0x0a, 0x3e, 0x59, 0xb0, 0x01, 0xd0, 0x30, 0x31, 0x01, \n\t0x17, 0x33, 0x37, 0x13, 0x21, 0x01, 0x21, 0x01, 0x21, 0x01, 0xf7, 0x13, \n\t0x06, 0x14, 0xb2, 0x01, 0x31, 0xfe, 0x90, 0xfe, 0xe9, 0xfe, 0x90, 0x01, \n\t0x31, 0x01, 0x93, 0x64, 0x64, 0x02, 0xa7, 0xfb, 0xc6, 0x04, 0x3a, 0x00, \n\t0x00, 0x01, 0x00, 0x1d, 0x00, 0x00, 0x05, 0xc2, 0x04, 0x3a, 0x00, 0x0f, \n\t0x00, 0x56, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, \n\t0x02, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, \n\t0xb1, 0x0a, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, \n\t0x1b, 0xb1, 0x0e, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, \n\t0x2f, 0x1b, 0xb1, 0x04, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0a, 0x3e, 0x59, 0xb0, 0x04, 0x10, 0xb0, \n\t0x00, 0xd0, 0xb0, 0x0e, 0x10, 0xb0, 0x06, 0xd0, 0xb0, 0x00, 0x10, 0xb0, \n\t0x0c, 0xd0, 0x30, 0x31, 0x01, 0x33, 0x13, 0x21, 0x01, 0x23, 0x03, 0x23, \n\t0x03, 0x23, 0x01, 0x21, 0x13, 0x33, 0x13, 0x33, 0x04, 0x1d, 0x06, 0x8d, \n\t0x01, 0x12, 0xfe, 0xed, 0xf4, 0xc9, 0x06, 0xc9, 0xf3, 0xfe, 0xed, 0x01, \n\t0x12, 0x8f, 0x06, 0xca, 0xc3, 0x01, 0x83, 0x02, 0xb7, 0xfb, 0xc6, 0x02, \n\t0x84, 0xfd, 0x7c, 0x04, 0x3a, 0xfd, 0x4b, 0x02, 0xb5, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x13, 0x00, 0x00, 0x04, 0x08, 0x04, 0x3a, 0x00, 0x0c, \n\t0x00, 0x44, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, \n\t0x02, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, \n\t0xb1, 0x0b, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, \n\t0x1b, 0xb1, 0x05, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, \n\t0x2f, 0x1b, 0xb1, 0x08, 0x0a, 0x3e, 0x59, 0xb2, 0x07, 0x08, 0x0b, 0x11, \n\t0x12, 0x39, 0xb0, 0x07, 0x10, 0xb0, 0x00, 0xd0, 0x30, 0x31, 0x01, 0x33, \n\t0x13, 0x21, 0x01, 0x01, 0x21, 0x03, 0x03, 0x21, 0x01, 0x01, 0x21, 0x02, \n\t0x07, 0x06, 0xa6, 0x01, 0x4a, 0xfe, 0xba, 0x01, 0x51, 0xfe, 0xb7, 0xb1, \n\t0xb1, 0xfe, 0xb6, 0x01, 0x51, 0xfe, 0xb9, 0x01, 0x48, 0x02, 0xe2, 0x01, \n\t0x58, 0xfd, 0xe9, 0xfd, 0xdd, 0x01, 0x67, 0xfe, 0x99, 0x02, 0x23, 0x02, \n\t0x17, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0xfe, 0x4b, 0x04, 0x11, \n\t0x04, 0x3a, 0x00, 0x15, 0x00, 0x46, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x14, 0x2f, 0x1b, 0xb1, 0x14, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0c, 0x3e, 0x59, 0xb2, 0x13, \n\t0x08, 0x14, 0x11, 0x12, 0x39, 0xb0, 0x13, 0x10, 0xb0, 0x01, 0xd0, 0xb0, \n\t0x08, 0x10, 0xb1, 0x0f, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0x30, 0x31, 0x01, 0x17, 0x33, 0x13, 0x21, 0x01, 0x06, 0x06, \n\t0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x37, \n\t0x01, 0x21, 0x01, 0xf6, 0x0c, 0x06, 0xcf, 0x01, 0x3a, 0xfe, 0x49, 0x2e, \n\t0x9e, 0x9e, 0x25, 0x3f, 0x2d, 0x22, 0x0d, 0x1e, 0x0c, 0x48, 0x4e, 0x15, \n\t0x22, 0xfe, 0x80, 0x01, 0x3a, 0x01, 0xc6, 0x3c, 0x02, 0xb0, 0xfb, 0x24, \n\t0x74, 0x9f, 0x0c, 0x0b, 0xd5, 0x02, 0x04, 0x47, 0x35, 0x54, 0x04, 0x39, \n\t0x00, 0x01, 0x00, 0x4b, 0x00, 0x00, 0x03, 0xce, 0x04, 0x3a, 0x00, 0x09, \n\t0x00, 0x46, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, \n\t0x07, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, \n\t0xb1, 0x02, 0x0a, 0x3e, 0x59, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x04, 0x00, 0x02, 0x11, 0x12, 0x39, \n\t0xb0, 0x07, 0x10, 0xb1, 0x05, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb2, 0x09, 0x05, 0x07, 0x11, 0x12, 0x39, 0x30, 0x31, \n\t0x25, 0x21, 0x15, 0x21, 0x35, 0x01, 0x21, 0x35, 0x21, 0x15, 0x01, 0xb6, \n\t0x02, 0x18, 0xfc, 0x7d, 0x02, 0x03, 0xfe, 0x0d, 0x03, 0x62, 0xe0, 0xe0, \n\t0xac, 0x02, 0xac, 0xe2, 0xa7, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x30, \n\t0xfe, 0x98, 0x02, 0x81, 0x06, 0x3d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0xb0, \n\t0x0f, 0x2f, 0xb0, 0x00, 0x2f, 0xb0, 0x08, 0x2f, 0xb1, 0x07, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x17, 0x07, 0x08, \n\t0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x26, 0x26, 0x35, 0x35, 0x34, 0x26, \n\t0x23, 0x35, 0x32, 0x36, 0x35, 0x35, 0x34, 0x36, 0x37, 0x17, 0x06, 0x06, \n\t0x15, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, 0x15, 0x14, 0x16, 0x17, \n\t0x02, 0x49, 0xc3, 0xa5, 0x57, 0x5a, 0x5a, 0x57, 0xa5, 0xc3, 0x38, 0x55, \n\t0x46, 0x59, 0x5a, 0x5a, 0x59, 0x46, 0x55, 0xfe, 0x98, 0x37, 0xf0, 0xab, \n\t0xcb, 0x63, 0x6e, 0xc9, 0x6d, 0x65, 0xcb, 0xab, 0xef, 0x37, 0x9d, 0x1f, \n\t0x9f, 0x76, 0xcb, 0x68, 0xa1, 0x2d, 0x2f, 0xa1, 0x66, 0xcb, 0x76, 0x9f, \n\t0x1f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xad, 0xfe, 0xf2, 0x01, 0x5d, \n\t0x05, 0xb0, 0x00, 0x03, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x10, 0x3e, 0x59, 0x30, \n\t0x31, 0x01, 0x23, 0x11, 0x33, 0x01, 0x5d, 0xb0, 0xb0, 0xfe, 0xf2, 0x06, \n\t0xbe, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x22, 0xfe, 0x98, 0x02, 0x74, \n\t0x06, 0x3d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0xb0, 0x0f, 0x2f, 0xb0, 0x1e, \n\t0x2f, 0xb0, 0x16, 0x2f, 0xb1, 0x17, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x07, 0x17, 0x16, 0x11, 0x12, 0x39, 0x30, \n\t0x31, 0x17, 0x36, 0x36, 0x35, 0x35, 0x34, 0x36, 0x37, 0x26, 0x26, 0x35, \n\t0x35, 0x34, 0x26, 0x27, 0x37, 0x16, 0x16, 0x15, 0x15, 0x14, 0x16, 0x33, \n\t0x15, 0x22, 0x06, 0x15, 0x15, 0x14, 0x06, 0x07, 0x22, 0x55, 0x46, 0x5c, \n\t0x5e, 0x5e, 0x5c, 0x46, 0x55, 0x38, 0xc2, 0xa6, 0x56, 0x5c, 0x5c, 0x56, \n\t0xa6, 0xc2, 0xca, 0x1f, 0x9f, 0x76, 0xcb, 0x68, 0xa0, 0x2d, 0x2d, 0xa1, \n\t0x69, 0xcb, 0x76, 0x9f, 0x1f, 0x9d, 0x37, 0xef, 0xab, 0xcb, 0x65, 0x6d, \n\t0xc9, 0x6e, 0x63, 0xcb, 0xab, 0xf0, 0x37, 0x00, 0x00, 0x01, 0x00, 0x69, \n\t0x01, 0x7a, 0x04, 0xc4, 0x03, 0x39, 0x00, 0x19, 0x00, 0x2a, 0x00, 0xb0, \n\t0x10, 0x2f, 0xb1, 0x09, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x16, 0xd0, 0xb1, 0x03, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0c, 0xd0, 0xb0, 0x10, 0x10, 0xb0, \n\t0x19, 0xd0, 0x30, 0x31, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x26, \n\t0x26, 0x23, 0x22, 0x06, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, \n\t0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x04, 0xc4, 0xb1, 0x87, 0x55, 0x90, \n\t0x4e, 0x34, 0x4b, 0x2c, 0x34, 0x47, 0xca, 0xad, 0x89, 0x53, 0x97, 0x4c, \n\t0x31, 0x4b, 0x2c, 0x32, 0x4a, 0x02, 0xf6, 0xa1, 0xdb, 0x3f, 0x46, 0x2c, \n\t0x28, 0x66, 0x47, 0x1a, 0xa2, 0xd7, 0x43, 0x42, 0x2d, 0x27, 0x68, 0x49, \n\t0x00, 0x02, 0x00, 0x8e, 0xfe, 0x8a, 0x01, 0xb2, 0x04, 0x3a, 0x00, 0x03, \n\t0x00, 0x07, 0x00, 0x27, 0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0e, 0x3e, 0x59, 0xb0, 0x04, 0xb0, \n\t0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x03, 0xb0, 0x0a, 0x2b, \n\t0x58, 0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, 0x01, 0x21, 0x11, 0x21, 0x35, \n\t0x21, 0x11, 0x21, 0x01, 0xb2, 0xfe, 0xdc, 0x01, 0x24, 0xfe, 0xdc, 0x01, \n\t0x24, 0xfe, 0x8a, 0x03, 0xb9, 0xf6, 0x01, 0x01, 0x00, 0x01, 0x00, 0x48, \n\t0xff, 0x0b, 0x03, 0xfe, 0x05, 0x26, 0x00, 0x22, 0x00, 0x44, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x0e, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0a, 0x3e, \n\t0x59, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x0b, 0x10, 0xb0, 0x08, 0xd0, 0xb0, 0x12, 0x10, 0xb0, 0x15, \n\t0xd0, 0xb0, 0x12, 0x10, 0xb1, 0x1c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x25, 0x32, 0x36, 0x35, 0x21, 0x17, \n\t0x16, 0x06, 0x07, 0x15, 0x23, 0x35, 0x26, 0x02, 0x35, 0x35, 0x34, 0x12, \n\t0x37, 0x35, 0x33, 0x15, 0x16, 0x16, 0x15, 0x21, 0x34, 0x26, 0x23, 0x22, \n\t0x06, 0x15, 0x15, 0x14, 0x16, 0x02, 0x40, 0x4e, 0x5e, 0x01, 0x0b, 0x02, \n\t0x03, 0xb1, 0x8f, 0xc8, 0xcf, 0xdd, 0xdd, 0xcf, 0xc8, 0x94, 0xae, 0xfe, \n\t0xee, 0x5c, 0x51, 0x74, 0x5f, 0x5f, 0xcb, 0x5b, 0x4c, 0x05, 0x87, 0xcc, \n\t0x21, 0xee, 0xe5, 0x17, 0x01, 0x2b, 0xdb, 0x1e, 0xda, 0x01, 0x2b, 0x19, \n\t0xdd, 0xe5, 0x22, 0xd7, 0x9e, 0x54, 0x6f, 0xb4, 0x8e, 0x1e, 0x91, 0xb1, \n\t0x00, 0x01, 0x00, 0x5c, 0x00, 0x00, 0x04, 0x80, 0x05, 0xc5, 0x00, 0x22, \n\t0x00, 0x67, 0x00, 0xb0, 0x20, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x14, \n\t0x2f, 0x1b, 0xb1, 0x14, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0a, 0x3e, 0x59, 0xb2, 0x7f, 0x20, 0x01, \n\t0x5d, 0xb0, 0x20, 0x10, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x06, 0x10, 0xb1, 0x04, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x08, 0xd0, 0xb0, 0x09, \n\t0xd0, 0xb0, 0x00, 0x10, 0xb0, 0x0d, 0xd0, 0xb0, 0x0e, 0xd0, 0xb0, 0x20, \n\t0x10, 0xb0, 0x10, 0xd0, 0xb0, 0x14, 0x10, 0xb1, 0x1c, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x17, 0x14, \n\t0x06, 0x07, 0x21, 0x15, 0x21, 0x35, 0x33, 0x36, 0x36, 0x35, 0x27, 0x23, \n\t0x35, 0x33, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x07, 0x07, 0x21, 0x34, \n\t0x26, 0x23, 0x22, 0x06, 0x15, 0x17, 0x21, 0x15, 0x02, 0x27, 0x04, 0x3c, \n\t0x38, 0x02, 0xc9, 0xfc, 0x1c, 0x0a, 0x2f, 0x2f, 0x04, 0xa4, 0x9b, 0x08, \n\t0xf1, 0xca, 0xd7, 0xed, 0x04, 0x02, 0xfe, 0xe4, 0x5c, 0x47, 0x46, 0x50, \n\t0x0a, 0x01, 0x63, 0x02, 0x4c, 0x55, 0x4e, 0x90, 0x39, 0xe0, 0xe0, 0x0c, \n\t0xa6, 0x58, 0x62, 0xe1, 0xd6, 0xd2, 0xf0, 0xdf, 0xb7, 0x06, 0x60, 0x5b, \n\t0x75, 0x6c, 0xd6, 0xe1, 0x00, 0x02, 0x00, 0x50, 0xff, 0xe5, 0x05, 0x42, \n\t0x04, 0xf1, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x2e, 0x00, 0xb0, 0x15, 0x2f, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0a, 0x3e, \n\t0x59, 0xb1, 0x27, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x15, 0x10, 0xb1, 0x2d, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x25, 0x06, 0x06, 0x23, 0x22, 0x26, \n\t0x27, 0x07, 0x27, 0x37, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x27, 0x37, \n\t0x17, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x37, 0x17, 0x07, 0x16, 0x16, \n\t0x15, 0x14, 0x06, 0x07, 0x17, 0x07, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, \n\t0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x04, 0x30, 0x4d, 0xb8, 0x64, 0x65, \n\t0xb9, 0x4b, 0x81, 0x8d, 0x87, 0x31, 0x33, 0x38, 0x35, 0x90, 0x8d, 0x8e, \n\t0x4a, 0xb1, 0x61, 0x60, 0xb2, 0x4b, 0x90, 0x8e, 0x94, 0x33, 0x38, 0x33, \n\t0x2f, 0x8b, 0x8e, 0xfc, 0x79, 0xee, 0xac, 0xaa, 0xef, 0xef, 0xaa, 0xac, \n\t0xee, 0x6b, 0x3e, 0x41, 0x41, 0x3d, 0x84, 0x90, 0x89, 0x4c, 0xb3, 0x62, \n\t0x65, 0xba, 0x4e, 0x93, 0x90, 0x91, 0x37, 0x3c, 0x3d, 0x38, 0x94, 0x91, \n\t0x97, 0x4e, 0xb7, 0x64, 0x61, 0xb1, 0x4b, 0x8d, 0x91, 0x02, 0x7b, 0xb9, \n\t0xfe, 0xff, 0xb8, 0xb7, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x01, 0x00, 0x16, \n\t0x00, 0x00, 0x04, 0xce, 0x05, 0xb0, 0x00, 0x17, 0x00, 0x6c, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x17, 0x2f, 0x1b, 0xb1, 0x17, 0x10, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x10, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x0a, \n\t0x3e, 0x59, 0xb2, 0x13, 0x10, 0x03, 0x2b, 0xb2, 0x00, 0x0d, 0x17, 0x11, \n\t0x12, 0x39, 0xb2, 0x7f, 0x13, 0x01, 0x5d, 0xb0, 0x13, 0x10, 0xb0, 0x14, \n\t0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x04, 0xd0, 0xb0, \n\t0x13, 0x10, 0xb0, 0x07, 0xd0, 0xb2, 0x7f, 0x10, 0x01, 0x5d, 0xb0, 0x10, \n\t0x10, 0xb0, 0x08, 0xd0, 0xb0, 0x10, 0x10, 0xb0, 0x0f, 0xb0, 0x0a, 0x2b, \n\t0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x0b, 0xd0, 0x30, 0x31, 0x01, 0x33, \n\t0x01, 0x21, 0x01, 0x33, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, \n\t0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0x01, 0x21, 0x02, 0x6f, \n\t0x06, 0x01, 0x19, 0x01, 0x40, 0xfe, 0x82, 0xf4, 0xfe, 0xbc, 0x01, 0x44, \n\t0xfe, 0xbc, 0xfe, 0xdc, 0xfe, 0xad, 0x01, 0x53, 0xfe, 0xad, 0x01, 0x0b, \n\t0xfe, 0x82, 0x01, 0x41, 0x03, 0x50, 0x02, 0x60, 0xfd, 0x36, 0xc8, 0x6e, \n\t0xc8, 0xe8, 0xe8, 0xc8, 0x6e, 0xc8, 0x02, 0xca, 0x00, 0x02, 0x00, 0x7f, \n\t0xfe, 0xf2, 0x01, 0x85, 0x05, 0xb0, 0x00, 0x03, 0x00, 0x07, 0x00, 0x25, \n\t0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x05, 0x2f, 0xb0, 0x01, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x10, 0x3e, 0x59, 0xb2, \n\t0x0f, 0x01, 0x01, 0x5d, 0xb4, 0x0f, 0x05, 0x1f, 0x05, 0x02, 0x5d, 0x30, \n\t0x31, 0x13, 0x11, 0x21, 0x11, 0x11, 0x21, 0x11, 0x21, 0x7f, 0x01, 0x06, \n\t0xfe, 0xfa, 0x01, 0x06, 0xfe, 0xf2, 0x03, 0x1b, 0xfc, 0xe5, 0x03, 0xc8, \n\t0x02, 0xf6, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5e, 0xfe, 0x33, 0x04, 0x9c, \n\t0x05, 0xc5, 0x00, 0x33, 0x00, 0x45, 0x00, 0x6f, 0x00, 0xb0, 0x09, 0x2f, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x23, 0x2f, 0x1b, 0xb1, 0x23, 0x10, 0x3e, \n\t0x59, 0xb2, 0x17, 0x09, 0x23, 0x11, 0x12, 0x39, 0xb0, 0x17, 0x10, 0xb1, \n\t0x3d, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x03, 0xd0, 0xb0, 0x09, 0x10, 0xb0, 0x0e, 0xd0, 0xb0, 0x09, 0x10, 0xb1, \n\t0x11, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, \n\t0x31, 0x23, 0x09, 0x11, 0x12, 0x39, 0xb0, 0x31, 0x10, 0xb1, 0x34, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x1d, 0xd0, \n\t0xb0, 0x23, 0x10, 0xb0, 0x28, 0xd0, 0xb0, 0x23, 0x10, 0xb1, 0x2b, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, \n\t0x14, 0x06, 0x07, 0x16, 0x16, 0x15, 0x14, 0x04, 0x23, 0x22, 0x24, 0x37, \n\t0x37, 0x25, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x26, \n\t0x26, 0x35, 0x34, 0x36, 0x37, 0x26, 0x26, 0x35, 0x34, 0x24, 0x33, 0x32, \n\t0x04, 0x07, 0x07, 0x21, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, \n\t0x17, 0x16, 0x16, 0x25, 0x26, 0x26, 0x27, 0x06, 0x06, 0x15, 0x14, 0x16, \n\t0x17, 0x16, 0x16, 0x17, 0x36, 0x36, 0x35, 0x34, 0x26, 0x04, 0x9c, 0x54, \n\t0x4f, 0x44, 0x45, 0xfe, 0xe8, 0xed, 0xe8, 0xfe, 0xc9, 0x05, 0x02, 0x01, \n\t0x1b, 0x91, 0x6c, 0x6b, 0x77, 0x7a, 0xa9, 0xf4, 0xea, 0x54, 0x4f, 0x45, \n\t0x44, 0x01, 0x1b, 0xed, 0xf3, 0x01, 0x13, 0x05, 0x02, 0xfe, 0xe5, 0x78, \n\t0x6c, 0x72, 0x72, 0x6f, 0xb1, 0xf7, 0xe9, 0xfd, 0xbb, 0x28, 0x44, 0x1f, \n\t0x26, 0x25, 0x6f, 0xb1, 0x22, 0x45, 0x23, 0x27, 0x2b, 0x7c, 0x01, 0xdb, \n\t0x5b, 0x88, 0x2b, 0x33, 0x8c, 0x62, 0xb1, 0xc8, 0xc7, 0xda, 0x06, 0x01, \n\t0x6a, 0x5c, 0x53, 0x43, 0x43, 0x51, 0x32, 0x40, 0xbb, 0xac, 0x59, 0x8a, \n\t0x2c, 0x32, 0x8d, 0x62, 0xac, 0xd1, 0xde, 0xc8, 0x06, 0x58, 0x73, 0x57, \n\t0x43, 0x4b, 0x4d, 0x30, 0x40, 0xbb, 0x10, 0x0a, 0x16, 0x0b, 0x16, 0x4a, \n\t0x30, 0x50, 0x53, 0x34, 0x0a, 0x14, 0x0b, 0x16, 0x4a, 0x30, 0x47, 0x5a, \n\t0x00, 0x02, 0x00, 0x9c, 0x04, 0xe4, 0x03, 0x9a, 0x05, 0xb0, 0x00, 0x03, \n\t0x00, 0x07, 0x00, 0x19, 0x00, 0xb0, 0x04, 0x2f, 0xb0, 0x01, 0xd0, 0xb0, \n\t0x04, 0x10, 0xb0, 0x07, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, \n\t0xb0, 0x02, 0xd0, 0x30, 0x31, 0x01, 0x21, 0x35, 0x21, 0x05, 0x21, 0x35, \n\t0x21, 0x03, 0x9a, 0xfe, 0xf6, 0x01, 0x0a, 0xfe, 0x0c, 0xfe, 0xf6, 0x01, \n\t0x0a, 0x04, 0xe4, 0xcc, 0xcc, 0xcc, 0x00, 0x00, 0x00, 0x03, 0x00, 0x56, \n\t0xff, 0xeb, 0x05, 0xe2, 0x05, 0xc4, 0x00, 0x1d, 0x00, 0x29, 0x00, 0x35, \n\t0x00, 0x6c, 0x00, 0xb0, 0x04, 0x2f, 0xb0, 0x0b, 0x2f, 0xb0, 0x10, 0x2f, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x2d, 0x2f, 0x1b, 0xb1, 0x2d, 0x10, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x33, 0x2f, 0x1b, 0xb1, 0x33, 0x0a, \n\t0x3e, 0x59, 0xb4, 0x0f, 0x04, 0x1f, 0x04, 0x02, 0x5d, 0xb2, 0x10, 0x0b, \n\t0x01, 0x5d, 0xb0, 0x0b, 0x10, 0xb0, 0x13, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, \n\t0x1b, 0xdc, 0x59, 0xb0, 0x04, 0x10, 0xb0, 0x1a, 0xb0, 0x0a, 0x2b, 0x58, \n\t0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x10, 0x10, 0xb0, 0x1d, 0xd0, 0xb0, 0x33, \n\t0x10, 0xb0, 0x21, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, \n\t0x2d, 0x10, 0xb0, 0x27, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, \n\t0x30, 0x31, 0x01, 0x17, 0x16, 0x06, 0x23, 0x22, 0x26, 0x35, 0x35, 0x34, \n\t0x36, 0x33, 0x32, 0x16, 0x07, 0x07, 0x23, 0x34, 0x26, 0x23, 0x22, 0x06, \n\t0x15, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x25, 0x10, 0x00, 0x33, \n\t0x32, 0x00, 0x11, 0x10, 0x00, 0x23, 0x22, 0x00, 0x03, 0x10, 0x00, 0x21, \n\t0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x04, 0x55, 0x02, 0x04, \n\t0xb0, 0x9d, 0xa0, 0xbd, 0xbd, 0xa0, 0x9d, 0xb1, 0x04, 0x02, 0x94, 0x5a, \n\t0x5a, 0x5e, 0x64, 0x64, 0x5e, 0x5a, 0x59, 0xfd, 0x0f, 0x01, 0x57, 0xf5, \n\t0xf4, 0x01, 0x57, 0xfe, 0xa9, 0xf4, 0xf6, 0xfe, 0xaa, 0x7a, 0x01, 0x9e, \n\t0x01, 0x28, 0x01, 0x27, 0x01, 0x9f, 0xfe, 0x60, 0xfe, 0xda, 0xfe, 0xd8, \n\t0xfe, 0x62, 0x02, 0x54, 0x06, 0x97, 0x9d, 0xd4, 0xaf, 0x77, 0xad, 0xd6, \n\t0x9f, 0x95, 0x06, 0x5e, 0x55, 0x8a, 0x71, 0x78, 0x73, 0x89, 0x53, 0x60, \n\t0x85, 0xfe, 0xf8, 0xfe, 0x97, 0x01, 0x69, 0x01, 0x08, 0x01, 0x07, 0x01, \n\t0x67, 0xfe, 0x99, 0xfe, 0xf9, 0x01, 0x3b, 0x01, 0xb0, 0xfe, 0x50, 0xfe, \n\t0xc5, 0xfe, 0xc4, 0xfe, 0x4e, 0x01, 0xb2, 0x00, 0x00, 0x02, 0x00, 0x70, \n\t0x02, 0xb4, 0x03, 0x0d, 0x05, 0xc5, 0x00, 0x20, 0x00, 0x2b, 0x00, 0x6e, \n\t0x00, 0xb0, 0x06, 0x2f, 0xb0, 0x0d, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x19, 0x2f, 0x1b, 0xb1, 0x19, 0x10, 0x3e, 0x59, 0xb2, 0x7f, 0x06, 0x01, \n\t0x5d, 0xb2, 0x3f, 0x06, 0x01, 0x71, 0xb2, 0xaf, 0x06, 0x01, 0x5d, 0xb2, \n\t0x20, 0x06, 0x01, 0x5d, 0xb2, 0x20, 0x06, 0x01, 0x72, 0xb0, 0x06, 0x10, \n\t0xb0, 0x00, 0xd0, 0xb2, 0xff, 0x0d, 0x01, 0x71, 0xb0, 0x19, 0x10, 0xb1, \n\t0x11, 0x05, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, \n\t0x14, 0x0d, 0x19, 0x11, 0x12, 0x39, 0xb0, 0x06, 0x10, 0xb1, 0x21, 0x05, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0d, 0x10, \n\t0xb1, 0x25, 0x05, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x01, 0x26, 0x26, 0x27, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, \n\t0x34, 0x36, 0x33, 0x33, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x27, \n\t0x27, 0x26, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x14, 0x16, 0x17, 0x25, \n\t0x32, 0x36, 0x37, 0x35, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x02, 0x5c, \n\t0x08, 0x0a, 0x03, 0x21, 0x6f, 0x4e, 0x77, 0x82, 0xa9, 0xa2, 0x89, 0x3b, \n\t0x39, 0x42, 0x48, 0xa5, 0x01, 0x06, 0xaa, 0x8c, 0x86, 0x9d, 0x0c, 0x0e, \n\t0xfe, 0x87, 0x33, 0x6c, 0x11, 0x88, 0x4a, 0x53, 0x3a, 0x02, 0xc2, 0x15, \n\t0x2f, 0x1a, 0x2f, 0x3d, 0x7a, 0x6a, 0x6f, 0x78, 0x33, 0x3e, 0x41, 0x34, \n\t0x2f, 0x0d, 0x06, 0x62, 0x82, 0x8e, 0x86, 0xfe, 0xc6, 0x33, 0x58, 0x2a, \n\t0x82, 0x3c, 0x23, 0x67, 0x40, 0x2e, 0x2b, 0x2d, 0xff, 0xff, 0x00, 0x62, \n\t0x00, 0x75, 0x03, 0x83, 0x03, 0x94, 0x00, 0x26, 0x03, 0x07, 0xf6, 0xde, \n\t0x00, 0x07, 0x03, 0x07, 0x01, 0x44, 0xff, 0xde, 0x00, 0x01, 0x00, 0x7e, \n\t0x01, 0x76, 0x03, 0xc1, 0x03, 0x25, 0x00, 0x05, 0x00, 0x12, 0x00, 0xb0, \n\t0x04, 0x2f, 0xb1, 0x03, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0x30, 0x31, 0x01, 0x23, 0x11, 0x21, 0x35, 0x21, 0x03, 0xc1, \n\t0xc8, 0xfd, 0x85, 0x03, 0x43, 0x01, 0x76, 0x01, 0x04, 0xab, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x71, 0x01, 0xfe, 0x02, 0xa5, 0x02, 0xdf, 0x02, 0x06, \n\t0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x56, 0xff, 0xeb, 0x05, 0xe2, \n\t0x05, 0xc4, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x32, 0x00, 0x3b, 0x00, 0x73, \n\t0x00, 0xb0, 0x1b, 0x2f, 0xb0, 0x19, 0x2f, 0xb0, 0x18, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x10, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x0f, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x03, \n\t0x10, 0xb0, 0x15, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb2, \n\t0x20, 0x18, 0x01, 0x5d, 0xb2, 0x0f, 0x19, 0x01, 0x5d, 0xb2, 0x10, 0x1b, \n\t0x01, 0x5d, 0xb0, 0x18, 0x10, 0xb0, 0x33, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, \n\t0x1b, 0xdc, 0x59, 0xb2, 0x22, 0x18, 0x33, 0x11, 0x12, 0x39, 0xb0, 0x19, \n\t0x10, 0xb0, 0x2b, 0xd0, 0xb0, 0x1b, 0x10, 0xb0, 0x3b, 0xb0, 0x0a, 0x2b, \n\t0x58, 0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, 0x13, 0x10, 0x00, 0x21, 0x20, \n\t0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x33, 0x32, \n\t0x00, 0x11, 0x10, 0x00, 0x23, 0x22, 0x00, 0x01, 0x11, 0x23, 0x11, 0x21, \n\t0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, 0x15, 0x14, 0x16, \n\t0x17, 0x15, 0x23, 0x26, 0x26, 0x35, 0x35, 0x34, 0x26, 0x23, 0x27, 0x33, \n\t0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x56, 0x01, 0x9e, 0x01, 0x28, \n\t0x01, 0x27, 0x01, 0x9f, 0xfe, 0x60, 0xfe, 0xda, 0xfe, 0xd8, 0xfe, 0x62, \n\t0x7a, 0x01, 0x57, 0xf5, 0xf4, 0x01, 0x57, 0xfe, 0xa9, 0xf4, 0xf6, 0xfe, \n\t0xaa, 0x01, 0xbc, 0x97, 0x01, 0x19, 0x97, 0xae, 0x3a, 0x38, 0x3a, 0x35, \n\t0x07, 0x0a, 0x9b, 0x09, 0x04, 0x43, 0x4c, 0x9e, 0x87, 0x47, 0x63, 0x4e, \n\t0x61, 0x82, 0x02, 0xd9, 0x01, 0x3b, 0x01, 0xb0, 0xfe, 0x50, 0xfe, 0xc5, \n\t0xfe, 0xc4, 0xfe, 0x4e, 0x01, 0xb2, 0x01, 0x3c, 0xfe, 0xf8, 0xfe, 0x97, \n\t0x01, 0x69, 0x01, 0x08, 0x01, 0x07, 0x01, 0x67, 0xfe, 0x99, 0xfe, 0xad, \n\t0xfe, 0xaf, 0x03, 0x52, 0x88, 0x7e, 0x3a, 0x57, 0x1f, 0x1e, 0x6d, 0x4a, \n\t0x38, 0x29, 0x41, 0x15, 0x10, 0x15, 0x51, 0x2a, 0x36, 0x47, 0x44, 0x86, \n\t0x3c, 0x38, 0x48, 0x3a, 0x00, 0x01, 0x00, 0x94, 0x05, 0x0c, 0x03, 0x6f, \n\t0x05, 0xb1, 0x00, 0x03, 0x00, 0x12, 0x00, 0xb0, 0x00, 0x2f, 0xb1, 0x03, \n\t0x04, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x01, 0x21, 0x35, 0x21, 0x03, 0x6f, 0xfd, 0x25, 0x02, 0xdb, 0x05, 0x0c, \n\t0xa5, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x7e, 0x03, 0xa4, 0x02, 0x9b, \n\t0x05, 0xc5, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x54, 0x00, 0xb0, 0x09, 0x2f, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x10, 0x3e, \n\t0x59, 0xb2, 0xc0, 0x09, 0x01, 0x5d, 0xb2, 0x00, 0x09, 0x01, 0x72, 0xb2, \n\t0x7f, 0x09, 0x01, 0x5d, 0xb2, 0x70, 0x09, 0x01, 0x72, 0xb2, 0xf0, 0x09, \n\t0x01, 0x5d, 0xb2, 0x40, 0x09, 0x01, 0x5d, 0xb2, 0x10, 0x09, 0x01, 0x5d, \n\t0xb0, 0x09, 0x10, 0xb1, 0x0f, 0x05, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x15, 0x05, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x13, 0x34, 0x36, 0x33, \n\t0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x37, 0x14, 0x16, 0x33, \n\t0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x7e, 0xa1, 0x70, 0x6e, \n\t0x9e, 0x9e, 0x6e, 0x71, 0xa0, 0x93, 0x4a, 0x34, 0x33, 0x46, 0x46, 0x33, \n\t0x34, 0x4a, 0x04, 0xb3, 0x70, 0xa2, 0xa2, 0x70, 0x71, 0x9e, 0x9e, 0x71, \n\t0x35, 0x47, 0x46, 0x36, 0x36, 0x4a, 0x4a, 0x00, 0x00, 0x02, 0x00, 0x5a, \n\t0xff, 0xd5, 0x03, 0xee, 0x05, 0x1e, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x37, \n\t0x00, 0xb0, 0x01, 0x2f, 0xb0, 0x0f, 0x2f, 0xb0, 0x01, 0x10, 0xb1, 0x02, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x04, \n\t0x0f, 0x02, 0x11, 0x12, 0x39, 0xb0, 0x06, 0xd0, 0xb0, 0x01, 0x10, 0xb0, \n\t0x08, 0xd0, 0xb0, 0x0f, 0x10, 0xb1, 0x0c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x15, 0x21, 0x11, \n\t0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x01, 0x21, 0x35, 0x21, 0x02, \n\t0xa7, 0x01, 0x47, 0xfe, 0xb9, 0xff, 0x00, 0xfe, 0xb3, 0x01, 0x4d, 0x01, \n\t0x00, 0x01, 0x0d, 0xfc, 0xbe, 0x03, 0x42, 0x03, 0xb3, 0xe8, 0xfe, 0x81, \n\t0x01, 0x7f, 0xe8, 0x01, 0x6b, 0xfa, 0xb7, 0xe4, 0x00, 0x01, 0x00, 0x66, \n\t0x02, 0x9b, 0x02, 0xe0, 0x05, 0xc7, 0x00, 0x1a, 0x00, 0x4f, 0x00, 0xb0, \n\t0x00, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, 0x11, \n\t0x10, 0x3e, 0x59, 0xb2, 0xf0, 0x00, 0x01, 0x5d, 0xb2, 0x20, 0x00, 0x01, \n\t0x71, 0xb2, 0xb0, 0x00, 0x01, 0x5d, 0xb2, 0x80, 0x00, 0x01, 0x5d, 0xb2, \n\t0x03, 0x00, 0x11, 0x11, 0x12, 0x39, 0xb1, 0x09, 0x06, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb0, 0x17, 0xd0, \n\t0xb0, 0x00, 0x10, 0xb1, 0x1a, 0x06, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x35, 0x25, 0x36, 0x36, 0x35, \n\t0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x23, 0x27, 0x26, 0x36, 0x33, 0x32, \n\t0x16, 0x15, 0x14, 0x06, 0x07, 0x07, 0x17, 0x21, 0x02, 0xe0, 0xfd, 0x92, \n\t0x01, 0x35, 0x3c, 0x23, 0x2f, 0x31, 0x37, 0x38, 0xc9, 0x02, 0x06, 0xb1, \n\t0x94, 0x90, 0x9e, 0x6b, 0x7d, 0x6d, 0x02, 0x01, 0x5a, 0x02, 0x9b, 0x9b, \n\t0xfc, 0x32, 0x43, 0x29, 0x27, 0x35, 0x3c, 0x2f, 0x06, 0x6a, 0x96, 0x82, \n\t0x76, 0x52, 0x7d, 0x67, 0x5d, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x59, \n\t0x02, 0x8f, 0x02, 0xf2, 0x05, 0xc6, 0x00, 0x2a, 0x00, 0xaa, 0x00, 0xb0, \n\t0x1a, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, \n\t0x10, 0x3e, 0x59, 0xb1, 0x06, 0x06, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x0e, 0x10, 0xb0, 0x09, 0xd0, 0xb2, 0xaf, 0x1a, \n\t0x01, 0x72, 0xb2, 0x5f, 0x1a, 0x01, 0x5d, 0xb2, 0x1f, 0x1a, 0x01, 0x72, \n\t0xb2, 0x7f, 0x1a, 0x01, 0x72, 0xb2, 0x4f, 0x1a, 0x01, 0x72, 0xb2, 0xef, \n\t0x1a, 0x01, 0x71, 0xb2, 0xdf, 0x1a, 0x01, 0x72, 0xb2, 0x20, 0x1a, 0x01, \n\t0x71, 0xb2, 0xf0, 0x1a, 0x01, 0x5d, 0xb0, 0x1a, 0x10, 0xb0, 0x1f, 0xd0, \n\t0xb2, 0xc0, 0x1f, 0x01, 0x5d, 0xb0, 0x1a, 0x10, 0xb1, 0x22, 0x06, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x2a, 0x1a, 0x0e, \n\t0x11, 0x12, 0x39, 0xb0, 0x2a, 0x2f, 0xb4, 0x1f, 0x2a, 0x2f, 0x2a, 0x02, \n\t0x5d, 0xb2, 0xff, 0x2a, 0x01, 0x71, 0xb4, 0x0f, 0x2a, 0x1f, 0x2a, 0x02, \n\t0x72, 0xb2, 0xdf, 0x2a, 0x01, 0x5d, 0xb6, 0x1f, 0x2a, 0x2f, 0x2a, 0x3f, \n\t0x2a, 0x03, 0x71, 0xb0, 0x29, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, \n\t0x59, 0xb6, 0xb0, 0x29, 0xc0, 0x29, 0xd0, 0x29, 0x03, 0x5d, 0x30, 0x31, \n\t0x01, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x23, 0x27, \n\t0x26, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, \n\t0x14, 0x06, 0x23, 0x22, 0x26, 0x37, 0x37, 0x33, 0x14, 0x16, 0x33, 0x32, \n\t0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x01, 0x98, 0x3e, 0x3c, 0x39, \n\t0x37, 0x33, 0x39, 0xc8, 0x02, 0x06, 0xb0, 0x86, 0x98, 0xb1, 0x47, 0x3d, \n\t0x46, 0x4b, 0xb3, 0x98, 0x92, 0xbc, 0x06, 0x02, 0xc9, 0x3f, 0x3c, 0x38, \n\t0x44, 0x46, 0x43, 0x6f, 0x04, 0x73, 0x31, 0x2e, 0x26, 0x33, 0x2c, 0x1f, \n\t0x06, 0x65, 0x7b, 0x77, 0x6e, 0x37, 0x5b, 0x19, 0x18, 0x5f, 0x44, 0x70, \n\t0x7c, 0x7d, 0x71, 0x06, 0x2a, 0x2f, 0x30, 0x2c, 0x32, 0x36, 0x85, 0x00, \n\t0x00, 0x01, 0x00, 0x6c, 0x04, 0xbc, 0x02, 0x6a, 0x05, 0xc6, 0x00, 0x04, \n\t0x00, 0x35, 0xb0, 0x04, 0x2f, 0x00, 0xb0, 0x04, 0x2f, 0xb2, 0x3f, 0x04, \n\t0x01, 0x5d, 0xb2, 0xaf, 0x04, 0x01, 0x5d, 0xb2, 0x5f, 0x04, 0x01, 0x5d, \n\t0xb2, 0x0f, 0x04, 0x01, 0x5d, 0xb2, 0x7f, 0x04, 0x01, 0x5d, 0xb0, 0x00, \n\t0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb6, 0x0f, 0x00, 0x1f, \n\t0x00, 0x2f, 0x00, 0x03, 0x5d, 0x30, 0x31, 0x01, 0x21, 0x17, 0x01, 0x23, \n\t0x01, 0x33, 0x01, 0x35, 0x02, 0xfe, 0xeb, 0xe9, 0x05, 0xc6, 0x06, 0xfe, \n\t0xfc, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8b, 0xfe, 0x60, 0x04, 0x51, \n\t0x04, 0x3a, 0x00, 0x15, 0x00, 0x53, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x13, 0x2f, 0x1b, 0xb1, 0x13, 0x0c, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x0a, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x0f, 0x10, 0xb1, 0x04, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, \n\t0x37, 0x11, 0x21, 0x11, 0x21, 0x27, 0x06, 0x06, 0x23, 0x22, 0x26, 0x27, \n\t0x11, 0x21, 0x11, 0x01, 0xae, 0x5a, 0x5a, 0x4b, 0x64, 0x1c, 0x01, 0x24, \n\t0xfe, 0xf0, 0x06, 0x2c, 0x71, 0x43, 0x33, 0x57, 0x23, 0xfe, 0xdd, 0x04, \n\t0x3a, 0xfd, 0x94, 0x95, 0x6b, 0x37, 0x34, 0x03, 0x01, 0xfb, 0xc6, 0x43, \n\t0x2b, 0x2d, 0x15, 0x17, 0xfe, 0x49, 0x05, 0xda, 0x00, 0x01, 0x00, 0x3d, \n\t0x00, 0x00, 0x03, 0xa0, 0x05, 0xb0, 0x00, 0x0a, 0x00, 0x1d, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x10, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, \n\t0x59, 0x30, 0x31, 0x21, 0x11, 0x23, 0x22, 0x00, 0x35, 0x34, 0x00, 0x33, \n\t0x21, 0x11, 0x02, 0x7c, 0x53, 0xe9, 0xfe, 0xfd, 0x01, 0x03, 0xe9, 0x01, \n\t0x77, 0x02, 0x08, 0x01, 0x03, 0xd1, 0xcf, 0x01, 0x05, 0xfa, 0x50, 0x00, \n\t0x00, 0x01, 0x00, 0x9f, 0x02, 0x38, 0x01, 0xc3, 0x03, 0x3c, 0x00, 0x03, \n\t0x00, 0x10, 0x00, 0xb0, 0x03, 0x2f, 0xb0, 0x00, 0xb0, 0x0a, 0x2b, 0x58, \n\t0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, 0x01, 0x21, 0x11, 0x21, 0x01, 0xc3, \n\t0xfe, 0xdc, 0x01, 0x24, 0x02, 0x38, 0x01, 0x04, 0x00, 0x01, 0x00, 0x61, \n\t0xfe, 0x35, 0x01, 0xe6, 0x00, 0x06, 0x00, 0x0f, 0x00, 0x23, 0x00, 0xb0, \n\t0x07, 0x2f, 0xb0, 0x10, 0x2f, 0xb0, 0x07, 0x10, 0xb0, 0x08, 0xb0, 0x0a, \n\t0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x10, 0x10, 0xb0, 0x0f, 0xb0, \n\t0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, 0x25, 0x07, 0x16, \n\t0x16, 0x15, 0x14, 0x06, 0x23, 0x27, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, \n\t0x37, 0x01, 0x5b, 0x0b, 0x40, 0x56, 0xb7, 0xa8, 0x07, 0x33, 0x3c, 0x40, \n\t0x4e, 0x1f, 0x06, 0x39, 0x0b, 0x52, 0x50, 0x6b, 0x80, 0xa1, 0x29, 0x2a, \n\t0x29, 0x21, 0x05, 0x8e, 0x00, 0x01, 0x00, 0x4e, 0x02, 0x99, 0x01, 0xa0, \n\t0x05, 0xc5, 0x00, 0x05, 0x00, 0x3d, 0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x10, 0x3e, 0x59, 0xb2, \n\t0x20, 0x00, 0x01, 0x71, 0xb2, 0x80, 0x00, 0x01, 0x5d, 0xb2, 0xf0, 0x00, \n\t0x01, 0x5d, 0xb2, 0xb0, 0x00, 0x01, 0x5d, 0xb2, 0x04, 0x05, 0x00, 0x11, \n\t0x12, 0x39, 0xb0, 0x04, 0x2f, 0xb1, 0x03, 0x06, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x23, 0x11, 0x23, 0x35, \n\t0x25, 0x01, 0xa0, 0xd3, 0x7f, 0x01, 0x52, 0x02, 0x99, 0x02, 0x76, 0x9f, \n\t0x17, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x76, 0x02, 0xb3, 0x03, 0x2b, \n\t0x05, 0xc5, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x4a, 0x00, 0xb0, 0x0a, 0x2f, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x10, 0x3e, \n\t0x59, 0xb2, 0xaf, 0x0a, 0x01, 0x5d, 0xb2, 0xcf, 0x0a, 0x01, 0x71, 0xb2, \n\t0x3f, 0x0a, 0x01, 0x71, 0xb2, 0x7f, 0x0a, 0x01, 0x5d, 0xb2, 0x20, 0x0a, \n\t0x01, 0x5d, 0xb0, 0x0a, 0x10, 0xb1, 0x11, 0x05, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x18, 0x05, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x13, 0x34, \n\t0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, \n\t0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, \n\t0x06, 0x15, 0x76, 0xbc, 0x9e, 0x9e, 0xbd, 0xbc, 0x9d, 0x9f, 0xbd, 0xaf, \n\t0x58, 0x55, 0x52, 0x58, 0x59, 0x53, 0x54, 0x57, 0x04, 0x76, 0x94, 0xbb, \n\t0xbb, 0x94, 0x75, 0x95, 0xb9, 0xb9, 0x95, 0x55, 0x67, 0x67, 0x55, 0x75, \n\t0x53, 0x68, 0x68, 0x53, 0xff, 0xff, 0x00, 0x66, 0x00, 0x97, 0x03, 0x94, \n\t0x03, 0xb6, 0x00, 0x26, 0x03, 0x08, 0x16, 0x00, 0x00, 0x07, 0x03, 0x08, \n\t0x01, 0x70, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x05, 0xda, \n\t0x05, 0xc4, 0x00, 0x27, 0x03, 0x72, 0x00, 0x59, 0x02, 0x98, 0x00, 0x27, \n\t0x03, 0x0a, 0x01, 0x18, 0x00, 0x08, 0x01, 0x07, 0x03, 0x6e, 0x02, 0xba, \n\t0x00, 0x00, 0x00, 0x20, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, \n\t0x1b, 0xb1, 0x05, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, \n\t0x2f, 0x1b, 0xb1, 0x0f, 0x0a, 0x3e, 0x59, 0xb0, 0x16, 0xd0, 0x30, 0x31, \n\t0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x06, 0x0b, 0x05, 0xc4, 0x00, 0x27, \n\t0x03, 0x0a, 0x01, 0x25, 0x00, 0x08, 0x00, 0x27, 0x03, 0x72, 0x00, 0x59, \n\t0x02, 0x98, 0x01, 0x07, 0x03, 0x70, 0x03, 0x2b, 0x00, 0x00, 0x00, 0x1d, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x10, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, \n\t0x0a, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x69, \n\t0x00, 0x00, 0x06, 0x97, 0x05, 0xc7, 0x00, 0x27, 0x03, 0x0a, 0x01, 0xcf, \n\t0x00, 0x08, 0x00, 0x27, 0x03, 0x6e, 0x03, 0x77, 0x00, 0x00, 0x01, 0x07, \n\t0x03, 0x6f, 0x00, 0x10, 0x02, 0x9b, 0x00, 0x20, 0x00, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x22, 0x2f, 0x1b, 0xb1, 0x22, 0x10, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0a, 0x3e, 0x59, 0xb0, \n\t0x10, 0xd0, 0x30, 0x31, 0x00, 0x02, 0x00, 0x4b, 0xfe, 0x76, 0x03, 0xfc, \n\t0x04, 0x3a, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x43, 0x00, 0xb0, 0x11, 0x2f, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1b, 0x2f, 0x1b, 0xb1, 0x1b, 0x0e, 0x3e, \n\t0x59, 0xb0, 0x1e, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, \n\t0x1a, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb2, 0x03, 0x11, \n\t0x1a, 0x11, 0x12, 0x39, 0xb0, 0x11, 0x10, 0xb1, 0x09, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb0, 0x17, \n\t0xd0, 0x30, 0x31, 0x01, 0x06, 0x06, 0x07, 0x06, 0x06, 0x15, 0x14, 0x16, \n\t0x33, 0x32, 0x36, 0x37, 0x21, 0x17, 0x16, 0x04, 0x23, 0x22, 0x26, 0x35, \n\t0x34, 0x36, 0x37, 0x36, 0x36, 0x35, 0x03, 0x21, 0x15, 0x21, 0x02, 0xd6, \n\t0x02, 0x51, 0x77, 0x48, 0x55, 0x61, 0x5b, 0x49, 0x66, 0x03, 0x01, 0x1b, \n\t0x02, 0x02, 0xfe, 0xfd, 0xce, 0xe2, 0xfe, 0x94, 0x71, 0x3c, 0x27, 0x02, \n\t0x01, 0x26, 0xfe, 0xda, 0x02, 0x9c, 0x8d, 0x83, 0x5c, 0x3a, 0x87, 0x52, \n\t0x5a, 0x68, 0x56, 0x55, 0x06, 0xbf, 0xcb, 0xe2, 0xc3, 0x7d, 0xd8, 0x4b, \n\t0x2d, 0x5f, 0x55, 0x01, 0x9e, 0xfb, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0c, \n\t0x00, 0x00, 0x05, 0x1f, 0x07, 0x22, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x43, 0x00, 0xe6, 0x01, 0x5c, 0x00, 0x09, 0x00, 0xb3, \n\t0x0d, 0x07, 0x04, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x0c, \n\t0x00, 0x00, 0x05, 0x1f, 0x07, 0x22, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x76, 0x01, 0x9b, 0x01, 0x5c, 0x00, 0x09, 0x00, 0xb3, \n\t0x10, 0x07, 0x04, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x0c, \n\t0x00, 0x00, 0x05, 0x1f, 0x07, 0x42, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x52, 0x00, 0x95, 0x01, 0x54, 0x00, 0x09, 0x00, 0xb3, \n\t0x10, 0x08, 0x04, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x0c, \n\t0x00, 0x00, 0x05, 0x1f, 0x07, 0x6d, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x58, 0x00, 0xa2, 0x01, 0x74, 0x00, 0x09, 0x00, 0xb3, \n\t0x0f, 0x08, 0x05, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x0c, \n\t0x00, 0x00, 0x05, 0x1f, 0x07, 0x0d, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x6a, 0x00, 0x74, 0x01, 0x5d, 0x00, 0x0f, 0x00, 0xb3, \n\t0x10, 0x08, 0x04, 0x04, 0x2b, 0xb0, 0x10, 0x10, 0xb0, 0x0d, 0xd0, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0c, 0x00, 0x00, 0x05, 0x1f, \n\t0x07, 0x8f, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x01, 0x56, \n\t0x01, 0x3b, 0x01, 0xb9, 0x00, 0x0f, 0x00, 0xb3, 0x15, 0x07, 0x04, 0x04, \n\t0x2b, 0xb0, 0x15, 0x10, 0xb0, 0x1b, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x07, 0x49, 0x05, 0xb0, 0x00, 0x0f, \n\t0x00, 0x13, 0x00, 0x7c, 0x00, 0xb0, 0x02, 0x2f, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x10, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x06, 0x10, 0xb1, 0x08, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x0b, 0x10, 0xb1, 0x0c, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x0e, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x02, 0x10, \n\t0xb1, 0x11, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x06, 0x10, 0xb0, 0x12, 0xd0, 0x30, 0x31, 0x21, 0x21, 0x03, 0x21, \n\t0x03, 0x21, 0x01, 0x21, 0x15, 0x21, 0x13, 0x21, 0x15, 0x21, 0x13, 0x21, \n\t0x01, 0x21, 0x03, 0x27, 0x07, 0x49, 0xfc, 0x7e, 0x0e, 0xfe, 0x48, 0xa8, \n\t0xfe, 0xaa, 0x03, 0x10, 0x03, 0xf8, 0xfd, 0xac, 0x10, 0x01, 0xf3, 0xfe, \n\t0x16, 0x11, 0x02, 0x68, 0xfb, 0x30, 0x01, 0x36, 0x17, 0x06, 0x01, 0x4f, \n\t0xfe, 0xb1, 0x05, 0xb0, 0xe4, 0xfe, 0x92, 0xe3, 0xfe, 0x68, 0x01, 0x5c, \n\t0x02, 0x2f, 0x01, 0x00, 0xff, 0xff, 0x00, 0x5d, 0xfe, 0x34, 0x04, 0xdb, \n\t0x05, 0xc5, 0x02, 0x26, 0x00, 0x26, 0x00, 0x00, 0x00, 0x07, 0x00, 0x7a, \n\t0x01, 0xab, 0xff, 0xff, 0xff, 0xff, 0x00, 0x88, 0x00, 0x00, 0x04, 0x6d, \n\t0x07, 0x22, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, \n\t0x00, 0xa7, 0x01, 0x5c, 0x00, 0x09, 0x00, 0xb3, 0x0d, 0x07, 0x06, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x88, 0x00, 0x00, 0x04, 0x6d, \n\t0x07, 0x22, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, \n\t0x01, 0x5c, 0x01, 0x5c, 0x00, 0x09, 0x00, 0xb3, 0x10, 0x07, 0x06, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x88, 0x00, 0x00, 0x04, 0x6d, \n\t0x07, 0x42, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x01, 0x52, \n\t0x00, 0x65, 0x01, 0x54, 0x00, 0x09, 0x00, 0xb3, 0x10, 0x08, 0x06, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x88, 0x00, 0x00, 0x04, 0x6d, \n\t0x07, 0x0d, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x00, 0x6a, \n\t0x00, 0x41, 0x01, 0x5d, 0x00, 0x0f, 0x00, 0xb3, 0x11, 0x08, 0x06, 0x04, \n\t0x2b, 0xb0, 0x11, 0x10, 0xb0, 0x0d, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0xff, 0xc6, 0x00, 0x00, 0x01, 0xc2, 0x07, 0x22, 0x02, 0x26, \n\t0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, 0xff, 0x79, 0x01, 0x5c, \n\t0x00, 0x09, 0x00, 0xb3, 0x05, 0x07, 0x02, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x98, 0x00, 0x00, 0x02, 0x96, 0x07, 0x22, 0x02, 0x26, \n\t0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, 0x00, 0x2c, 0x01, 0x5c, \n\t0x00, 0x09, 0x00, 0xb3, 0x08, 0x07, 0x02, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x02, 0xa2, 0x07, 0x42, 0x02, 0x26, \n\t0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x01, 0x52, 0xff, 0x37, 0x01, 0x54, \n\t0x00, 0x09, 0x00, 0xb3, 0x08, 0x08, 0x02, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0xff, 0xaf, 0x00, 0x00, 0x02, 0xad, 0x07, 0x0d, 0x02, 0x26, \n\t0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x6a, 0xff, 0x13, 0x01, 0x5d, \n\t0x00, 0x0f, 0x00, 0xb3, 0x08, 0x08, 0x02, 0x04, 0x2b, 0xb0, 0x08, 0x10, \n\t0xb0, 0x05, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1f, \n\t0x00, 0x00, 0x04, 0xff, 0x05, 0xb0, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x60, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x16, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, \n\t0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, \n\t0x00, 0x0a, 0x3e, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x01, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0e, 0xd0, 0xb0, 0x00, \n\t0x10, 0xb1, 0x10, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x05, 0x10, 0xb1, 0x18, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb0, 0x1a, 0xd0, 0x30, 0x31, \n\t0x33, 0x11, 0x23, 0x35, 0x33, 0x11, 0x21, 0x20, 0x00, 0x11, 0x15, 0x10, \n\t0x00, 0x21, 0x13, 0x23, 0x11, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, \n\t0x23, 0x23, 0x11, 0x33, 0xa6, 0x87, 0x87, 0x01, 0xf4, 0x01, 0x0b, 0x01, \n\t0x5a, 0xfe, 0xa6, 0xfe, 0xf5, 0x24, 0xf4, 0xc1, 0x9d, 0xb2, 0xb2, 0x9d, \n\t0xc1, 0xf4, 0x02, 0x8c, 0xb5, 0x02, 0x6f, 0xfe, 0xab, 0xfe, 0xf5, 0xf1, \n\t0xfe, 0xf4, 0xfe, 0xad, 0x02, 0x8c, 0xfe, 0x54, 0xd4, 0xab, 0xf3, 0xa9, \n\t0xd4, 0xfe, 0x72, 0x00, 0xff, 0xff, 0x00, 0x88, 0x00, 0x00, 0x05, 0x21, \n\t0x07, 0x6d, 0x02, 0x26, 0x00, 0x31, 0x00, 0x00, 0x01, 0x07, 0x01, 0x58, \n\t0x00, 0xe6, 0x01, 0x74, 0x00, 0x09, 0x00, 0xb3, 0x0f, 0x08, 0x06, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x5c, 0xff, 0xeb, 0x05, 0x1b, \n\t0x07, 0x22, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, \n\t0x01, 0x06, 0x01, 0x5c, 0x00, 0x09, 0x00, 0xb3, 0x1d, 0x07, 0x0a, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x5c, 0xff, 0xeb, 0x05, 0x1b, \n\t0x07, 0x37, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, \n\t0x01, 0xbb, 0x01, 0x71, 0x00, 0x09, 0x00, 0xb3, 0x20, 0x07, 0x0a, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x5c, 0xff, 0xeb, 0x05, 0x1b, \n\t0x07, 0x57, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x01, 0x52, \n\t0x00, 0xc4, 0x01, 0x69, 0x00, 0x09, 0x00, 0xb3, 0x20, 0x08, 0x0a, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x5c, 0xff, 0xeb, 0x05, 0x1b, \n\t0x07, 0x82, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x01, 0x58, \n\t0x00, 0xcd, 0x01, 0x89, 0x00, 0x09, 0x00, 0xb3, 0x1f, 0x08, 0x0a, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x5c, 0xff, 0xeb, 0x05, 0x1b, \n\t0x07, 0x22, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x00, 0x6a, \n\t0x00, 0xa0, 0x01, 0x72, 0x00, 0x0f, 0x00, 0xb3, 0x21, 0x08, 0x0a, 0x04, \n\t0x2b, 0xb0, 0x21, 0x10, 0xb0, 0x1d, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x40, 0x00, 0xcf, 0x03, 0xf7, 0x04, 0x8d, 0x00, 0x0b, \n\t0x00, 0x12, 0x00, 0xb0, 0x0b, 0x2f, 0xb0, 0x03, 0x2f, 0xb0, 0x05, 0xd0, \n\t0xb0, 0x0b, 0x10, 0xb0, 0x09, 0xd0, 0x30, 0x31, 0x13, 0x01, 0x01, 0x37, \n\t0x01, 0x01, 0x17, 0x01, 0x01, 0x07, 0x01, 0x01, 0x40, 0x01, 0x35, 0xfe, \n\t0xcb, 0xac, 0x01, 0x2f, 0x01, 0x30, 0xac, 0xfe, 0xcb, 0x01, 0x35, 0xac, \n\t0xfe, 0xd0, 0xfe, 0xd1, 0x01, 0x73, 0x01, 0x3b, 0x01, 0x3b, 0xa4, 0xfe, \n\t0xca, 0x01, 0x36, 0xa4, 0xfe, 0xc5, 0xfe, 0xc5, 0xa4, 0x01, 0x35, 0xfe, \n\t0xcb, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x5c, 0xff, 0xa1, 0x05, 0x1b, \n\t0x05, 0xee, 0x00, 0x19, 0x00, 0x25, 0x00, 0x31, 0x00, 0x3e, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x10, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0a, 0x3e, \n\t0x59, 0xb1, 0x2e, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x1d, 0xd0, 0xb0, 0x10, 0x10, 0xb1, 0x22, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x2a, 0xd0, 0x30, 0x31, \n\t0x01, 0x10, 0x00, 0x21, 0x22, 0x26, 0x27, 0x07, 0x23, 0x37, 0x26, 0x26, \n\t0x35, 0x11, 0x10, 0x00, 0x21, 0x32, 0x16, 0x17, 0x37, 0x33, 0x07, 0x16, \n\t0x16, 0x15, 0x01, 0x14, 0x16, 0x17, 0x17, 0x01, 0x26, 0x26, 0x23, 0x22, \n\t0x06, 0x15, 0x21, 0x34, 0x26, 0x27, 0x27, 0x01, 0x16, 0x16, 0x33, 0x32, \n\t0x36, 0x35, 0x05, 0x1b, 0xfe, 0xad, 0xfe, 0xf1, 0x4f, 0x90, 0x3d, 0x50, \n\t0x8f, 0x77, 0x68, 0x71, 0x01, 0x4f, 0x01, 0x0d, 0x64, 0xb1, 0x4a, 0x53, \n\t0x8f, 0x82, 0x4f, 0x55, 0xfc, 0x64, 0x1f, 0x1e, 0x06, 0x01, 0xd4, 0x2a, \n\t0x70, 0x44, 0x95, 0xa4, 0x02, 0x78, 0x0e, 0x0b, 0x06, 0xfe, 0x3f, 0x21, \n\t0x52, 0x2f, 0x96, 0xa8, 0x02, 0x55, 0xfe, 0xf4, 0xfe, 0xa2, 0x20, 0x1f, \n\t0x89, 0xcc, 0x53, 0xfd, 0x98, 0x01, 0x06, 0x01, 0x0b, 0x01, 0x5f, 0x35, \n\t0x30, 0x8e, 0xdf, 0x53, 0xe0, 0x81, 0xfe, 0xfa, 0x4a, 0x7f, 0x2c, 0x01, \n\t0x03, 0x23, 0x2d, 0x32, 0xd9, 0xab, 0x2d, 0x54, 0x1f, 0x01, 0xfc, 0xfd, \n\t0x16, 0x17, 0xda, 0xad, 0xff, 0xff, 0x00, 0x78, 0xff, 0xeb, 0x05, 0x08, \n\t0x07, 0x22, 0x02, 0x26, 0x00, 0x38, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, \n\t0x01, 0x0b, 0x01, 0x5c, 0x00, 0x09, 0x00, 0xb3, 0x13, 0x07, 0x09, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x78, 0xff, 0xeb, 0x05, 0x08, \n\t0x07, 0x22, 0x02, 0x26, 0x00, 0x38, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, \n\t0x01, 0xc0, 0x01, 0x5c, 0x00, 0x09, 0x00, 0xb3, 0x16, 0x07, 0x09, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x78, 0xff, 0xeb, 0x05, 0x08, \n\t0x07, 0x42, 0x02, 0x26, 0x00, 0x38, 0x00, 0x00, 0x01, 0x07, 0x01, 0x52, \n\t0x00, 0xc9, 0x01, 0x54, 0x00, 0x09, 0x00, 0xb3, 0x16, 0x08, 0x09, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x78, 0xff, 0xeb, 0x05, 0x08, \n\t0x07, 0x0d, 0x02, 0x26, 0x00, 0x38, 0x00, 0x00, 0x01, 0x07, 0x00, 0x6a, \n\t0x00, 0xa5, 0x01, 0x5d, 0x00, 0x0f, 0x00, 0xb3, 0x17, 0x08, 0x09, 0x04, \n\t0x2b, 0xb0, 0x17, 0x10, 0xb0, 0x13, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x05, 0x00, 0x00, 0x05, 0x07, 0x07, 0x22, 0x02, 0x26, \n\t0x00, 0x3c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, 0x01, 0x8c, 0x01, 0x5c, \n\t0x00, 0x09, 0x00, 0xb3, 0x0e, 0x07, 0x09, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0x00, 0x02, 0x00, 0x84, 0x00, 0x00, 0x04, 0x9f, 0x05, 0xb0, 0x00, 0x0c, \n\t0x00, 0x15, 0x00, 0x41, 0x00, 0xb0, 0x09, 0x2f, 0xb0, 0x01, 0x2f, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x10, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x01, 0x10, 0xb1, 0x0d, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x09, 0x10, 0xb1, 0x0e, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x11, 0x33, \n\t0x32, 0x04, 0x15, 0x14, 0x04, 0x23, 0x23, 0x11, 0x21, 0x11, 0x01, 0x11, \n\t0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x01, 0xa8, 0xdd, 0xfe, 0x01, \n\t0x1c, 0xfe, 0xe4, 0xfe, 0xdd, 0xfe, 0xdc, 0x01, 0x24, 0xdd, 0x7b, 0x7b, \n\t0x7b, 0x7b, 0x05, 0xb0, 0xfe, 0xf2, 0xf8, 0xc8, 0xc9, 0xf8, 0xfe, 0xdf, \n\t0x05, 0xb0, 0xfe, 0x11, 0xfe, 0x41, 0x7f, 0x5f, 0x5f, 0x82, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x87, 0xff, 0xeb, 0x04, 0xcb, 0x06, 0x25, 0x00, 0x27, \n\t0x00, 0x48, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, \n\t0x05, 0x1a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x11, 0x2f, 0x1b, \n\t0xb1, 0x11, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, \n\t0x1b, 0xb1, 0x01, 0x0a, 0x3e, 0x59, 0xb0, 0x11, 0x10, 0xb1, 0x18, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x05, 0x10, \n\t0xb1, 0x24, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x21, 0x21, 0x11, 0x34, 0x24, 0x33, 0x32, 0x16, 0x15, 0x14, \n\t0x06, 0x15, 0x14, 0x00, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, \n\t0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x00, 0x35, 0x34, 0x36, 0x35, \n\t0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x01, 0xaa, 0xfe, 0xdd, 0x01, 0x02, \n\t0xdf, 0xb4, 0xee, 0x6b, 0x01, 0x2c, 0xe6, 0xd9, 0x51, 0x9f, 0x27, 0x37, \n\t0x27, 0x72, 0x41, 0x4c, 0x56, 0xfe, 0xd4, 0x6d, 0x5a, 0x3a, 0x4c, 0x5f, \n\t0x04, 0x4d, 0xe2, 0xf6, 0xbf, 0xb0, 0x6c, 0xc3, 0x44, 0x38, 0xfe, 0xe5, \n\t0x8c, 0xbd, 0xbc, 0x1e, 0x1a, 0xdf, 0x16, 0x21, 0x4c, 0x41, 0x47, 0x01, \n\t0x0d, 0x8e, 0x5a, 0xc8, 0x4b, 0x44, 0x5a, 0x87, 0x75, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x37, 0xff, 0xeb, 0x04, 0x0f, 0x05, 0xda, 0x02, 0x26, \n\t0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x00, 0x43, 0x6b, 0x14, 0x00, 0x09, \n\t0x00, 0xb3, 0x2d, 0x08, 0x19, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x37, 0xff, 0xeb, 0x04, 0x0f, 0x05, 0xda, 0x02, 0x26, \n\t0x00, 0x44, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, 0x01, 0x20, 0x00, 0x14, \n\t0x00, 0x09, 0x00, 0xb3, 0x2f, 0x08, 0x19, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x37, 0xff, 0xeb, 0x04, 0x0f, 0x06, 0x00, 0x02, 0x26, \n\t0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x01, 0x52, 0x29, 0x12, 0x00, 0x09, \n\t0x00, 0xb3, 0x30, 0x03, 0x19, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x37, 0xff, 0xeb, 0x04, 0x0f, 0x06, 0x2b, 0x02, 0x26, \n\t0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x01, 0x58, 0x32, 0x32, 0x00, 0x09, \n\t0x00, 0xb3, 0x2f, 0x09, 0x19, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x37, 0xff, 0xeb, 0x04, 0x0f, 0x05, 0xcb, 0x02, 0x26, \n\t0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x00, 0x6a, 0x05, 0x1b, 0x00, 0x0f, \n\t0x00, 0xb3, 0x30, 0x09, 0x19, 0x04, 0x2b, 0xb0, 0x30, 0x10, 0xb0, 0x2d, \n\t0xd0, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x37, 0xff, 0xeb, 0x04, 0x0f, \n\t0x06, 0x4d, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x01, 0x07, 0x01, 0x56, \n\t0x00, 0xcb, 0x00, 0x77, 0x00, 0x0f, 0x00, 0xb3, 0x35, 0x08, 0x19, 0x04, \n\t0x2b, 0xb0, 0x35, 0x10, 0xb0, 0x3b, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0x00, 0x03, 0x00, 0x2e, 0xff, 0xeb, 0x06, 0x8d, 0x04, 0x4e, 0x00, 0x2e, \n\t0x00, 0x39, 0x00, 0x42, 0x00, 0xde, 0x00, 0xb0, 0x23, 0x2f, 0xb0, 0x0d, \n\t0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1f, 0x2f, 0x1b, 0xb1, 0x1f, 0x0e, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x19, 0x2f, 0x1b, 0xb1, 0x19, \n\t0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, \n\t0x06, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, \n\t0xb1, 0x00, 0x0a, 0x3e, 0x59, 0xb4, 0x7f, 0x0d, 0x8f, 0x0d, 0x02, 0x5d, \n\t0xb2, 0x4f, 0x0d, 0x01, 0x71, 0xb2, 0xbf, 0x0d, 0x01, 0x5d, 0xb2, 0x5f, \n\t0x0d, 0x01, 0x5d, 0xb2, 0x2f, 0x0d, 0x01, 0x5d, 0xb0, 0x19, 0x10, 0xb1, \n\t0x11, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, \n\t0x14, 0x0d, 0x19, 0x11, 0x12, 0x39, 0xb2, 0xbf, 0x23, 0x01, 0x5d, 0xb2, \n\t0x4f, 0x23, 0x01, 0x71, 0xb2, 0x1f, 0x23, 0x01, 0x72, 0xb2, 0x8f, 0x23, \n\t0x01, 0x71, 0xb2, 0xff, 0x23, 0x01, 0x5d, 0xb4, 0x5f, 0x23, 0x6f, 0x23, \n\t0x02, 0x5d, 0xb2, 0x9f, 0x23, 0x01, 0x72, 0xb0, 0x00, 0x10, 0xb1, 0x28, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x06, \n\t0x10, 0xb1, 0x2f, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x0d, 0x10, 0xb1, 0x33, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x1f, 0x10, 0xb1, 0x3a, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x23, 0x10, 0xb1, 0x3f, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x05, 0x22, 0x26, 0x27, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, \n\t0x33, 0x33, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x25, 0x27, 0x26, \n\t0x36, 0x33, 0x32, 0x16, 0x17, 0x36, 0x36, 0x33, 0x32, 0x12, 0x15, 0x15, \n\t0x21, 0x07, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x25, \n\t0x32, 0x36, 0x37, 0x35, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x01, 0x22, \n\t0x06, 0x07, 0x17, 0x21, 0x35, 0x34, 0x26, 0x04, 0xde, 0x81, 0xc9, 0x43, \n\t0x3c, 0xcb, 0x8b, 0xc0, 0xd1, 0xfe, 0xf3, 0xb5, 0x52, 0x4a, 0x51, 0x5c, \n\t0xfe, 0xe5, 0x02, 0x06, 0xff, 0xd4, 0x66, 0xa8, 0x3b, 0x3d, 0xa3, 0x63, \n\t0xd4, 0xf2, 0xfd, 0x76, 0x02, 0x04, 0x7c, 0x7c, 0x5c, 0x7c, 0x4e, 0x4d, \n\t0x3e, 0xd6, 0xfc, 0x9b, 0x3a, 0x7e, 0x25, 0xb3, 0x62, 0x6d, 0x53, 0x03, \n\t0x22, 0x5f, 0x5e, 0x07, 0x02, 0x01, 0x6a, 0x55, 0x15, 0x51, 0x4c, 0x44, \n\t0x59, 0xb5, 0x9d, 0x9f, 0xac, 0x3b, 0x4f, 0x5b, 0x4b, 0x38, 0x12, 0x06, \n\t0x90, 0xbc, 0x37, 0x34, 0x34, 0x37, 0xfe, 0xf8, 0xe2, 0x9e, 0x06, 0x70, \n\t0x85, 0x28, 0x29, 0xb8, 0x30, 0x49, 0xce, 0x3d, 0x2a, 0xb0, 0x58, 0x3f, \n\t0x3b, 0x45, 0x02, 0xb4, 0x7b, 0x69, 0x05, 0x1c, 0x5e, 0x6f, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x3e, 0xfe, 0x34, 0x03, 0xf2, 0x04, 0x4e, 0x02, 0x26, \n\t0x00, 0x46, 0x00, 0x00, 0x00, 0x07, 0x00, 0x7a, 0x01, 0x3e, 0xff, 0xff, \n\t0xff, 0xff, 0x00, 0x4d, 0xff, 0xeb, 0x04, 0x02, 0x05, 0xe0, 0x02, 0x26, \n\t0x00, 0x48, 0x00, 0x00, 0x01, 0x06, 0x00, 0x43, 0x6d, 0x1a, 0x00, 0x09, \n\t0x00, 0xb3, 0x21, 0x08, 0x07, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x4d, 0xff, 0xeb, 0x04, 0x02, 0x05, 0xe0, 0x02, 0x26, \n\t0x00, 0x48, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, 0x01, 0x22, 0x00, 0x1a, \n\t0x00, 0x09, 0x00, 0xb3, 0x24, 0x08, 0x07, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x4d, 0xff, 0xeb, 0x04, 0x02, 0x06, 0x01, 0x02, 0x26, \n\t0x00, 0x48, 0x00, 0x00, 0x01, 0x06, 0x01, 0x52, 0x2b, 0x13, 0x00, 0x09, \n\t0x00, 0xb3, 0x24, 0x03, 0x07, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x4d, 0xff, 0xeb, 0x04, 0x02, 0x05, 0xcc, 0x02, 0x26, \n\t0x00, 0x48, 0x00, 0x00, 0x01, 0x06, 0x00, 0x6a, 0x07, 0x1c, 0x00, 0x0f, \n\t0x00, 0xb3, 0x24, 0x09, 0x07, 0x04, 0x2b, 0xb0, 0x24, 0x10, 0xb0, 0x21, \n\t0xd0, 0x30, 0x31, 0x00, 0xff, 0xff, 0xff, 0xb2, 0x00, 0x00, 0x01, 0xae, \n\t0x05, 0xe0, 0x02, 0x26, 0x00, 0xf3, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, \n\t0xff, 0x65, 0x00, 0x1a, 0x00, 0x09, 0x00, 0xb3, 0x05, 0x08, 0x02, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x84, 0x00, 0x00, 0x02, 0x82, \n\t0x05, 0xcb, 0x02, 0x26, 0x00, 0xf3, 0x00, 0x00, 0x01, 0x06, 0x00, 0x76, \n\t0x18, 0x05, 0x00, 0x09, 0x00, 0xb3, 0x08, 0x08, 0x02, 0x04, 0x2b, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xac, 0x00, 0x00, 0x02, 0x8e, \n\t0x05, 0xed, 0x02, 0x26, 0x00, 0xf3, 0x00, 0x00, 0x01, 0x07, 0x01, 0x52, \n\t0xff, 0x23, 0xff, 0xff, 0x00, 0x09, 0x00, 0xb3, 0x08, 0x03, 0x02, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0xff, 0x9b, 0x00, 0x00, 0x02, 0x99, \n\t0x05, 0xb6, 0x02, 0x26, 0x00, 0xf3, 0x00, 0x00, 0x01, 0x07, 0x00, 0x6a, \n\t0xfe, 0xff, 0x00, 0x06, 0x00, 0x0f, 0x00, 0xb3, 0x08, 0x03, 0x02, 0x04, \n\t0x2b, 0xb0, 0x08, 0x10, 0xb0, 0x05, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x30, 0xff, 0xeb, 0x04, 0x70, 0x05, 0xed, 0x00, 0x21, \n\t0x00, 0x2e, 0x00, 0x3a, 0x00, 0xb0, 0x1c, 0x2f, 0xb0, 0x0d, 0x2f, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x0d, 0x10, 0xb0, 0x15, 0xd0, 0xb0, 0x07, 0x10, 0xb1, 0x22, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0d, 0x10, \n\t0xb1, 0x29, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x01, 0x16, 0x12, 0x15, 0x15, 0x14, 0x00, 0x23, 0x22, 0x00, \n\t0x35, 0x34, 0x00, 0x33, 0x32, 0x16, 0x17, 0x37, 0x26, 0x26, 0x27, 0x07, \n\t0x27, 0x37, 0x27, 0x26, 0x26, 0x27, 0x37, 0x16, 0x16, 0x17, 0x37, 0x17, \n\t0x01, 0x32, 0x36, 0x35, 0x35, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, \n\t0x16, 0x03, 0x99, 0x66, 0x71, 0xfe, 0xc6, 0xeb, 0xee, 0xfe, 0xd3, 0x01, \n\t0x0d, 0xe7, 0x51, 0x90, 0x34, 0x04, 0x0e, 0x50, 0x3c, 0xf5, 0x4e, 0xc0, \n\t0x01, 0x1f, 0x4a, 0x28, 0x5c, 0x58, 0xa1, 0x45, 0xc6, 0x4d, 0xfe, 0x14, \n\t0x74, 0x89, 0x23, 0x80, 0x57, 0x7a, 0x84, 0x88, 0x05, 0x0a, 0x6a, 0xfe, \n\t0xea, 0xa4, 0xc4, 0xfa, 0xfe, 0xc3, 0x01, 0x19, 0xd0, 0xe2, 0x01, 0x11, \n\t0x33, 0x2d, 0x04, 0x53, 0x8d, 0x37, 0x88, 0x71, 0x6a, 0x06, 0x10, 0x1c, \n\t0x0c, 0xda, 0x13, 0x43, 0x2f, 0x6d, 0x71, 0xfb, 0x67, 0xc1, 0x96, 0x76, \n\t0x27, 0x34, 0x9e, 0x81, 0x70, 0x99, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6b, \n\t0x00, 0x00, 0x04, 0x1a, 0x06, 0x2b, 0x02, 0x26, 0x00, 0x51, 0x00, 0x00, \n\t0x01, 0x06, 0x01, 0x58, 0x53, 0x32, 0x00, 0x09, 0x00, 0xb3, 0x17, 0x09, \n\t0x04, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x43, \n\t0xff, 0xeb, 0x04, 0x40, 0x05, 0xe0, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x43, 0x00, 0x8c, 0x00, 0x1a, 0x00, 0x09, 0x00, 0xb3, \n\t0x1d, 0x08, 0x03, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x43, \n\t0xff, 0xeb, 0x04, 0x40, 0x05, 0xe0, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x76, 0x01, 0x41, 0x00, 0x1a, 0x00, 0x09, 0x00, 0xb3, \n\t0x20, 0x08, 0x03, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x43, \n\t0xff, 0xeb, 0x04, 0x40, 0x06, 0x00, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, \n\t0x01, 0x06, 0x01, 0x52, 0x4a, 0x12, 0x00, 0x09, 0x00, 0xb3, 0x20, 0x03, \n\t0x03, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x43, \n\t0xff, 0xeb, 0x04, 0x40, 0x06, 0x2b, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, \n\t0x01, 0x06, 0x01, 0x58, 0x53, 0x32, 0x00, 0x09, 0x00, 0xb3, 0x1f, 0x09, \n\t0x03, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x43, \n\t0xff, 0xeb, 0x04, 0x40, 0x05, 0xcb, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, \n\t0x01, 0x06, 0x00, 0x6a, 0x26, 0x1b, 0x00, 0x0f, 0x00, 0xb3, 0x20, 0x09, \n\t0x03, 0x04, 0x2b, 0xb0, 0x20, 0x10, 0xb0, 0x1d, 0xd0, 0x30, 0x31, 0x00, \n\t0x00, 0x03, 0x00, 0x3f, 0x00, 0xa4, 0x04, 0x44, 0x04, 0xb6, 0x00, 0x03, \n\t0x00, 0x07, 0x00, 0x0b, 0x00, 0x40, 0x00, 0xb0, 0x02, 0x2f, 0xb1, 0x00, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x02, \n\t0x10, 0xb0, 0x05, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, \n\t0x06, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x00, 0x10, \n\t0xb0, 0x0a, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x09, \n\t0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, 0x01, 0x21, \n\t0x35, 0x21, 0x25, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x04, 0x44, \n\t0xfb, 0xfb, 0x04, 0x05, 0xfe, 0x91, 0xfe, 0xdb, 0x01, 0x25, 0xfe, 0xdb, \n\t0x01, 0x25, 0x02, 0x3d, 0xe3, 0xad, 0xe9, 0xfb, 0xee, 0xe9, 0x00, 0x00, \n\t0x00, 0x03, 0x00, 0x43, 0xff, 0x73, 0x04, 0x40, 0x04, 0xbf, 0x00, 0x19, \n\t0x00, 0x25, 0x00, 0x31, 0x00, 0x3e, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x0a, 0x3e, 0x59, 0xb1, 0x2e, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x1d, 0xd0, \n\t0xb0, 0x03, 0x10, 0xb1, 0x22, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x2a, 0xd0, 0x30, 0x31, 0x13, 0x34, 0x00, 0x33, \n\t0x32, 0x16, 0x17, 0x37, 0x33, 0x07, 0x16, 0x16, 0x15, 0x15, 0x14, 0x00, \n\t0x23, 0x22, 0x26, 0x27, 0x07, 0x23, 0x37, 0x26, 0x26, 0x35, 0x21, 0x14, \n\t0x16, 0x17, 0x17, 0x01, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x21, 0x34, \n\t0x26, 0x27, 0x27, 0x03, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x43, 0x01, \n\t0x0e, 0xef, 0x32, 0x5d, 0x2c, 0x46, 0xa1, 0x67, 0x5f, 0x66, 0xfe, 0xf1, \n\t0xef, 0x30, 0x58, 0x28, 0x47, 0xa1, 0x67, 0x65, 0x69, 0x01, 0x23, 0x11, \n\t0x12, 0x06, 0x01, 0x04, 0x13, 0x29, 0x17, 0x71, 0x69, 0x01, 0xb6, 0x10, \n\t0x0e, 0x06, 0xff, 0x0f, 0x25, 0x15, 0x71, 0x69, 0x02, 0x27, 0xf2, 0x01, \n\t0x35, 0x10, 0x0e, 0x8f, 0xd3, 0x4a, 0xeb, 0x90, 0x15, 0xf4, 0xfe, 0xcd, \n\t0x0e, 0x0c, 0x92, 0xd3, 0x47, 0xef, 0x96, 0x3e, 0x68, 0x22, 0x01, 0x02, \n\t0x13, 0x08, 0x09, 0xb7, 0x8f, 0x36, 0x60, 0x22, 0x01, 0xfd, 0xf7, 0x07, \n\t0x05, 0xb4, 0x93, 0x00, 0xff, 0xff, 0x00, 0x69, 0xff, 0xeb, 0x04, 0x18, \n\t0x05, 0xcb, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, \n\t0x00, 0x8b, 0x00, 0x05, 0x00, 0x09, 0x00, 0xb3, 0x15, 0x08, 0x07, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x69, 0xff, 0xeb, 0x04, 0x18, \n\t0x05, 0xcb, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, \n\t0x01, 0x40, 0x00, 0x05, 0x00, 0x09, 0x00, 0xb3, 0x18, 0x08, 0x07, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x69, 0xff, 0xeb, 0x04, 0x18, \n\t0x05, 0xed, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, 0x01, 0x06, 0x01, 0x52, \n\t0x49, 0xff, 0x00, 0x09, 0x00, 0xb3, 0x18, 0x03, 0x07, 0x04, 0x2b, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x69, 0xff, 0xeb, 0x04, 0x18, \n\t0x05, 0xb6, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, 0x01, 0x06, 0x00, 0x6a, \n\t0x25, 0x06, 0x00, 0x0f, 0x00, 0xb3, 0x19, 0x03, 0x07, 0x04, 0x2b, 0xb0, \n\t0x19, 0x10, 0xb0, 0x15, 0xd0, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x05, \n\t0xfe, 0x4b, 0x04, 0x11, 0x05, 0xcb, 0x02, 0x26, 0x00, 0x5c, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x76, 0x01, 0x0b, 0x00, 0x05, 0x00, 0x09, 0x00, 0xb3, \n\t0x1a, 0x08, 0x14, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x02, 0x00, 0x79, \n\t0xfe, 0x60, 0x04, 0x4a, 0x06, 0x18, 0x00, 0x13, 0x00, 0x21, 0x00, 0x55, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x1a, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, \n\t0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, \n\t0x07, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, \n\t0xb1, 0x03, 0x0a, 0x3e, 0x59, 0xb0, 0x10, 0x10, 0xb1, 0x17, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, \n\t0x1e, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, \n\t0x31, 0x01, 0x14, 0x02, 0x23, 0x22, 0x26, 0x27, 0x11, 0x21, 0x11, 0x23, \n\t0x11, 0x21, 0x11, 0x36, 0x36, 0x33, 0x32, 0x12, 0x11, 0x21, 0x34, 0x26, \n\t0x23, 0x22, 0x06, 0x07, 0x11, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x04, \n\t0x4a, 0xde, 0xc7, 0x55, 0x84, 0x2f, 0xfe, 0xdd, 0x01, 0x01, 0x24, 0x2f, \n\t0x82, 0x55, 0xc9, 0xde, 0xfe, 0xdc, 0x66, 0x69, 0x42, 0x5d, 0x1b, 0x1b, \n\t0x5d, 0x44, 0x6a, 0x63, 0x01, 0xff, 0xf0, 0xfe, 0xdc, 0x3f, 0x3d, 0xfd, \n\t0xf9, 0x01, 0xa0, 0x06, 0x18, 0xfd, 0xb1, 0x40, 0x45, 0xfe, 0xc6, 0xff, \n\t0x00, 0x99, 0xbe, 0x36, 0x32, 0xfe, 0x26, 0x2e, 0x30, 0xa6, 0x8e, 0x00, \n\t0xff, 0xff, 0x00, 0x05, 0xfe, 0x4b, 0x04, 0x11, 0x05, 0xb6, 0x02, 0x26, \n\t0x00, 0x5c, 0x00, 0x00, 0x01, 0x06, 0x00, 0x6a, 0xf2, 0x06, 0x00, 0x0f, \n\t0x00, 0xb3, 0x1b, 0x03, 0x14, 0x04, 0x2b, 0xb0, 0x1b, 0x10, 0xb0, 0x17, \n\t0xd0, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x0c, 0x00, 0x00, 0x05, 0x1f, \n\t0x06, 0xf2, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x00, 0x71, \n\t0x00, 0x8e, 0x01, 0x41, 0x00, 0x09, 0x00, 0xb3, 0x0d, 0x08, 0x04, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x37, 0xff, 0xeb, 0x04, 0x0f, \n\t0x05, 0xb1, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x00, 0x71, \n\t0x20, 0x00, 0x00, 0x09, 0x00, 0xb3, 0x2d, 0x09, 0x19, 0x04, 0x2b, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0c, 0x00, 0x00, 0x05, 0x1f, \n\t0x07, 0x68, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x01, 0x54, \n\t0x00, 0xcb, 0x01, 0xb8, 0x00, 0x09, 0x00, 0xb3, 0x10, 0x08, 0x04, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x37, 0xff, 0xeb, 0x04, 0x0f, \n\t0x06, 0x26, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x01, 0x54, \n\t0x5c, 0x76, 0x00, 0x09, 0x00, 0xb3, 0x30, 0x09, 0x19, 0x04, 0x2b, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0c, 0xfe, 0x58, 0x05, 0x3a, \n\t0x05, 0xb0, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x00, 0x07, 0x01, 0x57, \n\t0x03, 0x36, 0x00, 0x00, 0xff, 0xff, 0x00, 0x37, 0xfe, 0x58, 0x04, 0x29, \n\t0x04, 0x4e, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x00, 0x07, 0x01, 0x57, \n\t0x02, 0x25, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5d, 0xff, 0xeb, 0x04, 0xdb, \n\t0x07, 0x37, 0x02, 0x26, 0x00, 0x26, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, \n\t0x01, 0xa1, 0x01, 0x71, 0x00, 0x09, 0x00, 0xb3, 0x22, 0x07, 0x0b, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x3e, 0xff, 0xeb, 0x03, 0xf2, \n\t0x05, 0xe0, 0x02, 0x26, 0x00, 0x46, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, \n\t0x01, 0x13, 0x00, 0x1a, 0x00, 0x09, 0x00, 0xb3, 0x22, 0x08, 0x0f, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x5d, 0xff, 0xeb, 0x04, 0xdb, \n\t0x07, 0x57, 0x02, 0x26, 0x00, 0x26, 0x00, 0x00, 0x01, 0x07, 0x01, 0x52, \n\t0x00, 0xaa, 0x01, 0x69, 0x00, 0x09, 0x00, 0xb3, 0x22, 0x08, 0x0b, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x3e, 0xff, 0xeb, 0x03, 0xf2, \n\t0x06, 0x00, 0x02, 0x26, 0x00, 0x46, 0x00, 0x00, 0x01, 0x06, 0x01, 0x52, \n\t0x1c, 0x12, 0x00, 0x09, 0x00, 0xb3, 0x22, 0x03, 0x0f, 0x04, 0x2b, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5d, 0xff, 0xeb, 0x04, 0xdb, \n\t0x07, 0x47, 0x02, 0x26, 0x00, 0x26, 0x00, 0x00, 0x01, 0x07, 0x01, 0x55, \n\t0x01, 0x74, 0x01, 0x8b, 0x00, 0x09, 0x00, 0xb3, 0x1f, 0x08, 0x0b, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x3e, 0xff, 0xeb, 0x03, 0xf2, \n\t0x05, 0xf0, 0x02, 0x26, 0x00, 0x46, 0x00, 0x00, 0x01, 0x07, 0x01, 0x55, \n\t0x00, 0xe6, 0x00, 0x34, 0x00, 0x09, 0x00, 0xb3, 0x1f, 0x09, 0x0f, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x5d, 0xff, 0xeb, 0x04, 0xdb, \n\t0x07, 0x66, 0x02, 0x26, 0x00, 0x26, 0x00, 0x00, 0x01, 0x07, 0x01, 0x53, \n\t0x00, 0xc1, 0x01, 0x72, 0x00, 0x09, 0x00, 0xb3, 0x22, 0x08, 0x0b, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x3e, 0xff, 0xeb, 0x03, 0xf2, \n\t0x06, 0x0f, 0x02, 0x26, 0x00, 0x46, 0x00, 0x00, 0x01, 0x06, 0x01, 0x53, \n\t0x33, 0x1b, 0x00, 0x09, 0x00, 0xb3, 0x22, 0x09, 0x0f, 0x04, 0x2b, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x88, 0x00, 0x00, 0x04, 0xe1, \n\t0x07, 0x51, 0x02, 0x26, 0x00, 0x27, 0x00, 0x00, 0x01, 0x07, 0x01, 0x53, \n\t0x00, 0x71, 0x01, 0x5d, 0x00, 0x09, 0x00, 0xb3, 0x19, 0x08, 0x01, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x43, 0xff, 0xeb, 0x05, 0x58, \n\t0x06, 0x18, 0x00, 0x26, 0x00, 0x47, 0x00, 0x00, 0x01, 0x07, 0x03, 0x27, \n\t0x04, 0x20, 0x05, 0x07, 0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x24, 0x2f, 0x1b, 0xb1, 0x24, 0x1a, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x1f, 0x00, 0x00, 0x04, 0xff, 0x05, 0xb0, 0x00, 0x0d, \n\t0x00, 0x1b, 0x00, 0x60, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, \n\t0x1b, 0xb1, 0x04, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, \n\t0x2f, 0x1b, 0xb1, 0x05, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, 0x59, 0xb0, 0x04, 0x10, 0xb1, \n\t0x01, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x0e, 0xd0, 0xb0, 0x00, 0x10, 0xb1, 0x10, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x05, 0x10, 0xb1, 0x18, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb0, \n\t0x1a, 0xd0, 0x30, 0x31, 0x33, 0x11, 0x23, 0x35, 0x33, 0x11, 0x21, 0x20, \n\t0x00, 0x11, 0x15, 0x10, 0x00, 0x21, 0x13, 0x23, 0x11, 0x33, 0x32, 0x36, \n\t0x35, 0x35, 0x34, 0x26, 0x23, 0x23, 0x11, 0x33, 0xa6, 0x87, 0x87, 0x01, \n\t0xf4, 0x01, 0x0b, 0x01, 0x5a, 0xfe, 0xa6, 0xfe, 0xf5, 0x24, 0xf4, 0xc1, \n\t0x9d, 0xb2, 0xb2, 0x9d, 0xc1, 0xf4, 0x02, 0x8c, 0xb5, 0x02, 0x6f, 0xfe, \n\t0xab, 0xfe, 0xf5, 0xf1, 0xfe, 0xf4, 0xfe, 0xad, 0x02, 0x8c, 0xfe, 0x54, \n\t0xd4, 0xab, 0xf3, 0xa9, 0xd4, 0xfe, 0x72, 0x00, 0x00, 0x02, 0x00, 0x43, \n\t0xff, 0xeb, 0x04, 0xa2, 0x06, 0x18, 0x00, 0x19, 0x00, 0x27, 0x00, 0x84, \n\t0x00, 0xb0, 0x19, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x16, 0x2f, 0x1b, \n\t0xb1, 0x16, 0x1a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, \n\t0x1b, 0xb1, 0x0e, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, \n\t0x2f, 0x1b, 0xb1, 0x07, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0a, 0x3e, 0x59, 0xb2, 0x9f, 0x19, 0x01, \n\t0x5d, 0xb2, 0x2f, 0x19, 0x01, 0x71, 0xb2, 0x7f, 0x19, 0x01, 0x5d, 0xb2, \n\t0x3f, 0x19, 0x01, 0x5d, 0xb0, 0x19, 0x10, 0xb1, 0x00, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x12, 0xd0, 0xb0, 0x19, \n\t0x10, 0xb0, 0x14, 0xd0, 0xb0, 0x07, 0x10, 0xb1, 0x1d, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0e, 0x10, 0xb1, 0x24, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x01, 0x23, 0x11, 0x23, 0x27, 0x06, 0x06, 0x23, 0x22, 0x02, 0x35, 0x35, \n\t0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x35, 0x23, 0x35, 0x33, 0x35, 0x21, \n\t0x15, 0x33, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x11, 0x26, 0x26, \n\t0x23, 0x22, 0x06, 0x15, 0x04, 0xa2, 0x90, 0xfb, 0x18, 0x33, 0x8b, 0x5a, \n\t0xc7, 0xdd, 0xdd, 0xc9, 0x51, 0x82, 0x31, 0xea, 0xea, 0x01, 0x25, 0x90, \n\t0xfc, 0xc4, 0x60, 0x6c, 0x3f, 0x5e, 0x1e, 0x1e, 0x5d, 0x3e, 0x6b, 0x63, \n\t0x04, 0xc4, 0xfb, 0x3c, 0x84, 0x4b, 0x4e, 0x01, 0x24, 0xf0, 0x15, 0x01, \n\t0x00, 0x01, 0x3a, 0x46, 0x41, 0xfd, 0xb5, 0x9f, 0x9f, 0xfc, 0x86, 0x8e, \n\t0xa3, 0x33, 0x31, 0x01, 0xcd, 0x33, 0x39, 0xbe, 0x99, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x88, 0x00, 0x00, 0x04, 0x6d, 0x06, 0xf2, 0x02, 0x26, \n\t0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x00, 0x71, 0x00, 0x5c, 0x01, 0x41, \n\t0x00, 0x09, 0x00, 0xb3, 0x0d, 0x08, 0x06, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x4d, 0xff, 0xeb, 0x04, 0x02, 0x05, 0xb1, 0x02, 0x26, \n\t0x00, 0x48, 0x00, 0x00, 0x01, 0x06, 0x00, 0x71, 0x22, 0x00, 0x00, 0x09, \n\t0x00, 0xb3, 0x21, 0x09, 0x07, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x88, 0x00, 0x00, 0x04, 0x6d, 0x07, 0x68, 0x02, 0x26, \n\t0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x01, 0x54, 0x00, 0x98, 0x01, 0xb8, \n\t0x00, 0x09, 0x00, 0xb3, 0x10, 0x08, 0x06, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x4d, 0xff, 0xeb, 0x04, 0x02, 0x06, 0x27, 0x02, 0x26, \n\t0x00, 0x48, 0x00, 0x00, 0x01, 0x06, 0x01, 0x54, 0x5e, 0x77, 0x00, 0x09, \n\t0x00, 0xb3, 0x24, 0x09, 0x07, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x88, 0x00, 0x00, 0x04, 0x6d, 0x07, 0x32, 0x02, 0x26, \n\t0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x01, 0x55, 0x01, 0x2f, 0x01, 0x76, \n\t0x00, 0x09, 0x00, 0xb3, 0x0d, 0x08, 0x06, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x4d, 0xff, 0xeb, 0x04, 0x02, 0x05, 0xf1, 0x02, 0x26, \n\t0x00, 0x48, 0x00, 0x00, 0x01, 0x07, 0x01, 0x55, 0x00, 0xf5, 0x00, 0x35, \n\t0x00, 0x09, 0x00, 0xb3, 0x21, 0x09, 0x07, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x88, 0xfe, 0x58, 0x04, 0x6d, 0x05, 0xb0, 0x02, 0x26, \n\t0x00, 0x28, 0x00, 0x00, 0x00, 0x07, 0x01, 0x57, 0x01, 0x20, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x4d, 0xfe, 0x83, 0x04, 0x02, 0x04, 0x4f, 0x02, 0x26, \n\t0x00, 0x48, 0x00, 0x00, 0x00, 0x07, 0x01, 0x57, 0x01, 0xd8, 0x00, 0x2b, \n\t0xff, 0xff, 0x00, 0x88, 0x00, 0x00, 0x04, 0x6d, 0x07, 0x51, 0x02, 0x26, \n\t0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x01, 0x53, 0x00, 0x7c, 0x01, 0x5d, \n\t0x00, 0x09, 0x00, 0xb3, 0x11, 0x08, 0x06, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x4d, 0xff, 0xeb, 0x04, 0x02, 0x06, 0x10, 0x02, 0x26, \n\t0x00, 0x48, 0x00, 0x00, 0x01, 0x06, 0x01, 0x53, 0x42, 0x1c, 0x00, 0x09, \n\t0x00, 0xb3, 0x25, 0x09, 0x07, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x63, 0xff, 0xeb, 0x04, 0xe6, 0x07, 0x57, 0x02, 0x26, \n\t0x00, 0x2a, 0x00, 0x00, 0x01, 0x07, 0x01, 0x52, 0x00, 0xab, 0x01, 0x69, \n\t0x00, 0x09, 0x00, 0xb3, 0x25, 0x08, 0x0a, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x43, 0xfe, 0x4b, 0x04, 0x14, 0x06, 0x00, 0x02, 0x26, \n\t0x00, 0x4a, 0x00, 0x00, 0x01, 0x06, 0x01, 0x52, 0x35, 0x12, 0x00, 0x09, \n\t0x00, 0xb3, 0x30, 0x03, 0x03, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x63, 0xff, 0xeb, 0x04, 0xe6, 0x07, 0x7d, 0x02, 0x26, \n\t0x00, 0x2a, 0x00, 0x00, 0x01, 0x07, 0x01, 0x54, 0x00, 0xde, 0x01, 0xcd, \n\t0x00, 0x09, 0x00, 0xb3, 0x25, 0x08, 0x0a, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x43, 0xfe, 0x4b, 0x04, 0x14, 0x06, 0x26, 0x02, 0x26, \n\t0x00, 0x4a, 0x00, 0x00, 0x01, 0x06, 0x01, 0x54, 0x68, 0x76, 0x00, 0x09, \n\t0x00, 0xb3, 0x30, 0x09, 0x03, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x63, 0xff, 0xeb, 0x04, 0xe6, 0x07, 0x47, 0x02, 0x26, \n\t0x00, 0x2a, 0x00, 0x00, 0x01, 0x07, 0x01, 0x55, 0x01, 0x75, 0x01, 0x8b, \n\t0x00, 0x09, 0x00, 0xb3, 0x21, 0x08, 0x0a, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x43, 0xfe, 0x4b, 0x04, 0x14, 0x05, 0xf0, 0x02, 0x26, \n\t0x00, 0x4a, 0x00, 0x00, 0x01, 0x07, 0x01, 0x55, 0x00, 0xff, 0x00, 0x34, \n\t0x00, 0x09, 0x00, 0xb3, 0x2d, 0x09, 0x03, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x63, 0xfe, 0x0b, 0x04, 0xe6, 0x05, 0xc5, 0x02, 0x26, \n\t0x00, 0x2a, 0x00, 0x00, 0x01, 0x07, 0x03, 0x27, 0x01, 0xd2, 0xfe, 0x87, \n\t0x00, 0x0f, 0x00, 0xb4, 0x30, 0x26, 0x40, 0x26, 0x02, 0x5d, 0xb2, 0xa0, \n\t0x26, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x43, \n\t0xfe, 0x4b, 0x04, 0x14, 0x06, 0x9d, 0x02, 0x26, 0x00, 0x4a, 0x00, 0x00, \n\t0x01, 0x07, 0x03, 0x53, 0x01, 0x32, 0x00, 0x9a, 0x00, 0x09, 0x00, 0xb3, \n\t0x31, 0x08, 0x03, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x88, \n\t0x00, 0x00, 0x05, 0x21, 0x07, 0x42, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x52, 0x00, 0xdb, 0x01, 0x54, 0x00, 0x09, 0x00, 0xb3, \n\t0x10, 0x08, 0x07, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x69, \n\t0x00, 0x00, 0x04, 0x18, 0x07, 0x43, 0x02, 0x26, 0x00, 0x4b, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x52, 0x00, 0x0f, 0x01, 0x55, 0x00, 0x08, 0x00, 0xb2, \n\t0x18, 0x13, 0x03, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, \n\t0x00, 0x00, 0x05, 0x9e, 0x05, 0xb0, 0x00, 0x13, 0x00, 0x17, 0x00, 0x89, \n\t0x00, 0xb0, 0x11, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x15, 0x2f, 0x1b, \n\t0xb1, 0x15, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, \n\t0x1b, 0xb1, 0x0f, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, \n\t0x2f, 0x1b, 0xb1, 0x12, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x0a, 0x3e, 0x59, 0xb2, 0x7f, 0x11, \n\t0x01, 0x5d, 0xb2, 0x2f, 0x11, 0x01, 0x5d, 0xb2, 0x0f, 0x11, 0x01, 0x5d, \n\t0xb0, 0x11, 0x10, 0xb0, 0x00, 0xd0, 0xb0, 0x11, 0x10, 0xb1, 0x16, 0x03, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0xd0, \n\t0xb0, 0x15, 0x10, 0xb1, 0x06, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x16, 0x10, 0xb0, 0x0a, 0xd0, 0xb0, 0x11, 0x10, \n\t0xb0, 0x0d, 0xd0, 0x30, 0x31, 0x01, 0x33, 0x15, 0x23, 0x11, 0x21, 0x11, \n\t0x21, 0x11, 0x21, 0x11, 0x23, 0x35, 0x33, 0x11, 0x21, 0x11, 0x21, 0x11, \n\t0x21, 0x01, 0x21, 0x35, 0x21, 0x05, 0x1f, 0x7f, 0x7f, 0xfe, 0xdd, 0xfd, \n\t0xae, 0xfe, 0xdc, 0x76, 0x76, 0x01, 0x24, 0x02, 0x52, 0x01, 0x23, 0xfc, \n\t0x8b, 0x02, 0x52, 0xfd, 0xae, 0x04, 0xaf, 0xab, 0xfb, 0xfc, 0x02, 0x5d, \n\t0xfd, 0xa3, 0x04, 0x04, 0xab, 0x01, 0x01, 0xfe, 0xff, 0x01, 0x01, 0xfd, \n\t0x8e, 0xc6, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfa, 0x00, 0x00, 0x04, 0x36, \n\t0x06, 0x18, 0x00, 0x1b, 0x00, 0x78, 0x00, 0xb0, 0x1b, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x18, 0x2f, 0x1b, 0xb1, 0x18, 0x1a, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x0e, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x0a, \n\t0x3e, 0x59, 0xb2, 0x9f, 0x1b, 0x01, 0x5d, 0xb2, 0x2f, 0x1b, 0x01, 0x71, \n\t0xb2, 0x7f, 0x1b, 0x01, 0x5d, 0xb2, 0x3f, 0x1b, 0x01, 0x5d, 0xb0, 0x1b, \n\t0x10, 0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x05, 0x10, 0xb1, 0x0e, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb0, 0x14, 0xd0, 0xb0, 0x1b, \n\t0x10, 0xb0, 0x16, 0xd0, 0x30, 0x31, 0x01, 0x23, 0x11, 0x36, 0x36, 0x33, \n\t0x32, 0x16, 0x15, 0x11, 0x21, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, \n\t0x11, 0x21, 0x11, 0x23, 0x35, 0x33, 0x35, 0x21, 0x15, 0x33, 0x02, 0x99, \n\t0xee, 0x33, 0x94, 0x5a, 0xa9, 0xc1, 0xfe, 0xdc, 0x59, 0x58, 0x3c, 0x5c, \n\t0x1e, 0xfe, 0xdc, 0x8d, 0x8d, 0x01, 0x24, 0xee, 0x04, 0xc1, 0xfe, 0xf0, \n\t0x4a, 0x53, 0xe1, 0xeb, 0xfd, 0x7e, 0x02, 0x84, 0x7e, 0x69, 0x2b, 0x27, \n\t0xfc, 0xe7, 0x04, 0xc1, 0xb5, 0xa2, 0xa2, 0x00, 0xff, 0xff, 0xff, 0xb7, \n\t0x00, 0x00, 0x02, 0xa4, 0x07, 0x6d, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x58, 0xff, 0x40, 0x01, 0x74, 0x00, 0x09, 0x00, 0xb3, \n\t0x07, 0x08, 0x02, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0xff, 0xa3, \n\t0x00, 0x00, 0x02, 0x90, 0x06, 0x16, 0x02, 0x26, 0x00, 0xf3, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x58, 0xff, 0x2c, 0x00, 0x1d, 0x00, 0x09, 0x00, 0xb3, \n\t0x07, 0x09, 0x02, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0xff, 0xc2, \n\t0x00, 0x00, 0x02, 0x9d, 0x06, 0xf2, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x71, 0xff, 0x2e, 0x01, 0x41, 0x00, 0x09, 0x00, 0xb3, \n\t0x05, 0x08, 0x02, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0xff, 0xae, \n\t0x00, 0x00, 0x02, 0x89, 0x05, 0x9d, 0x02, 0x26, 0x00, 0xf3, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x71, 0xff, 0x1a, 0xff, 0xec, 0x00, 0x09, 0x00, 0xb3, \n\t0x05, 0x09, 0x02, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0xff, 0xd4, \n\t0x00, 0x00, 0x02, 0x88, 0x07, 0x68, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x54, 0xff, 0x6a, 0x01, 0xb8, 0x00, 0x09, 0x00, 0xb3, \n\t0x08, 0x08, 0x02, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0xff, 0xc0, \n\t0x00, 0x00, 0x02, 0x74, 0x06, 0x11, 0x02, 0x26, 0x00, 0xf3, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x54, 0xff, 0x56, 0x00, 0x61, 0x00, 0x09, 0x00, 0xb3, \n\t0x08, 0x09, 0x02, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x29, \n\t0xfe, 0x58, 0x01, 0xda, 0x05, 0xb0, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, \n\t0x00, 0x06, 0x01, 0x57, 0xd6, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, \n\t0xfe, 0x58, 0x01, 0xbf, 0x06, 0x18, 0x02, 0x26, 0x00, 0x4c, 0x00, 0x00, \n\t0x00, 0x06, 0x01, 0x57, 0xbb, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x92, \n\t0x00, 0x00, 0x01, 0xc2, 0x07, 0x32, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x55, 0x00, 0x00, 0x01, 0x76, 0x00, 0x09, 0x00, 0xb3, \n\t0x05, 0x08, 0x02, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x01, 0x00, 0x85, \n\t0x00, 0x00, 0x01, 0xa9, 0x04, 0x3a, 0x00, 0x03, 0x00, 0x1d, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0e, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, \n\t0x59, 0x30, 0x31, 0x21, 0x21, 0x11, 0x21, 0x01, 0xa9, 0xfe, 0xdc, 0x01, \n\t0x24, 0x04, 0x3a, 0x00, 0xff, 0xff, 0x00, 0x9a, 0xff, 0xeb, 0x06, 0x66, \n\t0x05, 0xb0, 0x00, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x07, 0x00, 0x2d, \n\t0x02, 0x59, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7f, 0xfe, 0x4b, 0x03, 0xce, \n\t0x06, 0x18, 0x00, 0x26, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x07, 0x00, 0x4d, \n\t0x02, 0x23, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3a, 0xff, 0xeb, 0x04, 0xde, \n\t0x07, 0x3e, 0x02, 0x26, 0x00, 0x2d, 0x00, 0x00, 0x01, 0x07, 0x01, 0x52, \n\t0x01, 0x73, 0x01, 0x50, 0x00, 0x09, 0x00, 0xb3, 0x15, 0x08, 0x00, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0xff, 0xa6, 0xfe, 0x4b, 0x02, 0x88, \n\t0x05, 0xe5, 0x02, 0x26, 0x01, 0x50, 0x00, 0x00, 0x01, 0x07, 0x01, 0x52, \n\t0xff, 0x1d, 0xff, 0xf7, 0x00, 0x09, 0x00, 0xb3, 0x14, 0x08, 0x0f, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x88, 0xfe, 0x17, 0x05, 0x39, \n\t0x05, 0xb0, 0x02, 0x26, 0x00, 0x2e, 0x00, 0x00, 0x01, 0x07, 0x03, 0x27, \n\t0x01, 0xa6, 0xfe, 0x93, 0x00, 0x11, 0x00, 0xb6, 0x30, 0x12, 0x40, 0x12, \n\t0x50, 0x12, 0x03, 0x5d, 0xb2, 0xa0, 0x12, 0x01, 0x5d, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x70, 0xfe, 0x18, 0x04, 0x5e, 0x06, 0x18, 0x02, 0x26, \n\t0x00, 0x4e, 0x00, 0x00, 0x01, 0x07, 0x03, 0x27, 0x01, 0x56, 0xfe, 0x94, \n\t0x00, 0x11, 0x00, 0xb6, 0x30, 0x12, 0x40, 0x12, 0x50, 0x12, 0x03, 0x5d, \n\t0xb2, 0xa0, 0x12, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, 0x01, 0x00, 0x81, \n\t0x00, 0x00, 0x04, 0x94, 0x04, 0x3a, 0x00, 0x0c, 0x00, 0x5a, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x18, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0e, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0e, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, \n\t0x0b, 0x0a, 0x3e, 0x59, 0xb0, 0x06, 0x10, 0xb1, 0x01, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0a, 0x06, 0x01, 0x11, \n\t0x12, 0x39, 0x30, 0x31, 0x01, 0x23, 0x11, 0x21, 0x11, 0x21, 0x11, 0x33, \n\t0x01, 0x21, 0x01, 0x01, 0x21, 0x02, 0x19, 0x74, 0xfe, 0xdc, 0x01, 0x24, \n\t0x57, 0x01, 0x17, 0x01, 0x70, 0xfe, 0x80, 0x01, 0x91, 0xfe, 0x8a, 0x01, \n\t0x95, 0xfe, 0x6b, 0x04, 0x3a, 0xfe, 0x64, 0x01, 0x9c, 0xfe, 0x05, 0xfd, \n\t0xc1, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x88, 0x00, 0x00, 0x04, 0x34, \n\t0x07, 0x0b, 0x02, 0x26, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, \n\t0x00, 0x1c, 0x01, 0x45, 0x00, 0x09, 0x00, 0xb3, 0x0a, 0x07, 0x04, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x7d, 0x00, 0x00, 0x02, 0x7b, \n\t0x07, 0x4b, 0x02, 0x26, 0x00, 0x4f, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, \n\t0x00, 0x11, 0x01, 0x85, 0x00, 0x08, 0x00, 0xb2, 0x08, 0x02, 0x03, 0x2b, \n\t0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x88, 0xfe, 0x18, 0x04, 0x34, \n\t0x05, 0xb0, 0x02, 0x26, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x07, 0x03, 0x27, \n\t0x01, 0x80, 0xfe, 0x94, 0x00, 0x11, 0x00, 0xb6, 0x30, 0x0b, 0x40, 0x0b, \n\t0x50, 0x0b, 0x03, 0x5d, 0xb2, 0xa0, 0x0b, 0x01, 0x5d, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x6e, 0xfe, 0x18, 0x01, 0xa3, 0x06, 0x18, 0x02, 0x26, \n\t0x00, 0x4f, 0x00, 0x00, 0x01, 0x07, 0x03, 0x27, 0x00, 0x31, 0xfe, 0x94, \n\t0x00, 0x11, 0x00, 0xb6, 0x30, 0x09, 0x40, 0x09, 0x50, 0x09, 0x03, 0x5d, \n\t0xb2, 0xa0, 0x09, 0x01, 0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x88, \n\t0x00, 0x00, 0x04, 0x34, 0x05, 0xb2, 0x02, 0x26, 0x00, 0x2f, 0x00, 0x00, \n\t0x01, 0x07, 0x03, 0x27, 0x02, 0x2a, 0x04, 0xa2, 0x00, 0x10, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x10, 0x3e, 0x59, \n\t0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7f, 0x00, 0x00, 0x02, 0xf7, \n\t0x06, 0x18, 0x00, 0x26, 0x00, 0x4f, 0x00, 0x00, 0x01, 0x07, 0x03, 0x27, \n\t0x01, 0xbf, 0x05, 0x07, 0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x1a, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x88, 0x00, 0x00, 0x04, 0x34, 0x05, 0xb0, 0x02, 0x26, \n\t0x00, 0x2f, 0x00, 0x00, 0x01, 0x07, 0x01, 0x55, 0x01, 0xb0, 0xfd, 0xde, \n\t0x00, 0x06, 0x00, 0xb0, 0x08, 0x2f, 0x30, 0x31, 0xff, 0xff, 0x00, 0x7f, \n\t0x00, 0x00, 0x03, 0x33, 0x06, 0x18, 0x00, 0x26, 0x00, 0x4f, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x55, 0x01, 0x71, 0xfd, 0xaa, 0x00, 0x06, 0x00, 0xb0, \n\t0x06, 0x2f, 0x30, 0x31, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x00, 0x04, 0x23, \n\t0x05, 0xb0, 0x00, 0x0d, 0x00, 0x59, 0x00, 0xb0, 0x01, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x10, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x01, 0x10, 0xb0, 0x00, 0xd0, 0xb0, 0x01, 0x10, 0xb1, 0x02, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0xd0, \n\t0xb0, 0x06, 0x10, 0xb1, 0x04, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb0, 0x08, 0xd0, 0xb0, 0x09, 0xd0, \n\t0xb0, 0x00, 0x10, 0xb0, 0x0b, 0xd0, 0xb0, 0x0a, 0xd0, 0x30, 0x31, 0x01, \n\t0x37, 0x15, 0x07, 0x11, 0x21, 0x15, 0x21, 0x11, 0x07, 0x35, 0x37, 0x11, \n\t0x21, 0x01, 0x9b, 0xfb, 0xfb, 0x02, 0x88, 0xfc, 0x54, 0x6b, 0x6b, 0x01, \n\t0x24, 0x03, 0x72, 0x48, 0xc3, 0x48, 0xfe, 0x31, 0xe0, 0x02, 0x5b, 0x1f, \n\t0xc3, 0x1f, 0x02, 0x92, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x02, 0x44, \n\t0x06, 0x18, 0x00, 0x0b, 0x00, 0x47, 0x00, 0xb0, 0x01, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x1a, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x01, 0x10, 0xb0, 0x00, 0xd0, 0xb0, 0x01, 0x10, 0xb1, 0x02, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0xd0, \n\t0xb0, 0x06, 0xd0, 0xb0, 0x07, 0xd0, 0xb0, 0x00, 0x10, 0xb0, 0x09, 0xd0, \n\t0xb0, 0x08, 0xd0, 0x30, 0x31, 0x01, 0x37, 0x15, 0x07, 0x11, 0x21, 0x11, \n\t0x07, 0x35, 0x37, 0x11, 0x21, 0x01, 0xb7, 0x8d, 0x8d, 0xfe, 0xdc, 0x84, \n\t0x84, 0x01, 0x24, 0x03, 0x8b, 0x2f, 0xc3, 0x2f, 0xfd, 0x38, 0x02, 0x67, \n\t0x2b, 0xc3, 0x2b, 0x02, 0xee, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x88, \n\t0x00, 0x00, 0x05, 0x21, 0x07, 0x22, 0x02, 0x26, 0x00, 0x31, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x76, 0x01, 0xd4, 0x01, 0x5c, 0x00, 0x09, 0x00, 0xb3, \n\t0x10, 0x07, 0x06, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x6b, \n\t0x00, 0x00, 0x04, 0x1a, 0x05, 0xe0, 0x02, 0x26, 0x00, 0x51, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x76, 0x01, 0x41, 0x00, 0x1a, 0x00, 0x09, 0x00, 0xb3, \n\t0x18, 0x08, 0x04, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x88, \n\t0xfe, 0x18, 0x05, 0x21, 0x05, 0xb0, 0x02, 0x26, 0x00, 0x31, 0x00, 0x00, \n\t0x01, 0x07, 0x03, 0x27, 0x01, 0xf4, 0xfe, 0x94, 0x00, 0x11, 0x00, 0xb6, \n\t0x30, 0x10, 0x40, 0x10, 0x50, 0x10, 0x03, 0x5d, 0xb2, 0xa0, 0x10, 0x01, \n\t0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x6b, 0xfe, 0x18, 0x04, 0x1a, \n\t0x04, 0x4e, 0x02, 0x26, 0x00, 0x51, 0x00, 0x00, 0x01, 0x07, 0x03, 0x27, \n\t0x01, 0x61, 0xfe, 0x94, 0x00, 0x11, 0x00, 0xb6, 0x30, 0x18, 0x40, 0x18, \n\t0x50, 0x18, 0x03, 0x5d, 0xb2, 0xa0, 0x18, 0x01, 0x5d, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x88, 0x00, 0x00, 0x05, 0x21, 0x07, 0x51, 0x02, 0x26, \n\t0x00, 0x31, 0x00, 0x00, 0x01, 0x07, 0x01, 0x53, 0x00, 0xf4, 0x01, 0x5d, \n\t0x00, 0x09, 0x00, 0xb3, 0x11, 0x08, 0x06, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x6b, 0x00, 0x00, 0x04, 0x1a, 0x06, 0x0f, 0x02, 0x26, \n\t0x00, 0x51, 0x00, 0x00, 0x01, 0x06, 0x01, 0x53, 0x61, 0x1b, 0x00, 0x09, \n\t0x00, 0xb3, 0x19, 0x09, 0x04, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0xff, 0xe6, 0x00, 0x00, 0x04, 0x1a, 0x06, 0x17, 0x02, 0x26, \n\t0x00, 0x51, 0x00, 0x00, 0x01, 0x07, 0x03, 0x27, 0xff, 0xa9, 0x05, 0x07, \n\t0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x18, 0x2f, 0x1b, 0xb1, \n\t0x18, 0x1a, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, 0x00, 0x01, 0x00, 0x83, \n\t0xfe, 0x4b, 0x05, 0x1c, 0x05, 0xb0, 0x00, 0x18, 0x00, 0x5f, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x10, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x14, 0x2f, 0x1b, 0xb1, 0x14, 0x10, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, \n\t0x0f, 0x0a, 0x3e, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x0b, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x14, 0x10, 0xb0, 0x10, \n\t0xd0, 0xb0, 0x0f, 0x10, 0xb0, 0x17, 0xd0, 0x30, 0x31, 0x01, 0x11, 0x14, \n\t0x06, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, \n\t0x35, 0x01, 0x07, 0x11, 0x21, 0x11, 0x21, 0x01, 0x37, 0x11, 0x05, 0x1c, \n\t0xca, 0xb3, 0x29, 0x44, 0x24, 0x0e, 0x17, 0x32, 0x1b, 0x39, 0x40, 0xfd, \n\t0xb5, 0x06, 0xfe, 0xdb, 0x01, 0x25, 0x02, 0x4b, 0x06, 0x05, 0xb0, 0xfa, \n\t0x28, 0xbe, 0xcf, 0x08, 0x09, 0xdd, 0x06, 0x07, 0x5a, 0x52, 0x28, 0x03, \n\t0xd6, 0x01, 0xfc, 0x2b, 0x05, 0xb0, 0xfc, 0x2b, 0x01, 0x03, 0xd4, 0x00, \n\t0x00, 0x01, 0x00, 0x6b, 0xfe, 0x4b, 0x04, 0x18, 0x04, 0x4e, 0x00, 0x1f, \n\t0x00, 0x55, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, \n\t0x04, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, \n\t0xb1, 0x00, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, \n\t0x1b, 0xb1, 0x0b, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1d, \n\t0x2f, 0x1b, 0xb1, 0x1d, 0x0a, 0x3e, 0x59, 0xb0, 0x0b, 0x10, 0xb1, 0x12, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, \n\t0x10, 0xb1, 0x19, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0x30, 0x31, 0x01, 0x17, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, \n\t0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, \n\t0x35, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x21, 0x11, 0x01, \n\t0x7b, 0x0d, 0x35, 0x9e, 0x61, 0xa4, 0xb8, 0xca, 0xb4, 0x28, 0x44, 0x24, \n\t0x0e, 0x16, 0x32, 0x1b, 0x3a, 0x3e, 0x51, 0x51, 0x40, 0x62, 0x20, 0xfe, \n\t0xdc, 0x04, 0x3a, 0x98, 0x51, 0x5b, 0xd3, 0xe4, 0xfd, 0x41, 0xbe, 0xcf, \n\t0x08, 0x09, 0xe0, 0x06, 0x06, 0x56, 0x52, 0x02, 0xbe, 0x74, 0x61, 0x2f, \n\t0x2a, 0xfc, 0xee, 0x04, 0x3a, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5c, \n\t0xff, 0xeb, 0x05, 0x1b, 0x07, 0x07, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x71, 0x00, 0xbb, 0x01, 0x56, 0x00, 0x09, 0x00, 0xb3, \n\t0x1d, 0x08, 0x0a, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x43, \n\t0xff, 0xeb, 0x04, 0x40, 0x05, 0xb1, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, \n\t0x01, 0x06, 0x00, 0x71, 0x41, 0x00, 0x00, 0x09, 0x00, 0xb3, 0x1d, 0x09, \n\t0x03, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5c, \n\t0xff, 0xeb, 0x05, 0x1b, 0x07, 0x7d, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x54, 0x00, 0xf7, 0x01, 0xcd, 0x00, 0x09, 0x00, 0xb3, \n\t0x20, 0x08, 0x0a, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x43, \n\t0xff, 0xeb, 0x04, 0x40, 0x06, 0x26, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, \n\t0x01, 0x06, 0x01, 0x54, 0x7d, 0x76, 0x00, 0x09, 0x00, 0xb3, 0x20, 0x09, \n\t0x03, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5c, \n\t0xff, 0xeb, 0x05, 0x1b, 0x07, 0x60, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x59, 0x00, 0xf9, 0x01, 0x72, 0x00, 0x0f, 0x00, 0xb3, \n\t0x26, 0x08, 0x0a, 0x04, 0x2b, 0xb0, 0x26, 0x10, 0xb0, 0x1f, 0xd0, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x43, 0xff, 0xeb, 0x04, 0x6f, \n\t0x06, 0x09, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x01, 0x59, \n\t0x7f, 0x1b, 0x00, 0x0f, 0x00, 0xb3, 0x26, 0x08, 0x03, 0x04, 0x2b, 0xb0, \n\t0x26, 0x10, 0xb0, 0x1f, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x02, 0x00, 0x61, \n\t0xff, 0xeb, 0x07, 0x42, 0x05, 0xc5, 0x00, 0x17, 0x00, 0x25, 0x00, 0x8f, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x16, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, \n\t0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, \n\t0x0f, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, \n\t0xb1, 0x00, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, \n\t0x1b, 0xb1, 0x04, 0x0a, 0x3e, 0x59, 0xb0, 0x0f, 0x10, 0xb1, 0x10, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x12, 0x10, \n\t0xb1, 0x15, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x00, 0x10, 0xb1, 0x17, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x18, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0b, 0x10, 0xb1, 0x1f, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x21, \n\t0x21, 0x06, 0x06, 0x23, 0x20, 0x00, 0x11, 0x11, 0x10, 0x00, 0x21, 0x32, \n\t0x16, 0x17, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x05, \n\t0x32, 0x36, 0x37, 0x11, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x14, \n\t0x16, 0x07, 0x42, 0xfc, 0x9d, 0x5c, 0x81, 0x43, 0xfe, 0xf2, 0xfe, 0xb0, \n\t0x01, 0x4e, 0x01, 0x0e, 0x45, 0x8e, 0x4f, 0x03, 0x61, 0xfd, 0x41, 0x02, \n\t0x5b, 0xfd, 0xa5, 0x02, 0xc1, 0xfb, 0x7d, 0x28, 0x4f, 0x27, 0x2d, 0x4d, \n\t0x26, 0x94, 0xa5, 0xa7, 0x0a, 0x0b, 0x01, 0x4b, 0x01, 0x0a, 0x01, 0x30, \n\t0x01, 0x09, 0x01, 0x4c, 0x0c, 0x09, 0xe1, 0xfe, 0x92, 0xe1, 0xfe, 0x60, \n\t0x14, 0x04, 0x05, 0x04, 0x06, 0x04, 0x05, 0xbd, 0xb5, 0xfe, 0xce, 0xb6, \n\t0xbe, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x43, 0xff, 0xeb, 0x07, 0x0c, \n\t0x04, 0x4e, 0x00, 0x22, 0x00, 0x30, 0x00, 0x39, 0x00, 0x92, 0x00, 0xb0, \n\t0x17, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, \n\t0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x13, 0x2f, 0x1b, 0xb1, \n\t0x13, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, \n\t0xb1, 0x00, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, \n\t0x1b, 0xb1, 0x06, 0x0a, 0x3e, 0x59, 0xb2, 0xff, 0x17, 0x01, 0x5d, 0xb2, \n\t0x8f, 0x17, 0x01, 0x71, 0xb2, 0x9f, 0x17, 0x01, 0x72, 0xb2, 0x1f, 0x17, \n\t0x01, 0x72, 0xb2, 0x4f, 0x17, 0x01, 0x71, 0xb2, 0xbf, 0x17, 0x01, 0x5d, \n\t0xb4, 0x5f, 0x17, 0x6f, 0x17, 0x02, 0x5d, 0xb0, 0x00, 0x10, 0xb1, 0x1c, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x26, \n\t0xd0, 0xb0, 0x0d, 0x10, 0xb1, 0x2d, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x31, 0xd0, 0xb0, 0x17, 0x10, 0xb1, 0x36, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x05, 0x22, 0x26, 0x27, 0x06, 0x06, 0x23, 0x22, 0x00, 0x35, 0x35, 0x34, \n\t0x00, 0x33, 0x32, 0x16, 0x17, 0x36, 0x36, 0x33, 0x32, 0x12, 0x15, 0x15, \n\t0x21, 0x07, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x01, \n\t0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, \n\t0x15, 0x01, 0x22, 0x06, 0x07, 0x17, 0x21, 0x35, 0x34, 0x26, 0x05, 0x59, \n\t0x7f, 0xca, 0x44, 0x43, 0xc8, 0x7f, 0xf0, 0xfe, 0xf1, 0x01, 0x0e, 0xef, \n\t0x7f, 0xc8, 0x43, 0x41, 0xbd, 0x77, 0xdb, 0xf2, 0xfd, 0x7a, 0x02, 0x08, \n\t0x7f, 0x6d, 0x61, 0x80, 0x4c, 0x4f, 0x42, 0xd6, 0xfb, 0x8a, 0x68, 0x74, \n\t0x71, 0x69, 0x6a, 0x72, 0x71, 0x69, 0x03, 0xd9, 0x51, 0x5e, 0x0b, 0x03, \n\t0x01, 0x66, 0x57, 0x15, 0x5c, 0x55, 0x55, 0x5c, 0x01, 0x33, 0xf4, 0x15, \n\t0xf2, 0x01, 0x35, 0x5d, 0x53, 0x54, 0x5c, 0xfe, 0xf8, 0xe1, 0x9f, 0x06, \n\t0x6b, 0x8a, 0x27, 0x2a, 0xb4, 0x36, 0x47, 0x02, 0x27, 0x94, 0xb3, 0xb4, \n\t0x93, 0x15, 0x90, 0xb6, 0xb7, 0x8f, 0x01, 0x46, 0x7c, 0x65, 0x05, 0x1a, \n\t0x5d, 0x6f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x88, 0x00, 0x00, 0x05, 0x12, \n\t0x07, 0x22, 0x02, 0x26, 0x00, 0x35, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, \n\t0x01, 0x76, 0x01, 0x5c, 0x00, 0x09, 0x00, 0xb3, 0x28, 0x07, 0x03, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x70, 0x00, 0x00, 0x03, 0x06, \n\t0x05, 0xe0, 0x02, 0x26, 0x00, 0x55, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, \n\t0x00, 0x9c, 0x00, 0x1a, 0x00, 0x09, 0x00, 0xb3, 0x14, 0x08, 0x0c, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x88, 0xfe, 0x18, 0x05, 0x12, \n\t0x05, 0xb0, 0x02, 0x26, 0x00, 0x35, 0x00, 0x00, 0x01, 0x07, 0x03, 0x27, \n\t0x01, 0x96, 0xfe, 0x94, 0x00, 0x11, 0x00, 0xb6, 0x30, 0x28, 0x40, 0x28, \n\t0x50, 0x28, 0x03, 0x5d, 0xb2, 0xa0, 0x28, 0x01, 0x5d, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x6c, 0xfe, 0x18, 0x02, 0xc8, 0x04, 0x4e, 0x02, 0x26, \n\t0x00, 0x55, 0x00, 0x00, 0x01, 0x07, 0x03, 0x27, 0x00, 0x2f, 0xfe, 0x94, \n\t0x00, 0x11, 0x00, 0xb6, 0x30, 0x14, 0x40, 0x14, 0x50, 0x14, 0x03, 0x5d, \n\t0xb2, 0xa0, 0x14, 0x01, 0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x88, \n\t0x00, 0x00, 0x05, 0x12, 0x07, 0x51, 0x02, 0x26, 0x00, 0x35, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x53, 0x00, 0x96, 0x01, 0x5d, 0x00, 0x09, 0x00, 0xb3, \n\t0x29, 0x08, 0x03, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x21, \n\t0x00, 0x00, 0x03, 0x1a, 0x06, 0x0f, 0x02, 0x26, 0x00, 0x55, 0x00, 0x00, \n\t0x01, 0x06, 0x01, 0x53, 0xbe, 0x1b, 0x00, 0x09, 0x00, 0xb3, 0x14, 0x09, \n\t0x0c, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x55, \n\t0xff, 0xeb, 0x04, 0xbe, 0x07, 0x37, 0x02, 0x26, 0x00, 0x36, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x76, 0x01, 0x89, 0x01, 0x71, 0x00, 0x09, 0x00, 0xb3, \n\t0x2b, 0x07, 0x09, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x3a, \n\t0xff, 0xeb, 0x03, 0xd4, 0x05, 0xe0, 0x02, 0x26, 0x00, 0x56, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x76, 0x01, 0x08, 0x00, 0x1a, 0x00, 0x09, 0x00, 0xb3, \n\t0x2b, 0x08, 0x09, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x55, \n\t0xff, 0xeb, 0x04, 0xbe, 0x07, 0x57, 0x02, 0x26, 0x00, 0x36, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x52, 0x00, 0x92, 0x01, 0x69, 0x00, 0x09, 0x00, 0xb3, \n\t0x2a, 0x08, 0x09, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x3a, \n\t0xff, 0xeb, 0x03, 0xd4, 0x06, 0x00, 0x02, 0x26, 0x00, 0x56, 0x00, 0x00, \n\t0x01, 0x06, 0x01, 0x52, 0x11, 0x12, 0x00, 0x09, 0x00, 0xb3, 0x2a, 0x03, \n\t0x09, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x55, \n\t0xfe, 0x2d, 0x04, 0xbe, 0x05, 0xc5, 0x02, 0x26, 0x00, 0x36, 0x00, 0x00, \n\t0x00, 0x07, 0x00, 0x7a, 0x01, 0xb1, 0xff, 0xf8, 0xff, 0xff, 0x00, 0x3a, \n\t0xfe, 0x2d, 0x03, 0xd4, 0x04, 0x4e, 0x02, 0x26, 0x00, 0x56, 0x00, 0x00, \n\t0x00, 0x07, 0x00, 0x7a, 0x01, 0x1e, 0xff, 0xf8, 0xff, 0xff, 0x00, 0x55, \n\t0xff, 0xeb, 0x04, 0xbe, 0x07, 0x66, 0x02, 0x26, 0x00, 0x36, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x53, 0x00, 0xa9, 0x01, 0x72, 0x00, 0x09, 0x00, 0xb3, \n\t0x2c, 0x08, 0x09, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x3a, \n\t0xff, 0xeb, 0x03, 0xd4, 0x06, 0x0f, 0x02, 0x26, 0x00, 0x56, 0x00, 0x00, \n\t0x01, 0x06, 0x01, 0x53, 0x28, 0x1b, 0x00, 0x09, 0x00, 0xb3, 0x2c, 0x09, \n\t0x09, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1c, \n\t0xfe, 0x18, 0x04, 0x76, 0x05, 0xb0, 0x02, 0x26, 0x00, 0x37, 0x00, 0x00, \n\t0x01, 0x07, 0x03, 0x27, 0x01, 0x6b, 0xfe, 0x94, 0x00, 0x11, 0x00, 0xb6, \n\t0x30, 0x0c, 0x40, 0x0c, 0x50, 0x0c, 0x03, 0x5d, 0xb2, 0xa0, 0x0c, 0x01, \n\t0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x09, 0xfe, 0x0e, 0x02, 0x92, \n\t0x05, 0x43, 0x02, 0x26, 0x00, 0x57, 0x00, 0x00, 0x01, 0x07, 0x03, 0x27, \n\t0x00, 0xd0, 0xfe, 0x8a, 0x00, 0x0f, 0x00, 0xb4, 0x30, 0x1c, 0x40, 0x1c, \n\t0x02, 0x5d, 0xb2, 0xa0, 0x1c, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x1c, 0x00, 0x00, 0x04, 0x76, 0x07, 0x51, 0x02, 0x26, \n\t0x00, 0x37, 0x00, 0x00, 0x01, 0x07, 0x01, 0x53, 0x00, 0x6b, 0x01, 0x5d, \n\t0x00, 0x09, 0x00, 0xb3, 0x0d, 0x08, 0x06, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x09, 0xff, 0xeb, 0x03, 0x43, 0x06, 0x35, 0x00, 0x26, \n\t0x00, 0x57, 0x00, 0x00, 0x01, 0x07, 0x03, 0x27, 0x02, 0x0b, 0x05, 0x25, \n\t0x00, 0x06, 0x00, 0xb0, 0x1c, 0x2f, 0x30, 0x31, 0x00, 0x01, 0x00, 0x1c, \n\t0x00, 0x00, 0x04, 0x76, 0x05, 0xb0, 0x00, 0x0f, 0x00, 0x47, 0x00, 0xb0, \n\t0x0f, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, \n\t0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, \n\t0x03, 0x0a, 0x3e, 0x59, 0xb0, 0x0f, 0x10, 0xb1, 0x00, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0f, 0x10, 0xb0, 0x07, \n\t0xd0, 0xb0, 0x0a, 0x10, 0xb1, 0x09, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0d, 0xd0, 0x30, 0x31, 0x01, 0x23, 0x11, \n\t0x21, 0x11, 0x23, 0x35, 0x33, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, \n\t0x33, 0x03, 0x9f, 0xc5, 0xfe, 0xdc, 0xb6, 0xb6, 0xfe, 0x66, 0x04, 0x5a, \n\t0xfe, 0x64, 0xc5, 0x02, 0xf5, 0xfd, 0x0b, 0x02, 0xf5, 0xb5, 0x01, 0x25, \n\t0xe1, 0xe1, 0xfe, 0xdb, 0x00, 0x01, 0xff, 0xf3, 0xff, 0xeb, 0x02, 0x92, \n\t0x05, 0x43, 0x00, 0x1f, 0x00, 0x69, 0x00, 0xb0, 0x1a, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x1d, 0x2f, 0x1b, 0xb1, 0x1d, 0x0e, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x13, 0x2f, 0x1b, 0xb1, 0x13, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x1d, 0x10, 0xb0, 0x01, 0xd0, 0xb0, 0x1d, 0x10, 0xb1, 0x1c, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0xd0, \n\t0xb2, 0x10, 0x1a, 0x01, 0x5d, 0xb2, 0xa0, 0x1a, 0x01, 0x5d, 0xb0, 0x1a, \n\t0x10, 0xb0, 0x05, 0xd0, 0xb0, 0x1a, 0x10, 0xb1, 0x17, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x08, 0xd0, 0xb0, 0x13, \n\t0x10, 0xb1, 0x0c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0x30, 0x31, 0x01, 0x11, 0x33, 0x15, 0x23, 0x15, 0x33, 0x15, 0x23, \n\t0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, \n\t0x26, 0x35, 0x35, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0x11, 0x01, \n\t0xcb, 0xb6, 0xb6, 0xc7, 0xc7, 0x34, 0x2c, 0x17, 0x21, 0x16, 0x19, 0x2c, \n\t0x54, 0x31, 0x97, 0xa3, 0xb4, 0xb4, 0x9e, 0x9e, 0x05, 0x43, 0xfe, 0xf7, \n\t0xcd, 0x9d, 0xb5, 0xd5, 0x3f, 0x36, 0x05, 0x06, 0xd3, 0x0f, 0x0f, 0xa6, \n\t0xb4, 0xd6, 0xb5, 0x9d, 0xcd, 0x01, 0x09, 0x00, 0xff, 0xff, 0x00, 0x78, \n\t0xff, 0xeb, 0x05, 0x08, 0x07, 0x6d, 0x02, 0x26, 0x00, 0x38, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x58, 0x00, 0xd2, 0x01, 0x74, 0x00, 0x09, 0x00, 0xb3, \n\t0x15, 0x08, 0x08, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x69, \n\t0xff, 0xeb, 0x04, 0x18, 0x06, 0x16, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, \n\t0x01, 0x06, 0x01, 0x58, 0x52, 0x1d, 0x00, 0x09, 0x00, 0xb3, 0x17, 0x09, \n\t0x07, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x78, \n\t0xff, 0xeb, 0x05, 0x08, 0x06, 0xf2, 0x02, 0x26, 0x00, 0x38, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x71, 0x00, 0xc0, 0x01, 0x41, 0x00, 0x09, 0x00, 0xb3, \n\t0x13, 0x08, 0x08, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x69, \n\t0xff, 0xeb, 0x04, 0x18, 0x05, 0x9d, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, \n\t0x01, 0x06, 0x00, 0x71, 0x40, 0xec, 0x00, 0x09, 0x00, 0xb3, 0x15, 0x09, \n\t0x07, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x78, \n\t0xff, 0xeb, 0x05, 0x08, 0x07, 0x68, 0x02, 0x26, 0x00, 0x38, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x54, 0x00, 0xfc, 0x01, 0xb8, 0x00, 0x09, 0x00, 0xb3, \n\t0x16, 0x08, 0x08, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x69, \n\t0xff, 0xeb, 0x04, 0x18, 0x06, 0x11, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, \n\t0x01, 0x06, 0x01, 0x54, 0x7c, 0x61, 0x00, 0x09, 0x00, 0xb3, 0x18, 0x09, \n\t0x07, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x78, \n\t0xff, 0xeb, 0x05, 0x08, 0x07, 0x8f, 0x02, 0x26, 0x00, 0x38, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x56, 0x01, 0x6b, 0x01, 0xb9, 0x00, 0x0f, 0x00, 0xb3, \n\t0x1b, 0x07, 0x08, 0x04, 0x2b, 0xb0, 0x1b, 0x10, 0xb0, 0x21, 0xd0, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x69, 0xff, 0xeb, 0x04, 0x18, \n\t0x06, 0x38, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, 0x01, 0x07, 0x01, 0x56, \n\t0x00, 0xeb, 0x00, 0x62, 0x00, 0x0f, 0x00, 0xb3, 0x1d, 0x07, 0x07, 0x04, \n\t0x2b, 0xb0, 0x1d, 0x10, 0xb0, 0x23, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x78, 0xff, 0xeb, 0x05, 0x08, 0x07, 0x4b, 0x02, 0x26, \n\t0x00, 0x38, 0x00, 0x00, 0x01, 0x07, 0x01, 0x59, 0x00, 0xfe, 0x01, 0x5d, \n\t0x00, 0x0f, 0x00, 0xb3, 0x1c, 0x08, 0x08, 0x04, 0x2b, 0xb0, 0x1c, 0x10, \n\t0xb0, 0x15, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x69, \n\t0xff, 0xeb, 0x04, 0x6e, 0x05, 0xf4, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, \n\t0x01, 0x06, 0x01, 0x59, 0x7e, 0x06, 0x00, 0x0f, 0x00, 0xb3, 0x1e, 0x08, \n\t0x07, 0x04, 0x2b, 0xb0, 0x1e, 0x10, 0xb0, 0x17, 0xd0, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x78, 0xfe, 0x58, 0x05, 0x08, 0x05, 0xb0, 0x02, 0x26, \n\t0x00, 0x38, 0x00, 0x00, 0x00, 0x07, 0x01, 0x57, 0x01, 0x94, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x69, 0xfe, 0x58, 0x04, 0x31, 0x04, 0x3a, 0x02, 0x26, \n\t0x00, 0x58, 0x00, 0x00, 0x00, 0x07, 0x01, 0x57, 0x02, 0x2d, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x18, 0x00, 0x00, 0x06, 0xfb, 0x07, 0x42, 0x02, 0x26, \n\t0x00, 0x3a, 0x00, 0x00, 0x01, 0x07, 0x01, 0x52, 0x01, 0x93, 0x01, 0x54, \n\t0x00, 0x09, 0x00, 0xb3, 0x14, 0x08, 0x0a, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x1d, 0x00, 0x00, 0x05, 0xc2, 0x05, 0xed, 0x02, 0x26, \n\t0x00, 0x5a, 0x00, 0x00, 0x01, 0x07, 0x01, 0x52, 0x00, 0xf9, 0xff, 0xff, \n\t0x00, 0x09, 0x00, 0xb3, 0x14, 0x03, 0x0a, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x05, 0x00, 0x00, 0x05, 0x07, 0x07, 0x42, 0x02, 0x26, \n\t0x00, 0x3c, 0x00, 0x00, 0x01, 0x07, 0x01, 0x52, 0x00, 0x95, 0x01, 0x54, \n\t0x00, 0x09, 0x00, 0xb3, 0x0e, 0x08, 0x08, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x05, 0xfe, 0x4b, 0x04, 0x11, 0x05, 0xed, 0x02, 0x26, \n\t0x00, 0x5c, 0x00, 0x00, 0x01, 0x06, 0x01, 0x52, 0x14, 0xff, 0x00, 0x09, \n\t0x00, 0xb3, 0x1a, 0x03, 0x14, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x05, 0x00, 0x00, 0x05, 0x07, 0x07, 0x0d, 0x02, 0x26, \n\t0x00, 0x3c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x6a, 0x00, 0x71, 0x01, 0x5d, \n\t0x00, 0x0f, 0x00, 0xb3, 0x0f, 0x08, 0x08, 0x04, 0x2b, 0xb0, 0x0f, 0x10, \n\t0xb0, 0x0b, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4d, \n\t0x00, 0x00, 0x04, 0x76, 0x07, 0x23, 0x02, 0x26, 0x00, 0x3d, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x76, 0x01, 0x59, 0x01, 0x5d, 0x00, 0x09, 0x00, 0xb3, \n\t0x0e, 0x07, 0x07, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x4b, \n\t0x00, 0x00, 0x03, 0xce, 0x05, 0xcb, 0x02, 0x26, 0x00, 0x5d, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x76, 0x01, 0x0c, 0x00, 0x05, 0x00, 0x09, 0x00, 0xb3, \n\t0x0e, 0x08, 0x07, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x4d, \n\t0x00, 0x00, 0x04, 0x76, 0x07, 0x33, 0x02, 0x26, 0x00, 0x3d, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x55, 0x01, 0x2c, 0x01, 0x77, 0x00, 0x09, 0x00, 0xb3, \n\t0x0b, 0x08, 0x07, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x4b, \n\t0x00, 0x00, 0x03, 0xce, 0x05, 0xdb, 0x02, 0x26, 0x00, 0x5d, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x55, 0x00, 0xdf, 0x00, 0x1f, 0x00, 0x09, 0x00, 0xb3, \n\t0x0b, 0x03, 0x07, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x4d, \n\t0x00, 0x00, 0x04, 0x76, 0x07, 0x52, 0x02, 0x26, 0x00, 0x3d, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x53, 0x00, 0x79, 0x01, 0x5e, 0x00, 0x09, 0x00, 0xb3, \n\t0x0f, 0x08, 0x07, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x4b, \n\t0x00, 0x00, 0x03, 0xce, 0x05, 0xfa, 0x02, 0x26, 0x00, 0x5d, 0x00, 0x00, \n\t0x01, 0x06, 0x01, 0x53, 0x2c, 0x06, 0x00, 0x09, 0x00, 0xb3, 0x0f, 0x09, \n\t0x07, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x74, \n\t0x00, 0x00, 0x02, 0xa4, 0x06, 0x2d, 0x00, 0x0f, 0x00, 0x27, 0x00, 0xb0, \n\t0x04, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, \n\t0x0a, 0x3e, 0x59, 0xb2, 0x2f, 0x04, 0x01, 0x5d, 0xb0, 0x04, 0x10, 0xb1, \n\t0x0b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, \n\t0x31, 0x33, 0x11, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, \n\t0x23, 0x22, 0x06, 0x15, 0x11, 0x74, 0xd2, 0xbe, 0x25, 0x4b, 0x30, 0x19, \n\t0x1a, 0x2a, 0x1d, 0x47, 0x4c, 0x04, 0xb2, 0xb6, 0xc5, 0x0b, 0x0a, 0xd7, \n\t0x05, 0x06, 0x51, 0x49, 0xfb, 0x4e, 0x00, 0x00, 0x00, 0x01, 0xff, 0xce, \n\t0xfe, 0x4b, 0x02, 0xe8, 0x06, 0x2d, 0x00, 0x23, 0x00, 0x88, 0x00, 0xb0, \n\t0x17, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, \n\t0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x22, 0x2f, 0x1b, 0xb1, \n\t0x22, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, \n\t0xb1, 0x05, 0x0c, 0x3e, 0x59, 0xb0, 0x22, 0x10, 0xb1, 0x00, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x05, 0x10, 0xb1, \n\t0x0c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x00, 0x10, 0xb0, 0x10, 0xd0, 0xb0, 0x11, 0xd0, 0xb2, 0x30, 0x17, 0x01, \n\t0x71, 0xb2, 0xa0, 0x17, 0x01, 0x5d, 0xb2, 0x7f, 0x17, 0x01, 0x5d, 0xb4, \n\t0x2f, 0x17, 0x3f, 0x17, 0x02, 0x5d, 0xb2, 0xf0, 0x17, 0x01, 0x5d, 0xb2, \n\t0xc0, 0x17, 0x01, 0x71, 0xb2, 0x00, 0x17, 0x01, 0x72, 0xb0, 0x17, 0x10, \n\t0xb1, 0x1e, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x01, 0x23, 0x03, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, \n\t0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, \n\t0x36, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, \n\t0x15, 0x33, 0x02, 0xab, 0xcf, 0x01, 0xca, 0xb4, 0x28, 0x42, 0x25, 0x0f, \n\t0x17, 0x30, 0x1b, 0x39, 0x3f, 0xa0, 0xa0, 0xd2, 0xbf, 0x25, 0x4b, 0x30, \n\t0x19, 0x17, 0x2f, 0x1d, 0x47, 0x49, 0xcf, 0x03, 0x6d, 0xfc, 0x6b, 0xbe, \n\t0xcf, 0x08, 0x09, 0xdd, 0x06, 0x07, 0x5a, 0x52, 0x03, 0x95, 0xcd, 0x78, \n\t0xb6, 0xc5, 0x0b, 0x0a, 0xd9, 0x04, 0x06, 0x4e, 0x49, 0x78, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x57, 0xff, 0xeb, 0x06, 0x1a, 0x06, 0x51, 0x00, 0x17, \n\t0x00, 0x25, 0x00, 0x3b, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, \n\t0x1b, 0xb1, 0x0a, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, \n\t0x2f, 0x1b, 0xb1, 0x03, 0x0a, 0x3e, 0x59, 0xb0, 0x0a, 0x10, 0xb1, 0x1b, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, \n\t0x10, 0xb1, 0x22, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0x30, 0x31, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x11, 0x10, \n\t0x00, 0x21, 0x32, 0x16, 0x17, 0x36, 0x36, 0x35, 0x33, 0x14, 0x06, 0x07, \n\t0x16, 0x16, 0x15, 0x25, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x14, \n\t0x16, 0x33, 0x32, 0x36, 0x35, 0x05, 0x16, 0xfe, 0xad, 0xfe, 0xf1, 0xfe, \n\t0xf3, 0xfe, 0xb0, 0x01, 0x4f, 0x01, 0x0d, 0x86, 0xe3, 0x52, 0x68, 0x6c, \n\t0xd8, 0xa0, 0x97, 0x19, 0x1a, 0xfe, 0xdc, 0xaa, 0x95, 0x95, 0xa4, 0xa6, \n\t0x94, 0x96, 0xa8, 0x02, 0x55, 0xfe, 0xf4, 0xfe, 0xa2, 0x01, 0x5e, 0x01, \n\t0x0c, 0x01, 0x06, 0x01, 0x0b, 0x01, 0x5f, 0x5e, 0x54, 0x1a, 0xa4, 0x80, \n\t0xc0, 0xfe, 0x34, 0x3c, 0x83, 0x45, 0x02, 0xaa, 0xda, 0xd9, 0xab, 0xfe, \n\t0xf8, 0xad, 0xda, 0xda, 0xad, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x43, \n\t0xff, 0xeb, 0x04, 0xee, 0x04, 0xcf, 0x00, 0x17, 0x00, 0x25, 0x00, 0x38, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0e, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x14, 0x2f, 0x1b, 0xb1, 0x14, \n\t0x0a, 0x3e, 0x59, 0xb1, 0x1b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x22, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x13, 0x34, 0x00, 0x33, \n\t0x32, 0x16, 0x17, 0x36, 0x36, 0x35, 0x33, 0x14, 0x06, 0x07, 0x16, 0x16, \n\t0x15, 0x15, 0x14, 0x00, 0x23, 0x22, 0x00, 0x35, 0x21, 0x14, 0x16, 0x33, \n\t0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x43, 0x01, \n\t0x0e, 0xef, 0x70, 0xb6, 0x43, 0x38, 0x3a, 0xd3, 0x78, 0x72, 0x1d, 0x1f, \n\t0xfe, 0xf1, 0xef, 0xf0, 0xfe, 0xf1, 0x01, 0x23, 0x68, 0x74, 0x71, 0x69, \n\t0x6a, 0x72, 0x71, 0x69, 0x02, 0x27, 0xf2, 0x01, 0x35, 0x49, 0x42, 0x23, \n\t0x89, 0x60, 0x92, 0xcb, 0x31, 0x3e, 0x8f, 0x4d, 0x15, 0xf4, 0xfe, 0xcd, \n\t0x01, 0x33, 0xf4, 0x94, 0xb3, 0xb4, 0x93, 0x15, 0x90, 0xb6, 0xb7, 0x8f, \n\t0x00, 0x01, 0x00, 0x78, 0xff, 0xeb, 0x06, 0x80, 0x06, 0x47, 0x00, 0x1a, \n\t0x00, 0x36, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, \n\t0x12, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1a, 0x2f, 0x1b, \n\t0xb1, 0x1a, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, \n\t0x1b, 0xb1, 0x0d, 0x0a, 0x3e, 0x59, 0xb1, 0x16, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x15, 0x17, 0x36, \n\t0x36, 0x35, 0x33, 0x14, 0x02, 0x07, 0x11, 0x14, 0x00, 0x21, 0x20, 0x00, \n\t0x35, 0x11, 0x21, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x05, \n\t0x08, 0x06, 0x53, 0x48, 0xd7, 0xb7, 0xc1, 0xfe, 0xbc, 0xfe, 0xfa, 0xfe, \n\t0xfb, 0xfe, 0xbf, 0x01, 0x25, 0x9a, 0x87, 0x89, 0x9c, 0x05, 0xb0, 0xb5, \n\t0x01, 0x14, 0xa8, 0x91, 0xe7, 0xfe, 0xf6, 0x1c, 0xfd, 0xb0, 0xf5, 0xfe, \n\t0xf6, 0x01, 0x0a, 0xf5, 0x03, 0xc6, 0xfc, 0x3a, 0x90, 0x8f, 0x8e, 0x91, \n\t0x03, 0xc6, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0xff, 0xeb, 0x05, 0x77, \n\t0x04, 0xac, 0x00, 0x1d, 0x00, 0x46, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x17, 0x2f, 0x1b, 0xb1, 0x17, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0a, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0a, 0x3e, 0x59, 0xb0, \n\t0x0a, 0x10, 0xb1, 0x13, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0x30, 0x31, 0x01, 0x17, 0x16, 0x06, 0x07, 0x11, 0x23, 0x27, \n\t0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x11, 0x21, 0x11, 0x14, 0x16, 0x33, \n\t0x32, 0x36, 0x37, 0x11, 0x21, 0x15, 0x17, 0x36, 0x36, 0x35, 0x05, 0x72, \n\t0x02, 0x03, 0xa9, 0xb6, 0xf9, 0x1a, 0x32, 0x9a, 0x64, 0xab, 0xc1, 0x01, \n\t0x23, 0x50, 0x4e, 0x46, 0x64, 0x20, 0x01, 0x24, 0x06, 0x52, 0x47, 0x04, \n\t0xac, 0x05, 0xb0, 0xc5, 0x16, 0xfc, 0xe4, 0x9c, 0x55, 0x5c, 0xdb, 0xe7, \n\t0x02, 0x8d, 0xfd, 0x71, 0x76, 0x67, 0x2d, 0x2c, 0x03, 0x13, 0x7c, 0x02, \n\t0x0d, 0x75, 0x6e, 0x00, 0xff, 0xff, 0xff, 0x97, 0xfe, 0x4b, 0x02, 0x90, \n\t0x05, 0xf4, 0x02, 0x26, 0x01, 0x50, 0x00, 0x00, 0x01, 0x07, 0x01, 0x53, \n\t0xff, 0x34, 0x00, 0x00, 0x00, 0x09, 0x00, 0xb3, 0x15, 0x03, 0x0f, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x0c, 0x00, 0x00, 0x05, 0x1f, \n\t0x08, 0x5c, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x03, 0x71, \n\t0x01, 0x36, 0x01, 0x96, 0x00, 0x15, 0x00, 0xb3, 0x1b, 0x07, 0x04, 0x04, \n\t0x2b, 0xb0, 0x1b, 0x10, 0xb0, 0x0f, 0xd0, 0xb0, 0x1b, 0x10, 0xb0, 0x21, \n\t0xd0, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x37, 0xff, 0xeb, 0x04, 0x0f, \n\t0x07, 0x1a, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x01, 0x07, 0x03, 0x71, \n\t0x00, 0xc6, 0x00, 0x54, 0x00, 0x15, 0x00, 0xb3, 0x3b, 0x07, 0x19, 0x04, \n\t0x2b, 0xb0, 0x3b, 0x10, 0xb0, 0x2f, 0xd0, 0xb0, 0x3b, 0x10, 0xb0, 0x41, \n\t0xd0, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x03, 0x00, 0x00, 0x07, 0x49, \n\t0x07, 0x22, 0x02, 0x26, 0x00, 0x88, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, \n\t0x02, 0xa6, 0x01, 0x5c, 0x00, 0x09, 0x00, 0xb3, 0x18, 0x07, 0x06, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x2e, 0xff, 0xeb, 0x06, 0x8d, \n\t0x05, 0xe1, 0x02, 0x26, 0x00, 0xa8, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, \n\t0x02, 0x5e, 0x00, 0x1b, 0x00, 0x09, 0x00, 0xb3, 0x47, 0x08, 0x19, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x5c, 0xff, 0xa1, 0x05, 0x1b, \n\t0x07, 0x60, 0x02, 0x26, 0x00, 0x9a, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, \n\t0x01, 0xc9, 0x01, 0x9a, 0x00, 0x09, 0x00, 0xb3, 0x36, 0x07, 0x10, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x43, 0xff, 0x73, 0x04, 0x40, \n\t0x05, 0xdc, 0x02, 0x26, 0x00, 0xba, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, \n\t0x01, 0x1b, 0x00, 0x16, 0x00, 0x09, 0x00, 0xb3, 0x35, 0x08, 0x03, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x55, 0xfe, 0x04, 0x04, 0xbe, \n\t0x05, 0xc5, 0x02, 0x26, 0x00, 0x36, 0x00, 0x00, 0x01, 0x07, 0x03, 0x27, \n\t0x01, 0xbb, 0xfe, 0x80, 0x00, 0x0a, 0x00, 0xb4, 0x30, 0x2c, 0x40, 0x2c, \n\t0x02, 0x5d, 0x30, 0x31, 0xff, 0xff, 0x00, 0x3a, 0xfe, 0x04, 0x03, 0xd4, \n\t0x04, 0x4e, 0x02, 0x26, 0x00, 0x56, 0x00, 0x00, 0x01, 0x07, 0x03, 0x27, \n\t0x01, 0x28, 0xfe, 0x80, 0x00, 0x0a, 0x00, 0xb4, 0x30, 0x2d, 0x40, 0x2d, \n\t0x02, 0x5d, 0x30, 0x31, 0x00, 0x01, 0xff, 0xac, 0xfe, 0x4b, 0x01, 0xb9, \n\t0x04, 0x3a, 0x00, 0x0f, 0x00, 0x29, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb1, 0x0b, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, \n\t0x11, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, \n\t0x36, 0x35, 0x11, 0x01, 0xb9, 0xca, 0xb3, 0x29, 0x41, 0x26, 0x0f, 0x17, \n\t0x31, 0x1a, 0x39, 0x40, 0x04, 0x3a, 0xfb, 0x9e, 0xbe, 0xcf, 0x08, 0x09, \n\t0xdd, 0x06, 0x07, 0x5a, 0x52, 0x04, 0x62, 0x00, 0xff, 0xff, 0x00, 0x39, \n\t0x03, 0xf8, 0x01, 0x6b, 0x06, 0x18, 0x03, 0x06, 0x02, 0xf9, 0x00, 0x00, \n\t0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, \n\t0x04, 0x1a, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, 0x00, 0x01, 0x00, 0x89, \n\t0x04, 0xe4, 0x03, 0x6b, 0x05, 0xee, 0x00, 0x08, 0x00, 0x2e, 0x00, 0xb0, \n\t0x04, 0x2f, 0xb2, 0x3f, 0x04, 0x01, 0x5d, 0xb0, 0x02, 0xd0, 0xb0, 0x04, \n\t0x10, 0xb0, 0x07, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb6, \n\t0x0f, 0x07, 0x1f, 0x07, 0x2f, 0x07, 0x03, 0x5d, 0xb0, 0x03, 0xb0, 0x0a, \n\t0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, 0x01, 0x15, 0x23, 0x27, \n\t0x07, 0x23, 0x35, 0x25, 0x33, 0x03, 0x6b, 0xe8, 0x8c, 0x8b, 0xe3, 0x01, \n\t0x1a, 0xa9, 0x04, 0xfb, 0x17, 0x85, 0x85, 0x1a, 0xf0, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x63, 0x04, 0xe4, 0x03, 0x5c, 0x05, 0xf4, 0x00, 0x08, \n\t0x00, 0x2e, 0x00, 0xb0, 0x04, 0x2f, 0xb2, 0x3f, 0x04, 0x01, 0x5d, 0xb0, \n\t0x00, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x04, 0x10, \n\t0xb0, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb6, 0x0f, \n\t0x01, 0x1f, 0x01, 0x2f, 0x01, 0x03, 0x5d, 0xb0, 0x08, 0xd0, 0x30, 0x31, \n\t0x01, 0x37, 0x21, 0x15, 0x05, 0x23, 0x01, 0x35, 0x21, 0x01, 0xdf, 0x75, \n\t0x01, 0x08, 0xfe, 0xe7, 0xc7, 0xfe, 0xe7, 0x01, 0x08, 0x05, 0x75, 0x7f, \n\t0x11, 0xff, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x6a, \n\t0x04, 0x8a, 0x03, 0x1e, 0x05, 0xb0, 0x00, 0x0f, 0x00, 0x45, 0x00, 0xb0, \n\t0x04, 0x2f, 0xb2, 0x10, 0x04, 0x01, 0x5d, 0xb0, 0x0c, 0xb0, 0x0a, 0x2b, \n\t0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb4, 0x50, 0x0c, 0x60, 0x0c, 0x02, 0x71, \n\t0x40, 0x0b, 0x90, 0x0c, 0xa0, 0x0c, 0xb0, 0x0c, 0xc0, 0x0c, 0xd0, 0x0c, \n\t0x05, 0x5d, 0xb0, 0x0f, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, \n\t0x40, 0x0b, 0x9f, 0x0f, 0xaf, 0x0f, 0xbf, 0x0f, 0xcf, 0x0f, 0xdf, 0x0f, \n\t0x05, 0x5d, 0xb0, 0x09, 0xd0, 0x30, 0x31, 0x01, 0x17, 0x16, 0x06, 0x23, \n\t0x22, 0x26, 0x37, 0x37, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x03, \n\t0x17, 0x02, 0x05, 0xbb, 0x9e, 0x9f, 0xbc, 0x06, 0x02, 0xd5, 0x3d, 0x41, \n\t0x3f, 0x3d, 0x05, 0xb0, 0x06, 0x7f, 0xa1, 0xa1, 0x7f, 0x06, 0x35, 0x44, \n\t0x44, 0x35, 0x00, 0x00, 0x00, 0x01, 0x00, 0x92, 0x04, 0xcb, 0x01, 0xc2, \n\t0x05, 0xbc, 0x00, 0x03, 0x00, 0x10, 0x00, 0xb0, 0x01, 0x2f, 0xb0, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, 0x01, 0x21, \n\t0x35, 0x21, 0x01, 0xc2, 0xfe, 0xd0, 0x01, 0x30, 0x04, 0xcb, 0xf1, 0x00, \n\t0x00, 0x02, 0x00, 0x81, 0x04, 0x52, 0x02, 0x28, 0x05, 0xd6, 0x00, 0x0b, \n\t0x00, 0x17, 0x00, 0x28, 0x00, 0xb0, 0x09, 0x2f, 0xb2, 0x3f, 0x09, 0x01, \n\t0x5d, 0xb0, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb4, \n\t0x3f, 0x03, 0x4f, 0x03, 0x02, 0x5d, 0xb0, 0x09, 0x10, 0xb0, 0x0f, 0xd0, \n\t0xb0, 0x03, 0x10, 0xb0, 0x15, 0xd0, 0x30, 0x31, 0x13, 0x34, 0x36, 0x33, \n\t0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x37, 0x14, 0x16, 0x33, \n\t0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x81, 0x7b, 0x5a, 0x58, \n\t0x7a, 0x79, 0x59, 0x5a, 0x7b, 0x74, 0x38, 0x29, 0x29, 0x35, 0x35, 0x29, \n\t0x2a, 0x37, 0x05, 0x12, 0x53, 0x71, 0x71, 0x53, 0x54, 0x6c, 0x6c, 0x54, \n\t0x2b, 0x37, 0x37, 0x2b, 0x2c, 0x38, 0x39, 0x00, 0x00, 0x01, 0x00, 0x53, \n\t0xfe, 0x58, 0x02, 0x04, 0x00, 0x3c, 0x00, 0x13, 0x00, 0x33, 0x00, 0xb0, \n\t0x13, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, \n\t0x0c, 0x3e, 0x59, 0xb1, 0x06, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0x40, 0x11, 0x0f, 0x13, 0x1f, 0x13, 0x2f, 0x13, 0x3f, \n\t0x13, 0x4f, 0x13, 0x5f, 0x13, 0x6f, 0x13, 0x7f, 0x13, 0x08, 0x5d, 0x30, \n\t0x31, 0x21, 0x06, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, \n\t0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x01, 0x95, 0x36, \n\t0x32, 0x22, 0x34, 0x1c, 0x2b, 0x17, 0x23, 0x24, 0x59, 0x3d, 0x6c, 0x8b, \n\t0x5c, 0x62, 0x35, 0x4a, 0x31, 0x1b, 0x2b, 0x0c, 0x08, 0x9a, 0x13, 0x19, \n\t0x71, 0x65, 0x4d, 0x8b, 0x36, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x77, \n\t0x04, 0xce, 0x03, 0x64, 0x05, 0xf9, 0x00, 0x13, 0x00, 0x6e, 0x00, 0xb0, \n\t0x03, 0x2f, 0xb2, 0x3f, 0x03, 0x01, 0x5d, 0xb0, 0x06, 0xb0, 0x0a, 0x2b, \n\t0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb2, 0xaf, 0x06, 0x01, 0x71, 0x40, 0x09, \n\t0x3f, 0x06, 0x4f, 0x06, 0x5f, 0x06, 0x6f, 0x06, 0x04, 0x71, 0xb0, 0x03, \n\t0x10, 0xb0, 0x09, 0xd0, 0xb0, 0x06, 0x10, 0xb0, 0x0d, 0xb0, 0x0a, 0x2b, \n\t0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb2, 0x60, 0x0d, 0x01, 0x71, 0x40, 0x09, \n\t0xa0, 0x0d, 0xb0, 0x0d, 0xc0, 0x0d, 0xd0, 0x0d, 0x04, 0x5d, 0xb0, 0x03, \n\t0x10, 0xb0, 0x10, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0x40, \n\t0x09, 0xa0, 0x10, 0xb0, 0x10, 0xc0, 0x10, 0xd0, 0x10, 0x04, 0x5d, 0xb2, \n\t0x60, 0x10, 0x01, 0x71, 0xb0, 0x0d, 0x10, 0xb0, 0x13, 0xd0, 0x30, 0x31, \n\t0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x23, 0x22, 0x06, 0x15, 0x27, 0x34, \n\t0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x36, 0x35, 0x03, 0x64, 0x77, 0x5b, \n\t0x46, 0xb1, 0x34, 0x24, 0x30, 0x9c, 0x77, 0x5a, 0x38, 0xc0, 0x34, 0x22, \n\t0x34, 0x05, 0xcc, 0x60, 0x87, 0x57, 0x41, 0x2d, 0x2a, 0x5e, 0x8b, 0x57, \n\t0x40, 0x2f, 0x00, 0x00, 0x00, 0x02, 0x00, 0x8d, 0x04, 0xe4, 0x03, 0xf0, \n\t0x05, 0xee, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x27, 0x00, 0xb0, 0x09, 0x2f, \n\t0xb2, 0x3f, 0x09, 0x01, 0x5d, 0xb0, 0x06, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, \n\t0x1b, 0xdc, 0x59, 0xb6, 0x0f, 0x06, 0x1f, 0x06, 0x2f, 0x06, 0x03, 0x5d, \n\t0xb0, 0x00, 0xd0, 0xb0, 0x09, 0x10, 0xb0, 0x04, 0xd0, 0x30, 0x31, 0x01, \n\t0x21, 0x17, 0x01, 0x23, 0x27, 0x03, 0x21, 0x17, 0x03, 0x23, 0x02, 0xd7, \n\t0x01, 0x17, 0x02, 0xfe, 0xe3, 0xea, 0x02, 0x94, 0x01, 0x13, 0x02, 0xf0, \n\t0xeb, 0x05, 0xee, 0x06, 0xfe, 0xfc, 0x05, 0x01, 0x05, 0x05, 0xfe, 0xfb, \n\t0x00, 0x02, 0x00, 0x9e, 0xfe, 0x7a, 0x02, 0x0a, 0xff, 0xc1, 0x00, 0x0b, \n\t0x00, 0x17, 0x00, 0x31, 0x00, 0xb0, 0x18, 0x2f, 0xb0, 0x03, 0xb0, 0x0a, \n\t0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x0f, 0xb0, 0x0a, 0x2b, 0x58, \n\t0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x09, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, \n\t0xdc, 0x59, 0xb0, 0x03, 0x10, 0xb0, 0x15, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, \n\t0x1b, 0xdc, 0x59, 0x30, 0x31, 0x17, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, \n\t0x14, 0x06, 0x23, 0x22, 0x26, 0x37, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, \n\t0x34, 0x26, 0x23, 0x22, 0x06, 0x9e, 0x6a, 0x4e, 0x4c, 0x68, 0x68, 0x4c, \n\t0x4f, 0x69, 0x72, 0x27, 0x1f, 0x1d, 0x25, 0x25, 0x1d, 0x1f, 0x27, 0xe4, \n\t0x47, 0x5e, 0x5e, 0x47, 0x46, 0x5c, 0x5c, 0x46, 0x1d, 0x27, 0x26, 0x1e, \n\t0x20, 0x27, 0x27, 0x00, 0x00, 0x01, 0xfc, 0xe9, 0x04, 0xad, 0xfe, 0x57, \n\t0x05, 0xe6, 0x00, 0x03, 0x00, 0x15, 0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x03, \n\t0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb2, 0x0f, 0x03, 0x01, \n\t0x5d, 0x30, 0x31, 0x01, 0x23, 0x03, 0x33, 0xfe, 0x57, 0xb1, 0xbd, 0xe7, \n\t0x04, 0xad, 0x01, 0x39, 0x00, 0x01, 0xfc, 0xf7, 0x04, 0xb2, 0xfe, 0x64, \n\t0x05, 0xec, 0x00, 0x03, 0x00, 0x15, 0x00, 0xb0, 0x02, 0x2f, 0xb0, 0x00, \n\t0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb2, 0x0f, 0x00, 0x01, \n\t0x5d, 0x30, 0x31, 0x01, 0x33, 0x03, 0x23, 0xfd, 0x7e, 0xe6, 0xbf, 0xae, \n\t0x05, 0xec, 0xfe, 0xc6, 0xff, 0xff, 0xfc, 0x7d, 0x04, 0xce, 0xff, 0x6a, \n\t0x05, 0xf9, 0x00, 0x07, 0x01, 0x58, 0xfc, 0x06, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0xfd, 0x1d, 0x04, 0xf0, 0xfe, 0xa1, 0x06, 0x85, 0x00, 0x10, \n\t0x00, 0x31, 0x00, 0xb0, 0x10, 0x2f, 0xb0, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x08, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, \n\t0xdc, 0x59, 0xb0, 0x09, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, \n\t0xb0, 0x01, 0x10, 0xb0, 0x0f, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, \n\t0x59, 0x30, 0x31, 0x01, 0x27, 0x36, 0x36, 0x27, 0x35, 0x36, 0x26, 0x23, \n\t0x37, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x15, 0xfd, 0x31, 0x10, 0x4a, \n\t0x3f, 0x05, 0x05, 0x4a, 0x43, 0x07, 0xb9, 0xc4, 0x56, 0x40, 0x04, 0xf0, \n\t0x89, 0x03, 0x1e, 0x1e, 0x06, 0x23, 0x1f, 0x85, 0x68, 0x5b, 0x40, 0x48, \n\t0x09, 0x41, 0x00, 0x00, 0x00, 0x02, 0xfb, 0xf5, 0x04, 0xe4, 0xff, 0x58, \n\t0x05, 0xee, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x25, 0x00, 0xb0, 0x02, 0x2f, \n\t0xb0, 0x05, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb6, 0x0f, \n\t0x05, 0x1f, 0x05, 0x2f, 0x05, 0x03, 0x5d, 0xb0, 0x02, 0x10, 0xb0, 0x06, \n\t0xd0, 0xb0, 0x05, 0x10, 0xb0, 0x0a, 0xd0, 0x30, 0x31, 0x01, 0x07, 0x23, \n\t0x01, 0x37, 0x21, 0x01, 0x23, 0x03, 0x37, 0x21, 0xfd, 0xfd, 0x02, 0xe9, \n\t0xfe, 0xe3, 0x02, 0x01, 0x16, 0x02, 0x4b, 0xec, 0xf0, 0x02, 0x01, 0x13, \n\t0x04, 0xe9, 0x05, 0x01, 0x04, 0x06, 0xfe, 0xf6, 0x01, 0x05, 0x05, 0x00, \n\t0x00, 0x01, 0xfd, 0x06, 0xfe, 0x9e, 0xfe, 0x4d, 0xff, 0x8f, 0x00, 0x03, \n\t0x00, 0x1f, 0x00, 0xb0, 0x04, 0x2f, 0xb0, 0x03, 0xb0, 0x0a, 0x2b, 0x58, \n\t0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x00, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, \n\t0xdc, 0x59, 0xb2, 0x4f, 0x00, 0x01, 0x5d, 0x30, 0x31, 0x01, 0x21, 0x35, \n\t0x21, 0xfe, 0x4d, 0xfe, 0xb9, 0x01, 0x47, 0xfe, 0x9e, 0xf1, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0xee, 0x04, 0xf6, 0x02, 0x50, 0x06, 0x58, 0x00, 0x03, \n\t0x00, 0x10, 0x00, 0xb0, 0x03, 0x2f, 0xb0, 0x00, 0xb0, 0x0a, 0x2b, 0x58, \n\t0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, 0x01, 0x21, 0x03, 0x23, 0x01, 0x3a, \n\t0x01, 0x16, 0xd1, 0x91, 0x06, 0x58, 0xfe, 0x9e, 0x00, 0x03, 0x00, 0x99, \n\t0x04, 0xe4, 0x03, 0xbb, 0x06, 0xdd, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, \n\t0x00, 0x40, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, \n\t0x06, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, \n\t0xb1, 0x0b, 0x10, 0x3e, 0x59, 0xb0, 0x06, 0x10, 0xb0, 0x05, 0xb0, 0x0a, \n\t0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x01, 0xd0, 0xb0, 0x06, 0x10, \n\t0xb0, 0x02, 0xd0, 0xb0, 0x0b, 0x10, 0xb0, 0x08, 0xb0, 0x0a, 0x2b, 0x58, \n\t0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, 0x01, 0x23, 0x35, 0x33, 0x05, 0x23, \n\t0x35, 0x33, 0x13, 0x21, 0x03, 0x23, 0x03, 0xbb, 0xfe, 0xfe, 0xfd, 0xdb, \n\t0xfd, 0xfd, 0x72, 0x01, 0x1a, 0xb0, 0x94, 0x04, 0xe4, 0xcc, 0xcc, 0xcc, \n\t0x01, 0x2d, 0xfe, 0xe9, 0xff, 0xff, 0x00, 0x0c, 0x00, 0x00, 0x05, 0x1f, \n\t0x06, 0x58, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x01, 0x61, \n\t0xff, 0x7a, 0x00, 0x00, 0x00, 0x08, 0x00, 0xb2, 0x3f, 0x0d, 0x01, 0x5d, \n\t0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9f, 0x02, 0x38, 0x01, 0xc3, \n\t0x03, 0x3c, 0x02, 0x06, 0x00, 0x79, 0x00, 0x00, 0xff, 0xff, 0xff, 0x76, \n\t0x00, 0x00, 0x04, 0xd1, 0x06, 0x5a, 0x00, 0x26, 0x00, 0x28, 0x64, 0x00, \n\t0x01, 0x07, 0x01, 0x61, 0xfe, 0x88, 0x00, 0x02, 0x00, 0x08, 0x00, 0xb2, \n\t0x3f, 0x0d, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0xff, 0x9f, \n\t0x00, 0x00, 0x05, 0x85, 0x06, 0x58, 0x00, 0x26, 0x00, 0x2b, 0x64, 0x00, \n\t0x01, 0x07, 0x01, 0x61, 0xfe, 0xb1, 0x00, 0x00, 0x00, 0x08, 0x00, 0xb2, \n\t0x3f, 0x0d, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0xff, 0xa8, \n\t0x00, 0x00, 0x02, 0x22, 0x06, 0x5a, 0x00, 0x26, 0x00, 0x2c, 0x64, 0x00, \n\t0x01, 0x07, 0x01, 0x61, 0xfe, 0xba, 0x00, 0x02, 0x00, 0x08, 0x00, 0xb2, \n\t0x3f, 0x05, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf1, \n\t0xff, 0xeb, 0x05, 0x2f, 0x06, 0x58, 0x00, 0x26, 0x00, 0x32, 0x14, 0x00, \n\t0x01, 0x07, 0x01, 0x61, 0xff, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0xb2, \n\t0x3f, 0x1d, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0xff, 0x3e, \n\t0x00, 0x00, 0x05, 0x6b, 0x06, 0x58, 0x00, 0x26, 0x00, 0x3c, 0x64, 0x00, \n\t0x01, 0x07, 0x01, 0x61, 0xfe, 0x50, 0x00, 0x00, 0x00, 0x08, 0x00, 0xb2, \n\t0x3f, 0x0b, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe6, \n\t0x00, 0x00, 0x04, 0xfb, 0x06, 0x58, 0x00, 0x26, 0x01, 0x83, 0x14, 0x00, \n\t0x01, 0x07, 0x01, 0x61, 0xfe, 0xf8, 0x00, 0x00, 0x00, 0x08, 0x00, 0xb2, \n\t0x3f, 0x25, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0xff, 0x8f, \n\t0xff, 0xeb, 0x02, 0xb1, 0x06, 0x9e, 0x02, 0x26, 0x01, 0x93, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x62, 0xfe, 0xf6, 0xff, 0xc1, 0x00, 0x14, 0x00, 0xb2, \n\t0x14, 0x0f, 0x03, 0x2b, 0xb0, 0x14, 0x10, 0xb0, 0x11, 0xd0, 0xb0, 0x14, \n\t0x10, 0xb0, 0x1b, 0xd0, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0c, \n\t0x00, 0x00, 0x05, 0x1f, 0x05, 0xb0, 0x02, 0x06, 0x00, 0x24, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x88, 0x00, 0x00, 0x04, 0xca, 0x05, 0xb0, 0x02, 0x06, \n\t0x00, 0x25, 0x00, 0x00, 0x00, 0x01, 0x00, 0x88, 0x00, 0x00, 0x04, 0x3d, \n\t0x05, 0xb0, 0x00, 0x05, 0x00, 0x2c, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0a, 0x3e, 0x59, 0xb0, 0x04, 0x10, \n\t0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x01, 0x21, 0x11, 0x21, 0x11, 0x21, 0x04, 0x3d, 0xfd, 0x6f, \n\t0xfe, 0xdc, 0x03, 0xb5, 0x04, 0xcf, 0xfb, 0x31, 0x05, 0xb0, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x16, 0x00, 0x00, 0x05, 0xc5, 0x05, 0xb0, 0x00, 0x03, \n\t0x00, 0x07, 0x00, 0x2f, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, \n\t0x1b, 0xb1, 0x00, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, \n\t0x2f, 0x1b, 0xb1, 0x02, 0x0a, 0x3e, 0x59, 0xb1, 0x04, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb0, 0x07, \n\t0xd0, 0x30, 0x31, 0x01, 0x21, 0x01, 0x21, 0x25, 0x21, 0x01, 0x23, 0x02, \n\t0x5d, 0x01, 0x2c, 0x02, 0x3c, 0xfa, 0x51, 0x01, 0x86, 0x02, 0xa4, 0xfe, \n\t0xb5, 0x06, 0x05, 0xb0, 0xfa, 0x50, 0xe0, 0x03, 0x75, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x88, 0x00, 0x00, 0x04, 0x6d, 0x05, 0xb0, 0x02, 0x06, \n\t0x00, 0x28, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4d, 0x00, 0x00, 0x04, 0x76, \n\t0x05, 0xb0, 0x02, 0x06, 0x00, 0x3d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x88, \n\t0x00, 0x00, 0x05, 0x21, 0x05, 0xb0, 0x02, 0x06, 0x00, 0x2b, 0x00, 0x00, \n\t0x00, 0x03, 0x00, 0x5c, 0xff, 0xeb, 0x05, 0x1b, 0x05, 0xc5, 0x00, 0x03, \n\t0x00, 0x11, 0x00, 0x1f, 0x00, 0x57, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x0a, 0x3e, 0x59, 0xb0, 0x03, \n\t0x10, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x0e, 0x10, 0xb1, 0x15, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x07, 0x10, 0xb1, 0x1c, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x35, \n\t0x21, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x11, 0x10, 0x00, 0x21, \n\t0x20, 0x00, 0x11, 0x25, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x14, \n\t0x16, 0x33, 0x32, 0x36, 0x35, 0x03, 0x84, 0xfe, 0x84, 0x01, 0x7c, 0x01, \n\t0x97, 0xfe, 0xad, 0xfe, 0xf1, 0xfe, 0xf3, 0xfe, 0xb0, 0x01, 0x4f, 0x01, \n\t0x0d, 0x01, 0x0f, 0x01, 0x54, 0xfe, 0xdc, 0xaa, 0x95, 0x95, 0xa4, 0xa6, \n\t0x94, 0x96, 0xa8, 0x02, 0x65, 0xe0, 0xf0, 0xfe, 0xf4, 0xfe, 0xa2, 0x01, \n\t0x5e, 0x01, 0x0c, 0x01, 0x06, 0x01, 0x0b, 0x01, 0x5f, 0xfe, 0xa1, 0xfe, \n\t0xf5, 0x02, 0xaa, 0xda, 0xd9, 0xab, 0xfe, 0xf8, 0xad, 0xda, 0xda, 0xad, \n\t0xff, 0xff, 0x00, 0x9a, 0x00, 0x00, 0x01, 0xbe, 0x05, 0xb0, 0x02, 0x06, \n\t0x00, 0x2c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x88, 0x00, 0x00, 0x05, 0x39, \n\t0x05, 0xb0, 0x02, 0x06, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x13, \n\t0x00, 0x00, 0x05, 0x1a, 0x05, 0xb0, 0x00, 0x07, 0x00, 0x30, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x10, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x04, 0x10, 0xb0, 0x00, 0xd0, 0x30, 0x31, 0x01, 0x23, \n\t0x01, 0x21, 0x01, 0x21, 0x01, 0x21, 0x02, 0x9a, 0x06, 0xfe, 0xb1, 0xfe, \n\t0xce, 0x01, 0xee, 0x01, 0x2b, 0x01, 0xee, 0xfe, 0xcf, 0x04, 0x70, 0xfb, \n\t0x90, 0x05, 0xb0, 0xfa, 0x50, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x88, \n\t0x00, 0x00, 0x06, 0x72, 0x05, 0xb0, 0x02, 0x06, 0x00, 0x30, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x88, 0x00, 0x00, 0x05, 0x21, 0x05, 0xb0, 0x02, 0x06, \n\t0x00, 0x31, 0x00, 0x00, 0x00, 0x03, 0x00, 0x62, 0x00, 0x00, 0x04, 0x37, \n\t0x05, 0xb0, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x54, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x10, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x16, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0a, \n\t0x3e, 0x59, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x06, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x08, 0x10, 0xb1, 0x0a, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x37, 0x21, \n\t0x15, 0x21, 0x13, 0x21, 0x15, 0x21, 0x03, 0x21, 0x15, 0x21, 0x62, 0x03, \n\t0xd5, 0xfc, 0x2b, 0x70, 0x02, 0xf4, 0xfd, 0x0c, 0x5a, 0x03, 0x96, 0xfc, \n\t0x6a, 0xe0, 0xe0, 0x03, 0x51, 0xd9, 0x03, 0x38, 0xe1, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x5c, 0xff, 0xeb, 0x05, 0x1b, 0x05, 0xc5, 0x02, 0x06, \n\t0x00, 0x32, 0x00, 0x00, 0x00, 0x01, 0x00, 0x88, 0x00, 0x00, 0x05, 0x22, \n\t0x05, 0xb0, 0x00, 0x07, 0x00, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0a, 0x3e, 0x59, 0xb0, 0x06, \n\t0x10, 0xb1, 0x02, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0x30, 0x31, 0x21, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x05, \n\t0x22, 0xfe, 0xdc, 0xfd, 0xae, 0xfe, 0xdc, 0x04, 0x9a, 0x04, 0xcf, 0xfb, \n\t0x31, 0x05, 0xb0, 0x00, 0xff, 0xff, 0x00, 0x88, 0x00, 0x00, 0x04, 0xe7, \n\t0x05, 0xb0, 0x02, 0x06, 0x00, 0x33, 0x00, 0x00, 0x00, 0x01, 0x00, 0x48, \n\t0x00, 0x00, 0x04, 0x51, 0x05, 0xb0, 0x00, 0x0c, 0x00, 0x5c, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x10, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0a, 0x3e, \n\t0x59, 0xb2, 0x06, 0x03, 0x08, 0x11, 0x12, 0x39, 0xb0, 0x06, 0x10, 0xb0, \n\t0x00, 0xd0, 0xb0, 0x03, 0x10, 0xb1, 0x01, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x05, 0x01, 0x03, 0x11, 0x12, 0x39, \n\t0xb0, 0x08, 0x10, 0xb1, 0x0a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb2, 0x07, 0x08, 0x0a, 0x11, 0x12, 0x39, 0xb0, 0x06, \n\t0x10, 0xb0, 0x0c, 0xd0, 0x30, 0x31, 0x01, 0x01, 0x21, 0x15, 0x21, 0x35, \n\t0x01, 0x01, 0x35, 0x21, 0x15, 0x21, 0x01, 0x03, 0x38, 0xfe, 0x94, 0x02, \n\t0x85, 0xfb, 0xf7, 0x01, 0xbb, 0xfe, 0x45, 0x03, 0xee, 0xfd, 0x98, 0x01, \n\t0x6a, 0x02, 0xd4, 0xfe, 0x0d, 0xe1, 0x98, 0x02, 0x45, 0x02, 0x3c, 0x97, \n\t0xe1, 0xfe, 0x16, 0x00, 0xff, 0xff, 0x00, 0x1c, 0x00, 0x00, 0x04, 0x76, \n\t0x05, 0xb0, 0x02, 0x06, 0x00, 0x37, 0x00, 0x00, 0xff, 0xff, 0x00, 0x05, \n\t0x00, 0x00, 0x05, 0x07, 0x05, 0xb0, 0x02, 0x06, 0x00, 0x3c, 0x00, 0x00, \n\t0x00, 0x03, 0x00, 0x3b, 0x00, 0x00, 0x05, 0xb8, 0x05, 0xb0, 0x00, 0x11, \n\t0x00, 0x1a, 0x00, 0x23, 0x00, 0x56, 0x00, 0xb0, 0x0f, 0x2f, 0xb0, 0x09, \n\t0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x10, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x0f, 0x10, 0xb0, 0x00, 0xd0, 0xb0, 0x09, 0x10, \n\t0xb0, 0x06, 0xd0, 0xb0, 0x09, 0x10, 0xb1, 0x16, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0f, 0x10, 0xb1, 0x17, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x1e, 0xd0, \n\t0xb0, 0x16, 0x10, 0xb0, 0x20, 0xd0, 0x30, 0x31, 0x01, 0x16, 0x00, 0x15, \n\t0x14, 0x00, 0x07, 0x15, 0x21, 0x35, 0x26, 0x00, 0x35, 0x34, 0x00, 0x37, \n\t0x35, 0x21, 0x01, 0x14, 0x16, 0x17, 0x37, 0x11, 0x27, 0x06, 0x06, 0x05, \n\t0x34, 0x26, 0x27, 0x07, 0x11, 0x17, 0x36, 0x36, 0x03, 0x8d, 0xf8, 0x01, \n\t0x33, 0xfe, 0xcc, 0xf7, 0xfe, 0xdc, 0xfa, 0xfe, 0xcc, 0x01, 0x34, 0xfa, \n\t0x01, 0x24, 0xfd, 0xcc, 0x8f, 0x7b, 0x06, 0x06, 0x7b, 0x8f, 0x03, 0x40, \n\t0x8d, 0x79, 0x06, 0x06, 0x79, 0x8d, 0x04, 0xe7, 0x10, 0xfe, 0xde, 0xe5, \n\t0xe1, 0xfe, 0xe3, 0x0f, 0xc3, 0xc3, 0x0d, 0x01, 0x1c, 0xe2, 0xe7, 0x01, \n\t0x24, 0x0e, 0xc9, 0xfd, 0x1e, 0x7d, 0x92, 0x06, 0x02, 0x02, 0x34, 0x02, \n\t0x08, 0x98, 0x81, 0x81, 0x97, 0x09, 0x02, 0xfd, 0xcc, 0x02, 0x08, 0x92, \n\t0xff, 0xff, 0x00, 0x1f, 0x00, 0x00, 0x05, 0x07, 0x05, 0xb0, 0x02, 0x06, \n\t0x00, 0x3b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x38, 0x00, 0x00, 0x05, 0x8e, \n\t0x05, 0xb0, 0x00, 0x19, 0x00, 0x52, 0x00, 0xb0, 0x01, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x10, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x10, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x18, 0x2f, 0x1b, 0xb1, 0x18, 0x10, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x01, 0x10, 0xb1, 0x0a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0d, 0xd0, 0xb0, 0x01, 0x10, 0xb0, \n\t0x16, 0xd0, 0x30, 0x31, 0x01, 0x17, 0x36, 0x36, 0x35, 0x11, 0x21, 0x11, \n\t0x10, 0x00, 0x07, 0x11, 0x21, 0x11, 0x26, 0x00, 0x11, 0x11, 0x21, 0x11, \n\t0x14, 0x16, 0x17, 0x37, 0x11, 0x21, 0x03, 0x78, 0x06, 0x73, 0x78, 0x01, \n\t0x25, 0xfe, 0xe0, 0xf6, 0xfe, 0xdd, 0xfb, 0xfe, 0xde, 0x01, 0x23, 0x80, \n\t0x74, 0x06, 0x01, 0x23, 0x02, 0x45, 0x01, 0x0f, 0xb6, 0xa2, 0x02, 0x05, \n\t0xfd, 0xfb, 0xfe, 0xfc, 0xfe, 0xca, 0x1a, 0xfe, 0xa9, 0x01, 0x56, 0x15, \n\t0x01, 0x37, 0x01, 0x09, 0x02, 0x05, 0xfd, 0xfb, 0x9e, 0xb7, 0x12, 0x02, \n\t0x03, 0x6a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x68, 0x00, 0x00, 0x04, 0xe7, \n\t0x05, 0xc5, 0x00, 0x23, 0x00, 0x4e, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x19, 0x2f, 0x1b, 0xb1, 0x19, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x22, 0x2f, 0x1b, 0xb1, 0x22, 0x0a, 0x3e, 0x59, 0xb0, 0x19, \n\t0x10, 0xb1, 0x07, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x0f, 0x10, 0xb1, 0x11, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x20, 0xd0, 0xb0, 0x21, 0xd0, 0x30, 0x31, \n\t0x25, 0x36, 0x12, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x15, \n\t0x14, 0x12, 0x17, 0x15, 0x21, 0x35, 0x33, 0x26, 0x02, 0x35, 0x35, 0x10, \n\t0x00, 0x33, 0x32, 0x00, 0x11, 0x15, 0x14, 0x02, 0x07, 0x33, 0x15, 0x21, \n\t0x02, 0xdf, 0x5c, 0x6a, 0x87, 0x78, 0x77, 0x85, 0x6b, 0x61, 0xfe, 0x08, \n\t0xf4, 0x78, 0x92, 0x01, 0x3f, 0xff, 0xff, 0x01, 0x42, 0x93, 0x76, 0xfa, \n\t0xfe, 0x07, 0xe7, 0x21, 0x01, 0x07, 0xed, 0x5e, 0xbf, 0xc8, 0xc9, 0xbe, \n\t0x5e, 0xef, 0xfe, 0xfb, 0x21, 0xe7, 0xe3, 0x5b, 0x01, 0x1e, 0xa0, 0x5c, \n\t0x01, 0x11, 0x01, 0x5c, 0xfe, 0xa4, 0xfe, 0xef, 0x5c, 0xa1, 0xfe, 0xe4, \n\t0x5c, 0xe3, 0x00, 0x00, 0xff, 0xff, 0xff, 0xaf, 0x00, 0x00, 0x02, 0xad, \n\t0x07, 0x0d, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x6a, \n\t0xff, 0x13, 0x01, 0x5d, 0x00, 0x0f, 0x00, 0xb3, 0x08, 0x08, 0x02, 0x04, \n\t0x2b, 0xb0, 0x08, 0x10, 0xb0, 0x05, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x05, 0x00, 0x00, 0x05, 0x07, 0x07, 0x0d, 0x02, 0x26, \n\t0x00, 0x3c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x6a, 0x00, 0x71, 0x01, 0x5d, \n\t0x00, 0x0f, 0x00, 0xb3, 0x0f, 0x08, 0x09, 0x04, 0x2b, 0xb0, 0x0f, 0x10, \n\t0xb0, 0x0b, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x49, \n\t0xff, 0xeb, 0x04, 0x8e, 0x06, 0x2a, 0x02, 0x26, 0x01, 0x8b, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x61, 0x01, 0x0c, 0xff, 0xd2, 0x00, 0x09, 0x00, 0xb3, \n\t0x31, 0x07, 0x18, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x5f, \n\t0xff, 0xec, 0x04, 0x2e, 0x06, 0x29, 0x02, 0x26, 0x01, 0x8f, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x61, 0x00, 0xea, 0xff, 0xd1, 0x00, 0x09, 0x00, 0xb3, \n\t0x2e, 0x07, 0x1a, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x6b, \n\t0xfe, 0x61, 0x04, 0x18, 0x06, 0x2a, 0x02, 0x26, 0x01, 0x91, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x61, 0x00, 0xe2, 0xff, 0xd2, 0x00, 0x09, 0x00, 0xb3, \n\t0x17, 0x07, 0x04, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x89, \n\t0xff, 0xeb, 0x02, 0x88, 0x06, 0x14, 0x02, 0x26, 0x01, 0x93, 0x00, 0x00, \n\t0x01, 0x06, 0x01, 0x61, 0xcc, 0xbc, 0x00, 0x09, 0x00, 0xb3, 0x13, 0x07, \n\t0x0f, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x71, \n\t0xff, 0xeb, 0x04, 0x39, 0x06, 0x9f, 0x02, 0x26, 0x01, 0x9f, 0x00, 0x00, \n\t0x01, 0x06, 0x01, 0x62, 0x20, 0xc2, 0x00, 0x14, 0x00, 0xb2, 0x1a, 0x00, \n\t0x03, 0x2b, 0xb0, 0x1a, 0x10, 0xb0, 0x17, 0xd0, 0xb0, 0x1a, 0x10, 0xb0, \n\t0x21, 0xd0, 0x30, 0x31, 0x00, 0x02, 0x00, 0x49, 0xff, 0xeb, 0x04, 0x8e, \n\t0x04, 0x4e, 0x00, 0x1c, 0x00, 0x2d, 0x00, 0x58, 0x00, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x18, 0x2f, 0x1b, 0xb1, 0x18, 0x0e, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x1c, 0x2f, 0x1b, 0xb1, 0x1c, 0x0e, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x0b, 0x10, 0xb1, 0x04, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x20, 0xd0, 0xb0, 0x18, 0x10, 0xb1, 0x2a, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x01, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, \n\t0x22, 0x26, 0x27, 0x06, 0x06, 0x23, 0x22, 0x02, 0x35, 0x35, 0x10, 0x12, \n\t0x33, 0x32, 0x16, 0x17, 0x37, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, \n\t0x26, 0x34, 0x35, 0x11, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x04, 0x05, \n\t0x23, 0x24, 0x0d, 0x12, 0x0a, 0x19, 0x23, 0x40, 0x2a, 0x5d, 0x81, 0x21, \n\t0x31, 0x88, 0x5b, 0xc8, 0xdd, 0xde, 0xc9, 0x57, 0x85, 0x31, 0x2e, 0xfe, \n\t0x42, 0x5f, 0x6c, 0x3b, 0x54, 0x1b, 0x01, 0x1c, 0x52, 0x39, 0x6b, 0x62, \n\t0x04, 0x39, 0xfd, 0x0c, 0x40, 0x33, 0x03, 0x04, 0xd2, 0x10, 0x0c, 0x4c, \n\t0x4e, 0x4b, 0x4f, 0x01, 0x24, 0xf0, 0x15, 0x01, 0x00, 0x01, 0x3a, 0x50, \n\t0x4a, 0x85, 0xfd, 0xc6, 0x8f, 0xa5, 0x2d, 0x2c, 0x07, 0x0f, 0x0b, 0x01, \n\t0xca, 0x2d, 0x31, 0xbf, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x8e, \n\t0xfe, 0x6d, 0x04, 0x88, 0x05, 0xc5, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x64, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x2a, 0x2f, 0x1b, 0xb1, 0x2a, 0x16, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, \n\t0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, \n\t0x10, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, \n\t0xb1, 0x0c, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x1b, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0c, 0x10, 0xb1, \n\t0x22, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x2a, 0x10, 0xb1, 0x29, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0x30, 0x31, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x16, \n\t0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x11, 0x21, 0x11, 0x34, \n\t0x24, 0x13, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, \n\t0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x02, \n\t0x73, 0xd7, 0xff, 0x66, 0x59, 0x79, 0x85, 0xef, 0xcf, 0x4a, 0x92, 0x3d, \n\t0xfe, 0xdd, 0x01, 0x19, 0xc8, 0x5e, 0x58, 0x5d, 0x55, 0x56, 0x6c, 0x27, \n\t0x6d, 0x43, 0x65, 0x77, 0x70, 0x66, 0x60, 0x05, 0xc5, 0xd2, 0xb9, 0x62, \n\t0xa3, 0x30, 0x2b, 0xba, 0x81, 0xcf, 0xe5, 0x26, 0x26, 0xfe, 0x36, 0x05, \n\t0xa0, 0xc1, 0xf7, 0xfd, 0x96, 0x69, 0x63, 0x4f, 0x6e, 0x76, 0x61, 0xfc, \n\t0xfb, 0x1e, 0x1f, 0x79, 0x5e, 0x6c, 0x7f, 0xce, 0x00, 0x01, 0x00, 0x10, \n\t0xfe, 0x5f, 0x04, 0x07, 0x04, 0x3a, 0x00, 0x0b, 0x00, 0x3d, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0e, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0e, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0c, \n\t0x3e, 0x59, 0xb2, 0x02, 0x03, 0x06, 0x11, 0x12, 0x39, 0xb0, 0x02, 0x10, \n\t0xb0, 0x05, 0xd0, 0xb0, 0x02, 0x10, 0xb0, 0x09, 0xd0, 0x30, 0x31, 0x01, \n\t0x21, 0x01, 0x11, 0x21, 0x11, 0x01, 0x21, 0x13, 0x17, 0x33, 0x37, 0x02, \n\t0xd6, 0x01, 0x31, 0xfe, 0x96, 0xfe, 0xdc, 0xfe, 0x97, 0x01, 0x31, 0xb6, \n\t0x13, 0x06, 0x14, 0x04, 0x3a, 0xfb, 0xd7, 0xfe, 0x4e, 0x01, 0xb5, 0x04, \n\t0x26, 0xfd, 0x59, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x43, \n\t0xff, 0xeb, 0x04, 0x40, 0x05, 0xb0, 0x00, 0x16, 0x00, 0x24, 0x00, 0x54, \n\t0x00, 0xb0, 0x12, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, \n\t0xb1, 0x00, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, \n\t0x1b, 0xb1, 0x0b, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x01, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x15, 0x01, \n\t0x00, 0x11, 0x12, 0x39, 0xb0, 0x12, 0x10, 0xb1, 0x17, 0x06, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0b, 0x10, 0xb1, 0x1e, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x01, 0x15, 0x21, 0x07, 0x17, 0x16, 0x16, 0x15, 0x15, 0x14, 0x00, 0x23, \n\t0x22, 0x00, 0x35, 0x35, 0x34, 0x12, 0x3f, 0x02, 0x25, 0x35, 0x01, 0x22, \n\t0x06, 0x15, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, \n\t0x03, 0xd3, 0xfe, 0x6c, 0x02, 0xf4, 0x76, 0x99, 0xfe, 0xf1, 0xef, 0xf0, \n\t0xfe, 0xf1, 0xd8, 0xa9, 0x08, 0x01, 0xfe, 0xdd, 0x01, 0x96, 0x71, 0x69, \n\t0x68, 0x74, 0x71, 0x69, 0x6a, 0x05, 0xb0, 0xe0, 0x06, 0xbc, 0x57, 0xf5, \n\t0x9b, 0x15, 0xf4, 0xfe, 0xcd, 0x01, 0x24, 0xe9, 0x15, 0xc8, 0x01, 0x18, \n\t0x1e, 0x01, 0x06, 0xed, 0xb1, 0xfd, 0xbd, 0xb7, 0x8f, 0x15, 0x94, 0xb3, \n\t0xb4, 0x93, 0x15, 0x90, 0xb6, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5f, \n\t0xff, 0xec, 0x04, 0x2e, 0x04, 0x4d, 0x00, 0x2a, 0x00, 0x54, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x29, 0x2f, 0x1b, 0xb1, 0x29, 0x18, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1a, 0x2f, 0x1b, 0xb1, 0x1a, 0x0e, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x0a, \n\t0x3e, 0x59, 0xb1, 0x06, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x1a, 0x10, 0xb1, 0x22, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x29, 0x10, 0xb1, 0x2a, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x22, \n\t0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x21, 0x17, 0x16, 0x04, \n\t0x23, 0x22, 0x24, 0x35, 0x34, 0x36, 0x37, 0x26, 0x26, 0x35, 0x34, 0x24, \n\t0x33, 0x32, 0x04, 0x07, 0x07, 0x21, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, \n\t0x14, 0x16, 0x33, 0x33, 0x15, 0x02, 0x48, 0x60, 0x66, 0x67, 0x5d, 0x5e, \n\t0x6a, 0x01, 0x19, 0x02, 0x05, 0xfe, 0xe9, 0xc1, 0xdc, 0xfe, 0xe5, 0x69, \n\t0x63, 0x57, 0x62, 0x01, 0x08, 0xdc, 0xc1, 0x01, 0x06, 0x05, 0x02, 0xfe, \n\t0xe6, 0x66, 0x4f, 0x59, 0x59, 0x5c, 0x57, 0xbb, 0x01, 0xca, 0x40, 0x45, \n\t0x37, 0x4f, 0x4a, 0x37, 0x06, 0xa2, 0xac, 0xaf, 0x97, 0x5a, 0x80, 0x21, \n\t0x24, 0x79, 0x48, 0x96, 0xa5, 0xb3, 0x91, 0x06, 0x36, 0x40, 0x4a, 0x32, \n\t0x37, 0x3f, 0xbd, 0x00, 0x00, 0x01, 0x00, 0x4b, 0xfe, 0x55, 0x03, 0xd1, \n\t0x05, 0xb0, 0x00, 0x21, 0x00, 0x4f, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x16, 0x2f, 0x1b, 0xb1, 0x16, 0x0a, 0x3e, 0x59, 0xb0, 0x00, \n\t0x10, 0xb1, 0x1f, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb2, 0x01, 0x1f, 0x00, 0x11, 0x12, 0x39, 0xb0, 0x16, 0x10, 0xb1, \n\t0x08, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, \n\t0x31, 0x01, 0x15, 0x01, 0x06, 0x06, 0x15, 0x14, 0x16, 0x33, 0x33, 0x32, \n\t0x16, 0x15, 0x06, 0x06, 0x07, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, \n\t0x23, 0x22, 0x26, 0x35, 0x34, 0x12, 0x37, 0x37, 0x27, 0x21, 0x35, 0x03, \n\t0xc8, 0xfe, 0x98, 0x6d, 0x5c, 0x61, 0x66, 0x36, 0x93, 0xaa, 0x02, 0xb2, \n\t0x95, 0x61, 0x41, 0x4f, 0x3e, 0x49, 0x31, 0xc1, 0xc9, 0x84, 0x8b, 0xcd, \n\t0x02, 0xfd, 0xfc, 0x05, 0xb0, 0x9c, 0xfe, 0x50, 0x81, 0xbf, 0x7e, 0x66, \n\t0x63, 0x92, 0x86, 0x7d, 0xc9, 0x2a, 0xc1, 0x1c, 0x46, 0x35, 0x28, 0x2b, \n\t0xdc, 0xa2, 0x99, 0x01, 0x18, 0xaa, 0xf2, 0x05, 0xe0, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x6b, 0xfe, 0x61, 0x04, 0x18, 0x04, 0x4e, 0x00, 0x13, \n\t0x00, 0x46, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, \n\t0x04, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, \n\t0xb1, 0x00, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, \n\t0x1b, 0xb1, 0x08, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x11, \n\t0x2f, 0x1b, 0xb1, 0x11, 0x0a, 0x3e, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x0d, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x01, 0x17, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x21, 0x11, 0x34, \n\t0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x21, 0x11, 0x01, 0x7b, 0x0d, 0x35, \n\t0x9e, 0x61, 0xa5, 0xb7, 0xfe, 0xdb, 0x51, 0x51, 0x40, 0x62, 0x20, 0xfe, \n\t0xdc, 0x04, 0x3a, 0x98, 0x51, 0x5b, 0xd0, 0xe7, 0xfb, 0xca, 0x04, 0x35, \n\t0x74, 0x63, 0x2f, 0x2b, 0xfc, 0xed, 0x04, 0x3a, 0x00, 0x03, 0x00, 0x65, \n\t0xff, 0xeb, 0x04, 0x3e, 0x05, 0xc5, 0x00, 0x0d, 0x00, 0x16, 0x00, 0x1f, \n\t0x00, 0x57, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, \n\t0x0a, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x17, 0x2f, 0x1b, \n\t0xb1, 0x17, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, \n\t0x1b, 0xb1, 0x03, 0x0a, 0x3e, 0x59, 0xb0, 0x17, 0x10, 0xb1, 0x0e, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, \n\t0xb1, 0x13, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x0a, 0x10, 0xb1, 0x1c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x10, 0x00, 0x23, 0x22, 0x00, 0x11, \n\t0x11, 0x10, 0x00, 0x33, 0x32, 0x00, 0x11, 0x01, 0x21, 0x15, 0x14, 0x16, \n\t0x33, 0x32, 0x36, 0x35, 0x01, 0x21, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, \n\t0x15, 0x04, 0x3e, 0xfe, 0xf7, 0xe2, 0xe4, 0xfe, 0xf6, 0x01, 0x09, 0xe3, \n\t0xe2, 0x01, 0x0b, 0xfe, 0xdd, 0xfe, 0x6d, 0x67, 0x64, 0x62, 0x66, 0xfe, \n\t0x6d, 0x01, 0x93, 0x68, 0x62, 0x63, 0x66, 0x02, 0x37, 0xfe, 0xdf, 0xfe, \n\t0xd5, 0x01, 0x2b, 0x01, 0x21, 0x01, 0x41, 0x01, 0x20, 0x01, 0x2d, 0xfe, \n\t0xd3, 0xfe, 0xe0, 0xfe, 0xf7, 0x54, 0xb0, 0xa0, 0xa0, 0xb0, 0x01, 0x2d, \n\t0x4e, 0xad, 0xa1, 0xa0, 0xae, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x89, \n\t0xff, 0xeb, 0x02, 0x88, 0x04, 0x39, 0x00, 0x0f, 0x00, 0x29, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0e, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0a, 0x3e, \n\t0x59, 0xb1, 0x04, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0x30, 0x31, 0x01, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, \n\t0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x11, 0x01, 0xad, 0x2c, 0x2f, 0x1d, \n\t0x22, 0x23, 0x1e, 0x2f, 0x55, 0x37, 0x9d, 0xa7, 0x04, 0x39, 0xfd, 0x08, \n\t0x40, 0x33, 0x07, 0x0b, 0xd2, 0x14, 0x0f, 0xab, 0xaf, 0x02, 0xf4, 0x00, \n\t0xff, 0xff, 0x00, 0x81, 0x00, 0x00, 0x04, 0x94, 0x04, 0x3a, 0x02, 0x06, \n\t0x00, 0xfa, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0c, 0xff, 0xf2, 0x04, 0x77, \n\t0x05, 0xee, 0x00, 0x21, 0x00, 0x4b, 0x00, 0xb0, 0x0d, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x1b, 0x2f, 0x1b, 0xb1, 0x1b, 0x0a, 0x3e, 0x59, \n\t0xb2, 0x02, 0x0d, 0x00, 0x11, 0x12, 0x39, 0xb0, 0x0d, 0x10, 0xb1, 0x06, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x1b, \n\t0x10, 0xb1, 0x14, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x02, 0x10, 0xb0, 0x1f, 0xd0, 0x30, 0x31, 0x21, 0x21, 0x01, \n\t0x27, 0x26, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, \n\t0x16, 0x17, 0x01, 0x16, 0x16, 0x17, 0x16, 0x32, 0x37, 0x07, 0x06, 0x06, \n\t0x27, 0x26, 0x26, 0x27, 0x03, 0x23, 0x07, 0x01, 0x47, 0xfe, 0xc5, 0x01, \n\t0x78, 0x36, 0x18, 0x50, 0x35, 0x0d, 0x2a, 0x0b, 0x06, 0x29, 0x41, 0x25, \n\t0x9e, 0x9f, 0x2d, 0x01, 0x6b, 0x12, 0x3b, 0x29, 0x0c, 0x19, 0x0f, 0x13, \n\t0x20, 0x43, 0x21, 0x7f, 0x95, 0x2c, 0x8e, 0x06, 0x0f, 0x04, 0x23, 0x6c, \n\t0x37, 0x46, 0x04, 0x02, 0xd1, 0x0b, 0x0c, 0x9e, 0x74, 0xfc, 0x7d, 0x35, \n\t0x44, 0x07, 0x02, 0x01, 0xdb, 0x06, 0x05, 0x02, 0x09, 0xb7, 0x83, 0x01, \n\t0x88, 0x50, 0x00, 0x00, 0xff, 0xff, 0x00, 0x8b, 0xfe, 0x60, 0x04, 0x51, \n\t0x04, 0x3a, 0x02, 0x06, 0x00, 0x77, 0x00, 0x00, 0xff, 0xff, 0x00, 0x10, \n\t0x00, 0x00, 0x04, 0x07, 0x04, 0x3a, 0x02, 0x06, 0x00, 0x59, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x67, 0xfe, 0x40, 0x04, 0x36, 0x05, 0xb0, 0x00, 0x2e, \n\t0x00, 0x60, 0x00, 0xb0, 0x18, 0x2f, 0xb0, 0x09, 0x2f, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x10, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x1f, 0x2f, 0x1b, 0xb1, 0x1f, 0x0a, 0x3e, 0x59, 0xb0, \n\t0x00, 0x10, 0xb1, 0x01, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x09, 0x10, 0xb1, 0x0a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x1f, 0x10, 0xb1, 0x11, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x26, 0x0a, 0x09, \n\t0x11, 0x12, 0x39, 0xb0, 0x01, 0x10, 0xb0, 0x2c, 0xd0, 0xb0, 0x2d, 0xd0, \n\t0x30, 0x31, 0x01, 0x15, 0x21, 0x06, 0x06, 0x15, 0x14, 0x16, 0x33, 0x33, \n\t0x15, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x33, 0x32, 0x16, 0x15, \n\t0x06, 0x06, 0x07, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x22, \n\t0x24, 0x35, 0x34, 0x36, 0x37, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x23, \n\t0x35, 0x03, 0xd5, 0xfe, 0xe8, 0x6d, 0x6b, 0x6b, 0x72, 0x97, 0x8f, 0x9d, \n\t0xa3, 0x7e, 0x6e, 0x79, 0x99, 0xae, 0x02, 0xa9, 0x9d, 0x52, 0x3b, 0x55, \n\t0x3f, 0x41, 0x46, 0xea, 0xfe, 0xeb, 0x96, 0x91, 0x63, 0x6a, 0x49, 0x45, \n\t0xd5, 0x05, 0xb0, 0xe8, 0x03, 0x56, 0x48, 0x4b, 0x57, 0xe8, 0x81, 0x7c, \n\t0x5c, 0x71, 0x8c, 0x89, 0x8d, 0xc0, 0x31, 0xac, 0x1a, 0x49, 0x3c, 0x2d, \n\t0x33, 0xe9, 0xd0, 0x85, 0xb8, 0x2f, 0x22, 0x77, 0x52, 0x45, 0x67, 0x21, \n\t0xe8, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x43, 0xff, 0xeb, 0x04, 0x40, \n\t0x04, 0x4e, 0x02, 0x06, 0x00, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4e, \n\t0xff, 0xeb, 0x04, 0xe1, 0x04, 0x3a, 0x00, 0x17, 0x00, 0x51, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x16, 0x2f, 0x1b, 0xb1, 0x16, 0x0e, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x13, 0x2f, 0x1b, 0xb1, 0x13, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x16, 0x10, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0c, 0x10, 0xb1, 0x05, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb0, \n\t0x10, 0xd0, 0xb0, 0x14, 0xd0, 0x30, 0x31, 0x01, 0x23, 0x11, 0x14, 0x16, \n\t0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x11, \n\t0x23, 0x11, 0x21, 0x11, 0x23, 0x35, 0x21, 0x04, 0xc7, 0xc1, 0x2c, 0x2f, \n\t0x1d, 0x22, 0x23, 0x1e, 0x2f, 0x55, 0x37, 0x9d, 0xa7, 0xd9, 0xfe, 0xdd, \n\t0x98, 0x04, 0x79, 0x03, 0x64, 0xfd, 0xdd, 0x40, 0x33, 0x07, 0x0b, 0xd2, \n\t0x14, 0x0f, 0xab, 0xaf, 0x02, 0x1f, 0xfc, 0x9c, 0x03, 0x64, 0xd6, 0x00, \n\t0x00, 0x02, 0x00, 0x70, 0xfe, 0x60, 0x04, 0x3e, 0x04, 0x4e, 0x00, 0x0f, \n\t0x00, 0x1f, 0x00, 0x48, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, \n\t0x1b, 0xb1, 0x0c, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, \n\t0x2f, 0x1b, 0xb1, 0x07, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0a, 0x3e, 0x59, 0xb0, 0x0c, 0x10, 0xb1, \n\t0x13, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x03, 0x10, 0xb1, 0x1c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0x30, 0x31, 0x01, 0x14, 0x02, 0x23, 0x22, 0x26, 0x27, 0x11, \n\t0x21, 0x11, 0x34, 0x00, 0x33, 0x32, 0x12, 0x11, 0x21, 0x34, 0x26, 0x23, \n\t0x22, 0x06, 0x15, 0x07, 0x33, 0x11, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, \n\t0x04, 0x3e, 0xdc, 0xc7, 0x55, 0x83, 0x30, 0xfe, 0xdd, 0x01, 0x0b, 0xe4, \n\t0xe5, 0xfa, 0xfe, 0xdd, 0x62, 0x69, 0x5f, 0x5e, 0x01, 0x01, 0x1b, 0x5d, \n\t0x44, 0x6a, 0x62, 0x01, 0xff, 0xf0, 0xfe, 0xdc, 0x3d, 0x3b, 0xfd, 0xfd, \n\t0x03, 0xe1, 0xeb, 0x01, 0x22, 0xfe, 0xc7, 0xfe, 0xff, 0x9a, 0xbf, 0xb8, \n\t0x8b, 0x01, 0xff, 0x00, 0x2e, 0x30, 0xa6, 0x8e, 0x00, 0x01, 0x00, 0x3e, \n\t0xfe, 0x48, 0x03, 0xec, 0x04, 0x4e, 0x00, 0x22, 0x00, 0x48, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0e, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x15, 0x2f, 0x1b, 0xb1, 0x15, 0x0c, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1c, 0x2f, 0x1b, 0xb1, 0x1c, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x08, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x1c, 0x10, 0xb1, 0x0f, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x32, \n\t0x16, 0x07, 0x07, 0x21, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x15, 0x14, \n\t0x16, 0x17, 0x16, 0x16, 0x15, 0x06, 0x06, 0x07, 0x27, 0x36, 0x36, 0x35, \n\t0x34, 0x26, 0x27, 0x26, 0x02, 0x35, 0x35, 0x34, 0x00, 0x02, 0x32, 0xc8, \n\t0xf2, 0x04, 0x02, 0xfe, 0xf6, 0x57, 0x53, 0x70, 0x60, 0x82, 0x91, 0xbd, \n\t0xad, 0x02, 0xb2, 0x94, 0x61, 0x41, 0x4e, 0x4b, 0x4f, 0xf9, 0xf4, 0x01, \n\t0x07, 0x04, 0x4e, 0xdf, 0xbf, 0x06, 0x55, 0x6e, 0xb6, 0x8c, 0x1e, 0x88, \n\t0x94, 0x15, 0x1e, 0x80, 0x86, 0x7e, 0xc8, 0x2a, 0xc1, 0x1d, 0x44, 0x36, \n\t0x28, 0x2d, 0x0e, 0x24, 0x01, 0x08, 0xde, 0x1e, 0xed, 0x01, 0x36, 0x00, \n\t0x00, 0x02, 0x00, 0x41, 0xff, 0xeb, 0x04, 0x7d, 0x04, 0x3a, 0x00, 0x10, \n\t0x00, 0x1e, 0x00, 0x41, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, \n\t0x1b, 0xb1, 0x0f, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, \n\t0x2f, 0x1b, 0xb1, 0x08, 0x0a, 0x3e, 0x59, 0xb0, 0x0f, 0x10, 0xb1, 0x00, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x08, \n\t0x10, 0xb1, 0x14, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x00, 0x10, 0xb0, 0x1b, 0xd0, 0x30, 0x31, 0x01, 0x21, 0x16, \n\t0x16, 0x15, 0x15, 0x14, 0x00, 0x23, 0x22, 0x00, 0x35, 0x35, 0x34, 0x00, \n\t0x33, 0x21, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, \n\t0x23, 0x22, 0x06, 0x15, 0x04, 0x7d, 0xfe, 0xfe, 0x50, 0x64, 0xfe, 0xf8, \n\t0xe6, 0xf1, 0xfe, 0xf1, 0x01, 0x0f, 0xef, 0x02, 0x3e, 0xfc, 0xe8, 0x68, \n\t0x74, 0x69, 0x62, 0x63, 0x6a, 0x71, 0x69, 0x03, 0x58, 0x42, 0xb5, 0x63, \n\t0x15, 0xdd, 0xfe, 0xdf, 0x01, 0x33, 0xf4, 0x15, 0xea, 0x01, 0x29, 0xfd, \n\t0xd8, 0x94, 0xb3, 0xb4, 0x93, 0x15, 0x87, 0xaa, 0xab, 0x86, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x33, 0x00, 0x00, 0x04, 0x07, 0x04, 0x3a, 0x00, 0x07, \n\t0x00, 0x2f, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, \n\t0x06, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, \n\t0xb1, 0x03, 0x0a, 0x3e, 0x59, 0xb0, 0x06, 0x10, 0xb1, 0x05, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x01, 0xd0, 0x30, \n\t0x31, 0x01, 0x21, 0x11, 0x21, 0x11, 0x21, 0x35, 0x21, 0x04, 0x07, 0xfe, \n\t0xa5, 0xfe, 0xdc, 0xfe, 0xab, 0x03, 0xd4, 0x03, 0x5b, 0xfc, 0xa5, 0x03, \n\t0x5b, 0xdf, 0x00, 0x00, 0x00, 0x01, 0x00, 0x71, 0xff, 0xeb, 0x04, 0x39, \n\t0x04, 0x3a, 0x00, 0x15, 0x00, 0x36, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x0a, 0x3e, 0x59, 0xb1, 0x04, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x01, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x26, 0x02, 0x27, 0x21, \n\t0x16, 0x12, 0x15, 0x10, 0x02, 0x23, 0x22, 0x24, 0x35, 0x11, 0x01, 0x94, \n\t0x65, 0x54, 0x69, 0x60, 0x03, 0x34, 0x2e, 0x01, 0x16, 0x32, 0x40, 0xe3, \n\t0xff, 0xe5, 0xfe, 0xff, 0x04, 0x3a, 0xfd, 0x9c, 0x8e, 0x7d, 0xd3, 0x98, \n\t0x7e, 0x01, 0x02, 0x84, 0x69, 0xfe, 0xfd, 0x98, 0xfe, 0xf4, 0xfe, 0xc1, \n\t0xf4, 0xf9, 0x02, 0x62, 0x00, 0x02, 0x00, 0x35, 0xfe, 0x22, 0x05, 0xb7, \n\t0x04, 0x3a, 0x00, 0x18, 0x00, 0x21, 0x00, 0x54, 0x00, 0xb0, 0x07, 0x2f, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0e, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x0e, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x06, 0xd0, 0xb0, 0x09, 0x10, 0xb1, 0x16, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, \n\t0xb1, 0x1c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x16, 0x10, 0xb0, 0x1e, 0xd0, 0x30, 0x31, 0x01, 0x20, 0x00, 0x15, \n\t0x14, 0x00, 0x05, 0x11, 0x21, 0x11, 0x24, 0x00, 0x35, 0x34, 0x36, 0x37, \n\t0x21, 0x06, 0x06, 0x07, 0x14, 0x16, 0x17, 0x37, 0x11, 0x01, 0x26, 0x26, \n\t0x07, 0x07, 0x11, 0x17, 0x36, 0x36, 0x03, 0x85, 0x01, 0x0a, 0x01, 0x28, \n\t0xfe, 0xf2, 0xfe, 0xdc, 0xfe, 0xdd, 0xfe, 0xdd, 0xfe, 0xf6, 0x47, 0x3a, \n\t0x01, 0x0f, 0x32, 0x39, 0x01, 0x79, 0x8a, 0x06, 0x02, 0x31, 0x02, 0x8a, \n\t0x7c, 0x06, 0x06, 0x8b, 0x7d, 0x04, 0x3a, 0xfe, 0xb7, 0xd8, 0xdb, 0xfe, \n\t0xd1, 0x1d, 0xfe, 0x30, 0x01, 0xd2, 0x23, 0x01, 0x4b, 0xee, 0x90, 0xf6, \n\t0x64, 0x83, 0xf2, 0x75, 0x91, 0xc1, 0x1b, 0x02, 0x03, 0x55, 0xfd, 0xdf, \n\t0x8a, 0xb3, 0x05, 0x02, 0xfd, 0x90, 0x02, 0x16, 0xa8, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x17, 0xfe, 0x4e, 0x04, 0x40, 0x04, 0x4a, 0x00, 0x25, \n\t0x00, 0x62, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, \n\t0x06, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, \n\t0xb1, 0x00, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1a, 0x2f, \n\t0x1b, 0xb1, 0x1a, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x13, \n\t0x2f, 0x1b, 0xb1, 0x13, 0x0c, 0x3e, 0x59, 0xb2, 0x18, 0x1a, 0x06, 0x11, \n\t0x12, 0x39, 0xb0, 0x18, 0x10, 0xb0, 0x04, 0xd0, 0xb0, 0x13, 0x10, 0xb1, \n\t0x0d, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x00, 0x10, 0xb1, 0x1f, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0x30, 0x31, 0x13, 0x32, 0x16, 0x1f, 0x02, 0x13, 0x21, 0x01, \n\t0x13, 0x16, 0x16, 0x17, 0x16, 0x16, 0x33, 0x07, 0x06, 0x06, 0x27, 0x26, \n\t0x26, 0x2f, 0x02, 0x03, 0x21, 0x01, 0x03, 0x26, 0x26, 0x23, 0x22, 0x06, \n\t0x07, 0x27, 0x36, 0x36, 0xb5, 0x97, 0x99, 0x2b, 0x3e, 0x06, 0xc4, 0x01, \n\t0x28, 0xfe, 0x9a, 0xb8, 0x14, 0x3a, 0x28, 0x0b, 0x19, 0x10, 0x0b, 0x1f, \n\t0x4b, 0x22, 0x6f, 0x87, 0x32, 0x3b, 0x06, 0xdb, 0xfe, 0xdf, 0x01, 0x76, \n\t0xaa, 0x17, 0x5c, 0x3a, 0x0d, 0x2a, 0x0b, 0x06, 0x2c, 0x48, 0x04, 0x4a, \n\t0x9e, 0x73, 0x91, 0x01, 0x01, 0x93, 0xfd, 0x27, 0xfe, 0x56, 0x34, 0x41, \n\t0x08, 0x02, 0x01, 0xde, 0x06, 0x05, 0x03, 0x0a, 0xb4, 0x86, 0x88, 0x01, \n\t0xfe, 0x42, 0x03, 0x02, 0x01, 0x8a, 0x39, 0x41, 0x04, 0x02, 0xd4, 0x0b, \n\t0x0b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x44, 0xfe, 0x22, 0x05, 0xb4, \n\t0x04, 0x3a, 0x00, 0x1d, 0x00, 0x4f, 0x00, 0xb0, 0x10, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0e, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0e, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x16, 0x2f, 0x1b, 0xb1, 0x16, 0x0e, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x0a, \n\t0x3e, 0x59, 0xb1, 0x1c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x01, 0xd0, 0xb0, 0x12, 0x10, 0xb0, 0x0f, 0xd0, 0x30, \n\t0x31, 0x01, 0x11, 0x17, 0x36, 0x36, 0x35, 0x26, 0x26, 0x27, 0x21, 0x16, \n\t0x16, 0x15, 0x14, 0x00, 0x05, 0x11, 0x21, 0x11, 0x24, 0x00, 0x11, 0x11, \n\t0x21, 0x11, 0x14, 0x16, 0x17, 0x37, 0x11, 0x03, 0x83, 0x06, 0x89, 0x7f, \n\t0x03, 0x39, 0x31, 0x01, 0x0f, 0x39, 0x48, 0xfe, 0xf4, 0xfe, 0xdb, 0xfe, \n\t0xdc, 0xfe, 0xff, 0xfe, 0xe6, 0x01, 0x24, 0x81, 0x70, 0x06, 0x04, 0x3a, \n\t0xfc, 0xaa, 0x02, 0x1b, 0xc3, 0x90, 0x76, 0xf2, 0x82, 0x63, 0xf6, 0x91, \n\t0xf1, 0xfe, 0xb4, 0x20, 0xfe, 0x2f, 0x01, 0xd3, 0x1f, 0x01, 0x29, 0x01, \n\t0x11, 0x01, 0xec, 0xfe, 0x11, 0xa1, 0xaf, 0x16, 0x01, 0x03, 0x54, 0x00, \n\t0x00, 0x01, 0x00, 0x50, 0xff, 0xeb, 0x06, 0x8f, 0x04, 0x3a, 0x00, 0x28, \n\t0x00, 0x46, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, \n\t0x00, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x15, 0x2f, 0x1b, \n\t0xb1, 0x15, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1c, 0x2f, \n\t0x1b, 0xb1, 0x1c, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x22, \n\t0x2f, 0x1b, 0xb1, 0x22, 0x0a, 0x3e, 0x59, 0xb1, 0x06, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0f, 0xd0, 0x30, 0x31, \n\t0x01, 0x06, 0x02, 0x07, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x21, \n\t0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x26, 0x02, 0x27, 0x21, 0x16, \n\t0x12, 0x15, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, 0x06, 0x06, 0x23, 0x22, \n\t0x02, 0x11, 0x34, 0x12, 0x37, 0x02, 0x00, 0x40, 0x49, 0x04, 0x52, 0x5e, \n\t0x50, 0x63, 0x01, 0x34, 0x61, 0x51, 0x5d, 0x53, 0x04, 0x49, 0x40, 0x01, \n\t0x16, 0x45, 0x55, 0xd6, 0xf2, 0x76, 0xaf, 0x32, 0x33, 0xb0, 0x74, 0xf3, \n\t0xd6, 0x54, 0x46, 0x04, 0x3a, 0x82, 0xfe, 0xfd, 0x7f, 0x9e, 0xcd, 0x89, \n\t0x96, 0x01, 0x5a, 0xfe, 0xa6, 0x96, 0x89, 0xcc, 0x9f, 0x80, 0x01, 0x02, \n\t0x82, 0x67, 0xfe, 0xfc, 0x99, 0xfe, 0xf4, 0xfe, 0xc1, 0x6e, 0x6a, 0x6a, \n\t0x6e, 0x01, 0x3f, 0x01, 0x0c, 0x99, 0x01, 0x03, 0x68, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0xff, 0xac, 0xff, 0xeb, 0x02, 0xaa, 0x05, 0xb5, 0x02, 0x26, \n\t0x01, 0x93, 0x00, 0x00, 0x01, 0x07, 0x00, 0x6a, 0xff, 0x10, 0x00, 0x05, \n\t0x00, 0x0f, 0x00, 0xb3, 0x14, 0x03, 0x0f, 0x04, 0x2b, 0xb0, 0x14, 0x10, \n\t0xb0, 0x11, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x71, \n\t0xff, 0xeb, 0x04, 0x39, 0x05, 0xb6, 0x02, 0x26, 0x01, 0x9f, 0x00, 0x00, \n\t0x01, 0x06, 0x00, 0x6a, 0x3a, 0x06, 0x00, 0x0f, 0x00, 0xb3, 0x1a, 0x03, \n\t0x00, 0x04, 0x2b, 0xb0, 0x1a, 0x10, 0xb0, 0x17, 0xd0, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x43, 0xff, 0xeb, 0x04, 0x40, 0x06, 0x2a, 0x02, 0x26, \n\t0x00, 0x52, 0x00, 0x00, 0x01, 0x07, 0x01, 0x61, 0x00, 0xe2, 0xff, 0xd2, \n\t0x00, 0x09, 0x00, 0xb3, 0x1f, 0x07, 0x03, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x71, 0xff, 0xeb, 0x04, 0x39, 0x06, 0x15, 0x02, 0x26, \n\t0x01, 0x9f, 0x00, 0x00, 0x01, 0x07, 0x01, 0x61, 0x00, 0xf6, 0xff, 0xbd, \n\t0x00, 0x09, 0x00, 0xb3, 0x19, 0x07, 0x00, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x50, 0xff, 0xeb, 0x06, 0x8f, 0x06, 0x15, 0x02, 0x26, \n\t0x01, 0xa3, 0x00, 0x00, 0x01, 0x07, 0x01, 0x61, 0x02, 0x10, 0xff, 0xbd, \n\t0x00, 0x09, 0x00, 0xb3, 0x2c, 0x07, 0x00, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0x00, 0x02, 0x00, 0x7a, 0xff, 0xeb, 0x05, 0x18, 0x05, 0xc5, 0x00, 0x19, \n\t0x00, 0x25, 0x00, 0x4a, 0x00, 0xb0, 0x17, 0x2f, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0a, 0x3e, 0x59, 0xb1, 0x14, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, \n\t0x10, 0xb1, 0x1d, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x17, 0x10, 0xb1, 0x24, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, \n\t0x16, 0x15, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x35, 0x11, 0x25, 0x11, \n\t0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x26, 0x24, 0x01, 0x34, 0x26, 0x23, \n\t0x22, 0x06, 0x15, 0x15, 0x14, 0x16, 0x17, 0x37, 0x02, 0x22, 0xd7, 0xac, \n\t0xab, 0xc8, 0xfe, 0xbe, 0xfe, 0xf9, 0xfe, 0xf6, 0xfe, 0xb5, 0x01, 0x34, \n\t0x9b, 0x86, 0x7f, 0x93, 0x04, 0xc2, 0xfe, 0xff, 0x01, 0xc3, 0x29, 0x27, \n\t0x2b, 0x33, 0x5a, 0x4e, 0x06, 0x03, 0xc8, 0x67, 0xb9, 0xdd, 0xd9, 0xbd, \n\t0xfd, 0xfd, 0xfe, 0xfb, 0xfe, 0xc4, 0x01, 0x48, 0xf9, 0x02, 0xb8, 0x02, \n\t0xfd, 0x46, 0x98, 0xbf, 0xb0, 0x9c, 0x0e, 0xec, 0x01, 0x2f, 0x41, 0x42, \n\t0x43, 0x40, 0x84, 0x53, 0x72, 0x08, 0x02, 0x00, 0x00, 0x01, 0xff, 0xf3, \n\t0x00, 0x00, 0x04, 0xbf, 0x05, 0xc8, 0x00, 0x23, 0x00, 0x4f, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x10, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1c, 0x2f, 0x1b, 0xb1, 0x1c, 0x10, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x1c, 0x10, 0xb1, 0x15, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0a, 0xd0, 0xb2, 0x21, 0x10, 0x1c, \n\t0x11, 0x12, 0x39, 0xb0, 0x21, 0x10, 0xb0, 0x0e, 0xd0, 0xb0, 0x21, 0x10, \n\t0xb0, 0x11, 0xd0, 0x30, 0x31, 0x01, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, \n\t0x07, 0x26, 0x26, 0x23, 0x22, 0x06, 0x07, 0x01, 0x11, 0x21, 0x11, 0x01, \n\t0x26, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x16, \n\t0x17, 0x13, 0x17, 0x33, 0x37, 0x03, 0x02, 0x3d, 0x97, 0x82, 0x20, 0x32, \n\t0x15, 0x18, 0x04, 0x24, 0x0b, 0x25, 0x38, 0x12, 0xfe, 0xe2, 0xfe, 0xdd, \n\t0xfe, 0xe8, 0x14, 0x38, 0x24, 0x0c, 0x23, 0x03, 0x17, 0x13, 0x32, 0x21, \n\t0x83, 0x96, 0x3c, 0x95, 0x12, 0x06, 0x13, 0x04, 0xb3, 0x99, 0x7c, 0x08, \n\t0x0b, 0xde, 0x01, 0x04, 0x34, 0x2b, 0xfd, 0x60, 0xfe, 0x23, 0x01, 0xe9, \n\t0x02, 0x94, 0x2b, 0x34, 0x04, 0x01, 0xde, 0x0b, 0x08, 0x76, 0x98, 0xfe, \n\t0x7f, 0x5a, 0x5a, 0x00, 0x00, 0x02, 0x00, 0x13, 0xff, 0xeb, 0x06, 0x98, \n\t0x04, 0x3a, 0x00, 0x16, 0x00, 0x2c, 0x00, 0x51, 0x00, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x15, 0x2f, 0x1b, 0xb1, 0x15, 0x0e, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x0a, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x15, 0x10, 0xb1, 0x14, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x1b, 0xd0, 0xb0, 0x01, 0xd0, 0xb0, 0x0d, 0x10, \n\t0xb1, 0x21, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x2a, 0xd0, 0x30, 0x31, 0x01, 0x23, 0x16, 0x16, 0x15, 0x10, 0x02, \n\t0x23, 0x22, 0x26, 0x27, 0x06, 0x06, 0x23, 0x22, 0x02, 0x11, 0x34, 0x36, \n\t0x37, 0x23, 0x35, 0x21, 0x01, 0x26, 0x26, 0x27, 0x21, 0x06, 0x06, 0x07, \n\t0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x21, 0x15, 0x14, 0x16, 0x33, \n\t0x32, 0x36, 0x06, 0x98, 0x7f, 0x18, 0x1c, 0xc8, 0xe2, 0x74, 0xad, 0x31, \n\t0x33, 0xad, 0x72, 0xe3, 0xc7, 0x1b, 0x19, 0x76, 0x06, 0x85, 0xfe, 0x92, \n\t0x03, 0x1d, 0x18, 0xfc, 0xbe, 0x1a, 0x1c, 0x02, 0x43, 0x4e, 0x4f, 0x60, \n\t0x01, 0x33, 0x5f, 0x4e, 0x4d, 0x45, 0x03, 0x71, 0x48, 0x9d, 0x56, 0xfe, \n\t0xf4, 0xfe, 0xc1, 0x6e, 0x6a, 0x6a, 0x6e, 0x01, 0x3f, 0x01, 0x0c, 0x56, \n\t0x9d, 0x48, 0xc9, 0xfd, 0xfc, 0x4c, 0x9e, 0x51, 0x4f, 0x9e, 0x4e, 0x9f, \n\t0xcc, 0x89, 0x96, 0xcd, 0xcd, 0x96, 0x89, 0xcc, 0xff, 0xff, 0x00, 0x88, \n\t0x00, 0x00, 0x04, 0x6d, 0x07, 0x22, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x43, 0x00, 0xa7, 0x01, 0x5c, 0x00, 0x09, 0x00, 0xb3, \n\t0x0d, 0x07, 0x06, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x88, \n\t0x00, 0x00, 0x04, 0x6d, 0x07, 0x0d, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x6a, 0x00, 0x41, 0x01, 0x5d, 0x00, 0x0f, 0x00, 0xb3, \n\t0x11, 0x08, 0x06, 0x04, 0x2b, 0xb0, 0x11, 0x10, 0xb0, 0x0d, 0xd0, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x88, 0x00, 0x00, 0x04, 0x3d, \n\t0x07, 0x22, 0x02, 0x26, 0x01, 0x6e, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, \n\t0x01, 0x63, 0x01, 0x5c, 0x00, 0x09, 0x00, 0xb3, 0x0a, 0x07, 0x04, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0x00, 0x01, 0x00, 0x6e, 0xff, 0xec, 0x04, 0xec, \n\t0x05, 0xc6, 0x00, 0x21, 0x00, 0x57, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x17, 0x2f, 0x1b, 0xb1, 0x17, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0a, 0x3e, 0x59, 0xb0, 0x0b, \n\t0x10, 0xb1, 0x13, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x17, 0x10, 0xb1, 0x19, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x1e, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x17, 0x16, \n\t0x00, 0x21, 0x20, 0x00, 0x11, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x07, \n\t0x07, 0x21, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x15, 0x21, 0x15, 0x21, \n\t0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x04, 0xe4, 0x02, 0x04, 0xfe, \n\t0xd9, 0xfe, 0xfa, 0xfe, 0xf9, 0xfe, 0xb8, 0x01, 0x40, 0x01, 0x00, 0x01, \n\t0x0e, 0x01, 0x30, 0x04, 0x02, 0xfe, 0xe4, 0x8a, 0x92, 0x83, 0x9a, 0x01, \n\t0xb5, 0xfe, 0x4b, 0xa2, 0x8a, 0x89, 0x83, 0x01, 0xf0, 0x06, 0xeb, 0xfe, \n\t0xed, 0x01, 0x52, 0x01, 0x0a, 0x01, 0x21, 0x01, 0x09, 0x01, 0x54, 0xfe, \n\t0xeb, 0xef, 0x06, 0x90, 0x99, 0xd5, 0xa5, 0x1f, 0xe2, 0x22, 0xa7, 0xd5, \n\t0x93, 0x91, 0x00, 0x00, 0x00, 0x01, 0x00, 0x55, 0xff, 0xeb, 0x04, 0xbe, \n\t0x05, 0xc5, 0x00, 0x27, 0x00, 0x5d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x1d, 0x2f, 0x1b, 0xb1, 0x1d, 0x0a, 0x3e, 0x59, 0xb2, 0x17, 0x1d, \n\t0x09, 0x11, 0x12, 0x39, 0xb0, 0x17, 0x10, 0xb1, 0x03, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x09, 0x10, 0xb0, 0x0d, \n\t0xd0, 0xb0, 0x09, 0x10, 0xb1, 0x11, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x1d, 0x10, 0xb0, 0x21, 0xd0, 0xb0, 0x1d, \n\t0x10, 0xb1, 0x25, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0x30, 0x31, 0x01, 0x34, 0x26, 0x27, 0x24, 0x24, 0x35, 0x34, 0x24, \n\t0x33, 0x32, 0x04, 0x07, 0x07, 0x21, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, \n\t0x14, 0x16, 0x17, 0x16, 0x16, 0x15, 0x14, 0x04, 0x23, 0x22, 0x24, 0x37, \n\t0x37, 0x21, 0x14, 0x16, 0x33, 0x32, 0x36, 0x03, 0x9a, 0x77, 0x95, 0xfe, \n\t0xfc, 0xfe, 0xf6, 0x01, 0x31, 0xed, 0xf0, 0x01, 0x2e, 0x05, 0x02, 0xfe, \n\t0xe5, 0x87, 0x7a, 0x75, 0x80, 0x89, 0xa8, 0xf1, 0xf8, 0xfe, 0xd9, 0xf2, \n\t0xee, 0xfe, 0x9e, 0x05, 0x02, 0x01, 0x1c, 0x9f, 0x8e, 0x77, 0x7e, 0x01, \n\t0x7c, 0x54, 0x66, 0x2d, 0x4b, 0xce, 0xb3, 0xb3, 0xe3, 0xff, 0xbb, 0x06, \n\t0x65, 0x7d, 0x68, 0x51, 0x4a, 0x5f, 0x35, 0x43, 0xdc, 0xb3, 0xbb, 0xd8, \n\t0xf5, 0xdd, 0x06, 0x82, 0x79, 0x62, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9a, \n\t0x00, 0x00, 0x01, 0xbe, 0x05, 0xb0, 0x02, 0x06, 0x00, 0x2c, 0x00, 0x00, \n\t0xff, 0xff, 0xff, 0xaf, 0x00, 0x00, 0x02, 0xad, 0x07, 0x0d, 0x02, 0x26, \n\t0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x6a, 0xff, 0x13, 0x01, 0x5d, \n\t0x00, 0x0f, 0x00, 0xb3, 0x08, 0x08, 0x02, 0x04, 0x2b, 0xb0, 0x08, 0x10, \n\t0xb0, 0x05, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3a, \n\t0xff, 0xeb, 0x04, 0x0d, 0x05, 0xb0, 0x02, 0x06, 0x00, 0x2d, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x2a, 0x00, 0x00, 0x08, 0x3b, 0x05, 0xb0, 0x00, 0x16, \n\t0x00, 0x1f, 0x00, 0x69, 0x00, 0xb0, 0x01, 0x2f, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x0a, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0a, 0x3e, 0x59, 0xb0, \n\t0x00, 0x10, 0xb1, 0x0a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x10, 0x10, 0xb1, 0x11, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x01, 0x10, 0xb1, 0x17, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x09, 0x10, 0xb1, \n\t0x18, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, \n\t0x31, 0x01, 0x11, 0x33, 0x32, 0x00, 0x15, 0x14, 0x00, 0x23, 0x21, 0x11, \n\t0x21, 0x11, 0x10, 0x00, 0x21, 0x23, 0x35, 0x33, 0x32, 0x36, 0x11, 0x11, \n\t0x01, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x05, 0x1f, 0xfa, \n\t0xfa, 0x01, 0x28, 0xfe, 0xd8, 0xfa, 0xfd, 0xe2, 0xfe, 0x7e, 0xfe, 0xf1, \n\t0xfe, 0xeb, 0x2b, 0x28, 0x96, 0x6d, 0x03, 0xca, 0xfa, 0x7a, 0x85, 0x85, \n\t0x7a, 0x05, 0xb0, 0xfe, 0x03, 0xfe, 0xf7, 0xd0, 0xd2, 0xfe, 0xf8, 0x04, \n\t0xcf, 0xfe, 0x4a, 0xfe, 0x5b, 0xfe, 0x8c, 0xe0, 0xf7, 0x01, 0x42, 0x02, \n\t0x97, 0xfd, 0x22, 0xfe, 0x0e, 0x92, 0x6a, 0x66, 0x90, 0x00, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x88, 0x00, 0x00, 0x08, 0x3e, 0x05, 0xb0, 0x00, 0x12, \n\t0x00, 0x1b, 0x00, 0x74, 0x00, 0xb0, 0x04, 0x2f, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x10, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x16, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x00, 0x10, 0xb1, 0x0d, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x13, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0b, 0x10, 0xb1, 0x14, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x01, 0x21, 0x11, 0x21, 0x11, 0x33, 0x32, 0x00, 0x15, 0x14, 0x00, 0x23, \n\t0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x01, 0x11, 0x33, 0x32, 0x36, \n\t0x35, 0x34, 0x26, 0x23, 0x01, 0xac, 0x02, 0x51, 0x01, 0x24, 0xfa, 0xfb, \n\t0x01, 0x28, 0xfe, 0xd7, 0xfa, 0xfd, 0xe2, 0xfd, 0xaf, 0xfe, 0xdc, 0x01, \n\t0x24, 0x03, 0x75, 0xfa, 0x7b, 0x84, 0x84, 0x7b, 0x03, 0x49, 0x02, 0x67, \n\t0xfd, 0xf1, 0xfe, 0xfe, 0xcd, 0xce, 0xfe, 0xfc, 0x02, 0x68, 0xfd, 0x98, \n\t0x05, 0xb0, 0xfd, 0x10, 0xfe, 0x24, 0x8a, 0x66, 0x63, 0x89, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x88, 0x00, 0x00, 0x05, 0x39, 0x07, 0x22, 0x02, 0x26, \n\t0x00, 0x2e, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, 0x01, 0x5a, 0x01, 0x5c, \n\t0x00, 0x09, 0x00, 0xb3, 0x11, 0x07, 0x04, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x7e, 0x00, 0x00, 0x05, 0x17, 0x07, 0x22, 0x02, 0x26, \n\t0x01, 0xc0, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, 0x01, 0x16, 0x01, 0x5c, \n\t0x00, 0x09, 0x00, 0xb3, 0x0d, 0x07, 0x08, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x24, 0xff, 0xeb, 0x04, 0xee, 0x07, 0x68, 0x02, 0x26, \n\t0x03, 0xd3, 0x00, 0x00, 0x01, 0x07, 0x01, 0x54, 0x00, 0xd3, 0x01, 0xb8, \n\t0x00, 0x09, 0x00, 0xb3, 0x1a, 0x08, 0x14, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0x00, 0x01, 0x00, 0x7b, 0xfe, 0x98, 0x05, 0x14, 0x05, 0xb0, 0x00, 0x0b, \n\t0x00, 0x46, 0x00, 0xb0, 0x08, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, \n\t0x2f, 0x1b, 0xb1, 0x00, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0a, 0x3e, 0x59, 0xb1, 0x02, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x13, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, \n\t0x7b, 0x01, 0x23, 0x02, 0x52, 0x01, 0x24, 0xfe, 0x52, 0xfe, 0xdc, 0xfe, \n\t0x39, 0x05, 0xb0, 0xfb, 0x30, 0x04, 0xd0, 0xfa, 0x50, 0xfe, 0x98, 0x01, \n\t0x68, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0c, 0x00, 0x00, 0x05, 0x1f, \n\t0x05, 0xb0, 0x02, 0x06, 0x00, 0x24, 0x00, 0x00, 0x00, 0x02, 0x00, 0x77, \n\t0x00, 0x00, 0x04, 0xc5, 0x05, 0xb0, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x4d, \n\t0x00, 0xb0, 0x02, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, \n\t0xb1, 0x0b, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, \n\t0x1b, 0xb1, 0x09, 0x0a, 0x3e, 0x59, 0xb0, 0x0b, 0x10, 0xb1, 0x00, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x02, 0x10, \n\t0xb1, 0x0d, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x09, 0x10, 0xb1, 0x0e, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x11, 0x33, 0x32, 0x00, 0x15, \n\t0x14, 0x00, 0x23, 0x21, 0x11, 0x21, 0x01, 0x11, 0x33, 0x32, 0x36, 0x35, \n\t0x34, 0x26, 0x23, 0x04, 0x2c, 0xfd, 0x7c, 0xfa, 0xfb, 0x01, 0x28, 0xfe, \n\t0xd7, 0xfa, 0xfd, 0xd5, 0x03, 0xb5, 0xfd, 0x7c, 0xfa, 0x7b, 0x85, 0x85, \n\t0x7b, 0x04, 0xcf, 0xfe, 0xe1, 0xfe, 0xfa, 0xd0, 0xd2, 0xfe, 0xf8, 0x05, \n\t0xb0, 0xfd, 0x1f, 0xfe, 0x11, 0x92, 0x6a, 0x66, 0x8d, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x88, 0x00, 0x00, 0x04, 0xca, 0x05, 0xb0, 0x02, 0x06, \n\t0x00, 0x25, 0x00, 0x00, 0xff, 0xff, 0x00, 0x88, 0x00, 0x00, 0x04, 0x3d, \n\t0x05, 0xb0, 0x02, 0x06, 0x01, 0x6e, 0x00, 0x00, 0xff, 0xff, 0x00, 0x88, \n\t0x00, 0x00, 0x04, 0x6d, 0x05, 0xb0, 0x02, 0x06, 0x00, 0x28, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x57, 0xff, 0xeb, 0x04, 0xe2, 0x05, 0xc5, 0x00, 0x2a, \n\t0x00, 0x5e, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, \n\t0x0e, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, \n\t0xb1, 0x00, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1a, 0x2f, \n\t0x1b, 0xb1, 0x1a, 0x0a, 0x3e, 0x59, 0xb0, 0x0e, 0x10, 0xb1, 0x06, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, \n\t0xb1, 0x28, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb2, 0x14, 0x28, 0x00, 0x11, 0x12, 0x39, 0xb0, 0x1a, 0x10, 0xb1, 0x22, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x01, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x21, 0x27, \n\t0x26, 0x24, 0x33, 0x20, 0x04, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, \n\t0x14, 0x04, 0x21, 0x22, 0x24, 0x37, 0x37, 0x21, 0x14, 0x16, 0x33, 0x32, \n\t0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x02, 0x9b, 0x89, 0x84, 0x92, \n\t0x8b, 0x6d, 0x90, 0xfe, 0xe5, 0x01, 0x06, 0x01, 0x3a, 0xe5, 0x01, 0x0a, \n\t0x01, 0x36, 0x82, 0x72, 0x81, 0x8a, 0xfe, 0xb4, 0xfe, 0xf5, 0xe6, 0xfe, \n\t0xb2, 0x06, 0x01, 0x01, 0x1c, 0x99, 0x78, 0x8e, 0xa5, 0x93, 0x90, 0xc5, \n\t0x03, 0x54, 0x6c, 0x61, 0x54, 0x6f, 0x69, 0x52, 0x06, 0xb5, 0xe1, 0xd8, \n\t0xc8, 0x64, 0xa6, 0x2f, 0x2b, 0xac, 0x7d, 0xc9, 0xe4, 0xd6, 0xcd, 0x06, \n\t0x55, 0x74, 0x75, 0x5b, 0x73, 0x6b, 0xdb, 0x00, 0x00, 0x01, 0x00, 0x7e, \n\t0x00, 0x00, 0x05, 0x17, 0x05, 0xb0, 0x00, 0x0b, 0x00, 0x43, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x10, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x10, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x10, 0xb0, 0x05, 0xd0, 0xb0, 0x06, 0x10, \n\t0xb0, 0x0a, 0xd0, 0x30, 0x31, 0x01, 0x21, 0x11, 0x21, 0x11, 0x27, 0x01, \n\t0x21, 0x11, 0x21, 0x11, 0x17, 0x03, 0xf2, 0x01, 0x25, 0xfe, 0xdb, 0x06, \n\t0xfd, 0xb5, 0xfe, 0xdd, 0x01, 0x23, 0x06, 0x05, 0xb0, 0xfa, 0x50, 0x03, \n\t0xcb, 0x01, 0xfc, 0x34, 0x05, 0xb0, 0xfc, 0x36, 0x01, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x7e, 0x00, 0x00, 0x05, 0x17, 0x07, 0x68, 0x02, 0x26, \n\t0x01, 0xc0, 0x00, 0x00, 0x01, 0x07, 0x01, 0x54, 0x01, 0x07, 0x01, 0xb8, \n\t0x00, 0x09, 0x00, 0xb3, 0x10, 0x08, 0x08, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x88, 0x00, 0x00, 0x05, 0x39, 0x05, 0xb0, 0x02, 0x06, \n\t0x00, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2a, 0x00, 0x00, 0x05, 0x1f, \n\t0x05, 0xb0, 0x00, 0x0f, 0x00, 0x48, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0a, 0x3e, 0x59, 0xb0, 0x00, \n\t0x10, 0xb1, 0x03, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x08, 0x10, 0xb1, 0x0a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, \n\t0x10, 0x02, 0x21, 0x23, 0x35, 0x33, 0x32, 0x36, 0x11, 0x11, 0x05, 0x1f, \n\t0xfe, 0xdc, 0xfe, 0x62, 0xff, 0xfe, 0xf7, 0x2b, 0x28, 0x89, 0x5e, 0x05, \n\t0xb0, 0xfa, 0x50, 0x04, 0xcf, 0xfe, 0x4a, 0xfe, 0x5a, 0xfe, 0x8d, 0xe0, \n\t0xf4, 0x01, 0x45, 0x02, 0x97, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x88, \n\t0x00, 0x00, 0x06, 0x72, 0x05, 0xb0, 0x02, 0x06, 0x00, 0x30, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x88, 0x00, 0x00, 0x05, 0x21, 0x05, 0xb0, 0x02, 0x06, \n\t0x00, 0x2b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5c, 0xff, 0xeb, 0x05, 0x1b, \n\t0x05, 0xc5, 0x02, 0x06, 0x00, 0x32, 0x00, 0x00, 0xff, 0xff, 0x00, 0x88, \n\t0x00, 0x00, 0x05, 0x22, 0x05, 0xb0, 0x02, 0x06, 0x01, 0x7b, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x88, 0x00, 0x00, 0x04, 0xe7, 0x05, 0xb0, 0x02, 0x06, \n\t0x00, 0x33, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5d, 0xff, 0xeb, 0x04, 0xdb, \n\t0x05, 0xc5, 0x02, 0x06, 0x00, 0x26, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1c, \n\t0x00, 0x00, 0x04, 0x76, 0x05, 0xb0, 0x02, 0x06, 0x00, 0x37, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x1f, 0x00, 0x00, 0x05, 0x07, 0x05, 0xb0, 0x02, 0x06, \n\t0x00, 0x3b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x96, 0xfe, 0x99, 0x05, 0xe1, \n\t0x05, 0xb0, 0x00, 0x0b, 0x00, 0x3f, 0x00, 0xb0, 0x08, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x10, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x10, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0a, 0x3e, \n\t0x59, 0xb1, 0x02, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x06, 0xd0, 0xb0, 0x07, 0xd0, 0x30, 0x31, 0x13, 0x21, 0x11, \n\t0x21, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x21, 0x96, 0x01, 0x24, \n\t0x02, 0x52, 0x01, 0x24, 0xb1, 0xfe, 0xdc, 0xfb, 0xd9, 0x05, 0xb0, 0xfb, \n\t0x31, 0x04, 0xcf, 0xfb, 0x31, 0xfd, 0xb8, 0x01, 0x67, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x8b, 0x00, 0x00, 0x05, 0x08, 0x05, 0xb0, 0x00, 0x13, \n\t0x00, 0x3c, 0x00, 0xb0, 0x06, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, \n\t0x2f, 0x1b, 0xb1, 0x00, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x0a, 0x3e, 0x59, 0xb0, 0x06, 0x10, \n\t0xb1, 0x0f, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x01, 0x11, 0x21, 0x11, 0x06, 0x06, 0x23, 0x20, 0x24, 0x35, \n\t0x11, 0x21, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x11, 0x05, 0x08, \n\t0xfe, 0xdb, 0x42, 0xa4, 0x41, 0xfe, 0xf4, 0xfe, 0xdb, 0x01, 0x24, 0x7f, \n\t0x8e, 0x3e, 0xa7, 0x42, 0x05, 0xb0, 0xfa, 0x50, 0x02, 0x31, 0x10, 0x11, \n\t0xe8, 0xf3, 0x01, 0xc5, 0xfe, 0x3b, 0x8e, 0x6c, 0x11, 0x10, 0x02, 0x9e, \n\t0x00, 0x03, 0x00, 0x95, 0x00, 0x00, 0x06, 0x7d, 0x05, 0xb0, 0x00, 0x0a, \n\t0x00, 0x0e, 0x00, 0x17, 0x00, 0x58, 0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x10, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x10, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x0f, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x07, 0x10, 0xb1, 0x10, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x33, \n\t0x32, 0x00, 0x15, 0x14, 0x00, 0x23, 0x21, 0x11, 0x21, 0x01, 0x21, 0x11, \n\t0x21, 0x01, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x01, 0xb9, \n\t0xfa, 0xfb, 0x01, 0x28, 0xfe, 0xd7, 0xfa, 0xfd, 0xe2, 0x01, 0x24, 0x04, \n\t0xc4, 0xfe, 0xdc, 0x01, 0x24, 0xfb, 0x3c, 0xfa, 0x7b, 0x85, 0x85, 0x7b, \n\t0x03, 0xb0, 0xfe, 0xfa, 0xd0, 0xd2, 0xfe, 0xf8, 0x05, 0xb0, 0xfa, 0x50, \n\t0x05, 0xb0, 0xfd, 0x1f, 0xfe, 0x11, 0x92, 0x6a, 0x66, 0x8d, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x56, 0xff, 0xec, 0x04, 0xa7, 0x05, 0xc6, 0x00, 0x21, \n\t0x00, 0x54, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, \n\t0x04, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x19, 0x2f, 0x1b, \n\t0xb1, 0x19, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, \n\t0x1b, 0xb1, 0x0b, 0x0a, 0x3e, 0x59, 0xb1, 0x13, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x19, 0x10, 0xb1, 0x17, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, \n\t0xb1, 0x1e, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x13, 0x27, 0x26, 0x00, 0x21, 0x32, 0x00, 0x11, 0x11, 0x10, \n\t0x00, 0x23, 0x20, 0x00, 0x37, 0x37, 0x21, 0x14, 0x16, 0x33, 0x32, 0x36, \n\t0x35, 0x35, 0x21, 0x35, 0x21, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, \n\t0x5e, 0x02, 0x05, 0x01, 0x1d, 0x01, 0x01, 0xfd, 0x01, 0x35, 0xfe, 0xcb, \n\t0xfd, 0xfe, 0xfd, 0xfe, 0xe4, 0x05, 0x02, 0x01, 0x1b, 0x79, 0x84, 0x81, \n\t0x8c, 0xfe, 0x41, 0x01, 0xbf, 0x8c, 0x81, 0x83, 0x78, 0x03, 0xce, 0x06, \n\t0xe8, 0x01, 0x0a, 0xfe, 0xae, 0xfe, 0xf5, 0xfe, 0xdf, 0xfe, 0xf4, 0xfe, \n\t0xb0, 0x01, 0x01, 0xee, 0x06, 0x8e, 0x87, 0xd1, 0xa9, 0x2b, 0xe1, 0x17, \n\t0xa8, 0xd4, 0x89, 0x8e, 0x00, 0x02, 0x00, 0x9a, 0xff, 0xeb, 0x06, 0xfb, \n\t0x05, 0xc5, 0x00, 0x15, 0x00, 0x23, 0x00, 0x71, 0x00, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x16, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x10, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x10, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x0e, 0x10, 0xb1, 0x08, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x12, 0x10, 0xb1, 0x19, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, \n\t0x20, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, \n\t0x31, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x35, 0x23, 0x11, 0x21, \n\t0x11, 0x21, 0x11, 0x33, 0x35, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x25, \n\t0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, \n\t0x35, 0x06, 0xfb, 0xfe, 0xad, 0xfe, 0xf1, 0xfe, 0xf3, 0xfe, 0xb0, 0x7e, \n\t0xfe, 0xdc, 0x01, 0x24, 0x7e, 0x01, 0x4f, 0x01, 0x0d, 0x01, 0x0f, 0x01, \n\t0x54, 0xfe, 0xdc, 0xaa, 0x95, 0x95, 0xa4, 0xa6, 0x94, 0x96, 0xa8, 0x02, \n\t0x55, 0xfe, 0xf4, 0xfe, 0xa2, 0x01, 0x5e, 0x01, 0x0c, 0x07, 0xfd, 0xa4, \n\t0x05, 0xb0, 0xfd, 0x8d, 0x1e, 0x01, 0x0b, 0x01, 0x5f, 0xfe, 0xa1, 0xfe, \n\t0xf5, 0x02, 0xaa, 0xda, 0xd9, 0xab, 0xfe, 0xf8, 0xad, 0xda, 0xda, 0xad, \n\t0xff, 0xff, 0x00, 0x37, 0xff, 0xeb, 0x04, 0x0f, 0x04, 0x4e, 0x02, 0x06, \n\t0x00, 0x44, 0x00, 0x00, 0x00, 0x03, 0x00, 0x7f, 0x00, 0x00, 0x04, 0x44, \n\t0x04, 0x3a, 0x00, 0x0e, 0x00, 0x17, 0x00, 0x20, 0x00, 0x6a, 0x00, 0x7c, \n\t0xb0, 0x18, 0x2f, 0x18, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, \n\t0xb1, 0x01, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, \n\t0x1b, 0xb1, 0x00, 0x0a, 0x3e, 0x59, 0xb2, 0xe0, 0x18, 0x01, 0x5d, 0xb2, \n\t0x70, 0x18, 0x01, 0x71, 0xb2, 0x40, 0x18, 0x01, 0x5d, 0xb2, 0x10, 0x18, \n\t0x01, 0x5d, 0xb0, 0x18, 0x10, 0xb1, 0x0f, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x08, 0x0f, 0x18, 0x11, 0x12, 0x39, \n\t0xb0, 0x00, 0x10, 0xb1, 0x10, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x01, 0x10, 0xb1, 0x1f, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x33, 0x11, 0x21, 0x32, \n\t0x16, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, 0x14, 0x06, 0x23, 0x03, \n\t0x15, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x27, 0x33, 0x32, 0x36, \n\t0x35, 0x34, 0x26, 0x23, 0x23, 0x7f, 0x01, 0xc4, 0xd8, 0xf1, 0x65, 0x5d, \n\t0x7b, 0x7f, 0xe5, 0xd6, 0xe6, 0xe6, 0x4d, 0x4a, 0x47, 0x50, 0xe6, 0xa8, \n\t0x51, 0x4d, 0x52, 0x54, 0xa0, 0x04, 0x3a, 0x98, 0x96, 0x4c, 0x76, 0x1f, \n\t0x18, 0x85, 0x59, 0x99, 0x9c, 0x01, 0xc3, 0xe5, 0x39, 0x38, 0x38, 0x3c, \n\t0xbe, 0x34, 0x34, 0x3b, 0x37, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x6b, \n\t0x00, 0x00, 0x03, 0x4e, 0x04, 0x3a, 0x00, 0x05, 0x00, 0x2c, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0e, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x04, 0x10, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x11, 0x21, 0x11, 0x21, \n\t0x03, 0x4e, 0xfe, 0x41, 0xfe, 0xdc, 0x02, 0xe3, 0x03, 0x58, 0xfc, 0xa8, \n\t0x04, 0x3a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4d, 0xff, 0xeb, 0x04, 0x02, \n\t0x04, 0x4f, 0x02, 0x06, 0x00, 0x48, 0x00, 0x00, 0x00, 0x01, 0x00, 0x6b, \n\t0x00, 0x00, 0x04, 0x19, 0x04, 0x3a, 0x00, 0x0b, 0x00, 0x43, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0e, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0e, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x10, 0xb0, 0x05, 0xd0, 0xb0, 0x06, 0x10, \n\t0xb0, 0x0a, 0xd0, 0x30, 0x31, 0x01, 0x21, 0x11, 0x21, 0x11, 0x27, 0x01, \n\t0x21, 0x11, 0x21, 0x11, 0x17, 0x02, 0xf6, 0x01, 0x23, 0xfe, 0xdd, 0x06, \n\t0xfe, 0x9f, 0xfe, 0xdc, 0x01, 0x24, 0x06, 0x04, 0x3a, 0xfb, 0xc6, 0x02, \n\t0x94, 0x01, 0xfd, 0x6b, 0x04, 0x3a, 0xfd, 0x6e, 0x01, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x6b, 0x00, 0x00, 0x04, 0x19, 0x06, 0x11, 0x02, 0x26, \n\t0x01, 0xd5, 0x00, 0x00, 0x01, 0x06, 0x01, 0x54, 0x7e, 0x61, 0x00, 0x09, \n\t0x00, 0xb3, 0x10, 0x09, 0x08, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x81, 0x00, 0x00, 0x04, 0x85, 0x04, 0x3a, 0x00, 0x0c, \n\t0x00, 0x5a, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, \n\t0x06, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, \n\t0xb1, 0x04, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, \n\t0x1b, 0xb1, 0x08, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, \n\t0x2f, 0x1b, 0xb1, 0x02, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0a, 0x3e, 0x59, 0xb0, 0x06, 0x10, 0xb1, \n\t0x01, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, \n\t0x0a, 0x01, 0x06, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x23, 0x11, 0x21, \n\t0x11, 0x21, 0x11, 0x33, 0x13, 0x21, 0x01, 0x01, 0x21, 0x02, 0x15, 0x70, \n\t0xfe, 0xdc, 0x01, 0x24, 0x66, 0xe9, 0x01, 0x71, 0xfe, 0x9f, 0x01, 0x81, \n\t0xfe, 0x7b, 0x01, 0x95, 0xfe, 0x6b, 0x04, 0x3a, 0xfe, 0x64, 0x01, 0x9c, \n\t0xfe, 0x02, 0xfd, 0xc4, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x04, 0x19, \n\t0x04, 0x3a, 0x00, 0x0f, 0x00, 0x48, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0a, 0x3e, 0x59, 0xb0, 0x00, \n\t0x10, 0xb1, 0x03, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x08, 0x10, 0xb1, 0x0b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x11, 0x21, 0x11, 0x21, 0x15, \n\t0x10, 0x02, 0x23, 0x23, 0x27, 0x37, 0x32, 0x36, 0x35, 0x11, 0x04, 0x19, \n\t0xfe, 0xdd, 0xfe, 0xfc, 0xc4, 0xed, 0x2f, 0x03, 0x1f, 0x64, 0x3c, 0x04, \n\t0x3a, 0xfb, 0xc6, 0x03, 0x58, 0xeb, 0xfe, 0xc0, 0xfe, 0xd3, 0xe6, 0x01, \n\t0xa4, 0xe2, 0x01, 0xcd, 0x00, 0x01, 0x00, 0x81, 0x00, 0x00, 0x05, 0x88, \n\t0x04, 0x3a, 0x00, 0x0f, 0x00, 0x53, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0a, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0a, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x08, 0x10, 0xb0, 0x00, 0xd0, 0xb0, 0x0e, 0x10, 0xb0, 0x0a, 0xd0, \n\t0xb0, 0x07, 0xd0, 0x30, 0x31, 0x01, 0x33, 0x01, 0x21, 0x11, 0x21, 0x11, \n\t0x27, 0x03, 0x23, 0x03, 0x07, 0x11, 0x21, 0x11, 0x21, 0x02, 0xfe, 0x06, \n\t0x01, 0x17, 0x01, 0x6d, 0xfe, 0xdd, 0x06, 0xfb, 0xc4, 0xf5, 0x06, 0xfe, \n\t0xdc, 0x01, 0x6a, 0x01, 0x54, 0x02, 0xe6, 0xfb, 0xc6, 0x02, 0x86, 0x01, \n\t0xfd, 0x79, 0x02, 0x79, 0x01, 0xfd, 0x88, 0x04, 0x3a, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x6b, 0x00, 0x00, 0x04, 0x17, 0x04, 0x3a, 0x00, 0x0b, \n\t0x00, 0x5f, 0x00, 0x7c, 0xb0, 0x09, 0x2f, 0x18, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0e, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0a, 0x3e, 0x59, \n\t0xb2, 0xe0, 0x09, 0x01, 0x5d, 0xb2, 0x70, 0x09, 0x01, 0x71, 0xb2, 0x40, \n\t0x09, 0x01, 0x5d, 0xb2, 0x10, 0x09, 0x01, 0x5d, 0xb0, 0x09, 0x10, 0xb1, \n\t0x02, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, \n\t0x31, 0x21, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, \n\t0x21, 0x04, 0x17, 0xfe, 0xdc, 0xfe, 0x9c, 0xfe, 0xdc, 0x01, 0x24, 0x01, \n\t0x64, 0x01, 0x24, 0x01, 0xa4, 0xfe, 0x5c, 0x04, 0x3a, 0xfe, 0x4a, 0x01, \n\t0xb6, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x43, 0xff, 0xeb, 0x04, 0x40, \n\t0x04, 0x4e, 0x02, 0x06, 0x00, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0x6b, \n\t0x00, 0x00, 0x04, 0x19, 0x04, 0x3a, 0x00, 0x07, 0x00, 0x39, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0e, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x06, 0x10, 0xb1, 0x02, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x21, 0x21, 0x11, 0x21, 0x11, \n\t0x21, 0x11, 0x21, 0x04, 0x19, 0xfe, 0xdc, 0xfe, 0x9a, 0xfe, 0xdc, 0x03, \n\t0xae, 0x03, 0x58, 0xfc, 0xa8, 0x04, 0x3a, 0x00, 0xff, 0xff, 0x00, 0x70, \n\t0xfe, 0x60, 0x04, 0x40, 0x04, 0x4e, 0x02, 0x06, 0x00, 0x53, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x3e, 0xff, 0xeb, 0x03, 0xf2, 0x04, 0x4e, 0x00, 0x1d, \n\t0x00, 0x38, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, \n\t0x0f, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, \n\t0xb1, 0x08, 0x0a, 0x3e, 0x59, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0f, 0x10, 0xb1, 0x17, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x25, 0x32, \n\t0x36, 0x35, 0x21, 0x17, 0x16, 0x06, 0x23, 0x22, 0x00, 0x35, 0x35, 0x34, \n\t0x00, 0x33, 0x32, 0x16, 0x07, 0x07, 0x21, 0x34, 0x26, 0x23, 0x22, 0x06, \n\t0x15, 0x15, 0x14, 0x16, 0x02, 0x36, 0x4e, 0x5e, 0x01, 0x09, 0x03, 0x04, \n\t0xff, 0xbd, 0xf2, 0xfe, 0xfa, 0x01, 0x05, 0xf2, 0xc8, 0xf5, 0x04, 0x02, \n\t0xfe, 0xf6, 0x5c, 0x51, 0x74, 0x5f, 0x5f, 0xcb, 0x5b, 0x4c, 0x06, 0xa4, \n\t0xdd, 0x01, 0x32, 0xf0, 0x1e, 0xef, 0x01, 0x34, 0xe4, 0xba, 0x06, 0x54, \n\t0x6f, 0xb4, 0x8e, 0x1e, 0x91, 0xb1, 0x00, 0x00, 0x00, 0x01, 0x00, 0x30, \n\t0x00, 0x00, 0x04, 0x04, 0x04, 0x3a, 0x00, 0x07, 0x00, 0x32, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0e, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x06, 0x10, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0xd0, 0xb0, 0x05, 0xd0, 0x30, 0x31, \n\t0x01, 0x21, 0x11, 0x21, 0x11, 0x21, 0x35, 0x21, 0x04, 0x04, 0xfe, 0xa6, \n\t0xfe, 0xdb, 0xfe, 0xab, 0x03, 0xd4, 0x03, 0x5b, 0xfc, 0xa5, 0x03, 0x5b, \n\t0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x05, 0xfe, 0x4b, 0x04, 0x11, \n\t0x04, 0x3a, 0x02, 0x06, 0x00, 0x5c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x13, \n\t0x00, 0x00, 0x04, 0x08, 0x04, 0x3a, 0x02, 0x06, 0x00, 0x5b, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x6b, 0xfe, 0x9a, 0x04, 0xb5, 0x04, 0x3a, 0x00, 0x0b, \n\t0x00, 0x3f, 0x00, 0xb0, 0x08, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, \n\t0x2f, 0x1b, 0xb1, 0x00, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0a, 0x3e, 0x59, 0xb1, 0x02, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x06, 0xd0, \n\t0xb0, 0x07, 0xd0, 0x30, 0x31, 0x13, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, \n\t0x33, 0x11, 0x21, 0x11, 0x21, 0x6b, 0x01, 0x24, 0x01, 0x66, 0x01, 0x24, \n\t0x9c, 0xfe, 0xdd, 0xfc, 0xd9, 0x04, 0x3a, 0xfc, 0xa6, 0x03, 0x5a, 0xfc, \n\t0xa6, 0xfd, 0xba, 0x01, 0x66, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x67, \n\t0x00, 0x00, 0x04, 0x11, 0x04, 0x3a, 0x00, 0x13, 0x00, 0x41, 0x00, 0xb0, \n\t0x0e, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, \n\t0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, \n\t0x12, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, \n\t0xb1, 0x00, 0x0a, 0x3e, 0x59, 0xb2, 0x7f, 0x0e, 0x01, 0x5d, 0xb0, 0x0e, \n\t0x10, 0xb1, 0x05, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0x30, 0x31, 0x21, 0x21, 0x11, 0x06, 0x06, 0x23, 0x22, 0x24, 0x35, \n\t0x11, 0x21, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x11, 0x21, 0x04, \n\t0x11, 0xfe, 0xdc, 0x25, 0x4d, 0x22, 0xef, 0xfe, 0xfd, 0x01, 0x24, 0x5e, \n\t0x70, 0x25, 0x49, 0x26, 0x01, 0x24, 0x01, 0x57, 0x08, 0x07, 0xcc, 0xd2, \n\t0x01, 0x54, 0xfe, 0xac, 0x6b, 0x52, 0x08, 0x08, 0x02, 0x01, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x6b, 0x00, 0x00, 0x06, 0x24, 0x04, 0x3a, 0x00, 0x0b, \n\t0x00, 0x49, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, \n\t0x00, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, \n\t0xb1, 0x03, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, \n\t0x1b, 0xb1, 0x07, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, \n\t0x2f, 0x1b, 0xb1, 0x09, 0x0a, 0x3e, 0x59, 0xb1, 0x01, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x05, 0xd0, 0xb0, 0x06, \n\t0xd0, 0x30, 0x31, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, \n\t0x11, 0x21, 0x11, 0x01, 0x8f, 0x01, 0x26, 0x01, 0x25, 0x01, 0x26, 0x01, \n\t0x24, 0xfa, 0x47, 0x04, 0x3a, 0xfc, 0xa6, 0x03, 0x5a, 0xfc, 0xa6, 0x03, \n\t0x5a, 0xfb, 0xc6, 0x04, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x6b, \n\t0xfe, 0x98, 0x07, 0x03, 0x04, 0x3a, 0x00, 0x0f, 0x00, 0x58, 0x00, 0xb0, \n\t0x0b, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, \n\t0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, \n\t0x03, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, \n\t0xb1, 0x07, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, \n\t0x1b, 0xb1, 0x0d, 0x0a, 0x3e, 0x59, 0xb1, 0x01, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x05, 0xd0, 0xb0, 0x06, 0xd0, \n\t0xb0, 0x09, 0xd0, 0xb0, 0x09, 0x2f, 0xb0, 0x0a, 0xd0, 0xb0, 0x0a, 0x2f, \n\t0x30, 0x31, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, \n\t0x33, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0x8f, 0x01, 0x26, 0x01, 0x25, \n\t0x01, 0x26, 0x01, 0x24, 0xdf, 0xfe, 0xdc, 0xfa, 0x8c, 0x04, 0x3a, 0xfc, \n\t0xa6, 0x03, 0x5a, 0xfc, 0xa6, 0x03, 0x5a, 0xfc, 0xab, 0xfd, 0xb3, 0x01, \n\t0x68, 0x04, 0x3a, 0x00, 0x00, 0x03, 0x00, 0x95, 0x00, 0x00, 0x05, 0xe3, \n\t0x04, 0x3a, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x17, 0x00, 0x58, 0x00, 0xb0, \n\t0x00, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, \n\t0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, \n\t0x0d, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, \n\t0xb1, 0x07, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, \n\t0x1b, 0xb1, 0x0b, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x0f, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x07, 0x10, \n\t0xb1, 0x10, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x21, 0x11, \n\t0x21, 0x01, 0x21, 0x11, 0x21, 0x01, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, \n\t0x26, 0x23, 0x01, 0xba, 0xcb, 0xda, 0xfa, 0xfa, 0xda, 0xfe, 0x10, 0x01, \n\t0x25, 0x04, 0x29, 0xfe, 0xdc, 0x01, 0x24, 0xfb, 0xd7, 0xcb, 0x59, 0x58, \n\t0x58, 0x59, 0x02, 0xdc, 0xc9, 0xa3, 0xa5, 0xcb, 0x04, 0x3a, 0xfb, 0xc6, \n\t0x04, 0x3a, 0xfd, 0xc2, 0xfe, 0xe3, 0x50, 0x3f, 0x3d, 0x51, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x81, 0x00, 0x00, 0x04, 0x45, 0x04, 0x3a, 0x00, 0x0a, \n\t0x00, 0x13, 0x00, 0x3e, 0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x0a, 0x3e, 0x59, 0xb0, 0x00, \n\t0x10, 0xb1, 0x0b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x07, 0x10, 0xb1, 0x0c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, \n\t0x06, 0x23, 0x21, 0x11, 0x21, 0x11, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, \n\t0x26, 0x23, 0x01, 0xa6, 0xcb, 0xda, 0xfa, 0xfa, 0xda, 0xfe, 0x10, 0x01, \n\t0x25, 0xcb, 0x59, 0x58, 0x58, 0x59, 0x02, 0xdc, 0xc9, 0xa3, 0xa5, 0xcb, \n\t0x04, 0x3a, 0xfd, 0xc2, 0xfe, 0xe3, 0x50, 0x3f, 0x3d, 0x51, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x3f, 0xff, 0xeb, 0x03, 0xee, 0x04, 0x4e, 0x00, 0x21, \n\t0x00, 0x68, 0x00, 0x7c, 0xb0, 0x1d, 0x2f, 0x18, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x0a, 0x3e, 0x59, 0xb0, 0x08, \n\t0x10, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x0f, 0x10, 0xb1, 0x17, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x10, 0x1d, 0x01, 0x5d, 0xb2, 0x4f, 0x1d, \n\t0x01, 0x71, 0xb2, 0x7f, 0x1d, 0x01, 0x5d, 0xb2, 0x40, 0x1d, 0x01, 0x5d, \n\t0xb2, 0xe0, 0x1d, 0x01, 0x5d, 0xb0, 0x1d, 0x10, 0xb1, 0x1c, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x22, \n\t0x06, 0x15, 0x21, 0x27, 0x26, 0x36, 0x33, 0x32, 0x00, 0x15, 0x15, 0x14, \n\t0x00, 0x23, 0x22, 0x26, 0x37, 0x37, 0x21, 0x14, 0x16, 0x33, 0x32, 0x36, \n\t0x37, 0x27, 0x21, 0x35, 0x21, 0x37, 0x26, 0x26, 0x01, 0xf9, 0x4d, 0x5c, \n\t0xfe, 0xf6, 0x02, 0x05, 0xfe, 0xbc, 0xed, 0x01, 0x08, 0xfe, 0xf8, 0xec, \n\t0xc7, 0xf4, 0x05, 0x02, 0x01, 0x0a, 0x5a, 0x50, 0x60, 0x61, 0x08, 0x03, \n\t0xfe, 0xe7, 0x01, 0x18, 0x02, 0x08, 0x61, 0x03, 0x6d, 0x5c, 0x4a, 0x06, \n\t0xa3, 0xde, 0xfe, 0xcb, 0xee, 0x1e, 0xee, 0xfe, 0xcc, 0xe3, 0xbb, 0x06, \n\t0x55, 0x6f, 0x8b, 0x6f, 0x05, 0xaf, 0x05, 0x6a, 0x85, 0x00, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x85, 0xff, 0xeb, 0x06, 0x3a, 0x04, 0x4e, 0x00, 0x13, \n\t0x00, 0x21, 0x00, 0x71, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, \n\t0x1b, 0xb1, 0x04, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, \n\t0x2f, 0x1b, 0xb1, 0x00, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x0a, 0x3e, 0x59, 0xb0, 0x00, \n\t0x10, 0xb1, 0x0e, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x0b, 0x10, 0xb1, 0x17, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x1e, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x33, 0x36, \n\t0x24, 0x33, 0x32, 0x00, 0x15, 0x15, 0x14, 0x00, 0x23, 0x22, 0x24, 0x27, \n\t0x23, 0x11, 0x21, 0x11, 0x21, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, \n\t0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x01, 0xa9, 0x9c, 0x1e, 0x01, \n\t0x06, 0xd1, 0xf0, 0x01, 0x10, 0xfe, 0xf1, 0xef, 0xd8, 0xfe, 0xf7, 0x19, \n\t0x99, 0xfe, 0xdc, 0x01, 0x24, 0x01, 0xb7, 0x68, 0x74, 0x71, 0x69, 0x6a, \n\t0x72, 0x71, 0x69, 0x02, 0x97, 0xc6, 0xf1, 0xfe, 0xcc, 0xf3, 0x15, 0xf4, \n\t0xfe, 0xcd, 0xfb, 0xd0, 0xfe, 0x4a, 0x04, 0x3a, 0xfd, 0xd8, 0x94, 0xb3, \n\t0xb4, 0x93, 0x15, 0x90, 0xb6, 0xb7, 0x8f, 0x00, 0x00, 0x02, 0x00, 0x33, \n\t0x00, 0x00, 0x04, 0x00, 0x04, 0x3a, 0x00, 0x0d, 0x00, 0x16, 0x00, 0x52, \n\t0x00, 0xb0, 0x03, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, \n\t0xb1, 0x00, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, \n\t0x1b, 0xb1, 0x01, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, \n\t0x2f, 0x1b, 0xb1, 0x05, 0x0a, 0x3e, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x12, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x07, \n\t0x03, 0x12, 0x11, 0x12, 0x39, 0xb0, 0x00, 0x10, 0xb1, 0x13, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x11, \n\t0x21, 0x11, 0x23, 0x03, 0x21, 0x13, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, \n\t0x03, 0x14, 0x16, 0x33, 0x33, 0x11, 0x23, 0x22, 0x06, 0x04, 0x00, 0xfe, \n\t0xde, 0xb0, 0xd4, 0xfe, 0xd9, 0xef, 0x63, 0x6b, 0xfb, 0xd5, 0xac, 0x57, \n\t0x50, 0xbf, 0xba, 0x52, 0x5a, 0x04, 0x3a, 0xfb, 0xc6, 0x01, 0x7b, 0xfe, \n\t0x85, 0x01, 0xab, 0x2c, 0x9a, 0x62, 0x9e, 0xc9, 0xfe, 0x91, 0x38, 0x53, \n\t0x01, 0x1b, 0x58, 0x00, 0xff, 0xff, 0x00, 0x4d, 0xff, 0xeb, 0x04, 0x02, \n\t0x05, 0xe1, 0x02, 0x26, 0x00, 0x48, 0x00, 0x00, 0x01, 0x06, 0x00, 0x43, \n\t0x6d, 0x1b, 0x00, 0x09, 0x00, 0xb3, 0x21, 0x08, 0x07, 0x04, 0x2b, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4d, 0xff, 0xeb, 0x04, 0x02, \n\t0x05, 0xcc, 0x02, 0x26, 0x00, 0x48, 0x00, 0x00, 0x01, 0x06, 0x00, 0x6a, \n\t0x07, 0x1c, 0x00, 0x0f, 0x00, 0xb3, 0x24, 0x09, 0x07, 0x04, 0x2b, 0xb0, \n\t0x24, 0x10, 0xb0, 0x21, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x01, 0xff, 0xf1, \n\t0xfe, 0x4b, 0x04, 0x19, 0x06, 0x18, 0x00, 0x29, 0x00, 0x89, 0x00, 0xb0, \n\t0x29, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x26, 0x2f, 0x1b, 0xb1, 0x26, \n\t0x1a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, \n\t0x05, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, \n\t0xb1, 0x0e, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x21, 0x2f, \n\t0x1b, 0xb1, 0x21, 0x0a, 0x3e, 0x59, 0xb2, 0x9f, 0x29, 0x01, 0x5d, 0xb2, \n\t0x2f, 0x29, 0x01, 0x71, 0xb2, 0x7f, 0x29, 0x01, 0x5d, 0xb4, 0x2f, 0x29, \n\t0x3f, 0x29, 0x02, 0x5d, 0xb0, 0x29, 0x10, 0xb1, 0x00, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0e, 0x10, 0xb1, 0x15, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x05, \n\t0x10, 0xb1, 0x1c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x00, 0x10, 0xb0, 0x22, 0xd0, 0xb0, 0x29, 0x10, 0xb0, 0x24, \n\t0xd0, 0x30, 0x31, 0x01, 0x21, 0x11, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, \n\t0x15, 0x33, 0x11, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, \n\t0x33, 0x32, 0x36, 0x35, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, \n\t0x21, 0x11, 0x23, 0x35, 0x33, 0x35, 0x21, 0x15, 0x21, 0x02, 0x90, 0xfe, \n\t0xfd, 0x33, 0x94, 0x5a, 0xa9, 0xc1, 0x01, 0xca, 0xb4, 0x28, 0x44, 0x24, \n\t0x0e, 0x16, 0x32, 0x1b, 0x39, 0x3f, 0x59, 0x58, 0x3c, 0x5c, 0x1e, 0xfe, \n\t0xdc, 0x78, 0x78, 0x01, 0x24, 0x01, 0x03, 0x04, 0xb8, 0xfe, 0xf9, 0x4a, \n\t0x53, 0xe1, 0xeb, 0xac, 0xfe, 0x01, 0xbe, 0xce, 0x08, 0x09, 0xdc, 0x06, \n\t0x06, 0x59, 0x52, 0x02, 0xad, 0x7e, 0x69, 0x2b, 0x27, 0xfc, 0xe7, 0x04, \n\t0xb8, 0xb5, 0xab, 0xab, 0xff, 0xff, 0x00, 0x6b, 0x00, 0x00, 0x03, 0x4e, \n\t0x05, 0xcb, 0x02, 0x26, 0x01, 0xd3, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, \n\t0x00, 0xa6, 0x00, 0x05, 0x00, 0x09, 0x00, 0xb3, 0x0a, 0x08, 0x04, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0x00, 0x01, 0x00, 0x48, 0xff, 0xeb, 0x03, 0xfc, \n\t0x04, 0x4e, 0x00, 0x21, 0x00, 0x65, 0x00, 0x7c, 0xb0, 0x1c, 0x2f, 0x18, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x0e, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0a, \n\t0x3e, 0x59, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x0f, 0x10, 0xb1, 0x17, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x7f, 0x1c, 0x01, 0x5d, 0xb2, 0x8f, \n\t0x1c, 0x01, 0x71, 0xb2, 0x1f, 0x1c, 0x01, 0x71, 0xb2, 0x4f, 0x1c, 0x01, \n\t0x71, 0xb2, 0x10, 0x1c, 0x01, 0x5d, 0xb0, 0x1c, 0x10, 0xb1, 0x1d, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x25, \n\t0x32, 0x36, 0x35, 0x21, 0x17, 0x16, 0x06, 0x23, 0x22, 0x00, 0x35, 0x35, \n\t0x34, 0x00, 0x33, 0x32, 0x16, 0x07, 0x07, 0x21, 0x34, 0x26, 0x23, 0x22, \n\t0x06, 0x07, 0x17, 0x21, 0x15, 0x21, 0x07, 0x16, 0x16, 0x02, 0x40, 0x4e, \n\t0x5e, 0x01, 0x09, 0x03, 0x04, 0xff, 0xbd, 0xf2, 0xfe, 0xfa, 0x01, 0x05, \n\t0xf2, 0xc8, 0xf5, 0x04, 0x02, 0xfe, 0xf6, 0x5c, 0x51, 0x66, 0x62, 0x05, \n\t0x03, 0x01, 0x1f, 0xfe, 0xe3, 0x02, 0x07, 0x60, 0xcb, 0x5b, 0x4c, 0x06, \n\t0xa4, 0xdd, 0x01, 0x32, 0xf0, 0x1e, 0xef, 0x01, 0x34, 0xe4, 0xba, 0x06, \n\t0x54, 0x6f, 0x8e, 0x71, 0x05, 0xaf, 0x05, 0x6a, 0x80, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x3a, 0xff, 0xeb, 0x03, 0xd4, 0x04, 0x4e, 0x02, 0x06, \n\t0x00, 0x56, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7f, 0x00, 0x00, 0x01, 0xa3, \n\t0x06, 0x18, 0x02, 0x06, 0x00, 0x4c, 0x00, 0x00, 0xff, 0xff, 0xff, 0x9b, \n\t0x00, 0x00, 0x02, 0x99, 0x05, 0xb6, 0x02, 0x26, 0x00, 0xf3, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x6a, 0xfe, 0xff, 0x00, 0x06, 0x00, 0x0f, 0x00, 0xb3, \n\t0x08, 0x03, 0x02, 0x04, 0x2b, 0xb0, 0x08, 0x10, 0xb0, 0x05, 0xd0, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x9e, 0xfe, 0x4b, 0x01, 0xab, \n\t0x06, 0x18, 0x02, 0x06, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x19, \n\t0x00, 0x00, 0x06, 0xba, 0x04, 0x3a, 0x00, 0x16, 0x00, 0x1f, 0x00, 0x69, \n\t0x00, 0xb0, 0x01, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, \n\t0xb1, 0x00, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, \n\t0x1b, 0xb1, 0x10, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, \n\t0x2f, 0x1b, 0xb1, 0x09, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x0a, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x10, \n\t0x10, 0xb1, 0x11, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x01, 0x10, 0xb1, 0x17, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x09, 0x10, 0xb1, 0x18, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x11, 0x33, \n\t0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x21, 0x11, 0x23, 0x15, 0x10, 0x02, \n\t0x23, 0x23, 0x27, 0x33, 0x32, 0x36, 0x35, 0x11, 0x01, 0x11, 0x33, 0x32, \n\t0x36, 0x35, 0x34, 0x26, 0x23, 0x04, 0x1a, 0xcb, 0xda, 0xfb, 0xfb, 0xda, \n\t0xfe, 0x11, 0xe8, 0xd4, 0xef, 0x2f, 0x03, 0x1f, 0x5a, 0x58, 0x03, 0x30, \n\t0xcb, 0x5a, 0x58, 0x58, 0x5a, 0x04, 0x3a, 0xfe, 0xa3, 0xca, 0xa3, 0xa5, \n\t0xcb, 0x03, 0x58, 0xeb, 0xfe, 0xc4, 0xfe, 0xcf, 0xe3, 0xc0, 0xca, 0x01, \n\t0xcd, 0xfd, 0xc2, 0xfe, 0xe2, 0x54, 0x40, 0x3c, 0x4e, 0x00, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x6b, 0x00, 0x00, 0x06, 0xb6, 0x04, 0x3a, 0x00, 0x12, \n\t0x00, 0x1b, 0x00, 0x66, 0x00, 0xb0, 0x04, 0x2f, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x0e, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x0a, 0x3e, 0x59, 0xb0, \n\t0x12, 0x10, 0xb0, 0x02, 0xd0, 0xb0, 0x0f, 0x10, 0xb0, 0x0c, 0xd0, 0xb0, \n\t0x01, 0x10, 0xb1, 0x0d, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x13, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0c, 0x10, 0xb1, 0x14, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, \n\t0x11, 0x21, 0x11, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x21, 0x11, \n\t0x21, 0x11, 0x21, 0x11, 0x21, 0x01, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, \n\t0x26, 0x23, 0x01, 0x8f, 0x01, 0x64, 0x01, 0x24, 0xcb, 0xda, 0xfa, 0xfa, \n\t0xda, 0xfe, 0x11, 0xfe, 0x9c, 0xfe, 0xdc, 0x01, 0x24, 0x02, 0x88, 0xcb, \n\t0x59, 0x58, 0x58, 0x59, 0x02, 0x99, 0x01, 0xa1, 0xfe, 0xa2, 0xc9, 0xa3, \n\t0xa5, 0xcb, 0x01, 0xb9, 0xfe, 0x47, 0x04, 0x3a, 0xfd, 0xc2, 0xfe, 0xe2, \n\t0x54, 0x40, 0x3c, 0x4e, 0x00, 0x01, 0x00, 0x1d, 0x00, 0x00, 0x04, 0x18, \n\t0x06, 0x18, 0x00, 0x1b, 0x00, 0x7a, 0x00, 0xb0, 0x1b, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x18, 0x2f, 0x1b, 0xb1, 0x18, 0x1a, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x0e, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x0a, \n\t0x3e, 0x59, 0xb2, 0x9f, 0x1b, 0x01, 0x5d, 0xb2, 0x2f, 0x1b, 0x01, 0x71, \n\t0xb2, 0x7f, 0x1b, 0x01, 0x5d, 0xb4, 0x2f, 0x1b, 0x3f, 0x1b, 0x02, 0x5d, \n\t0xb0, 0x1b, 0x10, 0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x05, 0x10, 0xb1, 0x0e, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb0, 0x14, 0xd0, \n\t0xb0, 0x1b, 0x10, 0xb0, 0x16, 0xd0, 0x30, 0x31, 0x01, 0x21, 0x11, 0x36, \n\t0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x21, 0x11, 0x34, 0x26, 0x23, 0x22, \n\t0x06, 0x07, 0x11, 0x21, 0x11, 0x23, 0x35, 0x33, 0x35, 0x21, 0x15, 0x21, \n\t0x02, 0xbc, 0xfe, 0xd1, 0x33, 0x94, 0x5a, 0xa9, 0xc1, 0xfe, 0xdc, 0x59, \n\t0x58, 0x3c, 0x5c, 0x1e, 0xfe, 0xdc, 0x4c, 0x4c, 0x01, 0x24, 0x01, 0x2f, \n\t0x04, 0xbb, 0xfe, 0xf6, 0x4a, 0x53, 0xe1, 0xeb, 0xfd, 0x7e, 0x02, 0x84, \n\t0x7e, 0x69, 0x2b, 0x27, 0xfc, 0xe7, 0x04, 0xbb, 0xb5, 0xa8, 0xa8, 0x00, \n\t0xff, 0xff, 0x00, 0x81, 0x00, 0x00, 0x04, 0x85, 0x05, 0xca, 0x02, 0x26, \n\t0x01, 0xd7, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, 0x01, 0x3a, 0x00, 0x04, \n\t0x00, 0x09, 0x00, 0xb3, 0x11, 0x08, 0x04, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x6b, 0x00, 0x00, 0x04, 0x19, 0x05, 0xcb, 0x02, 0x26, \n\t0x01, 0xd5, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, 0x00, 0x8d, 0x00, 0x05, \n\t0x00, 0x09, 0x00, 0xb3, 0x0d, 0x08, 0x08, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x05, 0xfe, 0x4b, 0x04, 0x11, 0x06, 0x11, 0x02, 0x26, \n\t0x00, 0x5c, 0x00, 0x00, 0x01, 0x06, 0x01, 0x54, 0x47, 0x61, 0x00, 0x09, \n\t0x00, 0xb3, 0x1a, 0x09, 0x14, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x6b, 0xfe, 0x9a, 0x04, 0x19, 0x04, 0x3a, 0x00, 0x0b, \n\t0x00, 0x49, 0x00, 0xb0, 0x07, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, \n\t0x2f, 0x1b, 0xb1, 0x00, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0a, 0x3e, 0x59, 0xb1, 0x01, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x02, \n\t0xd0, 0x30, 0x31, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, \n\t0x11, 0x21, 0x11, 0x01, 0x8f, 0x01, 0x66, 0x01, 0x24, 0xfe, 0xbb, 0xfe, \n\t0xdd, 0xfe, 0xba, 0x04, 0x3a, 0xfc, 0xa6, 0x03, 0x5a, 0xfb, 0xc6, 0xfe, \n\t0x9a, 0x01, 0x66, 0x04, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe6, \n\t0x00, 0x00, 0x04, 0xc5, 0x05, 0xb0, 0x00, 0x12, 0x00, 0x1b, 0x00, 0x63, \n\t0x00, 0xb0, 0x02, 0x2f, 0xb0, 0x12, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0a, 0x3e, 0x59, 0xb2, 0x3f, 0x12, \n\t0x01, 0x5d, 0xb2, 0x1f, 0x12, 0x01, 0x5d, 0xb0, 0x12, 0x10, 0xb1, 0x00, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0b, \n\t0xd0, 0xb0, 0x12, 0x10, 0xb0, 0x0d, 0xd0, 0xb0, 0x02, 0x10, 0xb1, 0x13, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x09, \n\t0x10, 0xb1, 0x14, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0x30, 0x31, 0x01, 0x23, 0x15, 0x33, 0x32, 0x00, 0x15, 0x14, 0x00, \n\t0x23, 0x21, 0x11, 0x23, 0x35, 0x33, 0x35, 0x21, 0x15, 0x33, 0x03, 0x11, \n\t0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x02, 0x85, 0xdd, 0xfa, 0xfb, \n\t0x01, 0x28, 0xfe, 0xd7, 0xfa, 0xfd, 0xe2, 0x9e, 0x9e, 0x01, 0x24, 0xdd, \n\t0xdd, 0xfa, 0x7b, 0x85, 0x85, 0x7b, 0x04, 0x42, 0x92, 0xfe, 0xfa, 0xd0, \n\t0xd2, 0xfe, 0xf8, 0x04, 0x42, 0xb5, 0xb9, 0xb9, 0xfd, 0xd8, 0xfe, 0x11, \n\t0x92, 0x6a, 0x66, 0x8d, 0x00, 0x02, 0x00, 0x12, 0x00, 0x00, 0x05, 0x3f, \n\t0x05, 0xb0, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x55, 0x00, 0xb0, 0x01, 0x2f, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x10, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, \n\t0x0a, 0x0a, 0x3e, 0x59, 0xb0, 0x01, 0x10, 0xb0, 0x04, 0xd0, 0xb0, 0x01, \n\t0x10, 0xb1, 0x0d, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x08, 0x10, 0xb0, 0x0e, 0xd0, 0x30, 0x31, 0x01, 0x23, 0x11, \n\t0x23, 0x11, 0x23, 0x03, 0x21, 0x01, 0x21, 0x01, 0x21, 0x01, 0x21, 0x03, \n\t0x23, 0x03, 0x8c, 0x6f, 0xf5, 0x64, 0x81, 0xfe, 0xcf, 0x02, 0x02, 0x01, \n\t0x2c, 0x01, 0xff, 0xfe, 0xce, 0xfd, 0xf9, 0x01, 0x44, 0x9f, 0x06, 0x01, \n\t0x86, 0xfe, 0x7a, 0x01, 0x86, 0xfe, 0x7a, 0x05, 0xb0, 0xfa, 0x50, 0x02, \n\t0x4f, 0x01, 0xe0, 0x00, 0x00, 0x02, 0x00, 0x07, 0x00, 0x00, 0x04, 0x64, \n\t0x04, 0x3a, 0x00, 0x0b, 0x00, 0x11, 0x00, 0x44, 0x00, 0xb0, 0x00, 0x2f, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0e, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x03, 0xd0, 0xb0, 0x00, 0x10, 0xb0, 0x04, 0xd0, 0xb0, \n\t0x03, 0x10, 0xb0, 0x0b, 0xd0, 0xb0, 0x04, 0x10, 0xb1, 0x0c, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x08, 0x10, 0xb0, \n\t0x0f, 0xd0, 0x30, 0x31, 0x01, 0x23, 0x11, 0x23, 0x11, 0x23, 0x03, 0x21, \n\t0x01, 0x21, 0x01, 0x21, 0x01, 0x33, 0x27, 0x27, 0x23, 0x07, 0x02, 0xdd, \n\t0x4d, 0xbf, 0x45, 0x5c, 0xfe, 0xd7, 0x01, 0x98, 0x01, 0x2c, 0x01, 0x99, \n\t0xfe, 0xd7, 0xfe, 0x90, 0xd3, 0x4c, 0x1b, 0x06, 0x1b, 0x01, 0x0f, 0xfe, \n\t0xf1, 0x01, 0x0f, 0xfe, 0xf1, 0x04, 0x3a, 0xfb, 0xc6, 0x01, 0xc8, 0xdd, \n\t0x71, 0x71, 0x00, 0x00, 0x00, 0x02, 0x00, 0xad, 0x00, 0x00, 0x07, 0x50, \n\t0x05, 0xb0, 0x00, 0x13, 0x00, 0x17, 0x00, 0x56, 0x00, 0xb0, 0x0b, 0x2f, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x13, 0x2f, 0x1b, 0xb1, 0x13, 0x10, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x0b, 0x10, 0xb1, 0x14, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x01, 0xd0, 0xb0, 0x13, 0x10, 0xb0, \n\t0x02, 0xd0, 0xb0, 0x10, 0x10, 0xb0, 0x0d, 0xd0, 0xb0, 0x09, 0xd0, 0xb0, \n\t0x05, 0xd0, 0xb0, 0x0b, 0x10, 0xb0, 0x07, 0xd0, 0xb0, 0x0b, 0x10, 0xb0, \n\t0x0e, 0xd0, 0xb0, 0x02, 0x10, 0xb0, 0x16, 0xd0, 0x30, 0x31, 0x01, 0x21, \n\t0x01, 0x21, 0x01, 0x21, 0x03, 0x23, 0x11, 0x23, 0x11, 0x23, 0x03, 0x21, \n\t0x13, 0x23, 0x11, 0x21, 0x11, 0x21, 0x01, 0x21, 0x03, 0x23, 0x01, 0xd1, \n\t0x01, 0x23, 0x01, 0x31, 0x01, 0x2c, 0x01, 0xff, 0xfe, 0xce, 0x81, 0x6f, \n\t0xf5, 0x64, 0x81, 0xfe, 0xcf, 0x89, 0xdb, 0xfe, 0xdc, 0x01, 0x24, 0x02, \n\t0x46, 0x01, 0x44, 0x9f, 0x06, 0x02, 0x4f, 0x03, 0x61, 0xfa, 0x50, 0x01, \n\t0x86, 0xfe, 0x7a, 0x01, 0x86, 0xfe, 0x7a, 0x01, 0x85, 0xfe, 0x7b, 0x05, \n\t0xb0, 0xfc, 0x9f, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xa6, \n\t0x00, 0x00, 0x06, 0x23, 0x04, 0x3a, 0x00, 0x0f, 0x00, 0x15, 0x00, 0x19, \n\t0x00, 0x53, 0x00, 0xb0, 0x0b, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, \n\t0x2f, 0x1b, 0xb1, 0x0f, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x0a, 0x3e, 0x59, 0xb0, 0x0b, 0x10, 0xb1, \n\t0x10, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x01, 0xd0, 0xb0, 0x0f, 0x10, 0xb0, 0x02, 0xd0, 0xb0, 0x0c, 0x10, 0xb0, \n\t0x09, 0xd0, 0xb0, 0x05, 0xd0, 0xb0, 0x0b, 0x10, 0xb0, 0x07, 0xd0, 0xb0, \n\t0x02, 0x10, 0xb0, 0x13, 0xd0, 0xb0, 0x0b, 0x10, 0xb0, 0x19, 0xd0, 0x30, \n\t0x31, 0x01, 0x33, 0x13, 0x21, 0x01, 0x21, 0x03, 0x23, 0x11, 0x23, 0x11, \n\t0x23, 0x03, 0x21, 0x11, 0x21, 0x01, 0x33, 0x27, 0x27, 0x23, 0x07, 0x01, \n\t0x15, 0x17, 0x37, 0x01, 0xca, 0xa7, 0xed, 0x01, 0x2c, 0x01, 0x99, 0xfe, \n\t0xd7, 0x5e, 0x4d, 0xbf, 0x45, 0x5c, 0xfd, 0xb7, 0x01, 0x24, 0x01, 0xc0, \n\t0xd3, 0x4c, 0x1b, 0x06, 0x1b, 0xfd, 0xf5, 0x06, 0x5c, 0x01, 0xc7, 0x02, \n\t0x73, 0xfb, 0xc6, 0x01, 0x0f, 0xfe, 0xf1, 0x01, 0x0f, 0xfe, 0xf1, 0x04, \n\t0x3a, 0xfd, 0x8e, 0xdd, 0x71, 0x71, 0xfe, 0x6b, 0xf5, 0x01, 0xf6, 0x00, \n\t0x00, 0x02, 0x00, 0x71, 0x00, 0x00, 0x06, 0x87, 0x05, 0xb0, 0x00, 0x19, \n\t0x00, 0x1c, 0x00, 0x71, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x17, 0x2f, \n\t0x1b, 0xb1, 0x17, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x18, \n\t0x2f, 0x1b, 0xb1, 0x18, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x0a, 0x3e, 0x59, 0xb0, 0x17, \n\t0x10, 0xb0, 0x00, 0xd0, 0xb0, 0x17, 0x10, 0xb1, 0x0d, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0a, 0xd0, 0xb0, 0x17, \n\t0x10, 0xb0, 0x1a, 0xd0, 0xb0, 0x18, 0x10, 0xb1, 0x1c, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x16, 0x16, \n\t0x15, 0x11, 0x21, 0x11, 0x34, 0x26, 0x23, 0x23, 0x11, 0x21, 0x11, 0x23, \n\t0x22, 0x06, 0x15, 0x11, 0x21, 0x11, 0x34, 0x24, 0x25, 0x01, 0x21, 0x01, \n\t0x13, 0x21, 0x04, 0x97, 0xf4, 0xfc, 0xfe, 0xdc, 0x74, 0x80, 0x54, 0xfe, \n\t0xdc, 0x6e, 0x81, 0x73, 0xfe, 0xdc, 0x01, 0x0c, 0x01, 0x05, 0xfe, 0x8a, \n\t0x05, 0x02, 0xfd, 0x7f, 0xca, 0xfe, 0x6c, 0x03, 0x24, 0x08, 0xda, 0xea, \n\t0xfe, 0xa8, 0x01, 0x58, 0x83, 0x66, 0xfd, 0xbf, 0x02, 0x41, 0x66, 0x83, \n\t0xfe, 0xa8, 0x01, 0x58, 0xf2, 0xd9, 0x02, 0x02, 0x8b, 0xfd, 0x97, 0x01, \n\t0x85, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x6e, 0x00, 0x00, 0x05, 0x6f, \n\t0x04, 0x3a, 0x00, 0x19, 0x00, 0x1d, 0x00, 0x67, 0x00, 0xb0, 0x04, 0x2f, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x0e, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, \n\t0x12, 0x0a, 0x3e, 0x59, 0xb0, 0x04, 0x10, 0xb0, 0x07, 0xd0, 0xb0, 0x04, \n\t0x10, 0xb1, 0x14, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x11, 0xd0, 0xb0, 0x04, 0x10, 0xb0, 0x1a, 0xd0, 0xb0, 0x05, \n\t0x10, 0xb1, 0x1c, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0x30, 0x31, 0x33, 0x35, 0x34, 0x36, 0x37, 0x01, 0x21, 0x01, 0x16, \n\t0x16, 0x15, 0x15, 0x21, 0x35, 0x34, 0x26, 0x23, 0x23, 0x11, 0x21, 0x11, \n\t0x23, 0x22, 0x06, 0x15, 0x15, 0x01, 0x33, 0x13, 0x23, 0x6e, 0xc6, 0xc1, \n\t0xfe, 0xed, 0x04, 0x29, 0xfe, 0xec, 0xb8, 0xc0, 0xfe, 0xdd, 0x59, 0x63, \n\t0x0b, 0xfe, 0xdc, 0x14, 0x64, 0x58, 0x01, 0x62, 0x06, 0x7b, 0xfc, 0xb3, \n\t0xce, 0xce, 0x12, 0x01, 0xd9, 0xfe, 0x26, 0x15, 0xce, 0xca, 0xb3, 0xb3, \n\t0x7b, 0x60, 0xfe, 0x72, 0x01, 0x8e, 0x60, 0x7b, 0xb3, 0x02, 0x7b, 0x01, \n\t0x03, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9a, 0x00, 0x00, 0x08, 0xbe, \n\t0x05, 0xb0, 0x00, 0x1f, 0x00, 0x22, 0x00, 0x8e, 0x00, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x1b, 0x2f, 0x1b, 0xb1, 0x1b, 0x10, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x1e, 0x2f, 0x1b, 0xb1, 0x1e, 0x10, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x1c, 0x2f, 0x1b, 0xb1, 0x1c, 0x14, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x18, 0x2f, 0x1b, 0xb1, 0x18, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x13, 0x2f, 0x1b, 0xb1, 0x13, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, \n\t0x05, 0x0a, 0x3e, 0x59, 0xb0, 0x1c, 0x10, 0xb0, 0x00, 0xd0, 0xb0, 0x1c, \n\t0x10, 0xb1, 0x17, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x0e, 0xd0, 0xb0, 0x0a, 0xd0, 0xb0, 0x1c, 0x10, 0xb0, 0x20, \n\t0xd0, 0xb0, 0x1e, 0x10, 0xb1, 0x22, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x16, 0x16, 0x15, 0x11, 0x21, \n\t0x11, 0x34, 0x26, 0x23, 0x23, 0x11, 0x21, 0x11, 0x23, 0x22, 0x06, 0x15, \n\t0x11, 0x21, 0x11, 0x34, 0x37, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, \n\t0x01, 0x21, 0x01, 0x13, 0x21, 0x06, 0xce, 0xf4, 0xfc, 0xfe, 0xdc, 0x74, \n\t0x80, 0x54, 0xfe, 0xdc, 0x6e, 0x81, 0x73, 0xfe, 0xdc, 0x2c, 0xfe, 0xea, \n\t0xfe, 0xdc, 0x01, 0x24, 0x02, 0xfa, 0xfe, 0x8b, 0x05, 0x02, 0xfd, 0x7f, \n\t0xca, 0xfe, 0x6c, 0x03, 0x24, 0x08, 0xda, 0xea, 0xfe, 0xa8, 0x01, 0x58, \n\t0x83, 0x66, 0xfd, 0xbf, 0x02, 0x41, 0x66, 0x83, 0xfe, 0xa8, 0x01, 0x58, \n\t0x8b, 0x5f, 0xfd, 0xbe, 0x05, 0xb0, 0xfd, 0x76, 0x02, 0x8a, 0xfd, 0x97, \n\t0x01, 0x85, 0x00, 0x00, 0x00, 0x02, 0x00, 0x85, 0x00, 0x00, 0x07, 0x69, \n\t0x04, 0x3a, 0x00, 0x1f, 0x00, 0x23, 0x00, 0x87, 0x00, 0xb0, 0x09, 0x2f, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0e, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0e, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, \n\t0x00, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x19, 0x2f, 0x1b, \n\t0xb1, 0x19, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, \n\t0x1b, 0xb1, 0x12, 0x0a, 0x3e, 0x59, 0xb0, 0x09, 0x10, 0xb1, 0x04, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x09, 0x10, \n\t0xb0, 0x0d, 0xd0, 0xb0, 0x04, 0x10, 0xb0, 0x1b, 0xd0, 0xb0, 0x17, 0xd0, \n\t0xb0, 0x09, 0x10, 0xb0, 0x20, 0xd0, 0xb0, 0x0b, 0x10, 0xb1, 0x23, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x21, \n\t0x35, 0x34, 0x37, 0x23, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x01, 0x21, \n\t0x01, 0x16, 0x16, 0x15, 0x15, 0x21, 0x35, 0x34, 0x26, 0x23, 0x23, 0x11, \n\t0x21, 0x11, 0x23, 0x22, 0x06, 0x15, 0x15, 0x01, 0x33, 0x13, 0x23, 0x02, \n\t0x68, 0x2b, 0xea, 0xfe, 0xdc, 0x01, 0x24, 0x02, 0x43, 0xfe, 0xf0, 0x04, \n\t0x29, 0xfe, 0xec, 0xb8, 0xc0, 0xfe, 0xdd, 0x59, 0x63, 0x0b, 0xfe, 0xdc, \n\t0x14, 0x64, 0x58, 0x01, 0x62, 0x06, 0x7b, 0xfc, 0xb3, 0x88, 0x5b, 0xfe, \n\t0x6a, 0x04, 0x3a, 0xfe, 0x2b, 0x01, 0xd5, 0xfe, 0x26, 0x15, 0xce, 0xca, \n\t0xb3, 0xb3, 0x7b, 0x60, 0xfe, 0x72, 0x01, 0x8e, 0x60, 0x7b, 0xb3, 0x02, \n\t0x7b, 0x01, 0x03, 0x00, 0x00, 0x02, 0x00, 0x05, 0xfe, 0x40, 0x03, 0xb3, \n\t0x07, 0x7b, 0x00, 0x2c, 0x00, 0x35, 0x00, 0x8f, 0x00, 0xb0, 0x1d, 0x2f, \n\t0xb0, 0x32, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x2c, 0x2f, 0x1b, 0xb1, \n\t0x2c, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, \n\t0xb1, 0x08, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x15, 0x2f, \n\t0x1b, 0xb1, 0x15, 0x0a, 0x3e, 0x59, 0xb0, 0x08, 0x10, 0xb1, 0x06, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x2c, 0x10, \n\t0xb1, 0x2b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb2, 0x0f, 0x2b, 0x2c, 0x11, 0x12, 0x39, 0xb0, 0x15, 0x10, 0xb1, 0x23, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0f, \n\t0x32, 0x01, 0x5d, 0xb0, 0x32, 0x10, 0xb0, 0x2d, 0xb0, 0x0a, 0x2b, 0x58, \n\t0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x32, 0x10, 0xb0, 0x35, 0xb0, 0x0a, 0x2b, \n\t0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb6, 0x0f, 0x35, 0x1f, 0x35, 0x2f, 0x35, \n\t0x03, 0x5d, 0xb0, 0x2e, 0xd0, 0x30, 0x31, 0x01, 0x32, 0x36, 0x35, 0x34, \n\t0x26, 0x23, 0x21, 0x35, 0x21, 0x32, 0x04, 0x15, 0x14, 0x06, 0x07, 0x16, \n\t0x16, 0x15, 0x14, 0x04, 0x23, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x17, \n\t0x07, 0x26, 0x26, 0x27, 0x34, 0x36, 0x33, 0x33, 0x32, 0x36, 0x35, 0x34, \n\t0x26, 0x23, 0x23, 0x35, 0x01, 0x37, 0x21, 0x15, 0x05, 0x23, 0x01, 0x35, \n\t0x21, 0x01, 0x84, 0x71, 0x6d, 0x73, 0x72, 0xfe, 0xfc, 0x01, 0x04, 0xf2, \n\t0x01, 0x17, 0x79, 0x6e, 0x86, 0x8e, 0xfe, 0xed, 0xe6, 0x3a, 0x3b, 0x36, \n\t0x54, 0x3c, 0x52, 0x9f, 0xa8, 0x01, 0xbd, 0xa8, 0x40, 0x6a, 0x7b, 0x8c, \n\t0x86, 0x8f, 0x01, 0x43, 0x75, 0x01, 0x08, 0xfe, 0xe7, 0xc7, 0xfe, 0xe7, \n\t0x01, 0x08, 0x03, 0x5e, 0x66, 0x57, 0x51, 0x5d, 0xe7, 0xc0, 0xbd, 0x76, \n\t0xa6, 0x2b, 0x2b, 0xad, 0x7c, 0xca, 0xe3, 0x33, 0x2d, 0x3c, 0x4a, 0x1a, \n\t0xab, 0x24, 0xc0, 0x8c, 0x90, 0x93, 0x6b, 0x56, 0x6e, 0x74, 0xe8, 0x03, \n\t0x9e, 0x7f, 0x11, 0xff, 0x01, 0x00, 0x10, 0x00, 0x00, 0x02, 0x00, 0x1c, \n\t0xfe, 0x4e, 0x03, 0x99, 0x06, 0x23, 0x00, 0x2c, 0x00, 0x35, 0x00, 0xaf, \n\t0x00, 0x7c, 0xb0, 0x2c, 0x2f, 0x18, 0xb0, 0x32, 0x2f, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0e, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x1d, 0x2f, 0x1b, 0xb1, 0x1d, 0x0c, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x15, 0x2f, 0x1b, 0xb1, 0x15, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x08, 0x10, 0xb1, 0x06, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb2, 0x7f, 0x2c, 0x01, 0x5d, 0xb2, 0x4f, 0x2c, 0x01, \n\t0x71, 0xb2, 0xef, 0x2c, 0x01, 0x71, 0xb2, 0xbf, 0x2c, 0x01, 0x71, 0xb2, \n\t0x1f, 0x2c, 0x01, 0x71, 0xb2, 0x1f, 0x2c, 0x01, 0x72, 0xb2, 0x10, 0x2c, \n\t0x01, 0x5d, 0xb0, 0x2c, 0x10, 0xb1, 0x2b, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0f, 0x2b, 0x2c, 0x11, 0x12, 0x39, \n\t0xb0, 0x15, 0x10, 0xb1, 0x23, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x32, 0x10, 0xb0, 0x2d, 0xb0, 0x0a, 0x2b, 0x58, \n\t0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x32, 0x10, 0xb0, 0x35, 0xb0, 0x0a, 0x2b, \n\t0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb6, 0x0f, 0x35, 0x1f, 0x35, 0x2f, 0x35, \n\t0x03, 0x5d, 0xb0, 0x2e, 0xd0, 0x30, 0x31, 0x01, 0x32, 0x36, 0x35, 0x34, \n\t0x26, 0x23, 0x21, 0x35, 0x21, 0x32, 0x04, 0x15, 0x14, 0x06, 0x07, 0x16, \n\t0x16, 0x15, 0x14, 0x06, 0x23, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x17, \n\t0x07, 0x26, 0x26, 0x27, 0x34, 0x36, 0x33, 0x33, 0x32, 0x36, 0x35, 0x34, \n\t0x26, 0x23, 0x23, 0x35, 0x13, 0x37, 0x21, 0x15, 0x05, 0x23, 0x01, 0x35, \n\t0x21, 0x01, 0x94, 0x5c, 0x59, 0x67, 0x65, 0xfe, 0xfc, 0x01, 0x04, 0xe6, \n\t0x01, 0x09, 0x5e, 0x56, 0x6d, 0x74, 0xfd, 0xd3, 0x31, 0x43, 0x3e, 0x4b, \n\t0x36, 0x52, 0x83, 0xa6, 0x01, 0xad, 0x9a, 0x38, 0x65, 0x76, 0x78, 0x71, \n\t0x9f, 0xfb, 0x75, 0x01, 0x08, 0xfe, 0xe7, 0xc7, 0xfe, 0xe7, 0x01, 0x08, \n\t0x02, 0x72, 0x48, 0x3e, 0x35, 0x40, 0xcd, 0x97, 0x94, 0x54, 0x7b, 0x23, \n\t0x21, 0x78, 0x54, 0x98, 0xad, 0x33, 0x2d, 0x3c, 0x4a, 0x1a, 0x9d, 0x2a, \n\t0xbb, 0x7d, 0x83, 0x85, 0x47, 0x3a, 0x42, 0x46, 0xb1, 0x03, 0x32, 0x7f, \n\t0x11, 0xff, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x38, \n\t0x00, 0x00, 0x05, 0x8e, 0x05, 0xb0, 0x02, 0x06, 0x01, 0x82, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x44, 0xfe, 0x22, 0x05, 0xb4, 0x04, 0x3a, 0x02, 0x06, \n\t0x01, 0xa2, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x04, 0x25, \n\t0x04, 0x4e, 0x00, 0x15, 0x00, 0x3c, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x14, 0x2f, 0x1b, 0xb1, 0x14, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x0a, 0x3e, 0x59, 0xb0, 0x02, \n\t0xd0, 0xb0, 0x07, 0x10, 0xb1, 0x0e, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x17, 0x33, 0x37, 0x13, 0x36, \n\t0x36, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x06, 0x07, \n\t0x03, 0x21, 0x01, 0x21, 0x01, 0xe2, 0x11, 0x06, 0x10, 0x5c, 0x30, 0xa8, \n\t0x81, 0x20, 0x32, 0x15, 0x18, 0x04, 0x22, 0x0d, 0x26, 0x3d, 0x0c, 0xe8, \n\t0xfe, 0xe9, 0xfe, 0xa4, 0x01, 0x31, 0x01, 0x93, 0x58, 0x58, 0x01, 0x76, \n\t0xa2, 0xa3, 0x08, 0x0b, 0xdd, 0x01, 0x03, 0x3b, 0x2b, 0xfd, 0x04, 0x04, \n\t0x3a, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xd1, 0x00, 0x00, 0x04, 0x25, \n\t0x06, 0x40, 0x02, 0x26, 0x02, 0x08, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5f, \n\t0x03, 0xdc, 0x00, 0x52, 0x00, 0x0f, 0x00, 0xb3, 0x18, 0x08, 0x14, 0x04, \n\t0x2b, 0xb0, 0x18, 0x10, 0xb0, 0x1d, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x5c, 0xfe, 0x4b, 0x09, 0x88, 0x05, 0xc5, 0x00, 0x26, \n\t0x00, 0x32, 0x00, 0x00, 0x00, 0x07, 0x00, 0x5c, 0x05, 0x77, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x43, 0xfe, 0x4b, 0x08, 0x95, 0x04, 0x4e, 0x00, 0x26, \n\t0x00, 0x52, 0x00, 0x00, 0x00, 0x07, 0x00, 0x5c, 0x04, 0x84, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x5c, 0xff, 0x78, 0x05, 0x1b, 0x06, 0x29, 0x00, 0x17, \n\t0x00, 0x2f, 0x00, 0x4a, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, \n\t0x1b, 0xb1, 0x10, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, \n\t0x2f, 0x1b, 0xb1, 0x07, 0x0a, 0x3e, 0x59, 0xb0, 0x04, 0xd0, 0xb0, 0x10, \n\t0x10, 0xb0, 0x13, 0xd0, 0xb0, 0x10, 0x10, 0xb1, 0x1f, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x1c, 0xd0, 0xb0, 0x07, \n\t0x10, 0xb1, 0x28, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x2b, 0xd0, 0x30, 0x31, 0x01, 0x10, 0x07, 0x06, 0x07, 0x15, \n\t0x23, 0x35, 0x26, 0x27, 0x26, 0x11, 0x11, 0x10, 0x37, 0x36, 0x37, 0x35, \n\t0x33, 0x15, 0x16, 0x17, 0x16, 0x11, 0x25, 0x34, 0x27, 0x26, 0x27, 0x15, \n\t0x23, 0x35, 0x06, 0x07, 0x06, 0x15, 0x11, 0x14, 0x17, 0x16, 0x17, 0x35, \n\t0x33, 0x15, 0x36, 0x37, 0x36, 0x35, 0x05, 0x1b, 0xaa, 0x86, 0xc7, 0xc3, \n\t0xd2, 0x8b, 0xa8, 0xa7, 0x8b, 0xd1, 0xc3, 0xc7, 0x88, 0xaa, 0xfe, 0xdc, \n\t0x55, 0x34, 0x4c, 0xc3, 0x57, 0x37, 0x52, 0x53, 0x38, 0x57, 0xc3, 0x4c, \n\t0x33, 0x54, 0x02, 0x55, 0xfe, 0xf4, 0xaf, 0x8b, 0x1c, 0x7b, 0x78, 0x18, \n\t0x92, 0xaf, 0x01, 0x0c, 0x01, 0x06, 0x01, 0x0b, 0xaf, 0x92, 0x18, 0x6a, \n\t0x6b, 0x1d, 0x8c, 0xaf, 0xfe, 0xf5, 0x02, 0xaa, 0x6d, 0x42, 0x1a, 0x6d, \n\t0x72, 0x17, 0x4a, 0x6c, 0xab, 0xfe, 0xf8, 0xad, 0x6d, 0x4a, 0x18, 0x6f, \n\t0x6a, 0x1a, 0x43, 0x6d, 0xad, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x43, \n\t0xff, 0x85, 0x04, 0x40, 0x04, 0xb4, 0x00, 0x17, 0x00, 0x2f, 0x00, 0x4d, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0e, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x0b, 0x10, 0xb0, 0x0e, 0xd0, 0xb0, 0x02, 0x10, \n\t0xb0, 0x17, 0xd0, 0xb0, 0x02, 0x10, 0xb1, 0x1c, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x1f, 0xd0, 0xb0, 0x0b, 0x10, \n\t0xb1, 0x2b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x28, 0xd0, 0x30, 0x31, 0x05, 0x23, 0x35, 0x26, 0x27, 0x26, 0x35, \n\t0x35, 0x34, 0x37, 0x36, 0x37, 0x35, 0x33, 0x15, 0x16, 0x17, 0x16, 0x15, \n\t0x15, 0x14, 0x07, 0x06, 0x07, 0x01, 0x14, 0x17, 0x16, 0x17, 0x35, 0x33, \n\t0x15, 0x36, 0x37, 0x36, 0x35, 0x35, 0x34, 0x27, 0x26, 0x27, 0x15, 0x23, \n\t0x35, 0x06, 0x07, 0x06, 0x15, 0x02, 0xa1, 0xc3, 0xaa, 0x6a, 0x87, 0x87, \n\t0x6b, 0xae, 0xc4, 0xa7, 0x6a, 0x88, 0x88, 0x6b, 0xac, 0xfe, 0xc5, 0x34, \n\t0x1a, 0x2a, 0xc3, 0x2b, 0x1b, 0x35, 0x35, 0x19, 0x27, 0xc4, 0x2d, 0x1c, \n\t0x34, 0x7b, 0x6e, 0x19, 0x78, 0x9a, 0xf4, 0x15, 0xf2, 0x9a, 0x7b, 0x1a, \n\t0x6c, 0x6e, 0x1b, 0x77, 0x9a, 0xf3, 0x15, 0xf4, 0x9a, 0x79, 0x19, 0x02, \n\t0x20, 0x94, 0x5a, 0x2d, 0x16, 0x6a, 0x6b, 0x16, 0x2f, 0x5a, 0x93, 0x15, \n\t0x90, 0x5b, 0x2b, 0x17, 0x59, 0x5e, 0x17, 0x31, 0x5b, 0x8f, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x5c, 0xfe, 0x92, 0x04, 0xab, 0x05, 0xc5, 0x00, 0x19, \n\t0x00, 0x3e, 0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, \n\t0x2f, 0x1b, 0xb1, 0x09, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0a, 0x3e, 0x59, 0xb0, 0x09, 0x10, 0xb1, \n\t0x11, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x02, 0x10, 0xb1, 0x18, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x11, 0x26, 0x02, 0x35, 0x11, 0x10, \n\t0x00, 0x33, 0x20, 0x00, 0x07, 0x07, 0x21, 0x34, 0x26, 0x23, 0x22, 0x06, \n\t0x15, 0x11, 0x14, 0x16, 0x33, 0x33, 0x03, 0x4a, 0xfe, 0xdd, 0xd4, 0xf7, \n\t0x01, 0x33, 0xff, 0x01, 0x02, 0x01, 0x1b, 0x04, 0x02, 0xfe, 0xe5, 0x79, \n\t0x83, 0x82, 0x8c, 0x8c, 0x82, 0xbc, 0xfe, 0x92, 0x01, 0x61, 0x21, 0x01, \n\t0x44, 0xef, 0x01, 0x21, 0x01, 0x0b, 0x01, 0x52, 0xfe, 0xfd, 0xed, 0x06, \n\t0x8d, 0x88, 0xd2, 0xa8, 0xfe, 0xdd, 0xa9, 0xd3, 0x00, 0x01, 0x00, 0x56, \n\t0xfe, 0x91, 0x04, 0x03, 0x04, 0x4e, 0x00, 0x19, 0x00, 0x3e, 0x00, 0xb0, \n\t0x00, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, \n\t0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, \n\t0x02, 0x0a, 0x3e, 0x59, 0xb0, 0x09, 0x10, 0xb1, 0x11, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x02, 0x10, 0xb1, 0x18, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x01, 0x21, 0x11, 0x26, 0x02, 0x35, 0x35, 0x34, 0x00, 0x33, 0x32, 0x16, \n\t0x07, 0x07, 0x21, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x15, 0x14, 0x16, \n\t0x33, 0x33, 0x03, 0x08, 0xfe, 0xdc, 0xbf, 0xcf, 0x01, 0x06, 0xed, 0xc7, \n\t0xf3, 0x04, 0x02, 0xfe, 0xf6, 0x5b, 0x4f, 0x6f, 0x61, 0x60, 0x72, 0xbd, \n\t0xfe, 0x91, 0x01, 0x63, 0x20, 0x01, 0x26, 0xd3, 0x1e, 0xee, 0x01, 0x35, \n\t0xe4, 0xba, 0x06, 0x53, 0x70, 0xb6, 0x8c, 0x1e, 0x8f, 0xb3, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x6b, 0x00, 0x00, 0x04, 0x91, 0x05, 0x3e, 0x00, 0x13, \n\t0x00, 0x13, 0x00, 0xb0, 0x0e, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, \n\t0x2f, 0x1b, 0xb1, 0x04, 0x0a, 0x3e, 0x59, 0x30, 0x31, 0x01, 0x05, 0x07, \n\t0x25, 0x03, 0x23, 0x13, 0x25, 0x37, 0x05, 0x13, 0x25, 0x37, 0x05, 0x13, \n\t0x33, 0x03, 0x05, 0x07, 0x25, 0x02, 0x59, 0x01, 0x21, 0x48, 0xfe, 0xdd, \n\t0xb5, 0xaf, 0xe1, 0xfe, 0xdf, 0x47, 0x01, 0x25, 0xca, 0xfe, 0xde, 0x49, \n\t0x01, 0x23, 0xb9, 0xac, 0xe4, 0x01, 0x25, 0x4c, 0xfe, 0xe0, 0x01, 0xc1, \n\t0xac, 0x80, 0xaa, 0xfe, 0xc1, 0x01, 0x8e, 0xab, 0x80, 0xab, 0x01, 0x68, \n\t0xab, 0x82, 0xab, 0x01, 0x46, 0xfe, 0x6b, 0xab, 0x7f, 0xaa, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x5c, 0x04, 0xa2, 0x03, 0x2f, 0x05, 0xfd, 0x00, 0x07, \n\t0x00, 0x27, 0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x00, 0x10, 0xb0, 0x03, 0xb0, 0x0a, 0x2b, \n\t0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x05, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, \n\t0x1b, 0xdc, 0x59, 0x30, 0x31, 0x01, 0x15, 0x27, 0x37, 0x21, 0x27, 0x17, \n\t0x15, 0x01, 0x0d, 0xb1, 0x01, 0x02, 0x22, 0x01, 0xb1, 0x05, 0x20, 0x7e, \n\t0x01, 0xee, 0x6c, 0x01, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x66, \n\t0x05, 0x17, 0x03, 0x60, 0x06, 0x15, 0x00, 0x11, 0x00, 0x2d, 0x00, 0xb0, \n\t0x10, 0x2f, 0xb0, 0x0c, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, \n\t0xb0, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x10, \n\t0x10, 0xb0, 0x08, 0xd0, 0xb0, 0x10, 0x10, 0xb0, 0x11, 0xb0, 0x0a, 0x2b, \n\t0x58, 0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, 0x13, 0x32, 0x24, 0x33, 0x32, \n\t0x16, 0x15, 0x15, 0x23, 0x35, 0x34, 0x26, 0x23, 0x22, 0x04, 0x23, 0x23, \n\t0x35, 0x7b, 0x71, 0x01, 0x3d, 0x49, 0x71, 0x7d, 0x88, 0x3a, 0x30, 0x2b, \n\t0xfe, 0xbd, 0x83, 0x17, 0x05, 0x9d, 0x78, 0x6c, 0x6d, 0x25, 0x12, 0x33, \n\t0x33, 0x78, 0x86, 0x00, 0x00, 0x01, 0x00, 0x7d, 0x05, 0x19, 0x01, 0x74, \n\t0x06, 0x69, 0x00, 0x05, 0x00, 0x10, 0x00, 0xb0, 0x05, 0x2f, 0xb0, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, 0x13, 0x35, \n\t0x33, 0x07, 0x17, 0x07, 0x7d, 0xbe, 0x01, 0x3a, 0x51, 0x05, 0xdc, 0x8d, \n\t0x9f, 0x6d, 0x44, 0x00, 0x00, 0x01, 0x00, 0x6b, 0x05, 0x19, 0x01, 0x62, \n\t0x06, 0x69, 0x00, 0x05, 0x00, 0x10, 0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x03, \n\t0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, 0x13, 0x27, \n\t0x37, 0x27, 0x33, 0x15, 0xbc, 0x51, 0x3a, 0x01, 0xbe, 0x05, 0x19, 0x44, \n\t0x6d, 0x9f, 0x8d, 0x00, 0x00, 0x08, 0x00, 0x37, 0xfe, 0xc4, 0x07, 0xd0, \n\t0x05, 0xaf, 0x00, 0x0f, 0x00, 0x1f, 0x00, 0x2f, 0x00, 0x3f, 0x00, 0x4f, \n\t0x00, 0x5f, 0x00, 0x6f, 0x00, 0x7f, 0x00, 0x75, 0x00, 0xb0, 0x54, 0x2f, \n\t0xb0, 0x64, 0x2f, 0xb0, 0x74, 0x2f, 0xb0, 0x44, 0x2f, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x10, 0x3e, 0x59, 0xb0, 0x0c, \n\t0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x54, 0x10, 0xb0, \n\t0x14, 0xd0, 0xb0, 0x54, 0x10, 0xb0, 0x5c, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, \n\t0x1b, 0xdc, 0x59, 0xb0, 0x1c, 0xd0, 0xb0, 0x64, 0x10, 0xb0, 0x24, 0xd0, \n\t0xb0, 0x64, 0x10, 0xb0, 0x6c, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, \n\t0x59, 0xb0, 0x2c, 0xd0, 0xb0, 0x74, 0x10, 0xb0, 0x34, 0xd0, 0xb0, 0x74, \n\t0x10, 0xb0, 0x7c, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, \n\t0x3c, 0xd0, 0xb0, 0x44, 0x10, 0xb0, 0x4c, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, \n\t0x1b, 0xdc, 0x59, 0x30, 0x31, 0x01, 0x27, 0x26, 0x36, 0x33, 0x32, 0x16, \n\t0x07, 0x07, 0x23, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x01, 0x27, 0x26, \n\t0x36, 0x33, 0x32, 0x16, 0x07, 0x07, 0x23, 0x34, 0x26, 0x23, 0x22, 0x06, \n\t0x15, 0x13, 0x27, 0x26, 0x36, 0x33, 0x32, 0x16, 0x07, 0x07, 0x23, 0x34, \n\t0x26, 0x23, 0x22, 0x06, 0x15, 0x01, 0x27, 0x26, 0x36, 0x33, 0x32, 0x16, \n\t0x07, 0x07, 0x23, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x01, 0x27, 0x26, \n\t0x36, 0x33, 0x32, 0x16, 0x07, 0x07, 0x23, 0x34, 0x26, 0x23, 0x22, 0x06, \n\t0x15, 0x01, 0x27, 0x26, 0x36, 0x33, 0x32, 0x16, 0x07, 0x07, 0x23, 0x34, \n\t0x26, 0x23, 0x22, 0x06, 0x15, 0x01, 0x27, 0x26, 0x36, 0x33, 0x32, 0x16, \n\t0x07, 0x07, 0x23, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x13, 0x27, 0x26, \n\t0x36, 0x33, 0x32, 0x16, 0x07, 0x07, 0x23, 0x34, 0x26, 0x23, 0x22, 0x06, \n\t0x15, 0x03, 0x2b, 0x02, 0x05, 0x70, 0x61, 0x60, 0x71, 0x04, 0x02, 0x68, \n\t0x31, 0x32, 0x32, 0x2f, 0x01, 0xe6, 0x02, 0x05, 0x71, 0x60, 0x60, 0x72, \n\t0x04, 0x02, 0x69, 0x30, 0x33, 0x32, 0x2e, 0x51, 0x02, 0x05, 0x71, 0x60, \n\t0x60, 0x71, 0x04, 0x02, 0x68, 0x30, 0x33, 0x32, 0x2f, 0xfe, 0xd2, 0x02, \n\t0x05, 0x71, 0x60, 0x60, 0x71, 0x04, 0x02, 0x68, 0x30, 0x33, 0x32, 0x2f, \n\t0xfd, 0x57, 0x02, 0x05, 0x70, 0x61, 0x60, 0x71, 0x04, 0x02, 0x68, 0x31, \n\t0x32, 0x32, 0x2f, 0xfd, 0x55, 0x02, 0x05, 0x71, 0x61, 0x60, 0x71, 0x04, \n\t0x02, 0x68, 0x31, 0x32, 0x32, 0x2f, 0xfe, 0xe6, 0x02, 0x05, 0x71, 0x60, \n\t0x60, 0x71, 0x04, 0x02, 0x68, 0x30, 0x33, 0x32, 0x2f, 0x3d, 0x02, 0x05, \n\t0x71, 0x60, 0x60, 0x72, 0x04, 0x02, 0x69, 0x30, 0x33, 0x32, 0x2e, 0x04, \n\t0xf3, 0x06, 0x4f, 0x67, 0x67, 0x4f, 0x06, 0x2b, 0x3a, 0x3a, 0x2b, 0xfe, \n\t0xeb, 0x06, 0x4e, 0x68, 0x67, 0x4f, 0x06, 0x2c, 0x39, 0x3a, 0x2b, 0xfe, \n\t0x09, 0x06, 0x4e, 0x68, 0x67, 0x4f, 0x06, 0x2c, 0x39, 0x3a, 0x2b, 0xfd, \n\t0xf9, 0x06, 0x4e, 0x68, 0x67, 0x4f, 0x06, 0x2c, 0x39, 0x3a, 0x2b, 0xfe, \n\t0xe4, 0x06, 0x50, 0x66, 0x66, 0x50, 0x06, 0x2c, 0x39, 0x39, 0x2c, 0x05, \n\t0x1a, 0x06, 0x4f, 0x67, 0x67, 0x4f, 0x06, 0x2b, 0x3a, 0x3a, 0x2b, 0xfe, \n\t0x09, 0x06, 0x4e, 0x68, 0x67, 0x4f, 0x06, 0x2c, 0x39, 0x3a, 0x2b, 0xfd, \n\t0xf9, 0x06, 0x4e, 0x68, 0x67, 0x4f, 0x06, 0x2c, 0x39, 0x3a, 0x2b, 0x00, \n\t0x00, 0x08, 0x00, 0x49, 0xfe, 0x63, 0x07, 0x89, 0x05, 0xc6, 0x00, 0x04, \n\t0x00, 0x09, 0x00, 0x0e, 0x00, 0x13, 0x00, 0x19, 0x00, 0x1e, 0x00, 0x23, \n\t0x00, 0x28, 0x00, 0x2f, 0x00, 0xb0, 0x02, 0x2f, 0xb0, 0x1c, 0x2f, 0xb0, \n\t0x27, 0x2f, 0xb0, 0x22, 0x2f, 0xb0, 0x12, 0x2f, 0xb0, 0x0d, 0x2f, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x10, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x16, 0x2f, 0x1b, 0xb1, 0x16, 0x12, 0x3e, \n\t0x59, 0x30, 0x31, 0x05, 0x17, 0x03, 0x23, 0x13, 0x03, 0x27, 0x13, 0x33, \n\t0x03, 0x01, 0x37, 0x05, 0x15, 0x25, 0x05, 0x07, 0x25, 0x35, 0x05, 0x01, \n\t0x37, 0x25, 0x17, 0x06, 0x05, 0x01, 0x07, 0x05, 0x27, 0x25, 0x03, 0x27, \n\t0x03, 0x37, 0x13, 0x01, 0x17, 0x13, 0x07, 0x03, 0x04, 0x4c, 0x0b, 0x7a, \n\t0x60, 0x46, 0x3a, 0x0c, 0x7a, 0x60, 0x46, 0x02, 0x1e, 0x0d, 0x01, 0x4d, \n\t0xfe, 0xa6, 0xfb, 0x74, 0x0d, 0xfe, 0xb3, 0x01, 0x5a, 0x03, 0x9c, 0x02, \n\t0x01, 0x41, 0x44, 0x25, 0xfe, 0xff, 0xfc, 0xf3, 0x02, 0xfe, 0xc0, 0x45, \n\t0x01, 0x26, 0x2b, 0x11, 0x94, 0x41, 0xc6, 0x03, 0x60, 0x11, 0x95, 0x42, \n\t0xc5, 0x3c, 0x0e, 0xfe, 0xad, 0x01, 0x61, 0x04, 0xa2, 0x0e, 0x01, 0x52, \n\t0xfe, 0xa0, 0xfe, 0x11, 0x0c, 0x7c, 0x62, 0x47, 0x3b, 0x0c, 0x7c, 0x62, \n\t0x47, 0x01, 0xae, 0x10, 0x99, 0x44, 0x17, 0xb1, 0xfc, 0x8e, 0x11, 0x99, \n\t0x45, 0xc8, 0x02, 0xe4, 0x02, 0x01, 0x46, 0x45, 0xfe, 0xd5, 0xfc, 0xe3, \n\t0x02, 0xfe, 0xbb, 0x47, 0x01, 0x2b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7e, \n\t0xfe, 0xab, 0x06, 0x21, 0x07, 0x68, 0x02, 0x26, 0x01, 0xc0, 0x00, 0x00, \n\t0x00, 0x27, 0x01, 0x54, 0x01, 0x07, 0x01, 0xb8, 0x01, 0x07, 0x00, 0x0f, \n\t0x04, 0x80, 0xff, 0xd9, 0x00, 0x09, 0x00, 0xb3, 0x10, 0x08, 0x08, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x6b, 0xfe, 0xab, 0x05, 0x23, \n\t0x06, 0x11, 0x02, 0x26, 0x01, 0xd5, 0x00, 0x00, 0x00, 0x26, 0x01, 0x54, \n\t0x7e, 0x61, 0x01, 0x07, 0x00, 0x0f, 0x03, 0x82, 0xff, 0xd9, 0x00, 0x09, \n\t0x00, 0xb3, 0x10, 0x09, 0x08, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0x00, 0x02, 0xff, 0xe6, 0x00, 0x00, 0x04, 0xc5, 0x05, 0xb0, 0x00, 0x12, \n\t0x00, 0x1b, 0x00, 0x63, 0x00, 0xb0, 0x02, 0x2f, 0xb0, 0x12, 0x2f, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x10, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0a, 0x3e, \n\t0x59, 0xb2, 0x3f, 0x12, 0x01, 0x5d, 0xb0, 0x12, 0x10, 0xb1, 0x00, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x10, 0x02, \n\t0x01, 0x5d, 0xb0, 0x0b, 0xd0, 0xb0, 0x12, 0x10, 0xb0, 0x0d, 0xd0, 0xb0, \n\t0x02, 0x10, 0xb1, 0x13, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x09, 0x10, 0xb1, 0x14, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x23, 0x15, 0x33, 0x32, \n\t0x00, 0x15, 0x14, 0x00, 0x23, 0x21, 0x11, 0x23, 0x35, 0x33, 0x35, 0x21, \n\t0x15, 0x33, 0x03, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x02, \n\t0x85, 0xdd, 0xfa, 0xfb, 0x01, 0x28, 0xfe, 0xd7, 0xfa, 0xfd, 0xe2, 0x9e, \n\t0x9e, 0x01, 0x24, 0xdd, 0xdd, 0xfa, 0x7b, 0x85, 0x85, 0x7b, 0x04, 0x42, \n\t0x92, 0xfe, 0xfa, 0xd0, 0xd2, 0xfe, 0xf8, 0x04, 0x42, 0xb5, 0xb9, 0xb9, \n\t0xfd, 0xd8, 0xfe, 0x11, 0x92, 0x6a, 0x66, 0x8d, 0x00, 0x01, 0x00, 0x77, \n\t0x00, 0x00, 0x04, 0x47, 0x07, 0x20, 0x00, 0x07, 0x00, 0x2c, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x10, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x04, 0x10, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x11, 0x21, 0x11, 0x21, \n\t0x11, 0x21, 0x04, 0x47, 0xfd, 0x54, 0xfe, 0xdc, 0x02, 0xac, 0x01, 0x24, \n\t0x04, 0xcf, 0xfb, 0x31, 0x05, 0xb0, 0x01, 0x70, 0x00, 0x01, 0x00, 0x6b, \n\t0x00, 0x00, 0x03, 0x77, 0x05, 0x75, 0x00, 0x09, 0x00, 0x32, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0e, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x06, 0x10, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x02, 0xd0, 0xb0, 0x03, 0xd0, 0x30, 0x31, \n\t0x01, 0x23, 0x15, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x03, 0x77, \n\t0x29, 0xfe, 0x41, 0xfe, 0xdc, 0x01, 0xe9, 0x01, 0x23, 0x03, 0x59, 0x01, \n\t0xfc, 0xa8, 0x04, 0x3a, 0x01, 0x3b, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf4, \n\t0x00, 0x00, 0x04, 0x3d, 0x05, 0xb0, 0x00, 0x0d, 0x00, 0x5b, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x10, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x16, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x16, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x0c, 0x10, 0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0xd0, 0xb0, 0x05, 0xd0, \n\t0xb0, 0x08, 0x10, 0xb1, 0x0a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x23, 0x11, 0x21, 0x11, 0x23, 0x35, \n\t0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x33, 0x02, 0x93, 0xe7, 0xfe, 0xdc, \n\t0x94, 0x94, 0x03, 0xb5, 0xfd, 0x6f, 0xe7, 0x02, 0x98, 0xfd, 0x68, 0x02, \n\t0x98, 0xb5, 0x02, 0x63, 0xe1, 0xfe, 0x7e, 0x00, 0x00, 0x01, 0xff, 0xd2, \n\t0x00, 0x00, 0x03, 0x4e, 0x04, 0x3a, 0x00, 0x0d, 0x00, 0x47, 0x00, 0xb0, \n\t0x0d, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, \n\t0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, \n\t0x02, 0x0a, 0x3e, 0x59, 0xb0, 0x0d, 0x10, 0xb1, 0x00, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0xd0, 0xb0, 0x0d, \n\t0x10, 0xb0, 0x06, 0xd0, 0xb0, 0x08, 0x10, 0xb1, 0x0a, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x23, 0x11, \n\t0x21, 0x11, 0x23, 0x35, 0x33, 0x11, 0x21, 0x15, 0x21, 0x15, 0x33, 0x02, \n\t0x71, 0xe2, 0xfe, 0xdc, 0x99, 0x99, 0x02, 0xe3, 0xfe, 0x41, 0xe2, 0x01, \n\t0xc7, 0xfe, 0x39, 0x01, 0xc7, 0xb5, 0x01, 0xbe, 0xe2, 0xdc, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x88, 0xfe, 0x9b, 0x05, 0x66, 0x05, 0xb0, 0x02, 0x26, \n\t0x00, 0x2e, 0x00, 0x00, 0x00, 0x07, 0x03, 0x5d, 0x03, 0xe8, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x81, 0xfe, 0x9b, 0x04, 0xd3, 0x04, 0x3a, 0x02, 0x26, \n\t0x01, 0xd7, 0x00, 0x00, 0x00, 0x07, 0x03, 0x5d, 0x03, 0x55, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x84, 0x00, 0x00, 0x05, 0x5e, 0x05, 0xb0, 0x00, 0x14, \n\t0x00, 0x5c, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x13, 0x2f, 0x1b, 0xb1, \n\t0x13, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, \n\t0xb1, 0x00, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, \n\t0x1b, 0xb1, 0x0c, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, \n\t0x2f, 0x1b, 0xb1, 0x02, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0a, 0x3e, 0x59, 0xb0, 0x13, 0x10, 0xb1, \n\t0x04, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x08, 0xd0, 0xb0, 0x13, 0x10, 0xb0, 0x0e, 0xd0, 0x30, 0x31, 0x09, 0x02, \n\t0x21, 0x01, 0x23, 0x15, 0x23, 0x35, 0x23, 0x11, 0x21, 0x11, 0x21, 0x11, \n\t0x33, 0x11, 0x33, 0x11, 0x33, 0x01, 0x05, 0x37, 0xfe, 0x83, 0x01, 0xa4, \n\t0xfe, 0x8c, 0xfe, 0xee, 0x36, 0xa7, 0x53, 0xfe, 0xdc, 0x01, 0x24, 0x53, \n\t0xa7, 0x28, 0x01, 0x04, 0x05, 0xb0, 0xfd, 0x69, 0xfc, 0xe7, 0x02, 0x5c, \n\t0xe5, 0xe5, 0xfd, 0xa4, 0x05, 0xb0, 0xfd, 0xa9, 0x01, 0x00, 0xff, 0x00, \n\t0x02, 0x57, 0x00, 0x00, 0x00, 0x01, 0x00, 0x81, 0x00, 0x00, 0x04, 0xab, \n\t0x04, 0x3a, 0x00, 0x14, 0x00, 0x5c, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x0e, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0a, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x0e, 0x10, 0xb1, 0x09, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x05, 0xd0, 0xb0, 0x0e, 0x10, 0xb0, 0x12, 0xd0, \n\t0x30, 0x31, 0x09, 0x02, 0x21, 0x03, 0x23, 0x15, 0x23, 0x35, 0x23, 0x11, \n\t0x21, 0x11, 0x21, 0x11, 0x33, 0x35, 0x33, 0x15, 0x33, 0x13, 0x04, 0x9b, \n\t0xfe, 0xdb, 0x01, 0x35, 0xfe, 0x8b, 0xa5, 0x1a, 0x97, 0x3b, 0xfe, 0xdc, \n\t0x01, 0x24, 0x3b, 0x97, 0x19, 0x9a, 0x04, 0x3a, 0xfe, 0x02, 0xfd, 0xc4, \n\t0x01, 0x95, 0xac, 0xac, 0xfe, 0x6b, 0x04, 0x3a, 0xfe, 0x64, 0xbf, 0xbf, \n\t0x01, 0x9c, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc2, 0x00, 0x00, 0x05, 0x4d, \n\t0x05, 0xb0, 0x00, 0x14, 0x00, 0x7d, 0x00, 0xb0, 0x07, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x16, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x10, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x10, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x13, 0x2f, 0x1b, 0xb1, 0x13, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x0f, 0x10, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x7f, 0x07, 0x01, 0x5d, 0xb0, \n\t0x07, 0x10, 0xb1, 0x04, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x07, 0x10, 0xb0, 0x0a, 0xd0, 0xb0, 0x04, 0x10, 0xb0, \n\t0x0c, 0xd0, 0xb2, 0x12, 0x00, 0x0f, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, \n\t0x23, 0x11, 0x21, 0x11, 0x23, 0x35, 0x33, 0x35, 0x21, 0x15, 0x33, 0x15, \n\t0x23, 0x11, 0x33, 0x01, 0x21, 0x01, 0x01, 0x21, 0x02, 0x62, 0xa2, 0xfe, \n\t0xdc, 0xda, 0xda, 0x01, 0x24, 0xa1, 0xa1, 0x7f, 0x01, 0x82, 0x01, 0x65, \n\t0xfe, 0x16, 0x02, 0x11, 0xfe, 0x9c, 0x02, 0x60, 0xfd, 0xa0, 0x04, 0x74, \n\t0xb5, 0x87, 0x87, 0xb5, 0xfe, 0xe9, 0x02, 0x53, 0xfd, 0x5a, 0xfc, 0xf6, \n\t0x00, 0x01, 0xff, 0xcd, 0x00, 0x00, 0x04, 0x72, 0x06, 0x18, 0x00, 0x14, \n\t0x00, 0x73, 0x00, 0xb0, 0x07, 0x2f, 0xb0, 0x0e, 0x2f, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x1a, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x0e, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x13, 0x2f, 0x1b, 0xb1, 0x13, 0x0a, 0x3e, \n\t0x59, 0xb2, 0x7f, 0x0e, 0x01, 0x5d, 0xb0, 0x0e, 0x10, 0xb1, 0x01, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x07, 0x10, \n\t0xb1, 0x04, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x07, 0x10, 0xb0, 0x0a, 0xd0, 0xb0, 0x04, 0x10, 0xb0, 0x0c, 0xd0, \n\t0xb2, 0x12, 0x01, 0x0e, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x23, 0x11, \n\t0x21, 0x11, 0x23, 0x35, 0x33, 0x35, 0x21, 0x15, 0x33, 0x15, 0x23, 0x11, \n\t0x33, 0x13, 0x21, 0x01, 0x01, 0x21, 0x01, 0xf8, 0x50, 0xfe, 0xdc, 0xb7, \n\t0xb7, 0x01, 0x24, 0xc4, 0xc4, 0x48, 0xfb, 0x01, 0x52, 0xfe, 0xa6, 0x01, \n\t0x8f, 0xfe, 0xb1, 0x01, 0xc5, 0xfe, 0x3b, 0x04, 0xb8, 0xb5, 0xab, 0xab, \n\t0xb5, 0xfd, 0xeb, 0x01, 0x97, 0xfe, 0x16, 0xfd, 0xb0, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x88, 0xfe, 0x9b, 0x05, 0xd8, 0x05, 0xb0, 0x02, 0x26, \n\t0x00, 0x2b, 0x00, 0x00, 0x00, 0x07, 0x03, 0x5d, 0x04, 0x5a, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x6b, 0xfe, 0x9b, 0x04, 0xce, 0x04, 0x3a, 0x02, 0x26, \n\t0x01, 0xda, 0x00, 0x00, 0x00, 0x07, 0x03, 0x5d, 0x03, 0x50, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x88, 0x00, 0x00, 0x07, 0x93, 0x05, 0xb0, 0x00, 0x0d, \n\t0x00, 0x62, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, \n\t0x00, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, \n\t0xb1, 0x02, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, \n\t0x1b, 0xb1, 0x0c, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, \n\t0x2f, 0x1b, 0xb1, 0x06, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0a, 0x3e, 0x59, 0xb0, 0x02, 0x10, 0xb1, \n\t0x04, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x00, 0x10, 0xb1, 0x09, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, \n\t0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x01, 0xac, 0x02, 0x52, 0x03, 0x95, \n\t0xfd, 0x8e, 0xfe, 0xdd, 0xfd, 0xae, 0xfe, 0xdc, 0x01, 0x24, 0x03, 0x3e, \n\t0x02, 0x72, 0xe1, 0xfb, 0x31, 0x02, 0x5d, 0xfd, 0xa3, 0x05, 0xb0, 0x00, \n\t0x00, 0x01, 0x00, 0x6b, 0x00, 0x00, 0x05, 0x6a, 0x04, 0x3a, 0x00, 0x0d, \n\t0x00, 0x9a, 0x00, 0xb0, 0x01, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, \n\t0x2f, 0x1b, 0xb1, 0x02, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0a, 0x3e, 0x59, 0xb4, 0x7f, \n\t0x01, 0x8f, 0x01, 0x02, 0x5d, 0xb4, 0x1f, 0x01, 0x2f, 0x01, 0x02, 0x71, \n\t0xb2, 0x8f, 0x01, 0x01, 0x71, 0xb2, 0xef, 0x01, 0x01, 0x71, 0xb2, 0x5f, \n\t0x01, 0x01, 0x72, 0xb2, 0x8f, 0x01, 0x01, 0x72, 0xb2, 0x1f, 0x01, 0x01, \n\t0x72, 0xb2, 0xbf, 0x01, 0x01, 0x71, 0xb4, 0x4f, 0x01, 0x5f, 0x01, 0x02, \n\t0x71, 0xb2, 0xbf, 0x01, 0x01, 0x5d, 0xb2, 0x5f, 0x01, 0x01, 0x5d, 0xb2, \n\t0x2f, 0x01, 0x01, 0x5d, 0xb0, 0x02, 0x10, 0xb1, 0x04, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x01, 0x10, 0xb1, 0x08, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x01, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, \n\t0x11, 0x21, 0x01, 0x8f, 0x01, 0x64, 0x02, 0x77, 0xfe, 0xad, 0xfe, 0xdc, \n\t0xfe, 0x9c, 0xfe, 0xdc, 0x01, 0x24, 0x02, 0x84, 0x01, 0xb6, 0xe1, 0xfc, \n\t0xa7, 0x01, 0xa4, 0xfe, 0x5c, 0x04, 0x3a, 0x00, 0xff, 0xff, 0x00, 0x1c, \n\t0xfe, 0x9b, 0x04, 0x76, 0x05, 0xb0, 0x02, 0x26, 0x00, 0x37, 0x00, 0x00, \n\t0x00, 0x07, 0x03, 0x5d, 0x02, 0x13, 0x00, 0x00, 0xff, 0xff, 0x00, 0x30, \n\t0xfe, 0x9b, 0x04, 0x04, 0x04, 0x3a, 0x02, 0x26, 0x01, 0xdf, 0x00, 0x00, \n\t0x00, 0x07, 0x03, 0x5d, 0x01, 0xe3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x05, \n\t0x00, 0x00, 0x05, 0x07, 0x05, 0xb0, 0x02, 0x06, 0x00, 0x3c, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x10, 0xfe, 0x5f, 0x04, 0x07, 0x04, 0x3a, 0x02, 0x06, \n\t0x01, 0x8d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x05, 0x07, \n\t0x05, 0xb0, 0x00, 0x10, 0x00, 0x4b, 0x00, 0xb0, 0x05, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x10, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x10, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x05, 0x10, 0xb0, 0x01, 0xd0, 0xb0, 0x05, 0x10, 0xb1, 0x06, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0b, \n\t0xd0, 0xb0, 0x05, 0x10, 0xb0, 0x0d, 0xd0, 0x30, 0x31, 0x01, 0x33, 0x01, \n\t0x21, 0x01, 0x33, 0x15, 0x23, 0x07, 0x11, 0x21, 0x11, 0x23, 0x35, 0x33, \n\t0x01, 0x21, 0x02, 0x82, 0x06, 0x01, 0x3f, 0x01, 0x40, 0xfe, 0x6f, 0x68, \n\t0xc8, 0x03, 0xfe, 0xdd, 0xb1, 0x56, 0xfe, 0x70, 0x01, 0x40, 0x03, 0x11, \n\t0x02, 0x9f, 0xfd, 0x0b, 0xb5, 0x06, 0xfe, 0x00, 0x02, 0x06, 0xb5, 0x02, \n\t0xf5, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0xfe, 0x5f, 0x04, 0x07, \n\t0x04, 0x3a, 0x00, 0x11, 0x00, 0x4b, 0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0e, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x0e, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, \n\t0x59, 0xb0, 0x00, 0x10, 0xb0, 0x04, 0xd0, 0xb0, 0x00, 0x10, 0xb1, 0x11, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x06, \n\t0xd0, 0xb0, 0x11, 0x10, 0xb0, 0x0b, 0xd0, 0x30, 0x31, 0x25, 0x23, 0x11, \n\t0x21, 0x11, 0x23, 0x35, 0x33, 0x01, 0x21, 0x13, 0x17, 0x33, 0x37, 0x13, \n\t0x21, 0x01, 0x33, 0x03, 0x63, 0xc6, 0xfe, 0xdc, 0xb5, 0x7b, 0xfe, 0xd1, \n\t0x01, 0x31, 0xb6, 0x13, 0x06, 0x14, 0xb2, 0x01, 0x31, 0xfe, 0xd0, 0x8c, \n\t0x09, 0xfe, 0x56, 0x01, 0xaa, 0xb5, 0x03, 0x7c, 0xfd, 0x59, 0x64, 0x64, \n\t0x02, 0xa7, 0xfc, 0x84, 0xff, 0xff, 0x00, 0x1f, 0xfe, 0x9b, 0x05, 0x23, \n\t0x05, 0xb0, 0x02, 0x26, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x07, 0x03, 0x5d, \n\t0x03, 0xa5, 0x00, 0x00, 0xff, 0xff, 0x00, 0x13, 0xfe, 0x9b, 0x04, 0x32, \n\t0x04, 0x3a, 0x02, 0x26, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x07, 0x03, 0x5d, \n\t0x02, 0xb4, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2b, 0xfe, 0x9f, 0x06, 0xf5, \n\t0x05, 0xb0, 0x00, 0x13, 0x00, 0x4d, 0x00, 0xb0, 0x11, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x10, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x02, 0x10, 0xb1, 0x01, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x09, 0xd0, 0xb0, 0x12, 0x10, 0xb1, 0x0b, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x02, 0x10, \n\t0xb0, 0x0c, 0xd0, 0xb0, 0x0b, 0x10, 0xb0, 0x0e, 0xd0, 0x30, 0x31, 0x01, \n\t0x21, 0x35, 0x21, 0x35, 0x21, 0x15, 0x21, 0x15, 0x21, 0x11, 0x21, 0x11, \n\t0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x21, 0x01, 0x6d, 0xfe, 0xbe, 0x01, \n\t0x42, 0x01, 0x24, 0x01, 0x5a, 0xfe, 0xa6, 0x02, 0x52, 0x01, 0x24, 0xee, \n\t0xfe, 0xdc, 0xfb, 0x9c, 0x04, 0xce, 0xe1, 0x01, 0x01, 0xe1, 0xfc, 0x13, \n\t0x04, 0xcf, 0xfb, 0x3e, 0xfd, 0xb1, 0x01, 0x61, 0x00, 0x01, 0x00, 0x2e, \n\t0xfe, 0x9a, 0x05, 0x52, 0x04, 0x3a, 0x00, 0x0f, 0x00, 0x54, 0x00, 0xb0, \n\t0x0c, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, \n\t0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, \n\t0x08, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, \n\t0xb1, 0x0e, 0x0a, 0x3e, 0x59, 0xb0, 0x02, 0x10, 0xb1, 0x00, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0xd0, 0xb0, \n\t0x05, 0xd0, 0xb0, 0x0e, 0x10, 0xb1, 0x06, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0a, 0xd0, 0x30, 0x31, 0x01, 0x23, \n\t0x35, 0x21, 0x15, 0x23, 0x11, 0x21, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, \n\t0x11, 0x21, 0x01, 0x08, 0xda, 0x02, 0xc3, 0xc5, 0x01, 0x66, 0x01, 0x24, \n\t0x9c, 0xfe, 0xdd, 0xfc, 0xd9, 0x03, 0x59, 0xe1, 0xe1, 0xfd, 0x87, 0x03, \n\t0x5a, 0xfc, 0xa6, 0xfd, 0xba, 0x01, 0x66, 0x00, 0xff, 0xff, 0x00, 0x8b, \n\t0xfe, 0x9b, 0x05, 0xbf, 0x05, 0xb0, 0x02, 0x26, 0x01, 0xcd, 0x00, 0x00, \n\t0x00, 0x07, 0x03, 0x5d, 0x04, 0x41, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, \n\t0xfe, 0x9b, 0x04, 0xc8, 0x04, 0x3a, 0x02, 0x26, 0x01, 0xe3, 0x00, 0x00, \n\t0x00, 0x07, 0x03, 0x5d, 0x03, 0x4a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8b, \n\t0x00, 0x00, 0x05, 0x08, 0x05, 0xb0, 0x00, 0x1c, 0x00, 0x45, 0x00, 0xb0, \n\t0x09, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1c, 0x2f, 0x1b, 0xb1, 0x1c, \n\t0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, \n\t0x0f, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, \n\t0xb1, 0x02, 0x0a, 0x3e, 0x59, 0xb0, 0x09, 0x10, 0xb0, 0x06, 0xd0, 0xb0, \n\t0x09, 0x10, 0xb1, 0x14, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x17, 0xd0, 0x30, 0x31, 0x01, 0x11, 0x21, 0x11, 0x06, \n\t0x07, 0x07, 0x15, 0x23, 0x35, 0x26, 0x27, 0x26, 0x35, 0x11, 0x21, 0x11, \n\t0x14, 0x17, 0x16, 0x17, 0x11, 0x33, 0x11, 0x36, 0x33, 0x36, 0x37, 0x11, \n\t0x05, 0x08, 0xfe, 0xdb, 0x42, 0x52, 0x10, 0xa7, 0xf2, 0x89, 0x92, 0x01, \n\t0x24, 0x3f, 0x37, 0x73, 0xa7, 0x07, 0x07, 0x54, 0x42, 0x05, 0xb0, 0xfa, \n\t0x50, 0x02, 0x31, 0x10, 0x09, 0x02, 0xf3, 0xed, 0x08, 0x6c, 0x74, 0xf3, \n\t0x01, 0xc5, 0xfe, 0x3b, 0x8e, 0x36, 0x2f, 0x06, 0x01, 0x25, 0xfe, 0xe1, \n\t0x01, 0x09, 0x10, 0x02, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x67, \n\t0x00, 0x00, 0x04, 0x11, 0x04, 0x3a, 0x00, 0x1d, 0x00, 0x45, 0x00, 0xb0, \n\t0x14, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, \n\t0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1c, 0x2f, 0x1b, 0xb1, \n\t0x1c, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, \n\t0xb1, 0x01, 0x0a, 0x3e, 0x59, 0xb0, 0x14, 0x10, 0xb1, 0x09, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x06, 0xd0, 0xb0, \n\t0x14, 0x10, 0xb0, 0x17, 0xd0, 0x30, 0x31, 0x21, 0x21, 0x11, 0x06, 0x07, \n\t0x22, 0x07, 0x15, 0x23, 0x35, 0x26, 0x27, 0x26, 0x35, 0x11, 0x21, 0x11, \n\t0x14, 0x17, 0x16, 0x17, 0x11, 0x33, 0x11, 0x36, 0x37, 0x36, 0x37, 0x11, \n\t0x21, 0x04, 0x11, 0xfe, 0xdc, 0x25, 0x27, 0x07, 0x07, 0xa7, 0xa2, 0x62, \n\t0x81, 0x01, 0x24, 0x2f, 0x13, 0x1f, 0xa7, 0x08, 0x07, 0x25, 0x26, 0x01, \n\t0x24, 0x01, 0x57, 0x08, 0x04, 0x01, 0x92, 0x96, 0x12, 0x4e, 0x66, 0xd2, \n\t0x01, 0x54, 0xfe, 0xac, 0x6b, 0x29, 0x11, 0x0a, 0x01, 0x02, 0xfe, 0xf2, \n\t0x01, 0x01, 0x04, 0x08, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4e, \n\t0x00, 0x00, 0x04, 0xcb, 0x05, 0xb0, 0x00, 0x13, 0x00, 0x3c, 0x00, 0xb0, \n\t0x06, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, \n\t0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, \n\t0x00, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, \n\t0xb1, 0x0a, 0x0a, 0x3e, 0x59, 0xb0, 0x06, 0x10, 0xb1, 0x0f, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x33, 0x11, \n\t0x21, 0x11, 0x36, 0x36, 0x33, 0x20, 0x04, 0x15, 0x11, 0x21, 0x11, 0x34, \n\t0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x4e, 0x01, 0x25, 0x42, 0xa4, 0x41, \n\t0x01, 0x0b, 0x01, 0x26, 0xfe, 0xdc, 0x80, 0x8d, 0x3e, 0xa7, 0x42, 0x05, \n\t0xb0, 0xfd, 0xcf, 0x0e, 0x13, 0xe9, 0xf2, 0xfe, 0x3b, 0x01, 0xc5, 0x8d, \n\t0x6d, 0x13, 0x0e, 0xfd, 0x62, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5f, \n\t0x00, 0x02, 0x04, 0x09, 0x04, 0x3c, 0x01, 0x0f, 0x01, 0xe3, 0x04, 0x70, \n\t0x04, 0x3c, 0xc0, 0x02, 0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x13, 0x2f, 0x1b, 0xb1, 0x13, 0x0a, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, \n\t0x00, 0x02, 0xff, 0xee, 0xff, 0xe9, 0x06, 0x08, 0x05, 0xc4, 0x00, 0x1c, \n\t0x00, 0x25, 0x00, 0x56, 0x00, 0xb0, 0x11, 0x2f, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, 0x59, 0xb0, 0x11, \n\t0x10, 0xb0, 0x03, 0xd0, 0xb0, 0x11, 0x10, 0xb1, 0x22, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0a, 0xd0, 0xb0, 0x00, \n\t0x10, 0xb1, 0x16, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x0d, 0x10, 0xb1, 0x1d, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x05, 0x20, 0x00, 0x03, 0x26, 0x26, \n\t0x35, 0x33, 0x14, 0x16, 0x17, 0x12, 0x00, 0x17, 0x20, 0x00, 0x11, 0x15, \n\t0x21, 0x07, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x03, \n\t0x22, 0x06, 0x07, 0x17, 0x21, 0x35, 0x34, 0x26, 0x04, 0x06, 0xfe, 0xad, \n\t0xfe, 0x89, 0x0c, 0x9b, 0xa7, 0xc4, 0x42, 0x42, 0x21, 0x01, 0x60, 0xf5, \n\t0x01, 0x24, 0x01, 0x38, 0xfc, 0x54, 0x02, 0x09, 0xd0, 0xd3, 0x74, 0xba, \n\t0x4c, 0x31, 0x34, 0xdf, 0xf2, 0x8d, 0xae, 0x13, 0x02, 0x02, 0x85, 0x96, \n\t0x17, 0x01, 0x75, 0x01, 0x39, 0x18, 0xdc, 0xaf, 0x56, 0x70, 0x15, 0x01, \n\t0x11, 0x01, 0x54, 0x01, 0xfe, 0x94, 0xfe, 0xc2, 0x96, 0x06, 0xbe, 0xe5, \n\t0x26, 0x1c, 0xe1, 0x1c, 0x36, 0x04, 0xe8, 0xcb, 0xa2, 0x05, 0x1f, 0x99, \n\t0xba, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0xff, 0xeb, 0x04, 0x6f, \n\t0x04, 0x4e, 0x00, 0x1c, 0x00, 0x25, 0x00, 0x7b, 0x00, 0xb0, 0x11, 0x2f, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x0e, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, \n\t0x3e, 0x59, 0xb2, 0xff, 0x11, 0x01, 0x5d, 0xb2, 0x8f, 0x11, 0x01, 0x71, \n\t0xb2, 0x9f, 0x11, 0x01, 0x72, 0xb2, 0x1f, 0x11, 0x01, 0x72, 0xb2, 0x4f, \n\t0x11, 0x01, 0x71, 0xb2, 0xbf, 0x11, 0x01, 0x5d, 0xb4, 0x5f, 0x11, 0x6f, \n\t0x11, 0x02, 0x5d, 0xb0, 0x11, 0x10, 0xb0, 0x03, 0xd0, 0xb0, 0x11, 0x10, \n\t0xb1, 0x22, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x0a, 0xd0, 0xb0, 0x00, 0x10, 0xb1, 0x16, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0d, 0x10, 0xb1, 0x1d, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x05, \n\t0x22, 0x00, 0x27, 0x26, 0x26, 0x35, 0x33, 0x14, 0x16, 0x17, 0x36, 0x36, \n\t0x33, 0x32, 0x12, 0x15, 0x15, 0x21, 0x07, 0x16, 0x16, 0x33, 0x32, 0x36, \n\t0x37, 0x17, 0x06, 0x06, 0x03, 0x22, 0x06, 0x07, 0x17, 0x21, 0x35, 0x34, \n\t0x26, 0x02, 0xbc, 0xe4, 0xfe, 0xea, 0x08, 0x7b, 0x83, 0xb7, 0x29, 0x29, \n\t0x22, 0xfc, 0xbf, 0xdb, 0xf2, 0xfd, 0x7a, 0x02, 0x08, 0x7f, 0x6d, 0x61, \n\t0x80, 0x4c, 0x4f, 0x42, 0xd6, 0x9d, 0x51, 0x5e, 0x0b, 0x03, 0x01, 0x66, \n\t0x57, 0x15, 0x01, 0x1b, 0xdd, 0x24, 0xc6, 0x94, 0x3f, 0x5e, 0x1b, 0xbf, \n\t0xe6, 0xfe, 0xf8, 0xe1, 0x9f, 0x06, 0x6b, 0x8a, 0x27, 0x2a, 0xb4, 0x36, \n\t0x47, 0x03, 0x82, 0x7c, 0x65, 0x05, 0x1a, 0x5d, 0x6f, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x9a, 0x00, 0x00, 0x01, 0xbe, 0x05, 0xb0, 0x02, 0x06, \n\t0x00, 0x2c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2a, 0xfe, 0xab, 0x06, 0x29, \n\t0x05, 0xb0, 0x02, 0x26, 0x01, 0xc3, 0x00, 0x00, 0x00, 0x07, 0x00, 0x0f, \n\t0x04, 0x88, 0xff, 0xd9, 0xff, 0xff, 0x00, 0x0f, 0xfe, 0xab, 0x05, 0x23, \n\t0x04, 0x3a, 0x02, 0x26, 0x01, 0xd8, 0x00, 0x00, 0x00, 0x07, 0x00, 0x0f, \n\t0x03, 0x82, 0xff, 0xd9, 0x00, 0x01, 0x00, 0x88, 0xfe, 0x4b, 0x05, 0x21, \n\t0x05, 0xb0, 0x00, 0x17, 0x00, 0x62, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x10, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0c, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x15, 0x2f, 0x1b, 0xb1, 0x15, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x08, 0x10, 0xb1, 0x0f, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x01, 0x10, 0xb1, 0x14, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x11, 0x21, 0x11, \n\t0x21, 0x11, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, \n\t0x32, 0x36, 0x35, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0xac, 0x02, 0x52, \n\t0x01, 0x23, 0xca, 0xb4, 0x28, 0x44, 0x24, 0x0e, 0x17, 0x32, 0x1b, 0x39, \n\t0x40, 0xfd, 0xae, 0xfe, 0xdc, 0x05, 0xb0, 0xfd, 0x8e, 0x02, 0x72, 0xfa, \n\t0x28, 0xbe, 0xcf, 0x08, 0x09, 0xdd, 0x06, 0x07, 0x5a, 0x52, 0x02, 0x85, \n\t0xfd, 0xa3, 0x05, 0xb0, 0x00, 0x01, 0x00, 0x6b, 0xfe, 0x4b, 0x04, 0x17, \n\t0x04, 0x3a, 0x00, 0x17, 0x00, 0x62, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x18, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0e, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0c, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x15, 0x2f, 0x1b, 0xb1, 0x15, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x08, 0x10, 0xb1, 0x0f, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x01, 0x10, 0xb1, 0x14, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x11, 0x21, 0x11, \n\t0x21, 0x11, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, \n\t0x32, 0x36, 0x35, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0x8f, 0x01, 0x64, \n\t0x01, 0x24, 0xca, 0xb4, 0x28, 0x44, 0x24, 0x0e, 0x17, 0x31, 0x1b, 0x39, \n\t0x40, 0xfe, 0x9c, 0xfe, 0xdc, 0x04, 0x3a, 0xfe, 0x4a, 0x01, 0xb6, 0xfb, \n\t0x9e, 0xbe, 0xcf, 0x08, 0x09, 0xdd, 0x06, 0x07, 0x5a, 0x52, 0x01, 0xcc, \n\t0xfe, 0x5c, 0x04, 0x3a, 0xff, 0xff, 0x00, 0x88, 0xfe, 0xab, 0x06, 0x2b, \n\t0x05, 0xb0, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x07, 0x00, 0x0f, \n\t0x04, 0x8a, 0xff, 0xd9, 0xff, 0xff, 0x00, 0x6b, 0xfe, 0xab, 0x05, 0x21, \n\t0x04, 0x3a, 0x02, 0x26, 0x01, 0xda, 0x00, 0x00, 0x00, 0x07, 0x00, 0x0f, \n\t0x03, 0x80, 0xff, 0xd9, 0xff, 0xff, 0x00, 0x8b, 0xfe, 0x9b, 0x05, 0x08, \n\t0x05, 0xb0, 0x02, 0x26, 0x01, 0xcd, 0x00, 0x00, 0x00, 0x07, 0x03, 0x5d, \n\t0x02, 0xca, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xfe, 0x9b, 0x04, 0x11, \n\t0x04, 0x3a, 0x02, 0x26, 0x01, 0xe3, 0x00, 0x00, 0x00, 0x07, 0x03, 0x5d, \n\t0x01, 0xd3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x88, 0xfe, 0xab, 0x07, 0x7c, \n\t0x05, 0xb0, 0x02, 0x26, 0x00, 0x30, 0x00, 0x00, 0x00, 0x07, 0x00, 0x0f, \n\t0x05, 0xdb, 0xff, 0xd9, 0xff, 0xff, 0x00, 0x81, 0xfe, 0xab, 0x06, 0x92, \n\t0x04, 0x3a, 0x02, 0x26, 0x01, 0xd9, 0x00, 0x00, 0x00, 0x07, 0x00, 0x0f, \n\t0x04, 0xf1, 0xff, 0xd9, 0xff, 0xff, 0x00, 0x9a, 0x00, 0x00, 0x01, 0xbe, \n\t0x05, 0xb0, 0x02, 0x06, 0x00, 0x2c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0c, \n\t0x00, 0x00, 0x05, 0x1f, 0x07, 0x68, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x54, 0x00, 0xcb, 0x01, 0xb8, 0x00, 0x09, 0x00, 0xb3, \n\t0x10, 0x08, 0x04, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x37, \n\t0xff, 0xeb, 0x04, 0x0f, 0x06, 0x26, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, \n\t0x01, 0x06, 0x01, 0x54, 0x5c, 0x76, 0x00, 0x09, 0x00, 0xb3, 0x30, 0x09, \n\t0x19, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0c, \n\t0x00, 0x00, 0x05, 0x1f, 0x07, 0x0d, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x6a, 0x00, 0x74, 0x01, 0x5d, 0x00, 0x0f, 0x00, 0xb3, \n\t0x10, 0x08, 0x04, 0x04, 0x2b, 0xb0, 0x10, 0x10, 0xb0, 0x0d, 0xd0, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x37, 0xff, 0xeb, 0x04, 0x0f, \n\t0x05, 0xcb, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x00, 0x6a, \n\t0x05, 0x1b, 0x00, 0x0f, 0x00, 0xb3, 0x30, 0x09, 0x19, 0x04, 0x2b, 0xb0, \n\t0x30, 0x10, 0xb0, 0x2d, 0xd0, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x03, \n\t0x00, 0x00, 0x07, 0x49, 0x05, 0xb0, 0x02, 0x06, 0x00, 0x88, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x2e, 0xff, 0xeb, 0x06, 0x8d, 0x04, 0x4e, 0x02, 0x06, \n\t0x00, 0xa8, 0x00, 0x00, 0xff, 0xff, 0x00, 0x88, 0x00, 0x00, 0x04, 0x6d, \n\t0x07, 0x68, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x01, 0x54, \n\t0x00, 0x98, 0x01, 0xb8, 0x00, 0x09, 0x00, 0xb3, 0x10, 0x08, 0x06, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x4d, 0xff, 0xeb, 0x04, 0x02, \n\t0x06, 0x27, 0x02, 0x26, 0x00, 0x48, 0x00, 0x00, 0x01, 0x06, 0x01, 0x54, \n\t0x5e, 0x77, 0x00, 0x09, 0x00, 0xb3, 0x24, 0x09, 0x07, 0x04, 0x2b, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x56, 0xff, 0xea, 0x05, 0x57, \n\t0x05, 0xc5, 0x00, 0x16, 0x00, 0x1f, 0x00, 0x4d, 0x00, 0xb0, 0x0b, 0x2f, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x10, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x10, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x07, 0x10, 0xb1, 0x17, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0b, 0x10, 0xb1, \n\t0x1c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, \n\t0x31, 0x01, 0x20, 0x00, 0x11, 0x15, 0x10, 0x00, 0x25, 0x20, 0x00, 0x11, \n\t0x35, 0x21, 0x37, 0x26, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, \n\t0x13, 0x32, 0x36, 0x37, 0x27, 0x21, 0x15, 0x14, 0x16, 0x02, 0x80, 0x01, \n\t0x5e, 0x01, 0x79, 0xfe, 0x92, 0xfe, 0xf1, 0xfe, 0xc8, 0xfe, 0xb4, 0x03, \n\t0xd4, 0x02, 0x09, 0xd1, 0xd2, 0x75, 0xb9, 0x4c, 0x31, 0x35, 0xdd, 0xf3, \n\t0x8c, 0xae, 0x14, 0x02, 0xfd, 0x53, 0xa8, 0x05, 0xc5, 0xfe, 0x71, 0xfe, \n\t0xb5, 0x2a, 0xfe, 0xc2, 0xfe, 0x67, 0x01, 0x01, 0x6b, 0x01, 0x3e, 0x96, \n\t0x06, 0xbc, 0xe7, 0x27, 0x1b, 0xe1, 0x1c, 0x37, 0xfb, 0x17, 0xca, 0xa3, \n\t0x05, 0x1f, 0x9a, 0xb9, 0xff, 0xff, 0x00, 0x5f, 0xff, 0xeb, 0x04, 0x14, \n\t0x04, 0x4f, 0x01, 0x0f, 0x00, 0x48, 0x04, 0x61, 0x04, 0x3a, 0xc0, 0x02, \n\t0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, \n\t0x07, 0x0a, 0x3e, 0x59, 0xb0, 0x17, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x56, 0xff, 0xea, 0x05, 0x57, 0x06, 0xd6, 0x02, 0x26, \n\t0x02, 0x4e, 0x00, 0x00, 0x01, 0x07, 0x00, 0x6a, 0x00, 0x8d, 0x01, 0x26, \n\t0x00, 0x0f, 0x00, 0xb3, 0x24, 0x08, 0x00, 0x04, 0x2b, 0xb0, 0x24, 0x10, \n\t0xb0, 0x21, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5f, \n\t0xff, 0xeb, 0x04, 0x14, 0x05, 0xcb, 0x00, 0x2f, 0x00, 0x48, 0x04, 0x61, \n\t0x04, 0x3a, 0xc0, 0x02, 0x01, 0x06, 0x00, 0x6a, 0x19, 0x1b, 0x00, 0x57, \n\t0x00, 0xb0, 0x27, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, \n\t0xb1, 0x07, 0x0a, 0x3e, 0x59, 0xb0, 0x17, 0xd0, 0xb2, 0xc0, 0x27, 0x01, \n\t0x5d, 0xb4, 0x00, 0x27, 0x10, 0x27, 0x02, 0x72, 0xb2, 0x60, 0x27, 0x01, \n\t0x72, 0xb2, 0x6f, 0x27, 0x01, 0x71, 0xb2, 0xaf, 0x27, 0x01, 0x71, 0xb2, \n\t0x8f, 0x27, 0x01, 0x71, 0xb2, 0x3f, 0x27, 0x01, 0x5d, 0xb2, 0x40, 0x27, \n\t0x01, 0x72, 0xb4, 0xd0, 0x27, 0xe0, 0x27, 0x02, 0x71, 0xb2, 0xa0, 0x27, \n\t0x01, 0x5d, 0xb2, 0x80, 0x27, 0x01, 0x72, 0xb0, 0x27, 0x10, 0xb0, 0x22, \n\t0xd0, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x12, 0x00, 0x00, 0x07, 0xe9, \n\t0x07, 0x0d, 0x02, 0x26, 0x03, 0xd2, 0x00, 0x00, 0x01, 0x07, 0x00, 0x6a, \n\t0x01, 0xe3, 0x01, 0x5d, 0x00, 0x0f, 0x00, 0xb3, 0x1a, 0x08, 0x0d, 0x04, \n\t0x2b, 0xb0, 0x1a, 0x10, 0xb0, 0x17, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x19, 0x00, 0x00, 0x06, 0xc7, 0x05, 0xb6, 0x02, 0x26, \n\t0x03, 0xdc, 0x00, 0x00, 0x01, 0x07, 0x00, 0x6a, 0x01, 0x55, 0x00, 0x06, \n\t0x00, 0x0f, 0x00, 0xb3, 0x1a, 0x09, 0x0d, 0x04, 0x2b, 0xb0, 0x1a, 0x10, \n\t0xb0, 0x17, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x57, \n\t0xff, 0xeb, 0x04, 0xe2, 0x07, 0x22, 0x02, 0x26, 0x01, 0xbf, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x6a, 0x00, 0x81, 0x01, 0x72, 0x00, 0x0f, 0x00, 0xb3, \n\t0x2f, 0x08, 0x0e, 0x04, 0x2b, 0xb0, 0x2f, 0x10, 0xb0, 0x2c, 0xd0, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x46, 0xff, 0xec, 0x03, 0xdc, \n\t0x05, 0xca, 0x02, 0x26, 0x03, 0xdd, 0x00, 0x00, 0x01, 0x06, 0x00, 0x6a, \n\t0xf7, 0x1a, 0x00, 0x0f, 0x00, 0xb3, 0x2f, 0x09, 0x0e, 0x04, 0x2b, 0xb0, \n\t0x2f, 0x10, 0xb0, 0x2c, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x01, 0x00, 0x54, \n\t0xff, 0xeb, 0x04, 0x61, 0x05, 0xb0, 0x00, 0x1c, 0x00, 0x5b, 0x00, 0xb0, \n\t0x1c, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, \n\t0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, \n\t0x0c, 0x0a, 0x3e, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x01, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x05, 0x01, 0x03, 0x11, \n\t0x12, 0x39, 0xb0, 0x1c, 0x10, 0xb1, 0x1b, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x06, 0x1b, 0x1c, 0x11, 0x12, 0x39, \n\t0xb0, 0x0c, 0x10, 0xb1, 0x14, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x27, 0x21, 0x35, 0x21, 0x17, 0x01, \n\t0x16, 0x16, 0x15, 0x14, 0x04, 0x23, 0x22, 0x24, 0x37, 0x37, 0x21, 0x14, \n\t0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x02, 0xef, \n\t0x03, 0xfd, 0xa4, 0x03, 0xb2, 0x01, 0xfe, 0x93, 0xbe, 0xcd, 0xfe, 0xd9, \n\t0xed, 0xd0, 0xfe, 0xd7, 0x05, 0x02, 0x01, 0x1b, 0x76, 0x61, 0x6f, 0x81, \n\t0x8c, 0x8c, 0x87, 0x04, 0xc9, 0x06, 0xe1, 0xb7, 0xfe, 0x68, 0x1f, 0xeb, \n\t0xbf, 0xc9, 0xe4, 0xd6, 0xcd, 0x06, 0x56, 0x73, 0x75, 0x5b, 0x8f, 0x82, \n\t0xb6, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x54, 0xfe, 0x75, 0x04, 0x61, \n\t0x04, 0x3a, 0x00, 0x1c, 0x00, 0x4e, 0x00, 0xb0, 0x0c, 0x2f, 0xb0, 0x1c, \n\t0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0e, \n\t0x3e, 0x59, 0xb1, 0x01, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb2, 0x05, 0x00, 0x03, 0x11, 0x12, 0x39, 0xb0, 0x1c, 0x10, \n\t0xb1, 0x1b, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb2, 0x06, 0x1c, 0x1b, 0x11, 0x12, 0x39, 0xb0, 0x0c, 0x10, 0xb1, 0x14, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x01, 0x27, 0x21, 0x35, 0x21, 0x17, 0x01, 0x16, 0x16, 0x15, 0x14, 0x04, \n\t0x23, 0x22, 0x24, 0x37, 0x37, 0x21, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, \n\t0x34, 0x26, 0x23, 0x23, 0x35, 0x02, 0xe9, 0x02, 0xfd, 0xa2, 0x03, 0xb9, \n\t0x01, 0xfe, 0x97, 0xbc, 0xcb, 0xfe, 0xd9, 0xed, 0xd0, 0xfe, 0xd7, 0x05, \n\t0x02, 0x01, 0x1b, 0x76, 0x61, 0x6f, 0x81, 0x8c, 0x8c, 0x87, 0x03, 0x53, \n\t0x05, 0xe2, 0xb8, 0xfe, 0x68, 0x20, 0xeb, 0xbe, 0xc7, 0xe5, 0xd7, 0xcb, \n\t0x06, 0x54, 0x73, 0x75, 0x59, 0x8f, 0x83, 0xb5, 0xff, 0xff, 0x00, 0x7e, \n\t0x00, 0x00, 0x05, 0x17, 0x06, 0xf2, 0x02, 0x26, 0x01, 0xc0, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x71, 0x00, 0xcb, 0x01, 0x41, 0x00, 0x09, 0x00, 0xb3, \n\t0x0d, 0x08, 0x08, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x6b, \n\t0x00, 0x00, 0x04, 0x19, 0x05, 0x9d, 0x02, 0x26, 0x01, 0xd5, 0x00, 0x00, \n\t0x01, 0x06, 0x00, 0x71, 0x42, 0xec, 0x00, 0x09, 0x00, 0xb3, 0x0d, 0x09, \n\t0x08, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7e, \n\t0x00, 0x00, 0x05, 0x17, 0x07, 0x0d, 0x02, 0x26, 0x01, 0xc0, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x6a, 0x00, 0xb0, 0x01, 0x5d, 0x00, 0x0f, 0x00, 0xb3, \n\t0x11, 0x08, 0x08, 0x04, 0x2b, 0xb0, 0x11, 0x10, 0xb0, 0x0d, 0xd0, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6b, 0x00, 0x00, 0x04, 0x19, \n\t0x05, 0xb6, 0x02, 0x26, 0x01, 0xd5, 0x00, 0x00, 0x01, 0x06, 0x00, 0x6a, \n\t0x27, 0x06, 0x00, 0x0f, 0x00, 0xb3, 0x11, 0x09, 0x08, 0x04, 0x2b, 0xb0, \n\t0x11, 0x10, 0xb0, 0x0d, 0xd0, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x5c, \n\t0xff, 0xeb, 0x05, 0x1b, 0x07, 0x22, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x6a, 0x00, 0xa0, 0x01, 0x72, 0x00, 0x0f, 0x00, 0xb3, \n\t0x20, 0x08, 0x0a, 0x04, 0x2b, 0xb0, 0x20, 0x10, 0xb0, 0x1d, 0xd0, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x43, 0xff, 0xeb, 0x04, 0x40, \n\t0x05, 0xcb, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x00, 0x6a, \n\t0x26, 0x1b, 0x00, 0x0f, 0x00, 0xb3, 0x20, 0x09, 0x03, 0x04, 0x2b, 0xb0, \n\t0x20, 0x10, 0xb0, 0x1d, 0xd0, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x56, \n\t0xff, 0xec, 0x04, 0xa7, 0x07, 0x23, 0x02, 0x26, 0x01, 0xcf, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x6a, 0x00, 0x68, 0x01, 0x73, 0x00, 0x0f, 0x00, 0xb3, \n\t0x26, 0x08, 0x04, 0x04, 0x2b, 0xb0, 0x26, 0x10, 0xb0, 0x23, 0xd0, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0xeb, 0x03, 0xee, \n\t0x05, 0xcb, 0x02, 0x26, 0x01, 0xe8, 0x00, 0x00, 0x01, 0x06, 0x00, 0x6a, \n\t0xfd, 0x1b, 0x00, 0x0f, 0x00, 0xb3, 0x26, 0x09, 0x08, 0x04, 0x2b, 0xb0, \n\t0x26, 0x10, 0xb0, 0x23, 0xd0, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x05, \n\t0xfe, 0x4b, 0x04, 0x11, 0x05, 0x9d, 0x02, 0x26, 0x00, 0x5c, 0x00, 0x00, \n\t0x01, 0x06, 0x00, 0x71, 0x0b, 0xec, 0x00, 0x09, 0x00, 0xb3, 0x17, 0x09, \n\t0x14, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x05, \n\t0xfe, 0x4b, 0x04, 0x11, 0x05, 0xb6, 0x02, 0x26, 0x00, 0x5c, 0x00, 0x00, \n\t0x01, 0x06, 0x00, 0x6a, 0xf2, 0x06, 0x00, 0x0f, 0x00, 0xb3, 0x1b, 0x09, \n\t0x14, 0x04, 0x2b, 0xb0, 0x1b, 0x10, 0xb0, 0x17, 0xd0, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x05, 0xfe, 0x4b, 0x04, 0x39, 0x05, 0xf4, 0x02, 0x26, \n\t0x00, 0x5c, 0x00, 0x00, 0x01, 0x06, 0x01, 0x59, 0x49, 0x06, 0x00, 0x0f, \n\t0x00, 0xb3, 0x20, 0x08, 0x14, 0x04, 0x2b, 0xb0, 0x20, 0x10, 0xb0, 0x19, \n\t0xd0, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x8b, 0x00, 0x00, 0x05, 0x08, \n\t0x07, 0x0d, 0x02, 0x26, 0x01, 0xcd, 0x00, 0x00, 0x01, 0x07, 0x00, 0x6a, \n\t0x00, 0xda, 0x01, 0x5d, 0x00, 0x0f, 0x00, 0xb3, 0x19, 0x08, 0x0a, 0x04, \n\t0x2b, 0xb0, 0x19, 0x10, 0xb0, 0x15, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x67, 0x00, 0x00, 0x04, 0x11, 0x05, 0xb6, 0x02, 0x26, \n\t0x01, 0xe3, 0x00, 0x00, 0x01, 0x06, 0x00, 0x6a, 0x1f, 0x06, 0x00, 0x0f, \n\t0x00, 0xb3, 0x19, 0x09, 0x09, 0x04, 0x2b, 0xb0, 0x19, 0x10, 0xb0, 0x15, \n\t0xd0, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x88, 0xfe, 0x9b, 0x04, 0x3d, \n\t0x05, 0xb0, 0x02, 0x26, 0x01, 0x6e, 0x00, 0x00, 0x00, 0x07, 0x03, 0x5d, \n\t0x00, 0xe5, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6b, 0xfe, 0x9b, 0x03, 0x4e, \n\t0x04, 0x3a, 0x02, 0x26, 0x01, 0xd3, 0x00, 0x00, 0x00, 0x07, 0x03, 0x5d, \n\t0x00, 0x9d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x95, 0x00, 0x00, 0x06, 0x7d, \n\t0x07, 0x0d, 0x02, 0x26, 0x01, 0xce, 0x00, 0x00, 0x01, 0x07, 0x00, 0x6a, \n\t0x01, 0x61, 0x01, 0x5d, 0x00, 0x0f, 0x00, 0xb3, 0x1d, 0x08, 0x09, 0x04, \n\t0x2b, 0xb0, 0x1d, 0x10, 0xb0, 0x19, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x95, 0x00, 0x00, 0x05, 0xe3, 0x05, 0xb6, 0x00, 0x26, \n\t0x01, 0xe7, 0x14, 0x00, 0x00, 0x27, 0x00, 0xf3, 0x04, 0x3a, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x6a, 0x01, 0x35, 0x00, 0x06, 0x00, 0x0f, 0x00, 0xb3, \n\t0x1d, 0x09, 0x09, 0x04, 0x2b, 0xb0, 0x1d, 0x10, 0xb0, 0x19, 0xd0, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4b, 0xfe, 0x4b, 0x04, 0x89, \n\t0x05, 0xb0, 0x00, 0x26, 0x01, 0x6e, 0x4c, 0x00, 0x00, 0x26, 0x03, 0x46, \n\t0xaf, 0x3f, 0x00, 0x07, 0x03, 0x5f, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x4c, 0xfe, 0x4b, 0x03, 0xb0, 0x04, 0x3a, 0x00, 0x26, \n\t0x01, 0xd3, 0x62, 0x00, 0x00, 0x26, 0x03, 0x46, 0xb0, 0x91, 0x01, 0x07, \n\t0x03, 0x5f, 0x00, 0xf6, 0x00, 0x00, 0x00, 0x08, 0x00, 0xb2, 0x00, 0x06, \n\t0x01, 0x5d, 0x30, 0x31, 0xff, 0xff, 0x00, 0x1f, 0xfe, 0x4b, 0x05, 0x90, \n\t0x05, 0xb0, 0x02, 0x26, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x07, 0x03, 0x5f, \n\t0x03, 0xe5, 0x00, 0x00, 0xff, 0xff, 0x00, 0x13, 0xfe, 0x4b, 0x04, 0x9f, \n\t0x04, 0x3a, 0x02, 0x26, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x07, 0x03, 0x5f, \n\t0x02, 0xf4, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1f, 0x00, 0x00, 0x05, 0x07, \n\t0x05, 0xb0, 0x00, 0x11, 0x00, 0x68, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x10, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0a, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x11, 0x10, 0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x04, 0xd0, 0xb0, 0x00, 0x10, 0xb0, 0x07, 0xd0, \n\t0xb0, 0x11, 0x10, 0xb0, 0x09, 0xd0, 0xb0, 0x11, 0x10, 0xb0, 0x0d, 0xd0, \n\t0x30, 0x31, 0x01, 0x23, 0x01, 0x21, 0x01, 0x01, 0x21, 0x01, 0x23, 0x35, \n\t0x33, 0x01, 0x21, 0x01, 0x01, 0x21, 0x01, 0x33, 0x03, 0xe2, 0x74, 0x01, \n\t0x99, 0xfe, 0x9f, 0xfe, 0xe7, 0xfe, 0xe7, 0xfe, 0xab, 0x01, 0x8c, 0x68, \n\t0x59, 0xfe, 0x8e, 0x01, 0x52, 0x01, 0x0d, 0x01, 0x11, 0x01, 0x54, 0xfe, \n\t0x8d, 0x67, 0x02, 0x90, 0xfd, 0x70, 0x02, 0x0d, 0xfd, 0xf3, 0x02, 0x90, \n\t0xb5, 0x02, 0x6b, 0xfd, 0xfc, 0x02, 0x04, 0xfd, 0x95, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x13, 0x00, 0x00, 0x04, 0x08, 0x04, 0x3a, 0x00, 0x12, \n\t0x00, 0x5e, 0x00, 0xb0, 0x12, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, \n\t0x2f, 0x1b, 0xb1, 0x0b, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x0a, 0x3e, 0x59, 0xb0, 0x12, \n\t0x10, 0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x04, 0xd0, 0xb0, 0x00, 0x10, 0xb0, 0x07, 0xd0, 0xb0, 0x12, \n\t0x10, 0xb0, 0x09, 0xd0, 0xb0, 0x12, 0x10, 0xb0, 0x0e, 0xd0, 0x30, 0x31, \n\t0x01, 0x23, 0x01, 0x21, 0x03, 0x03, 0x21, 0x01, 0x23, 0x35, 0x33, 0x01, \n\t0x21, 0x13, 0x33, 0x13, 0x21, 0x01, 0x33, 0x03, 0x61, 0x78, 0x01, 0x1f, \n\t0xfe, 0xb7, 0xb1, 0xb1, 0xfe, 0xb6, 0x01, 0x1e, 0x6f, 0x65, 0xfe, 0xf6, \n\t0x01, 0x48, 0xa2, 0x06, 0xa6, 0x01, 0x4a, 0xfe, 0xf6, 0x6e, 0x01, 0xd1, \n\t0xfe, 0x2f, 0x01, 0x67, 0xfe, 0x99, 0x01, 0xd1, 0xb5, 0x01, 0xb4, 0xfe, \n\t0xa8, 0x01, 0x58, 0xfe, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x4c, \n\t0x00, 0x00, 0x04, 0x8d, 0x05, 0xb0, 0x00, 0x0a, 0x00, 0x13, 0x00, 0x3b, \n\t0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, \n\t0xb1, 0x01, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, \n\t0x1b, 0xb1, 0x03, 0x0a, 0x3e, 0x59, 0xb1, 0x0b, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x0c, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, \n\t0x11, 0x21, 0x11, 0x21, 0x22, 0x00, 0x35, 0x34, 0x00, 0x33, 0x13, 0x11, \n\t0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x03, 0x69, 0x01, 0x24, 0xfd, \n\t0xe1, 0xfb, 0xfe, 0xd9, 0x01, 0x27, 0xfb, 0xfb, 0xfb, 0x7b, 0x83, 0x83, \n\t0x7b, 0x03, 0xb0, 0x02, 0x00, 0xfa, 0x50, 0x01, 0x08, 0xd2, 0xd0, 0x01, \n\t0x06, 0xfd, 0x30, 0x01, 0xef, 0x8d, 0x66, 0x6a, 0x92, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x43, 0xff, 0xeb, 0x04, 0x12, 0x06, 0x18, 0x02, 0x06, \n\t0x00, 0x47, 0x00, 0x00, 0x00, 0x02, 0x00, 0x72, 0x00, 0x00, 0x06, 0xe0, \n\t0x05, 0xb0, 0x00, 0x18, 0x00, 0x21, 0x00, 0x3e, 0x00, 0xb0, 0x07, 0x2f, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x10, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, \n\t0x3e, 0x59, 0xb1, 0x0a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x19, 0xd0, 0xb0, 0x07, 0x10, 0xb1, 0x1a, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x21, 0x22, \n\t0x00, 0x35, 0x34, 0x00, 0x33, 0x33, 0x11, 0x21, 0x11, 0x33, 0x36, 0x36, \n\t0x37, 0x36, 0x26, 0x27, 0x21, 0x16, 0x16, 0x07, 0x06, 0x04, 0x23, 0x25, \n\t0x11, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x02, 0x95, 0xfb, 0xfe, \n\t0xd8, 0x01, 0x28, 0xfb, 0xfb, 0x01, 0x23, 0x45, 0x5b, 0x63, 0x04, 0x01, \n\t0x1f, 0x1e, 0x01, 0x1d, 0x21, 0x24, 0x02, 0x04, 0xfe, 0xe8, 0xca, 0xfe, \n\t0x98, 0xfb, 0x7c, 0x83, 0x84, 0x7b, 0x01, 0x08, 0xd2, 0xd0, 0x01, 0x06, \n\t0x02, 0x00, 0xfb, 0x31, 0x01, 0x69, 0x5e, 0x4c, 0xa6, 0x4e, 0x63, 0x96, \n\t0x47, 0xcd, 0xdc, 0xe0, 0x01, 0xef, 0x8d, 0x66, 0x6a, 0x92, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x5a, 0xff, 0xe9, 0x06, 0x87, 0x06, 0x18, 0x00, 0x22, \n\t0x00, 0x33, 0x00, 0x5b, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, \n\t0x1b, 0xb1, 0x07, 0x1a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, \n\t0x2f, 0x1b, 0xb1, 0x03, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x19, 0x2f, 0x1b, 0xb1, 0x19, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x1f, 0x2f, 0x1b, 0xb1, 0x1f, 0x0a, 0x3e, 0x59, 0xb0, 0x19, 0x10, \n\t0xb1, 0x0c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x03, 0x10, 0xb1, 0x26, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x0c, 0x10, 0xb0, 0x2d, 0xd0, 0x30, 0x31, 0x13, \n\t0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x11, 0x21, 0x11, 0x06, 0x16, 0x33, \n\t0x36, 0x36, 0x37, 0x36, 0x26, 0x27, 0x21, 0x16, 0x16, 0x07, 0x02, 0x00, \n\t0x23, 0x06, 0x26, 0x27, 0x06, 0x06, 0x23, 0x22, 0x02, 0x35, 0x01, 0x26, \n\t0x26, 0x23, 0x22, 0x06, 0x15, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, \n\t0x26, 0x26, 0x35, 0x5a, 0xde, 0xc9, 0x4b, 0x7a, 0x2f, 0x01, 0x24, 0x01, \n\t0x41, 0x37, 0x62, 0x6b, 0x04, 0x01, 0x1f, 0x1e, 0x01, 0x1d, 0x22, 0x23, \n\t0x02, 0x04, 0xfe, 0xe2, 0xd3, 0x84, 0xb6, 0x2f, 0x34, 0x92, 0x62, 0xc8, \n\t0xdd, 0x02, 0x9b, 0x1e, 0x55, 0x37, 0x6b, 0x62, 0x5f, 0x6c, 0x3b, 0x5b, \n\t0x1e, 0x04, 0x04, 0x02, 0x14, 0x01, 0x00, 0x01, 0x3a, 0x3b, 0x38, 0x02, \n\t0x3d, 0xfb, 0x5c, 0x4a, 0x5c, 0x01, 0xab, 0x97, 0x61, 0xcc, 0x66, 0x7f, \n\t0xb9, 0x5b, 0xfe, 0xf6, 0xfe, 0xe4, 0x02, 0x57, 0x5f, 0x58, 0x5c, 0x01, \n\t0x24, 0xf0, 0x01, 0x17, 0x29, 0x2c, 0xbe, 0x99, 0x15, 0x8e, 0xa3, 0x2e, \n\t0x2b, 0x12, 0x27, 0x14, 0x00, 0x01, 0x00, 0x41, 0xff, 0xe8, 0x05, 0xee, \n\t0x05, 0xb0, 0x00, 0x2c, 0x00, 0x5e, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x29, 0x2f, 0x1b, 0xb1, 0x29, 0x0a, 0x3e, 0x59, 0xb0, 0x05, \n\t0x10, 0xb1, 0x04, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x0e, 0x10, 0xb1, 0x0c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x15, 0x04, 0x05, 0x11, 0x12, 0x39, 0xb0, \n\t0x29, 0x10, 0xb1, 0x1c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0x30, 0x31, 0x01, 0x34, 0x26, 0x23, 0x23, 0x35, 0x33, 0x32, \n\t0x36, 0x35, 0x34, 0x26, 0x23, 0x21, 0x35, 0x21, 0x20, 0x04, 0x15, 0x14, \n\t0x06, 0x07, 0x16, 0x16, 0x15, 0x15, 0x06, 0x16, 0x33, 0x36, 0x36, 0x37, \n\t0x36, 0x26, 0x27, 0x21, 0x16, 0x16, 0x07, 0x02, 0x00, 0x23, 0x06, 0x26, \n\t0x27, 0x02, 0x8b, 0x70, 0x5d, 0xed, 0xb4, 0x8d, 0x7d, 0x77, 0x7f, 0xfe, \n\t0xa8, 0x01, 0x58, 0x01, 0x05, 0x01, 0x15, 0x8c, 0x85, 0x8f, 0x7e, 0x01, \n\t0x2d, 0x27, 0x5d, 0x66, 0x04, 0x01, 0x1f, 0x1e, 0x01, 0x1d, 0x22, 0x22, \n\t0x01, 0x04, 0xfe, 0xdf, 0xd5, 0xa8, 0xb8, 0x08, 0x01, 0x7e, 0x63, 0x79, \n\t0xe3, 0x68, 0x6d, 0x58, 0x62, 0xe4, 0xd5, 0xcb, 0x74, 0xa6, 0x31, 0x23, \n\t0xa6, 0x7c, 0x44, 0x30, 0x3e, 0x01, 0xab, 0x97, 0x61, 0xcc, 0x66, 0x86, \n\t0xb3, 0x5a, 0xfe, 0xf6, 0xfe, 0xe4, 0x03, 0xa3, 0xb1, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x2d, 0xff, 0xe2, 0x05, 0x15, 0x04, 0x3a, 0x00, 0x2c, \n\t0x00, 0x51, 0x00, 0xb0, 0x19, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x22, \n\t0x2f, 0x1b, 0xb1, 0x22, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x0a, 0x3e, 0x59, 0xb1, 0x03, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x19, 0x10, 0xb1, \n\t0x18, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x22, 0x10, 0xb1, 0x20, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb2, 0x29, 0x18, 0x19, 0x11, 0x12, 0x39, 0x30, 0x31, 0x25, \n\t0x06, 0x16, 0x33, 0x36, 0x36, 0x37, 0x36, 0x26, 0x27, 0x21, 0x16, 0x16, \n\t0x07, 0x06, 0x06, 0x23, 0x06, 0x26, 0x27, 0x35, 0x34, 0x26, 0x23, 0x21, \n\t0x27, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x21, 0x27, 0x21, 0x32, \n\t0x16, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, 0x03, 0x17, 0x01, 0x1f, \n\t0x26, 0x44, 0x4c, 0x04, 0x01, 0x20, 0x1e, 0x01, 0x1d, 0x22, 0x24, 0x02, \n\t0x04, 0xf3, 0xb2, 0xb8, 0xb5, 0x0a, 0x39, 0x35, 0xfe, 0xff, 0x02, 0xb7, \n\t0x50, 0x4b, 0x4c, 0x4f, 0xfe, 0xfa, 0x06, 0x01, 0x0c, 0xd5, 0xea, 0x52, \n\t0x50, 0x66, 0x5b, 0xfd, 0x2c, 0x31, 0x01, 0x88, 0x7a, 0x4c, 0xa4, 0x4f, \n\t0x66, 0x92, 0x47, 0xd7, 0xe7, 0x03, 0x72, 0x82, 0x4b, 0x32, 0x38, 0xd5, \n\t0x3c, 0x38, 0x3c, 0x48, 0xe2, 0xaa, 0x99, 0x4f, 0x71, 0x24, 0x19, 0x76, \n\t0x55, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x42, 0xfe, 0xd0, 0x04, 0x37, \n\t0x05, 0xb0, 0x00, 0x22, 0x00, 0x5e, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x16, 0x2f, 0x1b, 0xb1, 0x16, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0a, 0x3e, 0x59, 0xb0, 0x0d, \n\t0x10, 0xb1, 0x0c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x16, 0x10, 0xb1, 0x15, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x1d, 0x0c, 0x0d, 0x11, 0x12, 0x39, 0xb0, \n\t0x03, 0x10, 0xb1, 0x21, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0x30, 0x31, 0x25, 0x03, 0x23, 0x13, 0x23, 0x26, 0x26, 0x35, \n\t0x35, 0x34, 0x26, 0x23, 0x21, 0x27, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, \n\t0x23, 0x21, 0x27, 0x21, 0x32, 0x04, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, \n\t0x15, 0x15, 0x33, 0x04, 0x37, 0x9f, 0xc3, 0x41, 0x67, 0x28, 0x17, 0x77, \n\t0x6d, 0xfe, 0xf6, 0x02, 0xf3, 0x7b, 0x78, 0x79, 0x75, 0xfe, 0xd0, 0x06, \n\t0x01, 0x36, 0xf8, 0x01, 0x1a, 0x76, 0x72, 0x80, 0x71, 0xa4, 0x0b, 0xfe, \n\t0xc5, 0x01, 0x30, 0x20, 0x94, 0x45, 0x68, 0x6c, 0x7a, 0xe1, 0x67, 0x66, \n\t0x64, 0x76, 0xe1, 0xe3, 0xcb, 0x71, 0xa2, 0x32, 0x26, 0xb1, 0x83, 0x6b, \n\t0x00, 0x01, 0x00, 0x6e, 0xfe, 0xbc, 0x04, 0x27, 0x04, 0x3a, 0x00, 0x22, \n\t0x00, 0x54, 0x00, 0xb0, 0x0d, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x16, \n\t0x2f, 0x1b, 0xb1, 0x16, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0a, 0x3e, 0x59, 0xb0, 0x0d, 0x10, 0xb1, \n\t0x0c, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x16, 0x10, 0xb1, 0x15, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb2, 0x1d, 0x0c, 0x0d, 0x11, 0x12, 0x39, 0xb0, 0x04, 0x10, \n\t0xb1, 0x22, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x05, 0x03, 0x23, 0x13, 0x23, 0x26, 0x26, 0x35, 0x35, 0x34, \n\t0x26, 0x23, 0x21, 0x27, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x21, \n\t0x27, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, 0x15, \n\t0x33, 0x04, 0x27, 0x9f, 0xc3, 0x46, 0x91, 0x12, 0x09, 0x5e, 0x59, 0xfe, \n\t0xfc, 0x02, 0xfe, 0x54, 0x5c, 0x5d, 0x53, 0xfe, 0xd6, 0x08, 0x01, 0x32, \n\t0xd7, 0xfe, 0x53, 0x50, 0x5d, 0x53, 0xa5, 0x09, 0xfe, 0xc5, 0x01, 0x44, \n\t0x11, 0x60, 0x2e, 0x4b, 0x4c, 0x51, 0xc4, 0x45, 0x3c, 0x3d, 0x52, 0xdf, \n\t0xba, 0x9f, 0x50, 0x79, 0x29, 0x22, 0x85, 0x5d, 0x07, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x41, 0xff, 0xe8, 0x07, 0x86, 0x05, 0xb0, 0x00, 0x21, \n\t0x00, 0x57, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, \n\t0x0c, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1e, 0x2f, 0x1b, \n\t0xb1, 0x1e, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, \n\t0x1b, 0xb1, 0x06, 0x0a, 0x3e, 0x59, 0xb0, 0x0c, 0x10, 0xb1, 0x00, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x06, 0x10, \n\t0xb1, 0x07, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x1e, 0x10, 0xb1, 0x11, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x11, 0x10, 0x02, 0x21, 0x23, \n\t0x35, 0x33, 0x32, 0x36, 0x11, 0x11, 0x21, 0x11, 0x06, 0x16, 0x33, 0x36, \n\t0x36, 0x37, 0x36, 0x26, 0x27, 0x21, 0x16, 0x16, 0x07, 0x02, 0x00, 0x23, \n\t0x06, 0x26, 0x27, 0x03, 0xf5, 0xfe, 0x83, 0xed, 0xfe, 0xeb, 0x35, 0x29, \n\t0x7c, 0x6e, 0x03, 0xc4, 0x01, 0x41, 0x38, 0x61, 0x6c, 0x04, 0x01, 0x20, \n\t0x1e, 0x01, 0x1d, 0x21, 0x24, 0x02, 0x04, 0xfe, 0xe2, 0xd2, 0xbf, 0xd2, \n\t0x0a, 0x04, 0xcc, 0xfe, 0x34, 0xfe, 0x72, 0xfe, 0x8e, 0xe3, 0xfd, 0x01, \n\t0x20, 0x02, 0xb0, 0xfb, 0xc4, 0x4a, 0x5c, 0x01, 0xab, 0x97, 0x61, 0xcb, \n\t0x67, 0x7a, 0xbd, 0x5c, 0xfe, 0xf6, 0xfe, 0xe4, 0x03, 0xbe, 0xce, 0x00, \n\t0x00, 0x01, 0x00, 0x3c, 0xff, 0xe8, 0x06, 0x73, 0x04, 0x3a, 0x00, 0x21, \n\t0x00, 0x57, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, \n\t0x0c, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1e, 0x2f, 0x1b, \n\t0xb1, 0x1e, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, \n\t0x1b, 0xb1, 0x06, 0x0a, 0x3e, 0x59, 0xb0, 0x0c, 0x10, 0xb1, 0x00, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x06, 0x10, \n\t0xb1, 0x07, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x1e, 0x10, 0xb1, 0x11, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x23, 0x15, 0x10, 0x02, 0x23, 0x23, \n\t0x37, 0x37, 0x32, 0x36, 0x35, 0x11, 0x21, 0x11, 0x06, 0x16, 0x33, 0x36, \n\t0x36, 0x37, 0x36, 0x26, 0x27, 0x21, 0x16, 0x16, 0x07, 0x06, 0x00, 0x23, \n\t0x06, 0x26, 0x27, 0x02, 0xff, 0xcc, 0xc7, 0xe8, 0x48, 0x04, 0x29, 0x5a, \n\t0x4d, 0x03, 0x13, 0x01, 0x49, 0x3f, 0x4b, 0x53, 0x04, 0x01, 0x1f, 0x1e, \n\t0x01, 0x1d, 0x22, 0x24, 0x02, 0x04, 0xfe, 0xfc, 0xbf, 0xc7, 0xda, 0x0a, \n\t0x03, 0x55, 0xe7, 0xfe, 0xc2, 0xfe, 0xd0, 0xf2, 0x01, 0xb1, 0xca, 0x01, \n\t0xcc, 0xfd, 0x3a, 0x4a, 0x5c, 0x01, 0x95, 0x84, 0x5c, 0xc1, 0x60, 0x7b, \n\t0xac, 0x56, 0xf6, 0xfe, 0xf9, 0x03, 0xbe, 0xce, 0x00, 0x01, 0x00, 0x85, \n\t0xff, 0xe8, 0x07, 0x89, 0x05, 0xb0, 0x00, 0x1d, 0x00, 0x62, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x1c, 0x2f, 0x1b, 0xb1, 0x1c, 0x16, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x10, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x19, 0x2f, 0x1b, 0xb1, 0x19, 0x10, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, 0x11, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x18, 0x2f, 0x1b, 0xb1, \n\t0x18, 0x0a, 0x3e, 0x59, 0xb0, 0x11, 0x10, 0xb1, 0x04, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x1c, 0x10, 0xb1, 0x15, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x01, 0x11, 0x06, 0x16, 0x33, 0x36, 0x36, 0x37, 0x36, 0x26, 0x27, 0x21, \n\t0x16, 0x16, 0x07, 0x02, 0x00, 0x23, 0x06, 0x26, 0x27, 0x35, 0x21, 0x11, \n\t0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x05, 0x1b, 0x01, 0x41, 0x37, 0x62, \n\t0x6c, 0x04, 0x01, 0x20, 0x1e, 0x01, 0x1d, 0x22, 0x23, 0x02, 0x04, 0xfe, \n\t0xe2, 0xd3, 0xbf, 0xd2, 0x0a, 0xfd, 0xb3, 0xfe, 0xdb, 0x01, 0x25, 0x02, \n\t0x4d, 0x05, 0xb0, 0xfb, 0xc4, 0x4a, 0x5c, 0x01, 0xab, 0x97, 0x61, 0xcb, \n\t0x67, 0x7f, 0xb9, 0x5b, 0xfe, 0xf6, 0xfe, 0xe4, 0x03, 0xbe, 0xce, 0xe9, \n\t0xfd, 0xa3, 0x05, 0xb0, 0xfd, 0x8e, 0x02, 0x72, 0x00, 0x01, 0x00, 0x5c, \n\t0xff, 0xe8, 0x06, 0x61, 0x04, 0x3a, 0x00, 0x1d, 0x00, 0x62, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0e, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0e, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x18, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1a, 0x2f, 0x1b, 0xb1, 0x1a, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, \n\t0x03, 0x0a, 0x3e, 0x59, 0xb0, 0x06, 0x10, 0xb1, 0x00, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x1a, 0x10, 0xb1, 0x0d, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x01, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x06, \n\t0x16, 0x33, 0x36, 0x36, 0x37, 0x36, 0x26, 0x27, 0x21, 0x16, 0x16, 0x07, \n\t0x06, 0x00, 0x23, 0x06, 0x26, 0x27, 0x02, 0xef, 0xfe, 0x91, 0xfe, 0xdc, \n\t0x01, 0x24, 0x01, 0x6f, 0x01, 0x24, 0x02, 0x49, 0x3f, 0x4c, 0x54, 0x04, \n\t0x01, 0x1f, 0x1e, 0x01, 0x1c, 0x22, 0x22, 0x01, 0x04, 0xfe, 0xfc, 0xbf, \n\t0xc6, 0xda, 0x0a, 0x01, 0xad, 0xfe, 0x53, 0x04, 0x3a, 0xfe, 0x56, 0x01, \n\t0xaa, 0xfd, 0x3a, 0x4a, 0x5c, 0x01, 0x95, 0x84, 0x5b, 0xc1, 0x61, 0x7e, \n\t0xaa, 0x55, 0xf6, 0xfe, 0xf9, 0x03, 0xbe, 0xce, 0x00, 0x01, 0x00, 0x4b, \n\t0xff, 0xeb, 0x04, 0xd0, 0x05, 0xc5, 0x00, 0x21, 0x00, 0x3b, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x10, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x07, 0x10, 0xb1, 0x0e, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x15, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x05, 0x20, 0x00, \n\t0x11, 0x11, 0x10, 0x00, 0x21, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, \n\t0x22, 0x06, 0x15, 0x11, 0x14, 0x16, 0x33, 0x36, 0x36, 0x37, 0x36, 0x26, \n\t0x27, 0x21, 0x16, 0x16, 0x07, 0x06, 0x04, 0x02, 0xbd, 0xfe, 0xea, 0xfe, \n\t0xa4, 0x01, 0x5c, 0x01, 0x16, 0x71, 0xb2, 0x44, 0x3f, 0x43, 0x90, 0x55, \n\t0x99, 0xb5, 0xb5, 0x99, 0x70, 0x7b, 0x04, 0x01, 0x1b, 0x18, 0x01, 0x1c, \n\t0x26, 0x14, 0x01, 0x04, 0xfe, 0xd2, 0x15, 0x01, 0x5d, 0x01, 0x0d, 0x01, \n\t0x06, 0x01, 0x0c, 0x01, 0x5e, 0x2d, 0x2c, 0xcf, 0x21, 0x23, 0xe0, 0xa4, \n\t0xfe, 0xf8, 0xa7, 0xe0, 0x01, 0x7a, 0x6d, 0x50, 0xae, 0x5e, 0xa6, 0x6b, \n\t0x4b, 0xdf, 0xec, 0x00, 0x00, 0x01, 0x00, 0x46, 0xff, 0xeb, 0x04, 0x07, \n\t0x04, 0x4e, 0x00, 0x21, 0x00, 0x38, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x14, 0x2f, 0x1b, 0xb1, 0x14, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x0a, 0x3e, 0x59, 0xb1, 0x00, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x14, 0x10, \n\t0xb1, 0x1b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x25, 0x36, 0x36, 0x37, 0x34, 0x26, 0x27, 0x21, 0x16, 0x16, \n\t0x15, 0x06, 0x06, 0x23, 0x22, 0x00, 0x35, 0x35, 0x34, 0x00, 0x33, 0x32, \n\t0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x15, 0x14, 0x16, \n\t0x02, 0x64, 0x45, 0x37, 0x03, 0x0a, 0x09, 0x01, 0x1c, 0x0d, 0x0e, 0x04, \n\t0xe6, 0xb9, 0xfc, 0xfe, 0xde, 0x01, 0x18, 0xf1, 0x5e, 0x8e, 0x2f, 0x2e, \n\t0x2f, 0x79, 0x45, 0x71, 0x74, 0x7d, 0xce, 0x01, 0x3b, 0x3d, 0x34, 0x6d, \n\t0x31, 0x41, 0x64, 0x2d, 0xab, 0xb1, 0x01, 0x39, 0xe4, 0x2a, 0xe2, 0x01, \n\t0x3a, 0x23, 0x1f, 0xdc, 0x1b, 0x1f, 0xbb, 0x7d, 0x2a, 0x80, 0xba, 0x00, \n\t0x00, 0x01, 0x00, 0x20, 0xff, 0xe8, 0x05, 0x63, 0x05, 0xb0, 0x00, 0x19, \n\t0x00, 0x41, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, \n\t0x02, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x16, 0x2f, 0x1b, \n\t0xb1, 0x16, 0x0a, 0x3e, 0x59, 0xb0, 0x02, 0x10, 0xb1, 0x00, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0xd0, 0xb0, \n\t0x05, 0xd0, 0xb0, 0x16, 0x10, 0xb1, 0x09, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x35, 0x21, 0x15, \n\t0x21, 0x11, 0x06, 0x16, 0x33, 0x36, 0x36, 0x37, 0x36, 0x26, 0x27, 0x21, \n\t0x16, 0x16, 0x07, 0x02, 0x00, 0x23, 0x06, 0x26, 0x27, 0x01, 0xd1, 0xfe, \n\t0x4f, 0x04, 0x80, 0xfe, 0x55, 0x01, 0x41, 0x37, 0x62, 0x6c, 0x04, 0x01, \n\t0x20, 0x1e, 0x01, 0x1d, 0x21, 0x24, 0x02, 0x04, 0xfe, 0xe2, 0xd3, 0xbf, \n\t0xd2, 0x0a, 0x04, 0xcc, 0xe4, 0xe4, 0xfc, 0xa8, 0x4a, 0x5c, 0x01, 0xab, \n\t0x97, 0x61, 0xcb, 0x67, 0x7a, 0xbd, 0x5c, 0xfe, 0xf6, 0xfe, 0xe4, 0x03, \n\t0xbe, 0xce, 0x00, 0x00, 0x00, 0x01, 0x00, 0x42, 0xff, 0xe8, 0x04, 0xdd, \n\t0x04, 0x3a, 0x00, 0x19, 0x00, 0x41, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x16, 0x2f, 0x1b, 0xb1, 0x16, 0x0a, 0x3e, 0x59, 0xb0, 0x02, 0x10, \n\t0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x04, 0xd0, 0xb0, 0x05, 0xd0, 0xb0, 0x16, 0x10, 0xb1, 0x09, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, \n\t0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x06, 0x16, 0x33, 0x36, 0x36, 0x37, \n\t0x36, 0x26, 0x27, 0x21, 0x16, 0x16, 0x07, 0x06, 0x04, 0x23, 0x06, 0x26, \n\t0x27, 0x01, 0x68, 0xfe, 0xda, 0x03, 0x8b, 0xfe, 0xbf, 0x01, 0x48, 0x3f, \n\t0x4c, 0x54, 0x04, 0x01, 0x1f, 0x1e, 0x01, 0x1d, 0x22, 0x24, 0x02, 0x05, \n\t0xfe, 0xfb, 0xbf, 0xc6, 0xda, 0x0a, 0x03, 0x58, 0xe2, 0xe2, 0xfe, 0x1c, \n\t0x4a, 0x5c, 0x01, 0x73, 0x67, 0x45, 0x97, 0x48, 0x5d, 0x87, 0x40, 0xd7, \n\t0xe7, 0x03, 0xbe, 0xce, 0x00, 0x01, 0x00, 0x6f, 0xff, 0xeb, 0x04, 0xf8, \n\t0x05, 0xc5, 0x00, 0x2a, 0x00, 0x5e, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x17, 0x2f, 0x1b, 0xb1, 0x17, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x28, 0x2f, 0x1b, 0xb1, 0x28, 0x0a, 0x3e, 0x59, 0xb0, 0x17, \n\t0x10, 0xb1, 0x19, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb2, 0x03, 0x19, 0x17, 0x11, 0x12, 0x39, 0xb0, 0x09, 0x10, 0xb1, \n\t0x11, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x28, 0x10, 0xb1, 0x20, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0x30, 0x31, 0x13, 0x34, 0x36, 0x37, 0x26, 0x26, 0x35, 0x34, \n\t0x24, 0x21, 0x32, 0x04, 0x07, 0x07, 0x21, 0x34, 0x26, 0x23, 0x22, 0x06, \n\t0x15, 0x14, 0x16, 0x33, 0x33, 0x15, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, \n\t0x33, 0x32, 0x36, 0x35, 0x21, 0x17, 0x16, 0x04, 0x23, 0x20, 0x24, 0x6f, \n\t0x88, 0x82, 0x73, 0x81, 0x01, 0x36, 0x01, 0x0b, 0xe4, 0x01, 0x3a, 0x05, \n\t0x01, 0xfe, 0xe4, 0x91, 0x6b, 0x8d, 0x90, 0x82, 0x8a, 0xc5, 0xc5, 0x91, \n\t0x92, 0xa4, 0x90, 0x76, 0x9b, 0x01, 0x1b, 0x01, 0x05, 0xfe, 0xb2, 0xe4, \n\t0xfe, 0xf4, 0xfe, 0xb5, 0x01, 0x98, 0x7c, 0xad, 0x2b, 0x2f, 0xa6, 0x64, \n\t0xc8, 0xd8, 0xe1, 0xb5, 0x06, 0x52, 0x69, 0x6f, 0x54, 0x61, 0x6c, 0xdb, \n\t0x6b, 0x73, 0x5b, 0x75, 0x74, 0x55, 0x06, 0xcd, 0xd6, 0xe4, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x5f, 0xff, 0xec, 0x04, 0x2e, 0x04, 0x4d, 0x02, 0x06, \n\t0x01, 0x8f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2a, 0xfe, 0x4b, 0x06, 0x43, \n\t0x05, 0xb0, 0x02, 0x26, 0x01, 0xc3, 0x00, 0x00, 0x00, 0x07, 0x03, 0x5f, \n\t0x04, 0x98, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0f, 0xfe, 0x4b, 0x05, 0x3d, \n\t0x04, 0x3a, 0x02, 0x26, 0x01, 0xd8, 0x00, 0x00, 0x00, 0x07, 0x03, 0x5f, \n\t0x03, 0x92, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0c, 0xfe, 0x7a, 0x05, 0x1f, \n\t0x05, 0xb0, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x00, 0x07, 0x01, 0x5a, \n\t0x01, 0x43, 0x00, 0x00, 0xff, 0xff, 0x00, 0x37, 0xfe, 0x88, 0x04, 0x0f, \n\t0x04, 0x4e, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x00, 0x07, 0x01, 0x5a, \n\t0x00, 0x82, 0x00, 0x0e, 0xff, 0xff, 0x00, 0x88, 0x00, 0x00, 0x06, 0x72, \n\t0x07, 0x22, 0x02, 0x26, 0x00, 0x30, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, \n\t0x02, 0x7d, 0x01, 0x5c, 0x00, 0x09, 0x00, 0xb3, 0x16, 0x07, 0x11, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x70, 0x00, 0x00, 0x06, 0x7c, \n\t0x05, 0xe0, 0x02, 0x26, 0x00, 0x50, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, \n\t0x02, 0x8b, 0x00, 0x1a, 0x00, 0x09, 0x00, 0xb3, 0x2a, 0x08, 0x04, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x18, 0x00, 0x00, 0x06, 0xfb, \n\t0x07, 0x22, 0x02, 0x26, 0x00, 0x3a, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, \n\t0x01, 0xd5, 0x01, 0x5c, 0x00, 0x09, 0x00, 0xb3, 0x11, 0x07, 0x0a, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x1d, 0x00, 0x00, 0x05, 0xc2, \n\t0x05, 0xcb, 0x02, 0x26, 0x00, 0x5a, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, \n\t0x01, 0x3b, 0x00, 0x05, 0x00, 0x09, 0x00, 0xb3, 0x11, 0x08, 0x0a, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x18, 0x00, 0x00, 0x06, 0xfb, \n\t0x07, 0x22, 0x02, 0x26, 0x00, 0x3a, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, \n\t0x02, 0x8a, 0x01, 0x5c, 0x00, 0x09, 0x00, 0xb3, 0x14, 0x07, 0x0a, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x1d, 0x00, 0x00, 0x05, 0xc2, \n\t0x05, 0xcb, 0x02, 0x26, 0x00, 0x5a, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, \n\t0x01, 0xf0, 0x00, 0x05, 0x00, 0x09, 0x00, 0xb3, 0x14, 0x08, 0x0a, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x18, 0x00, 0x00, 0x06, 0xfb, \n\t0x07, 0x0d, 0x02, 0x26, 0x00, 0x3a, 0x00, 0x00, 0x01, 0x07, 0x00, 0x6a, \n\t0x01, 0x6f, 0x01, 0x5d, 0x00, 0x0f, 0x00, 0xb3, 0x15, 0x08, 0x0a, 0x04, \n\t0x2b, 0xb0, 0x15, 0x10, 0xb0, 0x11, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x1d, 0x00, 0x00, 0x05, 0xc2, 0x05, 0xb6, 0x02, 0x26, \n\t0x00, 0x5a, 0x00, 0x00, 0x01, 0x07, 0x00, 0x6a, 0x00, 0xd5, 0x00, 0x06, \n\t0x00, 0x0f, 0x00, 0xb3, 0x15, 0x09, 0x0a, 0x04, 0x2b, 0xb0, 0x15, 0x10, \n\t0xb0, 0x11, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0c, \n\t0xfe, 0x9e, 0x05, 0x1f, 0x05, 0xb0, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, \n\t0x00, 0x07, 0x01, 0x60, 0x04, 0xe5, 0x00, 0x00, 0xff, 0xff, 0x00, 0x37, \n\t0xfe, 0xac, 0x04, 0x0f, 0x04, 0x4e, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, \n\t0x00, 0x07, 0x01, 0x60, 0x04, 0x34, 0x00, 0x0e, 0xff, 0xff, 0x00, 0x0c, \n\t0x00, 0x00, 0x05, 0x1f, 0x07, 0xc7, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x5e, 0x04, 0xee, 0x01, 0x42, 0x00, 0x09, 0x00, 0xb3, \n\t0x0c, 0x07, 0x04, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x37, \n\t0xff, 0xeb, 0x04, 0x0f, 0x06, 0x85, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x5e, 0x04, 0x82, 0x00, 0x00, 0x00, 0x09, 0x00, 0xb3, \n\t0x3c, 0x08, 0x19, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x0c, \n\t0x00, 0x00, 0x05, 0x7a, 0x07, 0xea, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, \n\t0x01, 0x07, 0x03, 0x56, 0x00, 0x96, 0x01, 0x4b, 0x00, 0x0f, 0x00, 0xb3, \n\t0x12, 0x07, 0x04, 0x04, 0x2b, 0xb0, 0x12, 0x10, 0xb0, 0x18, 0xd0, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x37, 0xff, 0xeb, 0x05, 0x0c, \n\t0x06, 0xa8, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x03, 0x56, \n\t0x28, 0x09, 0x00, 0x0f, 0x00, 0xb3, 0x32, 0x08, 0x19, 0x04, 0x2b, 0xb0, \n\t0x32, 0x10, 0xb0, 0x38, 0xd0, 0x30, 0x31, 0x00, 0xff, 0xff, 0xff, 0xa8, \n\t0x00, 0x00, 0x05, 0x1f, 0x07, 0xe2, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, \n\t0x01, 0x07, 0x03, 0x57, 0x00, 0x98, 0x01, 0x43, 0x00, 0x0f, 0x00, 0xb3, \n\t0x10, 0x07, 0x04, 0x04, 0x2b, 0xb0, 0x10, 0x10, 0xb0, 0x15, 0xd0, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x38, 0xff, 0xeb, 0x04, 0x0f, \n\t0x06, 0xa0, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x03, 0x57, \n\t0x28, 0x01, 0x00, 0x0f, 0x00, 0xb3, 0x30, 0x08, 0x19, 0x04, 0x2b, 0xb0, \n\t0x30, 0x10, 0xb0, 0x35, 0xd0, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x0c, \n\t0x00, 0x00, 0x05, 0x1f, 0x07, 0xe9, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, \n\t0x01, 0x07, 0x03, 0x58, 0x00, 0x99, 0x01, 0x27, 0x00, 0x0f, 0x00, 0xb3, \n\t0x10, 0x07, 0x04, 0x04, 0x2b, 0xb0, 0x10, 0x10, 0xb0, 0x15, 0xd0, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x37, 0xff, 0xeb, 0x04, 0xa9, \n\t0x06, 0xa9, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x03, 0x58, \n\t0x23, 0xe7, 0x00, 0x0f, 0x00, 0xb3, 0x30, 0x08, 0x19, 0x04, 0x2b, 0xb0, \n\t0x30, 0x10, 0xb0, 0x35, 0xd0, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x0c, \n\t0x00, 0x00, 0x05, 0x1f, 0x08, 0x06, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, \n\t0x01, 0x07, 0x03, 0x59, 0x00, 0x9c, 0x01, 0x13, 0x00, 0x0f, 0x00, 0xb3, \n\t0x10, 0x07, 0x04, 0x04, 0x2b, 0xb0, 0x10, 0x10, 0xb0, 0x18, 0xd0, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x37, 0xff, 0xeb, 0x04, 0x0f, \n\t0x06, 0xc6, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x03, 0x59, \n\t0x21, 0xd3, 0x00, 0x0f, 0x00, 0xb3, 0x30, 0x08, 0x19, 0x04, 0x2b, 0xb0, \n\t0x30, 0x10, 0xb0, 0x38, 0xd0, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x0c, \n\t0xfe, 0x9e, 0x05, 0x1f, 0x07, 0x42, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, \n\t0x00, 0x27, 0x01, 0x52, 0x00, 0x95, 0x01, 0x54, 0x01, 0x07, 0x01, 0x60, \n\t0x04, 0xe5, 0x00, 0x00, 0x00, 0x09, 0x00, 0xb3, 0x10, 0x08, 0x04, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x37, 0xfe, 0xac, 0x04, 0x0f, \n\t0x06, 0x00, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x00, 0x26, 0x01, 0x52, \n\t0x29, 0x12, 0x01, 0x07, 0x01, 0x60, 0x04, 0x34, 0x00, 0x0e, 0x00, 0x09, \n\t0x00, 0xb3, 0x30, 0x03, 0x19, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x0c, 0x00, 0x00, 0x05, 0x1f, 0x07, 0xf0, 0x02, 0x26, \n\t0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x03, 0x5a, 0x00, 0xcb, 0x01, 0x5e, \n\t0x00, 0x0f, 0x00, 0xb3, 0x10, 0x07, 0x04, 0x04, 0x2b, 0xb0, 0x10, 0x10, \n\t0xb0, 0x1f, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x37, \n\t0xff, 0xeb, 0x04, 0x0f, 0x06, 0xaa, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, \n\t0x01, 0x06, 0x03, 0x5a, 0x4e, 0x18, 0x00, 0x0f, 0x00, 0xb3, 0x30, 0x08, \n\t0x19, 0x04, 0x2b, 0xb0, 0x30, 0x10, 0xb0, 0x3f, 0xd0, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x0c, 0x00, 0x00, 0x05, 0x1f, 0x07, 0xf0, 0x02, 0x26, \n\t0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x03, 0x54, 0x00, 0xcb, 0x01, 0x5e, \n\t0x00, 0x0f, 0x00, 0xb3, 0x15, 0x07, 0x04, 0x04, 0x2b, 0xb0, 0x15, 0x10, \n\t0xb0, 0x0c, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x37, \n\t0xff, 0xeb, 0x04, 0x0f, 0x06, 0xaa, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, \n\t0x01, 0x06, 0x03, 0x54, 0x5f, 0x18, 0x00, 0x0f, 0x00, 0xb3, 0x35, 0x08, \n\t0x19, 0x04, 0x2b, 0xb0, 0x35, 0x10, 0xb0, 0x2c, 0xd0, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x0c, 0x00, 0x00, 0x05, 0x1f, 0x08, 0x7c, 0x02, 0x26, \n\t0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x03, 0x5b, 0x00, 0xc9, 0x01, 0x5e, \n\t0x00, 0x0f, 0x00, 0xb3, 0x10, 0x07, 0x04, 0x04, 0x2b, 0xb0, 0x10, 0x10, \n\t0xb0, 0x1c, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x37, \n\t0xff, 0xeb, 0x04, 0x0f, 0x07, 0x36, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, \n\t0x01, 0x06, 0x03, 0x5b, 0x4f, 0x18, 0x00, 0x0f, 0x00, 0xb3, 0x30, 0x08, \n\t0x19, 0x04, 0x2b, 0xb0, 0x30, 0x10, 0xb0, 0x4c, 0xd0, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x0c, 0x00, 0x00, 0x05, 0x1f, 0x08, 0x40, 0x02, 0x26, \n\t0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x03, 0x5c, 0x00, 0xcd, 0x01, 0x5e, \n\t0x00, 0x0f, 0x00, 0xb3, 0x10, 0x07, 0x04, 0x04, 0x2b, 0xb0, 0x10, 0x10, \n\t0xb0, 0x1f, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x37, \n\t0xff, 0xeb, 0x04, 0x0f, 0x06, 0xfa, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, \n\t0x01, 0x06, 0x03, 0x5c, 0x58, 0x18, 0x00, 0x0f, 0x00, 0xb3, 0x30, 0x08, \n\t0x19, 0x04, 0x2b, 0xb0, 0x30, 0x10, 0xb0, 0x3f, 0xd0, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x0c, 0xfe, 0x9e, 0x05, 0x1f, 0x07, 0x68, 0x02, 0x26, \n\t0x00, 0x24, 0x00, 0x00, 0x00, 0x27, 0x01, 0x54, 0x00, 0xcb, 0x01, 0xb8, \n\t0x01, 0x07, 0x01, 0x60, 0x04, 0xe5, 0x00, 0x00, 0x00, 0x09, 0x00, 0xb3, \n\t0x10, 0x08, 0x04, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x37, \n\t0xfe, 0xac, 0x04, 0x0f, 0x06, 0x26, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, \n\t0x00, 0x26, 0x01, 0x54, 0x5c, 0x76, 0x01, 0x07, 0x01, 0x60, 0x04, 0x34, \n\t0x00, 0x0e, 0x00, 0x09, 0x00, 0xb3, 0x30, 0x09, 0x19, 0x04, 0x2b, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x88, 0xfe, 0xa8, 0x04, 0x6d, \n\t0x05, 0xb0, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, 0x00, 0x07, 0x01, 0x60, \n\t0x04, 0xb3, 0x00, 0x0a, 0xff, 0xff, 0x00, 0x4d, 0xfe, 0x9e, 0x04, 0x02, \n\t0x04, 0x4f, 0x02, 0x26, 0x00, 0x48, 0x00, 0x00, 0x00, 0x07, 0x01, 0x60, \n\t0x04, 0x95, 0x00, 0x00, 0xff, 0xff, 0x00, 0x88, 0x00, 0x00, 0x04, 0x6d, \n\t0x07, 0xc7, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5e, \n\t0x04, 0xbe, 0x01, 0x42, 0x00, 0x09, 0x00, 0xb3, 0x0c, 0x08, 0x06, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x4d, 0xff, 0xeb, 0x04, 0x02, \n\t0x06, 0x86, 0x02, 0x26, 0x00, 0x48, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5e, \n\t0x04, 0x84, 0x00, 0x01, 0x00, 0x09, 0x00, 0xb3, 0x30, 0x08, 0x07, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x88, 0x00, 0x00, 0x04, 0x6d, \n\t0x07, 0x6d, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x01, 0x58, \n\t0x00, 0x6e, 0x01, 0x74, 0x00, 0x09, 0x00, 0xb3, 0x0f, 0x08, 0x06, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x4d, 0xff, 0xeb, 0x04, 0x02, \n\t0x06, 0x2c, 0x02, 0x26, 0x00, 0x48, 0x00, 0x00, 0x01, 0x06, 0x01, 0x58, \n\t0x34, 0x33, 0x00, 0x09, 0x00, 0xb3, 0x23, 0x09, 0x07, 0x04, 0x2b, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x88, 0x00, 0x00, 0x05, 0x48, \n\t0x07, 0xea, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x03, 0x56, \n\t0x00, 0x64, 0x01, 0x4b, 0x00, 0x0f, 0x00, 0xb3, 0x12, 0x07, 0x06, 0x04, \n\t0x2b, 0xb0, 0x12, 0x10, 0xb0, 0x18, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x4d, 0xff, 0xeb, 0x05, 0x0e, 0x06, 0xa9, 0x02, 0x26, \n\t0x00, 0x48, 0x00, 0x00, 0x01, 0x06, 0x03, 0x56, 0x2a, 0x0a, 0x00, 0x0f, \n\t0x00, 0xb3, 0x24, 0x08, 0x07, 0x04, 0x2b, 0xb0, 0x24, 0x10, 0xb0, 0x2c, \n\t0xd0, 0x30, 0x31, 0x00, 0xff, 0xff, 0xff, 0x74, 0x00, 0x00, 0x04, 0x6d, \n\t0x07, 0xe2, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x03, 0x57, \n\t0x00, 0x64, 0x01, 0x43, 0x00, 0x0f, 0x00, 0xb3, 0x10, 0x07, 0x06, 0x04, \n\t0x2b, 0xb0, 0x10, 0x10, 0xb0, 0x15, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0xff, 0x3a, 0xff, 0xeb, 0x04, 0x02, 0x06, 0xa1, 0x02, 0x26, \n\t0x00, 0x48, 0x00, 0x00, 0x01, 0x06, 0x03, 0x57, 0x2a, 0x02, 0x00, 0x0f, \n\t0x00, 0xb3, 0x22, 0x08, 0x07, 0x04, 0x2b, 0xb0, 0x22, 0x10, 0xb0, 0x29, \n\t0xd0, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x88, 0x00, 0x00, 0x04, 0xe5, \n\t0x07, 0xe9, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x03, 0x58, \n\t0x00, 0x5f, 0x01, 0x27, 0x00, 0x0f, 0x00, 0xb3, 0x10, 0x07, 0x06, 0x04, \n\t0x2b, 0xb0, 0x10, 0x10, 0xb0, 0x15, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x4d, 0xff, 0xeb, 0x04, 0xab, 0x06, 0xaa, 0x02, 0x26, \n\t0x00, 0x48, 0x00, 0x00, 0x01, 0x06, 0x03, 0x58, 0x25, 0xe8, 0x00, 0x0f, \n\t0x00, 0xb3, 0x22, 0x08, 0x07, 0x04, 0x2b, 0xb0, 0x22, 0x10, 0xb0, 0x29, \n\t0xd0, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x88, 0x00, 0x00, 0x04, 0x6d, \n\t0x08, 0x06, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x03, 0x59, \n\t0x00, 0x5d, 0x01, 0x13, 0x00, 0x0f, 0x00, 0xb3, 0x10, 0x07, 0x06, 0x04, \n\t0x2b, 0xb0, 0x10, 0x10, 0xb0, 0x18, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x4d, 0xff, 0xeb, 0x04, 0x02, 0x06, 0xc7, 0x02, 0x26, \n\t0x00, 0x48, 0x00, 0x00, 0x01, 0x06, 0x03, 0x59, 0x23, 0xd4, 0x00, 0x0f, \n\t0x00, 0xb3, 0x22, 0x08, 0x07, 0x04, 0x2b, 0xb0, 0x22, 0x10, 0xb0, 0x2c, \n\t0xd0, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x88, 0xfe, 0xa8, 0x04, 0x6d, \n\t0x07, 0x42, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, 0x00, 0x27, 0x01, 0x52, \n\t0x00, 0x65, 0x01, 0x54, 0x01, 0x07, 0x01, 0x60, 0x04, 0xb3, 0x00, 0x0a, \n\t0x00, 0x09, 0x00, 0xb3, 0x10, 0x08, 0x06, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x4d, 0xfe, 0x9e, 0x04, 0x02, 0x06, 0x01, 0x02, 0x26, \n\t0x00, 0x48, 0x00, 0x00, 0x00, 0x26, 0x01, 0x52, 0x2b, 0x13, 0x01, 0x07, \n\t0x01, 0x60, 0x04, 0x95, 0x00, 0x00, 0x00, 0x09, 0x00, 0xb3, 0x22, 0x03, \n\t0x07, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9a, \n\t0x00, 0x00, 0x02, 0x2f, 0x07, 0xc7, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x5e, 0x03, 0x8e, 0x01, 0x42, 0x00, 0x09, 0x00, 0xb3, \n\t0x04, 0x08, 0x02, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x85, \n\t0x00, 0x00, 0x02, 0x1b, 0x06, 0x72, 0x02, 0x26, 0x00, 0xf3, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x5e, 0x03, 0x7a, 0xff, 0xed, 0x00, 0x09, 0x00, 0xb3, \n\t0x04, 0x08, 0x02, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x89, \n\t0xfe, 0xa8, 0x01, 0xd0, 0x05, 0xb0, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, \n\t0x00, 0x07, 0x01, 0x60, 0x03, 0x83, 0x00, 0x0a, 0xff, 0xff, 0x00, 0x6e, \n\t0xfe, 0xa8, 0x01, 0xb5, 0x06, 0x18, 0x02, 0x26, 0x00, 0x4c, 0x00, 0x00, \n\t0x00, 0x07, 0x01, 0x60, 0x03, 0x68, 0x00, 0x0a, 0xff, 0xff, 0x00, 0x5c, \n\t0xfe, 0x96, 0x05, 0x1b, 0x05, 0xc5, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, \n\t0x00, 0x07, 0x01, 0x60, 0x05, 0x12, 0xff, 0xf8, 0xff, 0xff, 0x00, 0x43, \n\t0xfe, 0x96, 0x04, 0x40, 0x04, 0x4e, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, \n\t0x00, 0x07, 0x01, 0x60, 0x04, 0x98, 0xff, 0xf8, 0xff, 0xff, 0x00, 0x5c, \n\t0xff, 0xeb, 0x05, 0x1b, 0x07, 0xdc, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x5e, 0x05, 0x1d, 0x01, 0x57, 0x00, 0x09, 0x00, 0xb3, \n\t0x1c, 0x08, 0x0a, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x43, \n\t0xff, 0xeb, 0x04, 0x40, 0x06, 0x85, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x5e, 0x04, 0xa3, 0x00, 0x00, 0x00, 0x09, 0x00, 0xb3, \n\t0x1c, 0x08, 0x03, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x5c, \n\t0xff, 0xeb, 0x05, 0xa7, 0x07, 0xff, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, \n\t0x01, 0x07, 0x03, 0x56, 0x00, 0xc3, 0x01, 0x60, 0x00, 0x0f, 0x00, 0xb3, \n\t0x20, 0x07, 0x0a, 0x04, 0x2b, 0xb0, 0x20, 0x10, 0xb0, 0x28, 0xd0, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x43, 0xff, 0xeb, 0x05, 0x2d, \n\t0x06, 0xa8, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x03, 0x56, \n\t0x49, 0x09, 0x00, 0x0f, 0x00, 0xb3, 0x20, 0x08, 0x03, 0x04, 0x2b, 0xb0, \n\t0x20, 0x10, 0xb0, 0x28, 0xd0, 0x30, 0x31, 0x00, 0xff, 0xff, 0xff, 0xd3, \n\t0xff, 0xeb, 0x05, 0x1b, 0x07, 0xf7, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, \n\t0x01, 0x07, 0x03, 0x57, 0x00, 0xc3, 0x01, 0x58, 0x00, 0x0f, 0x00, 0xb3, \n\t0x1e, 0x07, 0x0a, 0x04, 0x2b, 0xb0, 0x1e, 0x10, 0xb0, 0x25, 0xd0, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x59, 0xff, 0xeb, 0x04, 0x40, \n\t0x06, 0xa0, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x03, 0x57, \n\t0x49, 0x01, 0x00, 0x0f, 0x00, 0xb3, 0x1e, 0x08, 0x03, 0x04, 0x2b, 0xb0, \n\t0x1e, 0x10, 0xb0, 0x25, 0xd0, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x5c, \n\t0xff, 0xeb, 0x05, 0x44, 0x07, 0xfe, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, \n\t0x01, 0x07, 0x03, 0x58, 0x00, 0xbe, 0x01, 0x3c, 0x00, 0x0f, 0x00, 0xb3, \n\t0x1e, 0x07, 0x0a, 0x04, 0x2b, 0xb0, 0x1e, 0x10, 0xb0, 0x25, 0xd0, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x43, 0xff, 0xeb, 0x04, 0xca, \n\t0x06, 0xa9, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x03, 0x58, \n\t0x44, 0xe7, 0x00, 0x0f, 0x00, 0xb3, 0x1e, 0x08, 0x03, 0x04, 0x2b, 0xb0, \n\t0x1e, 0x10, 0xb0, 0x25, 0xd0, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x5c, \n\t0xff, 0xeb, 0x05, 0x1b, 0x08, 0x1b, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, \n\t0x01, 0x07, 0x03, 0x59, 0x00, 0xbc, 0x01, 0x28, 0x00, 0x0f, 0x00, 0xb3, \n\t0x1e, 0x07, 0x0a, 0x04, 0x2b, 0xb0, 0x1e, 0x10, 0xb0, 0x28, 0xd0, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x43, 0xff, 0xeb, 0x04, 0x40, \n\t0x06, 0xc6, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x03, 0x59, \n\t0x42, 0xd3, 0x00, 0x0f, 0x00, 0xb3, 0x1e, 0x08, 0x03, 0x04, 0x2b, 0xb0, \n\t0x1e, 0x10, 0xb0, 0x28, 0xd0, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x5c, \n\t0xfe, 0x96, 0x05, 0x1b, 0x07, 0x57, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, \n\t0x00, 0x27, 0x01, 0x52, 0x00, 0xc4, 0x01, 0x69, 0x01, 0x07, 0x01, 0x60, \n\t0x05, 0x12, 0xff, 0xf8, 0x00, 0x09, 0x00, 0xb3, 0x1e, 0x08, 0x0a, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x43, 0xfe, 0x96, 0x04, 0x40, \n\t0x06, 0x00, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, 0x00, 0x26, 0x01, 0x52, \n\t0x4a, 0x12, 0x01, 0x07, 0x01, 0x60, 0x04, 0x98, 0xff, 0xf8, 0x00, 0x09, \n\t0x00, 0xb3, 0x1e, 0x03, 0x03, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x57, 0xff, 0xeb, 0x06, 0x1a, 0x07, 0x18, 0x02, 0x26, \n\t0x01, 0x43, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, 0x01, 0xcb, 0x01, 0x52, \n\t0x00, 0x09, 0x00, 0xb3, 0x29, 0x07, 0x0a, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x43, 0xff, 0xeb, 0x04, 0xee, 0x05, 0xe0, 0x02, 0x26, \n\t0x01, 0x44, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, 0x01, 0x42, 0x00, 0x1a, \n\t0x00, 0x09, 0x00, 0xb3, 0x2a, 0x08, 0x03, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x57, 0xff, 0xeb, 0x06, 0x1a, 0x07, 0x22, 0x02, 0x26, \n\t0x01, 0x43, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, 0x01, 0x16, 0x01, 0x5c, \n\t0x00, 0x09, 0x00, 0xb3, 0x27, 0x07, 0x0a, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x43, 0xff, 0xeb, 0x04, 0xee, 0x05, 0xe0, 0x02, 0x26, \n\t0x01, 0x44, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, 0x00, 0x8d, 0x00, 0x1a, \n\t0x00, 0x09, 0x00, 0xb3, 0x27, 0x08, 0x03, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x57, 0xff, 0xeb, 0x06, 0x1a, 0x07, 0xbd, 0x02, 0x26, \n\t0x01, 0x43, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5e, 0x05, 0x2d, 0x01, 0x38, \n\t0x00, 0x09, 0x00, 0xb3, 0x36, 0x08, 0x0a, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x43, 0xff, 0xeb, 0x04, 0xee, 0x06, 0x85, 0x02, 0x26, \n\t0x01, 0x44, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5e, 0x04, 0xa4, 0x00, 0x00, \n\t0x00, 0x09, 0x00, 0xb3, 0x36, 0x08, 0x03, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x57, 0xff, 0xeb, 0x06, 0x1a, 0x07, 0x63, 0x02, 0x26, \n\t0x01, 0x43, 0x00, 0x00, 0x01, 0x07, 0x01, 0x58, 0x00, 0xdd, 0x01, 0x6a, \n\t0x00, 0x09, 0x00, 0xb3, 0x29, 0x08, 0x0a, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x43, 0xff, 0xeb, 0x04, 0xee, 0x06, 0x2b, 0x02, 0x26, \n\t0x01, 0x44, 0x00, 0x00, 0x01, 0x06, 0x01, 0x58, 0x53, 0x32, 0x00, 0x09, \n\t0x00, 0xb3, 0x29, 0x03, 0x03, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x57, 0xfe, 0x9e, 0x06, 0x1a, 0x06, 0x51, 0x02, 0x26, \n\t0x01, 0x43, 0x00, 0x00, 0x00, 0x07, 0x01, 0x60, 0x05, 0x0b, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x43, 0xfe, 0x96, 0x04, 0xee, 0x04, 0xcf, 0x02, 0x26, \n\t0x01, 0x44, 0x00, 0x00, 0x00, 0x07, 0x01, 0x60, 0x04, 0x99, 0xff, 0xf8, \n\t0xff, 0xff, 0x00, 0x78, 0xfe, 0x96, 0x05, 0x08, 0x05, 0xb0, 0x02, 0x26, \n\t0x00, 0x38, 0x00, 0x00, 0x00, 0x07, 0x01, 0x60, 0x05, 0x17, 0xff, 0xf8, \n\t0xff, 0xff, 0x00, 0x69, 0xfe, 0x9e, 0x04, 0x18, 0x04, 0x3a, 0x02, 0x26, \n\t0x00, 0x58, 0x00, 0x00, 0x00, 0x07, 0x01, 0x60, 0x04, 0x2f, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x78, 0xff, 0xeb, 0x05, 0x08, 0x07, 0xc7, 0x02, 0x26, \n\t0x00, 0x38, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5e, 0x05, 0x22, 0x01, 0x42, \n\t0x00, 0x09, 0x00, 0xb3, 0x12, 0x08, 0x09, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x69, 0xff, 0xeb, 0x04, 0x18, 0x06, 0x72, 0x02, 0x26, \n\t0x00, 0x58, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5e, 0x04, 0xa2, 0xff, 0xed, \n\t0x00, 0x09, 0x00, 0xb3, 0x14, 0x08, 0x08, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x78, 0xff, 0xeb, 0x06, 0x80, 0x07, 0x22, 0x02, 0x26, \n\t0x01, 0x45, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, 0x01, 0xcd, 0x01, 0x5c, \n\t0x00, 0x09, 0x00, 0xb3, 0x1f, 0x07, 0x12, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x69, 0xff, 0xeb, 0x05, 0x77, 0x05, 0xcb, 0x02, 0x26, \n\t0x01, 0x46, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, 0x01, 0x40, 0x00, 0x05, \n\t0x00, 0x09, 0x00, 0xb3, 0x22, 0x08, 0x0f, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x78, 0xff, 0xeb, 0x06, 0x80, 0x07, 0x22, 0x02, 0x26, \n\t0x01, 0x45, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, 0x01, 0x18, 0x01, 0x5c, \n\t0x00, 0x09, 0x00, 0xb3, 0x1c, 0x07, 0x12, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x69, 0xff, 0xeb, 0x05, 0x77, 0x05, 0xcb, 0x02, 0x26, \n\t0x01, 0x46, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, 0x00, 0x8b, 0x00, 0x05, \n\t0x00, 0x09, 0x00, 0xb3, 0x1f, 0x08, 0x0f, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x78, 0xff, 0xeb, 0x06, 0x80, 0x07, 0xc7, 0x02, 0x26, \n\t0x01, 0x45, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5e, 0x05, 0x2f, 0x01, 0x42, \n\t0x00, 0x09, 0x00, 0xb3, 0x1b, 0x08, 0x12, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x69, 0xff, 0xeb, 0x05, 0x77, 0x06, 0x72, 0x02, 0x26, \n\t0x01, 0x46, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5e, 0x04, 0xa2, 0xff, 0xed, \n\t0x00, 0x09, 0x00, 0xb3, 0x1e, 0x08, 0x0f, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x78, 0xff, 0xeb, 0x06, 0x80, 0x07, 0x6d, 0x02, 0x26, \n\t0x01, 0x45, 0x00, 0x00, 0x01, 0x07, 0x01, 0x58, 0x00, 0xdf, 0x01, 0x74, \n\t0x00, 0x09, 0x00, 0xb3, 0x1e, 0x08, 0x11, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x69, 0xff, 0xeb, 0x05, 0x77, 0x06, 0x16, 0x02, 0x26, \n\t0x01, 0x46, 0x00, 0x00, 0x01, 0x06, 0x01, 0x58, 0x52, 0x1d, 0x00, 0x09, \n\t0x00, 0xb3, 0x21, 0x09, 0x0e, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x78, 0xfe, 0x96, 0x06, 0x80, 0x06, 0x47, 0x02, 0x26, \n\t0x01, 0x45, 0x00, 0x00, 0x00, 0x07, 0x01, 0x60, 0x05, 0x24, 0xff, 0xf8, \n\t0xff, 0xff, 0x00, 0x69, 0xfe, 0x9e, 0x05, 0x77, 0x04, 0xac, 0x02, 0x26, \n\t0x01, 0x46, 0x00, 0x00, 0x00, 0x07, 0x01, 0x60, 0x04, 0x2f, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x05, 0x00, 0x00, 0x05, 0x07, 0x07, 0x22, 0x02, 0x26, \n\t0x00, 0x3c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, 0x00, 0xd7, 0x01, 0x5c, \n\t0x00, 0x09, 0x00, 0xb3, 0x0b, 0x07, 0x09, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x05, 0xfe, 0x4b, 0x04, 0x11, 0x05, 0xcb, 0x02, 0x26, \n\t0x00, 0x5c, 0x00, 0x00, 0x01, 0x06, 0x00, 0x43, 0x56, 0x05, 0x00, 0x09, \n\t0x00, 0xb3, 0x17, 0x08, 0x15, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x05, 0xfe, 0xa8, 0x05, 0x07, 0x05, 0xb0, 0x02, 0x26, \n\t0x00, 0x3c, 0x00, 0x00, 0x00, 0x07, 0x01, 0x60, 0x04, 0xe3, 0x00, 0x0a, \n\t0xff, 0xff, 0x00, 0x05, 0xfd, 0xf1, 0x04, 0x11, 0x04, 0x3a, 0x02, 0x26, \n\t0x00, 0x5c, 0x00, 0x00, 0x01, 0x07, 0x01, 0x60, 0x05, 0x54, 0xff, 0x53, \n\t0x00, 0x06, 0x00, 0xb0, 0x17, 0x2f, 0x30, 0x31, 0xff, 0xff, 0x00, 0x05, \n\t0x00, 0x00, 0x05, 0x07, 0x07, 0xc7, 0x02, 0x26, 0x00, 0x3c, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x5e, 0x04, 0xee, 0x01, 0x42, 0x00, 0x09, 0x00, 0xb3, \n\t0x0a, 0x08, 0x09, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x05, \n\t0xfe, 0x4b, 0x04, 0x11, 0x06, 0x72, 0x02, 0x26, 0x00, 0x5c, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x5e, 0x04, 0x6d, 0xff, 0xed, 0x00, 0x09, 0x00, 0xb3, \n\t0x16, 0x08, 0x15, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x05, \n\t0x00, 0x00, 0x05, 0x07, 0x07, 0x6d, 0x02, 0x26, 0x00, 0x3c, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x58, 0x00, 0x9e, 0x01, 0x74, 0x00, 0x09, 0x00, 0xb3, \n\t0x0d, 0x08, 0x08, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x05, \n\t0xfe, 0x4b, 0x04, 0x11, 0x06, 0x16, 0x02, 0x26, 0x00, 0x5c, 0x00, 0x00, \n\t0x01, 0x06, 0x01, 0x58, 0x1d, 0x1d, 0x00, 0x09, 0x00, 0xb3, 0x19, 0x09, \n\t0x14, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x41, \n\t0xff, 0xeb, 0x05, 0x1b, 0x06, 0x9d, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, \n\t0x01, 0x07, 0x03, 0x30, 0xfe, 0xcf, 0x00, 0xd8, 0x00, 0x10, 0x00, 0xb0, \n\t0x24, 0x2f, 0xb4, 0x4f, 0x24, 0x5f, 0x24, 0x02, 0x5d, 0xb0, 0x1d, 0xd0, \n\t0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x98, 0x02, 0x59, 0x04, 0xd4, \n\t0x03, 0x3d, 0x00, 0x46, 0x03, 0x1e, 0xda, 0x00, 0x53, 0x33, 0x40, 0x00, \n\t0xff, 0xff, 0x00, 0x9a, 0x02, 0x59, 0x05, 0xd0, 0x03, 0x3d, 0x00, 0x46, \n\t0x03, 0x1e, 0xb0, 0x00, 0x66, 0x66, 0x40, 0x00, 0xff, 0xff, 0x00, 0x9a, \n\t0x02, 0x59, 0x05, 0xd0, 0x03, 0x3d, 0x00, 0x46, 0x03, 0x1e, 0xb0, 0x00, \n\t0x66, 0x66, 0x40, 0x00, 0xff, 0xff, 0x00, 0x02, 0xfe, 0x27, 0x03, 0x90, \n\t0x00, 0x00, 0x00, 0x27, 0x00, 0x42, 0x00, 0x01, 0xff, 0x02, 0x01, 0x06, \n\t0x00, 0x42, 0x01, 0x00, 0x00, 0x3b, 0x00, 0xb2, 0xb0, 0x01, 0x01, 0x71, \n\t0xb4, 0xa0, 0x01, 0xb0, 0x01, 0x02, 0x72, 0x40, 0x09, 0x00, 0x01, 0x10, \n\t0x01, 0x20, 0x01, 0x30, 0x01, 0x04, 0x5d, 0xb6, 0x10, 0x01, 0x20, 0x01, \n\t0x30, 0x01, 0x03, 0x72, 0xb6, 0x10, 0x01, 0x20, 0x01, 0x30, 0x01, 0x03, \n\t0x71, 0x40, 0x0b, 0x70, 0x01, 0x80, 0x01, 0x90, 0x01, 0xa0, 0x01, 0xb0, \n\t0x01, 0x05, 0x5d, 0x30, 0x31, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x32, \n\t0x03, 0xf7, 0x01, 0x63, 0x06, 0x18, 0x00, 0x05, 0x00, 0x10, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x1a, 0x3e, 0x59, \n\t0x30, 0x31, 0x13, 0x13, 0x33, 0x03, 0x15, 0x23, 0x32, 0xa2, 0x8f, 0x3c, \n\t0xf5, 0x04, 0xb7, 0x01, 0x61, 0xfe, 0xa0, 0xc1, 0x00, 0x01, 0x00, 0x39, \n\t0x03, 0xf8, 0x01, 0x6b, 0x06, 0x18, 0x00, 0x05, 0x00, 0x10, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x1a, 0x3e, 0x59, \n\t0x30, 0x31, 0x01, 0x03, 0x23, 0x13, 0x35, 0x33, 0x01, 0x6b, 0xa2, 0x90, \n\t0x3c, 0xf6, 0x05, 0x56, 0xfe, 0xa2, 0x01, 0x5d, 0xc3, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x32, 0xfe, 0xf9, 0x01, 0x64, 0x01, 0x1f, 0x00, 0x05, \n\t0x00, 0x06, 0x00, 0xb0, 0x04, 0x2f, 0x30, 0x31, 0x25, 0x03, 0x23, 0x13, \n\t0x11, 0x33, 0x01, 0x64, 0x93, 0x9f, 0x3c, 0xf6, 0x13, 0xfe, 0xe6, 0x01, \n\t0x0a, 0x01, 0x1c, 0x00, 0xff, 0xff, 0x00, 0x11, 0x03, 0xf8, 0x01, 0x43, \n\t0x06, 0x18, 0x00, 0x47, 0x02, 0xf9, 0x01, 0x7c, 0x00, 0x00, 0xc0, 0x02, \n\t0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x32, 0x03, 0xf7, 0x02, 0xac, \n\t0x06, 0x18, 0x00, 0x26, 0x02, 0xf8, 0x00, 0x00, 0x00, 0x07, 0x02, 0xf8, \n\t0x01, 0x49, 0x00, 0x00, 0xff, 0xff, 0x00, 0x39, 0x03, 0xf8, 0x02, 0xbc, \n\t0x06, 0x18, 0x00, 0x26, 0x02, 0xf9, 0x00, 0x00, 0x00, 0x07, 0x02, 0xf9, \n\t0x01, 0x51, 0x00, 0x00, 0x00, 0x02, 0x00, 0x32, 0xff, 0x1f, 0x02, 0xaa, \n\t0x01, 0x2a, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x09, 0x00, 0xb0, 0x04, 0x2f, \n\t0xb0, 0x0a, 0xd0, 0x30, 0x31, 0x25, 0x03, 0x23, 0x13, 0x35, 0x33, 0x05, \n\t0x03, 0x23, 0x13, 0x35, 0x33, 0x01, 0x54, 0xa2, 0x80, 0x3c, 0xe6, 0x01, \n\t0x56, 0xa2, 0x81, 0x3c, 0xe7, 0x37, 0xfe, 0xe8, 0x01, 0x0c, 0xff, 0xf3, \n\t0xfe, 0xe8, 0x01, 0x14, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x39, \n\t0x00, 0x00, 0x04, 0x16, 0x05, 0xb0, 0x00, 0x0b, 0x00, 0x4c, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x10, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0e, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0e, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x0a, 0x10, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0xd0, 0xb0, 0x05, 0xd0, \n\t0x30, 0x31, 0x01, 0x21, 0x11, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, \n\t0x11, 0x21, 0x04, 0x16, 0xfe, 0xa1, 0xfe, 0xdc, 0xfe, 0xa6, 0x01, 0x5a, \n\t0x01, 0x24, 0x01, 0x5f, 0x03, 0x52, 0xfc, 0xae, 0x03, 0x52, 0xe8, 0x01, \n\t0x76, 0xfe, 0x8a, 0x00, 0x00, 0x01, 0x00, 0x62, 0xfe, 0x60, 0x04, 0x3f, \n\t0x05, 0xb0, 0x00, 0x13, 0x00, 0x7e, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x0e, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0a, 0x3e, \n\t0x59, 0xb1, 0x06, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x0e, 0x10, 0xb1, 0x08, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x09, 0xd0, 0xb0, 0x10, 0xd0, 0xb0, 0x11, \n\t0xd0, 0xb0, 0x06, 0x10, 0xb0, 0x12, 0xd0, 0xb0, 0x13, 0xd0, 0x30, 0x31, \n\t0x21, 0x21, 0x11, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, \n\t0x11, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x04, 0x3f, 0xfe, 0xa1, \n\t0xfe, 0xdb, 0xfe, 0xa7, 0x01, 0x59, 0xfe, 0xa7, 0x01, 0x59, 0x01, 0x25, \n\t0x01, 0x5f, 0xfe, 0xa1, 0x01, 0x5f, 0xfe, 0x60, 0x01, 0xa0, 0xe0, 0x02, \n\t0x78, 0xe2, 0x01, 0x76, 0xfe, 0x8a, 0xe2, 0xfd, 0x88, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x87, 0x01, 0xeb, 0x02, 0x64, 0x04, 0x0a, 0x00, 0x0d, \n\t0x00, 0x10, 0x00, 0xb0, 0x03, 0x2f, 0xb0, 0x0a, 0xb0, 0x0a, 0x2b, 0x58, \n\t0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, \n\t0x15, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x87, 0x82, 0x6b, 0x6e, \n\t0x82, 0x81, 0x6d, 0x6d, 0x82, 0x03, 0x26, 0x64, 0x80, 0x7f, 0x65, 0x5a, \n\t0x65, 0x7c, 0x7d, 0x64, 0xff, 0xff, 0x00, 0x90, 0x00, 0x00, 0x03, 0x6f, \n\t0x01, 0x00, 0x00, 0x26, 0x00, 0x11, 0x00, 0x00, 0x00, 0x07, 0x00, 0x11, \n\t0x01, 0xbb, 0x00, 0x00, 0xff, 0xff, 0x00, 0x90, 0x00, 0x00, 0x05, 0x13, \n\t0x01, 0x00, 0x00, 0x26, 0x00, 0x11, 0x00, 0x00, 0x00, 0x27, 0x00, 0x11, \n\t0x01, 0xbb, 0x00, 0x00, 0x00, 0x07, 0x00, 0x11, 0x03, 0x5f, 0x00, 0x00, \n\t0x00, 0x06, 0x00, 0x59, 0xff, 0xec, 0x07, 0x6d, 0x05, 0xc5, 0x00, 0x19, \n\t0x00, 0x27, 0x00, 0x35, 0x00, 0x43, 0x00, 0x51, 0x00, 0x55, 0x00, 0x92, \n\t0x00, 0xb0, 0x52, 0x2f, 0xb0, 0x54, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x1d, 0x2f, 0x1b, 0xb1, 0x1d, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x16, 0x2f, 0x1b, 0xb1, 0x16, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x0a, 0x3e, 0x59, 0xb0, 0x16, \n\t0x10, 0xb0, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, \n\t0x09, 0xd0, 0xb0, 0x1d, 0x10, 0xb0, 0x24, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, \n\t0x1b, 0xdc, 0x59, 0xb1, 0x2b, 0x04, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x1d, 0x10, 0xb1, 0x32, 0x04, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x16, 0x10, 0xb1, 0x39, 0x04, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, \n\t0xb1, 0x40, 0x04, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x39, 0x10, 0xb0, 0x47, 0xd0, 0xb0, 0x40, 0x10, 0xb0, 0x4e, 0xd0, \n\t0x30, 0x31, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x36, 0x36, 0x33, \n\t0x32, 0x16, 0x15, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x06, 0x06, \n\t0x23, 0x22, 0x26, 0x35, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, \n\t0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, \n\t0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x01, 0x14, 0x16, 0x33, \n\t0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x05, 0x14, \n\t0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, \n\t0x05, 0x27, 0x01, 0x17, 0x03, 0x2d, 0xad, 0x8f, 0x4a, 0x73, 0x27, 0x25, \n\t0x74, 0x4a, 0x90, 0xad, 0xac, 0x8f, 0x4b, 0x75, 0x25, 0x27, 0x72, 0x49, \n\t0x91, 0xad, 0xfd, 0x2c, 0xa4, 0x89, 0x90, 0xad, 0xac, 0x8f, 0x8a, 0xa5, \n\t0xb2, 0x40, 0x3d, 0x3a, 0x3f, 0x41, 0x3a, 0x3c, 0x3f, 0x02, 0xe4, 0x44, \n\t0x38, 0x41, 0x38, 0x40, 0x3b, 0x3b, 0x3f, 0x01, 0xc7, 0x44, 0x38, 0x41, \n\t0x38, 0x40, 0x3b, 0x3b, 0x3f, 0xfc, 0x17, 0x8e, 0x02, 0xc7, 0x8e, 0x01, \n\t0x65, 0x7f, 0xad, 0x38, 0x31, 0x31, 0x38, 0xad, 0x7f, 0x4d, 0x80, 0xac, \n\t0x37, 0x32, 0x32, 0x37, 0xac, 0x80, 0x03, 0x80, 0x7f, 0xae, 0xad, 0x80, \n\t0x4d, 0x7f, 0xac, 0xac, 0x7f, 0x3a, 0x4f, 0x4f, 0x3a, 0x4d, 0x3a, 0x51, \n\t0x51, 0x3a, 0xfc, 0x80, 0x39, 0x51, 0x4b, 0x3f, 0x4d, 0x39, 0x51, 0x50, \n\t0x3a, 0x4d, 0x39, 0x51, 0x4b, 0x3f, 0x4d, 0x39, 0x51, 0x50, 0x3a, 0xf8, \n\t0x4b, 0x04, 0x72, 0x4b, 0xff, 0xff, 0x00, 0x32, 0x03, 0xf0, 0x01, 0x18, \n\t0x06, 0x18, 0x02, 0x06, 0x00, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x32, \n\t0x04, 0x0f, 0x02, 0x5e, 0x06, 0x1b, 0x02, 0x06, 0x00, 0x05, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x6c, 0x00, 0x97, 0x02, 0x3f, 0x03, 0xb6, 0x00, 0x06, \n\t0x00, 0x09, 0x00, 0xb0, 0x05, 0x2f, 0xb0, 0x01, 0x2f, 0x30, 0x31, 0x01, \n\t0x13, 0x23, 0x01, 0x35, 0x01, 0x33, 0x01, 0x4f, 0xf0, 0xbb, 0xfe, 0xe8, \n\t0x01, 0x18, 0xbb, 0x02, 0x26, 0xfe, 0x71, 0x01, 0x86, 0x13, 0x01, 0x86, \n\t0x00, 0x01, 0x00, 0x50, 0x00, 0x97, 0x02, 0x24, 0x03, 0xb6, 0x00, 0x06, \n\t0x00, 0x09, 0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x03, 0x2f, 0x30, 0x31, 0x01, \n\t0x01, 0x15, 0x01, 0x23, 0x13, 0x03, 0x01, 0x0c, 0x01, 0x18, 0xfe, 0xe8, \n\t0xbc, 0xef, 0xef, 0x03, 0xb6, 0xfe, 0x7a, 0x13, 0xfe, 0x7a, 0x01, 0x8f, \n\t0x01, 0x90, 0x00, 0x00, 0xff, 0xff, 0x00, 0x86, 0x00, 0x00, 0x03, 0xd7, \n\t0x05, 0xb0, 0x00, 0x26, 0x00, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x04, \n\t0x02, 0x2d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1d, 0x00, 0x6d, 0x03, 0x72, \n\t0x05, 0x2a, 0x00, 0x03, 0x00, 0x09, 0x00, 0xb0, 0x02, 0x2f, 0xb0, 0x00, \n\t0x2f, 0x30, 0x31, 0x37, 0x27, 0x01, 0x17, 0xab, 0x8e, 0x02, 0xc7, 0x8e, \n\t0x6d, 0x4b, 0x04, 0x72, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x36, \n\t0x02, 0x30, 0x03, 0x5a, 0x05, 0xc5, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x3c, \n\t0x00, 0xb0, 0x04, 0x2f, 0xb0, 0x02, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x10, 0x3e, 0x59, 0xb0, 0x02, 0x10, 0xb0, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x02, 0x10, \n\t0xb0, 0x06, 0xd0, 0xb2, 0x08, 0x02, 0x01, 0x11, 0x12, 0x39, 0xb0, 0x01, \n\t0x10, 0xb0, 0x0b, 0xd0, 0xb0, 0x09, 0x10, 0xb0, 0x0c, 0xd0, 0x30, 0x31, \n\t0x01, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x21, 0x27, 0x01, 0x33, 0x03, \n\t0x11, 0x27, 0x03, 0x02, 0xec, 0x6e, 0x6e, 0xdd, 0xfe, 0x2b, 0x04, 0x01, \n\t0xd4, 0xe2, 0xdd, 0x06, 0xe3, 0x03, 0x84, 0xaa, 0xaa, 0xaa, 0x7c, 0x02, \n\t0x6f, 0xfd, 0xbf, 0x01, 0x29, 0x02, 0xfe, 0xd5, 0x00, 0x01, 0x00, 0x56, \n\t0x02, 0x8d, 0x03, 0x05, 0x05, 0xba, 0x00, 0x13, 0x00, 0x67, 0x00, 0xb0, \n\t0x11, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, \n\t0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, \n\t0x04, 0x10, 0x3e, 0x59, 0xb2, 0x5f, 0x11, 0x01, 0x5d, 0xb2, 0xef, 0x11, \n\t0x01, 0x71, 0xb2, 0x4f, 0x11, 0x01, 0x72, 0xb2, 0xaf, 0x11, 0x01, 0x72, \n\t0xb2, 0xdf, 0x11, 0x01, 0x72, 0xb2, 0x7f, 0x11, 0x01, 0x72, 0xb2, 0x1f, \n\t0x11, 0x01, 0x72, 0xb2, 0xbf, 0x11, 0x01, 0x71, 0xb2, 0xf0, 0x11, 0x01, \n\t0x5d, 0xb2, 0x20, 0x11, 0x01, 0x71, 0xb0, 0x11, 0x10, 0xb0, 0x09, 0xd0, \n\t0xb0, 0x04, 0x10, 0xb1, 0x0d, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0x30, 0x31, 0x13, 0x17, 0x36, 0x36, 0x33, 0x32, 0x16, \n\t0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x23, \n\t0x11, 0xff, 0x20, 0x24, 0x71, 0x4a, 0x7f, 0x88, 0xd5, 0x40, 0x3f, 0x31, \n\t0x43, 0x11, 0xd6, 0x05, 0xae, 0x7b, 0x40, 0x47, 0x96, 0x9d, 0xfe, 0x06, \n\t0x01, 0xbc, 0x65, 0x58, 0x2a, 0x26, 0xfd, 0xd7, 0x03, 0x21, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x12, 0x00, 0x00, 0x04, 0x74, 0x05, 0xb0, 0x00, 0x11, \n\t0x00, 0x5f, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, \n\t0x0c, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, \n\t0xb1, 0x06, 0x0a, 0x3e, 0x59, 0xb2, 0x10, 0x06, 0x0c, 0x11, 0x12, 0x39, \n\t0xb0, 0x10, 0x2f, 0xb1, 0x01, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb2, 0x02, 0x06, 0x0c, 0x11, 0x12, 0x39, 0xb0, 0x02, \n\t0x2f, 0xb0, 0x05, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, \n\t0x08, 0xd0, 0xb0, 0x02, 0x10, 0xb0, 0x0b, 0xd0, 0xb0, 0x0c, 0x10, 0xb1, \n\t0x0f, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, \n\t0x31, 0x01, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x35, 0x23, 0x35, \n\t0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x04, 0x0e, 0xfd, 0x9e, 0x01, \n\t0x05, 0xfe, 0xfb, 0xfe, 0xdc, 0x76, 0x76, 0x03, 0xec, 0xfd, 0x38, 0x02, \n\t0x62, 0x02, 0x5d, 0xba, 0xc8, 0xdb, 0xdb, 0xc8, 0x04, 0x0d, 0xe1, 0xfe, \n\t0x6f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x58, 0x00, 0x00, 0x04, 0x80, \n\t0x05, 0xc5, 0x00, 0x2a, 0x00, 0x76, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x18, 0x2f, 0x1b, 0xb1, 0x18, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0a, 0x3e, 0x59, 0xb2, 0x26, 0x29, \n\t0x03, 0x2b, 0xb0, 0x06, 0x10, 0xb1, 0x05, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x08, 0xd0, 0xb0, 0x29, 0x10, 0xb0, \n\t0x2a, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x0e, 0xd0, \n\t0xb0, 0x29, 0x10, 0xb0, 0x10, 0xd0, 0xb0, 0x26, 0x10, 0xb0, 0x11, 0xd0, \n\t0xb0, 0x26, 0x10, 0xb0, 0x25, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, \n\t0x59, 0xb0, 0x14, 0xd0, 0xb0, 0x18, 0x10, 0xb1, 0x20, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x1d, 0x25, 0x20, 0x11, \n\t0x12, 0x39, 0x30, 0x31, 0x01, 0x15, 0x14, 0x06, 0x07, 0x21, 0x15, 0x21, \n\t0x35, 0x33, 0x36, 0x36, 0x35, 0x35, 0x23, 0x35, 0x33, 0x27, 0x23, 0x27, \n\t0x33, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x07, 0x07, 0x21, 0x34, 0x26, \n\t0x23, 0x22, 0x06, 0x15, 0x17, 0x21, 0x15, 0x21, 0x17, 0x21, 0x15, 0x02, \n\t0x28, 0x25, 0x24, 0x02, 0xa1, 0xfc, 0x1c, 0x0a, 0x30, 0x2e, 0xab, 0xa4, \n\t0x04, 0xa0, 0x01, 0x9a, 0x03, 0xf1, 0xca, 0xd7, 0xed, 0x04, 0x02, 0xfe, \n\t0xe4, 0x5c, 0x47, 0x46, 0x50, 0x03, 0x01, 0x64, 0xfe, 0xa3, 0x04, 0x01, \n\t0x59, 0x01, 0xb6, 0x02, 0x29, 0x7e, 0x2d, 0xe0, 0xe0, 0x0d, 0x92, 0x35, \n\t0x02, 0xc8, 0x66, 0xc8, 0x6b, 0xbe, 0xf0, 0xdf, 0xb7, 0x06, 0x60, 0x5b, \n\t0x75, 0x58, 0x6b, 0xc8, 0x66, 0xc8, 0x00, 0x00, 0x00, 0x02, 0x00, 0x8d, \n\t0xff, 0xeb, 0x06, 0x38, 0x05, 0xb0, 0x00, 0x23, 0x00, 0x2c, 0x00, 0x7f, \n\t0x00, 0xb0, 0x19, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1c, 0x2f, 0x1b, \n\t0xb1, 0x1c, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x22, 0x2f, \n\t0x1b, 0xb1, 0x22, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1b, \n\t0x2f, 0x1b, 0xb1, 0x1b, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x0a, 0x3e, 0x59, 0xb0, 0x22, 0x10, 0xb0, \n\t0x01, 0xd0, 0xb0, 0x22, 0x10, 0xb1, 0x13, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0xd0, 0xb0, 0x0f, 0x10, 0xb1, \n\t0x08, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x19, 0x10, 0xb1, 0x24, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x1c, 0x10, 0xb1, 0x2c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x11, 0x33, 0x15, 0x23, \n\t0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, \n\t0x26, 0x35, 0x11, 0x23, 0x06, 0x07, 0x06, 0x23, 0x23, 0x11, 0x21, 0x11, \n\t0x21, 0x32, 0x17, 0x16, 0x17, 0x33, 0x11, 0x01, 0x33, 0x32, 0x36, 0x35, \n\t0x34, 0x26, 0x23, 0x23, 0x05, 0x71, 0xb6, 0xb6, 0x34, 0x2c, 0x17, 0x21, \n\t0x16, 0x19, 0x2c, 0x54, 0x31, 0x97, 0xa3, 0x22, 0x1d, 0x64, 0x8e, 0xfe, \n\t0x5e, 0xfe, 0xcd, 0x01, 0x91, 0xfe, 0x8e, 0x6e, 0x19, 0x1c, 0xfd, 0x73, \n\t0x5e, 0x73, 0x74, 0x74, 0x73, 0x5e, 0x05, 0x43, 0xfe, 0xf7, 0xcd, 0xfd, \n\t0xd9, 0x3f, 0x36, 0x05, 0x06, 0xd3, 0x0f, 0x0f, 0xa6, 0xb4, 0x02, 0x28, \n\t0x85, 0x5c, 0x83, 0xfd, 0xf7, 0x05, 0xb0, 0x81, 0x64, 0x91, 0x01, 0x09, \n\t0xfd, 0xb7, 0x86, 0x61, 0x5d, 0x81, 0x00, 0x00, 0xff, 0xff, 0x00, 0x43, \n\t0xfe, 0xa7, 0x04, 0xa2, 0x06, 0x18, 0x00, 0x26, 0x00, 0x47, 0x00, 0x00, \n\t0x00, 0x27, 0x03, 0x46, 0x01, 0x67, 0x02, 0x3c, 0x01, 0x07, 0x00, 0x42, \n\t0x00, 0x94, 0xff, 0x82, 0x00, 0x1e, 0x00, 0xb2, 0x9f, 0x22, 0x01, 0x5d, \n\t0xb4, 0x2f, 0x22, 0x3f, 0x22, 0x02, 0x5d, 0xb2, 0xef, 0x22, 0x01, 0x5d, \n\t0xb2, 0x7f, 0x22, 0x01, 0x5d, 0xb2, 0xf0, 0x22, 0x01, 0x5d, 0x30, 0x31, \n\t0x00, 0x01, 0x00, 0x47, 0xff, 0xeb, 0x03, 0xed, 0x05, 0xc5, 0x00, 0x2b, \n\t0x00, 0x8d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1b, 0x2f, 0x1b, 0xb1, \n\t0x1b, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, \n\t0xb1, 0x0c, 0x0a, 0x3e, 0x59, 0xb2, 0x2b, 0x27, 0x03, 0x2b, 0xb2, 0x1f, \n\t0x2b, 0x01, 0x71, 0xb2, 0xbf, 0x2b, 0x01, 0x71, 0xb0, 0x2b, 0x10, 0xb0, \n\t0x00, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x0c, 0x10, \n\t0xb1, 0x05, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x00, 0x10, 0xb0, 0x11, 0xd0, 0xb0, 0x2b, 0x10, 0xb0, 0x13, 0xd0, \n\t0xb2, 0x0f, 0x27, 0x01, 0x5d, 0xb2, 0xbf, 0x27, 0x01, 0x71, 0xb2, 0x7f, \n\t0x27, 0x01, 0x5d, 0xb2, 0x1f, 0x27, 0x01, 0x71, 0xb0, 0x27, 0x10, 0xb0, \n\t0x28, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x14, 0xd0, \n\t0xb0, 0x27, 0x10, 0xb0, 0x17, 0xd0, 0xb0, 0x1b, 0x10, 0xb1, 0x22, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, \n\t0x21, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, \n\t0x22, 0x00, 0x35, 0x35, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0x35, \n\t0x34, 0x00, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x06, \n\t0x15, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x03, 0xa9, 0xfe, 0x54, 0x87, \n\t0x78, 0x3a, 0x6f, 0x33, 0x15, 0x39, 0x7a, 0x3e, 0xf5, 0xfe, 0xd2, 0x92, \n\t0x92, 0x92, 0x92, 0x01, 0x2d, 0xf4, 0x3c, 0x73, 0x44, 0x15, 0x35, 0x71, \n\t0x38, 0x76, 0x87, 0x01, 0xac, 0xfe, 0x54, 0x01, 0xac, 0x01, 0xc7, 0x08, \n\t0x63, 0x91, 0x11, 0x11, 0xe3, 0x0f, 0x10, 0x01, 0x13, 0xc1, 0x08, 0xc8, \n\t0x74, 0xc8, 0x0d, 0xcb, 0x01, 0x22, 0x10, 0x0f, 0xe5, 0x10, 0x13, 0xa1, \n\t0x69, 0x0f, 0xc8, 0x74, 0x00, 0x04, 0x00, 0x64, 0xff, 0xec, 0x05, 0x91, \n\t0x05, 0xc5, 0x00, 0x1d, 0x00, 0x2b, 0x00, 0x39, 0x00, 0x3d, 0x00, 0x79, \n\t0x00, 0xb0, 0x3a, 0x2f, 0xb0, 0x3c, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x28, 0x2f, 0x1b, 0xb1, 0x28, 0x0a, 0x3e, 0x59, 0xb0, 0x0b, 0x10, \n\t0xb0, 0x04, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x0b, \n\t0x10, 0xb1, 0x13, 0x04, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x04, 0x10, 0xb1, 0x1a, 0x04, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x28, 0x10, 0xb0, 0x21, 0xb0, 0x0a, 0x2b, \n\t0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x28, 0x10, 0xb1, 0x2f, 0x04, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x21, 0x10, 0xb1, \n\t0x36, 0x04, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, \n\t0x31, 0x01, 0x17, 0x16, 0x06, 0x23, 0x22, 0x26, 0x35, 0x35, 0x34, 0x36, \n\t0x33, 0x32, 0x16, 0x07, 0x07, 0x23, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, \n\t0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x01, 0x34, 0x36, 0x33, 0x32, \n\t0x16, 0x15, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, \n\t0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x05, \n\t0x27, 0x01, 0x17, 0x02, 0xad, 0x02, 0x04, 0x9a, 0x8b, 0x8d, 0x9d, 0x9d, \n\t0x8b, 0x8c, 0x9b, 0x04, 0x02, 0xba, 0x36, 0x31, 0x32, 0x34, 0x35, 0x33, \n\t0x30, 0x35, 0x01, 0x24, 0xa8, 0x95, 0x96, 0xa7, 0xa6, 0x95, 0x96, 0xa9, \n\t0xc2, 0x45, 0x38, 0x41, 0x38, 0x40, 0x3b, 0x3c, 0x3f, 0xfd, 0xe9, 0x8e, \n\t0x02, 0xc7, 0x8e, 0x04, 0x28, 0x06, 0x6b, 0x97, 0xaa, 0x81, 0x4d, 0x81, \n\t0xac, 0x98, 0x6c, 0x06, 0x29, 0x3f, 0x50, 0x3b, 0x4d, 0x3a, 0x4f, 0x3e, \n\t0x28, 0xfd, 0x3d, 0x80, 0xac, 0xab, 0x81, 0x4d, 0x82, 0xaa, 0xab, 0x81, \n\t0x39, 0x51, 0x4b, 0x3f, 0x4d, 0x39, 0x51, 0x51, 0x39, 0xf8, 0x4b, 0x04, \n\t0x72, 0x4b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1a, 0xff, 0xed, 0x03, 0xaf, \n\t0x05, 0xc5, 0x00, 0x1b, 0x00, 0x27, 0x00, 0x5f, 0x00, 0xb0, 0x17, 0x2f, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x10, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x17, 0x10, 0xb0, 0x04, 0xd0, 0xb1, 0x0c, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb1, \n\t0x1b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x10, 0x10, 0xb1, 0x20, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x17, 0x10, 0xb1, 0x24, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x05, 0x07, 0x06, 0x24, 0x35, \n\t0x35, 0x06, 0x06, 0x23, 0x35, 0x32, 0x36, 0x37, 0x11, 0x34, 0x36, 0x33, \n\t0x32, 0x16, 0x15, 0x15, 0x14, 0x02, 0x07, 0x15, 0x14, 0x16, 0x33, 0x03, \n\t0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x17, 0x36, 0x36, 0x02, \n\t0xe9, 0x05, 0xff, 0xfe, 0xfd, 0x31, 0x64, 0x33, 0x36, 0x65, 0x2d, 0xc9, \n\t0xaf, 0x96, 0xbf, 0xdb, 0xbf, 0x60, 0x74, 0x40, 0x29, 0x1e, 0x25, 0x28, \n\t0x06, 0x45, 0x49, 0x0e, 0x02, 0x03, 0xee, 0xd4, 0x03, 0x08, 0x08, 0xbb, \n\t0x09, 0x09, 0x01, 0x97, 0xd1, 0xee, 0xbb, 0x9d, 0x2a, 0x90, 0xfe, 0xc8, \n\t0x63, 0x34, 0x7b, 0x79, 0x03, 0x51, 0x2c, 0x31, 0x3c, 0x57, 0x54, 0xfe, \n\t0xe0, 0x01, 0x39, 0xa4, 0xff, 0xff, 0x00, 0x7f, 0x00, 0x00, 0x08, 0x73, \n\t0x05, 0xc2, 0x00, 0x22, 0x00, 0x31, 0xf7, 0x00, 0x00, 0x23, 0x00, 0x7c, \n\t0x05, 0x23, 0xff, 0xfd, 0x00, 0x03, 0x00, 0x10, 0x05, 0xce, 0xff, 0x16, \n\t0x00, 0x02, 0x00, 0x60, 0x03, 0x93, 0x04, 0x63, 0x05, 0xb0, 0x00, 0x0f, \n\t0x00, 0x17, 0x00, 0x3f, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x16, 0x2f, \n\t0x1b, 0xb1, 0x16, 0x10, 0x3e, 0x59, 0xb0, 0x13, 0xb0, 0x0a, 0x2b, 0x58, \n\t0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x07, 0xd0, 0xb0, 0x03, 0xd0, 0xb0, 0x16, \n\t0x10, 0xb0, 0x08, 0xd0, 0xb0, 0x0c, 0xd0, 0xb0, 0x03, 0x10, 0xb0, 0x0f, \n\t0xd0, 0xb0, 0x16, 0x10, 0xb0, 0x15, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, \n\t0xdc, 0x59, 0xb0, 0x11, 0xd0, 0x30, 0x31, 0x01, 0x27, 0x03, 0x23, 0x03, \n\t0x07, 0x11, 0x23, 0x11, 0x33, 0x13, 0x33, 0x13, 0x33, 0x11, 0x23, 0x01, \n\t0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x21, 0x03, 0xe2, 0x06, 0x69, 0x49, \n\t0x6e, 0x06, 0x81, 0x9f, 0x77, 0x06, 0x78, 0x9a, 0x81, 0xfe, 0x0c, 0x80, \n\t0x90, 0x7e, 0x01, 0x8e, 0x04, 0xad, 0x01, 0xfe, 0xe5, 0x01, 0x2a, 0x01, \n\t0xfe, 0xd7, 0x02, 0x1d, 0xfe, 0x96, 0x01, 0x6a, 0xfd, 0xe3, 0x01, 0xb4, \n\t0xfe, 0x4e, 0x01, 0xb2, 0x69, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x94, \n\t0xff, 0xec, 0x04, 0x8f, 0x04, 0x4e, 0x00, 0x15, 0x00, 0x1e, 0x00, 0x4e, \n\t0x00, 0xb0, 0x0d, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, \n\t0xb1, 0x09, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, \n\t0x1b, 0xb1, 0x03, 0x0a, 0x3e, 0x59, 0xb0, 0x12, 0xb0, 0x0a, 0x2b, 0x58, \n\t0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x09, 0x10, 0xb0, 0x16, 0xb0, 0x0a, 0x2b, \n\t0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb2, 0x70, 0x16, 0x01, 0x71, 0xb2, 0xd0, \n\t0x16, 0x01, 0x72, 0xb0, 0x0d, 0x10, 0xb0, 0x1b, 0xb0, 0x0a, 0x2b, 0x58, \n\t0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, 0x25, 0x06, 0x06, 0x23, 0x22, 0x00, \n\t0x35, 0x34, 0x00, 0x33, 0x32, 0x00, 0x15, 0x15, 0x21, 0x11, 0x16, 0x16, \n\t0x33, 0x32, 0x36, 0x37, 0x01, 0x22, 0x06, 0x07, 0x11, 0x21, 0x11, 0x26, \n\t0x26, 0x04, 0x12, 0x57, 0xbc, 0x5f, 0xda, 0xfe, 0xce, 0x01, 0x43, 0xc9, \n\t0xcf, 0x01, 0x20, 0xfd, 0x00, 0x37, 0x8d, 0x4d, 0x5f, 0xba, 0x57, 0xfe, \n\t0x90, 0x4a, 0x8d, 0x3a, 0x02, 0x1c, 0x36, 0x8b, 0x5e, 0x37, 0x3b, 0x01, \n\t0x49, 0xe8, 0xe2, 0x01, 0x4f, 0xfe, 0xca, 0xe7, 0x2f, 0xfe, 0xb8, 0x35, \n\t0x39, 0x3c, 0x3e, 0x03, 0x2a, 0x41, 0x39, 0xfe, 0xeb, 0x01, 0x1e, 0x34, \n\t0x3d, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5a, 0xff, 0xf5, 0x06, 0x60, \n\t0x05, 0xb2, 0x00, 0x27, 0x03, 0x72, 0x00, 0x0c, 0x02, 0x86, 0x00, 0x27, \n\t0x03, 0x0a, 0x01, 0x06, 0x00, 0x00, 0x01, 0x07, 0x03, 0x31, 0x03, 0x4b, \n\t0x00, 0x00, 0x00, 0x26, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, \n\t0x1b, 0xb1, 0x05, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x13, \n\t0x2f, 0x1b, 0xb1, 0x13, 0x0a, 0x3e, 0x59, 0xb0, 0x2b, 0xd0, 0xb0, 0x13, \n\t0x10, 0xb0, 0x37, 0xd0, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5d, \n\t0xff, 0xf5, 0x06, 0xf7, 0x05, 0xc0, 0x00, 0x27, 0x03, 0x6f, 0x00, 0x04, \n\t0x02, 0x94, 0x00, 0x27, 0x03, 0x0a, 0x01, 0xbf, 0x00, 0x00, 0x01, 0x07, \n\t0x03, 0x31, 0x03, 0xe2, 0x00, 0x00, 0x00, 0x26, 0x00, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x10, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x38, 0x2f, 0x1b, 0xb1, 0x38, 0x0a, 0x3e, 0x59, 0xb0, \n\t0x50, 0xd0, 0xb0, 0x38, 0x10, 0xb0, 0x5c, 0xd0, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x5f, 0xff, 0xf5, 0x07, 0x27, 0x05, 0xaf, 0x00, 0x27, \n\t0x03, 0x6d, 0xff, 0xfe, 0x02, 0x8e, 0x00, 0x27, 0x03, 0x0a, 0x01, 0xf7, \n\t0x00, 0x00, 0x01, 0x07, 0x03, 0x31, 0x04, 0x12, 0x00, 0x00, 0x00, 0x26, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x10, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x2d, 0x2f, 0x1b, 0xb1, 0x2d, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x45, 0xd0, 0xb0, 0x2d, 0x10, 0xb0, 0x51, 0xd0, \n\t0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4e, 0xff, 0xf5, 0x06, 0x80, \n\t0x05, 0xaf, 0x00, 0x27, 0x03, 0x77, 0x00, 0x0c, 0x02, 0x8e, 0x00, 0x27, \n\t0x03, 0x0a, 0x01, 0x36, 0x00, 0x00, 0x01, 0x07, 0x03, 0x31, 0x03, 0x6b, \n\t0x00, 0x00, 0x00, 0x26, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, \n\t0x1b, 0xb1, 0x0c, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1a, \n\t0x2f, 0x1b, 0xb1, 0x1a, 0x0a, 0x3e, 0x59, 0xb0, 0x32, 0xd0, 0xb0, 0x1a, \n\t0x10, 0xb0, 0x3e, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3f, \n\t0xff, 0xeb, 0x04, 0x70, 0x05, 0xed, 0x00, 0x14, 0x00, 0x21, 0x00, 0x3a, \n\t0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x0d, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x10, 0xb0, \n\t0x14, 0xd0, 0xb0, 0x07, 0x10, 0xb1, 0x15, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0d, 0x10, 0xb1, 0x1c, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x04, \n\t0x00, 0x11, 0x15, 0x14, 0x00, 0x23, 0x22, 0x00, 0x35, 0x34, 0x12, 0x33, \n\t0x32, 0x16, 0x17, 0x37, 0x26, 0x26, 0x27, 0x13, 0x32, 0x36, 0x35, 0x35, \n\t0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x01, 0xea, 0x01, 0x21, \n\t0x01, 0x65, 0xfe, 0xc6, 0xeb, 0xe8, 0xfe, 0xdc, 0xff, 0xe1, 0x53, 0x93, \n\t0x2f, 0x03, 0x1a, 0xe9, 0xa6, 0xc1, 0x6b, 0x92, 0x23, 0x84, 0x59, 0x73, \n\t0x76, 0x80, 0x05, 0xed, 0x3c, 0xfe, 0x6a, 0xfe, 0xd8, 0xdc, 0xf5, 0xfe, \n\t0xc9, 0x01, 0x19, 0xd0, 0xe3, 0x01, 0x10, 0x32, 0x2b, 0x06, 0x9b, 0xc4, \n\t0x2c, 0xfb, 0xd0, 0xbe, 0x8e, 0x7b, 0x2a, 0x37, 0x9e, 0x81, 0x70, 0x99, \n\t0x00, 0x01, 0x00, 0xa4, 0xff, 0x08, 0x04, 0xef, 0x05, 0xb0, 0x00, 0x07, \n\t0x00, 0x28, 0x00, 0xb0, 0x04, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, \n\t0x2f, 0x1b, 0xb1, 0x06, 0x10, 0x3e, 0x59, 0xb0, 0x04, 0x10, 0xb0, 0x01, \n\t0xd0, 0xb0, 0x06, 0x10, 0xb1, 0x02, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x05, 0x23, 0x11, 0x21, 0x11, 0x23, \n\t0x11, 0x21, 0x04, 0xef, 0xe6, 0xfd, 0x82, 0xe7, 0x04, 0x4b, 0xf8, 0x05, \n\t0xcb, 0xfa, 0x35, 0x06, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x39, \n\t0xfe, 0xf3, 0x04, 0xd6, 0x05, 0xb0, 0x00, 0x0c, 0x00, 0x52, 0x00, 0xb0, \n\t0x03, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, \n\t0x10, 0x3e, 0x59, 0xb2, 0x06, 0x03, 0x08, 0x11, 0x12, 0x39, 0xb0, 0x06, \n\t0x10, 0xb0, 0x00, 0xd0, 0xb0, 0x03, 0x10, 0xb1, 0x02, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x05, 0x03, 0x02, 0x11, \n\t0x12, 0x39, 0xb0, 0x08, 0x10, 0xb1, 0x0a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x07, 0x0a, 0x08, 0x11, 0x12, 0x39, \n\t0xb0, 0x06, 0x10, 0xb0, 0x0c, 0xd0, 0x30, 0x31, 0x01, 0x01, 0x21, 0x15, \n\t0x21, 0x35, 0x01, 0x01, 0x35, 0x21, 0x15, 0x21, 0x01, 0x03, 0x98, 0xfe, \n\t0x2e, 0x03, 0x10, 0xfb, 0x63, 0x02, 0x3f, 0xfd, 0xc1, 0x04, 0x7b, 0xfd, \n\t0x14, 0x01, 0xd0, 0x02, 0x27, 0xfd, 0xad, 0xe1, 0x97, 0x02, 0xcc, 0x02, \n\t0xc3, 0x97, 0xe1, 0xfd, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x92, \n\t0x02, 0x59, 0x03, 0xd4, 0x03, 0x3d, 0x00, 0x03, 0x00, 0x10, 0x00, 0xb0, \n\t0x03, 0x2f, 0xb0, 0x00, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, \n\t0x30, 0x31, 0x01, 0x21, 0x35, 0x21, 0x03, 0xd4, 0xfc, 0xbe, 0x03, 0x42, \n\t0x02, 0x59, 0xe4, 0x00, 0x00, 0x01, 0x00, 0x37, 0x00, 0x00, 0x04, 0x5e, \n\t0x05, 0xb0, 0x00, 0x0b, 0x00, 0x32, 0x00, 0xb0, 0x0a, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x10, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x01, 0xd0, 0xb0, 0x0a, 0x10, 0xb1, 0x09, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x17, 0x33, 0x37, \n\t0x01, 0x33, 0x01, 0x23, 0x03, 0x23, 0x35, 0x21, 0x02, 0x15, 0x29, 0x06, \n\t0x22, 0x01, 0x20, 0xd8, 0xfe, 0x5e, 0xea, 0xbd, 0xde, 0x01, 0x7e, 0x01, \n\t0x9a, 0xaf, 0xaf, 0x04, 0x16, 0xfa, 0x50, 0x02, 0x16, 0xe4, 0x00, 0x00, \n\t0x00, 0x03, 0x00, 0x60, 0xff, 0xeb, 0x07, 0xfc, 0x04, 0x4e, 0x00, 0x19, \n\t0x00, 0x27, 0x00, 0x35, 0x00, 0x5e, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x16, 0x2f, 0x1b, 0xb1, 0x16, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0a, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0a, 0x3e, 0x59, 0xb0, \n\t0x16, 0x10, 0xb1, 0x1d, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x24, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x2b, 0xd0, 0xb0, 0x1d, 0x10, 0xb0, \n\t0x32, 0xd0, 0x30, 0x31, 0x01, 0x14, 0x00, 0x23, 0x22, 0x26, 0x27, 0x06, \n\t0x06, 0x23, 0x22, 0x00, 0x35, 0x35, 0x34, 0x00, 0x33, 0x32, 0x16, 0x17, \n\t0x36, 0x36, 0x33, 0x32, 0x00, 0x15, 0x21, 0x34, 0x26, 0x23, 0x22, 0x06, \n\t0x07, 0x15, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x21, 0x14, 0x16, 0x33, \n\t0x32, 0x36, 0x37, 0x35, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x07, 0xfc, \n\t0xfe, 0xe4, 0xee, 0x99, 0xe1, 0x4a, 0x4c, 0xe1, 0x97, 0xef, 0xfe, 0xe5, \n\t0x01, 0x1b, 0xed, 0x99, 0xe1, 0x4c, 0x4a, 0xe2, 0x9a, 0xec, 0x01, 0x1c, \n\t0xfe, 0xdc, 0x75, 0x6f, 0x80, 0xa4, 0x10, 0x0d, 0xa8, 0x7d, 0x70, 0x76, \n\t0xfa, 0xac, 0x74, 0x72, 0x7c, 0xa8, 0x0d, 0x0f, 0xa5, 0x7f, 0x70, 0x74, \n\t0x02, 0x01, 0xea, 0xfe, 0xd4, 0xb0, 0x8a, 0x8b, 0xaf, 0x01, 0x2c, 0xea, \n\t0x36, 0xe9, 0x01, 0x2e, 0xac, 0x86, 0x86, 0xac, 0xfe, 0xd2, 0xe9, 0x8a, \n\t0xac, 0xe8, 0x53, 0x1e, 0x55, 0xf4, 0xa9, 0x8d, 0x8d, 0xa9, 0xf5, 0x54, \n\t0x1e, 0x52, 0xe9, 0xac, 0x8a, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xa5, \n\t0xfe, 0x4b, 0x02, 0xbf, 0x06, 0x2d, 0x00, 0x1b, 0x00, 0x2e, 0x00, 0xb0, \n\t0x11, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, \n\t0x0c, 0x3e, 0x59, 0xb1, 0x0a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x11, 0x10, 0xb1, 0x18, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x05, 0x14, 0x06, 0x23, \n\t0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x34, \n\t0x36, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, \n\t0x01, 0xb2, 0xc9, 0xb4, 0x29, 0x41, 0x26, 0x0f, 0x17, 0x32, 0x19, 0x39, \n\t0x40, 0xd2, 0xbe, 0x25, 0x4b, 0x30, 0x19, 0x1a, 0x2a, 0x1d, 0x47, 0x4c, \n\t0x28, 0xbf, 0xce, 0x08, 0x09, 0xdd, 0x06, 0x07, 0x5a, 0x52, 0x04, 0xda, \n\t0xb6, 0xc5, 0x0b, 0x0a, 0xd7, 0x05, 0x06, 0x51, 0x49, 0x00, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x65, 0x00, 0xea, 0x04, 0x33, 0x04, 0x03, 0x00, 0x19, \n\t0x00, 0x33, 0x00, 0x4a, 0x00, 0xb2, 0x16, 0x1d, 0x03, 0x2b, 0xb0, 0x16, \n\t0x10, 0xb1, 0x03, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x09, 0xd0, 0xb0, 0x03, 0x10, 0xb0, 0x0c, 0xd0, 0xb0, 0x16, \n\t0x10, 0xb0, 0x10, 0xd0, 0xb0, 0x19, 0xd0, 0xb0, 0x1d, 0x10, 0xb0, 0x23, \n\t0xd0, 0xb0, 0x1d, 0x10, 0xb0, 0x26, 0xd0, 0xb0, 0x1d, 0x10, 0xb1, 0x30, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x2a, \n\t0xd0, 0xb0, 0x33, 0xd0, 0x30, 0x31, 0x13, 0x36, 0x36, 0x33, 0x36, 0x16, \n\t0x17, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, \n\t0x26, 0x27, 0x26, 0x26, 0x07, 0x22, 0x06, 0x07, 0x07, 0x36, 0x36, 0x33, \n\t0x36, 0x16, 0x17, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, \n\t0x23, 0x22, 0x26, 0x27, 0x26, 0x26, 0x07, 0x22, 0x06, 0x07, 0x6f, 0x2f, \n\t0x7c, 0x41, 0x46, 0x5d, 0x56, 0x4a, 0x5c, 0x43, 0x40, 0x7c, 0x30, 0x0a, \n\t0x30, 0x7c, 0x40, 0x43, 0x5c, 0x4a, 0x56, 0x5d, 0x46, 0x41, 0x7c, 0x2f, \n\t0x14, 0x2f, 0x7c, 0x41, 0x46, 0x5d, 0x56, 0x4a, 0x5c, 0x43, 0x40, 0x7c, \n\t0x30, 0x0a, 0x30, 0x7c, 0x40, 0x43, 0x5c, 0x4a, 0x56, 0x5d, 0x46, 0x41, \n\t0x7c, 0x2f, 0x03, 0x6d, 0x44, 0x4e, 0x01, 0x20, 0x2a, 0x26, 0x1f, 0x4d, \n\t0x45, 0xd5, 0x45, 0x4d, 0x1f, 0x26, 0x2a, 0x20, 0x01, 0x4e, 0x44, 0xd9, \n\t0x44, 0x4e, 0x01, 0x20, 0x2a, 0x26, 0x1f, 0x4d, 0x45, 0xd5, 0x45, 0x4d, \n\t0x1f, 0x26, 0x2a, 0x20, 0x01, 0x4e, 0x44, 0x00, 0x00, 0x01, 0x00, 0x88, \n\t0x00, 0xa6, 0x04, 0x08, 0x04, 0xea, 0x00, 0x13, 0x00, 0x38, 0x00, 0xb2, \n\t0x0f, 0x0c, 0x03, 0x2b, 0xb0, 0x0f, 0x10, 0xb1, 0x10, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0xd0, 0xb0, 0x0f, \n\t0x10, 0xb0, 0x03, 0xd0, 0xb0, 0x0c, 0x10, 0xb0, 0x04, 0xd0, 0xb0, 0x0c, \n\t0x10, 0xb1, 0x0b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x07, 0xd0, 0x30, 0x31, 0x01, 0x33, 0x15, 0x21, 0x07, 0x21, \n\t0x15, 0x21, 0x07, 0x27, 0x37, 0x23, 0x35, 0x21, 0x37, 0x21, 0x35, 0x21, \n\t0x13, 0x17, 0x03, 0x20, 0xe8, 0xfe, 0x98, 0x70, 0x01, 0xd8, 0xfd, 0xa9, \n\t0x5c, 0x72, 0x36, 0x91, 0x01, 0x10, 0x71, 0xfe, 0x7f, 0x02, 0x00, 0x94, \n\t0x72, 0x03, 0xe0, 0xe5, 0xca, 0xe5, 0xa6, 0x44, 0x62, 0xe5, 0xca, 0xe5, \n\t0x01, 0x0a, 0x44, 0x00, 0xff, 0xff, 0x00, 0x8d, 0xff, 0xd8, 0x03, 0xeb, \n\t0x04, 0x5a, 0x00, 0x67, 0x00, 0x1f, 0x00, 0x57, 0x00, 0xbc, 0x40, 0x00, \n\t0x39, 0x9a, 0x01, 0x07, 0x03, 0x1e, 0xff, 0xfc, 0xfd, 0x7f, 0x00, 0x13, \n\t0x00, 0xb0, 0x09, 0x2f, 0xb0, 0x03, 0xd0, 0xb2, 0x5f, 0x03, 0x01, 0x5d, \n\t0xb2, 0x30, 0x05, 0x01, 0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x89, \n\t0xff, 0xd8, 0x03, 0xf1, 0x04, 0x5a, 0x00, 0x67, 0x00, 0x21, 0x00, 0x12, \n\t0x00, 0xbc, 0x40, 0x00, 0x39, 0x9a, 0x01, 0x07, 0x03, 0x1e, 0xff, 0xfc, \n\t0xfd, 0x7f, 0x00, 0x0e, 0x00, 0xb0, 0x09, 0x2f, 0xb0, 0x06, 0xd0, 0xb2, \n\t0x5f, 0x06, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1f, \n\t0x00, 0x00, 0x04, 0x16, 0x05, 0xb0, 0x00, 0x05, 0x00, 0x0f, 0x00, 0x29, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x10, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x10, 0xb0, 0x08, 0xd0, 0xb0, 0x03, 0x10, \n\t0xb0, 0x0d, 0xd0, 0x30, 0x31, 0x01, 0x21, 0x01, 0x01, 0x21, 0x01, 0x21, \n\t0x03, 0x27, 0x23, 0x07, 0x03, 0x13, 0x17, 0x33, 0x37, 0x01, 0x8e, 0x01, \n\t0x17, 0x01, 0x71, 0xfe, 0x90, 0xfe, 0xe9, 0xfe, 0x90, 0x02, 0xc5, 0xb5, \n\t0x13, 0x06, 0x14, 0xb3, 0xb6, 0x13, 0x06, 0x14, 0x05, 0xb0, 0xfd, 0x27, \n\t0xfd, 0x29, 0x02, 0xd7, 0x01, 0xc6, 0x44, 0x44, 0xfe, 0x3a, 0xfe, 0x3b, \n\t0x44, 0x44, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3d, 0xff, 0x84, 0x01, 0x38, \n\t0x01, 0x10, 0x00, 0x05, 0x00, 0x06, 0x00, 0xb0, 0x04, 0x2f, 0x30, 0x31, \n\t0x25, 0x07, 0x23, 0x37, 0x35, 0x33, 0x01, 0x38, 0x81, 0x7a, 0x3d, 0xbe, \n\t0x6f, 0xeb, 0xf5, 0x97, 0x00, 0x02, 0x00, 0x14, 0x00, 0x00, 0x04, 0x61, \n\t0x06, 0x2d, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x93, 0x00, 0xb0, 0x08, 0x2f, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0e, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x13, 0x2f, 0x1b, 0xb1, 0x13, 0x0e, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1a, 0x2f, 0x1b, 0xb1, 0x1a, \n\t0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, \n\t0x00, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x18, 0x2f, 0x1b, \n\t0xb1, 0x18, 0x0a, 0x3e, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x01, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0xf0, 0x08, 0x01, \n\t0x5d, 0xb2, 0xc0, 0x08, 0x01, 0x71, 0xb2, 0x7f, 0x08, 0x01, 0x5d, 0xb4, \n\t0x2f, 0x08, 0x3f, 0x08, 0x02, 0x5d, 0xb2, 0x30, 0x08, 0x01, 0x71, 0xb2, \n\t0xa0, 0x08, 0x01, 0x5d, 0xb2, 0x00, 0x08, 0x01, 0x72, 0xb0, 0x08, 0x10, \n\t0xb1, 0x0f, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x01, 0x10, 0xb0, 0x15, 0xd0, 0xb0, 0x16, 0xd0, 0x30, 0x31, 0x33, \n\t0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x07, \n\t0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x15, 0x33, 0x15, 0x23, 0x11, 0x21, \n\t0x21, 0x11, 0x21, 0xb5, 0xa1, 0xa1, 0xf9, 0xe2, 0x4e, 0x98, 0x64, 0x2a, \n\t0x49, 0x77, 0x4d, 0x65, 0x65, 0xd5, 0xd5, 0x02, 0x88, 0xfe, 0xdc, 0x01, \n\t0x24, 0x03, 0x6d, 0xcd, 0x4a, 0xcc, 0xdd, 0x1f, 0x1d, 0xe6, 0x16, 0x18, \n\t0x5c, 0x59, 0x4a, 0xcd, 0xfc, 0x93, 0x04, 0x3a, 0xff, 0xff, 0x00, 0x1b, \n\t0x00, 0x00, 0x04, 0x7f, 0x06, 0x2d, 0x00, 0x26, 0x00, 0x49, 0x00, 0x00, \n\t0x00, 0x07, 0x00, 0x4f, 0x02, 0xdc, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1b, \n\t0x00, 0x00, 0x07, 0x3d, 0x06, 0x2d, 0x00, 0x26, 0x00, 0x49, 0x00, 0x00, \n\t0x00, 0x07, 0x03, 0x28, 0x02, 0xdc, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1b, \n\t0x00, 0x00, 0x07, 0x5b, 0x06, 0x2d, 0x00, 0x26, 0x00, 0x49, 0x00, 0x00, \n\t0x00, 0x27, 0x00, 0x49, 0x02, 0xdc, 0x00, 0x00, 0x00, 0x07, 0x00, 0x4f, \n\t0x05, 0xb8, 0x00, 0x00, 0x00, 0x16, 0x00, 0x57, 0xfe, 0x72, 0x07, 0xea, \n\t0x05, 0xae, 0x00, 0x0d, 0x00, 0x1c, 0x00, 0x2a, 0x00, 0x3b, 0x00, 0x41, \n\t0x00, 0x47, 0x00, 0x4d, 0x00, 0x53, 0x00, 0x5d, 0x00, 0x61, 0x00, 0x65, \n\t0x00, 0x69, 0x00, 0x6d, 0x00, 0x71, 0x00, 0x75, 0x00, 0x7e, 0x00, 0x82, \n\t0x00, 0x86, 0x00, 0x8a, 0x00, 0x8e, 0x00, 0x92, 0x00, 0x96, 0x01, 0x9f, \n\t0x00, 0xb0, 0x41, 0x2f, 0xb0, 0x8a, 0x2f, 0xb0, 0x83, 0x2f, 0xb0, 0x03, \n\t0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x49, 0x2f, 0x1b, 0xb1, 0x49, 0x10, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, \n\t0x14, 0x3e, 0x59, 0xb2, 0x40, 0x03, 0x01, 0x5d, 0xb2, 0xc0, 0x03, 0x01, \n\t0x5d, 0xb0, 0x0a, 0xd0, 0xb0, 0x03, 0x10, 0xb0, 0x0e, 0xd0, 0xb0, 0x0f, \n\t0x10, 0xb0, 0x76, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb4, \n\t0xdf, 0x76, 0xef, 0x76, 0x02, 0x5d, 0xb2, 0x6f, 0x76, 0x01, 0x71, 0xb6, \n\t0x5f, 0x76, 0x6f, 0x76, 0x7f, 0x76, 0x03, 0x5d, 0xb2, 0xff, 0x76, 0x01, \n\t0x71, 0xb2, 0x0f, 0x76, 0x01, 0x72, 0xb4, 0x7f, 0x76, 0x8f, 0x76, 0x02, \n\t0x72, 0xb0, 0x54, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0x40, \n\t0x09, 0xc0, 0x54, 0xd0, 0x54, 0xe0, 0x54, 0xf0, 0x54, 0x04, 0x71, 0xb6, \n\t0x00, 0x54, 0x10, 0x54, 0x20, 0x54, 0x03, 0x72, 0xb2, 0x16, 0x54, 0x76, \n\t0x11, 0x12, 0x39, 0xb0, 0x0f, 0x10, 0xb0, 0x7e, 0xb0, 0x0a, 0x2b, 0x58, \n\t0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x20, 0xd0, 0xb0, 0x0e, 0x10, 0xb0, 0x55, \n\t0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0x40, 0x09, 0xcf, 0x55, \n\t0xdf, 0x55, 0xef, 0x55, 0xff, 0x55, 0x04, 0x71, 0xb0, 0x27, 0xd0, 0xb0, \n\t0x0f, 0x10, 0xb0, 0x2b, 0xd0, 0xb0, 0x03, 0x10, 0xb0, 0x30, 0xd0, 0xb0, \n\t0x55, 0x10, 0xb0, 0x38, 0xd0, 0xb0, 0x41, 0x10, 0xb0, 0x40, 0xb0, 0x0a, \n\t0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb2, 0x4f, 0x40, 0x01, 0x72, 0xb2, \n\t0x2f, 0x40, 0x01, 0x71, 0xb0, 0x73, 0xd0, 0xb0, 0x6f, 0xd0, 0xb0, 0x6b, \n\t0xd0, 0xb0, 0x43, 0xd0, 0xb0, 0x45, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, \n\t0xdc, 0x59, 0xb0, 0x3e, 0xd0, 0xb0, 0x41, 0x10, 0xb0, 0x72, 0xd0, 0xb0, \n\t0x6e, 0xd0, 0xb0, 0x6a, 0xd0, 0xb0, 0x42, 0xd0, 0xb0, 0x49, 0x10, 0xb0, \n\t0x4c, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x4d, 0xb0, \n\t0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x4c, 0x10, 0xb0, 0x66, \n\t0xd0, 0xb0, 0x62, 0xd0, 0xb0, 0x5e, 0xd0, 0xb0, 0x4e, 0xd0, 0xb0, 0x49, \n\t0x10, 0xb0, 0x67, 0xd0, 0xb0, 0x63, 0xd0, 0xb0, 0x5f, 0xd0, 0xb0, 0x4f, \n\t0xd0, 0xb0, 0x4d, 0x10, 0xb0, 0x52, 0xd0, 0xb0, 0x8a, 0x10, 0xb0, 0x7f, \n\t0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x83, 0x10, 0xb0, \n\t0x82, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x4d, 0x10, \n\t0xb0, 0x86, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x3e, \n\t0x10, 0xb0, 0x87, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, \n\t0x7f, 0x10, 0xb0, 0x8c, 0xd0, 0xb0, 0x83, 0x10, 0xb0, 0x90, 0xd0, 0xb0, \n\t0x86, 0x10, 0xb0, 0x91, 0xd0, 0xb0, 0x87, 0x10, 0xb0, 0x94, 0xd0, 0xb0, \n\t0x8a, 0x10, 0xb0, 0x95, 0xd0, 0x30, 0x31, 0x01, 0x14, 0x06, 0x23, 0x22, \n\t0x26, 0x35, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x13, 0x11, 0x33, \n\t0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, 0x14, 0x06, 0x23, \n\t0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x15, 0x14, 0x16, 0x33, 0x32, \n\t0x36, 0x35, 0x01, 0x33, 0x11, 0x14, 0x06, 0x23, 0x22, 0x26, 0x37, 0x37, \n\t0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x01, 0x11, 0x33, 0x15, 0x33, \n\t0x15, 0x21, 0x35, 0x33, 0x35, 0x33, 0x11, 0x01, 0x11, 0x21, 0x15, 0x23, \n\t0x15, 0x25, 0x35, 0x21, 0x11, 0x23, 0x35, 0x01, 0x15, 0x33, 0x32, 0x36, \n\t0x35, 0x34, 0x26, 0x27, 0x23, 0x13, 0x35, 0x21, 0x15, 0x21, 0x35, 0x21, \n\t0x15, 0x21, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x21, 0x35, 0x21, \n\t0x15, 0x21, 0x35, 0x21, 0x15, 0x13, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, \n\t0x23, 0x23, 0x01, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0x11, 0x23, \n\t0x35, 0x33, 0x25, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0x11, 0x23, \n\t0x35, 0x33, 0x03, 0x35, 0x80, 0x65, 0x68, 0x80, 0x80, 0x66, 0x66, 0x81, \n\t0x43, 0xbc, 0x65, 0x6f, 0x2c, 0x28, 0x30, 0x36, 0x69, 0x5c, 0xfe, 0x84, \n\t0x4b, 0x40, 0x40, 0x4a, 0x4a, 0x42, 0x3f, 0x4a, 0x03, 0xba, 0x5c, 0x6a, \n\t0x51, 0x5b, 0x69, 0x06, 0x02, 0x54, 0x36, 0x32, 0x28, 0x37, 0xf9, 0xc4, \n\t0x71, 0xc4, 0x05, 0x28, 0xc7, 0x6f, 0xf8, 0x6d, 0x01, 0x35, 0xc4, 0x05, \n\t0xec, 0x01, 0x36, 0x6f, 0xfc, 0x5c, 0x7e, 0x32, 0x35, 0x33, 0x2f, 0x05, \n\t0xd0, 0x01, 0x16, 0xfd, 0x5b, 0x01, 0x15, 0xfd, 0x5c, 0x01, 0x14, 0x02, \n\t0x0a, 0x01, 0x16, 0xfd, 0x5b, 0x01, 0x15, 0xfd, 0x5c, 0x01, 0x14, 0xbc, \n\t0x5d, 0x3a, 0x3c, 0x39, 0x3d, 0x5d, 0xfc, 0xf1, 0x71, 0x71, 0x71, 0x71, \n\t0x71, 0x71, 0x07, 0x22, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x01, 0xd4, \n\t0x62, 0x79, 0x79, 0x62, 0x70, 0x60, 0x7b, 0x7b, 0x60, 0xfe, 0xb8, 0x02, \n\t0x25, 0x4b, 0x4b, 0x27, 0x3e, 0x0f, 0x0d, 0x46, 0x2d, 0x4c, 0x4f, 0x01, \n\t0x48, 0x44, 0x4f, 0x4f, 0x44, 0x70, 0x45, 0x4e, 0x4e, 0x45, 0x01, 0x4f, \n\t0xfe, 0x86, 0x4f, 0x5c, 0x51, 0x4d, 0x06, 0x2e, 0x2d, 0x36, 0x2c, 0xfc, \n\t0xc9, 0x01, 0x3b, 0xca, 0x71, 0x71, 0xca, 0xfe, 0xc5, 0x06, 0x1f, 0x01, \n\t0x1d, 0x74, 0xa9, 0xa9, 0x74, 0xfe, 0xe3, 0xa9, 0xfc, 0xb6, 0xa9, 0x2b, \n\t0x28, 0x26, 0x2e, 0x02, 0x03, 0x4a, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, \n\t0xf9, 0x38, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x03, 0xc4, 0x28, 0x28, \n\t0x27, 0x20, 0xfe, 0xd3, 0xfc, 0x7e, 0xfa, 0xfc, 0x15, 0xf9, 0x7e, 0xfc, \n\t0x7e, 0xfa, 0xfc, 0x15, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x5c, \n\t0xfd, 0xd5, 0x07, 0xd7, 0x08, 0x62, 0x00, 0x03, 0x00, 0x1e, 0x00, 0x22, \n\t0x00, 0x26, 0x00, 0x2a, 0x00, 0x00, 0x09, 0x03, 0x05, 0x34, 0x36, 0x37, \n\t0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x17, 0x17, 0x33, 0x36, \n\t0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x06, 0x06, 0x15, 0x17, \n\t0x23, 0x15, 0x33, 0x03, 0x33, 0x15, 0x23, 0x03, 0x33, 0x15, 0x23, 0x04, \n\t0x18, 0x03, 0xbf, 0xfc, 0x41, 0xfc, 0x44, 0x04, 0x0f, 0x1a, 0x28, 0x48, \n\t0x5e, 0xa9, 0x93, 0x88, 0xa7, 0x03, 0x03, 0xc2, 0x01, 0x3b, 0x2b, 0x36, \n\t0x3b, 0x33, 0x2a, 0x4f, 0x3b, 0xca, 0xca, 0xca, 0x4b, 0x04, 0x04, 0x02, \n\t0x04, 0x04, 0x06, 0x52, 0xfc, 0x31, 0xfc, 0x31, 0x03, 0xcf, 0xf1, 0x35, \n\t0x3d, 0x1a, 0x27, 0x83, 0x4e, 0x80, 0x97, 0x82, 0x82, 0x06, 0x33, 0x34, \n\t0x3f, 0x35, 0x32, 0x4d, 0x1c, 0x37, 0x5a, 0x58, 0x5b, 0xaa, 0xfd, 0x4c, \n\t0x04, 0x0a, 0x8d, 0x04, 0xff, 0xff, 0xff, 0xa9, 0x00, 0x00, 0x02, 0x84, \n\t0x05, 0xb1, 0x02, 0x26, 0x03, 0x4b, 0x00, 0x00, 0x01, 0x07, 0x00, 0x71, \n\t0xff, 0x15, 0x00, 0x00, 0x00, 0x09, 0x00, 0xb3, 0x05, 0x08, 0x02, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0x00, 0x02, 0x00, 0x72, 0x04, 0x6f, 0x02, 0xca, \n\t0x05, 0xc5, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x1d, 0x00, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x10, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x10, 0x3e, 0x59, 0x30, \n\t0x31, 0x01, 0x13, 0x33, 0x15, 0x03, 0x23, 0x25, 0x37, 0x33, 0x07, 0x15, \n\t0x23, 0x01, 0x91, 0x66, 0xd3, 0xe6, 0x53, 0xfe, 0xe1, 0x94, 0x6c, 0x51, \n\t0xaf, 0x04, 0x8c, 0x01, 0x39, 0x15, 0xfe, 0xc1, 0x99, 0xba, 0xcc, 0x89, \n\t0x00, 0x03, 0x00, 0x5f, 0xff, 0xf5, 0x03, 0x15, 0x03, 0x2c, 0x00, 0x17, \n\t0x00, 0x23, 0x00, 0x2f, 0x00, 0x6a, 0x00, 0xb0, 0x2d, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x15, 0x2f, 0x1b, 0xb1, 0x15, 0x14, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0a, 0x3e, 0x59, \n\t0xb2, 0x2f, 0x2d, 0x01, 0x71, 0xb2, 0x6f, 0x2d, 0x01, 0x72, 0xb4, 0x9f, \n\t0x2d, 0xaf, 0x2d, 0x02, 0x71, 0xb2, 0xdf, 0x2d, 0x01, 0x5d, 0xb4, 0x0f, \n\t0x2d, 0x1f, 0x2d, 0x02, 0x5d, 0xb0, 0x2d, 0x10, 0xb1, 0x1b, 0x06, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x09, 0x10, 0xb1, \n\t0x21, 0x06, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x15, 0x10, 0xb1, 0x27, 0x06, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0x30, 0x31, 0x01, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, 0x14, \n\t0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x26, 0x26, 0x35, 0x34, \n\t0x36, 0x33, 0x32, 0x16, 0x03, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, \n\t0x16, 0x33, 0x32, 0x36, 0x03, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, \n\t0x16, 0x33, 0x32, 0x36, 0x02, 0xfc, 0x4c, 0x40, 0x4b, 0x5a, 0xc1, 0x93, \n\t0x99, 0xc9, 0x5c, 0x4f, 0x45, 0x4e, 0xbb, 0x8e, 0x89, 0xb3, 0xb9, 0x4d, \n\t0x36, 0x3d, 0x52, 0x52, 0x3e, 0x37, 0x4b, 0x19, 0x3e, 0x2c, 0x32, 0x43, \n\t0x44, 0x32, 0x2c, 0x3d, 0x02, 0x50, 0x3a, 0x5b, 0x1b, 0x1c, 0x63, 0x3f, \n\t0x70, 0x7d, 0x7d, 0x70, 0x3f, 0x63, 0x1c, 0x1b, 0x5b, 0x3a, 0x68, 0x74, \n\t0x73, 0xfe, 0x35, 0x2b, 0x38, 0x38, 0x2b, 0x2b, 0x33, 0x33, 0x01, 0x7e, \n\t0x25, 0x2b, 0x2a, 0x26, 0x26, 0x2f, 0x2f, 0x00, 0x00, 0x02, 0x00, 0x57, \n\t0xff, 0xf5, 0x02, 0xf4, 0x03, 0x2c, 0x00, 0x1a, 0x00, 0x27, 0x00, 0x53, \n\t0x00, 0xb0, 0x07, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, \n\t0xb1, 0x0d, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x14, 0x2f, \n\t0x1b, 0xb1, 0x14, 0x0a, 0x3e, 0x59, 0xb1, 0x00, 0x06, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb6, 0x0f, 0x07, 0x1f, 0x07, 0x2f, \n\t0x07, 0x03, 0x5d, 0xb0, 0x07, 0x10, 0xb1, 0x1b, 0x06, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0d, 0x10, 0xb1, 0x22, 0x06, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x25, \n\t0x32, 0x36, 0x35, 0x35, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, \n\t0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, \n\t0x16, 0x16, 0x13, 0x32, 0x36, 0x37, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, \n\t0x15, 0x14, 0x16, 0x01, 0x92, 0x3c, 0x54, 0x20, 0x51, 0x2a, 0x8e, 0xa2, \n\t0xb6, 0x90, 0x93, 0xc4, 0xcb, 0x97, 0x35, 0x73, 0x32, 0x23, 0x2b, 0x54, \n\t0x4d, 0x2d, 0x3e, 0x10, 0x4c, 0x38, 0x35, 0x3f, 0x40, 0x90, 0x4d, 0x3d, \n\t0x2e, 0x1d, 0x1d, 0x94, 0x7d, 0x72, 0x9b, 0xb3, 0x8b, 0xd3, 0x82, 0xa4, \n\t0x12, 0x10, 0x98, 0x11, 0x0e, 0x01, 0x0c, 0x1c, 0x18, 0x1e, 0x46, 0x5d, \n\t0x48, 0x32, 0x36, 0x45, 0x00, 0x02, 0x00, 0x61, 0xff, 0xef, 0x04, 0x0c, \n\t0x04, 0x9d, 0x00, 0x1a, 0x00, 0x27, 0x00, 0x4d, 0x00, 0xb0, 0x0e, 0x2f, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x12, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x14, 0x2f, 0x1b, 0xb1, 0x14, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x07, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0e, 0x10, 0xb1, 0x1b, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x14, 0x10, 0xb1, \n\t0x22, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, \n\t0x31, 0x01, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, \n\t0x15, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x04, 0x23, 0x22, 0x24, \n\t0x35, 0x11, 0x34, 0x24, 0x13, 0x22, 0x06, 0x07, 0x15, 0x14, 0x16, 0x33, \n\t0x32, 0x36, 0x35, 0x34, 0x26, 0x02, 0x6b, 0x52, 0x85, 0x41, 0x2f, 0x36, \n\t0x6d, 0x43, 0x66, 0x83, 0x31, 0x85, 0x4f, 0xb8, 0xca, 0xfe, 0xfa, 0xd0, \n\t0xc9, 0xfe, 0xf4, 0x01, 0x27, 0xb9, 0x42, 0x61, 0x19, 0x6f, 0x52, 0x4a, \n\t0x57, 0x50, 0x04, 0x9d, 0x19, 0x18, 0xd5, 0x14, 0x13, 0x7d, 0x6c, 0x45, \n\t0x2b, 0x30, 0xc5, 0xa9, 0xb1, 0xdd, 0xff, 0xc9, 0x01, 0x1c, 0xd1, 0xf9, \n\t0xfd, 0x7b, 0x2b, 0x26, 0x10, 0x64, 0x86, 0x5d, 0x47, 0x4f, 0x58, 0x00, \n\t0x00, 0x02, 0x00, 0x2a, 0x00, 0x00, 0x04, 0x1a, 0x04, 0x8d, 0x00, 0x0b, \n\t0x00, 0x10, 0x00, 0x44, 0x00, 0xb0, 0x02, 0x2f, 0xb0, 0x09, 0x2f, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x12, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x02, 0x10, 0xb1, 0x01, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x02, 0x10, 0xb0, 0x06, 0xd0, 0xb0, 0x01, \n\t0x10, 0xb0, 0x0c, 0xd0, 0xb0, 0x09, 0x10, 0xb0, 0x0f, 0xd0, 0x30, 0x31, \n\t0x01, 0x33, 0x15, 0x23, 0x15, 0x21, 0x35, 0x21, 0x27, 0x01, 0x35, 0x21, \n\t0x01, 0x21, 0x11, 0x27, 0x07, 0x03, 0x92, 0x88, 0x88, 0xfe, 0xdd, 0xfd, \n\t0xcd, 0x12, 0x02, 0x45, 0x01, 0x23, 0xfd, 0xc2, 0x01, 0x1b, 0x06, 0x0f, \n\t0x01, 0xab, 0xe1, 0xca, 0xca, 0xbb, 0x03, 0x05, 0x03, 0xfd, 0x1e, 0x01, \n\t0x85, 0x01, 0x17, 0x00, 0x00, 0x01, 0x00, 0x42, 0xff, 0xef, 0x03, 0xd5, \n\t0x04, 0x9d, 0x00, 0x2a, 0x00, 0x8c, 0x00, 0xb0, 0x2a, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x12, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x1a, 0x2f, 0x1b, 0xb1, 0x1a, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x0e, 0x10, 0xb1, 0x06, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb2, 0x09, 0x1a, 0x0e, 0x11, 0x12, 0x39, 0xb2, 0x1f, \n\t0x2a, 0x01, 0x5d, 0xb2, 0xaf, 0x2a, 0x01, 0x5d, 0xb4, 0x2f, 0x2a, 0x3f, \n\t0x2a, 0x02, 0x71, 0xb2, 0x6f, 0x2a, 0x01, 0x71, 0xb2, 0xdf, 0x2a, 0x01, \n\t0x5d, 0xb2, 0x7f, 0x2a, 0x01, 0x5d, 0xb2, 0x9f, 0x2a, 0x01, 0x71, 0xb2, \n\t0xbf, 0x2a, 0x01, 0x71, 0xb0, 0x2a, 0x10, 0xb1, 0x29, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x14, 0x29, 0x2a, 0x11, \n\t0x12, 0x39, 0xb2, 0x1f, 0x0e, 0x1a, 0x11, 0x12, 0x39, 0xb0, 0x1a, 0x10, \n\t0xb1, 0x22, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x01, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, \n\t0x21, 0x27, 0x26, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x16, \n\t0x16, 0x15, 0x14, 0x04, 0x23, 0x22, 0x24, 0x37, 0x37, 0x21, 0x14, 0x16, \n\t0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x02, 0x0d, 0x4b, \n\t0x47, 0x4c, 0x45, 0x45, 0x54, 0xfe, 0xe5, 0x02, 0x06, 0xf5, 0xb8, 0xd1, \n\t0xf2, 0x60, 0x54, 0x60, 0x67, 0xfe, 0xfb, 0xd1, 0xb7, 0xfe, 0xfa, 0x05, \n\t0x02, 0x01, 0x1a, 0x5f, 0x4d, 0x49, 0x5a, 0x52, 0x53, 0xcc, 0x02, 0xb4, \n\t0x45, 0x42, 0x35, 0x4e, 0x3f, 0x36, 0x06, 0x98, 0xb6, 0xac, 0xa0, 0x50, \n\t0x85, 0x26, 0x22, 0x8a, 0x63, 0xa1, 0xb7, 0xb0, 0xa9, 0x06, 0x36, 0x4b, \n\t0x53, 0x3a, 0x51, 0x46, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4d, \n\t0x00, 0x00, 0x03, 0xb6, 0x04, 0x9d, 0x00, 0x1a, 0x00, 0x48, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x12, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, \n\t0x59, 0xb2, 0x03, 0x00, 0x11, 0x11, 0x12, 0x39, 0xb0, 0x11, 0x10, 0xb1, \n\t0x09, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x03, 0x10, 0xb0, 0x17, 0xd0, 0xb0, 0x00, 0x10, 0xb1, 0x19, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x21, 0x21, \n\t0x35, 0x01, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x21, \n\t0x27, 0x26, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x07, 0x17, \n\t0x21, 0x03, 0xb6, 0xfc, 0xa9, 0x01, 0xa9, 0x41, 0x43, 0x3d, 0x42, 0x4a, \n\t0x52, 0xfe, 0xe4, 0x02, 0x06, 0xf3, 0xcd, 0xc7, 0xd9, 0x8d, 0xa4, 0xa1, \n\t0x02, 0x01, 0xd9, 0xde, 0x01, 0x74, 0x44, 0x6b, 0x30, 0x3b, 0x52, 0x5d, \n\t0x48, 0x06, 0xa6, 0xd8, 0xbe, 0xab, 0x7d, 0xba, 0x82, 0x97, 0x06, 0x00, \n\t0x00, 0x01, 0x00, 0x3e, 0x00, 0x00, 0x02, 0x10, 0x04, 0x9d, 0x00, 0x05, \n\t0x00, 0x33, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, \n\t0x05, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, \n\t0xb1, 0x00, 0x0a, 0x3e, 0x59, 0xb2, 0x04, 0x05, 0x00, 0x11, 0x12, 0x39, \n\t0xb0, 0x04, 0x2f, 0xb1, 0x03, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0x30, 0x31, 0x21, 0x21, 0x11, 0x23, 0x35, 0x25, 0x02, \n\t0x10, 0xfe, 0xdc, 0xae, 0x01, 0xd2, 0x03, 0x96, 0xe6, 0x21, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x61, 0xff, 0xef, 0x04, 0x2e, 0x04, 0x9d, 0x00, 0x0d, \n\t0x00, 0x1b, 0x00, 0x3b, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, \n\t0x1b, 0xb1, 0x0a, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, \n\t0x2f, 0x1b, 0xb1, 0x03, 0x0a, 0x3e, 0x59, 0xb0, 0x0a, 0x10, 0xb1, 0x11, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, \n\t0x10, 0xb1, 0x18, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0x30, 0x31, 0x01, 0x14, 0x04, 0x23, 0x22, 0x24, 0x35, 0x11, 0x34, \n\t0x24, 0x33, 0x32, 0x04, 0x15, 0x25, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, \n\t0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x04, 0x2e, 0xfe, 0xf4, 0xd9, \n\t0xdb, 0xfe, 0xf3, 0x01, 0x0b, 0xdb, 0xda, 0x01, 0x0d, 0xfe, 0xdc, 0x69, \n\t0x5a, 0x5a, 0x68, 0x68, 0x5c, 0x59, 0x68, 0x01, 0x9b, 0xc4, 0xe8, 0xe8, \n\t0xc4, 0x01, 0x57, 0xc3, 0xe8, 0xe8, 0xc3, 0x01, 0x5c, 0x6f, 0x6f, 0x5c, \n\t0xfe, 0xa8, 0x60, 0x6e, 0x6f, 0x5f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x44, \n\t0x00, 0x00, 0x04, 0x01, 0x04, 0x8d, 0x00, 0x09, 0x00, 0x46, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x12, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0a, 0x3e, \n\t0x59, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb2, 0x04, 0x00, 0x02, 0x11, 0x12, 0x39, 0xb0, 0x07, 0x10, 0xb1, \n\t0x05, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, \n\t0x09, 0x05, 0x07, 0x11, 0x12, 0x39, 0x30, 0x31, 0x25, 0x21, 0x15, 0x21, \n\t0x35, 0x01, 0x21, 0x35, 0x21, 0x15, 0x01, 0xbb, 0x02, 0x46, 0xfc, 0x43, \n\t0x02, 0x3b, 0xfd, 0xe6, 0x03, 0x95, 0xde, 0xde, 0x7a, 0x03, 0x34, 0xdf, \n\t0x75, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x07, 0x00, 0x00, 0x04, 0x45, \n\t0x04, 0x8d, 0x00, 0x09, 0x00, 0x3d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x0a, 0x3e, 0x59, 0xb2, 0x00, \n\t0x05, 0x02, 0x11, 0x12, 0x39, 0xb0, 0x00, 0x10, 0xb0, 0x04, 0xd0, 0xb0, \n\t0x00, 0x10, 0xb0, 0x07, 0xd0, 0x30, 0x31, 0x01, 0x33, 0x13, 0x21, 0x01, \n\t0x11, 0x21, 0x11, 0x01, 0x21, 0x02, 0x23, 0x06, 0xdf, 0x01, 0x3d, 0xfe, \n\t0x70, 0xfe, 0xdc, 0xfe, 0x76, 0x01, 0x3c, 0x02, 0x99, 0x01, 0xf4, 0xfd, \n\t0x0e, 0xfe, 0x65, 0x01, 0xa4, 0x02, 0xe9, 0x00, 0x00, 0x01, 0x00, 0x1f, \n\t0x00, 0x00, 0x04, 0x61, 0x04, 0x8d, 0x00, 0x0b, 0x00, 0x44, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x12, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x12, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, \n\t0x0a, 0x3e, 0x59, 0xb2, 0x06, 0x07, 0x01, 0x11, 0x12, 0x39, 0xb0, 0x06, \n\t0x10, 0xb0, 0x00, 0xd0, 0x30, 0x31, 0x01, 0x13, 0x21, 0x01, 0x01, 0x21, \n\t0x03, 0x03, 0x21, 0x01, 0x01, 0x21, 0x02, 0x3e, 0xca, 0x01, 0x51, 0xfe, \n\t0x9d, 0x01, 0x6b, 0xfe, 0xb1, 0xd1, 0xd1, 0xfe, 0xaf, 0x01, 0x6d, 0xfe, \n\t0x9c, 0x01, 0x4f, 0x03, 0x0c, 0x01, 0x81, 0xfd, 0xbf, 0xfd, 0xb4, 0x01, \n\t0x89, 0xfe, 0x77, 0x02, 0x4c, 0x02, 0x41, 0x00, 0x00, 0x01, 0x00, 0x28, \n\t0x00, 0x00, 0x05, 0xf1, 0x04, 0x8d, 0x00, 0x0f, 0x00, 0x50, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x12, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x12, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x12, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, \n\t0x08, 0x0a, 0x3e, 0x59, 0xb0, 0x0c, 0xd0, 0xb0, 0x00, 0xd0, 0xb0, 0x0e, \n\t0x10, 0xb0, 0x06, 0xd0, 0x30, 0x31, 0x01, 0x33, 0x13, 0x21, 0x01, 0x21, \n\t0x03, 0x23, 0x03, 0x21, 0x01, 0x21, 0x13, 0x33, 0x13, 0x33, 0x04, 0x38, \n\t0x06, 0x82, 0x01, 0x31, 0xfe, 0xee, 0xfe, 0xe3, 0xb5, 0x06, 0xb0, 0xfe, \n\t0xe3, 0xfe, 0xee, 0x01, 0x31, 0x81, 0x06, 0xb5, 0xf0, 0x01, 0xc1, 0x02, \n\t0xcc, 0xfb, 0x73, 0x02, 0xa9, 0xfd, 0x57, 0x04, 0x8d, 0xfd, 0x32, 0x02, \n\t0xce, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x04, 0x92, \n\t0x04, 0x8d, 0x00, 0x09, 0x00, 0x2d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0a, 0x3e, 0x59, 0xb0, 0x01, \n\t0xd0, 0x30, 0x31, 0x01, 0x17, 0x33, 0x37, 0x01, 0x21, 0x01, 0x21, 0x01, \n\t0x21, 0x02, 0x45, 0x08, 0x06, 0x07, 0x01, 0x07, 0x01, 0x31, 0xfe, 0x5d, \n\t0xfe, 0xc4, 0xfe, 0x5c, 0x01, 0x33, 0x01, 0x38, 0x26, 0x21, 0x03, 0x5a, \n\t0xfb, 0x73, 0x04, 0x8d, 0x00, 0x01, 0x00, 0x71, 0xff, 0xed, 0x04, 0x84, \n\t0x04, 0x8d, 0x00, 0x11, 0x00, 0x36, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0a, 0x3e, 0x59, 0xb1, 0x0d, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x01, 0x11, 0x14, 0x04, 0x23, 0x22, 0x24, 0x35, 0x11, 0x21, 0x11, 0x14, \n\t0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x04, 0x84, 0xfe, 0xe3, 0xec, 0xed, \n\t0xfe, 0xe3, 0x01, 0x24, 0x76, 0x70, 0x70, 0x74, 0x04, 0x8d, 0xfd, 0x10, \n\t0xcc, 0xe4, 0xe5, 0xcb, 0x02, 0xf0, 0xfd, 0x10, 0x67, 0x6a, 0x69, 0x68, \n\t0x02, 0xf0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x30, 0x00, 0x00, 0x04, 0x04, \n\t0x04, 0x8d, 0x00, 0x07, 0x00, 0x32, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0a, 0x3e, 0x59, 0xb0, 0x06, 0x10, \n\t0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x04, 0xd0, 0xb0, 0x05, 0xd0, 0x30, 0x31, 0x01, 0x21, 0x11, 0x21, \n\t0x11, 0x21, 0x35, 0x21, 0x04, 0x04, 0xfe, 0xa6, 0xfe, 0xdb, 0xfe, 0xab, \n\t0x03, 0xd4, 0x03, 0xae, 0xfc, 0x52, 0x03, 0xae, 0xdf, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x43, 0xff, 0xed, 0x04, 0x21, 0x04, 0x9d, 0x00, 0x27, \n\t0x00, 0x56, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, \n\t0x09, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1d, 0x2f, 0x1b, \n\t0xb1, 0x1d, 0x0a, 0x3e, 0x59, 0xb2, 0x17, 0x1d, 0x09, 0x11, 0x12, 0x39, \n\t0xb2, 0x7a, 0x17, 0x01, 0x5d, 0xb0, 0x17, 0x10, 0xb1, 0x03, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x09, 0x10, 0xb1, \n\t0x11, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x1d, 0x10, 0xb1, 0x25, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0x30, 0x31, 0x01, 0x34, 0x26, 0x27, 0x26, 0x26, 0x35, 0x34, \n\t0x36, 0x33, 0x32, 0x16, 0x07, 0x07, 0x21, 0x34, 0x26, 0x23, 0x22, 0x06, \n\t0x15, 0x14, 0x16, 0x17, 0x16, 0x16, 0x15, 0x14, 0x04, 0x23, 0x22, 0x24, \n\t0x37, 0x37, 0x21, 0x16, 0x16, 0x33, 0x32, 0x36, 0x02, 0xfe, 0x5f, 0x7d, \n\t0xe5, 0xce, 0xf9, 0xd3, 0xdc, 0xf6, 0x05, 0x02, 0xfe, 0xe6, 0x53, 0x5e, \n\t0x59, 0x51, 0x5a, 0x8d, 0xd7, 0xd2, 0xfe, 0xf6, 0xdc, 0xea, 0xfe, 0xf2, \n\t0x06, 0x02, 0x01, 0x1a, 0x02, 0x71, 0x63, 0x64, 0x5f, 0x01, 0x42, 0x36, \n\t0x48, 0x1c, 0x2c, 0x9f, 0xa1, 0x93, 0xc2, 0xc6, 0xa8, 0x06, 0x48, 0x4e, \n\t0x42, 0x33, 0x3a, 0x44, 0x1d, 0x2c, 0xa2, 0x9b, 0x9c, 0xbd, 0xc6, 0xac, \n\t0x06, 0x54, 0x46, 0x41, 0x00, 0x02, 0x00, 0x81, 0x00, 0x00, 0x04, 0x4d, \n\t0x04, 0x8d, 0x00, 0x1a, 0x00, 0x23, 0x00, 0x7a, 0x00, 0xb0, 0x00, 0x2f, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x12, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x13, 0x2f, 0x1b, 0xb1, 0x13, \n\t0x0a, 0x3e, 0x59, 0xb2, 0x8f, 0x00, 0x01, 0x5d, 0xb2, 0x6f, 0x00, 0x01, \n\t0x71, 0xb2, 0xff, 0x00, 0x01, 0x71, 0xb2, 0x0f, 0x00, 0x01, 0x72, 0xb2, \n\t0xbf, 0x00, 0x01, 0x71, 0xb2, 0xdf, 0x00, 0x01, 0x5d, 0xb2, 0x6f, 0x00, \n\t0x01, 0x5d, 0xb2, 0x3f, 0x00, 0x01, 0x5d, 0xb0, 0x00, 0x10, 0xb1, 0x1b, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0a, \n\t0x00, 0x1b, 0x11, 0x12, 0x39, 0xb0, 0x03, 0x10, 0xb1, 0x22, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x11, \n\t0x21, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, \n\t0x15, 0x14, 0x16, 0x17, 0x15, 0x21, 0x26, 0x26, 0x35, 0x35, 0x34, 0x26, \n\t0x23, 0x27, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x01, 0xa5, \n\t0xfe, 0xdc, 0x01, 0xce, 0xd7, 0xff, 0x67, 0x63, 0x72, 0x65, 0x0c, 0x0f, \n\t0xfe, 0xd3, 0x0b, 0x06, 0x5d, 0x5a, 0xb3, 0xaa, 0x55, 0x5c, 0x5e, 0x53, \n\t0xaa, 0x01, 0xa2, 0xfe, 0x5e, 0x04, 0x8d, 0xbe, 0xa3, 0x5f, 0x8c, 0x2b, \n\t0x1e, 0x90, 0x69, 0x53, 0x24, 0x67, 0x13, 0x0e, 0x13, 0x68, 0x32, 0x51, \n\t0x50, 0x54, 0xe0, 0x50, 0x45, 0x41, 0x56, 0x00, 0x00, 0x02, 0x00, 0x5f, \n\t0xff, 0x75, 0x04, 0x8c, 0x04, 0x9d, 0x00, 0x13, 0x00, 0x21, 0x00, 0x42, \n\t0x00, 0xb0, 0x05, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, \n\t0xb1, 0x10, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, \n\t0x1b, 0xb1, 0x09, 0x0a, 0x3e, 0x59, 0xb1, 0x1e, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x03, 0x09, 0x1e, 0x11, 0x12, \n\t0x39, 0xb0, 0x10, 0x10, 0xb1, 0x17, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x14, 0x06, 0x07, 0x17, 0x07, \n\t0x27, 0x06, 0x06, 0x23, 0x22, 0x00, 0x35, 0x35, 0x34, 0x00, 0x33, 0x32, \n\t0x00, 0x15, 0x25, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x15, 0x14, 0x16, \n\t0x33, 0x32, 0x36, 0x35, 0x04, 0x70, 0x3c, 0x37, 0x8f, 0xbb, 0x9a, 0x30, \n\t0x68, 0x37, 0xe6, 0xfe, 0xdd, 0x01, 0x21, 0xe7, 0xe6, 0x01, 0x23, 0xfe, \n\t0xdd, 0x7d, 0x69, 0x6c, 0x78, 0x79, 0x6c, 0x6a, 0x7b, 0x01, 0xcd, 0x5e, \n\t0xa0, 0x3e, 0x90, 0x8c, 0x99, 0x10, 0x11, 0x01, 0x0b, 0xd5, 0xf3, 0xd4, \n\t0x01, 0x09, 0xfe, 0xf6, 0xd3, 0x01, 0x6d, 0x90, 0x8f, 0x6e, 0xf4, 0x70, \n\t0x91, 0x91, 0x70, 0x00, 0x00, 0x02, 0x00, 0x6e, 0xff, 0xeb, 0x04, 0x51, \n\t0x05, 0xc5, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x3b, 0x00, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x10, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0a, 0x3e, 0x59, 0xb0, \n\t0x0a, 0x10, 0xb1, 0x11, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x18, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x10, 0x00, 0x23, 0x22, \n\t0x00, 0x11, 0x11, 0x10, 0x00, 0x33, 0x32, 0x00, 0x11, 0x25, 0x34, 0x26, \n\t0x23, 0x22, 0x06, 0x15, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x04, \n\t0x51, 0xfe, 0xf5, 0xe5, 0xe6, 0xfe, 0xf3, 0x01, 0x0b, 0xe6, 0xe5, 0x01, \n\t0x0d, 0xfe, 0xdd, 0x6a, 0x65, 0x65, 0x69, 0x6a, 0x66, 0x64, 0x69, 0x02, \n\t0x37, 0xfe, 0xdf, 0xfe, 0xd5, 0x01, 0x2b, 0x01, 0x21, 0x01, 0x41, 0x01, \n\t0x20, 0x01, 0x2d, 0xfe, 0xd3, 0xfe, 0xe0, 0x1e, 0xae, 0xa0, 0xa0, 0xae, \n\t0xfe, 0x85, 0xb0, 0xa0, 0xa0, 0xb0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5b, \n\t0xff, 0xed, 0x04, 0x6c, 0x04, 0x9d, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x3b, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x12, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x0a, 0x10, 0xb1, 0x11, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x18, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, \n\t0x14, 0x00, 0x23, 0x22, 0x00, 0x35, 0x35, 0x34, 0x00, 0x33, 0x32, 0x00, \n\t0x15, 0x25, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x15, 0x14, 0x16, 0x33, \n\t0x32, 0x36, 0x35, 0x04, 0x6c, 0xfe, 0xde, 0xe6, 0xe6, 0xfe, 0xdd, 0x01, \n\t0x21, 0xe7, 0xe6, 0x01, 0x23, 0xfe, 0xdd, 0x7d, 0x69, 0x6c, 0x78, 0x79, \n\t0x6c, 0x6a, 0x7b, 0x01, 0xcd, 0xd5, 0xfe, 0xf5, 0x01, 0x0b, 0xd5, 0xf3, \n\t0xd4, 0x01, 0x09, 0xfe, 0xf6, 0xd3, 0x01, 0x6d, 0x90, 0x8f, 0x6e, 0xf4, \n\t0x70, 0x91, 0x91, 0x70, 0x00, 0x01, 0x00, 0x81, 0x00, 0x00, 0x04, 0x95, \n\t0x04, 0x8d, 0x00, 0x0b, 0x00, 0x43, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0a, 0x3e, 0x59, 0xb0, \n\t0x06, 0x10, 0xb0, 0x02, 0xd0, 0xb0, 0x00, 0x10, 0xb0, 0x08, 0xd0, 0x30, \n\t0x31, 0x21, 0x21, 0x01, 0x07, 0x11, 0x21, 0x11, 0x21, 0x01, 0x37, 0x11, \n\t0x21, 0x04, 0x95, 0xfe, 0xdc, 0xfe, 0x3a, 0x06, 0xfe, 0xdc, 0x01, 0x24, \n\t0x01, 0xc6, 0x06, 0x01, 0x24, 0x02, 0xcd, 0x02, 0xfd, 0x35, 0x04, 0x8d, \n\t0xfd, 0x34, 0x02, 0x02, 0xca, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9c, \n\t0x02, 0x88, 0x03, 0x3b, 0x03, 0x3d, 0x00, 0x03, 0x00, 0x17, 0x00, 0xb0, \n\t0x02, 0x2f, 0xb2, 0x7f, 0x02, 0x01, 0x5d, 0xb1, 0x01, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x35, \n\t0x21, 0x03, 0x3b, 0xfd, 0x61, 0x02, 0x9f, 0x02, 0x88, 0xb5, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x81, 0x00, 0x00, 0x05, 0x88, 0x04, 0x8d, 0x00, 0x0f, \n\t0x00, 0x53, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, \n\t0x02, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, \n\t0xb1, 0x0e, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, \n\t0x1b, 0xb1, 0x04, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, \n\t0x2f, 0x1b, 0xb1, 0x08, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x0a, 0x3e, 0x59, 0xb0, 0x08, 0x10, 0xb0, \n\t0x00, 0xd0, 0xb0, 0x02, 0x10, 0xb0, 0x07, 0xd0, 0xb0, 0x0a, 0xd0, 0x30, \n\t0x31, 0x01, 0x33, 0x01, 0x21, 0x11, 0x21, 0x11, 0x27, 0x03, 0x23, 0x03, \n\t0x07, 0x11, 0x21, 0x11, 0x21, 0x02, 0xfe, 0x06, 0x01, 0x17, 0x01, 0x6d, \n\t0xfe, 0xdd, 0x06, 0xfb, 0xc4, 0xf5, 0x06, 0xfe, 0xdc, 0x01, 0x6a, 0x01, \n\t0x55, 0x03, 0x38, 0xfb, 0x73, 0x02, 0xb8, 0x01, 0xfd, 0x47, 0x02, 0xaa, \n\t0x01, 0xfd, 0x57, 0x04, 0x8d, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x81, \n\t0x00, 0x00, 0x03, 0x88, 0x04, 0x8d, 0x00, 0x05, 0x00, 0x29, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x12, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0a, 0x3e, \n\t0x59, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0x30, 0x31, 0x25, 0x21, 0x15, 0x21, 0x11, 0x21, 0x01, 0xa5, 0x01, \n\t0xe3, 0xfc, 0xf9, 0x01, 0x24, 0xde, 0xde, 0x04, 0x8d, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x81, 0x00, 0x00, 0x04, 0x76, 0x04, 0x8d, 0x00, 0x0c, \n\t0x00, 0x50, 0x00, 0xb0, 0x06, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, \n\t0x2f, 0x1b, 0xb1, 0x04, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0a, 0x3e, 0x59, 0xb0, 0x06, \n\t0x10, 0xb1, 0x01, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb2, 0x0a, 0x01, 0x06, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x23, \n\t0x11, 0x21, 0x11, 0x21, 0x11, 0x33, 0x13, 0x21, 0x01, 0x01, 0x21, 0x02, \n\t0x13, 0x6e, 0xfe, 0xdc, 0x01, 0x24, 0x57, 0xf8, 0x01, 0x71, 0xfe, 0x96, \n\t0x01, 0x7b, 0xfe, 0x8a, 0x01, 0xbe, 0xfe, 0x42, 0x04, 0x8d, 0xfe, 0x36, \n\t0x01, 0xca, 0xfd, 0xe5, 0xfd, 0x8e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1c, \n\t0xff, 0xed, 0x03, 0xa3, 0x04, 0x8d, 0x00, 0x10, 0x00, 0x29, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x12, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x0a, 0x3e, \n\t0x59, 0xb1, 0x0d, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0x30, 0x31, 0x01, 0x21, 0x11, 0x14, 0x06, 0x23, 0x22, 0x26, 0x37, \n\t0x37, 0x21, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x02, 0x7f, 0x01, 0x24, \n\t0xf9, 0xc3, 0xd3, 0xf8, 0x06, 0x02, 0x01, 0x1c, 0x5e, 0x49, 0x42, 0x56, \n\t0x04, 0x8d, 0xfc, 0xf2, 0xb7, 0xdb, 0xc4, 0xb8, 0x06, 0x52, 0x51, 0x61, \n\t0x52, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x81, 0x00, 0x00, 0x01, 0xa5, \n\t0x04, 0x8d, 0x00, 0x03, 0x00, 0x1d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, 0x59, 0x30, 0x31, 0x21, \n\t0x21, 0x11, 0x21, 0x01, 0xa5, 0xfe, 0xdc, 0x01, 0x24, 0x04, 0x8d, 0x00, \n\t0x00, 0x01, 0x00, 0x81, 0x00, 0x00, 0x04, 0x9c, 0x04, 0x8d, 0x00, 0x0b, \n\t0x00, 0x6e, 0x00, 0xb0, 0x08, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, \n\t0x2f, 0x1b, 0xb1, 0x06, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0a, 0x3e, 0x59, 0xb2, 0xaf, \n\t0x08, 0x01, 0x5d, 0xb4, 0x2f, 0x08, 0x3f, 0x08, 0x02, 0x71, 0xb2, 0x9f, \n\t0x08, 0x01, 0x71, 0xb2, 0x6f, 0x08, 0x01, 0x71, 0xb2, 0xdf, 0x08, 0x01, \n\t0x5d, 0xb2, 0x7f, 0x08, 0x01, 0x5d, 0xb2, 0x1f, 0x08, 0x01, 0x5d, 0xb0, \n\t0x08, 0x10, 0xb1, 0x03, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0x30, 0x31, 0x21, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, \n\t0x11, 0x21, 0x11, 0x21, 0x04, 0x9c, 0xfe, 0xdc, 0xfe, 0x2d, 0xfe, 0xdc, \n\t0x01, 0x24, 0x01, 0xd3, 0x01, 0x24, 0x01, 0xca, 0xfe, 0x36, 0x04, 0x8d, \n\t0xfe, 0x1d, 0x01, 0xe3, 0x00, 0x01, 0x00, 0x5f, 0xff, 0xef, 0x04, 0x74, \n\t0x04, 0x9d, 0x00, 0x20, 0x00, 0x54, 0x00, 0xb0, 0x1f, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x12, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0a, 0x3e, 0x59, \n\t0xb2, 0x0f, 0x0a, 0x03, 0x11, 0x12, 0x39, 0xb0, 0x0a, 0x10, 0xb1, 0x12, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, \n\t0x10, 0xb1, 0x19, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x1f, 0x10, 0xb1, 0x1e, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x25, 0x06, 0x06, 0x23, 0x22, 0x00, \n\t0x35, 0x35, 0x34, 0x00, 0x33, 0x32, 0x04, 0x07, 0x07, 0x21, 0x34, 0x26, \n\t0x23, 0x22, 0x06, 0x15, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x35, \n\t0x23, 0x35, 0x21, 0x04, 0x74, 0x43, 0xf5, 0xc3, 0xef, 0xfe, 0xd5, 0x01, \n\t0x26, 0xe6, 0xea, 0x01, 0x08, 0x05, 0x02, 0xfe, 0xe6, 0x62, 0x6f, 0x6b, \n\t0x7d, 0x83, 0x73, 0x57, 0x62, 0x1f, 0xdb, 0x01, 0xfe, 0xa1, 0x4b, 0x67, \n\t0x01, 0x09, 0xd5, 0xf3, 0xd3, 0x01, 0x0a, 0xc5, 0xb2, 0x06, 0x53, 0x4b, \n\t0x8d, 0x70, 0xf4, 0x72, 0x8e, 0x18, 0x15, 0xb5, 0xc1, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x81, 0x00, 0x00, 0x03, 0xeb, 0x04, 0x8d, 0x00, 0x09, \n\t0x00, 0x63, 0x00, 0xb0, 0x09, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, \n\t0x2f, 0x1b, 0xb1, 0x04, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0a, 0x3e, 0x59, 0xb2, 0xaf, 0x09, 0x01, \n\t0x5d, 0xb4, 0x2f, 0x09, 0x3f, 0x09, 0x02, 0x71, 0xb2, 0x9f, 0x09, 0x01, \n\t0x71, 0xb2, 0x6f, 0x09, 0x01, 0x71, 0xb2, 0xdf, 0x09, 0x01, 0x5d, 0xb2, \n\t0x7f, 0x09, 0x01, 0x5d, 0xb2, 0x1f, 0x09, 0x01, 0x5d, 0xb0, 0x09, 0x10, \n\t0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x04, 0x10, 0xb1, 0x06, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x11, 0x21, 0x11, 0x21, 0x15, \n\t0x21, 0x11, 0x21, 0x03, 0x94, 0xfe, 0x11, 0xfe, 0xdc, 0x03, 0x6a, 0xfd, \n\t0xba, 0x01, 0xef, 0x01, 0xce, 0xfe, 0x32, 0x04, 0x8d, 0xdf, 0xff, 0x00, \n\t0x00, 0x01, 0x00, 0x81, 0x00, 0x00, 0x03, 0xd5, 0x04, 0x8d, 0x00, 0x0b, \n\t0x00, 0x57, 0x00, 0xb0, 0x0b, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, \n\t0x2f, 0x1b, 0xb1, 0x06, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0a, 0x3e, 0x59, 0xb2, 0x2f, 0x0b, 0x01, \n\t0x71, 0xb2, 0x00, 0x0b, 0x01, 0x71, 0xb0, 0x0b, 0x10, 0xb1, 0x00, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, \n\t0xb1, 0x02, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x06, 0x10, 0xb1, 0x08, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, \n\t0x21, 0x15, 0x21, 0x15, 0x21, 0x03, 0x7f, 0xfe, 0x26, 0x02, 0x30, 0xfc, \n\t0xac, 0x03, 0x54, 0xfd, 0xd0, 0x01, 0xda, 0x01, 0xec, 0xfe, 0xf2, 0xde, \n\t0x04, 0x8d, 0xdf, 0xe2, 0x00, 0x02, 0x00, 0x81, 0x00, 0x00, 0x04, 0x53, \n\t0x04, 0x8d, 0x00, 0x09, 0x00, 0x13, 0x00, 0x3b, 0x00, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x12, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, 0x59, 0xb0, \n\t0x01, 0x10, 0xb1, 0x0a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x0b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x33, 0x11, 0x21, 0x32, 0x00, \n\t0x15, 0x15, 0x14, 0x00, 0x23, 0x03, 0x11, 0x33, 0x32, 0x36, 0x35, 0x35, \n\t0x34, 0x26, 0x23, 0x81, 0x01, 0xcb, 0xe1, 0x01, 0x26, 0xfe, 0xda, 0xe1, \n\t0xa7, 0xa7, 0x65, 0x7e, 0x7e, 0x65, 0x04, 0x8d, 0xfe, 0xf4, 0xd2, 0xd2, \n\t0xd3, 0xfe, 0xf6, 0x03, 0xae, 0xfd, 0x30, 0x8f, 0x70, 0xd3, 0x6f, 0x8f, \n\t0x00, 0x01, 0x00, 0x5f, 0xff, 0xef, 0x04, 0x3a, 0x04, 0x9d, 0x00, 0x1d, \n\t0x00, 0x3b, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, \n\t0x0b, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, \n\t0xb1, 0x04, 0x0a, 0x3e, 0x59, 0xb0, 0x0b, 0x10, 0xb1, 0x13, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb1, \n\t0x1a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, \n\t0x31, 0x01, 0x17, 0x16, 0x06, 0x23, 0x22, 0x00, 0x35, 0x35, 0x34, 0x00, \n\t0x33, 0x32, 0x16, 0x07, 0x07, 0x21, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, \n\t0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x04, 0x32, 0x02, 0x05, 0xfb, \n\t0xe8, 0xe1, 0xfe, 0xea, 0x01, 0x16, 0xe1, 0xea, 0xfa, 0x05, 0x02, 0xfe, \n\t0xe6, 0x59, 0x6a, 0x65, 0x6e, 0x6e, 0x65, 0x68, 0x59, 0x01, 0x8d, 0x06, \n\t0xc9, 0xcf, 0x01, 0x09, 0xd5, 0xf3, 0xd4, 0x01, 0x09, 0xcf, 0xc7, 0x06, \n\t0x65, 0x58, 0x8c, 0x71, 0xf4, 0x73, 0x8d, 0x5a, 0x66, 0x00, 0x00, 0x00, \n\t0x00, 0x03, 0x00, 0x81, 0x00, 0x00, 0x04, 0x52, 0x04, 0x8d, 0x00, 0x0e, \n\t0x00, 0x17, 0x00, 0x20, 0x00, 0x8a, 0x00, 0xb0, 0x18, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x12, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, 0x59, \n\t0xb2, 0xaf, 0x18, 0x01, 0x5d, 0xb4, 0x2f, 0x18, 0x3f, 0x18, 0x02, 0x71, \n\t0xb2, 0x9f, 0x18, 0x01, 0x71, 0xb2, 0xff, 0x18, 0x01, 0x71, 0xb2, 0x2f, \n\t0x18, 0x01, 0x72, 0xb4, 0xbf, 0x18, 0xcf, 0x18, 0x02, 0x71, 0xb2, 0x6f, \n\t0x18, 0x01, 0x71, 0xb2, 0xdf, 0x18, 0x01, 0x5d, 0xb2, 0x7f, 0x18, 0x01, \n\t0x5d, 0xb2, 0x1f, 0x18, 0x01, 0x5d, 0xb0, 0x18, 0x10, 0xb1, 0x0f, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x08, 0x0f, \n\t0x18, 0x11, 0x12, 0x39, 0xb0, 0x00, 0x10, 0xb1, 0x10, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x01, 0x10, 0xb1, 0x1f, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x33, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, \n\t0x14, 0x06, 0x23, 0x03, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, \n\t0x27, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x81, 0x01, 0xd1, \n\t0xd8, 0xf1, 0x69, 0x60, 0x7e, 0x82, 0xe5, 0xd6, 0xf2, 0xf2, 0x51, 0x47, \n\t0x47, 0x51, 0xf2, 0xad, 0x52, 0x54, 0x51, 0x55, 0xad, 0x04, 0x8d, 0xa3, \n\t0x9f, 0x53, 0x82, 0x22, 0x19, 0x8f, 0x62, 0xa3, 0xa7, 0x01, 0xef, 0xfe, \n\t0xef, 0x3f, 0x41, 0x48, 0x49, 0xba, 0x3f, 0x3c, 0x45, 0x3d, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x7d, 0x04, 0x50, 0x01, 0x8f, 0x06, 0x03, 0x00, 0x05, \n\t0x00, 0x10, 0x00, 0xb0, 0x04, 0x2f, 0xb0, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, 0x13, 0x13, 0x33, 0x03, 0x15, 0x23, \n\t0x7d, 0x73, 0x9f, 0x23, 0xef, 0x04, 0xff, 0x01, 0x04, 0xfe, 0xf2, 0xa5, \n\t0x00, 0x02, 0x00, 0x6a, 0x04, 0xbc, 0x03, 0x1f, 0x06, 0x92, 0x00, 0x04, \n\t0x00, 0x14, 0x00, 0x3e, 0x00, 0xb0, 0x09, 0x2f, 0xb0, 0x11, 0xb0, 0x0a, \n\t0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x14, 0xb0, 0x0a, 0x2b, 0x58, \n\t0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x00, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, \n\t0xdc, 0x59, 0xb0, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, \n\t0xb0, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x14, \n\t0x10, 0xb0, 0x0e, 0xd0, 0x30, 0x31, 0x01, 0x23, 0x27, 0x37, 0x33, 0x05, \n\t0x17, 0x16, 0x06, 0x23, 0x22, 0x26, 0x37, 0x37, 0x33, 0x14, 0x16, 0x33, \n\t0x32, 0x36, 0x35, 0x02, 0x29, 0xb6, 0xae, 0x03, 0xd7, 0x01, 0x78, 0x02, \n\t0x06, 0xbc, 0x9e, 0x9f, 0xbc, 0x07, 0x02, 0xd4, 0x3d, 0x41, 0x3f, 0x3e, \n\t0x05, 0xd5, 0xb7, 0x06, 0xe2, 0x06, 0x69, 0x85, 0x85, 0x69, 0x06, 0x2b, \n\t0x38, 0x38, 0x2b, 0x00, 0x00, 0x02, 0x00, 0x0f, 0x00, 0x00, 0x04, 0xd1, \n\t0x04, 0x8d, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x42, 0x00, 0xb0, 0x00, 0x2f, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x12, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x09, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb0, 0x0a, 0xd0, \n\t0x30, 0x31, 0x25, 0x21, 0x07, 0x21, 0x01, 0x21, 0x01, 0x21, 0x01, 0x21, \n\t0x03, 0x23, 0x03, 0x52, 0xfe, 0x3c, 0x4a, 0xfe, 0xcb, 0x01, 0xc3, 0x01, \n\t0x3d, 0x01, 0xc2, 0xfe, 0xcc, 0xfe, 0x41, 0x01, 0x24, 0x90, 0x06, 0xcf, \n\t0xcf, 0x04, 0x8d, 0xfb, 0x73, 0x01, 0xaf, 0x01, 0x8f, 0x00, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x5a, 0x04, 0xe4, 0x04, 0xe4, 0x06, 0x9f, 0x00, 0x08, \n\t0x00, 0x0c, 0x00, 0x4e, 0x00, 0xb0, 0x04, 0x2f, 0xb2, 0x3f, 0x04, 0x01, \n\t0x5d, 0xb0, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb6, \n\t0x0f, 0x01, 0x1f, 0x01, 0x2f, 0x01, 0x03, 0x5d, 0xb0, 0x05, 0xb0, 0x0a, \n\t0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x04, 0x10, 0xb0, 0x06, 0xd0, \n\t0xb0, 0x04, 0x10, 0xb0, 0x0c, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, \n\t0x59, 0xb0, 0x0a, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb6, \n\t0x0f, 0x0a, 0x1f, 0x0a, 0x2f, 0x0a, 0x03, 0x5d, 0x30, 0x31, 0x01, 0x33, \n\t0x05, 0x07, 0x21, 0x27, 0x07, 0x21, 0x27, 0x01, 0x21, 0x03, 0x23, 0x01, \n\t0x83, 0xf0, 0x01, 0x28, 0x02, 0xfe, 0xfa, 0x99, 0x97, 0xfe, 0xf9, 0x02, \n\t0x03, 0x7c, 0x01, 0x0e, 0xd6, 0xcc, 0x05, 0xe7, 0xfd, 0x06, 0x8f, 0x8f, \n\t0x06, 0x01, 0xb5, 0xfe, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x10, \n\t0x04, 0xe4, 0x03, 0x98, 0x06, 0x9f, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x4e, \n\t0x00, 0xb0, 0x02, 0x2f, 0xb2, 0x3f, 0x02, 0x01, 0x5d, 0xb0, 0x08, 0xb0, \n\t0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb6, 0x0f, 0x08, 0x1f, 0x08, \n\t0x2f, 0x08, 0x03, 0x5d, 0xb0, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, \n\t0xdc, 0x59, 0xb0, 0x02, 0x10, 0xb0, 0x04, 0xd0, 0xb0, 0x02, 0x10, 0xb0, \n\t0x09, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x0b, 0xb0, \n\t0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb6, 0x0f, 0x0b, 0x1f, 0x0b, \n\t0x2f, 0x0b, 0x03, 0x5d, 0x30, 0x31, 0x01, 0x07, 0x21, 0x27, 0x07, 0x21, \n\t0x27, 0x25, 0x33, 0x05, 0x23, 0x03, 0x21, 0x03, 0x98, 0x02, 0xfe, 0xfa, \n\t0x98, 0x98, 0xfe, 0xf9, 0x02, 0x01, 0x29, 0xf0, 0xfe, 0x41, 0xcc, 0xd5, \n\t0x01, 0x0c, 0x04, 0xea, 0x06, 0x8f, 0x8f, 0x06, 0xfd, 0x57, 0x01, 0x0f, \n\t0x00, 0x02, 0x00, 0x56, 0x04, 0xe4, 0x04, 0x86, 0x06, 0xc2, 0x00, 0x08, \n\t0x00, 0x19, 0x00, 0x66, 0x00, 0xb0, 0x02, 0x2f, 0xb2, 0x3f, 0x02, 0x01, \n\t0x5d, 0xb0, 0x08, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb6, \n\t0x0f, 0x08, 0x1f, 0x08, 0x2f, 0x08, 0x03, 0x5d, 0xb0, 0x03, 0xb0, 0x0a, \n\t0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x02, 0x10, 0xb0, 0x04, 0xd0, \n\t0xb0, 0x02, 0x10, 0xb0, 0x09, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, \n\t0x59, 0xb0, 0x0a, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, \n\t0x11, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x12, 0xb0, \n\t0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x0a, 0x10, 0xb0, 0x18, \n\t0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, 0x01, 0x07, \n\t0x23, 0x27, 0x07, 0x23, 0x27, 0x25, 0x33, 0x17, 0x27, 0x36, 0x36, 0x27, \n\t0x35, 0x36, 0x26, 0x23, 0x37, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x15, \n\t0x03, 0x99, 0x03, 0xff, 0xa0, 0x9f, 0xff, 0x03, 0x01, 0x25, 0xfa, 0xda, \n\t0x0d, 0x3e, 0x35, 0x04, 0x04, 0x3e, 0x39, 0x07, 0x9c, 0xa5, 0x49, 0x35, \n\t0x04, 0xea, 0x06, 0x99, 0x99, 0x06, 0xfd, 0x7b, 0x74, 0x03, 0x18, 0x19, \n\t0x06, 0x1e, 0x1b, 0x6f, 0x57, 0x4d, 0x37, 0x3d, 0x07, 0x37, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x57, 0x04, 0xeb, 0x03, 0x8f, 0x06, 0xf3, 0x00, 0x08, \n\t0x00, 0x1c, 0x00, 0x59, 0x00, 0xb0, 0x02, 0x2f, 0xb2, 0x3f, 0x02, 0x01, \n\t0x5d, 0xb0, 0x08, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0x40, \n\t0x0b, 0x0f, 0x08, 0x1f, 0x08, 0x2f, 0x08, 0x3f, 0x08, 0x4f, 0x08, 0x05, \n\t0x5d, 0xb0, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, \n\t0x02, 0x10, 0xb0, 0x04, 0xd0, 0xb0, 0x08, 0x10, 0xb0, 0x0c, 0xb0, 0x0a, \n\t0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x0f, 0xd0, 0xb0, 0x0c, 0x10, \n\t0xb0, 0x12, 0xd0, 0xb0, 0x0c, 0x10, 0xb0, 0x19, 0xb0, 0x0a, 0x2b, 0x58, \n\t0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x16, 0xd0, 0x30, 0x31, 0x01, 0x07, 0x23, \n\t0x27, 0x07, 0x23, 0x27, 0x25, 0x33, 0x37, 0x14, 0x06, 0x23, 0x22, 0x26, \n\t0x23, 0x22, 0x06, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, \n\t0x36, 0x35, 0x03, 0x8f, 0x02, 0xfb, 0x9e, 0x9f, 0xfc, 0x02, 0x01, 0x26, \n\t0xee, 0xa3, 0x54, 0x40, 0x33, 0x90, 0x25, 0x19, 0x1f, 0x70, 0x51, 0x40, \n\t0x29, 0x9a, 0x26, 0x18, 0x21, 0x04, 0xf1, 0x06, 0x89, 0x89, 0x06, 0xe4, \n\t0xf7, 0x46, 0x6a, 0x46, 0x32, 0x22, 0x1e, 0x45, 0x6d, 0x44, 0x36, 0x23, \n\t0x00, 0x02, 0x00, 0x6a, 0x04, 0xbc, 0x03, 0x1f, 0x06, 0x92, 0x00, 0x0f, \n\t0x00, 0x14, 0x00, 0x6f, 0x00, 0xb0, 0x04, 0x2f, 0xb2, 0x7f, 0x04, 0x01, \n\t0x5d, 0xb2, 0x0f, 0x04, 0x01, 0x5d, 0xb2, 0x5f, 0x04, 0x01, 0x5d, 0xb2, \n\t0x3f, 0x04, 0x01, 0x5d, 0xb0, 0x0c, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, \n\t0xdc, 0x59, 0xb2, 0xb0, 0x0c, 0x01, 0x71, 0xb2, 0xd0, 0x0c, 0x01, 0x5d, \n\t0xb6, 0x90, 0x0c, 0xa0, 0x0c, 0xb0, 0x0c, 0x03, 0x72, 0xb0, 0x0f, 0xb0, \n\t0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb2, 0x60, 0x0f, 0x01, 0x71, \n\t0xb2, 0xc0, 0x0f, 0x01, 0x72, 0xb0, 0x09, 0xd0, 0xb0, 0x0f, 0x10, 0xb0, \n\t0x13, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x12, 0xb0, \n\t0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x11, 0xb0, 0x0a, 0x2b, \n\t0x58, 0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, 0x01, 0x17, 0x16, 0x06, 0x23, \n\t0x22, 0x26, 0x37, 0x37, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x27, \n\t0x33, 0x17, 0x07, 0x23, 0x03, 0x17, 0x02, 0x06, 0xbc, 0x9e, 0x9f, 0xbc, \n\t0x07, 0x02, 0xd4, 0x3d, 0x41, 0x3f, 0x3e, 0x52, 0xcd, 0x02, 0xaa, 0xa0, \n\t0x05, 0xb0, 0x06, 0x69, 0x85, 0x85, 0x69, 0x06, 0x2b, 0x38, 0x38, 0x2b, \n\t0xe2, 0x05, 0xb8, 0x00, 0x00, 0x02, 0x00, 0x6b, 0x04, 0xc8, 0x03, 0x22, \n\t0x07, 0x1e, 0x00, 0x0f, 0x00, 0x20, 0x00, 0x73, 0x00, 0xb0, 0x04, 0x2f, \n\t0xb2, 0x0f, 0x04, 0x01, 0x5d, 0xb2, 0x5f, 0x04, 0x01, 0x5d, 0xb2, 0x3f, \n\t0x04, 0x01, 0x5d, 0xb0, 0x0c, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, \n\t0x59, 0xb2, 0xcf, 0x0c, 0x01, 0x71, 0xb0, 0x0f, 0xb0, 0x0a, 0x2b, 0x58, \n\t0xd8, 0x1b, 0xdc, 0x59, 0xb2, 0x7f, 0x0f, 0x01, 0x71, 0xb0, 0x09, 0xd0, \n\t0xb0, 0x0f, 0x10, 0xb0, 0x20, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, \n\t0x59, 0xb0, 0x11, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb2, \n\t0x3f, 0x11, 0x01, 0x71, 0xb0, 0x18, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, \n\t0xdc, 0x59, 0xb0, 0x19, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, \n\t0xb0, 0x11, 0x10, 0xb0, 0x1f, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, \n\t0x59, 0x30, 0x31, 0x01, 0x17, 0x16, 0x06, 0x23, 0x22, 0x26, 0x37, 0x37, \n\t0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x27, 0x27, 0x36, 0x36, 0x27, \n\t0x35, 0x36, 0x26, 0x23, 0x37, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x15, \n\t0x03, 0x1b, 0x01, 0x06, 0xbb, 0x9f, 0xa1, 0xbc, 0x07, 0x01, 0xd6, 0x3d, \n\t0x42, 0x3f, 0x3e, 0xe9, 0x10, 0x47, 0x3d, 0x05, 0x05, 0x47, 0x42, 0x07, \n\t0xb5, 0xc0, 0x54, 0x3f, 0x05, 0xb0, 0x06, 0x64, 0x7e, 0x7e, 0x64, 0x06, \n\t0x2a, 0x35, 0x35, 0x2a, 0x32, 0x6d, 0x02, 0x16, 0x17, 0x06, 0x1a, 0x18, \n\t0x68, 0x50, 0x47, 0x32, 0x37, 0x07, 0x35, 0x00, 0x00, 0x02, 0x00, 0x6a, \n\t0x04, 0xc6, 0x03, 0x1b, 0x06, 0xe2, 0x00, 0x0f, 0x00, 0x23, 0x00, 0x8a, \n\t0x00, 0xb0, 0x04, 0x2f, 0xb2, 0x0f, 0x04, 0x01, 0x5d, 0xb2, 0x3f, 0x04, \n\t0x01, 0x5d, 0xb0, 0x0c, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, \n\t0xb2, 0xb0, 0x0c, 0x01, 0x72, 0xb0, 0x0f, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, \n\t0x1b, 0xdc, 0x59, 0xb0, 0x09, 0xd0, 0xb0, 0x0f, 0x10, 0xb0, 0x13, 0xb0, \n\t0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb2, 0xc0, 0x13, 0x01, 0x71, \n\t0xb0, 0x16, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x13, \n\t0x10, 0xb0, 0x19, 0xd0, 0xb0, 0x16, 0x10, 0xb0, 0x1d, 0xb0, 0x0a, 0x2b, \n\t0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb6, 0xcf, 0x1d, 0xdf, 0x1d, 0xef, 0x1d, \n\t0x03, 0x71, 0xb2, 0xef, 0x1d, 0x01, 0x5d, 0xb0, 0x13, 0x10, 0xb0, 0x20, \n\t0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb2, 0xef, 0x20, 0x01, \n\t0x5d, 0xb6, 0xcf, 0x20, 0xdf, 0x20, 0xef, 0x20, 0x03, 0x71, 0xb0, 0x1d, \n\t0x10, 0xb0, 0x23, 0xd0, 0x30, 0x31, 0x01, 0x17, 0x16, 0x06, 0x23, 0x22, \n\t0x26, 0x37, 0x37, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x13, 0x14, \n\t0x06, 0x23, 0x22, 0x26, 0x23, 0x22, 0x06, 0x15, 0x27, 0x34, 0x36, 0x33, \n\t0x32, 0x16, 0x33, 0x32, 0x36, 0x35, 0x03, 0x14, 0x01, 0x06, 0xba, 0x9e, \n\t0x9e, 0xbb, 0x07, 0x02, 0xd4, 0x3c, 0x40, 0x3f, 0x3d, 0xa8, 0x5f, 0x45, \n\t0x38, 0x8b, 0x27, 0x1d, 0x26, 0x79, 0x5d, 0x47, 0x2b, 0x95, 0x2a, 0x1b, \n\t0x27, 0x05, 0xb0, 0x06, 0x64, 0x80, 0x80, 0x64, 0x06, 0x2b, 0x35, 0x35, \n\t0x2b, 0x01, 0x10, 0x4a, 0x6b, 0x44, 0x32, 0x24, 0x21, 0x49, 0x6d, 0x43, \n\t0x31, 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0xfe, 0x9b, 0x01, 0x7e, \n\t0x00, 0xea, 0x00, 0x03, 0x00, 0x06, 0x00, 0xb0, 0x02, 0x2f, 0x30, 0x31, \n\t0x01, 0x21, 0x11, 0x21, 0x01, 0x7e, 0xfe, 0xdc, 0x01, 0x24, 0xfe, 0x9b, \n\t0x02, 0x4f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x21, 0xfe, 0x5f, 0x01, 0xdc, \n\t0x00, 0x3f, 0x00, 0x13, 0x00, 0x31, 0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0c, 0x3e, 0x59, 0x40, \n\t0x0f, 0x0f, 0x00, 0x1f, 0x00, 0x2f, 0x00, 0x3f, 0x00, 0x4f, 0x00, 0x5f, \n\t0x00, 0x6f, 0x00, 0x07, 0x5d, 0xb1, 0x0d, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x25, 0x16, 0x16, 0x15, 0x14, \n\t0x06, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, \n\t0x34, 0x26, 0x27, 0x01, 0x28, 0x5b, 0x59, 0x90, 0x6d, 0x3f, 0x5b, 0x24, \n\t0x23, 0x17, 0x2d, 0x1f, 0x35, 0x25, 0x30, 0x32, 0x3f, 0x34, 0x8b, 0x4b, \n\t0x65, 0x71, 0x19, 0x13, 0x9a, 0x08, 0x0c, 0x2b, 0x1b, 0x2f, 0x47, 0x33, \n\t0x00, 0x01, 0xff, 0x9e, 0xfe, 0x4b, 0x01, 0xab, 0x00, 0xf7, 0x00, 0x0f, \n\t0x00, 0x1f, 0x00, 0xb0, 0x0f, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, \n\t0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb1, 0x0b, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x25, 0x11, 0x14, \n\t0x06, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, \n\t0x11, 0x01, 0xab, 0xca, 0xb4, 0x28, 0x42, 0x25, 0x0e, 0x16, 0x32, 0x1a, \n\t0x3a, 0x3e, 0xf7, 0xfe, 0xe1, 0xbe, 0xcf, 0x08, 0x09, 0xe0, 0x05, 0x07, \n\t0x56, 0x52, 0x01, 0x1f, 0x00, 0x01, 0xff, 0x9c, 0xff, 0xe0, 0x03, 0x16, \n\t0x03, 0x95, 0x00, 0x0f, 0x00, 0x15, 0x00, 0xb0, 0x07, 0x2f, 0xb0, 0x00, \n\t0x2f, 0xb1, 0x0f, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0x30, 0x31, 0x03, 0x21, 0x20, 0x04, 0x15, 0x16, 0x02, 0x07, 0x27, \n\t0x36, 0x36, 0x37, 0x34, 0x26, 0x23, 0x21, 0x64, 0x01, 0x2e, 0x01, 0x0a, \n\t0x01, 0x40, 0x02, 0xc0, 0xb5, 0x7b, 0x63, 0x67, 0x01, 0x9c, 0x8b, 0xfe, \n\t0xd2, 0x03, 0x95, 0xfb, 0xec, 0x86, 0xfe, 0xf1, 0x39, 0xbc, 0x2c, 0x85, \n\t0x61, 0x7e, 0x84, 0x00, 0x00, 0x01, 0x00, 0x2d, 0x00, 0x00, 0x02, 0x62, \n\t0x05, 0xb0, 0x00, 0x05, 0x00, 0x33, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, 0x59, 0xb2, 0x04, 0x05, \n\t0x00, 0x11, 0x12, 0x39, 0xb0, 0x04, 0x2f, 0xb1, 0x03, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x21, 0x21, 0x11, \n\t0x21, 0x35, 0x25, 0x02, 0x62, 0xfe, 0xdc, 0xfe, 0xef, 0x02, 0x35, 0x04, \n\t0xae, 0xce, 0x34, 0x00, 0x00, 0x01, 0x00, 0x4e, 0x00, 0x00, 0x04, 0x4c, \n\t0x05, 0xc5, 0x00, 0x1a, 0x00, 0x48, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, 0x59, 0xb2, 0x03, 0x00, \n\t0x11, 0x11, 0x12, 0x39, 0xb0, 0x11, 0x10, 0xb1, 0x09, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb0, 0x17, \n\t0xd0, 0xb0, 0x00, 0x10, 0xb1, 0x19, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x21, 0x21, 0x35, 0x01, 0x36, 0x36, \n\t0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x21, 0x27, 0x26, 0x00, 0x33, \n\t0x32, 0x04, 0x15, 0x14, 0x06, 0x07, 0x01, 0x17, 0x21, 0x04, 0x4c, 0xfc, \n\t0x1e, 0x01, 0xd7, 0x66, 0x56, 0x63, 0x5b, 0x65, 0x69, 0xfe, 0xe4, 0x02, \n\t0x05, 0x01, 0x0d, 0xe4, 0xe1, 0x01, 0x01, 0x91, 0xa7, 0xfe, 0xfd, 0x02, \n\t0x02, 0x64, 0xbf, 0x01, 0xf9, 0x75, 0xa1, 0x45, 0x5c, 0x75, 0x89, 0x72, \n\t0x06, 0xc5, 0x01, 0x11, 0xea, 0xc3, 0x84, 0xdf, 0xb5, 0xfe, 0xe5, 0x05, \n\t0x00, 0x01, 0x00, 0x46, 0xff, 0xeb, 0x04, 0x3f, 0x05, 0xc5, 0x00, 0x2a, \n\t0x00, 0x5e, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, \n\t0x0f, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, \n\t0xb1, 0x00, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1b, 0x2f, \n\t0x1b, 0xb1, 0x1b, 0x0a, 0x3e, 0x59, 0xb0, 0x0f, 0x10, 0xb1, 0x07, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, \n\t0xb1, 0x29, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb2, 0x15, 0x00, 0x29, 0x11, 0x12, 0x39, 0xb0, 0x1b, 0x10, 0xb1, 0x23, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x21, \n\t0x27, 0x26, 0x24, 0x33, 0x32, 0x04, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, \n\t0x15, 0x14, 0x04, 0x23, 0x22, 0x24, 0x37, 0x37, 0x21, 0x14, 0x16, 0x33, \n\t0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x01, 0x8f, 0xa4, 0x6b, 0x67, \n\t0x67, 0x62, 0x52, 0x70, 0xfe, 0xe5, 0x02, 0x06, 0x01, 0x13, 0xca, 0xe4, \n\t0x01, 0x10, 0x79, 0x6a, 0x7a, 0x80, 0xfe, 0xda, 0xe5, 0xcb, 0xfe, 0xdd, \n\t0x05, 0x02, 0x01, 0x1b, 0x78, 0x5c, 0x67, 0x78, 0x75, 0x73, 0xa4, 0x03, \n\t0x54, 0x6d, 0x61, 0x58, 0x6a, 0x60, 0x4e, 0x06, 0xab, 0xde, 0xd8, 0xc8, \n\t0x5f, 0xab, 0x30, 0x2b, 0xb2, 0x76, 0xc8, 0xe5, 0xd7, 0xc4, 0x06, 0x54, \n\t0x6d, 0x70, 0x60, 0x73, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3d, \n\t0x00, 0x00, 0x04, 0x64, 0x05, 0xb0, 0x00, 0x0a, 0x00, 0x0f, 0x00, 0x41, \n\t0x00, 0xb0, 0x02, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, \n\t0xb1, 0x09, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, \n\t0x1b, 0xb1, 0x04, 0x0a, 0x3e, 0x59, 0xb0, 0x02, 0x10, 0xb1, 0x01, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x02, 0x10, \n\t0xb0, 0x06, 0xd0, 0xb0, 0x01, 0x10, 0xb0, 0x0b, 0xd0, 0xb0, 0x09, 0x10, \n\t0xb0, 0x0e, 0xd0, 0x30, 0x31, 0x01, 0x33, 0x15, 0x23, 0x11, 0x21, 0x11, \n\t0x21, 0x27, 0x01, 0x21, 0x01, 0x21, 0x11, 0x27, 0x07, 0x03, 0xbf, 0xa5, \n\t0xa5, 0xfe, 0xdd, 0xfd, 0xae, 0x0d, 0x02, 0x5c, 0x01, 0x26, 0xfd, 0x8e, \n\t0x01, 0x4f, 0x06, 0x17, 0x02, 0x1e, 0xe2, 0xfe, 0xc4, 0x01, 0x3c, 0xaf, \n\t0x03, 0xc5, 0xfc, 0x6e, 0x02, 0x12, 0x02, 0x28, 0x00, 0x01, 0x00, 0x6e, \n\t0xff, 0xeb, 0x04, 0x40, 0x05, 0xb0, 0x00, 0x1f, 0x00, 0x54, 0x00, 0xb0, \n\t0x08, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, \n\t0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, \n\t0x0e, 0x0a, 0x3e, 0x59, 0xb0, 0x01, 0x10, 0xb1, 0x03, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x08, 0x10, 0xb1, 0x1c, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x13, \n\t0x0e, 0x1c, 0x11, 0x12, 0x39, 0xb0, 0x0e, 0x10, 0xb1, 0x16, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x13, 0x13, \n\t0x21, 0x15, 0x21, 0x03, 0x36, 0x36, 0x37, 0x36, 0x12, 0x15, 0x14, 0x02, \n\t0x23, 0x22, 0x24, 0x37, 0x37, 0x25, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, \n\t0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x8d, 0x54, 0x03, 0x2c, 0xfd, 0xc3, \n\t0x28, 0x29, 0x72, 0x44, 0xd2, 0xe7, 0xfd, 0xee, 0xc8, 0xfe, 0xe1, 0x05, \n\t0x02, 0x01, 0x19, 0x6e, 0x59, 0x66, 0x61, 0x67, 0x67, 0x54, 0x58, 0x14, \n\t0x02, 0x85, 0x03, 0x2b, 0xea, 0xfe, 0xb0, 0x1e, 0x27, 0x01, 0x03, 0xfe, \n\t0xfc, 0xe8, 0xd2, 0xfe, 0xea, 0xdb, 0xc0, 0x05, 0x0e, 0x61, 0x6d, 0x91, \n\t0x75, 0x7e, 0x98, 0x3d, 0x36, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x6e, \n\t0xff, 0xeb, 0x04, 0x61, 0x05, 0xc5, 0x00, 0x1a, 0x00, 0x27, 0x00, 0x4d, \n\t0x00, 0xb0, 0x0e, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, \n\t0xb1, 0x00, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x14, 0x2f, \n\t0x1b, 0xb1, 0x14, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x07, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0e, 0x10, \n\t0xb1, 0x1b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x14, 0x10, 0xb1, 0x22, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, \n\t0x23, 0x22, 0x06, 0x17, 0x17, 0x36, 0x36, 0x33, 0x32, 0x12, 0x15, 0x14, \n\t0x00, 0x23, 0x22, 0x00, 0x11, 0x11, 0x10, 0x00, 0x13, 0x22, 0x06, 0x07, \n\t0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x02, 0xb7, 0x52, \n\t0x8a, 0x46, 0x33, 0x42, 0x67, 0x45, 0x85, 0xa1, 0x06, 0x03, 0x31, 0x96, \n\t0x5e, 0xc3, 0xde, 0xfe, 0xef, 0xda, 0xe6, 0xfe, 0xde, 0x01, 0x4a, 0xbb, \n\t0x51, 0x72, 0x1f, 0x7d, 0x68, 0x5a, 0x6d, 0x6e, 0x05, 0xc5, 0x1f, 0x1e, \n\t0xd6, 0x17, 0x17, 0xc7, 0xb0, 0x05, 0x33, 0x3a, 0xfe, 0xeb, 0xd7, 0xdc, \n\t0xfe, 0xe2, 0x01, 0x39, 0x01, 0x15, 0x01, 0x1c, 0x01, 0x1e, 0x01, 0x52, \n\t0xfd, 0x2f, 0x34, 0x2d, 0x61, 0xad, 0xba, 0xa5, 0x75, 0x79, 0x96, 0x00, \n\t0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x03, 0xcd, 0x05, 0xb0, 0x00, 0x0c, \n\t0x00, 0x2f, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, \n\t0x0b, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, \n\t0xb1, 0x04, 0x0a, 0x3e, 0x59, 0xb0, 0x0b, 0x10, 0xb1, 0x09, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0xd0, 0x30, \n\t0x31, 0x01, 0x02, 0x02, 0x03, 0x07, 0x21, 0x37, 0x12, 0x12, 0x37, 0x21, \n\t0x35, 0x21, 0x03, 0xcd, 0xd5, 0x9c, 0x20, 0x0f, 0xfe, 0xdc, 0x0e, 0x20, \n\t0xcc, 0xb1, 0xfd, 0x5b, 0x03, 0xbe, 0x04, 0xcf, 0xfe, 0xee, 0xfe, 0x25, \n\t0xfe, 0xb2, 0x94, 0x94, 0x01, 0x41, 0x02, 0x19, 0xe1, 0xe1, 0x00, 0x00, \n\t0x00, 0x03, 0x00, 0x5b, 0xff, 0xeb, 0x04, 0x63, 0x05, 0xc5, 0x00, 0x17, \n\t0x00, 0x23, 0x00, 0x2f, 0x00, 0x65, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x2d, 0x2f, 0x1b, 0xb1, 0x2d, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x15, 0x2f, 0x1b, 0xb1, 0x15, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0a, 0x3e, 0x59, 0xb0, 0x2d, \n\t0x10, 0xb1, 0x1b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb2, 0x03, 0x1b, 0x2d, 0x11, 0x12, 0x39, 0xb2, 0x0f, 0x2d, 0x1b, \n\t0x11, 0x12, 0x39, 0xb0, 0x09, 0x10, 0xb1, 0x21, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x15, 0x10, 0xb1, 0x27, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, \n\t0x14, 0x06, 0x07, 0x16, 0x16, 0x15, 0x14, 0x04, 0x23, 0x22, 0x24, 0x35, \n\t0x34, 0x36, 0x37, 0x26, 0x26, 0x35, 0x34, 0x24, 0x33, 0x32, 0x04, 0x01, \n\t0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x03, \n\t0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x04, \n\t0x42, 0x79, 0x69, 0x78, 0x8b, 0xfe, 0xe3, 0xe6, 0xe7, 0xfe, 0xe2, 0x8a, \n\t0x79, 0x6b, 0x77, 0x01, 0x09, 0xd9, 0xd9, 0x01, 0x0b, 0xfe, 0xfe, 0x7e, \n\t0x64, 0x64, 0x7b, 0x7a, 0x67, 0x64, 0x7c, 0x22, 0x67, 0x59, 0x59, 0x64, \n\t0x65, 0x5a, 0x59, 0x65, 0x04, 0x2e, 0x6d, 0xa9, 0x2e, 0x32, 0xb5, 0x75, \n\t0xca, 0xd9, 0xd9, 0xca, 0x75, 0xb6, 0x31, 0x2f, 0xa8, 0x6d, 0xc2, 0xd5, \n\t0xd5, 0xfc, 0xb2, 0x62, 0x76, 0x76, 0x62, 0x64, 0x73, 0x74, 0x02, 0xe2, \n\t0x58, 0x6b, 0x69, 0x5a, 0x5b, 0x6b, 0x6b, 0x00, 0x00, 0x02, 0x00, 0x56, \n\t0xff, 0xeb, 0x04, 0x33, 0x05, 0xc5, 0x00, 0x1a, 0x00, 0x27, 0x00, 0x4a, \n\t0x00, 0xb0, 0x07, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, \n\t0xb1, 0x0d, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x14, 0x2f, \n\t0x1b, 0xb1, 0x14, 0x0a, 0x3e, 0x59, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x07, 0x10, 0xb1, 0x1b, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0d, 0x10, \n\t0xb1, 0x22, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x25, 0x32, 0x36, 0x35, 0x35, 0x06, 0x06, 0x23, 0x22, 0x02, \n\t0x35, 0x34, 0x00, 0x33, 0x32, 0x00, 0x11, 0x11, 0x10, 0x00, 0x23, 0x22, \n\t0x26, 0x27, 0x37, 0x16, 0x16, 0x13, 0x32, 0x36, 0x37, 0x35, 0x34, 0x26, \n\t0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x02, 0x0b, 0x74, 0x91, 0x31, 0x87, \n\t0x4e, 0xcb, 0xe9, 0x01, 0x14, 0xd4, 0xdf, 0x01, 0x16, 0xfe, 0xc9, 0xf1, \n\t0x4b, 0xa1, 0x45, 0x22, 0x40, 0x80, 0x7e, 0x49, 0x6c, 0x21, 0x70, 0x60, \n\t0x58, 0x6f, 0x64, 0xcb, 0xab, 0x9f, 0x49, 0x3f, 0x40, 0x01, 0x09, 0xe2, \n\t0xda, 0x01, 0x21, 0xfe, 0xcd, 0xfe, 0xea, 0xfe, 0xa8, 0xfe, 0xf7, 0xfe, \n\t0xd0, 0x1f, 0x1e, 0xd3, 0x19, 0x17, 0x01, 0xea, 0x36, 0x2e, 0x85, 0xa0, \n\t0xa6, 0xa4, 0x76, 0x7d, 0x98, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x81, \n\t0x00, 0x00, 0x04, 0x63, 0x04, 0x8d, 0x00, 0x0a, 0x00, 0x13, 0x00, 0x3e, \n\t0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, \n\t0xb1, 0x03, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, \n\t0x1b, 0xb1, 0x01, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x0b, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, \n\t0xb1, 0x12, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x01, 0x11, 0x21, 0x11, 0x21, 0x32, 0x04, 0x15, 0x14, 0x04, \n\t0x23, 0x27, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x01, 0xa5, \n\t0xfe, 0xdc, 0x01, 0xf7, 0xde, 0x01, 0x0d, 0xfe, 0xf3, 0xde, 0xd3, 0xd3, \n\t0x5d, 0x6b, 0x6b, 0x5d, 0xd3, 0x01, 0x6d, 0xfe, 0x93, 0x04, 0x8d, 0xe1, \n\t0xaf, 0xb0, 0xe0, 0xe0, 0x66, 0x48, 0x49, 0x6a, 0x00, 0x01, 0x00, 0x42, \n\t0xff, 0xef, 0x03, 0xef, 0x04, 0x8d, 0x00, 0x1f, 0x00, 0x52, 0x00, 0xb0, \n\t0x08, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, \n\t0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, \n\t0x0e, 0x0a, 0x3e, 0x59, 0xb0, 0x01, 0x10, 0xb1, 0x03, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x8f, 0x08, 0x01, 0x5d, \n\t0xb0, 0x0e, 0x10, 0xb1, 0x16, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x08, 0x10, 0xb1, 0x1c, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x13, 0x13, 0x21, 0x15, \n\t0x21, 0x07, 0x36, 0x36, 0x37, 0x36, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, \n\t0x24, 0x37, 0x37, 0x25, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, \n\t0x23, 0x22, 0x06, 0x07, 0x6f, 0x47, 0x02, 0xf1, 0xfe, 0x12, 0x19, 0x26, \n\t0x65, 0x3f, 0xb6, 0xcf, 0xe7, 0xec, 0xca, 0xfe, 0xf0, 0x05, 0x02, 0x01, \n\t0x1b, 0x65, 0x53, 0x57, 0x58, 0x5d, 0x50, 0x45, 0x52, 0x11, 0x01, 0xf8, \n\t0x02, 0x95, 0xde, 0xf2, 0x15, 0x1c, 0x01, 0x02, 0xca, 0xb4, 0xb2, 0xd2, \n\t0xa7, 0xa2, 0x06, 0x10, 0x3b, 0x46, 0x61, 0x53, 0x50, 0x5f, 0x29, 0x1c, \n\t0x00, 0x02, 0x00, 0x67, 0xff, 0xf5, 0x03, 0x11, 0x03, 0x2c, 0x00, 0x1a, \n\t0x00, 0x27, 0x00, 0x57, 0x00, 0xb0, 0x0e, 0x2f, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x14, 0x2f, 0x1b, 0xb1, 0x14, 0x0a, 0x3e, 0x59, 0xb0, 0x00, \n\t0x10, 0xb1, 0x07, 0x06, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb2, 0x10, 0x0e, 0x01, 0x5d, 0xb0, 0x0e, 0x10, 0xb1, 0x1b, 0x05, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x90, 0x1b, \n\t0x01, 0x71, 0xb0, 0x14, 0x10, 0xb1, 0x22, 0x06, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x32, 0x16, 0x17, 0x07, \n\t0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x15, 0x36, 0x36, 0x33, 0x32, 0x16, \n\t0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x35, 0x34, 0x36, 0x13, 0x22, \n\t0x06, 0x07, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x01, \n\t0xe2, 0x37, 0x63, 0x32, 0x22, 0x27, 0x51, 0x30, 0x4a, 0x61, 0x25, 0x64, \n\t0x3c, 0x87, 0x8c, 0xbe, 0x97, 0x93, 0xc2, 0xd6, 0x7f, 0x2c, 0x43, 0x14, \n\t0x51, 0x39, 0x3c, 0x40, 0x41, 0x03, 0x2c, 0x12, 0x10, 0x97, 0x0e, 0x10, \n\t0x57, 0x4b, 0x29, 0x1d, 0x20, 0x86, 0x74, 0x7b, 0x99, 0xb1, 0x8c, 0xbc, \n\t0x8f, 0xaf, 0xfe, 0x43, 0x18, 0x14, 0x11, 0x47, 0x5b, 0x3c, 0x32, 0x35, \n\t0x3c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x61, 0xff, 0xf5, 0x03, 0x0b, \n\t0x03, 0x21, 0x00, 0x1f, 0x00, 0x54, 0x00, 0xb0, 0x08, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x14, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x01, 0x10, 0xb1, 0x03, 0x06, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x08, 0x10, 0xb1, 0x1c, 0x05, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x13, 0x1c, 0x0e, 0x11, 0x12, \n\t0x39, 0xb0, 0x0e, 0x10, 0xb1, 0x16, 0x06, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x13, 0x13, 0x21, 0x15, 0x21, 0x07, \n\t0x36, 0x36, 0x37, 0x36, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x3f, \n\t0x02, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, \n\t0x07, 0x80, 0x34, 0x02, 0x24, 0xfe, 0x95, 0x11, 0x1b, 0x4b, 0x2d, 0x85, \n\t0x97, 0xa7, 0xac, 0x94, 0xc3, 0x06, 0x01, 0xc9, 0x49, 0x3e, 0x41, 0x40, \n\t0x42, 0x34, 0x39, 0x3e, 0x0f, 0x01, 0x5a, 0x01, 0xc7, 0x9a, 0xa2, 0x10, \n\t0x16, 0x01, 0x02, 0x8b, 0x7b, 0x7f, 0x94, 0x73, 0x71, 0x05, 0x0b, 0x2b, \n\t0x2e, 0x3c, 0x36, 0x39, 0x47, 0x1c, 0x15, 0x00, 0x00, 0x02, 0x00, 0x40, \n\t0x00, 0x00, 0x03, 0x20, 0x03, 0x21, 0x00, 0x0a, 0x00, 0x0f, 0x00, 0x41, \n\t0x00, 0xb0, 0x02, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, \n\t0xb1, 0x09, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, \n\t0x1b, 0xb1, 0x04, 0x0a, 0x3e, 0x59, 0xb0, 0x02, 0x10, 0xb1, 0x01, 0x06, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x02, 0x10, \n\t0xb0, 0x06, 0xd0, 0xb0, 0x01, 0x10, 0xb0, 0x0b, 0xd0, 0xb0, 0x09, 0x10, \n\t0xb0, 0x0e, 0xd0, 0x30, 0x31, 0x01, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, \n\t0x21, 0x27, 0x01, 0x33, 0x01, 0x33, 0x11, 0x27, 0x07, 0x02, 0xbb, 0x65, \n\t0x65, 0xd3, 0xfe, 0x66, 0x0e, 0x01, 0xa8, 0xd3, 0xfe, 0x5d, 0xd0, 0x06, \n\t0x0d, 0x01, 0x28, 0x9d, 0x8b, 0x8b, 0x7e, 0x02, 0x18, 0xfe, 0x07, 0x01, \n\t0x01, 0x02, 0x14, 0x00, 0x00, 0x01, 0x00, 0x59, 0xff, 0xf5, 0x02, 0xf2, \n\t0x03, 0x2c, 0x00, 0x2a, 0x00, 0x87, 0x00, 0xb0, 0x2a, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x14, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x1a, 0x2f, 0x1b, 0xb1, 0x1a, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x0e, 0x10, 0xb1, 0x06, 0x06, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x1a, 0x10, 0xb1, 0x22, 0x06, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x4f, 0x2a, 0x01, 0x72, 0xb4, \n\t0xdf, 0x2a, 0xef, 0x2a, 0x02, 0x5d, 0xb2, 0x7f, 0x2a, 0x01, 0x71, 0xb2, \n\t0x8f, 0x2a, 0x01, 0x72, 0xb4, 0x2f, 0x2a, 0x3f, 0x2a, 0x02, 0x71, 0xb4, \n\t0x0f, 0x2a, 0x1f, 0x2a, 0x02, 0x5d, 0xb2, 0xff, 0x2a, 0x01, 0x71, 0xb2, \n\t0x0f, 0x2a, 0x01, 0x72, 0xb4, 0xaf, 0x2a, 0xbf, 0x2a, 0x02, 0x71, 0xb0, \n\t0x2a, 0x10, 0xb1, 0x29, 0x05, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb2, 0xb0, 0x29, 0x01, 0x5d, 0x30, 0x31, 0x01, 0x32, 0x36, \n\t0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x23, 0x27, 0x26, 0x36, 0x33, \n\t0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, 0x14, 0x06, 0x23, \n\t0x22, 0x26, 0x37, 0x37, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, \n\t0x26, 0x23, 0x23, 0x35, 0x01, 0x98, 0x3e, 0x3c, 0x39, 0x37, 0x33, 0x39, \n\t0xc8, 0x02, 0x06, 0xb0, 0x86, 0x98, 0xb1, 0x47, 0x3d, 0x46, 0x4b, 0xb3, \n\t0x98, 0x92, 0xbc, 0x06, 0x02, 0xc9, 0x3f, 0x3c, 0x38, 0x44, 0x46, 0x43, \n\t0x6f, 0x01, 0xd9, 0x31, 0x2e, 0x26, 0x33, 0x2c, 0x1f, 0x06, 0x65, 0x7b, \n\t0x77, 0x6e, 0x37, 0x5b, 0x19, 0x18, 0x5f, 0x44, 0x70, 0x7c, 0x7d, 0x71, \n\t0x06, 0x2a, 0x2f, 0x30, 0x2c, 0x32, 0x36, 0x85, 0x00, 0x01, 0x00, 0x66, \n\t0x00, 0x00, 0x02, 0xe0, 0x03, 0x2c, 0x00, 0x1a, 0x00, 0x48, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x14, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, \n\t0x59, 0xb2, 0x03, 0x00, 0x11, 0x11, 0x12, 0x39, 0xb0, 0x11, 0x10, 0xb1, \n\t0x09, 0x06, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x03, 0x10, 0xb0, 0x17, 0xd0, 0xb0, 0x00, 0x10, 0xb1, 0x19, 0x06, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x21, 0x21, \n\t0x35, 0x25, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x23, \n\t0x27, 0x26, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x07, 0x17, \n\t0x21, 0x02, 0xe0, 0xfd, 0x92, 0x01, 0x35, 0x3c, 0x23, 0x2f, 0x31, 0x37, \n\t0x38, 0xc9, 0x02, 0x06, 0xb1, 0x94, 0x90, 0x9e, 0x6b, 0x7d, 0x6d, 0x02, \n\t0x01, 0x5a, 0x9b, 0xfc, 0x32, 0x43, 0x29, 0x27, 0x35, 0x3c, 0x2f, 0x06, \n\t0x6a, 0x96, 0x82, 0x76, 0x52, 0x7d, 0x67, 0x5d, 0x06, 0x00, 0x00, 0x00, \n\t0x00, 0x03, 0x00, 0x90, 0x04, 0x54, 0x02, 0xc2, 0x06, 0xc6, 0x00, 0x05, \n\t0x00, 0x11, 0x00, 0x1d, 0x00, 0x4e, 0x00, 0xb0, 0x0f, 0x2f, 0xb6, 0x0f, \n\t0x0f, 0x1f, 0x0f, 0x2f, 0x0f, 0x03, 0x5d, 0xb2, 0xbf, 0x0f, 0x01, 0x71, \n\t0xb2, 0x9f, 0x0f, 0x01, 0x71, 0xb0, 0x1b, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, \n\t0x1b, 0xdc, 0x59, 0xb0, 0x09, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, \n\t0x59, 0xb0, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, \n\t0x00, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x0f, 0x10, \n\t0xb0, 0x15, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, \n\t0x01, 0x21, 0x17, 0x05, 0x23, 0x27, 0x07, 0x34, 0x36, 0x33, 0x32, 0x16, \n\t0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x37, 0x14, 0x16, 0x33, 0x32, 0x36, \n\t0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x01, 0xc0, 0x01, 0x00, 0x02, 0xfe, \n\t0xf9, 0xb1, 0x02, 0x78, 0x75, 0x56, 0x54, 0x73, 0x73, 0x54, 0x56, 0x75, \n\t0x71, 0x33, 0x27, 0x25, 0x31, 0x31, 0x25, 0x27, 0x33, 0x06, 0xc6, 0x06, \n\t0xcd, 0x05, 0xee, 0x4e, 0x6a, 0x6a, 0x4e, 0x50, 0x66, 0x67, 0x4f, 0x27, \n\t0x31, 0x31, 0x27, 0x27, 0x33, 0x33, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4e, \n\t0x00, 0x00, 0x01, 0xa0, 0x03, 0x2c, 0x00, 0x05, 0x00, 0x33, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x14, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, \n\t0x59, 0xb2, 0x04, 0x05, 0x00, 0x11, 0x12, 0x39, 0xb0, 0x04, 0x2f, 0xb1, \n\t0x03, 0x06, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, \n\t0x31, 0x21, 0x23, 0x11, 0x23, 0x35, 0x25, 0x01, 0xa0, 0xd3, 0x7f, 0x01, \n\t0x52, 0x02, 0x76, 0x9f, 0x17, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x67, \n\t0xff, 0xf5, 0x03, 0x2b, 0x03, 0x2c, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x3b, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x14, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x0a, 0x10, 0xb1, 0x11, 0x06, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x18, 0x06, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, \n\t0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, \n\t0x15, 0x27, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x15, 0x14, 0x16, 0x33, \n\t0x32, 0x36, 0x35, 0x03, 0x2b, 0xc4, 0x9e, 0x9f, 0xc3, 0xc2, 0x9f, 0x9e, \n\t0xc5, 0xd3, 0x4d, 0x43, 0x42, 0x4d, 0x4c, 0x44, 0x43, 0x4c, 0x01, 0x33, \n\t0x92, 0xac, 0xac, 0x92, 0xba, 0x91, 0xae, 0xae, 0x91, 0x01, 0x4b, 0x58, \n\t0x58, 0x4b, 0xbb, 0x4e, 0x55, 0x55, 0x4e, 0x00, 0x00, 0x02, 0x00, 0x36, \n\t0xff, 0xef, 0x03, 0xcc, 0x04, 0x9d, 0x00, 0x1a, 0x00, 0x27, 0x00, 0x4a, \n\t0x00, 0xb0, 0x07, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, \n\t0xb1, 0x0d, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x14, 0x2f, \n\t0x1b, 0xb1, 0x14, 0x0a, 0x3e, 0x59, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x07, 0x10, 0xb1, 0x1b, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0d, 0x10, \n\t0xb1, 0x22, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x25, 0x32, 0x36, 0x35, 0x35, 0x06, 0x06, 0x23, 0x22, 0x26, \n\t0x35, 0x34, 0x24, 0x33, 0x32, 0x00, 0x15, 0x11, 0x14, 0x04, 0x23, 0x22, \n\t0x26, 0x27, 0x37, 0x16, 0x16, 0x13, 0x32, 0x36, 0x37, 0x35, 0x34, 0x26, \n\t0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x01, 0xe6, 0x52, 0x71, 0x2a, 0x6a, \n\t0x39, 0xc5, 0xe1, 0x01, 0x06, 0xce, 0xc1, 0x01, 0x01, 0xfe, 0xf2, 0xc9, \n\t0x4b, 0xa6, 0x4a, 0x30, 0x3d, 0x76, 0x67, 0x37, 0x54, 0x1a, 0x66, 0x4d, \n\t0x47, 0x55, 0x57, 0xcd, 0x72, 0x56, 0x45, 0x22, 0x23, 0xd1, 0xb0, 0xa6, \n\t0xe1, 0xff, 0x00, 0xc8, 0xfe, 0xc1, 0xba, 0xed, 0x1a, 0x18, 0xd1, 0x13, \n\t0x12, 0x01, 0x88, 0x24, 0x1f, 0x49, 0x5f, 0x7e, 0x6a, 0x47, 0x51, 0x67, \n\t0x00, 0x03, 0x00, 0x4c, 0xff, 0xef, 0x04, 0x09, 0x04, 0x9d, 0x00, 0x17, \n\t0x00, 0x23, 0x00, 0x2f, 0x00, 0x6a, 0x00, 0xb0, 0x2d, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x15, 0x2f, 0x1b, 0xb1, 0x15, 0x12, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0a, 0x3e, 0x59, \n\t0xb2, 0x2f, 0x2d, 0x01, 0x71, 0xb2, 0x1f, 0x2d, 0x01, 0x5d, 0xb2, 0x40, \n\t0x2d, 0x01, 0x5d, 0xb0, 0x2d, 0x10, 0xb1, 0x1b, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x03, 0x1b, 0x2d, 0x11, 0x12, \n\t0x39, 0xb2, 0x0f, 0x2d, 0x1b, 0x11, 0x12, 0x39, 0xb0, 0x09, 0x10, 0xb1, \n\t0x21, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x15, 0x10, 0xb1, 0x27, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0x30, 0x31, 0x01, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, 0x14, \n\t0x04, 0x23, 0x22, 0x24, 0x35, 0x34, 0x36, 0x37, 0x26, 0x26, 0x35, 0x34, \n\t0x36, 0x33, 0x32, 0x16, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, \n\t0x16, 0x33, 0x32, 0x36, 0x03, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, \n\t0x16, 0x33, 0x32, 0x36, 0x03, 0xe6, 0x69, 0x5a, 0x69, 0x7d, 0xfe, 0xf5, \n\t0xcb, 0xd1, 0xfe, 0xea, 0x80, 0x6e, 0x5f, 0x6c, 0xff, 0xc4, 0xbd, 0xf7, \n\t0xfe, 0xfe, 0x68, 0x4a, 0x51, 0x70, 0x70, 0x52, 0x4a, 0x67, 0x22, 0x54, \n\t0x3c, 0x43, 0x5c, 0x5d, 0x43, 0x3c, 0x53, 0x03, 0x5c, 0x55, 0x84, 0x27, \n\t0x28, 0x90, 0x5c, 0xa2, 0xb7, 0xb7, 0xa2, 0x5c, 0x90, 0x28, 0x27, 0x84, \n\t0x55, 0x99, 0xa8, 0xa8, 0xfd, 0x66, 0x3f, 0x51, 0x51, 0x3f, 0x3f, 0x4f, \n\t0x4f, 0x02, 0x2c, 0x35, 0x41, 0x41, 0x35, 0x37, 0x46, 0x46, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x30, 0x00, 0x00, 0x03, 0x64, 0x04, 0x8d, 0x00, 0x0c, \n\t0x00, 0x2f, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, \n\t0x0b, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, \n\t0xb1, 0x04, 0x0a, 0x3e, 0x59, 0xb0, 0x0b, 0x10, 0xb1, 0x09, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0xd0, 0x30, \n\t0x31, 0x01, 0x06, 0x02, 0x15, 0x15, 0x21, 0x35, 0x34, 0x12, 0x37, 0x21, \n\t0x35, 0x21, 0x03, 0x64, 0xab, 0x90, 0xfe, 0xdc, 0xdb, 0x7c, 0xfd, 0xd4, \n\t0x03, 0x34, 0x03, 0xae, 0xdb, 0xfe, 0xe2, 0xfc, 0xb9, 0xb9, 0xf9, 0x01, \n\t0x84, 0x78, 0xdf, 0x00, 0x00, 0x01, 0x00, 0x42, 0x00, 0x00, 0x02, 0x99, \n\t0x03, 0x21, 0x00, 0x0c, 0x00, 0x2f, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x14, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0a, 0x3e, 0x59, 0xb0, 0x0b, 0x10, \n\t0xb1, 0x09, 0x06, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x00, 0xd0, 0x30, 0x31, 0x01, 0x06, 0x06, 0x15, 0x15, 0x23, 0x35, \n\t0x34, 0x12, 0x37, 0x21, 0x35, 0x21, 0x02, 0x99, 0x7f, 0x69, 0xd2, 0x9c, \n\t0x57, 0xfe, 0x70, 0x02, 0x57, 0x02, 0x85, 0x98, 0xc0, 0xae, 0x7f, 0x7f, \n\t0xad, 0x01, 0x0b, 0x4e, 0x9c, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6a, \n\t0x04, 0x8a, 0x03, 0x1e, 0x05, 0xb0, 0x02, 0x06, 0x01, 0x54, 0x00, 0x00, \n\t0xff, 0xff, 0xff, 0xdf, 0x00, 0x00, 0x04, 0x53, 0x04, 0x8d, 0x02, 0x26, \n\t0x03, 0x50, 0x00, 0x00, 0x01, 0x07, 0x03, 0x46, 0xff, 0x43, 0xff, 0x72, \n\t0x00, 0x2b, 0x00, 0xb4, 0xcf, 0x16, 0xdf, 0x16, 0x02, 0x71, 0xb4, 0xbf, \n\t0x16, 0xcf, 0x16, 0x02, 0x72, 0xb4, 0x1f, 0x16, 0x2f, 0x16, 0x02, 0x5d, \n\t0xb2, 0x2f, 0x16, 0x01, 0x72, 0xb4, 0x2f, 0x16, 0x3f, 0x16, 0x02, 0x71, \n\t0xb4, 0xdf, 0x16, 0xef, 0x16, 0x02, 0x5d, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0xff, 0xdf, 0x00, 0x00, 0x04, 0x53, 0x04, 0x8d, 0x02, 0x26, \n\t0x03, 0x50, 0x00, 0x00, 0x01, 0x07, 0x03, 0x46, 0xff, 0x43, 0xff, 0x72, \n\t0x00, 0x2b, 0x00, 0xb4, 0xcf, 0x16, 0xdf, 0x16, 0x02, 0x71, 0xb4, 0xbf, \n\t0x16, 0xcf, 0x16, 0x02, 0x72, 0xb4, 0x1f, 0x16, 0x2f, 0x16, 0x02, 0x5d, \n\t0xb2, 0x2f, 0x16, 0x01, 0x72, 0xb4, 0x2f, 0x16, 0x3f, 0x16, 0x02, 0x71, \n\t0xb4, 0xdf, 0x16, 0xef, 0x16, 0x02, 0x5d, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x30, 0x00, 0x00, 0x04, 0x04, 0x04, 0x8d, 0x02, 0x26, \n\t0x03, 0x3f, 0x00, 0x00, 0x01, 0x06, 0x03, 0x46, 0x2f, 0xc6, 0x00, 0x0d, \n\t0x00, 0xb2, 0x00, 0x09, 0x01, 0x5d, 0xb2, 0x70, 0x0a, 0x01, 0x5d, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0f, 0x00, 0x00, 0x04, 0xd1, \n\t0x05, 0xe4, 0x02, 0x26, 0x03, 0x55, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, \n\t0x00, 0xb5, 0x00, 0x1e, 0x00, 0x09, 0x00, 0xb3, 0x0d, 0x07, 0x04, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x0f, 0x00, 0x00, 0x04, 0xd1, \n\t0x05, 0xdf, 0x02, 0x26, 0x03, 0x55, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, \n\t0x01, 0x6a, 0x00, 0x19, 0x00, 0x09, 0x00, 0xb3, 0x10, 0x07, 0x04, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x0f, 0x00, 0x00, 0x04, 0xd1, \n\t0x05, 0xff, 0x02, 0x26, 0x03, 0x55, 0x00, 0x00, 0x01, 0x06, 0x01, 0x52, \n\t0x73, 0x11, 0x00, 0x09, 0x00, 0xb3, 0x10, 0x07, 0x04, 0x04, 0x2b, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0f, 0x00, 0x00, 0x04, 0xd1, \n\t0x06, 0x2a, 0x02, 0x26, 0x03, 0x55, 0x00, 0x00, 0x01, 0x06, 0x01, 0x58, \n\t0x7c, 0x31, 0x00, 0x09, 0x00, 0xb3, 0x0f, 0x08, 0x04, 0x04, 0x2b, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0f, 0x00, 0x00, 0x04, 0xd1, \n\t0x05, 0xca, 0x02, 0x26, 0x03, 0x55, 0x00, 0x00, 0x01, 0x06, 0x00, 0x6a, \n\t0x4f, 0x1a, 0x00, 0x0f, 0x00, 0xb3, 0x10, 0x07, 0x04, 0x04, 0x2b, 0xb0, \n\t0x10, 0x10, 0xb0, 0x0d, 0xd0, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x0f, \n\t0x00, 0x00, 0x04, 0xd1, 0x06, 0x4c, 0x02, 0x26, 0x03, 0x55, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x56, 0x01, 0x15, 0x00, 0x76, 0x00, 0x0f, 0x00, 0xb3, \n\t0x15, 0x07, 0x04, 0x04, 0x2b, 0xb0, 0x15, 0x10, 0xb0, 0x1b, 0xd0, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0f, 0x00, 0x00, 0x04, 0xd1, \n\t0x07, 0x19, 0x02, 0x26, 0x03, 0x55, 0x00, 0x00, 0x01, 0x07, 0x03, 0x71, \n\t0x01, 0x10, 0x00, 0x53, 0x00, 0x15, 0x00, 0xb3, 0x1b, 0x07, 0x04, 0x04, \n\t0x2b, 0xb0, 0x1b, 0x10, 0xb0, 0x0f, 0xd0, 0xb0, 0x1b, 0x10, 0xb0, 0x21, \n\t0xd0, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x5f, 0xfe, 0x35, 0x04, 0x3a, \n\t0x04, 0x9d, 0x02, 0x26, 0x03, 0x51, 0x00, 0x00, 0x00, 0x07, 0x00, 0x7a, \n\t0x01, 0x56, 0x00, 0x00, 0xff, 0xff, 0x00, 0x81, 0x00, 0x00, 0x03, 0xd5, \n\t0x05, 0xe4, 0x02, 0x26, 0x03, 0x4f, 0x00, 0x00, 0x01, 0x06, 0x00, 0x43, \n\t0x6a, 0x1e, 0x00, 0x09, 0x00, 0xb3, 0x0d, 0x07, 0x06, 0x04, 0x2b, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x81, 0x00, 0x00, 0x03, 0xd5, \n\t0x05, 0xdf, 0x02, 0x26, 0x03, 0x4f, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, \n\t0x01, 0x1f, 0x00, 0x19, 0x00, 0x09, 0x00, 0xb3, 0x10, 0x07, 0x06, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x81, 0x00, 0x00, 0x03, 0xd5, \n\t0x05, 0xff, 0x02, 0x26, 0x03, 0x4f, 0x00, 0x00, 0x01, 0x06, 0x01, 0x52, \n\t0x28, 0x11, 0x00, 0x09, 0x00, 0xb3, 0x10, 0x07, 0x06, 0x04, 0x2b, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x81, 0x00, 0x00, 0x03, 0xd5, \n\t0x05, 0xca, 0x02, 0x26, 0x03, 0x4f, 0x00, 0x00, 0x01, 0x06, 0x00, 0x6a, \n\t0x04, 0x1a, 0x00, 0x0f, 0x00, 0xb3, 0x11, 0x07, 0x06, 0x04, 0x2b, 0xb0, \n\t0x11, 0x10, 0xb0, 0x0d, 0xd0, 0x30, 0x31, 0x00, 0xff, 0xff, 0xff, 0xad, \n\t0x00, 0x00, 0x01, 0xa9, 0x05, 0xe4, 0x02, 0x26, 0x03, 0x4b, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x43, 0xff, 0x60, 0x00, 0x1e, 0x00, 0x09, 0x00, 0xb3, \n\t0x05, 0x07, 0x02, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x7f, \n\t0x00, 0x00, 0x02, 0x7d, 0x05, 0xdf, 0x02, 0x26, 0x03, 0x4b, 0x00, 0x00, \n\t0x01, 0x06, 0x00, 0x76, 0x13, 0x19, 0x00, 0x09, 0x00, 0xb3, 0x08, 0x07, \n\t0x02, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xa7, \n\t0x00, 0x00, 0x02, 0x89, 0x05, 0xff, 0x02, 0x26, 0x03, 0x4b, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x52, 0xff, 0x1e, 0x00, 0x11, 0x00, 0x09, 0x00, 0xb3, \n\t0x08, 0x07, 0x02, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0xff, 0x96, \n\t0x00, 0x00, 0x02, 0x94, 0x05, 0xca, 0x02, 0x26, 0x03, 0x4b, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x6a, 0xfe, 0xfa, 0x00, 0x1a, 0x00, 0x0f, 0x00, 0xb3, \n\t0x08, 0x07, 0x02, 0x04, 0x2b, 0xb0, 0x08, 0x10, 0xb0, 0x05, 0xd0, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x81, 0x00, 0x00, 0x04, 0x95, \n\t0x06, 0x2a, 0x02, 0x26, 0x03, 0x45, 0x00, 0x00, 0x01, 0x07, 0x01, 0x58, \n\t0x00, 0x8d, 0x00, 0x31, 0x00, 0x09, 0x00, 0xb3, 0x0f, 0x08, 0x06, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x5b, 0xff, 0xed, 0x04, 0x6c, \n\t0x05, 0xe4, 0x02, 0x26, 0x03, 0x44, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, \n\t0x00, 0xa1, 0x00, 0x1e, 0x00, 0x09, 0x00, 0xb3, 0x1d, 0x07, 0x0a, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x5b, 0xff, 0xed, 0x04, 0x6c, \n\t0x05, 0xf2, 0x02, 0x26, 0x03, 0x44, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, \n\t0x01, 0x56, 0x00, 0x2c, 0x00, 0x09, 0x00, 0xb3, 0x20, 0x07, 0x0a, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x5b, 0xff, 0xed, 0x04, 0x6c, \n\t0x06, 0x12, 0x02, 0x26, 0x03, 0x44, 0x00, 0x00, 0x01, 0x06, 0x01, 0x52, \n\t0x5f, 0x24, 0x00, 0x09, 0x00, 0xb3, 0x20, 0x07, 0x0a, 0x04, 0x2b, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5b, 0xff, 0xed, 0x04, 0x6c, \n\t0x06, 0x3d, 0x02, 0x26, 0x03, 0x44, 0x00, 0x00, 0x01, 0x06, 0x01, 0x58, \n\t0x68, 0x44, 0x00, 0x09, 0x00, 0xb3, 0x1f, 0x08, 0x0a, 0x04, 0x2b, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5b, 0xff, 0xed, 0x04, 0x6c, \n\t0x05, 0xdd, 0x02, 0x26, 0x03, 0x44, 0x00, 0x00, 0x01, 0x06, 0x00, 0x6a, \n\t0x3b, 0x2d, 0x00, 0x0f, 0x00, 0xb3, 0x20, 0x07, 0x0a, 0x04, 0x2b, 0xb0, \n\t0x20, 0x10, 0xb0, 0x1d, 0xd0, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x71, \n\t0xff, 0xed, 0x04, 0x84, 0x05, 0xe4, 0x02, 0x26, 0x03, 0x3e, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x43, 0x00, 0xb8, 0x00, 0x1e, 0x00, 0x09, 0x00, 0xb3, \n\t0x13, 0x07, 0x08, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x71, \n\t0xff, 0xed, 0x04, 0x84, 0x05, 0xe2, 0x02, 0x26, 0x03, 0x3e, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x76, 0x01, 0x6d, 0x00, 0x1c, 0x00, 0x09, 0x00, 0xb3, \n\t0x16, 0x07, 0x08, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x71, \n\t0xff, 0xed, 0x04, 0x84, 0x06, 0x02, 0x02, 0x26, 0x03, 0x3e, 0x00, 0x00, \n\t0x01, 0x06, 0x01, 0x52, 0x76, 0x14, 0x00, 0x09, 0x00, 0xb3, 0x16, 0x07, \n\t0x08, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x71, \n\t0xff, 0xed, 0x04, 0x84, 0x05, 0xcd, 0x02, 0x26, 0x03, 0x3e, 0x00, 0x00, \n\t0x01, 0x06, 0x00, 0x6a, 0x52, 0x1d, 0x00, 0x0f, 0x00, 0xb3, 0x16, 0x07, \n\t0x08, 0x04, 0x2b, 0xb0, 0x16, 0x10, 0xb0, 0x13, 0xd0, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x07, 0x00, 0x00, 0x04, 0x45, 0x05, 0xdf, 0x02, 0x26, \n\t0x03, 0x3a, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, 0x01, 0x29, 0x00, 0x19, \n\t0x00, 0x09, 0x00, 0xb3, 0x0e, 0x07, 0x08, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x0f, 0x00, 0x00, 0x04, 0xd1, 0x05, 0xb1, 0x02, 0x26, \n\t0x03, 0x55, 0x00, 0x00, 0x01, 0x06, 0x00, 0x71, 0x6a, 0x00, 0x00, 0x09, \n\t0x00, 0xb3, 0x0d, 0x08, 0x04, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x0f, 0x00, 0x00, 0x04, 0xd1, 0x06, 0x25, 0x02, 0x26, \n\t0x03, 0x55, 0x00, 0x00, 0x01, 0x07, 0x01, 0x54, 0x00, 0xa6, 0x00, 0x75, \n\t0x00, 0x09, 0x00, 0xb3, 0x10, 0x07, 0x04, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x0f, 0xfe, 0x58, 0x04, 0xea, 0x04, 0x8d, 0x02, 0x26, \n\t0x03, 0x55, 0x00, 0x00, 0x00, 0x07, 0x01, 0x57, 0x02, 0xe6, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x5f, 0xff, 0xef, 0x04, 0x3a, 0x05, 0xef, 0x02, 0x26, \n\t0x03, 0x51, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, 0x01, 0x4b, 0x00, 0x29, \n\t0x00, 0x09, 0x00, 0xb3, 0x22, 0x07, 0x0b, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x5f, 0xff, 0xef, 0x04, 0x3a, 0x06, 0x0f, 0x02, 0x26, \n\t0x03, 0x51, 0x00, 0x00, 0x01, 0x06, 0x01, 0x52, 0x54, 0x21, 0x00, 0x09, \n\t0x00, 0xb3, 0x22, 0x07, 0x0b, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x5f, 0xff, 0xef, 0x04, 0x3a, 0x05, 0xff, 0x02, 0x26, \n\t0x03, 0x51, 0x00, 0x00, 0x01, 0x07, 0x01, 0x55, 0x01, 0x1e, 0x00, 0x43, \n\t0x00, 0x09, 0x00, 0xb3, 0x1f, 0x07, 0x0b, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x5f, 0xff, 0xef, 0x04, 0x3a, 0x06, 0x1e, 0x02, 0x26, \n\t0x03, 0x51, 0x00, 0x00, 0x01, 0x06, 0x01, 0x53, 0x6b, 0x2a, 0x00, 0x09, \n\t0x00, 0xb3, 0x23, 0x07, 0x0b, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x81, 0x00, 0x00, 0x04, 0x53, 0x06, 0x0e, 0x02, 0x26, \n\t0x03, 0x50, 0x00, 0x00, 0x01, 0x06, 0x01, 0x53, 0x1e, 0x1a, 0x00, 0x09, \n\t0x00, 0xb3, 0x19, 0x07, 0x01, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x81, 0x00, 0x00, 0x03, 0xd5, 0x05, 0xb1, 0x02, 0x26, \n\t0x03, 0x4f, 0x00, 0x00, 0x01, 0x06, 0x00, 0x71, 0x1f, 0x00, 0x00, 0x09, \n\t0x00, 0xb3, 0x0d, 0x08, 0x06, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x81, 0x00, 0x00, 0x03, 0xd5, 0x06, 0x25, 0x02, 0x26, \n\t0x03, 0x4f, 0x00, 0x00, 0x01, 0x06, 0x01, 0x54, 0x5b, 0x75, 0x00, 0x09, \n\t0x00, 0xb3, 0x10, 0x07, 0x06, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x81, 0x00, 0x00, 0x03, 0xd5, 0x05, 0xef, 0x02, 0x26, \n\t0x03, 0x4f, 0x00, 0x00, 0x01, 0x07, 0x01, 0x55, 0x00, 0xf2, 0x00, 0x33, \n\t0x00, 0x09, 0x00, 0xb3, 0x0d, 0x07, 0x06, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x81, 0xfe, 0x58, 0x03, 0xd5, 0x04, 0x8d, 0x02, 0x26, \n\t0x03, 0x4f, 0x00, 0x00, 0x00, 0x07, 0x01, 0x57, 0x00, 0xf7, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x81, 0x00, 0x00, 0x03, 0xd5, 0x06, 0x0e, 0x02, 0x26, \n\t0x03, 0x4f, 0x00, 0x00, 0x01, 0x06, 0x01, 0x53, 0x3f, 0x1a, 0x00, 0x09, \n\t0x00, 0xb3, 0x11, 0x07, 0x06, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x5f, 0xff, 0xef, 0x04, 0x74, 0x06, 0x0f, 0x02, 0x26, \n\t0x03, 0x4d, 0x00, 0x00, 0x01, 0x06, 0x01, 0x52, 0x69, 0x21, 0x00, 0x09, \n\t0x00, 0xb3, 0x25, 0x07, 0x0a, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x5f, 0xff, 0xef, 0x04, 0x74, 0x06, 0x35, 0x02, 0x26, \n\t0x03, 0x4d, 0x00, 0x00, 0x01, 0x07, 0x01, 0x54, 0x00, 0x9c, 0x00, 0x85, \n\t0x00, 0x09, 0x00, 0xb3, 0x25, 0x07, 0x0a, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x5f, 0xff, 0xef, 0x04, 0x74, 0x05, 0xff, 0x02, 0x26, \n\t0x03, 0x4d, 0x00, 0x00, 0x01, 0x07, 0x01, 0x55, 0x01, 0x33, 0x00, 0x43, \n\t0x00, 0x09, 0x00, 0xb3, 0x22, 0x07, 0x0a, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x5f, 0xfe, 0x0c, 0x04, 0x74, 0x04, 0x9d, 0x02, 0x26, \n\t0x03, 0x4d, 0x00, 0x00, 0x01, 0x07, 0x03, 0x27, 0x01, 0x8f, 0xfe, 0x88, \n\t0x00, 0x0f, 0x00, 0xb4, 0x30, 0x25, 0x40, 0x25, 0x02, 0x5d, 0xb2, 0xa0, \n\t0x25, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x81, \n\t0x00, 0x00, 0x04, 0x9c, 0x05, 0xff, 0x02, 0x26, 0x03, 0x4c, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x52, 0x00, 0x87, 0x00, 0x11, 0x00, 0x09, 0x00, 0xb3, \n\t0x10, 0x07, 0x06, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0xff, 0x9e, \n\t0x00, 0x00, 0x02, 0x8b, 0x06, 0x2a, 0x02, 0x26, 0x03, 0x4b, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x58, 0xff, 0x27, 0x00, 0x31, 0x00, 0x09, 0x00, 0xb3, \n\t0x07, 0x08, 0x02, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x71, \n\t0xff, 0xed, 0x04, 0x9b, 0x06, 0x0b, 0x02, 0x26, 0x03, 0x3e, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x59, 0x00, 0xab, 0x00, 0x1d, 0x00, 0x0f, 0x00, 0xb3, \n\t0x1c, 0x07, 0x08, 0x04, 0x2b, 0xb0, 0x1c, 0x10, 0xb0, 0x15, 0xd0, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xbb, 0x00, 0x00, 0x02, 0x6f, \n\t0x06, 0x25, 0x02, 0x26, 0x03, 0x4b, 0x00, 0x00, 0x01, 0x07, 0x01, 0x54, \n\t0xff, 0x51, 0x00, 0x75, 0x00, 0x09, 0x00, 0xb3, 0x08, 0x07, 0x02, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x3d, 0xfe, 0x58, 0x01, 0xee, \n\t0x04, 0x8d, 0x02, 0x26, 0x03, 0x4b, 0x00, 0x00, 0x00, 0x06, 0x01, 0x57, \n\t0xea, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7a, 0x00, 0x00, 0x01, 0xaa, \n\t0x05, 0xef, 0x02, 0x26, 0x03, 0x4b, 0x00, 0x00, 0x01, 0x06, 0x01, 0x55, \n\t0xe8, 0x33, 0x00, 0x09, 0x00, 0xb3, 0x05, 0x07, 0x02, 0x04, 0x2b, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1c, 0xff, 0xed, 0x04, 0x7d, \n\t0x05, 0xff, 0x02, 0x26, 0x03, 0x4a, 0x00, 0x00, 0x01, 0x07, 0x01, 0x52, \n\t0x01, 0x12, 0x00, 0x11, 0x00, 0x09, 0x00, 0xb3, 0x15, 0x07, 0x00, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x81, 0xfe, 0x15, 0x04, 0x76, \n\t0x04, 0x8d, 0x02, 0x26, 0x03, 0x49, 0x00, 0x00, 0x01, 0x07, 0x03, 0x27, \n\t0x01, 0x46, 0xfe, 0x91, 0x00, 0x0f, 0x00, 0xb4, 0x30, 0x12, 0x40, 0x12, \n\t0x02, 0x5d, 0xb2, 0xa0, 0x12, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x50, 0x00, 0x00, 0x03, 0x88, 0x05, 0xcd, 0x02, 0x26, \n\t0x03, 0x48, 0x00, 0x00, 0x01, 0x06, 0x00, 0x76, 0xe4, 0x07, 0x00, 0x09, \n\t0x00, 0xb3, 0x0a, 0x07, 0x04, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x81, 0xfe, 0x16, 0x03, 0x88, 0x04, 0x8d, 0x02, 0x26, \n\t0x03, 0x48, 0x00, 0x00, 0x01, 0x07, 0x03, 0x27, 0x01, 0x0b, 0xfe, 0x92, \n\t0x00, 0x11, 0x00, 0xb6, 0x30, 0x0b, 0x40, 0x0b, 0x50, 0x0b, 0x03, 0x5d, \n\t0xb2, 0xa0, 0x0b, 0x01, 0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x81, \n\t0x00, 0x00, 0x03, 0x88, 0x04, 0x8e, 0x02, 0x26, 0x03, 0x48, 0x00, 0x00, \n\t0x01, 0x07, 0x03, 0x27, 0x01, 0xdd, 0x03, 0x7e, 0x00, 0x10, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x12, 0x3e, 0x59, \n\t0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x81, 0x00, 0x00, 0x03, 0x88, \n\t0x04, 0x8d, 0x02, 0x26, 0x03, 0x48, 0x00, 0x00, 0x01, 0x07, 0x01, 0x55, \n\t0x01, 0x69, 0xfd, 0x37, 0x00, 0x06, 0x00, 0xb0, 0x08, 0x2f, 0x30, 0x31, \n\t0xff, 0xff, 0x00, 0x81, 0x00, 0x00, 0x04, 0x95, 0x05, 0xdf, 0x02, 0x26, \n\t0x03, 0x45, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, 0x01, 0x7b, 0x00, 0x19, \n\t0x00, 0x09, 0x00, 0xb3, 0x10, 0x07, 0x06, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x81, 0xfe, 0x16, 0x04, 0x95, 0x04, 0x8d, 0x02, 0x26, \n\t0x03, 0x45, 0x00, 0x00, 0x01, 0x07, 0x03, 0x27, 0x01, 0x9b, 0xfe, 0x92, \n\t0x00, 0x11, 0x00, 0xb6, 0x30, 0x10, 0x40, 0x10, 0x50, 0x10, 0x03, 0x5d, \n\t0xb2, 0xa0, 0x10, 0x01, 0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x81, \n\t0x00, 0x00, 0x04, 0x95, 0x06, 0x0e, 0x02, 0x26, 0x03, 0x45, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x53, 0x00, 0x9b, 0x00, 0x1a, 0x00, 0x09, 0x00, 0xb3, \n\t0x11, 0x07, 0x06, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x5b, \n\t0xff, 0xed, 0x04, 0x6c, 0x05, 0xc2, 0x02, 0x26, 0x03, 0x44, 0x00, 0x00, \n\t0x01, 0x06, 0x00, 0x71, 0x56, 0x11, 0x00, 0x09, 0x00, 0xb3, 0x1d, 0x08, \n\t0x0a, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5b, \n\t0xff, 0xed, 0x04, 0x6c, 0x06, 0x38, 0x02, 0x26, 0x03, 0x44, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x54, 0x00, 0x92, 0x00, 0x88, 0x00, 0x09, 0x00, 0xb3, \n\t0x20, 0x07, 0x0a, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x5b, \n\t0xff, 0xed, 0x04, 0x84, 0x06, 0x1b, 0x02, 0x26, 0x03, 0x44, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x59, 0x00, 0x94, 0x00, 0x2d, 0x00, 0x0f, 0x00, 0xb3, \n\t0x26, 0x07, 0x0a, 0x04, 0x2b, 0xb0, 0x26, 0x10, 0xb0, 0x1f, 0xd0, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x81, 0x00, 0x00, 0x04, 0x4d, \n\t0x05, 0xdf, 0x02, 0x26, 0x03, 0x41, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, \n\t0x01, 0x1e, 0x00, 0x19, 0x00, 0x09, 0x00, 0xb3, 0x28, 0x07, 0x03, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x81, 0xfe, 0x16, 0x04, 0x4d, \n\t0x04, 0x8d, 0x02, 0x26, 0x03, 0x41, 0x00, 0x00, 0x01, 0x07, 0x03, 0x27, \n\t0x01, 0x3e, 0xfe, 0x92, 0x00, 0x11, 0x00, 0xb6, 0x30, 0x29, 0x40, 0x29, \n\t0x50, 0x29, 0x03, 0x5d, 0xb2, 0xa0, 0x29, 0x01, 0x5d, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x81, 0x00, 0x00, 0x04, 0x4d, 0x06, 0x0e, 0x02, 0x26, \n\t0x03, 0x41, 0x00, 0x00, 0x01, 0x06, 0x01, 0x53, 0x3e, 0x1a, 0x00, 0x09, \n\t0x00, 0xb3, 0x29, 0x07, 0x03, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x43, 0xff, 0xed, 0x04, 0x21, 0x05, 0xf2, 0x02, 0x26, \n\t0x03, 0x40, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, 0x01, 0x28, 0x00, 0x2c, \n\t0x00, 0x09, 0x00, 0xb3, 0x2c, 0x07, 0x09, 0x04, 0x2b, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x43, 0xff, 0xed, 0x04, 0x21, 0x06, 0x12, 0x02, 0x26, \n\t0x03, 0x40, 0x00, 0x00, 0x01, 0x06, 0x01, 0x52, 0x31, 0x24, 0x00, 0x09, \n\t0x00, 0xb3, 0x2c, 0x07, 0x09, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x43, 0xfe, 0x30, 0x04, 0x21, 0x04, 0x9d, 0x02, 0x26, \n\t0x03, 0x40, 0x00, 0x00, 0x00, 0x07, 0x00, 0x7a, 0x01, 0x3e, 0xff, 0xfb, \n\t0xff, 0xff, 0x00, 0x43, 0xff, 0xed, 0x04, 0x21, 0x06, 0x21, 0x02, 0x26, \n\t0x03, 0x40, 0x00, 0x00, 0x01, 0x06, 0x01, 0x53, 0x48, 0x2d, 0x00, 0x09, \n\t0x00, 0xb3, 0x2d, 0x07, 0x09, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x30, 0xfe, 0x16, 0x04, 0x04, 0x04, 0x8d, 0x02, 0x26, \n\t0x03, 0x3f, 0x00, 0x00, 0x01, 0x07, 0x03, 0x27, 0x01, 0x35, 0xfe, 0x92, \n\t0x00, 0x11, 0x00, 0xb6, 0x30, 0x0d, 0x40, 0x0d, 0x50, 0x0d, 0x03, 0x5d, \n\t0xb2, 0xa0, 0x0d, 0x01, 0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x30, \n\t0x00, 0x00, 0x04, 0x04, 0x06, 0x0e, 0x02, 0x26, 0x03, 0x3f, 0x00, 0x00, \n\t0x01, 0x06, 0x01, 0x53, 0x35, 0x1a, 0x00, 0x09, 0x00, 0xb3, 0x0d, 0x07, \n\t0x06, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x71, \n\t0xff, 0xed, 0x04, 0x84, 0x06, 0x2d, 0x02, 0x26, 0x03, 0x3e, 0x00, 0x00, \n\t0x01, 0x06, 0x01, 0x58, 0x7f, 0x34, 0x00, 0x09, 0x00, 0xb3, 0x15, 0x08, \n\t0x08, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x71, \n\t0xff, 0xed, 0x04, 0x84, 0x05, 0xb2, 0x02, 0x26, 0x03, 0x3e, 0x00, 0x00, \n\t0x01, 0x06, 0x00, 0x71, 0x6d, 0x01, 0x00, 0x09, 0x00, 0xb3, 0x13, 0x08, \n\t0x08, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x71, \n\t0xff, 0xed, 0x04, 0x84, 0x06, 0x28, 0x02, 0x26, 0x03, 0x3e, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x54, 0x00, 0xa9, 0x00, 0x78, 0x00, 0x09, 0x00, 0xb3, \n\t0x16, 0x07, 0x08, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x71, \n\t0xff, 0xed, 0x04, 0x84, 0x06, 0x4f, 0x02, 0x26, 0x03, 0x3e, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x56, 0x01, 0x18, 0x00, 0x79, 0x00, 0x0f, 0x00, 0xb3, \n\t0x1b, 0x07, 0x08, 0x04, 0x2b, 0xb0, 0x1b, 0x10, 0xb0, 0x21, 0xd0, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x43, 0xff, 0xed, 0x08, 0x90, \n\t0x04, 0x9d, 0x00, 0x26, 0x03, 0x40, 0x00, 0x00, 0x00, 0x07, 0x03, 0x40, \n\t0x04, 0x6f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x44, 0x00, 0x00, 0x04, 0x01, \n\t0x06, 0x0f, 0x02, 0x26, 0x03, 0x39, 0x00, 0x00, 0x01, 0x06, 0x01, 0x53, \n\t0x4f, 0x1b, 0x00, 0x09, 0x00, 0xb3, 0x0f, 0x07, 0x07, 0x04, 0x2b, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x44, 0x00, 0x00, 0x04, 0x01, \n\t0x05, 0xf0, 0x02, 0x26, 0x03, 0x39, 0x00, 0x00, 0x01, 0x07, 0x01, 0x55, \n\t0x01, 0x02, 0x00, 0x34, 0x00, 0x09, 0x00, 0xb3, 0x0b, 0x07, 0x07, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x44, 0x00, 0x00, 0x04, 0x01, \n\t0x05, 0xe0, 0x02, 0x26, 0x03, 0x39, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, \n\t0x01, 0x2f, 0x00, 0x1a, 0x00, 0x09, 0x00, 0xb3, 0x0e, 0x07, 0x07, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x07, 0x00, 0x00, 0x04, 0x45, \n\t0x05, 0xca, 0x02, 0x26, 0x03, 0x3a, 0x00, 0x00, 0x01, 0x06, 0x00, 0x6a, \n\t0x0e, 0x1a, 0x00, 0x0f, 0x00, 0xb3, 0x0f, 0x07, 0x08, 0x04, 0x2b, 0xb0, \n\t0x0f, 0x10, 0xb0, 0x0b, 0xd0, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x07, \n\t0x00, 0x00, 0x04, 0x45, 0x05, 0xff, 0x02, 0x26, 0x03, 0x3a, 0x00, 0x00, \n\t0x01, 0x06, 0x01, 0x52, 0x32, 0x11, 0x00, 0x09, 0x00, 0xb3, 0x0f, 0x07, \n\t0x08, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x28, \n\t0x00, 0x00, 0x05, 0xf1, 0x05, 0xff, 0x02, 0x26, 0x03, 0x3c, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x52, 0x01, 0x12, 0x00, 0x11, 0x00, 0x09, 0x00, 0xb3, \n\t0x15, 0x07, 0x0a, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x71, \n\t0xfe, 0x58, 0x04, 0x84, 0x04, 0x8d, 0x02, 0x26, 0x03, 0x3e, 0x00, 0x00, \n\t0x00, 0x07, 0x01, 0x57, 0x01, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1e, \n\t0xff, 0xf1, 0x05, 0xc2, 0x05, 0xb0, 0x00, 0x1c, 0x00, 0x67, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x1c, 0x2f, 0x1b, 0xb1, 0x1c, 0x10, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x17, 0x2f, 0x1b, 0xb1, 0x17, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x1c, 0x10, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x05, 0x17, 0x1c, 0x11, 0x12, 0x39, \n\t0xb0, 0x05, 0x2f, 0xb0, 0x0b, 0x10, 0xb1, 0x0d, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x05, 0x10, 0xb1, 0x13, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, \n\t0xb0, 0x19, 0xd0, 0x30, 0x31, 0x01, 0x21, 0x11, 0x36, 0x36, 0x33, 0x32, \n\t0x04, 0x15, 0x14, 0x00, 0x25, 0x27, 0x27, 0x32, 0x36, 0x37, 0x34, 0x26, \n\t0x23, 0x22, 0x06, 0x07, 0x11, 0x21, 0x11, 0x21, 0x35, 0x21, 0x04, 0x8e, \n\t0xfe, 0x24, 0x45, 0x79, 0x38, 0xf8, 0x01, 0x22, 0xfe, 0xf8, 0xfe, 0xe7, \n\t0x05, 0x01, 0x99, 0x6a, 0x01, 0x82, 0x75, 0x43, 0x77, 0x3c, 0xfe, 0xdb, \n\t0xfe, 0x91, 0x04, 0x70, 0x04, 0xcf, 0xfe, 0x8d, 0x10, 0x12, 0xe9, 0xdc, \n\t0xc7, 0xfe, 0xff, 0x03, 0x02, 0xcd, 0x81, 0x68, 0x6b, 0x83, 0x0c, 0x0b, \n\t0xfd, 0x7d, 0x04, 0xcf, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x25, \n\t0x00, 0x00, 0x05, 0xba, 0x05, 0xb0, 0x00, 0x17, 0x00, 0x55, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x17, 0x2f, 0x1b, 0xb1, 0x17, 0x10, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x17, 0x10, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x05, 0x12, 0x17, 0x11, 0x12, 0x39, \n\t0xb0, 0x05, 0x2f, 0xb1, 0x0e, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb0, 0x14, 0xd0, 0x30, 0x31, 0x01, \n\t0x21, 0x11, 0x36, 0x36, 0x33, 0x20, 0x04, 0x15, 0x11, 0x21, 0x11, 0x34, \n\t0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x21, 0x11, 0x21, 0x35, 0x21, 0x04, \n\t0x7e, 0xfe, 0x29, 0x3b, 0x77, 0x30, 0x01, 0x0b, 0x01, 0x26, 0xfe, 0xdd, \n\t0x81, 0x8d, 0x30, 0x7a, 0x38, 0xfe, 0xdb, 0xfe, 0xa3, 0x04, 0x59, 0x04, \n\t0xcf, 0xfe, 0xbd, 0x09, 0x0b, 0xea, 0xf2, 0xfe, 0x3c, 0x01, 0xc4, 0x8d, \n\t0x6e, 0x0b, 0x09, 0xfd, 0x55, 0x04, 0xcf, 0xe1, 0x00, 0x02, 0x00, 0x1b, \n\t0xfe, 0x9a, 0x05, 0xe0, 0x05, 0xb0, 0x00, 0x0e, 0x00, 0x15, 0x00, 0x4a, \n\t0x00, 0xb0, 0x04, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, \n\t0xb1, 0x0c, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, \n\t0x1b, 0xb1, 0x02, 0x0a, 0x3e, 0x59, 0xb0, 0x04, 0x10, 0xb0, 0x01, 0xd0, \n\t0xb0, 0x02, 0x10, 0xb1, 0x0d, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x13, 0xd0, 0xb0, 0x07, 0xd0, 0xb0, 0x0c, 0x10, \n\t0xb1, 0x14, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x01, 0x21, 0x11, 0x21, 0x11, 0x21, 0x03, 0x33, 0x36, 0x12, \n\t0x13, 0x13, 0x21, 0x11, 0x33, 0x01, 0x06, 0x02, 0x07, 0x21, 0x11, 0x21, \n\t0x05, 0xc4, 0xfe, 0xf8, 0xfc, 0x83, 0xfe, 0xf3, 0x17, 0x70, 0x4e, 0x75, \n\t0x0a, 0x28, 0x03, 0xb3, 0xad, 0xfc, 0x9c, 0x09, 0x56, 0x46, 0x02, 0x39, \n\t0xfe, 0x85, 0xfe, 0x9a, 0x01, 0x66, 0xfe, 0x9a, 0x02, 0x46, 0x43, 0x01, \n\t0x21, 0x01, 0x18, 0x02, 0x54, 0xfb, 0x30, 0x02, 0x7c, 0xdd, 0xfe, 0xca, \n\t0x69, 0x03, 0xef, 0x00, 0x00, 0x01, 0x00, 0x12, 0x00, 0x00, 0x07, 0xe9, \n\t0x05, 0xb0, 0x00, 0x15, 0x00, 0x83, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x16, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x10, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x10, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x15, 0x2f, 0x1b, 0xb1, 0x15, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x0c, 0x10, 0xb1, 0x04, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x01, 0xd0, 0xb2, 0x08, 0x0c, 0x04, \n\t0x11, 0x12, 0x39, 0xb0, 0x0c, 0x10, 0xb0, 0x0f, 0xd0, 0xb0, 0x08, 0x10, \n\t0xb0, 0x13, 0xd0, 0x30, 0x31, 0x01, 0x23, 0x11, 0x21, 0x11, 0x23, 0x01, \n\t0x21, 0x01, 0x01, 0x21, 0x01, 0x33, 0x11, 0x21, 0x11, 0x33, 0x01, 0x21, \n\t0x01, 0x01, 0x21, 0x05, 0x3f, 0xaa, 0xfe, 0xdd, 0xae, 0xfe, 0xba, 0xfe, \n\t0x94, 0x01, 0xca, 0xfe, 0x4e, 0x01, 0x69, 0x01, 0x48, 0x97, 0x01, 0x23, \n\t0x93, 0x01, 0x41, 0x01, 0x68, 0xfe, 0x55, 0x01, 0xc3, 0xfe, 0x95, 0x02, \n\t0x60, 0xfd, 0xa0, 0x02, 0x60, 0xfd, 0xa0, 0x03, 0x11, 0x02, 0x9f, 0xfd, \n\t0xad, 0x02, 0x53, 0xfd, 0xad, 0x02, 0x53, 0xfd, 0x63, 0xfc, 0xed, 0x00, \n\t0x00, 0x01, 0x00, 0x24, 0xff, 0xeb, 0x04, 0xee, 0x05, 0xb0, 0x00, 0x15, \n\t0x00, 0x4e, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x15, 0x2f, 0x1b, 0xb1, \n\t0x15, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, \n\t0xb1, 0x08, 0x0a, 0x3e, 0x59, 0xb2, 0x01, 0x08, 0x15, 0x11, 0x12, 0x39, \n\t0xb2, 0x34, 0x01, 0x01, 0x5d, 0xb6, 0x42, 0x01, 0x52, 0x01, 0x62, 0x01, \n\t0x03, 0x5d, 0xb0, 0x15, 0x10, 0xb0, 0x03, 0xd0, 0xb0, 0x08, 0x10, 0xb1, \n\t0x0f, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, \n\t0x13, 0x08, 0x15, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x17, 0x33, 0x01, \n\t0x21, 0x01, 0x06, 0x06, 0x23, 0x22, 0x26, 0x27, 0x27, 0x16, 0x16, 0x33, \n\t0x32, 0x36, 0x37, 0x37, 0x01, 0x21, 0x02, 0x89, 0x17, 0x06, 0x01, 0x13, \n\t0x01, 0x35, 0xfe, 0x0f, 0x40, 0xab, 0xa0, 0x19, 0x40, 0x10, 0x02, 0x0b, \n\t0x36, 0x0e, 0x50, 0x4f, 0x1a, 0x16, 0xfd, 0xff, 0x01, 0x3b, 0x03, 0x29, \n\t0x4d, 0x02, 0xd4, 0xfb, 0x64, 0x8f, 0x9a, 0x03, 0x02, 0xdf, 0x02, 0x02, \n\t0x46, 0x47, 0x37, 0x04, 0x21, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x49, \n\t0xff, 0xc4, 0x06, 0x48, 0x05, 0xec, 0x00, 0x15, 0x00, 0x1e, 0x00, 0x27, \n\t0x00, 0x56, 0x00, 0xb0, 0x0a, 0x2f, 0xb0, 0x14, 0x2f, 0xb2, 0x00, 0x14, \n\t0x0a, 0x11, 0x12, 0x39, 0xb0, 0x00, 0x2f, 0xb2, 0x0c, 0x0a, 0x14, 0x11, \n\t0x12, 0x39, 0xb0, 0x0c, 0x2f, 0xb0, 0x07, 0xd0, 0xb0, 0x07, 0x2f, 0xb0, \n\t0x00, 0x10, 0xb0, 0x12, 0xd0, 0xb0, 0x12, 0x2f, 0xb1, 0x16, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x07, 0x10, 0xb1, \n\t0x21, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x1c, 0xd0, 0xb0, 0x1c, 0x2f, 0xb0, 0x16, 0x10, 0xb0, 0x1f, 0xd0, 0xb0, \n\t0x1f, 0x2f, 0x30, 0x31, 0x01, 0x33, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, \n\t0x23, 0x15, 0x21, 0x35, 0x23, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x33, \n\t0x35, 0x21, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x33, 0x11, 0x21, \n\t0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x03, 0xdc, 0x03, 0x01, \n\t0x11, 0x01, 0x58, 0xfe, 0xa7, 0xfe, 0xf0, 0x03, 0xfe, 0xdc, 0x06, 0xfe, \n\t0xee, 0xfe, 0xa9, 0x01, 0x58, 0x01, 0x11, 0x06, 0x01, 0x24, 0xfe, 0xd6, \n\t0x9a, 0xb0, 0xb0, 0x9a, 0x06, 0x01, 0x24, 0x05, 0x98, 0xb0, 0xaf, 0x99, \n\t0x05, 0x2d, 0xfe, 0xb4, 0xfe, 0xf0, 0xfe, 0xf4, 0xfe, 0xbb, 0xbc, 0xbc, \n\t0x01, 0x44, 0x01, 0x0b, 0x01, 0x10, 0x01, 0x4e, 0xbf, 0xfe, 0x51, 0xbf, \n\t0xaf, 0xaa, 0xb6, 0x02, 0xce, 0xfd, 0x32, 0xb9, 0xa9, 0xaf, 0xbd, 0x00, \n\t0x00, 0x01, 0x00, 0x85, 0x00, 0x00, 0x07, 0x24, 0x05, 0xb0, 0x00, 0x0b, \n\t0x00, 0x3b, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, \n\t0x00, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, \n\t0xb1, 0x0a, 0x0a, 0x3e, 0x59, 0xb1, 0x01, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb0, 0x03, 0xd0, 0xb0, \n\t0x01, 0x10, 0xb0, 0x05, 0xd0, 0xb0, 0x03, 0x10, 0xb0, 0x07, 0xd0, 0x30, \n\t0x31, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, \n\t0x11, 0x01, 0xa9, 0x01, 0x9c, 0x01, 0x23, 0x01, 0x98, 0x01, 0x24, 0xf9, \n\t0x61, 0x05, 0xb0, 0xfb, 0x30, 0x04, 0xd0, 0xfb, 0x30, 0x04, 0xd0, 0xfa, \n\t0x50, 0x05, 0xb0, 0x00, 0x00, 0x01, 0x00, 0x85, 0xfe, 0xa2, 0x07, 0xee, \n\t0x05, 0xb0, 0x00, 0x0f, 0x00, 0x3b, 0x00, 0xb0, 0x0c, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x10, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x0a, 0x3e, 0x59, \n\t0xb1, 0x09, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x06, 0xd0, 0xb0, 0x02, 0xd0, 0xb0, 0x00, 0x10, 0xb0, 0x03, 0xd0, \n\t0xb0, 0x07, 0xd0, 0x30, 0x31, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, \n\t0x11, 0x21, 0x11, 0x33, 0x03, 0x21, 0x11, 0x21, 0x11, 0x01, 0xa9, 0x01, \n\t0x9c, 0x01, 0x23, 0x01, 0x98, 0x01, 0x24, 0xca, 0x14, 0xfe, 0xf1, 0xf9, \n\t0xba, 0x05, 0xb0, 0xfb, 0x30, 0x04, 0xd0, 0xfb, 0x30, 0x04, 0xd0, 0xfb, \n\t0x30, 0xfd, 0xc2, 0x01, 0x5e, 0x05, 0xb0, 0x00, 0x00, 0x02, 0x00, 0x1a, \n\t0x00, 0x00, 0x05, 0xed, 0x05, 0xb0, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x54, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x10, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, \n\t0x0a, 0x3e, 0x59, 0xb2, 0x02, 0x0a, 0x01, 0x11, 0x12, 0x39, 0xb0, 0x02, \n\t0x2f, 0xb0, 0x01, 0x10, 0xb1, 0x0b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x02, 0x10, 0xb1, 0x0d, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0a, 0x10, 0xb1, 0x0e, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x13, 0x21, 0x11, 0x33, 0x32, 0x04, 0x15, 0x14, 0x04, 0x23, 0x21, 0x11, \n\t0x21, 0x01, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x1a, 0x02, \n\t0xb6, 0xfa, 0xfd, 0x01, 0x26, 0xfe, 0xd8, 0xfb, 0xfd, 0xe2, 0xfe, 0x6e, \n\t0x02, 0xb6, 0xfa, 0x7b, 0x85, 0x84, 0x7c, 0x05, 0xb0, 0xfd, 0xe5, 0xf7, \n\t0xce, 0xd1, 0xff, 0x04, 0xcf, 0xfd, 0xe5, 0xfe, 0x2c, 0x89, 0x69, 0x64, \n\t0x7e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x84, 0x00, 0x00, 0x04, 0xc5, \n\t0x05, 0xb0, 0x00, 0x0a, 0x00, 0x13, 0x00, 0x42, 0x00, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x10, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0a, 0x3e, 0x59, 0xb2, \n\t0x00, 0x08, 0x0a, 0x11, 0x12, 0x39, 0xb0, 0x00, 0x2f, 0xb1, 0x0b, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x08, 0x10, \n\t0xb1, 0x0c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x01, 0x33, 0x32, 0x04, 0x15, 0x14, 0x04, 0x23, 0x21, 0x11, \n\t0x21, 0x11, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x01, 0xa8, \n\t0xfa, 0xfd, 0x01, 0x26, 0xfe, 0xd8, 0xfb, 0xfd, 0xe2, 0x01, 0x24, 0xfa, \n\t0x7b, 0x85, 0x84, 0x7c, 0x03, 0x95, 0xf7, 0xce, 0xd1, 0xff, 0x05, 0xb0, \n\t0xfd, 0x04, 0xfe, 0x2c, 0x89, 0x69, 0x64, 0x7e, 0x00, 0x02, 0xff, 0xef, \n\t0x00, 0x00, 0x04, 0x53, 0x05, 0xb0, 0x00, 0x0d, 0x00, 0x16, 0x00, 0x56, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x10, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, \n\t0x0b, 0x0a, 0x3e, 0x59, 0xb2, 0x16, 0x0b, 0x09, 0x11, 0x12, 0x39, 0xb0, \n\t0x16, 0x2f, 0xb1, 0x0c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb2, 0x02, 0x0c, 0x16, 0x11, 0x12, 0x39, 0xb0, 0x09, 0x10, \n\t0xb1, 0x0e, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x21, 0x21, 0x01, 0x26, 0x26, 0x35, 0x34, 0x24, 0x33, 0x21, \n\t0x11, 0x21, 0x11, 0x23, 0x13, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, \n\t0x33, 0x01, 0x2a, 0xfe, 0xc5, 0x01, 0x3b, 0x73, 0x74, 0x01, 0x1c, 0xfc, \n\t0x01, 0xf8, 0xfe, 0xdc, 0xfa, 0xfa, 0xd4, 0x79, 0x7b, 0x7e, 0x76, 0xd4, \n\t0x02, 0x70, 0x3d, 0xbf, 0x85, 0xd7, 0xe8, 0xfa, 0x50, 0x02, 0x16, 0x02, \n\t0xb9, 0x79, 0x71, 0x71, 0x89, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x54, \n\t0xff, 0xeb, 0x04, 0x51, 0x06, 0x15, 0x00, 0x1c, 0x00, 0x2a, 0x00, 0x67, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x1a, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, \n\t0x0a, 0x3e, 0x59, 0xb2, 0x00, 0x11, 0x07, 0x11, 0x12, 0x39, 0xb0, 0x00, \n\t0x2f, 0xb2, 0x00, 0x00, 0x01, 0x5d, 0xb2, 0x0e, 0x07, 0x11, 0x11, 0x12, \n\t0x39, 0xb0, 0x0e, 0x2f, 0xb1, 0x16, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x1a, 0x00, 0x07, 0x11, 0x12, 0x39, 0xb0, \n\t0x00, 0x10, 0xb1, 0x1d, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x07, 0x10, 0xb1, 0x24, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x32, 0x00, 0x15, 0x15, \n\t0x14, 0x00, 0x23, 0x22, 0x00, 0x35, 0x35, 0x12, 0x00, 0x37, 0x36, 0x36, \n\t0x35, 0x33, 0x17, 0x16, 0x06, 0x07, 0x06, 0x06, 0x07, 0x17, 0x36, 0x36, \n\t0x17, 0x22, 0x06, 0x15, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, \n\t0x34, 0x26, 0x02, 0x6b, 0xe4, 0x01, 0x02, 0xfe, 0xf1, 0xef, 0xf0, 0xfe, \n\t0xf1, 0x01, 0x01, 0x14, 0xdf, 0x61, 0x5d, 0xe2, 0x03, 0x04, 0xba, 0xe0, \n\t0x70, 0x85, 0x13, 0x04, 0x37, 0x93, 0x36, 0x71, 0x68, 0x68, 0x73, 0x71, \n\t0x69, 0x6a, 0x03, 0xfe, 0xfe, 0xe7, 0xdf, 0x15, 0xe6, 0xfe, 0xe0, 0x01, \n\t0x20, 0xe6, 0x91, 0x01, 0x64, 0x01, 0x82, 0x2c, 0x10, 0x35, 0x3c, 0x06, \n\t0xc2, 0x7e, 0x23, 0x13, 0x8a, 0x7b, 0x05, 0x31, 0x3e, 0xe1, 0x9c, 0x7b, \n\t0x15, 0x85, 0xa1, 0xa1, 0x85, 0x15, 0x7b, 0x9c, 0x00, 0x02, 0x00, 0x21, \n\t0xfe, 0xbc, 0x04, 0xec, 0x04, 0x3a, 0x00, 0x0e, 0x00, 0x15, 0x00, 0x47, \n\t0x00, 0xb0, 0x0c, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, \n\t0xb1, 0x05, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, \n\t0x1b, 0xb1, 0x0a, 0x0a, 0x3e, 0x59, 0xb1, 0x06, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x13, 0xd0, 0xb0, 0x00, 0xd0, \n\t0xb0, 0x0c, 0x10, 0xb0, 0x09, 0xd0, 0xb0, 0x05, 0x10, 0xb1, 0x14, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x37, \n\t0x36, 0x36, 0x37, 0x13, 0x21, 0x11, 0x33, 0x03, 0x21, 0x11, 0x21, 0x11, \n\t0x21, 0x03, 0x01, 0x06, 0x06, 0x07, 0x21, 0x11, 0x23, 0x7f, 0x64, 0x45, \n\t0x05, 0x05, 0x03, 0x1e, 0x9c, 0x14, 0xfe, 0xf1, 0xfd, 0x81, 0xfe, 0xf0, \n\t0x19, 0x02, 0x2f, 0x07, 0x43, 0x39, 0x01, 0x60, 0xdb, 0xe2, 0x67, 0xc9, \n\t0xbb, 0x01, 0x6d, 0xfc, 0xa6, 0xfd, 0xdc, 0x01, 0x44, 0xfe, 0xbc, 0x02, \n\t0x26, 0x01, 0xeb, 0xa1, 0xf3, 0x58, 0x02, 0x70, 0x00, 0x01, 0x00, 0x19, \n\t0x00, 0x00, 0x06, 0xc7, 0x04, 0x3a, 0x00, 0x15, 0x00, 0x7d, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x0e, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x0e, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0e, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, \n\t0x03, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x15, 0x2f, 0x1b, \n\t0xb1, 0x15, 0x0a, 0x3e, 0x59, 0xb2, 0x0c, 0x03, 0x0e, 0x11, 0x12, 0x39, \n\t0xb0, 0x0c, 0x2f, 0xb1, 0x04, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x01, 0xd0, 0xb2, 0x08, 0x04, 0x0c, 0x11, 0x12, \n\t0x39, 0xb0, 0x0c, 0x10, 0xb0, 0x0f, 0xd0, 0xb0, 0x08, 0x10, 0xb0, 0x13, \n\t0xd0, 0x30, 0x31, 0x01, 0x23, 0x11, 0x21, 0x11, 0x23, 0x03, 0x21, 0x01, \n\t0x01, 0x21, 0x13, 0x33, 0x11, 0x21, 0x11, 0x33, 0x13, 0x21, 0x01, 0x01, \n\t0x21, 0x04, 0x80, 0x7f, 0xfe, 0xdd, 0x7e, 0xd1, 0xfe, 0x8a, 0x01, 0x5e, \n\t0xfe, 0xb4, 0x01, 0x70, 0xd9, 0x6a, 0x01, 0x23, 0x6b, 0xda, 0x01, 0x70, \n\t0xfe, 0xb4, 0x01, 0x5d, 0xfe, 0x8a, 0x01, 0x98, 0xfe, 0x68, 0x01, 0x98, \n\t0xfe, 0x68, 0x02, 0x4b, 0x01, 0xef, 0xfe, 0x68, 0x01, 0x98, 0xfe, 0x68, \n\t0x01, 0x98, 0xfe, 0x11, 0xfd, 0xb5, 0x00, 0x00, 0x00, 0x01, 0x00, 0x46, \n\t0xff, 0xec, 0x03, 0xdc, 0x04, 0x4d, 0x00, 0x2a, 0x00, 0x7a, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x0e, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1a, 0x2f, 0x1b, 0xb1, 0x1a, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x0e, 0x10, 0xb1, 0x06, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0e, 0x10, 0xb0, 0x09, 0xd0, 0xb2, 0x2a, \n\t0x1a, 0x0e, 0x11, 0x12, 0x39, 0xb0, 0x2a, 0x2f, 0xb2, 0x1f, 0x2a, 0x01, \n\t0x71, 0xb4, 0x7f, 0x2a, 0x8f, 0x2a, 0x02, 0x5d, 0xb2, 0xbf, 0x2a, 0x01, \n\t0x71, 0xb2, 0xef, 0x2a, 0x01, 0x71, 0xb1, 0x29, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x14, 0x29, 0x2a, 0x11, 0x12, \n\t0x39, 0xb0, 0x1a, 0x10, 0xb0, 0x1f, 0xd0, 0xb0, 0x1a, 0x10, 0xb1, 0x22, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x01, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x21, 0x27, \n\t0x26, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, \n\t0x14, 0x04, 0x23, 0x22, 0x24, 0x37, 0x37, 0x21, 0x14, 0x16, 0x33, 0x32, \n\t0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x02, 0x16, 0x4a, 0x46, 0x43, \n\t0x4c, 0x47, 0x57, 0xfe, 0xe5, 0x02, 0x06, 0xf8, 0xba, 0xd0, 0xf1, 0x58, \n\t0x4e, 0x5a, 0x5f, 0xfe, 0xfd, 0xd1, 0xb9, 0xfe, 0xf7, 0x06, 0x01, 0x01, \n\t0x1b, 0x5c, 0x54, 0x51, 0x50, 0x50, 0x53, 0x9c, 0x02, 0x86, 0x3e, 0x39, \n\t0x34, 0x48, 0x40, 0x36, 0x06, 0x91, 0xb3, 0xa4, 0x97, 0x49, 0x79, 0x23, \n\t0x20, 0x7f, 0x5c, 0x98, 0xae, 0xac, 0xa2, 0x06, 0x38, 0x4a, 0x4e, 0x39, \n\t0x46, 0x41, 0xba, 0x00, 0x00, 0x03, 0x00, 0x44, 0xfe, 0x60, 0x05, 0x95, \n\t0x06, 0x18, 0x00, 0x1f, 0x00, 0x2d, 0x00, 0x3b, 0x00, 0x67, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x1a, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0e, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x18, 0x2f, 0x1b, 0xb1, 0x18, 0x0c, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1c, 0x2f, 0x1b, 0xb1, 0x1c, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x03, 0x10, 0xb0, 0x0c, 0xd0, 0xb0, 0x1c, 0x10, \n\t0xb0, 0x13, 0xd0, 0xb0, 0x03, 0x10, 0xb1, 0x38, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x23, 0xd0, 0xb0, 0x1c, 0x10, \n\t0xb1, 0x31, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x2a, 0xd0, 0x30, 0x31, 0x13, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, \n\t0x11, 0x21, 0x11, 0x36, 0x36, 0x33, 0x32, 0x12, 0x11, 0x15, 0x14, 0x02, \n\t0x23, 0x22, 0x26, 0x27, 0x11, 0x21, 0x11, 0x06, 0x06, 0x23, 0x22, 0x02, \n\t0x35, 0x25, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x16, 0x16, 0x33, \n\t0x32, 0x36, 0x35, 0x21, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x11, 0x26, \n\t0x26, 0x23, 0x22, 0x06, 0x15, 0x44, 0xd1, 0xbf, 0x25, 0x41, 0x1e, 0x01, \n\t0x23, 0x1e, 0x44, 0x27, 0xbf, 0xd2, 0xd2, 0xbd, 0x27, 0x46, 0x1e, 0xfe, \n\t0xdd, 0x1e, 0x44, 0x24, 0xbe, 0xd0, 0x04, 0x2d, 0x5a, 0x5f, 0x12, 0x1e, \n\t0x0d, 0x0e, 0x1f, 0x12, 0x60, 0x57, 0xfc, 0xf6, 0x54, 0x61, 0x0f, 0x1e, \n\t0x0f, 0x0e, 0x1d, 0x0f, 0x60, 0x57, 0x02, 0x14, 0x01, 0x00, 0x01, 0x3a, \n\t0x0e, 0x0c, 0x01, 0xe4, 0xfe, 0x1a, 0x0d, 0x0f, 0xfe, 0xc7, 0xfe, 0xff, \n\t0x15, 0xf0, 0xfe, 0xdc, 0x0e, 0x0d, 0xfe, 0x5a, 0x01, 0xa4, 0x0c, 0x0d, \n\t0x01, 0x24, 0xf0, 0x15, 0x9a, 0xbf, 0x04, 0x03, 0xfd, 0x6b, 0x03, 0x03, \n\t0xa6, 0x8e, 0x8f, 0xa5, 0x02, 0x03, 0x02, 0x97, 0x03, 0x03, 0xbf, 0x9a, \n\t0x00, 0x02, 0x00, 0x22, 0x00, 0x00, 0x05, 0x1a, 0x04, 0x3a, 0x00, 0x0c, \n\t0x00, 0x15, 0x00, 0x54, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, \n\t0x1b, 0xb1, 0x0b, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, \n\t0x2f, 0x1b, 0xb1, 0x08, 0x0a, 0x3e, 0x59, 0xb2, 0x00, 0x08, 0x0b, 0x11, \n\t0x12, 0x39, 0xb0, 0x00, 0x2f, 0xb0, 0x0b, 0x10, 0xb1, 0x0a, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb1, \n\t0x0d, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x08, 0x10, 0xb1, 0x0e, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0x30, 0x31, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, \n\t0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, \n\t0x26, 0x23, 0x02, 0x7a, 0xcb, 0xdb, 0xfa, 0xfb, 0xda, 0xfe, 0x11, 0xfe, \n\t0xcc, 0x02, 0x58, 0xcb, 0x5a, 0x58, 0x58, 0x5a, 0x02, 0xf7, 0xd1, 0xac, \n\t0xa8, 0xd2, 0x03, 0x58, 0xe2, 0xfd, 0xdd, 0xfe, 0xc8, 0x57, 0x43, 0x44, \n\t0x5a, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x7b, 0xff, 0xeb, 0x07, 0x05, \n\t0x05, 0xb0, 0x00, 0x20, 0x00, 0x48, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0a, 0x3e, 0x59, 0xb0, 0x04, 0xd0, \n\t0xb2, 0x07, 0x0a, 0x0f, 0x11, 0x12, 0x39, 0xb0, 0x0a, 0x10, 0xb1, 0x13, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0f, \n\t0x10, 0xb0, 0x17, 0xd0, 0xb0, 0x13, 0x10, 0xb0, 0x1c, 0xd0, 0xb0, 0x17, \n\t0x10, 0xb0, 0x20, 0xd0, 0x30, 0x31, 0x01, 0x11, 0x14, 0x04, 0x23, 0x22, \n\t0x26, 0x27, 0x06, 0x06, 0x23, 0x22, 0x24, 0x35, 0x11, 0x21, 0x11, 0x14, \n\t0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x21, 0x11, 0x14, 0x16, 0x33, 0x32, \n\t0x36, 0x35, 0x11, 0x07, 0x05, 0xfe, 0xf0, 0xda, 0x6f, 0xb4, 0x39, 0x3a, \n\t0xb5, 0x6e, 0xda, 0xfe, 0xf3, 0x01, 0x24, 0x67, 0x5c, 0x60, 0x6b, 0x01, \n\t0x26, 0x6a, 0x5e, 0x5d, 0x69, 0x05, 0xb0, 0xfc, 0x11, 0xe1, 0xf5, 0x50, \n\t0x4f, 0x4e, 0x51, 0xf5, 0xe1, 0x03, 0xef, 0xfc, 0x11, 0x7c, 0x7a, 0x7a, \n\t0x7c, 0x03, 0xef, 0xfc, 0x11, 0x7c, 0x7a, 0x7a, 0x7c, 0x03, 0xef, 0x00, \n\t0x00, 0x01, 0x00, 0x63, 0xff, 0xeb, 0x06, 0x44, 0x04, 0x3a, 0x00, 0x20, \n\t0x00, 0x53, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, \n\t0x0f, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x17, 0x2f, 0x1b, \n\t0xb1, 0x17, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x20, 0x2f, \n\t0x1b, 0xb1, 0x20, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, \n\t0x2f, 0x1b, 0xb1, 0x0a, 0x0a, 0x3e, 0x59, 0xb0, 0x04, 0xd0, 0xb2, 0x07, \n\t0x0a, 0x17, 0x11, 0x12, 0x39, 0xb0, 0x0a, 0x10, 0xb1, 0x13, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x1c, 0xd0, 0x30, \n\t0x31, 0x01, 0x11, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x06, 0x06, 0x23, \n\t0x22, 0x26, 0x35, 0x11, 0x21, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, \n\t0x11, 0x21, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x06, 0x44, \n\t0xf2, 0xc8, 0x63, 0x9d, 0x34, 0x37, 0xa1, 0x63, 0xc7, 0xf1, 0x01, 0x25, \n\t0x4b, 0x48, 0x52, 0x58, 0x01, 0x25, 0x50, 0x50, 0x49, 0x4d, 0x04, 0x3a, \n\t0xfd, 0x79, 0xdc, 0xec, 0x46, 0x46, 0x46, 0x46, 0xec, 0xdc, 0x02, 0x87, \n\t0xfd, 0x79, 0x76, 0x72, 0x72, 0x76, 0x02, 0x87, 0xfd, 0x79, 0x77, 0x71, \n\t0x72, 0x76, 0x02, 0x87, 0x00, 0x02, 0xff, 0xe6, 0x00, 0x00, 0x04, 0x45, \n\t0x06, 0x19, 0x00, 0x12, 0x00, 0x1b, 0x00, 0x67, 0x00, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x1a, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0a, 0x3e, 0x59, 0xb2, \n\t0x11, 0x10, 0x0a, 0x11, 0x12, 0x39, 0xb0, 0x11, 0x2f, 0xb1, 0x01, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x02, 0x0a, \n\t0x10, 0x11, 0x12, 0x39, 0xb0, 0x02, 0x2f, 0xb0, 0x01, 0x10, 0xb0, 0x0b, \n\t0xd0, 0xb0, 0x11, 0x10, 0xb0, 0x0e, 0xd0, 0xb0, 0x02, 0x10, 0xb1, 0x13, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0a, \n\t0x10, 0xb1, 0x14, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0x30, 0x31, 0x01, 0x23, 0x11, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, \n\t0x23, 0x21, 0x11, 0x23, 0x35, 0x33, 0x11, 0x21, 0x11, 0x33, 0x03, 0x11, \n\t0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x02, 0xa5, 0xff, 0xcb, 0xda, \n\t0xfa, 0xfb, 0xd9, 0xfe, 0x10, 0x9b, 0x9b, 0x01, 0x25, 0xff, 0xff, 0xcb, \n\t0x59, 0x58, 0x58, 0x59, 0x04, 0x39, 0xfe, 0xd9, 0xd8, 0xaf, 0xb1, 0xda, \n\t0x04, 0x39, 0xb4, 0x01, 0x2c, 0xfe, 0xd4, 0xfd, 0x45, 0xfe, 0xad, 0x5f, \n\t0x4b, 0x48, 0x61, 0x00, 0x00, 0x01, 0x00, 0x81, 0xff, 0xec, 0x06, 0xd7, \n\t0x05, 0xc6, 0x00, 0x29, 0x00, 0x83, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x29, 0x2f, 0x1b, 0xb1, 0x29, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x26, 0x2f, 0x1b, 0xb1, 0x26, 0x0a, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x20, 0x2f, 0x1b, 0xb1, 0x20, 0x0a, 0x3e, 0x59, 0xb2, \n\t0x12, 0x20, 0x05, 0x11, 0x12, 0x39, 0xb0, 0x12, 0x2f, 0xb0, 0x00, 0xd0, \n\t0xb0, 0x05, 0x10, 0xb0, 0x0a, 0xd0, 0xb0, 0x05, 0x10, 0xb1, 0x0d, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x12, 0x10, \n\t0xb1, 0x13, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x20, 0x10, 0xb1, 0x18, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x20, 0x10, 0xb0, 0x1b, 0xd0, 0xb0, 0x13, 0x10, \n\t0xb0, 0x25, 0xd0, 0x30, 0x31, 0x01, 0x33, 0x35, 0x10, 0x00, 0x21, 0x20, \n\t0x00, 0x17, 0x07, 0x21, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x15, 0x21, \n\t0x15, 0x21, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x21, 0x17, 0x06, \n\t0x00, 0x21, 0x20, 0x00, 0x11, 0x35, 0x23, 0x11, 0x21, 0x11, 0x21, 0x01, \n\t0xa5, 0xb8, 0x01, 0x40, 0x01, 0x00, 0x01, 0x09, 0x01, 0x1e, 0x13, 0x02, \n\t0xfe, 0xe4, 0x0c, 0x81, 0x8f, 0x83, 0x9a, 0x01, 0xb5, 0xfe, 0x4b, 0xa2, \n\t0x8a, 0x86, 0x7a, 0x0c, 0x01, 0x1b, 0x02, 0x0d, 0xfe, 0xe6, 0xfe, 0xfe, \n\t0xfe, 0xf9, 0xfe, 0xb8, 0xb8, 0xfe, 0xdc, 0x01, 0x24, 0x03, 0x59, 0x10, \n\t0x01, 0x09, 0x01, 0x54, 0xfe, 0xf1, 0xf5, 0x06, 0x94, 0x95, 0xd5, 0xa5, \n\t0x12, 0xe1, 0x30, 0xa7, 0xd5, 0x8f, 0x95, 0x06, 0xef, 0xfe, 0xf1, 0x01, \n\t0x52, 0x01, 0x0a, 0x30, 0xfd, 0x88, 0x05, 0xb0, 0x00, 0x01, 0x00, 0x74, \n\t0xff, 0xeb, 0x05, 0xcf, 0x04, 0x4e, 0x00, 0x27, 0x00, 0xba, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x27, 0x2f, 0x1b, 0xb1, 0x27, 0x0e, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0e, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x24, 0x2f, 0x1b, 0xb1, 0x24, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1f, 0x2f, 0x1b, 0xb1, 0x1f, \n\t0x0a, 0x3e, 0x59, 0xb2, 0x11, 0x1f, 0x04, 0x11, 0x12, 0x39, 0xb0, 0x11, \n\t0x2f, 0xb4, 0x7f, 0x11, 0x8f, 0x11, 0x02, 0x5d, 0xb2, 0x1f, 0x11, 0x01, \n\t0x71, 0xb4, 0x8f, 0x11, 0x9f, 0x11, 0x02, 0x71, 0xb2, 0xef, 0x11, 0x01, \n\t0x71, 0xb2, 0xbf, 0x11, 0x01, 0x71, 0xb4, 0x4f, 0x11, 0x5f, 0x11, 0x02, \n\t0x71, 0xb4, 0xbf, 0x11, 0xcf, 0x11, 0x02, 0x5d, 0xb2, 0x2f, 0x11, 0x01, \n\t0x5d, 0xb4, 0x1f, 0x11, 0x2f, 0x11, 0x02, 0x72, 0xb0, 0x01, 0xd0, 0xb0, \n\t0x04, 0x10, 0xb0, 0x09, 0xd0, 0xb0, 0x04, 0x10, 0xb1, 0x0c, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x11, 0x10, 0xb1, \n\t0x12, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x1f, 0x10, 0xb1, 0x17, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x1f, 0x10, 0xb0, 0x1a, 0xd0, 0xb0, 0x12, 0x10, 0xb0, \n\t0x22, 0xd0, 0x30, 0x31, 0x01, 0x33, 0x36, 0x00, 0x33, 0x32, 0x16, 0x07, \n\t0x07, 0x21, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x17, 0x21, 0x15, 0x21, \n\t0x07, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x21, 0x17, 0x16, 0x06, 0x23, \n\t0x22, 0x00, 0x27, 0x23, 0x11, 0x21, 0x11, 0x21, 0x01, 0x98, 0x87, 0x14, \n\t0x01, 0x01, 0xde, 0xc8, 0xf5, 0x04, 0x02, 0xfe, 0xf6, 0x5c, 0x51, 0x63, \n\t0x61, 0x07, 0x02, 0x01, 0x3b, 0xfe, 0xc5, 0x02, 0x05, 0x61, 0x66, 0x4e, \n\t0x5e, 0x01, 0x09, 0x03, 0x04, 0xff, 0xbd, 0xdf, 0xfe, 0xfe, 0x14, 0x86, \n\t0xfe, 0xdc, 0x01, 0x24, 0x02, 0x78, 0xd1, 0x01, 0x05, 0xe4, 0xba, 0x06, \n\t0x54, 0x6f, 0x86, 0x6a, 0x05, 0xb4, 0x05, 0x6e, 0x86, 0x5b, 0x4c, 0x06, \n\t0xa4, 0xdd, 0x01, 0x05, 0xd4, 0xfe, 0x3c, 0x04, 0x3a, 0x00, 0x00, 0x00, \n\t0x00, 0x03, 0x00, 0x61, 0xff, 0xeb, 0x05, 0x20, 0x05, 0xc5, 0x00, 0x0d, \n\t0x00, 0x16, 0x00, 0x1f, 0x00, 0x63, 0x00, 0x7c, 0xb0, 0x17, 0x2f, 0x18, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x10, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0a, \n\t0x3e, 0x59, 0xb2, 0x00, 0x17, 0x01, 0x71, 0xb2, 0xcf, 0x17, 0x01, 0x71, \n\t0xb2, 0xb0, 0x17, 0x01, 0x5d, 0xb2, 0x40, 0x17, 0x01, 0x5d, 0xb0, 0x17, \n\t0x10, 0xb1, 0x0f, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x03, 0x10, 0xb1, 0x13, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0a, 0x10, 0xb1, 0x1c, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x10, 0x00, \n\t0x21, 0x20, 0x00, 0x11, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x05, \n\t0x21, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x25, 0x21, 0x35, 0x34, \n\t0x26, 0x23, 0x22, 0x06, 0x15, 0x05, 0x20, 0xfe, 0xad, 0xfe, 0xf1, 0xfe, \n\t0xf3, 0xfe, 0xb0, 0x01, 0x4f, 0x01, 0x0d, 0x01, 0x0f, 0x01, 0x54, 0xfe, \n\t0xdc, 0xfd, 0x88, 0xa6, 0x94, 0x96, 0xa8, 0xfd, 0x88, 0x02, 0x78, 0xaa, \n\t0x95, 0x95, 0xa4, 0x02, 0x55, 0xfe, 0xf4, 0xfe, 0xa2, 0x01, 0x5e, 0x01, \n\t0x0c, 0x01, 0x06, 0x01, 0x0b, 0x01, 0x5f, 0xfe, 0xa1, 0xfe, 0xf5, 0xdb, \n\t0x2b, 0xad, 0xda, 0xda, 0xad, 0xdf, 0x29, 0xaa, 0xda, 0xd9, 0xab, 0x00, \n\t0x00, 0x03, 0x00, 0x41, 0xff, 0xeb, 0x04, 0x3e, 0x04, 0x4e, 0x00, 0x0d, \n\t0x00, 0x16, 0x00, 0x1f, 0x00, 0x7e, 0x00, 0x7c, 0xb0, 0x12, 0x2f, 0x18, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0e, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x0e, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0xe0, 0x12, 0x01, 0x5d, 0xb2, 0x7f, \n\t0x12, 0x01, 0x5d, 0xb2, 0x4f, 0x12, 0x01, 0x71, 0xb2, 0x1f, 0x12, 0x01, \n\t0x72, 0xb2, 0xef, 0x12, 0x01, 0x71, 0xb2, 0x1f, 0x12, 0x01, 0x71, 0xb4, \n\t0x80, 0x12, 0x90, 0x12, 0x02, 0x72, 0xb2, 0x10, 0x12, 0x01, 0x5d, 0xb2, \n\t0xf0, 0x12, 0x01, 0x72, 0xb0, 0x0a, 0x10, 0xb1, 0x17, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x12, 0x10, 0xb1, 0x1c, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x13, 0x34, 0x00, 0x33, 0x32, 0x00, 0x15, 0x15, 0x14, 0x00, 0x23, 0x22, \n\t0x00, 0x35, 0x01, 0x22, 0x06, 0x07, 0x17, 0x21, 0x37, 0x26, 0x26, 0x03, \n\t0x32, 0x36, 0x37, 0x27, 0x21, 0x07, 0x16, 0x16, 0x41, 0x01, 0x0e, 0xef, \n\t0xf0, 0x01, 0x10, 0xfe, 0xf1, 0xef, 0xf0, 0xfe, 0xf1, 0x01, 0xfd, 0x61, \n\t0x68, 0x08, 0x02, 0x01, 0xa0, 0x02, 0x09, 0x69, 0x5f, 0x60, 0x67, 0x09, \n\t0x02, 0xfe, 0x61, 0x02, 0x08, 0x68, 0x02, 0x27, 0xf2, 0x01, 0x35, 0xfe, \n\t0xcc, 0xf3, 0x15, 0xf4, 0xfe, 0xcd, 0x01, 0x33, 0xf4, 0x01, 0x5b, 0x87, \n\t0x6c, 0x05, 0x05, 0x6c, 0x87, 0xfd, 0x5e, 0x83, 0x6e, 0x05, 0x05, 0x6e, \n\t0x83, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0d, 0x00, 0x00, 0x05, 0x05, \n\t0x05, 0xc3, 0x00, 0x11, 0x00, 0x4f, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x0a, 0x3e, 0x59, 0xb0, 0x01, \n\t0xd0, 0x40, 0x0b, 0x14, 0x01, 0x24, 0x01, 0x34, 0x01, 0x44, 0x01, 0x54, \n\t0x01, 0x05, 0x5d, 0xb2, 0x61, 0x01, 0x01, 0x5d, 0xb0, 0x07, 0x10, 0xb1, \n\t0x0a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, \n\t0x31, 0x01, 0x17, 0x33, 0x37, 0x13, 0x36, 0x36, 0x33, 0x17, 0x07, 0x23, \n\t0x22, 0x06, 0x07, 0x01, 0x21, 0x01, 0x21, 0x02, 0x75, 0x12, 0x06, 0x11, \n\t0xd3, 0x35, 0xaa, 0x8d, 0x28, 0x02, 0x1c, 0x2b, 0x3d, 0x10, 0xfe, 0xb1, \n\t0xfe, 0xd4, 0xfe, 0x19, 0x01, 0x34, 0x01, 0x8b, 0x51, 0x4e, 0x02, 0xe7, \n\t0xac, 0xa8, 0x01, 0xec, 0x40, 0x38, 0xfb, 0xa2, 0x05, 0xb0, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x0d, 0x00, 0x00, 0x05, 0x05, 0x07, 0x40, 0x02, 0x26, \n\t0x03, 0xe7, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5f, 0x04, 0x3f, 0x01, 0x52, \n\t0x00, 0x0f, 0x00, 0xb3, 0x14, 0x07, 0x11, 0x04, 0x2b, 0xb0, 0x14, 0x10, \n\t0xb0, 0x19, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x7b, \n\t0xff, 0xeb, 0x06, 0xf4, 0x07, 0x31, 0x00, 0x2e, 0x00, 0x40, 0x00, 0x46, \n\t0x00, 0x99, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, \n\t0x01, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, \n\t0xb1, 0x0e, 0x0a, 0x3e, 0x59, 0xb0, 0x08, 0xd0, 0xb2, 0x0b, 0x0e, 0x01, \n\t0x11, 0x12, 0x39, 0xb0, 0x01, 0x10, 0xb0, 0x15, 0xd0, 0xb0, 0x01, 0x10, \n\t0xb1, 0x2e, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x17, 0xd0, 0xb0, 0x0e, 0x10, 0xb1, 0x1e, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x23, 0x01, 0x0e, 0x11, 0x12, \n\t0x39, 0xb0, 0x27, 0xd0, 0xb2, 0x41, 0x2e, 0x01, 0x11, 0x12, 0x39, 0xb0, \n\t0x41, 0x2f, 0xb0, 0x45, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, \n\t0xb0, 0x31, 0xd0, 0xb0, 0x2f, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, \n\t0x59, 0xb0, 0x31, 0x10, 0xb0, 0x34, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, \n\t0xdc, 0x59, 0xb0, 0x31, 0x10, 0xb0, 0x38, 0xd0, 0xb0, 0x34, 0x10, 0xb0, \n\t0x3d, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, 0x01, \n\t0x37, 0x36, 0x04, 0x15, 0x11, 0x14, 0x04, 0x23, 0x22, 0x26, 0x27, 0x06, \n\t0x06, 0x23, 0x22, 0x24, 0x35, 0x11, 0x34, 0x24, 0x17, 0x17, 0x15, 0x22, \n\t0x06, 0x15, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x21, 0x11, \n\t0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x34, 0x26, 0x23, 0x13, 0x15, \n\t0x23, 0x22, 0x24, 0x23, 0x22, 0x06, 0x15, 0x15, 0x23, 0x35, 0x34, 0x36, \n\t0x33, 0x32, 0x04, 0x33, 0x01, 0x27, 0x37, 0x27, 0x33, 0x15, 0x05, 0x0d, \n\t0x06, 0xd5, 0x01, 0x0c, 0xfe, 0xf3, 0xda, 0x6c, 0xb0, 0x3a, 0x3b, 0xb0, \n\t0x6a, 0xda, 0xfe, 0xf3, 0x01, 0x0c, 0xd5, 0x06, 0x5c, 0x67, 0x67, 0x5c, \n\t0x60, 0x6b, 0x01, 0x15, 0x6a, 0x61, 0x5b, 0x68, 0x68, 0x5b, 0x6f, 0x17, \n\t0x81, 0xfe, 0xc4, 0x28, 0x31, 0x36, 0x85, 0x78, 0x70, 0x46, 0x01, 0x35, \n\t0x6f, 0xfe, 0x23, 0x52, 0x3b, 0x01, 0xb6, 0x05, 0xa8, 0x02, 0x04, 0xfc, \n\t0xe7, 0xfe, 0x04, 0xe8, 0xfc, 0x4b, 0x4a, 0x4a, 0x4b, 0xfc, 0xe8, 0x01, \n\t0xfc, 0xe7, 0xfc, 0x04, 0x02, 0xd9, 0x82, 0x82, 0xfe, 0x04, 0x83, 0x81, \n\t0x7a, 0x7c, 0x01, 0x6f, 0xfe, 0x91, 0x7c, 0x7a, 0x81, 0x83, 0x01, 0xfc, \n\t0x82, 0x82, 0x01, 0xea, 0x86, 0x78, 0x33, 0x33, 0x12, 0x25, 0x6d, 0x6c, \n\t0x78, 0xfe, 0x53, 0x37, 0x6c, 0x93, 0x81, 0x00, 0x00, 0x03, 0x00, 0x6c, \n\t0xff, 0xeb, 0x06, 0x09, 0x05, 0xd6, 0x00, 0x2e, 0x00, 0x40, 0x00, 0x46, \n\t0x00, 0xac, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, \n\t0x01, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x15, 0x2f, 0x1b, \n\t0xb1, 0x15, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, \n\t0x1b, 0xb1, 0x0e, 0x0a, 0x3e, 0x59, 0xb0, 0x08, 0xd0, 0xb2, 0x0b, 0x0e, \n\t0x15, 0x11, 0x12, 0x39, 0xb0, 0x15, 0x10, 0xb1, 0x17, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0e, 0x10, 0xb1, 0x1e, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x22, \n\t0x15, 0x0e, 0x11, 0x12, 0x39, 0xb0, 0x27, 0xd0, 0xb0, 0x01, 0x10, 0xb1, \n\t0x2e, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, \n\t0x41, 0x17, 0x15, 0x11, 0x12, 0x39, 0xb0, 0x41, 0x2f, 0xb0, 0x45, 0xb0, \n\t0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x31, 0xd0, 0xb0, 0x2f, \n\t0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x31, 0x10, 0xb0, \n\t0x34, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x31, 0x10, \n\t0xb0, 0x38, 0xd0, 0xb0, 0x34, 0x10, 0xb0, 0x3d, 0xb0, 0x0a, 0x2b, 0x58, \n\t0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, 0x01, 0x37, 0x36, 0x16, 0x15, 0x15, \n\t0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, \n\t0x35, 0x34, 0x36, 0x17, 0x17, 0x15, 0x22, 0x06, 0x15, 0x15, 0x14, 0x16, \n\t0x33, 0x32, 0x36, 0x35, 0x35, 0x21, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, \n\t0x35, 0x35, 0x34, 0x26, 0x23, 0x13, 0x15, 0x23, 0x22, 0x24, 0x23, 0x22, \n\t0x06, 0x15, 0x15, 0x23, 0x35, 0x34, 0x36, 0x33, 0x32, 0x04, 0x33, 0x01, \n\t0x27, 0x37, 0x27, 0x33, 0x15, 0x04, 0x3b, 0x06, 0xc9, 0xff, 0xf0, 0xc0, \n\t0x5b, 0x93, 0x31, 0x32, 0x92, 0x5a, 0xc2, 0xee, 0xfe, 0xca, 0x06, 0x50, \n\t0x5a, 0x4a, 0x42, 0x45, 0x4f, 0x01, 0x15, 0x4e, 0x46, 0x41, 0x4b, 0x5b, \n\t0x4f, 0xcd, 0x17, 0x81, 0xfe, 0xc5, 0x29, 0x31, 0x36, 0x85, 0x79, 0x70, \n\t0x46, 0x01, 0x34, 0x6f, 0xfe, 0x23, 0x51, 0x3a, 0x01, 0xb6, 0x04, 0x42, \n\t0x03, 0x03, 0xed, 0xda, 0xcd, 0xdb, 0xee, 0x48, 0x47, 0x47, 0x48, 0xee, \n\t0xdb, 0xcd, 0xda, 0xed, 0x03, 0x03, 0xd9, 0x74, 0x74, 0xcd, 0x75, 0x74, \n\t0x73, 0x75, 0xa9, 0xa9, 0x75, 0x73, 0x74, 0x75, 0xcd, 0x74, 0x74, 0x01, \n\t0xf5, 0x86, 0x78, 0x33, 0x33, 0x12, 0x25, 0x6d, 0x6c, 0x78, 0xfe, 0x60, \n\t0x37, 0x6d, 0x85, 0x73, 0x00, 0x02, 0x00, 0x7b, 0xff, 0xeb, 0x07, 0x05, \n\t0x07, 0x07, 0x00, 0x07, 0x00, 0x28, 0x00, 0x7d, 0x00, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x17, 0x2f, 0x1b, 0xb1, 0x17, 0x10, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x1f, 0x2f, 0x1b, 0xb1, 0x1f, 0x10, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x28, 0x2f, 0x1b, 0xb1, 0x28, 0x10, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x1f, 0x10, 0xb0, 0x06, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, \n\t0xdc, 0x59, 0xb0, 0x07, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, \n\t0xb0, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x07, \n\t0x10, 0xb0, 0x04, 0xd0, 0xb0, 0x12, 0x10, 0xb1, 0x1b, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x24, 0xd0, 0xb2, 0x0f, \n\t0x12, 0x17, 0x11, 0x12, 0x39, 0xb0, 0x12, 0x10, 0xb0, 0x0c, 0xd0, 0x30, \n\t0x31, 0x01, 0x35, 0x21, 0x17, 0x21, 0x15, 0x23, 0x35, 0x05, 0x11, 0x14, \n\t0x04, 0x23, 0x22, 0x26, 0x27, 0x06, 0x06, 0x23, 0x22, 0x24, 0x35, 0x11, \n\t0x21, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x21, 0x11, 0x14, \n\t0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x02, 0x07, 0x03, 0x75, 0x02, 0xfe, \n\t0x96, 0xb5, 0x03, 0xa6, 0xfe, 0xf0, 0xda, 0x6f, 0xb4, 0x39, 0x3a, 0xb5, \n\t0x6e, 0xda, 0xfe, 0xf3, 0x01, 0x24, 0x67, 0x5c, 0x60, 0x6b, 0x01, 0x26, \n\t0x6a, 0x5e, 0x5d, 0x69, 0x06, 0x97, 0x70, 0x70, 0x7f, 0x7f, 0xe7, 0xfc, \n\t0x11, 0xe1, 0xf5, 0x50, 0x4f, 0x4e, 0x51, 0xf5, 0xe1, 0x03, 0xef, 0xfc, \n\t0x11, 0x7c, 0x7a, 0x7a, 0x7c, 0x03, 0xef, 0xfc, 0x11, 0x7c, 0x7a, 0x7a, \n\t0x7c, 0x03, 0xef, 0x00, 0x00, 0x02, 0x00, 0x63, 0xff, 0xeb, 0x06, 0x44, \n\t0x05, 0xb1, 0x00, 0x07, 0x00, 0x28, 0x00, 0x7d, 0x00, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x17, 0x2f, 0x1b, 0xb1, 0x17, 0x0e, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x1f, 0x2f, 0x1b, 0xb1, 0x1f, 0x0e, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x28, 0x2f, 0x1b, 0xb1, 0x28, 0x0e, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x1f, 0x10, 0xb0, 0x06, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, \n\t0xdc, 0x59, 0xb0, 0x07, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, \n\t0xb0, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x07, \n\t0x10, 0xb0, 0x04, 0xd0, 0xb0, 0x12, 0x10, 0xb1, 0x1b, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x24, 0xd0, 0xb2, 0x0f, \n\t0x12, 0x17, 0x11, 0x12, 0x39, 0xb0, 0x12, 0x10, 0xb0, 0x0c, 0xd0, 0x30, \n\t0x31, 0x01, 0x35, 0x21, 0x17, 0x21, 0x15, 0x23, 0x35, 0x01, 0x11, 0x14, \n\t0x06, 0x23, 0x22, 0x26, 0x27, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x11, \n\t0x21, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x21, 0x11, 0x14, \n\t0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x01, 0xba, 0x03, 0x38, 0x06, 0xfe, \n\t0xb0, 0xb5, 0x03, 0x51, 0xf2, 0xc8, 0x63, 0x9d, 0x34, 0x37, 0xa1, 0x63, \n\t0xc7, 0xf1, 0x01, 0x25, 0x4b, 0x48, 0x52, 0x58, 0x01, 0x25, 0x50, 0x50, \n\t0x49, 0x4d, 0x05, 0x41, 0x70, 0x70, 0x7f, 0x7f, 0xfe, 0xf9, 0xfd, 0x79, \n\t0xdc, 0xec, 0x46, 0x46, 0x46, 0x46, 0xec, 0xdc, 0x02, 0x87, 0xfd, 0x79, \n\t0x76, 0x72, 0x72, 0x76, 0x02, 0x87, 0xfd, 0x79, 0x77, 0x71, 0x72, 0x76, \n\t0x02, 0x87, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe6, 0x00, 0x00, 0x04, 0x45, \n\t0x06, 0x53, 0x00, 0x12, 0x00, 0x1b, 0x00, 0x5d, 0x00, 0xb0, 0x10, 0x2f, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0a, 0x3e, \n\t0x59, 0xb2, 0x11, 0x10, 0x0a, 0x11, 0x12, 0x39, 0xb0, 0x11, 0x2f, 0xb1, \n\t0x01, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, \n\t0x02, 0x0a, 0x10, 0x11, 0x12, 0x39, 0xb0, 0x02, 0x2f, 0xb0, 0x01, 0x10, \n\t0xb0, 0x0b, 0xd0, 0xb0, 0x11, 0x10, 0xb0, 0x0e, 0xd0, 0xb0, 0x02, 0x10, \n\t0xb1, 0x13, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x0a, 0x10, 0xb1, 0x14, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x23, 0x11, 0x33, 0x32, 0x16, 0x15, \n\t0x14, 0x06, 0x23, 0x21, 0x11, 0x23, 0x35, 0x33, 0x35, 0x21, 0x15, 0x33, \n\t0x03, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x02, 0xa5, 0xff, \n\t0xcb, 0xda, 0xfa, 0xfb, 0xd9, 0xfe, 0x10, 0x9b, 0x9b, 0x01, 0x25, 0xff, \n\t0xff, 0xcb, 0x59, 0x58, 0x58, 0x59, 0x04, 0xfb, 0xfe, 0x17, 0xd8, 0xaf, \n\t0xb1, 0xda, 0x04, 0xfb, 0xb5, 0xa3, 0xa3, 0xfc, 0x82, 0xfe, 0xad, 0x5f, \n\t0x4b, 0x48, 0x61, 0x00, 0x00, 0x02, 0x00, 0x88, 0x00, 0x00, 0x04, 0xe7, \n\t0x05, 0xb0, 0x00, 0x10, 0x00, 0x1d, 0x00, 0x49, 0x00, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x10, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x0a, 0x3e, 0x59, 0xb2, \n\t0x00, 0x01, 0x03, 0x11, 0x12, 0x39, 0xb0, 0x00, 0x2f, 0xb2, 0x09, 0x00, \n\t0x03, 0x11, 0x12, 0x39, 0xb1, 0x11, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x1d, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x11, 0x21, \n\t0x11, 0x21, 0x32, 0x00, 0x15, 0x14, 0x07, 0x06, 0x07, 0x17, 0x07, 0x27, \n\t0x06, 0x23, 0x25, 0x21, 0x32, 0x37, 0x27, 0x37, 0x17, 0x36, 0x35, 0x34, \n\t0x26, 0x23, 0x21, 0x01, 0xac, 0xfe, 0xdc, 0x02, 0x44, 0xfb, 0x01, 0x20, \n\t0x90, 0x03, 0x02, 0x77, 0x65, 0x89, 0x73, 0x9c, 0xfe, 0xe0, 0x01, 0x20, \n\t0x37, 0x2b, 0x80, 0x65, 0x8a, 0x27, 0x7d, 0x7b, 0xfe, 0xe0, 0x02, 0x10, \n\t0xfd, 0xf0, 0x05, 0xb0, 0xff, 0x00, 0xd1, 0xd1, 0x7f, 0x02, 0x03, 0x82, \n\t0x5d, 0x96, 0x31, 0xe1, 0x0e, 0x8d, 0x5d, 0x98, 0x3b, 0x51, 0x69, 0x89, \n\t0x00, 0x02, 0x00, 0x70, 0xfe, 0x60, 0x04, 0x40, 0x04, 0x4e, 0x00, 0x17, \n\t0x00, 0x29, 0x00, 0x6a, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, \n\t0x1b, 0xb1, 0x10, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x14, \n\t0x2f, 0x1b, 0xb1, 0x14, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0a, 0x3e, 0x59, 0xb2, 0x0c, 0x09, \n\t0x14, 0x11, 0x12, 0x39, 0xb2, 0x11, 0x14, 0x09, 0x11, 0x12, 0x39, 0xb0, \n\t0x14, 0x10, 0xb1, 0x1b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x09, 0x10, 0xb1, 0x22, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x27, 0x22, 0x1b, 0x11, 0x12, 0x39, \n\t0x30, 0x31, 0x01, 0x14, 0x07, 0x06, 0x07, 0x17, 0x07, 0x27, 0x06, 0x23, \n\t0x22, 0x26, 0x27, 0x11, 0x21, 0x11, 0x21, 0x17, 0x36, 0x36, 0x33, 0x32, \n\t0x12, 0x11, 0x21, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x16, 0x16, \n\t0x33, 0x32, 0x37, 0x27, 0x37, 0x17, 0x36, 0x35, 0x04, 0x40, 0x6f, 0x03, \n\t0x03, 0x60, 0x68, 0x60, 0x56, 0x72, 0x55, 0x84, 0x2f, 0xfe, 0xdd, 0x01, \n\t0x0c, 0x0e, 0x30, 0x86, 0x59, 0xc9, 0xde, 0xfe, 0xdc, 0x66, 0x69, 0x42, \n\t0x5d, 0x1b, 0x1b, 0x5d, 0x44, 0x3d, 0x2a, 0x74, 0x68, 0x5c, 0x16, 0x01, \n\t0xff, 0xf0, 0x92, 0x04, 0x03, 0x70, 0x5c, 0x71, 0x30, 0x3f, 0x3d, 0xfd, \n\t0xf9, 0x05, 0xda, 0x7e, 0x46, 0x4c, 0xfe, 0xc6, 0xff, 0x00, 0x99, 0xbe, \n\t0x36, 0x32, 0xfe, 0x26, 0x2e, 0x30, 0x1b, 0x89, 0x5b, 0x6d, 0x44, 0x5e, \n\t0x00, 0x01, 0x00, 0x88, 0xfe, 0xb3, 0x04, 0xb5, 0x05, 0xb0, 0x00, 0x16, \n\t0x00, 0x57, 0x00, 0xb0, 0x09, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x16, \n\t0x2f, 0x1b, 0xb1, 0x16, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x13, 0x2f, 0x1b, 0xb1, 0x13, 0x0a, 0x3e, 0x59, 0xb0, 0x16, 0x10, 0xb1, \n\t0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, \n\t0x02, 0x13, 0x16, 0x11, 0x12, 0x39, 0xb0, 0x02, 0x2f, 0xb0, 0x09, 0x10, \n\t0xb1, 0x0b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x02, 0x10, 0xb1, 0x12, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x11, 0x33, 0x20, 0x00, 0x11, \n\t0x14, 0x00, 0x25, 0x27, 0x35, 0x32, 0x36, 0x37, 0x34, 0x26, 0x23, 0x23, \n\t0x11, 0x21, 0x11, 0x21, 0x04, 0x3d, 0xfd, 0x6f, 0xae, 0x01, 0x16, 0x01, \n\t0x45, 0xfe, 0xfa, 0xfe, 0xeb, 0x06, 0x96, 0x67, 0x01, 0xa0, 0x98, 0xae, \n\t0xfe, 0xdc, 0x03, 0xb5, 0x04, 0xcf, 0xfe, 0x75, 0xfe, 0xd3, 0xfe, 0xe3, \n\t0xfa, 0xfe, 0xb3, 0x04, 0x02, 0xce, 0xce, 0x98, 0xb8, 0xba, 0xfd, 0xa1, \n\t0x05, 0xb0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x6b, 0xfe, 0xe2, 0x03, 0xf9, \n\t0x04, 0x3a, 0x00, 0x15, 0x00, 0x45, 0x00, 0xb0, 0x09, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x15, 0x2f, 0x1b, 0xb1, 0x15, 0x0e, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x15, 0x10, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb2, 0x02, 0x12, 0x15, 0x11, 0x12, 0x39, 0xb0, 0x02, \n\t0x2f, 0xb1, 0x11, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0x30, 0x31, 0x01, 0x21, 0x15, 0x33, 0x20, 0x04, 0x15, 0x16, 0x02, \n\t0x07, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x11, 0x21, 0x11, \n\t0x21, 0x03, 0x4d, 0xfe, 0x41, 0x33, 0x01, 0x00, 0x01, 0x36, 0x02, 0xc0, \n\t0xb5, 0x7b, 0x63, 0x67, 0x91, 0x81, 0x33, 0xfe, 0xdd, 0x02, 0xe2, 0x03, \n\t0x58, 0xc0, 0xfb, 0xec, 0x86, 0xfe, 0xf2, 0x3b, 0xbd, 0x2d, 0x84, 0x61, \n\t0x7e, 0x84, 0xfe, 0x4d, 0x04, 0x3a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x12, \n\t0xfe, 0x9b, 0x08, 0x5c, 0x05, 0xb0, 0x02, 0x26, 0x03, 0xd2, 0x00, 0x00, \n\t0x00, 0x07, 0x03, 0x5d, 0x06, 0xde, 0x00, 0x00, 0xff, 0xff, 0x00, 0x19, \n\t0xfe, 0x9b, 0x07, 0x0e, 0x04, 0x3a, 0x02, 0x26, 0x03, 0xdc, 0x00, 0x00, \n\t0x00, 0x07, 0x03, 0x5d, 0x05, 0x90, 0x00, 0x00, 0xff, 0xff, 0x00, 0x57, \n\t0xfe, 0x27, 0x04, 0xe2, 0x05, 0xc5, 0x00, 0x26, 0x01, 0xbf, 0x00, 0x00, \n\t0x00, 0x07, 0x03, 0x5d, 0x01, 0x87, 0xff, 0x8c, 0xff, 0xff, 0x00, 0x46, \n\t0xfe, 0x28, 0x03, 0xdc, 0x04, 0x4d, 0x02, 0x26, 0x03, 0xdd, 0x00, 0x00, \n\t0x00, 0x07, 0x03, 0x5d, 0x01, 0x2a, 0xff, 0x8d, 0x00, 0x01, 0x00, 0x25, \n\t0x00, 0x00, 0x06, 0xb5, 0x05, 0xb0, 0x00, 0x0e, 0x00, 0x63, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x10, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x10, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, \n\t0x0a, 0x3e, 0x59, 0xb2, 0x08, 0x02, 0x07, 0x11, 0x12, 0x39, 0xb0, 0x08, \n\t0x2f, 0xb1, 0x01, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x07, 0x10, 0xb1, 0x04, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0c, 0x01, 0x08, 0x11, 0x12, 0x39, 0x30, \n\t0x31, 0x01, 0x23, 0x11, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x01, \n\t0x21, 0x01, 0x01, 0x21, 0x03, 0xca, 0xa2, 0xfe, 0xdc, 0xfe, 0x21, 0x03, \n\t0x03, 0x7f, 0x01, 0x82, 0x01, 0x65, 0xfe, 0x16, 0x02, 0x11, 0xfe, 0x9c, \n\t0x02, 0x60, 0xfd, 0xa0, 0x04, 0xce, 0xe2, 0xfd, 0xad, 0x02, 0x53, 0xfd, \n\t0x5a, 0xfc, 0xf6, 0x00, 0x00, 0x01, 0x00, 0x3a, 0x00, 0x00, 0x05, 0xc8, \n\t0x04, 0x3a, 0x00, 0x0e, 0x00, 0x63, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0a, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x0a, 0x3e, 0x59, 0xb2, \n\t0x08, 0x02, 0x07, 0x11, 0x12, 0x39, 0xb0, 0x08, 0x2f, 0xb1, 0x01, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x07, 0x10, \n\t0xb1, 0x04, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb2, 0x0c, 0x01, 0x08, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x23, 0x11, \n\t0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x13, 0x21, 0x01, 0x01, 0x21, \n\t0x03, 0x58, 0x70, 0xfe, 0xdd, 0xfe, 0x75, 0x02, 0xae, 0x67, 0xe9, 0x01, \n\t0x70, 0xfe, 0x9f, 0x01, 0x81, 0xfe, 0x7c, 0x01, 0x95, 0xfe, 0x6b, 0x03, \n\t0x58, 0xe2, 0xfe, 0x64, 0x01, 0x9c, 0xfe, 0x02, 0xfd, 0xc4, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x88, 0xfe, 0xb1, 0x08, 0x15, 0x05, 0xb0, 0x00, 0x18, \n\t0x00, 0x64, 0x00, 0xb0, 0x07, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x18, \n\t0x2f, 0x1b, 0xb1, 0x18, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x15, 0x2f, 0x1b, 0xb1, 0x15, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x0a, 0x3e, 0x59, 0xb2, 0x00, 0x12, \n\t0x18, 0x11, 0x12, 0x39, 0xb0, 0x00, 0x2f, 0xb0, 0x07, 0x10, 0xb1, 0x09, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, \n\t0x10, 0xb1, 0x10, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x18, 0x10, 0xb1, 0x13, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x33, 0x20, 0x00, 0x11, 0x14, \n\t0x00, 0x25, 0x27, 0x35, 0x32, 0x36, 0x37, 0x34, 0x26, 0x23, 0x23, 0x11, \n\t0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x05, 0x22, 0x98, 0x01, 0x16, \n\t0x01, 0x45, 0xfe, 0xfa, 0xfe, 0xeb, 0x06, 0x96, 0x67, 0x01, 0xa0, 0x98, \n\t0x98, 0xfe, 0xdc, 0xfd, 0xae, 0xfe, 0xdc, 0x04, 0x9a, 0x03, 0x42, 0xfe, \n\t0xd3, 0xfe, 0xe3, 0xf9, 0xfe, 0xb2, 0x04, 0x02, 0xce, 0xce, 0x98, 0xb8, \n\t0xba, 0xfd, 0xa3, 0x04, 0xcf, 0xfb, 0x31, 0x05, 0xb0, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x6b, 0xfe, 0xe8, 0x06, 0xbf, 0x04, 0x3a, 0x00, 0x17, \n\t0x00, 0x52, 0x00, 0xb0, 0x07, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x17, \n\t0x2f, 0x1b, 0xb1, 0x17, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x14, 0x2f, 0x1b, 0xb1, 0x14, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x0a, 0x3e, 0x59, 0xb2, 0x00, 0x11, \n\t0x17, 0x11, 0x12, 0x39, 0xb0, 0x00, 0x2f, 0xb1, 0x0f, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x17, 0x10, 0xb1, 0x12, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x01, 0x33, 0x20, 0x04, 0x15, 0x16, 0x02, 0x07, 0x27, 0x36, 0x36, 0x35, \n\t0x34, 0x26, 0x23, 0x23, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, \n\t0x04, 0x19, 0x5a, 0x01, 0x0a, 0x01, 0x40, 0x02, 0xc0, 0xb5, 0x7b, 0x64, \n\t0x66, 0x9b, 0x8b, 0x5a, 0xfe, 0xdc, 0xfe, 0x9a, 0xfe, 0xdc, 0x03, 0xae, \n\t0x02, 0x9e, 0xfa, 0xec, 0x86, 0xfe, 0xf2, 0x3c, 0xbd, 0x2d, 0x85, 0x61, \n\t0x7e, 0x84, 0xfe, 0x46, 0x03, 0x58, 0xfc, 0xa8, 0x04, 0x3a, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x61, 0xff, 0xeb, 0x06, 0x05, 0x05, 0xc4, 0x00, 0x2a, \n\t0x00, 0x39, 0x00, 0x77, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x20, 0x2f, \n\t0x1b, 0xb1, 0x20, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, \n\t0x2f, 0x1b, 0xb1, 0x0d, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0xd0, 0xb2, \n\t0x03, 0x06, 0x20, 0x11, 0x12, 0x39, 0xb0, 0x0d, 0x10, 0xb1, 0x0f, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x06, 0x10, \n\t0xb1, 0x16, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x00, 0x10, 0xb1, 0x2a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb2, 0x2e, 0x20, 0x03, 0x11, 0x12, 0x39, 0xb0, 0x20, \n\t0x10, 0xb1, 0x36, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0x30, 0x31, 0x05, 0x22, 0x26, 0x27, 0x06, 0x06, 0x23, 0x20, 0x00, \n\t0x11, 0x35, 0x10, 0x00, 0x17, 0x17, 0x15, 0x22, 0x06, 0x15, 0x15, 0x14, \n\t0x16, 0x33, 0x32, 0x36, 0x37, 0x26, 0x02, 0x35, 0x35, 0x34, 0x12, 0x33, \n\t0x32, 0x12, 0x11, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x33, 0x01, 0x14, \n\t0x16, 0x17, 0x33, 0x36, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, \n\t0x15, 0x06, 0x05, 0x72, 0xce, 0x5a, 0x4c, 0xad, 0x5e, 0xfe, 0xcd, 0xfe, \n\t0x80, 0x01, 0x1d, 0xe1, 0x06, 0x61, 0x70, 0xce, 0xb2, 0x14, 0x24, 0x11, \n\t0x68, 0x6f, 0xed, 0xbe, 0xcb, 0xfe, 0x5c, 0x54, 0x2a, 0x5e, 0x33, 0xfd, \n\t0x95, 0x59, 0x55, 0x06, 0x40, 0x48, 0x54, 0x51, 0x49, 0x4e, 0x12, 0x23, \n\t0x23, 0x24, 0x25, 0x01, 0x87, 0x01, 0x26, 0xc8, 0x01, 0x07, 0x01, 0x5c, \n\t0x05, 0x02, 0xe2, 0xd3, 0xa5, 0xca, 0xc8, 0xfb, 0x02, 0x03, 0x61, 0x01, \n\t0x03, 0x98, 0xc9, 0xeb, 0x01, 0x3a, 0xfe, 0xb6, 0xfe, 0xfd, 0xb7, 0x8d, \n\t0xf8, 0x60, 0x0a, 0x08, 0x02, 0x0b, 0x78, 0xc6, 0x40, 0x3d, 0xbd, 0x70, \n\t0xd4, 0xab, 0x9b, 0x9d, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x54, \n\t0xff, 0xe8, 0x04, 0xf4, 0x04, 0x4e, 0x00, 0x28, 0x00, 0x38, 0x00, 0x77, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1e, 0x2f, 0x1b, 0xb1, 0x1e, 0x0e, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, \n\t0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, \n\t0x06, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0xd0, 0xb2, 0x03, 0x06, 0x1e, 0x11, \n\t0x12, 0x39, 0xb0, 0x0d, 0x10, 0xb1, 0x0f, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x06, 0x10, 0xb1, 0x16, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb1, \n\t0x28, 0x04, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x1e, 0x10, 0xb1, 0x2d, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb2, 0x35, 0x1e, 0x06, 0x11, 0x12, 0x39, 0x30, 0x31, 0x05, \n\t0x22, 0x26, 0x27, 0x06, 0x06, 0x23, 0x22, 0x00, 0x35, 0x35, 0x34, 0x12, \n\t0x17, 0x17, 0x15, 0x06, 0x06, 0x15, 0x15, 0x14, 0x16, 0x37, 0x37, 0x26, \n\t0x26, 0x35, 0x35, 0x34, 0x36, 0x33, 0x32, 0x12, 0x15, 0x15, 0x14, 0x06, \n\t0x07, 0x16, 0x16, 0x33, 0x01, 0x35, 0x34, 0x26, 0x07, 0x23, 0x26, 0x06, \n\t0x15, 0x15, 0x14, 0x16, 0x17, 0x33, 0x36, 0x36, 0x04, 0xf4, 0x64, 0xad, \n\t0x49, 0x3c, 0x88, 0x48, 0xfd, 0xfe, 0xc3, 0xed, 0xbb, 0x06, 0x39, 0x41, \n\t0x8a, 0x70, 0x05, 0x31, 0x32, 0xbd, 0x9a, 0x9f, 0xc6, 0x46, 0x41, 0x23, \n\t0x4e, 0x2a, 0xfe, 0xc9, 0x35, 0x29, 0x06, 0x2a, 0x34, 0x2f, 0x2d, 0x06, \n\t0x2d, 0x33, 0x18, 0x1a, 0x1a, 0x18, 0x19, 0x01, 0x3b, 0xf0, 0x5d, 0xcd, \n\t0x01, 0x0c, 0x04, 0x02, 0xe1, 0x07, 0x82, 0x67, 0x5f, 0x8d, 0xb0, 0x09, \n\t0x03, 0x36, 0xa0, 0x5d, 0x95, 0xb4, 0xed, 0xfe, 0xfa, 0xc6, 0x8f, 0x64, \n\t0xb0, 0x44, 0x07, 0x07, 0x01, 0x74, 0x91, 0x5a, 0x77, 0x04, 0x04, 0x6c, \n\t0x53, 0x99, 0x47, 0x78, 0x2b, 0x23, 0x76, 0x00, 0xff, 0xff, 0x00, 0x5d, \n\t0xfe, 0x2e, 0x04, 0xdb, 0x05, 0xc5, 0x02, 0x26, 0x00, 0x26, 0x00, 0x00, \n\t0x00, 0x07, 0x03, 0x5d, 0x01, 0xaa, 0xff, 0x93, 0xff, 0xff, 0x00, 0x3e, \n\t0xfe, 0x2e, 0x03, 0xf2, 0x04, 0x4e, 0x02, 0x26, 0x00, 0x46, 0x00, 0x00, \n\t0x00, 0x07, 0x03, 0x5d, 0x01, 0x3d, 0xff, 0x93, 0xff, 0xff, 0xff, 0xee, \n\t0xfe, 0x30, 0x06, 0x08, 0x05, 0xc4, 0x00, 0x26, 0x02, 0x38, 0x00, 0x00, \n\t0x00, 0x07, 0x03, 0x5d, 0x02, 0xc3, 0xff, 0x95, 0xff, 0xff, 0xff, 0xbc, \n\t0xfe, 0x38, 0x04, 0x6f, 0x04, 0x4e, 0x02, 0x26, 0x02, 0x39, 0x00, 0x00, \n\t0x00, 0x07, 0x03, 0x5d, 0x01, 0xe3, 0xff, 0x9d, 0xff, 0xff, 0x00, 0x12, \n\t0x00, 0x00, 0x07, 0xe9, 0x07, 0x68, 0x02, 0x26, 0x03, 0xd2, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x54, 0x02, 0x3d, 0x01, 0xb8, 0x00, 0x09, 0x00, 0xb3, \n\t0x1a, 0x08, 0x0d, 0x04, 0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x19, \n\t0x00, 0x00, 0x06, 0xc7, 0x06, 0x11, 0x02, 0x26, 0x03, 0xdc, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x54, 0x01, 0xba, 0x00, 0x61, 0x00, 0x09, 0x00, 0xb3, \n\t0x1a, 0x09, 0x0d, 0x04, 0x2b, 0x30, 0x31, 0x00, 0x00, 0x01, 0x00, 0x84, \n\t0xfe, 0xb1, 0x05, 0x08, 0x05, 0xb0, 0x00, 0x17, 0x00, 0x59, 0x00, 0xb0, \n\t0x06, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x13, 0x2f, 0x1b, 0xb1, 0x13, \n\t0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x16, 0x2f, 0x1b, 0xb1, \n\t0x16, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, \n\t0xb1, 0x10, 0x0a, 0x3e, 0x59, 0xb2, 0x14, 0x10, 0x13, 0x11, 0x12, 0x39, \n\t0xb0, 0x14, 0x2f, 0xb1, 0x0f, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb2, 0x00, 0x14, 0x0f, 0x11, 0x12, 0x39, 0xb0, 0x06, \n\t0x10, 0xb1, 0x08, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0x30, 0x31, 0x01, 0x16, 0x12, 0x15, 0x14, 0x00, 0x25, 0x27, 0x27, \n\t0x32, 0x36, 0x37, 0x34, 0x26, 0x23, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, \n\t0x33, 0x01, 0x21, 0x03, 0x2b, 0xdf, 0xfe, 0xfe, 0xfa, 0xfe, 0xeb, 0x06, \n\t0x01, 0x96, 0x68, 0x01, 0xa0, 0x98, 0xfe, 0xfb, 0xfe, 0xdc, 0x01, 0x24, \n\t0x66, 0x01, 0x73, 0x01, 0x69, 0x03, 0x39, 0x20, 0xfe, 0xd9, 0xfb, 0xf8, \n\t0xfe, 0xb2, 0x04, 0x02, 0xcd, 0xce, 0x98, 0xb8, 0xbb, 0xfd, 0xa3, 0x05, \n\t0xb0, 0xfd, 0xaf, 0x02, 0x51, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x81, \n\t0xfe, 0xd7, 0x04, 0x65, 0x04, 0x3a, 0x00, 0x16, 0x00, 0x4a, 0x00, 0xb0, \n\t0x06, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, \n\t0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x15, 0x2f, 0x1b, 0xb1, \n\t0x15, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, \n\t0xb1, 0x0f, 0x0a, 0x3e, 0x59, 0xb2, 0x13, 0x0f, 0x12, 0x11, 0x12, 0x39, \n\t0xb0, 0x13, 0x2f, 0xb1, 0x0e, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb2, 0x00, 0x0e, 0x13, 0x11, 0x12, 0x39, 0x30, 0x31, \n\t0x01, 0x16, 0x16, 0x15, 0x16, 0x02, 0x07, 0x27, 0x36, 0x36, 0x35, 0x34, \n\t0x26, 0x23, 0x23, 0x11, 0x21, 0x11, 0x21, 0x11, 0x33, 0x13, 0x21, 0x03, \n\t0x0d, 0x9e, 0xb1, 0x02, 0xbf, 0xb6, 0x7b, 0x64, 0x66, 0x99, 0x8d, 0x6d, \n\t0xfe, 0xdc, 0x01, 0x24, 0x57, 0xf8, 0x01, 0x71, 0x02, 0x58, 0x2f, 0xdf, \n\t0xac, 0x84, 0xfe, 0xf8, 0x3b, 0xbd, 0x2c, 0x80, 0x5e, 0x7d, 0x7a, 0xfe, \n\t0x6b, 0x04, 0x3a, 0xfe, 0x64, 0x01, 0x9c, 0x00, 0xff, 0xff, 0x00, 0x61, \n\t0xff, 0xeb, 0x05, 0x20, 0x05, 0xc5, 0x02, 0x06, 0x03, 0xe5, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x41, 0xff, 0xeb, 0x04, 0x3e, 0x04, 0x4e, 0x02, 0x06, \n\t0x03, 0xe6, 0x00, 0x00, 0xff, 0xff, 0x00, 0x61, 0xff, 0xeb, 0x05, 0x20, \n\t0x07, 0x08, 0x02, 0x26, 0x03, 0xe5, 0x00, 0x00, 0x01, 0x07, 0x00, 0x6a, \n\t0x00, 0xbd, 0x01, 0x58, 0x00, 0x0f, 0x00, 0xb3, 0x24, 0x08, 0x0a, 0x04, \n\t0x2b, 0xb0, 0x24, 0x10, 0xb0, 0x21, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x41, 0xff, 0xeb, 0x04, 0x3e, 0x05, 0xe7, 0x02, 0x26, \n\t0x03, 0xe6, 0x00, 0x00, 0x01, 0x06, 0x00, 0x6a, 0x14, 0x37, 0x00, 0x0f, \n\t0x00, 0xb3, 0x24, 0x09, 0x03, 0x04, 0x2b, 0xb0, 0x24, 0x10, 0xb0, 0x21, \n\t0xd0, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x24, 0xff, 0xeb, 0x04, 0xee, \n\t0x06, 0xf2, 0x02, 0x26, 0x03, 0xd3, 0x00, 0x00, 0x01, 0x07, 0x00, 0x71, \n\t0x00, 0x86, 0x01, 0x41, 0x00, 0x09, 0x00, 0xb3, 0x17, 0x08, 0x14, 0x04, \n\t0x2b, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x24, 0xff, 0xeb, 0x04, 0xee, \n\t0x07, 0x0d, 0x02, 0x26, 0x03, 0xd3, 0x00, 0x00, 0x01, 0x07, 0x00, 0x6a, \n\t0x00, 0x6b, 0x01, 0x5d, 0x00, 0x0f, 0x00, 0xb3, 0x1b, 0x08, 0x14, 0x04, \n\t0x2b, 0xb0, 0x1b, 0x10, 0xb0, 0x17, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x24, 0xff, 0xeb, 0x04, 0xee, 0x07, 0x4b, 0x02, 0x26, \n\t0x03, 0xd3, 0x00, 0x00, 0x01, 0x07, 0x01, 0x59, 0x00, 0xc4, 0x01, 0x5d, \n\t0x00, 0x0f, 0x00, 0xb3, 0x20, 0x07, 0x14, 0x04, 0x2b, 0xb0, 0x20, 0x10, \n\t0xb0, 0x19, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, \n\t0x01, 0x4a, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, \n\t0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, \n\t0x00, 0x1f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, \n\t0x00, 0x25, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x17, \n\t0x00, 0x29, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0b, \n\t0x00, 0x40, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x16, \n\t0x00, 0x4b, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0b, \n\t0x00, 0x61, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x20, \n\t0x00, 0x6c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x06, \n\t0x00, 0x8c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x0a, \n\t0x00, 0x92, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x13, \n\t0x00, 0x9c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x2e, \n\t0x00, 0xaf, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x2a, \n\t0x00, 0xdd, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x0b, \n\t0x00, 0x40, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x00, 0x00, 0x3e, \n\t0x01, 0x07, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x01, 0x00, 0x0c, \n\t0x01, 0x45, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x02, 0x00, 0x08, \n\t0x01, 0x51, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x03, 0x00, 0x2e, \n\t0x01, 0x59, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x04, 0x00, 0x16, \n\t0x01, 0x87, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x05, 0x00, 0x2c, \n\t0x01, 0x9d, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x06, 0x00, 0x16, \n\t0x01, 0xc9, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x07, 0x00, 0x40, \n\t0x01, 0xdf, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x09, 0x00, 0x0c, \n\t0x02, 0x1f, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x0b, 0x00, 0x14, \n\t0x02, 0x2b, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x0c, 0x00, 0x26, \n\t0x02, 0x3f, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x0d, 0x00, 0x5c, \n\t0x02, 0x65, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x0e, 0x00, 0x54, \n\t0x02, 0xc1, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, \n\t0x63, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x47, 0x6f, \n\t0x6f, 0x67, 0x6c, 0x65, 0x20, 0x32, 0x30, 0x31, 0x32, 0x52, 0x6f, 0x62, \n\t0x6f, 0x74, 0x6f, 0x42, 0x6f, 0x6c, 0x64, 0x47, 0x6f, 0x6f, 0x67, 0x6c, \n\t0x65, 0x3a, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x6f, 0x20, 0x42, 0x6f, 0x6c, \n\t0x64, 0x3a, 0x32, 0x30, 0x31, 0x33, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x6f, \n\t0x20, 0x42, 0x6f, 0x6c, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, \n\t0x20, 0x31, 0x2e, 0x31, 0x30, 0x30, 0x31, 0x34, 0x31, 0x3b, 0x20, 0x32, \n\t0x30, 0x31, 0x33, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x6f, 0x2d, 0x42, 0x6f, \n\t0x6c, 0x64, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x6f, 0x20, 0x69, 0x73, 0x20, \n\t0x61, 0x20, 0x74, 0x72, 0x61, 0x64, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x20, \n\t0x6f, 0x66, 0x20, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x47, 0x6f, \n\t0x6f, 0x67, 0x6c, 0x65, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, \n\t0x6f, 0x6d, 0x43, 0x68, 0x72, 0x69, 0x73, 0x74, 0x69, 0x61, 0x6e, 0x20, \n\t0x52, 0x6f, 0x62, 0x65, 0x72, 0x74, 0x73, 0x6f, 0x6e, 0x4c, 0x69, 0x63, \n\t0x65, 0x6e, 0x73, 0x65, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, \n\t0x74, 0x68, 0x65, 0x20, 0x41, 0x70, 0x61, 0x63, 0x68, 0x65, 0x20, 0x4c, \n\t0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2c, 0x20, 0x56, 0x65, 0x72, 0x73, \n\t0x69, 0x6f, 0x6e, 0x20, 0x32, 0x2e, 0x30, 0x68, 0x74, 0x74, 0x70, 0x3a, \n\t0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, \n\t0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, \n\t0x73, 0x2f, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x2d, 0x32, 0x2e, \n\t0x30, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, \n\t0x64, 0x00, 0x61, 0x00, 0x74, 0x00, 0x61, 0x00, 0x20, 0x00, 0x63, 0x00, \n\t0x6f, 0x00, 0x70, 0x00, 0x79, 0x00, 0x72, 0x00, 0x69, 0x00, 0x67, 0x00, \n\t0x68, 0x00, 0x74, 0x00, 0x20, 0x00, 0x47, 0x00, 0x6f, 0x00, 0x6f, 0x00, \n\t0x67, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x20, 0x00, 0x32, 0x00, 0x30, 0x00, \n\t0x31, 0x00, 0x32, 0x00, 0x52, 0x00, 0x6f, 0x00, 0x62, 0x00, 0x6f, 0x00, \n\t0x74, 0x00, 0x6f, 0x00, 0x42, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x64, 0x00, \n\t0x47, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x67, 0x00, 0x6c, 0x00, 0x65, 0x00, \n\t0x3a, 0x00, 0x52, 0x00, 0x6f, 0x00, 0x62, 0x00, 0x6f, 0x00, 0x74, 0x00, \n\t0x6f, 0x00, 0x20, 0x00, 0x42, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x64, 0x00, \n\t0x3a, 0x00, 0x32, 0x00, 0x30, 0x00, 0x31, 0x00, 0x33, 0x00, 0x52, 0x00, \n\t0x6f, 0x00, 0x62, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, \n\t0x42, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x64, 0x00, 0x56, 0x00, 0x65, 0x00, \n\t0x72, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, \n\t0x31, 0x00, 0x2e, 0x00, 0x31, 0x00, 0x30, 0x00, 0x30, 0x00, 0x31, 0x00, \n\t0x34, 0x00, 0x31, 0x00, 0x3b, 0x00, 0x20, 0x00, 0x32, 0x00, 0x30, 0x00, \n\t0x31, 0x00, 0x33, 0x00, 0x52, 0x00, 0x6f, 0x00, 0x62, 0x00, 0x6f, 0x00, \n\t0x74, 0x00, 0x6f, 0x00, 0x2d, 0x00, 0x42, 0x00, 0x6f, 0x00, 0x6c, 0x00, \n\t0x64, 0x00, 0x52, 0x00, 0x6f, 0x00, 0x62, 0x00, 0x6f, 0x00, 0x74, 0x00, \n\t0x6f, 0x00, 0x20, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x61, 0x00, \n\t0x20, 0x00, 0x74, 0x00, 0x72, 0x00, 0x61, 0x00, 0x64, 0x00, 0x65, 0x00, \n\t0x6d, 0x00, 0x61, 0x00, 0x72, 0x00, 0x6b, 0x00, 0x20, 0x00, 0x6f, 0x00, \n\t0x66, 0x00, 0x20, 0x00, 0x47, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x67, 0x00, \n\t0x6c, 0x00, 0x65, 0x00, 0x2e, 0x00, 0x47, 0x00, 0x6f, 0x00, 0x6f, 0x00, \n\t0x67, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x47, 0x00, 0x6f, 0x00, 0x6f, 0x00, \n\t0x67, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x2e, 0x00, 0x63, 0x00, 0x6f, 0x00, \n\t0x6d, 0x00, 0x43, 0x00, 0x68, 0x00, 0x72, 0x00, 0x69, 0x00, 0x73, 0x00, \n\t0x74, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x52, 0x00, \n\t0x6f, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, 0x73, 0x00, \n\t0x6f, 0x00, 0x6e, 0x00, 0x4c, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, \n\t0x6e, 0x00, 0x73, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x75, 0x00, \n\t0x6e, 0x00, 0x64, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x74, 0x00, \n\t0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x41, 0x00, 0x70, 0x00, 0x61, 0x00, \n\t0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x4c, 0x00, 0x69, 0x00, \n\t0x63, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x65, 0x00, 0x2c, 0x00, \n\t0x20, 0x00, 0x56, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x69, 0x00, \n\t0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x32, 0x00, 0x2e, 0x00, 0x30, 0x00, \n\t0x68, 0x00, 0x74, 0x00, 0x74, 0x00, 0x70, 0x00, 0x3a, 0x00, 0x2f, 0x00, \n\t0x2f, 0x00, 0x77, 0x00, 0x77, 0x00, 0x77, 0x00, 0x2e, 0x00, 0x61, 0x00, \n\t0x70, 0x00, 0x61, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x2e, 0x00, \n\t0x6f, 0x00, 0x72, 0x00, 0x67, 0x00, 0x2f, 0x00, 0x6c, 0x00, 0x69, 0x00, \n\t0x63, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x65, 0x00, 0x73, 0x00, \n\t0x2f, 0x00, 0x4c, 0x00, 0x49, 0x00, 0x43, 0x00, 0x45, 0x00, 0x4e, 0x00, \n\t0x53, 0x00, 0x45, 0x00, 0x2d, 0x00, 0x32, 0x00, 0x2e, 0x00, 0x30, 0x00, \n\t0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x6a, 0x00, 0x64, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0b, 0x00, 0x00, \n\t0x01, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, \n\t0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, \n\t0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x12, \n\t0x00, 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x18, \n\t0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, \n\t0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, \n\t0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, \n\t0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, \n\t0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, \n\t0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, \n\t0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, \n\t0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, \n\t0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, \n\t0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, \n\t0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, \n\t0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x5f, 0x00, 0x60, \n\t0x00, 0x61, 0x00, 0xac, 0x00, 0xa3, 0x00, 0x84, 0x00, 0x85, 0x00, 0xbd, \n\t0x00, 0x96, 0x00, 0xe8, 0x00, 0x86, 0x00, 0x8e, 0x00, 0x8b, 0x00, 0x9d, \n\t0x00, 0xa9, 0x00, 0xa4, 0x01, 0x03, 0x00, 0x8a, 0x01, 0x04, 0x00, 0x83, \n\t0x00, 0x93, 0x00, 0xf2, 0x00, 0xf3, 0x00, 0x8d, 0x00, 0x97, 0x00, 0x88, \n\t0x01, 0x05, 0x00, 0xde, 0x00, 0xf1, 0x00, 0x9e, 0x00, 0xaa, 0x00, 0xf5, \n\t0x00, 0xf4, 0x00, 0xf6, 0x00, 0xa2, 0x00, 0xad, 0x00, 0xc9, 0x00, 0xc7, \n\t0x00, 0xae, 0x00, 0x62, 0x00, 0x63, 0x00, 0x90, 0x00, 0x64, 0x00, 0xcb, \n\t0x00, 0x65, 0x00, 0xc8, 0x00, 0xca, 0x00, 0xcf, 0x00, 0xcc, 0x00, 0xcd, \n\t0x00, 0xce, 0x00, 0xe9, 0x00, 0x66, 0x00, 0xd3, 0x00, 0xd0, 0x00, 0xd1, \n\t0x00, 0xaf, 0x00, 0x67, 0x00, 0xf0, 0x00, 0x91, 0x00, 0xd6, 0x00, 0xd4, \n\t0x00, 0xd5, 0x00, 0x68, 0x00, 0xeb, 0x00, 0xed, 0x00, 0x89, 0x00, 0x6a, \n\t0x00, 0x69, 0x00, 0x6b, 0x00, 0x6d, 0x00, 0x6c, 0x00, 0x6e, 0x00, 0xa0, \n\t0x00, 0x6f, 0x00, 0x71, 0x00, 0x70, 0x00, 0x72, 0x00, 0x73, 0x00, 0x75, \n\t0x00, 0x74, 0x00, 0x76, 0x00, 0x77, 0x00, 0xea, 0x00, 0x78, 0x00, 0x7a, \n\t0x00, 0x79, 0x00, 0x7b, 0x00, 0x7d, 0x00, 0x7c, 0x00, 0xb8, 0x00, 0xa1, \n\t0x00, 0x7f, 0x00, 0x7e, 0x00, 0x80, 0x00, 0x81, 0x00, 0xec, 0x00, 0xee, \n\t0x00, 0xba, 0x01, 0x06, 0x01, 0x07, 0x01, 0x08, 0x01, 0x09, 0x01, 0x0a, \n\t0x01, 0x0b, 0x00, 0xfd, 0x00, 0xfe, 0x01, 0x0c, 0x01, 0x0d, 0x01, 0x0e, \n\t0x01, 0x0f, 0x00, 0xff, 0x01, 0x00, 0x01, 0x10, 0x01, 0x11, 0x01, 0x12, \n\t0x01, 0x13, 0x01, 0x14, 0x01, 0x15, 0x01, 0x16, 0x01, 0x17, 0x01, 0x18, \n\t0x01, 0x19, 0x01, 0x1a, 0x01, 0x1b, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x1e, \n\t0x01, 0x1f, 0x00, 0xf8, 0x00, 0xf9, 0x01, 0x20, 0x01, 0x21, 0x01, 0x22, \n\t0x01, 0x23, 0x01, 0x24, 0x01, 0x25, 0x01, 0x26, 0x01, 0x27, 0x01, 0x28, \n\t0x01, 0x29, 0x01, 0x2a, 0x01, 0x2b, 0x01, 0x2c, 0x01, 0x2d, 0x01, 0x2e, \n\t0x01, 0x2f, 0x01, 0x30, 0x00, 0xd7, 0x01, 0x31, 0x01, 0x32, 0x01, 0x33, \n\t0x01, 0x34, 0x01, 0x35, 0x01, 0x36, 0x01, 0x37, 0x01, 0x38, 0x01, 0x39, \n\t0x01, 0x3a, 0x01, 0x3b, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0x3e, 0x01, 0x3f, \n\t0x00, 0xe2, 0x00, 0xe3, 0x01, 0x40, 0x01, 0x41, 0x01, 0x42, 0x01, 0x43, \n\t0x01, 0x44, 0x01, 0x45, 0x01, 0x46, 0x01, 0x47, 0x01, 0x48, 0x01, 0x49, \n\t0x01, 0x4a, 0x01, 0x4b, 0x01, 0x4c, 0x01, 0x4d, 0x01, 0x4e, 0x00, 0xb0, \n\t0x00, 0xb1, 0x01, 0x4f, 0x01, 0x50, 0x01, 0x51, 0x01, 0x52, 0x01, 0x53, \n\t0x01, 0x54, 0x01, 0x55, 0x01, 0x56, 0x01, 0x57, 0x01, 0x58, 0x00, 0xfb, \n\t0x00, 0xfc, 0x00, 0xe4, 0x00, 0xe5, 0x01, 0x59, 0x01, 0x5a, 0x01, 0x5b, \n\t0x01, 0x5c, 0x01, 0x5d, 0x01, 0x5e, 0x01, 0x5f, 0x01, 0x60, 0x01, 0x61, \n\t0x01, 0x62, 0x01, 0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x66, 0x01, 0x67, \n\t0x01, 0x68, 0x01, 0x69, 0x01, 0x6a, 0x01, 0x6b, 0x01, 0x6c, 0x01, 0x6d, \n\t0x01, 0x6e, 0x00, 0xbb, 0x01, 0x6f, 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, \n\t0x00, 0xe6, 0x00, 0xe7, 0x01, 0x73, 0x00, 0xa6, 0x01, 0x74, 0x01, 0x75, \n\t0x01, 0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, \n\t0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x80, 0x01, 0x81, \n\t0x01, 0x82, 0x00, 0xd8, 0x00, 0xe1, 0x00, 0xdb, 0x00, 0xdc, 0x00, 0xdd, \n\t0x00, 0xe0, 0x00, 0xd9, 0x00, 0xdf, 0x01, 0x83, 0x01, 0x84, 0x01, 0x85, \n\t0x01, 0x86, 0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, 0x8a, 0x01, 0x8b, \n\t0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x8f, 0x01, 0x90, 0x01, 0x91, \n\t0x01, 0x92, 0x01, 0x93, 0x01, 0x94, 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, \n\t0x01, 0x98, 0x01, 0x99, 0x01, 0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, \n\t0x01, 0x9e, 0x01, 0x9f, 0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, 0xa3, \n\t0x01, 0xa4, 0x01, 0xa5, 0x01, 0xa6, 0x01, 0xa7, 0x01, 0xa8, 0x01, 0xa9, \n\t0x01, 0xaa, 0x01, 0xab, 0x00, 0x9f, 0x01, 0xac, 0x01, 0xad, 0x01, 0xae, \n\t0x01, 0xaf, 0x01, 0xb0, 0x01, 0xb1, 0x01, 0xb2, 0x01, 0xb3, 0x01, 0xb4, \n\t0x01, 0xb5, 0x01, 0xb6, 0x01, 0xb7, 0x01, 0xb8, 0x01, 0xb9, 0x01, 0xba, \n\t0x01, 0xbb, 0x01, 0xbc, 0x01, 0xbd, 0x01, 0xbe, 0x01, 0xbf, 0x01, 0xc0, \n\t0x01, 0xc1, 0x00, 0x9b, 0x01, 0xc2, 0x01, 0xc3, 0x01, 0xc4, 0x01, 0xc5, \n\t0x01, 0xc6, 0x01, 0xc7, 0x01, 0xc8, 0x01, 0xc9, 0x01, 0xca, 0x01, 0xcb, \n\t0x01, 0xcc, 0x01, 0xcd, 0x01, 0xce, 0x01, 0xcf, 0x01, 0xd0, 0x01, 0xd1, \n\t0x01, 0xd2, 0x01, 0xd3, 0x01, 0xd4, 0x01, 0xd5, 0x01, 0xd6, 0x01, 0xd7, \n\t0x01, 0xd8, 0x01, 0xd9, 0x01, 0xda, 0x01, 0xdb, 0x01, 0xdc, 0x01, 0xdd, \n\t0x01, 0xde, 0x01, 0xdf, 0x01, 0xe0, 0x01, 0xe1, 0x01, 0xe2, 0x01, 0xe3, \n\t0x01, 0xe4, 0x01, 0xe5, 0x01, 0xe6, 0x01, 0xe7, 0x01, 0xe8, 0x01, 0xe9, \n\t0x01, 0xea, 0x01, 0xeb, 0x01, 0xec, 0x01, 0xed, 0x01, 0xee, 0x01, 0xef, \n\t0x01, 0xf0, 0x01, 0xf1, 0x01, 0xf2, 0x01, 0xf3, 0x01, 0xf4, 0x01, 0xf5, \n\t0x01, 0xf6, 0x01, 0xf7, 0x01, 0xf8, 0x01, 0xf9, 0x01, 0xfa, 0x01, 0xfb, \n\t0x01, 0xfc, 0x01, 0xfd, 0x01, 0xfe, 0x01, 0xff, 0x02, 0x00, 0x02, 0x01, \n\t0x02, 0x02, 0x02, 0x03, 0x02, 0x04, 0x02, 0x05, 0x02, 0x06, 0x02, 0x07, \n\t0x02, 0x08, 0x02, 0x09, 0x02, 0x0a, 0x02, 0x0b, 0x02, 0x0c, 0x02, 0x0d, \n\t0x02, 0x0e, 0x02, 0x0f, 0x02, 0x10, 0x02, 0x11, 0x02, 0x12, 0x02, 0x13, \n\t0x02, 0x14, 0x02, 0x15, 0x02, 0x16, 0x02, 0x17, 0x02, 0x18, 0x02, 0x19, \n\t0x02, 0x1a, 0x02, 0x1b, 0x02, 0x1c, 0x02, 0x1d, 0x02, 0x1e, 0x02, 0x1f, \n\t0x02, 0x20, 0x02, 0x21, 0x02, 0x22, 0x02, 0x23, 0x02, 0x24, 0x02, 0x25, \n\t0x02, 0x26, 0x02, 0x27, 0x02, 0x28, 0x02, 0x29, 0x02, 0x2a, 0x02, 0x2b, \n\t0x02, 0x2c, 0x02, 0x2d, 0x02, 0x2e, 0x02, 0x2f, 0x02, 0x30, 0x02, 0x31, \n\t0x02, 0x32, 0x02, 0x33, 0x02, 0x34, 0x02, 0x35, 0x02, 0x36, 0x02, 0x37, \n\t0x02, 0x38, 0x02, 0x39, 0x02, 0x3a, 0x02, 0x3b, 0x02, 0x3c, 0x02, 0x3d, \n\t0x02, 0x3e, 0x02, 0x3f, 0x02, 0x40, 0x02, 0x41, 0x02, 0x42, 0x02, 0x43, \n\t0x02, 0x44, 0x02, 0x45, 0x02, 0x46, 0x02, 0x47, 0x02, 0x48, 0x02, 0x49, \n\t0x02, 0x4a, 0x02, 0x4b, 0x02, 0x4c, 0x02, 0x4d, 0x02, 0x4e, 0x02, 0x4f, \n\t0x02, 0x50, 0x02, 0x51, 0x02, 0x52, 0x02, 0x53, 0x02, 0x54, 0x02, 0x55, \n\t0x02, 0x56, 0x02, 0x57, 0x02, 0x58, 0x02, 0x59, 0x02, 0x5a, 0x02, 0x5b, \n\t0x02, 0x5c, 0x02, 0x5d, 0x02, 0x5e, 0x02, 0x5f, 0x02, 0x60, 0x02, 0x61, \n\t0x02, 0x62, 0x02, 0x63, 0x02, 0x64, 0x02, 0x65, 0x02, 0x66, 0x02, 0x67, \n\t0x02, 0x68, 0x02, 0x69, 0x02, 0x6a, 0x02, 0x6b, 0x02, 0x6c, 0x02, 0x6d, \n\t0x02, 0x6e, 0x02, 0x6f, 0x02, 0x70, 0x02, 0x71, 0x02, 0x72, 0x02, 0x73, \n\t0x02, 0x74, 0x02, 0x75, 0x02, 0x76, 0x02, 0x77, 0x02, 0x78, 0x02, 0x79, \n\t0x02, 0x7a, 0x02, 0x7b, 0x02, 0x7c, 0x02, 0x7d, 0x02, 0x7e, 0x02, 0x7f, \n\t0x02, 0x80, 0x02, 0x81, 0x02, 0x82, 0x02, 0x83, 0x02, 0x84, 0x02, 0x85, \n\t0x02, 0x86, 0x02, 0x87, 0x02, 0x88, 0x02, 0x89, 0x02, 0x8a, 0x02, 0x8b, \n\t0x02, 0x8c, 0x02, 0x8d, 0x02, 0x8e, 0x02, 0x8f, 0x02, 0x90, 0x02, 0x91, \n\t0x02, 0x92, 0x02, 0x93, 0x02, 0x94, 0x02, 0x95, 0x02, 0x96, 0x02, 0x97, \n\t0x02, 0x98, 0x02, 0x99, 0x02, 0x9a, 0x02, 0x9b, 0x02, 0x9c, 0x02, 0x9d, \n\t0x02, 0x9e, 0x02, 0x9f, 0x02, 0xa0, 0x02, 0xa1, 0x02, 0xa2, 0x02, 0xa3, \n\t0x02, 0xa4, 0x02, 0xa5, 0x02, 0xa6, 0x02, 0xa7, 0x02, 0xa8, 0x02, 0xa9, \n\t0x02, 0xaa, 0x02, 0xab, 0x02, 0xac, 0x02, 0xad, 0x02, 0xae, 0x02, 0xaf, \n\t0x02, 0xb0, 0x02, 0xb1, 0x02, 0xb2, 0x02, 0xb3, 0x02, 0xb4, 0x02, 0xb5, \n\t0x02, 0xb6, 0x02, 0xb7, 0x02, 0xb8, 0x02, 0xb9, 0x02, 0xba, 0x02, 0xbb, \n\t0x02, 0xbc, 0x02, 0xbd, 0x02, 0xbe, 0x02, 0xbf, 0x02, 0xc0, 0x02, 0xc1, \n\t0x02, 0xc2, 0x02, 0xc3, 0x02, 0xc4, 0x02, 0xc5, 0x02, 0xc6, 0x02, 0xc7, \n\t0x02, 0xc8, 0x02, 0xc9, 0x02, 0xca, 0x02, 0xcb, 0x02, 0xcc, 0x02, 0xcd, \n\t0x02, 0xce, 0x02, 0xcf, 0x02, 0xd0, 0x02, 0xd1, 0x02, 0xd2, 0x02, 0xd3, \n\t0x02, 0xd4, 0x02, 0xd5, 0x02, 0xd6, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd9, \n\t0x02, 0xda, 0x02, 0xdb, 0x02, 0xdc, 0x02, 0xdd, 0x02, 0xde, 0x02, 0xdf, \n\t0x02, 0xe0, 0x02, 0xe1, 0x02, 0xe2, 0x02, 0xe3, 0x02, 0xe4, 0x02, 0xe5, \n\t0x02, 0xe6, 0x02, 0xe7, 0x02, 0xe8, 0x02, 0xe9, 0x02, 0xea, 0x02, 0xeb, \n\t0x02, 0xec, 0x02, 0xed, 0x02, 0xee, 0x02, 0xef, 0x02, 0xf0, 0x02, 0xf1, \n\t0x02, 0xf2, 0x02, 0xf3, 0x02, 0xf4, 0x02, 0xf5, 0x02, 0xf6, 0x02, 0xf7, \n\t0x02, 0xf8, 0x02, 0xf9, 0x02, 0xfa, 0x02, 0xfb, 0x02, 0xfc, 0x02, 0xfd, \n\t0x02, 0xfe, 0x02, 0xff, 0x03, 0x00, 0x03, 0x01, 0x03, 0x02, 0x03, 0x03, \n\t0x03, 0x04, 0x03, 0x05, 0x03, 0x06, 0x03, 0x07, 0x03, 0x08, 0x03, 0x09, \n\t0x03, 0x0a, 0x03, 0x0b, 0x03, 0x0c, 0x03, 0x0d, 0x03, 0x0e, 0x03, 0x0f, \n\t0x03, 0x10, 0x03, 0x11, 0x03, 0x12, 0x03, 0x13, 0x03, 0x14, 0x03, 0x15, \n\t0x03, 0x16, 0x03, 0x17, 0x03, 0x18, 0x03, 0x19, 0x03, 0x1a, 0x00, 0xb2, \n\t0x00, 0xb3, 0x03, 0x1b, 0x03, 0x1c, 0x00, 0xb6, 0x00, 0xb7, 0x00, 0xc4, \n\t0x03, 0x1d, 0x00, 0xb4, 0x00, 0xb5, 0x00, 0xc5, 0x00, 0x82, 0x00, 0xc2, \n\t0x00, 0x87, 0x03, 0x1e, 0x00, 0xab, 0x00, 0xc6, 0x03, 0x1f, 0x03, 0x20, \n\t0x00, 0xbe, 0x00, 0xbf, 0x03, 0x21, 0x00, 0xbc, 0x03, 0x22, 0x03, 0x23, \n\t0x00, 0xf7, 0x03, 0x24, 0x03, 0x25, 0x03, 0x26, 0x03, 0x27, 0x03, 0x28, \n\t0x03, 0x29, 0x03, 0x2a, 0x00, 0x8c, 0x03, 0x2b, 0x03, 0x2c, 0x03, 0x2d, \n\t0x03, 0x2e, 0x03, 0x2f, 0x00, 0x98, 0x00, 0x9a, 0x00, 0x99, 0x00, 0xef, \n\t0x00, 0xa5, 0x00, 0x92, 0x00, 0x9c, 0x00, 0xa7, 0x00, 0x8f, 0x00, 0x94, \n\t0x00, 0x95, 0x00, 0xb9, 0x03, 0x30, 0x00, 0xc0, 0x03, 0x31, 0x03, 0x32, \n\t0x03, 0x33, 0x03, 0x34, 0x03, 0x35, 0x03, 0x36, 0x03, 0x37, 0x03, 0x38, \n\t0x03, 0x39, 0x03, 0x3a, 0x03, 0x3b, 0x03, 0x3c, 0x03, 0x3d, 0x03, 0x3e, \n\t0x03, 0x3f, 0x03, 0x40, 0x03, 0x41, 0x03, 0x42, 0x03, 0x43, 0x03, 0x44, \n\t0x03, 0x45, 0x03, 0x46, 0x03, 0x47, 0x03, 0x48, 0x03, 0x49, 0x03, 0x4a, \n\t0x03, 0x4b, 0x03, 0x4c, 0x03, 0x4d, 0x03, 0x4e, 0x03, 0x4f, 0x03, 0x50, \n\t0x03, 0x51, 0x03, 0x52, 0x03, 0x53, 0x03, 0x54, 0x03, 0x55, 0x03, 0x56, \n\t0x03, 0x57, 0x03, 0x58, 0x03, 0x59, 0x03, 0x5a, 0x03, 0x5b, 0x03, 0x5c, \n\t0x03, 0x5d, 0x03, 0x5e, 0x03, 0x5f, 0x03, 0x60, 0x03, 0x61, 0x03, 0x62, \n\t0x03, 0x63, 0x03, 0x64, 0x03, 0x65, 0x03, 0x66, 0x03, 0x67, 0x03, 0x68, \n\t0x03, 0x69, 0x03, 0x6a, 0x03, 0x6b, 0x03, 0x6c, 0x03, 0x6d, 0x03, 0x6e, \n\t0x03, 0x6f, 0x03, 0x70, 0x03, 0x71, 0x03, 0x72, 0x03, 0x73, 0x03, 0x74, \n\t0x03, 0x75, 0x03, 0x76, 0x03, 0x77, 0x03, 0x78, 0x03, 0x79, 0x03, 0x7a, \n\t0x03, 0x7b, 0x03, 0x7c, 0x03, 0x7d, 0x03, 0x7e, 0x03, 0x7f, 0x03, 0x80, \n\t0x03, 0x81, 0x03, 0x82, 0x03, 0x83, 0x03, 0x84, 0x03, 0x85, 0x03, 0x86, \n\t0x03, 0x87, 0x03, 0x88, 0x03, 0x89, 0x03, 0x8a, 0x03, 0x8b, 0x03, 0x8c, \n\t0x03, 0x8d, 0x03, 0x8e, 0x03, 0x8f, 0x03, 0x90, 0x03, 0x91, 0x03, 0x92, \n\t0x03, 0x93, 0x03, 0x94, 0x03, 0x95, 0x03, 0x96, 0x03, 0x97, 0x03, 0x98, \n\t0x03, 0x99, 0x03, 0x9a, 0x03, 0x9b, 0x03, 0x9c, 0x03, 0x9d, 0x03, 0x9e, \n\t0x03, 0x9f, 0x03, 0xa0, 0x03, 0xa1, 0x03, 0xa2, 0x03, 0xa3, 0x03, 0xa4, \n\t0x03, 0xa5, 0x03, 0xa6, 0x03, 0xa7, 0x03, 0xa8, 0x03, 0xa9, 0x03, 0xaa, \n\t0x03, 0xab, 0x03, 0xac, 0x03, 0xad, 0x03, 0xae, 0x03, 0xaf, 0x03, 0xb0, \n\t0x03, 0xb1, 0x03, 0xb2, 0x03, 0xb3, 0x03, 0xb4, 0x03, 0xb5, 0x03, 0xb6, \n\t0x03, 0xb7, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xbb, 0x03, 0xbc, \n\t0x03, 0xbd, 0x03, 0xbe, 0x03, 0xbf, 0x03, 0xc0, 0x03, 0xc1, 0x03, 0xc2, \n\t0x03, 0xc3, 0x03, 0xc4, 0x03, 0xc5, 0x03, 0xc6, 0x03, 0xc7, 0x03, 0xc8, \n\t0x03, 0xc9, 0x03, 0xca, 0x03, 0xcb, 0x03, 0xcc, 0x03, 0xcd, 0x03, 0xce, \n\t0x03, 0xcf, 0x03, 0xd0, 0x03, 0xd1, 0x03, 0xd2, 0x03, 0xd3, 0x03, 0xd4, \n\t0x03, 0xd5, 0x03, 0xd6, 0x03, 0xd7, 0x03, 0xd8, 0x03, 0xd9, 0x03, 0xda, \n\t0x03, 0xdb, 0x03, 0xdc, 0x03, 0xdd, 0x03, 0xde, 0x03, 0xdf, 0x03, 0xe0, \n\t0x03, 0xe1, 0x03, 0xe2, 0x03, 0xe3, 0x03, 0xe4, 0x03, 0xe5, 0x03, 0xe6, \n\t0x03, 0xe7, 0x03, 0xe8, 0x03, 0xe9, 0x03, 0xea, 0x03, 0xeb, 0x03, 0xec, \n\t0x03, 0xed, 0x03, 0xee, 0x03, 0xef, 0x03, 0xf0, 0x03, 0xf1, 0x03, 0xf2, \n\t0x03, 0xf3, 0x03, 0xf4, 0x03, 0xf5, 0x03, 0xf6, 0x03, 0xf7, 0x03, 0xf8, \n\t0x03, 0xf9, 0x03, 0xfa, 0x03, 0xfb, 0x03, 0xfc, 0x03, 0xfd, 0x03, 0xfe, \n\t0x03, 0xff, 0x04, 0x00, 0x04, 0x01, 0x04, 0x02, 0x04, 0x03, 0x04, 0x04, \n\t0x04, 0x05, 0x04, 0x06, 0x04, 0x07, 0x04, 0x08, 0x04, 0x09, 0x04, 0x0a, \n\t0x04, 0x0b, 0x04, 0x0c, 0x04, 0x0d, 0x04, 0x0e, 0x04, 0x0f, 0x04, 0x10, \n\t0x04, 0x11, 0x04, 0x12, 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x30, 0x41, 0x44, 0x06, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, \n\t0x0e, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x63, 0x65, 0x6e, 0x74, 0x65, \n\t0x72, 0x65, 0x64, 0x07, 0x41, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x07, \n\t0x61, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x06, 0x41, 0x62, 0x72, 0x65, \n\t0x76, 0x65, 0x06, 0x61, 0x62, 0x72, 0x65, 0x76, 0x65, 0x07, 0x41, 0x6f, \n\t0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x07, 0x61, 0x6f, 0x67, 0x6f, 0x6e, 0x65, \n\t0x6b, 0x0b, 0x43, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, \n\t0x78, 0x0b, 0x63, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, \n\t0x78, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x30, 0x41, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x31, 0x30, 0x42, 0x06, 0x44, 0x63, 0x61, 0x72, 0x6f, 0x6e, \n\t0x06, 0x64, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x44, 0x63, 0x72, 0x6f, \n\t0x61, 0x74, 0x06, 0x64, 0x63, 0x72, 0x6f, 0x61, 0x74, 0x07, 0x45, 0x6d, \n\t0x61, 0x63, 0x72, 0x6f, 0x6e, 0x07, 0x65, 0x6d, 0x61, 0x63, 0x72, 0x6f, \n\t0x6e, 0x06, 0x45, 0x62, 0x72, 0x65, 0x76, 0x65, 0x06, 0x65, 0x62, 0x72, \n\t0x65, 0x76, 0x65, 0x0a, 0x45, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, \n\t0x6e, 0x74, 0x0a, 0x65, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, \n\t0x74, 0x07, 0x45, 0x6f, 0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x07, 0x65, 0x6f, \n\t0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x06, 0x45, 0x63, 0x61, 0x72, 0x6f, 0x6e, \n\t0x06, 0x65, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x0b, 0x47, 0x63, 0x69, 0x72, \n\t0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0b, 0x67, 0x63, 0x69, 0x72, \n\t0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x07, 0x75, 0x6e, 0x69, 0x30, \n\t0x31, 0x32, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x32, 0x31, 0x0c, \n\t0x47, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, \n\t0x0c, 0x67, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, \n\t0x74, 0x0b, 0x48, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, \n\t0x78, 0x0b, 0x68, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, \n\t0x78, 0x04, 0x48, 0x62, 0x61, 0x72, 0x04, 0x68, 0x62, 0x61, 0x72, 0x06, \n\t0x49, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x06, 0x69, 0x74, 0x69, 0x6c, 0x64, \n\t0x65, 0x07, 0x49, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x07, 0x69, 0x6d, \n\t0x61, 0x63, 0x72, 0x6f, 0x6e, 0x06, 0x49, 0x62, 0x72, 0x65, 0x76, 0x65, \n\t0x06, 0x69, 0x62, 0x72, 0x65, 0x76, 0x65, 0x07, 0x49, 0x6f, 0x67, 0x6f, \n\t0x6e, 0x65, 0x6b, 0x07, 0x69, 0x6f, 0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x0a, \n\t0x49, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x02, 0x49, \n\t0x4a, 0x02, 0x69, 0x6a, 0x0b, 0x4a, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, \n\t0x66, 0x6c, 0x65, 0x78, 0x0b, 0x6a, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, \n\t0x66, 0x6c, 0x65, 0x78, 0x0c, 0x4b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, \n\t0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x6b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, \n\t0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x6b, 0x67, 0x72, 0x65, 0x65, \n\t0x6e, 0x6c, 0x61, 0x6e, 0x64, 0x69, 0x63, 0x06, 0x4c, 0x61, 0x63, 0x75, \n\t0x74, 0x65, 0x06, 0x6c, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0c, 0x4c, 0x63, \n\t0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x6c, \n\t0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x06, \n\t0x4c, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x6c, 0x63, 0x61, 0x72, 0x6f, \n\t0x6e, 0x04, 0x4c, 0x64, 0x6f, 0x74, 0x04, 0x6c, 0x64, 0x6f, 0x74, 0x06, \n\t0x4e, 0x61, 0x63, 0x75, 0x74, 0x65, 0x06, 0x6e, 0x61, 0x63, 0x75, 0x74, \n\t0x65, 0x0c, 0x4e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, \n\t0x6e, 0x74, 0x0c, 0x6e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, \n\t0x65, 0x6e, 0x74, 0x06, 0x4e, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x6e, \n\t0x63, 0x61, 0x72, 0x6f, 0x6e, 0x0b, 0x6e, 0x61, 0x70, 0x6f, 0x73, 0x74, \n\t0x72, 0x6f, 0x70, 0x68, 0x65, 0x03, 0x45, 0x6e, 0x67, 0x03, 0x65, 0x6e, \n\t0x67, 0x07, 0x4f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x07, 0x6f, 0x6d, \n\t0x61, 0x63, 0x72, 0x6f, 0x6e, 0x06, 0x4f, 0x62, 0x72, 0x65, 0x76, 0x65, \n\t0x06, 0x6f, 0x62, 0x72, 0x65, 0x76, 0x65, 0x0d, 0x4f, 0x68, 0x75, 0x6e, \n\t0x67, 0x61, 0x72, 0x75, 0x6d, 0x6c, 0x61, 0x75, 0x74, 0x0d, 0x6f, 0x68, \n\t0x75, 0x6e, 0x67, 0x61, 0x72, 0x75, 0x6d, 0x6c, 0x61, 0x75, 0x74, 0x06, \n\t0x52, 0x61, 0x63, 0x75, 0x74, 0x65, 0x06, 0x72, 0x61, 0x63, 0x75, 0x74, \n\t0x65, 0x0c, 0x52, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, \n\t0x6e, 0x74, 0x0c, 0x72, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, \n\t0x65, 0x6e, 0x74, 0x06, 0x52, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x72, \n\t0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x53, 0x61, 0x63, 0x75, 0x74, 0x65, \n\t0x06, 0x73, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0b, 0x53, 0x63, 0x69, 0x72, \n\t0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0b, 0x73, 0x63, 0x69, 0x72, \n\t0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0c, 0x54, 0x63, 0x6f, 0x6d, \n\t0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x74, 0x63, 0x6f, \n\t0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x06, 0x54, 0x63, \n\t0x61, 0x72, 0x6f, 0x6e, 0x06, 0x74, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x04, \n\t0x54, 0x62, 0x61, 0x72, 0x04, 0x74, 0x62, 0x61, 0x72, 0x06, 0x55, 0x74, \n\t0x69, 0x6c, 0x64, 0x65, 0x06, 0x75, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x07, \n\t0x55, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x07, 0x75, 0x6d, 0x61, 0x63, \n\t0x72, 0x6f, 0x6e, 0x06, 0x55, 0x62, 0x72, 0x65, 0x76, 0x65, 0x06, 0x75, \n\t0x62, 0x72, 0x65, 0x76, 0x65, 0x05, 0x55, 0x72, 0x69, 0x6e, 0x67, 0x05, \n\t0x75, 0x72, 0x69, 0x6e, 0x67, 0x0d, 0x55, 0x68, 0x75, 0x6e, 0x67, 0x61, \n\t0x72, 0x75, 0x6d, 0x6c, 0x61, 0x75, 0x74, 0x0d, 0x75, 0x68, 0x75, 0x6e, \n\t0x67, 0x61, 0x72, 0x75, 0x6d, 0x6c, 0x61, 0x75, 0x74, 0x07, 0x55, 0x6f, \n\t0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x07, 0x75, 0x6f, 0x67, 0x6f, 0x6e, 0x65, \n\t0x6b, 0x0b, 0x57, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, \n\t0x78, 0x0b, 0x77, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, \n\t0x78, 0x0b, 0x59, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, \n\t0x78, 0x0b, 0x79, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, \n\t0x78, 0x06, 0x5a, 0x61, 0x63, 0x75, 0x74, 0x65, 0x06, 0x7a, 0x61, 0x63, \n\t0x75, 0x74, 0x65, 0x0a, 0x5a, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, \n\t0x6e, 0x74, 0x0a, 0x7a, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, \n\t0x74, 0x05, 0x6c, 0x6f, 0x6e, 0x67, 0x73, 0x05, 0x4f, 0x68, 0x6f, 0x72, \n\t0x6e, 0x05, 0x6f, 0x68, 0x6f, 0x72, 0x6e, 0x05, 0x55, 0x68, 0x6f, 0x72, \n\t0x6e, 0x05, 0x75, 0x68, 0x6f, 0x72, 0x6e, 0x07, 0x75, 0x6e, 0x69, 0x30, \n\t0x31, 0x46, 0x30, 0x0a, 0x41, 0x72, 0x69, 0x6e, 0x67, 0x61, 0x63, 0x75, \n\t0x74, 0x65, 0x0a, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x61, 0x63, 0x75, 0x74, \n\t0x65, 0x07, 0x41, 0x45, 0x61, 0x63, 0x75, 0x74, 0x65, 0x07, 0x61, 0x65, \n\t0x61, 0x63, 0x75, 0x74, 0x65, 0x0b, 0x4f, 0x73, 0x6c, 0x61, 0x73, 0x68, \n\t0x61, 0x63, 0x75, 0x74, 0x65, 0x0b, 0x6f, 0x73, 0x6c, 0x61, 0x73, 0x68, \n\t0x61, 0x63, 0x75, 0x74, 0x65, 0x0c, 0x53, 0x63, 0x6f, 0x6d, 0x6d, 0x61, \n\t0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x73, 0x63, 0x6f, 0x6d, 0x6d, \n\t0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x07, 0x75, 0x6e, 0x69, 0x30, \n\t0x32, 0x33, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, 0x43, 0x07, \n\t0x75, 0x6e, 0x69, 0x30, 0x32, 0x46, 0x33, 0x09, 0x67, 0x72, 0x61, 0x76, \n\t0x65, 0x63, 0x6f, 0x6d, 0x62, 0x09, 0x61, 0x63, 0x75, 0x74, 0x65, 0x63, \n\t0x6f, 0x6d, 0x62, 0x09, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x63, 0x6f, 0x6d, \n\t0x62, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, \n\t0x30, 0x46, 0x08, 0x64, 0x6f, 0x74, 0x62, 0x65, 0x6c, 0x6f, 0x77, 0x05, \n\t0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0d, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, \n\t0x69, 0x73, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0a, 0x41, 0x6c, 0x70, 0x68, \n\t0x61, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x09, 0x61, 0x6e, 0x6f, 0x74, 0x65, \n\t0x6c, 0x65, 0x69, 0x61, 0x0c, 0x45, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, \n\t0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x08, 0x45, 0x74, 0x61, 0x74, 0x6f, 0x6e, \n\t0x6f, 0x73, 0x09, 0x49, 0x6f, 0x74, 0x61, 0x74, 0x6f, 0x6e, 0x6f, 0x73, \n\t0x0c, 0x4f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x6e, 0x74, 0x6f, 0x6e, 0x6f, \n\t0x73, 0x0c, 0x55, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x74, 0x6f, 0x6e, \n\t0x6f, 0x73, 0x0a, 0x4f, 0x6d, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x6e, 0x6f, \n\t0x73, 0x11, 0x69, 0x6f, 0x74, 0x61, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, \n\t0x69, 0x73, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x05, 0x41, 0x6c, 0x70, 0x68, \n\t0x61, 0x04, 0x42, 0x65, 0x74, 0x61, 0x05, 0x47, 0x61, 0x6d, 0x6d, 0x61, \n\t0x05, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x07, 0x45, 0x70, 0x73, 0x69, 0x6c, \n\t0x6f, 0x6e, 0x04, 0x5a, 0x65, 0x74, 0x61, 0x03, 0x45, 0x74, 0x61, 0x05, \n\t0x54, 0x68, 0x65, 0x74, 0x61, 0x04, 0x49, 0x6f, 0x74, 0x61, 0x05, 0x4b, \n\t0x61, 0x70, 0x70, 0x61, 0x06, 0x4c, 0x61, 0x6d, 0x62, 0x64, 0x61, 0x02, \n\t0x4d, 0x75, 0x02, 0x4e, 0x75, 0x02, 0x58, 0x69, 0x07, 0x4f, 0x6d, 0x69, \n\t0x63, 0x72, 0x6f, 0x6e, 0x02, 0x50, 0x69, 0x03, 0x52, 0x68, 0x6f, 0x05, \n\t0x53, 0x69, 0x67, 0x6d, 0x61, 0x03, 0x54, 0x61, 0x75, 0x07, 0x55, 0x70, \n\t0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x03, 0x50, 0x68, 0x69, 0x03, 0x43, 0x68, \n\t0x69, 0x03, 0x50, 0x73, 0x69, 0x0c, 0x49, 0x6f, 0x74, 0x61, 0x64, 0x69, \n\t0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x0f, 0x55, 0x70, 0x73, 0x69, 0x6c, \n\t0x6f, 0x6e, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x0a, 0x61, \n\t0x6c, 0x70, 0x68, 0x61, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0c, 0x65, 0x70, \n\t0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x08, 0x65, \n\t0x74, 0x61, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x09, 0x69, 0x6f, 0x74, 0x61, \n\t0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x14, 0x75, 0x70, 0x73, 0x69, 0x6c, 0x6f, \n\t0x6e, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x74, 0x6f, 0x6e, \n\t0x6f, 0x73, 0x05, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x04, 0x62, 0x65, 0x74, \n\t0x61, 0x05, 0x67, 0x61, 0x6d, 0x6d, 0x61, 0x05, 0x64, 0x65, 0x6c, 0x74, \n\t0x61, 0x07, 0x65, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x04, 0x7a, 0x65, \n\t0x74, 0x61, 0x03, 0x65, 0x74, 0x61, 0x05, 0x74, 0x68, 0x65, 0x74, 0x61, \n\t0x04, 0x69, 0x6f, 0x74, 0x61, 0x05, 0x6b, 0x61, 0x70, 0x70, 0x61, 0x06, \n\t0x6c, 0x61, 0x6d, 0x62, 0x64, 0x61, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, \n\t0x42, 0x43, 0x02, 0x6e, 0x75, 0x02, 0x78, 0x69, 0x07, 0x6f, 0x6d, 0x69, \n\t0x63, 0x72, 0x6f, 0x6e, 0x03, 0x72, 0x68, 0x6f, 0x06, 0x73, 0x69, 0x67, \n\t0x6d, 0x61, 0x31, 0x05, 0x73, 0x69, 0x67, 0x6d, 0x61, 0x03, 0x74, 0x61, \n\t0x75, 0x07, 0x75, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x03, 0x70, 0x68, \n\t0x69, 0x03, 0x63, 0x68, 0x69, 0x03, 0x70, 0x73, 0x69, 0x05, 0x6f, 0x6d, \n\t0x65, 0x67, 0x61, 0x0c, 0x69, 0x6f, 0x74, 0x61, 0x64, 0x69, 0x65, 0x72, \n\t0x65, 0x73, 0x69, 0x73, 0x0f, 0x75, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, \n\t0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x0c, 0x6f, 0x6d, 0x69, \n\t0x63, 0x72, 0x6f, 0x6e, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0c, 0x75, 0x70, \n\t0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0a, 0x6f, \n\t0x6d, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x33, 0x44, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x44, \n\t0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x44, 0x36, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, \n\t0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x33, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, \n\t0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x36, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, \n\t0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x39, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, \n\t0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x44, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, \n\t0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x30, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x31, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, \n\t0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x33, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, \n\t0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x38, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x31, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, \n\t0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x42, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x31, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, \n\t0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x45, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x31, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, \n\t0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x31, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x32, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, \n\t0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x36, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x32, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, \n\t0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x44, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x32, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, \n\t0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x32, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x33, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, \n\t0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x38, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x33, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, \n\t0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x42, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x33, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, \n\t0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x45, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x33, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, \n\t0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x31, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x34, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, \n\t0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x35, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x34, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, \n\t0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x38, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x34, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, \n\t0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x43, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x34, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, \n\t0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x46, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x35, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, \n\t0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x32, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x35, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, \n\t0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x35, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x35, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, \n\t0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x38, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x35, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, \n\t0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x42, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x35, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, \n\t0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x45, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x35, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, \n\t0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x36, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x36, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, \n\t0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x39, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x36, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, \n\t0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x43, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x36, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, \n\t0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x46, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x37, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, \n\t0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x35, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x37, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, \n\t0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x39, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x37, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, \n\t0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x30, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x38, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, \n\t0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x33, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x38, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, \n\t0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x36, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x38, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, \n\t0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x41, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x38, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, \n\t0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x30, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x39, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, \n\t0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x33, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x39, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, \n\t0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x43, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x39, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, \n\t0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x46, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x41, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, \n\t0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x34, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x41, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, \n\t0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x44, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x41, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, \n\t0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x30, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x42, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, \n\t0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x33, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x42, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, \n\t0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x36, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x42, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, \n\t0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x39, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x42, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, \n\t0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x43, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x42, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, \n\t0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x35, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x43, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, \n\t0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x38, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x43, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, \n\t0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x42, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x43, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, \n\t0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x45, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x43, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, \n\t0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x31, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x44, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, \n\t0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x34, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x44, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, \n\t0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x37, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x44, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, \n\t0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x41, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x44, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, \n\t0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x44, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x44, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, \n\t0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x30, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x45, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, \n\t0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x33, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x45, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, \n\t0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x36, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x45, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, \n\t0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x44, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x45, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, \n\t0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x33, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x46, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, \n\t0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x36, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x46, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, \n\t0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x39, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x46, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, \n\t0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x43, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x46, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, \n\t0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x46, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x35, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, \n\t0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x32, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x35, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, \n\t0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x35, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x35, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, \n\t0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x38, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x35, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, \n\t0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x42, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x35, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, \n\t0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x45, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x35, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, \n\t0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, 0x31, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x35, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, \n\t0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x30, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, \n\t0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x46, 0x06, 0x57, 0x67, \n\t0x72, 0x61, 0x76, 0x65, 0x06, 0x77, 0x67, 0x72, 0x61, 0x76, 0x65, 0x06, \n\t0x57, 0x61, 0x63, 0x75, 0x74, 0x65, 0x06, 0x77, 0x61, 0x63, 0x75, 0x74, \n\t0x65, 0x09, 0x57, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x09, \n\t0x77, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x41, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, \n\t0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x32, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x41, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, \n\t0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x35, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x41, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, \n\t0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x38, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x41, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, \n\t0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x42, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x41, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, \n\t0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x45, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x41, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, \n\t0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x31, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x42, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, \n\t0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x34, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x42, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, \n\t0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x37, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x42, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, \n\t0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x41, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x42, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, \n\t0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x44, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x42, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, \n\t0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x30, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x43, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, \n\t0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x33, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x43, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, \n\t0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x36, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x43, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, \n\t0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x39, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x43, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, \n\t0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x43, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x43, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, \n\t0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x46, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x44, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, \n\t0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x32, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x44, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, \n\t0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x35, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x44, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, \n\t0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x38, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x44, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, \n\t0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x42, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x44, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, \n\t0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x45, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x44, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, \n\t0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x31, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x45, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, \n\t0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x34, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x45, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, \n\t0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x37, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x45, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, \n\t0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x41, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x45, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, \n\t0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x44, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x45, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, \n\t0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x46, 0x30, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x46, 0x31, 0x06, 0x59, 0x67, 0x72, 0x61, 0x76, 0x65, \n\t0x06, 0x79, 0x67, 0x72, 0x61, 0x76, 0x65, 0x07, 0x75, 0x6e, 0x69, 0x31, \n\t0x45, 0x46, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x46, 0x35, 0x07, \n\t0x75, 0x6e, 0x69, 0x31, 0x45, 0x46, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, \n\t0x45, 0x46, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x46, 0x38, 0x07, \n\t0x75, 0x6e, 0x69, 0x31, 0x45, 0x46, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, \n\t0x46, 0x34, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x30, 0x07, \n\t0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, \n\t0x30, 0x30, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x33, 0x07, \n\t0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, \n\t0x30, 0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x36, 0x07, \n\t0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, \n\t0x30, 0x30, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x39, 0x07, \n\t0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, \n\t0x30, 0x30, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x31, 0x35, 0x0d, \n\t0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x64, 0x62, \n\t0x6c, 0x0d, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x72, 0x65, 0x76, 0x65, 0x72, \n\t0x73, 0x65, 0x64, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x32, 0x35, 0x06, \n\t0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x06, 0x73, 0x65, 0x63, 0x6f, 0x6e, \n\t0x64, 0x09, 0x65, 0x78, 0x63, 0x6c, 0x61, 0x6d, 0x64, 0x62, 0x6c, 0x07, \n\t0x75, 0x6e, 0x69, 0x32, 0x30, 0x37, 0x34, 0x09, 0x6e, 0x73, 0x75, 0x70, \n\t0x65, 0x72, 0x69, 0x6f, 0x72, 0x04, 0x6c, 0x69, 0x72, 0x61, 0x06, 0x70, \n\t0x65, 0x73, 0x65, 0x74, 0x61, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x41, \n\t0x42, 0x04, 0x45, 0x75, 0x72, 0x6f, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, \n\t0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x31, 0x33, 0x07, 0x75, \n\t0x6e, 0x69, 0x32, 0x31, 0x31, 0x36, 0x09, 0x65, 0x73, 0x74, 0x69, 0x6d, \n\t0x61, 0x74, 0x65, 0x64, 0x09, 0x6f, 0x6e, 0x65, 0x65, 0x69, 0x67, 0x68, \n\t0x74, 0x68, 0x0c, 0x74, 0x68, 0x72, 0x65, 0x65, 0x65, 0x69, 0x67, 0x68, \n\t0x74, 0x68, 0x73, 0x0b, 0x66, 0x69, 0x76, 0x65, 0x65, 0x69, 0x67, 0x68, \n\t0x74, 0x68, 0x73, 0x0c, 0x73, 0x65, 0x76, 0x65, 0x6e, 0x65, 0x69, 0x67, \n\t0x68, 0x74, 0x68, 0x73, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, \n\t0x63, 0x65, 0x6e, 0x74, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x42, 0x30, 0x32, \n\t0x07, 0x75, 0x6e, 0x69, 0x46, 0x42, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, \n\t0x46, 0x42, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x45, 0x46, 0x46, \n\t0x07, 0x75, 0x6e, 0x69, 0x46, 0x46, 0x46, 0x43, 0x07, 0x75, 0x6e, 0x69, \n\t0x46, 0x46, 0x46, 0x44, 0x0c, 0x49, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, \n\t0x2e, 0x73, 0x6d, 0x63, 0x70, 0x09, 0x64, 0x61, 0x73, 0x69, 0x61, 0x6f, \n\t0x78, 0x69, 0x61, 0x09, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2e, 0x73, 0x75, \n\t0x70, 0x08, 0x6e, 0x69, 0x6e, 0x65, 0x2e, 0x73, 0x75, 0x70, 0x08, 0x73, \n\t0x69, 0x78, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x09, 0x66, 0x6f, 0x75, 0x72, \n\t0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0a, 0x74, 0x68, 0x72, 0x65, 0x65, 0x2e, \n\t0x73, 0x6d, 0x63, 0x70, 0x08, 0x74, 0x77, 0x6f, 0x2e, 0x73, 0x6d, 0x63, \n\t0x70, 0x08, 0x6f, 0x6e, 0x65, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x09, 0x7a, \n\t0x65, 0x72, 0x6f, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x06, 0x5a, 0x2e, 0x73, \n\t0x6d, 0x63, 0x70, 0x06, 0x59, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x06, 0x58, \n\t0x2e, 0x73, 0x6d, 0x63, 0x70, 0x06, 0x57, 0x2e, 0x73, 0x6d, 0x63, 0x70, \n\t0x06, 0x56, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x06, 0x55, 0x2e, 0x73, 0x6d, \n\t0x63, 0x70, 0x06, 0x54, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x06, 0x53, 0x2e, \n\t0x73, 0x6d, 0x63, 0x70, 0x06, 0x52, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x06, \n\t0x51, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x09, 0x7a, 0x65, 0x72, 0x6f, 0x2e, \n\t0x6c, 0x6e, 0x75, 0x6d, 0x06, 0x4f, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x06, \n\t0x4e, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x08, 0x63, 0x72, 0x6f, 0x73, 0x73, \n\t0x62, 0x61, 0x72, 0x06, 0x4d, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x06, 0x4c, \n\t0x2e, 0x73, 0x6d, 0x63, 0x70, 0x06, 0x4b, 0x2e, 0x73, 0x6d, 0x63, 0x70, \n\t0x06, 0x4a, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x06, 0x49, 0x2e, 0x73, 0x6d, \n\t0x63, 0x70, 0x06, 0x48, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x06, 0x47, 0x2e, \n\t0x73, 0x6d, 0x63, 0x70, 0x06, 0x46, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x06, \n\t0x45, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x06, 0x44, 0x2e, 0x73, 0x6d, 0x63, \n\t0x70, 0x06, 0x43, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x06, 0x42, 0x2e, 0x73, \n\t0x6d, 0x63, 0x70, 0x11, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, \n\t0x65, 0x6e, 0x74, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x0e, 0x62, 0x72, \n\t0x65, 0x76, 0x65, 0x67, 0x72, 0x61, 0x76, 0x65, 0x63, 0x6f, 0x6d, 0x62, \n\t0x06, 0x41, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x13, 0x63, 0x69, 0x72, 0x63, \n\t0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x61, 0x63, 0x75, 0x74, 0x65, 0x63, \n\t0x6f, 0x6d, 0x62, 0x13, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, \n\t0x65, 0x78, 0x67, 0x72, 0x61, 0x76, 0x65, 0x63, 0x6f, 0x6d, 0x62, 0x12, \n\t0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x68, 0x6f, \n\t0x6f, 0x6b, 0x63, 0x6f, 0x6d, 0x62, 0x13, 0x63, 0x69, 0x72, 0x63, 0x75, \n\t0x6d, 0x66, 0x6c, 0x65, 0x78, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x63, 0x6f, \n\t0x6d, 0x62, 0x0e, 0x62, 0x72, 0x65, 0x76, 0x65, 0x61, 0x63, 0x75, 0x74, \n\t0x65, 0x63, 0x6f, 0x6d, 0x62, 0x0d, 0x62, 0x72, 0x65, 0x76, 0x65, 0x68, \n\t0x6f, 0x6f, 0x6b, 0x63, 0x6f, 0x6d, 0x62, 0x0e, 0x62, 0x72, 0x65, 0x76, \n\t0x65, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x63, 0x6f, 0x6d, 0x62, 0x0b, 0x63, \n\t0x79, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x74, 0x69, 0x63, 0x10, 0x63, \n\t0x79, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x68, 0x6f, 0x6f, 0x6b, 0x6c, \n\t0x65, 0x66, 0x74, 0x0c, 0x63, 0x79, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x63, \n\t0x68, 0x6f, 0x6f, 0x6b, 0x0e, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x72, 0x69, \n\t0x67, 0x68, 0x74, 0x68, 0x6f, 0x6f, 0x6b, 0x08, 0x6f, 0x6e, 0x65, 0x2e, \n\t0x6c, 0x6e, 0x75, 0x6d, 0x08, 0x74, 0x77, 0x6f, 0x2e, 0x6c, 0x6e, 0x75, \n\t0x6d, 0x0a, 0x74, 0x68, 0x72, 0x65, 0x65, 0x2e, 0x6c, 0x6e, 0x75, 0x6d, \n\t0x09, 0x66, 0x6f, 0x75, 0x72, 0x2e, 0x6c, 0x6e, 0x75, 0x6d, 0x09, 0x66, \n\t0x69, 0x76, 0x65, 0x2e, 0x6c, 0x6e, 0x75, 0x6d, 0x08, 0x73, 0x69, 0x78, \n\t0x2e, 0x6c, 0x6e, 0x75, 0x6d, 0x0a, 0x73, 0x65, 0x76, 0x65, 0x6e, 0x2e, \n\t0x6c, 0x6e, 0x75, 0x6d, 0x0a, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2e, 0x6c, \n\t0x6e, 0x75, 0x6d, 0x09, 0x6e, 0x69, 0x6e, 0x65, 0x2e, 0x6c, 0x6e, 0x75, \n\t0x6d, 0x06, 0x50, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x09, 0x66, 0x69, 0x76, \n\t0x65, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x07, 0x73, 0x69, 0x78, 0x2e, 0x73, \n\t0x75, 0x70, 0x08, 0x66, 0x69, 0x76, 0x65, 0x2e, 0x73, 0x75, 0x70, 0x08, \n\t0x66, 0x6f, 0x75, 0x72, 0x2e, 0x73, 0x75, 0x70, 0x09, 0x74, 0x68, 0x72, \n\t0x65, 0x65, 0x2e, 0x73, 0x75, 0x70, 0x07, 0x74, 0x77, 0x6f, 0x2e, 0x73, \n\t0x75, 0x70, 0x09, 0x72, 0x69, 0x6e, 0x67, 0x61, 0x63, 0x75, 0x74, 0x65, \n\t0x07, 0x6f, 0x6e, 0x65, 0x2e, 0x73, 0x75, 0x70, 0x08, 0x7a, 0x65, 0x72, \n\t0x6f, 0x2e, 0x73, 0x75, 0x70, 0x09, 0x6e, 0x69, 0x6e, 0x65, 0x2e, 0x73, \n\t0x6d, 0x63, 0x70, 0x0a, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2e, 0x73, 0x6d, \n\t0x63, 0x70, 0x0a, 0x73, 0x65, 0x76, 0x65, 0x6e, 0x2e, 0x73, 0x6d, 0x63, \n\t0x70, 0x09, 0x73, 0x65, 0x76, 0x65, 0x6e, 0x2e, 0x73, 0x75, 0x70, 0x0d, \n\t0x63, 0x79, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x62, 0x72, 0x65, 0x76, \n\t0x65, 0x0b, 0x44, 0x63, 0x72, 0x6f, 0x61, 0x74, 0x2e, 0x73, 0x6d, 0x63, \n\t0x70, 0x08, 0x45, 0x74, 0x68, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x09, 0x54, \n\t0x62, 0x61, 0x72, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, 0x41, 0x67, 0x72, \n\t0x61, 0x76, 0x65, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, 0x41, 0x61, 0x63, \n\t0x75, 0x74, 0x65, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x10, 0x41, 0x63, 0x69, \n\t0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x2e, 0x73, 0x6d, 0x63, \n\t0x70, 0x0b, 0x41, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x2e, 0x73, 0x6d, 0x63, \n\t0x70, 0x0e, 0x41, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x2e, \n\t0x73, 0x6d, 0x63, 0x70, 0x0a, 0x41, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x73, \n\t0x6d, 0x63, 0x70, 0x0f, 0x41, 0x72, 0x69, 0x6e, 0x67, 0x61, 0x63, 0x75, \n\t0x74, 0x65, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0d, 0x43, 0x63, 0x65, 0x64, \n\t0x69, 0x6c, 0x6c, 0x61, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, 0x45, 0x67, \n\t0x72, 0x61, 0x76, 0x65, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, 0x45, 0x61, \n\t0x63, 0x75, 0x74, 0x65, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x10, 0x45, 0x63, \n\t0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x2e, 0x73, 0x6d, \n\t0x63, 0x70, 0x0e, 0x45, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, \n\t0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, 0x49, 0x67, 0x72, 0x61, 0x76, 0x65, \n\t0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, 0x49, 0x61, 0x63, 0x75, 0x74, 0x65, \n\t0x2e, 0x73, 0x6d, 0x63, 0x70, 0x10, 0x49, 0x63, 0x69, 0x72, 0x63, 0x75, \n\t0x6d, 0x66, 0x6c, 0x65, 0x78, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0e, 0x49, \n\t0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x2e, 0x73, 0x6d, 0x63, \n\t0x70, 0x0b, 0x4e, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x2e, 0x73, 0x6d, 0x63, \n\t0x70, 0x0b, 0x4f, 0x67, 0x72, 0x61, 0x76, 0x65, 0x2e, 0x73, 0x6d, 0x63, \n\t0x70, 0x0b, 0x4f, 0x61, 0x63, 0x75, 0x74, 0x65, 0x2e, 0x73, 0x6d, 0x63, \n\t0x70, 0x10, 0x4f, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, \n\t0x78, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, 0x4f, 0x74, 0x69, 0x6c, 0x64, \n\t0x65, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0e, 0x4f, 0x64, 0x69, 0x65, 0x72, \n\t0x65, 0x73, 0x69, 0x73, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, 0x55, 0x67, \n\t0x72, 0x61, 0x76, 0x65, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, 0x55, 0x61, \n\t0x63, 0x75, 0x74, 0x65, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x10, 0x55, 0x63, \n\t0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x2e, 0x73, 0x6d, \n\t0x63, 0x70, 0x0e, 0x55, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, \n\t0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, 0x59, 0x61, 0x63, 0x75, 0x74, 0x65, \n\t0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0c, 0x41, 0x6d, 0x61, 0x63, 0x72, 0x6f, \n\t0x6e, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, 0x41, 0x62, 0x72, 0x65, 0x76, \n\t0x65, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0c, 0x41, 0x6f, 0x67, 0x6f, 0x6e, \n\t0x65, 0x6b, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, 0x43, 0x61, 0x63, 0x75, \n\t0x74, 0x65, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x10, 0x43, 0x63, 0x69, 0x72, \n\t0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x2e, 0x73, 0x6d, 0x63, 0x70, \n\t0x0c, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x30, 0x41, 0x2e, 0x73, 0x6d, 0x63, \n\t0x70, 0x0b, 0x43, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x2e, 0x73, 0x6d, 0x63, \n\t0x70, 0x0b, 0x44, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x2e, 0x73, 0x6d, 0x63, \n\t0x70, 0x0c, 0x45, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x2e, 0x73, 0x6d, \n\t0x63, 0x70, 0x0b, 0x45, 0x62, 0x72, 0x65, 0x76, 0x65, 0x2e, 0x73, 0x6d, \n\t0x63, 0x70, 0x0f, 0x45, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, \n\t0x74, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0c, 0x45, 0x6f, 0x67, 0x6f, 0x6e, \n\t0x65, 0x6b, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, 0x45, 0x63, 0x61, 0x72, \n\t0x6f, 0x6e, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x10, 0x47, 0x63, 0x69, 0x72, \n\t0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x2e, 0x73, 0x6d, 0x63, 0x70, \n\t0x0b, 0x47, 0x62, 0x72, 0x65, 0x76, 0x65, 0x2e, 0x73, 0x6d, 0x63, 0x70, \n\t0x0c, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x32, 0x30, 0x2e, 0x73, 0x6d, 0x63, \n\t0x70, 0x11, 0x47, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, \n\t0x6e, 0x74, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x10, 0x48, 0x63, 0x69, 0x72, \n\t0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x2e, 0x73, 0x6d, 0x63, 0x70, \n\t0x0b, 0x49, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x2e, 0x73, 0x6d, 0x63, 0x70, \n\t0x12, 0x55, 0x68, 0x75, 0x6e, 0x67, 0x61, 0x72, 0x75, 0x6d, 0x6c, 0x61, \n\t0x75, 0x74, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, 0x49, 0x62, 0x72, 0x65, \n\t0x76, 0x65, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0c, 0x49, 0x6f, 0x67, 0x6f, \n\t0x6e, 0x65, 0x6b, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0f, 0x49, 0x64, 0x6f, \n\t0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x6d, 0x63, 0x70, \n\t0x10, 0x4a, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, \n\t0x2e, 0x73, 0x6d, 0x63, 0x70, 0x11, 0x4b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, \n\t0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, \n\t0x4c, 0x61, 0x63, 0x75, 0x74, 0x65, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x11, \n\t0x4c, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, \n\t0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, 0x4c, 0x63, 0x61, 0x72, 0x6f, 0x6e, \n\t0x2e, 0x73, 0x6d, 0x63, 0x70, 0x09, 0x4c, 0x64, 0x6f, 0x74, 0x2e, 0x73, \n\t0x6d, 0x63, 0x70, 0x0b, 0x4e, 0x61, 0x63, 0x75, 0x74, 0x65, 0x2e, 0x73, \n\t0x6d, 0x63, 0x70, 0x11, 0x4e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, \n\t0x63, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, 0x4e, 0x63, \n\t0x61, 0x72, 0x6f, 0x6e, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0c, 0x4f, 0x6d, \n\t0x61, 0x63, 0x72, 0x6f, 0x6e, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, 0x4f, \n\t0x62, 0x72, 0x65, 0x76, 0x65, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x12, 0x4f, \n\t0x68, 0x75, 0x6e, 0x67, 0x61, 0x72, 0x75, 0x6d, 0x6c, 0x61, 0x75, 0x74, \n\t0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, 0x52, 0x61, 0x63, 0x75, 0x74, 0x65, \n\t0x2e, 0x73, 0x6d, 0x63, 0x70, 0x11, 0x52, 0x63, 0x6f, 0x6d, 0x6d, 0x61, \n\t0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, \n\t0x52, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, \n\t0x53, 0x61, 0x63, 0x75, 0x74, 0x65, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x10, \n\t0x53, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x2e, \n\t0x73, 0x6d, 0x63, 0x70, 0x0d, 0x53, 0x63, 0x65, 0x64, 0x69, 0x6c, 0x6c, \n\t0x61, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, 0x53, 0x63, 0x61, 0x72, 0x6f, \n\t0x6e, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x11, 0x54, 0x63, 0x6f, 0x6d, 0x6d, \n\t0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x6d, 0x63, 0x70, \n\t0x0b, 0x54, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x2e, 0x73, 0x6d, 0x63, 0x70, \n\t0x0b, 0x55, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x2e, 0x73, 0x6d, 0x63, 0x70, \n\t0x0c, 0x55, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x2e, 0x73, 0x6d, 0x63, \n\t0x70, 0x0b, 0x55, 0x62, 0x72, 0x65, 0x76, 0x65, 0x2e, 0x73, 0x6d, 0x63, \n\t0x70, 0x0a, 0x55, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x73, 0x6d, 0x63, 0x70, \n\t0x0f, 0x67, 0x65, 0x72, 0x6d, 0x61, 0x6e, 0x64, 0x62, 0x6c, 0x73, 0x2e, \n\t0x73, 0x6d, 0x63, 0x70, 0x0b, 0x5a, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x2e, \n\t0x73, 0x6d, 0x63, 0x70, 0x0f, 0x5a, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, \n\t0x65, 0x6e, 0x74, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, 0x5a, 0x61, 0x63, \n\t0x75, 0x74, 0x65, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0e, 0x59, 0x64, 0x69, \n\t0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x10, \n\t0x59, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x2e, \n\t0x73, 0x6d, 0x63, 0x70, 0x10, 0x57, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, \n\t0x66, 0x6c, 0x65, 0x78, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0c, 0x55, 0x6f, \n\t0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x07, 0x75, \n\t0x6e, 0x69, 0x30, 0x34, 0x30, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, \n\t0x30, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x34, 0x07, 0x75, \n\t0x6e, 0x69, 0x30, 0x34, 0x31, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, \n\t0x32, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x34, 0x07, 0x75, \n\t0x6e, 0x69, 0x30, 0x34, 0x32, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, \n\t0x32, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x41, 0x07, 0x75, \n\t0x6e, 0x69, 0x30, 0x34, 0x32, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, \n\t0x32, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x31, 0x07, 0x75, \n\t0x6e, 0x69, 0x30, 0x34, 0x33, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, \n\t0x33, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x37, 0x07, 0x75, \n\t0x6e, 0x69, 0x30, 0x34, 0x34, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, \n\t0x34, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x30, 0x07, 0x75, \n\t0x6e, 0x69, 0x30, 0x34, 0x36, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, \n\t0x36, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x34, 0x07, 0x75, \n\t0x6e, 0x69, 0x30, 0x34, 0x36, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, \n\t0x37, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x33, 0x07, 0x75, \n\t0x6e, 0x69, 0x30, 0x34, 0x37, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, \n\t0x37, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x43, 0x07, 0x75, \n\t0x6e, 0x69, 0x30, 0x34, 0x37, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, \n\t0x37, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x46, 0x07, 0x75, \n\t0x6e, 0x69, 0x30, 0x34, 0x38, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, \n\t0x38, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x46, 0x07, 0x75, \n\t0x6e, 0x69, 0x30, 0x34, 0x39, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, \n\t0x39, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x36, 0x07, 0x75, \n\t0x6e, 0x69, 0x30, 0x34, 0x39, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, \n\t0x39, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x39, 0x07, 0x75, \n\t0x6e, 0x69, 0x30, 0x34, 0x41, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, \n\t0x41, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x36, 0x07, 0x75, \n\t0x6e, 0x69, 0x30, 0x34, 0x41, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, \n\t0x41, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x39, 0x07, 0x75, \n\t0x6e, 0x69, 0x30, 0x34, 0x41, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, \n\t0x41, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x45, 0x07, 0x75, \n\t0x6e, 0x69, 0x30, 0x34, 0x42, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, \n\t0x43, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x32, 0x07, 0x75, \n\t0x6e, 0x69, 0x30, 0x34, 0x43, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, \n\t0x43, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x38, 0x07, 0x75, \n\t0x6e, 0x69, 0x30, 0x34, 0x45, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, \n\t0x45, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x42, 0x07, 0x75, \n\t0x6e, 0x69, 0x30, 0x34, 0x45, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, \n\t0x46, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x32, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x02, 0x00, 0x08, 0x00, 0x02, 0xff, 0xff, 0x00, 0x0f, \n\t0x00, 0x01, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x30, 0x00, 0x44, 0x00, 0x02, \n\t0x44, 0x46, 0x4c, 0x54, 0x00, 0x0e, 0x6c, 0x61, 0x74, 0x6e, 0x00, 0x1a, \n\t0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, \n\t0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x01, \n\t0x00, 0x02, 0x6b, 0x65, 0x72, 0x6e, 0x00, 0x0e, 0x6b, 0x65, 0x72, 0x6e, \n\t0x00, 0x0e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, \n\t0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0a, 0x33, 0x12, 0x00, 0x01, \n\t0x03, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x7b, 0x28, 0x0e, 0x28, 0x0e, \n\t0x05, 0xfa, 0x26, 0x92, 0x1b, 0xf8, 0x32, 0x26, 0x27, 0xec, 0x27, 0x1e, \n\t0x06, 0x50, 0x27, 0x36, 0x31, 0xd8, 0x0c, 0x30, 0x27, 0xec, 0x1c, 0xc4, \n\t0x09, 0x7e, 0x09, 0xfc, 0x24, 0xb2, 0x27, 0x36, 0x31, 0x98, 0x26, 0x6c, \n\t0x32, 0x30, 0x27, 0x3c, 0x0c, 0x6c, 0x0a, 0x62, 0x27, 0x00, 0x31, 0xbe, \n\t0x27, 0x30, 0x0a, 0xa4, 0x0a, 0xda, 0x32, 0x98, 0x31, 0xbe, 0x0c, 0x5e, \n\t0x27, 0xce, 0x0b, 0xd0, 0x32, 0x92, 0x27, 0xce, 0x0b, 0xee, 0x26, 0x92, \n\t0x26, 0x92, 0x26, 0x92, 0x26, 0x92, 0x26, 0x92, 0x26, 0x92, 0x32, 0x26, \n\t0x27, 0x1e, 0x27, 0x1e, 0x27, 0x1e, 0x27, 0x1e, 0x27, 0xec, 0x27, 0xec, \n\t0x27, 0xec, 0x27, 0xec, 0x27, 0xec, 0x27, 0xec, 0x27, 0x36, 0x27, 0x36, \n\t0x27, 0x36, 0x27, 0x36, 0x27, 0x3c, 0x27, 0x00, 0x27, 0x00, 0x27, 0x00, \n\t0x27, 0x00, 0x27, 0x00, 0x27, 0x00, 0x27, 0x30, 0x27, 0x30, 0x27, 0x30, \n\t0x27, 0x30, 0x32, 0x98, 0x32, 0x98, 0x32, 0x98, 0x32, 0x98, 0x32, 0x98, \n\t0x27, 0xce, 0x31, 0xbe, 0x27, 0xce, 0x26, 0x92, 0x27, 0x00, 0x26, 0x92, \n\t0x27, 0x00, 0x26, 0x92, 0x27, 0x00, 0x32, 0x26, 0x32, 0x26, 0x32, 0x26, \n\t0x32, 0x26, 0x27, 0xec, 0x27, 0xec, 0x27, 0x1e, 0x27, 0x30, 0x27, 0x1e, \n\t0x27, 0x30, 0x27, 0x1e, 0x27, 0x30, 0x27, 0x1e, 0x27, 0x30, 0x27, 0x1e, \n\t0x27, 0x30, 0x27, 0x36, 0x31, 0xd8, 0x0c, 0x30, 0x0c, 0x30, 0x0c, 0x30, \n\t0x0c, 0x30, 0x27, 0xec, 0x32, 0x98, 0x27, 0xec, 0x32, 0x98, 0x27, 0xec, \n\t0x32, 0x98, 0x0c, 0x5e, 0x0c, 0x5e, 0x0c, 0x5e, 0x24, 0xb2, 0x24, 0xb2, \n\t0x24, 0xb2, 0x27, 0x36, 0x27, 0x36, 0x27, 0x36, 0x27, 0x36, 0x27, 0x36, \n\t0x27, 0x36, 0x26, 0x6c, 0x27, 0x3c, 0x27, 0xce, 0x27, 0x3c, 0x0c, 0x6c, \n\t0x0c, 0x6c, 0x0c, 0x6c, 0x26, 0x92, 0x27, 0x00, 0x28, 0x0e, 0x26, 0x92, \n\t0x27, 0x1e, 0x27, 0xec, 0x27, 0x3c, 0x26, 0x92, 0x1b, 0xf8, 0x25, 0x9c, \n\t0x26, 0x92, 0x27, 0x1e, 0x0c, 0x6c, 0x27, 0xec, 0x31, 0xd8, 0x26, 0x92, \n\t0x0c, 0x8e, 0x27, 0xec, 0x1c, 0xc4, 0x0d, 0x78, 0x24, 0xb2, 0x27, 0x3c, \n\t0x0e, 0x66, 0x32, 0x30, 0x0f, 0x44, 0x27, 0x3c, 0x0f, 0xe6, 0x27, 0xce, \n\t0x0f, 0xec, 0x0f, 0xf6, 0x12, 0xb8, 0x14, 0x92, 0x27, 0xce, 0x15, 0x7c, \n\t0x32, 0x98, 0x31, 0xbe, 0x16, 0x92, 0x16, 0x98, 0x18, 0x92, 0x18, 0xc8, \n\t0x1a, 0x5a, 0x1a, 0x8c, 0x32, 0x98, 0x27, 0x1e, 0x27, 0x1e, 0x25, 0x9c, \n\t0x27, 0x36, 0x2f, 0xcc, 0x2f, 0xcc, 0x31, 0xd8, 0x32, 0xba, 0x26, 0x92, \n\t0x1b, 0x0a, 0x1b, 0xf8, 0x25, 0x9c, 0x27, 0x1e, 0x1b, 0xfe, 0x31, 0xd8, \n\t0x27, 0xec, 0x1c, 0xc4, 0x32, 0x26, 0x24, 0xb2, 0x32, 0x30, 0x1c, 0xea, \n\t0x1d, 0xa8, 0x27, 0x00, 0x1e, 0x32, 0x26, 0x62, 0x27, 0x30, 0x1e, 0xb8, \n\t0x32, 0x98, 0x31, 0xbe, 0x20, 0x1e, 0x27, 0xce, 0x32, 0x92, 0x22, 0x78, \n\t0x22, 0xb2, 0x31, 0x76, 0x31, 0xbe, 0x23, 0xdc, 0x27, 0x30, 0x27, 0x30, \n\t0x26, 0x62, 0x24, 0x5e, 0x31, 0x76, 0x31, 0x76, 0x27, 0xce, 0x2f, 0xcc, \n\t0x26, 0x92, 0x27, 0xce, 0x27, 0xce, 0x24, 0x88, 0x25, 0x9c, 0x26, 0x62, \n\t0x25, 0x9c, 0x31, 0xd8, 0x31, 0xd8, 0x31, 0xd8, 0x24, 0xb2, 0x27, 0x3c, \n\t0x27, 0xce, 0x27, 0x3c, 0x32, 0x30, 0x32, 0x92, 0x26, 0x92, 0x27, 0x00, \n\t0x26, 0x92, 0x27, 0x00, 0x27, 0x1e, 0x27, 0x30, 0x27, 0x30, 0x27, 0x30, \n\t0x32, 0x30, 0x32, 0x92, 0x27, 0xec, 0x32, 0x98, 0x31, 0xbe, 0x27, 0xce, \n\t0x27, 0xce, 0x27, 0xce, 0x25, 0x9c, 0x26, 0x62, 0x26, 0x62, 0x32, 0x30, \n\t0x32, 0x92, 0x26, 0x92, 0x27, 0x00, 0x26, 0x6c, 0x26, 0x6c, 0x26, 0x6c, \n\t0x26, 0x92, 0x27, 0x00, 0x26, 0x92, 0x27, 0x00, 0x26, 0x92, 0x27, 0x00, \n\t0x26, 0x92, 0x27, 0x00, 0x26, 0x92, 0x27, 0x00, 0x26, 0x92, 0x27, 0x00, \n\t0x26, 0x92, 0x27, 0x00, 0x26, 0x92, 0x27, 0x00, 0x26, 0x92, 0x27, 0x00, \n\t0x26, 0x92, 0x27, 0x00, 0x26, 0x92, 0x27, 0x00, 0x26, 0x92, 0x27, 0x00, \n\t0x27, 0x1e, 0x27, 0x30, 0x27, 0x1e, 0x27, 0x30, 0x27, 0x1e, 0x27, 0x30, \n\t0x27, 0x1e, 0x27, 0x30, 0x27, 0x1e, 0x27, 0x30, 0x27, 0x1e, 0x27, 0x30, \n\t0x27, 0x1e, 0x27, 0x30, 0x27, 0x1e, 0x27, 0x30, 0x27, 0xec, 0x32, 0x98, \n\t0x27, 0xec, 0x32, 0x98, 0x27, 0xec, 0x32, 0x98, 0x27, 0xec, 0x32, 0x98, \n\t0x27, 0xec, 0x32, 0x98, 0x27, 0xec, 0x32, 0x98, 0x27, 0xec, 0x32, 0x98, \n\t0x32, 0x98, 0x27, 0x36, 0x27, 0x36, 0x27, 0x3c, 0x27, 0xce, 0x27, 0x3c, \n\t0x27, 0xce, 0x27, 0x3c, 0x27, 0xce, 0x27, 0x3c, 0x27, 0xce, 0x27, 0xec, \n\t0x28, 0x0e, 0x28, 0x0e, 0x28, 0x0e, 0x28, 0x0e, 0x28, 0x0e, 0x28, 0x0e, \n\t0x28, 0x0e, 0x28, 0x14, 0x28, 0x2a, 0x28, 0x50, 0x28, 0x62, 0x28, 0x6c, \n\t0x28, 0x82, 0x28, 0x88, 0x28, 0xae, 0x28, 0xc0, 0x28, 0xd2, 0x28, 0xe8, \n\t0x29, 0x12, 0x29, 0x24, 0x29, 0x2a, 0x29, 0x34, 0x29, 0x5a, 0x29, 0x60, \n\t0x2a, 0xce, 0x2c, 0x00, 0x32, 0x30, 0x32, 0xba, 0x2e, 0x3a, 0x2f, 0xcc, \n\t0x2f, 0xcc, 0x2f, 0xf2, 0x30, 0x4c, 0x31, 0x26, 0x32, 0x92, 0x31, 0x4c, \n\t0x31, 0xbe, 0x31, 0x76, 0x31, 0x76, 0x32, 0x98, 0x31, 0x98, 0x31, 0x98, \n\t0x31, 0xbe, 0x32, 0x30, 0x32, 0x92, 0x31, 0xd8, 0x32, 0x26, 0x32, 0x30, \n\t0x32, 0x92, 0x32, 0x98, 0x32, 0xba, 0x32, 0xba, 0x32, 0xba, 0x00, 0x01, \n\t0x01, 0x7b, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x24, 0x00, 0x25, \n\t0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2d, 0x00, 0x2e, \n\t0x00, 0x2f, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x37, \n\t0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, \n\t0x00, 0x3e, 0x00, 0x44, 0x00, 0x45, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4e, \n\t0x00, 0x52, 0x00, 0x53, 0x00, 0x55, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, \n\t0x00, 0x5c, 0x00, 0x5e, 0x00, 0x82, 0x00, 0x83, 0x00, 0x84, 0x00, 0x85, \n\t0x00, 0x86, 0x00, 0x87, 0x00, 0x89, 0x00, 0x8a, 0x00, 0x8b, 0x00, 0x8c, \n\t0x00, 0x8d, 0x00, 0x92, 0x00, 0x94, 0x00, 0x95, 0x00, 0x96, 0x00, 0x97, \n\t0x00, 0x98, 0x00, 0x9b, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, \n\t0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, \n\t0x00, 0xaa, 0x00, 0xab, 0x00, 0xac, 0x00, 0xad, 0x00, 0xb4, 0x00, 0xb5, \n\t0x00, 0xb6, 0x00, 0xb7, 0x00, 0xb8, 0x00, 0xbf, 0x00, 0xc0, 0x00, 0xc1, \n\t0x00, 0xc2, 0x00, 0xc3, 0x00, 0xc4, 0x00, 0xc5, 0x00, 0xc6, 0x00, 0xc7, \n\t0x00, 0xc8, 0x00, 0xca, 0x00, 0xcc, 0x00, 0xce, 0x00, 0xd0, 0x00, 0xd2, \n\t0x00, 0xd4, 0x00, 0xd5, 0x00, 0xd6, 0x00, 0xd7, 0x00, 0xd8, 0x00, 0xd9, \n\t0x00, 0xda, 0x00, 0xdb, 0x00, 0xdc, 0x00, 0xdd, 0x00, 0xf6, 0x00, 0xf8, \n\t0x00, 0xfb, 0x00, 0xfd, 0x00, 0xff, 0x01, 0x01, 0x01, 0x0e, 0x01, 0x0f, \n\t0x01, 0x10, 0x01, 0x11, 0x01, 0x12, 0x01, 0x13, 0x01, 0x17, 0x01, 0x19, \n\t0x01, 0x1b, 0x01, 0x24, 0x01, 0x26, 0x01, 0x28, 0x01, 0x2a, 0x01, 0x2c, \n\t0x01, 0x2e, 0x01, 0x30, 0x01, 0x32, 0x01, 0x34, 0x01, 0x36, 0x01, 0x38, \n\t0x01, 0x39, 0x01, 0x3a, 0x01, 0x3b, 0x01, 0x3d, 0x01, 0x3f, 0x01, 0x48, \n\t0x01, 0x49, 0x01, 0x51, 0x01, 0x63, 0x01, 0x65, 0x01, 0x68, 0x01, 0x69, \n\t0x01, 0x6c, 0x01, 0x6d, 0x01, 0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, 0x71, \n\t0x01, 0x73, 0x01, 0x75, 0x01, 0x76, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7c, \n\t0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x80, 0x01, 0x81, 0x01, 0x82, \n\t0x01, 0x85, 0x01, 0x8b, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x90, 0x01, 0x93, \n\t0x01, 0x95, 0x01, 0x97, 0x01, 0x98, 0x01, 0x99, 0x01, 0x9b, 0x01, 0x9d, \n\t0x01, 0x9e, 0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, 0xa3, 0x01, 0xa6, \n\t0x01, 0xac, 0x01, 0xad, 0x01, 0xae, 0x01, 0xb3, 0x01, 0xb4, 0x01, 0xb5, \n\t0x01, 0xb6, 0x01, 0xb8, 0x01, 0xba, 0x01, 0xbb, 0x01, 0xbc, 0x01, 0xbd, \n\t0x01, 0xbe, 0x01, 0xbf, 0x01, 0xc2, 0x01, 0xc6, 0x01, 0xc8, 0x01, 0xc9, \n\t0x01, 0xca, 0x01, 0xcb, 0x01, 0xcf, 0x01, 0xd0, 0x01, 0xd1, 0x01, 0xd2, \n\t0x01, 0xd3, 0x01, 0xd4, 0x01, 0xd7, 0x01, 0xdb, 0x01, 0xdd, 0x01, 0xdf, \n\t0x01, 0xe0, 0x01, 0xe1, 0x01, 0xe2, 0x01, 0xe5, 0x01, 0xe7, 0x01, 0xe8, \n\t0x01, 0xe9, 0x01, 0xeb, 0x01, 0xec, 0x01, 0xee, 0x01, 0xef, 0x01, 0xf4, \n\t0x01, 0xf5, 0x01, 0xf9, 0x01, 0xfb, 0x01, 0xfc, 0x02, 0x08, 0x02, 0x09, \n\t0x02, 0x0f, 0x02, 0x1a, 0x02, 0x1b, 0x02, 0x1c, 0x02, 0x1e, 0x02, 0x20, \n\t0x02, 0x22, 0x02, 0x28, 0x02, 0x2a, 0x02, 0x2b, 0x02, 0x2c, 0x02, 0x2e, \n\t0x02, 0x2f, 0x02, 0x46, 0x02, 0x47, 0x02, 0x48, 0x02, 0x49, 0x02, 0x4c, \n\t0x02, 0x4d, 0x02, 0x4f, 0x02, 0x51, 0x02, 0x52, 0x02, 0x53, 0x02, 0x5c, \n\t0x02, 0x5d, 0x02, 0x5f, 0x02, 0x60, 0x02, 0x61, 0x02, 0x62, 0x02, 0x65, \n\t0x02, 0x66, 0x02, 0x6a, 0x02, 0x6b, 0x02, 0x6c, 0x02, 0x83, 0x02, 0x84, \n\t0x02, 0x87, 0x02, 0x89, 0x02, 0x8b, 0x02, 0x8d, 0x02, 0x8e, 0x02, 0x8f, \n\t0x02, 0x90, 0x02, 0x91, 0x02, 0x92, 0x02, 0x93, 0x02, 0x94, 0x02, 0x95, \n\t0x02, 0x96, 0x02, 0x97, 0x02, 0x98, 0x02, 0x99, 0x02, 0x9a, 0x02, 0x9b, \n\t0x02, 0x9c, 0x02, 0x9d, 0x02, 0x9e, 0x02, 0x9f, 0x02, 0xa0, 0x02, 0xa1, \n\t0x02, 0xa2, 0x02, 0xa3, 0x02, 0xa4, 0x02, 0xa5, 0x02, 0xa6, 0x02, 0xa7, \n\t0x02, 0xa8, 0x02, 0xa9, 0x02, 0xaa, 0x02, 0xab, 0x02, 0xac, 0x02, 0xad, \n\t0x02, 0xae, 0x02, 0xaf, 0x02, 0xb0, 0x02, 0xb1, 0x02, 0xb2, 0x02, 0xb3, \n\t0x02, 0xb4, 0x02, 0xb9, 0x02, 0xba, 0x02, 0xbb, 0x02, 0xbc, 0x02, 0xbd, \n\t0x02, 0xbe, 0x02, 0xbf, 0x02, 0xc0, 0x02, 0xc1, 0x02, 0xc2, 0x02, 0xc3, \n\t0x02, 0xc4, 0x02, 0xc5, 0x02, 0xc6, 0x02, 0xce, 0x02, 0xd1, 0x02, 0xd3, \n\t0x02, 0xdf, 0x02, 0xe0, 0x02, 0xe1, 0x02, 0xe2, 0x02, 0xe3, 0x02, 0xe4, \n\t0x02, 0xe5, 0x02, 0xe6, 0x02, 0xe7, 0x02, 0xf8, 0x02, 0xf9, 0x02, 0xfb, \n\t0x02, 0xfc, 0x02, 0xfd, 0x03, 0x05, 0x03, 0x06, 0x03, 0x39, 0x03, 0x3a, \n\t0x03, 0x3b, 0x03, 0x3c, 0x03, 0x3d, 0x03, 0x3e, 0x03, 0x3f, 0x03, 0x41, \n\t0x03, 0x42, 0x03, 0x44, 0x03, 0x48, 0x03, 0x49, 0x03, 0x4e, 0x03, 0x50, \n\t0x03, 0x55, 0x03, 0x6a, 0x03, 0xcf, 0x03, 0xd0, 0x03, 0xd1, 0x03, 0xd2, \n\t0x03, 0xd3, 0x03, 0xd6, 0x03, 0xd7, 0x03, 0xd8, 0x03, 0xd9, 0x03, 0xda, \n\t0x03, 0xdb, 0x03, 0xdc, 0x03, 0xdd, 0x03, 0xde, 0x03, 0xdf, 0x03, 0xe2, \n\t0x03, 0xe6, 0x03, 0xe7, 0x03, 0xe8, 0x03, 0xef, 0x03, 0xf2, 0x03, 0xf3, \n\t0x03, 0xf6, 0x03, 0xfc, 0x04, 0x00, 0x04, 0x01, 0x04, 0x07, 0x04, 0x08, \n\t0x04, 0x09, 0x04, 0x0a, 0x00, 0x15, 0x00, 0x39, 0x00, 0x17, 0x00, 0x3a, \n\t0x00, 0x1a, 0x00, 0x3c, 0x00, 0x19, 0x00, 0x9f, 0x00, 0x19, 0x01, 0x36, \n\t0x00, 0x1a, 0x01, 0x38, 0x00, 0x19, 0x01, 0x3a, 0x00, 0x19, 0x01, 0x69, \n\t0x00, 0x19, 0x01, 0x7f, 0x00, 0x19, 0x01, 0x85, 0x00, 0x19, 0x02, 0x2a, \n\t0x00, 0x19, 0x02, 0x2c, 0x00, 0x19, 0x02, 0x87, 0x00, 0x1a, 0x02, 0x89, \n\t0x00, 0x1a, 0x02, 0x8b, 0x00, 0x1a, 0x02, 0xdf, 0x00, 0x19, 0x02, 0xe1, \n\t0x00, 0x19, 0x02, 0xe3, 0x00, 0x19, 0x02, 0xe5, 0x00, 0x19, 0x03, 0xe7, \n\t0x00, 0x17, 0x03, 0xe8, 0x00, 0x17, 0x00, 0xcb, 0x00, 0x0f, 0xfe, 0xbb, \n\t0x00, 0x11, 0xfe, 0xbb, 0x00, 0x1d, 0xfe, 0xbb, 0x00, 0x24, 0xff, 0x5d, \n\t0x00, 0x37, 0x00, 0x14, 0x00, 0x44, 0xff, 0xbc, 0x00, 0x46, 0xff, 0xcc, \n\t0x00, 0x47, 0xff, 0xcc, 0x00, 0x48, 0xff, 0xcc, 0x00, 0x4a, 0xff, 0xcc, \n\t0x00, 0x52, 0xff, 0xca, 0x00, 0x54, 0xff, 0xcc, 0x00, 0x55, 0xff, 0xe2, \n\t0x00, 0x58, 0xff, 0xe7, 0x00, 0x59, 0xff, 0xe4, 0x00, 0x5c, 0xff, 0xe4, \n\t0x00, 0x82, 0xff, 0x5d, 0x00, 0x83, 0xff, 0x5d, 0x00, 0x84, 0xff, 0x5d, \n\t0x00, 0x85, 0xff, 0x5d, 0x00, 0x86, 0xff, 0x5d, 0x00, 0x87, 0xff, 0x5d, \n\t0x00, 0xa2, 0xff, 0xbc, 0x00, 0xa3, 0xff, 0xbc, 0x00, 0xa4, 0xff, 0xbc, \n\t0x00, 0xa5, 0xff, 0xbc, 0x00, 0xa6, 0xff, 0xbc, 0x00, 0xa7, 0xff, 0xbc, \n\t0x00, 0xa9, 0xff, 0xcc, 0x00, 0xaa, 0xff, 0xcc, 0x00, 0xab, 0xff, 0xcc, \n\t0x00, 0xac, 0xff, 0xcc, 0x00, 0xad, 0xff, 0xcc, 0x00, 0xb4, 0xff, 0xca, \n\t0x00, 0xb5, 0xff, 0xca, 0x00, 0xb6, 0xff, 0xca, 0x00, 0xb7, 0xff, 0xca, \n\t0x00, 0xb8, 0xff, 0xca, 0x00, 0xbb, 0xff, 0xe7, 0x00, 0xbc, 0xff, 0xe7, \n\t0x00, 0xbd, 0xff, 0xe7, 0x00, 0xbe, 0xff, 0xe7, 0x00, 0xbf, 0xff, 0xe4, \n\t0x00, 0xc1, 0xff, 0xe4, 0x00, 0xc2, 0xff, 0x5d, 0x00, 0xc3, 0xff, 0xbc, \n\t0x00, 0xc4, 0xff, 0x5d, 0x00, 0xc5, 0xff, 0xbc, 0x00, 0xc6, 0xff, 0x5d, \n\t0x00, 0xc7, 0xff, 0xbc, 0x00, 0xc9, 0xff, 0xcc, 0x00, 0xcb, 0xff, 0xcc, \n\t0x00, 0xcd, 0xff, 0xcc, 0x00, 0xcf, 0xff, 0xcc, 0x00, 0xd1, 0xff, 0xcc, \n\t0x00, 0xd5, 0xff, 0xcc, 0x00, 0xd7, 0xff, 0xcc, 0x00, 0xd9, 0xff, 0xcc, \n\t0x00, 0xdb, 0xff, 0xcc, 0x00, 0xdd, 0xff, 0xcc, 0x00, 0xdf, 0xff, 0xcc, \n\t0x00, 0xe1, 0xff, 0xcc, 0x00, 0xe3, 0xff, 0xcc, 0x00, 0xe5, 0xff, 0xcc, \n\t0x01, 0x0f, 0xff, 0xca, 0x01, 0x11, 0xff, 0xca, 0x01, 0x13, 0xff, 0xca, \n\t0x01, 0x15, 0xff, 0xcc, 0x01, 0x24, 0x00, 0x14, 0x01, 0x26, 0x00, 0x14, \n\t0x01, 0x2b, 0xff, 0xe7, 0x01, 0x2d, 0xff, 0xe7, 0x01, 0x2f, 0xff, 0xe7, \n\t0x01, 0x31, 0xff, 0xe7, 0x01, 0x33, 0xff, 0xe7, 0x01, 0x35, 0xff, 0xe7, \n\t0x01, 0x39, 0xff, 0xe4, 0x01, 0x44, 0xff, 0xcc, 0x01, 0x46, 0xff, 0xe7, \n\t0x01, 0x48, 0xff, 0x5d, 0x01, 0x49, 0xff, 0xbc, 0x01, 0x63, 0xff, 0x5d, \n\t0x01, 0x6c, 0xff, 0x5d, 0x01, 0x6f, 0xff, 0x5d, 0x01, 0x76, 0xff, 0x5d, \n\t0x01, 0x86, 0xff, 0xcc, 0x01, 0x8a, 0xff, 0xe7, 0x01, 0x8b, 0xff, 0xcc, \n\t0x01, 0x8d, 0xff, 0xe4, 0x01, 0x97, 0xff, 0xe4, 0x01, 0x99, 0xff, 0xca, \n\t0x01, 0x9c, 0xff, 0xcc, 0x01, 0x9d, 0xff, 0xcc, 0x01, 0x9f, 0xff, 0xe7, \n\t0x01, 0xa5, 0xff, 0xe7, 0x01, 0xa6, 0xff, 0xca, 0x01, 0xa7, 0xff, 0xe7, \n\t0x01, 0xba, 0xff, 0x5d, 0x01, 0xca, 0x00, 0x14, 0x01, 0xd1, 0xff, 0xbc, \n\t0x01, 0xd4, 0xff, 0xcc, 0x01, 0xdb, 0xff, 0xca, 0x01, 0xde, 0xff, 0xcc, \n\t0x01, 0xe0, 0xff, 0xe4, 0x01, 0xeb, 0xff, 0xcc, 0x01, 0xec, 0xff, 0xcc, \n\t0x01, 0xef, 0xff, 0xcc, 0x01, 0xf9, 0xff, 0xe4, 0x01, 0xfc, 0xff, 0x5d, \n\t0x02, 0x08, 0xff, 0xe4, 0x02, 0x09, 0xff, 0xe4, 0x02, 0x0b, 0xff, 0xcc, \n\t0x02, 0x0f, 0xff, 0xcc, 0x02, 0x28, 0x00, 0x14, 0x02, 0x2b, 0xff, 0xe4, \n\t0x02, 0x30, 0x00, 0x14, 0x02, 0x46, 0xff, 0x5d, 0x02, 0x47, 0xff, 0xbc, \n\t0x02, 0x48, 0xff, 0x5d, 0x02, 0x49, 0xff, 0xbc, 0x02, 0x4d, 0xff, 0xcc, \n\t0x02, 0x4f, 0xff, 0xcc, 0x02, 0x51, 0xff, 0xcc, 0x02, 0x5d, 0xff, 0xca, \n\t0x02, 0x60, 0xff, 0xe4, 0x02, 0x61, 0xff, 0xe4, 0x02, 0x62, 0xff, 0xe4, \n\t0x02, 0x70, 0xff, 0xcc, 0x02, 0x71, 0xff, 0xcc, 0x02, 0x72, 0xff, 0xcc, \n\t0x02, 0x7c, 0xff, 0xcc, 0x02, 0x83, 0xff, 0x5d, 0x02, 0x84, 0xff, 0xbc, \n\t0x02, 0x8d, 0xff, 0x5d, 0x02, 0x8e, 0xff, 0xbc, 0x02, 0x8f, 0xff, 0x5d, \n\t0x02, 0x90, 0xff, 0xbc, 0x02, 0x91, 0xff, 0x5d, 0x02, 0x92, 0xff, 0xbc, \n\t0x02, 0x93, 0xff, 0x5d, 0x02, 0x94, 0xff, 0xbc, 0x02, 0x95, 0xff, 0x5d, \n\t0x02, 0x96, 0xff, 0xbc, 0x02, 0x97, 0xff, 0x5d, 0x02, 0x98, 0xff, 0xbc, \n\t0x02, 0x99, 0xff, 0x5d, 0x02, 0x9a, 0xff, 0xbc, 0x02, 0x9b, 0xff, 0x5d, \n\t0x02, 0x9c, 0xff, 0xbc, 0x02, 0x9d, 0xff, 0x5d, 0x02, 0x9e, 0xff, 0xbc, \n\t0x02, 0x9f, 0xff, 0x5d, 0x02, 0xa0, 0xff, 0xbc, 0x02, 0xa1, 0xff, 0x5d, \n\t0x02, 0xa2, 0xff, 0xbc, 0x02, 0xa3, 0xff, 0x5d, 0x02, 0xa4, 0xff, 0xbc, \n\t0x02, 0xa6, 0xff, 0xcc, 0x02, 0xa8, 0xff, 0xcc, 0x02, 0xaa, 0xff, 0xcc, \n\t0x02, 0xac, 0xff, 0xcc, 0x02, 0xae, 0xff, 0xcc, 0x02, 0xb0, 0xff, 0xcc, \n\t0x02, 0xb2, 0xff, 0xcc, 0x02, 0xb4, 0xff, 0xcc, 0x02, 0xba, 0xff, 0xca, \n\t0x02, 0xbc, 0xff, 0xca, 0x02, 0xbe, 0xff, 0xca, 0x02, 0xc0, 0xff, 0xca, \n\t0x02, 0xc2, 0xff, 0xca, 0x02, 0xc4, 0xff, 0xca, 0x02, 0xc6, 0xff, 0xca, \n\t0x02, 0xc8, 0xff, 0xcc, 0x02, 0xca, 0xff, 0xcc, 0x02, 0xcc, 0xff, 0xcc, \n\t0x02, 0xce, 0xff, 0xca, 0x02, 0xd0, 0xff, 0xcc, 0x02, 0xd2, 0xff, 0xe7, \n\t0x02, 0xd4, 0xff, 0xe7, 0x02, 0xd6, 0xff, 0xe7, 0x02, 0xd8, 0xff, 0xe7, \n\t0x02, 0xda, 0xff, 0xe7, 0x02, 0xdc, 0xff, 0xe7, 0x02, 0xde, 0xff, 0xe7, \n\t0x02, 0xe0, 0xff, 0xe4, 0x02, 0xe2, 0xff, 0xe4, 0x02, 0xe4, 0xff, 0xe4, \n\t0x02, 0xe6, 0xff, 0xe4, 0x02, 0xfa, 0xfe, 0xbb, 0x02, 0xfe, 0xfe, 0xbb, \n\t0x03, 0x02, 0xfe, 0xbb, 0x03, 0x03, 0xfe, 0xbb, 0x03, 0x55, 0xff, 0x87, \n\t0x03, 0xcf, 0x00, 0x14, 0x03, 0xd0, 0x00, 0x14, 0x03, 0xde, 0xff, 0xcc, \n\t0x03, 0xe6, 0xff, 0xca, 0x03, 0xea, 0xff, 0xcc, 0x03, 0xf6, 0x00, 0x14, \n\t0x03, 0xfb, 0xff, 0xcc, 0x03, 0xfd, 0xff, 0xcc, 0x04, 0x05, 0xff, 0xcc, \n\t0x04, 0x07, 0xff, 0xca, 0x00, 0x1f, 0x00, 0x37, 0xff, 0xd9, 0x00, 0x39, \n\t0xff, 0xdf, 0x00, 0x3a, 0xff, 0xe9, 0x00, 0x3c, 0xff, 0xb9, 0x00, 0x9f, \n\t0xff, 0xb9, 0x01, 0x24, 0xff, 0xd9, 0x01, 0x26, 0xff, 0xd9, 0x01, 0x36, \n\t0xff, 0xe9, 0x01, 0x38, 0xff, 0xb9, 0x01, 0x3a, 0xff, 0xb9, 0x01, 0x69, \n\t0xff, 0xb9, 0x01, 0x7f, 0xff, 0xb9, 0x01, 0x85, 0xff, 0xb9, 0x01, 0xca, \n\t0xff, 0xd9, 0x02, 0x28, 0xff, 0xd9, 0x02, 0x2a, 0xff, 0xb9, 0x02, 0x2c, \n\t0xff, 0xb9, 0x02, 0x30, 0xff, 0xd9, 0x02, 0x87, 0xff, 0xe9, 0x02, 0x89, \n\t0xff, 0xe9, 0x02, 0x8b, 0xff, 0xe9, 0x02, 0xdf, 0xff, 0xb9, 0x02, 0xe1, \n\t0xff, 0xb9, 0x02, 0xe3, 0xff, 0xb9, 0x02, 0xe5, 0xff, 0xb9, 0x03, 0x55, \n\t0x00, 0x10, 0x03, 0xcf, 0xff, 0xd9, 0x03, 0xd0, 0xff, 0xd9, 0x03, 0xe7, \n\t0xff, 0xdf, 0x03, 0xe8, 0xff, 0xdf, 0x03, 0xf6, 0xff, 0xd9, 0x00, 0x19, \n\t0x00, 0x37, 0xff, 0xe1, 0x00, 0x39, 0xff, 0xea, 0x00, 0x3c, 0xff, 0xc7, \n\t0x00, 0x9f, 0xff, 0xc7, 0x01, 0x24, 0xff, 0xe1, 0x01, 0x26, 0xff, 0xe1, \n\t0x01, 0x38, 0xff, 0xc7, 0x01, 0x3a, 0xff, 0xc7, 0x01, 0x69, 0xff, 0xc7, \n\t0x01, 0x7f, 0xff, 0xc7, 0x01, 0x85, 0xff, 0xc7, 0x01, 0xca, 0xff, 0xe1, \n\t0x02, 0x28, 0xff, 0xe1, 0x02, 0x2a, 0xff, 0xc7, 0x02, 0x2c, 0xff, 0xc7, \n\t0x02, 0x30, 0xff, 0xe1, 0x02, 0xdf, 0xff, 0xc7, 0x02, 0xe1, 0xff, 0xc7, \n\t0x02, 0xe3, 0xff, 0xc7, 0x02, 0xe5, 0xff, 0xc7, 0x03, 0xcf, 0xff, 0xe1, \n\t0x03, 0xd0, 0xff, 0xe1, 0x03, 0xe7, 0xff, 0xea, 0x03, 0xe8, 0xff, 0xea, \n\t0x03, 0xf6, 0xff, 0xe1, 0x00, 0x10, 0x00, 0x2d, 0xff, 0xeb, 0x00, 0x38, \n\t0xff, 0xeb, 0x00, 0x9b, 0xff, 0xeb, 0x00, 0x9c, 0xff, 0xeb, 0x00, 0x9d, \n\t0xff, 0xeb, 0x00, 0x9e, 0xff, 0xeb, 0x00, 0xf6, 0xff, 0xeb, 0x01, 0x2a, \n\t0xff, 0xeb, 0x01, 0x2c, 0xff, 0xeb, 0x01, 0x2e, 0xff, 0xeb, 0x01, 0x30, \n\t0xff, 0xeb, 0x01, 0x32, 0xff, 0xeb, 0x01, 0x34, 0xff, 0xeb, 0x01, 0xb3, \n\t0xff, 0xeb, 0x02, 0xd1, 0xff, 0xeb, 0x02, 0xd3, 0xff, 0xeb, 0x00, 0x0d, \n\t0x00, 0x05, 0x00, 0x22, 0x00, 0x0a, 0x00, 0x22, 0x00, 0x0c, 0x00, 0x35, \n\t0x00, 0x40, 0x00, 0x42, 0x00, 0x60, 0x00, 0x25, 0x01, 0x51, 0x00, 0x22, \n\t0x02, 0xf8, 0x00, 0x22, 0x02, 0xf9, 0x00, 0x22, 0x02, 0xfb, 0x00, 0x22, \n\t0x02, 0xfc, 0x00, 0x22, 0x02, 0xfd, 0x00, 0x22, 0x03, 0x05, 0x00, 0x22, \n\t0x03, 0x06, 0x00, 0x22, 0x00, 0x3d, 0x00, 0x46, 0xff, 0xe9, 0x00, 0x47, \n\t0xff, 0xe9, 0x00, 0x48, 0xff, 0xe9, 0x00, 0x4a, 0xff, 0xe9, 0x00, 0x54, \n\t0xff, 0xe9, 0x00, 0xa9, 0xff, 0xe9, 0x00, 0xaa, 0xff, 0xe9, 0x00, 0xab, \n\t0xff, 0xe9, 0x00, 0xac, 0xff, 0xe9, 0x00, 0xad, 0xff, 0xe9, 0x00, 0xc9, \n\t0xff, 0xe9, 0x00, 0xcb, 0xff, 0xe9, 0x00, 0xcd, 0xff, 0xe9, 0x00, 0xcf, \n\t0xff, 0xe9, 0x00, 0xd1, 0xff, 0xe9, 0x00, 0xd5, 0xff, 0xe9, 0x00, 0xd7, \n\t0xff, 0xe9, 0x00, 0xd9, 0xff, 0xe9, 0x00, 0xdb, 0xff, 0xe9, 0x00, 0xdd, \n\t0xff, 0xe9, 0x00, 0xdf, 0xff, 0xe9, 0x00, 0xe1, 0xff, 0xe9, 0x00, 0xe3, \n\t0xff, 0xe9, 0x00, 0xe5, 0xff, 0xe9, 0x01, 0x15, 0xff, 0xe9, 0x01, 0x44, \n\t0xff, 0xe9, 0x01, 0x86, 0xff, 0xe9, 0x01, 0x8b, 0xff, 0xe9, 0x01, 0x9c, \n\t0xff, 0xe9, 0x01, 0x9d, 0xff, 0xe9, 0x01, 0xd4, 0xff, 0xe9, 0x01, 0xde, \n\t0xff, 0xe9, 0x01, 0xeb, 0xff, 0xe9, 0x01, 0xec, 0xff, 0xe9, 0x01, 0xef, \n\t0xff, 0xe9, 0x02, 0x0b, 0xff, 0xe9, 0x02, 0x0f, 0xff, 0xe9, 0x02, 0x4d, \n\t0xff, 0xe9, 0x02, 0x4f, 0xff, 0xe9, 0x02, 0x51, 0xff, 0xe9, 0x02, 0x70, \n\t0xff, 0xe9, 0x02, 0x71, 0xff, 0xe9, 0x02, 0x72, 0xff, 0xe9, 0x02, 0x7c, \n\t0xff, 0xe9, 0x02, 0xa6, 0xff, 0xe9, 0x02, 0xa8, 0xff, 0xe9, 0x02, 0xaa, \n\t0xff, 0xe9, 0x02, 0xac, 0xff, 0xe9, 0x02, 0xae, 0xff, 0xe9, 0x02, 0xb0, \n\t0xff, 0xe9, 0x02, 0xb2, 0xff, 0xe9, 0x02, 0xb4, 0xff, 0xe9, 0x02, 0xc8, \n\t0xff, 0xe9, 0x02, 0xca, 0xff, 0xe9, 0x02, 0xcc, 0xff, 0xe9, 0x02, 0xd0, \n\t0xff, 0xe9, 0x03, 0xde, 0xff, 0xe9, 0x03, 0xea, 0xff, 0xe9, 0x03, 0xfb, \n\t0xff, 0xe9, 0x03, 0xfd, 0xff, 0xe9, 0x04, 0x05, 0xff, 0xe9, 0x00, 0x07, \n\t0x00, 0x0f, 0xff, 0xb8, 0x00, 0x11, 0xff, 0xb8, 0x00, 0x1d, 0xff, 0xb8, \n\t0x02, 0xfa, 0xff, 0xb8, 0x02, 0xfe, 0xff, 0xb8, 0x03, 0x02, 0xff, 0xb8, \n\t0x03, 0x03, 0xff, 0xb8, 0x00, 0x10, 0x00, 0x2d, 0xff, 0xe9, 0x00, 0x38, \n\t0xff, 0xe9, 0x00, 0x9b, 0xff, 0xe9, 0x00, 0x9c, 0xff, 0xe9, 0x00, 0x9d, \n\t0xff, 0xe9, 0x00, 0x9e, 0xff, 0xe9, 0x00, 0xf6, 0xff, 0xe9, 0x01, 0x2a, \n\t0xff, 0xe9, 0x01, 0x2c, 0xff, 0xe9, 0x01, 0x2e, 0xff, 0xe9, 0x01, 0x30, \n\t0xff, 0xe9, 0x01, 0x32, 0xff, 0xe9, 0x01, 0x34, 0xff, 0xe9, 0x01, 0xb3, \n\t0xff, 0xe9, 0x02, 0xd1, 0xff, 0xe9, 0x02, 0xd3, 0xff, 0xe9, 0x00, 0x0b, \n\t0x00, 0x5a, 0xff, 0x98, 0x03, 0x3a, 0xff, 0xaa, 0x03, 0x3c, 0xff, 0xd0, \n\t0x03, 0x3d, 0xff, 0xab, 0x03, 0x3e, 0xff, 0xeb, 0x03, 0x3f, 0xff, 0xb1, \n\t0x03, 0x42, 0xff, 0xf0, 0x03, 0x44, 0xff, 0xf0, 0x03, 0x4d, 0xff, 0xef, \n\t0x03, 0x51, 0xff, 0xf1, 0x03, 0x55, 0x00, 0x16, 0x00, 0x03, 0x00, 0x49, \n\t0x00, 0x18, 0x00, 0x57, 0x00, 0x1b, 0x00, 0x5a, 0x00, 0x1b, 0x00, 0x08, \n\t0x00, 0x5a, 0xff, 0xe1, 0x01, 0x80, 0xff, 0xc2, 0x01, 0xa2, 0xff, 0xdf, \n\t0x03, 0x42, 0xff, 0xe9, 0x03, 0x44, 0xff, 0xe9, 0x03, 0x4d, 0xff, 0xe8, \n\t0x03, 0x51, 0xff, 0xea, 0x03, 0x55, 0x00, 0x0f, 0x00, 0x3a, 0x00, 0x26, \n\t0xff, 0xf1, 0x00, 0x2a, 0xff, 0xf1, 0x00, 0x32, 0xff, 0xf1, 0x00, 0x34, \n\t0xff, 0xf1, 0x00, 0x89, 0xff, 0xf1, 0x00, 0x94, 0xff, 0xf1, 0x00, 0x95, \n\t0xff, 0xf1, 0x00, 0x96, 0xff, 0xf1, 0x00, 0x97, 0xff, 0xf1, 0x00, 0x98, \n\t0xff, 0xf1, 0x00, 0x9a, 0xff, 0xf1, 0x00, 0xc8, 0xff, 0xf1, 0x00, 0xca, \n\t0xff, 0xf1, 0x00, 0xcc, 0xff, 0xf1, 0x00, 0xce, 0xff, 0xf1, 0x00, 0xde, \n\t0xff, 0xf1, 0x00, 0xe0, 0xff, 0xf1, 0x00, 0xe2, 0xff, 0xf1, 0x00, 0xe4, \n\t0xff, 0xf1, 0x01, 0x0e, 0xff, 0xf1, 0x01, 0x10, 0xff, 0xf1, 0x01, 0x12, \n\t0xff, 0xf1, 0x01, 0x14, 0xff, 0xf1, 0x01, 0x43, 0xff, 0xf1, 0x01, 0x4c, \n\t0xff, 0xf1, 0x01, 0x68, 0xff, 0xf1, 0x01, 0x73, 0xff, 0xf1, 0x01, 0x7a, \n\t0xff, 0xf1, 0x01, 0x95, 0x00, 0x0f, 0x01, 0xaf, 0xff, 0xf1, 0x01, 0xc6, \n\t0xff, 0xf1, 0x01, 0xc9, 0xff, 0xf1, 0x02, 0x0a, 0xff, 0xf1, 0x02, 0x0c, \n\t0xff, 0xf1, 0x02, 0x0e, 0xff, 0xf1, 0x02, 0x5c, 0xff, 0xf1, 0x02, 0x7b, \n\t0xff, 0xf1, 0x02, 0xb9, 0xff, 0xf1, 0x02, 0xbb, 0xff, 0xf1, 0x02, 0xbd, \n\t0xff, 0xf1, 0x02, 0xbf, 0xff, 0xf1, 0x02, 0xc1, 0xff, 0xf1, 0x02, 0xc3, \n\t0xff, 0xf1, 0x02, 0xc5, 0xff, 0xf1, 0x02, 0xc7, 0xff, 0xf1, 0x02, 0xc9, \n\t0xff, 0xf1, 0x02, 0xcb, 0xff, 0xf1, 0x02, 0xcd, 0xff, 0xf1, 0x02, 0xcf, \n\t0xff, 0xf1, 0x02, 0xe7, 0xff, 0xf1, 0x03, 0xe0, 0xff, 0xf1, 0x03, 0xe5, \n\t0xff, 0xf1, 0x03, 0xe9, 0xff, 0xf1, 0x03, 0xeb, 0xff, 0xf1, 0x03, 0xfa, \n\t0xff, 0xf1, 0x03, 0xfc, 0xff, 0xf1, 0x04, 0x04, 0xff, 0xf1, 0x04, 0x06, \n\t0xff, 0xf1, 0x00, 0x3b, 0x00, 0x26, 0xff, 0xe2, 0x00, 0x2a, 0xff, 0xe2, \n\t0x00, 0x32, 0xff, 0xe2, 0x00, 0x34, 0xff, 0xe2, 0x00, 0x89, 0xff, 0xe2, \n\t0x00, 0x94, 0xff, 0xe2, 0x00, 0x95, 0xff, 0xe2, 0x00, 0x96, 0xff, 0xe2, \n\t0x00, 0x97, 0xff, 0xe2, 0x00, 0x98, 0xff, 0xe2, 0x00, 0x9a, 0xff, 0xe2, \n\t0x00, 0xc8, 0xff, 0xe2, 0x00, 0xca, 0xff, 0xe2, 0x00, 0xcc, 0xff, 0xe2, \n\t0x00, 0xce, 0xff, 0xe2, 0x00, 0xde, 0xff, 0xe2, 0x00, 0xe0, 0xff, 0xe2, \n\t0x00, 0xe2, 0xff, 0xe2, 0x00, 0xe4, 0xff, 0xe2, 0x01, 0x0e, 0xff, 0xe2, \n\t0x01, 0x10, 0xff, 0xe2, 0x01, 0x12, 0xff, 0xe2, 0x01, 0x14, 0xff, 0xe2, \n\t0x01, 0x43, 0xff, 0xe2, 0x01, 0x4c, 0xff, 0xe2, 0x01, 0x68, 0xff, 0xe2, \n\t0x01, 0x73, 0xff, 0xe2, 0x01, 0x7a, 0xff, 0xe2, 0x01, 0x80, 0xff, 0xb7, \n\t0x01, 0x95, 0x00, 0x13, 0x01, 0xaf, 0xff, 0xe2, 0x01, 0xc6, 0xff, 0xe2, \n\t0x01, 0xc9, 0xff, 0xe2, 0x02, 0x0a, 0xff, 0xe2, 0x02, 0x0c, 0xff, 0xe2, \n\t0x02, 0x0e, 0xff, 0xe2, 0x02, 0x5c, 0xff, 0xe2, 0x02, 0x7b, 0xff, 0xe2, \n\t0x02, 0xb9, 0xff, 0xe2, 0x02, 0xbb, 0xff, 0xe2, 0x02, 0xbd, 0xff, 0xe2, \n\t0x02, 0xbf, 0xff, 0xe2, 0x02, 0xc1, 0xff, 0xe2, 0x02, 0xc3, 0xff, 0xe2, \n\t0x02, 0xc5, 0xff, 0xe2, 0x02, 0xc7, 0xff, 0xe2, 0x02, 0xc9, 0xff, 0xe2, \n\t0x02, 0xcb, 0xff, 0xe2, 0x02, 0xcd, 0xff, 0xe2, 0x02, 0xcf, 0xff, 0xe2, \n\t0x02, 0xe7, 0xff, 0xe2, 0x03, 0xe0, 0xff, 0xe2, 0x03, 0xe5, 0xff, 0xe2, \n\t0x03, 0xe9, 0xff, 0xe2, 0x03, 0xeb, 0xff, 0xe2, 0x03, 0xfa, 0xff, 0xe2, \n\t0x03, 0xfc, 0xff, 0xe2, 0x04, 0x04, 0xff, 0xe2, 0x04, 0x06, 0xff, 0xe2, \n\t0x00, 0x37, 0x00, 0x24, 0xff, 0xdf, 0x00, 0x3b, 0xff, 0xca, 0x00, 0x3c, \n\t0xff, 0xcb, 0x00, 0x82, 0xff, 0xdf, 0x00, 0x83, 0xff, 0xdf, 0x00, 0x84, \n\t0xff, 0xdf, 0x00, 0x85, 0xff, 0xdf, 0x00, 0x86, 0xff, 0xdf, 0x00, 0x87, \n\t0xff, 0xdf, 0x00, 0x9f, 0xff, 0xcb, 0x00, 0xc2, 0xff, 0xdf, 0x00, 0xc4, \n\t0xff, 0xdf, 0x00, 0xc6, 0xff, 0xdf, 0x01, 0x38, 0xff, 0xcb, 0x01, 0x3a, \n\t0xff, 0xcb, 0x01, 0x48, 0xff, 0xdf, 0x01, 0x63, 0xff, 0xdf, 0x01, 0x69, \n\t0xff, 0xcb, 0x01, 0x6c, 0xff, 0xdf, 0x01, 0x6f, 0xff, 0xdf, 0x01, 0x76, \n\t0xff, 0xdf, 0x01, 0x7f, 0xff, 0xcb, 0x01, 0x81, 0xff, 0xca, 0x01, 0x85, \n\t0xff, 0xcb, 0x01, 0x95, 0xff, 0xdd, 0x01, 0xba, 0xff, 0xdf, 0x01, 0xcb, \n\t0xff, 0xca, 0x01, 0xfc, 0xff, 0xdf, 0x02, 0x2a, 0xff, 0xcb, 0x02, 0x2c, \n\t0xff, 0xcb, 0x02, 0x2e, 0xff, 0xca, 0x02, 0x46, 0xff, 0xdf, 0x02, 0x48, \n\t0xff, 0xdf, 0x02, 0x52, 0xff, 0xca, 0x02, 0x6b, 0xff, 0xca, 0x02, 0x83, \n\t0xff, 0xdf, 0x02, 0x8d, 0xff, 0xdf, 0x02, 0x8f, 0xff, 0xdf, 0x02, 0x91, \n\t0xff, 0xdf, 0x02, 0x93, 0xff, 0xdf, 0x02, 0x95, 0xff, 0xdf, 0x02, 0x97, \n\t0xff, 0xdf, 0x02, 0x99, 0xff, 0xdf, 0x02, 0x9b, 0xff, 0xdf, 0x02, 0x9d, \n\t0xff, 0xdf, 0x02, 0x9f, 0xff, 0xdf, 0x02, 0xa1, 0xff, 0xdf, 0x02, 0xa3, \n\t0xff, 0xdf, 0x02, 0xdf, 0xff, 0xcb, 0x02, 0xe1, 0xff, 0xcb, 0x02, 0xe3, \n\t0xff, 0xcb, 0x02, 0xe5, 0xff, 0xcb, 0x03, 0xd2, 0xff, 0xca, 0x03, 0xf2, \n\t0xff, 0xca, 0x04, 0x00, 0xff, 0xca, 0x00, 0x28, 0x00, 0x0f, 0xff, 0x82, \n\t0x00, 0x11, 0xff, 0x82, 0x00, 0x1d, 0xff, 0x82, 0x00, 0x24, 0xff, 0xc4, \n\t0x00, 0x82, 0xff, 0xc4, 0x00, 0x83, 0xff, 0xc4, 0x00, 0x84, 0xff, 0xc4, \n\t0x00, 0x85, 0xff, 0xc4, 0x00, 0x86, 0xff, 0xc4, 0x00, 0x87, 0xff, 0xc4, \n\t0x00, 0xc2, 0xff, 0xc4, 0x00, 0xc4, 0xff, 0xc4, 0x00, 0xc6, 0xff, 0xc4, \n\t0x01, 0x48, 0xff, 0xc4, 0x01, 0x63, 0xff, 0xc4, 0x01, 0x6c, 0xff, 0xc4, \n\t0x01, 0x6f, 0xff, 0xc4, 0x01, 0x76, 0xff, 0xc4, 0x01, 0x9b, 0xff, 0xf0, \n\t0x01, 0xba, 0xff, 0xc4, 0x01, 0xfc, 0xff, 0xc4, 0x02, 0x46, 0xff, 0xc4, \n\t0x02, 0x48, 0xff, 0xc4, 0x02, 0x83, 0xff, 0xc4, 0x02, 0x8d, 0xff, 0xc4, \n\t0x02, 0x8f, 0xff, 0xc4, 0x02, 0x91, 0xff, 0xc4, 0x02, 0x93, 0xff, 0xc4, \n\t0x02, 0x95, 0xff, 0xc4, 0x02, 0x97, 0xff, 0xc4, 0x02, 0x99, 0xff, 0xc4, \n\t0x02, 0x9b, 0xff, 0xc4, 0x02, 0x9d, 0xff, 0xc4, 0x02, 0x9f, 0xff, 0xc4, \n\t0x02, 0xa1, 0xff, 0xc4, 0x02, 0xa3, 0xff, 0xc4, 0x02, 0xfa, 0xff, 0x82, \n\t0x02, 0xfe, 0xff, 0x82, 0x03, 0x02, 0xff, 0x82, 0x03, 0x03, 0xff, 0x82, \n\t0x00, 0x01, 0x01, 0x95, 0x00, 0x26, 0x00, 0x02, 0x01, 0x9e, 0xff, 0xea, \n\t0x01, 0xa1, 0xff, 0xe9, 0x00, 0xb0, 0x00, 0x46, 0xff, 0xd6, 0x00, 0x47, \n\t0xff, 0xd6, 0x00, 0x48, 0xff, 0xd6, 0x00, 0x4a, 0xff, 0xd6, 0x00, 0x50, \n\t0xff, 0xe5, 0x00, 0x51, 0xff, 0xe5, 0x00, 0x52, 0xff, 0xcf, 0x00, 0x53, \n\t0xff, 0xe5, 0x00, 0x54, 0xff, 0xd6, 0x00, 0x58, 0xff, 0xd7, 0x00, 0x59, \n\t0xff, 0xdc, 0x00, 0x5c, 0xff, 0xdc, 0x00, 0xa9, 0xff, 0xd6, 0x00, 0xaa, \n\t0xff, 0xd6, 0x00, 0xab, 0xff, 0xd6, 0x00, 0xac, 0xff, 0xd6, 0x00, 0xad, \n\t0xff, 0xd6, 0x00, 0xb3, 0xff, 0xe5, 0x00, 0xb4, 0xff, 0xcf, 0x00, 0xb5, \n\t0xff, 0xcf, 0x00, 0xb6, 0xff, 0xcf, 0x00, 0xb7, 0xff, 0xcf, 0x00, 0xb8, \n\t0xff, 0xcf, 0x00, 0xbb, 0xff, 0xd7, 0x00, 0xbc, 0xff, 0xd7, 0x00, 0xbd, \n\t0xff, 0xd7, 0x00, 0xbe, 0xff, 0xd7, 0x00, 0xbf, 0xff, 0xdc, 0x00, 0xc1, \n\t0xff, 0xdc, 0x00, 0xc9, 0xff, 0xd6, 0x00, 0xcb, 0xff, 0xd6, 0x00, 0xcd, \n\t0xff, 0xd6, 0x00, 0xcf, 0xff, 0xd6, 0x00, 0xd1, 0xff, 0xd6, 0x00, 0xd5, \n\t0xff, 0xd6, 0x00, 0xd7, 0xff, 0xd6, 0x00, 0xd9, 0xff, 0xd6, 0x00, 0xdb, \n\t0xff, 0xd6, 0x00, 0xdd, 0xff, 0xd6, 0x00, 0xdf, 0xff, 0xd6, 0x00, 0xe1, \n\t0xff, 0xd6, 0x00, 0xe3, 0xff, 0xd6, 0x00, 0xe5, 0xff, 0xd6, 0x01, 0x06, \n\t0xff, 0xe5, 0x01, 0x08, 0xff, 0xe5, 0x01, 0x0a, 0xff, 0xe5, 0x01, 0x0b, \n\t0xff, 0xe5, 0x01, 0x0f, 0xff, 0xcf, 0x01, 0x11, 0xff, 0xcf, 0x01, 0x13, \n\t0xff, 0xcf, 0x01, 0x15, 0xff, 0xd6, 0x01, 0x2b, 0xff, 0xd7, 0x01, 0x2d, \n\t0xff, 0xd7, 0x01, 0x2f, 0xff, 0xd7, 0x01, 0x31, 0xff, 0xd7, 0x01, 0x33, \n\t0xff, 0xd7, 0x01, 0x35, 0xff, 0xd7, 0x01, 0x39, 0xff, 0xdc, 0x01, 0x44, \n\t0xff, 0xd6, 0x01, 0x46, 0xff, 0xd7, 0x01, 0x86, 0xff, 0xd6, 0x01, 0x88, \n\t0xff, 0xe5, 0x01, 0x8a, 0xff, 0xd7, 0x01, 0x8b, 0xff, 0xd6, 0x01, 0x8d, \n\t0xff, 0xdc, 0x01, 0x8e, 0xff, 0xeb, 0x01, 0x8f, 0xff, 0xe2, 0x01, 0x91, \n\t0xff, 0xe5, 0x01, 0x92, 0xff, 0xe8, 0x01, 0x93, 0xff, 0xe6, 0x01, 0x97, \n\t0xff, 0xdc, 0x01, 0x98, 0xff, 0xed, 0x01, 0x99, 0xff, 0xcf, 0x01, 0x9a, \n\t0xff, 0xe3, 0x01, 0x9c, 0xff, 0xd6, 0x01, 0x9d, 0xff, 0xd6, 0x01, 0x9e, \n\t0xff, 0xde, 0x01, 0x9f, 0xff, 0xd7, 0x01, 0xa0, 0xff, 0xc5, 0x01, 0xa2, \n\t0xff, 0xcc, 0x01, 0xa3, 0xff, 0xd5, 0x01, 0xa5, 0xff, 0xd7, 0x01, 0xa6, \n\t0xff, 0xcf, 0x01, 0xa7, 0xff, 0xd7, 0x01, 0xd3, 0xff, 0xe5, 0x01, 0xd4, \n\t0xff, 0xd6, 0x01, 0xd5, 0xff, 0xe5, 0x01, 0xd6, 0xff, 0xe5, 0x01, 0xd7, \n\t0xff, 0xe5, 0x01, 0xd9, 0xff, 0xe5, 0x01, 0xda, 0xff, 0xe5, 0x01, 0xdb, \n\t0xff, 0xcf, 0x01, 0xdc, 0xff, 0xe5, 0x01, 0xdd, 0xff, 0xe5, 0x01, 0xde, \n\t0xff, 0xd6, 0x01, 0xe0, 0xff, 0xdc, 0x01, 0xe2, 0xff, 0xe5, 0x01, 0xe4, \n\t0xff, 0xe5, 0x01, 0xe5, 0xff, 0xe5, 0x01, 0xe7, 0xff, 0xe5, 0x01, 0xe9, \n\t0xff, 0xe5, 0x01, 0xeb, 0xff, 0xd6, 0x01, 0xec, 0xff, 0xd6, 0x01, 0xee, \n\t0xff, 0xe5, 0x01, 0xef, 0xff, 0xd6, 0x01, 0xf5, 0xff, 0xe5, 0x01, 0xf7, \n\t0xff, 0xe5, 0x01, 0xf8, 0xff, 0xe5, 0x01, 0xf9, 0xff, 0xdc, 0x02, 0x08, \n\t0xff, 0xdc, 0x02, 0x09, 0xff, 0xdc, 0x02, 0x0b, 0xff, 0xd6, 0x02, 0x0f, \n\t0xff, 0xd6, 0x02, 0x18, 0xff, 0xe5, 0x02, 0x1f, 0xff, 0xe5, 0x02, 0x25, \n\t0xff, 0xe5, 0x02, 0x27, 0xff, 0xe5, 0x02, 0x2b, 0xff, 0xdc, 0x02, 0x3e, \n\t0xff, 0xe5, 0x02, 0x40, 0xff, 0xe5, 0x02, 0x44, 0xff, 0xe5, 0x02, 0x4d, \n\t0xff, 0xd6, 0x02, 0x4f, 0xff, 0xd6, 0x02, 0x51, 0xff, 0xd6, 0x02, 0x59, \n\t0xff, 0xe5, 0x02, 0x5b, 0xff, 0xe5, 0x02, 0x5d, 0xff, 0xcf, 0x02, 0x60, \n\t0xff, 0xdc, 0x02, 0x61, 0xff, 0xdc, 0x02, 0x62, 0xff, 0xdc, 0x02, 0x66, \n\t0xff, 0xe5, 0x02, 0x68, 0xff, 0xe5, 0x02, 0x6a, 0xff, 0xe5, 0x02, 0x70, \n\t0xff, 0xd6, 0x02, 0x71, 0xff, 0xd6, 0x02, 0x72, 0xff, 0xd6, 0x02, 0x7c, \n\t0xff, 0xd6, 0x02, 0x86, 0xff, 0xe5, 0x02, 0xa6, 0xff, 0xd6, 0x02, 0xa8, \n\t0xff, 0xd6, 0x02, 0xaa, 0xff, 0xd6, 0x02, 0xac, 0xff, 0xd6, 0x02, 0xae, \n\t0xff, 0xd6, 0x02, 0xb0, 0xff, 0xd6, 0x02, 0xb2, 0xff, 0xd6, 0x02, 0xb4, \n\t0xff, 0xd6, 0x02, 0xba, 0xff, 0xcf, 0x02, 0xbc, 0xff, 0xcf, 0x02, 0xbe, \n\t0xff, 0xcf, 0x02, 0xc0, 0xff, 0xcf, 0x02, 0xc2, 0xff, 0xcf, 0x02, 0xc4, \n\t0xff, 0xcf, 0x02, 0xc6, 0xff, 0xcf, 0x02, 0xc8, 0xff, 0xd6, 0x02, 0xca, \n\t0xff, 0xd6, 0x02, 0xcc, 0xff, 0xd6, 0x02, 0xce, 0xff, 0xcf, 0x02, 0xd0, \n\t0xff, 0xd6, 0x02, 0xd2, 0xff, 0xd7, 0x02, 0xd4, 0xff, 0xd7, 0x02, 0xd6, \n\t0xff, 0xd7, 0x02, 0xd8, 0xff, 0xd7, 0x02, 0xda, 0xff, 0xd7, 0x02, 0xdc, \n\t0xff, 0xd7, 0x02, 0xde, 0xff, 0xd7, 0x02, 0xe0, 0xff, 0xdc, 0x02, 0xe2, \n\t0xff, 0xdc, 0x02, 0xe4, 0xff, 0xdc, 0x02, 0xe6, 0xff, 0xdc, 0x03, 0xde, \n\t0xff, 0xd6, 0x03, 0xe6, 0xff, 0xcf, 0x03, 0xea, 0xff, 0xd6, 0x03, 0xfb, \n\t0xff, 0xd6, 0x03, 0xfd, 0xff, 0xd6, 0x04, 0x05, 0xff, 0xd6, 0x04, 0x07, \n\t0xff, 0xcf, 0x00, 0x76, 0x00, 0x05, 0xff, 0xd4, 0x00, 0x0a, 0xff, 0xd4, \n\t0x00, 0x46, 0xff, 0xed, 0x00, 0x47, 0xff, 0xed, 0x00, 0x48, 0xff, 0xed, \n\t0x00, 0x4a, 0xff, 0xed, 0x00, 0x54, 0xff, 0xed, 0x00, 0x58, 0xff, 0xec, \n\t0x00, 0x59, 0xff, 0xd6, 0x00, 0x5c, 0xff, 0xd6, 0x00, 0xa9, 0xff, 0xed, \n\t0x00, 0xaa, 0xff, 0xed, 0x00, 0xab, 0xff, 0xed, 0x00, 0xac, 0xff, 0xed, \n\t0x00, 0xad, 0xff, 0xed, 0x00, 0xbb, 0xff, 0xec, 0x00, 0xbc, 0xff, 0xec, \n\t0x00, 0xbd, 0xff, 0xec, 0x00, 0xbe, 0xff, 0xec, 0x00, 0xbf, 0xff, 0xd6, \n\t0x00, 0xc1, 0xff, 0xd6, 0x00, 0xc9, 0xff, 0xed, 0x00, 0xcb, 0xff, 0xed, \n\t0x00, 0xcd, 0xff, 0xed, 0x00, 0xcf, 0xff, 0xed, 0x00, 0xd1, 0xff, 0xed, \n\t0x00, 0xd5, 0xff, 0xed, 0x00, 0xd7, 0xff, 0xed, 0x00, 0xd9, 0xff, 0xed, \n\t0x00, 0xdb, 0xff, 0xed, 0x00, 0xdd, 0xff, 0xed, 0x00, 0xdf, 0xff, 0xed, \n\t0x00, 0xe1, 0xff, 0xed, 0x00, 0xe3, 0xff, 0xed, 0x00, 0xe5, 0xff, 0xed, \n\t0x01, 0x15, 0xff, 0xed, 0x01, 0x2b, 0xff, 0xec, 0x01, 0x2d, 0xff, 0xec, \n\t0x01, 0x2f, 0xff, 0xec, 0x01, 0x31, 0xff, 0xec, 0x01, 0x33, 0xff, 0xec, \n\t0x01, 0x35, 0xff, 0xec, 0x01, 0x39, 0xff, 0xd6, 0x01, 0x44, 0xff, 0xed, \n\t0x01, 0x46, 0xff, 0xec, 0x01, 0x51, 0xff, 0xd4, 0x01, 0x86, 0xff, 0xed, \n\t0x01, 0x8a, 0xff, 0xec, 0x01, 0x8b, 0xff, 0xed, 0x01, 0x8d, 0xff, 0xd6, \n\t0x01, 0x92, 0xff, 0xe9, 0x01, 0x95, 0x00, 0x11, 0x01, 0x97, 0xff, 0xd6, \n\t0x01, 0x9a, 0xff, 0xe7, 0x01, 0x9c, 0xff, 0xed, 0x01, 0x9d, 0xff, 0xed, \n\t0x01, 0x9e, 0xff, 0xd6, 0x01, 0x9f, 0xff, 0xec, 0x01, 0xa0, 0xff, 0xe3, \n\t0x01, 0xa5, 0xff, 0xec, 0x01, 0xa7, 0xff, 0xec, 0x01, 0xd4, 0xff, 0xed, \n\t0x01, 0xde, 0xff, 0xed, 0x01, 0xe0, 0xff, 0xd6, 0x01, 0xeb, 0xff, 0xed, \n\t0x01, 0xec, 0xff, 0xed, 0x01, 0xef, 0xff, 0xed, 0x01, 0xf9, 0xff, 0xd6, \n\t0x02, 0x08, 0xff, 0xd6, 0x02, 0x09, 0xff, 0xd6, 0x02, 0x0b, 0xff, 0xed, \n\t0x02, 0x0f, 0xff, 0xed, 0x02, 0x2b, 0xff, 0xd6, 0x02, 0x4d, 0xff, 0xed, \n\t0x02, 0x4f, 0xff, 0xed, 0x02, 0x51, 0xff, 0xed, 0x02, 0x60, 0xff, 0xd6, \n\t0x02, 0x61, 0xff, 0xd6, 0x02, 0x62, 0xff, 0xd6, 0x02, 0x70, 0xff, 0xed, \n\t0x02, 0x71, 0xff, 0xed, 0x02, 0x72, 0xff, 0xed, 0x02, 0x7c, 0xff, 0xed, \n\t0x02, 0xa6, 0xff, 0xed, 0x02, 0xa8, 0xff, 0xed, 0x02, 0xaa, 0xff, 0xed, \n\t0x02, 0xac, 0xff, 0xed, 0x02, 0xae, 0xff, 0xed, 0x02, 0xb0, 0xff, 0xed, \n\t0x02, 0xb2, 0xff, 0xed, 0x02, 0xb4, 0xff, 0xed, 0x02, 0xc8, 0xff, 0xed, \n\t0x02, 0xca, 0xff, 0xed, 0x02, 0xcc, 0xff, 0xed, 0x02, 0xd0, 0xff, 0xed, \n\t0x02, 0xd2, 0xff, 0xec, 0x02, 0xd4, 0xff, 0xec, 0x02, 0xd6, 0xff, 0xec, \n\t0x02, 0xd8, 0xff, 0xec, 0x02, 0xda, 0xff, 0xec, 0x02, 0xdc, 0xff, 0xec, \n\t0x02, 0xde, 0xff, 0xec, 0x02, 0xe0, 0xff, 0xd6, 0x02, 0xe2, 0xff, 0xd6, \n\t0x02, 0xe4, 0xff, 0xd6, 0x02, 0xe6, 0xff, 0xd6, 0x02, 0xf8, 0xff, 0xd4, \n\t0x02, 0xf9, 0xff, 0xd4, 0x02, 0xfb, 0xff, 0xd4, 0x02, 0xfc, 0xff, 0xd4, \n\t0x02, 0xfd, 0xff, 0xd4, 0x03, 0x05, 0xff, 0xd4, 0x03, 0x06, 0xff, 0xd4, \n\t0x03, 0xde, 0xff, 0xed, 0x03, 0xea, 0xff, 0xed, 0x03, 0xfb, 0xff, 0xed, \n\t0x03, 0xfd, 0xff, 0xed, 0x04, 0x05, 0xff, 0xed, 0x00, 0x3a, 0x00, 0x05, \n\t0xff, 0x8e, 0x00, 0x0a, 0xff, 0x8e, 0x00, 0x49, 0xff, 0xe6, 0x00, 0x58, \n\t0xff, 0xef, 0x00, 0x59, 0xff, 0xbb, 0x00, 0x5c, 0xff, 0xbb, 0x00, 0xbb, \n\t0xff, 0xef, 0x00, 0xbc, 0xff, 0xef, 0x00, 0xbd, 0xff, 0xef, 0x00, 0xbe, \n\t0xff, 0xef, 0x00, 0xbf, 0xff, 0xbb, 0x00, 0xc1, 0xff, 0xbb, 0x01, 0x2b, \n\t0xff, 0xef, 0x01, 0x2d, 0xff, 0xef, 0x01, 0x2f, 0xff, 0xef, 0x01, 0x31, \n\t0xff, 0xef, 0x01, 0x33, 0xff, 0xef, 0x01, 0x35, 0xff, 0xef, 0x01, 0x39, \n\t0xff, 0xbb, 0x01, 0x46, 0xff, 0xef, 0x01, 0x51, 0xff, 0x8e, 0x01, 0x8a, \n\t0xff, 0xef, 0x01, 0x8d, 0xff, 0xbb, 0x01, 0x92, 0xff, 0xeb, 0x01, 0x95, \n\t0x00, 0x13, 0x01, 0x97, 0xff, 0xbb, 0x01, 0x9a, 0xff, 0xe9, 0x01, 0x9e, \n\t0xff, 0xb2, 0x01, 0x9f, 0xff, 0xef, 0x01, 0xa1, 0xff, 0xd4, 0x01, 0xa5, \n\t0xff, 0xef, 0x01, 0xa7, 0xff, 0xef, 0x01, 0xe0, 0xff, 0xbb, 0x01, 0xf9, \n\t0xff, 0xbb, 0x02, 0x08, 0xff, 0xbb, 0x02, 0x09, 0xff, 0xbb, 0x02, 0x2b, \n\t0xff, 0xbb, 0x02, 0x60, 0xff, 0xbb, 0x02, 0x61, 0xff, 0xbb, 0x02, 0x62, \n\t0xff, 0xbb, 0x02, 0xd2, 0xff, 0xef, 0x02, 0xd4, 0xff, 0xef, 0x02, 0xd6, \n\t0xff, 0xef, 0x02, 0xd8, 0xff, 0xef, 0x02, 0xda, 0xff, 0xef, 0x02, 0xdc, \n\t0xff, 0xef, 0x02, 0xde, 0xff, 0xef, 0x02, 0xe0, 0xff, 0xbb, 0x02, 0xe2, \n\t0xff, 0xbb, 0x02, 0xe4, 0xff, 0xbb, 0x02, 0xe6, 0xff, 0xbb, 0x02, 0xf8, \n\t0xff, 0x8e, 0x02, 0xf9, 0xff, 0x8e, 0x02, 0xfb, 0xff, 0x8e, 0x02, 0xfc, \n\t0xff, 0x8e, 0x02, 0xfd, 0xff, 0x8e, 0x03, 0x05, 0xff, 0x8e, 0x03, 0x06, \n\t0xff, 0x8e, 0x00, 0x45, 0x00, 0x0f, 0x00, 0x17, 0x00, 0x11, 0x00, 0x17, \n\t0x00, 0x1d, 0x00, 0x17, 0x00, 0x46, 0xff, 0xe3, 0x00, 0x47, 0xff, 0xe3, \n\t0x00, 0x48, 0xff, 0xe3, 0x00, 0x4a, 0xff, 0xe3, 0x00, 0x54, 0xff, 0xe3, \n\t0x00, 0xa9, 0xff, 0xe3, 0x00, 0xaa, 0xff, 0xe3, 0x00, 0xab, 0xff, 0xe3, \n\t0x00, 0xac, 0xff, 0xe3, 0x00, 0xad, 0xff, 0xe3, 0x00, 0xc9, 0xff, 0xe3, \n\t0x00, 0xcb, 0xff, 0xe3, 0x00, 0xcd, 0xff, 0xe3, 0x00, 0xcf, 0xff, 0xe3, \n\t0x00, 0xd1, 0xff, 0xe3, 0x00, 0xd5, 0xff, 0xe3, 0x00, 0xd7, 0xff, 0xe3, \n\t0x00, 0xd9, 0xff, 0xe3, 0x00, 0xdb, 0xff, 0xe3, 0x00, 0xdd, 0xff, 0xe3, \n\t0x00, 0xdf, 0xff, 0xe3, 0x00, 0xe1, 0xff, 0xe3, 0x00, 0xe3, 0xff, 0xe3, \n\t0x00, 0xe5, 0xff, 0xe3, 0x01, 0x15, 0xff, 0xe3, 0x01, 0x44, 0xff, 0xe3, \n\t0x01, 0x86, 0xff, 0xe3, 0x01, 0x8b, 0xff, 0xe3, 0x01, 0x95, 0x00, 0x11, \n\t0x01, 0x9c, 0xff, 0xe3, 0x01, 0x9d, 0xff, 0xe3, 0x01, 0xd4, 0xff, 0xe3, \n\t0x01, 0xde, 0xff, 0xe3, 0x01, 0xeb, 0xff, 0xe3, 0x01, 0xec, 0xff, 0xe3, \n\t0x01, 0xef, 0xff, 0xe3, 0x02, 0x0b, 0xff, 0xe3, 0x02, 0x0f, 0xff, 0xe3, \n\t0x02, 0x4d, 0xff, 0xe3, 0x02, 0x4f, 0xff, 0xe3, 0x02, 0x51, 0xff, 0xe3, \n\t0x02, 0x70, 0xff, 0xe3, 0x02, 0x71, 0xff, 0xe3, 0x02, 0x72, 0xff, 0xe3, \n\t0x02, 0x7c, 0xff, 0xe3, 0x02, 0xa6, 0xff, 0xe3, 0x02, 0xa8, 0xff, 0xe3, \n\t0x02, 0xaa, 0xff, 0xe3, 0x02, 0xac, 0xff, 0xe3, 0x02, 0xae, 0xff, 0xe3, \n\t0x02, 0xb0, 0xff, 0xe3, 0x02, 0xb2, 0xff, 0xe3, 0x02, 0xb4, 0xff, 0xe3, \n\t0x02, 0xc8, 0xff, 0xe3, 0x02, 0xca, 0xff, 0xe3, 0x02, 0xcc, 0xff, 0xe3, \n\t0x02, 0xd0, 0xff, 0xe3, 0x02, 0xfa, 0x00, 0x17, 0x02, 0xfe, 0x00, 0x17, \n\t0x03, 0x02, 0x00, 0x17, 0x03, 0x03, 0x00, 0x17, 0x03, 0xde, 0xff, 0xe3, \n\t0x03, 0xea, 0xff, 0xe3, 0x03, 0xfb, 0xff, 0xe3, 0x03, 0xfd, 0xff, 0xe3, \n\t0x04, 0x05, 0xff, 0xe3, 0x00, 0x01, 0x01, 0x9e, 0x00, 0x0c, 0x00, 0x7e, \n\t0x00, 0x05, 0x00, 0x0e, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x46, 0xff, 0xe4, \n\t0x00, 0x47, 0xff, 0xe4, 0x00, 0x48, 0xff, 0xe4, 0x00, 0x49, 0x00, 0x0e, \n\t0x00, 0x4a, 0xff, 0xe4, 0x00, 0x52, 0xff, 0xe7, 0x00, 0x54, 0xff, 0xe4, \n\t0x00, 0x59, 0x00, 0x0c, 0x00, 0x5c, 0x00, 0x0c, 0x00, 0xa9, 0xff, 0xe4, \n\t0x00, 0xaa, 0xff, 0xe4, 0x00, 0xab, 0xff, 0xe4, 0x00, 0xac, 0xff, 0xe4, \n\t0x00, 0xad, 0xff, 0xe4, 0x00, 0xb4, 0xff, 0xe7, 0x00, 0xb5, 0xff, 0xe7, \n\t0x00, 0xb6, 0xff, 0xe7, 0x00, 0xb7, 0xff, 0xe7, 0x00, 0xb8, 0xff, 0xe7, \n\t0x00, 0xbf, 0x00, 0x0c, 0x00, 0xc1, 0x00, 0x0c, 0x00, 0xc9, 0xff, 0xe4, \n\t0x00, 0xcb, 0xff, 0xe4, 0x00, 0xcd, 0xff, 0xe4, 0x00, 0xcf, 0xff, 0xe4, \n\t0x00, 0xd1, 0xff, 0xe4, 0x00, 0xd5, 0xff, 0xe4, 0x00, 0xd7, 0xff, 0xe4, \n\t0x00, 0xd9, 0xff, 0xe4, 0x00, 0xdb, 0xff, 0xe4, 0x00, 0xdd, 0xff, 0xe4, \n\t0x00, 0xdf, 0xff, 0xe4, 0x00, 0xe1, 0xff, 0xe4, 0x00, 0xe3, 0xff, 0xe4, \n\t0x00, 0xe5, 0xff, 0xe4, 0x01, 0x0f, 0xff, 0xe7, 0x01, 0x11, 0xff, 0xe7, \n\t0x01, 0x13, 0xff, 0xe7, 0x01, 0x15, 0xff, 0xe4, 0x01, 0x39, 0x00, 0x0c, \n\t0x01, 0x44, 0xff, 0xe4, 0x01, 0x51, 0x00, 0x0e, 0x01, 0x86, 0xff, 0xe4, \n\t0x01, 0x8b, 0xff, 0xe4, 0x01, 0x8d, 0x00, 0x0c, 0x01, 0x8e, 0xff, 0xea, \n\t0x01, 0x97, 0x00, 0x0c, 0x01, 0x99, 0xff, 0xe7, 0x01, 0x9a, 0x00, 0x0c, \n\t0x01, 0x9c, 0xff, 0xe4, 0x01, 0x9d, 0xff, 0xe4, 0x01, 0x9e, 0x00, 0x0e, \n\t0x01, 0xa6, 0xff, 0xe7, 0x01, 0xd4, 0xff, 0xe4, 0x01, 0xdb, 0xff, 0xe7, \n\t0x01, 0xde, 0xff, 0xe4, 0x01, 0xe0, 0x00, 0x0c, 0x01, 0xeb, 0xff, 0xe4, \n\t0x01, 0xec, 0xff, 0xe4, 0x01, 0xef, 0xff, 0xe4, 0x01, 0xf9, 0x00, 0x0c, \n\t0x02, 0x08, 0x00, 0x0c, 0x02, 0x09, 0x00, 0x0c, 0x02, 0x0b, 0xff, 0xe4, \n\t0x02, 0x0f, 0xff, 0xe4, 0x02, 0x2b, 0x00, 0x0c, 0x02, 0x4d, 0xff, 0xe4, \n\t0x02, 0x4f, 0xff, 0xe4, 0x02, 0x51, 0xff, 0xe4, 0x02, 0x5d, 0xff, 0xe7, \n\t0x02, 0x60, 0x00, 0x0c, 0x02, 0x61, 0x00, 0x0c, 0x02, 0x62, 0x00, 0x0c, \n\t0x02, 0x70, 0xff, 0xe4, 0x02, 0x71, 0xff, 0xe4, 0x02, 0x72, 0xff, 0xe4, \n\t0x02, 0x7c, 0xff, 0xe4, 0x02, 0xa6, 0xff, 0xe4, 0x02, 0xa8, 0xff, 0xe4, \n\t0x02, 0xaa, 0xff, 0xe4, 0x02, 0xac, 0xff, 0xe4, 0x02, 0xae, 0xff, 0xe4, \n\t0x02, 0xb0, 0xff, 0xe4, 0x02, 0xb2, 0xff, 0xe4, 0x02, 0xb4, 0xff, 0xe4, \n\t0x02, 0xba, 0xff, 0xe7, 0x02, 0xbc, 0xff, 0xe7, 0x02, 0xbe, 0xff, 0xe7, \n\t0x02, 0xc0, 0xff, 0xe7, 0x02, 0xc2, 0xff, 0xe7, 0x02, 0xc4, 0xff, 0xe7, \n\t0x02, 0xc6, 0xff, 0xe7, 0x02, 0xc8, 0xff, 0xe4, 0x02, 0xca, 0xff, 0xe4, \n\t0x02, 0xcc, 0xff, 0xe4, 0x02, 0xce, 0xff, 0xe7, 0x02, 0xd0, 0xff, 0xe4, \n\t0x02, 0xe0, 0x00, 0x0c, 0x02, 0xe2, 0x00, 0x0c, 0x02, 0xe4, 0x00, 0x0c, \n\t0x02, 0xe6, 0x00, 0x0c, 0x02, 0xf8, 0x00, 0x0e, 0x02, 0xf9, 0x00, 0x0e, \n\t0x02, 0xfb, 0x00, 0x0e, 0x02, 0xfc, 0x00, 0x0e, 0x02, 0xfd, 0x00, 0x0e, \n\t0x03, 0x05, 0x00, 0x0e, 0x03, 0x06, 0x00, 0x0e, 0x03, 0x3a, 0x00, 0x0f, \n\t0x03, 0x3d, 0x00, 0x0f, 0x03, 0x3f, 0x00, 0x10, 0x03, 0x40, 0xff, 0xf4, \n\t0x03, 0x42, 0xff, 0xe9, 0x03, 0x44, 0xff, 0xea, 0x03, 0x4d, 0xff, 0xe9, \n\t0x03, 0x51, 0xff, 0xeb, 0x03, 0x55, 0xff, 0xb3, 0x03, 0xde, 0xff, 0xe4, \n\t0x03, 0xe6, 0xff, 0xe7, 0x03, 0xea, 0xff, 0xe4, 0x03, 0xfb, 0xff, 0xe4, \n\t0x03, 0xfd, 0xff, 0xe4, 0x04, 0x05, 0xff, 0xe4, 0x04, 0x07, 0xff, 0xe7, \n\t0x00, 0x0d, 0x00, 0x5b, 0xff, 0xea, 0x00, 0x5d, 0xff, 0xea, 0x01, 0x3c, \n\t0xff, 0xea, 0x01, 0x3e, 0xff, 0xea, 0x01, 0x40, 0xff, 0xea, 0x01, 0xa1, \n\t0xff, 0xdc, 0x01, 0xe1, 0xff, 0xea, 0x02, 0x2f, 0xff, 0xea, 0x02, 0x53, \n\t0xff, 0xea, 0x02, 0x6c, 0xff, 0xea, 0x03, 0xdc, 0xff, 0xea, 0x03, 0xf3, \n\t0xff, 0xea, 0x04, 0x01, 0xff, 0xea, 0x00, 0x64, 0x00, 0x05, 0x00, 0x0c, \n\t0x00, 0x0a, 0x00, 0x0c, 0x00, 0x46, 0xff, 0xe8, 0x00, 0x47, 0xff, 0xe8, \n\t0x00, 0x48, 0xff, 0xe8, 0x00, 0x49, 0x00, 0x0c, 0x00, 0x4a, 0xff, 0xe8, \n\t0x00, 0x52, 0xff, 0xe6, 0x00, 0x54, 0xff, 0xe8, 0x00, 0xa9, 0xff, 0xe8, \n\t0x00, 0xaa, 0xff, 0xe8, 0x00, 0xab, 0xff, 0xe8, 0x00, 0xac, 0xff, 0xe8, \n\t0x00, 0xad, 0xff, 0xe8, 0x00, 0xb4, 0xff, 0xe6, 0x00, 0xb5, 0xff, 0xe6, \n\t0x00, 0xb6, 0xff, 0xe6, 0x00, 0xb7, 0xff, 0xe6, 0x00, 0xb8, 0xff, 0xe6, \n\t0x00, 0xc9, 0xff, 0xe8, 0x00, 0xcb, 0xff, 0xe8, 0x00, 0xcd, 0xff, 0xe8, \n\t0x00, 0xcf, 0xff, 0xe8, 0x00, 0xd1, 0xff, 0xe8, 0x00, 0xd5, 0xff, 0xe8, \n\t0x00, 0xd7, 0xff, 0xe8, 0x00, 0xd9, 0xff, 0xe8, 0x00, 0xdb, 0xff, 0xe8, \n\t0x00, 0xdd, 0xff, 0xe8, 0x00, 0xdf, 0xff, 0xe8, 0x00, 0xe1, 0xff, 0xe8, \n\t0x00, 0xe3, 0xff, 0xe8, 0x00, 0xe5, 0xff, 0xe8, 0x01, 0x0f, 0xff, 0xe6, \n\t0x01, 0x11, 0xff, 0xe6, 0x01, 0x13, 0xff, 0xe6, 0x01, 0x15, 0xff, 0xe8, \n\t0x01, 0x44, 0xff, 0xe8, 0x01, 0x51, 0x00, 0x0c, 0x01, 0x86, 0xff, 0xe8, \n\t0x01, 0x8b, 0xff, 0xe8, 0x01, 0x8e, 0xff, 0xeb, 0x01, 0x8f, 0xff, 0xf0, \n\t0x01, 0x99, 0xff, 0xe6, 0x01, 0x9c, 0xff, 0xe8, 0x01, 0x9d, 0xff, 0xe8, \n\t0x01, 0xa0, 0xff, 0xef, 0x01, 0xa1, 0x00, 0x11, 0x01, 0xa3, 0xff, 0xec, \n\t0x01, 0xa6, 0xff, 0xe6, 0x01, 0xd4, 0xff, 0xe8, 0x01, 0xdb, 0xff, 0xe6, \n\t0x01, 0xde, 0xff, 0xe8, 0x01, 0xeb, 0xff, 0xe8, 0x01, 0xec, 0xff, 0xe8, \n\t0x01, 0xef, 0xff, 0xe8, 0x02, 0x0b, 0xff, 0xe8, 0x02, 0x0f, 0xff, 0xe8, \n\t0x02, 0x4d, 0xff, 0xe8, 0x02, 0x4f, 0xff, 0xe8, 0x02, 0x51, 0xff, 0xe8, \n\t0x02, 0x5d, 0xff, 0xe6, 0x02, 0x70, 0xff, 0xe8, 0x02, 0x71, 0xff, 0xe8, \n\t0x02, 0x72, 0xff, 0xe8, 0x02, 0x7c, 0xff, 0xe8, 0x02, 0xa6, 0xff, 0xe8, \n\t0x02, 0xa8, 0xff, 0xe8, 0x02, 0xaa, 0xff, 0xe8, 0x02, 0xac, 0xff, 0xe8, \n\t0x02, 0xae, 0xff, 0xe8, 0x02, 0xb0, 0xff, 0xe8, 0x02, 0xb2, 0xff, 0xe8, \n\t0x02, 0xb4, 0xff, 0xe8, 0x02, 0xba, 0xff, 0xe6, 0x02, 0xbc, 0xff, 0xe6, \n\t0x02, 0xbe, 0xff, 0xe6, 0x02, 0xc0, 0xff, 0xe6, 0x02, 0xc2, 0xff, 0xe6, \n\t0x02, 0xc4, 0xff, 0xe6, 0x02, 0xc6, 0xff, 0xe6, 0x02, 0xc8, 0xff, 0xe8, \n\t0x02, 0xca, 0xff, 0xe8, 0x02, 0xcc, 0xff, 0xe8, 0x02, 0xce, 0xff, 0xe6, \n\t0x02, 0xd0, 0xff, 0xe8, 0x02, 0xf8, 0x00, 0x0c, 0x02, 0xf9, 0x00, 0x0c, \n\t0x02, 0xfb, 0x00, 0x0c, 0x02, 0xfc, 0x00, 0x0c, 0x02, 0xfd, 0x00, 0x0c, \n\t0x03, 0x05, 0x00, 0x0c, 0x03, 0x06, 0x00, 0x0c, 0x03, 0xde, 0xff, 0xe8, \n\t0x03, 0xe6, 0xff, 0xe6, 0x03, 0xea, 0xff, 0xe8, 0x03, 0xfb, 0xff, 0xe8, \n\t0x03, 0xfd, 0xff, 0xe8, 0x04, 0x05, 0xff, 0xe8, 0x04, 0x07, 0xff, 0xe6, \n\t0x00, 0x0c, 0x00, 0x5b, 0xff, 0xf0, 0x00, 0x5d, 0xff, 0xf0, 0x01, 0x3c, \n\t0xff, 0xf0, 0x01, 0x3e, 0xff, 0xf0, 0x01, 0x40, 0xff, 0xf0, 0x01, 0xe1, \n\t0xff, 0xf0, 0x02, 0x2f, 0xff, 0xf0, 0x02, 0x53, 0xff, 0xf0, 0x02, 0x6c, \n\t0xff, 0xf0, 0x03, 0xdc, 0xff, 0xf0, 0x03, 0xf3, 0xff, 0xf0, 0x04, 0x01, \n\t0xff, 0xf0, 0x00, 0x1f, 0x00, 0x59, 0xff, 0xf2, 0x00, 0x5b, 0xff, 0xf0, \n\t0x00, 0x5c, 0xff, 0xf2, 0x00, 0x5d, 0xff, 0xf1, 0x00, 0xbf, 0xff, 0xf2, \n\t0x00, 0xc1, 0xff, 0xf2, 0x01, 0x39, 0xff, 0xf2, 0x01, 0x3c, 0xff, 0xf1, \n\t0x01, 0x3e, 0xff, 0xf1, 0x01, 0x40, 0xff, 0xf1, 0x01, 0x8d, 0xff, 0xf2, \n\t0x01, 0x97, 0xff, 0xf2, 0x01, 0xe0, 0xff, 0xf2, 0x01, 0xe1, 0xff, 0xf0, \n\t0x01, 0xf9, 0xff, 0xf2, 0x02, 0x08, 0xff, 0xf2, 0x02, 0x09, 0xff, 0xf2, \n\t0x02, 0x2b, 0xff, 0xf2, 0x02, 0x2f, 0xff, 0xf0, 0x02, 0x53, 0xff, 0xf0, \n\t0x02, 0x60, 0xff, 0xf2, 0x02, 0x61, 0xff, 0xf2, 0x02, 0x62, 0xff, 0xf2, \n\t0x02, 0x6c, 0xff, 0xf0, 0x02, 0xe0, 0xff, 0xf2, 0x02, 0xe2, 0xff, 0xf2, \n\t0x02, 0xe4, 0xff, 0xf2, 0x02, 0xe6, 0xff, 0xf2, 0x03, 0xdc, 0xff, 0xf0, \n\t0x03, 0xf3, 0xff, 0xf0, 0x04, 0x01, 0xff, 0xf0, 0x00, 0x3b, 0x00, 0x37, \n\t0xff, 0xe2, 0x00, 0x39, 0xff, 0xe3, 0x00, 0x3b, 0xff, 0xf0, 0x00, 0x3c, \n\t0xff, 0xe3, 0x00, 0x5b, 0xff, 0xef, 0x00, 0x9f, 0xff, 0xe3, 0x01, 0x24, \n\t0xff, 0xe2, 0x01, 0x26, 0xff, 0xe2, 0x01, 0x38, 0xff, 0xe3, 0x01, 0x3a, \n\t0xff, 0xe3, 0x01, 0x69, 0xff, 0xe3, 0x01, 0x7f, 0xff, 0xe3, 0x01, 0x81, \n\t0xff, 0xf0, 0x01, 0x85, 0xff, 0xe3, 0x01, 0xb8, 0xff, 0xeb, 0x01, 0xca, \n\t0xff, 0xe2, 0x01, 0xcb, 0xff, 0xf0, 0x01, 0xcd, 0xff, 0xe4, 0x01, 0xdf, \n\t0xff, 0xc7, 0x01, 0xe1, 0xff, 0xef, 0x02, 0x28, 0xff, 0xe2, 0x02, 0x2a, \n\t0xff, 0xe3, 0x02, 0x2c, 0xff, 0xe3, 0x02, 0x2e, 0xff, 0xf0, 0x02, 0x2f, \n\t0xff, 0xef, 0x02, 0x30, 0xff, 0xe2, 0x02, 0x32, 0xff, 0xe4, 0x02, 0x34, \n\t0xff, 0xe4, 0x02, 0x41, 0xff, 0xe4, 0x02, 0x52, 0xff, 0xf0, 0x02, 0x53, \n\t0xff, 0xef, 0x02, 0x63, 0xff, 0xe4, 0x02, 0x6b, 0xff, 0xf0, 0x02, 0x6c, \n\t0xff, 0xef, 0x02, 0x73, 0xff, 0xe3, 0x02, 0x75, 0xff, 0xea, 0x02, 0x7d, \n\t0xff, 0xe2, 0x02, 0x7e, 0xff, 0xc7, 0x02, 0xdf, 0xff, 0xe3, 0x02, 0xe1, \n\t0xff, 0xe3, 0x02, 0xe3, 0xff, 0xe3, 0x02, 0xe5, 0xff, 0xe3, 0x03, 0xcf, \n\t0xff, 0xe2, 0x03, 0xd0, 0xff, 0xe2, 0x03, 0xd2, 0xff, 0xf0, 0x03, 0xd3, \n\t0xff, 0xeb, 0x03, 0xd8, 0xff, 0xe2, 0x03, 0xdc, 0xff, 0xef, 0x03, 0xe7, \n\t0xff, 0xe3, 0x03, 0xe8, 0xff, 0xe3, 0x03, 0xf2, 0xff, 0xf0, 0x03, 0xf3, \n\t0xff, 0xef, 0x03, 0xf6, 0xff, 0xe2, 0x03, 0xf7, 0xff, 0xc5, 0x04, 0x00, \n\t0xff, 0xf0, 0x04, 0x01, 0xff, 0xef, 0x04, 0x08, 0xff, 0xeb, 0x04, 0x09, \n\t0xff, 0xeb, 0x04, 0x0a, 0xff, 0xeb, 0x00, 0x01, 0x02, 0x7d, 0xff, 0xe2, \n\t0x00, 0x31, 0x00, 0x1a, 0xff, 0xf0, 0x00, 0x37, 0xff, 0xef, 0x00, 0x39, \n\t0xff, 0xf2, 0x00, 0x3b, 0xff, 0xf2, 0x00, 0x3c, 0xff, 0xed, 0x00, 0x9f, \n\t0xff, 0xed, 0x01, 0x24, 0xff, 0xef, 0x01, 0x26, 0xff, 0xef, 0x01, 0x38, \n\t0xff, 0xed, 0x01, 0x3a, 0xff, 0xed, 0x01, 0x69, 0xff, 0xed, 0x01, 0x7f, \n\t0xff, 0xed, 0x01, 0x81, 0xff, 0xf2, 0x01, 0x85, 0xff, 0xed, 0x01, 0xb4, \n\t0xff, 0xf4, 0x01, 0xb8, 0xff, 0xf1, 0x01, 0xc3, 0xff, 0xf4, 0x01, 0xca, \n\t0xff, 0xef, 0x01, 0xcb, 0xff, 0xf2, 0x02, 0x28, 0xff, 0xef, 0x02, 0x2a, \n\t0xff, 0xed, 0x02, 0x2c, 0xff, 0xed, 0x02, 0x2e, 0xff, 0xf2, 0x02, 0x30, \n\t0xff, 0xef, 0x02, 0x3b, 0xff, 0xf4, 0x02, 0x52, 0xff, 0xf2, 0x02, 0x6b, \n\t0xff, 0xf2, 0x02, 0x73, 0xff, 0xf0, 0x02, 0x75, 0xff, 0xf0, 0x02, 0x77, \n\t0xff, 0xf4, 0x02, 0x7d, 0xff, 0xf0, 0x02, 0x81, 0xff, 0xf4, 0x02, 0xdf, \n\t0xff, 0xed, 0x02, 0xe1, 0xff, 0xed, 0x02, 0xe3, 0xff, 0xed, 0x02, 0xe5, \n\t0xff, 0xed, 0x03, 0xcf, 0xff, 0xef, 0x03, 0xd0, 0xff, 0xef, 0x03, 0xd2, \n\t0xff, 0xf2, 0x03, 0xd3, 0xff, 0xf1, 0x03, 0xd8, 0xff, 0xef, 0x03, 0xe7, \n\t0xff, 0xf2, 0x03, 0xe8, 0xff, 0xf2, 0x03, 0xf2, 0xff, 0xf2, 0x03, 0xf6, \n\t0xff, 0xef, 0x04, 0x00, 0xff, 0xf2, 0x04, 0x08, 0xff, 0xf1, 0x04, 0x09, \n\t0xff, 0xf1, 0x04, 0x0a, 0xff, 0xf1, 0x00, 0x09, 0x00, 0x57, 0x00, 0x10, \n\t0x00, 0x88, 0xff, 0x5b, 0x01, 0x8e, 0xff, 0xec, 0x01, 0x95, 0xff, 0xc7, \n\t0x01, 0x9b, 0xff, 0xac, 0x02, 0x6f, 0xff, 0xd9, 0x03, 0x55, 0xff, 0x5f, \n\t0x03, 0xd1, 0xff, 0x45, 0x03, 0xdb, 0xff, 0x49, 0x00, 0x2f, 0x00, 0x37, \n\t0xff, 0xde, 0x00, 0x3b, 0xff, 0xe1, 0x00, 0x3c, 0xff, 0xdf, 0x00, 0x9f, \n\t0xff, 0xdf, 0x01, 0x24, 0xff, 0xde, 0x01, 0x26, 0xff, 0xde, 0x01, 0x38, \n\t0xff, 0xdf, 0x01, 0x3a, 0xff, 0xdf, 0x01, 0x69, 0xff, 0xdf, 0x01, 0x7f, \n\t0xff, 0xdf, 0x01, 0x81, 0xff, 0xe1, 0x01, 0x85, 0xff, 0xdf, 0x01, 0xb4, \n\t0xff, 0xe1, 0x01, 0xb8, 0xff, 0xe6, 0x01, 0xc3, 0xff, 0xe1, 0x01, 0xca, \n\t0xff, 0xde, 0x01, 0xcb, 0xff, 0xe1, 0x01, 0xd8, 0xff, 0xe7, 0x01, 0xf4, \n\t0xff, 0xe7, 0x02, 0x28, 0xff, 0xde, 0x02, 0x2a, 0xff, 0xdf, 0x02, 0x2c, \n\t0xff, 0xdf, 0x02, 0x2e, 0xff, 0xe1, 0x02, 0x30, 0xff, 0xde, 0x02, 0x3b, \n\t0xff, 0xe1, 0x02, 0x3c, 0xff, 0xe7, 0x02, 0x52, 0xff, 0xe1, 0x02, 0x6b, \n\t0xff, 0xe1, 0x02, 0x77, 0xff, 0xe1, 0x02, 0x7d, 0xff, 0xdf, 0x02, 0x81, \n\t0xff, 0xe1, 0x02, 0x82, 0xff, 0xe7, 0x02, 0xdf, 0xff, 0xdf, 0x02, 0xe1, \n\t0xff, 0xdf, 0x02, 0xe3, 0xff, 0xdf, 0x02, 0xe5, 0xff, 0xdf, 0x03, 0xcf, \n\t0xff, 0xde, 0x03, 0xd0, 0xff, 0xde, 0x03, 0xd1, 0xff, 0xdd, 0x03, 0xd2, \n\t0xff, 0xe1, 0x03, 0xd3, 0xff, 0xe6, 0x03, 0xf2, 0xff, 0xe1, 0x03, 0xf6, \n\t0xff, 0xde, 0x04, 0x00, 0xff, 0xe1, 0x04, 0x08, 0xff, 0xe6, 0x04, 0x09, \n\t0xff, 0xe6, 0x04, 0x0a, 0xff, 0xe6, 0x00, 0x22, 0x00, 0x37, 0xff, 0xdd, \n\t0x00, 0x3b, 0xff, 0xdf, 0x01, 0x24, 0xff, 0xdd, 0x01, 0x26, 0xff, 0xdd, \n\t0x01, 0x81, 0xff, 0xdf, 0x01, 0xb4, 0xff, 0xdf, 0x01, 0xb8, 0xff, 0xe6, \n\t0x01, 0xc3, 0xff, 0xdf, 0x01, 0xca, 0xff, 0xdd, 0x01, 0xcb, 0xff, 0xdf, \n\t0x01, 0xd8, 0xff, 0xe8, 0x01, 0xf4, 0xff, 0xe8, 0x02, 0x28, 0xff, 0xdd, \n\t0x02, 0x2e, 0xff, 0xdf, 0x02, 0x30, 0xff, 0xdd, 0x02, 0x3b, 0xff, 0xdf, \n\t0x02, 0x3c, 0xff, 0xe8, 0x02, 0x52, 0xff, 0xdf, 0x02, 0x6b, 0xff, 0xdf, \n\t0x02, 0x77, 0xff, 0xdf, 0x02, 0x81, 0xff, 0xdf, 0x02, 0x82, 0xff, 0xe8, \n\t0x03, 0xcf, 0xff, 0xdd, 0x03, 0xd0, 0xff, 0xdd, 0x03, 0xd1, 0xff, 0xdc, \n\t0x03, 0xd2, 0xff, 0xdf, 0x03, 0xd3, 0xff, 0xe6, 0x03, 0xdb, 0xff, 0xdf, \n\t0x03, 0xf2, 0xff, 0xdf, 0x03, 0xf6, 0xff, 0xdd, 0x04, 0x00, 0xff, 0xdf, \n\t0x04, 0x08, 0xff, 0xe6, 0x04, 0x09, 0xff, 0xe6, 0x04, 0x0a, 0xff, 0xe6, \n\t0x00, 0x21, 0x00, 0x05, 0xff, 0xf0, 0x00, 0x0a, 0xff, 0xf0, 0x00, 0x59, \n\t0xff, 0xf4, 0x00, 0x5c, 0xff, 0xf4, 0x00, 0xbf, 0xff, 0xf4, 0x00, 0xc1, \n\t0xff, 0xf4, 0x01, 0x39, 0xff, 0xf4, 0x01, 0x51, 0xff, 0xf0, 0x01, 0x8d, \n\t0xff, 0xf4, 0x01, 0x97, 0xff, 0xf4, 0x01, 0xdf, 0xff, 0xf2, 0x01, 0xe0, \n\t0xff, 0xf4, 0x01, 0xf9, 0xff, 0xf4, 0x02, 0x08, 0xff, 0xf4, 0x02, 0x09, \n\t0xff, 0xf4, 0x02, 0x2b, 0xff, 0xf4, 0x02, 0x60, 0xff, 0xf4, 0x02, 0x61, \n\t0xff, 0xf4, 0x02, 0x62, 0xff, 0xf4, 0x02, 0x7e, 0xff, 0xf4, 0x02, 0xe0, \n\t0xff, 0xf4, 0x02, 0xe2, 0xff, 0xf4, 0x02, 0xe4, 0xff, 0xf4, 0x02, 0xe6, \n\t0xff, 0xf4, 0x02, 0xf8, 0xff, 0xf0, 0x02, 0xf9, 0xff, 0xf0, 0x02, 0xfb, \n\t0xff, 0xf0, 0x02, 0xfc, 0xff, 0xf0, 0x02, 0xfd, 0xff, 0xf0, 0x03, 0x05, \n\t0xff, 0xf0, 0x03, 0x06, 0xff, 0xf0, 0x03, 0xe1, 0xff, 0xf4, 0x03, 0xf7, \n\t0xff, 0xf4, 0x00, 0x59, 0x00, 0x46, 0xff, 0xed, 0x00, 0x47, 0xff, 0xed, \n\t0x00, 0x48, 0xff, 0xed, 0x00, 0x4a, 0xff, 0xed, 0x00, 0x52, 0xff, 0xdf, \n\t0x00, 0x54, 0xff, 0xed, 0x00, 0xa9, 0xff, 0xed, 0x00, 0xaa, 0xff, 0xed, \n\t0x00, 0xab, 0xff, 0xed, 0x00, 0xac, 0xff, 0xed, 0x00, 0xad, 0xff, 0xed, \n\t0x00, 0xb4, 0xff, 0xdf, 0x00, 0xb5, 0xff, 0xdf, 0x00, 0xb6, 0xff, 0xdf, \n\t0x00, 0xb7, 0xff, 0xdf, 0x00, 0xb8, 0xff, 0xdf, 0x00, 0xc9, 0xff, 0xed, \n\t0x00, 0xcb, 0xff, 0xed, 0x00, 0xcd, 0xff, 0xed, 0x00, 0xcf, 0xff, 0xed, \n\t0x00, 0xd1, 0xff, 0xed, 0x00, 0xd5, 0xff, 0xed, 0x00, 0xd7, 0xff, 0xed, \n\t0x00, 0xd9, 0xff, 0xed, 0x00, 0xdb, 0xff, 0xed, 0x00, 0xdd, 0xff, 0xed, \n\t0x00, 0xdf, 0xff, 0xed, 0x00, 0xe1, 0xff, 0xed, 0x00, 0xe3, 0xff, 0xed, \n\t0x00, 0xe5, 0xff, 0xed, 0x01, 0x0f, 0xff, 0xdf, 0x01, 0x11, 0xff, 0xdf, \n\t0x01, 0x13, 0xff, 0xdf, 0x01, 0x15, 0xff, 0xed, 0x01, 0x44, 0xff, 0xed, \n\t0x01, 0x86, 0xff, 0xed, 0x01, 0x8b, 0xff, 0xed, 0x01, 0x99, 0xff, 0xdf, \n\t0x01, 0x9c, 0xff, 0xed, 0x01, 0x9d, 0xff, 0xed, 0x01, 0xa6, 0xff, 0xdf, \n\t0x01, 0xd4, 0xff, 0xed, 0x01, 0xdb, 0xff, 0xdf, 0x01, 0xde, 0xff, 0xed, \n\t0x01, 0xeb, 0xff, 0xed, 0x01, 0xec, 0xff, 0xed, 0x01, 0xef, 0xff, 0xed, \n\t0x02, 0x0b, 0xff, 0xed, 0x02, 0x0d, 0xff, 0xe8, 0x02, 0x0f, 0xff, 0xed, \n\t0x02, 0x4d, 0xff, 0xed, 0x02, 0x4f, 0xff, 0xed, 0x02, 0x51, 0xff, 0xed, \n\t0x02, 0x5d, 0xff, 0xdf, 0x02, 0x70, 0xff, 0xed, 0x02, 0x71, 0xff, 0xed, \n\t0x02, 0x72, 0xff, 0xed, 0x02, 0x7c, 0xff, 0xed, 0x02, 0xa6, 0xff, 0xed, \n\t0x02, 0xa8, 0xff, 0xed, 0x02, 0xaa, 0xff, 0xed, 0x02, 0xac, 0xff, 0xed, \n\t0x02, 0xae, 0xff, 0xed, 0x02, 0xb0, 0xff, 0xed, 0x02, 0xb2, 0xff, 0xed, \n\t0x02, 0xb4, 0xff, 0xed, 0x02, 0xba, 0xff, 0xdf, 0x02, 0xbc, 0xff, 0xdf, \n\t0x02, 0xbe, 0xff, 0xdf, 0x02, 0xc0, 0xff, 0xdf, 0x02, 0xc2, 0xff, 0xdf, \n\t0x02, 0xc4, 0xff, 0xdf, 0x02, 0xc6, 0xff, 0xdf, 0x02, 0xc8, 0xff, 0xed, \n\t0x02, 0xca, 0xff, 0xed, 0x02, 0xcc, 0xff, 0xed, 0x02, 0xce, 0xff, 0xdf, \n\t0x02, 0xd0, 0xff, 0xed, 0x03, 0x42, 0xff, 0xe8, 0x03, 0x44, 0xff, 0xe8, \n\t0x03, 0x4d, 0xff, 0xe6, 0x03, 0x51, 0xff, 0xe8, 0x03, 0xde, 0xff, 0xed, \n\t0x03, 0xe6, 0xff, 0xdf, 0x03, 0xea, 0xff, 0xed, 0x03, 0xfb, 0xff, 0xed, \n\t0x03, 0xfd, 0xff, 0xed, 0x04, 0x05, 0xff, 0xed, 0x04, 0x07, 0xff, 0xdf, \n\t0x00, 0x96, 0x00, 0x05, 0x00, 0x0f, 0x00, 0x0a, 0x00, 0x0f, 0x00, 0x44, \n\t0xff, 0xed, 0x00, 0x46, 0xff, 0xeb, 0x00, 0x47, 0xff, 0xeb, 0x00, 0x48, \n\t0xff, 0xeb, 0x00, 0x49, 0x00, 0x0f, 0x00, 0x4a, 0xff, 0xeb, 0x00, 0x52, \n\t0xff, 0xe7, 0x00, 0x54, 0xff, 0xeb, 0x00, 0x59, 0x00, 0x0c, 0x00, 0x5c, \n\t0x00, 0x0c, 0x00, 0xa2, 0xff, 0xed, 0x00, 0xa3, 0xff, 0xed, 0x00, 0xa4, \n\t0xff, 0xed, 0x00, 0xa5, 0xff, 0xed, 0x00, 0xa6, 0xff, 0xed, 0x00, 0xa7, \n\t0xff, 0xed, 0x00, 0xa9, 0xff, 0xeb, 0x00, 0xaa, 0xff, 0xeb, 0x00, 0xab, \n\t0xff, 0xeb, 0x00, 0xac, 0xff, 0xeb, 0x00, 0xad, 0xff, 0xeb, 0x00, 0xb4, \n\t0xff, 0xe7, 0x00, 0xb5, 0xff, 0xe7, 0x00, 0xb6, 0xff, 0xe7, 0x00, 0xb7, \n\t0xff, 0xe7, 0x00, 0xb8, 0xff, 0xe7, 0x00, 0xbf, 0x00, 0x0c, 0x00, 0xc1, \n\t0x00, 0x0c, 0x00, 0xc3, 0xff, 0xed, 0x00, 0xc5, 0xff, 0xed, 0x00, 0xc7, \n\t0xff, 0xed, 0x00, 0xc9, 0xff, 0xeb, 0x00, 0xcb, 0xff, 0xeb, 0x00, 0xcd, \n\t0xff, 0xeb, 0x00, 0xcf, 0xff, 0xeb, 0x00, 0xd1, 0xff, 0xeb, 0x00, 0xd5, \n\t0xff, 0xeb, 0x00, 0xd7, 0xff, 0xeb, 0x00, 0xd9, 0xff, 0xeb, 0x00, 0xdb, \n\t0xff, 0xeb, 0x00, 0xdd, 0xff, 0xeb, 0x00, 0xdf, 0xff, 0xeb, 0x00, 0xe1, \n\t0xff, 0xeb, 0x00, 0xe3, 0xff, 0xeb, 0x00, 0xe5, 0xff, 0xeb, 0x01, 0x0f, \n\t0xff, 0xe7, 0x01, 0x11, 0xff, 0xe7, 0x01, 0x13, 0xff, 0xe7, 0x01, 0x15, \n\t0xff, 0xeb, 0x01, 0x39, 0x00, 0x0c, 0x01, 0x44, 0xff, 0xeb, 0x01, 0x49, \n\t0xff, 0xed, 0x01, 0x51, 0x00, 0x0f, 0x01, 0x86, 0xff, 0xeb, 0x01, 0x8b, \n\t0xff, 0xeb, 0x01, 0x8d, 0x00, 0x0c, 0x01, 0x97, 0x00, 0x0c, 0x01, 0x99, \n\t0xff, 0xe7, 0x01, 0x9c, 0xff, 0xeb, 0x01, 0x9d, 0xff, 0xeb, 0x01, 0xa6, \n\t0xff, 0xe7, 0x01, 0xd1, 0xff, 0xed, 0x01, 0xd4, 0xff, 0xeb, 0x01, 0xd8, \n\t0xff, 0xd0, 0x01, 0xdb, 0xff, 0xe7, 0x01, 0xde, 0xff, 0xeb, 0x01, 0xe0, \n\t0x00, 0x0c, 0x01, 0xeb, 0xff, 0xeb, 0x01, 0xec, 0xff, 0xeb, 0x01, 0xef, \n\t0xff, 0xeb, 0x01, 0xf4, 0xff, 0xd0, 0x01, 0xf9, 0x00, 0x0c, 0x02, 0x08, \n\t0x00, 0x0c, 0x02, 0x09, 0x00, 0x0c, 0x02, 0x0b, 0xff, 0xeb, 0x02, 0x0d, \n\t0xff, 0xe9, 0x02, 0x0f, 0xff, 0xeb, 0x02, 0x2b, 0x00, 0x0c, 0x02, 0x3c, \n\t0xff, 0xd0, 0x02, 0x47, 0xff, 0xed, 0x02, 0x49, 0xff, 0xed, 0x02, 0x4d, \n\t0xff, 0xeb, 0x02, 0x4f, 0xff, 0xeb, 0x02, 0x51, 0xff, 0xeb, 0x02, 0x5d, \n\t0xff, 0xe7, 0x02, 0x60, 0x00, 0x0c, 0x02, 0x61, 0x00, 0x0c, 0x02, 0x62, \n\t0x00, 0x0c, 0x02, 0x70, 0xff, 0xeb, 0x02, 0x71, 0xff, 0xeb, 0x02, 0x72, \n\t0xff, 0xeb, 0x02, 0x74, 0x00, 0x0c, 0x02, 0x76, 0x00, 0x0c, 0x02, 0x7c, \n\t0xff, 0xeb, 0x02, 0x82, 0xff, 0xd0, 0x02, 0x84, 0xff, 0xed, 0x02, 0x8e, \n\t0xff, 0xed, 0x02, 0x90, 0xff, 0xed, 0x02, 0x92, 0xff, 0xed, 0x02, 0x94, \n\t0xff, 0xed, 0x02, 0x96, 0xff, 0xed, 0x02, 0x98, 0xff, 0xed, 0x02, 0x9a, \n\t0xff, 0xed, 0x02, 0x9c, 0xff, 0xed, 0x02, 0x9e, 0xff, 0xed, 0x02, 0xa0, \n\t0xff, 0xed, 0x02, 0xa2, 0xff, 0xed, 0x02, 0xa4, 0xff, 0xed, 0x02, 0xa6, \n\t0xff, 0xeb, 0x02, 0xa8, 0xff, 0xeb, 0x02, 0xaa, 0xff, 0xeb, 0x02, 0xac, \n\t0xff, 0xeb, 0x02, 0xae, 0xff, 0xeb, 0x02, 0xb0, 0xff, 0xeb, 0x02, 0xb2, \n\t0xff, 0xeb, 0x02, 0xb4, 0xff, 0xeb, 0x02, 0xba, 0xff, 0xe7, 0x02, 0xbc, \n\t0xff, 0xe7, 0x02, 0xbe, 0xff, 0xe7, 0x02, 0xc0, 0xff, 0xe7, 0x02, 0xc2, \n\t0xff, 0xe7, 0x02, 0xc4, 0xff, 0xe7, 0x02, 0xc6, 0xff, 0xe7, 0x02, 0xc8, \n\t0xff, 0xeb, 0x02, 0xca, 0xff, 0xeb, 0x02, 0xcc, 0xff, 0xeb, 0x02, 0xce, \n\t0xff, 0xe7, 0x02, 0xd0, 0xff, 0xeb, 0x02, 0xe0, 0x00, 0x0c, 0x02, 0xe2, \n\t0x00, 0x0c, 0x02, 0xe4, 0x00, 0x0c, 0x02, 0xe6, 0x00, 0x0c, 0x02, 0xf8, \n\t0x00, 0x0f, 0x02, 0xf9, 0x00, 0x0f, 0x02, 0xfb, 0x00, 0x0f, 0x02, 0xfc, \n\t0x00, 0x0f, 0x02, 0xfd, 0x00, 0x0f, 0x03, 0x05, 0x00, 0x0f, 0x03, 0x06, \n\t0x00, 0x0f, 0x03, 0xdb, 0xff, 0xbe, 0x03, 0xde, 0xff, 0xeb, 0x03, 0xe6, \n\t0xff, 0xe7, 0x03, 0xea, 0xff, 0xeb, 0x03, 0xec, 0x00, 0x0e, 0x03, 0xfb, \n\t0xff, 0xeb, 0x03, 0xfd, 0xff, 0xeb, 0x04, 0x05, 0xff, 0xeb, 0x04, 0x07, \n\t0xff, 0xe7, 0x00, 0x0e, 0x01, 0xd8, 0x00, 0x13, 0x01, 0xdf, 0xff, 0xed, \n\t0x01, 0xe3, 0xff, 0xed, 0x01, 0xea, 0x00, 0x0e, 0x01, 0xf4, 0x00, 0x13, \n\t0x02, 0x33, 0xff, 0xed, 0x02, 0x35, 0xff, 0xed, 0x02, 0x3c, 0x00, 0x13, \n\t0x02, 0x42, 0xff, 0xed, 0x02, 0x64, 0xff, 0xed, 0x02, 0x7e, 0xff, 0xed, \n\t0x02, 0x82, 0x00, 0x13, 0x03, 0xdb, 0x00, 0x17, 0x03, 0xf7, 0xff, 0xed, \n\t0x00, 0x4a, 0x00, 0x46, 0xff, 0xeb, 0x00, 0x47, 0xff, 0xeb, 0x00, 0x48, \n\t0xff, 0xeb, 0x00, 0x4a, 0xff, 0xeb, 0x00, 0x54, 0xff, 0xeb, 0x00, 0xa9, \n\t0xff, 0xeb, 0x00, 0xaa, 0xff, 0xeb, 0x00, 0xab, 0xff, 0xeb, 0x00, 0xac, \n\t0xff, 0xeb, 0x00, 0xad, 0xff, 0xeb, 0x00, 0xc9, 0xff, 0xeb, 0x00, 0xcb, \n\t0xff, 0xeb, 0x00, 0xcd, 0xff, 0xeb, 0x00, 0xcf, 0xff, 0xeb, 0x00, 0xd1, \n\t0xff, 0xeb, 0x00, 0xd5, 0xff, 0xeb, 0x00, 0xd7, 0xff, 0xeb, 0x00, 0xd9, \n\t0xff, 0xeb, 0x00, 0xdb, 0xff, 0xeb, 0x00, 0xdd, 0xff, 0xeb, 0x00, 0xdf, \n\t0xff, 0xeb, 0x00, 0xe1, 0xff, 0xeb, 0x00, 0xe3, 0xff, 0xeb, 0x00, 0xe5, \n\t0xff, 0xeb, 0x01, 0x15, 0xff, 0xeb, 0x01, 0x44, 0xff, 0xeb, 0x01, 0x86, \n\t0xff, 0xeb, 0x01, 0x8b, 0xff, 0xeb, 0x01, 0x9c, 0xff, 0xeb, 0x01, 0x9d, \n\t0xff, 0xeb, 0x01, 0xd4, 0xff, 0xeb, 0x01, 0xd8, 0x00, 0x10, 0x01, 0xde, \n\t0xff, 0xeb, 0x01, 0xdf, 0xff, 0xde, 0x01, 0xe3, 0xff, 0xde, 0x01, 0xeb, \n\t0xff, 0xeb, 0x01, 0xec, 0xff, 0xeb, 0x01, 0xef, 0xff, 0xeb, 0x01, 0xf4, \n\t0x00, 0x10, 0x02, 0x0b, 0xff, 0xeb, 0x02, 0x0f, 0xff, 0xeb, 0x02, 0x33, \n\t0xff, 0xde, 0x02, 0x35, 0xff, 0xde, 0x02, 0x3c, 0x00, 0x10, 0x02, 0x42, \n\t0xff, 0xde, 0x02, 0x4d, 0xff, 0xeb, 0x02, 0x4f, 0xff, 0xeb, 0x02, 0x51, \n\t0xff, 0xeb, 0x02, 0x64, 0xff, 0xde, 0x02, 0x70, 0xff, 0xeb, 0x02, 0x71, \n\t0xff, 0xeb, 0x02, 0x72, 0xff, 0xeb, 0x02, 0x7c, 0xff, 0xeb, 0x02, 0x7e, \n\t0xff, 0xde, 0x02, 0x82, 0x00, 0x10, 0x02, 0xa6, 0xff, 0xeb, 0x02, 0xa8, \n\t0xff, 0xeb, 0x02, 0xaa, 0xff, 0xeb, 0x02, 0xac, 0xff, 0xeb, 0x02, 0xae, \n\t0xff, 0xeb, 0x02, 0xb0, 0xff, 0xeb, 0x02, 0xb2, 0xff, 0xeb, 0x02, 0xb4, \n\t0xff, 0xeb, 0x02, 0xc8, 0xff, 0xeb, 0x02, 0xca, 0xff, 0xeb, 0x02, 0xcc, \n\t0xff, 0xeb, 0x02, 0xd0, 0xff, 0xeb, 0x03, 0xdb, 0x00, 0x15, 0x03, 0xde, \n\t0xff, 0xeb, 0x03, 0xea, 0xff, 0xeb, 0x03, 0xf7, 0xff, 0x8b, 0x03, 0xfb, \n\t0xff, 0xeb, 0x03, 0xfd, 0xff, 0xeb, 0x04, 0x05, 0xff, 0xeb, 0x00, 0x20, \n\t0x00, 0x59, 0xff, 0xf2, 0x00, 0x5b, 0xff, 0xed, 0x00, 0x5c, 0xff, 0xf2, \n\t0x00, 0xbf, 0xff, 0xf2, 0x00, 0xc1, 0xff, 0xf2, 0x01, 0x39, 0xff, 0xf2, \n\t0x01, 0x8d, 0xff, 0xf2, 0x01, 0x97, 0xff, 0xf2, 0x01, 0xd8, 0xff, 0xf1, \n\t0x01, 0xe0, 0xff, 0xf2, 0x01, 0xe1, 0xff, 0xed, 0x01, 0xf4, 0xff, 0xf1, \n\t0x01, 0xf9, 0xff, 0xf2, 0x02, 0x08, 0xff, 0xf2, 0x02, 0x09, 0xff, 0xf2, \n\t0x02, 0x2b, 0xff, 0xf2, 0x02, 0x2f, 0xff, 0xed, 0x02, 0x3c, 0xff, 0xf1, \n\t0x02, 0x53, 0xff, 0xed, 0x02, 0x60, 0xff, 0xf2, 0x02, 0x61, 0xff, 0xf2, \n\t0x02, 0x62, 0xff, 0xf2, 0x02, 0x6c, 0xff, 0xed, 0x02, 0x82, 0xff, 0xf1, \n\t0x02, 0xe0, 0xff, 0xf2, 0x02, 0xe2, 0xff, 0xf2, 0x02, 0xe4, 0xff, 0xf2, \n\t0x02, 0xe6, 0xff, 0xf2, 0x03, 0xdb, 0xff, 0xec, 0x03, 0xdc, 0xff, 0xed, \n\t0x03, 0xf3, 0xff, 0xed, 0x04, 0x01, 0xff, 0xed, 0x00, 0x0a, 0x00, 0x05, \n\t0xff, 0xcf, 0x00, 0x0a, 0xff, 0xcf, 0x01, 0x51, 0xff, 0xcf, 0x02, 0xf8, \n\t0xff, 0xcf, 0x02, 0xf9, 0xff, 0xcf, 0x02, 0xfb, 0xff, 0xcf, 0x02, 0xfc, \n\t0xff, 0xcf, 0x02, 0xfd, 0xff, 0xcf, 0x03, 0x05, 0xff, 0xcf, 0x03, 0x06, \n\t0xff, 0xcf, 0x00, 0x0a, 0x00, 0x05, 0xff, 0xe5, 0x00, 0x0a, 0xff, 0xe5, \n\t0x01, 0x51, 0xff, 0xe5, 0x02, 0xf8, 0xff, 0xe5, 0x02, 0xf9, 0xff, 0xe5, \n\t0x02, 0xfb, 0xff, 0xe5, 0x02, 0xfc, 0xff, 0xe5, 0x02, 0xfd, 0xff, 0xe5, \n\t0x03, 0x05, 0xff, 0xe5, 0x03, 0x06, 0xff, 0xe5, 0x00, 0x3a, 0x00, 0x55, \n\t0xff, 0xb3, 0x00, 0x5a, 0xff, 0xc9, 0x00, 0x6d, 0xff, 0x51, 0x00, 0x7d, \n\t0xff, 0x53, 0x00, 0x88, 0xff, 0x3d, 0x00, 0xa8, 0xff, 0x9d, 0x00, 0xba, \n\t0xff, 0x90, 0x01, 0x80, 0xff, 0xab, 0x01, 0x8e, 0xff, 0xef, 0x01, 0x8f, \n\t0xff, 0x66, 0x01, 0x93, 0xff, 0x63, 0x01, 0x9a, 0xff, 0x89, 0x01, 0x9b, \n\t0xff, 0x61, 0x01, 0x9e, 0xff, 0xa4, 0x01, 0xa0, 0xff, 0x66, 0x01, 0xa1, \n\t0xff, 0xa5, 0x01, 0xa2, 0xff, 0x65, 0x01, 0xa3, 0xff, 0x64, 0x01, 0xd2, \n\t0xff, 0x8e, 0x01, 0xdf, 0xff, 0xa4, 0x01, 0xe6, 0xff, 0x65, 0x01, 0xe8, \n\t0xff, 0x68, 0x01, 0xea, 0xff, 0x61, 0x01, 0xfa, 0xff, 0x65, 0x02, 0x0d, \n\t0xff, 0x78, 0x02, 0x1b, 0xff, 0x85, 0x02, 0x21, 0xff, 0x65, 0x02, 0x35, \n\t0xff, 0x64, 0x02, 0x37, 0xff, 0x64, 0x02, 0x38, 0xff, 0x88, 0x02, 0x39, \n\t0xff, 0x51, 0x02, 0x4e, 0xff, 0xe2, 0x02, 0x6f, 0xff, 0x50, 0x02, 0x74, \n\t0xff, 0x7e, 0x02, 0x76, 0xff, 0x9e, 0x02, 0x7a, 0xff, 0x63, 0x02, 0x7d, \n\t0x00, 0x11, 0x02, 0x7e, 0xff, 0x7d, 0x02, 0x7f, 0xff, 0xf0, 0x03, 0x3b, \n\t0xff, 0xea, 0x03, 0x3c, 0xff, 0xef, 0x03, 0x3f, 0xff, 0xef, 0x03, 0x40, \n\t0xff, 0xb0, 0x03, 0x42, 0xff, 0xad, 0x03, 0x44, 0xff, 0xad, 0x03, 0x4d, \n\t0xff, 0xad, 0x03, 0x51, 0xff, 0xad, 0x03, 0x55, 0xff, 0x64, 0x03, 0xd1, \n\t0xff, 0xa0, 0x03, 0xd8, 0x00, 0x11, 0x03, 0xda, 0xff, 0xdf, 0x03, 0xdb, \n\t0xff, 0x5a, 0x03, 0xdd, 0xff, 0x68, 0x03, 0xe1, 0xff, 0x67, 0x03, 0xec, \n\t0xff, 0xd4, 0x03, 0xef, 0xff, 0x6a, 0x03, 0xf7, 0xff, 0xa5, 0x03, 0xf9, \n\t0xff, 0x8e, 0x00, 0x31, 0x00, 0x55, 0xff, 0x6a, 0x00, 0x5a, 0xff, 0x8f, \n\t0x00, 0x6d, 0xfe, 0xc2, 0x00, 0x7d, 0xfe, 0xc7, 0x00, 0x88, 0xfe, 0xa0, \n\t0x00, 0xa8, 0xff, 0x43, 0x00, 0xba, 0xff, 0x2e, 0x01, 0x80, 0xff, 0x5b, \n\t0x01, 0x8e, 0xff, 0xd0, 0x01, 0x8f, 0xfe, 0xe7, 0x01, 0x93, 0xff, 0x58, \n\t0x01, 0x9a, 0xff, 0x38, 0x01, 0x9b, 0xfe, 0xdd, 0x01, 0x9e, 0xff, 0x6e, \n\t0x01, 0xa0, 0xfe, 0xe7, 0x01, 0xa1, 0xff, 0x52, 0x01, 0xa2, 0xfe, 0xe5, \n\t0x01, 0xa3, 0xfe, 0xe2, 0x01, 0xd2, 0xff, 0x2b, 0x01, 0xdf, 0xff, 0x50, \n\t0x01, 0xe6, 0xfe, 0xe5, 0x01, 0xe8, 0xfe, 0xea, 0x01, 0xea, 0xfe, 0xdd, \n\t0x01, 0xfa, 0xfe, 0xe5, 0x02, 0x0d, 0xfe, 0xfe, 0x02, 0x1b, 0xff, 0x1b, \n\t0x02, 0x21, 0xfe, 0xe5, 0x02, 0x35, 0xfe, 0xe2, 0x02, 0x37, 0xfe, 0xe2, \n\t0x02, 0x38, 0xff, 0x20, 0x02, 0x39, 0xfe, 0xc2, 0x02, 0x4e, 0xff, 0xb9, \n\t0x02, 0x6f, 0xfe, 0xc0, 0x02, 0x74, 0xff, 0x10, 0x02, 0x76, 0xff, 0x46, \n\t0x02, 0x7a, 0xfe, 0xe0, 0x02, 0x7d, 0x00, 0x08, 0x02, 0x7e, 0xff, 0x0e, \n\t0x02, 0x7f, 0xff, 0xd2, 0x03, 0xd1, 0xff, 0x4a, 0x03, 0xd8, 0x00, 0x08, \n\t0x03, 0xda, 0xff, 0xb4, 0x03, 0xdb, 0xfe, 0xd2, 0x03, 0xdd, 0xfe, 0xea, \n\t0x03, 0xe1, 0xfe, 0xe9, 0x03, 0xec, 0xff, 0xa1, 0x03, 0xef, 0xfe, 0xee, \n\t0x03, 0xf7, 0xff, 0x52, 0x03, 0xf9, 0xff, 0x2b, 0x00, 0x02, 0x02, 0x0d, \n\t0xff, 0xeb, 0x03, 0xdb, 0xff, 0xc0, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x11, \n\t0x00, 0x40, 0x00, 0x0e, 0x00, 0x55, 0xff, 0xe8, 0x00, 0x60, 0x00, 0x10, \n\t0x03, 0x42, 0xff, 0xe3, 0x03, 0x44, 0xff, 0xe3, 0x03, 0x4d, 0xff, 0xe3, \n\t0x03, 0x51, 0xff, 0xe6, 0x03, 0x55, 0xff, 0x9c, 0x00, 0x1b, 0x00, 0x22, \n\t0xff, 0xb3, 0x00, 0x57, 0xff, 0xec, 0x00, 0x5a, 0xff, 0xd9, 0x01, 0x45, \n\t0xff, 0xeb, 0x01, 0x80, 0xff, 0xe1, 0x01, 0x82, 0xff, 0xc9, 0x01, 0x95, \n\t0x00, 0x2f, 0x01, 0x9e, 0xff, 0xbe, 0x01, 0xdf, 0xff, 0xa4, 0x02, 0x34, \n\t0xff, 0x54, 0x02, 0x35, 0xff, 0x82, 0x02, 0x38, 0xff, 0xa7, 0x02, 0x39, \n\t0xff, 0xd7, 0x02, 0x4e, 0xff, 0xf0, 0x02, 0x73, 0xff, 0xa3, 0x02, 0x75, \n\t0xff, 0xc1, 0x02, 0x7d, 0xff, 0x54, 0x02, 0x7e, 0xff, 0x80, 0x03, 0x3a, \n\t0xff, 0x78, 0x03, 0x3c, 0xff, 0xd7, 0x03, 0x3d, 0xff, 0xc4, 0x03, 0x3e, \n\t0xff, 0xef, 0x03, 0x3f, 0xff, 0xbd, 0x03, 0x44, 0xff, 0xf4, 0x03, 0x4d, \n\t0xff, 0xf4, 0x03, 0xd1, 0x00, 0x16, 0x03, 0xf7, 0xff, 0x8d, 0x00, 0x07, \n\t0x01, 0xdf, 0xff, 0xed, 0x02, 0x74, 0xff, 0xf1, 0x02, 0x76, 0xff, 0xf1, \n\t0x02, 0x7e, 0xff, 0xef, 0x03, 0xe1, 0xff, 0xef, 0x03, 0xec, 0xff, 0xf1, \n\t0x03, 0xf7, 0xff, 0xd1, 0x00, 0x04, 0x00, 0x5a, 0xff, 0xe7, 0x03, 0x3a, \n\t0xff, 0xed, 0x03, 0x3c, 0xff, 0xea, 0x03, 0x3d, 0xff, 0xed, 0x00, 0x01, \n\t0x01, 0xdf, 0xff, 0xf4, 0x00, 0x01, 0x03, 0x55, 0xff, 0xe8, 0x00, 0x24, \n\t0x00, 0x09, 0xff, 0xc7, 0x00, 0x0c, 0x00, 0x17, 0x00, 0x0d, 0xff, 0xa8, \n\t0x00, 0x40, 0x00, 0x15, 0x00, 0x49, 0xff, 0xd8, 0x00, 0x55, 0xff, 0xc2, \n\t0x00, 0x57, 0xff, 0xdf, 0x00, 0x60, 0x00, 0x16, 0x00, 0x6d, 0xff, 0x89, \n\t0x00, 0x7d, 0xff, 0xc4, 0x00, 0x88, 0xff, 0x78, 0x00, 0xa8, 0xff, 0xa7, \n\t0x00, 0xba, 0xff, 0xa5, 0x01, 0x80, 0xff, 0xc0, 0x01, 0x8c, 0xff, 0xdf, \n\t0x01, 0x8e, 0xff, 0xeb, 0x01, 0x8f, 0xff, 0x96, 0x01, 0x90, 0x00, 0x0f, \n\t0x01, 0x92, 0xff, 0xe6, 0x01, 0x93, 0xff, 0xb8, 0x01, 0x9a, 0xff, 0xbe, \n\t0x01, 0x9b, 0xff, 0x81, 0x01, 0x9e, 0xff, 0xd7, 0x01, 0xa0, 0xff, 0xba, \n\t0x01, 0xa1, 0xff, 0xd2, 0x01, 0xa2, 0xff, 0xcc, 0x01, 0xa3, 0xff, 0xa6, \n\t0x03, 0x01, 0xff, 0x97, 0x03, 0x3b, 0xff, 0xec, 0x03, 0x3c, 0xff, 0xf1, \n\t0x03, 0x3f, 0xff, 0xf1, 0x03, 0x42, 0xff, 0xab, 0x03, 0x44, 0xff, 0xab, \n\t0x03, 0x4d, 0xff, 0xab, 0x03, 0x51, 0xff, 0xae, 0x03, 0x55, 0xff, 0x6f, \n\t0x00, 0x07, 0x00, 0x49, 0x00, 0x0f, 0x01, 0x8e, 0xff, 0xec, 0x01, 0x9a, \n\t0x00, 0x0c, 0x01, 0x9b, 0xff, 0xe7, 0x01, 0x9e, 0x00, 0x0e, 0x02, 0x0d, \n\t0xff, 0xef, 0x03, 0xdb, 0xff, 0xaf, 0x00, 0x08, 0x00, 0x88, 0xff, 0xc3, \n\t0x01, 0x79, 0xff, 0xf1, 0x01, 0x7d, 0xff, 0xed, 0x01, 0x95, 0xff, 0xe7, \n\t0x02, 0x7d, 0xff, 0xda, 0x03, 0x3b, 0xff, 0xf4, 0x03, 0x55, 0xff, 0xea, \n\t0x03, 0xd1, 0xff, 0xc3, 0x00, 0x01, 0x00, 0x5a, 0x00, 0x0c, 0x00, 0x05, \n\t0x03, 0x42, 0xff, 0xed, 0x03, 0x44, 0xff, 0xed, 0x03, 0x4d, 0xff, 0xed, \n\t0x03, 0x51, 0xff, 0xed, 0x03, 0x55, 0x00, 0x0e, 0x00, 0x09, 0x03, 0x3a, \n\t0x00, 0x13, 0x03, 0x3c, 0x00, 0x0f, 0x03, 0x3d, 0x00, 0x13, 0x03, 0x3f, \n\t0x00, 0x11, 0x03, 0x42, 0xff, 0xe8, 0x03, 0x44, 0xff, 0xe8, 0x03, 0x4d, \n\t0xff, 0xe8, 0x03, 0x51, 0xff, 0xea, 0x03, 0x55, 0xff, 0xb4, 0x00, 0x04, \n\t0x03, 0x42, 0xff, 0xe8, 0x03, 0x44, 0xff, 0xe8, 0x03, 0x4d, 0xff, 0xe8, \n\t0x03, 0x51, 0xff, 0xea, 0x00, 0x02, 0x03, 0x3f, 0x00, 0x10, 0x03, 0x55, \n\t0xff, 0xd6, 0x00, 0x05, 0x03, 0x42, 0xff, 0xed, 0x03, 0x44, 0xff, 0xed, \n\t0x03, 0x4d, 0xff, 0xed, 0x03, 0x51, 0xff, 0xf0, 0x03, 0x55, 0xff, 0xbd, \n\t0x00, 0x01, 0x03, 0x55, 0xff, 0xec, 0x00, 0x09, 0x03, 0x3a, 0x00, 0x0f, \n\t0x03, 0x3d, 0x00, 0x0f, 0x03, 0x3f, 0x00, 0x10, 0x03, 0x40, 0xff, 0xf4, \n\t0x03, 0x42, 0xff, 0xe9, 0x03, 0x44, 0xff, 0xea, 0x03, 0x4d, 0xff, 0xe9, \n\t0x03, 0x51, 0xff, 0xeb, 0x03, 0x55, 0xff, 0xb3, 0x00, 0x04, 0x03, 0x3a, \n\t0xff, 0xeb, 0x03, 0x3c, 0xff, 0xf4, 0x03, 0x3d, 0xff, 0xef, 0x03, 0x3f, \n\t0xff, 0xf0, 0x00, 0x04, 0x03, 0x3a, 0xff, 0xe1, 0x03, 0x3c, 0xff, 0xef, \n\t0x03, 0x3d, 0xff, 0xe8, 0x03, 0x3f, 0xff, 0xe6, 0x00, 0x05, 0x03, 0x3a, \n\t0xff, 0xe7, 0x03, 0x3b, 0xff, 0xe9, 0x03, 0x3d, 0xff, 0xef, 0x03, 0x3f, \n\t0xff, 0xeb, 0x03, 0x55, 0xff, 0xf1, 0x00, 0x0a, 0x03, 0x3a, 0xff, 0xa6, \n\t0x03, 0x3c, 0xff, 0xce, 0x03, 0x3d, 0xff, 0xaa, 0x03, 0x3e, 0xff, 0xe9, \n\t0x03, 0x3f, 0xff, 0xaf, 0x03, 0x42, 0xff, 0xed, 0x03, 0x44, 0xff, 0xec, \n\t0x03, 0x4d, 0xff, 0xeb, 0x03, 0x51, 0xff, 0xed, 0x03, 0x55, 0x00, 0x14, \n\t0x00, 0x04, 0x03, 0x42, 0xff, 0xe8, 0x03, 0x44, 0xff, 0xe8, 0x03, 0x4d, \n\t0xff, 0xe6, 0x03, 0x51, 0xff, 0xe8, 0x00, 0x01, 0x03, 0x55, 0xff, 0xca, \n\t0x00, 0x02, 0x03, 0x3c, 0xff, 0xf4, 0x03, 0x3d, 0xff, 0xeb, 0x00, 0x09, \n\t0x03, 0x3a, 0xff, 0xa4, 0x03, 0x3c, 0xff, 0xd1, 0x03, 0x3d, 0xff, 0xae, \n\t0x03, 0x3e, 0xff, 0xe9, 0x03, 0x3f, 0xff, 0xa5, 0x03, 0x42, 0xff, 0xf0, \n\t0x03, 0x44, 0xff, 0xf0, 0x03, 0x4d, 0xff, 0xf0, 0x03, 0x51, 0xff, 0xf0, \n\t0x00, 0x01, 0x03, 0x55, 0xff, 0xce, 0x00, 0x5b, 0x00, 0x05, 0xff, 0xc1, \n\t0x00, 0x0a, 0xff, 0xc1, 0x00, 0x37, 0xff, 0xca, 0x00, 0x39, 0xff, 0xcc, \n\t0x00, 0x3b, 0xff, 0xf2, 0x00, 0x3c, 0xff, 0xcb, 0x00, 0x59, 0xff, 0xe2, \n\t0x00, 0x5b, 0xff, 0xec, 0x00, 0x5c, 0xff, 0xe2, 0x00, 0x9f, 0xff, 0xcb, \n\t0x00, 0xbf, 0xff, 0xe2, 0x00, 0xc1, 0xff, 0xe2, 0x01, 0x24, 0xff, 0xca, \n\t0x01, 0x26, 0xff, 0xca, 0x01, 0x38, 0xff, 0xcb, 0x01, 0x39, 0xff, 0xe2, \n\t0x01, 0x3a, 0xff, 0xcb, 0x01, 0x51, 0xff, 0xc1, 0x01, 0x69, 0xff, 0xcb, \n\t0x01, 0x7f, 0xff, 0xcb, 0x01, 0x81, 0xff, 0xf2, 0x01, 0x85, 0xff, 0xcb, \n\t0x01, 0x8d, 0xff, 0xe2, 0x01, 0x97, 0xff, 0xe2, 0x01, 0xb8, 0xff, 0xea, \n\t0x01, 0xca, 0xff, 0xca, 0x01, 0xcb, 0xff, 0xf2, 0x01, 0xcd, 0xff, 0xdc, \n\t0x01, 0xdf, 0xff, 0xc0, 0x01, 0xe0, 0xff, 0xe2, 0x01, 0xe1, 0xff, 0xec, \n\t0x01, 0xf9, 0xff, 0xe2, 0x02, 0x08, 0xff, 0xe2, 0x02, 0x09, 0xff, 0xe2, \n\t0x02, 0x28, 0xff, 0xca, 0x02, 0x2a, 0xff, 0xcb, 0x02, 0x2b, 0xff, 0xe2, \n\t0x02, 0x2c, 0xff, 0xcb, 0x02, 0x2e, 0xff, 0xf2, 0x02, 0x2f, 0xff, 0xec, \n\t0x02, 0x30, 0xff, 0xca, 0x02, 0x32, 0xff, 0xdc, 0x02, 0x34, 0xff, 0xdc, \n\t0x02, 0x41, 0xff, 0xdc, 0x02, 0x52, 0xff, 0xf2, 0x02, 0x53, 0xff, 0xec, \n\t0x02, 0x60, 0xff, 0xe2, 0x02, 0x61, 0xff, 0xe2, 0x02, 0x62, 0xff, 0xe2, \n\t0x02, 0x63, 0xff, 0xdc, 0x02, 0x6b, 0xff, 0xf2, 0x02, 0x6c, 0xff, 0xec, \n\t0x02, 0x73, 0xff, 0xcc, 0x02, 0x74, 0xff, 0xf4, 0x02, 0x75, 0xff, 0xe3, \n\t0x02, 0x7d, 0xff, 0xaf, 0x02, 0x7e, 0xff, 0xc0, 0x02, 0xdf, 0xff, 0xcb, \n\t0x02, 0xe0, 0xff, 0xe2, 0x02, 0xe1, 0xff, 0xcb, 0x02, 0xe2, 0xff, 0xe2, \n\t0x02, 0xe3, 0xff, 0xcb, 0x02, 0xe4, 0xff, 0xe2, 0x02, 0xe5, 0xff, 0xcb, \n\t0x02, 0xe6, 0xff, 0xe2, 0x02, 0xf8, 0xff, 0xc1, 0x02, 0xf9, 0xff, 0xc1, \n\t0x02, 0xfb, 0xff, 0xc1, 0x02, 0xfc, 0xff, 0xc1, 0x02, 0xfd, 0xff, 0xc1, \n\t0x03, 0x05, 0xff, 0xc1, 0x03, 0x06, 0xff, 0xc1, 0x03, 0xcf, 0xff, 0xca, \n\t0x03, 0xd0, 0xff, 0xca, 0x03, 0xd2, 0xff, 0xf2, 0x03, 0xd3, 0xff, 0xea, \n\t0x03, 0xd8, 0xff, 0xcc, 0x03, 0xdc, 0xff, 0xec, 0x03, 0xe1, 0xff, 0xe1, \n\t0x03, 0xe7, 0xff, 0xcc, 0x03, 0xe8, 0xff, 0xcc, 0x03, 0xec, 0xff, 0xde, \n\t0x03, 0xf2, 0xff, 0xf2, 0x03, 0xf3, 0xff, 0xec, 0x03, 0xf6, 0xff, 0xca, \n\t0x03, 0xf7, 0xff, 0xb9, 0x04, 0x00, 0xff, 0xf2, 0x04, 0x01, 0xff, 0xec, \n\t0x04, 0x08, 0xff, 0xea, 0x04, 0x09, 0xff, 0xea, 0x04, 0x0a, 0xff, 0xea, \n\t0x00, 0x4c, 0x00, 0x37, 0xff, 0xb2, 0x00, 0x50, 0xff, 0xdc, 0x00, 0x51, \n\t0xff, 0xdc, 0x00, 0x53, 0xff, 0xdc, 0x00, 0x59, 0xff, 0xec, 0x00, 0x5c, \n\t0xff, 0xec, 0x00, 0xb3, 0xff, 0xdc, 0x00, 0xbf, 0xff, 0xec, 0x00, 0xc1, \n\t0xff, 0xec, 0x01, 0x06, 0xff, 0xdc, 0x01, 0x08, 0xff, 0xdc, 0x01, 0x0a, \n\t0xff, 0xdc, 0x01, 0x0b, 0xff, 0xdc, 0x01, 0x24, 0xff, 0xb2, 0x01, 0x26, \n\t0xff, 0xb2, 0x01, 0x39, 0xff, 0xec, 0x01, 0x88, 0xff, 0xdc, 0x01, 0x8d, \n\t0xff, 0xec, 0x01, 0x91, 0xff, 0xdc, 0x01, 0x97, 0xff, 0xec, 0x01, 0xca, \n\t0xff, 0xb2, 0x01, 0xd3, 0xff, 0xdc, 0x01, 0xd5, 0xff, 0xdc, 0x01, 0xd6, \n\t0xff, 0xdc, 0x01, 0xd7, 0xff, 0xdc, 0x01, 0xd9, 0xff, 0xdc, 0x01, 0xda, \n\t0xff, 0xdc, 0x01, 0xdc, 0xff, 0xdc, 0x01, 0xdd, 0xff, 0xdc, 0x01, 0xdf, \n\t0xff, 0xd9, 0x01, 0xe0, 0xff, 0xec, 0x01, 0xe2, 0xff, 0xdc, 0x01, 0xe4, \n\t0xff, 0xdc, 0x01, 0xe5, 0xff, 0xdc, 0x01, 0xe7, 0xff, 0xdc, 0x01, 0xe9, \n\t0xff, 0xdc, 0x01, 0xee, 0xff, 0xdc, 0x01, 0xf5, 0xff, 0xdc, 0x01, 0xf7, \n\t0xff, 0xdc, 0x01, 0xf8, 0xff, 0xdc, 0x01, 0xf9, 0xff, 0xec, 0x02, 0x08, \n\t0xff, 0xec, 0x02, 0x09, 0xff, 0xec, 0x02, 0x18, 0xff, 0xdc, 0x02, 0x1f, \n\t0xff, 0xdc, 0x02, 0x25, 0xff, 0xdc, 0x02, 0x27, 0xff, 0xdc, 0x02, 0x28, \n\t0xff, 0xb2, 0x02, 0x2b, 0xff, 0xec, 0x02, 0x30, 0xff, 0xb2, 0x02, 0x38, \n\t0xff, 0xe6, 0x02, 0x3e, 0xff, 0xdc, 0x02, 0x40, 0xff, 0xdc, 0x02, 0x44, \n\t0xff, 0xdc, 0x02, 0x59, 0xff, 0xdc, 0x02, 0x5b, 0xff, 0xdc, 0x02, 0x60, \n\t0xff, 0xec, 0x02, 0x61, 0xff, 0xec, 0x02, 0x62, 0xff, 0xec, 0x02, 0x66, \n\t0xff, 0xdc, 0x02, 0x68, 0xff, 0xdc, 0x02, 0x6a, 0xff, 0xdc, 0x02, 0x74, \n\t0xff, 0xf4, 0x02, 0x7e, 0xff, 0xda, 0x02, 0x86, 0xff, 0xdc, 0x02, 0xe0, \n\t0xff, 0xec, 0x02, 0xe2, 0xff, 0xec, 0x02, 0xe4, 0xff, 0xec, 0x02, 0xe6, \n\t0xff, 0xec, 0x03, 0xcf, 0xff, 0xb2, 0x03, 0xd0, 0xff, 0xb2, 0x03, 0xd8, \n\t0xff, 0xc0, 0x03, 0xe1, 0xff, 0xea, 0x03, 0xec, 0xff, 0xe8, 0x03, 0xf6, \n\t0xff, 0xb2, 0x03, 0xf7, 0xff, 0xd9, 0x00, 0x8e, 0x00, 0x24, 0x00, 0x13, \n\t0x00, 0x26, 0xff, 0xe4, 0x00, 0x2a, 0xff, 0xe4, 0x00, 0x32, 0xff, 0xe4, \n\t0x00, 0x34, 0xff, 0xe4, 0x00, 0x37, 0xff, 0xda, 0x00, 0x39, 0xff, 0xda, \n\t0x00, 0x3c, 0xff, 0xd9, 0x00, 0x82, 0x00, 0x13, 0x00, 0x83, 0x00, 0x13, \n\t0x00, 0x84, 0x00, 0x13, 0x00, 0x85, 0x00, 0x13, 0x00, 0x86, 0x00, 0x13, \n\t0x00, 0x87, 0x00, 0x13, 0x00, 0x89, 0xff, 0xe4, 0x00, 0x94, 0xff, 0xe4, \n\t0x00, 0x95, 0xff, 0xe4, 0x00, 0x96, 0xff, 0xe4, 0x00, 0x97, 0xff, 0xe4, \n\t0x00, 0x98, 0xff, 0xe4, 0x00, 0x9a, 0xff, 0xe4, 0x00, 0x9f, 0xff, 0xd9, \n\t0x00, 0xc2, 0x00, 0x13, 0x00, 0xc4, 0x00, 0x13, 0x00, 0xc6, 0x00, 0x13, \n\t0x00, 0xc8, 0xff, 0xe4, 0x00, 0xca, 0xff, 0xe4, 0x00, 0xcc, 0xff, 0xe4, \n\t0x00, 0xce, 0xff, 0xe4, 0x00, 0xde, 0xff, 0xe4, 0x00, 0xe0, 0xff, 0xe4, \n\t0x00, 0xe2, 0xff, 0xe4, 0x00, 0xe4, 0xff, 0xe4, 0x01, 0x0e, 0xff, 0xe4, \n\t0x01, 0x10, 0xff, 0xe4, 0x01, 0x12, 0xff, 0xe4, 0x01, 0x14, 0xff, 0xe4, \n\t0x01, 0x24, 0xff, 0xda, 0x01, 0x26, 0xff, 0xda, 0x01, 0x38, 0xff, 0xd9, \n\t0x01, 0x3a, 0xff, 0xd9, 0x01, 0x43, 0xff, 0xe4, 0x01, 0x48, 0x00, 0x13, \n\t0x01, 0x4c, 0xff, 0xe4, 0x01, 0x63, 0x00, 0x13, 0x01, 0x68, 0xff, 0xe4, \n\t0x01, 0x69, 0xff, 0xd9, 0x01, 0x6c, 0x00, 0x13, 0x01, 0x6f, 0x00, 0x13, \n\t0x01, 0x73, 0xff, 0xe4, 0x01, 0x76, 0x00, 0x13, 0x01, 0x7a, 0xff, 0xe4, \n\t0x01, 0x7f, 0xff, 0xd9, 0x01, 0x85, 0xff, 0xd9, 0x01, 0xaf, 0xff, 0xe4, \n\t0x01, 0xb4, 0x00, 0x13, 0x01, 0xba, 0x00, 0x13, 0x01, 0xc3, 0x00, 0x13, \n\t0x01, 0xc6, 0xff, 0xe4, 0x01, 0xc9, 0xff, 0xe4, 0x01, 0xca, 0xff, 0xda, \n\t0x01, 0xcd, 0xff, 0xdc, 0x01, 0xd8, 0x00, 0x13, 0x01, 0xe3, 0xff, 0xda, \n\t0x01, 0xf4, 0x00, 0x13, 0x01, 0xfc, 0x00, 0x13, 0x02, 0x0a, 0xff, 0xe4, \n\t0x02, 0x0c, 0xff, 0xe4, 0x02, 0x0e, 0xff, 0xe4, 0x02, 0x28, 0xff, 0xda, \n\t0x02, 0x2a, 0xff, 0xd9, 0x02, 0x2c, 0xff, 0xd9, 0x02, 0x30, 0xff, 0xda, \n\t0x02, 0x32, 0xff, 0xdc, 0x02, 0x33, 0xff, 0xda, 0x02, 0x34, 0xff, 0xdc, \n\t0x02, 0x35, 0xff, 0xda, 0x02, 0x39, 0xff, 0xdc, 0x02, 0x3b, 0x00, 0x13, \n\t0x02, 0x3c, 0x00, 0x13, 0x02, 0x41, 0xff, 0xdc, 0x02, 0x42, 0xff, 0xda, \n\t0x02, 0x46, 0x00, 0x13, 0x02, 0x48, 0x00, 0x13, 0x02, 0x4e, 0xff, 0xe6, \n\t0x02, 0x5c, 0xff, 0xe4, 0x02, 0x63, 0xff, 0xdc, 0x02, 0x64, 0xff, 0xda, \n\t0x02, 0x73, 0xff, 0xd9, 0x02, 0x75, 0xff, 0xd8, 0x02, 0x77, 0x00, 0x13, \n\t0x02, 0x7b, 0xff, 0xe4, 0x02, 0x7d, 0xff, 0xd9, 0x02, 0x7f, 0xff, 0xf0, \n\t0x02, 0x81, 0x00, 0x13, 0x02, 0x82, 0x00, 0x13, 0x02, 0x83, 0x00, 0x13, \n\t0x02, 0x8d, 0x00, 0x13, 0x02, 0x8f, 0x00, 0x13, 0x02, 0x91, 0x00, 0x13, \n\t0x02, 0x93, 0x00, 0x13, 0x02, 0x95, 0x00, 0x13, 0x02, 0x97, 0x00, 0x13, \n\t0x02, 0x99, 0x00, 0x13, 0x02, 0x9b, 0x00, 0x13, 0x02, 0x9d, 0x00, 0x13, \n\t0x02, 0x9f, 0x00, 0x13, 0x02, 0xa1, 0x00, 0x13, 0x02, 0xa3, 0x00, 0x13, \n\t0x02, 0xb9, 0xff, 0xe4, 0x02, 0xbb, 0xff, 0xe4, 0x02, 0xbd, 0xff, 0xe4, \n\t0x02, 0xbf, 0xff, 0xe4, 0x02, 0xc1, 0xff, 0xe4, 0x02, 0xc3, 0xff, 0xe4, \n\t0x02, 0xc5, 0xff, 0xe4, 0x02, 0xc7, 0xff, 0xe4, 0x02, 0xc9, 0xff, 0xe4, \n\t0x02, 0xcb, 0xff, 0xe4, 0x02, 0xcd, 0xff, 0xe4, 0x02, 0xcf, 0xff, 0xe4, \n\t0x02, 0xdf, 0xff, 0xd9, 0x02, 0xe1, 0xff, 0xd9, 0x02, 0xe3, 0xff, 0xd9, \n\t0x02, 0xe5, 0xff, 0xd9, 0x02, 0xe7, 0xff, 0xe4, 0x03, 0xcf, 0xff, 0xda, \n\t0x03, 0xd0, 0xff, 0xda, 0x03, 0xd1, 0x00, 0x17, 0x03, 0xd8, 0xff, 0xda, \n\t0x03, 0xdb, 0x00, 0x16, 0x03, 0xe0, 0xff, 0xe4, 0x03, 0xe5, 0xff, 0xe4, \n\t0x03, 0xe7, 0xff, 0xda, 0x03, 0xe8, 0xff, 0xda, 0x03, 0xe9, 0xff, 0xe4, \n\t0x03, 0xeb, 0xff, 0xe4, 0x03, 0xf6, 0xff, 0xda, 0x03, 0xfa, 0xff, 0xe4, \n\t0x03, 0xfc, 0xff, 0xe4, 0x04, 0x04, 0xff, 0xe4, 0x04, 0x06, 0xff, 0xe4, \n\t0x00, 0x64, 0x00, 0x24, 0x00, 0x11, 0x00, 0x37, 0xff, 0xe2, 0x00, 0x39, \n\t0xff, 0xe2, 0x00, 0x3b, 0x00, 0x10, 0x00, 0x3c, 0xff, 0xe2, 0x00, 0x82, \n\t0x00, 0x11, 0x00, 0x83, 0x00, 0x11, 0x00, 0x84, 0x00, 0x11, 0x00, 0x85, \n\t0x00, 0x11, 0x00, 0x86, 0x00, 0x11, 0x00, 0x87, 0x00, 0x11, 0x00, 0x9f, \n\t0xff, 0xe2, 0x00, 0xc2, 0x00, 0x11, 0x00, 0xc4, 0x00, 0x11, 0x00, 0xc6, \n\t0x00, 0x11, 0x01, 0x24, 0xff, 0xe2, 0x01, 0x26, 0xff, 0xe2, 0x01, 0x38, \n\t0xff, 0xe2, 0x01, 0x3a, 0xff, 0xe2, 0x01, 0x48, 0x00, 0x11, 0x01, 0x63, \n\t0x00, 0x11, 0x01, 0x69, 0xff, 0xe2, 0x01, 0x6c, 0x00, 0x11, 0x01, 0x6f, \n\t0x00, 0x11, 0x01, 0x76, 0x00, 0x11, 0x01, 0x7f, 0xff, 0xe2, 0x01, 0x81, \n\t0x00, 0x10, 0x01, 0x85, 0xff, 0xe2, 0x01, 0xb4, 0x00, 0x10, 0x01, 0xb8, \n\t0x00, 0x0c, 0x01, 0xba, 0x00, 0x11, 0x01, 0xc3, 0x00, 0x10, 0x01, 0xca, \n\t0xff, 0xe2, 0x01, 0xcb, 0x00, 0x10, 0x01, 0xcd, 0xff, 0xe1, 0x01, 0xcf, \n\t0xff, 0xf2, 0x01, 0xd8, 0x00, 0x11, 0x01, 0xdf, 0xff, 0xe3, 0x01, 0xe3, \n\t0xff, 0xe4, 0x01, 0xf4, 0x00, 0x11, 0x01, 0xfc, 0x00, 0x11, 0x02, 0x28, \n\t0xff, 0xe2, 0x02, 0x2a, 0xff, 0xe2, 0x02, 0x2c, 0xff, 0xe2, 0x02, 0x2e, \n\t0x00, 0x10, 0x02, 0x30, 0xff, 0xe2, 0x02, 0x32, 0xff, 0xe1, 0x02, 0x33, \n\t0xff, 0xe4, 0x02, 0x34, 0xff, 0xe1, 0x02, 0x35, 0xff, 0xe4, 0x02, 0x3b, \n\t0x00, 0x10, 0x02, 0x3c, 0x00, 0x11, 0x02, 0x41, 0xff, 0xe1, 0x02, 0x42, \n\t0xff, 0xe4, 0x02, 0x46, 0x00, 0x11, 0x02, 0x48, 0x00, 0x11, 0x02, 0x52, \n\t0x00, 0x10, 0x02, 0x63, 0xff, 0xe1, 0x02, 0x64, 0xff, 0xe4, 0x02, 0x6b, \n\t0x00, 0x10, 0x02, 0x73, 0xff, 0xe2, 0x02, 0x75, 0xff, 0xe2, 0x02, 0x77, \n\t0x00, 0x10, 0x02, 0x7d, 0xff, 0xe2, 0x02, 0x7e, 0xff, 0xe3, 0x02, 0x81, \n\t0x00, 0x10, 0x02, 0x82, 0x00, 0x11, 0x02, 0x83, 0x00, 0x11, 0x02, 0x8d, \n\t0x00, 0x11, 0x02, 0x8f, 0x00, 0x11, 0x02, 0x91, 0x00, 0x11, 0x02, 0x93, \n\t0x00, 0x11, 0x02, 0x95, 0x00, 0x11, 0x02, 0x97, 0x00, 0x11, 0x02, 0x99, \n\t0x00, 0x11, 0x02, 0x9b, 0x00, 0x11, 0x02, 0x9d, 0x00, 0x11, 0x02, 0x9f, \n\t0x00, 0x11, 0x02, 0xa1, 0x00, 0x11, 0x02, 0xa3, 0x00, 0x11, 0x02, 0xdf, \n\t0xff, 0xe2, 0x02, 0xe1, 0xff, 0xe2, 0x02, 0xe3, 0xff, 0xe2, 0x02, 0xe5, \n\t0xff, 0xe2, 0x03, 0xcf, 0xff, 0xe2, 0x03, 0xd0, 0xff, 0xe2, 0x03, 0xd1, \n\t0x00, 0x16, 0x03, 0xd2, 0x00, 0x10, 0x03, 0xd3, 0x00, 0x0c, 0x03, 0xd8, \n\t0xff, 0xe2, 0x03, 0xdb, 0x00, 0x15, 0x03, 0xe7, 0xff, 0xe2, 0x03, 0xe8, \n\t0xff, 0xe2, 0x03, 0xf2, 0x00, 0x10, 0x03, 0xf6, 0xff, 0xe2, 0x03, 0xf7, \n\t0xff, 0xe3, 0x04, 0x00, 0x00, 0x10, 0x04, 0x08, 0x00, 0x0c, 0x04, 0x09, \n\t0x00, 0x0c, 0x04, 0x0a, 0x00, 0x0c, 0x00, 0x09, 0x01, 0xdf, 0xff, 0xc6, \n\t0x02, 0x34, 0xff, 0xe3, 0x02, 0x38, 0xff, 0xd9, 0x02, 0x73, 0xff, 0xc9, \n\t0x02, 0x75, 0xff, 0xe9, 0x02, 0x7d, 0xff, 0x8e, 0x02, 0x7e, 0xff, 0xc9, \n\t0x03, 0xd8, 0xff, 0xb8, 0x03, 0xf7, 0xff, 0xc5, 0x00, 0x16, 0x00, 0x37, \n\t0xff, 0xe8, 0x00, 0x3c, 0xff, 0xf1, 0x00, 0x9f, 0xff, 0xf1, 0x01, 0x24, \n\t0xff, 0xe8, 0x01, 0x26, 0xff, 0xe8, 0x01, 0x38, 0xff, 0xf1, 0x01, 0x3a, \n\t0xff, 0xf1, 0x01, 0x69, 0xff, 0xf1, 0x01, 0x7f, 0xff, 0xf1, 0x01, 0x85, \n\t0xff, 0xf1, 0x01, 0xca, 0xff, 0xe8, 0x02, 0x28, 0xff, 0xe8, 0x02, 0x2a, \n\t0xff, 0xf1, 0x02, 0x2c, 0xff, 0xf1, 0x02, 0x30, 0xff, 0xe8, 0x02, 0xdf, \n\t0xff, 0xf1, 0x02, 0xe1, 0xff, 0xf1, 0x02, 0xe3, 0xff, 0xf1, 0x02, 0xe5, \n\t0xff, 0xf1, 0x03, 0xcf, 0xff, 0xe8, 0x03, 0xd0, 0xff, 0xe8, 0x03, 0xf6, \n\t0xff, 0xe8, 0x00, 0x36, 0x00, 0x50, 0xff, 0xec, 0x00, 0x51, 0xff, 0xec, \n\t0x00, 0x53, 0xff, 0xec, 0x00, 0x5b, 0xff, 0xed, 0x00, 0xb3, 0xff, 0xec, \n\t0x01, 0x06, 0xff, 0xec, 0x01, 0x08, 0xff, 0xec, 0x01, 0x0a, 0xff, 0xec, \n\t0x01, 0x0b, 0xff, 0xec, 0x01, 0x88, 0xff, 0xec, 0x01, 0x91, 0xff, 0xec, \n\t0x01, 0xd3, 0xff, 0xec, 0x01, 0xd5, 0xff, 0xec, 0x01, 0xd6, 0xff, 0xec, \n\t0x01, 0xd7, 0xff, 0xec, 0x01, 0xd9, 0xff, 0xec, 0x01, 0xda, 0xff, 0xec, \n\t0x01, 0xdc, 0xff, 0xec, 0x01, 0xdd, 0xff, 0xec, 0x01, 0xdf, 0xff, 0xeb, \n\t0x01, 0xe1, 0xff, 0xed, 0x01, 0xe2, 0xff, 0xec, 0x01, 0xe4, 0xff, 0xec, \n\t0x01, 0xe5, 0xff, 0xec, 0x01, 0xe7, 0xff, 0xec, 0x01, 0xe9, 0xff, 0xec, \n\t0x01, 0xee, 0xff, 0xec, 0x01, 0xf5, 0xff, 0xec, 0x01, 0xf7, 0xff, 0xec, \n\t0x01, 0xf8, 0xff, 0xec, 0x02, 0x18, 0xff, 0xec, 0x02, 0x1f, 0xff, 0xec, \n\t0x02, 0x25, 0xff, 0xec, 0x02, 0x27, 0xff, 0xec, 0x02, 0x2f, 0xff, 0xed, \n\t0x02, 0x3e, 0xff, 0xec, 0x02, 0x40, 0xff, 0xec, 0x02, 0x44, 0xff, 0xec, \n\t0x02, 0x53, 0xff, 0xed, 0x02, 0x59, 0xff, 0xec, 0x02, 0x5b, 0xff, 0xec, \n\t0x02, 0x66, 0xff, 0xec, 0x02, 0x68, 0xff, 0xec, 0x02, 0x6a, 0xff, 0xec, \n\t0x02, 0x6c, 0xff, 0xed, 0x02, 0x7e, 0xff, 0xec, 0x02, 0x86, 0xff, 0xec, \n\t0x03, 0xdb, 0xff, 0xeb, 0x03, 0xdc, 0xff, 0xed, 0x03, 0xe1, 0xff, 0xf2, \n\t0x03, 0xec, 0xff, 0xef, 0x03, 0xf3, 0xff, 0xed, 0x03, 0xf7, 0xff, 0xec, \n\t0x04, 0x01, 0xff, 0xed, 0x00, 0x09, 0x01, 0xdf, 0xff, 0xea, 0x01, 0xe3, \n\t0xff, 0xea, 0x02, 0x33, 0xff, 0xea, 0x02, 0x35, 0xff, 0xea, 0x02, 0x42, \n\t0xff, 0xea, 0x02, 0x64, 0xff, 0xea, 0x02, 0x7e, 0xff, 0xea, 0x03, 0xdb, \n\t0x00, 0x17, 0x03, 0xf7, 0xff, 0xea, 0x00, 0x0a, 0x00, 0x05, 0xff, 0xec, \n\t0x00, 0x0a, 0xff, 0xec, 0x01, 0x51, 0xff, 0xec, 0x02, 0xf8, 0xff, 0xec, \n\t0x02, 0xf9, 0xff, 0xec, 0x02, 0xfb, 0xff, 0xec, 0x02, 0xfc, 0xff, 0xec, \n\t0x02, 0xfd, 0xff, 0xec, 0x03, 0x05, 0xff, 0xec, 0x03, 0x06, 0xff, 0xec, \n\t0x00, 0x08, 0x01, 0xdf, 0xff, 0xae, 0x02, 0x35, 0xff, 0xea, 0x02, 0x74, \n\t0xff, 0xed, 0x02, 0x76, 0xff, 0xf0, 0x02, 0x7e, 0xff, 0xae, 0x03, 0xe1, \n\t0xff, 0xd3, 0x03, 0xec, 0xff, 0xd5, 0x03, 0xf7, 0xff, 0x8e, 0x00, 0x09, \n\t0x00, 0x0c, 0x00, 0x17, 0x00, 0x40, 0x00, 0x14, 0x00, 0x55, 0xff, 0xdd, \n\t0x00, 0x60, 0x00, 0x16, 0x03, 0x42, 0xff, 0xd3, 0x03, 0x44, 0xff, 0xd3, \n\t0x03, 0x4d, 0xff, 0xd3, 0x03, 0x51, 0xff, 0xd3, 0x03, 0x55, 0xff, 0x6a, \n\t0x00, 0x06, 0x01, 0x9e, 0xff, 0xe7, 0x01, 0xa1, 0xff, 0xe4, 0x01, 0xdf, \n\t0xff, 0xe8, 0x02, 0x7e, 0xff, 0xe9, 0x03, 0xdb, 0xff, 0xc6, 0x03, 0xf7, \n\t0xff, 0xe9, 0x00, 0x13, 0x00, 0x5a, 0xff, 0xb6, 0x01, 0x80, 0xff, 0xbb, \n\t0x01, 0x9e, 0xff, 0xa6, 0x01, 0xdf, 0xff, 0xad, 0x02, 0x0d, 0xff, 0xca, \n\t0x02, 0x35, 0xff, 0x86, 0x02, 0x4e, 0xff, 0xd0, 0x02, 0x74, 0xff, 0x87, \n\t0x02, 0x76, 0xff, 0x7f, 0x02, 0x7e, 0xff, 0x8d, 0x02, 0x7f, 0xff, 0xec, \n\t0x03, 0x42, 0xff, 0xe3, 0x03, 0x44, 0xff, 0xe3, 0x03, 0x4d, 0xff, 0xe2, \n\t0x03, 0x51, 0xff, 0xe4, 0x03, 0xda, 0xff, 0xd0, 0x03, 0xe1, 0xff, 0xa4, \n\t0x03, 0xec, 0xff, 0xbe, 0x03, 0xf7, 0xff, 0x61, 0x00, 0x02, 0x00, 0x0c, \n\t0xff, 0xe2, 0x02, 0x39, 0xff, 0xea, 0x00, 0x18, 0x01, 0x80, 0xff, 0xcc, \n\t0x01, 0x8e, 0xff, 0xed, 0x01, 0x92, 0xff, 0xea, 0x01, 0x95, 0x00, 0x14, \n\t0x01, 0x9e, 0xff, 0x97, 0x01, 0xa0, 0xff, 0xcc, 0x01, 0xa2, 0xff, 0xd2, \n\t0x01, 0xa3, 0xff, 0xd5, 0x01, 0xdf, 0xff, 0xc1, 0x02, 0x35, 0xff, 0xad, \n\t0x02, 0x38, 0xff, 0xcf, 0x02, 0x39, 0xff, 0xbb, 0x02, 0x4e, 0xff, 0xe3, \n\t0x02, 0x73, 0x00, 0x0f, 0x02, 0x75, 0x00, 0x0e, 0x02, 0x7e, 0xff, 0xa2, \n\t0x02, 0x7f, 0xff, 0xf0, 0x03, 0x42, 0xff, 0xe6, 0x03, 0x44, 0xff, 0xe3, \n\t0x03, 0x4d, 0xff, 0xe3, 0x03, 0x51, 0xff, 0xe6, 0x03, 0xd1, 0x00, 0x1c, \n\t0x03, 0xda, 0xff, 0xe6, 0x03, 0xf7, 0xff, 0x94, 0x00, 0x01, 0x02, 0x0d, \n\t0xff, 0xef, 0x00, 0x08, 0x01, 0x9e, 0xff, 0xe7, 0x01, 0xa1, 0xff, 0xe7, \n\t0x01, 0xdf, 0xff, 0xe7, 0x02, 0x74, 0xff, 0xf4, 0x02, 0x7e, 0xff, 0xe9, \n\t0x03, 0xe1, 0xff, 0xed, 0x03, 0xec, 0xff, 0xef, 0x03, 0xf7, 0xff, 0xd9, \n\t0x00, 0x13, 0x01, 0xd2, 0xff, 0xda, 0x01, 0xe6, 0xff, 0xd9, 0x01, 0xea, \n\t0xff, 0xca, 0x01, 0xfa, 0xff, 0xda, 0x02, 0x0d, 0xff, 0xc5, 0x02, 0x1b, \n\t0xff, 0xdd, 0x02, 0x21, 0xff, 0xda, 0x02, 0x35, 0xff, 0xe6, 0x02, 0x37, \n\t0xff, 0xd8, 0x02, 0x39, 0xff, 0xd4, 0x02, 0x6f, 0xff, 0xb1, 0x02, 0x7a, \n\t0xff, 0xd9, 0x02, 0x7d, 0x00, 0x14, 0x03, 0xd1, 0xff, 0x9f, 0x03, 0xd8, \n\t0x00, 0x15, 0x03, 0xdb, 0xff, 0x9e, 0x03, 0xdd, 0xff, 0xcf, 0x03, 0xef, \n\t0xff, 0xd7, 0x03, 0xf9, 0xff, 0xda, 0x00, 0x02, 0x07, 0x16, 0x00, 0x04, \n\t0x00, 0x00, 0x09, 0x96, 0x0f, 0xfa, 0x00, 0x1f, 0x00, 0x1d, 0x00, 0x00, \n\t0xff, 0xd5, 0xff, 0x52, 0xff, 0xaf, 0xff, 0xa4, 0xff, 0xe9, 0xff, 0xa9, \n\t0xff, 0xa9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xe3, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xe1, \n\t0xff, 0xe4, 0xff, 0x7e, 0xff, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xde, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xe8, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xe1, 0xff, 0xe7, 0xff, 0xce, \n\t0x00, 0x00, 0xff, 0xa8, 0xff, 0xe7, 0xff, 0xe6, 0xff, 0xcd, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf3, 0x00, 0x00, \n\t0xff, 0xea, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xec, 0xff, 0xe2, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0xff, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0xff, 0xe2, 0x00, 0x00, 0xff, 0xe1, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0xff, 0xe6, 0xff, 0xd1, 0xff, 0x58, 0xff, 0xc6, \n\t0xff, 0x92, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xd6, 0x00, 0x16, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x2b, \n\t0xff, 0x29, 0xfe, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0xff, 0xf0, 0xff, 0x74, 0x00, 0x00, 0xff, 0xc5, 0x00, 0x00, \n\t0xff, 0xe4, 0xff, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x58, 0xff, 0xf4, \n\t0xff, 0xf1, 0x00, 0x00, 0xff, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0xfe, 0x82, 0xff, 0xb3, 0xff, 0xd9, 0xff, 0x66, \n\t0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0xff, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x9c, 0xff, 0x9e, 0xff, 0x97, \n\t0xff, 0xad, 0xff, 0xa3, 0xff, 0xa6, 0x00, 0x13, 0x00, 0x13, 0x00, 0x13, \n\t0x00, 0x00, 0xff, 0x35, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc2, 0xff, 0xb3, \n\t0xff, 0x9f, 0xff, 0x38, 0xff, 0xdf, 0xff, 0x64, 0x00, 0x00, 0x00, 0x11, \n\t0xff, 0x66, 0xff, 0xed, 0xff, 0xa5, 0xff, 0xb9, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0xff, 0x73, 0xff, 0xca, 0xff, 0xcc, 0x00, 0x00, \n\t0xff, 0xca, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0xff, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdf, 0xff, 0xf4, \n\t0xff, 0xb7, 0xff, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0xff, 0xb7, 0xff, 0xd9, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, \n\t0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x57, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xea, 0x00, 0x00, 0xff, 0x9b, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0xff, 0xe2, 0x00, 0x00, 0xff, 0xe0, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x14, 0xff, 0xe8, 0xff, 0xcd, 0xff, 0x46, 0xff, 0xdb, \n\t0xff, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x61, \n\t0xff, 0xa0, 0xff, 0x7f, 0xff, 0xb3, 0xff, 0x70, 0xff, 0x87, 0x00, 0x14, \n\t0x00, 0x15, 0x00, 0x15, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0xff, 0xb5, 0xff, 0xe9, 0xff, 0x7d, 0xff, 0xde, 0x00, 0x00, \n\t0xff, 0xc3, 0x00, 0x14, 0x00, 0x00, 0xff, 0xed, 0xff, 0xde, 0xff, 0xd6, \n\t0xff, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, \n\t0xff, 0xe8, 0x00, 0x00, 0xff, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0xff, 0xea, 0xff, 0xe1, 0x00, 0x00, 0xff, 0xe2, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0xff, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0xff, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0xff, 0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf4, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf0, \n\t0x00, 0x00, 0xff, 0xef, 0xff, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0xff, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xda, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf1, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc8, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc3, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0xff, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0xff, 0xed, 0x00, 0x00, 0xff, 0xe0, 0xff, 0xed, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0xff, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xef, 0xff, 0xf1, 0x00, 0x00, \n\t0xff, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0xff, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc8, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xe9, 0x00, 0x00, 0xff, 0xe4, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0xff, 0xed, 0x00, 0x00, 0xff, 0xed, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x42, \n\t0xff, 0x46, 0xff, 0x3a, 0xff, 0x60, 0xff, 0x4e, 0xff, 0x53, 0x00, 0x0c, \n\t0x00, 0x0c, 0x00, 0x0c, 0x00, 0x00, 0xfe, 0x93, 0x00, 0x00, 0x00, 0x00, \n\t0xff, 0x82, 0xff, 0x6a, 0xff, 0x48, 0xfe, 0x98, 0xff, 0xb4, 0xfe, 0xe2, \n\t0x00, 0x00, 0x00, 0x08, 0xfe, 0xe7, 0xff, 0xcc, 0xff, 0x52, 0xff, 0x74, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb4, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x8d, 0xff, 0xbe, \n\t0xff, 0x9e, 0xff, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, \n\t0xff, 0xe3, 0x00, 0x00, 0x00, 0x00, 0xff, 0x95, 0xff, 0xa0, 0xff, 0xb1, \n\t0xff, 0xc5, 0xff, 0xb1, 0xff, 0xca, 0x00, 0x15, 0x00, 0x00, 0x00, 0x15, \n\t0x00, 0x00, 0xff, 0x2b, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc1, 0x00, 0x00, \n\t0x00, 0x00, 0xff, 0x60, 0xff, 0xe6, 0xff, 0xe6, 0x00, 0x00, 0x00, 0x00, \n\t0xff, 0xaf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xe9, 0x00, 0x00, \n\t0xff, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd1, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0xff, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb9, 0x00, 0x00, \n\t0x00, 0x00, 0xff, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0xff, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x3e, \n\t0x00, 0x05, 0x00, 0x0a, 0x00, 0x0f, 0x00, 0x11, 0x00, 0x1d, 0x00, 0x25, \n\t0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, \n\t0x00, 0x32, 0x00, 0x33, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, \n\t0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, \n\t0x00, 0x48, 0x00, 0x4b, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, \n\t0x00, 0x55, 0x00, 0x59, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x89, \n\t0x00, 0x8a, 0x00, 0x8b, 0x00, 0x8c, 0x00, 0x8d, 0x00, 0x92, 0x00, 0x94, \n\t0x00, 0x95, 0x00, 0x96, 0x00, 0x97, 0x00, 0x98, 0x00, 0x9b, 0x00, 0x9c, \n\t0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, \n\t0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, 0x00, 0xa9, 0x00, 0xaa, 0x00, 0xab, \n\t0x00, 0xac, 0x00, 0xad, 0x00, 0xb3, 0x00, 0xb4, 0x00, 0xb5, 0x00, 0xb6, \n\t0x00, 0xb7, 0x00, 0xb8, 0x00, 0xbf, 0x00, 0xc0, 0x00, 0xc1, 0x00, 0xc3, \n\t0x00, 0xc5, 0x00, 0xc7, 0x00, 0xc8, 0x00, 0xc9, 0x00, 0xca, 0x00, 0xcb, \n\t0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcf, 0x00, 0xd0, 0x00, 0xd2, \n\t0x00, 0xd4, 0x00, 0xd5, 0x00, 0xd6, 0x00, 0xd7, 0x00, 0xd8, 0x00, 0xd9, \n\t0x00, 0xda, 0x00, 0xdb, 0x00, 0xdc, 0x00, 0xdd, 0x00, 0xe7, 0x00, 0xf6, \n\t0x00, 0xf8, 0x00, 0xfb, 0x00, 0xfd, 0x00, 0xff, 0x01, 0x01, 0x01, 0x06, \n\t0x01, 0x08, 0x01, 0x0a, 0x01, 0x0b, 0x01, 0x0e, 0x01, 0x0f, 0x01, 0x10, \n\t0x01, 0x11, 0x01, 0x12, 0x01, 0x13, 0x01, 0x17, 0x01, 0x19, 0x01, 0x1b, \n\t0x01, 0x24, 0x01, 0x26, 0x01, 0x28, 0x01, 0x2a, 0x01, 0x2c, 0x01, 0x2e, \n\t0x01, 0x30, 0x01, 0x32, 0x01, 0x34, 0x01, 0x36, 0x01, 0x38, 0x01, 0x39, \n\t0x01, 0x3a, 0x01, 0x3b, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0x3e, 0x01, 0x3f, \n\t0x01, 0x40, 0x01, 0x49, 0x01, 0x51, 0x01, 0x65, 0x01, 0x68, 0x01, 0x69, \n\t0x01, 0x6d, 0x01, 0x6e, 0x01, 0x70, 0x01, 0x71, 0x01, 0x73, 0x01, 0x75, \n\t0x01, 0x7a, 0x01, 0x7c, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x81, 0x01, 0x85, \n\t0x01, 0x88, 0x01, 0x8d, 0x01, 0x91, 0x01, 0x97, 0x01, 0x99, 0x01, 0x9b, \n\t0x01, 0xa6, 0x01, 0xac, 0x01, 0xad, 0x01, 0xae, 0x01, 0xb3, 0x01, 0xb4, \n\t0x01, 0xb5, 0x01, 0xb6, 0x01, 0xb8, 0x01, 0xbc, 0x01, 0xbd, 0x01, 0xbe, \n\t0x01, 0xc2, 0x01, 0xc6, 0x01, 0xc8, 0x01, 0xc9, 0x01, 0xca, 0x01, 0xcb, \n\t0x01, 0xd1, 0x01, 0xd3, 0x01, 0xd4, 0x01, 0xdb, 0x01, 0xdd, 0x01, 0xde, \n\t0x01, 0xe0, 0x01, 0xe1, 0x01, 0xe7, 0x01, 0xe8, 0x01, 0xeb, 0x01, 0xec, \n\t0x01, 0xee, 0x01, 0xf4, 0x01, 0xf5, 0x01, 0xf9, 0x01, 0xfb, 0x02, 0x08, \n\t0x02, 0x09, 0x02, 0x1a, 0x02, 0x1b, 0x02, 0x1c, 0x02, 0x1e, 0x02, 0x20, \n\t0x02, 0x22, 0x02, 0x28, 0x02, 0x2a, 0x02, 0x2b, 0x02, 0x2c, 0x02, 0x2e, \n\t0x02, 0x2f, 0x02, 0x37, 0x02, 0x47, 0x02, 0x49, 0x02, 0x4c, 0x02, 0x4d, \n\t0x02, 0x4f, 0x02, 0x51, 0x02, 0x52, 0x02, 0x53, 0x02, 0x5c, 0x02, 0x5d, \n\t0x02, 0x5f, 0x02, 0x60, 0x02, 0x61, 0x02, 0x62, 0x02, 0x65, 0x02, 0x66, \n\t0x02, 0x6a, 0x02, 0x6b, 0x02, 0x6c, 0x02, 0x84, 0x02, 0x86, 0x02, 0x87, \n\t0x02, 0x89, 0x02, 0x8b, 0x02, 0x8e, 0x02, 0x90, 0x02, 0x92, 0x02, 0x94, \n\t0x02, 0x96, 0x02, 0x98, 0x02, 0x9a, 0x02, 0x9c, 0x02, 0x9e, 0x02, 0xa0, \n\t0x02, 0xa2, 0x02, 0xa4, 0x02, 0xa5, 0x02, 0xa6, 0x02, 0xa7, 0x02, 0xa8, \n\t0x02, 0xa9, 0x02, 0xaa, 0x02, 0xab, 0x02, 0xac, 0x02, 0xad, 0x02, 0xae, \n\t0x02, 0xaf, 0x02, 0xb0, 0x02, 0xb1, 0x02, 0xb2, 0x02, 0xb3, 0x02, 0xb4, \n\t0x02, 0xb9, 0x02, 0xba, 0x02, 0xbb, 0x02, 0xbc, 0x02, 0xbd, 0x02, 0xbe, \n\t0x02, 0xbf, 0x02, 0xc0, 0x02, 0xc1, 0x02, 0xc2, 0x02, 0xc3, 0x02, 0xc4, \n\t0x02, 0xc5, 0x02, 0xc6, 0x02, 0xce, 0x02, 0xd1, 0x02, 0xd3, 0x02, 0xdf, \n\t0x02, 0xe0, 0x02, 0xe1, 0x02, 0xe2, 0x02, 0xe3, 0x02, 0xe4, 0x02, 0xe5, \n\t0x02, 0xe6, 0x02, 0xe7, 0x02, 0xf8, 0x02, 0xf9, 0x02, 0xfa, 0x02, 0xfb, \n\t0x02, 0xfc, 0x02, 0xfd, 0x02, 0xfe, 0x03, 0x02, 0x03, 0x03, 0x03, 0x05, \n\t0x03, 0x06, 0x03, 0xd2, 0x03, 0xd3, 0x03, 0xd7, 0x03, 0xd8, 0x03, 0xdc, \n\t0x03, 0xde, 0x03, 0xdf, 0x03, 0xe2, 0x03, 0xe6, 0x03, 0xe7, 0x03, 0xe8, \n\t0x03, 0xef, 0x03, 0xf2, 0x03, 0xf3, 0x03, 0xf6, 0x03, 0xfc, 0x03, 0xfd, \n\t0x04, 0x00, 0x04, 0x01, 0x04, 0x07, 0x04, 0x08, 0x04, 0x09, 0x04, 0x0a, \n\t0x00, 0x02, 0x01, 0x10, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x11, \n\t0x00, 0x11, 0x00, 0x01, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x01, 0x00, 0x25, \n\t0x00, 0x25, 0x00, 0x02, 0x00, 0x26, 0x00, 0x26, 0x00, 0x03, 0x00, 0x27, \n\t0x00, 0x27, 0x00, 0x04, 0x00, 0x28, 0x00, 0x28, 0x00, 0x05, 0x00, 0x2d, \n\t0x00, 0x2d, 0x00, 0x06, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x07, 0x00, 0x2f, \n\t0x00, 0x2f, 0x00, 0x08, 0x00, 0x32, 0x00, 0x32, 0x00, 0x04, 0x00, 0x33, \n\t0x00, 0x33, 0x00, 0x09, 0x00, 0x37, 0x00, 0x37, 0x00, 0x0a, 0x00, 0x38, \n\t0x00, 0x38, 0x00, 0x06, 0x00, 0x39, 0x00, 0x39, 0x00, 0x0b, 0x00, 0x3a, \n\t0x00, 0x3a, 0x00, 0x0c, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x0d, 0x00, 0x3c, \n\t0x00, 0x3c, 0x00, 0x0e, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x0f, 0x00, 0x44, \n\t0x00, 0x44, 0x00, 0x10, 0x00, 0x45, 0x00, 0x45, 0x00, 0x11, 0x00, 0x46, \n\t0x00, 0x46, 0x00, 0x12, 0x00, 0x48, 0x00, 0x48, 0x00, 0x13, 0x00, 0x4b, \n\t0x00, 0x4b, 0x00, 0x14, 0x00, 0x50, 0x00, 0x51, 0x00, 0x14, 0x00, 0x52, \n\t0x00, 0x52, 0x00, 0x15, 0x00, 0x53, 0x00, 0x53, 0x00, 0x11, 0x00, 0x55, \n\t0x00, 0x55, 0x00, 0x16, 0x00, 0x59, 0x00, 0x59, 0x00, 0x17, 0x00, 0x5b, \n\t0x00, 0x5b, 0x00, 0x18, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x17, 0x00, 0x5d, \n\t0x00, 0x5d, 0x00, 0x19, 0x00, 0x89, 0x00, 0x89, 0x00, 0x03, 0x00, 0x8a, \n\t0x00, 0x8d, 0x00, 0x05, 0x00, 0x92, 0x00, 0x92, 0x00, 0x04, 0x00, 0x94, \n\t0x00, 0x98, 0x00, 0x04, 0x00, 0x9b, 0x00, 0x9e, 0x00, 0x06, 0x00, 0x9f, \n\t0x00, 0x9f, 0x00, 0x0e, 0x00, 0xa2, 0x00, 0xa7, 0x00, 0x10, 0x00, 0xa9, \n\t0x00, 0xa9, 0x00, 0x12, 0x00, 0xaa, 0x00, 0xad, 0x00, 0x13, 0x00, 0xb3, \n\t0x00, 0xb3, 0x00, 0x14, 0x00, 0xb4, 0x00, 0xb8, 0x00, 0x15, 0x00, 0xbf, \n\t0x00, 0xbf, 0x00, 0x17, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0x11, 0x00, 0xc1, \n\t0x00, 0xc1, 0x00, 0x17, 0x00, 0xc3, 0x00, 0xc3, 0x00, 0x10, 0x00, 0xc5, \n\t0x00, 0xc5, 0x00, 0x10, 0x00, 0xc7, 0x00, 0xc7, 0x00, 0x10, 0x00, 0xc8, \n\t0x00, 0xc8, 0x00, 0x03, 0x00, 0xc9, 0x00, 0xc9, 0x00, 0x12, 0x00, 0xca, \n\t0x00, 0xca, 0x00, 0x03, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0x12, 0x00, 0xcc, \n\t0x00, 0xcc, 0x00, 0x03, 0x00, 0xcd, 0x00, 0xcd, 0x00, 0x12, 0x00, 0xce, \n\t0x00, 0xce, 0x00, 0x03, 0x00, 0xcf, 0x00, 0xcf, 0x00, 0x12, 0x00, 0xd0, \n\t0x00, 0xd0, 0x00, 0x04, 0x00, 0xd2, 0x00, 0xd2, 0x00, 0x04, 0x00, 0xd4, \n\t0x00, 0xd4, 0x00, 0x05, 0x00, 0xd5, 0x00, 0xd5, 0x00, 0x13, 0x00, 0xd6, \n\t0x00, 0xd6, 0x00, 0x05, 0x00, 0xd7, 0x00, 0xd7, 0x00, 0x13, 0x00, 0xd8, \n\t0x00, 0xd8, 0x00, 0x05, 0x00, 0xd9, 0x00, 0xd9, 0x00, 0x13, 0x00, 0xda, \n\t0x00, 0xda, 0x00, 0x05, 0x00, 0xdb, 0x00, 0xdb, 0x00, 0x13, 0x00, 0xdc, \n\t0x00, 0xdc, 0x00, 0x05, 0x00, 0xdd, 0x00, 0xdd, 0x00, 0x13, 0x00, 0xe7, \n\t0x00, 0xe7, 0x00, 0x14, 0x00, 0xf6, 0x00, 0xf6, 0x00, 0x06, 0x00, 0xf8, \n\t0x00, 0xf8, 0x00, 0x07, 0x00, 0xfb, 0x00, 0xfb, 0x00, 0x08, 0x00, 0xfd, \n\t0x00, 0xfd, 0x00, 0x08, 0x00, 0xff, 0x00, 0xff, 0x00, 0x08, 0x01, 0x01, \n\t0x01, 0x01, 0x00, 0x08, 0x01, 0x06, 0x01, 0x06, 0x00, 0x14, 0x01, 0x08, \n\t0x01, 0x08, 0x00, 0x14, 0x01, 0x0a, 0x01, 0x0b, 0x00, 0x14, 0x01, 0x0e, \n\t0x01, 0x0e, 0x00, 0x04, 0x01, 0x0f, 0x01, 0x0f, 0x00, 0x15, 0x01, 0x10, \n\t0x01, 0x10, 0x00, 0x04, 0x01, 0x11, 0x01, 0x11, 0x00, 0x15, 0x01, 0x12, \n\t0x01, 0x12, 0x00, 0x04, 0x01, 0x13, 0x01, 0x13, 0x00, 0x15, 0x01, 0x17, \n\t0x01, 0x17, 0x00, 0x16, 0x01, 0x19, 0x01, 0x19, 0x00, 0x16, 0x01, 0x1b, \n\t0x01, 0x1b, 0x00, 0x16, 0x01, 0x24, 0x01, 0x24, 0x00, 0x0a, 0x01, 0x26, \n\t0x01, 0x26, 0x00, 0x0a, 0x01, 0x28, 0x01, 0x28, 0x00, 0x0a, 0x01, 0x2a, \n\t0x01, 0x2a, 0x00, 0x06, 0x01, 0x2c, 0x01, 0x2c, 0x00, 0x06, 0x01, 0x2e, \n\t0x01, 0x2e, 0x00, 0x06, 0x01, 0x30, 0x01, 0x30, 0x00, 0x06, 0x01, 0x32, \n\t0x01, 0x32, 0x00, 0x06, 0x01, 0x34, 0x01, 0x34, 0x00, 0x06, 0x01, 0x36, \n\t0x01, 0x36, 0x00, 0x0c, 0x01, 0x38, 0x01, 0x38, 0x00, 0x0e, 0x01, 0x39, \n\t0x01, 0x39, 0x00, 0x17, 0x01, 0x3a, 0x01, 0x3a, 0x00, 0x0e, 0x01, 0x3b, \n\t0x01, 0x3b, 0x00, 0x0f, 0x01, 0x3c, 0x01, 0x3c, 0x00, 0x19, 0x01, 0x3d, \n\t0x01, 0x3d, 0x00, 0x0f, 0x01, 0x3e, 0x01, 0x3e, 0x00, 0x19, 0x01, 0x3f, \n\t0x01, 0x3f, 0x00, 0x0f, 0x01, 0x40, 0x01, 0x40, 0x00, 0x19, 0x01, 0x49, \n\t0x01, 0x49, 0x00, 0x10, 0x01, 0x65, 0x01, 0x65, 0x00, 0x05, 0x01, 0x68, \n\t0x01, 0x68, 0x00, 0x04, 0x01, 0x69, 0x01, 0x69, 0x00, 0x0e, 0x01, 0x6d, \n\t0x01, 0x6d, 0x00, 0x02, 0x01, 0x6e, 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x70, \n\t0x01, 0x70, 0x00, 0x05, 0x01, 0x71, 0x01, 0x71, 0x00, 0x0f, 0x01, 0x73, \n\t0x01, 0x73, 0x00, 0x04, 0x01, 0x75, 0x01, 0x75, 0x00, 0x07, 0x01, 0x7a, \n\t0x01, 0x7a, 0x00, 0x04, 0x01, 0x7c, 0x01, 0x7c, 0x00, 0x09, 0x01, 0x7e, \n\t0x01, 0x7e, 0x00, 0x0a, 0x01, 0x7f, 0x01, 0x7f, 0x00, 0x0e, 0x01, 0x81, \n\t0x01, 0x81, 0x00, 0x0d, 0x01, 0x85, 0x01, 0x85, 0x00, 0x0e, 0x01, 0x88, \n\t0x01, 0x88, 0x00, 0x14, 0x01, 0x8d, 0x01, 0x8d, 0x00, 0x17, 0x01, 0x91, \n\t0x01, 0x91, 0x00, 0x14, 0x01, 0x97, 0x01, 0x97, 0x00, 0x17, 0x01, 0x99, \n\t0x01, 0x99, 0x00, 0x15, 0x01, 0x9b, 0x01, 0x9b, 0x00, 0x11, 0x01, 0xa6, \n\t0x01, 0xa6, 0x00, 0x15, 0x01, 0xac, 0x01, 0xad, 0x00, 0x05, 0x01, 0xae, \n\t0x01, 0xae, 0x00, 0x1a, 0x01, 0xb3, 0x01, 0xb3, 0x00, 0x06, 0x01, 0xb4, \n\t0x01, 0xb5, 0x00, 0x1b, 0x01, 0xb6, 0x01, 0xb6, 0x00, 0x07, 0x01, 0xb8, \n\t0x01, 0xb8, 0x00, 0x1c, 0x01, 0xbc, 0x01, 0xbc, 0x00, 0x02, 0x01, 0xbd, \n\t0x01, 0xbd, 0x00, 0x1a, 0x01, 0xbe, 0x01, 0xbe, 0x00, 0x05, 0x01, 0xc2, \n\t0x01, 0xc2, 0x00, 0x07, 0x01, 0xc6, 0x01, 0xc6, 0x00, 0x04, 0x01, 0xc8, \n\t0x01, 0xc8, 0x00, 0x09, 0x01, 0xc9, 0x01, 0xc9, 0x00, 0x03, 0x01, 0xca, \n\t0x01, 0xca, 0x00, 0x0a, 0x01, 0xcb, 0x01, 0xcb, 0x00, 0x0d, 0x01, 0xd1, \n\t0x01, 0xd1, 0x00, 0x10, 0x01, 0xd3, 0x01, 0xd3, 0x00, 0x1d, 0x01, 0xd4, \n\t0x01, 0xd4, 0x00, 0x13, 0x01, 0xdb, 0x01, 0xdb, 0x00, 0x15, 0x01, 0xdd, \n\t0x01, 0xdd, 0x00, 0x11, 0x01, 0xde, 0x01, 0xde, 0x00, 0x12, 0x01, 0xe0, \n\t0x01, 0xe0, 0x00, 0x17, 0x01, 0xe1, 0x01, 0xe1, 0x00, 0x18, 0x01, 0xe7, \n\t0x01, 0xe7, 0x00, 0x1e, 0x01, 0xe8, 0x01, 0xe8, 0x00, 0x11, 0x01, 0xeb, \n\t0x01, 0xec, 0x00, 0x13, 0x01, 0xee, 0x01, 0xee, 0x00, 0x1d, 0x01, 0xf4, \n\t0x01, 0xf5, 0x00, 0x1e, 0x01, 0xf9, 0x01, 0xf9, 0x00, 0x17, 0x01, 0xfb, \n\t0x01, 0xfb, 0x00, 0x1b, 0x02, 0x08, 0x02, 0x09, 0x00, 0x17, 0x02, 0x1a, \n\t0x02, 0x1a, 0x00, 0x1a, 0x02, 0x1b, 0x02, 0x1b, 0x00, 0x1d, 0x02, 0x1c, \n\t0x02, 0x1c, 0x00, 0x1a, 0x02, 0x1e, 0x02, 0x1e, 0x00, 0x07, 0x02, 0x20, \n\t0x02, 0x20, 0x00, 0x07, 0x02, 0x22, 0x02, 0x22, 0x00, 0x07, 0x02, 0x28, \n\t0x02, 0x28, 0x00, 0x0a, 0x02, 0x2a, 0x02, 0x2a, 0x00, 0x0e, 0x02, 0x2b, \n\t0x02, 0x2b, 0x00, 0x17, 0x02, 0x2c, 0x02, 0x2c, 0x00, 0x0e, 0x02, 0x2e, \n\t0x02, 0x2e, 0x00, 0x0d, 0x02, 0x2f, 0x02, 0x2f, 0x00, 0x18, 0x02, 0x37, \n\t0x02, 0x37, 0x00, 0x14, 0x02, 0x47, 0x02, 0x47, 0x00, 0x10, 0x02, 0x49, \n\t0x02, 0x49, 0x00, 0x10, 0x02, 0x4c, 0x02, 0x4c, 0x00, 0x05, 0x02, 0x4d, \n\t0x02, 0x4d, 0x00, 0x13, 0x02, 0x4f, 0x02, 0x4f, 0x00, 0x13, 0x02, 0x51, \n\t0x02, 0x51, 0x00, 0x13, 0x02, 0x52, 0x02, 0x52, 0x00, 0x0d, 0x02, 0x53, \n\t0x02, 0x53, 0x00, 0x18, 0x02, 0x5c, 0x02, 0x5c, 0x00, 0x04, 0x02, 0x5d, \n\t0x02, 0x5d, 0x00, 0x15, 0x02, 0x5f, 0x02, 0x5f, 0x00, 0x11, 0x02, 0x60, \n\t0x02, 0x62, 0x00, 0x17, 0x02, 0x65, 0x02, 0x65, 0x00, 0x1a, 0x02, 0x66, \n\t0x02, 0x66, 0x00, 0x1d, 0x02, 0x6a, 0x02, 0x6a, 0x00, 0x1d, 0x02, 0x6b, \n\t0x02, 0x6b, 0x00, 0x0d, 0x02, 0x6c, 0x02, 0x6c, 0x00, 0x18, 0x02, 0x84, \n\t0x02, 0x84, 0x00, 0x10, 0x02, 0x86, 0x02, 0x86, 0x00, 0x14, 0x02, 0x87, \n\t0x02, 0x87, 0x00, 0x0c, 0x02, 0x89, 0x02, 0x89, 0x00, 0x0c, 0x02, 0x8b, \n\t0x02, 0x8b, 0x00, 0x0c, 0x02, 0x8e, 0x02, 0x8e, 0x00, 0x10, 0x02, 0x90, \n\t0x02, 0x90, 0x00, 0x10, 0x02, 0x92, 0x02, 0x92, 0x00, 0x10, 0x02, 0x94, \n\t0x02, 0x94, 0x00, 0x10, 0x02, 0x96, 0x02, 0x96, 0x00, 0x10, 0x02, 0x98, \n\t0x02, 0x98, 0x00, 0x10, 0x02, 0x9a, 0x02, 0x9a, 0x00, 0x10, 0x02, 0x9c, \n\t0x02, 0x9c, 0x00, 0x10, 0x02, 0x9e, 0x02, 0x9e, 0x00, 0x10, 0x02, 0xa0, \n\t0x02, 0xa0, 0x00, 0x10, 0x02, 0xa2, 0x02, 0xa2, 0x00, 0x10, 0x02, 0xa4, \n\t0x02, 0xa4, 0x00, 0x10, 0x02, 0xa5, 0x02, 0xa5, 0x00, 0x05, 0x02, 0xa6, \n\t0x02, 0xa6, 0x00, 0x13, 0x02, 0xa7, 0x02, 0xa7, 0x00, 0x05, 0x02, 0xa8, \n\t0x02, 0xa8, 0x00, 0x13, 0x02, 0xa9, 0x02, 0xa9, 0x00, 0x05, 0x02, 0xaa, \n\t0x02, 0xaa, 0x00, 0x13, 0x02, 0xab, 0x02, 0xab, 0x00, 0x05, 0x02, 0xac, \n\t0x02, 0xac, 0x00, 0x13, 0x02, 0xad, 0x02, 0xad, 0x00, 0x05, 0x02, 0xae, \n\t0x02, 0xae, 0x00, 0x13, 0x02, 0xaf, 0x02, 0xaf, 0x00, 0x05, 0x02, 0xb0, \n\t0x02, 0xb0, 0x00, 0x13, 0x02, 0xb1, 0x02, 0xb1, 0x00, 0x05, 0x02, 0xb2, \n\t0x02, 0xb2, 0x00, 0x13, 0x02, 0xb3, 0x02, 0xb3, 0x00, 0x05, 0x02, 0xb4, \n\t0x02, 0xb4, 0x00, 0x13, 0x02, 0xb9, 0x02, 0xb9, 0x00, 0x04, 0x02, 0xba, \n\t0x02, 0xba, 0x00, 0x15, 0x02, 0xbb, 0x02, 0xbb, 0x00, 0x04, 0x02, 0xbc, \n\t0x02, 0xbc, 0x00, 0x15, 0x02, 0xbd, 0x02, 0xbd, 0x00, 0x04, 0x02, 0xbe, \n\t0x02, 0xbe, 0x00, 0x15, 0x02, 0xbf, 0x02, 0xbf, 0x00, 0x04, 0x02, 0xc0, \n\t0x02, 0xc0, 0x00, 0x15, 0x02, 0xc1, 0x02, 0xc1, 0x00, 0x04, 0x02, 0xc2, \n\t0x02, 0xc2, 0x00, 0x15, 0x02, 0xc3, 0x02, 0xc3, 0x00, 0x04, 0x02, 0xc4, \n\t0x02, 0xc4, 0x00, 0x15, 0x02, 0xc5, 0x02, 0xc5, 0x00, 0x04, 0x02, 0xc6, \n\t0x02, 0xc6, 0x00, 0x15, 0x02, 0xce, 0x02, 0xce, 0x00, 0x15, 0x02, 0xd1, \n\t0x02, 0xd1, 0x00, 0x06, 0x02, 0xd3, 0x02, 0xd3, 0x00, 0x06, 0x02, 0xdf, \n\t0x02, 0xdf, 0x00, 0x0e, 0x02, 0xe0, 0x02, 0xe0, 0x00, 0x17, 0x02, 0xe1, \n\t0x02, 0xe1, 0x00, 0x0e, 0x02, 0xe2, 0x02, 0xe2, 0x00, 0x17, 0x02, 0xe3, \n\t0x02, 0xe3, 0x00, 0x0e, 0x02, 0xe4, 0x02, 0xe4, 0x00, 0x17, 0x02, 0xe5, \n\t0x02, 0xe5, 0x00, 0x0e, 0x02, 0xe6, 0x02, 0xe6, 0x00, 0x17, 0x02, 0xe7, \n\t0x02, 0xe7, 0x00, 0x04, 0x02, 0xfa, 0x02, 0xfa, 0x00, 0x01, 0x02, 0xfe, \n\t0x02, 0xfe, 0x00, 0x01, 0x03, 0x02, 0x03, 0x03, 0x00, 0x01, 0x03, 0xd2, \n\t0x03, 0xd2, 0x00, 0x0d, 0x03, 0xd3, 0x03, 0xd3, 0x00, 0x1c, 0x03, 0xd7, \n\t0x03, 0xd8, 0x00, 0x1b, 0x03, 0xdc, 0x03, 0xdc, 0x00, 0x18, 0x03, 0xde, \n\t0x03, 0xde, 0x00, 0x11, 0x03, 0xdf, 0x03, 0xdf, 0x00, 0x1e, 0x03, 0xe2, \n\t0x03, 0xe2, 0x00, 0x1e, 0x03, 0xe6, 0x03, 0xe6, 0x00, 0x15, 0x03, 0xe7, \n\t0x03, 0xe8, 0x00, 0x0b, 0x03, 0xef, 0x03, 0xef, 0x00, 0x11, 0x03, 0xf2, \n\t0x03, 0xf2, 0x00, 0x0d, 0x03, 0xf3, 0x03, 0xf3, 0x00, 0x18, 0x03, 0xf6, \n\t0x03, 0xf6, 0x00, 0x07, 0x03, 0xfc, 0x03, 0xfc, 0x00, 0x03, 0x03, 0xfd, \n\t0x03, 0xfd, 0x00, 0x12, 0x04, 0x00, 0x04, 0x00, 0x00, 0x0d, 0x04, 0x01, \n\t0x04, 0x01, 0x00, 0x18, 0x04, 0x07, 0x04, 0x07, 0x00, 0x15, 0x04, 0x08, \n\t0x04, 0x0a, 0x00, 0x1c, 0x00, 0x02, 0x01, 0xf5, 0x00, 0x05, 0x00, 0x05, \n\t0x00, 0x01, 0x00, 0x06, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x0a, \n\t0x00, 0x01, 0x00, 0x0b, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x0f, \n\t0x00, 0x0c, 0x00, 0x10, 0x00, 0x10, 0x00, 0x12, 0x00, 0x11, 0x00, 0x11, \n\t0x00, 0x0c, 0x00, 0x12, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x1d, \n\t0x00, 0x0c, 0x00, 0x1e, 0x00, 0x23, 0x00, 0x00, 0x00, 0x24, 0x00, 0x24, \n\t0x00, 0x02, 0x00, 0x25, 0x00, 0x25, 0x00, 0x00, 0x00, 0x26, 0x00, 0x26, \n\t0x00, 0x13, 0x00, 0x27, 0x00, 0x29, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x2a, \n\t0x00, 0x13, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x2d, \n\t0x00, 0x1b, 0x00, 0x2e, 0x00, 0x31, 0x00, 0x00, 0x00, 0x32, 0x00, 0x32, \n\t0x00, 0x13, 0x00, 0x33, 0x00, 0x33, 0x00, 0x00, 0x00, 0x34, 0x00, 0x34, \n\t0x00, 0x13, 0x00, 0x35, 0x00, 0x35, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, \n\t0x00, 0x18, 0x00, 0x37, 0x00, 0x37, 0x00, 0x08, 0x00, 0x38, 0x00, 0x38, \n\t0x00, 0x15, 0x00, 0x39, 0x00, 0x39, 0x00, 0x09, 0x00, 0x3a, 0x00, 0x3a, \n\t0x00, 0x16, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x0d, 0x00, 0x3c, 0x00, 0x3c, \n\t0x00, 0x0a, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x0e, 0x00, 0x3e, 0x00, 0x43, \n\t0x00, 0x00, 0x00, 0x44, 0x00, 0x44, 0x00, 0x03, 0x00, 0x45, 0x00, 0x45, \n\t0x00, 0x00, 0x00, 0x46, 0x00, 0x48, 0x00, 0x04, 0x00, 0x49, 0x00, 0x49, \n\t0x00, 0x00, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x04, 0x00, 0x4b, 0x00, 0x4f, \n\t0x00, 0x00, 0x00, 0x50, 0x00, 0x51, 0x00, 0x05, 0x00, 0x52, 0x00, 0x52, \n\t0x00, 0x06, 0x00, 0x53, 0x00, 0x53, 0x00, 0x05, 0x00, 0x54, 0x00, 0x54, \n\t0x00, 0x04, 0x00, 0x55, 0x00, 0x55, 0x00, 0x00, 0x00, 0x56, 0x00, 0x56, \n\t0x00, 0x07, 0x00, 0x57, 0x00, 0x57, 0x00, 0x00, 0x00, 0x58, 0x00, 0x58, \n\t0x00, 0x10, 0x00, 0x59, 0x00, 0x59, 0x00, 0x11, 0x00, 0x5a, 0x00, 0x5a, \n\t0x00, 0x00, 0x00, 0x5b, 0x00, 0x5b, 0x00, 0x19, 0x00, 0x5c, 0x00, 0x5c, \n\t0x00, 0x11, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x1a, 0x00, 0x5e, 0x00, 0x6e, \n\t0x00, 0x00, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x12, 0x00, 0x70, 0x00, 0x81, \n\t0x00, 0x00, 0x00, 0x82, 0x00, 0x87, 0x00, 0x02, 0x00, 0x88, 0x00, 0x88, \n\t0x00, 0x00, 0x00, 0x89, 0x00, 0x89, 0x00, 0x13, 0x00, 0x8a, 0x00, 0x93, \n\t0x00, 0x00, 0x00, 0x94, 0x00, 0x98, 0x00, 0x13, 0x00, 0x99, 0x00, 0x99, \n\t0x00, 0x00, 0x00, 0x9a, 0x00, 0x9a, 0x00, 0x13, 0x00, 0x9b, 0x00, 0x9e, \n\t0x00, 0x15, 0x00, 0x9f, 0x00, 0x9f, 0x00, 0x0a, 0x00, 0xa0, 0x00, 0xa1, \n\t0x00, 0x00, 0x00, 0xa2, 0x00, 0xa7, 0x00, 0x03, 0x00, 0xa8, 0x00, 0xa8, \n\t0x00, 0x00, 0x00, 0xa9, 0x00, 0xad, 0x00, 0x04, 0x00, 0xae, 0x00, 0xb2, \n\t0x00, 0x00, 0x00, 0xb3, 0x00, 0xb3, 0x00, 0x05, 0x00, 0xb4, 0x00, 0xb8, \n\t0x00, 0x06, 0x00, 0xb9, 0x00, 0xba, 0x00, 0x00, 0x00, 0xbb, 0x00, 0xbe, \n\t0x00, 0x10, 0x00, 0xbf, 0x00, 0xbf, 0x00, 0x11, 0x00, 0xc0, 0x00, 0xc0, \n\t0x00, 0x00, 0x00, 0xc1, 0x00, 0xc1, 0x00, 0x11, 0x00, 0xc2, 0x00, 0xc2, \n\t0x00, 0x02, 0x00, 0xc3, 0x00, 0xc3, 0x00, 0x03, 0x00, 0xc4, 0x00, 0xc4, \n\t0x00, 0x02, 0x00, 0xc5, 0x00, 0xc5, 0x00, 0x03, 0x00, 0xc6, 0x00, 0xc6, \n\t0x00, 0x02, 0x00, 0xc7, 0x00, 0xc7, 0x00, 0x03, 0x00, 0xc8, 0x00, 0xc8, \n\t0x00, 0x13, 0x00, 0xc9, 0x00, 0xc9, 0x00, 0x04, 0x00, 0xca, 0x00, 0xca, \n\t0x00, 0x13, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0x04, 0x00, 0xcc, 0x00, 0xcc, \n\t0x00, 0x13, 0x00, 0xcd, 0x00, 0xcd, 0x00, 0x04, 0x00, 0xce, 0x00, 0xce, \n\t0x00, 0x13, 0x00, 0xcf, 0x00, 0xcf, 0x00, 0x04, 0x00, 0xd0, 0x00, 0xd0, \n\t0x00, 0x00, 0x00, 0xd1, 0x00, 0xd1, 0x00, 0x04, 0x00, 0xd2, 0x00, 0xd4, \n\t0x00, 0x00, 0x00, 0xd5, 0x00, 0xd5, 0x00, 0x04, 0x00, 0xd6, 0x00, 0xd6, \n\t0x00, 0x00, 0x00, 0xd7, 0x00, 0xd7, 0x00, 0x04, 0x00, 0xd8, 0x00, 0xd8, \n\t0x00, 0x00, 0x00, 0xd9, 0x00, 0xd9, 0x00, 0x04, 0x00, 0xda, 0x00, 0xda, \n\t0x00, 0x00, 0x00, 0xdb, 0x00, 0xdb, 0x00, 0x04, 0x00, 0xdc, 0x00, 0xdc, \n\t0x00, 0x00, 0x00, 0xdd, 0x00, 0xdd, 0x00, 0x04, 0x00, 0xde, 0x00, 0xde, \n\t0x00, 0x13, 0x00, 0xdf, 0x00, 0xdf, 0x00, 0x04, 0x00, 0xe0, 0x00, 0xe0, \n\t0x00, 0x13, 0x00, 0xe1, 0x00, 0xe1, 0x00, 0x04, 0x00, 0xe2, 0x00, 0xe2, \n\t0x00, 0x13, 0x00, 0xe3, 0x00, 0xe3, 0x00, 0x04, 0x00, 0xe4, 0x00, 0xe4, \n\t0x00, 0x13, 0x00, 0xe5, 0x00, 0xe5, 0x00, 0x04, 0x00, 0xe6, 0x00, 0xf5, \n\t0x00, 0x00, 0x00, 0xf6, 0x00, 0xf6, 0x00, 0x1b, 0x00, 0xf7, 0x01, 0x05, \n\t0x00, 0x00, 0x01, 0x06, 0x01, 0x06, 0x00, 0x05, 0x01, 0x07, 0x01, 0x07, \n\t0x00, 0x00, 0x01, 0x08, 0x01, 0x08, 0x00, 0x05, 0x01, 0x09, 0x01, 0x09, \n\t0x00, 0x00, 0x01, 0x0a, 0x01, 0x0b, 0x00, 0x05, 0x01, 0x0c, 0x01, 0x0d, \n\t0x00, 0x00, 0x01, 0x0e, 0x01, 0x0e, 0x00, 0x13, 0x01, 0x0f, 0x01, 0x0f, \n\t0x00, 0x06, 0x01, 0x10, 0x01, 0x10, 0x00, 0x13, 0x01, 0x11, 0x01, 0x11, \n\t0x00, 0x06, 0x01, 0x12, 0x01, 0x12, 0x00, 0x13, 0x01, 0x13, 0x01, 0x13, \n\t0x00, 0x06, 0x01, 0x14, 0x01, 0x14, 0x00, 0x13, 0x01, 0x15, 0x01, 0x15, \n\t0x00, 0x04, 0x01, 0x16, 0x01, 0x1b, 0x00, 0x00, 0x01, 0x1c, 0x01, 0x1c, \n\t0x00, 0x18, 0x01, 0x1d, 0x01, 0x1d, 0x00, 0x07, 0x01, 0x1e, 0x01, 0x1e, \n\t0x00, 0x18, 0x01, 0x1f, 0x01, 0x1f, 0x00, 0x07, 0x01, 0x20, 0x01, 0x20, \n\t0x00, 0x18, 0x01, 0x21, 0x01, 0x21, 0x00, 0x07, 0x01, 0x22, 0x01, 0x22, \n\t0x00, 0x18, 0x01, 0x23, 0x01, 0x23, 0x00, 0x07, 0x01, 0x24, 0x01, 0x24, \n\t0x00, 0x08, 0x01, 0x25, 0x01, 0x25, 0x00, 0x00, 0x01, 0x26, 0x01, 0x26, \n\t0x00, 0x08, 0x01, 0x27, 0x01, 0x29, 0x00, 0x00, 0x01, 0x2a, 0x01, 0x2a, \n\t0x00, 0x15, 0x01, 0x2b, 0x01, 0x2b, 0x00, 0x10, 0x01, 0x2c, 0x01, 0x2c, \n\t0x00, 0x15, 0x01, 0x2d, 0x01, 0x2d, 0x00, 0x10, 0x01, 0x2e, 0x01, 0x2e, \n\t0x00, 0x15, 0x01, 0x2f, 0x01, 0x2f, 0x00, 0x10, 0x01, 0x30, 0x01, 0x30, \n\t0x00, 0x15, 0x01, 0x31, 0x01, 0x31, 0x00, 0x10, 0x01, 0x32, 0x01, 0x32, \n\t0x00, 0x15, 0x01, 0x33, 0x01, 0x33, 0x00, 0x10, 0x01, 0x34, 0x01, 0x34, \n\t0x00, 0x15, 0x01, 0x35, 0x01, 0x35, 0x00, 0x10, 0x01, 0x36, 0x01, 0x36, \n\t0x00, 0x16, 0x01, 0x37, 0x01, 0x37, 0x00, 0x00, 0x01, 0x38, 0x01, 0x38, \n\t0x00, 0x0a, 0x01, 0x39, 0x01, 0x39, 0x00, 0x11, 0x01, 0x3a, 0x01, 0x3a, \n\t0x00, 0x0a, 0x01, 0x3b, 0x01, 0x3b, 0x00, 0x0e, 0x01, 0x3c, 0x01, 0x3c, \n\t0x00, 0x1a, 0x01, 0x3d, 0x01, 0x3d, 0x00, 0x0e, 0x01, 0x3e, 0x01, 0x3e, \n\t0x00, 0x1a, 0x01, 0x3f, 0x01, 0x3f, 0x00, 0x0e, 0x01, 0x40, 0x01, 0x40, \n\t0x00, 0x1a, 0x01, 0x41, 0x01, 0x42, 0x00, 0x00, 0x01, 0x43, 0x01, 0x43, \n\t0x00, 0x13, 0x01, 0x44, 0x01, 0x44, 0x00, 0x04, 0x01, 0x45, 0x01, 0x45, \n\t0x00, 0x00, 0x01, 0x46, 0x01, 0x46, 0x00, 0x10, 0x01, 0x47, 0x01, 0x47, \n\t0x00, 0x00, 0x01, 0x48, 0x01, 0x48, 0x00, 0x02, 0x01, 0x49, 0x01, 0x49, \n\t0x00, 0x03, 0x01, 0x4a, 0x01, 0x4b, 0x00, 0x00, 0x01, 0x4c, 0x01, 0x4c, \n\t0x00, 0x13, 0x01, 0x4d, 0x01, 0x4d, 0x00, 0x00, 0x01, 0x4e, 0x01, 0x4e, \n\t0x00, 0x18, 0x01, 0x4f, 0x01, 0x4f, 0x00, 0x07, 0x01, 0x50, 0x01, 0x50, \n\t0x00, 0x00, 0x01, 0x51, 0x01, 0x51, 0x00, 0x01, 0x01, 0x52, 0x01, 0x62, \n\t0x00, 0x00, 0x01, 0x63, 0x01, 0x63, 0x00, 0x02, 0x01, 0x64, 0x01, 0x67, \n\t0x00, 0x00, 0x01, 0x68, 0x01, 0x68, 0x00, 0x13, 0x01, 0x69, 0x01, 0x69, \n\t0x00, 0x0a, 0x01, 0x6a, 0x01, 0x6b, 0x00, 0x00, 0x01, 0x6c, 0x01, 0x6c, \n\t0x00, 0x02, 0x01, 0x6d, 0x01, 0x6e, 0x00, 0x00, 0x01, 0x6f, 0x01, 0x6f, \n\t0x00, 0x02, 0x01, 0x70, 0x01, 0x70, 0x00, 0x00, 0x01, 0x71, 0x01, 0x71, \n\t0x00, 0x0e, 0x01, 0x72, 0x01, 0x72, 0x00, 0x00, 0x01, 0x73, 0x01, 0x73, \n\t0x00, 0x13, 0x01, 0x74, 0x01, 0x75, 0x00, 0x00, 0x01, 0x76, 0x01, 0x76, \n\t0x00, 0x02, 0x01, 0x77, 0x01, 0x79, 0x00, 0x00, 0x01, 0x7a, 0x01, 0x7a, \n\t0x00, 0x13, 0x01, 0x7b, 0x01, 0x7e, 0x00, 0x00, 0x01, 0x7f, 0x01, 0x7f, \n\t0x00, 0x0a, 0x01, 0x80, 0x01, 0x80, 0x00, 0x00, 0x01, 0x81, 0x01, 0x81, \n\t0x00, 0x0d, 0x01, 0x82, 0x01, 0x84, 0x00, 0x00, 0x01, 0x85, 0x01, 0x85, \n\t0x00, 0x0a, 0x01, 0x86, 0x01, 0x86, 0x00, 0x04, 0x01, 0x87, 0x01, 0x87, \n\t0x00, 0x00, 0x01, 0x88, 0x01, 0x88, 0x00, 0x05, 0x01, 0x89, 0x01, 0x89, \n\t0x00, 0x00, 0x01, 0x8a, 0x01, 0x8a, 0x00, 0x10, 0x01, 0x8b, 0x01, 0x8b, \n\t0x00, 0x04, 0x01, 0x8c, 0x01, 0x8c, 0x00, 0x00, 0x01, 0x8d, 0x01, 0x8d, \n\t0x00, 0x11, 0x01, 0x8e, 0x01, 0x90, 0x00, 0x00, 0x01, 0x91, 0x01, 0x91, \n\t0x00, 0x05, 0x01, 0x92, 0x01, 0x96, 0x00, 0x00, 0x01, 0x97, 0x01, 0x97, \n\t0x00, 0x11, 0x01, 0x98, 0x01, 0x98, 0x00, 0x00, 0x01, 0x99, 0x01, 0x99, \n\t0x00, 0x06, 0x01, 0x9a, 0x01, 0x9b, 0x00, 0x00, 0x01, 0x9c, 0x01, 0x9d, \n\t0x00, 0x04, 0x01, 0x9e, 0x01, 0x9e, 0x00, 0x00, 0x01, 0x9f, 0x01, 0x9f, \n\t0x00, 0x10, 0x01, 0xa0, 0x01, 0xa4, 0x00, 0x00, 0x01, 0xa5, 0x01, 0xa5, \n\t0x00, 0x10, 0x01, 0xa6, 0x01, 0xa6, 0x00, 0x06, 0x01, 0xa7, 0x01, 0xa7, \n\t0x00, 0x10, 0x01, 0xa8, 0x01, 0xae, 0x00, 0x00, 0x01, 0xaf, 0x01, 0xaf, \n\t0x00, 0x13, 0x01, 0xb0, 0x01, 0xb2, 0x00, 0x00, 0x01, 0xb3, 0x01, 0xb3, \n\t0x00, 0x1b, 0x01, 0xb4, 0x01, 0xb4, 0x00, 0x0f, 0x01, 0xb5, 0x01, 0xb7, \n\t0x00, 0x00, 0x01, 0xb8, 0x01, 0xb8, 0x00, 0x0b, 0x01, 0xb9, 0x01, 0xb9, \n\t0x00, 0x00, 0x01, 0xba, 0x01, 0xba, 0x00, 0x02, 0x01, 0xbb, 0x01, 0xc2, \n\t0x00, 0x00, 0x01, 0xc3, 0x01, 0xc3, 0x00, 0x0f, 0x01, 0xc4, 0x01, 0xc5, \n\t0x00, 0x00, 0x01, 0xc6, 0x01, 0xc6, 0x00, 0x13, 0x01, 0xc7, 0x01, 0xc8, \n\t0x00, 0x00, 0x01, 0xc9, 0x01, 0xc9, 0x00, 0x13, 0x01, 0xca, 0x01, 0xca, \n\t0x00, 0x08, 0x01, 0xcb, 0x01, 0xcb, 0x00, 0x0d, 0x01, 0xcc, 0x01, 0xcc, \n\t0x00, 0x00, 0x01, 0xcd, 0x01, 0xcd, 0x00, 0x1c, 0x01, 0xce, 0x01, 0xd0, \n\t0x00, 0x00, 0x01, 0xd1, 0x01, 0xd1, 0x00, 0x03, 0x01, 0xd2, 0x01, 0xd2, \n\t0x00, 0x00, 0x01, 0xd3, 0x01, 0xd3, 0x00, 0x05, 0x01, 0xd4, 0x01, 0xd4, \n\t0x00, 0x04, 0x01, 0xd5, 0x01, 0xd7, 0x00, 0x05, 0x01, 0xd8, 0x01, 0xd8, \n\t0x00, 0x17, 0x01, 0xd9, 0x01, 0xda, 0x00, 0x05, 0x01, 0xdb, 0x01, 0xdb, \n\t0x00, 0x06, 0x01, 0xdc, 0x01, 0xdd, 0x00, 0x05, 0x01, 0xde, 0x01, 0xde, \n\t0x00, 0x04, 0x01, 0xdf, 0x01, 0xdf, 0x00, 0x00, 0x01, 0xe0, 0x01, 0xe0, \n\t0x00, 0x11, 0x01, 0xe1, 0x01, 0xe1, 0x00, 0x19, 0x01, 0xe2, 0x01, 0xe2, \n\t0x00, 0x05, 0x01, 0xe3, 0x01, 0xe3, 0x00, 0x14, 0x01, 0xe4, 0x01, 0xe5, \n\t0x00, 0x05, 0x01, 0xe6, 0x01, 0xe6, 0x00, 0x00, 0x01, 0xe7, 0x01, 0xe7, \n\t0x00, 0x05, 0x01, 0xe8, 0x01, 0xe8, 0x00, 0x00, 0x01, 0xe9, 0x01, 0xe9, \n\t0x00, 0x05, 0x01, 0xea, 0x01, 0xea, 0x00, 0x00, 0x01, 0xeb, 0x01, 0xec, \n\t0x00, 0x04, 0x01, 0xed, 0x01, 0xed, 0x00, 0x00, 0x01, 0xee, 0x01, 0xee, \n\t0x00, 0x05, 0x01, 0xef, 0x01, 0xef, 0x00, 0x04, 0x01, 0xf0, 0x01, 0xf0, \n\t0x00, 0x07, 0x01, 0xf1, 0x01, 0xf3, 0x00, 0x00, 0x01, 0xf4, 0x01, 0xf4, \n\t0x00, 0x17, 0x01, 0xf5, 0x01, 0xf5, 0x00, 0x05, 0x01, 0xf6, 0x01, 0xf6, \n\t0x00, 0x00, 0x01, 0xf7, 0x01, 0xf8, 0x00, 0x05, 0x01, 0xf9, 0x01, 0xf9, \n\t0x00, 0x11, 0x01, 0xfa, 0x01, 0xfb, 0x00, 0x00, 0x01, 0xfc, 0x01, 0xfc, \n\t0x00, 0x02, 0x01, 0xfd, 0x02, 0x07, 0x00, 0x00, 0x02, 0x08, 0x02, 0x09, \n\t0x00, 0x11, 0x02, 0x0a, 0x02, 0x0a, 0x00, 0x13, 0x02, 0x0b, 0x02, 0x0b, \n\t0x00, 0x04, 0x02, 0x0c, 0x02, 0x0c, 0x00, 0x13, 0x02, 0x0d, 0x02, 0x0d, \n\t0x00, 0x00, 0x02, 0x0e, 0x02, 0x0e, 0x00, 0x13, 0x02, 0x0f, 0x02, 0x0f, \n\t0x00, 0x04, 0x02, 0x10, 0x02, 0x17, 0x00, 0x00, 0x02, 0x18, 0x02, 0x18, \n\t0x00, 0x05, 0x02, 0x19, 0x02, 0x1e, 0x00, 0x00, 0x02, 0x1f, 0x02, 0x1f, \n\t0x00, 0x05, 0x02, 0x20, 0x02, 0x24, 0x00, 0x00, 0x02, 0x25, 0x02, 0x25, \n\t0x00, 0x05, 0x02, 0x26, 0x02, 0x26, 0x00, 0x00, 0x02, 0x27, 0x02, 0x27, \n\t0x00, 0x05, 0x02, 0x28, 0x02, 0x28, 0x00, 0x08, 0x02, 0x29, 0x02, 0x29, \n\t0x00, 0x00, 0x02, 0x2a, 0x02, 0x2a, 0x00, 0x0a, 0x02, 0x2b, 0x02, 0x2b, \n\t0x00, 0x11, 0x02, 0x2c, 0x02, 0x2c, 0x00, 0x0a, 0x02, 0x2d, 0x02, 0x2d, \n\t0x00, 0x00, 0x02, 0x2e, 0x02, 0x2e, 0x00, 0x0d, 0x02, 0x2f, 0x02, 0x2f, \n\t0x00, 0x19, 0x02, 0x30, 0x02, 0x30, 0x00, 0x08, 0x02, 0x31, 0x02, 0x31, \n\t0x00, 0x00, 0x02, 0x32, 0x02, 0x32, 0x00, 0x1c, 0x02, 0x33, 0x02, 0x33, \n\t0x00, 0x14, 0x02, 0x34, 0x02, 0x3a, 0x00, 0x00, 0x02, 0x3b, 0x02, 0x3b, \n\t0x00, 0x0f, 0x02, 0x3c, 0x02, 0x3c, 0x00, 0x17, 0x02, 0x3d, 0x02, 0x3d, \n\t0x00, 0x00, 0x02, 0x3e, 0x02, 0x3e, 0x00, 0x05, 0x02, 0x3f, 0x02, 0x3f, \n\t0x00, 0x00, 0x02, 0x40, 0x02, 0x40, 0x00, 0x05, 0x02, 0x41, 0x02, 0x41, \n\t0x00, 0x1c, 0x02, 0x42, 0x02, 0x42, 0x00, 0x14, 0x02, 0x43, 0x02, 0x43, \n\t0x00, 0x00, 0x02, 0x44, 0x02, 0x44, 0x00, 0x05, 0x02, 0x45, 0x02, 0x45, \n\t0x00, 0x00, 0x02, 0x46, 0x02, 0x46, 0x00, 0x02, 0x02, 0x47, 0x02, 0x47, \n\t0x00, 0x03, 0x02, 0x48, 0x02, 0x48, 0x00, 0x02, 0x02, 0x49, 0x02, 0x49, \n\t0x00, 0x03, 0x02, 0x4a, 0x02, 0x4c, 0x00, 0x00, 0x02, 0x4d, 0x02, 0x4d, \n\t0x00, 0x04, 0x02, 0x4e, 0x02, 0x4e, 0x00, 0x00, 0x02, 0x4f, 0x02, 0x4f, \n\t0x00, 0x04, 0x02, 0x50, 0x02, 0x50, 0x00, 0x00, 0x02, 0x51, 0x02, 0x51, \n\t0x00, 0x04, 0x02, 0x52, 0x02, 0x52, 0x00, 0x0d, 0x02, 0x53, 0x02, 0x53, \n\t0x00, 0x19, 0x02, 0x54, 0x02, 0x58, 0x00, 0x00, 0x02, 0x59, 0x02, 0x59, \n\t0x00, 0x05, 0x02, 0x5a, 0x02, 0x5a, 0x00, 0x00, 0x02, 0x5b, 0x02, 0x5b, \n\t0x00, 0x05, 0x02, 0x5c, 0x02, 0x5c, 0x00, 0x13, 0x02, 0x5d, 0x02, 0x5d, \n\t0x00, 0x06, 0x02, 0x5e, 0x02, 0x5f, 0x00, 0x00, 0x02, 0x60, 0x02, 0x62, \n\t0x00, 0x11, 0x02, 0x63, 0x02, 0x63, 0x00, 0x1c, 0x02, 0x64, 0x02, 0x64, \n\t0x00, 0x14, 0x02, 0x65, 0x02, 0x65, 0x00, 0x00, 0x02, 0x66, 0x02, 0x66, \n\t0x00, 0x05, 0x02, 0x67, 0x02, 0x67, 0x00, 0x00, 0x02, 0x68, 0x02, 0x68, \n\t0x00, 0x05, 0x02, 0x69, 0x02, 0x69, 0x00, 0x00, 0x02, 0x6a, 0x02, 0x6a, \n\t0x00, 0x05, 0x02, 0x6b, 0x02, 0x6b, 0x00, 0x0d, 0x02, 0x6c, 0x02, 0x6c, \n\t0x00, 0x19, 0x02, 0x6d, 0x02, 0x6f, 0x00, 0x00, 0x02, 0x70, 0x02, 0x72, \n\t0x00, 0x04, 0x02, 0x73, 0x02, 0x76, 0x00, 0x00, 0x02, 0x77, 0x02, 0x77, \n\t0x00, 0x0f, 0x02, 0x78, 0x02, 0x7a, 0x00, 0x00, 0x02, 0x7b, 0x02, 0x7b, \n\t0x00, 0x13, 0x02, 0x7c, 0x02, 0x7c, 0x00, 0x04, 0x02, 0x7d, 0x02, 0x80, \n\t0x00, 0x00, 0x02, 0x81, 0x02, 0x81, 0x00, 0x0f, 0x02, 0x82, 0x02, 0x82, \n\t0x00, 0x17, 0x02, 0x83, 0x02, 0x83, 0x00, 0x02, 0x02, 0x84, 0x02, 0x84, \n\t0x00, 0x03, 0x02, 0x85, 0x02, 0x85, 0x00, 0x00, 0x02, 0x86, 0x02, 0x86, \n\t0x00, 0x05, 0x02, 0x87, 0x02, 0x87, 0x00, 0x16, 0x02, 0x88, 0x02, 0x88, \n\t0x00, 0x00, 0x02, 0x89, 0x02, 0x89, 0x00, 0x16, 0x02, 0x8a, 0x02, 0x8a, \n\t0x00, 0x00, 0x02, 0x8b, 0x02, 0x8b, 0x00, 0x16, 0x02, 0x8c, 0x02, 0x8c, \n\t0x00, 0x00, 0x02, 0x8d, 0x02, 0x8d, 0x00, 0x02, 0x02, 0x8e, 0x02, 0x8e, \n\t0x00, 0x03, 0x02, 0x8f, 0x02, 0x8f, 0x00, 0x02, 0x02, 0x90, 0x02, 0x90, \n\t0x00, 0x03, 0x02, 0x91, 0x02, 0x91, 0x00, 0x02, 0x02, 0x92, 0x02, 0x92, \n\t0x00, 0x03, 0x02, 0x93, 0x02, 0x93, 0x00, 0x02, 0x02, 0x94, 0x02, 0x94, \n\t0x00, 0x03, 0x02, 0x95, 0x02, 0x95, 0x00, 0x02, 0x02, 0x96, 0x02, 0x96, \n\t0x00, 0x03, 0x02, 0x97, 0x02, 0x97, 0x00, 0x02, 0x02, 0x98, 0x02, 0x98, \n\t0x00, 0x03, 0x02, 0x99, 0x02, 0x99, 0x00, 0x02, 0x02, 0x9a, 0x02, 0x9a, \n\t0x00, 0x03, 0x02, 0x9b, 0x02, 0x9b, 0x00, 0x02, 0x02, 0x9c, 0x02, 0x9c, \n\t0x00, 0x03, 0x02, 0x9d, 0x02, 0x9d, 0x00, 0x02, 0x02, 0x9e, 0x02, 0x9e, \n\t0x00, 0x03, 0x02, 0x9f, 0x02, 0x9f, 0x00, 0x02, 0x02, 0xa0, 0x02, 0xa0, \n\t0x00, 0x03, 0x02, 0xa1, 0x02, 0xa1, 0x00, 0x02, 0x02, 0xa2, 0x02, 0xa2, \n\t0x00, 0x03, 0x02, 0xa3, 0x02, 0xa3, 0x00, 0x02, 0x02, 0xa4, 0x02, 0xa4, \n\t0x00, 0x03, 0x02, 0xa5, 0x02, 0xa5, 0x00, 0x00, 0x02, 0xa6, 0x02, 0xa6, \n\t0x00, 0x04, 0x02, 0xa7, 0x02, 0xa7, 0x00, 0x00, 0x02, 0xa8, 0x02, 0xa8, \n\t0x00, 0x04, 0x02, 0xa9, 0x02, 0xa9, 0x00, 0x00, 0x02, 0xaa, 0x02, 0xaa, \n\t0x00, 0x04, 0x02, 0xab, 0x02, 0xab, 0x00, 0x00, 0x02, 0xac, 0x02, 0xac, \n\t0x00, 0x04, 0x02, 0xad, 0x02, 0xad, 0x00, 0x00, 0x02, 0xae, 0x02, 0xae, \n\t0x00, 0x04, 0x02, 0xaf, 0x02, 0xaf, 0x00, 0x00, 0x02, 0xb0, 0x02, 0xb0, \n\t0x00, 0x04, 0x02, 0xb1, 0x02, 0xb1, 0x00, 0x00, 0x02, 0xb2, 0x02, 0xb2, \n\t0x00, 0x04, 0x02, 0xb3, 0x02, 0xb3, 0x00, 0x00, 0x02, 0xb4, 0x02, 0xb4, \n\t0x00, 0x04, 0x02, 0xb5, 0x02, 0xb8, 0x00, 0x00, 0x02, 0xb9, 0x02, 0xb9, \n\t0x00, 0x13, 0x02, 0xba, 0x02, 0xba, 0x00, 0x06, 0x02, 0xbb, 0x02, 0xbb, \n\t0x00, 0x13, 0x02, 0xbc, 0x02, 0xbc, 0x00, 0x06, 0x02, 0xbd, 0x02, 0xbd, \n\t0x00, 0x13, 0x02, 0xbe, 0x02, 0xbe, 0x00, 0x06, 0x02, 0xbf, 0x02, 0xbf, \n\t0x00, 0x13, 0x02, 0xc0, 0x02, 0xc0, 0x00, 0x06, 0x02, 0xc1, 0x02, 0xc1, \n\t0x00, 0x13, 0x02, 0xc2, 0x02, 0xc2, 0x00, 0x06, 0x02, 0xc3, 0x02, 0xc3, \n\t0x00, 0x13, 0x02, 0xc4, 0x02, 0xc4, 0x00, 0x06, 0x02, 0xc5, 0x02, 0xc5, \n\t0x00, 0x13, 0x02, 0xc6, 0x02, 0xc6, 0x00, 0x06, 0x02, 0xc7, 0x02, 0xc7, \n\t0x00, 0x13, 0x02, 0xc8, 0x02, 0xc8, 0x00, 0x04, 0x02, 0xc9, 0x02, 0xc9, \n\t0x00, 0x13, 0x02, 0xca, 0x02, 0xca, 0x00, 0x04, 0x02, 0xcb, 0x02, 0xcb, \n\t0x00, 0x13, 0x02, 0xcc, 0x02, 0xcc, 0x00, 0x04, 0x02, 0xcd, 0x02, 0xcd, \n\t0x00, 0x13, 0x02, 0xce, 0x02, 0xce, 0x00, 0x06, 0x02, 0xcf, 0x02, 0xcf, \n\t0x00, 0x13, 0x02, 0xd0, 0x02, 0xd0, 0x00, 0x04, 0x02, 0xd1, 0x02, 0xd1, \n\t0x00, 0x15, 0x02, 0xd2, 0x02, 0xd2, 0x00, 0x10, 0x02, 0xd3, 0x02, 0xd3, \n\t0x00, 0x15, 0x02, 0xd4, 0x02, 0xd4, 0x00, 0x10, 0x02, 0xd5, 0x02, 0xd5, \n\t0x00, 0x00, 0x02, 0xd6, 0x02, 0xd6, 0x00, 0x10, 0x02, 0xd7, 0x02, 0xd7, \n\t0x00, 0x00, 0x02, 0xd8, 0x02, 0xd8, 0x00, 0x10, 0x02, 0xd9, 0x02, 0xd9, \n\t0x00, 0x00, 0x02, 0xda, 0x02, 0xda, 0x00, 0x10, 0x02, 0xdb, 0x02, 0xdb, \n\t0x00, 0x00, 0x02, 0xdc, 0x02, 0xdc, 0x00, 0x10, 0x02, 0xdd, 0x02, 0xdd, \n\t0x00, 0x00, 0x02, 0xde, 0x02, 0xde, 0x00, 0x10, 0x02, 0xdf, 0x02, 0xdf, \n\t0x00, 0x0a, 0x02, 0xe0, 0x02, 0xe0, 0x00, 0x11, 0x02, 0xe1, 0x02, 0xe1, \n\t0x00, 0x0a, 0x02, 0xe2, 0x02, 0xe2, 0x00, 0x11, 0x02, 0xe3, 0x02, 0xe3, \n\t0x00, 0x0a, 0x02, 0xe4, 0x02, 0xe4, 0x00, 0x11, 0x02, 0xe5, 0x02, 0xe5, \n\t0x00, 0x0a, 0x02, 0xe6, 0x02, 0xe6, 0x00, 0x11, 0x02, 0xe7, 0x02, 0xe7, \n\t0x00, 0x13, 0x02, 0xe8, 0x02, 0xf3, 0x00, 0x00, 0x02, 0xf4, 0x02, 0xf6, \n\t0x00, 0x12, 0x02, 0xf7, 0x02, 0xf7, 0x00, 0x00, 0x02, 0xf8, 0x02, 0xf9, \n\t0x00, 0x01, 0x02, 0xfa, 0x02, 0xfa, 0x00, 0x0c, 0x02, 0xfb, 0x02, 0xfd, \n\t0x00, 0x01, 0x02, 0xfe, 0x02, 0xfe, 0x00, 0x0c, 0x02, 0xff, 0x03, 0x01, \n\t0x00, 0x00, 0x03, 0x02, 0x03, 0x03, 0x00, 0x0c, 0x03, 0x04, 0x03, 0x04, \n\t0x00, 0x00, 0x03, 0x05, 0x03, 0x06, 0x00, 0x01, 0x03, 0x07, 0x03, 0xce, \n\t0x00, 0x00, 0x03, 0xcf, 0x03, 0xd0, 0x00, 0x08, 0x03, 0xd1, 0x03, 0xd1, \n\t0x00, 0x00, 0x03, 0xd2, 0x03, 0xd2, 0x00, 0x0d, 0x03, 0xd3, 0x03, 0xd3, \n\t0x00, 0x0b, 0x03, 0xd4, 0x03, 0xdb, 0x00, 0x00, 0x03, 0xdc, 0x03, 0xdc, \n\t0x00, 0x19, 0x03, 0xdd, 0x03, 0xdd, 0x00, 0x00, 0x03, 0xde, 0x03, 0xde, \n\t0x00, 0x04, 0x03, 0xdf, 0x03, 0xdf, 0x00, 0x00, 0x03, 0xe0, 0x03, 0xe0, \n\t0x00, 0x13, 0x03, 0xe1, 0x03, 0xe4, 0x00, 0x00, 0x03, 0xe5, 0x03, 0xe5, \n\t0x00, 0x13, 0x03, 0xe6, 0x03, 0xe6, 0x00, 0x06, 0x03, 0xe7, 0x03, 0xe8, \n\t0x00, 0x09, 0x03, 0xe9, 0x03, 0xe9, 0x00, 0x13, 0x03, 0xea, 0x03, 0xea, \n\t0x00, 0x04, 0x03, 0xeb, 0x03, 0xeb, 0x00, 0x13, 0x03, 0xec, 0x03, 0xf1, \n\t0x00, 0x00, 0x03, 0xf2, 0x03, 0xf2, 0x00, 0x0d, 0x03, 0xf3, 0x03, 0xf3, \n\t0x00, 0x19, 0x03, 0xf4, 0x03, 0xf5, 0x00, 0x00, 0x03, 0xf6, 0x03, 0xf6, \n\t0x00, 0x08, 0x03, 0xf7, 0x03, 0xf9, 0x00, 0x00, 0x03, 0xfa, 0x03, 0xfa, \n\t0x00, 0x13, 0x03, 0xfb, 0x03, 0xfb, 0x00, 0x04, 0x03, 0xfc, 0x03, 0xfc, \n\t0x00, 0x13, 0x03, 0xfd, 0x03, 0xfd, 0x00, 0x04, 0x03, 0xfe, 0x03, 0xff, \n\t0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x0d, 0x04, 0x01, 0x04, 0x01, \n\t0x00, 0x19, 0x04, 0x02, 0x04, 0x03, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, \n\t0x00, 0x13, 0x04, 0x05, 0x04, 0x05, 0x00, 0x04, 0x04, 0x06, 0x04, 0x06, \n\t0x00, 0x13, 0x04, 0x07, 0x04, 0x07, 0x00, 0x06, 0x04, 0x08, 0x04, 0x0a, \n\t0x00, 0x0b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x36, \n\t0x00, 0x6e, 0x00, 0x02, 0x44, 0x46, 0x4c, 0x54, 0x00, 0x0e, 0x6c, 0x61, \n\t0x74, 0x6e, 0x00, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, \n\t0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, \n\t0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x01, 0x00, 0x05, \n\t0x61, 0x61, 0x6c, 0x74, 0x00, 0x20, 0x61, 0x61, 0x6c, 0x74, 0x00, 0x20, \n\t0x6c, 0x69, 0x67, 0x61, 0x00, 0x26, 0x6c, 0x6e, 0x75, 0x6d, 0x00, 0x2c, \n\t0x73, 0x6d, 0x63, 0x70, 0x00, 0x32, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, \n\t0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x04, 0x00, 0x0a, 0x02, 0x5a, \n\t0x04, 0x90, 0x04, 0xb0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, \n\t0x00, 0x02, 0x01, 0xd2, 0x00, 0xe6, 0x03, 0x43, 0x03, 0x61, 0x03, 0x62, \n\t0x03, 0x63, 0x03, 0x64, 0x03, 0x65, 0x03, 0x66, 0x03, 0x67, 0x03, 0x68, \n\t0x03, 0x69, 0x03, 0x55, 0x03, 0x52, 0x03, 0x51, 0x03, 0x50, 0x03, 0x4f, \n\t0x03, 0x4e, 0x03, 0x4d, 0x03, 0x4c, 0x03, 0x4b, 0x03, 0x4a, 0x03, 0x49, \n\t0x03, 0x48, 0x03, 0x47, 0x03, 0x45, 0x03, 0x44, 0x03, 0x6a, 0x03, 0x42, \n\t0x03, 0x41, 0x03, 0x40, 0x03, 0x3f, 0x03, 0x3e, 0x03, 0x3d, 0x03, 0x3c, \n\t0x03, 0x3b, 0x03, 0x3a, 0x03, 0x39, 0x03, 0x55, 0x03, 0x52, 0x03, 0x51, \n\t0x03, 0x50, 0x03, 0x4f, 0x03, 0x4e, 0x03, 0x4d, 0x03, 0x4c, 0x03, 0x4b, \n\t0x03, 0x4a, 0x03, 0x49, 0x03, 0x48, 0x03, 0x47, 0x03, 0x45, 0x03, 0x44, \n\t0x03, 0x6a, 0x03, 0x42, 0x03, 0x41, 0x03, 0x40, 0x03, 0x3f, 0x03, 0x3e, \n\t0x03, 0x3d, 0x03, 0x3c, 0x03, 0x3b, 0x03, 0x3a, 0x03, 0x39, 0x03, 0x7c, \n\t0x03, 0x7d, 0x03, 0x7e, 0x03, 0x7f, 0x03, 0x80, 0x03, 0x81, 0x03, 0x83, \n\t0x03, 0x84, 0x03, 0x85, 0x03, 0x86, 0x03, 0x87, 0x03, 0x88, 0x03, 0x89, \n\t0x03, 0x8a, 0x03, 0x8b, 0x03, 0x7a, 0x03, 0x8c, 0x03, 0x8d, 0x03, 0x8e, \n\t0x03, 0x8f, 0x03, 0x90, 0x03, 0x91, 0x03, 0x92, 0x03, 0x93, 0x03, 0x94, \n\t0x03, 0x95, 0x03, 0x96, 0x03, 0xc7, 0x03, 0x7c, 0x03, 0x7d, 0x03, 0x7e, \n\t0x03, 0x7f, 0x03, 0x80, 0x03, 0x81, 0x03, 0x83, 0x03, 0x84, 0x03, 0x85, \n\t0x03, 0x86, 0x03, 0x87, 0x03, 0x88, 0x03, 0x89, 0x03, 0x8a, 0x03, 0x8b, \n\t0x03, 0x7a, 0x03, 0x8c, 0x03, 0x8d, 0x03, 0x8e, 0x03, 0x8f, 0x03, 0x90, \n\t0x03, 0x91, 0x03, 0x92, 0x03, 0x93, 0x03, 0x94, 0x03, 0x95, 0x03, 0x96, \n\t0x03, 0xcb, 0x03, 0x97, 0x03, 0x97, 0x03, 0x98, 0x03, 0x98, 0x03, 0x99, \n\t0x03, 0x99, 0x03, 0x9a, 0x03, 0x9a, 0x03, 0x9b, 0x03, 0x9b, 0x03, 0x9d, \n\t0x03, 0x9d, 0x03, 0x9e, 0x03, 0x9e, 0x03, 0x79, 0x03, 0x79, 0x03, 0x9f, \n\t0x03, 0x9f, 0x03, 0xa0, 0x03, 0xa0, 0x03, 0xa1, 0x03, 0xa1, 0x03, 0xa2, \n\t0x03, 0xa2, 0x03, 0xa3, 0x03, 0xa3, 0x03, 0xa4, 0x03, 0xa4, 0x03, 0xa5, \n\t0x03, 0xa5, 0x03, 0xa7, 0x03, 0xa7, 0x03, 0xa8, 0x03, 0xa8, 0x03, 0xa9, \n\t0x03, 0xa9, 0x03, 0x2f, 0x03, 0x2f, 0x03, 0xab, 0x03, 0xab, 0x03, 0xac, \n\t0x03, 0xac, 0x03, 0xad, 0x03, 0xae, 0x03, 0xae, 0x03, 0xaf, 0x03, 0xaf, \n\t0x03, 0xb0, 0x03, 0xb0, 0x03, 0xb1, 0x03, 0xb1, 0x03, 0xb2, 0x03, 0xb2, \n\t0x03, 0xb3, 0x03, 0xb3, 0x03, 0xb4, 0x03, 0xb4, 0x03, 0xb5, 0x03, 0xb5, \n\t0x03, 0xb6, 0x03, 0xb6, 0x03, 0xb7, 0x03, 0xb7, 0x03, 0xb8, 0x03, 0xb8, \n\t0x03, 0xb9, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xba, 0x03, 0xbb, 0x03, 0xbb, \n\t0x03, 0xbc, 0x03, 0xbc, 0x03, 0xbd, 0x03, 0xbd, 0x03, 0xbe, 0x03, 0xbe, \n\t0x03, 0xbf, 0x03, 0xbf, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc1, 0x03, 0xc1, \n\t0x03, 0xc2, 0x03, 0xc2, 0x03, 0x7b, 0x03, 0x7b, 0x03, 0xc3, 0x03, 0xc3, \n\t0x03, 0xc4, 0x03, 0xc4, 0x03, 0xc5, 0x03, 0xc5, 0x03, 0xc6, 0x03, 0xc6, \n\t0x03, 0xaa, 0x03, 0xaa, 0x03, 0xce, 0x03, 0xce, 0x03, 0xcd, 0x03, 0xcd, \n\t0x03, 0xcc, 0x03, 0xcc, 0x03, 0xcb, 0x03, 0xca, 0x03, 0xca, 0x03, 0xc9, \n\t0x03, 0xc9, 0x03, 0xc8, 0x03, 0xc8, 0x03, 0x82, 0x03, 0x82, 0x00, 0x02, \n\t0x00, 0x13, 0x00, 0x13, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x24, 0x00, 0x3d, \n\t0x00, 0x0a, 0x00, 0x44, 0x00, 0x5d, 0x00, 0x24, 0x00, 0x82, 0x00, 0x87, \n\t0x00, 0x3e, 0x00, 0x89, 0x00, 0x98, 0x00, 0x44, 0x00, 0x9b, 0x00, 0x9f, \n\t0x00, 0x54, 0x00, 0xa1, 0x00, 0xa7, 0x00, 0x59, 0x00, 0xa9, 0x00, 0xb8, \n\t0x00, 0x60, 0x00, 0xbb, 0x00, 0xbf, 0x00, 0x70, 0x00, 0xc1, 0x00, 0xcb, \n\t0x00, 0x75, 0x00, 0xce, 0x00, 0xe1, 0x00, 0x80, 0x00, 0xe4, 0x00, 0xe7, \n\t0x00, 0x94, 0x00, 0xea, 0x00, 0xf2, 0x00, 0x98, 0x00, 0xf6, 0x00, 0xf9, \n\t0x00, 0xa1, 0x00, 0xfb, 0x01, 0x02, 0x00, 0xa5, 0x01, 0x05, 0x01, 0x0a, \n\t0x00, 0xad, 0x01, 0x0e, 0x01, 0x13, 0x00, 0xb3, 0x01, 0x16, 0x01, 0x40, \n\t0x00, 0xb9, 0x01, 0x48, 0x01, 0x49, 0x00, 0xe4, 0x00, 0x01, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x01, 0xbe, 0x00, 0xdc, 0x03, 0x55, \n\t0x03, 0x52, 0x03, 0x51, 0x03, 0x50, 0x03, 0x4f, 0x03, 0x4e, 0x03, 0x4d, \n\t0x03, 0x4c, 0x03, 0x4b, 0x03, 0x4a, 0x03, 0x49, 0x03, 0x48, 0x03, 0x47, \n\t0x03, 0x45, 0x03, 0x44, 0x03, 0x6a, 0x03, 0x42, 0x03, 0x41, 0x03, 0x40, \n\t0x03, 0x3f, 0x03, 0x3e, 0x03, 0x3d, 0x03, 0x3c, 0x03, 0x3b, 0x03, 0x3a, \n\t0x03, 0x39, 0x03, 0x55, 0x03, 0x52, 0x03, 0x51, 0x03, 0x50, 0x03, 0x4f, \n\t0x03, 0x4e, 0x03, 0x4d, 0x03, 0x4c, 0x03, 0x4b, 0x03, 0x4a, 0x03, 0x49, \n\t0x03, 0x48, 0x03, 0x47, 0x03, 0x45, 0x03, 0x44, 0x03, 0x6a, 0x03, 0x42, \n\t0x03, 0x41, 0x03, 0x40, 0x03, 0x3f, 0x03, 0x3e, 0x03, 0x3d, 0x03, 0x3c, \n\t0x03, 0x3b, 0x03, 0x3a, 0x03, 0x39, 0x03, 0x7c, 0x03, 0x7d, 0x03, 0x7e, \n\t0x03, 0x7f, 0x03, 0x80, 0x03, 0x81, 0x03, 0x83, 0x03, 0x84, 0x03, 0x85, \n\t0x03, 0x86, 0x03, 0x87, 0x03, 0x88, 0x03, 0x89, 0x03, 0x8a, 0x03, 0x8b, \n\t0x03, 0x7a, 0x03, 0x8c, 0x03, 0x8d, 0x03, 0x8e, 0x03, 0x8f, 0x03, 0x90, \n\t0x03, 0x91, 0x03, 0x92, 0x03, 0x93, 0x03, 0x94, 0x03, 0x95, 0x03, 0x96, \n\t0x03, 0xc7, 0x03, 0x7c, 0x03, 0x7d, 0x03, 0x7e, 0x03, 0x7f, 0x03, 0x80, \n\t0x03, 0x81, 0x03, 0x83, 0x03, 0x84, 0x03, 0x85, 0x03, 0x86, 0x03, 0x87, \n\t0x03, 0x88, 0x03, 0x89, 0x03, 0x8a, 0x03, 0x8b, 0x03, 0x7a, 0x03, 0x8c, \n\t0x03, 0x8d, 0x03, 0x8e, 0x03, 0x8f, 0x03, 0x90, 0x03, 0x91, 0x03, 0x92, \n\t0x03, 0x93, 0x03, 0x94, 0x03, 0x95, 0x03, 0x96, 0x03, 0xcb, 0x03, 0x97, \n\t0x03, 0x97, 0x03, 0x98, 0x03, 0x98, 0x03, 0x99, 0x03, 0x99, 0x03, 0x9a, \n\t0x03, 0x9a, 0x03, 0x9b, 0x03, 0x9b, 0x03, 0x9d, 0x03, 0x9d, 0x03, 0x9e, \n\t0x03, 0x9e, 0x03, 0x79, 0x03, 0x79, 0x03, 0x9f, 0x03, 0x9f, 0x03, 0xa0, \n\t0x03, 0xa0, 0x03, 0xa1, 0x03, 0xa1, 0x03, 0xa2, 0x03, 0xa2, 0x03, 0xa3, \n\t0x03, 0xa3, 0x03, 0xa4, 0x03, 0xa4, 0x03, 0xa5, 0x03, 0xa5, 0x03, 0xa7, \n\t0x03, 0xa7, 0x03, 0xa8, 0x03, 0xa8, 0x03, 0xa9, 0x03, 0xa9, 0x03, 0x2f, \n\t0x03, 0x2f, 0x03, 0xab, 0x03, 0xab, 0x03, 0xac, 0x03, 0xac, 0x03, 0xad, \n\t0x03, 0xae, 0x03, 0xae, 0x03, 0xaf, 0x03, 0xaf, 0x03, 0xb0, 0x03, 0xb0, \n\t0x03, 0xb1, 0x03, 0xb1, 0x03, 0xb2, 0x03, 0xb2, 0x03, 0xb3, 0x03, 0xb3, \n\t0x03, 0xb4, 0x03, 0xb4, 0x03, 0xb5, 0x03, 0xb5, 0x03, 0xb6, 0x03, 0xb6, \n\t0x03, 0xb7, 0x03, 0xb7, 0x03, 0xb8, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0xb9, \n\t0x03, 0xba, 0x03, 0xba, 0x03, 0xbb, 0x03, 0xbb, 0x03, 0xbc, 0x03, 0xbc, \n\t0x03, 0xbd, 0x03, 0xbd, 0x03, 0xbe, 0x03, 0xbe, 0x03, 0xbf, 0x03, 0xbf, \n\t0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc1, 0x03, 0xc1, 0x03, 0xc2, 0x03, 0xc2, \n\t0x03, 0x7b, 0x03, 0x7b, 0x03, 0xc3, 0x03, 0xc3, 0x03, 0xc4, 0x03, 0xc4, \n\t0x03, 0xc5, 0x03, 0xc5, 0x03, 0xc6, 0x03, 0xc6, 0x03, 0xaa, 0x03, 0xaa, \n\t0x03, 0xce, 0x03, 0xce, 0x03, 0xcd, 0x03, 0xcd, 0x03, 0xcc, 0x03, 0xcc, \n\t0x03, 0xcb, 0x03, 0xca, 0x03, 0xca, 0x03, 0xc9, 0x03, 0xc9, 0x03, 0xc8, \n\t0x03, 0xc8, 0x03, 0x82, 0x03, 0x82, 0x00, 0x02, 0x00, 0x12, 0x00, 0x24, \n\t0x00, 0x3d, 0x00, 0x00, 0x00, 0x44, 0x00, 0x5d, 0x00, 0x1a, 0x00, 0x82, \n\t0x00, 0x87, 0x00, 0x34, 0x00, 0x89, 0x00, 0x98, 0x00, 0x3a, 0x00, 0x9b, \n\t0x00, 0x9f, 0x00, 0x4a, 0x00, 0xa1, 0x00, 0xa7, 0x00, 0x4f, 0x00, 0xa9, \n\t0x00, 0xb8, 0x00, 0x56, 0x00, 0xbb, 0x00, 0xbf, 0x00, 0x66, 0x00, 0xc1, \n\t0x00, 0xcb, 0x00, 0x6b, 0x00, 0xce, 0x00, 0xe1, 0x00, 0x76, 0x00, 0xe4, \n\t0x00, 0xe7, 0x00, 0x8a, 0x00, 0xea, 0x00, 0xf2, 0x00, 0x8e, 0x00, 0xf6, \n\t0x00, 0xf9, 0x00, 0x97, 0x00, 0xfb, 0x01, 0x02, 0x00, 0x9b, 0x01, 0x05, \n\t0x01, 0x0a, 0x00, 0xa3, 0x01, 0x0e, 0x01, 0x13, 0x00, 0xa9, 0x01, 0x16, \n\t0x01, 0x40, 0x00, 0xaf, 0x01, 0x48, 0x01, 0x49, 0x00, 0xda, 0x00, 0x04, \n\t0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x12, 0x00, 0x01, \n\t0x00, 0x08, 0x00, 0x01, 0x00, 0x04, 0x03, 0x28, 0x00, 0x02, 0x00, 0x4c, \n\t0x00, 0x01, 0x00, 0x01, 0x00, 0x49, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, \n\t0x00, 0x08, 0x00, 0x02, 0x00, 0x1a, 0x00, 0x0a, 0x03, 0x43, 0x03, 0x61, \n\t0x03, 0x62, 0x03, 0x63, 0x03, 0x64, 0x03, 0x65, 0x03, 0x66, 0x03, 0x67, \n\t0x03, 0x68, 0x03, 0x69, 0x00, 0x02, 0x00, 0x01, 0x00, 0x13, 0x00, 0x1c, \n\t0x00, 0x00, 0x00, 0x00, \n\t0x00\n};\n\nuint32_t igl_roboto_bold_ttf_size = 135820;\n\nuint8_t igl_roboto_regular_ttf[] = {\n\t0x00, 0x01, 0x00, 0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x04, 0x00, 0x10, \n\t0x47, 0x50, 0x4f, 0x53, 0x2a, 0xcb, 0xe6, 0x87, 0x00, 0x01, 0xde, 0xbc, \n\t0x00, 0x00, 0x53, 0xba, 0x47, 0x53, 0x55, 0x42, 0x6e, 0x02, 0x55, 0xa6, \n\t0x00, 0x02, 0x32, 0x78, 0x00, 0x00, 0x05, 0x4a, 0x4c, 0x54, 0x53, 0x48, \n\t0xa6, 0x14, 0xa2, 0x1d, 0x00, 0x00, 0x12, 0x24, 0x00, 0x00, 0x04, 0x0f, \n\t0x4f, 0x53, 0x2f, 0x32, 0xb9, 0xc7, 0x01, 0x3b, 0x00, 0x00, 0x01, 0x98, \n\t0x00, 0x00, 0x00, 0x60, 0x63, 0x6d, 0x61, 0x70, 0x52, 0x7f, 0x37, 0xd3, \n\t0x00, 0x00, 0x16, 0x34, 0x00, 0x00, 0x04, 0x54, 0x63, 0x76, 0x74, 0x20, \n\t0x1e, 0xe0, 0x02, 0x54, 0x00, 0x00, 0x1d, 0xe0, 0x00, 0x00, 0x00, 0x30, \n\t0x66, 0x70, 0x67, 0x6d, 0x2f, 0xe6, 0x4e, 0xab, 0x00, 0x00, 0x1a, 0x88, \n\t0x00, 0x00, 0x01, 0xbc, 0x67, 0x61, 0x73, 0x70, 0x00, 0x08, 0x00, 0x13, \n\t0x00, 0x01, 0xde, 0xb0, 0x00, 0x00, 0x00, 0x0c, 0x67, 0x6c, 0x79, 0x66, \n\t0xcd, 0x5e, 0x32, 0x3b, 0x00, 0x00, 0x26, 0x28, 0x00, 0x01, 0x90, 0x4c, \n\t0x68, 0x65, 0x61, 0x64, 0xff, 0x11, 0xcf, 0xae, 0x00, 0x00, 0x01, 0x1c, \n\t0x00, 0x00, 0x00, 0x36, 0x68, 0x68, 0x65, 0x61, 0x0d, 0x13, 0x0a, 0x36, \n\t0x00, 0x00, 0x01, 0x54, 0x00, 0x00, 0x00, 0x24, 0x68, 0x6d, 0x74, 0x78, \n\t0x7a, 0x3c, 0x75, 0x33, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x2c, \n\t0x6c, 0x6f, 0x63, 0x61, 0x54, 0x05, 0xb7, 0xaa, 0x00, 0x00, 0x1e, 0x10, \n\t0x00, 0x00, 0x08, 0x18, 0x6d, 0x61, 0x78, 0x70, 0x06, 0x38, 0x03, 0x93, \n\t0x00, 0x00, 0x01, 0x78, 0x00, 0x00, 0x00, 0x20, 0x6e, 0x61, 0x6d, 0x65, \n\t0x96, 0x3e, 0xa7, 0x68, 0x00, 0x01, 0xb6, 0x74, 0x00, 0x00, 0x04, 0x83, \n\t0x70, 0x6f, 0x73, 0x74, 0x42, 0x05, 0xec, 0x34, 0x00, 0x01, 0xba, 0xf8, \n\t0x00, 0x00, 0x23, 0xb6, 0x70, 0x72, 0x65, 0x70, 0xb1, 0x01, 0xb3, 0x50, \n\t0x00, 0x00, 0x1c, 0x44, 0x00, 0x00, 0x01, 0x9c, 0x00, 0x01, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x00, 0x86, 0x5b, 0xc8, 0x05, 0x5f, 0x0f, 0x3c, 0xf5, \n\t0x00, 0x19, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x47, 0xb8, 0x33, \n\t0x00, 0x00, 0x00, 0x00, 0xce, 0x14, 0xcc, 0x31, 0xfc, 0x2c, 0xfd, 0xd5, \n\t0x09, 0x5c, 0x08, 0x77, 0x00, 0x00, 0x00, 0x09, 0x00, 0x02, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x08, 0x62, 0xfd, 0xd5, \n\t0x00, 0x00, 0x09, 0x16, 0xfc, 0x2c, 0xff, 0x3f, 0x08, 0x82, 0x00, 0x01, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x04, 0x0b, 0x00, 0x01, 0x00, 0x00, 0x04, 0x0b, 0x00, 0x97, \n\t0x00, 0x16, 0x00, 0x5f, 0x00, 0x05, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x0e, 0x00, 0x00, 0x02, 0x00, 0x02, 0x9b, 0x00, 0x03, 0x00, 0x01, \n\t0x00, 0x03, 0x04, 0x9c, 0x01, 0x90, 0x00, 0x05, 0x00, 0x00, 0x05, 0x9a, \n\t0x05, 0x33, 0x00, 0x00, 0x01, 0x1f, 0x05, 0x9a, 0x05, 0x33, 0x00, 0x00, \n\t0x03, 0xd1, 0x00, 0x66, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x02, 0xef, 0x50, 0x00, \n\t0x20, 0x5b, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x47, 0x6f, \n\t0x6f, 0x67, 0x00, 0x00, 0x00, 0x0d, 0xff, 0xfd, 0x08, 0x62, 0xfd, 0xd5, \n\t0x00, 0x00, 0x08, 0x62, 0x02, 0x2b, 0x20, 0x00, 0x01, 0x9f, 0x4f, 0x01, \n\t0x00, 0x00, 0x04, 0x3a, 0x05, 0xb0, 0x00, 0x20, 0x00, 0x20, 0x00, 0x02, \n\t0x01, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfd, 0x00, 0x00, \n\t0x01, 0xfd, 0x00, 0x00, 0x02, 0x1b, 0x00, 0xab, 0x02, 0x9c, 0x00, 0x50, \n\t0x04, 0xfc, 0x00, 0x46, 0x04, 0x81, 0x00, 0x6e, 0x05, 0xda, 0x00, 0x68, \n\t0x04, 0xfc, 0x00, 0x40, 0x01, 0x67, 0x00, 0x50, 0x02, 0xa7, 0x00, 0x84, \n\t0x02, 0xaf, 0x00, 0x06, 0x03, 0x74, 0x00, 0x1c, 0x04, 0x8a, 0x00, 0x4e, \n\t0x01, 0x94, 0x00, 0x30, 0x02, 0x31, 0x00, 0x23, 0x02, 0x24, 0x00, 0xa1, \n\t0x03, 0x52, 0x00, 0x10, 0x04, 0x82, 0x00, 0x71, 0x04, 0x81, 0x00, 0xba, \n\t0x04, 0x81, 0x00, 0x5c, 0x04, 0x81, 0x00, 0x5f, 0x04, 0x81, 0x00, 0x37, \n\t0x04, 0x81, 0x00, 0x98, 0x04, 0x81, 0x00, 0x84, 0x04, 0x81, 0x00, 0x4d, \n\t0x04, 0x81, 0x00, 0x66, 0x04, 0x81, 0x00, 0x53, 0x02, 0x05, 0x00, 0xa1, \n\t0x02, 0x0d, 0x00, 0x63, 0x04, 0x10, 0x00, 0x47, 0x04, 0x81, 0x00, 0x98, \n\t0x04, 0x30, 0x00, 0x88, 0x03, 0xce, 0x00, 0x3a, 0x07, 0x29, 0x00, 0x60, \n\t0x05, 0x2e, 0x00, 0x14, 0x05, 0x1d, 0x00, 0xb4, 0x05, 0x11, 0x00, 0x76, \n\t0x05, 0x45, 0x00, 0xb4, 0x04, 0xad, 0x00, 0xb4, 0x04, 0xa9, 0x00, 0xb4, \n\t0x05, 0x74, 0x00, 0x78, 0x05, 0xb5, 0x00, 0xb4, 0x02, 0x43, 0x00, 0xbe, \n\t0x04, 0x6a, 0x00, 0x3d, 0x05, 0x25, 0x00, 0xb4, 0x04, 0x52, 0x00, 0xb4, \n\t0x07, 0x07, 0x00, 0xb4, 0x05, 0xb5, 0x00, 0xb4, 0x05, 0x74, 0x00, 0x71, \n\t0x05, 0x20, 0x00, 0xb4, 0x05, 0x74, 0x00, 0x71, 0x05, 0x4d, 0x00, 0xb4, \n\t0x04, 0xfd, 0x00, 0x61, 0x04, 0xb0, 0x00, 0x22, 0x05, 0x6a, 0x00, 0x93, \n\t0x05, 0x0f, 0x00, 0x16, 0x07, 0x11, 0x00, 0x36, 0x05, 0x0f, 0x00, 0x42, \n\t0x04, 0xe2, 0x00, 0x14, 0x04, 0xc9, 0x00, 0x61, 0x02, 0x28, 0x00, 0x8f, \n\t0x03, 0x4e, 0x00, 0x27, 0x02, 0x28, 0x00, 0x0b, 0x03, 0x58, 0x00, 0x3d, \n\t0x03, 0xa3, 0x00, 0x04, 0x02, 0x81, 0x00, 0x52, 0x04, 0x66, 0x00, 0x6a, \n\t0x04, 0x8c, 0x00, 0x8f, 0x04, 0x3f, 0x00, 0x61, 0x04, 0x8c, 0x00, 0x62, \n\t0x04, 0x3b, 0x00, 0x63, 0x02, 0xc3, 0x00, 0x38, 0x04, 0x8c, 0x00, 0x64, \n\t0x04, 0x8c, 0x00, 0x8f, 0x02, 0x04, 0x00, 0x9f, 0x02, 0x12, 0xff, 0xbe, \n\t0x04, 0x1a, 0x00, 0x90, 0x02, 0x04, 0x00, 0x9f, 0x06, 0xfe, 0x00, 0x8f, \n\t0x04, 0x8c, 0x00, 0x8f, 0x04, 0x8c, 0x00, 0x61, 0x04, 0x8c, 0x00, 0x8f, \n\t0x04, 0x8c, 0x00, 0x62, 0x02, 0xbe, 0x00, 0x8f, 0x04, 0x2f, 0x00, 0x67, \n\t0x02, 0xc4, 0x00, 0x22, 0x04, 0x8c, 0x00, 0x8b, 0x04, 0x06, 0x00, 0x2e, \n\t0x06, 0x0e, 0x00, 0x2d, 0x04, 0x06, 0x00, 0x2e, 0x04, 0x06, 0x00, 0x1a, \n\t0x04, 0x06, 0x00, 0x5e, 0x02, 0xb8, 0x00, 0x3f, 0x01, 0xfb, 0x00, 0xaf, \n\t0x02, 0xb8, 0x00, 0x15, 0x05, 0x6f, 0x00, 0x80, 0x01, 0xfd, 0x00, 0x00, \n\t0x01, 0xfb, 0x00, 0x90, 0x04, 0x62, 0x00, 0x6b, 0x04, 0xaa, 0x00, 0x46, \n\t0x05, 0xb0, 0x00, 0x68, 0x04, 0xdb, 0x00, 0x1e, 0x01, 0xf3, 0x00, 0x91, \n\t0x04, 0xeb, 0x00, 0x5a, 0x03, 0xfd, 0x00, 0xaa, 0x06, 0x44, 0x00, 0x58, \n\t0x03, 0x95, 0x00, 0x78, 0x03, 0xc6, 0x00, 0x62, 0x04, 0x71, 0x00, 0x7f, \n\t0x02, 0x31, 0x00, 0x23, 0x06, 0x44, 0x00, 0x58, 0x03, 0xb6, 0x00, 0x7b, \n\t0x02, 0xfb, 0x00, 0x80, 0x04, 0x49, 0x00, 0x63, 0x03, 0x64, 0x00, 0x71, \n\t0x03, 0x6c, 0x00, 0x6a, 0x02, 0x8e, 0x00, 0x83, 0x04, 0x8c, 0x00, 0x99, \n\t0x03, 0xee, 0x00, 0x3f, 0x02, 0x1c, 0x00, 0xa1, 0x01, 0xfd, 0x00, 0x77, \n\t0x02, 0x2d, 0x00, 0x5f, 0x03, 0xa5, 0x00, 0x78, 0x03, 0xc6, 0x00, 0x6e, \n\t0x06, 0x3b, 0x00, 0xb8, 0x06, 0xac, 0x00, 0xb8, 0x06, 0xf5, 0x00, 0x7a, \n\t0x03, 0xf5, 0x00, 0x72, 0x05, 0x2e, 0x00, 0x14, 0x05, 0x2e, 0x00, 0x14, \n\t0x05, 0x2e, 0x00, 0x14, 0x05, 0x2e, 0x00, 0x14, 0x05, 0x2e, 0x00, 0x14, \n\t0x05, 0x2e, 0x00, 0x14, 0x07, 0x82, 0xff, 0xec, 0x05, 0x11, 0x00, 0x76, \n\t0x04, 0xad, 0x00, 0xb4, 0x04, 0xad, 0x00, 0xb4, 0x04, 0xad, 0x00, 0xb4, \n\t0x04, 0xad, 0x00, 0xb4, 0x02, 0x43, 0xff, 0xde, 0x02, 0x43, 0x00, 0xbe, \n\t0x02, 0x43, 0xff, 0xf1, 0x02, 0x43, 0xff, 0xcb, 0x05, 0x63, 0x00, 0x2a, \n\t0x05, 0xb5, 0x00, 0xb4, 0x05, 0x74, 0x00, 0x71, 0x05, 0x74, 0x00, 0x71, \n\t0x05, 0x74, 0x00, 0x71, 0x05, 0x74, 0x00, 0x71, 0x05, 0x74, 0x00, 0x71, \n\t0x04, 0x48, 0x00, 0x58, 0x05, 0x74, 0x00, 0x71, 0x05, 0x6a, 0x00, 0x93, \n\t0x05, 0x6a, 0x00, 0x93, 0x05, 0x6a, 0x00, 0x93, 0x05, 0x6a, 0x00, 0x93, \n\t0x04, 0xe2, 0x00, 0x14, 0x04, 0xb9, 0x00, 0xa3, 0x04, 0xc5, 0x00, 0x89, \n\t0x04, 0x66, 0x00, 0x6a, 0x04, 0x66, 0x00, 0x6a, 0x04, 0x66, 0x00, 0x6a, \n\t0x04, 0x66, 0x00, 0x6a, 0x04, 0x66, 0x00, 0x6a, 0x04, 0x66, 0x00, 0x6a, \n\t0x06, 0xc1, 0x00, 0x3a, 0x04, 0x3f, 0x00, 0x61, 0x04, 0x3b, 0x00, 0x63, \n\t0x04, 0x3b, 0x00, 0x63, 0x04, 0x3b, 0x00, 0x63, 0x04, 0x3b, 0x00, 0x63, \n\t0x02, 0x03, 0xff, 0xb9, 0x02, 0x03, 0x00, 0x99, 0x02, 0x03, 0xff, 0xcc, \n\t0x02, 0x03, 0xff, 0xa6, 0x04, 0xb2, 0x00, 0x48, 0x04, 0x8c, 0x00, 0x8f, \n\t0x04, 0x8c, 0x00, 0x61, 0x04, 0x8c, 0x00, 0x61, 0x04, 0x8c, 0x00, 0x61, \n\t0x04, 0x8c, 0x00, 0x61, 0x04, 0x8c, 0x00, 0x61, 0x04, 0x92, 0x00, 0x47, \n\t0x04, 0x8c, 0x00, 0x61, 0x04, 0x8c, 0x00, 0x8b, 0x04, 0x8c, 0x00, 0x8b, \n\t0x04, 0x8c, 0x00, 0x8b, 0x04, 0x8c, 0x00, 0x8b, 0x04, 0x06, 0x00, 0x1a, \n\t0x04, 0xa2, 0x00, 0x99, 0x04, 0x06, 0x00, 0x1a, 0x05, 0x2e, 0x00, 0x14, \n\t0x04, 0x66, 0x00, 0x6a, 0x05, 0x2e, 0x00, 0x14, 0x04, 0x66, 0x00, 0x6a, \n\t0x05, 0x2e, 0x00, 0x14, 0x04, 0x66, 0x00, 0x6a, 0x05, 0x11, 0x00, 0x76, \n\t0x04, 0x3f, 0x00, 0x61, 0x05, 0x11, 0x00, 0x76, 0x04, 0x3f, 0x00, 0x61, \n\t0x05, 0x11, 0x00, 0x76, 0x04, 0x3f, 0x00, 0x61, 0x05, 0x11, 0x00, 0x76, \n\t0x04, 0x3f, 0x00, 0x61, 0x05, 0x45, 0x00, 0xb4, 0x05, 0x22, 0x00, 0x62, \n\t0x05, 0x63, 0x00, 0x2a, 0x04, 0xaa, 0x00, 0x62, 0x04, 0xad, 0x00, 0xb4, \n\t0x04, 0x3b, 0x00, 0x63, 0x04, 0xad, 0x00, 0xb4, 0x04, 0x3b, 0x00, 0x63, \n\t0x04, 0xad, 0x00, 0xb4, 0x04, 0x3b, 0x00, 0x63, 0x04, 0xad, 0x00, 0xb4, \n\t0x04, 0x3b, 0x00, 0x63, 0x04, 0xad, 0x00, 0xb4, 0x04, 0x3b, 0x00, 0x63, \n\t0x05, 0x74, 0x00, 0x78, 0x04, 0x8c, 0x00, 0x64, 0x05, 0x74, 0x00, 0x78, \n\t0x04, 0x8c, 0x00, 0x64, 0x05, 0x74, 0x00, 0x78, 0x04, 0x8c, 0x00, 0x64, \n\t0x05, 0x74, 0x00, 0x78, 0x04, 0x8c, 0x00, 0x64, 0x05, 0xb5, 0x00, 0xb4, \n\t0x04, 0x8c, 0x00, 0x8f, 0x05, 0x9f, 0x00, 0x1f, 0x04, 0xaa, 0x00, 0x01, \n\t0x02, 0x43, 0xff, 0xc8, 0x02, 0x03, 0xff, 0xa3, 0x02, 0x43, 0xff, 0xc0, \n\t0x02, 0x03, 0xff, 0x9b, 0x02, 0x43, 0xff, 0xf8, 0x02, 0x03, 0xff, 0xd3, \n\t0x02, 0x43, 0x00, 0x2e, 0x02, 0x04, 0x00, 0x0e, 0x02, 0x43, 0x00, 0xb4, \n\t0x02, 0x03, 0x00, 0x99, 0x06, 0xad, 0x00, 0xbe, 0x04, 0x16, 0x00, 0x9f, \n\t0x04, 0x6a, 0x00, 0x3d, 0x02, 0x0b, 0xff, 0xbc, 0x05, 0x25, 0x00, 0xb4, \n\t0x04, 0x1a, 0x00, 0x90, 0x04, 0x78, 0x00, 0x99, 0x04, 0x52, 0x00, 0xb4, \n\t0x02, 0x04, 0x00, 0x9f, 0x04, 0x52, 0x00, 0xb4, 0x02, 0x04, 0x00, 0x6e, \n\t0x04, 0x52, 0x00, 0xb4, 0x02, 0x9a, 0x00, 0x9f, 0x04, 0x52, 0x00, 0xb4, \n\t0x02, 0xe0, 0x00, 0x9f, 0x04, 0x35, 0x00, 0x28, 0x02, 0x2e, 0x00, 0x25, \n\t0x05, 0xb5, 0x00, 0xb4, 0x04, 0x8c, 0x00, 0x8f, 0x05, 0xb5, 0x00, 0xb4, \n\t0x04, 0x8c, 0x00, 0x8f, 0x05, 0xb5, 0x00, 0xb4, 0x04, 0x8c, 0x00, 0x8f, \n\t0x04, 0x8c, 0xff, 0xe0, 0x05, 0x88, 0x00, 0xa1, 0x04, 0x8c, 0x00, 0x8f, \n\t0x05, 0x74, 0x00, 0x71, 0x04, 0x8c, 0x00, 0x61, 0x05, 0x74, 0x00, 0x71, \n\t0x04, 0x8c, 0x00, 0x61, 0x05, 0x74, 0x00, 0x71, 0x04, 0x8c, 0x00, 0x61, \n\t0x07, 0xa8, 0x00, 0x68, 0x07, 0x3e, 0x00, 0x61, 0x05, 0x4d, 0x00, 0xb4, \n\t0x02, 0xbe, 0x00, 0x8f, 0x05, 0x4d, 0x00, 0xb4, 0x02, 0xbe, 0x00, 0x6b, \n\t0x05, 0x4d, 0x00, 0xb4, 0x02, 0xbe, 0x00, 0x65, 0x04, 0xfd, 0x00, 0x61, \n\t0x04, 0x2f, 0x00, 0x67, 0x04, 0xfd, 0x00, 0x61, 0x04, 0x2f, 0x00, 0x67, \n\t0x04, 0xfd, 0x00, 0x61, 0x04, 0x2f, 0x00, 0x67, 0x04, 0xfd, 0x00, 0x61, \n\t0x04, 0x2f, 0x00, 0x67, 0x04, 0xb0, 0x00, 0x22, 0x02, 0xc4, 0x00, 0x22, \n\t0x04, 0xb0, 0x00, 0x22, 0x02, 0xec, 0x00, 0x22, 0x04, 0xb0, 0x00, 0x22, \n\t0x02, 0xc4, 0xff, 0xf8, 0x05, 0x6a, 0x00, 0x93, 0x04, 0x8c, 0x00, 0x8b, \n\t0x05, 0x6a, 0x00, 0x93, 0x04, 0x8c, 0x00, 0x8b, 0x05, 0x6a, 0x00, 0x93, \n\t0x04, 0x8c, 0x00, 0x8b, 0x05, 0x6a, 0x00, 0x93, 0x04, 0x8c, 0x00, 0x8b, \n\t0x05, 0x6a, 0x00, 0x93, 0x04, 0x8c, 0x00, 0x8b, 0x05, 0x6a, 0x00, 0x93, \n\t0x04, 0x8c, 0x00, 0x8b, 0x07, 0x11, 0x00, 0x36, 0x06, 0x0e, 0x00, 0x2d, \n\t0x04, 0xe2, 0x00, 0x14, 0x04, 0x06, 0x00, 0x1a, 0x04, 0xe2, 0x00, 0x14, \n\t0x04, 0xc9, 0x00, 0x61, 0x04, 0x06, 0x00, 0x5e, 0x04, 0xc9, 0x00, 0x61, \n\t0x04, 0x06, 0x00, 0x5e, 0x04, 0xc9, 0x00, 0x61, 0x04, 0x06, 0x00, 0x5e, \n\t0x02, 0x04, 0x00, 0x9f, 0x02, 0xbe, 0xff, 0xe9, 0x05, 0x7b, 0x00, 0x6c, \n\t0x04, 0x97, 0x00, 0x61, 0x05, 0x96, 0x00, 0x93, 0x04, 0xb4, 0x00, 0x8b, \n\t0x02, 0x0b, 0xff, 0xbc, 0x05, 0x2e, 0x00, 0x14, 0x04, 0x66, 0x00, 0x6a, \n\t0x07, 0x82, 0xff, 0xec, 0x06, 0xc1, 0x00, 0x3a, 0x05, 0x74, 0x00, 0x71, \n\t0x04, 0x8c, 0x00, 0x61, 0x04, 0xfd, 0x00, 0x61, 0x04, 0x2f, 0x00, 0x67, \n\t0x02, 0x0b, 0xff, 0xbc, 0x01, 0xa2, 0x00, 0x50, 0x03, 0xd3, 0x00, 0xab, \n\t0x03, 0x9a, 0x00, 0x8c, 0x03, 0x6c, 0x00, 0x81, 0x02, 0x2c, 0x00, 0xa0, \n\t0x02, 0xb8, 0x00, 0x85, 0x02, 0x32, 0x00, 0x44, 0x03, 0xd3, 0x00, 0x87, \n\t0x02, 0xfa, 0x00, 0x64, 0x02, 0xa0, 0x00, 0xb6, 0x00, 0x00, 0xfc, 0xd1, \n\t0x00, 0x00, 0xfd, 0x6f, 0x00, 0x00, 0xfc, 0x8d, 0x00, 0x00, 0xfd, 0x5b, \n\t0x00, 0x00, 0xfc, 0x2c, 0x00, 0x00, 0xfd, 0x3c, 0x02, 0x0e, 0x00, 0xc3, \n\t0x04, 0x15, 0x00, 0xa1, 0x05, 0x2e, 0x00, 0x14, 0x02, 0x1d, 0x00, 0xa1, \n\t0x05, 0x11, 0xff, 0xe3, 0x06, 0x19, 0x00, 0x14, 0x02, 0xa7, 0x00, 0x18, \n\t0x05, 0x88, 0x00, 0x44, 0x05, 0x46, 0xff, 0x81, 0x05, 0x6a, 0x00, 0x3d, \n\t0x02, 0xa0, 0xff, 0xcd, 0x05, 0x2e, 0x00, 0x14, 0x05, 0x1d, 0x00, 0xb4, \n\t0x04, 0x74, 0x00, 0xb4, 0x05, 0xa7, 0x00, 0x1e, 0x04, 0xad, 0x00, 0xb4, \n\t0x04, 0xc9, 0x00, 0x61, 0x05, 0xb5, 0x00, 0xb4, 0x05, 0x74, 0x00, 0x71, \n\t0x02, 0x43, 0x00, 0xbe, 0x05, 0x25, 0x00, 0xb4, 0x05, 0x41, 0x00, 0x31, \n\t0x07, 0x07, 0x00, 0xb4, 0x05, 0xb5, 0x00, 0xb4, 0x04, 0x95, 0x00, 0x7b, \n\t0x05, 0x74, 0x00, 0x71, 0x05, 0xb7, 0x00, 0xb4, 0x05, 0x20, 0x00, 0xb4, \n\t0x04, 0x95, 0x00, 0x46, 0x04, 0xb0, 0x00, 0x22, 0x04, 0xe2, 0x00, 0x14, \n\t0x05, 0x9f, 0x00, 0x54, 0x05, 0x0f, 0x00, 0x42, 0x05, 0x88, 0x00, 0x57, \n\t0x05, 0x56, 0x00, 0x70, 0x02, 0x43, 0xff, 0xcb, 0x04, 0xe2, 0x00, 0x14, \n\t0x04, 0x86, 0x00, 0x62, 0x04, 0x4f, 0x00, 0x62, 0x04, 0x8c, 0x00, 0x8f, \n\t0x02, 0xa0, 0x00, 0xc5, 0x04, 0x8c, 0x00, 0x8d, 0x04, 0x86, 0x00, 0x62, \n\t0x04, 0xbd, 0x00, 0x9d, 0x04, 0x07, 0x00, 0x2e, 0x04, 0x8c, 0x00, 0x61, \n\t0x04, 0x4f, 0x00, 0x62, 0x04, 0x2f, 0x00, 0x73, 0x04, 0x8c, 0x00, 0x8f, \n\t0x04, 0x8d, 0x00, 0x77, 0x02, 0xa0, 0x00, 0xc5, 0x04, 0x78, 0x00, 0x99, \n\t0x04, 0x8c, 0x00, 0x38, 0x04, 0x8c, 0x00, 0x99, 0x04, 0x06, 0x00, 0x2e, \n\t0x04, 0x13, 0x00, 0x56, 0x04, 0x8c, 0x00, 0x61, 0x04, 0xc5, 0x00, 0x4f, \n\t0x04, 0x8c, 0x00, 0x8f, 0x04, 0x4e, 0x00, 0x62, 0x04, 0x8c, 0x00, 0x61, \n\t0x04, 0x30, 0x00, 0x51, 0x04, 0x8c, 0x00, 0x8d, 0x05, 0xaa, 0x00, 0x53, \n\t0x04, 0x77, 0x00, 0x5e, 0x05, 0xa0, 0x00, 0x5b, 0x06, 0xcd, 0x00, 0x6c, \n\t0x02, 0xa0, 0xff, 0xd8, 0x04, 0x8c, 0x00, 0x8d, 0x04, 0x8c, 0x00, 0x61, \n\t0x04, 0x8c, 0x00, 0x8d, 0x06, 0xcd, 0x00, 0x6c, 0x04, 0xf1, 0x00, 0x71, \n\t0x04, 0x41, 0xff, 0xea, 0x06, 0x48, 0x00, 0x4e, 0x04, 0xad, 0x00, 0xb4, \n\t0x04, 0xad, 0x00, 0xb4, 0x06, 0x01, 0x00, 0x29, 0x04, 0x74, 0x00, 0xb4, \n\t0x05, 0x6a, 0x00, 0x87, 0x04, 0xfd, 0x00, 0x61, 0x02, 0x43, 0x00, 0xbe, \n\t0x02, 0x43, 0xff, 0xcb, 0x04, 0x6a, 0x00, 0x3d, 0x08, 0x99, 0x00, 0x32, \n\t0x08, 0xa4, 0x00, 0xb4, 0x06, 0x86, 0x00, 0x42, 0x05, 0x25, 0x00, 0xb4, \n\t0x05, 0xb5, 0x00, 0xb4, 0x05, 0x11, 0x00, 0x55, 0x05, 0xb7, 0x00, 0xb4, \n\t0x05, 0x2e, 0x00, 0x14, 0x05, 0x0c, 0x00, 0xa3, 0x05, 0x1d, 0x00, 0xb4, \n\t0x04, 0x74, 0x00, 0xb4, 0x06, 0x0e, 0x00, 0x30, 0x04, 0xad, 0x00, 0xb4, \n\t0x07, 0x4d, 0x00, 0x1c, 0x05, 0x69, 0x00, 0x78, 0x05, 0xb5, 0x00, 0xb4, \n\t0x05, 0xb5, 0x00, 0xb4, 0x05, 0x25, 0x00, 0xb4, 0x05, 0xab, 0x00, 0x31, \n\t0x07, 0x07, 0x00, 0xb4, 0x05, 0xb5, 0x00, 0xb4, 0x05, 0x74, 0x00, 0x71, \n\t0x05, 0xb7, 0x00, 0xb4, 0x05, 0x20, 0x00, 0xb4, 0x05, 0x11, 0x00, 0x76, \n\t0x04, 0xb0, 0x00, 0x22, 0x05, 0x07, 0x00, 0x55, 0x06, 0x37, 0x00, 0x55, \n\t0x05, 0x0f, 0x00, 0x42, 0x06, 0x28, 0x00, 0xb5, 0x05, 0x81, 0x00, 0x93, \n\t0x07, 0x8c, 0x00, 0xb4, 0x07, 0xca, 0x00, 0xb4, 0x06, 0x0c, 0x00, 0x16, \n\t0x06, 0xf6, 0x00, 0xb4, 0x05, 0x0a, 0x00, 0xa3, 0x05, 0x69, 0x00, 0xb5, \n\t0x07, 0x21, 0x00, 0xbe, 0x05, 0x21, 0x00, 0x63, 0x04, 0x66, 0x00, 0x6a, \n\t0x04, 0x6d, 0x00, 0x61, 0x04, 0x8c, 0x00, 0x90, 0x03, 0x51, 0x00, 0x8f, \n\t0x04, 0xdf, 0x00, 0x2e, 0x04, 0x3b, 0x00, 0x63, 0x06, 0x20, 0x00, 0x15, \n\t0x04, 0x10, 0x00, 0x58, 0x04, 0x8c, 0x00, 0x8f, 0x04, 0x8c, 0x00, 0x8f, \n\t0x04, 0x3e, 0x00, 0x99, 0x04, 0x6d, 0x00, 0x1a, 0x05, 0xf8, 0x00, 0x99, \n\t0x04, 0x8c, 0x00, 0x8f, 0x04, 0x8c, 0x00, 0x61, 0x04, 0x8c, 0x00, 0x8f, \n\t0x04, 0x8c, 0x00, 0x8f, 0x04, 0x3f, 0x00, 0x61, 0x04, 0x18, 0x00, 0x47, \n\t0x04, 0x06, 0x00, 0x1a, 0x05, 0xcd, 0x00, 0x62, 0x04, 0x06, 0x00, 0x2e, \n\t0x04, 0xc2, 0x00, 0x8f, 0x04, 0x6b, 0x00, 0x7f, 0x06, 0x6d, 0x00, 0x8f, \n\t0x06, 0xc4, 0x00, 0x8f, 0x04, 0xf4, 0x00, 0x1d, 0x06, 0x51, 0x00, 0xad, \n\t0x04, 0x59, 0x00, 0x99, 0x04, 0x4e, 0x00, 0x63, 0x06, 0x87, 0x00, 0x99, \n\t0x04, 0x8b, 0x00, 0x4e, 0x04, 0x3b, 0x00, 0x63, 0x04, 0x3b, 0x00, 0x63, \n\t0x04, 0x8c, 0xff, 0xe7, 0x03, 0x51, 0x00, 0x8f, 0x04, 0x4f, 0x00, 0x6b, \n\t0x04, 0x2f, 0x00, 0x67, 0x02, 0x04, 0x00, 0x9f, 0x02, 0x03, 0xff, 0xa6, \n\t0x02, 0x12, 0xff, 0xbe, 0x06, 0xf6, 0x00, 0x41, 0x06, 0xf5, 0x00, 0x8f, \n\t0x04, 0x8c, 0x00, 0x13, 0x04, 0x3e, 0x00, 0x99, 0x04, 0x8c, 0x00, 0x8f, \n\t0x04, 0x06, 0x00, 0x1a, 0x04, 0x8c, 0x00, 0x8f, 0x07, 0x05, 0x00, 0x9d, \n\t0x06, 0x18, 0x00, 0x7c, 0x05, 0x0a, 0xff, 0xcd, 0x04, 0x59, 0xff, 0xdb, \n\t0x07, 0x2d, 0x00, 0xbf, 0x05, 0xfa, 0x00, 0x97, 0x04, 0xd3, 0x00, 0x2b, \n\t0x04, 0x49, 0x00, 0x0d, 0x07, 0x0d, 0x00, 0xd1, 0x06, 0x0d, 0x00, 0xba, \n\t0x06, 0xdf, 0x00, 0x95, 0x05, 0xec, 0x00, 0x95, 0x09, 0x16, 0x00, 0xbe, \n\t0x07, 0xe3, 0x00, 0x99, 0x04, 0x25, 0x00, 0x4a, 0x03, 0xda, 0x00, 0x49, \n\t0x05, 0x88, 0x00, 0x57, 0x05, 0xa0, 0x00, 0x5b, 0x05, 0x74, 0x00, 0x71, \n\t0x04, 0x8d, 0x00, 0x61, 0x05, 0x0f, 0x00, 0x16, 0x04, 0x07, 0x00, 0x2e, \n\t0x05, 0x0f, 0x00, 0x16, 0x04, 0x07, 0xff, 0xfe, 0x09, 0x7a, 0x00, 0x71, \n\t0x08, 0x92, 0x00, 0x61, 0x05, 0x74, 0x00, 0x71, 0x04, 0x8c, 0x00, 0x61, \n\t0x06, 0xfe, 0x00, 0x9d, 0x06, 0x18, 0x00, 0x7b, 0x07, 0x06, 0x00, 0x9d, \n\t0x06, 0x19, 0x00, 0x7c, 0x05, 0x38, 0x00, 0x76, 0x04, 0x4b, 0x00, 0x62, \n\t0x05, 0x02, 0x00, 0x70, 0x04, 0x8d, 0x00, 0xd4, 0x04, 0xb9, 0x00, 0xfb, \n\t0x03, 0x13, 0x01, 0x00, 0x03, 0x4f, 0x01, 0x2c, 0x08, 0x1c, 0x00, 0x3b, \n\t0x07, 0xd8, 0x00, 0x4d, 0x05, 0xb5, 0x00, 0xb4, 0x04, 0x8c, 0x00, 0x8f, \n\t0x05, 0x0a, 0xff, 0xcd, 0x04, 0x59, 0xff, 0xdb, 0x05, 0x1d, 0x00, 0xb4, \n\t0x04, 0x8b, 0x00, 0x8f, 0x04, 0x64, 0x00, 0xa3, 0x03, 0x93, 0x00, 0x8f, \n\t0x04, 0x74, 0xff, 0xfc, 0x03, 0x51, 0xff, 0xf3, 0x04, 0xe6, 0x00, 0xb4, \n\t0x04, 0x08, 0x00, 0x8f, 0x07, 0x4d, 0x00, 0x1c, 0x06, 0x20, 0x00, 0x15, \n\t0x04, 0xbf, 0x00, 0x78, 0x04, 0x10, 0x00, 0x58, 0x05, 0x25, 0x00, 0xb4, \n\t0x04, 0x3e, 0x00, 0x99, 0x05, 0x0f, 0x00, 0xa3, 0x04, 0x68, 0x00, 0x99, \n\t0x05, 0x39, 0xff, 0xf5, 0x04, 0x2e, 0xff, 0xcf, 0x06, 0x90, 0x00, 0x43, \n\t0x05, 0x8e, 0x00, 0x41, 0x05, 0xb5, 0x00, 0xb4, 0x04, 0x8c, 0x00, 0x8f, \n\t0x07, 0xc4, 0x00, 0xb4, 0x05, 0xb0, 0x00, 0x8f, 0x08, 0x33, 0x00, 0xb4, \n\t0x06, 0xfa, 0x00, 0x8f, 0x05, 0xee, 0x00, 0x71, 0x04, 0xd7, 0x00, 0x6c, \n\t0x05, 0x11, 0x00, 0x76, 0x04, 0x3f, 0x00, 0x61, 0x04, 0xb0, 0x00, 0x22, \n\t0x04, 0x18, 0x00, 0x47, 0x04, 0xe2, 0x00, 0x14, 0x04, 0x07, 0x00, 0x2e, \n\t0x04, 0xe2, 0x00, 0x14, 0x04, 0x07, 0x00, 0x2e, 0x05, 0x0f, 0x00, 0x42, \n\t0x04, 0x06, 0x00, 0x2e, 0x07, 0x37, 0x00, 0x37, 0x05, 0x93, 0x00, 0x20, \n\t0x05, 0x81, 0x00, 0x93, 0x04, 0x6b, 0x00, 0x7f, 0x05, 0x76, 0x00, 0x93, \n\t0x04, 0x6c, 0x00, 0x7f, 0x05, 0x76, 0x00, 0x8a, 0x04, 0x6c, 0x00, 0x94, \n\t0x06, 0xcb, 0x00, 0x4d, 0x04, 0xbf, 0xff, 0xdf, 0x06, 0x36, 0x00, 0x4d, \n\t0x04, 0xbf, 0xff, 0xdf, 0x02, 0x43, 0x00, 0xbe, 0x07, 0x4d, 0x00, 0x1c, \n\t0x06, 0x20, 0x00, 0x15, 0x05, 0x0f, 0x00, 0xa3, 0x04, 0x60, 0x00, 0x99, \n\t0x05, 0xab, 0x00, 0x31, 0x04, 0x6d, 0x00, 0x1a, 0x05, 0xb5, 0x00, 0xb4, \n\t0x04, 0x8c, 0x00, 0x8f, 0x05, 0xb5, 0x00, 0xb4, 0x04, 0x8c, 0x00, 0x8f, \n\t0x05, 0x81, 0x00, 0x93, 0x04, 0x6b, 0x00, 0x7f, 0x07, 0x07, 0x00, 0xb4, \n\t0x05, 0xf8, 0x00, 0x99, 0x02, 0x43, 0x00, 0xbe, 0x05, 0x2e, 0x00, 0x14, \n\t0x04, 0x66, 0x00, 0x6a, 0x05, 0x2e, 0x00, 0x14, 0x04, 0x66, 0x00, 0x6a, \n\t0x07, 0x82, 0xff, 0xec, 0x06, 0xc1, 0x00, 0x3a, 0x04, 0xad, 0x00, 0xb4, \n\t0x04, 0x3b, 0x00, 0x63, 0x05, 0x91, 0x00, 0x59, 0x04, 0x42, 0x00, 0x74, \n\t0x05, 0x91, 0x00, 0x59, 0x04, 0x42, 0x00, 0x74, 0x06, 0x97, 0x00, 0x1c, \n\t0x05, 0xc1, 0x00, 0x15, 0x05, 0x69, 0x00, 0x78, 0x04, 0x4f, 0x00, 0x58, \n\t0x04, 0xaa, 0x00, 0x69, 0x04, 0xaa, 0x00, 0x69, 0x05, 0xb5, 0x00, 0xb4, \n\t0x04, 0x8c, 0x00, 0x8f, 0x05, 0xb5, 0x00, 0xb4, 0x04, 0x8c, 0x00, 0x8f, \n\t0x05, 0x74, 0x00, 0x71, 0x04, 0x8c, 0x00, 0x61, 0x05, 0x74, 0x00, 0x71, \n\t0x04, 0x8d, 0x00, 0x61, 0x05, 0x74, 0x00, 0x71, 0x04, 0x8d, 0x00, 0x61, \n\t0x05, 0x69, 0x00, 0xb5, 0x04, 0x4e, 0x00, 0x63, 0x05, 0x07, 0x00, 0x55, \n\t0x04, 0x06, 0x00, 0x1a, 0x05, 0x07, 0x00, 0x55, 0x04, 0x06, 0x00, 0x1a, \n\t0x05, 0x07, 0x00, 0x55, 0x04, 0x06, 0x00, 0x1a, 0x05, 0x81, 0x00, 0x93, \n\t0x04, 0x6b, 0x00, 0x7f, 0x04, 0x74, 0x00, 0xb4, 0x03, 0x51, 0x00, 0x8f, \n\t0x06, 0xf6, 0x00, 0xb4, 0x06, 0x51, 0x00, 0xad, 0x04, 0xbf, 0x00, 0x41, \n\t0x03, 0x49, 0x00, 0x42, 0x05, 0x0f, 0x00, 0x42, 0x04, 0x06, 0x00, 0x2e, \n\t0x05, 0x0f, 0x00, 0x42, 0x04, 0x06, 0x00, 0x2e, 0x05, 0x07, 0x00, 0x5b, \n\t0x04, 0x8c, 0x00, 0x62, 0x06, 0xa4, 0x00, 0x5b, 0x06, 0xe5, 0x00, 0x62, \n\t0x06, 0x57, 0x00, 0x36, 0x05, 0x2c, 0x00, 0x31, 0x04, 0x4b, 0x00, 0x50, \n\t0x04, 0x09, 0x00, 0x7b, 0x07, 0xc2, 0x00, 0x45, 0x06, 0x76, 0x00, 0x41, \n\t0x08, 0x03, 0x00, 0xa9, 0x06, 0xa2, 0x00, 0x8f, 0x04, 0xf7, 0x00, 0x76, \n\t0x04, 0x1e, 0x00, 0x62, 0x05, 0xae, 0x00, 0x24, 0x05, 0x21, 0x00, 0x46, \n\t0x05, 0x69, 0x00, 0x9c, 0x04, 0x4f, 0x00, 0x62, 0x05, 0xab, 0x00, 0x31, \n\t0x04, 0x6d, 0x00, 0x1a, 0x05, 0x2e, 0x00, 0x14, 0x04, 0x66, 0x00, 0x6a, \n\t0x07, 0x07, 0x00, 0xb4, 0x06, 0xfe, 0x00, 0x8f, 0x07, 0x11, 0x00, 0x36, \n\t0x06, 0x0e, 0x00, 0x2d, 0x07, 0x11, 0x00, 0x36, 0x06, 0x0e, 0x00, 0x2d, \n\t0x07, 0x11, 0x00, 0x36, 0x06, 0x0e, 0x00, 0x2d, 0x05, 0x2e, 0x00, 0x14, \n\t0x04, 0x66, 0x00, 0x6a, 0x05, 0x2e, 0x00, 0x14, 0x04, 0x66, 0x00, 0x6a, \n\t0x05, 0x2e, 0x00, 0x14, 0x04, 0x66, 0x00, 0x6a, 0x05, 0x2e, 0x00, 0x14, \n\t0x04, 0x66, 0xff, 0xa3, 0x05, 0x2e, 0x00, 0x14, 0x04, 0x66, 0x00, 0x6a, \n\t0x05, 0x2e, 0x00, 0x14, 0x04, 0x66, 0x00, 0x6a, 0x05, 0x2e, 0x00, 0x14, \n\t0x04, 0x66, 0x00, 0x6a, 0x05, 0x2e, 0x00, 0x14, 0x04, 0x66, 0x00, 0x6a, \n\t0x05, 0x2e, 0x00, 0x14, 0x04, 0x66, 0x00, 0x6a, 0x05, 0x2e, 0x00, 0x14, \n\t0x04, 0x66, 0x00, 0x6a, 0x05, 0x2e, 0x00, 0x14, 0x04, 0x66, 0x00, 0x6a, \n\t0x05, 0x2e, 0x00, 0x14, 0x04, 0x66, 0x00, 0x6a, 0x04, 0xad, 0x00, 0xb4, \n\t0x04, 0x3b, 0x00, 0x63, 0x04, 0xad, 0x00, 0xb4, 0x04, 0x3b, 0x00, 0x63, \n\t0x04, 0xad, 0x00, 0xb4, 0x04, 0x3b, 0x00, 0x63, 0x04, 0xad, 0x00, 0xb4, \n\t0x04, 0x3b, 0x00, 0x63, 0x04, 0xad, 0xff, 0xec, 0x04, 0x3b, 0xff, 0xa6, \n\t0x04, 0xad, 0x00, 0xb4, 0x04, 0x3b, 0x00, 0x63, 0x04, 0xad, 0x00, 0xb4, \n\t0x04, 0x3b, 0x00, 0x63, 0x04, 0xad, 0x00, 0xb4, 0x04, 0x3b, 0x00, 0x63, \n\t0x02, 0x43, 0x00, 0xbe, 0x02, 0x03, 0x00, 0x99, 0x02, 0x43, 0x00, 0xb4, \n\t0x02, 0x04, 0x00, 0x95, 0x05, 0x74, 0x00, 0x71, 0x04, 0x8c, 0x00, 0x61, \n\t0x05, 0x74, 0x00, 0x71, 0x04, 0x8c, 0x00, 0x61, 0x05, 0x74, 0x00, 0x71, \n\t0x04, 0x8c, 0x00, 0x61, 0x05, 0x74, 0x00, 0x32, 0x04, 0x8c, 0xff, 0xbe, \n\t0x05, 0x74, 0x00, 0x71, 0x04, 0x8c, 0x00, 0x61, 0x05, 0x74, 0x00, 0x71, \n\t0x04, 0x8c, 0x00, 0x61, 0x05, 0x74, 0x00, 0x71, 0x04, 0x8c, 0x00, 0x61, \n\t0x05, 0x7b, 0x00, 0x6c, 0x04, 0x97, 0x00, 0x61, 0x05, 0x7b, 0x00, 0x6c, \n\t0x04, 0x97, 0x00, 0x61, 0x05, 0x7b, 0x00, 0x6c, 0x04, 0x97, 0x00, 0x61, \n\t0x05, 0x7b, 0x00, 0x6c, 0x04, 0x97, 0x00, 0x61, 0x05, 0x7b, 0x00, 0x6c, \n\t0x04, 0x97, 0x00, 0x61, 0x05, 0x6a, 0x00, 0x93, 0x04, 0x8c, 0x00, 0x8b, \n\t0x05, 0x6a, 0x00, 0x93, 0x04, 0x8c, 0x00, 0x8b, 0x05, 0x96, 0x00, 0x93, \n\t0x04, 0xb4, 0x00, 0x8b, 0x05, 0x96, 0x00, 0x93, 0x04, 0xb4, 0x00, 0x8b, \n\t0x05, 0x96, 0x00, 0x93, 0x04, 0xb4, 0x00, 0x8b, 0x05, 0x96, 0x00, 0x93, \n\t0x04, 0xb4, 0x00, 0x8b, 0x05, 0x96, 0x00, 0x93, 0x04, 0xb4, 0x00, 0x8b, \n\t0x04, 0xe2, 0x00, 0x14, 0x04, 0x06, 0x00, 0x1a, 0x04, 0xe2, 0x00, 0x14, \n\t0x04, 0x06, 0x00, 0x1a, 0x04, 0xe2, 0x00, 0x14, 0x04, 0x06, 0x00, 0x1a, \n\t0x04, 0xe2, 0x00, 0x14, 0x04, 0x06, 0x00, 0x1a, 0x05, 0x74, 0xff, 0x24, \n\t0x04, 0x14, 0x00, 0x00, 0x08, 0x29, 0x00, 0x00, 0x04, 0x14, 0x00, 0x00, \n\t0x08, 0x29, 0x00, 0x00, 0x02, 0xb9, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, \n\t0x01, 0x5c, 0x00, 0x00, 0x04, 0x7f, 0x00, 0x00, 0x02, 0x30, 0x00, 0x00, \n\t0x01, 0xa2, 0x00, 0x00, 0x00, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x05, 0x88, 0x00, 0xb4, 0x06, 0x7c, 0x00, 0xbc, 0x06, 0x7c, 0x00, 0xbc, \n\t0x03, 0xa7, 0x00, 0x05, 0x01, 0xa2, 0x00, 0x50, 0x01, 0xa2, 0x00, 0x50, \n\t0x01, 0xa1, 0x00, 0x50, 0x01, 0xa2, 0x00, 0x2b, 0x02, 0xe8, 0x00, 0x50, \n\t0x02, 0xf0, 0x00, 0x50, 0x02, 0xd6, 0x00, 0x50, 0x04, 0x69, 0x00, 0x46, \n\t0x04, 0x92, 0x00, 0x57, 0x02, 0xb7, 0x00, 0x89, 0x03, 0xca, 0x00, 0xa1, \n\t0x05, 0x64, 0x00, 0xa1, 0x07, 0xa4, 0x00, 0x40, 0x01, 0x67, 0x00, 0x50, \n\t0x02, 0x9c, 0x00, 0x50, 0x02, 0x67, 0x00, 0x6c, 0x02, 0x67, 0x00, 0x58, \n\t0x04, 0x36, 0x00, 0xab, 0x03, 0xa5, 0x00, 0x3b, 0x03, 0xad, 0x00, 0x47, \n\t0x03, 0x60, 0x00, 0x7a, 0x04, 0xa9, 0x00, 0x1c, 0x04, 0xaa, 0x00, 0x46, \n\t0x06, 0x92, 0x00, 0xa4, 0x04, 0xaa, 0x00, 0x62, 0x04, 0x40, 0x00, 0x4f, \n\t0x05, 0xe9, 0x00, 0x7c, 0x03, 0xd2, 0x00, 0x6a, 0x08, 0xcc, 0x00, 0xab, \n\t0x05, 0x04, 0x00, 0x67, 0x05, 0x18, 0x00, 0x98, 0x06, 0xbf, 0x00, 0x6b, \n\t0x07, 0x56, 0x00, 0x6e, 0x07, 0x86, 0x00, 0x70, 0x06, 0xdf, 0x00, 0x6b, \n\t0x04, 0xa2, 0x00, 0x48, 0x05, 0x9c, 0x00, 0xa8, 0x04, 0xb2, 0x00, 0x46, \n\t0x04, 0x92, 0x00, 0xa8, 0x04, 0xd7, 0x00, 0x3f, 0x08, 0x2f, 0x00, 0x68, \n\t0x02, 0x0d, 0xff, 0xbc, 0x04, 0x82, 0x00, 0x65, 0x04, 0x30, 0x00, 0x98, \n\t0x04, 0x38, 0x00, 0x9e, 0x04, 0x40, 0x00, 0x9a, 0x04, 0x08, 0x00, 0x29, \n\t0x02, 0x08, 0x00, 0x65, 0x04, 0x74, 0x00, 0x1c, 0x04, 0xc7, 0x00, 0x38, \n\t0x07, 0x37, 0x00, 0x38, 0x07, 0x8a, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, \n\t0x08, 0x34, 0x00, 0x5b, 0x08, 0x35, 0x00, 0x5c, 0x02, 0x03, 0xff, 0x99, \n\t0x03, 0x4c, 0x00, 0x68, 0x03, 0x84, 0x00, 0x70, 0x03, 0x6c, 0x00, 0x68, \n\t0x04, 0x30, 0x00, 0x78, 0x04, 0x68, 0x00, 0x47, 0x04, 0x16, 0x00, 0x5a, \n\t0x03, 0xe5, 0x00, 0x59, 0x02, 0x5e, 0x00, 0x4e, 0x04, 0x79, 0x00, 0x78, \n\t0x04, 0x40, 0x00, 0x4e, 0x04, 0x61, 0x00, 0x1e, 0x04, 0x89, 0x00, 0x37, \n\t0x06, 0x02, 0x00, 0x3f, 0x04, 0xbb, 0x00, 0x27, 0x05, 0x04, 0x00, 0x89, \n\t0x04, 0x30, 0x00, 0x47, 0x04, 0x71, 0x00, 0x5d, 0x04, 0xad, 0x00, 0x99, \n\t0x04, 0xe3, 0x00, 0x70, 0x04, 0xde, 0x00, 0x8b, 0x04, 0xcb, 0x00, 0x70, \n\t0x05, 0x1c, 0x00, 0x99, 0x03, 0xa0, 0x00, 0x92, 0x05, 0xf8, 0x00, 0x99, \n\t0x03, 0xbd, 0x00, 0x99, 0x04, 0x61, 0x00, 0x99, 0x04, 0x0f, 0x00, 0x40, \n\t0x02, 0x03, 0x00, 0x99, 0x04, 0xfb, 0x00, 0x99, 0x04, 0xd3, 0x00, 0x70, \n\t0x04, 0x1f, 0x00, 0x99, 0x04, 0x47, 0x00, 0x99, 0x04, 0xaa, 0x00, 0x99, \n\t0x04, 0x92, 0x00, 0x70, 0x04, 0x79, 0x00, 0x99, 0x02, 0x07, 0x00, 0xa0, \n\t0x03, 0xa4, 0x00, 0x81, 0x04, 0xba, 0x00, 0x27, 0x04, 0x09, 0x00, 0x78, \n\t0x04, 0x0a, 0xff, 0x55, 0x04, 0x0f, 0x00, 0x6e, 0x04, 0x0a, 0x00, 0x6e, \n\t0x03, 0xa4, 0x00, 0x81, 0x03, 0xa4, 0x00, 0x81, 0x03, 0xa5, 0x00, 0x81, \n\t0x01, 0x91, 0x00, 0x60, 0x02, 0x31, 0x00, 0x13, 0x02, 0x04, 0xff, 0xbe, \n\t0x03, 0x0c, 0xff, 0xa0, 0x03, 0x07, 0x00, 0x3b, 0x04, 0x7f, 0x00, 0x5b, \n\t0x04, 0xab, 0x00, 0x74, 0x04, 0x9f, 0x00, 0x46, 0x04, 0x9f, 0x00, 0xa7, \n\t0x04, 0x9f, 0x00, 0x93, 0x04, 0x01, 0x00, 0x1e, 0x04, 0xd5, 0x00, 0x7d, \n\t0x04, 0x9f, 0x00, 0x62, 0x04, 0x79, 0x00, 0x99, 0x04, 0x1f, 0x00, 0x5a, \n\t0x03, 0x7c, 0x00, 0x78, 0x03, 0x7c, 0x00, 0x72, 0x03, 0x94, 0x00, 0x57, \n\t0x03, 0x6c, 0x00, 0x6a, 0x03, 0x5b, 0x00, 0x71, 0x02, 0xb8, 0x00, 0x9b, \n\t0x02, 0x2d, 0x00, 0x5f, 0x03, 0xa5, 0x00, 0x78, 0x04, 0x28, 0x00, 0x47, \n\t0x04, 0x30, 0x00, 0x58, 0x03, 0xbd, 0x00, 0x47, 0x03, 0x11, 0x00, 0x5f, \n\t0x03, 0x6c, 0x00, 0x81, 0x04, 0xaa, 0xff, 0xf6, 0x04, 0xaa, 0xff, 0xf6, \n\t0x04, 0x30, 0x00, 0x47, 0x04, 0xba, 0x00, 0x27, 0x04, 0xba, 0x00, 0x27, \n\t0x04, 0xba, 0x00, 0x27, 0x04, 0xba, 0x00, 0x27, 0x04, 0xba, 0x00, 0x27, \n\t0x04, 0xba, 0x00, 0x27, 0x04, 0xba, 0x00, 0x27, 0x04, 0x92, 0x00, 0x70, \n\t0x04, 0x47, 0x00, 0x99, 0x04, 0x47, 0x00, 0x99, 0x04, 0x47, 0x00, 0x99, \n\t0x04, 0x47, 0x00, 0x99, 0x02, 0x03, 0xff, 0xb7, 0x02, 0x03, 0x00, 0x99, \n\t0x02, 0x03, 0xff, 0xca, 0x02, 0x03, 0xff, 0xa4, 0x05, 0x1c, 0x00, 0x99, \n\t0x04, 0xcb, 0x00, 0x70, 0x04, 0xcb, 0x00, 0x70, 0x04, 0xcb, 0x00, 0x70, \n\t0x04, 0xcb, 0x00, 0x70, 0x04, 0xcb, 0x00, 0x70, 0x05, 0x04, 0x00, 0x89, \n\t0x05, 0x04, 0x00, 0x89, 0x05, 0x04, 0x00, 0x89, 0x05, 0x04, 0x00, 0x89, \n\t0x04, 0x61, 0x00, 0x1e, 0x04, 0xba, 0x00, 0x27, 0x04, 0xba, 0x00, 0x27, \n\t0x04, 0xba, 0x00, 0x27, 0x04, 0x92, 0x00, 0x70, 0x04, 0x92, 0x00, 0x70, \n\t0x04, 0x92, 0x00, 0x70, 0x04, 0x92, 0x00, 0x70, 0x04, 0xaa, 0x00, 0x99, \n\t0x04, 0x47, 0x00, 0x99, 0x04, 0x47, 0x00, 0x99, 0x04, 0x47, 0x00, 0x99, \n\t0x04, 0x47, 0x00, 0x99, 0x04, 0x47, 0x00, 0x99, 0x04, 0xd3, 0x00, 0x70, \n\t0x04, 0xd3, 0x00, 0x70, 0x04, 0xd3, 0x00, 0x70, 0x04, 0xd3, 0x00, 0x70, \n\t0x04, 0xfb, 0x00, 0x99, 0x02, 0x03, 0xff, 0xa1, 0x05, 0x04, 0x00, 0x89, \n\t0x02, 0x03, 0xff, 0xd1, 0x02, 0x03, 0x00, 0x3c, 0x02, 0x03, 0x00, 0x8f, \n\t0x04, 0x0f, 0x00, 0x40, 0x04, 0x61, 0x00, 0x99, 0x03, 0xbd, 0x00, 0x6b, \n\t0x03, 0xbd, 0x00, 0x99, 0x03, 0xbd, 0x00, 0x99, 0x03, 0xbd, 0x00, 0x99, \n\t0x05, 0x1c, 0x00, 0x99, 0x05, 0x1c, 0x00, 0x99, 0x05, 0x1c, 0x00, 0x99, \n\t0x04, 0xcb, 0x00, 0x70, 0x04, 0xcb, 0x00, 0x70, 0x04, 0xcb, 0x00, 0x70, \n\t0x04, 0xad, 0x00, 0x99, 0x04, 0xad, 0x00, 0x99, 0x04, 0xad, 0x00, 0x99, \n\t0x04, 0x71, 0x00, 0x5d, 0x04, 0x71, 0x00, 0x5d, 0x04, 0x71, 0x00, 0x5d, \n\t0x04, 0x71, 0x00, 0x5d, 0x04, 0x30, 0x00, 0x47, 0x04, 0x30, 0x00, 0x47, \n\t0x05, 0x04, 0x00, 0x89, 0x05, 0x04, 0x00, 0x89, 0x05, 0x04, 0x00, 0x89, \n\t0x05, 0x04, 0x00, 0x89, 0x08, 0xe2, 0x00, 0x5d, 0x04, 0x40, 0x00, 0x4e, \n\t0x04, 0x40, 0x00, 0x4e, 0x04, 0x40, 0x00, 0x4e, 0x04, 0x61, 0x00, 0x1e, \n\t0x04, 0x61, 0x00, 0x1e, 0x06, 0x02, 0x00, 0x3f, 0x05, 0x04, 0x00, 0x89, \n\t0x00, 0x00, 0x04, 0x0b, 0x03, 0x01, 0x03, 0x03, 0x01, 0x01, 0x05, 0x01, \n\t0x01, 0x05, 0x01, 0x01, 0x01, 0x17, 0x01, 0x27, 0x01, 0x1d, 0x01, 0x01, \n\t0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, \n\t0x01, 0x01, 0x2a, 0x01, 0x01, 0x01, 0x2e, 0x01, 0x01, 0x07, 0x22, 0x01, \n\t0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x22, 0x01, 0x22, 0x01, 0x05, 0x01, \n\t0x01, 0x23, 0x1f, 0x23, 0x0a, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, \n\t0x1f, 0x01, 0x11, 0x01, 0x01, 0x2b, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, \n\t0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0e, 0x01, 0x01, 0x01, 0x01, \n\t0x01, 0x01, 0x1a, 0x03, 0x1a, 0x01, 0x03, 0x03, 0x01, 0x13, 0x01, 0x0f, \n\t0x01, 0x01, 0x06, 0x1f, 0x31, 0x01, 0x01, 0x01, 0x1f, 0x0f, 0x01, 0x2b, \n\t0x2f, 0x01, 0x25, 0x01, 0x01, 0x25, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, \n\t0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x2e, 0x01, 0x01, \n\t0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x22, 0x22, 0x22, 0x22, \n\t0x22, 0x0f, 0x22, 0x01, 0x01, 0x01, 0x01, 0x0a, 0x0c, 0x01, 0x1f, 0x1f, \n\t0x1f, 0x1f, 0x1f, 0x1f, 0x01, 0x11, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, \n\t0x01, 0x01, 0x18, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, \n\t0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x1f, 0x01, 0x1f, 0x01, 0x1f, \n\t0x2e, 0x11, 0x2e, 0x11, 0x2e, 0x11, 0x2e, 0x11, 0x01, 0x01, 0x01, 0x13, \n\t0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x22, 0x01, \n\t0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x01, 0x01, 0x01, 0x13, 0x01, 0x01, \n\t0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x2f, 0x01, 0x01, \n\t0x01, 0x01, 0x12, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, \n\t0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x30, 0x01, 0x22, 0x01, \n\t0x22, 0x01, 0x22, 0x01, 0x24, 0x26, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, \n\t0x05, 0x01, 0x05, 0x01, 0x05, 0x01, 0x05, 0x01, 0x01, 0x0e, 0x01, 0x1b, \n\t0x01, 0x0e, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, \n\t0x01, 0x01, 0x1f, 0x01, 0x0a, 0x01, 0x0a, 0x01, 0x01, 0x01, 0x01, 0x01, \n\t0x01, 0x01, 0x01, 0x1c, 0x01, 0x01, 0x01, 0x01, 0x01, 0x1f, 0x01, 0x01, \n\t0x22, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x1a, 0x01, \n\t0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x31, 0x01, \n\t0x01, 0x2e, 0x01, 0x01, 0x30, 0x01, 0x01, 0x01, 0x01, 0x01, 0x2d, 0x01, \n\t0x01, 0x01, 0x01, 0x22, 0x01, 0x01, 0x01, 0x01, 0x01, 0x31, 0x22, 0x01, \n\t0x01, 0x31, 0x01, 0x0a, 0x01, 0x23, 0x30, 0x01, 0x01, 0x0a, 0x01, 0x01, \n\t0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x1e, 0x01, \n\t0x12, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, \n\t0x0d, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x08, \n\t0x01, 0x01, 0x01, 0x2d, 0x01, 0x05, 0x01, 0x01, 0x01, 0x15, 0x01, 0x14, \n\t0x01, 0x01, 0x2e, 0x01, 0x01, 0x2b, 0x01, 0x2d, 0x01, 0x01, 0x01, 0x12, \n\t0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x22, 0x01, 0x01, 0x2e, 0x01, 0x01, \n\t0x01, 0x23, 0x01, 0x01, 0x01, 0x14, 0x01, 0x1c, 0x01, 0x12, 0x18, 0x01, \n\t0x1f, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x22, 0x01, \n\t0x03, 0x01, 0x01, 0x01, 0x01, 0x11, 0x2b, 0x01, 0x01, 0x01, 0x01, 0x14, \n\t0x01, 0x01, 0x01, 0x01, 0x18, 0x01, 0x01, 0x17, 0x01, 0x01, 0x01, 0x01, \n\t0x01, 0x01, 0x01, 0x01, 0x01, 0x1c, 0x01, 0x01, 0x22, 0x01, 0x01, 0x01, \n\t0x01, 0x01, 0x01, 0x18, 0x23, 0x03, 0x01, 0x2b, 0x01, 0x28, 0x28, 0x01, \n\t0x0c, 0x01, 0x01, 0x01, 0x30, 0x01, 0x22, 0x1e, 0x23, 0x01, 0x23, 0x01, \n\t0x01, 0x32, 0x22, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x1e, \n\t0x0c, 0x01, 0x01, 0x25, 0x1b, 0x01, 0x01, 0x01, 0x18, 0x01, 0x17, 0x01, \n\t0x01, 0x2d, 0x01, 0x29, 0x01, 0x01, 0x01, 0x11, 0x01, 0x01, 0x22, 0x23, \n\t0x01, 0x01, 0x17, 0x01, 0x13, 0x01, 0x01, 0x01, 0x01, 0x15, 0x2c, 0x1e, \n\t0x14, 0x2e, 0x11, 0x01, 0x2b, 0x0a, 0x01, 0x0a, 0x01, 0x23, 0x01, 0x01, \n\t0x01, 0x01, 0x14, 0x01, 0x01, 0x01, 0x01, 0x01, 0x11, 0x01, 0x11, 0x01, \n\t0x01, 0x01, 0x23, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x14, \n\t0x01, 0x03, 0x01, 0x01, 0x1f, 0x01, 0x1f, 0x01, 0x01, 0x01, 0x01, 0x01, \n\t0x20, 0x01, 0x20, 0x01, 0x01, 0x12, 0x01, 0x13, 0x13, 0x01, 0x01, 0x01, \n\t0x01, 0x22, 0x01, 0x22, 0x1e, 0x22, 0x1e, 0x12, 0x01, 0x01, 0x01, 0x01, \n\t0x01, 0x01, 0x01, 0x01, 0x14, 0x2d, 0x01, 0x1c, 0x01, 0x11, 0x1d, 0x23, \n\t0x01, 0x23, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, \n\t0x28, 0x01, 0x01, 0x01, 0x23, 0x01, 0x01, 0x12, 0x01, 0x01, 0x01, 0x01, \n\t0x1f, 0x01, 0x05, 0x1f, 0x01, 0x1f, 0x01, 0x1f, 0x01, 0x01, 0x1f, 0x01, \n\t0x1f, 0x01, 0x1f, 0x01, 0x1f, 0x01, 0x1f, 0x01, 0x1f, 0x01, 0x1f, 0x01, \n\t0x1f, 0x01, 0x1f, 0x01, 0x1f, 0x01, 0x1f, 0x01, 0x1f, 0x01, 0x01, 0x01, \n\t0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, \n\t0x01, 0x01, 0x01, 0x01, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, \n\t0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x1c, 0x01, 0x1c, 0x01, 0x1c, \n\t0x01, 0x1c, 0x01, 0x1c, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, \n\t0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0a, 0x01, 0x0a, 0x01, 0x0a, \n\t0x01, 0x0a, 0x01, 0x22, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x09, \n\t0x01, 0x01, 0x01, 0x01, 0x30, 0x01, 0x01, 0x01, 0x01, 0x01, 0x1c, 0x01, \n\t0x01, 0x01, 0x01, 0x28, 0x01, 0x01, 0x01, 0x18, 0x01, 0x01, 0x01, 0x01, \n\t0x01, 0x01, 0x01, 0x01, 0x01, 0x07, 0x13, 0x2b, 0x13, 0x01, 0x01, 0x01, \n\t0x10, 0x01, 0x01, 0x11, 0x01, 0x2b, 0x28, 0x01, 0x01, 0x18, 0x01, 0x14, \n\t0x01, 0x01, 0x01, 0x01, 0x13, 0x01, 0x01, 0x01, 0x2d, 0x25, 0x01, 0x01, \n\t0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x2f, 0x27, 0x32, \n\t0x01, 0x01, 0x16, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x1c, 0x01, \n\t0x01, 0x13, 0x01, 0x03, 0x2f, 0x16, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, \n\t0x13, 0x01, 0x01, 0x01, 0x01, 0x22, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, \n\t0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, \n\t0x19, 0x01, 0x01, 0x01, 0x01, 0x01, 0x14, 0x01, 0x01, 0x1a, 0x01, 0x01, \n\t0x01, 0x01, 0x2f, 0x1f, 0x01, 0x13, 0x13, 0x01, 0x22, 0x22, 0x22, 0x22, \n\t0x22, 0x22, 0x22, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, \n\t0x13, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x16, 0x22, \n\t0x22, 0x22, 0x01, 0x01, 0x01, 0x01, 0x13, 0x01, 0x01, 0x01, 0x01, 0x01, \n\t0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x16, \n\t0x2f, 0x2f, 0x2f, 0x2f, 0x13, 0x13, 0x13, 0x01, 0x01, 0x01, 0x01, 0x01, \n\t0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, \n\t0x01, 0x01, 0x01, 0x16, 0x16, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, \n\t0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x00, \n\t0x00, 0x00, 0x02, 0x64, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1c, \n\t0x00, 0x04, 0x02, 0x48, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x80, 0x00, 0x06, \n\t0x00, 0x0e, 0x00, 0x0d, 0x00, 0x7e, 0x01, 0x7f, 0x01, 0x92, 0x01, 0xa1, \n\t0x01, 0xb0, 0x01, 0xf0, 0x01, 0xff, 0x02, 0x19, 0x02, 0x37, 0x02, 0xbc, \n\t0x02, 0xc7, 0x02, 0xc9, 0x02, 0xdd, 0x02, 0xf3, 0x03, 0x01, 0x03, 0x03, \n\t0x03, 0x09, 0x03, 0x0f, 0x03, 0x23, 0x03, 0x8a, 0x03, 0x8c, 0x03, 0xa1, \n\t0x03, 0xce, 0x03, 0xd2, 0x03, 0xd6, 0x04, 0x86, 0x05, 0x13, 0x1e, 0x01, \n\t0x1e, 0x3f, 0x1e, 0x85, 0x1e, 0xf9, 0x1f, 0x4d, 0x20, 0x0b, 0x20, 0x15, \n\t0x20, 0x1e, 0x20, 0x22, 0x20, 0x26, 0x20, 0x30, 0x20, 0x33, 0x20, 0x3a, \n\t0x20, 0x3c, 0x20, 0x44, 0x20, 0x74, 0x20, 0x7f, 0x20, 0xa4, 0x20, 0xa7, \n\t0x20, 0xac, 0x21, 0x05, 0x21, 0x13, 0x21, 0x16, 0x21, 0x22, 0x21, 0x26, \n\t0x21, 0x2e, 0x21, 0x5e, 0x22, 0x02, 0x22, 0x06, 0x22, 0x0f, 0x22, 0x12, \n\t0x22, 0x1a, 0x22, 0x1e, 0x22, 0x2b, 0x22, 0x48, 0x22, 0x60, 0x22, 0x65, \n\t0x25, 0xca, 0xf6, 0xc3, 0xfb, 0x04, 0xfe, 0xff, 0xff, 0xfd, 0xff, 0xff, \n\t0x00, 0x00, 0x00, 0x0d, 0x00, 0x20, 0x00, 0xa0, 0x01, 0x92, 0x01, 0xa0, \n\t0x01, 0xaf, 0x01, 0xf0, 0x01, 0xfa, 0x02, 0x18, 0x02, 0x37, 0x02, 0xbc, \n\t0x02, 0xc6, 0x02, 0xc9, 0x02, 0xd8, 0x02, 0xf3, 0x03, 0x00, 0x03, 0x03, \n\t0x03, 0x09, 0x03, 0x0f, 0x03, 0x23, 0x03, 0x84, 0x03, 0x8c, 0x03, 0x8e, \n\t0x03, 0xa3, 0x03, 0xd1, 0x03, 0xd6, 0x04, 0x00, 0x04, 0x88, 0x1e, 0x00, \n\t0x1e, 0x3e, 0x1e, 0x80, 0x1e, 0xa0, 0x1f, 0x4d, 0x20, 0x00, 0x20, 0x13, \n\t0x20, 0x17, 0x20, 0x20, 0x20, 0x25, 0x20, 0x30, 0x20, 0x32, 0x20, 0x39, \n\t0x20, 0x3c, 0x20, 0x44, 0x20, 0x74, 0x20, 0x7f, 0x20, 0xa3, 0x20, 0xa7, \n\t0x20, 0xab, 0x21, 0x05, 0x21, 0x13, 0x21, 0x16, 0x21, 0x22, 0x21, 0x26, \n\t0x21, 0x2e, 0x21, 0x5b, 0x22, 0x02, 0x22, 0x06, 0x22, 0x0f, 0x22, 0x11, \n\t0x22, 0x1a, 0x22, 0x1e, 0x22, 0x2b, 0x22, 0x48, 0x22, 0x60, 0x22, 0x64, \n\t0x25, 0xca, 0xf6, 0xc3, 0xfb, 0x01, 0xfe, 0xff, 0xff, 0xfc, 0xff, 0xff, \n\t0xff, 0xf5, 0xff, 0xe3, 0xff, 0xc2, 0xff, 0xb0, 0xff, 0xa3, 0xff, 0x96, \n\t0xff, 0x57, 0xff, 0x4e, 0xff, 0x36, 0xff, 0x19, 0xfe, 0x95, 0xfe, 0x8c, \n\t0xfd, 0xa8, 0xfe, 0x7c, 0xfe, 0x67, 0xfe, 0x5b, 0xfe, 0x5a, 0xfe, 0x55, \n\t0xfe, 0x50, 0xfe, 0x3d, 0xfd, 0xdd, 0xfd, 0xdc, 0xfd, 0xdb, 0xfd, 0xda, \n\t0xfd, 0xd8, 0xfd, 0xd5, 0xfd, 0xac, 0xfd, 0xab, 0xe4, 0xbf, 0xe4, 0x83, \n\t0xe4, 0x43, 0xe4, 0x29, 0xe3, 0xd6, 0xe3, 0x24, 0xe3, 0x1d, 0xe3, 0x1c, \n\t0xe3, 0x1b, 0xe3, 0x19, 0xe3, 0x10, 0xe3, 0x0f, 0xe3, 0x0a, 0xe3, 0x09, \n\t0xe3, 0x02, 0xe2, 0xd3, 0xe2, 0xc9, 0xe2, 0xa6, 0xe2, 0xa4, 0xe2, 0xa1, \n\t0xe2, 0x49, 0xe2, 0x3c, 0xe2, 0x3a, 0xe2, 0x2f, 0xe0, 0x5d, 0xe2, 0x24, \n\t0xe1, 0xf8, 0xe1, 0x55, 0xdf, 0x69, 0xe1, 0x49, 0xe1, 0x48, 0xe1, 0x41, \n\t0xe1, 0x3e, 0xe1, 0x32, 0xe1, 0x16, 0xe0, 0xff, 0xe0, 0xfc, 0xdd, 0x98, \n\t0x0c, 0xa0, 0x08, 0x63, 0x04, 0x69, 0x03, 0x6d, 0x00, 0x01, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0xf0, \n\t0x00, 0x00, 0x00, 0x0d, 0x00, 0xf3, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x04, \n\t0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, \n\t0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, \n\t0x00, 0x11, 0x00, 0x12, 0x00, 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x16, \n\t0x00, 0x17, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, \n\t0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, \n\t0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, \n\t0x00, 0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, \n\t0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, \n\t0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, \n\t0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, \n\t0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, \n\t0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, \n\t0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, \n\t0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, \n\t0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, \n\t0x00, 0x5f, 0x00, 0x60, 0x00, 0x61, 0x00, 0x00, 0x00, 0x86, 0x00, 0x87, \n\t0x00, 0x89, 0x00, 0x8b, 0x00, 0x93, 0x00, 0x98, 0x00, 0x9e, 0x00, 0xa3, \n\t0x00, 0xa2, 0x00, 0xa4, 0x00, 0xa6, 0x00, 0xa5, 0x00, 0xa7, 0x00, 0xa9, \n\t0x00, 0xab, 0x00, 0xaa, 0x00, 0xac, 0x00, 0xad, 0x00, 0xaf, 0x00, 0xae, \n\t0x00, 0xb0, 0x00, 0xb1, 0x00, 0xb3, 0x00, 0xb5, 0x00, 0xb4, 0x00, 0xb6, \n\t0x00, 0xb8, 0x00, 0xb7, 0x00, 0xbc, 0x00, 0xbb, 0x00, 0xbd, 0x00, 0xbe, \n\t0x03, 0x3b, 0x00, 0x72, 0x00, 0x64, 0x00, 0x65, 0x00, 0x69, 0x03, 0x3d, \n\t0x00, 0x78, 0x00, 0xa1, 0x00, 0x70, 0x00, 0x6b, 0x03, 0x51, 0x00, 0x76, \n\t0x00, 0x6a, 0x03, 0x5f, 0x00, 0x88, 0x00, 0x9a, 0x03, 0x5c, 0x00, 0x73, \n\t0x03, 0x60, 0x03, 0x61, 0x00, 0x67, 0x00, 0x77, 0x03, 0x57, 0x03, 0x59, \n\t0x03, 0x58, 0x01, 0x9a, 0x03, 0x5d, 0x00, 0x6c, 0x00, 0x7c, 0x01, 0x83, \n\t0x00, 0xa8, 0x00, 0xba, 0x00, 0x81, 0x00, 0x63, 0x00, 0x6e, 0x03, 0x5b, \n\t0x01, 0x42, 0x03, 0x5e, 0x01, 0x6f, 0x00, 0x6d, 0x00, 0x7d, 0x03, 0x3f, \n\t0x00, 0x62, 0x00, 0x82, 0x00, 0x85, 0x00, 0x97, 0x01, 0x14, 0x01, 0x15, \n\t0x03, 0x30, 0x03, 0x31, 0x03, 0x38, 0x03, 0x39, 0x03, 0x34, 0x03, 0x35, \n\t0x00, 0xb9, 0x03, 0x62, 0x00, 0xc1, 0x01, 0x3a, 0x03, 0x46, 0x03, 0x4d, \n\t0x03, 0x43, 0x03, 0x44, 0x03, 0x64, 0x03, 0x65, 0x03, 0x3c, 0x00, 0x79, \n\t0x03, 0x36, 0x03, 0x3a, 0x03, 0x40, 0x00, 0x84, 0x00, 0x8c, 0x00, 0x83, \n\t0x00, 0x8d, 0x00, 0x8a, 0x00, 0x8f, 0x00, 0x90, 0x00, 0x91, 0x00, 0x8e, \n\t0x00, 0x95, 0x00, 0x96, 0x00, 0x00, 0x00, 0x94, 0x00, 0x9c, 0x00, 0x9d, \n\t0x00, 0x9b, 0x00, 0xf3, 0x01, 0x52, 0x01, 0x58, 0x00, 0x71, 0x01, 0x54, \n\t0x01, 0x55, 0x01, 0x56, 0x00, 0x7a, 0x01, 0x59, 0x01, 0x57, 0x01, 0x53, \n\t0xb0, 0x00, 0x2c, 0x4b, 0xb0, 0x09, 0x50, 0x58, 0xb1, 0x01, 0x01, 0x8e, \n\t0x59, 0xb8, 0x01, 0xff, 0x85, 0xb0, 0x84, 0x1d, 0xb1, 0x09, 0x03, 0x5f, \n\t0x5e, 0x2d, 0xb0, 0x01, 0x2c, 0x20, 0x20, 0x45, 0x69, 0x44, 0xb0, 0x01, \n\t0x60, 0x2d, 0xb0, 0x02, 0x2c, 0xb0, 0x01, 0x2a, 0x21, 0x2d, 0xb0, 0x03, \n\t0x2c, 0x20, 0x46, 0xb0, 0x03, 0x25, 0x46, 0x52, 0x58, 0x23, 0x59, 0x20, \n\t0x8a, 0x20, 0x8a, 0x49, 0x64, 0x8a, 0x20, 0x46, 0x20, 0x68, 0x61, 0x64, \n\t0xb0, 0x04, 0x25, 0x46, 0x20, 0x68, 0x61, 0x64, 0x52, 0x58, 0x23, 0x65, \n\t0x8a, 0x59, 0x2f, 0x20, 0xb0, 0x00, 0x53, 0x58, 0x69, 0x20, 0xb0, 0x00, \n\t0x54, 0x58, 0x21, 0xb0, 0x40, 0x59, 0x1b, 0x69, 0x20, 0xb0, 0x00, 0x54, \n\t0x58, 0x21, 0xb0, 0x40, 0x65, 0x59, 0x59, 0x3a, 0x2d, 0xb0, 0x04, 0x2c, \n\t0x20, 0x46, 0xb0, 0x04, 0x25, 0x46, 0x52, 0x58, 0x23, 0x8a, 0x59, 0x20, \n\t0x46, 0x20, 0x6a, 0x61, 0x64, 0xb0, 0x04, 0x25, 0x46, 0x20, 0x6a, 0x61, \n\t0x64, 0x52, 0x58, 0x23, 0x8a, 0x59, 0x2f, 0xfd, 0x2d, 0xb0, 0x05, 0x2c, \n\t0x4b, 0x20, 0xb0, 0x03, 0x26, 0x50, 0x58, 0x51, 0x58, 0xb0, 0x80, 0x44, \n\t0x1b, 0xb0, 0x40, 0x44, 0x59, 0x1b, 0x21, 0x21, 0x20, 0x45, 0xb0, 0xc0, \n\t0x50, 0x58, 0xb0, 0xc0, 0x44, 0x1b, 0x21, 0x59, 0x59, 0x2d, 0xb0, 0x06, \n\t0x2c, 0x20, 0x20, 0x45, 0x69, 0x44, 0xb0, 0x01, 0x60, 0x20, 0x20, 0x45, \n\t0x7d, 0x69, 0x18, 0x44, 0xb0, 0x01, 0x60, 0x2d, 0xb0, 0x07, 0x2c, 0xb0, \n\t0x06, 0x2a, 0x2d, 0xb0, 0x08, 0x2c, 0x4b, 0x20, 0xb0, 0x03, 0x26, 0x53, \n\t0x58, 0xb0, 0x40, 0x1b, 0xb0, 0x00, 0x59, 0x8a, 0x8a, 0x20, 0xb0, 0x03, \n\t0x26, 0x53, 0x58, 0x23, 0x21, 0xb0, 0x80, 0x8a, 0x8a, 0x1b, 0x8a, 0x23, \n\t0x59, 0x20, 0xb0, 0x03, 0x26, 0x53, 0x58, 0x23, 0x21, 0xb0, 0xc0, 0x8a, \n\t0x8a, 0x1b, 0x8a, 0x23, 0x59, 0x20, 0xb0, 0x03, 0x26, 0x53, 0x58, 0x23, \n\t0x21, 0xb8, 0x01, 0x00, 0x8a, 0x8a, 0x1b, 0x8a, 0x23, 0x59, 0x20, 0xb0, \n\t0x03, 0x26, 0x53, 0x58, 0x23, 0x21, 0xb8, 0x01, 0x40, 0x8a, 0x8a, 0x1b, \n\t0x8a, 0x23, 0x59, 0x20, 0xb0, 0x03, 0x26, 0x53, 0x58, 0xb0, 0x03, 0x25, \n\t0x45, 0xb8, 0x01, 0x80, 0x50, 0x58, 0x23, 0x21, 0xb8, 0x01, 0x80, 0x23, \n\t0x21, 0x1b, 0xb0, 0x03, 0x25, 0x45, 0x23, 0x21, 0x23, 0x21, 0x59, 0x1b, \n\t0x21, 0x59, 0x44, 0x2d, 0xb0, 0x09, 0x2c, 0x4b, 0x53, 0x58, 0x45, 0x44, \n\t0x1b, 0x21, 0x21, 0x59, 0x2d, 0xb0, 0x0a, 0x2c, 0xb0, 0x16, 0x45, 0x2d, \n\t0xb0, 0x0b, 0x2c, 0xb0, 0x17, 0x45, 0x2d, 0xb0, 0x0c, 0x2c, 0xb1, 0x27, \n\t0x01, 0x88, 0x20, 0x8a, 0x53, 0x58, 0xb9, 0x40, 0x00, 0x04, 0x00, 0x63, \n\t0xb8, 0x08, 0x00, 0x88, 0x54, 0x58, 0xb9, 0x00, 0x16, 0x03, 0xe8, 0x70, \n\t0x59, 0x1b, 0xb0, 0x23, 0x53, 0x58, 0xb0, 0x20, 0x88, 0xb8, 0x10, 0x00, \n\t0x54, 0x58, 0xb9, 0x00, 0x16, 0x03, 0xe8, 0x70, 0x59, 0x59, 0x59, 0x2d, \n\t0xb0, 0x0d, 0x2c, 0xb0, 0x40, 0x88, 0xb8, 0x20, 0x00, 0x5a, 0x58, 0xb1, \n\t0x17, 0x00, 0x44, 0x1b, 0xb9, 0x00, 0x17, 0x03, 0xe8, 0x44, 0x59, 0x2d, \n\t0xb0, 0x0c, 0x2b, 0xb0, 0x00, 0x2b, 0x00, 0xb2, 0x01, 0x05, 0x02, 0x2b, \n\t0x00, 0xb7, 0x01, 0x5d, 0x4c, 0x3b, 0x27, 0x1a, 0x00, 0x08, 0x2b, 0xb7, \n\t0x02, 0x49, 0x3c, 0x2f, 0x22, 0x13, 0x00, 0x08, 0x2b, 0xb7, 0x03, 0x49, \n\t0x3c, 0x2f, 0x22, 0x13, 0x00, 0x08, 0x2b, 0xb7, 0x04, 0x38, 0x2e, 0x24, \n\t0x1a, 0x0f, 0x00, 0x08, 0x2b, 0xb7, 0x05, 0x51, 0x42, 0x34, 0x25, 0x16, \n\t0x00, 0x08, 0x2b, 0x00, 0xb2, 0x06, 0x08, 0x07, 0x2b, 0xb0, 0x00, 0x20, \n\t0x45, 0x7d, 0x69, 0x18, 0x44, 0xb2, 0xd0, 0x08, 0x01, 0x73, 0xb2, 0x20, \n\t0x08, 0x01, 0x74, 0xb2, 0x30, 0x08, 0x01, 0x73, 0xb2, 0x80, 0x08, 0x01, \n\t0x73, 0xb2, 0x70, 0x08, 0x01, 0x73, 0xb2, 0x5f, 0x0a, 0x01, 0x73, 0xb2, \n\t0x7f, 0x0a, 0x01, 0x73, 0xb2, 0x2f, 0x0a, 0x01, 0x74, 0xb2, 0x4f, 0x0a, \n\t0x01, 0x74, 0xb2, 0x6f, 0x0a, 0x01, 0x74, 0xb2, 0x8f, 0x0a, 0x01, 0x74, \n\t0xb2, 0xaf, 0x0a, 0x01, 0x74, 0xb2, 0x7f, 0x0a, 0x01, 0x75, 0xb2, 0xff, \n\t0x0a, 0x01, 0x74, 0xb2, 0x1f, 0x0a, 0x01, 0x75, 0xb2, 0x3f, 0x0a, 0x01, \n\t0x75, 0xb2, 0x5f, 0x0a, 0x01, 0x75, 0xb2, 0x3f, 0x0a, 0x01, 0x73, 0xb2, \n\t0x0f, 0x0c, 0x01, 0x73, 0xb2, 0x7f, 0x0c, 0x01, 0x73, 0xb2, 0xef, 0x0c, \n\t0x01, 0x73, 0xb2, 0x1f, 0x0c, 0x01, 0x74, 0xb2, 0x5f, 0x0c, 0x01, 0x74, \n\t0xb2, 0x8f, 0x0c, 0x01, 0x74, 0xb2, 0xcf, 0x0c, 0x01, 0x74, 0xb2, 0xff, \n\t0x0c, 0x01, 0x74, 0xb2, 0x3f, 0x0c, 0x01, 0x75, 0xb2, 0x6f, 0x0c, 0x01, \n\t0x75, 0xb2, 0xbf, 0x0e, 0x01, 0x73, 0xb2, 0x2f, 0x0e, 0x01, 0x74, 0xb2, \n\t0x9f, 0x0e, 0x01, 0x74, 0xb2, 0xbf, 0x0e, 0x01, 0x74, 0xb2, 0x0f, 0x0e, \n\t0x01, 0x75, 0xb2, 0x2f, 0x0e, 0x01, 0x75, 0xb2, 0x2f, 0x10, 0x01, 0x73, \n\t0xb2, 0x5f, 0x10, 0x01, 0x73, 0xb2, 0xff, 0x10, 0x01, 0x73, 0xb2, 0xcf, \n\t0x10, 0x01, 0x74, 0xb2, 0x3f, 0x12, 0x01, 0x73, 0xb2, 0x0f, 0x12, 0x01, \n\t0x73, 0xb2, 0xb0, 0x12, 0x01, 0x73, 0xb2, 0x7f, 0x12, 0x01, 0x73, 0xb2, \n\t0x0f, 0x12, 0x01, 0x74, 0xb2, 0x5f, 0x12, 0x01, 0x74, 0xb2, 0x7f, 0x12, \n\t0x01, 0x75, 0xb2, 0xdf, 0x12, 0x01, 0x74, 0xb2, 0x6f, 0x12, 0x01, 0x75, \n\t0xb2, 0x2f, 0x12, 0x01, 0x75, 0xb2, 0x3f, 0x12, 0x01, 0x75, 0xb2, 0xef, \n\t0x12, 0x01, 0x74, 0xb2, 0x9f, 0x12, 0x01, 0x74, 0xb2, 0x1f, 0x12, 0x01, \n\t0x74, 0xb2, 0xef, 0x12, 0x01, 0x73, 0xb2, 0x0f, 0x14, 0x01, 0x73, 0xb2, \n\t0x1f, 0x14, 0x01, 0x73, 0xb2, 0x2f, 0x14, 0x01, 0x73, 0xb2, 0x3f, 0x14, \n\t0x01, 0x73, 0xb2, 0x5f, 0x14, 0x01, 0x73, 0xb2, 0x6f, 0x14, 0x01, 0x73, \n\t0xb2, 0x7f, 0x14, 0x01, 0x73, 0xb2, 0xaf, 0x14, 0x01, 0x73, 0xb2, 0x8f, \n\t0x14, 0x01, 0x74, 0xb2, 0xaf, 0x14, 0x01, 0x74, 0xb2, 0xbf, 0x14, 0x01, \n\t0x74, 0xb2, 0xcf, 0x14, 0x01, 0x74, 0xb2, 0x2f, 0x14, 0x01, 0x75, 0xb2, \n\t0x3f, 0x14, 0x01, 0x75, 0x00, 0x2a, 0x00, 0x7a, 0x00, 0x9b, 0x00, 0xa6, \n\t0x00, 0xcc, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x15, 0xfe, 0x60, 0x00, 0x15, \n\t0x04, 0x3a, 0x00, 0x14, 0x05, 0xb0, 0x00, 0x15, 0x04, 0x8d, 0x00, 0x10, \n\t0x03, 0x21, 0x00, 0x0b, 0x06, 0x35, 0x00, 0x25, 0x07, 0x22, 0x00, 0x15, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x2c, 0x00, 0x4c, 0x00, 0xc6, 0x01, 0x32, 0x01, 0xc2, \n\t0x02, 0x4e, 0x02, 0x62, 0x02, 0x8c, 0x02, 0xb6, 0x02, 0xe6, 0x03, 0x0c, \n\t0x03, 0x24, 0x03, 0x3c, 0x03, 0x56, 0x03, 0x6e, 0x03, 0xbc, 0x03, 0xe8, \n\t0x04, 0x3e, 0x04, 0xb8, 0x04, 0xfe, 0x05, 0x5e, 0x05, 0xc6, 0x05, 0xfc, \n\t0x06, 0x76, 0x06, 0xde, 0x06, 0xf4, 0x07, 0x0a, 0x07, 0x2e, 0x07, 0x56, \n\t0x07, 0x7a, 0x07, 0xcc, 0x08, 0x72, 0x08, 0xc0, 0x09, 0x20, 0x09, 0x72, \n\t0x09, 0xb6, 0x09, 0xfe, 0x0a, 0x58, 0x0a, 0xba, 0x0b, 0x24, 0x0b, 0x40, \n\t0x0b, 0x72, 0x0b, 0xd2, 0x0b, 0xf6, 0x0c, 0x5c, 0x0c, 0xb2, 0x0d, 0x04, \n\t0x0d, 0x4a, 0x0d, 0xa6, 0x0e, 0x08, 0x0e, 0x6e, 0x0e, 0x9a, 0x0e, 0xd6, \n\t0x0f, 0x10, 0x0f, 0x7e, 0x0f, 0xce, 0x10, 0x10, 0x10, 0x46, 0x10, 0x6c, \n\t0x10, 0x84, 0x10, 0xa8, 0x10, 0xca, 0x10, 0xe6, 0x11, 0x1c, 0x11, 0x94, \n\t0x11, 0xf0, 0x12, 0x3a, 0x12, 0x96, 0x12, 0xfc, 0x13, 0x4c, 0x13, 0xc0, \n\t0x14, 0x02, 0x14, 0x30, 0x14, 0x7a, 0x14, 0xc2, 0x14, 0xda, 0x15, 0x48, \n\t0x15, 0x8e, 0x15, 0xd8, 0x16, 0x36, 0x16, 0x92, 0x16, 0xd0, 0x17, 0x4a, \n\t0x17, 0x9a, 0x17, 0xde, 0x18, 0x14, 0x18, 0x80, 0x18, 0xc8, 0x19, 0x1a, \n\t0x19, 0x50, 0x19, 0x8e, 0x19, 0xa6, 0x19, 0xe0, 0x1a, 0x26, 0x1a, 0x26, \n\t0x1a, 0x4c, 0x1a, 0xa4, 0x1b, 0x0a, 0x1b, 0x6e, 0x1b, 0xce, 0x1b, 0xf4, \n\t0x1c, 0x8a, 0x1c, 0xb0, 0x1d, 0x44, 0x1d, 0xc0, 0x1d, 0xcc, 0x1d, 0xe6, \n\t0x1d, 0xee, 0x1e, 0x92, 0x1e, 0xac, 0x1e, 0xec, 0x1f, 0x2e, 0x1f, 0x7e, \n\t0x1f, 0xf8, 0x20, 0x2e, 0x20, 0x7e, 0x20, 0xa4, 0x20, 0xba, 0x20, 0xea, \n\t0x21, 0x14, 0x21, 0x72, 0x21, 0x7e, 0x21, 0xa0, 0x21, 0xc2, 0x21, 0xe4, \n\t0x22, 0x30, 0x22, 0x48, 0x22, 0x60, 0x22, 0x76, 0x22, 0x8c, 0x22, 0xa8, \n\t0x22, 0xda, 0x23, 0x6e, 0x23, 0x7a, 0x23, 0x92, 0x23, 0xaa, 0x23, 0xc0, \n\t0x23, 0xdc, 0x23, 0xf4, 0x24, 0x0c, 0x24, 0x22, 0x24, 0x3e, 0x24, 0xa8, \n\t0x24, 0xbe, 0x24, 0xd6, 0x24, 0xee, 0x25, 0x04, 0x25, 0x1a, 0x25, 0x32, \n\t0x25, 0x60, 0x25, 0xdc, 0x25, 0xf4, 0x26, 0x0c, 0x26, 0x22, 0x26, 0x3e, \n\t0x26, 0x56, 0x26, 0x9e, 0x26, 0xf8, 0x27, 0x0a, 0x27, 0x24, 0x27, 0x40, \n\t0x27, 0x5e, 0x27, 0x82, 0x27, 0xd8, 0x28, 0x86, 0x28, 0x92, 0x28, 0xa4, \n\t0x28, 0xbc, 0x28, 0xdc, 0x29, 0x08, 0x29, 0x28, 0x29, 0x48, 0x29, 0x62, \n\t0x29, 0x8a, 0x29, 0xee, 0x2a, 0x0c, 0x2a, 0x1e, 0x2a, 0x38, 0x2a, 0x54, \n\t0x2a, 0x72, 0x2a, 0x96, 0x2a, 0xd0, 0x2b, 0x48, 0x2b, 0x68, 0x2b, 0x88, \n\t0x2b, 0xa0, 0x2b, 0xc6, 0x2b, 0xe6, 0x2c, 0x42, 0x2c, 0x68, 0x2c, 0x78, \n\t0x2c, 0x84, 0x2c, 0x9a, 0x2c, 0xc2, 0x2c, 0xce, 0x2c, 0xda, 0x2c, 0xf2, \n\t0x2d, 0x0c, 0x2d, 0x22, 0x2d, 0x3e, 0x2d, 0x54, 0x2d, 0x6e, 0x2d, 0x84, \n\t0x2d, 0xa2, 0x2d, 0xb8, 0x2d, 0xe0, 0x2e, 0x4a, 0x2e, 0xc6, 0x2e, 0xd8, \n\t0x2e, 0xe4, 0x2e, 0xfa, 0x2f, 0x20, 0x2f, 0x36, 0x2f, 0x52, 0x2f, 0x5e, \n\t0x2f, 0x6a, 0x2f, 0x80, 0x2f, 0x9e, 0x2f, 0xb4, 0x2f, 0xd0, 0x2f, 0xe6, \n\t0x30, 0x0e, 0x30, 0x24, 0x30, 0x3e, 0x30, 0x4a, 0x30, 0x66, 0x30, 0x7c, \n\t0x30, 0xac, 0x31, 0x10, 0x31, 0x76, 0x31, 0x8c, 0x31, 0xaa, 0x31, 0xbc, \n\t0x31, 0xc8, 0x31, 0xde, 0x31, 0xfc, 0x32, 0x08, 0x32, 0x14, 0x32, 0x2a, \n\t0x32, 0x46, 0x32, 0x52, 0x32, 0x5e, 0x32, 0x74, 0x32, 0x8c, 0x32, 0x98, \n\t0x32, 0xa4, 0x33, 0x0a, 0x33, 0x22, 0x33, 0x54, 0x33, 0x60, 0x33, 0x6c, \n\t0x33, 0x82, 0x33, 0xac, 0x33, 0xbc, 0x33, 0xcc, 0x34, 0x16, 0x34, 0x52, \n\t0x34, 0x6a, 0x34, 0x84, 0x34, 0x90, 0x34, 0x9c, 0x34, 0xb2, 0x34, 0xd0, \n\t0x34, 0xe0, 0x35, 0x38, 0x35, 0x94, 0x35, 0xb8, 0x35, 0xc4, 0x35, 0xda, \n\t0x36, 0x02, 0x36, 0x1e, 0x36, 0x40, 0x36, 0xc8, 0x37, 0x6c, 0x37, 0x84, \n\t0x37, 0x9e, 0x37, 0xaa, 0x37, 0xb6, 0x37, 0xcc, 0x37, 0xea, 0x38, 0x02, \n\t0x38, 0x1c, 0x38, 0x32, 0x38, 0x4e, 0x38, 0x5a, 0x38, 0x66, 0x38, 0x7c, \n\t0x38, 0x9a, 0x38, 0xac, 0x38, 0xb8, 0x38, 0xce, 0x38, 0xe4, 0x39, 0x26, \n\t0x39, 0x94, 0x39, 0xaa, 0x39, 0xc6, 0x39, 0xd8, 0x39, 0xe4, 0x39, 0xfa, \n\t0x3a, 0x22, 0x3a, 0x54, 0x3a, 0xa4, 0x3a, 0xc0, 0x3a, 0xd4, 0x3a, 0xe0, \n\t0x3a, 0xec, 0x3b, 0x02, 0x3b, 0x1a, 0x3b, 0x30, 0x3b, 0x46, 0x3b, 0x62, \n\t0x3b, 0x7a, 0x3b, 0x9a, 0x3b, 0xb0, 0x3b, 0xd8, 0x3b, 0xee, 0x3c, 0x04, \n\t0x3c, 0x32, 0x3c, 0x9a, 0x3c, 0xf8, 0x3d, 0x50, 0x3d, 0xa0, 0x3d, 0xfe, \n\t0x3e, 0x16, 0x3e, 0x4e, 0x3e, 0x5a, 0x3e, 0x72, 0x3e, 0x8a, 0x3e, 0xa0, \n\t0x3e, 0xbe, 0x3e, 0xca, 0x3e, 0xd6, 0x3f, 0x08, 0x3f, 0x14, 0x3f, 0x4c, \n\t0x3f, 0x84, 0x3f, 0xc4, 0x3f, 0xdc, 0x40, 0x1e, 0x40, 0x54, 0x40, 0x9c, \n\t0x40, 0xd4, 0x41, 0x12, 0x41, 0x28, 0x41, 0x3e, 0x41, 0x48, 0x41, 0x80, \n\t0x41, 0xac, 0x41, 0xc8, 0x41, 0xe4, 0x42, 0x12, 0x42, 0x1e, 0x42, 0x2a, \n\t0x42, 0x36, 0x42, 0x42, 0x42, 0x4e, 0x42, 0x5a, 0x42, 0x66, 0x42, 0x72, \n\t0x42, 0x7e, 0x42, 0x86, 0x42, 0x8e, 0x42, 0xb6, 0x42, 0xee, 0x42, 0xf6, \n\t0x42, 0xfe, 0x43, 0x06, 0x43, 0x7a, 0x43, 0x82, 0x43, 0x8a, 0x43, 0xc2, \n\t0x43, 0xca, 0x43, 0xd2, 0x44, 0x1a, 0x44, 0x22, 0x44, 0x52, 0x44, 0x5a, \n\t0x44, 0xa2, 0x44, 0xaa, 0x44, 0xb2, 0x45, 0x24, 0x45, 0x2c, 0x45, 0x82, \n\t0x45, 0xe8, 0x46, 0x04, 0x46, 0x20, 0x46, 0x2c, 0x46, 0x38, 0x46, 0x44, \n\t0x46, 0x50, 0x46, 0x68, 0x46, 0xde, 0x47, 0x4a, 0x47, 0x8c, 0x47, 0xf4, \n\t0x48, 0x7a, 0x48, 0xd4, 0x49, 0x1a, 0x49, 0x8c, 0x49, 0xbe, 0x49, 0xc6, \n\t0x4a, 0x32, 0x4a, 0x3a, 0x4a, 0x42, 0x4a, 0xb4, 0x4a, 0xbc, 0x4b, 0x0c, \n\t0x4b, 0x62, 0x4b, 0xbe, 0x4c, 0x16, 0x4c, 0x42, 0x4c, 0x84, 0x4c, 0xec, \n\t0x4d, 0x6a, 0x4d, 0xc8, 0x4e, 0x2c, 0x4e, 0x54, 0x4e, 0x7a, 0x4e, 0x86, \n\t0x4e, 0x92, 0x4e, 0x9e, 0x4f, 0x02, 0x4f, 0x74, 0x4f, 0xe8, 0x50, 0x00, \n\t0x50, 0x1c, 0x50, 0x7e, 0x50, 0x96, 0x51, 0x0c, 0x51, 0x72, 0x51, 0x7a, \n\t0x51, 0x96, 0x51, 0x9e, 0x52, 0x0a, 0x52, 0x70, 0x52, 0xc0, 0x52, 0xd8, \n\t0x52, 0xf0, 0x53, 0x06, 0x53, 0x44, 0x53, 0x4c, 0x53, 0x9c, 0x53, 0xa4, \n\t0x53, 0xac, 0x53, 0xfe, 0x54, 0x06, 0x54, 0x64, 0x54, 0xde, 0x55, 0x34, \n\t0x55, 0x4a, 0x55, 0x52, 0x55, 0x96, 0x55, 0x9e, 0x55, 0xa6, 0x55, 0xae, \n\t0x55, 0xb6, 0x55, 0xbe, 0x55, 0xc6, 0x55, 0xce, 0x56, 0x1e, 0x56, 0x84, \n\t0x56, 0x8c, 0x56, 0xc2, 0x57, 0x02, 0x57, 0x3a, 0x57, 0x78, 0x57, 0xca, \n\t0x58, 0x24, 0x58, 0x6a, 0x58, 0xcc, 0x59, 0x5c, 0x59, 0xb4, 0x59, 0xbc, \n\t0x5a, 0x32, 0x5a, 0xb0, 0x5a, 0xd8, 0x5b, 0x28, 0x5b, 0x30, 0x5b, 0x90, \n\t0x5c, 0x08, 0x5c, 0x58, 0x5c, 0x80, 0x5c, 0xe6, 0x5d, 0x28, 0x5d, 0x86, \n\t0x5d, 0xee, 0x5d, 0xf6, 0x5e, 0x26, 0x5e, 0x2e, 0x5e, 0x78, 0x5e, 0xa4, \n\t0x5e, 0xac, 0x5f, 0x34, 0x5f, 0x3c, 0x5f, 0x70, 0x5f, 0xb2, 0x5f, 0xee, \n\t0x60, 0x30, 0x60, 0x80, 0x60, 0xd8, 0x61, 0x1a, 0x61, 0x90, 0x62, 0x1a, \n\t0x62, 0x6e, 0x62, 0x80, 0x62, 0xac, 0x63, 0x28, 0x63, 0x48, 0x63, 0xca, \n\t0x63, 0xd2, 0x63, 0xda, 0x64, 0x02, 0x64, 0x0a, 0x64, 0x74, 0x64, 0xd8, \n\t0x65, 0x3a, 0x65, 0x5a, 0x65, 0x7a, 0x65, 0xa0, 0x65, 0xdc, 0x66, 0x38, \n\t0x66, 0x94, 0x66, 0xee, 0x67, 0x4c, 0x67, 0xd0, 0x68, 0x62, 0x68, 0xb8, \n\t0x69, 0x14, 0x69, 0x7a, 0x69, 0xf4, 0x6a, 0x64, 0x6a, 0xd0, 0x6b, 0x50, \n\t0x6b, 0xce, 0x6c, 0x66, 0x6d, 0x16, 0x6d, 0x1e, 0x6d, 0x26, 0x6d, 0x8e, \n\t0x6d, 0xf8, 0x6e, 0x42, 0x6e, 0x94, 0x6e, 0xb0, 0x6e, 0xc6, 0x6e, 0xd2, \n\t0x6e, 0xde, 0x6f, 0x62, 0x6f, 0xe2, 0x70, 0x98, 0x71, 0x4e, 0x71, 0xc2, \n\t0x72, 0x38, 0x72, 0x84, 0x72, 0xcc, 0x73, 0x02, 0x73, 0x1e, 0x73, 0x50, \n\t0x73, 0x68, 0x73, 0x80, 0x74, 0x86, 0x74, 0xf0, 0x75, 0x0a, 0x75, 0x36, \n\t0x75, 0x90, 0x75, 0xf4, 0x76, 0x50, 0x76, 0xcc, 0x76, 0xf8, 0x77, 0x24, \n\t0x77, 0x62, 0x77, 0xa6, 0x77, 0xfa, 0x78, 0x44, 0x78, 0x50, 0x78, 0x5c, \n\t0x78, 0x68, 0x78, 0x74, 0x78, 0x80, 0x78, 0x8c, 0x78, 0xf2, 0x79, 0x60, \n\t0x79, 0xd4, 0x7a, 0x36, 0x7a, 0x94, 0x7a, 0xf2, 0x7a, 0xfe, 0x7b, 0x0a, \n\t0x7b, 0x7c, 0x7b, 0xec, 0x7c, 0x44, 0x7c, 0x92, 0x7d, 0x32, 0x7d, 0xd0, \n\t0x7d, 0xdc, 0x7d, 0xe8, 0x7d, 0xf4, 0x7e, 0x00, 0x7e, 0x08, 0x7e, 0x10, \n\t0x7e, 0x6a, 0x7e, 0xc6, 0x7e, 0xd2, 0x7e, 0xde, 0x7f, 0x24, 0x7f, 0x6a, \n\t0x7f, 0x76, 0x7f, 0x82, 0x7f, 0xd4, 0x80, 0x28, 0x80, 0x68, 0x80, 0x7c, \n\t0x80, 0xee, 0x81, 0x60, 0x81, 0x6c, 0x81, 0x78, 0x81, 0x80, 0x81, 0x96, \n\t0x81, 0xbe, 0x82, 0x16, 0x82, 0x68, 0x82, 0x74, 0x82, 0x80, 0x83, 0x02, \n\t0x83, 0x82, 0x83, 0x8e, 0x83, 0x9a, 0x83, 0xa6, 0x83, 0xb2, 0x83, 0xbe, \n\t0x83, 0xca, 0x83, 0xd2, 0x83, 0xe8, 0x84, 0x10, 0x84, 0x2c, 0x84, 0x50, \n\t0x84, 0x58, 0x84, 0x60, 0x84, 0x76, 0x84, 0x9c, 0x84, 0xfc, 0x85, 0x12, \n\t0x85, 0x64, 0x85, 0x92, 0x85, 0xae, 0x85, 0xd6, 0x85, 0xf2, 0x86, 0x1c, \n\t0x86, 0x74, 0x86, 0xc6, 0x86, 0xd8, 0x86, 0xe4, 0x87, 0x00, 0x87, 0x26, \n\t0x87, 0x42, 0x87, 0x66, 0x87, 0x6e, 0x87, 0x76, 0x87, 0x92, 0x87, 0xe0, \n\t0x87, 0xfc, 0x88, 0x20, 0x88, 0x32, 0x88, 0x3e, 0x88, 0x5a, 0x88, 0x80, \n\t0x88, 0x9c, 0x88, 0xb0, 0x88, 0xcc, 0x88, 0xf2, 0x88, 0xfe, 0x89, 0x0a, \n\t0x89, 0x2a, 0x89, 0x56, 0x89, 0x66, 0x89, 0x76, 0x89, 0x82, 0x89, 0x8e, \n\t0x89, 0xe8, 0x8a, 0x40, 0x8a, 0x82, 0x8a, 0x8a, 0x8a, 0xe2, 0x8b, 0x62, \n\t0x8b, 0xd2, 0x8c, 0x40, 0x8c, 0x9e, 0x8c, 0xfc, 0x8d, 0x64, 0x8d, 0xca, \n\t0x8e, 0x5a, 0x8e, 0xe6, 0x8f, 0x3e, 0x8f, 0x90, 0x8f, 0xe0, 0x90, 0x2e, \n\t0x90, 0xa6, 0x90, 0xae, 0x90, 0xba, 0x90, 0xc6, 0x90, 0xd2, 0x90, 0xde, \n\t0x90, 0xf6, 0x91, 0x10, 0x91, 0x28, 0x91, 0x48, 0x91, 0x60, 0x91, 0x80, \n\t0x91, 0x9c, 0x91, 0xc4, 0x91, 0xd0, 0x91, 0xdc, 0x91, 0xf2, 0x92, 0x04, \n\t0x92, 0x1e, 0x92, 0x34, 0x92, 0x4e, 0x92, 0x62, 0x92, 0x88, 0x92, 0x9c, \n\t0x92, 0xc2, 0x92, 0xd6, 0x92, 0xf0, 0x93, 0x10, 0x93, 0x28, 0x93, 0x3e, \n\t0x93, 0x56, 0x93, 0x6a, 0x93, 0x82, 0x93, 0x9a, 0x93, 0xb2, 0x93, 0xce, \n\t0x93, 0xe8, 0x94, 0x14, 0x94, 0x20, 0x94, 0x2c, 0x94, 0x42, 0x94, 0x54, \n\t0x94, 0x6a, 0x94, 0x8a, 0x94, 0xa4, 0x94, 0xb8, 0x94, 0xd2, 0x94, 0xe6, \n\t0x95, 0x0c, 0x95, 0x20, 0x95, 0x46, 0x95, 0x5a, 0x95, 0x74, 0x95, 0x96, \n\t0x95, 0xac, 0x95, 0xbe, 0x95, 0xca, 0x95, 0xd6, 0x95, 0xe2, 0x95, 0xee, \n\t0x96, 0x04, 0x96, 0x16, 0x96, 0x30, 0x96, 0x44, 0x96, 0x5e, 0x96, 0x72, \n\t0x96, 0x8c, 0x96, 0xa0, 0x96, 0xba, 0x96, 0xce, 0x96, 0xe8, 0x97, 0x08, \n\t0x97, 0x38, 0x97, 0x52, 0x97, 0x82, 0x97, 0x94, 0x97, 0xaa, 0x97, 0xbc, \n\t0x97, 0xd2, 0x97, 0xf0, 0x97, 0xfc, 0x98, 0x08, 0x98, 0x14, 0x98, 0x20, \n\t0x98, 0x36, 0x98, 0x42, 0x98, 0x5a, 0x98, 0x7a, 0x98, 0x86, 0x98, 0xa6, \n\t0x98, 0xbc, 0x98, 0xce, 0x98, 0xe4, 0x99, 0x00, 0x99, 0x0c, 0x99, 0x18, \n\t0x99, 0x30, 0x99, 0x50, 0x99, 0x5c, 0x99, 0x68, 0x99, 0x7e, 0x99, 0x8a, \n\t0x99, 0xa0, 0x99, 0xbc, 0x99, 0xc8, 0x99, 0xc8, 0x99, 0xc8, 0x99, 0xc8, \n\t0x99, 0xc8, 0x99, 0xc8, 0x99, 0xc8, 0x99, 0xc8, 0x99, 0xc8, 0x99, 0xc8, \n\t0x99, 0xc8, 0x99, 0xc8, 0x99, 0xc8, 0x99, 0xd2, 0x99, 0xdc, 0x99, 0xe6, \n\t0x99, 0xfe, 0x9a, 0x12, 0x9a, 0x26, 0x9a, 0x3a, 0x9a, 0x46, 0x9a, 0x52, \n\t0x9a, 0x5e, 0x9a, 0x7e, 0x9a, 0xbe, 0x9b, 0x20, 0x9b, 0x40, 0x9b, 0x4c, \n\t0x9b, 0x5c, 0x9c, 0x26, 0x9c, 0x2e, 0x9c, 0x36, 0x9c, 0x4e, 0x9c, 0x68, \n\t0x9c, 0x74, 0x9c, 0x88, 0x9c, 0xc6, 0x9d, 0x02, 0x9d, 0x0e, 0x9d, 0x9e, \n\t0x9e, 0x22, 0x9e, 0x2e, 0x9e, 0xac, 0x9f, 0x38, 0x9f, 0xa2, 0x9f, 0xb2, \n\t0xa0, 0x12, 0xa0, 0x72, 0xa0, 0x98, 0xa0, 0xbe, 0xa0, 0xe4, 0xa1, 0x0a, \n\t0xa1, 0x5c, 0xa1, 0x84, 0xa1, 0xbe, 0xa1, 0xd6, 0xa2, 0x10, 0xa2, 0x90, \n\t0xa2, 0xd4, 0xa3, 0x5e, 0xa3, 0x9e, 0xa3, 0xc8, 0xa3, 0xf2, 0xa4, 0x2c, \n\t0xa4, 0x4a, 0xa4, 0xae, 0xa4, 0xba, 0xa4, 0xc6, 0xa4, 0xd6, 0xa4, 0xd6, \n\t0xa6, 0xbc, 0xa7, 0x02, 0xa7, 0x14, 0xa7, 0x38, 0xa7, 0xa8, 0xa8, 0x0c, \n\t0xa8, 0x70, 0xa8, 0xb4, 0xa9, 0x34, 0xa9, 0x86, 0xa9, 0xb2, 0xa9, 0xfc, \n\t0xaa, 0x36, 0xaa, 0x86, 0xaa, 0xd6, 0xab, 0x3a, 0xab, 0x72, 0xab, 0xae, \n\t0xab, 0xda, 0xac, 0x46, 0xac, 0xae, 0xad, 0x06, 0xad, 0x56, 0xad, 0xa2, \n\t0xad, 0xf4, 0xae, 0x0c, 0xae, 0x6e, 0xae, 0x92, 0xae, 0xfa, 0xaf, 0x2c, \n\t0xaf, 0x48, 0xaf, 0x96, 0xaf, 0xf2, 0xb0, 0x30, 0xb0, 0x74, 0xb0, 0xb4, \n\t0xb1, 0x02, 0xb1, 0x72, 0xb1, 0x8a, 0xb1, 0xdc, 0xb2, 0x28, 0xb2, 0x66, \n\t0xb2, 0xa2, 0xb3, 0x12, 0xb3, 0x8a, 0xb3, 0xe0, 0xb4, 0x52, 0xb4, 0xca, \n\t0xb4, 0xda, 0xb5, 0x04, 0xb5, 0x2e, 0xb5, 0x56, 0xb5, 0x82, 0xb5, 0xd8, \n\t0xb6, 0x56, 0xb6, 0x9a, 0xb6, 0xfa, 0xb7, 0x62, 0xb7, 0x96, 0xb8, 0x10, \n\t0xb8, 0x76, 0xb8, 0xb8, 0xb9, 0x1a, 0xb9, 0x7e, 0xb9, 0xe0, 0xba, 0x22, \n\t0xba, 0xa0, 0xba, 0xf2, 0xbb, 0x48, 0xbb, 0x72, 0xbb, 0xba, 0xbc, 0x1e, \n\t0xbc, 0x9a, 0xbc, 0xcc, 0xbc, 0xfe, 0xbd, 0x06, 0xbd, 0x2c, 0xbd, 0x54, \n\t0xbd, 0x64, 0xbd, 0x8a, 0xbd, 0xbc, 0xbd, 0xd6, 0xbd, 0xf6, 0xbe, 0x30, \n\t0xbe, 0x58, 0xbe, 0x74, 0xbe, 0x80, 0xbe, 0xa6, 0xbe, 0xd6, 0xbe, 0xf0, \n\t0xbf, 0x2a, 0xbf, 0x50, 0xbf, 0x7e, 0xbf, 0x9a, 0xbf, 0xd6, 0xbf, 0xf6, \n\t0xc0, 0x24, 0xc0, 0x50, 0xc0, 0x7a, 0xc0, 0x98, 0xc0, 0xd0, 0xc0, 0xf2, \n\t0xc1, 0x20, 0xc1, 0x3a, 0xc1, 0x70, 0xc1, 0xa2, 0xc1, 0xb2, 0xc1, 0xca, \n\t0xc1, 0xd6, 0xc2, 0x02, 0xc2, 0x2c, 0xc2, 0x60, 0xc2, 0x8a, 0xc2, 0xa2, \n\t0xc2, 0xb2, 0xc2, 0xc8, 0xc2, 0xf2, 0xc2, 0xfe, 0xc3, 0x16, 0xc3, 0x40, \n\t0xc3, 0x5a, 0xc3, 0x8e, 0xc3, 0x9a, 0xc3, 0xb4, 0xc3, 0xd4, 0xc4, 0x00, \n\t0xc4, 0x18, 0xc4, 0x24, 0xc4, 0x4c, 0xc4, 0x76, 0xc4, 0x82, 0xc4, 0xbe, \n\t0xc4, 0xca, 0xc4, 0xe0, 0xc4, 0xf4, 0xc5, 0x22, 0xc5, 0x2e, 0xc5, 0x48, \n\t0xc5, 0x64, 0xc5, 0x7e, 0xc5, 0xb4, 0xc5, 0xe2, 0xc5, 0xee, 0xc6, 0x06, \n\t0xc6, 0x2e, 0xc6, 0x58, 0xc6, 0x64, 0xc6, 0x8e, 0xc6, 0x9a, 0xc6, 0xb2, \n\t0xc6, 0xd0, 0xc6, 0xe2, 0xc6, 0xfc, 0xc7, 0x24, 0xc7, 0x30, 0xc7, 0x48, \n\t0xc7, 0x72, 0xc7, 0xa0, 0xc7, 0xde, 0xc7, 0xfe, 0xc8, 0x1a, 0xc8, 0x26, \n\t0x00, 0x02, 0x00, 0xab, 0x00, 0x00, 0x01, 0x71, 0x05, 0xb0, 0x00, 0x03, \n\t0x00, 0x07, 0x00, 0x30, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, \n\t0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, \n\t0x2f, 0x1b, 0xb1, 0x04, 0x06, 0x3e, 0x59, 0xb2, 0x01, 0x04, 0x02, 0x11, \n\t0x12, 0x39, 0xb1, 0x06, 0x04, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0x30, 0x31, 0x01, 0x23, 0x11, 0x33, 0x13, 0x23, 0x35, 0x33, \n\t0x01, 0x70, 0xc5, 0xc5, 0x01, 0xc6, 0xc6, 0x01, 0xde, 0x03, 0xd2, 0xfa, \n\t0x50, 0xcc, 0x00, 0x00, 0x00, 0x02, 0x00, 0x50, 0x04, 0x10, 0x02, 0x4b, \n\t0x06, 0x18, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x09, 0x00, 0xb0, 0x04, 0x2f, \n\t0xb0, 0x0a, 0xd0, 0x30, 0x31, 0x01, 0x07, 0x23, 0x37, 0x11, 0x33, 0x01, \n\t0x07, 0x23, 0x37, 0x11, 0x33, 0x01, 0x16, 0x65, 0x61, 0x01, 0xc5, 0x01, \n\t0x35, 0x65, 0x61, 0x01, 0xc5, 0x05, 0x0a, 0xfa, 0xf0, 0x01, 0x18, 0xfe, \n\t0xf2, 0xfa, 0xf8, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x46, \n\t0x00, 0x00, 0x04, 0xa2, 0x05, 0xb0, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x88, \n\t0x00, 0xb0, 0x0b, 0x2f, 0xb0, 0x1d, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x06, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x1a, 0x2f, 0x1b, 0xb1, 0x1a, 0x06, 0x3e, 0x59, 0xb0, \n\t0x1d, 0x10, 0xb1, 0x00, 0x05, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x04, 0xd0, 0xb0, 0x1d, 0x10, 0xb0, 0x06, 0xd0, 0xb0, \n\t0x0b, 0x10, 0xb1, 0x08, 0x05, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x0b, 0x10, 0xb0, 0x0e, 0xd0, 0xb0, 0x0b, 0x10, 0xb0, \n\t0x12, 0xd0, 0xb0, 0x08, 0x10, 0xb0, 0x14, 0xd0, 0xb0, 0x1d, 0x10, 0xb0, \n\t0x16, 0xd0, 0xb0, 0x00, 0x10, 0xb0, 0x18, 0xd0, 0xb0, 0x08, 0x10, 0xb0, \n\t0x1e, 0xd0, 0x30, 0x31, 0x01, 0x23, 0x03, 0x23, 0x13, 0x23, 0x35, 0x21, \n\t0x13, 0x21, 0x35, 0x21, 0x13, 0x33, 0x03, 0x33, 0x13, 0x33, 0x03, 0x33, \n\t0x15, 0x23, 0x03, 0x33, 0x15, 0x23, 0x03, 0x23, 0x03, 0x33, 0x13, 0x23, \n\t0x02, 0xc8, 0xff, 0x50, 0x97, 0x50, 0xec, 0x01, 0x08, 0x44, 0xff, 0x00, \n\t0x01, 0x1c, 0x52, 0x97, 0x52, 0xff, 0x52, 0x97, 0x52, 0xc7, 0xe2, 0x44, \n\t0xdb, 0xf7, 0x50, 0x98, 0x93, 0xff, 0x44, 0xff, 0x01, 0x9a, 0xfe, 0x66, \n\t0x01, 0x9a, 0x8c, 0x01, 0x5c, 0x8e, 0x01, 0xa0, 0xfe, 0x60, 0x01, 0xa0, \n\t0xfe, 0x60, 0x8e, 0xfe, 0xa4, 0x8c, 0xfe, 0x66, 0x02, 0x26, 0x01, 0x5c, \n\t0x00, 0x01, 0x00, 0x6e, 0xff, 0x30, 0x04, 0x15, 0x06, 0x9d, 0x00, 0x2c, \n\t0x00, 0x54, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, \n\t0x09, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x22, 0x2f, 0x1b, \n\t0xb1, 0x22, 0x06, 0x3e, 0x59, 0xb2, 0x19, 0x22, 0x09, 0x11, 0x12, 0x39, \n\t0xb0, 0x19, 0x10, 0xb0, 0x03, 0xd0, 0xb0, 0x09, 0x10, 0xb0, 0x0c, 0xd0, \n\t0xb0, 0x09, 0x10, 0xb1, 0x13, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x22, 0x10, 0xb0, 0x1f, 0xd0, 0xb0, 0x22, 0x10, \n\t0xb1, 0x2a, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x01, 0x34, 0x26, 0x27, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, \n\t0x35, 0x33, 0x15, 0x16, 0x16, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x06, \n\t0x15, 0x14, 0x16, 0x17, 0x16, 0x16, 0x15, 0x14, 0x06, 0x07, 0x15, 0x23, \n\t0x35, 0x26, 0x26, 0x37, 0x37, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x03, \n\t0x50, 0x80, 0x92, 0xca, 0xce, 0xbd, 0xa6, 0x9e, 0xa8, 0xb9, 0xc4, 0x7e, \n\t0x70, 0x76, 0x75, 0x79, 0x9e, 0xcd, 0xc6, 0xce, 0xb4, 0x9d, 0xac, 0xdc, \n\t0x04, 0x02, 0xbe, 0x9b, 0x71, 0x81, 0x91, 0x01, 0x78, 0x59, 0x80, 0x32, \n\t0x3d, 0xcc, 0xaa, 0xa5, 0xd0, 0x15, 0xdd, 0xde, 0x18, 0xef, 0xc9, 0x88, \n\t0xa8, 0x7b, 0x6b, 0x61, 0x78, 0x36, 0x42, 0xc5, 0xa9, 0xac, 0xcb, 0x13, \n\t0xc0, 0xbf, 0x12, 0xd7, 0xd0, 0x05, 0x9a, 0x83, 0x7b, 0x00, 0x00, 0x00, \n\t0x00, 0x05, 0x00, 0x68, 0xff, 0xeb, 0x05, 0x83, 0x05, 0xc5, 0x00, 0x0d, \n\t0x00, 0x1b, 0x00, 0x29, 0x00, 0x37, 0x00, 0x3b, 0x00, 0x76, 0x00, 0xb0, \n\t0x38, 0x2f, 0xb0, 0x3a, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, \n\t0x1b, 0xb1, 0x03, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x26, \n\t0x2f, 0x1b, 0xb1, 0x26, 0x06, 0x3e, 0x59, 0xb0, 0x03, 0x10, 0xb0, 0x0a, \n\t0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb1, 0x11, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, \n\t0x18, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x26, 0x10, 0xb0, 0x1f, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, \n\t0xb0, 0x26, 0x10, 0xb1, 0x2d, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x1f, 0x10, 0xb1, 0x34, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x13, 0x34, 0x36, 0x33, \n\t0x32, 0x16, 0x15, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x33, 0x14, \n\t0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, \n\t0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x06, 0x23, 0x22, \n\t0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, \n\t0x23, 0x22, 0x06, 0x15, 0x05, 0x27, 0x01, 0x17, 0x68, 0xa4, 0x89, 0x89, \n\t0xa4, 0xa3, 0x88, 0x8a, 0xa5, 0x92, 0x51, 0x4c, 0x49, 0x50, 0x51, 0x4a, \n\t0x4b, 0x50, 0x02, 0x2f, 0xa4, 0x89, 0x88, 0xa5, 0xa4, 0x87, 0x8a, 0xa5, \n\t0x92, 0x51, 0x4c, 0x49, 0x50, 0x52, 0x49, 0x4a, 0x51, 0xfe, 0x0f, 0x6d, \n\t0x02, 0xc7, 0x6d, 0x04, 0x98, 0x7f, 0xae, 0xad, 0x80, 0x4d, 0x7f, 0xac, \n\t0xac, 0x7f, 0x4a, 0x67, 0x66, 0x4b, 0x4d, 0x4a, 0x69, 0x69, 0x4a, 0xfc, \n\t0xcd, 0x7f, 0xad, 0xad, 0x7f, 0x4e, 0x80, 0xac, 0xac, 0x80, 0x4b, 0x67, \n\t0x67, 0x4b, 0x4e, 0x4a, 0x68, 0x68, 0x4a, 0xf7, 0x43, 0x04, 0x72, 0x43, \n\t0x00, 0x03, 0x00, 0x40, 0xff, 0xeb, 0x04, 0xd0, 0x05, 0xc5, 0x00, 0x21, \n\t0x00, 0x2c, 0x00, 0x39, 0x00, 0x62, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x1f, 0x2f, 0x1b, 0xb1, 0x1f, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x1b, 0x2f, 0x1b, 0xb1, 0x1b, 0x06, 0x3e, 0x59, 0xb2, 0x11, \n\t0x1f, 0x09, 0x11, 0x12, 0x39, 0xb0, 0x11, 0x10, 0xb0, 0x1c, 0xd0, 0xb0, \n\t0x1f, 0x10, 0xb1, 0x22, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb2, 0x30, 0x09, 0x1f, 0x11, 0x12, 0x39, 0xb0, 0x30, 0x10, \n\t0xb0, 0x26, 0xd0, 0xb0, 0x09, 0x10, 0xb1, 0x37, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x13, 0x34, 0x36, 0x37, \n\t0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, \n\t0x07, 0x01, 0x36, 0x36, 0x35, 0x33, 0x14, 0x06, 0x07, 0x17, 0x07, 0x23, \n\t0x27, 0x06, 0x06, 0x23, 0x22, 0x24, 0x05, 0x32, 0x36, 0x37, 0x01, 0x07, \n\t0x06, 0x06, 0x15, 0x14, 0x16, 0x03, 0x14, 0x16, 0x17, 0x37, 0x36, 0x36, \n\t0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x40, 0x8d, 0x8c, 0x4e, 0x4c, 0xc3, \n\t0xab, 0x9e, 0xc6, 0x69, 0x67, 0x6d, 0x01, 0x54, 0x29, 0x2e, 0xb0, 0x4e, \n\t0x4a, 0xb9, 0x02, 0xe5, 0x55, 0x50, 0xc2, 0x68, 0xd9, 0xfe, 0xff, 0x01, \n\t0xda, 0x48, 0x8c, 0x3e, 0xfe, 0x97, 0x28, 0x5b, 0x3b, 0x8e, 0x0f, 0x36, \n\t0x36, 0x8a, 0x39, 0x29, 0x61, 0x4e, 0x51, 0x58, 0x01, 0x88, 0x7a, 0xb7, \n\t0x5c, 0x63, 0x9b, 0x52, 0xa9, 0xb7, 0xb6, 0x80, 0x62, 0x8f, 0x4b, 0x50, \n\t0xfe, 0x67, 0x41, 0x9e, 0x58, 0x84, 0xe0, 0x59, 0xdf, 0x05, 0x66, 0x3c, \n\t0x3f, 0xe6, 0x4c, 0x31, 0x2e, 0x01, 0xb3, 0x1d, 0x44, 0x7c, 0x32, 0x71, \n\t0x92, 0x03, 0xe2, 0x35, 0x73, 0x44, 0x5f, 0x26, 0x59, 0x36, 0x3d, 0x5e, \n\t0x71, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x50, 0x04, 0x1f, 0x01, 0x16, \n\t0x06, 0x18, 0x00, 0x05, 0x00, 0x06, 0x00, 0xb0, 0x04, 0x2f, 0x30, 0x31, \n\t0x01, 0x03, 0x23, 0x13, 0x35, 0x33, 0x01, 0x16, 0x65, 0x61, 0x01, 0xc5, \n\t0x05, 0x39, 0xfe, 0xe6, 0x01, 0x09, 0xf0, 0x00, 0x00, 0x01, 0x00, 0x84, \n\t0xfe, 0x31, 0x02, 0x9d, 0x06, 0x64, 0x00, 0x11, 0x00, 0x09, 0x00, 0xb0, \n\t0x03, 0x2f, 0xb0, 0x0d, 0x2f, 0x30, 0x31, 0x13, 0x10, 0x00, 0x37, 0x17, \n\t0x17, 0x06, 0x02, 0x11, 0x15, 0x10, 0x12, 0x17, 0x07, 0x23, 0x26, 0x00, \n\t0x11, 0x84, 0x01, 0x3e, 0xaf, 0x06, 0x26, 0x89, 0xcb, 0xca, 0x8a, 0x26, \n\t0x06, 0xaf, 0xfe, 0xc2, 0x02, 0x4f, 0x01, 0x8a, 0x02, 0x2e, 0x5d, 0x01, \n\t0x74, 0x6b, 0xfe, 0x28, 0xfe, 0xa5, 0x0d, 0xfe, 0xa5, 0xfe, 0x28, 0x74, \n\t0x6c, 0x5d, 0x02, 0x2d, 0x01, 0x8b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, \n\t0xfe, 0x31, 0x02, 0x1f, 0x06, 0x64, 0x00, 0x11, 0x00, 0x09, 0x00, 0xb0, \n\t0x0d, 0x2f, 0xb0, 0x03, 0x2f, 0x30, 0x31, 0x01, 0x10, 0x00, 0x07, 0x23, \n\t0x27, 0x36, 0x12, 0x11, 0x35, 0x10, 0x02, 0x27, 0x37, 0x33, 0x16, 0x00, \n\t0x11, 0x02, 0x1f, 0xfe, 0xc1, 0xae, 0x06, 0x26, 0x87, 0xcd, 0xd3, 0x81, \n\t0x26, 0x06, 0xae, 0x01, 0x3f, 0x02, 0x46, 0xfe, 0x75, 0xfd, 0xd3, 0x5d, \n\t0x6c, 0x69, 0x01, 0xe1, 0x01, 0x5d, 0x0d, 0x01, 0x56, 0x01, 0xe3, 0x6e, \n\t0x6c, 0x5d, 0xfd, 0xd2, 0xfe, 0x76, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1c, \n\t0x02, 0x5f, 0x03, 0x57, 0x05, 0xb0, 0x00, 0x0e, 0x00, 0x19, 0x00, 0xb0, \n\t0x0d, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, \n\t0x0c, 0x3e, 0x59, 0xb0, 0x0d, 0x10, 0xb0, 0x0b, 0xd0, 0x30, 0x31, 0x01, \n\t0x25, 0x37, 0x05, 0x03, 0x33, 0x03, 0x25, 0x17, 0x05, 0x13, 0x07, 0x03, \n\t0x03, 0x27, 0x01, 0x44, 0xfe, 0xd8, 0x31, 0x01, 0x28, 0x0a, 0xa1, 0x0a, \n\t0x01, 0x25, 0x30, 0xfe, 0xd2, 0xc1, 0x83, 0xb5, 0xb0, 0x84, 0x03, 0xd6, \n\t0x59, 0x9a, 0x6f, 0x01, 0x56, 0xfe, 0xa4, 0x6e, 0x9c, 0x59, 0xfe, 0xf2, \n\t0x60, 0x01, 0x1f, 0xfe, 0xe9, 0x5d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4e, \n\t0x00, 0x92, 0x04, 0x34, 0x04, 0xb6, 0x00, 0x0b, 0x00, 0x1b, 0x00, 0xb0, \n\t0x09, 0x2f, 0xb0, 0x00, 0xd0, 0xb0, 0x09, 0x10, 0xb1, 0x06, 0x03, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0xd0, 0x30, \n\t0x31, 0x01, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, \n\t0x33, 0x02, 0xa5, 0x01, 0x8f, 0xfe, 0x71, 0xc5, 0xfe, 0x6e, 0x01, 0x92, \n\t0xc5, 0x03, 0x0f, 0xb2, 0xfe, 0x35, 0x01, 0xcb, 0xb2, 0x01, 0xa7, 0x00, \n\t0x00, 0x01, 0x00, 0x30, 0xfe, 0xfe, 0x01, 0x3b, 0x00, 0xdd, 0x00, 0x05, \n\t0x00, 0x10, 0x00, 0xb0, 0x04, 0x2f, 0xb0, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, 0x25, 0x03, 0x23, 0x13, 0x35, 0x33, \n\t0x01, 0x3b, 0x96, 0x75, 0x46, 0xc5, 0x30, 0xfe, 0xce, 0x01, 0x3c, 0xa3, \n\t0x00, 0x01, 0x00, 0x23, 0x02, 0x1a, 0x02, 0x0d, 0x02, 0xb4, 0x00, 0x03, \n\t0x00, 0x12, 0x00, 0xb0, 0x02, 0x2f, 0xb1, 0x01, 0x03, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x35, 0x21, \n\t0x02, 0x0d, 0xfe, 0x16, 0x01, 0xea, 0x02, 0x1a, 0x9a, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0xa1, 0x00, 0x00, 0x01, 0x66, 0x00, 0xca, 0x00, 0x03, \n\t0x00, 0x1c, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, \n\t0x00, 0x06, 0x3e, 0x59, 0xb1, 0x02, 0x04, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x21, 0x23, 0x35, 0x33, 0x01, 0x66, \n\t0xc5, 0xc5, 0xca, 0x00, 0x00, 0x01, 0x00, 0x10, 0xff, 0x83, 0x03, 0x17, \n\t0x05, 0xb0, 0x00, 0x03, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0x30, \n\t0x31, 0x17, 0x23, 0x01, 0x33, 0xb8, 0xa8, 0x02, 0x60, 0xa7, 0x7d, 0x06, \n\t0x2d, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x71, 0xff, 0xeb, 0x04, 0x10, \n\t0x05, 0xc5, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x3b, 0x00, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0c, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x06, 0x3e, 0x59, 0xb0, \n\t0x0a, 0x10, 0xb1, 0x11, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x18, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x10, 0x02, 0x23, 0x22, \n\t0x02, 0x11, 0x11, 0x10, 0x12, 0x33, 0x32, 0x12, 0x11, 0x27, 0x34, 0x26, \n\t0x23, 0x22, 0x06, 0x15, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x04, \n\t0x10, 0xf7, 0xd7, 0xd7, 0xfa, 0xf9, 0xd6, 0xd7, 0xf9, 0xc5, 0x89, 0x82, \n\t0x82, 0x88, 0x8a, 0x82, 0x82, 0x87, 0x02, 0x2b, 0xfe, 0xe9, 0xfe, 0xd7, \n\t0x01, 0x2a, 0x01, 0x16, 0x01, 0x59, 0x01, 0x16, 0x01, 0x2b, 0xfe, 0xd5, \n\t0xfe, 0xea, 0x2a, 0xbd, 0xbf, 0xbf, 0xbd, 0xfe, 0x55, 0xbd, 0xc1, 0xc0, \n\t0xbe, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xba, 0x00, 0x00, 0x02, 0xa9, \n\t0x05, 0xb0, 0x00, 0x05, 0x00, 0x36, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x06, 0x3e, 0x59, 0xb0, 0x05, 0x10, \n\t0xb0, 0x04, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb1, 0x03, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x21, 0x23, 0x11, 0x05, 0x35, 0x25, 0x02, 0xa9, 0xc5, 0xfe, 0xd6, 0x01, \n\t0xef, 0x04, 0xf0, 0x04, 0x8e, 0x36, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5c, \n\t0x00, 0x00, 0x04, 0x26, 0x05, 0xc5, 0x00, 0x1a, 0x00, 0x52, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x0c, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x06, 0x3e, \n\t0x59, 0xb1, 0x19, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb2, 0x02, 0x19, 0x00, 0x11, 0x12, 0x39, 0xb2, 0x03, 0x00, 0x11, \n\t0x11, 0x12, 0x39, 0xb0, 0x11, 0x10, 0xb1, 0x09, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x11, 0x10, 0xb0, 0x0c, 0xd0, \n\t0xb0, 0x03, 0x10, 0xb0, 0x17, 0xd0, 0x30, 0x31, 0x21, 0x21, 0x35, 0x01, \n\t0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x23, 0x27, 0x26, \n\t0x00, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x01, 0x17, 0x21, 0x04, \n\t0x26, 0xfc, 0x50, 0x01, 0xdd, 0x80, 0x5b, 0x7f, 0x69, 0x97, 0x8f, 0xbd, \n\t0x02, 0x05, 0x01, 0x04, 0xe6, 0xc4, 0xe9, 0x8d, 0x7f, 0xfe, 0x81, 0x02, \n\t0x02, 0xbc, 0x87, 0x02, 0x12, 0x8f, 0xa8, 0x58, 0x6d, 0x95, 0x9b, 0x8c, \n\t0x06, 0xbc, 0x01, 0x00, 0xe5, 0xb1, 0x77, 0xef, 0x89, 0xfe, 0x5f, 0x05, \n\t0x00, 0x01, 0x00, 0x5f, 0xff, 0xeb, 0x03, 0xfb, 0x05, 0xc5, 0x00, 0x2a, \n\t0x00, 0x77, 0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, \n\t0x2f, 0x1b, 0xb1, 0x0f, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x1b, 0x2f, 0x1b, 0xb1, 0x1b, 0x06, 0x3e, 0x59, 0xb2, 0xcf, 0x00, 0x01, \n\t0x5d, 0xb2, 0x1f, 0x00, 0x01, 0x71, 0xb2, 0xbf, 0x00, 0x01, 0x71, 0xb2, \n\t0xef, 0x00, 0x01, 0x5d, 0xb2, 0x7f, 0x00, 0x01, 0x5d, 0xb2, 0x2f, 0x00, \n\t0x01, 0x5d, 0xb0, 0x0f, 0x10, 0xb1, 0x07, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0f, 0x10, 0xb0, 0x0a, 0xd0, 0xb0, \n\t0x1b, 0x10, 0xb0, 0x20, 0xd0, 0xb0, 0x1b, 0x10, 0xb1, 0x23, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb1, \n\t0x2a, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, \n\t0x31, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, \n\t0x23, 0x27, 0x26, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x16, \n\t0x16, 0x15, 0x14, 0x04, 0x23, 0x22, 0x24, 0x37, 0x37, 0x33, 0x14, 0x16, \n\t0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x01, 0x84, 0xac, 0x83, \n\t0x6d, 0x7c, 0x79, 0x73, 0x8b, 0xbd, 0x02, 0x05, 0xf9, 0xc9, 0xca, 0xf0, \n\t0x6d, 0x6d, 0x83, 0x6d, 0xfe, 0xfb, 0xcb, 0xc7, 0xfe, 0xfb, 0x05, 0x03, \n\t0xbc, 0x8d, 0x7b, 0x7d, 0x8e, 0x7e, 0x88, 0xac, 0x03, 0x33, 0x83, 0x75, \n\t0x7d, 0x82, 0x87, 0x70, 0x06, 0xa5, 0xe7, 0xd7, 0xc7, 0x5a, 0xb3, 0x2f, \n\t0x2b, 0xb8, 0x72, 0xc7, 0xe4, 0xd7, 0xb8, 0x06, 0x73, 0x88, 0x88, 0x85, \n\t0x87, 0x80, 0x00, 0x00, 0x00, 0x02, 0x00, 0x37, 0x00, 0x00, 0x04, 0x52, \n\t0x05, 0xb0, 0x00, 0x0a, 0x00, 0x0f, 0x00, 0x4a, 0x00, 0xb0, 0x01, 0x2f, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0c, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x06, \n\t0x3e, 0x59, 0xb0, 0x01, 0x10, 0xb1, 0x02, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x06, 0xd0, 0xb0, 0x01, 0x10, 0xb0, \n\t0x0b, 0xd0, 0xb0, 0x09, 0x10, 0xb0, 0x0e, 0xd0, 0x40, 0x09, 0x6b, 0x0e, \n\t0x7b, 0x0e, 0x8b, 0x0e, 0x9b, 0x0e, 0x04, 0x5d, 0x30, 0x31, 0x01, 0x33, \n\t0x15, 0x23, 0x11, 0x23, 0x11, 0x21, 0x35, 0x01, 0x33, 0x01, 0x21, 0x11, \n\t0x27, 0x07, 0x03, 0x89, 0xc9, 0xc9, 0xc4, 0xfd, 0x72, 0x02, 0x82, 0xd0, \n\t0xfd, 0x80, 0x01, 0xbc, 0x06, 0x13, 0x01, 0xea, 0x9a, 0xfe, 0xb0, 0x01, \n\t0x50, 0x6f, 0x03, 0xf1, 0xfc, 0x3a, 0x02, 0xab, 0x01, 0x32, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x98, 0xff, 0xeb, 0x04, 0x13, 0x05, 0xb0, 0x00, 0x1f, \n\t0x00, 0x59, 0x00, 0xb0, 0x08, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, \n\t0x2f, 0x1b, 0xb1, 0x01, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x06, 0x3e, 0x59, 0xb0, 0x01, 0x10, 0xb1, \n\t0x03, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x0e, 0x10, 0xb0, 0x13, 0xd0, 0xb0, 0x0e, 0x10, 0xb1, 0x16, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x08, 0x10, 0xb1, \n\t0x1c, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x08, 0x10, 0xb0, 0x1f, 0xd0, 0x30, 0x31, 0x13, 0x13, 0x21, 0x15, 0x21, \n\t0x03, 0x36, 0x36, 0x37, 0x36, 0x12, 0x15, 0x14, 0x02, 0x23, 0x22, 0x26, \n\t0x37, 0x37, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, \n\t0x22, 0x06, 0x07, 0xaf, 0x54, 0x02, 0xd9, 0xfd, 0xce, 0x30, 0x2e, 0x71, \n\t0x4a, 0xc9, 0xe7, 0xeb, 0xe1, 0xb9, 0xf6, 0x05, 0x02, 0xb2, 0x89, 0x6d, \n\t0x7d, 0x8a, 0x8c, 0x7b, 0x74, 0x68, 0x18, 0x02, 0x91, 0x03, 0x1f, 0xaf, \n\t0xfe, 0x67, 0x22, 0x2d, 0x02, 0x02, 0xfe, 0xf6, 0xe1, 0xdb, 0xfe, 0xf6, \n\t0xca, 0xc4, 0x06, 0x77, 0x83, 0xb0, 0x99, 0x8c, 0xb4, 0x46, 0x48, 0x00, \n\t0x00, 0x02, 0x00, 0x84, 0xff, 0xeb, 0x04, 0x37, 0x05, 0xc5, 0x00, 0x1a, \n\t0x00, 0x27, 0x00, 0x51, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, \n\t0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x14, \n\t0x2f, 0x1b, 0xb1, 0x14, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x07, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0e, \n\t0x14, 0x00, 0x11, 0x12, 0x39, 0xb0, 0x0e, 0x2f, 0xb1, 0x1b, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x14, 0x10, 0xb1, \n\t0x22, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, \n\t0x31, 0x01, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, \n\t0x15, 0x36, 0x36, 0x33, 0x32, 0x12, 0x15, 0x14, 0x02, 0x23, 0x22, 0x00, \n\t0x11, 0x11, 0x10, 0x00, 0x13, 0x22, 0x06, 0x07, 0x15, 0x14, 0x16, 0x33, \n\t0x32, 0x36, 0x35, 0x34, 0x26, 0x02, 0xa3, 0x4b, 0x93, 0x30, 0x2a, 0x31, \n\t0x6b, 0x48, 0x9c, 0xbf, 0x40, 0xa5, 0x5f, 0xc3, 0xe8, 0xf7, 0xce, 0xd6, \n\t0xfe, 0xe8, 0x01, 0x38, 0xa4, 0x65, 0x8e, 0x25, 0xaa, 0x80, 0x79, 0x87, \n\t0x91, 0x05, 0xc5, 0x22, 0x1a, 0x97, 0x19, 0x1f, 0xfa, 0xc9, 0x17, 0x38, \n\t0x3f, 0xfe, 0xf2, 0xcf, 0xe2, 0xfe, 0xe3, 0x01, 0x36, 0x01, 0x1a, 0x01, \n\t0x16, 0x01, 0x18, 0x01, 0x5c, 0xfd, 0x6f, 0x52, 0x44, 0x76, 0xc9, 0xda, \n\t0xcd, 0x98, 0x90, 0xba, 0x00, 0x01, 0x00, 0x4d, 0x00, 0x00, 0x04, 0x26, \n\t0x05, 0xb0, 0x00, 0x0c, 0x00, 0x2f, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x06, 0x3e, 0x59, 0xb0, 0x0b, 0x10, \n\t0xb1, 0x09, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x00, 0xd0, 0x30, 0x31, 0x01, 0x00, 0x02, 0x03, 0x07, 0x23, 0x37, \n\t0x12, 0x12, 0x13, 0x21, 0x35, 0x21, 0x04, 0x26, 0xfe, 0xf8, 0xb9, 0x29, \n\t0x10, 0xc5, 0x10, 0x2a, 0xf2, 0xd2, 0xfc, 0xe8, 0x03, 0xd9, 0x05, 0x15, \n\t0xfe, 0xc6, 0xfe, 0x1b, 0xfe, 0xa7, 0x9d, 0x9d, 0x01, 0x58, 0x02, 0x1e, \n\t0x01, 0x02, 0x9b, 0x00, 0x00, 0x03, 0x00, 0x66, 0xff, 0xeb, 0x04, 0x1a, \n\t0x05, 0xc5, 0x00, 0x17, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x64, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x15, 0x2f, 0x1b, 0xb1, 0x15, 0x0c, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x06, 0x3e, \n\t0x59, 0xb2, 0x2d, 0x09, 0x15, 0x11, 0x12, 0x39, 0xb0, 0x2d, 0x2f, 0xb2, \n\t0xcf, 0x2d, 0x01, 0x5d, 0xb1, 0x1b, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x03, 0x1b, 0x2d, 0x11, 0x12, 0x39, 0xb2, \n\t0x0f, 0x2d, 0x1b, 0x11, 0x12, 0x39, 0xb0, 0x09, 0x10, 0xb1, 0x21, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x15, 0x10, \n\t0xb1, 0x27, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x01, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, 0x14, 0x04, 0x23, \n\t0x22, 0x24, 0x35, 0x34, 0x36, 0x37, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, \n\t0x32, 0x16, 0x03, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, \n\t0x32, 0x36, 0x03, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, \n\t0x32, 0x36, 0x03, 0xf2, 0x80, 0x6d, 0x7e, 0x97, 0xfe, 0xf9, 0xd2, 0xd6, \n\t0xfe, 0xfb, 0x94, 0x7e, 0x6d, 0x7c, 0xed, 0xc3, 0xc0, 0xf3, 0x9c, 0x9e, \n\t0x79, 0x7b, 0x99, 0x98, 0x7e, 0x7b, 0x9a, 0x29, 0x87, 0x67, 0x69, 0x82, \n\t0x83, 0x6a, 0x68, 0x84, 0x04, 0x34, 0x72, 0xab, 0x2a, 0x2c, 0xbc, 0x7b, \n\t0xca, 0xd5, 0xd5, 0xca, 0x7b, 0xbc, 0x2c, 0x2a, 0xab, 0x72, 0xc0, 0xd1, \n\t0xd1, 0xfc, 0x9a, 0x78, 0x9a, 0x9a, 0x78, 0x7c, 0x8d, 0x8e, 0x03, 0x1d, \n\t0x6c, 0x8e, 0x89, 0x71, 0x6f, 0x86, 0x86, 0x00, 0x00, 0x02, 0x00, 0x53, \n\t0xff, 0xeb, 0x04, 0x01, 0x05, 0xc5, 0x00, 0x1a, 0x00, 0x27, 0x00, 0x4e, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x0c, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x14, 0x2f, 0x1b, 0xb1, 0x14, \n\t0x06, 0x3e, 0x59, 0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb2, 0x07, 0x14, 0x0d, 0x11, 0x12, 0x39, 0xb0, 0x07, \n\t0x2f, 0xb1, 0x1b, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x0d, 0x10, 0xb1, 0x22, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x25, 0x32, 0x36, 0x35, 0x35, 0x06, \n\t0x06, 0x23, 0x22, 0x02, 0x35, 0x34, 0x00, 0x33, 0x32, 0x00, 0x11, 0x11, \n\t0x10, 0x00, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x13, 0x32, 0x36, \n\t0x37, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x01, 0xff, \n\t0x90, 0xad, 0x31, 0x93, 0x5a, 0xd3, 0xf8, 0x01, 0x07, 0xbc, 0xe4, 0x01, \n\t0x07, 0xfe, 0xe3, 0xe5, 0x4d, 0x9f, 0x3f, 0x1e, 0x3b, 0x7f, 0x72, 0x6d, \n\t0x91, 0x20, 0x93, 0x8d, 0x6c, 0x98, 0x8d, 0x85, 0xda, 0xd7, 0x42, 0x47, \n\t0x49, 0x01, 0x05, 0xe5, 0xdb, 0x01, 0x18, 0xfe, 0xe3, 0xfe, 0xeb, 0xfe, \n\t0xa5, 0xfe, 0xe3, 0xfe, 0xd0, 0x1d, 0x1e, 0x97, 0x1f, 0x19, 0x01, 0xfd, \n\t0x5e, 0x49, 0x7e, 0xbf, 0xc4, 0xc1, 0x97, 0x96, 0xba, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0xa1, 0x00, 0x00, 0x01, 0x66, 0x04, 0x36, 0x00, 0x26, \n\t0x00, 0x11, 0x00, 0x00, 0x01, 0x07, 0x00, 0x11, 0x00, 0x00, 0x03, 0x6c, \n\t0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, \n\t0x06, 0x0a, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, \n\t0xfe, 0xfe, 0x01, 0x6e, 0x04, 0x36, 0x00, 0x27, 0x00, 0x11, 0x00, 0x01, \n\t0x03, 0x6c, 0x01, 0x06, 0x00, 0x0f, 0x33, 0x00, 0x00, 0x10, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0a, 0x3e, 0x59, \n\t0x30, 0x31, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x00, 0x57, 0x03, 0x77, \n\t0x03, 0xe1, 0x00, 0x09, 0x00, 0x19, 0x00, 0xb0, 0x07, 0x2f, 0xb1, 0x06, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x01, \n\t0x06, 0x07, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x07, 0x15, 0x17, 0x05, \n\t0x15, 0x01, 0x35, 0x01, 0x15, 0x01, 0x48, 0x55, 0x55, 0x02, 0x2f, 0xfc, \n\t0xd0, 0x03, 0x30, 0x02, 0x2f, 0x12, 0x06, 0x13, 0xe4, 0xc9, 0x01, 0x7b, \n\t0x95, 0x01, 0x7a, 0xc9, 0x00, 0x02, 0x00, 0x98, 0x01, 0x97, 0x03, 0xda, \n\t0x03, 0xdb, 0x00, 0x03, 0x00, 0x07, 0x00, 0x26, 0x00, 0xb2, 0x00, 0x07, \n\t0x03, 0x2b, 0xb0, 0x00, 0x10, 0xb1, 0x03, 0x03, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x07, 0x10, 0xb1, 0x04, 0x03, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, \n\t0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x03, 0xda, 0xfc, 0xbe, 0x03, 0x42, \n\t0xfc, 0xbe, 0x03, 0x42, 0x03, 0x37, 0xa4, 0xfd, 0xbc, 0xa4, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x88, 0x00, 0x57, 0x03, 0xe0, 0x03, 0xe1, 0x00, 0x09, \n\t0x00, 0x19, 0x00, 0xb0, 0x02, 0x2f, 0xb1, 0x03, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x07, 0x03, 0x02, 0x11, 0x12, \n\t0x39, 0x30, 0x31, 0x13, 0x35, 0x01, 0x15, 0x01, 0x35, 0x25, 0x37, 0x35, \n\t0x27, 0x88, 0x03, 0x58, 0xfc, 0xa8, 0x02, 0x56, 0x55, 0x55, 0x03, 0x1e, \n\t0xc3, 0xfe, 0x86, 0x95, 0xfe, 0x85, 0xc4, 0xee, 0x11, 0x06, 0x14, 0x00, \n\t0x00, 0x02, 0x00, 0x3a, 0x00, 0x00, 0x03, 0x76, 0x05, 0xc5, 0x00, 0x1a, \n\t0x00, 0x1e, 0x00, 0x3f, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x11, 0x2f, \n\t0x1b, 0xb1, 0x11, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1b, \n\t0x2f, 0x1b, 0xb1, 0x1b, 0x06, 0x3e, 0x59, 0xb1, 0x1d, 0x04, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x00, 0x1d, 0x11, 0x11, \n\t0x12, 0x39, 0xb0, 0x11, 0x10, 0xb1, 0x09, 0x03, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x36, 0x36, 0x37, 0x36, \n\t0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x23, 0x27, 0x26, 0x36, \n\t0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x06, 0x06, 0x15, 0x13, 0x23, \n\t0x35, 0x33, 0x01, 0x63, 0x01, 0x30, 0x66, 0x63, 0x54, 0x71, 0x69, 0x5b, \n\t0x80, 0xbc, 0x03, 0x03, 0xe9, 0xb4, 0xc5, 0xda, 0x8d, 0x74, 0x36, 0x17, \n\t0x07, 0xce, 0xce, 0x01, 0x9a, 0x91, 0x70, 0x5c, 0x75, 0x7e, 0x59, 0x6a, \n\t0x72, 0x63, 0x60, 0x06, 0xa1, 0xc2, 0xc9, 0xb4, 0x81, 0xd6, 0x70, 0x36, \n\t0x56, 0x5b, 0xfe, 0x66, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x60, \n\t0xfe, 0x3b, 0x06, 0xd5, 0x05, 0x97, 0x00, 0x33, 0x00, 0x43, 0x00, 0x65, \n\t0x00, 0xb0, 0x0f, 0x2f, 0xb0, 0x31, 0x2f, 0xb0, 0x2b, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x06, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x06, 0x3e, 0x59, \n\t0xb0, 0x09, 0x10, 0xb1, 0x37, 0x05, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x18, 0xd0, 0xb0, 0x31, 0x10, 0xb1, 0x1e, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x2b, 0x10, \n\t0xb1, 0x24, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x0f, 0x10, 0xb1, 0x41, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x06, 0x02, 0x23, 0x22, 0x26, 0x27, \n\t0x06, 0x06, 0x23, 0x22, 0x26, 0x37, 0x12, 0x12, 0x33, 0x32, 0x16, 0x17, \n\t0x07, 0x33, 0x03, 0x06, 0x16, 0x33, 0x32, 0x36, 0x37, 0x12, 0x00, 0x21, \n\t0x20, 0x00, 0x03, 0x02, 0x00, 0x21, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, \n\t0x23, 0x20, 0x00, 0x13, 0x12, 0x00, 0x21, 0x20, 0x00, 0x01, 0x06, 0x16, \n\t0x33, 0x32, 0x36, 0x37, 0x26, 0x36, 0x37, 0x13, 0x26, 0x26, 0x23, 0x22, \n\t0x06, 0x06, 0xc4, 0x09, 0xde, 0xdd, 0x49, 0x6a, 0x17, 0x32, 0x90, 0x60, \n\t0x7d, 0x8a, 0x12, 0x17, 0xe5, 0xa5, 0x69, 0x80, 0x4b, 0x04, 0x06, 0x33, \n\t0x09, 0x3d, 0x33, 0x7b, 0x94, 0x08, 0x10, 0xfe, 0xc0, 0xfe, 0xb0, 0xfe, \n\t0xcc, 0xfe, 0x89, 0x0f, 0x12, 0x01, 0x50, 0x01, 0x3a, 0x58, 0xb5, 0x3e, \n\t0x26, 0x43, 0xcf, 0x63, 0xfe, 0x84, 0xfe, 0x61, 0x12, 0x13, 0x01, 0xcc, \n\t0x01, 0x74, 0x01, 0x7b, 0x01, 0x95, 0xfb, 0xfb, 0x0b, 0x41, 0x4a, 0x40, \n\t0x6a, 0x2c, 0x01, 0x01, 0x02, 0x2f, 0x1a, 0x39, 0x1f, 0x7d, 0x84, 0x01, \n\t0xf6, 0xd6, 0xfe, 0xcb, 0x53, 0x4c, 0x50, 0x4f, 0xf1, 0xc4, 0x01, 0x03, \n\t0x01, 0x39, 0x34, 0x36, 0x04, 0xfd, 0xb7, 0x6e, 0x53, 0xe3, 0xaf, 0x01, \n\t0x7e, 0x01, 0xab, 0xfe, 0x32, 0xfe, 0x8d, 0xfe, 0x88, 0xfe, 0x4b, 0x2b, \n\t0x23, 0x6b, 0x2a, 0x2f, 0x01, 0xf3, 0x01, 0xb0, 0x01, 0xa7, 0x02, 0x12, \n\t0xfe, 0x0c, 0xfd, 0xfd, 0x8e, 0x94, 0x31, 0x3f, 0x0c, 0x1b, 0x10, 0x02, \n\t0x1a, 0x0c, 0x0e, 0xdb, 0x00, 0x02, 0x00, 0x14, 0x00, 0x00, 0x05, 0x1a, \n\t0x05, 0xb0, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x62, 0x00, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x0c, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x06, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x06, 0x3e, 0x59, \n\t0xb2, 0x01, 0x02, 0x05, 0x11, 0x12, 0x39, 0xb0, 0x01, 0x2f, 0xb4, 0x8f, \n\t0x01, 0x9f, 0x01, 0x02, 0x5d, 0xb1, 0x08, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x05, 0x10, 0xb0, 0x0a, 0xd0, 0xb4, \n\t0x3b, 0x0a, 0x4b, 0x0a, 0x02, 0x5d, 0xb6, 0x7b, 0x0a, 0x8b, 0x0a, 0x9b, \n\t0x0a, 0x03, 0x5d, 0xb2, 0x69, 0x0a, 0x01, 0x5d, 0x30, 0x31, 0x01, 0x21, \n\t0x03, 0x23, 0x01, 0x33, 0x01, 0x23, 0x01, 0x21, 0x03, 0x23, 0x03, 0xc9, \n\t0xfd, 0x9e, 0x8a, 0xc9, 0x02, 0x33, 0xa9, 0x02, 0x2a, 0xc9, 0xfd, 0x53, \n\t0x01, 0xea, 0xf0, 0x06, 0x01, 0x77, 0xfe, 0x89, 0x05, 0xb0, 0xfa, 0x50, \n\t0x02, 0x1c, 0x02, 0x97, 0x00, 0x03, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xaf, \n\t0x05, 0xb0, 0x00, 0x0e, 0x00, 0x17, 0x00, 0x20, 0x00, 0x52, 0x00, 0xb0, \n\t0x18, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, \n\t0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, \n\t0x00, 0x06, 0x3e, 0x59, 0xb2, 0xef, 0x18, 0x01, 0x5d, 0xb0, 0x18, 0x10, \n\t0xb1, 0x0f, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x00, 0x10, 0xb1, 0x10, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x01, 0x10, 0xb1, 0x1f, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x33, 0x11, 0x21, 0x32, \n\t0x04, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, 0x14, 0x04, 0x23, 0x01, \n\t0x11, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x25, 0x21, 0x32, 0x36, \n\t0x35, 0x34, 0x26, 0x23, 0x21, 0xb4, 0x01, 0xdb, 0xe4, 0x01, 0x02, 0x7c, \n\t0x65, 0x84, 0x97, 0xfe, 0xfd, 0xde, 0xfe, 0xab, 0x01, 0x55, 0x86, 0x96, \n\t0x7d, 0x82, 0xfe, 0x8e, 0x01, 0x3f, 0x6e, 0x8a, 0x95, 0x8c, 0xfe, 0xea, \n\t0x05, 0xb0, 0xc5, 0xc5, 0x61, 0x99, 0x25, 0x1c, 0xca, 0x86, 0xc8, 0xd3, \n\t0x02, 0xab, 0xfd, 0xef, 0x85, 0x7a, 0x80, 0x92, 0x9a, 0x79, 0x6c, 0x76, \n\t0x75, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x76, 0xff, 0xeb, 0x04, 0xbf, \n\t0x05, 0xc5, 0x00, 0x1d, 0x00, 0x3b, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x06, 0x3e, 0x59, 0xb0, 0x0b, 0x10, \n\t0xb1, 0x13, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x04, 0x10, 0xb1, 0x1a, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x17, 0x16, 0x00, 0x23, 0x22, 0x00, \n\t0x11, 0x11, 0x10, 0x00, 0x33, 0x32, 0x00, 0x07, 0x07, 0x23, 0x34, 0x26, \n\t0x23, 0x22, 0x02, 0x15, 0x11, 0x14, 0x12, 0x33, 0x32, 0x36, 0x35, 0x04, \n\t0xb9, 0x02, 0x04, 0xfe, 0xd8, 0xf3, 0xf7, 0xfe, 0xc9, 0x01, 0x37, 0xf7, \n\t0xf7, 0x01, 0x24, 0x04, 0x02, 0xbd, 0xb4, 0xa4, 0xa5, 0xc4, 0xc4, 0xa5, \n\t0xa4, 0xb4, 0x01, 0xd2, 0x06, 0xcd, 0xfe, 0xec, 0x01, 0x5e, 0x01, 0x0d, \n\t0x01, 0x03, 0x01, 0x0d, 0x01, 0x5f, 0xfe, 0xf9, 0xd9, 0x06, 0x99, 0xb2, \n\t0xfe, 0xf6, 0xc5, 0xfe, 0xfb, 0xc7, 0xfe, 0xf6, 0xb1, 0x9c, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xeb, 0x05, 0xb0, 0x00, 0x09, \n\t0x00, 0x13, 0x00, 0x3b, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, \n\t0x1b, 0xb1, 0x01, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, \n\t0x2f, 0x1b, 0xb1, 0x00, 0x06, 0x3e, 0x59, 0xb0, 0x01, 0x10, 0xb1, 0x0a, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, \n\t0x10, 0xb1, 0x0b, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0x30, 0x31, 0x33, 0x11, 0x21, 0x20, 0x00, 0x11, 0x15, 0x10, 0x00, \n\t0x21, 0x03, 0x11, 0x33, 0x32, 0x12, 0x35, 0x35, 0x34, 0x02, 0x23, 0xb4, \n\t0x01, 0xbf, 0x01, 0x1e, 0x01, 0x5a, 0xfe, 0xa6, 0xfe, 0xe2, 0xfa, 0xfa, \n\t0xca, 0xe9, 0xe9, 0xca, 0x05, 0xb0, 0xfe, 0xa1, 0xfe, 0xea, 0xc7, 0xfe, \n\t0xe9, 0xfe, 0xa3, 0x05, 0x15, 0xfb, 0x85, 0x01, 0x0a, 0xd0, 0xc9, 0xce, \n\t0x01, 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x7a, \n\t0x05, 0xb0, 0x00, 0x0b, 0x00, 0x5c, 0x00, 0xb0, 0x0b, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0c, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x06, 0x3e, 0x59, \n\t0xb2, 0xef, 0x0b, 0x01, 0x5d, 0xb2, 0x7f, 0x0b, 0x01, 0x5d, 0xb2, 0x2f, \n\t0x0b, 0x01, 0x5d, 0xb0, 0x0b, 0x10, 0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x02, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x06, 0x10, \n\t0xb1, 0x08, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x01, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, \n\t0x11, 0x21, 0x04, 0x14, 0xfd, 0x65, 0x03, 0x01, 0xfc, 0x3a, 0x03, 0xbb, \n\t0xfd, 0x0a, 0x02, 0x9b, 0x02, 0xa3, 0xfd, 0xf7, 0x9a, 0x05, 0xb0, 0x9b, \n\t0xfe, 0x29, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x77, \n\t0x05, 0xb0, 0x00, 0x09, 0x00, 0x88, 0x00, 0xb0, 0x08, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x06, 0x3e, 0x59, \n\t0xb2, 0x7f, 0x08, 0x01, 0x5d, 0xb2, 0xcf, 0x08, 0x01, 0x5d, 0xb2, 0x1f, \n\t0x08, 0x01, 0x71, 0xb2, 0x7f, 0x08, 0x01, 0x71, 0xb4, 0xbf, 0x08, 0xcf, \n\t0x08, 0x02, 0x71, 0xb2, 0x3f, 0x08, 0x01, 0x72, 0xb2, 0x6f, 0x08, 0x01, \n\t0x72, 0xb2, 0xef, 0x08, 0x01, 0x71, 0xb2, 0x9f, 0x08, 0x01, 0x71, 0xb2, \n\t0x4f, 0x08, 0x01, 0x71, 0xb4, 0xef, 0x08, 0xff, 0x08, 0x02, 0x5d, 0xb2, \n\t0xaf, 0x08, 0x01, 0x5d, 0xb2, 0x5f, 0x08, 0x01, 0x5d, 0xb2, 0x2f, 0x08, \n\t0x01, 0x5d, 0xb0, 0x08, 0x10, 0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x06, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, \n\t0x11, 0x23, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x04, 0x11, 0xfd, 0x68, \n\t0xc5, 0x03, 0xc3, 0xfd, 0x02, 0x02, 0x98, 0x02, 0x84, 0xfd, 0x7c, 0x05, \n\t0xb0, 0x9b, 0xfe, 0x0a, 0x00, 0x01, 0x00, 0x78, 0xff, 0xeb, 0x04, 0xd3, \n\t0x05, 0xc5, 0x00, 0x20, 0x00, 0x57, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x06, 0x3e, 0x59, 0xb0, 0x0a, 0x10, \n\t0xb0, 0x0f, 0xd0, 0xb0, 0x0a, 0x10, 0xb1, 0x12, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x19, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x1f, 0x03, \n\t0x0a, 0x11, 0x12, 0x39, 0xb0, 0x1f, 0x2f, 0xb1, 0x1e, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x25, 0x06, 0x04, \n\t0x23, 0x20, 0x00, 0x11, 0x11, 0x10, 0x00, 0x33, 0x32, 0x04, 0x17, 0x07, \n\t0x23, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x14, 0x16, 0x33, 0x32, \n\t0x36, 0x37, 0x11, 0x21, 0x35, 0x21, 0x04, 0xd3, 0x34, 0xfe, 0xff, 0xcc, \n\t0xfe, 0xfb, 0xfe, 0xab, 0x01, 0x3e, 0xfb, 0xfa, 0x01, 0x1e, 0x03, 0x02, \n\t0xbc, 0x09, 0xaf, 0xa5, 0xa7, 0xcc, 0xe4, 0xb0, 0x7c, 0x9e, 0x22, 0xfe, \n\t0xc1, 0x02, 0x04, 0xc1, 0x50, 0x86, 0x01, 0x4e, 0x01, 0x09, 0x01, 0x2c, \n\t0x01, 0x09, 0x01, 0x4e, 0xf6, 0xc2, 0x06, 0x7f, 0xa4, 0xfa, 0xc0, 0xfe, \n\t0xd2, 0xc2, 0xfb, 0x42, 0x2a, 0x01, 0x4b, 0x9b, 0x00, 0x01, 0x00, 0xb4, \n\t0x00, 0x00, 0x05, 0x01, 0x05, 0xb0, 0x00, 0x0b, 0x00, 0xa4, 0x00, 0xb0, \n\t0x08, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, \n\t0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, \n\t0x0a, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, \n\t0xb1, 0x00, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, \n\t0x1b, 0xb1, 0x04, 0x06, 0x3e, 0x59, 0xb2, 0x7f, 0x08, 0x01, 0x5d, 0xb2, \n\t0xcf, 0x08, 0x01, 0x5d, 0xb2, 0x1f, 0x08, 0x01, 0x71, 0xb2, 0x7f, 0x08, \n\t0x01, 0x71, 0xb4, 0xbf, 0x08, 0xcf, 0x08, 0x02, 0x71, 0xb2, 0x1f, 0x08, \n\t0x01, 0x72, 0xb2, 0x6f, 0x08, 0x01, 0x72, 0xb2, 0xbf, 0x08, 0x01, 0x72, \n\t0xb4, 0x8f, 0x08, 0x9f, 0x08, 0x02, 0x72, 0xb2, 0x3f, 0x08, 0x01, 0x72, \n\t0xb2, 0xef, 0x08, 0x01, 0x71, 0xb2, 0x9f, 0x08, 0x01, 0x71, 0xb2, 0x4f, \n\t0x08, 0x01, 0x71, 0xb4, 0xef, 0x08, 0xff, 0x08, 0x02, 0x5d, 0xb2, 0xaf, \n\t0x08, 0x01, 0x5d, 0xb2, 0x5f, 0x08, 0x01, 0x5d, 0xb2, 0x2f, 0x08, 0x01, \n\t0x5d, 0xb0, 0x08, 0x10, 0xb1, 0x03, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x21, 0x23, 0x11, 0x21, 0x11, 0x23, \n\t0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x05, 0x01, 0xc5, 0xfd, 0x3d, 0xc5, \n\t0xc5, 0x02, 0xc3, 0xc5, 0x02, 0x83, 0xfd, 0x7d, 0x05, 0xb0, 0xfd, 0x6e, \n\t0x02, 0x92, 0x00, 0x00, 0x00, 0x01, 0x00, 0xbe, 0x00, 0x00, 0x01, 0x84, \n\t0x05, 0xb0, 0x00, 0x03, 0x00, 0x1d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x06, 0x3e, 0x59, 0x30, 0x31, 0x21, \n\t0x23, 0x11, 0x33, 0x01, 0x84, 0xc6, 0xc6, 0x05, 0xb0, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x3d, 0xff, 0xeb, 0x03, 0xc3, 0x05, 0xb0, 0x00, 0x10, \n\t0x00, 0x29, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, \n\t0x00, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, \n\t0xb1, 0x05, 0x06, 0x3e, 0x59, 0xb1, 0x0d, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x33, 0x11, 0x14, 0x06, \n\t0x23, 0x22, 0x26, 0x37, 0x37, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, \n\t0x02, 0xfe, 0xc5, 0xf7, 0xc5, 0xd2, 0xf8, 0x05, 0x02, 0xbd, 0x89, 0x7d, \n\t0x6d, 0x8a, 0x05, 0xb0, 0xfb, 0xe3, 0xc3, 0xe5, 0xd5, 0xcb, 0x06, 0x87, \n\t0x85, 0x93, 0x7b, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x20, \n\t0x05, 0xb0, 0x00, 0x0e, 0x00, 0x82, 0x00, 0xb0, 0x06, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0c, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x06, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x06, \n\t0x3e, 0x59, 0xb2, 0xcf, 0x06, 0x01, 0x5d, 0xb2, 0x1f, 0x06, 0x01, 0x71, \n\t0xb2, 0xbf, 0x06, 0x01, 0x71, 0xb2, 0x3f, 0x06, 0x01, 0x72, 0xb2, 0x8f, \n\t0x06, 0x01, 0x72, 0xb2, 0xef, 0x06, 0x01, 0x71, 0xb2, 0x9f, 0x06, 0x01, \n\t0x71, 0xb2, 0xef, 0x06, 0x01, 0x5d, 0xb2, 0x7f, 0x06, 0x01, 0x5d, 0xb2, \n\t0x2f, 0x06, 0x01, 0x5d, 0xb0, 0x06, 0x10, 0xb1, 0x00, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0b, 0x06, 0x00, 0x11, \n\t0x12, 0x39, 0x30, 0x31, 0x01, 0x23, 0x11, 0x23, 0x11, 0x33, 0x11, 0x33, \n\t0x01, 0x33, 0x17, 0x01, 0x01, 0x07, 0x23, 0x02, 0x23, 0xaa, 0xc5, 0xc5, \n\t0x98, 0x02, 0x09, 0xda, 0x03, 0xfd, 0xcb, 0x02, 0x5e, 0x03, 0xeb, 0x02, \n\t0x91, 0xfd, 0x6f, 0x05, 0xb0, 0xfd, 0x7c, 0x02, 0x84, 0x05, 0xfd, 0x45, \n\t0xfd, 0x15, 0x05, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x2a, \n\t0x05, 0xb0, 0x00, 0x05, 0x00, 0x29, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x06, 0x3e, 0x59, 0xb1, 0x00, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x25, \n\t0x21, 0x15, 0x21, 0x11, 0x33, 0x01, 0x79, 0x02, 0xb1, 0xfc, 0x8a, 0xc5, \n\t0x9a, 0x9a, 0x05, 0xb0, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x06, 0x52, \n\t0x05, 0xb0, 0x00, 0x11, 0x00, 0x80, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x06, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x06, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x06, 0x3e, 0x59, \n\t0xb0, 0x0a, 0x10, 0xb0, 0x01, 0xd0, 0xb4, 0x34, 0x01, 0x44, 0x01, 0x02, \n\t0x5d, 0xb6, 0x73, 0x01, 0x83, 0x01, 0x93, 0x01, 0x03, 0x5d, 0xb0, 0x00, \n\t0x10, 0xb0, 0x0c, 0xd0, 0x40, 0x09, 0x6f, 0x0c, 0x7f, 0x0c, 0x8f, 0x0c, \n\t0x9f, 0x0c, 0x04, 0x5d, 0xb2, 0x4f, 0x0c, 0x01, 0x5d, 0xb2, 0x5c, 0x0c, \n\t0x01, 0x5d, 0xb4, 0x2b, 0x0c, 0x3b, 0x0c, 0x02, 0x5d, 0xb0, 0x08, 0xd0, \n\t0x30, 0x31, 0x01, 0x01, 0x33, 0x01, 0x33, 0x11, 0x23, 0x11, 0x13, 0x27, \n\t0x01, 0x23, 0x01, 0x07, 0x13, 0x11, 0x23, 0x11, 0x01, 0xb0, 0x01, 0xd0, \n\t0x06, 0x01, 0xd0, 0xfc, 0xc5, 0x14, 0x05, 0xfe, 0x28, 0x83, 0xfe, 0x2a, \n\t0x05, 0x13, 0xc5, 0x05, 0xb0, 0xfb, 0x61, 0x04, 0x9f, 0xfa, 0x50, 0x02, \n\t0x40, 0x02, 0x50, 0x01, 0xfb, 0x6f, 0x04, 0x8e, 0x01, 0xfd, 0xb3, 0xfd, \n\t0xc0, 0x05, 0xb0, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x01, \n\t0x05, 0xb0, 0x00, 0x0b, 0x00, 0x78, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x06, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x06, 0x3e, 0x59, 0xb0, \n\t0x06, 0x10, 0xb0, 0x02, 0xd0, 0xb2, 0x4b, 0x02, 0x01, 0x5d, 0xb2, 0x5c, \n\t0x02, 0x01, 0x5d, 0x40, 0x09, 0x6b, 0x02, 0x7b, 0x02, 0x8b, 0x02, 0x9b, \n\t0x02, 0x04, 0x5d, 0xb2, 0x39, 0x02, 0x01, 0x5d, 0xb0, 0x00, 0x10, 0xb0, \n\t0x08, 0xd0, 0xb2, 0x36, 0x08, 0x01, 0x5d, 0x40, 0x0d, 0x44, 0x08, 0x54, \n\t0x08, 0x64, 0x08, 0x74, 0x08, 0x84, 0x08, 0x94, 0x08, 0x06, 0x5d, 0xb2, \n\t0x54, 0x09, 0x01, 0x5d, 0x30, 0x31, 0x21, 0x23, 0x01, 0x07, 0x11, 0x23, \n\t0x11, 0x33, 0x01, 0x37, 0x11, 0x33, 0x05, 0x01, 0xc5, 0xfd, 0x43, 0x06, \n\t0xc5, 0xc5, 0x02, 0xbd, 0x06, 0xc5, 0x04, 0x66, 0x02, 0xfb, 0x9c, 0x05, \n\t0xb0, 0xfb, 0x9c, 0x02, 0x04, 0x62, 0x00, 0x00, 0x00, 0x02, 0x00, 0x71, \n\t0xff, 0xeb, 0x05, 0x02, 0x05, 0xc5, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x3b, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0c, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, \n\t0x06, 0x3e, 0x59, 0xb0, 0x0a, 0x10, 0xb1, 0x11, 0x03, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x18, 0x03, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, \n\t0x10, 0x00, 0x21, 0x22, 0x00, 0x11, 0x11, 0x10, 0x00, 0x33, 0x20, 0x00, \n\t0x11, 0x27, 0x34, 0x02, 0x23, 0x22, 0x02, 0x15, 0x11, 0x14, 0x12, 0x33, \n\t0x32, 0x36, 0x35, 0x05, 0x02, 0xfe, 0xb5, 0xfe, 0xf8, 0xff, 0xfe, 0xc1, \n\t0x01, 0x3f, 0xff, 0x01, 0x08, 0x01, 0x4b, 0xc5, 0xd8, 0xb6, 0xac, 0xcd, \n\t0xcd, 0xac, 0xb7, 0xd7, 0x02, 0x56, 0xfe, 0xf5, 0xfe, 0xa0, 0x01, 0x60, \n\t0x01, 0x0b, 0x01, 0x03, 0x01, 0x0a, 0x01, 0x62, 0xfe, 0x9f, 0xfe, 0xf5, \n\t0x02, 0xc8, 0x01, 0x00, 0xff, 0x00, 0xc8, 0xfe, 0xfb, 0xca, 0xff, 0x00, \n\t0xff, 0xcb, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xcc, \n\t0x05, 0xb0, 0x00, 0x0a, 0x00, 0x13, 0x00, 0x42, 0x00, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0c, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x06, 0x3e, 0x59, 0xb2, \n\t0x00, 0x01, 0x03, 0x11, 0x12, 0x39, 0xb0, 0x00, 0x2f, 0xb1, 0x0b, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, \n\t0xb1, 0x12, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x01, 0x11, 0x23, 0x11, 0x21, 0x32, 0x04, 0x15, 0x14, 0x04, \n\t0x23, 0x25, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x21, 0x01, 0x79, \n\t0xc5, 0x02, 0x2d, 0xe9, 0x01, 0x02, 0xfe, 0xfe, 0xe9, 0xfe, 0x98, 0x01, \n\t0x68, 0x94, 0x92, 0x93, 0x93, 0xfe, 0x98, 0x02, 0x48, 0xfd, 0xb8, 0x05, \n\t0xb0, 0xf0, 0xc4, 0xc7, 0xed, 0x9a, 0x9f, 0x79, 0x79, 0xa2, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x71, 0xff, 0x18, 0x05, 0x3b, 0x05, 0xc5, 0x00, 0x13, \n\t0x00, 0x21, 0x00, 0x3f, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, \n\t0x1b, 0xb1, 0x10, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, \n\t0x2f, 0x1b, 0xb1, 0x09, 0x06, 0x3e, 0x59, 0xb1, 0x1e, 0x03, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x03, 0x09, 0x1e, 0x11, \n\t0x12, 0x39, 0xb0, 0x10, 0x10, 0xb1, 0x17, 0x03, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x14, 0x06, 0x07, 0x17, \n\t0x07, 0x01, 0x06, 0x06, 0x23, 0x22, 0x00, 0x11, 0x11, 0x10, 0x00, 0x33, \n\t0x20, 0x00, 0x11, 0x27, 0x34, 0x02, 0x23, 0x22, 0x02, 0x15, 0x11, 0x14, \n\t0x12, 0x33, 0x32, 0x36, 0x35, 0x05, 0x02, 0x64, 0x5a, 0xf7, 0x87, 0xfe, \n\t0xec, 0x38, 0x79, 0x40, 0xff, 0xfe, 0xc1, 0x01, 0x3f, 0xff, 0x01, 0x08, \n\t0x01, 0x4b, 0xc5, 0xd8, 0xb6, 0xac, 0xcd, 0xcd, 0xac, 0xb7, 0xd7, 0x02, \n\t0x56, 0x8e, 0xf2, 0x54, 0xe9, 0x81, 0x01, 0x01, 0x17, 0x17, 0x01, 0x60, \n\t0x01, 0x0b, 0x01, 0x03, 0x01, 0x0a, 0x01, 0x62, 0xfe, 0x9f, 0xfe, 0xf5, \n\t0x02, 0xc8, 0x01, 0x00, 0xff, 0x00, 0xc8, 0xfe, 0xfb, 0xca, 0xff, 0x00, \n\t0xff, 0xcb, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xed, \n\t0x05, 0xaf, 0x00, 0x1a, 0x00, 0x23, 0x00, 0x56, 0x00, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0c, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x06, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x06, 0x3e, 0x59, \n\t0xb2, 0x00, 0x01, 0x03, 0x11, 0x12, 0x39, 0xb0, 0x00, 0x2f, 0xb1, 0x1b, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0a, \n\t0x00, 0x1b, 0x11, 0x12, 0x39, 0xb0, 0x03, 0x10, 0xb1, 0x22, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x11, \n\t0x23, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, \n\t0x15, 0x14, 0x16, 0x17, 0x15, 0x23, 0x26, 0x26, 0x35, 0x35, 0x34, 0x26, \n\t0x23, 0x25, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x21, 0x01, 0x79, \n\t0xc5, 0x02, 0x0f, 0xef, 0xfc, 0x75, 0x70, 0x78, 0x69, 0x1e, 0x25, 0xcb, \n\t0x27, 0x16, 0x8a, 0x74, 0xfe, 0x92, 0x01, 0x36, 0xa7, 0x93, 0x8f, 0x97, \n\t0xfe, 0xb6, 0x02, 0x77, 0xfd, 0x89, 0x05, 0xaf, 0xd4, 0xca, 0x70, 0xa6, \n\t0x31, 0x27, 0xaf, 0x81, 0x89, 0x44, 0x6c, 0x22, 0x18, 0x22, 0x84, 0x46, \n\t0x85, 0x76, 0x90, 0x9b, 0x7f, 0x82, 0x7b, 0x87, 0x00, 0x01, 0x00, 0x61, \n\t0xff, 0xeb, 0x04, 0x92, 0x05, 0xc5, 0x00, 0x27, 0x00, 0x51, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0c, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1d, 0x2f, 0x1b, 0xb1, 0x1d, 0x06, 0x3e, \n\t0x59, 0xb2, 0x17, 0x1d, 0x09, 0x11, 0x12, 0x39, 0xb0, 0x17, 0x10, 0xb1, \n\t0x03, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x09, 0x10, 0xb1, 0x11, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x1d, 0x10, 0xb1, 0x25, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x34, 0x26, 0x27, 0x26, \n\t0x24, 0x35, 0x34, 0x24, 0x33, 0x32, 0x00, 0x07, 0x07, 0x23, 0x34, 0x26, \n\t0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x17, 0x16, 0x16, 0x15, 0x14, 0x04, \n\t0x23, 0x22, 0x24, 0x37, 0x37, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x03, \n\t0xcd, 0x96, 0xbf, 0xe7, 0xfe, 0xfd, 0x01, 0x17, 0xde, 0xef, 0x01, 0x1b, \n\t0x05, 0x02, 0xbc, 0xa9, 0x9e, 0x93, 0x9d, 0xaa, 0xbf, 0xe6, 0xf0, 0xfe, \n\t0xe0, 0xe8, 0xda, 0xfe, 0xb1, 0x05, 0x02, 0xbc, 0xce, 0x98, 0x95, 0xae, \n\t0x01, 0x6f, 0x64, 0x87, 0x2e, 0x37, 0xd6, 0xa2, 0xaa, 0xe4, 0xfe, 0xfa, \n\t0xad, 0x06, 0x80, 0x9e, 0x85, 0x6b, 0x5f, 0x7f, 0x30, 0x39, 0xde, 0xa4, \n\t0xb0, 0xd6, 0xec, 0xc6, 0x06, 0x8c, 0x92, 0x7e, 0x00, 0x01, 0x00, 0x22, \n\t0x00, 0x00, 0x04, 0x8e, 0x05, 0xb0, 0x00, 0x07, 0x00, 0x2f, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0c, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x06, 0x3e, \n\t0x59, 0xb0, 0x06, 0x10, 0xb1, 0x05, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x01, 0xd0, 0x30, 0x31, 0x01, 0x21, 0x11, \n\t0x23, 0x11, 0x21, 0x35, 0x21, 0x04, 0x8e, 0xfe, 0x2c, 0xc5, 0xfe, 0x2d, \n\t0x04, 0x6c, 0x05, 0x15, 0xfa, 0xeb, 0x05, 0x15, 0x9b, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x93, 0xff, 0xeb, 0x04, 0xdc, 0x05, 0xb0, 0x00, 0x11, \n\t0x00, 0x36, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, \n\t0x00, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, \n\t0xb1, 0x08, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, \n\t0x1b, 0xb1, 0x04, 0x06, 0x3e, 0x59, 0xb1, 0x0d, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x11, 0x14, 0x04, \n\t0x23, 0x22, 0x24, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, \n\t0x35, 0x11, 0x04, 0xdc, 0xfe, 0xcb, 0xf9, 0xf0, 0xfe, 0xd5, 0xc5, 0xbc, \n\t0x9a, 0xa2, 0xc7, 0x05, 0xb0, 0xfc, 0x25, 0xee, 0xfc, 0xfd, 0xed, 0x03, \n\t0xdb, 0xfc, 0x25, 0xa5, 0xab, 0xab, 0xa5, 0x03, 0xdb, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x16, 0x00, 0x00, 0x04, 0xf9, 0x05, 0xb0, 0x00, 0x09, \n\t0x00, 0x44, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, \n\t0x04, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, \n\t0xb1, 0x08, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, \n\t0x1b, 0xb1, 0x06, 0x06, 0x3e, 0x59, 0xb0, 0x01, 0xd0, 0xb2, 0x24, 0x01, \n\t0x01, 0x5d, 0x40, 0x0f, 0x33, 0x01, 0x43, 0x01, 0x53, 0x01, 0x63, 0x01, \n\t0x73, 0x01, 0x83, 0x01, 0x93, 0x01, 0x07, 0x5d, 0x30, 0x31, 0x01, 0x17, \n\t0x33, 0x37, 0x01, 0x33, 0x01, 0x23, 0x01, 0x33, 0x02, 0x64, 0x21, 0x06, \n\t0x21, 0x01, 0x78, 0xd5, 0xfd, 0xe3, 0xa9, 0xfd, 0xe3, 0xd6, 0x01, 0x6a, \n\t0x73, 0x73, 0x04, 0x46, 0xfa, 0x50, 0x05, 0xb0, 0x00, 0x01, 0x00, 0x36, \n\t0x00, 0x00, 0x06, 0xcf, 0x05, 0xb0, 0x00, 0x15, 0x00, 0x84, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0c, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x14, 0x2f, 0x1b, 0xb1, 0x14, 0x0c, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, \n\t0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, \n\t0x12, 0x06, 0x3e, 0x59, 0xb0, 0x0c, 0x10, 0xb0, 0x07, 0xd0, 0xb4, 0x24, \n\t0x07, 0x34, 0x07, 0x02, 0x5d, 0x40, 0x0d, 0x40, 0x07, 0x50, 0x07, 0x60, \n\t0x07, 0x70, 0x07, 0x80, 0x07, 0x90, 0x07, 0x06, 0x5d, 0xb0, 0x01, 0xd0, \n\t0xb0, 0x04, 0x10, 0xb0, 0x10, 0xd0, 0xb2, 0x9f, 0x10, 0x01, 0x5d, 0x40, \n\t0x09, 0x5c, 0x10, 0x6c, 0x10, 0x7c, 0x10, 0x8c, 0x10, 0x04, 0x5d, 0xb6, \n\t0x2b, 0x10, 0x3b, 0x10, 0x4b, 0x10, 0x03, 0x5d, 0x30, 0x31, 0x01, 0x17, \n\t0x17, 0x37, 0x01, 0x33, 0x01, 0x17, 0x33, 0x37, 0x13, 0x33, 0x01, 0x23, \n\t0x01, 0x27, 0x23, 0x07, 0x01, 0x23, 0x01, 0x33, 0x01, 0xd8, 0x1b, 0x06, \n\t0x27, 0x01, 0x0b, 0xae, 0x01, 0x0d, 0x28, 0x06, 0x1d, 0xd9, 0xc5, 0xfe, \n\t0xa1, 0xb0, 0xfe, 0xe1, 0x1a, 0x06, 0x19, 0xfe, 0xdc, 0xb0, 0xfe, 0xa2, \n\t0xc4, 0x01, 0xf8, 0xb6, 0x01, 0xb7, 0x03, 0xb8, 0xfc, 0x48, 0xbb, 0xbb, \n\t0x03, 0xb8, 0xfa, 0x50, 0x03, 0xf2, 0x83, 0x83, 0xfc, 0x0e, 0x05, 0xb0, \n\t0x00, 0x01, 0x00, 0x42, 0x00, 0x00, 0x04, 0xd6, 0x05, 0xb0, 0x00, 0x0b, \n\t0x00, 0x61, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, \n\t0x01, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, \n\t0xb1, 0x0a, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, \n\t0x1b, 0xb1, 0x04, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, \n\t0x2f, 0x1b, 0xb1, 0x07, 0x06, 0x3e, 0x59, 0xb2, 0x00, 0x07, 0x0a, 0x11, \n\t0x12, 0x39, 0xb2, 0x85, 0x00, 0x01, 0x5d, 0xb2, 0x93, 0x00, 0x01, 0x5d, \n\t0xb0, 0x00, 0x10, 0xb0, 0x06, 0xd0, 0xb4, 0x8d, 0x06, 0x9d, 0x06, 0x02, \n\t0x5d, 0x40, 0x09, 0x4b, 0x06, 0x5b, 0x06, 0x6b, 0x06, 0x7b, 0x06, 0x04, \n\t0x5d, 0x30, 0x31, 0x01, 0x01, 0x33, 0x01, 0x01, 0x23, 0x01, 0x01, 0x23, \n\t0x01, 0x01, 0x33, 0x02, 0x8a, 0x01, 0x54, 0xee, 0xfe, 0x32, 0x01, 0xd8, \n\t0xeb, 0xfe, 0xa3, 0xfe, 0xa2, 0xee, 0x01, 0xd8, 0xfe, 0x32, 0xec, 0x03, \n\t0x78, 0x02, 0x38, 0xfd, 0x2e, 0xfd, 0x22, 0x02, 0x42, 0xfd, 0xbe, 0x02, \n\t0xde, 0x02, 0xd2, 0x00, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x04, 0xce, \n\t0x05, 0xb0, 0x00, 0x08, 0x00, 0x54, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x06, 0x3e, 0x59, 0xb2, 0x00, \n\t0x04, 0x07, 0x11, 0x12, 0x39, 0xb2, 0x75, 0x00, 0x01, 0x5d, 0xb0, 0x00, \n\t0x10, 0xb0, 0x03, 0xd0, 0xb6, 0x7b, 0x03, 0x8b, 0x03, 0x9b, 0x03, 0x03, \n\t0x5d, 0xb0, 0x00, 0x10, 0xb0, 0x06, 0xd0, 0xb6, 0x7b, 0x06, 0x8b, 0x06, \n\t0x9b, 0x06, 0x03, 0x5d, 0x30, 0x31, 0x01, 0x01, 0x33, 0x01, 0x11, 0x23, \n\t0x11, 0x01, 0x33, 0x02, 0x71, 0x01, 0x7c, 0xe1, 0xfe, 0x01, 0xc4, 0xfe, \n\t0x09, 0xe1, 0x02, 0xcc, 0x02, 0xe4, 0xfc, 0x50, 0xfe, 0x00, 0x02, 0x0d, \n\t0x03, 0xa3, 0x00, 0x00, 0x00, 0x01, 0x00, 0x61, 0x00, 0x00, 0x04, 0x6d, \n\t0x05, 0xb0, 0x00, 0x09, 0x00, 0x3e, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x06, 0x3e, 0x59, 0xb1, 0x00, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0xd0, \n\t0xb0, 0x07, 0x10, 0xb1, 0x05, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x09, 0xd0, 0x30, 0x31, 0x25, 0x21, 0x15, 0x21, \n\t0x35, 0x01, 0x21, 0x35, 0x21, 0x15, 0x01, 0x3f, 0x03, 0x2e, 0xfb, 0xf4, \n\t0x03, 0x0a, 0xfd, 0x01, 0x03, 0xe0, 0x9a, 0x9a, 0x92, 0x04, 0x83, 0x9b, \n\t0x8d, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8f, 0xfe, 0xc8, 0x02, 0x10, \n\t0x06, 0x80, 0x00, 0x07, 0x00, 0x27, 0x00, 0xb0, 0x07, 0x2f, 0xb0, 0x04, \n\t0x2f, 0xb0, 0x07, 0x10, 0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x03, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x23, 0x11, \n\t0x33, 0x15, 0x21, 0x11, 0x21, 0x02, 0x10, 0xbc, 0xbc, 0xfe, 0x7f, 0x01, \n\t0x81, 0x05, 0xe5, 0xf9, 0x7e, 0x9b, 0x07, 0xb8, 0x00, 0x01, 0x00, 0x27, \n\t0xff, 0x83, 0x03, 0x41, 0x05, 0xb0, 0x00, 0x03, 0x00, 0x13, 0x00, 0xb0, \n\t0x02, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, \n\t0x0c, 0x3e, 0x59, 0x30, 0x31, 0x13, 0x33, 0x01, 0x23, 0x27, 0xba, 0x02, \n\t0x60, 0xba, 0x05, 0xb0, 0xf9, 0xd3, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0b, \n\t0xfe, 0xc8, 0x01, 0x8d, 0x06, 0x80, 0x00, 0x07, 0x00, 0x24, 0x00, 0xb0, \n\t0x00, 0x2f, 0xb0, 0x03, 0x2f, 0xb1, 0x04, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x07, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x13, 0x21, \n\t0x11, 0x21, 0x35, 0x33, 0x11, 0x23, 0x0b, 0x01, 0x82, 0xfe, 0x7e, 0xbd, \n\t0xbd, 0x06, 0x80, 0xf8, 0x48, 0x9b, 0x06, 0x82, 0x00, 0x01, 0x00, 0x3d, \n\t0x02, 0xd9, 0x03, 0x18, 0x05, 0xb0, 0x00, 0x09, 0x00, 0x13, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, \n\t0xb0, 0x07, 0xd0, 0x30, 0x31, 0x13, 0x23, 0x01, 0x33, 0x01, 0x23, 0x03, \n\t0x27, 0x23, 0x07, 0xf4, 0xb7, 0x01, 0x2b, 0x86, 0x01, 0x2a, 0xb5, 0xa6, \n\t0x10, 0x06, 0x10, 0x02, 0xd9, 0x02, 0xd7, 0xfd, 0x29, 0x01, 0xa3, 0x46, \n\t0x46, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0xff, 0x66, 0x03, 0x9f, \n\t0x00, 0x00, 0x00, 0x03, 0x00, 0x1c, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x06, 0x3e, 0x59, 0xb1, 0x00, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x05, 0x21, \n\t0x35, 0x21, 0x03, 0x9f, 0xfc, 0x65, 0x03, 0x9b, 0x9a, 0x9a, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x52, 0x04, 0xbb, 0x01, 0xea, 0x05, 0xc5, 0x00, 0x04, \n\t0x00, 0x4b, 0x00, 0xb0, 0x00, 0x2f, 0xb2, 0x5f, 0x00, 0x01, 0x5d, 0xb2, \n\t0xaf, 0x00, 0x01, 0x5d, 0xb2, 0x1f, 0x00, 0x01, 0x71, 0xb2, 0x6f, 0x00, \n\t0x01, 0x71, 0xb2, 0x4f, 0x00, 0x01, 0x71, 0xb2, 0xff, 0x00, 0x01, 0x5d, \n\t0xb2, 0x7f, 0x00, 0x01, 0x5d, 0xb2, 0x3f, 0x00, 0x01, 0x5d, 0xb2, 0x0f, \n\t0x00, 0x01, 0x5d, 0xb0, 0x04, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, \n\t0x59, 0xb2, 0xaf, 0x04, 0x01, 0x5d, 0xb6, 0x0f, 0x04, 0x1f, 0x04, 0x2f, \n\t0x04, 0x03, 0x5d, 0x30, 0x31, 0x01, 0x23, 0x03, 0x37, 0x33, 0x01, 0xea, \n\t0x9e, 0xfa, 0x03, 0xe6, 0x04, 0xbb, 0x01, 0x04, 0x06, 0x00, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x6a, 0xff, 0xeb, 0x03, 0xf3, 0x04, 0x4e, 0x00, 0x20, \n\t0x00, 0x2b, 0x00, 0x6f, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x19, 0x2f, \n\t0x1b, 0xb1, 0x19, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, \n\t0x2f, 0x1b, 0xb1, 0x06, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x06, 0x3e, 0x59, 0xb2, 0x0c, 0x06, 0x19, \n\t0x11, 0x12, 0x39, 0xb0, 0x0c, 0x2f, 0xb4, 0xbf, 0x0c, 0xcf, 0x0c, 0x02, \n\t0x5d, 0xb0, 0x19, 0x10, 0xb1, 0x11, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x14, 0x19, 0x0c, 0x11, 0x12, 0x39, 0xb0, \n\t0x06, 0x10, 0xb1, 0x21, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x0c, 0x10, 0xb1, 0x26, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x21, 0x26, 0x26, 0x27, 0x06, \n\t0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x33, 0x35, 0x34, 0x26, \n\t0x23, 0x22, 0x06, 0x15, 0x23, 0x27, 0x26, 0x36, 0x33, 0x32, 0x16, 0x15, \n\t0x11, 0x14, 0x16, 0x17, 0x25, 0x32, 0x36, 0x37, 0x35, 0x23, 0x22, 0x06, \n\t0x15, 0x14, 0x16, 0x03, 0x28, 0x0a, 0x0b, 0x01, 0x37, 0xb1, 0x66, 0xa9, \n\t0xb1, 0xfb, 0xd7, 0xd6, 0x74, 0x6a, 0x5f, 0x77, 0xbc, 0x02, 0x06, 0xeb, \n\t0xba, 0xb8, 0xe0, 0x0c, 0x10, 0xfd, 0xee, 0x6b, 0xac, 0x1a, 0xdd, 0x77, \n\t0x8f, 0x5a, 0x31, 0x4b, 0x26, 0x4e, 0x69, 0xad, 0x98, 0x9b, 0xaf, 0x6b, \n\t0x5f, 0x6f, 0x61, 0x44, 0x06, 0x76, 0xc4, 0xbb, 0xb0, 0xfd, 0xf7, 0x3a, \n\t0x6c, 0x34, 0x90, 0x6e, 0x47, 0xb0, 0x78, 0x51, 0x48, 0x54, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x8f, 0xff, 0xeb, 0x04, 0x2b, 0x06, 0x18, 0x00, 0x11, \n\t0x00, 0x1f, 0x00, 0x50, 0x00, 0xb0, 0x0a, 0x2f, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x06, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x06, 0x3e, 0x59, 0xb2, \n\t0x2f, 0x0a, 0x01, 0x5d, 0xb0, 0x0e, 0x10, 0xb1, 0x15, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x1c, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x01, 0x14, 0x02, 0x23, 0x22, 0x26, 0x27, 0x07, 0x23, 0x11, 0x33, 0x11, \n\t0x36, 0x36, 0x33, 0x32, 0x12, 0x11, 0x23, 0x34, 0x26, 0x23, 0x22, 0x06, \n\t0x07, 0x11, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x04, 0x2b, 0xe1, 0xc5, \n\t0x6b, 0x9e, 0x34, 0x18, 0xa1, 0xc5, 0x33, 0x97, 0x65, 0xc8, 0xe0, 0xc5, \n\t0x89, 0x8c, 0x5b, 0x7d, 0x25, 0x26, 0x7b, 0x5e, 0x8b, 0x88, 0x01, 0xf4, \n\t0xea, 0xfe, 0xe1, 0x53, 0x51, 0x8f, 0x06, 0x18, 0xfd, 0xa2, 0x48, 0x4c, \n\t0xfe, 0xc0, 0xfe, 0xfb, 0xba, 0xeb, 0x59, 0x4b, 0xfe, 0x2b, 0x50, 0x5a, \n\t0xc6, 0xa3, 0x00, 0x00, 0x00, 0x01, 0x00, 0x61, 0xff, 0xeb, 0x03, 0xf6, \n\t0x04, 0x4e, 0x00, 0x1d, 0x00, 0x38, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x06, 0x3e, 0x59, 0xb1, 0x00, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0f, 0x10, \n\t0xb1, 0x17, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x25, 0x32, 0x36, 0x35, 0x33, 0x17, 0x16, 0x04, 0x23, 0x22, \n\t0x02, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x16, 0x07, 0x07, 0x23, 0x34, \n\t0x26, 0x23, 0x22, 0x06, 0x15, 0x15, 0x14, 0x16, 0x02, 0x47, 0x62, 0x95, \n\t0xb1, 0x02, 0x05, 0xfe, 0xfd, 0xac, 0xec, 0xfa, 0xfb, 0xeb, 0xbe, 0xf1, \n\t0x04, 0x02, 0xb2, 0x8c, 0x6b, 0x9b, 0x85, 0x84, 0x85, 0x79, 0x58, 0x06, \n\t0x8c, 0xd9, 0x01, 0x34, 0xe9, 0x2a, 0xe7, 0x01, 0x35, 0xe0, 0xa3, 0x06, \n\t0x63, 0x8b, 0xdf, 0xa2, 0x2a, 0xa6, 0xdd, 0x00, 0x00, 0x02, 0x00, 0x62, \n\t0xff, 0xeb, 0x03, 0xf5, 0x06, 0x18, 0x00, 0x11, 0x00, 0x1f, 0x00, 0x50, \n\t0x00, 0xb0, 0x07, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, \n\t0xb1, 0x03, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, \n\t0x1b, 0xb1, 0x0e, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, \n\t0x2f, 0x1b, 0xb1, 0x09, 0x06, 0x3e, 0x59, 0xb2, 0x2f, 0x07, 0x01, 0x5d, \n\t0xb0, 0x0e, 0x10, 0xb1, 0x15, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x1c, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x13, 0x10, 0x12, 0x33, \n\t0x32, 0x16, 0x17, 0x11, 0x33, 0x11, 0x23, 0x27, 0x06, 0x06, 0x23, 0x22, \n\t0x02, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x11, 0x26, 0x26, \n\t0x23, 0x22, 0x06, 0x15, 0x62, 0xdf, 0xc9, 0x5f, 0x93, 0x34, 0xc5, 0xa1, \n\t0x17, 0x35, 0x9a, 0x66, 0xc6, 0xe0, 0xc5, 0x86, 0x8d, 0x58, 0x78, 0x26, \n\t0x26, 0x79, 0x55, 0x8e, 0x87, 0x02, 0x09, 0x01, 0x05, 0x01, 0x40, 0x46, \n\t0x43, 0x02, 0x53, 0xf9, 0xe8, 0x85, 0x4c, 0x4e, 0x01, 0x1f, 0xea, 0xa4, \n\t0xc5, 0x50, 0x48, 0x01, 0xf9, 0x43, 0x4f, 0xea, 0xbb, 0x00, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x63, 0xff, 0xeb, 0x03, 0xed, 0x04, 0x4e, 0x00, 0x16, \n\t0x00, 0x1f, 0x00, 0x60, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, \n\t0x1b, 0xb1, 0x07, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, \n\t0x2f, 0x1b, 0xb1, 0x00, 0x06, 0x3e, 0x59, 0xb2, 0x0b, 0x00, 0x07, 0x11, \n\t0x12, 0x39, 0xb0, 0x0b, 0x2f, 0xb4, 0xd0, 0x0b, 0xe0, 0x0b, 0x02, 0x5d, \n\t0xb2, 0xa0, 0x0b, 0x01, 0x5d, 0xb0, 0x00, 0x10, 0xb1, 0x10, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x07, 0x10, 0xb1, \n\t0x17, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x0b, 0x10, 0xb1, 0x1c, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0x30, 0x31, 0x05, 0x22, 0x00, 0x35, 0x35, 0x34, 0x00, 0x33, \n\t0x32, 0x12, 0x15, 0x15, 0x21, 0x07, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, \n\t0x17, 0x06, 0x06, 0x03, 0x22, 0x06, 0x07, 0x17, 0x21, 0x35, 0x34, 0x26, \n\t0x02, 0x50, 0xe2, 0xfe, 0xf5, 0x01, 0x13, 0xbc, 0xdb, 0xe0, 0xfd, 0x42, \n\t0x03, 0x03, 0x98, 0x89, 0x64, 0x97, 0x37, 0x4d, 0x3a, 0xbe, 0xa5, 0x63, \n\t0x8c, 0x10, 0x02, 0x01, 0xf3, 0x7c, 0x15, 0x01, 0x2d, 0xf0, 0x2c, 0xe7, \n\t0x01, 0x33, 0xfe, 0xf8, 0xdc, 0x7b, 0x05, 0x9c, 0xc9, 0x39, 0x32, 0x80, \n\t0x39, 0x4c, 0x03, 0xc8, 0xa7, 0x7e, 0x05, 0x1a, 0x74, 0x9c, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x38, 0x00, 0x00, 0x02, 0xc9, 0x06, 0x2d, 0x00, 0x17, \n\t0x00, 0x59, 0x00, 0xb0, 0x08, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, \n\t0x2f, 0x1b, 0xb1, 0x03, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x13, 0x2f, 0x1b, 0xb1, 0x13, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x06, 0x3e, 0x59, 0xb0, 0x03, 0x10, \n\t0xb1, 0x01, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb2, 0x2f, 0x08, 0x01, 0x5d, 0xb0, 0x08, 0x10, 0xb1, 0x0f, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x01, 0x10, 0xb0, \n\t0x15, 0xd0, 0xb0, 0x16, 0xd0, 0x30, 0x31, 0x33, 0x11, 0x23, 0x35, 0x33, \n\t0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, \n\t0x06, 0x15, 0x15, 0x33, 0x15, 0x23, 0x11, 0xe1, 0xa9, 0xa9, 0xb5, 0xa2, \n\t0x22, 0x45, 0x2a, 0x18, 0x12, 0x33, 0x1c, 0x56, 0x54, 0xe1, 0xe1, 0x03, \n\t0xa8, 0x92, 0x89, 0xad, 0xbd, 0x0b, 0x0a, 0x96, 0x04, 0x06, 0x67, 0x62, \n\t0x89, 0x92, 0xfc, 0x58, 0x00, 0x02, 0x00, 0x64, 0xfe, 0x4b, 0x03, 0xfd, \n\t0x04, 0x4e, 0x00, 0x1d, 0x00, 0x2b, 0x00, 0x64, 0x00, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0a, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x0a, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x08, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1a, 0x2f, 0x1b, 0xb1, 0x1a, 0x06, 0x3e, \n\t0x59, 0xb0, 0x0c, 0x10, 0xb1, 0x13, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x1a, 0x10, 0xb1, 0x21, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x28, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x13, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x37, 0x33, 0x11, 0x14, 0x06, \n\t0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, \n\t0x06, 0x06, 0x23, 0x22, 0x02, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, \n\t0x37, 0x11, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x64, 0xe4, 0xc9, 0x67, \n\t0x9c, 0x34, 0x18, 0x9d, 0xf2, 0xe4, 0x4e, 0xb5, 0x45, 0x32, 0x35, 0x96, \n\t0x49, 0x90, 0x83, 0x35, 0x94, 0x60, 0xc7, 0xe4, 0xc5, 0x8a, 0x8d, 0x59, \n\t0x78, 0x27, 0x26, 0x7a, 0x56, 0x8d, 0x8c, 0x02, 0x09, 0x01, 0x05, 0x01, \n\t0x40, 0x53, 0x4e, 0x8d, 0xfb, 0xc0, 0xd0, 0xdf, 0x2b, 0x25, 0x99, 0x1e, \n\t0x25, 0x83, 0x86, 0x7a, 0x44, 0x45, 0x01, 0x20, 0xe9, 0xa3, 0xc6, 0x51, \n\t0x4a, 0x01, 0xf2, 0x45, 0x51, 0xec, 0xb9, 0x00, 0x00, 0x01, 0x00, 0x8f, \n\t0x00, 0x00, 0x04, 0x00, 0x06, 0x18, 0x00, 0x13, 0x00, 0x41, 0x00, 0xb0, \n\t0x13, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, \n\t0x07, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, \n\t0xb1, 0x10, 0x06, 0x3e, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x0c, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x2f, 0x13, 0x01, \n\t0x5d, 0x30, 0x31, 0x01, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x23, \n\t0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x23, 0x11, 0x33, 0x01, \n\t0x54, 0x38, 0xa3, 0x63, 0xad, 0xc1, 0xc5, 0x73, 0x72, 0x52, 0x85, 0x2b, \n\t0xc5, 0xc5, 0x03, 0xa9, 0x4e, 0x57, 0xd0, 0xd8, 0xfd, 0x5a, 0x02, 0xa8, \n\t0x86, 0x80, 0x4d, 0x42, 0xfc, 0xe1, 0x06, 0x18, 0x00, 0x02, 0x00, 0x9f, \n\t0x00, 0x00, 0x01, 0x64, 0x06, 0x18, 0x00, 0x03, 0x00, 0x07, 0x00, 0x36, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, \n\t0x06, 0x3e, 0x59, 0xb0, 0x02, 0x10, 0xb0, 0x05, 0xb0, 0x0a, 0x2b, 0x58, \n\t0xd8, 0x1b, 0xdc, 0x59, 0xb1, 0x06, 0x04, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x21, 0x23, 0x11, 0x33, 0x11, 0x23, \n\t0x35, 0x33, 0x01, 0x64, 0xc5, 0xc5, 0xc5, 0xc5, 0x04, 0x3a, 0x01, 0x15, \n\t0xc9, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbe, 0xfe, 0x4b, 0x01, 0x72, \n\t0x06, 0x18, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x4c, 0x00, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x08, 0x3e, 0x59, 0xb1, \n\t0x0b, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x00, 0x10, 0xb0, 0x10, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, \n\t0xb2, 0x80, 0x10, 0x01, 0x71, 0xb2, 0x20, 0x10, 0x01, 0x5d, 0xb1, 0x13, \n\t0x04, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x01, 0x11, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, \n\t0x32, 0x36, 0x35, 0x11, 0x13, 0x23, 0x35, 0x33, 0x01, 0x72, 0xac, 0x99, \n\t0x1f, 0x33, 0x1d, 0x0e, 0x0e, 0x34, 0x11, 0x41, 0x4d, 0xbf, 0xc5, 0xc5, \n\t0x04, 0x3a, 0xfb, 0x6d, 0xa7, 0xb5, 0x09, 0x09, 0x9b, 0x05, 0x07, 0x58, \n\t0x63, 0x04, 0x93, 0x01, 0x19, 0xc5, 0x00, 0x00, 0x00, 0x01, 0x00, 0x90, \n\t0x00, 0x00, 0x04, 0x1c, 0x06, 0x18, 0x00, 0x0c, 0x00, 0x57, 0x00, 0xb0, \n\t0x05, 0x2f, 0xb0, 0x06, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, \n\t0x1b, 0xb1, 0x09, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, \n\t0x2f, 0x1b, 0xb1, 0x02, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x06, 0x3e, 0x59, 0xb2, 0xef, 0x06, 0x01, \n\t0x5d, 0xb4, 0xaf, 0x06, 0xbf, 0x06, 0x02, 0x5d, 0xb2, 0x5f, 0x06, 0x01, \n\t0x5d, 0xb0, 0x06, 0x10, 0xb1, 0x01, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0a, 0x01, 0x06, 0x11, 0x12, 0x39, 0x30, \n\t0x31, 0x01, 0x23, 0x11, 0x23, 0x11, 0x33, 0x11, 0x33, 0x01, 0x33, 0x01, \n\t0x01, 0x23, 0x01, 0xd5, 0x80, 0xc5, 0xc5, 0x7e, 0x01, 0x28, 0xec, 0xfe, \n\t0x8e, 0x01, 0xa7, 0xe8, 0x01, 0xf3, 0xfe, 0x0d, 0x06, 0x18, 0xfc, 0x78, \n\t0x01, 0xaa, 0xfe, 0x14, 0xfd, 0xb2, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9f, \n\t0x00, 0x00, 0x01, 0x64, 0x06, 0x18, 0x00, 0x03, 0x00, 0x18, 0x00, 0xb0, \n\t0x02, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, \n\t0x06, 0x3e, 0x59, 0xb2, 0x2f, 0x02, 0x01, 0x5d, 0x30, 0x31, 0x21, 0x23, \n\t0x11, 0x33, 0x01, 0x64, 0xc5, 0xc5, 0x06, 0x18, 0x00, 0x01, 0x00, 0x8f, \n\t0x00, 0x00, 0x06, 0x6f, 0x04, 0x4e, 0x00, 0x23, 0x00, 0x6f, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x23, 0x2f, 0x1b, 0xb1, 0x23, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, \n\t0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x18, 0x2f, 0x1b, 0xb1, \n\t0x18, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x21, 0x2f, 0x1b, \n\t0xb1, 0x21, 0x06, 0x3e, 0x59, 0xb0, 0x0a, 0x10, 0xb1, 0x13, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb1, \n\t0x1d, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, \n\t0x31, 0x01, 0x17, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x36, 0x36, 0x33, \n\t0x32, 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, \n\t0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x23, \n\t0x11, 0x01, 0x3f, 0x0e, 0x35, 0xa3, 0x6c, 0x6c, 0x9b, 0x27, 0x33, 0xa8, \n\t0x70, 0xa5, 0xc0, 0xc5, 0x6e, 0x6d, 0x65, 0x7d, 0x0b, 0xc6, 0x71, 0x6a, \n\t0x5a, 0x74, 0x1f, 0xc5, 0x04, 0x3a, 0x8e, 0x4d, 0x55, 0x64, 0x64, 0x5c, \n\t0x6c, 0xe3, 0xe4, 0xfd, 0x79, 0x02, 0x89, 0xa0, 0x85, 0x8c, 0x6b, 0x08, \n\t0xfd, 0x51, 0x02, 0x89, 0x98, 0x8d, 0x4a, 0x43, 0xfc, 0xdf, 0x04, 0x3a, \n\t0x00, 0x01, 0x00, 0x8f, 0x00, 0x00, 0x03, 0xfd, 0x04, 0x4e, 0x00, 0x13, \n\t0x00, 0x46, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, \n\t0x04, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, \n\t0xb1, 0x00, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, \n\t0x1b, 0xb1, 0x08, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x11, \n\t0x2f, 0x1b, 0xb1, 0x11, 0x06, 0x3e, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x0d, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x01, 0x17, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, \n\t0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x23, 0x11, 0x01, 0x3f, 0x0e, 0x36, \n\t0xa3, 0x68, 0xaf, 0xc0, 0xc5, 0x71, 0x74, 0x55, 0x83, 0x27, 0xc5, 0x04, \n\t0x3a, 0xa1, 0x56, 0x5f, 0xcd, 0xd6, 0xfd, 0x55, 0x02, 0xa7, 0x8f, 0x78, \n\t0x52, 0x47, 0xfc, 0xeb, 0x04, 0x3a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x61, \n\t0xff, 0xeb, 0x04, 0x2a, 0x04, 0x4e, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x38, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, \n\t0x06, 0x3e, 0x59, 0xb1, 0x11, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x18, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x13, 0x34, 0x00, 0x33, \n\t0x32, 0x00, 0x15, 0x15, 0x14, 0x00, 0x23, 0x22, 0x00, 0x35, 0x33, 0x14, \n\t0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, \n\t0x61, 0x01, 0x04, 0xdf, 0xe1, 0x01, 0x05, 0xfe, 0xfc, 0xe0, 0xe0, 0xfe, \n\t0xfb, 0xc5, 0x91, 0x8f, 0x8d, 0x92, 0x93, 0x8e, 0x8d, 0x91, 0x02, 0x27, \n\t0xf0, 0x01, 0x37, 0xfe, 0xca, 0xf1, 0x16, 0xf2, 0xfe, 0xcc, 0x01, 0x35, \n\t0xf1, 0xac, 0xe0, 0xe0, 0xac, 0x16, 0xaa, 0xe2, 0xe2, 0xaa, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x8f, 0xfe, 0x60, 0x04, 0x29, 0x04, 0x4e, 0x00, 0x11, \n\t0x00, 0x1f, 0x00, 0x55, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, \n\t0x1b, 0xb1, 0x0e, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, \n\t0x2f, 0x1b, 0xb1, 0x0a, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x08, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x06, 0x3e, 0x59, 0xb0, 0x0e, 0x10, \n\t0xb1, 0x15, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x03, 0x10, 0xb1, 0x1c, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x14, 0x02, 0x23, 0x22, 0x26, 0x27, \n\t0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x36, 0x33, 0x32, 0x12, 0x11, 0x23, \n\t0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x16, 0x16, 0x33, 0x32, 0x36, \n\t0x35, 0x04, 0x29, 0xe0, 0xc5, 0x64, 0x97, 0x35, 0xc5, 0x97, 0x1f, 0x35, \n\t0x9e, 0x69, 0xc9, 0xdf, 0xc5, 0x91, 0x8d, 0x55, 0x78, 0x25, 0x25, 0x78, \n\t0x57, 0x8c, 0x90, 0x01, 0xf4, 0xea, 0xfe, 0xe1, 0x43, 0x43, 0xfd, 0xef, \n\t0x05, 0xda, 0x8c, 0x4e, 0x52, 0xfe, 0xc1, 0xfe, 0xfa, 0xb8, 0xed, 0x4d, \n\t0x43, 0xfd, 0xf5, 0x43, 0x4b, 0xcd, 0xa2, 0x00, 0x00, 0x02, 0x00, 0x62, \n\t0xfe, 0x60, 0x03, 0xea, 0x04, 0x4e, 0x00, 0x11, 0x00, 0x1f, 0x00, 0x52, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, \n\t0x09, 0x08, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, \n\t0xb1, 0x0e, 0x06, 0x3e, 0x59, 0xb1, 0x15, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x1c, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x13, 0x10, \n\t0x12, 0x33, 0x32, 0x16, 0x17, 0x37, 0x33, 0x11, 0x23, 0x11, 0x06, 0x06, \n\t0x23, 0x22, 0x02, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x11, \n\t0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x62, 0xdf, 0xc9, 0x63, 0x96, 0x34, \n\t0x1d, 0x96, 0xc5, 0x34, 0x8e, 0x5b, 0xc6, 0xe0, 0xc5, 0x87, 0x8c, 0x51, \n\t0x73, 0x27, 0x27, 0x73, 0x4f, 0x8d, 0x88, 0x02, 0x09, 0x01, 0x05, 0x01, \n\t0x40, 0x4b, 0x48, 0x7f, 0xfa, 0x26, 0x02, 0x06, 0x3d, 0x3e, 0x01, 0x1f, \n\t0xea, 0xa4, 0xcb, 0x48, 0x41, 0x02, 0x22, 0x3d, 0x46, 0xef, 0xbb, 0x00, \n\t0x00, 0x01, 0x00, 0x8f, 0x00, 0x00, 0x02, 0xaa, 0x04, 0x4e, 0x00, 0x0f, \n\t0x00, 0x3e, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, \n\t0x07, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, \n\t0xb1, 0x0c, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, \n\t0x1b, 0xb1, 0x05, 0x06, 0x3e, 0x59, 0xb0, 0x0c, 0x10, 0xb0, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb4, 0x8f, 0x01, 0x9f, 0x01, \n\t0x02, 0x5d, 0x30, 0x31, 0x01, 0x27, 0x22, 0x06, 0x07, 0x11, 0x23, 0x11, \n\t0x33, 0x17, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x02, 0x8f, 0x65, 0x4e, \n\t0x6b, 0x1d, 0xc5, 0xb0, 0x13, 0x2e, 0x87, 0x58, 0x16, 0x28, 0x0d, 0x03, \n\t0x8c, 0x06, 0x4a, 0x43, 0xfc, 0xfb, 0x04, 0x3a, 0x9e, 0x54, 0x5e, 0x07, \n\t0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x67, 0xff, 0xeb, 0x03, 0xc9, \n\t0x04, 0x4e, 0x00, 0x27, 0x00, 0x7e, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x1d, 0x2f, 0x1b, 0xb1, 0x1d, 0x06, 0x3e, 0x59, 0xb2, 0x17, 0x1d, \n\t0x09, 0x11, 0x12, 0x39, 0xb4, 0x29, 0x17, 0x39, 0x17, 0x02, 0x5d, 0xb6, \n\t0xb9, 0x17, 0xc9, 0x17, 0xd9, 0x17, 0x03, 0x5d, 0xb0, 0x17, 0x10, 0xb1, \n\t0x03, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x09, 0x10, 0xb0, 0x0e, 0xd0, 0xb2, 0x1d, 0x0e, 0x01, 0x5d, 0xb2, 0x0c, \n\t0x0e, 0x01, 0x5d, 0xb0, 0x09, 0x10, 0xb1, 0x11, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x1d, 0x10, 0xb0, 0x22, 0xd0, \n\t0xb4, 0x05, 0x22, 0x15, 0x22, 0x02, 0x5d, 0xb0, 0x1d, 0x10, 0xb1, 0x25, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x01, 0x34, 0x26, 0x27, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, \n\t0x07, 0x07, 0x23, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x17, \n\t0x16, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x37, 0x37, 0x33, 0x16, \n\t0x16, 0x33, 0x32, 0x36, 0x03, 0x04, 0x63, 0x8a, 0xc5, 0xc7, 0xe0, 0xb4, \n\t0xbd, 0xdf, 0x05, 0x02, 0xbc, 0x77, 0x62, 0x69, 0x66, 0x5a, 0x8a, 0xcd, \n\t0xc8, 0xe9, 0xbc, 0xcf, 0xee, 0x06, 0x02, 0xbc, 0x05, 0x92, 0x62, 0x69, \n\t0x77, 0x01, 0x1f, 0x41, 0x54, 0x1f, 0x2b, 0x93, 0x7f, 0x84, 0xba, 0xc2, \n\t0x8b, 0x06, 0x47, 0x71, 0x5c, 0x41, 0x40, 0x4a, 0x1d, 0x2c, 0x97, 0x7f, \n\t0x90, 0xb2, 0xd2, 0x8c, 0x06, 0x69, 0x61, 0x55, 0x00, 0x01, 0x00, 0x22, \n\t0xff, 0xeb, 0x02, 0x6a, 0x05, 0x3f, 0x00, 0x17, 0x00, 0x51, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x15, 0x2f, 0x1b, 0xb1, 0x15, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x06, \n\t0x3e, 0x59, 0xb0, 0x01, 0x10, 0xb1, 0x03, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0f, 0x10, 0xb1, 0x08, 0x03, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb0, \n\t0x13, 0xd0, 0xb0, 0x14, 0xd0, 0x30, 0x31, 0x01, 0x11, 0x33, 0x15, 0x23, \n\t0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, \n\t0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x01, 0x93, 0xcd, 0xcd, 0x3f, \n\t0x34, 0x11, 0x29, 0x10, 0x1a, 0x16, 0x55, 0x2b, 0x78, 0x8e, 0xac, 0xac, \n\t0x05, 0x3f, 0xfe, 0xfb, 0x92, 0xfd, 0x6f, 0x4c, 0x3e, 0x08, 0x06, 0x87, \n\t0x12, 0x17, 0x91, 0x9b, 0x02, 0x91, 0x92, 0x01, 0x05, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x8b, 0xff, 0xeb, 0x03, 0xfc, 0x04, 0x3a, 0x00, 0x13, \n\t0x00, 0x46, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, \n\t0x07, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, \n\t0xb1, 0x10, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, \n\t0x1b, 0xb1, 0x03, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, \n\t0x2f, 0x1b, 0xb1, 0x12, 0x06, 0x3e, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x0c, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x25, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, \n\t0x33, 0x32, 0x36, 0x37, 0x11, 0x33, 0x11, 0x23, 0x03, 0x3e, 0x33, 0xa0, \n\t0x69, 0xb1, 0xc6, 0xc5, 0x66, 0x6c, 0x69, 0x89, 0x23, 0xc5, 0xb1, 0xa0, \n\t0x57, 0x5e, 0xe2, 0xef, 0x02, 0x7e, 0xfd, 0x80, 0xad, 0x82, 0x55, 0x4e, \n\t0x03, 0x0c, 0xfb, 0xc6, 0x00, 0x01, 0x00, 0x2e, 0x00, 0x00, 0x03, 0xe4, \n\t0x04, 0x3a, 0x00, 0x09, 0x00, 0x3b, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x06, 0x3e, 0x59, 0xb0, 0x01, \n\t0xd0, 0x40, 0x0b, 0x54, 0x01, 0x64, 0x01, 0x74, 0x01, 0x84, 0x01, 0x94, \n\t0x01, 0x05, 0x5d, 0x30, 0x31, 0x01, 0x17, 0x33, 0x37, 0x13, 0x33, 0x01, \n\t0x23, 0x01, 0x33, 0x01, 0xf8, 0x11, 0x06, 0x13, 0xf9, 0xc9, 0xfe, 0x72, \n\t0x95, 0xfe, 0x6d, 0xca, 0x01, 0x3f, 0x4c, 0x4c, 0x02, 0xfb, 0xfb, 0xc6, \n\t0x04, 0x3a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2d, 0x00, 0x00, 0x05, 0xdc, \n\t0x04, 0x3a, 0x00, 0x15, 0x00, 0x83, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x14, 0x2f, 0x1b, 0xb1, 0x14, 0x0a, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x06, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x06, 0x3e, 0x59, \n\t0xb0, 0x02, 0xd0, 0x40, 0x0d, 0x44, 0x02, 0x54, 0x02, 0x64, 0x02, 0x74, \n\t0x02, 0x84, 0x02, 0x94, 0x02, 0x06, 0x5d, 0xb0, 0x0c, 0x10, 0xb0, 0x07, \n\t0xd0, 0x40, 0x0d, 0x44, 0x07, 0x54, 0x07, 0x64, 0x07, 0x74, 0x07, 0x84, \n\t0x07, 0x94, 0x07, 0x06, 0x5d, 0xb0, 0x04, 0x10, 0xb0, 0x0f, 0xd0, 0x40, \n\t0x0d, 0x4b, 0x0f, 0x5b, 0x0f, 0x6b, 0x0f, 0x7b, 0x0f, 0x8b, 0x0f, 0x9b, \n\t0x0f, 0x06, 0x5d, 0x30, 0x31, 0x01, 0x17, 0x33, 0x37, 0x13, 0x33, 0x13, \n\t0x17, 0x33, 0x37, 0x13, 0x33, 0x01, 0x23, 0x03, 0x27, 0x07, 0x07, 0x03, \n\t0x23, 0x01, 0x33, 0x01, 0xa4, 0x17, 0x06, 0x1c, 0xd8, 0x9e, 0xd9, 0x1f, \n\t0x06, 0x1d, 0xaa, 0xc4, 0xfe, 0xc6, 0x9f, 0xd1, 0x2d, 0x06, 0x2b, 0xce, \n\t0x9f, 0xfe, 0xc6, 0xc4, 0x01, 0x8a, 0x83, 0x83, 0x02, 0xb0, 0xfd, 0x50, \n\t0x92, 0x92, 0x02, 0xb0, 0xfb, 0xc6, 0x02, 0x93, 0xb8, 0x01, 0xb7, 0xfd, \n\t0x6d, 0x04, 0x3a, 0x00, 0x00, 0x01, 0x00, 0x2e, 0x00, 0x00, 0x03, 0xd4, \n\t0x04, 0x3a, 0x00, 0x0b, 0x00, 0x53, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x06, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x06, 0x3e, 0x59, 0xb2, \n\t0x00, 0x07, 0x0a, 0x11, 0x12, 0x39, 0xb2, 0x95, 0x00, 0x01, 0x5d, 0xb0, \n\t0x00, 0x10, 0xb0, 0x06, 0xd0, 0xb2, 0x7b, 0x06, 0x01, 0x5d, 0xb2, 0x9a, \n\t0x06, 0x01, 0x5d, 0x30, 0x31, 0x01, 0x13, 0x33, 0x01, 0x01, 0x23, 0x03, \n\t0x03, 0x23, 0x01, 0x01, 0x33, 0x01, 0xfe, 0xe6, 0xe6, 0xfe, 0xa1, 0x01, \n\t0x69, 0xe2, 0xf0, 0xf0, 0xe4, 0x01, 0x69, 0xfe, 0xa1, 0xe3, 0x02, 0xab, \n\t0x01, 0x8f, 0xfd, 0xe9, 0xfd, 0xdd, 0x01, 0x99, 0xfe, 0x67, 0x02, 0x23, \n\t0x02, 0x17, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1a, 0xfe, 0x4b, 0x03, 0xe8, \n\t0x04, 0x3a, 0x00, 0x15, 0x00, 0x52, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x14, 0x2f, 0x1b, 0xb1, 0x14, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x08, 0x3e, 0x59, 0xb2, 0x13, \n\t0x08, 0x14, 0x11, 0x12, 0x39, 0xb0, 0x13, 0x10, 0xb0, 0x01, 0xd0, 0x40, \n\t0x09, 0x64, 0x01, 0x74, 0x01, 0x84, 0x01, 0x94, 0x01, 0x04, 0x5d, 0xb0, \n\t0x08, 0x10, 0xb1, 0x0f, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0x30, 0x31, 0x01, 0x17, 0x33, 0x01, 0x33, 0x01, 0x06, 0x06, \n\t0x23, 0x22, 0x26, 0x27, 0x37, 0x26, 0x16, 0x33, 0x32, 0x36, 0x37, 0x37, \n\t0x01, 0x33, 0x01, 0xda, 0x23, 0x06, 0x01, 0x0a, 0xdb, 0xfe, 0x39, 0x29, \n\t0x99, 0x82, 0x18, 0x4a, 0x14, 0x14, 0x06, 0x53, 0x0b, 0x3f, 0x50, 0x1b, \n\t0x2f, 0xfe, 0x6e, 0xdc, 0x01, 0x91, 0x88, 0x03, 0x31, 0xfb, 0x20, 0x6d, \n\t0xa2, 0x0b, 0x05, 0x9b, 0x01, 0x06, 0x70, 0x44, 0x71, 0x04, 0x24, 0x00, \n\t0x00, 0x01, 0x00, 0x5e, 0x00, 0x00, 0x03, 0xba, 0x04, 0x3a, 0x00, 0x09, \n\t0x00, 0x3e, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, \n\t0x07, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, \n\t0xb1, 0x02, 0x06, 0x3e, 0x59, 0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0xd0, 0xb0, 0x07, 0x10, 0xb1, \n\t0x05, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x09, 0xd0, 0x30, 0x31, 0x25, 0x21, 0x15, 0x21, 0x35, 0x01, 0x21, 0x35, \n\t0x21, 0x15, 0x01, 0x49, 0x02, 0x71, 0xfc, 0xa4, 0x02, 0x49, 0xfd, 0xbe, \n\t0x03, 0x33, 0x9a, 0x9a, 0x8a, 0x03, 0x14, 0x9c, 0x86, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x3f, 0xfe, 0x94, 0x02, 0x9f, 0x06, 0x3d, 0x00, 0x1e, \n\t0x00, 0x1b, 0x00, 0xb0, 0x08, 0x2f, 0xb0, 0x00, 0x2f, 0xb0, 0x0f, 0x2f, \n\t0xb0, 0x08, 0x10, 0xb1, 0x07, 0x05, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x26, 0x26, 0x35, 0x35, 0x34, 0x26, \n\t0x23, 0x35, 0x32, 0x36, 0x35, 0x35, 0x34, 0x36, 0x37, 0x17, 0x06, 0x06, \n\t0x15, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, 0x15, 0x14, 0x16, 0x17, \n\t0x02, 0x77, 0xc3, 0xa4, 0x67, 0x6a, 0x6a, 0x67, 0xa4, 0xc3, 0x28, 0x6e, \n\t0x5c, 0x55, 0x55, 0x55, 0x55, 0x5c, 0x6e, 0xfe, 0x94, 0x37, 0xf0, 0xaa, \n\t0xcd, 0x70, 0x7d, 0x93, 0x7b, 0x71, 0xce, 0xab, 0xef, 0x37, 0x75, 0x23, \n\t0xb5, 0x84, 0xce, 0x69, 0xa0, 0x2d, 0x2e, 0xa1, 0x67, 0xcd, 0x84, 0xb3, \n\t0x24, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xaf, 0xfe, 0xf2, 0x01, 0x4d, \n\t0x05, 0xb0, 0x00, 0x03, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0x30, \n\t0x31, 0x01, 0x23, 0x11, 0x33, 0x01, 0x4d, 0x9e, 0x9e, 0xfe, 0xf2, 0x06, \n\t0xbe, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x15, 0xfe, 0x94, 0x02, 0x76, \n\t0x06, 0x3d, 0x00, 0x1e, 0x00, 0x18, 0x00, 0xb0, 0x0f, 0x2f, 0xb0, 0x1e, \n\t0x2f, 0xb0, 0x16, 0x2f, 0xb1, 0x17, 0x05, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x17, 0x36, 0x36, 0x35, 0x35, 0x34, \n\t0x36, 0x37, 0x26, 0x26, 0x35, 0x35, 0x34, 0x26, 0x27, 0x37, 0x16, 0x16, \n\t0x15, 0x15, 0x14, 0x16, 0x33, 0x15, 0x22, 0x06, 0x15, 0x15, 0x14, 0x06, \n\t0x07, 0x15, 0x6d, 0x5e, 0x5a, 0x5e, 0x5e, 0x5a, 0x5e, 0x6d, 0x29, 0xc2, \n\t0xa5, 0x65, 0x6c, 0x6c, 0x65, 0xa5, 0xc2, 0xf6, 0x24, 0xb3, 0x84, 0xcd, \n\t0x6b, 0xa0, 0x2b, 0x29, 0xa0, 0x6d, 0xce, 0x84, 0xb5, 0x23, 0x75, 0x37, \n\t0xef, 0xab, 0xce, 0x71, 0x7b, 0x93, 0x7d, 0x70, 0xcd, 0xaa, 0xf0, 0x37, \n\t0x00, 0x01, 0x00, 0x80, 0x01, 0x91, 0x04, 0xf0, 0x03, 0x23, 0x00, 0x19, \n\t0x00, 0x37, 0x00, 0xb0, 0x10, 0x2f, 0xb0, 0x16, 0xb0, 0x0a, 0x2b, 0x58, \n\t0xd8, 0x1b, 0xdc, 0x59, 0xb1, 0x03, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x10, 0x10, 0xb1, 0x09, 0x03, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb0, 0x0c, \n\t0xd0, 0xb0, 0x10, 0x10, 0xb0, 0x19, 0xd0, 0x30, 0x31, 0x01, 0x14, 0x06, \n\t0x23, 0x22, 0x26, 0x27, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x27, 0x34, \n\t0x36, 0x33, 0x32, 0x16, 0x17, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x04, \n\t0xf0, 0xae, 0x82, 0x5a, 0x93, 0x55, 0x3b, 0x62, 0x32, 0x43, 0x5f, 0x8d, \n\t0xab, 0x84, 0x58, 0x96, 0x55, 0x3a, 0x60, 0x34, 0x42, 0x61, 0x02, 0xe4, \n\t0x89, 0xca, 0x42, 0x4a, 0x30, 0x30, 0x6a, 0x4b, 0x12, 0x88, 0xc1, 0x45, \n\t0x46, 0x33, 0x2e, 0x72, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x90, \n\t0xfe, 0x8a, 0x01, 0x55, 0x04, 0x3a, 0x00, 0x03, 0x00, 0x07, 0x00, 0x26, \n\t0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, \n\t0xb1, 0x06, 0x0a, 0x3e, 0x59, 0xb1, 0x04, 0x04, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x03, 0x04, 0x00, 0x11, 0x12, 0x39, \n\t0x30, 0x31, 0x01, 0x23, 0x11, 0x33, 0x11, 0x23, 0x35, 0x33, 0x01, 0x55, \n\t0xc5, 0xc5, 0xc5, 0xc5, 0xfe, 0x8a, 0x03, 0xd2, 0x01, 0x10, 0xce, 0x00, \n\t0x00, 0x01, 0x00, 0x6b, 0xff, 0x0b, 0x04, 0x00, 0x05, 0x26, 0x00, 0x23, \n\t0x00, 0x44, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x15, 0x2f, 0x1b, 0xb1, \n\t0x15, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, \n\t0xb1, 0x08, 0x06, 0x3e, 0x59, 0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x08, 0x10, 0xb0, 0x0b, 0xd0, 0xb0, \n\t0x15, 0x10, 0xb0, 0x12, 0xd0, 0xb0, 0x15, 0x10, 0xb1, 0x1d, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x25, 0x32, \n\t0x36, 0x35, 0x33, 0x17, 0x16, 0x06, 0x07, 0x15, 0x23, 0x35, 0x26, 0x02, \n\t0x35, 0x35, 0x34, 0x12, 0x37, 0x35, 0x33, 0x15, 0x16, 0x16, 0x07, 0x07, \n\t0x23, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x15, 0x14, 0x16, 0x02, 0x51, \n\t0x62, 0x95, 0xb2, 0x03, 0x03, 0xca, 0x92, 0xc6, 0xb6, 0xbd, 0xbe, 0xb5, \n\t0xc6, 0x9d, 0xbf, 0x03, 0x02, 0xb3, 0x8c, 0x6b, 0x9b, 0x85, 0x84, 0x85, \n\t0x79, 0x58, 0x06, 0x7a, 0xca, 0x19, 0xe8, 0xec, 0x24, 0x01, 0x24, 0xc9, \n\t0x2a, 0xc7, 0x01, 0x23, 0x26, 0xe4, 0xdf, 0x18, 0xd5, 0x90, 0x05, 0x63, \n\t0x8b, 0xdf, 0xa2, 0x2a, 0xa6, 0xdd, 0x00, 0x00, 0x00, 0x01, 0x00, 0x46, \n\t0x00, 0x00, 0x04, 0x57, 0x05, 0xc5, 0x00, 0x22, 0x00, 0x61, 0x00, 0xb0, \n\t0x20, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x14, 0x2f, 0x1b, 0xb1, 0x14, \n\t0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, \n\t0x06, 0x06, 0x3e, 0x59, 0xb2, 0x0f, 0x20, 0x01, 0x5d, 0xb0, 0x20, 0x10, \n\t0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x06, 0x10, 0xb1, 0x04, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x09, 0xd0, 0xb0, 0x00, 0x10, 0xb0, 0x0d, 0xd0, \n\t0xb0, 0x20, 0x10, 0xb0, 0x0f, 0xd0, 0xb0, 0x14, 0x10, 0xb1, 0x1c, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, \n\t0x17, 0x14, 0x06, 0x07, 0x21, 0x07, 0x21, 0x35, 0x33, 0x36, 0x36, 0x35, \n\t0x27, 0x23, 0x35, 0x33, 0x03, 0x34, 0x36, 0x33, 0x32, 0x16, 0x07, 0x07, \n\t0x23, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x13, 0x21, 0x15, 0x01, 0xae, \n\t0x06, 0x1f, 0x1d, 0x02, 0xdf, 0x01, 0xfc, 0x30, 0x0a, 0x30, 0x30, 0x06, \n\t0xa4, 0x9e, 0x0a, 0xe0, 0xbc, 0xc8, 0xdc, 0x04, 0x02, 0xbe, 0x7e, 0x62, \n\t0x63, 0x74, 0x0a, 0x01, 0xa2, 0x02, 0x67, 0x95, 0x5a, 0xa3, 0x3b, 0x9a, \n\t0x9a, 0x0d, 0xc4, 0x67, 0x95, 0x9b, 0x01, 0x0e, 0xcc, 0xe9, 0xd1, 0xac, \n\t0x06, 0x76, 0x72, 0x95, 0x85, 0xfe, 0xf2, 0x9b, 0x00, 0x02, 0x00, 0x68, \n\t0xff, 0xe5, 0x05, 0x5a, 0x04, 0xf1, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x2e, \n\t0x00, 0xb0, 0x15, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, \n\t0xb1, 0x03, 0x06, 0x3e, 0x59, 0xb1, 0x27, 0x03, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x15, 0x10, 0xb1, 0x2d, 0x03, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x25, 0x06, \n\t0x06, 0x23, 0x22, 0x26, 0x27, 0x07, 0x27, 0x37, 0x26, 0x26, 0x35, 0x34, \n\t0x36, 0x37, 0x27, 0x37, 0x17, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x37, \n\t0x17, 0x07, 0x16, 0x16, 0x15, 0x14, 0x06, 0x07, 0x17, 0x07, 0x01, 0x14, \n\t0x12, 0x33, 0x32, 0x12, 0x35, 0x34, 0x02, 0x23, 0x22, 0x02, 0x04, 0x49, \n\t0x4d, 0xb9, 0x65, 0x65, 0xb9, 0x4b, 0x82, 0x8b, 0x8a, 0x32, 0x35, 0x39, \n\t0x36, 0x92, 0x8b, 0x8f, 0x4a, 0xb2, 0x60, 0x61, 0xb2, 0x4b, 0x92, 0x8c, \n\t0x96, 0x34, 0x39, 0x35, 0x30, 0x8e, 0x8c, 0xfc, 0x73, 0xf1, 0xac, 0xaa, \n\t0xf1, 0xf1, 0xaa, 0xac, 0xf1, 0x6c, 0x3e, 0x42, 0x41, 0x3d, 0x84, 0x8a, \n\t0x8c, 0x4c, 0xb5, 0x63, 0x66, 0xbc, 0x4e, 0x95, 0x8b, 0x92, 0x37, 0x3d, \n\t0x3e, 0x38, 0x95, 0x8c, 0x99, 0x4e, 0xb9, 0x65, 0x62, 0xb3, 0x4c, 0x8f, \n\t0x8b, 0x02, 0x7b, 0xbc, 0xfe, 0xf7, 0x01, 0x09, 0xbc, 0xba, 0x01, 0x08, \n\t0xfe, 0xf8, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1e, 0x00, 0x00, 0x04, 0xaf, \n\t0x05, 0xb0, 0x00, 0x16, 0x00, 0x6d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x16, 0x2f, 0x1b, 0xb1, 0x16, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x06, 0x3e, 0x59, 0xb2, 0x0f, \n\t0x13, 0x03, 0x2b, 0xb2, 0x00, 0x0c, 0x16, 0x11, 0x12, 0x39, 0xb4, 0x0f, \n\t0x13, 0x1f, 0x13, 0x02, 0x5d, 0xb0, 0x13, 0x10, 0xb0, 0x04, 0xd0, 0xb0, \n\t0x13, 0x10, 0xb1, 0x12, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x06, 0xd0, 0xb0, 0x0f, 0x10, 0xb0, 0x07, 0xd0, 0xb0, \n\t0x0f, 0x10, 0xb1, 0x0e, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x0a, 0xd0, 0x30, 0x31, 0x01, 0x01, 0x33, 0x01, 0x21, \n\t0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, \n\t0x35, 0x21, 0x35, 0x21, 0x01, 0x33, 0x02, 0x67, 0x01, 0x68, 0xe0, 0xfe, \n\t0x5e, 0x01, 0x38, 0xfe, 0x81, 0x01, 0x7f, 0xfe, 0x81, 0xc5, 0xfe, 0x89, \n\t0x01, 0x77, 0xfe, 0x89, 0x01, 0x37, 0xfe, 0x5d, 0xe2, 0x03, 0x19, 0x02, \n\t0x97, 0xfd, 0x32, 0x9b, 0x87, 0x9b, 0xfe, 0xdb, 0x01, 0x25, 0x9b, 0x87, \n\t0x9b, 0x02, 0xce, 0x00, 0x00, 0x02, 0x00, 0x91, 0xfe, 0xf2, 0x01, 0x56, \n\t0x05, 0xb0, 0x00, 0x03, 0x00, 0x07, 0x00, 0x23, 0x00, 0xb0, 0x00, 0x2f, \n\t0xb0, 0x05, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, \n\t0x06, 0x0c, 0x3e, 0x59, 0xb0, 0x05, 0x10, 0xb0, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, 0x13, 0x11, 0x33, 0x11, 0x11, \n\t0x23, 0x11, 0x33, 0x91, 0xc5, 0xc5, 0xc5, 0xfe, 0xf2, 0x03, 0x18, 0xfc, \n\t0xe8, 0x03, 0xc8, 0x02, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5a, \n\t0xfe, 0x11, 0x04, 0x7c, 0x05, 0xc5, 0x00, 0x33, 0x00, 0x45, 0x00, 0x5b, \n\t0x00, 0xb0, 0x09, 0x2f, 0xb0, 0x31, 0x2f, 0xb0, 0x17, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x23, 0x2f, 0x1b, 0xb1, 0x23, 0x0c, 0x3e, 0x59, 0xb0, \n\t0x17, 0x10, 0xb1, 0x3d, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x03, 0xd0, 0xb0, 0x09, 0x10, 0xb1, 0x11, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x31, 0x10, 0xb1, \n\t0x34, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x1d, 0xd0, 0xb0, 0x23, 0x10, 0xb1, 0x2b, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x14, 0x06, 0x07, 0x16, \n\t0x16, 0x15, 0x14, 0x04, 0x23, 0x22, 0x24, 0x3f, 0x02, 0x14, 0x16, 0x33, \n\t0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, \n\t0x26, 0x26, 0x35, 0x34, 0x24, 0x33, 0x32, 0x04, 0x07, 0x07, 0x23, 0x34, \n\t0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x17, 0x16, 0x16, 0x25, 0x26, \n\t0x26, 0x27, 0x06, 0x06, 0x15, 0x14, 0x16, 0x17, 0x16, 0x16, 0x17, 0x36, \n\t0x36, 0x35, 0x34, 0x26, 0x04, 0x7c, 0x60, 0x57, 0x45, 0x46, 0xfe, 0xf6, \n\t0xe1, 0xdd, 0xfe, 0xd2, 0x05, 0x02, 0xbc, 0xc1, 0x87, 0x89, 0x9d, 0x90, \n\t0xcc, 0xef, 0xe2, 0x5e, 0x57, 0x44, 0x44, 0x01, 0x0c, 0xe0, 0xe9, 0x01, \n\t0x04, 0x04, 0x03, 0xbc, 0x9e, 0x8c, 0x91, 0x96, 0x86, 0xd3, 0xf4, 0xdf, \n\t0xfd, 0xdf, 0x2f, 0x53, 0x24, 0x49, 0x49, 0x88, 0xd2, 0x38, 0x4a, 0x21, \n\t0x48, 0x50, 0x93, 0x01, 0xaf, 0x5e, 0x8c, 0x28, 0x33, 0x88, 0x62, 0xac, \n\t0xc3, 0xcd, 0xdc, 0x06, 0x02, 0x8f, 0x87, 0x77, 0x5b, 0x5b, 0x65, 0x3f, \n\t0x3f, 0xba, 0xb1, 0x5b, 0x8d, 0x29, 0x32, 0x8b, 0x61, 0xa6, 0xc9, 0xdf, \n\t0xca, 0x06, 0x76, 0x9e, 0x77, 0x5b, 0x63, 0x63, 0x3a, 0x45, 0xb5, 0x53, \n\t0x0c, 0x19, 0x0f, 0x13, 0x64, 0x45, 0x64, 0x67, 0x3b, 0x11, 0x16, 0x0c, \n\t0x14, 0x63, 0x45, 0x5b, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xaa, \n\t0x04, 0xe8, 0x03, 0x5b, 0x05, 0xb0, 0x00, 0x03, 0x00, 0x07, 0x00, 0x25, \n\t0x00, 0xb0, 0x04, 0x2f, 0xb2, 0x3f, 0x04, 0x01, 0x5d, 0xb2, 0xbf, 0x04, \n\t0x01, 0x5d, 0xb0, 0x01, 0xd0, 0xb0, 0x04, 0x10, 0xb1, 0x07, 0x04, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x02, 0xd0, 0x30, \n\t0x31, 0x01, 0x23, 0x35, 0x33, 0x05, 0x23, 0x35, 0x33, 0x03, 0x5b, 0xdb, \n\t0xdb, 0xfe, 0x2a, 0xdb, 0xdb, 0x04, 0xe8, 0xc8, 0xc8, 0xc8, 0x00, 0x00, \n\t0x00, 0x03, 0x00, 0x58, 0xff, 0xeb, 0x05, 0xe3, 0x05, 0xc4, 0x00, 0x1d, \n\t0x00, 0x29, 0x00, 0x35, 0x00, 0x74, 0x00, 0xb0, 0x0b, 0x2f, 0xb0, 0x04, \n\t0x2f, 0xb0, 0x10, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x2d, 0x2f, 0x1b, \n\t0xb1, 0x2d, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x33, 0x2f, \n\t0x1b, 0xb1, 0x33, 0x06, 0x3e, 0x59, 0xb4, 0x0f, 0x04, 0x1f, 0x04, 0x02, \n\t0x5d, 0xb2, 0x10, 0x0b, 0x01, 0x5d, 0xb0, 0x0b, 0x10, 0xb1, 0x13, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, \n\t0xb1, 0x1a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x10, 0x10, 0xb0, 0x1d, 0xd0, 0xb0, 0x33, 0x10, 0xb1, 0x21, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x2d, 0x10, \n\t0xb1, 0x27, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x01, 0x17, 0x16, 0x06, 0x23, 0x22, 0x26, 0x35, 0x35, 0x34, \n\t0x36, 0x33, 0x32, 0x16, 0x07, 0x07, 0x23, 0x34, 0x26, 0x23, 0x22, 0x06, \n\t0x15, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x25, 0x10, 0x00, 0x33, \n\t0x32, 0x00, 0x11, 0x10, 0x00, 0x23, 0x22, 0x00, 0x03, 0x10, 0x00, 0x21, \n\t0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x04, 0x57, 0x02, 0x04, \n\t0xb0, 0x9d, 0xa0, 0xbc, 0xbc, 0xa0, 0x9d, 0xb1, 0x04, 0x02, 0x92, 0x5b, \n\t0x5b, 0x5e, 0x66, 0x66, 0x5e, 0x5b, 0x5a, 0xfd, 0x0c, 0x01, 0x57, 0xf6, \n\t0xf5, 0x01, 0x58, 0xfe, 0xa8, 0xf5, 0xf6, 0xfe, 0xa9, 0x79, 0x01, 0x9e, \n\t0x01, 0x28, 0x01, 0x27, 0x01, 0x9e, 0xfe, 0x61, 0xfe, 0xda, 0xfe, 0xd8, \n\t0xfe, 0x62, 0x02, 0x54, 0x06, 0x97, 0x9d, 0xd5, 0xae, 0x77, 0xad, 0xd6, \n\t0x9e, 0x95, 0x06, 0x5f, 0x57, 0x8d, 0x72, 0x78, 0x75, 0x8c, 0x56, 0x62, \n\t0x85, 0xfe, 0xf7, 0xfe, 0x94, 0x01, 0x6c, 0x01, 0x09, 0x01, 0x07, 0x01, \n\t0x6a, 0xfe, 0x96, 0xfe, 0xf9, 0x01, 0x3b, 0x01, 0xb0, 0xfe, 0x50, 0xfe, \n\t0xc5, 0xfe, 0xc4, 0xfe, 0x4e, 0x01, 0xb2, 0x00, 0x00, 0x02, 0x00, 0x78, \n\t0x02, 0xb4, 0x03, 0x13, 0x05, 0xc5, 0x00, 0x20, 0x00, 0x2b, 0x00, 0x75, \n\t0x00, 0xb0, 0x06, 0x2f, 0xb0, 0x0c, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x19, 0x2f, 0x1b, 0xb1, 0x19, 0x0c, 0x3e, 0x59, 0xb2, 0x7f, 0x06, 0x01, \n\t0x5d, 0xb2, 0xaf, 0x06, 0x01, 0x5d, 0xb2, 0x20, 0x06, 0x01, 0x5d, 0xb0, \n\t0x06, 0x10, 0xb0, 0x00, 0xd0, 0xb4, 0xcf, 0x0c, 0xdf, 0x0c, 0x02, 0x71, \n\t0xb2, 0xff, 0x0c, 0x01, 0x71, 0xb2, 0x7f, 0x0c, 0x01, 0x5d, 0xb2, 0x10, \n\t0x0c, 0x01, 0x5d, 0xb0, 0x19, 0x10, 0xb1, 0x11, 0x05, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x14, 0x0c, 0x19, 0x11, 0x12, \n\t0x39, 0xb0, 0x06, 0x10, 0xb1, 0x21, 0x05, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0c, 0x10, 0xb1, 0x26, 0x05, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x26, 0x26, \n\t0x27, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x33, 0x35, \n\t0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x27, 0x27, 0x26, 0x36, 0x33, 0x32, \n\t0x16, 0x15, 0x11, 0x14, 0x16, 0x17, 0x25, 0x32, 0x36, 0x37, 0x35, 0x23, \n\t0x22, 0x06, 0x15, 0x14, 0x16, 0x02, 0x65, 0x08, 0x0a, 0x03, 0x21, 0x71, \n\t0x4d, 0x77, 0x82, 0xa9, 0xa1, 0x8b, 0x3c, 0x3a, 0x43, 0x49, 0xa2, 0x01, \n\t0x06, 0xa9, 0x8c, 0x86, 0x9c, 0x0c, 0x0e, 0xfe, 0x88, 0x33, 0x6d, 0x12, \n\t0x8a, 0x4b, 0x53, 0x3a, 0x02, 0xc2, 0x15, 0x30, 0x1a, 0x2f, 0x3e, 0x7a, \n\t0x6a, 0x6e, 0x78, 0x34, 0x3f, 0x44, 0x36, 0x31, 0x0d, 0x06, 0x62, 0x82, \n\t0x8e, 0x86, 0xfe, 0xc6, 0x32, 0x58, 0x2b, 0x7d, 0x3c, 0x23, 0x6e, 0x42, \n\t0x2e, 0x2d, 0x30, 0x00, 0xff, 0xff, 0x00, 0x62, 0x00, 0x76, 0x03, 0x6b, \n\t0x03, 0x93, 0x00, 0x26, 0x03, 0x43, 0xf6, 0xde, 0x00, 0x07, 0x03, 0x43, \n\t0x01, 0x44, 0xff, 0xde, 0x00, 0x01, 0x00, 0x7f, 0x01, 0x77, 0x03, 0xc2, \n\t0x03, 0x22, 0x00, 0x05, 0x00, 0x12, 0x00, 0xb0, 0x04, 0x2f, 0xb1, 0x02, \n\t0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x01, 0x23, 0x11, 0x21, 0x35, 0x21, 0x03, 0xc2, 0xc6, 0xfd, 0x83, 0x03, \n\t0x43, 0x01, 0x77, 0x01, 0x06, 0xa5, 0x00, 0x00, 0xff, 0xff, 0x00, 0x23, \n\t0x02, 0x1a, 0x02, 0x0d, 0x02, 0xb4, 0x02, 0x06, 0x00, 0x10, 0x00, 0x00, \n\t0x00, 0x04, 0x00, 0x58, 0xff, 0xeb, 0x05, 0xe3, 0x05, 0xc4, 0x00, 0x0b, \n\t0x00, 0x17, 0x00, 0x32, 0x00, 0x3b, 0x00, 0x80, 0x00, 0xb0, 0x1b, 0x2f, \n\t0xb0, 0x19, 0x2f, 0xb0, 0x33, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, \n\t0x2f, 0x1b, 0xb1, 0x03, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x06, 0x3e, 0x59, 0xb1, 0x0f, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, \n\t0x15, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, \n\t0xb0, 0x33, 0x01, 0x5d, 0xb2, 0x10, 0x33, 0x01, 0x5d, 0xb0, 0x33, 0x10, \n\t0xb1, 0x18, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb2, 0x10, 0x19, 0x01, 0x5d, 0xb2, 0x10, 0x1b, 0x01, 0x5d, 0xb2, 0x22, \n\t0x18, 0x33, 0x11, 0x12, 0x39, 0xb0, 0x19, 0x10, 0xb0, 0x2b, 0xd0, 0xb0, \n\t0x1b, 0x10, 0xb1, 0x3a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0x30, 0x31, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, \n\t0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x33, 0x32, 0x00, 0x11, 0x10, \n\t0x00, 0x23, 0x22, 0x00, 0x01, 0x11, 0x23, 0x11, 0x21, 0x32, 0x16, 0x15, \n\t0x14, 0x06, 0x07, 0x16, 0x16, 0x15, 0x15, 0x14, 0x16, 0x17, 0x15, 0x23, \n\t0x26, 0x26, 0x35, 0x35, 0x34, 0x26, 0x23, 0x27, 0x33, 0x36, 0x36, 0x35, \n\t0x34, 0x26, 0x23, 0x23, 0x58, 0x01, 0x9e, 0x01, 0x28, 0x01, 0x27, 0x01, \n\t0x9e, 0xfe, 0x61, 0xfe, 0xda, 0xfe, 0xd8, 0xfe, 0x62, 0x79, 0x01, 0x57, \n\t0xf6, 0xf4, 0x01, 0x58, 0xfe, 0xa9, 0xf5, 0xf6, 0xfe, 0xa9, 0x01, 0xbc, \n\t0x95, 0x01, 0x18, 0x98, 0xad, 0x42, 0x3f, 0x42, 0x3b, 0x07, 0x0a, 0x99, \n\t0x09, 0x04, 0x43, 0x4d, 0x9f, 0x98, 0x41, 0x5b, 0x4f, 0x62, 0x83, 0x02, \n\t0xd9, 0x01, 0x3b, 0x01, 0xb0, 0xfe, 0x50, 0xfe, 0xc5, 0xfe, 0xc4, 0xfe, \n\t0x4e, 0x01, 0xb2, 0x01, 0x3c, 0xfe, 0xf6, 0xfe, 0x95, 0x01, 0x6c, 0x01, \n\t0x09, 0x01, 0x08, 0x01, 0x69, 0xfe, 0x97, 0xfe, 0xad, 0xfe, 0xae, 0x03, \n\t0x52, 0x83, 0x7e, 0x3e, 0x5e, 0x1f, 0x1a, 0x6a, 0x4b, 0x38, 0x29, 0x41, \n\t0x15, 0x10, 0x15, 0x51, 0x2a, 0x36, 0x48, 0x44, 0x82, 0x01, 0x3f, 0x38, \n\t0x49, 0x3b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x7b, 0x05, 0x1e, 0x03, 0x4c, \n\t0x05, 0xb0, 0x00, 0x03, 0x00, 0x17, 0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x03, \n\t0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb4, 0xaf, 0x03, 0xbf, \n\t0x03, 0x02, 0x5d, 0x30, 0x31, 0x01, 0x21, 0x35, 0x21, 0x03, 0x4c, 0xfd, \n\t0x2f, 0x02, 0xd1, 0x05, 0x1e, 0x92, 0x00, 0x00, 0x00, 0x02, 0x00, 0x80, \n\t0x03, 0xbf, 0x02, 0x7d, 0x05, 0xc5, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x35, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0c, \n\t0x3e, 0x59, 0xb0, 0x09, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, \n\t0xb1, 0x0f, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x03, 0x10, 0xb1, 0x15, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0x30, 0x31, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, \n\t0x14, 0x06, 0x23, 0x22, 0x26, 0x37, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, \n\t0x34, 0x26, 0x23, 0x22, 0x06, 0x80, 0x98, 0x69, 0x67, 0x95, 0x94, 0x68, \n\t0x6a, 0x97, 0x83, 0x49, 0x35, 0x34, 0x47, 0x48, 0x33, 0x35, 0x49, 0x04, \n\t0xc0, 0x6a, 0x9b, 0x9b, 0x6a, 0x6c, 0x95, 0x95, 0x6c, 0x37, 0x48, 0x48, \n\t0x37, 0x37, 0x4b, 0x4b, 0x00, 0x02, 0x00, 0x63, 0x00, 0x04, 0x03, 0xf7, \n\t0x04, 0xf3, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x44, 0x00, 0xb0, 0x01, 0x2f, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x06, 0x3e, \n\t0x59, 0xb0, 0x01, 0x10, 0xb1, 0x02, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0c, 0x10, 0xb1, 0x0f, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x04, 0x0f, 0x02, 0x11, \n\t0x12, 0x39, 0xb0, 0x02, 0x10, 0xb0, 0x06, 0xd0, 0xb0, 0x01, 0x10, 0xb0, \n\t0x09, 0xd0, 0x30, 0x31, 0x01, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, \n\t0x35, 0x21, 0x11, 0x33, 0x01, 0x21, 0x35, 0x21, 0x02, 0x91, 0x01, 0x66, \n\t0xfe, 0x9a, 0xb1, 0xfe, 0x83, 0x01, 0x7d, 0xb1, 0x01, 0x3a, 0xfc, 0xbd, \n\t0x03, 0x43, 0x03, 0x58, 0x9a, 0xfe, 0x63, 0x01, 0x9d, 0x9a, 0x01, 0x9b, \n\t0xfb, 0x11, 0x9b, 0x00, 0x00, 0x01, 0x00, 0x71, 0x02, 0x9b, 0x02, 0xca, \n\t0x05, 0xc7, 0x00, 0x1a, 0x00, 0x45, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0xb0, 0x0a, \n\t0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb2, 0x03, 0x00, 0x11, 0x11, 0x12, \n\t0x39, 0xb0, 0x11, 0x10, 0xb1, 0x09, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb0, 0x17, 0xd0, 0xb0, 0x00, \n\t0x10, 0xb1, 0x1a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0x30, 0x31, 0x01, 0x21, 0x35, 0x01, 0x36, 0x36, 0x35, 0x34, 0x26, \n\t0x23, 0x22, 0x06, 0x15, 0x23, 0x27, 0x26, 0x36, 0x33, 0x32, 0x16, 0x15, \n\t0x14, 0x06, 0x07, 0x07, 0x17, 0x21, 0x02, 0xca, 0xfd, 0xb0, 0x01, 0x2e, \n\t0x45, 0x2c, 0x39, 0x3a, 0x43, 0x49, 0xa1, 0x02, 0x06, 0xa8, 0x8d, 0x87, \n\t0x98, 0x59, 0x74, 0x99, 0x02, 0x01, 0x69, 0x02, 0x9b, 0x82, 0x01, 0x06, \n\t0x3c, 0x4b, 0x2a, 0x32, 0x3e, 0x40, 0x32, 0x06, 0x63, 0x8c, 0x80, 0x74, \n\t0x50, 0x70, 0x69, 0x87, 0x06, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x6a, \n\t0x02, 0x8f, 0x02, 0xe4, 0x05, 0xc6, 0x00, 0x2a, 0x00, 0x78, 0x00, 0xb0, \n\t0x2a, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, \n\t0x0c, 0x3e, 0x59, 0xb1, 0x06, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb2, 0x0f, 0x2a, 0x01, 0x5d, 0xb4, 0x6f, 0x2a, 0x7f, \n\t0x2a, 0x02, 0x5d, 0xb2, 0x8f, 0x2a, 0x01, 0x71, 0xb2, 0xff, 0x2a, 0x01, \n\t0x71, 0xb2, 0x1f, 0x2a, 0x01, 0x71, 0xb2, 0x2f, 0x2a, 0x01, 0x5d, 0xb2, \n\t0x3f, 0x2a, 0x01, 0x72, 0xb2, 0x70, 0x2a, 0x01, 0x72, 0xb0, 0x2a, 0x10, \n\t0xb1, 0x29, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb2, 0x14, 0x2a, 0x29, 0x11, 0x12, 0x39, 0xb0, 0x0e, 0x10, 0xb0, 0x1a, \n\t0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb1, 0x22, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x32, \n\t0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x23, 0x27, 0x26, 0x36, \n\t0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, 0x14, 0x06, \n\t0x23, 0x22, 0x26, 0x37, 0x37, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, \n\t0x34, 0x26, 0x23, 0x23, 0x35, 0x01, 0xa8, 0x43, 0x41, 0x49, 0x45, 0x38, \n\t0x45, 0xa2, 0x02, 0x06, 0xa9, 0x7e, 0x91, 0xa8, 0x47, 0x3e, 0x46, 0x4c, \n\t0xb4, 0x92, 0x7f, 0xb5, 0x06, 0x01, 0xa3, 0x4b, 0x3f, 0x48, 0x54, 0x49, \n\t0x49, 0x84, 0x04, 0x71, 0x39, 0x34, 0x2b, 0x3a, 0x30, 0x28, 0x06, 0x5e, \n\t0x77, 0x77, 0x6e, 0x37, 0x5b, 0x1a, 0x17, 0x60, 0x44, 0x6f, 0x7c, 0x74, \n\t0x6f, 0x06, 0x2e, 0x39, 0x3b, 0x30, 0x3e, 0x39, 0x7e, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x83, 0x04, 0xbb, 0x02, 0x24, 0x05, 0xc5, 0x00, 0x04, \n\t0x00, 0x4b, 0x00, 0xb0, 0x03, 0x2f, 0xb2, 0x3f, 0x03, 0x01, 0x5d, 0xb2, \n\t0x7f, 0x03, 0x01, 0x5d, 0xb2, 0xff, 0x03, 0x01, 0x5d, 0xb2, 0x6f, 0x03, \n\t0x01, 0x71, 0xb2, 0x1f, 0x03, 0x01, 0x71, 0xb2, 0xaf, 0x03, 0x01, 0x5d, \n\t0xb2, 0x5f, 0x03, 0x01, 0x5d, 0xb2, 0x0f, 0x03, 0x01, 0x5d, 0xb2, 0x4f, \n\t0x03, 0x01, 0x71, 0xb0, 0x00, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, \n\t0x59, 0xb2, 0xaf, 0x00, 0x01, 0x5d, 0xb6, 0x0f, 0x00, 0x1f, 0x00, 0x2f, \n\t0x00, 0x03, 0x5d, 0x30, 0x31, 0x01, 0x33, 0x17, 0x01, 0x23, 0x01, 0x3c, \n\t0xe6, 0x02, 0xfe, 0xf2, 0x93, 0x05, 0xc5, 0x06, 0xfe, 0xfc, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x99, 0xfe, 0x60, 0x03, 0xf2, 0x04, 0x3a, 0x00, 0x15, \n\t0x00, 0x53, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, \n\t0x00, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, \n\t0xb1, 0x08, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x13, 0x2f, \n\t0x1b, 0xb1, 0x13, 0x08, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, \n\t0x2f, 0x1b, 0xb1, 0x0f, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x06, 0x3e, 0x59, 0xb0, 0x0f, 0x10, 0xb1, \n\t0x04, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, \n\t0x31, 0x01, 0x11, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x11, 0x33, 0x11, \n\t0x23, 0x27, 0x06, 0x06, 0x23, 0x22, 0x26, 0x27, 0x11, 0x23, 0x11, 0x01, \n\t0x5d, 0x02, 0x6f, 0x64, 0x62, 0x79, 0x20, 0xc5, 0xb1, 0x09, 0x2c, 0x7f, \n\t0x53, 0x48, 0x6d, 0x28, 0xc4, 0x04, 0x3a, 0xfd, 0x7e, 0xb2, 0x81, 0x48, \n\t0x46, 0x03, 0x27, 0xfb, 0xc6, 0x6c, 0x3f, 0x42, 0x21, 0x23, 0xfe, 0x31, \n\t0x05, 0xda, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3f, 0x00, 0x00, 0x03, 0x44, \n\t0x05, 0xb0, 0x00, 0x0a, 0x00, 0x1d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x06, 0x3e, 0x59, 0x30, 0x31, 0x21, \n\t0x11, 0x23, 0x22, 0x00, 0x35, 0x34, 0x00, 0x33, 0x21, 0x11, 0x02, 0x7f, \n\t0x54, 0xe9, 0xfe, 0xfd, 0x01, 0x03, 0xe9, 0x01, 0x19, 0x02, 0x08, 0x01, \n\t0x03, 0xd1, 0xcf, 0x01, 0x05, 0xfa, 0x50, 0x00, 0x00, 0x01, 0x00, 0xa1, \n\t0x02, 0x70, 0x01, 0x67, 0x03, 0x44, 0x00, 0x03, 0x00, 0x10, 0x00, 0xb0, \n\t0x03, 0x2f, 0xb0, 0x00, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, \n\t0x30, 0x31, 0x01, 0x23, 0x35, 0x33, 0x01, 0x67, 0xc6, 0xc6, 0x02, 0x70, \n\t0xd4, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x77, 0xfe, 0x4d, 0x01, 0xaf, \n\t0x00, 0x00, 0x00, 0x0f, 0x00, 0x27, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x08, 0x3e, 0x59, 0xb0, 0x08, 0xb0, 0x0a, \n\t0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x07, 0x10, 0xb0, 0x0f, 0xb0, \n\t0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, 0x21, 0x07, 0x16, \n\t0x16, 0x15, 0x14, 0x06, 0x23, 0x27, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, \n\t0x37, 0x01, 0x24, 0x0c, 0x41, 0x56, 0x9e, 0x93, 0x07, 0x48, 0x58, 0x48, \n\t0x57, 0x20, 0x34, 0x0b, 0x52, 0x50, 0x60, 0x72, 0x6d, 0x31, 0x31, 0x30, \n\t0x26, 0x07, 0x87, 0x00, 0x00, 0x01, 0x00, 0x5f, 0x02, 0x99, 0x01, 0x8c, \n\t0x05, 0xc5, 0x00, 0x05, 0x00, 0x31, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0xb0, 0x0a, \n\t0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x05, 0x10, 0xb0, 0x04, 0xb0, \n\t0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x03, 0xb0, 0x0a, 0x2b, \n\t0x58, 0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, 0x01, 0x23, 0x11, 0x23, 0x35, \n\t0x25, 0x01, 0x8c, 0xae, 0x7f, 0x01, 0x2d, 0x02, 0x99, 0x02, 0x8f, 0x86, \n\t0x17, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x78, 0x02, 0xb3, 0x03, 0x2b, \n\t0x05, 0xc5, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x67, 0x00, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0c, 0x3e, 0x59, 0xb0, 0x0a, \n\t0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb2, 0xd0, 0x0a, 0x01, \n\t0x5d, 0xb2, 0x8f, 0x0a, 0x01, 0x5d, 0xb2, 0xdf, 0x0a, 0x01, 0x71, 0xb2, \n\t0x2f, 0x0a, 0x01, 0x72, 0xb2, 0x5f, 0x0a, 0x01, 0x72, 0xb2, 0x0f, 0x0a, \n\t0x01, 0x72, 0xb2, 0xbf, 0x0a, 0x01, 0x5d, 0xb2, 0x8f, 0x0a, 0x01, 0x72, \n\t0xb2, 0x20, 0x0a, 0x01, 0x5d, 0xb2, 0x00, 0x0a, 0x01, 0x5d, 0xb1, 0x11, \n\t0x05, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, \n\t0x10, 0xb1, 0x18, 0x05, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0x30, 0x31, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, \n\t0x06, 0x23, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, \n\t0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x78, 0xbc, 0x9d, 0x9e, 0xbc, \n\t0xbb, 0x9d, 0x9e, 0xbd, 0xad, 0x58, 0x56, 0x53, 0x59, 0x5a, 0x54, 0x54, \n\t0x58, 0x04, 0x76, 0x94, 0xbb, 0xbb, 0x94, 0x75, 0x95, 0xb9, 0xb9, 0x95, \n\t0x58, 0x69, 0x6a, 0x57, 0x75, 0x54, 0x6b, 0x6b, 0x54, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x6e, 0x00, 0x98, 0x03, 0x83, 0x03, 0xb5, 0x00, 0x26, \n\t0x03, 0x44, 0x16, 0x00, 0x00, 0x07, 0x03, 0x44, 0x01, 0x70, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0xb8, 0x00, 0x00, 0x05, 0xe2, 0x05, 0xc4, 0x00, 0x27, \n\t0x03, 0xae, 0x00, 0x59, 0x02, 0x98, 0x00, 0x27, 0x03, 0x46, 0x01, 0x18, \n\t0x00, 0x08, 0x01, 0x07, 0x03, 0xaa, 0x02, 0xba, 0x00, 0x00, 0x00, 0x20, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x0c, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, \n\t0x06, 0x3e, 0x59, 0xb0, 0x16, 0xd0, 0x30, 0x31, 0xff, 0xff, 0x00, 0xb8, \n\t0x00, 0x00, 0x05, 0xf5, 0x05, 0xc4, 0x00, 0x27, 0x03, 0x46, 0x01, 0x25, \n\t0x00, 0x08, 0x00, 0x27, 0x03, 0xae, 0x00, 0x59, 0x02, 0x98, 0x01, 0x07, \n\t0x03, 0xac, 0x03, 0x2b, 0x00, 0x00, 0x00, 0x1d, 0x00, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0c, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x06, 0x3e, 0x59, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7a, 0x00, 0x00, 0x06, 0x9f, \n\t0x05, 0xc7, 0x00, 0x27, 0x03, 0x46, 0x01, 0xcf, 0x00, 0x08, 0x00, 0x27, \n\t0x03, 0xaa, 0x03, 0x77, 0x00, 0x00, 0x01, 0x07, 0x03, 0xab, 0x00, 0x10, \n\t0x02, 0x9b, 0x00, 0x20, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x22, 0x2f, \n\t0x1b, 0xb1, 0x22, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, \n\t0x2f, 0x1b, 0xb1, 0x09, 0x06, 0x3e, 0x59, 0xb0, 0x10, 0xd0, 0x30, 0x31, \n\t0x00, 0x02, 0x00, 0x72, 0xfe, 0x76, 0x03, 0xad, 0x04, 0x3b, 0x00, 0x1a, \n\t0x00, 0x1e, 0x00, 0x35, 0x00, 0xb0, 0x11, 0x2f, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x1b, 0x2f, 0x1b, 0xb1, 0x1b, 0x0a, 0x3e, 0x59, 0xb1, 0x1d, 0x04, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x00, 0x1d, \n\t0x11, 0x11, 0x12, 0x39, 0xb0, 0x11, 0x10, 0xb1, 0x09, 0x03, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x06, 0x06, \n\t0x07, 0x06, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x33, 0x17, \n\t0x16, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x36, 0x36, 0x35, \n\t0x03, 0x33, 0x15, 0x23, 0x02, 0x85, 0x02, 0x30, 0x65, 0x64, 0x53, 0x70, \n\t0x6a, 0x5a, 0x81, 0xbc, 0x03, 0x02, 0xe9, 0xb3, 0xc6, 0xd9, 0x8c, 0x75, \n\t0x35, 0x18, 0x07, 0xce, 0xce, 0x02, 0xa0, 0x92, 0x70, 0x5b, 0x76, 0x7e, \n\t0x57, 0x6a, 0x72, 0x63, 0x60, 0x06, 0xa1, 0xc2, 0xc9, 0xb4, 0x7f, 0xd5, \n\t0x72, 0x35, 0x56, 0x5c, 0x01, 0x9b, 0xd1, 0x00, 0xff, 0xff, 0x00, 0x14, \n\t0x00, 0x00, 0x05, 0x1a, 0x07, 0x22, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x43, 0x01, 0x28, 0x01, 0x5d, 0x00, 0x15, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x14, 0x3e, 0x59, \n\t0xb2, 0x0f, 0x10, 0x01, 0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x14, \n\t0x00, 0x00, 0x05, 0x1a, 0x07, 0x1e, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x76, 0x01, 0xe2, 0x01, 0x59, 0x00, 0x15, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x14, 0x3e, 0x59, \n\t0xb2, 0x0f, 0x0d, 0x01, 0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x14, \n\t0x00, 0x00, 0x05, 0x1a, 0x07, 0x48, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x52, 0x00, 0xb9, 0x01, 0x5d, 0x00, 0x10, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x12, 0x3e, 0x59, \n\t0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x14, 0x00, 0x00, 0x05, 0x1a, \n\t0x07, 0x54, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x01, 0x58, \n\t0x00, 0xb5, 0x01, 0x61, 0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x14, 0x00, 0x00, 0x05, 0x1a, 0x07, 0x0d, 0x02, 0x26, \n\t0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x00, 0x6a, 0x00, 0x95, 0x01, 0x5d, \n\t0x00, 0x1d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, \n\t0x10, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, \n\t0xb1, 0x0d, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x14, \n\t0x00, 0x00, 0x05, 0x1a, 0x07, 0x8c, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x56, 0x01, 0x44, 0x01, 0xaa, 0x00, 0x49, 0x00, 0xb2, \n\t0xb0, 0x15, 0x01, 0x72, 0xb2, 0x2f, 0x15, 0x01, 0x5d, 0xb2, 0x0f, 0x15, \n\t0x01, 0x5d, 0xb2, 0x7f, 0x15, 0x01, 0x5d, 0xb2, 0x00, 0x15, 0x01, 0x72, \n\t0xb2, 0x70, 0x15, 0x01, 0x72, 0xb2, 0x50, 0x15, 0x01, 0x72, 0xb2, 0x70, \n\t0x1b, 0x01, 0x72, 0xb2, 0x2f, 0x1b, 0x01, 0x5d, 0xb2, 0x0f, 0x1b, 0x01, \n\t0x5d, 0xb2, 0x7f, 0x1b, 0x01, 0x5d, 0xb2, 0xb0, 0x1b, 0x01, 0x72, 0xb2, \n\t0x50, 0x1b, 0x01, 0x72, 0xb2, 0x00, 0x1b, 0x01, 0x72, 0x30, 0x31, 0x00, \n\t0x00, 0x02, 0xff, 0xec, 0x00, 0x00, 0x07, 0x61, 0x05, 0xb0, 0x00, 0x0f, \n\t0x00, 0x13, 0x00, 0xd5, 0x00, 0xb0, 0x0a, 0x2f, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x06, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x06, 0x3e, 0x59, 0xb2, \n\t0x03, 0x04, 0x06, 0x11, 0x12, 0x39, 0xb0, 0x03, 0x2f, 0x40, 0x09, 0x8f, \n\t0x03, 0x9f, 0x03, 0xaf, 0x03, 0xbf, 0x03, 0x04, 0x5d, 0xb2, 0x0f, 0x03, \n\t0x01, 0x71, 0xb2, 0x5f, 0x03, 0x01, 0x5d, 0xb6, 0x4f, 0x03, 0x5f, 0x03, \n\t0x6f, 0x03, 0x03, 0x71, 0xb0, 0x06, 0x10, 0xb1, 0x08, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0xef, 0x0a, 0x01, 0x5d, \n\t0xb2, 0x2f, 0x0a, 0x01, 0x5d, 0xb0, 0x0a, 0x10, 0xb1, 0x0d, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb1, \n\t0x0e, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x03, 0x10, 0xb1, 0x10, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb2, 0x5e, 0x12, 0x01, 0x71, 0xb2, 0x7c, 0x12, 0x01, 0x71, \n\t0xb0, 0x06, 0x10, 0xb0, 0x13, 0xd0, 0xb2, 0x7c, 0x13, 0x01, 0x71, 0xb2, \n\t0x4c, 0x13, 0x01, 0x71, 0xb2, 0x7f, 0x13, 0x01, 0x5d, 0xb2, 0x5e, 0x13, \n\t0x01, 0x71, 0xb6, 0x4c, 0x13, 0x5c, 0x13, 0x6c, 0x13, 0x03, 0x5d, 0xb2, \n\t0x8c, 0x13, 0x01, 0x5d, 0xb4, 0x2a, 0x13, 0x3a, 0x13, 0x02, 0x5d, 0x30, \n\t0x31, 0x21, 0x21, 0x03, 0x21, 0x03, 0x23, 0x01, 0x21, 0x15, 0x21, 0x13, \n\t0x21, 0x15, 0x21, 0x13, 0x21, 0x01, 0x21, 0x03, 0x27, 0x07, 0x61, 0xfc, \n\t0x81, 0x0f, 0xfd, 0xd3, 0xca, 0xf0, 0x03, 0x70, 0x03, 0xc7, 0xfd, 0x4d, \n\t0x14, 0x02, 0x4e, 0xfd, 0xb8, 0x16, 0x02, 0xc1, 0xfa, 0xac, 0x01, 0xbf, \n\t0x1f, 0x05, 0x01, 0x5e, 0xfe, 0xa2, 0x05, 0xb0, 0x9b, 0xfe, 0x2e, 0x9b, \n\t0xfd, 0xf2, 0x01, 0x77, 0x02, 0xc6, 0x02, 0x00, 0xff, 0xff, 0x00, 0x76, \n\t0xfe, 0x45, 0x04, 0xbf, 0x05, 0xc5, 0x02, 0x26, 0x00, 0x26, 0x00, 0x00, \n\t0x00, 0x07, 0x00, 0x7a, 0x01, 0xce, 0xff, 0xf8, 0xff, 0xff, 0x00, 0xb4, \n\t0x00, 0x00, 0x04, 0x7a, 0x07, 0x22, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x43, 0x00, 0xdd, 0x01, 0x5d, 0x00, 0x15, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x14, 0x3e, 0x59, \n\t0xb2, 0x0f, 0x10, 0x01, 0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0xb4, \n\t0x00, 0x00, 0x04, 0x7a, 0x07, 0x1e, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x76, 0x01, 0x97, 0x01, 0x59, 0x00, 0x15, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x14, 0x3e, 0x59, \n\t0xb2, 0x0f, 0x0c, 0x01, 0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0xb4, \n\t0x00, 0x00, 0x04, 0x7a, 0x07, 0x48, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x52, 0x00, 0x97, 0x01, 0x5d, 0x00, 0x10, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x12, 0x3e, 0x59, \n\t0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x7a, \n\t0x07, 0x0d, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x00, 0x6a, \n\t0x00, 0x72, 0x01, 0x5d, 0x00, 0x1d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0xff, 0xde, 0x00, 0x00, 0x01, 0x84, 0x07, 0x22, 0x02, 0x26, \n\t0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, 0xff, 0x8c, 0x01, 0x5d, \n\t0x00, 0x15, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, \n\t0x08, 0x14, 0x3e, 0x59, 0xb2, 0x0f, 0x08, 0x01, 0x5d, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0xbe, 0x00, 0x00, 0x02, 0x68, 0x07, 0x1e, 0x02, 0x26, \n\t0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, 0x00, 0x44, 0x01, 0x59, \n\t0x00, 0x15, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, \n\t0x04, 0x14, 0x3e, 0x59, 0xb2, 0x0f, 0x04, 0x01, 0x5d, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0xff, 0xf1, 0x00, 0x00, 0x02, 0x57, 0x07, 0x48, 0x02, 0x26, \n\t0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x01, 0x52, 0xff, 0x46, 0x01, 0x5d, \n\t0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, \n\t0x08, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0xff, 0xcb, \n\t0x00, 0x00, 0x02, 0x7c, 0x07, 0x0d, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x6a, 0xff, 0x21, 0x01, 0x5d, 0x00, 0x1d, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x12, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x12, 0x3e, \n\t0x59, 0x30, 0x31, 0x00, 0x00, 0x02, 0x00, 0x2a, 0x00, 0x00, 0x05, 0x09, \n\t0x05, 0xb0, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x74, 0x00, 0xb0, 0x04, 0x2f, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x0c, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x06, \n\t0x3e, 0x59, 0xb2, 0xcf, 0x04, 0x01, 0x5d, 0xb2, 0x1f, 0x04, 0x01, 0x71, \n\t0xb2, 0xbf, 0x04, 0x01, 0x71, 0xb2, 0xef, 0x04, 0x01, 0x5d, 0xb2, 0x7f, \n\t0x04, 0x01, 0x5d, 0xb2, 0x2f, 0x04, 0x01, 0x5d, 0xb0, 0x04, 0x10, 0xb1, \n\t0x01, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x0e, 0xd0, 0xb0, 0x00, 0x10, 0xb1, 0x10, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x05, 0x10, 0xb1, 0x18, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb0, \n\t0x1a, 0xd0, 0x30, 0x31, 0x33, 0x11, 0x23, 0x35, 0x33, 0x11, 0x21, 0x20, \n\t0x00, 0x11, 0x15, 0x10, 0x00, 0x21, 0x13, 0x21, 0x11, 0x33, 0x32, 0x12, \n\t0x35, 0x35, 0x34, 0x02, 0x23, 0x23, 0x11, 0x21, 0xd2, 0xa8, 0xa8, 0x01, \n\t0xbf, 0x01, 0x1e, 0x01, 0x5a, 0xfe, 0xa6, 0xfe, 0xe2, 0x1a, 0xfe, 0xec, \n\t0xfa, 0xca, 0xe9, 0xe9, 0xca, 0xfa, 0x01, 0x14, 0x02, 0x97, 0x9b, 0x02, \n\t0x7e, 0xfe, 0xa1, 0xfe, 0xea, 0xc7, 0xfe, 0xe9, 0xfe, 0xa3, 0x02, 0x97, \n\t0xfe, 0x03, 0x01, 0x0a, 0xd0, 0xc9, 0xce, 0x01, 0x0a, 0xfe, 0x1d, 0x00, \n\t0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x01, 0x07, 0x54, 0x02, 0x26, \n\t0x00, 0x31, 0x00, 0x00, 0x01, 0x07, 0x01, 0x58, 0x00, 0xf6, 0x01, 0x61, \n\t0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, \n\t0x0f, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x71, \n\t0xff, 0xeb, 0x05, 0x02, 0x07, 0x37, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x43, 0x01, 0x23, 0x01, 0x72, 0x00, 0x15, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x20, 0x2f, 0x1b, 0xb1, 0x20, 0x14, 0x3e, 0x59, \n\t0xb2, 0x0f, 0x20, 0x01, 0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x71, \n\t0xff, 0xeb, 0x05, 0x02, 0x07, 0x33, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x76, 0x01, 0xdd, 0x01, 0x6e, 0x00, 0x15, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x1c, 0x2f, 0x1b, 0xb1, 0x1c, 0x14, 0x3e, 0x59, \n\t0xb2, 0x0f, 0x1c, 0x01, 0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x71, \n\t0xff, 0xeb, 0x05, 0x02, 0x07, 0x5d, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x52, 0x00, 0xdd, 0x01, 0x72, 0x00, 0x10, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x20, 0x2f, 0x1b, 0xb1, 0x20, 0x12, 0x3e, 0x59, \n\t0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x71, 0xff, 0xeb, 0x05, 0x02, \n\t0x07, 0x69, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x01, 0x58, \n\t0x00, 0xd8, 0x01, 0x76, 0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x25, 0x2f, 0x1b, 0xb1, 0x25, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x71, 0xff, 0xeb, 0x05, 0x02, 0x07, 0x22, 0x02, 0x26, \n\t0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x00, 0x6a, 0x00, 0xb8, 0x01, 0x72, \n\t0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x20, 0x2f, 0x1b, 0xb1, \n\t0x20, 0x12, 0x3e, 0x59, 0xb0, 0x1d, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x58, 0x00, 0xe1, 0x03, 0xe1, 0x04, 0x79, 0x00, 0x0b, \n\t0x00, 0x19, 0x00, 0xb0, 0x03, 0x2f, 0xb0, 0x05, 0xd0, 0xb0, 0x03, 0x10, \n\t0xb0, 0x0b, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x09, \n\t0xd0, 0x30, 0x31, 0x13, 0x01, 0x01, 0x37, 0x01, 0x01, 0x17, 0x01, 0x01, \n\t0x07, 0x01, 0x01, 0x58, 0x01, 0x47, 0xfe, 0xb9, 0x7e, 0x01, 0x46, 0x01, \n\t0x47, 0x7e, 0xfe, 0xb8, 0x01, 0x48, 0x7e, 0xfe, 0xb9, 0xfe, 0xba, 0x01, \n\t0x5f, 0x01, 0x4e, 0x01, 0x4e, 0x7e, 0xfe, 0xb3, 0x01, 0x4d, 0x7e, 0xfe, \n\t0xb2, 0xfe, 0xb2, 0x7e, 0x01, 0x4c, 0xfe, 0xb4, 0x00, 0x03, 0x00, 0x71, \n\t0xff, 0xa2, 0x05, 0x02, 0x05, 0xed, 0x00, 0x19, 0x00, 0x25, 0x00, 0x31, \n\t0x00, 0x52, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, \n\t0x10, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, \n\t0xb1, 0x03, 0x06, 0x3e, 0x59, 0xb1, 0x2e, 0x03, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x10, 0x10, 0xb1, 0x22, 0x03, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x1e, 0x2e, 0x22, \n\t0x11, 0x12, 0x39, 0xb2, 0x2a, 0x22, 0x2e, 0x11, 0x12, 0x39, 0xb0, 0x2a, \n\t0x10, 0xb0, 0x1f, 0xd0, 0xb0, 0x1e, 0x10, 0xb0, 0x2b, 0xd0, 0x30, 0x31, \n\t0x01, 0x10, 0x00, 0x21, 0x22, 0x26, 0x27, 0x07, 0x23, 0x37, 0x26, 0x26, \n\t0x35, 0x11, 0x10, 0x00, 0x33, 0x32, 0x16, 0x17, 0x37, 0x33, 0x07, 0x16, \n\t0x16, 0x15, 0x01, 0x14, 0x16, 0x17, 0x17, 0x01, 0x26, 0x26, 0x23, 0x22, \n\t0x02, 0x15, 0x21, 0x34, 0x26, 0x27, 0x27, 0x01, 0x16, 0x16, 0x33, 0x32, \n\t0x36, 0x35, 0x05, 0x02, 0xfe, 0xb5, 0xfe, 0xf8, 0x55, 0x97, 0x40, 0x5b, \n\t0x95, 0x8b, 0x54, 0x59, 0x01, 0x3f, 0xff, 0x5e, 0xa9, 0x48, 0x51, 0x95, \n\t0x84, 0x4d, 0x55, 0xfc, 0x34, 0x26, 0x23, 0x06, 0x02, 0x20, 0x32, 0x7c, \n\t0x48, 0xac, 0xcd, 0x03, 0x07, 0x21, 0x1e, 0x06, 0xfd, 0xe3, 0x2c, 0x6a, \n\t0x3e, 0xb7, 0xd7, 0x02, 0x56, 0xfe, 0xf5, 0xfe, 0xa0, 0x29, 0x28, 0x9a, \n\t0xea, 0x54, 0xec, 0x8a, 0x01, 0x03, 0x01, 0x0a, 0x01, 0x62, 0x33, 0x2e, \n\t0x89, 0xdd, 0x54, 0xe2, 0x81, 0xfe, 0xfd, 0x55, 0x92, 0x34, 0x01, 0x03, \n\t0x94, 0x29, 0x2c, 0xff, 0x00, 0xc8, 0x4b, 0x86, 0x32, 0x01, 0xfc, 0x71, \n\t0x22, 0x22, 0xff, 0xcb, 0xff, 0xff, 0x00, 0x93, 0xff, 0xeb, 0x04, 0xdc, \n\t0x07, 0x22, 0x02, 0x26, 0x00, 0x38, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, \n\t0x01, 0x22, 0x01, 0x5d, 0x00, 0x15, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x16, 0x2f, 0x1b, 0xb1, 0x16, 0x14, 0x3e, 0x59, 0xb2, 0x0f, 0x16, 0x01, \n\t0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x93, 0xff, 0xeb, 0x04, 0xdc, \n\t0x07, 0x1e, 0x02, 0x26, 0x00, 0x38, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, \n\t0x01, 0xdc, 0x01, 0x59, 0x00, 0x15, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x14, 0x3e, 0x59, 0xb2, 0x0f, 0x12, 0x01, \n\t0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x93, 0xff, 0xeb, 0x04, 0xdc, \n\t0x07, 0x48, 0x02, 0x26, 0x00, 0x38, 0x00, 0x00, 0x01, 0x07, 0x01, 0x52, \n\t0x00, 0xdc, 0x01, 0x5d, 0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x16, 0x2f, 0x1b, 0xb1, 0x16, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x93, 0xff, 0xeb, 0x04, 0xdc, 0x07, 0x0d, 0x02, 0x26, \n\t0x00, 0x38, 0x00, 0x00, 0x01, 0x07, 0x00, 0x6a, 0x00, 0xb7, 0x01, 0x5d, \n\t0x00, 0x1d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x16, 0x2f, 0x1b, 0xb1, \n\t0x16, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x13, 0x2f, 0x1b, \n\t0xb1, 0x13, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x14, \n\t0x00, 0x00, 0x04, 0xce, 0x07, 0x1d, 0x02, 0x26, 0x00, 0x3c, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x76, 0x01, 0x94, 0x01, 0x58, 0x00, 0x15, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x14, 0x3e, 0x59, \n\t0xb2, 0x0f, 0x09, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, 0x02, 0x00, 0xa3, \n\t0x00, 0x00, 0x04, 0x61, 0x05, 0xb0, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x41, \n\t0x00, 0xb0, 0x01, 0x2f, 0xb0, 0x09, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x06, 0x3e, 0x59, 0xb0, 0x01, 0x10, \n\t0xb1, 0x0d, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x09, 0x10, 0xb1, 0x0e, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x11, 0x21, 0x32, 0x04, 0x15, 0x14, \n\t0x04, 0x23, 0x21, 0x11, 0x23, 0x11, 0x13, 0x11, 0x21, 0x32, 0x36, 0x35, \n\t0x34, 0x26, 0x23, 0x01, 0x68, 0x01, 0x0d, 0xe8, 0x01, 0x04, 0xfe, 0xfc, \n\t0xe8, 0xfe, 0xf3, 0xc5, 0xc5, 0x01, 0x0d, 0x93, 0x93, 0x93, 0x93, 0x05, \n\t0xb0, 0xfe, 0xdb, 0xec, 0xbd, 0xbe, 0xeb, 0xfe, 0xc7, 0x05, 0xb0, 0xfe, \n\t0x41, 0xfd, 0xe2, 0x9c, 0x71, 0x72, 0x9f, 0x00, 0x00, 0x01, 0x00, 0x89, \n\t0xff, 0xeb, 0x04, 0x70, 0x06, 0x13, 0x00, 0x27, 0x00, 0x3e, 0x00, 0xb0, \n\t0x05, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, 0x11, \n\t0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, \n\t0x01, 0x06, 0x3e, 0x59, 0xb0, 0x11, 0x10, 0xb1, 0x18, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x05, 0x10, 0xb1, 0x24, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x21, 0x23, 0x11, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x15, \n\t0x14, 0x00, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, \n\t0x33, 0x32, 0x36, 0x35, 0x34, 0x00, 0x35, 0x34, 0x36, 0x35, 0x34, 0x26, \n\t0x23, 0x22, 0x06, 0x15, 0x01, 0x4d, 0xc4, 0xeb, 0xb7, 0xa1, 0xca, 0x81, \n\t0x01, 0x5b, 0xd1, 0xb2, 0x54, 0xb1, 0x25, 0x2c, 0x2b, 0x82, 0x3d, 0x6c, \n\t0x66, 0xfe, 0xa5, 0x8d, 0x66, 0x42, 0x68, 0x80, 0x04, 0x3a, 0xdf, 0xfa, \n\t0xac, 0xa7, 0x76, 0xdc, 0x39, 0x52, 0xfe, 0xe4, 0x8b, 0xa7, 0xaa, 0x29, \n\t0x1e, 0x9f, 0x1c, 0x30, 0x5f, 0x4e, 0x54, 0x01, 0x1f, 0x92, 0x50, 0xdd, \n\t0x4c, 0x5d, 0x6c, 0xa7, 0x98, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6a, \n\t0xff, 0xeb, 0x03, 0xf3, 0x05, 0xe0, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x43, 0x00, 0x94, 0x00, 0x1b, 0x00, 0x08, 0x00, 0xb2, \n\t0xbf, 0x2c, 0x01, 0x71, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6a, \n\t0xff, 0xeb, 0x03, 0xf3, 0x05, 0xdc, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x76, 0x01, 0x4e, 0x00, 0x17, 0x00, 0x1a, 0x00, 0xb2, \n\t0xbf, 0x2f, 0x01, 0x71, 0xb6, 0xdf, 0x2f, 0xef, 0x2f, 0xff, 0x2f, 0x03, \n\t0x71, 0xb6, 0x0f, 0x2f, 0x1f, 0x2f, 0x2f, 0x2f, 0x03, 0x72, 0x30, 0x31, \n\t0xff, 0xff, 0x00, 0x6a, 0xff, 0xeb, 0x03, 0xf3, 0x06, 0x06, 0x02, 0x26, \n\t0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x01, 0x52, 0x4e, 0x1b, 0x00, 0x1d, \n\t0x00, 0xb6, 0xd0, 0x30, 0xe0, 0x30, 0xf0, 0x30, 0x03, 0x71, 0xb4, 0x00, \n\t0x30, 0x10, 0x30, 0x02, 0x72, 0xb2, 0x60, 0x30, 0x01, 0x72, 0xb2, 0x40, \n\t0x30, 0x01, 0x72, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6a, \n\t0xff, 0xeb, 0x03, 0xf3, 0x06, 0x12, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, \n\t0x01, 0x06, 0x01, 0x58, 0x49, 0x1f, 0x00, 0x22, 0x00, 0xb4, 0x60, 0x2f, \n\t0x70, 0x2f, 0x02, 0x72, 0x40, 0x0b, 0x90, 0x2f, 0xa0, 0x2f, 0xb0, 0x2f, \n\t0xc0, 0x2f, 0xd0, 0x2f, 0x05, 0x71, 0xb2, 0x40, 0x2f, 0x01, 0x72, 0xb2, \n\t0x20, 0x2f, 0x01, 0x72, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6a, \n\t0xff, 0xeb, 0x03, 0xf3, 0x05, 0xcb, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, \n\t0x01, 0x06, 0x00, 0x6a, 0x29, 0x1b, 0x00, 0x2f, 0x00, 0xb2, 0xf0, 0x2d, \n\t0x01, 0x71, 0xb4, 0x00, 0x2d, 0x10, 0x2d, 0x02, 0x72, 0xb2, 0x60, 0x2d, \n\t0x01, 0x72, 0xb2, 0x40, 0x2d, 0x01, 0x72, 0xb2, 0xf0, 0x30, 0x01, 0x71, \n\t0xb4, 0x00, 0x30, 0x10, 0x30, 0x02, 0x72, 0xb2, 0x60, 0x30, 0x01, 0x72, \n\t0xb2, 0x40, 0x30, 0x01, 0x72, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x6a, \n\t0xff, 0xeb, 0x03, 0xf3, 0x06, 0x4a, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x56, 0x00, 0xd5, 0x00, 0x68, 0x00, 0x91, 0x00, 0xb2, \n\t0x80, 0x35, 0x01, 0x5d, 0xb2, 0xc0, 0x35, 0x01, 0x5d, 0xb2, 0x10, 0x35, \n\t0x01, 0x71, 0xb2, 0x70, 0x35, 0x01, 0x71, 0xb2, 0x00, 0x35, 0x01, 0x72, \n\t0xb2, 0x0f, 0x35, 0x01, 0x5d, 0xb2, 0x50, 0x35, 0x01, 0x72, 0xb6, 0x90, \n\t0x35, 0xa0, 0x35, 0xb0, 0x35, 0x03, 0x71, 0xb2, 0x50, 0x35, 0x01, 0x71, \n\t0xb4, 0xe0, 0x35, 0xf0, 0x35, 0x02, 0x5d, 0xb2, 0xa0, 0x35, 0x01, 0x5d, \n\t0xb2, 0x60, 0x35, 0x01, 0x5d, 0xb2, 0x10, 0x35, 0x01, 0x5d, 0xb2, 0x80, \n\t0x3b, 0x01, 0x5d, 0xb2, 0xc0, 0x3b, 0x01, 0x5d, 0xb2, 0x10, 0x3b, 0x01, \n\t0x71, 0xb2, 0x70, 0x3b, 0x01, 0x71, 0xb2, 0x00, 0x3b, 0x01, 0x72, 0xb2, \n\t0x0f, 0x3b, 0x01, 0x5d, 0xb2, 0x50, 0x3b, 0x01, 0x72, 0xb6, 0x90, 0x3b, \n\t0xa0, 0x3b, 0xb0, 0x3b, 0x03, 0x71, 0xb2, 0x50, 0x3b, 0x01, 0x71, 0xb4, \n\t0xe0, 0x3b, 0xf0, 0x3b, 0x02, 0x5d, 0xb2, 0xa0, 0x3b, 0x01, 0x5d, 0xb2, \n\t0x60, 0x3b, 0x01, 0x5d, 0xb2, 0x10, 0x3b, 0x01, 0x5d, 0x30, 0x31, 0x00, \n\t0x00, 0x03, 0x00, 0x3a, 0xff, 0xeb, 0x06, 0x7c, 0x04, 0x4e, 0x00, 0x2e, \n\t0x00, 0x39, 0x00, 0x42, 0x00, 0x99, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x19, 0x2f, 0x1b, 0xb1, 0x19, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x1f, 0x2f, 0x1b, 0xb1, 0x1f, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x06, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x06, 0x3e, 0x59, 0xb2, \n\t0x23, 0x00, 0x1f, 0x11, 0x12, 0x39, 0xb0, 0x23, 0x2f, 0xb4, 0xd0, 0x23, \n\t0xe0, 0x23, 0x02, 0x5d, 0xb2, 0xa0, 0x23, 0x01, 0x5d, 0xb1, 0x3f, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0d, 0xd0, \n\t0xb0, 0x19, 0x10, 0xb1, 0x11, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb2, 0x14, 0x0d, 0x19, 0x11, 0x12, 0x39, 0xb0, 0x00, \n\t0x10, 0xb1, 0x28, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x2f, 0xd0, 0xb0, 0x23, 0x10, 0xb0, 0x33, 0xd0, 0xb0, 0x1f, \n\t0x10, 0xb1, 0x3a, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0x30, 0x31, 0x05, 0x22, 0x26, 0x27, 0x06, 0x06, 0x23, 0x22, 0x26, \n\t0x35, 0x34, 0x36, 0x33, 0x33, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, \n\t0x27, 0x27, 0x26, 0x36, 0x33, 0x32, 0x16, 0x17, 0x36, 0x36, 0x33, 0x32, \n\t0x12, 0x15, 0x15, 0x21, 0x07, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, \n\t0x06, 0x06, 0x25, 0x32, 0x36, 0x37, 0x35, 0x23, 0x22, 0x06, 0x15, 0x14, \n\t0x16, 0x01, 0x22, 0x06, 0x07, 0x17, 0x21, 0x35, 0x34, 0x26, 0x04, 0xee, \n\t0x88, 0xd0, 0x42, 0x38, 0xdf, 0xa0, 0xaa, 0xb9, 0xe6, 0xdc, 0xe5, 0x67, \n\t0x62, 0x67, 0x7a, 0xbc, 0x02, 0x05, 0xe5, 0xbf, 0x72, 0xaf, 0x32, 0x40, \n\t0xaf, 0x65, 0xd6, 0xe7, 0xfd, 0x3b, 0x02, 0x01, 0x9d, 0x9b, 0x67, 0x85, \n\t0x4e, 0x43, 0x35, 0xbc, 0xfc, 0x4a, 0x4c, 0xa6, 0x2b, 0xe3, 0x78, 0x87, \n\t0x64, 0x03, 0x5c, 0x71, 0x8a, 0x0b, 0x02, 0x01, 0xfc, 0x78, 0x15, 0x61, \n\t0x5a, 0x4f, 0x6c, 0xae, 0x97, 0x9e, 0xad, 0x55, 0x6a, 0x79, 0x6e, 0x4e, \n\t0x12, 0x06, 0x8a, 0xb5, 0x51, 0x4d, 0x4b, 0x53, 0xfe, 0xfc, 0xe4, 0x77, \n\t0x05, 0x9f, 0xc6, 0x37, 0x33, 0x8a, 0x2c, 0x4e, 0x9a, 0x57, 0x39, 0xd8, \n\t0x70, 0x51, 0x4a, 0x5d, 0x03, 0x2e, 0xa9, 0x85, 0x05, 0x1f, 0x7a, 0x9a, \n\t0xff, 0xff, 0x00, 0x61, 0xfe, 0x45, 0x03, 0xf6, 0x04, 0x4e, 0x02, 0x26, \n\t0x00, 0x46, 0x00, 0x00, 0x00, 0x07, 0x00, 0x7a, 0x01, 0x41, 0xff, 0xf8, \n\t0xff, 0xff, 0x00, 0x63, 0xff, 0xeb, 0x03, 0xed, 0x05, 0xe1, 0x02, 0x26, \n\t0x00, 0x48, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, 0x00, 0x97, 0x00, 0x1c, \n\t0x00, 0x08, 0x00, 0xb2, 0xc0, 0x20, 0x01, 0x71, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x63, 0xff, 0xeb, 0x03, 0xed, 0x05, 0xdd, 0x02, 0x26, \n\t0x00, 0x48, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, 0x01, 0x51, 0x00, 0x18, \n\t0x00, 0x16, 0x00, 0xb2, 0xbf, 0x23, 0x01, 0x71, 0xb6, 0xdf, 0x23, 0xef, \n\t0x23, 0xff, 0x23, 0x03, 0x71, 0xb2, 0x0f, 0x23, 0x01, 0x72, 0x30, 0x31, \n\t0xff, 0xff, 0x00, 0x63, 0xff, 0xeb, 0x03, 0xed, 0x06, 0x07, 0x02, 0x26, \n\t0x00, 0x48, 0x00, 0x00, 0x01, 0x06, 0x01, 0x52, 0x51, 0x1c, 0x00, 0x25, \n\t0x00, 0xb2, 0xb0, 0x22, 0x01, 0x71, 0x40, 0x09, 0xc0, 0x24, 0xd0, 0x24, \n\t0xe0, 0x24, 0xf0, 0x24, 0x04, 0x71, 0xb4, 0x00, 0x24, 0x10, 0x24, 0x02, \n\t0x72, 0xb2, 0x60, 0x24, 0x01, 0x72, 0xb2, 0x40, 0x24, 0x01, 0x72, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0xff, 0xeb, 0x03, 0xed, \n\t0x05, 0xcc, 0x02, 0x26, 0x00, 0x48, 0x00, 0x00, 0x01, 0x06, 0x00, 0x6a, \n\t0x2c, 0x1c, 0x00, 0x3d, 0x00, 0xb2, 0x60, 0x21, 0x01, 0x72, 0xb4, 0xb0, \n\t0x21, 0xc0, 0x21, 0x02, 0x71, 0xb2, 0x40, 0x21, 0x01, 0x72, 0xb2, 0xf0, \n\t0x21, 0x01, 0x71, 0xb4, 0x00, 0x21, 0x10, 0x21, 0x02, 0x72, 0xb2, 0x60, \n\t0x24, 0x01, 0x72, 0xb4, 0xb0, 0x24, 0xc0, 0x24, 0x02, 0x71, 0xb2, 0x40, \n\t0x24, 0x01, 0x72, 0xb2, 0xf0, 0x24, 0x01, 0x71, 0xb4, 0x00, 0x24, 0x10, \n\t0x24, 0x02, 0x72, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xb9, \n\t0x00, 0x00, 0x01, 0x5e, 0x05, 0xcb, 0x02, 0x26, 0x00, 0xf3, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x43, 0xff, 0x67, 0x00, 0x06, 0x00, 0x25, 0x00, 0xb2, \n\t0xbf, 0x04, 0x01, 0x71, 0xb6, 0xdf, 0x04, 0xef, 0x04, 0xff, 0x04, 0x03, \n\t0x71, 0x40, 0x11, 0x0f, 0x04, 0x1f, 0x04, 0x2f, 0x04, 0x3f, 0x04, 0x4f, \n\t0x04, 0x5f, 0x04, 0x6f, 0x04, 0x7f, 0x04, 0x08, 0x72, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x02, 0x43, 0x05, 0xc7, 0x02, 0x26, \n\t0x00, 0xf3, 0x00, 0x00, 0x01, 0x06, 0x00, 0x76, 0x1f, 0x02, 0x00, 0x25, \n\t0x00, 0xb2, 0xbf, 0x07, 0x01, 0x71, 0xb6, 0xdf, 0x07, 0xef, 0x07, 0xff, \n\t0x07, 0x03, 0x71, 0x40, 0x11, 0x0f, 0x07, 0x1f, 0x07, 0x2f, 0x07, 0x3f, \n\t0x07, 0x4f, 0x07, 0x5f, 0x07, 0x6f, 0x07, 0x7f, 0x07, 0x08, 0x72, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xcc, 0x00, 0x00, 0x02, 0x32, \n\t0x05, 0xf1, 0x02, 0x26, 0x00, 0xf3, 0x00, 0x00, 0x01, 0x07, 0x01, 0x52, \n\t0xff, 0x21, 0x00, 0x06, 0x00, 0x17, 0x00, 0xb2, 0x2f, 0x06, 0x01, 0x72, \n\t0xb2, 0x3f, 0x08, 0x01, 0x72, 0xb2, 0x7f, 0x08, 0x01, 0x72, 0xb2, 0x5f, \n\t0x08, 0x01, 0x72, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xa6, \n\t0x00, 0x00, 0x02, 0x57, 0x05, 0xb6, 0x02, 0x26, 0x00, 0xf3, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x6a, 0xfe, 0xfc, 0x00, 0x06, 0x00, 0x33, 0x00, 0xb2, \n\t0x7f, 0x05, 0x01, 0x72, 0xb4, 0xdf, 0x05, 0xef, 0x05, 0x02, 0x71, 0xb2, \n\t0x5f, 0x05, 0x01, 0x72, 0xb4, 0x2f, 0x05, 0x3f, 0x05, 0x02, 0x72, 0xb2, \n\t0x7f, 0x08, 0x01, 0x72, 0xb4, 0xdf, 0x08, 0xef, 0x08, 0x02, 0x71, 0xb2, \n\t0x5f, 0x08, 0x01, 0x72, 0xb4, 0x2f, 0x08, 0x3f, 0x08, 0x02, 0x72, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x48, 0xff, 0xeb, 0x04, 0x30, \n\t0x05, 0xed, 0x00, 0x20, 0x00, 0x2d, 0x00, 0x31, 0x00, 0xb0, 0x1b, 0x2f, \n\t0xb0, 0x0d, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, \n\t0x07, 0x06, 0x3e, 0x59, 0xb1, 0x21, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0d, 0x10, 0xb1, 0x28, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x16, 0x12, \n\t0x15, 0x15, 0x14, 0x00, 0x23, 0x22, 0x00, 0x35, 0x34, 0x00, 0x33, 0x32, \n\t0x16, 0x17, 0x37, 0x26, 0x26, 0x27, 0x05, 0x27, 0x25, 0x26, 0x26, 0x27, \n\t0x37, 0x16, 0x16, 0x17, 0x37, 0x17, 0x01, 0x32, 0x36, 0x35, 0x35, 0x26, \n\t0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x03, 0x69, 0x5f, 0x68, 0xfe, \n\t0xe0, 0xd7, 0xda, 0xfe, 0xe9, 0x01, 0x14, 0xd5, 0x5a, 0x9f, 0x34, 0x04, \n\t0x09, 0x55, 0x44, 0xfe, 0xde, 0x4d, 0x01, 0x00, 0x27, 0x53, 0x2c, 0x3c, \n\t0x4f, 0x90, 0x3f, 0xda, 0x4d, 0xfe, 0x11, 0x85, 0xa9, 0x23, 0xa1, 0x76, \n\t0x83, 0xa1, 0xa4, 0x05, 0x11, 0x68, 0xfe, 0xed, 0xa3, 0xdc, 0xf5, 0xfe, \n\t0xc9, 0x01, 0x18, 0xcf, 0xe4, 0x01, 0x1c, 0x4a, 0x3c, 0x05, 0x6d, 0xb0, \n\t0x42, 0xa5, 0x66, 0x92, 0x16, 0x22, 0x0e, 0xa4, 0x13, 0x42, 0x2e, 0x7d, \n\t0x66, 0xfb, 0x04, 0xe4, 0xae, 0x94, 0x3b, 0x51, 0xd0, 0x95, 0x84, 0xc9, \n\t0xff, 0xff, 0x00, 0x8f, 0x00, 0x00, 0x03, 0xfd, 0x06, 0x12, 0x02, 0x26, \n\t0x00, 0x51, 0x00, 0x00, 0x01, 0x06, 0x01, 0x58, 0x60, 0x1f, 0x00, 0x22, \n\t0x00, 0xb4, 0x60, 0x17, 0x70, 0x17, 0x02, 0x72, 0x40, 0x0b, 0x90, 0x17, \n\t0xa0, 0x17, 0xb0, 0x17, 0xc0, 0x17, 0xd0, 0x17, 0x05, 0x71, 0xb2, 0x40, \n\t0x17, 0x01, 0x72, 0xb2, 0x20, 0x17, 0x01, 0x72, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x61, 0xff, 0xeb, 0x04, 0x2a, 0x05, 0xe0, 0x02, 0x26, \n\t0x00, 0x52, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, 0x00, 0xaf, 0x00, 0x1b, \n\t0x00, 0x08, 0x00, 0xb2, 0xbf, 0x1c, 0x01, 0x71, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x61, 0xff, 0xeb, 0x04, 0x2a, 0x05, 0xdc, 0x02, 0x26, \n\t0x00, 0x52, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, 0x01, 0x69, 0x00, 0x17, \n\t0x00, 0x1a, 0x00, 0xb2, 0xbf, 0x1f, 0x01, 0x71, 0xb6, 0xdf, 0x1f, 0xef, \n\t0x1f, 0xff, 0x1f, 0x03, 0x71, 0xb6, 0x0f, 0x1f, 0x1f, 0x1f, 0x2f, 0x1f, \n\t0x03, 0x72, 0x30, 0x31, 0xff, 0xff, 0x00, 0x61, 0xff, 0xeb, 0x04, 0x2a, \n\t0x06, 0x06, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x01, 0x52, \n\t0x69, 0x1b, 0x00, 0x1d, 0x00, 0xb6, 0xd0, 0x20, 0xe0, 0x20, 0xf0, 0x20, \n\t0x03, 0x71, 0xb4, 0x00, 0x20, 0x10, 0x20, 0x02, 0x72, 0xb2, 0x60, 0x20, \n\t0x01, 0x72, 0xb2, 0x40, 0x20, 0x01, 0x72, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x61, 0xff, 0xeb, 0x04, 0x2a, 0x06, 0x12, 0x02, 0x26, \n\t0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x01, 0x58, 0x64, 0x1f, 0x00, 0x22, \n\t0x00, 0xb4, 0x60, 0x1f, 0x70, 0x1f, 0x02, 0x72, 0x40, 0x0b, 0x90, 0x1f, \n\t0xa0, 0x1f, 0xb0, 0x1f, 0xc0, 0x1f, 0xd0, 0x1f, 0x05, 0x71, 0xb2, 0x40, \n\t0x1f, 0x01, 0x72, 0xb2, 0x20, 0x1f, 0x01, 0x72, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x61, 0xff, 0xeb, 0x04, 0x2a, 0x05, 0xcb, 0x02, 0x26, \n\t0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x00, 0x6a, 0x44, 0x1b, 0x00, 0x2f, \n\t0x00, 0xb2, 0xf0, 0x1d, 0x01, 0x71, 0xb4, 0x00, 0x1d, 0x10, 0x1d, 0x02, \n\t0x72, 0xb2, 0x60, 0x1d, 0x01, 0x72, 0xb2, 0x40, 0x1d, 0x01, 0x72, 0xb2, \n\t0xf0, 0x20, 0x01, 0x71, 0xb4, 0x00, 0x20, 0x10, 0x20, 0x02, 0x72, 0xb2, \n\t0x60, 0x20, 0x01, 0x72, 0xb2, 0x40, 0x20, 0x01, 0x72, 0x30, 0x31, 0x00, \n\t0x00, 0x03, 0x00, 0x47, 0x00, 0xb4, 0x04, 0x2d, 0x04, 0xb2, 0x00, 0x03, \n\t0x00, 0x07, 0x00, 0x0b, 0x00, 0x42, 0x00, 0xb0, 0x03, 0x2f, 0xb0, 0x00, \n\t0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x03, 0x10, 0xb0, \n\t0x07, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb1, 0x04, 0x04, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, \n\t0xb0, 0x08, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb1, 0x0b, \n\t0x04, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x01, 0x21, 0x35, 0x21, 0x25, 0x23, 0x35, 0x33, 0x11, 0x23, 0x35, 0x33, \n\t0x04, 0x2d, 0xfc, 0x1a, 0x03, 0xe6, 0xfe, 0x71, 0xc6, 0xc6, 0xc6, 0xc6, \n\t0x02, 0x55, 0xbc, 0xd6, 0xcb, 0xfc, 0x02, 0xcb, 0x00, 0x03, 0x00, 0x61, \n\t0xff, 0x79, 0x04, 0x2a, 0x04, 0xb9, 0x00, 0x19, 0x00, 0x25, 0x00, 0x31, \n\t0x00, 0x52, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, \n\t0x03, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, \n\t0xb1, 0x10, 0x06, 0x3e, 0x59, 0xb1, 0x2e, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x22, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x2b, 0x2e, 0x22, \n\t0x11, 0x12, 0x39, 0xb0, 0x2b, 0x10, 0xb0, 0x1d, 0xd0, 0xb2, 0x1f, 0x22, \n\t0x2e, 0x11, 0x12, 0x39, 0xb0, 0x1f, 0x10, 0xb0, 0x29, 0xd0, 0x30, 0x31, \n\t0x13, 0x34, 0x00, 0x33, 0x32, 0x16, 0x17, 0x37, 0x33, 0x07, 0x16, 0x16, \n\t0x15, 0x15, 0x14, 0x00, 0x23, 0x22, 0x26, 0x27, 0x07, 0x23, 0x37, 0x26, \n\t0x26, 0x35, 0x33, 0x14, 0x16, 0x17, 0x33, 0x01, 0x26, 0x26, 0x23, 0x22, \n\t0x06, 0x15, 0x21, 0x34, 0x26, 0x27, 0x23, 0x01, 0x16, 0x16, 0x33, 0x32, \n\t0x36, 0x35, 0x61, 0x01, 0x04, 0xdf, 0x38, 0x67, 0x2e, 0x4a, 0x81, 0x68, \n\t0x58, 0x5e, 0xfe, 0xfc, 0xe0, 0x33, 0x5c, 0x2a, 0x48, 0x81, 0x64, 0x60, \n\t0x67, 0xc5, 0x28, 0x29, 0x06, 0x01, 0x4c, 0x1d, 0x43, 0x25, 0x8d, 0x91, \n\t0x02, 0x3f, 0x23, 0x20, 0x06, 0xfe, 0xb9, 0x18, 0x38, 0x21, 0x8d, 0x92, \n\t0x02, 0x27, 0xf0, 0x01, 0x37, 0x16, 0x14, 0x95, 0xd3, 0x4a, 0xe8, 0x8d, \n\t0x16, 0xf2, 0xfe, 0xcc, 0x11, 0x10, 0x93, 0xcc, 0x47, 0xf0, 0x95, 0x5b, \n\t0x97, 0x30, 0x02, 0xa2, 0x10, 0x12, 0xe2, 0xaa, 0x50, 0x8d, 0x2f, 0xfd, \n\t0x69, 0x0c, 0x0b, 0xe0, 0xac, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x8b, \n\t0xff, 0xeb, 0x03, 0xfc, 0x05, 0xcb, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x43, 0x00, 0xad, 0x00, 0x06, 0x00, 0x25, 0x00, 0xb2, \n\t0xbf, 0x14, 0x01, 0x71, 0xb6, 0xdf, 0x14, 0xef, 0x14, 0xff, 0x14, 0x03, \n\t0x71, 0x40, 0x11, 0x0f, 0x14, 0x1f, 0x14, 0x2f, 0x14, 0x3f, 0x14, 0x4f, \n\t0x14, 0x5f, 0x14, 0x6f, 0x14, 0x7f, 0x14, 0x08, 0x72, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x8b, 0xff, 0xeb, 0x03, 0xfc, 0x05, 0xc7, 0x02, 0x26, \n\t0x00, 0x58, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, 0x01, 0x67, 0x00, 0x02, \n\t0x00, 0x25, 0x00, 0xb2, 0xbf, 0x17, 0x01, 0x71, 0xb6, 0xdf, 0x17, 0xef, \n\t0x17, 0xff, 0x17, 0x03, 0x71, 0x40, 0x11, 0x0f, 0x17, 0x1f, 0x17, 0x2f, \n\t0x17, 0x3f, 0x17, 0x4f, 0x17, 0x5f, 0x17, 0x6f, 0x17, 0x7f, 0x17, 0x08, \n\t0x72, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x8b, 0xff, 0xeb, 0x03, 0xfc, \n\t0x05, 0xf1, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, 0x01, 0x06, 0x01, 0x52, \n\t0x67, 0x06, 0x00, 0x17, 0x00, 0xb2, 0x2f, 0x16, 0x01, 0x72, 0xb2, 0x3f, \n\t0x18, 0x01, 0x72, 0xb2, 0x7f, 0x18, 0x01, 0x72, 0xb2, 0x5f, 0x18, 0x01, \n\t0x72, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x8b, 0xff, 0xeb, 0x03, 0xfc, \n\t0x05, 0xb6, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, 0x01, 0x06, 0x00, 0x6a, \n\t0x42, 0x06, 0x00, 0x33, 0x00, 0xb2, 0x7f, 0x15, 0x01, 0x72, 0xb4, 0xdf, \n\t0x15, 0xef, 0x15, 0x02, 0x71, 0xb2, 0x5f, 0x15, 0x01, 0x72, 0xb4, 0x2f, \n\t0x15, 0x3f, 0x15, 0x02, 0x72, 0xb2, 0x7f, 0x18, 0x01, 0x72, 0xb4, 0xdf, \n\t0x18, 0xef, 0x18, 0x02, 0x71, 0xb2, 0x5f, 0x18, 0x01, 0x72, 0xb4, 0x2f, \n\t0x18, 0x3f, 0x18, 0x02, 0x72, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x1a, \n\t0xfe, 0x4b, 0x03, 0xe8, 0x05, 0xc7, 0x02, 0x26, 0x00, 0x5c, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x76, 0x01, 0x25, 0x00, 0x02, 0x00, 0x25, 0x00, 0xb2, \n\t0xbf, 0x19, 0x01, 0x71, 0xb6, 0xdf, 0x19, 0xef, 0x19, 0xff, 0x19, 0x03, \n\t0x71, 0x40, 0x11, 0x0f, 0x19, 0x1f, 0x19, 0x2f, 0x19, 0x3f, 0x19, 0x4f, \n\t0x19, 0x5f, 0x19, 0x6f, 0x19, 0x7f, 0x19, 0x08, 0x72, 0x30, 0x31, 0x00, \n\t0x00, 0x02, 0x00, 0x99, 0xfe, 0x60, 0x04, 0x33, 0x06, 0x18, 0x00, 0x11, \n\t0x00, 0x1f, 0x00, 0x50, 0x00, 0xb0, 0x09, 0x2f, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x08, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x06, 0x3e, 0x59, 0xb2, \n\t0x2f, 0x09, 0x01, 0x5d, 0xb0, 0x0e, 0x10, 0xb1, 0x15, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x1c, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x01, 0x14, 0x02, 0x23, 0x22, 0x26, 0x27, 0x11, 0x23, 0x11, 0x33, 0x11, \n\t0x36, 0x36, 0x33, 0x32, 0x12, 0x11, 0x23, 0x34, 0x26, 0x23, 0x22, 0x06, \n\t0x07, 0x11, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x04, 0x33, 0xe0, 0xc5, \n\t0x64, 0x97, 0x35, 0xc5, 0xc5, 0x35, 0x96, 0x62, 0xc9, 0xdf, 0xc5, 0x91, \n\t0x8d, 0x55, 0x78, 0x25, 0x25, 0x78, 0x57, 0x8c, 0x90, 0x01, 0xf4, 0xea, \n\t0xfe, 0xe1, 0x43, 0x43, 0xfd, 0xef, 0x07, 0xb8, 0xfd, 0xaa, 0x44, 0x48, \n\t0xfe, 0xc1, 0xfe, 0xfa, 0xb8, 0xed, 0x4d, 0x43, 0xfd, 0xf5, 0x43, 0x4b, \n\t0xcd, 0xa2, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1a, 0xfe, 0x4b, 0x03, 0xe8, \n\t0x05, 0xb6, 0x02, 0x26, 0x00, 0x5c, 0x00, 0x00, 0x01, 0x06, 0x00, 0x6a, \n\t0x00, 0x06, 0x00, 0x33, 0x00, 0xb2, 0x7f, 0x17, 0x01, 0x72, 0xb4, 0xdf, \n\t0x17, 0xef, 0x17, 0x02, 0x71, 0xb2, 0x5f, 0x17, 0x01, 0x72, 0xb4, 0x2f, \n\t0x17, 0x3f, 0x17, 0x02, 0x72, 0xb2, 0x7f, 0x1a, 0x01, 0x72, 0xb4, 0xdf, \n\t0x1a, 0xef, 0x1a, 0x02, 0x71, 0xb2, 0x5f, 0x1a, 0x01, 0x72, 0xb4, 0x2f, \n\t0x1a, 0x3f, 0x1a, 0x02, 0x72, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x14, \n\t0x00, 0x00, 0x05, 0x1a, 0x06, 0xfa, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x71, 0x00, 0xb4, 0x01, 0x4a, 0x00, 0x06, 0x00, 0xb0, \n\t0x0c, 0x2f, 0x30, 0x31, 0xff, 0xff, 0x00, 0x6a, 0xff, 0xeb, 0x03, 0xf3, \n\t0x05, 0xb8, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x00, 0x06, 0x00, 0x71, \n\t0x4d, 0x08, 0x00, 0x00, 0xff, 0xff, 0x00, 0x14, 0x00, 0x00, 0x05, 0x1a, \n\t0x07, 0x4e, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x01, 0x54, \n\t0x00, 0xeb, 0x01, 0x9e, 0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x6a, 0xff, 0xeb, 0x03, 0xf3, 0x06, 0x0c, 0x02, 0x26, \n\t0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x01, 0x54, 0x7f, 0x5c, 0x00, 0x36, \n\t0x00, 0xb2, 0x00, 0x30, 0x01, 0x71, 0xb2, 0xb0, 0x30, 0x01, 0x71, 0xb2, \n\t0x00, 0x30, 0x01, 0x72, 0xb2, 0x8f, 0x30, 0x01, 0x71, 0xb2, 0x20, 0x30, \n\t0x01, 0x72, 0xb4, 0xd0, 0x30, 0xe0, 0x30, 0x02, 0x71, 0xb2, 0x90, 0x30, \n\t0x01, 0x71, 0xb6, 0x60, 0x30, 0x70, 0x30, 0x80, 0x30, 0x03, 0x5d, 0xb2, \n\t0x20, 0x30, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x14, \n\t0xfe, 0x50, 0x05, 0x51, 0x05, 0xb0, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, \n\t0x00, 0x07, 0x01, 0x57, 0x03, 0x7e, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6a, \n\t0xfe, 0x50, 0x04, 0x2a, 0x04, 0x4e, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, \n\t0x00, 0x07, 0x01, 0x57, 0x02, 0x57, 0x00, 0x00, 0xff, 0xff, 0x00, 0x76, \n\t0xff, 0xeb, 0x04, 0xbf, 0x07, 0x33, 0x02, 0x26, 0x00, 0x26, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x76, 0x01, 0xc9, 0x01, 0x6e, 0x00, 0x15, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x1e, 0x2f, 0x1b, 0xb1, 0x1e, 0x14, 0x3e, 0x59, \n\t0xb2, 0x0f, 0x1e, 0x01, 0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x61, \n\t0xff, 0xeb, 0x03, 0xf6, 0x05, 0xdc, 0x02, 0x26, 0x00, 0x46, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x76, 0x01, 0x3c, 0x00, 0x17, 0x00, 0x1a, 0x00, 0xb2, \n\t0xbf, 0x21, 0x01, 0x71, 0xb6, 0xdf, 0x21, 0xef, 0x21, 0xff, 0x21, 0x03, \n\t0x71, 0xb6, 0x0f, 0x21, 0x1f, 0x21, 0x2f, 0x21, 0x03, 0x72, 0x30, 0x31, \n\t0xff, 0xff, 0x00, 0x76, 0xff, 0xeb, 0x04, 0xbf, 0x07, 0x5d, 0x02, 0x26, \n\t0x00, 0x26, 0x00, 0x00, 0x01, 0x07, 0x01, 0x52, 0x00, 0xc9, 0x01, 0x72, \n\t0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x22, 0x2f, 0x1b, 0xb1, \n\t0x22, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x61, \n\t0xff, 0xeb, 0x03, 0xf6, 0x06, 0x06, 0x02, 0x26, 0x00, 0x46, 0x00, 0x00, \n\t0x01, 0x06, 0x01, 0x52, 0x3c, 0x1b, 0x00, 0x1d, 0x00, 0xb6, 0xd0, 0x22, \n\t0xe0, 0x22, 0xf0, 0x22, 0x03, 0x71, 0xb4, 0x00, 0x22, 0x10, 0x22, 0x02, \n\t0x72, 0xb2, 0x60, 0x22, 0x01, 0x72, 0xb2, 0x40, 0x22, 0x01, 0x72, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x76, 0xff, 0xeb, 0x04, 0xbf, \n\t0x07, 0x22, 0x02, 0x26, 0x00, 0x26, 0x00, 0x00, 0x01, 0x07, 0x01, 0x55, \n\t0x01, 0x99, 0x01, 0x72, 0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x1f, 0x2f, 0x1b, 0xb1, 0x1f, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x61, 0xff, 0xeb, 0x03, 0xf6, 0x05, 0xcb, 0x02, 0x26, \n\t0x00, 0x46, 0x00, 0x00, 0x01, 0x07, 0x01, 0x55, 0x01, 0x0c, 0x00, 0x1b, \n\t0x00, 0x17, 0x00, 0xb2, 0xbf, 0x1e, 0x01, 0x5d, 0xb2, 0xdf, 0x1f, 0x01, \n\t0x5d, 0xb2, 0xaf, 0x1f, 0x01, 0x71, 0xb2, 0x8f, 0x1f, 0x01, 0x71, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x76, 0xff, 0xeb, 0x04, 0xbf, \n\t0x07, 0x5e, 0x02, 0x26, 0x00, 0x26, 0x00, 0x00, 0x01, 0x07, 0x01, 0x53, \n\t0x00, 0xe0, 0x01, 0x73, 0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x23, 0x2f, 0x1b, 0xb1, 0x23, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x61, 0xff, 0xeb, 0x03, 0xf6, 0x06, 0x07, 0x02, 0x26, \n\t0x00, 0x46, 0x00, 0x00, 0x01, 0x06, 0x01, 0x53, 0x53, 0x1c, 0x00, 0x22, \n\t0x00, 0x40, 0x0b, 0xb0, 0x23, 0xc0, 0x23, 0xd0, 0x23, 0xe0, 0x23, 0xf0, \n\t0x23, 0x05, 0x71, 0xb4, 0x00, 0x23, 0x10, 0x23, 0x02, 0x72, 0xb2, 0x60, \n\t0x23, 0x01, 0x72, 0xb2, 0x40, 0x23, 0x01, 0x72, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xeb, 0x07, 0x49, 0x02, 0x26, \n\t0x00, 0x27, 0x00, 0x00, 0x01, 0x07, 0x01, 0x53, 0x00, 0xa6, 0x01, 0x5e, \n\t0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x19, 0x2f, 0x1b, 0xb1, \n\t0x19, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x62, \n\t0xff, 0xeb, 0x05, 0x1d, 0x06, 0x18, 0x00, 0x26, 0x00, 0x47, 0x00, 0x00, \n\t0x01, 0x07, 0x03, 0x63, 0x03, 0xdd, 0x05, 0x25, 0x00, 0x35, 0x00, 0xb0, \n\t0x24, 0x2f, 0xb2, 0x80, 0x24, 0x01, 0x72, 0xb2, 0x1f, 0x24, 0x01, 0x5d, \n\t0xb2, 0x2f, 0x24, 0x01, 0x71, 0xb2, 0xbf, 0x24, 0x01, 0x72, 0xb2, 0x3f, \n\t0x24, 0x01, 0x72, 0xb4, 0x4f, 0x24, 0x5f, 0x24, 0x02, 0x5d, 0xb2, 0x60, \n\t0x24, 0x01, 0x5d, 0xb2, 0xf0, 0x24, 0x01, 0x71, 0xb2, 0x70, 0x24, 0x01, \n\t0x71, 0x30, 0x31, 0x00, 0x00, 0x02, 0x00, 0x2a, 0x00, 0x00, 0x05, 0x09, \n\t0x05, 0xb0, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x74, 0x00, 0xb0, 0x04, 0x2f, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x0c, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x06, \n\t0x3e, 0x59, 0xb2, 0xcf, 0x04, 0x01, 0x5d, 0xb2, 0x1f, 0x04, 0x01, 0x71, \n\t0xb2, 0xbf, 0x04, 0x01, 0x71, 0xb2, 0xef, 0x04, 0x01, 0x5d, 0xb2, 0x7f, \n\t0x04, 0x01, 0x5d, 0xb2, 0x2f, 0x04, 0x01, 0x5d, 0xb0, 0x04, 0x10, 0xb1, \n\t0x01, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x0e, 0xd0, 0xb0, 0x00, 0x10, 0xb1, 0x10, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x05, 0x10, 0xb1, 0x18, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb0, \n\t0x1a, 0xd0, 0x30, 0x31, 0x33, 0x11, 0x23, 0x35, 0x33, 0x11, 0x21, 0x20, \n\t0x00, 0x11, 0x15, 0x10, 0x00, 0x21, 0x13, 0x21, 0x11, 0x33, 0x32, 0x12, \n\t0x35, 0x35, 0x34, 0x02, 0x23, 0x23, 0x11, 0x21, 0xd2, 0xa8, 0xa8, 0x01, \n\t0xbf, 0x01, 0x1e, 0x01, 0x5a, 0xfe, 0xa6, 0xfe, 0xe2, 0x1a, 0xfe, 0xec, \n\t0xfa, 0xca, 0xe9, 0xe9, 0xca, 0xfa, 0x01, 0x14, 0x02, 0x97, 0x9b, 0x02, \n\t0x7e, 0xfe, 0xa1, 0xfe, 0xea, 0xc7, 0xfe, 0xe9, 0xfe, 0xa3, 0x02, 0x97, \n\t0xfe, 0x03, 0x01, 0x0a, 0xd0, 0xc9, 0xce, 0x01, 0x0a, 0xfe, 0x1d, 0x00, \n\t0x00, 0x02, 0x00, 0x62, 0xff, 0xeb, 0x04, 0xba, 0x06, 0x18, 0x00, 0x19, \n\t0x00, 0x27, 0x00, 0x7f, 0x00, 0xb0, 0x16, 0x2f, 0xb0, 0x19, 0x2f, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x06, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x06, \n\t0x3e, 0x59, 0xb2, 0x5f, 0x19, 0x01, 0x5d, 0xb2, 0x2f, 0x19, 0x01, 0x5d, \n\t0xb2, 0x0f, 0x19, 0x01, 0x5d, 0xb0, 0x19, 0x10, 0xb1, 0x00, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x30, 0x0e, 0x01, \n\t0x5d, 0xb0, 0x12, 0xd0, 0xb0, 0x19, 0x10, 0xb0, 0x14, 0xd0, 0xb2, 0x2f, \n\t0x16, 0x01, 0x5d, 0xb0, 0x07, 0x10, 0xb1, 0x1d, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0e, 0x10, 0xb1, 0x24, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, \n\t0x23, 0x11, 0x23, 0x27, 0x06, 0x06, 0x23, 0x22, 0x02, 0x35, 0x35, 0x10, \n\t0x12, 0x33, 0x32, 0x16, 0x17, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, \n\t0x33, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x11, 0x26, 0x26, 0x23, \n\t0x22, 0x06, 0x15, 0x04, 0xba, 0xc5, 0xa1, 0x17, 0x35, 0x9a, 0x66, 0xc6, \n\t0xe0, 0xdf, 0xc9, 0x5f, 0x93, 0x34, 0xf7, 0xf7, 0xc5, 0xc5, 0xfc, 0x6d, \n\t0x86, 0x8d, 0x58, 0x78, 0x26, 0x26, 0x79, 0x55, 0x8e, 0x87, 0x04, 0xcf, \n\t0xfb, 0x31, 0x85, 0x4c, 0x4e, 0x01, 0x1f, 0xea, 0x15, 0x01, 0x05, 0x01, \n\t0x40, 0x46, 0x43, 0x01, 0x0a, 0x9b, 0xae, 0xae, 0xfc, 0x8a, 0xa4, 0xc5, \n\t0x50, 0x48, 0x01, 0xf9, 0x43, 0x4f, 0xea, 0xbb, 0xff, 0xff, 0x00, 0xb4, \n\t0x00, 0x00, 0x04, 0x7a, 0x06, 0xfa, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x71, 0x00, 0x96, 0x01, 0x4a, 0x00, 0x08, 0x00, 0xb2, \n\t0x0f, 0x0d, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, \n\t0xff, 0xeb, 0x03, 0xed, 0x05, 0xb9, 0x02, 0x26, 0x00, 0x48, 0x00, 0x00, \n\t0x00, 0x06, 0x00, 0x71, 0x50, 0x09, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, \n\t0x00, 0x00, 0x04, 0x7a, 0x07, 0x4e, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x54, 0x00, 0xc8, 0x01, 0x9e, 0x00, 0x10, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x12, 0x3e, 0x59, \n\t0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0xff, 0xeb, 0x03, 0xed, \n\t0x06, 0x0d, 0x02, 0x26, 0x00, 0x48, 0x00, 0x00, 0x01, 0x07, 0x01, 0x54, \n\t0x00, 0x82, 0x00, 0x5d, 0x00, 0x31, 0x00, 0xb2, 0x90, 0x24, 0x01, 0x71, \n\t0xb4, 0xd0, 0x24, 0xe0, 0x24, 0x02, 0x71, 0xb2, 0x20, 0x24, 0x01, 0x72, \n\t0xb2, 0x20, 0x24, 0x01, 0x5d, 0xb2, 0x00, 0x24, 0x01, 0x72, 0xb2, 0xb0, \n\t0x24, 0x01, 0x71, 0xb2, 0x00, 0x24, 0x01, 0x71, 0xb6, 0x60, 0x24, 0x70, \n\t0x24, 0x80, 0x24, 0x03, 0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0xb4, \n\t0x00, 0x00, 0x04, 0x7a, 0x07, 0x0d, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x55, 0x01, 0x67, 0x01, 0x5d, 0x00, 0x10, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x12, 0x3e, 0x59, \n\t0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0xff, 0xeb, 0x03, 0xed, \n\t0x05, 0xcc, 0x02, 0x26, 0x00, 0x48, 0x00, 0x00, 0x01, 0x07, 0x01, 0x55, \n\t0x01, 0x21, 0x00, 0x1c, 0x00, 0x1e, 0x00, 0xb2, 0xbf, 0x20, 0x01, 0x5d, \n\t0xb2, 0xaf, 0x21, 0x01, 0x71, 0xb2, 0xdf, 0x21, 0x01, 0x5d, 0xb2, 0x8f, \n\t0x21, 0x01, 0x71, 0xb4, 0xb0, 0x21, 0xc0, 0x21, 0x02, 0x71, 0x30, 0x31, \n\t0xff, 0xff, 0x00, 0xb4, 0xfe, 0x50, 0x04, 0x7a, 0x05, 0xb0, 0x02, 0x26, \n\t0x00, 0x28, 0x00, 0x00, 0x00, 0x07, 0x01, 0x57, 0x01, 0x4b, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x63, 0xfe, 0x8e, 0x03, 0xed, 0x04, 0x4e, 0x02, 0x26, \n\t0x00, 0x48, 0x00, 0x00, 0x00, 0x07, 0x01, 0x57, 0x01, 0xec, 0x00, 0x3e, \n\t0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x7a, 0x07, 0x49, 0x02, 0x26, \n\t0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x01, 0x53, 0x00, 0xae, 0x01, 0x5e, \n\t0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, \n\t0x10, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, \n\t0xff, 0xeb, 0x03, 0xed, 0x06, 0x08, 0x02, 0x26, 0x00, 0x48, 0x00, 0x00, \n\t0x01, 0x06, 0x01, 0x53, 0x68, 0x1d, 0x00, 0x22, 0x00, 0x40, 0x0b, 0xb0, \n\t0x25, 0xc0, 0x25, 0xd0, 0x25, 0xe0, 0x25, 0xf0, 0x25, 0x05, 0x71, 0xb4, \n\t0x00, 0x25, 0x10, 0x25, 0x02, 0x72, 0xb2, 0x60, 0x25, 0x01, 0x72, 0xb2, \n\t0x40, 0x25, 0x01, 0x72, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x78, \n\t0xff, 0xeb, 0x04, 0xd3, 0x07, 0x5d, 0x02, 0x26, 0x00, 0x2a, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x52, 0x00, 0xbf, 0x01, 0x72, 0x00, 0x10, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x23, 0x2f, 0x1b, 0xb1, 0x23, 0x12, 0x3e, 0x59, \n\t0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x64, 0xfe, 0x4b, 0x03, 0xfd, \n\t0x06, 0x06, 0x02, 0x26, 0x00, 0x4a, 0x00, 0x00, 0x01, 0x06, 0x01, 0x52, \n\t0x57, 0x1b, 0x00, 0x1d, 0x00, 0xb6, 0xd0, 0x30, 0xe0, 0x30, 0xf0, 0x30, \n\t0x03, 0x71, 0xb4, 0x00, 0x30, 0x10, 0x30, 0x02, 0x72, 0xb2, 0x60, 0x30, \n\t0x01, 0x72, 0xb2, 0x40, 0x30, 0x01, 0x72, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x78, 0xff, 0xeb, 0x04, 0xd3, 0x07, 0x63, 0x02, 0x26, \n\t0x00, 0x2a, 0x00, 0x00, 0x01, 0x07, 0x01, 0x54, 0x00, 0xf0, 0x01, 0xb3, \n\t0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x25, 0x2f, 0x1b, 0xb1, \n\t0x25, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x64, \n\t0xfe, 0x4b, 0x03, 0xfd, 0x06, 0x0c, 0x02, 0x26, 0x00, 0x4a, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x54, 0x00, 0x88, 0x00, 0x5c, 0x00, 0x36, 0x00, 0xb2, \n\t0x00, 0x30, 0x01, 0x71, 0xb2, 0xb0, 0x30, 0x01, 0x71, 0xb2, 0x00, 0x30, \n\t0x01, 0x72, 0xb2, 0x8f, 0x30, 0x01, 0x71, 0xb2, 0x20, 0x30, 0x01, 0x72, \n\t0xb4, 0xd0, 0x30, 0xe0, 0x30, 0x02, 0x71, 0xb2, 0x90, 0x30, 0x01, 0x71, \n\t0xb6, 0x60, 0x30, 0x70, 0x30, 0x80, 0x30, 0x03, 0x5d, 0xb2, 0x20, 0x30, \n\t0x01, 0x5d, 0x30, 0x31, 0xff, 0xff, 0x00, 0x78, 0xff, 0xeb, 0x04, 0xd3, \n\t0x07, 0x22, 0x02, 0x26, 0x00, 0x2a, 0x00, 0x00, 0x01, 0x07, 0x01, 0x55, \n\t0x01, 0x8f, 0x01, 0x72, 0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x22, 0x2f, 0x1b, 0xb1, 0x22, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x64, 0xfe, 0x4b, 0x03, 0xfd, 0x05, 0xcb, 0x02, 0x26, \n\t0x00, 0x4a, 0x00, 0x00, 0x01, 0x07, 0x01, 0x55, 0x01, 0x27, 0x00, 0x1b, \n\t0x00, 0x17, 0x00, 0xb2, 0xbf, 0x2c, 0x01, 0x5d, 0xb2, 0xdf, 0x2d, 0x01, \n\t0x5d, 0xb2, 0xaf, 0x2d, 0x01, 0x71, 0xb2, 0x8f, 0x2d, 0x01, 0x71, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x78, 0xfe, 0x12, 0x04, 0xd3, \n\t0x05, 0xc5, 0x02, 0x26, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x07, 0x03, 0x63, \n\t0x01, 0xa4, 0xfe, 0x98, 0xff, 0xff, 0x00, 0x64, 0xfe, 0x4b, 0x03, 0xfd, \n\t0x06, 0x70, 0x02, 0x26, 0x00, 0x4a, 0x00, 0x00, 0x01, 0x07, 0x03, 0x8f, \n\t0x01, 0x2b, 0x00, 0x59, 0x00, 0x1c, 0x00, 0xb2, 0x60, 0x30, 0x01, 0x5d, \n\t0xb2, 0x0f, 0x30, 0x01, 0x5d, 0xb2, 0x2f, 0x30, 0x01, 0x5d, 0xb2, 0xa0, \n\t0x30, 0x01, 0x5d, 0xb2, 0x80, 0x30, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x01, 0x07, 0x48, 0x02, 0x26, \n\t0x00, 0x2b, 0x00, 0x00, 0x01, 0x07, 0x01, 0x52, 0x00, 0xf4, 0x01, 0x5d, \n\t0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, \n\t0x10, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x8f, \n\t0x00, 0x00, 0x04, 0x00, 0x07, 0x47, 0x02, 0x26, 0x00, 0x4b, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x52, 0x00, 0x20, 0x01, 0x5c, 0x00, 0x46, 0x00, 0xb4, \n\t0x8f, 0x18, 0x9f, 0x18, 0x02, 0x5d, 0xb2, 0xef, 0x18, 0x01, 0x5d, 0xb4, \n\t0x5f, 0x18, 0x6f, 0x18, 0x02, 0x71, 0xb2, 0xdf, 0x18, 0x01, 0x71, 0xb2, \n\t0x7f, 0x18, 0x01, 0x72, 0xb4, 0x2f, 0x18, 0x3f, 0x18, 0x02, 0x72, 0xb2, \n\t0xaf, 0x18, 0x01, 0x71, 0xb4, 0x0f, 0x18, 0x1f, 0x18, 0x02, 0x71, 0xb2, \n\t0xbf, 0x18, 0x01, 0x5d, 0xb4, 0x4f, 0x18, 0x5f, 0x18, 0x02, 0x5d, 0xb4, \n\t0x1f, 0x18, 0x2f, 0x18, 0x02, 0x5d, 0x30, 0x31, 0x00, 0x02, 0x00, 0x1f, \n\t0x00, 0x00, 0x05, 0x8f, 0x05, 0xb0, 0x00, 0x13, 0x00, 0x17, 0x00, 0x75, \n\t0x00, 0xb0, 0x10, 0x2f, 0xb0, 0x14, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x06, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x06, 0x3e, 0x59, 0xb2, \n\t0x0f, 0x10, 0x01, 0x5d, 0xb0, 0x10, 0x10, 0xb0, 0x00, 0xd0, 0xb0, 0x10, \n\t0x10, 0xb1, 0x17, 0x05, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x03, 0xd0, 0xb0, 0x14, 0x10, 0xb1, 0x07, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x17, 0x10, 0xb0, 0x0a, \n\t0xd0, 0xb0, 0x10, 0x10, 0xb0, 0x0d, 0xd0, 0x30, 0x31, 0x01, 0x33, 0x15, \n\t0x23, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, \n\t0x33, 0x11, 0x21, 0x11, 0x33, 0x01, 0x21, 0x35, 0x21, 0x04, 0xff, 0x90, \n\t0x90, 0xc5, 0xfd, 0x3d, 0xc5, 0x93, 0x93, 0xc5, 0x02, 0xc3, 0xc5, 0xfc, \n\t0x78, 0x02, 0xc3, 0xfd, 0x3d, 0x04, 0x91, 0x91, 0xfc, 0x00, 0x02, 0x83, \n\t0xfd, 0x7d, 0x04, 0x00, 0x91, 0x01, 0x1f, 0xfe, 0xe1, 0x01, 0x1f, 0xfd, \n\t0x6e, 0xe2, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x04, 0x1e, \n\t0x06, 0x18, 0x00, 0x1b, 0x00, 0x73, 0x00, 0xb0, 0x18, 0x2f, 0xb0, 0x1b, \n\t0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, \n\t0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, \n\t0x12, 0x06, 0x3e, 0x59, 0xb2, 0x5f, 0x1b, 0x01, 0x5d, 0xb2, 0x2f, 0x1b, \n\t0x01, 0x5d, 0xb2, 0x0f, 0x1b, 0x01, 0x5d, 0xb0, 0x1b, 0x10, 0xb1, 0x00, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x30, \n\t0x05, 0x01, 0x5d, 0xb0, 0x05, 0x10, 0xb1, 0x0e, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb0, 0x14, 0xd0, \n\t0xb0, 0x1b, 0x10, 0xb0, 0x16, 0xd0, 0xb2, 0x2f, 0x18, 0x01, 0x5d, 0x30, \n\t0x31, 0x01, 0x21, 0x11, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x23, \n\t0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x23, 0x11, 0x23, 0x35, \n\t0x33, 0x35, 0x33, 0x15, 0x21, 0x02, 0x82, 0xfe, 0xf0, 0x38, 0xa3, 0x63, \n\t0xad, 0xc1, 0xc5, 0x73, 0x72, 0x52, 0x85, 0x2b, 0xc5, 0xac, 0xac, 0xc5, \n\t0x01, 0x10, 0x04, 0xcf, 0xfe, 0xda, 0x4e, 0x57, 0xd0, 0xd8, 0xfd, 0x5a, \n\t0x02, 0xa8, 0x86, 0x80, 0x4d, 0x42, 0xfc, 0xe1, 0x04, 0xcf, 0x9b, 0xae, \n\t0xae, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xc8, 0x00, 0x00, 0x02, 0x7e, \n\t0x07, 0x54, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x01, 0x58, \n\t0xff, 0x41, 0x01, 0x61, 0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0xff, 0xa3, 0x00, 0x00, 0x02, 0x59, 0x05, 0xfd, 0x02, 0x26, \n\t0x00, 0xf3, 0x00, 0x00, 0x01, 0x07, 0x01, 0x58, 0xff, 0x1c, 0x00, 0x0a, \n\t0x00, 0x20, 0x00, 0xb2, 0x5f, 0x07, 0x01, 0x72, 0xb2, 0x8f, 0x07, 0x01, \n\t0x71, 0xb2, 0x3f, 0x07, 0x01, 0x72, 0xb4, 0xef, 0x07, 0xff, 0x07, 0x02, \n\t0x71, 0xb4, 0x0f, 0x07, 0x1f, 0x07, 0x02, 0x72, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x02, 0x91, 0x06, 0xfa, 0x02, 0x26, \n\t0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x71, 0xff, 0x45, 0x01, 0x4a, \n\t0x00, 0x08, 0x00, 0xb2, 0x0f, 0x04, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0xff, 0x9b, 0x00, 0x00, 0x02, 0x6c, 0x05, 0xa5, 0x02, 0x26, \n\t0x00, 0xf3, 0x00, 0x00, 0x00, 0x07, 0x00, 0x71, 0xff, 0x20, 0xff, 0xf5, \n\t0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x02, 0x4f, 0x07, 0x4e, 0x02, 0x26, \n\t0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x01, 0x54, 0xff, 0x77, 0x01, 0x9e, \n\t0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, \n\t0x08, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0xff, 0xd3, \n\t0x00, 0x00, 0x02, 0x2a, 0x05, 0xf7, 0x02, 0x26, 0x00, 0xf3, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x54, 0xff, 0x52, 0x00, 0x47, 0x00, 0x20, 0x00, 0xb2, \n\t0xff, 0x08, 0x01, 0x71, 0xb6, 0x3f, 0x08, 0x4f, 0x08, 0x5f, 0x08, 0x03, \n\t0x5d, 0xb2, 0x1f, 0x08, 0x01, 0x72, 0xb2, 0xcf, 0x08, 0x01, 0x71, 0xb2, \n\t0xaf, 0x08, 0x01, 0x71, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2e, \n\t0xfe, 0x50, 0x01, 0xbd, 0x05, 0xb0, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, \n\t0x00, 0x06, 0x01, 0x57, 0xea, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, \n\t0xfe, 0x50, 0x01, 0x9d, 0x06, 0x18, 0x02, 0x26, 0x00, 0x4c, 0x00, 0x00, \n\t0x00, 0x06, 0x01, 0x57, 0xca, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, \n\t0x00, 0x00, 0x01, 0x8e, 0x07, 0x0d, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x55, 0x00, 0x14, 0x01, 0x5d, 0x00, 0x10, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x12, 0x3e, 0x59, \n\t0x30, 0x31, 0x00, 0x00, 0x00, 0x01, 0x00, 0x99, 0x00, 0x00, 0x01, 0x5e, \n\t0x04, 0x3a, 0x00, 0x03, 0x00, 0x1d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x06, 0x3e, 0x59, 0x30, 0x31, 0x21, \n\t0x23, 0x11, 0x33, 0x01, 0x5e, 0xc5, 0xc5, 0x04, 0x3a, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0xbe, 0xff, 0xeb, 0x06, 0x06, 0x05, 0xb0, 0x00, 0x26, \n\t0x00, 0x2c, 0x00, 0x00, 0x00, 0x07, 0x00, 0x2d, 0x02, 0x43, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x9f, 0xfe, 0x4b, 0x03, 0x76, 0x06, 0x18, 0x00, 0x26, \n\t0x00, 0x4c, 0x00, 0x00, 0x00, 0x07, 0x00, 0x4d, 0x02, 0x04, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x3d, 0xff, 0xeb, 0x04, 0x8c, 0x07, 0x3c, 0x02, 0x26, \n\t0x00, 0x2d, 0x00, 0x00, 0x01, 0x07, 0x01, 0x52, 0x01, 0x7b, 0x01, 0x51, \n\t0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x15, 0x2f, 0x1b, 0xb1, \n\t0x15, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0xff, 0xbc, \n\t0xfe, 0x4b, 0x02, 0x44, 0x05, 0xdf, 0x02, 0x26, 0x01, 0x50, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x52, 0xff, 0x33, 0xff, 0xf4, 0x00, 0x14, 0x00, 0xb4, \n\t0x2f, 0x14, 0x3f, 0x14, 0x02, 0x72, 0xb2, 0x7f, 0x14, 0x01, 0x72, 0xb2, \n\t0x5f, 0x14, 0x01, 0x72, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, \n\t0xfe, 0x23, 0x05, 0x20, 0x05, 0xb0, 0x02, 0x26, 0x00, 0x2e, 0x00, 0x00, \n\t0x00, 0x07, 0x03, 0x63, 0x01, 0x82, 0xfe, 0xa9, 0xff, 0xff, 0x00, 0x90, \n\t0xfe, 0x25, 0x04, 0x1c, 0x06, 0x18, 0x02, 0x26, 0x00, 0x4e, 0x00, 0x00, \n\t0x00, 0x07, 0x03, 0x63, 0x01, 0x1f, 0xfe, 0xab, 0x00, 0x01, 0x00, 0x99, \n\t0x00, 0x00, 0x04, 0x40, 0x04, 0x3a, 0x00, 0x0e, 0x00, 0x8e, 0x00, 0xb0, \n\t0x06, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, \n\t0x08, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, \n\t0xb1, 0x02, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, \n\t0x1b, 0xb1, 0x0e, 0x06, 0x3e, 0x59, 0xb4, 0xbf, 0x06, 0xcf, 0x06, 0x02, \n\t0x5d, 0xb2, 0x2f, 0x06, 0x01, 0x71, 0xb2, 0x9f, 0x06, 0x01, 0x71, 0xb2, \n\t0xff, 0x06, 0x01, 0x71, 0xb2, 0x6f, 0x06, 0x01, 0x72, 0xb2, 0xdf, 0x06, \n\t0x01, 0x72, 0xb2, 0x3f, 0x06, 0x01, 0x72, 0xb2, 0xcf, 0x06, 0x01, 0x71, \n\t0xb2, 0x6f, 0x06, 0x01, 0x71, 0xb2, 0xff, 0x06, 0x01, 0x5d, 0xb2, 0x5f, \n\t0x06, 0x01, 0x5d, 0xb2, 0x2f, 0x06, 0x01, 0x5d, 0xb0, 0x06, 0x10, 0xb1, \n\t0x01, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, \n\t0x0b, 0x06, 0x01, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x23, 0x11, 0x23, \n\t0x11, 0x33, 0x11, 0x33, 0x01, 0x33, 0x17, 0x01, 0x01, 0x07, 0x23, 0x01, \n\t0xc3, 0x65, 0xc5, 0xc5, 0x54, 0x01, 0x84, 0xe7, 0x02, 0xfe, 0x3e, 0x01, \n\t0xe3, 0x02, 0xf1, 0x01, 0xcb, 0xfe, 0x35, 0x04, 0x3a, 0xfe, 0x37, 0x01, \n\t0xc9, 0x05, 0xfd, 0xfe, 0xfd, 0xd2, 0x05, 0x00, 0xff, 0xff, 0x00, 0xb4, \n\t0x00, 0x00, 0x04, 0x2a, 0x07, 0x1e, 0x02, 0x26, 0x00, 0x2f, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x76, 0x00, 0x37, 0x01, 0x59, 0x00, 0x15, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x14, 0x3e, 0x59, \n\t0xb2, 0x0f, 0x06, 0x01, 0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x9f, \n\t0x00, 0x00, 0x02, 0x49, 0x07, 0x44, 0x02, 0x26, 0x00, 0x4f, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x76, 0x00, 0x25, 0x01, 0x7f, 0x00, 0x47, 0x00, 0xb0, \n\t0x03, 0x2f, 0xb0, 0x07, 0xdc, 0xb2, 0xff, 0x07, 0x01, 0x72, 0xb2, 0x7f, \n\t0x07, 0x01, 0x72, 0xb2, 0x9f, 0x07, 0x01, 0x71, 0xb2, 0x4f, 0x08, 0x01, \n\t0x5d, 0xb6, 0xcf, 0x08, 0xdf, 0x08, 0xef, 0x08, 0x03, 0x5d, 0xb4, 0x2f, \n\t0x08, 0x3f, 0x08, 0x02, 0x72, 0xb2, 0x2f, 0x08, 0x01, 0x71, 0xb4, 0x8f, \n\t0x08, 0x9f, 0x08, 0x02, 0x5d, 0xb4, 0x1f, 0x08, 0x2f, 0x08, 0x02, 0x5d, \n\t0xb4, 0xdf, 0x08, 0xef, 0x08, 0x02, 0x71, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0xb4, 0xfe, 0x25, 0x04, 0x2a, 0x05, 0xb0, 0x02, 0x26, \n\t0x00, 0x2f, 0x00, 0x00, 0x00, 0x07, 0x03, 0x63, 0x01, 0x7b, 0xfe, 0xab, \n\t0xff, 0xff, 0x00, 0x6e, 0xfe, 0x25, 0x01, 0x64, 0x06, 0x18, 0x02, 0x26, \n\t0x00, 0x4f, 0x00, 0x00, 0x00, 0x07, 0x03, 0x63, 0x00, 0x09, 0xfe, 0xab, \n\t0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x2a, 0x05, 0xb1, 0x02, 0x26, \n\t0x00, 0x2f, 0x00, 0x00, 0x01, 0x07, 0x03, 0x63, 0x01, 0xe2, 0x04, 0xbe, \n\t0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, \n\t0x0a, 0x0c, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9f, \n\t0x00, 0x00, 0x02, 0xa0, 0x06, 0x18, 0x00, 0x26, 0x00, 0x4f, 0x00, 0x00, \n\t0x01, 0x07, 0x03, 0x63, 0x01, 0x60, 0x05, 0x25, 0x00, 0x37, 0x00, 0xb0, \n\t0x08, 0x2f, 0xb2, 0x80, 0x08, 0x01, 0x72, 0xb4, 0x1f, 0x08, 0x2f, 0x08, \n\t0x02, 0x5d, 0xb2, 0x2f, 0x08, 0x01, 0x71, 0xb2, 0xbf, 0x08, 0x01, 0x72, \n\t0xb2, 0x3f, 0x08, 0x01, 0x72, 0xb4, 0x4f, 0x08, 0x5f, 0x08, 0x02, 0x5d, \n\t0xb2, 0x60, 0x08, 0x01, 0x5d, 0xb2, 0xf0, 0x08, 0x01, 0x71, 0xb2, 0x70, \n\t0x08, 0x01, 0x71, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, \n\t0x00, 0x00, 0x04, 0x2a, 0x05, 0xb0, 0x02, 0x26, 0x00, 0x2f, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x55, 0x01, 0xc5, 0xfd, 0xc9, 0x00, 0x06, 0x00, 0xb0, \n\t0x08, 0x2f, 0x30, 0x31, 0xff, 0xff, 0x00, 0x9f, 0x00, 0x00, 0x02, 0xbf, \n\t0x06, 0x18, 0x00, 0x26, 0x00, 0x4f, 0x00, 0x00, 0x01, 0x07, 0x01, 0x55, \n\t0x01, 0x45, 0xfd, 0xb8, 0x00, 0x06, 0x00, 0xb0, 0x06, 0x2f, 0x30, 0x31, \n\t0x00, 0x01, 0x00, 0x28, 0x00, 0x00, 0x04, 0x19, 0x05, 0xb0, 0x00, 0x0d, \n\t0x00, 0x59, 0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, \n\t0x2f, 0x1b, 0xb1, 0x0c, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x10, 0xb0, \n\t0x01, 0xd0, 0xb0, 0x00, 0x10, 0xb1, 0x03, 0x03, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x02, 0xd0, 0xb0, 0x06, 0x10, 0xb1, \n\t0x04, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x03, 0x10, 0xb0, 0x08, 0xd0, 0xb0, 0x09, 0xd0, 0xb0, 0x00, 0x10, 0xb0, \n\t0x0b, 0xd0, 0xb0, 0x0a, 0xd0, 0x30, 0x31, 0x01, 0x25, 0x15, 0x05, 0x11, \n\t0x21, 0x15, 0x21, 0x11, 0x07, 0x35, 0x37, 0x11, 0x33, 0x01, 0x68, 0x01, \n\t0x0d, 0xfe, 0xf3, 0x02, 0xb1, 0xfc, 0x8a, 0x7b, 0x7b, 0xc5, 0x03, 0x4b, \n\t0x56, 0xa6, 0x56, 0xfd, 0xf5, 0x9a, 0x02, 0x67, 0x27, 0xa6, 0x27, 0x02, \n\t0xa3, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x25, 0x00, 0x00, 0x02, 0x0e, \n\t0x06, 0x18, 0x00, 0x0b, 0x00, 0x45, 0x00, 0xb0, 0x0a, 0x2f, 0xb0, 0x00, \n\t0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x06, \n\t0x3e, 0x59, 0xb0, 0x00, 0x10, 0xb0, 0x01, 0xd0, 0xb0, 0x00, 0x10, 0xb1, \n\t0x03, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x02, 0xd0, 0xb0, 0x03, 0x10, 0xb0, 0x06, 0xd0, 0xb0, 0x07, 0xd0, 0xb0, \n\t0x00, 0x10, 0xb0, 0x09, 0xd0, 0xb0, 0x08, 0xd0, 0xb2, 0x2f, 0x0a, 0x01, \n\t0x5d, 0x30, 0x31, 0x01, 0x37, 0x15, 0x07, 0x11, 0x23, 0x11, 0x07, 0x35, \n\t0x37, 0x11, 0x33, 0x01, 0x78, 0x96, 0x96, 0xc5, 0x8e, 0x8e, 0xc5, 0x03, \n\t0x68, 0x3a, 0xa5, 0x3a, 0xfd, 0x3d, 0x02, 0x78, 0x36, 0xa5, 0x36, 0x02, \n\t0xfb, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x01, \n\t0x07, 0x1e, 0x02, 0x26, 0x00, 0x31, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, \n\t0x01, 0xfb, 0x01, 0x59, 0x00, 0x15, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x14, 0x3e, 0x59, 0xb2, 0x0f, 0x0c, 0x01, \n\t0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x8f, 0x00, 0x00, 0x03, 0xfd, \n\t0x05, 0xdc, 0x02, 0x26, 0x00, 0x51, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, \n\t0x01, 0x65, 0x00, 0x17, 0x00, 0x1a, 0x00, 0xb2, 0xbf, 0x17, 0x01, 0x71, \n\t0xb6, 0xdf, 0x17, 0xef, 0x17, 0xff, 0x17, 0x03, 0x71, 0xb6, 0x0f, 0x17, \n\t0x1f, 0x17, 0x2f, 0x17, 0x03, 0x72, 0x30, 0x31, 0xff, 0xff, 0x00, 0xb4, \n\t0xfe, 0x25, 0x05, 0x01, 0x05, 0xb0, 0x02, 0x26, 0x00, 0x31, 0x00, 0x00, \n\t0x00, 0x07, 0x03, 0x63, 0x01, 0xdf, 0xfe, 0xab, 0xff, 0xff, 0x00, 0x8f, \n\t0xfe, 0x25, 0x03, 0xfd, 0x04, 0x4e, 0x02, 0x26, 0x00, 0x51, 0x00, 0x00, \n\t0x00, 0x07, 0x03, 0x63, 0x01, 0x49, 0xfe, 0xab, 0xff, 0xff, 0x00, 0xb4, \n\t0x00, 0x00, 0x05, 0x01, 0x07, 0x49, 0x02, 0x26, 0x00, 0x31, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x53, 0x01, 0x12, 0x01, 0x5e, 0x00, 0x10, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x12, 0x3e, 0x59, \n\t0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x8f, 0x00, 0x00, 0x03, 0xfd, \n\t0x06, 0x07, 0x02, 0x26, 0x00, 0x51, 0x00, 0x00, 0x01, 0x06, 0x01, 0x53, \n\t0x7c, 0x1c, 0x00, 0x22, 0x00, 0x40, 0x0b, 0xb0, 0x19, 0xc0, 0x19, 0xd0, \n\t0x19, 0xe0, 0x19, 0xf0, 0x19, 0x05, 0x71, 0xb4, 0x00, 0x19, 0x10, 0x19, \n\t0x02, 0x72, 0xb2, 0x60, 0x19, 0x01, 0x72, 0xb2, 0x40, 0x19, 0x01, 0x72, \n\t0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x03, 0xfd, \n\t0x06, 0x18, 0x02, 0x26, 0x00, 0x51, 0x00, 0x00, 0x01, 0x07, 0x03, 0x63, \n\t0xff, 0x7b, 0x05, 0x25, 0x00, 0x06, 0x00, 0xb0, 0x19, 0x2f, 0x30, 0x31, \n\t0x00, 0x01, 0x00, 0xa1, 0xfe, 0x4b, 0x04, 0xee, 0x05, 0xb0, 0x00, 0x18, \n\t0x00, 0x58, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, \n\t0x00, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x14, 0x2f, 0x1b, \n\t0xb1, 0x14, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, \n\t0x1b, 0xb1, 0x04, 0x08, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, \n\t0x2f, 0x1b, 0xb1, 0x12, 0x06, 0x3e, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x0b, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x12, \n\t0x10, 0xb0, 0x0f, 0xd0, 0xb0, 0x14, 0x10, 0xb0, 0x10, 0xd0, 0xb0, 0x0f, \n\t0x10, 0xb0, 0x16, 0xd0, 0x30, 0x31, 0x01, 0x11, 0x14, 0x06, 0x23, 0x22, \n\t0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x01, 0x07, \n\t0x11, 0x23, 0x11, 0x33, 0x01, 0x37, 0x11, 0x04, 0xee, 0xac, 0x9a, 0x1f, \n\t0x34, 0x1d, 0x0e, 0x0d, 0x44, 0x11, 0x3c, 0x45, 0xfd, 0x43, 0x06, 0xc5, \n\t0xc5, 0x02, 0xbd, 0x06, 0x05, 0xb0, 0xf9, 0xf7, 0xa7, 0xb5, 0x09, 0x09, \n\t0x96, 0x05, 0x08, 0x67, 0x5a, 0x59, 0x04, 0x58, 0x02, 0xfb, 0xaa, 0x05, \n\t0xb0, 0xfb, 0xa8, 0x02, 0x04, 0x56, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8f, \n\t0xfe, 0x4b, 0x03, 0xf5, 0x04, 0x4e, 0x00, 0x1f, 0x00, 0x55, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1f, 0x2f, 0x1b, 0xb1, 0x1f, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x08, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1d, 0x2f, 0x1b, 0xb1, 0x1d, \n\t0x06, 0x3e, 0x59, 0xb0, 0x0b, 0x10, 0xb1, 0x12, 0x03, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x19, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, \n\t0x17, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x14, 0x06, 0x23, 0x22, \n\t0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x34, 0x26, \n\t0x23, 0x22, 0x06, 0x07, 0x11, 0x23, 0x11, 0x01, 0x3f, 0x0d, 0x36, 0xa0, \n\t0x65, 0xae, 0xc0, 0xac, 0x9a, 0x1f, 0x35, 0x1c, 0x0e, 0x0d, 0x43, 0x12, \n\t0x3d, 0x44, 0x72, 0x74, 0x55, 0x7b, 0x26, 0xc5, 0x04, 0x3a, 0x96, 0x51, \n\t0x59, 0xcd, 0xd6, 0xfc, 0xfc, 0xa7, 0xb5, 0x09, 0x09, 0xa0, 0x05, 0x07, \n\t0x5e, 0x58, 0x03, 0x00, 0x8f, 0x78, 0x42, 0x3b, 0xfc, 0xcf, 0x04, 0x3a, \n\t0xff, 0xff, 0x00, 0x71, 0xff, 0xeb, 0x05, 0x02, 0x07, 0x0f, 0x02, 0x26, \n\t0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x00, 0x71, 0x00, 0xdc, 0x01, 0x5f, \n\t0x00, 0x2b, 0x00, 0xb4, 0x80, 0x1d, 0x90, 0x1d, 0x02, 0x71, 0xb6, 0x30, \n\t0x1d, 0x40, 0x1d, 0x50, 0x1d, 0x03, 0x72, 0xb2, 0x60, 0x1d, 0x01, 0x5d, \n\t0xb6, 0xd0, 0x1d, 0xe0, 0x1d, 0xf0, 0x1d, 0x03, 0x71, 0xb2, 0x20, 0x1d, \n\t0x01, 0x71, 0xb2, 0xc0, 0x1d, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x61, 0xff, 0xeb, 0x04, 0x2a, 0x05, 0xb8, 0x02, 0x26, \n\t0x00, 0x52, 0x00, 0x00, 0x00, 0x06, 0x00, 0x71, 0x68, 0x08, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x71, 0xff, 0xeb, 0x05, 0x02, 0x07, 0x63, 0x02, 0x26, \n\t0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x01, 0x54, 0x01, 0x0e, 0x01, 0xb3, \n\t0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x20, 0x2f, 0x1b, 0xb1, \n\t0x20, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x61, \n\t0xff, 0xeb, 0x04, 0x2a, 0x06, 0x0c, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x54, 0x00, 0x9a, 0x00, 0x5c, 0x00, 0x36, 0x00, 0xb2, \n\t0x00, 0x20, 0x01, 0x71, 0xb2, 0xb0, 0x20, 0x01, 0x71, 0xb2, 0x00, 0x20, \n\t0x01, 0x72, 0xb2, 0x8f, 0x20, 0x01, 0x71, 0xb2, 0x20, 0x20, 0x01, 0x72, \n\t0xb4, 0xd0, 0x20, 0xe0, 0x20, 0x02, 0x71, 0xb2, 0x90, 0x20, 0x01, 0x71, \n\t0xb6, 0x60, 0x20, 0x70, 0x20, 0x80, 0x20, 0x03, 0x5d, 0xb2, 0x20, 0x20, \n\t0x01, 0x5d, 0x30, 0x31, 0xff, 0xff, 0x00, 0x71, 0xff, 0xeb, 0x05, 0x02, \n\t0x07, 0x60, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x01, 0x59, \n\t0x01, 0x6a, 0x01, 0x72, 0x00, 0x1d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x26, 0x2f, 0x1b, 0xb1, 0x26, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x20, 0x2f, 0x1b, 0xb1, 0x20, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x61, 0xff, 0xeb, 0x04, 0x40, 0x06, 0x09, 0x02, 0x26, \n\t0x00, 0x52, 0x00, 0x00, 0x01, 0x07, 0x01, 0x59, 0x00, 0xf6, 0x00, 0x1b, \n\t0x00, 0x29, 0x00, 0xb4, 0xe0, 0x1f, 0xf0, 0x1f, 0x02, 0x71, 0x40, 0x09, \n\t0x00, 0x1f, 0x10, 0x1f, 0x20, 0x1f, 0x30, 0x1f, 0x04, 0x72, 0xb4, 0xe0, \n\t0x25, 0xf0, 0x25, 0x02, 0x71, 0x40, 0x09, 0x00, 0x25, 0x10, 0x25, 0x20, \n\t0x25, 0x30, 0x25, 0x04, 0x72, 0x30, 0x31, 0x00, 0x00, 0x02, 0x00, 0x68, \n\t0xff, 0xeb, 0x07, 0x4f, 0x05, 0xc5, 0x00, 0x17, 0x00, 0x25, 0x00, 0x94, \n\t0x00, 0xb0, 0x12, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, \n\t0xb1, 0x0b, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, \n\t0x1b, 0xb1, 0x0f, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, \n\t0x2f, 0x1b, 0xb1, 0x00, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x06, 0x3e, 0x59, 0xb0, 0x0f, 0x10, 0xb1, \n\t0x10, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, \n\t0x7f, 0x12, 0x01, 0x5d, 0xb2, 0x2f, 0x12, 0x01, 0x5d, 0xb2, 0xef, 0x12, \n\t0x01, 0x5d, 0xb0, 0x12, 0x10, 0xb1, 0x15, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x17, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb1, \n\t0x18, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x0b, 0x10, 0xb1, 0x1f, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0x30, 0x31, 0x21, 0x21, 0x06, 0x06, 0x23, 0x22, 0x00, 0x11, \n\t0x11, 0x10, 0x00, 0x33, 0x32, 0x16, 0x17, 0x21, 0x15, 0x21, 0x11, 0x21, \n\t0x15, 0x21, 0x11, 0x21, 0x05, 0x32, 0x36, 0x37, 0x11, 0x26, 0x26, 0x23, \n\t0x22, 0x06, 0x15, 0x11, 0x14, 0x16, 0x07, 0x4f, 0xfc, 0x6a, 0x5c, 0x82, \n\t0x43, 0xf9, 0xfe, 0xc9, 0x01, 0x35, 0xf9, 0x45, 0x8f, 0x4f, 0x03, 0x8b, \n\t0xfd, 0x0a, 0x02, 0x9b, 0xfd, 0x65, 0x03, 0x01, 0xfb, 0x49, 0x3d, 0x7a, \n\t0x3a, 0x3d, 0x7a, 0x3c, 0xa9, 0xc0, 0xc2, 0x0a, 0x0b, 0x01, 0x4c, 0x01, \n\t0x09, 0x01, 0x30, 0x01, 0x09, 0x01, 0x4c, 0x0c, 0x09, 0x9b, 0xfe, 0x29, \n\t0x9b, 0xfd, 0xf7, 0x14, 0x09, 0x09, 0x04, 0x7f, 0x08, 0x0b, 0xe3, 0xd5, \n\t0xfe, 0xce, 0xd6, 0xe4, 0x00, 0x03, 0x00, 0x61, 0xff, 0xeb, 0x06, 0xf7, \n\t0x04, 0x4e, 0x00, 0x22, 0x00, 0x30, 0x00, 0x39, 0x00, 0x98, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x13, 0x2f, 0x1b, 0xb1, 0x13, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x06, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, \n\t0x06, 0x3e, 0x59, 0xb2, 0x17, 0x00, 0x13, 0x11, 0x12, 0x39, 0xb0, 0x17, \n\t0x2f, 0xb2, 0xa0, 0x17, 0x01, 0x5d, 0xb4, 0xd0, 0x17, 0xe0, 0x17, 0x02, \n\t0x5d, 0xb0, 0x00, 0x10, 0xb1, 0x1c, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x06, 0x10, 0xb1, 0x26, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0d, 0x10, 0xb1, 0x2d, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x13, \n\t0x10, 0xb1, 0x31, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x17, 0x10, 0xb1, 0x36, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x05, 0x22, 0x26, 0x27, 0x06, 0x06, \n\t0x23, 0x22, 0x00, 0x35, 0x35, 0x34, 0x00, 0x33, 0x32, 0x16, 0x17, 0x36, \n\t0x36, 0x33, 0x32, 0x12, 0x15, 0x15, 0x21, 0x07, 0x16, 0x16, 0x33, 0x32, \n\t0x36, 0x37, 0x17, 0x06, 0x06, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, \n\t0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x01, 0x22, 0x06, 0x07, 0x17, \n\t0x21, 0x35, 0x34, 0x26, 0x05, 0x5a, 0x83, 0xcb, 0x41, 0x40, 0xc6, 0x7f, \n\t0xe0, 0xfe, 0xfb, 0x01, 0x04, 0xdf, 0x82, 0xc8, 0x40, 0x41, 0xc1, 0x6c, \n\t0xdb, 0xe0, 0xfd, 0x42, 0x03, 0x03, 0x98, 0x89, 0x64, 0x97, 0x37, 0x4d, \n\t0x3a, 0xbe, 0xfb, 0x45, 0x91, 0x8f, 0x8d, 0x92, 0x93, 0x8e, 0x8d, 0x91, \n\t0x04, 0x16, 0x63, 0x8c, 0x10, 0x02, 0x01, 0xf3, 0x7c, 0x15, 0x69, 0x60, \n\t0x60, 0x69, 0x01, 0x35, 0xf1, 0x16, 0xf0, 0x01, 0x37, 0x6d, 0x62, 0x61, \n\t0x6e, 0xfe, 0xf8, 0xdc, 0x7b, 0x05, 0x9c, 0xc9, 0x39, 0x32, 0x80, 0x39, \n\t0x4c, 0x02, 0x26, 0xac, 0xe0, 0xe0, 0xac, 0x16, 0xaa, 0xe2, 0xe2, 0xaa, \n\t0x01, 0x8c, 0xa7, 0x7e, 0x05, 0x1a, 0x74, 0x9c, 0xff, 0xff, 0x00, 0xb4, \n\t0x00, 0x00, 0x04, 0xed, 0x07, 0x1e, 0x02, 0x26, 0x00, 0x35, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x76, 0x01, 0x8f, 0x01, 0x59, 0x00, 0x15, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x24, 0x2f, 0x1b, 0xb1, 0x24, 0x14, 0x3e, 0x59, \n\t0xb2, 0x0f, 0x24, 0x01, 0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x8f, \n\t0x00, 0x00, 0x02, 0xe4, 0x05, 0xdc, 0x02, 0x26, 0x00, 0x55, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x76, 0x00, 0xc0, 0x00, 0x17, 0x00, 0x1a, 0x00, 0xb2, \n\t0xbf, 0x13, 0x01, 0x71, 0xb6, 0xdf, 0x13, 0xef, 0x13, 0xff, 0x13, 0x03, \n\t0x71, 0xb6, 0x0f, 0x13, 0x1f, 0x13, 0x2f, 0x13, 0x03, 0x72, 0x30, 0x31, \n\t0xff, 0xff, 0x00, 0xb4, 0xfe, 0x25, 0x04, 0xed, 0x05, 0xaf, 0x02, 0x26, \n\t0x00, 0x35, 0x00, 0x00, 0x00, 0x07, 0x03, 0x63, 0x01, 0x73, 0xfe, 0xab, \n\t0xff, 0xff, 0x00, 0x6b, 0xfe, 0x25, 0x02, 0xaa, 0x04, 0x4e, 0x02, 0x26, \n\t0x00, 0x55, 0x00, 0x00, 0x00, 0x07, 0x03, 0x63, 0x00, 0x06, 0xfe, 0xab, \n\t0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xed, 0x07, 0x49, 0x02, 0x26, \n\t0x00, 0x35, 0x00, 0x00, 0x01, 0x07, 0x01, 0x53, 0x00, 0xa6, 0x01, 0x5e, \n\t0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x28, 0x2f, 0x1b, 0xb1, \n\t0x28, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, \n\t0x00, 0x00, 0x02, 0xdb, 0x06, 0x07, 0x02, 0x26, 0x00, 0x55, 0x00, 0x00, \n\t0x01, 0x06, 0x01, 0x53, 0xd9, 0x1c, 0x00, 0x22, 0x00, 0x40, 0x0b, 0xb0, \n\t0x15, 0xc0, 0x15, 0xd0, 0x15, 0xe0, 0x15, 0xf0, 0x15, 0x05, 0x71, 0xb4, \n\t0x00, 0x15, 0x10, 0x15, 0x02, 0x72, 0xb2, 0x60, 0x15, 0x01, 0x72, 0xb2, \n\t0x40, 0x15, 0x01, 0x72, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x61, \n\t0xff, 0xeb, 0x04, 0x92, 0x07, 0x33, 0x02, 0x26, 0x00, 0x36, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x76, 0x01, 0x88, 0x01, 0x6e, 0x00, 0x15, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x28, 0x2f, 0x1b, 0xb1, 0x28, 0x14, 0x3e, 0x59, \n\t0xb2, 0x0f, 0x28, 0x01, 0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x67, \n\t0xff, 0xeb, 0x03, 0xc9, 0x05, 0xdc, 0x02, 0x26, 0x00, 0x56, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x76, 0x01, 0x3a, 0x00, 0x17, 0x00, 0x1a, 0x00, 0xb2, \n\t0xbf, 0x2b, 0x01, 0x71, 0xb6, 0xdf, 0x2b, 0xef, 0x2b, 0xff, 0x2b, 0x03, \n\t0x71, 0xb6, 0x0f, 0x2b, 0x1f, 0x2b, 0x2f, 0x2b, 0x03, 0x72, 0x30, 0x31, \n\t0xff, 0xff, 0x00, 0x61, 0xff, 0xeb, 0x04, 0x92, 0x07, 0x5d, 0x02, 0x26, \n\t0x00, 0x36, 0x00, 0x00, 0x01, 0x07, 0x01, 0x52, 0x00, 0x88, 0x01, 0x72, \n\t0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x2c, 0x2f, 0x1b, 0xb1, \n\t0x2c, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, \n\t0xff, 0xeb, 0x03, 0xc9, 0x06, 0x06, 0x02, 0x26, 0x00, 0x56, 0x00, 0x00, \n\t0x01, 0x06, 0x01, 0x52, 0x3a, 0x1b, 0x00, 0x1d, 0x00, 0xb6, 0xd0, 0x2c, \n\t0xe0, 0x2c, 0xf0, 0x2c, 0x03, 0x71, 0xb4, 0x00, 0x2c, 0x10, 0x2c, 0x02, \n\t0x72, 0xb2, 0x60, 0x2c, 0x01, 0x72, 0xb2, 0x40, 0x2c, 0x01, 0x72, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x61, 0xfe, 0x45, 0x04, 0x92, \n\t0x05, 0xc5, 0x02, 0x26, 0x00, 0x36, 0x00, 0x00, 0x00, 0x07, 0x00, 0x7a, \n\t0x01, 0x8d, 0xff, 0xf8, 0xff, 0xff, 0x00, 0x67, 0xfe, 0x46, 0x03, 0xc9, \n\t0x04, 0x4e, 0x02, 0x26, 0x00, 0x56, 0x00, 0x00, 0x00, 0x07, 0x00, 0x7a, \n\t0x01, 0x3f, 0xff, 0xf9, 0xff, 0xff, 0x00, 0x61, 0xff, 0xeb, 0x04, 0x92, \n\t0x07, 0x5e, 0x02, 0x26, 0x00, 0x36, 0x00, 0x00, 0x01, 0x07, 0x01, 0x53, \n\t0x00, 0x9f, 0x01, 0x73, 0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x2d, 0x2f, 0x1b, 0xb1, 0x2d, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x67, 0xff, 0xeb, 0x03, 0xc9, 0x06, 0x07, 0x02, 0x26, \n\t0x00, 0x56, 0x00, 0x00, 0x01, 0x06, 0x01, 0x53, 0x51, 0x1c, 0x00, 0x22, \n\t0x00, 0x40, 0x0b, 0xb0, 0x2d, 0xc0, 0x2d, 0xd0, 0x2d, 0xe0, 0x2d, 0xf0, \n\t0x2d, 0x05, 0x71, 0xb4, 0x00, 0x2d, 0x10, 0x2d, 0x02, 0x72, 0xb2, 0x60, \n\t0x2d, 0x01, 0x72, 0xb2, 0x40, 0x2d, 0x01, 0x72, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x22, 0xfe, 0x25, 0x04, 0x8e, 0x05, 0xb0, 0x02, 0x26, \n\t0x00, 0x37, 0x00, 0x00, 0x01, 0x07, 0x03, 0x63, 0x01, 0x62, 0xfe, 0xab, \n\t0x00, 0x08, 0x00, 0xb2, 0x60, 0x0d, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x22, 0xfe, 0x1b, 0x02, 0x6a, 0x05, 0x3f, 0x02, 0x26, \n\t0x00, 0x57, 0x00, 0x00, 0x00, 0x07, 0x03, 0x63, 0x00, 0xcf, 0xfe, 0xa1, \n\t0xff, 0xff, 0x00, 0x22, 0x00, 0x00, 0x04, 0x8e, 0x07, 0x48, 0x02, 0x26, \n\t0x00, 0x37, 0x00, 0x00, 0x01, 0x07, 0x01, 0x53, 0x00, 0x95, 0x01, 0x5d, \n\t0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, \n\t0x0d, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x22, \n\t0xff, 0xeb, 0x02, 0xfc, 0x06, 0x33, 0x00, 0x26, 0x00, 0x57, 0x00, 0x00, \n\t0x01, 0x07, 0x03, 0x63, 0x01, 0xbc, 0x05, 0x40, 0x00, 0x10, 0x00, 0xb0, \n\t0x1c, 0x2f, 0xb2, 0x0f, 0x1c, 0x01, 0x5d, 0xb2, 0x5f, 0x1c, 0x01, 0x5d, \n\t0x30, 0x31, 0x00, 0x00, 0x00, 0x01, 0x00, 0x22, 0x00, 0x00, 0x04, 0x8e, \n\t0x05, 0xb0, 0x00, 0x0f, 0x00, 0x4a, 0x00, 0xb0, 0x0f, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0c, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x06, 0x3e, 0x59, \n\t0xb0, 0x0f, 0x10, 0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x04, 0xd0, 0xb0, 0x0f, 0x10, 0xb0, 0x07, 0xd0, \n\t0xb0, 0x0a, 0x10, 0xb1, 0x08, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x0d, 0xd0, 0x30, 0x31, 0x01, 0x23, 0x11, 0x23, \n\t0x11, 0x23, 0x35, 0x33, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x33, \n\t0x03, 0x96, 0xdc, 0xc5, 0xe0, 0xe0, 0xfe, 0x2d, 0x04, 0x6c, 0xfe, 0x2c, \n\t0xdc, 0x03, 0x34, 0xfc, 0xcc, 0x03, 0x34, 0x9b, 0x01, 0x46, 0x9b, 0x9b, \n\t0xfe, 0xba, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf8, 0xff, 0xeb, 0x02, 0x79, \n\t0x05, 0x3f, 0x00, 0x1f, 0x00, 0x7e, 0x00, 0xb0, 0x06, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x0a, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x1d, 0x2f, 0x1b, 0xb1, 0x1d, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x13, 0x2f, 0x1b, 0xb1, 0x13, 0x06, 0x3e, \n\t0x59, 0xb0, 0x01, 0x10, 0xb1, 0x03, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x60, 0x06, 0x01, 0x5d, 0xb2, 0x10, 0x06, \n\t0x01, 0x5d, 0xb2, 0xc0, 0x06, 0x01, 0x5d, 0xb0, 0x06, 0x10, 0xb1, 0x07, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x13, \n\t0x10, 0xb1, 0x0c, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x07, 0x10, 0xb0, 0x17, 0xd0, 0xb0, 0x06, 0x10, 0xb0, 0x19, \n\t0xd0, 0xb0, 0x03, 0x10, 0xb0, 0x1b, 0xd0, 0xb0, 0x1c, 0xd0, 0x30, 0x31, \n\t0x01, 0x11, 0x33, 0x15, 0x23, 0x15, 0x33, 0x15, 0x23, 0x11, 0x14, 0x16, \n\t0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x11, \n\t0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0x11, 0x01, 0x93, 0xcd, 0xcd, \n\t0xe6, 0xe6, 0x3f, 0x34, 0x11, 0x29, 0x10, 0x1a, 0x16, 0x55, 0x2b, 0x78, \n\t0x8e, 0xd6, 0xd6, 0xac, 0xac, 0x05, 0x3f, 0xfe, 0xfb, 0x92, 0xb5, 0x9b, \n\t0xfe, 0xbf, 0x4c, 0x3e, 0x08, 0x06, 0x87, 0x12, 0x17, 0x91, 0x9b, 0x01, \n\t0x41, 0x9b, 0xb5, 0x92, 0x01, 0x05, 0x00, 0x00, 0xff, 0xff, 0x00, 0x93, \n\t0xff, 0xeb, 0x04, 0xdc, 0x07, 0x54, 0x02, 0x26, 0x00, 0x38, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x58, 0x00, 0xd7, 0x01, 0x61, 0x00, 0x10, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x15, 0x2f, 0x1b, 0xb1, 0x15, 0x12, 0x3e, 0x59, \n\t0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x8b, 0xff, 0xeb, 0x03, 0xfc, \n\t0x05, 0xfd, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, 0x01, 0x06, 0x01, 0x58, \n\t0x62, 0x0a, 0x00, 0x20, 0x00, 0xb2, 0x5f, 0x17, 0x01, 0x72, 0xb2, 0x8f, \n\t0x17, 0x01, 0x71, 0xb2, 0x3f, 0x17, 0x01, 0x72, 0xb4, 0xef, 0x17, 0xff, \n\t0x17, 0x02, 0x71, 0xb4, 0x0f, 0x17, 0x1f, 0x17, 0x02, 0x72, 0x30, 0x31, \n\t0xff, 0xff, 0x00, 0x93, 0xff, 0xeb, 0x04, 0xdc, 0x06, 0xfa, 0x02, 0x26, \n\t0x00, 0x38, 0x00, 0x00, 0x01, 0x07, 0x00, 0x71, 0x00, 0xdb, 0x01, 0x4a, \n\t0x00, 0x08, 0x00, 0xb2, 0x0f, 0x13, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x8b, 0xff, 0xeb, 0x03, 0xfc, 0x05, 0xa5, 0x02, 0x26, \n\t0x00, 0x58, 0x00, 0x00, 0x00, 0x06, 0x00, 0x71, 0x66, 0xf5, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x93, 0xff, 0xeb, 0x04, 0xdc, 0x07, 0x4e, 0x02, 0x26, \n\t0x00, 0x38, 0x00, 0x00, 0x01, 0x07, 0x01, 0x54, 0x01, 0x0d, 0x01, 0x9e, \n\t0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x16, 0x2f, 0x1b, 0xb1, \n\t0x16, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x8b, \n\t0xff, 0xeb, 0x03, 0xfc, 0x05, 0xf7, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x54, 0x00, 0x98, 0x00, 0x47, 0x00, 0x33, 0x00, 0xb2, \n\t0x8f, 0x18, 0x01, 0x71, 0xb2, 0xcf, 0x18, 0x01, 0x71, 0xb2, 0x1f, 0x18, \n\t0x01, 0x72, 0xb6, 0x3f, 0x18, 0x4f, 0x18, 0x5f, 0x18, 0x03, 0x5d, 0xb2, \n\t0xff, 0x18, 0x01, 0x71, 0xb2, 0xaf, 0x18, 0x01, 0x71, 0xb6, 0x60, 0x18, \n\t0x70, 0x18, 0x80, 0x18, 0x03, 0x5d, 0xb2, 0x00, 0x18, 0x01, 0x71, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x93, 0xff, 0xeb, 0x04, 0xdc, \n\t0x07, 0x8c, 0x02, 0x26, 0x00, 0x38, 0x00, 0x00, 0x01, 0x07, 0x01, 0x56, \n\t0x01, 0x63, 0x01, 0xaa, 0x00, 0x49, 0x00, 0xb2, 0xb0, 0x1b, 0x01, 0x72, \n\t0xb2, 0x2f, 0x1b, 0x01, 0x5d, 0xb2, 0x0f, 0x1b, 0x01, 0x5d, 0xb2, 0x7f, \n\t0x1b, 0x01, 0x5d, 0xb2, 0x00, 0x1b, 0x01, 0x72, 0xb2, 0x70, 0x1b, 0x01, \n\t0x72, 0xb2, 0x50, 0x1b, 0x01, 0x72, 0xb2, 0x70, 0x21, 0x01, 0x72, 0xb2, \n\t0x2f, 0x21, 0x01, 0x5d, 0xb2, 0x0f, 0x21, 0x01, 0x5d, 0xb2, 0x7f, 0x21, \n\t0x01, 0x5d, 0xb2, 0xb0, 0x21, 0x01, 0x72, 0xb2, 0x50, 0x21, 0x01, 0x72, \n\t0xb2, 0x00, 0x21, 0x01, 0x72, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x8b, \n\t0xff, 0xeb, 0x03, 0xfc, 0x06, 0x35, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x56, 0x00, 0xee, 0x00, 0x53, 0x00, 0x83, 0x00, 0xb2, \n\t0xa0, 0x1d, 0x01, 0x5d, 0xb4, 0xe0, 0x1d, 0xf0, 0x1d, 0x02, 0x5d, 0xb2, \n\t0x00, 0x1d, 0x01, 0x72, 0xb4, 0x2f, 0x1d, 0x3f, 0x1d, 0x02, 0x5d, 0xb2, \n\t0x8f, 0x1d, 0x01, 0x71, 0xb2, 0x0f, 0x1d, 0x01, 0x5d, 0xb2, 0x6f, 0x1d, \n\t0x01, 0x71, 0xb2, 0x50, 0x1d, 0x01, 0x72, 0xb2, 0x10, 0x1d, 0x01, 0x71, \n\t0xb2, 0xc0, 0x1d, 0x01, 0x5d, 0xb2, 0x80, 0x1d, 0x01, 0x5d, 0xb2, 0x60, \n\t0x1d, 0x01, 0x5d, 0xb2, 0xa0, 0x23, 0x01, 0x5d, 0xb4, 0xe0, 0x23, 0xf0, \n\t0x23, 0x02, 0x5d, 0xb2, 0x00, 0x23, 0x01, 0x72, 0xb4, 0x2f, 0x23, 0x3f, \n\t0x23, 0x02, 0x5d, 0xb2, 0x8f, 0x23, 0x01, 0x71, 0xb2, 0x0f, 0x23, 0x01, \n\t0x5d, 0xb2, 0x6f, 0x23, 0x01, 0x71, 0xb2, 0x50, 0x23, 0x01, 0x72, 0xb2, \n\t0x10, 0x23, 0x01, 0x71, 0xb2, 0xc0, 0x23, 0x01, 0x5d, 0xb2, 0x80, 0x23, \n\t0x01, 0x5d, 0xb2, 0x60, 0x23, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x93, 0xff, 0xeb, 0x04, 0xdc, 0x07, 0x4b, 0x02, 0x26, \n\t0x00, 0x38, 0x00, 0x00, 0x01, 0x07, 0x01, 0x59, 0x01, 0x69, 0x01, 0x5d, \n\t0x00, 0x1d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1b, 0x2f, 0x1b, 0xb1, \n\t0x1b, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x16, 0x2f, 0x1b, \n\t0xb1, 0x16, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x8b, \n\t0xff, 0xeb, 0x04, 0x3e, 0x05, 0xf4, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x59, 0x00, 0xf4, 0x00, 0x06, 0x00, 0x0d, 0x00, 0xb2, \n\t0xdf, 0x17, 0x01, 0x71, 0xb2, 0xdf, 0x1d, 0x01, 0x71, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x93, 0xfe, 0x50, 0x04, 0xdc, 0x05, 0xb0, 0x02, 0x26, \n\t0x00, 0x38, 0x00, 0x00, 0x00, 0x07, 0x01, 0x57, 0x01, 0xa9, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x8b, 0xfe, 0x50, 0x04, 0x32, 0x04, 0x3a, 0x02, 0x26, \n\t0x00, 0x58, 0x00, 0x00, 0x00, 0x07, 0x01, 0x57, 0x02, 0x5f, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x06, 0xcf, 0x07, 0x48, 0x02, 0x26, \n\t0x00, 0x3a, 0x00, 0x00, 0x01, 0x07, 0x01, 0x52, 0x01, 0xa5, 0x01, 0x5d, \n\t0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1a, 0x2f, 0x1b, 0xb1, \n\t0x1a, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2d, \n\t0x00, 0x00, 0x05, 0xdc, 0x05, 0xf1, 0x02, 0x26, 0x00, 0x5a, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x52, 0x01, 0x28, 0x00, 0x06, 0x00, 0x14, 0x00, 0xb4, \n\t0x2f, 0x1a, 0x3f, 0x1a, 0x02, 0x72, 0xb2, 0x7f, 0x1a, 0x01, 0x72, 0xb2, \n\t0x5f, 0x1a, 0x01, 0x72, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x14, \n\t0x00, 0x00, 0x04, 0xce, 0x07, 0x47, 0x02, 0x26, 0x00, 0x3c, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x52, 0x00, 0x94, 0x01, 0x5c, 0x00, 0x10, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x12, 0x3e, 0x59, \n\t0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1a, 0xfe, 0x4b, 0x03, 0xe8, \n\t0x05, 0xf1, 0x02, 0x26, 0x00, 0x5c, 0x00, 0x00, 0x01, 0x06, 0x01, 0x52, \n\t0x25, 0x06, 0x00, 0x14, 0x00, 0xb4, 0x2f, 0x1a, 0x3f, 0x1a, 0x02, 0x72, \n\t0xb2, 0x7f, 0x1a, 0x01, 0x72, 0xb2, 0x5f, 0x1a, 0x01, 0x72, 0x30, 0x31, \n\t0xff, 0xff, 0x00, 0x14, 0x00, 0x00, 0x04, 0xce, 0x07, 0x0c, 0x02, 0x26, \n\t0x00, 0x3c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x6a, 0x00, 0x6f, 0x01, 0x5c, \n\t0x00, 0x1d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, \n\t0x0d, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, \n\t0xb1, 0x0a, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x61, \n\t0x00, 0x00, 0x04, 0x6d, 0x07, 0x1e, 0x02, 0x26, 0x00, 0x3d, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x76, 0x01, 0x84, 0x01, 0x59, 0x00, 0x15, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x14, 0x3e, 0x59, \n\t0xb2, 0x0f, 0x0a, 0x01, 0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x5e, \n\t0x00, 0x00, 0x03, 0xba, 0x05, 0xc7, 0x02, 0x26, 0x00, 0x5d, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x76, 0x01, 0x2f, 0x00, 0x02, 0x00, 0x25, 0x00, 0xb2, \n\t0xbf, 0x0d, 0x01, 0x71, 0xb6, 0xdf, 0x0d, 0xef, 0x0d, 0xff, 0x0d, 0x03, \n\t0x71, 0x40, 0x11, 0x0f, 0x0d, 0x1f, 0x0d, 0x2f, 0x0d, 0x3f, 0x0d, 0x4f, \n\t0x0d, 0x5f, 0x0d, 0x6f, 0x0d, 0x7f, 0x0d, 0x08, 0x72, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x61, 0x00, 0x00, 0x04, 0x6d, 0x07, 0x0d, 0x02, 0x26, \n\t0x00, 0x3d, 0x00, 0x00, 0x01, 0x07, 0x01, 0x55, 0x01, 0x54, 0x01, 0x5d, \n\t0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, \n\t0x0a, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5e, \n\t0x00, 0x00, 0x03, 0xba, 0x05, 0xb6, 0x02, 0x26, 0x00, 0x5d, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x55, 0x00, 0xff, 0x00, 0x06, 0x00, 0x34, 0x00, 0xb2, \n\t0xbf, 0x0a, 0x01, 0x5d, 0xb6, 0xdf, 0x0b, 0xef, 0x0b, 0xff, 0x0b, 0x03, \n\t0x71, 0x40, 0x11, 0x0f, 0x0b, 0x1f, 0x0b, 0x2f, 0x0b, 0x3f, 0x0b, 0x4f, \n\t0x0b, 0x5f, 0x0b, 0x6f, 0x0b, 0x7f, 0x0b, 0x08, 0x72, 0xb2, 0xdf, 0x0b, \n\t0x01, 0x5d, 0xb2, 0xaf, 0x0b, 0x01, 0x71, 0xb2, 0x8f, 0x0b, 0x01, 0x71, \n\t0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x61, 0x00, 0x00, 0x04, 0x6d, \n\t0x07, 0x49, 0x02, 0x26, 0x00, 0x3d, 0x00, 0x00, 0x01, 0x07, 0x01, 0x53, \n\t0x00, 0x9b, 0x01, 0x5e, 0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x5e, 0x00, 0x00, 0x03, 0xba, 0x05, 0xf2, 0x02, 0x26, \n\t0x00, 0x5d, 0x00, 0x00, 0x01, 0x06, 0x01, 0x53, 0x46, 0x07, 0x00, 0x14, \n\t0x00, 0xb4, 0x2f, 0x0f, 0x3f, 0x0f, 0x02, 0x72, 0xb2, 0x7f, 0x0f, 0x01, \n\t0x72, 0xb2, 0x5f, 0x0f, 0x01, 0x72, 0x30, 0x31, 0x00, 0x01, 0x00, 0x9f, \n\t0x00, 0x00, 0x02, 0x87, 0x06, 0x2d, 0x00, 0x0f, 0x00, 0x22, 0x00, 0xb0, \n\t0x04, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, \n\t0x06, 0x3e, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x0b, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x33, 0x11, 0x34, 0x36, \n\t0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, \n\t0x9f, 0xb6, 0xa2, 0x21, 0x45, 0x2a, 0x18, 0x14, 0x2c, 0x19, 0x57, 0x5b, \n\t0x04, 0xc3, 0xad, 0xbd, 0x0b, 0x0a, 0x91, 0x05, 0x06, 0x6d, 0x62, 0xfb, \n\t0x3d, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xe9, 0xfe, 0x4b, 0x02, 0xc0, \n\t0x06, 0x2d, 0x00, 0x23, 0x00, 0x65, 0x00, 0xb0, 0x17, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x0a, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x22, 0x2f, 0x1b, 0xb1, 0x22, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x08, 0x3e, \n\t0x59, 0xb0, 0x22, 0x10, 0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x05, 0x10, 0xb1, 0x0c, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb0, 0x10, \n\t0xd0, 0xb2, 0x2f, 0x17, 0x01, 0x5d, 0xb0, 0x17, 0x10, 0xb1, 0x1e, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, \n\t0x23, 0x11, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, \n\t0x32, 0x36, 0x35, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x36, 0x33, 0x32, \n\t0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x15, 0x33, 0x02, \n\t0x61, 0xc4, 0xab, 0x9a, 0x20, 0x34, 0x1b, 0x0e, 0x0c, 0x43, 0x12, 0x3c, \n\t0x44, 0xa9, 0xa9, 0xb5, 0xa2, 0x22, 0x45, 0x2a, 0x18, 0x12, 0x33, 0x1b, \n\t0x57, 0x54, 0xc4, 0x03, 0xa8, 0xfb, 0xff, 0xa7, 0xb5, 0x09, 0x09, 0x96, \n\t0x05, 0x08, 0x67, 0x5a, 0x04, 0x01, 0x92, 0x89, 0xad, 0xbd, 0x0b, 0x0a, \n\t0x96, 0x04, 0x06, 0x67, 0x62, 0x89, 0x00, 0x00, 0x00, 0x02, 0x00, 0x6c, \n\t0xff, 0xeb, 0x05, 0xff, 0x06, 0x75, 0x00, 0x17, 0x00, 0x25, 0x00, 0x3e, \n\t0x00, 0xb0, 0x10, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, \n\t0xb1, 0x0a, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, \n\t0x1b, 0xb1, 0x03, 0x06, 0x3e, 0x59, 0xb0, 0x0a, 0x10, 0xb1, 0x1b, 0x03, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, \n\t0xb1, 0x22, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x01, 0x10, 0x00, 0x21, 0x22, 0x00, 0x11, 0x11, 0x10, 0x00, \n\t0x33, 0x32, 0x16, 0x17, 0x36, 0x36, 0x35, 0x33, 0x14, 0x06, 0x07, 0x16, \n\t0x16, 0x15, 0x27, 0x34, 0x02, 0x23, 0x22, 0x02, 0x15, 0x11, 0x14, 0x12, \n\t0x33, 0x32, 0x36, 0x35, 0x04, 0xfd, 0xfe, 0xb5, 0xfe, 0xf8, 0xff, 0xfe, \n\t0xc1, 0x01, 0x3f, 0xff, 0x78, 0xce, 0x4f, 0x7b, 0x80, 0xc5, 0xb0, 0xa2, \n\t0x26, 0x2a, 0xc5, 0xd8, 0xb6, 0xac, 0xcd, 0xcd, 0xac, 0xb7, 0xd7, 0x02, \n\t0x56, 0xfe, 0xf5, 0xfe, 0xa0, 0x01, 0x60, 0x01, 0x0b, 0x01, 0x03, 0x01, \n\t0x0a, 0x01, 0x62, 0x50, 0x49, 0x0b, 0xab, 0x93, 0xc0, 0xf3, 0x24, 0x47, \n\t0xa6, 0x58, 0x02, 0xc8, 0x01, 0x00, 0xff, 0x00, 0xc8, 0xfe, 0xfb, 0xca, \n\t0xff, 0x00, 0xff, 0xcb, 0x00, 0x02, 0x00, 0x61, 0xff, 0xeb, 0x04, 0xe8, \n\t0x04, 0xc7, 0x00, 0x17, 0x00, 0x25, 0x00, 0x3b, 0x00, 0xb0, 0x09, 0x2f, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x14, 0x2f, 0x1b, 0xb1, 0x14, 0x06, \n\t0x3e, 0x59, 0xb1, 0x1b, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x22, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x13, 0x34, 0x00, 0x33, 0x32, \n\t0x16, 0x17, 0x36, 0x36, 0x35, 0x33, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, \n\t0x15, 0x14, 0x00, 0x23, 0x22, 0x00, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, \n\t0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x61, 0x01, 0x04, \n\t0xdf, 0x66, 0xaa, 0x40, 0x52, 0x50, 0xb2, 0x85, 0x81, 0x23, 0x25, 0xfe, \n\t0xfc, 0xe0, 0xe0, 0xfe, 0xfb, 0xc5, 0x91, 0x8f, 0x8d, 0x92, 0x93, 0x8e, \n\t0x8d, 0x91, 0x02, 0x27, 0xf0, 0x01, 0x37, 0x46, 0x3f, 0x12, 0x84, 0x68, \n\t0x8f, 0xbc, 0x20, 0x42, 0x9d, 0x56, 0x16, 0xf2, 0xfe, 0xcc, 0x01, 0x35, \n\t0xf1, 0xac, 0xe0, 0xe0, 0xac, 0x16, 0xaa, 0xe2, 0xe2, 0xaa, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x93, 0xff, 0xeb, 0x06, 0x57, 0x06, 0x37, 0x00, 0x1b, \n\t0x00, 0x45, 0x00, 0xb0, 0x05, 0x2f, 0xb0, 0x02, 0x2f, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x13, 0x2f, 0x1b, 0xb1, 0x13, 0x0c, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x06, 0x3e, 0x59, 0xb0, \n\t0x02, 0x10, 0xb0, 0x0a, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, \n\t0xb0, 0x0e, 0x10, 0xb1, 0x17, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x13, 0x10, 0xb0, 0x1b, 0xd0, 0x30, 0x31, 0x01, \n\t0x15, 0x17, 0x36, 0x36, 0x35, 0x33, 0x17, 0x16, 0x06, 0x07, 0x11, 0x14, \n\t0x04, 0x23, 0x22, 0x24, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, \n\t0x36, 0x35, 0x11, 0x04, 0xdc, 0x06, 0x56, 0x5c, 0xbe, 0x03, 0x02, 0xc4, \n\t0xb7, 0xfe, 0xcb, 0xf9, 0xf0, 0xfe, 0xd5, 0xc5, 0xbc, 0x9a, 0xa2, 0xc7, \n\t0x05, 0xb0, 0xb2, 0x02, 0x1b, 0xa3, 0x7d, 0x05, 0xc1, 0xf3, 0x22, 0xfd, \n\t0x79, 0xee, 0xfc, 0xfd, 0xed, 0x03, 0xdb, 0xfc, 0x25, 0xa5, 0xab, 0xab, \n\t0xa5, 0x03, 0xdb, 0x00, 0x00, 0x01, 0x00, 0x8b, 0xff, 0xeb, 0x05, 0x6a, \n\t0x04, 0xcb, 0x00, 0x1d, 0x00, 0x5b, 0x00, 0xb0, 0x1a, 0x2f, 0xb0, 0x1d, \n\t0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x17, 0x2f, 0x1b, 0xb1, 0x17, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, \n\t0x0a, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, \n\t0xb1, 0x06, 0x06, 0x3e, 0x59, 0xb0, 0x1a, 0x10, 0xb1, 0x04, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0a, 0x10, 0xb1, \n\t0x13, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, \n\t0x31, 0x01, 0x17, 0x16, 0x06, 0x07, 0x11, 0x23, 0x27, 0x06, 0x06, 0x23, \n\t0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, \n\t0x11, 0x33, 0x15, 0x17, 0x36, 0x36, 0x35, 0x05, 0x64, 0x03, 0x03, 0xb1, \n\t0xbd, 0xb1, 0x0d, 0x33, 0xa0, 0x69, 0xb1, 0xc6, 0xc5, 0x66, 0x6c, 0x69, \n\t0x89, 0x23, 0xc5, 0x06, 0x64, 0x55, 0x04, 0xcb, 0x06, 0xb1, 0xc0, 0x0e, \n\t0xfc, 0xba, 0xa0, 0x57, 0x5e, 0xe2, 0xef, 0x02, 0x7e, 0xfd, 0x80, 0xad, \n\t0x82, 0x55, 0x4e, 0x03, 0x0c, 0x72, 0x02, 0x07, 0x80, 0x7e, 0x00, 0x00, \n\t0xff, 0xff, 0xff, 0xbc, 0xfe, 0x4b, 0x02, 0x4c, 0x05, 0xe0, 0x02, 0x26, \n\t0x01, 0x50, 0x00, 0x00, 0x01, 0x07, 0x01, 0x53, 0xff, 0x4a, 0xff, 0xf5, \n\t0x00, 0x14, 0x00, 0xb4, 0x2f, 0x15, 0x3f, 0x15, 0x02, 0x72, 0xb2, 0x7f, \n\t0x15, 0x01, 0x72, 0xb2, 0x5f, 0x15, 0x01, 0x72, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x14, 0x00, 0x00, 0x05, 0x1a, 0x08, 0x25, 0x02, 0x26, \n\t0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x03, 0xad, 0x01, 0x4c, 0x01, 0xb3, \n\t0x00, 0x53, 0x00, 0xb0, 0x1a, 0x2f, 0xb0, 0x0c, 0x2f, 0xb4, 0x4f, 0x0c, \n\t0x5f, 0x0c, 0x02, 0x71, 0xb2, 0x3f, 0x0c, 0x01, 0x72, 0xb2, 0x8f, 0x0c, \n\t0x01, 0x71, 0xb2, 0xaf, 0x1a, 0x01, 0x5d, 0xb2, 0xef, 0x1a, 0x01, 0x5d, \n\t0xb4, 0x4f, 0x1a, 0x5f, 0x1a, 0x02, 0x71, 0xb2, 0x3f, 0x1a, 0x01, 0x72, \n\t0xb2, 0x8f, 0x1a, 0x01, 0x71, 0xb2, 0x0f, 0x1a, 0x01, 0x71, 0xb2, 0xcf, \n\t0x1a, 0x01, 0x5d, 0xb4, 0x6f, 0x1a, 0x7f, 0x1a, 0x02, 0x5d, 0xb4, 0x1f, \n\t0x1a, 0x2f, 0x1a, 0x02, 0x5d, 0xb0, 0x1a, 0x10, 0xb0, 0x20, 0xd0, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6a, 0xff, 0xeb, 0x03, 0xf3, \n\t0x06, 0xe3, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x00, 0x07, 0x03, 0xad, \n\t0x00, 0xe4, 0x00, 0x71, 0xff, 0xff, 0xff, 0xec, 0x00, 0x00, 0x07, 0x61, \n\t0x07, 0x1e, 0x02, 0x26, 0x00, 0x88, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, \n\t0x02, 0xca, 0x01, 0x59, 0x00, 0x15, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x14, 0x2f, 0x1b, 0xb1, 0x14, 0x14, 0x3e, 0x59, 0xb2, 0x0f, 0x14, 0x01, \n\t0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x3a, 0xff, 0xeb, 0x06, 0x7c, \n\t0x05, 0xdd, 0x02, 0x26, 0x00, 0xa8, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, \n\t0x02, 0x7e, 0x00, 0x18, 0x00, 0x16, 0x00, 0xb2, 0xbf, 0x46, 0x01, 0x71, \n\t0xb6, 0xdf, 0x46, 0xef, 0x46, 0xff, 0x46, 0x03, 0x71, 0xb2, 0x0f, 0x46, \n\t0x01, 0x72, 0x30, 0x31, 0xff, 0xff, 0x00, 0x71, 0xff, 0xa2, 0x05, 0x02, \n\t0x07, 0x5c, 0x02, 0x26, 0x00, 0x9a, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, \n\t0x01, 0xdd, 0x01, 0x97, 0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x36, 0x2f, 0x1b, 0xb1, 0x36, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x61, 0xff, 0x79, 0x04, 0x2a, 0x05, 0xdb, 0x02, 0x26, \n\t0x00, 0xba, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, 0x01, 0x3e, 0x00, 0x16, \n\t0x00, 0x1f, 0x00, 0xb2, 0xbf, 0x35, 0x01, 0x71, 0xb6, 0xdf, 0x35, 0xef, \n\t0x35, 0xff, 0x35, 0x03, 0x71, 0x40, 0x0b, 0x0f, 0x35, 0x1f, 0x35, 0x2f, \n\t0x35, 0x3f, 0x35, 0x4f, 0x35, 0x05, 0x72, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x61, 0xfe, 0x11, 0x04, 0x92, 0x05, 0xc5, 0x02, 0x26, \n\t0x00, 0x36, 0x00, 0x00, 0x00, 0x07, 0x03, 0x63, 0x01, 0x6c, 0xfe, 0x97, \n\t0xff, 0xff, 0x00, 0x67, 0xfe, 0x12, 0x03, 0xc9, 0x04, 0x4e, 0x02, 0x26, \n\t0x00, 0x56, 0x00, 0x00, 0x00, 0x07, 0x03, 0x63, 0x01, 0x1e, 0xfe, 0x98, \n\t0x00, 0x01, 0xff, 0xbc, 0xfe, 0x4b, 0x01, 0x70, 0x04, 0x3a, 0x00, 0x0f, \n\t0x00, 0x29, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, \n\t0x00, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, \n\t0xb1, 0x04, 0x08, 0x3e, 0x59, 0xb1, 0x0b, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x11, 0x14, 0x06, 0x23, \n\t0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x01, \n\t0x70, 0xac, 0x99, 0x1f, 0x33, 0x1d, 0x0e, 0x0e, 0x41, 0x12, 0x3b, 0x45, \n\t0x04, 0x3a, 0xfb, 0x6d, 0xa7, 0xb5, 0x09, 0x09, 0x96, 0x05, 0x08, 0x67, \n\t0x5a, 0x04, 0x93, 0x00, 0xff, 0xff, 0x00, 0x50, 0x03, 0xfd, 0x01, 0x51, \n\t0x06, 0x18, 0x03, 0x06, 0x03, 0x35, 0x00, 0x00, 0x00, 0x06, 0x00, 0xb0, \n\t0x04, 0x2f, 0x30, 0x31, 0x00, 0x01, 0x00, 0xab, 0x04, 0xe4, 0x03, 0x11, \n\t0x05, 0xeb, 0x00, 0x08, 0x00, 0x49, 0x00, 0xb0, 0x04, 0x2f, 0xb2, 0x8f, \n\t0x04, 0x01, 0x71, 0xb2, 0xff, 0x04, 0x01, 0x71, 0xb2, 0xaf, 0x04, 0x01, \n\t0x71, 0xb2, 0xdf, 0x04, 0x01, 0x5d, 0xb2, 0x3f, 0x04, 0x01, 0x5d, 0xb0, \n\t0x02, 0xd0, 0xb0, 0x04, 0x10, 0xb0, 0x07, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, \n\t0x1b, 0xdc, 0x59, 0xb2, 0xaf, 0x07, 0x01, 0x5d, 0xb6, 0x0f, 0x07, 0x1f, \n\t0x07, 0x2f, 0x07, 0x03, 0x5d, 0xb2, 0x2f, 0x07, 0x01, 0x71, 0xb2, 0x03, \n\t0x04, 0x07, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x15, 0x23, 0x27, 0x07, \n\t0x23, 0x35, 0x37, 0x33, 0x03, 0x11, 0xa1, 0x93, 0x92, 0xa0, 0xf6, 0x78, \n\t0x04, 0xfd, 0x19, 0x94, 0x94, 0x1a, 0xed, 0x00, 0x00, 0x01, 0x00, 0x8c, \n\t0x04, 0xe4, 0x03, 0x02, 0x05, 0xeb, 0x00, 0x08, 0x00, 0x46, 0x00, 0xb0, \n\t0x04, 0x2f, 0xb2, 0x8f, 0x04, 0x01, 0x71, 0xb2, 0xff, 0x04, 0x01, 0x71, \n\t0xb2, 0xaf, 0x04, 0x01, 0x71, 0xb2, 0xdf, 0x04, 0x01, 0x5d, 0xb2, 0x3f, \n\t0x04, 0x01, 0x5d, 0xb0, 0x08, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, \n\t0x59, 0xb2, 0x2f, 0x08, 0x01, 0x71, 0xb2, 0xaf, 0x08, 0x01, 0x5d, 0xb6, \n\t0x0f, 0x08, 0x1f, 0x08, 0x2f, 0x08, 0x03, 0x5d, 0xb2, 0x00, 0x04, 0x08, \n\t0x11, 0x12, 0x39, 0xb0, 0x01, 0xd0, 0x30, 0x31, 0x01, 0x37, 0x33, 0x15, \n\t0x05, 0x23, 0x27, 0x35, 0x33, 0x01, 0xc5, 0x93, 0xaa, 0xfe, 0xff, 0x77, \n\t0xfe, 0xa6, 0x05, 0x57, 0x94, 0x12, 0xf5, 0xf3, 0x14, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x81, 0x04, 0xa4, 0x02, 0xd8, 0x05, 0xb0, 0x00, 0x0f, \n\t0x00, 0x47, 0x00, 0xb0, 0x04, 0x2f, 0xb2, 0x2f, 0x04, 0x01, 0x5d, 0xb2, \n\t0x9f, 0x04, 0x01, 0x5d, 0xb2, 0x7f, 0x04, 0x01, 0x5d, 0xb2, 0x0f, 0x04, \n\t0x01, 0x5d, 0xb2, 0x40, 0x04, 0x01, 0x5d, 0xb0, 0x0c, 0xb0, 0x0a, 0x2b, \n\t0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb2, 0xff, 0x0c, 0x01, 0x5d, 0xb2, 0x0f, \n\t0x0c, 0x01, 0x71, 0xb0, 0x09, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, \n\t0x59, 0xb4, 0xaf, 0x09, 0xbf, 0x09, 0x02, 0x5d, 0xb0, 0x0f, 0xd0, 0x30, \n\t0x31, 0x01, 0x17, 0x16, 0x06, 0x23, 0x22, 0x26, 0x37, 0x37, 0x33, 0x14, \n\t0x16, 0x33, 0x32, 0x36, 0x35, 0x02, 0xd2, 0x02, 0x04, 0xa2, 0x89, 0x8a, \n\t0xa2, 0x05, 0x02, 0x97, 0x44, 0x4a, 0x48, 0x46, 0x05, 0xb0, 0x06, 0x74, \n\t0x92, 0x92, 0x74, 0x06, 0x42, 0x52, 0x53, 0x41, 0x00, 0x01, 0x00, 0xa0, \n\t0x04, 0xe7, 0x01, 0x7a, 0x05, 0xb0, 0x00, 0x03, 0x00, 0x17, 0x00, 0xb0, \n\t0x01, 0x2f, 0xb2, 0x3f, 0x01, 0x01, 0x5d, 0xb1, 0x02, 0x04, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x23, 0x35, \n\t0x33, 0x01, 0x7a, 0xda, 0xda, 0x04, 0xe7, 0xc9, 0x00, 0x02, 0x00, 0x85, \n\t0x04, 0x5a, 0x02, 0x22, 0x05, 0xe2, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x38, \n\t0x00, 0x7c, 0xb0, 0x09, 0x2f, 0x18, 0xb2, 0x40, 0x09, 0x01, 0x5d, 0xb0, \n\t0x03, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb4, 0x3f, 0x03, \n\t0x4f, 0x03, 0x02, 0x5d, 0xb0, 0x09, 0x10, 0xb0, 0x0f, 0xb0, 0x0a, 0x2b, \n\t0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x03, 0x10, 0xb0, 0x15, 0xb0, 0x0a, \n\t0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, 0x13, 0x34, 0x36, 0x33, \n\t0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x37, 0x14, 0x16, 0x33, \n\t0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x85, 0x79, 0x57, 0x55, \n\t0x78, 0x77, 0x56, 0x57, 0x79, 0x67, 0x3e, 0x2b, 0x2a, 0x3c, 0x3c, 0x2a, \n\t0x2b, 0x3e, 0x05, 0x1c, 0x54, 0x72, 0x71, 0x55, 0x56, 0x6c, 0x6c, 0x56, \n\t0x2b, 0x3d, 0x3b, 0x2d, 0x2d, 0x3e, 0x3e, 0x00, 0x00, 0x01, 0x00, 0x44, \n\t0xfe, 0x50, 0x01, 0xd3, 0x00, 0x39, 0x00, 0x13, 0x00, 0x29, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x08, 0x3e, 0x59, \n\t0xb1, 0x06, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x0d, 0x10, 0xb0, 0x13, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, \n\t0x59, 0x30, 0x31, 0x21, 0x06, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, \n\t0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x01, \n\t0x84, 0x46, 0x4f, 0x2d, 0x33, 0x1b, 0x2e, 0x1a, 0x21, 0x24, 0x57, 0x3c, \n\t0x5f, 0x79, 0x79, 0x7f, 0x34, 0x5f, 0x36, 0x2a, 0x30, 0x0f, 0x0b, 0x7b, \n\t0x13, 0x19, 0x6e, 0x63, 0x50, 0x90, 0x38, 0x00, 0x00, 0x01, 0x00, 0x87, \n\t0x04, 0xe1, 0x03, 0x3d, 0x05, 0xf3, 0x00, 0x13, 0x00, 0x4e, 0x00, 0xb0, \n\t0x03, 0x2f, 0xb2, 0x6f, 0x03, 0x01, 0x71, 0xb2, 0x3f, 0x03, 0x01, 0x5d, \n\t0xb2, 0xbf, 0x03, 0x01, 0x5d, 0xb2, 0x80, 0x03, 0x01, 0x5d, 0xb0, 0x06, \n\t0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x03, 0x10, 0xb0, \n\t0x09, 0xd0, 0xb0, 0x06, 0x10, 0xb1, 0x0d, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x10, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0d, 0x10, 0xb0, \n\t0x13, 0xd0, 0x30, 0x31, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x23, 0x22, \n\t0x06, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x36, 0x35, \n\t0x03, 0x3d, 0x77, 0x5a, 0x47, 0x9a, 0x33, 0x2b, 0x3a, 0x6c, 0x76, 0x5b, \n\t0x38, 0xa8, 0x34, 0x29, 0x3c, 0x05, 0xd3, 0x5e, 0x82, 0x5d, 0x41, 0x2e, \n\t0x1a, 0x5d, 0x89, 0x5e, 0x41, 0x2f, 0x00, 0x00, 0x00, 0x02, 0x00, 0x64, \n\t0x04, 0xe4, 0x03, 0x4a, 0x05, 0xee, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x3b, \n\t0x00, 0xb0, 0x03, 0x2f, 0xb2, 0x3f, 0x03, 0x01, 0x5d, 0xb2, 0x6f, 0x03, \n\t0x01, 0x5d, 0xb2, 0x1f, 0x03, 0x01, 0x5d, 0xb2, 0x8f, 0x03, 0x01, 0x5d, \n\t0xb0, 0x00, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb2, 0xaf, \n\t0x00, 0x01, 0x5d, 0xb6, 0x0f, 0x00, 0x1f, 0x00, 0x2f, 0x00, 0x03, 0x5d, \n\t0xb0, 0x06, 0xd0, 0xb0, 0x03, 0x10, 0xb0, 0x09, 0xd0, 0x30, 0x31, 0x01, \n\t0x33, 0x17, 0x01, 0x23, 0x27, 0x03, 0x33, 0x17, 0x03, 0x23, 0x02, 0x62, \n\t0xe5, 0x03, 0xfe, 0xd4, 0xab, 0x02, 0x55, 0xd3, 0x02, 0xf0, 0x9d, 0x05, \n\t0xee, 0x06, 0xfe, 0xfc, 0x05, 0x01, 0x05, 0x05, 0xfe, 0xfb, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0xb6, 0xfe, 0x85, 0x01, 0xec, 0xff, 0xac, 0x00, 0x0b, \n\t0x00, 0x17, 0x00, 0x31, 0x00, 0xb0, 0x18, 0x2f, 0xb0, 0x03, 0xb0, 0x0a, \n\t0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x0f, 0xb0, 0x0a, 0x2b, 0x58, \n\t0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x09, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, \n\t0xdc, 0x59, 0xb0, 0x03, 0x10, 0xb0, 0x15, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, \n\t0x1b, 0xdc, 0x59, 0x30, 0x31, 0x17, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, \n\t0x14, 0x06, 0x23, 0x22, 0x26, 0x37, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, \n\t0x34, 0x26, 0x23, 0x22, 0x06, 0xb6, 0x5b, 0x42, 0x3f, 0x5a, 0x59, 0x40, \n\t0x42, 0x5b, 0x59, 0x28, 0x1c, 0x1a, 0x26, 0x26, 0x1a, 0x1c, 0x28, 0xea, \n\t0x41, 0x55, 0x55, 0x41, 0x3f, 0x52, 0x52, 0x3f, 0x1a, 0x26, 0x25, 0x1b, \n\t0x1e, 0x27, 0x28, 0x00, 0x00, 0x01, 0xfc, 0xd1, 0x04, 0xba, 0xfe, 0x04, \n\t0x06, 0x16, 0x00, 0x03, 0x00, 0x10, 0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x03, \n\t0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, 0x01, 0x23, \n\t0x03, 0x33, 0xfe, 0x04, 0x83, 0xb0, 0xba, 0x04, 0xba, 0x01, 0x5c, 0x00, \n\t0x00, 0x01, 0xfd, 0x6f, 0x04, 0xba, 0xfe, 0xa4, 0x06, 0x17, 0x00, 0x03, \n\t0x00, 0x10, 0x00, 0xb0, 0x03, 0x2f, 0xb0, 0x00, 0xb0, 0x0a, 0x2b, 0x58, \n\t0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, 0x01, 0x33, 0x03, 0x23, 0xfd, 0xee, \n\t0xb6, 0xbc, 0x79, 0x06, 0x17, 0xfe, 0xa3, 0x00, 0xff, 0xff, 0xfc, 0x8d, \n\t0x04, 0xe1, 0xff, 0x43, 0x05, 0xf3, 0x00, 0x07, 0x01, 0x58, 0xfc, 0x06, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfd, 0x5b, 0x04, 0xda, 0xfe, 0x93, \n\t0x06, 0x76, 0x00, 0x0f, 0x00, 0x33, 0x00, 0x7c, 0xb0, 0x00, 0x2f, 0x18, \n\t0xb0, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x07, \n\t0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x08, 0xb0, 0x0a, \n\t0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x01, 0x10, 0xb0, 0x0e, 0xb0, \n\t0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, 0x01, 0x27, 0x36, \n\t0x36, 0x35, 0x34, 0x26, 0x23, 0x37, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, \n\t0x07, 0xfd, 0x6f, 0x01, 0x4c, 0x41, 0x57, 0x49, 0x07, 0x93, 0x9e, 0x56, \n\t0x41, 0x01, 0x04, 0xda, 0x9a, 0x04, 0x20, 0x25, 0x27, 0x26, 0x6c, 0x67, \n\t0x56, 0x46, 0x49, 0x09, 0x47, 0x00, 0x00, 0x00, 0x00, 0x02, 0xfc, 0x2c, \n\t0x04, 0xe4, 0xff, 0x12, 0x05, 0xee, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x22, \n\t0x00, 0xb0, 0x06, 0x2f, 0xb0, 0x02, 0xd0, 0xb0, 0x06, 0x10, 0xb0, 0x0a, \n\t0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb6, 0x0f, 0x0a, 0x1f, \n\t0x0a, 0x2f, 0x0a, 0x03, 0x5d, 0xb0, 0x05, 0xd0, 0x30, 0x31, 0x01, 0x07, \n\t0x23, 0x01, 0x37, 0x33, 0x01, 0x23, 0x03, 0x37, 0x33, 0xfe, 0x05, 0x02, \n\t0xab, 0xfe, 0xd4, 0x03, 0xe5, 0x01, 0xfe, 0x9d, 0xf1, 0x02, 0xd4, 0x04, \n\t0xe9, 0x05, 0x01, 0x04, 0x06, 0xfe, 0xf6, 0x01, 0x05, 0x05, 0x00, 0x00, \n\t0x00, 0x01, 0xfd, 0x3c, 0xfe, 0xaf, 0xfe, 0x16, 0xff, 0x77, 0x00, 0x03, \n\t0x00, 0x1c, 0x00, 0xb0, 0x04, 0x2f, 0xb0, 0x03, 0xb0, 0x0a, 0x2b, 0x58, \n\t0xd8, 0x1b, 0xdc, 0x59, 0xb1, 0x00, 0x04, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x23, 0x35, 0x33, 0xfe, 0x16, \n\t0xda, 0xda, 0xfe, 0xaf, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc3, \n\t0x04, 0xf6, 0x01, 0xd0, 0x06, 0x72, 0x00, 0x03, 0x00, 0x1a, 0x00, 0xb0, \n\t0x00, 0x2f, 0xb2, 0x0f, 0x00, 0x01, 0x5d, 0xb2, 0x5f, 0x00, 0x01, 0x5d, \n\t0xb0, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, \n\t0x01, 0x33, 0x03, 0x23, 0x01, 0x00, 0xd0, 0xaf, 0x5e, 0x06, 0x72, 0xfe, \n\t0x84, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xa1, 0x04, 0xe8, 0x03, 0x65, \n\t0x06, 0xc2, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x27, 0x00, 0x7c, \n\t0xb0, 0x05, 0x2f, 0x18, 0xb0, 0x01, 0xd0, 0xb1, 0x02, 0x04, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x07, 0xd0, 0xb0, 0x0b, \n\t0xd0, 0xb0, 0x08, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0x30, \n\t0x31, 0x01, 0x23, 0x35, 0x33, 0x05, 0x23, 0x35, 0x33, 0x13, 0x33, 0x03, \n\t0x23, 0x03, 0x65, 0xc7, 0xc7, 0xfe, 0x02, 0xc6, 0xc6, 0x8a, 0xda, 0x7f, \n\t0x8e, 0x04, 0xe8, 0xc8, 0xc8, 0xc8, 0x01, 0x12, 0xfe, 0xfa, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x14, 0x00, 0x00, 0x05, 0x1a, 0x06, 0x72, 0x02, 0x26, \n\t0x00, 0x24, 0x00, 0x00, 0x00, 0x06, 0x01, 0x61, 0x2e, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0xa1, 0x02, 0x70, 0x01, 0x67, 0x03, 0x44, 0x01, 0x06, \n\t0x00, 0x79, 0x00, 0x00, 0x00, 0x06, 0x00, 0xb0, 0x02, 0x2f, 0x30, 0x31, \n\t0xff, 0xff, 0xff, 0xe3, 0x00, 0x00, 0x04, 0xde, 0x06, 0x74, 0x00, 0x26, \n\t0x00, 0x28, 0x64, 0x00, 0x00, 0x07, 0x01, 0x61, 0xff, 0x20, 0x00, 0x02, \n\t0xff, 0xff, 0x00, 0x14, 0x00, 0x00, 0x05, 0x65, 0x06, 0x74, 0x00, 0x26, \n\t0x00, 0x2b, 0x64, 0x00, 0x00, 0x07, 0x01, 0x61, 0xff, 0x51, 0x00, 0x02, \n\t0xff, 0xff, 0x00, 0x18, 0x00, 0x00, 0x01, 0xe8, 0x06, 0x73, 0x00, 0x26, \n\t0x00, 0x2c, 0x64, 0x00, 0x00, 0x07, 0x01, 0x61, 0xff, 0x55, 0x00, 0x01, \n\t0xff, 0xff, 0x00, 0x44, 0xff, 0xeb, 0x05, 0x16, 0x06, 0x72, 0x00, 0x26, \n\t0x00, 0x32, 0x14, 0x00, 0x00, 0x06, 0x01, 0x61, 0x81, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0xff, 0x81, 0x00, 0x00, 0x05, 0x32, 0x06, 0x72, 0x00, 0x26, \n\t0x00, 0x3c, 0x64, 0x00, 0x00, 0x07, 0x01, 0x61, 0xfe, 0xbe, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x3d, 0x00, 0x00, 0x04, 0xe4, 0x06, 0x72, 0x00, 0x26, \n\t0x01, 0x83, 0x14, 0x00, 0x00, 0x07, 0x01, 0x61, 0xff, 0x7a, 0x00, 0x00, \n\t0xff, 0xff, 0xff, 0xcd, 0xff, 0xeb, 0x02, 0x91, 0x06, 0x7a, 0x02, 0x26, \n\t0x01, 0x93, 0x00, 0x00, 0x00, 0x07, 0x01, 0x62, 0xff, 0x2c, 0xff, 0xb8, \n\t0xff, 0xff, 0x00, 0x14, 0x00, 0x00, 0x05, 0x1a, 0x05, 0xb0, 0x02, 0x06, \n\t0x00, 0x24, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xaf, \n\t0x05, 0xb0, 0x02, 0x06, 0x00, 0x25, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, \n\t0x00, 0x00, 0x04, 0x31, 0x05, 0xb0, 0x00, 0x05, 0x00, 0x2c, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x06, 0x3e, \n\t0x59, 0xb0, 0x04, 0x10, 0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x11, 0x23, 0x11, 0x21, \n\t0x04, 0x31, 0xfd, 0x48, 0xc5, 0x03, 0x7d, 0x05, 0x15, 0xfa, 0xeb, 0x05, \n\t0xb0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1e, 0x00, 0x00, 0x05, 0x70, \n\t0x05, 0xb0, 0x00, 0x03, 0x00, 0x07, 0x00, 0x42, 0x00, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x06, 0x3e, 0x59, 0xb1, \n\t0x04, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x00, 0x10, 0xb0, 0x06, 0xd0, 0xb4, 0x8f, 0x06, 0x9f, 0x06, 0x02, 0x5d, \n\t0xb2, 0x7d, 0x06, 0x01, 0x5d, 0xb4, 0x5b, 0x06, 0x6b, 0x06, 0x02, 0x5d, \n\t0x30, 0x31, 0x01, 0x33, 0x01, 0x21, 0x25, 0x21, 0x01, 0x23, 0x02, 0x87, \n\t0xa9, 0x02, 0x40, 0xfa, 0xae, 0x01, 0x08, 0x03, 0x46, 0xfe, 0x70, 0x06, \n\t0x05, 0xb0, 0xfa, 0x50, 0x9a, 0x04, 0x1a, 0x00, 0xff, 0xff, 0x00, 0xb4, \n\t0x00, 0x00, 0x04, 0x7a, 0x05, 0xb0, 0x02, 0x06, 0x00, 0x28, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x61, 0x00, 0x00, 0x04, 0x6d, 0x05, 0xb0, 0x02, 0x06, \n\t0x00, 0x3d, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x01, \n\t0x05, 0xb0, 0x02, 0x06, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x71, \n\t0xff, 0xeb, 0x05, 0x02, 0x05, 0xc5, 0x00, 0x03, 0x00, 0x11, 0x00, 0x1f, \n\t0x00, 0x70, 0x00, 0xb0, 0x02, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, \n\t0x2f, 0x1b, 0xb1, 0x0e, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x06, 0x3e, 0x59, 0xb2, 0xcf, 0x02, 0x01, \n\t0x5d, 0xb2, 0x1f, 0x02, 0x01, 0x71, 0xb2, 0xef, 0x02, 0x01, 0x71, 0xb2, \n\t0xbf, 0x02, 0x01, 0x71, 0xb2, 0xef, 0x02, 0x01, 0x5d, 0xb2, 0x7f, 0x02, \n\t0x01, 0x5d, 0xb2, 0x2f, 0x02, 0x01, 0x5d, 0xb0, 0x02, 0x10, 0xb1, 0x00, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0e, \n\t0x10, 0xb1, 0x15, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x07, 0x10, 0xb1, 0x1c, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x35, 0x21, 0x05, 0x10, \n\t0x00, 0x21, 0x22, 0x00, 0x11, 0x11, 0x10, 0x00, 0x33, 0x20, 0x00, 0x11, \n\t0x27, 0x34, 0x02, 0x23, 0x22, 0x02, 0x15, 0x11, 0x14, 0x12, 0x33, 0x32, \n\t0x36, 0x35, 0x03, 0xbf, 0xfe, 0x03, 0x01, 0xfd, 0x01, 0x43, 0xfe, 0xb5, \n\t0xfe, 0xf8, 0xff, 0xfe, 0xc1, 0x01, 0x3f, 0xff, 0x01, 0x08, 0x01, 0x4b, \n\t0xc5, 0xd8, 0xb6, 0xac, 0xcd, 0xcd, 0xac, 0xb7, 0xd7, 0x02, 0x93, 0x9a, \n\t0xd7, 0xfe, 0xf5, 0xfe, 0xa0, 0x01, 0x60, 0x01, 0x0b, 0x01, 0x03, 0x01, \n\t0x0a, 0x01, 0x62, 0xfe, 0x9f, 0xfe, 0xf5, 0x02, 0xc8, 0x01, 0x00, 0xff, \n\t0x00, 0xc8, 0xfe, 0xfb, 0xca, 0xff, 0x00, 0xff, 0xcb, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0xbe, 0x00, 0x00, 0x01, 0x84, 0x05, 0xb0, 0x02, 0x06, \n\t0x00, 0x2c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x20, \n\t0x05, 0xb0, 0x02, 0x06, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x31, \n\t0x00, 0x00, 0x05, 0x07, 0x05, 0xb0, 0x00, 0x07, 0x00, 0x45, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x06, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x06, \n\t0x3e, 0x59, 0xb0, 0x04, 0x10, 0xb0, 0x00, 0xd0, 0xb2, 0x9f, 0x00, 0x01, \n\t0x5d, 0x40, 0x0d, 0x3d, 0x00, 0x4d, 0x00, 0x5d, 0x00, 0x6d, 0x00, 0x7d, \n\t0x00, 0x8d, 0x00, 0x06, 0x5d, 0x30, 0x31, 0x01, 0x23, 0x01, 0x23, 0x01, \n\t0x33, 0x01, 0x23, 0x02, 0x9f, 0x06, 0xfe, 0x61, 0xc9, 0x02, 0x16, 0xaa, \n\t0x02, 0x16, 0xc9, 0x04, 0x93, 0xfb, 0x6d, 0x05, 0xb0, 0xfa, 0x50, 0x00, \n\t0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x06, 0x52, 0x05, 0xb0, 0x02, 0x06, \n\t0x00, 0x30, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x01, \n\t0x05, 0xb0, 0x02, 0x06, 0x00, 0x31, 0x00, 0x00, 0x00, 0x03, 0x00, 0x7b, \n\t0x00, 0x00, 0x04, 0x24, 0x05, 0xb0, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, \n\t0x00, 0x59, 0x00, 0xb0, 0x04, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, \n\t0x2f, 0x1b, 0xb1, 0x08, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x06, 0x3e, 0x59, 0xb1, 0x00, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0xef, 0x04, 0x01, \n\t0x5d, 0xb2, 0x2f, 0x04, 0x01, 0x5d, 0xb2, 0x70, 0x04, 0x01, 0x72, 0xb0, \n\t0x04, 0x10, 0xb1, 0x07, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x08, 0x10, 0xb1, 0x0a, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x37, 0x21, 0x15, 0x21, 0x13, \n\t0x21, 0x15, 0x21, 0x03, 0x21, 0x15, 0x21, 0x7b, 0x03, 0xa9, 0xfc, 0x57, \n\t0x53, 0x02, 0xf9, 0xfd, 0x07, 0x52, 0x03, 0x9c, 0xfc, 0x64, 0x9a, 0x9a, \n\t0x03, 0x41, 0x9b, 0x03, 0x0a, 0x9b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x71, \n\t0xff, 0xeb, 0x05, 0x02, 0x05, 0xc5, 0x02, 0x06, 0x00, 0x32, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x03, 0x05, 0xb0, 0x00, 0x07, \n\t0x00, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, \n\t0x06, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, \n\t0xb1, 0x00, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, \n\t0x1b, 0xb1, 0x04, 0x06, 0x3e, 0x59, 0xb0, 0x06, 0x10, 0xb1, 0x02, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x21, \n\t0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, 0x05, 0x03, 0xc6, 0xfd, 0x3c, \n\t0xc5, 0x04, 0x4f, 0x05, 0x15, 0xfa, 0xeb, 0x05, 0xb0, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xcc, 0x05, 0xb0, 0x02, 0x06, \n\t0x00, 0x33, 0x00, 0x00, 0x00, 0x01, 0x00, 0x46, 0x00, 0x00, 0x04, 0x48, \n\t0x05, 0xb0, 0x00, 0x0e, 0x00, 0x4e, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x06, 0x3e, 0x59, 0xb2, 0x07, 0x04, \n\t0x09, 0x11, 0x12, 0x39, 0xb0, 0x07, 0x10, 0xb0, 0x00, 0xd0, 0xb0, 0x04, \n\t0x10, 0xb1, 0x02, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x09, 0x10, 0xb1, 0x0b, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x07, 0x10, 0xb0, 0x0e, 0xd0, 0x30, 0x31, \n\t0x01, 0x01, 0x17, 0x21, 0x15, 0x21, 0x35, 0x01, 0x01, 0x35, 0x21, 0x15, \n\t0x21, 0x07, 0x01, 0x02, 0xf6, 0xfe, 0x43, 0x03, 0x03, 0x0c, 0xfb, 0xfe, \n\t0x01, 0xe0, 0xfe, 0x20, 0x03, 0xd0, 0xfd, 0x26, 0x03, 0x01, 0xbd, 0x02, \n\t0xcb, 0xfd, 0xd5, 0x05, 0x9b, 0x93, 0x02, 0x45, 0x02, 0x45, 0x93, 0x9b, \n\t0x05, 0xfd, 0xd3, 0x00, 0xff, 0xff, 0x00, 0x22, 0x00, 0x00, 0x04, 0x8e, \n\t0x05, 0xb0, 0x02, 0x06, 0x00, 0x37, 0x00, 0x00, 0xff, 0xff, 0x00, 0x14, \n\t0x00, 0x00, 0x04, 0xce, 0x05, 0xb0, 0x02, 0x06, 0x00, 0x3c, 0x00, 0x00, \n\t0x00, 0x03, 0x00, 0x54, 0x00, 0x00, 0x05, 0x4d, 0x05, 0xb0, 0x00, 0x11, \n\t0x00, 0x1a, 0x00, 0x23, 0x00, 0x62, 0x00, 0xb0, 0x09, 0x2f, 0xb0, 0x0f, \n\t0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x0c, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, \n\t0x06, 0x3e, 0x59, 0xb2, 0x3f, 0x0f, 0x01, 0x5d, 0xb4, 0x5f, 0x0f, 0x6f, \n\t0x0f, 0x02, 0x5d, 0xb0, 0x0f, 0x10, 0xb0, 0x00, 0xd0, 0xb0, 0x09, 0x10, \n\t0xb0, 0x06, 0xd0, 0xb0, 0x09, 0x10, 0xb1, 0x15, 0x03, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0f, 0x10, 0xb1, 0x17, 0x03, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x1f, 0xd0, \n\t0xb0, 0x15, 0x10, 0xb0, 0x20, 0xd0, 0x30, 0x31, 0x01, 0x16, 0x00, 0x15, \n\t0x14, 0x00, 0x07, 0x15, 0x23, 0x35, 0x26, 0x00, 0x35, 0x34, 0x00, 0x37, \n\t0x35, 0x33, 0x01, 0x14, 0x16, 0x37, 0x37, 0x11, 0x27, 0x26, 0x06, 0x05, \n\t0x34, 0x26, 0x23, 0x07, 0x11, 0x17, 0x16, 0x36, 0x03, 0x34, 0xe6, 0x01, \n\t0x33, 0xfe, 0xcd, 0xe6, 0xc5, 0xe8, 0xfe, 0xcd, 0x01, 0x33, 0xe8, 0xc5, \n\t0xfd, 0xe3, 0xb1, 0xa1, 0x06, 0x06, 0xa0, 0xb2, 0x03, 0x72, 0xb2, 0x9d, \n\t0x06, 0x06, 0x9d, 0xb2, 0x04, 0xcd, 0x05, 0xfe, 0xe5, 0xda, 0xdd, 0xfe, \n\t0xe3, 0x04, 0xd5, 0xd5, 0x03, 0x01, 0x1c, 0xdd, 0xdb, 0x01, 0x1e, 0x04, \n\t0xe2, 0xfd, 0x21, 0xa1, 0xbb, 0x01, 0x02, 0x02, 0xb3, 0x02, 0x01, 0xbd, \n\t0x9e, 0x9f, 0xbb, 0x02, 0xfd, 0x4d, 0x02, 0x01, 0xbd, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x42, 0x00, 0x00, 0x04, 0xd6, 0x05, 0xb0, 0x02, 0x06, \n\t0x00, 0x3b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x57, 0x00, 0x00, 0x05, 0x1b, \n\t0x05, 0xb0, 0x00, 0x19, 0x00, 0x52, 0x00, 0xb0, 0x0d, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x0c, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x0c, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x18, 0x2f, 0x1b, 0xb1, 0x18, 0x0c, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x06, \n\t0x3e, 0x59, 0xb0, 0x0d, 0x10, 0xb1, 0x16, 0x03, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0xd0, 0xb0, 0x0d, 0x10, 0xb0, \n\t0x0a, 0xd0, 0x30, 0x31, 0x01, 0x17, 0x36, 0x36, 0x35, 0x11, 0x33, 0x11, \n\t0x14, 0x00, 0x07, 0x11, 0x23, 0x11, 0x26, 0x00, 0x35, 0x11, 0x33, 0x11, \n\t0x14, 0x16, 0x17, 0x37, 0x11, 0x33, 0x03, 0x13, 0x06, 0x90, 0xad, 0xc5, \n\t0xfe, 0xe2, 0xea, 0xc6, 0xe3, 0xfe, 0xed, 0xc4, 0xa4, 0x88, 0x06, 0xc6, \n\t0x01, 0xe5, 0x02, 0x13, 0xd3, 0xac, 0x02, 0x3b, 0xfd, 0xc5, 0xf5, 0xfe, \n\t0xd7, 0x18, 0xfe, 0xc1, 0x01, 0x40, 0x18, 0x01, 0x28, 0xf5, 0x02, 0x3b, \n\t0xfd, 0xc5, 0xaa, 0xd2, 0x14, 0x01, 0x03, 0xca, 0x00, 0x01, 0x00, 0x70, \n\t0x00, 0x00, 0x04, 0xd0, 0x05, 0xc5, 0x00, 0x23, 0x00, 0x5a, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x19, 0x2f, 0x1b, 0xb1, 0x19, 0x0c, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x06, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x22, 0x2f, 0x1b, 0xb1, 0x22, 0x06, \n\t0x3e, 0x59, 0xb1, 0x21, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x00, 0xd0, 0xb0, 0x19, 0x10, 0xb1, 0x07, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x10, 0x10, 0xb1, \n\t0x11, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x0e, 0xd0, 0x30, 0x31, 0x25, 0x36, 0x12, 0x35, 0x35, 0x34, 0x26, 0x23, \n\t0x22, 0x06, 0x15, 0x15, 0x14, 0x12, 0x17, 0x15, 0x21, 0x35, 0x33, 0x26, \n\t0x02, 0x35, 0x35, 0x10, 0x00, 0x33, 0x32, 0x00, 0x11, 0x15, 0x14, 0x02, \n\t0x07, 0x33, 0x15, 0x21, 0x02, 0xdf, 0x8d, 0x9d, 0xc1, 0xaa, 0xa9, 0xc0, \n\t0xa1, 0x8f, 0xfe, 0x11, 0xea, 0x70, 0x80, 0x01, 0x35, 0xf9, 0xf9, 0x01, \n\t0x37, 0x80, 0x6e, 0xf0, 0xfe, 0x0f, 0x9f, 0x19, 0x01, 0x1f, 0xfb, 0x76, \n\t0xe9, 0xf9, 0xf9, 0xe9, 0x76, 0xfb, 0xfe, 0xe0, 0x18, 0x9f, 0x9a, 0x61, \n\t0x01, 0x33, 0xa4, 0x74, 0x01, 0x1c, 0x01, 0x63, 0xfe, 0x9d, 0xfe, 0xe4, \n\t0x74, 0xa4, 0xfe, 0xcd, 0x61, 0x9a, 0x00, 0x00, 0xff, 0xff, 0xff, 0xcb, \n\t0x00, 0x00, 0x02, 0x7c, 0x07, 0x0d, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x6a, 0xff, 0x21, 0x01, 0x5d, 0x00, 0x1d, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x12, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x12, 0x3e, \n\t0x59, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x14, 0x00, 0x00, 0x04, 0xce, \n\t0x07, 0x0c, 0x02, 0x26, 0x00, 0x3c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x6a, \n\t0x00, 0x6f, 0x01, 0x5c, 0x00, 0x1d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x62, 0xff, 0xeb, 0x04, 0x80, 0x06, 0x79, 0x02, 0x26, \n\t0x01, 0x8b, 0x00, 0x00, 0x00, 0x07, 0x01, 0x61, 0x01, 0x75, 0x00, 0x07, \n\t0xff, 0xff, 0x00, 0x62, 0xff, 0xed, 0x03, 0xe9, 0x06, 0x78, 0x02, 0x26, \n\t0x01, 0x8f, 0x00, 0x00, 0x00, 0x07, 0x01, 0x61, 0x01, 0x2b, 0x00, 0x06, \n\t0xff, 0xff, 0x00, 0x8f, 0xfe, 0x61, 0x03, 0xf5, 0x06, 0x79, 0x02, 0x26, \n\t0x01, 0x91, 0x00, 0x00, 0x00, 0x07, 0x01, 0x61, 0x01, 0x46, 0x00, 0x07, \n\t0xff, 0xff, 0x00, 0xc5, 0xff, 0xeb, 0x02, 0x73, 0x06, 0x66, 0x02, 0x26, \n\t0x01, 0x93, 0x00, 0x00, 0x00, 0x06, 0x01, 0x61, 0x32, 0xf4, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x8d, 0xff, 0xeb, 0x04, 0x26, 0x06, 0x7a, 0x02, 0x26, \n\t0x01, 0x9f, 0x00, 0x00, 0x01, 0x06, 0x01, 0x62, 0x54, 0xb8, 0x00, 0x16, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x1a, 0xdc, 0xb0, 0x17, 0xd0, 0x30, 0x31, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x62, 0xff, 0xeb, 0x04, 0x80, 0x04, 0x4e, 0x00, 0x1c, \n\t0x00, 0x2b, 0x00, 0x64, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x18, 0x2f, \n\t0x1b, 0xb1, 0x18, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, \n\t0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x06, 0x3e, 0x59, 0xb0, 0x0b, 0x10, \n\t0xb1, 0x04, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x11, 0x10, 0xb1, 0x20, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x18, 0x10, 0xb1, 0x28, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x11, 0x14, 0x16, \n\t0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x26, 0x27, 0x06, \n\t0x06, 0x23, 0x22, 0x02, 0x35, 0x35, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, \n\t0x37, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x35, 0x11, 0x26, 0x26, \n\t0x23, 0x22, 0x06, 0x15, 0x03, 0xe9, 0x29, 0x23, 0x0f, 0x1a, 0x0b, 0x17, \n\t0x1d, 0x3c, 0x25, 0x4b, 0x64, 0x18, 0x37, 0x99, 0x63, 0xc6, 0xe0, 0xdf, \n\t0xc9, 0x65, 0x9b, 0x37, 0x33, 0xfd, 0xb3, 0x87, 0x8c, 0x51, 0x72, 0x27, \n\t0x27, 0x73, 0x4e, 0x8d, 0x88, 0x04, 0x39, 0xfc, 0xdb, 0x48, 0x38, 0x03, \n\t0x04, 0x8e, 0x14, 0x0e, 0x40, 0x45, 0x42, 0x43, 0x01, 0x1f, 0xea, 0x15, \n\t0x01, 0x05, 0x01, 0x40, 0x48, 0x44, 0x77, 0xfd, 0xbb, 0xa4, 0xcb, 0x47, \n\t0x40, 0x08, 0x02, 0x1d, 0x3c, 0x46, 0xef, 0xbb, 0x00, 0x02, 0x00, 0x9d, \n\t0xfe, 0x81, 0x04, 0x4f, 0x05, 0xc5, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x57, \n\t0x00, 0xb0, 0x10, 0x2f, 0xb0, 0x2a, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x06, 0x3e, 0x59, 0xb0, 0x2a, 0x10, \n\t0xb1, 0x29, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb2, 0x06, 0x29, 0x2a, 0x11, 0x12, 0x39, 0xb0, 0x00, 0x10, 0xb1, 0x1b, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0c, \n\t0x10, 0xb1, 0x22, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0x30, 0x31, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, \n\t0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x11, 0x23, 0x11, 0x34, 0x24, \n\t0x13, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x16, \n\t0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x02, 0x5f, \n\t0xc3, 0xec, 0x64, 0x57, 0x77, 0x85, 0xfd, 0xca, 0x52, 0x99, 0x3b, 0xc5, \n\t0x01, 0x0a, 0xb4, 0x7a, 0x74, 0x7d, 0x6d, 0x6b, 0x92, 0x2c, 0x8d, 0x59, \n\t0x81, 0x95, 0x83, 0x6f, 0x8f, 0x05, 0xc5, 0xdc, 0xae, 0x5b, 0x99, 0x2d, \n\t0x2c, 0xc4, 0x81, 0xd1, 0xed, 0x2d, 0x2e, 0xfe, 0x3b, 0x05, 0xb0, 0xa5, \n\t0xef, 0xfd, 0x97, 0x79, 0x6a, 0x5f, 0x8c, 0x8f, 0x6a, 0xfc, 0xc2, 0x34, \n\t0x3a, 0xa0, 0x80, 0x70, 0xac, 0x9b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2e, \n\t0xfe, 0x5f, 0x03, 0xe4, 0x04, 0x3a, 0x00, 0x0b, 0x00, 0x4b, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x08, \n\t0x3e, 0x59, 0xb2, 0x09, 0x03, 0x06, 0x11, 0x12, 0x39, 0xb0, 0x09, 0x10, \n\t0xb0, 0x02, 0xd0, 0xb4, 0x8c, 0x02, 0x9c, 0x02, 0x02, 0x5d, 0xb0, 0x09, \n\t0x10, 0xb0, 0x05, 0xd0, 0xb4, 0x8c, 0x05, 0x9c, 0x05, 0x02, 0x5d, 0x30, \n\t0x31, 0x01, 0x33, 0x01, 0x11, 0x23, 0x11, 0x01, 0x33, 0x01, 0x17, 0x33, \n\t0x37, 0x03, 0x1b, 0xc9, 0xfe, 0x89, 0xc5, 0xfe, 0x86, 0xca, 0x01, 0x00, \n\t0x11, 0x06, 0x13, 0x04, 0x3a, 0xfc, 0x04, 0xfe, 0x21, 0x01, 0xe4, 0x03, \n\t0xf7, 0xfd, 0x05, 0x4c, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x61, \n\t0xff, 0xeb, 0x04, 0x2a, 0x05, 0xb0, 0x00, 0x16, 0x00, 0x24, 0x00, 0x57, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, \n\t0x0b, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x01, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x12, 0x10, 0xb1, 0x17, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0b, \n\t0x10, 0xb1, 0x1e, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0x30, 0x31, 0x01, 0x15, 0x21, 0x07, 0x01, 0x16, 0x16, 0x15, 0x15, \n\t0x14, 0x00, 0x23, 0x22, 0x00, 0x35, 0x35, 0x34, 0x12, 0x3f, 0x02, 0x25, \n\t0x35, 0x01, 0x22, 0x06, 0x15, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, \n\t0x35, 0x34, 0x26, 0x03, 0xaa, 0xfe, 0x3a, 0x02, 0x01, 0x73, 0x65, 0x70, \n\t0xfe, 0xfc, 0xe0, 0xe0, 0xfe, 0xfb, 0xd3, 0xb9, 0x07, 0x02, 0xfe, 0xd7, \n\t0x01, 0x77, 0x8d, 0x91, 0x91, 0x8f, 0x8d, 0x92, 0x93, 0x05, 0xb0, 0x97, \n\t0x06, 0xfe, 0xeb, 0x4b, 0xf6, 0x96, 0x16, 0xf2, 0xfe, 0xcc, 0x01, 0x35, \n\t0xf1, 0x16, 0xd7, 0x01, 0x2b, 0x1e, 0x01, 0x06, 0xec, 0x76, 0xfe, 0x03, \n\t0xe2, 0xaa, 0x16, 0xac, 0xe0, 0xe0, 0xac, 0x16, 0xaa, 0xe2, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x62, 0xff, 0xed, 0x03, 0xe9, 0x04, 0x4c, 0x00, 0x2a, \n\t0x00, 0x8f, 0x00, 0xb0, 0x29, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1a, \n\t0x2f, 0x1b, 0xb1, 0x1a, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x06, 0x3e, 0x59, 0xb1, 0x06, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x5f, 0x29, 0x01, \n\t0x5d, 0xb2, 0xff, 0x29, 0x01, 0x5d, 0xb2, 0x6f, 0x29, 0x01, 0x71, 0xb2, \n\t0xcf, 0x29, 0x01, 0x71, 0xb2, 0x3f, 0x29, 0x01, 0x72, 0xb2, 0x6f, 0x29, \n\t0x01, 0x72, 0xb2, 0xff, 0x29, 0x01, 0x71, 0xb2, 0x9f, 0x29, 0x01, 0x71, \n\t0xb2, 0x2f, 0x29, 0x01, 0x71, 0xb4, 0xbf, 0x29, 0xcf, 0x29, 0x02, 0x5d, \n\t0xb2, 0x2f, 0x29, 0x01, 0x5d, 0xb2, 0x9f, 0x29, 0x01, 0x72, 0xb0, 0x29, \n\t0x10, 0xb1, 0x2a, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb2, 0x14, 0x2a, 0x29, 0x11, 0x12, 0x39, 0xb0, 0x1a, 0x10, 0xb1, \n\t0x22, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, \n\t0x31, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x33, \n\t0x17, 0x16, 0x04, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x26, 0x26, \n\t0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x07, 0x07, 0x23, 0x34, 0x26, 0x23, \n\t0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x33, 0x15, 0x02, 0x1a, 0x79, 0x79, \n\t0x89, 0x76, 0x70, 0x91, 0xba, 0x02, 0x05, 0xfe, 0xf6, 0xb8, 0xca, 0xfb, \n\t0x67, 0x63, 0x57, 0x60, 0xe9, 0xc9, 0xb7, 0xf9, 0x05, 0x02, 0xba, 0x8b, \n\t0x64, 0x74, 0x79, 0x6d, 0x73, 0xd1, 0x01, 0xdd, 0x55, 0x57, 0x49, 0x64, \n\t0x70, 0x4c, 0x06, 0xa2, 0xab, 0xad, 0x97, 0x5b, 0x80, 0x20, 0x23, 0x7a, \n\t0x49, 0x96, 0xa4, 0xaf, 0x8b, 0x06, 0x46, 0x62, 0x5f, 0x43, 0x4a, 0x55, \n\t0x96, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x73, 0xfe, 0x58, 0x03, 0xca, \n\t0x05, 0xb0, 0x00, 0x21, 0x00, 0x45, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x08, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x16, 0x2f, 0x1b, 0xb1, 0x16, 0x06, 0x3e, 0x59, 0xb1, 0x08, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, \n\t0x10, 0xb1, 0x1f, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0x30, 0x31, 0x01, 0x15, 0x01, 0x06, 0x06, 0x15, 0x14, 0x16, 0x33, \n\t0x33, 0x32, 0x16, 0x15, 0x06, 0x06, 0x07, 0x27, 0x36, 0x36, 0x35, 0x34, \n\t0x26, 0x23, 0x23, 0x22, 0x26, 0x35, 0x34, 0x12, 0x37, 0x01, 0x27, 0x21, \n\t0x35, 0x03, 0xca, 0xfe, 0xaa, 0x81, 0x71, 0x69, 0x66, 0x20, 0x9f, 0xb4, \n\t0x02, 0x9b, 0x6d, 0x51, 0x42, 0x5e, 0x52, 0x5a, 0x34, 0xb3, 0xb9, 0x8b, \n\t0x90, 0x01, 0x0c, 0x02, 0xfd, 0x91, 0x05, 0xb0, 0x70, 0xfe, 0x50, 0x99, \n\t0xe3, 0x91, 0x74, 0x75, 0x7f, 0x80, 0x6f, 0xa5, 0x2f, 0x7f, 0x1f, 0x56, \n\t0x46, 0x34, 0x3a, 0xd6, 0xa8, 0x78, 0x01, 0x41, 0xa9, 0x01, 0x30, 0x05, \n\t0x9b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8f, 0xfe, 0x61, 0x03, 0xf5, \n\t0x04, 0x4e, 0x00, 0x13, 0x00, 0x46, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x08, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x06, 0x3e, 0x59, 0xb0, \n\t0x04, 0x10, 0xb1, 0x0d, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0x30, 0x31, 0x01, 0x17, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, \n\t0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x23, 0x11, \n\t0x01, 0x3f, 0x0d, 0x36, 0xa0, 0x65, 0xb1, 0xbd, 0xc5, 0x72, 0x74, 0x55, \n\t0x7b, 0x26, 0xc5, 0x04, 0x3a, 0x96, 0x51, 0x59, 0xc3, 0xe0, 0xfb, 0xb6, \n\t0x04, 0x46, 0x8f, 0x7d, 0x43, 0x3c, 0xfc, 0xcc, 0x04, 0x3a, 0x00, 0x00, \n\t0x00, 0x03, 0x00, 0x77, 0xff, 0xeb, 0x04, 0x16, 0x05, 0xc5, 0x00, 0x0d, \n\t0x00, 0x16, 0x00, 0x1f, 0x00, 0x77, 0x00, 0xb0, 0x0e, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0c, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x06, 0x3e, 0x59, \n\t0xb2, 0x7f, 0x0e, 0x01, 0x5d, 0xb4, 0xef, 0x0e, 0xff, 0x0e, 0x02, 0x5d, \n\t0xb2, 0x4f, 0x0e, 0x01, 0x71, 0xb2, 0x9f, 0x0e, 0x01, 0x71, 0xb2, 0x1f, \n\t0x0e, 0x01, 0x71, 0xb2, 0xcf, 0x0e, 0x01, 0x5d, 0xb2, 0x5f, 0x0e, 0x01, \n\t0x5d, 0xb2, 0x2f, 0x0e, 0x01, 0x5d, 0xb0, 0x0a, 0x10, 0xb1, 0x13, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0e, 0x10, \n\t0xb1, 0x17, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x03, 0x10, 0xb1, 0x1c, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x10, 0x02, 0x23, 0x22, 0x02, 0x11, \n\t0x11, 0x10, 0x12, 0x33, 0x32, 0x12, 0x11, 0x05, 0x21, 0x35, 0x34, 0x26, \n\t0x23, 0x22, 0x06, 0x15, 0x01, 0x21, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, \n\t0x35, 0x04, 0x16, 0xf7, 0xd7, 0xd7, 0xfa, 0xf9, 0xd6, 0xd7, 0xf9, 0xfd, \n\t0x26, 0x02, 0x15, 0x89, 0x82, 0x82, 0x88, 0x02, 0x15, 0xfd, 0xeb, 0x8a, \n\t0x82, 0x82, 0x87, 0x02, 0x2b, 0xfe, 0xe9, 0xfe, 0xd7, 0x01, 0x2a, 0x01, \n\t0x16, 0x01, 0x59, 0x01, 0x16, 0x01, 0x2b, 0xfe, 0xd5, 0xfe, 0xea, 0x61, \n\t0x8b, 0xbd, 0xbf, 0xbf, 0xbd, 0xfe, 0xda, 0x85, 0xbd, 0xc1, 0xc0, 0xbe, \n\t0x00, 0x01, 0x00, 0xc5, 0xff, 0xeb, 0x02, 0x73, 0x04, 0x39, 0x00, 0x0f, \n\t0x00, 0x29, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, \n\t0x00, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, \n\t0xb1, 0x0b, 0x06, 0x3e, 0x59, 0xb1, 0x04, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x11, 0x14, 0x16, 0x33, \n\t0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x11, 0x01, \n\t0x8a, 0x35, 0x2d, 0x19, 0x30, 0x12, 0x2c, 0x2d, 0x59, 0x35, 0x77, 0x7c, \n\t0x04, 0x39, 0xfc, 0xd3, 0x49, 0x38, 0x0f, 0x0b, 0x85, 0x1f, 0x16, 0x8e, \n\t0x9e, 0x03, 0x22, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x04, 0x40, \n\t0x04, 0x3a, 0x02, 0x06, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x01, 0x00, 0x38, \n\t0xff, 0xef, 0x04, 0x5e, 0x05, 0xee, 0x00, 0x21, 0x00, 0x67, 0x00, 0xb0, \n\t0x0d, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, \n\t0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1b, 0x2f, 0x1b, 0xb1, \n\t0x1b, 0x06, 0x3e, 0x59, 0xb2, 0x02, 0x01, 0x0d, 0x11, 0x12, 0x39, 0xb0, \n\t0x0d, 0x10, 0xb1, 0x06, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x1b, 0x10, 0xb1, 0x14, 0x03, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x02, 0x10, 0xb0, 0x1f, 0xd0, 0xb2, \n\t0x9f, 0x1f, 0x01, 0x5d, 0x40, 0x0f, 0x2c, 0x1f, 0x3c, 0x1f, 0x4c, 0x1f, \n\t0x5c, 0x1f, 0x6c, 0x1f, 0x7c, 0x1f, 0x8c, 0x1f, 0x07, 0x5d, 0xb2, 0xab, \n\t0x1f, 0x01, 0x5d, 0x30, 0x31, 0x21, 0x23, 0x01, 0x27, 0x26, 0x26, 0x23, \n\t0x22, 0x06, 0x23, 0x35, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x01, 0x16, \n\t0x16, 0x33, 0x32, 0x36, 0x37, 0x07, 0x06, 0x06, 0x23, 0x22, 0x26, 0x27, \n\t0x03, 0x07, 0x07, 0x01, 0x13, 0xdb, 0x01, 0x87, 0x37, 0x20, 0x57, 0x3c, \n\t0x0a, 0x36, 0x04, 0x14, 0x3f, 0x18, 0x81, 0x99, 0x28, 0x01, 0x68, 0x16, \n\t0x47, 0x2c, 0x0e, 0x09, 0x18, 0x03, 0x0b, 0x25, 0x0b, 0x76, 0x8f, 0x35, \n\t0xca, 0x06, 0x1d, 0x04, 0x04, 0x91, 0x54, 0x6a, 0x05, 0x91, 0x05, 0x0a, \n\t0xa2, 0x6c, 0xfc, 0x4e, 0x47, 0x54, 0x01, 0x04, 0x9a, 0x05, 0x0a, 0x82, \n\t0x8c, 0x02, 0x13, 0x01, 0x71, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, \n\t0xfe, 0x60, 0x03, 0xf2, 0x04, 0x3a, 0x02, 0x06, 0x00, 0x77, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x2e, 0x00, 0x00, 0x03, 0xe4, 0x04, 0x3a, 0x02, 0x06, \n\t0x00, 0x59, 0x00, 0x00, 0x00, 0x01, 0x00, 0x56, 0xfe, 0x44, 0x03, 0xe3, \n\t0x05, 0xb0, 0x00, 0x2e, 0x00, 0x5d, 0x00, 0xb0, 0x18, 0x2f, 0xb0, 0x09, \n\t0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1f, 0x2f, 0x1b, 0xb1, 0x1f, \n\t0x06, 0x3e, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x01, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x09, 0x10, 0xb1, 0x0a, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x1f, 0x10, \n\t0xb1, 0x11, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb2, 0x26, 0x0a, 0x09, 0x11, 0x12, 0x39, 0xb0, 0x01, 0x10, 0xb0, 0x2d, \n\t0xd0, 0x30, 0x31, 0x01, 0x15, 0x21, 0x06, 0x06, 0x15, 0x14, 0x16, 0x33, \n\t0x33, 0x15, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x33, 0x32, 0x16, \n\t0x15, 0x06, 0x06, 0x07, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, \n\t0x22, 0x24, 0x35, 0x34, 0x36, 0x37, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, \n\t0x23, 0x35, 0x03, 0x9a, 0xfe, 0xd8, 0x7b, 0x7d, 0x91, 0x9a, 0x8f, 0x8f, \n\t0xbb, 0xc3, 0xa0, 0x8d, 0x3c, 0xa1, 0xb2, 0x02, 0x9b, 0x6d, 0x4f, 0x41, \n\t0x5e, 0x46, 0x4b, 0x44, 0xde, 0xfe, 0xec, 0x9f, 0x98, 0x6c, 0x78, 0x3d, \n\t0x3b, 0xd7, 0x05, 0xb0, 0x9b, 0x08, 0x82, 0x60, 0x5e, 0x69, 0x9b, 0x9c, \n\t0x99, 0x78, 0x96, 0x7f, 0x81, 0x6f, 0xa4, 0x2f, 0x7f, 0x1f, 0x55, 0x46, \n\t0x34, 0x3c, 0xe3, 0xc8, 0x91, 0xc5, 0x2c, 0x28, 0x8d, 0x58, 0x4d, 0x79, \n\t0x28, 0x9b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x61, 0xff, 0xeb, 0x04, 0x2a, \n\t0x04, 0x4e, 0x02, 0x06, 0x00, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4f, \n\t0xff, 0xeb, 0x04, 0xcc, 0x04, 0x3a, 0x00, 0x17, 0x00, 0x51, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x16, 0x2f, 0x1b, 0xb1, 0x16, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x06, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x06, \n\t0x3e, 0x59, 0xb0, 0x16, 0x10, 0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0c, 0x10, 0xb1, 0x05, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb0, \n\t0x10, 0xd0, 0xb0, 0x15, 0xd0, 0x30, 0x31, 0x01, 0x23, 0x11, 0x14, 0x16, \n\t0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x11, \n\t0x21, 0x11, 0x23, 0x11, 0x23, 0x35, 0x21, 0x04, 0x5e, 0x7b, 0x35, 0x2d, \n\t0x19, 0x30, 0x12, 0x2c, 0x2d, 0x59, 0x35, 0x77, 0x7c, 0xfe, 0x75, 0xc5, \n\t0x7f, 0x04, 0x0f, 0x03, 0x9e, 0xfd, 0x6e, 0x49, 0x38, 0x0f, 0x0b, 0x85, \n\t0x1f, 0x16, 0x8e, 0x9e, 0x02, 0x87, 0xfc, 0x62, 0x03, 0x9e, 0x9c, 0x00, \n\t0x00, 0x02, 0x00, 0x8f, 0xfe, 0x60, 0x04, 0x24, 0x04, 0x4e, 0x00, 0x10, \n\t0x00, 0x1e, 0x00, 0x48, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, \n\t0x1b, 0xb1, 0x0d, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, \n\t0x2f, 0x1b, 0xb1, 0x07, 0x08, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x06, 0x3e, 0x59, 0xb0, 0x0d, 0x10, 0xb1, \n\t0x14, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x03, 0x10, 0xb1, 0x1b, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0x30, 0x31, 0x01, 0x14, 0x02, 0x23, 0x22, 0x26, 0x27, 0x11, \n\t0x23, 0x11, 0x35, 0x34, 0x00, 0x33, 0x32, 0x12, 0x11, 0x23, 0x34, 0x26, \n\t0x23, 0x22, 0x06, 0x15, 0x11, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x04, \n\t0x24, 0xdb, 0xc5, 0x61, 0x98, 0x37, 0xc5, 0x01, 0x01, 0xc0, 0xe3, 0xf1, \n\t0xc5, 0x84, 0x8b, 0x7b, 0x81, 0x25, 0x78, 0x57, 0x8b, 0x8c, 0x01, 0xf4, \n\t0xeb, 0xfe, 0xe2, 0x3c, 0x3a, 0xfd, 0xff, 0x03, 0xe0, 0x01, 0xf7, 0x01, \n\t0x16, 0xfe, 0xc3, 0xfe, 0xf8, 0xbd, 0xed, 0xe7, 0x8c, 0xfe, 0xd3, 0x43, \n\t0x4b, 0xcc, 0xa3, 0x00, 0x00, 0x01, 0x00, 0x62, 0xfe, 0x57, 0x03, 0xe1, \n\t0x04, 0x4e, 0x00, 0x22, 0x00, 0x48, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x15, 0x2f, 0x1b, 0xb1, 0x15, 0x08, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x1c, 0x2f, 0x1b, 0xb1, 0x1c, 0x06, 0x3e, 0x59, 0xb0, 0x00, \n\t0x10, 0xb1, 0x08, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x1c, 0x10, 0xb1, 0x0f, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x32, 0x16, 0x07, 0x07, 0x23, \n\t0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x15, 0x14, 0x16, 0x17, 0x16, 0x16, \n\t0x15, 0x06, 0x06, 0x07, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x26, \n\t0x02, 0x35, 0x35, 0x34, 0x12, 0x02, 0x3d, 0xbb, 0xe9, 0x04, 0x02, 0xb2, \n\t0x7a, 0x72, 0x8a, 0x8c, 0xa4, 0xa6, 0xb4, 0xa8, 0x02, 0x9b, 0x6d, 0x51, \n\t0x42, 0x5e, 0x58, 0x5f, 0xfb, 0xfe, 0xff, 0x04, 0x4e, 0xd1, 0xb2, 0x06, \n\t0x67, 0x87, 0xe6, 0x9b, 0x2a, 0x8f, 0xc9, 0x18, 0x1a, 0x6a, 0x7b, 0x6f, \n\t0xa4, 0x2f, 0x7f, 0x1f, 0x55, 0x46, 0x30, 0x33, 0x0d, 0x23, 0x01, 0x0e, \n\t0xd7, 0x2a, 0xe3, 0x01, 0x39, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x61, \n\t0xff, 0xeb, 0x04, 0x7c, 0x04, 0x3a, 0x00, 0x10, 0x00, 0x1e, 0x00, 0x4a, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, \n\t0x06, 0x3e, 0x59, 0xb0, 0x0f, 0x10, 0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x08, 0x10, 0xb1, 0x14, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0f, 0x10, \n\t0xb1, 0x1b, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x01, 0x21, 0x16, 0x16, 0x15, 0x15, 0x14, 0x00, 0x23, 0x22, \n\t0x00, 0x35, 0x35, 0x34, 0x00, 0x37, 0x21, 0x01, 0x14, 0x16, 0x33, 0x32, \n\t0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x04, 0x7c, 0xfe, \n\t0xeb, 0x5e, 0x65, 0xfe, 0xf8, 0xdc, 0xe0, 0xfe, 0xfb, 0x01, 0x03, 0xdf, \n\t0x02, 0x39, 0xfc, 0xaa, 0x91, 0x8f, 0x8d, 0x92, 0x93, 0x8e, 0x8d, 0x91, \n\t0x03, 0x9e, 0x48, 0xd4, 0x82, 0x16, 0xd2, 0xfe, 0xd3, 0x01, 0x35, 0xf1, \n\t0x16, 0xe7, 0x01, 0x2b, 0x01, 0xfd, 0xd7, 0xac, 0xe0, 0xe0, 0xac, 0x16, \n\t0xa1, 0xd6, 0xd6, 0xa1, 0x00, 0x01, 0x00, 0x51, 0x00, 0x00, 0x03, 0xdc, \n\t0x04, 0x3a, 0x00, 0x07, 0x00, 0x2f, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x06, 0x3e, 0x59, 0xb0, 0x06, 0x10, \n\t0xb1, 0x05, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x01, 0xd0, 0x30, 0x31, 0x01, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, \n\t0x21, 0x03, 0xdc, 0xfe, 0x9a, 0xc5, 0xfe, 0xa0, 0x03, 0x8b, 0x03, 0xa1, \n\t0xfc, 0x5f, 0x03, 0xa1, 0x99, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8d, \n\t0xff, 0xeb, 0x04, 0x26, 0x04, 0x3a, 0x00, 0x15, 0x00, 0x36, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x06, \n\t0x3e, 0x59, 0xb1, 0x04, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0x30, 0x31, 0x01, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, \n\t0x26, 0x02, 0x27, 0x33, 0x16, 0x12, 0x15, 0x14, 0x02, 0x23, 0x22, 0x26, \n\t0x35, 0x11, 0x01, 0x52, 0x8a, 0x75, 0x89, 0x87, 0x03, 0x42, 0x37, 0xce, \n\t0x33, 0x40, 0xde, 0xed, 0xdd, 0xf1, 0x04, 0x3a, 0xfd, 0x9c, 0xaf, 0xa2, \n\t0xfd, 0xb0, 0x7e, 0x01, 0x02, 0x88, 0x6b, 0xfe, 0xfd, 0x9a, 0xff, 0xfe, \n\t0xb8, 0xf2, 0xfb, 0x02, 0x62, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x53, \n\t0xfe, 0x22, 0x05, 0x57, 0x04, 0x3a, 0x00, 0x18, 0x00, 0x21, 0x00, 0x54, \n\t0x00, 0xb0, 0x07, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, \n\t0xb1, 0x00, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, \n\t0x1b, 0xb1, 0x0f, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, \n\t0x2f, 0x1b, 0xb1, 0x09, 0x06, 0x3e, 0x59, 0xb0, 0x06, 0xd0, 0xb0, 0x09, \n\t0x10, 0xb1, 0x16, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x00, 0x10, 0xb1, 0x1c, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x16, 0x10, 0xb0, 0x1e, 0xd0, 0x30, 0x31, \n\t0x01, 0x32, 0x00, 0x15, 0x14, 0x00, 0x05, 0x11, 0x23, 0x11, 0x24, 0x00, \n\t0x35, 0x34, 0x12, 0x37, 0x33, 0x06, 0x02, 0x07, 0x14, 0x16, 0x17, 0x37, \n\t0x11, 0x01, 0x26, 0x26, 0x07, 0x07, 0x11, 0x17, 0x36, 0x36, 0x03, 0x2e, \n\t0xe4, 0x01, 0x45, 0xfe, 0xf1, 0xfe, 0xe6, 0xc5, 0xfe, 0xee, 0xfe, 0xfc, \n\t0x40, 0x34, 0xce, 0x39, 0x42, 0x02, 0xa3, 0xa8, 0x06, 0x02, 0x29, 0x04, \n\t0xba, 0xa0, 0x06, 0x06, 0xb1, 0xad, 0x04, 0x3a, 0xfe, 0xbf, 0xed, 0xda, \n\t0xfe, 0xd5, 0x17, 0xfe, 0x32, 0x01, 0xce, 0x19, 0x01, 0x41, 0xea, 0x99, \n\t0x01, 0x01, 0x6c, 0x86, 0xfe, 0xfe, 0x7e, 0x9b, 0xee, 0x17, 0x02, 0x03, \n\t0xa4, 0xfd, 0xd2, 0xa3, 0xed, 0x04, 0x02, 0xfc, 0xfd, 0x02, 0x15, 0xd9, \n\t0x00, 0x01, 0x00, 0x5e, 0xfe, 0x4b, 0x04, 0x4b, 0x04, 0x49, 0x00, 0x25, \n\t0x00, 0x7d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, \n\t0x00, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, \n\t0xb1, 0x07, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x13, 0x2f, \n\t0x1b, 0xb1, 0x13, 0x08, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x19, \n\t0x2f, 0x1b, 0xb1, 0x19, 0x08, 0x3e, 0x59, 0xb2, 0x05, 0x19, 0x00, 0x11, \n\t0x12, 0x39, 0xb4, 0x75, 0x05, 0x85, 0x05, 0x02, 0x5d, 0xb2, 0x94, 0x05, \n\t0x01, 0x5d, 0xb0, 0x13, 0x10, 0xb1, 0x0c, 0x03, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x18, 0x19, 0x00, 0x11, 0x12, 0x39, \n\t0x40, 0x0b, 0x5b, 0x18, 0x6b, 0x18, 0x7b, 0x18, 0x8b, 0x18, 0x9b, 0x18, \n\t0x05, 0x5d, 0xb0, 0x00, 0x10, 0xb1, 0x1f, 0x03, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x13, 0x32, 0x16, 0x17, 0x17, \n\t0x33, 0x13, 0x33, 0x01, 0x13, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x07, \n\t0x06, 0x06, 0x23, 0x22, 0x26, 0x27, 0x03, 0x23, 0x01, 0x23, 0x01, 0x03, \n\t0x26, 0x26, 0x23, 0x22, 0x06, 0x23, 0x27, 0x36, 0x36, 0xca, 0x81, 0x97, \n\t0x2a, 0x5c, 0x06, 0xe9, 0xc6, 0xfe, 0xab, 0xcc, 0x20, 0x3e, 0x2b, 0x0e, \n\t0x0a, 0x16, 0x03, 0x0a, 0x25, 0x0d, 0x74, 0x8b, 0x34, 0x7f, 0x06, 0xfe, \n\t0xf7, 0xd1, 0x01, 0x7f, 0xa3, 0x21, 0x56, 0x3c, 0x0a, 0x36, 0x04, 0x01, \n\t0x15, 0x3f, 0x04, 0x49, 0xa0, 0x6c, 0xde, 0x01, 0xdb, 0xfd, 0x3d, 0xfe, \n\t0x14, 0x49, 0x4b, 0x02, 0x03, 0xa2, 0x06, 0x09, 0x83, 0x8d, 0x01, 0x2c, \n\t0xfd, 0xda, 0x03, 0x0e, 0x01, 0x82, 0x52, 0x65, 0x05, 0x97, 0x05, 0x0a, \n\t0x00, 0x01, 0x00, 0x5b, 0xfe, 0x26, 0x05, 0x4d, 0x04, 0x3a, 0x00, 0x1d, \n\t0x00, 0x52, 0x00, 0xb0, 0x10, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, \n\t0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x16, 0x2f, 0x1b, 0xb1, 0x16, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x06, 0x3e, 0x59, 0xb1, 0x02, \n\t0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0f, \n\t0x10, 0xb0, 0x12, 0xd0, 0xb0, 0x02, 0x10, 0xb0, 0x1b, 0xd0, 0x30, 0x31, \n\t0x01, 0x11, 0x17, 0x36, 0x36, 0x35, 0x26, 0x02, 0x27, 0x33, 0x16, 0x12, \n\t0x15, 0x14, 0x00, 0x05, 0x11, 0x23, 0x11, 0x26, 0x00, 0x11, 0x11, 0x33, \n\t0x11, 0x14, 0x16, 0x17, 0x37, 0x11, 0x03, 0x25, 0x06, 0xb1, 0xac, 0x03, \n\t0x42, 0x38, 0xcf, 0x33, 0x40, 0xfe, 0xf6, 0xfe, 0xe2, 0xc6, 0xf7, 0xfe, \n\t0xf3, 0xc5, 0xa9, 0x90, 0x06, 0x04, 0x39, 0xfc, 0x5c, 0x02, 0x17, 0xf1, \n\t0x9c, 0x7d, 0x01, 0x01, 0x85, 0x6a, 0xff, 0x00, 0x99, 0xf0, 0xfe, 0xbe, \n\t0x16, 0xfe, 0x37, 0x01, 0xcb, 0x19, 0x01, 0x2e, 0x01, 0x1c, 0x01, 0xe6, \n\t0xfe, 0x18, 0xcf, 0xdb, 0x13, 0x02, 0x03, 0xa2, 0x00, 0x01, 0x00, 0x6c, \n\t0xff, 0xeb, 0x06, 0x60, 0x04, 0x3a, 0x00, 0x28, 0x00, 0x46, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x15, 0x2f, 0x1b, 0xb1, 0x15, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1c, 0x2f, 0x1b, 0xb1, 0x1c, 0x06, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x22, 0x2f, 0x1b, 0xb1, 0x22, \n\t0x06, 0x3e, 0x59, 0xb1, 0x06, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x0f, 0xd0, 0x30, 0x31, 0x01, 0x06, 0x02, 0x07, \n\t0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, \n\t0x32, 0x36, 0x35, 0x26, 0x02, 0x27, 0x33, 0x16, 0x12, 0x15, 0x14, 0x02, \n\t0x23, 0x22, 0x26, 0x27, 0x06, 0x06, 0x23, 0x22, 0x02, 0x35, 0x34, 0x12, \n\t0x37, 0x01, 0xd5, 0x4a, 0x56, 0x04, 0x70, 0x78, 0x6b, 0x7f, 0xc6, 0x7e, \n\t0x6c, 0x78, 0x70, 0x05, 0x56, 0x49, 0xcf, 0x44, 0x56, 0xca, 0xd8, 0x7f, \n\t0xaf, 0x2a, 0x2b, 0xaf, 0x7d, 0xd9, 0xca, 0x55, 0x46, 0x04, 0x3a, 0x86, \n\t0xfe, 0xfd, 0x7f, 0xbe, 0xef, 0xa2, 0xaf, 0x01, 0x2c, 0xfe, 0xd4, 0xaf, \n\t0xa2, 0xed, 0xc0, 0x7f, 0x01, 0x03, 0x86, 0x6a, 0xfe, 0xfc, 0x9a, 0xff, \n\t0xfe, 0xb8, 0x7a, 0x77, 0x77, 0x7a, 0x01, 0x48, 0xff, 0x9b, 0x01, 0x04, \n\t0x69, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xd8, 0xff, 0xeb, 0x02, 0x89, \n\t0x05, 0xb6, 0x02, 0x26, 0x01, 0x93, 0x00, 0x00, 0x01, 0x07, 0x00, 0x6a, \n\t0xff, 0x2e, 0x00, 0x06, 0x00, 0x33, 0x00, 0xb2, 0x7f, 0x11, 0x01, 0x72, \n\t0xb4, 0xdf, 0x11, 0xef, 0x11, 0x02, 0x71, 0xb2, 0x5f, 0x11, 0x01, 0x72, \n\t0xb4, 0x2f, 0x11, 0x3f, 0x11, 0x02, 0x72, 0xb2, 0x7f, 0x14, 0x01, 0x72, \n\t0xb4, 0xdf, 0x14, 0xef, 0x14, 0x02, 0x71, 0xb2, 0x5f, 0x14, 0x01, 0x72, \n\t0xb4, 0x2f, 0x14, 0x3f, 0x14, 0x02, 0x72, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x8d, 0xff, 0xeb, 0x04, 0x26, 0x05, 0xb6, 0x02, 0x26, \n\t0x01, 0x9f, 0x00, 0x00, 0x01, 0x06, 0x00, 0x6a, 0x56, 0x06, 0x00, 0x33, \n\t0x00, 0xb2, 0x7f, 0x17, 0x01, 0x72, 0xb4, 0xdf, 0x17, 0xef, 0x17, 0x02, \n\t0x71, 0xb2, 0x5f, 0x17, 0x01, 0x72, 0xb4, 0x2f, 0x17, 0x3f, 0x17, 0x02, \n\t0x72, 0xb2, 0x7f, 0x1a, 0x01, 0x72, 0xb4, 0xdf, 0x1a, 0xef, 0x1a, 0x02, \n\t0x71, 0xb2, 0x5f, 0x1a, 0x01, 0x72, 0xb4, 0x2f, 0x1a, 0x3f, 0x1a, 0x02, \n\t0x72, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x61, 0xff, 0xeb, 0x04, 0x2a, \n\t0x06, 0x79, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, 0x00, 0x07, 0x01, 0x61, \n\t0x01, 0x4a, 0x00, 0x07, 0xff, 0xff, 0x00, 0x8d, 0xff, 0xeb, 0x04, 0x26, \n\t0x06, 0x66, 0x02, 0x26, 0x01, 0x9f, 0x00, 0x00, 0x00, 0x07, 0x01, 0x61, \n\t0x01, 0x5c, 0xff, 0xf4, 0xff, 0xff, 0x00, 0x6c, 0xff, 0xeb, 0x06, 0x60, \n\t0x06, 0x66, 0x02, 0x26, 0x01, 0xa3, 0x00, 0x00, 0x00, 0x07, 0x01, 0x61, \n\t0x02, 0x6a, 0xff, 0xf4, 0x00, 0x02, 0x00, 0x71, 0xff, 0xeb, 0x04, 0xb0, \n\t0x05, 0xc5, 0x00, 0x19, 0x00, 0x25, 0x00, 0x4d, 0x00, 0xb0, 0x10, 0x2f, \n\t0xb0, 0x17, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, \n\t0x04, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, \n\t0xb1, 0x0b, 0x06, 0x3e, 0x59, 0xb1, 0x14, 0x03, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x1d, 0x03, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x17, 0x10, 0xb1, \n\t0x24, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, \n\t0x31, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x10, 0x00, \n\t0x23, 0x22, 0x00, 0x11, 0x11, 0x37, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, \n\t0x37, 0x26, 0x24, 0x25, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x15, 0x14, \n\t0x16, 0x17, 0x37, 0x02, 0x09, 0xbd, 0x97, 0x9d, 0xb6, 0xfe, 0xcf, 0xf8, \n\t0xee, 0xfe, 0xd8, 0xc5, 0xb6, 0x9b, 0xa5, 0xbe, 0x02, 0xda, 0xfe, 0xf7, \n\t0x01, 0xe3, 0x49, 0x46, 0x42, 0x4d, 0x96, 0x82, 0x06, 0x04, 0x0c, 0x3e, \n\t0xac, 0xcf, 0xca, 0xb1, 0xfe, 0x06, 0xfe, 0xea, 0xfe, 0xb1, 0x01, 0x5c, \n\t0x01, 0x09, 0x02, 0x94, 0x02, 0xfd, 0x6a, 0xc8, 0xfc, 0xed, 0xd0, 0x08, \n\t0xfb, 0xfe, 0x6c, 0x6d, 0x6d, 0x6c, 0x40, 0x78, 0x9e, 0x04, 0x02, 0x00, \n\t0x00, 0x01, 0xff, 0xea, 0x00, 0x00, 0x04, 0x53, 0x05, 0xbb, 0x00, 0x23, \n\t0x00, 0x6a, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, \n\t0x03, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1c, 0x2f, 0x1b, \n\t0xb1, 0x1c, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, \n\t0x1b, 0xb1, 0x0f, 0x06, 0x3e, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x0a, 0x03, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x21, 0x0f, \n\t0x1c, 0x11, 0x12, 0x39, 0xb0, 0x21, 0x10, 0xb0, 0x0e, 0xd0, 0xb4, 0x4b, \n\t0x0e, 0x5b, 0x0e, 0x02, 0x5d, 0xb2, 0x8b, 0x0e, 0x01, 0x5d, 0xb0, 0x21, \n\t0x10, 0xb0, 0x11, 0xd0, 0xb4, 0x4b, 0x11, 0x5b, 0x11, 0x02, 0x5d, 0xb2, \n\t0x8b, 0x11, 0x01, 0x5d, 0xb0, 0x0a, 0x10, 0xb0, 0x15, 0xd0, 0x30, 0x31, \n\t0x01, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, \n\t0x06, 0x07, 0x01, 0x11, 0x23, 0x11, 0x01, 0x26, 0x26, 0x23, 0x22, 0x06, \n\t0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x13, 0x17, 0x33, 0x37, \n\t0x02, 0xe6, 0x33, 0x7b, 0x51, 0x22, 0x32, 0x1a, 0x17, 0x05, 0x16, 0x0d, \n\t0x21, 0x37, 0x10, 0xfe, 0xd4, 0xc4, 0xfe, 0xd4, 0x11, 0x37, 0x20, 0x0e, \n\t0x15, 0x05, 0x16, 0x18, 0x32, 0x23, 0x50, 0x7b, 0x34, 0xb2, 0x13, 0x06, \n\t0x13, 0x04, 0xd7, 0x7c, 0x68, 0x0a, 0x0e, 0x98, 0x03, 0x05, 0x23, 0x27, \n\t0xfd, 0x79, 0xfd, 0xbe, 0x02, 0x42, 0x02, 0x87, 0x27, 0x23, 0x05, 0x03, \n\t0x98, 0x0e, 0x0a, 0x68, 0x7c, 0xfe, 0x6a, 0x46, 0x46, 0x00, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x4e, 0xff, 0xeb, 0x06, 0x19, 0x04, 0x3a, 0x00, 0x16, \n\t0x00, 0x2c, 0x00, 0x5d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x15, 0x2f, \n\t0x1b, 0xb1, 0x15, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, \n\t0x2f, 0x1b, 0xb1, 0x07, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x06, 0x3e, 0x59, 0xb0, 0x15, 0x10, 0xb1, \n\t0x14, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x1b, 0xd0, 0xb0, 0x00, 0xd0, 0xb0, 0x0d, 0x10, 0xb1, 0x21, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x07, 0x10, 0xb1, \n\t0x2a, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, \n\t0x31, 0x01, 0x23, 0x16, 0x16, 0x15, 0x14, 0x02, 0x23, 0x22, 0x26, 0x27, \n\t0x06, 0x06, 0x23, 0x22, 0x02, 0x35, 0x34, 0x36, 0x37, 0x23, 0x35, 0x21, \n\t0x01, 0x26, 0x26, 0x27, 0x21, 0x06, 0x06, 0x07, 0x14, 0x16, 0x33, 0x32, \n\t0x36, 0x35, 0x35, 0x33, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x06, 0x19, \n\t0x85, 0x1d, 0x21, 0xae, 0xb8, 0x77, 0xa5, 0x28, 0x29, 0xa4, 0x76, 0xb9, \n\t0xad, 0x20, 0x1e, 0x6f, 0x05, 0xcb, 0xfe, 0xf4, 0x03, 0x28, 0x22, 0xfc, \n\t0xd1, 0x23, 0x28, 0x02, 0x53, 0x59, 0x62, 0x74, 0xc6, 0x73, 0x63, 0x57, \n\t0x54, 0x03, 0x9e, 0x51, 0xb6, 0x65, 0xfe, 0xfe, 0xb7, 0x79, 0x74, 0x75, \n\t0x78, 0x01, 0x49, 0xfe, 0x65, 0xb6, 0x51, 0x9c, 0xfd, 0xf8, 0x59, 0xb6, \n\t0x5d, 0x5e, 0xb6, 0x58, 0xbe, 0xef, 0xa2, 0xaf, 0xfa, 0xfa, 0xaf, 0xa2, \n\t0xee, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x7a, \n\t0x07, 0x22, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, \n\t0x00, 0xdd, 0x01, 0x5d, 0x00, 0x15, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x14, 0x3e, 0x59, 0xb2, 0x0f, 0x0e, 0x01, \n\t0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x7a, \n\t0x07, 0x0d, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x00, 0x6a, \n\t0x00, 0x72, 0x01, 0x5d, 0x00, 0x1d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, \n\t0x00, 0x01, 0x00, 0x29, 0xff, 0xf7, 0x05, 0xb4, 0x05, 0xb0, 0x00, 0x1c, \n\t0x00, 0x64, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1b, 0x2f, 0x1b, 0xb1, \n\t0x1b, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x17, 0x2f, 0x1b, \n\t0xb1, 0x17, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, \n\t0x1b, 0xb1, 0x0b, 0x06, 0x3e, 0x59, 0xb0, 0x1b, 0x10, 0xb1, 0x1a, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x01, 0xd0, \n\t0xb2, 0x05, 0x17, 0x1b, 0x11, 0x12, 0x39, 0xb0, 0x05, 0x2f, 0xb0, 0x0b, \n\t0x10, 0xb1, 0x0d, 0x05, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x05, 0x10, 0xb1, 0x13, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x11, 0x36, 0x36, 0x33, \n\t0x32, 0x04, 0x15, 0x14, 0x06, 0x2f, 0x02, 0x32, 0x36, 0x35, 0x26, 0x26, \n\t0x23, 0x22, 0x06, 0x07, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x04, 0x95, \n\t0xfd, 0xfa, 0x4f, 0x98, 0x36, 0xf6, 0x01, 0x12, 0xfe, 0xee, 0x05, 0x02, \n\t0xa2, 0x8c, 0x02, 0xa1, 0xa0, 0x3e, 0x99, 0x46, 0xc5, 0xfe, 0x5f, 0x04, \n\t0x6c, 0x05, 0x15, 0xfe, 0x34, 0x16, 0x1d, 0xf2, 0xd9, 0xd8, 0xe2, 0x03, \n\t0x02, 0x8d, 0x98, 0x90, 0x8f, 0x97, 0x19, 0x15, 0xfd, 0x57, 0x05, 0x15, \n\t0x9b, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x31, \n\t0x07, 0x1e, 0x02, 0x26, 0x01, 0x6e, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, \n\t0x01, 0x95, 0x01, 0x59, 0x00, 0x15, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x14, 0x3e, 0x59, 0xb2, 0x0f, 0x06, 0x01, \n\t0x5d, 0x30, 0x31, 0x00, 0x00, 0x01, 0x00, 0x87, 0xff, 0xec, 0x04, 0xd0, \n\t0x05, 0xc6, 0x00, 0x21, 0x00, 0x7a, 0x00, 0xb0, 0x17, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0c, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x06, 0x3e, 0x59, \n\t0xb0, 0x0b, 0x10, 0xb1, 0x13, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb2, 0x7f, 0x17, 0x01, 0x5d, 0xb2, 0xef, 0x17, 0x01, \n\t0x5d, 0xb2, 0xbf, 0x17, 0x01, 0x71, 0xb2, 0x3f, 0x17, 0x01, 0x72, 0xb2, \n\t0xef, 0x17, 0x01, 0x71, 0xb2, 0x1f, 0x17, 0x01, 0x71, 0xb2, 0xcf, 0x17, \n\t0x01, 0x5d, 0xb2, 0x2f, 0x17, 0x01, 0x5d, 0xb2, 0x8f, 0x17, 0x01, 0x72, \n\t0xb0, 0x17, 0x10, 0xb1, 0x19, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x1e, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x17, 0x16, 0x00, \n\t0x23, 0x22, 0x00, 0x11, 0x11, 0x10, 0x00, 0x33, 0x32, 0x00, 0x07, 0x07, \n\t0x23, 0x34, 0x26, 0x23, 0x22, 0x02, 0x15, 0x15, 0x21, 0x15, 0x21, 0x15, \n\t0x14, 0x12, 0x33, 0x32, 0x36, 0x35, 0x04, 0xca, 0x02, 0x04, 0xfe, 0xd8, \n\t0xf3, 0xf7, 0xfe, 0xc9, 0x01, 0x37, 0xf7, 0xf7, 0x01, 0x24, 0x04, 0x02, \n\t0xbd, 0xb4, 0xa4, 0xa5, 0xc4, 0x02, 0x32, 0xfd, 0xce, 0xc4, 0xa5, 0xa4, \n\t0xb4, 0x01, 0xd3, 0x06, 0xcd, 0xfe, 0xec, 0x01, 0x5e, 0x01, 0x0d, 0x01, \n\t0x03, 0x01, 0x0d, 0x01, 0x5f, 0xfe, 0xf9, 0xd9, 0x06, 0x99, 0xb2, 0xfe, \n\t0xf6, 0xc5, 0x2f, 0x9a, 0x3c, 0xc7, 0xfe, 0xf6, 0xb1, 0x9c, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x61, 0xff, 0xeb, 0x04, 0x92, 0x05, 0xc5, 0x00, 0x27, \n\t0x00, 0x51, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, \n\t0x09, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1d, 0x2f, 0x1b, \n\t0xb1, 0x1d, 0x06, 0x3e, 0x59, 0xb2, 0x17, 0x1d, 0x09, 0x11, 0x12, 0x39, \n\t0xb0, 0x17, 0x10, 0xb1, 0x03, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x09, 0x10, 0xb1, 0x11, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x1d, 0x10, 0xb1, 0x25, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, \n\t0x34, 0x26, 0x27, 0x26, 0x24, 0x35, 0x34, 0x24, 0x33, 0x32, 0x00, 0x07, \n\t0x07, 0x23, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x17, 0x16, \n\t0x16, 0x15, 0x14, 0x04, 0x23, 0x22, 0x24, 0x37, 0x37, 0x33, 0x14, 0x16, \n\t0x33, 0x32, 0x36, 0x03, 0xcd, 0x96, 0xbf, 0xe7, 0xfe, 0xfd, 0x01, 0x17, \n\t0xde, 0xef, 0x01, 0x1b, 0x05, 0x02, 0xbc, 0xa9, 0x9e, 0x93, 0x9d, 0xaa, \n\t0xbf, 0xe6, 0xf0, 0xfe, 0xe0, 0xe8, 0xda, 0xfe, 0xb1, 0x05, 0x02, 0xbc, \n\t0xce, 0x98, 0x95, 0xae, 0x01, 0x6f, 0x64, 0x87, 0x2e, 0x37, 0xd6, 0xa2, \n\t0xaa, 0xe4, 0xfe, 0xfa, 0xad, 0x06, 0x80, 0x9e, 0x85, 0x6b, 0x5f, 0x7f, \n\t0x30, 0x39, 0xde, 0xa4, 0xb0, 0xd6, 0xec, 0xc6, 0x06, 0x8c, 0x92, 0x7e, \n\t0xff, 0xff, 0x00, 0xbe, 0x00, 0x00, 0x01, 0x84, 0x05, 0xb0, 0x02, 0x06, \n\t0x00, 0x2c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xcb, 0x00, 0x00, 0x02, 0x7c, \n\t0x07, 0x0d, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x6a, \n\t0xff, 0x21, 0x01, 0x5d, 0x00, 0x1d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x3d, 0xff, 0xeb, 0x03, 0xc3, 0x05, 0xb0, 0x02, 0x06, \n\t0x00, 0x2d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x32, 0x00, 0x00, 0x08, 0x49, \n\t0x05, 0xb0, 0x00, 0x16, 0x00, 0x1f, 0x00, 0x69, 0x00, 0xb0, 0x01, 0x2f, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x06, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, \n\t0x06, 0x3e, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x0a, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0f, 0x10, 0xb1, 0x11, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x01, 0x10, \n\t0xb1, 0x17, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x09, 0x10, 0xb1, 0x18, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x11, 0x21, 0x32, 0x04, 0x15, 0x14, \n\t0x04, 0x23, 0x21, 0x11, 0x21, 0x03, 0x02, 0x02, 0x23, 0x23, 0x35, 0x33, \n\t0x32, 0x12, 0x13, 0x11, 0x01, 0x11, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, \n\t0x23, 0x04, 0xf7, 0x01, 0x67, 0xe8, 0x01, 0x03, 0xfe, 0xfd, 0xe8, 0xfd, \n\t0xd4, 0xfe, 0x08, 0x01, 0x01, 0xd7, 0xfb, 0x34, 0x28, 0x96, 0x84, 0x01, \n\t0x03, 0x82, 0x01, 0x67, 0x93, 0x93, 0x93, 0x93, 0x05, 0xb0, 0xfd, 0xc9, \n\t0xf7, 0xc6, 0xc6, 0xf6, 0x05, 0x15, 0xfd, 0xed, 0xfe, 0x6f, 0xfe, 0x8f, \n\t0x9a, 0x01, 0x1d, 0x01, 0x4b, 0x02, 0xae, 0xfd, 0x2f, 0xfd, 0xbb, 0xa9, \n\t0x7b, 0x79, 0xa8, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x08, 0x54, \n\t0x05, 0xb0, 0x00, 0x12, 0x00, 0x1b, 0x00, 0x6d, 0x00, 0xb0, 0x04, 0x2f, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x0c, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, \n\t0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, \n\t0x0f, 0x06, 0x3e, 0x59, 0xb0, 0x04, 0x10, 0xb0, 0x00, 0xd0, 0xb0, 0x00, \n\t0x2f, 0xb1, 0x0e, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x04, 0x10, 0xb1, 0x13, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0b, 0x10, 0xb1, 0x14, 0x03, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x11, \n\t0x33, 0x11, 0x21, 0x32, 0x04, 0x15, 0x14, 0x04, 0x23, 0x21, 0x11, 0x21, \n\t0x11, 0x23, 0x11, 0x33, 0x01, 0x11, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, \n\t0x23, 0x01, 0x79, 0x02, 0xc4, 0xc5, 0x01, 0x68, 0xe9, 0x01, 0x01, 0xfe, \n\t0xfe, 0xe8, 0xfd, 0xd3, 0xfd, 0x3c, 0xc5, 0xc5, 0x03, 0x89, 0x01, 0x68, \n\t0x93, 0x93, 0x93, 0x93, 0x03, 0x3b, 0x02, 0x75, 0xfd, 0x98, 0xe4, 0xbc, \n\t0xbd, 0xeb, 0x02, 0xa1, 0xfd, 0x5f, 0x05, 0xb0, 0xfc, 0xfd, 0xfd, 0xf8, \n\t0x94, 0x71, 0x70, 0x93, 0x00, 0x01, 0x00, 0x42, 0x00, 0x00, 0x05, 0xda, \n\t0x05, 0xb0, 0x00, 0x17, 0x00, 0x4e, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x16, 0x2f, 0x1b, 0xb1, 0x16, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x06, 0x3e, 0x59, 0xb0, 0x16, 0x10, \n\t0xb1, 0x15, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x01, 0xd0, 0xb2, 0x05, 0x12, 0x16, 0x11, 0x12, 0x39, 0xb0, 0x05, \n\t0x2f, 0xb0, 0x12, 0x10, 0xb0, 0x0a, 0xd0, 0xb0, 0x05, 0x10, 0xb1, 0x0e, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x01, 0x21, 0x11, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x23, 0x11, \n\t0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, \n\t0x04, 0xae, 0xfd, 0xf0, 0x4c, 0x9e, 0x69, 0xf0, 0xf9, 0xc5, 0x8b, 0x99, \n\t0x5a, 0xa7, 0x52, 0xc5, 0xfe, 0x69, 0x04, 0x6c, 0x05, 0x15, 0xfe, 0x4f, \n\t0x14, 0x14, 0xd4, 0xec, 0xfe, 0x34, 0x01, 0xcc, 0xa4, 0x80, 0x16, 0x14, \n\t0xfd, 0x3a, 0x05, 0x15, 0x9b, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, \n\t0x00, 0x00, 0x05, 0x20, 0x07, 0x1e, 0x02, 0x26, 0x00, 0x2e, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x76, 0x01, 0x89, 0x01, 0x59, 0x00, 0x15, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x14, 0x3e, 0x59, \n\t0xb2, 0x0f, 0x0f, 0x01, 0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0xb4, \n\t0x00, 0x00, 0x05, 0x01, 0x07, 0x22, 0x02, 0x26, 0x01, 0xc4, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x43, 0x01, 0x46, 0x01, 0x5d, 0x00, 0x15, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x14, 0x3e, 0x59, \n\t0xb2, 0x0f, 0x10, 0x01, 0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x55, \n\t0xff, 0xeb, 0x04, 0xc8, 0x07, 0x4e, 0x00, 0x26, 0x01, 0xcf, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x54, 0x00, 0xda, 0x01, 0x9e, 0x00, 0x10, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x1a, 0x2f, 0x1b, 0xb1, 0x1a, 0x12, 0x3e, 0x59, \n\t0x30, 0x31, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0x99, 0x05, 0x02, \n\t0x05, 0xb0, 0x00, 0x0b, 0x00, 0x49, 0x00, 0xb0, 0x08, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x06, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x06, \n\t0x3e, 0x59, 0xb1, 0x02, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x03, 0xd0, 0x30, 0x31, 0x13, 0x33, 0x11, 0x21, 0x11, \n\t0x33, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, 0xb4, 0xc5, 0x02, 0xc4, 0xc5, \n\t0xfe, 0x43, 0xc5, 0xfe, 0x34, 0x05, 0xb0, 0xfa, 0xea, 0x05, 0x16, 0xfa, \n\t0x50, 0xfe, 0x99, 0x01, 0x67, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x14, \n\t0x00, 0x00, 0x05, 0x1a, 0x05, 0xb0, 0x02, 0x06, 0x00, 0x24, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0xa3, 0x00, 0x00, 0x04, 0xbb, 0x05, 0xb0, 0x00, 0x0c, \n\t0x00, 0x15, 0x00, 0x4d, 0x00, 0xb0, 0x02, 0x2f, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x06, 0x3e, 0x59, 0xb0, 0x0b, \n\t0x10, 0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x02, 0x10, 0xb1, 0x0d, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x09, 0x10, 0xb1, 0x0e, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x11, \n\t0x21, 0x32, 0x04, 0x15, 0x14, 0x04, 0x23, 0x21, 0x11, 0x21, 0x01, 0x11, \n\t0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x04, 0x20, 0xfd, 0x48, 0x01, \n\t0x67, 0xe9, 0x01, 0x03, 0xfe, 0xfc, 0xe8, 0xfd, 0xd4, 0x03, 0x7d, 0xfd, \n\t0x48, 0x01, 0x67, 0x93, 0x94, 0x93, 0x94, 0x05, 0x15, 0xfe, 0x5b, 0xef, \n\t0xc5, 0xc6, 0xf6, 0x05, 0xb0, 0xfd, 0x25, 0xfd, 0xc5, 0xa9, 0x7b, 0x77, \n\t0xa0, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xaf, \n\t0x05, 0xb0, 0x02, 0x06, 0x00, 0x25, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, \n\t0x00, 0x00, 0x04, 0x31, 0x05, 0xb0, 0x02, 0x06, 0x01, 0x6e, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x30, 0xfe, 0x99, 0x05, 0xd5, 0x05, 0xb0, 0x00, 0x0e, \n\t0x00, 0x15, 0x00, 0x4a, 0x00, 0xb0, 0x06, 0x2f, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x06, 0x3e, 0x59, 0xb1, 0x12, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, \n\t0xd0, 0xb0, 0x06, 0x10, 0xb0, 0x03, 0xd0, 0xb0, 0x12, 0x10, 0xb0, 0x09, \n\t0xd0, 0xb0, 0x0d, 0x10, 0xb1, 0x15, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x25, 0x33, 0x03, 0x23, 0x11, 0x21, \n\t0x11, 0x23, 0x03, 0x33, 0x36, 0x12, 0x13, 0x13, 0x21, 0x01, 0x06, 0x02, \n\t0x07, 0x21, 0x11, 0x21, 0x05, 0x0d, 0xc8, 0x14, 0xb1, 0xfb, 0xe5, 0xa7, \n\t0x1e, 0x7d, 0x4d, 0x80, 0x06, 0x21, 0x03, 0x6c, 0xfd, 0x3a, 0x09, 0x66, \n\t0x50, 0x02, 0xc0, 0xfe, 0x16, 0x9a, 0xfe, 0x01, 0x01, 0x65, 0xfe, 0x99, \n\t0x02, 0x01, 0x57, 0x01, 0x51, 0x01, 0x21, 0x02, 0x4d, 0xfd, 0xb3, 0xee, \n\t0xfe, 0x96, 0x71, 0x04, 0x7b, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, \n\t0x00, 0x00, 0x04, 0x7a, 0x05, 0xb0, 0x02, 0x06, 0x00, 0x28, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x1c, 0x00, 0x00, 0x07, 0x32, 0x05, 0xb0, 0x00, 0x15, \n\t0x00, 0x66, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, \n\t0x0a, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, \n\t0xb1, 0x03, 0x06, 0x3e, 0x59, 0xb0, 0x0a, 0x10, 0xb0, 0x0d, 0xd0, 0xb2, \n\t0x0c, 0x03, 0x0d, 0x11, 0x12, 0x39, 0xb0, 0x0c, 0x2f, 0xb2, 0xcf, 0x0c, \n\t0x01, 0x5d, 0xb1, 0x04, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x01, 0xd0, 0xb0, 0x03, 0x10, 0xb0, 0x06, 0xd0, 0xb2, \n\t0x08, 0x04, 0x0c, 0x11, 0x12, 0x39, 0xb0, 0x0c, 0x10, 0xb0, 0x0f, 0xd0, \n\t0xb0, 0x0d, 0x10, 0xb0, 0x11, 0xd0, 0xb0, 0x08, 0x10, 0xb0, 0x13, 0xd0, \n\t0xb0, 0x03, 0x10, 0xb0, 0x15, 0xd0, 0x30, 0x31, 0x01, 0x23, 0x11, 0x23, \n\t0x11, 0x23, 0x01, 0x23, 0x01, 0x01, 0x33, 0x01, 0x33, 0x11, 0x33, 0x11, \n\t0x33, 0x01, 0x33, 0x01, 0x01, 0x23, 0x04, 0xa7, 0x99, 0xc5, 0xa2, 0xfe, \n\t0x6b, 0xf6, 0x01, 0xe7, 0xfe, 0x42, 0xe6, 0x01, 0x7a, 0xa4, 0xc5, 0x9c, \n\t0x01, 0x7a, 0xe6, 0xfe, 0x41, 0x01, 0xe7, 0xf5, 0x02, 0x9c, 0xfd, 0x64, \n\t0x02, 0x9c, 0xfd, 0x64, 0x03, 0x02, 0x02, 0xae, 0xfd, 0x87, 0x02, 0x79, \n\t0xfd, 0x87, 0x02, 0x79, 0xfd, 0x53, 0xfc, 0xfd, 0x00, 0x01, 0x00, 0x78, \n\t0xff, 0xeb, 0x04, 0xdf, 0x05, 0xc5, 0x00, 0x2a, 0x00, 0x72, 0x00, 0xb0, \n\t0x19, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x28, 0x2f, 0x1b, 0xb1, 0x28, \n\t0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, \n\t0x09, 0x06, 0x3e, 0x59, 0xb2, 0xcf, 0x19, 0x01, 0x5d, 0xb2, 0x1f, 0x19, \n\t0x01, 0x71, 0xb2, 0xbf, 0x19, 0x01, 0x71, 0xb2, 0xef, 0x19, 0x01, 0x5d, \n\t0xb2, 0x7f, 0x19, 0x01, 0x5d, 0xb2, 0x2f, 0x19, 0x01, 0x5d, 0xb0, 0x19, \n\t0x10, 0xb1, 0x18, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb2, 0x03, 0x18, 0x19, 0x11, 0x12, 0x39, 0xb0, 0x09, 0x10, 0xb1, \n\t0x11, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x28, 0x10, 0xb1, 0x20, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0x30, 0x31, 0x01, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, 0x14, \n\t0x04, 0x21, 0x22, 0x24, 0x37, 0x37, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, \n\t0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, \n\t0x23, 0x22, 0x06, 0x15, 0x23, 0x27, 0x26, 0x24, 0x33, 0x20, 0x04, 0x04, \n\t0xc9, 0x88, 0x78, 0x87, 0x8f, 0xfe, 0xc1, 0xfe, 0xfe, 0xe2, 0xfe, 0xbc, \n\t0x05, 0x02, 0xbc, 0xc6, 0x9d, 0xb2, 0xca, 0xb8, 0xb4, 0xb7, 0xb7, 0xae, \n\t0xa8, 0xb5, 0xb1, 0x8d, 0xc1, 0xbc, 0x01, 0x06, 0x01, 0x31, 0xe0, 0x01, \n\t0x01, 0x01, 0x2a, 0x04, 0x26, 0x65, 0xa7, 0x2f, 0x2a, 0xae, 0x7d, 0xc9, \n\t0xe2, 0xd6, 0xcd, 0x06, 0x72, 0x9d, 0x95, 0x78, 0x85, 0x81, 0x9c, 0x84, \n\t0x72, 0x70, 0x90, 0x8e, 0x69, 0x06, 0xb0, 0xdc, 0xd8, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x01, 0x05, 0xb0, 0x00, 0x0b, \n\t0x00, 0x77, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, \n\t0x00, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, \n\t0xb1, 0x08, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, \n\t0x1b, 0xb1, 0x02, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, \n\t0x2f, 0x1b, 0xb1, 0x06, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x10, 0xb0, 0x05, \n\t0xd0, 0x40, 0x0b, 0x5c, 0x05, 0x6c, 0x05, 0x7c, 0x05, 0x8c, 0x05, 0x9c, \n\t0x05, 0x05, 0x5d, 0x40, 0x09, 0x1b, 0x05, 0x2b, 0x05, 0x3b, 0x05, 0x4b, \n\t0x05, 0x04, 0x5d, 0xb0, 0x06, 0x10, 0xb0, 0x0b, 0xd0, 0x40, 0x09, 0x14, \n\t0x0b, 0x24, 0x0b, 0x34, 0x0b, 0x44, 0x0b, 0x04, 0x5d, 0x40, 0x0b, 0x53, \n\t0x0b, 0x63, 0x0b, 0x73, 0x0b, 0x83, 0x0b, 0x93, 0x0b, 0x05, 0x5d, 0x30, \n\t0x31, 0x01, 0x33, 0x11, 0x23, 0x11, 0x27, 0x01, 0x23, 0x11, 0x33, 0x11, \n\t0x17, 0x04, 0x3c, 0xc5, 0xc5, 0x06, 0xfd, 0x43, 0xc5, 0xc5, 0x06, 0x05, \n\t0xb0, 0xfa, 0x50, 0x04, 0x56, 0x02, 0xfb, 0xa8, 0x05, 0xb0, 0xfb, 0xab, \n\t0x02, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x01, \n\t0x07, 0x4e, 0x02, 0x26, 0x01, 0xc4, 0x00, 0x00, 0x01, 0x07, 0x01, 0x54, \n\t0x01, 0x31, 0x01, 0x9e, 0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x20, 0x05, 0xb0, 0x02, 0x06, \n\t0x00, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x31, 0x00, 0x00, 0x04, 0xf7, \n\t0x05, 0xb0, 0x00, 0x0f, 0x00, 0x48, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x06, 0x3e, 0x59, 0xb0, 0x00, \n\t0x10, 0xb1, 0x03, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x08, 0x10, 0xb1, 0x0a, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x11, 0x23, 0x11, 0x21, 0x03, \n\t0x10, 0x02, 0x23, 0x23, 0x35, 0x33, 0x32, 0x12, 0x13, 0x13, 0x04, 0xf7, \n\t0xc5, 0xfd, 0xf2, 0x01, 0xce, 0xef, 0x35, 0x29, 0x8a, 0x7a, 0x01, 0x01, \n\t0x05, 0xb0, 0xfa, 0x50, 0x05, 0x15, 0xfd, 0xed, 0xfe, 0x70, 0xfe, 0x8e, \n\t0x9a, 0x01, 0x1d, 0x01, 0x4b, 0x02, 0xae, 0x00, 0xff, 0xff, 0x00, 0xb4, \n\t0x00, 0x00, 0x06, 0x52, 0x05, 0xb0, 0x02, 0x06, 0x00, 0x30, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x01, 0x05, 0xb0, 0x02, 0x06, \n\t0x00, 0x2b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x71, 0xff, 0xeb, 0x05, 0x02, \n\t0x05, 0xc5, 0x02, 0x06, 0x00, 0x32, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, \n\t0x00, 0x00, 0x05, 0x03, 0x05, 0xb0, 0x02, 0x06, 0x01, 0x7b, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xcc, 0x05, 0xb0, 0x02, 0x06, \n\t0x00, 0x33, 0x00, 0x00, 0xff, 0xff, 0x00, 0x76, 0xff, 0xeb, 0x04, 0xbf, \n\t0x05, 0xc5, 0x02, 0x06, 0x00, 0x26, 0x00, 0x00, 0xff, 0xff, 0x00, 0x22, \n\t0x00, 0x00, 0x04, 0x8e, 0x05, 0xb0, 0x02, 0x06, 0x00, 0x37, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x55, 0xff, 0xeb, 0x04, 0xc8, 0x05, 0xb0, 0x00, 0x15, \n\t0x00, 0x4d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x15, 0x2f, 0x1b, 0xb1, \n\t0x15, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, \n\t0xb1, 0x08, 0x06, 0x3e, 0x59, 0xb2, 0x01, 0x08, 0x15, 0x11, 0x12, 0x39, \n\t0xb4, 0x85, 0x01, 0x95, 0x01, 0x02, 0x5d, 0xb0, 0x15, 0x10, 0xb0, 0x03, \n\t0xd0, 0xb0, 0x08, 0x10, 0xb1, 0x0f, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x01, 0x10, 0xb0, 0x13, 0xd0, 0xb4, 0x8a, \n\t0x13, 0x9a, 0x13, 0x02, 0x5d, 0x30, 0x31, 0x01, 0x17, 0x33, 0x01, 0x33, \n\t0x01, 0x06, 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, \n\t0x36, 0x37, 0x37, 0x01, 0x33, 0x02, 0x4c, 0x49, 0x06, 0x01, 0x48, 0xe5, \n\t0xfe, 0x03, 0x3b, 0x8b, 0x98, 0x19, 0x43, 0x09, 0x05, 0x0a, 0x43, 0x11, \n\t0x47, 0x3d, 0x26, 0x28, 0xfe, 0x18, 0xdd, 0x03, 0x07, 0xbc, 0x03, 0x65, \n\t0xfb, 0x3f, 0x83, 0x81, 0x06, 0x03, 0x95, 0x02, 0x02, 0x48, 0x50, 0x54, \n\t0x04, 0x3f, 0x00, 0x00, 0x00, 0x03, 0x00, 0x55, 0xff, 0xc4, 0x05, 0xed, \n\t0x05, 0xec, 0x00, 0x15, 0x00, 0x1e, 0x00, 0x27, 0x00, 0x4f, 0x00, 0xb0, \n\t0x0a, 0x2f, 0xb0, 0x14, 0x2f, 0xb2, 0x40, 0x14, 0x01, 0x5d, 0xb2, 0x12, \n\t0x14, 0x0a, 0x11, 0x12, 0x39, 0xb0, 0x12, 0x2f, 0xb0, 0x01, 0xd0, 0xb2, \n\t0x0c, 0x0a, 0x14, 0x11, 0x12, 0x39, 0xb0, 0x0c, 0x2f, 0xb0, 0x07, 0xd0, \n\t0xb0, 0x12, 0x10, 0xb1, 0x16, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x0c, 0x10, 0xb1, 0x1c, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x21, 0xd0, 0xb0, 0x16, 0x10, \n\t0xb0, 0x27, 0xd0, 0x30, 0x31, 0x01, 0x33, 0x32, 0x00, 0x11, 0x10, 0x00, \n\t0x23, 0x23, 0x15, 0x23, 0x35, 0x23, 0x22, 0x00, 0x11, 0x10, 0x00, 0x33, \n\t0x33, 0x35, 0x33, 0x03, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x33, 0x11, \n\t0x33, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x03, 0x84, 0x1a, \n\t0xfc, 0x01, 0x53, 0xfe, 0xad, 0xfc, 0x1a, 0xc5, 0x1d, 0xfd, 0xfe, 0xb0, \n\t0x01, 0x51, 0xfc, 0x1d, 0xc5, 0xe2, 0xbd, 0xcd, 0xcd, 0xbd, 0x1d, 0xc5, \n\t0x1c, 0xba, 0xcf, 0xcf, 0xba, 0x05, 0x1f, 0xfe, 0xb7, 0xfe, 0xff, 0xfe, \n\t0xfd, 0xfe, 0xb6, 0xc4, 0xc4, 0x01, 0x48, 0x01, 0x03, 0x01, 0x01, 0x01, \n\t0x4b, 0xcd, 0xfe, 0x98, 0xea, 0xc7, 0xc9, 0xe8, 0x03, 0x62, 0xfc, 0x9e, \n\t0xea, 0xc9, 0xc6, 0xe9, 0xff, 0xff, 0x00, 0x42, 0x00, 0x00, 0x04, 0xd6, \n\t0x05, 0xb0, 0x02, 0x06, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb5, \n\t0xfe, 0x99, 0x05, 0xd8, 0x05, 0xb0, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x35, \n\t0x00, 0xb0, 0x01, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, \n\t0xb1, 0x05, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, \n\t0x1b, 0xb1, 0x0b, 0x06, 0x3e, 0x59, 0xb1, 0x06, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0xd0, 0xb0, 0x05, 0x10, \n\t0xb0, 0x08, 0xd0, 0x30, 0x31, 0x01, 0x23, 0x11, 0x33, 0x01, 0x33, 0x11, \n\t0x21, 0x11, 0x33, 0x11, 0x21, 0x05, 0xd8, 0xc5, 0xc5, 0xfa, 0xdd, 0xc6, \n\t0x02, 0xc4, 0xc5, 0xfb, 0xb1, 0xfe, 0x99, 0x02, 0x07, 0x05, 0x10, 0xfa, \n\t0xeb, 0x05, 0x15, 0xfa, 0x50, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x93, \n\t0x00, 0x00, 0x04, 0xcc, 0x05, 0xb0, 0x00, 0x13, 0x00, 0x3c, 0x00, 0xb0, \n\t0x0f, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, \n\t0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, \n\t0x0a, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, \n\t0xb1, 0x01, 0x06, 0x3e, 0x59, 0xb0, 0x0f, 0x10, 0xb1, 0x06, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x11, \n\t0x23, 0x11, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, \n\t0x16, 0x33, 0x32, 0x36, 0x37, 0x11, 0x04, 0xcc, 0xc5, 0x5f, 0xb2, 0x7a, \n\t0xf1, 0xf8, 0xc6, 0x8a, 0x99, 0x68, 0xc0, 0x63, 0x05, 0xb0, 0xfa, 0x50, \n\t0x02, 0x5b, 0x1d, 0x1a, 0xd3, 0xed, 0x01, 0xcc, 0xfe, 0x34, 0xa5, 0x7f, \n\t0x1c, 0x1b, 0x02, 0xb9, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x06, 0xd8, \n\t0x05, 0xb0, 0x00, 0x0b, 0x00, 0x3b, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x06, 0x3e, 0x59, 0xb1, 0x01, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, \n\t0xb0, 0x03, 0xd0, 0xb0, 0x01, 0x10, 0xb0, 0x05, 0xd0, 0xb0, 0x03, 0x10, \n\t0xb0, 0x07, 0xd0, 0x30, 0x31, 0x01, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, \n\t0x11, 0x33, 0x11, 0x21, 0x11, 0x01, 0x79, 0x01, 0xec, 0xc4, 0x01, 0xea, \n\t0xc5, 0xf9, 0xdc, 0x05, 0xb0, 0xfa, 0xea, 0x05, 0x16, 0xfa, 0xea, 0x05, \n\t0x16, 0xfa, 0x50, 0x05, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, \n\t0xfe, 0xa1, 0x07, 0x73, 0x05, 0xb0, 0x00, 0x0f, 0x00, 0x3e, 0x00, 0xb0, \n\t0x0c, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, \n\t0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, \n\t0x0d, 0x06, 0x3e, 0x59, 0xb1, 0x06, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x02, 0xd0, 0xb0, 0x00, 0x10, 0xb0, 0x03, \n\t0xd0, 0xb0, 0x07, 0xd0, 0xb0, 0x06, 0x10, 0xb0, 0x09, 0xd0, 0x30, 0x31, \n\t0x01, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x03, \n\t0x23, 0x11, 0x21, 0x11, 0x01, 0x79, 0x01, 0xec, 0xc4, 0x01, 0xea, 0xc5, \n\t0x9b, 0x14, 0xaf, 0xfa, 0x04, 0x05, 0xb0, 0xfa, 0xea, 0x05, 0x16, 0xfa, \n\t0xea, 0x05, 0x16, 0xfa, 0xeb, 0xfe, 0x06, 0x01, 0x5f, 0x05, 0xb0, 0x00, \n\t0x00, 0x02, 0x00, 0x16, 0x00, 0x00, 0x05, 0xbc, 0x05, 0xb0, 0x00, 0x0c, \n\t0x00, 0x15, 0x00, 0x54, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, \n\t0x1b, 0xb1, 0x01, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, \n\t0x2f, 0x1b, 0xb1, 0x0a, 0x06, 0x3e, 0x59, 0xb2, 0x02, 0x0a, 0x01, 0x11, \n\t0x12, 0x39, 0xb0, 0x02, 0x2f, 0xb0, 0x01, 0x10, 0xb1, 0x0b, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x02, 0x10, 0xb1, \n\t0x0d, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x0a, 0x10, 0xb1, 0x0e, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0x30, 0x31, 0x13, 0x21, 0x11, 0x21, 0x32, 0x04, 0x15, 0x14, \n\t0x04, 0x23, 0x21, 0x11, 0x21, 0x01, 0x11, 0x21, 0x32, 0x36, 0x35, 0x34, \n\t0x26, 0x23, 0x16, 0x02, 0x53, 0x01, 0x67, 0xea, 0x01, 0x02, 0xfe, 0xfd, \n\t0xe9, 0xfd, 0xd4, 0xfe, 0x72, 0x02, 0x53, 0x01, 0x67, 0x94, 0x93, 0x93, \n\t0x94, 0x05, 0xb0, 0xfd, 0xac, 0xe6, 0xc4, 0xc4, 0xee, 0x05, 0x15, 0xfd, \n\t0xac, 0xfd, 0xd9, 0xa0, 0x7a, 0x76, 0x97, 0x00, 0x00, 0x03, 0x00, 0xb4, \n\t0x00, 0x00, 0x06, 0x43, 0x05, 0xb0, 0x00, 0x0a, 0x00, 0x13, 0x00, 0x17, \n\t0x00, 0x5c, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, \n\t0x09, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x16, 0x2f, 0x1b, \n\t0xb1, 0x16, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, \n\t0x1b, 0xb1, 0x07, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x14, \n\t0x2f, 0x1b, 0xb1, 0x14, 0x06, 0x3e, 0x59, 0xb2, 0x00, 0x07, 0x09, 0x11, \n\t0x12, 0x39, 0xb0, 0x00, 0x2f, 0xb1, 0x0b, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x07, 0x10, 0xb1, 0x0c, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, \n\t0x32, 0x04, 0x15, 0x14, 0x04, 0x23, 0x21, 0x11, 0x33, 0x11, 0x11, 0x21, \n\t0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x01, 0x23, 0x11, 0x33, 0x01, 0x79, \n\t0x01, 0x67, 0xe9, 0x01, 0x03, 0xfe, 0xfc, 0xe8, 0xfd, 0xd4, 0xc5, 0x01, \n\t0x67, 0x93, 0x94, 0x93, 0x94, 0x03, 0x63, 0xc6, 0xc6, 0x03, 0x70, 0xef, \n\t0xc5, 0xc6, 0xf6, 0x05, 0xb0, 0xfd, 0x25, 0xfd, 0xc5, 0xa9, 0x7b, 0x77, \n\t0xa0, 0xfd, 0x2b, 0x05, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa3, \n\t0x00, 0x00, 0x04, 0xbb, 0x05, 0xb0, 0x00, 0x0a, 0x00, 0x13, 0x00, 0x42, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0c, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, \n\t0x06, 0x3e, 0x59, 0xb2, 0x00, 0x08, 0x0a, 0x11, 0x12, 0x39, 0xb0, 0x00, \n\t0x2f, 0xb1, 0x0b, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x08, 0x10, 0xb1, 0x0c, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x32, 0x04, 0x15, 0x14, \n\t0x04, 0x23, 0x21, 0x11, 0x33, 0x11, 0x11, 0x21, 0x32, 0x36, 0x35, 0x34, \n\t0x26, 0x23, 0x01, 0x68, 0x01, 0x67, 0xea, 0x01, 0x02, 0xfe, 0xfd, 0xe9, \n\t0xfd, 0xd4, 0xc5, 0x01, 0x67, 0x94, 0x93, 0x93, 0x94, 0x03, 0x5c, 0xe6, \n\t0xc4, 0xc4, 0xee, 0x05, 0xb0, 0xfd, 0x11, 0xfd, 0xd9, 0xa0, 0x7a, 0x76, \n\t0x97, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb5, 0xff, 0xec, 0x04, 0xff, \n\t0x05, 0xc6, 0x00, 0x21, 0x00, 0x54, 0x00, 0xb0, 0x1a, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x06, 0x3e, 0x59, \n\t0xb1, 0x13, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb2, 0xef, 0x1a, 0x01, 0x5d, 0xb2, 0x2f, 0x1a, 0x01, 0x5d, 0xb0, 0x1a, \n\t0x10, 0xb1, 0x17, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x04, 0x10, 0xb1, 0x1e, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x13, 0x27, 0x26, 0x00, 0x33, 0x32, \n\t0x00, 0x11, 0x11, 0x10, 0x00, 0x23, 0x22, 0x00, 0x37, 0x37, 0x33, 0x14, \n\t0x16, 0x33, 0x32, 0x12, 0x35, 0x35, 0x21, 0x35, 0x21, 0x35, 0x34, 0x02, \n\t0x23, 0x22, 0x06, 0x15, 0xbc, 0x02, 0x05, 0x01, 0x29, 0xf2, 0xf7, 0x01, \n\t0x38, 0xfe, 0xc8, 0xf7, 0xf7, 0xfe, 0xdc, 0x05, 0x02, 0xbd, 0xb2, 0xa5, \n\t0xa4, 0xc5, 0xfd, 0xc2, 0x02, 0x3e, 0xc5, 0xa4, 0xa5, 0xb2, 0x03, 0xde, \n\t0x06, 0xcb, 0x01, 0x17, 0xfe, 0xa1, 0xfe, 0xf3, 0xfe, 0xfd, 0xfe, 0xf2, \n\t0xfe, 0xa3, 0x01, 0x05, 0xda, 0x06, 0x9a, 0xb1, 0x01, 0x09, 0xc6, 0x51, \n\t0x9b, 0x19, 0xc6, 0x01, 0x0b, 0xb2, 0x9b, 0x00, 0x00, 0x02, 0x00, 0xbe, \n\t0xff, 0xeb, 0x06, 0xe2, 0x05, 0xc5, 0x00, 0x15, 0x00, 0x23, 0x00, 0xa6, \n\t0x00, 0xb0, 0x0d, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, \n\t0xb1, 0x12, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, \n\t0x1b, 0xb1, 0x0c, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, \n\t0x2f, 0x1b, 0xb1, 0x03, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x06, 0x3e, 0x59, 0xb2, 0x5f, 0x0d, 0x01, \n\t0x5d, 0xb2, 0xaf, 0x0d, 0x01, 0x5d, 0xb4, 0x1f, 0x0d, 0x2f, 0x0d, 0x02, \n\t0x71, 0xb2, 0xcf, 0x0d, 0x01, 0x71, 0xb4, 0xef, 0x0d, 0xff, 0x0d, 0x02, \n\t0x71, 0xb4, 0x9f, 0x0d, 0xaf, 0x0d, 0x02, 0x71, 0x40, 0x09, 0xcf, 0x0d, \n\t0xdf, 0x0d, 0xef, 0x0d, 0xff, 0x0d, 0x04, 0x5d, 0xb2, 0x7f, 0x0d, 0x01, \n\t0x5d, 0xb2, 0x2f, 0x0d, 0x01, 0x5d, 0xb2, 0x0f, 0x0d, 0x01, 0x5d, 0xb0, \n\t0x0d, 0x10, 0xb1, 0x08, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x12, 0x10, 0xb1, 0x19, 0x03, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x20, 0x03, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x10, \n\t0x00, 0x21, 0x22, 0x00, 0x11, 0x35, 0x23, 0x11, 0x23, 0x11, 0x33, 0x11, \n\t0x33, 0x35, 0x10, 0x00, 0x33, 0x20, 0x00, 0x11, 0x27, 0x34, 0x02, 0x23, \n\t0x22, 0x02, 0x15, 0x11, 0x14, 0x12, 0x33, 0x32, 0x36, 0x35, 0x06, 0xe2, \n\t0xfe, 0xb5, 0xfe, 0xf8, 0xff, 0xfe, 0xc1, 0xcd, 0xc6, 0xc6, 0xcd, 0x01, \n\t0x3f, 0xff, 0x01, 0x08, 0x01, 0x4b, 0xc5, 0xd8, 0xb6, 0xac, 0xcd, 0xcd, \n\t0xac, 0xb7, 0xd7, 0x02, 0x56, 0xfe, 0xf5, 0xfe, 0xa0, 0x01, 0x60, 0x01, \n\t0x0b, 0x22, 0xfd, 0x88, 0x05, 0xb0, 0xfd, 0x62, 0x47, 0x01, 0x0a, 0x01, \n\t0x62, 0xfe, 0x9f, 0xfe, 0xf5, 0x02, 0xc8, 0x01, 0x00, 0xff, 0x00, 0xc8, \n\t0xfe, 0xfb, 0xca, 0xff, 0x00, 0xff, 0xcb, 0x00, 0x00, 0x02, 0x00, 0x63, \n\t0x00, 0x00, 0x04, 0x6e, 0x05, 0xb0, 0x00, 0x0d, 0x00, 0x16, 0x00, 0x5d, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0c, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, \n\t0x06, 0x3e, 0x59, 0xb2, 0x16, 0x00, 0x09, 0x11, 0x12, 0x39, 0xb0, 0x16, \n\t0x2f, 0xb4, 0x0f, 0x16, 0x1f, 0x16, 0x02, 0x5d, 0xb4, 0x3f, 0x16, 0x4f, \n\t0x16, 0x02, 0x5d, 0xb1, 0x0c, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb2, 0x02, 0x0c, 0x16, 0x11, 0x12, 0x39, 0xb0, 0x00, \n\t0x10, 0xb0, 0x0b, 0xd0, 0xb0, 0x09, 0x10, 0xb1, 0x0e, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x21, 0x23, 0x01, \n\t0x26, 0x26, 0x35, 0x34, 0x24, 0x33, 0x21, 0x11, 0x23, 0x11, 0x21, 0x01, \n\t0x21, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x21, 0x01, 0x34, 0xd1, 0x01, \n\t0x55, 0x8d, 0x93, 0x01, 0x13, 0xf1, 0x01, 0xd2, 0xc5, 0xfe, 0xba, 0x01, \n\t0x46, 0xfe, 0xf3, 0x9c, 0xa3, 0xa4, 0x99, 0x01, 0x0f, 0x02, 0x6e, 0x36, \n\t0xc8, 0x8e, 0xd0, 0xe6, 0xfa, 0x50, 0x02, 0x39, 0x02, 0xdc, 0x96, 0x83, \n\t0x83, 0xa4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6a, 0xff, 0xeb, 0x03, 0xf3, \n\t0x04, 0x4e, 0x02, 0x06, 0x00, 0x44, 0x00, 0x00, 0x00, 0x02, 0x00, 0x61, \n\t0xff, 0xeb, 0x04, 0x2a, 0x06, 0x11, 0x00, 0x1c, 0x00, 0x2a, 0x00, 0x62, \n\t0x00, 0xb0, 0x11, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, \n\t0xb1, 0x07, 0x06, 0x3e, 0x59, 0xb2, 0x0f, 0x11, 0x01, 0x5d, 0xb2, 0x2f, \n\t0x11, 0x01, 0x5d, 0xb2, 0x00, 0x11, 0x07, 0x11, 0x12, 0x39, 0xb0, 0x00, \n\t0x2f, 0xb2, 0x16, 0x00, 0x11, 0x11, 0x12, 0x39, 0xb0, 0x16, 0x2f, 0xb1, \n\t0x0e, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, \n\t0x1a, 0x00, 0x07, 0x11, 0x12, 0x39, 0xb0, 0x00, 0x10, 0xb1, 0x1d, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x07, 0x10, \n\t0xb1, 0x24, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x01, 0x32, 0x12, 0x15, 0x15, 0x14, 0x00, 0x23, 0x22, 0x00, \n\t0x35, 0x35, 0x10, 0x00, 0x37, 0x36, 0x36, 0x35, 0x33, 0x17, 0x16, 0x06, \n\t0x07, 0x06, 0x06, 0x07, 0x17, 0x36, 0x36, 0x17, 0x22, 0x06, 0x15, 0x15, \n\t0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x02, 0x6b, 0xcf, \n\t0xf0, 0xfe, 0xfc, 0xe0, 0xe0, 0xfe, 0xfb, 0x01, 0x0d, 0xe2, 0x7e, 0x71, \n\t0x98, 0x02, 0x03, 0xac, 0xbb, 0x88, 0xc2, 0x16, 0x04, 0x3b, 0xb2, 0x3e, \n\t0x8d, 0x90, 0x90, 0x8f, 0x8d, 0x92, 0x93, 0x03, 0xfc, 0xfe, 0xed, 0xd7, \n\t0x16, 0xe9, 0xfe, 0xd8, 0x01, 0x28, 0xe9, 0x8c, 0x01, 0x40, 0x01, 0x7c, \n\t0x2d, 0x17, 0x40, 0x49, 0x06, 0xb0, 0x6e, 0x20, 0x17, 0xa4, 0x9f, 0x05, \n\t0x3f, 0x4f, 0x9a, 0xc0, 0x90, 0x16, 0xa3, 0xd4, 0xd4, 0xa3, 0x16, 0x90, \n\t0xc0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x90, 0x00, 0x00, 0x04, 0x23, \n\t0x04, 0x3a, 0x00, 0x0e, 0x00, 0x17, 0x00, 0x20, 0x00, 0x92, 0x00, 0xb0, \n\t0x18, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, \n\t0x00, 0x06, 0x3e, 0x59, 0xb4, 0xbf, 0x18, 0xcf, 0x18, 0x02, 0x5d, 0xb2, \n\t0x2f, 0x18, 0x01, 0x71, 0xb2, 0x9f, 0x18, 0x01, 0x71, 0xb2, 0xff, 0x18, \n\t0x01, 0x71, 0xb2, 0x6f, 0x18, 0x01, 0x72, 0xb2, 0xdf, 0x18, 0x01, 0x72, \n\t0xb2, 0x3f, 0x18, 0x01, 0x72, 0xb2, 0xcf, 0x18, 0x01, 0x71, 0xb2, 0x6f, \n\t0x18, 0x01, 0x71, 0xb2, 0xff, 0x18, 0x01, 0x5d, 0xb2, 0x5f, 0x18, 0x01, \n\t0x5d, 0xb2, 0x2f, 0x18, 0x01, 0x5d, 0xb0, 0x18, 0x10, 0xb1, 0x0f, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x08, 0x0f, \n\t0x18, 0x11, 0x12, 0x39, 0xb0, 0x00, 0x10, 0xb1, 0x10, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x01, 0x10, 0xb1, 0x1f, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x33, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, \n\t0x14, 0x06, 0x23, 0x01, 0x11, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, \n\t0x25, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x90, 0x01, 0xab, \n\t0xd6, 0xec, 0x5c, 0x54, 0x65, 0x71, 0xdd, 0xc6, 0xfe, 0xd5, 0x01, 0x2b, \n\t0x6d, 0x70, 0x70, 0x6d, 0xfe, 0xd5, 0xe7, 0x7d, 0x7f, 0x80, 0x7d, 0xe6, \n\t0x04, 0x3a, 0x95, 0x95, 0x4c, 0x77, 0x1f, 0x19, 0x89, 0x58, 0x98, 0x9c, \n\t0x01, 0xda, 0xfe, 0xbe, 0x53, 0x4e, 0x4d, 0x54, 0x97, 0x4a, 0x4b, 0x4d, \n\t0x4e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8f, 0x00, 0x00, 0x03, 0x3f, \n\t0x04, 0x3a, 0x00, 0x05, 0x00, 0x2c, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x06, 0x3e, 0x59, 0xb0, 0x04, 0x10, \n\t0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x01, 0x21, 0x11, 0x23, 0x11, 0x21, 0x03, 0x3f, 0xfe, 0x15, \n\t0xc5, 0x02, 0xb0, 0x03, 0x9e, 0xfc, 0x62, 0x04, 0x3a, 0x00, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x2e, 0xfe, 0xc2, 0x04, 0xa0, 0x04, 0x3a, 0x00, 0x0e, \n\t0x00, 0x15, 0x00, 0x4a, 0x00, 0xb0, 0x0c, 0x2f, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x06, 0x3e, 0x59, 0xb1, 0x12, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, \n\t0xd0, 0xb0, 0x12, 0x10, 0xb0, 0x06, 0xd0, 0xb0, 0x0c, 0x10, 0xb0, 0x09, \n\t0xd0, 0xb0, 0x05, 0x10, 0xb1, 0x14, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x37, 0x36, 0x36, 0x37, 0x13, 0x21, \n\t0x11, 0x33, 0x03, 0x23, 0x11, 0x21, 0x11, 0x23, 0x03, 0x01, 0x06, 0x06, \n\t0x07, 0x21, 0x11, 0x21, 0x83, 0x53, 0x58, 0x0f, 0x10, 0x02, 0xc3, 0x90, \n\t0x13, 0xb2, 0xfd, 0x18, 0xb2, 0x13, 0x01, 0xd4, 0x0b, 0x51, 0x40, 0x01, \n\t0xe5, 0xfe, 0xc0, 0x9a, 0x60, 0xd1, 0xd8, 0x01, 0x97, 0xfc, 0x60, 0xfe, \n\t0x28, 0x01, 0x3e, 0xfe, 0xc2, 0x01, 0xd8, 0x02, 0x09, 0xb4, 0xfe, 0x57, \n\t0x02, 0xf1, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0xff, 0xeb, 0x03, 0xed, \n\t0x04, 0x4e, 0x02, 0x06, 0x00, 0x48, 0x00, 0x00, 0x00, 0x01, 0x00, 0x15, \n\t0x00, 0x00, 0x06, 0x04, 0x04, 0x3a, 0x00, 0x15, 0x00, 0x68, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x06, 0x3e, \n\t0x59, 0xb2, 0x0c, 0x06, 0x0a, 0x11, 0x12, 0x39, 0xb0, 0x0c, 0x2f, 0xb4, \n\t0xbf, 0x0c, 0xcf, 0x0c, 0x02, 0x5d, 0xb1, 0x04, 0x03, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x01, 0xd0, 0xb0, 0x06, 0x10, \n\t0xb0, 0x03, 0xd0, 0xb2, 0x08, 0x04, 0x0c, 0x11, 0x12, 0x39, 0xb0, 0x0a, \n\t0x10, 0xb0, 0x0d, 0xd0, 0xb0, 0x0c, 0x10, 0xb0, 0x0f, 0xd0, 0xb0, 0x0d, \n\t0x10, 0xb0, 0x11, 0xd0, 0xb0, 0x08, 0x10, 0xb0, 0x13, 0xd0, 0xb0, 0x03, \n\t0x10, 0xb0, 0x15, 0xd0, 0x30, 0x31, 0x01, 0x23, 0x11, 0x23, 0x11, 0x23, \n\t0x01, 0x23, 0x01, 0x01, 0x33, 0x01, 0x33, 0x11, 0x33, 0x11, 0x33, 0x01, \n\t0x33, 0x01, 0x01, 0x23, 0x03, 0xed, 0x7e, 0xc5, 0x7f, 0xfe, 0xe2, 0xf8, \n\t0x01, 0x82, 0xfe, 0xa0, 0xee, 0x01, 0x0a, 0x7b, 0xc5, 0x7b, 0x01, 0x0b, \n\t0xee, 0xfe, 0x9f, 0x01, 0x82, 0xf8, 0x01, 0xd5, 0xfe, 0x2b, 0x01, 0xd5, \n\t0xfe, 0x2b, 0x02, 0x3d, 0x01, 0xfd, 0xfe, 0x42, 0x01, 0xbe, 0xfe, 0x42, \n\t0x01, 0xbe, 0xfe, 0x03, 0xfd, 0xc3, 0x00, 0x00, 0x00, 0x01, 0x00, 0x58, \n\t0xff, 0xed, 0x03, 0xae, 0x04, 0x4c, 0x00, 0x2a, 0x00, 0x75, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1a, 0x2f, 0x1b, 0xb1, 0x1a, 0x06, 0x3e, \n\t0x59, 0xb0, 0x0e, 0x10, 0xb1, 0x06, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0e, 0x10, 0xb0, 0x09, 0xd0, 0xb2, 0x2a, \n\t0x1a, 0x0e, 0x11, 0x12, 0x39, 0xb0, 0x2a, 0x2f, 0xb2, 0x2f, 0x2a, 0x01, \n\t0x5d, 0xb4, 0xbf, 0x2a, 0xcf, 0x2a, 0x02, 0x5d, 0xb2, 0x9f, 0x2a, 0x01, \n\t0x71, 0xb1, 0x29, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb2, 0x14, 0x29, 0x2a, 0x11, 0x12, 0x39, 0xb0, 0x1a, 0x10, 0xb0, \n\t0x1f, 0xd0, 0xb0, 0x1a, 0x10, 0xb1, 0x22, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x32, 0x36, 0x35, 0x34, \n\t0x26, 0x23, 0x22, 0x06, 0x15, 0x23, 0x27, 0x26, 0x36, 0x33, 0x32, 0x16, \n\t0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, \n\t0x37, 0x37, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, \n\t0x23, 0x35, 0x02, 0x13, 0x68, 0x5a, 0x67, 0x68, 0x5d, 0x7e, 0xbb, 0x02, \n\t0x06, 0xef, 0xaf, 0xbe, 0xd6, 0x58, 0x4f, 0x5b, 0x60, 0xe9, 0xbf, 0xb0, \n\t0xfe, 0x05, 0x02, 0xbb, 0x84, 0x68, 0x6b, 0x77, 0x67, 0x6e, 0xbc, 0x02, \n\t0x78, 0x4f, 0x4b, 0x44, 0x5e, 0x62, 0x46, 0x06, 0x8b, 0xaf, 0xa3, 0x97, \n\t0x49, 0x79, 0x23, 0x21, 0x80, 0x5b, 0x98, 0xac, 0xab, 0xa2, 0x06, 0x4c, \n\t0x70, 0x63, 0x4a, 0x57, 0x50, 0xa0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8f, \n\t0x00, 0x00, 0x03, 0xfc, 0x04, 0x3a, 0x00, 0x0b, 0x00, 0x6e, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x06, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, \n\t0x06, 0x3e, 0x59, 0xb0, 0x00, 0x10, 0xb0, 0x04, 0xd0, 0xb2, 0x9d, 0x04, \n\t0x01, 0x5d, 0xb6, 0x4c, 0x04, 0x5c, 0x04, 0x6c, 0x04, 0x03, 0x5d, 0xb4, \n\t0x7b, 0x04, 0x8b, 0x04, 0x02, 0x5d, 0xb0, 0x06, 0x10, 0xb0, 0x0b, 0xd0, \n\t0xb2, 0x84, 0x0b, 0x01, 0x5d, 0x40, 0x09, 0x43, 0x0b, 0x53, 0x0b, 0x63, \n\t0x0b, 0x73, 0x0b, 0x04, 0x5d, 0xb2, 0x92, 0x0b, 0x01, 0x5d, 0x30, 0x31, \n\t0x01, 0x33, 0x11, 0x23, 0x11, 0x27, 0x01, 0x23, 0x11, 0x33, 0x11, 0x17, \n\t0x03, 0x37, 0xc5, 0xc5, 0x06, 0xfe, 0x22, 0xc4, 0xc4, 0x06, 0x04, 0x3a, \n\t0xfb, 0xc6, 0x03, 0x00, 0x02, 0xfc, 0xfe, 0x04, 0x3a, 0xfd, 0x00, 0x02, \n\t0xff, 0xff, 0x00, 0x8f, 0x00, 0x00, 0x03, 0xfc, 0x05, 0xf7, 0x02, 0x26, \n\t0x01, 0xe4, 0x00, 0x00, 0x01, 0x07, 0x01, 0x54, 0x00, 0x99, 0x00, 0x47, \n\t0x00, 0x33, 0x00, 0xb2, 0x8f, 0x10, 0x01, 0x71, 0xb2, 0xcf, 0x10, 0x01, \n\t0x71, 0xb2, 0x1f, 0x10, 0x01, 0x72, 0xb6, 0x3f, 0x10, 0x4f, 0x10, 0x5f, \n\t0x10, 0x03, 0x5d, 0xb2, 0xff, 0x10, 0x01, 0x71, 0xb2, 0xaf, 0x10, 0x01, \n\t0x71, 0xb6, 0x60, 0x10, 0x70, 0x10, 0x80, 0x10, 0x03, 0x5d, 0xb2, 0x00, \n\t0x10, 0x01, 0x71, 0x30, 0x31, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x99, \n\t0x00, 0x00, 0x04, 0x41, 0x04, 0x3a, 0x00, 0x0e, 0x00, 0x8e, 0x00, 0xb0, \n\t0x06, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, \n\t0x08, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, \n\t0xb1, 0x02, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, \n\t0x1b, 0xb1, 0x0e, 0x06, 0x3e, 0x59, 0xb4, 0xbf, 0x06, 0xcf, 0x06, 0x02, \n\t0x5d, 0xb2, 0x2f, 0x06, 0x01, 0x71, 0xb2, 0x9f, 0x06, 0x01, 0x71, 0xb2, \n\t0xff, 0x06, 0x01, 0x71, 0xb2, 0x6f, 0x06, 0x01, 0x72, 0xb2, 0xdf, 0x06, \n\t0x01, 0x72, 0xb2, 0x3f, 0x06, 0x01, 0x72, 0xb2, 0xcf, 0x06, 0x01, 0x71, \n\t0xb2, 0x6f, 0x06, 0x01, 0x71, 0xb2, 0xff, 0x06, 0x01, 0x5d, 0xb2, 0x5f, \n\t0x06, 0x01, 0x5d, 0xb2, 0x2f, 0x06, 0x01, 0x5d, 0xb0, 0x06, 0x10, 0xb1, \n\t0x01, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, \n\t0x0b, 0x01, 0x06, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x23, 0x11, 0x23, \n\t0x11, 0x33, 0x11, 0x33, 0x01, 0x33, 0x17, 0x01, 0x01, 0x07, 0x23, 0x01, \n\t0xdf, 0x81, 0xc5, 0xc5, 0x72, 0x01, 0x65, 0xe7, 0x03, 0xfe, 0x58, 0x01, \n\t0xca, 0x03, 0xf2, 0x01, 0xcb, 0xfe, 0x35, 0x04, 0x3a, 0xfe, 0x37, 0x01, \n\t0xc9, 0x05, 0xfd, 0xff, 0xfd, 0xd1, 0x05, 0x00, 0x00, 0x01, 0x00, 0x1a, \n\t0x00, 0x00, 0x03, 0xfc, 0x04, 0x3a, 0x00, 0x0f, 0x00, 0x48, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x06, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x06, \n\t0x3e, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x03, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x08, 0x10, 0xb1, 0x0a, 0x03, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x11, \n\t0x23, 0x11, 0x21, 0x11, 0x10, 0x02, 0x23, 0x23, 0x37, 0x37, 0x32, 0x36, \n\t0x35, 0x11, 0x03, 0xfc, 0xc5, 0xfe, 0x92, 0xaa, 0xcd, 0x38, 0x04, 0x29, \n\t0x69, 0x53, 0x04, 0x3a, 0xfb, 0xc6, 0x03, 0x9e, 0xfe, 0xce, 0xfe, 0xc0, \n\t0xfe, 0xd4, 0xa8, 0x01, 0xcd, 0xf6, 0x01, 0xce, 0x00, 0x01, 0x00, 0x99, \n\t0x00, 0x00, 0x05, 0x55, 0x04, 0x3a, 0x00, 0x0f, 0x00, 0x7b, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x06, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, \n\t0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, \n\t0x0c, 0x06, 0x3e, 0x59, 0xb0, 0x08, 0x10, 0xb0, 0x01, 0xd0, 0xb4, 0x44, \n\t0x01, 0x54, 0x01, 0x02, 0x5d, 0x40, 0x09, 0x63, 0x01, 0x73, 0x01, 0x83, \n\t0x01, 0x93, 0x01, 0x04, 0x5d, 0xb0, 0x0e, 0x10, 0xb0, 0x0a, 0xd0, 0xb6, \n\t0x7d, 0x0a, 0x8d, 0x0a, 0x9d, 0x0a, 0x03, 0x5d, 0xb2, 0x6c, 0x0a, 0x01, \n\t0x5d, 0xb4, 0x4b, 0x0a, 0x5b, 0x0a, 0x02, 0x5d, 0xb0, 0x07, 0xd0, 0x30, \n\t0x31, 0x01, 0x33, 0x01, 0x33, 0x11, 0x23, 0x11, 0x27, 0x01, 0x23, 0x01, \n\t0x07, 0x11, 0x23, 0x11, 0x33, 0x02, 0xf7, 0x06, 0x01, 0x62, 0xf6, 0xc5, \n\t0x06, 0xfe, 0xb4, 0x88, 0xfe, 0xae, 0x06, 0xc5, 0xfe, 0x01, 0x02, 0x03, \n\t0x38, 0xfb, 0xc6, 0x02, 0xef, 0x02, 0xfd, 0x0f, 0x03, 0x02, 0x02, 0xfd, \n\t0x00, 0x04, 0x3a, 0x00, 0x00, 0x01, 0x00, 0x8f, 0x00, 0x00, 0x03, 0xfb, \n\t0x04, 0x3a, 0x00, 0x0b, 0x00, 0xa0, 0x00, 0xb0, 0x08, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0a, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x06, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x06, \n\t0x3e, 0x59, 0xb2, 0x9f, 0x08, 0x01, 0x5d, 0xb2, 0xff, 0x08, 0x01, 0x5d, \n\t0xb2, 0x6f, 0x08, 0x01, 0x71, 0xb4, 0xcf, 0x08, 0xdf, 0x08, 0x02, 0x71, \n\t0xb4, 0x3f, 0x08, 0x4f, 0x08, 0x02, 0x72, 0xb2, 0xaf, 0x08, 0x01, 0x72, \n\t0xb4, 0xdf, 0x08, 0xef, 0x08, 0x02, 0x72, 0xb4, 0x6f, 0x08, 0x7f, 0x08, \n\t0x02, 0x72, 0xb2, 0xff, 0x08, 0x01, 0x71, 0xb2, 0x0f, 0x08, 0x01, 0x72, \n\t0xb2, 0x9f, 0x08, 0x01, 0x71, 0xb4, 0x2f, 0x08, 0x3f, 0x08, 0x02, 0x71, \n\t0xb4, 0xbf, 0x08, 0xcf, 0x08, 0x02, 0x5d, 0xb2, 0x5f, 0x08, 0x01, 0x5d, \n\t0xb2, 0x2f, 0x08, 0x01, 0x5d, 0xb0, 0x08, 0x10, 0xb1, 0x03, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x21, 0x23, \n\t0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x03, 0xfb, \n\t0xc5, 0xfe, 0x1e, 0xc5, 0xc5, 0x01, 0xe2, 0xc5, 0x01, 0xcc, 0xfe, 0x34, \n\t0x04, 0x3a, 0xfe, 0x2c, 0x01, 0xd4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x61, \n\t0xff, 0xeb, 0x04, 0x2a, 0x04, 0x4e, 0x02, 0x06, 0x00, 0x52, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x8f, 0x00, 0x00, 0x03, 0xfc, 0x04, 0x3a, 0x00, 0x07, \n\t0x00, 0x39, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, \n\t0x06, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, \n\t0xb1, 0x00, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, \n\t0x1b, 0xb1, 0x04, 0x06, 0x3e, 0x59, 0xb0, 0x06, 0x10, 0xb1, 0x02, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x21, \n\t0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, 0x03, 0xfc, 0xc5, 0xfe, 0x1d, \n\t0xc5, 0x03, 0x6d, 0x03, 0x9e, 0xfc, 0x62, 0x04, 0x3a, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x8f, 0xfe, 0x60, 0x04, 0x29, 0x04, 0x4e, 0x02, 0x06, \n\t0x00, 0x53, 0x00, 0x00, 0x00, 0x01, 0x00, 0x61, 0xff, 0xeb, 0x03, 0xf6, \n\t0x04, 0x4e, 0x00, 0x1d, 0x00, 0x38, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x06, 0x3e, 0x59, 0xb1, 0x00, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0f, 0x10, \n\t0xb1, 0x17, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x25, 0x32, 0x36, 0x35, 0x33, 0x17, 0x16, 0x04, 0x23, 0x22, \n\t0x02, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x16, 0x07, 0x07, 0x23, 0x34, \n\t0x26, 0x23, 0x22, 0x06, 0x15, 0x15, 0x14, 0x16, 0x02, 0x47, 0x62, 0x95, \n\t0xb1, 0x02, 0x05, 0xfe, 0xfd, 0xac, 0xec, 0xfa, 0xfb, 0xeb, 0xbe, 0xf1, \n\t0x04, 0x02, 0xb2, 0x8c, 0x6b, 0x9b, 0x85, 0x84, 0x85, 0x79, 0x58, 0x06, \n\t0x8c, 0xd9, 0x01, 0x34, 0xe9, 0x2a, 0xe7, 0x01, 0x35, 0xe0, 0xa3, 0x06, \n\t0x63, 0x8b, 0xdf, 0xa2, 0x2a, 0xa6, 0xdd, 0x00, 0x00, 0x01, 0x00, 0x47, \n\t0x00, 0x00, 0x03, 0xd1, 0x04, 0x3a, 0x00, 0x07, 0x00, 0x2f, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x06, 0x3e, \n\t0x59, 0xb0, 0x06, 0x10, 0xb1, 0x05, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x01, 0xd0, 0x30, 0x31, 0x01, 0x21, 0x11, \n\t0x23, 0x11, 0x21, 0x35, 0x21, 0x03, 0xd1, 0xfe, 0x9b, 0xc5, 0xfe, 0xa0, \n\t0x03, 0x8a, 0x03, 0xa1, 0xfc, 0x5f, 0x03, 0xa1, 0x99, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x1a, 0xfe, 0x4b, 0x03, 0xe8, 0x04, 0x3a, 0x02, 0x06, \n\t0x00, 0x5c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x62, 0xfe, 0x60, 0x05, 0x6b, \n\t0x06, 0x18, 0x00, 0x1f, 0x00, 0x2d, 0x00, 0x3b, 0x00, 0x5d, 0x00, 0xb0, \n\t0x07, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1c, 0x2f, 0x1b, 0xb1, \n\t0x1c, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x18, 0x2f, 0x1b, \n\t0xb1, 0x18, 0x08, 0x3e, 0x59, 0xb0, 0x03, 0x10, 0xb0, 0x0c, 0xd0, 0xb0, \n\t0x1c, 0x10, 0xb0, 0x13, 0xd0, 0xb0, 0x03, 0x10, 0xb1, 0x38, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x23, 0xd0, 0xb0, \n\t0x1c, 0x10, 0xb1, 0x31, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x2a, 0xd0, 0x30, 0x31, 0x13, 0x10, 0x12, 0x33, 0x32, \n\t0x16, 0x17, 0x11, 0x33, 0x11, 0x36, 0x36, 0x33, 0x32, 0x12, 0x11, 0x15, \n\t0x14, 0x02, 0x23, 0x22, 0x26, 0x27, 0x11, 0x23, 0x11, 0x06, 0x06, 0x23, \n\t0x22, 0x02, 0x35, 0x25, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x16, \n\t0x16, 0x33, 0x32, 0x36, 0x35, 0x21, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, \n\t0x11, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x62, 0xcc, 0xbe, 0x28, 0x47, \n\t0x20, 0xc5, 0x22, 0x50, 0x2f, 0xbe, 0xcc, 0xcd, 0xbb, 0x2f, 0x52, 0x22, \n\t0xc5, 0x20, 0x48, 0x29, 0xbc, 0xcc, 0x04, 0x44, 0x7f, 0x82, 0x1e, 0x32, \n\t0x15, 0x14, 0x33, 0x20, 0x82, 0x7d, 0xfc, 0x81, 0x73, 0x82, 0x1b, 0x30, \n\t0x14, 0x14, 0x2e, 0x1b, 0x82, 0x75, 0x02, 0x09, 0x01, 0x07, 0x01, 0x3e, \n\t0x0e, 0x0c, 0x01, 0xe4, 0xfe, 0x16, 0x0f, 0x11, 0xfe, 0xc2, 0xfe, 0xf9, \n\t0x15, 0xec, 0xfe, 0xe3, 0x10, 0x0e, 0xfe, 0x57, 0x01, 0xa4, 0x0c, 0x0d, \n\t0x01, 0x1d, 0xec, 0x15, 0xbc, 0xee, 0x09, 0x08, 0xfc, 0xf1, 0x07, 0x07, \n\t0xca, 0xa5, 0xa7, 0xc8, 0x07, 0x07, 0x03, 0x12, 0x06, 0x08, 0xec, 0xbe, \n\t0xff, 0xff, 0x00, 0x2e, 0x00, 0x00, 0x03, 0xd4, 0x04, 0x3a, 0x02, 0x06, \n\t0x00, 0x5b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8f, 0xfe, 0x9e, 0x04, 0x80, \n\t0x04, 0x3a, 0x00, 0x0b, 0x00, 0x38, 0x00, 0xb0, 0x09, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x0a, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x06, 0x3e, 0x59, \n\t0xb1, 0x02, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x01, 0x10, 0xb0, 0x04, 0xd0, 0xb0, 0x02, 0x10, 0xb0, 0x06, 0xd0, \n\t0x30, 0x31, 0x13, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x23, \n\t0x11, 0x21, 0x8f, 0xc5, 0x01, 0xe3, 0xc5, 0x84, 0xc5, 0xfc, 0xd4, 0x04, \n\t0x3a, 0xfc, 0x60, 0x03, 0xa0, 0xfc, 0x60, 0xfe, 0x04, 0x01, 0x62, 0x00, \n\t0x00, 0x01, 0x00, 0x7f, 0x00, 0x00, 0x03, 0xdc, 0x04, 0x3b, 0x00, 0x13, \n\t0x00, 0x43, 0x00, 0xb0, 0x0e, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, \n\t0x2f, 0x1b, 0xb1, 0x0a, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x06, 0x3e, 0x59, 0xb4, 0xbf, 0x0e, \n\t0xcf, 0x0e, 0x02, 0x5d, 0xb0, 0x0e, 0x10, 0xb1, 0x05, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x21, 0x23, 0x11, \n\t0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, \n\t0x32, 0x36, 0x37, 0x11, 0x33, 0x03, 0xdc, 0xc5, 0x39, 0x78, 0x44, 0xc4, \n\t0xdf, 0xc5, 0x70, 0x6e, 0x42, 0x78, 0x3b, 0xc5, 0x01, 0x83, 0x0f, 0x0f, \n\t0xce, 0xca, 0x01, 0x3e, 0xfe, 0xc2, 0x82, 0x7a, 0x0f, 0x0f, 0x02, 0x1b, \n\t0x00, 0x01, 0x00, 0x8f, 0x00, 0x00, 0x05, 0xd8, 0x04, 0x3a, 0x00, 0x0b, \n\t0x00, 0x46, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, \n\t0x00, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, \n\t0xb1, 0x03, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, \n\t0x1b, 0xb1, 0x07, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, \n\t0x2f, 0x1b, 0xb1, 0x09, 0x06, 0x3e, 0x59, 0xb1, 0x01, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x05, 0xd0, 0x30, 0x31, \n\t0x01, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, \n\t0x01, 0x54, 0x01, 0x7d, 0xc5, 0x01, 0x7d, 0xc5, 0xfa, 0xb7, 0x04, 0x3a, \n\t0xfc, 0x60, 0x03, 0xa0, 0xfc, 0x60, 0x03, 0xa0, 0xfb, 0xc6, 0x04, 0x3a, \n\t0x00, 0x01, 0x00, 0x8f, 0xfe, 0xae, 0x06, 0x88, 0x04, 0x3a, 0x00, 0x0f, \n\t0x00, 0x47, 0x00, 0xb0, 0x0c, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, \n\t0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x06, 0x3e, 0x59, 0xb1, 0x02, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb0, \n\t0x03, 0xd0, 0xb0, 0x02, 0x10, 0xb0, 0x05, 0xd0, 0xb0, 0x03, 0x10, 0xb0, \n\t0x07, 0xd0, 0xb0, 0x05, 0x10, 0xb0, 0x09, 0xd0, 0xb0, 0x09, 0x2f, 0x30, \n\t0x31, 0x01, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, \n\t0x11, 0x23, 0x11, 0x21, 0x11, 0x01, 0x54, 0x01, 0x7d, 0xc5, 0x01, 0x7d, \n\t0xc5, 0xb0, 0xc3, 0xfa, 0xca, 0x04, 0x3a, 0xfc, 0x60, 0x03, 0xa0, 0xfc, \n\t0x60, 0x03, 0xa0, 0xfc, 0x57, 0xfe, 0x1d, 0x01, 0x52, 0x04, 0x3a, 0x00, \n\t0x00, 0x02, 0x00, 0x1d, 0x00, 0x00, 0x04, 0xc1, 0x04, 0x3a, 0x00, 0x0c, \n\t0x00, 0x15, 0x00, 0x54, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, \n\t0x1b, 0xb1, 0x0b, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, \n\t0x2f, 0x1b, 0xb1, 0x08, 0x06, 0x3e, 0x59, 0xb2, 0x00, 0x08, 0x0b, 0x11, \n\t0x12, 0x39, 0xb0, 0x00, 0x2f, 0xb0, 0x0b, 0x10, 0xb1, 0x0a, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb1, \n\t0x0d, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x08, 0x10, 0xb1, 0x0e, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, \n\t0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x11, 0x21, 0x32, 0x36, 0x35, 0x34, \n\t0x26, 0x23, 0x02, 0x1f, 0x01, 0x0d, 0xc0, 0xd5, 0xd7, 0xbe, 0xfe, 0x2e, \n\t0xfe, 0xc3, 0x02, 0x02, 0x01, 0x0d, 0x6a, 0x65, 0x66, 0x69, 0x02, 0xc6, \n\t0xc3, 0x9c, 0x9d, 0xca, 0x03, 0x9f, 0x9b, 0xfd, 0xf2, 0xfe, 0x6e, 0x71, \n\t0x55, 0x52, 0x7a, 0x00, 0x00, 0x03, 0x00, 0xad, 0x00, 0x00, 0x05, 0x98, \n\t0x04, 0x3a, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x17, 0x00, 0x58, 0x00, 0xb0, \n\t0x00, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, \n\t0x0d, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, \n\t0xb1, 0x07, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, \n\t0x1b, 0xb1, 0x0b, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x0f, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x07, 0x10, \n\t0xb1, 0x10, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x01, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x21, 0x11, \n\t0x33, 0x01, 0x23, 0x11, 0x33, 0x01, 0x11, 0x21, 0x32, 0x36, 0x35, 0x34, \n\t0x26, 0x23, 0x01, 0x72, 0x01, 0x0d, 0xc0, 0xd5, 0xd7, 0xbe, 0xfe, 0x2e, \n\t0xc5, 0x04, 0x26, 0xc5, 0xc5, 0xfb, 0xda, 0x01, 0x0d, 0x6a, 0x65, 0x66, \n\t0x69, 0x02, 0x9e, 0xb8, 0x93, 0x94, 0xbf, 0x04, 0x3a, 0xfb, 0xc6, 0x04, \n\t0x3a, 0xfd, 0xca, 0xfe, 0x96, 0x66, 0x4c, 0x4a, 0x6e, 0x00, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x99, 0x00, 0x00, 0x04, 0x00, 0x04, 0x3a, 0x00, 0x0a, \n\t0x00, 0x13, 0x00, 0x3e, 0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x06, 0x3e, 0x59, 0xb0, 0x00, \n\t0x10, 0xb1, 0x0b, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x07, 0x10, 0xb1, 0x0c, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x32, 0x16, 0x15, 0x14, \n\t0x06, 0x23, 0x21, 0x11, 0x33, 0x11, 0x11, 0x21, 0x32, 0x36, 0x35, 0x34, \n\t0x26, 0x23, 0x01, 0x5e, 0x01, 0x0d, 0xc0, 0xd5, 0xd7, 0xbe, 0xfe, 0x2e, \n\t0xc5, 0x01, 0x0d, 0x6a, 0x65, 0x66, 0x69, 0x02, 0x9e, 0xb8, 0x93, 0x94, \n\t0xbf, 0x04, 0x3a, 0xfd, 0xca, 0xfe, 0x96, 0x66, 0x4c, 0x4a, 0x6e, 0x00, \n\t0x00, 0x01, 0x00, 0x63, 0xff, 0xeb, 0x03, 0xe3, 0x04, 0x4e, 0x00, 0x21, \n\t0x00, 0x81, 0x00, 0xb0, 0x1d, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, \n\t0x2f, 0x1b, 0xb1, 0x08, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x06, 0x3e, 0x59, 0xb0, 0x08, 0x10, 0xb1, \n\t0x00, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x0f, 0x10, 0xb1, 0x17, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb2, 0x2f, 0x1d, 0x01, 0x5d, 0xb4, 0xbf, 0x1d, 0xcf, 0x1d, \n\t0x02, 0x5d, 0xb2, 0x2f, 0x1d, 0x01, 0x71, 0xb2, 0xcf, 0x1d, 0x01, 0x71, \n\t0xb2, 0xff, 0x1d, 0x01, 0x71, 0xb2, 0x9f, 0x1d, 0x01, 0x71, 0xb2, 0xff, \n\t0x1d, 0x01, 0x5d, 0xb2, 0x5f, 0x1d, 0x01, 0x5d, 0xb2, 0x6f, 0x1d, 0x01, \n\t0x72, 0xb2, 0x9f, 0x1d, 0x01, 0x72, 0xb0, 0x1d, 0x10, 0xb1, 0x1c, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, \n\t0x22, 0x06, 0x15, 0x23, 0x27, 0x26, 0x36, 0x33, 0x32, 0x12, 0x15, 0x15, \n\t0x14, 0x00, 0x23, 0x22, 0x26, 0x37, 0x37, 0x33, 0x14, 0x16, 0x33, 0x32, \n\t0x36, 0x37, 0x27, 0x21, 0x35, 0x21, 0x37, 0x26, 0x26, 0x02, 0x08, 0x5c, \n\t0x8f, 0xb2, 0x02, 0x06, 0xff, 0xa6, 0xdc, 0xff, 0xff, 0x00, 0xdb, 0xb7, \n\t0xee, 0x05, 0x02, 0xb3, 0x87, 0x64, 0x7e, 0x8a, 0x08, 0x03, 0xfe, 0x7f, \n\t0x01, 0x7f, 0x02, 0x0a, 0x89, 0x03, 0xb3, 0x7a, 0x57, 0x06, 0x8b, 0xdb, \n\t0xfe, 0xc7, 0xe3, 0x2a, 0xe4, 0xfe, 0xc7, 0xdf, 0xa3, 0x06, 0x63, 0x8b, \n\t0xc4, 0x8c, 0x05, 0x9a, 0x05, 0x83, 0xb7, 0x00, 0x00, 0x02, 0x00, 0x99, \n\t0xff, 0xeb, 0x06, 0x24, 0x04, 0x4e, 0x00, 0x13, 0x00, 0x21, 0x00, 0xa5, \n\t0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, \n\t0xb1, 0x04, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x13, 0x2f, \n\t0x1b, 0xb1, 0x13, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, \n\t0x2f, 0x1b, 0xb1, 0x0b, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x06, 0x3e, 0x59, 0xb4, 0xbf, 0x00, 0xcf, \n\t0x00, 0x02, 0x5d, 0xb2, 0x2f, 0x00, 0x01, 0x71, 0xb2, 0x9f, 0x00, 0x01, \n\t0x71, 0xb2, 0xff, 0x00, 0x01, 0x71, 0xb2, 0x6f, 0x00, 0x01, 0x72, 0xb2, \n\t0xdf, 0x00, 0x01, 0x72, 0xb2, 0x3f, 0x00, 0x01, 0x72, 0xb2, 0xcf, 0x00, \n\t0x01, 0x71, 0xb2, 0x6f, 0x00, 0x01, 0x71, 0xb2, 0xff, 0x00, 0x01, 0x5d, \n\t0xb2, 0x5f, 0x00, 0x01, 0x5d, 0xb2, 0x2f, 0x00, 0x01, 0x5d, 0xb0, 0x00, \n\t0x10, 0xb1, 0x0f, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x0b, 0x10, 0xb1, 0x17, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x1e, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x36, \n\t0x12, 0x33, 0x32, 0x00, 0x15, 0x15, 0x14, 0x00, 0x23, 0x22, 0x00, 0x27, \n\t0x23, 0x11, 0x23, 0x11, 0x33, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, \n\t0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x01, 0x5e, 0x01, 0x00, 0x14, \n\t0xff, 0xcd, 0xe1, 0x01, 0x05, 0xfe, 0xfc, 0xe0, 0xd2, 0xfe, 0xff, 0x10, \n\t0xff, 0xc5, 0xc5, 0x01, 0xc2, 0x91, 0x8f, 0x8d, 0x92, 0x93, 0x8e, 0x8d, \n\t0x91, 0x02, 0x71, 0xd4, 0x01, 0x09, 0xfe, 0xca, 0xf1, 0x16, 0xf2, 0xfe, \n\t0xcc, 0x01, 0x11, 0xdb, 0xfe, 0x29, 0x04, 0x3a, 0xfd, 0xd7, 0xac, 0xe0, \n\t0xe0, 0xac, 0x16, 0xaa, 0xe2, 0xe2, 0xaa, 0x00, 0x00, 0x02, 0x00, 0x4e, \n\t0x00, 0x00, 0x03, 0xf2, 0x04, 0x3a, 0x00, 0x0d, 0x00, 0x16, 0x00, 0x52, \n\t0x00, 0xb0, 0x03, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, \n\t0xb1, 0x00, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, \n\t0x1b, 0xb1, 0x01, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, \n\t0x2f, 0x1b, 0xb1, 0x05, 0x06, 0x3e, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x12, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x07, \n\t0x03, 0x12, 0x11, 0x12, 0x39, 0xb0, 0x00, 0x10, 0xb1, 0x13, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x11, \n\t0x23, 0x11, 0x21, 0x01, 0x23, 0x01, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, \n\t0x03, 0x14, 0x16, 0x33, 0x21, 0x11, 0x21, 0x22, 0x06, 0x03, 0xf2, 0xc5, \n\t0xfe, 0xf5, 0xff, 0x00, 0xd4, 0x01, 0x12, 0x67, 0x6f, 0xdd, 0xc2, 0xd9, \n\t0x62, 0x62, 0x01, 0x19, 0xfe, 0xfc, 0x6b, 0x6e, 0x04, 0x3a, 0xfb, 0xc6, \n\t0x01, 0xa4, 0xfe, 0x5c, 0x01, 0xc1, 0x25, 0xa0, 0x69, 0x92, 0xb9, 0xfe, \n\t0xb3, 0x48, 0x66, 0x01, 0x62, 0x6b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, \n\t0xff, 0xeb, 0x03, 0xed, 0x05, 0xe1, 0x02, 0x26, 0x00, 0x48, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x43, 0x00, 0x97, 0x00, 0x1c, 0x00, 0x08, 0x00, 0xb2, \n\t0xc0, 0x20, 0x01, 0x71, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, \n\t0xff, 0xeb, 0x03, 0xed, 0x05, 0xcc, 0x02, 0x26, 0x00, 0x48, 0x00, 0x00, \n\t0x01, 0x06, 0x00, 0x6a, 0x2c, 0x1c, 0x00, 0x3d, 0x00, 0xb2, 0x60, 0x21, \n\t0x01, 0x72, 0xb4, 0xb0, 0x21, 0xc0, 0x21, 0x02, 0x71, 0xb2, 0x40, 0x21, \n\t0x01, 0x72, 0xb2, 0xf0, 0x21, 0x01, 0x71, 0xb4, 0x00, 0x21, 0x10, 0x21, \n\t0x02, 0x72, 0xb2, 0x60, 0x24, 0x01, 0x72, 0xb4, 0xb0, 0x24, 0xc0, 0x24, \n\t0x02, 0x71, 0xb2, 0x40, 0x24, 0x01, 0x72, 0xb2, 0xf0, 0x24, 0x01, 0x71, \n\t0xb4, 0x00, 0x24, 0x10, 0x24, 0x02, 0x72, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0xff, 0xe7, 0xfe, 0x4b, 0x04, 0x01, 0x06, 0x18, 0x00, 0x29, \n\t0x00, 0x7d, 0x00, 0xb0, 0x26, 0x2f, 0xb0, 0x29, 0x2f, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x0a, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x08, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x20, 0x2f, 0x1b, 0xb1, 0x20, 0x06, 0x3e, 0x59, \n\t0xb2, 0x5f, 0x29, 0x01, 0x5d, 0xb2, 0x2f, 0x29, 0x01, 0x5d, 0xb2, 0xbf, \n\t0x29, 0x01, 0x5d, 0xb0, 0x29, 0x10, 0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0e, 0x10, 0xb1, 0x15, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x05, 0x10, \n\t0xb1, 0x1c, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x00, 0x10, 0xb0, 0x22, 0xd0, 0xb0, 0x29, 0x10, 0xb0, 0x24, 0xd0, \n\t0xb2, 0x2f, 0x26, 0x01, 0x5d, 0x30, 0x31, 0x01, 0x21, 0x11, 0x36, 0x36, \n\t0x33, 0x32, 0x16, 0x15, 0x15, 0x33, 0x11, 0x14, 0x06, 0x23, 0x22, 0x26, \n\t0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x34, 0x26, 0x23, \n\t0x22, 0x06, 0x07, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, \n\t0x21, 0x02, 0x68, 0xfe, 0xec, 0x38, 0xa3, 0x63, 0xad, 0xc1, 0x01, 0xac, \n\t0x9a, 0x21, 0x34, 0x1c, 0x0f, 0x0d, 0x44, 0x11, 0x3c, 0x44, 0x73, 0x72, \n\t0x52, 0x85, 0x2b, 0xc5, 0xa8, 0xa8, 0xc5, 0x01, 0x14, 0x04, 0xb8, 0xfe, \n\t0xf1, 0x4e, 0x57, 0xd0, 0xd8, 0xde, 0xfd, 0xdf, 0xa7, 0xb5, 0x08, 0x09, \n\t0x97, 0x05, 0x08, 0x67, 0x5a, 0x03, 0x01, 0x86, 0x80, 0x4d, 0x42, 0xfc, \n\t0xe1, 0x04, 0xb8, 0x9b, 0xc5, 0xc5, 0x00, 0x00, 0xff, 0xff, 0x00, 0x8f, \n\t0x00, 0x00, 0x03, 0x3f, 0x05, 0xc7, 0x02, 0x26, 0x01, 0xdf, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x76, 0x00, 0xc9, 0x00, 0x02, 0x00, 0x25, 0x00, 0xb2, \n\t0xbf, 0x09, 0x01, 0x71, 0xb6, 0xdf, 0x09, 0xef, 0x09, 0xff, 0x09, 0x03, \n\t0x71, 0x40, 0x11, 0x0f, 0x09, 0x1f, 0x09, 0x2f, 0x09, 0x3f, 0x09, 0x4f, \n\t0x09, 0x5f, 0x09, 0x6f, 0x09, 0x7f, 0x09, 0x08, 0x72, 0x30, 0x31, 0x00, \n\t0x00, 0x01, 0x00, 0x6b, 0xff, 0xeb, 0x04, 0x00, 0x04, 0x4e, 0x00, 0x21, \n\t0x00, 0x9a, 0x00, 0xb0, 0x1c, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, \n\t0x2f, 0x1b, 0xb1, 0x0f, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x06, 0x3e, 0x59, 0xb1, 0x00, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0f, 0x10, 0xb1, \n\t0x17, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, \n\t0x2f, 0x1c, 0x01, 0x5d, 0xb2, 0x9f, 0x1c, 0x01, 0x5d, 0xb2, 0xff, 0x1c, \n\t0x01, 0x5d, 0xb2, 0x6f, 0x1c, 0x01, 0x71, 0xb4, 0xcf, 0x1c, 0xdf, 0x1c, \n\t0x02, 0x71, 0xb2, 0x3f, 0x1c, 0x01, 0x72, 0xb2, 0xff, 0x1c, 0x01, 0x71, \n\t0xb2, 0x0f, 0x1c, 0x01, 0x72, 0xb2, 0x9f, 0x1c, 0x01, 0x71, 0xb4, 0x2f, \n\t0x1c, 0x3f, 0x1c, 0x02, 0x71, 0xb4, 0xbf, 0x1c, 0xcf, 0x1c, 0x02, 0x5d, \n\t0xb2, 0x5f, 0x1c, 0x01, 0x5d, 0xb4, 0x6f, 0x1c, 0x7f, 0x1c, 0x02, 0x72, \n\t0xb4, 0xcf, 0x1c, 0xdf, 0x1c, 0x02, 0x72, 0xb0, 0x1c, 0x10, 0xb1, 0x1d, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x25, 0x32, 0x36, 0x35, 0x33, 0x17, 0x16, 0x04, 0x23, 0x22, 0x02, 0x35, \n\t0x35, 0x34, 0x12, 0x33, 0x32, 0x16, 0x07, 0x07, 0x23, 0x34, 0x26, 0x23, \n\t0x22, 0x06, 0x07, 0x17, 0x21, 0x15, 0x21, 0x07, 0x16, 0x16, 0x02, 0x51, \n\t0x62, 0x95, 0xb1, 0x02, 0x05, 0xfe, 0xfd, 0xac, 0xec, 0xfa, 0xfb, 0xeb, \n\t0xbe, 0xf1, 0x04, 0x02, 0xb2, 0x8c, 0x6b, 0x8d, 0x87, 0x05, 0x02, 0x01, \n\t0x78, 0xfe, 0x88, 0x02, 0x05, 0x86, 0x85, 0x79, 0x58, 0x06, 0x8c, 0xd9, \n\t0x01, 0x34, 0xe9, 0x2a, 0xe7, 0x01, 0x35, 0xe0, 0xa3, 0x06, 0x63, 0x8b, \n\t0xbb, 0x8a, 0x05, 0x9a, 0x05, 0x8d, 0xb8, 0x00, 0xff, 0xff, 0x00, 0x67, \n\t0xff, 0xeb, 0x03, 0xc9, 0x04, 0x4e, 0x02, 0x06, 0x00, 0x56, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x9f, 0x00, 0x00, 0x01, 0x64, 0x06, 0x18, 0x02, 0x06, \n\t0x00, 0x4c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xa6, 0x00, 0x00, 0x02, 0x57, \n\t0x05, 0xb6, 0x02, 0x26, 0x00, 0xf3, 0x00, 0x00, 0x01, 0x07, 0x00, 0x6a, \n\t0xfe, 0xfc, 0x00, 0x06, 0x00, 0x33, 0x00, 0xb2, 0x7f, 0x05, 0x01, 0x72, \n\t0xb4, 0xdf, 0x05, 0xef, 0x05, 0x02, 0x71, 0xb2, 0x5f, 0x05, 0x01, 0x72, \n\t0xb4, 0x2f, 0x05, 0x3f, 0x05, 0x02, 0x72, 0xb2, 0x7f, 0x08, 0x01, 0x72, \n\t0xb4, 0xdf, 0x08, 0xef, 0x08, 0x02, 0x71, 0xb2, 0x5f, 0x08, 0x01, 0x72, \n\t0xb4, 0x2f, 0x08, 0x3f, 0x08, 0x02, 0x72, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0xff, 0xbe, 0xfe, 0x4b, 0x01, 0x72, 0x06, 0x18, 0x02, 0x06, \n\t0x00, 0x4d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x41, 0x00, 0x00, 0x06, 0x9e, \n\t0x04, 0x3a, 0x00, 0x16, 0x00, 0x1f, 0x00, 0x69, 0x00, 0xb0, 0x01, 0x2f, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x06, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, \n\t0x06, 0x3e, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x0a, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0f, 0x10, 0xb1, 0x11, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x01, 0x10, \n\t0xb1, 0x17, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x09, 0x10, 0xb1, 0x18, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, \n\t0x06, 0x23, 0x21, 0x11, 0x21, 0x11, 0x10, 0x02, 0x23, 0x23, 0x37, 0x37, \n\t0x32, 0x36, 0x35, 0x11, 0x01, 0x11, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, \n\t0x23, 0x03, 0xfc, 0x01, 0x0d, 0xbf, 0xd6, 0xd7, 0xbe, 0xfe, 0x2e, 0xfe, \n\t0xc2, 0xb2, 0xce, 0x38, 0x04, 0x29, 0x6a, 0x5c, 0x02, 0xc8, 0x01, 0x0d, \n\t0x69, 0x66, 0x65, 0x6a, 0x04, 0x3a, 0xfe, 0x65, 0xb9, 0x93, 0x94, 0xbf, \n\t0x03, 0x9e, 0xfe, 0xce, 0xfe, 0xc2, 0xfe, 0xd2, 0x9e, 0x01, 0xda, 0xf3, \n\t0x01, 0xce, 0xfd, 0xcb, 0xfe, 0x93, 0x70, 0x4d, 0x49, 0x67, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x8f, 0x00, 0x00, 0x06, 0x9d, 0x04, 0x3a, 0x00, 0x12, \n\t0x00, 0x1b, 0x00, 0x6a, 0x00, 0xb0, 0x04, 0x2f, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x0a, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x06, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x06, 0x3e, 0x59, \n\t0xb0, 0x04, 0x10, 0xb0, 0x01, 0xd0, 0xb1, 0x0d, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x13, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0b, 0x10, \n\t0xb1, 0x14, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x01, 0x21, 0x11, 0x33, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, \n\t0x06, 0x23, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x01, 0x11, 0x21, \n\t0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x01, 0x54, 0x01, 0xe2, 0xc5, 0x01, \n\t0x0d, 0xc0, 0xd5, 0xd7, 0xbe, 0xfe, 0x2e, 0xfe, 0x1e, 0xc5, 0xc5, 0x02, \n\t0xa7, 0x01, 0x0d, 0x69, 0x66, 0x65, 0x6a, 0x02, 0xa2, 0x01, 0x98, 0xfe, \n\t0x64, 0xb8, 0x93, 0x94, 0xbf, 0x02, 0x09, 0xfd, 0xf7, 0x04, 0x3a, 0xfd, \n\t0xcb, 0xfe, 0x93, 0x70, 0x4d, 0x49, 0x67, 0x00, 0x00, 0x01, 0x00, 0x13, \n\t0x00, 0x00, 0x04, 0x00, 0x06, 0x18, 0x00, 0x1b, 0x00, 0x6e, 0x00, 0xb0, \n\t0x18, 0x2f, 0xb0, 0x1b, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, \n\t0x1b, 0xb1, 0x05, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, \n\t0x2f, 0x1b, 0xb1, 0x09, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x06, 0x3e, 0x59, 0xb2, 0x5f, 0x1b, 0x01, \n\t0x5d, 0xb2, 0xbf, 0x1b, 0x01, 0x5d, 0xb2, 0x2f, 0x1b, 0x01, 0x5d, 0xb0, \n\t0x1b, 0x10, 0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x05, 0x10, 0xb1, 0x0e, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb0, 0x14, 0xd0, 0xb0, \n\t0x1b, 0x10, 0xb0, 0x16, 0xd0, 0xb2, 0x2f, 0x18, 0x01, 0x5d, 0x30, 0x31, \n\t0x01, 0x21, 0x11, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x23, 0x11, \n\t0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, \n\t0x35, 0x33, 0x15, 0x21, 0x02, 0x94, 0xfe, 0xc0, 0x38, 0xa3, 0x63, 0xad, \n\t0xc1, 0xc5, 0x73, 0x72, 0x52, 0x85, 0x2b, 0xc5, 0x7c, 0x7c, 0xc5, 0x01, \n\t0x40, 0x04, 0xbb, 0xfe, 0xee, 0x4e, 0x57, 0xd0, 0xd8, 0xfd, 0x5a, 0x02, \n\t0xa8, 0x86, 0x80, 0x4d, 0x42, 0xfc, 0xe1, 0x04, 0xbb, 0x9b, 0xc2, 0xc2, \n\t0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x04, 0x41, 0x05, 0xc6, 0x02, 0x26, \n\t0x01, 0xe6, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, 0x01, 0x3e, 0x00, 0x01, \n\t0x00, 0x25, 0x00, 0xb2, 0xbf, 0x12, 0x01, 0x71, 0xb6, 0xdf, 0x12, 0xef, \n\t0x12, 0xff, 0x12, 0x03, 0x71, 0x40, 0x11, 0x0f, 0x12, 0x1f, 0x12, 0x2f, \n\t0x12, 0x3f, 0x12, 0x4f, 0x12, 0x5f, 0x12, 0x6f, 0x12, 0x7f, 0x12, 0x08, \n\t0x72, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x8f, 0x00, 0x00, 0x03, 0xfc, \n\t0x05, 0xcb, 0x02, 0x26, 0x01, 0xe4, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, \n\t0x00, 0xae, 0x00, 0x06, 0x00, 0x25, 0x00, 0xb2, 0xbf, 0x0c, 0x01, 0x71, \n\t0xb6, 0xdf, 0x0c, 0xef, 0x0c, 0xff, 0x0c, 0x03, 0x71, 0x40, 0x11, 0x0f, \n\t0x0c, 0x1f, 0x0c, 0x2f, 0x0c, 0x3f, 0x0c, 0x4f, 0x0c, 0x5f, 0x0c, 0x6f, \n\t0x0c, 0x7f, 0x0c, 0x08, 0x72, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x1a, \n\t0xfe, 0x4b, 0x03, 0xe8, 0x05, 0xf7, 0x02, 0x26, 0x00, 0x5c, 0x00, 0x00, \n\t0x01, 0x06, 0x01, 0x54, 0x56, 0x47, 0x00, 0x33, 0x00, 0xb2, 0x8f, 0x1a, \n\t0x01, 0x71, 0xb2, 0xcf, 0x1a, 0x01, 0x71, 0xb2, 0x1f, 0x1a, 0x01, 0x72, \n\t0xb6, 0x3f, 0x1a, 0x4f, 0x1a, 0x5f, 0x1a, 0x03, 0x5d, 0xb2, 0xff, 0x1a, \n\t0x01, 0x71, 0xb2, 0xaf, 0x1a, 0x01, 0x71, 0xb6, 0x60, 0x1a, 0x70, 0x1a, \n\t0x80, 0x1a, 0x03, 0x5d, 0xb2, 0x00, 0x1a, 0x01, 0x71, 0x30, 0x31, 0x00, \n\t0x00, 0x01, 0x00, 0x8f, 0xfe, 0x9c, 0x03, 0xfc, 0x04, 0x3a, 0x00, 0x0b, \n\t0x00, 0x46, 0x00, 0xb0, 0x08, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, \n\t0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x06, 0x3e, 0x59, 0xb1, 0x01, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x01, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, \n\t0x01, 0x54, 0x01, 0xe3, 0xc5, 0xfe, 0xaf, 0xc5, 0xfe, 0xa9, 0x04, 0x3a, \n\t0xfc, 0x60, 0x03, 0xa0, 0xfb, 0xc6, 0xfe, 0x9c, 0x01, 0x64, 0x04, 0x3a, \n\t0x00, 0x01, 0x00, 0x9d, 0xff, 0xeb, 0x06, 0x69, 0x05, 0xb0, 0x00, 0x20, \n\t0x00, 0x53, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, \n\t0x0f, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x17, 0x2f, 0x1b, \n\t0xb1, 0x17, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x20, 0x2f, \n\t0x1b, 0xb1, 0x20, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, \n\t0x2f, 0x1b, 0xb1, 0x0a, 0x06, 0x3e, 0x59, 0xb0, 0x04, 0xd0, 0xb2, 0x07, \n\t0x0a, 0x17, 0x11, 0x12, 0x39, 0xb0, 0x0a, 0x10, 0xb1, 0x13, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x1c, 0xd0, 0x30, \n\t0x31, 0x01, 0x11, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x06, 0x06, 0x23, \n\t0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, \n\t0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x06, 0x69, \n\t0xe7, 0xbb, 0x6d, 0xaa, 0x2f, 0x33, 0xb0, 0x71, 0xb4, 0xdc, 0xc5, 0x6f, \n\t0x5c, 0x6c, 0x84, 0xcc, 0x7a, 0x64, 0x63, 0x7a, 0x05, 0xb0, 0xfb, 0xd7, \n\t0xc9, 0xd3, 0x57, 0x56, 0x56, 0x57, 0xd3, 0xc9, 0x04, 0x29, 0xfb, 0xd7, \n\t0x7f, 0x83, 0x83, 0x7f, 0x04, 0x29, 0xfb, 0xd7, 0x7e, 0x84, 0x84, 0x7e, \n\t0x04, 0x29, 0x00, 0x00, 0x00, 0x01, 0x00, 0x7c, 0xff, 0xeb, 0x05, 0xa4, \n\t0x04, 0x3a, 0x00, 0x20, 0x00, 0x53, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x17, 0x2f, 0x1b, 0xb1, 0x17, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x20, 0x2f, 0x1b, 0xb1, 0x20, 0x0a, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x06, 0x3e, 0x59, 0xb0, \n\t0x04, 0xd0, 0xb2, 0x07, 0x0a, 0x17, 0x11, 0x12, 0x39, 0xb0, 0x0a, 0x10, \n\t0xb1, 0x13, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x1c, 0xd0, 0x30, 0x31, 0x01, 0x11, 0x14, 0x06, 0x23, 0x22, 0x26, \n\t0x27, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, \n\t0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, \n\t0x35, 0x11, 0x05, 0xa4, 0xd2, 0xa9, 0x5d, 0x92, 0x2c, 0x2f, 0x9a, 0x61, \n\t0xa3, 0xc5, 0xc5, 0x58, 0x4b, 0x59, 0x70, 0xc6, 0x63, 0x53, 0x51, 0x65, \n\t0x04, 0x3a, 0xfd, 0x26, 0xb6, 0xbf, 0x47, 0x47, 0x47, 0x47, 0xbe, 0xb7, \n\t0x02, 0xda, 0xfd, 0x26, 0x6c, 0x6f, 0x70, 0x6b, 0x02, 0xda, 0xfd, 0x26, \n\t0x6c, 0x6f, 0x70, 0x6b, 0x02, 0xda, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcd, \n\t0x00, 0x00, 0x04, 0xbb, 0x05, 0xb0, 0x00, 0x12, 0x00, 0x1b, 0x00, 0x59, \n\t0x00, 0xb0, 0x12, 0x2f, 0xb0, 0x02, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x06, 0x3e, 0x59, 0xb0, 0x12, 0x10, \n\t0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x0b, 0xd0, 0xb0, 0x12, 0x10, 0xb0, 0x0d, 0xd0, 0xb0, 0x02, 0x10, \n\t0xb1, 0x13, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x09, 0x10, 0xb1, 0x14, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x23, 0x15, 0x21, 0x32, 0x04, 0x15, \n\t0x14, 0x04, 0x23, 0x21, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, \n\t0x03, 0x11, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x02, 0x4e, 0xe6, \n\t0x01, 0x67, 0xe9, 0x01, 0x03, 0xfe, 0xfc, 0xe8, 0xfd, 0xd4, 0xd6, 0xd6, \n\t0xc5, 0xe6, 0xe6, 0x01, 0x67, 0x93, 0x94, 0x93, 0x94, 0x04, 0x4d, 0xdd, \n\t0xef, 0xc5, 0xc6, 0xf6, 0x04, 0x4d, 0x9b, 0xc8, 0xc8, 0xfd, 0xed, 0xfd, \n\t0xc5, 0xa9, 0x7b, 0x77, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdb, \n\t0x00, 0x00, 0x04, 0x00, 0x06, 0x18, 0x00, 0x12, 0x00, 0x1b, 0x00, 0x5d, \n\t0x00, 0xb0, 0x10, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, \n\t0xb1, 0x0a, 0x06, 0x3e, 0x59, 0xb2, 0x11, 0x10, 0x0a, 0x11, 0x12, 0x39, \n\t0xb0, 0x11, 0x2f, 0xb1, 0x01, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb2, 0x02, 0x0a, 0x10, 0x11, 0x12, 0x39, 0xb0, 0x02, \n\t0x2f, 0xb0, 0x01, 0x10, 0xb0, 0x0b, 0xd0, 0xb0, 0x11, 0x10, 0xb0, 0x0e, \n\t0xd0, 0xb0, 0x02, 0x10, 0xb1, 0x13, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0a, 0x10, 0xb1, 0x14, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x11, \n\t0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x21, 0x11, 0x23, 0x35, 0x33, \n\t0x11, 0x33, 0x11, 0x21, 0x01, 0x11, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, \n\t0x23, 0x02, 0x9f, 0xfe, 0xbf, 0x01, 0x0d, 0xc0, 0xd5, 0xd7, 0xbe, 0xfe, \n\t0x2e, 0xbe, 0xbe, 0xc5, 0x01, 0x41, 0xfe, 0xbf, 0x01, 0x0d, 0x6a, 0x65, \n\t0x66, 0x69, 0x04, 0x3a, 0xfe, 0xb2, 0xcd, 0xa5, 0xa5, 0xd5, 0x04, 0x3a, \n\t0x9a, 0x01, 0x44, 0xfe, 0xbc, 0xfd, 0x7e, 0xfe, 0x48, 0x7d, 0x5c, 0x5a, \n\t0x85, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xbf, 0xff, 0xec, 0x06, 0x8e, \n\t0x05, 0xc6, 0x00, 0x29, 0x00, 0x85, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x29, 0x2f, 0x1b, 0xb1, 0x29, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x26, 0x2f, 0x1b, 0xb1, 0x26, 0x06, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x20, 0x2f, 0x1b, 0xb1, 0x20, 0x06, 0x3e, 0x59, 0xb2, \n\t0x12, 0x20, 0x05, 0x11, 0x12, 0x39, 0xb0, 0x12, 0x2f, 0xb0, 0x01, 0xd0, \n\t0xb2, 0x0a, 0x05, 0x20, 0x11, 0x12, 0x39, 0xb0, 0x05, 0x10, 0xb1, 0x0d, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x12, \n\t0x10, 0xb1, 0x13, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x20, 0x10, 0xb1, 0x18, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x1b, 0x20, 0x05, 0x11, 0x12, 0x39, 0xb0, \n\t0x13, 0x10, 0xb0, 0x24, 0xd0, 0x30, 0x31, 0x01, 0x33, 0x35, 0x10, 0x00, \n\t0x33, 0x32, 0x00, 0x17, 0x07, 0x23, 0x26, 0x26, 0x23, 0x22, 0x02, 0x15, \n\t0x15, 0x21, 0x15, 0x21, 0x15, 0x14, 0x12, 0x33, 0x32, 0x36, 0x37, 0x33, \n\t0x17, 0x06, 0x00, 0x23, 0x22, 0x00, 0x11, 0x35, 0x23, 0x11, 0x23, 0x11, \n\t0x33, 0x01, 0x85, 0xc4, 0x01, 0x37, 0xf7, 0xf2, 0x01, 0x12, 0x13, 0x02, \n\t0xbd, 0x18, 0xa2, 0x9e, 0xa5, 0xc4, 0x02, 0x1b, 0xfd, 0xe5, 0xc4, 0xa5, \n\t0x9f, 0xa1, 0x18, 0xbd, 0x02, 0x13, 0xfe, 0xea, 0xee, 0xf7, 0xfe, 0xc9, \n\t0xc4, 0xc6, 0xc6, 0x03, 0x42, 0x18, 0x01, 0x0d, 0x01, 0x5f, 0xfe, 0xff, \n\t0xdf, 0x06, 0xa0, 0xab, 0xfe, 0xf6, 0xc5, 0x1a, 0x9b, 0x50, 0xc7, 0xfe, \n\t0xf6, 0xaa, 0xa3, 0x06, 0xd3, 0xfe, 0xf2, 0x01, 0x5e, 0x01, 0x0d, 0x50, \n\t0xfd, 0x59, 0x05, 0xb0, 0x00, 0x01, 0x00, 0x97, 0xff, 0xeb, 0x05, 0xaa, \n\t0x04, 0x4e, 0x00, 0x27, 0x00, 0xa7, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x27, 0x2f, 0x1b, 0xb1, 0x27, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x24, 0x2f, 0x1b, 0xb1, 0x24, 0x06, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x1f, 0x2f, 0x1b, 0xb1, 0x1f, 0x06, 0x3e, 0x59, 0xb2, \n\t0x11, 0x1f, 0x04, 0x11, 0x12, 0x39, 0xb0, 0x11, 0x2f, 0xb4, 0xbf, 0x11, \n\t0xcf, 0x11, 0x02, 0x5d, 0xb2, 0x9f, 0x11, 0x01, 0x71, 0xb2, 0xff, 0x11, \n\t0x01, 0x5d, 0xb2, 0x0f, 0x11, 0x01, 0x71, 0xb2, 0x2f, 0x11, 0x01, 0x5d, \n\t0xb4, 0xcf, 0x11, 0xdf, 0x11, 0x02, 0x71, 0xb0, 0x01, 0xd0, 0xb2, 0x09, \n\t0x04, 0x1f, 0x11, 0x12, 0x39, 0xb0, 0x04, 0x10, 0xb1, 0x0c, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x11, 0x10, 0xb1, \n\t0x12, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x1f, 0x10, 0xb1, 0x17, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb2, 0x1a, 0x1f, 0x04, 0x11, 0x12, 0x39, 0xb0, 0x12, 0x10, \n\t0xb0, 0x22, 0xd0, 0x30, 0x31, 0x01, 0x33, 0x36, 0x12, 0x33, 0x32, 0x16, \n\t0x07, 0x07, 0x23, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x17, 0x21, 0x15, \n\t0x21, 0x07, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x33, 0x17, 0x16, 0x04, \n\t0x23, 0x22, 0x02, 0x27, 0x23, 0x11, 0x23, 0x11, 0x33, 0x01, 0x5c, 0xbb, \n\t0x0e, 0xf9, 0xdd, 0xbe, 0xf1, 0x04, 0x02, 0xb2, 0x8c, 0x6b, 0x8d, 0x87, \n\t0x05, 0x02, 0x01, 0xa3, 0xfe, 0x5d, 0x02, 0x05, 0x86, 0x8e, 0x62, 0x95, \n\t0xb1, 0x02, 0x05, 0xfe, 0xfd, 0xac, 0xdd, 0xf8, 0x0f, 0xbb, 0xc5, 0xc5, \n\t0x02, 0x68, 0xd3, 0x01, 0x13, 0xe0, 0xa3, 0x06, 0x63, 0x8b, 0xbb, 0x8b, \n\t0x05, 0x9a, 0x05, 0x8c, 0xb8, 0x79, 0x58, 0x06, 0x8c, 0xd9, 0x01, 0x0f, \n\t0xd4, 0xfe, 0x32, 0x04, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2b, \n\t0x00, 0x00, 0x04, 0xe3, 0x05, 0xb0, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x69, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0c, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, \n\t0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, \n\t0x06, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, \n\t0xb1, 0x0a, 0x06, 0x3e, 0x59, 0xb2, 0x00, 0x0a, 0x08, 0x11, 0x12, 0x39, \n\t0xb0, 0x00, 0x2f, 0xb0, 0x04, 0xd0, 0xb0, 0x00, 0x10, 0xb1, 0x0d, 0x03, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x08, 0x10, \n\t0xb0, 0x0e, 0xd0, 0xb6, 0x7f, 0x0e, 0x8f, 0x0e, 0x9f, 0x0e, 0x03, 0x5d, \n\t0xb4, 0x5c, 0x0e, 0x6c, 0x0e, 0x02, 0x5d, 0x30, 0x31, 0x01, 0x23, 0x11, \n\t0x23, 0x11, 0x23, 0x03, 0x23, 0x01, 0x33, 0x01, 0x23, 0x01, 0x21, 0x03, \n\t0x23, 0x03, 0x85, 0xa1, 0xc4, 0x94, 0x98, 0xc9, 0x02, 0x0d, 0xa9, 0x02, \n\t0x02, 0xc9, 0xfd, 0xab, 0x01, 0x88, 0xbf, 0x06, 0x01, 0xb6, 0xfe, 0x4a, \n\t0x01, 0xb6, 0xfe, 0x4a, 0x05, 0xb0, 0xfa, 0x50, 0x02, 0x5a, 0x02, 0x33, \n\t0x00, 0x02, 0x00, 0x0d, 0x00, 0x00, 0x04, 0x29, 0x04, 0x3a, 0x00, 0x0b, \n\t0x00, 0x11, 0x00, 0x6d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, \n\t0x1b, 0xb1, 0x09, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, \n\t0x2f, 0x1b, 0xb1, 0x06, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x06, 0x3e, 0x59, 0xb2, 0x05, 0x06, \n\t0x09, 0x11, 0x12, 0x39, 0xb0, 0x05, 0x2f, 0xb0, 0x01, 0xd0, 0xb0, 0x05, \n\t0x10, 0xb1, 0x0c, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x09, 0x10, 0xb0, 0x0f, 0xd0, 0x40, 0x11, 0x2c, 0x0f, 0x3c, \n\t0x0f, 0x4c, 0x0f, 0x5c, 0x0f, 0x6c, 0x0f, 0x7c, 0x0f, 0x8c, 0x0f, 0x9c, \n\t0x0f, 0x08, 0x5d, 0x30, 0x31, 0x01, 0x23, 0x11, 0x23, 0x11, 0x23, 0x03, \n\t0x23, 0x01, 0x33, 0x01, 0x23, 0x01, 0x21, 0x03, 0x27, 0x23, 0x07, 0x02, \n\t0xe9, 0x6a, 0xc4, 0x71, 0x74, 0xc9, 0x01, 0xb8, 0xa9, 0x01, 0xbb, 0xc9, \n\t0xfe, 0x27, 0x01, 0x24, 0x7e, 0x12, 0x06, 0x12, 0x01, 0x26, 0xfe, 0xda, \n\t0x01, 0x26, 0xfe, 0xda, 0x04, 0x3a, 0xfb, 0xc6, 0x01, 0xc1, 0x01, 0x38, \n\t0x44, 0x44, 0x00, 0x00, 0x00, 0x02, 0x00, 0xd1, 0x00, 0x00, 0x06, 0xf4, \n\t0x05, 0xb0, 0x00, 0x13, 0x00, 0x17, 0x00, 0x6f, 0x00, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x0c, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x06, 0x3e, 0x59, 0xb2, \n\t0x0b, 0x10, 0x12, 0x11, 0x12, 0x39, 0xb0, 0x0b, 0x2f, 0xb1, 0x14, 0x03, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x01, 0xd0, \n\t0xb0, 0x12, 0x10, 0xb0, 0x02, 0xd0, 0xb0, 0x10, 0x10, 0xb0, 0x0d, 0xd0, \n\t0xb0, 0x09, 0xd0, 0xb0, 0x05, 0xd0, 0xb0, 0x0b, 0x10, 0xb0, 0x07, 0xd0, \n\t0xb0, 0x0b, 0x10, 0xb0, 0x0e, 0xd0, 0xb0, 0x02, 0x10, 0xb0, 0x16, 0xd0, \n\t0xb4, 0x8f, 0x16, 0x9f, 0x16, 0x02, 0x5d, 0x40, 0x0b, 0x3c, 0x16, 0x4c, \n\t0x16, 0x5c, 0x16, 0x6c, 0x16, 0x7c, 0x16, 0x05, 0x5d, 0x30, 0x31, 0x01, \n\t0x21, 0x01, 0x33, 0x01, 0x23, 0x03, 0x23, 0x11, 0x23, 0x11, 0x23, 0x03, \n\t0x23, 0x13, 0x21, 0x11, 0x23, 0x11, 0x33, 0x01, 0x21, 0x03, 0x23, 0x01, \n\t0x97, 0x01, 0x7e, 0x01, 0x34, 0xa9, 0x02, 0x02, 0xc9, 0x95, 0xa1, 0xc4, \n\t0x94, 0x98, 0xc9, 0x9e, 0xfe, 0xbd, 0xc6, 0xc6, 0x02, 0x3f, 0x01, 0x88, \n\t0xbf, 0x06, 0x02, 0x5b, 0x03, 0x55, 0xfa, 0x50, 0x01, 0xb6, 0xfe, 0x4a, \n\t0x01, 0xb6, 0xfe, 0x4a, 0x01, 0xb7, 0xfe, 0x49, 0x05, 0xb0, 0xfc, 0xaa, \n\t0x02, 0x33, 0x00, 0x00, 0x00, 0x02, 0x00, 0xba, 0x00, 0x00, 0x05, 0xe8, \n\t0x04, 0x3a, 0x00, 0x13, 0x00, 0x19, 0x00, 0x91, 0x00, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x13, 0x2f, 0x1b, 0xb1, 0x13, 0x0a, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0a, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x06, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x06, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x06, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, \n\t0x06, 0x3e, 0x59, 0xb2, 0x0b, 0x0d, 0x02, 0x11, 0x12, 0x39, 0xb0, 0x0b, \n\t0x2f, 0xb1, 0x14, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x01, 0xd0, 0xb0, 0x0b, 0x10, 0xb0, 0x07, 0xd0, 0xb0, 0x0b, \n\t0x10, 0xb0, 0x0e, 0xd0, 0xb0, 0x02, 0x10, 0xb0, 0x17, 0xd0, 0xb4, 0x8f, \n\t0x17, 0x9f, 0x17, 0x02, 0x5d, 0x40, 0x0b, 0x3c, 0x17, 0x4c, 0x17, 0x5c, \n\t0x17, 0x6c, 0x17, 0x7c, 0x17, 0x05, 0x5d, 0x30, 0x31, 0x01, 0x21, 0x01, \n\t0x33, 0x01, 0x23, 0x03, 0x23, 0x11, 0x23, 0x11, 0x23, 0x03, 0x23, 0x13, \n\t0x23, 0x11, 0x23, 0x11, 0x33, 0x01, 0x21, 0x03, 0x27, 0x23, 0x07, 0x01, \n\t0x7f, 0x01, 0x03, 0x01, 0x02, 0xa9, 0x01, 0xbb, 0xc9, 0x77, 0x6a, 0xc4, \n\t0x71, 0x74, 0xc9, 0x77, 0xc4, 0xc5, 0xc5, 0x01, 0xc7, 0x01, 0x24, 0x7e, \n\t0x12, 0x06, 0x12, 0x01, 0xc1, 0x02, 0x79, 0xfb, 0xc6, 0x01, 0x26, 0xfe, \n\t0xda, 0x01, 0x26, 0xfe, 0xda, 0x01, 0x25, 0xfe, 0xdb, 0x04, 0x3a, 0xfd, \n\t0x87, 0x01, 0x38, 0x44, 0x44, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x95, \n\t0x00, 0x00, 0x06, 0x4b, 0x05, 0xb0, 0x00, 0x1d, 0x00, 0x21, 0x00, 0x70, \n\t0x00, 0xb0, 0x1b, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1c, 0x2f, 0x1b, \n\t0xb1, 0x1c, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x15, 0x2f, \n\t0x1b, 0xb1, 0x15, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, \n\t0x2f, 0x1b, 0xb1, 0x0e, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x06, 0x3e, 0x59, 0xb0, 0x1b, 0x10, 0xb0, \n\t0x01, 0xd0, 0xb1, 0x0a, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x1b, 0x10, 0xb1, 0x10, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x1b, 0x10, 0xb0, 0x1e, 0xd0, 0xb0, \n\t0x1c, 0x10, 0xb1, 0x21, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0x30, 0x31, 0x01, 0x33, 0x32, 0x16, 0x15, 0x11, 0x23, 0x11, \n\t0x34, 0x26, 0x23, 0x23, 0x07, 0x11, 0x23, 0x11, 0x27, 0x23, 0x22, 0x06, \n\t0x15, 0x11, 0x23, 0x11, 0x34, 0x36, 0x33, 0x33, 0x01, 0x21, 0x01, 0x33, \n\t0x01, 0x21, 0x04, 0x4c, 0x16, 0xef, 0xfa, 0xc5, 0x8b, 0x99, 0x74, 0x19, \n\t0xc5, 0x11, 0x83, 0x99, 0x89, 0xc5, 0xf7, 0xf0, 0x25, 0xfe, 0x79, 0x04, \n\t0xb9, 0xfd, 0x9f, 0x0a, 0x01, 0x1c, 0xfd, 0xbe, 0x03, 0x2e, 0xd1, 0xea, \n\t0xfe, 0x8d, 0x01, 0x73, 0xa2, 0x7e, 0x2a, 0xfd, 0x97, 0x02, 0x78, 0x1b, \n\t0x7e, 0xa2, 0xfe, 0x8d, 0x01, 0x73, 0xea, 0xd1, 0x02, 0x82, 0xfd, 0x7e, \n\t0x01, 0xe7, 0x00, 0x00, 0x00, 0x02, 0x00, 0x95, 0x00, 0x00, 0x05, 0x57, \n\t0x04, 0x3b, 0x00, 0x1f, 0x00, 0x22, 0x00, 0x67, 0x00, 0xb0, 0x1b, 0x2f, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1c, 0x2f, 0x1b, 0xb1, 0x1c, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x16, 0x2f, 0x1b, 0xb1, 0x16, 0x06, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, \n\t0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, \n\t0x07, 0x06, 0x3e, 0x59, 0xb0, 0x1b, 0x10, 0xb0, 0x02, 0xd0, 0xb0, 0x1b, \n\t0x10, 0xb1, 0x12, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x0b, 0xd0, 0xb0, 0x1b, 0x10, 0xb0, 0x20, 0xd0, 0xb0, 0x1c, \n\t0x10, 0xb1, 0x22, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0x30, 0x31, 0x01, 0x33, 0x01, 0x16, 0x16, 0x15, 0x15, 0x23, 0x35, \n\t0x34, 0x26, 0x23, 0x23, 0x07, 0x11, 0x23, 0x11, 0x27, 0x23, 0x22, 0x06, \n\t0x15, 0x15, 0x23, 0x35, 0x34, 0x36, 0x37, 0x01, 0x33, 0x35, 0x21, 0x01, \n\t0x13, 0x21, 0x04, 0x63, 0x7b, 0xfe, 0xe3, 0xc6, 0xd0, 0xc6, 0x77, 0x84, \n\t0x2f, 0x0b, 0xc5, 0x06, 0x3c, 0x85, 0x76, 0xc5, 0xd4, 0xcd, 0xfe, 0xe4, \n\t0x9e, 0x02, 0xab, 0xfe, 0x99, 0xb0, 0xfe, 0xa0, 0x04, 0x3a, 0xfe, 0x21, \n\t0x0a, 0xd2, 0xdd, 0xa2, 0xa2, 0xa3, 0x7d, 0x13, 0xfe, 0x51, 0x01, 0xb8, \n\t0x0a, 0x7d, 0xa3, 0xa2, 0xa2, 0xe2, 0xd0, 0x07, 0x01, 0xdf, 0x01, 0xfe, \n\t0x24, 0x01, 0x40, 0x00, 0x00, 0x02, 0x00, 0xbe, 0x00, 0x00, 0x08, 0x82, \n\t0x05, 0xb0, 0x00, 0x21, 0x00, 0x25, 0x00, 0x84, 0x00, 0xb0, 0x1e, 0x2f, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1d, 0x2f, 0x1b, 0xb1, 0x1d, 0x0c, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x20, 0x2f, 0x1b, 0xb1, 0x20, 0x0c, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1a, 0x2f, 0x1b, 0xb1, 0x1a, \n\t0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x14, 0x2f, 0x1b, 0xb1, \n\t0x14, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, \n\t0xb1, 0x0d, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, \n\t0x1b, 0xb1, 0x05, 0x06, 0x3e, 0x59, 0xb0, 0x1e, 0x10, 0xb0, 0x00, 0xd0, \n\t0xb0, 0x1e, 0x10, 0xb1, 0x19, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x10, 0xd0, 0xb0, 0x0a, 0xd0, 0xb0, 0x1e, 0x10, \n\t0xb0, 0x22, 0xd0, 0xb0, 0x20, 0x10, 0xb1, 0x25, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x20, 0x16, 0x15, \n\t0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x23, 0x07, 0x11, 0x23, 0x11, 0x27, \n\t0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x34, 0x37, 0x21, 0x11, 0x23, \n\t0x11, 0x33, 0x11, 0x21, 0x01, 0x21, 0x01, 0x33, 0x01, 0x21, 0x06, 0x83, \n\t0x01, 0x05, 0xfa, 0xc5, 0x8b, 0x99, 0x74, 0x19, 0xc5, 0x11, 0x83, 0x99, \n\t0x89, 0xc5, 0x4d, 0xfe, 0x6b, 0xc6, 0xc6, 0x03, 0x54, 0xfe, 0x79, 0x04, \n\t0xb9, 0xfd, 0x9f, 0x0a, 0x01, 0x1c, 0xfd, 0xbe, 0x03, 0x2e, 0xd1, 0xea, \n\t0xfe, 0x8d, 0x01, 0x73, 0xa2, 0x7e, 0x2a, 0xfd, 0x97, 0x02, 0x78, 0x1b, \n\t0x7e, 0xa2, 0xfe, 0x8d, 0x01, 0x73, 0xb9, 0x68, 0xfd, 0x6c, 0x05, 0xb0, \n\t0xfd, 0x7e, 0x02, 0x82, 0xfd, 0x7e, 0x01, 0xe7, 0x00, 0x02, 0x00, 0x99, \n\t0x00, 0x00, 0x07, 0x51, 0x04, 0x3a, 0x00, 0x21, 0x00, 0x24, 0x00, 0x84, \n\t0x00, 0xb0, 0x1f, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1e, 0x2f, 0x1b, \n\t0xb1, 0x1e, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x21, 0x2f, \n\t0x1b, 0xb1, 0x21, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1b, \n\t0x2f, 0x1b, 0xb1, 0x1b, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x16, 0x2f, 0x1b, 0xb1, 0x16, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x06, 0x3e, 0x59, 0xb0, 0x1f, \n\t0x10, 0xb0, 0x01, 0xd0, 0xb0, 0x1f, 0x10, 0xb1, 0x1a, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x11, 0xd0, 0xb0, 0x0a, \n\t0xd0, 0xb0, 0x1f, 0x10, 0xb0, 0x22, 0xd0, 0xb0, 0x21, 0x10, 0xb1, 0x24, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x01, 0x01, 0x16, 0x16, 0x15, 0x15, 0x23, 0x35, 0x34, 0x26, 0x23, 0x23, \n\t0x07, 0x11, 0x23, 0x11, 0x27, 0x23, 0x22, 0x06, 0x15, 0x15, 0x23, 0x35, \n\t0x34, 0x37, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x01, 0x01, 0x13, \n\t0x21, 0x06, 0xd8, 0xfe, 0xe3, 0xc6, 0xd0, 0xc6, 0x77, 0x84, 0x2f, 0x0b, \n\t0xc5, 0x06, 0x3c, 0x85, 0x76, 0xc5, 0x46, 0xfe, 0x89, 0xc5, 0xc5, 0x02, \n\t0xd1, 0xfe, 0xe5, 0x01, 0xe2, 0xb0, 0xfe, 0xa0, 0x04, 0x3a, 0xfe, 0x21, \n\t0x0a, 0xd2, 0xdd, 0xa2, 0xa2, 0xa3, 0x7d, 0x13, 0xfe, 0x51, 0x01, 0xb8, \n\t0x0a, 0x7d, 0xa3, 0xa2, 0xa2, 0xb8, 0x68, 0xfe, 0x3e, 0x04, 0x3a, 0xfe, \n\t0x23, 0x01, 0xdd, 0xfe, 0x25, 0x01, 0x40, 0x00, 0x00, 0x02, 0x00, 0x4a, \n\t0xfe, 0x44, 0x03, 0xa4, 0x07, 0x72, 0x00, 0x2c, 0x00, 0x35, 0x00, 0x94, \n\t0x00, 0xb0, 0x2c, 0x2f, 0xb0, 0x1d, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x16, 0x2f, 0x1b, 0xb1, 0x16, 0x06, 0x3e, 0x59, 0xb0, 0x08, 0x10, \n\t0xb1, 0x07, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb2, 0x7f, 0x2c, 0x01, 0x5d, 0xb2, 0xef, 0x2c, 0x01, 0x5d, 0xb2, 0xcf, \n\t0x2c, 0x01, 0x5d, 0xb2, 0x2f, 0x2c, 0x01, 0x5d, 0xb2, 0x1f, 0x2c, 0x01, \n\t0x71, 0xb0, 0x2c, 0x10, 0xb1, 0x2b, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0f, 0x2b, 0x2c, 0x11, 0x12, 0x39, 0xb0, \n\t0x16, 0x10, 0xb1, 0x23, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x08, 0x10, 0xb0, 0x32, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, \n\t0x1b, 0xdc, 0x59, 0xb0, 0x2d, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, \n\t0x59, 0xb0, 0x2e, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, \n\t0x35, 0xd0, 0x30, 0x31, 0x01, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x21, \n\t0x35, 0x21, 0x32, 0x04, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, 0x14, \n\t0x04, 0x23, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x17, 0x07, 0x26, 0x26, \n\t0x27, 0x34, 0x36, 0x33, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, \n\t0x35, 0x01, 0x37, 0x33, 0x15, 0x05, 0x23, 0x27, 0x35, 0x33, 0x01, 0x9c, \n\t0x9a, 0x92, 0x8f, 0x89, 0xfe, 0xd0, 0x01, 0x30, 0xd3, 0x01, 0x0b, 0x82, \n\t0x73, 0x81, 0x8a, 0xfe, 0xf7, 0xd3, 0x32, 0x4c, 0x45, 0x5d, 0x42, 0x4f, \n\t0x6f, 0x9b, 0x01, 0xb3, 0xa1, 0x2a, 0x81, 0x95, 0xa4, 0x9e, 0x8f, 0x01, \n\t0x0a, 0x93, 0xaa, 0xfe, 0xff, 0x77, 0xfe, 0xa6, 0x03, 0x39, 0x7f, 0x72, \n\t0x66, 0x85, 0x9b, 0xd5, 0xb5, 0x67, 0xa4, 0x2c, 0x29, 0xb0, 0x7f, 0xc8, \n\t0xe3, 0x3b, 0x35, 0x46, 0x55, 0x1e, 0x7f, 0x2f, 0xa4, 0x6f, 0x81, 0x80, \n\t0x95, 0x77, 0x85, 0x86, 0x9b, 0x03, 0xa5, 0x94, 0x12, 0xf5, 0xf3, 0x14, \n\t0x00, 0x02, 0x00, 0x49, 0xfe, 0x44, 0x03, 0x79, 0x06, 0x1a, 0x00, 0x2c, \n\t0x00, 0x35, 0x00, 0xc4, 0x00, 0xb0, 0x2c, 0x2f, 0xb0, 0x1d, 0x2f, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x16, 0x2f, 0x1b, 0xb1, 0x16, 0x06, 0x3e, \n\t0x59, 0xb0, 0x08, 0x10, 0xb1, 0x07, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x5f, 0x2c, 0x01, 0x5d, 0xb4, 0xbf, 0x2c, \n\t0xcf, 0x2c, 0x02, 0x5d, 0xb4, 0x2f, 0x2c, 0x3f, 0x2c, 0x02, 0x71, 0xb2, \n\t0x9f, 0x2c, 0x01, 0x71, 0xb2, 0xff, 0x2c, 0x01, 0x71, 0xb2, 0x0f, 0x2c, \n\t0x01, 0x72, 0xb2, 0x3f, 0x2c, 0x01, 0x72, 0xb4, 0xcf, 0x2c, 0xdf, 0x2c, \n\t0x02, 0x71, 0xb2, 0x6f, 0x2c, 0x01, 0x71, 0xb2, 0xff, 0x2c, 0x01, 0x5d, \n\t0xb2, 0x9f, 0x2c, 0x01, 0x5d, 0xb2, 0x2f, 0x2c, 0x01, 0x5d, 0xb4, 0x6f, \n\t0x2c, 0x7f, 0x2c, 0x02, 0x72, 0xb0, 0x2c, 0x10, 0xb1, 0x2b, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0f, 0x2b, 0x2c, \n\t0x11, 0x12, 0x39, 0xb0, 0x16, 0x10, 0xb1, 0x23, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x08, 0x10, 0xb0, 0x32, 0xb0, \n\t0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x2d, 0xb0, 0x0a, 0x2b, \n\t0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x2e, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, \n\t0x1b, 0xdc, 0x59, 0xb0, 0x35, 0xd0, 0x30, 0x31, 0x01, 0x32, 0x36, 0x35, \n\t0x34, 0x26, 0x23, 0x21, 0x35, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, \n\t0x16, 0x16, 0x15, 0x14, 0x06, 0x23, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, \n\t0x17, 0x07, 0x26, 0x26, 0x27, 0x34, 0x36, 0x33, 0x33, 0x32, 0x36, 0x35, \n\t0x34, 0x26, 0x23, 0x23, 0x35, 0x13, 0x37, 0x33, 0x15, 0x05, 0x23, 0x27, \n\t0x35, 0x33, 0x01, 0x9a, 0x85, 0x7e, 0x7b, 0x74, 0xfe, 0xd1, 0x01, 0x2f, \n\t0xc0, 0xf5, 0x67, 0x5b, 0x69, 0x6f, 0xf3, 0xc0, 0x31, 0x4c, 0x45, 0x5e, \n\t0x42, 0x50, 0x6f, 0x9b, 0x01, 0xb3, 0xa1, 0x29, 0x6e, 0x7f, 0x8f, 0x8a, \n\t0x8f, 0xc4, 0x93, 0xaa, 0xfe, 0xff, 0x77, 0xfe, 0xa6, 0x02, 0x6a, 0x53, \n\t0x4b, 0x41, 0x55, 0x9c, 0xa8, 0x8e, 0x49, 0x77, 0x23, 0x21, 0x7a, 0x56, \n\t0x97, 0xad, 0x3b, 0x35, 0x46, 0x56, 0x1d, 0x7f, 0x2f, 0xa4, 0x6f, 0x81, \n\t0x80, 0x5b, 0x4a, 0x52, 0x51, 0x9b, 0x03, 0x1c, 0x94, 0x12, 0xf5, 0xf3, \n\t0x14, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x57, 0x00, 0x00, 0x05, 0x1b, \n\t0x05, 0xb0, 0x02, 0x06, 0x01, 0x82, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5b, \n\t0xfe, 0x26, 0x05, 0x4d, 0x04, 0x3a, 0x02, 0x06, 0x01, 0xa2, 0x00, 0x00, \n\t0x00, 0x03, 0x00, 0x71, 0xff, 0xeb, 0x05, 0x02, 0x05, 0xc5, 0x00, 0x0d, \n\t0x00, 0x16, 0x00, 0x1f, 0x00, 0x5b, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x06, 0x3e, 0x59, 0xb2, 0x0e, 0x03, \n\t0x0a, 0x11, 0x12, 0x39, 0x7c, 0xb0, 0x0e, 0x2f, 0x18, 0xb2, 0x90, 0x0e, \n\t0x01, 0x5d, 0xb0, 0x0a, 0x10, 0xb1, 0x13, 0x03, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0e, 0x10, 0xb1, 0x18, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, \n\t0x1c, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, \n\t0x31, 0x01, 0x10, 0x00, 0x21, 0x22, 0x00, 0x11, 0x11, 0x10, 0x00, 0x33, \n\t0x20, 0x00, 0x11, 0x05, 0x21, 0x35, 0x34, 0x02, 0x23, 0x22, 0x02, 0x15, \n\t0x05, 0x21, 0x15, 0x14, 0x12, 0x33, 0x32, 0x36, 0x35, 0x05, 0x02, 0xfe, \n\t0xb5, 0xfe, 0xf8, 0xff, 0xfe, 0xc1, 0x01, 0x3f, 0xff, 0x01, 0x08, 0x01, \n\t0x4b, 0xfc, 0x34, 0x03, 0x07, 0xd8, 0xb6, 0xac, 0xcd, 0x03, 0x07, 0xfc, \n\t0xf9, 0xcd, 0xac, 0xb7, 0xd7, 0x02, 0x56, 0xfe, 0xf5, 0xfe, 0xa0, 0x01, \n\t0x60, 0x01, 0x0b, 0x01, 0x03, 0x01, 0x0a, 0x01, 0x62, 0xfe, 0x9f, 0xfe, \n\t0xf5, 0x3d, 0x3f, 0xc8, 0x01, 0x00, 0xff, 0x00, 0xc8, 0xda, 0x2b, 0xca, \n\t0xff, 0x00, 0xff, 0xcb, 0x00, 0x03, 0x00, 0x61, 0xff, 0xeb, 0x04, 0x2a, \n\t0x04, 0x4e, 0x00, 0x0d, 0x00, 0x16, 0x00, 0x1f, 0x00, 0x5e, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x06, 0x3e, \n\t0x59, 0xb1, 0x0e, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb2, 0x1b, 0x0a, 0x03, 0x11, 0x12, 0x39, 0x7c, 0xb0, 0x1b, 0x2f, \n\t0x18, 0xb4, 0x30, 0x1b, 0x40, 0x1b, 0x02, 0x5d, 0xb4, 0x70, 0x1b, 0x80, \n\t0x1b, 0x02, 0x5d, 0xb1, 0x13, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x17, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x13, 0x34, 0x00, 0x33, \n\t0x32, 0x00, 0x15, 0x15, 0x14, 0x00, 0x23, 0x22, 0x00, 0x35, 0x01, 0x32, \n\t0x36, 0x37, 0x27, 0x21, 0x07, 0x16, 0x16, 0x13, 0x22, 0x06, 0x07, 0x17, \n\t0x21, 0x37, 0x26, 0x26, 0x61, 0x01, 0x04, 0xdf, 0xe1, 0x01, 0x05, 0xfe, \n\t0xfc, 0xe0, 0xe0, 0xfe, 0xfb, 0x01, 0xe5, 0x80, 0x8f, 0x08, 0x02, 0xfd, \n\t0xd4, 0x02, 0x08, 0x8f, 0x80, 0x7d, 0x8e, 0x0b, 0x02, 0x02, 0x2a, 0x02, \n\t0x0b, 0x90, 0x02, 0x27, 0xf0, 0x01, 0x37, 0xfe, 0xca, 0xf1, 0x16, 0xf2, \n\t0xfe, 0xcc, 0x01, 0x35, 0xf1, 0xfe, 0x74, 0xb9, 0x92, 0x05, 0x05, 0x92, \n\t0xb9, 0x03, 0x2e, 0xb3, 0x8b, 0x05, 0x05, 0x8a, 0xb4, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x16, 0x00, 0x00, 0x04, 0xdc, 0x05, 0xc4, 0x00, 0x11, \n\t0x00, 0x4c, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, \n\t0x11, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, \n\t0xb1, 0x07, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, \n\t0x1b, 0xb1, 0x0e, 0x06, 0x3e, 0x59, 0xb0, 0x01, 0xd0, 0x40, 0x0d, 0x44, \n\t0x01, 0x54, 0x01, 0x64, 0x01, 0x74, 0x01, 0x84, 0x01, 0x94, 0x01, 0x06, \n\t0x5d, 0xb0, 0x07, 0x10, 0xb1, 0x0a, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x17, 0x33, 0x37, 0x13, 0x36, \n\t0x36, 0x33, 0x17, 0x07, 0x23, 0x22, 0x06, 0x07, 0x01, 0x23, 0x01, 0x33, \n\t0x02, 0x45, 0x21, 0x06, 0x21, 0xfd, 0x31, 0x83, 0x6c, 0x32, 0x01, 0x0c, \n\t0x32, 0x3d, 0x1b, 0xfe, 0x78, 0xa9, 0xfe, 0x02, 0xd6, 0x01, 0x7e, 0x79, \n\t0x79, 0x03, 0x25, 0x9c, 0x85, 0x01, 0xa9, 0x3f, 0x50, 0xfb, 0x75, 0x05, \n\t0xb0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2e, 0x00, 0x00, 0x04, 0x0e, \n\t0x04, 0x4d, 0x00, 0x15, 0x00, 0x54, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x14, 0x2f, 0x1b, 0xb1, 0x14, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x06, 0x3e, 0x59, 0xb0, 0x01, \n\t0xd0, 0x40, 0x09, 0x34, 0x01, 0x44, 0x01, 0x54, 0x01, 0x64, 0x01, 0x04, \n\t0x5d, 0xb2, 0x73, 0x01, 0x01, 0x5d, 0xb4, 0x80, 0x01, 0x90, 0x01, 0x02, \n\t0x5d, 0xb0, 0x07, 0x10, 0xb1, 0x0e, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x17, 0x33, 0x37, 0x13, 0x36, \n\t0x36, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x06, 0x07, \n\t0x01, 0x23, 0x01, 0x33, 0x01, 0xe3, 0x11, 0x06, 0x13, 0x95, 0x29, 0x84, \n\t0x52, 0x22, 0x33, 0x18, 0x16, 0x05, 0x16, 0x0d, 0x20, 0x3b, 0x0d, 0xfe, \n\t0xd8, 0x95, 0xfe, 0x83, 0xca, 0x01, 0x3f, 0x4c, 0x4c, 0x02, 0x17, 0x7f, \n\t0x78, 0x0a, 0x0f, 0x97, 0x03, 0x05, 0x34, 0x2a, 0xfc, 0xb9, 0x04, 0x3a, \n\t0xff, 0xff, 0x00, 0x16, 0x00, 0x00, 0x04, 0xdc, 0x07, 0x48, 0x02, 0x26, \n\t0x02, 0x20, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5f, 0x04, 0x38, 0x01, 0x5a, \n\t0x00, 0x1d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, \n\t0x12, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x19, 0x2f, 0x1b, \n\t0xb1, 0x19, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0xff, 0xff, 0xff, 0xfe, \n\t0x00, 0x00, 0x04, 0x0e, 0x06, 0x20, 0x02, 0x26, 0x02, 0x21, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x5f, 0x03, 0xd2, 0x00, 0x32, 0x00, 0x12, 0xb2, 0x38, \n\t0x17, 0x01, 0x5d, 0x00, 0xb2, 0x3f, 0x17, 0x01, 0x5d, 0xb2, 0x3f, 0x1d, \n\t0x01, 0x5d, 0x30, 0x31, 0xff, 0xff, 0x00, 0x71, 0xfe, 0x4b, 0x09, 0x5c, \n\t0x05, 0xc5, 0x00, 0x26, 0x00, 0x32, 0x00, 0x00, 0x00, 0x07, 0x00, 0x5c, \n\t0x05, 0x74, 0x00, 0x00, 0xff, 0xff, 0x00, 0x61, 0xfe, 0x4b, 0x08, 0x74, \n\t0x04, 0x4e, 0x00, 0x26, 0x00, 0x52, 0x00, 0x00, 0x00, 0x07, 0x00, 0x5c, \n\t0x04, 0x8c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x71, 0xff, 0x73, 0x05, 0x02, \n\t0x06, 0x35, 0x00, 0x17, 0x00, 0x2f, 0x00, 0x73, 0x00, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x0c, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x13, 0x2f, 0x1b, 0xb1, 0x13, 0x0c, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x06, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x06, 0x3e, \n\t0x59, 0xb0, 0x13, 0x10, 0xb1, 0x1c, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x10, 0x10, 0xb1, 0x1f, 0x03, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x07, 0x10, 0xb1, 0x28, \n\t0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, \n\t0x10, 0xb1, 0x2b, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0x30, 0x31, 0x01, 0x10, 0x07, 0x06, 0x07, 0x15, 0x23, 0x35, 0x26, \n\t0x27, 0x26, 0x11, 0x11, 0x10, 0x37, 0x36, 0x37, 0x35, 0x33, 0x15, 0x16, \n\t0x17, 0x16, 0x11, 0x27, 0x34, 0x27, 0x26, 0x27, 0x15, 0x23, 0x35, 0x06, \n\t0x07, 0x06, 0x15, 0x11, 0x14, 0x17, 0x16, 0x17, 0x35, 0x33, 0x15, 0x36, \n\t0x37, 0x36, 0x35, 0x05, 0x02, 0xa6, 0x81, 0xbe, 0xc5, 0xc4, 0x84, 0x9f, \n\t0x9f, 0x84, 0xc4, 0xc5, 0xbe, 0x81, 0xa6, 0xc5, 0x6c, 0x49, 0x6b, 0xc5, \n\t0x71, 0x4b, 0x66, 0x66, 0x4b, 0x71, 0xc5, 0x6b, 0x49, 0x6c, 0x02, 0x56, \n\t0xfe, 0xf5, 0xb0, 0x8a, 0x1d, 0x81, 0x7e, 0x19, 0x91, 0xb0, 0x01, 0x0b, \n\t0x01, 0x03, 0x01, 0x0a, 0xb1, 0x92, 0x19, 0x76, 0x79, 0x1e, 0x8a, 0xb0, \n\t0xfe, 0xf5, 0x02, 0xc8, 0x80, 0x56, 0x1c, 0x65, 0x6a, 0x19, 0x5e, 0x80, \n\t0xc8, 0xfe, 0xfb, 0xca, 0x80, 0x5e, 0x19, 0x6c, 0x68, 0x1c, 0x56, 0x80, \n\t0xcb, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x61, 0xff, 0x8a, 0x04, 0x2a, \n\t0x04, 0xb6, 0x00, 0x17, 0x00, 0x2f, 0x00, 0x73, 0x00, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0a, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x0a, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x06, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x17, 0x2f, 0x1b, 0xb1, 0x17, 0x06, 0x3e, \n\t0x59, 0xb0, 0x02, 0x10, 0xb1, 0x1c, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x17, 0x10, 0xb1, 0x1f, 0x03, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0e, 0x10, 0xb1, 0x28, \n\t0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0b, \n\t0x10, 0xb1, 0x2b, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0x30, 0x31, 0x05, 0x23, 0x35, 0x26, 0x27, 0x26, 0x35, 0x35, 0x34, \n\t0x37, 0x36, 0x37, 0x35, 0x33, 0x15, 0x16, 0x17, 0x16, 0x15, 0x15, 0x14, \n\t0x07, 0x06, 0x07, 0x01, 0x14, 0x17, 0x16, 0x17, 0x35, 0x33, 0x15, 0x36, \n\t0x37, 0x36, 0x35, 0x35, 0x34, 0x27, 0x26, 0x27, 0x15, 0x23, 0x35, 0x06, \n\t0x07, 0x06, 0x15, 0x02, 0xa9, 0xc5, 0x9c, 0x65, 0x82, 0x82, 0x64, 0x9d, \n\t0xc5, 0x9b, 0x63, 0x83, 0x82, 0x64, 0x9b, 0xfe, 0x7d, 0x48, 0x2d, 0x49, \n\t0xc5, 0x46, 0x2d, 0x49, 0x4a, 0x2c, 0x46, 0xc5, 0x48, 0x2e, 0x48, 0x76, \n\t0x69, 0x1b, 0x77, 0x9b, 0xf1, 0x16, 0xf0, 0x9b, 0x79, 0x1b, 0x70, 0x71, \n\t0x1c, 0x76, 0x9b, 0xf1, 0x16, 0xf2, 0x9a, 0x76, 0x1b, 0x02, 0x1d, 0xac, \n\t0x70, 0x46, 0x1b, 0x67, 0x66, 0x1b, 0x45, 0x70, 0xac, 0x16, 0xaa, 0x71, \n\t0x44, 0x1b, 0x5d, 0x5f, 0x1b, 0x46, 0x71, 0xaa, 0x00, 0x03, 0x00, 0x9d, \n\t0xff, 0xeb, 0x06, 0x64, 0x07, 0x58, 0x00, 0x2e, 0x00, 0x40, 0x00, 0x46, \n\t0x00, 0xa2, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, \n\t0x01, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, \n\t0xb1, 0x0e, 0x06, 0x3e, 0x59, 0xb0, 0x08, 0xd0, 0xb2, 0x0b, 0x0e, 0x01, \n\t0x11, 0x12, 0x39, 0xb0, 0x01, 0x10, 0xb0, 0x15, 0xd0, 0xb0, 0x01, 0x10, \n\t0xb1, 0x2e, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x17, 0xd0, 0xb0, 0x0e, 0x10, 0xb1, 0x1e, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x23, 0x01, 0x0e, 0x11, 0x12, \n\t0x39, 0xb0, 0x23, 0x2f, 0xb0, 0x1e, 0x10, 0xb0, 0x27, 0xd0, 0xb2, 0x41, \n\t0x17, 0x01, 0x11, 0x12, 0x39, 0xb0, 0x41, 0x2f, 0xb0, 0x44, 0xb0, 0x0a, \n\t0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x31, 0xd0, 0xb0, 0x31, 0x2f, \n\t0xb0, 0x34, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x31, \n\t0x10, 0xb0, 0x38, 0xd0, 0xb0, 0x34, 0x10, 0xb0, 0x3d, 0xb0, 0x0a, 0x2b, \n\t0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x31, 0x10, 0xb0, 0x40, 0xb0, 0x0a, \n\t0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, 0x01, 0x37, 0x36, 0x16, \n\t0x15, 0x11, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x06, 0x06, 0x23, 0x22, \n\t0x26, 0x35, 0x11, 0x34, 0x36, 0x17, 0x17, 0x15, 0x22, 0x06, 0x15, 0x11, \n\t0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, \n\t0x32, 0x36, 0x35, 0x11, 0x34, 0x26, 0x23, 0x13, 0x15, 0x23, 0x22, 0x24, \n\t0x23, 0x22, 0x06, 0x15, 0x15, 0x23, 0x35, 0x34, 0x36, 0x33, 0x32, 0x04, \n\t0x33, 0x01, 0x27, 0x37, 0x27, 0x33, 0x15, 0x04, 0xd4, 0x06, 0xae, 0xdc, \n\t0xdd, 0xb3, 0x72, 0xb0, 0x32, 0x33, 0xb0, 0x70, 0xb4, 0xdc, 0xdb, 0xaf, \n\t0x06, 0x5c, 0x6f, 0x6f, 0x5c, 0x6c, 0x84, 0xc6, 0x84, 0x6d, 0x5a, 0x71, \n\t0x71, 0x5a, 0x66, 0x2e, 0x83, 0xfe, 0xd5, 0x2a, 0x32, 0x3a, 0x86, 0x7c, \n\t0x72, 0x48, 0x01, 0x24, 0x72, 0xfe, 0x47, 0x50, 0x3a, 0x01, 0xbc, 0x05, \n\t0xa7, 0x02, 0x04, 0xe6, 0xda, 0xfd, 0xc0, 0xdb, 0xe7, 0x55, 0x55, 0x55, \n\t0x55, 0xe7, 0xdb, 0x02, 0x40, 0xda, 0xe6, 0x04, 0x02, 0x92, 0x98, 0x90, \n\t0xfd, 0xc0, 0x91, 0x97, 0x83, 0x7f, 0x01, 0xb0, 0xfe, 0x50, 0x7f, 0x83, \n\t0x97, 0x91, 0x02, 0x40, 0x90, 0x98, 0x01, 0xc7, 0x81, 0x7b, 0x36, 0x34, \n\t0x12, 0x24, 0x6c, 0x6e, 0x7c, 0xfe, 0x4a, 0x42, 0x73, 0x8c, 0x7b, 0x00, \n\t0x00, 0x03, 0x00, 0x7b, 0xff, 0xeb, 0x05, 0xa2, 0x05, 0xf1, 0x00, 0x2e, \n\t0x00, 0x40, 0x00, 0x46, 0x00, 0xa2, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x06, 0x3e, 0x59, 0xb0, 0x08, 0xd0, \n\t0xb2, 0x0b, 0x0e, 0x01, 0x11, 0x12, 0x39, 0xb0, 0x01, 0x10, 0xb0, 0x15, \n\t0xd0, 0xb0, 0x01, 0x10, 0xb1, 0x2e, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x17, 0xd0, 0xb0, 0x0e, 0x10, 0xb1, 0x1e, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x23, \n\t0x01, 0x0e, 0x11, 0x12, 0x39, 0xb0, 0x23, 0x2f, 0xb0, 0x1e, 0x10, 0xb0, \n\t0x27, 0xd0, 0xb2, 0x41, 0x17, 0x01, 0x11, 0x12, 0x39, 0xb0, 0x41, 0x2f, \n\t0xb0, 0x44, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x30, \n\t0xd0, 0xb0, 0x30, 0x2f, 0xb0, 0x2f, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, \n\t0xdc, 0x59, 0xb0, 0x30, 0x10, 0xb0, 0x34, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, \n\t0x1b, 0xdc, 0x59, 0xb0, 0x30, 0x10, 0xb0, 0x38, 0xd0, 0xb0, 0x34, 0x10, \n\t0xb0, 0x3d, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, \n\t0x01, 0x37, 0x36, 0x16, 0x15, 0x11, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, \n\t0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x11, 0x34, 0x36, 0x17, 0x17, 0x15, \n\t0x22, 0x06, 0x15, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x33, \n\t0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x34, 0x26, 0x23, 0x13, \n\t0x15, 0x23, 0x22, 0x24, 0x23, 0x22, 0x06, 0x15, 0x15, 0x23, 0x35, 0x34, \n\t0x36, 0x33, 0x32, 0x04, 0x33, 0x01, 0x27, 0x37, 0x27, 0x17, 0x15, 0x04, \n\t0x3a, 0x06, 0x9d, 0xc5, 0xc6, 0xa2, 0x63, 0x9b, 0x2e, 0x2f, 0x9a, 0x62, \n\t0xa3, 0xc5, 0xc4, 0x9e, 0x06, 0x4b, 0x58, 0x58, 0x4b, 0x59, 0x70, 0xc5, \n\t0x6f, 0x5a, 0x4a, 0x59, 0x59, 0x4a, 0xae, 0x2e, 0x83, 0xfe, 0xd5, 0x2a, \n\t0x32, 0x3a, 0x86, 0x7c, 0x72, 0x48, 0x01, 0x24, 0x72, 0xfe, 0x49, 0x4f, \n\t0x37, 0x01, 0xb9, 0x04, 0x3b, 0x03, 0x04, 0xd2, 0xc7, 0xfe, 0xdd, 0xc9, \n\t0xd2, 0x48, 0x48, 0x48, 0x48, 0xd2, 0xc9, 0x01, 0x23, 0xc7, 0xd2, 0x04, \n\t0x03, 0x92, 0x83, 0x7d, 0xfe, 0xdd, 0x7f, 0x82, 0x70, 0x6b, 0xea, 0xea, \n\t0x6b, 0x70, 0x82, 0x7f, 0x01, 0x23, 0x7d, 0x83, 0x01, 0xcc, 0x81, 0x7b, \n\t0x36, 0x34, 0x12, 0x24, 0x6c, 0x6e, 0x7c, 0xfe, 0x51, 0x48, 0x6d, 0x7e, \n\t0x06, 0x75, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9d, 0xff, 0xeb, 0x06, 0x69, \n\t0x07, 0x05, 0x00, 0x07, 0x00, 0x28, 0x00, 0x6c, 0x00, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x17, 0x2f, 0x1b, 0xb1, 0x17, 0x0c, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x06, 0x3e, 0x59, 0xb0, \n\t0x17, 0x10, 0xb0, 0x06, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, \n\t0xb0, 0x07, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x07, 0x10, 0xb0, \n\t0x04, 0xd0, 0xb0, 0x17, 0x10, 0xb0, 0x1f, 0xd0, 0xb0, 0x28, 0xd0, 0xb0, \n\t0x12, 0x10, 0xb1, 0x1b, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x24, 0xd0, 0xb2, 0x0f, 0x12, 0x1f, 0x11, 0x12, 0x39, \n\t0xb0, 0x12, 0x10, 0xb0, 0x0c, 0xd0, 0x30, 0x31, 0x01, 0x35, 0x21, 0x17, \n\t0x21, 0x15, 0x23, 0x35, 0x05, 0x11, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, \n\t0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, \n\t0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, \n\t0x11, 0x01, 0xd5, 0x03, 0x35, 0x01, 0xfe, 0xb5, 0xb2, 0x03, 0x5b, 0xe7, \n\t0xbb, 0x6d, 0xaa, 0x2f, 0x33, 0xb0, 0x71, 0xb4, 0xdc, 0xc5, 0x6f, 0x5c, \n\t0x6c, 0x84, 0xcc, 0x7a, 0x64, 0x63, 0x7a, 0x06, 0x98, 0x6d, 0x6d, 0x7e, \n\t0x7e, 0xe8, 0xfb, 0xd7, 0xc9, 0xd3, 0x57, 0x56, 0x56, 0x57, 0xd3, 0xc9, \n\t0x04, 0x29, 0xfb, 0xd7, 0x7f, 0x83, 0x83, 0x7f, 0x04, 0x29, 0xfb, 0xd7, \n\t0x7e, 0x84, 0x84, 0x7e, 0x04, 0x29, 0x00, 0x00, 0x00, 0x02, 0x00, 0x7c, \n\t0xff, 0xeb, 0x05, 0xa4, 0x05, 0xb1, 0x00, 0x07, 0x00, 0x28, 0x00, 0x6f, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x17, 0x2f, 0x1b, 0xb1, 0x17, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, \n\t0x06, 0x3e, 0x59, 0xb0, 0x17, 0x10, 0xb0, 0x06, 0xb0, 0x0a, 0x2b, 0x58, \n\t0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x07, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, \n\t0xdc, 0x59, 0xb0, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, \n\t0xb0, 0x07, 0x10, 0xb0, 0x04, 0xd0, 0xb0, 0x12, 0x10, 0xb0, 0x0c, 0xd0, \n\t0xb0, 0x17, 0x10, 0xb0, 0x1f, 0xd0, 0xb2, 0x0f, 0x12, 0x1f, 0x11, 0x12, \n\t0x39, 0xb0, 0x12, 0x10, 0xb1, 0x1b, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x24, 0xd0, 0xb0, 0x1f, 0x10, 0xb0, 0x28, \n\t0xd0, 0x30, 0x31, 0x01, 0x35, 0x21, 0x17, 0x21, 0x15, 0x23, 0x35, 0x01, \n\t0x11, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x06, 0x06, 0x23, 0x22, 0x26, \n\t0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, \n\t0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x01, 0x7c, 0x03, 0x35, \n\t0x03, 0xfe, 0xb3, 0xb2, 0x02, 0xef, 0xd2, 0xa9, 0x5d, 0x92, 0x2c, 0x2f, \n\t0x9a, 0x61, 0xa3, 0xc5, 0xc5, 0x58, 0x4b, 0x59, 0x70, 0xc6, 0x63, 0x53, \n\t0x51, 0x65, 0x05, 0x44, 0x6d, 0x6d, 0x80, 0x80, 0xfe, 0xf6, 0xfd, 0x26, \n\t0xb6, 0xbf, 0x47, 0x47, 0x47, 0x47, 0xbe, 0xb7, 0x02, 0xda, 0xfd, 0x26, \n\t0x6c, 0x6f, 0x70, 0x6b, 0x02, 0xda, 0xfd, 0x26, 0x6c, 0x6f, 0x70, 0x6b, \n\t0x02, 0xda, 0x00, 0x00, 0x00, 0x01, 0x00, 0x76, 0xfe, 0x81, 0x04, 0xbf, \n\t0x05, 0xc5, 0x00, 0x19, 0x00, 0x3e, 0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0c, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x06, 0x3e, 0x59, \n\t0xb0, 0x09, 0x10, 0xb1, 0x11, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x02, 0x10, 0xb1, 0x19, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x23, 0x11, 0x26, \n\t0x00, 0x35, 0x11, 0x10, 0x00, 0x33, 0x32, 0x00, 0x07, 0x07, 0x23, 0x34, \n\t0x26, 0x23, 0x22, 0x02, 0x15, 0x11, 0x14, 0x12, 0x33, 0x33, 0x03, 0x17, \n\t0xc4, 0xd7, 0xfe, 0xfa, 0x01, 0x37, 0xf7, 0xf7, 0x01, 0x24, 0x04, 0x02, \n\t0xbd, 0xb4, 0xa4, 0xa5, 0xc4, 0xc4, 0xa5, 0x73, 0xfe, 0x81, 0x01, 0x70, \n\t0x1d, 0x01, 0x52, 0xf6, 0x01, 0x03, 0x01, 0x0d, 0x01, 0x5f, 0xfe, 0xf9, \n\t0xd9, 0x06, 0x99, 0xb2, 0xfe, 0xf6, 0xc5, 0xfe, 0xfb, 0xc7, 0xfe, 0xf6, \n\t0x00, 0x01, 0x00, 0x62, 0xfe, 0x81, 0x03, 0xe1, 0x04, 0x4e, 0x00, 0x19, \n\t0x00, 0x3e, 0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, \n\t0x2f, 0x1b, 0xb1, 0x09, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x06, 0x3e, 0x59, 0xb0, 0x09, 0x10, 0xb1, \n\t0x11, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x02, 0x10, 0xb1, 0x19, 0x05, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0x30, 0x31, 0x01, 0x23, 0x11, 0x26, 0x02, 0x35, 0x35, 0x34, \n\t0x12, 0x33, 0x32, 0x16, 0x07, 0x07, 0x23, 0x34, 0x26, 0x23, 0x22, 0x06, \n\t0x15, 0x15, 0x14, 0x16, 0x33, 0x33, 0x02, 0xa7, 0xc5, 0xb5, 0xcb, 0xff, \n\t0xdc, 0xb6, 0xee, 0x04, 0x02, 0xb2, 0x89, 0x63, 0x8a, 0x8c, 0x8b, 0x8b, \n\t0x6a, 0xfe, 0x81, 0x01, 0x72, 0x20, 0x01, 0x2a, 0xcb, 0x2a, 0xe3, 0x01, \n\t0x39, 0xe0, 0xa3, 0x06, 0x62, 0x8c, 0xe6, 0x9b, 0x2a, 0x9f, 0xe4, 0x00, \n\t0x00, 0x01, 0x00, 0x70, 0x00, 0x00, 0x04, 0x94, 0x05, 0x3e, 0x00, 0x13, \n\t0x00, 0x13, 0x00, 0xb0, 0x0e, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, \n\t0x2f, 0x1b, 0xb1, 0x04, 0x06, 0x3e, 0x59, 0x30, 0x31, 0x01, 0x05, 0x07, \n\t0x25, 0x03, 0x23, 0x13, 0x25, 0x37, 0x05, 0x13, 0x25, 0x37, 0x05, 0x13, \n\t0x33, 0x03, 0x05, 0x07, 0x25, 0x02, 0x5c, 0x01, 0x21, 0x47, 0xfe, 0xdd, \n\t0xb5, 0xae, 0xe1, 0xfe, 0xdf, 0x47, 0x01, 0x25, 0xca, 0xfe, 0xde, 0x49, \n\t0x01, 0x23, 0xb9, 0xab, 0xe5, 0x01, 0x25, 0x4b, 0xfe, 0xe0, 0x01, 0xbf, \n\t0xac, 0x7d, 0xaa, 0xfe, 0xc0, 0x01, 0x8e, 0xab, 0x7c, 0xab, 0x01, 0x6c, \n\t0xab, 0x7e, 0xab, 0x01, 0x4a, 0xfe, 0x69, 0xab, 0x7c, 0xaa, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0xd4, 0x04, 0xa4, 0x03, 0xa3, 0x05, 0xfc, 0x00, 0x07, \n\t0x00, 0x10, 0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x03, 0xb0, 0x0a, 0x2b, 0x58, \n\t0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, 0x01, 0x15, 0x27, 0x37, 0x21, 0x27, \n\t0x17, 0x15, 0x01, 0x83, 0xaf, 0x01, 0x02, 0x20, 0x01, 0xaf, 0x05, 0x22, \n\t0x7e, 0x01, 0xeb, 0x6c, 0x01, 0xd9, 0x00, 0x00, 0x00, 0x01, 0x00, 0xfb, \n\t0x05, 0x17, 0x03, 0xf3, 0x06, 0x15, 0x00, 0x11, 0x00, 0x27, 0x00, 0xb0, \n\t0x10, 0x2f, 0xb0, 0x0c, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, \n\t0xb0, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x10, \n\t0x10, 0xb0, 0x11, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0x30, \n\t0x31, 0x01, 0x32, 0x24, 0x33, 0x32, 0x16, 0x15, 0x15, 0x23, 0x35, 0x34, \n\t0x26, 0x23, 0x22, 0x04, 0x23, 0x23, 0x35, 0x01, 0x27, 0x71, 0x01, 0x24, \n\t0x49, 0x71, 0x7d, 0x86, 0x3b, 0x31, 0x2b, 0xfe, 0xd5, 0x82, 0x2e, 0x05, \n\t0x99, 0x7c, 0x6e, 0x6c, 0x24, 0x12, 0x34, 0x36, 0x7c, 0x82, 0x00, 0x00, \n\t0x00, 0x01, 0x01, 0x00, 0x05, 0x15, 0x01, 0xf5, 0x06, 0x57, 0x00, 0x05, \n\t0x00, 0x10, 0x00, 0xb0, 0x05, 0x2f, 0xb0, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, 0x01, 0x35, 0x33, 0x07, 0x17, 0x07, \n\t0x01, 0x00, 0xbb, 0x01, 0x3b, 0x51, 0x05, 0xdc, 0x7b, 0x8c, 0x74, 0x42, \n\t0x00, 0x01, 0x01, 0x2c, 0x05, 0x15, 0x02, 0x21, 0x06, 0x57, 0x00, 0x05, \n\t0x00, 0x10, 0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x03, 0xb0, 0x0a, 0x2b, 0x58, \n\t0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, 0x01, 0x27, 0x37, 0x27, 0x33, 0x15, \n\t0x01, 0x7c, 0x50, 0x3a, 0x01, 0xbc, 0x05, 0x15, 0x42, 0x74, 0x8c, 0x7b, \n\t0x00, 0x08, 0x00, 0x3b, 0xfe, 0xc4, 0x07, 0xd4, 0x05, 0xaf, 0x00, 0x0f, \n\t0x00, 0x1f, 0x00, 0x2f, 0x00, 0x3f, 0x00, 0x4f, 0x00, 0x5f, 0x00, 0x6f, \n\t0x00, 0x7f, 0x00, 0x9a, 0x00, 0xb0, 0x64, 0x2f, 0xb0, 0x74, 0x2f, 0xb0, \n\t0x44, 0x2f, 0xb0, 0x54, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, \n\t0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb1, 0x0c, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x54, 0x10, 0xb0, 0x14, 0xd0, \n\t0xb1, 0x1c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x64, 0x10, 0xb0, 0x24, 0xd0, 0xb1, 0x2c, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x74, 0x10, 0xb0, 0x34, 0xd0, \n\t0xb1, 0x3c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x44, 0x10, 0xb1, 0x4c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x54, 0x10, 0xb1, 0x5c, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x64, 0x10, 0xb1, 0x6c, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x74, 0x10, \n\t0xb1, 0x7c, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x01, 0x27, 0x26, 0x36, 0x33, 0x32, 0x16, 0x07, 0x07, 0x23, \n\t0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x01, 0x27, 0x26, 0x36, 0x33, 0x32, \n\t0x16, 0x07, 0x07, 0x23, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x13, 0x27, \n\t0x26, 0x36, 0x33, 0x32, 0x16, 0x07, 0x07, 0x23, 0x34, 0x26, 0x23, 0x22, \n\t0x06, 0x15, 0x01, 0x27, 0x26, 0x36, 0x33, 0x32, 0x16, 0x07, 0x07, 0x23, \n\t0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x01, 0x27, 0x26, 0x36, 0x33, 0x32, \n\t0x16, 0x07, 0x07, 0x23, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x01, 0x27, \n\t0x26, 0x36, 0x33, 0x32, 0x16, 0x07, 0x07, 0x23, 0x34, 0x26, 0x23, 0x22, \n\t0x06, 0x15, 0x01, 0x27, 0x26, 0x36, 0x33, 0x32, 0x16, 0x07, 0x07, 0x23, \n\t0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x13, 0x27, 0x26, 0x36, 0x33, 0x32, \n\t0x16, 0x07, 0x07, 0x23, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x03, 0x2f, \n\t0x02, 0x05, 0x70, 0x61, 0x60, 0x71, 0x04, 0x02, 0x68, 0x31, 0x32, 0x32, \n\t0x2f, 0x01, 0xe6, 0x02, 0x05, 0x71, 0x60, 0x60, 0x72, 0x04, 0x02, 0x69, \n\t0x30, 0x33, 0x32, 0x2e, 0x51, 0x02, 0x05, 0x71, 0x60, 0x60, 0x71, 0x04, \n\t0x02, 0x68, 0x30, 0x33, 0x32, 0x2f, 0xfe, 0xd2, 0x02, 0x05, 0x71, 0x60, \n\t0x60, 0x71, 0x04, 0x02, 0x68, 0x30, 0x33, 0x32, 0x2f, 0xfd, 0x57, 0x02, \n\t0x05, 0x70, 0x61, 0x60, 0x71, 0x04, 0x02, 0x68, 0x31, 0x32, 0x32, 0x2f, \n\t0xfd, 0x55, 0x02, 0x05, 0x71, 0x61, 0x60, 0x71, 0x04, 0x02, 0x68, 0x31, \n\t0x32, 0x32, 0x2f, 0xfe, 0xe6, 0x02, 0x05, 0x71, 0x60, 0x60, 0x71, 0x04, \n\t0x02, 0x68, 0x30, 0x33, 0x32, 0x2f, 0x3d, 0x02, 0x05, 0x71, 0x60, 0x60, \n\t0x72, 0x04, 0x02, 0x69, 0x30, 0x33, 0x32, 0x2e, 0x04, 0xf3, 0x06, 0x4f, \n\t0x67, 0x67, 0x4f, 0x06, 0x2b, 0x3a, 0x3a, 0x2b, 0xfe, 0xeb, 0x06, 0x4e, \n\t0x68, 0x67, 0x4f, 0x06, 0x2c, 0x39, 0x3a, 0x2b, 0xfe, 0x09, 0x06, 0x4e, \n\t0x68, 0x67, 0x4f, 0x06, 0x2c, 0x39, 0x3a, 0x2b, 0xfd, 0xf9, 0x06, 0x4e, \n\t0x68, 0x67, 0x4f, 0x06, 0x2c, 0x39, 0x3a, 0x2b, 0xfe, 0xe4, 0x06, 0x50, \n\t0x66, 0x66, 0x50, 0x06, 0x2c, 0x39, 0x39, 0x2c, 0x05, 0x1a, 0x06, 0x4f, \n\t0x67, 0x67, 0x4f, 0x06, 0x2b, 0x3a, 0x3a, 0x2b, 0xfe, 0x09, 0x06, 0x4e, \n\t0x68, 0x67, 0x4f, 0x06, 0x2c, 0x39, 0x3a, 0x2b, 0xfd, 0xf9, 0x06, 0x4e, \n\t0x68, 0x67, 0x4f, 0x06, 0x2c, 0x39, 0x3a, 0x2b, 0x00, 0x08, 0x00, 0x4d, \n\t0xfe, 0x63, 0x07, 0x8d, 0x05, 0xc6, 0x00, 0x04, 0x00, 0x09, 0x00, 0x0e, \n\t0x00, 0x13, 0x00, 0x19, 0x00, 0x1e, 0x00, 0x23, 0x00, 0x28, 0x00, 0x25, \n\t0x00, 0xb0, 0x02, 0x2f, 0xb0, 0x22, 0x2f, 0xb0, 0x16, 0x2f, 0xb0, 0x12, \n\t0x2f, 0xb0, 0x0b, 0x2f, 0xb0, 0x1c, 0x2f, 0xb0, 0x27, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x0c, 0x3e, 0x59, 0x30, \n\t0x31, 0x05, 0x17, 0x03, 0x23, 0x13, 0x03, 0x27, 0x13, 0x33, 0x03, 0x01, \n\t0x37, 0x05, 0x15, 0x25, 0x05, 0x07, 0x25, 0x35, 0x05, 0x01, 0x37, 0x25, \n\t0x17, 0x06, 0x05, 0x01, 0x07, 0x05, 0x27, 0x25, 0x03, 0x27, 0x03, 0x37, \n\t0x13, 0x01, 0x17, 0x13, 0x07, 0x03, 0x04, 0x50, 0x0b, 0x7a, 0x60, 0x46, \n\t0x3a, 0x0c, 0x7a, 0x60, 0x46, 0x02, 0x1e, 0x0d, 0x01, 0x4d, 0xfe, 0xa6, \n\t0xfb, 0x74, 0x0d, 0xfe, 0xb3, 0x01, 0x5a, 0x03, 0x9c, 0x02, 0x01, 0x41, \n\t0x44, 0x25, 0xfe, 0xff, 0xfc, 0xf3, 0x02, 0xfe, 0xc0, 0x45, 0x01, 0x26, \n\t0x2b, 0x11, 0x94, 0x41, 0xc6, 0x03, 0x60, 0x11, 0x95, 0x42, 0xc5, 0x3c, \n\t0x0e, 0xfe, 0xad, 0x01, 0x61, 0x04, 0xa2, 0x0e, 0x01, 0x52, 0xfe, 0xa0, \n\t0xfe, 0x11, 0x0c, 0x7c, 0x62, 0x47, 0x3b, 0x0c, 0x7c, 0x62, 0x47, 0x01, \n\t0xae, 0x10, 0x99, 0x44, 0x17, 0xb1, 0xfc, 0x8e, 0x11, 0x99, 0x45, 0xc8, \n\t0x02, 0xe4, 0x02, 0x01, 0x46, 0x45, 0xfe, 0xd5, 0xfc, 0xe3, 0x02, 0xfe, \n\t0xbb, 0x47, 0x01, 0x2b, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0xd8, 0x05, 0xa5, \n\t0x07, 0x4e, 0x02, 0x26, 0x01, 0xc4, 0x00, 0x00, 0x00, 0x27, 0x01, 0x54, \n\t0x01, 0x31, 0x01, 0x9e, 0x01, 0x07, 0x00, 0x0f, 0x04, 0x6a, 0xff, 0xda, \n\t0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, \n\t0x10, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x8f, \n\t0xfe, 0xd8, 0x04, 0xa0, 0x05, 0xf7, 0x02, 0x26, 0x01, 0xe4, 0x00, 0x00, \n\t0x00, 0x27, 0x01, 0x54, 0x00, 0x99, 0x00, 0x47, 0x01, 0x07, 0x00, 0x0f, \n\t0x03, 0x65, 0xff, 0xda, 0x00, 0x33, 0x00, 0xb2, 0x8f, 0x10, 0x01, 0x71, \n\t0xb2, 0xcf, 0x10, 0x01, 0x71, 0xb2, 0x1f, 0x10, 0x01, 0x72, 0xb6, 0x3f, \n\t0x10, 0x4f, 0x10, 0x5f, 0x10, 0x03, 0x5d, 0xb2, 0xff, 0x10, 0x01, 0x71, \n\t0xb2, 0xaf, 0x10, 0x01, 0x71, 0xb6, 0x60, 0x10, 0x70, 0x10, 0x80, 0x10, \n\t0x03, 0x5d, 0xb2, 0x00, 0x10, 0x01, 0x71, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0x00, 0x02, 0xff, 0xcd, 0x00, 0x00, 0x04, 0xbb, 0x05, 0xb0, 0x00, 0x12, \n\t0x00, 0x1b, 0x00, 0x59, 0x00, 0xb0, 0x02, 0x2f, 0xb0, 0x12, 0x2f, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x0c, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x06, 0x3e, \n\t0x59, 0xb0, 0x12, 0x10, 0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0b, 0xd0, 0xb0, 0x12, 0x10, 0xb0, 0x0d, \n\t0xd0, 0xb0, 0x02, 0x10, 0xb1, 0x13, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x09, 0x10, 0xb1, 0x14, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x23, 0x15, \n\t0x21, 0x32, 0x04, 0x15, 0x14, 0x04, 0x23, 0x21, 0x11, 0x23, 0x35, 0x33, \n\t0x35, 0x33, 0x15, 0x33, 0x03, 0x11, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, \n\t0x23, 0x02, 0x4e, 0xe6, 0x01, 0x67, 0xe9, 0x01, 0x03, 0xfe, 0xfc, 0xe8, \n\t0xfd, 0xd4, 0xd6, 0xd6, 0xc5, 0xe6, 0xe6, 0x01, 0x67, 0x93, 0x94, 0x93, \n\t0x94, 0x04, 0x4d, 0xdd, 0xef, 0xc5, 0xc6, 0xf6, 0x04, 0x4d, 0x9b, 0xc8, \n\t0xc8, 0xfd, 0xed, 0xfd, 0xc5, 0xa9, 0x7b, 0x77, 0xa0, 0x00, 0x00, 0x00, \n\t0x00, 0x02, 0xff, 0xdb, 0x00, 0x00, 0x04, 0x00, 0x06, 0x72, 0x00, 0x12, \n\t0x00, 0x1b, 0x00, 0x6d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x11, 0x2f, \n\t0x1b, 0xb1, 0x11, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, \n\t0x2f, 0x1b, 0xb1, 0x0a, 0x06, 0x3e, 0x59, 0xb0, 0x11, 0x10, 0xb1, 0x01, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x02, \n\t0x0a, 0x11, 0x11, 0x12, 0x39, 0xb0, 0x02, 0x2f, 0xb0, 0x01, 0x10, 0xb0, \n\t0x0b, 0xd0, 0xb0, 0x11, 0x10, 0xb0, 0x0e, 0xd0, 0xb0, 0x11, 0x10, 0xb0, \n\t0x10, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x02, 0x10, \n\t0xb1, 0x13, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x0a, 0x10, 0xb1, 0x14, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x11, 0x21, 0x32, 0x16, 0x15, \n\t0x14, 0x06, 0x23, 0x21, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x21, \n\t0x01, 0x11, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x02, 0x9f, 0xfe, \n\t0xbf, 0x01, 0x0d, 0xc0, 0xd5, 0xd7, 0xbe, 0xfe, 0x2e, 0xbe, 0xbe, 0xc5, \n\t0x01, 0x41, 0xfe, 0xbf, 0x01, 0x0d, 0x6a, 0x65, 0x66, 0x69, 0x05, 0x15, \n\t0xfd, 0xd7, 0xcd, 0xa5, 0xa5, 0xd5, 0x05, 0x15, 0x9b, 0xc2, 0xc2, 0xfc, \n\t0xa2, 0xfe, 0x48, 0x7d, 0x5c, 0x5a, 0x85, 0x00, 0x00, 0x02, 0x00, 0xb4, \n\t0x00, 0x00, 0x04, 0xe6, 0x05, 0xb0, 0x00, 0x0e, 0x00, 0x1b, 0x00, 0x57, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0c, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, \n\t0x06, 0x3e, 0x59, 0xb2, 0x0f, 0x01, 0x03, 0x11, 0x12, 0x39, 0xb0, 0x0f, \n\t0x2f, 0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb2, 0x09, 0x00, 0x03, 0x11, 0x12, 0x39, 0xb0, 0x03, 0x10, 0xb1, \n\t0x1b, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, \n\t0x14, 0x1b, 0x0f, 0x11, 0x12, 0x39, 0xb2, 0x15, 0x0f, 0x1b, 0x11, 0x12, \n\t0x39, 0x30, 0x31, 0x01, 0x11, 0x23, 0x11, 0x21, 0x32, 0x04, 0x15, 0x14, \n\t0x07, 0x17, 0x07, 0x27, 0x06, 0x23, 0x25, 0x21, 0x32, 0x37, 0x27, 0x37, \n\t0x17, 0x36, 0x35, 0x34, 0x26, 0x23, 0x21, 0x01, 0x79, 0xc5, 0x02, 0x2d, \n\t0xe9, 0x01, 0x02, 0x6d, 0x87, 0x74, 0x93, 0x6a, 0x94, 0xfe, 0x98, 0x01, \n\t0x68, 0x4e, 0x3a, 0x6c, 0x73, 0x6f, 0x28, 0x93, 0x93, 0xfe, 0x98, 0x02, \n\t0x48, 0xfd, 0xb8, 0x05, 0xb0, 0xf0, 0xc4, 0xb7, 0x73, 0x92, 0x68, 0xa0, \n\t0x30, 0x9a, 0x16, 0x76, 0x68, 0x79, 0x43, 0x5a, 0x79, 0xa2, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x8f, 0xfe, 0x60, 0x04, 0x2c, 0x04, 0x4e, 0x00, 0x15, \n\t0x00, 0x27, 0x00, 0x78, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, \n\t0x1b, 0xb1, 0x0d, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, \n\t0x2f, 0x1b, 0xb1, 0x12, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x08, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x06, 0x3e, 0x59, 0xb2, 0x02, 0x12, \n\t0x07, 0x11, 0x12, 0x39, 0xb2, 0x0a, 0x07, 0x12, 0x11, 0x12, 0x39, 0xb2, \n\t0x0f, 0x12, 0x07, 0x11, 0x12, 0x39, 0xb0, 0x12, 0x10, 0xb1, 0x19, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x07, 0x10, \n\t0xb1, 0x20, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb2, 0x24, 0x19, 0x20, 0x11, 0x12, 0x39, 0xb2, 0x25, 0x20, 0x19, 0x11, \n\t0x12, 0x39, 0x30, 0x31, 0x01, 0x14, 0x07, 0x17, 0x07, 0x27, 0x06, 0x23, \n\t0x22, 0x26, 0x27, 0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x36, 0x33, 0x32, \n\t0x12, 0x11, 0x23, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x16, 0x16, \n\t0x33, 0x32, 0x37, 0x27, 0x37, 0x17, 0x36, 0x35, 0x04, 0x29, 0x67, 0x6a, \n\t0x74, 0x69, 0x57, 0x74, 0x64, 0x97, 0x35, 0xc5, 0xa9, 0x12, 0x35, 0x9c, \n\t0x66, 0xc9, 0xdf, 0xc5, 0x91, 0x8d, 0x55, 0x78, 0x25, 0x25, 0x78, 0x57, \n\t0x51, 0x3a, 0x6c, 0x74, 0x5f, 0x2a, 0x01, 0xf4, 0xe0, 0x8d, 0x75, 0x69, \n\t0x74, 0x32, 0x43, 0x43, 0xfd, 0xef, 0x05, 0xda, 0x85, 0x4a, 0x4f, 0xfe, \n\t0xc1, 0xfe, 0xfa, 0xb8, 0xed, 0x4d, 0x43, 0xfd, 0xf5, 0x43, 0x4b, 0x22, \n\t0x78, 0x69, 0x6a, 0x5a, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa3, \n\t0x00, 0x00, 0x04, 0x24, 0x06, 0xfe, 0x00, 0x07, 0x00, 0x2f, 0x00, 0xb0, \n\t0x06, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, \n\t0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, \n\t0x03, 0x06, 0x3e, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x01, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x11, \n\t0x23, 0x11, 0x21, 0x11, 0x33, 0x04, 0x24, 0xfd, 0x44, 0xc5, 0x02, 0xbc, \n\t0xc5, 0x05, 0x15, 0xfa, 0xeb, 0x05, 0xb0, 0x01, 0x4e, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x8f, 0x00, 0x00, 0x03, 0x44, 0x05, 0x75, 0x00, 0x07, \n\t0x00, 0x2f, 0x00, 0xb0, 0x06, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, \n\t0x2f, 0x1b, 0xb1, 0x04, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x06, 0x3e, 0x59, 0xb0, 0x04, 0x10, 0xb1, \n\t0x01, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, \n\t0x31, 0x01, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x33, 0x03, 0x44, 0xfe, \n\t0x10, 0xc5, 0x01, 0xf0, 0xc5, 0x03, 0x9e, 0xfc, 0x62, 0x04, 0x3a, 0x01, \n\t0x3b, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfc, 0x00, 0x00, 0x04, 0x31, \n\t0x05, 0xb0, 0x00, 0x0d, 0x00, 0x47, 0x00, 0xb0, 0x0d, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0c, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x06, 0x3e, 0x59, \n\t0xb0, 0x0d, 0x10, 0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x04, 0xd0, 0xb0, 0x0d, 0x10, 0xb0, 0x06, 0xd0, \n\t0xb0, 0x08, 0x10, 0xb1, 0x0a, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x11, 0x23, 0x11, 0x23, 0x35, \n\t0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x02, 0x7d, 0xfe, 0xfc, 0xc5, \n\t0xb8, 0xb8, 0x03, 0x7d, 0xfd, 0x48, 0x01, 0x04, 0x02, 0xa9, 0xfd, 0x57, \n\t0x02, 0xa9, 0x9b, 0x02, 0x6c, 0x9b, 0xfe, 0x2f, 0x00, 0x01, 0xff, 0xf3, \n\t0x00, 0x00, 0x03, 0x3f, 0x04, 0x3a, 0x00, 0x0d, 0x00, 0x51, 0x00, 0xb0, \n\t0x0d, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, \n\t0x02, 0x06, 0x3e, 0x59, 0xb2, 0x5f, 0x0d, 0x01, 0x5d, 0xb2, 0x2f, 0x0d, \n\t0x01, 0x5d, 0xb0, 0x0d, 0x10, 0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0xd0, 0xb0, 0x0d, 0x10, 0xb0, \n\t0x06, 0xd0, 0xb0, 0x08, 0x10, 0xb1, 0x0a, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x11, 0x23, 0x11, \n\t0x23, 0x35, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x02, 0x74, 0xfe, \n\t0xe0, 0xc5, 0x9c, 0x9c, 0x02, 0xb0, 0xfe, 0x15, 0x01, 0x20, 0x01, 0xdc, \n\t0xfe, 0x24, 0x01, 0xdc, 0x9b, 0x01, 0xc3, 0x9c, 0xfe, 0xd9, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0xb4, 0xfe, 0xe0, 0x04, 0x85, 0x05, 0xb0, 0x00, 0x16, \n\t0x00, 0x57, 0x00, 0xb0, 0x0a, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x16, \n\t0x2f, 0x1b, 0xb1, 0x16, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x13, 0x2f, 0x1b, 0xb1, 0x13, 0x06, 0x3e, 0x59, 0xb0, 0x16, 0x10, 0xb1, \n\t0x00, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, \n\t0x02, 0x13, 0x16, 0x11, 0x12, 0x39, 0xb0, 0x02, 0x2f, 0xb0, 0x0a, 0x10, \n\t0xb1, 0x0b, 0x05, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x02, 0x10, 0xb1, 0x12, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x11, 0x33, 0x20, 0x00, 0x11, \n\t0x10, 0x02, 0x2f, 0x02, 0x32, 0x36, 0x35, 0x26, 0x26, 0x23, 0x23, 0x11, \n\t0x23, 0x11, 0x21, 0x04, 0x31, 0xfd, 0x48, 0xb4, 0x01, 0x1c, 0x01, 0x3c, \n\t0xf3, 0xe3, 0x06, 0x02, 0x97, 0x82, 0x02, 0xc8, 0xc9, 0xb4, 0xc5, 0x03, \n\t0x7d, 0x05, 0x15, 0xfe, 0x2c, 0xfe, 0xcd, 0xfe, 0xf1, 0xfe, 0xf9, 0xfe, \n\t0xe8, 0x04, 0x02, 0x8e, 0xcc, 0xbf, 0xca, 0xd3, 0xfd, 0x64, 0x05, 0xb0, \n\t0x00, 0x01, 0x00, 0x8f, 0xfe, 0xe4, 0x03, 0xc2, 0x04, 0x3a, 0x00, 0x15, \n\t0x00, 0x45, 0x00, 0xb0, 0x09, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x15, \n\t0x2f, 0x1b, 0xb1, 0x15, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x06, 0x3e, 0x59, 0xb0, 0x15, 0x10, 0xb1, \n\t0x00, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, \n\t0x02, 0x12, 0x15, 0x11, 0x12, 0x39, 0xb0, 0x02, 0x2f, 0xb1, 0x11, 0x03, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, \n\t0x21, 0x11, 0x33, 0x32, 0x00, 0x15, 0x06, 0x02, 0x07, 0x27, 0x36, 0x36, \n\t0x35, 0x26, 0x26, 0x23, 0x23, 0x11, 0x23, 0x11, 0x21, 0x03, 0x3f, 0xfe, \n\t0x15, 0x6f, 0xe2, 0x01, 0x1d, 0x02, 0xc2, 0xbe, 0x34, 0x81, 0x70, 0x02, \n\t0xab, 0x8d, 0x6f, 0xc5, 0x02, 0xb0, 0x03, 0x9e, 0xfe, 0xe9, 0xfe, 0xff, \n\t0xdc, 0x8a, 0xfe, 0xe7, 0x23, 0x95, 0x22, 0x9d, 0x72, 0x93, 0xa5, 0xfe, \n\t0x1e, 0x04, 0x3a, 0x00, 0xff, 0xff, 0x00, 0x1c, 0xfe, 0x99, 0x07, 0x79, \n\t0x05, 0xb0, 0x02, 0x26, 0x01, 0xc2, 0x00, 0x00, 0x00, 0x07, 0x03, 0x99, \n\t0x06, 0x54, 0x00, 0x00, 0xff, 0xff, 0x00, 0x15, 0xfe, 0x99, 0x06, 0x28, \n\t0x04, 0x3a, 0x02, 0x26, 0x01, 0xe2, 0x00, 0x00, 0x00, 0x07, 0x03, 0x99, \n\t0x05, 0x03, 0x00, 0x00, 0xff, 0xff, 0x00, 0x78, 0xfe, 0x52, 0x04, 0xdf, \n\t0x05, 0xc5, 0x00, 0x26, 0x01, 0xc3, 0x00, 0x00, 0x00, 0x07, 0x03, 0x99, \n\t0x01, 0x9b, 0xff, 0xb9, 0xff, 0xff, 0x00, 0x58, 0xfe, 0x53, 0x03, 0xae, \n\t0x04, 0x4c, 0x02, 0x26, 0x01, 0xe3, 0x00, 0x00, 0x00, 0x07, 0x03, 0x99, \n\t0x01, 0x45, 0xff, 0xba, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x99, 0x05, 0x66, \n\t0x05, 0xb0, 0x02, 0x26, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x07, 0x03, 0x99, \n\t0x04, 0x41, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0xfe, 0x99, 0x04, 0x72, \n\t0x04, 0x3a, 0x02, 0x26, 0x01, 0xe6, 0x00, 0x00, 0x00, 0x07, 0x03, 0x99, \n\t0x03, 0x4d, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa3, 0x00, 0x00, 0x04, 0xff, \n\t0x05, 0xb0, 0x00, 0x14, 0x00, 0x81, 0x00, 0xb0, 0x0e, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x0c, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x14, 0x2f, 0x1b, 0xb1, 0x14, 0x0c, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x06, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x06, \n\t0x3e, 0x59, 0xb2, 0xcf, 0x0e, 0x01, 0x5d, 0xb2, 0x1f, 0x0e, 0x01, 0x71, \n\t0xb2, 0xbf, 0x0e, 0x01, 0x71, 0xb2, 0xef, 0x0e, 0x01, 0x71, 0xb2, 0x9f, \n\t0x0e, 0x01, 0x71, 0xb2, 0xef, 0x0e, 0x01, 0x5d, 0xb2, 0x7f, 0x0e, 0x01, \n\t0x5d, 0xb2, 0x2f, 0x0e, 0x01, 0x5d, 0xb0, 0x0e, 0x10, 0xb1, 0x09, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x01, 0x09, \n\t0x0e, 0x11, 0x12, 0x39, 0xb0, 0x05, 0xd0, 0xb0, 0x0e, 0x10, 0xb0, 0x12, \n\t0xd0, 0x30, 0x31, 0x09, 0x02, 0x23, 0x01, 0x23, 0x15, 0x23, 0x35, 0x23, \n\t0x11, 0x23, 0x11, 0x33, 0x11, 0x33, 0x35, 0x33, 0x15, 0x33, 0x01, 0x04, \n\t0xd5, 0xfe, 0x72, 0x01, 0xb8, 0xf6, 0xfe, 0xac, 0x4e, 0x9d, 0x62, 0xc5, \n\t0xc5, 0x62, 0x9d, 0x4c, 0x01, 0x3d, 0x05, 0xb0, 0xfd, 0x4f, 0xfd, 0x01, \n\t0x02, 0x92, 0xf3, 0xf3, 0xfd, 0x6e, 0x05, 0xb0, 0xfd, 0x7c, 0xff, 0xff, \n\t0x02, 0x84, 0x00, 0x00, 0x00, 0x01, 0x00, 0x99, 0x00, 0x00, 0x04, 0x63, \n\t0x04, 0x3a, 0x00, 0x14, 0x00, 0x92, 0x00, 0xb0, 0x0e, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0a, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x06, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x06, \n\t0x3e, 0x59, 0xb4, 0xbf, 0x0e, 0xcf, 0x0e, 0x02, 0x5d, 0xb2, 0x2f, 0x0e, \n\t0x01, 0x71, 0xb2, 0x9f, 0x0e, 0x01, 0x71, 0xb2, 0xff, 0x0e, 0x01, 0x71, \n\t0xb2, 0x6f, 0x0e, 0x01, 0x72, 0xb2, 0x3f, 0x0e, 0x01, 0x72, 0xb2, 0xcf, \n\t0x0e, 0x01, 0x71, 0xb2, 0x6f, 0x0e, 0x01, 0x71, 0xb2, 0xff, 0x0e, 0x01, \n\t0x5d, 0xb2, 0x5f, 0x0e, 0x01, 0x5d, 0xb2, 0x2f, 0x0e, 0x01, 0x5d, 0xb0, \n\t0x0e, 0x10, 0xb1, 0x09, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb2, 0x01, 0x09, 0x0e, 0x11, 0x12, 0x39, 0xb0, 0x05, 0xd0, \n\t0xb0, 0x0e, 0x10, 0xb0, 0x12, 0xd0, 0x30, 0x31, 0x09, 0x02, 0x23, 0x01, \n\t0x23, 0x15, 0x23, 0x35, 0x23, 0x11, 0x23, 0x11, 0x33, 0x11, 0x33, 0x35, \n\t0x33, 0x15, 0x33, 0x13, 0x04, 0x40, 0xfe, 0xad, 0x01, 0x76, 0xf9, 0xfe, \n\t0xf3, 0x17, 0x9d, 0x4b, 0xc5, 0xc5, 0x4b, 0x9d, 0x0f, 0xff, 0x04, 0x3a, \n\t0xfe, 0x00, 0xfd, 0xc6, 0x01, 0xcb, 0xbf, 0xbf, 0xfe, 0x35, 0x04, 0x3a, \n\t0xfe, 0x37, 0xd3, 0xd3, 0x01, 0xc9, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf5, \n\t0x00, 0x00, 0x05, 0x34, 0x05, 0xb0, 0x00, 0x16, 0x00, 0x9b, 0x00, 0xb0, \n\t0x0e, 0x2f, 0xb0, 0x07, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, \n\t0x1b, 0xb1, 0x08, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, \n\t0x2f, 0x1b, 0xb1, 0x10, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x16, 0x2f, 0x1b, 0xb1, 0x16, 0x06, 0x3e, 0x59, 0xb2, 0xcf, 0x0e, \n\t0x01, 0x5d, 0xb2, 0x1f, 0x0e, 0x01, 0x71, 0xb2, 0xbf, 0x0e, 0x01, 0x71, \n\t0xb2, 0x3f, 0x0e, 0x01, 0x72, 0xb2, 0xef, 0x0e, 0x01, 0x71, 0xb2, 0x9f, \n\t0x0e, 0x01, 0x71, 0xb2, 0xef, 0x0e, 0x01, 0x5d, 0xb2, 0x7f, 0x0e, 0x01, \n\t0x5d, 0xb2, 0x2f, 0x0e, 0x01, 0x5d, 0xb0, 0x0e, 0x10, 0xb1, 0x00, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x07, 0x10, \n\t0xb1, 0x04, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x07, 0x10, 0xb0, 0x0a, 0xd0, 0xb0, 0x04, 0x10, 0xb0, 0x0c, 0xd0, \n\t0xb2, 0x13, 0x00, 0x0e, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x23, 0x11, \n\t0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, \n\t0x33, 0x01, 0x33, 0x17, 0x01, 0x01, 0x07, 0x23, 0x02, 0x37, 0xaa, 0xc5, \n\t0xd3, 0xd3, 0xc5, 0xe9, 0xe9, 0x98, 0x02, 0x09, 0xda, 0x03, 0xfd, 0xcb, \n\t0x02, 0x5e, 0x03, 0xeb, 0x02, 0x91, 0xfd, 0x6f, 0x04, 0x82, 0x9b, 0x93, \n\t0x93, 0x9b, 0xfe, 0xaa, 0x02, 0x84, 0x05, 0xfd, 0x45, 0xfd, 0x15, 0x05, \n\t0x00, 0x01, 0xff, 0xcf, 0x00, 0x00, 0x04, 0x30, 0x06, 0x18, 0x00, 0x14, \n\t0x00, 0x7d, 0x00, 0xb0, 0x08, 0x2f, 0xb0, 0x07, 0x2f, 0xb0, 0x0e, 0x2f, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x06, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x13, 0x2f, 0x1b, 0xb1, 0x13, \n\t0x06, 0x3e, 0x59, 0xb2, 0x4f, 0x0e, 0x01, 0x71, 0xb2, 0xaf, 0x0e, 0x01, \n\t0x71, 0xb2, 0xbf, 0x0e, 0x01, 0x5d, 0xb2, 0x5f, 0x0e, 0x01, 0x5d, 0xb0, \n\t0x0e, 0x10, 0xb1, 0x01, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x07, 0x10, 0xb1, 0x04, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x2f, 0x08, 0x01, 0x5d, 0xb0, 0x07, \n\t0x10, 0xb0, 0x0a, 0xd0, 0xb0, 0x04, 0x10, 0xb0, 0x0c, 0xd0, 0xb2, 0x12, \n\t0x01, 0x0e, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x23, 0x11, 0x23, 0x11, \n\t0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, 0x33, 0x01, \n\t0x33, 0x01, 0x01, 0x23, 0x01, 0xe9, 0x80, 0xc5, 0xd5, 0xd5, 0xc5, 0xe7, \n\t0xe7, 0x7e, 0x01, 0x28, 0xec, 0xfe, 0x8e, 0x01, 0xa7, 0xe8, 0x01, 0xf3, \n\t0xfe, 0x0d, 0x04, 0xbe, 0x9b, 0xbf, 0xbf, 0x9b, 0xfd, 0xd2, 0x01, 0xaa, \n\t0xfe, 0x14, 0xfd, 0xb2, 0x00, 0x01, 0x00, 0x43, 0x00, 0x00, 0x06, 0x8b, \n\t0x05, 0xb0, 0x00, 0x10, 0x00, 0x79, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x06, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x06, 0x3e, 0x59, 0xb2, \n\t0x08, 0x02, 0x06, 0x11, 0x12, 0x39, 0xb0, 0x08, 0x2f, 0xb2, 0xcf, 0x08, \n\t0x01, 0x5d, 0xb4, 0xef, 0x08, 0xff, 0x08, 0x02, 0x5d, 0xb2, 0x2f, 0x08, \n\t0x01, 0x5d, 0xb2, 0x9f, 0x08, 0x01, 0x71, 0xb1, 0x01, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x06, 0x10, 0xb1, 0x05, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0d, \n\t0x01, 0x08, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x23, 0x11, 0x23, 0x11, \n\t0x21, 0x35, 0x21, 0x11, 0x33, 0x01, 0x33, 0x17, 0x01, 0x01, 0x07, 0x23, \n\t0x03, 0x8e, 0xaa, 0xc5, 0xfe, 0x24, 0x02, 0xa1, 0x98, 0x02, 0x09, 0xda, \n\t0x03, 0xfd, 0xcb, 0x02, 0x5e, 0x03, 0xeb, 0x02, 0x91, 0xfd, 0x6f, 0x05, \n\t0x15, 0x9b, 0xfd, 0x7c, 0x02, 0x84, 0x05, 0xfd, 0x45, 0xfd, 0x15, 0x05, \n\t0x00, 0x01, 0x00, 0x41, 0x00, 0x00, 0x05, 0x86, 0x04, 0x3a, 0x00, 0x10, \n\t0x00, 0x79, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, \n\t0x07, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, \n\t0xb1, 0x0a, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, \n\t0x1b, 0xb1, 0x02, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, \n\t0x2f, 0x1b, 0xb1, 0x10, 0x06, 0x3e, 0x59, 0xb2, 0x08, 0x02, 0x07, 0x11, \n\t0x12, 0x39, 0xb0, 0x08, 0x2f, 0xb4, 0xbf, 0x08, 0xcf, 0x08, 0x02, 0x5d, \n\t0xb2, 0x9f, 0x08, 0x01, 0x71, 0xb2, 0x2f, 0x08, 0x01, 0x5d, 0xb2, 0x6f, \n\t0x08, 0x01, 0x72, 0xb1, 0x01, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x07, 0x10, 0xb1, 0x04, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0d, 0x01, 0x08, 0x11, 0x12, \n\t0x39, 0x30, 0x31, 0x01, 0x23, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, \n\t0x33, 0x01, 0x33, 0x17, 0x01, 0x01, 0x07, 0x23, 0x03, 0x24, 0x81, 0xc5, \n\t0xfe, 0x63, 0x02, 0x62, 0x72, 0x01, 0x65, 0xe7, 0x03, 0xfe, 0x58, 0x01, \n\t0xca, 0x03, 0xf2, 0x01, 0xcb, 0xfe, 0x35, 0x03, 0x9e, 0x9c, 0xfe, 0x37, \n\t0x01, 0xc9, 0x05, 0xfd, 0xff, 0xfd, 0xd1, 0x05, 0xff, 0xff, 0x00, 0xb4, \n\t0xfe, 0x99, 0x05, 0x92, 0x05, 0xb0, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, \n\t0x00, 0x07, 0x03, 0x99, 0x04, 0x6d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x8f, \n\t0xfe, 0x99, 0x04, 0x8c, 0x04, 0x3a, 0x02, 0x26, 0x01, 0xe9, 0x00, 0x00, \n\t0x00, 0x07, 0x03, 0x99, 0x03, 0x67, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, \n\t0x00, 0x00, 0x07, 0x7a, 0x05, 0xb0, 0x00, 0x0d, 0x00, 0xac, 0x00, 0xb0, \n\t0x00, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, \n\t0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, \n\t0x0c, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, \n\t0xb1, 0x06, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, \n\t0x1b, 0xb1, 0x0a, 0x06, 0x3e, 0x59, 0xb2, 0x7f, 0x00, 0x01, 0x5d, 0xb2, \n\t0xcf, 0x00, 0x01, 0x5d, 0xb2, 0x1f, 0x00, 0x01, 0x71, 0xb2, 0x7f, 0x00, \n\t0x01, 0x71, 0xb4, 0xbf, 0x00, 0xcf, 0x00, 0x02, 0x71, 0xb2, 0x1f, 0x00, \n\t0x01, 0x72, 0xb2, 0x6f, 0x00, 0x01, 0x72, 0xb2, 0x8f, 0x00, 0x01, 0x72, \n\t0xb2, 0x3f, 0x00, 0x01, 0x72, 0xb2, 0xef, 0x00, 0x01, 0x71, 0xb2, 0x9f, \n\t0x00, 0x01, 0x71, 0xb2, 0x4f, 0x00, 0x01, 0x71, 0xb4, 0xef, 0x00, 0xff, \n\t0x00, 0x02, 0x5d, 0xb2, 0xaf, 0x00, 0x01, 0x5d, 0xb2, 0x5f, 0x00, 0x01, \n\t0x5d, 0xb2, 0x2f, 0x00, 0x01, 0x5d, 0xb0, 0x02, 0x10, 0xb1, 0x04, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, \n\t0xb1, 0x09, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x01, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, \n\t0x11, 0x23, 0x11, 0x33, 0x01, 0x79, 0x02, 0xc3, 0x03, 0x3e, 0xfd, 0x87, \n\t0xc5, 0xfd, 0x3d, 0xc5, 0xc5, 0x03, 0x1e, 0x02, 0x92, 0x9b, 0xfa, 0xeb, \n\t0x02, 0x83, 0xfd, 0x7d, 0x05, 0xb0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8f, \n\t0x00, 0x00, 0x05, 0x65, 0x04, 0x3a, 0x00, 0x0d, 0x00, 0xa8, 0x00, 0xb0, \n\t0x00, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, \n\t0x0c, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, \n\t0xb1, 0x06, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, \n\t0x1b, 0xb1, 0x0a, 0x06, 0x3e, 0x59, 0xb2, 0x9f, 0x00, 0x01, 0x5d, 0xb2, \n\t0xff, 0x00, 0x01, 0x5d, 0xb2, 0x6f, 0x00, 0x01, 0x71, 0xb4, 0xcf, 0x00, \n\t0xdf, 0x00, 0x02, 0x71, 0xb4, 0x3f, 0x00, 0x4f, 0x00, 0x02, 0x72, 0xb2, \n\t0xaf, 0x00, 0x01, 0x72, 0xb4, 0x6f, 0x00, 0x7f, 0x00, 0x02, 0x72, 0xb2, \n\t0xff, 0x00, 0x01, 0x71, 0xb2, 0x0f, 0x00, 0x01, 0x72, 0xb2, 0x9f, 0x00, \n\t0x01, 0x71, 0xb4, 0x2f, 0x00, 0x3f, 0x00, 0x02, 0x71, 0xb4, 0xbf, 0x00, \n\t0xcf, 0x00, 0x02, 0x5d, 0xb2, 0x5f, 0x00, 0x01, 0x5d, 0xb2, 0x2f, 0x00, \n\t0x01, 0x5d, 0xb0, 0x02, 0x10, 0xb1, 0x04, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x09, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, \n\t0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, \n\t0x01, 0x54, 0x01, 0xe2, 0x02, 0x2f, 0xfe, 0x96, 0xc5, 0xfe, 0x1e, 0xc5, \n\t0xc5, 0x02, 0x66, 0x01, 0xd4, 0x9c, 0xfc, 0x62, 0x01, 0xcc, 0xfe, 0x34, \n\t0x04, 0x3a, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0xe0, 0x07, 0xcd, \n\t0x05, 0xb0, 0x00, 0x18, 0x00, 0x5a, 0x00, 0xb0, 0x07, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x18, 0x2f, 0x1b, 0xb1, 0x18, 0x0c, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x15, 0x2f, 0x1b, 0xb1, 0x15, 0x06, 0x3e, 0x59, \n\t0xb0, 0x12, 0xd0, 0xb2, 0x00, 0x12, 0x18, 0x11, 0x12, 0x39, 0xb0, 0x00, \n\t0x2f, 0xb0, 0x07, 0x10, 0xb1, 0x09, 0x05, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x10, 0x03, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x18, 0x10, 0xb1, 0x13, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x01, 0x33, 0x20, 0x00, 0x11, 0x10, 0x02, 0x2f, 0x02, 0x32, 0x36, 0x35, \n\t0x26, 0x26, 0x23, 0x23, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, \n\t0x05, 0x03, 0x72, 0x01, 0x1c, 0x01, 0x3c, 0xf3, 0xe3, 0x06, 0x02, 0x97, \n\t0x82, 0x02, 0xc8, 0xc9, 0x72, 0xc6, 0xfd, 0x3c, 0xc5, 0x04, 0x4f, 0x03, \n\t0x41, 0xfe, 0xcd, 0xfe, 0xf1, 0xfe, 0xf9, 0xfe, 0xe8, 0x04, 0x02, 0x8e, \n\t0xcc, 0xbf, 0xca, 0xd3, 0xfd, 0x64, 0x05, 0x15, 0xfa, 0xeb, 0x05, 0xb0, \n\t0x00, 0x01, 0x00, 0x8f, 0xfe, 0xe4, 0x06, 0xb7, 0x04, 0x3a, 0x00, 0x17, \n\t0x00, 0x48, 0x00, 0xb0, 0x07, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x17, \n\t0x2f, 0x1b, 0xb1, 0x17, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x14, 0x2f, 0x1b, 0xb1, 0x14, 0x06, 0x3e, 0x59, 0xb0, 0x11, 0xd0, 0xb2, \n\t0x00, 0x11, 0x17, 0x11, 0x12, 0x39, 0xb0, 0x00, 0x2f, 0xb1, 0x0f, 0x03, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x17, 0x10, \n\t0xb1, 0x12, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x01, 0x33, 0x32, 0x00, 0x15, 0x06, 0x02, 0x07, 0x27, 0x36, \n\t0x36, 0x35, 0x26, 0x26, 0x23, 0x23, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, \n\t0x11, 0x21, 0x03, 0xfc, 0xa8, 0xeb, 0x01, 0x28, 0x02, 0xc2, 0xbe, 0x34, \n\t0x81, 0x70, 0x02, 0xb6, 0x96, 0xa8, 0xc5, 0xfe, 0x1d, 0xc5, 0x03, 0x6d, \n\t0x02, 0x87, 0xfe, 0xff, 0xdc, 0x8a, 0xfe, 0xe7, 0x23, 0x95, 0x22, 0x9d, \n\t0x72, 0x94, 0xa4, 0xfe, 0x1e, 0x03, 0x9e, 0xfc, 0x62, 0x04, 0x3a, 0x00, \n\t0x00, 0x02, 0x00, 0x71, 0xff, 0xe2, 0x05, 0x9b, 0x05, 0xc2, 0x00, 0x2a, \n\t0x00, 0x39, 0x00, 0x8f, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x20, 0x2f, \n\t0x1b, 0xb1, 0x20, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, \n\t0x2f, 0x1b, 0xb1, 0x0d, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x06, 0x3e, 0x59, 0xb2, 0x03, 0x06, \n\t0x20, 0x11, 0x12, 0x39, 0xb0, 0x0d, 0x10, 0xb1, 0x0f, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x06, 0x10, 0xb1, 0x16, \n\t0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x19, \n\t0x2e, 0x03, 0x11, 0x12, 0x39, 0xb2, 0x27, 0x03, 0x2e, 0x11, 0x12, 0x39, \n\t0xb0, 0x00, 0x10, 0xb1, 0x2a, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb2, 0x2f, 0x20, 0x06, 0x11, 0x12, 0x39, 0xb0, 0x20, \n\t0x10, 0xb1, 0x36, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0x30, 0x31, 0x05, 0x22, 0x26, 0x27, 0x06, 0x06, 0x23, 0x20, 0x00, \n\t0x11, 0x35, 0x10, 0x12, 0x17, 0x17, 0x15, 0x22, 0x02, 0x15, 0x15, 0x14, \n\t0x12, 0x33, 0x32, 0x36, 0x37, 0x26, 0x02, 0x35, 0x35, 0x34, 0x12, 0x33, \n\t0x32, 0x12, 0x15, 0x15, 0x14, 0x02, 0x07, 0x16, 0x16, 0x33, 0x01, 0x14, \n\t0x16, 0x17, 0x33, 0x36, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, \n\t0x15, 0x05, 0x9b, 0x6d, 0xc7, 0x58, 0x46, 0x9c, 0x55, 0xfe, 0xef, 0xfe, \n\t0xaa, 0xfc, 0xc5, 0x06, 0x77, 0x8b, 0xe3, 0xbf, 0x22, 0x3f, 0x1d, 0x7a, \n\t0x83, 0xe5, 0xb7, 0xb6, 0xe4, 0x71, 0x66, 0x33, 0x71, 0x3f, 0xfd, 0x83, \n\t0x75, 0x6f, 0x06, 0x5c, 0x66, 0x73, 0x62, 0x62, 0x75, 0x1e, 0x25, 0x25, \n\t0x20, 0x21, 0x01, 0x8e, 0x01, 0x2c, 0xa6, 0x01, 0x0f, 0x01, 0x68, 0x05, \n\t0x02, 0x98, 0xfe, 0xf7, 0xcd, 0xa8, 0xeb, 0xfe, 0xd2, 0x06, 0x07, 0x62, \n\t0x01, 0x18, 0xa7, 0xe3, 0xec, 0x01, 0x39, 0xfe, 0xcd, 0xf2, 0xf8, 0x9d, \n\t0xfe, 0xf4, 0x5f, 0x0e, 0x0d, 0x02, 0x36, 0x99, 0xeb, 0x44, 0x43, 0xe5, \n\t0x8d, 0xfb, 0xac, 0xd6, 0xdc, 0xa6, 0x00, 0x00, 0x00, 0x02, 0x00, 0x6c, \n\t0xff, 0xeb, 0x04, 0xa1, 0x04, 0x4f, 0x00, 0x2a, 0x00, 0x3a, 0x00, 0x8f, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x20, 0x2f, 0x1b, 0xb1, 0x20, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, \n\t0x06, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, \n\t0xb1, 0x00, 0x06, 0x3e, 0x59, 0xb2, 0x03, 0x06, 0x20, 0x11, 0x12, 0x39, \n\t0xb0, 0x0e, 0x10, 0xb1, 0x0f, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x06, 0x10, 0xb1, 0x16, 0x03, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x37, 0x20, 0x06, 0x11, 0x12, \n\t0x39, 0xb2, 0x19, 0x37, 0x03, 0x11, 0x12, 0x39, 0xb2, 0x27, 0x03, 0x37, \n\t0x11, 0x12, 0x39, 0xb0, 0x00, 0x10, 0xb1, 0x2a, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x20, 0x10, 0xb1, 0x2f, 0x03, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x05, \n\t0x22, 0x26, 0x27, 0x06, 0x06, 0x23, 0x22, 0x00, 0x35, 0x35, 0x34, 0x12, \n\t0x17, 0x17, 0x15, 0x22, 0x06, 0x15, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, \n\t0x37, 0x26, 0x26, 0x35, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, \n\t0x14, 0x06, 0x07, 0x16, 0x16, 0x33, 0x03, 0x35, 0x34, 0x26, 0x07, 0x23, \n\t0x26, 0x06, 0x15, 0x15, 0x14, 0x16, 0x17, 0x37, 0x36, 0x36, 0x04, 0xa1, \n\t0x5a, 0xa1, 0x46, 0x3b, 0x84, 0x48, 0xda, 0xfe, 0xed, 0xc3, 0x98, 0x06, \n\t0x48, 0x54, 0xa0, 0x88, 0x16, 0x2b, 0x15, 0x5d, 0x62, 0xad, 0x92, 0x91, \n\t0xb0, 0x42, 0x3c, 0x26, 0x58, 0x31, 0xf6, 0x42, 0x37, 0x06, 0x39, 0x3e, \n\t0x4b, 0x46, 0x06, 0x2d, 0x32, 0x0c, 0x1c, 0x1d, 0x21, 0x21, 0x01, 0x51, \n\t0xfe, 0x39, 0xcd, 0x01, 0x0b, 0x05, 0x02, 0x97, 0xaf, 0x89, 0x3b, 0xbc, \n\t0xf2, 0x05, 0x06, 0x4f, 0xd8, 0x7f, 0x67, 0xbd, 0xee, 0xfe, 0xc2, 0x69, \n\t0x6f, 0xc3, 0x4b, 0x0b, 0x0a, 0x01, 0x92, 0x6c, 0x7b, 0xa0, 0x05, 0x05, \n\t0x8f, 0x78, 0x6b, 0x66, 0xa2, 0x33, 0x01, 0x31, 0x99, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x76, 0xfe, 0x52, 0x04, 0xbf, 0x05, 0xc5, 0x02, 0x26, \n\t0x00, 0x26, 0x00, 0x00, 0x00, 0x07, 0x03, 0x99, 0x01, 0xe5, 0xff, 0xb9, \n\t0xff, 0xff, 0x00, 0x61, 0xfe, 0x52, 0x03, 0xf6, 0x04, 0x4e, 0x02, 0x26, \n\t0x00, 0x46, 0x00, 0x00, 0x00, 0x07, 0x03, 0x99, 0x01, 0x58, 0xff, 0xb9, \n\t0xff, 0xff, 0x00, 0x22, 0xfe, 0x99, 0x04, 0x8e, 0x05, 0xb0, 0x02, 0x26, \n\t0x00, 0x37, 0x00, 0x00, 0x00, 0x07, 0x03, 0x99, 0x02, 0x26, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x47, 0xfe, 0x99, 0x03, 0xd1, 0x04, 0x3a, 0x02, 0x26, \n\t0x01, 0xee, 0x00, 0x00, 0x00, 0x07, 0x03, 0x99, 0x01, 0xd8, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x14, 0x00, 0x00, 0x04, 0xce, 0x05, 0xb0, 0x02, 0x06, \n\t0x00, 0x3c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2e, 0xfe, 0x5f, 0x03, 0xe4, \n\t0x04, 0x3a, 0x02, 0x06, 0x01, 0x8d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x14, \n\t0x00, 0x00, 0x04, 0xce, 0x05, 0xb0, 0x00, 0x10, 0x00, 0x72, 0x00, 0xb0, \n\t0x0d, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, \n\t0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, \n\t0x0f, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, \n\t0xb1, 0x08, 0x06, 0x3e, 0x59, 0xb0, 0x0d, 0x10, 0xb0, 0x00, 0xd0, 0x40, \n\t0x1b, 0x34, 0x00, 0x44, 0x00, 0x54, 0x00, 0x64, 0x00, 0x74, 0x00, 0x84, \n\t0x00, 0x94, 0x00, 0xa4, 0x00, 0xb4, 0x00, 0xc4, 0x00, 0xd4, 0x00, 0xe4, \n\t0x00, 0xf4, 0x00, 0x0d, 0x5d, 0xb6, 0x04, 0x00, 0x14, 0x00, 0x24, 0x00, \n\t0x03, 0x71, 0xb0, 0x0d, 0x10, 0xb0, 0x04, 0xd0, 0xb0, 0x0d, 0x10, 0xb1, \n\t0x0c, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x05, 0xd0, 0x30, 0x31, 0x01, 0x01, 0x33, 0x01, 0x33, 0x15, 0x23, 0x07, \n\t0x11, 0x23, 0x11, 0x27, 0x23, 0x35, 0x33, 0x01, 0x33, 0x02, 0x71, 0x01, \n\t0x7c, 0xe1, 0xfe, 0x5d, 0x78, 0xcc, 0x08, 0xc4, 0x01, 0xe8, 0x94, 0xfe, \n\t0x5e, 0xe1, 0x02, 0xcc, 0x02, 0xe4, 0xfc, 0xfa, 0x9b, 0x0f, 0xfe, 0x00, \n\t0x02, 0x0d, 0x02, 0x9b, 0x03, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2e, \n\t0xfe, 0x5f, 0x03, 0xe4, 0x04, 0x3a, 0x00, 0x11, 0x00, 0x72, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x08, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, \n\t0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, \n\t0x04, 0x06, 0x3e, 0x59, 0xb1, 0x06, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb0, 0x0b, 0xd0, 0xb2, 0x34, \n\t0x0b, 0x01, 0x5d, 0x40, 0x0b, 0x54, 0x0b, 0x64, 0x0b, 0x74, 0x0b, 0x84, \n\t0x0b, 0x94, 0x0b, 0x05, 0x5d, 0xb0, 0x06, 0x10, 0xb0, 0x10, 0xd0, 0xb0, \n\t0x11, 0xd0, 0x30, 0x31, 0x05, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, \n\t0x01, 0x33, 0x01, 0x17, 0x33, 0x37, 0x13, 0x33, 0x01, 0x33, 0x03, 0x51, \n\t0xe4, 0xc5, 0xd8, 0xbc, 0xfe, 0xa2, 0xca, 0x01, 0x00, 0x11, 0x06, 0x13, \n\t0xf9, 0xc9, 0xfe, 0xa6, 0xc7, 0x0d, 0xfe, 0x6c, 0x01, 0x94, 0x9b, 0x03, \n\t0xac, 0xfd, 0x05, 0x4c, 0x4c, 0x02, 0xfb, 0xfc, 0x54, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x42, 0xfe, 0x99, 0x04, 0xf0, 0x05, 0xb0, 0x02, 0x26, \n\t0x00, 0x3b, 0x00, 0x00, 0x00, 0x07, 0x03, 0x99, 0x03, 0xcb, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x2e, 0xfe, 0x99, 0x04, 0x0b, 0x04, 0x3a, 0x02, 0x26, \n\t0x00, 0x5b, 0x00, 0x00, 0x00, 0x07, 0x03, 0x99, 0x02, 0xe6, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x37, 0xfe, 0x9d, 0x06, 0x9c, 0x05, 0xb0, 0x00, 0x0f, \n\t0x00, 0x51, 0x00, 0xb0, 0x0d, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, \n\t0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x06, 0x3e, 0x59, 0xb0, 0x02, 0x10, \n\t0xb1, 0x01, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x05, 0xd0, 0xb0, 0x0f, 0x10, 0xb1, 0x06, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0a, 0xd0, 0x30, 0x31, 0x01, \n\t0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, \n\t0x23, 0x11, 0x21, 0x01, 0x8c, 0xfe, 0xab, 0x03, 0xba, 0xfe, 0x61, 0x02, \n\t0xc4, 0xc5, 0xc1, 0xc5, 0xfb, 0xb5, 0x05, 0x13, 0x9b, 0x9b, 0xfb, 0x88, \n\t0x05, 0x15, 0xfa, 0xf1, 0xfd, 0xfc, 0x01, 0x63, 0x00, 0x01, 0x00, 0x20, \n\t0xfe, 0x9e, 0x05, 0x1d, 0x04, 0x3b, 0x00, 0x0f, 0x00, 0x51, 0x00, 0xb0, \n\t0x0d, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, \n\t0x08, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, \n\t0xb1, 0x0f, 0x06, 0x3e, 0x59, 0xb0, 0x02, 0x10, 0xb1, 0x01, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x05, 0xd0, 0xb0, \n\t0x0f, 0x10, 0xb1, 0x06, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x0a, 0xd0, 0x30, 0x31, 0x01, 0x21, 0x35, 0x21, 0x15, \n\t0x23, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x23, 0x11, 0x21, 0x01, \n\t0x2c, 0xfe, 0xf4, 0x02, 0xc4, 0xf3, 0x01, 0xe3, 0xc5, 0x84, 0xc5, 0xfc, \n\t0xd4, 0x03, 0xa0, 0x9b, 0x9b, 0xfc, 0xfa, 0x03, 0xa0, 0xfc, 0x60, 0xfe, \n\t0x04, 0x01, 0x62, 0x00, 0xff, 0xff, 0x00, 0x93, 0xfe, 0x99, 0x05, 0x5d, \n\t0x05, 0xb0, 0x02, 0x26, 0x01, 0xd3, 0x00, 0x00, 0x00, 0x07, 0x03, 0x99, \n\t0x04, 0x38, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7f, 0xfe, 0x99, 0x04, 0x6d, \n\t0x04, 0x3b, 0x02, 0x26, 0x01, 0xf3, 0x00, 0x00, 0x00, 0x07, 0x03, 0x99, \n\t0x03, 0x48, 0x00, 0x00, 0x00, 0x01, 0x00, 0x93, 0x00, 0x00, 0x04, 0xcc, \n\t0x05, 0xb0, 0x00, 0x1d, 0x00, 0x45, 0x00, 0xb0, 0x14, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x0c, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x1d, 0x2f, 0x1b, 0xb1, 0x1d, 0x0c, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x06, 0x3e, \n\t0x59, 0xb0, 0x14, 0x10, 0xb1, 0x0a, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x07, 0xd0, 0xb0, 0x14, 0x10, 0xb0, 0x18, \n\t0xd0, 0x30, 0x31, 0x01, 0x11, 0x23, 0x11, 0x06, 0x07, 0x06, 0x07, 0x15, \n\t0x23, 0x35, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, \n\t0x33, 0x11, 0x33, 0x11, 0x36, 0x37, 0x36, 0x37, 0x11, 0x04, 0xcc, 0xc5, \n\t0x5f, 0x59, 0x18, 0x19, 0x9e, 0x04, 0xf1, 0xf8, 0xc6, 0x8a, 0x99, 0x04, \n\t0x9e, 0x13, 0x13, 0x60, 0x63, 0x05, 0xb0, 0xfa, 0x50, 0x02, 0x5b, 0x1d, \n\t0x0d, 0x04, 0x03, 0xee, 0xe8, 0xd3, 0xed, 0x01, 0xcc, 0xfe, 0x34, 0xa5, \n\t0x7f, 0x01, 0x39, 0xfe, 0xd0, 0x02, 0x03, 0x0e, 0x1b, 0x02, 0xb9, 0x00, \n\t0x00, 0x01, 0x00, 0x7f, 0x00, 0x00, 0x03, 0xdc, 0x04, 0x3b, 0x00, 0x1c, \n\t0x00, 0x4c, 0x00, 0xb0, 0x14, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, \n\t0x2f, 0x1b, 0xb1, 0x0f, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x1b, 0x2f, 0x1b, 0xb1, 0x1b, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x06, 0x3e, 0x59, 0xb4, 0xbf, 0x14, \n\t0xcf, 0x14, 0x02, 0x5d, 0xb0, 0x14, 0x10, 0xb1, 0x09, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x06, 0xd0, 0xb0, 0x14, \n\t0x10, 0xb0, 0x17, 0xd0, 0x30, 0x31, 0x21, 0x23, 0x11, 0x06, 0x07, 0x06, \n\t0x07, 0x15, 0x23, 0x35, 0x26, 0x27, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, \n\t0x17, 0x16, 0x17, 0x11, 0x33, 0x11, 0x37, 0x36, 0x37, 0x11, 0x33, 0x03, \n\t0xdc, 0xc5, 0x39, 0x3c, 0x0d, 0x0e, 0x9e, 0x9c, 0x5f, 0x6f, 0xc5, 0x38, \n\t0x28, 0x45, 0x9e, 0x19, 0x3c, 0x3b, 0xc5, 0x01, 0x83, 0x0f, 0x08, 0x01, \n\t0x02, 0x84, 0x82, 0x0d, 0x58, 0x67, 0xca, 0x01, 0x3e, 0xfe, 0xc2, 0x82, \n\t0x3d, 0x2c, 0x0d, 0x01, 0x16, 0xfe, 0xea, 0x03, 0x08, 0x0f, 0x02, 0x1b, \n\t0x00, 0x01, 0x00, 0x8a, 0x00, 0x00, 0x04, 0xc3, 0x05, 0xb0, 0x00, 0x13, \n\t0x00, 0x3c, 0x00, 0xb0, 0x06, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, \n\t0x2f, 0x1b, 0xb1, 0x01, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x06, 0x3e, 0x59, 0xb0, 0x06, 0x10, \n\t0xb1, 0x0f, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x33, 0x11, 0x33, 0x11, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, \n\t0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x8a, 0xc5, \n\t0x60, 0xb1, 0x7a, 0xf0, 0xf9, 0xc6, 0x8b, 0x98, 0x69, 0xc0, 0x62, 0x05, \n\t0xb0, 0xfd, 0xa5, 0x1b, 0x1c, 0xd4, 0xec, 0xfe, 0x34, 0x01, 0xcc, 0xa4, \n\t0x80, 0x1d, 0x1b, 0xfd, 0x48, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x94, \n\t0x00, 0x01, 0x03, 0xf1, 0x04, 0x3c, 0x01, 0x0f, 0x01, 0xf3, 0x04, 0x70, \n\t0x04, 0x3c, 0xc0, 0x02, 0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x13, 0x2f, 0x1b, 0xb1, 0x13, 0x06, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x4d, 0xff, 0xe9, 0x06, 0x2c, 0x05, 0xc3, 0x00, 0x1e, \n\t0x00, 0x27, 0x00, 0x5a, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, \n\t0x1b, 0xb1, 0x0f, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, \n\t0x2f, 0x1b, 0xb1, 0x00, 0x06, 0x3e, 0x59, 0xb2, 0x24, 0x00, 0x0f, 0x11, \n\t0x12, 0x39, 0xb0, 0x24, 0x2f, 0xb1, 0x13, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0xd0, 0xb0, 0x24, 0x10, 0xb0, \n\t0x0c, 0xd0, 0xb0, 0x00, 0x10, 0xb1, 0x18, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0f, 0x10, 0xb1, 0x1f, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x05, 0x20, \n\t0x00, 0x11, 0x35, 0x26, 0x26, 0x37, 0x37, 0x33, 0x14, 0x16, 0x17, 0x12, \n\t0x00, 0x33, 0x20, 0x00, 0x11, 0x15, 0x21, 0x07, 0x06, 0x12, 0x33, 0x32, \n\t0x36, 0x37, 0x17, 0x06, 0x06, 0x03, 0x22, 0x02, 0x07, 0x17, 0x21, 0x35, \n\t0x34, 0x26, 0x04, 0x47, 0xfe, 0xb6, 0xfe, 0x91, 0x9e, 0xa3, 0x04, 0x02, \n\t0x97, 0x53, 0x55, 0x1b, 0x01, 0x51, 0xe9, 0x01, 0x1b, 0x01, 0x2a, 0xfc, \n\t0x2e, 0x02, 0x05, 0xf7, 0xfd, 0x6b, 0x9a, 0x4b, 0x30, 0x32, 0xc0, 0xee, \n\t0xab, 0xd2, 0x0f, 0x03, 0x03, 0x09, 0xb5, 0x17, 0x01, 0x8d, 0x01, 0x47, \n\t0x06, 0x14, 0xc4, 0x9a, 0x05, 0x5d, 0x7d, 0x12, 0x01, 0x17, 0x01, 0x5e, \n\t0xfe, 0x9d, 0xfe, 0xc9, 0x6c, 0x05, 0xf9, 0xfe, 0xc4, 0x2e, 0x26, 0x8b, \n\t0x24, 0x3f, 0x05, 0x3f, 0xfe, 0xf2, 0xd1, 0x05, 0x1f, 0xce, 0xf7, 0x00, \n\t0x00, 0x02, 0xff, 0xdf, 0xff, 0xeb, 0x04, 0x5a, 0x04, 0x4e, 0x00, 0x1d, \n\t0x00, 0x26, 0x00, 0x66, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, \n\t0x1b, 0xb1, 0x0e, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, \n\t0x2f, 0x1b, 0xb1, 0x00, 0x06, 0x3e, 0x59, 0xb2, 0x12, 0x00, 0x0e, 0x11, \n\t0x12, 0x39, 0xb0, 0x12, 0x2f, 0xb4, 0xd0, 0x12, 0xe0, 0x12, 0x02, 0x5d, \n\t0xb2, 0xa0, 0x12, 0x01, 0x5d, 0xb0, 0x04, 0xd0, 0xb0, 0x12, 0x10, 0xb1, \n\t0x23, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x0b, 0xd0, 0xb0, 0x00, 0x10, 0xb1, 0x17, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0e, 0x10, 0xb1, 0x1e, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x05, 0x22, \n\t0x00, 0x35, 0x35, 0x26, 0x26, 0x35, 0x33, 0x14, 0x16, 0x17, 0x36, 0x24, \n\t0x33, 0x32, 0x12, 0x15, 0x15, 0x21, 0x07, 0x16, 0x16, 0x33, 0x32, 0x36, \n\t0x37, 0x17, 0x06, 0x06, 0x03, 0x22, 0x06, 0x07, 0x17, 0x21, 0x35, 0x34, \n\t0x26, 0x02, 0xbd, 0xe2, 0xfe, 0xf5, 0x77, 0x7a, 0x9d, 0x2d, 0x30, 0x21, \n\t0x01, 0x02, 0xa3, 0xdb, 0xe0, 0xfd, 0x42, 0x03, 0x03, 0x98, 0x89, 0x64, \n\t0x97, 0x37, 0x4d, 0x3a, 0xbe, 0xa5, 0x63, 0x8c, 0x10, 0x02, 0x01, 0xf3, \n\t0x7c, 0x15, 0x01, 0x2d, 0xf0, 0x08, 0x1d, 0xaf, 0x87, 0x45, 0x62, 0x19, \n\t0xbd, 0xee, 0xfe, 0xf8, 0xdc, 0x7b, 0x05, 0x9c, 0xc9, 0x39, 0x32, 0x80, \n\t0x39, 0x4c, 0x03, 0xc8, 0xa7, 0x7e, 0x05, 0x1a, 0x74, 0x9c, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x4d, 0xfe, 0x57, 0x06, 0x2c, 0x05, 0xc3, 0x00, 0x26, \n\t0x02, 0x67, 0x00, 0x00, 0x00, 0x07, 0x03, 0x99, 0x03, 0x0f, 0xff, 0xbe, \n\t0xff, 0xff, 0xff, 0xdf, 0xfe, 0x59, 0x04, 0x5a, 0x04, 0x4e, 0x02, 0x26, \n\t0x02, 0x68, 0x00, 0x00, 0x00, 0x07, 0x03, 0x99, 0x02, 0x04, 0xff, 0xc0, \n\t0xff, 0xff, 0x00, 0xbe, 0x00, 0x00, 0x01, 0x84, 0x05, 0xb0, 0x02, 0x06, \n\t0x00, 0x2c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1c, 0x00, 0x00, 0x07, 0x32, \n\t0x07, 0x4e, 0x02, 0x26, 0x01, 0xc2, 0x00, 0x00, 0x01, 0x07, 0x01, 0x54, \n\t0x01, 0xfe, 0x01, 0x9e, 0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x1a, 0x2f, 0x1b, 0xb1, 0x1a, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x15, 0x00, 0x00, 0x06, 0x04, 0x05, 0xf7, 0x02, 0x26, \n\t0x01, 0xe2, 0x00, 0x00, 0x01, 0x07, 0x01, 0x54, 0x01, 0x64, 0x00, 0x47, \n\t0x00, 0x33, 0x00, 0xb2, 0x8f, 0x1a, 0x01, 0x71, 0xb2, 0xcf, 0x1a, 0x01, \n\t0x71, 0xb2, 0x1f, 0x1a, 0x01, 0x72, 0xb6, 0x3f, 0x1a, 0x4f, 0x1a, 0x5f, \n\t0x1a, 0x03, 0x5d, 0xb2, 0xff, 0x1a, 0x01, 0x71, 0xb2, 0xaf, 0x1a, 0x01, \n\t0x71, 0xb6, 0x60, 0x1a, 0x70, 0x1a, 0x80, 0x1a, 0x03, 0x5d, 0xb2, 0x00, \n\t0x1a, 0x01, 0x71, 0x30, 0x31, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa3, \n\t0xfe, 0xdd, 0x04, 0xd0, 0x05, 0xb0, 0x00, 0x18, 0x00, 0x58, 0x00, 0xb0, \n\t0x06, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x13, 0x2f, 0x1b, 0xb1, 0x13, \n\t0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x16, 0x2f, 0x1b, 0xb1, \n\t0x16, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, \n\t0xb1, 0x10, 0x06, 0x3e, 0x59, 0xb2, 0x14, 0x10, 0x13, 0x11, 0x12, 0x39, \n\t0xb0, 0x14, 0x2f, 0xb0, 0x00, 0xd0, 0xb0, 0x06, 0x10, 0xb1, 0x08, 0x05, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x14, 0x10, \n\t0xb1, 0x0f, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x01, 0x16, 0x00, 0x15, 0x10, 0x02, 0x2f, 0x02, 0x32, 0x36, \n\t0x35, 0x26, 0x26, 0x23, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x33, 0x01, \n\t0x33, 0x17, 0x02, 0xc5, 0xf6, 0x01, 0x0e, 0xf3, 0xe3, 0x06, 0x02, 0x97, \n\t0x82, 0x02, 0xc8, 0xc9, 0xfe, 0xf7, 0xc5, 0xc5, 0x80, 0x02, 0x08, 0xde, \n\t0x02, 0x03, 0x3a, 0x17, 0xfe, 0xd3, 0xfa, 0xfe, 0xf9, 0xfe, 0xe8, 0x04, \n\t0x02, 0x8e, 0xcc, 0xbf, 0xca, 0xd2, 0xfd, 0x68, 0x05, 0xb0, 0xfd, 0x8e, \n\t0x02, 0x72, 0x05, 0x00, 0x00, 0x01, 0x00, 0x99, 0xfe, 0xfe, 0x04, 0x1e, \n\t0x04, 0x3a, 0x00, 0x17, 0x00, 0x50, 0x00, 0xb0, 0x06, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x0a, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x15, 0x2f, 0x1b, 0xb1, 0x15, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x06, 0x3e, \n\t0x59, 0xb2, 0x13, 0x0f, 0x12, 0x11, 0x12, 0x39, 0xb0, 0x13, 0x2f, 0xb4, \n\t0xbf, 0x13, 0xcf, 0x13, 0x02, 0x5d, 0xb0, 0x00, 0xd0, 0xb0, 0x13, 0x10, \n\t0xb1, 0x0e, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x01, 0x16, 0x16, 0x15, 0x06, 0x02, 0x07, 0x27, 0x36, 0x36, \n\t0x35, 0x26, 0x26, 0x23, 0x23, 0x11, 0x23, 0x11, 0x33, 0x11, 0x33, 0x01, \n\t0x33, 0x17, 0x02, 0x89, 0xb8, 0xd7, 0x02, 0xc2, 0xbe, 0x33, 0x80, 0x71, \n\t0x02, 0xb2, 0x9a, 0xa8, 0xc5, 0xc5, 0x54, 0x01, 0x83, 0xe7, 0x02, 0x02, \n\t0x65, 0x1e, 0xde, 0xb9, 0x85, 0xfe, 0xf5, 0x22, 0x96, 0x20, 0x91, 0x6b, \n\t0x90, 0x8b, 0xfe, 0x35, 0x04, 0x3a, 0xfe, 0x37, 0x01, 0xc9, 0x05, 0x00, \n\t0xff, 0xff, 0x00, 0x31, 0xfe, 0xd8, 0x05, 0x9b, 0x05, 0xb0, 0x02, 0x26, \n\t0x01, 0xc7, 0x00, 0x00, 0x00, 0x07, 0x00, 0x0f, 0x04, 0x60, 0xff, 0xda, \n\t0xff, 0xff, 0x00, 0x1a, 0xfe, 0xd8, 0x04, 0xa0, 0x04, 0x3a, 0x02, 0x26, \n\t0x01, 0xe7, 0x00, 0x00, 0x00, 0x07, 0x00, 0x0f, 0x03, 0x65, 0xff, 0xda, \n\t0x00, 0x01, 0x00, 0xb4, 0xfe, 0x4b, 0x05, 0x01, 0x05, 0xb0, 0x00, 0x17, \n\t0x00, 0xb3, 0x00, 0xb0, 0x01, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, \n\t0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x08, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x16, 0x2f, 0x1b, 0xb1, 0x16, 0x06, 0x3e, 0x59, 0xb2, 0x7f, \n\t0x01, 0x01, 0x5d, 0xb2, 0xcf, 0x01, 0x01, 0x5d, 0xb2, 0x1f, 0x01, 0x01, \n\t0x71, 0xb2, 0x7f, 0x01, 0x01, 0x71, 0xb4, 0xbf, 0x01, 0xcf, 0x01, 0x02, \n\t0x71, 0xb2, 0x1f, 0x01, 0x01, 0x72, 0xb2, 0x6f, 0x01, 0x01, 0x72, 0xb2, \n\t0xbf, 0x01, 0x01, 0x72, 0xb4, 0x8f, 0x01, 0x9f, 0x01, 0x02, 0x72, 0xb2, \n\t0x3f, 0x01, 0x01, 0x72, 0xb2, 0xef, 0x01, 0x01, 0x71, 0xb2, 0x9f, 0x01, \n\t0x01, 0x71, 0xb2, 0x4f, 0x01, 0x01, 0x71, 0xb4, 0xef, 0x01, 0xff, 0x01, \n\t0x02, 0x5d, 0xb2, 0xaf, 0x01, 0x01, 0x5d, 0xb2, 0x5f, 0x01, 0x01, 0x5d, \n\t0xb2, 0x2f, 0x01, 0x01, 0x5d, 0xb0, 0x08, 0x10, 0xb1, 0x0f, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x01, 0x10, 0xb1, \n\t0x14, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, \n\t0x31, 0x01, 0x11, 0x21, 0x11, 0x33, 0x11, 0x14, 0x06, 0x23, 0x22, 0x26, \n\t0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x21, 0x11, 0x23, \n\t0x11, 0x01, 0x79, 0x02, 0xc2, 0xc6, 0xad, 0x9a, 0x1f, 0x35, 0x1c, 0x0e, \n\t0x0d, 0x44, 0x11, 0x3d, 0x44, 0xfd, 0x3e, 0xc5, 0x05, 0xb0, 0xfd, 0x6e, \n\t0x02, 0x92, 0xf9, 0xf7, 0xa7, 0xb5, 0x09, 0x09, 0x96, 0x05, 0x08, 0x67, \n\t0x5a, 0x02, 0xdc, 0xfd, 0x7d, 0x05, 0xb0, 0x00, 0x00, 0x01, 0x00, 0x8f, \n\t0xfe, 0x4b, 0x03, 0xfb, 0x04, 0x3a, 0x00, 0x17, 0x00, 0xad, 0x00, 0xb0, \n\t0x01, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, \n\t0x03, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, \n\t0xb1, 0x08, 0x08, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x16, 0x2f, \n\t0x1b, 0xb1, 0x16, 0x06, 0x3e, 0x59, 0xb2, 0x9f, 0x01, 0x01, 0x5d, 0xb2, \n\t0xff, 0x01, 0x01, 0x5d, 0xb2, 0x6f, 0x01, 0x01, 0x71, 0xb4, 0xcf, 0x01, \n\t0xdf, 0x01, 0x02, 0x71, 0xb4, 0x3f, 0x01, 0x4f, 0x01, 0x02, 0x72, 0xb2, \n\t0xaf, 0x01, 0x01, 0x72, 0xb2, 0xef, 0x01, 0x01, 0x72, 0xb4, 0x6f, 0x01, \n\t0x7f, 0x01, 0x02, 0x72, 0xb2, 0xff, 0x01, 0x01, 0x71, 0xb2, 0x0f, 0x01, \n\t0x01, 0x72, 0xb2, 0x9f, 0x01, 0x01, 0x71, 0xb4, 0x2f, 0x01, 0x3f, 0x01, \n\t0x02, 0x71, 0xb4, 0xbf, 0x01, 0xcf, 0x01, 0x02, 0x5d, 0xb2, 0x5f, 0x01, \n\t0x01, 0x5d, 0xb2, 0x2f, 0x01, 0x01, 0x5d, 0xb0, 0x08, 0x10, 0xb1, 0x0f, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x01, \n\t0x10, 0xb1, 0x14, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0x30, 0x31, 0x01, 0x11, 0x21, 0x11, 0x33, 0x11, 0x14, 0x06, 0x23, \n\t0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x21, \n\t0x11, 0x23, 0x11, 0x01, 0x54, 0x01, 0xe2, 0xc5, 0xad, 0x99, 0x1f, 0x35, \n\t0x1c, 0x0f, 0x0d, 0x43, 0x11, 0x3c, 0x45, 0xfe, 0x1e, 0xc5, 0x04, 0x3a, \n\t0xfe, 0x2c, 0x01, 0xd4, 0xfb, 0x6d, 0xa7, 0xb5, 0x09, 0x09, 0x96, 0x05, \n\t0x08, 0x67, 0x5a, 0x02, 0x25, 0xfe, 0x34, 0x04, 0x3a, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0xb4, 0xfe, 0xd8, 0x05, 0xa5, 0x05, 0xb0, 0x02, 0x26, \n\t0x00, 0x2b, 0x00, 0x00, 0x00, 0x07, 0x00, 0x0f, 0x04, 0x6a, 0xff, 0xda, \n\t0xff, 0xff, 0x00, 0x8f, 0xfe, 0xd8, 0x04, 0x9f, 0x04, 0x3a, 0x02, 0x26, \n\t0x01, 0xe9, 0x00, 0x00, 0x00, 0x07, 0x00, 0x0f, 0x03, 0x64, 0xff, 0xda, \n\t0xff, 0xff, 0x00, 0x93, 0xfe, 0x99, 0x04, 0xcc, 0x05, 0xb0, 0x02, 0x26, \n\t0x01, 0xd3, 0x00, 0x00, 0x00, 0x07, 0x03, 0x99, 0x03, 0x15, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x7f, 0xfe, 0x99, 0x03, 0xdc, 0x04, 0x3b, 0x02, 0x26, \n\t0x01, 0xf3, 0x00, 0x00, 0x00, 0x07, 0x03, 0x99, 0x02, 0x24, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0xb4, 0xfe, 0xd8, 0x06, 0xf6, 0x05, 0xb0, 0x02, 0x26, \n\t0x00, 0x30, 0x00, 0x00, 0x00, 0x07, 0x00, 0x0f, 0x05, 0xbb, 0xff, 0xda, \n\t0xff, 0xff, 0x00, 0x99, 0xfe, 0xd8, 0x05, 0xf9, 0x04, 0x3a, 0x02, 0x26, \n\t0x01, 0xe8, 0x00, 0x00, 0x00, 0x07, 0x00, 0x0f, 0x04, 0xbe, 0xff, 0xda, \n\t0xff, 0xff, 0x00, 0xbe, 0x00, 0x00, 0x01, 0x84, 0x05, 0xb0, 0x02, 0x06, \n\t0x00, 0x2c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x14, 0x00, 0x00, 0x05, 0x1a, \n\t0x07, 0x4e, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x01, 0x54, \n\t0x00, 0xeb, 0x01, 0x9e, 0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x6a, 0xff, 0xeb, 0x03, 0xf3, 0x06, 0x0c, 0x02, 0x26, \n\t0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x01, 0x54, 0x7f, 0x5c, 0x00, 0x36, \n\t0x00, 0xb2, 0x00, 0x30, 0x01, 0x71, 0xb2, 0xb0, 0x30, 0x01, 0x71, 0xb2, \n\t0x00, 0x30, 0x01, 0x72, 0xb2, 0x8f, 0x30, 0x01, 0x71, 0xb2, 0x20, 0x30, \n\t0x01, 0x72, 0xb4, 0xd0, 0x30, 0xe0, 0x30, 0x02, 0x71, 0xb2, 0x90, 0x30, \n\t0x01, 0x71, 0xb6, 0x60, 0x30, 0x70, 0x30, 0x80, 0x30, 0x03, 0x5d, 0xb2, \n\t0x20, 0x30, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x14, \n\t0x00, 0x00, 0x05, 0x1a, 0x07, 0x0d, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x6a, 0x00, 0x95, 0x01, 0x5d, 0x00, 0x1d, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x12, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x12, 0x3e, \n\t0x59, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x6a, 0xff, 0xeb, 0x03, 0xf3, \n\t0x05, 0xcb, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x00, 0x6a, \n\t0x29, 0x1b, 0x00, 0x2f, 0x00, 0xb2, 0xf0, 0x2d, 0x01, 0x71, 0xb4, 0x00, \n\t0x2d, 0x10, 0x2d, 0x02, 0x72, 0xb2, 0x60, 0x2d, 0x01, 0x72, 0xb2, 0x40, \n\t0x2d, 0x01, 0x72, 0xb2, 0xf0, 0x30, 0x01, 0x71, 0xb4, 0x00, 0x30, 0x10, \n\t0x30, 0x02, 0x72, 0xb2, 0x60, 0x30, 0x01, 0x72, 0xb2, 0x40, 0x30, 0x01, \n\t0x72, 0x30, 0x31, 0x00, 0xff, 0xff, 0xff, 0xec, 0x00, 0x00, 0x07, 0x61, \n\t0x05, 0xb0, 0x02, 0x06, 0x00, 0x88, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3a, \n\t0xff, 0xeb, 0x06, 0x7c, 0x04, 0x4e, 0x02, 0x06, 0x00, 0xa8, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x7a, 0x07, 0x4e, 0x02, 0x26, \n\t0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x01, 0x54, 0x00, 0xc8, 0x01, 0x9e, \n\t0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, \n\t0x10, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, \n\t0xff, 0xeb, 0x03, 0xed, 0x06, 0x0d, 0x02, 0x26, 0x00, 0x48, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x54, 0x00, 0x82, 0x00, 0x5d, 0x00, 0x31, 0x00, 0xb2, \n\t0x90, 0x24, 0x01, 0x71, 0xb4, 0xd0, 0x24, 0xe0, 0x24, 0x02, 0x71, 0xb2, \n\t0x20, 0x24, 0x01, 0x72, 0xb2, 0x20, 0x24, 0x01, 0x5d, 0xb2, 0x00, 0x24, \n\t0x01, 0x72, 0xb2, 0xb0, 0x24, 0x01, 0x71, 0xb2, 0x00, 0x24, 0x01, 0x71, \n\t0xb6, 0x60, 0x24, 0x70, 0x24, 0x80, 0x24, 0x03, 0x5d, 0x30, 0x31, 0x00, \n\t0x00, 0x02, 0x00, 0x59, 0xff, 0xeb, 0x05, 0x21, 0x05, 0xc5, 0x00, 0x16, \n\t0x00, 0x1f, 0x00, 0x4d, 0x00, 0xb0, 0x0b, 0x2f, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x06, 0x3e, 0x59, 0xb0, 0x00, \n\t0x10, 0xb1, 0x10, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x07, 0x10, 0xb1, 0x17, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0b, 0x10, 0xb1, 0x1c, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x20, 0x00, \n\t0x11, 0x15, 0x10, 0x00, 0x23, 0x20, 0x00, 0x11, 0x35, 0x21, 0x37, 0x36, \n\t0x02, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x13, 0x32, 0x12, 0x37, \n\t0x27, 0x21, 0x15, 0x14, 0x16, 0x02, 0x66, 0x01, 0x4a, 0x01, 0x71, 0xfe, \n\t0xa2, 0xfc, 0xfe, 0xd0, 0xfe, 0xc2, 0x03, 0xfc, 0x02, 0x04, 0xf9, 0xfc, \n\t0x6c, 0x99, 0x4a, 0x31, 0x32, 0xbf, 0xf0, 0xaa, 0xd2, 0x11, 0x03, 0xfc, \n\t0xcd, 0xc7, 0x05, 0xc5, 0xfe, 0x71, 0xfe, 0xba, 0x31, 0xfe, 0xc4, 0xfe, \n\t0x68, 0x01, 0x61, 0x01, 0x38, 0x6c, 0x05, 0xf8, 0x01, 0x3d, 0x2f, 0x25, \n\t0x8b, 0x23, 0x41, 0xfa, 0xc0, 0x01, 0x0d, 0xd2, 0x05, 0x1f, 0xcf, 0xf6, \n\t0xff, 0xff, 0x00, 0x74, 0xff, 0xec, 0x03, 0xfe, 0x04, 0x4f, 0x01, 0x0f, \n\t0x00, 0x48, 0x04, 0x61, 0x04, 0x3a, 0xc0, 0x02, 0x00, 0x13, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x06, 0x3e, 0x59, \n\t0xb0, 0x17, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x59, \n\t0xff, 0xeb, 0x05, 0x21, 0x06, 0xdf, 0x02, 0x26, 0x02, 0x83, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x6a, 0x00, 0x73, 0x01, 0x2f, 0x00, 0x89, 0x00, 0xb2, \n\t0xef, 0x21, 0x01, 0x5d, 0xb6, 0x3f, 0x21, 0x4f, 0x21, 0x5f, 0x21, 0x03, \n\t0x71, 0xb6, 0x0f, 0x21, 0x1f, 0x21, 0x2f, 0x21, 0x03, 0x72, 0xb4, 0x0f, \n\t0x21, 0x1f, 0x21, 0x02, 0x5d, 0x40, 0x0f, 0x8f, 0x21, 0x9f, 0x21, 0xaf, \n\t0x21, 0xbf, 0x21, 0xcf, 0x21, 0xdf, 0x21, 0xef, 0x21, 0x07, 0x71, 0xb4, \n\t0x0f, 0x21, 0x1f, 0x21, 0x02, 0x71, 0xb4, 0x6f, 0x21, 0x7f, 0x21, 0x02, \n\t0x5d, 0xb2, 0xb0, 0x21, 0x01, 0x5d, 0xb2, 0xef, 0x24, 0x01, 0x5d, 0xb6, \n\t0x3f, 0x24, 0x4f, 0x24, 0x5f, 0x24, 0x03, 0x71, 0xb6, 0x0f, 0x24, 0x1f, \n\t0x24, 0x2f, 0x24, 0x03, 0x72, 0xb4, 0x0f, 0x24, 0x1f, 0x24, 0x02, 0x5d, \n\t0x40, 0x0f, 0x8f, 0x24, 0x9f, 0x24, 0xaf, 0x24, 0xbf, 0x24, 0xcf, 0x24, \n\t0xdf, 0x24, 0xef, 0x24, 0x07, 0x71, 0xb4, 0x0f, 0x24, 0x1f, 0x24, 0x02, \n\t0x71, 0xb4, 0x6f, 0x24, 0x7f, 0x24, 0x02, 0x5d, 0xb2, 0xb0, 0x24, 0x01, \n\t0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x74, 0xff, 0xec, 0x03, 0xfe, \n\t0x05, 0xcb, 0x00, 0x2f, 0x00, 0x48, 0x04, 0x61, 0x04, 0x3a, 0xc0, 0x02, \n\t0x01, 0x06, 0x00, 0x6a, 0x36, 0x1b, 0x00, 0x3f, 0x00, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x06, 0x3e, 0x59, 0xb0, 0x17, \n\t0xd0, 0xb2, 0x60, 0x21, 0x01, 0x72, 0xb2, 0x40, 0x21, 0x01, 0x72, 0xb2, \n\t0xf0, 0x21, 0x01, 0x71, 0xb4, 0x00, 0x21, 0x10, 0x21, 0x02, 0x72, 0xb2, \n\t0x60, 0x24, 0x01, 0x72, 0xb2, 0x40, 0x24, 0x01, 0x72, 0xb2, 0xf0, 0x24, \n\t0x01, 0x71, 0xb4, 0x00, 0x24, 0x10, 0x24, 0x02, 0x72, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x1c, 0x00, 0x00, 0x07, 0x32, 0x07, 0x0d, 0x00, 0x26, \n\t0x01, 0xc2, 0x00, 0x00, 0x01, 0x07, 0x00, 0x6a, 0x01, 0xad, 0x01, 0x5d, \n\t0x00, 0x1d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1a, 0x2f, 0x1b, 0xb1, \n\t0x1a, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x17, 0x2f, 0x1b, \n\t0xb1, 0x17, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x15, \n\t0x00, 0x00, 0x06, 0x04, 0x05, 0xb6, 0x00, 0x26, 0x01, 0xe2, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x6a, 0x00, 0xde, 0x00, 0x06, 0x00, 0x33, 0x00, 0xb2, \n\t0x7f, 0x17, 0x01, 0x72, 0xb4, 0xdf, 0x17, 0xef, 0x17, 0x02, 0x71, 0xb2, \n\t0x5f, 0x17, 0x01, 0x72, 0xb4, 0x2f, 0x17, 0x3f, 0x17, 0x02, 0x72, 0xb2, \n\t0x7f, 0x1a, 0x01, 0x72, 0xb4, 0xdf, 0x1a, 0xef, 0x1a, 0x02, 0x71, 0xb2, \n\t0x5f, 0x1a, 0x01, 0x72, 0xb4, 0x2f, 0x1a, 0x3f, 0x1a, 0x02, 0x72, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x78, 0xff, 0xeb, 0x04, 0xdf, \n\t0x07, 0x22, 0x02, 0x26, 0x01, 0xc3, 0x00, 0x00, 0x01, 0x07, 0x00, 0x6a, \n\t0x00, 0xa9, 0x01, 0x72, 0x00, 0x1d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x2f, 0x2f, 0x1b, 0xb1, 0x2f, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x2c, 0x2f, 0x1b, 0xb1, 0x2c, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x58, 0xff, 0xed, 0x03, 0xae, 0x05, 0xca, 0x00, 0x26, \n\t0x01, 0xe3, 0x00, 0x00, 0x01, 0x06, 0x00, 0x6a, 0x25, 0x1a, 0x00, 0x39, \n\t0x00, 0xb2, 0xf0, 0x2c, 0x01, 0x71, 0xb4, 0x00, 0x2c, 0x10, 0x2c, 0x02, \n\t0x72, 0xb2, 0xdf, 0x2c, 0x01, 0x71, 0xb2, 0x60, 0x2c, 0x01, 0x72, 0xb2, \n\t0x40, 0x2c, 0x01, 0x72, 0xb2, 0xf0, 0x2f, 0x01, 0x71, 0xb4, 0x00, 0x2f, \n\t0x10, 0x2f, 0x02, 0x72, 0xb2, 0xdf, 0x2f, 0x01, 0x71, 0xb2, 0x60, 0x2f, \n\t0x01, 0x72, 0xb2, 0x40, 0x2f, 0x01, 0x72, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x69, 0xff, 0xeb, 0x04, 0x2d, 0x05, 0xb0, 0x00, 0x1c, \n\t0x00, 0x53, 0x00, 0xb0, 0x1c, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, \n\t0x2f, 0x1b, 0xb1, 0x03, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x06, 0x3e, 0x59, 0xb0, 0x03, 0x10, 0xb1, \n\t0x01, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x1c, 0x10, 0xb0, 0x06, 0xd0, 0xb0, 0x0c, 0x10, 0xb1, 0x14, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x1c, 0x10, 0xb1, \n\t0x1b, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, \n\t0x31, 0x01, 0x27, 0x21, 0x35, 0x21, 0x17, 0x01, 0x16, 0x16, 0x15, 0x14, \n\t0x04, 0x23, 0x22, 0x24, 0x37, 0x37, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, \n\t0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x03, 0x0d, 0x02, 0xfd, 0x89, 0x03, \n\t0x65, 0x01, 0xfe, 0x67, 0xdb, 0xf1, 0xfe, 0xee, 0xdd, 0xc0, 0xfe, 0xeb, \n\t0x05, 0x02, 0xbd, 0x98, 0x79, 0x8b, 0x9f, 0xa1, 0xa0, 0x92, 0x05, 0x10, \n\t0x05, 0x9b, 0x78, 0xfe, 0x15, 0x0d, 0xe3, 0xc7, 0xc8, 0xe3, 0xd6, 0xcd, \n\t0x06, 0x72, 0x9d, 0x95, 0x78, 0x99, 0x8f, 0x9a, 0x00, 0x01, 0x00, 0x69, \n\t0xfe, 0x75, 0x04, 0x2d, 0x04, 0x3a, 0x00, 0x1c, 0x00, 0x47, 0x00, 0xb0, \n\t0x1c, 0x2f, 0xb0, 0x0c, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, \n\t0x1b, 0xb1, 0x03, 0x0a, 0x3e, 0x59, 0xb1, 0x01, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x1c, 0x10, 0xb1, 0x1b, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x06, 0x1b, \n\t0x1c, 0x11, 0x12, 0x39, 0xb0, 0x0c, 0x10, 0xb1, 0x14, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x27, 0x21, \n\t0x35, 0x21, 0x17, 0x01, 0x16, 0x16, 0x15, 0x14, 0x04, 0x23, 0x22, 0x24, \n\t0x37, 0x37, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, \n\t0x23, 0x35, 0x02, 0xf8, 0x03, 0xfd, 0x9f, 0x03, 0x65, 0x01, 0xfe, 0x74, \n\t0xd6, 0xe9, 0xfe, 0xed, 0xdc, 0xbf, 0xfe, 0xea, 0x05, 0x02, 0xbd, 0x98, \n\t0x79, 0x8b, 0x9f, 0xa2, 0xa0, 0x93, 0x03, 0x99, 0x05, 0x9c, 0x78, 0xfe, \n\t0x13, 0x10, 0xe2, 0xc4, 0xc6, 0xe4, 0xd7, 0xcb, 0x06, 0x70, 0x9d, 0x95, \n\t0x76, 0x9a, 0x8e, 0x9a, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x01, \n\t0x06, 0xfa, 0x02, 0x26, 0x01, 0xc4, 0x00, 0x00, 0x01, 0x07, 0x00, 0x71, \n\t0x00, 0xff, 0x01, 0x4a, 0x00, 0x08, 0x00, 0xb2, 0x0f, 0x0d, 0x01, 0x5d, \n\t0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x8f, 0x00, 0x00, 0x03, 0xfc, \n\t0x05, 0xa5, 0x02, 0x26, 0x01, 0xe4, 0x00, 0x00, 0x00, 0x06, 0x00, 0x71, \n\t0x67, 0xf5, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x01, \n\t0x07, 0x0d, 0x02, 0x26, 0x01, 0xc4, 0x00, 0x00, 0x01, 0x07, 0x00, 0x6a, \n\t0x00, 0xdb, 0x01, 0x5d, 0x00, 0x1d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x8f, 0x00, 0x00, 0x03, 0xfc, 0x05, 0xb6, 0x02, 0x26, \n\t0x01, 0xe4, 0x00, 0x00, 0x01, 0x06, 0x00, 0x6a, 0x43, 0x06, 0x00, 0x33, \n\t0x00, 0xb2, 0x7f, 0x0d, 0x01, 0x72, 0xb4, 0xdf, 0x0d, 0xef, 0x0d, 0x02, \n\t0x71, 0xb2, 0x5f, 0x0d, 0x01, 0x72, 0xb4, 0x2f, 0x0d, 0x3f, 0x0d, 0x02, \n\t0x72, 0xb2, 0x7f, 0x10, 0x01, 0x72, 0xb4, 0xdf, 0x10, 0xef, 0x10, 0x02, \n\t0x71, 0xb2, 0x5f, 0x10, 0x01, 0x72, 0xb4, 0x2f, 0x10, 0x3f, 0x10, 0x02, \n\t0x72, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x71, 0xff, 0xeb, 0x05, 0x02, \n\t0x07, 0x22, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x00, 0x6a, \n\t0x00, 0xb8, 0x01, 0x72, 0x00, 0x1d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x20, 0x2f, 0x1b, 0xb1, 0x20, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x1d, 0x2f, 0x1b, 0xb1, 0x1d, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x61, 0xff, 0xeb, 0x04, 0x2a, 0x05, 0xcb, 0x02, 0x26, \n\t0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x00, 0x6a, 0x44, 0x1b, 0x00, 0x2f, \n\t0x00, 0xb2, 0xf0, 0x1d, 0x01, 0x71, 0xb4, 0x00, 0x1d, 0x10, 0x1d, 0x02, \n\t0x72, 0xb2, 0x60, 0x1d, 0x01, 0x72, 0xb2, 0x40, 0x1d, 0x01, 0x72, 0xb2, \n\t0xf0, 0x20, 0x01, 0x71, 0xb4, 0x00, 0x20, 0x10, 0x20, 0x02, 0x72, 0xb2, \n\t0x60, 0x20, 0x01, 0x72, 0xb2, 0x40, 0x20, 0x01, 0x72, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x71, 0xff, 0xeb, 0x05, 0x02, 0x05, 0xc5, 0x02, 0x06, \n\t0x02, 0x1e, 0x00, 0x00, 0xff, 0xff, 0x00, 0x61, 0xff, 0xeb, 0x04, 0x2a, \n\t0x04, 0x4e, 0x02, 0x06, 0x02, 0x1f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x71, \n\t0xff, 0xeb, 0x05, 0x02, 0x07, 0x08, 0x02, 0x26, 0x02, 0x1e, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x6a, 0x00, 0xce, 0x01, 0x58, 0x00, 0x1d, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x24, 0x2f, 0x1b, 0xb1, 0x24, 0x12, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x21, 0x2f, 0x1b, 0xb1, 0x21, 0x12, 0x3e, \n\t0x59, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x61, 0xff, 0xeb, 0x04, 0x2a, \n\t0x05, 0xe7, 0x02, 0x26, 0x02, 0x1f, 0x00, 0x00, 0x01, 0x06, 0x00, 0x6a, \n\t0x2d, 0x37, 0x00, 0x83, 0x00, 0xb2, 0x60, 0x21, 0x01, 0x72, 0x40, 0x09, \n\t0xc0, 0x21, 0xd0, 0x21, 0xe0, 0x21, 0xf0, 0x21, 0x04, 0x5d, 0x40, 0x1b, \n\t0x00, 0x21, 0x10, 0x21, 0x20, 0x21, 0x30, 0x21, 0x40, 0x21, 0x50, 0x21, \n\t0x60, 0x21, 0x70, 0x21, 0x80, 0x21, 0x90, 0x21, 0xa0, 0x21, 0xb0, 0x21, \n\t0xc0, 0x21, 0x0d, 0x71, 0xb2, 0x40, 0x21, 0x01, 0x72, 0xb2, 0xf0, 0x21, \n\t0x01, 0x71, 0xb4, 0x00, 0x21, 0x10, 0x21, 0x02, 0x72, 0xb2, 0x60, 0x24, \n\t0x01, 0x72, 0x40, 0x09, 0xc0, 0x24, 0xd0, 0x24, 0xe0, 0x24, 0xf0, 0x24, \n\t0x04, 0x5d, 0x40, 0x1b, 0x00, 0x24, 0x10, 0x24, 0x20, 0x24, 0x30, 0x24, \n\t0x40, 0x24, 0x50, 0x24, 0x60, 0x24, 0x70, 0x24, 0x80, 0x24, 0x90, 0x24, \n\t0xa0, 0x24, 0xb0, 0x24, 0xc0, 0x24, 0x0d, 0x71, 0xb2, 0x40, 0x24, 0x01, \n\t0x72, 0xb2, 0xf0, 0x24, 0x01, 0x71, 0xb4, 0x00, 0x24, 0x10, 0x24, 0x02, \n\t0x72, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0xb5, 0xff, 0xec, 0x04, 0xff, \n\t0x07, 0x23, 0x02, 0x26, 0x01, 0xd9, 0x00, 0x00, 0x01, 0x07, 0x00, 0x6a, \n\t0x00, 0xb2, 0x01, 0x73, 0x00, 0x1d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x26, 0x2f, 0x1b, 0xb1, 0x26, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x23, 0x2f, 0x1b, 0xb1, 0x23, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x63, 0xff, 0xeb, 0x03, 0xe3, 0x05, 0xcb, 0x02, 0x26, \n\t0x01, 0xf9, 0x00, 0x00, 0x01, 0x06, 0x00, 0x6a, 0x21, 0x1b, 0x00, 0x2f, \n\t0x00, 0xb2, 0xf0, 0x23, 0x01, 0x71, 0xb4, 0x00, 0x23, 0x10, 0x23, 0x02, \n\t0x72, 0xb2, 0x60, 0x23, 0x01, 0x72, 0xb2, 0x40, 0x23, 0x01, 0x72, 0xb2, \n\t0xf0, 0x26, 0x01, 0x71, 0xb4, 0x00, 0x26, 0x10, 0x26, 0x02, 0x72, 0xb2, \n\t0x60, 0x26, 0x01, 0x72, 0xb2, 0x40, 0x26, 0x01, 0x72, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x55, 0xff, 0xeb, 0x04, 0xc8, 0x06, 0xfa, 0x02, 0x26, \n\t0x01, 0xcf, 0x00, 0x00, 0x01, 0x07, 0x00, 0x71, 0x00, 0xa8, 0x01, 0x4a, \n\t0x00, 0x08, 0x00, 0xb2, 0x0f, 0x16, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x1a, 0xfe, 0x4b, 0x03, 0xe8, 0x05, 0xa5, 0x02, 0x26, \n\t0x00, 0x5c, 0x00, 0x00, 0x00, 0x06, 0x00, 0x71, 0x24, 0xf5, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x55, 0xff, 0xeb, 0x04, 0xc8, 0x07, 0x0d, 0x02, 0x26, \n\t0x01, 0xcf, 0x00, 0x00, 0x01, 0x07, 0x00, 0x6a, 0x00, 0x84, 0x01, 0x5d, \n\t0x00, 0x1d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1a, 0x2f, 0x1b, 0xb1, \n\t0x1a, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x17, 0x2f, 0x1b, \n\t0xb1, 0x17, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x1a, \n\t0xfe, 0x4b, 0x03, 0xe8, 0x05, 0xb6, 0x02, 0x26, 0x00, 0x5c, 0x00, 0x00, \n\t0x01, 0x06, 0x00, 0x6a, 0x00, 0x06, 0x00, 0x33, 0x00, 0xb2, 0x7f, 0x17, \n\t0x01, 0x72, 0xb4, 0xdf, 0x17, 0xef, 0x17, 0x02, 0x71, 0xb2, 0x5f, 0x17, \n\t0x01, 0x72, 0xb4, 0x2f, 0x17, 0x3f, 0x17, 0x02, 0x72, 0xb2, 0x7f, 0x1a, \n\t0x01, 0x72, 0xb4, 0xdf, 0x1a, 0xef, 0x1a, 0x02, 0x71, 0xb2, 0x5f, 0x1a, \n\t0x01, 0x72, 0xb4, 0x2f, 0x1a, 0x3f, 0x1a, 0x02, 0x72, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x55, 0xff, 0xeb, 0x04, 0xc8, 0x07, 0x4b, 0x02, 0x26, \n\t0x01, 0xcf, 0x00, 0x00, 0x01, 0x07, 0x01, 0x59, 0x01, 0x36, 0x01, 0x5d, \n\t0x00, 0x1d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1f, 0x2f, 0x1b, 0xb1, \n\t0x1f, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1a, 0x2f, 0x1b, \n\t0xb1, 0x1a, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x1a, \n\t0xfe, 0x4b, 0x03, 0xfc, 0x05, 0xf4, 0x02, 0x26, 0x00, 0x5c, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x59, 0x00, 0xb2, 0x00, 0x06, 0x00, 0x0d, 0x00, 0xb2, \n\t0xdf, 0x19, 0x01, 0x71, 0xb2, 0xdf, 0x1f, 0x01, 0x71, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x93, 0x00, 0x00, 0x04, 0xcc, 0x07, 0x0d, 0x02, 0x26, \n\t0x01, 0xd3, 0x00, 0x00, 0x01, 0x07, 0x00, 0x6a, 0x00, 0xae, 0x01, 0x5d, \n\t0x00, 0x1d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x18, 0x2f, 0x1b, 0xb1, \n\t0x18, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x15, 0x2f, 0x1b, \n\t0xb1, 0x15, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x7f, \n\t0x00, 0x00, 0x03, 0xdc, 0x05, 0xb6, 0x02, 0x26, 0x01, 0xf3, 0x00, 0x00, \n\t0x01, 0x06, 0x00, 0x6a, 0x26, 0x06, 0x00, 0x33, 0x00, 0xb2, 0x7f, 0x15, \n\t0x01, 0x72, 0xb4, 0xdf, 0x15, 0xef, 0x15, 0x02, 0x71, 0xb2, 0x5f, 0x15, \n\t0x01, 0x72, 0xb4, 0x2f, 0x15, 0x3f, 0x15, 0x02, 0x72, 0xb2, 0x7f, 0x18, \n\t0x01, 0x72, 0xb4, 0xdf, 0x18, 0xef, 0x18, 0x02, 0x71, 0xb2, 0x5f, 0x18, \n\t0x01, 0x72, 0xb4, 0x2f, 0x18, 0x3f, 0x18, 0x02, 0x72, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0xb4, 0xfe, 0x99, 0x04, 0x31, 0x05, 0xb0, 0x02, 0x26, \n\t0x01, 0x6e, 0x00, 0x00, 0x00, 0x07, 0x03, 0x99, 0x00, 0xe5, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x8f, 0xfe, 0x99, 0x03, 0x3f, 0x04, 0x3a, 0x02, 0x26, \n\t0x01, 0xdf, 0x00, 0x00, 0x00, 0x07, 0x03, 0x99, 0x00, 0x9f, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x06, 0x43, 0x07, 0x0d, 0x00, 0x26, \n\t0x01, 0xd8, 0x11, 0x00, 0x00, 0x27, 0x00, 0x2c, 0x04, 0xbf, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x6a, 0x01, 0x7a, 0x01, 0x5d, 0x00, 0x1d, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x1c, 0x2f, 0x1b, 0xb1, 0x1c, 0x12, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x19, 0x2f, 0x1b, 0xb1, 0x19, 0x12, 0x3e, \n\t0x59, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0xad, 0x00, 0x00, 0x05, 0x98, \n\t0x05, 0xb6, 0x00, 0x26, 0x01, 0xf8, 0x14, 0x00, 0x00, 0x27, 0x00, 0xf3, \n\t0x04, 0x3a, 0x00, 0x00, 0x01, 0x07, 0x00, 0x6a, 0x01, 0x22, 0x00, 0x06, \n\t0x00, 0x33, 0x00, 0xb2, 0x7f, 0x19, 0x01, 0x72, 0xb4, 0xdf, 0x19, 0xef, \n\t0x19, 0x02, 0x71, 0xb2, 0x5f, 0x19, 0x01, 0x72, 0xb4, 0x2f, 0x19, 0x3f, \n\t0x19, 0x02, 0x72, 0xb2, 0x7f, 0x1c, 0x01, 0x72, 0xb4, 0xdf, 0x1c, 0xef, \n\t0x1c, 0x02, 0x71, 0xb2, 0x5f, 0x1c, 0x01, 0x72, 0xb4, 0x2f, 0x1c, 0x3f, \n\t0x1c, 0x02, 0x72, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x41, \n\t0xfe, 0x4b, 0x04, 0x7d, 0x05, 0xb0, 0x00, 0x26, 0x01, 0x6e, 0x4c, 0x00, \n\t0x00, 0x26, 0x03, 0x82, 0xaf, 0x3f, 0x00, 0x07, 0x03, 0x9b, 0x01, 0x06, \n\t0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x42, 0xfe, 0x4b, 0x03, 0xa1, \n\t0x04, 0x3a, 0x00, 0x26, 0x01, 0xdf, 0x62, 0x00, 0x00, 0x26, 0x03, 0x82, \n\t0xb0, 0x91, 0x00, 0x07, 0x03, 0x9b, 0x00, 0xf6, 0x00, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x42, 0xfe, 0x4b, 0x05, 0x23, 0x05, 0xb0, 0x02, 0x26, \n\t0x00, 0x3b, 0x00, 0x00, 0x00, 0x07, 0x03, 0x9b, 0x03, 0xb1, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x2e, 0xfe, 0x4b, 0x04, 0x3e, 0x04, 0x3a, 0x02, 0x26, \n\t0x00, 0x5b, 0x00, 0x00, 0x00, 0x07, 0x03, 0x9b, 0x02, 0xcc, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x42, 0x00, 0x00, 0x04, 0xd6, 0x05, 0xb0, 0x00, 0x11, \n\t0x00, 0x64, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, \n\t0x0b, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, \n\t0xb1, 0x0e, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, \n\t0x1b, 0xb1, 0x02, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, \n\t0x2f, 0x1b, 0xb1, 0x05, 0x06, 0x3e, 0x59, 0xb2, 0x11, 0x02, 0x0e, 0x11, \n\t0x12, 0x39, 0xb0, 0x11, 0x2f, 0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x04, 0x05, 0x0b, 0x11, 0x12, 0x39, \n\t0xb0, 0x07, 0xd0, 0xb0, 0x11, 0x10, 0xb0, 0x09, 0xd0, 0xb2, 0x0d, 0x0b, \n\t0x02, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x23, 0x01, 0x23, 0x01, 0x01, \n\t0x23, 0x01, 0x23, 0x35, 0x33, 0x01, 0x33, 0x01, 0x01, 0x33, 0x01, 0x33, \n\t0x03, 0xd5, 0xac, 0x01, 0xad, 0xeb, 0xfe, 0xa3, 0xfe, 0xa2, 0xee, 0x01, \n\t0xad, 0x9b, 0x8d, 0xfe, 0x6b, 0xec, 0x01, 0x52, 0x01, 0x54, 0xee, 0xfe, \n\t0x6a, 0x9f, 0x02, 0x9b, 0xfd, 0x65, 0x02, 0x42, 0xfd, 0xbe, 0x02, 0x9b, \n\t0x9b, 0x02, 0x7a, 0xfd, 0xc8, 0x02, 0x38, 0xfd, 0x86, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x2e, 0x00, 0x00, 0x03, 0xd4, 0x04, 0x3a, 0x00, 0x11, \n\t0x00, 0x64, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, \n\t0x0b, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, \n\t0xb1, 0x0e, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, \n\t0x1b, 0xb1, 0x02, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, \n\t0x2f, 0x1b, 0xb1, 0x05, 0x06, 0x3e, 0x59, 0xb2, 0x11, 0x02, 0x0e, 0x11, \n\t0x12, 0x39, 0xb0, 0x11, 0x2f, 0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x04, 0x05, 0x0b, 0x11, 0x12, 0x39, \n\t0xb0, 0x07, 0xd0, 0xb0, 0x11, 0x10, 0xb0, 0x09, 0xd0, 0xb2, 0x0d, 0x0b, \n\t0x05, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x23, 0x01, 0x23, 0x03, 0x03, \n\t0x23, 0x01, 0x23, 0x35, 0x33, 0x01, 0x33, 0x13, 0x13, 0x33, 0x01, 0x33, \n\t0x03, 0x38, 0xa0, 0x01, 0x3c, 0xe2, 0xf0, 0xf0, 0xe4, 0x01, 0x3b, 0xb2, \n\t0xa7, 0xfe, 0xda, 0xe3, 0xe3, 0xe6, 0xe6, 0xfe, 0xd9, 0x95, 0x01, 0xde, \n\t0xfe, 0x22, 0x01, 0x99, 0xfe, 0x67, 0x01, 0xde, 0x9b, 0x01, 0xc1, 0xfe, \n\t0x71, 0x01, 0x8f, 0xfe, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5b, \n\t0x00, 0x00, 0x04, 0x72, 0x05, 0xb0, 0x00, 0x0a, 0x00, 0x13, 0x00, 0x3b, \n\t0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, \n\t0xb1, 0x01, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, \n\t0x1b, 0xb1, 0x03, 0x06, 0x3e, 0x59, 0xb1, 0x0b, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x0c, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, \n\t0x11, 0x33, 0x11, 0x21, 0x22, 0x24, 0x35, 0x34, 0x24, 0x33, 0x01, 0x11, \n\t0x21, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x03, 0xad, 0xc5, 0xfd, 0xd4, \n\t0xe9, 0xfe, 0xfe, 0x01, 0x01, 0xea, 0x01, 0x67, 0xfe, 0x99, 0x94, 0x92, \n\t0x92, 0x94, 0x03, 0x70, 0x02, 0x40, 0xfa, 0x50, 0xf6, 0xc6, 0xc5, 0xef, \n\t0xfd, 0x2a, 0x02, 0x3b, 0xa0, 0x77, 0x7b, 0xa9, 0xff, 0xff, 0x00, 0x62, \n\t0xff, 0xeb, 0x03, 0xf5, 0x06, 0x18, 0x02, 0x06, 0x00, 0x47, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x5b, 0x00, 0x00, 0x06, 0x6e, 0x05, 0xb0, 0x00, 0x18, \n\t0x00, 0x21, 0x00, 0x41, 0x00, 0xb0, 0x07, 0x2f, 0xb0, 0x11, 0x2f, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0c, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x06, 0x3e, \n\t0x59, 0xb1, 0x0a, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x19, 0xd0, 0xb0, 0x07, 0x10, 0xb1, 0x1a, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x21, 0x22, 0x24, \n\t0x35, 0x34, 0x24, 0x33, 0x21, 0x11, 0x33, 0x11, 0x37, 0x36, 0x36, 0x37, \n\t0x36, 0x26, 0x27, 0x33, 0x16, 0x16, 0x07, 0x06, 0x06, 0x23, 0x25, 0x11, \n\t0x21, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x02, 0x46, 0xe9, 0xfe, 0xfe, \n\t0x01, 0x01, 0xea, 0x01, 0x67, 0xc5, 0x53, 0x6a, 0x74, 0x04, 0x01, 0x1f, \n\t0x1e, 0xbe, 0x21, 0x24, 0x02, 0x04, 0xf3, 0xb0, 0xfe, 0xe8, 0xfe, 0x99, \n\t0x94, 0x92, 0x92, 0x94, 0xf6, 0xc6, 0xc5, 0xef, 0x02, 0x40, 0xfa, 0xe9, \n\t0x01, 0x01, 0x8d, 0x7e, 0x4d, 0xa7, 0x4f, 0x64, 0x97, 0x48, 0xcc, 0xda, \n\t0x9a, 0x02, 0x3b, 0xa0, 0x77, 0x7b, 0xa9, 0x00, 0x00, 0x02, 0x00, 0x62, \n\t0xff, 0xe9, 0x06, 0x74, 0x06, 0x18, 0x00, 0x22, 0x00, 0x33, 0x00, 0x59, \n\t0x00, 0xb0, 0x07, 0x2f, 0xb0, 0x12, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x19, 0x2f, 0x1b, 0xb1, 0x19, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x1f, 0x2f, 0x1b, 0xb1, 0x1f, 0x06, 0x3e, 0x59, 0xb2, 0x2f, \n\t0x07, 0x01, 0x5d, 0xb0, 0x19, 0x10, 0xb1, 0x0c, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x26, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0c, 0x10, \n\t0xb0, 0x2d, 0xd0, 0x30, 0x31, 0x13, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, \n\t0x11, 0x33, 0x11, 0x06, 0x16, 0x33, 0x36, 0x36, 0x37, 0x36, 0x26, 0x27, \n\t0x37, 0x16, 0x16, 0x07, 0x02, 0x00, 0x23, 0x06, 0x26, 0x27, 0x06, 0x06, \n\t0x23, 0x22, 0x02, 0x35, 0x01, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x15, \n\t0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x26, 0x26, 0x35, 0x62, 0xdf, 0xc9, \n\t0x59, 0x8c, 0x34, 0xc5, 0x02, 0x5c, 0x4d, 0x86, 0x94, 0x04, 0x01, 0x1f, \n\t0x1e, 0xbe, 0x21, 0x24, 0x02, 0x04, 0xfe, 0xec, 0xcb, 0x78, 0xa3, 0x29, \n\t0x35, 0xa1, 0x6d, 0xc6, 0xe0, 0x02, 0xc1, 0x27, 0x72, 0x4e, 0x8e, 0x87, \n\t0x86, 0x8d, 0x54, 0x74, 0x27, 0x03, 0x03, 0x02, 0x09, 0x01, 0x05, 0x01, \n\t0x40, 0x3e, 0x3b, 0x02, 0x43, 0xfb, 0x41, 0x5f, 0x75, 0x01, 0xd2, 0xb9, \n\t0x61, 0xcb, 0x66, 0x01, 0x7a, 0xbd, 0x5c, 0xfe, 0xf6, 0xfe, 0xe4, 0x02, \n\t0x55, 0x5d, 0x57, 0x59, 0x01, 0x1f, 0xea, 0x01, 0x3d, 0x3a, 0x43, 0xea, \n\t0xbb, 0x15, 0xa4, 0xc5, 0x49, 0x42, 0x0f, 0x22, 0x12, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x36, 0xff, 0xe8, 0x05, 0xd3, 0x05, 0xb0, 0x00, 0x2c, \n\t0x00, 0x57, 0x00, 0xb0, 0x04, 0x2f, 0xb0, 0x22, 0x2f, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x0c, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x29, 0x2f, 0x1b, 0xb1, 0x29, 0x06, 0x3e, 0x59, 0xb0, \n\t0x04, 0x10, 0xb1, 0x05, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x0e, 0x10, 0xb1, 0x0c, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x15, 0x04, 0x05, 0x11, 0x12, 0x39, \n\t0xb0, 0x29, 0x10, 0xb1, 0x1c, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x34, 0x26, 0x23, 0x23, 0x35, 0x33, \n\t0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x21, 0x35, 0x21, 0x32, 0x16, 0x15, \n\t0x14, 0x06, 0x07, 0x16, 0x16, 0x15, 0x15, 0x06, 0x16, 0x33, 0x36, 0x36, \n\t0x37, 0x36, 0x26, 0x27, 0x33, 0x16, 0x16, 0x07, 0x02, 0x02, 0x23, 0x06, \n\t0x26, 0x27, 0x02, 0xbf, 0x89, 0x74, 0xbf, 0x88, 0xa6, 0x93, 0x8f, 0x98, \n\t0xfe, 0x99, 0x01, 0x67, 0xef, 0xfd, 0x75, 0x6f, 0x76, 0x69, 0x01, 0x4f, \n\t0x43, 0x74, 0x80, 0x04, 0x01, 0x1f, 0x1e, 0xbe, 0x22, 0x22, 0x01, 0x04, \n\t0xfe, 0xbb, 0xa0, 0xae, 0x08, 0x01, 0x72, 0x76, 0x91, 0x9b, 0x7e, 0x83, \n\t0x79, 0x87, 0x9b, 0xd4, 0xc9, 0x71, 0xa5, 0x31, 0x28, 0xb0, 0x80, 0x44, \n\t0x4c, 0x5f, 0x01, 0xd4, 0xb7, 0x61, 0xcc, 0x66, 0x86, 0xb3, 0x5a, 0xfe, \n\t0xf7, 0xfe, 0xe3, 0x03, 0x9d, 0xab, 0x00, 0x00, 0x00, 0x01, 0x00, 0x31, \n\t0xff, 0xe3, 0x04, 0xeb, 0x04, 0x3a, 0x00, 0x2c, 0x00, 0x54, 0x00, 0xb0, \n\t0x18, 0x2f, 0xb0, 0x09, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x22, 0x2f, \n\t0x1b, 0xb1, 0x22, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, \n\t0x2f, 0x1b, 0xb1, 0x10, 0x06, 0x3e, 0x59, 0xb1, 0x03, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x18, 0x10, 0xb1, 0x19, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x22, \n\t0x10, 0xb1, 0x20, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb2, 0x29, 0x18, 0x19, 0x11, 0x12, 0x39, 0x30, 0x31, 0x25, 0x06, \n\t0x16, 0x33, 0x36, 0x36, 0x37, 0x36, 0x26, 0x27, 0x33, 0x16, 0x16, 0x07, \n\t0x06, 0x06, 0x23, 0x06, 0x26, 0x27, 0x35, 0x34, 0x26, 0x23, 0x23, 0x27, \n\t0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x21, 0x27, 0x21, 0x32, 0x16, \n\t0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, 0x02, 0xec, 0x01, 0x27, 0x2f, \n\t0x6a, 0x75, 0x04, 0x01, 0x20, 0x1e, 0xbe, 0x22, 0x24, 0x02, 0x05, 0xf2, \n\t0xb1, 0x8a, 0x8a, 0x06, 0x6a, 0x62, 0xd3, 0x02, 0xb8, 0x77, 0x71, 0x72, \n\t0x77, 0xfe, 0xfa, 0x06, 0x01, 0x0c, 0xce, 0xe2, 0x60, 0x5d, 0x63, 0x59, \n\t0xd5, 0x2a, 0x2c, 0x02, 0x99, 0x89, 0x4c, 0xa4, 0x4f, 0x66, 0x92, 0x47, \n\t0xd7, 0xe6, 0x03, 0x72, 0x81, 0x4b, 0x47, 0x4f, 0x9a, 0x53, 0x4d, 0x51, \n\t0x5f, 0x99, 0xaa, 0x98, 0x51, 0x72, 0x24, 0x1c, 0x7a, 0x59, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x50, 0xfe, 0xfc, 0x03, 0xd1, 0x05, 0xb0, 0x00, 0x23, \n\t0x00, 0x54, 0x00, 0xb0, 0x0c, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x16, \n\t0x2f, 0x1b, 0xb1, 0x16, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x06, 0x3e, 0x59, 0xb0, 0x0c, 0x10, 0xb1, \n\t0x0d, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x16, 0x10, 0xb1, 0x15, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb2, 0x1d, 0x0c, 0x0d, 0x11, 0x12, 0x39, 0xb0, 0x03, 0x10, \n\t0xb1, 0x22, 0x04, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x25, 0x03, 0x23, 0x13, 0x23, 0x26, 0x26, 0x35, 0x35, 0x34, \n\t0x26, 0x23, 0x23, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x21, \n\t0x35, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x1d, 0x02, \n\t0x33, 0x03, 0xd1, 0x96, 0x75, 0x39, 0x3d, 0x29, 0x15, 0x89, 0x74, 0xdc, \n\t0xa2, 0xa7, 0x95, 0x8f, 0x98, 0xfe, 0xee, 0x01, 0x12, 0xef, 0xfc, 0x75, \n\t0x6f, 0x77, 0x69, 0x88, 0x2e, 0xfe, 0xce, 0x01, 0x04, 0x23, 0x83, 0x47, \n\t0x84, 0x76, 0x91, 0x9a, 0x7f, 0x82, 0x7a, 0x88, 0x9b, 0xd4, 0xcb, 0x70, \n\t0xa6, 0x30, 0x28, 0xb0, 0x80, 0x88, 0x10, 0x00, 0x00, 0x01, 0x00, 0x7b, \n\t0xfe, 0xe8, 0x03, 0xc1, 0x04, 0x3a, 0x00, 0x22, 0x00, 0x54, 0x00, 0xb0, \n\t0x0c, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x16, 0x2f, 0x1b, 0xb1, 0x16, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, \n\t0x04, 0x06, 0x3e, 0x59, 0xb0, 0x0c, 0x10, 0xb1, 0x0d, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x16, 0x10, 0xb1, 0x15, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x1d, \n\t0x0c, 0x0d, 0x11, 0x12, 0x39, 0xb0, 0x04, 0x10, 0xb1, 0x21, 0x04, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x25, 0x03, \n\t0x23, 0x13, 0x23, 0x26, 0x26, 0x35, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, \n\t0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x21, 0x35, 0x21, 0x32, 0x16, \n\t0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, 0x15, 0x33, 0x03, 0xc1, 0x96, \n\t0x75, 0x3e, 0x3f, 0x25, 0x14, 0x6a, 0x62, 0xef, 0xd2, 0x78, 0x70, 0x71, \n\t0x77, 0xfe, 0xe8, 0x01, 0x18, 0xcd, 0xe1, 0x61, 0x5e, 0x66, 0x59, 0x80, \n\t0x1a, 0xfe, 0xce, 0x01, 0x18, 0x17, 0x63, 0x33, 0x5f, 0x50, 0x5b, 0x9a, \n\t0x53, 0x4e, 0x51, 0x5e, 0x99, 0xa9, 0x99, 0x51, 0x74, 0x24, 0x1d, 0x84, \n\t0x61, 0x46, 0x00, 0x00, 0x00, 0x01, 0x00, 0x45, 0xff, 0xe8, 0x07, 0x75, \n\t0x05, 0xb0, 0x00, 0x21, 0x00, 0x5a, 0x00, 0xb0, 0x17, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x0c, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x1e, 0x2f, 0x1b, 0xb1, 0x1e, 0x06, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x06, 0x3e, \n\t0x59, 0xb0, 0x0c, 0x10, 0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x06, 0x10, 0xb1, 0x07, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x1e, 0x10, 0xb1, 0x11, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x01, 0x21, 0x11, 0x10, 0x02, 0x23, 0x23, 0x35, 0x33, 0x32, 0x12, 0x11, \n\t0x11, 0x21, 0x11, 0x06, 0x16, 0x33, 0x36, 0x36, 0x37, 0x36, 0x26, 0x27, \n\t0x37, 0x16, 0x16, 0x07, 0x02, 0x00, 0x23, 0x06, 0x26, 0x27, 0x04, 0x24, \n\t0xfe, 0x28, 0xd8, 0xfa, 0x35, 0x29, 0x95, 0x85, 0x03, 0x61, 0x01, 0x5b, \n\t0x4d, 0x87, 0x93, 0x04, 0x01, 0x1f, 0x1e, 0xbe, 0x21, 0x24, 0x02, 0x04, \n\t0xfe, 0xec, 0xcb, 0xaa, 0xba, 0x08, 0x05, 0x15, 0xfd, 0xeb, 0xfe, 0x72, \n\t0xfe, 0x8e, 0x9a, 0x01, 0x20, 0x01, 0x46, 0x02, 0xb0, 0xfb, 0xa9, 0x5f, \n\t0x75, 0x01, 0xd2, 0xb9, 0x61, 0xcb, 0x66, 0x01, 0x7a, 0xbd, 0x5c, 0xfe, \n\t0xf6, 0xfe, 0xe4, 0x03, 0xb1, 0xc0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x41, \n\t0xff, 0xe8, 0x06, 0x41, 0x04, 0x3a, 0x00, 0x21, 0x00, 0x5a, 0x00, 0xb0, \n\t0x17, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, 0x0c, \n\t0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1e, 0x2f, 0x1b, 0xb1, \n\t0x1e, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, \n\t0xb1, 0x06, 0x06, 0x3e, 0x59, 0xb0, 0x0c, 0x10, 0xb1, 0x00, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x06, 0x10, 0xb1, \n\t0x07, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x1e, 0x10, 0xb1, 0x11, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x11, 0x10, 0x02, 0x23, 0x23, 0x37, \n\t0x37, 0x32, 0x36, 0x35, 0x11, 0x21, 0x11, 0x06, 0x16, 0x33, 0x36, 0x36, \n\t0x37, 0x36, 0x26, 0x27, 0x33, 0x16, 0x16, 0x07, 0x06, 0x02, 0x23, 0x06, \n\t0x26, 0x27, 0x03, 0x2d, 0xfe, 0xcd, 0xb2, 0xce, 0x39, 0x04, 0x29, 0x6b, \n\t0x5c, 0x02, 0xbd, 0x01, 0x5a, 0x4c, 0x6b, 0x74, 0x04, 0x01, 0x20, 0x1e, \n\t0xbf, 0x21, 0x24, 0x02, 0x04, 0xf3, 0xb1, 0xa8, 0xba, 0x08, 0x03, 0x9e, \n\t0xfe, 0xd0, 0xfe, 0xc3, 0xfe, 0xcf, 0xa8, 0x01, 0xd4, 0xf1, 0x01, 0xcc, \n\t0xfd, 0x1f, 0x5f, 0x75, 0x01, 0xbb, 0xa4, 0x5c, 0xc0, 0x61, 0x78, 0xaf, \n\t0x56, 0xf4, 0xfe, 0xfa, 0x03, 0xb1, 0xc0, 0x00, 0x00, 0x01, 0x00, 0xa9, \n\t0xff, 0xe8, 0x07, 0x7e, 0x05, 0xb0, 0x00, 0x1d, 0x00, 0xb6, 0x00, 0xb0, \n\t0x1b, 0x2f, 0xb0, 0x0a, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, \n\t0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x19, \n\t0x2f, 0x1b, 0xb1, 0x19, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x18, 0x2f, 0x1b, 0xb1, 0x18, 0x06, 0x3e, 0x59, 0xb0, 0x11, 0x10, \n\t0xb1, 0x04, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb2, 0x5f, 0x1b, 0x01, 0x5d, 0xb2, 0xaf, 0x1b, 0x01, 0x5d, 0xb4, 0xef, \n\t0x1b, 0xff, 0x1b, 0x02, 0x5d, 0xb2, 0x4f, 0x1b, 0x01, 0x71, 0xb2, 0x9f, \n\t0x1b, 0x01, 0x71, 0xb2, 0xef, 0x1b, 0x01, 0x71, 0xb2, 0x3f, 0x1b, 0x01, \n\t0x72, 0xb4, 0x8f, 0x1b, 0x9f, 0x1b, 0x02, 0x72, 0xb2, 0x6f, 0x1b, 0x01, \n\t0x72, 0xb2, 0x1f, 0x1b, 0x01, 0x72, 0xb4, 0xbf, 0x1b, 0xcf, 0x1b, 0x02, \n\t0x71, 0xb2, 0x7f, 0x1b, 0x01, 0x71, 0xb2, 0x1f, 0x1b, 0x01, 0x71, 0xb2, \n\t0xcf, 0x1b, 0x01, 0x5d, 0xb2, 0x7f, 0x1b, 0x01, 0x5d, 0xb2, 0x2f, 0x1b, \n\t0x01, 0x5d, 0xb2, 0xbf, 0x1b, 0x01, 0x72, 0xb0, 0x1b, 0x10, 0xb1, 0x16, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x01, 0x11, 0x06, 0x16, 0x33, 0x36, 0x36, 0x37, 0x36, 0x26, 0x27, 0x37, \n\t0x16, 0x16, 0x07, 0x02, 0x00, 0x23, 0x06, 0x26, 0x27, 0x11, 0x21, 0x11, \n\t0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x04, 0xf2, 0x01, 0x5a, 0x4d, 0x87, \n\t0x94, 0x04, 0x01, 0x20, 0x1e, 0xbe, 0x22, 0x24, 0x02, 0x05, 0xfe, 0xec, \n\t0xcb, 0xa9, 0xba, 0x08, 0xfd, 0x41, 0xc5, 0xc5, 0x02, 0xbf, 0x05, 0xb0, \n\t0xfb, 0xa9, 0x5f, 0x75, 0x01, 0xd2, 0xb9, 0x61, 0xca, 0x67, 0x01, 0x7c, \n\t0xbb, 0x5c, 0xfe, 0xf6, 0xfe, 0xe4, 0x03, 0xb1, 0xc0, 0x01, 0x2a, 0xfd, \n\t0x7d, 0x05, 0xb0, 0xfd, 0x6e, 0x02, 0x92, 0x00, 0x00, 0x01, 0x00, 0x8f, \n\t0xff, 0xe8, 0x06, 0x55, 0x04, 0x3a, 0x00, 0x1d, 0x00, 0xb2, 0x00, 0xb0, \n\t0x13, 0x2f, 0xb0, 0x06, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, \n\t0x1b, 0xb1, 0x05, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, \n\t0x2f, 0x1b, 0xb1, 0x08, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x1a, 0x2f, 0x1b, 0xb1, 0x1a, 0x06, 0x3e, 0x59, 0xb2, 0x9f, 0x06, \n\t0x01, 0x5d, 0xb2, 0xff, 0x06, 0x01, 0x5d, 0xb2, 0x6f, 0x06, 0x01, 0x71, \n\t0xb4, 0xcf, 0x06, 0xdf, 0x06, 0x02, 0x71, 0xb4, 0x3f, 0x06, 0x4f, 0x06, \n\t0x02, 0x72, 0xb2, 0xaf, 0x06, 0x01, 0x72, 0xb4, 0xdf, 0x06, 0xef, 0x06, \n\t0x02, 0x72, 0xb4, 0x6f, 0x06, 0x7f, 0x06, 0x02, 0x72, 0xb2, 0xff, 0x06, \n\t0x01, 0x71, 0xb2, 0x0f, 0x06, 0x01, 0x72, 0xb2, 0x9f, 0x06, 0x01, 0x71, \n\t0xb4, 0x2f, 0x06, 0x3f, 0x06, 0x02, 0x71, 0xb4, 0xbf, 0x06, 0xcf, 0x06, \n\t0x02, 0x5d, 0xb2, 0x5f, 0x06, 0x01, 0x5d, 0xb2, 0x2f, 0x06, 0x01, 0x5d, \n\t0xb0, 0x06, 0x10, 0xb1, 0x01, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x1a, 0x10, 0xb1, 0x0d, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x11, 0x23, \n\t0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x06, 0x16, 0x33, 0x36, 0x36, \n\t0x37, 0x36, 0x26, 0x27, 0x33, 0x16, 0x16, 0x07, 0x06, 0x02, 0x23, 0x06, \n\t0x26, 0x27, 0x03, 0x40, 0xfe, 0x14, 0xc5, 0xc5, 0x01, 0xec, 0xc5, 0x01, \n\t0x5b, 0x4c, 0x6a, 0x75, 0x04, 0x01, 0x1f, 0x1e, 0xbd, 0x22, 0x24, 0x02, \n\t0x04, 0xf2, 0xb2, 0xa9, 0xba, 0x08, 0x01, 0xcc, 0xfe, 0x34, 0x04, 0x3a, \n\t0xfe, 0x2b, 0x01, 0xd5, 0xfd, 0x1f, 0x5f, 0x75, 0x01, 0xbb, 0xa4, 0x5b, \n\t0xc1, 0x61, 0x7b, 0xac, 0x56, 0xf4, 0xfe, 0xfa, 0x03, 0xb1, 0xc0, 0x00, \n\t0x00, 0x01, 0x00, 0x76, 0xff, 0xeb, 0x04, 0x9f, 0x05, 0xc5, 0x00, 0x21, \n\t0x00, 0x3b, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, \n\t0x07, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, \n\t0xb1, 0x00, 0x06, 0x3e, 0x59, 0xb0, 0x07, 0x10, 0xb1, 0x0e, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb1, \n\t0x15, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, \n\t0x31, 0x05, 0x20, 0x00, 0x11, 0x11, 0x10, 0x00, 0x21, 0x32, 0x16, 0x17, \n\t0x07, 0x26, 0x26, 0x23, 0x22, 0x02, 0x15, 0x11, 0x14, 0x12, 0x33, 0x36, \n\t0x36, 0x37, 0x36, 0x26, 0x27, 0x33, 0x16, 0x16, 0x07, 0x06, 0x04, 0x02, \n\t0xb9, 0xff, 0x00, 0xfe, 0xbd, 0x01, 0x43, 0x01, 0x00, 0x71, 0xb2, 0x44, \n\t0x3f, 0x43, 0x90, 0x55, 0xaf, 0xcf, 0xcf, 0xaf, 0x88, 0x94, 0x04, 0x01, \n\t0x1b, 0x18, 0xbe, 0x2a, 0x10, 0x01, 0x04, 0xfe, 0xeb, 0x15, 0x01, 0x5e, \n\t0x01, 0x0c, 0x01, 0x06, 0x01, 0x0b, 0x01, 0x5f, 0x2d, 0x2b, 0x87, 0x21, \n\t0x23, 0xfe, 0xf6, 0xc3, 0xfe, 0xf8, 0xc6, 0xfe, 0xf6, 0x01, 0x9a, 0x89, \n\t0x53, 0xb5, 0x61, 0xc5, 0x56, 0x4e, 0xd8, 0xe6, 0x00, 0x01, 0x00, 0x62, \n\t0xff, 0xeb, 0x03, 0xc6, 0x04, 0x4e, 0x00, 0x21, 0x00, 0x38, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x14, 0x2f, 0x1b, 0xb1, 0x14, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x06, 0x3e, \n\t0x59, 0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x14, 0x10, 0xb1, 0x1b, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x25, 0x36, 0x36, 0x37, 0x34, 0x26, \n\t0x27, 0x33, 0x16, 0x16, 0x15, 0x06, 0x06, 0x23, 0x22, 0x00, 0x35, 0x35, \n\t0x34, 0x12, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x06, \n\t0x15, 0x15, 0x14, 0x16, 0x02, 0x51, 0x5f, 0x4e, 0x03, 0x0a, 0x09, 0xbd, \n\t0x0d, 0x0e, 0x04, 0xcc, 0xa5, 0xe6, 0xfe, 0xf7, 0xff, 0xdb, 0x5e, 0x8e, \n\t0x2f, 0x2e, 0x2f, 0x7a, 0x44, 0x89, 0x8c, 0x95, 0x85, 0x01, 0x53, 0x54, \n\t0x3a, 0x7a, 0x38, 0x44, 0x73, 0x35, 0x9e, 0xa4, 0x01, 0x3a, 0xe3, 0x2a, \n\t0xe2, 0x01, 0x3a, 0x23, 0x1f, 0x93, 0x1b, 0x1f, 0xe7, 0x9a, 0x2a, 0x9e, \n\t0xe5, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x24, 0xff, 0xe8, 0x05, 0x4d, \n\t0x05, 0xb0, 0x00, 0x19, 0x00, 0x41, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x16, 0x2f, 0x1b, 0xb1, 0x16, 0x06, 0x3e, 0x59, 0xb0, 0x02, 0x10, \n\t0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x04, 0xd0, 0xb0, 0x05, 0xd0, 0xb0, 0x16, 0x10, 0xb1, 0x09, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, \n\t0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x06, 0x16, 0x33, 0x36, 0x36, 0x37, \n\t0x36, 0x26, 0x27, 0x37, 0x16, 0x16, 0x07, 0x02, 0x00, 0x23, 0x06, 0x26, \n\t0x27, 0x01, 0xfc, 0xfe, 0x28, 0x04, 0x80, 0xfe, 0x1d, 0x01, 0x5b, 0x4c, \n\t0x87, 0x95, 0x04, 0x01, 0x20, 0x1f, 0xbf, 0x22, 0x23, 0x02, 0x04, 0xfe, \n\t0xec, 0xcc, 0xa9, 0xba, 0x08, 0x05, 0x15, 0x9b, 0x9b, 0xfc, 0x44, 0x5f, \n\t0x75, 0x01, 0xd2, 0xb9, 0x60, 0xca, 0x68, 0x01, 0x7c, 0xbb, 0x5c, 0xfe, \n\t0xf6, 0xfe, 0xe4, 0x03, 0xb1, 0xc0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x46, \n\t0xff, 0xe8, 0x04, 0xbd, 0x04, 0x3a, 0x00, 0x19, 0x00, 0x41, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x0a, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x16, 0x2f, 0x1b, 0xb1, 0x16, 0x06, 0x3e, \n\t0x59, 0xb0, 0x02, 0x10, 0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0xd0, 0xb0, 0x05, 0xd0, 0xb0, 0x16, \n\t0x10, 0xb1, 0x09, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0x30, 0x31, 0x01, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x06, 0x16, \n\t0x33, 0x36, 0x36, 0x37, 0x36, 0x26, 0x27, 0x33, 0x16, 0x16, 0x07, 0x06, \n\t0x06, 0x23, 0x06, 0x26, 0x27, 0x01, 0xa8, 0xfe, 0x9e, 0x03, 0x8b, 0xfe, \n\t0x9c, 0x01, 0x5a, 0x4d, 0x6a, 0x75, 0x04, 0x01, 0x20, 0x1d, 0xbd, 0x22, \n\t0x24, 0x02, 0x04, 0xf3, 0xb1, 0xa9, 0xba, 0x08, 0x03, 0xa1, 0x99, 0x99, \n\t0xfd, 0xb8, 0x5f, 0x75, 0x01, 0x9b, 0x89, 0x4c, 0xa7, 0x50, 0x67, 0x94, \n\t0x48, 0xd8, 0xe7, 0x03, 0xb1, 0xc0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9c, \n\t0xff, 0xeb, 0x05, 0x02, 0x05, 0xc5, 0x00, 0x2a, 0x00, 0x6f, 0x00, 0xb0, \n\t0x29, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1a, 0x2f, 0x1b, 0xb1, 0x1a, \n\t0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, \n\t0x0e, 0x06, 0x3e, 0x59, 0xb1, 0x06, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x7f, 0x29, 0x01, 0x5d, 0xb2, 0xef, 0x29, \n\t0x01, 0x5d, 0xb2, 0x1f, 0x29, 0x01, 0x71, 0xb2, 0xcf, 0x29, 0x01, 0x5d, \n\t0xb2, 0x2f, 0x29, 0x01, 0x5d, 0xb2, 0xbf, 0x29, 0x01, 0x71, 0xb0, 0x29, \n\t0x10, 0xb1, 0x2a, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb2, 0x14, 0x2a, 0x29, 0x11, 0x12, 0x39, 0xb0, 0x1a, 0x10, 0xb1, \n\t0x22, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, \n\t0x31, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x33, \n\t0x17, 0x16, 0x04, 0x23, 0x20, 0x24, 0x35, 0x34, 0x36, 0x37, 0x26, 0x26, \n\t0x35, 0x34, 0x24, 0x21, 0x32, 0x04, 0x07, 0x07, 0x23, 0x34, 0x26, 0x23, \n\t0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x33, 0x15, 0x02, 0xcd, 0xb5, 0xb7, \n\t0xca, 0xb2, 0x9c, 0xc7, 0xbc, 0x02, 0x04, 0xfe, 0xbc, 0xe1, 0xfe, 0xfe, \n\t0xfe, 0xc1, 0x8e, 0x87, 0x78, 0x87, 0x01, 0x2a, 0x01, 0x01, 0xdf, 0x01, \n\t0x32, 0x05, 0x01, 0xbc, 0xc3, 0x8c, 0xb2, 0xb4, 0xa7, 0xaf, 0xb8, 0x02, \n\t0x98, 0x81, 0x85, 0x78, 0x95, 0x9d, 0x72, 0x06, 0xcd, 0xd6, 0xe3, 0xc8, \n\t0x7e, 0xad, 0x2a, 0x30, 0xa6, 0x65, 0xc7, 0xd8, 0xdc, 0xb0, 0x06, 0x69, \n\t0x8e, 0x90, 0x70, 0x72, 0x84, 0x9c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x62, \n\t0xff, 0xed, 0x03, 0xe9, 0x04, 0x4c, 0x02, 0x06, 0x01, 0x8f, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x31, 0xfe, 0x4b, 0x05, 0xbb, 0x05, 0xb0, 0x02, 0x26, \n\t0x01, 0xc7, 0x00, 0x00, 0x00, 0x07, 0x03, 0x9b, 0x04, 0x49, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x1a, 0xfe, 0x4b, 0x04, 0xc0, 0x04, 0x3a, 0x02, 0x26, \n\t0x01, 0xe7, 0x00, 0x00, 0x00, 0x07, 0x03, 0x9b, 0x03, 0x4e, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x14, 0xfe, 0x85, 0x05, 0x1a, 0x05, 0xb0, 0x02, 0x26, \n\t0x00, 0x24, 0x00, 0x00, 0x00, 0x07, 0x01, 0x5a, 0x01, 0x55, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x6a, 0xfe, 0x85, 0x03, 0xf3, 0x04, 0x4e, 0x02, 0x26, \n\t0x00, 0x44, 0x00, 0x00, 0x00, 0x07, 0x01, 0x5a, 0x00, 0x9c, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x06, 0x52, 0x07, 0x1e, 0x02, 0x26, \n\t0x00, 0x30, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, 0x02, 0xa6, 0x01, 0x59, \n\t0x00, 0x15, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, \n\t0x12, 0x14, 0x3e, 0x59, 0xb2, 0x0f, 0x12, 0x01, 0x5d, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x8f, 0x00, 0x00, 0x06, 0x6f, 0x05, 0xdc, 0x02, 0x26, \n\t0x00, 0x50, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, 0x02, 0xb7, 0x00, 0x17, \n\t0x00, 0x1a, 0x00, 0xb2, 0xbf, 0x27, 0x01, 0x71, 0xb6, 0xdf, 0x27, 0xef, \n\t0x27, 0xff, 0x27, 0x03, 0x71, 0xb6, 0x0f, 0x27, 0x1f, 0x27, 0x2f, 0x27, \n\t0x03, 0x72, 0x30, 0x31, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x06, 0xcf, \n\t0x07, 0x22, 0x02, 0x26, 0x00, 0x3a, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, \n\t0x01, 0xeb, 0x01, 0x5d, 0x00, 0x15, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x1a, 0x2f, 0x1b, 0xb1, 0x1a, 0x14, 0x3e, 0x59, 0xb2, 0x0f, 0x1a, 0x01, \n\t0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x2d, 0x00, 0x00, 0x05, 0xdc, \n\t0x05, 0xcb, 0x02, 0x26, 0x00, 0x5a, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, \n\t0x01, 0x6e, 0x00, 0x06, 0x00, 0x25, 0x00, 0xb2, 0xbf, 0x16, 0x01, 0x71, \n\t0xb6, 0xdf, 0x16, 0xef, 0x16, 0xff, 0x16, 0x03, 0x71, 0x40, 0x11, 0x0f, \n\t0x16, 0x1f, 0x16, 0x2f, 0x16, 0x3f, 0x16, 0x4f, 0x16, 0x5f, 0x16, 0x6f, \n\t0x16, 0x7f, 0x16, 0x08, 0x72, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x36, \n\t0x00, 0x00, 0x06, 0xcf, 0x07, 0x1e, 0x02, 0x26, 0x00, 0x3a, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x76, 0x02, 0xa5, 0x01, 0x59, 0x00, 0x15, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x16, 0x2f, 0x1b, 0xb1, 0x16, 0x14, 0x3e, 0x59, \n\t0xb2, 0x0f, 0x16, 0x01, 0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x2d, \n\t0x00, 0x00, 0x05, 0xdc, 0x05, 0xc7, 0x02, 0x26, 0x00, 0x5a, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x76, 0x02, 0x28, 0x00, 0x02, 0x00, 0x25, 0x00, 0xb2, \n\t0xbf, 0x19, 0x01, 0x71, 0xb6, 0xdf, 0x19, 0xef, 0x19, 0xff, 0x19, 0x03, \n\t0x71, 0x40, 0x11, 0x0f, 0x19, 0x1f, 0x19, 0x2f, 0x19, 0x3f, 0x19, 0x4f, \n\t0x19, 0x5f, 0x19, 0x6f, 0x19, 0x7f, 0x19, 0x08, 0x72, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x06, 0xcf, 0x07, 0x0d, 0x02, 0x26, \n\t0x00, 0x3a, 0x00, 0x00, 0x01, 0x07, 0x00, 0x6a, 0x01, 0x80, 0x01, 0x5d, \n\t0x00, 0x1d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1a, 0x2f, 0x1b, 0xb1, \n\t0x1a, 0x12, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x17, 0x2f, 0x1b, \n\t0xb1, 0x17, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x2d, \n\t0x00, 0x00, 0x05, 0xdc, 0x05, 0xb6, 0x02, 0x26, 0x00, 0x5a, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x6a, 0x01, 0x03, 0x00, 0x06, 0x00, 0x33, 0x00, 0xb2, \n\t0x7f, 0x17, 0x01, 0x72, 0xb4, 0xdf, 0x17, 0xef, 0x17, 0x02, 0x71, 0xb2, \n\t0x5f, 0x17, 0x01, 0x72, 0xb4, 0x2f, 0x17, 0x3f, 0x17, 0x02, 0x72, 0xb2, \n\t0x7f, 0x1a, 0x01, 0x72, 0xb4, 0xdf, 0x1a, 0xef, 0x1a, 0x02, 0x71, 0xb2, \n\t0x5f, 0x1a, 0x01, 0x72, 0xb4, 0x2f, 0x1a, 0x3f, 0x1a, 0x02, 0x72, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x14, 0xfe, 0xaf, 0x05, 0x1a, \n\t0x05, 0xb0, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x00, 0x07, 0x01, 0x60, \n\t0x04, 0xee, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6a, 0xfe, 0xaf, 0x03, 0xf3, \n\t0x04, 0x4e, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x00, 0x07, 0x01, 0x60, \n\t0x04, 0x52, 0x00, 0x00, 0xff, 0xff, 0x00, 0x14, 0x00, 0x00, 0x05, 0x1a, \n\t0x07, 0xc8, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5e, \n\t0x04, 0xe8, 0x01, 0x52, 0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x6a, 0xff, 0xeb, 0x03, 0xf3, 0x06, 0x86, 0x02, 0x26, \n\t0x00, 0x44, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5e, 0x04, 0x7a, 0x00, 0x10, \n\t0x00, 0x08, 0x00, 0xb2, 0x10, 0x2c, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x14, 0x00, 0x00, 0x05, 0x24, 0x07, 0xf1, 0x02, 0x26, \n\t0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x03, 0x92, 0x00, 0xb3, 0x01, 0x59, \n\t0x00, 0x18, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, \n\t0x12, 0x12, 0x3e, 0x59, 0xb2, 0xe0, 0x12, 0x01, 0x5d, 0xb0, 0x18, 0xd0, \n\t0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6a, 0xff, 0xeb, 0x04, 0xae, \n\t0x06, 0xaf, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x03, 0x92, \n\t0x3d, 0x17, 0x00, 0x13, 0x00, 0xb0, 0x32, 0x2f, 0xb2, 0x3f, 0x32, 0x01, \n\t0x5d, 0xb2, 0x30, 0x32, 0x01, 0x72, 0xb0, 0x38, 0xd0, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x14, 0x00, 0x00, 0x05, 0x1a, 0x07, 0xe0, 0x02, 0x26, \n\t0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x03, 0x93, 0x00, 0xc4, 0x01, 0x48, \n\t0x00, 0x18, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, \n\t0x10, 0x12, 0x3e, 0x59, 0xb2, 0xe0, 0x10, 0x01, 0x5d, 0xb0, 0x15, 0xd0, \n\t0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0xff, 0xa3, 0xff, 0xeb, 0x03, 0xf3, \n\t0x06, 0x9e, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x03, 0x93, \n\t0x4e, 0x06, 0x00, 0x0e, 0x00, 0xb0, 0x30, 0x2f, 0xb2, 0x3f, 0x30, 0x01, \n\t0x5d, 0xb0, 0x35, 0xd0, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x14, \n\t0x00, 0x00, 0x05, 0x1a, 0x08, 0x05, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, \n\t0x01, 0x07, 0x03, 0x94, 0x00, 0xbc, 0x01, 0x34, 0x00, 0x2f, 0x00, 0xb0, \n\t0x0e, 0x2f, 0xb4, 0xdf, 0x0e, 0xef, 0x0e, 0x02, 0x5d, 0xb4, 0x3f, 0x0e, \n\t0x4f, 0x0e, 0x02, 0x71, 0xb2, 0x0f, 0x0e, 0x01, 0x5d, 0xb4, 0x0f, 0x0e, \n\t0x1f, 0x0e, 0x02, 0x71, 0xb4, 0x6f, 0x0e, 0x7f, 0x0e, 0x02, 0x5d, 0xb2, \n\t0x3f, 0x0e, 0x01, 0x5d, 0xb0, 0x15, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x6a, 0xff, 0xeb, 0x04, 0x77, 0x06, 0xc5, 0x02, 0x26, \n\t0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x03, 0x94, 0x46, 0xf4, 0x00, 0x0e, \n\t0x00, 0xb0, 0x30, 0x2f, 0xb2, 0x3f, 0x30, 0x01, 0x5d, 0xb0, 0x35, 0xd0, \n\t0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x14, 0x00, 0x00, 0x05, 0x1a, \n\t0x08, 0x32, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x03, 0x95, \n\t0x00, 0xba, 0x01, 0x36, 0x00, 0x2f, 0x00, 0xb0, 0x0e, 0x2f, 0xb4, 0xdf, \n\t0x0e, 0xef, 0x0e, 0x02, 0x5d, 0xb4, 0x3f, 0x0e, 0x4f, 0x0e, 0x02, 0x71, \n\t0xb2, 0x0f, 0x0e, 0x01, 0x5d, 0xb4, 0x0f, 0x0e, 0x1f, 0x0e, 0x02, 0x71, \n\t0xb4, 0x6f, 0x0e, 0x7f, 0x0e, 0x02, 0x5d, 0xb2, 0x3f, 0x0e, 0x01, 0x5d, \n\t0xb0, 0x18, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6a, \n\t0xff, 0xeb, 0x03, 0xf3, 0x06, 0xf2, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, \n\t0x01, 0x06, 0x03, 0x95, 0x4a, 0xf6, 0x00, 0x0e, 0x00, 0xb0, 0x30, 0x2f, \n\t0xb2, 0x3f, 0x30, 0x01, 0x5d, 0xb0, 0x38, 0xd0, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x14, 0xfe, 0xaf, 0x05, 0x1a, 0x07, 0x48, 0x02, 0x26, \n\t0x00, 0x24, 0x00, 0x00, 0x00, 0x27, 0x01, 0x52, 0x00, 0xb9, 0x01, 0x5d, \n\t0x01, 0x07, 0x01, 0x60, 0x04, 0xee, 0x00, 0x00, 0x00, 0x10, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x12, 0x3e, 0x59, \n\t0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6a, 0xfe, 0xaf, 0x03, 0xf3, \n\t0x06, 0x06, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x00, 0x26, 0x01, 0x52, \n\t0x4e, 0x1b, 0x01, 0x07, 0x01, 0x60, 0x04, 0x52, 0x00, 0x00, 0x00, 0x1d, \n\t0x00, 0xb6, 0xd0, 0x30, 0xe0, 0x30, 0xf0, 0x30, 0x03, 0x71, 0xb4, 0x00, \n\t0x30, 0x10, 0x30, 0x02, 0x72, 0xb2, 0x60, 0x30, 0x01, 0x72, 0xb2, 0x40, \n\t0x30, 0x01, 0x72, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x14, \n\t0x00, 0x00, 0x05, 0x1a, 0x07, 0xdf, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, \n\t0x01, 0x07, 0x03, 0x96, 0x00, 0xe7, 0x01, 0x54, 0x00, 0x13, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x12, 0x3e, 0x59, \n\t0xb0, 0x1f, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6a, \n\t0xff, 0xeb, 0x03, 0xf3, 0x06, 0x9d, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, \n\t0x01, 0x06, 0x03, 0x96, 0x75, 0x12, 0x00, 0x13, 0x00, 0xb0, 0x30, 0x2f, \n\t0xb2, 0x0f, 0x30, 0x01, 0x5d, 0xb2, 0x3f, 0x30, 0x01, 0x5d, 0xb0, 0x3f, \n\t0xd0, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x14, 0x00, 0x00, 0x05, 0x1a, \n\t0x07, 0xdf, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x03, 0x90, \n\t0x00, 0xe7, 0x01, 0x54, 0x00, 0x13, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x15, 0x2f, 0x1b, 0xb1, 0x15, 0x12, 0x3e, 0x59, 0xb0, 0x0c, 0xd0, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6a, 0xff, 0xeb, 0x03, 0xf3, \n\t0x06, 0x9d, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x03, 0x90, \n\t0x75, 0x12, 0x00, 0x0e, 0x00, 0xb0, 0x35, 0x2f, 0xb2, 0x0f, 0x35, 0x01, \n\t0x5d, 0xb0, 0x2c, 0xd0, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x14, \n\t0x00, 0x00, 0x05, 0x1a, 0x08, 0x77, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, \n\t0x01, 0x07, 0x03, 0x97, 0x00, 0xf2, 0x01, 0x4d, 0x00, 0x13, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x12, 0x3e, 0x59, \n\t0xb0, 0x2c, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6a, \n\t0xff, 0xeb, 0x03, 0xf3, 0x07, 0x31, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, \n\t0x01, 0x06, 0x03, 0x97, 0x79, 0x07, 0x00, 0x18, 0x00, 0xb0, 0x30, 0x2f, \n\t0xb2, 0x0f, 0x30, 0x01, 0x5d, 0xb2, 0x3f, 0x30, 0x01, 0x5d, 0xb2, 0x70, \n\t0x30, 0x01, 0x71, 0xb0, 0x4c, 0xd0, 0x30, 0x31, 0xff, 0xff, 0x00, 0x14, \n\t0x00, 0x00, 0x05, 0x1a, 0x08, 0x25, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, \n\t0x01, 0x07, 0x03, 0x98, 0x00, 0xed, 0x01, 0x51, 0x00, 0x13, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x12, 0x3e, 0x59, \n\t0xb0, 0x1f, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6a, \n\t0xff, 0xeb, 0x03, 0xf3, 0x06, 0xe3, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, \n\t0x01, 0x06, 0x03, 0x98, 0x79, 0x0f, 0x00, 0x1d, 0x00, 0xb0, 0x30, 0x2f, \n\t0xb2, 0x1f, 0x30, 0x01, 0x72, 0xb2, 0x0f, 0x30, 0x01, 0x5d, 0xb2, 0xcf, \n\t0x30, 0x01, 0x71, 0xb2, 0x3f, 0x30, 0x01, 0x5d, 0xb0, 0x3f, 0xd0, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x14, 0xfe, 0xaf, 0x05, 0x1a, \n\t0x07, 0x4e, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x00, 0x27, 0x01, 0x54, \n\t0x00, 0xeb, 0x01, 0x9e, 0x01, 0x07, 0x01, 0x60, 0x04, 0xee, 0x00, 0x00, \n\t0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, \n\t0x10, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6a, \n\t0xfe, 0xaf, 0x03, 0xf3, 0x06, 0x0c, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, \n\t0x00, 0x26, 0x01, 0x54, 0x7f, 0x5c, 0x01, 0x07, 0x01, 0x60, 0x04, 0x52, \n\t0x00, 0x00, 0x00, 0x36, 0x00, 0xb2, 0x00, 0x30, 0x01, 0x71, 0xb2, 0xb0, \n\t0x30, 0x01, 0x71, 0xb2, 0x00, 0x30, 0x01, 0x72, 0xb2, 0x8f, 0x30, 0x01, \n\t0x71, 0xb2, 0x20, 0x30, 0x01, 0x72, 0xb4, 0xd0, 0x30, 0xe0, 0x30, 0x02, \n\t0x71, 0xb2, 0x90, 0x30, 0x01, 0x71, 0xb6, 0x60, 0x30, 0x70, 0x30, 0x80, \n\t0x30, 0x03, 0x5d, 0xb2, 0x20, 0x30, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0xb4, 0xfe, 0xb9, 0x04, 0x7a, 0x05, 0xb0, 0x02, 0x26, \n\t0x00, 0x28, 0x00, 0x00, 0x00, 0x07, 0x01, 0x60, 0x04, 0xcb, 0x00, 0x0a, \n\t0xff, 0xff, 0x00, 0x63, 0xfe, 0xaf, 0x03, 0xed, 0x04, 0x4e, 0x02, 0x26, \n\t0x00, 0x48, 0x00, 0x00, 0x00, 0x07, 0x01, 0x60, 0x04, 0x94, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x7a, 0x07, 0xc8, 0x02, 0x26, \n\t0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5e, 0x04, 0xc3, 0x01, 0x52, \n\t0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, \n\t0x0c, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, \n\t0xff, 0xeb, 0x03, 0xed, 0x06, 0x87, 0x02, 0x26, 0x00, 0x48, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x5e, 0x04, 0x7d, 0x00, 0x11, 0x00, 0x08, 0x00, 0xb2, \n\t0x10, 0x20, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, \n\t0x00, 0x00, 0x04, 0x7a, 0x07, 0x54, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x58, 0x00, 0x92, 0x01, 0x61, 0x00, 0x10, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x12, 0x3e, 0x59, \n\t0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0xff, 0xeb, 0x03, 0xed, \n\t0x06, 0x13, 0x02, 0x26, 0x00, 0x48, 0x00, 0x00, 0x01, 0x06, 0x01, 0x58, \n\t0x4c, 0x20, 0x00, 0x27, 0x00, 0xb2, 0x40, 0x23, 0x01, 0x72, 0xb2, 0x70, \n\t0x23, 0x01, 0x71, 0xb4, 0x60, 0x23, 0x70, 0x23, 0x02, 0x72, 0xb2, 0x20, \n\t0x23, 0x01, 0x72, 0x40, 0x0b, 0x90, 0x23, 0xa0, 0x23, 0xb0, 0x23, 0xc0, \n\t0x23, 0xd0, 0x23, 0x05, 0x71, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0xb4, \n\t0x00, 0x00, 0x04, 0xf7, 0x07, 0xf1, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, \n\t0x01, 0x07, 0x03, 0x92, 0x00, 0x86, 0x01, 0x59, 0x00, 0x18, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x12, 0x3e, 0x59, \n\t0xb2, 0xe0, 0x12, 0x01, 0x5d, 0xb0, 0x18, 0xd0, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x63, 0xff, 0xeb, 0x04, 0xb1, 0x06, 0xb0, 0x02, 0x26, \n\t0x00, 0x48, 0x00, 0x00, 0x01, 0x06, 0x03, 0x92, 0x40, 0x18, 0x00, 0x0e, \n\t0x00, 0xb0, 0x24, 0x2f, 0xb2, 0x3f, 0x24, 0x01, 0x5d, 0xb0, 0x2c, 0xd0, \n\t0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0xff, 0xec, 0x00, 0x00, 0x04, 0x7a, \n\t0x07, 0xe0, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x03, 0x93, \n\t0x00, 0x97, 0x01, 0x48, 0x00, 0x18, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x12, 0x3e, 0x59, 0xb2, 0xe0, 0x10, 0x01, \n\t0x5d, 0xb0, 0x15, 0xd0, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0xff, 0xa6, \n\t0xff, 0xeb, 0x03, 0xed, 0x06, 0x9f, 0x02, 0x26, 0x00, 0x48, 0x00, 0x00, \n\t0x01, 0x06, 0x03, 0x93, 0x51, 0x07, 0x00, 0x0e, 0x00, 0xb0, 0x24, 0x2f, \n\t0xb2, 0x3f, 0x24, 0x01, 0x5d, 0xb0, 0x29, 0xd0, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xc0, 0x08, 0x05, 0x02, 0x26, \n\t0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x03, 0x94, 0x00, 0x8f, 0x01, 0x34, \n\t0x00, 0x2f, 0x00, 0xb0, 0x10, 0x2f, 0xb4, 0xdf, 0x10, 0xef, 0x10, 0x02, \n\t0x5d, 0xb4, 0x3f, 0x10, 0x4f, 0x10, 0x02, 0x71, 0xb2, 0x0f, 0x10, 0x01, \n\t0x5d, 0xb4, 0x0f, 0x10, 0x1f, 0x10, 0x02, 0x71, 0xb4, 0x6f, 0x10, 0x7f, \n\t0x10, 0x02, 0x5d, 0xb2, 0x3f, 0x10, 0x01, 0x5d, 0xb0, 0x15, 0xd0, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0xff, 0xeb, 0x04, 0x7a, \n\t0x06, 0xc6, 0x02, 0x26, 0x00, 0x48, 0x00, 0x00, 0x01, 0x06, 0x03, 0x94, \n\t0x49, 0xf5, 0x00, 0x0e, 0x00, 0xb0, 0x22, 0x2f, 0xb2, 0x3f, 0x22, 0x01, \n\t0x5d, 0xb0, 0x29, 0xd0, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, \n\t0x00, 0x00, 0x04, 0x7a, 0x08, 0x32, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, \n\t0x01, 0x07, 0x03, 0x95, 0x00, 0x93, 0x01, 0x36, 0x00, 0x2f, 0x00, 0xb0, \n\t0x10, 0x2f, 0xb4, 0xdf, 0x10, 0xef, 0x10, 0x02, 0x5d, 0xb4, 0x3f, 0x10, \n\t0x4f, 0x10, 0x02, 0x71, 0xb2, 0x0f, 0x10, 0x01, 0x5d, 0xb4, 0x0f, 0x10, \n\t0x1f, 0x10, 0x02, 0x71, 0xb4, 0x6f, 0x10, 0x7f, 0x10, 0x02, 0x5d, 0xb2, \n\t0x3f, 0x10, 0x01, 0x5d, 0xb0, 0x18, 0xd0, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x63, 0xff, 0xeb, 0x03, 0xed, 0x06, 0xf3, 0x02, 0x26, \n\t0x00, 0x48, 0x00, 0x00, 0x01, 0x06, 0x03, 0x95, 0x4d, 0xf7, 0x00, 0x0e, \n\t0x00, 0xb0, 0x22, 0x2f, 0xb2, 0x3f, 0x22, 0x01, 0x5d, 0xb0, 0x2c, 0xd0, \n\t0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0xb9, 0x04, 0x7a, \n\t0x07, 0x48, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, 0x00, 0x27, 0x01, 0x52, \n\t0x00, 0x97, 0x01, 0x5d, 0x01, 0x07, 0x01, 0x60, 0x04, 0xcb, 0x00, 0x0a, \n\t0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, \n\t0x10, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, \n\t0xfe, 0xaf, 0x03, 0xed, 0x06, 0x07, 0x02, 0x26, 0x00, 0x48, 0x00, 0x00, \n\t0x00, 0x26, 0x01, 0x52, 0x51, 0x1c, 0x01, 0x07, 0x01, 0x60, 0x04, 0x94, \n\t0x00, 0x00, 0x00, 0x22, 0x00, 0x40, 0x0b, 0xb0, 0x24, 0xc0, 0x24, 0xd0, \n\t0x24, 0xe0, 0x24, 0xf0, 0x24, 0x05, 0x71, 0xb4, 0x00, 0x24, 0x10, 0x24, \n\t0x02, 0x72, 0xb2, 0x60, 0x24, 0x01, 0x72, 0xb2, 0x40, 0x24, 0x01, 0x72, \n\t0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0xbe, 0x00, 0x00, 0x02, 0x03, \n\t0x07, 0xc8, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5e, \n\t0x03, 0x70, 0x01, 0x52, 0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x01, 0xde, 0x06, 0x73, 0x02, 0x26, \n\t0x00, 0xf3, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5e, 0x03, 0x4b, 0xff, 0xfd, \n\t0x00, 0x08, 0x00, 0xb2, 0x10, 0x04, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0xb4, 0xfe, 0xb8, 0x01, 0x8e, 0x05, 0xb0, 0x02, 0x26, \n\t0x00, 0x2c, 0x00, 0x00, 0x00, 0x07, 0x01, 0x60, 0x03, 0x78, 0x00, 0x09, \n\t0xff, 0xff, 0x00, 0x95, 0xfe, 0xb9, 0x01, 0x6f, 0x06, 0x18, 0x02, 0x26, \n\t0x00, 0x4c, 0x00, 0x00, 0x00, 0x07, 0x01, 0x60, 0x03, 0x59, 0x00, 0x0a, \n\t0xff, 0xff, 0x00, 0x71, 0xfe, 0xa8, 0x05, 0x02, 0x05, 0xc5, 0x02, 0x26, \n\t0x00, 0x32, 0x00, 0x00, 0x00, 0x07, 0x01, 0x60, 0x05, 0x11, 0xff, 0xf9, \n\t0xff, 0xff, 0x00, 0x61, 0xfe, 0xa7, 0x04, 0x2a, 0x04, 0x4e, 0x02, 0x26, \n\t0x00, 0x52, 0x00, 0x00, 0x00, 0x07, 0x01, 0x60, 0x04, 0x9d, 0xff, 0xf8, \n\t0xff, 0xff, 0x00, 0x71, 0xff, 0xeb, 0x05, 0x02, 0x07, 0xdd, 0x02, 0x26, \n\t0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5e, 0x05, 0x09, 0x01, 0x67, \n\t0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1c, 0x2f, 0x1b, 0xb1, \n\t0x1c, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x61, \n\t0xff, 0xeb, 0x04, 0x2a, 0x06, 0x86, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x5e, 0x04, 0x95, 0x00, 0x10, 0x00, 0x08, 0x00, 0xb2, \n\t0x10, 0x1c, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x71, \n\t0xff, 0xeb, 0x05, 0x3d, 0x08, 0x06, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, \n\t0x01, 0x07, 0x03, 0x92, 0x00, 0xcc, 0x01, 0x6e, 0x00, 0x18, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x22, 0x2f, 0x1b, 0xb1, 0x22, 0x12, 0x3e, 0x59, \n\t0xb2, 0xe0, 0x22, 0x01, 0x5d, 0xb0, 0x28, 0xd0, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x61, 0xff, 0xeb, 0x04, 0xc9, 0x06, 0xaf, 0x02, 0x26, \n\t0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x03, 0x92, 0x58, 0x17, 0x00, 0x0e, \n\t0x00, 0xb0, 0x20, 0x2f, 0xb2, 0x3f, 0x20, 0x01, 0x5d, 0xb0, 0x28, 0xd0, \n\t0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x32, 0xff, 0xeb, 0x05, 0x02, \n\t0x07, 0xf5, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x03, 0x93, \n\t0x00, 0xdd, 0x01, 0x5d, 0x00, 0x18, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x20, 0x2f, 0x1b, 0xb1, 0x20, 0x12, 0x3e, 0x59, 0xb2, 0xe0, 0x20, 0x01, \n\t0x5d, 0xb0, 0x25, 0xd0, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0xff, 0xbe, \n\t0xff, 0xeb, 0x04, 0x2a, 0x06, 0x9e, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, \n\t0x01, 0x06, 0x03, 0x93, 0x69, 0x06, 0x00, 0x0e, 0x00, 0xb0, 0x20, 0x2f, \n\t0xb2, 0x3f, 0x20, 0x01, 0x5d, 0xb0, 0x25, 0xd0, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x71, 0xff, 0xeb, 0x05, 0x06, 0x08, 0x1a, 0x02, 0x26, \n\t0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x03, 0x94, 0x00, 0xd5, 0x01, 0x49, \n\t0x00, 0x18, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x20, 0x2f, 0x1b, 0xb1, \n\t0x20, 0x12, 0x3e, 0x59, 0xb2, 0xe0, 0x20, 0x01, 0x5d, 0xb0, 0x25, 0xd0, \n\t0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x61, 0xff, 0xeb, 0x04, 0x92, \n\t0x06, 0xc5, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x03, 0x94, \n\t0x61, 0xf4, 0x00, 0x0e, 0x00, 0xb0, 0x1e, 0x2f, 0xb2, 0x3f, 0x1e, 0x01, \n\t0x5d, 0xb0, 0x25, 0xd0, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x71, \n\t0xff, 0xeb, 0x05, 0x02, 0x08, 0x47, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, \n\t0x01, 0x07, 0x03, 0x95, 0x00, 0xd9, 0x01, 0x4b, 0x00, 0x18, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x1e, 0x2f, 0x1b, 0xb1, 0x1e, 0x12, 0x3e, 0x59, \n\t0xb2, 0xe0, 0x1e, 0x01, 0x5d, 0xb0, 0x28, 0xd0, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x61, 0xff, 0xeb, 0x04, 0x2a, 0x06, 0xf2, 0x02, 0x26, \n\t0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x03, 0x95, 0x65, 0xf6, 0x00, 0x0e, \n\t0x00, 0xb0, 0x20, 0x2f, 0xb2, 0x3f, 0x20, 0x01, 0x5d, 0xb0, 0x28, 0xd0, \n\t0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x71, 0xfe, 0xa8, 0x05, 0x02, \n\t0x07, 0x5d, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x00, 0x27, 0x01, 0x52, \n\t0x00, 0xdd, 0x01, 0x72, 0x01, 0x07, 0x01, 0x60, 0x05, 0x11, 0xff, 0xf9, \n\t0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x20, 0x2f, 0x1b, 0xb1, \n\t0x20, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x61, \n\t0xfe, 0xa7, 0x04, 0x2a, 0x06, 0x06, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, \n\t0x00, 0x26, 0x01, 0x52, 0x69, 0x1b, 0x01, 0x07, 0x01, 0x60, 0x04, 0x9d, \n\t0xff, 0xf8, 0x00, 0x1d, 0x00, 0xb6, 0xd0, 0x20, 0xe0, 0x20, 0xf0, 0x20, \n\t0x03, 0x71, 0xb4, 0x00, 0x20, 0x10, 0x20, 0x02, 0x72, 0xb2, 0x60, 0x20, \n\t0x01, 0x72, 0xb2, 0x40, 0x20, 0x01, 0x72, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x6c, 0xff, 0xeb, 0x05, 0xff, 0x07, 0x0c, 0x02, 0x26, \n\t0x01, 0x43, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, 0x01, 0xe0, 0x01, 0x47, \n\t0x00, 0x44, 0x00, 0xb2, 0x0f, 0x29, 0x01, 0x5d, 0xb2, 0xcf, 0x29, 0x01, \n\t0x5d, 0x40, 0x0b, 0xbf, 0x29, 0xcf, 0x29, 0xdf, 0x29, 0xef, 0x29, 0xff, \n\t0x29, 0x05, 0x71, 0xb2, 0x0f, 0x29, 0x01, 0x72, 0xb2, 0x5f, 0x29, 0x01, \n\t0x72, 0xb4, 0x2f, 0x29, 0x3f, 0x29, 0x02, 0x72, 0xb6, 0x7f, 0x29, 0x8f, \n\t0x29, 0x9f, 0x29, 0x03, 0x71, 0xb2, 0x6f, 0x29, 0x01, 0x5d, 0xb2, 0xf0, \n\t0x29, 0x01, 0x5d, 0xb2, 0x40, 0x29, 0x01, 0x71, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x61, 0xff, 0xeb, 0x04, 0xe8, 0x05, 0xdc, 0x02, 0x26, \n\t0x01, 0x44, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, 0x01, 0x69, 0x00, 0x17, \n\t0x00, 0x1a, 0x00, 0xb2, 0xbf, 0x29, 0x01, 0x71, 0xb6, 0xdf, 0x29, 0xef, \n\t0x29, 0xff, 0x29, 0x03, 0x71, 0xb6, 0x0f, 0x29, 0x1f, 0x29, 0x2f, 0x29, \n\t0x03, 0x72, 0x30, 0x31, 0xff, 0xff, 0x00, 0x6c, 0xff, 0xeb, 0x05, 0xff, \n\t0x07, 0x10, 0x02, 0x26, 0x01, 0x43, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, \n\t0x01, 0x26, 0x01, 0x4b, 0x00, 0x44, 0x00, 0x40, 0x0b, 0xbf, 0x26, 0xcf, \n\t0x26, 0xdf, 0x26, 0xef, 0x26, 0xff, 0x26, 0x05, 0x71, 0xb2, 0x0f, 0x26, \n\t0x01, 0x72, 0xb2, 0x5f, 0x26, 0x01, 0x72, 0xb4, 0x2f, 0x26, 0x3f, 0x26, \n\t0x02, 0x72, 0xb2, 0x6f, 0x27, 0x01, 0x5d, 0xb4, 0x7f, 0x27, 0x8f, 0x27, \n\t0x02, 0x71, 0xb2, 0x0f, 0x27, 0x01, 0x5d, 0xb2, 0xcf, 0x27, 0x01, 0x5d, \n\t0xb4, 0x30, 0x27, 0x40, 0x27, 0x02, 0x71, 0xb2, 0xf0, 0x27, 0x01, 0x5d, \n\t0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x61, 0xff, 0xeb, 0x04, 0xe8, \n\t0x05, 0xe0, 0x02, 0x26, 0x01, 0x44, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, \n\t0x00, 0xaf, 0x00, 0x1b, 0x00, 0x08, 0x00, 0xb2, 0xbf, 0x26, 0x01, 0x71, \n\t0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6c, 0xff, 0xeb, 0x05, 0xff, \n\t0x07, 0xdd, 0x02, 0x26, 0x01, 0x43, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5e, \n\t0x05, 0x0c, 0x01, 0x67, 0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x26, 0x2f, 0x1b, 0xb1, 0x26, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x61, 0xff, 0xeb, 0x04, 0xe8, 0x06, 0x86, 0x02, 0x26, \n\t0x01, 0x44, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5e, 0x04, 0x95, 0x00, 0x10, \n\t0x00, 0x08, 0x00, 0xb2, 0x10, 0x26, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x6c, 0xff, 0xeb, 0x05, 0xff, 0x07, 0x42, 0x02, 0x26, \n\t0x01, 0x43, 0x00, 0x00, 0x01, 0x07, 0x01, 0x58, 0x00, 0xdb, 0x01, 0x4f, \n\t0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x29, 0x2f, 0x1b, 0xb1, \n\t0x29, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x61, \n\t0xff, 0xeb, 0x04, 0xe8, 0x06, 0x12, 0x02, 0x26, 0x01, 0x44, 0x00, 0x00, \n\t0x01, 0x06, 0x01, 0x58, 0x64, 0x1f, 0x00, 0x22, 0x00, 0xb4, 0x60, 0x29, \n\t0x70, 0x29, 0x02, 0x72, 0x40, 0x0b, 0x90, 0x29, 0xa0, 0x29, 0xb0, 0x29, \n\t0xc0, 0x29, 0xd0, 0x29, 0x05, 0x71, 0xb2, 0x40, 0x29, 0x01, 0x72, 0xb2, \n\t0x20, 0x29, 0x01, 0x72, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6c, \n\t0xfe, 0xaf, 0x05, 0xff, 0x06, 0x75, 0x02, 0x26, 0x01, 0x43, 0x00, 0x00, \n\t0x00, 0x07, 0x01, 0x60, 0x05, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x61, \n\t0xfe, 0xa7, 0x04, 0xe8, 0x04, 0xc7, 0x02, 0x26, 0x01, 0x44, 0x00, 0x00, \n\t0x00, 0x07, 0x01, 0x60, 0x04, 0x9d, 0xff, 0xf8, 0xff, 0xff, 0x00, 0x93, \n\t0xfe, 0xa8, 0x04, 0xdc, 0x05, 0xb0, 0x02, 0x26, 0x00, 0x38, 0x00, 0x00, \n\t0x00, 0x07, 0x01, 0x60, 0x05, 0x0f, 0xff, 0xf9, 0xff, 0xff, 0x00, 0x8b, \n\t0xfe, 0xaf, 0x03, 0xfc, 0x04, 0x3a, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, \n\t0x00, 0x07, 0x01, 0x60, 0x04, 0x59, 0x00, 0x00, 0xff, 0xff, 0x00, 0x93, \n\t0xff, 0xeb, 0x04, 0xdc, 0x07, 0xc8, 0x02, 0x26, 0x00, 0x38, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x5e, 0x05, 0x08, 0x01, 0x52, 0x00, 0x10, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, 0x12, 0x3e, 0x59, \n\t0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x8b, 0xff, 0xeb, 0x03, 0xfc, \n\t0x06, 0x73, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, 0x00, 0x07, 0x01, 0x5e, \n\t0x04, 0x93, 0xff, 0xfd, 0xff, 0xff, 0x00, 0x93, 0xff, 0xeb, 0x06, 0x57, \n\t0x07, 0x1e, 0x02, 0x26, 0x01, 0x45, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, \n\t0x01, 0xdb, 0x01, 0x59, 0x00, 0x15, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x1c, 0x2f, 0x1b, 0xb1, 0x1c, 0x14, 0x3e, 0x59, 0xb2, 0x0f, 0x1c, 0x01, \n\t0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x8b, 0xff, 0xeb, 0x05, 0x6a, \n\t0x05, 0xc7, 0x02, 0x26, 0x01, 0x46, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, \n\t0x01, 0x67, 0x00, 0x02, 0x00, 0x25, 0x00, 0xb2, 0xbf, 0x21, 0x01, 0x71, \n\t0xb6, 0xdf, 0x21, 0xef, 0x21, 0xff, 0x21, 0x03, 0x71, 0x40, 0x11, 0x0f, \n\t0x21, 0x1f, 0x21, 0x2f, 0x21, 0x3f, 0x21, 0x4f, 0x21, 0x5f, 0x21, 0x6f, \n\t0x21, 0x7f, 0x21, 0x08, 0x72, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x93, \n\t0xff, 0xeb, 0x06, 0x57, 0x07, 0x22, 0x02, 0x26, 0x01, 0x45, 0x00, 0x00, \n\t0x00, 0x07, 0x00, 0x43, 0x01, 0x21, 0x01, 0x5d, 0xff, 0xff, 0x00, 0x8b, \n\t0xff, 0xeb, 0x05, 0x6a, 0x05, 0xcb, 0x02, 0x26, 0x01, 0x46, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x43, 0x00, 0xad, 0x00, 0x06, 0x00, 0x25, 0x00, 0xb2, \n\t0xbf, 0x1e, 0x01, 0x71, 0xb6, 0xdf, 0x1e, 0xef, 0x1e, 0xff, 0x1e, 0x03, \n\t0x71, 0x40, 0x11, 0x0f, 0x1e, 0x1f, 0x1e, 0x2f, 0x1e, 0x3f, 0x1e, 0x4f, \n\t0x1e, 0x5f, 0x1e, 0x6f, 0x1e, 0x7f, 0x1e, 0x08, 0x72, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x93, 0xff, 0xeb, 0x06, 0x57, 0x07, 0xc8, 0x02, 0x26, \n\t0x01, 0x45, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5e, 0x05, 0x07, 0x01, 0x52, \n\t0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1c, 0x2f, 0x1b, 0xb1, \n\t0x1c, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x8b, \n\t0xff, 0xeb, 0x05, 0x6a, 0x06, 0x73, 0x02, 0x26, 0x01, 0x46, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x5e, 0x04, 0x93, 0xff, 0xfd, 0x00, 0x08, 0x00, 0xb2, \n\t0x10, 0x1e, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x93, \n\t0xff, 0xeb, 0x06, 0x57, 0x07, 0x54, 0x02, 0x26, 0x01, 0x45, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x58, 0x00, 0xd6, 0x01, 0x61, 0x00, 0x10, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x1f, 0x2f, 0x1b, 0xb1, 0x1f, 0x12, 0x3e, 0x59, \n\t0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x8b, 0xff, 0xeb, 0x05, 0x6a, \n\t0x05, 0xfd, 0x02, 0x26, 0x01, 0x46, 0x00, 0x00, 0x01, 0x06, 0x01, 0x58, \n\t0x62, 0x0a, 0x00, 0x20, 0x00, 0xb2, 0x5f, 0x21, 0x01, 0x72, 0xb2, 0x8f, \n\t0x21, 0x01, 0x71, 0xb2, 0x3f, 0x21, 0x01, 0x72, 0xb4, 0xef, 0x21, 0xff, \n\t0x21, 0x02, 0x71, 0xb4, 0x0f, 0x21, 0x1f, 0x21, 0x02, 0x72, 0x30, 0x31, \n\t0xff, 0xff, 0x00, 0x93, 0xfe, 0xa8, 0x06, 0x57, 0x06, 0x37, 0x02, 0x26, \n\t0x01, 0x45, 0x00, 0x00, 0x00, 0x07, 0x01, 0x60, 0x05, 0x0f, 0xff, 0xf9, \n\t0xff, 0xff, 0x00, 0x8b, 0xfe, 0xaf, 0x05, 0x6a, 0x04, 0xcb, 0x02, 0x26, \n\t0x01, 0x46, 0x00, 0x00, 0x00, 0x07, 0x01, 0x60, 0x04, 0x59, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x14, 0x00, 0x00, 0x04, 0xce, 0x07, 0x21, 0x02, 0x26, \n\t0x00, 0x3c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, 0x00, 0xda, 0x01, 0x5c, \n\t0x00, 0x15, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, \n\t0x0d, 0x14, 0x3e, 0x59, 0xb2, 0x0f, 0x0d, 0x01, 0x5d, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x1a, 0xfe, 0x4b, 0x03, 0xe8, 0x05, 0xcb, 0x02, 0x26, \n\t0x00, 0x5c, 0x00, 0x00, 0x01, 0x06, 0x00, 0x43, 0x6b, 0x06, 0x00, 0x25, \n\t0x00, 0xb2, 0xbf, 0x16, 0x01, 0x71, 0xb6, 0xdf, 0x16, 0xef, 0x16, 0xff, \n\t0x16, 0x03, 0x71, 0x40, 0x11, 0x0f, 0x16, 0x1f, 0x16, 0x2f, 0x16, 0x3f, \n\t0x16, 0x4f, 0x16, 0x5f, 0x16, 0x6f, 0x16, 0x7f, 0x16, 0x08, 0x72, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x14, 0xfe, 0xb9, 0x04, 0xce, \n\t0x05, 0xb0, 0x02, 0x26, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x07, 0x01, 0x60, \n\t0x04, 0xc8, 0x00, 0x0a, 0xff, 0xff, 0x00, 0x1a, 0xfe, 0x13, 0x03, 0xe8, \n\t0x04, 0x3a, 0x02, 0x26, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x07, 0x01, 0x60, \n\t0x05, 0x24, 0xff, 0x64, 0xff, 0xff, 0x00, 0x14, 0x00, 0x00, 0x04, 0xce, \n\t0x07, 0xc7, 0x02, 0x26, 0x00, 0x3c, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5e, \n\t0x04, 0xc0, 0x01, 0x51, 0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x1a, 0xfe, 0x4b, 0x03, 0xe8, 0x06, 0x73, 0x02, 0x26, \n\t0x00, 0x5c, 0x00, 0x00, 0x00, 0x07, 0x01, 0x5e, 0x04, 0x51, 0xff, 0xfd, \n\t0xff, 0xff, 0x00, 0x14, 0x00, 0x00, 0x04, 0xce, 0x07, 0x53, 0x02, 0x26, \n\t0x00, 0x3c, 0x00, 0x00, 0x01, 0x07, 0x01, 0x58, 0x00, 0x8f, 0x01, 0x60, \n\t0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, 0xb1, \n\t0x0c, 0x12, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1a, \n\t0xfe, 0x4b, 0x03, 0xe8, 0x05, 0xfd, 0x02, 0x26, 0x00, 0x5c, 0x00, 0x00, \n\t0x01, 0x06, 0x01, 0x58, 0x20, 0x0a, 0x00, 0x20, 0x00, 0xb2, 0x5f, 0x19, \n\t0x01, 0x72, 0xb2, 0x8f, 0x19, 0x01, 0x71, 0xb2, 0x3f, 0x19, 0x01, 0x72, \n\t0xb4, 0xef, 0x19, 0xff, 0x19, 0x02, 0x71, 0xb4, 0x0f, 0x19, 0x1f, 0x19, \n\t0x02, 0x72, 0x30, 0x31, 0xff, 0xff, 0xff, 0x24, 0xff, 0xeb, 0x05, 0x02, \n\t0x06, 0x93, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x00, 0x07, 0x03, 0x6c, \n\t0xfe, 0xbc, 0x00, 0xce, 0xff, 0xff, 0x00, 0xb4, 0x02, 0x88, 0x04, 0xf2, \n\t0x03, 0x23, 0x00, 0x46, 0x03, 0x5a, 0xda, 0x00, 0x53, 0x33, 0x40, 0x00, \n\t0xff, 0xff, 0x00, 0xbd, 0x02, 0x88, 0x05, 0xf5, 0x03, 0x23, 0x00, 0x46, \n\t0x03, 0x5a, 0xb0, 0x00, 0x66, 0x66, 0x40, 0x00, 0xff, 0xff, 0x00, 0xbd, \n\t0x02, 0x88, 0x05, 0xf5, 0x03, 0x23, 0x00, 0x46, 0x03, 0x5a, 0xb0, 0x00, \n\t0x66, 0x66, 0x40, 0x00, 0xff, 0xff, 0x00, 0x05, 0xfe, 0x68, 0x03, 0xa0, \n\t0x00, 0x00, 0x00, 0x27, 0x00, 0x42, 0x00, 0x01, 0xff, 0x02, 0x01, 0x06, \n\t0x00, 0x42, 0x01, 0x00, 0x00, 0x16, 0x00, 0x40, 0x09, 0x00, 0x01, 0x10, \n\t0x01, 0x20, 0x01, 0x30, 0x01, 0x04, 0x5d, 0xb4, 0xa0, 0x01, 0xb0, 0x01, \n\t0x02, 0x5d, 0x30, 0x31, 0x00, 0x01, 0x00, 0x50, 0x03, 0xfc, 0x01, 0x51, \n\t0x06, 0x18, 0x00, 0x05, 0x00, 0x06, 0x00, 0xb0, 0x01, 0x2f, 0x30, 0x31, \n\t0x13, 0x13, 0x33, 0x03, 0x15, 0x23, 0x50, 0xa0, 0x61, 0x3c, 0xc5, 0x04, \n\t0xb4, 0x01, 0x64, 0xfe, 0x96, 0xb2, 0x00, 0x00, 0x00, 0x01, 0x00, 0x50, \n\t0x03, 0xfd, 0x01, 0x51, 0x06, 0x18, 0x00, 0x05, 0x00, 0x06, 0x00, 0xb0, \n\t0x04, 0x2f, 0x30, 0x31, 0x01, 0x03, 0x23, 0x13, 0x35, 0x33, 0x01, 0x51, \n\t0xa0, 0x61, 0x3c, 0xc5, 0x05, 0x57, 0xfe, 0xa6, 0x01, 0x57, 0xc4, 0x00, \n\t0x00, 0x01, 0x00, 0x50, 0xff, 0x01, 0x01, 0x51, 0x00, 0xf9, 0x00, 0x05, \n\t0x00, 0x06, 0x00, 0xb0, 0x04, 0x2f, 0x30, 0x31, 0x25, 0x03, 0x23, 0x13, \n\t0x35, 0x33, 0x01, 0x51, 0xa0, 0x61, 0x3c, 0xc5, 0x1a, 0xfe, 0xe7, 0x01, \n\t0x07, 0xf1, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2b, 0x03, 0xfd, 0x01, 0x2c, \n\t0x06, 0x18, 0x00, 0x47, 0x03, 0x35, 0x01, 0x7c, 0x00, 0x00, 0xc0, 0x02, \n\t0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x50, 0x03, 0xfc, 0x02, 0x9a, \n\t0x06, 0x18, 0x00, 0x26, 0x03, 0x34, 0x00, 0x00, 0x00, 0x07, 0x03, 0x34, \n\t0x01, 0x49, 0x00, 0x00, 0xff, 0xff, 0x00, 0x50, 0x03, 0xfd, 0x02, 0xa2, \n\t0x06, 0x18, 0x00, 0x26, 0x03, 0x35, 0x00, 0x00, 0x00, 0x07, 0x03, 0x35, \n\t0x01, 0x51, 0x00, 0x00, 0x00, 0x02, 0x00, 0x50, 0xff, 0x11, 0x02, 0x85, \n\t0x01, 0x18, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x09, 0x00, 0xb0, 0x05, 0x2f, \n\t0xb0, 0x0a, 0xd0, 0x30, 0x31, 0x25, 0x03, 0x23, 0x13, 0x35, 0x33, 0x05, \n\t0x03, 0x23, 0x13, 0x35, 0x33, 0x01, 0x51, 0xa0, 0x61, 0x3c, 0xc5, 0x01, \n\t0x34, 0xa0, 0x61, 0x3c, 0xc5, 0x60, 0xfe, 0xb1, 0x01, 0x45, 0xc2, 0xb8, \n\t0xfe, 0xb1, 0x01, 0x4d, 0xba, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x46, \n\t0x00, 0x00, 0x04, 0x24, 0x05, 0xb0, 0x00, 0x0b, 0x00, 0x4c, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0c, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0a, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, \n\t0x06, 0x3e, 0x59, 0xb0, 0x0a, 0x10, 0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0xd0, 0xb0, 0x05, 0xd0, \n\t0x30, 0x31, 0x01, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, \n\t0x11, 0x21, 0x04, 0x24, 0xfe, 0x71, 0xc5, 0xfe, 0x76, 0x01, 0x8a, 0xc5, \n\t0x01, 0x8f, 0x03, 0x9e, 0xfc, 0x62, 0x03, 0x9e, 0x9c, 0x01, 0x76, 0xfe, \n\t0x8a, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x57, 0xfe, 0x60, 0x04, 0x34, \n\t0x05, 0xb0, 0x00, 0x13, 0x00, 0x7e, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x0a, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x08, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x06, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x06, 0x3e, \n\t0x59, 0xb1, 0x06, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x0e, 0x10, 0xb1, 0x08, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x09, 0xd0, 0xb0, 0x10, 0xd0, 0xb0, 0x11, \n\t0xd0, 0xb0, 0x06, 0x10, 0xb0, 0x12, 0xd0, 0xb0, 0x13, 0xd0, 0x30, 0x31, \n\t0x21, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, \n\t0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x04, 0x34, 0xfe, 0x71, \n\t0xc5, 0xfe, 0x77, 0x01, 0x89, 0xfe, 0x77, 0x01, 0x89, 0xc5, 0x01, 0x8f, \n\t0xfe, 0x71, 0x01, 0x8f, 0xfe, 0x60, 0x01, 0xa0, 0x9a, 0x03, 0x04, 0x9c, \n\t0x01, 0x76, 0xfe, 0x8a, 0x9c, 0xfc, 0xfc, 0x00, 0x00, 0x01, 0x00, 0x89, \n\t0x02, 0x17, 0x02, 0x27, 0x03, 0xe1, 0x00, 0x0d, 0x00, 0x10, 0x00, 0xb0, \n\t0x03, 0x2f, 0xb0, 0x0a, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, \n\t0x30, 0x31, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x06, \n\t0x23, 0x22, 0x26, 0x35, 0x89, 0x70, 0x5e, 0x5f, 0x71, 0x70, 0x5f, 0x5f, \n\t0x70, 0x03, 0x19, 0x58, 0x70, 0x70, 0x58, 0x3c, 0x59, 0x6d, 0x6e, 0x58, \n\t0xff, 0xff, 0x00, 0xa1, 0x00, 0x00, 0x03, 0x21, 0x00, 0xca, 0x00, 0x26, \n\t0x00, 0x11, 0x00, 0x00, 0x00, 0x07, 0x00, 0x11, 0x01, 0xbb, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0xa1, 0x00, 0x00, 0x04, 0xc5, 0x00, 0xca, 0x00, 0x26, \n\t0x00, 0x11, 0x00, 0x00, 0x00, 0x27, 0x00, 0x11, 0x01, 0xbb, 0x00, 0x00, \n\t0x00, 0x07, 0x00, 0x11, 0x03, 0x5f, 0x00, 0x00, 0x00, 0x06, 0x00, 0x40, \n\t0xff, 0xeb, 0x07, 0x55, 0x05, 0xc5, 0x00, 0x19, 0x00, 0x27, 0x00, 0x35, \n\t0x00, 0x43, 0x00, 0x51, 0x00, 0x55, 0x00, 0x9e, 0x00, 0xb0, 0x52, 0x2f, \n\t0xb0, 0x54, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1d, 0x2f, 0x1b, 0xb1, \n\t0x1d, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x16, 0x2f, 0x1b, \n\t0xb1, 0x16, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, \n\t0x1b, 0xb1, 0x10, 0x06, 0x3e, 0x59, 0xb0, 0x16, 0x10, 0xb0, 0x03, 0xb0, \n\t0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x09, 0xd0, 0xb0, 0x1d, \n\t0x10, 0xb0, 0x24, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, \n\t0x16, 0x10, 0xb1, 0x2b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x32, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x10, 0x10, 0xb1, 0x39, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x32, 0x10, 0xb0, \n\t0x40, 0xd0, 0xb0, 0x24, 0x10, 0xb1, 0x47, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x1d, 0x10, 0xb1, 0x4e, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x34, \n\t0x36, 0x33, 0x32, 0x16, 0x17, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, \n\t0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, \n\t0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x06, 0x23, 0x22, \n\t0x26, 0x35, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, \n\t0x23, 0x22, 0x06, 0x15, 0x05, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, \n\t0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, \n\t0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x13, 0x27, 0x01, 0x17, \n\t0x03, 0x33, 0xa4, 0x88, 0x4a, 0x75, 0x25, 0x25, 0x75, 0x4a, 0x89, 0xa5, \n\t0xa4, 0x88, 0x4b, 0x76, 0x25, 0x25, 0x74, 0x49, 0x8a, 0xa4, 0xfd, 0x0d, \n\t0xa4, 0x88, 0x8a, 0xa4, 0xa4, 0x88, 0x89, 0xa5, 0x03, 0x85, 0x51, 0x4b, \n\t0x4a, 0x50, 0x52, 0x4a, 0x4a, 0x50, 0x01, 0xc8, 0x51, 0x4b, 0x49, 0x50, \n\t0x51, 0x4a, 0x4a, 0x50, 0xfb, 0x45, 0x51, 0x4b, 0x49, 0x51, 0x52, 0x4a, \n\t0x4a, 0x50, 0xf8, 0x6d, 0x02, 0xc7, 0x6d, 0x01, 0x65, 0x7e, 0xae, 0x3f, \n\t0x36, 0x36, 0x3f, 0xad, 0x7f, 0x4e, 0x80, 0xac, 0x3d, 0x37, 0x37, 0x3d, \n\t0xac, 0x80, 0x03, 0x81, 0x7f, 0xae, 0xad, 0x80, 0x4d, 0x7f, 0xac, 0xac, \n\t0x7f, 0xfc, 0xcc, 0x4b, 0x67, 0x67, 0x4b, 0x4e, 0x4a, 0x68, 0x68, 0x4a, \n\t0x4e, 0x4b, 0x67, 0x67, 0x4b, 0x4e, 0x4a, 0x68, 0x68, 0x4a, 0x02, 0xe6, \n\t0x4a, 0x67, 0x66, 0x4b, 0x4d, 0x4a, 0x69, 0x69, 0x4a, 0xfb, 0xd6, 0x43, \n\t0x04, 0x72, 0x43, 0x00, 0xff, 0xff, 0x00, 0x50, 0x04, 0x1f, 0x01, 0x16, \n\t0x06, 0x18, 0x02, 0x06, 0x00, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x50, \n\t0x04, 0x10, 0x02, 0x4b, 0x06, 0x18, 0x02, 0x06, 0x00, 0x05, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x6c, 0x00, 0x98, 0x02, 0x27, 0x03, 0xb5, 0x00, 0x06, \n\t0x00, 0x09, 0x00, 0xb0, 0x05, 0x2f, 0xb0, 0x01, 0x2f, 0x30, 0x31, 0x01, \n\t0x13, 0x23, 0x01, 0x35, 0x01, 0x33, 0x01, 0x28, 0xff, 0x94, 0xfe, 0xd9, \n\t0x01, 0x27, 0x94, 0x02, 0x26, 0xfe, 0x72, 0x01, 0x85, 0x13, 0x01, 0x85, \n\t0x00, 0x01, 0x00, 0x58, 0x00, 0x98, 0x02, 0x13, 0x03, 0xb5, 0x00, 0x06, \n\t0x00, 0x09, 0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x03, 0x2f, 0x30, 0x31, 0x13, \n\t0x01, 0x15, 0x01, 0x23, 0x13, 0x03, 0xec, 0x01, 0x27, 0xfe, 0xd9, 0x94, \n\t0xff, 0xff, 0x03, 0xb5, 0xfe, 0x7b, 0x13, 0xfe, 0x7b, 0x01, 0x8e, 0x01, \n\t0x8f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xab, 0x00, 0x00, 0x03, 0x8c, \n\t0x05, 0xb0, 0x00, 0x26, 0x00, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x04, \n\t0x02, 0x1b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3b, 0x00, 0x6e, 0x03, 0x6f, \n\t0x05, 0x23, 0x00, 0x03, 0x00, 0x09, 0x00, 0xb0, 0x02, 0x2f, 0xb0, 0x00, \n\t0x2f, 0x30, 0x31, 0x37, 0x27, 0x01, 0x17, 0xa8, 0x6d, 0x02, 0xc7, 0x6d, \n\t0x6e, 0x43, 0x04, 0x72, 0x43, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x47, \n\t0x02, 0x30, 0x03, 0x53, 0x05, 0xc5, 0x00, 0x0a, 0x00, 0x0f, 0x00, 0x3a, \n\t0x00, 0xb0, 0x04, 0x2f, 0xb0, 0x02, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0c, 0x3e, 0x59, 0xb0, 0x02, 0x10, 0xb0, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x02, 0x10, \n\t0xb0, 0x06, 0xd0, 0xb0, 0x01, 0x10, 0xb0, 0x0b, 0xd0, 0xb0, 0x09, 0x10, \n\t0xb0, 0x0d, 0xd0, 0xb2, 0x9b, 0x0d, 0x01, 0x5d, 0x30, 0x31, 0x01, 0x33, \n\t0x15, 0x23, 0x15, 0x23, 0x35, 0x21, 0x27, 0x01, 0x33, 0x01, 0x21, 0x11, \n\t0x27, 0x07, 0x02, 0xbe, 0x95, 0x95, 0xac, 0xfe, 0x39, 0x04, 0x01, 0xc6, \n\t0xb1, 0xfe, 0x47, 0x01, 0x0d, 0x06, 0x0d, 0x03, 0x69, 0x81, 0xb8, 0xb8, \n\t0x60, 0x02, 0x7d, 0xfd, 0xa4, 0x01, 0x79, 0x01, 0x1a, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x7a, 0x02, 0x8b, 0x02, 0xfa, 0x05, 0xba, 0x00, 0x13, \n\t0x00, 0x32, 0x00, 0xb0, 0x08, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x13, \n\t0x2f, 0x1b, 0xb1, 0x13, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb1, 0x0d, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x08, 0x10, 0xb0, \n\t0x11, 0xd0, 0x30, 0x31, 0x01, 0x17, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, \n\t0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x23, 0x11, \n\t0x01, 0x02, 0x1f, 0x24, 0x6e, 0x46, 0x7a, 0x87, 0xb4, 0x47, 0x41, 0x35, \n\t0x48, 0x13, 0xb4, 0x05, 0xab, 0x78, 0x40, 0x47, 0x97, 0x9c, 0xfe, 0x04, \n\t0x01, 0xdb, 0x66, 0x5b, 0x36, 0x2f, 0xfd, 0xc9, 0x03, 0x20, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x1c, 0x00, 0x00, 0x04, 0x77, 0x05, 0xb0, 0x02, 0x26, \n\t0x00, 0x29, 0x00, 0x00, 0x00, 0x07, 0x03, 0x82, 0xff, 0x8a, 0xfe, 0x80, \n\t0x00, 0x01, 0x00, 0x46, 0x00, 0x00, 0x04, 0x57, 0x05, 0xc5, 0x00, 0x28, \n\t0x00, 0xa5, 0x00, 0xb0, 0x27, 0x2f, 0xb0, 0x23, 0x2f, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x16, 0x2f, 0x1b, 0xb1, 0x16, 0x0c, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x06, 0x3e, 0x59, 0xb1, \n\t0x04, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x07, 0xd0, 0xb2, 0xa0, 0x27, 0x01, 0x5d, 0xb2, 0xbf, 0x27, 0x01, 0x71, \n\t0xb2, 0xdf, 0x27, 0x01, 0x5d, 0xb2, 0x0f, 0x27, 0x01, 0x71, 0xb2, 0x6f, \n\t0x27, 0x01, 0x5d, 0xb2, 0x4f, 0x27, 0x01, 0x71, 0xb2, 0x80, 0x27, 0x01, \n\t0x71, 0xb2, 0xf0, 0x27, 0x01, 0x71, 0xb0, 0x27, 0x10, 0xb1, 0x28, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0c, 0xd0, \n\t0xb0, 0x27, 0x10, 0xb0, 0x0d, 0xd0, 0xb2, 0x3f, 0x23, 0x01, 0x5d, 0xb4, \n\t0x0f, 0x23, 0x1f, 0x23, 0x02, 0x5d, 0xb0, 0x23, 0x10, 0xb1, 0x24, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0f, 0xd0, \n\t0xb0, 0x23, 0x10, 0xb0, 0x11, 0xd0, 0xb0, 0x16, 0x10, 0xb1, 0x1e, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, \n\t0x06, 0x06, 0x07, 0x21, 0x07, 0x21, 0x35, 0x33, 0x36, 0x36, 0x37, 0x23, \n\t0x35, 0x33, 0x27, 0x23, 0x35, 0x33, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, \n\t0x07, 0x07, 0x23, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x17, 0x21, 0x15, \n\t0x21, 0x17, 0x21, 0x15, 0x01, 0xb3, 0x02, 0x1e, 0x1b, 0x02, 0xdf, 0x01, \n\t0xfc, 0x30, 0x0a, 0x2d, 0x2f, 0x04, 0xaa, 0xa5, 0x06, 0x9e, 0x98, 0x05, \n\t0xe0, 0xbc, 0xc8, 0xdc, 0x04, 0x02, 0xbe, 0x7e, 0x62, 0x63, 0x74, 0x05, \n\t0x01, 0xa6, 0xfe, 0x60, 0x05, 0x01, 0x9b, 0x01, 0xb9, 0x53, 0x96, 0x36, \n\t0x9a, 0x9a, 0x0c, 0xad, 0x66, 0x9b, 0x8f, 0x9b, 0x92, 0xcc, 0xe9, 0xd1, \n\t0xac, 0x06, 0x76, 0x72, 0x95, 0x85, 0x92, 0x9b, 0x8f, 0x9b, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0xa4, 0xff, 0xeb, 0x06, 0x10, 0x05, 0xb0, 0x00, 0x23, \n\t0x00, 0x2c, 0x00, 0x7f, 0x00, 0xb0, 0x19, 0x2f, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x22, 0x2f, 0x1b, 0xb1, 0x22, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x1c, 0x2f, 0x1b, 0xb1, 0x1c, 0x0c, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x1b, 0x2f, 0x1b, 0xb1, 0x1b, 0x06, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, 0x06, 0x3e, 0x59, \n\t0xb0, 0x22, 0x10, 0xb0, 0x01, 0xd0, 0xb0, 0x22, 0x10, 0xb1, 0x13, 0x05, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0xd0, \n\t0xb0, 0x0f, 0x10, 0xb1, 0x08, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x19, 0x10, 0xb1, 0x24, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x1c, 0x10, 0xb1, 0x2c, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, \n\t0x11, 0x33, 0x15, 0x23, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, \n\t0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x11, 0x23, 0x06, 0x07, 0x06, 0x23, \n\t0x23, 0x11, 0x23, 0x11, 0x21, 0x32, 0x17, 0x16, 0x17, 0x33, 0x11, 0x01, \n\t0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x05, 0x39, 0xcd, 0xcd, \n\t0x3f, 0x34, 0x11, 0x29, 0x10, 0x1a, 0x16, 0x55, 0x2b, 0x78, 0x8e, 0x87, \n\t0x14, 0x69, 0x82, 0xe8, 0x9d, 0xc5, 0x01, 0x62, 0xe8, 0x82, 0x69, 0x14, \n\t0x87, 0xfc, 0xf5, 0x9d, 0x93, 0x93, 0x93, 0x93, 0x9d, 0x05, 0x3f, 0xfe, \n\t0xfb, 0x92, 0xfd, 0x6f, 0x4c, 0x3e, 0x08, 0x06, 0x87, 0x12, 0x17, 0x91, \n\t0x9b, 0x02, 0x91, 0x95, 0x64, 0x7b, 0xfd, 0xcc, 0x05, 0xb0, 0x7d, 0x65, \n\t0x94, 0x01, 0x05, 0xfd, 0x90, 0xa7, 0x7a, 0x7b, 0xaa, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x62, 0xfe, 0xec, 0x04, 0xba, 0x06, 0x18, 0x00, 0x27, \n\t0x00, 0x42, 0x00, 0xa1, 0xff, 0x86, 0x00, 0x06, 0x00, 0xd3, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x4f, 0xff, 0xeb, 0x03, 0xd5, 0x05, 0xc5, 0x00, 0x2a, \n\t0x00, 0x7a, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1a, 0x2f, 0x1b, 0xb1, \n\t0x1a, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, 0x1b, \n\t0xb1, 0x0c, 0x06, 0x3e, 0x59, 0xb2, 0x2a, 0x26, 0x03, 0x2b, 0xb0, 0x2a, \n\t0x10, 0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x0c, 0x10, 0xb1, 0x05, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb0, 0x0f, 0xd0, 0xb0, 0x2a, \n\t0x10, 0xb0, 0x12, 0xd0, 0xb4, 0x0f, 0x26, 0x1f, 0x26, 0x02, 0x5d, 0xb0, \n\t0x26, 0x10, 0xb1, 0x27, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x14, 0xd0, 0xb0, 0x26, 0x10, 0xb0, 0x15, 0xd0, 0xb0, \n\t0x1a, 0x10, 0xb1, 0x21, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x07, 0x06, 0x16, 0x33, 0x32, 0x36, \n\t0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x00, 0x35, 0x23, 0x35, 0x33, 0x35, \n\t0x23, 0x35, 0x33, 0x35, 0x34, 0x00, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, \n\t0x26, 0x23, 0x22, 0x06, 0x15, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x03, \n\t0x92, 0xfe, 0x1b, 0x02, 0x04, 0xab, 0x93, 0x39, 0x70, 0x34, 0x13, 0x38, \n\t0x7b, 0x3d, 0xe7, 0xfe, 0xe3, 0x92, 0x92, 0x92, 0x92, 0x01, 0x1b, 0xe7, \n\t0x3b, 0x75, 0x42, 0x13, 0x36, 0x71, 0x38, 0x92, 0xab, 0x01, 0xec, 0xfe, \n\t0x14, 0x01, 0xec, 0x01, 0xe1, 0x05, 0x8a, 0xcd, 0x11, 0x11, 0x9d, 0x0f, \n\t0x10, 0x01, 0x21, 0xd5, 0x9b, 0x88, 0x9b, 0x0f, 0xf4, 0x01, 0x23, 0x10, \n\t0x0f, 0x9f, 0x10, 0x13, 0xce, 0xac, 0x11, 0x9b, 0x88, 0x00, 0x00, 0x00, \n\t0x00, 0x04, 0x00, 0x7c, 0xff, 0xeb, 0x05, 0x83, 0x05, 0xc5, 0x00, 0x1d, \n\t0x00, 0x2b, 0x00, 0x39, 0x00, 0x3d, 0x00, 0x65, 0x00, 0xb0, 0x04, 0x2f, \n\t0xb0, 0x21, 0x2f, 0xb0, 0x3a, 0x2f, 0xb0, 0x3c, 0x2f, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0c, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x28, 0x2f, 0x1b, 0xb1, 0x28, 0x06, 0x3e, 0x59, 0xb0, \n\t0x0b, 0x10, 0xb1, 0x13, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x1a, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x28, 0x10, 0xb1, 0x2f, 0x01, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x21, 0x10, 0xb1, \n\t0x36, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, \n\t0x31, 0x01, 0x17, 0x16, 0x06, 0x23, 0x22, 0x26, 0x35, 0x35, 0x34, 0x36, \n\t0x33, 0x32, 0x16, 0x07, 0x07, 0x23, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, \n\t0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x01, 0x34, 0x36, 0x33, 0x32, \n\t0x16, 0x15, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, \n\t0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x05, \n\t0x27, 0x01, 0x17, 0x02, 0xa5, 0x02, 0x04, 0x96, 0x7e, 0x81, 0x9a, 0x99, \n\t0x80, 0x7e, 0x98, 0x04, 0x02, 0x8a, 0x46, 0x40, 0x41, 0x46, 0x47, 0x42, \n\t0x3f, 0x45, 0x01, 0x0e, 0xa4, 0x89, 0x88, 0xa5, 0xa4, 0x87, 0x8a, 0xa5, \n\t0x92, 0x51, 0x4c, 0x49, 0x50, 0x52, 0x49, 0x4a, 0x51, 0xfe, 0x04, 0x6d, \n\t0x02, 0xc7, 0x6d, 0x04, 0x20, 0x06, 0x69, 0x91, 0xac, 0x7f, 0x4d, 0x7f, \n\t0xae, 0x94, 0x67, 0x06, 0x39, 0x4e, 0x69, 0x4a, 0x4d, 0x4a, 0x67, 0x50, \n\t0x36, 0xfd, 0x45, 0x7f, 0xad, 0xad, 0x7f, 0x4e, 0x80, 0xac, 0xac, 0x80, \n\t0x4b, 0x67, 0x67, 0x4b, 0x4e, 0x4a, 0x68, 0x68, 0x4a, 0xf7, 0x43, 0x04, \n\t0x72, 0x43, 0x00, 0x00, 0x00, 0x02, 0x00, 0x6a, 0xff, 0xed, 0x03, 0x73, \n\t0x05, 0xc5, 0x00, 0x1b, 0x00, 0x27, 0x00, 0x59, 0x00, 0xb0, 0x08, 0x2f, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x0c, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x06, \n\t0x3e, 0x59, 0xb0, 0x08, 0x10, 0xb1, 0x09, 0x03, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x08, 0x10, 0xb0, 0x17, 0xd0, 0xb0, \n\t0x00, 0x10, 0xb1, 0x1b, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x10, 0x10, 0xb1, 0x20, 0x03, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x09, 0x10, 0xb0, 0x25, 0xd0, 0x30, \n\t0x31, 0x05, 0x07, 0x06, 0x26, 0x35, 0x35, 0x06, 0x06, 0x23, 0x35, 0x32, \n\t0x36, 0x37, 0x11, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x02, \n\t0x07, 0x15, 0x14, 0x16, 0x33, 0x03, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, \n\t0x15, 0x11, 0x17, 0x36, 0x36, 0x02, 0xce, 0x06, 0xc7, 0xcd, 0x31, 0x65, \n\t0x34, 0x37, 0x65, 0x2e, 0x9f, 0x8b, 0x7a, 0x9b, 0xcb, 0xaf, 0x60, 0x75, \n\t0x20, 0x2c, 0x24, 0x33, 0x32, 0x06, 0x55, 0x5a, 0x0d, 0x02, 0x04, 0xef, \n\t0xd3, 0x0c, 0x0c, 0x0c, 0xb4, 0x0d, 0x0d, 0x01, 0xd9, 0xb1, 0xca, 0xac, \n\t0x90, 0x2a, 0x9e, 0xfe, 0xae, 0x64, 0x5c, 0x91, 0x92, 0x03, 0xd1, 0x2c, \n\t0x4c, 0x4e, 0x6d, 0x6c, 0xfe, 0x9b, 0x01, 0x40, 0xcc, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0xab, 0x00, 0x00, 0x08, 0x4e, 0x05, 0xc2, 0x00, 0x22, \n\t0x00, 0x31, 0xf7, 0x00, 0x00, 0x23, 0x00, 0x7c, 0x05, 0x23, 0xff, 0xfd, \n\t0x00, 0x03, 0x00, 0x10, 0x05, 0xce, 0xff, 0x16, 0x00, 0x02, 0x00, 0x67, \n\t0x03, 0x97, 0x04, 0x60, 0x05, 0xb0, 0x00, 0x0f, 0x00, 0x17, 0x00, 0x6a, \n\t0x00, 0xb0, 0x12, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, \n\t0xb1, 0x08, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0c, 0x2f, \n\t0x1b, 0xb1, 0x0c, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x16, \n\t0x2f, 0x1b, 0xb1, 0x16, 0x0c, 0x3e, 0x59, 0xb2, 0xef, 0x12, 0x01, 0x5d, \n\t0xb2, 0x6f, 0x12, 0x01, 0x72, 0xb2, 0x9f, 0x12, 0x01, 0x72, 0xb2, 0x5f, \n\t0x12, 0x01, 0x71, 0xb2, 0x40, 0x12, 0x01, 0x5d, 0xb2, 0x80, 0x12, 0x01, \n\t0x5d, 0xb0, 0x12, 0x10, 0xb0, 0x07, 0xd0, 0xb0, 0x03, 0xd0, 0xb0, 0x0f, \n\t0xd0, 0xb0, 0x08, 0x10, 0xb0, 0x10, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, \n\t0xdc, 0x59, 0xb0, 0x14, 0xd0, 0xb0, 0x15, 0xd0, 0x30, 0x31, 0x01, 0x27, \n\t0x03, 0x23, 0x03, 0x07, 0x11, 0x23, 0x11, 0x33, 0x13, 0x33, 0x13, 0x33, \n\t0x11, 0x23, 0x01, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x21, 0x04, 0x03, \n\t0x06, 0x96, 0x33, 0x9c, 0x06, 0x5d, 0x74, 0xa1, 0x06, 0xa2, 0x6e, 0x5d, \n\t0xfd, 0xe4, 0x91, 0x5e, 0x91, 0x01, 0x80, 0x04, 0xee, 0x02, 0xfe, 0xa7, \n\t0x01, 0x67, 0x02, 0xfe, 0x9b, 0x02, 0x19, 0xfe, 0x7a, 0x01, 0x86, 0xfd, \n\t0xe7, 0x01, 0xc7, 0xfe, 0x39, 0x01, 0xc7, 0x52, 0x00, 0x02, 0x00, 0x98, \n\t0xff, 0xec, 0x04, 0x93, 0x04, 0x4e, 0x00, 0x15, 0x00, 0x1e, 0x00, 0x53, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0a, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, \n\t0x06, 0x3e, 0x59, 0xb2, 0x0e, 0x03, 0x09, 0x11, 0x12, 0x39, 0xb0, 0x0e, \n\t0x2f, 0xb0, 0x03, 0x10, 0xb0, 0x12, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, \n\t0xdc, 0x59, 0xb2, 0x70, 0x12, 0x01, 0x71, 0xb0, 0x09, 0x10, 0xb0, 0x16, \n\t0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x0e, 0x10, 0xb0, \n\t0x1a, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, 0x25, \n\t0x06, 0x06, 0x23, 0x22, 0x00, 0x35, 0x34, 0x00, 0x33, 0x32, 0x00, 0x15, \n\t0x15, 0x21, 0x11, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x01, 0x22, 0x06, \n\t0x07, 0x11, 0x21, 0x11, 0x26, 0x26, 0x04, 0x16, 0x57, 0xbc, 0x5f, 0xda, \n\t0xfe, 0xce, 0x01, 0x43, 0xc9, 0xcf, 0x01, 0x20, 0xfd, 0x00, 0x37, 0x8d, \n\t0x4d, 0x5f, 0xba, 0x57, 0xfe, 0x90, 0x4a, 0x8d, 0x3a, 0x02, 0x1c, 0x36, \n\t0x8b, 0x5e, 0x37, 0x3b, 0x01, 0x49, 0xe8, 0xe2, 0x01, 0x4f, 0xfe, 0xca, \n\t0xe7, 0x2f, 0xfe, 0xb8, 0x35, 0x39, 0x3c, 0x3e, 0x03, 0x2a, 0x41, 0x39, \n\t0xfe, 0xeb, 0x01, 0x1e, 0x34, 0x3d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6b, \n\t0xff, 0xf5, 0x06, 0x52, 0x05, 0xb2, 0x00, 0x27, 0x03, 0xae, 0x00, 0x0c, \n\t0x02, 0x86, 0x00, 0x27, 0x03, 0x46, 0x01, 0x06, 0x00, 0x00, 0x01, 0x07, \n\t0x03, 0x6d, 0x03, 0x4b, 0x00, 0x00, 0x00, 0x26, 0x00, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x0c, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x13, 0x2f, 0x1b, 0xb1, 0x13, 0x06, 0x3e, 0x59, 0xb0, \n\t0x2b, 0xd0, 0xb0, 0x13, 0x10, 0xb0, 0x37, 0xd0, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x6e, 0xff, 0xf5, 0x06, 0xe9, 0x05, 0xc0, 0x00, 0x27, \n\t0x03, 0xab, 0x00, 0x04, 0x02, 0x94, 0x00, 0x27, 0x03, 0x46, 0x01, 0xbf, \n\t0x00, 0x00, 0x01, 0x07, 0x03, 0x6d, 0x03, 0xe2, 0x00, 0x00, 0x00, 0x26, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x0c, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x38, 0x2f, 0x1b, 0xb1, 0x38, \n\t0x06, 0x3e, 0x59, 0xb0, 0x50, 0xd0, 0xb0, 0x38, 0x10, 0xb0, 0x5c, 0xd0, \n\t0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x70, 0xff, 0xf5, 0x07, 0x19, \n\t0x05, 0xaf, 0x00, 0x27, 0x03, 0xa9, 0xff, 0xfe, 0x02, 0x8e, 0x00, 0x27, \n\t0x03, 0x46, 0x01, 0xf7, 0x00, 0x00, 0x01, 0x07, 0x03, 0x6d, 0x04, 0x12, \n\t0x00, 0x00, 0x00, 0x26, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, \n\t0x1b, 0xb1, 0x01, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x2d, \n\t0x2f, 0x1b, 0xb1, 0x2d, 0x06, 0x3e, 0x59, 0xb0, 0x45, 0xd0, 0xb0, 0x2d, \n\t0x10, 0xb0, 0x51, 0xd0, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6b, \n\t0xff, 0xf5, 0x06, 0x72, 0x05, 0xaf, 0x00, 0x27, 0x03, 0xb3, 0x00, 0x0c, \n\t0x02, 0x8e, 0x00, 0x27, 0x03, 0x46, 0x01, 0x36, 0x00, 0x00, 0x01, 0x07, \n\t0x03, 0x6d, 0x03, 0x6b, 0x00, 0x00, 0x00, 0x26, 0x00, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0c, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x1a, 0x2f, 0x1b, 0xb1, 0x1a, 0x06, 0x3e, 0x59, 0xb0, \n\t0x32, 0xd0, 0xb0, 0x1a, 0x10, 0xb0, 0x3e, 0xd0, 0x30, 0x31, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x48, 0xff, 0xeb, 0x04, 0x30, 0x05, 0xed, 0x00, 0x14, \n\t0x00, 0x21, 0x00, 0x31, 0x00, 0xb0, 0x00, 0x2f, 0xb0, 0x0d, 0x2f, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x06, 0x3e, 0x59, \n\t0xb1, 0x15, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x0d, 0x10, 0xb1, 0x1c, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x04, 0x00, 0x11, 0x15, 0x14, 0x00, \n\t0x23, 0x22, 0x00, 0x35, 0x34, 0x12, 0x33, 0x32, 0x16, 0x17, 0x37, 0x26, \n\t0x26, 0x27, 0x13, 0x32, 0x36, 0x35, 0x35, 0x26, 0x26, 0x23, 0x22, 0x06, \n\t0x15, 0x14, 0x16, 0x01, 0xe7, 0x01, 0x07, 0x01, 0x42, 0xfe, 0xe0, 0xd7, \n\t0xda, 0xfe, 0xe9, 0xfa, 0xda, 0x5f, 0xa8, 0x36, 0x03, 0x16, 0xeb, 0xb0, \n\t0x92, 0x85, 0xa9, 0x24, 0xac, 0x7f, 0x88, 0x87, 0xa4, 0x05, 0xed, 0x3f, \n\t0xfe, 0x6c, 0xfe, 0xd9, 0xdc, 0xf5, 0xfe, 0xc9, 0x01, 0x18, 0xcf, 0xe9, \n\t0x01, 0x17, 0x3b, 0x34, 0x05, 0xc1, 0xec, 0x34, 0xfb, 0x3c, 0xe4, 0xae, \n\t0x81, 0x43, 0x5c, 0xc9, 0x9c, 0x84, 0xc9, 0x00, 0x00, 0x01, 0x00, 0xa8, \n\t0xff, 0x2d, 0x04, 0xf4, 0x05, 0xb0, 0x00, 0x07, 0x00, 0x28, 0x00, 0xb0, \n\t0x04, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, \n\t0x0c, 0x3e, 0x59, 0xb0, 0x04, 0x10, 0xb0, 0x01, 0xd0, 0xb0, 0x06, 0x10, \n\t0xb1, 0x02, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x05, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, 0x04, 0xf4, \n\t0xc5, 0xfd, 0x3e, 0xc5, 0x04, 0x4c, 0xd3, 0x05, 0xe8, 0xfa, 0x18, 0x06, \n\t0x83, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x46, 0xfe, 0xf3, 0x04, 0xae, \n\t0x05, 0xb0, 0x00, 0x0e, 0x00, 0x31, 0x00, 0xb0, 0x04, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0c, 0x3e, 0x59, 0xb0, \n\t0x04, 0x10, 0xb1, 0x03, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x09, 0x10, 0xb1, 0x0b, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x01, 0x17, 0x21, 0x15, \n\t0x21, 0x35, 0x01, 0x01, 0x35, 0x21, 0x15, 0x21, 0x07, 0x01, 0x03, 0x65, \n\t0xfd, 0xd2, 0x02, 0x03, 0x75, 0xfb, 0x98, 0x02, 0x62, 0xfd, 0x9e, 0x04, \n\t0x19, 0xfc, 0xd8, 0x02, 0x02, 0x30, 0x02, 0x24, 0xfd, 0x6f, 0x05, 0x9b, \n\t0x92, 0x02, 0xc9, 0x02, 0xcf, 0x93, 0x9b, 0x05, 0xfd, 0x67, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0xa8, 0x02, 0x88, 0x03, 0xeb, 0x03, 0x23, 0x00, 0x03, \n\t0x00, 0x12, 0x00, 0xb0, 0x02, 0x2f, 0xb1, 0x01, 0x03, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x35, 0x21, \n\t0x03, 0xeb, 0xfc, 0xbd, 0x03, 0x43, 0x02, 0x88, 0x9b, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x3f, 0x00, 0x00, 0x04, 0xad, 0x05, 0xb0, 0x00, 0x0b, \n\t0x00, 0x3e, 0x00, 0xb0, 0x0a, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, \n\t0x2f, 0x1b, 0xb1, 0x04, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x06, 0x3e, 0x59, 0xb0, 0x01, 0xd0, 0x40, \n\t0x09, 0x64, 0x01, 0x74, 0x01, 0x84, 0x01, 0x94, 0x01, 0x04, 0x5d, 0xb0, \n\t0x0a, 0x10, 0xb1, 0x09, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0x30, 0x31, 0x01, 0x17, 0x33, 0x37, 0x01, 0x33, 0x01, 0x23, \n\t0x03, 0x23, 0x35, 0x21, 0x02, 0x2a, 0x12, 0x06, 0x13, 0x01, 0x8f, 0xc9, \n\t0xfd, 0xdb, 0x95, 0xf8, 0xbc, 0x01, 0x48, 0x01, 0x54, 0x53, 0x53, 0x04, \n\t0x5c, 0xfa, 0x50, 0x02, 0x74, 0x9c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x68, \n\t0xff, 0xeb, 0x07, 0xbb, 0x04, 0x4e, 0x00, 0x19, 0x00, 0x27, 0x00, 0x35, \n\t0x00, 0x5b, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, \n\t0x10, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x16, 0x2f, 0x1b, \n\t0xb1, 0x16, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, \n\t0x1b, 0xb1, 0x03, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, \n\t0x2f, 0x1b, 0xb1, 0x09, 0x06, 0x3e, 0x59, 0xb1, 0x1d, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x10, 0x10, 0xb1, 0x24, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x2b, \n\t0xd0, 0xb0, 0x1d, 0x10, 0xb0, 0x32, 0xd0, 0x30, 0x31, 0x01, 0x14, 0x02, \n\t0x23, 0x22, 0x26, 0x27, 0x06, 0x06, 0x23, 0x22, 0x02, 0x35, 0x35, 0x34, \n\t0x12, 0x33, 0x32, 0x16, 0x17, 0x36, 0x36, 0x33, 0x32, 0x12, 0x15, 0x05, \n\t0x14, 0x16, 0x33, 0x32, 0x12, 0x37, 0x35, 0x26, 0x02, 0x23, 0x22, 0x06, \n\t0x15, 0x21, 0x34, 0x26, 0x23, 0x22, 0x02, 0x07, 0x15, 0x16, 0x12, 0x33, \n\t0x32, 0x36, 0x35, 0x07, 0xbb, 0xfa, 0xcd, 0xa5, 0xee, 0x50, 0x50, 0xef, \n\t0xa3, 0xce, 0xf9, 0xf8, 0xcd, 0xa4, 0xf0, 0x51, 0x4f, 0xf0, 0xa5, 0xcb, \n\t0xfa, 0xf9, 0x72, 0x83, 0x7f, 0x89, 0xd5, 0x1b, 0x1c, 0xd5, 0x8a, 0x7e, \n\t0x82, 0x05, 0xc9, 0x84, 0x7c, 0x8a, 0xd4, 0x1e, 0x1d, 0xd4, 0x89, 0x7e, \n\t0x84, 0x01, 0xfb, 0xe1, 0xfe, 0xd1, 0xd7, 0x9c, 0x9b, 0xd8, 0x01, 0x2f, \n\t0xe1, 0x42, 0xe0, 0x01, 0x31, 0xd8, 0x9b, 0x9a, 0xd9, 0xfe, 0xce, 0xdf, \n\t0x42, 0xaa, 0xcc, 0x01, 0x17, 0x6c, 0x2a, 0x6a, 0x01, 0x17, 0xcf, 0xa7, \n\t0xa7, 0xcf, 0xfe, 0xeb, 0x6c, 0x2a, 0x6e, 0xfe, 0xeb, 0xcd, 0xa9, 0x00, \n\t0x00, 0x01, 0xff, 0xbc, 0xfe, 0x4b, 0x02, 0x93, 0x06, 0x2d, 0x00, 0x1b, \n\t0x00, 0x2e, 0x00, 0xb0, 0x11, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, \n\t0x2f, 0x1b, 0xb1, 0x03, 0x08, 0x3e, 0x59, 0xb1, 0x0a, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x11, 0x10, 0xb1, 0x18, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x05, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, \n\t0x36, 0x35, 0x11, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, \n\t0x23, 0x22, 0x06, 0x15, 0x01, 0x70, 0xac, 0x99, 0x1f, 0x33, 0x1d, 0x0e, \n\t0x0e, 0x41, 0x12, 0x3b, 0x45, 0xb6, 0xa2, 0x21, 0x45, 0x2a, 0x18, 0x14, \n\t0x2c, 0x19, 0x57, 0x5b, 0x59, 0xa7, 0xb5, 0x09, 0x09, 0x96, 0x05, 0x08, \n\t0x67, 0x5a, 0x05, 0x1c, 0xad, 0xbd, 0x0b, 0x0a, 0x91, 0x05, 0x06, 0x6d, \n\t0x62, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0x01, 0x10, 0x04, 0x14, \n\t0x04, 0x00, 0x00, 0x19, 0x00, 0x33, 0x00, 0x70, 0x00, 0xb2, 0x16, 0x1d, \n\t0x03, 0x2b, 0xb0, 0x16, 0x10, 0xb1, 0x03, 0x03, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x09, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, \n\t0x1b, 0xdc, 0x59, 0xb0, 0x03, 0x10, 0xb0, 0x0c, 0xd0, 0xb0, 0x09, 0x10, \n\t0xb1, 0x10, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x19, 0xd0, 0xb0, 0x1d, 0x10, 0xb0, 0x23, 0xb0, 0x0a, 0x2b, 0x58, \n\t0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x1d, 0x10, 0xb0, 0x26, 0xd0, 0xb0, 0x23, \n\t0x10, 0xb1, 0x2a, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x1d, 0x10, 0xb1, 0x30, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x2a, 0x10, 0xb0, 0x33, 0xd0, 0x30, 0x31, \n\t0x13, 0x36, 0x36, 0x33, 0x36, 0x16, 0x17, 0x16, 0x16, 0x33, 0x32, 0x36, \n\t0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x26, 0x27, 0x26, 0x26, 0x07, 0x22, \n\t0x06, 0x07, 0x07, 0x36, 0x36, 0x33, 0x36, 0x16, 0x17, 0x16, 0x16, 0x33, \n\t0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x26, 0x27, 0x26, 0x26, \n\t0x07, 0x22, 0x06, 0x07, 0x6f, 0x2f, 0x7c, 0x41, 0x45, 0x40, 0x65, 0x56, \n\t0x42, 0x42, 0x40, 0x7c, 0x30, 0x09, 0x30, 0x7c, 0x40, 0x42, 0x42, 0x56, \n\t0x65, 0x40, 0x45, 0x41, 0x7c, 0x2f, 0x13, 0x2f, 0x7c, 0x41, 0x45, 0x40, \n\t0x65, 0x59, 0x40, 0x41, 0x40, 0x7c, 0x30, 0x09, 0x30, 0x7c, 0x40, 0x42, \n\t0x42, 0x56, 0x69, 0x3d, 0x44, 0x41, 0x7c, 0x2f, 0x03, 0x6a, 0x44, 0x4e, \n\t0x01, 0x18, 0x32, 0x2c, 0x19, 0x4d, 0x45, 0xae, 0x45, 0x4d, 0x19, 0x2c, \n\t0x32, 0x18, 0x01, 0x4e, 0x44, 0xfd, 0x44, 0x4e, 0x01, 0x18, 0x32, 0x2e, \n\t0x18, 0x4d, 0x46, 0xaf, 0x45, 0x4d, 0x19, 0x2c, 0x34, 0x17, 0x01, 0x4e, \n\t0x45, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x98, 0x00, 0xa7, 0x03, 0xda, \n\t0x04, 0xe3, 0x00, 0x13, 0x00, 0x38, 0x00, 0xb2, 0x0f, 0x0c, 0x03, 0x2b, \n\t0xb0, 0x0f, 0x10, 0xb1, 0x10, 0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x00, 0xd0, 0xb0, 0x0f, 0x10, 0xb0, 0x03, 0xd0, \n\t0xb0, 0x0c, 0x10, 0xb0, 0x04, 0xd0, 0xb0, 0x0c, 0x10, 0xb1, 0x0b, 0x03, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x07, 0xd0, \n\t0x30, 0x31, 0x01, 0x33, 0x15, 0x21, 0x07, 0x21, 0x15, 0x21, 0x07, 0x27, \n\t0x37, 0x23, 0x35, 0x21, 0x37, 0x21, 0x35, 0x21, 0x13, 0x17, 0x03, 0x19, \n\t0xc1, 0xfe, 0xe4, 0x8c, 0x01, 0xa8, 0xfd, 0xfd, 0x85, 0x57, 0x64, 0xc7, \n\t0x01, 0x22, 0x8c, 0xfe, 0x52, 0x02, 0x09, 0x93, 0x57, 0x03, 0xdb, 0xa4, \n\t0xfc, 0xa4, 0xf0, 0x3c, 0xb4, 0xa4, 0xfc, 0xa4, 0x01, 0x08, 0x3c, 0x00, \n\t0xff, 0xff, 0x00, 0x9e, 0x00, 0x07, 0x03, 0xe7, 0x04, 0x3a, 0x00, 0x27, \n\t0x03, 0x5a, 0xff, 0xfc, 0xfd, 0x7f, 0x01, 0x47, 0x00, 0x1f, 0x00, 0x57, \n\t0x00, 0xbc, 0x40, 0x00, 0x39, 0x9a, 0x00, 0x31, 0x00, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x06, 0x3e, 0x59, 0xb0, 0x09, \n\t0xd0, 0xb2, 0x0f, 0x09, 0x01, 0x5d, 0xb2, 0x2f, 0x09, 0x01, 0x71, 0xb2, \n\t0xaf, 0x09, 0x01, 0x71, 0xb2, 0xbf, 0x09, 0x01, 0x5d, 0xb2, 0x30, 0x09, \n\t0x01, 0x71, 0xb2, 0xc0, 0x09, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x9a, 0x00, 0x05, 0x03, 0xf2, 0x04, 0x3a, 0x00, 0x27, \n\t0x03, 0x5a, 0xff, 0xfc, 0xfd, 0x7d, 0x01, 0x47, 0x00, 0x21, 0x00, 0x12, \n\t0x00, 0xbc, 0x40, 0x00, 0x39, 0x9a, 0x00, 0x31, 0x00, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x06, 0x3e, 0x59, 0xb0, 0x08, \n\t0xd0, 0xb2, 0x0f, 0x08, 0x01, 0x5d, 0xb2, 0x2f, 0x08, 0x01, 0x71, 0xb2, \n\t0xaf, 0x08, 0x01, 0x71, 0xb2, 0xbf, 0x08, 0x01, 0x5d, 0xb2, 0x30, 0x08, \n\t0x01, 0x71, 0xb2, 0xc0, 0x08, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0x00, 0x02, 0x00, 0x29, 0x00, 0x00, 0x03, 0xdf, 0x05, 0xb0, 0x00, 0x05, \n\t0x00, 0x0f, 0x00, 0x29, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, \n\t0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, \n\t0x2f, 0x1b, 0xb1, 0x03, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x10, 0xb0, 0x08, \n\t0xd0, 0xb0, 0x03, 0x10, 0xb0, 0x0d, 0xd0, 0x30, 0x31, 0x01, 0x33, 0x01, \n\t0x01, 0x23, 0x01, 0x21, 0x01, 0x27, 0x23, 0x07, 0x03, 0x01, 0x17, 0x33, \n\t0x37, 0x01, 0xb7, 0x96, 0x01, 0x92, 0xfe, 0x71, 0x95, 0xfe, 0x6e, 0x02, \n\t0xed, 0xfe, 0xff, 0x11, 0x06, 0x12, 0xfa, 0x01, 0x01, 0x11, 0x06, 0x12, \n\t0x05, 0xb0, 0xfd, 0x27, 0xfd, 0x29, 0x02, 0xd7, 0x02, 0x00, 0x32, 0x32, \n\t0xfe, 0x00, 0xfe, 0x01, 0x32, 0x32, 0x00, 0x00, 0x00, 0x01, 0x00, 0x65, \n\t0xff, 0x7a, 0x01, 0x40, 0x00, 0xf3, 0x00, 0x05, 0x00, 0x1c, 0x00, 0xb0, \n\t0x04, 0x2f, 0xb2, 0x00, 0x04, 0x01, 0x5d, 0xb4, 0x40, 0x04, 0x50, 0x04, \n\t0x02, 0x5d, 0xb0, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, \n\t0x30, 0x31, 0x25, 0x07, 0x23, 0x37, 0x35, 0x33, 0x01, 0x40, 0x7a, 0x61, \n\t0x3d, 0x9e, 0x67, 0xed, 0xf6, 0x83, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1c, \n\t0x00, 0x00, 0x03, 0xd5, 0x06, 0x2d, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x73, \n\t0x00, 0xb0, 0x08, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, \n\t0xb1, 0x03, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x13, 0x2f, \n\t0x1b, 0xb1, 0x13, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1a, \n\t0x2f, 0x1b, 0xb1, 0x1a, 0x0a, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x18, 0x2f, 0x1b, 0xb1, 0x18, 0x06, 0x3e, 0x59, 0xb0, 0x03, 0x10, \n\t0xb1, 0x01, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb2, 0x2f, 0x08, 0x01, 0x5d, 0xb0, 0x08, 0x10, 0xb1, 0x0f, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x01, 0x10, 0xb0, \n\t0x15, 0xd0, 0xb0, 0x16, 0xd0, 0x30, 0x31, 0x33, 0x11, 0x23, 0x35, 0x33, \n\t0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, \n\t0x06, 0x15, 0x15, 0x33, 0x15, 0x23, 0x11, 0x21, 0x23, 0x11, 0x33, 0xc6, \n\t0xaa, 0xaa, 0xd5, 0xbd, 0x43, 0x82, 0x58, 0x22, 0x35, 0x78, 0x3f, 0x75, \n\t0x67, 0xd7, 0xd7, 0x02, 0x4a, 0xc6, 0xc6, 0x03, 0xa8, 0x92, 0x75, 0xb6, \n\t0xc8, 0x1f, 0x1e, 0xa0, 0x15, 0x1e, 0x68, 0x6c, 0x75, 0x92, 0xfc, 0x58, \n\t0x04, 0x3a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x38, 0x00, 0x00, 0x04, 0x27, \n\t0x06, 0x2d, 0x00, 0x26, 0x00, 0x49, 0x00, 0x00, 0x00, 0x07, 0x00, 0x4f, \n\t0x02, 0xc3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x38, 0x00, 0x00, 0x06, 0x98, \n\t0x06, 0x2d, 0x00, 0x26, 0x00, 0x49, 0x00, 0x00, 0x00, 0x07, 0x03, 0x64, \n\t0x02, 0xc3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x38, 0x00, 0x00, 0x06, 0xea, \n\t0x06, 0x2d, 0x00, 0x26, 0x00, 0x49, 0x00, 0x00, 0x00, 0x27, 0x00, 0x49, \n\t0x02, 0xc3, 0x00, 0x00, 0x00, 0x07, 0x00, 0x4f, 0x05, 0x86, 0x00, 0x00, \n\t0x00, 0x16, 0x00, 0x5b, 0xfe, 0x72, 0x07, 0xee, 0x05, 0xae, 0x00, 0x0d, \n\t0x00, 0x1c, 0x00, 0x2a, 0x00, 0x3b, 0x00, 0x41, 0x00, 0x47, 0x00, 0x4d, \n\t0x00, 0x53, 0x00, 0x5d, 0x00, 0x61, 0x00, 0x65, 0x00, 0x69, 0x00, 0x6d, \n\t0x00, 0x71, 0x00, 0x75, 0x00, 0x7e, 0x00, 0x82, 0x00, 0x86, 0x00, 0x8a, \n\t0x00, 0x8e, 0x00, 0x92, 0x00, 0x96, 0x02, 0x16, 0x00, 0xb0, 0x3c, 0x2f, \n\t0xb0, 0x48, 0x2f, 0xb0, 0x84, 0x2f, 0xb0, 0x80, 0x2f, 0xb0, 0x88, 0x2f, \n\t0xb0, 0x03, 0x2f, 0xb0, 0x0e, 0x2f, 0xb0, 0x30, 0x2f, 0xb0, 0x76, 0x2f, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x49, 0x2f, 0x1b, 0xb1, 0x49, 0x0c, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x67, 0x2f, 0x1b, 0xb1, 0x67, 0x0c, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x63, 0x2f, 0x1b, 0xb1, 0x63, \n\t0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x5f, 0x2f, 0x1b, 0xb1, \n\t0x5f, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x4f, 0x2f, 0x1b, \n\t0xb1, 0x4f, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, \n\t0x1b, 0xb1, 0x0a, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, \n\t0x2f, 0x1b, 0xb1, 0x0f, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x2b, 0x2f, 0x1b, 0xb1, 0x2b, 0x10, 0x3e, 0x59, 0xb2, 0x40, 0x03, 0x01, \n\t0x5d, 0xb2, 0x40, 0x03, 0x01, 0x71, 0xb2, 0xc0, 0x03, 0x01, 0x5d, 0xb2, \n\t0x40, 0x0e, 0x01, 0x71, 0xb2, 0xc0, 0x0e, 0x01, 0x5d, 0xb2, 0x40, 0x0e, \n\t0x01, 0x5d, 0xb2, 0x7f, 0x76, 0x01, 0x72, 0xb2, 0x3f, 0x76, 0x01, 0x5d, \n\t0xb6, 0x5f, 0x76, 0x6f, 0x76, 0x7f, 0x76, 0x03, 0x5d, 0xb2, 0x5f, 0x76, \n\t0x01, 0x71, 0xb4, 0xdf, 0x76, 0xef, 0x76, 0x02, 0x5d, 0xb2, 0x4f, 0x76, \n\t0x01, 0x72, 0xb4, 0xef, 0x76, 0xff, 0x76, 0x02, 0x72, 0xb2, 0x2f, 0x76, \n\t0x01, 0x71, 0xb2, 0xcf, 0x76, 0x01, 0x71, 0xb0, 0x76, 0x10, 0xb0, 0x54, \n\t0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb4, 0x10, 0x54, 0x20, \n\t0x54, 0x02, 0x72, 0xb2, 0x16, 0x54, 0x76, 0x11, 0x12, 0x39, 0xb0, 0x0a, \n\t0x10, 0xb0, 0x20, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb2, \n\t0x10, 0x20, 0x01, 0x72, 0xb0, 0x03, 0x10, 0xb0, 0x27, 0xb0, 0x0a, 0x2b, \n\t0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb2, 0x1f, 0x27, 0x01, 0x72, 0xb2, 0xc0, \n\t0x30, 0x01, 0x5d, 0xb2, 0x40, 0x30, 0x01, 0x71, 0xb2, 0x40, 0x30, 0x01, \n\t0x5d, 0xb0, 0x30, 0x10, 0xb0, 0x38, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, \n\t0xdc, 0x59, 0xb0, 0x88, 0x10, 0xb0, 0x3d, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, \n\t0x1b, 0xdc, 0x59, 0xb0, 0x3c, 0x10, 0xb0, 0x3f, 0xb0, 0x0a, 0x2b, 0x58, \n\t0xd8, 0x1b, 0xdc, 0x59, 0xb2, 0x2f, 0x3f, 0x01, 0x71, 0xb2, 0x4f, 0x3f, \n\t0x01, 0x72, 0xb0, 0x3c, 0x10, 0xb0, 0x72, 0xd0, 0xb0, 0x6e, 0xd0, 0xb0, \n\t0x6a, 0xd0, 0xb0, 0x42, 0xd0, 0xb0, 0x3f, 0x10, 0xb0, 0x73, 0xd0, 0xb0, \n\t0x6f, 0xd0, 0xb0, 0x6b, 0xd0, 0xb0, 0x43, 0xd0, 0xb0, 0x3d, 0x10, 0xb0, \n\t0x45, 0xd0, 0xb0, 0x49, 0x10, 0xb0, 0x4c, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, \n\t0x1b, 0xdc, 0x59, 0xb0, 0x66, 0xd0, 0xb0, 0x62, 0xd0, 0xb0, 0x5e, 0xd0, \n\t0xb0, 0x4e, 0xd0, 0xb0, 0x48, 0x10, 0xb0, 0x52, 0xd0, 0xb0, 0x0e, 0x10, \n\t0xb0, 0x55, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb2, 0x00, \n\t0x55, 0x01, 0x72, 0xb0, 0x0f, 0x10, 0xb0, 0x7e, 0xb0, 0x0a, 0x2b, 0x58, \n\t0xd8, 0x1b, 0xdc, 0x59, 0x40, 0x09, 0xcf, 0x7e, 0xdf, 0x7e, 0xef, 0x7e, \n\t0xff, 0x7e, 0x04, 0x71, 0xb2, 0x0f, 0x7e, 0x01, 0x72, 0xb0, 0x84, 0x10, \n\t0xb0, 0x81, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x48, \n\t0x10, 0xb0, 0x85, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, \n\t0x80, 0x10, 0xb0, 0x89, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, \n\t0xb0, 0x80, 0x10, 0xb0, 0x8c, 0xd0, 0xb0, 0x81, 0x10, 0xb0, 0x8d, 0xd0, \n\t0xb0, 0x84, 0x10, 0xb0, 0x90, 0xd0, 0xb0, 0x85, 0x10, 0xb0, 0x91, 0xd0, \n\t0xb0, 0x88, 0x10, 0xb0, 0x94, 0xd0, 0xb0, 0x89, 0x10, 0xb0, 0x95, 0xd0, \n\t0x30, 0x31, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x35, 0x34, 0x36, \n\t0x33, 0x32, 0x16, 0x15, 0x13, 0x11, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, \n\t0x07, 0x16, 0x16, 0x15, 0x14, 0x06, 0x23, 0x01, 0x34, 0x26, 0x23, 0x22, \n\t0x06, 0x15, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x01, 0x33, 0x11, \n\t0x14, 0x06, 0x23, 0x22, 0x26, 0x37, 0x37, 0x33, 0x14, 0x16, 0x33, 0x32, \n\t0x36, 0x35, 0x01, 0x11, 0x33, 0x15, 0x33, 0x15, 0x21, 0x35, 0x33, 0x35, \n\t0x33, 0x11, 0x01, 0x11, 0x21, 0x15, 0x23, 0x15, 0x25, 0x35, 0x21, 0x11, \n\t0x23, 0x35, 0x01, 0x15, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x23, \n\t0x13, 0x35, 0x21, 0x15, 0x21, 0x35, 0x21, 0x15, 0x21, 0x35, 0x21, 0x15, \n\t0x01, 0x35, 0x21, 0x15, 0x21, 0x35, 0x21, 0x15, 0x21, 0x35, 0x21, 0x15, \n\t0x13, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x01, 0x23, 0x35, \n\t0x33, 0x35, 0x23, 0x35, 0x33, 0x11, 0x23, 0x35, 0x33, 0x25, 0x23, 0x35, \n\t0x33, 0x35, 0x23, 0x35, 0x33, 0x11, 0x23, 0x35, 0x33, 0x03, 0x39, 0x80, \n\t0x65, 0x68, 0x80, 0x80, 0x66, 0x66, 0x81, 0x43, 0xbc, 0x65, 0x6f, 0x2c, \n\t0x28, 0x30, 0x36, 0x69, 0x5c, 0xfe, 0x84, 0x4b, 0x40, 0x40, 0x4a, 0x4a, \n\t0x42, 0x3f, 0x4a, 0x03, 0xba, 0x5c, 0x6a, 0x51, 0x5b, 0x69, 0x06, 0x02, \n\t0x54, 0x36, 0x32, 0x28, 0x37, 0xf9, 0xc4, 0x71, 0xc4, 0x05, 0x28, 0xc7, \n\t0x6f, 0xf8, 0x6d, 0x01, 0x35, 0xc4, 0x05, 0xec, 0x01, 0x36, 0x6f, 0xfc, \n\t0x5c, 0x7e, 0x32, 0x35, 0x33, 0x2f, 0x05, 0xd0, 0x01, 0x16, 0xfd, 0x5b, \n\t0x01, 0x15, 0xfd, 0x5c, 0x01, 0x14, 0x02, 0x0a, 0x01, 0x16, 0xfd, 0x5b, \n\t0x01, 0x15, 0xfd, 0x5c, 0x01, 0x14, 0xbc, 0x5d, 0x3a, 0x3c, 0x39, 0x3d, \n\t0x5d, 0xfc, 0xf1, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x07, 0x22, 0x6f, \n\t0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x01, 0xd4, 0x62, 0x79, 0x79, 0x62, 0x70, \n\t0x60, 0x7b, 0x7b, 0x60, 0xfe, 0xb8, 0x02, 0x25, 0x4b, 0x4b, 0x27, 0x3e, \n\t0x0f, 0x0d, 0x46, 0x2d, 0x4c, 0x4f, 0x01, 0x48, 0x44, 0x4f, 0x4f, 0x44, \n\t0x70, 0x45, 0x4e, 0x4e, 0x45, 0x01, 0x4f, 0xfe, 0x86, 0x4f, 0x5c, 0x51, \n\t0x4d, 0x06, 0x2e, 0x2d, 0x36, 0x2c, 0xfc, 0xc9, 0x01, 0x3b, 0xca, 0x71, \n\t0x71, 0xca, 0xfe, 0xc5, 0x06, 0x1f, 0x01, 0x1d, 0x74, 0xa9, 0xa9, 0x74, \n\t0xfe, 0xe3, 0xa9, 0xfc, 0xb6, 0xa9, 0x2b, 0x28, 0x26, 0x2e, 0x02, 0x03, \n\t0x4a, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0xf9, 0x38, 0x71, 0x71, 0x71, \n\t0x71, 0x71, 0x71, 0x03, 0xc4, 0x28, 0x28, 0x27, 0x20, 0xfe, 0xd3, 0xfc, \n\t0x7e, 0xfa, 0xfc, 0x15, 0xf9, 0x7e, 0xfc, 0x7e, 0xfa, 0xfc, 0x15, 0xf9, \n\t0x00, 0x05, 0x00, 0x5c, 0xfd, 0xd5, 0x07, 0xd7, 0x08, 0x62, 0x00, 0x03, \n\t0x00, 0x1e, 0x00, 0x22, 0x00, 0x26, 0x00, 0x2a, 0x00, 0x00, 0x09, 0x03, \n\t0x05, 0x34, 0x36, 0x37, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, \n\t0x17, 0x17, 0x33, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, \n\t0x06, 0x06, 0x15, 0x17, 0x23, 0x15, 0x33, 0x03, 0x33, 0x15, 0x23, 0x03, \n\t0x33, 0x15, 0x23, 0x04, 0x18, 0x03, 0xbf, 0xfc, 0x41, 0xfc, 0x44, 0x04, \n\t0x0f, 0x1a, 0x28, 0x48, 0x5e, 0xa9, 0x93, 0x88, 0xa7, 0x03, 0x03, 0xc2, \n\t0x01, 0x3b, 0x2b, 0x36, 0x3b, 0x33, 0x2a, 0x4f, 0x3b, 0xca, 0xca, 0xca, \n\t0x4b, 0x04, 0x04, 0x02, 0x04, 0x04, 0x06, 0x52, 0xfc, 0x31, 0xfc, 0x31, \n\t0x03, 0xcf, 0xf1, 0x35, 0x3d, 0x1a, 0x27, 0x83, 0x4e, 0x80, 0x97, 0x82, \n\t0x82, 0x06, 0x33, 0x34, 0x3f, 0x35, 0x32, 0x4d, 0x1c, 0x37, 0x5a, 0x58, \n\t0x5b, 0xaa, 0xfd, 0x4c, 0x04, 0x0a, 0x8d, 0x04, 0xff, 0xff, 0xff, 0x99, \n\t0x00, 0x00, 0x02, 0x6a, 0x05, 0xb7, 0x02, 0x26, 0x03, 0x87, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x71, 0xff, 0x1e, 0x00, 0x07, 0x00, 0x08, 0x00, 0xb2, \n\t0x1f, 0x04, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, 0x00, 0x02, 0x00, 0x68, \n\t0x04, 0x6f, 0x02, 0xcc, 0x05, 0xc5, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x13, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0c, \n\t0x3e, 0x59, 0xb0, 0x01, 0xd0, 0x30, 0x31, 0x01, 0x13, 0x33, 0x15, 0x03, \n\t0x23, 0x25, 0x37, 0x33, 0x07, 0x15, 0x23, 0x01, 0x95, 0x66, 0xd1, 0xe5, \n\t0x52, 0xfe, 0xd3, 0xa2, 0x6c, 0x52, 0xbc, 0x04, 0x8c, 0x01, 0x39, 0x15, \n\t0xfe, 0xc1, 0x8d, 0xc6, 0xcc, 0x89, 0x00, 0x00, 0x00, 0x03, 0x00, 0x70, \n\t0xff, 0xf5, 0x03, 0x07, 0x03, 0x2c, 0x00, 0x17, 0x00, 0x23, 0x00, 0x2f, \n\t0x00, 0x51, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x15, 0x2f, 0x1b, 0xb1, \n\t0x15, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, \n\t0xb1, 0x09, 0x06, 0x3e, 0x59, 0xb2, 0x2d, 0x09, 0x15, 0x11, 0x12, 0x39, \n\t0xb0, 0x2d, 0x2f, 0xb1, 0x1b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x09, 0x10, 0xb1, 0x21, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x15, 0x10, 0xb1, 0x27, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, \n\t0x14, 0x06, 0x07, 0x16, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, \n\t0x34, 0x36, 0x37, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x03, \n\t0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x03, \n\t0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x02, \n\t0xef, 0x49, 0x3e, 0x49, 0x56, 0xb9, 0x8c, 0x92, 0xc0, 0x59, 0x4c, 0x42, \n\t0x4a, 0xb1, 0x87, 0x82, 0xac, 0x92, 0x5c, 0x40, 0x46, 0x60, 0x5f, 0x48, \n\t0x41, 0x5a, 0x1a, 0x4b, 0x37, 0x3d, 0x4f, 0x51, 0x3c, 0x35, 0x4c, 0x02, \n\t0x50, 0x3b, 0x5b, 0x1b, 0x1c, 0x63, 0x3f, 0x70, 0x7c, 0x7c, 0x70, 0x3f, \n\t0x64, 0x1c, 0x1b, 0x5a, 0x3b, 0x69, 0x73, 0x73, 0xfe, 0x2f, 0x33, 0x43, \n\t0x42, 0x34, 0x34, 0x3d, 0x3d, 0x01, 0x93, 0x2d, 0x35, 0x34, 0x2e, 0x2e, \n\t0x39, 0x39, 0x00, 0x00, 0x00, 0x02, 0x00, 0x68, 0xff, 0xf5, 0x02, 0xec, \n\t0x03, 0x2c, 0x00, 0x1a, 0x00, 0x27, 0x00, 0x53, 0x00, 0xb0, 0x07, 0x2f, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x10, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x14, 0x2f, 0x1b, 0xb1, 0x14, 0x06, \n\t0x3e, 0x59, 0xb1, 0x00, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb6, 0x0f, 0x07, 0x1f, 0x07, 0x2f, 0x07, 0x03, 0x5d, 0xb0, \n\t0x07, 0x10, 0xb1, 0x1b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x0d, 0x10, 0xb1, 0x22, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x25, 0x32, 0x36, 0x35, 0x35, \n\t0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, \n\t0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x13, 0x32, \n\t0x36, 0x37, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x01, \n\t0x97, 0x48, 0x60, 0x1f, 0x54, 0x2f, 0x91, 0xa4, 0xb4, 0x8f, 0x8a, 0xb7, \n\t0xc3, 0x92, 0x33, 0x6e, 0x32, 0x1c, 0x2b, 0x54, 0x48, 0x3c, 0x4f, 0x0d, \n\t0x58, 0x42, 0x42, 0x50, 0x4b, 0x77, 0x54, 0x43, 0x49, 0x21, 0x22, 0x91, \n\t0x7a, 0x72, 0x9b, 0xac, 0x86, 0xeb, 0x7d, 0x9d, 0x12, 0x10, 0x7f, 0x11, \n\t0x0e, 0x01, 0x17, 0x31, 0x23, 0x18, 0x4c, 0x63, 0x53, 0x37, 0x42, 0x4f, \n\t0x00, 0x02, 0x00, 0x78, 0xff, 0xef, 0x03, 0xd7, 0x04, 0x9d, 0x00, 0x1a, \n\t0x00, 0x27, 0x00, 0x4d, 0x00, 0xb0, 0x0e, 0x2f, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x14, 0x2f, 0x1b, 0xb1, 0x14, 0x06, 0x3e, 0x59, 0xb0, 0x00, \n\t0x10, 0xb1, 0x07, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x0e, 0x10, 0xb1, 0x1b, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x14, 0x10, 0xb1, 0x22, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x32, 0x16, \n\t0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x15, 0x36, 0x36, 0x33, \n\t0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x11, 0x34, 0x24, \n\t0x13, 0x22, 0x06, 0x07, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, \n\t0x26, 0x02, 0x4f, 0x42, 0x93, 0x43, 0x21, 0x3a, 0x72, 0x49, 0x79, 0x9b, \n\t0x32, 0x8f, 0x58, 0xb9, 0xc8, 0xef, 0xbf, 0xba, 0xf7, 0x01, 0x11, 0xa1, \n\t0x58, 0x7a, 0x1b, 0x86, 0x66, 0x69, 0x80, 0x72, 0x04, 0x9d, 0x1c, 0x17, \n\t0x94, 0x18, 0x16, 0xa3, 0x7d, 0x6a, 0x34, 0x3a, 0xc6, 0xb3, 0xab, 0xd5, \n\t0xf8, 0xc4, 0x01, 0x37, 0xc3, 0xf8, 0xfd, 0xb1, 0x40, 0x36, 0x2d, 0x7d, \n\t0xa7, 0x86, 0x62, 0x68, 0x77, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x47, \n\t0x00, 0x00, 0x04, 0x15, 0x04, 0x8d, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x4b, \n\t0x00, 0xb0, 0x02, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, \n\t0xb1, 0x09, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, \n\t0x1b, 0xb1, 0x04, 0x06, 0x3e, 0x59, 0xb0, 0x02, 0x10, 0xb1, 0x01, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x02, 0x10, \n\t0xb0, 0x06, 0xd0, 0xb0, 0x01, 0x10, 0xb0, 0x0b, 0xd0, 0xb0, 0x09, 0x10, \n\t0xb0, 0x0d, 0xd0, 0xb2, 0x7b, 0x0d, 0x01, 0x5d, 0xb2, 0x5b, 0x0d, 0x01, \n\t0x5d, 0x30, 0x31, 0x01, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x21, 0x27, \n\t0x01, 0x33, 0x03, 0x11, 0x27, 0x01, 0x03, 0x52, 0xc3, 0xc3, 0xc5, 0xfd, \n\t0xbe, 0x04, 0x02, 0x3f, 0xcc, 0xc5, 0x06, 0xfe, 0x99, 0x01, 0x85, 0x9a, \n\t0xeb, 0xeb, 0x7a, 0x03, 0x28, 0xfc, 0xf8, 0x01, 0xfb, 0x02, 0xfe, 0x03, \n\t0x00, 0x01, 0x00, 0x5a, 0xff, 0xef, 0x03, 0xa3, 0x04, 0x9d, 0x00, 0x2a, \n\t0x00, 0x85, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, \n\t0x0e, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1a, 0x2f, 0x1b, \n\t0xb1, 0x1a, 0x06, 0x3e, 0x59, 0xb0, 0x0e, 0x10, 0xb1, 0x06, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0e, 0x10, 0xb0, \n\t0x09, 0xd0, 0xb0, 0x1a, 0x10, 0xb1, 0x22, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x2a, 0x06, 0x22, 0x11, 0x12, 0x39, \n\t0xb0, 0x2a, 0x2f, 0xb4, 0xdf, 0x2a, 0xef, 0x2a, 0x02, 0x5d, 0xb4, 0x1f, \n\t0x2a, 0x2f, 0x2a, 0x02, 0x5d, 0xb2, 0xaf, 0x2a, 0x01, 0x5d, 0xb4, 0x9f, \n\t0x2a, 0xaf, 0x2a, 0x02, 0x71, 0xb4, 0x6f, 0x2a, 0x7f, 0x2a, 0x02, 0x72, \n\t0xb1, 0x29, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb2, 0x14, 0x29, 0x2a, 0x11, 0x12, 0x39, 0xb0, 0x1a, 0x10, 0xb0, 0x1f, \n\t0xd0, 0x30, 0x31, 0x01, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, \n\t0x15, 0x23, 0x27, 0x26, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, \n\t0x16, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x37, 0x37, 0x33, 0x14, \n\t0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x02, 0x00, \n\t0x68, 0x63, 0x6e, 0x6a, 0x54, 0x72, 0xbb, 0x02, 0x06, 0xe2, 0xa7, 0xc0, \n\t0xdd, 0x60, 0x54, 0x60, 0x67, 0xf0, 0xc0, 0xa8, 0xf1, 0x05, 0x02, 0xba, \n\t0x79, 0x5f, 0x6c, 0x7e, 0x6f, 0x6e, 0xa8, 0x02, 0x9d, 0x5f, 0x54, 0x4c, \n\t0x68, 0x60, 0x47, 0x06, 0x8c, 0xae, 0xac, 0xa0, 0x50, 0x85, 0x26, 0x23, \n\t0x8a, 0x63, 0xa1, 0xb6, 0xab, 0xa2, 0x06, 0x4d, 0x6e, 0x6d, 0x52, 0x62, \n\t0x5f, 0x96, 0x00, 0x00, 0x00, 0x01, 0x00, 0x59, 0x00, 0x00, 0x03, 0x73, \n\t0x04, 0x9d, 0x00, 0x1a, 0x00, 0x4e, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x06, 0x3e, 0x59, 0xb1, 0x19, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x02, 0xd0, \n\t0xb2, 0x03, 0x00, 0x11, 0x11, 0x12, 0x39, 0xb0, 0x11, 0x10, 0xb1, 0x09, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x11, \n\t0x10, 0xb0, 0x0c, 0xd0, 0xb0, 0x03, 0x10, 0xb0, 0x17, 0xd0, 0x30, 0x31, \n\t0x21, 0x21, 0x35, 0x01, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, \n\t0x15, 0x23, 0x27, 0x26, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, \n\t0x07, 0x17, 0x21, 0x03, 0x73, 0xfc, 0xf3, 0x01, 0x96, 0x66, 0x45, 0x5c, \n\t0x57, 0x65, 0x72, 0xbc, 0x02, 0x06, 0xe0, 0xbb, 0xaf, 0xc9, 0x75, 0x9e, \n\t0xf8, 0x03, 0x02, 0x0f, 0x98, 0x01, 0x96, 0x61, 0x72, 0x3e, 0x54, 0x71, \n\t0x73, 0x53, 0x06, 0x8f, 0xca, 0xb8, 0xa8, 0x6d, 0x99, 0xa0, 0xf9, 0x06, \n\t0x00, 0x01, 0x00, 0x4e, 0x00, 0x00, 0x01, 0xc3, 0x04, 0x9d, 0x00, 0x05, \n\t0x00, 0x36, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, \n\t0x05, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, \n\t0xb1, 0x00, 0x06, 0x3e, 0x59, 0xb0, 0x05, 0x10, 0xb0, 0x04, 0xb0, 0x0a, \n\t0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb1, 0x03, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x21, 0x23, 0x11, 0x07, \n\t0x35, 0x25, 0x01, 0xc3, 0xc5, 0xb0, 0x01, 0x75, 0x03, 0xde, 0x02, 0xa0, \n\t0x21, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x78, 0xff, 0xef, 0x03, 0xfa, \n\t0x04, 0x9d, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x3b, 0x00, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0e, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x06, 0x3e, 0x59, 0xb0, \n\t0x0a, 0x10, 0xb1, 0x11, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x18, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x14, 0x06, 0x23, 0x22, \n\t0x26, 0x35, 0x11, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x27, 0x34, 0x26, \n\t0x23, 0x22, 0x06, 0x15, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x03, \n\t0xfa, 0xf7, 0xc9, 0xca, 0xf8, 0xf7, 0xc9, 0xca, 0xf8, 0xc5, 0x88, 0x75, \n\t0x73, 0x88, 0x89, 0x74, 0x74, 0x87, 0x01, 0x9b, 0xc5, 0xe7, 0xe8, 0xc4, \n\t0x01, 0x57, 0xc3, 0xe8, 0xe8, 0xc3, 0x01, 0x7c, 0x95, 0x96, 0x7b, 0xfe, \n\t0xa8, 0x7d, 0x97, 0x96, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4e, \n\t0x00, 0x00, 0x03, 0xd8, 0x04, 0x8d, 0x00, 0x09, 0x00, 0x46, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x0e, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x06, 0x3e, \n\t0x59, 0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb2, 0x04, 0x00, 0x02, 0x11, 0x12, 0x39, 0xb0, 0x07, 0x10, 0xb1, \n\t0x05, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, \n\t0x09, 0x05, 0x07, 0x11, 0x12, 0x39, 0x30, 0x31, 0x25, 0x21, 0x15, 0x21, \n\t0x35, 0x01, 0x21, 0x35, 0x21, 0x15, 0x01, 0x3d, 0x02, 0x9b, 0xfc, 0x76, \n\t0x02, 0x81, 0xfd, 0xa1, 0x03, 0x50, 0x98, 0x98, 0x76, 0x03, 0x7e, 0x99, \n\t0x72, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1e, 0x00, 0x00, 0x04, 0x35, \n\t0x04, 0x8d, 0x00, 0x08, 0x00, 0x6f, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x06, 0x3e, 0x59, 0xb2, 0x00, \n\t0x04, 0x07, 0x11, 0x12, 0x39, 0x40, 0x09, 0x65, 0x00, 0x75, 0x00, 0x85, \n\t0x00, 0x95, 0x00, 0x04, 0x5d, 0xb0, 0x00, 0x10, 0xb0, 0x03, 0xd0, 0xb2, \n\t0x5b, 0x03, 0x01, 0x5d, 0xb6, 0x7b, 0x03, 0x8b, 0x03, 0x9b, 0x03, 0x03, \n\t0x5d, 0xb2, 0x6a, 0x03, 0x01, 0x5d, 0xb0, 0x00, 0x10, 0xb0, 0x06, 0xd0, \n\t0xb6, 0x7b, 0x06, 0x8b, 0x06, 0x9b, 0x06, 0x03, 0x5d, 0xb2, 0x5b, 0x06, \n\t0x01, 0x5d, 0xb2, 0x6a, 0x06, 0x01, 0x5d, 0x30, 0x31, 0x01, 0x01, 0x33, \n\t0x01, 0x11, 0x23, 0x11, 0x01, 0x33, 0x02, 0x29, 0x01, 0x2f, 0xdd, 0xfe, \n\t0x54, 0xc5, 0xfe, 0x5a, 0xdd, 0x02, 0x4d, 0x02, 0x40, 0xfd, 0x0d, 0xfe, \n\t0x66, 0x01, 0xa3, 0x02, 0xea, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x37, \n\t0x00, 0x00, 0x04, 0x42, 0x04, 0x8d, 0x00, 0x0b, 0x00, 0x61, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x0e, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0e, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x06, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x07, 0x2f, 0x1b, 0xb1, 0x07, \n\t0x06, 0x3e, 0x59, 0xb2, 0x00, 0x07, 0x0a, 0x11, 0x12, 0x39, 0x40, 0x0b, \n\t0x55, 0x00, 0x65, 0x00, 0x75, 0x00, 0x85, 0x00, 0x95, 0x00, 0x05, 0x5d, \n\t0xb2, 0x06, 0x07, 0x0a, 0x11, 0x12, 0x39, 0xb2, 0x5b, 0x06, 0x01, 0x5d, \n\t0xb6, 0x7a, 0x06, 0x8a, 0x06, 0x9a, 0x06, 0x03, 0x5d, 0x30, 0x31, 0x01, \n\t0x01, 0x33, 0x01, 0x01, 0x23, 0x01, 0x01, 0x23, 0x01, 0x01, 0x33, 0x02, \n\t0x3a, 0x01, 0x16, 0xe9, 0xfe, 0x78, 0x01, 0x91, 0xe6, 0xfe, 0xe1, 0xfe, \n\t0xe3, 0xe9, 0x01, 0x92, 0xfe, 0x77, 0xe8, 0x02, 0xdc, 0x01, 0xb1, 0xfd, \n\t0xbf, 0xfd, 0xb4, 0x01, 0xba, 0xfe, 0x46, 0x02, 0x4c, 0x02, 0x41, 0x00, \n\t0x00, 0x01, 0x00, 0x3f, 0x00, 0x00, 0x05, 0xc0, 0x04, 0x8d, 0x00, 0x11, \n\t0x00, 0x80, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, \n\t0x03, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, \n\t0xb1, 0x08, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, \n\t0x1b, 0xb1, 0x10, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, \n\t0x2f, 0x1b, 0xb1, 0x0a, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x06, 0x3e, 0x59, 0xb0, 0x0a, 0x10, 0xb0, \n\t0x06, 0xd0, 0xb6, 0x43, 0x06, 0x53, 0x06, 0x63, 0x06, 0x03, 0x5d, 0xb2, \n\t0x34, 0x06, 0x01, 0x5d, 0xb4, 0x71, 0x06, 0x81, 0x06, 0x02, 0x5d, 0xb2, \n\t0x90, 0x06, 0x01, 0x5d, 0xb0, 0x01, 0xd0, 0xb0, 0x03, 0x10, 0xb0, 0x0c, \n\t0xd0, 0xb4, 0x8d, 0x0c, 0x9d, 0x0c, 0x02, 0x5d, 0x40, 0x09, 0x4c, 0x0c, \n\t0x5c, 0x0c, 0x6c, 0x0c, 0x7c, 0x0c, 0x04, 0x5d, 0x30, 0x31, 0x01, 0x15, \n\t0x37, 0x13, 0x33, 0x13, 0x15, 0x37, 0x13, 0x33, 0x01, 0x23, 0x03, 0x23, \n\t0x03, 0x23, 0x01, 0x33, 0x01, 0xc7, 0x01, 0xdd, 0xb7, 0xdd, 0x01, 0xb3, \n\t0xd3, 0xfe, 0xda, 0xb6, 0xe1, 0x06, 0xe3, 0xb5, 0xfe, 0xda, 0xd3, 0x01, \n\t0x08, 0x03, 0x05, 0x03, 0x83, 0xfc, 0x7b, 0x03, 0x05, 0x03, 0x83, 0xfb, \n\t0x73, 0x03, 0x57, 0xfc, 0xa9, 0x04, 0x8d, 0x00, 0x00, 0x01, 0x00, 0x27, \n\t0x00, 0x00, 0x04, 0x83, 0x04, 0x8d, 0x00, 0x09, 0x00, 0x40, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0e, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0e, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x06, \n\t0x3e, 0x59, 0xb0, 0x02, 0xd0, 0xb4, 0x44, 0x02, 0x54, 0x02, 0x02, 0x5d, \n\t0x40, 0x09, 0x62, 0x02, 0x72, 0x02, 0x82, 0x02, 0x92, 0x02, 0x04, 0x5d, \n\t0x30, 0x31, 0x01, 0x17, 0x33, 0x37, 0x01, 0x33, 0x01, 0x23, 0x01, 0x33, \n\t0x02, 0x3b, 0x17, 0x06, 0x17, 0x01, 0x41, 0xd3, 0xfe, 0x2e, 0xb9, 0xfe, \n\t0x2f, 0xd3, 0x01, 0x29, 0x52, 0x50, 0x03, 0x66, 0xfb, 0x73, 0x04, 0x8d, \n\t0x00, 0x01, 0x00, 0x89, 0xff, 0xef, 0x04, 0x74, 0x04, 0x8d, 0x00, 0x11, \n\t0x00, 0x36, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, \n\t0x00, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, \n\t0xb1, 0x08, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, \n\t0x1b, 0xb1, 0x04, 0x06, 0x3e, 0x59, 0xb1, 0x0d, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x11, 0x14, 0x04, \n\t0x23, 0x22, 0x24, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, \n\t0x35, 0x11, 0x04, 0x74, 0xfe, 0xe9, 0xdf, 0xdd, 0xfe, 0xe8, 0xc4, 0xa9, \n\t0x88, 0x89, 0xa9, 0x04, 0x8d, 0xfd, 0x01, 0xc3, 0xdc, 0xdc, 0xc3, 0x02, \n\t0xff, 0xfd, 0x01, 0x7b, 0x8c, 0x8b, 0x7c, 0x02, 0xff, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x47, 0x00, 0x00, 0x03, 0xd1, 0x04, 0x8d, 0x00, 0x07, \n\t0x00, 0x2f, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, \n\t0x06, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, \n\t0xb1, 0x02, 0x06, 0x3e, 0x59, 0xb0, 0x06, 0x10, 0xb1, 0x00, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0xd0, 0x30, \n\t0x31, 0x01, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x03, 0xd1, 0xfe, \n\t0x9b, 0xc5, 0xfe, 0xa0, 0x03, 0x8a, 0x03, 0xf4, 0xfc, 0x0c, 0x03, 0xf4, \n\t0x99, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5d, 0xff, 0xef, 0x04, 0x11, \n\t0x04, 0x9d, 0x00, 0x27, 0x00, 0x5f, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x1d, 0x2f, 0x1b, 0xb1, 0x1d, 0x06, 0x3e, 0x59, 0xb2, 0x17, 0x1d, \n\t0x09, 0x11, 0x12, 0x39, 0xb4, 0xa9, 0x17, 0xb9, 0x17, 0x02, 0x5d, 0xb4, \n\t0x19, 0x17, 0x29, 0x17, 0x02, 0x5d, 0xb0, 0x17, 0x10, 0xb1, 0x03, 0x03, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x09, 0x10, \n\t0xb1, 0x11, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x1d, 0x10, 0xb1, 0x25, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x34, 0x26, 0x27, 0x26, 0x26, 0x35, \n\t0x34, 0x36, 0x33, 0x32, 0x16, 0x07, 0x07, 0x23, 0x34, 0x26, 0x23, 0x22, \n\t0x06, 0x15, 0x14, 0x16, 0x17, 0x16, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, \n\t0x24, 0x37, 0x37, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x03, 0x4c, 0x7c, \n\t0xa2, 0xdf, 0xcb, 0xf3, 0xce, 0xd2, 0xeb, 0x05, 0x02, 0xbb, 0x84, 0x77, \n\t0x7d, 0x7f, 0x73, 0xb2, 0xd7, 0xcc, 0xfe, 0xda, 0xca, 0xfe, 0xee, 0x06, \n\t0x01, 0xbc, 0xa3, 0x76, 0x83, 0x90, 0x01, 0x30, 0x47, 0x58, 0x28, 0x3a, \n\t0x95, 0x96, 0x93, 0xae, 0xba, 0xa8, 0x06, 0x5c, 0x73, 0x5d, 0x4a, 0x49, \n\t0x51, 0x2b, 0x3a, 0x9c, 0x91, 0x9a, 0xa8, 0xaa, 0xb8, 0x06, 0x6c, 0x64, \n\t0x5e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x99, 0x00, 0x00, 0x04, 0x2c, \n\t0x04, 0x8d, 0x00, 0x1a, 0x00, 0x23, 0x00, 0x61, 0x00, 0xb0, 0x00, 0x2f, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0e, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x06, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x12, 0x2f, 0x1b, 0xb1, 0x12, \n\t0x06, 0x3e, 0x59, 0xb2, 0xbf, 0x00, 0x01, 0x71, 0xb2, 0x2f, 0x00, 0x01, \n\t0x71, 0xb2, 0x20, 0x00, 0x01, 0x5d, 0xb0, 0x00, 0x10, 0xb1, 0x1b, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0a, 0x00, \n\t0x1b, 0x11, 0x12, 0x39, 0xb0, 0x03, 0x10, 0xb1, 0x22, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x11, 0x23, \n\t0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, 0x15, \n\t0x14, 0x16, 0x17, 0x15, 0x23, 0x26, 0x26, 0x35, 0x35, 0x34, 0x26, 0x23, \n\t0x25, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x21, 0x01, 0x5e, 0xc5, \n\t0x01, 0xcd, 0xcd, 0xe1, 0x63, 0x60, 0x68, 0x5b, 0x0b, 0x0d, 0xcb, 0x0c, \n\t0x06, 0x68, 0x62, 0xfe, 0xd9, 0x01, 0x08, 0x78, 0x70, 0x71, 0x77, 0xfe, \n\t0xf8, 0x01, 0xdf, 0xfe, 0x21, 0x04, 0x8d, 0xb4, 0xa2, 0x59, 0x7e, 0x27, \n\t0x1e, 0x90, 0x69, 0x76, 0x2d, 0x56, 0x16, 0x13, 0x17, 0x62, 0x34, 0x74, \n\t0x5a, 0x64, 0x9a, 0x5e, 0x58, 0x5c, 0x69, 0x00, 0x00, 0x02, 0x00, 0x70, \n\t0xff, 0x8a, 0x04, 0x9a, 0x04, 0x9d, 0x00, 0x13, 0x00, 0x21, 0x00, 0x42, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x10, 0x2f, 0x1b, 0xb1, 0x10, 0x0e, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, \n\t0x06, 0x3e, 0x59, 0xb2, 0x03, 0x09, 0x10, 0x11, 0x12, 0x39, 0xb0, 0x10, \n\t0x10, 0xb1, 0x17, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x09, 0x10, 0xb1, 0x1e, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x14, 0x06, 0x07, 0x17, 0x07, \n\t0x27, 0x06, 0x06, 0x23, 0x22, 0x00, 0x35, 0x35, 0x34, 0x00, 0x33, 0x32, \n\t0x00, 0x15, 0x27, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x15, 0x14, 0x16, \n\t0x33, 0x32, 0x36, 0x35, 0x04, 0x5b, 0x34, 0x30, 0xa3, 0x87, 0xa7, 0x38, \n\t0x85, 0x49, 0xdf, 0xfe, 0xe9, 0x01, 0x15, 0xdf, 0xe0, 0x01, 0x17, 0xc5, \n\t0xa4, 0x8e, 0x8d, 0xa2, 0xa3, 0x8e, 0x8e, 0xa2, 0x01, 0xcd, 0x59, 0x9b, \n\t0x3c, 0x9f, 0x74, 0xa1, 0x1e, 0x1e, 0x01, 0x09, 0xd5, 0xf3, 0xd4, 0x01, \n\t0x09, 0xfe, 0xf7, 0xd4, 0x01, 0x97, 0xac, 0xac, 0x97, 0xf4, 0x9a, 0xac, \n\t0xac, 0x9a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x8b, 0xff, 0xeb, 0x04, 0x52, \n\t0x05, 0xc5, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x3b, 0x00, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0c, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x06, 0x3e, 0x59, 0xb0, \n\t0x0a, 0x10, 0xb1, 0x11, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x18, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x10, 0x00, 0x23, 0x22, \n\t0x00, 0x11, 0x11, 0x10, 0x00, 0x33, 0x32, 0x00, 0x11, 0x27, 0x34, 0x26, \n\t0x23, 0x22, 0x06, 0x15, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x04, \n\t0x52, 0xfe, 0xfe, 0xe0, 0xe0, 0xfe, 0xfb, 0x01, 0x04, 0xdf, 0xe0, 0x01, \n\t0x04, 0xc5, 0x93, 0x8c, 0x8b, 0x93, 0x95, 0x8b, 0x8c, 0x91, 0x02, 0x2b, \n\t0xfe, 0xe9, 0xfe, 0xd7, 0x01, 0x2a, 0x01, 0x16, 0x01, 0x59, 0x01, 0x16, \n\t0x01, 0x2b, 0xfe, 0xd5, 0xfe, 0xea, 0x2a, 0xbd, 0xbf, 0xbf, 0xbd, 0xfe, \n\t0x55, 0xbd, 0xc1, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x70, \n\t0xff, 0xef, 0x04, 0x5b, 0x04, 0x9d, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x3b, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0e, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, \n\t0x06, 0x3e, 0x59, 0xb0, 0x0a, 0x10, 0xb1, 0x11, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x18, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, \n\t0x14, 0x00, 0x23, 0x22, 0x00, 0x35, 0x35, 0x34, 0x00, 0x33, 0x32, 0x00, \n\t0x15, 0x27, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x15, 0x14, 0x16, 0x33, \n\t0x32, 0x36, 0x35, 0x04, 0x5b, 0xfe, 0xeb, 0xe0, 0xdf, 0xfe, 0xe9, 0x01, \n\t0x15, 0xdf, 0xe0, 0x01, 0x17, 0xc5, 0xa4, 0x8e, 0x8d, 0xa2, 0xa3, 0x8e, \n\t0x8e, 0xa2, 0x01, 0xcd, 0xd6, 0xfe, 0xf8, 0x01, 0x09, 0xd5, 0xf3, 0xd4, \n\t0x01, 0x09, 0xfe, 0xf7, 0xd4, 0x01, 0x97, 0xac, 0xac, 0x97, 0xf4, 0x9a, \n\t0xac, 0xac, 0x9a, 0x00, 0x00, 0x01, 0x00, 0x99, 0x00, 0x00, 0x04, 0x76, \n\t0x04, 0x8d, 0x00, 0x0b, 0x00, 0x70, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x06, 0x3e, 0x59, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x06, 0x3e, 0x59, 0xb0, \n\t0x06, 0x10, 0xb0, 0x02, 0xd0, 0xb6, 0x7d, 0x02, 0x8d, 0x02, 0x9d, 0x02, \n\t0x03, 0x5d, 0xb4, 0x5c, 0x02, 0x6c, 0x02, 0x02, 0x5d, 0xb2, 0x4b, 0x02, \n\t0x01, 0x5d, 0xb0, 0x00, 0x10, 0xb0, 0x08, 0xd0, 0x40, 0x09, 0x24, 0x08, \n\t0x34, 0x08, 0x44, 0x08, 0x54, 0x08, 0x04, 0x5d, 0x40, 0x09, 0x63, 0x08, \n\t0x73, 0x08, 0x83, 0x08, 0x93, 0x08, 0x04, 0x5d, 0x30, 0x31, 0x21, 0x23, \n\t0x01, 0x07, 0x11, 0x23, 0x11, 0x33, 0x01, 0x37, 0x11, 0x33, 0x04, 0x76, \n\t0xc4, 0xfd, 0xb2, 0x06, 0xc5, 0xc5, 0x02, 0x4e, 0x06, 0xc4, 0x03, 0x5b, \n\t0x02, 0xfc, 0xa7, 0x04, 0x8d, 0xfc, 0xa5, 0x02, 0x03, 0x59, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x92, 0x02, 0x88, 0x03, 0x13, 0x03, 0x23, 0x00, 0x03, \n\t0x00, 0x12, 0x00, 0xb0, 0x02, 0x2f, 0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x35, 0x21, \n\t0x03, 0x13, 0xfd, 0x7f, 0x02, 0x81, 0x02, 0x88, 0x9b, 0x00, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x99, 0x00, 0x00, 0x05, 0x55, 0x04, 0x8d, 0x00, 0x0f, \n\t0x00, 0x83, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, \n\t0x02, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, \n\t0xb1, 0x0e, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, \n\t0x1b, 0xb1, 0x04, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x08, \n\t0x2f, 0x1b, 0xb1, 0x08, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0c, 0x2f, 0x1b, 0xb1, 0x0c, 0x06, 0x3e, 0x59, 0xb0, 0x08, 0x10, 0xb0, \n\t0x00, 0xd0, 0xb2, 0x25, 0x00, 0x01, 0x5d, 0x40, 0x09, 0x64, 0x00, 0x74, \n\t0x00, 0x84, 0x00, 0x94, 0x00, 0x04, 0x5d, 0xb4, 0x43, 0x00, 0x53, 0x00, \n\t0x02, 0x5d, 0xb0, 0x02, 0x10, 0xb0, 0x07, 0xd0, 0xb4, 0x8f, 0x07, 0x9f, \n\t0x07, 0x02, 0x5d, 0x40, 0x09, 0x4c, 0x07, 0x5c, 0x07, 0x6c, 0x07, 0x7c, \n\t0x07, 0x04, 0x5d, 0xb2, 0x2b, 0x07, 0x01, 0x5d, 0xb0, 0x0a, 0xd0, 0x30, \n\t0x31, 0x01, 0x33, 0x01, 0x33, 0x11, 0x23, 0x11, 0x27, 0x01, 0x23, 0x01, \n\t0x07, 0x11, 0x23, 0x11, 0x33, 0x02, 0xf7, 0x06, 0x01, 0x62, 0xf6, 0xc5, \n\t0x06, 0xfe, 0xb4, 0x88, 0xfe, 0xae, 0x06, 0xc5, 0xfe, 0x01, 0x03, 0x03, \n\t0x8a, 0xfb, 0x73, 0x03, 0x29, 0x02, 0xfc, 0xd5, 0x03, 0x3d, 0x02, 0xfc, \n\t0xc5, 0x04, 0x8d, 0x00, 0x00, 0x01, 0x00, 0x99, 0x00, 0x00, 0x03, 0x6b, \n\t0x04, 0x8d, 0x00, 0x05, 0x00, 0x29, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x06, 0x3e, 0x59, 0xb1, 0x00, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x25, \n\t0x21, 0x15, 0x21, 0x11, 0x33, 0x01, 0x5e, 0x02, 0x0d, 0xfd, 0x2e, 0xc5, \n\t0x98, 0x98, 0x04, 0x8d, 0x00, 0x01, 0x00, 0x99, 0x00, 0x00, 0x04, 0x41, \n\t0x04, 0x8d, 0x00, 0x0e, 0x00, 0x92, 0x00, 0xb0, 0x06, 0x2f, 0xb0, 0x00, \n\t0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0e, 0x3e, 0x59, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x08, 0x2f, 0x1b, 0xb1, 0x08, 0x0e, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x06, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x06, \n\t0x3e, 0x59, 0xb2, 0x8f, 0x06, 0x01, 0x5d, 0xb4, 0xdf, 0x06, 0xef, 0x06, \n\t0x02, 0x5d, 0xb2, 0x4f, 0x06, 0x01, 0x71, 0xb2, 0xdf, 0x06, 0x01, 0x71, \n\t0xb2, 0x4f, 0x06, 0x01, 0x72, 0xb4, 0x6f, 0x06, 0x7f, 0x06, 0x02, 0x72, \n\t0xb2, 0x0f, 0x06, 0x01, 0x72, 0xb4, 0x9f, 0x06, 0xaf, 0x06, 0x02, 0x71, \n\t0xb2, 0x1f, 0x06, 0x01, 0x71, 0xb2, 0xbf, 0x06, 0x01, 0x5d, 0xb2, 0x5f, \n\t0x06, 0x01, 0x5d, 0xb2, 0x1f, 0x06, 0x01, 0x5d, 0xb0, 0x06, 0x10, 0xb1, \n\t0x01, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, \n\t0x0b, 0x01, 0x06, 0x11, 0x12, 0x39, 0x30, 0x31, 0x01, 0x23, 0x11, 0x23, \n\t0x11, 0x33, 0x11, 0x33, 0x01, 0x33, 0x17, 0x01, 0x01, 0x07, 0x23, 0x01, \n\t0xc1, 0x63, 0xc5, 0xc5, 0x54, 0x01, 0x84, 0xe7, 0x03, 0xfe, 0x39, 0x01, \n\t0xe8, 0x03, 0xf1, 0x01, 0xf4, 0xfe, 0x0c, 0x04, 0x8d, 0xfe, 0x04, 0x01, \n\t0xfc, 0x05, 0xfd, 0xd6, 0xfd, 0xa7, 0x05, 0x00, 0x00, 0x01, 0x00, 0x40, \n\t0xff, 0xef, 0x03, 0x77, 0x04, 0x8d, 0x00, 0x10, 0x00, 0x29, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x0e, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x06, 0x3e, \n\t0x59, 0xb1, 0x0d, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0x30, 0x31, 0x01, 0x33, 0x11, 0x14, 0x06, 0x23, 0x22, 0x26, 0x37, \n\t0x37, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x02, 0xb3, 0xc4, 0xe3, \n\t0xaf, 0xc3, 0xe2, 0x06, 0x02, 0xbc, 0x76, 0x6b, 0x58, 0x76, 0x04, 0x8d, \n\t0xfc, 0xd5, 0xaa, 0xc9, 0xb2, 0xaa, 0x06, 0x65, 0x65, 0x79, 0x62, 0x00, \n\t0x00, 0x01, 0x00, 0x99, 0x00, 0x00, 0x01, 0x5d, 0x04, 0x8d, 0x00, 0x03, \n\t0x00, 0x1d, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, \n\t0x02, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, \n\t0xb1, 0x00, 0x06, 0x3e, 0x59, 0x30, 0x31, 0x21, 0x23, 0x11, 0x33, 0x01, \n\t0x5d, 0xc4, 0xc4, 0x04, 0x8d, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x99, \n\t0x00, 0x00, 0x04, 0x5a, 0x04, 0x8d, 0x00, 0x0b, 0x00, 0x6e, 0x00, 0x7c, \n\t0xb0, 0x08, 0x2f, 0x18, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, \n\t0xb1, 0x06, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, \n\t0x1b, 0xb1, 0x0a, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, \n\t0x2f, 0x1b, 0xb1, 0x00, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x06, 0x3e, 0x59, 0xb2, 0xdf, 0x08, 0x01, \n\t0x5d, 0xb2, 0x6f, 0x08, 0x01, 0x72, 0xb2, 0xaf, 0x08, 0x01, 0x5d, 0xb2, \n\t0xdf, 0x08, 0x01, 0x72, 0xb2, 0x0f, 0x08, 0x01, 0x72, 0xb2, 0x70, 0x08, \n\t0x01, 0x5d, 0xb2, 0x40, 0x08, 0x01, 0x5d, 0xb0, 0x08, 0x10, 0xb1, 0x03, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x21, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, \n\t0x04, 0x5a, 0xc6, 0xfd, 0xca, 0xc5, 0xc5, 0x02, 0x36, 0xc6, 0x01, 0xeb, \n\t0xfe, 0x15, 0x04, 0x8d, 0xfd, 0xf7, 0x02, 0x09, 0x00, 0x01, 0x00, 0x70, \n\t0xff, 0xef, 0x04, 0x4b, 0x04, 0x9d, 0x00, 0x20, 0x00, 0x54, 0x00, 0xb0, \n\t0x1f, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, \n\t0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, \n\t0x03, 0x06, 0x3e, 0x59, 0xb2, 0x0f, 0x1f, 0x0a, 0x11, 0x12, 0x39, 0xb0, \n\t0x0a, 0x10, 0xb1, 0x12, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x19, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x1f, 0x10, 0xb1, 0x1e, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x25, 0x06, \n\t0x06, 0x23, 0x22, 0x00, 0x35, 0x35, 0x34, 0x00, 0x33, 0x32, 0x16, 0x07, \n\t0x07, 0x23, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x15, 0x14, 0x16, 0x33, \n\t0x32, 0x36, 0x37, 0x35, 0x21, 0x35, 0x21, 0x04, 0x4b, 0x2d, 0xf2, 0xb5, \n\t0xe7, 0xfe, 0xe0, 0x01, 0x22, 0xe1, 0xde, 0xf3, 0x04, 0x02, 0xbc, 0x91, \n\t0x7e, 0x8c, 0xb2, 0xb0, 0x92, 0x69, 0x89, 0x1f, 0xfe, 0xfe, 0x01, 0xc5, \n\t0x9d, 0x41, 0x6d, 0x01, 0x09, 0xd5, 0xf3, 0xd3, 0x01, 0x0a, 0xc9, 0x9d, \n\t0x06, 0x65, 0x6e, 0xb8, 0x8b, 0xf4, 0x8e, 0xb8, 0x2a, 0x1b, 0xfa, 0x9a, \n\t0x00, 0x01, 0x00, 0x99, 0x00, 0x00, 0x03, 0xca, 0x04, 0x8d, 0x00, 0x09, \n\t0x00, 0x4f, 0x00, 0x7c, 0xb0, 0x08, 0x2f, 0x18, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, \n\t0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, 0x06, 0x3e, 0x59, 0xb2, 0x9f, \n\t0x08, 0x01, 0x71, 0xb2, 0x40, 0x08, 0x01, 0x5d, 0xb2, 0x70, 0x08, 0x01, \n\t0x5d, 0xb0, 0x08, 0x10, 0xb1, 0x01, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, 0xb1, 0x06, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x11, \n\t0x23, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x03, 0x73, 0xfd, 0xeb, 0xc5, \n\t0x03, 0x31, 0xfd, 0x94, 0x02, 0x15, 0x01, 0xf5, 0xfe, 0x0b, 0x04, 0x8d, \n\t0x99, 0xfe, 0x9b, 0x00, 0x00, 0x01, 0x00, 0x99, 0x00, 0x00, 0x03, 0xc8, \n\t0x04, 0x8d, 0x00, 0x0b, 0x00, 0x56, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x06, 0x2f, 0x1b, 0xb1, 0x06, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x06, 0x3e, 0x59, 0xb2, 0x0b, 0x04, \n\t0x06, 0x11, 0x12, 0x39, 0xb0, 0x0b, 0x2f, 0xb2, 0xaf, 0x0b, 0x01, 0x5d, \n\t0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x04, 0x10, 0xb1, 0x02, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x06, 0x10, 0xb1, 0x08, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x21, 0x11, 0x21, \n\t0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x03, 0x71, 0xfd, 0xed, \n\t0x02, 0x6a, 0xfc, 0xd1, 0x03, 0x2f, 0xfd, 0x96, 0x02, 0x13, 0x02, 0x12, \n\t0xfe, 0x86, 0x98, 0x04, 0x8d, 0x99, 0xfe, 0xb8, 0x00, 0x02, 0x00, 0x99, \n\t0x00, 0x00, 0x04, 0x31, 0x04, 0x8d, 0x00, 0x09, 0x00, 0x13, 0x00, 0x3b, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x0e, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, \n\t0x06, 0x3e, 0x59, 0xb0, 0x01, 0x10, 0xb1, 0x0a, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x0b, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x33, \n\t0x11, 0x21, 0x32, 0x00, 0x15, 0x15, 0x14, 0x00, 0x23, 0x03, 0x11, 0x33, \n\t0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x99, 0x01, 0xa5, 0xd3, 0x01, \n\t0x20, 0xfe, 0xe0, 0xd3, 0xe0, 0xe0, 0x7e, 0xb0, 0xb0, 0x7e, 0x04, 0x8d, \n\t0xfe, 0xf3, 0xd1, 0xd2, 0xd2, 0xfe, 0xf5, 0x03, 0xf4, 0xfc, 0xa4, 0xba, \n\t0x8b, 0xd3, 0x89, 0xbb, 0x00, 0x01, 0x00, 0x70, 0xff, 0xef, 0x04, 0x26, \n\t0x04, 0x9d, 0x00, 0x1d, 0x00, 0x3b, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x06, 0x3e, 0x59, 0xb0, 0x0b, 0x10, \n\t0xb1, 0x13, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x04, 0x10, 0xb1, 0x1a, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x17, 0x16, 0x04, 0x23, 0x22, 0x00, \n\t0x35, 0x35, 0x34, 0x00, 0x33, 0x32, 0x16, 0x07, 0x07, 0x23, 0x34, 0x26, \n\t0x23, 0x22, 0x06, 0x15, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x04, \n\t0x1e, 0x02, 0x05, 0xfe, 0xfd, 0xce, 0xcf, 0xfe, 0xeb, 0x01, 0x15, 0xcf, \n\t0xd4, 0xfe, 0x05, 0x02, 0xbd, 0x8e, 0x80, 0x7b, 0xa4, 0xa4, 0x7b, 0x7f, \n\t0x8e, 0x01, 0x7d, 0x06, 0xbd, 0xcb, 0x01, 0x0c, 0xd2, 0xf3, 0xd1, 0x01, \n\t0x0c, 0xcb, 0xbb, 0x06, 0x79, 0x7a, 0xba, 0x89, 0xf4, 0x8b, 0xbb, 0x7a, \n\t0x7c, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x99, 0x00, 0x00, 0x04, 0x0d, \n\t0x04, 0x8d, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x21, 0x00, 0x76, 0x00, 0x7c, \n\t0xb0, 0x19, 0x2f, 0x18, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, \n\t0xb1, 0x01, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, \n\t0x1b, 0xb1, 0x00, 0x06, 0x3e, 0x59, 0xb2, 0x00, 0x19, 0x01, 0x71, 0xb4, \n\t0x60, 0x19, 0x70, 0x19, 0x02, 0x71, 0xb2, 0x9f, 0x19, 0x01, 0x71, 0xb2, \n\t0x30, 0x19, 0x01, 0x71, 0xb2, 0x70, 0x19, 0x01, 0x5d, 0xb2, 0x40, 0x19, \n\t0x01, 0x5d, 0xb0, 0x19, 0x10, 0xb1, 0x0f, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x08, 0x0f, 0x19, 0x11, 0x12, 0x39, \n\t0xb0, 0x00, 0x10, 0xb1, 0x10, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x01, 0x10, 0xb1, 0x20, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x33, 0x11, 0x21, 0x32, \n\t0x16, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, 0x14, 0x06, 0x23, 0x01, \n\t0x11, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x23, 0x25, 0x33, 0x32, \n\t0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x99, 0x01, 0x8d, 0xd5, 0xed, 0x5e, \n\t0x57, 0x66, 0x74, 0xdd, 0xc5, 0xfe, 0xf3, 0x01, 0x0d, 0x6d, 0x6f, 0x6a, \n\t0x67, 0x0b, 0xfe, 0xf3, 0xc8, 0x7c, 0x81, 0x7b, 0x82, 0xc8, 0x04, 0x8d, \n\t0x9f, 0x9f, 0x54, 0x82, 0x21, 0x19, 0x96, 0x60, 0xa2, 0xa7, 0x02, 0x09, \n\t0xfe, 0x8f, 0x5e, 0x58, 0x54, 0x64, 0x03, 0x8d, 0x59, 0x55, 0x56, 0x46, \n\t0x00, 0x01, 0x00, 0xa0, 0x04, 0x8c, 0x01, 0x7a, 0x06, 0x17, 0x00, 0x05, \n\t0x00, 0x10, 0x00, 0xb0, 0x05, 0x2f, 0xb0, 0x01, 0xb0, 0x0a, 0x2b, 0x58, \n\t0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, 0x13, 0x37, 0x33, 0x03, 0x15, 0x23, \n\t0xa0, 0x79, 0x61, 0x15, 0xc5, 0x05, 0x20, 0xf7, 0xfe, 0xff, 0x8a, 0x00, \n\t0x00, 0x02, 0x00, 0x81, 0x04, 0xdf, 0x02, 0xe0, 0x06, 0x8b, 0x00, 0x04, \n\t0x00, 0x14, 0x00, 0x5b, 0x00, 0xb0, 0x09, 0x2f, 0xb2, 0x3f, 0x09, 0x01, \n\t0x5d, 0xb0, 0x11, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0x40, \n\t0x09, 0x4f, 0x11, 0x5f, 0x11, 0x6f, 0x11, 0x7f, 0x11, 0x04, 0x71, 0xb0, \n\t0x0e, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb2, 0x1f, 0x0e, \n\t0x01, 0x71, 0xb2, 0xff, 0x0e, 0x01, 0x71, 0x40, 0x09, 0x0f, 0x0e, 0x1f, \n\t0x0e, 0x2f, 0x0e, 0x3f, 0x0e, 0x04, 0x72, 0xb0, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x04, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, \n\t0x1b, 0xdc, 0x59, 0xb0, 0x0e, 0x10, 0xb0, 0x14, 0xd0, 0x30, 0x31, 0x01, \n\t0x23, 0x27, 0x37, 0x33, 0x05, 0x17, 0x16, 0x06, 0x23, 0x22, 0x26, 0x37, \n\t0x37, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x01, 0xf3, 0x77, 0xc8, \n\t0x02, 0xb3, 0x01, 0x6f, 0x02, 0x06, 0xa4, 0x8b, 0x8c, 0xa4, 0x07, 0x02, \n\t0x97, 0x45, 0x4b, 0x49, 0x46, 0x05, 0xc6, 0xbf, 0x06, 0xdb, 0x06, 0x59, \n\t0x72, 0x72, 0x59, 0x06, 0x33, 0x3f, 0x3f, 0x33, 0x00, 0x02, 0x00, 0x27, \n\t0x00, 0x00, 0x04, 0x8a, 0x04, 0x8d, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x5d, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0e, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x02, 0x2f, 0x1b, 0xb1, 0x02, \n\t0x06, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x06, 0x2f, 0x1b, 0xb1, \n\t0x06, 0x06, 0x3e, 0x59, 0xb2, 0x00, 0x02, 0x04, 0x11, 0x12, 0x39, 0xb0, \n\t0x00, 0x2f, 0xb4, 0x8f, 0x00, 0x9f, 0x00, 0x02, 0x5d, 0xb1, 0x09, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x04, 0x10, \n\t0xb0, 0x0a, 0xd0, 0xb4, 0x8f, 0x0a, 0x9f, 0x0a, 0x02, 0x5d, 0xb6, 0x5c, \n\t0x0a, 0x6c, 0x0a, 0x7c, 0x0a, 0x03, 0x5d, 0x30, 0x31, 0x01, 0x21, 0x03, \n\t0x23, 0x01, 0x33, 0x01, 0x23, 0x01, 0x21, 0x03, 0x23, 0x03, 0x57, 0xfe, \n\t0x03, 0x67, 0xcc, 0x01, 0xd5, 0xba, 0x01, 0xd4, 0xcb, 0xfd, 0xd6, 0x01, \n\t0x87, 0xc1, 0x06, 0x01, 0x0c, 0xfe, 0xf4, 0x04, 0x8d, 0xfb, 0x73, 0x01, \n\t0xa6, 0x01, 0xf2, 0x00, 0x00, 0x02, 0x00, 0x78, 0x04, 0xe4, 0x04, 0x71, \n\t0x06, 0x98, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x40, 0x00, 0xb0, 0x06, 0x2f, \n\t0xb0, 0x05, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb6, 0x2f, \n\t0x05, 0x3f, 0x05, 0x4f, 0x05, 0x03, 0x72, 0xb0, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x06, 0x10, 0xb0, 0x04, 0xd0, 0xb0, \n\t0x06, 0x10, 0xb0, 0x0c, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, \n\t0xb0, 0x0a, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, \n\t0x01, 0x33, 0x01, 0x07, 0x23, 0x27, 0x07, 0x23, 0x27, 0x01, 0x33, 0x03, \n\t0x23, 0x01, 0x99, 0x9e, 0x01, 0x20, 0x02, 0xc6, 0xa7, 0xa7, 0xc7, 0x02, \n\t0x03, 0x26, 0xd3, 0xcc, 0x93, 0x05, 0xeb, 0xfe, 0xff, 0x06, 0x9d, 0x9d, \n\t0x06, 0x01, 0xae, 0xfe, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x55, \n\t0x04, 0xe4, 0x03, 0x4d, 0x06, 0x98, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x40, \n\t0x00, 0xb0, 0x04, 0x2f, 0xb0, 0x02, 0xd0, 0xb0, 0x04, 0x10, 0xb0, 0x03, \n\t0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb6, 0x2f, 0x03, 0x3f, \n\t0x03, 0x4f, 0x03, 0x03, 0x72, 0xb0, 0x08, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, \n\t0x1b, 0xdc, 0x59, 0xb0, 0x04, 0x10, 0xb0, 0x09, 0xb0, 0x0a, 0x2b, 0x58, \n\t0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x0b, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, \n\t0xdc, 0x59, 0x30, 0x31, 0x01, 0x07, 0x23, 0x27, 0x07, 0x23, 0x27, 0x01, \n\t0x33, 0x05, 0x23, 0x03, 0x33, 0x03, 0x4d, 0x02, 0xc7, 0xa7, 0xa7, 0xc6, \n\t0x02, 0x01, 0x20, 0x9e, 0xfe, 0x87, 0x93, 0xcb, 0xd2, 0x04, 0xea, 0x06, \n\t0x9d, 0x9d, 0x06, 0x01, 0x01, 0x57, 0x01, 0x04, 0x00, 0x02, 0x00, 0x6e, \n\t0x04, 0xe4, 0x04, 0x31, 0x06, 0xd1, 0x00, 0x08, 0x00, 0x18, 0x00, 0x8a, \n\t0x00, 0xb0, 0x04, 0x2f, 0xb0, 0x02, 0xd0, 0xb0, 0x04, 0x10, 0xb0, 0x03, \n\t0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb4, 0xe0, 0x03, 0xf0, \n\t0x03, 0x02, 0x71, 0xb4, 0x00, 0x03, 0x10, 0x03, 0x02, 0x72, 0xb6, 0x80, \n\t0x03, 0x90, 0x03, 0xa0, 0x03, 0x03, 0x5d, 0x40, 0x0b, 0x30, 0x03, 0x40, \n\t0x03, 0x50, 0x03, 0x60, 0x03, 0x70, 0x03, 0x05, 0x71, 0xb0, 0x08, 0xb0, \n\t0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0x40, 0x17, 0x4f, 0x08, 0x5f, \n\t0x08, 0x6f, 0x08, 0x7f, 0x08, 0x8f, 0x08, 0x9f, 0x08, 0xaf, 0x08, 0xbf, \n\t0x08, 0xcf, 0x08, 0xdf, 0x08, 0xef, 0x08, 0x0b, 0x71, 0xb0, 0x02, 0x10, \n\t0xb0, 0x09, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x0a, \n\t0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x10, 0xb0, 0x0a, \n\t0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x11, 0xb0, 0x0a, 0x2b, 0x58, \n\t0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, 0x01, 0x07, 0x23, 0x27, 0x07, 0x23, \n\t0x27, 0x01, 0x33, 0x17, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x37, \n\t0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x07, 0x03, 0x4d, 0x02, 0xaa, 0xc4, \n\t0xc4, 0xa9, 0x02, 0x01, 0x0c, 0xc6, 0xf4, 0x01, 0x42, 0x37, 0x4b, 0x3e, \n\t0x06, 0x7f, 0x89, 0x4b, 0x39, 0x01, 0x04, 0xea, 0x06, 0xba, 0xba, 0x06, \n\t0x01, 0x01, 0x7d, 0x85, 0x04, 0x1a, 0x20, 0x22, 0x20, 0x5e, 0x57, 0x4b, \n\t0x3d, 0x40, 0x07, 0x3d, 0x00, 0x02, 0x00, 0x6e, 0x04, 0xe4, 0x03, 0x4d, \n\t0x06, 0xfc, 0x00, 0x08, 0x00, 0x1c, 0x00, 0x94, 0x00, 0xb0, 0x04, 0x2f, \n\t0xb0, 0x02, 0xd0, 0xb0, 0x04, 0x10, 0xb0, 0x03, 0xb0, 0x0a, 0x2b, 0x58, \n\t0xd8, 0x1b, 0xdc, 0x59, 0xb4, 0x90, 0x03, 0xa0, 0x03, 0x02, 0x5d, 0x40, \n\t0x09, 0x40, 0x03, 0x50, 0x03, 0x60, 0x03, 0x70, 0x03, 0x04, 0x71, 0xb4, \n\t0x00, 0x03, 0x10, 0x03, 0x02, 0x72, 0xb0, 0x08, 0xb0, 0x0a, 0x2b, 0x58, \n\t0xd8, 0x1b, 0xdc, 0x59, 0x40, 0x0f, 0x4f, 0x08, 0x5f, 0x08, 0x6f, 0x08, \n\t0x7f, 0x08, 0x8f, 0x08, 0x9f, 0x08, 0xaf, 0x08, 0x07, 0x71, 0xb0, 0x0c, \n\t0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x0f, 0xb0, 0x0a, \n\t0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x0c, 0x10, 0xb0, 0x12, 0xd0, \n\t0xb0, 0x0f, 0x10, 0xb0, 0x16, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, \n\t0x59, 0xb4, 0x2f, 0x16, 0x3f, 0x16, 0x02, 0x71, 0xb0, 0x0c, 0x10, 0xb0, \n\t0x19, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb4, 0x2f, 0x19, \n\t0x3f, 0x19, 0x02, 0x71, 0xb0, 0x16, 0x10, 0xb0, 0x1c, 0xd0, 0x30, 0x31, \n\t0x01, 0x07, 0x23, 0x27, 0x07, 0x23, 0x27, 0x01, 0x33, 0x37, 0x14, 0x06, \n\t0x23, 0x22, 0x26, 0x23, 0x22, 0x06, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, \n\t0x16, 0x33, 0x32, 0x36, 0x35, 0x03, 0x4d, 0x02, 0xaa, 0xc4, 0xc4, 0xa9, \n\t0x02, 0x01, 0x21, 0x9d, 0xb6, 0x61, 0x42, 0x35, 0x71, 0x26, 0x1f, 0x33, \n\t0x50, 0x60, 0x42, 0x2a, 0x7b, 0x27, 0x1e, 0x36, 0x04, 0xea, 0x06, 0xb0, \n\t0xb0, 0x06, 0x01, 0x01, 0xfa, 0x45, 0x6b, 0x47, 0x3b, 0x22, 0x13, 0x45, \n\t0x6f, 0x45, 0x38, 0x23, 0x00, 0x02, 0x00, 0x81, 0x04, 0xdf, 0x02, 0xe0, \n\t0x06, 0x8b, 0x00, 0x0f, 0x00, 0x14, 0x00, 0x62, 0x00, 0xb0, 0x04, 0x2f, \n\t0xb0, 0x0c, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0x40, 0x09, \n\t0x9f, 0x0c, 0xaf, 0x0c, 0xbf, 0x0c, 0xcf, 0x0c, 0x04, 0x72, 0x40, 0x09, \n\t0x4f, 0x0c, 0x5f, 0x0c, 0x6f, 0x0c, 0x7f, 0x0c, 0x04, 0x71, 0xb0, 0x09, \n\t0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb2, 0x1f, 0x09, 0x01, \n\t0x71, 0xb2, 0xff, 0x09, 0x01, 0x71, 0x40, 0x09, 0x0f, 0x09, 0x1f, 0x09, \n\t0x2f, 0x09, 0x3f, 0x09, 0x04, 0x72, 0xb0, 0x0f, 0xd0, 0xb0, 0x09, 0x10, \n\t0xb0, 0x14, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x10, \n\t0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, 0x01, 0x17, \n\t0x16, 0x06, 0x23, 0x22, 0x26, 0x37, 0x37, 0x33, 0x14, 0x16, 0x33, 0x32, \n\t0x36, 0x35, 0x27, 0x33, 0x17, 0x07, 0x23, 0x02, 0xd8, 0x02, 0x06, 0xa4, \n\t0x8b, 0x8c, 0xa4, 0x07, 0x02, 0x97, 0x45, 0x4b, 0x49, 0x46, 0x5d, 0x9b, \n\t0x02, 0x9f, 0x6a, 0x05, 0xb0, 0x06, 0x59, 0x72, 0x72, 0x59, 0x06, 0x33, \n\t0x3f, 0x3f, 0x33, 0xdb, 0x05, 0xc0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x81, \n\t0x04, 0xe0, 0x02, 0xca, 0x07, 0x2a, 0x00, 0x0f, 0x00, 0x20, 0x00, 0x78, \n\t0x00, 0xb0, 0x04, 0x2f, 0xb0, 0x0c, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, \n\t0xdc, 0x59, 0x40, 0x0b, 0x9f, 0x0c, 0xaf, 0x0c, 0xbf, 0x0c, 0xcf, 0x0c, \n\t0xdf, 0x0c, 0x05, 0x72, 0x40, 0x09, 0x4f, 0x0c, 0x5f, 0x0c, 0x6f, 0x0c, \n\t0x7f, 0x0c, 0x04, 0x71, 0xb0, 0x09, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, \n\t0xdc, 0x59, 0xb2, 0x1f, 0x09, 0x01, 0x71, 0xb2, 0xff, 0x09, 0x01, 0x71, \n\t0x40, 0x09, 0x0f, 0x09, 0x1f, 0x09, 0x2f, 0x09, 0x3f, 0x09, 0x04, 0x72, \n\t0xb0, 0x0f, 0xd0, 0xb0, 0x09, 0x10, 0xb0, 0x10, 0xb0, 0x0a, 0x2b, 0x58, \n\t0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x11, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, \n\t0xdc, 0x59, 0xb0, 0x18, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, \n\t0xb0, 0x19, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0x30, 0x31, \n\t0x01, 0x17, 0x16, 0x06, 0x23, 0x22, 0x26, 0x37, 0x37, 0x33, 0x14, 0x16, \n\t0x33, 0x32, 0x36, 0x35, 0x27, 0x27, 0x36, 0x36, 0x27, 0x35, 0x36, 0x26, \n\t0x23, 0x37, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x07, 0x02, 0xc2, 0x02, \n\t0x06, 0x9e, 0x86, 0x87, 0x9e, 0x07, 0x02, 0x90, 0x44, 0x48, 0x47, 0x44, \n\t0xbc, 0x01, 0x49, 0x3c, 0x05, 0x05, 0x51, 0x46, 0x07, 0x8e, 0x98, 0x53, \n\t0x3f, 0x01, 0x05, 0xb0, 0x06, 0x59, 0x71, 0x71, 0x59, 0x06, 0x32, 0x40, \n\t0x3f, 0x33, 0x38, 0x7e, 0x03, 0x17, 0x1a, 0x06, 0x1c, 0x1b, 0x53, 0x4e, \n\t0x42, 0x35, 0x37, 0x07, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x81, \n\t0x04, 0xdb, 0x02, 0xd3, 0x06, 0xd4, 0x00, 0x0f, 0x00, 0x23, 0x00, 0x82, \n\t0x00, 0xb0, 0x04, 0x2f, 0xb0, 0x0c, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, \n\t0xdc, 0x59, 0xb6, 0x4f, 0x0c, 0x5f, 0x0c, 0x6f, 0x0c, 0x03, 0x71, 0x40, \n\t0x09, 0x9f, 0x0c, 0xaf, 0x0c, 0xbf, 0x0c, 0xcf, 0x0c, 0x04, 0x72, 0xb0, \n\t0x09, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb2, 0xff, 0x09, \n\t0x01, 0x71, 0xb6, 0x0f, 0x09, 0x1f, 0x09, 0x2f, 0x09, 0x03, 0x72, 0xb2, \n\t0x1f, 0x09, 0x01, 0x71, 0xb0, 0x0f, 0xd0, 0xb0, 0x09, 0x10, 0xb0, 0x13, \n\t0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x16, 0xb0, 0x0a, \n\t0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x13, 0x10, 0xb0, 0x19, 0xd0, \n\t0xb0, 0x16, 0x10, 0xb0, 0x1d, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, \n\t0x59, 0xb0, 0x13, 0x10, 0xb0, 0x20, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, \n\t0xdc, 0x59, 0xb0, 0x1d, 0x10, 0xb0, 0x23, 0xd0, 0x30, 0x31, 0x01, 0x17, \n\t0x16, 0x06, 0x23, 0x22, 0x26, 0x37, 0x37, 0x33, 0x14, 0x16, 0x33, 0x32, \n\t0x36, 0x35, 0x13, 0x14, 0x06, 0x23, 0x22, 0x26, 0x23, 0x22, 0x06, 0x15, \n\t0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x36, 0x35, 0x02, 0xcb, \n\t0x02, 0x06, 0xa0, 0x88, 0x89, 0xa1, 0x07, 0x02, 0x94, 0x43, 0x4a, 0x47, \n\t0x45, 0x94, 0x5f, 0x47, 0x3a, 0x7c, 0x29, 0x22, 0x2d, 0x58, 0x5e, 0x49, \n\t0x2d, 0x87, 0x2b, 0x20, 0x30, 0x05, 0xb0, 0x06, 0x5b, 0x74, 0x74, 0x5b, \n\t0x06, 0x34, 0x41, 0x41, 0x34, 0x01, 0x0c, 0x4b, 0x6b, 0x4c, 0x34, 0x25, \n\t0x15, 0x4a, 0x6f, 0x4c, 0x33, 0x26, 0x00, 0x00, 0x00, 0x01, 0x00, 0x60, \n\t0xfe, 0x99, 0x01, 0x25, 0x00, 0x9d, 0x00, 0x03, 0x00, 0x06, 0x00, 0xb0, \n\t0x02, 0x2f, 0x30, 0x31, 0x01, 0x23, 0x11, 0x33, 0x01, 0x25, 0xc5, 0xc5, \n\t0xfe, 0x99, 0x02, 0x04, 0x00, 0x01, 0x00, 0x13, 0xfe, 0x63, 0x01, 0xc9, \n\t0x00, 0x43, 0x00, 0x13, 0x00, 0x12, 0x00, 0xb0, 0x06, 0x2f, 0xb1, 0x0d, \n\t0x05, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x37, 0x16, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, \n\t0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0xf8, 0x69, 0x68, 0x85, \n\t0x66, 0x44, 0x60, 0x27, 0x21, 0x1e, 0x37, 0x22, 0x3d, 0x36, 0x46, 0x3b, \n\t0x43, 0x34, 0x8f, 0x4c, 0x63, 0x6e, 0x19, 0x13, 0x7b, 0x0b, 0x0f, 0x30, \n\t0x2a, 0x31, 0x57, 0x2e, 0x00, 0x01, 0xff, 0xbe, 0xfe, 0x4b, 0x01, 0x72, \n\t0x00, 0x9a, 0x00, 0x0f, 0x00, 0x1c, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x08, 0x3e, 0x59, 0xb1, 0x0b, 0x03, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x25, 0x15, \n\t0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, \n\t0x35, 0x35, 0x01, 0x72, 0xac, 0x99, 0x1f, 0x33, 0x1d, 0x0e, 0x0e, 0x40, \n\t0x13, 0x3c, 0x44, 0x9a, 0xf3, 0xa7, 0xb5, 0x09, 0x09, 0xa0, 0x05, 0x07, \n\t0x5e, 0x58, 0xf3, 0x00, 0x00, 0x01, 0xff, 0xa0, 0xff, 0xce, 0x02, 0xca, \n\t0x03, 0x70, 0x00, 0x0f, 0x00, 0x12, 0x00, 0xb0, 0x00, 0x2f, 0xb1, 0x0f, \n\t0x03, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, \n\t0x03, 0x21, 0x32, 0x00, 0x15, 0x06, 0x02, 0x07, 0x27, 0x36, 0x36, 0x35, \n\t0x26, 0x26, 0x23, 0x21, 0x60, 0x01, 0x17, 0xeb, 0x01, 0x28, 0x02, 0xc3, \n\t0xbe, 0x33, 0x80, 0x70, 0x01, 0xb6, 0x96, 0xfe, 0xe9, 0x03, 0x70, 0xff, \n\t0x00, 0xdc, 0x8a, 0xfe, 0xe6, 0x22, 0x94, 0x22, 0x9d, 0x73, 0x93, 0xa4, \n\t0x00, 0x01, 0x00, 0x3b, 0x00, 0x00, 0x02, 0x2a, 0x05, 0xb0, 0x00, 0x05, \n\t0x00, 0x36, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, \n\t0x05, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, \n\t0xb1, 0x00, 0x06, 0x3e, 0x59, 0xb0, 0x05, 0x10, 0xb0, 0x04, 0xb0, 0x0a, \n\t0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb1, 0x03, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x21, 0x23, 0x11, 0x05, \n\t0x35, 0x25, 0x02, 0x2a, 0xc5, 0xfe, 0xd6, 0x01, 0xef, 0x04, 0xf0, 0x04, \n\t0x8e, 0x36, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5b, 0x00, 0x00, 0x04, 0x25, \n\t0x05, 0xc5, 0x00, 0x1a, 0x00, 0x52, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x06, 0x3e, 0x59, 0xb1, 0x19, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x02, 0x19, \n\t0x00, 0x11, 0x12, 0x39, 0xb2, 0x03, 0x00, 0x11, 0x11, 0x12, 0x39, 0xb0, \n\t0x11, 0x10, 0xb1, 0x09, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x11, 0x10, 0xb0, 0x0c, 0xd0, 0xb0, 0x03, 0x10, 0xb0, \n\t0x17, 0xd0, 0x30, 0x31, 0x21, 0x21, 0x35, 0x01, 0x36, 0x36, 0x35, 0x34, \n\t0x26, 0x23, 0x22, 0x06, 0x15, 0x23, 0x27, 0x26, 0x00, 0x33, 0x32, 0x16, \n\t0x15, 0x14, 0x06, 0x07, 0x01, 0x17, 0x21, 0x04, 0x25, 0xfc, 0x51, 0x01, \n\t0xdd, 0x80, 0x5a, 0x7f, 0x69, 0x97, 0x8f, 0xbd, 0x02, 0x05, 0x01, 0x04, \n\t0xe6, 0xc4, 0xe9, 0x8d, 0x7f, 0xfe, 0x81, 0x02, 0x02, 0xbc, 0x87, 0x02, \n\t0x12, 0x8f, 0xa8, 0x58, 0x6d, 0x95, 0x9b, 0x8c, 0x06, 0xbc, 0x01, 0x00, \n\t0xe5, 0xb1, 0x77, 0xef, 0x89, 0xfe, 0x5f, 0x05, 0x00, 0x01, 0x00, 0x74, \n\t0xff, 0xeb, 0x04, 0x24, 0x05, 0xc5, 0x00, 0x2a, 0x00, 0x7e, 0x00, 0xb0, \n\t0x00, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0f, 0x2f, 0x1b, 0xb1, 0x0f, \n\t0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1b, 0x2f, 0x1b, 0xb1, \n\t0x1b, 0x06, 0x3e, 0x59, 0xb2, 0xcf, 0x00, 0x01, 0x5d, 0xb2, 0x1f, 0x00, \n\t0x01, 0x71, 0xb2, 0xbf, 0x00, 0x01, 0x71, 0xb2, 0xef, 0x00, 0x01, 0x5d, \n\t0xb2, 0x7f, 0x00, 0x01, 0x5d, 0xb2, 0x2f, 0x00, 0x01, 0x5d, 0xb0, 0x0f, \n\t0x10, 0xb1, 0x07, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x0f, 0x10, 0xb0, 0x0a, 0xd0, 0xb0, 0x00, 0x10, 0xb1, 0x2a, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x15, \n\t0x2a, 0x00, 0x11, 0x12, 0x39, 0xb0, 0x1b, 0x10, 0xb0, 0x20, 0xd0, 0xb0, \n\t0x1b, 0x10, 0xb1, 0x23, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0x30, 0x31, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, \n\t0x22, 0x06, 0x15, 0x23, 0x27, 0x26, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, \n\t0x06, 0x07, 0x16, 0x16, 0x15, 0x14, 0x04, 0x23, 0x22, 0x24, 0x37, 0x37, \n\t0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x01, \n\t0x99, 0xac, 0x8e, 0x76, 0x86, 0x83, 0x73, 0x8b, 0xbd, 0x02, 0x05, 0xfa, \n\t0xc8, 0xd3, 0xfb, 0x72, 0x72, 0x89, 0x71, 0xfe, 0xef, 0xd3, 0xc7, 0xfe, \n\t0xfb, 0x05, 0x03, 0xbc, 0x8d, 0x7b, 0x86, 0x99, 0x88, 0x92, 0xac, 0x03, \n\t0x33, 0x82, 0x76, 0x7d, 0x82, 0x87, 0x70, 0x06, 0xa5, 0xe7, 0xd7, 0xc7, \n\t0x5a, 0xb3, 0x2f, 0x2b, 0xb8, 0x72, 0xc7, 0xe4, 0xd7, 0xb8, 0x06, 0x73, \n\t0x88, 0x88, 0x85, 0x87, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x46, \n\t0x00, 0x00, 0x04, 0x61, 0x05, 0xb0, 0x00, 0x0a, 0x00, 0x0f, 0x00, 0x48, \n\t0x00, 0xb0, 0x02, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, \n\t0xb1, 0x09, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, \n\t0x1b, 0xb1, 0x04, 0x06, 0x3e, 0x59, 0xb0, 0x02, 0x10, 0xb1, 0x01, 0x02, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x02, 0x10, \n\t0xb0, 0x06, 0xd0, 0xb0, 0x01, 0x10, 0xb0, 0x0b, 0xd0, 0xb0, 0x09, 0x10, \n\t0xb0, 0x0d, 0xd0, 0xb4, 0x8b, 0x0d, 0x9b, 0x0d, 0x02, 0x5d, 0x30, 0x31, \n\t0x01, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x21, 0x35, 0x01, 0x33, 0x01, \n\t0x21, 0x11, 0x27, 0x07, 0x03, 0x98, 0xc9, 0xc9, 0xc4, 0xfd, 0x72, 0x02, \n\t0x82, 0xd0, 0xfd, 0x80, 0x01, 0xbc, 0x06, 0x13, 0x01, 0xea, 0x9a, 0xfe, \n\t0xb0, 0x01, 0x50, 0x6f, 0x03, 0xf1, 0xfc, 0x3a, 0x02, 0xbb, 0x01, 0x2f, \n\t0x00, 0x01, 0x00, 0xa7, 0xff, 0xeb, 0x04, 0x22, 0x05, 0xb0, 0x00, 0x1f, \n\t0x00, 0x59, 0x00, 0xb0, 0x08, 0x2f, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, \n\t0x2f, 0x1b, 0xb1, 0x01, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x06, 0x3e, 0x59, 0xb0, 0x01, 0x10, 0xb1, \n\t0x03, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x0e, 0x10, 0xb0, 0x13, 0xd0, 0xb0, 0x0e, 0x10, 0xb1, 0x16, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x08, 0x10, 0xb1, \n\t0x1c, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, \n\t0x08, 0x10, 0xb0, 0x1f, 0xd0, 0x30, 0x31, 0x13, 0x13, 0x21, 0x15, 0x21, \n\t0x03, 0x36, 0x36, 0x37, 0x36, 0x12, 0x15, 0x14, 0x02, 0x23, 0x22, 0x26, \n\t0x37, 0x37, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, \n\t0x22, 0x06, 0x07, 0xbe, 0x54, 0x02, 0xd9, 0xfd, 0xce, 0x30, 0x2e, 0x71, \n\t0x4a, 0xc9, 0xe7, 0xeb, 0xe1, 0xb9, 0xf6, 0x05, 0x02, 0xb3, 0x88, 0x6d, \n\t0x7d, 0x8a, 0x8c, 0x7b, 0x74, 0x68, 0x18, 0x02, 0x91, 0x03, 0x1f, 0xaf, \n\t0xfe, 0x67, 0x22, 0x2d, 0x02, 0x02, 0xfe, 0xf6, 0xe1, 0xdb, 0xfe, 0xf6, \n\t0xca, 0xc4, 0x06, 0x77, 0x83, 0xb0, 0x99, 0x8d, 0xb3, 0x46, 0x48, 0x00, \n\t0x00, 0x02, 0x00, 0x93, 0xff, 0xeb, 0x04, 0x46, 0x05, 0xc5, 0x00, 0x1a, \n\t0x00, 0x27, 0x00, 0x51, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, \n\t0x1b, 0xb1, 0x00, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x14, \n\t0x2f, 0x1b, 0xb1, 0x14, 0x06, 0x3e, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x07, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0e, \n\t0x14, 0x00, 0x11, 0x12, 0x39, 0xb0, 0x0e, 0x2f, 0xb1, 0x1b, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x14, 0x10, 0xb1, \n\t0x22, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, \n\t0x31, 0x01, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, \n\t0x15, 0x36, 0x36, 0x33, 0x32, 0x12, 0x15, 0x14, 0x02, 0x23, 0x22, 0x00, \n\t0x11, 0x11, 0x10, 0x00, 0x13, 0x22, 0x06, 0x07, 0x15, 0x14, 0x16, 0x33, \n\t0x32, 0x36, 0x35, 0x34, 0x26, 0x02, 0xb2, 0x4b, 0x93, 0x30, 0x2a, 0x31, \n\t0x6b, 0x48, 0x9c, 0xbf, 0x40, 0xa5, 0x5f, 0xc3, 0xe8, 0xf7, 0xce, 0xd6, \n\t0xfe, 0xe8, 0x01, 0x38, 0xa4, 0x65, 0x8e, 0x25, 0xaa, 0x80, 0x79, 0x87, \n\t0x91, 0x05, 0xc5, 0x22, 0x1a, 0x97, 0x19, 0x1f, 0xfa, 0xc9, 0x17, 0x38, \n\t0x3f, 0xfe, 0xf2, 0xcf, 0xe2, 0xfe, 0xe3, 0x01, 0x36, 0x01, 0x1a, 0x01, \n\t0x16, 0x01, 0x18, 0x01, 0x5c, 0xfd, 0x6f, 0x52, 0x44, 0x76, 0xc9, 0xda, \n\t0xcd, 0x98, 0x90, 0xba, 0x00, 0x01, 0x00, 0x1e, 0x00, 0x00, 0x03, 0xce, \n\t0x05, 0xb0, 0x00, 0x0c, 0x00, 0x2c, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x06, 0x3e, 0x59, 0xb0, 0x0b, 0x10, \n\t0xb1, 0x09, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0x30, 0x31, 0x01, 0x02, 0x02, 0x03, 0x07, 0x23, 0x37, 0x12, 0x12, 0x13, \n\t0x21, 0x35, 0x21, 0x03, 0xce, 0xf3, 0xaa, 0x25, 0x10, 0xc5, 0x10, 0x27, \n\t0xdf, 0xc0, 0xfd, 0x11, 0x03, 0xb0, 0x05, 0x15, 0xfe, 0xc5, 0xfe, 0x1b, \n\t0xfe, 0xa8, 0x9d, 0x9d, 0x01, 0x58, 0x02, 0x1e, 0x01, 0x02, 0x9b, 0x00, \n\t0x00, 0x03, 0x00, 0x7d, 0xff, 0xeb, 0x04, 0x58, 0x05, 0xc5, 0x00, 0x17, \n\t0x00, 0x23, 0x00, 0x2f, 0x00, 0x63, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x15, 0x2f, 0x1b, 0xb1, 0x15, 0x0c, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x06, 0x3e, 0x59, 0xb2, 0x2d, 0x09, \n\t0x15, 0x11, 0x12, 0x39, 0xb0, 0x2d, 0x2f, 0xb2, 0xcf, 0x2d, 0x01, 0x5d, \n\t0xb1, 0x1b, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb2, 0x03, 0x1b, 0x2d, 0x11, 0x12, 0x39, 0xb0, 0x03, 0x10, 0xb0, 0x0f, \n\t0xd0, 0xb0, 0x09, 0x10, 0xb1, 0x21, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x15, 0x10, 0xb1, 0x27, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x14, 0x06, \n\t0x07, 0x16, 0x16, 0x15, 0x14, 0x04, 0x23, 0x22, 0x24, 0x35, 0x34, 0x36, \n\t0x37, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x03, 0x34, 0x26, \n\t0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x03, 0x34, 0x26, \n\t0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x04, 0x2f, 0x85, \n\t0x72, 0x83, 0x9d, 0xfe, 0xee, 0xdb, 0xdf, 0xfe, 0xf1, 0x99, 0x84, 0x72, \n\t0x82, 0xf8, 0xcb, 0xc9, 0xfd, 0x9c, 0xaa, 0x80, 0x83, 0xa4, 0xa2, 0x87, \n\t0x83, 0xa5, 0x29, 0x91, 0x70, 0x72, 0x8c, 0x8d, 0x73, 0x71, 0x8e, 0x04, \n\t0x34, 0x72, 0xab, 0x2a, 0x2c, 0xbc, 0x7b, 0xca, 0xd5, 0xd5, 0xca, 0x7c, \n\t0xbb, 0x2c, 0x29, 0xac, 0x72, 0xc0, 0xd1, 0xd1, 0xfc, 0x9a, 0x77, 0x9b, \n\t0x99, 0x79, 0x7c, 0x8d, 0x8e, 0x03, 0x1d, 0x6c, 0x8e, 0x89, 0x71, 0x6f, \n\t0x86, 0x86, 0x00, 0x00, 0x00, 0x02, 0x00, 0x62, 0xff, 0xeb, 0x04, 0x10, \n\t0x05, 0xc5, 0x00, 0x1a, 0x00, 0x27, 0x00, 0x4a, 0x00, 0xb0, 0x07, 0x2f, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x0c, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x14, 0x2f, 0x1b, 0xb1, 0x14, 0x06, \n\t0x3e, 0x59, 0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x07, 0x10, 0xb1, 0x1b, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0d, 0x10, 0xb1, 0x22, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x25, 0x32, \n\t0x36, 0x35, 0x35, 0x06, 0x06, 0x23, 0x22, 0x02, 0x35, 0x34, 0x00, 0x33, \n\t0x32, 0x00, 0x11, 0x11, 0x10, 0x00, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, \n\t0x16, 0x13, 0x32, 0x36, 0x37, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, \n\t0x14, 0x16, 0x02, 0x0e, 0x90, 0xad, 0x31, 0x93, 0x5a, 0xd3, 0xf8, 0x01, \n\t0x07, 0xbc, 0xe4, 0x01, 0x07, 0xfe, 0xe3, 0xe5, 0x4d, 0x9f, 0x3f, 0x1e, \n\t0x3b, 0x7f, 0x72, 0x6d, 0x91, 0x20, 0x93, 0x8d, 0x6c, 0x98, 0x8d, 0x85, \n\t0xda, 0xd7, 0x42, 0x47, 0x49, 0x01, 0x05, 0xe5, 0xdb, 0x01, 0x18, 0xfe, \n\t0xe3, 0xfe, 0xeb, 0xfe, 0xa5, 0xfe, 0xe3, 0xfe, 0xd0, 0x1d, 0x1e, 0x97, \n\t0x1f, 0x19, 0x01, 0xfd, 0x5e, 0x49, 0x7e, 0xbf, 0xc4, 0xc1, 0x97, 0x96, \n\t0xba, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x99, 0x00, 0x00, 0x04, 0x1f, \n\t0x04, 0x8d, 0x00, 0x0a, 0x00, 0x13, 0x00, 0x3e, 0x00, 0xb0, 0x00, 0x2f, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, 0x0e, 0x3e, \n\t0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x06, \n\t0x3e, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x0b, 0x02, 0xb0, 0x0a, 0x2b, 0x58, \n\t0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x12, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x11, \n\t0x23, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x25, 0x21, 0x32, \n\t0x36, 0x35, 0x34, 0x26, 0x23, 0x21, 0x01, 0x5e, 0xc5, 0x01, 0xd2, 0xcb, \n\t0xe9, 0xe9, 0xcb, 0xfe, 0xf3, 0x01, 0x0d, 0x75, 0x79, 0x79, 0x75, 0xfe, \n\t0xf3, 0x01, 0xa4, 0xfe, 0x5c, 0x04, 0x8d, 0xd0, 0xa5, 0xa6, 0xce, 0x9a, \n\t0x7e, 0x5a, 0x5c, 0x82, 0x00, 0x01, 0x00, 0x5a, 0xff, 0xef, 0x03, 0xa8, \n\t0x04, 0x8d, 0x00, 0x1f, 0x00, 0x60, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x06, 0x3e, 0x59, 0xb0, 0x01, 0x10, \n\t0xb1, 0x03, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb2, 0x08, 0x0e, 0x01, 0x11, 0x12, 0x39, 0xb0, 0x08, 0x2f, 0xb0, 0x0e, \n\t0x10, 0xb0, 0x13, 0xd0, 0xb0, 0x0e, 0x10, 0xb1, 0x16, 0x02, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x08, 0x10, 0xb1, 0x1c, \n\t0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x08, \n\t0x10, 0xb0, 0x1f, 0xd0, 0x30, 0x31, 0x13, 0x13, 0x21, 0x15, 0x21, 0x03, \n\t0x36, 0x36, 0x37, 0x36, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x3f, \n\t0x02, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, \n\t0x07, 0x87, 0x47, 0x02, 0xa6, 0xfe, 0x05, 0x21, 0x25, 0x72, 0x38, 0xb5, \n\t0xcc, 0xd2, 0xdb, 0xb2, 0xef, 0x05, 0x01, 0xbd, 0x7b, 0x63, 0x76, 0x72, \n\t0x6f, 0x65, 0x66, 0x63, 0x18, 0x01, 0xf8, 0x02, 0x95, 0xa4, 0xfe, 0xca, \n\t0x19, 0x25, 0x02, 0x03, 0xca, 0xb9, 0xb2, 0xd2, 0xa1, 0x9d, 0x06, 0x0e, \n\t0x53, 0x67, 0x7c, 0x6e, 0x6b, 0x7d, 0x39, 0x35, 0x00, 0x02, 0x00, 0x78, \n\t0xff, 0xf5, 0x03, 0x04, 0x03, 0x2c, 0x00, 0x1a, 0x00, 0x27, 0x00, 0x51, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x10, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x14, 0x2f, 0x1b, 0xb1, 0x14, \n\t0x06, 0x3e, 0x59, 0xb0, 0x00, 0x10, 0xb1, 0x07, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, 0x0e, 0x14, 0x00, 0x11, 0x12, \n\t0x39, 0xb0, 0x0e, 0x2f, 0xb1, 0x1b, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x14, 0x10, 0xb1, 0x22, 0x01, 0xb0, 0x0a, \n\t0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x32, 0x16, \n\t0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x15, 0x36, 0x36, 0x33, \n\t0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x35, 0x34, 0x36, \n\t0x13, 0x22, 0x06, 0x07, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, \n\t0x26, 0x01, 0xde, 0x35, 0x6c, 0x2b, 0x1e, 0x27, 0x52, 0x33, 0x53, 0x69, \n\t0x24, 0x65, 0x3f, 0x84, 0x94, 0xb6, 0x90, 0x8d, 0xb9, 0xcd, 0x80, 0x40, \n\t0x53, 0x0e, 0x56, 0x44, 0x47, 0x54, 0x4a, 0x03, 0x2c, 0x13, 0x10, 0x7f, \n\t0x10, 0x0f, 0x5e, 0x4e, 0x42, 0x22, 0x26, 0x8c, 0x7a, 0x76, 0x92, 0xaa, \n\t0x87, 0xd6, 0x87, 0xa9, 0xfe, 0x56, 0x2c, 0x26, 0x0a, 0x4e, 0x61, 0x4b, \n\t0x3b, 0x3f, 0x46, 0x00, 0x00, 0x01, 0x00, 0x72, 0xff, 0xf5, 0x02, 0xf6, \n\t0x03, 0x21, 0x00, 0x1f, 0x00, 0x5e, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x01, 0x2f, 0x1b, 0xb1, 0x01, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x06, 0x3e, 0x59, 0xb0, 0x01, 0x10, \n\t0xb1, 0x03, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb2, 0x08, 0x0e, 0x01, 0x11, 0x12, 0x39, 0xb0, 0x08, 0x2f, 0xb1, 0x1c, \n\t0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0e, \n\t0x10, 0xb1, 0x16, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb2, 0x1f, 0x1c, 0x16, 0x11, 0x12, 0x39, 0xb0, 0x1f, 0x10, 0xb0, \n\t0x13, 0xd0, 0x30, 0x31, 0x13, 0x13, 0x21, 0x15, 0x21, 0x07, 0x36, 0x36, \n\t0x37, 0x36, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x3f, 0x02, 0x14, \n\t0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x92, \n\t0x34, 0x02, 0x04, 0xfe, 0x95, 0x1a, 0x1e, 0x4f, 0x2a, 0x84, 0x96, 0x9f, \n\t0xa6, 0x89, 0xb6, 0x06, 0x01, 0xa2, 0x52, 0x44, 0x4e, 0x4c, 0x4d, 0x43, \n\t0x41, 0x43, 0x0f, 0x01, 0x5a, 0x01, 0xc7, 0x85, 0xb9, 0x11, 0x19, 0x01, \n\t0x02, 0x91, 0x80, 0x7a, 0x90, 0x6e, 0x6a, 0x06, 0x0a, 0x30, 0x36, 0x45, \n\t0x42, 0x42, 0x51, 0x22, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x57, \n\t0x00, 0x00, 0x03, 0x28, 0x03, 0x21, 0x00, 0x0a, 0x00, 0x0f, 0x00, 0x45, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x10, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, \n\t0x06, 0x3e, 0x59, 0xb2, 0x02, 0x04, 0x09, 0x11, 0x12, 0x39, 0xb0, 0x02, \n\t0x2f, 0xb1, 0x01, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x02, 0x10, 0xb0, 0x06, 0xd0, 0xb0, 0x01, 0x10, 0xb0, 0x0b, \n\t0xd0, 0xb0, 0x09, 0x10, 0xb0, 0x0e, 0xd0, 0x30, 0x31, 0x01, 0x33, 0x15, \n\t0x23, 0x15, 0x23, 0x35, 0x21, 0x27, 0x01, 0x33, 0x01, 0x33, 0x11, 0x27, \n\t0x07, 0x02, 0xaa, 0x7e, 0x7e, 0xaa, 0xfe, 0x5f, 0x08, 0x01, 0xa6, 0xad, \n\t0xfe, 0x63, 0xf3, 0x06, 0x0d, 0x01, 0x1a, 0x82, 0x98, 0x98, 0x66, 0x02, \n\t0x23, 0xfd, 0xf9, 0x01, 0x36, 0x01, 0x16, 0x00, 0x00, 0x01, 0x00, 0x6a, \n\t0xff, 0xf5, 0x02, 0xe4, 0x03, 0x2c, 0x00, 0x2a, 0x00, 0x80, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x0e, 0x2f, 0x1b, 0xb1, 0x0e, 0x10, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x1a, 0x2f, 0x1b, 0xb1, 0x1a, 0x06, 0x3e, \n\t0x59, 0xb0, 0x0e, 0x10, 0xb1, 0x06, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x0e, 0x10, 0xb0, 0x09, 0xd0, 0xb2, 0x2a, \n\t0x1a, 0x0e, 0x11, 0x12, 0x39, 0xb0, 0x2a, 0x2f, 0xb4, 0x0f, 0x2a, 0x1f, \n\t0x2a, 0x02, 0x5d, 0xb6, 0x2f, 0x2a, 0x3f, 0x2a, 0x4f, 0x2a, 0x03, 0x71, \n\t0xb2, 0xff, 0x2a, 0x01, 0x71, 0xb4, 0x0f, 0x2a, 0x1f, 0x2a, 0x02, 0x72, \n\t0xb1, 0x29, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb2, 0x14, 0x29, 0x2a, 0x11, 0x12, 0x39, 0xb0, 0x1a, 0x10, 0xb0, 0x1f, \n\t0xd0, 0xb0, 0x1a, 0x10, 0xb1, 0x22, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x32, 0x36, 0x35, 0x34, 0x26, \n\t0x23, 0x22, 0x06, 0x15, 0x23, 0x27, 0x26, 0x36, 0x33, 0x32, 0x16, 0x15, \n\t0x14, 0x06, 0x07, 0x16, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x37, \n\t0x37, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, \n\t0x35, 0x01, 0xa8, 0x43, 0x41, 0x49, 0x45, 0x38, 0x45, 0xa2, 0x02, 0x06, \n\t0xa9, 0x7e, 0x91, 0xa8, 0x47, 0x3e, 0x46, 0x4c, 0xb4, 0x92, 0x7f, 0xb5, \n\t0x06, 0x01, 0xa3, 0x4b, 0x3f, 0x48, 0x54, 0x49, 0x49, 0x84, 0x01, 0xd7, \n\t0x39, 0x34, 0x2b, 0x3a, 0x30, 0x28, 0x06, 0x5e, 0x77, 0x77, 0x6e, 0x37, \n\t0x5b, 0x1a, 0x17, 0x60, 0x44, 0x6f, 0x7c, 0x74, 0x6f, 0x06, 0x2e, 0x39, \n\t0x3b, 0x30, 0x3e, 0x39, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x71, \n\t0x00, 0x00, 0x02, 0xca, 0x03, 0x2c, 0x00, 0x1a, 0x00, 0x4e, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x11, 0x2f, 0x1b, 0xb1, 0x11, 0x10, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x06, 0x3e, \n\t0x59, 0xb1, 0x19, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x02, 0xd0, 0xb2, 0x03, 0x00, 0x11, 0x11, 0x12, 0x39, 0xb0, \n\t0x11, 0x10, 0xb1, 0x09, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0xb0, 0x11, 0x10, 0xb0, 0x0c, 0xd0, 0xb0, 0x03, 0x10, 0xb0, \n\t0x17, 0xd0, 0x30, 0x31, 0x21, 0x21, 0x35, 0x01, 0x36, 0x36, 0x35, 0x34, \n\t0x26, 0x23, 0x22, 0x06, 0x15, 0x23, 0x27, 0x26, 0x36, 0x33, 0x32, 0x16, \n\t0x15, 0x14, 0x06, 0x07, 0x07, 0x17, 0x21, 0x02, 0xca, 0xfd, 0xb0, 0x01, \n\t0x2e, 0x45, 0x2c, 0x39, 0x3a, 0x43, 0x49, 0xa1, 0x02, 0x06, 0xa8, 0x8d, \n\t0x87, 0x98, 0x59, 0x74, 0x99, 0x02, 0x01, 0x69, 0x82, 0x01, 0x06, 0x3c, \n\t0x4b, 0x2a, 0x32, 0x3e, 0x40, 0x32, 0x06, 0x63, 0x8c, 0x80, 0x74, 0x50, \n\t0x70, 0x69, 0x87, 0x06, 0x00, 0x03, 0x00, 0x9b, 0x04, 0x3d, 0x02, 0x74, \n\t0x06, 0x72, 0x00, 0x04, 0x00, 0x10, 0x00, 0x1c, 0x00, 0x4f, 0x00, 0xb0, \n\t0x0e, 0x2f, 0xb2, 0x2f, 0x0e, 0x01, 0x71, 0xb2, 0x3f, 0x0e, 0x01, 0x5d, \n\t0xb2, 0x7f, 0x0e, 0x01, 0x5d, 0xb2, 0x5f, 0x0e, 0x01, 0x5d, 0xb0, 0x1a, \n\t0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x08, 0xb0, 0x0a, \n\t0x2b, 0x58, 0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x03, 0xb0, 0x0a, 0x2b, 0x58, \n\t0xd8, 0x1b, 0xdc, 0x59, 0xb0, 0x00, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, \n\t0xdc, 0x59, 0xb0, 0x0e, 0x10, 0xb0, 0x14, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, \n\t0x1b, 0xdc, 0x59, 0x30, 0x31, 0x01, 0x33, 0x17, 0x07, 0x23, 0x07, 0x34, \n\t0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x37, 0x14, \n\t0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x01, 0xab, \n\t0xc7, 0x02, 0xd8, 0x81, 0x80, 0x66, 0x49, 0x46, 0x64, 0x63, 0x47, 0x49, \n\t0x66, 0x58, 0x33, 0x24, 0x22, 0x31, 0x31, 0x22, 0x24, 0x33, 0x06, 0x72, \n\t0x06, 0xb3, 0xd8, 0x48, 0x5f, 0x5f, 0x48, 0x48, 0x5c, 0x5c, 0x48, 0x23, \n\t0x31, 0x30, 0x24, 0x25, 0x33, 0x33, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5f, \n\t0x00, 0x00, 0x01, 0x8c, 0x03, 0x2c, 0x00, 0x05, 0x00, 0x36, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x05, 0x2f, 0x1b, 0xb1, 0x05, 0x10, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x00, 0x2f, 0x1b, 0xb1, 0x00, 0x06, 0x3e, \n\t0x59, 0xb0, 0x05, 0x10, 0xb0, 0x04, 0xb0, 0x0a, 0x2b, 0x58, 0xd8, 0x1b, \n\t0xdc, 0x59, 0xb1, 0x03, 0x05, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, \n\t0xf4, 0x59, 0x30, 0x31, 0x21, 0x23, 0x11, 0x23, 0x35, 0x25, 0x01, 0x8c, \n\t0xae, 0x7f, 0x01, 0x2d, 0x02, 0x8f, 0x86, 0x17, 0x00, 0x02, 0x00, 0x78, \n\t0xff, 0xf5, 0x03, 0x1e, 0x03, 0x2c, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x3b, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x10, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x03, 0x2f, 0x1b, 0xb1, 0x03, \n\t0x06, 0x3e, 0x59, 0xb0, 0x0a, 0x10, 0xb1, 0x11, 0x01, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb0, 0x03, 0x10, 0xb1, 0x18, 0x01, \n\t0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, \n\t0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, \n\t0x15, 0x27, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x15, 0x14, 0x16, 0x33, \n\t0x32, 0x36, 0x35, 0x03, 0x1e, 0xbb, 0x97, 0x99, 0xbb, 0xba, 0x98, 0x98, \n\t0xbc, 0xad, 0x59, 0x4e, 0x4e, 0x58, 0x59, 0x4f, 0x4d, 0x58, 0x01, 0x1b, \n\t0x88, 0x9e, 0x9e, 0x88, 0xeb, 0x86, 0xa0, 0xa0, 0x86, 0x01, 0x4c, 0x56, \n\t0x56, 0x4c, 0xec, 0x4e, 0x56, 0x56, 0x4e, 0x00, 0x00, 0x02, 0x00, 0x47, \n\t0xff, 0xef, 0x03, 0xa0, 0x04, 0x9d, 0x00, 0x1a, 0x00, 0x27, 0x00, 0x4e, \n\t0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0d, 0x2f, 0x1b, 0xb1, 0x0d, 0x0e, \n\t0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x14, 0x2f, 0x1b, 0xb1, 0x14, \n\t0x06, 0x3e, 0x59, 0xb1, 0x00, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb2, 0x07, 0x14, 0x0d, 0x11, 0x12, 0x39, 0xb0, 0x07, \n\t0x2f, 0xb1, 0x1b, 0x05, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, \n\t0x59, 0xb0, 0x0d, 0x10, 0xb1, 0x22, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, \n\t0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x25, 0x32, 0x36, 0x35, 0x35, 0x06, \n\t0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, \n\t0x14, 0x04, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x13, 0x32, 0x36, \n\t0x37, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x01, 0xde, \n\t0x6c, 0x91, 0x2d, 0x7f, 0x48, 0xc3, 0xdd, 0xf0, 0xbe, 0xb9, 0xf2, 0xff, \n\t0x00, 0xc2, 0x44, 0x94, 0x43, 0x1f, 0x3c, 0x75, 0x5b, 0x58, 0x7c, 0x19, \n\t0x85, 0x63, 0x66, 0x80, 0x74, 0x87, 0x94, 0x6e, 0x75, 0x32, 0x34, 0xcf, \n\t0xaf, 0xa6, 0xe1, 0xf9, 0xc3, 0xfe, 0xa9, 0xb5, 0xe6, 0x1a, 0x18, 0x95, \n\t0x1a, 0x15, 0x01, 0xa3, 0x4a, 0x36, 0x37, 0x7c, 0xa7, 0x92, 0x5c, 0x66, \n\t0x86, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x58, 0xff, 0xef, 0x03, 0xc9, \n\t0x04, 0x9d, 0x00, 0x17, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x6a, 0x00, 0xb0, \n\t0x00, 0x45, 0x58, 0xb0, 0x15, 0x2f, 0x1b, 0xb1, 0x15, 0x0e, 0x3e, 0x59, \n\t0xb0, 0x00, 0x45, 0x58, 0xb0, 0x09, 0x2f, 0x1b, 0xb1, 0x09, 0x06, 0x3e, \n\t0x59, 0xb2, 0x2d, 0x09, 0x15, 0x11, 0x12, 0x39, 0xb0, 0x2d, 0x2f, 0xb2, \n\t0xaf, 0x2d, 0x01, 0x5d, 0xb4, 0x1f, 0x2d, 0x2f, 0x2d, 0x02, 0x5d, 0xb1, \n\t0x1b, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0xb2, \n\t0x03, 0x1b, 0x2d, 0x11, 0x12, 0x39, 0xb0, 0x03, 0x10, 0xb0, 0x0f, 0xd0, \n\t0xb0, 0x09, 0x10, 0xb1, 0x21, 0x02, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, \n\t0x1b, 0xf4, 0x59, 0xb0, 0x15, 0x10, 0xb1, 0x27, 0x02, 0xb0, 0x0a, 0x2b, \n\t0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x14, 0x06, 0x07, \n\t0x16, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, \n\t0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x03, 0x34, 0x26, 0x23, \n\t0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x03, 0x34, 0x26, 0x23, \n\t0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x03, 0xa6, 0x66, 0x56, \n\t0x66, 0x79, 0xf7, 0xb9, 0xc2, 0xff, 0x7b, 0x6a, 0x5b, 0x68, 0xe9, 0xb4, \n\t0xac, 0xe3, 0xa3, 0x8b, 0x61, 0x69, 0x91, 0x91, 0x6b, 0x62, 0x88, 0x23, \n\t0x77, 0x52, 0x5d, 0x7b, 0x7d, 0x5d, 0x53, 0x74, 0x03, 0x5c, 0x57, 0x84, \n\t0x25, 0x27, 0x90, 0x5e, 0xa2, 0xb6, 0xb6, 0xa2, 0x5e, 0x91, 0x26, 0x25, \n\t0x84, 0x57, 0x99, 0xa8, 0xa8, 0xfd, 0x56, 0x54, 0x6f, 0x6f, 0x54, 0x57, \n\t0x6d, 0x6d, 0x02, 0x64, 0x4a, 0x62, 0x5e, 0x4e, 0x4d, 0x63, 0x63, 0x00, \n\t0x00, 0x01, 0x00, 0x47, 0x00, 0x00, 0x03, 0x67, 0x04, 0x8d, 0x00, 0x0c, \n\t0x00, 0x2c, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x0b, 0x2f, 0x1b, 0xb1, \n\t0x0b, 0x0e, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, 0xb0, 0x04, 0x2f, 0x1b, \n\t0xb1, 0x04, 0x06, 0x3e, 0x59, 0xb0, 0x0b, 0x10, 0xb1, 0x09, 0x02, 0xb0, \n\t0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, 0x30, 0x31, 0x01, 0x06, \n\t0x02, 0x11, 0x15, 0x23, 0x35, 0x10, 0x12, 0x37, 0x21, 0x35, 0x21, 0x03, \n\t0x67, 0xbd, 0xa3, 0xc5, 0xe7, 0x8e, 0xfd, 0x90, 0x03, 0x20, 0x03, 0xf4, \n\t0xe8, 0xfe, 0xc0, 0xfe, 0xed, 0xb9, 0xb9, 0x01, 0x0c, 0x01, 0x96, 0x99, \n\t0x99, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5f, 0x00, 0x00, 0x02, 0xac, \n\t0x03, 0x21, 0x00, 0x0c, 0x00, 0x2f, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0b, 0x2f, 0x1b, 0xb1, 0x0b, 0x10, 0x3e, 0x59, 0xb0, 0x00, 0x45, 0x58, \n\t0xb0, 0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x06, 0x3e, 0x59, 0xb0, 0x0b, 0x10, \n\t0xb1, 0x09, 0x01, 0xb0, 0x0a, 0x2b, 0x58, 0x21, 0xd8, 0x1b, 0xf4, 0x59, \n\t0xb0, 0x00, 0xd0, 0x30, 0x31, 0x01, 0x06, 0x06, 0x15, 0x15, 0x23, 0x35, \n\t0x34, 0x12, 0x37, 0x21, 0x35, 0x21, 0x02, 0xac, 0x86, 0x6f, 0xac, 0x9b, \n\t0x59, 0xfe, 0x60, 0x02, 0x4d, 0x02, 0x9e, 0x9e, 0xcb, 0xb6, 0x7f, 0x7f, \n\t0xb5, 0x01, 0x17, 0x53, 0x83, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x81, \n\t0x04, 0xa4, 0x02, 0xd8, 0x05, 0xb0, 0x02, 0x06, 0x01, 0x54, 0x00, 0x00, \n\t0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x04, 0x31, 0x04, 0x8d, 0x02, 0x26, \n\t0x03, 0x8c, 0x00, 0x00, 0x01, 0x07, 0x03, 0x82, 0xff, 0x64, 0xff, 0x7d, \n\t0x00, 0x2f, 0x00, 0xb2, 0x1f, 0x16, 0x01, 0x71, 0xb2, 0x9f, 0x16, 0x01, \n\t0x71, 0xb2, 0x6f, 0x16, 0x01, 0x72, 0xb4, 0x1f, 0x16, 0x2f, 0x16, 0x02, \n\t0x5d, 0xb4, 0x0f, 0x16, 0x1f, 0x16, 0x02, 0x72, 0xb2, 0x4f, 0x16, 0x01, \n\t0x71, 0xb2, 0xff, 0x16, 0x01, 0x5d, 0xb2, 0x5f, 0x16, 0x01, 0x5d, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x04, 0x31, \n\t0x04, 0x8d, 0x02, 0x26, 0x03, 0x8c, 0x00, 0x00, 0x01, 0x07, 0x03, 0x82, \n\t0xff, 0x64, 0xff, 0x7d, 0x00, 0x34, 0x00, 0xb2, 0xaf, 0x16, 0x01, 0x5d, \n\t0xb2, 0x1f, 0x16, 0x01, 0x71, 0xb2, 0x9f, 0x16, 0x01, 0x71, 0xb2, 0x6f, \n\t0x16, 0x01, 0x72, 0xb4, 0x0f, 0x16, 0x1f, 0x16, 0x02, 0x72, 0xb2, 0x4f, \n\t0x16, 0x01, 0x71, 0xb2, 0xff, 0x16, 0x01, 0x5d, 0xb2, 0x5f, 0x16, 0x01, \n\t0x5d, 0xb4, 0x1f, 0x16, 0x2f, 0x16, 0x02, 0x5d, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x47, 0x00, 0x00, 0x03, 0xd1, 0x04, 0x8d, 0x02, 0x26, \n\t0x03, 0x7b, 0x00, 0x00, 0x01, 0x06, 0x03, 0x82, 0x2d, 0xfa, 0x00, 0x08, \n\t0x00, 0xb2, 0x00, 0x0a, 0x01, 0x5d, 0x30, 0x31, 0xff, 0xff, 0x00, 0x27, \n\t0x00, 0x00, 0x04, 0x8a, 0x05, 0xdf, 0x02, 0x26, 0x03, 0x91, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x43, 0x00, 0xbe, 0x00, 0x1a, 0x00, 0x2f, 0x00, 0xb6, \n\t0xbf, 0x0c, 0xcf, 0x0c, 0xdf, 0x0c, 0x03, 0x5d, 0xb2, 0x9f, 0x0c, 0x01, \n\t0x71, 0xb2, 0xdf, 0x0c, 0x01, 0x71, 0xb2, 0x1f, 0x0c, 0x01, 0x5d, 0xb2, \n\t0xbf, 0x0c, 0x01, 0x71, 0xb2, 0x2f, 0x0c, 0x01, 0x71, 0xb2, 0x8f, 0x0c, \n\t0x01, 0x5d, 0xb2, 0x6f, 0x0c, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x27, 0x00, 0x00, 0x04, 0x8a, 0x05, 0xdb, 0x02, 0x26, \n\t0x03, 0x91, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, 0x01, 0x78, 0x00, 0x16, \n\t0x00, 0x4a, 0x00, 0xb4, 0xbf, 0x0f, 0xcf, 0x0f, 0x02, 0x5d, 0xb2, 0x9f, \n\t0x0f, 0x01, 0x71, 0xb2, 0xef, 0x0f, 0x01, 0x71, 0xb2, 0x2f, 0x0f, 0x01, \n\t0x71, 0xb2, 0x8f, 0x0f, 0x01, 0x5d, 0xb2, 0x6f, 0x0f, 0x01, 0x5d, 0xb2, \n\t0xdf, 0x10, 0x01, 0x71, 0xb2, 0x1f, 0x10, 0x01, 0x5d, 0xb2, 0xff, 0x10, \n\t0x01, 0x71, 0x40, 0x0b, 0x0f, 0x10, 0x1f, 0x10, 0x2f, 0x10, 0x3f, 0x10, \n\t0x4f, 0x10, 0x05, 0x72, 0xb2, 0xbf, 0x10, 0x01, 0x71, 0xb2, 0xdf, 0x10, \n\t0x01, 0x5d, 0x30, 0x31, 0xff, 0xff, 0x00, 0x27, 0x00, 0x00, 0x04, 0x8a, \n\t0x06, 0x05, 0x02, 0x26, 0x03, 0x91, 0x00, 0x00, 0x01, 0x06, 0x01, 0x52, \n\t0x78, 0x1a, 0x00, 0x1c, 0x00, 0xb2, 0x6f, 0x0d, 0x01, 0x5d, 0xb2, 0xdf, \n\t0x10, 0x01, 0x71, 0xb2, 0x1f, 0x10, 0x01, 0x5d, 0xb2, 0xbf, 0x10, 0x01, \n\t0x5d, 0xb2, 0x8f, 0x10, 0x01, 0x5d, 0x30, 0x31, 0xff, 0xff, 0x00, 0x27, \n\t0x00, 0x00, 0x04, 0x8a, 0x06, 0x11, 0x02, 0x26, 0x03, 0x91, 0x00, 0x00, \n\t0x01, 0x06, 0x01, 0x58, 0x73, 0x1e, 0x00, 0x25, 0x00, 0x40, 0x0b, 0x0f, \n\t0x0f, 0x1f, 0x0f, 0x2f, 0x0f, 0x3f, 0x0f, 0x4f, 0x0f, 0x05, 0x71, 0xb2, \n\t0x1f, 0x0f, 0x01, 0x5d, 0xb2, 0x8f, 0x0f, 0x01, 0x71, 0xb2, 0x8f, 0x0f, \n\t0x01, 0x5d, 0xb2, 0x6f, 0x0f, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x27, 0x00, 0x00, 0x04, 0x8a, 0x05, 0xca, 0x02, 0x26, \n\t0x03, 0x91, 0x00, 0x00, 0x01, 0x06, 0x00, 0x6a, 0x53, 0x1a, 0x00, 0x5b, \n\t0x00, 0xb2, 0x0f, 0x0d, 0x01, 0x71, 0x40, 0x09, 0x8f, 0x0d, 0x9f, 0x0d, \n\t0xaf, 0x0d, 0xbf, 0x0d, 0x04, 0x71, 0xb2, 0x1f, 0x0d, 0x01, 0x5d, 0xb2, \n\t0xdf, 0x0d, 0x01, 0x71, 0xb4, 0x5f, 0x0d, 0x6f, 0x0d, 0x02, 0x71, 0xb2, \n\t0x8f, 0x0d, 0x01, 0x5d, 0xb2, 0x6f, 0x0d, 0x01, 0x5d, 0xb2, 0x8f, 0x10, \n\t0x01, 0x5d, 0xb4, 0x5f, 0x10, 0x6f, 0x10, 0x02, 0x71, 0xb2, 0xdf, 0x10, \n\t0x01, 0x71, 0x40, 0x09, 0x8f, 0x10, 0x9f, 0x10, 0xaf, 0x10, 0xbf, 0x10, \n\t0x04, 0x71, 0xb2, 0x0f, 0x10, 0x01, 0x71, 0xb2, 0x6f, 0x10, 0x01, 0x5d, \n\t0xb2, 0x1f, 0x10, 0x01, 0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x27, \n\t0x00, 0x00, 0x04, 0x8a, 0x06, 0x49, 0x02, 0x26, 0x03, 0x91, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x56, 0x00, 0xff, 0x00, 0x67, 0x00, 0x35, 0x00, 0xb2, \n\t0x2f, 0x15, 0x01, 0x71, 0xb2, 0x0f, 0x15, 0x01, 0x5d, 0xb2, 0x4f, 0x15, \n\t0x01, 0x71, 0xb2, 0xdf, 0x15, 0x01, 0x5d, 0xb2, 0xbf, 0x15, 0x01, 0x5d, \n\t0xb2, 0xdf, 0x1b, 0x01, 0x5d, 0xb2, 0x4f, 0x1b, 0x01, 0x71, 0xb2, 0x2f, \n\t0x1b, 0x01, 0x71, 0xb2, 0xbf, 0x1b, 0x01, 0x5d, 0xb2, 0x0f, 0x1b, 0x01, \n\t0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x27, 0x00, 0x00, 0x04, 0x8a, \n\t0x06, 0xe2, 0x02, 0x26, 0x03, 0x91, 0x00, 0x00, 0x01, 0x07, 0x03, 0xad, \n\t0x01, 0x0e, 0x00, 0x70, 0x00, 0x1c, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x04, 0x2f, 0x1b, 0xb1, 0x04, 0x0e, 0x3e, 0x59, 0xb0, 0x1a, 0xdc, 0xb0, \n\t0x0f, 0xd0, 0xb0, 0x1a, 0x10, 0xb0, 0x20, 0xd0, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x70, 0xfe, 0x48, 0x04, 0x26, 0x04, 0x9d, 0x02, 0x26, \n\t0x03, 0x8d, 0x00, 0x00, 0x00, 0x07, 0x00, 0x7a, 0x01, 0x6d, 0xff, 0xfb, \n\t0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x03, 0xc8, 0x05, 0xdf, 0x02, 0x26, \n\t0x03, 0x8b, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, 0x00, 0x8a, 0x00, 0x1a, \n\t0x00, 0x2f, 0x00, 0xb6, 0xbf, 0x0c, 0xcf, 0x0c, 0xdf, 0x0c, 0x03, 0x5d, \n\t0xb2, 0x9f, 0x0c, 0x01, 0x71, 0xb2, 0xdf, 0x0c, 0x01, 0x71, 0xb2, 0x1f, \n\t0x0c, 0x01, 0x5d, 0xb2, 0xbf, 0x0c, 0x01, 0x71, 0xb2, 0x2f, 0x0c, 0x01, \n\t0x71, 0xb2, 0x8f, 0x0c, 0x01, 0x5d, 0xb2, 0x6f, 0x0c, 0x01, 0x5d, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x03, 0xc8, \n\t0x05, 0xdb, 0x02, 0x26, 0x03, 0x8b, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, \n\t0x01, 0x44, 0x00, 0x16, 0x00, 0x44, 0x00, 0xb4, 0xbf, 0x0f, 0xcf, 0x0f, \n\t0x02, 0x5d, 0xb2, 0x9f, 0x0f, 0x01, 0x71, 0xb2, 0x2f, 0x0f, 0x01, 0x71, \n\t0xb2, 0x8f, 0x0f, 0x01, 0x5d, 0xb2, 0x6f, 0x0f, 0x01, 0x5d, 0xb6, 0xdf, \n\t0x10, 0xef, 0x10, 0xff, 0x10, 0x03, 0x71, 0x40, 0x0b, 0x0f, 0x10, 0x1f, \n\t0x10, 0x2f, 0x10, 0x3f, 0x10, 0x4f, 0x10, 0x05, 0x72, 0xb2, 0x1f, 0x10, \n\t0x01, 0x5d, 0xb2, 0xbf, 0x10, 0x01, 0x71, 0xb2, 0xdf, 0x10, 0x01, 0x5d, \n\t0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x03, 0xc8, \n\t0x06, 0x05, 0x02, 0x26, 0x03, 0x8b, 0x00, 0x00, 0x01, 0x06, 0x01, 0x52, \n\t0x44, 0x1a, 0x00, 0x1c, 0x00, 0xb2, 0x6f, 0x0d, 0x01, 0x5d, 0xb2, 0xdf, \n\t0x10, 0x01, 0x71, 0xb2, 0x1f, 0x10, 0x01, 0x5d, 0xb2, 0xbf, 0x10, 0x01, \n\t0x5d, 0xb2, 0x8f, 0x10, 0x01, 0x5d, 0x30, 0x31, 0xff, 0xff, 0x00, 0x99, \n\t0x00, 0x00, 0x03, 0xc8, 0x05, 0xca, 0x02, 0x26, 0x03, 0x8b, 0x00, 0x00, \n\t0x01, 0x06, 0x00, 0x6a, 0x1f, 0x1a, 0x00, 0x5b, 0x00, 0xb2, 0x0f, 0x0d, \n\t0x01, 0x71, 0x40, 0x09, 0x8f, 0x0d, 0x9f, 0x0d, 0xaf, 0x0d, 0xbf, 0x0d, \n\t0x04, 0x71, 0xb2, 0x1f, 0x0d, 0x01, 0x5d, 0xb2, 0xdf, 0x0d, 0x01, 0x71, \n\t0xb4, 0x5f, 0x0d, 0x6f, 0x0d, 0x02, 0x71, 0xb2, 0x8f, 0x0d, 0x01, 0x5d, \n\t0xb2, 0x6f, 0x0d, 0x01, 0x5d, 0xb2, 0x8f, 0x10, 0x01, 0x5d, 0xb4, 0x5f, \n\t0x10, 0x6f, 0x10, 0x02, 0x71, 0xb2, 0xdf, 0x10, 0x01, 0x71, 0x40, 0x09, \n\t0x8f, 0x10, 0x9f, 0x10, 0xaf, 0x10, 0xbf, 0x10, 0x04, 0x71, 0xb2, 0x0f, \n\t0x10, 0x01, 0x71, 0xb2, 0x6f, 0x10, 0x01, 0x5d, 0xb2, 0x1f, 0x10, 0x01, \n\t0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0xff, 0xb7, 0x00, 0x00, 0x01, 0x5d, \n\t0x05, 0xdf, 0x02, 0x26, 0x03, 0x87, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, \n\t0xff, 0x65, 0x00, 0x1a, 0x00, 0x2f, 0x00, 0xb6, 0xbf, 0x04, 0xcf, 0x04, \n\t0xdf, 0x04, 0x03, 0x5d, 0xb2, 0x9f, 0x04, 0x01, 0x71, 0xb2, 0xdf, 0x04, \n\t0x01, 0x71, 0xb2, 0x1f, 0x04, 0x01, 0x5d, 0xb2, 0xbf, 0x04, 0x01, 0x71, \n\t0xb2, 0x2f, 0x04, 0x01, 0x71, 0xb2, 0x8f, 0x04, 0x01, 0x5d, 0xb2, 0x6f, \n\t0x04, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, \n\t0x00, 0x00, 0x02, 0x41, 0x05, 0xdb, 0x02, 0x26, 0x03, 0x87, 0x00, 0x00, \n\t0x01, 0x06, 0x00, 0x76, 0x1d, 0x16, 0x00, 0x44, 0x00, 0xb4, 0xbf, 0x07, \n\t0xcf, 0x07, 0x02, 0x5d, 0xb2, 0x9f, 0x07, 0x01, 0x71, 0xb2, 0x2f, 0x07, \n\t0x01, 0x71, 0xb2, 0x8f, 0x07, 0x01, 0x5d, 0xb2, 0x6f, 0x07, 0x01, 0x5d, \n\t0xb6, 0xdf, 0x08, 0xef, 0x08, 0xff, 0x08, 0x03, 0x71, 0x40, 0x0b, 0x0f, \n\t0x08, 0x1f, 0x08, 0x2f, 0x08, 0x3f, 0x08, 0x4f, 0x08, 0x05, 0x72, 0xb2, \n\t0x1f, 0x08, 0x01, 0x5d, 0xb2, 0xbf, 0x08, 0x01, 0x71, 0xb2, 0xdf, 0x08, \n\t0x01, 0x5d, 0x30, 0x31, 0xff, 0xff, 0xff, 0xca, 0x00, 0x00, 0x02, 0x30, \n\t0x06, 0x05, 0x02, 0x26, 0x03, 0x87, 0x00, 0x00, 0x01, 0x07, 0x01, 0x52, \n\t0xff, 0x1f, 0x00, 0x1a, 0x00, 0x1c, 0x00, 0xb2, 0x6f, 0x06, 0x01, 0x5d, \n\t0xb2, 0xdf, 0x08, 0x01, 0x71, 0xb2, 0x1f, 0x08, 0x01, 0x5d, 0xb2, 0xbf, \n\t0x08, 0x01, 0x5d, 0xb2, 0x8f, 0x08, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0xff, 0xa4, 0x00, 0x00, 0x02, 0x55, 0x05, 0xca, 0x02, 0x26, \n\t0x03, 0x87, 0x00, 0x00, 0x01, 0x07, 0x00, 0x6a, 0xfe, 0xfa, 0x00, 0x1a, \n\t0x00, 0x5b, 0x00, 0xb2, 0x0f, 0x05, 0x01, 0x71, 0x40, 0x09, 0x8f, 0x05, \n\t0x9f, 0x05, 0xaf, 0x05, 0xbf, 0x05, 0x04, 0x71, 0xb2, 0x1f, 0x05, 0x01, \n\t0x5d, 0xb2, 0xdf, 0x05, 0x01, 0x71, 0xb4, 0x5f, 0x05, 0x6f, 0x05, 0x02, \n\t0x71, 0xb2, 0x8f, 0x05, 0x01, 0x5d, 0xb2, 0x6f, 0x05, 0x01, 0x5d, 0xb2, \n\t0x8f, 0x08, 0x01, 0x5d, 0xb4, 0x5f, 0x08, 0x6f, 0x08, 0x02, 0x71, 0xb2, \n\t0xdf, 0x08, 0x01, 0x71, 0x40, 0x09, 0x8f, 0x08, 0x9f, 0x08, 0xaf, 0x08, \n\t0xbf, 0x08, 0x04, 0x71, 0xb2, 0x0f, 0x08, 0x01, 0x71, 0xb2, 0x6f, 0x08, \n\t0x01, 0x5d, 0xb2, 0x1f, 0x08, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x04, 0x76, 0x06, 0x11, 0x02, 0x26, \n\t0x03, 0x81, 0x00, 0x00, 0x01, 0x07, 0x01, 0x58, 0x00, 0x92, 0x00, 0x1e, \n\t0x00, 0x25, 0x00, 0x40, 0x0b, 0x0f, 0x0f, 0x1f, 0x0f, 0x2f, 0x0f, 0x3f, \n\t0x0f, 0x4f, 0x0f, 0x05, 0x71, 0xb2, 0x1f, 0x0f, 0x01, 0x5d, 0xb2, 0x8f, \n\t0x0f, 0x01, 0x71, 0xb2, 0x8f, 0x0f, 0x01, 0x5d, 0xb2, 0x6f, 0x0f, 0x01, \n\t0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x70, 0xff, 0xef, 0x04, 0x5b, \n\t0x05, 0xef, 0x02, 0x26, 0x03, 0x80, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, \n\t0x00, 0xbe, 0x00, 0x2a, 0x00, 0x41, 0x00, 0xb2, 0xc0, 0x1c, 0x01, 0x71, \n\t0xb2, 0x6f, 0x1c, 0x01, 0x5d, 0xb6, 0xbf, 0x1c, 0xcf, 0x1c, 0xdf, 0x1c, \n\t0x03, 0x5d, 0xb2, 0x1f, 0x1c, 0x01, 0x5d, 0xb2, 0x8f, 0x1c, 0x01, 0x5d, \n\t0xb2, 0xf0, 0x1c, 0x01, 0x5d, 0xb4, 0x00, 0x1c, 0x10, 0x1c, 0x02, 0x71, \n\t0xb2, 0xa0, 0x1c, 0x01, 0x71, 0x40, 0x0d, 0x30, 0x1c, 0x40, 0x1c, 0x50, \n\t0x1c, 0x60, 0x1c, 0x70, 0x1c, 0x80, 0x1c, 0x06, 0x71, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x70, 0xff, 0xef, 0x04, 0x5b, 0x05, 0xeb, 0x02, 0x26, \n\t0x03, 0x80, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, 0x01, 0x78, 0x00, 0x26, \n\t0x00, 0x3b, 0x00, 0xb2, 0x8f, 0x1f, 0x01, 0x5d, 0xb2, 0xcf, 0x1f, 0x01, \n\t0x5d, 0xb2, 0xc0, 0x20, 0x01, 0x71, 0xb2, 0xbf, 0x20, 0x01, 0x5d, 0xb2, \n\t0x1f, 0x20, 0x01, 0x5d, 0xb2, 0xdf, 0x20, 0x01, 0x5d, 0xb2, 0x6f, 0x20, \n\t0x01, 0x5d, 0xb2, 0xa0, 0x20, 0x01, 0x71, 0x40, 0x0d, 0x30, 0x20, 0x40, \n\t0x20, 0x50, 0x20, 0x60, 0x20, 0x70, 0x20, 0x80, 0x20, 0x06, 0x71, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x70, 0xff, 0xef, 0x04, 0x5b, \n\t0x06, 0x15, 0x02, 0x26, 0x03, 0x80, 0x00, 0x00, 0x01, 0x06, 0x01, 0x52, \n\t0x78, 0x2a, 0x00, 0x3a, 0x00, 0xb2, 0x8f, 0x20, 0x01, 0x5d, 0xb2, 0x1f, \n\t0x20, 0x01, 0x5d, 0xb2, 0xbf, 0x20, 0x01, 0x5d, 0xb2, 0x6f, 0x20, 0x01, \n\t0x5d, 0xb2, 0xf0, 0x20, 0x01, 0x5d, 0x40, 0x1b, 0x00, 0x20, 0x10, 0x20, \n\t0x20, 0x20, 0x30, 0x20, 0x40, 0x20, 0x50, 0x20, 0x60, 0x20, 0x70, 0x20, \n\t0x80, 0x20, 0x90, 0x20, 0xa0, 0x20, 0xb0, 0x20, 0xc0, 0x20, 0x0d, 0x71, \n\t0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x70, 0xff, 0xef, 0x04, 0x5b, \n\t0x06, 0x21, 0x02, 0x26, 0x03, 0x80, 0x00, 0x00, 0x01, 0x06, 0x01, 0x58, \n\t0x73, 0x2e, 0x00, 0x24, 0x00, 0xb2, 0x6f, 0x1f, 0x01, 0x5d, 0xb2, 0x1f, \n\t0x1f, 0x01, 0x5d, 0xb2, 0x8f, 0x1f, 0x01, 0x5d, 0xb6, 0xd0, 0x1f, 0xe0, \n\t0x1f, 0xf0, 0x1f, 0x03, 0x5d, 0xb6, 0x50, 0x1f, 0x60, 0x1f, 0x70, 0x1f, \n\t0x03, 0x71, 0x30, 0x31, 0xff, 0xff, 0x00, 0x70, 0xff, 0xef, 0x04, 0x5b, \n\t0x05, 0xda, 0x02, 0x26, 0x03, 0x80, 0x00, 0x00, 0x01, 0x06, 0x00, 0x6a, \n\t0x53, 0x2a, 0x00, 0x57, 0x00, 0xb2, 0xc0, 0x1d, 0x01, 0x71, 0xb2, 0x6f, \n\t0x1d, 0x01, 0x5d, 0xb2, 0x1f, 0x1d, 0x01, 0x5d, 0xb2, 0x8f, 0x1d, 0x01, \n\t0x5d, 0xb2, 0xf0, 0x1d, 0x01, 0x5d, 0xb2, 0x70, 0x1d, 0x01, 0x71, 0x40, \n\t0x09, 0x10, 0x1d, 0x20, 0x1d, 0x30, 0x1d, 0x40, 0x1d, 0x04, 0x71, 0xb2, \n\t0x70, 0x20, 0x01, 0x71, 0xb2, 0x6f, 0x20, 0x01, 0x5d, 0xb2, 0x1f, 0x20, \n\t0x01, 0x5d, 0xb2, 0x8f, 0x20, 0x01, 0x5d, 0xb2, 0xc0, 0x20, 0x01, 0x71, \n\t0x40, 0x09, 0x10, 0x20, 0x20, 0x20, 0x30, 0x20, 0x40, 0x20, 0x04, 0x71, \n\t0xb2, 0xf0, 0x20, 0x01, 0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x89, \n\t0xff, 0xef, 0x04, 0x74, 0x05, 0xe0, 0x02, 0x26, 0x03, 0x7a, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x43, 0x00, 0xdb, 0x00, 0x1b, 0x00, 0x2a, 0x00, 0xb6, \n\t0xbf, 0x12, 0xcf, 0x12, 0xdf, 0x12, 0x03, 0x5d, 0xb2, 0x9f, 0x12, 0x01, \n\t0x71, 0xb2, 0x1f, 0x12, 0x01, 0x5d, 0xb2, 0xbf, 0x12, 0x01, 0x71, 0xb2, \n\t0x2f, 0x12, 0x01, 0x71, 0xb2, 0x8f, 0x12, 0x01, 0x5d, 0xb2, 0x6f, 0x12, \n\t0x01, 0x5d, 0x30, 0x31, 0xff, 0xff, 0x00, 0x89, 0xff, 0xef, 0x04, 0x74, \n\t0x05, 0xdc, 0x02, 0x26, 0x03, 0x7a, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, \n\t0x01, 0x95, 0x00, 0x17, 0x00, 0x42, 0x00, 0xb2, 0x8f, 0x15, 0x01, 0x5d, \n\t0xb2, 0x9f, 0x15, 0x01, 0x71, 0xb2, 0xcf, 0x15, 0x01, 0x5d, 0xb2, 0xbf, \n\t0x16, 0x01, 0x5d, 0xb2, 0x2f, 0x16, 0x01, 0x71, 0xb6, 0xdf, 0x16, 0xef, \n\t0x16, 0xff, 0x16, 0x03, 0x71, 0xb6, 0x0f, 0x16, 0x1f, 0x16, 0x2f, 0x16, \n\t0x03, 0x72, 0xb2, 0xbf, 0x16, 0x01, 0x71, 0xb2, 0xdf, 0x16, 0x01, 0x5d, \n\t0xb2, 0x6f, 0x16, 0x01, 0x5d, 0xb2, 0x1f, 0x16, 0x01, 0x5d, 0x30, 0x31, \n\t0xff, 0xff, 0x00, 0x89, 0xff, 0xef, 0x04, 0x74, 0x06, 0x06, 0x02, 0x26, \n\t0x03, 0x7a, 0x00, 0x00, 0x01, 0x07, 0x01, 0x52, 0x00, 0x95, 0x00, 0x1b, \n\t0x00, 0x17, 0x00, 0xb2, 0xbf, 0x16, 0x01, 0x5d, 0xb2, 0x1f, 0x16, 0x01, \n\t0x5d, 0xb2, 0x8f, 0x16, 0x01, 0x5d, 0xb2, 0x6f, 0x16, 0x01, 0x5d, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x89, 0xff, 0xef, 0x04, 0x74, \n\t0x05, 0xcb, 0x02, 0x26, 0x03, 0x7a, 0x00, 0x00, 0x01, 0x06, 0x00, 0x6a, \n\t0x70, 0x1b, 0x00, 0x51, 0x00, 0xb2, 0x0f, 0x13, 0x01, 0x71, 0x40, 0x09, \n\t0x8f, 0x13, 0x9f, 0x13, 0xaf, 0x13, 0xbf, 0x13, 0x04, 0x71, 0xb2, 0x1f, \n\t0x13, 0x01, 0x5d, 0xb4, 0x5f, 0x13, 0x6f, 0x13, 0x02, 0x71, 0xb2, 0x8f, \n\t0x13, 0x01, 0x5d, 0xb2, 0x6f, 0x13, 0x01, 0x5d, 0xb2, 0x8f, 0x16, 0x01, \n\t0x5d, 0xb4, 0x5f, 0x16, 0x6f, 0x16, 0x02, 0x71, 0x40, 0x09, 0x8f, 0x16, \n\t0x9f, 0x16, 0xaf, 0x16, 0xbf, 0x16, 0x04, 0x71, 0xb2, 0x0f, 0x16, 0x01, \n\t0x71, 0xb2, 0x6f, 0x16, 0x01, 0x5d, 0xb2, 0x1f, 0x16, 0x01, 0x5d, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1e, 0x00, 0x00, 0x04, 0x35, \n\t0x05, 0xda, 0x02, 0x26, 0x03, 0x76, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, \n\t0x01, 0x46, 0x00, 0x15, 0x00, 0x47, 0x00, 0xb2, 0x8f, 0x0c, 0x01, 0x5d, \n\t0xb2, 0x9f, 0x0c, 0x01, 0x71, 0xb2, 0xcf, 0x0c, 0x01, 0x5d, 0xb2, 0xbf, \n\t0x0d, 0x01, 0x5d, 0xb2, 0x2f, 0x0d, 0x01, 0x71, 0xb6, 0xdf, 0x0d, 0xef, \n\t0x0d, 0xff, 0x0d, 0x03, 0x71, 0x40, 0x0b, 0x0f, 0x0d, 0x1f, 0x0d, 0x2f, \n\t0x0d, 0x3f, 0x0d, 0x4f, 0x0d, 0x05, 0x72, 0xb2, 0xbf, 0x0d, 0x01, 0x71, \n\t0xb2, 0xdf, 0x0d, 0x01, 0x5d, 0xb2, 0x6f, 0x0d, 0x01, 0x5d, 0xb2, 0x1f, \n\t0x0d, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x27, \n\t0x00, 0x00, 0x04, 0x8a, 0x05, 0xb7, 0x02, 0x26, 0x03, 0x91, 0x00, 0x00, \n\t0x01, 0x06, 0x00, 0x71, 0x77, 0x07, 0x00, 0x08, 0x00, 0xb2, 0x1f, 0x0c, \n\t0x01, 0x5d, 0x30, 0x31, 0xff, 0xff, 0x00, 0x27, 0x00, 0x00, 0x04, 0x8a, \n\t0x06, 0x0b, 0x02, 0x26, 0x03, 0x91, 0x00, 0x00, 0x01, 0x07, 0x01, 0x54, \n\t0x00, 0xa9, 0x00, 0x5b, 0x00, 0x14, 0x00, 0xb2, 0x1f, 0x10, 0x01, 0x5d, \n\t0xb2, 0x8f, 0x10, 0x01, 0x71, 0xb4, 0x5f, 0x10, 0x6f, 0x10, 0x02, 0x71, \n\t0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x27, 0xfe, 0x50, 0x04, 0xbd, \n\t0x04, 0x8d, 0x02, 0x26, 0x03, 0x91, 0x00, 0x00, 0x00, 0x07, 0x01, 0x57, \n\t0x02, 0xea, 0x00, 0x00, 0xff, 0xff, 0x00, 0x70, 0xff, 0xef, 0x04, 0x26, \n\t0x05, 0xeb, 0x02, 0x26, 0x03, 0x8d, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, \n\t0x01, 0x68, 0x00, 0x26, 0x00, 0x3b, 0x00, 0xb2, 0x1f, 0x21, 0x01, 0x5d, \n\t0xb2, 0xcf, 0x21, 0x01, 0x5d, 0xb2, 0x8f, 0x21, 0x01, 0x5d, 0xb2, 0xc0, \n\t0x22, 0x01, 0x71, 0xb2, 0xdf, 0x22, 0x01, 0x5d, 0xb2, 0x6f, 0x22, 0x01, \n\t0x5d, 0xb2, 0xbf, 0x22, 0x01, 0x5d, 0xb2, 0xa0, 0x22, 0x01, 0x71, 0x40, \n\t0x0d, 0x30, 0x22, 0x40, 0x22, 0x50, 0x22, 0x60, 0x22, 0x70, 0x22, 0x80, \n\t0x22, 0x06, 0x71, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x70, \n\t0xff, 0xef, 0x04, 0x26, 0x06, 0x15, 0x02, 0x26, 0x03, 0x8d, 0x00, 0x00, \n\t0x01, 0x06, 0x01, 0x52, 0x68, 0x2a, 0x00, 0x3a, 0x00, 0xb2, 0x8f, 0x22, \n\t0x01, 0x5d, 0xb2, 0x1f, 0x22, 0x01, 0x5d, 0xb2, 0xbf, 0x22, 0x01, 0x5d, \n\t0xb2, 0x6f, 0x22, 0x01, 0x5d, 0xb2, 0xf0, 0x22, 0x01, 0x5d, 0x40, 0x1b, \n\t0x00, 0x22, 0x10, 0x22, 0x20, 0x22, 0x30, 0x22, 0x40, 0x22, 0x50, 0x22, \n\t0x60, 0x22, 0x70, 0x22, 0x80, 0x22, 0x90, 0x22, 0xa0, 0x22, 0xb0, 0x22, \n\t0xc0, 0x22, 0x0d, 0x71, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x70, \n\t0xff, 0xef, 0x04, 0x26, 0x05, 0xda, 0x02, 0x26, 0x03, 0x8d, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x55, 0x01, 0x38, 0x00, 0x2a, 0x00, 0x4c, 0x00, 0xb2, \n\t0xf0, 0x1e, 0x01, 0x5d, 0xb2, 0x10, 0x1e, 0x01, 0x71, 0xb2, 0xc0, 0x1f, \n\t0x01, 0x71, 0xb2, 0x10, 0x1f, 0x01, 0x72, 0xb2, 0x8f, 0x1f, 0x01, 0x5d, \n\t0xb2, 0xdf, 0x1f, 0x01, 0x5d, 0xb2, 0x1f, 0x1f, 0x01, 0x5d, 0xb2, 0xbf, \n\t0x1f, 0x01, 0x5d, 0xb2, 0x6f, 0x1f, 0x01, 0x5d, 0xb4, 0xe0, 0x1f, 0xf0, \n\t0x1f, 0x02, 0x71, 0x40, 0x0d, 0x20, 0x1f, 0x30, 0x1f, 0x40, 0x1f, 0x50, \n\t0x1f, 0x60, 0x1f, 0x70, 0x1f, 0x06, 0x71, 0xb2, 0x00, 0x1f, 0x01, 0x71, \n\t0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x70, 0xff, 0xef, 0x04, 0x26, \n\t0x06, 0x16, 0x02, 0x26, 0x03, 0x8d, 0x00, 0x00, 0x01, 0x06, 0x01, 0x53, \n\t0x7f, 0x2b, 0x00, 0x3a, 0x00, 0xb2, 0x8f, 0x22, 0x01, 0x5d, 0xb2, 0x1f, \n\t0x22, 0x01, 0x5d, 0xb2, 0xbf, 0x22, 0x01, 0x5d, 0xb2, 0x6f, 0x22, 0x01, \n\t0x5d, 0xb2, 0xf0, 0x22, 0x01, 0x5d, 0x40, 0x1b, 0x00, 0x22, 0x10, 0x22, \n\t0x20, 0x22, 0x30, 0x22, 0x40, 0x22, 0x50, 0x22, 0x60, 0x22, 0x70, 0x22, \n\t0x80, 0x22, 0x90, 0x22, 0xa0, 0x22, 0xb0, 0x22, 0xc0, 0x22, 0x0d, 0x71, \n\t0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x04, 0x31, \n\t0x06, 0x06, 0x02, 0x26, 0x03, 0x8c, 0x00, 0x00, 0x01, 0x06, 0x01, 0x53, \n\t0x2c, 0x1b, 0x00, 0x17, 0x00, 0xb2, 0xbf, 0x18, 0x01, 0x5d, 0xb2, 0x1f, \n\t0x18, 0x01, 0x5d, 0xb2, 0x8f, 0x18, 0x01, 0x5d, 0xb2, 0x6f, 0x18, 0x01, \n\t0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x03, 0xc8, \n\t0x05, 0xb7, 0x02, 0x26, 0x03, 0x8b, 0x00, 0x00, 0x01, 0x06, 0x00, 0x71, \n\t0x43, 0x07, 0x00, 0x08, 0x00, 0xb2, 0x1f, 0x0c, 0x01, 0x5d, 0x30, 0x31, \n\t0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x03, 0xc8, 0x06, 0x0b, 0x02, 0x26, \n\t0x03, 0x8b, 0x00, 0x00, 0x01, 0x06, 0x01, 0x54, 0x75, 0x5b, 0x00, 0x14, \n\t0x00, 0xb2, 0x1f, 0x10, 0x01, 0x5d, 0xb2, 0x8f, 0x10, 0x01, 0x71, 0xb4, \n\t0x5f, 0x10, 0x6f, 0x10, 0x02, 0x71, 0x30, 0x31, 0xff, 0xff, 0x00, 0x99, \n\t0x00, 0x00, 0x03, 0xc8, 0x05, 0xca, 0x02, 0x26, 0x03, 0x8b, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x55, 0x01, 0x14, 0x00, 0x1a, 0x00, 0x37, 0x00, 0xb2, \n\t0x1f, 0x0d, 0x01, 0x5d, 0xb2, 0x8f, 0x0d, 0x01, 0x5d, 0xb2, 0xdf, 0x0d, \n\t0x01, 0x5d, 0xb2, 0xdf, 0x0d, 0x01, 0x71, 0x40, 0x09, 0x8f, 0x0d, 0x9f, \n\t0x0d, 0xaf, 0x0d, 0xbf, 0x0d, 0x04, 0x71, 0xb2, 0xbf, 0x0d, 0x01, 0x5d, \n\t0xb2, 0x6f, 0x0d, 0x01, 0x5d, 0xb2, 0xf0, 0x0d, 0x01, 0x71, 0xb2, 0x10, \n\t0x0d, 0x01, 0x72, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, \n\t0xfe, 0x50, 0x03, 0xc8, 0x04, 0x8d, 0x02, 0x26, 0x03, 0x8b, 0x00, 0x00, \n\t0x00, 0x07, 0x01, 0x57, 0x01, 0x18, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, \n\t0x00, 0x00, 0x03, 0xc8, 0x06, 0x06, 0x02, 0x26, 0x03, 0x8b, 0x00, 0x00, \n\t0x01, 0x06, 0x01, 0x53, 0x5b, 0x1b, 0x00, 0x17, 0x00, 0xb2, 0xbf, 0x10, \n\t0x01, 0x5d, 0xb2, 0x1f, 0x10, 0x01, 0x5d, 0xb2, 0x8f, 0x10, 0x01, 0x5d, \n\t0xb2, 0x6f, 0x10, 0x01, 0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x70, \n\t0xff, 0xef, 0x04, 0x4b, 0x06, 0x15, 0x02, 0x26, 0x03, 0x89, 0x00, 0x00, \n\t0x01, 0x06, 0x01, 0x52, 0x74, 0x2a, 0x00, 0x3a, 0x00, 0xb2, 0x8f, 0x25, \n\t0x01, 0x5d, 0xb2, 0x1f, 0x25, 0x01, 0x5d, 0xb2, 0xbf, 0x25, 0x01, 0x5d, \n\t0xb2, 0x6f, 0x25, 0x01, 0x5d, 0xb2, 0xf0, 0x25, 0x01, 0x5d, 0x40, 0x1b, \n\t0x00, 0x25, 0x10, 0x25, 0x20, 0x25, 0x30, 0x25, 0x40, 0x25, 0x50, 0x25, \n\t0x60, 0x25, 0x70, 0x25, 0x80, 0x25, 0x90, 0x25, 0xa0, 0x25, 0xb0, 0x25, \n\t0xc0, 0x25, 0x0d, 0x71, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x70, \n\t0xff, 0xef, 0x04, 0x4b, 0x06, 0x1b, 0x02, 0x26, 0x03, 0x89, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x54, 0x00, 0xa5, 0x00, 0x6b, 0x00, 0x17, 0x00, 0xb2, \n\t0x70, 0x25, 0x01, 0x72, 0xb2, 0x20, 0x25, 0x01, 0x5d, 0xb2, 0x70, 0x25, \n\t0x01, 0x71, 0xb2, 0x40, 0x25, 0x01, 0x71, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x70, 0xff, 0xef, 0x04, 0x4b, 0x05, 0xda, 0x02, 0x26, \n\t0x03, 0x89, 0x00, 0x00, 0x01, 0x07, 0x01, 0x55, 0x01, 0x44, 0x00, 0x2a, \n\t0x00, 0x4c, 0x00, 0xb2, 0xf0, 0x21, 0x01, 0x5d, 0xb2, 0x10, 0x21, 0x01, \n\t0x71, 0xb2, 0xc0, 0x22, 0x01, 0x71, 0xb2, 0x10, 0x22, 0x01, 0x72, 0xb2, \n\t0x8f, 0x22, 0x01, 0x5d, 0xb2, 0xdf, 0x22, 0x01, 0x5d, 0xb2, 0x1f, 0x22, \n\t0x01, 0x5d, 0xb2, 0xbf, 0x22, 0x01, 0x5d, 0xb2, 0x6f, 0x22, 0x01, 0x5d, \n\t0xb4, 0xe0, 0x22, 0xf0, 0x22, 0x02, 0x71, 0x40, 0x0d, 0x20, 0x22, 0x30, \n\t0x22, 0x40, 0x22, 0x50, 0x22, 0x60, 0x22, 0x70, 0x22, 0x06, 0x71, 0xb2, \n\t0x00, 0x22, 0x01, 0x71, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x70, \n\t0xfe, 0x15, 0x04, 0x4b, 0x04, 0x9d, 0x02, 0x26, 0x03, 0x89, 0x00, 0x00, \n\t0x00, 0x07, 0x03, 0x63, 0x01, 0x59, 0xfe, 0x9b, 0xff, 0xff, 0x00, 0x99, \n\t0x00, 0x00, 0x04, 0x5a, 0x06, 0x05, 0x02, 0x26, 0x03, 0x88, 0x00, 0x00, \n\t0x01, 0x06, 0x01, 0x52, 0x7f, 0x1a, 0x00, 0x1c, 0x00, 0xb2, 0xbf, 0x10, \n\t0x01, 0x5d, 0xb2, 0x1f, 0x10, 0x01, 0x5d, 0xb2, 0xdf, 0x10, 0x01, 0x71, \n\t0xb2, 0x8f, 0x10, 0x01, 0x5d, 0xb2, 0x6f, 0x10, 0x01, 0x5d, 0x30, 0x31, \n\t0xff, 0xff, 0xff, 0xa1, 0x00, 0x00, 0x02, 0x57, 0x06, 0x11, 0x02, 0x26, \n\t0x03, 0x87, 0x00, 0x00, 0x01, 0x07, 0x01, 0x58, 0xff, 0x1a, 0x00, 0x1e, \n\t0x00, 0x25, 0x00, 0x40, 0x0b, 0x0f, 0x07, 0x1f, 0x07, 0x2f, 0x07, 0x3f, \n\t0x07, 0x4f, 0x07, 0x05, 0x71, 0xb2, 0x1f, 0x07, 0x01, 0x5d, 0xb2, 0x8f, \n\t0x07, 0x01, 0x71, 0xb2, 0x8f, 0x07, 0x01, 0x5d, 0xb2, 0x6f, 0x07, 0x01, \n\t0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x89, 0xff, 0xef, 0x04, 0x74, \n\t0x06, 0x09, 0x02, 0x26, 0x03, 0x7a, 0x00, 0x00, 0x01, 0x07, 0x01, 0x59, \n\t0x01, 0x22, 0x00, 0x1b, 0x00, 0x3d, 0x00, 0xb4, 0x5f, 0x15, 0x6f, 0x15, \n\t0x02, 0x71, 0x40, 0x09, 0x8f, 0x15, 0x9f, 0x15, 0xaf, 0x15, 0xbf, 0x15, \n\t0x04, 0x71, 0xb2, 0xdf, 0x16, 0x01, 0x5d, 0xb2, 0xbf, 0x17, 0x01, 0x5d, \n\t0x40, 0x09, 0x8f, 0x1b, 0x9f, 0x1b, 0xaf, 0x1b, 0xbf, 0x1b, 0x04, 0x71, \n\t0xb2, 0xbf, 0x1b, 0x01, 0x5d, 0xb4, 0x5f, 0x1b, 0x6f, 0x1b, 0x02, 0x71, \n\t0xb2, 0xdf, 0x1b, 0x01, 0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0xff, 0xd1, \n\t0x00, 0x00, 0x02, 0x28, 0x06, 0x0b, 0x02, 0x26, 0x03, 0x87, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x54, 0xff, 0x50, 0x00, 0x5b, 0x00, 0x14, 0x00, 0xb2, \n\t0x1f, 0x08, 0x01, 0x5d, 0xb2, 0x8f, 0x08, 0x01, 0x71, 0xb4, 0x5f, 0x08, \n\t0x6f, 0x08, 0x02, 0x71, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3c, \n\t0xfe, 0x50, 0x01, 0xcb, 0x04, 0x8d, 0x02, 0x26, 0x03, 0x87, 0x00, 0x00, \n\t0x00, 0x06, 0x01, 0x57, 0xf8, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x8f, \n\t0x00, 0x00, 0x01, 0x69, 0x05, 0xca, 0x02, 0x26, 0x03, 0x87, 0x00, 0x00, \n\t0x01, 0x06, 0x01, 0x55, 0xef, 0x1a, 0x00, 0x37, 0x00, 0xb2, 0x1f, 0x05, \n\t0x01, 0x5d, 0xb2, 0x8f, 0x05, 0x01, 0x5d, 0xb2, 0xdf, 0x05, 0x01, 0x5d, \n\t0xb2, 0xdf, 0x05, 0x01, 0x71, 0x40, 0x09, 0x8f, 0x05, 0x9f, 0x05, 0xaf, \n\t0x05, 0xbf, 0x05, 0x04, 0x71, 0xb2, 0xbf, 0x05, 0x01, 0x5d, 0xb2, 0x6f, \n\t0x05, 0x01, 0x5d, 0xb2, 0xf0, 0x05, 0x01, 0x71, 0xb2, 0x10, 0x05, 0x01, \n\t0x72, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x40, 0xff, 0xef, 0x04, 0x42, \n\t0x05, 0xfc, 0x02, 0x26, 0x03, 0x86, 0x00, 0x00, 0x01, 0x07, 0x01, 0x52, \n\t0x01, 0x31, 0x00, 0x11, 0x00, 0x3a, 0x00, 0xb2, 0xef, 0x13, 0x01, 0x71, \n\t0xb2, 0xbf, 0x15, 0x01, 0x5d, 0xb2, 0xff, 0x15, 0x01, 0x71, 0x40, 0x11, \n\t0x0f, 0x15, 0x1f, 0x15, 0x2f, 0x15, 0x3f, 0x15, 0x4f, 0x15, 0x5f, 0x15, \n\t0x6f, 0x15, 0x7f, 0x15, 0x08, 0x72, 0xb2, 0x1f, 0x15, 0x01, 0x5d, 0xb2, \n\t0xdf, 0x15, 0x01, 0x71, 0xb2, 0x8f, 0x15, 0x01, 0x5d, 0xb2, 0x6f, 0x15, \n\t0x01, 0x5d, 0x30, 0x31, 0xff, 0xff, 0x00, 0x99, 0xfe, 0x21, 0x04, 0x41, \n\t0x04, 0x8d, 0x02, 0x26, 0x03, 0x85, 0x00, 0x00, 0x00, 0x07, 0x03, 0x63, \n\t0x01, 0x06, 0xfe, 0xa7, 0xff, 0xff, 0x00, 0x6b, 0x00, 0x00, 0x03, 0x6b, \n\t0x05, 0xab, 0x02, 0x26, 0x03, 0x84, 0x00, 0x00, 0x01, 0x06, 0x00, 0x76, \n\t0xe8, 0xe6, 0x00, 0x60, 0x00, 0xb2, 0x9f, 0x09, 0x01, 0x71, 0xb2, 0x1f, \n\t0x09, 0x01, 0x5d, 0xb2, 0xcf, 0x09, 0x01, 0x5d, 0xb2, 0x8f, 0x09, 0x01, \n\t0x5d, 0xb2, 0xdf, 0x0a, 0x01, 0x5d, 0xb2, 0xbf, 0x0a, 0x01, 0x71, 0x40, \n\t0x09, 0xaf, 0x0a, 0xbf, 0x0a, 0xcf, 0x0a, 0xdf, 0x0a, 0x04, 0x72, 0xb2, \n\t0xff, 0x0a, 0x01, 0x72, 0xb6, 0xdf, 0x0a, 0xef, 0x0a, 0xff, 0x0a, 0x03, \n\t0x71, 0x40, 0x13, 0x0f, 0x0a, 0x1f, 0x0a, 0x2f, 0x0a, 0x3f, 0x0a, 0x4f, \n\t0x0a, 0x5f, 0x0a, 0x6f, 0x0a, 0x7f, 0x0a, 0x8f, 0x0a, 0x09, 0x72, 0xb2, \n\t0x2f, 0x0a, 0x01, 0x71, 0xb2, 0xbf, 0x0a, 0x01, 0x5d, 0xb2, 0x6f, 0x0a, \n\t0x01, 0x5d, 0x30, 0x31, 0xff, 0xff, 0x00, 0x99, 0xfe, 0x23, 0x03, 0x6b, \n\t0x04, 0x8d, 0x02, 0x26, 0x03, 0x84, 0x00, 0x00, 0x00, 0x07, 0x03, 0x63, \n\t0x00, 0xe3, 0xfe, 0xa9, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x03, 0x6b, \n\t0x04, 0x8e, 0x02, 0x26, 0x03, 0x84, 0x00, 0x00, 0x01, 0x07, 0x03, 0x63, \n\t0x01, 0x4b, 0x03, 0x9b, 0x00, 0x10, 0x00, 0xb0, 0x00, 0x45, 0x58, 0xb0, \n\t0x0a, 0x2f, 0x1b, 0xb1, 0x0a, 0x0e, 0x3e, 0x59, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x03, 0x6b, 0x04, 0x8d, 0x02, 0x26, \n\t0x03, 0x84, 0x00, 0x00, 0x01, 0x07, 0x01, 0x55, 0x01, 0x31, 0xfd, 0x2a, \n\t0x00, 0x0b, 0x00, 0xb0, 0x08, 0x2f, 0xb2, 0x1f, 0x08, 0x01, 0x5d, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x04, 0x76, \n\t0x05, 0xdb, 0x02, 0x26, 0x03, 0x81, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, \n\t0x01, 0x97, 0x00, 0x16, 0x00, 0x3f, 0x00, 0xb2, 0x9f, 0x0f, 0x01, 0x71, \n\t0xb2, 0x8f, 0x10, 0x01, 0x5d, 0xb2, 0x2f, 0x10, 0x01, 0x71, 0xb6, 0xdf, \n\t0x10, 0xef, 0x10, 0xff, 0x10, 0x03, 0x71, 0x40, 0x09, 0x1f, 0x10, 0x2f, \n\t0x10, 0x3f, 0x10, 0x4f, 0x10, 0x04, 0x72, 0xb2, 0xbf, 0x10, 0x01, 0x71, \n\t0xb6, 0xbf, 0x10, 0xcf, 0x10, 0xdf, 0x10, 0x03, 0x5d, 0xb2, 0x6f, 0x10, \n\t0x01, 0x5d, 0xb2, 0x1f, 0x10, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x99, 0xfe, 0x23, 0x04, 0x76, 0x04, 0x8d, 0x02, 0x26, \n\t0x03, 0x81, 0x00, 0x00, 0x00, 0x07, 0x03, 0x63, 0x01, 0x7b, 0xfe, 0xa9, \n\t0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x04, 0x76, 0x06, 0x06, 0x02, 0x26, \n\t0x03, 0x81, 0x00, 0x00, 0x01, 0x07, 0x01, 0x53, 0x00, 0xae, 0x00, 0x1b, \n\t0x00, 0x17, 0x00, 0xb2, 0xbf, 0x10, 0x01, 0x5d, 0xb2, 0x1f, 0x10, 0x01, \n\t0x5d, 0xb2, 0x8f, 0x10, 0x01, 0x5d, 0xb2, 0x6f, 0x10, 0x01, 0x5d, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x70, 0xff, 0xef, 0x04, 0x5b, \n\t0x05, 0xc7, 0x02, 0x26, 0x03, 0x80, 0x00, 0x00, 0x01, 0x06, 0x00, 0x71, \n\t0x77, 0x17, 0x00, 0x1f, 0x00, 0xb2, 0x1f, 0x1c, 0x01, 0x5d, 0x40, 0x0b, \n\t0x30, 0x1c, 0x40, 0x1c, 0x50, 0x1c, 0x60, 0x1c, 0x70, 0x1c, 0x05, 0x72, \n\t0xb6, 0x90, 0x1c, 0xa0, 0x1c, 0xb0, 0x1c, 0x03, 0x72, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x70, 0xff, 0xef, 0x04, 0x5b, 0x06, 0x1b, 0x02, 0x26, \n\t0x03, 0x80, 0x00, 0x00, 0x01, 0x07, 0x01, 0x54, 0x00, 0xa9, 0x00, 0x6b, \n\t0x00, 0x17, 0x00, 0xb2, 0x70, 0x20, 0x01, 0x72, 0xb2, 0x20, 0x20, 0x01, \n\t0x5d, 0xb2, 0x70, 0x20, 0x01, 0x71, 0xb2, 0x40, 0x20, 0x01, 0x71, 0x30, \n\t0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x70, 0xff, 0xef, 0x04, 0x5b, \n\t0x06, 0x18, 0x02, 0x26, 0x03, 0x80, 0x00, 0x00, 0x01, 0x07, 0x01, 0x59, \n\t0x01, 0x05, 0x00, 0x2a, 0x00, 0x51, 0x00, 0xb2, 0xf0, 0x1f, 0x01, 0x5d, \n\t0x40, 0x0b, 0x00, 0x1f, 0x10, 0x1f, 0x20, 0x1f, 0x30, 0x1f, 0x40, 0x1f, \n\t0x05, 0x71, 0xb2, 0xc0, 0x1f, 0x01, 0x71, 0xb2, 0x70, 0x1f, 0x01, 0x71, \n\t0xb2, 0xbf, 0x20, 0x01, 0x5d, 0xb2, 0xdf, 0x20, 0x01, 0x5d, 0xb2, 0xc0, \n\t0x25, 0x01, 0x71, 0xb2, 0xbf, 0x25, 0x01, 0x5d, 0xb2, 0xdf, 0x25, 0x01, \n\t0x5d, 0xb2, 0x70, 0x25, 0x01, 0x71, 0xb2, 0xf0, 0x25, 0x01, 0x5d, 0x40, \n\t0x0b, 0x00, 0x25, 0x10, 0x25, 0x20, 0x25, 0x30, 0x25, 0x40, 0x25, 0x05, \n\t0x71, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x04, 0x2c, \n\t0x05, 0xdb, 0x02, 0x26, 0x03, 0x7d, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, \n\t0x01, 0x25, 0x00, 0x16, 0x00, 0x41, 0x00, 0xb2, 0x9f, 0x27, 0x01, 0x71, \n\t0xb6, 0xbf, 0x28, 0xcf, 0x28, 0xdf, 0x28, 0x03, 0x5d, 0xb2, 0xbf, 0x28, \n\t0x01, 0x71, 0xb2, 0x1f, 0x28, 0x01, 0x5d, 0xb6, 0xdf, 0x28, 0xef, 0x28, \n\t0xff, 0x28, 0x03, 0x71, 0x40, 0x0b, 0x0f, 0x28, 0x1f, 0x28, 0x2f, 0x28, \n\t0x3f, 0x28, 0x4f, 0x28, 0x05, 0x72, 0xb2, 0x2f, 0x28, 0x01, 0x71, 0xb2, \n\t0x8f, 0x28, 0x01, 0x5d, 0xb2, 0x6f, 0x28, 0x01, 0x5d, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x99, 0xfe, 0x23, 0x04, 0x2c, 0x04, 0x8d, 0x02, 0x26, \n\t0x03, 0x7d, 0x00, 0x00, 0x00, 0x07, 0x03, 0x63, 0x01, 0x09, 0xfe, 0xa9, \n\t0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x04, 0x2c, 0x06, 0x06, 0x02, 0x26, \n\t0x03, 0x7d, 0x00, 0x00, 0x01, 0x06, 0x01, 0x53, 0x3c, 0x1b, 0x00, 0x17, \n\t0x00, 0xb2, 0xbf, 0x28, 0x01, 0x5d, 0xb2, 0x1f, 0x28, 0x01, 0x5d, 0xb2, \n\t0x8f, 0x28, 0x01, 0x5d, 0xb2, 0x6f, 0x28, 0x01, 0x5d, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x5d, 0xff, 0xef, 0x04, 0x11, 0x05, 0xeb, 0x02, 0x26, \n\t0x03, 0x7c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x76, 0x01, 0x50, 0x00, 0x26, \n\t0x00, 0x35, 0x00, 0x40, 0x0d, 0x30, 0x2c, 0x40, 0x2c, 0x50, 0x2c, 0x60, \n\t0x2c, 0x70, 0x2c, 0x80, 0x2c, 0x06, 0x71, 0xb2, 0x8f, 0x2c, 0x01, 0x5d, \n\t0xb2, 0x1f, 0x2c, 0x01, 0x5d, 0xb6, 0xbf, 0x2c, 0xcf, 0x2c, 0xdf, 0x2c, \n\t0x03, 0x5d, 0xb2, 0x6f, 0x2c, 0x01, 0x5d, 0xb2, 0xc0, 0x2c, 0x01, 0x71, \n\t0xb2, 0xa0, 0x2c, 0x01, 0x71, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x5d, \n\t0xff, 0xef, 0x04, 0x11, 0x06, 0x15, 0x02, 0x26, 0x03, 0x7c, 0x00, 0x00, \n\t0x01, 0x06, 0x01, 0x52, 0x50, 0x2a, 0x00, 0x3a, 0x00, 0xb2, 0x8f, 0x2c, \n\t0x01, 0x5d, 0xb2, 0x1f, 0x2c, 0x01, 0x5d, 0xb2, 0xbf, 0x2c, 0x01, 0x5d, \n\t0xb2, 0x6f, 0x2c, 0x01, 0x5d, 0xb2, 0xf0, 0x2c, 0x01, 0x5d, 0x40, 0x1b, \n\t0x00, 0x2c, 0x10, 0x2c, 0x20, 0x2c, 0x30, 0x2c, 0x40, 0x2c, 0x50, 0x2c, \n\t0x60, 0x2c, 0x70, 0x2c, 0x80, 0x2c, 0x90, 0x2c, 0xa0, 0x2c, 0xb0, 0x2c, \n\t0xc0, 0x2c, 0x0d, 0x71, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5d, \n\t0xfe, 0x48, 0x04, 0x11, 0x04, 0x9d, 0x02, 0x26, 0x03, 0x7c, 0x00, 0x00, \n\t0x00, 0x07, 0x00, 0x7a, 0x01, 0x55, 0xff, 0xfb, 0xff, 0xff, 0x00, 0x5d, \n\t0xff, 0xef, 0x04, 0x11, 0x06, 0x16, 0x02, 0x26, 0x03, 0x7c, 0x00, 0x00, \n\t0x01, 0x06, 0x01, 0x53, 0x67, 0x2b, 0x00, 0x3a, 0x00, 0xb2, 0x8f, 0x2c, \n\t0x01, 0x5d, 0xb2, 0x1f, 0x2c, 0x01, 0x5d, 0xb2, 0xbf, 0x2c, 0x01, 0x5d, \n\t0xb2, 0x6f, 0x2c, 0x01, 0x5d, 0xb2, 0xf0, 0x2c, 0x01, 0x5d, 0x40, 0x1b, \n\t0x00, 0x2c, 0x10, 0x2c, 0x20, 0x2c, 0x30, 0x2c, 0x40, 0x2c, 0x50, 0x2c, \n\t0x60, 0x2c, 0x70, 0x2c, 0x80, 0x2c, 0x90, 0x2c, 0xa0, 0x2c, 0xb0, 0x2c, \n\t0xc0, 0x2c, 0x0d, 0x71, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x47, \n\t0xfe, 0x23, 0x03, 0xd1, 0x04, 0x8d, 0x02, 0x26, 0x03, 0x7b, 0x00, 0x00, \n\t0x00, 0x07, 0x03, 0x63, 0x01, 0x0a, 0xfe, 0xa9, 0xff, 0xff, 0x00, 0x47, \n\t0x00, 0x00, 0x03, 0xd1, 0x06, 0x05, 0x02, 0x26, 0x03, 0x7b, 0x00, 0x00, \n\t0x01, 0x06, 0x01, 0x53, 0x3d, 0x1a, 0x00, 0x17, 0x00, 0xb2, 0xbf, 0x0c, \n\t0x01, 0x5d, 0xb2, 0x1f, 0x0c, 0x01, 0x5d, 0xb2, 0x8f, 0x0c, 0x01, 0x5d, \n\t0xb2, 0x6f, 0x0c, 0x01, 0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x89, \n\t0xff, 0xef, 0x04, 0x74, 0x06, 0x12, 0x02, 0x26, 0x03, 0x7a, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x58, 0x00, 0x90, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x40, \n\t0x0b, 0x0f, 0x15, 0x1f, 0x15, 0x2f, 0x15, 0x3f, 0x15, 0x4f, 0x15, 0x05, \n\t0x71, 0xb2, 0x1f, 0x15, 0x01, 0x5d, 0xb2, 0x8f, 0x15, 0x01, 0x5d, 0xb2, \n\t0x6f, 0x15, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x89, \n\t0xff, 0xef, 0x04, 0x74, 0x05, 0xb8, 0x02, 0x26, 0x03, 0x7a, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x71, 0x00, 0x94, 0x00, 0x08, 0x00, 0x08, 0x00, 0xb2, \n\t0x1f, 0x12, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x89, \n\t0xff, 0xef, 0x04, 0x74, 0x06, 0x0c, 0x02, 0x26, 0x03, 0x7a, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x54, 0x00, 0xc6, 0x00, 0x5c, 0x00, 0x19, 0x00, 0xb2, \n\t0x8f, 0x16, 0x01, 0x71, 0xb2, 0x1f, 0x16, 0x01, 0x5d, 0xb4, 0x5f, 0x16, \n\t0x6f, 0x16, 0x02, 0x71, 0xb2, 0x20, 0x16, 0x01, 0x5d, 0x30, 0x31, 0x00, \n\t0xff, 0xff, 0x00, 0x89, 0xff, 0xef, 0x04, 0x74, 0x06, 0x4a, 0x02, 0x26, \n\t0x03, 0x7a, 0x00, 0x00, 0x01, 0x07, 0x01, 0x56, 0x01, 0x1c, 0x00, 0x68, \n\t0x00, 0x35, 0x00, 0xb2, 0x2f, 0x1b, 0x01, 0x71, 0xb2, 0x0f, 0x1b, 0x01, \n\t0x5d, 0xb2, 0x4f, 0x1b, 0x01, 0x71, 0xb2, 0xdf, 0x1b, 0x01, 0x5d, 0xb2, \n\t0xbf, 0x1b, 0x01, 0x5d, 0xb2, 0xdf, 0x21, 0x01, 0x5d, 0xb2, 0x4f, 0x21, \n\t0x01, 0x71, 0xb2, 0x2f, 0x21, 0x01, 0x71, 0xb2, 0xbf, 0x21, 0x01, 0x5d, \n\t0xb2, 0x0f, 0x21, 0x01, 0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x5d, \n\t0xff, 0xef, 0x08, 0x82, 0x04, 0x9d, 0x00, 0x26, 0x03, 0x7c, 0x00, 0x00, \n\t0x00, 0x07, 0x03, 0x7c, 0x04, 0x71, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4e, \n\t0x00, 0x00, 0x03, 0xd8, 0x06, 0x06, 0x02, 0x26, 0x03, 0x75, 0x00, 0x00, \n\t0x01, 0x06, 0x01, 0x53, 0x3a, 0x1b, 0x00, 0x17, 0x00, 0xb2, 0xbf, 0x0e, \n\t0x01, 0x5d, 0xb2, 0x1f, 0x0e, 0x01, 0x5d, 0xb2, 0x8f, 0x0e, 0x01, 0x5d, \n\t0xb2, 0x6f, 0x0e, 0x01, 0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x4e, \n\t0x00, 0x00, 0x03, 0xd8, 0x05, 0xca, 0x02, 0x26, 0x03, 0x75, 0x00, 0x00, \n\t0x01, 0x07, 0x01, 0x55, 0x00, 0xf3, 0x00, 0x1a, 0x00, 0x37, 0x00, 0xb2, \n\t0x1f, 0x0b, 0x01, 0x5d, 0xb2, 0x8f, 0x0b, 0x01, 0x5d, 0xb2, 0xdf, 0x0b, \n\t0x01, 0x5d, 0xb2, 0xdf, 0x0b, 0x01, 0x71, 0x40, 0x09, 0x8f, 0x0b, 0x9f, \n\t0x0b, 0xaf, 0x0b, 0xbf, 0x0b, 0x04, 0x71, 0xb2, 0xbf, 0x0b, 0x01, 0x5d, \n\t0xb2, 0x6f, 0x0b, 0x01, 0x5d, 0xb2, 0xf0, 0x0b, 0x01, 0x71, 0xb2, 0x10, \n\t0x0b, 0x01, 0x72, 0x30, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4e, \n\t0x00, 0x00, 0x03, 0xd8, 0x05, 0xdb, 0x02, 0x26, 0x03, 0x75, 0x00, 0x00, \n\t0x01, 0x07, 0x00, 0x76, 0x01, 0x23, 0x00, 0x16, 0x00, 0x41, 0x00, 0xb2, \n\t0x9f, 0x0d, 0x01, 0x71, 0xb6, 0xbf, 0x0e, 0xcf, 0x0e, 0xdf, 0x0e, 0x03, \n\t0x5d, 0xb2, 0xbf, 0x0e, 0x01, 0x71, 0xb2, 0x1f, 0x0e, 0x01, 0x5d, 0xb6, \n\t0xdf, 0x0e, 0xef, 0x0e, 0xff, 0x0e, 0x03, 0x71, 0x40, 0x0b, 0x0f, 0x0e, \n\t0x1f, 0x0e, 0x2f, 0x0e, 0x3f, 0x0e, 0x4f, 0x0e, 0x05, 0x72, 0xb2, 0x2f, \n\t0x0e, 0x01, 0x71, 0xb2, 0x8f, 0x0e, 0x01, 0x5d, 0xb2, 0x6f, 0x0e, 0x01, \n\t0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x1e, 0x00, 0x00, 0x04, 0x35, \n\t0x05, 0xc9, 0x02, 0x26, 0x03, 0x76, 0x00, 0x00, 0x01, 0x06, 0x00, 0x6a, \n\t0x21, 0x19, 0x00, 0x63, 0x00, 0xb2, 0x0f, 0x0a, 0x01, 0x71, 0x40, 0x09, \n\t0x8f, 0x0a, 0x9f, 0x0a, 0xaf, 0x0a, 0xbf, 0x0a, 0x04, 0x71, 0xb2, 0x1f, \n\t0x0a, 0x01, 0x5d, 0xb6, 0xdf, 0x0a, 0xef, 0x0a, 0xff, 0x0a, 0x03, 0x71, \n\t0xb4, 0x5f, 0x0a, 0x6f, 0x0a, 0x02, 0x71, 0xb2, 0x8f, 0x0a, 0x01, 0x5d, \n\t0xb2, 0x6f, 0x0a, 0x01, 0x5d, 0xb2, 0x8f, 0x0d, 0x01, 0x5d, 0xb4, 0x5f, \n\t0x0d, 0x6f, 0x0d, 0x02, 0x71, 0xb6, 0xdf, 0x0d, 0xef, 0x0d, 0xff, 0x0d, \n\t0x03, 0x71, 0x40, 0x09, 0x8f, 0x0d, 0x9f, 0x0d, 0xaf, 0x0d, 0xbf, 0x0d, \n\t0x04, 0x71, 0xb2, 0x0f, 0x0d, 0x01, 0x71, 0xb2, 0x6f, 0x0d, 0x01, 0x5d, \n\t0xb2, 0x1f, 0x0d, 0x01, 0x5d, 0x30, 0x31, 0x00, 0xff, 0xff, 0x00, 0x1e, \n\t0x00, 0x00, 0x04, 0x35, 0x06, 0x04, 0x02, 0x26, 0x03, 0x76, 0x00, 0x00, \n\t0x01, 0x06, 0x01, 0x52, 0x46, 0x19, 0x00, 0x26, 0x00, 0xb2, 0xef, 0x0b, \n\t0x01, 0x71, 0xb2, 0xbf, 0x0d, 0x01, 0x5d, 0xb2, 0xff, 0x0d, 0x01, 0x71, \n\t0xb2, 0x1f, 0x0d, 0x01, 0x5d, 0xb2, 0xdf, 0x0d, 0x01, 0x71, 0xb2, 0x8f, \n\t0x0d, 0x01, 0x5d, 0xb2, 0x6f, 0x0d, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, \n\t0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x05, 0xc0, 0x06, 0x05, 0x02, 0x26, \n\t0x03, 0x78, 0x00, 0x00, 0x01, 0x07, 0x01, 0x52, 0x01, 0x1b, 0x00, 0x1a, \n\t0x00, 0x1c, 0x00, 0xb2, 0xbf, 0x16, 0x01, 0x5d, 0xb2, 0x1f, 0x16, 0x01, \n\t0x5d, 0xb2, 0xdf, 0x16, 0x01, 0x71, 0xb2, 0x8f, 0x16, 0x01, 0x5d, 0xb2, \n\t0x6f, 0x16, 0x01, 0x5d, 0x30, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x89, \n\t0xfe, 0x50, 0x04, 0x74, 0x04, 0x8d, 0x02, 0x26, 0x03, 0x7a, 0x00, 0x00, \n\t0x00, 0x07, 0x01, 0x57, 0x01, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, \n\t0x01, 0x4a, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, \n\t0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, \n\t0x00, 0x1f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x07, \n\t0x00, 0x25, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x1a, \n\t0x00, 0x2c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0e, \n\t0x00, 0x46, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x16, \n\t0x00, 0x54, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0e, \n\t0x00, 0x6a, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x20, \n\t0x00, 0x78, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x06, \n\t0x00, 0x98, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x0a, \n\t0x00, 0x9e, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x13, \n\t0x00, 0xa8, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x2e, \n\t0x00, 0xbb, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x2a, \n\t0x00, 0xe9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x0e, \n\t0x00, 0x46, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x00, 0x00, 0x3e, \n\t0x01, 0x13, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x01, 0x00, 0x0c, \n\t0x01, 0x51, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x02, 0x00, 0x0e, \n\t0x01, 0x5d, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x03, 0x00, 0x34, \n\t0x01, 0x6b, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x04, 0x00, 0x1c, \n\t0x01, 0x9f, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x05, 0x00, 0x2c, \n\t0x01, 0xbb, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x06, 0x00, 0x1c, \n\t0x01, 0xe7, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x07, 0x00, 0x40, \n\t0x02, 0x03, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x09, 0x00, 0x0c, \n\t0x02, 0x43, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x0b, 0x00, 0x14, \n\t0x02, 0x4f, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x0c, 0x00, 0x26, \n\t0x02, 0x63, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x0d, 0x00, 0x5c, \n\t0x02, 0x89, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x0e, 0x00, 0x54, \n\t0x02, 0xe5, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, \n\t0x63, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x47, 0x6f, \n\t0x6f, 0x67, 0x6c, 0x65, 0x20, 0x32, 0x30, 0x31, 0x32, 0x52, 0x6f, 0x62, \n\t0x6f, 0x74, 0x6f, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x47, 0x6f, \n\t0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x6f, 0x20, \n\t0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x3a, 0x32, 0x30, 0x31, 0x33, \n\t0x52, 0x6f, 0x62, 0x6f, 0x74, 0x6f, 0x20, 0x52, 0x65, 0x67, 0x75, 0x6c, \n\t0x61, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x31, 0x2e, \n\t0x31, 0x30, 0x30, 0x31, 0x34, 0x31, 0x3b, 0x20, 0x32, 0x30, 0x31, 0x33, \n\t0x52, 0x6f, 0x62, 0x6f, 0x74, 0x6f, 0x2d, 0x52, 0x65, 0x67, 0x75, 0x6c, \n\t0x61, 0x72, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x6f, 0x20, 0x69, 0x73, 0x20, \n\t0x61, 0x20, 0x74, 0x72, 0x61, 0x64, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x20, \n\t0x6f, 0x66, 0x20, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x47, 0x6f, \n\t0x6f, 0x67, 0x6c, 0x65, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, \n\t0x6f, 0x6d, 0x43, 0x68, 0x72, 0x69, 0x73, 0x74, 0x69, 0x61, 0x6e, 0x20, \n\t0x52, 0x6f, 0x62, 0x65, 0x72, 0x74, 0x73, 0x6f, 0x6e, 0x4c, 0x69, 0x63, \n\t0x65, 0x6e, 0x73, 0x65, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, \n\t0x74, 0x68, 0x65, 0x20, 0x41, 0x70, 0x61, 0x63, 0x68, 0x65, 0x20, 0x4c, \n\t0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2c, 0x20, 0x56, 0x65, 0x72, 0x73, \n\t0x69, 0x6f, 0x6e, 0x20, 0x32, 0x2e, 0x30, 0x68, 0x74, 0x74, 0x70, 0x3a, \n\t0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, \n\t0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, \n\t0x73, 0x2f, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x2d, 0x32, 0x2e, \n\t0x30, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, \n\t0x64, 0x00, 0x61, 0x00, 0x74, 0x00, 0x61, 0x00, 0x20, 0x00, 0x63, 0x00, \n\t0x6f, 0x00, 0x70, 0x00, 0x79, 0x00, 0x72, 0x00, 0x69, 0x00, 0x67, 0x00, \n\t0x68, 0x00, 0x74, 0x00, 0x20, 0x00, 0x47, 0x00, 0x6f, 0x00, 0x6f, 0x00, \n\t0x67, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x20, 0x00, 0x32, 0x00, 0x30, 0x00, \n\t0x31, 0x00, 0x32, 0x00, 0x52, 0x00, 0x6f, 0x00, 0x62, 0x00, 0x6f, 0x00, \n\t0x74, 0x00, 0x6f, 0x00, 0x52, 0x00, 0x65, 0x00, 0x67, 0x00, 0x75, 0x00, \n\t0x6c, 0x00, 0x61, 0x00, 0x72, 0x00, 0x47, 0x00, 0x6f, 0x00, 0x6f, 0x00, \n\t0x67, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x3a, 0x00, 0x52, 0x00, 0x6f, 0x00, \n\t0x62, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x52, 0x00, \n\t0x65, 0x00, 0x67, 0x00, 0x75, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x72, 0x00, \n\t0x3a, 0x00, 0x32, 0x00, 0x30, 0x00, 0x31, 0x00, 0x33, 0x00, 0x52, 0x00, \n\t0x6f, 0x00, 0x62, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, \n\t0x52, 0x00, 0x65, 0x00, 0x67, 0x00, 0x75, 0x00, 0x6c, 0x00, 0x61, 0x00, \n\t0x72, 0x00, 0x56, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x69, 0x00, \n\t0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x31, 0x00, 0x2e, 0x00, 0x31, 0x00, \n\t0x30, 0x00, 0x30, 0x00, 0x31, 0x00, 0x34, 0x00, 0x31, 0x00, 0x3b, 0x00, \n\t0x20, 0x00, 0x32, 0x00, 0x30, 0x00, 0x31, 0x00, 0x33, 0x00, 0x52, 0x00, \n\t0x6f, 0x00, 0x62, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x2d, 0x00, \n\t0x52, 0x00, 0x65, 0x00, 0x67, 0x00, 0x75, 0x00, 0x6c, 0x00, 0x61, 0x00, \n\t0x72, 0x00, 0x52, 0x00, 0x6f, 0x00, 0x62, 0x00, 0x6f, 0x00, 0x74, 0x00, \n\t0x6f, 0x00, 0x20, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x61, 0x00, \n\t0x20, 0x00, 0x74, 0x00, 0x72, 0x00, 0x61, 0x00, 0x64, 0x00, 0x65, 0x00, \n\t0x6d, 0x00, 0x61, 0x00, 0x72, 0x00, 0x6b, 0x00, 0x20, 0x00, 0x6f, 0x00, \n\t0x66, 0x00, 0x20, 0x00, 0x47, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x67, 0x00, \n\t0x6c, 0x00, 0x65, 0x00, 0x2e, 0x00, 0x47, 0x00, 0x6f, 0x00, 0x6f, 0x00, \n\t0x67, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x47, 0x00, 0x6f, 0x00, 0x6f, 0x00, \n\t0x67, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x2e, 0x00, 0x63, 0x00, 0x6f, 0x00, \n\t0x6d, 0x00, 0x43, 0x00, 0x68, 0x00, 0x72, 0x00, 0x69, 0x00, 0x73, 0x00, \n\t0x74, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x52, 0x00, \n\t0x6f, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, 0x73, 0x00, \n\t0x6f, 0x00, 0x6e, 0x00, 0x4c, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, \n\t0x6e, 0x00, 0x73, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x75, 0x00, \n\t0x6e, 0x00, 0x64, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x74, 0x00, \n\t0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x41, 0x00, 0x70, 0x00, 0x61, 0x00, \n\t0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x4c, 0x00, 0x69, 0x00, \n\t0x63, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x65, 0x00, 0x2c, 0x00, \n\t0x20, 0x00, 0x56, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x69, 0x00, \n\t0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x32, 0x00, 0x2e, 0x00, 0x30, 0x00, \n\t0x68, 0x00, 0x74, 0x00, 0x74, 0x00, 0x70, 0x00, 0x3a, 0x00, 0x2f, 0x00, \n\t0x2f, 0x00, 0x77, 0x00, 0x77, 0x00, 0x77, 0x00, 0x2e, 0x00, 0x61, 0x00, \n\t0x70, 0x00, 0x61, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x2e, 0x00, \n\t0x6f, 0x00, 0x72, 0x00, 0x67, 0x00, 0x2f, 0x00, 0x6c, 0x00, 0x69, 0x00, \n\t0x63, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x65, 0x00, 0x73, 0x00, \n\t0x2f, 0x00, 0x4c, 0x00, 0x49, 0x00, 0x43, 0x00, 0x45, 0x00, 0x4e, 0x00, \n\t0x53, 0x00, 0x45, 0x00, 0x2d, 0x00, 0x32, 0x00, 0x2e, 0x00, 0x30, 0x00, \n\t0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x6a, 0x00, 0x64, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0b, 0x00, 0x00, \n\t0x01, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, \n\t0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, \n\t0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x12, \n\t0x00, 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x18, \n\t0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, \n\t0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, \n\t0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, \n\t0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, \n\t0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, \n\t0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, \n\t0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, \n\t0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, \n\t0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, \n\t0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, \n\t0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, \n\t0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x5f, 0x00, 0x60, \n\t0x00, 0x61, 0x00, 0xac, 0x00, 0xa3, 0x00, 0x84, 0x00, 0x85, 0x00, 0xbd, \n\t0x00, 0x96, 0x00, 0xe8, 0x00, 0x86, 0x00, 0x8e, 0x00, 0x8b, 0x00, 0x9d, \n\t0x00, 0xa9, 0x00, 0xa4, 0x01, 0x03, 0x00, 0x8a, 0x01, 0x04, 0x00, 0x83, \n\t0x00, 0x93, 0x00, 0xf2, 0x00, 0xf3, 0x00, 0x8d, 0x00, 0x97, 0x00, 0x88, \n\t0x01, 0x05, 0x00, 0xde, 0x00, 0xf1, 0x00, 0x9e, 0x00, 0xaa, 0x00, 0xf5, \n\t0x00, 0xf4, 0x00, 0xf6, 0x00, 0xa2, 0x00, 0xad, 0x00, 0xc9, 0x00, 0xc7, \n\t0x00, 0xae, 0x00, 0x62, 0x00, 0x63, 0x00, 0x90, 0x00, 0x64, 0x00, 0xcb, \n\t0x00, 0x65, 0x00, 0xc8, 0x00, 0xca, 0x00, 0xcf, 0x00, 0xcc, 0x00, 0xcd, \n\t0x00, 0xce, 0x00, 0xe9, 0x00, 0x66, 0x00, 0xd3, 0x00, 0xd0, 0x00, 0xd1, \n\t0x00, 0xaf, 0x00, 0x67, 0x00, 0xf0, 0x00, 0x91, 0x00, 0xd6, 0x00, 0xd4, \n\t0x00, 0xd5, 0x00, 0x68, 0x00, 0xeb, 0x00, 0xed, 0x00, 0x89, 0x00, 0x6a, \n\t0x00, 0x69, 0x00, 0x6b, 0x00, 0x6d, 0x00, 0x6c, 0x00, 0x6e, 0x00, 0xa0, \n\t0x00, 0x6f, 0x00, 0x71, 0x00, 0x70, 0x00, 0x72, 0x00, 0x73, 0x00, 0x75, \n\t0x00, 0x74, 0x00, 0x76, 0x00, 0x77, 0x00, 0xea, 0x00, 0x78, 0x00, 0x7a, \n\t0x00, 0x79, 0x00, 0x7b, 0x00, 0x7d, 0x00, 0x7c, 0x00, 0xb8, 0x00, 0xa1, \n\t0x00, 0x7f, 0x00, 0x7e, 0x00, 0x80, 0x00, 0x81, 0x00, 0xec, 0x00, 0xee, \n\t0x00, 0xba, 0x01, 0x06, 0x01, 0x07, 0x01, 0x08, 0x01, 0x09, 0x01, 0x0a, \n\t0x01, 0x0b, 0x00, 0xfd, 0x00, 0xfe, 0x01, 0x0c, 0x01, 0x0d, 0x01, 0x0e, \n\t0x01, 0x0f, 0x00, 0xff, 0x01, 0x00, 0x01, 0x10, 0x01, 0x11, 0x01, 0x12, \n\t0x01, 0x13, 0x01, 0x14, 0x01, 0x15, 0x01, 0x16, 0x01, 0x17, 0x01, 0x18, \n\t0x01, 0x19, 0x01, 0x1a, 0x01, 0x1b, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x1e, \n\t0x01, 0x1f, 0x00, 0xf8, 0x00, 0xf9, 0x01, 0x20, 0x01, 0x21, 0x01, 0x22, \n\t0x01, 0x23, 0x01, 0x24, 0x01, 0x25, 0x01, 0x26, 0x01, 0x27, 0x01, 0x28, \n\t0x01, 0x29, 0x01, 0x2a, 0x01, 0x2b, 0x01, 0x2c, 0x01, 0x2d, 0x01, 0x2e, \n\t0x01, 0x2f, 0x01, 0x30, 0x00, 0xd7, 0x01, 0x31, 0x01, 0x32, 0x01, 0x33, \n\t0x01, 0x34, 0x01, 0x35, 0x01, 0x36, 0x01, 0x37, 0x01, 0x38, 0x01, 0x39, \n\t0x01, 0x3a, 0x01, 0x3b, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0x3e, 0x01, 0x3f, \n\t0x00, 0xe2, 0x00, 0xe3, 0x01, 0x40, 0x01, 0x41, 0x01, 0x42, 0x01, 0x43, \n\t0x01, 0x44, 0x01, 0x45, 0x01, 0x46, 0x01, 0x47, 0x01, 0x48, 0x01, 0x49, \n\t0x01, 0x4a, 0x01, 0x4b, 0x01, 0x4c, 0x01, 0x4d, 0x01, 0x4e, 0x00, 0xb0, \n\t0x00, 0xb1, 0x01, 0x4f, 0x01, 0x50, 0x01, 0x51, 0x01, 0x52, 0x01, 0x53, \n\t0x01, 0x54, 0x01, 0x55, 0x01, 0x56, 0x01, 0x57, 0x01, 0x58, 0x00, 0xfb, \n\t0x00, 0xfc, 0x00, 0xe4, 0x00, 0xe5, 0x01, 0x59, 0x01, 0x5a, 0x01, 0x5b, \n\t0x01, 0x5c, 0x01, 0x5d, 0x01, 0x5e, 0x01, 0x5f, 0x01, 0x60, 0x01, 0x61, \n\t0x01, 0x62, 0x01, 0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x66, 0x01, 0x67, \n\t0x01, 0x68, 0x01, 0x69, 0x01, 0x6a, 0x01, 0x6b, 0x01, 0x6c, 0x01, 0x6d, \n\t0x01, 0x6e, 0x00, 0xbb, 0x01, 0x6f, 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, \n\t0x00, 0xe6, 0x00, 0xe7, 0x01, 0x73, 0x00, 0xa6, 0x01, 0x74, 0x01, 0x75, \n\t0x01, 0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, \n\t0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x80, 0x01, 0x81, \n\t0x01, 0x82, 0x00, 0xd8, 0x00, 0xe1, 0x00, 0xdb, 0x00, 0xdc, 0x00, 0xdd, \n\t0x00, 0xe0, 0x00, 0xd9, 0x00, 0xdf, 0x01, 0x83, 0x01, 0x84, 0x01, 0x85, \n\t0x01, 0x86, 0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, 0x8a, 0x01, 0x8b, \n\t0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x8f, 0x01, 0x90, 0x01, 0x91, \n\t0x01, 0x92, 0x01, 0x93, 0x01, 0x94, 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, \n\t0x01, 0x98, 0x01, 0x99, 0x01, 0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, \n\t0x01, 0x9e, 0x01, 0x9f, 0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, 0xa3, \n\t0x01, 0xa4, 0x01, 0xa5, 0x01, 0xa6, 0x01, 0xa7, 0x01, 0xa8, 0x01, 0xa9, \n\t0x01, 0xaa, 0x01, 0xab, 0x00, 0x9f, 0x01, 0xac, 0x01, 0xad, 0x01, 0xae, \n\t0x01, 0xaf, 0x01, 0xb0, 0x01, 0xb1, 0x01, 0xb2, 0x01, 0xb3, 0x01, 0xb4, \n\t0x01, 0xb5, 0x01, 0xb6, 0x01, 0xb7, 0x01, 0xb8, 0x01, 0xb9, 0x01, 0xba, \n\t0x01, 0xbb, 0x01, 0xbc, 0x01, 0xbd, 0x01, 0xbe, 0x01, 0xbf, 0x01, 0xc0, \n\t0x01, 0xc1, 0x00, 0x9b, 0x01, 0xc2, 0x01, 0xc3, 0x01, 0xc4, 0x01, 0xc5, \n\t0x01, 0xc6, 0x01, 0xc7, 0x01, 0xc8, 0x01, 0xc9, 0x01, 0xca, 0x01, 0xcb, \n\t0x01, 0xcc, 0x01, 0xcd, 0x01, 0xce, 0x01, 0xcf, 0x01, 0xd0, 0x01, 0xd1, \n\t0x01, 0xd2, 0x01, 0xd3, 0x01, 0xd4, 0x01, 0xd5, 0x01, 0xd6, 0x01, 0xd7, \n\t0x01, 0xd8, 0x01, 0xd9, 0x01, 0xda, 0x01, 0xdb, 0x01, 0xdc, 0x01, 0xdd, \n\t0x01, 0xde, 0x01, 0xdf, 0x01, 0xe0, 0x01, 0xe1, 0x01, 0xe2, 0x01, 0xe3, \n\t0x01, 0xe4, 0x01, 0xe5, 0x01, 0xe6, 0x01, 0xe7, 0x01, 0xe8, 0x01, 0xe9, \n\t0x01, 0xea, 0x01, 0xeb, 0x01, 0xec, 0x01, 0xed, 0x01, 0xee, 0x01, 0xef, \n\t0x01, 0xf0, 0x01, 0xf1, 0x01, 0xf2, 0x01, 0xf3, 0x01, 0xf4, 0x01, 0xf5, \n\t0x01, 0xf6, 0x01, 0xf7, 0x01, 0xf8, 0x01, 0xf9, 0x01, 0xfa, 0x01, 0xfb, \n\t0x01, 0xfc, 0x01, 0xfd, 0x01, 0xfe, 0x01, 0xff, 0x02, 0x00, 0x02, 0x01, \n\t0x02, 0x02, 0x02, 0x03, 0x02, 0x04, 0x02, 0x05, 0x02, 0x06, 0x02, 0x07, \n\t0x02, 0x08, 0x02, 0x09, 0x02, 0x0a, 0x02, 0x0b, 0x02, 0x0c, 0x02, 0x0d, \n\t0x02, 0x0e, 0x02, 0x0f, 0x02, 0x10, 0x02, 0x11, 0x02, 0x12, 0x02, 0x13, \n\t0x02, 0x14, 0x02, 0x15, 0x02, 0x16, 0x02, 0x17, 0x02, 0x18, 0x02, 0x19, \n\t0x02, 0x1a, 0x02, 0x1b, 0x02, 0x1c, 0x02, 0x1d, 0x02, 0x1e, 0x02, 0x1f, \n\t0x02, 0x20, 0x02, 0x21, 0x02, 0x22, 0x02, 0x23, 0x02, 0x24, 0x02, 0x25, \n\t0x02, 0x26, 0x02, 0x27, 0x02, 0x28, 0x02, 0x29, 0x02, 0x2a, 0x02, 0x2b, \n\t0x02, 0x2c, 0x02, 0x2d, 0x02, 0x2e, 0x02, 0x2f, 0x02, 0x30, 0x02, 0x31, \n\t0x02, 0x32, 0x02, 0x33, 0x02, 0x34, 0x02, 0x35, 0x02, 0x36, 0x02, 0x37, \n\t0x02, 0x38, 0x02, 0x39, 0x02, 0x3a, 0x02, 0x3b, 0x02, 0x3c, 0x02, 0x3d, \n\t0x02, 0x3e, 0x02, 0x3f, 0x02, 0x40, 0x02, 0x41, 0x02, 0x42, 0x02, 0x43, \n\t0x02, 0x44, 0x02, 0x45, 0x02, 0x46, 0x02, 0x47, 0x02, 0x48, 0x02, 0x49, \n\t0x02, 0x4a, 0x02, 0x4b, 0x02, 0x4c, 0x02, 0x4d, 0x02, 0x4e, 0x02, 0x4f, \n\t0x02, 0x50, 0x02, 0x51, 0x02, 0x52, 0x02, 0x53, 0x02, 0x54, 0x02, 0x55, \n\t0x02, 0x56, 0x02, 0x57, 0x02, 0x58, 0x02, 0x59, 0x02, 0x5a, 0x02, 0x5b, \n\t0x02, 0x5c, 0x02, 0x5d, 0x02, 0x5e, 0x02, 0x5f, 0x02, 0x60, 0x02, 0x61, \n\t0x02, 0x62, 0x02, 0x63, 0x02, 0x64, 0x02, 0x65, 0x02, 0x66, 0x02, 0x67, \n\t0x02, 0x68, 0x02, 0x69, 0x02, 0x6a, 0x02, 0x6b, 0x02, 0x6c, 0x02, 0x6d, \n\t0x02, 0x6e, 0x02, 0x6f, 0x02, 0x70, 0x02, 0x71, 0x02, 0x72, 0x02, 0x73, \n\t0x02, 0x74, 0x02, 0x75, 0x02, 0x76, 0x02, 0x77, 0x02, 0x78, 0x02, 0x79, \n\t0x02, 0x7a, 0x02, 0x7b, 0x02, 0x7c, 0x02, 0x7d, 0x02, 0x7e, 0x02, 0x7f, \n\t0x02, 0x80, 0x02, 0x81, 0x02, 0x82, 0x02, 0x83, 0x02, 0x84, 0x02, 0x85, \n\t0x02, 0x86, 0x02, 0x87, 0x02, 0x88, 0x02, 0x89, 0x02, 0x8a, 0x02, 0x8b, \n\t0x02, 0x8c, 0x02, 0x8d, 0x02, 0x8e, 0x02, 0x8f, 0x02, 0x90, 0x02, 0x91, \n\t0x02, 0x92, 0x02, 0x93, 0x02, 0x94, 0x02, 0x95, 0x02, 0x96, 0x02, 0x97, \n\t0x02, 0x98, 0x02, 0x99, 0x02, 0x9a, 0x02, 0x9b, 0x02, 0x9c, 0x02, 0x9d, \n\t0x02, 0x9e, 0x02, 0x9f, 0x02, 0xa0, 0x02, 0xa1, 0x02, 0xa2, 0x02, 0xa3, \n\t0x02, 0xa4, 0x02, 0xa5, 0x02, 0xa6, 0x02, 0xa7, 0x02, 0xa8, 0x02, 0xa9, \n\t0x02, 0xaa, 0x02, 0xab, 0x02, 0xac, 0x02, 0xad, 0x02, 0xae, 0x02, 0xaf, \n\t0x02, 0xb0, 0x02, 0xb1, 0x02, 0xb2, 0x02, 0xb3, 0x02, 0xb4, 0x02, 0xb5, \n\t0x02, 0xb6, 0x02, 0xb7, 0x02, 0xb8, 0x02, 0xb9, 0x02, 0xba, 0x02, 0xbb, \n\t0x02, 0xbc, 0x02, 0xbd, 0x02, 0xbe, 0x02, 0xbf, 0x02, 0xc0, 0x02, 0xc1, \n\t0x02, 0xc2, 0x02, 0xc3, 0x02, 0xc4, 0x02, 0xc5, 0x02, 0xc6, 0x02, 0xc7, \n\t0x02, 0xc8, 0x02, 0xc9, 0x02, 0xca, 0x02, 0xcb, 0x02, 0xcc, 0x02, 0xcd, \n\t0x02, 0xce, 0x02, 0xcf, 0x02, 0xd0, 0x02, 0xd1, 0x02, 0xd2, 0x02, 0xd3, \n\t0x02, 0xd4, 0x02, 0xd5, 0x02, 0xd6, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd9, \n\t0x02, 0xda, 0x02, 0xdb, 0x02, 0xdc, 0x02, 0xdd, 0x02, 0xde, 0x02, 0xdf, \n\t0x02, 0xe0, 0x02, 0xe1, 0x02, 0xe2, 0x02, 0xe3, 0x02, 0xe4, 0x02, 0xe5, \n\t0x02, 0xe6, 0x02, 0xe7, 0x02, 0xe8, 0x02, 0xe9, 0x02, 0xea, 0x02, 0xeb, \n\t0x02, 0xec, 0x02, 0xed, 0x02, 0xee, 0x02, 0xef, 0x02, 0xf0, 0x02, 0xf1, \n\t0x02, 0xf2, 0x02, 0xf3, 0x02, 0xf4, 0x02, 0xf5, 0x02, 0xf6, 0x02, 0xf7, \n\t0x02, 0xf8, 0x02, 0xf9, 0x02, 0xfa, 0x02, 0xfb, 0x02, 0xfc, 0x02, 0xfd, \n\t0x02, 0xfe, 0x02, 0xff, 0x03, 0x00, 0x03, 0x01, 0x03, 0x02, 0x03, 0x03, \n\t0x03, 0x04, 0x03, 0x05, 0x03, 0x06, 0x03, 0x07, 0x03, 0x08, 0x03, 0x09, \n\t0x03, 0x0a, 0x03, 0x0b, 0x03, 0x0c, 0x03, 0x0d, 0x03, 0x0e, 0x03, 0x0f, \n\t0x03, 0x10, 0x03, 0x11, 0x03, 0x12, 0x03, 0x13, 0x03, 0x14, 0x03, 0x15, \n\t0x03, 0x16, 0x03, 0x17, 0x03, 0x18, 0x03, 0x19, 0x03, 0x1a, 0x03, 0x1b, \n\t0x03, 0x1c, 0x03, 0x1d, 0x03, 0x1e, 0x03, 0x1f, 0x03, 0x20, 0x03, 0x21, \n\t0x03, 0x22, 0x03, 0x23, 0x03, 0x24, 0x03, 0x25, 0x03, 0x26, 0x03, 0x27, \n\t0x03, 0x28, 0x03, 0x29, 0x03, 0x2a, 0x03, 0x2b, 0x03, 0x2c, 0x03, 0x2d, \n\t0x03, 0x2e, 0x03, 0x2f, 0x03, 0x30, 0x03, 0x31, 0x03, 0x32, 0x03, 0x33, \n\t0x03, 0x34, 0x03, 0x35, 0x03, 0x36, 0x03, 0x37, 0x03, 0x38, 0x03, 0x39, \n\t0x03, 0x3a, 0x03, 0x3b, 0x03, 0x3c, 0x03, 0x3d, 0x03, 0x3e, 0x03, 0x3f, \n\t0x03, 0x40, 0x03, 0x41, 0x03, 0x42, 0x03, 0x43, 0x03, 0x44, 0x03, 0x45, \n\t0x03, 0x46, 0x03, 0x47, 0x03, 0x48, 0x03, 0x49, 0x03, 0x4a, 0x03, 0x4b, \n\t0x03, 0x4c, 0x03, 0x4d, 0x03, 0x4e, 0x03, 0x4f, 0x03, 0x50, 0x03, 0x51, \n\t0x03, 0x52, 0x03, 0x53, 0x03, 0x54, 0x03, 0x55, 0x03, 0x56, 0x00, 0xb2, \n\t0x00, 0xb3, 0x03, 0x57, 0x03, 0x58, 0x00, 0xb6, 0x00, 0xb7, 0x00, 0xc4, \n\t0x03, 0x59, 0x00, 0xb4, 0x00, 0xb5, 0x00, 0xc5, 0x00, 0x82, 0x00, 0xc2, \n\t0x00, 0x87, 0x03, 0x5a, 0x00, 0xab, 0x00, 0xc6, 0x03, 0x5b, 0x03, 0x5c, \n\t0x00, 0xbe, 0x00, 0xbf, 0x03, 0x5d, 0x00, 0xbc, 0x03, 0x5e, 0x03, 0x5f, \n\t0x00, 0xf7, 0x03, 0x60, 0x03, 0x61, 0x03, 0x62, 0x03, 0x63, 0x03, 0x64, \n\t0x03, 0x65, 0x03, 0x66, 0x00, 0x8c, 0x03, 0x67, 0x03, 0x68, 0x03, 0x69, \n\t0x03, 0x6a, 0x03, 0x6b, 0x00, 0x98, 0x00, 0x9a, 0x00, 0x99, 0x00, 0xef, \n\t0x00, 0xa5, 0x00, 0x92, 0x00, 0x9c, 0x00, 0xa7, 0x00, 0x8f, 0x00, 0x94, \n\t0x00, 0x95, 0x00, 0xb9, 0x03, 0x6c, 0x00, 0xc0, 0x03, 0x6d, 0x03, 0x6e, \n\t0x03, 0x6f, 0x03, 0x70, 0x03, 0x71, 0x03, 0x72, 0x03, 0x73, 0x03, 0x74, \n\t0x03, 0x75, 0x03, 0x76, 0x03, 0x77, 0x03, 0x78, 0x03, 0x79, 0x03, 0x7a, \n\t0x03, 0x7b, 0x03, 0x7c, 0x03, 0x7d, 0x03, 0x7e, 0x03, 0x7f, 0x03, 0x80, \n\t0x03, 0x81, 0x03, 0x82, 0x03, 0x83, 0x03, 0x84, 0x03, 0x85, 0x03, 0x86, \n\t0x03, 0x87, 0x03, 0x88, 0x03, 0x89, 0x03, 0x8a, 0x03, 0x8b, 0x03, 0x8c, \n\t0x03, 0x8d, 0x03, 0x8e, 0x03, 0x8f, 0x03, 0x90, 0x03, 0x91, 0x03, 0x92, \n\t0x03, 0x93, 0x03, 0x94, 0x03, 0x95, 0x03, 0x96, 0x03, 0x97, 0x03, 0x98, \n\t0x03, 0x99, 0x03, 0x9a, 0x03, 0x9b, 0x03, 0x9c, 0x03, 0x9d, 0x03, 0x9e, \n\t0x03, 0x9f, 0x03, 0xa0, 0x03, 0xa1, 0x03, 0xa2, 0x03, 0xa3, 0x03, 0xa4, \n\t0x03, 0xa5, 0x03, 0xa6, 0x03, 0xa7, 0x03, 0xa8, 0x03, 0xa9, 0x03, 0xaa, \n\t0x03, 0xab, 0x03, 0xac, 0x03, 0xad, 0x03, 0xae, 0x03, 0xaf, 0x03, 0xb0, \n\t0x03, 0xb1, 0x03, 0xb2, 0x03, 0xb3, 0x03, 0xb4, 0x03, 0xb5, 0x03, 0xb6, \n\t0x03, 0xb7, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xbb, 0x03, 0xbc, \n\t0x03, 0xbd, 0x03, 0xbe, 0x03, 0xbf, 0x03, 0xc0, 0x03, 0xc1, 0x03, 0xc2, \n\t0x03, 0xc3, 0x03, 0xc4, 0x03, 0xc5, 0x03, 0xc6, 0x03, 0xc7, 0x03, 0xc8, \n\t0x03, 0xc9, 0x03, 0xca, 0x03, 0xcb, 0x03, 0xcc, 0x03, 0xcd, 0x03, 0xce, \n\t0x03, 0xcf, 0x03, 0xd0, 0x03, 0xd1, 0x03, 0xd2, 0x03, 0xd3, 0x03, 0xd4, \n\t0x03, 0xd5, 0x03, 0xd6, 0x03, 0xd7, 0x03, 0xd8, 0x03, 0xd9, 0x03, 0xda, \n\t0x03, 0xdb, 0x03, 0xdc, 0x03, 0xdd, 0x03, 0xde, 0x03, 0xdf, 0x03, 0xe0, \n\t0x03, 0xe1, 0x03, 0xe2, 0x03, 0xe3, 0x03, 0xe4, 0x03, 0xe5, 0x03, 0xe6, \n\t0x03, 0xe7, 0x03, 0xe8, 0x03, 0xe9, 0x03, 0xea, 0x03, 0xeb, 0x03, 0xec, \n\t0x03, 0xed, 0x03, 0xee, 0x03, 0xef, 0x03, 0xf0, 0x03, 0xf1, 0x03, 0xf2, \n\t0x03, 0xf3, 0x03, 0xf4, 0x03, 0xf5, 0x03, 0xf6, 0x03, 0xf7, 0x03, 0xf8, \n\t0x03, 0xf9, 0x03, 0xfa, 0x03, 0xfb, 0x03, 0xfc, 0x03, 0xfd, 0x03, 0xfe, \n\t0x03, 0xff, 0x04, 0x00, 0x04, 0x01, 0x04, 0x02, 0x04, 0x03, 0x04, 0x04, \n\t0x04, 0x05, 0x04, 0x06, 0x04, 0x07, 0x04, 0x08, 0x04, 0x09, 0x04, 0x0a, \n\t0x04, 0x0b, 0x04, 0x0c, 0x04, 0x0d, 0x04, 0x0e, 0x04, 0x0f, 0x04, 0x10, \n\t0x04, 0x11, 0x04, 0x12, 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x30, 0x41, 0x44, 0x06, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, \n\t0x0e, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x63, 0x65, 0x6e, 0x74, 0x65, \n\t0x72, 0x65, 0x64, 0x07, 0x41, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x07, \n\t0x61, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x06, 0x41, 0x62, 0x72, 0x65, \n\t0x76, 0x65, 0x06, 0x61, 0x62, 0x72, 0x65, 0x76, 0x65, 0x07, 0x41, 0x6f, \n\t0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x07, 0x61, 0x6f, 0x67, 0x6f, 0x6e, 0x65, \n\t0x6b, 0x0b, 0x43, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, \n\t0x78, 0x0b, 0x63, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, \n\t0x78, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x30, 0x41, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x31, 0x30, 0x42, 0x06, 0x44, 0x63, 0x61, 0x72, 0x6f, 0x6e, \n\t0x06, 0x64, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x44, 0x63, 0x72, 0x6f, \n\t0x61, 0x74, 0x06, 0x64, 0x63, 0x72, 0x6f, 0x61, 0x74, 0x07, 0x45, 0x6d, \n\t0x61, 0x63, 0x72, 0x6f, 0x6e, 0x07, 0x65, 0x6d, 0x61, 0x63, 0x72, 0x6f, \n\t0x6e, 0x06, 0x45, 0x62, 0x72, 0x65, 0x76, 0x65, 0x06, 0x65, 0x62, 0x72, \n\t0x65, 0x76, 0x65, 0x0a, 0x45, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, \n\t0x6e, 0x74, 0x0a, 0x65, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, \n\t0x74, 0x07, 0x45, 0x6f, 0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x07, 0x65, 0x6f, \n\t0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x06, 0x45, 0x63, 0x61, 0x72, 0x6f, 0x6e, \n\t0x06, 0x65, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x0b, 0x47, 0x63, 0x69, 0x72, \n\t0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0b, 0x67, 0x63, 0x69, 0x72, \n\t0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x07, 0x75, 0x6e, 0x69, 0x30, \n\t0x31, 0x32, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x32, 0x31, 0x0c, \n\t0x47, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, \n\t0x0c, 0x67, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, \n\t0x74, 0x0b, 0x48, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, \n\t0x78, 0x0b, 0x68, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, \n\t0x78, 0x04, 0x48, 0x62, 0x61, 0x72, 0x04, 0x68, 0x62, 0x61, 0x72, 0x06, \n\t0x49, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x06, 0x69, 0x74, 0x69, 0x6c, 0x64, \n\t0x65, 0x07, 0x49, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x07, 0x69, 0x6d, \n\t0x61, 0x63, 0x72, 0x6f, 0x6e, 0x06, 0x49, 0x62, 0x72, 0x65, 0x76, 0x65, \n\t0x06, 0x69, 0x62, 0x72, 0x65, 0x76, 0x65, 0x07, 0x49, 0x6f, 0x67, 0x6f, \n\t0x6e, 0x65, 0x6b, 0x07, 0x69, 0x6f, 0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x0a, \n\t0x49, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x02, 0x49, \n\t0x4a, 0x02, 0x69, 0x6a, 0x0b, 0x4a, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, \n\t0x66, 0x6c, 0x65, 0x78, 0x0b, 0x6a, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, \n\t0x66, 0x6c, 0x65, 0x78, 0x0c, 0x4b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, \n\t0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x6b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, \n\t0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x6b, 0x67, 0x72, 0x65, 0x65, \n\t0x6e, 0x6c, 0x61, 0x6e, 0x64, 0x69, 0x63, 0x06, 0x4c, 0x61, 0x63, 0x75, \n\t0x74, 0x65, 0x06, 0x6c, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0c, 0x4c, 0x63, \n\t0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x6c, \n\t0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x06, \n\t0x4c, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x6c, 0x63, 0x61, 0x72, 0x6f, \n\t0x6e, 0x04, 0x4c, 0x64, 0x6f, 0x74, 0x04, 0x6c, 0x64, 0x6f, 0x74, 0x06, \n\t0x4e, 0x61, 0x63, 0x75, 0x74, 0x65, 0x06, 0x6e, 0x61, 0x63, 0x75, 0x74, \n\t0x65, 0x0c, 0x4e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, \n\t0x6e, 0x74, 0x0c, 0x6e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, \n\t0x65, 0x6e, 0x74, 0x06, 0x4e, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x6e, \n\t0x63, 0x61, 0x72, 0x6f, 0x6e, 0x0b, 0x6e, 0x61, 0x70, 0x6f, 0x73, 0x74, \n\t0x72, 0x6f, 0x70, 0x68, 0x65, 0x03, 0x45, 0x6e, 0x67, 0x03, 0x65, 0x6e, \n\t0x67, 0x07, 0x4f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x07, 0x6f, 0x6d, \n\t0x61, 0x63, 0x72, 0x6f, 0x6e, 0x06, 0x4f, 0x62, 0x72, 0x65, 0x76, 0x65, \n\t0x06, 0x6f, 0x62, 0x72, 0x65, 0x76, 0x65, 0x0d, 0x4f, 0x68, 0x75, 0x6e, \n\t0x67, 0x61, 0x72, 0x75, 0x6d, 0x6c, 0x61, 0x75, 0x74, 0x0d, 0x6f, 0x68, \n\t0x75, 0x6e, 0x67, 0x61, 0x72, 0x75, 0x6d, 0x6c, 0x61, 0x75, 0x74, 0x06, \n\t0x52, 0x61, 0x63, 0x75, 0x74, 0x65, 0x06, 0x72, 0x61, 0x63, 0x75, 0x74, \n\t0x65, 0x0c, 0x52, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, \n\t0x6e, 0x74, 0x0c, 0x72, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, \n\t0x65, 0x6e, 0x74, 0x06, 0x52, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x72, \n\t0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x53, 0x61, 0x63, 0x75, 0x74, 0x65, \n\t0x06, 0x73, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0b, 0x53, 0x63, 0x69, 0x72, \n\t0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0b, 0x73, 0x63, 0x69, 0x72, \n\t0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0c, 0x54, 0x63, 0x6f, 0x6d, \n\t0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x74, 0x63, 0x6f, \n\t0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x06, 0x54, 0x63, \n\t0x61, 0x72, 0x6f, 0x6e, 0x06, 0x74, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x04, \n\t0x54, 0x62, 0x61, 0x72, 0x04, 0x74, 0x62, 0x61, 0x72, 0x06, 0x55, 0x74, \n\t0x69, 0x6c, 0x64, 0x65, 0x06, 0x75, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x07, \n\t0x55, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x07, 0x75, 0x6d, 0x61, 0x63, \n\t0x72, 0x6f, 0x6e, 0x06, 0x55, 0x62, 0x72, 0x65, 0x76, 0x65, 0x06, 0x75, \n\t0x62, 0x72, 0x65, 0x76, 0x65, 0x05, 0x55, 0x72, 0x69, 0x6e, 0x67, 0x05, \n\t0x75, 0x72, 0x69, 0x6e, 0x67, 0x0d, 0x55, 0x68, 0x75, 0x6e, 0x67, 0x61, \n\t0x72, 0x75, 0x6d, 0x6c, 0x61, 0x75, 0x74, 0x0d, 0x75, 0x68, 0x75, 0x6e, \n\t0x67, 0x61, 0x72, 0x75, 0x6d, 0x6c, 0x61, 0x75, 0x74, 0x07, 0x55, 0x6f, \n\t0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x07, 0x75, 0x6f, 0x67, 0x6f, 0x6e, 0x65, \n\t0x6b, 0x0b, 0x57, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, \n\t0x78, 0x0b, 0x77, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, \n\t0x78, 0x0b, 0x59, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, \n\t0x78, 0x0b, 0x79, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, \n\t0x78, 0x06, 0x5a, 0x61, 0x63, 0x75, 0x74, 0x65, 0x06, 0x7a, 0x61, 0x63, \n\t0x75, 0x74, 0x65, 0x0a, 0x5a, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, \n\t0x6e, 0x74, 0x0a, 0x7a, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, \n\t0x74, 0x05, 0x6c, 0x6f, 0x6e, 0x67, 0x73, 0x05, 0x4f, 0x68, 0x6f, 0x72, \n\t0x6e, 0x05, 0x6f, 0x68, 0x6f, 0x72, 0x6e, 0x05, 0x55, 0x68, 0x6f, 0x72, \n\t0x6e, 0x05, 0x75, 0x68, 0x6f, 0x72, 0x6e, 0x07, 0x75, 0x6e, 0x69, 0x30, \n\t0x31, 0x46, 0x30, 0x0a, 0x41, 0x72, 0x69, 0x6e, 0x67, 0x61, 0x63, 0x75, \n\t0x74, 0x65, 0x0a, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x61, 0x63, 0x75, 0x74, \n\t0x65, 0x07, 0x41, 0x45, 0x61, 0x63, 0x75, 0x74, 0x65, 0x07, 0x61, 0x65, \n\t0x61, 0x63, 0x75, 0x74, 0x65, 0x0b, 0x4f, 0x73, 0x6c, 0x61, 0x73, 0x68, \n\t0x61, 0x63, 0x75, 0x74, 0x65, 0x0b, 0x6f, 0x73, 0x6c, 0x61, 0x73, 0x68, \n\t0x61, 0x63, 0x75, 0x74, 0x65, 0x0c, 0x53, 0x63, 0x6f, 0x6d, 0x6d, 0x61, \n\t0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x73, 0x63, 0x6f, 0x6d, 0x6d, \n\t0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x07, 0x75, 0x6e, 0x69, 0x30, \n\t0x32, 0x33, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, 0x43, 0x07, \n\t0x75, 0x6e, 0x69, 0x30, 0x32, 0x46, 0x33, 0x09, 0x67, 0x72, 0x61, 0x76, \n\t0x65, 0x63, 0x6f, 0x6d, 0x62, 0x09, 0x61, 0x63, 0x75, 0x74, 0x65, 0x63, \n\t0x6f, 0x6d, 0x62, 0x09, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x63, 0x6f, 0x6d, \n\t0x62, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, \n\t0x30, 0x46, 0x08, 0x64, 0x6f, 0x74, 0x62, 0x65, 0x6c, 0x6f, 0x77, 0x05, \n\t0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0d, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, \n\t0x69, 0x73, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0a, 0x41, 0x6c, 0x70, 0x68, \n\t0x61, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x09, 0x61, 0x6e, 0x6f, 0x74, 0x65, \n\t0x6c, 0x65, 0x69, 0x61, 0x0c, 0x45, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, \n\t0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x08, 0x45, 0x74, 0x61, 0x74, 0x6f, 0x6e, \n\t0x6f, 0x73, 0x09, 0x49, 0x6f, 0x74, 0x61, 0x74, 0x6f, 0x6e, 0x6f, 0x73, \n\t0x0c, 0x4f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x6e, 0x74, 0x6f, 0x6e, 0x6f, \n\t0x73, 0x0c, 0x55, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x74, 0x6f, 0x6e, \n\t0x6f, 0x73, 0x0a, 0x4f, 0x6d, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x6e, 0x6f, \n\t0x73, 0x11, 0x69, 0x6f, 0x74, 0x61, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, \n\t0x69, 0x73, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x05, 0x41, 0x6c, 0x70, 0x68, \n\t0x61, 0x04, 0x42, 0x65, 0x74, 0x61, 0x05, 0x47, 0x61, 0x6d, 0x6d, 0x61, \n\t0x05, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x07, 0x45, 0x70, 0x73, 0x69, 0x6c, \n\t0x6f, 0x6e, 0x04, 0x5a, 0x65, 0x74, 0x61, 0x03, 0x45, 0x74, 0x61, 0x05, \n\t0x54, 0x68, 0x65, 0x74, 0x61, 0x04, 0x49, 0x6f, 0x74, 0x61, 0x05, 0x4b, \n\t0x61, 0x70, 0x70, 0x61, 0x06, 0x4c, 0x61, 0x6d, 0x62, 0x64, 0x61, 0x02, \n\t0x4d, 0x75, 0x02, 0x4e, 0x75, 0x02, 0x58, 0x69, 0x07, 0x4f, 0x6d, 0x69, \n\t0x63, 0x72, 0x6f, 0x6e, 0x02, 0x50, 0x69, 0x03, 0x52, 0x68, 0x6f, 0x05, \n\t0x53, 0x69, 0x67, 0x6d, 0x61, 0x03, 0x54, 0x61, 0x75, 0x07, 0x55, 0x70, \n\t0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x03, 0x50, 0x68, 0x69, 0x03, 0x43, 0x68, \n\t0x69, 0x03, 0x50, 0x73, 0x69, 0x0c, 0x49, 0x6f, 0x74, 0x61, 0x64, 0x69, \n\t0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x0f, 0x55, 0x70, 0x73, 0x69, 0x6c, \n\t0x6f, 0x6e, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x0a, 0x61, \n\t0x6c, 0x70, 0x68, 0x61, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0c, 0x65, 0x70, \n\t0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x08, 0x65, \n\t0x74, 0x61, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x09, 0x69, 0x6f, 0x74, 0x61, \n\t0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x14, 0x75, 0x70, 0x73, 0x69, 0x6c, 0x6f, \n\t0x6e, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x74, 0x6f, 0x6e, \n\t0x6f, 0x73, 0x05, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x04, 0x62, 0x65, 0x74, \n\t0x61, 0x05, 0x67, 0x61, 0x6d, 0x6d, 0x61, 0x05, 0x64, 0x65, 0x6c, 0x74, \n\t0x61, 0x07, 0x65, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x04, 0x7a, 0x65, \n\t0x74, 0x61, 0x03, 0x65, 0x74, 0x61, 0x05, 0x74, 0x68, 0x65, 0x74, 0x61, \n\t0x04, 0x69, 0x6f, 0x74, 0x61, 0x05, 0x6b, 0x61, 0x70, 0x70, 0x61, 0x06, \n\t0x6c, 0x61, 0x6d, 0x62, 0x64, 0x61, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, \n\t0x42, 0x43, 0x02, 0x6e, 0x75, 0x02, 0x78, 0x69, 0x07, 0x6f, 0x6d, 0x69, \n\t0x63, 0x72, 0x6f, 0x6e, 0x03, 0x72, 0x68, 0x6f, 0x06, 0x73, 0x69, 0x67, \n\t0x6d, 0x61, 0x31, 0x05, 0x73, 0x69, 0x67, 0x6d, 0x61, 0x03, 0x74, 0x61, \n\t0x75, 0x07, 0x75, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x03, 0x70, 0x68, \n\t0x69, 0x03, 0x63, 0x68, 0x69, 0x03, 0x70, 0x73, 0x69, 0x05, 0x6f, 0x6d, \n\t0x65, 0x67, 0x61, 0x0c, 0x69, 0x6f, 0x74, 0x61, 0x64, 0x69, 0x65, 0x72, \n\t0x65, 0x73, 0x69, 0x73, 0x0f, 0x75, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, \n\t0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x0c, 0x6f, 0x6d, 0x69, \n\t0x63, 0x72, 0x6f, 0x6e, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0c, 0x75, 0x70, \n\t0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0a, 0x6f, \n\t0x6d, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x33, 0x44, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x44, \n\t0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x44, 0x36, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, \n\t0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x32, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, \n\t0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x35, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, \n\t0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x38, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, \n\t0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x42, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, \n\t0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x45, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, \n\t0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x31, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, \n\t0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x34, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, \n\t0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x37, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x31, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, \n\t0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x41, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x31, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, \n\t0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x44, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x31, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, \n\t0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x30, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x32, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, \n\t0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x33, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x32, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, \n\t0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x36, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x32, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, \n\t0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x39, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x32, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, \n\t0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x43, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x32, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, \n\t0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x46, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x33, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, \n\t0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x32, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x33, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, \n\t0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x35, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x33, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, \n\t0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x38, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x33, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, \n\t0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x42, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x33, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, \n\t0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x45, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x33, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, \n\t0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x31, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x34, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, \n\t0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x34, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x34, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, \n\t0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x37, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x34, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, \n\t0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x41, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x34, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, \n\t0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x44, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x34, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, \n\t0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x30, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x35, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, \n\t0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x33, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x35, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, \n\t0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x36, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x35, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, \n\t0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x39, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x35, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, \n\t0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x43, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x35, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, \n\t0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x46, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x36, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, \n\t0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x32, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x36, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, \n\t0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x35, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x36, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, \n\t0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x38, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x36, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, \n\t0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x42, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x36, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, \n\t0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x45, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x36, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, \n\t0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x31, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x37, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, \n\t0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x34, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x37, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, \n\t0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x37, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x37, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, \n\t0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x41, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x37, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, \n\t0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x44, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x37, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, \n\t0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x30, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x38, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, \n\t0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x33, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x38, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, \n\t0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x36, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x38, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, \n\t0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x41, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x38, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, \n\t0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x44, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x38, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, \n\t0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x30, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x39, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, \n\t0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x33, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x39, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, \n\t0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x36, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x39, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, \n\t0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x39, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x39, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, \n\t0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x43, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x39, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, \n\t0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x46, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x41, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, \n\t0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x32, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x41, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, \n\t0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x35, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x41, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, \n\t0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x38, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x41, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, \n\t0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x42, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x41, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, \n\t0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x45, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x41, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, \n\t0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x31, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x42, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, \n\t0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x34, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x42, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, \n\t0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x37, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x42, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, \n\t0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x41, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x42, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, \n\t0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x44, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x42, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, \n\t0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x30, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x43, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, \n\t0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x33, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x43, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, \n\t0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x36, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x43, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, \n\t0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x39, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x43, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, \n\t0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x43, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x43, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, \n\t0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x46, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x44, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, \n\t0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x32, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x44, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, \n\t0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x35, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x44, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, \n\t0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x38, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x44, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, \n\t0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x42, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x44, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, \n\t0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x45, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x44, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, \n\t0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x31, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x45, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, \n\t0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x34, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x45, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, \n\t0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x37, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x45, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, \n\t0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x41, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x45, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, \n\t0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x44, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x45, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, \n\t0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x30, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x46, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, \n\t0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x33, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x46, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, \n\t0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x36, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x46, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, \n\t0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x39, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x46, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, \n\t0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x43, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x34, 0x46, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, \n\t0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x46, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x35, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, \n\t0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x32, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x35, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, \n\t0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x35, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x35, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, \n\t0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x38, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x35, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, \n\t0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x42, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x35, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, \n\t0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x45, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x35, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, \n\t0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, 0x31, 0x07, 0x75, 0x6e, \n\t0x69, 0x30, 0x35, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, \n\t0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x30, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, \n\t0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x46, 0x06, 0x57, 0x67, \n\t0x72, 0x61, 0x76, 0x65, 0x06, 0x77, 0x67, 0x72, 0x61, 0x76, 0x65, 0x06, \n\t0x57, 0x61, 0x63, 0x75, 0x74, 0x65, 0x06, 0x77, 0x61, 0x63, 0x75, 0x74, \n\t0x65, 0x09, 0x57, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x09, \n\t0x77, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x41, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, \n\t0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x32, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x41, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, \n\t0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x35, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x41, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, \n\t0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x38, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x41, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, \n\t0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x42, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x41, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, \n\t0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x45, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x41, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, \n\t0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x31, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x42, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, \n\t0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x34, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x42, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, \n\t0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x37, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x42, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, \n\t0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x41, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x42, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, \n\t0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x44, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x42, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, \n\t0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x30, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x43, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, \n\t0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x33, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x43, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, \n\t0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x36, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x43, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, \n\t0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x39, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x43, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, \n\t0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x43, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x43, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, \n\t0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x46, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x44, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, \n\t0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x32, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x44, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, \n\t0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x35, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x44, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, \n\t0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x38, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x44, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, \n\t0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x42, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x44, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, \n\t0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x45, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x44, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, \n\t0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x31, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x45, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, \n\t0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x34, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x45, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, \n\t0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x37, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x45, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, \n\t0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x41, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x45, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, \n\t0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x44, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x45, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, \n\t0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x46, 0x30, 0x07, 0x75, 0x6e, \n\t0x69, 0x31, 0x45, 0x46, 0x31, 0x06, 0x59, 0x67, 0x72, 0x61, 0x76, 0x65, \n\t0x06, 0x79, 0x67, 0x72, 0x61, 0x76, 0x65, 0x07, 0x75, 0x6e, 0x69, 0x31, \n\t0x45, 0x46, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x46, 0x35, 0x07, \n\t0x75, 0x6e, 0x69, 0x31, 0x45, 0x46, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, \n\t0x45, 0x46, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x46, 0x38, 0x07, \n\t0x75, 0x6e, 0x69, 0x31, 0x45, 0x46, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, \n\t0x46, 0x34, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x30, 0x07, \n\t0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, \n\t0x30, 0x30, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x33, 0x07, \n\t0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, \n\t0x30, 0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x36, 0x07, \n\t0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, \n\t0x30, 0x30, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x39, 0x07, \n\t0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, \n\t0x30, 0x30, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x31, 0x35, 0x0d, \n\t0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x64, 0x62, \n\t0x6c, 0x0d, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x72, 0x65, 0x76, 0x65, 0x72, \n\t0x73, 0x65, 0x64, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x32, 0x35, 0x06, \n\t0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x06, 0x73, 0x65, 0x63, 0x6f, 0x6e, \n\t0x64, 0x09, 0x65, 0x78, 0x63, 0x6c, 0x61, 0x6d, 0x64, 0x62, 0x6c, 0x07, \n\t0x75, 0x6e, 0x69, 0x32, 0x30, 0x37, 0x34, 0x09, 0x6e, 0x73, 0x75, 0x70, \n\t0x65, 0x72, 0x69, 0x6f, 0x72, 0x04, 0x6c, 0x69, 0x72, 0x61, 0x06, 0x70, \n\t0x65, 0x73, 0x65, 0x74, 0x61, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x41, \n\t0x42, 0x04, 0x45, 0x75, 0x72, 0x6f, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, \n\t0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x31, 0x33, 0x07, 0x75, \n\t0x6e, 0x69, 0x32, 0x31, 0x31, 0x36, 0x09, 0x65, 0x73, 0x74, 0x69, 0x6d, \n\t0x61, 0x74, 0x65, 0x64, 0x09, 0x6f, 0x6e, 0x65, 0x65, 0x69, 0x67, 0x68, \n\t0x74, 0x68, 0x0c, 0x74, 0x68, 0x72, 0x65, 0x65, 0x65, 0x69, 0x67, 0x68, \n\t0x74, 0x68, 0x73, 0x0b, 0x66, 0x69, 0x76, 0x65, 0x65, 0x69, 0x67, 0x68, \n\t0x74, 0x68, 0x73, 0x0c, 0x73, 0x65, 0x76, 0x65, 0x6e, 0x65, 0x69, 0x67, \n\t0x68, 0x74, 0x68, 0x73, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, \n\t0x63, 0x65, 0x6e, 0x74, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x42, 0x30, 0x32, \n\t0x07, 0x75, 0x6e, 0x69, 0x46, 0x42, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, \n\t0x46, 0x42, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x45, 0x46, 0x46, \n\t0x07, 0x75, 0x6e, 0x69, 0x46, 0x46, 0x46, 0x43, 0x07, 0x75, 0x6e, 0x69, \n\t0x46, 0x46, 0x46, 0x44, 0x0c, 0x49, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, \n\t0x2e, 0x73, 0x6d, 0x63, 0x70, 0x09, 0x64, 0x61, 0x73, 0x69, 0x61, 0x6f, \n\t0x78, 0x69, 0x61, 0x09, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2e, 0x73, 0x75, \n\t0x70, 0x08, 0x6e, 0x69, 0x6e, 0x65, 0x2e, 0x73, 0x75, 0x70, 0x08, 0x73, \n\t0x69, 0x78, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x09, 0x66, 0x6f, 0x75, 0x72, \n\t0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0a, 0x74, 0x68, 0x72, 0x65, 0x65, 0x2e, \n\t0x73, 0x6d, 0x63, 0x70, 0x08, 0x74, 0x77, 0x6f, 0x2e, 0x73, 0x6d, 0x63, \n\t0x70, 0x08, 0x6f, 0x6e, 0x65, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x09, 0x7a, \n\t0x65, 0x72, 0x6f, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x06, 0x5a, 0x2e, 0x73, \n\t0x6d, 0x63, 0x70, 0x06, 0x59, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x06, 0x58, \n\t0x2e, 0x73, 0x6d, 0x63, 0x70, 0x06, 0x57, 0x2e, 0x73, 0x6d, 0x63, 0x70, \n\t0x06, 0x56, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x06, 0x55, 0x2e, 0x73, 0x6d, \n\t0x63, 0x70, 0x06, 0x54, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x06, 0x53, 0x2e, \n\t0x73, 0x6d, 0x63, 0x70, 0x06, 0x52, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x06, \n\t0x51, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x09, 0x7a, 0x65, 0x72, 0x6f, 0x2e, \n\t0x6c, 0x6e, 0x75, 0x6d, 0x06, 0x4f, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x06, \n\t0x4e, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x08, 0x63, 0x72, 0x6f, 0x73, 0x73, \n\t0x62, 0x61, 0x72, 0x06, 0x4d, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x06, 0x4c, \n\t0x2e, 0x73, 0x6d, 0x63, 0x70, 0x06, 0x4b, 0x2e, 0x73, 0x6d, 0x63, 0x70, \n\t0x06, 0x4a, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x06, 0x49, 0x2e, 0x73, 0x6d, \n\t0x63, 0x70, 0x06, 0x48, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x06, 0x47, 0x2e, \n\t0x73, 0x6d, 0x63, 0x70, 0x06, 0x46, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x06, \n\t0x45, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x06, 0x44, 0x2e, 0x73, 0x6d, 0x63, \n\t0x70, 0x06, 0x43, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x06, 0x42, 0x2e, 0x73, \n\t0x6d, 0x63, 0x70, 0x11, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, \n\t0x65, 0x6e, 0x74, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x0e, 0x62, 0x72, \n\t0x65, 0x76, 0x65, 0x67, 0x72, 0x61, 0x76, 0x65, 0x63, 0x6f, 0x6d, 0x62, \n\t0x06, 0x41, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x13, 0x63, 0x69, 0x72, 0x63, \n\t0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x61, 0x63, 0x75, 0x74, 0x65, 0x63, \n\t0x6f, 0x6d, 0x62, 0x13, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, \n\t0x65, 0x78, 0x67, 0x72, 0x61, 0x76, 0x65, 0x63, 0x6f, 0x6d, 0x62, 0x12, \n\t0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x68, 0x6f, \n\t0x6f, 0x6b, 0x63, 0x6f, 0x6d, 0x62, 0x13, 0x63, 0x69, 0x72, 0x63, 0x75, \n\t0x6d, 0x66, 0x6c, 0x65, 0x78, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x63, 0x6f, \n\t0x6d, 0x62, 0x0e, 0x62, 0x72, 0x65, 0x76, 0x65, 0x61, 0x63, 0x75, 0x74, \n\t0x65, 0x63, 0x6f, 0x6d, 0x62, 0x0d, 0x62, 0x72, 0x65, 0x76, 0x65, 0x68, \n\t0x6f, 0x6f, 0x6b, 0x63, 0x6f, 0x6d, 0x62, 0x0e, 0x62, 0x72, 0x65, 0x76, \n\t0x65, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x63, 0x6f, 0x6d, 0x62, 0x0b, 0x63, \n\t0x79, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x74, 0x69, 0x63, 0x10, 0x63, \n\t0x79, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x68, 0x6f, 0x6f, 0x6b, 0x6c, \n\t0x65, 0x66, 0x74, 0x0c, 0x63, 0x79, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x63, \n\t0x68, 0x6f, 0x6f, 0x6b, 0x0e, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x72, 0x69, \n\t0x67, 0x68, 0x74, 0x68, 0x6f, 0x6f, 0x6b, 0x08, 0x6f, 0x6e, 0x65, 0x2e, \n\t0x6c, 0x6e, 0x75, 0x6d, 0x08, 0x74, 0x77, 0x6f, 0x2e, 0x6c, 0x6e, 0x75, \n\t0x6d, 0x0a, 0x74, 0x68, 0x72, 0x65, 0x65, 0x2e, 0x6c, 0x6e, 0x75, 0x6d, \n\t0x09, 0x66, 0x6f, 0x75, 0x72, 0x2e, 0x6c, 0x6e, 0x75, 0x6d, 0x09, 0x66, \n\t0x69, 0x76, 0x65, 0x2e, 0x6c, 0x6e, 0x75, 0x6d, 0x08, 0x73, 0x69, 0x78, \n\t0x2e, 0x6c, 0x6e, 0x75, 0x6d, 0x0a, 0x73, 0x65, 0x76, 0x65, 0x6e, 0x2e, \n\t0x6c, 0x6e, 0x75, 0x6d, 0x0a, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2e, 0x6c, \n\t0x6e, 0x75, 0x6d, 0x09, 0x6e, 0x69, 0x6e, 0x65, 0x2e, 0x6c, 0x6e, 0x75, \n\t0x6d, 0x06, 0x50, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x09, 0x66, 0x69, 0x76, \n\t0x65, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x07, 0x73, 0x69, 0x78, 0x2e, 0x73, \n\t0x75, 0x70, 0x08, 0x66, 0x69, 0x76, 0x65, 0x2e, 0x73, 0x75, 0x70, 0x08, \n\t0x66, 0x6f, 0x75, 0x72, 0x2e, 0x73, 0x75, 0x70, 0x09, 0x74, 0x68, 0x72, \n\t0x65, 0x65, 0x2e, 0x73, 0x75, 0x70, 0x07, 0x74, 0x77, 0x6f, 0x2e, 0x73, \n\t0x75, 0x70, 0x09, 0x72, 0x69, 0x6e, 0x67, 0x61, 0x63, 0x75, 0x74, 0x65, \n\t0x07, 0x6f, 0x6e, 0x65, 0x2e, 0x73, 0x75, 0x70, 0x08, 0x7a, 0x65, 0x72, \n\t0x6f, 0x2e, 0x73, 0x75, 0x70, 0x09, 0x6e, 0x69, 0x6e, 0x65, 0x2e, 0x73, \n\t0x6d, 0x63, 0x70, 0x0a, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2e, 0x73, 0x6d, \n\t0x63, 0x70, 0x0a, 0x73, 0x65, 0x76, 0x65, 0x6e, 0x2e, 0x73, 0x6d, 0x63, \n\t0x70, 0x09, 0x73, 0x65, 0x76, 0x65, 0x6e, 0x2e, 0x73, 0x75, 0x70, 0x0d, \n\t0x63, 0x79, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x62, 0x72, 0x65, 0x76, \n\t0x65, 0x0b, 0x44, 0x63, 0x72, 0x6f, 0x61, 0x74, 0x2e, 0x73, 0x6d, 0x63, \n\t0x70, 0x08, 0x45, 0x74, 0x68, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x09, 0x54, \n\t0x62, 0x61, 0x72, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, 0x41, 0x67, 0x72, \n\t0x61, 0x76, 0x65, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, 0x41, 0x61, 0x63, \n\t0x75, 0x74, 0x65, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x10, 0x41, 0x63, 0x69, \n\t0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x2e, 0x73, 0x6d, 0x63, \n\t0x70, 0x0b, 0x41, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x2e, 0x73, 0x6d, 0x63, \n\t0x70, 0x0e, 0x41, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x2e, \n\t0x73, 0x6d, 0x63, 0x70, 0x0a, 0x41, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x73, \n\t0x6d, 0x63, 0x70, 0x0f, 0x41, 0x72, 0x69, 0x6e, 0x67, 0x61, 0x63, 0x75, \n\t0x74, 0x65, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0d, 0x43, 0x63, 0x65, 0x64, \n\t0x69, 0x6c, 0x6c, 0x61, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, 0x45, 0x67, \n\t0x72, 0x61, 0x76, 0x65, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, 0x45, 0x61, \n\t0x63, 0x75, 0x74, 0x65, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x10, 0x45, 0x63, \n\t0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x2e, 0x73, 0x6d, \n\t0x63, 0x70, 0x0e, 0x45, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, \n\t0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, 0x49, 0x67, 0x72, 0x61, 0x76, 0x65, \n\t0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, 0x49, 0x61, 0x63, 0x75, 0x74, 0x65, \n\t0x2e, 0x73, 0x6d, 0x63, 0x70, 0x10, 0x49, 0x63, 0x69, 0x72, 0x63, 0x75, \n\t0x6d, 0x66, 0x6c, 0x65, 0x78, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0e, 0x49, \n\t0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x2e, 0x73, 0x6d, 0x63, \n\t0x70, 0x0b, 0x4e, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x2e, 0x73, 0x6d, 0x63, \n\t0x70, 0x0b, 0x4f, 0x67, 0x72, 0x61, 0x76, 0x65, 0x2e, 0x73, 0x6d, 0x63, \n\t0x70, 0x0b, 0x4f, 0x61, 0x63, 0x75, 0x74, 0x65, 0x2e, 0x73, 0x6d, 0x63, \n\t0x70, 0x10, 0x4f, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, \n\t0x78, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, 0x4f, 0x74, 0x69, 0x6c, 0x64, \n\t0x65, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0e, 0x4f, 0x64, 0x69, 0x65, 0x72, \n\t0x65, 0x73, 0x69, 0x73, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, 0x55, 0x67, \n\t0x72, 0x61, 0x76, 0x65, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, 0x55, 0x61, \n\t0x63, 0x75, 0x74, 0x65, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x10, 0x55, 0x63, \n\t0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x2e, 0x73, 0x6d, \n\t0x63, 0x70, 0x0e, 0x55, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, \n\t0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, 0x59, 0x61, 0x63, 0x75, 0x74, 0x65, \n\t0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0c, 0x41, 0x6d, 0x61, 0x63, 0x72, 0x6f, \n\t0x6e, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, 0x41, 0x62, 0x72, 0x65, 0x76, \n\t0x65, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0c, 0x41, 0x6f, 0x67, 0x6f, 0x6e, \n\t0x65, 0x6b, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, 0x43, 0x61, 0x63, 0x75, \n\t0x74, 0x65, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x10, 0x43, 0x63, 0x69, 0x72, \n\t0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x2e, 0x73, 0x6d, 0x63, 0x70, \n\t0x0c, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x30, 0x41, 0x2e, 0x73, 0x6d, 0x63, \n\t0x70, 0x0b, 0x43, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x2e, 0x73, 0x6d, 0x63, \n\t0x70, 0x0b, 0x44, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x2e, 0x73, 0x6d, 0x63, \n\t0x70, 0x0c, 0x45, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x2e, 0x73, 0x6d, \n\t0x63, 0x70, 0x0b, 0x45, 0x62, 0x72, 0x65, 0x76, 0x65, 0x2e, 0x73, 0x6d, \n\t0x63, 0x70, 0x0f, 0x45, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, \n\t0x74, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0c, 0x45, 0x6f, 0x67, 0x6f, 0x6e, \n\t0x65, 0x6b, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, 0x45, 0x63, 0x61, 0x72, \n\t0x6f, 0x6e, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x10, 0x47, 0x63, 0x69, 0x72, \n\t0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x2e, 0x73, 0x6d, 0x63, 0x70, \n\t0x0b, 0x47, 0x62, 0x72, 0x65, 0x76, 0x65, 0x2e, 0x73, 0x6d, 0x63, 0x70, \n\t0x0c, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x32, 0x30, 0x2e, 0x73, 0x6d, 0x63, \n\t0x70, 0x11, 0x47, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, \n\t0x6e, 0x74, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x10, 0x48, 0x63, 0x69, 0x72, \n\t0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x2e, 0x73, 0x6d, 0x63, 0x70, \n\t0x0b, 0x49, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x2e, 0x73, 0x6d, 0x63, 0x70, \n\t0x12, 0x55, 0x68, 0x75, 0x6e, 0x67, 0x61, 0x72, 0x75, 0x6d, 0x6c, 0x61, \n\t0x75, 0x74, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, 0x49, 0x62, 0x72, 0x65, \n\t0x76, 0x65, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0c, 0x49, 0x6f, 0x67, 0x6f, \n\t0x6e, 0x65, 0x6b, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0f, 0x49, 0x64, 0x6f, \n\t0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x6d, 0x63, 0x70, \n\t0x10, 0x4a, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, \n\t0x2e, 0x73, 0x6d, 0x63, 0x70, 0x11, 0x4b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, \n\t0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, \n\t0x4c, 0x61, 0x63, 0x75, 0x74, 0x65, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x11, \n\t0x4c, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, \n\t0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, 0x4c, 0x63, 0x61, 0x72, 0x6f, 0x6e, \n\t0x2e, 0x73, 0x6d, 0x63, 0x70, 0x09, 0x4c, 0x64, 0x6f, 0x74, 0x2e, 0x73, \n\t0x6d, 0x63, 0x70, 0x0b, 0x4e, 0x61, 0x63, 0x75, 0x74, 0x65, 0x2e, 0x73, \n\t0x6d, 0x63, 0x70, 0x11, 0x4e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, \n\t0x63, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, 0x4e, 0x63, \n\t0x61, 0x72, 0x6f, 0x6e, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0c, 0x4f, 0x6d, \n\t0x61, 0x63, 0x72, 0x6f, 0x6e, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, 0x4f, \n\t0x62, 0x72, 0x65, 0x76, 0x65, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x12, 0x4f, \n\t0x68, 0x75, 0x6e, 0x67, 0x61, 0x72, 0x75, 0x6d, 0x6c, 0x61, 0x75, 0x74, \n\t0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, 0x52, 0x61, 0x63, 0x75, 0x74, 0x65, \n\t0x2e, 0x73, 0x6d, 0x63, 0x70, 0x11, 0x52, 0x63, 0x6f, 0x6d, 0x6d, 0x61, \n\t0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, \n\t0x52, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, \n\t0x53, 0x61, 0x63, 0x75, 0x74, 0x65, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x10, \n\t0x53, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x2e, \n\t0x73, 0x6d, 0x63, 0x70, 0x0d, 0x53, 0x63, 0x65, 0x64, 0x69, 0x6c, 0x6c, \n\t0x61, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, 0x53, 0x63, 0x61, 0x72, 0x6f, \n\t0x6e, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x11, 0x54, 0x63, 0x6f, 0x6d, 0x6d, \n\t0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x6d, 0x63, 0x70, \n\t0x0b, 0x54, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x2e, 0x73, 0x6d, 0x63, 0x70, \n\t0x0b, 0x55, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x2e, 0x73, 0x6d, 0x63, 0x70, \n\t0x0c, 0x55, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x2e, 0x73, 0x6d, 0x63, \n\t0x70, 0x0b, 0x55, 0x62, 0x72, 0x65, 0x76, 0x65, 0x2e, 0x73, 0x6d, 0x63, \n\t0x70, 0x0a, 0x55, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x73, 0x6d, 0x63, 0x70, \n\t0x0f, 0x67, 0x65, 0x72, 0x6d, 0x61, 0x6e, 0x64, 0x62, 0x6c, 0x73, 0x2e, \n\t0x73, 0x6d, 0x63, 0x70, 0x0b, 0x5a, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x2e, \n\t0x73, 0x6d, 0x63, 0x70, 0x0f, 0x5a, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, \n\t0x65, 0x6e, 0x74, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0b, 0x5a, 0x61, 0x63, \n\t0x75, 0x74, 0x65, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0e, 0x59, 0x64, 0x69, \n\t0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x10, \n\t0x59, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x2e, \n\t0x73, 0x6d, 0x63, 0x70, 0x10, 0x57, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, \n\t0x66, 0x6c, 0x65, 0x78, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x0c, 0x55, 0x6f, \n\t0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x2e, 0x73, 0x6d, 0x63, 0x70, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x02, 0x00, 0x08, 0x00, 0x02, 0xff, 0xff, 0x00, 0x0f, \n\t0x00, 0x01, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x30, 0x00, 0x44, 0x00, 0x02, \n\t0x44, 0x46, 0x4c, 0x54, 0x00, 0x0e, 0x6c, 0x61, 0x74, 0x6e, 0x00, 0x1a, \n\t0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, \n\t0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x01, \n\t0x00, 0x02, 0x6b, 0x65, 0x72, 0x6e, 0x00, 0x0e, 0x6b, 0x65, 0x72, 0x6e, \n\t0x00, 0x0e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, \n\t0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0a, 0x32, 0xa8, 0x00, 0x01, \n\t0x03, 0x2e, 0x00, 0x04, 0x00, 0x00, 0x01, 0x92, 0x31, 0xe6, 0x31, 0xe6, \n\t0x06, 0x56, 0x30, 0x3c, 0x1e, 0xf4, 0x2d, 0xa6, 0x31, 0xc4, 0x30, 0xc4, \n\t0x06, 0xac, 0x30, 0xe0, 0x30, 0xe0, 0x2d, 0x64, 0x0d, 0x78, 0x30, 0xe0, \n\t0x30, 0xe0, 0x31, 0xc4, 0x21, 0xfe, 0x09, 0xd6, 0x0a, 0x50, 0x2d, 0xb8, \n\t0x2d, 0x24, 0x30, 0x26, 0x2f, 0xca, 0x31, 0x24, 0x0d, 0xa4, 0x0a, 0xb6, \n\t0x30, 0xa6, 0x2e, 0x92, 0x30, 0xda, 0x0a, 0xf8, 0x0c, 0x22, 0x31, 0x02, \n\t0x2e, 0x92, 0x0d, 0x96, 0x31, 0xa6, 0x0d, 0x18, 0x30, 0x20, 0x31, 0xa6, \n\t0x0d, 0x36, 0x30, 0x3c, 0x30, 0x3c, 0x30, 0x3c, 0x30, 0x3c, 0x30, 0x3c, \n\t0x30, 0x3c, 0x2d, 0xa6, 0x30, 0xc4, 0x30, 0xc4, 0x30, 0xc4, 0x30, 0xc4, \n\t0x30, 0xe0, 0x30, 0xe0, 0x30, 0xe0, 0x30, 0xe0, 0x31, 0xc4, 0x30, 0xe0, \n\t0x31, 0xc4, 0x31, 0xc4, 0x31, 0xc4, 0x31, 0xc4, 0x31, 0xc4, 0x31, 0x24, \n\t0x30, 0xa6, 0x30, 0xa6, 0x30, 0xa6, 0x30, 0xa6, 0x30, 0xa6, 0x30, 0xa6, \n\t0x30, 0xda, 0x30, 0xda, 0x30, 0xda, 0x30, 0xda, 0x31, 0x02, 0x31, 0x02, \n\t0x31, 0x02, 0x31, 0x02, 0x31, 0x02, 0x31, 0xa6, 0x2e, 0x92, 0x31, 0xa6, \n\t0x30, 0x3c, 0x30, 0xa6, 0x30, 0x3c, 0x30, 0xa6, 0x30, 0x3c, 0x30, 0xa6, \n\t0x2d, 0xa6, 0x2d, 0xa6, 0x2d, 0xa6, 0x2d, 0xa6, 0x31, 0xc4, 0x31, 0xc4, \n\t0x30, 0xc4, 0x30, 0xda, 0x30, 0xc4, 0x30, 0xda, 0x30, 0xc4, 0x30, 0xda, \n\t0x30, 0xc4, 0x30, 0xda, 0x30, 0xc4, 0x30, 0xda, 0x30, 0xe0, 0x30, 0xe0, \n\t0x30, 0xe0, 0x30, 0xe0, 0x30, 0xe0, 0x30, 0xe0, 0x2d, 0x64, 0x0d, 0x78, \n\t0x0d, 0x78, 0x0d, 0x78, 0x0d, 0x78, 0x30, 0xe0, 0x30, 0xe0, 0x30, 0xe0, \n\t0x31, 0xc4, 0x31, 0x02, 0x31, 0xc4, 0x31, 0x02, 0x31, 0xc4, 0x31, 0x02, \n\t0x0d, 0x96, 0x0d, 0x96, 0x0d, 0x96, 0x2d, 0xb8, 0x2d, 0xb8, 0x2d, 0xb8, \n\t0x30, 0x26, 0x31, 0x24, 0x31, 0xa6, 0x31, 0x24, 0x0d, 0xa4, 0x0d, 0xa4, \n\t0x0d, 0xa4, 0x30, 0x3c, 0x30, 0xa6, 0x31, 0xe6, 0x30, 0x3c, 0x30, 0xc4, \n\t0x30, 0xe0, 0x30, 0xe0, 0x31, 0xc4, 0x31, 0x24, 0x30, 0x3c, 0x1e, 0xf4, \n\t0x2e, 0xfa, 0x30, 0x3c, 0x30, 0xc4, 0x0d, 0xa4, 0x30, 0xe0, 0x31, 0xc4, \n\t0x30, 0xe0, 0x2d, 0x64, 0x30, 0x3c, 0x30, 0xe0, 0x30, 0xe0, 0x0d, 0xb6, \n\t0x31, 0xc4, 0x21, 0xfe, 0x0e, 0xa0, 0x2d, 0xb8, 0x31, 0x24, 0x0f, 0x8e, \n\t0x2f, 0xca, 0x10, 0x6c, 0x30, 0xe0, 0x31, 0x24, 0x11, 0x0e, 0x31, 0xa6, \n\t0x11, 0x14, 0x11, 0x1e, 0x13, 0xe0, 0x15, 0xba, 0x31, 0xa6, 0x16, 0xa4, \n\t0x31, 0x02, 0x2e, 0x92, 0x17, 0x9e, 0x17, 0xa4, 0x19, 0x8e, 0x19, 0xc4, \n\t0x1b, 0x56, 0x1b, 0x88, 0x31, 0x02, 0x30, 0xc4, 0x30, 0xc4, 0x1c, 0x06, \n\t0x2e, 0xfa, 0x30, 0xe0, 0x30, 0xe0, 0x2c, 0xdc, 0x2c, 0xdc, 0x1d, 0x74, \n\t0x2d, 0x64, 0x2e, 0xac, 0x30, 0xe0, 0x30, 0x3c, 0x1e, 0x06, 0x1e, 0xf4, \n\t0x2e, 0xfa, 0x1e, 0xfe, 0x30, 0xc4, 0x2f, 0xca, 0x21, 0x38, 0x30, 0xe0, \n\t0x2d, 0x64, 0x30, 0xe0, 0x30, 0xe0, 0x30, 0xe0, 0x31, 0xc4, 0x21, 0xfe, \n\t0x2d, 0xa6, 0x2d, 0xb8, 0x2e, 0xac, 0x2f, 0xca, 0x30, 0xe0, 0x30, 0xe0, \n\t0x22, 0x20, 0x2c, 0xdc, 0x2c, 0xdc, 0x23, 0xb2, 0x24, 0x70, 0x24, 0xfa, \n\t0x30, 0xa6, 0x25, 0x54, 0x26, 0x2e, 0x2f, 0xc0, 0x26, 0xb4, 0x30, 0xda, \n\t0x30, 0x20, 0x26, 0xda, 0x27, 0x04, 0x31, 0x02, 0x2e, 0x92, 0x28, 0x5e, \n\t0x31, 0xa6, 0x2e, 0x92, 0x30, 0x20, 0x2a, 0xcc, 0x2b, 0x06, 0x2d, 0x02, \n\t0x2d, 0x02, 0x2e, 0x92, 0x2c, 0x30, 0x30, 0xda, 0x30, 0xda, 0x2f, 0xc0, \n\t0x2c, 0xb2, 0x2d, 0x02, 0x2d, 0x02, 0x31, 0xa6, 0x2c, 0xdc, 0x2d, 0x02, \n\t0x30, 0x3c, 0x31, 0x02, 0x2d, 0x24, 0x31, 0xa6, 0x2d, 0x24, 0x31, 0xa6, \n\t0x2d, 0x3a, 0x2e, 0x92, 0x2e, 0xfa, 0x2f, 0xc0, 0x2e, 0xfa, 0x2f, 0xca, \n\t0x30, 0x20, 0x2d, 0x64, 0x2d, 0x64, 0x2d, 0x64, 0x2d, 0x64, 0x30, 0xe0, \n\t0x2d, 0xa6, 0x2d, 0xb8, 0x31, 0x24, 0x31, 0xa6, 0x31, 0x24, 0x2f, 0xca, \n\t0x30, 0x20, 0x30, 0xe0, 0x2f, 0xca, 0x30, 0x20, 0x30, 0xe0, 0x30, 0xe0, \n\t0x30, 0xe0, 0x30, 0x3c, 0x30, 0xa6, 0x30, 0x3c, 0x30, 0xa6, 0x30, 0xc4, \n\t0x30, 0xda, 0x30, 0xda, 0x30, 0xda, 0x2f, 0xca, 0x30, 0x20, 0x31, 0xc4, \n\t0x31, 0x02, 0x31, 0x02, 0x2e, 0x92, 0x2e, 0xac, 0x31, 0xa6, 0x2e, 0xac, \n\t0x31, 0xa6, 0x2e, 0xac, 0x31, 0xa6, 0x2e, 0xfa, 0x2f, 0xc0, 0x2f, 0xc0, \n\t0x2f, 0xca, 0x30, 0x20, 0x30, 0x3c, 0x30, 0xa6, 0x30, 0xe0, 0x30, 0x26, \n\t0x30, 0x26, 0x30, 0x26, 0x30, 0x3c, 0x30, 0xa6, 0x30, 0x3c, 0x30, 0xa6, \n\t0x30, 0x3c, 0x30, 0xa6, 0x30, 0x3c, 0x30, 0xa6, 0x30, 0x3c, 0x30, 0xa6, \n\t0x30, 0x3c, 0x30, 0xa6, 0x30, 0x3c, 0x30, 0xa6, 0x30, 0x3c, 0x30, 0xa6, \n\t0x30, 0x3c, 0x30, 0xa6, 0x30, 0x3c, 0x30, 0xa6, 0x30, 0x3c, 0x30, 0xa6, \n\t0x30, 0x3c, 0x30, 0xa6, 0x30, 0xc4, 0x30, 0xda, 0x30, 0xc4, 0x30, 0xda, \n\t0x30, 0xc4, 0x30, 0xda, 0x30, 0xc4, 0x30, 0xda, 0x30, 0xc4, 0x30, 0xda, \n\t0x30, 0xc4, 0x30, 0xda, 0x30, 0xc4, 0x30, 0xda, 0x30, 0xc4, 0x30, 0xda, \n\t0x30, 0xe0, 0x30, 0xe0, 0x31, 0xc4, 0x31, 0x02, 0x31, 0xc4, 0x31, 0x02, \n\t0x31, 0xc4, 0x31, 0x02, 0x31, 0xc4, 0x31, 0x02, 0x31, 0xc4, 0x31, 0x02, \n\t0x31, 0xc4, 0x31, 0x02, 0x31, 0xc4, 0x31, 0x02, 0x31, 0x02, 0x31, 0x24, \n\t0x31, 0xa6, 0x31, 0x24, 0x31, 0xa6, 0x31, 0x24, 0x31, 0xa6, 0x31, 0x24, \n\t0x31, 0xa6, 0x31, 0xc4, 0x31, 0xe6, 0x31, 0xe6, 0x31, 0xe6, 0x31, 0xe6, \n\t0x31, 0xe6, 0x31, 0xe6, 0x31, 0xe6, 0x32, 0x08, 0x31, 0xec, 0x32, 0x74, \n\t0x32, 0x02, 0x32, 0x08, 0x32, 0x0e, 0x32, 0x24, 0x32, 0x36, 0x32, 0x48, \n\t0x32, 0x5a, 0x32, 0x74, 0x32, 0x7a, 0x32, 0x84, 0x00, 0x01, 0x01, 0x92, \n\t0x00, 0x05, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, \n\t0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2e, \n\t0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, \n\t0x00, 0x35, 0x00, 0x37, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, \n\t0x00, 0x3d, 0x00, 0x3e, 0x00, 0x44, 0x00, 0x45, 0x00, 0x48, 0x00, 0x49, \n\t0x00, 0x4e, 0x00, 0x52, 0x00, 0x53, 0x00, 0x55, 0x00, 0x59, 0x00, 0x5a, \n\t0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5e, 0x00, 0x82, 0x00, 0x83, 0x00, 0x84, \n\t0x00, 0x85, 0x00, 0x86, 0x00, 0x87, 0x00, 0x89, 0x00, 0x8a, 0x00, 0x8b, \n\t0x00, 0x8c, 0x00, 0x8d, 0x00, 0x8e, 0x00, 0x8f, 0x00, 0x90, 0x00, 0x91, \n\t0x00, 0x92, 0x00, 0x93, 0x00, 0x94, 0x00, 0x95, 0x00, 0x96, 0x00, 0x97, \n\t0x00, 0x98, 0x00, 0x9f, 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, \n\t0x00, 0xa6, 0x00, 0xa7, 0x00, 0xaa, 0x00, 0xab, 0x00, 0xac, 0x00, 0xad, \n\t0x00, 0xb4, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0xb7, 0x00, 0xb8, 0x00, 0xbf, \n\t0x00, 0xc0, 0x00, 0xc1, 0x00, 0xc2, 0x00, 0xc3, 0x00, 0xc4, 0x00, 0xc5, \n\t0x00, 0xc6, 0x00, 0xc7, 0x00, 0xc8, 0x00, 0xca, 0x00, 0xcc, 0x00, 0xce, \n\t0x00, 0xd0, 0x00, 0xd2, 0x00, 0xd4, 0x00, 0xd5, 0x00, 0xd6, 0x00, 0xd7, \n\t0x00, 0xd8, 0x00, 0xd9, 0x00, 0xda, 0x00, 0xdb, 0x00, 0xdc, 0x00, 0xdd, \n\t0x00, 0xe6, 0x00, 0xea, 0x00, 0xec, 0x00, 0xee, 0x00, 0xf0, 0x00, 0xf2, \n\t0x00, 0xf8, 0x00, 0xfb, 0x00, 0xfd, 0x00, 0xff, 0x01, 0x01, 0x01, 0x05, \n\t0x01, 0x07, 0x01, 0x09, 0x01, 0x0e, 0x01, 0x0f, 0x01, 0x10, 0x01, 0x11, \n\t0x01, 0x12, 0x01, 0x13, 0x01, 0x17, 0x01, 0x19, 0x01, 0x1b, 0x01, 0x24, \n\t0x01, 0x26, 0x01, 0x28, 0x01, 0x36, 0x01, 0x38, 0x01, 0x39, 0x01, 0x3a, \n\t0x01, 0x3b, 0x01, 0x3d, 0x01, 0x3f, 0x01, 0x48, 0x01, 0x49, 0x01, 0x51, \n\t0x01, 0x63, 0x01, 0x65, 0x01, 0x66, 0x01, 0x67, 0x01, 0x68, 0x01, 0x69, \n\t0x01, 0x6c, 0x01, 0x6d, 0x01, 0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, 0x71, \n\t0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x76, 0x01, 0x77, \n\t0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, \n\t0x01, 0x7f, 0x01, 0x80, 0x01, 0x81, 0x01, 0x82, 0x01, 0x84, 0x01, 0x85, \n\t0x01, 0x8b, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x90, 0x01, 0x93, 0x01, 0x95, \n\t0x01, 0x97, 0x01, 0x98, 0x01, 0x99, 0x01, 0x9b, 0x01, 0x9d, 0x01, 0x9e, \n\t0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, 0xa3, 0x01, 0xa6, 0x01, 0xac, \n\t0x01, 0xad, 0x01, 0xae, 0x01, 0xaf, 0x01, 0xb2, 0x01, 0xb3, 0x01, 0xb5, \n\t0x01, 0xb6, 0x01, 0xb7, 0x01, 0xb8, 0x01, 0xba, 0x01, 0xbb, 0x01, 0xbc, \n\t0x01, 0xbd, 0x01, 0xbe, 0x01, 0xbf, 0x01, 0xc0, 0x01, 0xc1, 0x01, 0xc2, \n\t0x01, 0xc3, 0x01, 0xc4, 0x01, 0xc6, 0x01, 0xc7, 0x01, 0xc8, 0x01, 0xc9, \n\t0x01, 0xca, 0x01, 0xcc, 0x01, 0xcd, 0x01, 0xce, 0x01, 0xcf, 0x01, 0xd1, \n\t0x01, 0xd2, 0x01, 0xd4, 0x01, 0xd5, 0x01, 0xd6, 0x01, 0xd8, 0x01, 0xd9, \n\t0x01, 0xda, 0x01, 0xdb, 0x01, 0xdc, 0x01, 0xdd, 0x01, 0xde, 0x01, 0xdf, \n\t0x01, 0xe0, 0x01, 0xe1, 0x01, 0xe2, 0x01, 0xe3, 0x01, 0xe6, 0x01, 0xea, \n\t0x01, 0xec, 0x01, 0xee, 0x01, 0xef, 0x01, 0xf0, 0x01, 0xf1, 0x01, 0xf2, \n\t0x01, 0xf5, 0x01, 0xf6, 0x01, 0xf8, 0x01, 0xf9, 0x01, 0xfa, 0x01, 0xfc, \n\t0x01, 0xfd, 0x01, 0xff, 0x02, 0x00, 0x02, 0x05, 0x02, 0x06, 0x02, 0x0a, \n\t0x02, 0x0e, 0x02, 0x0f, 0x02, 0x12, 0x02, 0x1f, 0x02, 0x20, 0x02, 0x21, \n\t0x02, 0x22, 0x02, 0x23, 0x02, 0x2d, 0x02, 0x3a, 0x02, 0x3b, 0x02, 0x3c, \n\t0x02, 0x3d, 0x02, 0x41, 0x02, 0x42, 0x02, 0x45, 0x02, 0x47, 0x02, 0x49, \n\t0x02, 0x4b, 0x02, 0x4d, 0x02, 0x55, 0x02, 0x57, 0x02, 0x59, 0x02, 0x5a, \n\t0x02, 0x5b, 0x02, 0x5d, 0x02, 0x5e, 0x02, 0x6b, 0x02, 0x6c, 0x02, 0x6d, \n\t0x02, 0x74, 0x02, 0x78, 0x02, 0x7a, 0x02, 0x7b, 0x02, 0x7c, 0x02, 0x7d, \n\t0x02, 0x7e, 0x02, 0x81, 0x02, 0x82, 0x02, 0x84, 0x02, 0x86, 0x02, 0x87, \n\t0x02, 0x88, 0x02, 0x91, 0x02, 0x92, 0x02, 0x96, 0x02, 0x98, 0x02, 0x99, \n\t0x02, 0x9a, 0x02, 0x9b, 0x02, 0x9c, 0x02, 0x9d, 0x02, 0x9e, 0x02, 0xa1, \n\t0x02, 0xa2, 0x02, 0xa6, 0x02, 0xa7, 0x02, 0xa8, 0x02, 0xbf, 0x02, 0xc0, \n\t0x02, 0xc1, 0x02, 0xc3, 0x02, 0xc5, 0x02, 0xc7, 0x02, 0xc9, 0x02, 0xca, \n\t0x02, 0xcb, 0x02, 0xcc, 0x02, 0xcd, 0x02, 0xce, 0x02, 0xcf, 0x02, 0xd0, \n\t0x02, 0xd1, 0x02, 0xd2, 0x02, 0xd3, 0x02, 0xd4, 0x02, 0xd5, 0x02, 0xd6, \n\t0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd9, 0x02, 0xda, 0x02, 0xdb, 0x02, 0xdc, \n\t0x02, 0xdd, 0x02, 0xde, 0x02, 0xdf, 0x02, 0xe0, 0x02, 0xe1, 0x02, 0xe2, \n\t0x02, 0xe3, 0x02, 0xe4, 0x02, 0xe5, 0x02, 0xe6, 0x02, 0xe7, 0x02, 0xe8, \n\t0x02, 0xe9, 0x02, 0xea, 0x02, 0xeb, 0x02, 0xec, 0x02, 0xed, 0x02, 0xee, \n\t0x02, 0xef, 0x02, 0xf0, 0x02, 0xf1, 0x02, 0xf3, 0x02, 0xf5, 0x02, 0xf6, \n\t0x02, 0xf7, 0x02, 0xf8, 0x02, 0xf9, 0x02, 0xfa, 0x02, 0xfb, 0x02, 0xfc, \n\t0x02, 0xfd, 0x02, 0xfe, 0x02, 0xff, 0x03, 0x00, 0x03, 0x01, 0x03, 0x02, \n\t0x03, 0x0a, 0x03, 0x1b, 0x03, 0x1c, 0x03, 0x1d, 0x03, 0x1e, 0x03, 0x1f, \n\t0x03, 0x20, 0x03, 0x21, 0x03, 0x22, 0x03, 0x23, 0x03, 0x34, 0x03, 0x35, \n\t0x03, 0x37, 0x03, 0x38, 0x03, 0x39, 0x03, 0x41, 0x03, 0x42, 0x03, 0x75, \n\t0x03, 0x76, 0x03, 0x77, 0x03, 0x78, 0x03, 0x79, 0x03, 0x7b, 0x03, 0x7d, \n\t0x03, 0x7e, 0x03, 0x80, 0x03, 0x84, 0x03, 0x85, 0x03, 0x8c, 0x03, 0x91, \n\t0x00, 0x15, 0x00, 0x39, 0x00, 0x14, 0x00, 0x3a, 0x00, 0x25, 0x00, 0x3c, \n\t0x00, 0x16, 0x00, 0x9f, 0x00, 0x16, 0x01, 0x36, 0x00, 0x25, 0x01, 0x38, \n\t0x00, 0x16, 0x01, 0x3a, 0x00, 0x16, 0x01, 0x69, 0x00, 0x16, 0x01, 0x7f, \n\t0x00, 0x16, 0x01, 0x85, 0x00, 0x16, 0x02, 0x20, 0x00, 0x14, 0x02, 0x22, \n\t0x00, 0x14, 0x02, 0x59, 0x00, 0x16, 0x02, 0x5b, 0x00, 0x16, 0x02, 0xc3, \n\t0x00, 0x25, 0x02, 0xc5, 0x00, 0x25, 0x02, 0xc7, 0x00, 0x25, 0x03, 0x1b, \n\t0x00, 0x16, 0x03, 0x1d, 0x00, 0x16, 0x03, 0x1f, 0x00, 0x16, 0x03, 0x21, \n\t0x00, 0x16, 0x00, 0xca, 0x00, 0x0f, 0xfe, 0xef, 0x00, 0x11, 0xfe, 0xef, \n\t0x00, 0x1d, 0xfe, 0xef, 0x00, 0x24, 0xff, 0xc5, 0x00, 0x37, 0x00, 0x14, \n\t0x00, 0x44, 0xff, 0xde, 0x00, 0x46, 0xff, 0xeb, 0x00, 0x47, 0xff, 0xeb, \n\t0x00, 0x48, 0xff, 0xeb, 0x00, 0x4a, 0xff, 0xeb, 0x00, 0x52, 0xff, 0xeb, \n\t0x00, 0x54, 0xff, 0xeb, 0x00, 0x55, 0xff, 0xe6, 0x00, 0x58, 0xff, 0xea, \n\t0x00, 0x59, 0xff, 0xe8, 0x00, 0x5c, 0xff, 0xe8, 0x00, 0x82, 0xff, 0xc5, \n\t0x00, 0x83, 0xff, 0xc5, 0x00, 0x84, 0xff, 0xc5, 0x00, 0x85, 0xff, 0xc5, \n\t0x00, 0x86, 0xff, 0xc5, 0x00, 0x87, 0xff, 0xc5, 0x00, 0xa2, 0xff, 0xde, \n\t0x00, 0xa3, 0xff, 0xde, 0x00, 0xa4, 0xff, 0xde, 0x00, 0xa5, 0xff, 0xde, \n\t0x00, 0xa6, 0xff, 0xde, 0x00, 0xa7, 0xff, 0xde, 0x00, 0xa9, 0xff, 0xeb, \n\t0x00, 0xaa, 0xff, 0xeb, 0x00, 0xab, 0xff, 0xeb, 0x00, 0xac, 0xff, 0xeb, \n\t0x00, 0xad, 0xff, 0xeb, 0x00, 0xb4, 0xff, 0xeb, 0x00, 0xb5, 0xff, 0xeb, \n\t0x00, 0xb6, 0xff, 0xeb, 0x00, 0xb7, 0xff, 0xeb, 0x00, 0xb8, 0xff, 0xeb, \n\t0x00, 0xbb, 0xff, 0xea, 0x00, 0xbc, 0xff, 0xea, 0x00, 0xbd, 0xff, 0xea, \n\t0x00, 0xbe, 0xff, 0xea, 0x00, 0xbf, 0xff, 0xe8, 0x00, 0xc1, 0xff, 0xe8, \n\t0x00, 0xc2, 0xff, 0xc5, 0x00, 0xc3, 0xff, 0xde, 0x00, 0xc4, 0xff, 0xc5, \n\t0x00, 0xc5, 0xff, 0xde, 0x00, 0xc6, 0xff, 0xc5, 0x00, 0xc7, 0xff, 0xde, \n\t0x00, 0xc9, 0xff, 0xeb, 0x00, 0xcb, 0xff, 0xeb, 0x00, 0xcd, 0xff, 0xeb, \n\t0x00, 0xcf, 0xff, 0xeb, 0x00, 0xd1, 0xff, 0xeb, 0x00, 0xd5, 0xff, 0xeb, \n\t0x00, 0xd7, 0xff, 0xeb, 0x00, 0xd9, 0xff, 0xeb, 0x00, 0xdb, 0xff, 0xeb, \n\t0x00, 0xdd, 0xff, 0xeb, 0x00, 0xdf, 0xff, 0xeb, 0x00, 0xe1, 0xff, 0xeb, \n\t0x00, 0xe3, 0xff, 0xeb, 0x00, 0xe5, 0xff, 0xeb, 0x01, 0x0f, 0xff, 0xeb, \n\t0x01, 0x11, 0xff, 0xeb, 0x01, 0x13, 0xff, 0xeb, 0x01, 0x15, 0xff, 0xeb, \n\t0x01, 0x24, 0x00, 0x14, 0x01, 0x26, 0x00, 0x14, 0x01, 0x2b, 0xff, 0xea, \n\t0x01, 0x2d, 0xff, 0xea, 0x01, 0x2f, 0xff, 0xea, 0x01, 0x31, 0xff, 0xea, \n\t0x01, 0x33, 0xff, 0xea, 0x01, 0x35, 0xff, 0xea, 0x01, 0x39, 0xff, 0xe8, \n\t0x01, 0x44, 0xff, 0xeb, 0x01, 0x46, 0xff, 0xea, 0x01, 0x48, 0xff, 0xc5, \n\t0x01, 0x49, 0xff, 0xde, 0x01, 0x63, 0xff, 0xc5, 0x01, 0x6c, 0xff, 0xc5, \n\t0x01, 0x6f, 0xff, 0xc5, 0x01, 0x76, 0xff, 0xc5, 0x01, 0x86, 0xff, 0xeb, \n\t0x01, 0x8a, 0xff, 0xea, 0x01, 0x8b, 0xff, 0xeb, 0x01, 0x8d, 0xff, 0xe8, \n\t0x01, 0x97, 0xff, 0xe8, 0x01, 0x99, 0xff, 0xeb, 0x01, 0x9c, 0xff, 0xeb, \n\t0x01, 0x9d, 0xff, 0xeb, 0x01, 0x9f, 0xff, 0xea, 0x01, 0xa5, 0xff, 0xea, \n\t0x01, 0xa6, 0xff, 0xeb, 0x01, 0xa7, 0xff, 0xea, 0x01, 0xae, 0x00, 0x14, \n\t0x01, 0xb7, 0x00, 0x14, 0x01, 0xbc, 0xff, 0xc5, 0x01, 0xce, 0x00, 0x14, \n\t0x01, 0xdc, 0xff, 0xde, 0x01, 0xe1, 0xff, 0xeb, 0x01, 0xea, 0xff, 0xeb, \n\t0x01, 0xed, 0xff, 0xeb, 0x01, 0xef, 0xff, 0xe8, 0x01, 0xf0, 0xff, 0xeb, \n\t0x01, 0xfc, 0xff, 0xeb, 0x01, 0xfd, 0xff, 0xeb, 0x02, 0x00, 0xff, 0xeb, \n\t0x02, 0x0a, 0xff, 0xe8, 0x02, 0x12, 0xff, 0xc5, 0x02, 0x1f, 0xff, 0xeb, \n\t0x02, 0x21, 0xff, 0xe8, 0x02, 0x23, 0xff, 0xe8, 0x02, 0x25, 0xff, 0xeb, \n\t0x02, 0x29, 0xff, 0xeb, 0x02, 0x2d, 0xff, 0xeb, 0x02, 0x4b, 0x00, 0x14, \n\t0x02, 0x54, 0xff, 0xeb, 0x02, 0x56, 0xff, 0xeb, 0x02, 0x57, 0x00, 0x14, \n\t0x02, 0x5a, 0xff, 0xe8, 0x02, 0x5f, 0x00, 0x14, 0x02, 0x7b, 0xff, 0xc5, \n\t0x02, 0x7c, 0xff, 0xde, 0x02, 0x7d, 0xff, 0xc5, 0x02, 0x7e, 0xff, 0xde, \n\t0x02, 0x82, 0xff, 0xeb, 0x02, 0x84, 0xff, 0xeb, 0x02, 0x86, 0xff, 0xeb, \n\t0x02, 0x92, 0xff, 0xeb, 0x02, 0x94, 0xff, 0xeb, 0x02, 0x96, 0xff, 0xeb, \n\t0x02, 0x9a, 0xff, 0xe8, 0x02, 0x9c, 0xff, 0xe8, 0x02, 0x9e, 0xff, 0xe8, \n\t0x02, 0xac, 0xff, 0xeb, 0x02, 0xad, 0xff, 0xeb, 0x02, 0xae, 0xff, 0xeb, \n\t0x02, 0xb8, 0xff, 0xeb, 0x02, 0xbf, 0xff, 0xc5, 0x02, 0xc0, 0xff, 0xde, \n\t0x02, 0xc9, 0xff, 0xc5, 0x02, 0xca, 0xff, 0xde, 0x02, 0xcb, 0xff, 0xc5, \n\t0x02, 0xcc, 0xff, 0xde, 0x02, 0xcd, 0xff, 0xc5, 0x02, 0xce, 0xff, 0xde, \n\t0x02, 0xcf, 0xff, 0xc5, 0x02, 0xd0, 0xff, 0xde, 0x02, 0xd1, 0xff, 0xc5, \n\t0x02, 0xd2, 0xff, 0xde, 0x02, 0xd3, 0xff, 0xc5, 0x02, 0xd4, 0xff, 0xde, \n\t0x02, 0xd5, 0xff, 0xc5, 0x02, 0xd6, 0xff, 0xde, 0x02, 0xd7, 0xff, 0xc5, \n\t0x02, 0xd8, 0xff, 0xde, 0x02, 0xd9, 0xff, 0xc5, 0x02, 0xda, 0xff, 0xde, \n\t0x02, 0xdb, 0xff, 0xc5, 0x02, 0xdc, 0xff, 0xde, 0x02, 0xdd, 0xff, 0xc5, \n\t0x02, 0xde, 0xff, 0xde, 0x02, 0xdf, 0xff, 0xc5, 0x02, 0xe0, 0xff, 0xde, \n\t0x02, 0xe2, 0xff, 0xeb, 0x02, 0xe4, 0xff, 0xeb, 0x02, 0xe6, 0xff, 0xeb, \n\t0x02, 0xe8, 0xff, 0xeb, 0x02, 0xea, 0xff, 0xeb, 0x02, 0xec, 0xff, 0xeb, \n\t0x02, 0xee, 0xff, 0xeb, 0x02, 0xf0, 0xff, 0xeb, 0x02, 0xf6, 0xff, 0xeb, \n\t0x02, 0xf8, 0xff, 0xeb, 0x02, 0xfa, 0xff, 0xeb, 0x02, 0xfc, 0xff, 0xeb, \n\t0x02, 0xfe, 0xff, 0xeb, 0x03, 0x00, 0xff, 0xeb, 0x03, 0x02, 0xff, 0xeb, \n\t0x03, 0x04, 0xff, 0xeb, 0x03, 0x06, 0xff, 0xeb, 0x03, 0x08, 0xff, 0xeb, \n\t0x03, 0x0a, 0xff, 0xeb, 0x03, 0x0c, 0xff, 0xeb, 0x03, 0x0e, 0xff, 0xea, \n\t0x03, 0x10, 0xff, 0xea, 0x03, 0x12, 0xff, 0xea, 0x03, 0x14, 0xff, 0xea, \n\t0x03, 0x16, 0xff, 0xea, 0x03, 0x18, 0xff, 0xea, 0x03, 0x1a, 0xff, 0xea, \n\t0x03, 0x1c, 0xff, 0xe8, 0x03, 0x1e, 0xff, 0xe8, 0x03, 0x20, 0xff, 0xe8, \n\t0x03, 0x22, 0xff, 0xe8, 0x03, 0x36, 0xfe, 0xef, 0x03, 0x3a, 0xfe, 0xef, \n\t0x03, 0x3e, 0xfe, 0xef, 0x03, 0x3f, 0xfe, 0xef, 0x00, 0x1e, 0x00, 0x37, \n\t0xff, 0xdf, 0x00, 0x39, 0xff, 0xe4, 0x00, 0x3a, 0xff, 0xec, 0x00, 0x3c, \n\t0xff, 0xdd, 0x00, 0x9f, 0xff, 0xdd, 0x01, 0x24, 0xff, 0xdf, 0x01, 0x26, \n\t0xff, 0xdf, 0x01, 0x36, 0xff, 0xec, 0x01, 0x38, 0xff, 0xdd, 0x01, 0x3a, \n\t0xff, 0xdd, 0x01, 0x69, 0xff, 0xdd, 0x01, 0x7f, 0xff, 0xdd, 0x01, 0x85, \n\t0xff, 0xdd, 0x01, 0xae, 0xff, 0xdf, 0x01, 0xb7, 0xff, 0xdf, 0x01, 0xce, \n\t0xff, 0xdf, 0x02, 0x20, 0xff, 0xe4, 0x02, 0x22, 0xff, 0xe4, 0x02, 0x4b, \n\t0xff, 0xdf, 0x02, 0x57, 0xff, 0xdf, 0x02, 0x59, 0xff, 0xdd, 0x02, 0x5b, \n\t0xff, 0xdd, 0x02, 0x5f, 0xff, 0xdf, 0x02, 0xc3, 0xff, 0xec, 0x02, 0xc5, \n\t0xff, 0xec, 0x02, 0xc7, 0xff, 0xec, 0x03, 0x1b, 0xff, 0xdd, 0x03, 0x1d, \n\t0xff, 0xdd, 0x03, 0x1f, 0xff, 0xdd, 0x03, 0x21, 0xff, 0xdd, 0x00, 0x19, \n\t0x00, 0x37, 0xff, 0xce, 0x00, 0x39, 0xff, 0xed, 0x00, 0x3c, 0xff, 0xd0, \n\t0x00, 0x9f, 0xff, 0xd0, 0x01, 0x24, 0xff, 0xce, 0x01, 0x26, 0xff, 0xce, \n\t0x01, 0x38, 0xff, 0xd0, 0x01, 0x3a, 0xff, 0xd0, 0x01, 0x69, 0xff, 0xd0, \n\t0x01, 0x7f, 0xff, 0xd0, 0x01, 0x85, 0xff, 0xd0, 0x01, 0xae, 0xff, 0xce, \n\t0x01, 0xb7, 0xff, 0xce, 0x01, 0xce, 0xff, 0xce, 0x02, 0x20, 0xff, 0xed, \n\t0x02, 0x22, 0xff, 0xed, 0x02, 0x4b, 0xff, 0xce, 0x02, 0x57, 0xff, 0xce, \n\t0x02, 0x59, 0xff, 0xd0, 0x02, 0x5b, 0xff, 0xd0, 0x02, 0x5f, 0xff, 0xce, \n\t0x03, 0x1b, 0xff, 0xd0, 0x03, 0x1d, 0xff, 0xd0, 0x03, 0x1f, 0xff, 0xd0, \n\t0x03, 0x21, 0xff, 0xd0, 0x00, 0x10, 0x00, 0x2d, 0xff, 0xee, 0x00, 0x38, \n\t0xff, 0xee, 0x00, 0x9b, 0xff, 0xee, 0x00, 0x9c, 0xff, 0xee, 0x00, 0x9d, \n\t0xff, 0xee, 0x00, 0x9e, 0xff, 0xee, 0x00, 0xf6, 0xff, 0xee, 0x01, 0x2a, \n\t0xff, 0xee, 0x01, 0x2c, 0xff, 0xee, 0x01, 0x2e, 0xff, 0xee, 0x01, 0x30, \n\t0xff, 0xee, 0x01, 0x32, 0xff, 0xee, 0x01, 0x34, 0xff, 0xee, 0x01, 0xb4, \n\t0xff, 0xee, 0x03, 0x0d, 0xff, 0xee, 0x03, 0x0f, 0xff, 0xee, 0x00, 0x4a, \n\t0x00, 0x05, 0x00, 0x10, 0x00, 0x0a, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x14, \n\t0x00, 0x40, 0x00, 0x12, 0x00, 0x46, 0xff, 0xe8, 0x00, 0x47, 0xff, 0xe8, \n\t0x00, 0x48, 0xff, 0xe8, 0x00, 0x4a, 0xff, 0xe8, 0x00, 0x54, 0xff, 0xe8, \n\t0x00, 0x60, 0x00, 0x13, 0x00, 0xa9, 0xff, 0xe8, 0x00, 0xaa, 0xff, 0xe8, \n\t0x00, 0xab, 0xff, 0xe8, 0x00, 0xac, 0xff, 0xe8, 0x00, 0xad, 0xff, 0xe8, \n\t0x00, 0xc9, 0xff, 0xe8, 0x00, 0xcb, 0xff, 0xe8, 0x00, 0xcd, 0xff, 0xe8, \n\t0x00, 0xcf, 0xff, 0xe8, 0x00, 0xd1, 0xff, 0xe8, 0x00, 0xd5, 0xff, 0xe8, \n\t0x00, 0xd7, 0xff, 0xe8, 0x00, 0xd9, 0xff, 0xe8, 0x00, 0xdb, 0xff, 0xe8, \n\t0x00, 0xdd, 0xff, 0xe8, 0x00, 0xdf, 0xff, 0xe8, 0x00, 0xe1, 0xff, 0xe8, \n\t0x00, 0xe3, 0xff, 0xe8, 0x00, 0xe5, 0xff, 0xe8, 0x01, 0x15, 0xff, 0xe8, \n\t0x01, 0x44, 0xff, 0xe8, 0x01, 0x51, 0x00, 0x10, 0x01, 0x86, 0xff, 0xe8, \n\t0x01, 0x8b, 0xff, 0xe8, 0x01, 0x9c, 0xff, 0xe8, 0x01, 0x9d, 0xff, 0xe8, \n\t0x01, 0xe1, 0xff, 0xe8, 0x01, 0xed, 0xff, 0xe8, 0x01, 0xf0, 0xff, 0xe8, \n\t0x01, 0xfc, 0xff, 0xe8, 0x01, 0xfd, 0xff, 0xe8, 0x02, 0x00, 0xff, 0xe8, \n\t0x02, 0x25, 0xff, 0xe8, 0x02, 0x29, 0xff, 0xe8, 0x02, 0x2d, 0xff, 0xe8, \n\t0x02, 0x54, 0xff, 0xe8, 0x02, 0x56, 0xff, 0xe8, 0x02, 0x82, 0xff, 0xe8, \n\t0x02, 0x84, 0xff, 0xe8, 0x02, 0x86, 0xff, 0xe8, 0x02, 0x94, 0xff, 0xe8, \n\t0x02, 0xac, 0xff, 0xe8, 0x02, 0xad, 0xff, 0xe8, 0x02, 0xae, 0xff, 0xe8, \n\t0x02, 0xb8, 0xff, 0xe8, 0x02, 0xe2, 0xff, 0xe8, 0x02, 0xe4, 0xff, 0xe8, \n\t0x02, 0xe6, 0xff, 0xe8, 0x02, 0xe8, 0xff, 0xe8, 0x02, 0xea, 0xff, 0xe8, \n\t0x02, 0xec, 0xff, 0xe8, 0x02, 0xee, 0xff, 0xe8, 0x02, 0xf0, 0xff, 0xe8, \n\t0x03, 0x04, 0xff, 0xe8, 0x03, 0x06, 0xff, 0xe8, 0x03, 0x08, 0xff, 0xe8, \n\t0x03, 0x0c, 0xff, 0xe8, 0x03, 0x34, 0x00, 0x10, 0x03, 0x35, 0x00, 0x10, \n\t0x03, 0x37, 0x00, 0x10, 0x03, 0x38, 0x00, 0x10, 0x03, 0x39, 0x00, 0x10, \n\t0x03, 0x41, 0x00, 0x10, 0x03, 0x42, 0x00, 0x10, 0x00, 0x3d, 0x00, 0x46, \n\t0xff, 0xec, 0x00, 0x47, 0xff, 0xec, 0x00, 0x48, 0xff, 0xec, 0x00, 0x4a, \n\t0xff, 0xec, 0x00, 0x54, 0xff, 0xec, 0x00, 0xa9, 0xff, 0xec, 0x00, 0xaa, \n\t0xff, 0xec, 0x00, 0xab, 0xff, 0xec, 0x00, 0xac, 0xff, 0xec, 0x00, 0xad, \n\t0xff, 0xec, 0x00, 0xc9, 0xff, 0xec, 0x00, 0xcb, 0xff, 0xec, 0x00, 0xcd, \n\t0xff, 0xec, 0x00, 0xcf, 0xff, 0xec, 0x00, 0xd1, 0xff, 0xec, 0x00, 0xd5, \n\t0xff, 0xec, 0x00, 0xd7, 0xff, 0xec, 0x00, 0xd9, 0xff, 0xec, 0x00, 0xdb, \n\t0xff, 0xec, 0x00, 0xdd, 0xff, 0xec, 0x00, 0xdf, 0xff, 0xec, 0x00, 0xe1, \n\t0xff, 0xec, 0x00, 0xe3, 0xff, 0xec, 0x00, 0xe5, 0xff, 0xec, 0x01, 0x15, \n\t0xff, 0xec, 0x01, 0x44, 0xff, 0xec, 0x01, 0x86, 0xff, 0xec, 0x01, 0x8b, \n\t0xff, 0xec, 0x01, 0x9c, 0xff, 0xec, 0x01, 0x9d, 0xff, 0xec, 0x01, 0xe1, \n\t0xff, 0xec, 0x01, 0xed, 0xff, 0xec, 0x01, 0xf0, 0xff, 0xec, 0x01, 0xfc, \n\t0xff, 0xec, 0x01, 0xfd, 0xff, 0xec, 0x02, 0x00, 0xff, 0xec, 0x02, 0x25, \n\t0xff, 0xec, 0x02, 0x29, 0xff, 0xec, 0x02, 0x2d, 0xff, 0xec, 0x02, 0x54, \n\t0xff, 0xec, 0x02, 0x56, 0xff, 0xec, 0x02, 0x82, 0xff, 0xec, 0x02, 0x84, \n\t0xff, 0xec, 0x02, 0x86, 0xff, 0xec, 0x02, 0x94, 0xff, 0xec, 0x02, 0xac, \n\t0xff, 0xec, 0x02, 0xad, 0xff, 0xec, 0x02, 0xae, 0xff, 0xec, 0x02, 0xb8, \n\t0xff, 0xec, 0x02, 0xe2, 0xff, 0xec, 0x02, 0xe4, 0xff, 0xec, 0x02, 0xe6, \n\t0xff, 0xec, 0x02, 0xe8, 0xff, 0xec, 0x02, 0xea, 0xff, 0xec, 0x02, 0xec, \n\t0xff, 0xec, 0x02, 0xee, 0xff, 0xec, 0x02, 0xf0, 0xff, 0xec, 0x03, 0x04, \n\t0xff, 0xec, 0x03, 0x06, 0xff, 0xec, 0x03, 0x08, 0xff, 0xec, 0x03, 0x0c, \n\t0xff, 0xec, 0x00, 0x07, 0x00, 0x0f, 0xff, 0x84, 0x00, 0x11, 0xff, 0x84, \n\t0x00, 0x1d, 0xff, 0x84, 0x03, 0x36, 0xff, 0x84, 0x03, 0x3a, 0xff, 0x84, \n\t0x03, 0x3e, 0xff, 0x84, 0x03, 0x3f, 0xff, 0x84, 0x00, 0x10, 0x00, 0x2d, \n\t0xff, 0xec, 0x00, 0x38, 0xff, 0xec, 0x00, 0x9b, 0xff, 0xec, 0x00, 0x9c, \n\t0xff, 0xec, 0x00, 0x9d, 0xff, 0xec, 0x00, 0x9e, 0xff, 0xec, 0x00, 0xf6, \n\t0xff, 0xec, 0x01, 0x2a, 0xff, 0xec, 0x01, 0x2c, 0xff, 0xec, 0x01, 0x2e, \n\t0xff, 0xec, 0x01, 0x30, 0xff, 0xec, 0x01, 0x32, 0xff, 0xec, 0x01, 0x34, \n\t0xff, 0xec, 0x01, 0xb4, 0xff, 0xec, 0x03, 0x0d, 0xff, 0xec, 0x03, 0x0f, \n\t0xff, 0xec, 0x00, 0x07, 0x00, 0x5a, 0xff, 0xcc, 0x03, 0x76, 0xff, 0xb5, \n\t0x03, 0x78, 0xff, 0xd6, 0x03, 0x79, 0xff, 0xb7, 0x03, 0x7a, 0xff, 0xee, \n\t0x03, 0x7b, 0xff, 0xbb, 0x03, 0x7e, 0xff, 0xf2, 0x00, 0x03, 0x00, 0x49, \n\t0x00, 0x0f, 0x00, 0x57, 0x00, 0x11, 0x00, 0x5a, 0x00, 0x11, 0x00, 0x04, \n\t0x00, 0x5a, 0xff, 0xe5, 0x01, 0x80, 0xff, 0xcb, 0x01, 0xa2, 0xff, 0xe4, \n\t0x03, 0x7e, 0xff, 0xec, 0x00, 0x3a, 0x00, 0x26, 0xff, 0xf3, 0x00, 0x2a, \n\t0xff, 0xf3, 0x00, 0x32, 0xff, 0xf3, 0x00, 0x34, 0xff, 0xf3, 0x00, 0x89, \n\t0xff, 0xf3, 0x00, 0x94, 0xff, 0xf3, 0x00, 0x95, 0xff, 0xf3, 0x00, 0x96, \n\t0xff, 0xf3, 0x00, 0x97, 0xff, 0xf3, 0x00, 0x98, 0xff, 0xf3, 0x00, 0x9a, \n\t0xff, 0xf3, 0x00, 0xc8, 0xff, 0xf3, 0x00, 0xca, 0xff, 0xf3, 0x00, 0xcc, \n\t0xff, 0xf3, 0x00, 0xce, 0xff, 0xf3, 0x00, 0xde, 0xff, 0xf3, 0x00, 0xe0, \n\t0xff, 0xf3, 0x00, 0xe2, 0xff, 0xf3, 0x00, 0xe4, 0xff, 0xf3, 0x01, 0x0e, \n\t0xff, 0xf3, 0x01, 0x10, 0xff, 0xf3, 0x01, 0x12, 0xff, 0xf3, 0x01, 0x14, \n\t0xff, 0xf3, 0x01, 0x43, 0xff, 0xf3, 0x01, 0x4c, 0xff, 0xf3, 0x01, 0x68, \n\t0xff, 0xf3, 0x01, 0x73, 0xff, 0xf3, 0x01, 0x7a, 0xff, 0xf3, 0x01, 0x95, \n\t0x00, 0x0d, 0x01, 0xb0, 0xff, 0xf3, 0x01, 0xca, 0xff, 0xf3, 0x01, 0xcd, \n\t0xff, 0xf3, 0x02, 0x0c, 0xff, 0xf3, 0x02, 0x1e, 0xff, 0xf3, 0x02, 0x24, \n\t0xff, 0xf3, 0x02, 0x26, 0xff, 0xf3, 0x02, 0x28, 0xff, 0xf3, 0x02, 0x2a, \n\t0xff, 0xf3, 0x02, 0x2c, 0xff, 0xf3, 0x02, 0x53, 0xff, 0xf3, 0x02, 0x55, \n\t0xff, 0xf3, 0x02, 0x91, 0xff, 0xf3, 0x02, 0x93, 0xff, 0xf3, 0x02, 0x95, \n\t0xff, 0xf3, 0x02, 0xb7, 0xff, 0xf3, 0x02, 0xf5, 0xff, 0xf3, 0x02, 0xf7, \n\t0xff, 0xf3, 0x02, 0xf9, 0xff, 0xf3, 0x02, 0xfb, 0xff, 0xf3, 0x02, 0xfd, \n\t0xff, 0xf3, 0x02, 0xff, 0xff, 0xf3, 0x03, 0x01, 0xff, 0xf3, 0x03, 0x03, \n\t0xff, 0xf3, 0x03, 0x05, 0xff, 0xf3, 0x03, 0x07, 0xff, 0xf3, 0x03, 0x09, \n\t0xff, 0xf3, 0x03, 0x0b, 0xff, 0xf3, 0x03, 0x23, 0xff, 0xf3, 0x00, 0x3b, \n\t0x00, 0x26, 0xff, 0xe6, 0x00, 0x2a, 0xff, 0xe6, 0x00, 0x32, 0xff, 0xe6, \n\t0x00, 0x34, 0xff, 0xe6, 0x00, 0x89, 0xff, 0xe6, 0x00, 0x94, 0xff, 0xe6, \n\t0x00, 0x95, 0xff, 0xe6, 0x00, 0x96, 0xff, 0xe6, 0x00, 0x97, 0xff, 0xe6, \n\t0x00, 0x98, 0xff, 0xe6, 0x00, 0x9a, 0xff, 0xe6, 0x00, 0xc8, 0xff, 0xe6, \n\t0x00, 0xca, 0xff, 0xe6, 0x00, 0xcc, 0xff, 0xe6, 0x00, 0xce, 0xff, 0xe6, \n\t0x00, 0xde, 0xff, 0xe6, 0x00, 0xe0, 0xff, 0xe6, 0x00, 0xe2, 0xff, 0xe6, \n\t0x00, 0xe4, 0xff, 0xe6, 0x01, 0x0e, 0xff, 0xe6, 0x01, 0x10, 0xff, 0xe6, \n\t0x01, 0x12, 0xff, 0xe6, 0x01, 0x14, 0xff, 0xe6, 0x01, 0x43, 0xff, 0xe6, \n\t0x01, 0x4c, 0xff, 0xe6, 0x01, 0x68, 0xff, 0xe6, 0x01, 0x73, 0xff, 0xe6, \n\t0x01, 0x7a, 0xff, 0xe6, 0x01, 0x80, 0xff, 0xc2, 0x01, 0x95, 0x00, 0x10, \n\t0x01, 0xb0, 0xff, 0xe6, 0x01, 0xca, 0xff, 0xe6, 0x01, 0xcd, 0xff, 0xe6, \n\t0x02, 0x0c, 0xff, 0xe6, 0x02, 0x1e, 0xff, 0xe6, 0x02, 0x24, 0xff, 0xe6, \n\t0x02, 0x26, 0xff, 0xe6, 0x02, 0x28, 0xff, 0xe6, 0x02, 0x2a, 0xff, 0xe6, \n\t0x02, 0x2c, 0xff, 0xe6, 0x02, 0x53, 0xff, 0xe6, 0x02, 0x55, 0xff, 0xe6, \n\t0x02, 0x91, 0xff, 0xe6, 0x02, 0x93, 0xff, 0xe6, 0x02, 0x95, 0xff, 0xe6, \n\t0x02, 0xb7, 0xff, 0xe6, 0x02, 0xf5, 0xff, 0xe6, 0x02, 0xf7, 0xff, 0xe6, \n\t0x02, 0xf9, 0xff, 0xe6, 0x02, 0xfb, 0xff, 0xe6, 0x02, 0xfd, 0xff, 0xe6, \n\t0x02, 0xff, 0xff, 0xe6, 0x03, 0x01, 0xff, 0xe6, 0x03, 0x03, 0xff, 0xe6, \n\t0x03, 0x05, 0xff, 0xe6, 0x03, 0x07, 0xff, 0xe6, 0x03, 0x09, 0xff, 0xe6, \n\t0x03, 0x0b, 0xff, 0xe6, 0x03, 0x23, 0xff, 0xe6, 0x00, 0x37, 0x00, 0x24, \n\t0xff, 0xe4, 0x00, 0x3b, 0xff, 0xd2, 0x00, 0x3c, 0xff, 0xd3, 0x00, 0x82, \n\t0xff, 0xe4, 0x00, 0x83, 0xff, 0xe4, 0x00, 0x84, 0xff, 0xe4, 0x00, 0x85, \n\t0xff, 0xe4, 0x00, 0x86, 0xff, 0xe4, 0x00, 0x87, 0xff, 0xe4, 0x00, 0x9f, \n\t0xff, 0xd3, 0x00, 0xc2, 0xff, 0xe4, 0x00, 0xc4, 0xff, 0xe4, 0x00, 0xc6, \n\t0xff, 0xe4, 0x01, 0x38, 0xff, 0xd3, 0x01, 0x3a, 0xff, 0xd3, 0x01, 0x48, \n\t0xff, 0xe4, 0x01, 0x63, 0xff, 0xe4, 0x01, 0x69, 0xff, 0xd3, 0x01, 0x6c, \n\t0xff, 0xe4, 0x01, 0x6f, 0xff, 0xe4, 0x01, 0x76, 0xff, 0xe4, 0x01, 0x7f, \n\t0xff, 0xd3, 0x01, 0x81, 0xff, 0xd2, 0x01, 0x85, 0xff, 0xd3, 0x01, 0x95, \n\t0xff, 0xe2, 0x01, 0xbc, 0xff, 0xe4, 0x01, 0xc2, 0xff, 0xd2, 0x01, 0xd1, \n\t0xff, 0xd2, 0x02, 0x12, 0xff, 0xe4, 0x02, 0x41, 0xff, 0xd2, 0x02, 0x59, \n\t0xff, 0xd3, 0x02, 0x5b, 0xff, 0xd3, 0x02, 0x5d, 0xff, 0xd2, 0x02, 0x6c, \n\t0xff, 0xd2, 0x02, 0x7b, 0xff, 0xe4, 0x02, 0x7d, 0xff, 0xe4, 0x02, 0x87, \n\t0xff, 0xd2, 0x02, 0xa7, 0xff, 0xd2, 0x02, 0xbf, 0xff, 0xe4, 0x02, 0xc9, \n\t0xff, 0xe4, 0x02, 0xcb, 0xff, 0xe4, 0x02, 0xcd, 0xff, 0xe4, 0x02, 0xcf, \n\t0xff, 0xe4, 0x02, 0xd1, 0xff, 0xe4, 0x02, 0xd3, 0xff, 0xe4, 0x02, 0xd5, \n\t0xff, 0xe4, 0x02, 0xd7, 0xff, 0xe4, 0x02, 0xd9, 0xff, 0xe4, 0x02, 0xdb, \n\t0xff, 0xe4, 0x02, 0xdd, 0xff, 0xe4, 0x02, 0xdf, 0xff, 0xe4, 0x03, 0x1b, \n\t0xff, 0xd3, 0x03, 0x1d, 0xff, 0xd3, 0x03, 0x1f, 0xff, 0xd3, 0x03, 0x21, \n\t0xff, 0xd3, 0x00, 0x28, 0x00, 0x0f, 0xff, 0x46, 0x00, 0x11, 0xff, 0x46, \n\t0x00, 0x1d, 0xff, 0x46, 0x00, 0x24, 0xff, 0xcd, 0x00, 0x82, 0xff, 0xcd, \n\t0x00, 0x83, 0xff, 0xcd, 0x00, 0x84, 0xff, 0xcd, 0x00, 0x85, 0xff, 0xcd, \n\t0x00, 0x86, 0xff, 0xcd, 0x00, 0x87, 0xff, 0xcd, 0x00, 0xc2, 0xff, 0xcd, \n\t0x00, 0xc4, 0xff, 0xcd, 0x00, 0xc6, 0xff, 0xcd, 0x01, 0x48, 0xff, 0xcd, \n\t0x01, 0x63, 0xff, 0xcd, 0x01, 0x6c, 0xff, 0xcd, 0x01, 0x6f, 0xff, 0xcd, \n\t0x01, 0x76, 0xff, 0xcd, 0x01, 0x9b, 0xff, 0xf2, 0x01, 0xbc, 0xff, 0xcd, \n\t0x02, 0x12, 0xff, 0xcd, 0x02, 0x7b, 0xff, 0xcd, 0x02, 0x7d, 0xff, 0xcd, \n\t0x02, 0xbf, 0xff, 0xcd, 0x02, 0xc9, 0xff, 0xcd, 0x02, 0xcb, 0xff, 0xcd, \n\t0x02, 0xcd, 0xff, 0xcd, 0x02, 0xcf, 0xff, 0xcd, 0x02, 0xd1, 0xff, 0xcd, \n\t0x02, 0xd3, 0xff, 0xcd, 0x02, 0xd5, 0xff, 0xcd, 0x02, 0xd7, 0xff, 0xcd, \n\t0x02, 0xd9, 0xff, 0xcd, 0x02, 0xdb, 0xff, 0xcd, 0x02, 0xdd, 0xff, 0xcd, \n\t0x02, 0xdf, 0xff, 0xcd, 0x03, 0x36, 0xff, 0x46, 0x03, 0x3a, 0xff, 0x46, \n\t0x03, 0x3e, 0xff, 0x46, 0x03, 0x3f, 0xff, 0x46, 0x00, 0x01, 0x01, 0x95, \n\t0x00, 0x0e, 0x00, 0x02, 0x01, 0x9e, 0xff, 0xed, 0x01, 0xa1, 0xff, 0xec, \n\t0x00, 0xb0, 0x00, 0x46, 0xff, 0xdc, 0x00, 0x47, 0xff, 0xdc, 0x00, 0x48, \n\t0xff, 0xdc, 0x00, 0x4a, 0xff, 0xdc, 0x00, 0x50, 0xff, 0xc2, 0x00, 0x51, \n\t0xff, 0xc2, 0x00, 0x52, 0xff, 0xd6, 0x00, 0x53, 0xff, 0xc2, 0x00, 0x54, \n\t0xff, 0xdc, 0x00, 0x58, 0xff, 0xdd, 0x00, 0x59, 0xff, 0xe1, 0x00, 0x5c, \n\t0xff, 0xe1, 0x00, 0xa9, 0xff, 0xdc, 0x00, 0xaa, 0xff, 0xdc, 0x00, 0xab, \n\t0xff, 0xdc, 0x00, 0xac, 0xff, 0xdc, 0x00, 0xad, 0xff, 0xdc, 0x00, 0xb3, \n\t0xff, 0xc2, 0x00, 0xb4, 0xff, 0xd6, 0x00, 0xb5, 0xff, 0xd6, 0x00, 0xb6, \n\t0xff, 0xd6, 0x00, 0xb7, 0xff, 0xd6, 0x00, 0xb8, 0xff, 0xd6, 0x00, 0xbb, \n\t0xff, 0xdd, 0x00, 0xbc, 0xff, 0xdd, 0x00, 0xbd, 0xff, 0xdd, 0x00, 0xbe, \n\t0xff, 0xdd, 0x00, 0xbf, 0xff, 0xe1, 0x00, 0xc1, 0xff, 0xe1, 0x00, 0xc9, \n\t0xff, 0xdc, 0x00, 0xcb, 0xff, 0xdc, 0x00, 0xcd, 0xff, 0xdc, 0x00, 0xcf, \n\t0xff, 0xdc, 0x00, 0xd1, 0xff, 0xdc, 0x00, 0xd5, 0xff, 0xdc, 0x00, 0xd7, \n\t0xff, 0xdc, 0x00, 0xd9, 0xff, 0xdc, 0x00, 0xdb, 0xff, 0xdc, 0x00, 0xdd, \n\t0xff, 0xdc, 0x00, 0xdf, 0xff, 0xdc, 0x00, 0xe1, 0xff, 0xdc, 0x00, 0xe3, \n\t0xff, 0xdc, 0x00, 0xe5, 0xff, 0xdc, 0x01, 0x06, 0xff, 0xc2, 0x01, 0x08, \n\t0xff, 0xc2, 0x01, 0x0a, 0xff, 0xc2, 0x01, 0x0b, 0xff, 0xc2, 0x01, 0x0f, \n\t0xff, 0xd6, 0x01, 0x11, 0xff, 0xd6, 0x01, 0x13, 0xff, 0xd6, 0x01, 0x15, \n\t0xff, 0xdc, 0x01, 0x2b, 0xff, 0xdd, 0x01, 0x2d, 0xff, 0xdd, 0x01, 0x2f, \n\t0xff, 0xdd, 0x01, 0x31, 0xff, 0xdd, 0x01, 0x33, 0xff, 0xdd, 0x01, 0x35, \n\t0xff, 0xdd, 0x01, 0x39, 0xff, 0xe1, 0x01, 0x44, 0xff, 0xdc, 0x01, 0x46, \n\t0xff, 0xdd, 0x01, 0x86, 0xff, 0xdc, 0x01, 0x88, 0xff, 0xc2, 0x01, 0x8a, \n\t0xff, 0xdd, 0x01, 0x8b, 0xff, 0xdc, 0x01, 0x8d, 0xff, 0xe1, 0x01, 0x8e, \n\t0xff, 0xee, 0x01, 0x8f, 0xff, 0xe6, 0x01, 0x91, 0xff, 0xc2, 0x01, 0x92, \n\t0xff, 0xeb, 0x01, 0x93, 0xff, 0xe9, 0x01, 0x97, 0xff, 0xe1, 0x01, 0x98, \n\t0xff, 0xf0, 0x01, 0x99, 0xff, 0xd6, 0x01, 0x9a, 0xff, 0xe7, 0x01, 0x9c, \n\t0xff, 0xdc, 0x01, 0x9d, 0xff, 0xdc, 0x01, 0x9e, 0xff, 0xe3, 0x01, 0x9f, \n\t0xff, 0xdd, 0x01, 0xa0, 0xff, 0xce, 0x01, 0xa2, 0xff, 0xd4, 0x01, 0xa3, \n\t0xff, 0xdb, 0x01, 0xa5, 0xff, 0xdd, 0x01, 0xa6, 0xff, 0xd6, 0x01, 0xa7, \n\t0xff, 0xdd, 0x01, 0xdf, 0xff, 0xc2, 0x01, 0xe1, 0xff, 0xdc, 0x01, 0xe4, \n\t0xff, 0xc2, 0x01, 0xe5, 0xff, 0xc2, 0x01, 0xe6, 0xff, 0xc2, 0x01, 0xe8, \n\t0xff, 0xc2, 0x01, 0xe9, 0xff, 0xc2, 0x01, 0xea, 0xff, 0xd6, 0x01, 0xeb, \n\t0xff, 0xc2, 0x01, 0xec, 0xff, 0xc2, 0x01, 0xed, 0xff, 0xdc, 0x01, 0xef, \n\t0xff, 0xe1, 0x01, 0xf0, 0xff, 0xdc, 0x01, 0xf2, 0xff, 0xc2, 0x01, 0xf4, \n\t0xff, 0xc2, 0x01, 0xf5, 0xff, 0xc2, 0x01, 0xf8, 0xff, 0xc2, 0x01, 0xfa, \n\t0xff, 0xc2, 0x01, 0xfc, 0xff, 0xdc, 0x01, 0xfd, 0xff, 0xdc, 0x01, 0xff, \n\t0xff, 0xc2, 0x02, 0x00, 0xff, 0xdc, 0x02, 0x06, 0xff, 0xc2, 0x02, 0x08, \n\t0xff, 0xc2, 0x02, 0x09, 0xff, 0xc2, 0x02, 0x0a, 0xff, 0xe1, 0x02, 0x1f, \n\t0xff, 0xd6, 0x02, 0x21, 0xff, 0xe1, 0x02, 0x23, 0xff, 0xe1, 0x02, 0x25, \n\t0xff, 0xdc, 0x02, 0x29, 0xff, 0xdc, 0x02, 0x2d, 0xff, 0xdc, 0x02, 0x36, \n\t0xff, 0xc2, 0x02, 0x46, 0xff, 0xc2, 0x02, 0x4e, 0xff, 0xc2, 0x02, 0x50, \n\t0xff, 0xc2, 0x02, 0x54, 0xff, 0xdc, 0x02, 0x56, 0xff, 0xdc, 0x02, 0x5a, \n\t0xff, 0xe1, 0x02, 0x73, 0xff, 0xc2, 0x02, 0x75, 0xff, 0xc2, 0x02, 0x79, \n\t0xff, 0xc2, 0x02, 0x82, 0xff, 0xdc, 0x02, 0x84, 0xff, 0xdc, 0x02, 0x86, \n\t0xff, 0xdc, 0x02, 0x8e, 0xff, 0xc2, 0x02, 0x90, 0xff, 0xc2, 0x02, 0x92, \n\t0xff, 0xd6, 0x02, 0x94, 0xff, 0xdc, 0x02, 0x96, 0xff, 0xd6, 0x02, 0x9a, \n\t0xff, 0xe1, 0x02, 0x9c, 0xff, 0xe1, 0x02, 0x9e, 0xff, 0xe1, 0x02, 0xa2, \n\t0xff, 0xc2, 0x02, 0xa4, 0xff, 0xc2, 0x02, 0xa6, 0xff, 0xc2, 0x02, 0xac, \n\t0xff, 0xdc, 0x02, 0xad, 0xff, 0xdc, 0x02, 0xae, 0xff, 0xdc, 0x02, 0xb8, \n\t0xff, 0xdc, 0x02, 0xc2, 0xff, 0xc2, 0x02, 0xe2, 0xff, 0xdc, 0x02, 0xe4, \n\t0xff, 0xdc, 0x02, 0xe6, 0xff, 0xdc, 0x02, 0xe8, 0xff, 0xdc, 0x02, 0xea, \n\t0xff, 0xdc, 0x02, 0xec, 0xff, 0xdc, 0x02, 0xee, 0xff, 0xdc, 0x02, 0xf0, \n\t0xff, 0xdc, 0x02, 0xf6, 0xff, 0xd6, 0x02, 0xf8, 0xff, 0xd6, 0x02, 0xfa, \n\t0xff, 0xd6, 0x02, 0xfc, 0xff, 0xd6, 0x02, 0xfe, 0xff, 0xd6, 0x03, 0x00, \n\t0xff, 0xd6, 0x03, 0x02, 0xff, 0xd6, 0x03, 0x04, 0xff, 0xdc, 0x03, 0x06, \n\t0xff, 0xdc, 0x03, 0x08, 0xff, 0xdc, 0x03, 0x0a, 0xff, 0xd6, 0x03, 0x0c, \n\t0xff, 0xdc, 0x03, 0x0e, 0xff, 0xdd, 0x03, 0x10, 0xff, 0xdd, 0x03, 0x12, \n\t0xff, 0xdd, 0x03, 0x14, 0xff, 0xdd, 0x03, 0x16, 0xff, 0xdd, 0x03, 0x18, \n\t0xff, 0xdd, 0x03, 0x1a, 0xff, 0xdd, 0x03, 0x1c, 0xff, 0xe1, 0x03, 0x1e, \n\t0xff, 0xe1, 0x03, 0x20, 0xff, 0xe1, 0x03, 0x22, 0xff, 0xe1, 0x00, 0x76, \n\t0x00, 0x05, 0xff, 0xda, 0x00, 0x0a, 0xff, 0xda, 0x00, 0x46, 0xff, 0xf0, \n\t0x00, 0x47, 0xff, 0xf0, 0x00, 0x48, 0xff, 0xf0, 0x00, 0x4a, 0xff, 0xf0, \n\t0x00, 0x54, 0xff, 0xf0, 0x00, 0x58, 0xff, 0xef, 0x00, 0x59, 0xff, 0xdc, \n\t0x00, 0x5c, 0xff, 0xdc, 0x00, 0xa9, 0xff, 0xf0, 0x00, 0xaa, 0xff, 0xf0, \n\t0x00, 0xab, 0xff, 0xf0, 0x00, 0xac, 0xff, 0xf0, 0x00, 0xad, 0xff, 0xf0, \n\t0x00, 0xbb, 0xff, 0xef, 0x00, 0xbc, 0xff, 0xef, 0x00, 0xbd, 0xff, 0xef, \n\t0x00, 0xbe, 0xff, 0xef, 0x00, 0xbf, 0xff, 0xdc, 0x00, 0xc1, 0xff, 0xdc, \n\t0x00, 0xc9, 0xff, 0xf0, 0x00, 0xcb, 0xff, 0xf0, 0x00, 0xcd, 0xff, 0xf0, \n\t0x00, 0xcf, 0xff, 0xf0, 0x00, 0xd1, 0xff, 0xf0, 0x00, 0xd5, 0xff, 0xf0, \n\t0x00, 0xd7, 0xff, 0xf0, 0x00, 0xd9, 0xff, 0xf0, 0x00, 0xdb, 0xff, 0xf0, \n\t0x00, 0xdd, 0xff, 0xf0, 0x00, 0xdf, 0xff, 0xf0, 0x00, 0xe1, 0xff, 0xf0, \n\t0x00, 0xe3, 0xff, 0xf0, 0x00, 0xe5, 0xff, 0xf0, 0x01, 0x15, 0xff, 0xf0, \n\t0x01, 0x2b, 0xff, 0xef, 0x01, 0x2d, 0xff, 0xef, 0x01, 0x2f, 0xff, 0xef, \n\t0x01, 0x31, 0xff, 0xef, 0x01, 0x33, 0xff, 0xef, 0x01, 0x35, 0xff, 0xef, \n\t0x01, 0x39, 0xff, 0xdc, 0x01, 0x44, 0xff, 0xf0, 0x01, 0x46, 0xff, 0xef, \n\t0x01, 0x51, 0xff, 0xda, 0x01, 0x86, 0xff, 0xf0, 0x01, 0x8a, 0xff, 0xef, \n\t0x01, 0x8b, 0xff, 0xf0, 0x01, 0x8d, 0xff, 0xdc, 0x01, 0x92, 0xff, 0xec, \n\t0x01, 0x95, 0x00, 0x0f, 0x01, 0x97, 0xff, 0xdc, 0x01, 0x9a, 0xff, 0xea, \n\t0x01, 0x9c, 0xff, 0xf0, 0x01, 0x9d, 0xff, 0xf0, 0x01, 0x9e, 0xff, 0xdc, \n\t0x01, 0x9f, 0xff, 0xef, 0x01, 0xa0, 0xff, 0xe7, 0x01, 0xa5, 0xff, 0xef, \n\t0x01, 0xa7, 0xff, 0xef, 0x01, 0xe1, 0xff, 0xf0, 0x01, 0xed, 0xff, 0xf0, \n\t0x01, 0xef, 0xff, 0xdc, 0x01, 0xf0, 0xff, 0xf0, 0x01, 0xfc, 0xff, 0xf0, \n\t0x01, 0xfd, 0xff, 0xf0, 0x02, 0x00, 0xff, 0xf0, 0x02, 0x0a, 0xff, 0xdc, \n\t0x02, 0x21, 0xff, 0xdc, 0x02, 0x23, 0xff, 0xdc, 0x02, 0x25, 0xff, 0xf0, \n\t0x02, 0x29, 0xff, 0xf0, 0x02, 0x2d, 0xff, 0xf0, 0x02, 0x54, 0xff, 0xf0, \n\t0x02, 0x56, 0xff, 0xf0, 0x02, 0x5a, 0xff, 0xdc, 0x02, 0x82, 0xff, 0xf0, \n\t0x02, 0x84, 0xff, 0xf0, 0x02, 0x86, 0xff, 0xf0, 0x02, 0x94, 0xff, 0xf0, \n\t0x02, 0x9a, 0xff, 0xdc, 0x02, 0x9c, 0xff, 0xdc, 0x02, 0x9e, 0xff, 0xdc, \n\t0x02, 0xac, 0xff, 0xf0, 0x02, 0xad, 0xff, 0xf0, 0x02, 0xae, 0xff, 0xf0, \n\t0x02, 0xb8, 0xff, 0xf0, 0x02, 0xe2, 0xff, 0xf0, 0x02, 0xe4, 0xff, 0xf0, \n\t0x02, 0xe6, 0xff, 0xf0, 0x02, 0xe8, 0xff, 0xf0, 0x02, 0xea, 0xff, 0xf0, \n\t0x02, 0xec, 0xff, 0xf0, 0x02, 0xee, 0xff, 0xf0, 0x02, 0xf0, 0xff, 0xf0, \n\t0x03, 0x04, 0xff, 0xf0, 0x03, 0x06, 0xff, 0xf0, 0x03, 0x08, 0xff, 0xf0, \n\t0x03, 0x0c, 0xff, 0xf0, 0x03, 0x0e, 0xff, 0xef, 0x03, 0x10, 0xff, 0xef, \n\t0x03, 0x12, 0xff, 0xef, 0x03, 0x14, 0xff, 0xef, 0x03, 0x16, 0xff, 0xef, \n\t0x03, 0x18, 0xff, 0xef, 0x03, 0x1a, 0xff, 0xef, 0x03, 0x1c, 0xff, 0xdc, \n\t0x03, 0x1e, 0xff, 0xdc, 0x03, 0x20, 0xff, 0xdc, 0x03, 0x22, 0xff, 0xdc, \n\t0x03, 0x34, 0xff, 0xda, 0x03, 0x35, 0xff, 0xda, 0x03, 0x37, 0xff, 0xda, \n\t0x03, 0x38, 0xff, 0xda, 0x03, 0x39, 0xff, 0xda, 0x03, 0x41, 0xff, 0xda, \n\t0x03, 0x42, 0xff, 0xda, 0x00, 0x3a, 0x00, 0x05, 0xff, 0xa0, 0x00, 0x0a, \n\t0xff, 0xa0, 0x00, 0x49, 0xff, 0xe9, 0x00, 0x58, 0xff, 0xf1, 0x00, 0x59, \n\t0xff, 0xc5, 0x00, 0x5c, 0xff, 0xc5, 0x00, 0xbb, 0xff, 0xf1, 0x00, 0xbc, \n\t0xff, 0xf1, 0x00, 0xbd, 0xff, 0xf1, 0x00, 0xbe, 0xff, 0xf1, 0x00, 0xbf, \n\t0xff, 0xc5, 0x00, 0xc1, 0xff, 0xc5, 0x01, 0x2b, 0xff, 0xf1, 0x01, 0x2d, \n\t0xff, 0xf1, 0x01, 0x2f, 0xff, 0xf1, 0x01, 0x31, 0xff, 0xf1, 0x01, 0x33, \n\t0xff, 0xf1, 0x01, 0x35, 0xff, 0xf1, 0x01, 0x39, 0xff, 0xc5, 0x01, 0x46, \n\t0xff, 0xf1, 0x01, 0x51, 0xff, 0xa0, 0x01, 0x8a, 0xff, 0xf1, 0x01, 0x8d, \n\t0xff, 0xc5, 0x01, 0x92, 0xff, 0xee, 0x01, 0x95, 0x00, 0x10, 0x01, 0x97, \n\t0xff, 0xc5, 0x01, 0x9a, 0xff, 0xec, 0x01, 0x9e, 0xff, 0xbe, 0x01, 0x9f, \n\t0xff, 0xf1, 0x01, 0xa1, 0xff, 0xda, 0x01, 0xa5, 0xff, 0xf1, 0x01, 0xa7, \n\t0xff, 0xf1, 0x01, 0xef, 0xff, 0xc5, 0x02, 0x0a, 0xff, 0xc5, 0x02, 0x21, \n\t0xff, 0xc5, 0x02, 0x23, 0xff, 0xc5, 0x02, 0x5a, 0xff, 0xc5, 0x02, 0x9a, \n\t0xff, 0xc5, 0x02, 0x9c, 0xff, 0xc5, 0x02, 0x9e, 0xff, 0xc5, 0x03, 0x0e, \n\t0xff, 0xf1, 0x03, 0x10, 0xff, 0xf1, 0x03, 0x12, 0xff, 0xf1, 0x03, 0x14, \n\t0xff, 0xf1, 0x03, 0x16, 0xff, 0xf1, 0x03, 0x18, 0xff, 0xf1, 0x03, 0x1a, \n\t0xff, 0xf1, 0x03, 0x1c, 0xff, 0xc5, 0x03, 0x1e, 0xff, 0xc5, 0x03, 0x20, \n\t0xff, 0xc5, 0x03, 0x22, 0xff, 0xc5, 0x03, 0x34, 0xff, 0xa0, 0x03, 0x35, \n\t0xff, 0xa0, 0x03, 0x37, 0xff, 0xa0, 0x03, 0x38, 0xff, 0xa0, 0x03, 0x39, \n\t0xff, 0xa0, 0x03, 0x41, 0xff, 0xa0, 0x03, 0x42, 0xff, 0xa0, 0x00, 0x3e, \n\t0x00, 0x46, 0xff, 0xe7, 0x00, 0x47, 0xff, 0xe7, 0x00, 0x48, 0xff, 0xe7, \n\t0x00, 0x4a, 0xff, 0xe7, 0x00, 0x54, 0xff, 0xe7, 0x00, 0xa9, 0xff, 0xe7, \n\t0x00, 0xaa, 0xff, 0xe7, 0x00, 0xab, 0xff, 0xe7, 0x00, 0xac, 0xff, 0xe7, \n\t0x00, 0xad, 0xff, 0xe7, 0x00, 0xc9, 0xff, 0xe7, 0x00, 0xcb, 0xff, 0xe7, \n\t0x00, 0xcd, 0xff, 0xe7, 0x00, 0xcf, 0xff, 0xe7, 0x00, 0xd1, 0xff, 0xe7, \n\t0x00, 0xd5, 0xff, 0xe7, 0x00, 0xd7, 0xff, 0xe7, 0x00, 0xd9, 0xff, 0xe7, \n\t0x00, 0xdb, 0xff, 0xe7, 0x00, 0xdd, 0xff, 0xe7, 0x00, 0xdf, 0xff, 0xe7, \n\t0x00, 0xe1, 0xff, 0xe7, 0x00, 0xe3, 0xff, 0xe7, 0x00, 0xe5, 0xff, 0xe7, \n\t0x01, 0x15, 0xff, 0xe7, 0x01, 0x44, 0xff, 0xe7, 0x01, 0x86, 0xff, 0xe7, \n\t0x01, 0x8b, 0xff, 0xe7, 0x01, 0x95, 0x00, 0x0f, 0x01, 0x9c, 0xff, 0xe7, \n\t0x01, 0x9d, 0xff, 0xe7, 0x01, 0xe1, 0xff, 0xe7, 0x01, 0xed, 0xff, 0xe7, \n\t0x01, 0xf0, 0xff, 0xe7, 0x01, 0xfc, 0xff, 0xe7, 0x01, 0xfd, 0xff, 0xe7, \n\t0x02, 0x00, 0xff, 0xe7, 0x02, 0x25, 0xff, 0xe7, 0x02, 0x29, 0xff, 0xe7, \n\t0x02, 0x2d, 0xff, 0xe7, 0x02, 0x54, 0xff, 0xe7, 0x02, 0x56, 0xff, 0xe7, \n\t0x02, 0x82, 0xff, 0xe7, 0x02, 0x84, 0xff, 0xe7, 0x02, 0x86, 0xff, 0xe7, \n\t0x02, 0x94, 0xff, 0xe7, 0x02, 0xac, 0xff, 0xe7, 0x02, 0xad, 0xff, 0xe7, \n\t0x02, 0xae, 0xff, 0xe7, 0x02, 0xb8, 0xff, 0xe7, 0x02, 0xe2, 0xff, 0xe7, \n\t0x02, 0xe4, 0xff, 0xe7, 0x02, 0xe6, 0xff, 0xe7, 0x02, 0xe8, 0xff, 0xe7, \n\t0x02, 0xea, 0xff, 0xe7, 0x02, 0xec, 0xff, 0xe7, 0x02, 0xee, 0xff, 0xe7, \n\t0x02, 0xf0, 0xff, 0xe7, 0x03, 0x04, 0xff, 0xe7, 0x03, 0x06, 0xff, 0xe7, \n\t0x03, 0x08, 0xff, 0xe7, 0x03, 0x0c, 0xff, 0xe7, 0x00, 0x01, 0x01, 0x9e, \n\t0x00, 0x0b, 0x00, 0x7a, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x0a, 0x00, 0x0c, \n\t0x00, 0x46, 0xff, 0xe8, 0x00, 0x47, 0xff, 0xe8, 0x00, 0x48, 0xff, 0xe8, \n\t0x00, 0x49, 0x00, 0x0c, 0x00, 0x4a, 0xff, 0xe8, 0x00, 0x52, 0xff, 0xea, \n\t0x00, 0x54, 0xff, 0xe8, 0x00, 0x59, 0x00, 0x0b, 0x00, 0x5c, 0x00, 0x0b, \n\t0x00, 0xa9, 0xff, 0xe8, 0x00, 0xaa, 0xff, 0xe8, 0x00, 0xab, 0xff, 0xe8, \n\t0x00, 0xac, 0xff, 0xe8, 0x00, 0xad, 0xff, 0xe8, 0x00, 0xb4, 0xff, 0xea, \n\t0x00, 0xb5, 0xff, 0xea, 0x00, 0xb6, 0xff, 0xea, 0x00, 0xb7, 0xff, 0xea, \n\t0x00, 0xb8, 0xff, 0xea, 0x00, 0xbf, 0x00, 0x0b, 0x00, 0xc1, 0x00, 0x0b, \n\t0x00, 0xc9, 0xff, 0xe8, 0x00, 0xcb, 0xff, 0xe8, 0x00, 0xcd, 0xff, 0xe8, \n\t0x00, 0xcf, 0xff, 0xe8, 0x00, 0xd1, 0xff, 0xe8, 0x00, 0xd5, 0xff, 0xe8, \n\t0x00, 0xd7, 0xff, 0xe8, 0x00, 0xd9, 0xff, 0xe8, 0x00, 0xdb, 0xff, 0xe8, \n\t0x00, 0xdd, 0xff, 0xe8, 0x00, 0xdf, 0xff, 0xe8, 0x00, 0xe1, 0xff, 0xe8, \n\t0x00, 0xe3, 0xff, 0xe8, 0x00, 0xe5, 0xff, 0xe8, 0x01, 0x0f, 0xff, 0xea, \n\t0x01, 0x11, 0xff, 0xea, 0x01, 0x13, 0xff, 0xea, 0x01, 0x15, 0xff, 0xe8, \n\t0x01, 0x39, 0x00, 0x0b, 0x01, 0x44, 0xff, 0xe8, 0x01, 0x51, 0x00, 0x0c, \n\t0x01, 0x86, 0xff, 0xe8, 0x01, 0x8b, 0xff, 0xe8, 0x01, 0x8d, 0x00, 0x0b, \n\t0x01, 0x8e, 0xff, 0xed, 0x01, 0x97, 0x00, 0x0b, 0x01, 0x99, 0xff, 0xea, \n\t0x01, 0x9a, 0x00, 0x0b, 0x01, 0x9c, 0xff, 0xe8, 0x01, 0x9d, 0xff, 0xe8, \n\t0x01, 0x9e, 0x00, 0x0c, 0x01, 0xa6, 0xff, 0xea, 0x01, 0xe1, 0xff, 0xe8, \n\t0x01, 0xea, 0xff, 0xea, 0x01, 0xed, 0xff, 0xe8, 0x01, 0xef, 0x00, 0x0b, \n\t0x01, 0xf0, 0xff, 0xe8, 0x01, 0xfc, 0xff, 0xe8, 0x01, 0xfd, 0xff, 0xe8, \n\t0x02, 0x00, 0xff, 0xe8, 0x02, 0x0a, 0x00, 0x0b, 0x02, 0x1f, 0xff, 0xea, \n\t0x02, 0x21, 0x00, 0x0b, 0x02, 0x23, 0x00, 0x0b, 0x02, 0x25, 0xff, 0xe8, \n\t0x02, 0x29, 0xff, 0xe8, 0x02, 0x2d, 0xff, 0xe8, 0x02, 0x54, 0xff, 0xe8, \n\t0x02, 0x56, 0xff, 0xe8, 0x02, 0x5a, 0x00, 0x0b, 0x02, 0x82, 0xff, 0xe8, \n\t0x02, 0x84, 0xff, 0xe8, 0x02, 0x86, 0xff, 0xe8, 0x02, 0x92, 0xff, 0xea, \n\t0x02, 0x94, 0xff, 0xe8, 0x02, 0x96, 0xff, 0xea, 0x02, 0x9a, 0x00, 0x0b, \n\t0x02, 0x9c, 0x00, 0x0b, 0x02, 0x9e, 0x00, 0x0b, 0x02, 0xac, 0xff, 0xe8, \n\t0x02, 0xad, 0xff, 0xe8, 0x02, 0xae, 0xff, 0xe8, 0x02, 0xb8, 0xff, 0xe8, \n\t0x02, 0xe2, 0xff, 0xe8, 0x02, 0xe4, 0xff, 0xe8, 0x02, 0xe6, 0xff, 0xe8, \n\t0x02, 0xe8, 0xff, 0xe8, 0x02, 0xea, 0xff, 0xe8, 0x02, 0xec, 0xff, 0xe8, \n\t0x02, 0xee, 0xff, 0xe8, 0x02, 0xf0, 0xff, 0xe8, 0x02, 0xf6, 0xff, 0xea, \n\t0x02, 0xf8, 0xff, 0xea, 0x02, 0xfa, 0xff, 0xea, 0x02, 0xfc, 0xff, 0xea, \n\t0x02, 0xfe, 0xff, 0xea, 0x03, 0x00, 0xff, 0xea, 0x03, 0x02, 0xff, 0xea, \n\t0x03, 0x04, 0xff, 0xe8, 0x03, 0x06, 0xff, 0xe8, 0x03, 0x08, 0xff, 0xe8, \n\t0x03, 0x0a, 0xff, 0xea, 0x03, 0x0c, 0xff, 0xe8, 0x03, 0x1c, 0x00, 0x0b, \n\t0x03, 0x1e, 0x00, 0x0b, 0x03, 0x20, 0x00, 0x0b, 0x03, 0x22, 0x00, 0x0b, \n\t0x03, 0x34, 0x00, 0x0c, 0x03, 0x35, 0x00, 0x0c, 0x03, 0x37, 0x00, 0x0c, \n\t0x03, 0x38, 0x00, 0x0c, 0x03, 0x39, 0x00, 0x0c, 0x03, 0x41, 0x00, 0x0c, \n\t0x03, 0x42, 0x00, 0x0c, 0x03, 0x76, 0x00, 0x0d, 0x03, 0x79, 0x00, 0x0d, \n\t0x03, 0x7b, 0x00, 0x0e, 0x03, 0x7c, 0xff, 0xf5, 0x03, 0x7e, 0xff, 0xec, \n\t0x00, 0x0d, 0x00, 0x5b, 0xff, 0xed, 0x00, 0x5d, 0xff, 0xed, 0x01, 0x3c, \n\t0xff, 0xed, 0x01, 0x3e, 0xff, 0xed, 0x01, 0x40, 0xff, 0xed, 0x01, 0xa1, \n\t0xff, 0xe1, 0x01, 0xe2, 0xff, 0xed, 0x01, 0xf1, 0xff, 0xed, 0x02, 0x42, \n\t0xff, 0xed, 0x02, 0x5e, 0xff, 0xed, 0x02, 0x6d, 0xff, 0xed, 0x02, 0x88, \n\t0xff, 0xed, 0x02, 0xa8, 0xff, 0xed, 0x00, 0x64, 0x00, 0x05, 0x00, 0x0b, \n\t0x00, 0x0a, 0x00, 0x0b, 0x00, 0x46, 0xff, 0xeb, 0x00, 0x47, 0xff, 0xeb, \n\t0x00, 0x48, 0xff, 0xeb, 0x00, 0x49, 0x00, 0x0b, 0x00, 0x4a, 0xff, 0xeb, \n\t0x00, 0x52, 0xff, 0xe9, 0x00, 0x54, 0xff, 0xeb, 0x00, 0xa9, 0xff, 0xeb, \n\t0x00, 0xaa, 0xff, 0xeb, 0x00, 0xab, 0xff, 0xeb, 0x00, 0xac, 0xff, 0xeb, \n\t0x00, 0xad, 0xff, 0xeb, 0x00, 0xb4, 0xff, 0xe9, 0x00, 0xb5, 0xff, 0xe9, \n\t0x00, 0xb6, 0xff, 0xe9, 0x00, 0xb7, 0xff, 0xe9, 0x00, 0xb8, 0xff, 0xe9, \n\t0x00, 0xc9, 0xff, 0xeb, 0x00, 0xcb, 0xff, 0xeb, 0x00, 0xcd, 0xff, 0xeb, \n\t0x00, 0xcf, 0xff, 0xeb, 0x00, 0xd1, 0xff, 0xeb, 0x00, 0xd5, 0xff, 0xeb, \n\t0x00, 0xd7, 0xff, 0xeb, 0x00, 0xd9, 0xff, 0xeb, 0x00, 0xdb, 0xff, 0xeb, \n\t0x00, 0xdd, 0xff, 0xeb, 0x00, 0xdf, 0xff, 0xeb, 0x00, 0xe1, 0xff, 0xeb, \n\t0x00, 0xe3, 0xff, 0xeb, 0x00, 0xe5, 0xff, 0xeb, 0x01, 0x0f, 0xff, 0xe9, \n\t0x01, 0x11, 0xff, 0xe9, 0x01, 0x13, 0xff, 0xe9, 0x01, 0x15, 0xff, 0xeb, \n\t0x01, 0x44, 0xff, 0xeb, 0x01, 0x51, 0x00, 0x0b, 0x01, 0x86, 0xff, 0xeb, \n\t0x01, 0x8b, 0xff, 0xeb, 0x01, 0x8e, 0xff, 0xee, 0x01, 0x8f, 0xff, 0xf2, \n\t0x01, 0x99, 0xff, 0xe9, 0x01, 0x9c, 0xff, 0xeb, 0x01, 0x9d, 0xff, 0xeb, \n\t0x01, 0xa0, 0xff, 0xf1, 0x01, 0xa1, 0x00, 0x0f, 0x01, 0xa3, 0xff, 0xef, \n\t0x01, 0xa6, 0xff, 0xe9, 0x01, 0xe1, 0xff, 0xeb, 0x01, 0xea, 0xff, 0xe9, \n\t0x01, 0xed, 0xff, 0xeb, 0x01, 0xf0, 0xff, 0xeb, 0x01, 0xfc, 0xff, 0xeb, \n\t0x01, 0xfd, 0xff, 0xeb, 0x02, 0x00, 0xff, 0xeb, 0x02, 0x1f, 0xff, 0xe9, \n\t0x02, 0x25, 0xff, 0xeb, 0x02, 0x29, 0xff, 0xeb, 0x02, 0x2d, 0xff, 0xeb, \n\t0x02, 0x54, 0xff, 0xeb, 0x02, 0x56, 0xff, 0xeb, 0x02, 0x82, 0xff, 0xeb, \n\t0x02, 0x84, 0xff, 0xeb, 0x02, 0x86, 0xff, 0xeb, 0x02, 0x92, 0xff, 0xe9, \n\t0x02, 0x94, 0xff, 0xeb, 0x02, 0x96, 0xff, 0xe9, 0x02, 0xac, 0xff, 0xeb, \n\t0x02, 0xad, 0xff, 0xeb, 0x02, 0xae, 0xff, 0xeb, 0x02, 0xb8, 0xff, 0xeb, \n\t0x02, 0xe2, 0xff, 0xeb, 0x02, 0xe4, 0xff, 0xeb, 0x02, 0xe6, 0xff, 0xeb, \n\t0x02, 0xe8, 0xff, 0xeb, 0x02, 0xea, 0xff, 0xeb, 0x02, 0xec, 0xff, 0xeb, \n\t0x02, 0xee, 0xff, 0xeb, 0x02, 0xf0, 0xff, 0xeb, 0x02, 0xf6, 0xff, 0xe9, \n\t0x02, 0xf8, 0xff, 0xe9, 0x02, 0xfa, 0xff, 0xe9, 0x02, 0xfc, 0xff, 0xe9, \n\t0x02, 0xfe, 0xff, 0xe9, 0x03, 0x00, 0xff, 0xe9, 0x03, 0x02, 0xff, 0xe9, \n\t0x03, 0x04, 0xff, 0xeb, 0x03, 0x06, 0xff, 0xeb, 0x03, 0x08, 0xff, 0xeb, \n\t0x03, 0x0a, 0xff, 0xe9, 0x03, 0x0c, 0xff, 0xeb, 0x03, 0x34, 0x00, 0x0b, \n\t0x03, 0x35, 0x00, 0x0b, 0x03, 0x37, 0x00, 0x0b, 0x03, 0x38, 0x00, 0x0b, \n\t0x03, 0x39, 0x00, 0x0b, 0x03, 0x41, 0x00, 0x0b, 0x03, 0x42, 0x00, 0x0b, \n\t0x00, 0x0c, 0x00, 0x5b, 0xff, 0xf2, 0x00, 0x5d, 0xff, 0xf2, 0x01, 0x3c, \n\t0xff, 0xf2, 0x01, 0x3e, 0xff, 0xf2, 0x01, 0x40, 0xff, 0xf2, 0x01, 0xe2, \n\t0xff, 0xf2, 0x01, 0xf1, 0xff, 0xf2, 0x02, 0x42, 0xff, 0xf2, 0x02, 0x5e, \n\t0xff, 0xf2, 0x02, 0x6d, 0xff, 0xf2, 0x02, 0x88, 0xff, 0xf2, 0x02, 0xa8, \n\t0xff, 0xf2, 0x00, 0x1f, 0x00, 0x59, 0xff, 0xf4, 0x00, 0x5b, 0xff, 0xf2, \n\t0x00, 0x5c, 0xff, 0xf4, 0x00, 0x5d, 0xff, 0xf3, 0x00, 0xbf, 0xff, 0xf4, \n\t0x00, 0xc1, 0xff, 0xf4, 0x01, 0x39, 0xff, 0xf4, 0x01, 0x3c, 0xff, 0xf3, \n\t0x01, 0x3e, 0xff, 0xf3, 0x01, 0x40, 0xff, 0xf3, 0x01, 0x8d, 0xff, 0xf4, \n\t0x01, 0x97, 0xff, 0xf4, 0x01, 0xe2, 0xff, 0xf2, 0x01, 0xef, 0xff, 0xf4, \n\t0x01, 0xf1, 0xff, 0xf2, 0x02, 0x0a, 0xff, 0xf4, 0x02, 0x21, 0xff, 0xf4, \n\t0x02, 0x23, 0xff, 0xf4, 0x02, 0x42, 0xff, 0xf2, 0x02, 0x5a, 0xff, 0xf4, \n\t0x02, 0x5e, 0xff, 0xf2, 0x02, 0x6d, 0xff, 0xf2, 0x02, 0x88, 0xff, 0xf2, \n\t0x02, 0x9a, 0xff, 0xf4, 0x02, 0x9c, 0xff, 0xf4, 0x02, 0x9e, 0xff, 0xf4, \n\t0x02, 0xa8, 0xff, 0xf2, 0x03, 0x1c, 0xff, 0xf4, 0x03, 0x1e, 0xff, 0xf4, \n\t0x03, 0x20, 0xff, 0xf4, 0x03, 0x22, 0xff, 0xf4, 0x00, 0x5b, 0x00, 0x05, \n\t0xff, 0xca, 0x00, 0x0a, 0xff, 0xca, 0x00, 0x37, 0xff, 0xd2, 0x00, 0x39, \n\t0xff, 0xd4, 0x00, 0x3b, 0xff, 0xf4, 0x00, 0x3c, 0xff, 0xd3, 0x00, 0x59, \n\t0xff, 0xe6, 0x00, 0x5b, 0xff, 0xef, 0x00, 0x5c, 0xff, 0xe6, 0x00, 0x9f, \n\t0xff, 0xd3, 0x00, 0xbf, 0xff, 0xe6, 0x00, 0xc1, 0xff, 0xe6, 0x01, 0x24, \n\t0xff, 0xd2, 0x01, 0x26, 0xff, 0xd2, 0x01, 0x38, 0xff, 0xd3, 0x01, 0x39, \n\t0xff, 0xe6, 0x01, 0x3a, 0xff, 0xd3, 0x01, 0x51, 0xff, 0xca, 0x01, 0x69, \n\t0xff, 0xd3, 0x01, 0x7f, 0xff, 0xd3, 0x01, 0x81, 0xff, 0xf4, 0x01, 0x85, \n\t0xff, 0xd3, 0x01, 0x8d, 0xff, 0xe6, 0x01, 0x97, 0xff, 0xe6, 0x01, 0xae, \n\t0xff, 0xd2, 0x01, 0xb7, 0xff, 0xd2, 0x01, 0xba, 0xff, 0xed, 0x01, 0xc2, \n\t0xff, 0xf4, 0x01, 0xce, 0xff, 0xd2, 0x01, 0xcf, 0xff, 0xed, 0x01, 0xd1, \n\t0xff, 0xf4, 0x01, 0xd3, 0xff, 0xe1, 0x01, 0xd8, 0xff, 0xd4, 0x01, 0xe2, \n\t0xff, 0xef, 0x01, 0xee, 0xff, 0xc9, 0x01, 0xef, 0xff, 0xe6, 0x01, 0xf1, \n\t0xff, 0xef, 0x02, 0x0a, 0xff, 0xe6, 0x02, 0x0d, 0xff, 0xe5, 0x02, 0x20, \n\t0xff, 0xd4, 0x02, 0x21, 0xff, 0xe6, 0x02, 0x22, 0xff, 0xd4, 0x02, 0x23, \n\t0xff, 0xe6, 0x02, 0x2b, 0xff, 0xe3, 0x02, 0x41, 0xff, 0xf4, 0x02, 0x42, \n\t0xff, 0xef, 0x02, 0x4b, 0xff, 0xd2, 0x02, 0x4c, 0xff, 0xc4, 0x02, 0x57, \n\t0xff, 0xd2, 0x02, 0x59, 0xff, 0xd3, 0x02, 0x5a, 0xff, 0xe6, 0x02, 0x5b, \n\t0xff, 0xd3, 0x02, 0x5d, 0xff, 0xf4, 0x02, 0x5e, 0xff, 0xef, 0x02, 0x5f, \n\t0xff, 0xd2, 0x02, 0x61, 0xff, 0xe1, 0x02, 0x63, 0xff, 0xe1, 0x02, 0x6c, \n\t0xff, 0xf4, 0x02, 0x6d, 0xff, 0xef, 0x02, 0x76, 0xff, 0xe1, 0x02, 0x87, \n\t0xff, 0xf4, 0x02, 0x88, 0xff, 0xef, 0x02, 0x99, 0xff, 0xed, 0x02, 0x9a, \n\t0xff, 0xe6, 0x02, 0x9b, 0xff, 0xed, 0x02, 0x9c, 0xff, 0xe6, 0x02, 0x9d, \n\t0xff, 0xed, 0x02, 0x9e, 0xff, 0xe6, 0x02, 0x9f, 0xff, 0xe1, 0x02, 0xa7, \n\t0xff, 0xf4, 0x02, 0xa8, 0xff, 0xef, 0x02, 0xaf, 0xff, 0xd4, 0x02, 0xb0, \n\t0xff, 0xf5, 0x02, 0xb1, 0xff, 0xe7, 0x02, 0xb9, 0xff, 0x67, 0x02, 0xba, \n\t0xff, 0xc9, 0x03, 0x1b, 0xff, 0xd3, 0x03, 0x1c, 0xff, 0xe6, 0x03, 0x1d, \n\t0xff, 0xd3, 0x03, 0x1e, 0xff, 0xe6, 0x03, 0x1f, 0xff, 0xd3, 0x03, 0x20, \n\t0xff, 0xe6, 0x03, 0x21, 0xff, 0xd3, 0x03, 0x22, 0xff, 0xe6, 0x03, 0x34, \n\t0xff, 0xca, 0x03, 0x35, 0xff, 0xca, 0x03, 0x37, 0xff, 0xca, 0x03, 0x38, \n\t0xff, 0xca, 0x03, 0x39, 0xff, 0xca, 0x03, 0x41, 0xff, 0xca, 0x03, 0x42, \n\t0xff, 0xca, 0x00, 0x24, 0x00, 0x37, 0xff, 0xbe, 0x00, 0x59, 0xff, 0xef, \n\t0x00, 0x5c, 0xff, 0xef, 0x00, 0xbf, 0xff, 0xef, 0x00, 0xc1, 0xff, 0xef, \n\t0x01, 0x24, 0xff, 0xbe, 0x01, 0x26, 0xff, 0xbe, 0x01, 0x39, 0xff, 0xef, \n\t0x01, 0x8d, 0xff, 0xef, 0x01, 0x97, 0xff, 0xef, 0x01, 0xae, 0xff, 0xbe, \n\t0x01, 0xb7, 0xff, 0xbe, 0x01, 0xce, 0xff, 0xbe, 0x01, 0xd8, 0xff, 0xc9, \n\t0x01, 0xee, 0xff, 0xdf, 0x01, 0xef, 0xff, 0xef, 0x02, 0x0a, 0xff, 0xef, \n\t0x02, 0x0d, 0xff, 0xed, 0x02, 0x21, 0xff, 0xef, 0x02, 0x23, 0xff, 0xef, \n\t0x02, 0x2b, 0xff, 0xeb, 0x02, 0x4b, 0xff, 0xbe, 0x02, 0x4c, 0xff, 0xdf, \n\t0x02, 0x57, 0xff, 0xbe, 0x02, 0x5a, 0xff, 0xef, 0x02, 0x5f, 0xff, 0xbe, \n\t0x02, 0x67, 0xff, 0xe9, 0x02, 0x9a, 0xff, 0xef, 0x02, 0x9c, 0xff, 0xef, \n\t0x02, 0x9e, 0xff, 0xef, 0x02, 0xb0, 0xff, 0xf5, 0x02, 0xba, 0xff, 0xe0, \n\t0x03, 0x1c, 0xff, 0xef, 0x03, 0x1e, 0xff, 0xef, 0x03, 0x20, 0xff, 0xef, \n\t0x03, 0x22, 0xff, 0xef, 0x00, 0x3b, 0x00, 0x37, 0xff, 0xe6, 0x00, 0x39, \n\t0xff, 0xe7, 0x00, 0x3b, 0xff, 0xf2, 0x00, 0x3c, 0xff, 0xe7, 0x00, 0x5b, \n\t0xff, 0xf1, 0x00, 0x9f, 0xff, 0xe7, 0x01, 0x24, 0xff, 0xe6, 0x01, 0x26, \n\t0xff, 0xe6, 0x01, 0x38, 0xff, 0xe7, 0x01, 0x3a, 0xff, 0xe7, 0x01, 0x69, \n\t0xff, 0xe7, 0x01, 0x7f, 0xff, 0xe7, 0x01, 0x81, 0xff, 0xf2, 0x01, 0x85, \n\t0xff, 0xe7, 0x01, 0xae, 0xff, 0xe6, 0x01, 0xb7, 0xff, 0xe6, 0x01, 0xba, \n\t0xff, 0xee, 0x01, 0xc2, 0xff, 0xf2, 0x01, 0xce, 0xff, 0xe6, 0x01, 0xcf, \n\t0xff, 0xee, 0x01, 0xd1, 0xff, 0xf2, 0x01, 0xd3, 0xff, 0xe8, 0x01, 0xd8, \n\t0xff, 0xe6, 0x01, 0xe2, 0xff, 0xf1, 0x01, 0xee, 0xff, 0xd0, 0x01, 0xf1, \n\t0xff, 0xf1, 0x02, 0x20, 0xff, 0xe7, 0x02, 0x22, 0xff, 0xe7, 0x02, 0x41, \n\t0xff, 0xf2, 0x02, 0x42, 0xff, 0xf1, 0x02, 0x4b, 0xff, 0xe6, 0x02, 0x4c, \n\t0xff, 0xce, 0x02, 0x57, 0xff, 0xe6, 0x02, 0x59, 0xff, 0xe7, 0x02, 0x5b, \n\t0xff, 0xe7, 0x02, 0x5d, 0xff, 0xf2, 0x02, 0x5e, 0xff, 0xf1, 0x02, 0x5f, \n\t0xff, 0xe6, 0x02, 0x61, 0xff, 0xe8, 0x02, 0x63, 0xff, 0xe8, 0x02, 0x6c, \n\t0xff, 0xf2, 0x02, 0x6d, 0xff, 0xf1, 0x02, 0x76, 0xff, 0xe8, 0x02, 0x87, \n\t0xff, 0xf2, 0x02, 0x88, 0xff, 0xf1, 0x02, 0x99, 0xff, 0xee, 0x02, 0x9b, \n\t0xff, 0xee, 0x02, 0x9d, 0xff, 0xee, 0x02, 0x9f, 0xff, 0xe8, 0x02, 0xa7, \n\t0xff, 0xf2, 0x02, 0xa8, 0xff, 0xf1, 0x02, 0xaf, 0xff, 0xe7, 0x02, 0xb1, \n\t0xff, 0xed, 0x02, 0xb9, 0xff, 0xe6, 0x02, 0xba, 0xff, 0xd0, 0x03, 0x1b, \n\t0xff, 0xe7, 0x03, 0x1d, 0xff, 0xe7, 0x03, 0x1f, 0xff, 0xe7, 0x03, 0x21, \n\t0xff, 0xe7, 0x00, 0x02, 0x02, 0x16, 0x00, 0x0b, 0x02, 0xb9, 0xff, 0xe6, \n\t0x00, 0x8e, 0x00, 0x24, 0x00, 0x10, 0x00, 0x26, 0xff, 0xe8, 0x00, 0x2a, \n\t0xff, 0xe8, 0x00, 0x32, 0xff, 0xe8, 0x00, 0x34, 0xff, 0xe8, 0x00, 0x37, \n\t0xff, 0xe0, 0x00, 0x39, 0xff, 0xe0, 0x00, 0x3c, 0xff, 0xdf, 0x00, 0x82, \n\t0x00, 0x10, 0x00, 0x83, 0x00, 0x10, 0x00, 0x84, 0x00, 0x10, 0x00, 0x85, \n\t0x00, 0x10, 0x00, 0x86, 0x00, 0x10, 0x00, 0x87, 0x00, 0x10, 0x00, 0x89, \n\t0xff, 0xe8, 0x00, 0x94, 0xff, 0xe8, 0x00, 0x95, 0xff, 0xe8, 0x00, 0x96, \n\t0xff, 0xe8, 0x00, 0x97, 0xff, 0xe8, 0x00, 0x98, 0xff, 0xe8, 0x00, 0x9a, \n\t0xff, 0xe8, 0x00, 0x9f, 0xff, 0xdf, 0x00, 0xc2, 0x00, 0x10, 0x00, 0xc4, \n\t0x00, 0x10, 0x00, 0xc6, 0x00, 0x10, 0x00, 0xc8, 0xff, 0xe8, 0x00, 0xca, \n\t0xff, 0xe8, 0x00, 0xcc, 0xff, 0xe8, 0x00, 0xce, 0xff, 0xe8, 0x00, 0xde, \n\t0xff, 0xe8, 0x00, 0xe0, 0xff, 0xe8, 0x00, 0xe2, 0xff, 0xe8, 0x00, 0xe4, \n\t0xff, 0xe8, 0x01, 0x0e, 0xff, 0xe8, 0x01, 0x10, 0xff, 0xe8, 0x01, 0x12, \n\t0xff, 0xe8, 0x01, 0x14, 0xff, 0xe8, 0x01, 0x24, 0xff, 0xe0, 0x01, 0x26, \n\t0xff, 0xe0, 0x01, 0x38, 0xff, 0xdf, 0x01, 0x3a, 0xff, 0xdf, 0x01, 0x43, \n\t0xff, 0xe8, 0x01, 0x48, 0x00, 0x10, 0x01, 0x4c, 0xff, 0xe8, 0x01, 0x63, \n\t0x00, 0x10, 0x01, 0x68, 0xff, 0xe8, 0x01, 0x69, 0xff, 0xdf, 0x01, 0x6c, \n\t0x00, 0x10, 0x01, 0x6f, 0x00, 0x10, 0x01, 0x73, 0xff, 0xe8, 0x01, 0x76, \n\t0x00, 0x10, 0x01, 0x7a, 0xff, 0xe8, 0x01, 0x7f, 0xff, 0xdf, 0x01, 0x85, \n\t0xff, 0xdf, 0x01, 0xae, 0xff, 0xe0, 0x01, 0xb0, 0xff, 0xe8, 0x01, 0xb5, \n\t0x00, 0x10, 0x01, 0xb7, 0xff, 0xe0, 0x01, 0xbc, 0x00, 0x10, 0x01, 0xc0, \n\t0x00, 0x14, 0x01, 0xc7, 0x00, 0x10, 0x01, 0xca, 0xff, 0xe8, 0x01, 0xcd, \n\t0xff, 0xe8, 0x01, 0xce, 0xff, 0xe0, 0x01, 0xd3, 0xff, 0xe1, 0x01, 0xd8, \n\t0xff, 0xe0, 0x01, 0xe0, 0x00, 0x13, 0x01, 0xe7, 0x00, 0x10, 0x01, 0xf3, \n\t0xff, 0xe0, 0x02, 0x05, 0x00, 0x10, 0x02, 0x0c, 0xff, 0xe8, 0x02, 0x12, \n\t0x00, 0x10, 0x02, 0x1e, 0xff, 0xe8, 0x02, 0x20, 0xff, 0xe0, 0x02, 0x22, \n\t0xff, 0xe0, 0x02, 0x24, 0xff, 0xe8, 0x02, 0x26, 0xff, 0xe8, 0x02, 0x28, \n\t0xff, 0xe8, 0x02, 0x2a, 0xff, 0xe8, 0x02, 0x2c, 0xff, 0xe8, 0x02, 0x4b, \n\t0xff, 0xe0, 0x02, 0x53, 0xff, 0xe8, 0x02, 0x55, 0xff, 0xe8, 0x02, 0x57, \n\t0xff, 0xe0, 0x02, 0x59, 0xff, 0xdf, 0x02, 0x5b, 0xff, 0xdf, 0x02, 0x5f, \n\t0xff, 0xe0, 0x02, 0x61, 0xff, 0xe1, 0x02, 0x62, 0xff, 0xe0, 0x02, 0x63, \n\t0xff, 0xe1, 0x02, 0x64, 0xff, 0xe0, 0x02, 0x68, 0xff, 0xe1, 0x02, 0x70, \n\t0x00, 0x10, 0x02, 0x71, 0x00, 0x10, 0x02, 0x76, 0xff, 0xe1, 0x02, 0x77, \n\t0xff, 0xe0, 0x02, 0x7b, 0x00, 0x10, 0x02, 0x7d, 0x00, 0x10, 0x02, 0x83, \n\t0xff, 0xe9, 0x02, 0x91, 0xff, 0xe8, 0x02, 0x93, 0xff, 0xe8, 0x02, 0x95, \n\t0xff, 0xe8, 0x02, 0x9f, 0xff, 0xe1, 0x02, 0xa0, 0xff, 0xe0, 0x02, 0xaf, \n\t0xff, 0xdf, 0x02, 0xb1, 0xff, 0xde, 0x02, 0xb3, 0x00, 0x10, 0x02, 0xb7, \n\t0xff, 0xe8, 0x02, 0xb9, 0xff, 0xdf, 0x02, 0xbb, 0xff, 0xf2, 0x02, 0xbd, \n\t0x00, 0x10, 0x02, 0xbe, 0x00, 0x10, 0x02, 0xbf, 0x00, 0x10, 0x02, 0xc9, \n\t0x00, 0x10, 0x02, 0xcb, 0x00, 0x10, 0x02, 0xcd, 0x00, 0x10, 0x02, 0xcf, \n\t0x00, 0x10, 0x02, 0xd1, 0x00, 0x10, 0x02, 0xd3, 0x00, 0x10, 0x02, 0xd5, \n\t0x00, 0x10, 0x02, 0xd7, 0x00, 0x10, 0x02, 0xd9, 0x00, 0x10, 0x02, 0xdb, \n\t0x00, 0x10, 0x02, 0xdd, 0x00, 0x10, 0x02, 0xdf, 0x00, 0x10, 0x02, 0xf5, \n\t0xff, 0xe8, 0x02, 0xf7, 0xff, 0xe8, 0x02, 0xf9, 0xff, 0xe8, 0x02, 0xfb, \n\t0xff, 0xe8, 0x02, 0xfd, 0xff, 0xe8, 0x02, 0xff, 0xff, 0xe8, 0x03, 0x01, \n\t0xff, 0xe8, 0x03, 0x03, 0xff, 0xe8, 0x03, 0x05, 0xff, 0xe8, 0x03, 0x07, \n\t0xff, 0xe8, 0x03, 0x09, 0xff, 0xe8, 0x03, 0x0b, 0xff, 0xe8, 0x03, 0x1b, \n\t0xff, 0xdf, 0x03, 0x1d, 0xff, 0xdf, 0x03, 0x1f, 0xff, 0xdf, 0x03, 0x21, \n\t0xff, 0xdf, 0x03, 0x23, 0xff, 0xe8, 0x00, 0x31, 0x00, 0x1a, 0xff, 0xf2, \n\t0x00, 0x37, 0xff, 0xf1, 0x00, 0x39, 0xff, 0xf4, 0x00, 0x3b, 0xff, 0xf4, \n\t0x00, 0x3c, 0xff, 0xf0, 0x00, 0x9f, 0xff, 0xf0, 0x01, 0x24, 0xff, 0xf1, \n\t0x01, 0x26, 0xff, 0xf1, 0x01, 0x38, 0xff, 0xf0, 0x01, 0x3a, 0xff, 0xf0, \n\t0x01, 0x69, 0xff, 0xf0, 0x01, 0x7f, 0xff, 0xf0, 0x01, 0x81, 0xff, 0xf4, \n\t0x01, 0x85, 0xff, 0xf0, 0x01, 0xae, 0xff, 0xf1, 0x01, 0xb5, 0xff, 0xf5, \n\t0x01, 0xb7, 0xff, 0xf1, 0x01, 0xba, 0xff, 0xf3, 0x01, 0xc2, 0xff, 0xf4, \n\t0x01, 0xc7, 0xff, 0xf5, 0x01, 0xce, 0xff, 0xf1, 0x01, 0xcf, 0xff, 0xf3, \n\t0x01, 0xd1, 0xff, 0xf4, 0x01, 0xd8, 0xff, 0xf1, 0x02, 0x20, 0xff, 0xf4, \n\t0x02, 0x22, 0xff, 0xf4, 0x02, 0x41, 0xff, 0xf4, 0x02, 0x4b, 0xff, 0xf1, \n\t0x02, 0x57, 0xff, 0xf1, 0x02, 0x59, 0xff, 0xf0, 0x02, 0x5b, 0xff, 0xf0, \n\t0x02, 0x5d, 0xff, 0xf4, 0x02, 0x5f, 0xff, 0xf1, 0x02, 0x6c, 0xff, 0xf4, \n\t0x02, 0x70, 0xff, 0xf5, 0x02, 0x87, 0xff, 0xf4, 0x02, 0x99, 0xff, 0xf3, \n\t0x02, 0x9b, 0xff, 0xf3, 0x02, 0x9d, 0xff, 0xf3, 0x02, 0xa7, 0xff, 0xf4, \n\t0x02, 0xaf, 0xff, 0xf2, 0x02, 0xb1, 0xff, 0xf2, 0x02, 0xb3, 0xff, 0xf5, \n\t0x02, 0xb9, 0xff, 0xf2, 0x02, 0xbd, 0xff, 0xf5, 0x03, 0x1b, 0xff, 0xf0, \n\t0x03, 0x1d, 0xff, 0xf0, 0x03, 0x1f, 0xff, 0xf0, 0x03, 0x21, 0xff, 0xf0, \n\t0x00, 0x08, 0x00, 0x57, 0x00, 0x0e, 0x00, 0x88, 0xfe, 0xdb, 0x01, 0x8e, \n\t0xff, 0xd8, 0x01, 0x95, 0xff, 0x9a, 0x01, 0x9b, 0xff, 0xc8, 0x01, 0xc0, \n\t0xff, 0x15, 0x01, 0xe0, 0xff, 0x55, 0x02, 0xab, 0xff, 0xd0, 0x00, 0x64, \n\t0x00, 0x24, 0x00, 0x0f, 0x00, 0x37, 0xff, 0xe6, 0x00, 0x39, 0xff, 0xe6, \n\t0x00, 0x3b, 0x00, 0x0e, 0x00, 0x3c, 0xff, 0xe6, 0x00, 0x82, 0x00, 0x0f, \n\t0x00, 0x83, 0x00, 0x0f, 0x00, 0x84, 0x00, 0x0f, 0x00, 0x85, 0x00, 0x0f, \n\t0x00, 0x86, 0x00, 0x0f, 0x00, 0x87, 0x00, 0x0f, 0x00, 0x9f, 0xff, 0xe6, \n\t0x00, 0xc2, 0x00, 0x0f, 0x00, 0xc4, 0x00, 0x0f, 0x00, 0xc6, 0x00, 0x0f, \n\t0x01, 0x24, 0xff, 0xe6, 0x01, 0x26, 0xff, 0xe6, 0x01, 0x38, 0xff, 0xe6, \n\t0x01, 0x3a, 0xff, 0xe6, 0x01, 0x48, 0x00, 0x0f, 0x01, 0x63, 0x00, 0x0f, \n\t0x01, 0x69, 0xff, 0xe6, 0x01, 0x6c, 0x00, 0x0f, 0x01, 0x6f, 0x00, 0x0f, \n\t0x01, 0x76, 0x00, 0x0f, 0x01, 0x7f, 0xff, 0xe6, 0x01, 0x81, 0x00, 0x0e, \n\t0x01, 0x85, 0xff, 0xe6, 0x01, 0xae, 0xff, 0xe6, 0x01, 0xb5, 0x00, 0x0e, \n\t0x01, 0xb7, 0xff, 0xe6, 0x01, 0xba, 0x00, 0x0b, 0x01, 0xbc, 0x00, 0x0f, \n\t0x01, 0xc0, 0x00, 0x13, 0x01, 0xc2, 0x00, 0x0e, 0x01, 0xc7, 0x00, 0x0e, \n\t0x01, 0xce, 0xff, 0xe6, 0x01, 0xcf, 0x00, 0x0b, 0x01, 0xd1, 0x00, 0x0e, \n\t0x01, 0xd3, 0xff, 0xe5, 0x01, 0xd8, 0xff, 0xe6, 0x01, 0xd9, 0xff, 0xf4, \n\t0x01, 0xe0, 0x00, 0x12, 0x01, 0xe7, 0x00, 0x0f, 0x01, 0xee, 0xff, 0xe7, \n\t0x01, 0xf3, 0xff, 0xe8, 0x02, 0x05, 0x00, 0x0f, 0x02, 0x12, 0x00, 0x0f, \n\t0x02, 0x20, 0xff, 0xe6, 0x02, 0x22, 0xff, 0xe6, 0x02, 0x41, 0x00, 0x0e, \n\t0x02, 0x4b, 0xff, 0xe6, 0x02, 0x4c, 0xff, 0xe7, 0x02, 0x57, 0xff, 0xe6, \n\t0x02, 0x59, 0xff, 0xe6, 0x02, 0x5b, 0xff, 0xe6, 0x02, 0x5d, 0x00, 0x0e, \n\t0x02, 0x5f, 0xff, 0xe6, 0x02, 0x61, 0xff, 0xe5, 0x02, 0x62, 0xff, 0xe8, \n\t0x02, 0x63, 0xff, 0xe5, 0x02, 0x64, 0xff, 0xe8, 0x02, 0x6c, 0x00, 0x0e, \n\t0x02, 0x70, 0x00, 0x0e, 0x02, 0x71, 0x00, 0x0f, 0x02, 0x76, 0xff, 0xe5, \n\t0x02, 0x77, 0xff, 0xe8, 0x02, 0x7b, 0x00, 0x0f, 0x02, 0x7d, 0x00, 0x0f, \n\t0x02, 0x87, 0x00, 0x0e, 0x02, 0x99, 0x00, 0x0b, 0x02, 0x9b, 0x00, 0x0b, \n\t0x02, 0x9d, 0x00, 0x0b, 0x02, 0x9f, 0xff, 0xe5, 0x02, 0xa0, 0xff, 0xe8, \n\t0x02, 0xa7, 0x00, 0x0e, 0x02, 0xaf, 0xff, 0xe6, 0x02, 0xb1, 0xff, 0xe6, \n\t0x02, 0xb3, 0x00, 0x0e, 0x02, 0xb9, 0xff, 0xe6, 0x02, 0xba, 0xff, 0xe7, \n\t0x02, 0xbd, 0x00, 0x0e, 0x02, 0xbe, 0x00, 0x0f, 0x02, 0xbf, 0x00, 0x0f, \n\t0x02, 0xc9, 0x00, 0x0f, 0x02, 0xcb, 0x00, 0x0f, 0x02, 0xcd, 0x00, 0x0f, \n\t0x02, 0xcf, 0x00, 0x0f, 0x02, 0xd1, 0x00, 0x0f, 0x02, 0xd3, 0x00, 0x0f, \n\t0x02, 0xd5, 0x00, 0x0f, 0x02, 0xd7, 0x00, 0x0f, 0x02, 0xd9, 0x00, 0x0f, \n\t0x02, 0xdb, 0x00, 0x0f, 0x02, 0xdd, 0x00, 0x0f, 0x02, 0xdf, 0x00, 0x0f, \n\t0x03, 0x1b, 0xff, 0xe6, 0x03, 0x1d, 0xff, 0xe6, 0x03, 0x1f, 0xff, 0xe6, \n\t0x03, 0x21, 0xff, 0xe6, 0x00, 0x2f, 0x00, 0x37, 0xff, 0xe3, 0x00, 0x3b, \n\t0xff, 0xe5, 0x00, 0x3c, 0xff, 0xe4, 0x00, 0x9f, 0xff, 0xe4, 0x01, 0x24, \n\t0xff, 0xe3, 0x01, 0x26, 0xff, 0xe3, 0x01, 0x38, 0xff, 0xe4, 0x01, 0x3a, \n\t0xff, 0xe4, 0x01, 0x69, 0xff, 0xe4, 0x01, 0x7f, 0xff, 0xe4, 0x01, 0x81, \n\t0xff, 0xe5, 0x01, 0x85, 0xff, 0xe4, 0x01, 0xae, 0xff, 0xe3, 0x01, 0xb5, \n\t0xff, 0xe5, 0x01, 0xb7, 0xff, 0xe3, 0x01, 0xba, 0xff, 0xe9, 0x01, 0xc0, \n\t0xff, 0xe2, 0x01, 0xc2, 0xff, 0xe5, 0x01, 0xc7, 0xff, 0xe5, 0x01, 0xce, \n\t0xff, 0xe3, 0x01, 0xcf, 0xff, 0xe9, 0x01, 0xd1, 0xff, 0xe5, 0x01, 0xe7, \n\t0xff, 0xea, 0x02, 0x05, 0xff, 0xea, 0x02, 0x41, 0xff, 0xe5, 0x02, 0x4b, \n\t0xff, 0xe3, 0x02, 0x57, 0xff, 0xe3, 0x02, 0x59, 0xff, 0xe4, 0x02, 0x5b, \n\t0xff, 0xe4, 0x02, 0x5d, 0xff, 0xe5, 0x02, 0x5f, 0xff, 0xe3, 0x02, 0x6c, \n\t0xff, 0xe5, 0x02, 0x70, 0xff, 0xe5, 0x02, 0x71, 0xff, 0xea, 0x02, 0x87, \n\t0xff, 0xe5, 0x02, 0x99, 0xff, 0xe9, 0x02, 0x9b, 0xff, 0xe9, 0x02, 0x9d, \n\t0xff, 0xe9, 0x02, 0xa7, 0xff, 0xe5, 0x02, 0xb3, 0xff, 0xe5, 0x02, 0xb9, \n\t0xff, 0xe4, 0x02, 0xbd, 0xff, 0xe5, 0x02, 0xbe, 0xff, 0xea, 0x03, 0x1b, \n\t0xff, 0xe4, 0x03, 0x1d, 0xff, 0xe4, 0x03, 0x1f, 0xff, 0xe4, 0x03, 0x21, \n\t0xff, 0xe4, 0x00, 0x22, 0x00, 0x37, 0xff, 0xe2, 0x00, 0x3b, 0xff, 0xe4, \n\t0x01, 0x24, 0xff, 0xe2, 0x01, 0x26, 0xff, 0xe2, 0x01, 0x81, 0xff, 0xe4, \n\t0x01, 0xae, 0xff, 0xe2, 0x01, 0xb5, 0xff, 0xe4, 0x01, 0xb7, 0xff, 0xe2, \n\t0x01, 0xba, 0xff, 0xe9, 0x01, 0xc0, 0xff, 0xe1, 0x01, 0xc2, 0xff, 0xe4, \n\t0x01, 0xc7, 0xff, 0xe4, 0x01, 0xce, 0xff, 0xe2, 0x01, 0xcf, 0xff, 0xe9, \n\t0x01, 0xd1, 0xff, 0xe4, 0x01, 0xe0, 0xff, 0xe4, 0x01, 0xe7, 0xff, 0xeb, \n\t0x02, 0x05, 0xff, 0xeb, 0x02, 0x41, 0xff, 0xe4, 0x02, 0x4b, 0xff, 0xe2, \n\t0x02, 0x57, 0xff, 0xe2, 0x02, 0x5d, 0xff, 0xe4, 0x02, 0x5f, 0xff, 0xe2, \n\t0x02, 0x6c, 0xff, 0xe4, 0x02, 0x70, 0xff, 0xe4, 0x02, 0x71, 0xff, 0xeb, \n\t0x02, 0x87, 0xff, 0xe4, 0x02, 0x99, 0xff, 0xe9, 0x02, 0x9b, 0xff, 0xe9, \n\t0x02, 0x9d, 0xff, 0xe9, 0x02, 0xa7, 0xff, 0xe4, 0x02, 0xb3, 0xff, 0xe4, \n\t0x02, 0xbd, 0xff, 0xe4, 0x02, 0xbe, 0xff, 0xeb, 0x00, 0x16, 0x00, 0x37, \n\t0xff, 0xeb, 0x00, 0x3c, 0xff, 0xf3, 0x00, 0x9f, 0xff, 0xf3, 0x01, 0x24, \n\t0xff, 0xeb, 0x01, 0x26, 0xff, 0xeb, 0x01, 0x38, 0xff, 0xf3, 0x01, 0x3a, \n\t0xff, 0xf3, 0x01, 0x69, 0xff, 0xf3, 0x01, 0x7f, 0xff, 0xf3, 0x01, 0x85, \n\t0xff, 0xf3, 0x01, 0xae, 0xff, 0xeb, 0x01, 0xb7, 0xff, 0xeb, 0x01, 0xce, \n\t0xff, 0xeb, 0x02, 0x4b, 0xff, 0xeb, 0x02, 0x57, 0xff, 0xeb, 0x02, 0x59, \n\t0xff, 0xf3, 0x02, 0x5b, 0xff, 0xf3, 0x02, 0x5f, 0xff, 0xeb, 0x03, 0x1b, \n\t0xff, 0xf3, 0x03, 0x1d, 0xff, 0xf3, 0x03, 0x1f, 0xff, 0xf3, 0x03, 0x21, \n\t0xff, 0xf3, 0x00, 0x36, 0x00, 0x50, 0xff, 0xef, 0x00, 0x51, 0xff, 0xef, \n\t0x00, 0x53, 0xff, 0xef, 0x00, 0x5b, 0xff, 0xf0, 0x00, 0xb3, 0xff, 0xef, \n\t0x01, 0x06, 0xff, 0xef, 0x01, 0x08, 0xff, 0xef, 0x01, 0x0a, 0xff, 0xef, \n\t0x01, 0x0b, 0xff, 0xef, 0x01, 0x88, 0xff, 0xef, 0x01, 0x91, 0xff, 0xef, \n\t0x01, 0xdf, 0xff, 0xef, 0x01, 0xe0, 0xff, 0xee, 0x01, 0xe2, 0xff, 0xf0, \n\t0x01, 0xe4, 0xff, 0xef, 0x01, 0xe5, 0xff, 0xef, 0x01, 0xe6, 0xff, 0xef, \n\t0x01, 0xe8, 0xff, 0xef, 0x01, 0xe9, 0xff, 0xef, 0x01, 0xeb, 0xff, 0xef, \n\t0x01, 0xec, 0xff, 0xef, 0x01, 0xee, 0xff, 0xee, 0x01, 0xf1, 0xff, 0xf0, \n\t0x01, 0xf2, 0xff, 0xef, 0x01, 0xf4, 0xff, 0xef, 0x01, 0xf5, 0xff, 0xef, \n\t0x01, 0xf8, 0xff, 0xef, 0x01, 0xfa, 0xff, 0xef, 0x01, 0xff, 0xff, 0xef, \n\t0x02, 0x06, 0xff, 0xef, 0x02, 0x08, 0xff, 0xef, 0x02, 0x09, 0xff, 0xef, \n\t0x02, 0x0d, 0xff, 0xf4, 0x02, 0x2b, 0xff, 0xf1, 0x02, 0x36, 0xff, 0xef, \n\t0x02, 0x42, 0xff, 0xf0, 0x02, 0x46, 0xff, 0xef, 0x02, 0x4c, 0xff, 0xef, \n\t0x02, 0x4e, 0xff, 0xef, 0x02, 0x50, 0xff, 0xef, 0x02, 0x5e, 0xff, 0xf0, \n\t0x02, 0x6d, 0xff, 0xf0, 0x02, 0x73, 0xff, 0xef, 0x02, 0x75, 0xff, 0xef, \n\t0x02, 0x79, 0xff, 0xef, 0x02, 0x88, 0xff, 0xf0, 0x02, 0x8e, 0xff, 0xef, \n\t0x02, 0x90, 0xff, 0xef, 0x02, 0xa2, 0xff, 0xef, 0x02, 0xa4, 0xff, 0xef, \n\t0x02, 0xa6, 0xff, 0xef, 0x02, 0xa8, 0xff, 0xf0, 0x02, 0xba, 0xff, 0xef, \n\t0x02, 0xc2, 0xff, 0xef, 0x00, 0x21, 0x00, 0x05, 0xff, 0xf2, 0x00, 0x0a, \n\t0xff, 0xf2, 0x00, 0x59, 0xff, 0xf5, 0x00, 0x5c, 0xff, 0xf5, 0x00, 0xbf, \n\t0xff, 0xf5, 0x00, 0xc1, 0xff, 0xf5, 0x01, 0x39, 0xff, 0xf5, 0x01, 0x51, \n\t0xff, 0xf2, 0x01, 0x8d, 0xff, 0xf5, 0x01, 0x97, 0xff, 0xf5, 0x01, 0xee, \n\t0xff, 0xf4, 0x01, 0xef, 0xff, 0xf5, 0x02, 0x0a, 0xff, 0xf5, 0x02, 0x0d, \n\t0xff, 0xf5, 0x02, 0x21, 0xff, 0xf5, 0x02, 0x23, 0xff, 0xf5, 0x02, 0x4c, \n\t0xff, 0xf5, 0x02, 0x5a, 0xff, 0xf5, 0x02, 0x9a, 0xff, 0xf5, 0x02, 0x9c, \n\t0xff, 0xf5, 0x02, 0x9e, 0xff, 0xf5, 0x02, 0xba, 0xff, 0xf5, 0x03, 0x1c, \n\t0xff, 0xf5, 0x03, 0x1e, 0xff, 0xf5, 0x03, 0x20, 0xff, 0xf5, 0x03, 0x22, \n\t0xff, 0xf5, 0x03, 0x34, 0xff, 0xf2, 0x03, 0x35, 0xff, 0xf2, 0x03, 0x37, \n\t0xff, 0xf2, 0x03, 0x38, 0xff, 0xf2, 0x03, 0x39, 0xff, 0xf2, 0x03, 0x41, \n\t0xff, 0xf2, 0x03, 0x42, 0xff, 0xf2, 0x00, 0x09, 0x01, 0xe0, 0x00, 0x14, \n\t0x01, 0xee, 0xff, 0xed, 0x01, 0xf3, 0xff, 0xed, 0x02, 0x4c, 0xff, 0xed, \n\t0x02, 0x62, 0xff, 0xed, 0x02, 0x64, 0xff, 0xed, 0x02, 0x77, 0xff, 0xed, \n\t0x02, 0xa0, 0xff, 0xed, 0x02, 0xba, 0xff, 0xed, 0x00, 0x0a, 0x00, 0x05, \n\t0xff, 0xf5, 0x00, 0x0a, 0xff, 0xf5, 0x01, 0x51, 0xff, 0xf5, 0x03, 0x34, \n\t0xff, 0xf5, 0x03, 0x35, 0xff, 0xf5, 0x03, 0x37, 0xff, 0xf5, 0x03, 0x38, \n\t0xff, 0xf5, 0x03, 0x39, 0xff, 0xf5, 0x03, 0x41, 0xff, 0xf5, 0x03, 0x42, \n\t0xff, 0xf5, 0x00, 0x56, 0x00, 0x46, 0xff, 0xf0, 0x00, 0x47, 0xff, 0xf0, \n\t0x00, 0x48, 0xff, 0xf0, 0x00, 0x4a, 0xff, 0xf0, 0x00, 0x52, 0xff, 0xc8, \n\t0x00, 0x54, 0xff, 0xf0, 0x00, 0xa9, 0xff, 0xf0, 0x00, 0xaa, 0xff, 0xf0, \n\t0x00, 0xab, 0xff, 0xf0, 0x00, 0xac, 0xff, 0xf0, 0x00, 0xad, 0xff, 0xf0, \n\t0x00, 0xb4, 0xff, 0xc8, 0x00, 0xb5, 0xff, 0xc8, 0x00, 0xb6, 0xff, 0xc8, \n\t0x00, 0xb7, 0xff, 0xc8, 0x00, 0xb8, 0xff, 0xc8, 0x00, 0xc9, 0xff, 0xf0, \n\t0x00, 0xcb, 0xff, 0xf0, 0x00, 0xcd, 0xff, 0xf0, 0x00, 0xcf, 0xff, 0xf0, \n\t0x00, 0xd1, 0xff, 0xf0, 0x00, 0xd5, 0xff, 0xf0, 0x00, 0xd7, 0xff, 0xf0, \n\t0x00, 0xd9, 0xff, 0xf0, 0x00, 0xdb, 0xff, 0xf0, 0x00, 0xdd, 0xff, 0xf0, \n\t0x00, 0xdf, 0xff, 0xf0, 0x00, 0xe1, 0xff, 0xf0, 0x00, 0xe3, 0xff, 0xf0, \n\t0x00, 0xe5, 0xff, 0xf0, 0x01, 0x0f, 0xff, 0xc8, 0x01, 0x11, 0xff, 0xc8, \n\t0x01, 0x13, 0xff, 0xc8, 0x01, 0x15, 0xff, 0xf0, 0x01, 0x44, 0xff, 0xf0, \n\t0x01, 0x86, 0xff, 0xf0, 0x01, 0x8b, 0xff, 0xf0, 0x01, 0x99, 0xff, 0xc8, \n\t0x01, 0x9c, 0xff, 0xf0, 0x01, 0x9d, 0xff, 0xf0, 0x01, 0xa6, 0xff, 0xc8, \n\t0x01, 0xe1, 0xff, 0xf0, 0x01, 0xea, 0xff, 0xc8, 0x01, 0xed, 0xff, 0xf0, \n\t0x01, 0xf0, 0xff, 0xf0, 0x01, 0xfc, 0xff, 0xf0, 0x01, 0xfd, 0xff, 0xf0, \n\t0x02, 0x00, 0xff, 0xf0, 0x02, 0x1f, 0xff, 0xc8, 0x02, 0x25, 0xff, 0xf0, \n\t0x02, 0x27, 0xff, 0xeb, 0x02, 0x29, 0xff, 0xf0, 0x02, 0x2d, 0xff, 0xf0, \n\t0x02, 0x54, 0xff, 0xf0, 0x02, 0x56, 0xff, 0xf0, 0x02, 0x82, 0xff, 0xf0, \n\t0x02, 0x84, 0xff, 0xf0, 0x02, 0x86, 0xff, 0xf0, 0x02, 0x92, 0xff, 0xc8, \n\t0x02, 0x94, 0xff, 0xf0, 0x02, 0x96, 0xff, 0xc8, 0x02, 0xac, 0xff, 0xf0, \n\t0x02, 0xad, 0xff, 0xf0, 0x02, 0xae, 0xff, 0xf0, 0x02, 0xb8, 0xff, 0xf0, \n\t0x02, 0xe2, 0xff, 0xf0, 0x02, 0xe4, 0xff, 0xf0, 0x02, 0xe6, 0xff, 0xf0, \n\t0x02, 0xe8, 0xff, 0xf0, 0x02, 0xea, 0xff, 0xf0, 0x02, 0xec, 0xff, 0xf0, \n\t0x02, 0xee, 0xff, 0xf0, 0x02, 0xf0, 0xff, 0xf0, 0x02, 0xf6, 0xff, 0xc8, \n\t0x02, 0xf8, 0xff, 0xc8, 0x02, 0xfa, 0xff, 0xc8, 0x02, 0xfc, 0xff, 0xc8, \n\t0x02, 0xfe, 0xff, 0xc8, 0x03, 0x00, 0xff, 0xc8, 0x03, 0x02, 0xff, 0xc8, \n\t0x03, 0x04, 0xff, 0xf0, 0x03, 0x06, 0xff, 0xf0, 0x03, 0x08, 0xff, 0xf0, \n\t0x03, 0x0a, 0xff, 0xc8, 0x03, 0x0c, 0xff, 0xf0, 0x03, 0x7e, 0xff, 0xeb, \n\t0x00, 0x9b, 0x00, 0x05, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x0d, 0x00, 0x44, \n\t0xff, 0xf0, 0x00, 0x46, 0xff, 0xee, 0x00, 0x47, 0xff, 0xee, 0x00, 0x48, \n\t0xff, 0xee, 0x00, 0x49, 0x00, 0x0d, 0x00, 0x4a, 0xff, 0xee, 0x00, 0x52, \n\t0xff, 0xea, 0x00, 0x54, 0xff, 0xee, 0x00, 0x59, 0x00, 0x0b, 0x00, 0x5c, \n\t0x00, 0x0b, 0x00, 0xa2, 0xff, 0xf0, 0x00, 0xa3, 0xff, 0xf0, 0x00, 0xa4, \n\t0xff, 0xf0, 0x00, 0xa5, 0xff, 0xf0, 0x00, 0xa6, 0xff, 0xf0, 0x00, 0xa7, \n\t0xff, 0xf0, 0x00, 0xa9, 0xff, 0xee, 0x00, 0xaa, 0xff, 0xee, 0x00, 0xab, \n\t0xff, 0xee, 0x00, 0xac, 0xff, 0xee, 0x00, 0xad, 0xff, 0xee, 0x00, 0xb4, \n\t0xff, 0xea, 0x00, 0xb5, 0xff, 0xea, 0x00, 0xb6, 0xff, 0xea, 0x00, 0xb7, \n\t0xff, 0xea, 0x00, 0xb8, 0xff, 0xea, 0x00, 0xbf, 0x00, 0x0b, 0x00, 0xc1, \n\t0x00, 0x0b, 0x00, 0xc3, 0xff, 0xf0, 0x00, 0xc5, 0xff, 0xf0, 0x00, 0xc7, \n\t0xff, 0xf0, 0x00, 0xc9, 0xff, 0xee, 0x00, 0xcb, 0xff, 0xee, 0x00, 0xcd, \n\t0xff, 0xee, 0x00, 0xcf, 0xff, 0xee, 0x00, 0xd1, 0xff, 0xee, 0x00, 0xd5, \n\t0xff, 0xee, 0x00, 0xd7, 0xff, 0xee, 0x00, 0xd9, 0xff, 0xee, 0x00, 0xdb, \n\t0xff, 0xee, 0x00, 0xdd, 0xff, 0xee, 0x00, 0xdf, 0xff, 0xee, 0x00, 0xe1, \n\t0xff, 0xee, 0x00, 0xe3, 0xff, 0xee, 0x00, 0xe5, 0xff, 0xee, 0x01, 0x0f, \n\t0xff, 0xea, 0x01, 0x11, 0xff, 0xea, 0x01, 0x13, 0xff, 0xea, 0x01, 0x15, \n\t0xff, 0xee, 0x01, 0x39, 0x00, 0x0b, 0x01, 0x44, 0xff, 0xee, 0x01, 0x49, \n\t0xff, 0xf0, 0x01, 0x51, 0x00, 0x0d, 0x01, 0x86, 0xff, 0xee, 0x01, 0x8b, \n\t0xff, 0xee, 0x01, 0x8d, 0x00, 0x0b, 0x01, 0x97, 0x00, 0x0b, 0x01, 0x99, \n\t0xff, 0xea, 0x01, 0x9c, 0xff, 0xee, 0x01, 0x9d, 0xff, 0xee, 0x01, 0xa6, \n\t0xff, 0xea, 0x01, 0xdc, 0xff, 0xf0, 0x01, 0xe0, 0xff, 0xc8, 0x01, 0xe1, \n\t0xff, 0xee, 0x01, 0xe7, 0xff, 0xd7, 0x01, 0xea, 0xff, 0xea, 0x01, 0xed, \n\t0xff, 0xee, 0x01, 0xef, 0x00, 0x0b, 0x01, 0xf0, 0xff, 0xee, 0x01, 0xfc, \n\t0xff, 0xee, 0x01, 0xfd, 0xff, 0xee, 0x02, 0x00, 0xff, 0xee, 0x02, 0x05, \n\t0xff, 0xd7, 0x02, 0x0a, 0x00, 0x0b, 0x02, 0x1f, 0xff, 0xea, 0x02, 0x21, \n\t0x00, 0x0b, 0x02, 0x23, 0x00, 0x0b, 0x02, 0x25, 0xff, 0xee, 0x02, 0x27, \n\t0xff, 0xec, 0x02, 0x29, 0xff, 0xee, 0x02, 0x2b, 0x00, 0x0c, 0x02, 0x2d, \n\t0xff, 0xee, 0x02, 0x54, 0xff, 0xee, 0x02, 0x56, 0xff, 0xee, 0x02, 0x5a, \n\t0x00, 0x0b, 0x02, 0x71, 0xff, 0xd7, 0x02, 0x7c, 0xff, 0xf0, 0x02, 0x7e, \n\t0xff, 0xf0, 0x02, 0x82, 0xff, 0xee, 0x02, 0x84, 0xff, 0xee, 0x02, 0x86, \n\t0xff, 0xee, 0x02, 0x92, 0xff, 0xea, 0x02, 0x94, 0xff, 0xee, 0x02, 0x96, \n\t0xff, 0xea, 0x02, 0x9a, 0x00, 0x0b, 0x02, 0x9c, 0x00, 0x0b, 0x02, 0x9e, \n\t0x00, 0x0b, 0x02, 0xac, 0xff, 0xee, 0x02, 0xad, 0xff, 0xee, 0x02, 0xae, \n\t0xff, 0xee, 0x02, 0xb0, 0x00, 0x0b, 0x02, 0xb2, 0x00, 0x0b, 0x02, 0xb8, \n\t0xff, 0xee, 0x02, 0xbe, 0xff, 0xd7, 0x02, 0xc0, 0xff, 0xf0, 0x02, 0xca, \n\t0xff, 0xf0, 0x02, 0xcc, 0xff, 0xf0, 0x02, 0xce, 0xff, 0xf0, 0x02, 0xd0, \n\t0xff, 0xf0, 0x02, 0xd2, 0xff, 0xf0, 0x02, 0xd4, 0xff, 0xf0, 0x02, 0xd6, \n\t0xff, 0xf0, 0x02, 0xd8, 0xff, 0xf0, 0x02, 0xda, 0xff, 0xf0, 0x02, 0xdc, \n\t0xff, 0xf0, 0x02, 0xde, 0xff, 0xf0, 0x02, 0xe0, 0xff, 0xf0, 0x02, 0xe2, \n\t0xff, 0xee, 0x02, 0xe4, 0xff, 0xee, 0x02, 0xe6, 0xff, 0xee, 0x02, 0xe8, \n\t0xff, 0xee, 0x02, 0xea, 0xff, 0xee, 0x02, 0xec, 0xff, 0xee, 0x02, 0xee, \n\t0xff, 0xee, 0x02, 0xf0, 0xff, 0xee, 0x02, 0xf6, 0xff, 0xea, 0x02, 0xf8, \n\t0xff, 0xea, 0x02, 0xfa, 0xff, 0xea, 0x02, 0xfc, 0xff, 0xea, 0x02, 0xfe, \n\t0xff, 0xea, 0x03, 0x00, 0xff, 0xea, 0x03, 0x02, 0xff, 0xea, 0x03, 0x04, \n\t0xff, 0xee, 0x03, 0x06, 0xff, 0xee, 0x03, 0x08, 0xff, 0xee, 0x03, 0x0a, \n\t0xff, 0xea, 0x03, 0x0c, 0xff, 0xee, 0x03, 0x1c, 0x00, 0x0b, 0x03, 0x1e, \n\t0x00, 0x0b, 0x03, 0x20, 0x00, 0x0b, 0x03, 0x22, 0x00, 0x0b, 0x03, 0x34, \n\t0x00, 0x0d, 0x03, 0x35, 0x00, 0x0d, 0x03, 0x37, 0x00, 0x0d, 0x03, 0x38, \n\t0x00, 0x0d, 0x03, 0x39, 0x00, 0x0d, 0x03, 0x41, 0x00, 0x0d, 0x03, 0x42, \n\t0x00, 0x0d, 0x03, 0x76, 0x00, 0x0d, 0x03, 0x79, 0x00, 0x0d, 0x03, 0x7b, \n\t0x00, 0x0e, 0x03, 0x7c, 0xff, 0xf5, 0x03, 0x7e, 0xff, 0xec, 0x00, 0x0e, \n\t0x01, 0xe0, 0x00, 0x14, 0x01, 0xe7, 0x00, 0x10, 0x01, 0xee, 0xff, 0xf0, \n\t0x01, 0xf3, 0xff, 0xf0, 0x01, 0xfb, 0x00, 0x0c, 0x02, 0x05, 0x00, 0x10, \n\t0x02, 0x4c, 0xff, 0xf0, 0x02, 0x62, 0xff, 0xf0, 0x02, 0x64, 0xff, 0xf0, \n\t0x02, 0x71, 0x00, 0x10, 0x02, 0x77, 0xff, 0xf0, 0x02, 0xa0, 0xff, 0xf0, \n\t0x02, 0xba, 0xff, 0xf0, 0x02, 0xbe, 0x00, 0x10, 0x00, 0x4a, 0x00, 0x46, \n\t0xff, 0xee, 0x00, 0x47, 0xff, 0xee, 0x00, 0x48, 0xff, 0xee, 0x00, 0x4a, \n\t0xff, 0xee, 0x00, 0x54, 0xff, 0xee, 0x00, 0xa9, 0xff, 0xee, 0x00, 0xaa, \n\t0xff, 0xee, 0x00, 0xab, 0xff, 0xee, 0x00, 0xac, 0xff, 0xee, 0x00, 0xad, \n\t0xff, 0xee, 0x00, 0xc9, 0xff, 0xee, 0x00, 0xcb, 0xff, 0xee, 0x00, 0xcd, \n\t0xff, 0xee, 0x00, 0xcf, 0xff, 0xee, 0x00, 0xd1, 0xff, 0xee, 0x00, 0xd5, \n\t0xff, 0xee, 0x00, 0xd7, 0xff, 0xee, 0x00, 0xd9, 0xff, 0xee, 0x00, 0xdb, \n\t0xff, 0xee, 0x00, 0xdd, 0xff, 0xee, 0x00, 0xdf, 0xff, 0xee, 0x00, 0xe1, \n\t0xff, 0xee, 0x00, 0xe3, 0xff, 0xee, 0x00, 0xe5, 0xff, 0xee, 0x01, 0x15, \n\t0xff, 0xee, 0x01, 0x44, 0xff, 0xee, 0x01, 0x86, 0xff, 0xee, 0x01, 0x8b, \n\t0xff, 0xee, 0x01, 0x9c, 0xff, 0xee, 0x01, 0x9d, 0xff, 0xee, 0x01, 0xe0, \n\t0x00, 0x12, 0x01, 0xe1, 0xff, 0xee, 0x01, 0xe7, 0x00, 0x0e, 0x01, 0xed, \n\t0xff, 0xee, 0x01, 0xee, 0xff, 0xe3, 0x01, 0xf0, 0xff, 0xee, 0x01, 0xf3, \n\t0xff, 0xe3, 0x01, 0xfc, 0xff, 0xee, 0x01, 0xfd, 0xff, 0xee, 0x02, 0x00, \n\t0xff, 0xee, 0x02, 0x05, 0x00, 0x0e, 0x02, 0x25, 0xff, 0xee, 0x02, 0x29, \n\t0xff, 0xee, 0x02, 0x2d, 0xff, 0xee, 0x02, 0x4c, 0xff, 0xe2, 0x02, 0x54, \n\t0xff, 0xee, 0x02, 0x56, 0xff, 0xee, 0x02, 0x62, 0xff, 0xe3, 0x02, 0x64, \n\t0xff, 0xe3, 0x02, 0x71, 0x00, 0x0e, 0x02, 0x77, 0xff, 0xe3, 0x02, 0x82, \n\t0xff, 0xee, 0x02, 0x84, 0xff, 0xee, 0x02, 0x86, 0xff, 0xee, 0x02, 0x94, \n\t0xff, 0xee, 0x02, 0xa0, 0xff, 0xe3, 0x02, 0xac, 0xff, 0xee, 0x02, 0xad, \n\t0xff, 0xee, 0x02, 0xae, 0xff, 0xee, 0x02, 0xb8, 0xff, 0xee, 0x02, 0xba, \n\t0xff, 0xe3, 0x02, 0xbe, 0x00, 0x0e, 0x02, 0xe2, 0xff, 0xee, 0x02, 0xe4, \n\t0xff, 0xee, 0x02, 0xe6, 0xff, 0xee, 0x02, 0xe8, 0xff, 0xee, 0x02, 0xea, \n\t0xff, 0xee, 0x02, 0xec, 0xff, 0xee, 0x02, 0xee, 0xff, 0xee, 0x02, 0xf0, \n\t0xff, 0xee, 0x03, 0x04, 0xff, 0xee, 0x03, 0x06, 0xff, 0xee, 0x03, 0x08, \n\t0xff, 0xee, 0x03, 0x0c, 0xff, 0xee, 0x00, 0x20, 0x00, 0x59, 0xff, 0xf4, \n\t0x00, 0x5b, 0xff, 0xf0, 0x00, 0x5c, 0xff, 0xf4, 0x00, 0xbf, 0xff, 0xf4, \n\t0x00, 0xc1, 0xff, 0xf4, 0x01, 0x39, 0xff, 0xf4, 0x01, 0x8d, 0xff, 0xf4, \n\t0x01, 0x97, 0xff, 0xf4, 0x01, 0xe0, 0xff, 0xef, 0x01, 0xe2, 0xff, 0xf0, \n\t0x01, 0xe7, 0xff, 0xf3, 0x01, 0xef, 0xff, 0xf4, 0x01, 0xf1, 0xff, 0xf0, \n\t0x02, 0x05, 0xff, 0xf3, 0x02, 0x0a, 0xff, 0xf4, 0x02, 0x21, 0xff, 0xf4, \n\t0x02, 0x23, 0xff, 0xf4, 0x02, 0x42, 0xff, 0xf0, 0x02, 0x5a, 0xff, 0xf4, \n\t0x02, 0x5e, 0xff, 0xf0, 0x02, 0x6d, 0xff, 0xf0, 0x02, 0x71, 0xff, 0xf3, \n\t0x02, 0x88, 0xff, 0xf0, 0x02, 0x9a, 0xff, 0xf4, 0x02, 0x9c, 0xff, 0xf4, \n\t0x02, 0x9e, 0xff, 0xf4, 0x02, 0xa8, 0xff, 0xf0, 0x02, 0xbe, 0xff, 0xf3, \n\t0x03, 0x1c, 0xff, 0xf4, 0x03, 0x1e, 0xff, 0xf4, 0x03, 0x20, 0xff, 0xf4, \n\t0x03, 0x22, 0xff, 0xf4, 0x00, 0x0a, 0x00, 0x05, 0xff, 0xd6, 0x00, 0x0a, \n\t0xff, 0xd6, 0x01, 0x51, 0xff, 0xd6, 0x03, 0x34, 0xff, 0xd6, 0x03, 0x35, \n\t0xff, 0xd6, 0x03, 0x37, 0xff, 0xd6, 0x03, 0x38, 0xff, 0xd6, 0x03, 0x39, \n\t0xff, 0xd6, 0x03, 0x41, 0xff, 0xd6, 0x03, 0x42, 0xff, 0xd6, 0x00, 0x09, \n\t0x01, 0xd8, 0xff, 0xc3, 0x01, 0xee, 0xff, 0xcf, 0x02, 0x4c, 0xff, 0xce, \n\t0x02, 0x63, 0xff, 0xe7, 0x02, 0x67, 0xff, 0xdf, 0x02, 0xaf, 0xff, 0xd1, \n\t0x02, 0xb1, 0xff, 0xec, 0x02, 0xb9, 0xff, 0xa0, 0x02, 0xba, 0xff, 0xd1, \n\t0x00, 0x08, 0x01, 0xee, 0xff, 0xba, 0x02, 0x0d, 0xff, 0xd9, 0x02, 0x2b, \n\t0xff, 0xdb, 0x02, 0x4c, 0xff, 0xa0, 0x02, 0x64, 0xff, 0xed, 0x02, 0xb0, \n\t0xff, 0xf0, 0x02, 0xb2, 0xff, 0xf2, 0x02, 0xba, 0xff, 0xba, 0x00, 0x05, \n\t0x00, 0x0c, 0x00, 0x14, 0x00, 0x40, 0x00, 0x11, 0x00, 0x55, 0xff, 0xe2, \n\t0x00, 0x60, 0x00, 0x13, 0x03, 0x7e, 0xff, 0xd9, 0x00, 0x0a, 0x00, 0x05, \n\t0xff, 0xd8, 0x00, 0x0a, 0xff, 0xd8, 0x01, 0x51, 0xff, 0xd8, 0x03, 0x34, \n\t0xff, 0xd8, 0x03, 0x35, 0xff, 0xd8, 0x03, 0x37, 0xff, 0xd8, 0x03, 0x38, \n\t0xff, 0xd8, 0x03, 0x39, 0xff, 0xd8, 0x03, 0x41, 0xff, 0xd8, 0x03, 0x42, \n\t0xff, 0xd8, 0x00, 0x10, 0x00, 0x5a, 0xff, 0xc1, 0x01, 0x80, 0xff, 0xc5, \n\t0x01, 0x9e, 0xff, 0xb4, 0x01, 0xdd, 0xff, 0xd7, 0x01, 0xee, 0xff, 0xb9, \n\t0x02, 0x0d, 0xff, 0xb2, 0x02, 0x27, 0xff, 0xd2, 0x02, 0x2b, 0xff, 0xc8, \n\t0x02, 0x4c, 0xff, 0xa0, 0x02, 0x64, 0xff, 0xc5, 0x02, 0x83, 0xff, 0xe4, \n\t0x02, 0xb0, 0xff, 0xcc, 0x02, 0xb2, 0xff, 0xcc, 0x02, 0xba, 0xff, 0xcb, \n\t0x02, 0xbb, 0xff, 0xef, 0x03, 0x7e, 0xff, 0xe7, 0x00, 0x04, 0x00, 0x0c, \n\t0xff, 0xe6, 0x00, 0x40, 0xff, 0xf4, 0x00, 0x60, 0xff, 0xef, 0x02, 0x68, \n\t0xff, 0xed, 0x00, 0x36, 0x00, 0x55, 0xff, 0xbf, 0x00, 0x5a, 0xff, 0xd1, \n\t0x00, 0x6d, 0xff, 0x69, 0x00, 0x7d, 0xff, 0x6d, 0x00, 0x88, 0xff, 0x44, \n\t0x00, 0xa8, 0xff, 0xac, 0x00, 0xba, 0xff, 0xa1, 0x01, 0x80, 0xff, 0xb8, \n\t0x01, 0x8e, 0xff, 0xf1, 0x01, 0x8f, 0xff, 0x7e, 0x01, 0x93, 0xff, 0x7b, \n\t0x01, 0x9a, 0xff, 0x9b, 0x01, 0x9b, 0xff, 0x79, 0x01, 0x9e, 0xff, 0xb2, \n\t0x01, 0xa0, 0xff, 0x7e, 0x01, 0xa1, 0xff, 0xb3, 0x01, 0xa2, 0xff, 0x7d, \n\t0x01, 0xa3, 0xff, 0x7c, 0x01, 0xc0, 0xff, 0xaf, 0x01, 0xd8, 0x00, 0x0f, \n\t0x01, 0xdd, 0xff, 0xe4, 0x01, 0xde, 0xff, 0xa0, 0x01, 0xe0, 0xff, 0x74, \n\t0x01, 0xe3, 0xff, 0x80, 0x01, 0xee, 0xff, 0xb2, 0x01, 0xf7, 0xff, 0x7d, \n\t0x01, 0xf9, 0xff, 0x80, 0x01, 0xfb, 0xff, 0x79, 0x02, 0x0b, 0xff, 0x7d, \n\t0x02, 0x0d, 0xff, 0x7f, 0x02, 0x27, 0xff, 0x67, 0x02, 0x2b, 0xff, 0xda, \n\t0x02, 0x3a, 0xff, 0x81, 0x02, 0x3c, 0xff, 0x98, 0x02, 0x48, 0xff, 0x7d, \n\t0x02, 0x4c, 0xff, 0xb3, 0x02, 0x52, 0xff, 0xa0, 0x02, 0x64, 0xff, 0x7c, \n\t0x02, 0x66, 0xff, 0x7c, 0x02, 0x67, 0xff, 0x9a, 0x02, 0x68, 0xff, 0x6c, \n\t0x02, 0x83, 0xff, 0xe6, 0x02, 0xab, 0xff, 0x6b, 0x02, 0xb0, 0xff, 0x92, \n\t0x02, 0xb2, 0xff, 0xad, 0x02, 0xb6, 0xff, 0x7b, 0x02, 0xb9, 0x00, 0x0f, \n\t0x02, 0xba, 0xff, 0x91, 0x02, 0xbb, 0xff, 0xf2, 0x03, 0x77, 0xff, 0xed, \n\t0x03, 0x78, 0xff, 0xf1, 0x03, 0x7b, 0xff, 0xf1, 0x03, 0x7c, 0xff, 0xbc, \n\t0x03, 0x7e, 0xff, 0xb9, 0x00, 0x06, 0x01, 0x9e, 0xff, 0xea, 0x01, 0xa1, \n\t0xff, 0xe8, 0x01, 0xe0, 0xff, 0xee, 0x01, 0xee, 0xff, 0xeb, 0x02, 0x4c, \n\t0xff, 0xec, 0x02, 0xba, 0xff, 0xec, 0x00, 0x13, 0x01, 0xc0, 0xff, 0xae, \n\t0x01, 0xd8, 0x00, 0x12, 0x01, 0xde, 0xff, 0xe0, 0x01, 0xe0, 0xff, 0xad, \n\t0x01, 0xe3, 0xff, 0xd6, 0x01, 0xf7, 0xff, 0xdf, 0x01, 0xfb, 0xff, 0xd2, \n\t0x02, 0x0b, 0xff, 0xe0, 0x02, 0x27, 0xff, 0xce, 0x02, 0x3a, 0xff, 0xdd, \n\t0x02, 0x3c, 0xff, 0xe2, 0x02, 0x48, 0xff, 0xe0, 0x02, 0x52, 0xff, 0xe0, \n\t0x02, 0x64, 0xff, 0xe9, 0x02, 0x66, 0xff, 0xde, 0x02, 0x68, 0xff, 0xda, \n\t0x02, 0xab, 0xff, 0xbd, 0x02, 0xb6, 0xff, 0xdf, 0x02, 0xb9, 0x00, 0x11, \n\t0x00, 0x31, 0x00, 0x55, 0xff, 0x7e, 0x00, 0x5a, 0xff, 0x9d, 0x00, 0x6d, \n\t0xfe, 0xeb, 0x00, 0x7d, 0xfe, 0xf2, 0x00, 0x88, 0xfe, 0xac, 0x00, 0xa8, \n\t0xff, 0x5d, 0x00, 0xba, 0xff, 0x4b, 0x01, 0x80, 0xff, 0x72, 0x01, 0x8e, \n\t0xff, 0xd2, 0x01, 0x8f, 0xff, 0x0f, 0x01, 0x93, 0xff, 0x0a, 0x01, 0x9a, \n\t0xff, 0x41, 0x01, 0x9b, 0xff, 0x07, 0x01, 0x9e, 0xff, 0x68, 0x01, 0xa0, \n\t0xff, 0x0f, 0x01, 0xa1, 0xff, 0x6a, 0x01, 0xa2, 0xff, 0x0e, 0x01, 0xa3, \n\t0xff, 0x0b, 0x01, 0xc0, 0xff, 0x63, 0x01, 0xd8, 0x00, 0x05, 0x01, 0xdd, \n\t0xff, 0xbd, 0x01, 0xde, 0xff, 0x49, 0x01, 0xe0, 0xfe, 0xfe, 0x01, 0xe3, \n\t0xff, 0x13, 0x01, 0xee, 0xff, 0x68, 0x01, 0xf7, 0xff, 0x0e, 0x01, 0xf9, \n\t0xff, 0x13, 0x01, 0xfb, 0xff, 0x07, 0x02, 0x0b, 0xff, 0x0e, 0x02, 0x0d, \n\t0xff, 0x11, 0x02, 0x27, 0xfe, 0xe9, 0x02, 0x2b, 0xff, 0xac, 0x02, 0x3a, \n\t0xff, 0x15, 0x02, 0x3c, 0xff, 0x3c, 0x02, 0x48, 0xff, 0x0e, 0x02, 0x4c, \n\t0xff, 0x6a, 0x02, 0x52, 0xff, 0x49, 0x02, 0x64, 0xff, 0x0c, 0x02, 0x66, \n\t0xff, 0x0c, 0x02, 0x67, 0xff, 0x3f, 0x02, 0x68, 0xfe, 0xf1, 0x02, 0x83, \n\t0xff, 0xc0, 0x02, 0xab, 0xfe, 0xef, 0x02, 0xb0, 0xff, 0x31, 0x02, 0xb2, \n\t0xff, 0x5f, 0x02, 0xb6, 0xff, 0x0a, 0x02, 0xb9, 0x00, 0x05, 0x02, 0xba, \n\t0xff, 0x30, 0x02, 0xbb, 0xff, 0xd5, 0x00, 0x02, 0x01, 0xe0, 0xff, 0xc9, \n\t0x02, 0x27, 0xff, 0xee, 0x00, 0x15, 0x01, 0x80, 0xff, 0xd4, 0x01, 0x8e, \n\t0xff, 0xf0, 0x01, 0x92, 0xff, 0xed, 0x01, 0x95, 0x00, 0x11, 0x01, 0x9e, \n\t0xff, 0xe0, 0x01, 0xa0, 0xff, 0xe7, 0x01, 0xa2, 0xff, 0xe5, 0x01, 0xa3, \n\t0xff, 0xee, 0x01, 0xc0, 0x00, 0x12, 0x01, 0xdd, 0xff, 0xe9, 0x01, 0xee, \n\t0xff, 0xd7, 0x02, 0x4c, 0xff, 0xd7, 0x02, 0x64, 0xff, 0xd3, 0x02, 0x67, \n\t0xff, 0xd6, 0x02, 0x68, 0xff, 0xc5, 0x02, 0x83, 0xff, 0xe7, 0x02, 0xaf, \n\t0x00, 0x0d, 0x02, 0xb1, 0x00, 0x0c, 0x02, 0xba, 0xff, 0xd6, 0x02, 0xbb, \n\t0xff, 0xf2, 0x03, 0x7e, 0xff, 0xe9, 0x00, 0x01, 0x02, 0x27, 0xff, 0xf1, \n\t0x00, 0x05, 0x00, 0x0c, 0x00, 0x0f, 0x00, 0x40, 0x00, 0x0c, 0x00, 0x55, \n\t0xff, 0xeb, 0x00, 0x60, 0x00, 0x0e, 0x03, 0x7e, 0xff, 0xe7, 0x00, 0x1a, \n\t0x00, 0x22, 0xff, 0xb0, 0x00, 0x57, 0xff, 0xef, 0x00, 0x5a, 0xff, 0xdf, \n\t0x01, 0x45, 0xff, 0xee, 0x01, 0x80, 0xff, 0xe5, 0x01, 0x82, 0xff, 0xd1, \n\t0x01, 0x95, 0x00, 0x11, 0x01, 0x9e, 0xff, 0xc8, 0x01, 0xc0, 0x00, 0x13, \n\t0x01, 0xd8, 0xff, 0xc5, 0x01, 0xee, 0xff, 0xca, 0x02, 0x4c, 0xff, 0x82, \n\t0x02, 0x63, 0xff, 0x65, 0x02, 0x64, 0xff, 0x85, 0x02, 0x67, 0xff, 0x68, \n\t0x02, 0x68, 0xff, 0xdd, 0x02, 0x83, 0xff, 0xf2, 0x02, 0xaf, 0xff, 0xb0, \n\t0x02, 0xb1, 0xff, 0xca, 0x02, 0xb9, 0xff, 0xa8, 0x02, 0xba, 0xff, 0xc7, \n\t0x03, 0x76, 0xff, 0xc4, 0x03, 0x78, 0xff, 0xdd, 0x03, 0x79, 0xff, 0xcd, \n\t0x03, 0x7a, 0xff, 0xf1, 0x03, 0x7b, 0xff, 0xc7, 0x00, 0x07, 0x01, 0xee, \n\t0xff, 0xf0, 0x02, 0x0d, 0xff, 0xf1, 0x02, 0x2b, 0xff, 0xf3, 0x02, 0x4c, \n\t0xff, 0xf1, 0x02, 0xb0, 0xff, 0xf3, 0x02, 0xb2, 0xff, 0xf3, 0x02, 0xba, \n\t0xff, 0xf1, 0x00, 0x05, 0x00, 0x49, 0xff, 0xee, 0x00, 0x5a, 0xff, 0xea, \n\t0x03, 0x76, 0xff, 0xf0, 0x03, 0x78, 0xff, 0xed, 0x03, 0x79, 0xff, 0xf0, \n\t0x00, 0x01, 0x01, 0xee, 0xff, 0xf5, 0x00, 0x08, 0x01, 0xc0, 0x00, 0x15, \n\t0x01, 0xe0, 0x00, 0x15, 0x02, 0x63, 0xff, 0xe4, 0x02, 0x64, 0xff, 0xe5, \n\t0x02, 0x67, 0xff, 0xe4, 0x02, 0xaf, 0xff, 0xe3, 0x02, 0xb1, 0xff, 0xe2, \n\t0x02, 0xb9, 0xff, 0xe4, 0x00, 0x08, 0x01, 0x9e, 0xff, 0xea, 0x01, 0xa1, \n\t0xff, 0xea, 0x01, 0xee, 0xff, 0xea, 0x02, 0x0d, 0xff, 0xf0, 0x02, 0x2b, \n\t0xff, 0xf1, 0x02, 0x4c, 0xff, 0xeb, 0x02, 0xb0, 0xff, 0xf5, 0x02, 0xba, \n\t0xff, 0xec, 0x00, 0x20, 0x00, 0x09, 0xff, 0xe2, 0x00, 0x0c, 0x00, 0x14, \n\t0x00, 0x0d, 0xff, 0xcf, 0x00, 0x40, 0x00, 0x12, 0x00, 0x49, 0xff, 0xea, \n\t0x00, 0x55, 0xff, 0xd8, 0x00, 0x57, 0xff, 0xea, 0x00, 0x60, 0x00, 0x13, \n\t0x00, 0x6d, 0xff, 0xae, 0x00, 0x7d, 0xff, 0xcd, 0x00, 0x88, 0xff, 0xa0, \n\t0x00, 0xa8, 0xff, 0xc1, 0x00, 0xba, 0xff, 0xc0, 0x01, 0x80, 0xff, 0xd0, \n\t0x01, 0x8c, 0xff, 0xea, 0x01, 0x8e, 0xff, 0xee, 0x01, 0x8f, 0xff, 0xc6, \n\t0x01, 0x90, 0x00, 0x0d, 0x01, 0x92, 0xff, 0xe9, 0x01, 0x93, 0xff, 0xd6, \n\t0x01, 0x9a, 0xff, 0xe8, 0x01, 0x9b, 0xff, 0xba, 0x01, 0x9e, 0xff, 0xe9, \n\t0x01, 0xa0, 0xff, 0xcb, 0x01, 0xa1, 0xff, 0xc1, 0x01, 0xa2, 0xff, 0xda, \n\t0x01, 0xa3, 0xff, 0xc7, 0x03, 0x3d, 0xff, 0xd3, 0x03, 0x77, 0xff, 0xef, \n\t0x03, 0x78, 0xff, 0xf3, 0x03, 0x7b, 0xff, 0xf3, 0x03, 0x7e, 0xff, 0xcb, \n\t0x00, 0x07, 0x00, 0x49, 0x00, 0x0d, 0x01, 0x8e, 0xff, 0xf5, 0x01, 0x9a, \n\t0x00, 0x0b, 0x01, 0x9b, 0xff, 0xea, 0x01, 0x9e, 0x00, 0x0c, 0x01, 0xe0, \n\t0xff, 0xc8, 0x02, 0x27, 0xff, 0xf1, 0x00, 0x08, 0x00, 0x88, 0xff, 0xdf, \n\t0x01, 0x79, 0xff, 0xf3, 0x01, 0x7d, 0xff, 0xf0, 0x01, 0x95, 0xff, 0xea, \n\t0x01, 0xc0, 0xff, 0xdf, 0x01, 0xd8, 0xff, 0xe0, 0x02, 0xb9, 0xff, 0xe0, \n\t0x03, 0x77, 0xff, 0xf5, 0x00, 0x01, 0x00, 0x5a, 0x00, 0x0b, 0x00, 0x05, \n\t0x03, 0x76, 0x00, 0x10, 0x03, 0x78, 0x00, 0x0d, 0x03, 0x79, 0x00, 0x10, \n\t0x03, 0x7b, 0x00, 0x0f, 0x03, 0x7e, 0xff, 0xeb, 0x00, 0x01, 0x03, 0x7b, \n\t0x00, 0x0e, 0x00, 0x01, 0x03, 0x7e, 0xff, 0xf0, 0x00, 0x05, 0x03, 0x76, \n\t0x00, 0x0d, 0x03, 0x79, 0x00, 0x0d, 0x03, 0x7b, 0x00, 0x0e, 0x03, 0x7c, \n\t0xff, 0xf5, 0x03, 0x7e, 0xff, 0xec, 0x00, 0x04, 0x03, 0x76, 0xff, 0xee, \n\t0x03, 0x78, 0xff, 0xf5, 0x03, 0x79, 0xff, 0xf1, 0x03, 0x7b, 0xff, 0xf2, \n\t0x00, 0x04, 0x03, 0x76, 0xff, 0xe5, 0x03, 0x78, 0xff, 0xf1, 0x03, 0x79, \n\t0xff, 0xeb, 0x03, 0x7b, 0xff, 0xe9, 0x00, 0x04, 0x03, 0x76, 0xff, 0xea, \n\t0x03, 0x77, 0xff, 0xec, 0x03, 0x79, 0xff, 0xf1, 0x03, 0x7b, 0xff, 0xee, \n\t0x00, 0x06, 0x03, 0x76, 0xff, 0xb4, 0x03, 0x78, 0xff, 0xd5, 0x03, 0x79, \n\t0xff, 0xb7, 0x03, 0x7a, 0xff, 0xec, 0x03, 0x7b, 0xff, 0xbb, 0x03, 0x7e, \n\t0xff, 0xf0, 0x00, 0x01, 0x03, 0x7e, 0xff, 0xeb, 0x00, 0x02, 0x03, 0x78, \n\t0xff, 0xf5, 0x03, 0x79, 0xff, 0xee, 0x00, 0x06, 0x03, 0x76, 0xff, 0xbf, \n\t0x03, 0x78, 0xff, 0xd8, 0x03, 0x79, 0xff, 0xc7, 0x03, 0x7a, 0xff, 0xec, \n\t0x03, 0x7b, 0xff, 0xc0, 0x03, 0x7e, 0xff, 0xf2, 0x00, 0x02, 0x07, 0x50, \n\t0x00, 0x04, 0x00, 0x00, 0x0a, 0x24, 0x14, 0xd8, 0x00, 0x20, 0x00, 0x1d, \n\t0x00, 0x00, 0xff, 0xda, 0xff, 0x88, 0xff, 0xce, 0xff, 0xc5, 0xff, 0xec, \n\t0xff, 0xa6, 0xff, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0xfe, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0xff, 0xe5, 0xff, 0xe8, 0xff, 0xc9, 0xff, 0xf3, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xe3, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xeb, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xe5, 0xff, 0xea, \n\t0xff, 0xd5, 0x00, 0x00, 0xff, 0x87, 0xff, 0xea, 0xff, 0xe9, 0xff, 0xe1, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xed, \n\t0x00, 0x00, 0xff, 0xed, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xef, \n\t0xff, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0xff, 0xe3, 0x00, 0x00, 0xff, 0xe4, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, \n\t0xff, 0xe4, 0x00, 0x11, 0xff, 0xe5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0xff, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0xff, 0xe6, 0x00, 0x00, 0xff, 0xe5, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0xff, 0xe9, 0xff, 0xd8, 0x00, 0x00, 0x00, 0x00, \n\t0xff, 0xa3, 0xff, 0x5e, 0xff, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x01, 0x00, 0x13, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x32, \n\t0xff, 0x33, 0xfe, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0xff, 0xf2, 0xff, 0x85, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0xff, 0xe7, 0xff, 0xe8, 0xff, 0xa3, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x4f, 0xff, 0xf5, \n\t0xff, 0xf3, 0x00, 0x00, 0xff, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0xfe, 0x6e, 0xff, 0xce, 0xff, 0xdd, 0xff, 0x71, \n\t0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0xff, 0xa8, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x94, 0xff, 0xad, 0xff, 0xa7, \n\t0xff, 0xa7, 0xff, 0xb1, 0xff, 0xb4, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, \n\t0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xcb, 0xff, 0xbf, \n\t0xff, 0xaf, 0x00, 0x00, 0xff, 0x7e, 0xff, 0x7c, 0xfe, 0xf1, 0xff, 0xe4, \n\t0x00, 0x00, 0x00, 0x0f, 0xff, 0xf0, 0xff, 0xb3, 0xff, 0xc4, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0xff, 0xb5, 0xff, 0xd2, 0xff, 0xd4, 0x00, 0x00, \n\t0xff, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0xff, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xe4, 0xff, 0xf5, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x66, 0xff, 0xf3, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0xff, 0xd5, 0xff, 0xdf, 0xff, 0xe1, 0x00, 0x00, 0xff, 0xe1, \n\t0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x72, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xed, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0xff, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0xff, 0xe6, 0x00, 0x00, 0xff, 0xeb, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x11, 0xff, 0xeb, 0xff, 0xe1, 0x00, 0x00, 0x00, 0x11, \n\t0xff, 0xd1, 0xff, 0x67, 0xff, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x6c, \n\t0xff, 0xc1, 0xff, 0xbf, 0xff, 0xd8, 0xff, 0xbf, 0xff, 0xc6, 0x00, 0x11, \n\t0x00, 0x12, 0x00, 0x12, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x0d, 0x00, 0x00, \n\t0x00, 0x00, 0xff, 0xd9, 0xff, 0xec, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0xff, 0x6a, 0xff, 0xe3, 0xff, 0xa0, 0x00, 0x11, 0xff, 0xf0, 0xff, 0xe9, \n\t0xff, 0xe2, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, \n\t0xff, 0xeb, 0x00, 0x00, 0xff, 0xeb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0xff, 0xed, 0xff, 0xe5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0xff, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0xff, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0xff, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0xff, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf5, \n\t0x00, 0x00, 0xff, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0xff, 0xf1, 0xff, 0xf1, 0x00, 0x00, 0x00, 0x00, \n\t0xff, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf2, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf3, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf0, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xec, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0xff, 0xf1, 0x00, 0x00, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xeb, 0xff, 0xf0, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0xff, 0xed, \n\t0x00, 0x00, 0xff, 0xec, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0xff, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0xff, 0xf1, 0xff, 0xf3, 0x00, 0x00, \n\t0xff, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0xff, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0xff, 0xd7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xec, 0x00, 0x00, 0xff, 0xd9, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0xff, 0xf0, 0x00, 0x00, 0xff, 0xf0, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x34, \n\t0xff, 0x5e, 0xff, 0x55, 0xff, 0x55, 0xff, 0x66, 0xff, 0x6a, 0x00, 0x07, \n\t0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0xfe, 0x38, 0x00, 0x00, 0x00, 0x00, \n\t0xff, 0x92, 0xff, 0x7d, 0xff, 0x62, 0x00, 0x00, 0xff, 0x0f, 0xff, 0x0c, \n\t0xfe, 0x20, 0xff, 0xbd, 0x00, 0x00, 0x00, 0x05, 0xff, 0xd1, 0xff, 0x6a, \n\t0xff, 0x86, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x9c, 0xff, 0xc8, \n\t0xff, 0xad, 0xff, 0xeb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0xff, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc9, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xa5, 0xff, 0xaf, 0xff, 0xbd, \n\t0xff, 0xae, 0xff, 0xbd, 0xff, 0xd2, 0x00, 0x12, 0x00, 0x00, 0x00, 0x12, \n\t0x00, 0x00, 0xfe, 0x77, 0x00, 0x00, 0x00, 0x00, 0xff, 0xca, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0xff, 0xbb, 0xff, 0xe9, 0xff, 0x3b, 0xff, 0xe9, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xec, 0x00, 0x00, \n\t0xff, 0xec, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0xff, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0xff, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdd, 0x00, 0x00, \n\t0x00, 0x00, 0xff, 0xed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\t0x00, 0x00, 0xff, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x68, \n\t0x00, 0x05, 0x00, 0x0a, 0x00, 0x0f, 0x00, 0x11, 0x00, 0x1d, 0x00, 0x25, \n\t0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, \n\t0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, \n\t0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, \n\t0x00, 0x3d, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x48, 0x00, 0x4b, \n\t0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, 0x55, 0x00, 0x59, \n\t0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x89, 0x00, 0x8a, 0x00, 0x8b, \n\t0x00, 0x8c, 0x00, 0x8d, 0x00, 0x8e, 0x00, 0x8f, 0x00, 0x90, 0x00, 0x91, \n\t0x00, 0x92, 0x00, 0x93, 0x00, 0x94, 0x00, 0x95, 0x00, 0x96, 0x00, 0x97, \n\t0x00, 0x98, 0x00, 0x9b, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, \n\t0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, \n\t0x00, 0xa9, 0x00, 0xaa, 0x00, 0xab, 0x00, 0xac, 0x00, 0xad, 0x00, 0xb3, \n\t0x00, 0xb4, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0xb7, 0x00, 0xb8, 0x00, 0xbf, \n\t0x00, 0xc0, 0x00, 0xc1, 0x00, 0xc3, 0x00, 0xc5, 0x00, 0xc7, 0x00, 0xc8, \n\t0x00, 0xc9, 0x00, 0xca, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, \n\t0x00, 0xcf, 0x00, 0xd0, 0x00, 0xd2, 0x00, 0xd4, 0x00, 0xd5, 0x00, 0xd6, \n\t0x00, 0xd7, 0x00, 0xd8, 0x00, 0xd9, 0x00, 0xda, 0x00, 0xdb, 0x00, 0xdc, \n\t0x00, 0xdd, 0x00, 0xe6, 0x00, 0xe7, 0x00, 0xea, 0x00, 0xec, 0x00, 0xee, \n\t0x00, 0xf0, 0x00, 0xf2, 0x00, 0xf6, 0x00, 0xf8, 0x00, 0xfb, 0x00, 0xfd, \n\t0x00, 0xff, 0x01, 0x01, 0x01, 0x05, 0x01, 0x06, 0x01, 0x07, 0x01, 0x08, \n\t0x01, 0x09, 0x01, 0x0a, 0x01, 0x0b, 0x01, 0x0e, 0x01, 0x0f, 0x01, 0x10, \n\t0x01, 0x11, 0x01, 0x12, 0x01, 0x13, 0x01, 0x17, 0x01, 0x19, 0x01, 0x1b, \n\t0x01, 0x24, 0x01, 0x26, 0x01, 0x28, 0x01, 0x2a, 0x01, 0x2c, 0x01, 0x2e, \n\t0x01, 0x30, 0x01, 0x32, 0x01, 0x34, 0x01, 0x36, 0x01, 0x38, 0x01, 0x39, \n\t0x01, 0x3a, 0x01, 0x3b, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0x3e, 0x01, 0x3f, \n\t0x01, 0x40, 0x01, 0x49, 0x01, 0x51, 0x01, 0x65, 0x01, 0x66, 0x01, 0x67, \n\t0x01, 0x68, 0x01, 0x69, 0x01, 0x6d, 0x01, 0x6e, 0x01, 0x70, 0x01, 0x71, \n\t0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x77, 0x01, 0x78, \n\t0x01, 0x7a, 0x01, 0x7c, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x81, 0x01, 0x84, \n\t0x01, 0x85, 0x01, 0x88, 0x01, 0x8d, 0x01, 0x91, 0x01, 0x97, 0x01, 0x99, \n\t0x01, 0x9b, 0x01, 0xa6, 0x01, 0xac, 0x01, 0xad, 0x01, 0xaf, 0x01, 0xb2, \n\t0x01, 0xb3, 0x01, 0xb4, 0x01, 0xb5, 0x01, 0xb6, 0x01, 0xb8, 0x01, 0xba, \n\t0x01, 0xbb, 0x01, 0xbe, 0x01, 0xbf, 0x01, 0xc1, 0x01, 0xc2, 0x01, 0xc4, \n\t0x01, 0xc6, 0x01, 0xc7, 0x01, 0xc8, 0x01, 0xc9, 0x01, 0xca, 0x01, 0xcc, \n\t0x01, 0xcd, 0x01, 0xce, 0x01, 0xcf, 0x01, 0xd1, 0x01, 0xd2, 0x01, 0xd4, \n\t0x01, 0xd6, 0x01, 0xd8, 0x01, 0xdc, 0x01, 0xdf, 0x01, 0xe1, 0x01, 0xe2, \n\t0x01, 0xea, 0x01, 0xec, 0x01, 0xed, 0x01, 0xef, 0x01, 0xf0, 0x01, 0xf1, \n\t0x01, 0xf6, 0x01, 0xf8, 0x01, 0xf9, 0x01, 0xfc, 0x01, 0xfd, 0x01, 0xff, \n\t0x02, 0x05, 0x02, 0x06, 0x02, 0x0a, 0x02, 0x0e, 0x02, 0x0f, 0x02, 0x1f, \n\t0x02, 0x20, 0x02, 0x21, 0x02, 0x22, 0x02, 0x23, 0x02, 0x3a, 0x02, 0x3b, \n\t0x02, 0x3c, 0x02, 0x3d, 0x02, 0x41, 0x02, 0x42, 0x02, 0x45, 0x02, 0x47, \n\t0x02, 0x49, 0x02, 0x4b, 0x02, 0x4d, 0x02, 0x55, 0x02, 0x56, 0x02, 0x57, \n\t0x02, 0x59, 0x02, 0x5a, 0x02, 0x5b, 0x02, 0x5d, 0x02, 0x5e, 0x02, 0x66, \n\t0x02, 0x6b, 0x02, 0x6c, 0x02, 0x6d, 0x02, 0x74, 0x02, 0x78, 0x02, 0x7a, \n\t0x02, 0x7c, 0x02, 0x7e, 0x02, 0x81, 0x02, 0x82, 0x02, 0x84, 0x02, 0x86, \n\t0x02, 0x87, 0x02, 0x88, 0x02, 0x91, 0x02, 0x92, 0x02, 0x96, 0x02, 0x98, \n\t0x02, 0x99, 0x02, 0x9a, 0x02, 0x9b, 0x02, 0x9c, 0x02, 0x9d, 0x02, 0x9e, \n\t0x02, 0xa1, 0x02, 0xa2, 0x02, 0xa6, 0x02, 0xa7, 0x02, 0xa8, 0x02, 0xc0, \n\t0x02, 0xc1, 0x02, 0xc2, 0x02, 0xc3, 0x02, 0xc5, 0x02, 0xc7, 0x02, 0xca, \n\t0x02, 0xcc, 0x02, 0xce, 0x02, 0xd0, 0x02, 0xd2, 0x02, 0xd4, 0x02, 0xd6, \n\t0x02, 0xd8, 0x02, 0xda, 0x02, 0xdc, 0x02, 0xde, 0x02, 0xe0, 0x02, 0xe1, \n\t0x02, 0xe2, 0x02, 0xe3, 0x02, 0xe4, 0x02, 0xe5, 0x02, 0xe6, 0x02, 0xe7, \n\t0x02, 0xe8, 0x02, 0xe9, 0x02, 0xea, 0x02, 0xeb, 0x02, 0xec, 0x02, 0xed, \n\t0x02, 0xee, 0x02, 0xef, 0x02, 0xf0, 0x02, 0xf1, 0x02, 0xf3, 0x02, 0xf5, \n\t0x02, 0xf6, 0x02, 0xf7, 0x02, 0xf8, 0x02, 0xf9, 0x02, 0xfa, 0x02, 0xfb, \n\t0x02, 0xfc, 0x02, 0xfd, 0x02, 0xfe, 0x02, 0xff, 0x03, 0x00, 0x03, 0x01, \n\t0x03, 0x02, 0x03, 0x0a, 0x03, 0x0d, 0x03, 0x0f, 0x03, 0x1b, 0x03, 0x1c, \n\t0x03, 0x1d, 0x03, 0x1e, 0x03, 0x1f, 0x03, 0x20, 0x03, 0x21, 0x03, 0x22, \n\t0x03, 0x23, 0x03, 0x34, 0x03, 0x35, 0x03, 0x36, 0x03, 0x37, 0x03, 0x38, \n\t0x03, 0x39, 0x03, 0x3a, 0x03, 0x3e, 0x03, 0x3f, 0x03, 0x41, 0x03, 0x42, \n\t0x00, 0x02, 0x01, 0xc8, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x10, \n\t0x00, 0x10, 0x00, 0x00, 0x00, 0x11, 0x00, 0x11, 0x00, 0x01, 0x00, 0x12, \n\t0x00, 0x1c, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x01, 0x00, 0x1e, \n\t0x00, 0x24, 0x00, 0x00, 0x00, 0x25, 0x00, 0x25, 0x00, 0x02, 0x00, 0x26, \n\t0x00, 0x26, 0x00, 0x03, 0x00, 0x27, 0x00, 0x27, 0x00, 0x04, 0x00, 0x28, \n\t0x00, 0x28, 0x00, 0x05, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x2b, \n\t0x00, 0x2c, 0x00, 0x06, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x07, 0x00, 0x2e, \n\t0x00, 0x2e, 0x00, 0x08, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x09, 0x00, 0x30, \n\t0x00, 0x31, 0x00, 0x06, 0x00, 0x32, 0x00, 0x32, 0x00, 0x04, 0x00, 0x33, \n\t0x00, 0x33, 0x00, 0x0a, 0x00, 0x34, 0x00, 0x36, 0x00, 0x00, 0x00, 0x37, \n\t0x00, 0x37, 0x00, 0x0b, 0x00, 0x38, 0x00, 0x38, 0x00, 0x07, 0x00, 0x39, \n\t0x00, 0x39, 0x00, 0x0c, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x0d, 0x00, 0x3b, \n\t0x00, 0x3b, 0x00, 0x0e, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x0f, 0x00, 0x3d, \n\t0x00, 0x3d, 0x00, 0x10, 0x00, 0x3e, 0x00, 0x43, 0x00, 0x00, 0x00, 0x44, \n\t0x00, 0x44, 0x00, 0x11, 0x00, 0x45, 0x00, 0x45, 0x00, 0x12, 0x00, 0x46, \n\t0x00, 0x46, 0x00, 0x13, 0x00, 0x47, 0x00, 0x47, 0x00, 0x00, 0x00, 0x48, \n\t0x00, 0x48, 0x00, 0x14, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x00, 0x00, 0x4b, \n\t0x00, 0x4b, 0x00, 0x15, 0x00, 0x4c, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x50, \n\t0x00, 0x51, 0x00, 0x15, 0x00, 0x52, 0x00, 0x52, 0x00, 0x16, 0x00, 0x53, \n\t0x00, 0x53, 0x00, 0x12, 0x00, 0x54, 0x00, 0x54, 0x00, 0x00, 0x00, 0x55, \n\t0x00, 0x55, 0x00, 0x17, 0x00, 0x56, 0x00, 0x58, 0x00, 0x00, 0x00, 0x59, \n\t0x00, 0x59, 0x00, 0x18, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x5b, \n\t0x00, 0x5b, 0x00, 0x19, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x18, 0x00, 0x5d, \n\t0x00, 0x5d, 0x00, 0x1a, 0x00, 0x5e, 0x00, 0x88, 0x00, 0x00, 0x00, 0x89, \n\t0x00, 0x89, 0x00, 0x03, 0x00, 0x8a, 0x00, 0x8d, 0x00, 0x05, 0x00, 0x8e, \n\t0x00, 0x91, 0x00, 0x06, 0x00, 0x92, 0x00, 0x92, 0x00, 0x04, 0x00, 0x93, \n\t0x00, 0x93, 0x00, 0x06, 0x00, 0x94, 0x00, 0x98, 0x00, 0x04, 0x00, 0x99, \n\t0x00, 0x9a, 0x00, 0x00, 0x00, 0x9b, 0x00, 0x9e, 0x00, 0x07, 0x00, 0x9f, \n\t0x00, 0x9f, 0x00, 0x0f, 0x00, 0xa0, 0x00, 0xa1, 0x00, 0x00, 0x00, 0xa2, \n\t0x00, 0xa7, 0x00, 0x11, 0x00, 0xa8, 0x00, 0xa8, 0x00, 0x00, 0x00, 0xa9, \n\t0x00, 0xa9, 0x00, 0x13, 0x00, 0xaa, 0x00, 0xad, 0x00, 0x14, 0x00, 0xae, \n\t0x00, 0xb2, 0x00, 0x00, 0x00, 0xb3, 0x00, 0xb3, 0x00, 0x15, 0x00, 0xb4, \n\t0x00, 0xb8, 0x00, 0x16, 0x00, 0xb9, 0x00, 0xbe, 0x00, 0x00, 0x00, 0xbf, \n\t0x00, 0xbf, 0x00, 0x18, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0x12, 0x00, 0xc1, \n\t0x00, 0xc1, 0x00, 0x18, 0x00, 0xc2, 0x00, 0xc2, 0x00, 0x00, 0x00, 0xc3, \n\t0x00, 0xc3, 0x00, 0x11, 0x00, 0xc4, 0x00, 0xc4, 0x00, 0x00, 0x00, 0xc5, \n\t0x00, 0xc5, 0x00, 0x11, 0x00, 0xc6, 0x00, 0xc6, 0x00, 0x00, 0x00, 0xc7, \n\t0x00, 0xc7, 0x00, 0x11, 0x00, 0xc8, 0x00, 0xc8, 0x00, 0x03, 0x00, 0xc9, \n\t0x00, 0xc9, 0x00, 0x13, 0x00, 0xca, 0x00, 0xca, 0x00, 0x03, 0x00, 0xcb, \n\t0x00, 0xcb, 0x00, 0x13, 0x00, 0xcc, 0x00, 0xcc, 0x00, 0x03, 0x00, 0xcd, \n\t0x00, 0xcd, 0x00, 0x13, 0x00, 0xce, 0x00, 0xce, 0x00, 0x03, 0x00, 0xcf, \n\t0x00, 0xcf, 0x00, 0x13, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0x04, 0x00, 0xd1, \n\t0x00, 0xd1, 0x00, 0x00, 0x00, 0xd2, 0x00, 0xd2, 0x00, 0x04, 0x00, 0xd3, \n\t0x00, 0xd3, 0x00, 0x00, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0x05, 0x00, 0xd5, \n\t0x00, 0xd5, 0x00, 0x14, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0x05, 0x00, 0xd7, \n\t0x00, 0xd7, 0x00, 0x14, 0x00, 0xd8, 0x00, 0xd8, 0x00, 0x05, 0x00, 0xd9, \n\t0x00, 0xd9, 0x00, 0x14, 0x00, 0xda, 0x00, 0xda, 0x00, 0x05, 0x00, 0xdb, \n\t0x00, 0xdb, 0x00, 0x14, 0x00, 0xdc, 0x00, 0xdc, 0x00, 0x05, 0x00, 0xdd, \n\t0x00, 0xdd, 0x00, 0x14, 0x00, 0xde, 0x00, 0xe5, 0x00, 0x00, 0x00, 0xe6, \n\t0x00, 0xe6, 0x00, 0x06, 0x00, 0xe7, 0x00, 0xe7, 0x00, 0x15, 0x00, 0xe8, \n\t0x00, 0xe9, 0x00, 0x00, 0x00, 0xea, 0x00, 0xea, 0x00, 0x06, 0x00, 0xeb, \n\t0x00, 0xeb, 0x00, 0x00, 0x00, 0xec, 0x00, 0xec, 0x00, 0x06, 0x00, 0xed, \n\t0x00, 0xed, 0x00, 0x00, 0x00, 0xee, 0x00, 0xee, 0x00, 0x06, 0x00, 0xef, \n\t0x00, 0xef, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x06, 0x00, 0xf1, \n\t0x00, 0xf1, 0x00, 0x00, 0x00, 0xf2, 0x00, 0xf2, 0x00, 0x06, 0x00, 0xf3, \n\t0x00, 0xf5, 0x00, 0x00, 0x00, 0xf6, 0x00, 0xf6, 0x00, 0x07, 0x00, 0xf7, \n\t0x00, 0xf7, 0x00, 0x00, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0x08, 0x00, 0xf9, \n\t0x00, 0xfa, 0x00, 0x00, 0x00, 0xfb, 0x00, 0xfb, 0x00, 0x09, 0x00, 0xfc, \n\t0x00, 0xfc, 0x00, 0x00, 0x00, 0xfd, 0x00, 0xfd, 0x00, 0x09, 0x00, 0xfe, \n\t0x00, 0xfe, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x09, 0x01, 0x00, \n\t0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x09, 0x01, 0x02, \n\t0x01, 0x04, 0x00, 0x00, 0x01, 0x05, 0x01, 0x05, 0x00, 0x06, 0x01, 0x06, \n\t0x01, 0x06, 0x00, 0x15, 0x01, 0x07, 0x01, 0x07, 0x00, 0x06, 0x01, 0x08, \n\t0x01, 0x08, 0x00, 0x15, 0x01, 0x09, 0x01, 0x09, 0x00, 0x06, 0x01, 0x0a, \n\t0x01, 0x0b, 0x00, 0x15, 0x01, 0x0c, 0x01, 0x0d, 0x00, 0x00, 0x01, 0x0e, \n\t0x01, 0x0e, 0x00, 0x04, 0x01, 0x0f, 0x01, 0x0f, 0x00, 0x16, 0x01, 0x10, \n\t0x01, 0x10, 0x00, 0x04, 0x01, 0x11, 0x01, 0x11, 0x00, 0x16, 0x01, 0x12, \n\t0x01, 0x12, 0x00, 0x04, 0x01, 0x13, 0x01, 0x13, 0x00, 0x16, 0x01, 0x14, \n\t0x01, 0x16, 0x00, 0x00, 0x01, 0x17, 0x01, 0x17, 0x00, 0x17, 0x01, 0x18, \n\t0x01, 0x18, 0x00, 0x00, 0x01, 0x19, 0x01, 0x19, 0x00, 0x17, 0x01, 0x1a, \n\t0x01, 0x1a, 0x00, 0x00, 0x01, 0x1b, 0x01, 0x1b, 0x00, 0x17, 0x01, 0x1c, \n\t0x01, 0x23, 0x00, 0x00, 0x01, 0x24, 0x01, 0x24, 0x00, 0x0b, 0x01, 0x25, \n\t0x01, 0x25, 0x00, 0x00, 0x01, 0x26, 0x01, 0x26, 0x00, 0x0b, 0x01, 0x27, \n\t0x01, 0x27, 0x00, 0x00, 0x01, 0x28, 0x01, 0x28, 0x00, 0x0b, 0x01, 0x29, \n\t0x01, 0x29, 0x00, 0x00, 0x01, 0x2a, 0x01, 0x2a, 0x00, 0x07, 0x01, 0x2b, \n\t0x01, 0x2b, 0x00, 0x00, 0x01, 0x2c, 0x01, 0x2c, 0x00, 0x07, 0x01, 0x2d, \n\t0x01, 0x2d, 0x00, 0x00, 0x01, 0x2e, 0x01, 0x2e, 0x00, 0x07, 0x01, 0x2f, \n\t0x01, 0x2f, 0x00, 0x00, 0x01, 0x30, 0x01, 0x30, 0x00, 0x07, 0x01, 0x31, \n\t0x01, 0x31, 0x00, 0x00, 0x01, 0x32, 0x01, 0x32, 0x00, 0x07, 0x01, 0x33, \n\t0x01, 0x33, 0x00, 0x00, 0x01, 0x34, 0x01, 0x34, 0x00, 0x07, 0x01, 0x35, \n\t0x01, 0x35, 0x00, 0x00, 0x01, 0x36, 0x01, 0x36, 0x00, 0x0d, 0x01, 0x37, \n\t0x01, 0x37, 0x00, 0x00, 0x01, 0x38, 0x01, 0x38, 0x00, 0x0f, 0x01, 0x39, \n\t0x01, 0x39, 0x00, 0x18, 0x01, 0x3a, 0x01, 0x3a, 0x00, 0x0f, 0x01, 0x3b, \n\t0x01, 0x3b, 0x00, 0x10, 0x01, 0x3c, 0x01, 0x3c, 0x00, 0x1a, 0x01, 0x3d, \n\t0x01, 0x3d, 0x00, 0x10, 0x01, 0x3e, 0x01, 0x3e, 0x00, 0x1a, 0x01, 0x3f, \n\t0x01, 0x3f, 0x00, 0x10, 0x01, 0x40, 0x01, 0x40, 0x00, 0x1a, 0x01, 0x41, \n\t0x01, 0x48, 0x00, 0x00, 0x01, 0x49, 0x01, 0x49, 0x00, 0x11, 0x01, 0x4a, \n\t0x01, 0x64, 0x00, 0x00, 0x01, 0x65, 0x01, 0x65, 0x00, 0x05, 0x01, 0x66, \n\t0x01, 0x67, 0x00, 0x06, 0x01, 0x68, 0x01, 0x68, 0x00, 0x04, 0x01, 0x69, \n\t0x01, 0x69, 0x00, 0x0f, 0x01, 0x6a, 0x01, 0x6c, 0x00, 0x00, 0x01, 0x6d, \n\t0x01, 0x6d, 0x00, 0x02, 0x01, 0x6e, 0x01, 0x6e, 0x00, 0x1b, 0x01, 0x6f, \n\t0x01, 0x6f, 0x00, 0x00, 0x01, 0x70, 0x01, 0x70, 0x00, 0x05, 0x01, 0x71, \n\t0x01, 0x71, 0x00, 0x10, 0x01, 0x72, 0x01, 0x72, 0x00, 0x06, 0x01, 0x73, \n\t0x01, 0x73, 0x00, 0x04, 0x01, 0x74, 0x01, 0x74, 0x00, 0x06, 0x01, 0x75, \n\t0x01, 0x75, 0x00, 0x08, 0x01, 0x76, 0x01, 0x76, 0x00, 0x00, 0x01, 0x77, \n\t0x01, 0x78, 0x00, 0x06, 0x01, 0x79, 0x01, 0x79, 0x00, 0x00, 0x01, 0x7a, \n\t0x01, 0x7a, 0x00, 0x04, 0x01, 0x7b, 0x01, 0x7b, 0x00, 0x00, 0x01, 0x7c, \n\t0x01, 0x7c, 0x00, 0x0a, 0x01, 0x7d, 0x01, 0x7d, 0x00, 0x00, 0x01, 0x7e, \n\t0x01, 0x7e, 0x00, 0x0b, 0x01, 0x7f, 0x01, 0x7f, 0x00, 0x0f, 0x01, 0x80, \n\t0x01, 0x80, 0x00, 0x00, 0x01, 0x81, 0x01, 0x81, 0x00, 0x0e, 0x01, 0x82, \n\t0x01, 0x83, 0x00, 0x00, 0x01, 0x84, 0x01, 0x84, 0x00, 0x06, 0x01, 0x85, \n\t0x01, 0x85, 0x00, 0x0f, 0x01, 0x86, 0x01, 0x87, 0x00, 0x00, 0x01, 0x88, \n\t0x01, 0x88, 0x00, 0x15, 0x01, 0x89, 0x01, 0x8c, 0x00, 0x00, 0x01, 0x8d, \n\t0x01, 0x8d, 0x00, 0x18, 0x01, 0x8e, 0x01, 0x90, 0x00, 0x00, 0x01, 0x91, \n\t0x01, 0x91, 0x00, 0x15, 0x01, 0x92, 0x01, 0x96, 0x00, 0x00, 0x01, 0x97, \n\t0x01, 0x97, 0x00, 0x18, 0x01, 0x98, 0x01, 0x98, 0x00, 0x00, 0x01, 0x99, \n\t0x01, 0x99, 0x00, 0x16, 0x01, 0x9a, 0x01, 0x9a, 0x00, 0x00, 0x01, 0x9b, \n\t0x01, 0x9b, 0x00, 0x12, 0x01, 0x9c, 0x01, 0xa5, 0x00, 0x00, 0x01, 0xa6, \n\t0x01, 0xa6, 0x00, 0x16, 0x01, 0xa7, 0x01, 0xab, 0x00, 0x00, 0x01, 0xac, \n\t0x01, 0xad, 0x00, 0x05, 0x01, 0xae, 0x01, 0xae, 0x00, 0x00, 0x01, 0xaf, \n\t0x01, 0xaf, 0x00, 0x1b, 0x01, 0xb0, 0x01, 0xb1, 0x00, 0x00, 0x01, 0xb2, \n\t0x01, 0xb3, 0x00, 0x06, 0x01, 0xb4, 0x01, 0xb4, 0x00, 0x07, 0x01, 0xb5, \n\t0x01, 0xb6, 0x00, 0x1c, 0x01, 0xb7, 0x01, 0xb7, 0x00, 0x00, 0x01, 0xb8, \n\t0x01, 0xb8, 0x00, 0x08, 0x01, 0xb9, 0x01, 0xb9, 0x00, 0x00, 0x01, 0xba, \n\t0x01, 0xba, 0x00, 0x1d, 0x01, 0xbb, 0x01, 0xbb, 0x00, 0x06, 0x01, 0xbc, \n\t0x01, 0xbd, 0x00, 0x00, 0x01, 0xbe, 0x01, 0xbe, 0x00, 0x02, 0x01, 0xbf, \n\t0x01, 0xbf, 0x00, 0x1b, 0x01, 0xc0, 0x01, 0xc0, 0x00, 0x00, 0x01, 0xc1, \n\t0x01, 0xc1, 0x00, 0x05, 0x01, 0xc2, 0x01, 0xc2, 0x00, 0x0e, 0x01, 0xc3, \n\t0x01, 0xc3, 0x00, 0x00, 0x01, 0xc4, 0x01, 0xc4, 0x00, 0x06, 0x01, 0xc5, \n\t0x01, 0xc5, 0x00, 0x00, 0x01, 0xc6, 0x01, 0xc6, 0x00, 0x08, 0x01, 0xc7, \n\t0x01, 0xc9, 0x00, 0x06, 0x01, 0xca, 0x01, 0xca, 0x00, 0x04, 0x01, 0xcb, \n\t0x01, 0xcb, 0x00, 0x00, 0x01, 0xcc, 0x01, 0xcc, 0x00, 0x0a, 0x01, 0xcd, \n\t0x01, 0xcd, 0x00, 0x03, 0x01, 0xce, 0x01, 0xce, 0x00, 0x0b, 0x01, 0xcf, \n\t0x01, 0xcf, 0x00, 0x1d, 0x01, 0xd0, 0x01, 0xd0, 0x00, 0x00, 0x01, 0xd1, \n\t0x01, 0xd1, 0x00, 0x0e, 0x01, 0xd2, 0x01, 0xd2, 0x00, 0x06, 0x01, 0xd3, \n\t0x01, 0xd3, 0x00, 0x00, 0x01, 0xd4, 0x01, 0xd4, 0x00, 0x06, 0x01, 0xd5, \n\t0x01, 0xd5, 0x00, 0x00, 0x01, 0xd6, 0x01, 0xd6, 0x00, 0x1c, 0x01, 0xd7, \n\t0x01, 0xd7, 0x00, 0x00, 0x01, 0xd8, 0x01, 0xd8, 0x00, 0x1c, 0x01, 0xd9, \n\t0x01, 0xdb, 0x00, 0x00, 0x01, 0xdc, 0x01, 0xdc, 0x00, 0x11, 0x01, 0xdd, \n\t0x01, 0xde, 0x00, 0x00, 0x01, 0xdf, 0x01, 0xdf, 0x00, 0x1e, 0x01, 0xe0, \n\t0x01, 0xe0, 0x00, 0x00, 0x01, 0xe1, 0x01, 0xe1, 0x00, 0x14, 0x01, 0xe2, \n\t0x01, 0xe2, 0x00, 0x19, 0x01, 0xe3, 0x01, 0xe9, 0x00, 0x00, 0x01, 0xea, \n\t0x01, 0xea, 0x00, 0x16, 0x01, 0xeb, 0x01, 0xeb, 0x00, 0x00, 0x01, 0xec, \n\t0x01, 0xec, 0x00, 0x12, 0x01, 0xed, 0x01, 0xed, 0x00, 0x13, 0x01, 0xee, \n\t0x01, 0xee, 0x00, 0x00, 0x01, 0xef, 0x01, 0xef, 0x00, 0x18, 0x01, 0xf0, \n\t0x01, 0xf0, 0x00, 0x12, 0x01, 0xf1, 0x01, 0xf1, 0x00, 0x19, 0x01, 0xf2, \n\t0x01, 0xf5, 0x00, 0x00, 0x01, 0xf6, 0x01, 0xf6, 0x00, 0x1f, 0x01, 0xf7, \n\t0x01, 0xf7, 0x00, 0x00, 0x01, 0xf8, 0x01, 0xf8, 0x00, 0x1f, 0x01, 0xf9, \n\t0x01, 0xf9, 0x00, 0x12, 0x01, 0xfa, 0x01, 0xfb, 0x00, 0x00, 0x01, 0xfc, \n\t0x01, 0xfd, 0x00, 0x14, 0x01, 0xfe, 0x01, 0xfe, 0x00, 0x00, 0x01, 0xff, \n\t0x01, 0xff, 0x00, 0x1e, 0x02, 0x00, 0x02, 0x04, 0x00, 0x00, 0x02, 0x05, \n\t0x02, 0x06, 0x00, 0x1f, 0x02, 0x07, 0x02, 0x09, 0x00, 0x00, 0x02, 0x0a, \n\t0x02, 0x0a, 0x00, 0x18, 0x02, 0x0b, 0x02, 0x0d, 0x00, 0x00, 0x02, 0x0e, \n\t0x02, 0x0e, 0x00, 0x1c, 0x02, 0x0f, 0x02, 0x0f, 0x00, 0x1f, 0x02, 0x10, \n\t0x02, 0x1e, 0x00, 0x00, 0x02, 0x1f, 0x02, 0x1f, 0x00, 0x16, 0x02, 0x20, \n\t0x02, 0x20, 0x00, 0x0c, 0x02, 0x21, 0x02, 0x21, 0x00, 0x18, 0x02, 0x22, \n\t0x02, 0x22, 0x00, 0x0c, 0x02, 0x23, 0x02, 0x23, 0x00, 0x18, 0x02, 0x24, \n\t0x02, 0x39, 0x00, 0x00, 0x02, 0x3a, 0x02, 0x3a, 0x00, 0x12, 0x02, 0x3b, \n\t0x02, 0x3b, 0x00, 0x1b, 0x02, 0x3c, 0x02, 0x3c, 0x00, 0x1e, 0x02, 0x3d, \n\t0x02, 0x3d, 0x00, 0x1b, 0x02, 0x3e, 0x02, 0x40, 0x00, 0x00, 0x02, 0x41, \n\t0x02, 0x41, 0x00, 0x0e, 0x02, 0x42, 0x02, 0x42, 0x00, 0x19, 0x02, 0x43, \n\t0x02, 0x44, 0x00, 0x00, 0x02, 0x45, 0x02, 0x45, 0x00, 0x08, 0x02, 0x46, \n\t0x02, 0x46, 0x00, 0x00, 0x02, 0x47, 0x02, 0x47, 0x00, 0x08, 0x02, 0x48, \n\t0x02, 0x48, 0x00, 0x00, 0x02, 0x49, 0x02, 0x49, 0x00, 0x08, 0x02, 0x4a, \n\t0x02, 0x4a, 0x00, 0x00, 0x02, 0x4b, 0x02, 0x4b, 0x00, 0x08, 0x02, 0x4c, \n\t0x02, 0x4c, 0x00, 0x00, 0x02, 0x4d, 0x02, 0x4d, 0x00, 0x06, 0x02, 0x4e, \n\t0x02, 0x54, 0x00, 0x00, 0x02, 0x55, 0x02, 0x55, 0x00, 0x03, 0x02, 0x56, \n\t0x02, 0x56, 0x00, 0x13, 0x02, 0x57, 0x02, 0x57, 0x00, 0x0b, 0x02, 0x58, \n\t0x02, 0x58, 0x00, 0x00, 0x02, 0x59, 0x02, 0x59, 0x00, 0x0f, 0x02, 0x5a, \n\t0x02, 0x5a, 0x00, 0x18, 0x02, 0x5b, 0x02, 0x5b, 0x00, 0x0f, 0x02, 0x5c, \n\t0x02, 0x5c, 0x00, 0x00, 0x02, 0x5d, 0x02, 0x5d, 0x00, 0x0e, 0x02, 0x5e, \n\t0x02, 0x5e, 0x00, 0x19, 0x02, 0x5f, 0x02, 0x65, 0x00, 0x00, 0x02, 0x66, \n\t0x02, 0x66, 0x00, 0x15, 0x02, 0x67, 0x02, 0x6a, 0x00, 0x00, 0x02, 0x6b, \n\t0x02, 0x6b, 0x00, 0x06, 0x02, 0x6c, 0x02, 0x6c, 0x00, 0x0e, 0x02, 0x6d, \n\t0x02, 0x6d, 0x00, 0x19, 0x02, 0x6e, 0x02, 0x73, 0x00, 0x00, 0x02, 0x74, \n\t0x02, 0x74, 0x00, 0x06, 0x02, 0x75, 0x02, 0x77, 0x00, 0x00, 0x02, 0x78, \n\t0x02, 0x78, 0x00, 0x06, 0x02, 0x79, 0x02, 0x79, 0x00, 0x00, 0x02, 0x7a, \n\t0x02, 0x7a, 0x00, 0x06, 0x02, 0x7b, 0x02, 0x7b, 0x00, 0x00, 0x02, 0x7c, \n\t0x02, 0x7c, 0x00, 0x11, 0x02, 0x7d, 0x02, 0x7d, 0x00, 0x00, 0x02, 0x7e, \n\t0x02, 0x7e, 0x00, 0x11, 0x02, 0x7f, 0x02, 0x80, 0x00, 0x00, 0x02, 0x81, \n\t0x02, 0x81, 0x00, 0x05, 0x02, 0x82, 0x02, 0x82, 0x00, 0x14, 0x02, 0x83, \n\t0x02, 0x83, 0x00, 0x00, 0x02, 0x84, 0x02, 0x84, 0x00, 0x14, 0x02, 0x85, \n\t0x02, 0x85, 0x00, 0x00, 0x02, 0x86, 0x02, 0x86, 0x00, 0x14, 0x02, 0x87, \n\t0x02, 0x87, 0x00, 0x0e, 0x02, 0x88, 0x02, 0x88, 0x00, 0x19, 0x02, 0x89, \n\t0x02, 0x90, 0x00, 0x00, 0x02, 0x91, 0x02, 0x91, 0x00, 0x04, 0x02, 0x92, \n\t0x02, 0x92, 0x00, 0x16, 0x02, 0x93, 0x02, 0x95, 0x00, 0x00, 0x02, 0x96, \n\t0x02, 0x96, 0x00, 0x16, 0x02, 0x97, 0x02, 0x97, 0x00, 0x00, 0x02, 0x98, \n\t0x02, 0x98, 0x00, 0x12, 0x02, 0x99, 0x02, 0x99, 0x00, 0x1d, 0x02, 0x9a, \n\t0x02, 0x9a, 0x00, 0x18, 0x02, 0x9b, 0x02, 0x9b, 0x00, 0x1d, 0x02, 0x9c, \n\t0x02, 0x9c, 0x00, 0x18, 0x02, 0x9d, 0x02, 0x9d, 0x00, 0x1d, 0x02, 0x9e, \n\t0x02, 0x9e, 0x00, 0x18, 0x02, 0x9f, 0x02, 0xa0, 0x00, 0x00, 0x02, 0xa1, \n\t0x02, 0xa1, 0x00, 0x1b, 0x02, 0xa2, 0x02, 0xa2, 0x00, 0x1e, 0x02, 0xa3, \n\t0x02, 0xa5, 0x00, 0x00, 0x02, 0xa6, 0x02, 0xa6, 0x00, 0x1e, 0x02, 0xa7, \n\t0x02, 0xa7, 0x00, 0x0e, 0x02, 0xa8, 0x02, 0xa8, 0x00, 0x19, 0x02, 0xa9, \n\t0x02, 0xbf, 0x00, 0x00, 0x02, 0xc0, 0x02, 0xc0, 0x00, 0x11, 0x02, 0xc1, \n\t0x02, 0xc1, 0x00, 0x06, 0x02, 0xc2, 0x02, 0xc2, 0x00, 0x15, 0x02, 0xc3, \n\t0x02, 0xc3, 0x00, 0x0d, 0x02, 0xc4, 0x02, 0xc4, 0x00, 0x00, 0x02, 0xc5, \n\t0x02, 0xc5, 0x00, 0x0d, 0x02, 0xc6, 0x02, 0xc6, 0x00, 0x00, 0x02, 0xc7, \n\t0x02, 0xc7, 0x00, 0x0d, 0x02, 0xc8, 0x02, 0xc9, 0x00, 0x00, 0x02, 0xca, \n\t0x02, 0xca, 0x00, 0x11, 0x02, 0xcb, 0x02, 0xcb, 0x00, 0x00, 0x02, 0xcc, \n\t0x02, 0xcc, 0x00, 0x11, 0x02, 0xcd, 0x02, 0xcd, 0x00, 0x00, 0x02, 0xce, \n\t0x02, 0xce, 0x00, 0x11, 0x02, 0xcf, 0x02, 0xcf, 0x00, 0x00, 0x02, 0xd0, \n\t0x02, 0xd0, 0x00, 0x11, 0x02, 0xd1, 0x02, 0xd1, 0x00, 0x00, 0x02, 0xd2, \n\t0x02, 0xd2, 0x00, 0x11, 0x02, 0xd3, 0x02, 0xd3, 0x00, 0x00, 0x02, 0xd4, \n\t0x02, 0xd4, 0x00, 0x11, 0x02, 0xd5, 0x02, 0xd5, 0x00, 0x00, 0x02, 0xd6, \n\t0x02, 0xd6, 0x00, 0x11, 0x02, 0xd7, 0x02, 0xd7, 0x00, 0x00, 0x02, 0xd8, \n\t0x02, 0xd8, 0x00, 0x11, 0x02, 0xd9, 0x02, 0xd9, 0x00, 0x00, 0x02, 0xda, \n\t0x02, 0xda, 0x00, 0x11, 0x02, 0xdb, 0x02, 0xdb, 0x00, 0x00, 0x02, 0xdc, \n\t0x02, 0xdc, 0x00, 0x11, 0x02, 0xdd, 0x02, 0xdd, 0x00, 0x00, 0x02, 0xde, \n\t0x02, 0xde, 0x00, 0x11, 0x02, 0xdf, 0x02, 0xdf, 0x00, 0x00, 0x02, 0xe0, \n\t0x02, 0xe0, 0x00, 0x11, 0x02, 0xe1, 0x02, 0xe1, 0x00, 0x05, 0x02, 0xe2, \n\t0x02, 0xe2, 0x00, 0x14, 0x02, 0xe3, 0x02, 0xe3, 0x00, 0x05, 0x02, 0xe4, \n\t0x02, 0xe4, 0x00, 0x14, 0x02, 0xe5, 0x02, 0xe5, 0x00, 0x05, 0x02, 0xe6, \n\t0x02, 0xe6, 0x00, 0x14, 0x02, 0xe7, 0x02, 0xe7, 0x00, 0x05, 0x02, 0xe8, \n\t0x02, 0xe8, 0x00, 0x14, 0x02, 0xe9, 0x02, 0xe9, 0x00, 0x05, 0x02, 0xea, \n\t0x02, 0xea, 0x00, 0x14, 0x02, 0xeb, 0x02, 0xeb, 0x00, 0x05, 0x02, 0xec, \n\t0x02, 0xec, 0x00, 0x14, 0x02, 0xed, 0x02, 0xed, 0x00, 0x05, 0x02, 0xee, \n\t0x02, 0xee, 0x00, 0x14, 0x02, 0xef, 0x02, 0xef, 0x00, 0x05, 0x02, 0xf0, \n\t0x02, 0xf0, 0x00, 0x14, 0x02, 0xf1, 0x02, 0xf1, 0x00, 0x06, 0x02, 0xf2, \n\t0x02, 0xf2, 0x00, 0x00, 0x02, 0xf3, 0x02, 0xf3, 0x00, 0x06, 0x02, 0xf4, \n\t0x02, 0xf4, 0x00, 0x00, 0x02, 0xf5, 0x02, 0xf5, 0x00, 0x04, 0x02, 0xf6, \n\t0x02, 0xf6, 0x00, 0x16, 0x02, 0xf7, 0x02, 0xf7, 0x00, 0x04, 0x02, 0xf8, \n\t0x02, 0xf8, 0x00, 0x16, 0x02, 0xf9, 0x02, 0xf9, 0x00, 0x04, 0x02, 0xfa, \n\t0x02, 0xfa, 0x00, 0x16, 0x02, 0xfb, 0x02, 0xfb, 0x00, 0x04, 0x02, 0xfc, \n\t0x02, 0xfc, 0x00, 0x16, 0x02, 0xfd, 0x02, 0xfd, 0x00, 0x04, 0x02, 0xfe, \n\t0x02, 0xfe, 0x00, 0x16, 0x02, 0xff, 0x02, 0xff, 0x00, 0x04, 0x03, 0x00, \n\t0x03, 0x00, 0x00, 0x16, 0x03, 0x01, 0x03, 0x01, 0x00, 0x04, 0x03, 0x02, \n\t0x03, 0x02, 0x00, 0x16, 0x03, 0x03, 0x03, 0x09, 0x00, 0x00, 0x03, 0x0a, \n\t0x03, 0x0a, 0x00, 0x16, 0x03, 0x0b, 0x03, 0x0c, 0x00, 0x00, 0x03, 0x0d, \n\t0x03, 0x0d, 0x00, 0x07, 0x03, 0x0e, 0x03, 0x0e, 0x00, 0x00, 0x03, 0x0f, \n\t0x03, 0x0f, 0x00, 0x07, 0x03, 0x10, 0x03, 0x1a, 0x00, 0x00, 0x03, 0x1b, \n\t0x03, 0x1b, 0x00, 0x0f, 0x03, 0x1c, 0x03, 0x1c, 0x00, 0x18, 0x03, 0x1d, \n\t0x03, 0x1d, 0x00, 0x0f, 0x03, 0x1e, 0x03, 0x1e, 0x00, 0x18, 0x03, 0x1f, \n\t0x03, 0x1f, 0x00, 0x0f, 0x03, 0x20, 0x03, 0x20, 0x00, 0x18, 0x03, 0x21, \n\t0x03, 0x21, 0x00, 0x0f, 0x03, 0x22, 0x03, 0x22, 0x00, 0x18, 0x03, 0x23, \n\t0x03, 0x23, 0x00, 0x04, 0x03, 0x24, 0x03, 0x35, 0x00, 0x00, 0x03, 0x36, \n\t0x03, 0x36, 0x00, 0x01, 0x03, 0x37, 0x03, 0x39, 0x00, 0x00, 0x03, 0x3a, \n\t0x03, 0x3a, 0x00, 0x01, 0x03, 0x3b, 0x03, 0x3d, 0x00, 0x00, 0x03, 0x3e, \n\t0x03, 0x3f, 0x00, 0x01, 0x00, 0x02, 0x01, 0xfd, 0x00, 0x05, 0x00, 0x05, \n\t0x00, 0x01, 0x00, 0x06, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x0a, \n\t0x00, 0x01, 0x00, 0x0b, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x0f, \n\t0x00, 0x0c, 0x00, 0x10, 0x00, 0x10, 0x00, 0x15, 0x00, 0x11, 0x00, 0x11, \n\t0x00, 0x0c, 0x00, 0x12, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x1d, \n\t0x00, 0x0c, 0x00, 0x1e, 0x00, 0x23, 0x00, 0x00, 0x00, 0x24, 0x00, 0x24, \n\t0x00, 0x02, 0x00, 0x25, 0x00, 0x25, 0x00, 0x00, 0x00, 0x26, 0x00, 0x26, \n\t0x00, 0x16, 0x00, 0x27, 0x00, 0x29, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x2a, \n\t0x00, 0x16, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x2d, \n\t0x00, 0x1c, 0x00, 0x2e, 0x00, 0x31, 0x00, 0x00, 0x00, 0x32, 0x00, 0x32, \n\t0x00, 0x16, 0x00, 0x33, 0x00, 0x33, 0x00, 0x00, 0x00, 0x34, 0x00, 0x34, \n\t0x00, 0x16, 0x00, 0x35, 0x00, 0x35, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, \n\t0x00, 0x19, 0x00, 0x37, 0x00, 0x37, 0x00, 0x08, 0x00, 0x38, 0x00, 0x38, \n\t0x00, 0x17, 0x00, 0x39, 0x00, 0x39, 0x00, 0x09, 0x00, 0x3a, 0x00, 0x3a, \n\t0x00, 0x18, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x0d, 0x00, 0x3c, 0x00, 0x3c, \n\t0x00, 0x0a, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x0e, 0x00, 0x3e, 0x00, 0x43, \n\t0x00, 0x00, 0x00, 0x44, 0x00, 0x44, 0x00, 0x03, 0x00, 0x45, 0x00, 0x45, \n\t0x00, 0x00, 0x00, 0x46, 0x00, 0x48, 0x00, 0x04, 0x00, 0x49, 0x00, 0x49, \n\t0x00, 0x00, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x04, 0x00, 0x4b, 0x00, 0x4f, \n\t0x00, 0x00, 0x00, 0x50, 0x00, 0x51, 0x00, 0x05, 0x00, 0x52, 0x00, 0x52, \n\t0x00, 0x06, 0x00, 0x53, 0x00, 0x53, 0x00, 0x05, 0x00, 0x54, 0x00, 0x54, \n\t0x00, 0x04, 0x00, 0x55, 0x00, 0x55, 0x00, 0x00, 0x00, 0x56, 0x00, 0x56, \n\t0x00, 0x07, 0x00, 0x57, 0x00, 0x57, 0x00, 0x00, 0x00, 0x58, 0x00, 0x58, \n\t0x00, 0x10, 0x00, 0x59, 0x00, 0x59, 0x00, 0x11, 0x00, 0x5a, 0x00, 0x5a, \n\t0x00, 0x00, 0x00, 0x5b, 0x00, 0x5b, 0x00, 0x1a, 0x00, 0x5c, 0x00, 0x5c, \n\t0x00, 0x11, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x1b, 0x00, 0x5e, 0x00, 0x6e, \n\t0x00, 0x00, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x15, 0x00, 0x70, 0x00, 0x81, \n\t0x00, 0x00, 0x00, 0x82, 0x00, 0x87, 0x00, 0x02, 0x00, 0x88, 0x00, 0x88, \n\t0x00, 0x00, 0x00, 0x89, 0x00, 0x89, 0x00, 0x16, 0x00, 0x8a, 0x00, 0x93, \n\t0x00, 0x00, 0x00, 0x94, 0x00, 0x98, 0x00, 0x16, 0x00, 0x99, 0x00, 0x99, \n\t0x00, 0x00, 0x00, 0x9a, 0x00, 0x9a, 0x00, 0x16, 0x00, 0x9b, 0x00, 0x9e, \n\t0x00, 0x17, 0x00, 0x9f, 0x00, 0x9f, 0x00, 0x0a, 0x00, 0xa0, 0x00, 0xa1, \n\t0x00, 0x00, 0x00, 0xa2, 0x00, 0xa7, 0x00, 0x03, 0x00, 0xa8, 0x00, 0xa8, \n\t0x00, 0x00, 0x00, 0xa9, 0x00, 0xad, 0x00, 0x04, 0x00, 0xae, 0x00, 0xb2, \n\t0x00, 0x00, 0x00, 0xb3, 0x00, 0xb3, 0x00, 0x05, 0x00, 0xb4, 0x00, 0xb8, \n\t0x00, 0x06, 0x00, 0xb9, 0x00, 0xba, 0x00, 0x00, 0x00, 0xbb, 0x00, 0xbe, \n\t0x00, 0x10, 0x00, 0xbf, 0x00, 0xbf, 0x00, 0x11, 0x00, 0xc0, 0x00, 0xc0, \n\t0x00, 0x00, 0x00, 0xc1, 0x00, 0xc1, 0x00, 0x11, 0x00, 0xc2, 0x00, 0xc2, \n\t0x00, 0x02, 0x00, 0xc3, 0x00, 0xc3, 0x00, 0x03, 0x00, 0xc4, 0x00, 0xc4, \n\t0x00, 0x02, 0x00, 0xc5, 0x00, 0xc5, 0x00, 0x03, 0x00, 0xc6, 0x00, 0xc6, \n\t0x00, 0x02, 0x00, 0xc7, 0x00, 0xc7, 0x00, 0x03, 0x00, 0xc8, 0x00, 0xc8, \n\t0x00, 0x16, 0x00, 0xc9, 0x00, 0xc9, 0x00, 0x04, 0x00, 0xca, 0x00, 0xca, \n\t0x00, 0x16, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0x04, 0x00, 0xcc, 0x00, 0xcc, \n\t0x00, 0x16, 0x00, 0xcd, 0x00, 0xcd, 0x00, 0x04, 0x00, 0xce, 0x00, 0xce, \n\t0x00, 0x16, 0x00, 0xcf, 0x00, 0xcf, 0x00, 0x04, 0x00, 0xd0, 0x00, 0xd0, \n\t0x00, 0x00, 0x00, 0xd1, 0x00, 0xd1, 0x00, 0x04, 0x00, 0xd2, 0x00, 0xd4, \n\t0x00, 0x00, 0x00, 0xd5, 0x00, 0xd5, 0x00, 0x04, 0x00, 0xd6, 0x00, 0xd6, \n\t0x00, 0x00, 0x00, 0xd7, 0x00, 0xd7, 0x00, 0x04, 0x00, 0xd8, 0x00, 0xd8, \n\t0x00, 0x00, 0x00, 0xd9, 0x00, 0xd9, 0x00, 0x04, 0x00, 0xda, 0x00, 0xda, \n\t0x00, 0x00, 0x00, 0xdb, 0x00, 0xdb, 0x00, 0x04, 0x00, 0xdc, 0x00, 0xdc, \n\t0x00, 0x00, 0x00, 0xdd, 0x00, 0xdd, 0x00, 0x04, 0x00, 0xde, 0x00, 0xde, \n\t0x00, 0x16, 0x00, 0xdf, 0x00, 0xdf, 0x00, 0x04, 0x00, 0xe0, 0x00, 0xe0, \n\t0x00, 0x16, 0x00, 0xe1, 0x00, 0xe1, 0x00, 0x04, 0x00, 0xe2, 0x00, 0xe2, \n\t0x00, 0x16, 0x00, 0xe3, 0x00, 0xe3, 0x00, 0x04, 0x00, 0xe4, 0x00, 0xe4, \n\t0x00, 0x16, 0x00, 0xe5, 0x00, 0xe5, 0x00, 0x04, 0x00, 0xe6, 0x00, 0xf5, \n\t0x00, 0x00, 0x00, 0xf6, 0x00, 0xf6, 0x00, 0x1c, 0x00, 0xf7, 0x01, 0x05, \n\t0x00, 0x00, 0x01, 0x06, 0x01, 0x06, 0x00, 0x05, 0x01, 0x07, 0x01, 0x07, \n\t0x00, 0x00, 0x01, 0x08, 0x01, 0x08, 0x00, 0x05, 0x01, 0x09, 0x01, 0x09, \n\t0x00, 0x00, 0x01, 0x0a, 0x01, 0x0b, 0x00, 0x05, 0x01, 0x0c, 0x01, 0x0d, \n\t0x00, 0x00, 0x01, 0x0e, 0x01, 0x0e, 0x00, 0x16, 0x01, 0x0f, 0x01, 0x0f, \n\t0x00, 0x06, 0x01, 0x10, 0x01, 0x10, 0x00, 0x16, 0x01, 0x11, 0x01, 0x11, \n\t0x00, 0x06, 0x01, 0x12, 0x01, 0x12, 0x00, 0x16, 0x01, 0x13, 0x01, 0x13, \n\t0x00, 0x06, 0x01, 0x14, 0x01, 0x14, 0x00, 0x16, 0x01, 0x15, 0x01, 0x15, \n\t0x00, 0x04, 0x01, 0x16, 0x01, 0x1b, 0x00, 0x00, 0x01, 0x1c, 0x01, 0x1c, \n\t0x00, 0x19, 0x01, 0x1d, 0x01, 0x1d, 0x00, 0x07, 0x01, 0x1e, 0x01, 0x1e, \n\t0x00, 0x19, 0x01, 0x1f, 0x01, 0x1f, 0x00, 0x07, 0x01, 0x20, 0x01, 0x20, \n\t0x00, 0x19, 0x01, 0x21, 0x01, 0x21, 0x00, 0x07, 0x01, 0x22, 0x01, 0x22, \n\t0x00, 0x19, 0x01, 0x23, 0x01, 0x23, 0x00, 0x07, 0x01, 0x24, 0x01, 0x24, \n\t0x00, 0x08, 0x01, 0x25, 0x01, 0x25, 0x00, 0x00, 0x01, 0x26, 0x01, 0x26, \n\t0x00, 0x08, 0x01, 0x27, 0x01, 0x29, 0x00, 0x00, 0x01, 0x2a, 0x01, 0x2a, \n\t0x00, 0x17, 0x01, 0x2b, 0x01, 0x2b, 0x00, 0x10, 0x01, 0x2c, 0x01, 0x2c, \n\t0x00, 0x17, 0x01, 0x2d, 0x01, 0x2d, 0x00, 0x10, 0x01, 0x2e, 0x01, 0x2e, \n\t0x00, 0x17, 0x01, 0x2f, 0x01, 0x2f, 0x00, 0x10, 0x01, 0x30, 0x01, 0x30, \n\t0x00, 0x17, 0x01, 0x31, 0x01, 0x31, 0x00, 0x10, 0x01, 0x32, 0x01, 0x32, \n\t0x00, 0x17, 0x01, 0x33, 0x01, 0x33, 0x00, 0x10, 0x01, 0x34, 0x01, 0x34, \n\t0x00, 0x17, 0x01, 0x35, 0x01, 0x35, 0x00, 0x10, 0x01, 0x36, 0x01, 0x36, \n\t0x00, 0x18, 0x01, 0x37, 0x01, 0x37, 0x00, 0x00, 0x01, 0x38, 0x01, 0x38, \n\t0x00, 0x0a, 0x01, 0x39, 0x01, 0x39, 0x00, 0x11, 0x01, 0x3a, 0x01, 0x3a, \n\t0x00, 0x0a, 0x01, 0x3b, 0x01, 0x3b, 0x00, 0x0e, 0x01, 0x3c, 0x01, 0x3c, \n\t0x00, 0x1b, 0x01, 0x3d, 0x01, 0x3d, 0x00, 0x0e, 0x01, 0x3e, 0x01, 0x3e, \n\t0x00, 0x1b, 0x01, 0x3f, 0x01, 0x3f, 0x00, 0x0e, 0x01, 0x40, 0x01, 0x40, \n\t0x00, 0x1b, 0x01, 0x41, 0x01, 0x42, 0x00, 0x00, 0x01, 0x43, 0x01, 0x43, \n\t0x00, 0x16, 0x01, 0x44, 0x01, 0x44, 0x00, 0x04, 0x01, 0x45, 0x01, 0x45, \n\t0x00, 0x00, 0x01, 0x46, 0x01, 0x46, 0x00, 0x10, 0x01, 0x47, 0x01, 0x47, \n\t0x00, 0x00, 0x01, 0x48, 0x01, 0x48, 0x00, 0x02, 0x01, 0x49, 0x01, 0x49, \n\t0x00, 0x03, 0x01, 0x4a, 0x01, 0x4b, 0x00, 0x00, 0x01, 0x4c, 0x01, 0x4c, \n\t0x00, 0x16, 0x01, 0x4d, 0x01, 0x4d, 0x00, 0x00, 0x01, 0x4e, 0x01, 0x4e, \n\t0x00, 0x19, 0x01, 0x4f, 0x01, 0x4f, 0x00, 0x07, 0x01, 0x50, 0x01, 0x50, \n\t0x00, 0x00, 0x01, 0x51, 0x01, 0x51, 0x00, 0x01, 0x01, 0x52, 0x01, 0x62, \n\t0x00, 0x00, 0x01, 0x63, 0x01, 0x63, 0x00, 0x02, 0x01, 0x64, 0x01, 0x67, \n\t0x00, 0x00, 0x01, 0x68, 0x01, 0x68, 0x00, 0x16, 0x01, 0x69, 0x01, 0x69, \n\t0x00, 0x0a, 0x01, 0x6a, 0x01, 0x6b, 0x00, 0x00, 0x01, 0x6c, 0x01, 0x6c, \n\t0x00, 0x02, 0x01, 0x6d, 0x01, 0x6e, 0x00, 0x00, 0x01, 0x6f, 0x01, 0x6f, \n\t0x00, 0x02, 0x01, 0x70, 0x01, 0x70, 0x00, 0x00, 0x01, 0x71, 0x01, 0x71, \n\t0x00, 0x0e, 0x01, 0x72, 0x01, 0x72, 0x00, 0x00, 0x01, 0x73, 0x01, 0x73, \n\t0x00, 0x16, 0x01, 0x74, 0x01, 0x75, 0x00, 0x00, 0x01, 0x76, 0x01, 0x76, \n\t0x00, 0x02, 0x01, 0x77, 0x01, 0x79, 0x00, 0x00, 0x01, 0x7a, 0x01, 0x7a, \n\t0x00, 0x16, 0x01, 0x7b, 0x01, 0x7e, 0x00, 0x00, 0x01, 0x7f, 0x01, 0x7f, \n\t0x00, 0x0a, 0x01, 0x80, 0x01, 0x80, 0x00, 0x00, 0x01, 0x81, 0x01, 0x81, \n\t0x00, 0x0d, 0x01, 0x82, 0x01, 0x84, 0x00, 0x00, 0x01, 0x85, 0x01, 0x85, \n\t0x00, 0x0a, 0x01, 0x86, 0x01, 0x86, 0x00, 0x04, 0x01, 0x87, 0x01, 0x87, \n\t0x00, 0x00, 0x01, 0x88, 0x01, 0x88, 0x00, 0x05, 0x01, 0x89, 0x01, 0x89, \n\t0x00, 0x00, 0x01, 0x8a, 0x01, 0x8a, 0x00, 0x10, 0x01, 0x8b, 0x01, 0x8b, \n\t0x00, 0x04, 0x01, 0x8c, 0x01, 0x8c, 0x00, 0x00, 0x01, 0x8d, 0x01, 0x8d, \n\t0x00, 0x11, 0x01, 0x8e, 0x01, 0x90, 0x00, 0x00, 0x01, 0x91, 0x01, 0x91, \n\t0x00, 0x05, 0x01, 0x92, 0x01, 0x96, 0x00, 0x00, 0x01, 0x97, 0x01, 0x97, \n\t0x00, 0x11, 0x01, 0x98, 0x01, 0x98, 0x00, 0x00, 0x01, 0x99, 0x01, 0x99, \n\t0x00, 0x06, 0x01, 0x9a, 0x01, 0x9b, 0x00, 0x00, 0x01, 0x9c, 0x01, 0x9d, \n\t0x00, 0x04, 0x01, 0x9e, 0x01, 0x9e, 0x00, 0x00, 0x01, 0x9f, 0x01, 0x9f, \n\t0x00, 0x10, 0x01, 0xa0, 0x01, 0xa4, 0x00, 0x00, 0x01, 0xa5, 0x01, 0xa5, \n\t0x00, 0x10, 0x01, 0xa6, 0x01, 0xa6, 0x00, 0x06, 0x01, 0xa7, 0x01, 0xa7, \n\t0x00, 0x10, 0x01, 0xa8, 0x01, 0xad, 0x00, 0x00, 0x01, 0xae, 0x01, 0xae, \n\t0x00, 0x08, 0x01, 0xaf, 0x01, 0xaf, 0x00, 0x00, 0x01, 0xb0, 0x01, 0xb0, \n\t0x00, 0x16, 0x01, 0xb1, 0x01, 0xb3, 0x00, 0x00, 0x01, 0xb4, 0x01, 0xb4, \n\t0x00, 0x1c, 0x01, 0xb5, 0x01, 0xb5, 0x00, 0x0f, 0x01, 0xb6, 0x01, 0xb6, \n\t0x00, 0x00, 0x01, 0xb7, 0x01, 0xb7, 0x00, 0x08, 0x01, 0xb8, 0x01, 0xb9, \n\t0x00, 0x00, 0x01, 0xba, 0x01, 0xba, 0x00, 0x0b, 0x01, 0xbb, 0x01, 0xbb, \n\t0x00, 0x00, 0x01, 0xbc, 0x01, 0xbc, 0x00, 0x02, 0x01, 0xbd, 0x01, 0xc1, \n\t0x00, 0x00, 0x01, 0xc2, 0x01, 0xc2, 0x00, 0x0d, 0x01, 0xc3, 0x01, 0xc6, \n\t0x00, 0x00, 0x01, 0xc7, 0x01, 0xc7, 0x00, 0x0f, 0x01, 0xc8, 0x01, 0xc9, \n\t0x00, 0x00, 0x01, 0xca, 0x01, 0xca, 0x00, 0x16, 0x01, 0xcb, 0x01, 0xcc, \n\t0x00, 0x00, 0x01, 0xcd, 0x01, 0xcd, 0x00, 0x16, 0x01, 0xce, 0x01, 0xce, \n\t0x00, 0x08, 0x01, 0xcf, 0x01, 0xcf, 0x00, 0x0b, 0x01, 0xd0, 0x01, 0xd0, \n\t0x00, 0x00, 0x01, 0xd1, 0x01, 0xd1, 0x00, 0x0d, 0x01, 0xd2, 0x01, 0xd2, \n\t0x00, 0x00, 0x01, 0xd3, 0x01, 0xd3, 0x00, 0x12, 0x01, 0xd4, 0x01, 0xdb, \n\t0x00, 0x00, 0x01, 0xdc, 0x01, 0xdc, 0x00, 0x03, 0x01, 0xdd, 0x01, 0xde, \n\t0x00, 0x00, 0x01, 0xdf, 0x01, 0xdf, 0x00, 0x05, 0x01, 0xe0, 0x01, 0xe0, \n\t0x00, 0x00, 0x01, 0xe1, 0x01, 0xe1, 0x00, 0x04, 0x01, 0xe2, 0x01, 0xe2, \n\t0x00, 0x1a, 0x01, 0xe3, 0x01, 0xe3, 0x00, 0x00, 0x01, 0xe4, 0x01, 0xe6, \n\t0x00, 0x05, 0x01, 0xe7, 0x01, 0xe7, 0x00, 0x13, 0x01, 0xe8, 0x01, 0xe9, \n\t0x00, 0x05, 0x01, 0xea, 0x01, 0xea, 0x00, 0x06, 0x01, 0xeb, 0x01, 0xec, \n\t0x00, 0x05, 0x01, 0xed, 0x01, 0xed, 0x00, 0x04, 0x01, 0xee, 0x01, 0xee, \n\t0x00, 0x00, 0x01, 0xef, 0x01, 0xef, 0x00, 0x11, 0x01, 0xf0, 0x01, 0xf0, \n\t0x00, 0x04, 0x01, 0xf1, 0x01, 0xf1, 0x00, 0x1a, 0x01, 0xf2, 0x01, 0xf2, \n\t0x00, 0x05, 0x01, 0xf3, 0x01, 0xf3, 0x00, 0x14, 0x01, 0xf4, 0x01, 0xf5, \n\t0x00, 0x05, 0x01, 0xf6, 0x01, 0xf7, 0x00, 0x00, 0x01, 0xf8, 0x01, 0xf8, \n\t0x00, 0x05, 0x01, 0xf9, 0x01, 0xf9, 0x00, 0x00, 0x01, 0xfa, 0x01, 0xfa, \n\t0x00, 0x05, 0x01, 0xfb, 0x01, 0xfb, 0x00, 0x00, 0x01, 0xfc, 0x01, 0xfd, \n\t0x00, 0x04, 0x01, 0xfe, 0x01, 0xfe, 0x00, 0x00, 0x01, 0xff, 0x01, 0xff, \n\t0x00, 0x05, 0x02, 0x00, 0x02, 0x00, 0x00, 0x04, 0x02, 0x01, 0x02, 0x01, \n\t0x00, 0x07, 0x02, 0x02, 0x02, 0x04, 0x00, 0x00, 0x02, 0x05, 0x02, 0x05, \n\t0x00, 0x13, 0x02, 0x06, 0x02, 0x06, 0x00, 0x05, 0x02, 0x07, 0x02, 0x07, \n\t0x00, 0x00, 0x02, 0x08, 0x02, 0x09, 0x00, 0x05, 0x02, 0x0a, 0x02, 0x0a, \n\t0x00, 0x11, 0x02, 0x0b, 0x02, 0x0b, 0x00, 0x00, 0x02, 0x0c, 0x02, 0x0c, \n\t0x00, 0x16, 0x02, 0x0d, 0x02, 0x11, 0x00, 0x00, 0x02, 0x12, 0x02, 0x12, \n\t0x00, 0x02, 0x02, 0x13, 0x02, 0x1d, 0x00, 0x00, 0x02, 0x1e, 0x02, 0x1e, \n\t0x00, 0x16, 0x02, 0x1f, 0x02, 0x1f, 0x00, 0x06, 0x02, 0x20, 0x02, 0x20, \n\t0x00, 0x09, 0x02, 0x21, 0x02, 0x21, 0x00, 0x11, 0x02, 0x22, 0x02, 0x22, \n\t0x00, 0x09, 0x02, 0x23, 0x02, 0x23, 0x00, 0x11, 0x02, 0x24, 0x02, 0x24, \n\t0x00, 0x16, 0x02, 0x25, 0x02, 0x25, 0x00, 0x04, 0x02, 0x26, 0x02, 0x26, \n\t0x00, 0x16, 0x02, 0x27, 0x02, 0x27, 0x00, 0x00, 0x02, 0x28, 0x02, 0x28, \n\t0x00, 0x16, 0x02, 0x29, 0x02, 0x29, 0x00, 0x04, 0x02, 0x2a, 0x02, 0x2a, \n\t0x00, 0x16, 0x02, 0x2b, 0x02, 0x2b, 0x00, 0x00, 0x02, 0x2c, 0x02, 0x2c, \n\t0x00, 0x16, 0x02, 0x2d, 0x02, 0x2d, 0x00, 0x04, 0x02, 0x2e, 0x02, 0x35, \n\t0x00, 0x00, 0x02, 0x36, 0x02, 0x36, 0x00, 0x05, 0x02, 0x37, 0x02, 0x40, \n\t0x00, 0x00, 0x02, 0x41, 0x02, 0x41, 0x00, 0x0d, 0x02, 0x42, 0x02, 0x42, \n\t0x00, 0x1a, 0x02, 0x43, 0x02, 0x45, 0x00, 0x00, 0x02, 0x46, 0x02, 0x46, \n\t0x00, 0x05, 0x02, 0x47, 0x02, 0x4a, 0x00, 0x00, 0x02, 0x4b, 0x02, 0x4b, \n\t0x00, 0x08, 0x02, 0x4c, 0x02, 0x4d, 0x00, 0x00, 0x02, 0x4e, 0x02, 0x4e, \n\t0x00, 0x05, 0x02, 0x4f, 0x02, 0x4f, 0x00, 0x00, 0x02, 0x50, 0x02, 0x50, \n\t0x00, 0x05, 0x02, 0x51, 0x02, 0x52, 0x00, 0x00, 0x02, 0x53, 0x02, 0x53, \n\t0x00, 0x16, 0x02, 0x54, 0x02, 0x54, 0x00, 0x04, 0x02, 0x55, 0x02, 0x55, \n\t0x00, 0x16, 0x02, 0x56, 0x02, 0x56, 0x00, 0x04, 0x02, 0x57, 0x02, 0x57, \n\t0x00, 0x08, 0x02, 0x58, 0x02, 0x58, 0x00, 0x00, 0x02, 0x59, 0x02, 0x59, \n\t0x00, 0x0a, 0x02, 0x5a, 0x02, 0x5a, 0x00, 0x11, 0x02, 0x5b, 0x02, 0x5b, \n\t0x00, 0x0a, 0x02, 0x5c, 0x02, 0x5c, 0x00, 0x00, 0x02, 0x5d, 0x02, 0x5d, \n\t0x00, 0x0d, 0x02, 0x5e, 0x02, 0x5e, 0x00, 0x1a, 0x02, 0x5f, 0x02, 0x5f, \n\t0x00, 0x08, 0x02, 0x60, 0x02, 0x60, 0x00, 0x00, 0x02, 0x61, 0x02, 0x61, \n\t0x00, 0x12, 0x02, 0x62, 0x02, 0x62, 0x00, 0x14, 0x02, 0x63, 0x02, 0x6b, \n\t0x00, 0x00, 0x02, 0x6c, 0x02, 0x6c, 0x00, 0x0d, 0x02, 0x6d, 0x02, 0x6d, \n\t0x00, 0x1a, 0x02, 0x6e, 0x02, 0x6f, 0x00, 0x00, 0x02, 0x70, 0x02, 0x70, \n\t0x00, 0x0f, 0x02, 0x71, 0x02, 0x71, 0x00, 0x13, 0x02, 0x72, 0x02, 0x72, \n\t0x00, 0x00, 0x02, 0x73, 0x02, 0x73, 0x00, 0x05, 0x02, 0x74, 0x02, 0x74, \n\t0x00, 0x00, 0x02, 0x75, 0x02, 0x75, 0x00, 0x05, 0x02, 0x76, 0x02, 0x76, \n\t0x00, 0x12, 0x02, 0x77, 0x02, 0x77, 0x00, 0x14, 0x02, 0x78, 0x02, 0x78, \n\t0x00, 0x00, 0x02, 0x79, 0x02, 0x79, 0x00, 0x05, 0x02, 0x7a, 0x02, 0x7a, \n\t0x00, 0x00, 0x02, 0x7b, 0x02, 0x7b, 0x00, 0x02, 0x02, 0x7c, 0x02, 0x7c, \n\t0x00, 0x03, 0x02, 0x7d, 0x02, 0x7d, 0x00, 0x02, 0x02, 0x7e, 0x02, 0x7e, \n\t0x00, 0x03, 0x02, 0x7f, 0x02, 0x81, 0x00, 0x00, 0x02, 0x82, 0x02, 0x82, \n\t0x00, 0x04, 0x02, 0x83, 0x02, 0x83, 0x00, 0x00, 0x02, 0x84, 0x02, 0x84, \n\t0x00, 0x04, 0x02, 0x85, 0x02, 0x85, 0x00, 0x00, 0x02, 0x86, 0x02, 0x86, \n\t0x00, 0x04, 0x02, 0x87, 0x02, 0x87, 0x00, 0x0d, 0x02, 0x88, 0x02, 0x88, \n\t0x00, 0x1a, 0x02, 0x89, 0x02, 0x8d, 0x00, 0x00, 0x02, 0x8e, 0x02, 0x8e, \n\t0x00, 0x05, 0x02, 0x8f, 0x02, 0x8f, 0x00, 0x00, 0x02, 0x90, 0x02, 0x90, \n\t0x00, 0x05, 0x02, 0x91, 0x02, 0x91, 0x00, 0x16, 0x02, 0x92, 0x02, 0x92, \n\t0x00, 0x06, 0x02, 0x93, 0x02, 0x93, 0x00, 0x16, 0x02, 0x94, 0x02, 0x94, \n\t0x00, 0x04, 0x02, 0x95, 0x02, 0x95, 0x00, 0x16, 0x02, 0x96, 0x02, 0x96, \n\t0x00, 0x06, 0x02, 0x97, 0x02, 0x98, 0x00, 0x00, 0x02, 0x99, 0x02, 0x99, \n\t0x00, 0x0b, 0x02, 0x9a, 0x02, 0x9a, 0x00, 0x11, 0x02, 0x9b, 0x02, 0x9b, \n\t0x00, 0x0b, 0x02, 0x9c, 0x02, 0x9c, 0x00, 0x11, 0x02, 0x9d, 0x02, 0x9d, \n\t0x00, 0x0b, 0x02, 0x9e, 0x02, 0x9e, 0x00, 0x11, 0x02, 0x9f, 0x02, 0x9f, \n\t0x00, 0x12, 0x02, 0xa0, 0x02, 0xa0, 0x00, 0x14, 0x02, 0xa1, 0x02, 0xa1, \n\t0x00, 0x00, 0x02, 0xa2, 0x02, 0xa2, 0x00, 0x05, 0x02, 0xa3, 0x02, 0xa3, \n\t0x00, 0x00, 0x02, 0xa4, 0x02, 0xa4, 0x00, 0x05, 0x02, 0xa5, 0x02, 0xa5, \n\t0x00, 0x00, 0x02, 0xa6, 0x02, 0xa6, 0x00, 0x05, 0x02, 0xa7, 0x02, 0xa7, \n\t0x00, 0x0d, 0x02, 0xa8, 0x02, 0xa8, 0x00, 0x1a, 0x02, 0xa9, 0x02, 0xab, \n\t0x00, 0x00, 0x02, 0xac, 0x02, 0xae, 0x00, 0x04, 0x02, 0xaf, 0x02, 0xb2, \n\t0x00, 0x00, 0x02, 0xb3, 0x02, 0xb3, 0x00, 0x0f, 0x02, 0xb4, 0x02, 0xb6, \n\t0x00, 0x00, 0x02, 0xb7, 0x02, 0xb7, 0x00, 0x16, 0x02, 0xb8, 0x02, 0xb8, \n\t0x00, 0x04, 0x02, 0xb9, 0x02, 0xbc, 0x00, 0x00, 0x02, 0xbd, 0x02, 0xbd, \n\t0x00, 0x0f, 0x02, 0xbe, 0x02, 0xbe, 0x00, 0x13, 0x02, 0xbf, 0x02, 0xbf, \n\t0x00, 0x02, 0x02, 0xc0, 0x02, 0xc0, 0x00, 0x03, 0x02, 0xc1, 0x02, 0xc1, \n\t0x00, 0x00, 0x02, 0xc2, 0x02, 0xc2, 0x00, 0x05, 0x02, 0xc3, 0x02, 0xc3, \n\t0x00, 0x18, 0x02, 0xc4, 0x02, 0xc4, 0x00, 0x00, 0x02, 0xc5, 0x02, 0xc5, \n\t0x00, 0x18, 0x02, 0xc6, 0x02, 0xc6, 0x00, 0x00, 0x02, 0xc7, 0x02, 0xc7, \n\t0x00, 0x18, 0x02, 0xc8, 0x02, 0xc8, 0x00, 0x00, 0x02, 0xc9, 0x02, 0xc9, \n\t0x00, 0x02, 0x02, 0xca, 0x02, 0xca, 0x00, 0x03, 0x02, 0xcb, 0x02, 0xcb, \n\t0x00, 0x02, 0x02, 0xcc, 0x02, 0xcc, 0x00, 0x03, 0x02, 0xcd, 0x02, 0xcd, \n\t0x00, 0x02, 0x02, 0xce, 0x02, 0xce, 0x00, 0x03, 0x02, 0xcf, 0x02, 0xcf, \n\t0x00, 0x02, 0x02, 0xd0, 0x02, 0xd0, 0x00, 0x03, 0x02, 0xd1, 0x02, 0xd1, \n\t0x00, 0x02, 0x02, 0xd2, 0x02, 0xd2, 0x00, 0x03, 0x02, 0xd3, 0x02, 0xd3, \n\t0x00, 0x02, 0x02, 0xd4, 0x02, 0xd4, 0x00, 0x03, 0x02, 0xd5, 0x02, 0xd5, \n\t0x00, 0x02, 0x02, 0xd6, 0x02, 0xd6, 0x00, 0x03, 0x02, 0xd7, 0x02, 0xd7, \n\t0x00, 0x02, 0x02, 0xd8, 0x02, 0xd8, 0x00, 0x03, 0x02, 0xd9, 0x02, 0xd9, \n\t0x00, 0x02, 0x02, 0xda, 0x02, 0xda, 0x00, 0x03, 0x02, 0xdb, 0x02, 0xdb, \n\t0x00, 0x02, 0x02, 0xdc, 0x02, 0xdc, 0x00, 0x03, 0x02, 0xdd, 0x02, 0xdd, \n\t0x00, 0x02, 0x02, 0xde, 0x02, 0xde, 0x00, 0x03, 0x02, 0xdf, 0x02, 0xdf, \n\t0x00, 0x02, 0x02, 0xe0, 0x02, 0xe0, 0x00, 0x03, 0x02, 0xe1, 0x02, 0xe1, \n\t0x00, 0x00, 0x02, 0xe2, 0x02, 0xe2, 0x00, 0x04, 0x02, 0xe3, 0x02, 0xe3, \n\t0x00, 0x00, 0x02, 0xe4, 0x02, 0xe4, 0x00, 0x04, 0x02, 0xe5, 0x02, 0xe5, \n\t0x00, 0x00, 0x02, 0xe6, 0x02, 0xe6, 0x00, 0x04, 0x02, 0xe7, 0x02, 0xe7, \n\t0x00, 0x00, 0x02, 0xe8, 0x02, 0xe8, 0x00, 0x04, 0x02, 0xe9, 0x02, 0xe9, \n\t0x00, 0x00, 0x02, 0xea, 0x02, 0xea, 0x00, 0x04, 0x02, 0xeb, 0x02, 0xeb, \n\t0x00, 0x00, 0x02, 0xec, 0x02, 0xec, 0x00, 0x04, 0x02, 0xed, 0x02, 0xed, \n\t0x00, 0x00, 0x02, 0xee, 0x02, 0xee, 0x00, 0x04, 0x02, 0xef, 0x02, 0xef, \n\t0x00, 0x00, 0x02, 0xf0, 0x02, 0xf0, 0x00, 0x04, 0x02, 0xf1, 0x02, 0xf4, \n\t0x00, 0x00, 0x02, 0xf5, 0x02, 0xf5, 0x00, 0x16, 0x02, 0xf6, 0x02, 0xf6, \n\t0x00, 0x06, 0x02, 0xf7, 0x02, 0xf7, 0x00, 0x16, 0x02, 0xf8, 0x02, 0xf8, \n\t0x00, 0x06, 0x02, 0xf9, 0x02, 0xf9, 0x00, 0x16, 0x02, 0xfa, 0x02, 0xfa, \n\t0x00, 0x06, 0x02, 0xfb, 0x02, 0xfb, 0x00, 0x16, 0x02, 0xfc, 0x02, 0xfc, \n\t0x00, 0x06, 0x02, 0xfd, 0x02, 0xfd, 0x00, 0x16, 0x02, 0xfe, 0x02, 0xfe, \n\t0x00, 0x06, 0x02, 0xff, 0x02, 0xff, 0x00, 0x16, 0x03, 0x00, 0x03, 0x00, \n\t0x00, 0x06, 0x03, 0x01, 0x03, 0x01, 0x00, 0x16, 0x03, 0x02, 0x03, 0x02, \n\t0x00, 0x06, 0x03, 0x03, 0x03, 0x03, 0x00, 0x16, 0x03, 0x04, 0x03, 0x04, \n\t0x00, 0x04, 0x03, 0x05, 0x03, 0x05, 0x00, 0x16, 0x03, 0x06, 0x03, 0x06, \n\t0x00, 0x04, 0x03, 0x07, 0x03, 0x07, 0x00, 0x16, 0x03, 0x08, 0x03, 0x08, \n\t0x00, 0x04, 0x03, 0x09, 0x03, 0x09, 0x00, 0x16, 0x03, 0x0a, 0x03, 0x0a, \n\t0x00, 0x06, 0x03, 0x0b, 0x03, 0x0b, 0x00, 0x16, 0x03, 0x0c, 0x03, 0x0c, \n\t0x00, 0x04, 0x03, 0x0d, 0x03, 0x0d, 0x00, 0x17, 0x03, 0x0e, 0x03, 0x0e, \n\t0x00, 0x10, 0x03, 0x0f, 0x03, 0x0f, 0x00, 0x17, 0x03, 0x10, 0x03, 0x10, \n\t0x00, 0x10, 0x03, 0x11, 0x03, 0x11, 0x00, 0x00, 0x03, 0x12, 0x03, 0x12, \n\t0x00, 0x10, 0x03, 0x13, 0x03, 0x13, 0x00, 0x00, 0x03, 0x14, 0x03, 0x14, \n\t0x00, 0x10, 0x03, 0x15, 0x03, 0x15, 0x00, 0x00, 0x03, 0x16, 0x03, 0x16, \n\t0x00, 0x10, 0x03, 0x17, 0x03, 0x17, 0x00, 0x00, 0x03, 0x18, 0x03, 0x18, \n\t0x00, 0x10, 0x03, 0x19, 0x03, 0x19, 0x00, 0x00, 0x03, 0x1a, 0x03, 0x1a, \n\t0x00, 0x10, 0x03, 0x1b, 0x03, 0x1b, 0x00, 0x0a, 0x03, 0x1c, 0x03, 0x1c, \n\t0x00, 0x11, 0x03, 0x1d, 0x03, 0x1d, 0x00, 0x0a, 0x03, 0x1e, 0x03, 0x1e, \n\t0x00, 0x11, 0x03, 0x1f, 0x03, 0x1f, 0x00, 0x0a, 0x03, 0x20, 0x03, 0x20, \n\t0x00, 0x11, 0x03, 0x21, 0x03, 0x21, 0x00, 0x0a, 0x03, 0x22, 0x03, 0x22, \n\t0x00, 0x11, 0x03, 0x23, 0x03, 0x23, 0x00, 0x16, 0x03, 0x24, 0x03, 0x2f, \n\t0x00, 0x00, 0x03, 0x30, 0x03, 0x32, 0x00, 0x15, 0x03, 0x33, 0x03, 0x33, \n\t0x00, 0x00, 0x03, 0x34, 0x03, 0x35, 0x00, 0x01, 0x03, 0x36, 0x03, 0x36, \n\t0x00, 0x0c, 0x03, 0x37, 0x03, 0x39, 0x00, 0x01, 0x03, 0x3a, 0x03, 0x3a, \n\t0x00, 0x0c, 0x03, 0x3b, 0x03, 0x3d, 0x00, 0x00, 0x03, 0x3e, 0x03, 0x3f, \n\t0x00, 0x0c, 0x03, 0x40, 0x03, 0x40, 0x00, 0x00, 0x03, 0x41, 0x03, 0x42, \n\t0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x36, \n\t0x00, 0x6e, 0x00, 0x02, 0x44, 0x46, 0x4c, 0x54, 0x00, 0x0e, 0x6c, 0x61, \n\t0x74, 0x6e, 0x00, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, \n\t0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, \n\t0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x01, 0x00, 0x05, \n\t0x61, 0x61, 0x6c, 0x74, 0x00, 0x20, 0x61, 0x61, 0x6c, 0x74, 0x00, 0x20, \n\t0x6c, 0x69, 0x67, 0x61, 0x00, 0x26, 0x6c, 0x6e, 0x75, 0x6d, 0x00, 0x2c, \n\t0x73, 0x6d, 0x63, 0x70, 0x00, 0x32, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, \n\t0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, \n\t0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x04, 0x00, 0x0a, 0x02, 0x5a, \n\t0x04, 0x90, 0x04, 0xb0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, \n\t0x00, 0x02, 0x01, 0xd2, 0x00, 0xe6, 0x03, 0x7f, 0x03, 0x9d, 0x03, 0x9e, \n\t0x03, 0x9f, 0x03, 0xa0, 0x03, 0xa1, 0x03, 0xa2, 0x03, 0xa3, 0x03, 0xa4, \n\t0x03, 0xa5, 0x03, 0x91, 0x03, 0x8e, 0x03, 0x8d, 0x03, 0x8c, 0x03, 0x8b, \n\t0x03, 0x8a, 0x03, 0x89, 0x03, 0x88, 0x03, 0x87, 0x03, 0x86, 0x03, 0x85, \n\t0x03, 0x84, 0x03, 0x83, 0x03, 0x81, 0x03, 0x80, 0x03, 0xa6, 0x03, 0x7e, \n\t0x03, 0x7d, 0x03, 0x7c, 0x03, 0x7b, 0x03, 0x7a, 0x03, 0x79, 0x03, 0x78, \n\t0x03, 0x77, 0x03, 0x76, 0x03, 0x75, 0x03, 0x91, 0x03, 0x8e, 0x03, 0x8d, \n\t0x03, 0x8c, 0x03, 0x8b, 0x03, 0x8a, 0x03, 0x89, 0x03, 0x88, 0x03, 0x87, \n\t0x03, 0x86, 0x03, 0x85, 0x03, 0x84, 0x03, 0x83, 0x03, 0x81, 0x03, 0x80, \n\t0x03, 0xa6, 0x03, 0x7e, 0x03, 0x7d, 0x03, 0x7c, 0x03, 0x7b, 0x03, 0x7a, \n\t0x03, 0x79, 0x03, 0x78, 0x03, 0x77, 0x03, 0x76, 0x03, 0x75, 0x03, 0xb8, \n\t0x03, 0xb9, 0x03, 0xba, 0x03, 0xbb, 0x03, 0xbc, 0x03, 0xbd, 0x03, 0xbf, \n\t0x03, 0xc0, 0x03, 0xc1, 0x03, 0xc2, 0x03, 0xc3, 0x03, 0xc4, 0x03, 0xc5, \n\t0x03, 0xc6, 0x03, 0xc7, 0x03, 0xb6, 0x03, 0xc8, 0x03, 0xc9, 0x03, 0xca, \n\t0x03, 0xcb, 0x03, 0xcc, 0x03, 0xcd, 0x03, 0xce, 0x03, 0xcf, 0x03, 0xd0, \n\t0x03, 0xd1, 0x03, 0xd2, 0x04, 0x03, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0xba, \n\t0x03, 0xbb, 0x03, 0xbc, 0x03, 0xbd, 0x03, 0xbf, 0x03, 0xc0, 0x03, 0xc1, \n\t0x03, 0xc2, 0x03, 0xc3, 0x03, 0xc4, 0x03, 0xc5, 0x03, 0xc6, 0x03, 0xc7, \n\t0x03, 0xb6, 0x03, 0xc8, 0x03, 0xc9, 0x03, 0xca, 0x03, 0xcb, 0x03, 0xcc, \n\t0x03, 0xcd, 0x03, 0xce, 0x03, 0xcf, 0x03, 0xd0, 0x03, 0xd1, 0x03, 0xd2, \n\t0x04, 0x07, 0x03, 0xd3, 0x03, 0xd3, 0x03, 0xd4, 0x03, 0xd4, 0x03, 0xd5, \n\t0x03, 0xd5, 0x03, 0xd6, 0x03, 0xd6, 0x03, 0xd7, 0x03, 0xd7, 0x03, 0xd9, \n\t0x03, 0xd9, 0x03, 0xda, 0x03, 0xda, 0x03, 0xb5, 0x03, 0xb5, 0x03, 0xdb, \n\t0x03, 0xdb, 0x03, 0xdc, 0x03, 0xdc, 0x03, 0xdd, 0x03, 0xdd, 0x03, 0xde, \n\t0x03, 0xde, 0x03, 0xdf, 0x03, 0xdf, 0x03, 0xe0, 0x03, 0xe0, 0x03, 0xe1, \n\t0x03, 0xe1, 0x03, 0xe3, 0x03, 0xe3, 0x03, 0xe4, 0x03, 0xe4, 0x03, 0xe5, \n\t0x03, 0xe5, 0x03, 0x6b, 0x03, 0x6b, 0x03, 0xe7, 0x03, 0xe7, 0x03, 0xe8, \n\t0x03, 0xe8, 0x03, 0xe9, 0x03, 0xea, 0x03, 0xea, 0x03, 0xeb, 0x03, 0xeb, \n\t0x03, 0xec, 0x03, 0xec, 0x03, 0xed, 0x03, 0xed, 0x03, 0xee, 0x03, 0xee, \n\t0x03, 0xef, 0x03, 0xef, 0x03, 0xf0, 0x03, 0xf0, 0x03, 0xf1, 0x03, 0xf1, \n\t0x03, 0xf2, 0x03, 0xf2, 0x03, 0xf3, 0x03, 0xf3, 0x03, 0xf4, 0x03, 0xf4, \n\t0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf6, 0x03, 0xf6, 0x03, 0xf7, 0x03, 0xf7, \n\t0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf9, 0x03, 0xf9, 0x03, 0xfa, 0x03, 0xfa, \n\t0x03, 0xfb, 0x03, 0xfb, 0x03, 0xfc, 0x03, 0xfc, 0x03, 0xfd, 0x03, 0xfd, \n\t0x03, 0xfe, 0x03, 0xfe, 0x03, 0xb7, 0x03, 0xb7, 0x03, 0xff, 0x03, 0xff, \n\t0x04, 0x00, 0x04, 0x00, 0x04, 0x01, 0x04, 0x01, 0x04, 0x02, 0x04, 0x02, \n\t0x03, 0xe6, 0x03, 0xe6, 0x04, 0x0a, 0x04, 0x0a, 0x04, 0x09, 0x04, 0x09, \n\t0x04, 0x08, 0x04, 0x08, 0x04, 0x07, 0x04, 0x06, 0x04, 0x06, 0x04, 0x05, \n\t0x04, 0x05, 0x04, 0x04, 0x04, 0x04, 0x03, 0xbe, 0x03, 0xbe, 0x00, 0x02, \n\t0x00, 0x13, 0x00, 0x13, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x24, 0x00, 0x3d, \n\t0x00, 0x0a, 0x00, 0x44, 0x00, 0x5d, 0x00, 0x24, 0x00, 0x82, 0x00, 0x87, \n\t0x00, 0x3e, 0x00, 0x89, 0x00, 0x98, 0x00, 0x44, 0x00, 0x9b, 0x00, 0x9f, \n\t0x00, 0x54, 0x00, 0xa1, 0x00, 0xa7, 0x00, 0x59, 0x00, 0xa9, 0x00, 0xb8, \n\t0x00, 0x60, 0x00, 0xbb, 0x00, 0xbf, 0x00, 0x70, 0x00, 0xc1, 0x00, 0xcb, \n\t0x00, 0x75, 0x00, 0xce, 0x00, 0xe1, 0x00, 0x80, 0x00, 0xe4, 0x00, 0xe7, \n\t0x00, 0x94, 0x00, 0xea, 0x00, 0xf2, 0x00, 0x98, 0x00, 0xf6, 0x00, 0xf9, \n\t0x00, 0xa1, 0x00, 0xfb, 0x01, 0x02, 0x00, 0xa5, 0x01, 0x05, 0x01, 0x0a, \n\t0x00, 0xad, 0x01, 0x0e, 0x01, 0x13, 0x00, 0xb3, 0x01, 0x16, 0x01, 0x40, \n\t0x00, 0xb9, 0x01, 0x48, 0x01, 0x49, 0x00, 0xe4, 0x00, 0x01, 0x00, 0x00, \n\t0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x01, 0xbe, 0x00, 0xdc, 0x03, 0x91, \n\t0x03, 0x8e, 0x03, 0x8d, 0x03, 0x8c, 0x03, 0x8b, 0x03, 0x8a, 0x03, 0x89, \n\t0x03, 0x88, 0x03, 0x87, 0x03, 0x86, 0x03, 0x85, 0x03, 0x84, 0x03, 0x83, \n\t0x03, 0x81, 0x03, 0x80, 0x03, 0xa6, 0x03, 0x7e, 0x03, 0x7d, 0x03, 0x7c, \n\t0x03, 0x7b, 0x03, 0x7a, 0x03, 0x79, 0x03, 0x78, 0x03, 0x77, 0x03, 0x76, \n\t0x03, 0x75, 0x03, 0x91, 0x03, 0x8e, 0x03, 0x8d, 0x03, 0x8c, 0x03, 0x8b, \n\t0x03, 0x8a, 0x03, 0x89, 0x03, 0x88, 0x03, 0x87, 0x03, 0x86, 0x03, 0x85, \n\t0x03, 0x84, 0x03, 0x83, 0x03, 0x81, 0x03, 0x80, 0x03, 0xa6, 0x03, 0x7e, \n\t0x03, 0x7d, 0x03, 0x7c, 0x03, 0x7b, 0x03, 0x7a, 0x03, 0x79, 0x03, 0x78, \n\t0x03, 0x77, 0x03, 0x76, 0x03, 0x75, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0xba, \n\t0x03, 0xbb, 0x03, 0xbc, 0x03, 0xbd, 0x03, 0xbf, 0x03, 0xc0, 0x03, 0xc1, \n\t0x03, 0xc2, 0x03, 0xc3, 0x03, 0xc4, 0x03, 0xc5, 0x03, 0xc6, 0x03, 0xc7, \n\t0x03, 0xb6, 0x03, 0xc8, 0x03, 0xc9, 0x03, 0xca, 0x03, 0xcb, 0x03, 0xcc, \n\t0x03, 0xcd, 0x03, 0xce, 0x03, 0xcf, 0x03, 0xd0, 0x03, 0xd1, 0x03, 0xd2, \n\t0x04, 0x03, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xbb, 0x03, 0xbc, \n\t0x03, 0xbd, 0x03, 0xbf, 0x03, 0xc0, 0x03, 0xc1, 0x03, 0xc2, 0x03, 0xc3, \n\t0x03, 0xc4, 0x03, 0xc5, 0x03, 0xc6, 0x03, 0xc7, 0x03, 0xb6, 0x03, 0xc8, \n\t0x03, 0xc9, 0x03, 0xca, 0x03, 0xcb, 0x03, 0xcc, 0x03, 0xcd, 0x03, 0xce, \n\t0x03, 0xcf, 0x03, 0xd0, 0x03, 0xd1, 0x03, 0xd2, 0x04, 0x07, 0x03, 0xd3, \n\t0x03, 0xd3, 0x03, 0xd4, 0x03, 0xd4, 0x03, 0xd5, 0x03, 0xd5, 0x03, 0xd6, \n\t0x03, 0xd6, 0x03, 0xd7, 0x03, 0xd7, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0xda, \n\t0x03, 0xda, 0x03, 0xb5, 0x03, 0xb5, 0x03, 0xdb, 0x03, 0xdb, 0x03, 0xdc, \n\t0x03, 0xdc, 0x03, 0xdd, 0x03, 0xdd, 0x03, 0xde, 0x03, 0xde, 0x03, 0xdf, \n\t0x03, 0xdf, 0x03, 0xe0, 0x03, 0xe0, 0x03, 0xe1, 0x03, 0xe1, 0x03, 0xe3, \n\t0x03, 0xe3, 0x03, 0xe4, 0x03, 0xe4, 0x03, 0xe5, 0x03, 0xe5, 0x03, 0x6b, \n\t0x03, 0x6b, 0x03, 0xe7, 0x03, 0xe7, 0x03, 0xe8, 0x03, 0xe8, 0x03, 0xe9, \n\t0x03, 0xea, 0x03, 0xea, 0x03, 0xeb, 0x03, 0xeb, 0x03, 0xec, 0x03, 0xec, \n\t0x03, 0xed, 0x03, 0xed, 0x03, 0xee, 0x03, 0xee, 0x03, 0xef, 0x03, 0xef, \n\t0x03, 0xf0, 0x03, 0xf0, 0x03, 0xf1, 0x03, 0xf1, 0x03, 0xf2, 0x03, 0xf2, \n\t0x03, 0xf3, 0x03, 0xf3, 0x03, 0xf4, 0x03, 0xf4, 0x03, 0xf5, 0x03, 0xf5, \n\t0x03, 0xf6, 0x03, 0xf6, 0x03, 0xf7, 0x03, 0xf7, 0x03, 0xf8, 0x03, 0xf8, \n\t0x03, 0xf9, 0x03, 0xf9, 0x03, 0xfa, 0x03, 0xfa, 0x03, 0xfb, 0x03, 0xfb, \n\t0x03, 0xfc, 0x03, 0xfc, 0x03, 0xfd, 0x03, 0xfd, 0x03, 0xfe, 0x03, 0xfe, \n\t0x03, 0xb7, 0x03, 0xb7, 0x03, 0xff, 0x03, 0xff, 0x04, 0x00, 0x04, 0x00, \n\t0x04, 0x01, 0x04, 0x01, 0x04, 0x02, 0x04, 0x02, 0x03, 0xe6, 0x03, 0xe6, \n\t0x04, 0x0a, 0x04, 0x0a, 0x04, 0x09, 0x04, 0x09, 0x04, 0x08, 0x04, 0x08, \n\t0x04, 0x07, 0x04, 0x06, 0x04, 0x06, 0x04, 0x05, 0x04, 0x05, 0x04, 0x04, \n\t0x04, 0x04, 0x03, 0xbe, 0x03, 0xbe, 0x00, 0x02, 0x00, 0x12, 0x00, 0x24, \n\t0x00, 0x3d, 0x00, 0x00, 0x00, 0x44, 0x00, 0x5d, 0x00, 0x1a, 0x00, 0x82, \n\t0x00, 0x87, 0x00, 0x34, 0x00, 0x89, 0x00, 0x98, 0x00, 0x3a, 0x00, 0x9b, \n\t0x00, 0x9f, 0x00, 0x4a, 0x00, 0xa1, 0x00, 0xa7, 0x00, 0x4f, 0x00, 0xa9, \n\t0x00, 0xb8, 0x00, 0x56, 0x00, 0xbb, 0x00, 0xbf, 0x00, 0x66, 0x00, 0xc1, \n\t0x00, 0xcb, 0x00, 0x6b, 0x00, 0xce, 0x00, 0xe1, 0x00, 0x76, 0x00, 0xe4, \n\t0x00, 0xe7, 0x00, 0x8a, 0x00, 0xea, 0x00, 0xf2, 0x00, 0x8e, 0x00, 0xf6, \n\t0x00, 0xf9, 0x00, 0x97, 0x00, 0xfb, 0x01, 0x02, 0x00, 0x9b, 0x01, 0x05, \n\t0x01, 0x0a, 0x00, 0xa3, 0x01, 0x0e, 0x01, 0x13, 0x00, 0xa9, 0x01, 0x16, \n\t0x01, 0x40, 0x00, 0xaf, 0x01, 0x48, 0x01, 0x49, 0x00, 0xda, 0x00, 0x04, \n\t0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x12, 0x00, 0x01, \n\t0x00, 0x08, 0x00, 0x01, 0x00, 0x04, 0x03, 0x64, 0x00, 0x02, 0x00, 0x4c, \n\t0x00, 0x01, 0x00, 0x01, 0x00, 0x49, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, \n\t0x00, 0x08, 0x00, 0x02, 0x00, 0x1a, 0x00, 0x0a, 0x03, 0x7f, 0x03, 0x9d, \n\t0x03, 0x9e, 0x03, 0x9f, 0x03, 0xa0, 0x03, 0xa1, 0x03, 0xa2, 0x03, 0xa3, \n\t0x03, 0xa4, 0x03, 0xa5, 0x00, 0x02, 0x00, 0x01, 0x00, 0x13, 0x00, 0x1c, \n\t0x00, 0x00, 0x00, 0x00, \n\t0x00\n};\n\nuint32_t igl_roboto_regular_ttf_size = 145348;\n\n"
  },
  {
    "path": "libs/libigl/include/igl/viewer/TextRenderer_fonts.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Wenzel Jacob <wenzel@inf.ethz.ch>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#ifndef IGL_TEXT_RENDERER_FONTS_H\n#define IGL_TEXT_RENDERER_FONTS_H\n\n#include <stdint.h>\n\n#ifndef IGL_STATIC_LIBRARY\nnamespace\n{\n#endif\n  extern uint8_t igl_entypo_ttf[];\n  extern uint32_t igl_entypo_ttf_size;\n\n  extern uint8_t igl_roboto_bold_ttf[];\n  extern uint32_t igl_roboto_bold_ttf_size;\n\n  extern uint8_t igl_roboto_regular_ttf[];\n  extern uint32_t igl_roboto_regular_ttf_size;\n\n#ifndef IGL_STATIC_LIBRARY\n}\n#endif\n\n#ifndef IGL_STATIC_LIBRARY\nnamespace\n{\n  #include \"TextRenderer_fonts.cpp\"\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/viewer/Viewer.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n// Must defined this before including Viewer.h\n#define IGL_VIEWER_VIEWER_CPP\n#include \"Viewer.h\"\n\n#ifdef _WIN32\n#  include <windows.h>\n#  undef max\n#  undef min\n#endif\n\n#include <chrono>\n#include <thread>\n\n#ifndef __APPLE__\n#  define GLEW_STATIC\n#  include <GL/glew.h>\n#endif\n\n#ifdef __APPLE__\n#   include <OpenGL/gl3.h>\n#   define __gl_h_ /* Prevent inclusion of the old gl.h */\n#else\n#   include <GL/gl.h>\n#endif\n\n#include <Eigen/LU>\n\n//#define GLFW_INCLUDE_GLU\n#if defined(__APPLE__)\n#define GLFW_INCLUDE_GLCOREARB\n#else\n#define GL_GLEXT_PROTOTYPES\n#endif\n\n#include <GLFW/glfw3.h>\n\n#include <cmath>\n#include <cstdio>\n#include <sstream>\n#include <iomanip>\n#include <iostream>\n#include <fstream>\n#include <algorithm>\n#include <limits>\n#include <cassert>\n\n#ifdef IGL_VIEWER_WITH_NANOGUI\n#  include <nanogui/formhelper.h>\n#  include <nanogui/screen.h>\n#endif\n\n#include <igl/project.h>\n#include <igl/get_seconds.h>\n#include <igl/readOBJ.h>\n#include <igl/readOFF.h>\n#include <igl/adjacency_list.h>\n#include <igl/writeOBJ.h>\n#include <igl/writeOFF.h>\n#include <igl/massmatrix.h>\n#include <igl/file_dialog_open.h>\n#include <igl/file_dialog_save.h>\n#include <igl/quat_mult.h>\n#include <igl/axis_angle_to_quat.h>\n#include <igl/trackball.h>\n#include <igl/two_axis_valuator_fixed_up.h>\n#include <igl/snap_to_canonical_view_quat.h>\n#include <igl/unproject.h>\n\n#ifdef ENABLE_SERIALIZATION\n#include <igl/serialize.h>\n#endif\n\n// Internal global variables used for glfw event handling\nstatic igl::viewer::Viewer * __viewer;\nstatic double highdpi = 1;\nstatic double scroll_x = 0;\nstatic double scroll_y = 0;\n\nstatic void glfw_mouse_press(GLFWwindow* window, int button, int action, int modifier)\n{\n  bool tw_used =\n#ifdef IGL_VIEWER_WITH_NANOGUI\n    __viewer->screen->mouseButtonCallbackEvent(button,action,modifier);\n#else\n    false;\n#endif\n\n  igl::viewer::Viewer::MouseButton mb;\n\n  if (button == GLFW_MOUSE_BUTTON_1)\n    mb = igl::viewer::Viewer::MouseButton::Left;\n  else if (button == GLFW_MOUSE_BUTTON_2)\n    mb = igl::viewer::Viewer::MouseButton::Right;\n  else //if (button == GLFW_MOUSE_BUTTON_3)\n    mb = igl::viewer::Viewer::MouseButton::Middle;\n\n  if (action == GLFW_PRESS)\n  {\n    if(!tw_used)\n    {\n      __viewer->mouse_down(mb,modifier);\n    }\n  } else\n  {\n    // Always call mouse_up on up\n    __viewer->mouse_up(mb,modifier);\n  }\n\n}\n\nstatic void glfw_error_callback(int error, const char* description)\n{\n  fputs(description, stderr);\n}\n\nstatic void glfw_char_mods_callback(GLFWwindow* window, unsigned int codepoint, int modifier)\n{\n  // TODO: pass to nanogui (although it's also using physical key down/up\n  // rather than character codes...\n#ifdef IGL_VIEWER_WITH_NANOGUI\n  if(! __viewer->screen->charCallbackEvent(codepoint) )\n#endif\n  {\n    __viewer->key_pressed(codepoint, modifier);\n  }\n}\n\nstatic void glfw_key_callback(GLFWwindow* window, int key, int scancode, int action, int modifier)\n{\n  if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)\n    glfwSetWindowShouldClose(window, GL_TRUE);\n\n#ifdef IGL_VIEWER_WITH_NANOGUI\n  if (__viewer->screen->keyCallbackEvent(key,scancode,action,modifier) == false)\n#endif\n  {\n    if (action == GLFW_PRESS)\n      __viewer->key_down(key, modifier);\n    else if(action == GLFW_RELEASE)\n      __viewer->key_up(key, modifier);\n  }\n}\n\nstatic void glfw_window_size(GLFWwindow* window, int width, int height)\n{\n  int w = width*highdpi;\n  int h = height*highdpi;\n\n  __viewer->resize(w, h);\n\n  // TODO: repositioning of the nanogui\n}\n\nstatic void glfw_mouse_move(GLFWwindow* window, double x, double y)\n{\n  if(\n#ifdef IGL_VIEWER_WITH_NANOGUI\n      __viewer->screen->cursorPosCallbackEvent(x,y) == false &&\n#endif\n      true\n    )\n  {\n    __viewer->mouse_move(x*highdpi, y*highdpi);\n  }\n}\n\nstatic void glfw_mouse_scroll(GLFWwindow* window, double x, double y)\n{\n  using namespace std;\n  scroll_x += x;\n  scroll_y += y;\n\n#ifdef IGL_VIEWER_WITH_NANOGUI\n  if (__viewer->screen->scrollCallbackEvent(x,y) == false)\n#endif\n  {\n    __viewer->mouse_scroll(y);\n  }\n}\n\nstatic void glfw_drop_callback(GLFWwindow *window,int count,const char **filenames)\n{\n#ifdef IGL_VIEWER_WITH_NANOGUI\n  __viewer->screen->dropCallbackEvent(count,filenames);\n#endif\n}\n\nnamespace igl\n{\nnamespace viewer\n{\n  IGL_INLINE void Viewer::init()\n  {\n#ifdef IGL_VIEWER_WITH_NANOGUI\n    using namespace nanogui;\n\n    ngui->setFixedSize(Eigen::Vector2i(60,20));\n\n    // Create nanogui widgets\n    nanogui::Window *window = ngui->addWindow(Eigen::Vector2i(10,10),\"libIGL-Viewer\");\n\n    // ---------------------- LOADING ----------------------\n\n  #ifdef ENABLE_SERIALIZATION\n    ngui->addGroup(\"Workspace\");\n    ngui->addButton(\"Load\",[&](){this->load_scene();});\n    ngui->addButton(\"Save\",[&](){this->save_scene();});\n  #endif\n\n  #ifdef ENABLE_IO\n    ngui->addGroup(\"Mesh\");\n    ngui->addButton(\"Load\",[&](){this->open_dialog_load_mesh();});\n    ngui->addButton(\"Save\",[&](){this->open_dialog_save_mesh();});\n  #endif\n\n    ngui->addGroup(\"Viewing Options\");\n    ngui->addButton(\"Center object\",[&](){this->core.align_camera_center(this->data.V,this->data.F);});\n    ngui->addButton(\"Snap canonical view\",[&]()\n    {\n      this->snap_to_canonical_quaternion();\n    });\n    ngui->addVariable(\"Zoom\", core.camera_zoom);\n    ngui->addVariable(\"Orthographic view\", core.orthographic);\n\n    ngui->addGroup(\"Draw options\");\n\n    ngui->addVariable<bool>(\"Face-based\", [&](bool checked)\n    {\n      this->data.set_face_based(checked);\n    },[&]()\n    {\n      return this->data.face_based;\n    });\n\n    ngui->addVariable(\"Show texture\",core.show_texture);\n\n    ngui->addVariable<bool>(\"Invert normals\",[&](bool checked)\n    {\n      this->data.dirty |= ViewerData::DIRTY_NORMAL;\n      this->core.invert_normals = checked;\n    },[&]()\n    {\n      return this->core.invert_normals;\n    });\n\n    ngui->addVariable(\"Show overlay\", core.show_overlay);\n    ngui->addVariable(\"Show overlay depth\", core.show_overlay_depth);\n    ngui->addVariable(\"Background\", (nanogui::Color &) core.background_color);\n    ngui->addVariable(\"Line color\", (nanogui::Color &) core.line_color);\n    ngui->addVariable(\"Shininess\", core.shininess);\n\n    ngui->addGroup(\"Overlays\");\n    ngui->addVariable(\"Wireframe\", core.show_lines);\n    ngui->addVariable(\"Fill\", core.show_faces);\n    ngui->addVariable(\"Show vertex labels\", core.show_vertid);\n    ngui->addVariable(\"Show faces labels\", core.show_faceid);\n\n    screen->setVisible(true);\n    screen->performLayout();\n#endif\n\n    core.init();\n\n    if (callback_init)\n      if (callback_init(*this))\n        return;\n\n    init_plugins();\n  }\n\n  IGL_INLINE Viewer::Viewer()\n  {\n#ifdef IGL_VIEWER_WITH_NANOGUI\n    ngui = nullptr;\n    screen = nullptr;\n#endif\n\n    // Temporary variables initialization\n    down = false;\n    hack_never_moved = true;\n    scroll_position = 0.0f;\n\n    // Per face\n    data.set_face_based(false);\n\n    // C-style callbacks\n    callback_init         = nullptr;\n    callback_pre_draw     = nullptr;\n    callback_post_draw    = nullptr;\n    callback_mouse_down   = nullptr;\n    callback_mouse_up     = nullptr;\n    callback_mouse_move   = nullptr;\n    callback_mouse_scroll = nullptr;\n    callback_key_down     = nullptr;\n    callback_key_up       = nullptr;\n\n    callback_init_data          = nullptr;\n    callback_pre_draw_data      = nullptr;\n    callback_post_draw_data     = nullptr;\n    callback_mouse_down_data    = nullptr;\n    callback_mouse_up_data      = nullptr;\n    callback_mouse_move_data    = nullptr;\n    callback_mouse_scroll_data  = nullptr;\n    callback_key_down_data      = nullptr;\n    callback_key_up_data        = nullptr;\n\n#ifndef IGL_VIEWER_VIEWER_QUIET\n    const std::string usage(R\"(igl::viewer::Viewer usage:\n  [drag]  Rotate scene\n  A,a     Toggle animation (tight draw loop)\n  F,f     Toggle face based\n  I,i     Toggle invert normals\n  L,l     Toggle wireframe\n  O,o     Toggle orthographic/perspective projection\n  T,t     Toggle filled faces\n  Z       Snap to canonical view\n  [,]     Toggle between rotation control types (e.g. trackball, two-axis\n          valuator with fixed up))\"\n#ifdef IGL_VIEWER_WITH_NANOGUI\n\t\tR\"(\n  ;       Toggle vertex labels\n  :       Toggle face labels)\"\n#endif\n);\n    std::cout<<usage<<std::endl;\n#endif\n  }\n\n  IGL_INLINE void Viewer::init_plugins()\n  {\n    // Init all plugins\n    for (unsigned int i = 0; i<plugins.size(); ++i)\n    {\n      plugins[i]->init(this);\n    }\n  }\n\n  IGL_INLINE Viewer::~Viewer()\n  {\n  }\n\n  IGL_INLINE void Viewer::shutdown_plugins()\n  {\n    for (unsigned int i = 0; i<plugins.size(); ++i)\n    {\n      plugins[i]->shutdown();\n    }\n  }\n\n  IGL_INLINE bool Viewer::load_mesh_from_file(const char* mesh_file_name)\n  {\n    std::string mesh_file_name_string = std::string(mesh_file_name);\n\n    // first try to load it with a plugin\n    for (unsigned int i = 0; i<plugins.size(); ++i)\n    {\n      if (plugins[i]->load(mesh_file_name_string))\n      {\n        return true;\n      }\n    }\n\n    data.clear();\n\n    size_t last_dot = mesh_file_name_string.rfind('.');\n    if (last_dot == std::string::npos)\n    {\n      printf(\"Error: No file extension found in %s\\n\",mesh_file_name);\n      return false;\n    }\n\n    std::string extension = mesh_file_name_string.substr(last_dot+1);\n\n    if (extension == \"off\" || extension ==\"OFF\")\n    {\n      Eigen::MatrixXd V;\n      Eigen::MatrixXi F;\n      if (!igl::readOFF(mesh_file_name_string, V, F))\n        return false;\n      data.set_mesh(V,F);\n    }\n    else if (extension == \"obj\" || extension ==\"OBJ\")\n    {\n      Eigen::MatrixXd corner_normals;\n      Eigen::MatrixXi fNormIndices;\n\n      Eigen::MatrixXd UV_V;\n      Eigen::MatrixXi UV_F;\n      Eigen::MatrixXd V;\n      Eigen::MatrixXi F;\n\n      if (!(\n            igl::readOBJ(\n              mesh_file_name_string,\n              V, UV_V, corner_normals, F, UV_F, fNormIndices)))\n      {\n        return false;\n      }\n\n      data.set_mesh(V,F);\n      data.set_uv(UV_V,UV_F);\n\n    }\n    else\n    {\n      // unrecognized file type\n      printf(\"Error: %s is not a recognized file type.\\n\",extension.c_str());\n      return false;\n    }\n\n    data.compute_normals();\n    data.uniform_colors(Eigen::Vector3d(51.0/255.0,43.0/255.0,33.3/255.0),\n                   Eigen::Vector3d(255.0/255.0,228.0/255.0,58.0/255.0),\n                   Eigen::Vector3d(255.0/255.0,235.0/255.0,80.0/255.0));\n    if (data.V_uv.rows() == 0)\n    {\n      data.grid_texture();\n    }\n\n    core.align_camera_center(data.V,data.F);\n\n    for (unsigned int i = 0; i<plugins.size(); ++i)\n      if (plugins[i]->post_load())\n        return true;\n\n    return true;\n  }\n\n  IGL_INLINE bool Viewer::save_mesh_to_file(const char* mesh_file_name)\n  {\n    std::string mesh_file_name_string(mesh_file_name);\n\n    // first try to load it with a plugin\n    for (unsigned int i = 0; i<plugins.size(); ++i)\n      if (plugins[i]->save(mesh_file_name_string))\n        return true;\n\n    size_t last_dot = mesh_file_name_string.rfind('.');\n    if (last_dot == std::string::npos)\n    {\n      // No file type determined\n      printf(\"Error: No file extension found in %s\\n\",mesh_file_name);\n      return false;\n    }\n    std::string extension = mesh_file_name_string.substr(last_dot+1);\n    if (extension == \"off\" || extension ==\"OFF\")\n    {\n      return igl::writeOFF(mesh_file_name_string,data.V,data.F);\n    }\n    else if (extension == \"obj\" || extension ==\"OBJ\")\n    {\n      Eigen::MatrixXd corner_normals;\n      Eigen::MatrixXi fNormIndices;\n\n      Eigen::MatrixXd UV_V;\n      Eigen::MatrixXi UV_F;\n\n      return igl::writeOBJ(mesh_file_name_string, data.V,\n          data.F, corner_normals, fNormIndices, UV_V, UV_F);\n    }\n    else\n    {\n      // unrecognized file type\n      printf(\"Error: %s is not a recognized file type.\\n\",extension.c_str());\n      return false;\n    }\n    return true;\n  }\n\n  IGL_INLINE bool Viewer::key_pressed(unsigned int unicode_key,int modifiers)\n  {\n    if (callback_key_pressed)\n      if (callback_key_pressed(*this,unicode_key,modifiers))\n        return true;\n\n    for (unsigned int i = 0; i<plugins.size(); ++i)\n    {\n      if (plugins[i]->key_pressed(unicode_key, modifiers))\n      {\n        return true;\n      }\n    }\n\n    switch(unicode_key)\n    {\n      case 'A':\n      case 'a':\n      {\n        core.is_animating = !core.is_animating;\n        return true;\n      }\n      case 'F':\n      case 'f':\n      {\n        data.set_face_based(!data.face_based);\n        return true;\n      }\n      case 'I':\n      case 'i':\n      {\n        data.dirty |= ViewerData::DIRTY_NORMAL;\n        core.invert_normals = !core.invert_normals;\n        return true;\n      }\n      case 'L':\n      case 'l':\n      {\n        core.show_lines = !core.show_lines;\n        return true;\n      }\n      case 'O':\n      case 'o':\n      {\n        core.orthographic = !core.orthographic;\n        return true;\n      }\n      case 'T':\n      case 't':\n      {\n        core.show_faces = !core.show_faces;\n        return true;\n      }\n      case 'Z':\n      {\n        snap_to_canonical_quaternion();\n        return true;\n      }\n      case '[':\n      case ']':\n      {\n        if(core.rotation_type == ViewerCore::ROTATION_TYPE_TRACKBALL)\n        {\n          core.set_rotation_type(\n            ViewerCore::ROTATION_TYPE_TWO_AXIS_VALUATOR_FIXED_UP);\n        }else\n        {\n          core.set_rotation_type(ViewerCore::ROTATION_TYPE_TRACKBALL);\n        }\n        return true;\n      }\n#ifdef IGL_VIEWER_WITH_NANOGUI\n      case ';':\n        core.show_vertid = !core.show_vertid;\n        return true;\n      case ':':\n        core.show_faceid = !core.show_faceid;\n        return true;\n#endif\n      default: break;//do nothing\n    }\n    return false;\n  }\n\n  IGL_INLINE bool Viewer::key_down(int key,int modifiers)\n  {\n    if (callback_key_down)\n      if (callback_key_down(*this,key,modifiers))\n        return true;\n    for (unsigned int i = 0; i<plugins.size(); ++i)\n      if (plugins[i]->key_down(key, modifiers))\n        return true;\n    return false;\n  }\n\n  IGL_INLINE bool Viewer::key_up(int key,int modifiers)\n  {\n    if (callback_key_up)\n      if (callback_key_up(*this,key,modifiers))\n        return true;\n\n    for (unsigned int i = 0; i<plugins.size(); ++i)\n      if (plugins[i]->key_up(key, modifiers))\n        return true;\n\n    return false;\n  }\n\n  IGL_INLINE bool Viewer::mouse_down(MouseButton button,int modifier)\n  {\n    // Remember mouse location at down even if used by callback/plugin\n    down_mouse_x = current_mouse_x;\n    down_mouse_y = current_mouse_y;\n\n    if (callback_mouse_down)\n      if (callback_mouse_down(*this,static_cast<int>(button),modifier))\n        return true;\n\n    for (unsigned int i = 0; i<plugins.size(); ++i)\n      if(plugins[i]->mouse_down(static_cast<int>(button),modifier))\n        return true;\n\n    down = true;\n\n    down_translation = core.model_translation;\n\n\n    // Initialization code for the trackball\n    Eigen::RowVector3d center;\n    if (data.V.rows() == 0)\n    {\n      center << 0,0,0;\n    }else\n    {\n      center = data.V.colwise().sum()/data.V.rows();\n    }\n\n    Eigen::Vector3f coord =\n      igl::project(\n        Eigen::Vector3f(center(0),center(1),center(2)),\n        (core.view * core.model).eval(),\n        core.proj,\n        core.viewport);\n    down_mouse_z = coord[2];\n    down_rotation = core.trackball_angle;\n\n    mouse_mode = MouseMode::Rotation;\n\n    switch (button)\n    {\n      case MouseButton::Left:\n        mouse_mode = MouseMode::Rotation;\n        break;\n\n      case MouseButton::Right:\n        mouse_mode = MouseMode::Translation;\n        break;\n\n      default:\n        mouse_mode = MouseMode::None;\n        break;\n    }\n\n    return true;\n  }\n\n  IGL_INLINE bool Viewer::mouse_up(MouseButton button,int modifier)\n  {\n    down = false;\n\n    if (callback_mouse_up)\n      if (callback_mouse_up(*this,static_cast<int>(button),modifier))\n        return true;\n\n    for (unsigned int i = 0; i<plugins.size(); ++i)\n      if(plugins[i]->mouse_up(static_cast<int>(button),modifier))\n          return true;\n\n    mouse_mode = MouseMode::None;\n\n    return true;\n  }\n\n  IGL_INLINE bool Viewer::mouse_move(int mouse_x,int mouse_y)\n  {\n    if(hack_never_moved)\n    {\n      down_mouse_x = mouse_x;\n      down_mouse_y = mouse_y;\n      hack_never_moved = false;\n    }\n    current_mouse_x = mouse_x;\n    current_mouse_y = mouse_y;\n\n    if (callback_mouse_move)\n      if (callback_mouse_move(*this,mouse_x,mouse_y))\n        return true;\n\n    for (unsigned int i = 0; i<plugins.size(); ++i)\n      if (plugins[i]->mouse_move(mouse_x, mouse_y))\n        return true;\n\n    if (down)\n    {\n      switch (mouse_mode)\n      {\n        case MouseMode::Rotation:\n        {\n          switch(core.rotation_type)\n          {\n            default:\n              assert(false && \"Unknown rotation type\");\n            case ViewerCore::ROTATION_TYPE_TRACKBALL:\n              igl::trackball(\n                core.viewport(2),\n                core.viewport(3),\n                2.0f,\n                down_rotation,\n                down_mouse_x,\n                down_mouse_y,\n                mouse_x,\n                mouse_y,\n                core.trackball_angle);\n              break;\n            case ViewerCore::ROTATION_TYPE_TWO_AXIS_VALUATOR_FIXED_UP:\n              igl::two_axis_valuator_fixed_up(\n                core.viewport(2),core.viewport(3),\n                2.0,\n                down_rotation,\n                down_mouse_x, down_mouse_y, mouse_x, mouse_y,\n                core.trackball_angle);\n              break;\n          }\n          //Eigen::Vector4f snapq = core.trackball_angle;\n\n          break;\n        }\n\n        case MouseMode::Translation:\n        {\n          //translation\n          Eigen::Vector3f pos1 = igl::unproject(Eigen::Vector3f(mouse_x, core.viewport[3] - mouse_y, down_mouse_z), (core.view * core.model).eval(), core.proj, core.viewport);\n          Eigen::Vector3f pos0 = igl::unproject(Eigen::Vector3f(down_mouse_x, core.viewport[3] - down_mouse_y, down_mouse_z), (core.view * core.model).eval(), core.proj, core.viewport);\n\n          Eigen::Vector3f diff = pos1 - pos0;\n          core.model_translation = down_translation + Eigen::Vector3f(diff[0],diff[1],diff[2]);\n\n          break;\n        }\n        case MouseMode::Zoom:\n        {\n          float delta = 0.001f * (mouse_x - down_mouse_x + mouse_y - down_mouse_y);\n          core.camera_zoom *= 1 + delta;\n          down_mouse_x = mouse_x;\n          down_mouse_y = mouse_y;\n          break;\n        }\n\n        default:\n          break;\n      }\n    }\n    return true;\n  }\n\n  IGL_INLINE bool Viewer::mouse_scroll(float delta_y)\n  {\n    scroll_position += delta_y;\n\n    if (callback_mouse_scroll)\n      if (callback_mouse_scroll(*this,delta_y))\n        return true;\n\n    for (unsigned int i = 0; i<plugins.size(); ++i)\n      if (plugins[i]->mouse_scroll(delta_y))\n        return true;\n\n    // Only zoom if there's actually a change\n    if(delta_y != 0)\n    {\n      float mult = (1.0+((delta_y>0)?1.:-1.)*0.05);\n      const float min_zoom = 0.1f;\n      core.camera_zoom = (core.camera_zoom * mult > min_zoom ? core.camera_zoom * mult : min_zoom);\n    }\n    return true;\n  }\n\n  IGL_INLINE void Viewer::draw()\n  {\n    using namespace std;\n    using namespace Eigen;\n\n    core.clear_framebuffers();\n\n    if (callback_pre_draw)\n      if (callback_pre_draw(*this))\n        return;\n\n    for (unsigned int i = 0; i<plugins.size(); ++i)\n      if (plugins[i]->pre_draw())\n        return;\n\n    core.draw(data,opengl);\n\n    if (callback_post_draw)\n      if (callback_post_draw(*this))\n        return;\n\n    for (unsigned int i = 0; i<plugins.size(); ++i)\n      if (plugins[i]->post_draw())\n        break;\n\n#ifdef IGL_VIEWER_WITH_NANOGUI\n\tscreen->drawContents();\n\tscreen->drawWidgets();\n#endif\n  }\n\n  IGL_INLINE bool Viewer::save_scene()\n  {\n    std::string fname = igl::file_dialog_save();\n    if (fname.length() == 0)\n      return false;\n\n#ifdef ENABLE_SERIALIZATION\n\n    igl::serialize(core,\"Core\",fname.c_str(),true);\n\n#ifndef ENABLE_SERIALIZATION_CORE_ONLY\n    igl::serialize(data,\"Data\",fname.c_str());\n    for(unsigned int i = 0; i <plugins.size(); ++i)\n      igl::serialize(*plugins[i],plugins[i]->plugin_name,fname.c_str());\n#endif\n\n#endif\n\n    return true;\n  }\n\n  IGL_INLINE bool Viewer::load_scene()\n  {\n    std::string fname = igl::file_dialog_open();\n    if(fname.length() == 0)\n      return false;\n\n    return load_scene(fname);\n  }\n\n  IGL_INLINE bool Viewer::load_scene(std::string fname)\n  {\n#ifdef ENABLE_SERIALIZATION\n\n    igl::deserialize(core,\"Core\",fname.c_str());\n\n#ifndef ENABLE_SERIALIZATION_CORE_ONLY\n    igl::deserialize(data,\"Data\",fname.c_str());\n    for(unsigned int i = 0; i <plugins.size(); ++i)\n      igl::deserialize(*plugins[i],plugins[i]->plugin_name,fname.c_str());\n#endif\n\n#endif\n\n    return true;\n  }\n\n  IGL_INLINE void Viewer::resize(int w,int h)\n  {\n    core.viewport = Eigen::Vector4f(0,0,w,h);\n  }\n\n  IGL_INLINE void Viewer::snap_to_canonical_quaternion()\n  {\n    Eigen::Quaternionf snapq = this->core.trackball_angle;\n    igl::snap_to_canonical_view_quat(snapq,1.0f,this->core.trackball_angle);\n  }\n\n  IGL_INLINE void Viewer::open_dialog_load_mesh()\n  {\n    std::string fname = igl::file_dialog_open();\n\n    if (fname.length() == 0)\n      return;\n\n    this->load_mesh_from_file(fname.c_str());\n  }\n\n  IGL_INLINE void Viewer::open_dialog_save_mesh()\n  {\n    std::string fname = igl::file_dialog_save();\n\n    if(fname.length() == 0)\n      return;\n\n    this->save_mesh_to_file(fname.c_str());\n  }\n\n\n  IGL_INLINE int  Viewer::launch_init(bool resizable,bool fullscreen)\n  {\n    glfwSetErrorCallback(glfw_error_callback);\n    if (!glfwInit())\n      return EXIT_FAILURE;\n\n    glfwWindowHint(GLFW_SAMPLES, 8);\n    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);\n    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);\n\n    #ifdef __APPLE__\n      glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);\n      glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);\n    #endif\n\n    if(fullscreen)\n    {\n      GLFWmonitor *monitor = glfwGetPrimaryMonitor();\n      const GLFWvidmode *mode = glfwGetVideoMode(monitor);\n      window = glfwCreateWindow(mode->width,mode->height,\"libigl viewer\",monitor,nullptr);\n    }\n    else\n    {\n      window = glfwCreateWindow(1280,800,\"libigl viewer\",nullptr,nullptr);\n    }\n\n    if (!window)\n    {\n      glfwTerminate();\n      return EXIT_FAILURE;\n    }\n\n    glfwMakeContextCurrent(window);\n\n    #ifndef __APPLE__\n      glewExperimental = true;\n      GLenum err = glewInit();\n      if(GLEW_OK != err)\n      {\n        /* Problem: glewInit failed, something is seriously wrong. */\n       fprintf(stderr, \"Error: %s\\n\", glewGetErrorString(err));\n      }\n      glGetError(); // pull and savely ignonre unhandled errors like GL_INVALID_ENUM\n      fprintf(stdout, \"Status: Using GLEW %s\\n\", glewGetString(GLEW_VERSION));\n    #endif\n\n    #if defined(DEBUG) || defined(_DEBUG)\n      int major, minor, rev;\n      major = glfwGetWindowAttrib(window, GLFW_CONTEXT_VERSION_MAJOR);\n      minor = glfwGetWindowAttrib(window, GLFW_CONTEXT_VERSION_MINOR);\n      rev = glfwGetWindowAttrib(window, GLFW_CONTEXT_REVISION);\n      printf(\"OpenGL version recieved: %d.%d.%d\\n\", major, minor, rev);\n      printf(\"Supported OpenGL is %s\\n\", (const char*)glGetString(GL_VERSION));\n      printf(\"Supported GLSL is %s\\n\", (const char*)glGetString(GL_SHADING_LANGUAGE_VERSION));\n    #endif\n\n    glfwSetInputMode(window,GLFW_CURSOR,GLFW_CURSOR_NORMAL);\n\n    // Initialize FormScreen\n#ifdef IGL_VIEWER_WITH_NANOGUI\n    screen = new nanogui::Screen();\n    screen->initialize(window, false);\n    ngui = new nanogui::FormHelper(screen);\n#endif\n\n    __viewer = this;\n\n    // Register callbacks\n    glfwSetKeyCallback(window, glfw_key_callback);\n    glfwSetCursorPosCallback(window,glfw_mouse_move);\n    glfwSetWindowSizeCallback(window,glfw_window_size);\n    glfwSetMouseButtonCallback(window,glfw_mouse_press);\n    glfwSetScrollCallback(window,glfw_mouse_scroll);\n    glfwSetCharModsCallback(window,glfw_char_mods_callback);\n    glfwSetDropCallback(window,glfw_drop_callback);\n\n    // Handle retina displays (windows and mac)\n    int width, height;\n    glfwGetFramebufferSize(window, &width, &height);\n\n    int width_window, height_window;\n    glfwGetWindowSize(window, &width_window, &height_window);\n\n    highdpi = width/width_window;\n\n    glfw_window_size(window,width_window,height_window);\n\n    opengl.init();\n\n    core.align_camera_center(data.V,data.F);\n\n    // Initialize IGL viewer\n    init();\n    return EXIT_SUCCESS;\n  }\n\n  IGL_INLINE bool Viewer::launch_rendering(bool loop)\n  {\n    // glfwMakeContextCurrent(window);\n\n    // Rendering loop\n    while (!glfwWindowShouldClose(window))\n    {\n      double tic = get_seconds();\n      draw();\n\n      glfwSwapBuffers(window);\n      if(core.is_animating)\n      {\n        glfwPollEvents();\n        // In microseconds\n        double duration = 1000000.*(get_seconds()-tic);\n        const double min_duration = 1000000./core.animation_max_fps;\n        if(duration<min_duration)\n        {\n          std::this_thread::sleep_for(std::chrono::microseconds((int)(min_duration-duration)));\n        }\n      }\n      else\n      {\n        glfwWaitEvents();\n      }\n\n      if (!loop)\n        return !glfwWindowShouldClose(window);\n    }\n    return EXIT_SUCCESS;\n  }\n\n  IGL_INLINE void Viewer::launch_shut()\n  {\n    opengl.free();\n    core.shut();\n\n    shutdown_plugins();\n#ifdef IGL_VIEWER_WITH_NANOGUI\n    delete ngui;\n    //delete screen;\n    screen = nullptr;\n    ngui = nullptr;\n#endif\n\n    glfwDestroyWindow(window);\n    glfwTerminate();\n    return;\n  }\n\n  IGL_INLINE int Viewer::launch(bool resizable,bool fullscreen)\n  {\n    // TODO return values are being ignored...\n    launch_init(resizable,fullscreen);\n    launch_rendering(true);\n    launch_shut();\n    return EXIT_SUCCESS;\n  }\n} // end namespace\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/viewer/Viewer.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_VIEWER_VIEWER_H\n#define IGL_VIEWER_VIEWER_H\n\n#ifndef IGL_OPENGL_4\n#define IGL_OPENGL_4\n#endif\n\n#include <vector>\n#include <string>\n#include <cstdint>\n\n#include <Eigen/Core>\n#include <Eigen/Geometry>\n\n#include <igl/igl_inline.h>\n\n#include \"OpenGL_shader.h\"\n#include \"OpenGL_state.h\"\n#include \"ViewerCore.h\"\n#include \"ViewerData.h\"\n#include \"ViewerPlugin.h\"\n\n#define IGL_MOD_SHIFT           0x0001\n#define IGL_MOD_CONTROL         0x0002\n#define IGL_MOD_ALT             0x0004\n#define IGL_MOD_SUPER           0x0008\n\n#ifdef IGL_VIEWER_WITH_NANOGUI\nnamespace nanogui { class FormHelper; class Screen; }\n#endif\n\nclass GLFWwindow;\n\nnamespace igl\n{\nnamespace viewer\n{\n  // GLFW-based mesh viewer\n  class Viewer\n  {\n  public:\n    GLFWwindow* window;\n\n    IGL_INLINE int launch(bool resizable = true,bool fullscreen = false);\n    IGL_INLINE int launch_init(bool resizable = true,bool fullscreen = false);\n    IGL_INLINE bool launch_rendering(bool loop = true);\n    IGL_INLINE void launch_shut();\n\n    IGL_INLINE void init();\n\n    // Stores all the viewing options\n    ViewerCore core;\n\n    // Stores all the data that should be visualized\n    ViewerData data;\n\n    // Stores the vbos indices and opengl related settings\n    OpenGL_state opengl;\n\n    // List of registered plugins\n    std::vector<ViewerPlugin*> plugins;\n    IGL_INLINE void init_plugins();\n    IGL_INLINE void shutdown_plugins();\n\n    // Temporary data stored when the mouse button is pressed\n    Eigen::Quaternionf down_rotation;\n    int current_mouse_x;\n    int current_mouse_y;\n    int down_mouse_x;\n    int down_mouse_y;\n    float down_mouse_z;\n    Eigen::Vector3f down_translation;\n    bool down;\n    bool hack_never_moved;\n\n#ifdef IGL_VIEWER_WITH_NANOGUI\n    nanogui::FormHelper* ngui;\n    nanogui::Screen* screen;\n#endif\n\n    // Keep track of the global position of the scrollwheel\n    float scroll_position;\n\n    // UI Enumerations\n    enum class MouseButton {Left, Middle, Right};\n    enum class MouseMode { None, Rotation, Zoom, Pan, Translation} mouse_mode;\n\n    Viewer();\n    ~Viewer();\n\n    // Mesh IO\n    IGL_INLINE bool load_mesh_from_file(const char* mesh_file_name);\n    IGL_INLINE bool save_mesh_to_file(const char* mesh_file_name);\n\n    // Callbacks\n    IGL_INLINE bool key_pressed(unsigned int unicode_key,int modifier);\n    IGL_INLINE bool key_down(int key,int modifier);\n    IGL_INLINE bool key_up(int key,int modifier);\n\n    IGL_INLINE bool mouse_down(MouseButton button,int modifier);\n    IGL_INLINE bool mouse_up(MouseButton button,int modifier);\n\n    IGL_INLINE bool mouse_move(int mouse_x,int mouse_y);\n    IGL_INLINE bool mouse_scroll(float delta_y);\n\n    // Scene IO\n    IGL_INLINE bool load_scene();\n    IGL_INLINE bool load_scene(std::string fname);\n    IGL_INLINE bool save_scene();\n\n    // Draw everything\n    IGL_INLINE void draw();\n\n    // OpenGL context resize\n    IGL_INLINE void resize(int w,int h);\n\n    // Helper functions\n    IGL_INLINE void snap_to_canonical_quaternion();\n    IGL_INLINE void open_dialog_load_mesh();\n    IGL_INLINE void open_dialog_save_mesh();\n\n    // C++-style functions\n    //\n    // Returns **true** if action should be cancelled.\n    std::function<bool(Viewer& viewer)> callback_init;\n    std::function<bool(Viewer& viewer)> callback_pre_draw;\n    std::function<bool(Viewer& viewer)> callback_post_draw;\n    std::function<bool(Viewer& viewer, int button, int modifier)> callback_mouse_down;\n    std::function<bool(Viewer& viewer, int button, int modifier)> callback_mouse_up;\n    std::function<bool(Viewer& viewer, int mouse_x, int mouse_y)> callback_mouse_move;\n    std::function<bool(Viewer& viewer, float delta_y)> callback_mouse_scroll;\n    std::function<bool(Viewer& viewer, unsigned int key, int modifiers)> callback_key_pressed;\n    // THESE SHOULD BE DEPRECATED:\n    std::function<bool(Viewer& viewer, unsigned char key, int modifiers)> callback_key_down;\n    std::function<bool(Viewer& viewer, unsigned char key, int modifiers)> callback_key_up;\n\n    // Pointers to per-callback data\n    void* callback_init_data;\n    void* callback_pre_draw_data;\n    void* callback_post_draw_data;\n    void* callback_mouse_down_data;\n    void* callback_mouse_up_data;\n    void* callback_mouse_move_data;\n    void* callback_mouse_scroll_data;\n    void* callback_key_pressed_data;\n    void* callback_key_down_data;\n    void* callback_key_up_data;\n\n  public:\n      EIGEN_MAKE_ALIGNED_OPERATOR_NEW\n  };\n\n} // end namespace\n} // end namespace\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"Viewer.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/viewer/ViewerCore.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"ViewerCore.h\"\n#include <igl/quat_to_mat.h>\n#include <igl/snap_to_fixed_up.h>\n#include <igl/look_at.h>\n#include <igl/frustum.h>\n#include <igl/ortho.h>\n#include <igl/massmatrix.h>\n#include <igl/barycenter.h>\n#include <Eigen/Geometry>\n#include <iostream>\n\n#ifdef ENABLE_SERIALIZATION\n#include <igl/serialize.h>\nnamespace igl {\n  namespace serialization {\n\n    IGL_INLINE void serialization(bool s,igl::viewer::ViewerCore& obj,std::vector<char>& buffer)\n    {\n      SERIALIZE_MEMBER(shininess);\n\n      SERIALIZE_MEMBER(background_color);\n      SERIALIZE_MEMBER(line_color);\n\n      SERIALIZE_MEMBER(light_position);\n      SERIALIZE_MEMBER(lighting_factor);\n\n      SERIALIZE_MEMBER(trackball_angle);\n      SERIALIZE_MEMBER(rotation_type);\n\n      SERIALIZE_MEMBER(model_zoom);\n      SERIALIZE_MEMBER(model_translation);\n\n      SERIALIZE_MEMBER(model_zoom_uv);\n      SERIALIZE_MEMBER(model_translation_uv);\n\n      SERIALIZE_MEMBER(camera_zoom);\n      SERIALIZE_MEMBER(orthographic);\n      SERIALIZE_MEMBER(camera_view_angle);\n      SERIALIZE_MEMBER(camera_dnear);\n      SERIALIZE_MEMBER(camera_dfar);\n      SERIALIZE_MEMBER(camera_eye);\n      SERIALIZE_MEMBER(camera_center);\n      SERIALIZE_MEMBER(camera_up);\n\n      SERIALIZE_MEMBER(show_faces);\n      SERIALIZE_MEMBER(show_lines);\n      SERIALIZE_MEMBER(invert_normals);\n      SERIALIZE_MEMBER(show_overlay);\n      SERIALIZE_MEMBER(show_overlay_depth);\n      SERIALIZE_MEMBER(show_vertid);\n      SERIALIZE_MEMBER(show_faceid);\n      SERIALIZE_MEMBER(show_texture);\n      SERIALIZE_MEMBER(depth_test);\n\n      SERIALIZE_MEMBER(point_size);\n      SERIALIZE_MEMBER(line_width);\n      SERIALIZE_MEMBER(is_animating);\n      SERIALIZE_MEMBER(animation_max_fps);\n\n      SERIALIZE_MEMBER(object_scale);\n\n      SERIALIZE_MEMBER(viewport);\n      SERIALIZE_MEMBER(view);\n      SERIALIZE_MEMBER(model);\n      SERIALIZE_MEMBER(proj);\n    }\n\n    template<>\n    IGL_INLINE void serialize(const igl::viewer::ViewerCore& obj,std::vector<char>& buffer)\n    {\n      serialization(true,const_cast<igl::viewer::ViewerCore&>(obj),buffer);\n    }\n\n    template<>\n    IGL_INLINE void deserialize(igl::viewer::ViewerCore& obj,const std::vector<char>& buffer)\n    {\n      serialization(false,obj,const_cast<std::vector<char>&>(buffer));\n    }\n  }\n}\n#endif\n\nIGL_INLINE void igl::viewer::ViewerCore::align_camera_center(\n  const Eigen::MatrixXd& V,\n  const Eigen::MatrixXi& F)\n{\n  if(V.rows() == 0)\n    return;\n\n  get_scale_and_shift_to_fit_mesh(V,F,model_zoom,model_translation);\n  // Rather than crash on empty mesh...\n  if(V.size() > 0)\n  {\n    object_scale = (V.colwise().maxCoeff() - V.colwise().minCoeff()).norm();\n  }\n}\n\nIGL_INLINE void igl::viewer::ViewerCore::get_scale_and_shift_to_fit_mesh(\n  const Eigen::MatrixXd& V,\n  const Eigen::MatrixXi& F,\n  float& zoom,\n  Eigen::Vector3f& shift)\n{\n  if (V.rows() == 0)\n    return;\n\n  Eigen::MatrixXd BC;\n  if (F.rows() <= 1)\n  {\n    BC = V;\n  } else\n  {\n    igl::barycenter(V,F,BC);\n  }\n  return get_scale_and_shift_to_fit_mesh(BC,zoom,shift);\n}\n\nIGL_INLINE void igl::viewer::ViewerCore::align_camera_center(\n  const Eigen::MatrixXd& V)\n{\n  if(V.rows() == 0)\n    return;\n\n  get_scale_and_shift_to_fit_mesh(V,model_zoom,model_translation);\n  // Rather than crash on empty mesh...\n  if(V.size() > 0)\n  {\n    object_scale = (V.colwise().maxCoeff() - V.colwise().minCoeff()).norm();\n  }\n}\n\nIGL_INLINE void igl::viewer::ViewerCore::get_scale_and_shift_to_fit_mesh(\n  const Eigen::MatrixXd& V,\n  float& zoom,\n  Eigen::Vector3f& shift)\n{\n  if (V.rows() == 0)\n    return;\n\n  auto min_point = V.colwise().minCoeff();\n  auto max_point = V.colwise().maxCoeff();\n  auto centroid  = (0.5*(min_point + max_point)).eval();\n  shift.setConstant(0);\n  shift.head(centroid.size()) = -centroid.cast<float>();\n  zoom = 2.0 / (max_point-min_point).array().abs().maxCoeff();\n}\n\n\nIGL_INLINE void igl::viewer::ViewerCore::clear_framebuffers()\n{\n  glClearColor(background_color[0],\n               background_color[1],\n               background_color[2],\n               1.0f);\n  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n}\n\nIGL_INLINE void igl::viewer::ViewerCore::draw(\n  ViewerData& data, \n  OpenGL_state& opengl, \n  bool update_matrices)\n{\n  using namespace std;\n  using namespace Eigen;\n\n  if (depth_test)\n    glEnable(GL_DEPTH_TEST);\n  else\n    glDisable(GL_DEPTH_TEST);\n\n  /* Bind and potentially refresh mesh/line/point data */\n  if (data.dirty)\n  {\n    opengl.set_data(data, invert_normals);\n    data.dirty = ViewerData::DIRTY_NONE;\n  }\n  opengl.bind_mesh();\n\n  // Initialize uniform\n  glViewport(viewport(0), viewport(1), viewport(2), viewport(3));\n\n  if(update_matrices)\n  {\n    model = Eigen::Matrix4f::Identity();\n    view  = Eigen::Matrix4f::Identity();\n    proj  = Eigen::Matrix4f::Identity();\n\n    // Set view\n    look_at( camera_eye, camera_center, camera_up, view);\n\n    float width  = viewport(2);\n    float height = viewport(3);\n\n    // Set projection\n    if (orthographic)\n    {\n      float length = (camera_eye - camera_center).norm();\n      float h = tan(camera_view_angle/360.0 * M_PI) * (length);\n      ortho(-h*width/height, h*width/height, -h, h, camera_dnear, camera_dfar,proj);\n    }\n    else\n    {\n      float fH = tan(camera_view_angle / 360.0 * M_PI) * camera_dnear;\n      float fW = fH * (double)width/(double)height;\n      frustum(-fW, fW, -fH, fH, camera_dnear, camera_dfar,proj);\n    }\n    // end projection\n\n    // Set model transformation\n    float mat[16];\n    igl::quat_to_mat(trackball_angle.coeffs().data(), mat);\n\n    for (unsigned i=0;i<4;++i)\n      for (unsigned j=0;j<4;++j)\n        model(i,j) = mat[i+4*j];\n\n    // Why not just use Eigen::Transform<double,3,Projective> for model...?\n    model.topLeftCorner(3,3)*=camera_zoom;\n    model.topLeftCorner(3,3)*=model_zoom;\n    model.col(3).head(3) += model.topLeftCorner(3,3)*model_translation;\n  }\n\n  // Send transformations to the GPU\n  GLint modeli = opengl.shader_mesh.uniform(\"model\");\n  GLint viewi  = opengl.shader_mesh.uniform(\"view\");\n  GLint proji  = opengl.shader_mesh.uniform(\"proj\");\n  glUniformMatrix4fv(modeli, 1, GL_FALSE, model.data());\n  glUniformMatrix4fv(viewi, 1, GL_FALSE, view.data());\n  glUniformMatrix4fv(proji, 1, GL_FALSE, proj.data());\n\n  // Light parameters\n  GLint specular_exponenti    = opengl.shader_mesh.uniform(\"specular_exponent\");\n  GLint light_position_worldi = opengl.shader_mesh.uniform(\"light_position_world\");\n  GLint lighting_factori      = opengl.shader_mesh.uniform(\"lighting_factor\");\n  GLint fixed_colori          = opengl.shader_mesh.uniform(\"fixed_color\");\n  GLint texture_factori       = opengl.shader_mesh.uniform(\"texture_factor\");\n\n  glUniform1f(specular_exponenti, shininess);\n  Vector3f rev_light = -1.*light_position;\n  glUniform3fv(light_position_worldi, 1, rev_light.data());\n  glUniform1f(lighting_factori, lighting_factor); // enables lighting\n  glUniform4f(fixed_colori, 0.0, 0.0, 0.0, 0.0);\n\n  if (data.V.rows()>0)\n  {\n    // Render fill\n    if (show_faces)\n    {\n      // Texture\n      glUniform1f(texture_factori, show_texture ? 1.0f : 0.0f);\n      opengl.draw_mesh(true);\n      glUniform1f(texture_factori, 0.0f);\n    }\n\n    // Render wireframe\n    if (show_lines)\n    {\n      glLineWidth(line_width);\n      glUniform4f(fixed_colori, line_color[0], line_color[1],\n        line_color[2], 1.0f);\n      opengl.draw_mesh(false);\n      glUniform4f(fixed_colori, 0.0f, 0.0f, 0.0f, 0.0f);\n    }\n\n#ifdef IGL_VIEWER_WITH_NANOGUI\n    if (show_vertid)\n    {\n      textrenderer.BeginDraw(view*model, proj, viewport, object_scale);\n      for (int i=0; i<data.V.rows(); ++i)\n        textrenderer.DrawText(data.V.row(i),data.V_normals.row(i),to_string(i));\n      textrenderer.EndDraw();\n    }\n\n    if (show_faceid)\n    {\n      textrenderer.BeginDraw(view*model, proj, viewport, object_scale);\n\n      for (int i=0; i<data.F.rows(); ++i)\n      {\n        Eigen::RowVector3d p = Eigen::RowVector3d::Zero();\n        for (int j=0;j<data.F.cols();++j)\n          p += data.V.row(data.F(i,j));\n        p /= data.F.cols();\n\n        textrenderer.DrawText(p, data.F_normals.row(i), to_string(i));\n      }\n      textrenderer.EndDraw();\n    }\n#endif\n  }\n\n  if (show_overlay)\n  {\n    if (show_overlay_depth)\n      glEnable(GL_DEPTH_TEST);\n    else\n      glDisable(GL_DEPTH_TEST);\n\n    if (data.lines.rows() > 0)\n    {\n      opengl.bind_overlay_lines();\n      modeli = opengl.shader_overlay_lines.uniform(\"model\");\n      viewi  = opengl.shader_overlay_lines.uniform(\"view\");\n      proji  = opengl.shader_overlay_lines.uniform(\"proj\");\n\n      glUniformMatrix4fv(modeli, 1, GL_FALSE, model.data());\n      glUniformMatrix4fv(viewi, 1, GL_FALSE, view.data());\n      glUniformMatrix4fv(proji, 1, GL_FALSE, proj.data());\n      // This must be enabled, otherwise glLineWidth has no effect\n      glEnable(GL_LINE_SMOOTH);\n      glLineWidth(line_width);\n\n      opengl.draw_overlay_lines();\n    }\n\n    if (data.points.rows() > 0)\n    {\n      opengl.bind_overlay_points();\n      modeli = opengl.shader_overlay_points.uniform(\"model\");\n      viewi  = opengl.shader_overlay_points.uniform(\"view\");\n      proji  = opengl.shader_overlay_points.uniform(\"proj\");\n\n      glUniformMatrix4fv(modeli, 1, GL_FALSE, model.data());\n      glUniformMatrix4fv(viewi, 1, GL_FALSE, view.data());\n      glUniformMatrix4fv(proji, 1, GL_FALSE, proj.data());\n      glPointSize(point_size);\n\n      opengl.draw_overlay_points();\n    }\n\n#ifdef IGL_VIEWER_WITH_NANOGUI\n    if (data.labels_positions.rows() > 0)\n    {\n      textrenderer.BeginDraw(view*model, proj, viewport, object_scale);\n      for (int i=0; i<data.labels_positions.rows(); ++i)\n        textrenderer.DrawText(data.labels_positions.row(i), Eigen::Vector3d(0.0,0.0,0.0),\n            data.labels_strings[i]);\n      textrenderer.EndDraw();\n    }\n#endif\n\n    glEnable(GL_DEPTH_TEST);\n  }\n\n}\n\nIGL_INLINE void igl::viewer::ViewerCore::draw_buffer(ViewerData& data,\n  OpenGL_state& opengl,\n  bool update_matrices,\n  Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>& R,\n  Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>& G,\n  Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>& B,\n  Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>& A)\n{\n  assert(R.rows() == G.rows() && G.rows() == B.rows() && B.rows() == A.rows());\n  assert(R.cols() == G.cols() && G.cols() == B.cols() && B.cols() == A.cols());\n\n  unsigned x = R.rows();\n  unsigned y = R.cols();\n\n  // Create frame buffer\n  GLuint frameBuffer;\n  glGenFramebuffers(1, &frameBuffer);\n  glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);\n\n  // Create texture to hold color buffer\n  GLuint texColorBuffer;\n  glGenTextures(1, &texColorBuffer);\n  glBindTexture(GL_TEXTURE_2D, texColorBuffer);\n\n  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, x, y, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);\n\n  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);\n  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n\n  glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texColorBuffer, 0);\n\n  // Create Renderbuffer Object to hold depth and stencil buffers\n  GLuint rboDepthStencil;\n  glGenRenderbuffers(1, &rboDepthStencil);\n  glBindRenderbuffer(GL_RENDERBUFFER, rboDepthStencil);\n  glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, x, y);\n  glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rboDepthStencil);\n\n  assert(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);\n\n  glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);\n\n  // Clear the buffer\n  glClearColor(background_color(0), background_color(1), background_color(2), 0.f);\n  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n\n  // Save old viewport\n  Eigen::Vector4f viewport_ori = viewport;\n  viewport << 0,0,x,y;\n\n  // Draw\n  draw(data,opengl,update_matrices);\n\n  // Restore viewport\n  viewport = viewport_ori;\n\n  // Copy back in the given Eigen matrices\n  GLubyte* pixels = (GLubyte*)calloc(x*y*4,sizeof(GLubyte));\n  glReadPixels\n  (\n   0, 0,\n   x, y,\n   GL_RGBA, GL_UNSIGNED_BYTE, pixels\n   );\n\n  int count = 0;\n  for (unsigned j=0; j<y; ++j)\n  {\n    for (unsigned i=0; i<x; ++i)\n    {\n      R(i,j) = pixels[count*4+0];\n      G(i,j) = pixels[count*4+1];\n      B(i,j) = pixels[count*4+2];\n      A(i,j) = pixels[count*4+3];\n      ++count;\n    }\n  }\n\n  // Clean up\n  free(pixels);\n  glBindFramebuffer(GL_FRAMEBUFFER, 0);\n  glDeleteRenderbuffers(1, &rboDepthStencil);\n  glDeleteTextures(1, &texColorBuffer);\n  glDeleteFramebuffers(1, &frameBuffer);\n}\n\nIGL_INLINE void igl::viewer::ViewerCore::set_rotation_type(\n  const igl::viewer::ViewerCore::RotationType & value)\n{\n  using namespace Eigen;\n  using namespace std;\n  const RotationType old_rotation_type = rotation_type;\n  rotation_type = value;\n  if(rotation_type == ROTATION_TYPE_TWO_AXIS_VALUATOR_FIXED_UP &&\n    old_rotation_type != ROTATION_TYPE_TWO_AXIS_VALUATOR_FIXED_UP)\n  {\n    snap_to_fixed_up(Quaternionf(trackball_angle),trackball_angle);\n  }\n}\n\n\nIGL_INLINE igl::viewer::ViewerCore::ViewerCore()\n{\n  // Default shininess\n  shininess = 35.0f;\n\n  // Default colors\n  background_color << 0.3f, 0.3f, 0.5f, 1.0f;\n  line_color << 0.0f, 0.0f, 0.0f, 1.0f;\n\n  // Default lights settings\n  light_position << 0.0f, -0.30f, -5.0f;\n  lighting_factor = 1.0f; //on\n\n  // Default trackball\n  trackball_angle = Eigen::Quaternionf::Identity();\n  set_rotation_type(ViewerCore::ROTATION_TYPE_TWO_AXIS_VALUATOR_FIXED_UP);\n\n  // Defalut model viewing parameters\n  model_zoom = 1.0f;\n  model_translation << 0,0,0;\n\n  // Camera parameters\n  camera_zoom = 1.0f;\n  orthographic = false;\n  camera_view_angle = 45.0;\n  camera_dnear = 1.0;\n  camera_dfar = 100.0;\n  camera_eye << 0, 0, 5;\n  camera_center << 0, 0, 0;\n  camera_up << 0, 1, 0;\n\n  // Default visualization options\n  show_faces = true;\n  show_lines = true;\n  invert_normals = false;\n  show_overlay = true;\n  show_overlay_depth = true;\n  show_vertid = false;\n  show_faceid = false;\n  show_texture = false;\n  depth_test = true;\n\n  // Default point size / line width\n  point_size = 30;\n  line_width = 0.5f;\n  is_animating = false;\n  animation_max_fps = 30.;\n}\n\nIGL_INLINE void igl::viewer::ViewerCore::init()\n{\n#ifdef IGL_VIEWER_WITH_NANOGUI\n  textrenderer.Init();\n#endif\n}\n\nIGL_INLINE void igl::viewer::ViewerCore::shut()\n{\n#ifdef IGL_VIEWER_WITH_NANOGUI\n  textrenderer.Shut();\n#endif\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/viewer/ViewerCore.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_VIEWER_VIEWER_CORE_H\n#define IGL_VIEWER_VIEWER_CORE_H\n\n#ifdef IGL_VIEWER_WITH_NANOGUI\n#include <igl/viewer/TextRenderer.h>\n#endif\n#include <igl/viewer/ViewerData.h>\n#include <igl/viewer/OpenGL_state.h>\n\n#include <igl/igl_inline.h>\n#include <Eigen/Geometry>\n#include <Eigen/Core>\n\nnamespace igl\n{\nnamespace viewer\n{\n\n// Basic class of the 3D mesh viewer\n// TODO: write documentation\n\nclass ViewerCore\n{\npublic:\n  IGL_INLINE ViewerCore();\n\n  // Initialization\n  IGL_INLINE void init();\n\n  // Shutdown\n  IGL_INLINE void shut();\n\n  // Serialization code\n  IGL_INLINE void InitSerialization();\n\n\n  // ------------------- Camera control functions\n\n  // Adjust the view to see the entire model\n  IGL_INLINE void align_camera_center(\n    const Eigen::MatrixXd& V,\n    const Eigen::MatrixXi& F);\n\n  // Determines how much to zoom and shift such that the mesh fills the unit\n  // box (centered at the origin)\n  IGL_INLINE void get_scale_and_shift_to_fit_mesh(\n    const Eigen::MatrixXd& V,\n    const Eigen::MatrixXi& F,\n    float & zoom,\n    Eigen::Vector3f& shift);\n\n    // Adjust the view to see the entire model\n    IGL_INLINE void align_camera_center(\n      const Eigen::MatrixXd& V);\n\n    // Determines how much to zoom and shift such that the mesh fills the unit\n    // box (centered at the origin)\n    IGL_INLINE void get_scale_and_shift_to_fit_mesh(\n      const Eigen::MatrixXd& V,\n      float & zoom,\n      Eigen::Vector3f& shift);\n\n  // ------------------- Drawing functions\n\n  // Clear the frame buffers\n  IGL_INLINE void clear_framebuffers();\n\n  // Draw everything\n  IGL_INLINE void draw(ViewerData& data, OpenGL_state& opengl, bool update_matrices = true);\n  IGL_INLINE void draw_buffer(\n    ViewerData& data,\n    OpenGL_state& opengl,\n    bool update_matrices,\n    Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>& R,\n    Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>& G,\n    Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>& B,\n    Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>& A);\n\n  // Trackball angle (quaternion)\n  enum RotationType\n  {\n    ROTATION_TYPE_TRACKBALL = 0,\n    ROTATION_TYPE_TWO_AXIS_VALUATOR_FIXED_UP = 1,\n    NUM_ROTATION_TYPES = 2\n  };\n  IGL_INLINE void set_rotation_type(const RotationType & value);\n\n  // ------------------- Properties\n\n#ifdef IGL_VIEWER_WITH_NANOGUI\n  // Text rendering helper\n  TextRenderer textrenderer;\n#endif\n\n  // Shape material\n  float shininess;\n\n  // Colors\n  Eigen::Vector4f background_color;\n  Eigen::Vector4f line_color;\n\n  // Lighting\n  Eigen::Vector3f light_position;\n  float lighting_factor;\n\n  RotationType rotation_type;\n\n  Eigen::Quaternionf trackball_angle;\n\n  // Model viewing parameters\n  float model_zoom;\n  Eigen::Vector3f model_translation;\n\n  // Model viewing paramters (uv coordinates)\n  float model_zoom_uv;\n  Eigen::Vector3f model_translation_uv;\n\n  // Camera parameters\n  float camera_zoom;\n  bool orthographic;\n  Eigen::Vector3f camera_eye;\n  Eigen::Vector3f camera_up;\n  Eigen::Vector3f camera_center;\n  float camera_view_angle;\n  float camera_dnear;\n  float camera_dfar;\n\n  // Visualization options\n  bool show_overlay;\n  bool show_overlay_depth;\n  bool show_texture;\n  bool show_faces;\n  bool show_lines;\n  bool show_vertid;\n  bool show_faceid;\n  bool invert_normals;\n  bool depth_test;\n\n  // Point size / line width\n  float point_size;\n  float line_width;\n\n  // Animation\n  bool is_animating;\n  double animation_max_fps;\n\n  // Caches the two-norm between the min/max point of the bounding box\n  float object_scale;\n\n  // Viewport size\n  Eigen::Vector4f viewport;\n\n  // Save the OpenGL transformation matrices used for the previous rendering pass\n  Eigen::Matrix4f view;\n  Eigen::Matrix4f model;\n  Eigen::Matrix4f proj;\n  public:\n      EIGEN_MAKE_ALIGNED_OPERATOR_NEW\n};\n\n}\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"ViewerCore.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/viewer/ViewerData.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"ViewerData.h\"\n\n#include <iostream>\n\n#include <igl/per_face_normals.h>\n#include <igl/material_colors.h>\n#include <igl/parula.h>\n#include <igl/per_vertex_normals.h>\n\n#ifdef ENABLE_SERIALIZATION\n#include <igl/serialize.h>\nnamespace igl {\n  namespace serialization {\n\n    IGL_INLINE void serialization(bool s,igl::viewer::ViewerData& obj,std::vector<char>& buffer)\n    {\n      SERIALIZE_MEMBER(V);\n      SERIALIZE_MEMBER(F);\n\n      SERIALIZE_MEMBER(F_normals);\n      SERIALIZE_MEMBER(F_material_ambient);\n      SERIALIZE_MEMBER(F_material_diffuse);\n      SERIALIZE_MEMBER(F_material_specular);\n\n      SERIALIZE_MEMBER(V_normals);\n      SERIALIZE_MEMBER(V_material_ambient);\n      SERIALIZE_MEMBER(V_material_diffuse);\n      SERIALIZE_MEMBER(V_material_specular);\n\n      SERIALIZE_MEMBER(V_uv);\n      SERIALIZE_MEMBER(F_uv);\n\n      SERIALIZE_MEMBER(texture_R);\n      SERIALIZE_MEMBER(texture_G);\n      SERIALIZE_MEMBER(texture_B);\n\n      SERIALIZE_MEMBER(lines);\n      SERIALIZE_MEMBER(points);\n\n      SERIALIZE_MEMBER(labels_positions);\n      SERIALIZE_MEMBER(labels_strings);\n\n      SERIALIZE_MEMBER(dirty);\n\n      SERIALIZE_MEMBER(face_based);\n    }\n\n    template<>\n    IGL_INLINE void serialize(const igl::viewer::ViewerData& obj,std::vector<char>& buffer)\n    {\n      serialization(true,const_cast<igl::viewer::ViewerData&>(obj),buffer);\n    }\n\n    template<>\n    IGL_INLINE void deserialize(igl::viewer::ViewerData& obj,const std::vector<char>& buffer)\n    {\n      serialization(false,obj,const_cast<std::vector<char>&>(buffer));\n      obj.dirty = igl::viewer::ViewerData::DIRTY_ALL;\n    }\n  }\n}\n#endif\n\nIGL_INLINE igl::viewer::ViewerData::ViewerData()\n: dirty(DIRTY_ALL)\n{\n  clear();\n};\n\nIGL_INLINE void igl::viewer::ViewerData::set_face_based(bool newvalue)\n{\n  if (face_based != newvalue)\n  {\n    face_based = newvalue;\n    dirty = DIRTY_ALL;\n  }\n}\n\n// Helpers that draws the most common meshes\nIGL_INLINE void igl::viewer::ViewerData::set_mesh(const Eigen::MatrixXd& _V, const Eigen::MatrixXi& _F)\n{\n  using namespace std;\n\n  Eigen::MatrixXd V_temp;\n\n  // If V only has two columns, pad with a column of zeros\n  if (_V.cols() == 2)\n  {\n    V_temp = Eigen::MatrixXd::Zero(_V.rows(),3);\n    V_temp.block(0,0,_V.rows(),2) = _V;\n  }\n  else\n    V_temp = _V;\n\n  if (V.rows() == 0 && F.rows() == 0)\n  {\n    V = V_temp;\n    F = _F;\n\n    compute_normals();\n    uniform_colors(\n      Eigen::Vector3d(GOLD_AMBIENT[0], GOLD_AMBIENT[1], GOLD_AMBIENT[2]),\n      Eigen::Vector3d(GOLD_DIFFUSE[0], GOLD_DIFFUSE[1], GOLD_DIFFUSE[2]),\n      Eigen::Vector3d(GOLD_SPECULAR[0], GOLD_SPECULAR[1], GOLD_SPECULAR[2]));\n\n    grid_texture();\n  }\n  else\n  {\n    if (_V.rows() == V.rows() && _F.rows() == F.rows())\n    {\n      V = V_temp;\n      F = _F;\n    }\n    else\n      cerr << \"ERROR (set_mesh): The new mesh has a different number of vertices/faces. Please clear the mesh before plotting.\"<<endl;\n  }\n  dirty |= DIRTY_FACE | DIRTY_POSITION;\n}\n\nIGL_INLINE void igl::viewer::ViewerData::set_vertices(const Eigen::MatrixXd& _V)\n{\n  V = _V;\n  assert(F.size() == 0 || F.maxCoeff() < V.rows());\n  dirty |= DIRTY_POSITION;\n}\n\nIGL_INLINE void igl::viewer::ViewerData::set_normals(const Eigen::MatrixXd& N)\n{\n  using namespace std;\n  if (N.rows() == V.rows())\n  {\n    set_face_based(false);\n    V_normals = N;\n  }\n  else if (N.rows() == F.rows() || N.rows() == F.rows()*3)\n  {\n    set_face_based(true);\n    F_normals = N;\n  }\n  else\n    cerr << \"ERROR (set_normals): Please provide a normal per face, per corner or per vertex.\"<<endl;\n  dirty |= DIRTY_NORMAL;\n}\n\nIGL_INLINE void igl::viewer::ViewerData::set_colors(const Eigen::MatrixXd &C)\n{\n  using namespace std;\n  using namespace Eigen;\n  if(C.rows()>0 && C.cols() == 1)\n  {\n    Eigen::MatrixXd C3;\n    igl::parula(C,true,C3);\n    return set_colors(C3);\n  }\n  // Ambient color should be darker color\n  const auto ambient = [](const MatrixXd & C)->MatrixXd\n  {\n    return 0.1*C;\n  };\n  // Specular color should be a less saturated and darker color: dampened\n  // highlights\n  const auto specular = [](const MatrixXd & C)->MatrixXd\n  {\n    const double grey = 0.3;\n    return grey+0.1*(C.array()-grey);\n  };\n  if (C.rows() == 1)\n  {\n    for (unsigned i=0;i<V_material_diffuse.rows();++i)\n    {\n      V_material_diffuse.row(i) = C.row(0);\n    }\n    V_material_ambient = ambient(V_material_diffuse);\n    V_material_specular = specular(V_material_diffuse);\n\n    for (unsigned i=0;i<F_material_diffuse.rows();++i)\n    {\n      F_material_diffuse.row(i) = C.row(0);\n    }\n    F_material_ambient = ambient(F_material_diffuse);\n    F_material_specular = specular(F_material_diffuse);\n  }\n  else if (C.rows() == V.rows())\n  {\n    set_face_based(false);\n    V_material_diffuse = C;\n    V_material_ambient = ambient(V_material_diffuse);\n    V_material_specular = specular(V_material_diffuse);\n  }\n  else if (C.rows() == F.rows())\n  {\n    set_face_based(true);\n    F_material_diffuse = C;\n    F_material_ambient = ambient(F_material_diffuse);\n    F_material_specular = specular(F_material_diffuse);\n  }\n  else\n    cerr << \"ERROR (set_colors): Please provide a single color, or a color per face or per vertex.\"<<endl;;\n  dirty |= DIRTY_DIFFUSE;\n\n}\n\nIGL_INLINE void igl::viewer::ViewerData::set_uv(const Eigen::MatrixXd& UV)\n{\n  using namespace std;\n  if (UV.rows() == V.rows())\n  {\n    set_face_based(false);\n    V_uv = UV;\n  }\n  else\n    cerr << \"ERROR (set_UV): Please provide uv per vertex.\"<<endl;;\n  dirty |= DIRTY_UV;\n}\n\nIGL_INLINE void igl::viewer::ViewerData::set_uv(const Eigen::MatrixXd& UV_V, const Eigen::MatrixXi& UV_F)\n{\n  set_face_based(true);\n  V_uv = UV_V.block(0,0,UV_V.rows(),2);\n  F_uv = UV_F;\n  dirty |= DIRTY_UV;\n}\n\n\nIGL_INLINE void igl::viewer::ViewerData::set_texture(\n  const Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>& R,\n  const Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>& G,\n  const Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>& B)\n{\n  texture_R = R;\n  texture_G = G;\n  texture_B = B;\n  dirty |= DIRTY_TEXTURE;\n}\n\nIGL_INLINE void igl::viewer::ViewerData::set_points(\n  const Eigen::MatrixXd& P,\n  const Eigen::MatrixXd& C)\n{\n  // clear existing points\n  points.resize(0,0);\n  add_points(P,C);\n}\n\nIGL_INLINE void igl::viewer::ViewerData::add_points(const Eigen::MatrixXd& P,  const Eigen::MatrixXd& C)\n{\n  Eigen::MatrixXd P_temp;\n\n  // If P only has two columns, pad with a column of zeros\n  if (P.cols() == 2)\n  {\n    P_temp = Eigen::MatrixXd::Zero(P.rows(),3);\n    P_temp.block(0,0,P.rows(),2) = P;\n  }\n  else\n    P_temp = P;\n\n  int lastid = points.rows();\n  points.conservativeResize(points.rows() + P_temp.rows(),6);\n  for (unsigned i=0; i<P_temp.rows(); ++i)\n    points.row(lastid+i) << P_temp.row(i), i<C.rows() ? C.row(i) : C.row(C.rows()-1);\n\n  dirty |= DIRTY_OVERLAY_POINTS;\n}\n\nIGL_INLINE void igl::viewer::ViewerData::set_edges(\n  const Eigen::MatrixXd& P,\n  const Eigen::MatrixXi& E,\n  const Eigen::MatrixXd& C)\n{\n  using namespace Eigen;\n  lines.resize(E.rows(),9);\n  assert(C.cols() == 3);\n  for(int e = 0;e<E.rows();e++)\n  {\n    RowVector3d color;\n    if(C.size() == 3)\n    {\n      color<<C;\n    }else if(C.rows() == E.rows())\n    {\n      color<<C.row(e);\n    }\n    lines.row(e)<< P.row(E(e,0)), P.row(E(e,1)), color;\n  }\n  dirty |= DIRTY_OVERLAY_LINES;\n}\n\nIGL_INLINE void igl::viewer::ViewerData::add_edges(const Eigen::MatrixXd& P1, const Eigen::MatrixXd& P2, const Eigen::MatrixXd& C)\n{\n  Eigen::MatrixXd P1_temp,P2_temp;\n\n  // If P1 only has two columns, pad with a column of zeros\n  if (P1.cols() == 2)\n  {\n    P1_temp = Eigen::MatrixXd::Zero(P1.rows(),3);\n    P1_temp.block(0,0,P1.rows(),2) = P1;\n    P2_temp = Eigen::MatrixXd::Zero(P2.rows(),3);\n    P2_temp.block(0,0,P2.rows(),2) = P2;\n  }\n  else\n  {\n    P1_temp = P1;\n    P2_temp = P2;\n  }\n\n  int lastid = lines.rows();\n  lines.conservativeResize(lines.rows() + P1_temp.rows(),9);\n  for (unsigned i=0; i<P1_temp.rows(); ++i)\n    lines.row(lastid+i) << P1_temp.row(i), P2_temp.row(i), i<C.rows() ? C.row(i) : C.row(C.rows()-1);\n\n  dirty |= DIRTY_OVERLAY_LINES;\n}\n\nIGL_INLINE void igl::viewer::ViewerData::add_label(const Eigen::VectorXd& P,  const std::string& str)\n{\n  Eigen::RowVectorXd P_temp;\n\n  // If P only has two columns, pad with a column of zeros\n  if (P.size() == 2)\n  {\n    P_temp = Eigen::RowVectorXd::Zero(3);\n    P_temp << P.transpose(), 0;\n  }\n  else\n    P_temp = P;\n\n  int lastid = labels_positions.rows();\n  labels_positions.conservativeResize(lastid+1, 3);\n  labels_positions.row(lastid) = P_temp;\n  labels_strings.push_back(str);\n}\n\nIGL_INLINE void igl::viewer::ViewerData::clear()\n{\n  V                       = Eigen::MatrixXd (0,3);\n  F                       = Eigen::MatrixXi (0,3);\n\n  F_material_ambient      = Eigen::MatrixXd (0,3);\n  F_material_diffuse      = Eigen::MatrixXd (0,3);\n  F_material_specular     = Eigen::MatrixXd (0,3);\n\n  V_material_ambient      = Eigen::MatrixXd (0,3);\n  V_material_diffuse      = Eigen::MatrixXd (0,3);\n  V_material_specular     = Eigen::MatrixXd (0,3);\n\n  F_normals               = Eigen::MatrixXd (0,3);\n  V_normals               = Eigen::MatrixXd (0,3);\n\n  V_uv                    = Eigen::MatrixXd (0,2);\n  F_uv                    = Eigen::MatrixXi (0,3);\n\n  lines                   = Eigen::MatrixXd (0,9);\n  points                  = Eigen::MatrixXd (0,6);\n  labels_positions        = Eigen::MatrixXd (0,3);\n  labels_strings.clear();\n\n  face_based = false;\n}\n\nIGL_INLINE void igl::viewer::ViewerData::compute_normals()\n{\n  igl::per_face_normals(V, F, F_normals);\n  igl::per_vertex_normals(V, F, F_normals, V_normals);\n  dirty |= DIRTY_NORMAL;\n}\n\nIGL_INLINE void igl::viewer::ViewerData::uniform_colors(Eigen::Vector3d ambient, Eigen::Vector3d diffuse, Eigen::Vector3d specular)\n{\n  V_material_ambient.resize(V.rows(),3);\n  V_material_diffuse.resize(V.rows(),3);\n  V_material_specular.resize(V.rows(),3);\n\n  for (unsigned i=0; i<V.rows();++i)\n  {\n    V_material_ambient.row(i) = ambient;\n    V_material_diffuse.row(i) = diffuse;\n    V_material_specular.row(i) = specular;\n  }\n\n  F_material_ambient.resize(F.rows(),3);\n  F_material_diffuse.resize(F.rows(),3);\n  F_material_specular.resize(F.rows(),3);\n\n  for (unsigned i=0; i<F.rows();++i)\n  {\n    F_material_ambient.row(i) = ambient;\n    F_material_diffuse.row(i) = diffuse;\n    F_material_specular.row(i) = specular;\n  }\n  dirty |= DIRTY_SPECULAR | DIRTY_DIFFUSE | DIRTY_AMBIENT;\n}\n\nIGL_INLINE void igl::viewer::ViewerData::grid_texture()\n{\n  // Don't do anything for an empty mesh\n  if(V.rows() == 0)\n  {\n    V_uv.resize(V.rows(),2);\n    return;\n  }\n  if (V_uv.rows() == 0)\n  {\n    V_uv = V.block(0, 0, V.rows(), 2);\n    V_uv.col(0) = V_uv.col(0).array() - V_uv.col(0).minCoeff();\n    V_uv.col(0) = V_uv.col(0).array() / V_uv.col(0).maxCoeff();\n    V_uv.col(1) = V_uv.col(1).array() - V_uv.col(1).minCoeff();\n    V_uv.col(1) = V_uv.col(1).array() / V_uv.col(1).maxCoeff();\n    V_uv = V_uv.array() * 10;\n    dirty |= DIRTY_TEXTURE;\n  }\n\n  unsigned size = 128;\n  unsigned size2 = size/2;\n  texture_R.resize(size, size);\n  for (unsigned i=0; i<size; ++i)\n  {\n    for (unsigned j=0; j<size; ++j)\n    {\n      texture_R(i,j) = 0;\n      if ((i<size2 && j<size2) || (i>=size2 && j>=size2))\n        texture_R(i,j) = 255;\n    }\n  }\n\n  texture_G = texture_R;\n  texture_B = texture_R;\n  dirty |= DIRTY_TEXTURE;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/viewer/ViewerData.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_VIEWER_VIEWER_DATA_H\n#define IGL_VIEWER_VIEWER_DATA_H\n\n#include <cstdint>\n#include <vector>\n\n#include <Eigen/Core>\n\n#include <igl/igl_inline.h>\n\nnamespace igl\n{\nnamespace viewer\n{\n\n// TODO: write documentation\n\nclass ViewerData\n{\npublic:\n  ViewerData();\n\n  enum DirtyFlags\n  {\n    DIRTY_NONE           = 0x0000,\n    DIRTY_POSITION       = 0x0001,\n    DIRTY_UV             = 0x0002,\n    DIRTY_NORMAL         = 0x0004,\n    DIRTY_AMBIENT        = 0x0008,\n    DIRTY_DIFFUSE        = 0x0010,\n    DIRTY_SPECULAR       = 0x0020,\n    DIRTY_TEXTURE        = 0x0040,\n    DIRTY_FACE           = 0x0080,\n    DIRTY_MESH           = 0x00FF,\n    DIRTY_OVERLAY_LINES  = 0x0100,\n    DIRTY_OVERLAY_POINTS = 0x0200,\n    DIRTY_ALL            = 0x03FF\n  };\n\n  // Empy all fields\n  IGL_INLINE void clear();\n\n  // Change the visualization mode, invalidating the cache if necessary\n  IGL_INLINE void set_face_based(bool newvalue);\n\n  // Helpers that can draw the most common meshes\n  IGL_INLINE void set_mesh(const Eigen::MatrixXd& V, const Eigen::MatrixXi& F);\n  IGL_INLINE void set_vertices(const Eigen::MatrixXd& V);\n  IGL_INLINE void set_normals(const Eigen::MatrixXd& N);\n\n  // Set the color of the mesh\n  //\n  // Inputs:\n  //   C  #V|#F|1 by 3 list of colors\n  IGL_INLINE void set_colors(const Eigen::MatrixXd &C);\n  // Set per-vertex UV coordinates\n  //\n  // Inputs:\n  //   UV  #V by 2 list of UV coordinates (indexed by F)\n  IGL_INLINE void set_uv(const Eigen::MatrixXd& UV);\n  // Set per-corner UV coordinates\n  //\n  // Inputs:\n  //   UV_V  #UV by 2 list of UV coordinates\n  //   UV_F  #F by 3 list of UV indices into UV_V\n  IGL_INLINE void set_uv(const Eigen::MatrixXd& UV_V, const Eigen::MatrixXi& UV_F);\n  // Set the texture associated with the mesh.\n  //\n  // Inputs:\n  //   R  width by height image matrix of red channel\n  //   G  width by height image matrix of green channel\n  //   B  width by height image matrix of blue channel\n  //\n  IGL_INLINE void set_texture(\n    const Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>& R,\n    const Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>& G,\n    const Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>& B);\n\n  // Sets points given a list of point vertices. In constrast to `set_points`\n  // this will (purposefully) clober existing points.\n  //\n  // Inputs:\n  //   P  #P by 3 list of vertex positions\n  //   C  #P|1 by 3 color(s)\n  IGL_INLINE void set_points(\n    const Eigen::MatrixXd& P,  \n    const Eigen::MatrixXd& C);\n  IGL_INLINE void add_points(const Eigen::MatrixXd& P,  const Eigen::MatrixXd& C);\n  // Sets edges given a list of edge vertices and edge indices. In constrast\n  // to `add_edges` this will (purposefully) clober existing edges.\n  //\n  // Inputs:\n  //   P  #P by 3 list of vertex positions\n  //   E  #E by 2 list of edge indices into P\n  //   C  #E|1 by 3 color(s)\n  IGL_INLINE void set_edges (const Eigen::MatrixXd& P, const Eigen::MatrixXi& E, const Eigen::MatrixXd& C);\n  IGL_INLINE void add_edges (const Eigen::MatrixXd& P1, const Eigen::MatrixXd& P2, const Eigen::MatrixXd& C);\n  IGL_INLINE void add_label (const Eigen::VectorXd& P,  const std::string& str);\n\n  // Computes the normals of the mesh\n  IGL_INLINE void compute_normals();\n\n  // Assigns uniform colors to all faces/vertices\n  IGL_INLINE void uniform_colors(\n    Eigen::Vector3d ambient, \n    Eigen::Vector3d diffuse, \n    Eigen::Vector3d specular);\n\n  // Generates a default grid texture\n  IGL_INLINE void grid_texture();\n\n  Eigen::MatrixXd V; // Vertices of the current mesh (#V x 3)\n  Eigen::MatrixXi F; // Faces of the mesh (#F x 3)\n\n  // Per face attributes\n  Eigen::MatrixXd F_normals; // One normal per face\n\n  Eigen::MatrixXd F_material_ambient; // Per face ambient color\n  Eigen::MatrixXd F_material_diffuse; // Per face diffuse color\n  Eigen::MatrixXd F_material_specular; // Per face specular color\n\n  // Per vertex attributes\n  Eigen::MatrixXd V_normals; // One normal per vertex\n\n  Eigen::MatrixXd V_material_ambient; // Per vertex ambient color\n  Eigen::MatrixXd V_material_diffuse; // Per vertex diffuse color\n  Eigen::MatrixXd V_material_specular; // Per vertex specular color\n\n  // UV parametrization\n  Eigen::MatrixXd V_uv; // UV vertices\n  Eigen::MatrixXi F_uv; // optional faces for UVs\n\n  // Texture\n  Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic> texture_R;\n  Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic> texture_G;\n  Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic> texture_B;\n\n  // Overlays\n\n  // Lines plotted over the scene\n  // (Every row contains 9 doubles in the following format S_x, S_y, S_z, T_x, T_y, T_z, C_r, C_g, C_b),\n  // with S and T the coordinates of the two vertices of the line in global coordinates, and C the color in floating point rgb format\n  Eigen::MatrixXd lines;\n\n  // Points plotted over the scene\n  // (Every row contains 6 doubles in the following format P_x, P_y, P_z, C_r, C_g, C_b),\n  // with P the position in global coordinates of the center of the point, and C the color in floating point rgb format\n  Eigen::MatrixXd points;\n\n  // Text labels plotted over the scene\n  // Textp contains, in the i-th row, the position in global coordinates where the i-th label should be anchored\n  // Texts contains in the i-th position the text of the i-th label\n  Eigen::MatrixXd           labels_positions;\n  std::vector<std::string>  labels_strings;\n\n  // Marks dirty buffers that need to be uploaded to OpenGL\n  uint32_t dirty;\n\n  // Enable per-face or per-vertex properties\n  bool face_based;\n  /*********************************/\n};\n\n}\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"ViewerData.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/viewer/ViewerPlugin.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_VIEWER_VIEWER_PLUGIN_H\n#define IGL_VIEWER_VIEWER_PLUGIN_H\n\n// TODO:\n// * create plugins/skeleton.h\n// * pass time in draw function\n// * remove Preview3D from comments\n// * clean comments\n#include <string>\n#include <igl/igl_inline.h>\n#include <vector>\n\nnamespace igl\n{\nnamespace viewer\n{\n\n// Abstract class for plugins\n// All plugins MUST have this class as their parent and may implement any/all\n// the callbacks marked `virtual` here.\n//\n// /////For an example of a basic plugins see plugins/skeleton.h\n//\n// Return value of callbacks: returning true to any of the callbacks tells\n// Viewer that the event has been handled and that it should not be passed to\n// other plugins or to other internal functions of Viewer\n\n// Forward declaration of the viewer\nclass Viewer;\n\nclass ViewerPlugin\n{\npublic:\n  IGL_INLINE ViewerPlugin()\n  {plugin_name = \"dummy\";}\n\n  virtual ~ViewerPlugin(){}\n\n  // This function is called when the viewer is initialized (no mesh will be loaded at this stage)\n  IGL_INLINE virtual void init(Viewer *_viewer)\n  {\n    viewer = _viewer;\n  }\n\n  // This function is called before shutdown\n  IGL_INLINE virtual void shutdown()\n  {\n  }\n\n  // This function is called before a mesh is loaded\n  IGL_INLINE virtual bool load(std::string filename)\n  {\n    return false;\n  }\n\n  // This function is called before a mesh is saved\n  IGL_INLINE virtual bool save(std::string filename)\n  {\n    return false;\n  }\n\n  // This function is called when the scene is serialized\n  IGL_INLINE virtual bool serialize(std::vector<char>& buffer) const\n  {\n    return false;\n  }\n\n  // This function is called when the scene is deserialized\n  IGL_INLINE virtual bool deserialize(const std::vector<char>& buffer)\n  {\n    return false;\n  }\n\n  // Runs immediately after a new mesh has been loaded.\n  IGL_INLINE virtual bool post_load()\n  {\n    return false;\n  }\n\n  // This function is called before the draw procedure of Preview3D\n  IGL_INLINE virtual bool pre_draw()\n  {\n    return false;\n  }\n\n  // This function is called after the draw procedure of Preview3D\n  IGL_INLINE virtual bool post_draw()\n  {\n    return false;\n  }\n\n  // This function is called when the mouse button is pressed\n  // - button can be GLUT_LEFT_BUTTON, GLUT_MIDDLE_BUTTON or GLUT_RIGHT_BUTTON\n  // - modifiers is a bitfield that might one or more of the following bits Preview3D::NO_KEY, Preview3D::SHIFT, Preview3D::CTRL, Preview3D::ALT;\n  IGL_INLINE virtual bool mouse_down(int button, int modifier)\n  {\n    return false;\n  }\n\n  // This function is called when the mouse button is released\n  // - button can be GLUT_LEFT_BUTTON, GLUT_MIDDLE_BUTTON or GLUT_RIGHT_BUTTON\n  // - modifiers is a bitfield that might one or more of the following bits Preview3D::NO_KEY, Preview3D::SHIFT, Preview3D::CTRL, Preview3D::ALT;\n  IGL_INLINE virtual bool mouse_up(int button, int modifier)\n  {\n    return false;\n  }\n\n  // This function is called every time the mouse is moved\n  // - mouse_x and mouse_y are the new coordinates of the mouse pointer in screen coordinates\n  IGL_INLINE virtual bool mouse_move(int mouse_x, int mouse_y)\n  {\n    return false;\n  }\n\n  // This function is called every time the scroll wheel is moved\n  // Note: this callback is not working with every glut implementation\n  IGL_INLINE virtual bool mouse_scroll(float delta_y)\n  {\n    return false;\n  }\n\n  // This function is called when a keyboard key is pressed. Unlike key_down\n  // this will reveal the actual character being sent (not just the physical\n  // key)\n  // - modifiers is a bitfield that might one or more of the following bits Preview3D::NO_KEY, Preview3D::SHIFT, Preview3D::CTRL, Preview3D::ALT;\n  IGL_INLINE virtual bool key_pressed(unsigned int key, int modifiers)\n  {\n    return false;\n  }\n\n  // This function is called when a keyboard key is down\n  // - modifiers is a bitfield that might one or more of the following bits Preview3D::NO_KEY, Preview3D::SHIFT, Preview3D::CTRL, Preview3D::ALT;\n  IGL_INLINE virtual bool key_down(int key, int modifiers)\n  {\n    return false;\n  }\n\n  // This function is called when a keyboard key is release\n  // - modifiers is a bitfield that might one or more of the following bits Preview3D::NO_KEY, Preview3D::SHIFT, Preview3D::CTRL, Preview3D::ALT;\n  IGL_INLINE virtual bool key_up(int key, int modifiers)\n  {\n    return false;\n  }\n\n  std::string plugin_name;\nprotected:\n  // Pointer to the main Viewer class\n  Viewer *viewer;\n};\n\n#ifdef ENABLE_SERIALIZATION\nnamespace serialization\n{\n  IGL_INLINE void serialize(const ViewerPlugin& obj,std::vector<char>& buffer)\n  {\n    obj.serialize(buffer);\n  }\n\n  IGL_INLINE void deserialize(ViewerPlugin& obj,const std::vector<char>& buffer)\n  {\n    obj.deserialize(buffer);\n  }\n}\n#endif\n\n}\n}\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/volume.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"volume.h\"\n#include \"cross.h\"\n#include <Eigen/Geometry>\ntemplate <\n  typename DerivedV,\n  typename DerivedT,\n  typename Derivedvol>\nIGL_INLINE void igl::volume(\n  const Eigen::MatrixBase<DerivedV>& V,\n  const Eigen::MatrixBase<DerivedT>& T,\n  Eigen::PlainObjectBase<Derivedvol>& vol)\n{\n  using namespace Eigen;\n  const int m = T.rows();\n  vol.resize(m,1);\n  for(int t = 0;t<m;t++)\n  {\n    const RowVector3d & a = V.row(T(t,0));\n    const RowVector3d & b = V.row(T(t,1));\n    const RowVector3d & c = V.row(T(t,2));\n    const RowVector3d & d = V.row(T(t,3));\n    vol(t) = -(a-d).dot((b-d).cross(c-d))/6.;\n  }\n}\n\ntemplate <\n  typename DerivedA,\n  typename DerivedB,\n  typename DerivedC,\n  typename DerivedD,\n  typename Derivedvol>\nIGL_INLINE void igl::volume(\n  const Eigen::MatrixBase<DerivedA> & A,\n  const Eigen::MatrixBase<DerivedB> & B,\n  const Eigen::MatrixBase<DerivedC> & C,\n  const Eigen::MatrixBase<DerivedD> & D,\n  Eigen::PlainObjectBase<Derivedvol> & vol)\n{\n  const auto & AmD = A-D;\n  const auto & BmD = B-D;\n  const auto & CmD = C-D;\n  DerivedA BmDxCmD;\n  cross(BmD.eval(),CmD.eval(),BmDxCmD);\n  const auto & AmDdx = (AmD.array() * BmDxCmD.array()).rowwise().sum();\n  vol = -AmDdx/6.;\n}\n\ntemplate <\n  typename VecA,\n  typename VecB,\n  typename VecC,\n  typename VecD>\nIGL_INLINE typename VecA::Scalar igl::volume_single(\n  const VecA & a,\n  const VecB & b,\n  const VecC & c,\n  const VecD & d)\n{\n  return -(a-d).dot((b-d).cross(c-d))/6.;\n}\n\n\ntemplate <\n  typename DerivedL,\n  typename Derivedvol>\nIGL_INLINE void igl::volume(\n  const Eigen::MatrixBase<DerivedL>& L,\n  Eigen::PlainObjectBase<Derivedvol>& vol)\n{\n  using namespace Eigen;\n  const int m = L.rows();\n  typedef typename Derivedvol::Scalar ScalarS;\n  vol.resize(m,1);\n  for(int t = 0;t<m;t++)\n  {\n    const ScalarS u = L(t,0);\n    const ScalarS v = L(t,1);\n    const ScalarS w = L(t,2);\n    const ScalarS U = L(t,3);\n    const ScalarS V = L(t,4);\n    const ScalarS W = L(t,5);\n    const ScalarS X = (w - U + v)*(U + v + w);\n    const ScalarS x = (U - v + w)*(v - w + U);\n    const ScalarS Y = (u - V + w)*(V + w + u);\n    const ScalarS y = (V - w + u)*(w - u + V);\n    const ScalarS Z = (v - W + u)*(W + u + v);\n    const ScalarS z = (W - u + v)*(u - v + W);\n    const ScalarS a = sqrt(x*Y*Z);\n    const ScalarS b = sqrt(y*Z*X);\n    const ScalarS c = sqrt(z*X*Y);\n    const ScalarS d = sqrt(x*y*z);\n    vol(t) = sqrt(\n       (-a + b + c + d)*\n       ( a - b + c + d)*\n       ( a + b - c + d)*\n       ( a + b + c - d))/\n       (192.*u*v*w);\n  }\n}\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate void igl::volume<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::volume<Eigen::Matrix<double, -1, 6, 0, -1, 6>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 6, 0, -1, 6> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\n// generated by autoexplicit.sh\ntemplate void igl::volume<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);\ntemplate Eigen::Matrix<double, 1, 3, 1, 1, 3>::Scalar igl::volume_single<Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix<double, 1, 3, 1, 1, 3> >(Eigen::Matrix<double, 1, 3, 1, 1, 3> const&, Eigen::Matrix<double, 1, 3, 1, 1, 3> const&, Eigen::Matrix<double, 1, 3, 1, 1, 3> const&, Eigen::Matrix<double, 1, 3, 1, 1, 3> const&);\ntemplate void igl::volume<Eigen::Matrix<double,-1,3,0,-1,3>,Eigen::Matrix<int,-1,3,0,-1,3>,Eigen::Matrix<double,-1,1,0,-1,1> >(Eigen::MatrixBase<Eigen::Matrix<double,-1,3,0,-1,3> > const &,Eigen::MatrixBase<Eigen::Matrix<int,-1,3,0,-1,3> > const &,Eigen::PlainObjectBase<Eigen::Matrix<double,-1,1,0,-1,1> > &);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/volume.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_VOLUME_H\n#define IGL_VOLUME_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\nnamespace igl\n{\n  // VOLUME Compute volume for all tets of a given tet mesh\n  // (V,T)\n  //\n  // vol = volume(V,T)\n  //\n  // Inputs:\n  //   V  #V by dim list of vertex positions\n  //   T  #V by 4 list of tet indices\n  // Outputs:\n  //   vol  #T list of dihedral angles (in radians)\n  //\n  template <\n    typename DerivedV, \n    typename DerivedT, \n    typename Derivedvol>\n  IGL_INLINE void volume(\n    const Eigen::MatrixBase<DerivedV>& V,\n    const Eigen::MatrixBase<DerivedT>& T,\n    Eigen::PlainObjectBase<Derivedvol>& vol);\n  template <\n    typename DerivedA,\n    typename DerivedB,\n    typename DerivedC,\n    typename DerivedD,\n    typename Derivedvol>\n  IGL_INLINE void volume(\n    const Eigen::MatrixBase<DerivedA> & A,\n    const Eigen::MatrixBase<DerivedB> & B,\n    const Eigen::MatrixBase<DerivedC> & C,\n    const Eigen::MatrixBase<DerivedD> & D,\n    Eigen::PlainObjectBase<Derivedvol> & vol);\n  // Single tet\n  template <\n    typename VecA,\n    typename VecB,\n    typename VecC,\n    typename VecD>\n  IGL_INLINE typename VecA::Scalar volume_single(\n    const VecA & a,\n    const VecB & b,\n    const VecC & c,\n    const VecD & d);\n  // Intrinsic version:\n  //\n  // Inputs:\n  //   L  #V by 6 list of edge lengths (see edge_lengths)\n  template <\n    typename DerivedL, \n    typename Derivedvol>\n  IGL_INLINE void volume(\n    const Eigen::MatrixBase<DerivedL>& L,\n    Eigen::PlainObjectBase<Derivedvol>& vol);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"volume.cpp\"\n#endif\n\n#endif\n\n\n"
  },
  {
    "path": "libs/libigl/include/igl/voxel_grid.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"voxel_grid.h\"\n#include \"grid.h\"\n\nIGL_INLINE void igl::voxel_grid(\n  const Eigen::AlignedBox3d & box, \n  const int in_s,\n  const int pad_count,\n  Eigen::MatrixXd & GV,\n  Eigen::RowVector3i & side)\n{\n  using namespace Eigen;\n  using namespace std;\n  MatrixXd::Index si = -1;\n  box.diagonal().maxCoeff(&si);\n  //MatrixXd::Index si = 0;\n  //assert(si>=0);\n  const double s_len = box.diagonal()(si);\n  assert(in_s>(pad_count*2+1) && \"s should be > 2*pad_count+1\");\n  const double s = in_s - 2*pad_count;\n  side(si) = s;\n  for(int i = 0;i<3;i++)\n  {\n    if(i!=si)\n    {\n      side(i) = std::ceil(s * (box.max()(i)-box.min()(i))/s_len);\n    }\n  }\n  side.array() += 2*pad_count;\n  grid(side,GV);\n  // A *    p/s  + B = min\n  // A * (1-p/s) + B = max\n  // B = min - A * p/s\n  // A * (1-p/s) + min - A * p/s = max\n  // A * (1-p/s) - A * p/s = max-min\n  // A * (1-2p/s) = max-min\n  // A  = (max-min)/(1-2p/s)\n  const Array<double,3,1> ps= \n    (double)(pad_count)/(side.transpose().cast<double>().array()-1.);\n  const Array<double,3,1> A = box.diagonal().array()/(1.0-2.*ps);\n  //// This would result in an \"anamorphic\", but perfectly fit grid:\n  //const Array<double,3,1> B = box.min().array() - A.array()*ps;\n  //GV.array().rowwise() *= A.transpose();\n  //GV.array().rowwise() += B.transpose();\n  // Instead scale by largest factor and move to match center\n  Array<double,3,1>::Index ai = -1;\n  double a = A.maxCoeff(&ai);\n  const Array<double,1,3> ratio = \n    a*(side.cast<double>().array()-1.0)/(double)(side(ai)-1.0);\n  GV.array().rowwise() *= ratio;\n  GV.rowwise() += (box.center().transpose()-GV.colwise().mean()).eval();\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/voxel_grid.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_VOXEL_GRID_H\n#define IGL_VOXEL_GRID_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <Eigen/Geometry>\nnamespace igl\n{\n  // Construct the cell center positions of a regular voxel grid (lattice) made\n  // of perfectly square voxels.\n  // \n  // Inputs:\n  //   box  bounding box to enclose by grid\n  //   s  number of cell centers on largest side (including 2*pad_count)\n  //   pad_count  number of cells beyond box\n  // Outputs:\n  //   GV  res(0)*res(1)*res(2) by 3 list of cell center positions\n  //   res  3-long list of dimension of voxel grid\n  IGL_INLINE void voxel_grid(\n    const Eigen::AlignedBox3d & box, \n    const int s,\n    const int pad_count,\n    Eigen::MatrixXd & GV,\n    Eigen::RowVector3i & side);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"voxel_grid.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/winding_number.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"winding_number.h\"\n#include \"WindingNumberAABB.h\"\n\n#include <igl/PI.h>\n#include <cmath>\n\n// IF THIS IS EVER TEMPLATED BE SURE THAT V IS COLMAJOR\nIGL_INLINE void igl::winding_number(\n  const Eigen::MatrixXd & V,\n  const Eigen::MatrixXi & F,\n  const Eigen::MatrixXd & O,\n  Eigen::VectorXd & W)\n{\n  using namespace Eigen;\n  // make room for output\n  W.resize(O.rows(),1);\n  switch(F.cols())\n  {\n    case 2:\n      return winding_number_2(\n        V.data(),\n        V.rows(),\n        F.data(),\n        F.rows(),\n        O.data(),\n        O.rows(),\n        W.data());\n    case 3:\n    {\n      WindingNumberAABB<Vector3d> hier(V,F);\n      hier.grow();\n      // loop over origins\n      const int no = O.rows();\n#   pragma omp parallel for if (no>IGL_WINDING_NUMBER_OMP_MIN_VALUE)\n      for(int o = 0;o<no;o++)\n      {\n        Vector3d p = O.row(o);\n        W(o) = hier.winding_number(p);\n      }\n      break;\n    }\n    default: assert(false && \"Bad simplex size\"); break;\n  }\n}\n\ntemplate <typename Scalar, typename DerivedF>\nIGL_INLINE void igl::winding_number_3(\n  const Scalar * V,\n  const int n,\n  const DerivedF * F,\n  const int m,\n  const Scalar * O,\n  const int no,\n  Scalar * S)\n{\n  // Initialize output\n  // loop over origins\n#pragma omp parallel for if (no>IGL_WINDING_NUMBER_OMP_MIN_VALUE)\n  for(int o = 0;o<no;o++)\n  {\n    S[o] = 0;\n  }\n  // Only use parallel for if there are many facets and more than one origin.\n  // Assumes that if there is exactly one origin then this is being called\n  // within an outer for loop which may be parallel\n#pragma omp parallel for if (m>IGL_WINDING_NUMBER_OMP_MIN_VALUE && no>1)\n  // loop over faces\n  for(int f = 0;f<m;f++)\n  {\n    // Gather corners \n    Scalar C[3][3];\n    // loop around triangle\n    for(int t=0;t<3;t++)\n    {\n      // loop over dimensions\n      for(int d = 0;d<3;d++)\n      {\n        // Indices are offset by 1\n        int Ff = F[m*t + f];\n        C[t][d] = V[d*n + Ff];\n      }\n    }\n    // loop over origins\n    for(int o = 0;o<no;o++)\n    {\n      // Gather vectors to corners\n      Scalar v[3][3];\n      Scalar vl[3];\n      // loop around triangle\n      for(int t=0;t<3;t++)\n      {\n        vl[t] = 0;\n        // loop over dimensions\n        for(int d = 0;d<3;d++)\n        {\n          v[t][d] = C[t][d] - O[d*no + o];\n          // compute edge length contribution\n          vl[t] += v[t][d]*v[t][d];\n        }\n        // finish edge length computation\n        // Matlab crashes on NaN\n        if(vl[t]!=0)\n        {\n          vl[t] = sqrt(vl[t]);\n        }\n      }\n      //printf(\"\\n\");\n      // Compute determinant\n      Scalar detf = \n        v[0][0]*v[1][1]*v[2][2]+\n        v[1][0]*v[2][1]*v[0][2]+\n        v[2][0]*v[0][1]*v[1][2]-\n        v[2][0]*v[1][1]*v[0][2]-\n        v[1][0]*v[0][1]*v[2][2]-\n        v[0][0]*v[2][1]*v[1][2];\n      // Compute pairwise dotproducts\n      Scalar dp[3];\n      dp[0] = v[1][0]*v[2][0];\n      dp[0] += v[1][1]*v[2][1];\n      dp[0] += v[1][2]*v[2][2];\n      dp[1] = v[2][0]*v[0][0];\n      dp[1] += v[2][1]*v[0][1];\n      dp[1] += v[2][2]*v[0][2];\n      dp[2] = v[0][0]*v[1][0];\n      dp[2] += v[0][1]*v[1][1];\n      dp[2] += v[0][2]*v[1][2];\n      // Compute winding number\n      // Only divide by TWO_PI instead of 4*pi because there was a 2 out front\n      Scalar val = atan2(detf,\n        vl[0]*vl[1]*vl[2] + \n        dp[0]*vl[0] +\n        dp[1]*vl[1] +\n        dp[2]*vl[2]) / (2.*igl::PI);\n#pragma omp atomic\n      S[o] += val;\n    }\n  }\n}\n\ntemplate <typename DerivedF>\nIGL_INLINE void igl::winding_number_2(\n  const double * V,\n  const int n,\n  const DerivedF * F,\n  const int m,\n  const double * O,\n  const int no,\n  double * S)\n{\n  // Initialize output\n  // loop over origins\n#pragma omp parallel for if (no>IGL_WINDING_NUMBER_OMP_MIN_VALUE)\n  for(int o = 0;o<no;o++)\n  {\n    S[o] = 0;\n  }\n#pragma omp parallel for if (m>IGL_WINDING_NUMBER_OMP_MIN_VALUE && no>1)\n  // loop over faces\n  for(int f = 0;f<m;f++)\n  {\n    // Index of source and destination\n    int s = F[m*0 + f];\n    int d = F[m*1 + f];\n    // Positions of source and destination\n    double vs[2];\n    double vd[2];\n    vs[0] = V[0*n + s];\n    vs[1] = V[1*n + s];\n    vd[0] = V[0*n + d];\n    vd[1] = V[1*n + d];\n    \n    // loop over origins\n    for(int o = 0;o<no;o++)\n    {\n      // Gather vectors to source and destination\n      double o2vs[2];\n      double o2vd[2];\n      // and lengths\n      double o2vsl = 0;\n      double o2vdl = 0;\n      for(int i = 0;i<2;i++)\n      {\n        o2vs[i] = O[i*no + o] - vs[i];\n        o2vd[i] = O[i*no + o] - vd[i];\n        o2vsl += o2vs[i]*o2vs[i];\n        o2vdl += o2vd[i]*o2vd[i];\n      }\n      o2vsl = sqrt(o2vsl);\n      o2vdl = sqrt(o2vdl);\n      // Normalize\n      for(int i = 0;i<2;i++)\n      {\n        // Matlab crashes on NaN\n        if(o2vsl!=0)\n        {\n          o2vs[i] /= o2vsl;\n        }\n        if(o2vdl!=0)\n        {\n          o2vd[i] /= o2vdl;\n        }\n      }\n      double val =\n        -atan2(o2vd[0]*o2vs[1]-o2vd[1]*o2vs[0],o2vd[0]*o2vs[0]+o2vd[1]*o2vs[1])/\n        (2.*igl::PI);\n#pragma omp atomic\n      S[o] += val;\n    }\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::winding_number_2<double>(double const*, int, double const*, int, double const*, int, double*);\ntemplate void igl::winding_number_3<double>(double const*, int, double const*, int, double const*, int, double*);\ntemplate void igl::winding_number_3<double, int>(double const*, int, int const*, int, double const*, int, double*);\ntemplate void igl::winding_number_2<int>(double const*, int, int const*, int, double const*, int, double*);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/winding_number.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_WINDING_NUMBER_H\n#define IGL_WINDING_NUMBER_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n\n// Minimum number of iterms per openmp thread\n#ifndef IGL_WINDING_NUMBER_OMP_MIN_VALUE\n#  define IGL_WINDING_NUMBER_OMP_MIN_VALUE 1000\n#endif\nnamespace igl\n{\n  // WINDING_NUMBER Compute the sum of solid angles of a triangle/tetrahedron\n  // described by points (vectors) V\n  //\n  // Templates:\n  //   dim  dimension of input\n  // Inputs:\n  //  V  n by 3 list of vertex positions\n  //  F  #F by 3 list of triangle indices, minimum index is 0\n  //  O  no by 3 list of origin positions\n  // Outputs:\n  //  S  no by 1 list of winding numbers\n  //\n  // 3d\n  IGL_INLINE void winding_number(\n    const Eigen::MatrixXd & V,\n    const Eigen::MatrixXi & F,\n    const Eigen::MatrixXd & O,\n    Eigen::VectorXd & W);\n  // Inputs:\n  //   V  pointer to array containing #V by 3 vertex positions along rows,\n  //     given in column major order\n  //   n  number of mesh vertices\n  //   F  pointer to array containing #F by 3 face indices along rows,\n  //     given in column major order\n  //   m  number of faces\n  //   O  pointer to array containing #O by 3 query positions along rows,\n  //     given in column major order\n  //   no  number of origins\n  // Outputs:\n  //   S  no by 1 list of winding numbers\n  template <typename Scalar, typename DerivedF>\n  IGL_INLINE void winding_number_3(\n    const Scalar * V,\n    const int n,\n    const DerivedF * F,\n    const int m,\n    const Scalar * O,\n    const int no,\n    Scalar * S);\n  //// Only one evaluation origin\n  //template <typename DerivedF>\n  //IGL_INLINE void winding_number_3(\n  //  const double * V,\n  //  const int n,\n  //  const DerivedF * F,\n  //  const int m,\n  //  const double * O,\n  //  double * S);\n  // 2d\n  template <typename DerivedF>\n  IGL_INLINE void winding_number_2(\n    const double * V,\n    const int n,\n    const DerivedF * F,\n    const int m,\n    const double * O,\n    const int no,\n    double * S);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"winding_number.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/writeBF.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"writeBF.h\"\n#include <fstream>\n#include <cassert>\ntemplate < \n  typename DerivedWI,\n  typename DerivedP,\n  typename DerivedO>\nIGL_INLINE bool igl::writeBF(\n  const std::string & filename,\n  const Eigen::PlainObjectBase<DerivedWI> & WI,\n  const Eigen::PlainObjectBase<DerivedP> & P,\n  const Eigen::PlainObjectBase<DerivedO> & O)\n{\n  using namespace Eigen;\n  using namespace std;\n  const int n = WI.rows();\n  assert(n == WI.rows() && \"WI must have n rows\");\n  assert(n == P.rows()  && \"P must have n rows\");\n  assert(n == O.rows()  && \"O must have n rows\");\n  MatrixXd WIPO(n,1+1+3);\n  for(int i = 0;i<n;i++)\n  {\n    WIPO(i,0) = WI(i);\n    WIPO(i,1) = P(i);\n    WIPO(i,2+0) = O(i,0);\n    WIPO(i,2+1) = O(i,1);\n    WIPO(i,2+2) = O(i,2);\n  }\n  ofstream s(filename);\n  if(!s.is_open())\n  {\n    fprintf(stderr,\"IOError: writeBF() could not open %s\\n\",filename.c_str());\n    return false;\n  }\n  s<<\n    WIPO.format(IOFormat(FullPrecision,DontAlignCols,\" \",\"\\n\",\"\",\"\",\"\",\"\\n\"));\n  return true;\n}\n\n#ifdef IGL_STATIC_LIBRARY\ntemplate bool igl::writeBF<Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/writeBF.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_WRITEBF_H\n#define IGL_WRITEBF_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <string>\nnamespace igl\n{\n  // Write a bones forest to a file\n  //\n  // Input:\n  //   file_name  path to .bf bones tree file\n  //   WI  #B list of unique weight indices\n  //   P  #B list of parent indices into B, -1 for roots\n  //   O  #B list of tip offsets\n  // Returns true on success, false on errors\n  template < \n    typename DerivedWI,\n    typename DerivedP,\n    typename DerivedO>\n  IGL_INLINE bool writeBF(\n    const std::string & filename,\n    const Eigen::PlainObjectBase<DerivedWI> & WI,\n    const Eigen::PlainObjectBase<DerivedP> & P,\n    const Eigen::PlainObjectBase<DerivedO> & O);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"writeBF.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/writeDMAT.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"writeDMAT.h\"\n#include \"list_to_matrix.h\"\n#include <Eigen/Core>\n\n#include <cstdio>\n\ntemplate <typename DerivedW>\nIGL_INLINE bool igl::writeDMAT(\n  const std::string file_name, \n  const Eigen::MatrixBase<DerivedW> & W,\n  const bool ascii)\n{\n  FILE * fp = fopen(file_name.c_str(),\"wb\");\n  if(fp == NULL)\n  {\n    fprintf(stderr,\"IOError: writeDMAT() could not open %s...\",file_name.c_str());\n    return false; \n  }\n  if(ascii)\n  {\n    // first line contains number of rows and number of columns\n    fprintf(fp,\"%d %d\\n\",(int)W.cols(),(int)W.rows());\n    // Loop over columns slowly\n    for(int j = 0;j < W.cols();j++)\n    {\n      // loop over rows (down columns) quickly\n      for(int i = 0;i < W.rows();i++)\n      {\n        fprintf(fp,\"%0.17lg\\n\",(double)W(i,j));\n      }\n    }\n  }else\n  {\n    // write header for ascii\n    fprintf(fp,\"0 0\\n\");\n    // first line contains number of rows and number of columns\n    fprintf(fp,\"%d %d\\n\",(int)W.cols(),(int)W.rows());\n    // reader assumes the binary part is double precision\n    Eigen::MatrixXd Wd = W.template cast<double>();\n    fwrite(Wd.data(),sizeof(double),Wd.size(),fp);\n    //// Loop over columns slowly\n    //for(int j = 0;j < W.cols();j++)\n    //{\n    //  // loop over rows (down columns) quickly\n    //  for(int i = 0;i < W.rows();i++)\n    //  {\n    //    double d = (double)W(i,j);\n    //    fwrite(&d,sizeof(double),1,fp);\n    //  }\n    //}\n  }\n  fclose(fp);\n  return true;\n}\n\ntemplate <typename Scalar>\nIGL_INLINE bool igl::writeDMAT(\n  const std::string file_name, \n  const std::vector<std::vector<Scalar> > & W,\n  const bool ascii)\n{\n  Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic> mW;\n  list_to_matrix(W,mW);\n  return igl::writeDMAT(file_name,mW,ascii);\n}\n\ntemplate <typename Scalar>\nIGL_INLINE bool igl::writeDMAT(\n  const std::string file_name, \n  const std::vector<Scalar > & W,\n  const bool ascii)\n{\n  Eigen::Matrix<Scalar,Eigen::Dynamic,1> mW;\n  list_to_matrix(W,mW);\n  return igl::writeDMAT(file_name,mW,ascii);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate bool igl::writeDMAT<Eigen::Matrix<double, -1, -1, 0, -1, -1> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, bool);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/writeDMAT.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_WRITEDMAT_H\n#define IGL_WRITEDMAT_H\n#include \"igl_inline.h\"\n// See writeDMAT.h for a description of the .dmat file type\n#include <Eigen/Core>\n#include <string>\n#include <vector>\nnamespace igl\n{\n  // Write a matrix using ascii dmat file type\n  //\n  // Template:\n  //   Mat  matrix type that supports .rows(), .cols(), operator(i,j)\n  // Inputs:\n  //   file_name  path to .dmat file\n  //   W  eigen matrix containing to-be-written coefficients\n  //   ascii  write ascii file {true}\n  // Returns true on success, false on error\n  //\n  template <typename DerivedW>\n  IGL_INLINE bool writeDMAT(\n    const std::string file_name, \n    const Eigen::MatrixBase<DerivedW> & W,\n    const bool ascii=true);\n  template <typename Scalar>\n  IGL_INLINE bool writeDMAT(\n    const std::string file_name, \n    const std::vector<std::vector<Scalar> > & W,\n    const bool ascii=true);\n  template <typename Scalar>\n  IGL_INLINE bool writeDMAT(\n    const std::string file_name, \n    const std::vector<Scalar > &W,\n    const bool ascii=true);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"writeDMAT.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/writeMESH.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"writeMESH.h\"\n\n#include \"verbose.h\"\n#include \"list_to_matrix.h\"\n#include <Eigen/Core>\n\n#include <iostream>\n#include <fstream>\n#include <cstdio>\n\ntemplate <typename Scalar, typename Index>\nIGL_INLINE bool igl::writeMESH(\n  const std::string mesh_file_name,\n  const std::vector<std::vector<Scalar > > & V,\n  const std::vector<std::vector<Index > > & T,\n  const std::vector<std::vector<Index > > & F)\n{\n  Eigen::MatrixXd mV;\n  Eigen::MatrixXi mT,mF;\n  bool is_rect;\n  is_rect = list_to_matrix(V,mV);\n  if(!is_rect)\n  {\n    return false;\n  }\n  is_rect = list_to_matrix(T,mT);\n  if(!is_rect)\n  {\n    return false;\n  }\n  is_rect = list_to_matrix(F,mF);\n  if(!is_rect)\n  {\n    return false;\n  }\n  return igl::writeMESH(mesh_file_name,mV,mT,mF);\n}\n\n\ntemplate <typename DerivedV, typename DerivedT, typename DerivedF>\nIGL_INLINE bool igl::writeMESH(\n  const std::string str,\n  const Eigen::PlainObjectBase<DerivedV> & V, \n  const Eigen::PlainObjectBase<DerivedT> & T,\n  const Eigen::PlainObjectBase<DerivedF> & F)\n{\n  using namespace std;\n  using namespace Eigen;\n\n  //// This is (surprisingly) slower than the C-ish code below\n  //ofstream mesh_file;\n  //mesh_file.open(str.c_str());\n  //if(!mesh_file.is_open())\n  //{\n  //  cerr<<\"IOError: \"<<str<<\" could not be opened...\"<<endl;\n  //  return false;\n  //}\n  //IOFormat format(FullPrecision,DontAlignCols,\" \",\"\\n\",\"\",\" 1\",\"\",\"\");\n  //mesh_file<<\"MeshVersionFormatted 1\\n\";\n  //mesh_file<<\"Dimension 3\\n\";\n  //mesh_file<<\"Vertices\\n\";\n  //mesh_file<<V.rows()<<\"\\n\";\n  //mesh_file<<V.format(format)<<\"\\n\";\n  //mesh_file<<\"Triangles\\n\";\n  //mesh_file<<F.rows()<<\"\\n\";\n  //mesh_file<<(F.array()+1).eval().format(format)<<\"\\n\";\n  //mesh_file<<\"Tetrahedra\\n\";\n  //mesh_file<<T.rows()<<\"\\n\";\n  //mesh_file<<(T.array()+1).eval().format(format)<<\"\\n\";\n  //mesh_file.close();\n\n  FILE * mesh_file = fopen(str.c_str(),\"w\");\n  if(NULL==mesh_file)\n  {\n    fprintf(stderr,\"IOError: %s could not be opened...\",str.c_str());\n    return false;\n  }\n  // print header\n  fprintf(mesh_file,\"MeshVersionFormatted 1\\n\");\n  fprintf(mesh_file,\"Dimension 3\\n\");\n  // print tet vertices\n  fprintf(mesh_file,\"Vertices\\n\");\n  // print number of tet vertices\n  int number_of_tet_vertices = V.rows();\n  fprintf(mesh_file,\"%d\\n\",number_of_tet_vertices);\n  // loop over tet vertices\n  for(int i = 0;i<number_of_tet_vertices;i++)\n  {\n    // print position of ith tet vertex\n    fprintf(mesh_file,\"%.17lg %.17lg %.17lg 1\\n\",\n      (double)V(i,0),\n      (double)V(i,1),\n      (double)V(i,2));\n  }\n  verbose(\"WARNING: save_mesh() assumes that vertices have\"\n      \" same indices in surface as volume...\\n\");\n  // print faces\n  fprintf(mesh_file,\"Triangles\\n\");\n  // print number of triangles\n  int number_of_triangles = F.rows();\n  fprintf(mesh_file,\"%d\\n\",number_of_triangles);\n  // loop over faces\n  for(int i = 0;i<number_of_triangles;i++)\n  {\n    // loop over vertices in face\n    fprintf(mesh_file,\"%d %d %d 1\\n\", \n      (int)F(i,0)+1, \n      (int)F(i,1)+1, \n      (int)F(i,2)+1);\n  }\n  // print tetrahedra\n  fprintf(mesh_file,\"Tetrahedra\\n\");\n  int number_of_tetrahedra = T.rows();\n  // print number of tetrahedra\n  fprintf(mesh_file,\"%d\\n\",number_of_tetrahedra);\n  // loop over tetrahedra\n  for(int i = 0; i < number_of_tetrahedra;i++)\n  {\n    // mesh standard uses 1-based indexing\n    fprintf(mesh_file, \"%d %d %d %d 1\\n\",\n      (int)T(i,0)+1,\n      (int)T(i,1)+1,\n      (int)T(i,2)+1,\n      (int)T(i,3)+1);\n  }\n  fclose(mesh_file);\n  return true;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate bool igl::writeMESH<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&);\n// generated by autoexplicit.sh\ntemplate bool igl::writeMESH<Eigen::Matrix<double, 8, 3, 0, 8, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, 12, 3, 0, 12, 3> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, 8, 3, 0, 8, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, 12, 3, 0, 12, 3> > const&);\n//template bool igl::writeMESH<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&);\ntemplate bool igl::writeMESH<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&);\n\ntemplate bool igl::writeMESH<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&);\ntemplate bool igl::writeMESH<double, int>(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > const&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/writeMESH.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_WRITEMESH_H\n#define IGL_WRITEMESH_H\n#include \"igl_inline.h\"\n\n#include <string>\n#include <vector>\n#include <Eigen/Core>\n\nnamespace igl\n{\n  // save a tetrahedral volume mesh to a .mesh file\n  //\n  // Templates:\n  //   Scalar  type for positions and vectors (will be cast as double)\n  //   Index  type for indices (will be cast to int)\n  // Input:\n  //   mesh_file_name  path of .mesh file\n  //   V  double matrix of vertex positions  #V by 3\n  //   T  #T list of tet indices into vertex positions\n  //   F  #F list of face indices into vertex positions\n  //\n  // Known bugs: Holes and regions are not supported\n  template <typename Scalar, typename Index>\n  IGL_INLINE bool writeMESH(\n    const std::string mesh_file_name,\n    const std::vector<std::vector<Scalar > > & V,\n    const std::vector<std::vector<Index > > & T,\n    const std::vector<std::vector<Index > > & F);\n\n  // Templates:\n  //   DerivedV  real-value: i.e. from MatrixXd\n  //   DerivedT  integer-value: i.e. from MatrixXi\n  //   DerivedF  integer-value: i.e. from MatrixXi\n  // Input:\n  //   mesh_file_name  path of .mesh file\n  //   V  eigen double matrix #V by 3\n  //   T  eigen int matrix #T by 4\n  //   F  eigen int matrix #F by 3\n  template <typename DerivedV, typename DerivedT, typename DerivedF>\n  IGL_INLINE bool writeMESH(\n    const std::string str,\n    const Eigen::PlainObjectBase<DerivedV> & V, \n    const Eigen::PlainObjectBase<DerivedT> & T,\n    const Eigen::PlainObjectBase<DerivedF> & F);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"writeMESH.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/writeOBJ.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"writeOBJ.h\"\n\n#include <iostream>\n#include <limits>\n#include <iomanip>\n#include <fstream>\n#include <cstdio>\n#include <cassert>\n\ntemplate <\n  typename DerivedV, \n  typename DerivedF,\n  typename DerivedCN, \n  typename DerivedFN,\n  typename DerivedTC, \n  typename DerivedFTC>\nIGL_INLINE bool igl::writeOBJ(\n  const std::string str,\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  const Eigen::PlainObjectBase<DerivedCN>& CN,\n  const Eigen::PlainObjectBase<DerivedFN>& FN,\n  const Eigen::PlainObjectBase<DerivedTC>& TC,\n  const Eigen::PlainObjectBase<DerivedFTC>& FTC)\n{\n  FILE * obj_file = fopen(str.c_str(),\"w\");\n  if(NULL==obj_file)\n  {\n    printf(\"IOError: %s could not be opened for writing...\",str.c_str());\n    return false;\n  }\n  // Loop over V\n  for(int i = 0;i<(int)V.rows();i++)\n  {\n    fprintf(obj_file,\"v\");\n    for(int j = 0;j<(int)V.cols();++j)\n    {\n      fprintf(obj_file,\" %0.17g\", V(i,j));\n    }\n    fprintf(obj_file,\"\\n\");\n  }\n  bool write_N = CN.rows() >0;\n\n  if(write_N)\n  {\n    for(int i = 0;i<(int)CN.rows();i++)\n    {\n      fprintf(obj_file,\"vn %0.17g %0.17g %0.17g\\n\",\n              CN(i,0),\n              CN(i,1),\n              CN(i,2)\n              );\n    }\n    fprintf(obj_file,\"\\n\");\n  }\n\n  bool write_texture_coords = TC.rows() >0;\n\n  if(write_texture_coords)\n  {\n    for(int i = 0;i<(int)TC.rows();i++)\n    {\n      fprintf(obj_file, \"vt %0.17g %0.17g\\n\",TC(i,0),TC(i,1));\n    }\n    fprintf(obj_file,\"\\n\");\n  }\n\n  // loop over F\n  for(int i = 0;i<(int)F.rows();++i)\n  {\n    fprintf(obj_file,\"f\");\n    for(int j = 0; j<(int)F.cols();++j)\n    {\n      // OBJ is 1-indexed\n      fprintf(obj_file,\" %u\",F(i,j)+1);\n\n      if(write_texture_coords)\n        fprintf(obj_file,\"/%u\",FTC(i,j)+1);\n      if(write_N)\n      {\n        if (write_texture_coords)\n          fprintf(obj_file,\"/%u\",FN(i,j)+1);\n        else\n          fprintf(obj_file,\"//%u\",FN(i,j)+1);\n      }\n    }\n    fprintf(obj_file,\"\\n\");\n  }\n  fclose(obj_file);\n  return true;\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE bool igl::writeOBJ(\n  const std::string str,\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F)\n{\n  using namespace std;\n  using namespace Eigen;\n  assert(V.cols() == 3 && \"V should have 3 columns\");\n  ofstream s(str);\n  if(!s.is_open())\n  {\n    fprintf(stderr,\"IOError: writeOBJ() could not open %s\\n\",str.c_str());\n    return false;\n  }\n  s<<\n    V.format(IOFormat(FullPrecision,DontAlignCols,\" \",\"\\n\",\"v \",\"\",\"\",\"\\n\"))<<\n    (F.array()+1).format(IOFormat(FullPrecision,DontAlignCols,\" \",\"\\n\",\"f \",\"\",\"\",\"\\n\"));\n  return true;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate bool igl::writeOBJ<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&);\n// generated by autoexplicit.sh\ntemplate bool igl::writeOBJ<Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&);\n// generated by autoexplicit.sh\ntemplate bool igl::writeOBJ<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 1, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 1, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&);\n// generated by autoexplicit.sh\ntemplate bool igl::writeOBJ<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&);\n// generated by autoexplicit.sh\ntemplate bool igl::writeOBJ<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/writeOBJ.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_WRITEOBJ_H\n#define IGL_WRITEOBJ_H\n#include \"igl_inline.h\"\n// History:\n//  return type changed from void to bool  Alec 20 Sept 2011\n\n#include <Eigen/Core>\n#include <string>\n\nnamespace igl \n{\n  // Write a mesh in an ascii obj file\n  // Inputs:\n  //   str  path to outputfile\n  //   V  #V by 3 mesh vertex positions\n  //   F  #F by 3|4 mesh indices into V\n  //   CN #CN by 3 normal vectors\n  //   FN  #F by 3|4 corner normal indices into CN\n  //   TC  #TC by 2|3 texture coordinates\n  //   FTC #F by 3|4 corner texture coord indices into TC\n  // Returns true on success, false on error\n  //\n  // Known issues: Horrifyingly, this does not have the same order of\n  // parameters as readOBJ.\n  template <\n    typename DerivedV, \n    typename DerivedF,\n    typename DerivedCN, \n    typename DerivedFN,\n    typename DerivedTC, \n    typename DerivedFTC>\n  IGL_INLINE bool writeOBJ(\n    const std::string str,\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    const Eigen::PlainObjectBase<DerivedCN>& CN,\n    const Eigen::PlainObjectBase<DerivedFN>& FN,\n    const Eigen::PlainObjectBase<DerivedTC>& TC,\n    const Eigen::PlainObjectBase<DerivedFTC>& FTC);\n  template <typename DerivedV, typename DerivedF>\n  IGL_INLINE bool writeOBJ(\n    const std::string str,\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F);\n\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"writeOBJ.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/writeOFF.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"writeOFF.h\"\n#include <cstdio>\n#include <fstream>\n\n// write mesh to an ascii off file\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE bool igl::writeOFF(\n  const std::string fname,\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F)\n{\n  using namespace std;\n  using namespace Eigen;\n  assert(V.cols() == 3 && \"V should have 3 columns\");\n  ofstream s(fname);\n  if(!s.is_open())\n  {\n    fprintf(stderr,\"IOError: writeOFF() could not open %s\\n\",fname.c_str());\n    return false;\n  }\n\n  s<<\n    \"OFF\\n\"<<V.rows()<<\" \"<<F.rows()<<\" 0\\n\"<<\n    V.format(IOFormat(FullPrecision,DontAlignCols,\" \",\"\\n\",\"\",\"\",\"\",\"\\n\"))<<\n    (F.array()).format(IOFormat(FullPrecision,DontAlignCols,\" \",\"\\n\",\"3 \",\"\",\"\",\"\\n\"));\n  return true;\n}\n\n// write mesh and colors-by-vertex to an ascii off file\ntemplate <typename DerivedV, typename DerivedF, typename DerivedC>\nIGL_INLINE bool igl::writeOFF(\n  const std::string fname,\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  const Eigen::PlainObjectBase<DerivedC>& C)\n{\n  using namespace std;\n  using namespace Eigen;\n  assert(V.cols() == 3 && \"V should have 3 columns\");\n  assert(C.cols() == 3 && \"C should have 3 columns\");\n\n  if(V.rows() != C.rows())\n  {\n    fprintf(stderr,\"IOError: writeOFF() Only color per vertex supported. V and C should have same size.\\n\");\n    return false;\n  }\n\n  ofstream s(fname);\n  if(!s.is_open())\n  {\n    fprintf(stderr,\"IOError: writeOFF() could not open %s\\n\",fname.c_str());\n    return false;\n  }\n\n  //Check if RGB values are in the range [0..1] or [0..255]\n  int rgbScale = (C.maxCoeff() <= 1.0)?255:1;\n  Eigen::MatrixXd RGB = rgbScale * C;\n\n  s<< \"COFF\\n\"<<V.rows()<<\" \"<<F.rows()<<\" 0\\n\";\n  for (unsigned i=0; i< V.rows(); i++)\n  {\n    s <<V.row(i).format(IOFormat(FullPrecision,DontAlignCols,\" \",\" \",\"\",\"\",\"\",\" \"));\n    s << unsigned(RGB(i,0)) << \" \" << unsigned(RGB(i,1)) << \" \" << unsigned(RGB(i,2)) << \" 255\\n\";\n  }\n\n  s<<(F.array()).format(IOFormat(FullPrecision,DontAlignCols,\" \",\"\\n\",\"3 \",\"\",\"\",\"\\n\"));\n  return true;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate bool igl::writeOFF<Eigen::Matrix<double, 8, 3, 0, 8, 3>, Eigen::Matrix<int, 12, 3, 0, 12, 3> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, 8, 3, 0, 8, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, 12, 3, 0, 12, 3> > const&);\n// generated by autoexplicit.sh\ntemplate bool igl::writeOFF<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&);\ntemplate bool igl::writeOFF<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1> > const&);\ntemplate bool igl::writeOFF<Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<unsigned int, -1, -1, 1, -1, -1> > const&);\ntemplate bool igl::writeOFF<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&);\ntemplate bool igl::writeOFF<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&);\ntemplate bool igl::writeOFF<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 3, 1, -1, 3> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&);\ntemplate bool igl::writeOFF<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 3, 1, -1, 3>, Eigen::Matrix<double, -1, 3, 1, -1, 3> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&);\ntemplate bool igl::writeOFF<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<unsigned int, -1, 3, 1, -1, 3>, Eigen::Matrix<double, -1, 3, 1, -1, 3> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<unsigned int, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/writeOFF.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_WRITEOFF_H\n#define IGL_WRITEOFF_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Core>\n#include <string>\n\nnamespace igl \n{\n  //Export geometry and colors-by-vertex\n  // Export a mesh from an ascii OFF file, filling in vertex positions.\n  // Only triangle meshes are supported\n  //\n  // Templates:\n  //   Scalar  type for positions and vectors (will be read as double and cast\n  //     to Scalar)\n  //   Index  type for indices (will be read as int and cast to Index)\n  // Inputs:\n  //  str  path to .off output file\n  //   V  #V by 3 mesh vertex positions\n  //   F  #F by 3 mesh indices into V\n  //   C  double matrix of rgb values per vertex #V by 3\n  // Outputs:\n  // Returns true on success, false on errors\n  template <typename DerivedV, typename DerivedF, typename DerivedC>\n  IGL_INLINE bool writeOFF(\n    const std::string str,\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    const Eigen::PlainObjectBase<DerivedC>& C);\n\n  template <typename DerivedV, typename DerivedF>\n  IGL_INLINE bool writeOFF(\n    const std::string str,\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"writeOFF.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/writePLY.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"writePLY.h\"\n#include <vector>\n\n#include <igl/ply.h>\n#include <vector>\n\ntemplate <\n  typename DerivedV,\n  typename DerivedF,\n  typename DerivedN,\n  typename DerivedUV>\nIGL_INLINE bool igl::writePLY(\n  const std::string & filename,\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  const Eigen::PlainObjectBase<DerivedN> & N,\n  const Eigen::PlainObjectBase<DerivedUV> & UV,\n  const bool ascii)\n{\n  // Largely based on obj2ply.c\n\n  typedef struct Vertex\n  {\n    double x,y,z,w;          /* position */\n    double nx,ny,nz;         /* surface normal */\n    double s,t;              /* texture coordinates */\n  } Vertex;\n\n  typedef struct Face\n  {\n    unsigned char nverts;    /* number of vertex indices in list */\n    int *verts;              /* vertex index list */\n  } Face;\n\n  PlyProperty vert_props[] =\n  { /* list of property information for a vertex */\n    {\"x\", PLY_DOUBLE, PLY_DOUBLE, offsetof(Vertex,x), 0, 0, 0, 0},\n    {\"y\", PLY_DOUBLE, PLY_DOUBLE, offsetof(Vertex,y), 0, 0, 0, 0},\n    {\"z\", PLY_DOUBLE, PLY_DOUBLE, offsetof(Vertex,z), 0, 0, 0, 0},\n    {\"nx\", PLY_DOUBLE, PLY_DOUBLE, offsetof(Vertex,nx), 0, 0, 0, 0},\n    {\"ny\", PLY_DOUBLE, PLY_DOUBLE, offsetof(Vertex,ny), 0, 0, 0, 0},\n    {\"nz\", PLY_DOUBLE, PLY_DOUBLE, offsetof(Vertex,nz), 0, 0, 0, 0},\n    {\"s\", PLY_DOUBLE, PLY_DOUBLE, offsetof(Vertex,s), 0, 0, 0, 0},\n    {\"t\", PLY_DOUBLE, PLY_DOUBLE, offsetof(Vertex,t), 0, 0, 0, 0},\n  };\n\n  PlyProperty face_props[] =\n  { /* list of property information for a face */\n    {\"vertex_indices\", PLY_INT, PLY_INT, offsetof(Face,verts),\n      1, PLY_UCHAR, PLY_UCHAR, offsetof(Face,nverts)},\n  };\n  const bool has_normals = N.rows() > 0;\n  const bool has_texture_coords = UV.rows() > 0;\n  std::vector<Vertex> vlist(V.rows());\n  std::vector<Face> flist(F.rows());\n  for(size_t i = 0;i<(size_t)V.rows();i++)\n  {\n    vlist[i].x = V(i,0);\n    vlist[i].y = V(i,1);\n    vlist[i].z = V(i,2);\n    if(has_normals)\n    {\n      vlist[i].nx = N(i,0);\n      vlist[i].ny = N(i,1);\n      vlist[i].nz = N(i,2);\n    }\n    if(has_texture_coords)\n    {\n      vlist[i].s = UV(i,0);\n      vlist[i].t = UV(i,1);\n    }\n  }\n  for(size_t i = 0;i<(size_t)F.rows();i++)\n  {\n    flist[i].nverts = F.cols();\n    flist[i].verts = new int[F.cols()];\n    for(size_t c = 0;c<(size_t)F.cols();c++)\n    {\n      flist[i].verts[c] = F(i,c);\n    }\n  }\n\n  const char * elem_names[] = {\"vertex\",\"face\"};\n  FILE * fp = fopen(filename.c_str(),\"w\");\n  if(fp==NULL)\n  {\n    return false;\n  }\n  PlyFile * ply = ply_write(fp, 2,elem_names,\n      (ascii ? PLY_ASCII : PLY_BINARY_LE));\n  if(ply==NULL)\n  {\n    return false;\n  }\n\n  std::vector<PlyProperty> plist;\n  plist.push_back(vert_props[0]);\n  plist.push_back(vert_props[1]);\n  plist.push_back(vert_props[2]);\n  if (has_normals)\n  {\n    plist.push_back(vert_props[3]);\n    plist.push_back(vert_props[4]);\n    plist.push_back(vert_props[5]);\n  }\n  if (has_texture_coords)\n  {\n    plist.push_back(vert_props[6]);\n    plist.push_back(vert_props[7]);\n  }\n  ply_describe_element(ply, \"vertex\", V.rows(),plist.size(),\n    &plist[0]);\n\n  ply_describe_element(ply, \"face\", F.rows(),1,&face_props[0]);\n  ply_header_complete(ply);\n  ply_put_element_setup(ply, \"vertex\");\n  for(const auto v : vlist)\n  {\n    ply_put_element(ply, (void *) &v);\n  }\n  ply_put_element_setup(ply, \"face\");\n  for(const auto f : flist)\n  {\n    ply_put_element(ply, (void *) &f);\n  }\n\n  ply_close(ply);\n  for(size_t i = 0;i<(size_t)F.rows();i++)\n  {\n    delete[] flist[i].verts;\n  }\n  return true;\n}\n\ntemplate <\n  typename DerivedV,\n  typename DerivedF>\nIGL_INLINE bool igl::writePLY(\n  const std::string & filename,\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  const bool ascii)\n{\n  Eigen::MatrixXd N,UV;\n  return writePLY(filename,V,F,N,UV,ascii);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate bool igl::writePLY<Eigen::Matrix<double, 8, 3, 0, 8, 3>, Eigen::Matrix<int, 12, 3, 0, 12, 3> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 8, 3, 0, 8, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, 12, 3, 0, 12, 3> > const&, bool);\ntemplate bool igl::writePLY<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, bool);\ntemplate bool igl::writePLY<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, bool);\ntemplate bool igl::writePLY<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 3, 1, -1, 3> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&, bool);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/writePLY.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_WRITEPLY_H\n#define IGL_WRITEPLY_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <string>\n\nnamespace igl\n{\n  // Write a mesh to a .ply file. \n  //\n  // Inputs:\n  //   filename  path to .ply file\n  //   V  #V by 3 list of vertex positions\n  //   F  #F by 3 list of triangle indices\n  //   N  #V by 3 list of vertex normals\n  //   UV  #V by 2 list of vertex texture coordinates\n  // Returns true iff success\n  template <\n    typename DerivedV,\n    typename DerivedF,\n    typename DerivedN,\n    typename DerivedUV>\n  IGL_INLINE bool writePLY(\n    const std::string & filename,\n    const Eigen::PlainObjectBase<DerivedV> & V,\n    const Eigen::PlainObjectBase<DerivedF> & F,\n    const Eigen::PlainObjectBase<DerivedN> & N,\n    const Eigen::PlainObjectBase<DerivedUV> & UV,\n    const bool ascii = true);\n  template <\n    typename DerivedV,\n    typename DerivedF>\n  IGL_INLINE bool writePLY(\n    const std::string & filename,\n    const Eigen::PlainObjectBase<DerivedV> & V,\n    const Eigen::PlainObjectBase<DerivedF> & F,\n    const bool ascii = true);\n}\n#ifndef IGL_STATIC_LIBRARY\n#  include \"writePLY.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/writeSTL.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"writeSTL.h\"\n#include <iostream>\n\ntemplate <typename DerivedV, typename DerivedF, typename DerivedN>\nIGL_INLINE bool igl::writeSTL(\n  const std::string & filename,\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  const Eigen::PlainObjectBase<DerivedN> & N,\n  const bool ascii)\n{\n  using namespace std;\n  assert(N.rows() == 0 || F.rows() == N.rows());\n  if(ascii)\n  {\n    FILE * stl_file = fopen(filename.c_str(),\"w\");\n    if(stl_file == NULL)\n    {\n      cerr<<\"IOError: \"<<filename<<\" could not be opened for writing.\"<<endl;\n      return false;\n    }\n    fprintf(stl_file,\"solid %s\\n\",filename.c_str());\n    for(int f = 0;f<F.rows();f++)\n    {\n      fprintf(stl_file,\"facet normal \");\n      if(N.rows()>0)\n      {\n        fprintf(stl_file,\"%e %e %e\\n\",\n          (float)N(f,0),\n          (float)N(f,1),\n          (float)N(f,2));\n      }else\n      {\n        fprintf(stl_file,\"0 0 0\\n\");\n      }\n      fprintf(stl_file,\"outer loop\\n\");\n      for(int c = 0;c<F.cols();c++)\n      {\n        fprintf(stl_file,\"vertex %e %e %e\\n\",\n          (float)V(F(f,c),0),\n          (float)V(F(f,c),1),\n          (float)V(F(f,c),2));\n      }\n      fprintf(stl_file,\"endloop\\n\");\n      fprintf(stl_file,\"endfacet\\n\");\n    }\n    fprintf(stl_file,\"endsolid %s\\n\",filename.c_str());\n    fclose(stl_file);\n    return true;\n  }else\n  {\n    FILE * stl_file = fopen(filename.c_str(),\"wb\");\n    if(stl_file == NULL)\n    {\n      cerr<<\"IOError: \"<<filename<<\" could not be opened for writing.\"<<endl;\n      return false;\n    }\n    // Write unused 80-char header\n    for(char h = 0;h<80;h++)\n    {\n      fwrite(&h,sizeof(char),1,stl_file);\n    }\n    // Write number of triangles\n    unsigned int num_tri = F.rows();\n    fwrite(&num_tri,sizeof(unsigned int),1,stl_file);\n    assert(F.cols() == 3);\n    // Write each triangle\n    for(int f = 0;f<F.rows();f++)\n    {\n      vector<float> n(3,0);\n      if(N.rows() > 0)\n      {\n        n[0] = N(f,0);\n        n[1] = N(f,1);\n        n[2] = N(f,2);\n      }\n      fwrite(&n[0],sizeof(float),3,stl_file);\n      for(int c = 0;c<3;c++)\n      {\n        vector<float> v(3);\n        v[0] = V(F(f,c),0);\n        v[1] = V(F(f,c),1);\n        v[2] = V(F(f,c),2);\n        fwrite(&v[0],sizeof(float),3,stl_file);\n      }\n      unsigned short att_count = 0;\n      fwrite(&att_count,sizeof(unsigned short),1,stl_file);\n    }\n    fclose(stl_file);\n    return true;\n  }\n}\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE bool igl::writeSTL(\n  const std::string & filename,\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedF> & F,\n  const bool ascii)\n{\n  return writeSTL(filename,V,F, DerivedV(), ascii);\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate bool igl::writeSTL<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, bool);\ntemplate bool igl::writeSTL<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, bool);\ntemplate bool igl::writeSTL<Eigen::Matrix<double, 8, 3, 0, 8, 3>, Eigen::Matrix<int, 12, 3, 0, 12, 3> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 8, 3, 0, 8, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, 12, 3, 0, 12, 3> > const&, bool);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/writeSTL.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_WRITESTL_H\n#define IGL_WRITESTL_H\n#include \"igl_inline.h\"\n\n#ifndef IGL_NO_EIGEN\n#  include <Eigen/Core>\n#endif\n#include <string>\n#include <vector>\n\nnamespace igl \n{\n  // Write a mesh to an stl file.\n  //\n  // Templates:\n  //   Scalar  type for positions and vectors (will be read as double and cast\n  //     to Scalar)\n  // Inputs:\n  //   filename path to .obj file\n  //   V  double matrix of vertex positions  #F*3 by 3\n  //   F  index matrix of triangle indices #F by 3\n  //   N  double matrix of vertex positions  #F by 3\n  //   asci  write ascii file {true}\n  // Returns true on success, false on errors\n  //\n  template <typename DerivedV, typename DerivedF, typename DerivedN>\n  IGL_INLINE bool writeSTL(\n    const std::string & filename,\n    const Eigen::PlainObjectBase<DerivedV> & V,\n    const Eigen::PlainObjectBase<DerivedF> & F,\n    const Eigen::PlainObjectBase<DerivedN> & N,\n    const bool ascii=true);\n  template <typename DerivedV, typename DerivedF>\n  IGL_INLINE bool writeSTL(\n    const std::string & filename,\n    const Eigen::PlainObjectBase<DerivedV> & V,\n    const Eigen::PlainObjectBase<DerivedF> & F,\n    const bool ascii=true);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"writeSTL.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/writeTGF.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"writeTGF.h\"\n#include <cstdio>\n\nIGL_INLINE bool igl::writeTGF(\n  const std::string tgf_filename,\n  const std::vector<std::vector<double> > & C,\n  const std::vector<std::vector<int> > & E)\n{\n  FILE * tgf_file = fopen(tgf_filename.c_str(),\"w\");\n  if(NULL==tgf_file)\n  {\n    printf(\"IOError: %s could not be opened\\n\",tgf_filename.c_str());\n    return false;  \n  }\n  // Loop over vertices\n  for(int i = 0; i<(int)C.size();i++)\n  {\n    assert(C[i].size() == 3);\n    // print a line with vertex number then \"description\"\n    // Where \"description\" in our case is the 3d position in space\n    // \n    fprintf(tgf_file,\n      \"%4d \"\n      \"%10.17g %10.17g %10.17g \" // current location\n      // All others are not needed for this legacy support\n      \"\\n\",\n      i+1,\n      C[i][0], C[i][1], C[i][2]);\n  }\n\n  // print a comment to separate vertices and edges\n  fprintf(tgf_file,\"#\\n\");\n\n  // loop over edges\n  for(int i = 0;i<(int)E.size();i++)\n  {\n    assert(E[i].size()==2);\n    fprintf(tgf_file,\"%4d %4d\\n\",\n      E[i][0]+1,\n      E[i][1]+1);\n  }\n\n  // print a comment to separate edges and faces\n  fprintf(tgf_file,\"#\\n\");\n\n  fclose(tgf_file);\n\n  return true;\n}\n\n#ifndef IGL_NO_EIGEN\n#include \"matrix_to_list.h\"\n\nIGL_INLINE bool igl::writeTGF(\n  const std::string tgf_filename,\n  const Eigen::MatrixXd & C,\n  const Eigen::MatrixXi & E)\n{\n  using namespace std;\n  vector<vector<double> > vC;\n  vector<vector<int> > vE;\n  matrix_to_list(C,vC);\n  matrix_to_list(E,vE);\n  return writeTGF(tgf_filename,vC,vE);\n}\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/writeTGF.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_WRITETGF_H\n#define IGL_WRITETGF_H\n#include \"igl_inline.h\"\n\n#include <vector>\n#include <string>\n#ifndef IGL_NO_EIGEN\n#include <Eigen/Dense>\n#endif\n\nnamespace igl\n{\n  // WRITETGF\n  //\n  // Write a graph to a .tgf file\n  //\n  // Input:\n  //  filename  .tgf file name\n  //  V  # vertices by 3 list of vertex positions\n  //  E  # edges by 2 list of edge indices\n  // \n  // Assumes that graph vertices are 3 dimensional\n  IGL_INLINE bool writeTGF(\n    const std::string tgf_filename,\n    const std::vector<std::vector<double> > & C,\n    const std::vector<std::vector<int> > & E);\n\n  #ifndef IGL_NO_EIGEN\n  IGL_INLINE bool writeTGF(\n    const std::string tgf_filename,\n    const Eigen::MatrixXd & C,\n    const Eigen::MatrixXi & E);\n  #endif\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"writeTGF.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libigl/include/igl/writeWRL.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"writeWRL.h\"\n#include <iostream>\n#include <fstream>\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE bool igl::writeWRL(\n  const std::string & str,\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedF> & F)\n{\n  using namespace std;\n  using namespace Eigen;\n  assert(V.cols() == 3 && \"V should have 3 columns\");\n  assert(F.cols() == 3 && \"F should have 3 columns\");\n  ofstream s(str);\n  if(!s.is_open())\n  {\n    cerr<<\"IOError: writeWRL() could not open \"<<str<<endl;\n    return false;\n  }\n  // Append column of -1 to F\n  Matrix<typename DerivedF::Scalar,Dynamic,4> FF(F.rows(),4);\n  FF.leftCols(3) = F;\n  FF.col(3).setConstant(-1);\n\n  s<<R\"(\nDEF default Transform {\ntranslation 0 0 0\nchildren [\nShape {\ngeometry DEF default-FACES IndexedFaceSet {\nccw TRUE\n)\"<<\n    V.format(\n      IOFormat(\n        FullPrecision,\n        DontAlignCols,\n        \" \",\",\\n\",\"\",\"\",\n        \"coord DEF default-COORD Coordinate { point [ \\n\",\"]\\n}\\n\"))<<\n    FF.format(\n      IOFormat(\n        FullPrecision,\n        DontAlignCols,\n        \",\",\"\\n\",\"\",\"\",\n        \"coordIndex [ \\n\",\" ]\\n\"))<<\n    \"}\\n}\\n]\\n}\\n\";\n  return true;\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate bool igl::writeWRL<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&);\n// generated by autoexplicit.sh\ntemplate bool igl::writeWRL<Eigen::Matrix<double, 8, 3, 0, 8, 3>, Eigen::Matrix<int, 12, 3, 0, 12, 3> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 8, 3, 0, 8, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, 12, 3, 0, 12, 3> > const&);\ntemplate bool igl::writeWRL<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/writeWRL.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_WRITE_WRL_H\n#define IGL_WRITE_WRL_H\n#include \"igl_inline.h\"\n#include <Eigen/Core>\n#include <string>\nnamespace igl\n{\n  // Write mesh to a .wrl file\n  //\n  // Inputs:\n  //   str  path to .wrl file\n  //   V  #V by 3 list of vertex positions\n  //   F  #F by 3 list of triangle indices\n  // Returns true iff succes\n  template <typename DerivedV, typename DerivedF>\n  IGL_INLINE bool writeWRL(\n    const std::string & str,\n    const Eigen::PlainObjectBase<DerivedV> & V,\n    const Eigen::PlainObjectBase<DerivedF> & F);\n}\n#ifndef IGL_STATIC_LIBRARY\n#include \"writeWRL.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/write_triangle_mesh.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"write_triangle_mesh.h\"\n#include \"pathinfo.h\"\n#include \"writeMESH.h\"\n#include \"writeOBJ.h\"\n#include \"writeOFF.h\"\n#include \"writePLY.h\"\n#include \"writeSTL.h\"\n#include \"writeWRL.h\"\n\n#include <iostream>\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE bool igl::write_triangle_mesh(\n  const std::string str,\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  const bool ascii)\n{\n  using namespace std;\n  // dirname, basename, extension and filename\n  string d,b,e,f;\n  pathinfo(str,d,b,e,f);\n  // Convert extension to lower case\n  std::transform(e.begin(), e.end(), e.begin(), ::tolower);\n  if(e == \"mesh\")\n  {\n    assert(ascii && \".mesh only supports ascii\");\n    Eigen::MatrixXi _1;\n    return writeMESH(str,V,_1,F);\n  }else if(e == \"obj\")\n  {\n    assert(ascii && \".obj only supports ascii\");\n    return writeOBJ(str,V,F);\n  }else if(e == \"off\")\n  {\n    assert(ascii && \".off only supports ascii\");\n    return writeOFF(str,V,F);\n  }else if(e == \"ply\")\n  {\n    return writePLY(str,V,F,ascii);\n  }else if(e == \"stl\")\n  {\n    return writeSTL(str,V,F,ascii);\n  }else if(e == \"wrl\")\n  {\n    assert(ascii && \".wrl only supports ascii\");\n    return writeWRL(str,V,F);\n  }else\n  {\n    assert(\"Unsupported file format\");\n    cerr<<\"Unsupported file format: .\"<<e<<endl;\n    return false;\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\n// generated by autoexplicit.sh\ntemplate bool igl::write_triangle_mesh<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, bool);\n// generated by autoexplicit.sh\ntemplate bool igl::write_triangle_mesh<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, const bool);\ntemplate bool igl::write_triangle_mesh<Eigen::Matrix<double, 8, 3, 0, 8, 3>, Eigen::Matrix<int, 12, 3, 0, 12, 3> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::PlainObjectBase<Eigen::Matrix<double, 8, 3, 0, 8, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, 12, 3, 0, 12, 3> > const&, bool);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/write_triangle_mesh.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_WRITE_TRIANGLE_MESH_H\n#define IGL_WRITE_TRIANGLE_MESH_H\n#include \"igl_inline.h\"\n\n#include <Eigen/Core>\n#include <string>\n\nnamespace igl\n{\n  // write mesh to a file with automatic detection of file format.  supported:\n  // obj, off, stl, wrl, ply, mesh). \n  // \n  // Templates:\n  //   Scalar  type for positions and vectors (will be read as double and cast\n  //     to Scalar)\n  //   Index  type for indices (will be read as int and cast to Index)\n  // Inputs:\n  //   str  path to file\n  //   V  eigen double matrix #V by 3\n  //   F  eigen int matrix #F by 3\n  // Returns true iff success\n  template <typename DerivedV, typename DerivedF>\n  IGL_INLINE bool write_triangle_mesh(\n    const std::string str,\n    const Eigen::PlainObjectBase<DerivedV>& V,\n    const Eigen::PlainObjectBase<DerivedF>& F,\n    const bool ascii = true);\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"write_triangle_mesh.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/xml/README",
    "content": "IGL xml serializer\n\nDependencies:\n  tinyxml2  \n  \nTravel to $IGL/external/tinyxml2"
  },
  {
    "path": "libs/libigl/include/igl/xml/ReAntTweakBarXMLSerialization.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n// \n// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>\n// \n// This Source Code Form is subject to the terms of the Mozilla Public License \n// v. 2.0. If a copy of the MPL was not distributed with this file, You can \n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_XML_REANTTWEAKBAR_XML_SERIALIZATION_H\n#define IGL_XML_REANTTWEAKBAR_XML_SERIALIZATION_H\n#include \"../igl_inline.h\"\n#include \"serialize_xml.h\"\n\n#undef IGL_HEADER_ONLY\n#include \"../anttweakbar/ReAntTweakBar.h\"\n\n// Forward declarations\nnamespace igl\n{\n  namespace anttweakbar\n  {\n    class ReTwBar;\n  }\n};\nnamespace tinyxml2\n{\n  class XMLDocument;\n};\n\nnamespace igl\n{\n  namespace xml\n  {\n  \n//  namespace\n//  {\n  \n//    IGL_INLINE bool save_ReAntTweakBar(::igl::anttweakbar::ReTwBar* bar, const char* file_name);\n//    IGL_INLINE bool save_ReAntTweakBar(::igl::anttweakbar::ReTwBar* bar, tinyxml2::XMLDocument* doc);\n//    IGL_INLINE bool load_ReAntTweakBar(::igl::anttweakbar::ReTwBar* bar, const char *file_name);\n//    IGL_INLINE bool load_ReAntTweakBar(::igl::anttweakbar::ReTwBar* bar, tinyxml2::XMLDocument* doc);\n    \n    \n    IGL_INLINE bool save_ReAntTweakBar(::igl::anttweakbar::ReTwBar* bar, const char* file_name)\n    {\n      const char * name_chars = TwGetBarName(bar->bar);\n      std::string name = std::string(name_chars) + \"_AntTweakBar\";\n      \n      const std::vector< ::igl::anttweakbar::ReTwRWItem>& rw_items = bar->get_rw_items();\n      for(std::vector< ::igl::anttweakbar::ReTwRWItem>::const_iterator it = rw_items.begin(); it != rw_items.end(); it++)\n      {\n        std::string val = bar->get_value_as_string(it->var,it->type);\n        //::igl::XMLSerializer::SaveObject(val,it->name,name,file_name,false);\n        ::igl::serialize_xml(val,it->name,file_name,false,false);\n      }\n      \n      char var[REANTTWEAKBAR_MAX_CB_VAR_SIZE];\n      // Print all CB variables\n      const std::vector< ::igl::anttweakbar::ReTwCBItem>& cb_items = bar->get_cb_items();\n      for(std::vector< ::igl::anttweakbar::ReTwCBItem>::const_iterator it = cb_items.begin(); it != cb_items.end(); it++)\n      {\n        TwType type = it->type;\n        //TwSetVarCallback setCallback = it->setCallback;\n        TwGetVarCallback getCallback = it->getCallback;\n        void * clientData = it->clientData;\n        // I'm not sure how to do what I want to do. getCallback needs to be sure\n        // that it can write to var. So var needs to point to a valid and big\n        // enough chunk of memory\n        getCallback(var,clientData);\n        \n        std::string val = bar->get_value_as_string(var,type);\n        //::igl::XMLSerializer::SaveObject(val,it->name,name,file_name,false);\n        ::igl::serialize_xml(val,it->name,file_name,false,false);\n      }\n      \n      return true;\n    }\n    \n    /*IGL_INLINE bool save_ReAntTweakBar(::igl::anttweakbar::ReTwBar* bar, tinyxml2::XMLDocument* doc)\n    {\n      std::vector<char**> buffer;\n      \n      const char * name_chars = TwGetBarName(bar->bar);\n      std::string name = std::string(name_chars) + \"_AntTweakBar\";\n      ::igl::XMLSerializer* s = new ::igl::XMLSerializer(name);\n      \n      const std::vector< ::igl::anttweakbar::ReTwRWItem>& rw_items = bar->get_rw_items();\n      for(std::vector< ::igl::anttweakbar::ReTwRWItem>::const_iterator it = rw_items.begin(); it != rw_items.end(); it++)\n      {\n        std::string val = bar->get_value_as_string(it->var,it->type);\n        char** cval = new char*; // create char* on heap\n        *cval = new char[val.size()+1];\n        buffer.push_back(cval);\n        strcpy(*cval,val.c_str());\n        s->Add(*cval,it->name);\n      }\n      \n      char var[REANTTWEAKBAR_MAX_CB_VAR_SIZE];\n      // Print all CB variables\n      const std::vector< ::igl::anttweakbar::ReTwCBItem>& cb_items = bar->get_cb_items();\n      for(std::vector< ::igl::anttweakbar::ReTwCBItem>::const_iterator it = cb_items.begin(); it != cb_items.end(); it++)\n      {\n        TwType type = it->type;\n        //TwSetVarCallback setCallback = it->setCallback;\n        TwGetVarCallback getCallback = it->getCallback;\n        void * clientData = it->clientData;\n        // I'm not sure how to do what I want to do. getCallback needs to be sure\n        // that it can write to var. So var needs to point to a valid and big\n        // enough chunk of memory\n        getCallback(var,clientData);\n        \n        std::string val = bar->get_value_as_string(var,type);\n        char** cval = new char*; // create char* on heap\n        *cval = new char[val.size()+1];\n        buffer.push_back(cval);\n        strcpy(*cval,val.c_str());\n        s->Add(*cval,it->name);\n      }\n      \n      s->SaveToXMLDoc(name,doc);\n      \n      // delete pointer buffers\n      for(unsigned int i=0;i<buffer.size();i++)\n      {\n        delete[] *buffer[i];\n        delete buffer[i];\n      }\n      \n      delete s;\n      \n      return true;\n    }*/\n    \n    IGL_INLINE bool load_ReAntTweakBar(::igl::anttweakbar::ReTwBar* bar, const char *file_name)\n    {\n      char type_str[REANTTWEAKBAR_MAX_WORD];\n      char value_str[REANTTWEAKBAR_MAX_WORD];\n      TwType type;\n      \n      const char * name_chars = TwGetBarName(bar->bar);\n      std::string name = std::string(name_chars) + \"_AntTweakBar\";\n      \n      const std::vector< ::igl::anttweakbar::ReTwRWItem>& rw_items = bar->get_rw_items();\n      for(std::vector< ::igl::anttweakbar::ReTwRWItem>::const_iterator it = rw_items.begin(); it != rw_items.end(); it++)\n      {\n        char* val;\n        //::igl::XMLSerializer::LoadObject(val,it->name,name,file_name);\n        ::igl::deserialize_xml(val,it->name,file_name);\n        sscanf(val,\"%s %[^\\n]\",type_str,value_str);\n        \n        if(!bar->type_from_string(type_str,type))\n        {\n          printf(\"ERROR: %s type not found... Skipping...\\n\",type_str);\n          continue;\n        }\n        \n        bar->set_value_from_string(it->name.c_str(),type,value_str);\n        delete[] val;\n      }\n      \n      const std::vector< ::igl::anttweakbar::ReTwCBItem>& cb_items = bar->get_cb_items();\n      for(std::vector< ::igl::anttweakbar::ReTwCBItem>::const_iterator it = cb_items.begin(); it != cb_items.end(); it++)\n      {\n        char* val;\n        //::igl::XMLSerializer::LoadObject(val,it->name,name,file_name);\n        ::igl::deserialize_xml(val,it->name,file_name);\n        sscanf(val,\"%s %[^\\n]\",type_str,value_str);\n        \n        if(!bar->type_from_string(type_str,type))\n        {\n          printf(\"ERROR: %s type not found... Skipping...\\n\",type_str);\n          continue;\n        }\n        \n        bar->set_value_from_string(it->name.c_str(),type,value_str);\n        delete[] val;\n      }\n      \n      return true;\n    }\n    \n    /*IGL_INLINE bool load_ReAntTweakBar(::igl::anttweakbar::ReTwBar* bar, tinyxml2::XMLDocument* doc)\n    {\n      std::map<std::string,char*> variables;\n      std::map<std::string,char*> cbVariables;\n      \n      const char * name_chars = TwGetBarName(bar->bar);\n      std::string name = std::string(name_chars) + \"_AntTweakBar\";\n      ::igl::XMLSerializer* s = new ::igl::XMLSerializer(name);\n      \n      std::map<std::string,char*>::iterator iter;\n      const std::vector< ::igl::anttweakbar::ReTwRWItem>& rw_items = bar->get_rw_items();\n      for(std::vector< ::igl::anttweakbar::ReTwRWItem>::const_iterator it = rw_items.begin(); it != rw_items.end(); it++)\n      {\n        variables[it->name] = NULL;\n        iter = variables.find(it->name);\n        s->Add(iter->second,iter->first);\n      }\n      \n      // Add all CB variables\n      const std::vector< ::igl::anttweakbar::ReTwCBItem>& cb_items = bar->get_cb_items();\n      for(std::vector< ::igl::anttweakbar::ReTwCBItem>::const_iterator it = cb_items.begin(); it != cb_items.end(); it++)\n      {\n        cbVariables[it->name] = NULL;\n        iter = cbVariables.find(it->name);\n        s->Add(iter->second,iter->first);\n      }\n      \n      s->LoadFromXMLDoc(doc);\n      \n      // Set loaded values\n      char type_str[REANTTWEAKBAR_MAX_WORD];\n      char value_str[REANTTWEAKBAR_MAX_WORD];\n      TwType type;\n      \n      for(iter = variables.begin(); iter != variables.end(); iter++)\n      {\n        if(iter->second == NULL)\n        {\n          printf(\"ERROR: '%s' entry not found... Skipping...\\n\",iter->first.c_str());\n          continue;\n        }\n        \n        sscanf(iter->second,\"%s %[^\\n]\",type_str,value_str);\n        \n        if(!bar->type_from_string(type_str,type))\n        {\n          printf(\"ERROR: Type '%s' of '%s' not found... Skipping...\\n\",type_str,iter->first.c_str());\n          continue;\n        }\n        \n        bar->set_value_from_string(iter->first.c_str(),type,value_str);\n      }\n      \n      for(iter = cbVariables.begin(); iter != cbVariables.end(); iter++)\n      {\n        if(iter->second == NULL)\n        {\n          printf(\"ERROR: '%s' entry not found... Skipping...\\n\",iter->first.c_str());\n          continue;\n        }\n\n        sscanf(iter->second,\"%s %[^\\n]\",type_str,value_str);\n        \n        if(!bar->type_from_string(type_str,type))\n        {\n          printf(\"ERROR: Type '%s' of '%s' not found... Skipping...\\n\",type_str,iter->first.c_str());\n          continue;\n        }\n        \n        bar->set_value_from_string(iter->first.c_str(),type,value_str);\n      }\n      \n      // delete buffers\n      for(iter = variables.begin(); iter != variables.end(); iter++)\n        delete[] iter->second;\n      \n      for(iter = cbVariables.begin(); iter != cbVariables.end(); iter++)\n        delete[] iter->second;\n      \n      delete s;\n      \n      return true;\n    }*/\n    \n//  }\n  }\n}\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/xml/XMLSerializable.h",
    "content": "#ifndef IGL_XML_XMLSERIALIZABLE_H\n#define IGL_XML_XMLSERIALIZABLE_H\n\n#include \"serialize_xml.h\"\n#include \"../igl_inline.h\"\n#include \"../serialize.h\"\n\n#include <tinyxml2.h>\n\n\n// Interface for xml-serializable class see serialize_xml.h\n\n// Pretty sure all of these IGL_INLINE should be inline\n \nnamespace igl\n{\n  namespace xml\n  {\n    // interface for user defined types\n    struct XMLSerializableBase : public SerializableBase\n    {\n      virtual void Serialize(std::vector<char>& buffer) const = 0;\n      virtual void Deserialize(const std::vector<char>& buffer) = 0;\n      virtual void Serialize(tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element) const = 0;\n      virtual void Deserialize(const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element) = 0;\n    };\n\n    // Convenient interface for user defined types\n    class XMLSerializable: public XMLSerializableBase\n    {\n    private:\n  \n      template <typename T>\n      struct XMLSerializationObject: public XMLSerializableBase\n      {\n        bool Binary;\n        std::string Name;\n        T* Object;\n  \n        void Serialize(std::vector<char>& buffer) const {\n          serialize(*Object,Name,buffer);\n        }\n  \n        void Deserialize(const std::vector<char>& buffer) {\n          deserialize(*Object,Name,buffer);\n        }\n  \n        void Serialize(tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element) const {\n          serialize_xml(*Object,Name,doc,element,Binary);\n        }\n  \n        void Deserialize(const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element) {\n          deserialize_xml(*Object,Name,doc,element);\n        }\n      };\n  \n      mutable bool initialized;\n      mutable std::vector<XMLSerializableBase*> objects;\n  \n    public:\n  \n      // Override this function to add your member variables which should be serialized\n      IGL_INLINE virtual void InitSerialization() = 0;\n  \n      // Following functions can be overridden to handle the specific events.\n      // Return false to prevent the de-/serialization of an object.\n      IGL_INLINE virtual bool PreSerialization() const;\n      IGL_INLINE virtual void PostSerialization() const;\n      IGL_INLINE virtual bool PreDeserialization();\n      IGL_INLINE virtual void PostDeserialization();\n  \n      // Default implementation of XMLSerializableBase interface\n      IGL_INLINE void Serialize(std::vector<char>& buffer) const;\n      IGL_INLINE void Deserialize(const std::vector<char>& buffer);\n      IGL_INLINE void Serialize(tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element) const;\n      IGL_INLINE void Deserialize(const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element);\n  \n      // Default constructor, destructor, assignment and copy constructor\n      IGL_INLINE XMLSerializable();\n      IGL_INLINE XMLSerializable(const XMLSerializable& obj);\n      IGL_INLINE ~XMLSerializable();\n      IGL_INLINE XMLSerializable& operator=(const XMLSerializable& obj);\n  \n      // Use this function to add your variables which should be serialized\n      template <typename T>\n      IGL_INLINE void Add(T& obj,std::string name,bool binary = false);\n    };\n \n    // IMPLEMENTATION\n\n    IGL_INLINE bool XMLSerializable::PreSerialization() const\n    { \n      return true;\n    }\n    \n    IGL_INLINE void XMLSerializable::PostSerialization() const\n    {\n    }\n    \n    IGL_INLINE bool XMLSerializable::PreDeserialization()\n    { \n      return true;\n    }\n  \n    IGL_INLINE void XMLSerializable::PostDeserialization() \n    {\n    }\n  \n    IGL_INLINE void XMLSerializable::Serialize(std::vector<char>& buffer) const\n    {\n      if(this->PreSerialization())\n      {\n        if(initialized == false)\n        {\n          objects.clear();\n          (const_cast<XMLSerializable*>(this))->InitSerialization();\n          initialized = true;\n        }\n  \n        for(unsigned int i=0;i<objects.size();i++)\n          objects[i]->Serialize(buffer);\n  \n        this->PostSerialization();\n      }\n    }\n  \n    IGL_INLINE void XMLSerializable::Deserialize(const std::vector<char>& buffer)\n    {\n      if(this->PreDeserialization())\n      {\n        if(initialized == false)\n        {\n          objects.clear();\n          (const_cast<XMLSerializable*>(this))->InitSerialization();\n          initialized = true;\n        }\n  \n        for(unsigned int i=0;i<objects.size();i++)\n          objects[i]->Deserialize(buffer);\n  \n        this->PostDeserialization();\n      }\n    }\n  \n    IGL_INLINE void XMLSerializable::Serialize(tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element) const\n    {\n      if(this->PreSerialization())\n      {\n        if(initialized == false)\n        {\n          objects.clear();\n          (const_cast<XMLSerializable*>(this))->InitSerialization();\n          initialized = true;\n        }\n  \n        for(unsigned int i=0;i<objects.size();i++)\n          objects[i]->Serialize(doc,element);\n  \n        this->PostSerialization();\n      }\n    }\n  \n    IGL_INLINE void XMLSerializable::Deserialize(const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element)\n    {\n      if(this->PreDeserialization())\n      {\n        if(initialized == false)\n        {\n          objects.clear();\n          (const_cast<XMLSerializable*>(this))->InitSerialization();\n          initialized = true;\n        }\n  \n        for(unsigned int i=0;i<objects.size();i++)\n          objects[i]->Deserialize(doc,element);\n  \n        this->PostDeserialization();\n      }\n    }\n  \n    IGL_INLINE XMLSerializable::XMLSerializable()\n    {\n      initialized = false;\n    }\n  \n    IGL_INLINE XMLSerializable::XMLSerializable(const XMLSerializable& obj)\n    {\n      initialized = false;\n      objects.clear();\n    }\n  \n    IGL_INLINE XMLSerializable::~XMLSerializable()\n    {\n      initialized = false;\n      objects.clear();\n    }\n  \n  \n    IGL_INLINE XMLSerializable& XMLSerializable::operator=(const XMLSerializable& obj)\n    {\n      if(this != &obj)\n      {\n        if(initialized)\n        {\n          initialized = false;\n          objects.clear();\n        }\n      }\n      return *this;\n    }\n  \n    template <typename T>\n    IGL_INLINE void XMLSerializable::Add(T& obj,std::string name,bool binary)\n    {\n      XMLSerializationObject<T>* object = new XMLSerializationObject<T>();\n      object->Binary = binary;\n      object->Name = name;\n      object->Object = &obj;\n  \n      objects.push_back(object);\n    }\n    \n  }\n}\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/xml/serialization_test.cpp",
    "content": "//\n// Copyright (C) 2014 Christian Schüller <schuellchr@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n//#ifndef IGL_SERIALIZATION_TEST_H\n//#define IGL_SERIALIZATION_TEST_H\n\n//#include <igl/Timer.h>\n#include <igl/xml/serialize_xml.h>\n\nnamespace igl\n{\n\n  struct Test1111\n  {\n  };\n\n  struct Test1 : public XMLSerializable\n  {\n    std::string ts;\n    std::vector<Test1*> tvt;\n    Test1* tt;\n\n    Test1()\n    {\n      tt = NULL;\n    }\n\n    void InitSerialization()\n    {\n      Add(ts,\"ts\",false);\n      Add(tvt,\"tvt\");\n      Add(tt,\"tt\");\n    }\n  };\n\n  struct Test2: public igl::XMLSerializableBase\n  {\n    char tc;\n    int* ti;\n    std::vector<short> tvb;\n    float tf;\n\n    Test2()\n    {\n      tc = '1';\n      ti = NULL;\n      tf = 1.0004;\n      tvb.push_back(2);\n      tvb.push_back(3);\n    }\n\n    void Serialize(tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element) const\n    {\n      igl::serialize_xml(tc,\"tc\",doc,element);\n      igl::serialize_xml(ti,\"ti\",doc,element);\n      igl::serialize_xml(tvb,\"tvb\",doc,element);\n    }\n    void Deserialize(const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element)\n    {\n      igl::deserialize_xml(tc,\"tc\",doc,element);\n      igl::deserialize_xml(ti,\"ti\",doc,element);\n      igl::deserialize_xml(tvb,\"tvb\",doc,element);\n    }\n    void Serialize(std::vector<char>& buffer) const\n    {\n      igl::serialize(tc,\"tc\",buffer);\n      igl::serialize(ti,\"ti\",buffer);\n      igl::serialize(tvb,\"tvb\",buffer);\n      igl::serialize(tf,\"tf\",buffer);\n    }\n    void Deserialize(const std::vector<char>& buffer)\n    {\n      igl::deserialize(tc,\"tc\",buffer);\n      igl::deserialize(ti,\"ti\",buffer);\n      igl::deserialize(tvb,\"tvb\",buffer);\n      igl::deserialize(tf,\"tf\",buffer);\n    }\n  };\n\n  void serialization_test()\n  {\n    std::string file(\"test\");\n\n    bool tbIn = true,tbOut;\n    char tcIn = 't',tcOut;\n    unsigned char tucIn = 'u',tucOut;\n    short tsIn = 6,tsOut;\n    int tiIn = -10,tiOut;\n    unsigned int tuiIn = 10,tuiOut;\n    float tfIn = 1.0005,tfOut;\n    double tdIn = 1.000000005,tdOut;\n\n    int* tinpIn = NULL,*tinpOut = NULL;\n    float* tfpIn = new float,*tfpOut = NULL;\n    *tfpIn = 1.11101;\n\n    std::string tstrIn(\"test12345\"),tstrOut;\n\n    Test2 tObjIn,tObjOut;\n    int ti = 2;\n    tObjIn.ti = &ti;\n\n\n    Test1 test1,test2,test3;\n    test1.ts = \"100\";\n    test2.ts = \"200\";\n    test3.ts = \"300\";\n\n    Test1 testA, testC;\n    testA.tt = &test1;\n    testA.ts = \"test123\";\n    testA.tvt.push_back(&test2);\n    testA.tvt.push_back(&test3);\n\n    Test1 testB = testA;\n    testB.ts = \"400\";\n    testB.tvt.pop_back();\n\n    std::pair<int,bool> tPairIn(10,true);\n    std::pair<int,bool> tPairOut;\n\n    std::vector<int> tVector1In ={1,2,3,4,5};\n    std::vector<int> tVector1Out;\n\n    std::pair<int,bool> p1(10,1);\n    std::pair<int,bool> p2(1,0);\n    std::pair<int,bool> p3(10000,1);\n    std::vector<std::pair<int,bool> > tVector2In ={p1,p2,p3};\n    std::vector<std::pair<int,bool> > tVector2Out;\n\n    std::set<std::pair<int,bool> > tSetIn ={p1,p2,p3};\n    std::set<std::pair<int,bool> > tSetOut;\n\n    std::map<int,bool> tMapIn ={p1,p2,p3};\n    std::map<int,bool> tMapOut;\n\n    Eigen::Matrix<float,3,3> tDenseMatrixIn;\n    tDenseMatrixIn << Eigen::Matrix<float,3,3>::Random();\n    tDenseMatrixIn.coeffRef(0,0) = 1.00001;\n    Eigen::Matrix<float,3,3> tDenseMatrixOut;\n\n    Eigen::Matrix<float,3,3,Eigen::RowMajor> tDenseRowMatrixIn;\n    tDenseRowMatrixIn << Eigen::Matrix<float,3,3,Eigen::RowMajor>::Random();\n    Eigen::Matrix<float,3,3,Eigen::RowMajor> tDenseRowMatrixOut;\n\n    Eigen::SparseMatrix<double> tSparseMatrixIn;\n    tSparseMatrixIn.resize(3,3);\n    tSparseMatrixIn.insert(0,0) = 1.3;\n    tSparseMatrixIn.insert(1,1) = 10.2;\n    tSparseMatrixIn.insert(2,2) = 100.1;\n    tSparseMatrixIn.finalize();\n    Eigen::SparseMatrix<double> tSparseMatrixOut;\n\n    // binary serialization\n\n    igl::serialize(tbIn,file);\n    igl::deserialize(tbOut,file);\n    assert(tbIn == tbOut);\n\n    igl::serialize(tcIn,file);\n    igl::deserialize(tcOut,file);\n    assert(tcIn == tcOut);\n\n    igl::serialize(tucIn,file);\n    igl::deserialize(tucOut,file);\n    assert(tucIn == tucOut);\n\n    igl::serialize(tsIn,file);\n    igl::deserialize(tsOut,file);\n    assert(tsIn == tsOut);\n\n    igl::serialize(tiIn,file);\n    igl::deserialize(tiOut,file);\n    assert(tiIn == tiOut);\n\n    igl::serialize(tuiIn,file);\n    igl::deserialize(tuiOut,file);\n    assert(tuiIn == tuiOut);\n\n    igl::serialize(tfIn,file);\n    igl::deserialize(tfOut,file);\n    assert(tfIn == tfOut);\n\n    igl::serialize(tdIn,file);\n    igl::deserialize(tdOut,file);\n    assert(tdIn == tdOut);\n\n    igl::serialize(tinpIn,file);\n    igl::deserialize(tinpOut,file);\n    assert(tinpIn == tinpOut);\n\n    igl::serialize(tfpIn,file);\n    igl::deserialize(tfpOut,file);\n    assert(*tfpIn == *tfpOut);\n    tfpOut = NULL;\n\n    igl::serialize(tstrIn,file);\n    igl::deserialize(tstrOut,file);\n    assert(tstrIn == tstrOut);\n\n    // updating\n    igl::serialize(tbIn,\"tb\",file,true);\n    igl::serialize(tcIn,\"tc\",file);\n    igl::serialize(tiIn,\"ti\",file);\n    tiIn++;\n    igl::serialize(tiIn,\"ti\",file);\n    tiIn++;\n    igl::serialize(tiIn,\"ti\",file);\n    igl::deserialize(tbOut,\"tb\",file);\n    igl::deserialize(tcOut,\"tc\",file);\n    igl::deserialize(tiOut,\"ti\",file);\n    assert(tbIn == tbOut);\n    assert(tcIn == tcOut);\n    assert(tiIn == tiOut);\n\n    igl::serialize(tsIn,\"tsIn\",file,true);\n    igl::serialize(tVector1In,\"tVector1In\",file);\n    igl::serialize(tVector2In,\"tsIn\",file);\n    igl::deserialize(tVector2Out,\"tsIn\",file);\n    for(unsigned int i=0;i<tVector2In.size();i++)\n    {\n      assert(tVector2In[i].first == tVector2Out[i].first);\n      assert(tVector2In[i].second == tVector2Out[i].second);\n    }\n    tVector2Out.clear();\n\n    igl::serialize(tObjIn,file);\n    igl::deserialize(tObjOut,file);\n    assert(tObjIn.tc == tObjOut.tc);\n    assert(*tObjIn.ti == *tObjOut.ti);\n    for(unsigned int i=0;i<tObjIn.tvb.size();i++)\n      assert(tObjIn.tvb[i] == tObjOut.tvb[i]);\n    tObjOut.ti = NULL;\n\n    igl::serialize(tPairIn,file);\n    igl::deserialize(tPairOut,file);\n    assert(tPairIn.first == tPairOut.first);\n    assert(tPairIn.second == tPairOut.second);\n\n    igl::serialize(tVector1In,file);\n    igl::deserialize(tVector1Out,file);\n    for(unsigned int i=0;i<tVector1In.size();i++)\n      assert(tVector1In[i] == tVector1Out[i]);\n\n    igl::serialize(tVector2In,file);\n    igl::deserialize(tVector2Out,file);\n    for(unsigned int i=0;i<tVector2In.size();i++)\n    {\n      assert(tVector2In[i].first == tVector2Out[i].first);\n      assert(tVector2In[i].second == tVector2Out[i].second);\n    }\n\n    igl::serialize(tSetIn,file);\n    igl::deserialize(tSetOut,file);\n    assert(tSetIn.size() == tSetOut.size());\n\n    igl::serialize(tMapIn,file);\n    igl::deserialize(tMapOut,file);\n    assert(tMapIn.size() == tMapOut.size());\n\n    igl::serialize(tDenseMatrixIn,file);\n    igl::deserialize(tDenseMatrixOut,file);\n    assert((tDenseMatrixIn - tDenseMatrixOut).sum() == 0);\n\n    igl::serialize(tDenseRowMatrixIn,file);\n    igl::deserialize(tDenseRowMatrixOut,file);\n    assert((tDenseRowMatrixIn - tDenseRowMatrixOut).sum() == 0);\n\n    igl::serialize(tSparseMatrixIn,file);\n    igl::deserialize(tSparseMatrixOut,file);\n    assert((tSparseMatrixIn - tSparseMatrixOut).sum() == 0);\n\n    igl::serialize(testB,file);\n    igl::deserialize(testC,file);\n    assert(testB.ts == testC.ts);\n    assert(testB.tvt.size() == testC.tvt.size());\n    for(unsigned int i=0;i<testB.tvt.size();i++)\n    {\n      assert(testB.tvt[i]->ts == testC.tvt[i]->ts);\n      assert(testB.tvt[i]->tvt.size() == testC.tvt[i]->tvt.size());\n      assert(testB.tvt[i]->tt == testC.tvt[i]->tt);\n    }\n    assert(testB.tt->ts == testC.tt->ts);\n    assert(testB.tt->tvt.size() == testC.tt->tvt.size());\n    assert(testB.tt->tt == testC.tt->tt);\n    testC = Test1();\n\n    // big data test\n    /*std::vector<std::vector<float> > bigDataIn,bigDataOut;\n    for(unsigned int i=0;i<10000;i++)\n    {\n    std::vector<float> v;\n    for(unsigned int j=0;j<10000;j++)\n    {\n    v.push_back(j);\n    }\n    bigDataIn.push_back(v);\n    }\n\n    igl::Timer timer;\n    timer.start();\n    igl::serialize(bigDataIn,file);\n    timer.stop();\n    std::cout << \"ser: \" << timer.getElapsedTimeInMilliSec() << std::endl;\n\n    timer.start();\n    igl::deserialize(bigDataOut,file);\n    timer.stop();\n    std::cout << \"des: \" << timer.getElapsedTimeInMilliSec() << std::endl;\n    char c;\n    std::cin >> c; */\n\n    // xml serialization\n\n    igl::serialize_xml(tbIn,file);\n    igl::deserialize_xml(tbOut,file);\n    assert(tbIn == tbOut);\n\n    igl::serialize_xml(tcIn,file);\n    igl::deserialize_xml(tcOut,file);\n    assert(tcIn == tcOut);\n\n    igl::serialize_xml(tucIn,file);\n    igl::deserialize_xml(tucOut,file);\n    assert(tucIn == tucOut);\n\n    igl::serialize_xml(tsIn,file);\n    igl::deserialize_xml(tsOut,file);\n    assert(tsIn == tsOut);\n\n    igl::serialize_xml(tiIn,file);\n    igl::deserialize_xml(tiOut,file);\n    assert(tiIn == tiOut);\n\n    igl::serialize_xml(tuiIn,file);\n    igl::deserialize_xml(tuiOut,file);\n    assert(tuiIn == tuiOut);\n\n    igl::serialize_xml(tfIn,file);\n    igl::deserialize_xml(tfOut,file);\n    assert(tfIn == tfOut);\n\n    igl::serialize_xml(tdIn,file);\n    igl::deserialize_xml(tdOut,file);\n    assert(tdIn == tdOut);\n\n    igl::serialize_xml(tinpIn,file);\n    igl::deserialize_xml(tinpOut,file);\n    assert(tinpIn == tinpOut);\n\n    igl::serialize_xml(tfpIn,file);\n    igl::deserialize_xml(tfpOut,file);\n    assert(*tfpIn == *tfpOut);\n\n    igl::serialize_xml(tstrIn,file);\n    igl::deserialize_xml(tstrOut,file);\n    assert(tstrIn == tstrOut);\n\n    // updating\n    igl::serialize_xml(tbIn,\"tb\",file,false,true);\n    igl::serialize_xml(tcIn,\"tc\",file);\n    igl::serialize_xml(tiIn,\"ti\",file);\n    tiIn++;\n    igl::serialize_xml(tiIn,\"ti\",file);\n    tiIn++;\n    igl::serialize_xml(tiIn,\"ti\",file);\n    igl::deserialize_xml(tbOut,\"tb\",file);\n    igl::deserialize_xml(tcOut,\"tc\",file);\n    igl::deserialize_xml(tiOut,\"ti\",file);\n    assert(tbIn == tbOut);\n    assert(tcIn == tcOut);\n    assert(tiIn == tiOut);\n\n    igl::serialize_xml(tsIn,\"tsIn\",file,false,true);\n    igl::serialize_xml(tVector1In,\"tVector1In\",file);\n    igl::serialize_xml(tVector2In,\"tsIn\",file);\n    igl::deserialize_xml(tVector2Out,\"tsIn\",file);\n    for(unsigned int i=0;i<tVector2In.size();i++)\n    {\n      assert(tVector2In[i].first == tVector2Out[i].first);\n      assert(tVector2In[i].second == tVector2Out[i].second);\n    }\n    tVector2Out.clear();\n\n    // binarization\n    igl::serialize_xml(tVector2In,\"tVector2In\",file,true);\n    igl::deserialize_xml(tVector2Out,\"tVector2In\",file);\n    for(unsigned int i=0;i<tVector2In.size();i++)\n    {\n      assert(tVector2In[i].first == tVector2Out[i].first);\n      assert(tVector2In[i].second == tVector2Out[i].second);\n    }\n\n    igl::serialize_xml(tObjIn,file);\n    igl::deserialize_xml(tObjOut,file);\n    assert(tObjIn.tc == tObjOut.tc);\n    assert(*tObjIn.ti == *tObjOut.ti);\n    for(unsigned int i=0;i<tObjIn.tvb.size();i++)\n      assert(tObjIn.tvb[i] == tObjOut.tvb[i]);\n\n    igl::serialize_xml(tPairIn,file);\n    igl::deserialize_xml(tPairOut,file);\n    assert(tPairIn.first == tPairOut.first);\n    assert(tPairIn.second == tPairOut.second);\n\n    igl::serialize_xml(tVector1In,file);\n    igl::deserialize_xml(tVector1Out,file);\n    for(unsigned int i=0;i<tVector1In.size();i++)\n      assert(tVector1In[i] == tVector1Out[i]);\n\n    igl::serialize_xml(tVector2In,file);\n    igl::deserialize_xml(tVector2Out,file);\n    for(unsigned int i=0;i<tVector2In.size();i++)\n    {\n      assert(tVector2In[i].first == tVector2Out[i].first);\n      assert(tVector2In[i].second == tVector2Out[i].second);\n    }\n\n    igl::serialize_xml(tSetIn,file);\n    igl::deserialize_xml(tSetOut,file);\n    assert(tSetIn.size() == tSetOut.size());\n\n    igl::serialize_xml(tMapIn,file);\n    igl::deserialize_xml(tMapOut,file);\n    assert(tMapIn.size() == tMapOut.size());\n\n    igl::serialize_xml(tDenseMatrixIn,file);\n    igl::deserialize_xml(tDenseMatrixOut,file);\n    assert((tDenseMatrixIn - tDenseMatrixOut).sum() == 0);\n\n    igl::serialize_xml(tDenseRowMatrixIn,file);\n    igl::deserialize_xml(tDenseRowMatrixOut,file);\n    assert((tDenseRowMatrixIn - tDenseRowMatrixOut).sum() == 0);\n\n    igl::serialize_xml(tSparseMatrixIn,file);\n    igl::deserialize_xml(tSparseMatrixOut,file);\n    assert((tSparseMatrixIn - tSparseMatrixOut).sum() == 0);\n\n    igl::serialize_xml(testB,file);\n    igl::deserialize_xml(testC,file);\n    assert(testB.ts == testC.ts);\n    assert(testB.tvt.size() == testC.tvt.size());\n    for(unsigned int i=0;i<testB.tvt.size();i++)\n    {\n      assert(testB.tvt[i]->ts == testC.tvt[i]->ts);\n      assert(testB.tvt[i]->tvt.size() == testC.tvt[i]->tvt.size());\n      assert(testB.tvt[i]->tt == testC.tvt[i]->tt);\n    }\n    assert(testB.tt->ts == testC.tt->ts);\n    assert(testB.tt->tvt.size() == testC.tt->tvt.size());\n    assert(testB.tt->tt == testC.tt->tt);\n\n    // big data test\n    /*std::vector<std::vector<float> > bigDataIn,bigDataOut;\n    for(unsigned int i=0;i<10000;i++)\n    {\n    std::vector<float> v;\n    for(unsigned int j=0;j<10000;j++)\n    {\n    v.push_back(j);\n    }\n    bigDataIn.push_back(v);\n    }\n\n    igl::Timer timer;\n    timer.start();\n    igl::serialize_xml(bigDataIn,\"bigDataIn\",file,igl::SERIALIZE_BINARY);\n    timer.stop();\n    std::cout << \"ser: \" << timer.getElapsedTimeInMilliSec() << std::endl;\n\n    timer.start();\n    igl::deserialize_xml(bigDataOut,\"bigDataIn\",file);\n    timer.stop();\n    std::cout << \"des: \" << timer.getElapsedTimeInMilliSec() << std::endl;\n    char c;\n    std::cin >> c;*/\n\n    std::cout << \"All tests run successfully!\\n\";\n  }\n}\n\n//#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/xml/serialization_test.skip",
    "content": "//\n// Copyright (C) 2014 Christian Schüller <schuellchr@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n//#ifndef IGL_SERIALIZATION_TEST_H\n//#define IGL_SERIALIZATION_TEST_H\n\n//#include <igl/Timer.h>\n#include \"serialize_xml.h\"\n#include \"XMLSerializable.h\"\n\nnamespace igl\n{\n  namespace xml\n  {\n  \n    struct Test1111\n    {\n    };\n  \n    struct Test1 : public XMLSerializable\n    {\n      std::string ts;\n      std::vector<Test1*> tvt;\n      Test1* tt;\n  \n      Test1()\n      {\n        tt = NULL;\n      }\n  \n      void InitSerialization()\n      {\n        Add(ts,\"ts\",false);\n        Add(tvt,\"tvt\");\n        Add(tt,\"tt\");\n      }\n    };\n  \n    struct Test2: public XMLSerializableBase\n    {\n      char tc;\n      int* ti;\n      std::vector<short> tvb;\n      float tf;\n  \n      Test2()\n      {\n        tc = '1';\n        ti = NULL;\n        tf = 1.0004;\n        tvb.push_back(2);\n        tvb.push_back(3);\n      }\n  \n      void Serialize(tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element) const\n      {\n        serialize_xml(tc,\"tc\",doc,element);\n        serialize_xml(ti,\"ti\",doc,element);\n        serialize_xml(tvb,\"tvb\",doc,element);\n      }\n      void Deserialize(const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element)\n      {\n        deserialize_xml(tc,\"tc\",doc,element);\n        deserialize_xml(ti,\"ti\",doc,element);\n        deserialize_xml(tvb,\"tvb\",doc,element);\n      }\n      void Serialize(std::vector<char>& buffer) const\n      {\n        serialize(tc,\"tc\",buffer);\n        serialize(ti,\"ti\",buffer);\n        serialize(tvb,\"tvb\",buffer);\n        serialize(tf,\"tf\",buffer);\n      }\n      void Deserialize(const std::vector<char>& buffer)\n      {\n        deserialize(tc,\"tc\",buffer);\n        deserialize(ti,\"ti\",buffer);\n        deserialize(tvb,\"tvb\",buffer);\n        deserialize(tf,\"tf\",buffer);\n      }\n    };\n  \n    void serialization_test()\n    {\n      std::string file(\"test\");\n  \n      bool tbIn = true,tbOut;\n      char tcIn = 't',tcOut;\n      unsigned char tucIn = 'u',tucOut;\n      short tsIn = 6,tsOut;\n      int tiIn = -10,tiOut;\n      unsigned int tuiIn = 10,tuiOut;\n      float tfIn = 1.0005,tfOut;\n      double tdIn = 1.000000005,tdOut;\n  \n      int* tinpIn = NULL,*tinpOut = NULL;\n      float* tfpIn = new float,*tfpOut = NULL;\n      *tfpIn = 1.11101;\n  \n      std::string tstrIn(\"test12345\"),tstrOut;\n  \n      Test2 tObjIn,tObjOut;\n      int ti = 2;\n      tObjIn.ti = &ti;\n  \n  \n      Test1 test1,test2,test3;\n      test1.ts = \"100\";\n      test2.ts = \"200\";\n      test3.ts = \"300\";\n  \n      Test1 testA, testC;\n      testA.tt = &test1;\n      testA.ts = \"test123\";\n      testA.tvt.push_back(&test2);\n      testA.tvt.push_back(&test3);\n  \n      Test1 testB = testA;\n      testB.ts = \"400\";\n      testB.tvt.pop_back();\n  \n      std::pair<int,bool> tPairIn(10,true);\n      std::pair<int,bool> tPairOut;\n  \n      std::vector<int> tVector1In ={1,2,3,4,5};\n      std::vector<int> tVector1Out;\n  \n      std::pair<int,bool> p1(10,1);\n      std::pair<int,bool> p2(1,0);\n      std::pair<int,bool> p3(10000,1);\n      std::vector<std::pair<int,bool> > tVector2In ={p1,p2,p3};\n      std::vector<std::pair<int,bool> > tVector2Out;\n  \n      std::set<std::pair<int,bool> > tSetIn ={p1,p2,p3};\n      std::set<std::pair<int,bool> > tSetOut;\n  \n      std::map<int,bool> tMapIn ={p1,p2,p3};\n      std::map<int,bool> tMapOut;\n  \n      Eigen::Matrix<float,3,3> tDenseMatrixIn;\n      tDenseMatrixIn << Eigen::Matrix<float,3,3>::Random();\n      tDenseMatrixIn.coeffRef(0,0) = 1.00001;\n      Eigen::Matrix<float,3,3> tDenseMatrixOut;\n  \n      Eigen::Matrix<float,3,3,Eigen::RowMajor> tDenseRowMatrixIn;\n      tDenseRowMatrixIn << Eigen::Matrix<float,3,3,Eigen::RowMajor>::Random();\n      Eigen::Matrix<float,3,3,Eigen::RowMajor> tDenseRowMatrixOut;\n  \n      Eigen::SparseMatrix<double> tSparseMatrixIn;\n      tSparseMatrixIn.resize(3,3);\n      tSparseMatrixIn.insert(0,0) = 1.3;\n      tSparseMatrixIn.insert(1,1) = 10.2;\n      tSparseMatrixIn.insert(2,2) = 100.1;\n      tSparseMatrixIn.finalize();\n      Eigen::SparseMatrix<double> tSparseMatrixOut;\n  \n      // binary serialization\n  \n      serialize(tbIn,file);\n      deserialize(tbOut,file);\n      assert(tbIn == tbOut);\n  \n      serialize(tcIn,file);\n      deserialize(tcOut,file);\n      assert(tcIn == tcOut);\n  \n      serialize(tucIn,file);\n      deserialize(tucOut,file);\n      assert(tucIn == tucOut);\n  \n      serialize(tsIn,file);\n      deserialize(tsOut,file);\n      assert(tsIn == tsOut);\n  \n      serialize(tiIn,file);\n      deserialize(tiOut,file);\n      assert(tiIn == tiOut);\n  \n      serialize(tuiIn,file);\n      deserialize(tuiOut,file);\n      assert(tuiIn == tuiOut);\n  \n      serialize(tfIn,file);\n      deserialize(tfOut,file);\n      assert(tfIn == tfOut);\n  \n      serialize(tdIn,file);\n      deserialize(tdOut,file);\n      assert(tdIn == tdOut);\n  \n      serialize(tinpIn,file);\n      deserialize(tinpOut,file);\n      assert(tinpIn == tinpOut);\n  \n      serialize(tfpIn,file);\n      deserialize(tfpOut,file);\n      assert(*tfpIn == *tfpOut);\n      tfpOut = NULL;\n  \n      serialize(tstrIn,file);\n      deserialize(tstrOut,file);\n      assert(tstrIn == tstrOut);\n  \n      // updating\n      serialize(tbIn,\"tb\",file,true);\n      serialize(tcIn,\"tc\",file);\n      serialize(tiIn,\"ti\",file);\n      tiIn++;\n      serialize(tiIn,\"ti\",file);\n      tiIn++;\n      serialize(tiIn,\"ti\",file);\n      deserialize(tbOut,\"tb\",file);\n      deserialize(tcOut,\"tc\",file);\n      deserialize(tiOut,\"ti\",file);\n      assert(tbIn == tbOut);\n      assert(tcIn == tcOut);\n      assert(tiIn == tiOut);\n  \n      serialize(tsIn,\"tsIn\",file,true);\n      serialize(tVector1In,\"tVector1In\",file);\n      serialize(tVector2In,\"tsIn\",file);\n      deserialize(tVector2Out,\"tsIn\",file);\n      for(unsigned int i=0;i<tVector2In.size();i++)\n      {\n        assert(tVector2In[i].first == tVector2Out[i].first);\n        assert(tVector2In[i].second == tVector2Out[i].second);\n      }\n      tVector2Out.clear();\n  \n      serialize(tObjIn,file);\n      deserialize(tObjOut,file);\n      assert(tObjIn.tc == tObjOut.tc);\n      assert(*tObjIn.ti == *tObjOut.ti);\n      for(unsigned int i=0;i<tObjIn.tvb.size();i++)\n        assert(tObjIn.tvb[i] == tObjOut.tvb[i]);\n      tObjOut.ti = NULL;\n  \n      serialize(tPairIn,file);\n      deserialize(tPairOut,file);\n      assert(tPairIn.first == tPairOut.first);\n      assert(tPairIn.second == tPairOut.second);\n  \n      serialize(tVector1In,file);\n      deserialize(tVector1Out,file);\n      for(unsigned int i=0;i<tVector1In.size();i++)\n        assert(tVector1In[i] == tVector1Out[i]);\n  \n      serialize(tVector2In,file);\n      deserialize(tVector2Out,file);\n      for(unsigned int i=0;i<tVector2In.size();i++)\n      {\n        assert(tVector2In[i].first == tVector2Out[i].first);\n        assert(tVector2In[i].second == tVector2Out[i].second);\n      }\n  \n      serialize(tSetIn,file);\n      deserialize(tSetOut,file);\n      assert(tSetIn.size() == tSetOut.size());\n  \n      serialize(tMapIn,file);\n      deserialize(tMapOut,file);\n      assert(tMapIn.size() == tMapOut.size());\n  \n      serialize(tDenseMatrixIn,file);\n      deserialize(tDenseMatrixOut,file);\n      assert((tDenseMatrixIn - tDenseMatrixOut).sum() == 0);\n  \n      serialize(tDenseRowMatrixIn,file);\n      deserialize(tDenseRowMatrixOut,file);\n      assert((tDenseRowMatrixIn - tDenseRowMatrixOut).sum() == 0);\n  \n      serialize(tSparseMatrixIn,file);\n      deserialize(tSparseMatrixOut,file);\n      assert((tSparseMatrixIn - tSparseMatrixOut).sum() == 0);\n  \n      serialize(testB,file);\n      deserialize(testC,file);\n      assert(testB.ts == testC.ts);\n      assert(testB.tvt.size() == testC.tvt.size());\n      for(unsigned int i=0;i<testB.tvt.size();i++)\n      {\n        assert(testB.tvt[i]->ts == testC.tvt[i]->ts);\n        assert(testB.tvt[i]->tvt.size() == testC.tvt[i]->tvt.size());\n        assert(testB.tvt[i]->tt == testC.tvt[i]->tt);\n      }\n      assert(testB.tt->ts == testC.tt->ts);\n      assert(testB.tt->tvt.size() == testC.tt->tvt.size());\n      assert(testB.tt->tt == testC.tt->tt);\n      testC = Test1();\n  \n      // big data test\n      /*std::vector<std::vector<float> > bigDataIn,bigDataOut;\n      for(unsigned int i=0;i<10000;i++)\n      {\n      std::vector<float> v;\n      for(unsigned int j=0;j<10000;j++)\n      {\n      v.push_back(j);\n      }\n      bigDataIn.push_back(v);\n      }\n  \n      Timer timer;\n      timer.start();\n      serialize(bigDataIn,file);\n      timer.stop();\n      std::cout << \"ser: \" << timer.getElapsedTimeInMilliSec() << std::endl;\n  \n      timer.start();\n      deserialize(bigDataOut,file);\n      timer.stop();\n      std::cout << \"des: \" << timer.getElapsedTimeInMilliSec() << std::endl;\n      char c;\n      std::cin >> c; */\n  \n      // xml serialization\n  \n      serialize_xml(tbIn,file);\n      deserialize_xml(tbOut,file);\n      assert(tbIn == tbOut);\n  \n      serialize_xml(tcIn,file);\n      deserialize_xml(tcOut,file);\n      assert(tcIn == tcOut);\n  \n      serialize_xml(tucIn,file);\n      deserialize_xml(tucOut,file);\n      assert(tucIn == tucOut);\n  \n      serialize_xml(tsIn,file);\n      deserialize_xml(tsOut,file);\n      assert(tsIn == tsOut);\n  \n      serialize_xml(tiIn,file);\n      deserialize_xml(tiOut,file);\n      assert(tiIn == tiOut);\n  \n      serialize_xml(tuiIn,file);\n      deserialize_xml(tuiOut,file);\n      assert(tuiIn == tuiOut);\n  \n      serialize_xml(tfIn,file);\n      deserialize_xml(tfOut,file);\n      assert(tfIn == tfOut);\n  \n      serialize_xml(tdIn,file);\n      deserialize_xml(tdOut,file);\n      assert(tdIn == tdOut);\n  \n      serialize_xml(tinpIn,file);\n      deserialize_xml(tinpOut,file);\n      assert(tinpIn == tinpOut);\n  \n      serialize_xml(tfpIn,file);\n      deserialize_xml(tfpOut,file);\n      assert(*tfpIn == *tfpOut);\n  \n      serialize_xml(tstrIn,file);\n      deserialize_xml(tstrOut,file);\n      assert(tstrIn == tstrOut);\n  \n      // updating\n      serialize_xml(tbIn,\"tb\",file,false,true);\n      serialize_xml(tcIn,\"tc\",file);\n      serialize_xml(tiIn,\"ti\",file);\n      tiIn++;\n      serialize_xml(tiIn,\"ti\",file);\n      tiIn++;\n      serialize_xml(tiIn,\"ti\",file);\n      deserialize_xml(tbOut,\"tb\",file);\n      deserialize_xml(tcOut,\"tc\",file);\n      deserialize_xml(tiOut,\"ti\",file);\n      assert(tbIn == tbOut);\n      assert(tcIn == tcOut);\n      assert(tiIn == tiOut);\n  \n      serialize_xml(tsIn,\"tsIn\",file,false,true);\n      serialize_xml(tVector1In,\"tVector1In\",file);\n      serialize_xml(tVector2In,\"tsIn\",file);\n      deserialize_xml(tVector2Out,\"tsIn\",file);\n      for(unsigned int i=0;i<tVector2In.size();i++)\n      {\n        assert(tVector2In[i].first == tVector2Out[i].first);\n        assert(tVector2In[i].second == tVector2Out[i].second);\n      }\n      tVector2Out.clear();\n  \n      // binarization\n      serialize_xml(tVector2In,\"tVector2In\",file,true);\n      deserialize_xml(tVector2Out,\"tVector2In\",file);\n      for(unsigned int i=0;i<tVector2In.size();i++)\n      {\n        assert(tVector2In[i].first == tVector2Out[i].first);\n        assert(tVector2In[i].second == tVector2Out[i].second);\n      }\n  \n      serialize_xml(tObjIn,file);\n      deserialize_xml(tObjOut,file);\n      assert(tObjIn.tc == tObjOut.tc);\n      assert(*tObjIn.ti == *tObjOut.ti);\n      for(unsigned int i=0;i<tObjIn.tvb.size();i++)\n        assert(tObjIn.tvb[i] == tObjOut.tvb[i]);\n  \n      serialize_xml(tPairIn,file);\n      deserialize_xml(tPairOut,file);\n      assert(tPairIn.first == tPairOut.first);\n      assert(tPairIn.second == tPairOut.second);\n  \n      serialize_xml(tVector1In,file);\n      deserialize_xml(tVector1Out,file);\n      for(unsigned int i=0;i<tVector1In.size();i++)\n        assert(tVector1In[i] == tVector1Out[i]);\n  \n      serialize_xml(tVector2In,file);\n      deserialize_xml(tVector2Out,file);\n      for(unsigned int i=0;i<tVector2In.size();i++)\n      {\n        assert(tVector2In[i].first == tVector2Out[i].first);\n        assert(tVector2In[i].second == tVector2Out[i].second);\n      }\n  \n      serialize_xml(tSetIn,file);\n      deserialize_xml(tSetOut,file);\n      assert(tSetIn.size() == tSetOut.size());\n  \n      serialize_xml(tMapIn,file);\n      deserialize_xml(tMapOut,file);\n      assert(tMapIn.size() == tMapOut.size());\n  \n      serialize_xml(tDenseMatrixIn,file);\n      deserialize_xml(tDenseMatrixOut,file);\n      assert((tDenseMatrixIn - tDenseMatrixOut).sum() == 0);\n  \n      serialize_xml(tDenseRowMatrixIn,file);\n      deserialize_xml(tDenseRowMatrixOut,file);\n      assert((tDenseRowMatrixIn - tDenseRowMatrixOut).sum() == 0);\n  \n      serialize_xml(tSparseMatrixIn,file);\n      deserialize_xml(tSparseMatrixOut,file);\n      assert((tSparseMatrixIn - tSparseMatrixOut).sum() == 0);\n  \n      serialize_xml(testB,file);\n      deserialize_xml(testC,file);\n      assert(testB.ts == testC.ts);\n      assert(testB.tvt.size() == testC.tvt.size());\n      for(unsigned int i=0;i<testB.tvt.size();i++)\n      {\n        assert(testB.tvt[i]->ts == testC.tvt[i]->ts);\n        assert(testB.tvt[i]->tvt.size() == testC.tvt[i]->tvt.size());\n        assert(testB.tvt[i]->tt == testC.tvt[i]->tt);\n      }\n      assert(testB.tt->ts == testC.tt->ts);\n      assert(testB.tt->tvt.size() == testC.tt->tvt.size());\n      assert(testB.tt->tt == testC.tt->tt);\n  \n      // big data test\n      /*std::vector<std::vector<float> > bigDataIn,bigDataOut;\n      for(unsigned int i=0;i<10000;i++)\n      {\n      std::vector<float> v;\n      for(unsigned int j=0;j<10000;j++)\n      {\n      v.push_back(j);\n      }\n      bigDataIn.push_back(v);\n      }\n  \n      Timer timer;\n      timer.start();\n      serialize_xml(bigDataIn,\"bigDataIn\",file,seRIALIZE_BINARY);\n      timer.stop();\n      std::cout << \"ser: \" << timer.getElapsedTimeInMilliSec() << std::endl;\n  \n      timer.start();\n      deserialize_xml(bigDataOut,\"bigDataIn\",file);\n      timer.stop();\n      std::cout << \"des: \" << timer.getElapsedTimeInMilliSec() << std::endl;\n      char c;\n      std::cin >> c;*/\n  \n      std::cout << \"All tests run successfully!\\n\";\n    }\n  }\n}\n\n//#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/xml/serialize_xml.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2014 Christian Schüller <schuellchr@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n\n#include \"serialize_xml.h\"\n#include \"../STR.h\"\n#include \"../serialize.h\"\n#include \"XMLSerializable.h\"\n\n#include <iterator>\n#include <limits>\n#include <iomanip>\n\nnamespace igl\n{\n  namespace xml\n  {\n    template <typename T>\n    IGL_INLINE void serialize_xml(\n      const T& obj,\n      const std::string& filename)\n    {\n      serialize_xml(obj,\"object\",filename,false,true);\n    }\n  \n    template <typename T>\n    IGL_INLINE void serialize_xml(\n      const T& obj,\n      const std::string& objectName,\n      const std::string& filename,\n      bool binary,\n      bool overwrite)\n    {\n      tinyxml2::XMLDocument* doc = new tinyxml2::XMLDocument();\n  \n      if(overwrite == false)\n      {\n        // Check if file exists\n        tinyxml2::XMLError error = doc->LoadFile(filename.c_str());\n        if(error != tinyxml2::XML_SUCCESS)\n        {\n          doc->Clear();\n        }\n      }\n  \n      tinyxml2::XMLElement* element = doc->FirstChildElement(\"serialization\");\n      if(element == NULL)\n      {\n        element = doc->NewElement(\"serialization\");\n        doc->InsertEndChild(element);\n      }\n  \n      serialize_xml(obj,objectName,doc,element,binary);\n  \n      // Save\n      tinyxml2::XMLError error = doc->SaveFile(filename.c_str());\n      if(error != tinyxml2::XML_SUCCESS)\n      {\n        doc->PrintError();\n      }\n  \n      delete doc;\n    }\n  \n    template <typename T>\n    IGL_INLINE void serialize_xml(\n      const T& obj,\n      const std::string& objectName,\n      tinyxml2::XMLDocument* doc,\n      tinyxml2::XMLElement* element,\n      bool binary)\n    {\n      static_assert(\n        serialization_xml::is_serializable<T>::value,\n        \"'igl::xml::serialize_xml': type is not serializable\");\n  \n      std::string name(objectName);\n      serialization_xml::encodeXMLElementName(name);\n  \n      tinyxml2::XMLElement* child = element->FirstChildElement(name.c_str());\n      \n      if(child != NULL)\n        element->DeleteChild(child);\n  \n      child = doc->NewElement(name.c_str());\n      element->InsertEndChild(child);\n  \n      if(binary)\n      {\n        std::vector<char> buffer;\n        serialize(obj,name,buffer);\n        std::string data = \n          serialization_xml::base64_encode(\n            reinterpret_cast<const unsigned char*>(\n              buffer.data()),buffer.size());\n        \n        child->SetAttribute(\"binary\",true);\n  \n        serialization_xml::serialize(data,doc,element,name);\n      }\n      else\n      {\n        serialization_xml::serialize(obj,doc,element,name);\n      }\n    }\n  \n    template <typename T>\n    IGL_INLINE void deserialize_xml(T& obj,const std::string& filename)\n    {\n      deserialize_xml(obj,\"object\",filename);\n    }\n  \n    template <typename T>\n    IGL_INLINE void deserialize_xml(T& obj,const std::string& objectName,const std::string& filename)\n    {\n      tinyxml2::XMLDocument* doc = new tinyxml2::XMLDocument();\n  \n      tinyxml2::XMLError error = doc->LoadFile(filename.c_str());\n      if(error != tinyxml2::XML_SUCCESS)\n      {\n        std::cerr << \"File not found!\" << std::endl;\n        doc->PrintError();\n        doc = NULL;\n      }\n      else\n      {\n        tinyxml2::XMLElement* element = doc->FirstChildElement(\"serialization\");\n        if(element == NULL)\n        {\n          std::cerr << \"Name of object not found! Initialized with default value.\" << std::endl;\n          obj = T();\n        }\n        else\n        {\n          deserialize_xml(obj,objectName,doc,element);\n        }\n  \n        delete doc;\n      }\n    }\n  \n    template <typename T>\n    IGL_INLINE void deserialize_xml(T& obj,const std::string& objectName,const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element)\n    {\n      static_assert(serialization::is_serializable<T>::value,\"'igl::xml::deserialize_xml': type is not deserializable\");\n  \n      std::string name(objectName);\n      serialization_xml::encodeXMLElementName(name);\n  \n      const tinyxml2::XMLElement* child = element->FirstChildElement(name.c_str());\n      if(child != NULL)\n      {\n        bool isBinary = false;\n        const tinyxml2::XMLAttribute* attr = child->FindAttribute(\"binary\");\n        if(attr != NULL)\n        {\n          std::string code;\n          serialization_xml::deserialize(code,doc,element,name);\n          std::string decoded = serialization_xml::base64_decode(code);\n  \n          std::vector<char> buffer;\n          std::copy(decoded.c_str(),decoded.c_str()+decoded.length(),std::back_inserter(buffer));\n  \n          deserialize(obj,name,buffer);\n        }\n        else\n        {\n          serialization_xml::deserialize(obj,doc,element,name);\n        }\n      }\n    }\n\n    namespace serialization_xml\n    {\n      // fundamental types\n  \n      template <typename T>\n      IGL_INLINE typename std::enable_if<std::is_fundamental<T>::value>::type serialize(const T& obj,tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element,const std::string& name)\n      {\n        tinyxml2::XMLElement* child = getElement(doc,element,name.c_str());\n        child->SetAttribute(\"val\",obj);\n      }\n  \n      template <typename T>\n      IGL_INLINE typename std::enable_if<std::is_fundamental<T>::value>::type deserialize(T& obj,const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element,const std::string& name)\n      {\n        const tinyxml2::XMLElement* child = element->FirstChildElement(name.c_str());\n        if(child != NULL)\n        {\n          getAttribute(child->Attribute(\"val\"),obj);\n        }\n        else\n        {\n          obj = T();\n        }\n      }\n  \n      // std::string\n  \n      IGL_INLINE void serialize(const std::string& obj,tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element,const std::string& name)\n      {\n        tinyxml2::XMLElement* child = getElement(doc,element,name.c_str());\n        child->SetAttribute(\"val\",obj.c_str());\n      }\n  \n      IGL_INLINE void deserialize(std::string& obj,const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element,const std::string& name)\n      {\n        const tinyxml2::XMLElement* child = element->FirstChildElement(name.c_str());\n        if(child != NULL)\n        {\n          getAttribute(child->Attribute(\"val\"),obj);\n        }\n        else\n        {\n          obj = std::string(\"\");\n        }\n      }\n  \n      // Serializable\n  \n      template <typename T>\n      IGL_INLINE typename std::enable_if<std::is_base_of<XMLSerializableBase,T>::value>::type serialize(const T& obj,tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element,const std::string& name)\n      {\n        // Serialize object implementing Serializable interface\n        const XMLSerializableBase& object = dynamic_cast<const XMLSerializableBase&>(obj);\n  \n        tinyxml2::XMLElement* child = getElement(doc,element,name.c_str());\n        object.Serialize(doc,child);\n      }\n  \n      template <typename T>\n      IGL_INLINE typename std::enable_if<std::is_base_of<XMLSerializableBase,T>::value>::type deserialize(T& obj,const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element,const std::string& name)\n      {\n        const tinyxml2::XMLElement* child = element->FirstChildElement(name.c_str());\n  \n        if(child != NULL)\n        {\n          obj.Deserialize(doc,child);\n        }\n        else\n        {\n          obj = T();\n        }\n      }\n  \n      // STL containers\n  \n      template <typename T1,typename T2>\n      IGL_INLINE void serialize(const std::pair<T1,T2>& obj,tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element,const std::string& name)\n      {\n        tinyxml2::XMLElement* pair = getElement(doc,element,name.c_str());\n        serialize(obj.first,doc,pair,\"first\");\n        serialize(obj.second,doc,pair,\"second\");\n      }\n  \n      template <typename T1,typename T2>\n      IGL_INLINE void deserialize(std::pair<T1,T2>& obj,const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element,const std::string& name)\n      {\n        const tinyxml2::XMLElement* child = element->FirstChildElement(name.c_str());\n        if(child != NULL)\n        {\n          deserialize(obj.first,doc,child,\"first\");\n          deserialize(obj.second,doc,child,\"second\");\n        }\n        else\n        {\n          obj.first = T1();\n          obj.second = T2();\n        }\n      }\n  \n      template <typename T1,typename T2>\n      IGL_INLINE void serialize(const std::vector<T1,T2>& obj,tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element,const std::string& name)\n      {\n        tinyxml2::XMLElement* vector = getElement(doc,element,name.c_str());\n        vector->SetAttribute(\"size\",(unsigned int)obj.size());\n  \n        std::stringstream num;\n        for(unsigned int i=0;i<obj.size();i++)\n        {\n          num.str(\"\");\n          num << \"value\" << i;\n          serialize(obj[i],doc,vector,num.str());\n        }\n      }\n  \n      template <typename T1,typename T2>\n      IGL_INLINE void deserialize(std::vector<T1,T2>& obj,const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element,const std::string& name)\n      {\n        obj.clear();\n  \n        const tinyxml2::XMLElement* child = element->FirstChildElement(name.c_str());\n        if(child != NULL)\n        {\n          unsigned int size = child->UnsignedAttribute(\"size\");\n          obj.resize(size);\n  \n          std::stringstream num;\n          for(unsigned int i=0;i<size;i++)\n          {\n            num.str(\"\");\n            num << \"value\" << i;\n  \n            deserialize(obj[i],doc,child,num.str());\n          }\n        }\n        else\n        {\n          obj.clear();\n        }\n      }\n  \n      template <typename T>\n      IGL_INLINE void serialize(const std::set<T>& obj,tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element,const std::string& name)\n      {\n        tinyxml2::XMLElement* set = getElement(doc,element,name.c_str());\n        set->SetAttribute(\"size\",(unsigned int)obj.size());\n  \n        std::stringstream num;\n        typename std::set<T>::iterator iter = obj.begin();\n        for(int i=0;iter!=obj.end();iter++,i++)\n        {\n          num.str(\"\");\n          num << \"value\" << i;\n          serialize((T)*iter,doc,set,num.str());\n        }\n      }\n  \n      template <typename T>\n      IGL_INLINE void deserialize(std::set<T>& obj,const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element,const std::string& name)\n      {\n        obj.clear();\n  \n        const tinyxml2::XMLElement* child = element->FirstChildElement(name.c_str());\n        if(child != NULL)\n        {\n          unsigned int size = child->UnsignedAttribute(\"size\");\n  \n          std::stringstream num;\n          typename std::set<T>::iterator iter = obj.begin();\n          for(int i=0;i<size;i++)\n          {\n            num.str(\"\");\n            num << \"value\" << i;\n  \n            T val;\n            deserialize(val,doc,child,num.str());\n            obj.insert(val);\n          }\n        }\n        else\n        {\n          obj.clear();\n        }\n      }\n  \n      template <typename T1,typename T2>\n      IGL_INLINE void serialize(const std::map<T1,T2>& obj,tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element,const std::string& name)\n      {\n        tinyxml2::XMLElement* map = getElement(doc,element,name.c_str());\n        map->SetAttribute(\"size\",(unsigned int)obj.size());\n  \n        std::stringstream num;\n        typename std::map<T1,T2>::const_iterator iter = obj.cbegin();\n        for(int i=0;iter!=obj.end();iter++,i++)\n        {\n          num.str(\"\");\n          num << \"value\" << i;\n          serialize((std::pair<T1,T2>)*iter,doc,map,num.str());\n        }\n      }\n  \n      template <typename T1,typename T2>\n      IGL_INLINE void deserialize(std::map<T1,T2>& obj,const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element,const std::string& name)\n      {\n        obj.clear();\n  \n        const tinyxml2::XMLElement* child = element->FirstChildElement(name.c_str());\n        if(child != NULL)\n        {\n          unsigned int size = child->UnsignedAttribute(\"size\");\n  \n          std::stringstream num;\n          typename std::map<T1,T2>::iterator iter = obj.begin();\n          for(int i=0;i<size;i++)\n          {\n            num.str(\"\");\n            num << \"value\" << i;\n  \n            std::pair<T1,T2> pair;\n            deserialize(pair,doc,child,num.str());\n            obj.insert(pair);\n          }\n        }\n        else\n        {\n          obj.clear();\n        }\n      }\n\n      template<typename T,int R,int C,int P,int MR,int MC>\n      IGL_INLINE void serialize(\n        const Eigen::Matrix<T,R,C,P,MR,MC>& obj,\n        const std::string& name,\n        const std::function<std::string(const T &) >& to_string,\n        tinyxml2::XMLDocument* doc,\n        tinyxml2::XMLElement* element)\n      {\n        tinyxml2::XMLElement* matrix = getElement(doc,element,name.c_str());\n  \n        const unsigned int rows = obj.rows();\n        const unsigned int cols = obj.cols();\n  \n        matrix->SetAttribute(\"rows\",rows);\n        matrix->SetAttribute(\"cols\",cols);\n  \n        std::stringstream ms;\n        ms << \"\\n\";\n        for(unsigned int r=0;r<rows;r++)\n        {\n          for(unsigned int c=0;c<cols;c++)\n          {\n            ms << to_string(obj(r,c)) << \",\";\n          }\n          ms << \"\\n\";\n        }\n  \n        std::string mString = ms.str();\n        if(mString.size() > 1)\n          mString[mString.size()-2] = '\\0';\n  \n        matrix->SetAttribute(\"matrix\",mString.c_str());\n      }\n  \n      // Eigen types\n      template<typename T,int R,int C,int P,int MR,int MC>\n      IGL_INLINE void serialize(\n        const Eigen::Matrix<T,R,C,P,MR,MC>& obj,\n        tinyxml2::XMLDocument* doc,\n        tinyxml2::XMLElement* element,\n        const std::string& name)\n      {\n        const std::function<std::string(const T &) > to_string = \n          [](const T & v)->std::string\n          {\n            return\n              STR(std::setprecision(std::numeric_limits<double>::digits10+2)<<v);\n          };\n        serialize(obj,name,to_string,doc,element);\n      }\n      template<typename T,int R,int C,int P,int MR,int MC>\n      IGL_INLINE void deserialize(\n        const tinyxml2::XMLDocument* doc,\n        const tinyxml2::XMLElement* element,\n        const std::string& name,\n        const std::function<void(const std::string &,T &)> & from_string,\n        Eigen::Matrix<T,R,C,P,MR,MC>& obj)\n      {\n        const tinyxml2::XMLElement* child = element->FirstChildElement(name.c_str());\n        bool initialized = false;\n        if(child != NULL)\n        {\n          const unsigned int rows = child->UnsignedAttribute(\"rows\");\n          const unsigned int cols = child->UnsignedAttribute(\"cols\");\n  \n          if(rows > 0 && cols > 0)\n          {\n            obj.resize(rows,cols);\n  \n            const tinyxml2::XMLAttribute* attribute = child->FindAttribute(\"matrix\");\n            if(attribute != NULL)\n            {\n              std::string matTemp;\n              getAttribute(attribute->Value(),matTemp);\n  \n              std::string line,srows,scols;\n              std::stringstream mats;\n              mats << matTemp;\n  \n              int r=0;\n              std::string val;\n              // for each line\n              getline(mats,line);\n              while(getline(mats,line))\n              {\n                // get current line\n                std::stringstream liness(line);\n  \n                for(unsigned int c=0;c<cols-1;c++)\n                {\n                  // split line\n                  getline(liness,val,',');\n  \n                  // push pack the data if any\n                  if(!val.empty())\n                  {\n                    from_string(val,obj.coeffRef(r,c));\n                  }\n                }\n  \n                getline(liness,val);\n                from_string(val,obj.coeffRef(r,cols-1));\n  \n                r++;\n              }\n              initialized = true;\n            }\n          }\n        }\n  \n        if(!initialized)\n        {\n          obj = Eigen::Matrix<T,R,C,P,MR,MC>();\n        }\n      }\n  \n      template<typename T,int R,int C,int P,int MR,int MC>\n      IGL_INLINE void deserialize(\n        Eigen::Matrix<T,R,C,P,MR,MC>& obj,\n        const tinyxml2::XMLDocument* doc,\n        const tinyxml2::XMLElement* element,\n        const std::string& name)\n      {\n        const std::function<void(const std::string &,T &)> & from_string = \n          [](const std::string & s,T & v)\n          {\n            getAttribute(s.c_str(),v);\n          };\n        deserialize(doc,element,name,from_string,obj);\n      }\n  \n      template<typename T,int P,typename I>\n      IGL_INLINE void serialize(const Eigen::SparseMatrix<T,P,I>& obj,tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element,const std::string& name)\n      {\n        tinyxml2::XMLElement* matrix = getElement(doc,element,name.c_str());\n  \n        const unsigned int rows = obj.rows();\n        const unsigned int cols = obj.cols();\n  \n        matrix->SetAttribute(\"rows\",rows);\n        matrix->SetAttribute(\"cols\",cols);\n  \n        char buffer[200];\n        std::stringstream ms;\n        ms << \"\\n\";\n        for(int k=0;k<obj.outerSize();++k)\n        {\n          for(typename Eigen::SparseMatrix<T,P,I>::InnerIterator it(obj,k);it;++it)\n          {\n            tinyxml2::XMLUtil::ToStr(it.value(),buffer,200);\n            ms << it.row() << \",\" << it.col() << \",\" << buffer << \"\\n\";\n          }\n        }\n  \n        std::string mString = ms.str();\n        if(mString.size() > 0)\n          mString[mString.size()-1] = '\\0';\n  \n        matrix->SetAttribute(\"matrix\",mString.c_str());\n      }\n  \n      template<typename T,int P,typename I>\n      IGL_INLINE void deserialize(Eigen::SparseMatrix<T,P,I>& obj,const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element,const std::string& name)\n      {\n        const tinyxml2::XMLElement* child = element->FirstChildElement(name.c_str());\n        bool initialized = false;\n        if(child != NULL)\n        {\n          const unsigned int rows = child->UnsignedAttribute(\"rows\");\n          const unsigned int cols = child->UnsignedAttribute(\"cols\");\n  \n          if(rows > 0 && cols > 0)\n          {\n            obj.resize(rows,cols);\n            obj.setZero();\n  \n            const tinyxml2::XMLAttribute* attribute = child->FindAttribute(\"matrix\");\n            if(attribute != NULL)\n            {\n              std::string matTemp;\n              getAttribute(attribute->Value(),matTemp);\n  \n              std::string line,srows,scols;\n              std::stringstream mats;\n              mats << matTemp;\n  \n              std::vector<Eigen::Triplet<T,I> > triplets;\n              int r=0;\n              std::string val;\n  \n              // for each line\n              getline(mats,line);\n              while(getline(mats,line))\n              {\n                // get current line\n                std::stringstream liness(line);\n  \n                // row\n                getline(liness,val,',');\n                int row = atoi(val.c_str());\n                // col\n                getline(liness,val,',');\n                int col = atoi(val.c_str());\n                // val\n                getline(liness,val);\n                T value;\n                getAttribute(val.c_str(),value);\n  \n                triplets.push_back(Eigen::Triplet<T,I>(row,col,value));\n  \n                r++;\n              }\n  \n              obj.setFromTriplets(triplets.begin(),triplets.end());\n              initialized = true;\n            }\n          }\n        }\n  \n        if(!initialized)\n        {\n          obj = Eigen::SparseMatrix<T,P,I>();\n        }\n      }\n  \n      // pointers\n  \n      template <typename T>\n      IGL_INLINE typename std::enable_if<std::is_pointer<T>::value>::type serialize(const T& obj,tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element,const std::string& name)\n      {\n        tinyxml2::XMLElement* pointer = getElement(doc,element,name.c_str());\n  \n        bool isNullPtr = (obj == NULL);\n  \n        pointer->SetAttribute(\"isNullPtr\",isNullPtr);\n  \n        if(isNullPtr == false)\n          serialization_xml::serialize(*obj,doc,element,name);\n      }\n  \n      template <typename T>\n      IGL_INLINE typename std::enable_if<std::is_pointer<T>::value>::type deserialize(T& obj,const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element,const std::string& name)\n      {\n        const tinyxml2::XMLElement* child = element->FirstChildElement(name.c_str());\n        if(child != NULL)\n        {\n          bool isNullPtr = child->BoolAttribute(\"isNullPtr\");\n  \n          if(isNullPtr)\n          {\n            if(obj != NULL)\n            {\n              std::cout << \"deserialization: possible memory leak for '\" << typeid(obj).name() << \"'\" << std::endl;\n              obj = NULL;\n            }\n          }\n          else\n          {\n            if(obj != NULL)\n              std::cout << \"deserialization: possible memory leak for '\" << typeid(obj).name() << \"'\" << std::endl;\n  \n            obj = new typename std::remove_pointer<T>::type();\n  \n            serialization_xml::deserialize(*obj,doc,element,name);\n          }\n        }\n      }\n  \n      // helper functions\n  \n      IGL_INLINE tinyxml2::XMLElement* getElement(tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element,const std::string& name)\n      {\n        tinyxml2::XMLElement* child = element->FirstChildElement(name.c_str());\n        if(child == NULL)\n        {\n          child = doc->NewElement(name.c_str());\n          element->InsertEndChild(child);\n        }\n        return child;\n      }\n  \n      IGL_INLINE void getAttribute(const char* src,bool& dest)\n      {\n        tinyxml2::XMLUtil::ToBool(src,&dest);\n      }\n  \n      IGL_INLINE void getAttribute(const char* src,char& dest)\n      {\n        dest = (char)atoi(src);\n      }\n  \n      IGL_INLINE void getAttribute(const char* src,std::string& dest)\n      {\n        dest = src;\n      }\n  \n      IGL_INLINE void getAttribute(const char* src,float& dest)\n      {\n        tinyxml2::XMLUtil::ToFloat(src,&dest);\n      }\n  \n      IGL_INLINE void getAttribute(const char* src,double& dest)\n      {\n        tinyxml2::XMLUtil::ToDouble(src,&dest);\n      }\n  \n      template<typename T>\n      IGL_INLINE typename std::enable_if<std::is_integral<T>::value && std::is_unsigned<T>::value>::type getAttribute(const char* src,T& dest)\n      {\n        unsigned int val;\n        tinyxml2::XMLUtil::ToUnsigned(src,&val);\n        dest = (T)val;\n      }\n  \n      template<typename T>\n      IGL_INLINE typename std::enable_if<std::is_integral<T>::value && !std::is_unsigned<T>::value>::type getAttribute(const char* src,T& dest)\n      {\n        int val;\n        tinyxml2::XMLUtil::ToInt(src,&val);\n        dest = (T)val;\n      }\n  \n      // tinyXML2 related stuff\n      static const int numForbiddenChars = 8;\n      static const char forbiddenChars[] ={' ','/','~','#','&','>','<','='};\n  \n      IGL_INLINE void replaceSubString(std::string& str,const std::string& search,const std::string& replace)\n      {\n        size_t pos = 0;\n        while((pos = str.find(search,pos)) != std::string::npos)\n        {\n          str.replace(pos,search.length(),replace);\n          pos += replace.length();\n        }\n      }\n  \n      IGL_INLINE void encodeXMLElementName(std::string& name)\n      {\n        // must not start with a digit\n        if(isdigit(*name.begin()))\n        {\n          name = \":::\" + name;\n        }\n  \n        std::stringstream stream;\n        for(int i=0;i<numForbiddenChars;i++)\n        {\n          std::string search;\n          search = forbiddenChars[i];\n          std::stringstream replaces;\n          replaces << \":\" << (int)forbiddenChars[i];\n          std::string replace = replaces.str();\n  \n          replaceSubString(name,search,replace);\n        }\n      }\n  \n      IGL_INLINE void decodeXMLElementName(std::string& name)\n      {\n        if(name.find(\"::\",0) == 0)\n          name.replace(0,3,\"\");\n  \n        for(auto chr : forbiddenChars)\n        {\n          std::stringstream searchs;\n          searchs << \":\" << (int)chr;\n          std::string search = searchs.str();\n          std::string replace;\n          replace = chr;\n  \n          replaceSubString(name,search,replace);\n        }\n      }\n  \n     /* Copyright(C) 2004-2008 Ren� Nyffenegger\n  \n        This source code is provided 'as-is',without any express or implied\n        warranty.In no event will the author be held liable for any damages\n        arising from the use of this software.\n  \n        Permission is granted to anyone to use this software for any purpose,\n        including commercial applications,and to alter it and redistribute it\n        freely,subject to the following restrictions:\n  \n        1. The origin of this source code must not be misrepresented; you must not\n        claim that you wrote the original source code.If you use this source code\n        in a product,an acknowledgment in the product documentation would be\n        appreciated but is not required.\n  \n        2. Altered source versions must be plainly marked as such,and must not be\n        misrepresented as being the original source code.\n  \n        3. This notice may not be removed or altered from any source distribution.\n  \n        Ren� Nyffenegger rene.nyffenegger@adp-gmbh.ch\n        */\n  \n      static const std::string base64_chars =\n        \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n        \"abcdefghijklmnopqrstuvwxyz\"\n        \"0123456789+/\";\n  \n      static inline bool is_base64(unsigned char c) {\n        return (isalnum(c) || (c == '+') || (c == '/'));\n      }\n  \n      std::string base64_encode(unsigned char const* bytes_to_encode,unsigned int in_len)\n      {\n        std::string ret;\n        int i = 0;\n        int j = 0;\n        unsigned char char_array_3[3];\n        unsigned char char_array_4[4];\n  \n        while(in_len--) {\n          char_array_3[i++] = *(bytes_to_encode++);\n          if(i == 3) {\n            char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;\n            char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);\n            char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);\n            char_array_4[3] = char_array_3[2] & 0x3f;\n  \n            for(i = 0; (i <4) ; i++)\n              ret += base64_chars[char_array_4[i]];\n  \n            i = 0;\n          }\n        }\n  \n        if(i)\n        {\n          for(j = i; j < 3; j++)\n            char_array_3[j] = '\\0';\n  \n          char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;\n          char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);\n          char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);\n          char_array_4[3] = char_array_3[2] & 0x3f;\n  \n          for(j = 0; (j < i + 1); j++)\n            ret += base64_chars[char_array_4[j]];\n  \n          while((i++ < 3))\n            ret += '=';\n        }\n  \n        return ret;\n      }\n  \n      std::string base64_decode(std::string const& encoded_string)\n      {\n        int in_len = encoded_string.size();\n        int i = 0;\n        int j = 0;\n        int in_ = 0;\n        unsigned char char_array_4[4],char_array_3[3];\n        std::string ret;\n  \n        // construct fast lookup table\n        // added by Christian Sch�ller (schuellc@inf.ethz.ch)\n        int charLookup[200];\n        for(int i=0;i<(int)(base64_chars.length());i++)\n          charLookup[(int)base64_chars[i]] = i;\n  \n        while(in_len-- && (encoded_string[in_] != '=') && is_base64(encoded_string[in_])) {\n          char_array_4[i++] = encoded_string[in_]; in_++;\n          if(i ==4) {\n            for(i = 0; i <4; i++)\n              char_array_4[i] = charLookup[char_array_4[i]]; // new fast lookup\n            //char_array_4[i] = base64_chars.find(char_array_4[i]); // original version\n  \n            char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);\n            char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);\n            char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];\n  \n            for(i = 0; (i < 3); i++)\n              ret += char_array_3[i];\n  \n            i = 0;\n          }\n        }\n  \n        if(i) {\n          for(j = i; j <4; j++)\n            char_array_4[j] = 0;\n  \n          for(j = 0; j <4; j++)\n            char_array_4[j] = base64_chars.find(char_array_4[j]);\n  \n          char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);\n          char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);\n          char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];\n  \n          for(j = 0; (j < i - 1);\n            j++) ret += char_array_3[j];\n        }\n  \n        return ret;\n      }\n    }\n  }\n}\n\n#ifdef IGL_STATIC_LIBRARY\n// Explicit template instantiation\ntemplate void igl::xml::serialize_xml<std::vector<float, std::allocator<float> > >(std::vector<float, std::allocator<float> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool, bool);\ntemplate void igl::xml::deserialize_xml<std::vector<float, std::allocator<float> > >(std::vector<float, std::allocator<float> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&);\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/xml/serialize_xml.h",
    "content": "//\n// Copyright (C) 2014 Christian Sch�ller <schuellchr@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_XML_SERIALIZABLE_XML_H\n#define IGL_XML_SERIALIZABLE_XML_H\n// -----------------------------------------------------------------------------\n// Functions to save and load a serialization of fundamental c++ data types to\n// and from a xml file. STL containers, Eigen matrix types and nested data\n// structures are also supported. To serialize a user defined class implement\n// the interface XMLSerializable or XMLSerializableBase.\n//\n// See also: serialize.h\n// -----------------------------------------------------------------------------\n\n#include \"../igl_inline.h\"\n\n\n#include <Eigen/Dense>\n#include <Eigen/Sparse>\n#include <tinyxml2.h>\n\n#include <type_traits>\n#include <functional>\n#include <iostream>\n#include <vector>\n#include <set>\n#include <map>\n#include <memory>\n\n//#define SERIALIZE_XML(x) igl::xml::serialize_xml(x,#x,doc,element);\n//#define DESERIALIZE_XML(x) igl::xml::deserialize_xml(x,#x,,doc,element);\n\nnamespace igl\n{\n  namespace xml\n  {\n    struct XMLSerializableBase;\n    // serializes the given object either to a xml file or to the provided doc data\n    //\n    // Templates:\n    //   T  type of the object to serialize\n    // Inputs:\n    //   obj        object to serialize\n    //   objectName unique object name,used for the identification\n    //   filename   name of the file containing the serialization\n    //   binary     set to true to serialize the object in binary format (faster for big data)\n    //   overwrite  set to true to overwrite an existing xml file\n    //   element    tinyxml2 virtual representation of the current xml node\n    // Outputs:\n    //   doc        contains current tinyxml2 virtual representation of the xml data\n    //\n    template <typename T>\n    IGL_INLINE void serialize_xml(const T& obj,const std::string& filename);\n    template <typename T>\n    IGL_INLINE void serialize_xml(\n      const T& obj,\n      const std::string& objectName,\n      const std::string& filename, \n      bool binary = false,\n      bool overwrite = false);\n    template <typename T>\n    IGL_INLINE void serialize_xml(\n      const T& obj,\n      const std::string& objectName,\n      tinyxml2::XMLDocument* doc,\n      tinyxml2::XMLElement* element,\n      bool binary = false);\n  \n    // deserializes the given data from a xml file or doc data back to the provided object\n    //\n    // Templates:\n    //   T  type of the object to serialize\n    // Inputs:\n    //\n    //   objectName unique object name,used for the identification\n    //   filename   name of the file containing the serialization\n    //   binary     set to true to serialize the object in binary format (faster for big data)\n    //   overwrite  set to true to overwrite an existing xml file\n    //   doc        contains current tinyxml2 virtual representation of the xml data\n    //   element    tinyxml2 virtual representation of the current xml node\n    // Outputs:\n    //   obj        object to load back serialization to\n    //\n    template <typename T>\n    IGL_INLINE void deserialize_xml(T& obj,const std::string& filename);\n    template <typename T>\n    IGL_INLINE void deserialize_xml(T& obj,const std::string& objectName,const std::string& filename);\n    template <typename T>\n    IGL_INLINE void deserialize_xml(T& obj,const std::string& objectName,const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element);\n  \n    // internal functions\n    namespace serialization_xml\n    {\n      // fundamental types\n      template <typename T>\n      IGL_INLINE typename std::enable_if<std::is_fundamental<T>::value>::type serialize(const T& obj,tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element,const std::string& name);\n      template <typename T>\n      IGL_INLINE typename std::enable_if<std::is_fundamental<T>::value>::type deserialize(T& obj,const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element,const std::string& name);\n  \n      // std::string\n      IGL_INLINE void serialize(const std::string& obj,tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element,const std::string& name);\n      IGL_INLINE void deserialize(std::string& obj,const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element,const std::string& name);\n  \n      // XMLSerializableBase\n      template <typename T>\n      IGL_INLINE typename std::enable_if<std::is_base_of<XMLSerializableBase,T>::value>::type serialize(const T& obj,tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element,const std::string& name);\n      template <typename T>\n      IGL_INLINE typename std::enable_if<std::is_base_of<XMLSerializableBase,T>::value>::type deserialize(T& obj,const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element,const std::string& name);\n  \n      // STL containers\n      template <typename T1, typename T2>\n      IGL_INLINE void serialize(const std::pair<T1,T2>& obj,tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element,const std::string& name);\n      template <typename T1,typename T2>\n      IGL_INLINE void deserialize(std::pair<T1,T2>& obj,const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element,const std::string& name);\n  \n      template <typename T1,typename T2>\n      IGL_INLINE void serialize(const std::vector<T1,T2>& obj,tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element,const std::string& name);\n      template <typename T1,typename T2>\n      IGL_INLINE void deserialize(std::vector<T1,T2>& obj,const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element,const std::string& name);\n  \n      template <typename T>\n      IGL_INLINE void serialize(const std::set<T>& obj,tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element,const std::string& name);\n      template <typename T>\n      IGL_INLINE void deserialize(std::set<T>& obj,const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element,const std::string& name);\n  \n      template <typename T1,typename T2>\n      IGL_INLINE void serialize(const std::map<T1,T2>& obj,tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element,const std::string& name);\n      template <typename T1,typename T2>\n      IGL_INLINE void deserialize(std::map<T1,T2>& obj,const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element,const std::string& name);\n  \n      // Eigen types\n\n      // Serialize a Dense Eigen Matrix to xml (in the matrix= attribute,\n      // awkward...)\n      //\n      // Inputs:\n      //   obj  MR by MC matrix of T types\n      //   name  name of matrix\n      //   to_string  function converting T to string\n      // Outputs:\n      //   doc  pointer to xml document\n      //   element  pointer to xml element\n      //   \n      template<typename T,int R,int C,int P,int MR,int MC>\n      IGL_INLINE void serialize(\n        const Eigen::Matrix<T,R,C,P,MR,MC>& obj,\n        const std::string& name,\n        const std::function<std::string(const T &) >& to_string,\n        tinyxml2::XMLDocument* doc,\n        tinyxml2::XMLElement* element);\n      // De-Serialize a Dense Eigen Matrix from xml (in the matrix= attribute,\n      // awkward...)\n      //\n      // Inputs:\n      //   doc  pointer to xml document\n      //   element  pointer to xml element\n      //   name  name of matrix\n      //   from_string  function string to T\n      // Outputs:\n      //   obj  MR by MC matrix of T types\n      template<typename T,int R,int C,int P,int MR,int MC>\n      IGL_INLINE void deserialize(\n        const tinyxml2::XMLDocument* doc,\n        const tinyxml2::XMLElement* element,\n        const std::string& name,\n        const std::function<void(const std::string &,T &)> & from_string,\n        Eigen::Matrix<T,R,C,P,MR,MC>& obj);\n  \n      // Legacy APIs\n      template<typename T,int R,int C,int P,int MR,int MC>\n      IGL_INLINE void serialize(\n        const Eigen::Matrix<T,R,C,P,MR,MC>& obj,\n        tinyxml2::XMLDocument* doc,\n        tinyxml2::XMLElement* element,\n        const std::string& name);\n      template<typename T,int R,int C,int P,int MR,int MC>\n      IGL_INLINE void deserialize(\n        Eigen::Matrix<T,R,C,P,MR,MC>& obj,\n        const tinyxml2::XMLDocument* doc,\n        const tinyxml2::XMLElement* element,\n        const std::string& name);\n  \n      template<typename T,int P,typename I>\n      IGL_INLINE void serialize(const Eigen::SparseMatrix<T,P,I>& obj,tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element,const std::string& name);\n      template<typename T,int P,typename I>\n      IGL_INLINE void deserialize(Eigen::SparseMatrix<T,P,I>& obj,const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element,const std::string& name);\n  \n      // raw pointers\n      template <typename T>\n      IGL_INLINE typename std::enable_if<std::is_pointer<T>::value>::type serialize(const T& obj,tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element,const std::string& name);\n      template <typename T>\n      IGL_INLINE typename std::enable_if<std::is_pointer<T>::value>::type deserialize(T& obj,const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element,const std::string& name);\n  \n      // helper functions\n      tinyxml2::XMLElement* getElement(tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element,const std::string& name);\n      IGL_INLINE void getAttribute(const char* src,bool& dest);\n      IGL_INLINE void getAttribute(const char* scr,char& dest);\n      IGL_INLINE void getAttribute(const char* src,std::string& dest);\n      IGL_INLINE void getAttribute(const char* src,float& dest);\n      IGL_INLINE void getAttribute(const char* src,double& dest);\n      template<typename T>\n      IGL_INLINE typename std::enable_if<std::is_integral<T>::value && std::is_unsigned<T>::value>::type getAttribute(const char* src,T& dest);\n      template<typename T>\n      IGL_INLINE typename std::enable_if<std::is_integral<T>::value && !std::is_unsigned<T>::value>::type getAttribute(const char* src,T& dest);\n      IGL_INLINE void replaceSubString(std::string& str,const std::string& search,const std::string& replace);\n      IGL_INLINE void encodeXMLElementName(std::string& name);\n      IGL_INLINE void decodeXMLElementName(std::string& name);\n      IGL_INLINE std::string base64_encode(unsigned char const* bytes_to_encode,unsigned int in_len);\n      IGL_INLINE std::string base64_decode(std::string const& encoded_string);\n  \n      // compile time type serializable check\n      template <typename T>\n      struct is_stl_container { static const bool value = false; };\n      template <typename T1,typename T2>\n      struct is_stl_container<std::pair<T1,T2> > { static const bool value = true; };\n      template <typename T1,typename T2>\n      struct is_stl_container<std::vector<T1,T2> > { static const bool value = true; };\n      template <typename T>\n      struct is_stl_container<std::set<T> > { static const bool value = true; };\n      template <typename T1,typename T2>\n      struct is_stl_container<std::map<T1,T2> > { static const bool value = true; };\n  \n      template <typename T>\n      struct is_eigen_type { static const bool value = false; };\n      template <typename T,int R,int C,int P,int MR,int MC>\n      struct is_eigen_type<Eigen::Matrix<T,R,C,P,MR,MC> > { static const bool value = true; };\n      template <typename T,int P,typename I>\n      struct is_eigen_type<Eigen::SparseMatrix<T,P,I> > { static const bool value = true; };\n  \n      template <typename T>\n      struct is_serializable {\n        using T0 = typename  std::remove_pointer<T>::type;\n        static const bool value = std::is_fundamental<T0>::value || std::is_same<std::string,T0>::value || std::is_base_of<XMLSerializableBase,T0>::value\n          || is_stl_container<T0>::value || is_eigen_type<T0>::value;\n      };\n    }\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n  #include \"serialize_xml.cpp\"\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/xml/writeDAE.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"writeDAE.h\"\n#include \"../STR.h\"\n#include <tinyxml2.h>\n#include <map>\n#include <list>\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE bool igl::xml::writeDAE(\n  const std::string & filename,\n  const Eigen::PlainObjectBase<DerivedV> & V,\n  const Eigen::PlainObjectBase<DerivedF> & F)\n{\n  using namespace std;\n  using namespace Eigen;\n  using namespace tinyxml2;\n\n  XMLDocument* doc = new XMLDocument();\n\n  const auto & ele = [&doc](\n    const std::string tag,\n    // Can't just use `{}` as the default arguement because of a clang-bug \n    // http://stackoverflow.com/questions/17264067/\n    const std::map<std::string,std::string> attribs = \n      std::map<std::string,std::string>(),\n    const std::string text=\"\",\n    const std::list<XMLElement *> children = \n       std::list<XMLElement *>()\n    )->XMLElement *\n  {\n    XMLElement * element = doc->NewElement(tag.c_str());\n    for(const auto & key_value :  attribs)\n    {\n      element->SetAttribute(key_value.first.c_str(),key_value.second.c_str());\n    }\n    if(!text.empty())\n    {\n      element->InsertEndChild(doc->NewText(text.c_str()));\n    }\n    for(auto & child : children)\n    {\n      element->InsertEndChild(child);\n    }\n    return element;\n  };\n\n  Eigen::IOFormat row_format(Eigen::FullPrecision,0,\" \",\" \",\"\",\"\",\"\");\n  doc->InsertEndChild(\n    ele(\"COLLADA\",\n    {\n      {\"xmlns\",\"http://www.collada.org/2005/11/COLLADASchema\"},\n      {\"version\",\"1.4.1\"}\n    },\n    \"\",\n    {\n      ele(\"asset\",{},\"\",\n      {\n        ele(\"unit\",{{\"meter\",\"0.0254000\"},{\"name\",\"inch\"}}),\n        ele(\"up_axis\",{},\"Y_UP\")\n      }),\n      ele(\"library_visual_scenes\",{},\"\",\n      {\n        ele(\"visual_scene\",{{\"id\",\"ID2\"}},\"\",\n        {\n          ele(\"node\",{{\"name\",\"SketchUp\"}},\"\",\n          {\n            ele(\"node\",{{\"id\",\"ID3\"},{\"name\",\"group_0\"}},\"\",\n            {\n              ele(\"matrix\",{},\"1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1\"),\n              ele(\"instance_geometry\",{{\"url\",\"#ID4\"}},\"\",\n              {\n                ele(\"bind_material\",{},\"\",{ele(\"technique_common\")}),\n              }),\n            }),\n          }),\n        }),\n      }),\n      ele(\"library_geometries\",{},\"\",\n      {\n        ele(\"geometry\",{{\"id\",\"ID4\"}},\"\",\n        {\n          ele(\"mesh\",{},\"\",\n          {\n            ele(\"source\",{{\"id\",\"ID7\"}},\"\",\n            {\n              ele(\n                \"float_array\",\n                {{\"count\",STR(V.size())},{\"id\",\"ID10\"}},\n                STR(V.format(row_format))),\n              ele(\"technique_common\",{},\"\",\n              {\n                ele(\n                  \"accessor\",\n                  {{\"count\",STR(V.rows())},{\"source\",\"#ID8\"},{\"stride\",\"3\"}},\n                  \"\",\n                {\n                  ele(\"param\",{{\"name\",\"X\"},{\"type\",\"float\"}}),\n                  ele(\"param\",{{\"name\",\"Y\"},{\"type\",\"float\"}}),\n                  ele(\"param\",{{\"name\",\"Z\"},{\"type\",\"float\"}}),\n                })\n              })\n            }),\n            ele(\n              \"vertices\",\n              {{\"id\",\"ID9\"}},\n              \"\",\n              {ele(\"input\",{{\"semantic\",\"POSITION\"},{\"source\",\"#ID7\"}})}),\n            ele(\n              \"triangles\",\n              {{\"count\",STR(F.rows())}},\n              \"\",\n            {\n              ele(\"input\",{{\"semantic\",\"VERTEX\"},{\"source\",\"#ID9\"}}),\n              ele(\"p\",{},STR(F.format(row_format))),\n            })\n          })\n        })\n      }),\n      ele(\"scene\",{},\"\",{ele(\"instance_visual_scene\",{{\"url\",\"#ID2\"}})}),\n    }));\n  // tinyxml2 seems **not** to print the <?xml ...?> header by default, but it\n  // also seems that that's OK\n  XMLError error = doc->SaveFile(filename.c_str());\n  bool ret = true;\n  if(error != XML_NO_ERROR)\n  {\n    doc->PrintError();\n    ret = false;\n  }\n  delete doc;\n  return ret;\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/xml/writeDAE.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_XML_WRITEDAE_H\n#define IGL_XML_WRITEDAE_H\n#include \"../igl_inline.h\"\n#include <string>\n#include <Eigen/Core>\nnamespace igl\n{\n  namespace xml\n  {\n    // Write a mesh to a Collada .dae scene file. The resulting scene contains\n    // a single \"geometry\" suitable for solid operaions (boolean union,\n    // intersection, etc.) in SketchUp.\n    //\n    // Inputs:\n    //   filename  path to .dae file\n    //   V  #V by 3 list of vertex positions\n    //   F  #F by 3 list of face indices\n    // Returns true iff success\n    //\n    template <typename DerivedV, typename DerivedF>\n    IGL_INLINE bool writeDAE(\n      const std::string & filename,\n      const Eigen::PlainObjectBase<DerivedV> & V,\n      const Eigen::PlainObjectBase<DerivedF> & F);\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#include \"writeDAE.cpp\"\n#endif\n#endif\n"
  },
  {
    "path": "libs/libigl/include/igl/xml/write_triangle_mesh.cpp",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#include \"write_triangle_mesh.h\"\n#include \"../write_triangle_mesh.h\"\n#include \"../pathinfo.h\"\n#include \"writeDAE.h\"\n\ntemplate <typename DerivedV, typename DerivedF>\nIGL_INLINE bool igl::xml::write_triangle_mesh(\n  const std::string str,\n  const Eigen::PlainObjectBase<DerivedV>& V,\n  const Eigen::PlainObjectBase<DerivedF>& F,\n  const bool ascii)\n{\n  using namespace std;\n  // dirname, basename, extension and filename\n  string d,b,e,f;\n  pathinfo(str,d,b,e,f);\n  // Convert extension to lower case\n  std::transform(e.begin(), e.end(), e.begin(), ::tolower);\n  if(e == \"dae\")\n  {\n    return writeDAE(str,V,F);\n  }else\n  {\n    return igl::write_triangle_mesh(str,V,F,ascii);\n  }\n}\n"
  },
  {
    "path": "libs/libigl/include/igl/xml/write_triangle_mesh.h",
    "content": "// This file is part of libigl, a simple c++ geometry processing library.\n//\n// Copyright (C) 2016 Alec Jacobson <alecjacobson@gmail.com>\n//\n// This Source Code Form is subject to the terms of the Mozilla Public License\n// v. 2.0. If a copy of the MPL was not distributed with this file, You can\n// obtain one at http://mozilla.org/MPL/2.0/.\n#ifndef IGL_XML_WRITE_TRIANGLE_MESH_H\n#define IGL_XML_WRITE_TRIANGLE_MESH_H\n#include \"../igl_inline.h\"\n\n#include <Eigen/Core>\n#include <string>\n\nnamespace igl\n{\n  namespace xml\n  {\n    // write mesh to a file with automatic detection of file format.  supported:\n    // dae, or any of the formats supported by igl::write_triangle_mesh\n    // \n    // Templates:\n    //   Scalar  type for positions and vectors (will be read as double and cast\n    //     to Scalar)\n    //   Index  type for indices (will be read as int and cast to Index)\n    // Inputs:\n    //   str  path to file\n    //   V  eigen double matrix #V by 3\n    //   F  eigen int matrix #F by 3\n    // Returns true iff success\n    template <typename DerivedV, typename DerivedF>\n    IGL_INLINE bool write_triangle_mesh(\n      const std::string str,\n      const Eigen::PlainObjectBase<DerivedV>& V,\n      const Eigen::PlainObjectBase<DerivedF>& F,\n      const bool ascii = true);\n  }\n}\n\n#ifndef IGL_STATIC_LIBRARY\n#  include \"write_triangle_mesh.cpp\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/libs.pri",
    "content": "############################ CONFIGURATION ############################\n\nDEFINES += COMISO_FIELD\n\n\n############################ LIBRARY PATHS ############################\n\n#Libraries\nQUADRETOPOLOGY_PATH = $$PWD/quadretopology/\nXFIELDTRACER_PATH   = $$PWD/xfield_tracer/\nLIBIGL_PATH         = $$PWD/libigl/\nVCGLIB_PATH         = $$PWD/vcglib/\nGLEW_PATH           = $$PWD/glew/\nCOMISO_PATH         = $$PWD/CoMISo/\nGMM_PATH            = $$PWD/CoMISo/gmm/\nEIGEN_PATH          = $$PWD/eigen/\n\n#GUI external libraries (needed only for field_computation and field_tracing projects)\nANTTWEAKBAR_PATH    = /opt/AntTweakBar/\n\n#External libraries\nBOOST_PATH          = /usr/include/boost/\nGUROBI_PATH         = /opt/gurobi950/linux64/\nGUROBI_COMPILER     = gurobi_g++5.2\nGUROBI_LIB          = gurobi95\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Geometry/Config.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  Defines\n//\n//=============================================================================\n\n#ifndef OPENMESH_GEOMETRY_CONFIG_HH\n#define OPENMESH_GEOMETRY_CONFIG_HH\n\n\n//== INCLUDES =================================================================\n\n// OpenMesh Namespace Defines\n#include <OpenMesh/Core/System/config.h>\n\n\n//== NAMESPACES ===============================================================\n\n#define BEGIN_NS_GEOMETRY namespace geometry {\n#define END_NS_GEOMETRY }\n\n\n//=============================================================================\n#endif // OPENMESH_GEOMETRY_CONFIG_HH defined\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Geometry/LoopSchemeMaskT.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n#ifndef LOOPSCHEMEMASKT_HH\n#define LOOPSCHEMEMASKT_HH\n\n#include <cmath>\n#include <vector>\n\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/Utils/SingletonT.hh>\n\nnamespace OpenMesh\n{\n\n/** implements cache for the weights of the original Loop scheme\n    supported:\n      - vertex projection rule on the next level\n      - vertex projection rule on the limit surface\n      - vertex projection rule on the k-th (level) step (Barthe, Kobbelt'2003)\n      - vertex tangents on the limit surface\n*/\n\ntemplate <class T_, unsigned int cache_size_ = 100>\nclass LoopSchemeMaskT\n{\npublic:\n  enum { cache_size = cache_size_ };\n  typedef T_                                Scalar;\n\nprotected:\n\n  Scalar                                    proj_weights_[cache_size];\n  Scalar                                    limit_weights_[cache_size];\n  Scalar                                    step_weights_[cache_size];\n  std::vector<Scalar>                       tang0_weights_[cache_size];\n  std::vector<Scalar>                       tang1_weights_[cache_size];\n\nprotected:\n\n  inline static Scalar                      compute_proj_weight(uint _valence)\n  {\n    //return pow(3.0 / 2.0 + cos(2.0 * M_PI / _valence), 2) / 2.0 - 1.0;\n    double denom = (3.0 + 2.0*cos(2.0*M_PI/(double)_valence));\n    double weight = (64.0*_valence)/(40.0 - denom*denom) - _valence;\n    return (Scalar) weight;\n  }\n\n  inline static Scalar                      compute_limit_weight(uint _valence)\n  {\n    double proj_weight = compute_proj_weight(_valence);\n    proj_weight = proj_weight/(proj_weight + _valence);//normalize the proj_weight\n    double weight = (3.0/8.0)/(1.0 - proj_weight + (3.0/8.0));\n    return (Scalar)weight;\n  }\n\n  inline static Scalar                      compute_step_weight(uint _valence)\n  {\n    double proj_weight = compute_proj_weight(_valence);\n    proj_weight = proj_weight/(proj_weight + _valence);//normalize the proj_weight\n    double weight = proj_weight - (3.0/8.0);\n    return (Scalar)weight;\n  }\n\n  inline static Scalar                      compute_tang0_weight(uint _valence, uint _ver_id)\n  {\n    return (Scalar)cos(2.0*M_PI*(double)_ver_id/(double)_valence);\n  }\n\n  inline static Scalar                      compute_tang1_weight(uint _valence, uint _ver_id)\n  {\n    return (Scalar)sin(2.0*M_PI*(double)_ver_id/(double)_valence);\n  }\n\n  void                                      cache_weights()\n  {\n    proj_weights_[0] = 1;\n    for (uint k = 1; k < cache_size; ++k)\n    {\n      proj_weights_[k] = compute_proj_weight(k);\n      limit_weights_[k] = compute_limit_weight(k);\n      step_weights_[k] = compute_step_weight(k);\n      tang0_weights_[k].resize(k);\n      tang1_weights_[k].resize(k);\n      for (uint i = 0; i < k; ++i)\n      {\n        tang0_weights_[k][i] = compute_tang0_weight(k,i);\n        tang1_weights_[k][i] = compute_tang1_weight(k,i);\n      }\n    }\n  }\n\npublic:\n\n  LoopSchemeMaskT()\n  {\n    cache_weights();\n  }\n\n  inline Scalar                             proj_weight(uint _valence) const\n  {\n    assert(_valence < cache_size );\n    return proj_weights_[_valence];\n  }\n\n  inline Scalar                             limit_weight(uint _valence) const\n  {\n    assert(_valence < cache_size );\n    return limit_weights_[_valence];\n  }\n\n  inline Scalar                             step_weight(uint _valence, uint _step) const\n  {\n    assert(_valence < cache_size);\n    return pow(step_weights_[_valence], (int)_step);//can be precomputed\n  }\n\n  inline Scalar                             tang0_weight(uint _valence, uint _ver_id) const\n  {\n    assert(_valence < cache_size );\n    assert(_ver_id < _valence);\n    return tang0_weights_[_valence][_ver_id];\n  }\n\n  inline Scalar                             tang1_weight(uint _valence, uint _ver_id) const\n  {\n    assert(_valence < cache_size );\n    assert(_ver_id < _valence);\n    return tang1_weights_[_valence][_ver_id];\n  }\n\n  void                                      dump(uint _max_valency = cache_size - 1) const\n  {\n    assert(_max_valency <= cache_size - 1);\n    //CConsole::printf(\"(k : pw_k, lw_k): \");\n    for (uint i = 0;  i <= _max_valency; ++i)\n    {\n      //CConsole::stream() << \"(\" << i << \" : \" << proj_weight(i) << \", \" << limit_weight(i) << \", \" << step_weight(i,1) << \"), \";\n    }\n    //CConsole::printf(\"\\n\");\n  }\n};\n\ntypedef LoopSchemeMaskT<double, 100>        LoopSchemeMaskDouble;\ntypedef SingletonT<LoopSchemeMaskDouble>    LoopSchemeMaskDoubleSingleton;\n\n}//namespace OpenMesh\n\n#endif//LOOPSCHEMEMASKT_HH\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Geometry/MathDefs.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n#ifndef MATHDEFS_HH\n#define MATHDEFS_HH\n\n#include <cmath>\n#include <cfloat>\n\n#ifndef M_PI\n  #define M_PI      3.14159265359\n#endif\n\nnamespace OpenMesh\n{\n\n/** comparison operators with user-selected precision control\n*/\ntemplate <class T, typename Real>\ninline bool is_zero(const T& _a, Real _eps)\n{ return fabs(_a) < _eps; }\n\ntemplate <class T1, class T2, typename Real>\ninline bool is_eq(const T1& a, const T2& b, Real _eps)\n{ return is_zero(a-b, _eps); }\n\ntemplate <class T1, class T2, typename Real>\ninline bool is_gt(const T1& a, const T2& b, Real _eps)\n{ return (a > b) && !is_eq(a,b,_eps); }\n\ntemplate <class T1, class T2, typename Real>\ninline bool is_ge(const T1& a, const T2& b, Real _eps)\n{ return (a > b) || is_eq(a,b,_eps); }\n\ntemplate <class T1, class T2, typename Real>\ninline bool is_lt(const T1& a, const T2& b, Real _eps)\n{ return (a < b) && !is_eq(a,b,_eps); }\n\ntemplate <class T1, class T2, typename Real>\ninline bool is_le(const T1& a, const T2& b, Real _eps)\n{ return (a < b) || is_eq(a,b,_eps); }\n\n/*const float flt_eps__ = 10*FLT_EPSILON;\nconst double dbl_eps__ = 10*DBL_EPSILON;*/\nconst float flt_eps__ = (float)1e-05;\nconst double dbl_eps__ = 1e-09;\n\ninline float eps__(float) \n{ return flt_eps__; }\n\ninline double eps__(double)\n{ return dbl_eps__; }\n\ntemplate <class T>\ninline bool is_zero(const T& a)\n{ return is_zero(a, eps__(a)); }\n\ntemplate <class T1, class T2>\ninline bool is_eq(const T1& a, const T2& b)\n{ return is_zero(a-b); }\n\ntemplate <class T1, class T2>\ninline bool is_gt(const T1& a, const T2& b)\n{ return (a > b) && !is_eq(a,b); }\n\ntemplate <class T1, class T2>\ninline bool is_ge(const T1& a, const T2& b)\n{ return (a > b) || is_eq(a,b); }\n\ntemplate <class T1, class T2>\ninline bool is_lt(const T1& a, const T2& b)\n{ return (a < b) && !is_eq(a,b); }\n\ntemplate <class T1, class T2>\ninline bool is_le(const T1& a, const T2& b)\n{ return (a < b) || is_eq(a,b); }\n\n/// Trigonometry/angles - related\n\ntemplate <class T>\ninline T sane_aarg(T _aarg)\n{\n  if (_aarg < -1)\n  {\n    _aarg = -1;\n  }\n  else if (_aarg >  1)\n  {\n    _aarg = 1;\n  }\n  return _aarg;\n}\n\n/** returns the angle determined by its cos and the sign of its sin\n    result is positive if the angle is in [0:pi]\n    and negative if it is in [pi:2pi]\n*/\ntemplate <class T>\nT angle(T _cos_angle, T _sin_angle)\n{//sanity checks - otherwise acos will return nan\n  _cos_angle = sane_aarg(_cos_angle);\n  return (T) _sin_angle >= 0 ? acos(_cos_angle) : -acos(_cos_angle);\n}\n\ntemplate <class T>\ninline T positive_angle(T _angle)\n{ return _angle < 0 ? (2*M_PI + _angle) : _angle; }\n\ntemplate <class T>\ninline T positive_angle(T _cos_angle, T _sin_angle)\n{ return positive_angle(angle(_cos_angle, _sin_angle)); }\n\ntemplate <class T>\ninline T deg_to_rad(const T& _angle)\n{ return M_PI*(_angle/180); }\n\ntemplate <class T>\ninline T rad_to_deg(const T& _angle)\n{ return 180*(_angle/M_PI); }\n\ninline double log_(double _value)\n{ return log(_value); }\n\n}//namespace OpenMesh\n\n#endif//MATHDEFS_HH\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Geometry/NormalConeT.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------*\n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         *\n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/\n\n/*===========================================================================*\\\n *                                                                           *\n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n\n\n//=============================================================================\n//\n//  CLASS NormalConeT - IMPLEMENTATION\n//\n//=============================================================================\n\n#define OPENMESH_NORMALCONE_C\n\n//== INCLUDES =================================================================\n\n#include <math.h>\n#include \"NormalConeT.hh\"\n\n#ifdef max\n#  undef max\n#endif\n\n#ifdef min\n#  undef min\n#endif\n\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\n\n\n//== IMPLEMENTATION ========================================================== \n\ntemplate <typename Scalar>\nNormalConeT<Scalar>::\nNormalConeT(const Vec3& _center_normal, Scalar _angle)\n  : center_normal_(_center_normal), angle_(_angle)\n{\n}\n\n\n//----------------------------------------------------------------------------\n\n\ntemplate <typename Scalar>\nScalar \nNormalConeT<Scalar>::\nmax_angle(const Vec3& _norm) const\n{\n  Scalar dotp = (center_normal_ | _norm);\n  return (dotp >= 1.0 ? 0.0 : (dotp <= -1.0 ? M_PI : acos(dotp)))\n    + angle_;\n}\n\n\n//----------------------------------------------------------------------------\n\n\ntemplate <typename Scalar>\nScalar \nNormalConeT<Scalar>::\nmax_angle(const NormalConeT& _cone) const\n{\n  Scalar dotp = (center_normal_ | _cone.center_normal_);\n  Scalar centerAngle = dotp >= 1.0 ? 0.0 : (dotp <= -1.0 ? M_PI : acos(dotp));\n  Scalar sideAngle0 = std::max(angle_-centerAngle, _cone.angle_);\n  Scalar sideAngle1 = std::max(_cone.angle_-centerAngle, angle_);\n\n  return centerAngle + sideAngle0 + sideAngle1;\n}\n\n\n//----------------------------------------------------------------------------\n\n\ntemplate <typename Scalar>\nvoid \nNormalConeT<Scalar>::\nmerge(const NormalConeT& _cone)\n{\n  Scalar dotp = (center_normal_ | _cone.center_normal_);\n\n  if (fabs(dotp) < 0.99999f)\n  {\n    // new angle\n    Scalar centerAngle = acos(dotp);\n    Scalar minAngle    = std::min(-angle(), centerAngle - _cone.angle());\n    Scalar maxAngle    = std::max( angle(), centerAngle + _cone.angle());\n    angle_     = (maxAngle - minAngle) * Scalar(0.5f);\n\n    // axis by SLERP\n    Scalar axisAngle =  Scalar(0.5f) * (minAngle + maxAngle);\n    center_normal_ = ((center_normal_ * sin(centerAngle-axisAngle)\n\t\t                   + _cone.center_normal_ * sin(axisAngle))\n\t\t                    / sin(centerAngle));\n  }\n  else\n  {\n    // axes point in same direction\n    if (dotp > 0.0f)\n      angle_ = std::max(angle_, _cone.angle_);\n\n    // axes point in opposite directions\n    else\n      angle_ =  Scalar(2.0f * M_PI);\n  }\n}\n\n\n//=============================================================================\n} // namespace OpenMesh\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Geometry/NormalConeT.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------*\n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         *\n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/\n\n/*===========================================================================*\\\n *                                                                           *\n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n\n\n//=============================================================================\n//\n//  CLASS NormalCone\n//\n//=============================================================================\n\n\n#ifndef OPENMESH_NORMALCONE_HH\n#define OPENMESH_NORMALCONE_HH\n\n\n//== INCLUDES =================================================================\n\n\n#include <OpenMesh/Core/Geometry/VectorT.hh>\n\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\n\n\n//== CLASS DEFINITION =========================================================\n\n\n/** /class NormalCone NormalCone.hh <ACG/Geometry/Types/NormalCone.hh>\n\n    NormalCone that can be merged with other normal cones. Provides\n    the center normal and the opening angle.\n**/\n\ntemplate <typename Scalar>\nclass NormalConeT\n{\npublic:\n\n  // typedefs\n  typedef VectorT<Scalar, 3>  Vec3;\n\n\n  //! default constructor (not initialized)\n  NormalConeT() {}\n\n  //! Initialize cone with center (unit vector) and angle (radius in radians)\n  NormalConeT(const Vec3& _center_normal, Scalar _angle=0.0);\n\n  //! return max. distance (radians) unit vector to cone (distant side)\n  Scalar max_angle(const Vec3&) const;\n\n  //! return max. distance (radians) cone to cone (distant sides)\n  Scalar max_angle(const NormalConeT&) const;\n\n  //! merge _cone; this instance will then enclose both former cones\n  void merge(const NormalConeT&);\n\n  //! returns center normal\n  const Vec3& center_normal() const { return center_normal_; }\n\n  //! returns size of cone (radius in radians)\n  inline Scalar angle() const { return angle_; }\n\nprivate:\n\n  Vec3    center_normal_;\n  Scalar  angle_;\n};\n\n\n//=============================================================================\n} // namespace OpenMesh\n//=============================================================================\n#if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_NORMALCONE_C)\n#define OPENMESH_NORMALCONE_TEMPLATES\n#include \"NormalConeT.cc\"\n#endif\n//=============================================================================\n#endif // OPENMESH_NORMALCONE_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Geometry/Plane3d.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n//=============================================================================\n//\n//  CLASS Plane3D\n//\n//=============================================================================\n\n\n#ifndef OPENMESH_PLANE3D_HH\n#define OPENMESH_PLANE3D_HH\n\n\n//== INCLUDES =================================================================\n\n#include <OpenMesh/Core/Geometry/VectorT.hh>\n\n\n//== FORWARDDECLARATIONS ======================================================\n\n//== NAMESPACES ===============================================================\n\nnamespace OpenMesh {\nnamespace VDPM {\n\n//== CLASS DEFINITION =========================================================\n\n\t      \n/** \\class Plane3d Plane3d.hh <OpenMesh/Tools/VDPM/Plane3d.hh>\n\n    ax + by + cz + d = 0\n*/\n\n\nclass OPENMESHDLLEXPORT Plane3d\n{\npublic:\n\n  typedef OpenMesh::Vec3f         vector_type;\n  typedef vector_type::value_type value_type;\n\npublic:\n\n  Plane3d()\n    : d_(0)\n  { }\n\n  Plane3d(const vector_type &_dir, const vector_type &_pnt)\n    : n_(_dir), d_(0)\n  { \n    n_.normalize();\n    d_ = -dot(n_,_pnt); \n  }\n\n  value_type signed_distance(const OpenMesh::Vec3f &_p)\n  {\n    return  dot(n_ , _p) + d_;\n  }\n\n  // back compatibility\n  value_type singed_distance(const OpenMesh::Vec3f &point)\n  { return signed_distance( point ); }\n\npublic:\n\n  vector_type n_;\n  value_type  d_;\n\n};\n\n//=============================================================================\n} // namespace VDPM\n} // namespace OpenMesh\n//=============================================================================\n#endif // OPENMESH_PLANE3D_HH defined\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Geometry/QuadricT.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n/** \\file Core/Geometry/QuadricT.hh\n\n */\n\n//=============================================================================\n//\n//  CLASS QuadricT\n//\n//=============================================================================\n\n#ifndef OPENMESH_GEOMETRY_QUADRIC_HH\n#define OPENMESH_GEOMETRY_QUADRIC_HH\n\n\n//== INCLUDES =================================================================\n\n#include \"Config.hh\"\n#include <OpenMesh/Core/Geometry/VectorT.hh>\n#include <OpenMesh/Core/Utils/GenProg.hh>\n\n//== NAMESPACE ================================================================\n\nnamespace OpenMesh { //BEGIN_NS_OPENMESH\nnamespace Geometry { //BEGIN_NS_GEOMETRY\n\n\n//== CLASS DEFINITION =========================================================\n\n\n/** /class QuadricT Geometry/QuadricT.hh\n\n    Stores a quadric as a 4x4 symmetrix matrix. Used by the\n    error quadric based mesh decimation algorithms.\n**/\n\ntemplate <class Scalar>\nclass QuadricT\n{\npublic:\n  typedef Scalar           value_type;\n  typedef QuadricT<Scalar> type;\n  typedef QuadricT<Scalar> Self;\n  //   typedef VectorInterface<Scalar, VecStorage3<Scalar> > Vec3;\n  //   typedef VectorInterface<Scalar, VecStorage4<Scalar> > Vec4;\n  //typedef Vector3Elem      Vec3;\n  //typedef Vector4Elem      Vec4;\n\n  /// construct with upper triangle of symmetrix 4x4 matrix\n  QuadricT(Scalar _a, Scalar _b, Scalar _c, Scalar _d,\n                      Scalar _e, Scalar _f, Scalar _g,\n                                 Scalar _h, Scalar _i,\n                                            Scalar _j)\n  : a_(_a), b_(_b), c_(_c), d_(_d),\n            e_(_e), f_(_f), g_(_g),\n                    h_(_h), i_(_i),\n                            j_(_j)\n  {\n  }\n\n\n  /// constructor from given plane equation: ax+by+cz+d_=0\n  QuadricT( Scalar _a=0.0, Scalar _b=0.0, Scalar _c=0.0, Scalar _d=0.0 )\n  : a_(_a*_a), b_(_a*_b),  c_(_a*_c),  d_(_a*_d),\n               e_(_b*_b),  f_(_b*_c),  g_(_b*_d),\n                           h_(_c*_c),  i_(_c*_d),\n                                       j_(_d*_d)\n  {}\n\n  template <class _Point>\n  QuadricT(const _Point& _pt)\n  {\n    set_distance_to_point(_pt);\n  }\n\n  template <class _Normal, class _Point>\n  QuadricT(const _Normal& _n, const _Point& _p)\n  {\n    set_distance_to_plane(_n,_p);\n  }\n\n  //set operator\n  void set(Scalar _a, Scalar _b, Scalar _c, Scalar _d,\n                      Scalar _e, Scalar _f, Scalar _g,\n                                 Scalar _h, Scalar _i,\n                                            Scalar _j)\n  {\n    a_ = _a; b_ = _b; c_ = _c; d_ = _d;\n             e_ = _e; f_ = _f; g_ = _g;\n                      h_ = _h; i_ = _i;\n                               j_ = _j;\n  }\n\n  //sets the quadric representing the squared distance to _pt\n  template <class _Point>\n  void set_distance_to_point(const _Point& _pt)\n  {\n    set(1, 0, 0, -_pt[0],\n           1, 0, -_pt[1],\n              1, -_pt[2],\n                 dot(_pt,_pt));\n  }\n\n  //sets the quadric representing the squared distance to the plane [_a,_b,_c,_d]\n  void set_distance_to_plane(Scalar _a, Scalar _b, Scalar _c, Scalar _d)\n  {\n    a_ = _a*_a; b_ = _a*_b; c_ = _a*_c;  d_ = _a*_d;\n                e_ = _b*_b; f_ = _b*_c;  g_ = _b*_d;\n                            h_ = _c*_c;  i_ = _c*_d;\n                                         j_ = _d*_d;\n  }\n\n  //sets the quadric representing the squared distance to the plane\n  //determined by the normal _n and the point _p\n  template <class _Normal, class _Point>\n  void set_distance_to_plane(const _Normal&  _n, const _Point& _p)\n  {\n    set_distance_to_plane(_n[0], _n[1], _n[2], -dot(_n,_p));\n  }\n\n  /// set all entries to zero\n  void clear()  { a_ = b_ = c_ = d_ = e_ = f_ = g_ = h_ = i_ = j_ = 0.0; }\n\n  /// add quadrics\n  QuadricT<Scalar>& operator+=( const QuadricT<Scalar>& _q )\n  {\n    a_ += _q.a_;  b_ += _q.b_;  c_ += _q.c_;  d_ += _q.d_;\n                  e_ += _q.e_;  f_ += _q.f_;  g_ += _q.g_;\n                                h_ += _q.h_;  i_ += _q.i_;\n                                              j_ += _q.j_;\n    return *this;\n  }\n\n\n  /// multiply by scalar\n  QuadricT<Scalar>& operator*=( Scalar _s)\n  {\n    a_ *= _s;  b_ *= _s;  c_ *= _s;  d_ *= _s;\n               e_ *= _s;  f_ *= _s;  g_ *= _s;\n                          h_ *= _s;  i_ *= _s;\n                                     j_ *= _s;\n    return *this;\n  }\n\n\n  /// multiply 4D vector from right: Q*v\n  template <class _Vec4>\n  _Vec4 operator*(const _Vec4& _v) const\n  {\n    Scalar x(_v[0]), y(_v[1]), z(_v[2]), w(_v[3]);\n    return _Vec4(x*a_ + y*b_ + z*c_ + w*d_,\n                 x*b_ + y*e_ + z*f_ + w*g_,\n                 x*c_ + y*f_ + z*h_ + w*i_,\n                 x*d_ + y*g_ + z*i_ + w*j_);\n  }\n\n  /// evaluate quadric Q at (3D or 4D) vector v: v*Q*v\n  template <class _Vec>\n  Scalar operator()(const _Vec& _v) const\n  {\n    return evaluate(_v, GenProg::Int2Type<_Vec::size_>());\n  }\n\n  Scalar a() const { return a_; }\n  Scalar b() const { return b_; }\n  Scalar c() const { return c_; }\n  Scalar d() const { return d_; }\n  Scalar e() const { return e_; }\n  Scalar f() const { return f_; }\n  Scalar g() const { return g_; }\n  Scalar h() const { return h_; }\n  Scalar i() const { return i_; }\n  Scalar j() const { return j_; }\n\n  Scalar xx() const { return a_; }\n  Scalar xy() const { return b_; }\n  Scalar xz() const { return c_; }\n  Scalar xw() const { return d_; }\n  Scalar yy() const { return e_; }\n  Scalar yz() const { return f_; }\n  Scalar yw() const { return g_; }\n  Scalar zz() const { return h_; }\n  Scalar zw() const { return i_; }\n  Scalar ww() const { return j_; }\n\nprotected:\n\n  /// evaluate quadric Q at 3D vector v: v*Q*v\n  template <class _Vec3>\n  Scalar evaluate(const _Vec3& _v, GenProg::Int2Type<3>/*_dimension*/) const\n  {\n    Scalar x(_v[0]), y(_v[1]), z(_v[2]);\n    return a_*x*x + 2.0*b_*x*y + 2.0*c_*x*z + 2.0*d_*x\n                  +     e_*y*y + 2.0*f_*y*z + 2.0*g_*y\n                               +     h_*z*z + 2.0*i_*z\n                                            +     j_;\n  }\n\n  /// evaluate quadric Q at 4D vector v: v*Q*v\n  template <class _Vec4>\n  Scalar evaluate(const _Vec4& _v, GenProg::Int2Type<4>/*_dimension*/) const\n  {\n    Scalar x(_v[0]), y(_v[1]), z(_v[2]), w(_v[3]);\n    return a_*x*x + 2.0*b_*x*y + 2.0*c_*x*z + 2.0*d_*x*w\n                  +     e_*y*y + 2.0*f_*y*z + 2.0*g_*y*w\n                               +     h_*z*z + 2.0*i_*z*w\n                                            +     j_*w*w;\n  }\n\nprivate:\n\n  Scalar a_, b_, c_, d_,\n             e_, f_, g_,\n                 h_, i_,\n                     j_;\n};\n\n\n/// Quadric using floats\ntypedef QuadricT<float> Quadricf;\n\n/// Quadric using double\ntypedef QuadricT<double> Quadricd;\n\n\n//=============================================================================\n} // END_NS_GEOMETRY\n} // END_NS_OPENMESH\n//============================================================================\n#endif // OPENMESH_GEOMETRY_HH defined\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Geometry/VectorT.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  CLASS VectorT\n//\n//=============================================================================\n\n// Don't parse this header file with doxygen since\n// for some reason (obviously due to a bug in doxygen,\n// bugreport: https://bugzilla.gnome.org/show_bug.cgi?id=629182)\n// macro expansion and preprocessor defines\n// don't work properly.\n#ifndef DOXYGEN\n\n#ifndef OPENMESH_VECTOR_HH\n#define OPENMESH_VECTOR_HH\n\n\n//== INCLUDES =================================================================\n\n\n#include <OpenMesh/Core/System/config.h>\n#include <iostream>\n#include <cmath>\n#include <cassert>\n#include <cstring>\n\n#if defined(__GNUC__) && defined(__SSE__)\n#include <xmmintrin.h>\n#endif\n\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\n\n\n//== CLASS DEFINITION =========================================================\n\n\n\n/** The N values of the template Scalar type are the only data members\n    of the class VectorT<Scalar,N>. This guarantees 100% compatibility\n    with arrays of type Scalar and size N, allowing us to define the\n    cast operators to and from arrays and array pointers.\n\n    In addition, this class will be specialized for Vec4f to be 16 bit\n    aligned, so that aligned SSE instructions can be used on these\n    vectors.\n*/\ntemplate <typename Scalar,int N> struct VectorDataT\n{\n  Scalar values_[N];\n};\n\n\n#if defined(__GNUC__) && defined(__SSE__)\n\n/// This specialization enables us to use aligned SSE instructions.\ntemplate <> struct VectorDataT<float, 4>\n{\n  union \n  {\n    __m128  m128;\n    float   values_[4];\n  };\n};\n\n#endif\n\n\n\n\n//== CLASS DEFINITION =========================================================\n\n\n#define DIM               N\n#define TEMPLATE_HEADER   template <typename Scalar, int N>\n#define CLASSNAME         VectorT\n#define DERIVED           VectorDataT<Scalar,N>\n#define unroll(expr)      for (int i=0; i<N; ++i) expr(i)\n\n/** \\class VectorT VectorT.hh <OpenMesh/Core/Math/VectorT.hh>\n    A vector is an array of \\<N\\> values of type \\<Scalar\\>.\n    The actual data is stored in an VectorDataT, this class just adds\n    the necessary operators.\n*/\n#include \"VectorT_inc.hh\"\n\n#undef  DIM\n#undef  TEMPLATE_HEADER\n#undef  CLASSNAME\n#undef  DERIVED\n#undef  unroll\n\n\n\n\n//== PARTIAL TEMPLATE SPECIALIZATIONS =========================================\n#if OM_PARTIAL_SPECIALIZATION\n\n\n#define TEMPLATE_HEADER        template <typename Scalar>\n#define CLASSNAME              VectorT<Scalar,DIM> \n#define DERIVED                VectorDataT<Scalar,DIM>\n\n\n#define DIM                    2\n#define unroll(expr)           expr(0) expr(1)\n#define unroll_comb(expr, op)  expr(0) op expr(1)\n#define unroll_csv(expr)       expr(0), expr(1)\n#include \"VectorT_inc.hh\"\n#undef  DIM\n#undef  unroll\n#undef  unroll_comb\n#undef  unroll_csv\n\n\n#define DIM                    3\n#define unroll(expr)           expr(0) expr(1) expr(2)\n#define unroll_comb(expr, op)  expr(0) op expr(1) op expr(2)\n#define unroll_csv(expr)       expr(0), expr(1), expr(2)\n#include \"VectorT_inc.hh\"\n#undef  DIM\n#undef  unroll\n#undef  unroll_comb\n#undef  unroll_csv\n\n\n#define DIM                    4\n#define unroll(expr)           expr(0) expr(1) expr(2) expr(3)\n#define unroll_comb(expr, op)  expr(0) op expr(1) op expr(2) op expr(3)\n#define unroll_csv(expr)       expr(0), expr(1), expr(2), expr(3)\n#include \"VectorT_inc.hh\"\n#undef  DIM\n#undef  unroll\n#undef  unroll_comb\n#undef  unroll_csv\n\n\n#undef  TEMPLATE_HEADER\n#undef  CLASSNAME\n#undef  DERIVED\n\n\n\n\n//== FULL TEMPLATE SPECIALIZATIONS ============================================\n#else\n\n/// cross product for Vec3f\ntemplate<>\ninline VectorT<float,3>\nVectorT<float,3>::operator%(const VectorT<float,3>& _rhs) const \n{\n   return \n     VectorT<float,3>(values_[1]*_rhs.values_[2]-values_[2]*_rhs.values_[1],\n\t\t      values_[2]*_rhs.values_[0]-values_[0]*_rhs.values_[2],\n\t\t      values_[0]*_rhs.values_[1]-values_[1]*_rhs.values_[0]);\n}\n  \n\n/// cross product for Vec3d\ntemplate<>\ninline VectorT<double,3>\nVectorT<double,3>::operator%(const VectorT<double,3>& _rhs) const\n{\n return \n   VectorT<double,3>(values_[1]*_rhs.values_[2]-values_[2]*_rhs.values_[1],\n\t\t     values_[2]*_rhs.values_[0]-values_[0]*_rhs.values_[2],\n\t\t     values_[0]*_rhs.values_[1]-values_[1]*_rhs.values_[0]);\n}\n\n#endif\n\n\n\n//== GLOBAL FUNCTIONS =========================================================\n\n\n/// \\relates OpenMesh::VectorT\n/// scalar * vector\ntemplate<typename Scalar,int N>\ninline VectorT<Scalar,N> operator*(Scalar _s, const VectorT<Scalar,N>& _v) {\n  return VectorT<Scalar,N>(_v) *= _s;\n}\n\n\n/// \\relates OpenMesh::VectorT\n/// symmetric version of the dot product\ntemplate<typename Scalar, int N>\ninline Scalar \ndot(const VectorT<Scalar,N>& _v1, const VectorT<Scalar,N>& _v2) {\n  return (_v1 | _v2); \n}\n\n\n/// \\relates OpenMesh::VectorT\n/// symmetric version of the cross product\ntemplate<typename Scalar, int N>\ninline VectorT<Scalar,N> \ncross(const VectorT<Scalar,N>& _v1, const VectorT<Scalar,N>& _v2) {\n  return (_v1 % _v2);\n}\n\n\n\n\n//== TYPEDEFS =================================================================\n\n/** 1-byte signed vector */\ntypedef VectorT<signed char,1> Vec1c;\n/** 1-byte unsigned vector */\ntypedef VectorT<unsigned char,1> Vec1uc;\n/** 1-short signed vector */\ntypedef VectorT<signed short int,1> Vec1s;\n/** 1-short unsigned vector */\ntypedef VectorT<unsigned short int,1> Vec1us;\n/** 1-int signed vector */\ntypedef VectorT<signed int,1> Vec1i;\n/** 1-int unsigned vector */\ntypedef VectorT<unsigned int,1> Vec1ui;\n/** 1-float vector */\ntypedef VectorT<float,1> Vec1f;\n/** 1-double vector */\ntypedef VectorT<double,1> Vec1d;\n\n/** 2-byte signed vector */\ntypedef VectorT<signed char,2> Vec2c;\n/** 2-byte unsigned vector */\ntypedef VectorT<unsigned char,2> Vec2uc;\n/** 2-short signed vector */\ntypedef VectorT<signed short int,2> Vec2s;\n/** 2-short unsigned vector */\ntypedef VectorT<unsigned short int,2> Vec2us;\n/** 2-int signed vector */\ntypedef VectorT<signed int,2> Vec2i;\n/** 2-int unsigned vector */\ntypedef VectorT<unsigned int,2> Vec2ui;\n/** 2-float vector */\ntypedef VectorT<float,2> Vec2f;\n/** 2-double vector */\ntypedef VectorT<double,2> Vec2d;\n\n/** 3-byte signed vector */\ntypedef VectorT<signed char,3> Vec3c;\n/** 3-byte unsigned vector */\ntypedef VectorT<unsigned char,3> Vec3uc;\n/** 3-short signed vector */\ntypedef VectorT<signed short int,3> Vec3s;\n/** 3-short unsigned vector */\ntypedef VectorT<unsigned short int,3> Vec3us;\n/** 3-int signed vector */\ntypedef VectorT<signed int,3> Vec3i;\n/** 3-int unsigned vector */\ntypedef VectorT<unsigned int,3> Vec3ui;\n/** 3-float vector */\ntypedef VectorT<float,3> Vec3f;\n/** 3-double vector */\ntypedef VectorT<double,3> Vec3d;\n/** 3-bool vector */\ntypedef VectorT<bool,3> Vec3b;\n\n/** 4-byte signed vector */\ntypedef VectorT<signed char,4> Vec4c;\n/** 4-byte unsigned vector */\ntypedef VectorT<unsigned char,4> Vec4uc;\n/** 4-short signed vector */\ntypedef VectorT<signed short int,4> Vec4s;\n/** 4-short unsigned vector */\ntypedef VectorT<unsigned short int,4> Vec4us;\n/** 4-int signed vector */\ntypedef VectorT<signed int,4> Vec4i;\n/** 4-int unsigned vector */\ntypedef VectorT<unsigned int,4> Vec4ui;\n/** 4-float vector */\ntypedef VectorT<float,4> Vec4f;\n/** 4-double vector */\ntypedef VectorT<double,4> Vec4d;\n\n/** 6-byte signed vector */\ntypedef VectorT<signed char,6> Vec6c;\n/** 6-byte unsigned vector */\ntypedef VectorT<unsigned char,6> Vec6uc;\n/** 6-short signed vector */\ntypedef VectorT<signed short int,6> Vec6s;\n/** 6-short unsigned vector */\ntypedef VectorT<unsigned short int,6> Vec6us;\n/** 6-int signed vector */\ntypedef VectorT<signed int,6> Vec6i;\n/** 6-int unsigned vector */\ntypedef VectorT<unsigned int,6> Vec6ui;\n/** 6-float vector */\ntypedef VectorT<float,6> Vec6f;\n/** 6-double vector */\ntypedef VectorT<double,6> Vec6d;\n\n\n//=============================================================================\n} // namespace OpenMesh\n//=============================================================================\n#endif // OPENMESH_VECTOR_HH defined\n//=============================================================================\n#endif // DOXYGEN\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Geometry/VectorT_inc.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n// Set template keywords and class names properly when\n// parsing with doxygen. This only seems to work this way since\n// the scope of preprocessor defines is limited to one file in doxy.\n#ifdef DOXYGEN\n\n// Only used for correct doxygen parsing\n#define OPENMESH_VECTOR_HH\n\n#define DIM               N\n#define TEMPLATE_HEADER   template <typename Scalar, int N>\n#define CLASSNAME         VectorT\n#define DERIVED           VectorDataT<Scalar,N>\n#define unroll(expr)      for (int i=0; i<N; ++i) expr(i)\n\n#endif\n\n#if defined( OPENMESH_VECTOR_HH )\n\n// ----------------------------------------------------------------------------\n\nTEMPLATE_HEADER\nclass CLASSNAME : public DERIVED\n{\nprivate:\n  typedef DERIVED                           Base;\npublic:\n\n  //---------------------------------------------------------------- class info\n\n  /// the type of the scalar used in this template\n  typedef Scalar value_type;\n\n  /// type of this vector\n  typedef VectorT<Scalar,DIM>  vector_type;\n\n  /// returns dimension of the vector (deprecated)\n  static inline int dim() { return DIM; }\n\n  /// returns dimension of the vector\n  static inline size_t size() { return DIM; }\n\n  static const size_t size_ = DIM;\n\n\n  //-------------------------------------------------------------- constructors\n\n  /// default constructor creates uninitialized values.\n  inline VectorT() {}\n\n  /// special constructor for 1D vectors\n  explicit inline VectorT(const Scalar& v) {\n//     assert(DIM==1);\n//     values_[0] = v0;\n    vectorize(v);\n  }\n\n  /// special constructor for 2D vectors\n  inline VectorT(const Scalar& v0, const Scalar& v1) {\n    assert(DIM==2);\n    Base::values_[0] = v0; Base::values_[1] = v1;\n  }\n\n  /// special constructor for 3D vectors\n  inline VectorT(const Scalar& v0, const Scalar& v1, const Scalar& v2) {\n    assert(DIM==3);\n    Base::values_[0]=v0; Base::values_[1]=v1; Base::values_[2]=v2;\n  }\n\n  /// special constructor for 4D vectors\n  inline VectorT(const Scalar& v0, const Scalar& v1,\n     const Scalar& v2, const Scalar& v3) {\n    assert(DIM==4);\n    Base::values_[0]=v0; Base::values_[1]=v1; Base::values_[2]=v2; Base::values_[3]=v3;\n  }\n\n  /// special constructor for 5D vectors\n  inline VectorT(const Scalar& v0, const Scalar& v1, const Scalar& v2,\n     const Scalar& v3, const Scalar& v4) {\n    assert(DIM==5);\n    Base::values_[0]=v0; Base::values_[1]=v1;Base::values_[2]=v2; Base::values_[3]=v3; Base::values_[4]=v4;\n  }\n\n  /// special constructor for 6D vectors\n  inline VectorT(const Scalar& v0, const Scalar& v1, const Scalar& v2,\n     const Scalar& v3, const Scalar& v4, const Scalar& v5) {\n    assert(DIM==6);\n    Base::values_[0]=v0; Base::values_[1]=v1; Base::values_[2]=v2;\n    Base::values_[3]=v3; Base::values_[4]=v4; Base::values_[5]=v5;\n  }\n\n  /// construct from a value array (explicit)\n  explicit inline VectorT(const Scalar _values[DIM]) {\n    memcpy(Base::values_, _values, DIM*sizeof(Scalar));\n  }\n\n\n#ifdef OM_CC_MIPS\n  /// assignment from a vector of the same kind\n  // mipspro need this method\n  inline vector_type& operator=(const vector_type& _rhs) {\n    memcpy(Base::values_, _rhs.Base::values_, DIM*sizeof(Scalar));\n    return *this;\n  }\n#endif\n\n\n  /// copy & cast constructor (explicit)\n  template<typename otherScalarType>\n  explicit inline VectorT(const VectorT<otherScalarType,DIM>& _rhs) {\n    operator=(_rhs);\n  }\n\n\n\n\n  //--------------------------------------------------------------------- casts\n\n  /// cast from vector with a different scalar type\n  template<typename otherScalarType>\n  inline vector_type& operator=(const VectorT<otherScalarType,DIM>& _rhs) {\n#define expr(i)  Base::values_[i] = (Scalar)_rhs[i];\n    unroll(expr);\n#undef expr\n    return *this;\n  }\n\n//   /// cast to Scalar array\n//   inline operator Scalar*() { return Base::values_; }\n\n//   /// cast to const Scalar array\n//   inline operator const Scalar*() const { return Base::values_; }\n\n  /// access to Scalar array\n  inline Scalar* data() { return Base::values_; }\n\n  /// access to const Scalar array\n  inline const Scalar*data() const { return Base::values_; }\n\n\n\n\n   //----------------------------------------------------------- element access\n\n//    /// get i'th element read-write\n//   inline Scalar& operator[](int _i) {\n//     assert(_i>=0 && _i<DIM); return Base::values_[_i];\n//   }\n\n//   /// get i'th element read-only\n//   inline const Scalar& operator[](int _i) const {\n//     assert(_i>=0 && _i<DIM); return Base::values_[_i];\n//   }\n\n   /// get i'th element read-write\n  inline Scalar& operator[](size_t _i) {\n    assert(_i<DIM); return Base::values_[_i];\n  }\n\n  /// get i'th element read-only\n  inline const Scalar& operator[](size_t _i) const {\n    assert(_i<DIM); return Base::values_[_i];\n  }\n\n\n\n\n  //---------------------------------------------------------------- comparsion\n\n  /// component-wise comparison\n  inline bool operator==(const vector_type& _rhs) const {\n#define expr(i) if(Base::values_[i]!=_rhs.Base::values_[i]) return false;\n    unroll(expr);\n#undef expr\n    return true;\n  }\n\n  /// component-wise comparison\n  inline bool operator!=(const vector_type& _rhs) const {\n    return !(*this == _rhs);\n  }\n\n\n\n\n  //---------------------------------------------------------- scalar operators\n\n  /// component-wise self-multiplication with scalar\n  inline vector_type& operator*=(const Scalar& _s) {\n#define expr(i) Base::values_[i] *= _s;\n    unroll(expr);\n#undef expr\n    return *this;\n  }\n\n  /** component-wise self-division by scalar\n      \\attention v *= (1/_s) is much faster than this  */\n  inline vector_type& operator/=(const Scalar& _s) {\n#define expr(i) Base::values_[i] /= _s;\n    unroll(expr);\n#undef expr\n    return *this;\n  }\n\n\n  /// component-wise multiplication with scalar\n  inline vector_type operator*(const Scalar& _s) const {\n#if DIM==N\n    return vector_type(*this) *= _s;\n#else\n#define expr(i) Base::values_[i] * _s\n    return vector_type(unroll_csv(expr));\n#undef expr\n#endif\n  }\n\n\n  /// component-wise division by with scalar\n  inline vector_type operator/(const Scalar& _s) const {\n#if DIM==N\n    return vector_type(*this) /= _s;\n#else\n#define expr(i) Base::values_[i] / _s\n    return vector_type(unroll_csv(expr));\n#undef expr\n#endif\n  }\n\n\n\n\n\n\n  //---------------------------------------------------------- vector operators\n\n  /// component-wise self-multiplication\n  inline vector_type& operator*=(const vector_type& _rhs) {\n#define expr(i) Base::values_[i] *= _rhs[i];\n    unroll(expr);\n#undef expr\n    return *this;\n  }\n\n  /// component-wise self-division\n  inline vector_type& operator/=(const vector_type& _rhs) {\n#define expr(i) Base::values_[i] /= _rhs[i];\n    unroll(expr);\n#undef expr\n    return *this;\n  }\n\n  /// vector difference from this\n  inline vector_type& operator-=(const vector_type& _rhs) {\n#define expr(i) Base::values_[i] -= _rhs[i];\n    unroll(expr);\n#undef expr\n    return *this;\n  }\n\n  /// vector self-addition\n  inline vector_type& operator+=(const vector_type& _rhs) {\n#define expr(i) Base::values_[i] += _rhs[i];\n    unroll(expr);\n#undef expr\n    return *this;\n  }\n\n\n  /// component-wise vector multiplication\n  inline vector_type operator*(const vector_type& _v) const {\n#if DIM==N\n    return vector_type(*this) *= _v;\n#else\n#define expr(i) Base::values_[i] * _v.Base::values_[i]\n    return vector_type(unroll_csv(expr));\n#undef expr\n#endif\n  }\n\n\n  /// component-wise vector division\n  inline vector_type operator/(const vector_type& _v) const {\n#if DIM==N\n    return vector_type(*this) /= _v;\n#else\n#define expr(i) Base::values_[i] / _v.Base::values_[i]\n    return vector_type(unroll_csv(expr));\n#undef expr\n#endif\n  }\n\n\n  /// component-wise vector addition\n  inline vector_type operator+(const vector_type& _v) const {\n#if DIM==N\n    return vector_type(*this) += _v;\n#else\n#define expr(i) Base::values_[i] + _v.Base::values_[i]\n    return vector_type(unroll_csv(expr));\n#undef expr\n#endif\n  }\n\n\n  /// component-wise vector difference\n  inline vector_type operator-(const vector_type& _v) const {\n#if DIM==N\n    return vector_type(*this) -= _v;\n#else\n#define expr(i) Base::values_[i] - _v.Base::values_[i]\n    return vector_type(unroll_csv(expr));\n#undef expr\n#endif\n  }\n\n\n  /// unary minus\n  inline vector_type operator-(void) const {\n    vector_type v;\n#define expr(i) v.Base::values_[i] = -Base::values_[i];\n    unroll(expr);\n#undef expr\n    return v;\n  }\n\n\n  /// cross product: only defined for Vec3* as specialization\n  /// \\see OpenMesh::cross\n  inline VectorT<Scalar,3> operator%(const VectorT<Scalar,3>& _rhs) const\n#if DIM==3\n  {\n    return\n      VectorT<Scalar,3>(Base::values_[1]*_rhs.Base::values_[2]-Base::values_[2]*_rhs.Base::values_[1],\n      Base::values_[2]*_rhs.Base::values_[0]-Base::values_[0]*_rhs.Base::values_[2],\n      Base::values_[0]*_rhs.Base::values_[1]-Base::values_[1]*_rhs.Base::values_[0]);\n  }\n#else\n  ;\n#endif\n\n\n  /// compute scalar product\n  /// \\see OpenMesh::dot\n  inline Scalar operator|(const vector_type& _rhs) const {\n  Scalar p(0);\n#define expr(i) p += Base::values_[i] * _rhs.Base::values_[i];\n  unroll(expr);\n#undef expr\n    return p;\n  }\n\n\n\n\n\n  //------------------------------------------------------------ euclidean norm\n\n  /// \\name Euclidean norm calculations\n  //@{\n  /// compute euclidean norm\n  inline Scalar norm() const { return (Scalar)sqrt(sqrnorm()); }\n  inline Scalar length() const { return norm(); } // OpenSG interface\n\n  /// compute squared euclidean norm\n  inline Scalar sqrnorm() const \n  {\n#if DIM==N\n    Scalar s(0);\n#define expr(i) s += Base::values_[i] * Base::values_[i];\n    unroll(expr);\n#undef expr\n    return s;\n#else\n#define expr(i) Base::values_[i]*Base::values_[i]\n    return (unroll_comb(expr, +));\n#undef expr\n#endif\n  }\n\n  /** normalize vector, return normalized vector\n  */\n\n  inline vector_type& normalize() \n  {\n    *this /= norm();\n    return *this;\n  }\n  \n  /** return normalized vector\n  */\n\n  inline const vector_type normalized() const\n  {\n    return *this / norm();\n  }\n\n  /** normalize vector, return normalized vector and avoids div by zero \n  */\n  inline vector_type& normalize_cond() \n  {\n    Scalar n = norm();\n    if (n != (Scalar)0.0)\n    {\n      *this /= n;\n    }\n    return *this;\n  }\n  \n  //@}\n\n  //------------------------------------------------------------ euclidean norm\n\n  /// \\name Non-Euclidean norm calculations\n  //@{\n  \n  /// compute L1 (Manhattan) norm\n  inline Scalar l1_norm() const\n  {\n#if DIM==N\n    Scalar s(0);\n#define expr(i) s += std::abs(Base::values_[i]);\n    unroll(expr);\n#undef expr\n    return s;\n#else\n#define expr(i) std::abs(Base::values_[i])\n    return (unroll_comb(expr, +));\n#undef expr\n#endif\n  }\n\n  /// compute l8_norm\n  inline Scalar l8_norm() const\n  {\n    return max_abs();\n  }\n\n  //@}\n\n  //------------------------------------------------------------ max, min, mean\n\n  /// \\name Minimum maximum and mean\n  //@{\n\n  /// return the maximal component\n  inline Scalar max() const \n  {\n    Scalar m(Base::values_[0]);\n    for(int i=1; i<DIM; ++i) if(Base::values_[i]>m) m=Base::values_[i];\n    return m;\n  }\n\n  /// return the maximal absolute component\n  inline Scalar max_abs() const\n  {\n    Scalar m(std::abs(Base::values_[0]));\n    for(int i=1; i<DIM; ++i) \n      if(std::abs(Base::values_[i])>m)\n        m=std::abs(Base::values_[i]);\n    return m;\n  }\n\n\n  /// return the minimal component\n  inline Scalar min() const \n  {\n    Scalar m(Base::values_[0]);\n    for(int i=1; i<DIM; ++i) if(Base::values_[i]<m) m=Base::values_[i];\n    return m;\n  }\n\n  /// return the minimal absolute component\n  inline Scalar min_abs() const \n  {\n    Scalar m(std::abs(Base::values_[0]));\n    for(int i=1; i<DIM; ++i) \n      if(std::abs(Base::values_[i])<m)\n        m=std::abs(Base::values_[i]);\n    return m;\n  }\n\n  /// return arithmetic mean\n  inline Scalar mean() const {\n    Scalar m(Base::values_[0]);\n    for(int i=1; i<DIM; ++i) m+=Base::values_[i];\n    return m/Scalar(DIM);\n  }\n\n  /// return absolute arithmetic mean\n  inline Scalar mean_abs() const {\n    Scalar m(std::abs(Base::values_[0]));\n    for(int i=1; i<DIM; ++i) m+=std::abs(Base::values_[i]);\n    return m/Scalar(DIM);\n  }\n\n\n  /// minimize values: same as *this = min(*this, _rhs), but faster\n  inline vector_type& minimize(const vector_type& _rhs) {\n#define expr(i) if (_rhs[i] < Base::values_[i]) Base::values_[i] = _rhs[i];\n    unroll(expr);\n#undef expr\n    return *this;\n  }\n\n  /// minimize values and signalize coordinate minimization\n  inline bool minimized(const vector_type& _rhs) {\n    bool result(false);\n#define expr(i) if (_rhs[i] < Base::values_[i]) { Base::values_[i] = _rhs[i]; result = true; }\n    unroll(expr);\n#undef expr\n    return result;\n  }\n\n  /// maximize values: same as *this = max(*this, _rhs), but faster\n  inline vector_type& maximize(const vector_type& _rhs) {\n#define expr(i) if (_rhs[i] > Base::values_[i]) Base::values_[i] = _rhs[i];\n    unroll(expr);\n#undef expr\n    return *this;\n  }\n\n  /// maximize values and signalize coordinate maximization\n  inline bool maximized(const vector_type& _rhs) {\n    bool result(false);\n#define expr(i) if (_rhs[i] > Base::values_[i]) { Base::values_[i] =_rhs[i]; result = true; }\n    unroll(expr);\n#undef expr\n    return result;\n  }\n\n  /// component-wise min\n  inline vector_type min(const vector_type& _rhs) const {\n    return vector_type(*this).minimize(_rhs);\n  }\n\n  /// component-wise max\n  inline vector_type max(const vector_type& _rhs) const {\n    return vector_type(*this).maximize(_rhs);\n  }\n\n  //@}\n\n  //------------------------------------------------------------ misc functions\n\n  /// component-wise apply function object with Scalar operator()(Scalar).\n  template<typename Functor>\n  inline vector_type apply(const Functor& _func) const {\n    vector_type result;\n#define expr(i) result[i] = _func(Base::values_[i]);\n    unroll(expr);\n#undef expr\n    return result;\n  }\n\n  /// store the same value in each component (e.g. to clear all entries)\n  vector_type& vectorize(const Scalar& _s) {\n#define expr(i) Base::values_[i] = _s;\n    unroll(expr);\n#undef expr\n    return *this;\n  }\n\n\n  /// store the same value in each component\n  static vector_type vectorized(const Scalar& _s) {\n    return vector_type().vectorize(_s);\n  }\n\n\n  /// lexicographical comparison\n  bool operator<(const vector_type& _rhs) const {\n#define expr(i) if (Base::values_[i] != _rhs.Base::values_[i]) \\\n                   return (Base::values_[i] < _rhs.Base::values_[i]);\n    unroll(expr);\n#undef expr\n    return false;\n   }\n};\n\n\n\n/// read the space-separated components of a vector from a stream\nTEMPLATE_HEADER\ninline std::istream&\noperator>>(std::istream& is, VectorT<Scalar,DIM>& vec)\n{\n#define expr(i) is >> vec[i];\n  unroll(expr);\n#undef expr\n  return is;\n}\n\n\n/// output a vector by printing its space-separated compontens\nTEMPLATE_HEADER\ninline std::ostream&\noperator<<(std::ostream& os, const VectorT<Scalar,DIM>& vec)\n{\n#if DIM==N\n  for(int i=0; i<N-1; ++i) os << vec[i] << \" \";\n  os << vec[N-1];\n#else\n#define expr(i) vec[i]\n  os << unroll_comb(expr, << \" \" <<);\n#undef expr\n#endif\n\n  return os;\n}\n\n\n// ----------------------------------------------------------------------------\n#endif // included by VectorT.hh\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/BinaryHelper.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------*\n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         *\n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/\n\n/*===========================================================================*\\\n *                                                                           *\n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  Helper Functions for binary reading / writing\n//\n//=============================================================================\n\n\n//== INCLUDES =================================================================\n\n\n#include <OpenMesh/Core/System/config.h>\n// -------------------- STL\n#include <algorithm>\n// -------------------- OpenMesh\n#include <OpenMesh/Core/IO/BinaryHelper.hh>\n\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\nnamespace IO {\n\n#ifndef DOXY_IGNORE_THIS\n\n//== IMPLEMENTATION ===========================================================\n\n//-----------------------------------------------------------------------------\n\nshort int read_short(FILE* _in, bool _swap)\n{\n  union u1 { short int s; unsigned char c[2]; }  sc;\n  fread((char*)sc.c, 1, 2, _in);\n  if (_swap) std::swap(sc.c[0], sc.c[1]);\n  return sc.s;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nint read_int(FILE* _in, bool _swap)\n{\n  union u2 { int i; unsigned char c[4]; } ic;\n  fread((char*)ic.c, 1, 4, _in);\n  if (_swap) {\n    std::swap(ic.c[0], ic.c[3]);\n    std::swap(ic.c[1], ic.c[2]);\n  }\n  return ic.i;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nfloat read_float(FILE* _in, bool _swap)\n{\n  union u3 { float f; unsigned char c[4]; } fc;\n  fread((char*)fc.c, 1, 4, _in);\n  if (_swap) {\n    std::swap(fc.c[0], fc.c[3]);\n    std::swap(fc.c[1], fc.c[2]);\n  }\n  return fc.f;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\ndouble read_double(FILE* _in, bool _swap)\n{\n  union u4 { double d; unsigned char c[8]; } dc;\n  fread((char*)dc.c, 1, 8, _in);\n  if (_swap) {\n    std::swap(dc.c[0], dc.c[7]);\n    std::swap(dc.c[1], dc.c[6]);\n    std::swap(dc.c[2], dc.c[5]);\n    std::swap(dc.c[3], dc.c[4]);\n  }\n  return dc.d;\n}\n\n//-----------------------------------------------------------------------------\n\nshort int read_short(std::istream& _in, bool _swap)\n{\n  union u1 { short int s; unsigned char c[2]; }  sc;\n  _in.read((char*)sc.c, 2);\n  if (_swap) std::swap(sc.c[0], sc.c[1]);\n  return sc.s;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nint read_int(std::istream& _in, bool _swap)\n{\n  union u2 { int i; unsigned char c[4]; } ic;\n  _in.read((char*)ic.c, 4);\n  if (_swap) {\n    std::swap(ic.c[0], ic.c[3]);\n    std::swap(ic.c[1], ic.c[2]);\n  }\n  return ic.i;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nfloat read_float(std::istream& _in, bool _swap)\n{\n  union u3 { float f; unsigned char c[4]; } fc;\n  _in.read((char*)fc.c, 4);\n  if (_swap) {\n    std::swap(fc.c[0], fc.c[3]);\n    std::swap(fc.c[1], fc.c[2]);\n  }\n  return fc.f;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\ndouble read_double(std::istream& _in, bool _swap)\n{\n  union u4 { double d; unsigned char c[8]; } dc;\n  _in.read((char*)dc.c, 8);\n  if (_swap) {\n    std::swap(dc.c[0], dc.c[7]);\n    std::swap(dc.c[1], dc.c[6]);\n    std::swap(dc.c[2], dc.c[5]);\n    std::swap(dc.c[3], dc.c[4]);\n  }\n  return dc.d;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid write_short(short int _i, FILE* _out, bool _swap)\n{\n  union u1 { short int s; unsigned char c[2]; } sc;\n  sc.s = _i;\n  if (_swap) std::swap(sc.c[0], sc.c[1]);\n  fwrite((char*)sc.c, 1, 2, _out);\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid write_int(int _i, FILE* _out, bool _swap)\n{\n  union u2 { int i; unsigned char c[4]; } ic;\n  ic.i = _i;\n  if (_swap) {\n    std::swap(ic.c[0], ic.c[3]);\n    std::swap(ic.c[1], ic.c[2]);\n  }\n  fwrite((char*)ic.c, 1, 4, _out);\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid write_float(float _f, FILE* _out, bool _swap)\n{\n  union u3 { float f; unsigned char c[4]; } fc;\n  fc.f = _f;\n  if (_swap) {\n    std::swap(fc.c[0], fc.c[3]);\n    std::swap(fc.c[1], fc.c[2]);\n  }\n  fwrite((char*)fc.c, 1, 4, _out);\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid write_double(double _d, FILE* _out, bool _swap)\n{\n  union u4 { double d; unsigned char c[8]; } dc;\n  dc.d = _d;\n  if (_swap) {\n    std::swap(dc.c[0], dc.c[7]);\n    std::swap(dc.c[1], dc.c[6]);\n    std::swap(dc.c[2], dc.c[5]);\n    std::swap(dc.c[3], dc.c[4]);\n  }\n  fwrite((char*)dc.c, 1, 8, _out);\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid write_short(short int _i, std::ostream& _out, bool _swap)\n{\n  union u1 { short int s; unsigned char c[2]; } sc;\n  sc.s = _i;\n  if (_swap) std::swap(sc.c[0], sc.c[1]);\n  _out.write((char*)sc.c, 2);\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid write_int(int _i, std::ostream& _out, bool _swap)\n{\n  union u2 { int i; unsigned char c[4]; } ic;\n  ic.i = _i;\n  if (_swap) {\n    std::swap(ic.c[0], ic.c[3]);\n    std::swap(ic.c[1], ic.c[2]);\n  }\n  _out.write((char*)ic.c, 4);\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid write_float(float _f, std::ostream& _out, bool _swap)\n{\n  union u3 { float f; unsigned char c[4]; } fc;\n  fc.f = _f;\n  if (_swap) {\n    std::swap(fc.c[0], fc.c[3]);\n    std::swap(fc.c[1], fc.c[2]);\n  }\n  _out.write((char*)fc.c, 4);\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid write_double(double _d, std::ostream& _out, bool _swap)\n{\n  union u4 { double d; unsigned char c[8]; } dc;\n  dc.d = _d;\n  if (_swap) {\n    std::swap(dc.c[0], dc.c[7]);\n    std::swap(dc.c[1], dc.c[6]);\n    std::swap(dc.c[2], dc.c[5]);\n    std::swap(dc.c[3], dc.c[4]);\n  }\n  _out.write((char*)dc.c, 8);\n}\n\n\n#endif\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/BinaryHelper.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------*\n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         *\n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/\n\n/*===========================================================================*\\\n *                                                                           *\n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  Helper Functions for binary reading / writing\n//\n//=============================================================================\n\n#ifndef OPENMESH_BINARY_HELPER_HH\n#define OPENMESH_BINARY_HELPER_HH\n\n\n//== INCLUDES =================================================================\n\n#include <OpenMesh/Core/System/config.h>\n// -------------------- STL\n#if defined( OM_CC_MIPS )\n#  include <stdio.h>\n#else\n#  include <cstdio>\n#endif\n#include <iostream>\n// -------------------- OpenMesh\n\n\n//== NAMESPACES ===============================================================\n\nnamespace OpenMesh {\nnamespace IO {\n\n\n//=============================================================================\n\n\n/** \\name Handling binary input/output.\n    These functions take care of swapping bytes to get the right Endian.\n*/\n//@{\n\n//-----------------------------------------------------------------------------\n\n\n/** Binary read a \\c short from \\c _is and perform byte swapping if\n    \\c _swap is true */\nshort int read_short(FILE* _in, bool _swap=false);\n\n/** Binary read an \\c int from \\c _is and perform byte swapping if\n    \\c _swap is true */\nint read_int(FILE* _in, bool _swap=false);\n\n/** Binary read a \\c float from \\c _is and perform byte swapping if\n    \\c _swap is true */\nfloat read_float(FILE* _in, bool _swap=false);\n\n/** Binary read a \\c double from \\c _is and perform byte swapping if\n    \\c _swap is true */\ndouble read_double(FILE* _in, bool _swap=false);\n\n/** Binary read a \\c short from \\c _is and perform byte swapping if\n    \\c _swap is true */\nshort int read_short(std::istream& _in, bool _swap=false);\n\n/** Binary read an \\c int from \\c _is and perform byte swapping if\n    \\c _swap is true */\nint read_int(std::istream& _in, bool _swap=false);\n\n/** Binary read a \\c float from \\c _is and perform byte swapping if\n    \\c _swap is true */\nfloat read_float(std::istream& _in, bool _swap=false);\n\n/** Binary read a \\c double from \\c _is and perform byte swapping if\n    \\c _swap is true */\ndouble read_double(std::istream& _in, bool _swap=false);\n\n\n/** Binary write a \\c short to \\c _os and perform byte swapping if\n    \\c _swap is true */\nvoid write_short(short int _i, FILE* _out, bool _swap=false);\n\n/** Binary write an \\c int to \\c _os and perform byte swapping if\n    \\c _swap is true */\nvoid write_int(int _i, FILE* _out, bool _swap=false);\n\n/** Binary write a \\c float to \\c _os and perform byte swapping if\n    \\c _swap is true */\nvoid write_float(float _f, FILE* _out, bool _swap=false);\n\n/** Binary write a \\c double to \\c _os and perform byte swapping if\n    \\c _swap is true */\nvoid write_double(double _d, FILE* _out, bool _swap=false);\n\n/** Binary write a \\c short to \\c _os and perform byte swapping if\n    \\c _swap is true */\nvoid write_short(short int _i, std::ostream& _out, bool _swap=false);\n\n/** Binary write an \\c int to \\c _os and perform byte swapping if\n    \\c _swap is true */\nvoid write_int(int _i, std::ostream& _out, bool _swap=false);\n\n/** Binary write a \\c float to \\c _os and perform byte swapping if\n    \\c _swap is true */\nvoid write_float(float _f, std::ostream& _out, bool _swap=false);\n\n/** Binary write a \\c double to \\c _os and perform byte swapping if\n    \\c _swap is true */\nvoid write_double(double _d, std::ostream& _out, bool _swap=false);\n\n//@}\n\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n#endif // OPENMESH_MESHREADER_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/IOInstances.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  Helper file for static builds\n//\n//  In opposite to dynamic builds where the instance of every reader module\n//  is generated within the OpenMesh library, static builds only instanciate\n//  objects that are at least referenced once. As all reader modules are\n//  never used directly, they will not be part of a static build, hence\n//  this file.\n//\n//=============================================================================\n\n\n#ifndef __IOINSTANCES_HH__\n#define __IOINSTANCES_HH__\n\n#if defined(OM_STATIC_BUILD) || defined(ARCH_DARWIN)\n\n//=============================================================================\n\n#include <OpenMesh/Core/System/config.h>\n\n#include <OpenMesh/Core/IO/reader/BaseReader.hh>\n#include <OpenMesh/Core/IO/reader/OBJReader.hh>\n#include <OpenMesh/Core/IO/reader/OFFReader.hh>\n#include <OpenMesh/Core/IO/reader/PLYReader.hh>\n#include <OpenMesh/Core/IO/reader/STLReader.hh>\n#include <OpenMesh/Core/IO/reader/OMReader.hh>\n\n#include <OpenMesh/Core/IO/writer/BaseWriter.hh>\n#include <OpenMesh/Core/IO/writer/OBJWriter.hh>\n#include <OpenMesh/Core/IO/writer/OFFWriter.hh>\n#include <OpenMesh/Core/IO/writer/STLWriter.hh>\n#include <OpenMesh/Core/IO/writer/OMWriter.hh>\n#include <OpenMesh/Core/IO/writer/PLYWriter.hh>\n\n//=== NAMESPACES ==============================================================\n\nnamespace OpenMesh {\nnamespace IO {\n\n//=============================================================================\n\n\n// Instanciate every Reader module\nstatic BaseReader* OFFReaderInstance = &OFFReader();\nstatic BaseReader* OBJReaderInstance = &OBJReader();\nstatic BaseReader* PLYReaderInstance = &PLYReader();\nstatic BaseReader* STLReaderInstance = &STLReader();\nstatic BaseReader* OMReaderInstance  = &OMReader();\n\n// Instanciate every writer module\nstatic BaseWriter* OBJWriterInstance = &OBJWriter();\nstatic BaseWriter* OFFWriterInstance = &OFFWriter();\nstatic BaseWriter* STLWriterInstance = &STLWriter();\nstatic BaseWriter* OMWriterInstance  = &OMWriter();\nstatic BaseWriter* PLYWriterInstance = &PLYWriter();\n\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n#endif // static ?\n#endif //__IOINSTANCES_HH__\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/IOManager.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------*\n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         *\n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/\n\n/*===========================================================================*\\\n *                                                                           *\n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  Implements the OpenMesh IOManager singleton\n//\n//=============================================================================\n\n\n//== INCLUDES =================================================================\n\n\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/IO/IOManager.hh>\n\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\nnamespace IO {\n\n\n//=============================================================================\n\n// Destructor never called. Moved into singleton  getter function\n// _IOManager_  *__IOManager_instance = 0;\n\n_IOManager_& IOManager()\n{\n\n  static _IOManager_  __IOManager_instance;\n\n  //if (!__IOManager_instance)\n  //  __IOManager_instance = new _IOManager_();\n\n  return __IOManager_instance;\n}\n\n//-----------------------------------------------------------------------------\n\nbool\n_IOManager_::\nread(const std::string& _filename, BaseImporter& _bi, Options& _opt)\n{\n  std::set<BaseReader*>::const_iterator it     =  reader_modules_.begin();\n  std::set<BaseReader*>::const_iterator it_end =  reader_modules_.end();\n\n  // Try all registered modules\n  for(; it != it_end; ++it)\n    if ((*it)->can_u_read(_filename))\n    {\n      _bi.prepare();\n      bool ok = (*it)->read(_filename, _bi, _opt);\n      _bi.finish();\n      return ok;\n    }\n\n  // All modules failed to read\n  return false;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nbool\n_IOManager_::\nread(std::istream& _is, const std::string& _ext, BaseImporter& _bi, Options& _opt)\n{\n  std::set<BaseReader*>::const_iterator it     =  reader_modules_.begin();\n  std::set<BaseReader*>::const_iterator it_end =  reader_modules_.end();\n\n  // Try all registered modules\n  for(; it != it_end; ++it)\n    if ((*it)->BaseReader::can_u_read(_ext))  //Use the extension check only (no file existence)\n    {\n      _bi.prepare();\n      bool ok = (*it)->read(_is, _bi, _opt);\n      _bi.finish();\n      return ok;\n    }\n\n  // All modules failed to read\n  return false;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nbool\n_IOManager_::\nwrite(const std::string& _filename, BaseExporter& _be, Options _opt, std::streamsize _precision)\n{\n  std::set<BaseWriter*>::const_iterator it     = writer_modules_.begin();\n  std::set<BaseWriter*>::const_iterator it_end = writer_modules_.end();\n\n  if ( it == it_end )\n  {\n    omerr() << \"[OpenMesh::IO::_IOManager_] No writing modules available!\\n\";\n    return false;\n  }\n\n  // Try all registered modules\n  for(; it != it_end; ++it)\n  {\n    if ((*it)->can_u_write(_filename))\n    {\n      return (*it)->write(_filename, _be, _opt, _precision);\n    }\n  }\n\n  // All modules failed to save\n  return false;\n}\n\n//-----------------------------------------------------------------------------\n\n\nbool\n_IOManager_::\nwrite(std::ostream& _os,const std::string &_ext, BaseExporter& _be, Options _opt, std::streamsize _precision)\n{\n  std::set<BaseWriter*>::const_iterator it     = writer_modules_.begin();\n  std::set<BaseWriter*>::const_iterator it_end = writer_modules_.end();\n\n  if ( it == it_end )\n  {\n    omerr() << \"[OpenMesh::IO::_IOManager_] No writing modules available!\\n\";\n    return false;\n  }\n\n  // Try all registered modules\n  for(; it != it_end; ++it)\n  {\n    if ((*it)->BaseWriter::can_u_write(_ext)) //Restrict test to the extension check\n    {\n      return (*it)->write(_os, _be, _opt, _precision);\n    }\n  }\n\n  // All modules failed to save\n  return false;\n}\n\n//-----------------------------------------------------------------------------\n\n\nbool\n_IOManager_::\ncan_read( const std::string& _format ) const\n{\n  std::set<BaseReader*>::const_iterator it     = reader_modules_.begin();\n  std::set<BaseReader*>::const_iterator it_end = reader_modules_.end();\n  std::string filename = \"dummy.\" + _format;\n\n  for(; it != it_end; ++it)\n    if ((*it)->can_u_read(filename))\n      return true;\n\n  return false;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nbool\n_IOManager_::\ncan_write( const std::string& _format ) const\n{\n  std::set<BaseWriter*>::const_iterator it     = writer_modules_.begin();\n  std::set<BaseWriter*>::const_iterator it_end = writer_modules_.end();\n  std::string filename = \"dummy.\" + _format;\n\n  // Try all registered modules\n  for(; it != it_end; ++it)\n    if ((*it)->can_u_write(filename))\n      return true;\n\n  return false;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nconst BaseWriter*\n_IOManager_::\nfind_writer(const std::string& _format)\n{\n  using std::string;\n\n  string::size_type dot = _format.rfind('.');\n\n  string ext;\n  if (dot == string::npos)\n    ext = _format;\n  else\n    ext = _format.substr(dot+1,_format.length()-(dot+1));\n\n  std::set<BaseWriter*>::const_iterator it     = writer_modules_.begin();\n  std::set<BaseWriter*>::const_iterator it_end = writer_modules_.end();\n  std::string filename = \"dummy.\" + ext;\n\n  // Try all registered modules\n  for(; it != it_end; ++it)\n    if ((*it)->can_u_write(filename))\n      return *it;\n\n  return NULL;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid\n_IOManager_::\nupdate_read_filters()\n{\n  std::set<BaseReader*>::const_iterator it     = reader_modules_.begin(),\n                                        it_end = reader_modules_.end();\n  std::string all = \"\";\n  std::string filters = \"\";\n\n  for(; it != it_end; ++it)\n  {\n    // Initialized with space, as a workaround for debug build with clang on mac\n    // which crashes if tmp is initialized with an empty string ?!\n    std::string tmp = \" \";\n\n    filters += (*it)->get_description() + \" (\";\n\n    std::istringstream iss((*it)->get_extensions());\n\n    while (iss && !iss.eof() && (iss >> tmp) )\n    {\n     tmp = \" *.\" + tmp; filters += tmp; all += tmp;\n    }\n\n    filters += \" );;\";\n  }\n\n  all = \"All files ( \" + all + \" );;\";\n\n  read_filters_ = all + filters;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid\n_IOManager_::\nupdate_write_filters()\n{\n  std::set<BaseWriter*>::const_iterator it     = writer_modules_.begin(),\n                                        it_end = writer_modules_.end();\n  std::string all;\n  std::string filters;\n\n  for(; it != it_end; ++it)\n  {\n    // Initialized with space, as a workaround for debug build with clang on mac\n    // which crashes if tmp is initialized with an empty string ?!\n    std::string s = \" \";\n\n    filters += (*it)->get_description() + \" (\";\n\n    std::istringstream iss((*it)->get_extensions());\n    while (iss && !iss.eof() && (iss >> s))\n    { s = \" *.\" + s; filters += s; all += s; }\n\n    filters += \" );;\";\n  }\n  all = \"All files ( \" + all + \" );;\";\n\n  write_filters_ = all + filters;\n}\n\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/IOManager.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------*\n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         *\n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/\n\n/*===========================================================================*\\\n *                                                                           *\n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n//=============================================================================\n//\n//  Implements the OpenMesh IOManager singleton\n//\n//=============================================================================\n\n#ifndef __IOMANAGER_HH__\n#define __IOMANAGER_HH__\n\n\n//=== INCLUDES ================================================================\n\n\n// STL\n#include <iostream>\n#include <sstream>\n#include <string>\n#include <set>\n\n// OpenMesh\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/IO/Options.hh>\n#include <OpenMesh/Core/IO/reader/BaseReader.hh>\n#include <OpenMesh/Core/IO/writer/BaseWriter.hh>\n#include <OpenMesh/Core/IO/importer/BaseImporter.hh>\n#include <OpenMesh/Core/IO/exporter/BaseExporter.hh>\n#include <OpenMesh/Core/Utils/SingletonT.hh>\n\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\nnamespace IO {\n\n\n//=== IMPLEMENTATION ==========================================================\n\n\n/** This is the real IOManager class that is later encapsulated by\n    SingletonT to enforce its uniqueness. _IOManager_ is not meant to be used\n    directly by the programmer - the IOManager alias exists for this task.\n\n    All reader/writer modules register themselves at this class. For\n    reading or writing data all modules are asked to do the job. If no\n    suitable module is found, an error is returned.\n\n    For the sake of reading, the target data structure is hidden\n    behind the BaseImporter interface that takes care of adding\n    vertices or faces.\n\n    Writing from a source structure is encapsulate similarly behind a\n    BaseExporter interface, providing iterators over vertices/faces to\n    the writer modules.\n\n    \\see \\ref mesh_io\n*/\n\nclass OPENMESHDLLEXPORT _IOManager_\n{\nprivate:\n\n  /// Constructor has nothing todo for the Manager\n  _IOManager_() {}\n\n  /// Destructor has nothing todo for the Manager\n  ~_IOManager_() {};\n\n  /** Declare the singleton getter function as friend to access the private constructor\n      and destructor\n    */\n  friend OPENMESHDLLEXPORT _IOManager_& IOManager();\n\npublic:\n\n  /**\n     Read a mesh from file _filename. The target data structure is specified\n     by the given BaseImporter. The \\c read method consecutively queries all\n     of its reader modules. True is returned upon success, false if all\n     reader modules failed to interprete _filename.\n  */\n  bool read(const std::string& _filename,\n\t    BaseImporter& _bi,\n\t    Options& _opt);\n\n/**\n     Read a mesh from open std::istream _is. The target data structure is specified\n     by the given BaseImporter. The \\c sread method consecutively queries all\n     of its reader modules. True is returned upon success, false if all\n     reader modules failed to use _is.\n  */\n  bool read(std::istream& _filename,\n\t    const std::string& _ext,\n\t    BaseImporter& _bi,\n\t    Options& _opt);\n\n\n  /** Write a mesh to file _filename. The source data structure is specified\n      by the given BaseExporter. The \\c save method consecutively queries all\n      of its writer modules. True is returned upon success, false if all\n      writer modules failed to write the requested format.\n      Options is determined by _filename's extension.\n  */\n  bool write(const std::string& _filename,\n\t     BaseExporter& _be,\n\t     Options _opt=Options::Default,\n             std::streamsize _precision = 6);\n\n/** Write a mesh to open std::ostream _os. The source data structure is specified\n      by the given BaseExporter. The \\c save method consecutively queries all\n      of its writer modules. True is returned upon success, false if all\n      writer modules failed to write the requested format.\n      Options is determined by _filename's extension.\n  */\n  bool write(std::ostream& _filename,\n\t     const std::string& _ext,\n\t     BaseExporter& _be,\n\t     Options _opt=Options::Default,\n             std::streamsize _precision = 6);\n\n\n  /// Returns true if the format is supported by one of the reader modules.\n  bool can_read( const std::string& _format ) const;\n\n  /// Returns true if the format is supported by one of the writer modules.\n  bool can_write( const std::string& _format ) const;\n\n\n  size_t binary_size(const std::string& _format,\n\t\t     BaseExporter& _be,\n\t\t     Options _opt = Options::Default)\n  {\n    const BaseWriter *bw = find_writer(_format);\n    return bw ? bw->binary_size(_be,_opt) : 0;\n  }\n\n\n\npublic: //-- QT convenience function ------------------------------------------\n\n\n  /** Returns all readable file extension + descriptions in one string.\n      File formats are separated by <c>;;</c>.\n      Convenience function for Qt file dialogs.\n  */\n  const std::string& qt_read_filters()  const { return read_filters_;  }\n\n\n  /** Returns all writeable file extension + descriptions in one string.\n      File formats are separated by <c>;;</c>.\n      Convenience function for Qt file dialogs.\n  */\n  const std::string& qt_write_filters() const { return write_filters_; }\n\n\n\nprivate:\n\n  // collect all readable file extensions\n  void update_read_filters();\n\n\n  // collect all writeable file extensions\n  void update_write_filters();\n\n\n\npublic:  //-- SYSTEM PART------------------------------------------------------\n\n\n  /** Registers a new reader module. A call to this function should be\n      implemented in the constructor of all classes derived from BaseReader.\n  */\n  bool register_module(BaseReader* _bl)\n  {\n    reader_modules_.insert(_bl);\n    update_read_filters();\n    return true;\n  }\n\n\n\n  /** Registers a new writer module. A call to this function should be\n      implemented in the constructor of all classed derived from BaseWriter.\n  */\n  bool register_module(BaseWriter* _bw)\n  {\n    writer_modules_.insert(_bw);\n    update_write_filters();\n    return true;\n  }\n\n\nprivate:\n\n  const BaseWriter *find_writer(const std::string& _format);\n\n  // stores registered reader modules\n  std::set<BaseReader*> reader_modules_;\n\n  // stores registered writer modules\n  std::set<BaseWriter*> writer_modules_;\n\n  // input filters (e.g. for Qt file dialog)\n  std::string read_filters_;\n\n  // output filters (e.g. for Qt file dialog)\n  std::string write_filters_;\n};\n\n\n//=============================================================================\n\n\n//_IOManager_*  __IOManager_instance; Causes memory leak, as destructor is never called\n\nOPENMESHDLLEXPORT _IOManager_& IOManager();\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n#endif\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/MeshIO.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------*\n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         *\n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/\n\n/*===========================================================================*\\\n *                                                                           *\n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n#ifndef OM_MESHIO_HH\n#define OM_MESHIO_HH\n\n\n//=== INCLUDES ================================================================\n\n// -------------------- system settings\n#include <OpenMesh/Core/System/config.h>\n// -------------------- check include order\n#if defined (OPENMESH_TRIMESH_ARRAY_KERNEL_HH) || \\\n    defined (OPENMESH_POLYMESH_ARRAY_KERNEL_HH)\n#  error \"Include MeshIO.hh before including a mesh type!\"\n#endif\n// -------------------- OpenMesh\n#include <OpenMesh/Core/IO/SR_store.hh>\n#include <OpenMesh/Core/IO/IOManager.hh>\n#include <OpenMesh/Core/IO/importer/ImporterT.hh>\n#include <OpenMesh/Core/IO/exporter/ExporterT.hh>\n\n\n//== NAMESPACES ==============================================================\n\nnamespace OpenMesh {\nnamespace IO   {\n\n\n//=== IMPLEMENTATION ==========================================================\n\n\n/** \\name Mesh Reading / Writing\n    Convenience functions the map to IOManager functions.\n    \\see OpenMesh::IO::_IOManager_\n*/\n//@{\n\n\n//-----------------------------------------------------------------------------\n\n\n/** \\brief Read a mesh from file _filename.\n\n    The file format is determined by the file extension.\n\n    \\note If you link statically against OpenMesh, you have to add\n          the define OM_STATIC_BUILD to your application. This will\n          ensure that readers and writers get initialized correctly.\n\n    @param _mesh     The target mesh that will be filled with the read data\n    @param _filename fill to load\n\n    @return Successful?\n */\ntemplate <class Mesh>\nbool\nread_mesh(Mesh&         _mesh,\n\t  const std::string&  _filename)\n{\n  Options opt;\n  return read_mesh(_mesh, _filename, opt, true);\n}\n\n\n/** \\brief Read a mesh from file _filename.\n\n    The file format is determined by the file extension.\n\n    \\note If you link statically against OpenMesh, you have to add\n          the define OM_STATIC_BUILD to your application. This will\n          ensure that readers and writers get initialized correctly.\n\n    @param _mesh     The target mesh that will be filled with the read data\n    @param _filename fill to load\n    @param _opt      Reader options (e.g. skip loading of normals ... depends\n                     on the reader capabilities). Note that simply passing an\n                     Options::Flag enum is not sufficient.\n    @param _clear    Clear the target data before filling it (allows to\n                     load multiple files into one Mesh). If you only want to read a mesh\n                     without clearing set _clear to false. Providing a default Options\n                     object is sufficient in this case.\n\n    @return Successful?\n*/\ntemplate <class Mesh>\nbool\nread_mesh(Mesh&         _mesh,\n\t  const std::string&  _filename,\n\t  Options&            _opt,\n\t  bool                _clear = true)\n{\n  if (_clear) _mesh.clear();\n  ImporterT<Mesh> importer(_mesh);\n  return IOManager().read(_filename, importer, _opt);\n}\n\n\n/** \\brief Read a mesh from file open std::istream.\n\n    The file format is determined by parameter _ext. _ext has to include\n    \".[format]\" in order to work properly (e.g. \".OFF\")\n\n    \\note If you link statically against OpenMesh, you have to add\n          the define OM_STATIC_BUILD to your application. This will\n          ensure that readers and writers get initialized correctly.\n\n    @param _mesh     The target mesh that will be filled with the read data\n    @param _is       stream to load the data from\n    @param _ext      The file format that is written to the stream\n    @param _opt      Reader options (e.g. skip loading of normals ... depends\n                     on the reader capabilities)\n    @param _clear    Clear the target data before filling it (allows to\n                     load multiple files into one Mesh)\n\n    @return Successful?\n*/\ntemplate <class Mesh>\nbool\nread_mesh(Mesh&         _mesh,\n\t  std::istream&       _is,\n\t  const std::string&  _ext,\n\t  Options&            _opt,\n\t  bool                _clear = true)\n{\n  if (_clear) _mesh.clear();\n  ImporterT<Mesh> importer(_mesh);\n  return IOManager().read(_is,_ext, importer, _opt);\n}\n\n\n\n//-----------------------------------------------------------------------------\n\n\n/** \\brief Write a mesh to the file _filename.\n\n    The file format is determined by _filename's extension.\n\n    \\note If you link statically against OpenMesh, you have to add\n          the define OM_STATIC_BUILD to your application. This will\n          ensure that readers and writers get initialized correctly.\n\n    @param _mesh     The mesh that will be written to file\n    @param _filename output filename\n    @param _opt      Writer options (e.g. writing of normals ... depends\n                     on the writer capabilities)\n    @param _precision specifies stream precision for ascii files\n\n    @return Successful?\n*/\ntemplate <class Mesh>\nbool write_mesh(const Mesh&        _mesh,\n                const std::string& _filename,\n                Options            _opt = Options::Default,\n                std::streamsize    _precision = 6)\n{\n  ExporterT<Mesh> exporter(_mesh);\n  return IOManager().write(_filename, exporter, _opt, _precision);\n}\n\n\n//-----------------------------------------------------------------------------\n\n\n/** Write a mesh to an open std::ostream.\n\n    The file format is determined by parameter _ext. _ext has to include\n    \".[format]\" in order to work properly (e.g. \".OFF\")\n\n    \\note If you link statically against OpenMesh, you have to add\n          the define OM_STATIC_BUILD to your application. This will\n          ensure that readers and writers get initialized correctly.\n\n    @param _mesh     The mesh that will be written to file\n    @param _os       output stream to write into\n    @param _ext      extension defining the type of output\n    @param _opt      Writer options (e.g. writing of normals ... depends\n                     on the writer capabilities)\n    @param _precision specifies stream precision for ascii files\n\n    @return Successful?\n*/\ntemplate <class Mesh>\nbool write_mesh(const Mesh&        _mesh,\n\t\tstd::ostream&      _os,\n\t        const std::string& _ext,\n                Options            _opt = Options::Default,\n                std::streamsize    _precision = 6)\n{\n  ExporterT<Mesh> exporter(_mesh);\n  return IOManager().write(_os,_ext, exporter, _opt, _precision);\n}\n\n\n//-----------------------------------------------------------------------------\n\n/** \\brief Get binary size of data\n\n  This function calls the corresponding writer which calculates the size\n  of the data that would be written to a binary file\n\n  The file format is determined by parameter _ext. _ext has to include\n  \".[format]\" in order to work properly (e.g. \".OFF\")\n\n  @param _mesh Mesh to write\n  @param _ext extension of the file (used to determine the writing module)\n  @param _opt  Writer options (e.g. writing of normals ... depends\n               on the writer capabilities)\n\n  @return Binary size in bytes used when writing the data\n*/\ntemplate <class Mesh>\nsize_t binary_size(const Mesh&        _mesh,\n                   const std::string& _ext,\n                   Options            _opt = Options::Default)\n{\n  ExporterT<Mesh> exporter(_mesh);\n  return IOManager().binary_size(_ext, exporter, _opt);\n}\n\n\n//-----------------------------------------------------------------------------\n\n//@}\n\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n#if defined(OM_STATIC_BUILD) || defined(ARCH_DARWIN)\n#  include <OpenMesh/Core/IO/IOInstances.hh>\n#endif\n//=============================================================================\n#endif\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/OFFFormat.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n#ifndef OPENMESH_IO_OFFFORMAT_HH\n#define OPENMESH_IO_OFFFORMAT_HH\n\n\n//=== INCLUDES ================================================================\n\n\n// OpenMesh\n#include <OpenMesh/Core/System/config.h>\n\n\n//== NAMESPACES ==============================================================\n\n\nnamespace OpenMesh {\nnamespace IO   {\n\n\n//=== IMPLEMENTATION ==========================================================\n\n\n/** \\name Mesh Reading / Writing\n    Option for writer modules.\n*/\n//@{\n\n\n//-----------------------------------------------------------------------------\n\n#ifndef DOXY_IGNORE_THIS\n\nstruct OPENMESHDLLEXPORT OFFFormat\n{\n   typedef int   integer_type;\n   typedef float float_type;\n};\n   \n#endif\n\n\n\n//@}\n\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n#endif\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/OMFormat.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  Helper Functions for binary reading / writing\n//\n//=============================================================================\n\n//== INCLUDES =================================================================\n\n#include <OpenMesh/Core/IO/OMFormat.hh>\n#include <algorithm>\n#include <iomanip>\n\n//== NAMESPACES ===============================================================\n\nnamespace OpenMesh {\nnamespace IO {\nnamespace OMFormat {\n\n//== IMPLEMENTATION ===========================================================\n\n  Chunk::Integer_Size needed_bits( size_t s )\n  {\n    if (s <= 0x000100) return Chunk::Integer_8;\n    if (s <= 0x010000) return Chunk::Integer_16;\n\n#if 0\n    // !Not tested yet! This most probably won't work!\n    // NEED a 64bit system!\n    if ( (sizeof( size_t ) == 8) && (s >= 0x100000000) )\n      return Chunk::Integer_64;\n#endif\n\n    return Chunk::Integer_32;    \n  }\n\n//-----------------------------------------------------------------------------\n\n  uint16& \n  operator << (uint16& val, const Chunk::Header& hdr)\n  {\n    val = 0;\n    val |= hdr.name_   << OMFormat::Chunk::OFF_NAME;\n    val |= hdr.entity_ << OMFormat::Chunk::OFF_ENTITY;\n    val |= hdr.type_   << OMFormat::Chunk::OFF_TYPE;  \n    val |= hdr.signed_ << OMFormat::Chunk::OFF_SIGNED;\n    val |= hdr.float_  << OMFormat::Chunk::OFF_FLOAT; \n    val |= hdr.dim_    << OMFormat::Chunk::OFF_DIM;   \n    val |= hdr.bits_   << OMFormat::Chunk::OFF_BITS;  \n    return val;\n  }\n\n\n//-----------------------------------------------------------------------------\n\n  Chunk::Header&\n  operator << (Chunk::Header& hdr, const uint16 val)\n  {\n    hdr.reserved_ = 0;\n    hdr.name_     = val >> OMFormat::Chunk::OFF_NAME;\n    hdr.entity_   = val >> OMFormat::Chunk::OFF_ENTITY;\n    hdr.type_     = val >> OMFormat::Chunk::OFF_TYPE;\n    hdr.signed_   = val >> OMFormat::Chunk::OFF_SIGNED;\n    hdr.float_    = val >> OMFormat::Chunk::OFF_FLOAT;\n    hdr.dim_      = val >> OMFormat::Chunk::OFF_DIM;\n    hdr.bits_     = val >> OMFormat::Chunk::OFF_BITS;\n    return hdr;\n  }\n\n//-----------------------------------------------------------------------------\n\n  const char *as_string(Chunk::Entity e)\n  {\n    switch(e)\n    {    \n      case Chunk::Entity_Vertex:   return \"Vertex\";\n      case Chunk::Entity_Mesh:     return \"Mesh\";\n      case Chunk::Entity_Edge:     return \"Edge\";\n      case Chunk::Entity_Halfedge: return \"Halfedge\";\n      case Chunk::Entity_Face:     return \"Face\";\n      default:\n\tstd::clog << \"as_string(Chunk::Entity): Invalid value!\";\n    }\n    return NULL;\n  }\n\n\n//-----------------------------------------------------------------------------\n\n  const char *as_string(Chunk::Type t)\n  {\n    switch(t)\n    {    \n      case Chunk::Type_Pos:      return \"Pos\";\n      case Chunk::Type_Normal:   return \"Normal\";\n      case Chunk::Type_Texcoord: return \"Texcoord\";\n      case Chunk::Type_Status:   return \"Status\";\n      case Chunk::Type_Color:    return \"Color\";\n      case Chunk::Type_Custom:   return \"Custom\";\n      case Chunk::Type_Topology: return \"Topology\";\n    }\n    return NULL;\n  }\n\n\n//-----------------------------------------------------------------------------\n\n  const char *as_string(Chunk::Dim d)\n  {\n    switch(d)\n    {    \n      case Chunk::Dim_1D: return \"1D\";\n      case Chunk::Dim_2D: return \"2D\";\n      case Chunk::Dim_3D: return \"3D\";\n      case Chunk::Dim_4D: return \"4D\";\n      case Chunk::Dim_5D: return \"5D\";\n      case Chunk::Dim_6D: return \"6D\";\n      case Chunk::Dim_7D: return \"7D\";\n      case Chunk::Dim_8D: return \"8D\";\n    }\n    return NULL;\n  }\n\n\n//-----------------------------------------------------------------------------\n\n  const char *as_string(Chunk::Integer_Size d)\n  {\n    switch(d)\n    {    \n      case Chunk::Integer_8  : return \"8\";\n      case Chunk::Integer_16 : return \"16\";\n      case Chunk::Integer_32 : return \"32\";\n      case Chunk::Integer_64 : return \"64\";\n    }\n    return NULL;\n  }\n\n  const char *as_string(Chunk::Float_Size d)\n  {\n    switch(d)\n    {    \n      case Chunk::Float_32 : return \"32\";\n      case Chunk::Float_64 : return \"64\";\n      case Chunk::Float_128: return \"128\";\n    }\n    return NULL;\n  }\n\n\n//-----------------------------------------------------------------------------\n\n  std::ostream& operator << ( std::ostream& _os, const Chunk::Header& _c )\n  {\n    _os << \"Chunk Header : 0x\" << std::setw(4)\n\t<< std::hex << (*(uint16*)(&_c)) << std::dec << std::endl;\n    _os << \"entity = \" \n\t<< as_string(Chunk::Entity(_c.entity_)) << std::endl;\n    _os << \"type   = \" \n\t<< as_string(Chunk::Type(_c.type_));\n    if ( Chunk::Type(_c.type_)!=Chunk::Type_Custom) \n    {\n      _os << std::endl \n\t  << \"signed = \" \n\t  << _c.signed_ << std::endl;\n      _os << \"float  = \" \n\t  << _c.float_ << std::endl;\n      _os << \"dim    = \" \n\t  << as_string(Chunk::Dim(_c.dim_)) << std::endl;\n      _os << \"bits   = \" \n\t  << (_c.float_\n\t      ? as_string(Chunk::Float_Size(_c.bits_)) \n\t      : as_string(Chunk::Integer_Size(_c.bits_)));\n    }\n    return _os;\n  }\n\n\n//-----------------------------------------------------------------------------\n\n  std::ostream& operator << ( std::ostream& _os, const Header& _h )\n  {\n    _os << \"magic   = '\" << _h.magic_[0] << _h.magic_[1] << \"'\\n\"\n\t<< \"mesh    = '\" << _h.mesh_ << \"'\\n\"\n\t<< \"version = 0x\" << std::hex << (uint16)_h.version_ << std::dec\n\t<< \" (\" << major_version(_h.version_) \n\t<< \".\"  << minor_version(_h.version_) << \")\\n\"\n\t<< \"#V      = \" << _h.n_vertices_ << std::endl\n\t<< \"#F      = \" << _h.n_faces_ << std::endl\n\t<< \"#E      = \" << _h.n_edges_;\n    return _os;\n  }\n\n\n} // namespace OMFormat\n  // --------------------------------------------------------------------------\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/OMFormat.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------*\n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         *\n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/\n\n/*===========================================================================*\\\n *                                                                           *\n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n#ifndef OPENMESH_IO_OMFORMAT_HH\n#define OPENMESH_IO_OMFORMAT_HH\n\n\n//=== INCLUDES ================================================================\n\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/System/omstream.hh>\n#include <OpenMesh/Core/IO/SR_store.hh>\n#include <OpenMesh/Core/Utils/GenProg.hh>\n#include <OpenMesh/Core/Utils/Endian.hh>\n#include <OpenMesh/Core/Utils/vector_traits.hh>\n// --------------------\n#include <iostream>\n#if defined(OM_CC_GCC) && (OM_GCC_VERSION < 30000)\n#  include <OpenMesh/Tools/Utils/NumLimitsT.hh>\n#  define OM_MISSING_HEADER_LIMITS 1\n#else\n#  include <limits>\n#endif\n\n\n//== NAMESPACES ==============================================================\n\n#ifndef DOXY_IGNORE_THIS\nnamespace OpenMesh {\nnamespace IO   {\nnamespace OMFormat {\n\n\n//=== IMPLEMENTATION ==========================================================\n\n\n/** \\name Mesh Reading / Writing\n*/\n//@{\n\n//-----------------------------------------------------------------------------\n\n  // <:Header>\n  // <:Comment>\n  // Chunk 0\n  //   <:ChunkHeader>\n  //   <:Comment>\n  //   data\n  // Chunk 1\n  //   <:ChunkHeader>\n  //   <:Comment>\n  //   data\n  // .\n  // .\n  // .\n  // Chunk N\n\n  //\n  // NOTICE!\n  //\n  // The usage of data types who differ in size\n  // on different pc architectures (32/64 bit) and/or\n  // operating systems, e.g. (unsigned) long, size_t,\n  // is not recommended because of inconsistencies\n  // in case of cross writing and reading.\n  //\n  // Basic types that are supported are:\n\n\n  typedef unsigned char      uchar;\n  typedef uint8_t            uint8;\n  typedef uint16_t           uint16;\n  typedef uint32_t           uint32;\n  typedef uint64_t           uint64;\n  typedef int8_t             int8;\n  typedef int16_t            int16;\n  typedef int32_t            int32;\n  typedef int64_t            int64;\n  typedef float32_t          float32;\n  typedef float64_t          float64;\n\n  struct Header\n  {\n    uchar  magic_[2]; // OM\n    uchar  mesh_;    // [T]riangles, [Q]uads, [P]olygonals\n    uint8  version_;\n    uint32 n_vertices_;\n    uint32 n_faces_;\n    uint32 n_edges_;\n\n    size_t store( std::ostream& _os, bool _swap ) const\n    {\n      _os.write( (char*)this, 4); // magic_, mesh_, version_\n      size_t bytes = 4;\n      bytes += binary<uint32_t>::store( _os, n_vertices_, _swap );\n      bytes += binary<uint32_t>::store( _os, n_faces_, _swap );\n      bytes += binary<uint32_t>::store( _os, n_edges_, _swap );\n      return bytes;\n    }\n\n    size_t restore( std::istream& _is, bool _swap )\n    {\n      if (_is.read( (char*)this, 4 ).eof())\n\treturn 0;\n\n      size_t bytes = 4;\n      bytes += binary<uint32_t>::restore( _is, n_vertices_, _swap );\n      bytes += binary<uint32_t>::restore( _is, n_faces_, _swap );\n      bytes += binary<uint32_t>::restore( _is, n_edges_, _swap );\n      return bytes;\n    }\n\n  };\n\n  struct Chunk\n  {\n    // Hardcoded this size to an uint32 to make the system 32/64 bit compatible.\n    // Needs further investigation!\n    typedef uint32 esize_t; // element size, used for custom properties\n\n    enum Type {\n      Type_Pos       = 0x00,\n      Type_Normal    = 0x01,\n      Type_Texcoord  = 0x02,\n      Type_Status    = 0x03,\n      Type_Color     = 0x04,\n      Type_Custom    = 0x06,\n      Type_Topology  = 0x07\n    };\n\n    enum Entity {\n      Entity_Vertex    = 0x00,\n      Entity_Mesh      = 0x01,\n      Entity_Face      = 0x02,\n      Entity_Edge      = 0x04,\n      Entity_Halfedge  = 0x06\n    };\n\n    enum Dim {\n      Dim_1D = 0x00,\n      Dim_2D = 0x01,\n      Dim_3D = 0x02,\n      Dim_4D = 0x03,\n      Dim_5D = 0x04,\n      Dim_6D = 0x05,\n      Dim_7D = 0x06,\n      Dim_8D = 0x07\n    };\n\n    enum Integer_Size {\n      Integer_8   = 0x00, // 1 byte for (unsigned) char\n      Integer_16  = 0x01, // 2 bytes for short\n      Integer_32  = 0x02, // 4 bytes for long\n      Integer_64  = 0x03  // 8 bytes for long long\n    };\n\n    enum Float_Size {\n      Float_32  = 0x00, //  4 bytes for float\n      Float_64  = 0x01, //  8 bytes for double\n      Float_128 = 0x02  // 16 bytes for long double (an assumption!)\n    };\n\n    static const int SIZE_RESERVED = 1; //  1\n    static const int SIZE_NAME     = 1; //  2\n    static const int SIZE_ENTITY   = 3; //  5\n    static const int SIZE_TYPE     = 4; //  9\n\n    static const int SIZE_SIGNED   = 1; // 10\n    static const int SIZE_FLOAT    = 1; // 11\n    static const int SIZE_DIM      = 3; // 14\n    static const int SIZE_BITS     = 2; // 16\n\n    static const int OFF_RESERVED = 0;                          //  0\n    static const int OFF_NAME     = SIZE_RESERVED + OFF_RESERVED; //  2\n    static const int OFF_ENTITY   = SIZE_NAME     + OFF_NAME;   //  3\n    static const int OFF_TYPE     = SIZE_ENTITY   + OFF_ENTITY; //  5\n    static const int OFF_SIGNED   = SIZE_TYPE     + OFF_TYPE;   //  9\n    static const int OFF_FLOAT    = SIZE_SIGNED   + OFF_SIGNED; // 10\n    static const int OFF_DIM      = SIZE_FLOAT    + OFF_FLOAT;  // 11\n    static const int OFF_BITS     = SIZE_DIM      + OFF_DIM;    // 14\n\n    // !Attention! When changing the bit size, the operators\n    // << (uint16, Header) and << (Header, uint16) must be changed as well\n    //\n    // Entries signed_, float_, dim_, bits_ are not used when type_\n    // equals Type_Custom\n    //\n    struct Header // 16 bits long\n    {\n      unsigned reserved_: SIZE_RESERVED;\n      unsigned name_    : SIZE_NAME;   // 1 named property, 0 anonymous\n      unsigned entity_  : SIZE_ENTITY; // 0 vertex, 1 mesh, 2 edge,\n                                       // 4 halfedge, 6 face\n      unsigned type_    : SIZE_TYPE;   // 0 pos, 1 normal, 2 texcoord,\n                                       // 3 status, 4 color 6 custom 7 topology\n      unsigned signed_  : SIZE_SIGNED; // bool\n      unsigned float_   : SIZE_FLOAT;  // bool\n      unsigned dim_     : SIZE_DIM;    // 0 1D, 1 2D, 2 3D, .., 7 8D\n      unsigned bits_    : SIZE_BITS;   // {8, 16, 32, 64} | {32, 64, 128}\n                                       // (integer)         (float)\n      unsigned unused_  : 16; // fill up to 32 bits\n    }; // struct Header\n\n\n    class PropertyName : public std::string\n    {\n    public:\n\n      static const size_t size_max = 256;\n\n      PropertyName( ) { }\n\n      PropertyName( const std::string& _name ) { *this = _name; }\n\n      bool is_valid() const { return is_valid( size() ); }\n\n      static bool is_valid( size_t _s ) { return _s <= size_max; }\n\n      PropertyName& operator = ( const std::string& _rhs )\n      {\n\tassert( is_valid( _rhs.size() ) );\n\n\tif ( is_valid( _rhs.size() ) )\n\t  std::string::operator = ( _rhs );\n\telse\n\t{\n\t  omerr() << \"Warning! Property name too long. Will be shortened!\\n\";\n\t  this->std::string::operator = ( _rhs.substr(0, size_max) );\n\t}\n\n\treturn *this;\n      }\n\n    };\n\n  }; // Chunk\n\n  // ------------------------------------------------------------ Helper\n\n  // -------------------- get size information\n\n  /// Return size of header in bytes.\n  inline size_t header_size(void) { return sizeof(Header); }\n\n\n  /// Return size of chunk header in bytes.\n  inline size_t chunk_header_size( void ) { return sizeof(uint16); }\n\n\n  /// Return the size of a scale in bytes.\n  inline size_t scalar_size( const Chunk::Header& _hdr )\n  {\n    return _hdr.float_ ? (0x01 << _hdr.bits_) : (0x04 << _hdr.bits_);\n  }\n\n\n  /// Return the dimension of the vector in a chunk\n  inline size_t dimensions(const Chunk::Header& _chdr) { return _chdr.dim_+1; }\n\n\n  /// Return the size of a vector in bytes.\n  inline size_t vector_size( const Chunk::Header& _chdr )\n  {\n    return dimensions(_chdr)*scalar_size(_chdr);\n  }\n\n\n  /// Return the size of chunk data in bytes\n  inline size_t chunk_data_size( Header& _hdr,  Chunk::Header& _chunk_hdr )\n  {\n    size_t C     = 0;\n\n    switch( _chunk_hdr.entity_ )\n    {\n      case Chunk::Entity_Vertex:   C  = _hdr.n_vertices_; break;\n      case Chunk::Entity_Face:     C  = _hdr.n_faces_;    break;\n      case Chunk::Entity_Halfedge: C  = _hdr.n_edges_;    // no break!\n      case Chunk::Entity_Edge:     C += _hdr.n_edges_;    break;\n      case Chunk::Entity_Mesh:     C  = 1;                break;\n      default:\n        std::cerr << \"Invalid value in _chunk_hdr.entity_\\n\";\n        assert( false );\n        break;\n    }\n\n    return C * vector_size( _chunk_hdr );\n  }\n\n  inline size_t chunk_size( Header& _hdr, Chunk::Header& _chunk_hdr )\n  {\n    return chunk_header_size() + chunk_data_size( _hdr, _chunk_hdr );\n  }\n\n  // -------------------- convert from Chunk::Header to storage type\n\n  uint16& operator << (uint16& val, const Chunk::Header& hdr);\n  Chunk::Header& operator << (Chunk::Header& hdr, const uint16 val);\n\n\n  // -------------------- type information\n\n  template <typename T> bool is_float(const T&)\n  {\n#if defined(OM_MISSING_HEADER_LIMITS)\n    return !Utils::NumLimitsT<T>::is_integer();\n#else\n    return !std::numeric_limits<T>::is_integer;\n#endif\n  }\n\n  template <typename T> bool is_integer(const T)\n  {\n#if defined(OM_MISSING_HEADER_LIMITS)\n    return Utils::NumLimitsT<T>::is_integer();\n#else\n    return std::numeric_limits<T>::is_integer;\n#endif\n  }\n\n  template <typename T> bool is_signed(const T&)\n  {\n#if defined(OM_MISSING_HEADER_LIMITS)\n    return Utils::NumLimitsT<T>::is_signed();\n#else\n    return std::numeric_limits<T>::is_signed;\n#endif\n  }\n\n  // -------------------- conversions (format type <- type/value)\n\n  template <typename VecType>\n  inline\n  Chunk::Dim dim( VecType )\n  {\n    assert( vector_traits< VecType >::size() < 9 );\n    return static_cast<Chunk::Dim>(vector_traits< VecType >::size() - 1);\n  }\n\n  template <typename VecType>\n  inline\n  Chunk::Dim dim( const Chunk::Header& _hdr )\n  {\n    return static_cast<Chunk::Dim>( _hdr.dim_ );\n  }\n\n  // calc minimum (power-of-2) number of bits needed\n  Chunk::Integer_Size needed_bits( size_t s );\n\n  // Convert size of type to Integer_Size\n#ifdef NDEBUG\n  template <typename T> Chunk::Integer_Size integer_size(const T&)\n#else\n  template <typename T> Chunk::Integer_Size integer_size(const T& d)\n#endif\n  {\n    assert( is_integer(d) );\n\n    switch( sizeof(T) )\n    {\n      case  1: return OMFormat::Chunk::Integer_8;\n      case  2: return OMFormat::Chunk::Integer_16;\n      case  4: return OMFormat::Chunk::Integer_32;\n      case  8: return OMFormat::Chunk::Integer_64;\n      default:\n        std::cerr << \"Invalid value in integer_size\\n\";\n        assert( false );\n        break;\n    }\n    return Chunk::Integer_Size(0);\n  }\n\n\n  // Convert size of type to FLoat_Size\n#ifdef NDEBUG\n  template <typename T> Chunk::Float_Size float_size(const T&)\n#else\n  template <typename T> Chunk::Float_Size float_size(const T& d)\n#endif\n  {\n    assert( is_float(d) );\n\n    switch( sizeof(T) )\n    {\n      case  4: return OMFormat::Chunk::Float_32;\n      case  8: return OMFormat::Chunk::Float_64;\n      case 16: return OMFormat::Chunk::Float_128;\n      default:\n        std::cerr << \"Invalid value in float_size\\n\";\n        assert( false );\n        break;\n    }\n    return Chunk::Float_Size(0);\n  }\n\n  // Return the storage type (Chunk::Header::bits_)\n  template <typename T>\n  inline\n  unsigned int bits(const T& val)\n  {\n    return is_integer(val)\n      ? (static_cast<unsigned int>(integer_size(val)))\n      : (static_cast<unsigned int>(float_size(val)));\n  }\n\n  // -------------------- create/read version\n\n  inline uint8 mk_version(const uint16 major, const uint16 minor)\n  { return (major & 0x07) << 5 | (minor & 0x1f); }\n\n\n  inline uint16 major_version(const uint8 version)\n  { return (version >> 5) & 0x07; }\n\n\n  inline uint16 minor_version(const uint8 version)\n  { return (version & 0x001f); }\n\n\n  // ---------------------------------------- convenience functions\n\n  const char *as_string(Chunk::Type t);\n  const char *as_string(Chunk::Entity e);\n  const char *as_string(Chunk::Dim d);\n  const char *as_string(Chunk::Integer_Size d);\n  const char *as_string(Chunk::Float_Size d);\n\n  std::ostream& operator << ( std::ostream& _os, const Header& _h );\n  std::ostream& operator << ( std::ostream& _os, const Chunk::Header& _c );\n\n//@}\n} // namespace OMFormat\n\n  // -------------------- (re-)store header\n\n  template <> inline\n  size_t store( std::ostream& _os, const OMFormat::Header& _hdr, bool _swap)\n  { return _hdr.store( _os, _swap ); }\n\n  template <> inline\n  size_t restore( std::istream& _is, OMFormat::Header& _hdr, bool _swap )\n  { return _hdr.restore( _is, _swap ); }\n\n\n  // -------------------- (re-)store chunk header\n\n  template <> inline\n  size_t\n  store( std::ostream& _os, const OMFormat::Chunk::Header& _hdr, bool _swap)\n  {\n    OMFormat::uint16 val; val << _hdr;\n    return binary<uint16_t>::store( _os, val, _swap );\n  }\n\n  template <> inline\n  size_t\n  restore( std::istream& _is, OMFormat::Chunk::Header& _hdr, bool _swap )\n  {\n    OMFormat::uint16 val;\n    size_t bytes = binary<uint16_t>::restore( _is, val, _swap );\n\n    _hdr << val;\n\n    return bytes;\n  }\n\n  // -------------------- (re-)store integer with wanted number of bits (bytes)\n\n  typedef GenProg::True  t_signed;\n  typedef GenProg::False t_unsigned;\n\n  // helper to store a an integer\n  template< typename T >\n  size_t\n  store( std::ostream& _os,\n\t const T& _val,\n\t OMFormat::Chunk::Integer_Size _b,\n\t bool _swap,\n\t t_signed);\n\n  // helper to store a an unsigned integer\n  template< typename T >\n  size_t\n  store( std::ostream& _os,\n\t const T& _val,\n\t OMFormat::Chunk::Integer_Size _b,\n\t bool _swap,\n\t t_unsigned);\n\n  /// Store an integer with a wanted number of bits\n  template< typename T >\n  inline\n  size_t\n  store( std::ostream& _os,\n\t const T& _val,\n\t OMFormat::Chunk::Integer_Size _b,\n\t bool _swap)\n  {\n    assert( OMFormat::is_integer( _val ) );\n\n    if ( OMFormat::is_signed( _val ) )\n      return store( _os, _val, _b, _swap, t_signed()   );\n    return   store( _os, _val, _b, _swap, t_unsigned() );\n  }\n\n  // helper to store a an integer\n  template< typename T > inline\n  size_t restore( std::istream& _is,\n\t\t  T& _val,\n\t\t  OMFormat::Chunk::Integer_Size _b,\n\t\t  bool _swap,\n\t\t  t_signed);\n\n  // helper to store a an unsigned integer\n  template< typename T > inline\n  size_t restore( std::istream& _is,\n\t\t  T& _val,\n\t\t  OMFormat::Chunk::Integer_Size _b,\n\t\t  bool _swap,\n\t\t  t_unsigned);\n\n  /// Restore an integer with a wanted number of bits\n  template< typename T >\n  inline\n  size_t\n  restore( std::istream& _is,\n\t   T& _val,\n\t   OMFormat::Chunk::Integer_Size _b,\n\t   bool _swap)\n  {\n    assert( OMFormat::is_integer( _val ) );\n\n    if ( OMFormat::is_signed( _val ) )\n      return restore( _is, _val, _b, _swap, t_signed() );\n    return restore( _is, _val, _b, _swap, t_unsigned() );\n  }\n\n\n  //\n  // ---------------------------------------- storing vectors\n  template <typename VecT> inline\n  size_t store( std::ostream& _os, const VecT& _vec, GenProg::Int2Type<2>,\n\t\tbool _swap )\n  {\n    size_t bytes =  store( _os, _vec[0], _swap );\n    bytes += store( _os, _vec[1], _swap );\n    return bytes;\n  }\n\n  template <typename VecT> inline\n  size_t store( std::ostream& _os, const VecT& _vec, GenProg::Int2Type<3>,\n\t\tbool _swap )\n  {\n    size_t bytes =  store( _os, _vec[0], _swap );\n    bytes += store( _os, _vec[1], _swap );\n    bytes += store( _os, _vec[2], _swap );\n    return bytes;\n  }\n\n  template <typename VecT> inline\n  size_t store( std::ostream& _os, const VecT& _vec, GenProg::Int2Type<4>,\n\t\tbool _swap )\n  {\n    size_t bytes =  store( _os, _vec[0], _swap );\n    bytes += store( _os, _vec[1], _swap );\n    bytes += store( _os, _vec[2], _swap );\n    bytes += store( _os, _vec[3], _swap );\n    return bytes;\n  }\n\n  template <typename VecT> inline\n  size_t store( std::ostream& _os, const VecT& _vec, GenProg::Int2Type<1>,\n\t\tbool _swap )\n  {\n    return store( _os, _vec[0], _swap );\n  }\n\n  /// storing a vector type\n  template <typename VecT> inline\n  size_t vector_store( std::ostream& _os, const VecT& _vec, bool _swap )\n  {\n    return store( _os, _vec,\n\t\t  GenProg::Int2Type< vector_traits<VecT>::size_ >(),\n\t\t  _swap );\n  }\n\n  // ---------------------------------------- restoring vectors\n  template <typename VecT>\n  inline\n  size_t\n  restore( std::istream& _is, VecT& _vec, GenProg::Int2Type<2>,\n\t bool _swap )\n  {\n    size_t bytes =  restore( _is, _vec[0], _swap );\n    bytes += restore( _is, _vec[1], _swap );\n    return bytes;\n  }\n\n  template <typename VecT>\n  inline\n  size_t\n  restore( std::istream& _is, VecT& _vec, GenProg::Int2Type<3>,\n\t bool _swap )\n  {\n    typedef typename vector_traits<VecT>::value_type scalar_type;\n    size_t bytes;\n\n    bytes  = binary<scalar_type>::restore( _is, _vec[0], _swap );\n    bytes += binary<scalar_type>::restore( _is, _vec[1], _swap );\n    bytes += binary<scalar_type>::restore( _is, _vec[2], _swap );\n    return bytes;\n  }\n\n  template <typename VecT>\n  inline\n  size_t\n  restore( std::istream& _is, VecT& _vec, GenProg::Int2Type<4>,\n\t   bool _swap )\n  {\n    typedef typename vector_traits<VecT>::value_type scalar_type;\n    size_t bytes;\n\n    bytes  = binary<scalar_type>::restore( _is, _vec[0], _swap );\n    bytes += binary<scalar_type>::restore( _is, _vec[1], _swap );\n    bytes += binary<scalar_type>::restore( _is, _vec[2], _swap );\n    bytes += binary<scalar_type>::restore( _is, _vec[3], _swap );\n    return bytes;\n  }\n\n  template <typename VecT>\n  inline\n  size_t\n  restore( std::istream& _is, VecT& _vec, GenProg::Int2Type<1>,\n\t bool _swap )\n  {\n    return restore( _is, _vec[0], _swap );\n  }\n\n  /// Restoring a vector type\n  template <typename VecT>\n  inline\n  size_t\n  vector_restore( std::istream& _is, VecT& _vec, bool _swap )\n  {\n    return restore( _is, _vec,\n\t\t    GenProg::Int2Type< vector_traits<VecT>::size_ >(),\n\t\t    _swap );\n  }\n\n\n  // ---------------------------------------- storing property names\n\n  template <>\n  inline\n  size_t store( std::ostream& _os, const OMFormat::Chunk::PropertyName& _pn,\n\t\tbool _swap )\n  {\n    store( _os, _pn.size(), OMFormat::Chunk::Integer_8, _swap ); // 1 byte\n    if ( _pn.size() )\n      _os.write( _pn.c_str(), _pn.size() ); // size bytes\n    return _pn.size() + 1;\n  }\n\n  template <>\n  inline\n  size_t restore( std::istream& _is, OMFormat::Chunk::PropertyName& _pn,\n\t\t  bool _swap )\n  {\n    size_t size;\n\n    restore( _is, size, OMFormat::Chunk::Integer_8, _swap); // 1 byte\n\n    assert( OMFormat::Chunk::PropertyName::is_valid( size ) );\n\n    if ( size > 0 )\n    {\n      char buf[256];\n      _is.read( buf, size ); // size bytes\n      buf[size] = '\\0';\n      _pn.resize(size);\n      _pn = buf;\n    }\n    return size+1;\n  }\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n#endif\n//=============================================================================\n#if defined(OM_MISSING_HEADER_LIMITS)\n#  undef OM_MISSING_HEADER_LIMITS\n#endif\n//=============================================================================\n#if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_IO_OMFORMAT_CC)\n#  define OPENMESH_IO_OMFORMAT_TEMPLATES\n#  include \"OMFormatT.cc\"\n#endif\n//=============================================================================\n#endif\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/OMFormatT.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  Helper Functions for binary reading / writing\n//\n//=============================================================================\n\n\n#define OPENMESH_IO_OMFORMAT_CC\n\n\n//== INCLUDES =================================================================\n\n#include <OpenMesh/Core/IO/OMFormat.hh>\n#include <algorithm>\n#include <iomanip>\n\n//== NAMESPACES ===============================================================\n\nnamespace OpenMesh {\nnamespace IO {\n\n  // helper to store a an integer\n  template< typename T > \n  size_t \n  store( std::ostream& _os, \n\t const T& _val, \n\t OMFormat::Chunk::Integer_Size _b, \n\t bool _swap,\n\t t_signed)\n  {    \n    assert( OMFormat::is_integer( _val ) );\n\n    switch( _b ) \n    {\n      case OMFormat::Chunk::Integer_8:\n      { \t\n\tOMFormat::int8 v = static_cast<OMFormat::int8>(_val);\n\treturn store( _os, v, _swap );\n      }\n      case OMFormat::Chunk::Integer_16:\n      { \n\tOMFormat::int16 v = static_cast<OMFormat::int16>(_val);\n\treturn store( _os, v, _swap );\n      }\n      case OMFormat::Chunk::Integer_32:\n      { \n\tOMFormat::int32 v = static_cast<OMFormat::int32>(_val);\n\treturn store( _os, v, _swap );\n      }      \n      case OMFormat::Chunk::Integer_64:\n      { \n\tOMFormat::int64 v = static_cast<OMFormat::int64>(_val);\n\treturn store( _os, v, _swap );\n      }\n    }\n    return 0;\n  }\n\n\n  // helper to store a an unsigned integer\n  template< typename T > \n  size_t \n  store( std::ostream& _os, \n\t const T& _val, \n\t OMFormat::Chunk::Integer_Size _b, \n\t bool _swap,\n\t t_unsigned)\n  {    \n    assert( OMFormat::is_integer( _val ) );\n\n    switch( _b ) \n    {\n      case OMFormat::Chunk::Integer_8:\n      { \n\tOMFormat::uint8 v = static_cast<OMFormat::uint8>(_val);\n\treturn store( _os, v, _swap );\n      }\n      case OMFormat::Chunk::Integer_16:\n      { \n\tOMFormat::uint16 v = static_cast<OMFormat::uint16>(_val);\n\treturn store( _os, v, _swap );\n      }\n      case OMFormat::Chunk::Integer_32:\n      { \n\tOMFormat::uint32 v = static_cast<OMFormat::uint32>(_val);\n\treturn store( _os, v, _swap );\n      }\n      \n      case OMFormat::Chunk::Integer_64:\n      { \n\tOMFormat::uint64 v = static_cast<OMFormat::uint64>(_val);\n\treturn store( _os, v, _swap );\n      }\n    }\n    return 0;\n  }\n\n\n  // helper to store a an integer\n  template< typename T > \n  size_t \n  restore( std::istream& _is, \n\t   T& _val, \n\t   OMFormat::Chunk::Integer_Size _b, \n\t   bool _swap,\n\t   t_signed)\n  {    \n    assert( OMFormat::is_integer( _val ) );\n    size_t bytes = 0;\n\n    switch( _b ) \n    {\n      case OMFormat::Chunk::Integer_8:\n      { \t\n\tOMFormat::int8 v;\n\tbytes = restore( _is, v, _swap );\n\t_val = static_cast<T>(v);\n\tbreak;\n      }\n      case OMFormat::Chunk::Integer_16:\n      { \n\tOMFormat::int16 v;\n\tbytes = restore( _is, v, _swap );\n\t_val = static_cast<T>(v);\n      }\n      case OMFormat::Chunk::Integer_32:\n      { \n\tOMFormat::int32 v;\n\tbytes = restore( _is, v, _swap );\n\t_val = static_cast<T>(v);\n      }      \n      case OMFormat::Chunk::Integer_64:\n      { \n\tOMFormat::int64 v;\n\tbytes = restore( _is, v, _swap );\n\t_val = static_cast<T>(v);\n      }\n    }\n    return bytes;\n  }\n\n\n  // helper to store a an unsigned integer\n  template< typename T > \n  size_t \n  restore( std::istream& _is, \n\t   T& _val, \n\t   OMFormat::Chunk::Integer_Size _b, \n\t   bool _swap,\n\t   t_unsigned)\n  {    \n    assert( OMFormat::is_integer( _val ) );\n    size_t bytes = 0;\n\n    switch( _b ) \n    {\n      case OMFormat::Chunk::Integer_8:\n      { \n\tOMFormat::uint8 v;\n\tbytes = restore( _is, v, _swap );\n\t_val = static_cast<T>(v);\n\tbreak;\n      }\n      case OMFormat::Chunk::Integer_16:\n      { \n\tOMFormat::uint16 v;\n\tbytes = restore( _is, v, _swap );\n\t_val = static_cast<T>(v);\n\tbreak;\n      }\n      case OMFormat::Chunk::Integer_32:\n      { \n\tOMFormat::uint32 v;\n\tbytes = restore( _is, v, _swap );\n\t_val = static_cast<T>(v);\n\tbreak;\n      }\n      \n      case OMFormat::Chunk::Integer_64:\n      { \n\tOMFormat::uint64 v;\n\tbytes = restore( _is, v, _swap );\n\t_val = static_cast<T>(v);\n\tbreak;\n      }\n    }\n    return bytes;\n  }\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/Options.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------*\n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         *\n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/\n\n/*===========================================================================*\\\n *                                                                           *\n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n#ifndef OPENMESH_IO_OPTIONS_HH\n#define OPENMESH_IO_OPTIONS_HH\n\n\n//=== INCLUDES ================================================================\n\n\n// OpenMesh\n#include <OpenMesh/Core/System/config.h>\n\n\n//== NAMESPACES ==============================================================\n\n\nnamespace OpenMesh {\nnamespace IO   {\n\n\n//=== IMPLEMENTATION ==========================================================\n\n\n/** \\name Mesh Reading / Writing\n    Option for reader and writer modules.\n*/\n//@{\n\n\n//-----------------------------------------------------------------------------\n\n/** \\brief Set options for reader/writer modules.\n *\n *  The class is used in a twofold way.\n *  -# In combination with reader modules the class is used\n *     - to pass hints to the reading module, whether the input is\n *     binary and what byte ordering the binary data has\n *     - to retrieve information about the file contents after\n *     succesful reading.\n *  -# In combination with write modules the class gives directions to\n *     the writer module, whether to\n *     - use binary mode or not and what byte order to use\n *     - store one of the standard properties.\n *\n *  The option are defined in \\c Options::Flag as bit values and stored in\n *  an \\c int value as a bitset.\n */\nclass Options\n{\npublic:\n  typedef int       enum_type;\n  typedef enum_type value_type;\n\n  /// Definitions of %Options for reading and writing. The options can be\n  /// or'ed.\n  enum Flag {\n      Default        = 0x0000, ///< No options\n      Binary         = 0x0001, ///< Set binary mode for r/w\n      MSB            = 0x0002, ///< Assume big endian byte ordering\n      LSB            = 0x0004, ///< Assume little endian byte ordering\n      Swap           = 0x0006, ///< Swap byte order in binary mode\n      VertexNormal   = 0x0010, ///< Has (r) / store (w) vertex normals\n      VertexColor    = 0x0020, ///< Has (r) / store (w) vertex colors\n      VertexTexCoord = 0x0040, ///< Has (r) / store (w) texture coordinates\n      EdgeColor      = 0x0080, ///< Has (r) / store (w) edge colors\n      FaceNormal     = 0x0100, ///< Has (r) / store (w) face normals\n      FaceColor      = 0x0200, ///< Has (r) / store (w) face colors\n      FaceTexCoord   = 0x0400, ///< Has (r) / store (w) face texture coordinates\n      ColorAlpha     = 0x0800,  ///< Has (r) / store (w) alpha values for colors\n      ColorFloat     = 0x1000  ///< Has (r) / store (w) float values for colors (currently only implemented for PLY and OFF files)\n  };\n\npublic:\n\n  /// Default constructor\n  Options() : flags_( Default )\n  { }\n\n\n  /// Copy constructor\n  Options(const Options& _opt) : flags_(_opt.flags_)\n  { }\n\n\n  /// Initializing constructor setting a single option\n  Options(Flag _flg) : flags_( _flg)\n  { }\n\n\n  /// Initializing constructor setting multiple options\n  Options(const value_type _flgs) : flags_( _flgs)\n  { }\n\n\n  ~Options()\n  { }\n\n  /// Restore state after default constructor.\n  void cleanup(void)\n  { flags_ = Default; }\n\n  /// Clear all bits.\n  void clear(void)\n  { flags_ = 0; }\n\n  /// Returns true if all bits are zero.\n  bool is_empty(void) const { return !flags_; }\n\npublic:\n\n\n  //@{\n  /// Copy options defined in _rhs.\n\n  Options& operator = ( const Options& _rhs )\n  { flags_ = _rhs.flags_; return *this; }\n\n  Options& operator = ( const value_type _rhs )\n  { flags_ = _rhs; return *this; }\n\n  //@}\n\n\n  //@{\n  /// Unset options defined in _rhs.\n\n  Options& operator -= ( const value_type _rhs )\n  { flags_ &= ~_rhs; return *this; }\n\n  Options& unset( const value_type _rhs)\n  { return (*this -= _rhs); }\n\n  //@}\n\n\n\n  //@{\n  /// Set options defined in _rhs\n\n  Options& operator += ( const value_type _rhs )\n  { flags_ |= _rhs; return *this; }\n\n  Options& set( const value_type _rhs)\n  { return (*this += _rhs); }\n\n  //@}\n\npublic:\n\n\n  // Check if an option or several options are set.\n  bool check(const value_type _rhs) const\n  {\n    return (flags_ & _rhs)==_rhs;\n  }\n\n  bool is_binary()           const { return check(Binary); }\n  bool vertex_has_normal()   const { return check(VertexNormal); }\n  bool vertex_has_color()    const { return check(VertexColor); }\n  bool vertex_has_texcoord() const { return check(VertexTexCoord); }\n  bool edge_has_color()      const { return check(EdgeColor); }\n  bool face_has_normal()     const { return check(FaceNormal); }\n  bool face_has_color()      const { return check(FaceColor); }\n  bool face_has_texcoord()   const { return check(FaceTexCoord); }\n  bool color_has_alpha()     const { return check(ColorAlpha); }\n  bool color_is_float()      const { return check(ColorFloat); }\n\n\n  /// Returns true if _rhs has the same options enabled.\n  bool operator == (const value_type _rhs) const\n  { return flags_ == _rhs; }\n\n\n  /// Returns true if _rhs does not have the same options enabled.\n  bool operator != (const value_type _rhs) const\n  { return flags_ != _rhs; }\n\n\n  /// Returns the option set.\n  operator value_type ()     const { return flags_; }\n\nprivate:\n\n  bool operator && (const value_type _rhs) const;\n\n  value_type flags_;\n};\n\n//-----------------------------------------------------------------------------\n\n\n\n\n//@}\n\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n#endif\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/SR_binary.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  Helper Functions for binary reading / writing\n//\n//=============================================================================\n\n#ifndef OPENMESH_SR_BINARY_HH\n#define OPENMESH_SR_BINARY_HH\n\n\n//== INCLUDES =================================================================\n\n#include <OpenMesh/Core/System/config.h>\n// -------------------- STL\n#include <typeinfo>\n#include <stdexcept>\n#include <sstream>\n#include <numeric>   // accumulate\n// -------------------- OpenMesh\n\n\n//== NAMESPACES ===============================================================\n\nnamespace OpenMesh {\nnamespace IO {\n\n\n//=============================================================================\n\n\n//-----------------------------------------------------------------------------\n\n  const static size_t UnknownSize(size_t(-1));\n\n\n//-----------------------------------------------------------------------------\n// struct binary, helper for storing/restoring\n\n#define X \\\n   std::ostringstream msg; \\\n   msg << \"Type not supported: \" << typeid(value_type).name(); \\\n   throw std::logic_error(msg.str())\n\n/// \\struct binary SR_binary.hh <OpenMesh/Core/IO/SR_binary.hh>\n///\n/// The struct defines how to store and restore the type T.\n/// It's used by the OM reader/writer modules.\n///\n/// The following specialization are provided:\n/// - Fundamental types except \\c long \\c double\n/// - %OpenMesh vector types\n/// - %OpenMesh::StatusInfo\n/// - std::string (max. length 65535)\n///\n/// \\todo Complete documentation of members\ntemplate < typename T > struct binary\n{\n  typedef T     value_type;\n\n  static const bool is_streamable = false;\n\n  static size_t size_of(void) { return UnknownSize; }\n  static size_t size_of(const value_type&) { return UnknownSize; }\n\n  static \n  size_t store( std::ostream& /* _os */,\n\t\tconst value_type& /* _v */,\n\t\tbool /* _swap=false */)\n  { X; return 0; }\n\n  static \n  size_t restore( std::istream& /* _is */,\n\t\t  value_type& /* _v */,\n\t\t  bool /* _swap=false */)\n  { X; return 0; }\n};\n\n#undef X\n\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n#endif // OPENMESH_SR_RBO_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/SR_binary_spec.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  Helper Functions for binary reading / writing\n//\n//=============================================================================\n\n#ifndef OPENMESH_SR_BINARY_SPEC_HH\n#define OPENMESH_SR_BINARY_SPEC_HH\n\n//== INCLUDES =================================================================\n\n#include <OpenMesh/Core/System/config.h>\n// -------------------- STL\n#include <iterator>\n#include <string>\n#if defined(OM_CC_GCC) && (OM_CC_VERSION < 30000)\n#  include <OpenMesh/Tools/Utils/NumLimitsT.hh>\n#else\n#  include <limits>\n#endif\n#include <vector>\n#include <stdexcept> // logic_error\n#include <numeric>   // accumulate\n// -------------------- OpenMesh\n#include <OpenMesh/Core/Geometry/VectorT.hh>\n#include <OpenMesh/Core/Mesh/Status.hh>\n#include <OpenMesh/Core/IO/SR_types.hh>\n#include <OpenMesh/Core/IO/SR_rbo.hh>\n#include <OpenMesh/Core/IO/SR_binary.hh>\n\n//== NAMESPACES ===============================================================\n\nnamespace OpenMesh {\nnamespace IO {\n\n\n//=============================================================================\n\n#ifndef DOXY_IGNORE_THIS\n\n//-----------------------------------------------------------------------------\n// struct binary, helper for storing/restoring\n\n#define SIMPLE_BINARY( T ) \\\n  template <> struct binary< T > {                           \\\n    typedef T value_type;                                    \\\n    static const bool is_streamable = true;                  \\\n    static size_t size_of(const value_type&) { return sizeof(value_type); }   \\\n    static size_t size_of(void) { return sizeof(value_type); }   \\\n    static size_t store( std::ostream& _os, const value_type& _val, \\\n\t\t         bool _swap=false) {                 \\\n      value_type tmp = _val;                                 \\\n      if (_swap) reverse_byte_order(tmp);                    \\\n      _os.write( (const char*)&tmp, sizeof(value_type) );    \\\n      return _os.good() ? sizeof(value_type) : 0;            \\\n    }                                                        \\\n                                                             \\\n    static size_t restore( std::istream& _is, value_type& _val, \\\n\t\t\t bool _swap=false) {                 \\\n      _is.read( (char*)&_val, sizeof(value_type) );          \\\n      if (_swap) reverse_byte_order(_val);                   \\\n      return _is.good() ? sizeof(value_type) : 0;            \\\n    }                                                        \\\n  }\n\nSIMPLE_BINARY(bool);\n//SIMPLE_BINARY(int);\n\n// Why is this needed? Should not be used as not 32 bit compatible\n//SIMPLE_BINARY(unsigned long);\nSIMPLE_BINARY(float);\nSIMPLE_BINARY(double);\nSIMPLE_BINARY(long double);\n\nSIMPLE_BINARY(int8_t);\nSIMPLE_BINARY(int16_t);\nSIMPLE_BINARY(int32_t);\nSIMPLE_BINARY(int64_t);\nSIMPLE_BINARY(uint8_t);\nSIMPLE_BINARY(uint16_t);\nSIMPLE_BINARY(uint32_t);\nSIMPLE_BINARY(uint64_t);\n\n#undef SIMPLE_BINARY\n\n// For unsigned long which is of size 64 bit on 64 bit\n// architectures: convert into 32 bit unsigned integer value\n// in order to stay compatible between 32/64 bit architectures.\n// This allows cross reading BUT forbids storing unsigned longs\n// as data type since higher order word (4 bytes) will be truncated.\n// Does not work in case the data type that is to be stored\n// exceeds the value range of unsigned int in size, which is improbable...\n\n#define SIMPLE_BINARY( T ) \\\n  template <> struct binary< T > {                           \\\n    typedef T value_type;                                    \\\n    static const bool is_streamable = true;                  \\\n    static size_t size_of(const value_type&) { return sizeof(value_type); }   \\\n    static size_t size_of(void) { return sizeof(value_type); }   \\\n    static size_t store( std::ostream& _os, const value_type& _val, \\\n\t\t         bool _swap=false) {                 \\\n      value_type tmp = _val;                                 \\\n      if (_swap) reverse_byte_order(tmp);                    \\\n      /* Convert unsigned long to unsigned int for compatibility reasons */ \\\n      unsigned int t1 = static_cast<unsigned int>(tmp);      \\\n      _os.write( (const char*)&t1, sizeof(unsigned int) );   \\\n      return _os.good() ? sizeof(unsigned int) : 0;          \\\n    }                                                        \\\n                                                             \\\n    static size_t restore( std::istream& _is, value_type& _val, \\\n\t\t\t bool _swap=false) {                             \\\n    \tunsigned int t1;                                     \\\n      _is.read( (char*)&t1, sizeof(unsigned int) );          \\\n      _val = t1;                                             \\\n      if (_swap) reverse_byte_order(_val);                   \\\n      return _is.good() ? sizeof(unsigned int) : 0;            \\\n    }                                                        \\\n  }\n\nSIMPLE_BINARY(unsigned long);\n\n#undef SIMPLE_BINARY\n\n#define VECTORT_BINARY( T ) \\\n  template <> struct binary< T > {                              \\\n    typedef T value_type;                                       \\\n    static const bool is_streamable = true;                     \\\n    static size_t size_of(void) { return sizeof(value_type); }  \\\n    static size_t size_of(const value_type&) { return size_of(); } \\\n    static size_t store( std::ostream& _os, const value_type& _val, \\\n\t\t         bool _swap=false) {                    \\\n      value_type tmp = _val;                                    \\\n      size_t i, b = size_of(_val), N = value_type::size_;       \\\n      if (_swap) for (i=0; i<N; ++i)                            \\\n\treverse_byte_order( tmp[i] );                           \\\n      _os.write( (const char*)&tmp[0], b );                     \\\n      return _os.good() ? b : 0;                                \\\n    }                                                           \\\n                                                                \\\n    static size_t restore( std::istream& _is, value_type& _val, \\\n\t\t\t bool _swap=false) {                    \\\n      size_t i, N=value_type::size_;                            \\\n      size_t b = N * sizeof(value_type::value_type);            \\\n      _is.read( (char*)&_val[0], b );                           \\\n      if (_swap) for (i=0; i<N; ++i)                            \\\n        reverse_byte_order( _val[i] );                          \\\n      return _is.good() ? b : 0;                                \\\n    }                                                           \\\n  }\n\n#define VECTORTS_BINARY( N ) \\\n   VECTORT_BINARY( Vec##N##c  ); \\\n   VECTORT_BINARY( Vec##N##uc ); \\\n   VECTORT_BINARY( Vec##N##s  ); \\\n   VECTORT_BINARY( Vec##N##us ); \\\n   VECTORT_BINARY( Vec##N##i  ); \\\n   VECTORT_BINARY( Vec##N##ui ); \\\n   VECTORT_BINARY( Vec##N##f  ); \\\n   VECTORT_BINARY( Vec##N##d  );\n\nVECTORTS_BINARY( 1 )\nVECTORTS_BINARY( 2 )\nVECTORTS_BINARY( 3 )\nVECTORTS_BINARY( 4 )\nVECTORTS_BINARY( 6 )\n\n#undef VECTORTS_BINARY\n#undef VECTORT_BINARY\n\ntemplate <> struct binary< std::string > {\n  typedef std::string value_type;\n  typedef uint16_t    length_t;\n\n  static const bool is_streamable = true;\n\n  static size_t size_of() { return UnknownSize; }\n  static size_t size_of(const value_type &_v)\n  { return sizeof(length_t) + _v.size(); }\n\n  static\n  size_t store(std::ostream& _os, const value_type& _v, bool _swap=false)\n  {\n#if defined(OM_CC_GCC) && (OM_CC_VERSION < 30000)\n    if (_v.size() < Utils::NumLimitsT<length_t>::max() )\n#else\n    if (_v.size() < std::numeric_limits<length_t>::max() )\n#endif\n    {\n      length_t len = length_t(_v.size());\n\n      if (_swap) reverse_byte_order(len);\n\n      size_t bytes = binary<length_t>::store( _os, len, _swap );\n      _os.write( _v.data(), len );\n      return _os.good() ? len+bytes : 0;\n    }\n    throw std::runtime_error(\"Cannot store string longer than 64Kb\");\n  }\n\n  static\n  size_t restore(std::istream& _is, value_type& _val, bool _swap=false)\n  {\n    length_t len;\n    size_t   bytes = binary<length_t>::restore( _is, len, _swap );\n    if (_swap)\n      reverse_byte_order(len);\n    _val.resize(len);\n    _is.read( const_cast<char*>(_val.data()), len );\n\n    return _is.good() ? (len+bytes) : 0;\n  }\n};\n\n\ntemplate <> struct binary<OpenMesh::Attributes::StatusInfo>\n{\n  typedef OpenMesh::Attributes::StatusInfo value_type;\n  typedef value_type::value_type           status_t;\n\n  static const bool is_streamable = true;\n\n  static size_t size_of() { return sizeof(status_t); }\n  static size_t size_of(const value_type&) { return size_of(); }\n\n  static size_t n_bytes(size_t _n_elem)\n  { return _n_elem*sizeof(status_t); }\n\n  static\n  size_t store(std::ostream& _os, const value_type& _v, bool _swap=false)\n  {\n    status_t v=_v.bits();\n    return binary<status_t>::store(_os, v, _swap);\n  }\n\n  static\n  size_t restore( std::istream& _os, value_type& _v, bool _swap=false)\n  {\n    status_t v;\n    size_t   b = binary<status_t>::restore(_os, v, _swap);\n    _v.set_bits(v);\n    return b;\n  }\n};\n\n\n//-----------------------------------------------------------------------------\n// std::vector<T> specializations for struct binary<>\n\ntemplate <typename T>\nstruct FunctorStore {\n  FunctorStore( std::ostream& _os, bool _swap) : os_(_os), swap_(_swap) { }\n  size_t operator () ( size_t _v1, const T& _s2 )\n  { return _v1+binary<T>::store(os_, _s2, swap_ ); }\n\n  std::ostream& os_;\n  bool          swap_;\n};\n\n\ntemplate <typename T>\nstruct FunctorRestore {\n  FunctorRestore( std::istream& _is, bool _swap) : is_(_is), swap_(_swap) { }\n  size_t operator () ( size_t _v1, T& _s2 )\n  { return _v1+binary<T>::restore(is_, _s2, swap_ ); }\n  std::istream& is_;\n  bool          swap_;\n};\n\n#include <OpenMesh/Core/IO/SR_binary_vector_of_fundamentals.inl>\n#include <OpenMesh/Core/IO/SR_binary_vector_of_string.inl>\n#include <OpenMesh/Core/IO/SR_binary_vector_of_bool.inl>\n\n// ----------------------------------------------------------------------------\n\n#endif // DOXY_IGNORE_THIS\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n#endif // OPENMESH_SR_BINARY_SPEC_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/SR_binary_vector_of_bool.inl",
    "content": "\ntemplate <> struct binary< std::vector<bool> >\n{\n\n  typedef std::vector< bool >    value_type;\n  typedef value_type::value_type elem_type;\n\n  static const bool is_streamable = true;\n\n  static size_t size_of(void) { return UnknownSize; }\n  static size_t size_of(const value_type& _v)\n  {\n    return _v.size() / 8 + ((_v.size() % 8)!=0); \n  }\n\n  static\n  size_t store( std::ostream& _ostr, const value_type& _v, bool ) \n  {\n    size_t bytes = 0;\n    \n    size_t N = _v.size() / 8;\n    size_t R = _v.size() % 8;\n\n    size_t        idx;      // element index\n    unsigned char bits; // bitset\n\n    for (idx=0; idx < N; ++idx)\n    {\n      bits = 0;\n      bits = bits |  (_v[idx+0] ? 1 : 0);\n      bits = bits | ((_v[idx+1] ? 1 : 0) << 1);\n      bits = bits | ((_v[idx+2] ? 1 : 0) << 2);\n      bits = bits | ((_v[idx+3] ? 1 : 0) << 3);\n      bits = bits | ((_v[idx+4] ? 1 : 0) << 4);\n      bits = bits | ((_v[idx+5] ? 1 : 0) << 5);\n      bits = bits | ((_v[idx+6] ? 1 : 0) << 6);\n      bits = bits | ((_v[idx+7] ? 1 : 0) << 7);\n      _ostr << bits;\n    }\n    bytes = N;\n\n    if (R)\n    {\n      bits = 0;\n      switch(R)\n      {\n\tcase 7: bits = bits | ((_v[idx+6] ? 1 : 0) << 6);\n\tcase 6: bits = bits | ((_v[idx+5] ? 1 : 0) << 5);\n\tcase 5: bits = bits | ((_v[idx+4] ? 1 : 0) << 4);\n\tcase 4: bits = bits | ((_v[idx+3] ? 1 : 0) << 3);\n\tcase 3: bits = bits | ((_v[idx+2] ? 1 : 0) << 2);\n\tcase 2: bits = bits | ((_v[idx+1] ? 1 : 0) << 1);\n\tcase 1: bits = bits |  (_v[idx+0] ? 1 : 0);\n      }\n      _ostr << bits;\n      ++bytes;\n    }\n\n    assert( bytes == size_of(_v) );\n\n    return bytes;\n  }\n\n  static\n  size_t restore( std::istream& _istr, value_type& _v, bool )\n  {\n    size_t bytes = 0;\n    \n    size_t N = _v.size() / 8;\n    size_t R = _v.size() % 8;\n\n    size_t        idx;  // element index\n    unsigned char bits; // bitset\n\n    for (idx=0; idx < N; ++idx)\n    {\n      _istr >> bits;\n      _v[idx+0] = ((bits & 0x01)!=0);\n      _v[idx+1] = ((bits & 0x02)!=0);\n      _v[idx+2] = ((bits & 0x04)!=0);\n      _v[idx+3] = ((bits & 0x08)!=0);\n      _v[idx+4] = ((bits & 0x10)!=0);\n      _v[idx+5] = ((bits & 0x20)!=0);\n      _v[idx+6] = ((bits & 0x40)!=0);\n      _v[idx+7] = ((bits & 0x80)!=0);\n    }\n    bytes = N;\n\n    if (R)\n    {\n      _istr >> bits;\n      for(; idx < _v.size(); ++idx)\n        _v[idx] = (bits & (1 << (idx%8)))!=0;\n      ++bytes;\n    }\n\n    return bytes;\n  }\n};\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/SR_binary_vector_of_fundamentals.inl",
    "content": "\n#define BINARY_VECTOR( T ) \\\ntemplate <> struct binary< std::vector< T > > {                 \\\n  typedef std::vector< T >       value_type;                    \\\n  typedef value_type::value_type elem_type;                     \\\n                                                                \\\n  static const bool is_streamable = true;                       \\\n                                                                \\\n  static size_t size_of(void)                                   \\\n  { return IO::UnknownSize; }                                   \\\n                                                                \\\n  static size_t size_of(const value_type& _v)                   \\\n  { return sizeof(elem_type)*_v.size(); }                       \\\n                                                                \\\n  static                                                        \\\n  size_t store(std::ostream& _os, const value_type& _v, bool _swap=false) { \\\n    size_t bytes=0;                                             \\\n                                                                \\\n    if (_swap)                                                  \\\n        bytes = std::accumulate( _v.begin(), _v.end(), bytes,   \\\n\t\t\t  FunctorStore<elem_type>(_os,_swap) ); \\\n    else {                                                      \\\n      bytes = size_of(_v);                                       \\\n      _os.write( reinterpret_cast<const char*>(&_v[0]), bytes ); \\\n    }                                                            \\\n    return _os.good() ? bytes : 0;                              \\\n  }                                                             \\\n                                                                \\\n  static size_t restore(std::istream& _is, value_type& _v, bool _swap=false) { \\\n    size_t bytes=0;                                             \\\n                                                                \\\n    if ( _swap)                                                 \\\n      bytes = std::accumulate( _v.begin(), _v.end(), size_t(0),         \\\n\t\t\t       FunctorRestore<elem_type>(_is, _swap) );           \\\n    else                                                        \\\n    {                                                           \\\n      bytes = size_of(_v);                                      \\\n      _is.read( reinterpret_cast<char*>(&_v[0]), bytes );       \\\n    }                                                           \\\n    return _is.good() ? bytes : 0;                              \\\n  }                                                             \\\n}\n\nBINARY_VECTOR( short  );\nBINARY_VECTOR( unsigned short  );\nBINARY_VECTOR( int  );\nBINARY_VECTOR( unsigned int  );\nBINARY_VECTOR( long );\nBINARY_VECTOR( unsigned long );\nBINARY_VECTOR( float  );\nBINARY_VECTOR( double );\n\n#undef BINARY_VECTOR\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/SR_binary_vector_of_string.inl",
    "content": "\ntemplate <> struct binary< std::vector< std::string > >\n{\n  // struct binary interface\n\n  typedef std::vector< std::string > value_type;\n  typedef value_type::value_type     elem_type;\n\n  static const bool is_streamable = true;\n\n  // Helper\n\n  struct Sum\n  {\n    size_t operator() ( size_t _v1, const elem_type& _s2 )\n    { return _v1 + binary<elem_type>::size_of(_s2); }\n  };\n\n  // struct binary interface\n\n  static size_t size_of(void) { return UnknownSize; }\n\n  static size_t size_of(const value_type& _v)\n  { return std::accumulate( _v.begin(), _v.end(), size_t(0), Sum() ); }\n\n  static \n  size_t store(std::ostream& _os, const value_type& _v, bool _swap=false)\n  {\n    return std::accumulate( _v.begin(), _v.end(), size_t(0), \n\t\t\t    FunctorStore<elem_type>(_os, _swap) );\n  }                                                        \n                                                             \n  static\n  size_t restore(std::istream& _is, value_type& _v, bool _swap=false) \n  {\n    return std::accumulate( _v.begin(), _v.end(), size_t(0), \n\t\t\t    FunctorRestore<elem_type>(_is, _swap) );\n  }                                                        \n};\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/SR_rbo.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  Helper Functions for binary reading / writing\n//\n//=============================================================================\n\n#ifndef OPENMESH_SR_RBO_HH\n#define OPENMESH_SR_RBO_HH\n\n\n//== INCLUDES =================================================================\n\n#include <OpenMesh/Core/System/config.h>\n// -------------------- STL\n#if defined(OM_CC_MIPS)\n#  include <stdio.h> // size_t\n#else\n#  include <cstdio>  // size_t\n#endif\n#include <algorithm>\n#include <typeinfo>\n// -------------------- OpenMesh\n#include <OpenMesh/Core/System/omstream.hh>\n#include <OpenMesh/Core/IO/SR_types.hh>\n#include <OpenMesh/Core/Utils/GenProg.hh>\n\n//== NAMESPACES ===============================================================\n\nnamespace OpenMesh {\nnamespace IO {\n\n\n//=============================================================================\n\n\n/** \\name Handling binary input/output.\n    These functions take care of swapping bytes to get the right Endian.\n*/\n//@{\n\n\n//-----------------------------------------------------------------------------\n\n/** this does not compile for g++3.4 and higher, hence we comment the\nfunction body which will result in a linker error */\n\ntemplate < size_t N > inline\nvoid _reverse_byte_order_N(uint8_t* _val);\n\ntemplate <> inline\nvoid _reverse_byte_order_N<1>(uint8_t* /*_val*/) { }\n\n\ntemplate <> inline\nvoid _reverse_byte_order_N<2>(uint8_t* _val)\n{\n   _val[0] ^= _val[1]; _val[1] ^= _val[0]; _val[0] ^= _val[1];\n}\n\n\ntemplate <> inline\nvoid _reverse_byte_order_N<4>(uint8_t* _val)\n{\n   _val[0] ^= _val[3]; _val[3] ^= _val[0]; _val[0] ^= _val[3]; // 0 <-> 3\n   _val[1] ^= _val[2]; _val[2] ^= _val[1]; _val[1] ^= _val[2]; // 1 <-> 2\n}\n\n\ntemplate <> inline\nvoid _reverse_byte_order_N<8>(uint8_t* _val)\n{\n   _val[0] ^= _val[7]; _val[7] ^= _val[0]; _val[0] ^= _val[7]; // 0 <-> 7\n   _val[1] ^= _val[6]; _val[6] ^= _val[1]; _val[1] ^= _val[6]; // 1 <-> 6\n   _val[2] ^= _val[5]; _val[5] ^= _val[2]; _val[2] ^= _val[5]; // 2 <-> 5\n   _val[3] ^= _val[4]; _val[4] ^= _val[3]; _val[3] ^= _val[4]; // 3 <-> 4\n}\n\n\ntemplate <> inline\nvoid _reverse_byte_order_N<12>(uint8_t* _val)\n{\n   _val[0] ^= _val[11]; _val[11] ^= _val[0]; _val[0] ^= _val[11]; // 0 <-> 11\n   _val[1] ^= _val[10]; _val[10] ^= _val[1]; _val[1] ^= _val[10]; // 1 <-> 10\n   _val[2] ^= _val[ 9]; _val[ 9] ^= _val[2]; _val[2] ^= _val[ 9]; // 2 <->  9\n   _val[3] ^= _val[ 8]; _val[ 8] ^= _val[3]; _val[3] ^= _val[ 8]; // 3 <->  8\n   _val[4] ^= _val[ 7]; _val[ 7] ^= _val[4]; _val[4] ^= _val[ 7]; // 4 <->  7\n   _val[5] ^= _val[ 6]; _val[ 6] ^= _val[5]; _val[5] ^= _val[ 6]; // 5 <->  6\n}\n\n\ntemplate <> inline\nvoid _reverse_byte_order_N<16>(uint8_t* _val)\n{\n   _reverse_byte_order_N<8>(_val);\n   _reverse_byte_order_N<8>(_val+8);\n   std::swap(*(uint64_t*)_val, *(((uint64_t*)_val)+1));\n}\n\n\n//-----------------------------------------------------------------------------\n// wrapper for byte reordering\n\n// reverting pointers makes no sense, hence forbid it.\n/** this does not compile for g++3.4 and higher, hence we comment the\nfunction body which will result in a linker error */\ntemplate <typename T> inline T* reverse_byte_order(T* t);\n// Should never reach this point. If so, then some operator were not\n// overloaded. Especially check for IO::binary<> specialization on\n// custom data types.\n\n\ninline void compile_time_error__no_fundamental_type()\n{\n  // we should never reach this point\n  assert(false);\n}\n\n// default action for byte reversal: cause an error to avoid\n// surprising behaviour!\ntemplate <typename T> T& reverse_byte_order(  T& _t )\n{\n  omerr() << \"Not defined for type \" << typeid(T).name() << std::endl;\n  compile_time_error__no_fundamental_type();\n  return _t;\n}\n\ntemplate <> inline bool&  reverse_byte_order(bool & _t) { return _t; }\ntemplate <> inline char&  reverse_byte_order(char & _t) { return _t; }\n#if defined(OM_CC_GCC)\ntemplate <> inline signed char&  reverse_byte_order(signed char & _t) { return _t; }\n#endif\ntemplate <> inline uchar& reverse_byte_order(uchar& _t) { return _t; }\n\n// Instead do specializations for the necessary types\n#define REVERSE_FUNDAMENTAL_TYPE( T ) \\\n  template <> inline T& reverse_byte_order( T&  _t ) {\\\n   _reverse_byte_order_N<sizeof(T)>( reinterpret_cast<uint8_t*>(&_t) ); \\\n   return _t; \\\n  }\n\n// REVERSE_FUNDAMENTAL_TYPE(bool)\n// REVERSE_FUNDAMENTAL_TYPE(char)\n// REVERSE_FUNDAMENTAL_TYPE(uchar)\nREVERSE_FUNDAMENTAL_TYPE(int16_t)\nREVERSE_FUNDAMENTAL_TYPE(uint16_t)\n// REVERSE_FUNDAMENTAL_TYPE(int)\n// REVERSE_FUNDAMENTAL_TYPE(uint)\n\nREVERSE_FUNDAMENTAL_TYPE(unsigned long)\nREVERSE_FUNDAMENTAL_TYPE(int32_t)\nREVERSE_FUNDAMENTAL_TYPE(uint32_t)\nREVERSE_FUNDAMENTAL_TYPE(int64_t)\nREVERSE_FUNDAMENTAL_TYPE(uint64_t)\nREVERSE_FUNDAMENTAL_TYPE(float)\nREVERSE_FUNDAMENTAL_TYPE(double)\nREVERSE_FUNDAMENTAL_TYPE(long double)\n\n#undef REVERSE_FUNDAMENTAL_TYPE\n\n#if 0\n\n#define REVERSE_VECTORT_TYPE( T ) \\\n  template <> inline T& reverse_byte_order(T& _v) {\\\n    for (size_t i; i< T::size_; ++i) \\\n      _reverse_byte_order_N< sizeof(T::value_type) >( reinterpret_cast<uint8_t*>(&_v[i])); \\\n    return _v; \\\n  }\n\n#define REVERSE_VECTORT_TYPES( N )  \\\n  REVERSE_VECTORT_TYPE( Vec##N##c )  \\\n  REVERSE_VECTORT_TYPE( Vec##N##uc ) \\\n  REVERSE_VECTORT_TYPE( Vec##N##s )  \\\n  REVERSE_VECTORT_TYPE( Vec##N##us ) \\\n  REVERSE_VECTORT_TYPE( Vec##N##i )  \\\n  REVERSE_VECTORT_TYPE( Vec##N##ui ) \\\n  REVERSE_VECTORT_TYPE( Vec##N##f )  \\\n  REVERSE_VECTORT_TYPE( Vec##N##d )  \\\n\nREVERSE_VECTORT_TYPES(1)\nREVERSE_VECTORT_TYPES(2)\nREVERSE_VECTORT_TYPES(3)\nREVERSE_VECTORT_TYPES(4)\nREVERSE_VECTORT_TYPES(6)\n\n#undef REVERSE_VECTORT_TYPES\n#undef REVERSE_VECTORT_TYPE\n\n#endif\n\ntemplate <typename T> inline\nT reverse_byte_order(const T& a)\n{\n  compile_timer_error__const_means_const(a);\n  return a;\n}\n\n\n//@}\n\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n#endif // OPENMESH_SR_RBO_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/SR_store.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  Helper Functions for binary reading / writing\n//\n//=============================================================================\n\n#ifndef OPENMESH_SR_STORE_HH\n#define OPENMESH_SR_STORE_HH\n\n\n//== INCLUDES =================================================================\n\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/IO/SR_types.hh>\n#include <OpenMesh/Core/IO/SR_rbo.hh>\n#include <OpenMesh/Core/IO/SR_binary.hh>\n#include <OpenMesh/Core/IO/SR_binary_spec.hh>\n#include <OpenMesh/Core/IO/StoreRestore.hh>\n\n//=============================================================================\n#endif // OPENMESH_STORE_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/SR_types.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  Helper Functions for binary reading / writing\n//\n//=============================================================================\n\n#ifndef OPENMESH_SR_TYPES_HH\n#define OPENMESH_SR_TYPES_HH\n\n\n//== INCLUDES =================================================================\n\n#include <OpenMesh/Core/System/config.h>\n\n\n//== NAMESPACES ===============================================================\n\nnamespace OpenMesh {\nnamespace IO {\n\n\n//=============================================================================\n\n\n/** \\name Handling binary input/output.\n    These functions take care of swapping bytes to get the right Endian.\n*/\n//@{\n\n//-----------------------------------------------------------------------------\n\ntypedef unsigned char    uchar;\ntypedef unsigned short   ushort;\ntypedef unsigned long    ulong;\n\ntypedef char           int8_t;  typedef unsigned char      uint8_t;\ntypedef short          int16_t; typedef unsigned short     uint16_t;\n\n// Int should be 32 bit on all archs.\n// long is 32 under windows but 64 under unix 64 bit\ntypedef int            int32_t; typedef unsigned int       uint32_t;\n#if defined(OM_CC_MSVC)\ntypedef __int64        int64_t; typedef unsigned __int64   uint64_t;\n#else\ntypedef long long      int64_t; typedef unsigned long long uint64_t;\n#endif\n\ntypedef float          float32_t;\ntypedef double         float64_t;\n\ntypedef uint8_t        rgb_t[3];\ntypedef uint8_t        rgba_t[4];\n\n//@}\n\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n#endif // OPENMESH_MESHREADER_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/StoreRestore.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  Helper Functions for binary reading / writing\n//\n//=============================================================================\n\n#ifndef OPENMESH_STORERESTORE_HH\n#define OPENMESH_STORERESTORE_HH\n\n\n//== INCLUDES =================================================================\n\n#include <stdexcept>\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/IO/SR_binary.hh>\n#include <OpenMesh/Core/IO/SR_binary_spec.hh>\n\n//== NAMESPACES ===============================================================\n\nnamespace OpenMesh {\nnamespace IO {\n\n\n//=============================================================================\n\n\n/** \\name Handling binary input/output.\n    These functions take care of swapping bytes to get the right Endian.\n*/\n//@{\n\n\n//-----------------------------------------------------------------------------\n// StoreRestore definitions\n\ntemplate <typename T> inline\nbool is_streamable(void)\n{ return binary< T >::is_streamable; }\n\ntemplate <typename T> inline\nbool is_streamable( const T& ) \n{ return binary< T >::is_streamable; }\n\ntemplate <typename T> inline\nsize_t size_of( const T& _v ) \n{ return binary< T >::size_of(_v); }\n\ntemplate <typename T> inline\nsize_t size_of(void) \n{ return binary< T >::size_of(); }\n\ntemplate <typename T> inline\nsize_t store( std::ostream& _os, const T& _v, bool _swap=false)\n{ return binary< T >::store( _os, _v, _swap ); }\n\ntemplate <typename T> inline\nsize_t restore( std::istream& _is, T& _v, bool _swap=false)\n{ return binary< T >::restore( _is, _v, _swap ); }\n\n//@}\n\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n#endif // OPENMESH_MESHREADER_HH defined\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/exporter/BaseExporter.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------*\n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         *\n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/\n\n/*===========================================================================*\\\n *                                                                           *\n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  Implements the baseclass for MeshWriter exporter modules\n//\n//=============================================================================\n\n\n#ifndef __BASEEXPORTER_HH__\n#define __BASEEXPORTER_HH__\n\n\n//=== INCLUDES ================================================================\n\n\n// STL\n#include <vector>\n\n// OpenMesh\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/Geometry/VectorT.hh>\n#include <OpenMesh/Core/Mesh/BaseKernel.hh>\n\n\n//=== NAMESPACES ==============================================================\n\n\nnamespace OpenMesh {\nnamespace IO {\n\n\n//=== EXPORTER ================================================================\n\n\n/**\n   Base class for exporter modules.\n   The exporter modules provide an interface between the writer modules and\n   the target data structure.\n*/\n\nclass OPENMESHDLLEXPORT BaseExporter\n{\npublic:\n\n  virtual ~BaseExporter() { }\n\n\n  // get vertex data\n  virtual Vec3f  point(VertexHandle _vh)    const = 0;\n  virtual Vec3f  normal(VertexHandle _vh)   const = 0;\n  virtual Vec3uc color(VertexHandle _vh)    const = 0;\n  virtual Vec4uc colorA(VertexHandle _vh)   const = 0;\n  virtual Vec3ui colori(VertexHandle _vh)    const = 0;\n  virtual Vec4ui colorAi(VertexHandle _vh)   const = 0;\n  virtual Vec3f colorf(VertexHandle _vh)    const = 0;\n  virtual Vec4f colorAf(VertexHandle _vh)   const = 0;\n  virtual Vec2f  texcoord(VertexHandle _vh) const = 0;\n\n\n  // get face data\n  virtual unsigned int\n  get_vhandles(FaceHandle _fh,\n\t       std::vector<VertexHandle>& _vhandles) const=0;\n  virtual Vec3f  normal(FaceHandle _fh)      const = 0;\n  virtual Vec3uc color (FaceHandle _fh)      const = 0;\n  virtual Vec4uc colorA(FaceHandle _fh)      const = 0;\n  virtual Vec3ui colori(FaceHandle _fh)    const = 0;\n  virtual Vec4ui colorAi(FaceHandle _fh)   const = 0;\n  virtual Vec3f colorf(FaceHandle _fh)    const = 0;\n  virtual Vec4f colorAf(FaceHandle _fh)   const = 0;\n\n  // get edge data\n  virtual Vec3uc color(EdgeHandle _eh)    const = 0;\n  virtual Vec4uc colorA(EdgeHandle _eh)   const = 0;\n  virtual Vec3ui colori(EdgeHandle _eh)    const = 0;\n  virtual Vec4ui colorAi(EdgeHandle _eh)   const = 0;\n  virtual Vec3f colorf(EdgeHandle _eh)    const = 0;\n  virtual Vec4f colorAf(EdgeHandle _eh)   const = 0;\n\n  // get reference to base kernel\n  virtual const BaseKernel* kernel() { return 0; }\n\n\n  // query number of faces, vertices, normals, texcoords\n  virtual size_t n_vertices()   const = 0;\n  virtual size_t n_faces()      const = 0;\n  virtual size_t n_edges()      const = 0;\n\n\n  // property information\n  virtual bool is_triangle_mesh()     const { return false; }\n  virtual bool has_vertex_normals()   const { return false; }\n  virtual bool has_vertex_colors()    const { return false; }\n  virtual bool has_vertex_texcoords() const { return false; }\n  virtual bool has_edge_colors()      const { return false; }\n  virtual bool has_face_normals()     const { return false; }\n  virtual bool has_face_colors()      const { return false; }\n};\n\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n#endif\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/exporter/ExporterT.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------*\n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         *\n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/\n\n/*===========================================================================*\\\n *                                                                           *\n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  Implements an exporter module for arbitrary OpenMesh meshes\n//\n//=============================================================================\n\n\n#ifndef __EXPORTERT_HH__\n#define __EXPORTERT_HH__\n\n\n//=== INCLUDES ================================================================\n\n// C++\n#include <vector>\n\n// OpenMesh\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/Geometry/VectorT.hh>\n#include <OpenMesh/Core/Utils/GenProg.hh>\n#include <OpenMesh/Core/Utils/vector_cast.hh>\n#include <OpenMesh/Core/Utils/color_cast.hh>\n#include <OpenMesh/Core/IO/exporter/BaseExporter.hh>\n\n\n//=== NAMESPACES ==============================================================\n\nnamespace OpenMesh {\nnamespace IO {\n\n\n//=== EXPORTER CLASS ==========================================================\n\n/**\n *  This class template provides an exporter module for OpenMesh meshes.\n */\ntemplate <class Mesh>\nclass ExporterT : public BaseExporter\n{\npublic:\n\n  // Constructor\n  ExporterT(const Mesh& _mesh) : mesh_(_mesh) {}\n\n\n  // get vertex data\n\n  Vec3f  point(VertexHandle _vh)    const\n  {\n    return vector_cast<Vec3f>(mesh_.point(_vh));\n  }\n\n  Vec3f  normal(VertexHandle _vh)   const\n  {\n    return (mesh_.has_vertex_normals()\n\t    ? vector_cast<Vec3f>(mesh_.normal(_vh))\n\t    : Vec3f(0.0f, 0.0f, 0.0f));\n  }\n\n  Vec3uc color(VertexHandle _vh)    const\n  {\n    return (mesh_.has_vertex_colors()\n\t    ? color_cast<Vec3uc>(mesh_.color(_vh))\n\t    : Vec3uc(0, 0, 0));\n  }\n\n  Vec4uc colorA(VertexHandle _vh)   const\n  {\n    return (mesh_.has_vertex_colors()\n      ? color_cast<Vec4uc>(mesh_.color(_vh))\n      : Vec4uc(0, 0, 0, 0));\n  }\n\n  Vec3ui colori(VertexHandle _vh)    const\n  {\n    return (mesh_.has_vertex_colors()\n\t    ? color_cast<Vec3ui>(mesh_.color(_vh))\n\t    : Vec3ui(0, 0, 0));\n  }\n\n  Vec4ui colorAi(VertexHandle _vh)   const\n  {\n    return (mesh_.has_vertex_colors()\n      ? color_cast<Vec4ui>(mesh_.color(_vh))\n      : Vec4ui(0, 0, 0, 0));\n  }\n\n  Vec3f colorf(VertexHandle _vh)    const\n  {\n    return (mesh_.has_vertex_colors()\n\t    ? color_cast<Vec3f>(mesh_.color(_vh))\n\t    : Vec3f(0, 0, 0));\n  }\n\n  Vec4f colorAf(VertexHandle _vh)   const\n  {\n    return (mesh_.has_vertex_colors()\n      ? color_cast<Vec4f>(mesh_.color(_vh))\n      : Vec4f(0, 0, 0, 0));\n  }\n\n  Vec2f  texcoord(VertexHandle _vh) const\n  {\n#if defined(OM_CC_GCC) && (OM_CC_VERSION<30000)\n    // Workaround!\n    // gcc 2.95.3 exits with internal compiler error at the\n    // code below!??? **)\n    if (mesh_.has_vertex_texcoords2D())\n      return vector_cast<Vec2f>(mesh_.texcoord2D(_vh));\n    return Vec2f(0.0f, 0.0f);\n#else // **)\n    return (mesh_.has_vertex_texcoords2D()\n\t    ? vector_cast<Vec2f>(mesh_.texcoord2D(_vh))\n\t    : Vec2f(0.0f, 0.0f));\n#endif\n  }\n\n  // get edge data\n\n  Vec3uc color(EdgeHandle _eh)    const\n  {\n      return (mesh_.has_edge_colors()\n      ? color_cast<Vec3uc>(mesh_.color(_eh))\n      : Vec3uc(0, 0, 0));\n  }\n\n  Vec4uc colorA(EdgeHandle _eh)   const\n  {\n      return (mesh_.has_edge_colors()\n      ? color_cast<Vec4uc>(mesh_.color(_eh))\n      : Vec4uc(0, 0, 0, 0));\n  }\n\n  Vec3ui colori(EdgeHandle _eh)    const\n  {\n      return (mesh_.has_edge_colors()\n      ? color_cast<Vec3ui>(mesh_.color(_eh))\n      : Vec3ui(0, 0, 0));\n  }\n\n  Vec4ui colorAi(EdgeHandle _eh)   const\n  {\n      return (mesh_.has_edge_colors()\n      ? color_cast<Vec4ui>(mesh_.color(_eh))\n      : Vec4ui(0, 0, 0, 0));\n  }\n\n  Vec3f colorf(EdgeHandle _eh)    const\n  {\n    return (mesh_.has_vertex_colors()\n\t    ? color_cast<Vec3f>(mesh_.color(_eh))\n\t    : Vec3f(0, 0, 0));\n  }\n\n  Vec4f colorAf(EdgeHandle _eh)   const\n  {\n    return (mesh_.has_vertex_colors()\n      ? color_cast<Vec4f>(mesh_.color(_eh))\n      : Vec4f(0, 0, 0, 0));\n  }\n\n  // get face data\n\n  unsigned int get_vhandles(FaceHandle _fh,\n\t\t\t    std::vector<VertexHandle>& _vhandles) const\n  {\n    unsigned int count(0);\n    _vhandles.clear();\n    for (typename Mesh::CFVIter fv_it=mesh_.cfv_iter(_fh); fv_it.is_valid(); ++fv_it)\n    {\n      _vhandles.push_back(*fv_it);\n      ++count;\n    }\n    return count;\n  }\n\n  Vec3f  normal(FaceHandle _fh)   const\n  {\n    return (mesh_.has_face_normals()\n            ? vector_cast<Vec3f>(mesh_.normal(_fh))\n            : Vec3f(0.0f, 0.0f, 0.0f));\n  }\n\n  Vec3uc  color(FaceHandle _fh)   const\n  {\n    return (mesh_.has_face_colors()\n            ? color_cast<Vec3uc>(mesh_.color(_fh))\n            : Vec3uc(0, 0, 0));\n  }\n\n  Vec4uc  colorA(FaceHandle _fh)   const\n  {\n    return (mesh_.has_face_colors()\n            ? color_cast<Vec4uc>(mesh_.color(_fh))\n            : Vec4uc(0, 0, 0, 0));\n  }\n\n  Vec3ui  colori(FaceHandle _fh)   const\n  {\n    return (mesh_.has_face_colors()\n            ? color_cast<Vec3ui>(mesh_.color(_fh))\n            : Vec3ui(0, 0, 0));\n  }\n\n  Vec4ui  colorAi(FaceHandle _fh)   const\n  {\n    return (mesh_.has_face_colors()\n            ? color_cast<Vec4ui>(mesh_.color(_fh))\n            : Vec4ui(0, 0, 0, 0));\n  }\n\n  Vec3f colorf(FaceHandle _fh)    const\n  {\n    return (mesh_.has_vertex_colors()\n\t    ? color_cast<Vec3f>(mesh_.color(_fh))\n\t    : Vec3f(0, 0, 0));\n  }\n\n  Vec4f colorAf(FaceHandle _fh)   const\n  {\n    return (mesh_.has_vertex_colors()\n      ? color_cast<Vec4f>(mesh_.color(_fh))\n      : Vec4f(0, 0, 0, 0));\n  }\n\n  virtual const BaseKernel* kernel() { return &mesh_; }\n\n\n  // query number of faces, vertices, normals, texcoords\n  size_t n_vertices()  const { return mesh_.n_vertices(); }\n  size_t n_faces()     const { return mesh_.n_faces(); }\n  size_t n_edges()     const { return mesh_.n_edges(); }\n\n\n  // property information\n  bool is_triangle_mesh() const\n  { return Mesh::is_triangles(); }\n\n  bool has_vertex_normals()   const { return mesh_.has_vertex_normals();   }\n  bool has_vertex_colors()    const { return mesh_.has_vertex_colors();    }\n  bool has_vertex_texcoords() const { return mesh_.has_vertex_texcoords2D(); }\n  bool has_edge_colors()      const { return mesh_.has_edge_colors();      }\n  bool has_face_normals()     const { return mesh_.has_face_normals();     }\n  bool has_face_colors()      const { return mesh_.has_face_colors();      }\n\nprivate:\n\n   const Mesh& mesh_;\n};\n\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n#endif\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/importer/BaseImporter.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------*\n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         *\n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/\n\n/*===========================================================================*\\\n *                                                                           *\n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  Implements the baseclass for IOManager importer modules\n//\n//=============================================================================\n\n\n#ifndef __BASEIMPORTER_HH__\n#define __BASEIMPORTER_HH__\n\n\n//=== INCLUDES ================================================================\n\n\n// STL\n#include <vector>\n\n// OpenMesh\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/Geometry/VectorT.hh>\n#include <OpenMesh/Core/Mesh/BaseKernel.hh>\n\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\nnamespace IO {\n\n\n//=== IMPLEMENTATION ==========================================================\n\n\n/**  Base class for importer modules. Importer modules provide an\n *   interface between the loader modules and the target data\n *   structure. This is basically a wrapper providing virtual versions\n *   for the required mesh functions.\n */\nclass OPENMESHDLLEXPORT BaseImporter\n{\npublic:\n\n  // base class needs virtual destructor\n  virtual ~BaseImporter() {}\n\n\n  // add a vertex with coordinate \\c _point\n  virtual VertexHandle add_vertex(const Vec3f& _point) = 0;\n\n  // add a face with indices _indices refering to vertices\n  typedef std::vector<VertexHandle> VHandles;\n  virtual FaceHandle add_face(const VHandles& _indices) = 0;\n\n  // add texture coordinates per face, _vh references the first texcoord\n  virtual void add_face_texcoords( FaceHandle _fh, VertexHandle _vh, const std::vector<Vec2f>& _face_texcoords) = 0;\n\n  // Set the texture index for a face\n  virtual void set_face_texindex( FaceHandle _fh, int _texId ) = 0;\n\n  // set vertex normal\n  virtual void set_normal(VertexHandle _vh, const Vec3f& _normal) = 0;\n\n  // set vertex color\n  virtual void set_color(VertexHandle _vh, const Vec3uc& _color) = 0;\n\n  // set vertex color\n  virtual void set_color(VertexHandle _vh, const Vec4uc& _color) = 0;\n\n  // set vertex color\n  virtual void set_color(VertexHandle _vh, const Vec3f& _color) = 0;\n\n  // set vertex color\n  virtual void set_color(VertexHandle _vh, const Vec4f& _color) = 0;\n\n  // set vertex texture coordinate\n  virtual void set_texcoord(VertexHandle _vh, const Vec2f& _texcoord) = 0;\n\n  // set vertex texture coordinate\n  virtual void set_texcoord(HalfedgeHandle _heh, const Vec2f& _texcoord) = 0;\n\n  // set edge color\n  virtual void set_color(EdgeHandle _eh, const Vec3uc& _color) = 0;\n\n  // set edge color\n  virtual void set_color(EdgeHandle _eh, const Vec4uc& _color) = 0;\n\n  // set edge color\n  virtual void set_color(EdgeHandle _eh, const Vec3f& _color) = 0;\n\n  // set edge color\n  virtual void set_color(EdgeHandle _eh, const Vec4f& _color) = 0;\n\n  // set face normal\n  virtual void set_normal(FaceHandle _fh, const Vec3f& _normal) = 0;\n\n  // set face color\n  virtual void set_color(FaceHandle _fh, const Vec3uc& _color) = 0;\n\n  // set face color\n  virtual void set_color(FaceHandle _fh, const Vec4uc& _color) = 0;\n\n  // set face color\n  virtual void set_color(FaceHandle _fh, const Vec3f& _color) = 0;\n\n  // set face color\n  virtual void set_color(FaceHandle _fh, const Vec4f& _color) = 0;\n\n  // Store a property in the mesh mapping from an int to a texture file\n  // Use set_face_texindex to set the index for each face\n  virtual void add_texture_information( int _id , std::string _name ) = 0;\n\n  // get reference to base kernel\n  virtual BaseKernel* kernel() { return 0; }\n\n  virtual bool is_triangle_mesh()     const { return false; }\n\n  // reserve mem for elements\n  virtual void reserve( unsigned int /* nV */,\n\t\t                  unsigned int /* nE */,\n\t\t                  unsigned int /* nF */) {}\n\n  // query number of faces, vertices, normals, texcoords\n  virtual size_t n_vertices()   const = 0;\n  virtual size_t n_faces()      const = 0;\n  virtual size_t n_edges()      const = 0;\n\n\n  // pre-processing\n  virtual void prepare()  {}\n\n  // post-processing\n  virtual void finish()  {}\n};\n\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n#endif\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/importer/ImporterT.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------*\n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         *\n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/\n\n/*===========================================================================*\\\n *                                                                           *\n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  Implements an importer module for arbitrary OpenMesh meshes\n//\n//=============================================================================\n\n\n#ifndef __IMPORTERT_HH__\n#define __IMPORTERT_HH__\n\n\n//=== INCLUDES ================================================================\n\n\n#include <OpenMesh/Core/IO/importer/BaseImporter.hh>\n#include <OpenMesh/Core/Utils/vector_cast.hh>\n#include <OpenMesh/Core/Utils/color_cast.hh>\n#include <OpenMesh/Core/Mesh/Attributes.hh>\n#include <OpenMesh/Core/System/omstream.hh>\n\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\nnamespace IO {\n\n\n//=== IMPLEMENTATION ==========================================================\n\n\n/**\n *  This class template provides an importer module for OpenMesh meshes.\n */\ntemplate <class Mesh>\nclass ImporterT : public BaseImporter\n{\npublic:\n\n  typedef typename Mesh::Point       Point;\n  typedef typename Mesh::Normal      Normal;\n  typedef typename Mesh::Color       Color;\n  typedef typename Mesh::TexCoord2D  TexCoord2D;\n  typedef std::vector<VertexHandle>  VHandles;\n\n\n  ImporterT(Mesh& _mesh) : mesh_(_mesh), halfedgeNormals_() {}\n\n\n  virtual VertexHandle add_vertex(const Vec3f& _point)\n  {\n    return mesh_.add_vertex(vector_cast<Point>(_point));\n  }\n\n\n  virtual FaceHandle add_face(const VHandles& _indices)\n  {\n    FaceHandle fh;\n\n    if (_indices.size() > 2)\n    {\n      VHandles::const_iterator it, it2, end(_indices.end());\n\n\n      // test for valid vertex indices\n      for (it=_indices.begin(); it!=end; ++it)\n        if (! mesh_.is_valid_handle(*it))\n        {\n          omerr() << \"ImporterT: Face contains invalid vertex index\\n\";\n          return fh;\n        }\n\n\n      // don't allow double vertices\n      for (it=_indices.begin(); it!=end; ++it)\n        for (it2=it+1; it2!=end; ++it2)\n          if (*it == *it2)\n          {\n            omerr() << \"ImporterT: Face has equal vertices\\n\";\n            failed_faces_.push_back(_indices);\n            return fh;\n          }\n\n\n      // try to add face\n      fh = mesh_.add_face(_indices);\n      if (!fh.is_valid())\n      {\n        failed_faces_.push_back(_indices);\n        return fh;\n      }\n\n      //write the half edge normals\n      if (mesh_.has_halfedge_normals())\n      {\n        //iterate over all incoming haldedges of the added face\n        for (typename Mesh::FaceHalfedgeIter fh_iter = mesh_.fh_begin(fh);\n            fh_iter != mesh_.fh_end(fh); ++fh_iter)\n        {\n          //and write the normals to it\n          typename Mesh::HalfedgeHandle heh = *fh_iter;\n          typename Mesh::VertexHandle vh = mesh_.to_vertex_handle(heh);\n          typename std::map<VertexHandle,Normal>::iterator it_heNs = halfedgeNormals_.find(vh);\n          if (it_heNs != halfedgeNormals_.end())\n            mesh_.set_normal(heh,it_heNs->second);\n        }\n        halfedgeNormals_.clear();\n      }\n    }\n    return fh;\n  }\n\n  // vertex attributes\n\n  virtual void set_normal(VertexHandle _vh, const Vec3f& _normal)\n  {\n    if (mesh_.has_vertex_normals())\n      mesh_.set_normal(_vh, vector_cast<Normal>(_normal));\n\n    //saves normals for half edges.\n    //they will be written, when the face is added\n    if (mesh_.has_halfedge_normals())\n      halfedgeNormals_[_vh] = vector_cast<Normal>(_normal);\n  }\n\n  virtual void set_color(VertexHandle _vh, const Vec4uc& _color)\n  {\n    if (mesh_.has_vertex_colors())\n      mesh_.set_color(_vh, color_cast<Color>(_color));\n  }\n\n  virtual void set_color(VertexHandle _vh, const Vec3uc& _color)\n  {\n    if (mesh_.has_vertex_colors())\n      mesh_.set_color(_vh, color_cast<Color>(_color));\n  }\n\n  virtual void set_color(VertexHandle _vh, const Vec4f& _color)\n  {\n    if (mesh_.has_vertex_colors())\n      mesh_.set_color(_vh, color_cast<Color>(_color));\n  }\n\n  virtual void set_color(VertexHandle _vh, const Vec3f& _color)\n  {\n    if (mesh_.has_vertex_colors())\n      mesh_.set_color(_vh, color_cast<Color>(_color));\n  }\n\n  virtual void set_texcoord(VertexHandle _vh, const Vec2f& _texcoord)\n  {\n    if (mesh_.has_vertex_texcoords2D())\n      mesh_.set_texcoord2D(_vh, vector_cast<TexCoord2D>(_texcoord));\n  }\n\n  virtual void set_texcoord(HalfedgeHandle _heh, const Vec2f& _texcoord)\n  {\n    if (mesh_.has_halfedge_texcoords2D())\n      mesh_.set_texcoord2D(_heh, vector_cast<TexCoord2D>(_texcoord));\n  }\n\n  // edge attributes\n\n  virtual void set_color(EdgeHandle _eh, const Vec4uc& _color)\n  {\n      if (mesh_.has_edge_colors())\n          mesh_.set_color(_eh, color_cast<Color>(_color));\n  }\n\n  virtual void set_color(EdgeHandle _eh, const Vec3uc& _color)\n  {\n      if (mesh_.has_edge_colors())\n          mesh_.set_color(_eh, color_cast<Color>(_color));\n  }\n\n  virtual void set_color(EdgeHandle _eh, const Vec4f& _color)\n  {\n      if (mesh_.has_edge_colors())\n          mesh_.set_color(_eh, color_cast<Color>(_color));\n  }\n\n  virtual void set_color(EdgeHandle _eh, const Vec3f& _color)\n  {\n      if (mesh_.has_edge_colors())\n          mesh_.set_color(_eh, color_cast<Color>(_color));\n  }\n\n  // face attributes\n\n  virtual void set_normal(FaceHandle _fh, const Vec3f& _normal)\n  {\n    if (mesh_.has_face_normals())\n      mesh_.set_normal(_fh, vector_cast<Normal>(_normal));\n  }\n\n  virtual void set_color(FaceHandle _fh, const Vec3uc& _color)\n  {\n    if (mesh_.has_face_colors())\n      mesh_.set_color(_fh, color_cast<Color>(_color));\n  }\n\n  virtual void set_color(FaceHandle _fh, const Vec4uc& _color)\n  {\n    if (mesh_.has_face_colors())\n      mesh_.set_color(_fh, color_cast<Color>(_color));\n  }\n\n  virtual void set_color(FaceHandle _fh, const Vec3f& _color)\n  {\n    if (mesh_.has_face_colors())\n      mesh_.set_color(_fh, color_cast<Color>(_color));\n  }\n\n  virtual void set_color(FaceHandle _fh, const Vec4f& _color)\n  {\n    if (mesh_.has_face_colors())\n      mesh_.set_color(_fh, color_cast<Color>(_color));\n  }\n\n  virtual void add_face_texcoords( FaceHandle _fh, VertexHandle _vh, const std::vector<Vec2f>& _face_texcoords)\n  {\n    // get first halfedge handle\n    HalfedgeHandle cur_heh   = mesh_.halfedge_handle(_fh);\n    HalfedgeHandle end_heh   = mesh_.prev_halfedge_handle(cur_heh);\n\n    // find start heh\n    while( mesh_.to_vertex_handle(cur_heh) != _vh && cur_heh != end_heh )\n      cur_heh = mesh_.next_halfedge_handle( cur_heh);\n\n    for(unsigned int i=0; i<_face_texcoords.size(); ++i)\n    {\n      set_texcoord( cur_heh, _face_texcoords[i]);\n      cur_heh = mesh_.next_halfedge_handle( cur_heh);\n    }\n  }\n\n  virtual void set_face_texindex( FaceHandle _fh, int _texId ) {\n    if ( mesh_.has_face_texture_index() ) {\n      mesh_.set_texture_index(_fh , _texId);\n    }\n  }\n\n  virtual void add_texture_information( int _id , std::string _name ) {\n    OpenMesh::MPropHandleT< std::map< int, std::string > > property;\n\n    if ( !mesh_.get_property_handle(property,\"TextureMapping\") ) {\n      mesh_.add_property(property,\"TextureMapping\");\n    }\n\n    if ( mesh_.property(property).find( _id ) == mesh_.property(property).end() )\n      mesh_.property(property)[_id] = _name;\n  }\n\n  // low-level access to mesh\n\n  virtual BaseKernel* kernel() { return &mesh_; }\n\n  bool is_triangle_mesh() const\n  { return Mesh::is_triangles(); }\n\n  void reserve(unsigned int nV, unsigned int nE, unsigned int nF)\n  {\n    mesh_.reserve(nV, nE, nF);\n  }\n\n  // query number of faces, vertices, normals, texcoords\n  size_t n_vertices()  const { return mesh_.n_vertices(); }\n  size_t n_faces()     const { return mesh_.n_faces(); }\n  size_t n_edges()     const { return mesh_.n_edges(); }\n\n\n  void prepare() { failed_faces_.clear(); }\n\n\n  void finish()\n  {\n    if (!failed_faces_.empty())\n    {\n      omerr() << failed_faces_.size()\n\t    << \" faces failed, adding them as isolated faces\\n\";\n\n      for (unsigned int i=0; i<failed_faces_.size(); ++i)\n      {\n        VHandles&  vhandles = failed_faces_[i];\n\n        // double vertices\n        for (unsigned int j=0; j<vhandles.size(); ++j)\n        {\n          Point p = mesh_.point(vhandles[j]);\n          vhandles[j] = mesh_.add_vertex(p);\n          // DO STORE p, reference may not work since vertex array\n          // may be relocated after adding a new vertex !\n\n          // Mark vertices of failed face as non-manifold\n          if (mesh_.has_vertex_status()) {\n              mesh_.status(vhandles[j]).set_fixed_nonmanifold(true);\n          }\n        }\n\n        // add face\n        FaceHandle fh = mesh_.add_face(vhandles);\n\n        // Mark failed face as non-manifold\n        if (mesh_.has_face_status())\n            mesh_.status(fh).set_fixed_nonmanifold(true);\n\n        // Mark edges of failed face as non-two-manifold\n        if (mesh_.has_edge_status()) {\n            typename Mesh::FaceEdgeIter fe_it = mesh_.fe_iter(fh);\n            for(; fe_it.is_valid(); ++fe_it) {\n                mesh_.status(*fe_it).set_fixed_nonmanifold(true);\n            }\n        }\n      }\n\n      failed_faces_.clear();\n    }\n  }\n\n\n\nprivate:\n\n  Mesh& mesh_;\n  std::vector<VHandles>  failed_faces_;\n  // stores normals for halfedges of the next face\n  std::map<VertexHandle,Normal> halfedgeNormals_;\n};\n\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n#endif\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/reader/BaseReader.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=== INCLUDES ================================================================\n\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/IO/reader/BaseReader.hh>\n#include <algorithm>\n#include <string>\n#include <iterator>\n#if defined(OM_CC_MIPS)\n#  include <ctype.h>\n#else\n#  include <cctype>\n#endif\n\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\nnamespace IO {\n\n\n//=== IMPLEMENTATION ==========================================================\n\n\nstatic inline char tolower(char c) \n{\n  using namespace std;\n  return ::tolower(c); \n}\n\n\n//-----------------------------------------------------------------------------\n\n\nbool \nBaseReader::\ncan_u_read(const std::string& _filename) const \n{\n  // get file extension\n  std::string extension;\n  std::string::size_type pos(_filename.rfind(\".\"));\n\n  if (pos != std::string::npos)\n  { \n    extension = _filename.substr(pos+1, _filename.length()-pos-1);\n\n    std::transform( extension.begin(), extension.end(), \n\t\t    extension.begin(), tolower );\n  }\n\n  // locate extension in extension string\n  return (get_extensions().find(extension) != std::string::npos);\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nbool \nBaseReader::\ncheck_extension(const std::string& _fname, const std::string& _ext) const\n{\n  std::string cmpExt(_ext);\n\n  std::transform( _ext.begin(), _ext.end(),  cmpExt.begin(), tolower );\n\n  std::string::size_type pos(_fname.rfind(\".\"));\n\n  if (pos != std::string::npos && !_ext.empty() )\n  { \n    std::string ext;\n\n    // extension without dot!\n    ext = _fname.substr(pos+1, _fname.length()-pos-1);\n\n    std::transform( ext.begin(), ext.end(), ext.begin(), tolower );\n    \n    return ext == cmpExt;\n  }\n  return false;  \n}\n\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/reader/BaseReader.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  Implements the baseclass for IOManager file access modules\n//\n//=============================================================================\n\n\n#ifndef __BASEREADER_HH__\n#define __BASEREADER_HH__\n\n\n//=== INCLUDES ================================================================\n\n\n// STD C++\n#include <iostream>\n#include <string>\n#include <cctype>\n#include <functional>\n\n// OpenMesh\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/IO/Options.hh>\n#include <OpenMesh/Core/IO/importer/BaseImporter.hh>\n#include <OpenMesh/Core/Utils/SingletonT.hh>\n\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\nnamespace IO {\n\n\n//=== IMPLEMENTATION ==========================================================\n\n\n/**\n   Base class for reader modules.\n   Reader modules access persistent data and pass them to the desired\n   data structure by the means of a BaseImporter derivative.\n   All reader modules must be derived from this class.\n*/\nclass OPENMESHDLLEXPORT BaseReader\n{\npublic:\n\n  /// Destructor\n  virtual ~BaseReader() {};\n\n  /// Returns a brief description of the file type that can be parsed.\n  virtual std::string get_description() const = 0;\n  \n  /** Returns a string with the accepted file extensions separated by a \n      whitespace and in small caps.\n  */\n  virtual std::string get_extensions() const = 0;\n\n  /// Return magic bits used to determine file format\n  virtual std::string get_magic() const { return std::string(\"\"); }\n\n\n  /** Reads a mesh given by a filename. Usually this method opens a stream\n      and passes it to stream read method. Acceptance checks by filename\n      extension can be placed here.\n\n      Options can be passed via _opt. After execution _opt contains the Options\n      that were available\n  */\n  virtual bool read(const std::string& _filename, \n\t\t    BaseImporter& _bi,\n                    Options& _opt) = 0;\n\t\t\n /** Reads a mesh given by a std::stream. This method usually uses the same stream reading method\n    that read uses. Options can be passed via _opt. After execution _opt contains the Options\n      that were available.\n\n      Please make sure that if _is is std::ifstream, the correct std::ios_base::openmode flags are set. \n  */\n  virtual bool read(std::istream& _is, \n\t\t    BaseImporter& _bi,\n                    Options& _opt) = 0;\n\n\n  /// Returns true if reader can parse _filename (checks extension)\n  virtual bool can_u_read(const std::string& _filename) const;\n\n\nprotected:\n\n  // case insensitive search for _ext in _fname.\n  bool check_extension(const std::string& _fname, \n\t\t       const std::string& _ext) const;\n};\n\n\n/** \\brief Trim left whitespace\n *\n * Removes whitespace at the beginning of the string\n *\n * @param _string input string\n * @return trimmed string\n */\nstatic inline std::string &left_trim(std::string &_string) {\n  _string.erase(_string.begin(), std::find_if(_string.begin(), _string.end(), std::not1(std::ptr_fun<int, int>(std::isspace))));\n  return _string;\n}\n\n/** \\brief Trim right whitespace\n *\n * Removes whitespace at the end of the string\n *\n * @param _string input string\n * @return trimmed string\n */\nstatic inline std::string &right_trim(std::string &_string) {\n  _string.erase(std::find_if(_string.rbegin(), _string.rend(), std::not1(std::ptr_fun<int, int>(std::isspace))).base(), _string.end());\n  return _string;\n}\n\n/** \\brief Trim whitespace\n *\n * Removes whitespace at the beginning and end of the string\n *\n * @param _string input string\n * @return trimmed string\n */\nstatic inline std::string &trim(std::string &_string) {\n  return left_trim(right_trim(_string));\n}\n\n\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n#endif\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/reader/OBJReader.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------*\n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         *\n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/\n\n/*===========================================================================*\\\n *                                                                           *\n *   $Revision: 1053 $                                                         *\n *   $Date: 2014-05-09 14:44:18 +0200 (金, 09 5 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//== INCLUDES =================================================================\n\n\n// OpenMesh\n#include <OpenMesh/Core/IO/reader/OBJReader.hh>\n#include <OpenMesh/Core/IO/IOManager.hh>\n#include <OpenMesh/Core/System/omstream.hh>\n#include <OpenMesh/Core/Utils/vector_cast.hh>\n#include <OpenMesh/Core/Utils/color_cast.hh>\n// STL\n#if defined(OM_CC_MIPS)\n#  include <ctype.h>\n/// \\bug Workaround for STLPORT 4.6: isspace seems not to be in namespace std!\n#elif defined(_STLPORT_VERSION) && (_STLPORT_VERSION==0x460)\n#  include <cctype>\n#else\n#  include <cctype>\nusing std::isspace;\n#endif\n\n#ifndef WIN32\n#include <string.h>\n#endif\n\n//=== NAMESPACES ==============================================================\n\n\nnamespace OpenMesh {\nnamespace IO {\n\n\n//=== INSTANCIATE =============================================================\n\n\n_OBJReader_  __OBJReaderInstance;\n_OBJReader_& OBJReader() { return __OBJReaderInstance; }\n\n\n//=== IMPLEMENTATION ==========================================================\n\n//-----------------------------------------------------------------------------\n\nvoid trimString( std::string& _string) {\n  // Trim Both leading and trailing spaces\n\n  size_t start = _string.find_first_not_of(\" \\t\\r\\n\");\n  size_t end   = _string.find_last_not_of(\" \\t\\r\\n\");\n\n  if(( std::string::npos == start ) || ( std::string::npos == end))\n    _string = \"\";\n  else\n    _string = _string.substr( start, end-start+1 );\n}\n\n//-----------------------------------------------------------------------------\n\n_OBJReader_::\n_OBJReader_()\n{\n  IOManager().register_module(this);\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nbool\n_OBJReader_::\nread(const std::string& _filename, BaseImporter& _bi, Options& _opt)\n{\n  std::fstream in( _filename.c_str(), std::ios_base::in );\n\n  if (!in.is_open() || !in.good())\n  {\n    omerr() << \"[OBJReader] : cannot not open file \"\n          << _filename\n          << std::endl;\n    return false;\n  }\n\n  {\n#if defined(WIN32)\n    std::string::size_type dot = _filename.find_last_of(\"\\\\/\");\n#else\n    std::string::size_type dot = _filename.rfind(\"/\");\n#endif\n    path_ = (dot == std::string::npos)\n      ? \"./\"\n      : std::string(_filename.substr(0,dot+1));\n  }\n\n  bool result = read(in, _bi, _opt);\n\n  in.close();\n  return result;\n}\n\n//-----------------------------------------------------------------------------\n\nbool\n_OBJReader_::\nread_material(std::fstream& _in)\n{\n  std::string line;\n  std::string keyWrd;\n  std::string textureName;\n\n  std::string key;\n  Material    mat;\n  float       f1,f2,f3;\n  bool        indef = false;\n  int         textureId = 1;\n\n\n  materials_.clear();\n  mat.cleanup();\n\n  while( _in && !_in.eof() )\n  {\n    std::getline(_in,line);\n    if ( _in.bad() ){\n      omerr() << \"  Warning! Could not read file properly!\\n\";\n      return false;\n    }\n\n    if ( line.empty() )\n      continue;\n\n    std::stringstream stream(line);\n\n    stream >> keyWrd;\n\n    if( ( isspace(line[0]) && line[0] != '\\t' ) || line[0] == '#' )\n    {\n      if (indef && !key.empty() && mat.is_valid())\n      {\n        materials_[key] = mat;\n        mat.cleanup();\n      }\n    }\n\n    else if (keyWrd == \"newmtl\") // begin new material definition\n    {\n      stream >> key;\n      indef = true;\n    }\n\n    else if (keyWrd == \"Kd\") // diffuse color\n    {\n      stream >> f1; stream >> f2; stream >> f3;\n\n      if( !stream.fail() )\n        mat.set_Kd(f1,f2,f3);\n    }\n\n    else if (keyWrd == \"Ka\") // ambient color\n    {\n      stream >> f1; stream >> f2; stream >> f3;\n\n      if( !stream.fail() )\n        mat.set_Ka(f1,f2,f3);\n    }\n\n    else if (keyWrd == \"Ks\") // specular color\n    {\n      stream >> f1; stream >> f2; stream >> f3;\n\n      if( !stream.fail() )\n        mat.set_Ks(f1,f2,f3);\n    }\n#if 0\n    else if (keyWrd == \"illum\") // diffuse/specular shading model\n    {\n      ; // just skip this\n    }\n\n    else if (keyWrd == \"Ns\") // Shininess [0..200]\n    {\n      ; // just skip this\n    }\n\n    else if (keyWrd == \"map_\") // map images\n    {\n      // map_Ks, specular map\n      // map_Ka, ambient map\n      // map_Bump, bump map\n      // map_d,  opacity map\n      ; // just skip this\n    }\n#endif\n    else if (keyWrd == \"map_Kd\" ) {\n      // Get the rest of the line, removing leading or trailing spaces\n      // This will define the filename of the texture\n      std::getline(stream,textureName);\n      trimString(textureName);\n      if ( ! textureName.empty() )\n        mat.set_map_Kd( textureName, textureId++ );\n    }\n    else if (keyWrd == \"Tr\") // transparency value\n    {\n      stream >> f1;\n\n      if( !stream.fail() )\n        mat.set_Tr(f1);\n    }\n    else if (keyWrd == \"d\") // transparency value\n    {\n      stream >> f1;\n\n      if( !stream.fail() )\n        mat.set_Tr(f1);\n    }\n\n    if ( _in && indef && mat.is_valid() && !key.empty())\n      materials_[key] = mat;\n  }\n  return true;\n}\n\n//-----------------------------------------------------------------------------\n\nbool\n_OBJReader_::\nread(std::istream& _in, BaseImporter& _bi, Options& _opt)\n{\n\n  std::string line;\n  std::string keyWrd;\n\n  float                     x, y, z, u, v;\n  int                       r, g, b;\n  BaseImporter::VHandles    vhandles;\n  std::vector<Vec3f>        normals;\n  std::vector<Vec3uc>       colors;\n  std::vector<Vec2f>        texcoords;\n  std::vector<Vec2f>        face_texcoords;\n  std::vector<VertexHandle> vertexHandles;\n\n  std::string               matname;\n\n\n  // Options supplied by the user\n  Options userOptions = _opt;\n\n  // Options collected via file parsing\n  Options fileOptions;\n\n\n  while( _in && !_in.eof() )\n  {\n    std::getline(_in,line);\n    if ( _in.bad() ){\n      omerr() << \"  Warning! Could not read file properly!\\n\";\n      return false;\n    }\n\n    // Trim Both leading and trailing spaces\n    trimString(line);\n\n    // comment\n    if ( line.size() == 0 || line[0] == '#' || isspace(line[0]) ) {\n      continue;\n    }\n\n    std::stringstream stream(line);\n\n    stream >> keyWrd;\n\n    // material file\n    if (keyWrd == \"mtllib\")\n    {\n      std::string matFile;\n\n      // Get the rest of the line, removing leading or trailing spaces\n      // This will define the filename of the texture\n      std::getline(stream,matFile);\n      trimString(matFile);\n\n      matFile = path_ + matFile;\n\n      //omlog() << \"Load material file \" << matFile << std::endl;\n\n      std::fstream matStream( matFile.c_str(), std::ios_base::in );\n\n      if ( matStream ){\n\n        if ( !read_material( matStream ) )\n\t        omerr() << \"  Warning! Could not read file properly!\\n\";\n        matStream.close();\n\n      }else\n\t      omerr() << \"  Warning! Material file '\" << matFile << \"' not found!\\n\";\n\n      //omlog() << \"  \" << materials_.size() << \" materials loaded.\\n\";\n\n      for ( MaterialList::iterator material = materials_.begin(); material != materials_.end(); ++material )\n      {\n        // Save the texture information in a property\n        if ( (*material).second.has_map_Kd() )\n          _bi.add_texture_information( (*material).second.map_Kd_index() , (*material).second.map_Kd() );\n      }\n\n    }\n\n    // usemtl\n    else if (keyWrd == \"usemtl\")\n    {\n      stream >> matname;\n      if (materials_.find(matname)==materials_.end())\n      {\n        omerr() << \"Warning! Material '\" << matname\n              << \"' not defined in material file.\\n\";\n        matname=\"\";\n      }\n    }\n\n    // vertex\n    else if (keyWrd == \"v\")\n    {\n      stream >> x; stream >> y; stream >> z;\n\n      if ( !stream.fail() )\n      {\n        vertexHandles.push_back(_bi.add_vertex(OpenMesh::Vec3f(x,y,z)));\n        stream >> r; stream >> g; stream >> b;\n\n        if ( !stream.fail() )\n        {\n          if (  userOptions.vertex_has_color() ) {\n            fileOptions += Options::VertexColor;\n            colors.push_back(OpenMesh::Vec3uc((unsigned char)r,(unsigned char)g,(unsigned char)b));\n          }\n        }\n      }\n    }\n\n    // texture coord\n    else if (keyWrd == \"vt\")\n    {\n      stream >> u; stream >> v;\n\n      if ( !stream.fail()  ){\n\n        if ( userOptions.vertex_has_texcoord() || userOptions.face_has_texcoord() ) {\n          texcoords.push_back(OpenMesh::Vec2f(u, v));\n\n          // Can be used for both!\n          fileOptions += Options::VertexTexCoord;\n          fileOptions += Options::FaceTexCoord;\n        }\n\n      }else{\n\n        omerr() << \"Only single 2D texture coordinate per vertex\"\n              << \"allowed!\" << std::endl;\n        return false;\n      }\n    }\n\n    // color per vertex\n    else if (keyWrd == \"vc\")\n    {\n      stream >> r; stream >> g; stream >> b;\n\n      if ( !stream.fail()   ){\n        if ( userOptions.vertex_has_color() ) {\n          colors.push_back(OpenMesh::Vec3uc((unsigned char)r,(unsigned char)g,(unsigned char)b));\n          fileOptions += Options::VertexColor;\n        }\n      }\n    }\n\n    // normal\n    else if (keyWrd == \"vn\")\n    {\n      stream >> x; stream >> y; stream >> z;\n\n      if ( !stream.fail() ) {\n        if (userOptions.vertex_has_normal() ){\n          normals.push_back(OpenMesh::Vec3f(x,y,z));\n          fileOptions += Options::VertexNormal;\n        }\n      }\n    }\n\n\n    // face\n    else if (keyWrd == \"f\")\n    {\n      int component(0), nV(0);\n      int value;\n\n      vhandles.clear();\n      face_texcoords.clear();\n\n      // read full line after detecting a face\n      std::string faceLine;\n      std::getline(stream,faceLine);\n      std::stringstream lineData( faceLine );\n\n      FaceHandle fh;\n      BaseImporter::VHandles faceVertices;\n\n      // work on the line until nothing left to read\n      while ( !lineData.eof() )\n      {\n        // read one block from the line ( vertex/texCoord/normal )\n        std::string vertex;\n        lineData >> vertex;\n\n        do{\n\n          //get the component (vertex/texCoord/normal)\n          size_t found=vertex.find(\"/\");\n\n          // parts are seperated by '/' So if no '/' found its the last component\n          if( found != std::string::npos ){\n\n            // read the index value\n            std::stringstream tmp( vertex.substr(0,found) );\n\n            // If we get an empty string this property is undefined in the file\n            if ( vertex.substr(0,found).empty() ) {\n              // Switch to next field\n              vertex = vertex.substr(found+1);\n\n              // Now we are at the next component\n              ++component;\n\n              // Skip further processing of this component\n              continue;\n            }\n\n            // Read current value\n            tmp >> value;\n\n            // remove the read part from the string\n            vertex = vertex.substr(found+1);\n\n          } else {\n\n            // last component of the vertex, read it.\n            std::stringstream tmp( vertex );\n            tmp >> value;\n\n            // Clear vertex after finished reading the line\n            vertex=\"\";\n\n            // Nothing to read here ( garbage at end of line )\n            if ( tmp.fail() ) {\n              continue;\n            }\n          }\n\n          // store the component ( each component is referenced by the index here! )\n          switch (component)\n          {\n            case 0: // vertex\n              if ( value < 0 ) {\n                // Calculation of index :\n                // -1 is the last vertex in the list\n                // As obj counts from 1 and not zero add +1\n                value = int(_bi.n_vertices() + value + 1);\n              }\n              // Obj counts from 1 and not zero .. array counts from zero therefore -1\n              vhandles.push_back(VertexHandle(value-1));\n              faceVertices.push_back(VertexHandle(value-1));\n              if (fileOptions.vertex_has_color() )\n                _bi.set_color(vhandles.back(), colors[value-1]);\n              break;\n\t      \n            case 1: // texture coord\n              if ( value < 0 ) {\n                // Calculation of index :\n                // -1 is the last vertex in the list\n                // As obj counts from 1 and not zero add +1\n                value = int(texcoords.size()) + value + 1;\n              }\n              assert(!vhandles.empty());\n\n\n              if ( fileOptions.vertex_has_texcoord() && userOptions.vertex_has_texcoord() ) {\n\n                if (!texcoords.empty() && (unsigned int) (value - 1) < texcoords.size()) {\n                  // Obj counts from 1 and not zero .. array counts from zero therefore -1\n                  _bi.set_texcoord(vhandles.back(), texcoords[value - 1]);\n                } else {\n                  omerr() << \"Error setting Texture coordinates\" << std::endl;\n                }\n\n                }\n\n                if (fileOptions.face_has_texcoord() && userOptions.face_has_texcoord() ) {\n\n                  if (!texcoords.empty() && (unsigned int) (value - 1) < texcoords.size()) {\n                    face_texcoords.push_back( texcoords[value-1] );\n                  } else {\n                    omerr() << \"Error setting Texture coordinates\" << std::endl;\n                  }\n                }\n\n\n              break;\n\n            case 2: // normal\n              if ( value < 0 ) {\n                // Calculation of index :\n                // -1 is the last vertex in the list\n                // As obj counts from 1 and not zero add +1\n                value = int(normals.size()) + value + 1;\n              }\n\n              // Obj counts from 1 and not zero .. array counts from zero therefore -1\n              if (fileOptions.vertex_has_normal() ) {\n                assert(!vhandles.empty());\n                assert((unsigned int)(value-1) < normals.size());\n                _bi.set_normal(vhandles.back(), normals[value-1]);\n              }\n              break;\n          }\n\n          // Prepare for reading next component\n          ++component;\n\n          // Read until line does not contain any other info\n        } while ( !vertex.empty() );\n\n        component = 0;\n        nV++;\n\n      }\n\n      // note that add_face can possibly triangulate the faces, which is why we have to\n      // store the current number of faces first\n      size_t n_faces = _bi.n_faces();\n      fh = _bi.add_face(faceVertices);\n\n      if (!vhandles.empty() && fh.is_valid() )\n        _bi.add_face_texcoords(fh, vhandles[0], face_texcoords);\n\n      if ( !matname.empty()  )\n      {\n        std::vector<FaceHandle> newfaces;\n\n        for( size_t i=0; i < _bi.n_faces()-n_faces; ++i )\n          newfaces.push_back(FaceHandle(int(n_faces+i)));\n\n        Material& mat = materials_[matname];\n\n        if ( mat.has_Kd() ) {\n          Vec3uc fc = color_cast<Vec3uc, Vec3f>(mat.Kd());\n\n          if ( userOptions.face_has_color()) {\n\n            for (std::vector<FaceHandle>::iterator it = newfaces.begin(); it != newfaces.end(); ++it)\n              _bi.set_color(*it, fc);\n\n            fileOptions += Options::FaceColor;\n          }\n        }\n\n        // Set the texture index in the face index property\n        if ( mat.has_map_Kd() ) {\n\n          if (userOptions.face_has_texcoord()) {\n\n            for (std::vector<FaceHandle>::iterator it = newfaces.begin(); it != newfaces.end(); ++it)\n              _bi.set_face_texindex(*it, mat.map_Kd_index());\n\n            fileOptions += Options::FaceTexCoord;\n\n          }\n\n        } else {\n\n          // If we don't have the info, set it to no texture\n          if (userOptions.face_has_texcoord()) {\n\n            for (std::vector<FaceHandle>::iterator it = newfaces.begin(); it != newfaces.end(); ++it)\n              _bi.set_face_texindex(*it, 0);\n\n          }\n        }\n\n      } else {\n        std::vector<FaceHandle> newfaces;\n\n        for( size_t i=0; i < _bi.n_faces()-n_faces; ++i )\n          newfaces.push_back(FaceHandle(int(n_faces+i)));\n\n        // Set the texture index to zero as we don't have any information\n        if ( userOptions.face_has_texcoord() )\n          for (std::vector<FaceHandle>::iterator it = newfaces.begin(); it != newfaces.end(); ++it)\n            _bi.set_face_texindex(*it, 0);\n      }\n\n    }\n\n  }\n\n  // If we do not have any faces,\n  // assume this is a point cloud and read the normals and colors directly\n  if (_bi.n_faces() == 0)\n  {\n    int i = 0;\n    // add normal per vertex\n\n    if (normals.size() == _bi.n_vertices()) {\n      if ( fileOptions.vertex_has_normal() && userOptions.vertex_has_normal() ) {\n        for (std::vector<VertexHandle>::iterator it = vertexHandles.begin(); it != vertexHandles.end(); ++it, i++)\n          _bi.set_normal(*it, normals[i]);\n      }\n    }\n\n    // add color per vertex\n    i = 0;\n    if (colors.size() >= _bi.n_vertices())\n      if (fileOptions.vertex_has_color() && userOptions.vertex_has_color()) {\n        for (std::vector<VertexHandle>::iterator it = vertexHandles.begin(); it != vertexHandles.end(); ++it, i++)\n          _bi.set_color(*it, colors[i]);\n      }\n\n  }\n\n  // Return, what we actually read\n  _opt = fileOptions;\n\n  return true;\n}\n\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/reader/OBJReader.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------*\n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         *\n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/\n\n/*===========================================================================*\\\n *                                                                           *\n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  Implements an reader module for OBJ files\n//\n//=============================================================================\n\n\n#ifndef __OBJREADER_HH__\n#define __OBJREADER_HH__\n\n\n//=== INCLUDES ================================================================\n\n\n#include <iostream>\n#include <string>\n#include <vector>\n#include <map>\n#include <fstream>\n\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/Utils/SingletonT.hh>\n#include <OpenMesh/Core/IO/importer/BaseImporter.hh>\n#include <OpenMesh/Core/IO/reader/BaseReader.hh>\n\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\nnamespace IO {\n\n\n//== IMPLEMENTATION ===========================================================\n\n\n/**\n    Implementation of the OBJ format reader.\n*/\nclass OPENMESHDLLEXPORT _OBJReader_ : public BaseReader\n{\npublic:\n\n  _OBJReader_();\n\n  virtual ~_OBJReader_() { }\n\n  std::string get_description() const { return \"Alias/Wavefront\"; }\n  std::string get_extensions()  const { return \"obj\"; }\n\n  bool read(const std::string& _filename,\n\t    BaseImporter& _bi,\n\t    Options& _opt);\n\n  bool read(std::istream& _in,\n          BaseImporter& _bi,\n          Options& _opt);\n\nprivate:\n\n#ifndef DOXY_IGNORE_THIS\n  class Material\n  {\n  public:\n\n    Material() { cleanup(); }\n\n    void cleanup()\n    {\n      Kd_is_set_     = false;\n      Ka_is_set_     = false;\n      Ks_is_set_     = false;\n      Tr_is_set_     = false;\n      map_Kd_is_set_ = false;\n    }\n\n    bool is_valid(void) const\n    { return Kd_is_set_ || Ka_is_set_ || Ks_is_set_ || Tr_is_set_; }\n\n    bool has_Kd(void)     { return Kd_is_set_;     }\n    bool has_Ka(void)     { return Ka_is_set_;     }\n    bool has_Ks(void)     { return Ks_is_set_;     }\n    bool has_Tr(void)     { return Tr_is_set_;     }\n    bool has_map_Kd(void) { return map_Kd_is_set_; }\n\n    void set_Kd( float r, float g, float b )\n    { Kd_=Vec3f(r,g,b); Kd_is_set_=true; }\n\n    void set_Ka( float r, float g, float b )\n    { Ka_=Vec3f(r,g,b); Ka_is_set_=true; }\n\n    void set_Ks( float r, float g, float b )\n    { Ks_=Vec3f(r,g,b); Ks_is_set_=true; }\n\n    void set_Tr( float t )\n    { Tr_=t;            Tr_is_set_=true; }\n\n    void set_map_Kd( std::string _name, int _index_Kd )\n    { map_Kd_ = _name, index_Kd_ = _index_Kd; map_Kd_is_set_ = true; };\n\n    const Vec3f& Kd( void ) const { return Kd_; }\n    const Vec3f& Ka( void ) const { return Ka_; }\n    const Vec3f& Ks( void ) const { return Ks_; }\n    float  Tr( void ) const { return Tr_; }\n    const std::string& map_Kd( void ) { return map_Kd_ ; }\n    const int& map_Kd_index( void ) { return index_Kd_ ; }\n\n  private:\n\n    Vec3f Kd_;                          bool Kd_is_set_; // diffuse\n    Vec3f Ka_;                          bool Ka_is_set_; // ambient\n    Vec3f Ks_;                          bool Ks_is_set_; // specular\n    float Tr_;                          bool Tr_is_set_; // transperency\n\n    std::string map_Kd_; int index_Kd_; bool map_Kd_is_set_; // Texture\n\n  };\n#endif\n\n  typedef std::map<std::string, Material> MaterialList;\n\n  MaterialList materials_;\n\n  bool read_material( std::fstream& _in );\n\nprivate:\n\n  std::string path_;\n\n};\n\n\n//== TYPE DEFINITION ==========================================================\n\n\nextern _OBJReader_  __OBJReaderInstance;\nOPENMESHDLLEXPORT _OBJReader_& OBJReader();\n\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n#endif\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/reader/OFFReader.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------*\n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         *\n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/\n\n/*===========================================================================*\\\n *                                                                           *\n *   $Revision: 1053 $                                                         *\n *   $Date: 2014-05-09 14:44:18 +0200 (金, 09 5 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n#define LINE_LEN 4096\n\n\n//== INCLUDES =================================================================\n\n// OpenMesh\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/System/omstream.hh>\n#include <OpenMesh/Core/IO/reader/OFFReader.hh>\n#include <OpenMesh/Core/IO/importer/BaseImporter.hh>\n#include <OpenMesh/Core/IO/IOManager.hh>\n#include <OpenMesh/Core/Utils/color_cast.hh>\n// #include <OpenMesh/Core/IO/BinaryHelper.hh>\n\n#include <OpenMesh/Core/IO/SR_store.hh>\n\n//STL\n#include <iostream>\n#include <ios>\n#include <fstream>\n#include <memory>\n\n#if defined(OM_CC_MIPS)\n#  include <ctype.h>\n/// \\bug Workaround for STLPORT 4.6: isspace seems not to be in namespace std!\n#elif defined(_STLPORT_VERSION) && (_STLPORT_VERSION==0x460)\n#  include <cctype>\n#else\n#  include <cctype>\nusing std::isspace;\n#endif\n\n#ifndef WIN32\n#include <string.h>\n#endif\n\n//=== NAMESPACES ==============================================================\n\n\nnamespace OpenMesh {\nnamespace IO {\n\n\n//=============================================================================\n\n//=== INSTANCIATE =============================================================\n\n\n_OFFReader_  __OFFReaderInstance;\n_OFFReader_&  OFFReader() { return __OFFReaderInstance; }\n\n\n//=== IMPLEMENTATION ==========================================================\n\n\n\n_OFFReader_::_OFFReader_()\n{\n  IOManager().register_module(this);\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nbool\n_OFFReader_::read(const std::string& _filename, BaseImporter& _bi,\n                  Options& _opt)\n{\n  std::ifstream ifile(_filename.c_str(), (options_.is_binary() ? std::ios::binary | std::ios::in\n                                                           : std::ios::in) );\n\n  if (!ifile.is_open() || !ifile.good())\n  {\n    omerr() << \"[OFFReader] : cannot not open file \"\n\t  << _filename\n\t  << std::endl;\n\n    return false;\n  }\n\n  assert(ifile);\n\n  bool result = read(ifile, _bi, _opt);\n\n  ifile.close();\n  return result;\n}\n\n//-----------------------------------------------------------------------------\n\n\nbool\n_OFFReader_::read(std::istream& _in, BaseImporter& _bi, Options& _opt )\n{\n   if (!_in.good())\n   {\n     omerr() << \"[OMReader] : cannot not use stream \"\n       << std::endl;\n     return false;\n   }\n\n   // filter relevant options for reading\n   bool swap = _opt.check( Options::Swap );\n\n\n   userOptions_ = _opt;\n\n   // build options to be returned\n   _opt.clear();\n\n   if (options_.vertex_has_normal() && userOptions_.vertex_has_normal())     _opt += Options::VertexNormal;\n   if (options_.vertex_has_texcoord() && userOptions_.vertex_has_texcoord()) _opt += Options::VertexTexCoord;\n   if (options_.vertex_has_color() && userOptions_.vertex_has_color())       _opt += Options::VertexColor;\n   if (options_.face_has_color() && userOptions_.face_has_color())           _opt += Options::FaceColor;\n   if (options_.is_binary())                                                 _opt += Options::Binary;\n\n   //force user-choice for the alpha value when reading binary\n   if ( options_.is_binary() && userOptions_.color_has_alpha() )\n     options_ += Options::ColorAlpha;\n\n    return (options_.is_binary() ?\n \t   read_binary(_in, _bi, _opt, swap) :\n\t   read_ascii(_in, _bi, _opt));\n\n}\n\n\n\n//-----------------------------------------------------------------------------\n\nbool\n_OFFReader_::read_ascii(std::istream& _in, BaseImporter& _bi, Options& _opt) const\n{\n\n\n  unsigned int            i, j, k, l, idx;\n  unsigned int            nV, nF, dummy;\n  OpenMesh::Vec3f         v, n;\n  OpenMesh::Vec2f         t;\n  OpenMesh::Vec3i         c3;\n  OpenMesh::Vec3f         c3f;\n  OpenMesh::Vec4i         c4;\n  OpenMesh::Vec4f         c4f;\n  BaseImporter::VHandles  vhandles;\n  VertexHandle            vh;\n\n  // read header line\n  std::string header;\n  std::getline(_in,header);\n\n  // + #Vertice, #Faces, #Edges\n  _in >> nV;\n  _in >> nF;\n  _in >> dummy;\n\n  _bi.reserve(nV, 3*nV, nF);\n\n  // read vertices: coord [hcoord] [normal] [color] [texcoord]\n  for (i=0; i<nV && !_in.eof(); ++i)\n  {\n    // Always read VERTEX\n    _in >> v[0]; _in >> v[1]; _in >> v[2];\n\n    vh = _bi.add_vertex(v);\n\n    //perhaps read NORMAL\n    if ( options_.vertex_has_normal() ){\n\n      _in >> n[0]; _in >> n[1]; _in >> n[2];\n\n      if ( userOptions_.vertex_has_normal() )\n        _bi.set_normal(vh, n);\n    }\n\n    //take the rest of the line and check how colors are defined\n    std::string line;\n    std::getline(_in,line);\n\n    int colorType = getColorType(line, options_.vertex_has_texcoord() );\n\n    std::stringstream stream( line );\n\n    //perhaps read COLOR\n    if ( options_.vertex_has_color() ){\n\n      std::string trash;\n\n      switch (colorType){\n        case 0 : break; //no color\n        case 1 : stream >> trash; break; //one int (isn't handled atm)\n        case 2 : stream >> trash; stream >> trash; break; //corrupt format (ignore)\n        // rgb int\n        case 3 : stream >> c3[0];  stream >> c3[1];  stream >> c3[2];\n            if ( userOptions_.vertex_has_color() )\n              _bi.set_color( vh, Vec3uc( c3 ) );\n            break;\n        // rgba int\n        case 4 : stream >> c4[0];  stream >> c4[1];  stream >> c4[2]; stream >> c4[3];\n            if ( userOptions_.vertex_has_color() )\n              _bi.set_color( vh, Vec4uc( c4 ) );\n            break;\n        // rgb floats\n        case 5 : stream >> c3f[0];  stream >> c3f[1];  stream >> c3f[2];\n            if ( userOptions_.vertex_has_color() ) {\n              _bi.set_color( vh, c3f );\n              _opt += Options::ColorFloat;\n            }\n            break;\n        // rgba floats\n        case 6 : stream >> c4f[0];  stream >> c4f[1];  stream >> c4f[2]; stream >> c4f[3];\n            if ( userOptions_.vertex_has_color() ) {\n              _bi.set_color( vh, c4f );\n              _opt += Options::ColorFloat;\n            }\n            break;\n\n        default:\n            std::cerr << \"Error in file format (colorType = \" << colorType << \")\\n\";\n            break;\n      }\n    }\n    //perhaps read TEXTURE COORDs\n    if ( options_.vertex_has_texcoord() ){\n      stream >> t[0]; stream >> t[1];\n      if ( userOptions_.vertex_has_texcoord() )\n        _bi.set_texcoord(vh, t);\n    }\n  }\n\n  // faces\n  // #N <v1> <v2> .. <v(n-1)> [color spec]\n  for (i=0; i<nF; ++i)\n  {\n    // nV = number of Vertices for current face\n    _in >> nV;\n\n    if (nV == 3)\n    {\n      vhandles.resize(3);\n      _in >> j;\n      _in >> k;\n      _in >> l;\n\n      vhandles[0] = VertexHandle(j);\n      vhandles[1] = VertexHandle(k);\n      vhandles[2] = VertexHandle(l);\n    }\n    else\n    {\n      vhandles.clear();\n      for (j=0; j<nV; ++j)\n      {\n         _in >> idx;\n         vhandles.push_back(VertexHandle(idx));\n      }\n    }\n\n    FaceHandle fh = _bi.add_face(vhandles);\n\n    //perhaps read face COLOR\n    if ( options_.face_has_color() ){\n\n      //take the rest of the line and check how colors are defined\n      std::string line;\n      std::getline(_in,line);\n\n      int colorType = getColorType(line, false );\n\n      std::stringstream stream( line );\n\n      std::string trash;\n\n      switch (colorType){\n        case 0 : break; //no color\n        case 1 : stream >> trash; break; //one int (isn't handled atm)\n        case 2 : stream >> trash; stream >> trash; break; //corrupt format (ignore)\n        // rgb int\n        case 3 : stream >> c3[0];  stream >> c3[1];  stream >> c3[2];\n            if ( userOptions_.face_has_color() )\n              _bi.set_color( fh, Vec3uc( c3 ) );\n            break;\n        // rgba int\n        case 4 : stream >> c4[0];  stream >> c4[1];  stream >> c4[2]; stream >> c4[3];\n            if ( userOptions_.face_has_color() )\n              _bi.set_color( fh, Vec4uc( c4 ) );\n            break;\n        // rgb floats\n        case 5 : stream >> c3f[0];  stream >> c3f[1];  stream >> c3f[2];\n            if ( userOptions_.face_has_color() ) {\n              _bi.set_color( fh, c3f );\n              _opt += Options::ColorFloat;\n            }\n            break;\n        // rgba floats\n        case 6 : stream >> c4f[0];  stream >> c4f[1];  stream >> c4f[2]; stream >> c4f[3];\n            if ( userOptions_.face_has_color() ) {\n              _bi.set_color( fh, c4f );\n              _opt += Options::ColorFloat;\n            }\n            break;\n\n        default:\n            std::cerr << \"Error in file format (colorType = \" << colorType << \")\\n\";\n            break;\n      }\n    }\n  }\n\n  // File was successfully parsed.\n  return true;\n}\n\n\n//-----------------------------------------------------------------------------\n\nint _OFFReader_::getColorType(std::string& _line, bool _texCoordsAvailable) const\n{\n/*\n  0 : no Color\n  1 : one int (e.g colormap index)\n  2 : two items (error!)\n  3 : 3 ints\n  4 : 3 ints\n  5 : 3 floats\n  6 : 4 floats\n\n*/\n\t// Check if we have any additional information here\n\tif ( _line.size() < 1 )\n\t\treturn 0;\n\n    //first remove spaces at start/end of the line\n    while (_line.size() > 0 && std::isspace(_line[0]))\n      _line = _line.substr(1);\n    while (_line.size() > 0 && std::isspace(_line[ _line.length()-1 ]))\n      _line = _line.substr(0, _line.length()-1);\n\n    //count the remaining items in the line\n    size_t found;\n    int count = 0;\n\n    found=_line.find_first_of(\" \");\n    while (found!=std::string::npos){\n      count++;\n      found=_line.find_first_of(\" \",found+1);\n    }\n\n    if (!_line.empty()) count++;\n\n    if (_texCoordsAvailable) count -= 2;\n\n    if (count == 3 || count == 4){\n      //get first item\n      found = _line.find(\" \");\n      std::string c1 = _line.substr (0,found);\n\n      if (c1.find(\".\") != std::string::npos){\n        if (count == 3)\n          count = 5;\n        else\n          count = 6;\n      }\n    }\n  return count;\n}\n\nvoid _OFFReader_::readValue(std::istream& _in, float& _value) const{\n  float32_t tmp;\n\n  restore( _in , tmp, false ); //assuming LSB byte order\n  _value = tmp;\n}\n\nvoid _OFFReader_::readValue(std::istream& _in, int& _value) const{\n  uint32_t tmp;\n\n  restore( _in , tmp, false ); //assuming LSB byte order\n  _value = tmp;\n}\n\nvoid _OFFReader_::readValue(std::istream& _in, unsigned int& _value) const{\n  uint32_t tmp;\n\n  restore( _in , tmp, false ); //assuming LSB byte order\n  _value = tmp;\n}\n\nbool\n_OFFReader_::read_binary(std::istream& _in, BaseImporter& _bi, Options& _opt, bool /*_swap*/) const\n{\n  unsigned int            i, j, k, l, idx;\n  unsigned int            nV, nF, dummy;\n  OpenMesh::Vec3f         v, n;\n  OpenMesh::Vec3i         c;\n  OpenMesh::Vec4i         cA;\n  OpenMesh::Vec3f         cf;\n  OpenMesh::Vec4f         cAf;\n  OpenMesh::Vec2f         t;\n  BaseImporter::VHandles  vhandles;\n  VertexHandle            vh;\n\n  // read header line\n  std::string header;\n  std::getline(_in,header);\n\n  // + #Vertice, #Faces, #Edges\n  readValue(_in, nV);\n  readValue(_in, nF);\n  readValue(_in, dummy);\n\n  _bi.reserve(nV, 3*nV, nF);\n\n  // read vertices: coord [hcoord] [normal] [color] [texcoord]\n  for (i=0; i<nV && !_in.eof(); ++i)\n  {\n    // Always read Vertex\n    readValue(_in, v[0]);\n    readValue(_in, v[1]);\n    readValue(_in, v[2]);\n\n    vh = _bi.add_vertex(v);\n\n    if ( options_.vertex_has_normal() ) {\n      readValue(_in, n[0]);\n      readValue(_in, n[1]);\n      readValue(_in, n[2]);\n\n      if ( userOptions_.vertex_has_normal() )\n        _bi.set_normal(vh, n);\n    }\n\n    if ( options_.vertex_has_color() ) {\n      if ( userOptions_.color_is_float() ) {\n        _opt += Options::ColorFloat;\n        //with alpha\n        if ( options_.color_has_alpha() ){\n          readValue(_in, cAf[0]);\n          readValue(_in, cAf[1]);\n          readValue(_in, cAf[2]);\n          readValue(_in, cAf[3]);\n\n          if ( userOptions_.vertex_has_color() )\n            _bi.set_color( vh, cAf );\n        }else{\n\n          //without alpha\n          readValue(_in, cf[0]);\n          readValue(_in, cf[1]);\n          readValue(_in, cf[2]);\n\n          if ( userOptions_.vertex_has_color() )\n            _bi.set_color( vh, cf );\n        }\n      } else {\n        //with alpha\n        if ( options_.color_has_alpha() ){\n          readValue(_in, cA[0]);\n          readValue(_in, cA[1]);\n          readValue(_in, cA[2]);\n          readValue(_in, cA[3]);\n\n          if ( userOptions_.vertex_has_color() )\n            _bi.set_color( vh, Vec4uc( cA ) );\n        }else{\n          //without alpha\n          readValue(_in, c[0]);\n          readValue(_in, c[1]);\n          readValue(_in, c[2]);\n\n          if ( userOptions_.vertex_has_color() )\n            _bi.set_color( vh, Vec3uc( c ) );\n        }\n      }\n    }\n\n    if ( options_.vertex_has_texcoord()) {\n      readValue(_in, t[0]);\n      readValue(_in, t[1]);\n\n      if ( userOptions_.vertex_has_texcoord() )\n        _bi.set_texcoord(vh, t);\n    }\n  }\n\n  // faces\n  // #N <v1> <v2> .. <v(n-1)> [color spec]\n  // So far color spec is unsupported!\n  for (i=0; i<nF; ++i)\n  {\n    readValue(_in, nV);\n\n    if (nV == 3)\n    {\n      vhandles.resize(3);\n      readValue(_in, j);\n      readValue(_in, k);\n      readValue(_in, l);\n\n      vhandles[0] = VertexHandle(j);\n      vhandles[1] = VertexHandle(k);\n      vhandles[2] = VertexHandle(l);\n    } else {\n      vhandles.clear();\n      for (j=0; j<nV; ++j)\n      {\n         readValue(_in, idx);\n         vhandles.push_back(VertexHandle(idx));\n      }\n    }\n\n    FaceHandle fh = _bi.add_face(vhandles);\n\n    //face color\n    if ( _opt.face_has_color() ) {\n      if ( userOptions_.color_is_float() ) {\n        _opt += Options::ColorFloat;\n        //with alpha\n        if ( options_.color_has_alpha() ){\n          readValue(_in, cAf[0]);\n          readValue(_in, cAf[1]);\n          readValue(_in, cAf[2]);\n          readValue(_in, cAf[3]);\n\n          if ( userOptions_.face_has_color() )\n            _bi.set_color( fh , cAf );\n        }else{\n          //without alpha\n          readValue(_in, cf[0]);\n          readValue(_in, cf[1]);\n          readValue(_in, cf[2]);\n\n          if ( userOptions_.face_has_color() )\n            _bi.set_color( fh, cf );\n        }\n      } else {\n        //with alpha\n        if ( options_.color_has_alpha() ){\n          readValue(_in, cA[0]);\n          readValue(_in, cA[1]);\n          readValue(_in, cA[2]);\n          readValue(_in, cA[3]);\n\n          if ( userOptions_.face_has_color() )\n            _bi.set_color( fh , Vec4uc( cA ) );\n        }else{\n          //without alpha\n          readValue(_in, c[0]);\n          readValue(_in, c[1]);\n          readValue(_in, c[2]);\n\n          if ( userOptions_.face_has_color() )\n            _bi.set_color( fh, Vec3uc( c ) );\n        }\n      }\n    }\n\n  }\n\n  // File was successfully parsed.\n  return true;\n\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nbool _OFFReader_::can_u_read(const std::string& _filename) const\n{\n  // !!! Assuming BaseReader::can_u_parse( std::string& )\n  // does not call BaseReader::read_magic()!!!\n  if (BaseReader::can_u_read(_filename))\n  {\n    std::ifstream ifs(_filename.c_str());\n    if (ifs.is_open() && can_u_read(ifs))\n    {\n      ifs.close();\n      return true;\n    }\n  }\n  return false;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nbool _OFFReader_::can_u_read(std::istream& _is) const\n{\n  options_.cleanup();\n\n  // read 1st line\n  char line[LINE_LEN], *p;\n  _is.getline(line, LINE_LEN);\n  p = line;\n\n  std::streamsize remainingChars = _is.gcount();\n\n  bool vertexDimensionTooHigh = false;\n\n  // check header: [ST][C][N][4][n]OFF BINARY\n\n  if ( ( remainingChars > 1 ) && ( p[0] == 'S' && p[1] == 'T') )\n  { options_ += Options::VertexTexCoord; p += 2; remainingChars -= 2; }\n\n  if ( ( remainingChars > 0 ) && ( p[0] == 'C') )\n  { options_ += Options::VertexColor;\n    options_ += Options::FaceColor; ++p; --remainingChars; }\n\n  if ( ( remainingChars > 0 ) && ( p[0] == 'N') )\n  { options_ += Options::VertexNormal; ++p; --remainingChars; }\n\n  if ( ( remainingChars > 0 ) && (p[0] == '4' ) )\n  { vertexDimensionTooHigh = true; ++p; --remainingChars; }\n\n  if ( ( remainingChars > 0 ) && ( p[0] == 'n') )\n  { vertexDimensionTooHigh = true; ++p; --remainingChars; }\n\n  if ( ( remainingChars < 3 ) || (!(p[0] == 'O' && p[1] == 'F' && p[2] == 'F')  ) )\n    return false;\n\n  p += 4;\n\n  // Detect possible garbage and make sure, we don't have an underflow\n  if ( remainingChars >= 4 )\n    remainingChars -= 4;\n  else\n    remainingChars = 0;\n\n  if ( ( remainingChars >= 6 ) && ( strncmp(p, \"BINARY\", 6) == 0 ) )\n    options_+= Options::Binary;\n\n  // vertex Dimensions != 3 are currently not supported\n  if (vertexDimensionTooHigh)\n    return false;\n\n  return true;\n}\n\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/reader/OFFReader.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------*\n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         *\n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/\n\n/*===========================================================================*\\\n *                                                                           *\n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  Implements a reader module for OFF files\n//\n//=============================================================================\n\n\n#ifndef __OFFREADER_HH__\n#define __OFFREADER_HH__\n\n\n//=== INCLUDES ================================================================\n\n\n#include <iostream>\n#include <string>\n#include <stdio.h>\n#include <fstream>\n\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/Utils/SingletonT.hh>\n#include <OpenMesh/Core/IO/reader/BaseReader.hh>\n\n#ifndef WIN32\n#include <string.h>\n#endif\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\nnamespace IO {\n\n\n//== FORWARDS =================================================================\n\n\nclass BaseImporter;\n\n\n//== IMPLEMENTATION ===========================================================\n\n\n/**\n    Implementation of the OFF format reader. This class is singleton'ed by\n    SingletonT to OFFReader.\n\n    By passing Options to the read function you can manipulate the reading behavoir.\n    The following options can be set:\n\n    VertexNormal\n    VertexColor\n    VertexTexCoord\n    FaceColor\n    ColorAlpha [only when reading binary]\n\n    These options define if the corresponding data should be read (if available)\n    or if it should be omitted.\n\n    After execution of the read function. The options object contains information about\n    what was actually read.\n\n    e.g. if VertexNormal was true when the read function was called, but the file\n    did not contain vertex normals then it is false afterwards.\n\n    When reading a binary off with Color Flag in the header it is assumed that all vertices\n    and faces have colors in the format \"int int int\".\n    If ColorAlpha is set the format \"int int int int\" is assumed.\n\n*/\n\nclass OPENMESHDLLEXPORT _OFFReader_ : public BaseReader\n{\npublic:\n\n  _OFFReader_();\n\n  /// Destructor\n  virtual ~_OFFReader_() {};\n\n  std::string get_description() const { return \"Object File Format\"; }\n  std::string get_extensions()  const { return \"off\"; }\n  std::string get_magic()       const { return \"OFF\"; }\n\n  bool read(const std::string& _filename,\n\t    BaseImporter& _bi,\n\t    Options& _opt);\n\n  bool can_u_read(const std::string& _filename) const;\n\n  bool read(std::istream& _in, BaseImporter& _bi, Options& _opt );\n\nprivate:\n\n  bool can_u_read(std::istream& _is) const;\n\n  bool read_ascii(std::istream& _in, BaseImporter& _bi, Options& _opt) const;\n  bool read_binary(std::istream& _in, BaseImporter& _bi, Options& _opt, bool swap) const;\n\n  void readValue(std::istream& _in, float& _value) const;\n  void readValue(std::istream& _in, int& _value) const;\n  void readValue(std::istream& _in, unsigned int& _value) const;\n\n  int getColorType(std::string & _line, bool _texCoordsAvailable) const;\n\n  //available options for reading\n  mutable Options options_;\n  //options that the user wants to read\n  mutable Options userOptions_;\n};\n\n\n//== TYPE DEFINITION ==========================================================\n\n\n/// Declare the single entity of the OFF reader\nextern _OFFReader_  __OFFReaderInstance;\nOPENMESHDLLEXPORT _OFFReader_& OFFReader();\n\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n#endif\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/reader/OMReader.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------*\n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         *\n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/\n\n/*===========================================================================*\\\n *                                                                           *\n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//== INCLUDES =================================================================\n\n\n//STL\n#include <fstream>\n\n// OpenMesh\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/System/omstream.hh>\n#include <OpenMesh/Core/Utils/Endian.hh>\n#include <OpenMesh/Core/IO/OMFormat.hh>\n#include <OpenMesh/Core/IO/reader/OMReader.hh>\n\n\n//=== NAMESPACES ==============================================================\n\n\nnamespace OpenMesh {\nnamespace IO {\n\n\n//=== INSTANCIATE =============================================================\n\n\n// register the OMReader singleton with MeshReader\n_OMReader_  __OMReaderInstance;\n_OMReader_&  OMReader() { return __OMReaderInstance; }\n\n\n\n//=== IMPLEMENTATION ==========================================================\n\n\n_OMReader_::_OMReader_()\n{\n  IOManager().register_module(this);\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nbool _OMReader_::read(const std::string& _filename, BaseImporter& _bi, Options& _opt)\n{\n  // check whether importer can give us an OpenMesh BaseKernel\n  if (!_bi.kernel())\n    return false;\n\n  _opt += Options::Binary; // only binary format supported!\n  fileOptions_ = Options::Binary;\n\n  // Open file\n  std::ifstream ifs(_filename.c_str(), std::ios::binary);\n\n  /* Clear formatting flag skipws (Skip whitespaces). If set, operator>> will\n   * skip bytes set to whitespace chars (e.g. 0x20 bytes) in\n   * Property<bool>::restore.\n   */\n  ifs.unsetf(std::ios::skipws);\n\n  if (!ifs.is_open() || !ifs.good()) {\n    omerr() << \"[OMReader] : cannot not open file \" << _filename << std::endl;\n    return false;\n  }\n\n  // Pass stream to read method, remember result\n  bool result = read(ifs, _bi, _opt);\n\n  // close input stream\n  ifs.close();\n\n  _opt = _opt & fileOptions_;\n\n  return result;\n}\n\n//-----------------------------------------------------------------------------\n\n\nbool _OMReader_::read(std::istream& _is, BaseImporter& _bi, Options& _opt)\n{\n  // check whether importer can give us an OpenMesh BaseKernel\n  if (!_bi.kernel())\n    return false;\n\n  _opt += Options::Binary; // only binary format supported!\n  fileOptions_ = Options::Binary;\n\n  if (!_is.good()) {\n    omerr() << \"[OMReader] : cannot read from stream \" << std::endl;\n    return false;\n  }\n\n  // Pass stream to read method, remember result\n  bool result = read_binary(_is, _bi, _opt);\n\n  if (result)\n    _opt += Options::Binary;\n\n  _opt = _opt & fileOptions_;\n\n  return result;\n}\n\n\n\n//-----------------------------------------------------------------------------\n\nbool _OMReader_::read_ascii(std::istream& /* _is */, BaseImporter& /* _bi */, Options& /* _opt */) const\n{\n  // not supported yet!\n  return false;\n}\n\n\n//-----------------------------------------------------------------------------\n\nbool _OMReader_::read_binary(std::istream& _is, BaseImporter& _bi, Options& _opt) const\n{\n  bool swap = _opt.check(Options::Swap) || (Endian::local() == Endian::MSB);\n\n  // Initialize byte counter\n  bytes_ = 0;\n\n  bytes_ += restore(_is, header_, swap);\n\n\n  while (!_is.eof()) {\n    bytes_ += restore(_is, chunk_header_, swap);\n\n    if (_is.eof())\n      break;\n\n    // Is this a named property restore the name\n    if (chunk_header_.name_) {\n      OMFormat::Chunk::PropertyName pn;\n      bytes_ += restore(_is, property_name_, swap);\n    }\n\n    // Read in the property data. If it is an anonymous or unknown named\n    // property, then skip data.\n    switch (chunk_header_.entity_) {\n      case OMFormat::Chunk::Entity_Vertex:\n        if (!read_binary_vertex_chunk(_is, _bi, _opt, swap))\n          return false;\n        break;\n      case OMFormat::Chunk::Entity_Face:\n        if (!read_binary_face_chunk(_is, _bi, _opt, swap))\n          return false;\n        break;\n      case OMFormat::Chunk::Entity_Edge:\n        if (!read_binary_edge_chunk(_is, _bi, _opt, swap))\n          return false;\n        break;\n      case OMFormat::Chunk::Entity_Halfedge:\n        if (!read_binary_halfedge_chunk(_is, _bi, _opt, swap))\n          return false;\n        break;\n      case OMFormat::Chunk::Entity_Mesh:\n        if (!read_binary_mesh_chunk(_is, _bi, _opt, swap))\n          return false;\n        break;\n      default:\n        return false;\n    }\n\n  }\n\n  // File was successfully parsed.\n  return true;\n}\n\n\n//-----------------------------------------------------------------------------\n\nbool _OMReader_::can_u_read(const std::string& _filename) const\n{\n  // !!! Assuming BaseReader::can_u_parse( std::string& )\n  // does not call BaseReader::read_magic()!!!\n  if (this->BaseReader::can_u_read(_filename)) {\n    std::ifstream ifile(_filename.c_str());\n    if (ifile && can_u_read(ifile))\n      return true;\n  }\n  return false;\n}\n\n//-----------------------------------------------------------------------------\n\nbool _OMReader_::can_u_read(std::istream& _is) const\n{\n  std::vector<char> evt;\n  evt.reserve(20);\n\n  // read first 4 characters into a buffer\n  while (evt.size() < 4)\n    evt.push_back(static_cast<char>(_is.get()));\n\n  // put back all read characters\n  std::vector<char>::reverse_iterator it = evt.rbegin();\n  while (it != evt.rend())\n    _is.putback(*it++);\n\n  // evaluate header information\n  OMFormat::Header *hdr = (OMFormat::Header*) &evt[0];\n\n  // first two characters must be 'OM'\n  if (hdr->magic_[0] != 'O' || hdr->magic_[1] != 'M')\n    return false;\n\n  // 3rd characters defines the mesh type:\n  switch (hdr->mesh_) {\n    case 'T': // Triangle Mesh\n    case 'Q': // Quad Mesh\n    case 'P': // Polygonal Mesh\n      break;\n    default:  // ?\n      return false;\n  }\n\n  // 4th characters encodes the version\n  return supports(hdr->version_);\n}\n\n//-----------------------------------------------------------------------------\n\nbool _OMReader_::supports(const OMFormat::uint8 /* version */) const\n{\n  return true;\n}\n\n\n//-----------------------------------------------------------------------------\n\nbool _OMReader_::read_binary_vertex_chunk(std::istream &_is, BaseImporter &_bi, Options &_opt, bool _swap) const\n{\n  using OMFormat::Chunk;\n\n  assert( chunk_header_.entity_ == Chunk::Entity_Vertex);\n\n  OpenMesh::Vec3f v3f;\n  OpenMesh::Vec2f v2f;\n  OpenMesh::Vec3uc v3uc; // rgb\n\n  OMFormat::Chunk::PropertyName custom_prop;\n\n  size_t vidx = 0;\n  switch (chunk_header_.type_) {\n    case Chunk::Type_Pos:\n      assert( OMFormat::dimensions(chunk_header_) == size_t(OpenMesh::Vec3f::dim()));\n\n      for (; vidx < header_.n_vertices_ && !_is.eof(); ++vidx) {\n        bytes_ += vector_restore(_is, v3f, _swap);\n        _bi.add_vertex(v3f);\n      }\n      break;\n\n    case Chunk::Type_Normal:\n      assert( OMFormat::dimensions(chunk_header_) == size_t(OpenMesh::Vec3f::dim()));\n\n      fileOptions_ += Options::VertexNormal;\n      for (; vidx < header_.n_vertices_ && !_is.eof(); ++vidx) {\n        bytes_ += vector_restore(_is, v3f, _swap);\n        if (fileOptions_.vertex_has_normal() && _opt.vertex_has_normal())\n          _bi.set_normal(VertexHandle(int(vidx)), v3f);\n      }\n      break;\n\n    case Chunk::Type_Texcoord:\n      assert( OMFormat::dimensions(chunk_header_) == size_t(OpenMesh::Vec2f::dim()));\n\n      fileOptions_ += Options::VertexTexCoord;\n      for (; vidx < header_.n_vertices_ && !_is.eof(); ++vidx) {\n        bytes_ += vector_restore(_is, v2f, _swap);\n        if (fileOptions_.vertex_has_texcoord() && _opt.vertex_has_texcoord())\n          _bi.set_texcoord(VertexHandle(int(vidx)), v2f);\n      }\n      break;\n\n    case Chunk::Type_Color:\n\n      assert( OMFormat::dimensions(chunk_header_) == 3);\n\n      fileOptions_ += Options::VertexColor;\n\n      for (; vidx < header_.n_vertices_ && !_is.eof(); ++vidx) {\n        bytes_ += vector_restore(_is, v3uc, _swap);\n        if (fileOptions_.vertex_has_color() && _opt.vertex_has_color())\n          _bi.set_color(VertexHandle(int(vidx)), v3uc);\n      }\n      break;\n\n    case Chunk::Type_Custom:\n\n      bytes_ += restore_binary_custom_data(_is, _bi.kernel()->_get_vprop(property_name_), header_.n_vertices_, _swap);\n\n      vidx = header_.n_vertices_;\n\n      break;\n\n    default: // skip unknown chunks\n    {\n      omerr() << \"Unknown chunk type ignored!\\n\";\n      size_t size_of = header_.n_vertices_ * OMFormat::vector_size(chunk_header_);\n      _is.ignore(size_of);\n      bytes_ += size_of;\n    }\n  }\n\n  // all chunk data has been read..?!\n  return vidx == header_.n_vertices_;\n}\n\n\n//-----------------------------------------------------------------------------\n\nbool _OMReader_::read_binary_face_chunk(std::istream &_is, BaseImporter &_bi, Options &_opt, bool _swap) const\n{\n  using OMFormat::Chunk;\n\n  assert( chunk_header_.entity_ == Chunk::Entity_Face);\n\n  size_t fidx = 0;\n  OpenMesh::Vec3f v3f;  // normal\n  OpenMesh::Vec3uc v3uc; // rgb\n\n  switch (chunk_header_.type_) {\n    case Chunk::Type_Topology: {\n      BaseImporter::VHandles vhandles;\n      size_t nV = 0;\n      size_t vidx = 0;\n\n      switch (header_.mesh_) {\n        case 'T':\n          nV = 3;\n          break;\n        case 'Q':\n          nV = 4;\n          break;\n      }\n\n      for (; fidx < header_.n_faces_; ++fidx) {\n        if (header_.mesh_ == 'P')\n          bytes_ += restore(_is, nV, Chunk::Integer_16, _swap);\n\n        vhandles.clear();\n        for (size_t j = 0; j < nV; ++j) {\n          bytes_ += restore(_is, vidx, Chunk::Integer_Size(chunk_header_.bits_), _swap);\n\n          vhandles.push_back(VertexHandle(int(vidx)));\n        }\n\n        _bi.add_face(vhandles);\n      }\n    }\n      break;\n\n    case Chunk::Type_Normal:\n      assert( OMFormat::dimensions(chunk_header_) == size_t(OpenMesh::Vec3f::dim()));\n\n      fileOptions_ += Options::FaceNormal;\n      for (; fidx < header_.n_faces_ && !_is.eof(); ++fidx) {\n        bytes_ += vector_restore(_is, v3f, _swap);\n        if( fileOptions_.face_has_normal() && _opt.face_has_normal())\n          _bi.set_normal(FaceHandle(int(fidx)), v3f);\n      }\n      break;\n\n    case Chunk::Type_Color:\n\n      assert( OMFormat::dimensions(chunk_header_) == 3);\n\n      fileOptions_ += Options::FaceColor;\n      for (; fidx < header_.n_faces_ && !_is.eof(); ++fidx) {\n        bytes_ += vector_restore(_is, v3uc, _swap);\n        if( fileOptions_.face_has_color() && _opt.face_has_color())\n          _bi.set_color(FaceHandle(int(fidx)), v3uc);\n      }\n      break;\n\n    case Chunk::Type_Custom:\n\n      bytes_ += restore_binary_custom_data(_is, _bi.kernel()->_get_fprop(property_name_), header_.n_faces_, _swap);\n\n      fidx = header_.n_faces_;\n\n      break;\n\n    default: // skip unknown chunks\n    {\n      omerr() << \"Unknown chunk type ignore!\\n\";\n      size_t size_of = OMFormat::chunk_data_size(header_, chunk_header_);\n      _is.ignore(size_of);\n      bytes_ += size_of;\n    }\n  }\n  return fidx == header_.n_faces_;\n}\n\n\n//-----------------------------------------------------------------------------\n\nbool _OMReader_::read_binary_edge_chunk(std::istream &_is, BaseImporter &_bi, Options &/*_opt */, bool _swap) const\n{\n  using OMFormat::Chunk;\n\n  assert( chunk_header_.entity_ == Chunk::Entity_Edge);\n\n  size_t b = bytes_;\n\n  switch (chunk_header_.type_) {\n    case Chunk::Type_Custom:\n\n      bytes_ += restore_binary_custom_data(_is, _bi.kernel()->_get_eprop(property_name_), header_.n_edges_, _swap);\n\n      break;\n\n    default:\n      // skip unknown type\n      size_t size_of = OMFormat::chunk_data_size(header_, chunk_header_);\n      _is.ignore(size_of);\n      bytes_ += size_of;\n  }\n\n  return b < bytes_;\n}\n\n\n//-----------------------------------------------------------------------------\n\nbool _OMReader_::read_binary_halfedge_chunk(std::istream &_is, BaseImporter &_bi, Options &/* _opt */, bool _swap) const\n{\n  using OMFormat::Chunk;\n\n  assert( chunk_header_.entity_ == Chunk::Entity_Halfedge);\n\n  size_t b = bytes_;\n\n  switch (chunk_header_.type_) {\n    case Chunk::Type_Custom:\n\n      bytes_ += restore_binary_custom_data(_is, _bi.kernel()->_get_hprop(property_name_), 2 * header_.n_edges_, _swap);\n      break;\n\n    default:\n      // skip unknown chunk\n      omerr() << \"Unknown chunk type ignored!\\n\";\n      size_t size_of = OMFormat::chunk_data_size(header_, chunk_header_);\n      _is.ignore(size_of);\n      bytes_ += size_of;\n  }\n\n  return b < bytes_;\n}\n\n\n//-----------------------------------------------------------------------------\n\nbool _OMReader_::read_binary_mesh_chunk(std::istream &_is, BaseImporter &_bi, Options & /* _opt */, bool _swap) const\n{\n  using OMFormat::Chunk;\n\n  assert( chunk_header_.entity_ == Chunk::Entity_Mesh);\n\n  size_t b = bytes_;\n\n  switch (chunk_header_.type_) {\n    case Chunk::Type_Custom:\n\n      bytes_ += restore_binary_custom_data(_is, _bi.kernel()->_get_mprop(property_name_), 1, _swap);\n\n      break;\n\n    default:\n      // skip unknown chunk\n      size_t size_of = OMFormat::chunk_data_size(header_, chunk_header_);\n      _is.ignore(size_of);\n      bytes_ += size_of;\n  }\n\n  return b < bytes_;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nsize_t _OMReader_::restore_binary_custom_data(std::istream& _is, BaseProperty* _bp, size_t _n_elem, bool _swap) const\n{\n  assert( !_bp || (_bp->name() == property_name_));\n\n  using OMFormat::Chunk;\n\n  size_t bytes = 0;\n  Chunk::esize_t block_size;\n  Chunk::PropertyName custom_prop;\n\n  bytes += restore(_is, block_size, OMFormat::Chunk::Integer_32, _swap);\n\n  if (_bp) {\n    size_t n_bytes = _bp->size_of(_n_elem);\n\n    if (((n_bytes == BaseProperty::UnknownSize) || (n_bytes == block_size))\n        && (_bp->element_size() == BaseProperty::UnknownSize || (_n_elem * _bp->element_size() == block_size))) {\n#if defined(OM_DEBUG)\n      size_t b;\n      bytes += (b=_bp->restore( _is, _swap ));\n#else\n      bytes += _bp->restore(_is, _swap);\n#endif\n\n#if defined(OM_DEBUG)\n      assert( block_size == b );\n#endif\n\n      assert( block_size == _bp->size_of());\n\n      block_size = 0;\n    } else {\n      omerr() << \"Warning! Property \" << _bp->name() << \" not loaded: \" << \"Mismatching data sizes!n\";\n    }\n  }\n\n  if (block_size) {\n    _is.ignore(block_size);\n    bytes += block_size;\n  }\n\n  return bytes;\n}\n\n\n//-----------------------------------------------------------------------------\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/reader/OMReader.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------*\n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         *\n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/\n\n/*===========================================================================*\\\n *                                                                           *\n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  Implements a reader module for OFF files\n//\n//=============================================================================\n\n\n#ifndef __OMREADER_HH__\n#define __OMREADER_HH__\n\n\n//=== INCLUDES ================================================================\n\n// OpenMesh\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/Utils/SingletonT.hh>\n#include <OpenMesh/Core/IO/OMFormat.hh>\n#include <OpenMesh/Core/IO/IOManager.hh>\n#include <OpenMesh/Core/IO/importer/BaseImporter.hh>\n#include <OpenMesh/Core/IO/reader/BaseReader.hh>\n\n// STD C++\n#include <iostream>\n#include <string>\n\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\nnamespace IO {\n\n\n//== IMPLEMENTATION ===========================================================\n\n\n/**\n    Implementation of the OM format reader. This class is singleton'ed by\n    SingletonT to OMReader.\n*/\nclass OPENMESHDLLEXPORT _OMReader_ : public BaseReader\n{\npublic:\n\n  _OMReader_();\n  virtual ~_OMReader_() { }\n\n  std::string get_description() const { return \"OpenMesh File Format\"; }\n  std::string get_extensions()  const { return \"om\"; }\n  std::string get_magic()       const { return \"OM\"; }\n\n  bool read(const std::string& _filename,\n\t    BaseImporter& _bi,\n\t    Options& _opt );\n\n//!  Stream Reader for std::istream input in binary format\n  bool read(std::istream& _is,\n\t    BaseImporter& _bi,\n\t    Options& _opt );\n\n  virtual bool can_u_read(const std::string& _filename) const;\n  virtual bool can_u_read(std::istream& _is) const;\n\n\nprivate:\n\n  bool supports( const OMFormat::uint8 version ) const;\n\n  bool read_ascii(std::istream& _is, BaseImporter& _bi, Options& _opt) const;\n  bool read_binary(std::istream& _is, BaseImporter& _bi, Options& _opt) const;\n\n  typedef OMFormat::Header              Header;\n  typedef OMFormat::Chunk::Header       ChunkHeader;\n  typedef OMFormat::Chunk::PropertyName PropertyName;\n\n  // initialized/updated by read_binary*/read_ascii*\n  mutable size_t       bytes_;\n  mutable Options      fileOptions_;\n  mutable Header       header_;\n  mutable ChunkHeader  chunk_header_;\n  mutable PropertyName property_name_;\n\n  bool read_binary_vertex_chunk(   std::istream      &_is,\n\t\t\t\t   BaseImporter      &_bi,\n\t\t\t\t   Options           &_opt,\n\t\t\t\t   bool              _swap) const;\n\n  bool read_binary_face_chunk(     std::istream      &_is,\n\t\t\t           BaseImporter      &_bi,\n\t\t\t           Options           &_opt,\n\t\t\t\t   bool              _swap) const;\n\n  bool read_binary_edge_chunk(     std::istream      &_is,\n\t\t\t           BaseImporter      &_bi,\n\t\t\t           Options           &_opt,\n\t\t\t\t   bool              _swap) const;\n\n  bool read_binary_halfedge_chunk( std::istream      &_is,\n\t\t\t\t   BaseImporter      &_bi,\n\t\t\t\t   Options           &_opt,\n\t\t\t\t   bool              _swap) const;\n\n  bool read_binary_mesh_chunk(     std::istream      &_is,\n\t\t\t\t   BaseImporter      &_bi,\n\t\t\t\t   Options           &_opt,\n\t\t\t\t   bool              _swap) const;\n\n  size_t restore_binary_custom_data( std::istream& _is,\n\t\t\t\t     BaseProperty* _bp,\n\t\t\t\t     size_t _n_elem,\n\t\t\t\t     bool _swap) const;\n\n};\n\n\n//== TYPE DEFINITION ==========================================================\n\n\n/// Declare the single entity of the OM reader.\nextern _OMReader_  __OMReaderInstance;\nOPENMESHDLLEXPORT _OMReader_&  OMReader();\n\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n#endif\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/reader/PLYReader.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------*\n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         *\n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n \\*===========================================================================*/\n\n/*===========================================================================*\\\n *                                                                           *\n *   $Revision: 1053 $                                                         *\n *   $Date: 2014-05-09 14:44:18 +0200 (金, 09 5 2014) $                   *\n *                                                                           *\n \\*===========================================================================*/\n\n#define LINE_LEN 4096\n\n//== INCLUDES =================================================================\n\n// OpenMesh\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/System/omstream.hh>\n#include <OpenMesh/Core/IO/reader/PLYReader.hh>\n#include <OpenMesh/Core/IO/importer/BaseImporter.hh>\n#include <OpenMesh/Core/IO/IOManager.hh>\n#include <OpenMesh/Core/Utils/color_cast.hh>\n#include <OpenMesh/Core/IO/SR_store.hh>\n\n//STL\n#include <fstream>\n#include <memory>\n\n#ifndef WIN32\n#include <string.h>\n#endif\n\n//=== NAMESPACES ==============================================================\n\n\nnamespace OpenMesh {\nnamespace IO {\n\n//=============================================================================\n\n//=== INSTANCIATE =============================================================\n\n\n_PLYReader_ __PLYReaderInstance;\n_PLYReader_& PLYReader() {\n    return __PLYReaderInstance;\n}\n\n//=== IMPLEMENTATION ==========================================================\n\n\n_PLYReader_::_PLYReader_() {\n    IOManager().register_module(this);\n\n    // Store sizes in byte of each property type\n    scalar_size_[ValueTypeINT8] = 1;\n    scalar_size_[ValueTypeUINT8] = 1;\n    scalar_size_[ValueTypeINT16] = 2;\n    scalar_size_[ValueTypeUINT16] = 2;\n    scalar_size_[ValueTypeINT32] = 4;\n    scalar_size_[ValueTypeUINT32] = 4;\n    scalar_size_[ValueTypeFLOAT32] = 4;\n    scalar_size_[ValueTypeFLOAT64] = 8;\n\n    scalar_size_[ValueTypeCHAR] = 1;\n    scalar_size_[ValueTypeUCHAR] = 1;\n    scalar_size_[ValueTypeSHORT] = 2;\n    scalar_size_[ValueTypeUSHORT] = 2;\n    scalar_size_[ValueTypeINT] = 4;\n    scalar_size_[ValueTypeUINT] = 4;\n    scalar_size_[ValueTypeFLOAT] = 4;\n    scalar_size_[ValueTypeDOUBLE] = 8;\n}\n\n//-----------------------------------------------------------------------------\n\n\nbool _PLYReader_::read(const std::string& _filename, BaseImporter& _bi, Options& _opt) {\n\n    std::fstream in(_filename.c_str(), (std::ios_base::binary | std::ios_base::in) );\n\n    if (!in.is_open() || !in.good()) {\n        omerr() << \"[PLYReader] : cannot not open file \" << _filename << std::endl;\n        return false;\n    }\n\n    bool result = read(in, _bi, _opt);\n\n    in.close();\n    return result;\n}\n\n//-----------------------------------------------------------------------------\n\n\nbool _PLYReader_::read(std::istream& _in, BaseImporter& _bi, Options& _opt) {\n\n    if (!_in.good()) {\n        omerr() << \"[PLYReader] : cannot not use stream\" << std::endl;\n        return false;\n    }\n\n    // filter relevant options for reading\n    bool swap = _opt.check(Options::Swap);\n\n    userOptions_ = _opt;\n\n    // build options to be returned\n    _opt.clear();\n\n    if (options_.vertex_has_normal() && userOptions_.vertex_has_normal()) {\n        _opt += Options::VertexNormal;\n    }\n    if (options_.vertex_has_texcoord() && userOptions_.vertex_has_texcoord()) {\n        _opt += Options::VertexTexCoord;\n    }\n    if (options_.vertex_has_color() && userOptions_.vertex_has_color()) {\n        _opt += Options::VertexColor;\n    }\n    if (options_.face_has_color() && userOptions_.face_has_color()) {\n        _opt += Options::FaceColor;\n    }\n    if (options_.is_binary()) {\n        _opt += Options::Binary;\n    }\n    if (options_.color_is_float()) {\n        _opt += Options::ColorFloat;\n    }\n\n    //    //force user-choice for the alpha value when reading binary\n    //    if ( options_.is_binary() && userOptions_.color_has_alpha() )\n    //      options_ += Options::ColorAlpha;\n\n    return (options_.is_binary() ? read_binary(_in, _bi, swap, _opt) : read_ascii(_in, _bi, _opt));\n\n}\n\n\n\n//-----------------------------------------------------------------------------\n\nbool _PLYReader_::read_ascii(std::istream& _in, BaseImporter& _bi, const Options& _opt) const {\n\n    // Reparse the header\n    if (!can_u_read(_in)) {\n        omerr() << \"[PLYReader] : Unable to parse header\\n\";\n        return false;\n    }\n\n    unsigned int i, j, k, l, idx;\n    unsigned int nV;\n    OpenMesh::Vec3f v, n;\n    std::string trash;\n    OpenMesh::Vec2f t;\n    OpenMesh::Vec4i c;\n    float tmp;\n    BaseImporter::VHandles vhandles;\n    VertexHandle vh;\n\n    _bi.reserve(vertexCount_, 3* vertexCount_ , faceCount_);\n\n    if (vertexDimension_ != 3) {\n        omerr() << \"[PLYReader] : Only vertex dimension 3 is supported.\" << std::endl;\n        return false;\n    }\n\n    // read vertices:\n    for (i = 0; i < vertexCount_ && !_in.eof(); ++i) {\n        v[0] = 0.0;\n        v[1] = 0.0;\n        v[2] = 0.0;\n\n        n[0] = 0.0;\n        n[1] = 0.0;\n        n[2] = 0.0;\n\n        t[0] = 0.0;\n        t[1] = 0.0;\n\n        c[0] = 0;\n        c[1] = 0;\n        c[2] = 0;\n        c[3] = 255;\n\n        for (uint propertyIndex = 0; propertyIndex < vertexPropertyCount_; ++propertyIndex) {\n            switch (vertexPropertyMap_[propertyIndex].first) {\n            case XCOORD:\n                _in >> v[0];\n                break;\n            case YCOORD:\n                _in >> v[1];\n                break;\n            case ZCOORD:\n                _in >> v[2];\n                break;\n            case XNORM:\n                _in >> n[0];\n                break;\n            case YNORM:\n                _in >> n[1];\n                break;\n            case ZNORM:\n                _in >> n[2];\n                break;\n            case TEXX:\n                _in >> t[0];\n                break;\n            case TEXY:\n                _in >> t[1];\n                break;\n            case COLORRED:\n                if (vertexPropertyMap_[propertyIndex].second == ValueTypeFLOAT32 ||\n                    vertexPropertyMap_[propertyIndex].second == ValueTypeFLOAT) {\n                    _in >> tmp;\n                    c[0] = static_cast<OpenMesh::Vec4i::value_type> (tmp * 255.0f);\n                } else\n                    _in >> c[0];\n                break;\n            case COLORGREEN:\n                if (vertexPropertyMap_[propertyIndex].second == ValueTypeFLOAT32 ||\n                    vertexPropertyMap_[propertyIndex].second == ValueTypeFLOAT) {\n                    _in >> tmp;\n                    c[1] = static_cast<OpenMesh::Vec4i::value_type> (tmp * 255.0f);\n                } else\n                    _in >> c[1];\n                break;\n            case COLORBLUE:\n                if (vertexPropertyMap_[propertyIndex].second == ValueTypeFLOAT32 ||\n                    vertexPropertyMap_[propertyIndex].second == ValueTypeFLOAT) {\n                    _in >> tmp;\n                    c[2] = static_cast<OpenMesh::Vec4i::value_type> (tmp * 255.0f);\n                } else\n                    _in >> c[2];\n                break;\n            case COLORALPHA:\n                if (vertexPropertyMap_[propertyIndex].second == ValueTypeFLOAT32 ||\n                    vertexPropertyMap_[propertyIndex].second == ValueTypeFLOAT) {\n                    _in >> tmp;\n                    c[3] = static_cast<OpenMesh::Vec4i::value_type> (tmp * 255.0f);\n                } else\n                    _in >> c[3];\n                break;\n            default:\n                _in >> trash;\n                break;\n            }\n        }\n\n        vh = _bi.add_vertex(v);\n        if (_opt.vertex_has_normal())\n          _bi.set_normal(vh, n);\n        if (_opt.vertex_has_texcoord())\n          _bi.set_texcoord(vh, t);\n        if (_opt.vertex_has_color())\n          _bi.set_color(vh, Vec4uc(c));\n    }\n\n    // faces\n    // #N <v1> <v2> .. <v(n-1)> [color spec]\n    for (i = 0; i < faceCount_; ++i) {\n        // nV = number of Vertices for current face\n        _in >> nV;\n\n        if (nV == 3) {\n            vhandles.resize(3);\n            _in >> j;\n            _in >> k;\n            _in >> l;\n\n            vhandles[0] = VertexHandle(j);\n            vhandles[1] = VertexHandle(k);\n            vhandles[2] = VertexHandle(l);\n        } else {\n            vhandles.clear();\n            for (j = 0; j < nV; ++j) {\n                _in >> idx;\n                vhandles.push_back(VertexHandle(idx));\n            }\n        }\n\n        FaceHandle fh = _bi.add_face(vhandles);\n\n    }\n\n    // File was successfully parsed.\n    return true;\n}\n\n//-----------------------------------------------------------------------------\n\nbool _PLYReader_::read_binary(std::istream& _in, BaseImporter& _bi, bool /*_swap*/, const Options& _opt) const {\n\n    // Reparse the header\n    if (!can_u_read(_in)) {\n        omerr() << \"[PLYReader] : Unable to parse header\\n\";\n        return false;\n    }\n\n    unsigned int i, j, k, l, idx;\n    unsigned int nV;\n    OpenMesh::Vec3f        v, n;  // Vertex\n    OpenMesh::Vec2f        t;  // TexCoords\n    BaseImporter::VHandles vhandles;\n    VertexHandle           vh;\n    OpenMesh::Vec4i        c;  // Color\n    float                  tmp;\n\n    _bi.reserve(vertexCount_, 3* vertexCount_ , faceCount_);\n\n    // read vertices:\n    for (i = 0; i < vertexCount_ && !_in.eof(); ++i) {\n        v[0] = 0.0;\n        v[1] = 0.0;\n        v[2] = 0.0;\n\n        n[0] = 0.0;\n        n[1] = 0.0;\n        n[2] = 0.0;\n\n        t[0] = 0.0;\n        t[1] = 0.0;\n\n        c[0] = 0;\n        c[1] = 0;\n        c[2] = 0;\n        c[3] = 255;\n\n        for (uint propertyIndex = 0; propertyIndex < vertexPropertyCount_; ++propertyIndex) {\n            switch (vertexPropertyMap_[propertyIndex].first) {\n            case XCOORD:\n                readValue(vertexPropertyMap_[propertyIndex].second, _in, v[0]);\n                break;\n            case YCOORD:\n                readValue(vertexPropertyMap_[propertyIndex].second, _in, v[1]);\n                break;\n            case ZCOORD:\n                readValue(vertexPropertyMap_[propertyIndex].second, _in, v[2]);\n                break;\n            case XNORM:\n                readValue(vertexPropertyMap_[propertyIndex].second, _in, n[0]);\n                break;\n            case YNORM:\n                readValue(vertexPropertyMap_[propertyIndex].second, _in, n[1]);\n                break;\n            case ZNORM:\n                readValue(vertexPropertyMap_[propertyIndex].second, _in, n[2]);\n                break;\n            case TEXX:\n                readValue(vertexPropertyMap_[propertyIndex].second, _in, t[0]);\n                break;\n            case TEXY:\n                readValue(vertexPropertyMap_[propertyIndex].second, _in, t[1]);\n                break;\n            case COLORRED:\n                if (vertexPropertyMap_[propertyIndex].second == ValueTypeFLOAT32 ||\n                    vertexPropertyMap_[propertyIndex].second == ValueTypeFLOAT) {\n                    readValue(vertexPropertyMap_[propertyIndex].second, _in, tmp);\n\n                    c[0] = static_cast<OpenMesh::Vec4i::value_type> (tmp * 255.0f);\n                } else\n                    readInteger(vertexPropertyMap_[propertyIndex].second, _in, c[0]);\n\n                break;\n            case COLORGREEN:\n                if (vertexPropertyMap_[propertyIndex].second == ValueTypeFLOAT32 ||\n                    vertexPropertyMap_[propertyIndex].second == ValueTypeFLOAT) {\n                    readValue(vertexPropertyMap_[propertyIndex].second, _in, tmp);\n                    c[1] = static_cast<OpenMesh::Vec4i::value_type> (tmp * 255.0f);\n                } else\n                    readInteger(vertexPropertyMap_[propertyIndex].second, _in, c[1]);\n\n                break;\n            case COLORBLUE:\n                if (vertexPropertyMap_[propertyIndex].second == ValueTypeFLOAT32 ||\n                    vertexPropertyMap_[propertyIndex].second == ValueTypeFLOAT) {\n                    readValue(vertexPropertyMap_[propertyIndex].second, _in, tmp);\n                    c[2] = static_cast<OpenMesh::Vec4i::value_type> (tmp * 255.0f);\n                } else\n                    readInteger(vertexPropertyMap_[propertyIndex].second, _in, c[2]);\n\n                break;\n            case COLORALPHA:\n                if (vertexPropertyMap_[propertyIndex].second == ValueTypeFLOAT32 ||\n                    vertexPropertyMap_[propertyIndex].second == ValueTypeFLOAT) {\n                    readValue(vertexPropertyMap_[propertyIndex].second, _in, tmp);\n                    c[3] = static_cast<OpenMesh::Vec4i::value_type> (tmp * 255.0f);\n                } else\n                    readInteger(vertexPropertyMap_[propertyIndex].second, _in, c[3]);\n\n                break;\n            default:\n                // Read unsupported property\n                consume_input(_in, scalar_size_[vertexPropertyMap_[propertyIndex].second]);\n                break;\n            }\n\n        }\n\n        vh = _bi.add_vertex(v);\n        if (_opt.vertex_has_normal())\n          _bi.set_normal(vh, n);\n        if (_opt.vertex_has_texcoord())\n          _bi.set_texcoord(vh, t);\n        if (_opt.vertex_has_color())\n          _bi.set_color(vh, Vec4uc(c));\n    }\n\n    for (i = 0; i < faceCount_; ++i) {\n        // Read number of vertices for the current face\n        readValue(faceIndexType_, _in, nV);\n\n        if (nV == 3) {\n            vhandles.resize(3);\n            readInteger(faceEntryType_, _in, j);\n            readInteger(faceEntryType_, _in, k);\n            readInteger(faceEntryType_, _in, l);\n\n            vhandles[0] = VertexHandle(j);\n            vhandles[1] = VertexHandle(k);\n            vhandles[2] = VertexHandle(l);\n        } else {\n            vhandles.clear();\n            for (j = 0; j < nV; ++j) {\n                readInteger(faceEntryType_, _in, idx);\n                vhandles.push_back(VertexHandle(idx));\n            }\n        }\n\n        FaceHandle fh = _bi.add_face(vhandles);\n    }\n\n    return true;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid _PLYReader_::readValue(ValueType _type, std::istream& _in, float& _value) const {\n\n    switch (_type) {\n    case ValueTypeFLOAT32:\n    case ValueTypeFLOAT:\n        float32_t tmp;\n        restore(_in, tmp, options_.check(Options::MSB));\n        _value = tmp;\n        break;\n    default:\n        _value = 0.0;\n        std::cerr << \"unsupported conversion type to float: \" << _type << std::endl;\n        break;\n    }\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid _PLYReader_::readValue(ValueType _type, std::istream& _in, double& _value) const {\n\n    switch (_type) {\n\n        case ValueTypeFLOAT64:\n\n        case ValueTypeDOUBLE:\n\n            float64_t tmp;\n            restore(_in, tmp, options_.check(Options::MSB));\n            _value = tmp;\n\n            break;\n\n    default:\n\n        _value = 0.0;\n        std::cerr << \"unsupported conversion type to double: \" << _type << std::endl;\n\n        break;\n    }\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid _PLYReader_::readValue(ValueType _type, std::istream& _in, unsigned int& _value) const {\n\n    uint32_t tmp_uint32_t;\n    uint16_t tmp_uint16_t;\n    uint8_t tmp_uchar;\n\n    switch (_type) {\n\n        case ValueTypeUINT:\n\n        case ValueTypeUINT32:\n\n            restore(_in, tmp_uint32_t, options_.check(Options::MSB));\n            _value = tmp_uint32_t;\n\n        break;\n\n        case ValueTypeUSHORT:\n\n        case ValueTypeUINT16:\n\n            restore(_in, tmp_uint16_t, options_.check(Options::MSB));\n            _value = tmp_uint16_t;\n\n            break;\n\n        case ValueTypeUCHAR:\n\n        case ValueTypeUINT8:\n\n            restore(_in, tmp_uchar, options_.check(Options::MSB));\n            _value = tmp_uchar;\n\n            break;\n\n        default:\n\n            _value = 0;\n            std::cerr << \"unsupported conversion type to unsigned int: \" << _type << std::endl;\n\n            break;\n    }\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid _PLYReader_::readValue(ValueType _type, std::istream& _in, int& _value) const {\n\n    int32_t tmp_int32_t;\n    int16_t tmp_int16_t;\n    int8_t tmp_char;\n\n    switch (_type) {\n\n        case ValueTypeINT:\n\n        case ValueTypeINT32:\n\n            restore(_in, tmp_int32_t, options_.check(Options::MSB));\n            _value = tmp_int32_t;\n\n            break;\n\n        case ValueTypeSHORT:\n\n        case ValueTypeINT16:\n\n            restore(_in, tmp_int16_t, options_.check(Options::MSB));\n            _value = tmp_int16_t;\n\n            break;\n\n        case ValueTypeCHAR:\n\n        case ValueTypeINT8:\n\n            restore(_in, tmp_char, options_.check(Options::MSB));\n            _value = tmp_char;\n\n            break;\n\n        default:\n\n            _value = 0;\n            std::cerr << \"unsupported conversion type to int: \" << _type << std::endl;\n\n            break;\n    }\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid _PLYReader_::readInteger(ValueType _type, std::istream& _in, int& _value) const {\n\n    int32_t tmp_int32_t;\n    uint32_t tmp_uint32_t;\n    int8_t tmp_char;\n    uint8_t tmp_uchar;\n\n    switch (_type) {\n\n        case ValueTypeINT:\n\n        case ValueTypeINT32:\n\n            restore(_in, tmp_int32_t, options_.check(Options::MSB));\n            _value = tmp_int32_t;\n\n            break;\n\n        case ValueTypeUINT:\n\n        case ValueTypeUINT32:\n\n            restore(_in, tmp_uint32_t, options_.check(Options::MSB));\n            _value = tmp_uint32_t;\n\n            break;\n\n        case ValueTypeCHAR:\n\n        case ValueTypeINT8:\n\n            restore(_in, tmp_char, options_.check(Options::MSB));\n            _value = tmp_char;\n\n            break;\n\n        case ValueTypeUCHAR:\n\n        case ValueTypeUINT8:\n\n            restore(_in, tmp_uchar, options_.check(Options::MSB));\n            _value = tmp_uchar;\n\n            break;\n\n        default:\n\n            _value = 0;\n            std::cerr << \"unsupported conversion type to int: \" << _type << std::endl;\n\n            break;\n    }\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid _PLYReader_::readInteger(ValueType _type, std::istream& _in, unsigned int& _value) const {\n\n    int32_t tmp_int32_t;\n    uint32_t tmp_uint32_t;\n    int8_t tmp_char;\n    uint8_t tmp_uchar;\n\n    switch (_type) {\n\n        case ValueTypeUINT:\n\n        case ValueTypeUINT32:\n\n            restore(_in, tmp_uint32_t, options_.check(Options::MSB));\n            _value = tmp_uint32_t;\n\n            break;\n\n        case ValueTypeINT:\n\n        case ValueTypeINT32:\n\n            restore(_in, tmp_int32_t, options_.check(Options::MSB));\n            _value = tmp_int32_t;\n\n            break;\n\n        case ValueTypeUCHAR:\n\n        case ValueTypeUINT8:\n\n            restore(_in, tmp_uchar, options_.check(Options::MSB));\n            _value = tmp_uchar;\n\n            break;\n\n        case ValueTypeCHAR:\n\n        case ValueTypeINT8:\n\n            restore(_in, tmp_char, options_.check(Options::MSB));\n            _value = tmp_char;\n\n            break;\n\n        default:\n\n            _value = 0;\n            std::cerr << \"unsupported conversion type to unsigned int: \" << _type << std::endl;\n\n            break;\n    }\n}\n\n\n//------------------------------------------------------------------------------\n\n\nbool _PLYReader_::can_u_read(const std::string& _filename) const {\n\n    // !!! Assuming BaseReader::can_u_parse( std::string& )\n    // does not call BaseReader::read_magic()!!!\n\n    if (BaseReader::can_u_read(_filename)) {\n        std::ifstream ifs(_filename.c_str());\n        if (ifs.is_open() && can_u_read(ifs)) {\n            ifs.close();\n            return true;\n        }\n    }\n    return false;\n}\n\n\n\n//-----------------------------------------------------------------------------\n\nstd::string get_property_name(std::string _string1, std::string _string2) {\n\n    if (_string1 == \"float32\" || _string1 == \"float64\" || _string1 == \"float\" || _string1 == \"double\" ||\n        _string1 == \"int8\" || _string1 == \"uint8\" || _string1 == \"char\" || _string1 == \"uchar\" ||\n        _string1 == \"int32\" || _string1 == \"uint32\" || _string1 == \"int\" || _string1 == \"uint\" ||\n        _string1 == \"int16\" || _string1 == \"uint16\" || _string1 == \"short\" || _string1 == \"ushort\")\n        return _string2;\n\n    if (_string2 == \"float32\" || _string2 == \"float64\" || _string2 == \"float\" || _string2 == \"double\" ||\n        _string2 == \"int8\" || _string2 == \"uint8\" || _string2 == \"char\" || _string2 == \"uchar\" ||\n        _string2 == \"int32\" || _string2 == \"uint32\" || _string2 == \"int\" || _string2 == \"uint\" ||\n        _string2 == \"int16\" || _string2 == \"uint16\" || _string2 == \"short\" || _string2 == \"ushort\")\n        return _string1;\n\n\n    std::cerr << \"Unsupported entry type\" << std::endl;\n    return \"Unsupported\";\n}\n\n//-----------------------------------------------------------------------------\n\n_PLYReader_::ValueType get_property_type(std::string _string1, std::string _string2) {\n\n    if (_string1 == \"float32\" || _string2 == \"float32\")\n\n        return _PLYReader_::ValueTypeFLOAT32;\n\n    else if (_string1 == \"float64\" || _string2 == \"float64\")\n\n        return _PLYReader_::ValueTypeFLOAT64;\n\n    else if (_string1 == \"float\" || _string2 == \"float\")\n\n        return _PLYReader_::ValueTypeFLOAT;\n\n    else if (_string1 == \"double\" || _string2 == \"double\")\n\n        return _PLYReader_::ValueTypeDOUBLE;\n\n    else if (_string1 == \"int8\" || _string2 == \"int8\")\n\n        return _PLYReader_::ValueTypeINT8;\n\n    else if (_string1 == \"uint8\" || _string2 == \"uint8\")\n\n        return _PLYReader_::ValueTypeUINT8;\n\n    else if (_string1 == \"char\" || _string2 == \"char\")\n\n        return _PLYReader_::ValueTypeCHAR;\n\n    else if (_string1 == \"uchar\" || _string2 == \"uchar\")\n\n        return _PLYReader_::ValueTypeUCHAR;\n\n    else if (_string1 == \"int32\" || _string2 == \"int32\")\n\n        return _PLYReader_::ValueTypeINT32;\n\n    else if (_string1 == \"uint32\" || _string2 == \"uint32\")\n\n        return _PLYReader_::ValueTypeUINT32;\n\n    else if (_string1 == \"int\" || _string2 == \"int\")\n\n        return _PLYReader_::ValueTypeINT;\n\n    else if (_string1 == \"uint\" || _string2 == \"uint\")\n\n        return _PLYReader_::ValueTypeUINT;\n\n    else if (_string1 == \"int16\" || _string2 == \"int16\")\n\n        return _PLYReader_::ValueTypeINT16;\n\n    else if (_string1 == \"uint16\" || _string2 == \"uint16\")\n\n        return _PLYReader_::ValueTypeUINT16;\n\n    else if (_string1 == \"short\" || _string2 == \"short\")\n\n        return _PLYReader_::ValueTypeSHORT;\n\n    else if (_string1 == \"ushort\" || _string2 == \"ushort\")\n\n        return _PLYReader_::ValueTypeUSHORT;\n\n    return _PLYReader_::Unsupported;\n}\n\n\n//-----------------------------------------------------------------------------\n\nbool _PLYReader_::can_u_read(std::istream& _is) const {\n\n    // Clear per file options\n    options_.cleanup();\n\n    // clear vertex property map, will be recreated\n    vertexPropertyMap_.clear();\n    vertexPropertyCount_ = 0;\n\n    // read 1st line\n    std::string line;\n    std::getline(_is, line);\n    trim(line);\n\n    //Check if this file is really a ply format\n    if (line != \"PLY\" && line != \"ply\")\n        return false;\n\n    vertexCount_ = 0;\n    faceCount_ = 0;\n    vertexDimension_ = 0;\n\n    std::string keyword;\n    std::string fileType;\n    std::string elementName = \"\";\n    std::string propertyName;\n    std::string listIndexType;\n    std::string listEntryType;\n    float version;\n\n    _is >> keyword;\n    _is >> fileType;\n    _is >> version;\n\n    if (_is.bad()) {\n        omerr() << \"Defect PLY header detected\" << std::endl;\n        return false;\n    }\n\n    if (fileType == \"ascii\") {\n        options_ -= Options::Binary;\n    } else if (fileType == \"binary_little_endian\") {\n        options_ += Options::Binary;\n        options_ += Options::LSB;\n        //if (Endian::local() == Endian::MSB)\n\n        //  options_ += Options::Swap;\n    } else if (fileType == \"binary_big_endian\") {\n        options_ += Options::Binary;\n        options_ += Options::MSB;\n        //if (Endian::local() == Endian::LSB)\n\n        //  options_ += Options::Swap;\n    } else {\n        omerr() << \"Unsupported PLY format: \" << fileType << std::endl;\n        return false;\n    }\n\n    std::streamoff streamPos = _is.tellg();\n    _is >> keyword;\n    while (keyword != \"end_header\") {\n\n        if (keyword == \"comment\") {\n            std::getline(_is, line);\n        } else if (keyword == \"element\") {\n            _is >> elementName;\n            if (elementName == \"vertex\") {\n                _is >> vertexCount_;\n            } else if (elementName == \"face\") {\n                _is >> faceCount_;\n            } else {\n                omerr() << \"PLY header unsupported element type: \" << elementName << std::endl;\n            }\n        } else if (keyword == \"property\") {\n            std::string tmp1;\n            std::string tmp2;\n\n            // Read first keyword, as it might be a list\n            _is >> tmp1;\n\n            if (tmp1 == \"list\") {\n                if (elementName == \"vertex\") {\n                    omerr() << \"List type not supported for vertices!\" << std::endl;\n                } else if (elementName == \"face\") {\n                    _is >> listIndexType;\n                    _is >> listEntryType;\n                    _is >> propertyName;\n\n                    if (listIndexType == \"uint8\") {\n                        faceIndexType_ = ValueTypeUINT8;\n                    } else if (listIndexType == \"uchar\") {\n                        faceIndexType_ = ValueTypeUCHAR;\n                    } else {\n                        omerr() << \"Unsupported Index type for face list: \" << listIndexType << std::endl;\n                        return false;\n                    }\n\n                    if (listEntryType == \"int32\") {\n                        faceEntryType_ = ValueTypeINT32;\n                    } else if (listEntryType == \"int\") {\n                        faceEntryType_ = ValueTypeINT;\n                    } else if (listEntryType == \"uint32\") {\n                        faceEntryType_ = ValueTypeUINT32;\n                    } else if (listEntryType == \"uint\") {\n                        faceEntryType_ = ValueTypeUINT;\n                    } else {\n                        omerr() << \"Unsupported Entry type for face list: \" << listEntryType << std::endl;\n                        return false;\n                    }\n\n                }\n            } else {\n                // as this is not a list property, read second value of property\n                _is >> tmp2;\n\n                if (elementName == \"vertex\") {\n                    // Extract name and type of property\n                    // As the order seems to be different in some files, autodetect it.\n                    ValueType valueType = get_property_type(tmp1, tmp2);\n                    propertyName = get_property_name(tmp1, tmp2);\n\n                    if (propertyName == \"x\") {\n                        std::pair<VertexProperty, ValueType> entry(XCOORD, valueType);\n                        vertexPropertyMap_[vertexPropertyCount_] = entry;\n                        vertexDimension_++;\n                    } else if (propertyName == \"y\") {\n                        std::pair<VertexProperty, ValueType> entry(YCOORD, valueType);\n                        vertexPropertyMap_[vertexPropertyCount_] = entry;\n                        vertexDimension_++;\n                    } else if (propertyName == \"z\") {\n                        std::pair<VertexProperty, ValueType> entry(ZCOORD, valueType);\n                        vertexPropertyMap_[vertexPropertyCount_] = entry;\n                        vertexDimension_++;\n                    } else if (propertyName == \"nx\") {\n                        std::pair<VertexProperty, ValueType> entry(XNORM, valueType);\n                        vertexPropertyMap_[vertexPropertyCount_] = entry;\n                        options_ += Options::VertexNormal;\n                    } else if (propertyName == \"ny\") {\n                        std::pair<VertexProperty, ValueType> entry(YNORM, valueType);\n                        vertexPropertyMap_[vertexPropertyCount_] = entry;\n                        options_ += Options::VertexNormal;\n                    } else if (propertyName == \"nz\") {\n                        std::pair<VertexProperty, ValueType> entry(ZNORM, valueType);\n                        vertexPropertyMap_[vertexPropertyCount_] = entry;\n                        options_ += Options::VertexNormal;\n                    } else if (propertyName == \"u\" || propertyName == \"s\") {\n                        std::pair<VertexProperty, ValueType> entry(TEXX, valueType);\n                        vertexPropertyMap_[vertexPropertyCount_] = entry;\n                        options_ += Options::VertexTexCoord;\n                    } else if (propertyName == \"v\" || propertyName == \"t\") {\n                        std::pair<VertexProperty, ValueType> entry(TEXY, valueType);\n                        vertexPropertyMap_[vertexPropertyCount_] = entry;\n                        options_ += Options::VertexTexCoord;\n                    } else if (propertyName == \"red\") {\n                        std::pair<VertexProperty, ValueType> entry(COLORRED, valueType);\n                        vertexPropertyMap_[vertexPropertyCount_] = entry;\n                        options_ += Options::VertexColor;\n                        if (valueType == ValueTypeFLOAT || valueType == ValueTypeFLOAT32)\n                          options_ += Options::ColorFloat;\n                    } else if (propertyName == \"green\") {\n                        std::pair<VertexProperty, ValueType> entry(COLORGREEN, valueType);\n                        vertexPropertyMap_[vertexPropertyCount_] = entry;\n                        options_ += Options::VertexColor;\n                        if (valueType == ValueTypeFLOAT || valueType == ValueTypeFLOAT32)\n                          options_ += Options::ColorFloat;\n                    } else if (propertyName == \"blue\") {\n                        std::pair<VertexProperty, ValueType> entry(COLORBLUE, valueType);\n                        vertexPropertyMap_[vertexPropertyCount_] = entry;\n                        options_ += Options::VertexColor;\n                        if (valueType == ValueTypeFLOAT || valueType == ValueTypeFLOAT32)\n                          options_ += Options::ColorFloat;\n                    } else if (propertyName == \"diffuse_red\") {\n                      std::pair<VertexProperty, ValueType> entry(COLORRED, valueType);\n                      vertexPropertyMap_[vertexPropertyCount_] = entry;\n                      options_ += Options::VertexColor;\n                      if (valueType == ValueTypeFLOAT || valueType == ValueTypeFLOAT32)\n                        options_ += Options::ColorFloat;\n                    } else if (propertyName == \"diffuse_green\") {\n                      std::pair<VertexProperty, ValueType> entry(COLORGREEN, valueType);\n                      vertexPropertyMap_[vertexPropertyCount_] = entry;\n                      options_ += Options::VertexColor;\n                      if (valueType == ValueTypeFLOAT || valueType == ValueTypeFLOAT32)\n                        options_ += Options::ColorFloat;\n                    } else if (propertyName == \"diffuse_blue\") {\n                      std::pair<VertexProperty, ValueType> entry(COLORBLUE, valueType);\n                      vertexPropertyMap_[vertexPropertyCount_] = entry;\n                      options_ += Options::VertexColor;\n                      if (valueType == ValueTypeFLOAT || valueType == ValueTypeFLOAT32)\n                        options_ += Options::ColorFloat;\n                    } else if (propertyName == \"alpha\") {\n                        std::pair<VertexProperty, ValueType> entry(COLORALPHA, valueType);\n                        vertexPropertyMap_[vertexPropertyCount_] = entry;\n                        options_ += Options::VertexColor;\n                        options_ += Options::ColorAlpha;\n                        if (valueType == ValueTypeFLOAT || valueType == ValueTypeFLOAT32)\n                          options_ += Options::ColorFloat;\n                    } else {\n                        std::pair<VertexProperty, ValueType> entry(UNSUPPORTED, valueType);\n                        vertexPropertyMap_[vertexPropertyCount_] = entry;\n                        std::cerr << \"Unsupported property : \" << propertyName << std::endl;\n                    }\n\n                    vertexPropertyCount_++;\n\n                } else if (elementName == \"face\") {\n                    omerr() << \"Properties not supported for faces \" << std::endl;\n                }\n\n            }\n\n        } else {\n            omlog() << \"Unsupported keyword : \" << keyword << std::endl;\n        }\n\n        streamPos = _is.tellg();\n        _is >> keyword;\n        if (_is.bad()) {\n            omerr() << \"Error while reading PLY file header\" << std::endl;\n            return false;\n        }\n    }\n\n    // As the binary data is directy after the end_header keyword\n    // and the stream removes too many bytes, seek back to the right position\n    if (options_.is_binary()) {\n        _is.seekg(streamPos + 12);\n    }\n\n    return true;\n}\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/reader/PLYReader.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------*\n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         *\n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/\n\n/*===========================================================================*\\\n *                                                                           *\n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  Implements a reader module for OFF files\n//\n//=============================================================================\n\n\n#ifndef __PLYREADER_HH__\n#define __PLYREADER_HH__\n\n\n//=== INCLUDES ================================================================\n\n\n#include <iostream>\n#include <string>\n#include <stdio.h>\n#include <fstream>\n\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/Utils/SingletonT.hh>\n#include <OpenMesh/Core/IO/reader/BaseReader.hh>\n\n#ifndef WIN32\n#include <string.h>\n#endif\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\nnamespace IO {\n\n\n//== FORWARDS =================================================================\n\n\nclass BaseImporter;\n\n\n//== IMPLEMENTATION ===========================================================\n\n\n/**\n    Implementation of the PLY format reader. This class is singleton'ed by\n    SingletonT to OFFReader.\n\n*/\n\nclass OPENMESHDLLEXPORT _PLYReader_ : public BaseReader\n{\npublic:\n\n  _PLYReader_();\n\n  std::string get_description() const { return \"PLY polygon file format\"; }\n  std::string get_extensions()  const { return \"ply\"; }\n  std::string get_magic()       const { return \"PLY\"; }\n\n  bool read(const std::string& _filename,\n        BaseImporter& _bi,\n        Options& _opt);\n\n  bool read(std::istream& _is,\n            BaseImporter& _bi,\n            Options& _opt);\n\n  bool can_u_read(const std::string& _filename) const;\n\n  enum ValueType {\n    Unsupported,\n    ValueTypeINT8, ValueTypeCHAR,\n    ValueTypeUINT8, ValueTypeUCHAR,\n    ValueTypeINT16, ValueTypeSHORT,\n    ValueTypeUINT16, ValueTypeUSHORT,\n    ValueTypeINT32, ValueTypeINT,\n    ValueTypeUINT32, ValueTypeUINT,\n    ValueTypeFLOAT32, ValueTypeFLOAT,\n    ValueTypeFLOAT64, ValueTypeDOUBLE\n  };\n\nprivate:\n\n  bool can_u_read(std::istream& _is) const;\n\n  bool read_ascii(std::istream& _in, BaseImporter& _bi, const Options& _opt) const;\n  bool read_binary(std::istream& _in, BaseImporter& _bi, bool swap, const Options& _opt) const;\n\n  float readToFloatValue(ValueType _type , std::fstream& _in) const;\n\n  void readValue(ValueType _type , std::istream& _in, float& _value) const;\n  void readValue(ValueType _type, std::istream& _in, double& _value) const;\n  void readValue(ValueType _type , std::istream& _in, unsigned int& _value) const;\n  void readValue(ValueType _type , std::istream& _in, int& _value) const;\n\n  void readInteger(ValueType _type, std::istream& _in, int& _value) const;\n  void readInteger(ValueType _type, std::istream& _in, unsigned int& _value) const;\n\n  /// Read unsupported properties in PLY file\n  void consume_input(std::istream& _in, int _count) const {\n\t  _in.read(reinterpret_cast<char*>(&buff[0]), _count);\n  }\n\n  mutable unsigned char buff[8];\n\n  /// Available per file options for reading\n  mutable Options options_;\n\n  /// Options that the user wants to read\n  mutable Options userOptions_;\n\n  mutable unsigned int vertexCount_;\n  mutable unsigned int faceCount_;\n\n  mutable ValueType vertexType_;\n  mutable uint vertexDimension_;\n\n  mutable ValueType faceIndexType_;\n  mutable ValueType faceEntryType_;\n\n  enum VertexProperty {\n    XCOORD,YCOORD,ZCOORD,\n    TEXX,TEXY,\n    COLORRED,COLORGREEN,COLORBLUE,COLORALPHA,\n    XNORM,YNORM,ZNORM,\n    UNSUPPORTED\n  };\n\n  /// Stores sizes of property types\n  mutable std::map<ValueType, int> scalar_size_;\n\n  // Number of vertex properties\n  mutable unsigned int vertexPropertyCount_;\n  mutable std::map< int , std::pair< VertexProperty, ValueType> > vertexPropertyMap_;\n\n};\n\n\n//== TYPE DEFINITION ==========================================================\n\n\n/// Declare the single entity of the PLY reader\nextern _PLYReader_  __PLYReaderInstance;\nOPENMESHDLLEXPORT _PLYReader_&  PLYReader();\n\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n#endif\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/reader/STLReader.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------*\n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         *\n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/\n\n/*===========================================================================*\\\n *                                                                           *\n *   $Revision: 1053 $                                                         *\n *   $Date: 2014-05-09 14:44:18 +0200 (金, 09 5 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//== INCLUDES =================================================================\n\n\n// STL\n#include <map>\n\n#include <float.h>\n#include <fstream>\n\n// OpenMesh\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/IO/BinaryHelper.hh>\n#include <OpenMesh/Core/IO/reader/STLReader.hh>\n#include <OpenMesh/Core/IO/IOManager.hh>\n#include <OpenMesh/Core/System/omstream.hh>\n#include <OpenMesh/Core/IO/importer/BaseImporter.hh>\n\n\n//=== NAMESPACES ==============================================================\n\n\nnamespace OpenMesh {\nnamespace IO {\n\n\n//=== INSTANCIATE =============================================================\n\n\n// register the STLReader singleton with MeshReader\n_STLReader_  __STLReaderInstance;\n_STLReader_&  STLReader() { return __STLReaderInstance; }\n\n\n//=== IMPLEMENTATION ==========================================================\n\n\n_STLReader_::\n_STLReader_()\n  : eps_(FLT_MIN)\n{\n  IOManager().register_module(this);\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nbool\n_STLReader_::\nread(const std::string& _filename, BaseImporter& _bi, Options& _opt)\n{\n  bool result = false;\n\n  STL_Type file_type = NONE;\n\n  if ( check_extension( _filename, \"stla\" ) )\n  {\n    file_type = STLA;\n  }\n\n  else if ( check_extension( _filename, \"stlb\" ) )\n  {\n    file_type = STLB;\n  }\n\n  else if ( check_extension( _filename, \"stl\" ) )\n  {\n    file_type = check_stl_type(_filename);\n  }\n\n\n  switch (file_type)\n  {\n    case STLA:\n    {\n      result = read_stla(_filename, _bi, _opt);\n      _opt -= Options::Binary;\n      break;\n    }\n\n    case STLB:\n    {\n      result = read_stlb(_filename, _bi, _opt);\n      _opt += Options::Binary;\n      break;\n    }\n\n    default:\n    {\n      result = false;\n      break;\n    }\n  }\n\n\n  return result;\n}\n\nbool\n_STLReader_::read(std::istream& _is,\n\t\t BaseImporter& _bi,\n\t\t Options& _opt)\n{\n\n  bool result = false;\n\n  if (_opt & Options::Binary)\n    result = read_stlb(_is, _bi, _opt);\n  else\n    result = read_stla(_is, _bi, _opt);\n\n  return result;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\n#ifndef DOXY_IGNORE_THIS\n\nclass CmpVec\n{\npublic:\n\n  CmpVec(float _eps=FLT_MIN) : eps_(_eps) {}\n\n  bool operator()( const Vec3f& _v0, const Vec3f& _v1 ) const\n  {\n    if (fabs(_v0[0] - _v1[0]) <= eps_)\n    {\n      if (fabs(_v0[1] - _v1[1]) <= eps_)\n      {\n\treturn (_v0[2] < _v1[2] - eps_);\n      }\n      else return (_v0[1] < _v1[1] - eps_);\n    }\n    else return (_v0[0] < _v1[0] - eps_);\n  }\n\nprivate:\n  float eps_;\n};\n\n#endif\n\n\n//-----------------------------------------------------------------------------\n\nvoid trimStdString( std::string& _string) {\n  // Trim Both leading and trailing spaces\n\n  size_t start = _string.find_first_not_of(\" \\t\\r\\n\");\n  size_t end   = _string.find_last_not_of(\" \\t\\r\\n\");\n\n  if(( std::string::npos == start ) || ( std::string::npos == end))\n    _string = \"\";\n  else\n    _string = _string.substr( start, end-start+1 );\n}\n\n//-----------------------------------------------------------------------------\n\nbool\n_STLReader_::\nread_stla(const std::string& _filename, BaseImporter& _bi, Options& _opt) const\n{\n  std::fstream in( _filename.c_str(), std::ios_base::in );\n\n  if (!in)\n  {\n    omerr() << \"[STLReader] : cannot not open file \"\n\t  << _filename\n\t  << std::endl;\n    return false;\n  }\n\n  bool res = read_stla(in, _bi, _opt);\n\n  if (in)\n    in.close();\n\n  return res;\n}\n\n//-----------------------------------------------------------------------------\n\nbool\n_STLReader_::\nread_stla(std::istream& _in, BaseImporter& _bi, Options& _opt) const\n{\n\n  unsigned int               i;\n  OpenMesh::Vec3f            v;\n  OpenMesh::Vec3f            n;\n  BaseImporter::VHandles     vhandles;\n\n  CmpVec comp(eps_);\n  std::map<Vec3f, VertexHandle, CmpVec>            vMap(comp);\n  std::map<Vec3f, VertexHandle, CmpVec>::iterator  vMapIt;\n\n  std::string line;\n\n  bool facet_normal(false);\n\n  while( _in && !_in.eof() ) {\n\n    // Get one line\n    std::getline(_in, line);\n    if ( _in.bad() ){\n      omerr() << \"  Warning! Could not read stream properly!\\n\";\n      return false;\n    }\n\n    // Trim Both leading and trailing spaces\n    trimStdString(line);\n\n    // Normal found?\n    if (line.find(\"facet normal\") != std::string::npos) {\n      std::stringstream strstream(line);\n\n      std::string garbage;\n\n      // facet\n      strstream >> garbage;\n\n      // normal\n      strstream >> garbage;\n\n      strstream >> n[0];\n      strstream >> n[1];\n      strstream >> n[2];\n\n      facet_normal = true;\n    }\n\n    // Detected a triangle\n    if ( (line.find(\"outer\") != std::string::npos) ||  (line.find(\"OUTER\") != std::string::npos ) ) {\n\n      vhandles.clear();\n\n      for (i=0; i<3; ++i) {\n        // Get one vertex\n        std::getline(_in, line);\n        trimStdString(line);\n\n        std::stringstream strstream(line);\n\n        std::string garbage;\n        strstream >> garbage;\n\n        strstream >> v[0];\n        strstream >> v[1];\n        strstream >> v[2];\n\n        // has vector been referenced before?\n        if ((vMapIt=vMap.find(v)) == vMap.end())\n        {\n          // No : add vertex and remember idx/vector mapping\n          VertexHandle handle = _bi.add_vertex(v);\n          vhandles.push_back(handle);\n          vMap[v] = handle;\n        }\n        else\n          // Yes : get index from map\n          vhandles.push_back(vMapIt->second);\n\n      }\n\n      // Add face only if it is not degenerated\n      if ((vhandles[0] != vhandles[1]) &&\n          (vhandles[0] != vhandles[2]) &&\n          (vhandles[1] != vhandles[2])) {\n\n\n        FaceHandle fh = _bi.add_face(vhandles);\n\n        // set the normal if requested\n        // if a normal was requested but could not be found we unset the option\n        if (facet_normal) {\n          if (fh.is_valid() && _opt.face_has_normal())\n            _bi.set_normal(fh, n);\n        } else\n          _opt -= Options::FaceNormal;\n      }\n\n      facet_normal = false;\n    }\n  }\n\n  return true;\n}\n\n//-----------------------------------------------------------------------------\n\nbool\n_STLReader_::\nread_stlb(const std::string& _filename, BaseImporter& _bi, Options& _opt) const\n{\n  std::fstream in( _filename.c_str(), std::ios_base::in | std::ios_base::binary);\n\n  if (!in)\n  {\n    omerr() << \"[STLReader] : cannot not open file \"\n\t  << _filename\n\t  << std::endl;\n    return false;\n  }\n\n  bool res = read_stlb(in, _bi, _opt);\n\n  if (in)\n    in.close();\n\n  return res;\n}\n\n//-----------------------------------------------------------------------------\n\nbool\n_STLReader_::\nread_stlb(std::istream& _in, BaseImporter& _bi, Options& _opt) const\n{\n  char                       dummy[100];\n  bool                       swapFlag;\n  unsigned int               i, nT;\n  OpenMesh::Vec3f            v, n;\n  BaseImporter::VHandles     vhandles;\n\n  std::map<Vec3f, VertexHandle, CmpVec>  vMap;\n  std::map<Vec3f, VertexHandle, CmpVec>::iterator vMapIt;\n\n\n  // check size of types\n  if ((sizeof(float) != 4) || (sizeof(int) != 4)) {\n    omerr() << \"[STLReader] : wrong type size\\n\";\n    return false;\n  }\n\n  // determine endian mode\n  union { unsigned int i; unsigned char c[4]; } endian_test;\n  endian_test.i = 1;\n  swapFlag = (endian_test.c[3] == 1);\n\n  // read number of triangles\n  _in.read(dummy, 80);\n  nT = read_int(_in, swapFlag);\n\n  // read triangles\n  while (nT)\n  {\n    vhandles.clear();\n\n    // read triangle normal\n    n[0] = read_float(_in, swapFlag);\n    n[1] = read_float(_in, swapFlag);\n    n[2] = read_float(_in, swapFlag);\n\n    // triangle's vertices\n    for (i=0; i<3; ++i)\n    {\n      v[0] = read_float(_in, swapFlag);\n      v[1] = read_float(_in, swapFlag);\n      v[2] = read_float(_in, swapFlag);\n\n      // has vector been referenced before?\n      if ((vMapIt=vMap.find(v)) == vMap.end())\n      {\n        // No : add vertex and remember idx/vector mapping\n        VertexHandle handle = _bi.add_vertex(v);\n        vhandles.push_back(handle);\n        vMap[v] = handle;\n      }\n      else\n        // Yes : get index from map\n        vhandles.push_back(vMapIt->second);\n    }\n\n\n    // Add face only if it is not degenerated\n    if ((vhandles[0] != vhandles[1]) &&\n\t(vhandles[0] != vhandles[2]) &&\n\t(vhandles[1] != vhandles[2])) {\n      FaceHandle fh = _bi.add_face(vhandles);\n\n      if (fh.is_valid() && _opt.face_has_normal())\n        _bi.set_normal(fh, n);\n    }\n\n    _in.read(dummy, 2);\n    --nT;\n  }\n\n  return true;\n}\n\n//-----------------------------------------------------------------------------\n\n_STLReader_::STL_Type\n_STLReader_::\ncheck_stl_type(const std::string& _filename) const\n{\n  // assume it's binary stl, then file size is known from #triangles\n  // if size matches, it's really binary\n\n\n  // open file\n  FILE* in = fopen(_filename.c_str(), \"rb\");\n  if (!in) return NONE;\n\n\n  // determine endian mode\n  union { unsigned int i; unsigned char c[4]; } endian_test;\n  endian_test.i = 1;\n  bool swapFlag = (endian_test.c[3] == 1);\n\n\n  // read number of triangles\n  char dummy[100];\n  fread(dummy, 1, 80, in);\n  size_t nT = read_int(in, swapFlag);\n\n\n  // compute file size from nT\n  size_t binary_size = 84 + nT*50;\n\n\n  // get actual file size\n  size_t file_size(0);\n  rewind(in);\n  while (!feof(in))\n    file_size += fread(dummy, 1, 100, in);\n  fclose(in);\n\n\n  // if sizes match -> it's STLB\n  return (binary_size == file_size ? STLB : STLA);\n}\n\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/reader/STLReader.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------*\n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         *\n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/\n\n/*===========================================================================*\\\n *                                                                           *\n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  Implements an reader module for STL files\n//\n//=============================================================================\n\n\n#ifndef __STLREADER_HH__\n#define __STLREADER_HH__\n\n\n//=== INCLUDES ================================================================\n\n\n#include <stdio.h>\n#include <string>\n\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/Utils/SingletonT.hh>\n#include <OpenMesh/Core/IO/reader/BaseReader.hh>\n\n#ifndef WIN32\n#include <string.h>\n#endif\n\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\nnamespace IO {\n\n//== FORWARDS =================================================================\n\nclass BaseImporter;\n\n//== IMPLEMENTATION ===========================================================\n\n\n/**\n    Implementation of the STL format reader. This class is singleton'ed by\n    SingletonT to STLReader.\n*/\nclass OPENMESHDLLEXPORT _STLReader_ : public BaseReader\n{\npublic:\n\n  // constructor\n  _STLReader_();\n\n  /// Destructor\n  virtual ~_STLReader_() {};\n\n\n  std::string get_description() const\n  { return \"Stereolithography Interface Format\"; }\n  std::string get_extensions() const { return \"stl stla stlb\"; }\n\n  bool read(const std::string& _filename,\n\t    BaseImporter& _bi,\n            Options& _opt);\n\n  bool read(std::istream& _in,\n\t\t    BaseImporter& _bi,\n            Options& _opt);\n\n  /** Set the threshold to be used for considering two point to be equal.\n      Can be used to merge small gaps */\n  void set_epsilon(float _eps) { eps_=_eps; }\n\n  /// Returns the threshold to be used for considering two point to be equal.\n  float epsilon() const { return eps_; }\n\n\n\nprivate:\n\n  enum STL_Type { STLA, STLB, NONE };\n  STL_Type check_stl_type(const std::string& _filename) const;\n\n  bool read_stla(const std::string& _filename, BaseImporter& _bi, Options& _opt) const;\n  bool read_stla(std::istream& _in, BaseImporter& _bi, Options& _opt) const;\n  bool read_stlb(const std::string& _filename, BaseImporter& _bi, Options& _opt) const;\n  bool read_stlb(std::istream& _in, BaseImporter& _bi, Options& _opt) const;\n\n\nprivate:\n\n  float eps_;\n};\n\n\n//== TYPE DEFINITION ==========================================================\n\n\n/// Declare the single entity of the STL reader\nextern _STLReader_  __STLReaderInstance;\nOPENMESHDLLEXPORT _STLReader_&  STLReader();\n\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n#endif\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/writer/BaseWriter.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=== INCLUDES ================================================================\n\n\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/IO/writer/BaseWriter.hh>\n#include <algorithm>\n#include <string>\n#include <iterator>\n#if defined(OM_CC_MIPS)\n#  include <ctype.h>\n#else\n#  include <cctype>\n#endif\n\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\nnamespace IO {\n\n\n//=== IMPLEMENTATION ==========================================================\n\n#ifndef DOXY_IGNORE_THIS\n\nstatic inline char tolower(char c)\n{\n  using namespace std;\n  return ::tolower(c); \n}\n\n#endif\n\n//-----------------------------------------------------------------------------\n\n\nbool \nBaseWriter::\ncan_u_write(const std::string& _filename) const \n{\n  // get file extension\n  std::string extension;\n  std::string::size_type pos(_filename.rfind(\".\"));\n\n  if (pos != std::string::npos)\n  { \n    extension = _filename.substr(pos+1, _filename.length()-pos-1);\n\n    std::transform( extension.begin(), extension.end(), \n\t\t    extension.begin(), tolower );\n  }\n\n  // locate extension in extension string\n  return (get_extensions().find(extension) != std::string::npos);\n}\n\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/writer/BaseWriter.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------*\n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         *\n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/\n\n/*===========================================================================*\\\n *                                                                           *\n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  Implements the baseclass for IOManager writer modules\n//\n//=============================================================================\n\n\n#ifndef __BASEWRITER_HH__\n#define __BASEWRITER_HH__\n\n\n//=== INCLUDES ================================================================\n\n\n// STD C++\n#include <iostream>\n#include <string>\n\n// OpenMesh\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/IO/Options.hh>\n#include <OpenMesh/Core/IO/exporter/BaseExporter.hh>\n\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\nnamespace IO {\n\n\n//=== IMPLEMENTATION ==========================================================\n\n\n/**\n   Base class for all writer modules. The module should register itself at\n   the IOManager by calling the register_module function.\n*/\nclass OPENMESHDLLEXPORT BaseWriter\n{\npublic:\n\n  typedef unsigned int Option;\n\n  /// Destructor\n  virtual ~BaseWriter() {};\n\n  /// Return short description of the supported file format.\n  virtual std::string get_description() const = 0;\n\n  /// Return file format's extension.\n  virtual std::string get_extensions() const = 0;\n\n  /// Returns true if writer can parse _filename (checks extension)\n  virtual bool can_u_write(const std::string& _filename) const;\n\n  /** Write to a file\n   * @param _filename write to file with the given filename\n   * @param _be BaseExporter, which specifies the data source\n   * @param _opt writing options\n   * @param _precision can be used to specify the precision of the floating point notation.\n   */\n  virtual bool write(const std::string& _filename,\n\t\t     BaseExporter& _be,\n                     Options _opt,\n                     std::streamsize _precision = 6) const = 0;\n\n  /** Write to a std::ostream\n   * @param _os write to std::ostream\n   * @param _be BaseExporter, which specifies the data source\n   * @param _opt writing options\n   * @param _precision can be used to specify the precision of the floating point notation.\n   */\n  virtual bool write(std::ostream& _os,\n\t\t     BaseExporter& _be,\n                     Options _opt,\n                     std::streamsize _precision = 6) const = 0;\n\n  /// Returns expected size of file if binary format is supported else 0.\n  virtual size_t binary_size(BaseExporter&, Options) const { return 0; }\n\n\n\nprotected:\n\n  bool check(BaseExporter& _be, Options _opt) const\n  {\n    return (_opt.check(Options::VertexNormal ) <= _be.has_vertex_normals())\n       &&  (_opt.check(Options::VertexTexCoord)<= _be.has_vertex_texcoords())\n       &&  (_opt.check(Options::VertexColor)   <= _be.has_vertex_colors())\n       &&  (_opt.check(Options::FaceNormal)    <= _be.has_face_normals())\n       &&  (_opt.check(Options::FaceColor)     <= _be.has_face_colors());\n  }\n};\n\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n#endif\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/writer/OBJWriter.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------*\n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         *\n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/\n\n/*===========================================================================*\\\n *                                                                           *\n *   $Revision: 999 $                                                         *\n *   $Date: 2014-02-28 08:15:27 +0100 (金, 28 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//== INCLUDES =================================================================\n\n\n//STL\n#include <fstream>\n#include <limits>\n\n// OpenMesh\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/IO/BinaryHelper.hh>\n#include <OpenMesh/Core/IO/writer/OBJWriter.hh>\n#include <OpenMesh/Core/IO/IOManager.hh>\n#include <OpenMesh/Core/System/omstream.hh>\n#include <OpenMesh/Core/Utils/color_cast.hh>\n\n//=== NAMESPACES ==============================================================\n\n\nnamespace OpenMesh {\nnamespace IO {\n\n\n//=== INSTANCIATE =============================================================\n\n\n// register the OBJLoader singleton with MeshLoader\n_OBJWriter_  __OBJWriterinstance;\n_OBJWriter_& OBJWriter() { return __OBJWriterinstance; }\n\n\n//=== IMPLEMENTATION ==========================================================\n\n\n_OBJWriter_::_OBJWriter_() { IOManager().register_module(this); }\n\n\n//-----------------------------------------------------------------------------\n\n\nbool\n_OBJWriter_::\nwrite(const std::string& _filename, BaseExporter& _be, Options _opt, std::streamsize _precision) const\n{\n  std::fstream out(_filename.c_str(), std::ios_base::out );\n\n  if (!out)\n  {\n    omerr() << \"[OBJWriter] : cannot open file \"\n\t  << _filename << std::endl;\n    return false;\n  }\n\n  out.precision(_precision);\n\n  {\n#if defined(WIN32)\n    std::string::size_type dot = _filename.find_last_of(\"\\\\/\");\n#else\n    std::string::size_type dot = _filename.rfind(\"/\");\n#endif\n\n    if (dot == std::string::npos){\n      path_ = \"./\";\n      objName_ = _filename;\n    }else{\n      path_ = _filename.substr(0,dot+1);\n      objName_ = _filename.substr(dot+1);\n    }\n\n    //remove the file extension\n    dot = _filename.find_last_of(\".\");\n\n    if(dot != std::string::npos)\n      objName_ = objName_.substr(0,dot-1);\n  }\n\n  bool result = write(out, _be, _opt, _precision);\n\n  out.close();\n  return result;\n}\n\n//-----------------------------------------------------------------------------\n\nsize_t _OBJWriter_::getMaterial(OpenMesh::Vec3f _color) const\n{\n  for (size_t i=0; i < material_.size(); i++)\n    if(material_[i] == _color)\n      return i;\n\n  //not found add new material\n  material_.push_back( _color );\n  return material_.size()-1;\n}\n\n//-----------------------------------------------------------------------------\n\nsize_t _OBJWriter_::getMaterial(OpenMesh::Vec4f _color) const\n{\n  for (size_t i=0; i < materialA_.size(); i++)\n    if(materialA_[i] == _color)\n      return i;\n\n  //not found add new material\n  materialA_.push_back( _color );\n  return materialA_.size()-1;\n}\n\n//-----------------------------------------------------------------------------\n\nbool\n_OBJWriter_::\nwriteMaterial(std::ostream& _out, BaseExporter& _be, Options _opt) const\n{\n  OpenMesh::Vec3f c;\n  OpenMesh::Vec4f cA;\n\n  material_.clear();\n  materialA_.clear();\n\n  //iterate over faces\n  for (size_t i=0, nF=_be.n_faces(); i<nF; ++i)\n  {\n    //color with alpha\n    if ( _opt.color_has_alpha() ){\n      cA  = color_cast<OpenMesh::Vec4f> (_be.colorA( FaceHandle(int(i)) ));\n      getMaterial(cA);\n    }else{\n    //and without alpha\n      c  = color_cast<OpenMesh::Vec3f> (_be.color( FaceHandle(int(i)) ));\n      getMaterial(c);\n    }\n  }\n\n  //write the materials\n  if ( _opt.color_has_alpha() )\n    for (size_t i=0; i < materialA_.size(); i++){\n      _out << \"newmtl \" << \"mat\" << i << std::endl;\n      _out << \"Ka 0.5000 0.5000 0.5000\" << std::endl;\n      _out << \"Kd \" << materialA_[i][0] << materialA_[i][1] << materialA_[i][2] << std::endl;;\n      _out << \"Tr \" << materialA_[i][3] << std::endl;\n      _out << \"illum 1\" << std::endl;\n    }\n  else\n    for (size_t i=0; i < material_.size(); i++){\n      _out << \"newmtl \" << \"mat\" << i << std::endl;\n      _out << \"Ka 0.5000 0.5000 0.5000\" << std::endl;\n      _out << \"Kd \" << material_[i][0] << material_[i][1] << material_[i][2] << std::endl;;\n      _out << \"illum 1\" << std::endl;\n    }\n\n  return true;\n}\n\n//-----------------------------------------------------------------------------\n\n\nbool\n_OBJWriter_::\nwrite(std::ostream& _out, BaseExporter& _be, Options _opt, std::streamsize _precision) const\n{\n  unsigned int idx;\n  size_t i, j,nV, nF;\n  Vec3f v, n;\n  Vec2f t;\n  VertexHandle vh;\n  std::vector<VertexHandle> vhandles;\n  bool useMatrial = false;\n  OpenMesh::Vec3f c;\n  OpenMesh::Vec4f cA;\n\n  omlog() << \"[OBJWriter] : write file\\n\";\n\n  _out.precision(_precision);\n\n  // check exporter features\n  if (!check( _be, _opt))\n     return false;\n\n\n  // check writer features\n  if ( _opt.check(Options::Binary)     || // not supported by format\n       _opt.check(Options::FaceNormal) ||\n       _opt.check(Options::FaceColor))\n     return false;\n\n\n  //create material file if needed\n  if ( _opt.check(Options::FaceColor) ){\n\n    std::string matFile = path_ + objName_ + \".mat\";\n\n    std::fstream matStream(matFile.c_str(), std::ios_base::out );\n\n    if (!matStream)\n    {\n      omerr() << \"[OBJWriter] : cannot write material file \" << matFile << std::endl;\n\n    }else{\n      useMatrial = writeMaterial(matStream, _be, _opt);\n\n      matStream.close();\n    }\n  }\n\n  // header\n  _out << \"# \" << _be.n_vertices() << \" vertices, \";\n  _out << _be.n_faces() << \" faces\" << std::endl;\n\n  // material file\n  if (useMatrial &&  _opt.check(Options::FaceColor) )\n    _out << \"mtllib \" << objName_ << \".mat\" << std::endl;\n\n  // vertex data (point, normals, texcoords)\n  for (i=0, nV=_be.n_vertices(); i<nV; ++i)\n  {\n    vh = VertexHandle(int(i));\n    v  = _be.point(vh);\n    n  = _be.normal(vh);\n    t  = _be.texcoord(vh);\n\n    _out << \"v \" << v[0] <<\" \"<< v[1] <<\" \"<< v[2] << std::endl;\n\n    if (_opt.check(Options::VertexNormal))\n      _out << \"vn \" << n[0] <<\" \"<< n[1] <<\" \"<< n[2] << std::endl;\n\n    if (_opt.check(Options::VertexTexCoord))\n      _out << \"vt \" << t[0] <<\" \"<< t[1] << std::endl;\n  }\n\n  size_t lastMat = std::numeric_limits<std::size_t>::max();\n\n  // we do not want to write seperators if we only write vertex indices\n  bool onlyVertices =    !_opt.check(Options::VertexTexCoord)\n                      && !_opt.check(Options::VertexNormal);\n\n  // faces (indices starting at 1 not 0)\n  for (i=0, nF=_be.n_faces(); i<nF; ++i)\n  {\n\n    if (useMatrial &&  _opt.check(Options::FaceColor) ){\n      size_t material = std::numeric_limits<std::size_t>::max();\n\n      //color with alpha\n      if ( _opt.color_has_alpha() ){\n        cA  = color_cast<OpenMesh::Vec4f> (_be.colorA( FaceHandle(int(i)) ));\n        material = getMaterial(cA);\n      } else{\n      //and without alpha\n        c  = color_cast<OpenMesh::Vec3f> (_be.color( FaceHandle(int(i)) ));\n        material = getMaterial(c);\n      }\n\n      // if we are ina a new material block, specify in the file which material to use\n      if(lastMat != material) {\n        _out << \"usemtl mat\" << material << std::endl;\n        lastMat = material;\n      }\n    }\n\n    _out << \"f\";\n\n    _be.get_vhandles(FaceHandle(int(i)), vhandles);\n\n    for (j=0; j< vhandles.size(); ++j)\n    {\n\n      // Write vertex index\n      idx = vhandles[j].idx() + 1;\n      _out << \" \" << idx;\n\n      if (!onlyVertices) {\n        // write separator\n        _out << \"/\" ;\n\n        // write vertex texture coordinate index\n        if (_opt.check(Options::VertexTexCoord))\n          _out  << idx;\n\n        // write vertex normal index\n        if ( _opt.check(Options::VertexNormal) ) {\n          // write separator\n          _out << \"/\" ;\n          _out << idx;\n        }\n      }\n    }\n\n    _out << std::endl;\n  }\n\n  material_.clear();\n  materialA_.clear();\n\n  return true;\n}\n\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/writer/OBJWriter.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------*\n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         *\n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/\n\n/*===========================================================================*\\\n *                                                                           *\n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  Implements an IOManager writer module for OBJ files\n//\n//=============================================================================\n\n\n#ifndef __OBJWRITER_HH__\n#define __OBJWRITER_HH__\n\n\n//=== INCLUDES ================================================================\n\n\n#include <string>\n#include <fstream>\n\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/Utils/SingletonT.hh>\n#include <OpenMesh/Core/IO/exporter/BaseExporter.hh>\n#include <OpenMesh/Core/IO/writer/BaseWriter.hh>\n\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\nnamespace IO {\n\n\n//=== IMPLEMENTATION ==========================================================\n\n\n/**\n    This class defines the OBJ writer. This class is further singleton'ed\n    by SingletonT to OBJWriter.\n*/\nclass OPENMESHDLLEXPORT _OBJWriter_ : public BaseWriter\n{\npublic:\n\n  _OBJWriter_();\n\n  /// Destructor\n  virtual ~_OBJWriter_() {};\n\n  std::string get_description() const  { return \"Alias/Wavefront\"; }\n  std::string get_extensions()  const  { return \"obj\"; }\n\n  bool write(const std::string&, BaseExporter&, Options, std::streamsize _precision = 6) const;\n\n  bool write(std::ostream&, BaseExporter&, Options, std::streamsize _precision = 6) const;\n\n  size_t binary_size(BaseExporter&, Options) const { return 0; }\n\nprivate:\n\n  mutable std::string path_;\n  mutable std::string objName_;\n\n  mutable std::vector< OpenMesh::Vec3f > material_;\n  mutable std::vector< OpenMesh::Vec4f > materialA_;\n\n  size_t getMaterial(OpenMesh::Vec3f _color) const;\n\n  size_t getMaterial(OpenMesh::Vec4f _color) const;\n\n  bool writeMaterial(std::ostream& _out, BaseExporter&, Options) const;\n\n\n};\n\n\n//== TYPE DEFINITION ==========================================================\n\n\n/// Declare the single entity of the OBJ writer\nextern _OBJWriter_  __OBJWriterinstance;\nOPENMESHDLLEXPORT _OBJWriter_& OBJWriter();\n\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n#endif\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/writer/OFFWriter.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------*\n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         *\n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/\n\n/*===========================================================================*\\\n *                                                                           *\n *   $Revision: 1053 $                                                         *\n *   $Date: 2014-05-09 14:44:18 +0200 (金, 09 5 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//== INCLUDES =================================================================\n\n\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/System/omstream.hh>\n#include <OpenMesh/Core/Utils/Endian.hh>\n#include <OpenMesh/Core/IO/IOManager.hh>\n#include <OpenMesh/Core/IO/BinaryHelper.hh>\n#include <OpenMesh/Core/IO/writer/OFFWriter.hh>\n\n#include <OpenMesh/Core/IO/SR_store.hh>\n\n//=== NAMESPACES ==============================================================\n\n\nnamespace OpenMesh {\nnamespace IO {\n\n\n//=== INSTANCIATE =============================================================\n\n\n// register the OFFLoader singleton with MeshLoader\n_OFFWriter_  __OFFWriterInstance;\n_OFFWriter_& OFFWriter() { return __OFFWriterInstance; }\n\n\n//=== IMPLEMENTATION ==========================================================\n\n\n_OFFWriter_::_OFFWriter_() { IOManager().register_module(this); }\n\n\n//-----------------------------------------------------------------------------\n\n\nbool\n_OFFWriter_::\nwrite(const std::string& _filename, BaseExporter& _be, Options _opt, std::streamsize _precision) const\n{\n  // check exporter features\n  if ( !check( _be, _opt ) )\n    return false;\n\n\n  // check writer features\n  if ( _opt.check(Options::FaceNormal) ) // not supported by format\n    return false;\n\n  // open file\n  std::fstream out(_filename.c_str(), (_opt.check(Options::Binary) ? std::ios_base::binary | std::ios_base::out\n                                                         : std::ios_base::out) );\n  if (!out)\n  {\n    omerr() << \"[OFFWriter] : cannot open file \"\n\t  << _filename\n\t  << std::endl;\n    return false;\n  }\n\n  // write header line\n  if (_opt.check(Options::VertexTexCoord)) out << \"ST\";\n  if (_opt.check(Options::VertexColor) || _opt.check(Options::FaceColor))    out << \"C\";\n  if (_opt.check(Options::VertexNormal))   out << \"N\";\n  out << \"OFF\";\n  if (_opt.check(Options::Binary)) out << \" BINARY\";\n  out << \"\\n\";\n\n\n  if (!_opt.check(Options::Binary))\n    out.precision(_precision);\n\n  // write to file\n  bool result = (_opt.check(Options::Binary) ?\n\t\t write_binary(out, _be, _opt) :\n\t\t write_ascii(out, _be, _opt));\n\n\n  // return result\n  out.close();\n  return result;\n}\n\n//-----------------------------------------------------------------------------\n\n\nbool\n_OFFWriter_::\nwrite(std::ostream& _os, BaseExporter& _be, Options _opt, std::streamsize _precision) const\n{\n  // check exporter features\n  if ( !check( _be, _opt ) )\n    return false;\n\n\n  // check writer features\n  if ( _opt.check(Options::FaceNormal) ) // not supported by format\n    return false;\n\n\n  if (!_os.good())\n  {\n    omerr() << \"[OFFWriter] : cannot write to stream \"\n\t  << std::endl;\n    return false;\n  }\n\n  // write header line\n  if (_opt.check(Options::VertexTexCoord)) _os << \"ST\";\n  if (_opt.check(Options::VertexColor) || _opt.check(Options::FaceColor))    _os << \"C\";\n  if (_opt.check(Options::VertexNormal))   _os << \"N\";\n  _os << \"OFF\";\n  if (_opt.check(Options::Binary)) _os << \" BINARY\";\n  _os << \"\\n\";\n\n  if (!_opt.check(Options::Binary))\n    _os.precision(_precision);\n\n  // write to file\n  bool result = (_opt.check(Options::Binary) ?\n\t\t write_binary(_os, _be, _opt) :\n\t\t write_ascii(_os, _be, _opt));\n\n\n  // return result\n  return result;\n}\n\n//-----------------------------------------------------------------------------\n\n\nbool\n_OFFWriter_::\nwrite_ascii(std::ostream& _out, BaseExporter& _be, Options _opt) const\n{\n\n  unsigned int i, nV, nF;\n  Vec3f v, n;\n  Vec2f t;\n  OpenMesh::Vec3i c;\n  OpenMesh::Vec4i cA;\n  OpenMesh::Vec3f cf;\n  OpenMesh::Vec4f cAf;\n  VertexHandle vh;\n  std::vector<VertexHandle> vhandles;\n\n\n  // #vertices, #faces\n  _out << _be.n_vertices() << \" \";\n  _out << _be.n_faces() << \" \";\n  _out << 0 << \"\\n\";\n\n  if (_opt.color_is_float())\n    _out << std::fixed;\n\n\n  // vertex data (point, normals, colors, texcoords)\n  for (i=0, nV=int(_be.n_vertices()); i<nV; ++i)\n  {\n    vh = VertexHandle(i);\n    v  = _be.point(vh);\n\n    //Vertex\n    _out << v[0] << \" \" << v[1] << \" \" << v[2];\n\n    // VertexNormal\n    if ( _opt.vertex_has_normal() ) {\n      n  = _be.normal(vh);\n      _out << \" \" << n[0] << \" \" << n[1] << \" \" << n[2];\n    }\n\n    // VertexColor\n    if ( _opt.vertex_has_color() ) {\n      if ( _opt.color_is_float() ) {\n        //with alpha\n        if ( _opt.color_has_alpha() ){\n          cAf  = _be.colorAf(vh);\n          _out << \" \" << cAf;\n        }else{\n          //without alpha\n          cf  = _be.colorf(vh);\n          _out << \" \" << cf;\n        }\n      } else {\n        //with alpha\n        if ( _opt.color_has_alpha() ){\n          cA  = _be.colorA(vh);\n          _out << \" \" << cA;\n        }else{\n          //without alpha\n          c  = _be.color(vh);\n          _out << \" \" << c;\n        }\n      }\n    }\n\n    // TexCoord\n    if (_opt.vertex_has_texcoord() ) {\n      t  = _be.texcoord(vh);\n      _out << \" \" << t[0] << \" \" << t[1];\n    }\n\n    _out << \"\\n\";\n\n  }\n\n  // faces (indices starting at 0)\n  if (_be.is_triangle_mesh())\n  {\n    for (i=0, nF=int(_be.n_faces()); i<nF; ++i)\n    {\n      _be.get_vhandles(FaceHandle(i), vhandles);\n      _out << 3 << \" \";\n      _out << vhandles[0].idx()  << \" \";\n      _out << vhandles[1].idx()  << \" \";\n      _out << vhandles[2].idx();\n\n      //face color\n      if ( _opt.face_has_color() ){\n        if ( _opt.color_is_float() ) {\n          //with alpha\n          if ( _opt.color_has_alpha() ){\n            cAf  = _be.colorAf( FaceHandle(i) );\n            _out << \" \" << cAf;\n          }else{\n            //without alpha\n            cf  = _be.colorf( FaceHandle(i) );\n            _out << \" \" << cf;\n          }\n        } else {\n          //with alpha\n          if ( _opt.color_has_alpha() ){\n            cA  = _be.colorA( FaceHandle(i) );\n            _out << \" \" << cA;\n          }else{\n            //without alpha\n            c  = _be.color( FaceHandle(i) );\n            _out << \" \" << c;\n          }\n        }\n      }\n      _out << \"\\n\";\n    }\n  }\n  else\n  {\n    for (i=0, nF=int(_be.n_faces()); i<nF; ++i)\n    {\n      nV = _be.get_vhandles(FaceHandle(i), vhandles);\n      _out << nV << \" \";\n      for (size_t j=0; j<vhandles.size(); ++j)\n\t       _out << vhandles[j].idx() << \" \";\n\n      //face color\n      if ( _opt.face_has_color() ){\n        if ( _opt.color_is_float() ) {\n          //with alpha\n          if ( _opt.color_has_alpha() ){\n            cAf  = _be.colorAf( FaceHandle(i) );\n            _out << \" \" << cAf;\n          }else{\n            //without alpha\n            cf  = _be.colorf( FaceHandle(i) );\n            _out << \" \" << cf;\n          }\n        } else {\n          //with alpha\n          if ( _opt.color_has_alpha() ){\n            cA  = _be.colorA( FaceHandle(i) );\n            _out << \" \" << cA;\n          }else{\n            //without alpha\n            c  = _be.color( FaceHandle(i) );\n            _out << \" \" << c;\n          }\n        }\n      }\n\n      _out << \"\\n\";\n    }\n  }\n\n\n  return true;\n}\n\n\n//-----------------------------------------------------------------------------\n\nvoid _OFFWriter_::writeValue(std::ostream& _out, int value) const {\n\n  uint32_t tmp = value;\n  store(_out, tmp, false);\n}\n\nvoid _OFFWriter_::writeValue(std::ostream& _out, unsigned int value) const {\n\n  uint32_t tmp = value;\n  store(_out, tmp, false);\n}\n\nvoid _OFFWriter_::writeValue(std::ostream& _out, float value) const {\n\n  float32_t tmp = value;\n  store(_out, tmp, false);\n}\n\nbool\n_OFFWriter_::\nwrite_binary(std::ostream& _out, BaseExporter& _be, Options _opt) const\n{\n\n  unsigned int i, nV, nF;\n  Vec3f v, n;\n  Vec2f t;\n  OpenMesh::Vec4i c;\n  OpenMesh::Vec4f cf;\n  VertexHandle vh;\n  std::vector<VertexHandle> vhandles;\n\n  // #vertices, #faces\n  writeValue(_out, (uint)_be.n_vertices() );\n  writeValue(_out, (uint) _be.n_faces() );\n  writeValue(_out, 0 );\n\n  // vertex data (point, normals, texcoords)\n  for (i=0, nV=int(_be.n_vertices()); i<nV; ++i)\n  {\n    vh = VertexHandle(i);\n    v  = _be.point(vh);\n\n    //vertex\n    writeValue(_out, v[0]);\n    writeValue(_out, v[1]);\n    writeValue(_out, v[2]);\n\n    // vertex normal\n    if ( _opt.vertex_has_normal() ) {\n      n  = _be.normal(vh);\n      writeValue(_out, n[0]);\n      writeValue(_out, n[1]);\n      writeValue(_out, n[2]);\n    }\n    // vertex color\n    if ( _opt.vertex_has_color() ) {\n      if ( _opt.color_is_float() ) {\n        cf  = _be.colorAf(vh);\n        writeValue(_out, cf[0]);\n        writeValue(_out, cf[1]);\n        writeValue(_out, cf[2]);\n\n        if ( _opt.color_has_alpha() )\n          writeValue(_out, cf[3]);\n      } else {\n        c  = _be.colorA(vh);\n        writeValue(_out, c[0]);\n        writeValue(_out, c[1]);\n        writeValue(_out, c[2]);\n\n        if ( _opt.color_has_alpha() )\n          writeValue(_out, c[3]);\n      }\n    }\n    // texCoords\n    if (_opt.vertex_has_texcoord() ) {\n      t  = _be.texcoord(vh);\n      writeValue(_out, t[0]);\n      writeValue(_out, t[1]);\n    }\n\n  }\n\n  // faces (indices starting at 0)\n  if (_be.is_triangle_mesh())\n  {\n    for (i=0, nF=int(_be.n_faces()); i<nF; ++i)\n    {\n      //face\n      _be.get_vhandles(FaceHandle(i), vhandles);\n      writeValue(_out, 3);\n      writeValue(_out, vhandles[0].idx());\n      writeValue(_out, vhandles[1].idx());\n      writeValue(_out, vhandles[2].idx());\n\n      //face color\n      if ( _opt.face_has_color() ){\n        if ( _opt.color_is_float() ) {\n          cf  = _be.colorAf( FaceHandle(i) );\n          writeValue(_out, cf[0]);\n          writeValue(_out, cf[1]);\n          writeValue(_out, cf[2]);\n\n          if ( _opt.color_has_alpha() )\n            writeValue(_out, cf[3]);\n        } else {\n          c  = _be.colorA( FaceHandle(i) );\n          writeValue(_out, c[0]);\n          writeValue(_out, c[1]);\n          writeValue(_out, c[2]);\n\n          if ( _opt.color_has_alpha() )\n            writeValue(_out, c[3]);\n        }\n      }\n    }\n  }\n  else\n  {\n    for (i=0, nF=int(_be.n_faces()); i<nF; ++i)\n    {\n      //face\n      nV = _be.get_vhandles(FaceHandle(i), vhandles);\n      writeValue(_out, nV);\n      for (size_t j=0; j<vhandles.size(); ++j)\n        writeValue(_out, vhandles[j].idx() );\n\n      //face color\n      if ( _opt.face_has_color() ){\n        if ( _opt.color_is_float() ) {\n          cf  = _be.colorAf( FaceHandle(i) );\n          writeValue(_out, cf[0]);\n          writeValue(_out, cf[1]);\n          writeValue(_out, cf[2]);\n\n          if ( _opt.color_has_alpha() )\n            writeValue(_out, cf[3]);\n        } else {\n          c  = _be.colorA( FaceHandle(i) );\n          writeValue(_out, c[0]);\n          writeValue(_out, c[1]);\n          writeValue(_out, c[2]);\n\n          if ( _opt.color_has_alpha() )\n            writeValue(_out, c[3]);\n        }\n      }\n    }\n  }\n\n  return true;\n}\n\n// ----------------------------------------------------------------------------\n\n\nsize_t\n_OFFWriter_::\nbinary_size(BaseExporter& _be, Options _opt) const\n{\n  size_t header(0);\n  size_t data(0);\n  size_t _3longs(3*sizeof(long));\n  size_t _3floats(3*sizeof(float));\n  size_t _3ui(3*sizeof(unsigned int));\n  size_t _4ui(4*sizeof(unsigned int));\n\n  if ( !_opt.is_binary() )\n    return 0;\n  else\n  {\n    header += 11;                             // 'OFF BINARY\\n'\n    header += _3longs;                        // #V #F #E\n    data   += _be.n_vertices() * _3floats;    // vertex data\n  }\n\n  if ( _opt.vertex_has_normal() && _be.has_vertex_normals() )\n  {\n    header += 1; // N\n    data   += _be.n_vertices() * _3floats;\n  }\n\n  if ( _opt.vertex_has_color() && _be.has_vertex_colors() )\n  {\n    header += 1; // C\n    data   += _be.n_vertices() * _3floats;\n  }\n\n  if ( _opt.vertex_has_texcoord() && _be.has_vertex_texcoords() )\n  {\n    size_t _2floats(2*sizeof(float));\n    header += 2; // ST\n    data   += _be.n_vertices() * _2floats;\n  }\n\n  // topology\n  if (_be.is_triangle_mesh())\n  {\n    data += _be.n_faces() * _4ui;\n  }\n  else\n  {\n    unsigned int i, nF;\n    std::vector<VertexHandle> vhandles;\n\n    for (i=0, nF=int(_be.n_faces()); i<nF; ++i)\n      data += _be.get_vhandles(FaceHandle(i), vhandles) * sizeof(unsigned int);\n\n  }\n\n  // face colors\n  if ( _opt.face_has_color() && _be.has_face_colors() ){\n    if ( _opt.color_has_alpha() )\n      data += _be.n_faces() * _4ui;\n    else\n      data += _be.n_faces() * _3ui;\n  }\n\n  return header+data;\n}\n\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/writer/OFFWriter.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------*\n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         *\n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/\n\n/*===========================================================================*\\\n *                                                                           *\n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  Implements a writer module for OFF files\n//\n//=============================================================================\n\n\n#ifndef __OFFWRITER_HH__\n#define __OFFWRITER_HH__\n\n\n//=== INCLUDES ================================================================\n\n\n#include <stdio.h>\n#include <string>\n#include <fstream>\n\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/Utils/SingletonT.hh>\n#include <OpenMesh/Core/IO/exporter/BaseExporter.hh>\n#include <OpenMesh/Core/IO/writer/BaseWriter.hh>\n\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\nnamespace IO {\n\n\n//=== IMPLEMENTATION ==========================================================\n\n\n/**\n    Implementation of the OFF format writer. This class is singleton'ed by\n    SingletonT to OFFWriter.\n\n    By passing Options to the write function you can manipulate the writing behavoir.\n    The following options can be set:\n\n    Binary\n    VertexNormal\n    VertexColor\n    VertexTexCoord\n    FaceColor\n    ColorAlpha\n\n*/\nclass OPENMESHDLLEXPORT _OFFWriter_ : public BaseWriter\n{\npublic:\n\n  _OFFWriter_();\n\n  virtual ~_OFFWriter_() {};\n\n  std::string get_description() const { return \"no description\"; }\n  std::string get_extensions() const  { return \"off\"; }\n\n  bool write(const std::string&, BaseExporter&, Options, std::streamsize _precision = 6) const;\n\n  bool write(std::ostream&, BaseExporter&, Options, std::streamsize _precision = 6) const;\n\n  size_t binary_size(BaseExporter& _be, Options _opt) const;\n\n\nprotected:\n  void writeValue(std::ostream& _out, int value) const;\n  void writeValue(std::ostream& _out, unsigned int value) const;\n  void writeValue(std::ostream& _out, float value) const;\n\n  bool write_ascii(std::ostream& _in, BaseExporter&, Options) const;\n  bool write_binary(std::ostream& _in, BaseExporter&, Options) const;\n};\n\n\n//== TYPE DEFINITION ==========================================================\n\n\n/// Declare the single entity of the OFF writer.\nextern _OFFWriter_  __OFFWriterInstance;\nOPENMESHDLLEXPORT _OFFWriter_& OFFWriter();\n\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n#endif\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/writer/OMWriter.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------*\n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         *\n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/\n\n/*===========================================================================*\\\n *                                                                           *\n *   $Revision: 1055 $                                                         *\n *   $Date: 2014-05-09 15:11:11 +0200 (金, 09 5 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//== INCLUDES =================================================================\n\n#include <OpenMesh/Core/System/config.h>\n// -------------------- STL\n#if defined( OM_CC_MIPS )\n  #include <time.h>\n  #include <string.h>\n#else\n  #include <ctime>\n  #include <cstring>\n#endif\n\n#include <fstream>\n// -------------------- OpenMesh\n#include <OpenMesh/Core/IO/OMFormat.hh>\n#include <OpenMesh/Core/System/omstream.hh>\n#include <OpenMesh/Core/Utils/Endian.hh>\n#include <OpenMesh/Core/IO/exporter/BaseExporter.hh>\n#include <OpenMesh/Core/IO/writer/OMWriter.hh>\n\n//=== NAMESPACES ==============================================================\n\n\nnamespace OpenMesh {\nnamespace IO {\n\n\n//=== INSTANCIATE =============================================================\n\n\n// register the OMLoader singleton with MeshLoader\n_OMWriter_  __OMWriterInstance;\n_OMWriter_& OMWriter() { return __OMWriterInstance; }\n\n\n//=== IMPLEMENTATION ==========================================================\n\n\nconst OMFormat::uchar _OMWriter_::magic_[3] = \"OM\";\nconst OMFormat::uint8 _OMWriter_::version_  = OMFormat::mk_version(1,2);\n\n\n_OMWriter_::\n_OMWriter_()\n{\n  IOManager().register_module(this);\n}\n\n\nbool\n_OMWriter_::write(const std::string& _filename, BaseExporter& _be,\n                   Options _opt, std::streamsize /*_precision*/) const\n{\n  // check whether exporter can give us an OpenMesh BaseKernel\n  if (!_be.kernel()) return false;\n\n\n  // check for om extension in filename, we can only handle OM\n  if (_filename.rfind(\".om\") == std::string::npos)\n    return false;\n\n  _opt += Options::Binary; // only binary format supported\n\n  std::ofstream ofs(_filename.c_str(), std::ios::binary);\n\n  // check if file is open\n  if (!ofs.is_open())\n  {\n    omerr() << \"[OMWriter] : cannot open file \" << _filename << std::endl;\n    return false;\n  }\n\n  // call stream save method\n  bool rc = write(ofs, _be, _opt);\n\n  // close filestream\n  ofs.close();\n\n  // return success/failure notice\n  return rc;\n}\n\n\n//-----------------------------------------------------------------------------\n\nbool\n_OMWriter_::write(std::ostream& _os, BaseExporter& _be, Options _opt, std::streamsize /*_precision*/) const\n{\n//   std::clog << \"[OMWriter]::write( stream )\\n\";\n\n  // check exporter features\n  if ( !check( _be, _opt ) )\n  {\n    omerr() << \"[OMWriter]: exporter does not support wanted feature!\\n\";\n    return false;\n  }\n\n  // Maybe an ascii version will be implemented in the future.\n  // For now, support only a binary format\n  if ( !_opt.check( Options::Binary ) )\n    _opt += Options::Binary;\n\n  // Ignore LSB/MSB bit. Always store in LSB (little endian)\n  _opt += Options::LSB;\n  _opt -= Options::MSB;\n\n  return write_binary(_os, _be, _opt);\n}\n\n\n//-----------------------------------------------------------------------------\n\n\n#ifndef DOXY_IGNORE_THIS\ntemplate <typename T> struct Enabler\n{\n  Enabler( T& obj ) : obj_(obj)\n  {}\n\n  ~Enabler() { obj_.enable(); }\n\n  T& obj_;\n};\n#endif\n\n\nbool _OMWriter_::write_binary(std::ostream& _os, BaseExporter& _be,\n                               Options _opt) const\n{\n  #ifndef DOXY_IGNORE_THIS\n    Enabler<mostream> enabler(omlog());\n  #endif\n\n  size_t bytes = 0;\n\n  bool swap = _opt.check(Options::Swap) || (Endian::local() == Endian::MSB);\n\n  unsigned int i, nV, nF;\n  Vec3f v;\n  Vec2f t;\n  std::vector<VertexHandle> vhandles;\n\n\n  // -------------------- write header\n  OMFormat::Header header;\n\n  header.magic_[0]   = 'O';\n  header.magic_[1]   = 'M';\n  header.mesh_       = _be.is_triangle_mesh() ? 'T' : 'P';\n  header.version_    = version_;\n  header.n_vertices_ = int(_be.n_vertices());\n  header.n_faces_    = int(_be.n_faces());\n  header.n_edges_    = int(_be.n_edges());\n\n  bytes += store( _os, header, swap );\n\n  // ---------------------------------------- write chunks\n\n  OMFormat::Chunk::Header chunk_header;\n\n\n  // -------------------- write vertex data\n\n  // ---------- write vertex position\n  if (_be.n_vertices())\n  {\n    v = _be.point(VertexHandle(0));\n    chunk_header.reserved_ = 0;\n    chunk_header.name_     = false;\n    chunk_header.entity_   = OMFormat::Chunk::Entity_Vertex;\n    chunk_header.type_     = OMFormat::Chunk::Type_Pos;\n    chunk_header.signed_   = OMFormat::is_signed(v[0]);\n    chunk_header.float_    = OMFormat::is_float(v[0]);\n    chunk_header.dim_      = OMFormat::dim(v);\n    chunk_header.bits_     = OMFormat::bits(v[0]);\n\n    bytes += store( _os, chunk_header, swap );\n    for (i=0, nV=header.n_vertices_; i<nV; ++i)\n      bytes += vector_store( _os, _be.point(VertexHandle(i)), swap );\n  }\n\n\n  // ---------- write vertex normal\n  if (_be.n_vertices() && _opt.check( Options::VertexNormal ))\n  {\n    Vec3f n = _be.normal(VertexHandle(0));\n\n    chunk_header.name_     = false;\n    chunk_header.entity_   = OMFormat::Chunk::Entity_Vertex;\n    chunk_header.type_     = OMFormat::Chunk::Type_Normal;\n    chunk_header.signed_   = OMFormat::is_signed(n[0]);\n    chunk_header.float_    = OMFormat::is_float(n[0]);\n    chunk_header.dim_      = OMFormat::dim(n);\n    chunk_header.bits_     = OMFormat::bits(n[0]);\n\n    bytes += store( _os, chunk_header, swap );\n    for (i=0, nV=header.n_vertices_; i<nV; ++i)\n      bytes += vector_store( _os, _be.normal(VertexHandle(i)), swap );\n  }\n\n  // ---------- write vertex color\n  if (_opt.check( Options::VertexColor ) && _be.has_vertex_colors() )\n  {\n    Vec3uc c = _be.color(VertexHandle(0));\n\n    chunk_header.name_     = false;\n    chunk_header.entity_   = OMFormat::Chunk::Entity_Vertex;\n    chunk_header.type_     = OMFormat::Chunk::Type_Color;\n    chunk_header.signed_   = OMFormat::is_signed( c[0] );\n    chunk_header.float_    = OMFormat::is_float( c[0] );\n    chunk_header.dim_      = OMFormat::dim( c );\n    chunk_header.bits_     = OMFormat::bits( c[0] );\n\n    bytes += store( _os, chunk_header, swap );\n    for (i=0, nV=header.n_vertices_; i<nV; ++i)\n      bytes += vector_store( _os, _be.color(VertexHandle(i)), swap );\n  }\n\n  // ---------- write vertex texture coords\n  if (_be.n_vertices() && _opt.check(Options::VertexTexCoord)) {\n\n    t = _be.texcoord(VertexHandle(0));\n\n    chunk_header.name_ = false;\n    chunk_header.entity_ = OMFormat::Chunk::Entity_Vertex;\n    chunk_header.type_ = OMFormat::Chunk::Type_Texcoord;\n    chunk_header.signed_ = OMFormat::is_signed(t[0]);\n    chunk_header.float_ = OMFormat::is_float(t[0]);\n    chunk_header.dim_ = OMFormat::dim(t);\n    chunk_header.bits_ = OMFormat::bits(t[0]);\n\n    // std::clog << chunk_header << std::endl;\n    bytes += store(_os, chunk_header, swap);\n\n    for (i = 0, nV = header.n_vertices_; i < nV; ++i)\n      bytes += vector_store(_os, _be.texcoord(VertexHandle(i)), swap);\n\n  }\n\n  // -------------------- write face data\n\n  // ---------- write topology\n  {\n    chunk_header.name_     = false;\n    chunk_header.entity_   = OMFormat::Chunk::Entity_Face;\n    chunk_header.type_     = OMFormat::Chunk::Type_Topology;\n    chunk_header.signed_   = 0;\n    chunk_header.float_    = 0;\n    chunk_header.dim_      = OMFormat::Chunk::Dim_1D; // ignored\n    chunk_header.bits_     = OMFormat::needed_bits(_be.n_vertices());\n\n    bytes += store( _os, chunk_header, swap );\n\n    for (i=0, nF=header.n_faces_; i<nF; ++i)\n    {\n      nV = _be.get_vhandles(FaceHandle(i), vhandles);\n      if ( header.mesh_ == 'P' )\n        bytes += store( _os, vhandles.size(), OMFormat::Chunk::Integer_16, swap );\n\n      for (size_t j=0; j < vhandles.size(); ++j)\n      {\n        using namespace OMFormat;\n        using namespace GenProg;\n\n        bytes += store( _os, vhandles[j].idx(), Chunk::Integer_Size(chunk_header.bits_), swap );\n      }\n    }\n  }\n\n  // ---------- write face normals\n\n  if ( _be.has_face_normals() && _opt.check(Options::FaceNormal) )\n  {\n#define NEW_STYLE 0\n#if NEW_STYLE\n    const BaseProperty *bp = _be.kernel()._get_fprop(\"f:normals\");\n\n    if (bp)\n    {\n#endif\n      Vec3f n = _be.normal(FaceHandle(0));\n\n      chunk_header.name_     = false;\n      chunk_header.entity_   = OMFormat::Chunk::Entity_Face;\n      chunk_header.type_     = OMFormat::Chunk::Type_Normal;\n      chunk_header.signed_   = OMFormat::is_signed(n[0]);\n      chunk_header.float_    = OMFormat::is_float(n[0]);\n      chunk_header.dim_      = OMFormat::dim(n);\n      chunk_header.bits_     = OMFormat::bits(n[0]);\n\n      bytes += store( _os, chunk_header, swap );\n#if !NEW_STYLE\n      for (i=0, nF=header.n_faces_; i<nF; ++i)\n        bytes += vector_store( _os, _be.normal(FaceHandle(i)), swap );\n#else\n      bytes += bp->store(_os, swap );\n    }\n    else\n      return false;\n#endif\n#undef NEW_STYLE\n  }\n\n\n  // ---------- write face color\n\n  if (_be.has_face_colors() && _opt.check( Options::FaceColor ))\n  {\n#define NEW_STYLE 0\n#if NEW_STYLE\n    const BaseProperty *bp = _be.kernel()._get_fprop(\"f:colors\");\n\n    if (bp)\n    {\n#endif\n      Vec3uc c;\n\n      chunk_header.name_     = false;\n      chunk_header.entity_   = OMFormat::Chunk::Entity_Face;\n      chunk_header.type_     = OMFormat::Chunk::Type_Color;\n      chunk_header.signed_   = OMFormat::is_signed( c[0] );\n      chunk_header.float_    = OMFormat::is_float( c[0] );\n      chunk_header.dim_      = OMFormat::dim( c );\n      chunk_header.bits_     = OMFormat::bits( c[0] );\n\n      bytes += store( _os, chunk_header, swap );\n#if !NEW_STYLE\n      for (i=0, nF=header.n_faces_; i<nF; ++i)\n        bytes += vector_store( _os, _be.color(FaceHandle(i)), swap );\n#else\n      bytes += bp->store(_os, swap);\n    }\n    else\n      return false;\n#endif\n  }\n\n  // -------------------- write custom properties\n\n\n  BaseKernel::const_prop_iterator prop;\n\n  for (prop  = _be.kernel()->vprops_begin();\n       prop != _be.kernel()->vprops_end(); ++prop)\n  {\n    if ( !*prop ) continue;\n    if ( (*prop)->name()[1]==':') continue;\n    bytes += store_binary_custom_chunk(_os, **prop,\n\t\t\t\t       OMFormat::Chunk::Entity_Vertex, swap );\n  }\n  for (prop  = _be.kernel()->fprops_begin();\n       prop != _be.kernel()->fprops_end(); ++prop)\n  {\n    if ( !*prop ) continue;\n    if ( (*prop)->name()[1]==':') continue;\n    bytes += store_binary_custom_chunk(_os, **prop,\n\t\t\t\t       OMFormat::Chunk::Entity_Face, swap );\n  }\n  for (prop  = _be.kernel()->eprops_begin();\n       prop != _be.kernel()->eprops_end(); ++prop)\n  {\n    if ( !*prop ) continue;\n    if ( (*prop)->name()[1]==':') continue;\n    bytes += store_binary_custom_chunk(_os, **prop,\n\t\t\t\t       OMFormat::Chunk::Entity_Edge, swap );\n  }\n  for (prop  = _be.kernel()->hprops_begin();\n       prop != _be.kernel()->hprops_end(); ++prop)\n  {\n    if ( !*prop ) continue;\n    if ( (*prop)->name()[1]==':') continue;\n    bytes += store_binary_custom_chunk(_os, **prop,\n\t\t\t\t       OMFormat::Chunk::Entity_Halfedge, swap );\n  }\n  for (prop  = _be.kernel()->mprops_begin();\n       prop != _be.kernel()->mprops_end(); ++prop)\n  {\n    if ( !*prop ) continue;\n    if ( (*prop)->name()[1]==':') continue;\n    bytes += store_binary_custom_chunk(_os, **prop,\n\t\t\t\t       OMFormat::Chunk::Entity_Mesh, swap );\n  }\n\n  std::clog << \"#bytes written: \" << bytes << std::endl;\n\n  return true;\n}\n\n// ----------------------------------------------------------------------------\n\nsize_t _OMWriter_::store_binary_custom_chunk(std::ostream& _os,\n\t\t\t\t\t     const BaseProperty& _bp,\n\t\t\t\t\t     OMFormat::Chunk::Entity _entity,\n\t\t\t\t\t     bool _swap) const\n{\n  //omlog() << \"Custom Property \" << OMFormat::as_string(_entity) << \" property [\"\n  //\t<< _bp.name() << \"]\" << std::endl;\n\n  // Don't store if\n  // 1. it is not persistent\n  // 2. it's name is empty\n  if ( !_bp.persistent() || _bp.name().empty() )\n  {\n    //omlog() << \"  skipped\\n\";\n    return 0;\n  }\n\n  size_t bytes = 0;\n\n  OMFormat::Chunk::esize_t element_size   = OMFormat::Chunk::esize_t(_bp.element_size());\n  OMFormat::Chunk::Header  chdr;\n\n  // set header\n  chdr.name_     = true;\n  chdr.entity_   = _entity;\n  chdr.type_     = OMFormat::Chunk::Type_Custom;\n  chdr.signed_   = 0;\n  chdr.float_    = 0;\n  chdr.dim_      = OMFormat::Chunk::Dim_1D; // ignored\n  chdr.bits_     = element_size;\n\n\n  // write custom chunk\n\n  // 1. chunk header\n  bytes += store( _os, chdr, _swap );\n\n  // 2. property name\n  bytes += store( _os, OMFormat::Chunk::PropertyName(_bp.name()), _swap );\n\n  // 3. block size\n  bytes += store( _os, _bp.size_of(), OMFormat::Chunk::Integer_32, _swap );\n  //omlog() << \"  n_bytes = \" << _bp.size_of() << std::endl;\n\n  // 4. data\n  {\n    size_t b;\n    bytes += ( b=_bp.store( _os, _swap ) );\n    //omlog() << \"  b       = \" << b << std::endl;\n    assert( b == _bp.size_of() );\n  }\n  return bytes;\n}\n\n// ----------------------------------------------------------------------------\n\nsize_t _OMWriter_::binary_size(BaseExporter& /* _be */, Options /* _opt */) const\n{\n  // std::clog << \"[OMWriter]: binary_size()\" << std::endl;\n  size_t bytes  = sizeof( OMFormat::Header );\n\n  // !!!TODO!!!\n\n  return bytes;\n}\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/writer/OMWriter.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------*\n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         *\n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/\n\n/*===========================================================================*\\\n *                                                                           *\n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  Implements a writer module for OM files\n//\n//=============================================================================\n\n\n#ifndef __OMWRITER_HH__\n#define __OMWRITER_HH__\n\n\n//=== INCLUDES ================================================================\n\n\n// STD C++\n#include <iostream>\n#include <string>\n\n// OpenMesh\n#include <OpenMesh/Core/IO/BinaryHelper.hh>\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/Utils/SingletonT.hh>\n#include <OpenMesh/Core/IO/OMFormat.hh>\n#include <OpenMesh/Core/IO/IOManager.hh>\n#include <OpenMesh/Core/IO/writer/BaseWriter.hh>\n\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\nnamespace IO {\n\n//=== FORWARDS ================================================================\n\n\nclass BaseExporter;\n\n\n//=== IMPLEMENTATION ==========================================================\n\n\n/**\n *  Implementation of the OM format writer. This class is singleton'ed by\n *  SingletonT to OMWriter.\n */\nclass OPENMESHDLLEXPORT _OMWriter_ : public BaseWriter\n{\npublic:\n\n  /// Constructor\n  _OMWriter_();\n\n  /// Destructor\n  virtual ~_OMWriter_() {};\n\n  std::string get_description() const\n  { return \"OpenMesh Format\"; }\n\n  std::string get_extensions() const\n  { return \"om\"; }\n\n  bool write(std::ostream&, BaseExporter&, Options, std::streamsize _precision = 6) const;\n\n\n\n  size_t binary_size(BaseExporter& _be, Options _opt) const;\n\n\nprotected:\n\n  static const OMFormat::uchar magic_[3];\n  static const OMFormat::uint8 version_;\n\n  bool write(const std::string&, BaseExporter&, Options, std::streamsize _precision = 6) const;\n\n  bool write_binary(std::ostream&, BaseExporter&, Options) const;\n\n\n  size_t store_binary_custom_chunk( std::ostream&, const BaseProperty&,\n\t\t\t\t    OMFormat::Chunk::Entity, bool) const;\n};\n\n\n//== TYPE DEFINITION ==========================================================\n\n\n/// Declare the single entity of the OM writer.\nextern _OMWriter_  __OMWriterInstance;\nOPENMESHDLLEXPORT _OMWriter_& OMWriter();\n\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n#endif\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/writer/PLYWriter.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------*\n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         *\n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/\n\n/*===========================================================================*\\\n *                                                                           *\n *   $Revision: 1053 $                                                         *\n *   $Date: 2014-05-09 14:44:18 +0200 (金, 09 5 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//== INCLUDES =================================================================\n\n\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/System/omstream.hh>\n#include <OpenMesh/Core/Utils/Endian.hh>\n#include <OpenMesh/Core/IO/IOManager.hh>\n#include <OpenMesh/Core/IO/BinaryHelper.hh>\n#include <OpenMesh/Core/IO/writer/PLYWriter.hh>\n\n#include <OpenMesh/Core/IO/SR_store.hh>\n\n//=== NAMESPACES ==============================================================\n\n\nnamespace OpenMesh {\nnamespace IO {\n\n\n//=== INSTANCIATE =============================================================\n\n\n// register the PLYLoader singleton with MeshLoader\n_PLYWriter_  __PLYWriterInstance;\n_PLYWriter_& PLYWriter() { return __PLYWriterInstance; }\n\n\n//=== IMPLEMENTATION ==========================================================\n\n\n_PLYWriter_::_PLYWriter_() { IOManager().register_module(this); }\n\n\n//-----------------------------------------------------------------------------\n\n\nbool\n_PLYWriter_::\nwrite(const std::string& _filename, BaseExporter& _be, Options _opt, std::streamsize _precision) const\n{\n  // check exporter features\n  if ( !check( _be, _opt ) )\n    return false;\n\n\n  // check writer features\n  if ( _opt.check(Options::FaceNormal) ) {\n    // Face normals are not supported\n    // Uncheck these options and output message that\n    // they are not written out even though they were requested\n    _opt.unset(Options::FaceNormal);\n    omerr() << \"[PLYWriter] : Warning: Face normals are not supported and thus not exported! \" << std::endl;\n  }\n\n  if ( _opt.check(Options::FaceColor) ) {\n    // Face normals are not supported\n    // Uncheck these options and output message that\n    // they are not written out even though they were requested\n    _opt.unset(Options::FaceColor);\n    omerr() << \"[PLYWriter] : Warning: Face colors are not supported and thus not exported! \" << std::endl;\n  }\n\n  options_ = _opt;\n\n  // open file\n  std::fstream out(_filename.c_str(), (_opt.check(Options::Binary) ? std::ios_base::binary | std::ios_base::out\n                                                         : std::ios_base::out) );\n  if (!out)\n  {\n    omerr() << \"[PLYWriter] : cannot open file \"\n    << _filename\n    << std::endl;\n    return false;\n  }\n\n  if (!_opt.check(Options::Binary))\n    out.precision(_precision);\n\n  // write to file\n  bool result = (_opt.check(Options::Binary) ?\n     write_binary(out, _be, _opt) :\n     write_ascii(out, _be, _opt));\n\n  // return result\n  out.close();\n  return result;\n}\n\n//-----------------------------------------------------------------------------\n\n\nbool\n_PLYWriter_::\nwrite(std::ostream& _os, BaseExporter& _be, Options _opt, std::streamsize _precision) const\n{\n  // check exporter features\n  if ( !check( _be, _opt ) )\n    return false;\n\n\n  // check writer features\n  if ( _opt.check(Options::FaceNormal) || _opt.check(Options::FaceColor) ) // not supported yet\n    return false;\n\n  options_ = _opt;\n\n\n  if (!_os.good())\n  {\n    omerr() << \"[PLYWriter] : cannot write to stream \"\n    << std::endl;\n    return false;\n  }\n\n  if (!_opt.check(Options::Binary))\n    _os.precision(_precision);\n\n  // write to file\n  bool result = (_opt.check(Options::Binary) ?\n     write_binary(_os, _be, _opt) :\n     write_ascii(_os, _be, _opt));\n\n  return result;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nvoid _PLYWriter_::write_header(std::ostream& _out, BaseExporter& _be, Options& _opt) const {\n  //writing header\n  _out << \"ply\" << std::endl;\n\n  if (_opt.is_binary()) {\n    _out << \"format \";\n    if ( options_.check(Options::MSB) )\n      _out << \"binary_big_endian \";\n    else\n      _out << \"binary_little_endian \";\n    _out << \"1.0\" << std::endl;\n  } else\n    _out << \"format ascii 1.0\" << std::endl;\n\n  _out << \"element vertex \" << _be.n_vertices() << std::endl;\n\n  _out << \"property float x\" << std::endl;\n  _out << \"property float y\" << std::endl;\n  _out << \"property float z\" << std::endl;\n\n  if ( _opt.vertex_has_normal() ){\n    _out << \"property float nx\" << std::endl;\n    _out << \"property float ny\" << std::endl;\n    _out << \"property float nz\" << std::endl;\n  }\n\n  if ( _opt.vertex_has_texcoord() ){\n    _out << \"property float u\" << std::endl;\n    _out << \"property float v\" << std::endl;\n  }\n\n  if ( _opt.vertex_has_color() ){\n    if ( _opt.color_is_float() ) {\n      _out << \"property float red\" << std::endl;\n      _out << \"property float green\" << std::endl;\n      _out << \"property float blue\" << std::endl;\n\n      if ( _opt.color_has_alpha() )\n        _out << \"property float alpha\" << std::endl;\n    } else {\n      _out << \"property uchar red\" << std::endl;\n      _out << \"property uchar green\" << std::endl;\n      _out << \"property uchar blue\" << std::endl;\n\n      if ( _opt.color_has_alpha() )\n        _out << \"property uchar alpha\" << std::endl;\n    }\n  }\n\n  _out << \"element face \" << _be.n_faces() << std::endl;\n  _out << \"property list uchar int vertex_indices\" << std::endl;\n  _out << \"end_header\" << std::endl;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nbool\n_PLYWriter_::\nwrite_ascii(std::ostream& _out, BaseExporter& _be, Options _opt) const\n{\n  \n  unsigned int i, nV, nF;\n  Vec3f v, n;\n  OpenMesh::Vec3ui c;\n  OpenMesh::Vec4ui cA;\n  OpenMesh::Vec3f cf;\n  OpenMesh::Vec4f cAf;\n  OpenMesh::Vec2f t;\n  VertexHandle vh;\n  std::vector<VertexHandle> vhandles;\n\n  write_header(_out, _be, _opt);\n\n  if (_opt.color_is_float())\n    _out << std::fixed;\n\n  // vertex data (point, normals, colors, texcoords)\n  for (i=0, nV=int(_be.n_vertices()); i<nV; ++i)\n  {\n    vh = VertexHandle(i);\n    v  = _be.point(vh);\n\n    //Vertex\n    _out << v[0] << \" \" << v[1] << \" \" << v[2];\n\n    // Vertex Normals\n    if ( _opt.vertex_has_normal() ){\n      n = _be.normal(vh);\n      _out << \" \" << n[0] << \" \" << n[1] << \" \" << n[2];\n    }\n\n    // Vertex TexCoords\n    if ( _opt.vertex_has_texcoord() ) {\n    \tt = _be.texcoord(vh);\n    \t_out << \" \" << t[0] << \" \" << t[1];\n    }\n\n    // VertexColor\n    if ( _opt.vertex_has_color() ) {\n      //with alpha\n      if ( _opt.color_has_alpha() ){\n        if (_opt.color_is_float()) {\n          cAf = _be.colorAf(vh);\n          _out << \" \" << cAf;\n        } else {\n          cA  = _be.colorAi(vh);\n          _out << \" \" << cA;\n        }\n      }else{\n        //without alpha\n        if (_opt.color_is_float()) {\n          cf = _be.colorf(vh);\n          _out << \" \" << cf;\n        } else {\n          c  = _be.colori(vh);\n          _out << \" \" << c;\n        }\n      }\n    }\n\n    _out << \"\\n\";\n  }\n\n  // faces (indices starting at 0)\n  if (_be.is_triangle_mesh())\n  {\n    for (i=0, nF=int(_be.n_faces()); i<nF; ++i)\n    {\n      _be.get_vhandles(FaceHandle(i), vhandles);\n      _out << 3 << \" \";\n      _out << vhandles[0].idx()  << \" \";\n      _out << vhandles[1].idx()  << \" \";\n      _out << vhandles[2].idx();\n\n//       //face color\n//       if ( _opt.face_has_color() ){\n//         //with alpha\n//         if ( _opt.color_has_alpha() ){\n//           cA  = _be.colorA( FaceHandle(i) );\n//           _out << \" \" << cA[0] << \" \" << cA[1] << \" \" << cA[2] << \" \" << cA[3];\n//         }else{\n//           //without alpha\n//           c  = _be.color( FaceHandle(i) );\n//           _out << \" \" << c[0] << \" \" << c[1] << \" \" << c[2];\n//         }\n//       }\n      _out << \"\\n\";\n    }\n  }\n  else\n  {\n    for (i=0, nF=int(_be.n_faces()); i<nF; ++i)\n    {\n      nV = _be.get_vhandles(FaceHandle(i), vhandles);\n      _out << nV << \" \";\n      for (size_t j=0; j<vhandles.size(); ++j)\n         _out << vhandles[j].idx() << \" \";\n\n//       //face color\n//       if ( _opt.face_has_color() ){\n//         //with alpha\n//         if ( _opt.color_has_alpha() ){\n//           cA  = _be.colorA( FaceHandle(i) );\n//           _out << cA[0] << \" \" << cA[1] << \" \" << cA[2] << \" \" << cA[3];\n//         }else{\n//           //without alpha\n//           c  = _be.color( FaceHandle(i) );\n//           _out << c[0] << \" \" << c[1] << \" \" << c[2];\n//         }\n//       }\n\n      _out << \"\\n\";\n    }\n  }\n\n\n  return true;\n}\n\n\n//-----------------------------------------------------------------------------\n\nvoid _PLYWriter_::writeValue(ValueType _type, std::ostream& _out, int value) const {\n\n  uint32_t tmp32;\n  uint8_t tmp8;\n\n  switch (_type) {\n    case ValueTypeINT:\n    case ValueTypeINT32:\n      tmp32 = value;\n      store(_out, tmp32, options_.check(Options::MSB) );\n      break;\n//     case ValueTypeUINT8:\ndefault :\n      tmp8 = value;\n      store(_out, tmp8, options_.check(Options::MSB) );\n      break;\n//     default :\n//       std::cerr << \"unsupported conversion type to int: \" << _type << std::endl;\n//       break;\n  }\n}\n\nvoid _PLYWriter_::writeValue(ValueType _type, std::ostream& _out, unsigned int value) const {\n\n  uint32_t tmp32;\n  uint8_t tmp8;\n\n  switch (_type) {\n    case ValueTypeINT:\n    case ValueTypeINT32:\n      tmp32 = value;\n      store(_out, tmp32, options_.check(Options::MSB) );\n      break;\n//     case ValueTypeUINT8:\ndefault :\n      tmp8 = value;\n      store(_out, tmp8, options_.check(Options::MSB) );\n      break;\n//     default :\n//       std::cerr << \"unsupported conversion type to int: \" << _type << std::endl;\n//       break;\n  }\n}\n\nvoid _PLYWriter_::writeValue(ValueType _type, std::ostream& _out, float value) const {\n\n  float32_t tmp;\n\n  switch (_type) {\n    case ValueTypeFLOAT32:\n    case ValueTypeFLOAT:\n      tmp = value;\n      store( _out , tmp, options_.check(Options::MSB) );\n      break;\n    default :\n      std::cerr << \"unsupported conversion type to float: \" << _type << std::endl;\n      break;\n  }\n}\n\nbool\n_PLYWriter_::\nwrite_binary(std::ostream& _out, BaseExporter& _be, Options _opt) const\n{\n  \n  unsigned int i, nV, nF;\n  Vec3f v, n;\n  Vec2f t;\n  OpenMesh::Vec4uc c;\n  OpenMesh::Vec4f cf;\n  VertexHandle vh;\n  std::vector<VertexHandle> vhandles;\n\n  write_header(_out, _be, _opt);\n\n  // vertex data (point, normals, texcoords)\n  for (i=0, nV=int(_be.n_vertices()); i<nV; ++i)\n  {\n    vh = VertexHandle(i);\n    v  = _be.point(vh);\n\n    //vertex\n    writeValue(ValueTypeFLOAT, _out, v[0]);\n    writeValue(ValueTypeFLOAT, _out, v[1]);\n    writeValue(ValueTypeFLOAT, _out, v[2]);\n\n    // Vertex Normal\n    if ( _opt.vertex_has_normal() ){\n      n = _be.normal(vh);\n      writeValue(ValueTypeFLOAT, _out, n[0]);\n      writeValue(ValueTypeFLOAT, _out, n[1]);\n      writeValue(ValueTypeFLOAT, _out, n[2]);\n    }\n\n    // Vertex TexCoords\n    if ( _opt.vertex_has_texcoord() ) {\n    \tt = _be.texcoord(vh);\n    \twriteValue(ValueTypeFLOAT, _out, t[0]);\n    \twriteValue(ValueTypeFLOAT, _out, t[1]);\n    }\n\n    // vertex color\n    if ( _opt.vertex_has_color() ) {\n        if ( _opt.color_is_float() ) {\n          cf  = _be.colorAf(vh);\n          writeValue(ValueTypeFLOAT, _out, cf[0]);\n          writeValue(ValueTypeFLOAT, _out, cf[1]);\n          writeValue(ValueTypeFLOAT, _out, cf[2]);\n\n          if ( _opt.color_has_alpha() )\n            writeValue(ValueTypeFLOAT, _out, cf[3]);\n        } else {\n          c  = _be.colorA(vh);\n          writeValue(ValueTypeUCHAR, _out, (int)c[0]);\n          writeValue(ValueTypeUCHAR, _out, (int)c[1]);\n          writeValue(ValueTypeUCHAR, _out, (int)c[2]);\n\n          if ( _opt.color_has_alpha() )\n            writeValue(ValueTypeUCHAR, _out, (int)c[3]);\n        }\n    }\n  }\n\n  // faces (indices starting at 0)\n  if (_be.is_triangle_mesh())\n  {\n    for (i=0, nF=int(_be.n_faces()); i<nF; ++i)\n    {\n      //face\n      _be.get_vhandles(FaceHandle(i), vhandles);\n      writeValue(ValueTypeUINT8, _out, 3);\n      writeValue(ValueTypeINT32, _out, vhandles[0].idx());\n      writeValue(ValueTypeINT32, _out, vhandles[1].idx());\n      writeValue(ValueTypeINT32, _out, vhandles[2].idx());\n\n//       //face color\n//       if ( _opt.face_has_color() ){\n//         c  = _be.colorA( FaceHandle(i) );\n//         writeValue(_out, c[0]);\n//         writeValue(_out, c[1]);\n//         writeValue(_out, c[2]);\n//\n//         if ( _opt.color_has_alpha() )\n//           writeValue(_out, c[3]);\n//       }\n    }\n  }\n  else\n  {\n    for (i=0, nF=int(_be.n_faces()); i<nF; ++i)\n    {\n      //face\n      nV = _be.get_vhandles(FaceHandle(i), vhandles);\n      writeValue(ValueTypeUINT8, _out, nV);\n      for (size_t j=0; j<vhandles.size(); ++j)\n        writeValue(ValueTypeINT32, _out, vhandles[j].idx() );\n\n//       //face color\n//       if ( _opt.face_has_color() ){\n//         c  = _be.colorA( FaceHandle(i) );\n//         writeValue(_out, c[0]);\n//         writeValue(_out, c[1]);\n//         writeValue(_out, c[2]);\n//\n//         if ( _opt.color_has_alpha() )\n//           writeValue(_out, c[3]);\n//       }\n    }\n  }\n\n  return true;\n}\n\n// ----------------------------------------------------------------------------\n\n\nsize_t\n_PLYWriter_::\nbinary_size(BaseExporter& _be, Options _opt) const\n{\n  size_t header(0);\n  size_t data(0);\n  size_t _3longs(3*sizeof(long));\n  size_t _3floats(3*sizeof(float));\n  size_t _3ui(3*sizeof(unsigned int));\n  size_t _4ui(4*sizeof(unsigned int));\n\n  if ( !_opt.is_binary() )\n    return 0;\n  else\n  {\n    header += 11;                             // 'OFF BINARY\\n'\n    header += _3longs;                        // #V #F #E\n    data   += _be.n_vertices() * _3floats;    // vertex data\n  }\n\n  if ( _opt.vertex_has_normal() && _be.has_vertex_normals() )\n  {\n    header += 1; // N\n    data   += _be.n_vertices() * _3floats;\n  }\n\n  if ( _opt.vertex_has_color() && _be.has_vertex_colors() )\n  {\n    header += 1; // C\n    data   += _be.n_vertices() * _3floats;\n  }\n\n  if ( _opt.vertex_has_texcoord() && _be.has_vertex_texcoords() )\n  {\n    size_t _2floats(2*sizeof(float));\n    header += 2; // ST\n    data   += _be.n_vertices() * _2floats;\n  }\n\n  // topology\n  if (_be.is_triangle_mesh())\n  {\n    data += _be.n_faces() * _4ui;\n  }\n  else\n  {\n    unsigned int i, nF;\n    std::vector<VertexHandle> vhandles;\n\n    for (i=0, nF=int(_be.n_faces()); i<nF; ++i)\n    {\n      data += _be.get_vhandles(FaceHandle(i), vhandles) * sizeof(unsigned int);\n\n    }\n  }\n\n  // face colors\n  if ( _opt.face_has_color() && _be.has_face_colors() ){\n    if ( _opt.color_has_alpha() )\n      data += _be.n_faces() * _4ui;\n    else\n      data += _be.n_faces() * _3ui;\n  }\n\n  return header+data;\n}\n\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/writer/PLYWriter.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------*\n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         *\n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/\n\n/*===========================================================================*\\\n *                                                                           *\n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  Implements a writer module for PLY files\n//\n//=============================================================================\n\n\n#ifndef __PLYWRITER_HH__\n#define __PLYWRITER_HH__\n\n\n//=== INCLUDES ================================================================\n\n\n#include <stdio.h>\n#include <string>\n#include <fstream>\n\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/Utils/SingletonT.hh>\n#include <OpenMesh/Core/IO/exporter/BaseExporter.hh>\n#include <OpenMesh/Core/IO/writer/BaseWriter.hh>\n\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\nnamespace IO {\n\n\n//=== IMPLEMENTATION ==========================================================\n\n\n/**\n    Implementation of the PLY format writer. This class is singleton'ed by\n    SingletonT to PLYWriter.\n\n    currently supported options:\n    - VertexColors\n    - Binary\n    - Binary -> MSB\n*/\nclass OPENMESHDLLEXPORT _PLYWriter_ : public BaseWriter\n{\npublic:\n\n  _PLYWriter_();\n\n  /// Destructor\n  virtual ~_PLYWriter_() {};\n\n  std::string get_description() const { return \"PLY polygon file format\"; }\n  std::string get_extensions() const  { return \"ply\"; }\n\n  bool write(const std::string&, BaseExporter&, Options, std::streamsize _precision = 6) const;\n\n  bool write(std::ostream&, BaseExporter&, Options, std::streamsize _precision = 6) const;\n\n  size_t binary_size(BaseExporter& _be, Options _opt) const;\n\n  enum ValueType {\n    Unsupported ,\n    ValueTypeFLOAT32, ValueTypeFLOAT,\n    ValueTypeUINT8, ValueTypeINT32, ValueTypeINT ,\n    ValueTypeUCHAR\n  };\n\nprivate:\n  mutable Options options_;\n\nprotected:\n  void writeValue(ValueType _type, std::ostream& _out, int value) const;\n  void writeValue(ValueType _type, std::ostream& _out, unsigned int value) const;\n  void writeValue(ValueType _type, std::ostream& _out, float value) const;\n\n  bool write_ascii(std::ostream& _out, BaseExporter&, Options) const;\n  bool write_binary(std::ostream& _out, BaseExporter&, Options) const;\n  void write_header(std::ostream& _out, BaseExporter& _be, Options& _opt) const;\n};\n\n\n//== TYPE DEFINITION ==========================================================\n\n\n/// Declare the single entity of the PLY writer.\nextern _PLYWriter_  __PLYWriterInstance;\nOPENMESHDLLEXPORT _PLYWriter_& PLYWriter();\n\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n#endif\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/writer/STLWriter.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------*\n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         *\n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/\n\n/*===========================================================================*\\\n *                                                                           *\n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//== INCLUDES =================================================================\n\n\n//STL\n#include <fstream>\n\n// OpenMesh\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/System/omstream.hh>\n#include <OpenMesh/Core/Geometry/VectorT.hh>\n#include <OpenMesh/Core/IO/BinaryHelper.hh>\n#include <OpenMesh/Core/IO/IOManager.hh>\n#include <OpenMesh/Core/IO/writer/STLWriter.hh>\n\n//=== NAMESPACES ==============================================================\n\n\nnamespace OpenMesh {\nnamespace IO {\n\n\n//=== INSTANCIATE =============================================================\n\n\n_STLWriter_  __STLWriterInstance;\n_STLWriter_& STLWriter() { return __STLWriterInstance; }\n\n\n//=== IMPLEMENTATION ==========================================================\n\n\n_STLWriter_::_STLWriter_() { IOManager().register_module(this); }\n\n\n//-----------------------------------------------------------------------------\n\n\nbool\n_STLWriter_::\nwrite(const std::string& _filename, BaseExporter& _be, Options _opt, std::streamsize _precision) const\n{\n  // binary or ascii ?\n  if (_filename.rfind(\".stla\") != std::string::npos)\n  {\n    _opt -= Options::Binary;\n  }\n  else if (_filename.rfind(\".stlb\") != std::string::npos)\n  {\n    _opt += Options::Binary;\n  }\n\n  // open file\n  std::fstream out(_filename.c_str(), (_opt.check(Options::Binary) ? std::ios_base::binary | std::ios_base::out\n                                                                   : std::ios_base::out) );\n\n  bool result = write(out, _be, _opt, _precision);\n\n  out.close();\n\n  return result;\n}\n\n//-----------------------------------------------------------------------------\n\n\nbool\n_STLWriter_::\nwrite(std::ostream& _os, BaseExporter& _be, Options _opt, std::streamsize _precision) const\n{\n  // check exporter features\n  if (!check(_be, _opt)) return false;\n\n  // check writer features\n  if (_opt.check(Options::VertexNormal)   ||\n      _opt.check(Options::VertexTexCoord) ||\n      _opt.check(Options::FaceColor))\n    return false;\n\n  if (!_opt.check(Options::Binary))\n    _os.precision(_precision);\n\n  if (_opt & Options::Binary)\n    return write_stlb(_os, _be, _opt);\n  else\n    return write_stla(_os, _be, _opt);\n\n  return false;\n}\n\n\n\n//-----------------------------------------------------------------------------\n\n\nbool\n_STLWriter_::\nwrite_stla(const std::string& _filename, BaseExporter& _be, Options /* _opt */) const\n{\n  omlog() << \"[STLWriter] : write ascii file\\n\";\n\n\n  // open file\n  FILE* out = fopen(_filename.c_str(), \"w\");\n  if (!out)\n  {\n    omerr() << \"[STLWriter] : cannot open file \" << _filename << std::endl;\n    return false;\n  }\n\n\n\n\n  int i, nF(int(_be.n_faces())), nV;\n  Vec3f  a, b, c, n;\n  std::vector<VertexHandle> vhandles;\n  FaceHandle fh;\n\n\n  // header\n  fprintf(out, \"solid\\n\");\n\n\n  // write face set\n  for (i=0; i<nF; ++i)\n  {\n    fh = FaceHandle(i);\n    nV = _be.get_vhandles(fh, vhandles);\n\n    if (nV == 3)\n    {\n      a = _be.point(vhandles[0]);\n      b = _be.point(vhandles[1]);\n      c = _be.point(vhandles[2]);\n      n = (_be.has_face_normals() ?\n     _be.normal(fh) :\n     ((c-b) % (a-b)).normalize());\n\n      fprintf(out, \"facet normal %f %f %f\\nouter loop\\n\", n[0], n[1], n[2]);\n      fprintf(out, \"vertex %.10f %.10f %.10f\\n\", a[0], a[1], a[2]);\n      fprintf(out, \"vertex %.10f %.10f %.10f\\n\", b[0], b[1], b[2]);\n      fprintf(out, \"vertex %.10f %.10f %.10f\",   c[0], c[1], c[2]);\n    }\n    else\n      omerr() << \"[STLWriter] : Warning non-triangle data!\\n\";\n\n    fprintf(out, \"\\nendloop\\nendfacet\\n\");\n  }\n\n  fprintf(out, \"endsolid\\n\");\n\n  fclose(out);\n\n  return true;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nbool\n_STLWriter_::\nwrite_stla(std::ostream& _out, BaseExporter& _be, Options /* _opt */, std::streamsize _precision) const\n{\n  omlog() << \"[STLWriter] : write ascii file\\n\";\n\n  int i, nF(int(_be.n_faces())), nV;\n  Vec3f  a, b, c, n;\n  std::vector<VertexHandle> vhandles;\n  FaceHandle fh;\n  _out.precision(_precision);\n\n\n  // header\n  _out << \"solid\\n\";\n\n\n  // write face set\n  for (i=0; i<nF; ++i)\n  {\n    fh = FaceHandle(i);\n    nV = _be.get_vhandles(fh, vhandles);\n\n    if (nV == 3)\n    {\n      a = _be.point(vhandles[0]);\n      b = _be.point(vhandles[1]);\n      c = _be.point(vhandles[2]);\n      n = (_be.has_face_normals() ?\n     _be.normal(fh) :\n     ((c-b) % (a-b)).normalize());\n\n      _out << \"facet normal \" << n[0] << \" \" << n[1] << \" \" << n[2] << \"\\nouter loop\\n\";\n      _out.precision(10);\n      _out << \"vertex \" << a[0] << \" \" << a[1] << \" \" << a[2] << \"\\n\";\n      _out << \"vertex \" << b[0] << \" \" << b[1] << \" \" << b[2] << \"\\n\";\n      _out << \"vertex \" << c[0] << \" \" << c[1] << \" \" << c[2] << \"\\n\";\n    } else {\n      omerr() << \"[STLWriter] : Warning non-triangle data!\\n\";\n    }\n\n    _out << \"\\nendloop\\nendfacet\\n\";\n  }\n\n  _out << \"endsolid\\n\";\n\n  return true;\n}\n\n//-----------------------------------------------------------------------------\n\n\nbool\n_STLWriter_::\nwrite_stlb(const std::string& _filename, BaseExporter& _be, Options /* _opt */) const\n{\n  omlog() << \"[STLWriter] : write binary file\\n\";\n\n\n  // open file\n  FILE* out = fopen(_filename.c_str(), \"wb\");\n  if (!out)\n  {\n    omerr() << \"[STLWriter] : cannot open file \" << _filename << std::endl;\n    return false;\n  }\n\n\n  int i, nF(int(_be.n_faces())), nV;\n  Vec3f  a, b, c, n;\n  std::vector<VertexHandle> vhandles;\n  FaceHandle fh;\n\n\n   // write header\n  const char header[80] =\n    \"binary stl file\"\n    \"                                                                \";\n  fwrite(header, 1, 80, out);\n\n\n  // number of faces\n  write_int( int(_be.n_faces()), out);\n\n\n  // write face set\n  for (i=0; i<nF; ++i)\n  {\n    fh = FaceHandle(i);\n    nV = _be.get_vhandles(fh, vhandles);\n\n    if (nV == 3)\n    {\n      a = _be.point(vhandles[0]);\n      b = _be.point(vhandles[1]);\n      c = _be.point(vhandles[2]);\n      n = (_be.has_face_normals() ?\n     _be.normal(fh) :\n     ((c-b) % (a-b)).normalize());\n\n      // face normal\n      write_float(n[0], out);\n      write_float(n[1], out);\n      write_float(n[2], out);\n\n      // face vertices\n      write_float(a[0], out);\n      write_float(a[1], out);\n      write_float(a[2], out);\n\n      write_float(b[0], out);\n      write_float(b[1], out);\n      write_float(b[2], out);\n\n      write_float(c[0], out);\n      write_float(c[1], out);\n      write_float(c[2], out);\n\n      // space filler\n      write_short(0, out);\n    }\n    else\n      omerr() << \"[STLWriter] : Warning: Skipped non-triangle data!\\n\";\n  }\n\n\n  fclose(out);\n  return true;\n}\n\n//-----------------------------------------------------------------------------\n\nbool\n_STLWriter_::\nwrite_stlb(std::ostream& _out, BaseExporter& _be, Options /* _opt */, std::streamsize _precision) const\n{\n  omlog() << \"[STLWriter] : write binary file\\n\";\n\n\n  int i, nF(int(_be.n_faces())), nV;\n  Vec3f  a, b, c, n;\n  std::vector<VertexHandle> vhandles;\n  FaceHandle fh;\n  _out.precision(_precision);\n\n\n   // write header\n  const char header[80] =\n    \"binary stl file\"\n    \"                                                                \";\n  _out.write(header, 80);\n\n\n  // number of faces\n  write_int(int(_be.n_faces()), _out);\n\n\n  // write face set\n  for (i=0; i<nF; ++i)\n  {\n    fh = FaceHandle(i);\n    nV = _be.get_vhandles(fh, vhandles);\n\n    if (nV == 3)\n    {\n      a = _be.point(vhandles[0]);\n      b = _be.point(vhandles[1]);\n      c = _be.point(vhandles[2]);\n      n = (_be.has_face_normals() ?\n     _be.normal(fh) :\n     ((c-b) % (a-b)).normalize());\n\n      // face normal\n      write_float(n[0], _out);\n      write_float(n[1], _out);\n      write_float(n[2], _out);\n\n      // face vertices\n      write_float(a[0], _out);\n      write_float(a[1], _out);\n      write_float(a[2], _out);\n\n      write_float(b[0], _out);\n      write_float(b[1], _out);\n      write_float(b[2], _out);\n\n      write_float(c[0], _out);\n      write_float(c[1], _out);\n      write_float(c[2], _out);\n\n      // space filler\n      write_short(0, _out);\n    }\n    else\n      omerr() << \"[STLWriter] : Warning: Skipped non-triangle data!\\n\";\n  }\n\n\n  return true;\n}\n\n\n//-----------------------------------------------------------------------------\n\n\nsize_t\n_STLWriter_::\nbinary_size(BaseExporter& _be, Options /* _opt */) const\n{\n  size_t bytes(0);\n  size_t _12floats(12*sizeof(float));\n\n  bytes += 80; // header\n  bytes += 4;  // #faces\n\n\n  int i, nF(int(_be.n_faces()));\n  std::vector<VertexHandle> vhandles;\n\n  for (i=0; i<nF; ++i)\n    if (_be.get_vhandles(FaceHandle(i), vhandles) == 3)\n      bytes += _12floats + sizeof(short);\n    else\n      omerr() << \"[STLWriter] : Warning: Skipped non-triangle data!\\n\";\n\n  return bytes;\n}\n\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/writer/STLWriter.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------*\n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         *\n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/\n\n/*===========================================================================*\\\n *                                                                           *\n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  Implements a writer module for STL ascii files\n//\n//=============================================================================\n// $Id: STLWriter.hh,v 1.2 2007-05-18 15:17:43 habbecke Exp $\n\n#ifndef __STLWRITER_HH__\n#define __STLWRITER_HH__\n\n\n//=== INCLUDES ================================================================\n\n// -------------------- STL\n#if defined( OM_CC_MIPS )\n#  include <stdio.h>\n#else\n#  include <cstdio>\n#endif\n#include <string>\n// -------------------- OpenMesh\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/Utils/SingletonT.hh>\n#include <OpenMesh/Core/IO/exporter/BaseExporter.hh>\n#include <OpenMesh/Core/IO/writer/BaseWriter.hh>\n\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\nnamespace IO {\n\n\n//=== IMPLEMENTATION ==========================================================\n\n\n/**\n    Implementation of the STL format writer. This class is singleton'ed by\n    SingletonT to STLWriter.\n*/\nclass OPENMESHDLLEXPORT _STLWriter_ : public BaseWriter\n{\npublic:\n\n  _STLWriter_();\n\n  /// Destructor\n  virtual ~_STLWriter_() {};\n\n  std::string get_description() const { return \"Stereolithography Format\"; }\n  std::string get_extensions()  const { return \"stla stlb\"; }\n\n  bool write(const std::string&, BaseExporter&, Options, std::streamsize _precision = 6) const;\n\n  bool write(std::ostream&, BaseExporter&, Options, std::streamsize _precision = 6) const;\n\n  size_t binary_size(BaseExporter&, Options) const;\n\nprivate:\n  bool write_stla(const std::string&, BaseExporter&, Options) const;\n  bool write_stla(std::ostream&, BaseExporter&, Options, std::streamsize _precision = 6) const;\n  bool write_stlb(const std::string&, BaseExporter&, Options) const;\n  bool write_stlb(std::ostream&, BaseExporter&, Options, std::streamsize _precision = 6) const;\n};\n\n\n//== TYPE DEFINITION ==========================================================\n\n\n// Declare the single entity of STL writer.\nextern _STLWriter_  __STLWriterInstance;\nOPENMESHDLLEXPORT _STLWriter_& STLWriter();\n\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n#endif\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/writer/VTKWriter.cc",
    "content": "//== INCLUDES =================================================================\n\n#include <fstream>\n#include <limits>\n\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/IO/BinaryHelper.hh>\n#include <OpenMesh/Core/IO/writer/VTKWriter.hh>\n#include <OpenMesh/Core/IO/IOManager.hh>\n#include <OpenMesh/Core/System/omstream.hh>\n#include <OpenMesh/Core/Utils/color_cast.hh>\n\n//=== NAMESPACES ==============================================================\n\nnamespace OpenMesh {\nnamespace IO {\n\n//=== INSTANTIATE =============================================================\n\n_VTKWriter_  __VTKWriterinstance;\n_VTKWriter_& VTKWriter() { return __VTKWriterinstance; }\n\n//=== IMPLEMENTATION ==========================================================\n\n_VTKWriter_::_VTKWriter_() { IOManager().register_module(this); }\n\n//-----------------------------------------------------------------------------\n\nbool _VTKWriter_::write(const std::string& _filename, BaseExporter& _be, Options _opt, std::streamsize _precision) const\n{\n    std::ofstream out(_filename.c_str());\n\n    if (!out) {\n        omerr() << \"[VTKWriter] : cannot open file \" << _filename << std::endl;\n        return false;\n    }\n\n    return write(out, _be, _opt, _precision);\n}\n\n//-----------------------------------------------------------------------------\n\nbool _VTKWriter_::write(std::ostream& _out, BaseExporter& _be, Options _opt, std::streamsize _precision) const\n{\n    Vec3f v, n;\n    Vec2f t;\n    VertexHandle vh;\n    OpenMesh::Vec3f c;\n    OpenMesh::Vec4f cA;\n\n    // check exporter features\n    if (!check(_be, _opt)) {\n        return false;\n    }\n\n    // check writer features\n    if (!_opt.is_empty()) {\n        omlog() << \"[VTKWriter] : writer does not support any options\\n\";\n        return false;\n    }\n\n    omlog() << \"[VTKWriter] : write file\\n\";\n    _out.precision(_precision);\n\n    std::vector<VertexHandle> vhandles;\n    size_t polygon_table_size = 0;\n    size_t nf = _be.n_faces();\n    for (size_t i = 0; i < nf; ++i) {\n        polygon_table_size += _be.get_vhandles(FaceHandle(int(i)), vhandles);\n    }\n    polygon_table_size += nf;\n\n    // header\n    _out << \"# vtk DataFile Version 3.0\\n\";\n    _out << \"Generated by OpenMesh\\n\";\n    _out << \"ASCII\\n\";\n    _out << \"DATASET POLYDATA\\n\";\n\n    // points\n    _out << \"POINTS \" << _be.n_vertices() << \" float\\n\";\n    size_t nv = _be.n_vertices();\n    for (size_t i = 0; i < nv; ++i) {\n        Vec3f v = _be.point(VertexHandle(int(i)));\n        _out << v[0] << ' ' << v[1] << ' ' << v[2] << std::endl;\n    }\n\n    // faces\n    _out << \"POLYGONS \" << nf << ' ' << polygon_table_size << std::endl;\n    for (size_t i = 0; i < nf; ++i) {\n        _be.get_vhandles(FaceHandle(int(i)), vhandles);\n\n        _out << vhandles.size() << ' ';\n        for (size_t j = 0; j < vhandles.size(); ++j) {\n            _out << \" \" << vhandles[j].idx();\n        }\n        _out << std::endl;\n    }\n\n    return true;\n}\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/IO/writer/VTKWriter.hh",
    "content": "//=============================================================================\n//\n//  Implements an IOManager writer module for VTK files\n//\n//=============================================================================\n\n#ifndef __VTKWRITER_HH__\n#define __VTKWRITER_HH__\n\n//=== INCLUDES ================================================================\n\n#include <string>\n#include <fstream>\n\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/Utils/SingletonT.hh>\n#include <OpenMesh/Core/IO/exporter/BaseExporter.hh>\n#include <OpenMesh/Core/IO/writer/BaseWriter.hh>\n\n//== NAMESPACES ===============================================================\n\nnamespace OpenMesh {\nnamespace IO {\n\n//=== IMPLEMENTATION ==========================================================\n\nclass OPENMESHDLLEXPORT _VTKWriter_ : public BaseWriter\n{\npublic:\n    _VTKWriter_();\n\n    std::string get_description() const { return \"VTK\"; }\n    std::string get_extensions()  const { return \"vtk\"; }\n\n    bool write(const std::string&, BaseExporter&, Options, std::streamsize _precision = 6) const;\n    bool write(std::ostream&, BaseExporter&, Options, std::streamsize _precision = 6) const;\n\n    size_t binary_size(BaseExporter&, Options) const { return 0; }\n};\n\n//== TYPE DEFINITION ==========================================================\n\n/// Declare the single entity of the OBJ writer\nextern _VTKWriter_  __VTKWriterinstance;\nOPENMESHDLLEXPORT _VTKWriter_& VTKWriter();\n\n//=============================================================================\n} // namespace IO\n} // namespace OpenMesh\n//=============================================================================\n#endif\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Mesh/ArrayItems.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n#ifndef OPENMESH_ARRAY_ITEMS_HH\n#define OPENMESH_ARRAY_ITEMS_HH\n\n\n//== INCLUDES =================================================================\n\n\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/Utils/GenProg.hh>\n#include <OpenMesh/Core/Mesh/Handles.hh>\n\n\n//== NAMESPACES ===============================================================\n\nnamespace OpenMesh {\n\n\n//== CLASS DEFINITION =========================================================\n\n\n/// Definition of mesh items for use in the ArrayKernel\nstruct ArrayItems\n{\n\n  //------------------------------------------------------ internal vertex type\n\n  /// The vertex item\n  class Vertex\n  {\n    friend class ArrayKernel;\n    HalfedgeHandle  halfedge_handle_;\n  };\n\n\n  //---------------------------------------------------- internal halfedge type\n\n#ifndef DOXY_IGNORE_THIS\n  class Halfedge_without_prev\n  {\n    friend class ArrayKernel;\n    FaceHandle      face_handle_;\n    VertexHandle    vertex_handle_;\n    HalfedgeHandle  next_halfedge_handle_;\n  };\n#endif\n\n#ifndef DOXY_IGNORE_THIS\n  class Halfedge_with_prev : public Halfedge_without_prev\n  {\n    friend class ArrayKernel;\n    HalfedgeHandle  prev_halfedge_handle_;\n  };\n#endif\n\n  //TODO: should be selected with config.h define\n  typedef Halfedge_with_prev                Halfedge;\n  typedef GenProg::Bool2Type<true>          HasPrevHalfedge;\n\n  //-------------------------------------------------------- internal edge type\n#ifndef DOXY_IGNORE_THIS\n  class Edge\n  {\n    friend class ArrayKernel;\n    Halfedge  halfedges_[2];\n  };\n#endif\n\n  //-------------------------------------------------------- internal face type\n#ifndef DOXY_IGNORE_THIS\n  class Face\n  {\n    friend class ArrayKernel;\n    HalfedgeHandle  halfedge_handle_;\n  };\n};\n#endif\n\n//=============================================================================\n} // namespace OpenMesh\n//=============================================================================\n#endif // OPENMESH_ITEMS_HH defined\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Mesh/ArrayKernel.cc",
    "content": "/*===========================================================================*\\\r\n *                                                                           *\r\n *                               OpenMesh                                    *\r\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\r\n *                           www.openmesh.org                                *\r\n *                                                                           *\r\n *---------------------------------------------------------------------------* \r\n *  This file is part of OpenMesh.                                           *\r\n *                                                                           *\r\n *  OpenMesh is free software: you can redistribute it and/or modify         * \r\n *  it under the terms of the GNU Lesser General Public License as           *\r\n *  published by the Free Software Foundation, either version 3 of           *\r\n *  the License, or (at your option) any later version with the              *\r\n *  following exceptions:                                                    *\r\n *                                                                           *\r\n *  If other files instantiate templates or use macros                       *\r\n *  or inline functions from this file, or you compile this file and         *\r\n *  link it with other files to produce an executable, this file does        *\r\n *  not by itself cause the resulting executable to be covered by the        *\r\n *  GNU Lesser General Public License. This exception does not however       *\r\n *  invalidate any other reasons why the executable file might be            *\r\n *  covered by the GNU Lesser General Public License.                        *\r\n *                                                                           *\r\n *  OpenMesh is distributed in the hope that it will be useful,              *\r\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of           *\r\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            *\r\n *  GNU Lesser General Public License for more details.                      *\r\n *                                                                           *\r\n *  You should have received a copy of the GNU LesserGeneral Public          *\r\n *  License along with OpenMesh.  If not,                                    *\r\n *  see <http://www.gnu.org/licenses/>.                                      *\r\n *                                                                           *\r\n\\*===========================================================================*/ \r\n\r\n/*===========================================================================*\\\r\n *                                                                           *             \r\n *   $Revision: 990 $                                                         *\r\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\r\n *                                                                           *\r\n\\*===========================================================================*/\r\n\r\n#include <OpenMesh/Core/Mesh/ArrayKernel.hh>\r\n\r\nnamespace OpenMesh\r\n{\r\n\r\nArrayKernel::ArrayKernel()\r\n: refcount_vstatus_(0), refcount_hstatus_(0),\r\n  refcount_estatus_(0), refcount_fstatus_(0)\r\n{\r\n  init_bit_masks(); //Status bit masks initialization\r\n}\r\n\r\nArrayKernel::~ArrayKernel()\r\n{\r\n  clear();\r\n}\r\n\r\n// ArrayKernel::ArrayKernel(const ArrayKernel& _rhs)\r\n// : BaseKernel(_rhs),\r\n//   vertices_(_rhs.vertices_), edges_(_rhs.edges_), faces_(_rhs.faces_),\r\n//   vertex_status_(_rhs.vertex_status_), halfedge_status_(_rhs.halfedge_status_),\r\n//   edge_status_(_rhs.edge_status_), face_status_(_rhs.face_status_),\r\n//   refcount_vstatus_(_rhs.refcount_vstatus_), refcount_hstatus_(_rhs.refcount_hstatus_),\r\n//   refcount_estatus_(_rhs.refcount_estatus_), refcount_fstatus_(_rhs.refcount_fstatus_)\r\n// {}\r\n\r\n\r\nvoid ArrayKernel::assign_connectivity(const ArrayKernel& _other)\r\n{\r\n  vertices_ = _other.vertices_;\r\n  edges_ = _other.edges_;\r\n  faces_ = _other.faces_;\r\n  \r\n  vprops_resize(n_vertices());\r\n  hprops_resize(n_halfedges());\r\n  eprops_resize(n_edges());\r\n  fprops_resize(n_faces());\r\n  \r\n#define COPY_STATUS_PROPERTY(ENTITY) \\\r\n  if (_other.ENTITY##_status_.is_valid()) \\\r\n  {   \\\r\n    if (!ENTITY##_status_.is_valid()) \\\r\n    { \\\r\n      request_##ENTITY##_status(); \\\r\n    } \\\r\n    property(ENTITY##_status_) = _other.property(_other.ENTITY##_status_); \\\r\n  }\r\n  COPY_STATUS_PROPERTY(vertex)\r\n  COPY_STATUS_PROPERTY(halfedge)\r\n  COPY_STATUS_PROPERTY(edge)\r\n  COPY_STATUS_PROPERTY(face)\r\n  \r\n#undef COPY_STATUS_PROPERTY\r\n}\r\n\r\n// --- handle -> item ---\r\nVertexHandle ArrayKernel::handle(const Vertex& _v) const\r\n{\r\n   return VertexHandle( int( &_v - &vertices_.front()));\r\n}\r\n\r\nHalfedgeHandle ArrayKernel::handle(const Halfedge& _he) const\r\n{\r\n  // Calculate edge belonging to given halfedge\r\n  // There are two halfedges stored per edge\r\n  // Get memory position inside edge vector and devide by size of an edge\r\n  // to get the corresponding edge for the requested halfedge\r\n  size_t eh = ( (char*)&_he - (char*)&edges_.front() ) /  sizeof(Edge)  ;\r\n  assert((&_he == &edges_[eh].halfedges_[0]) ||\r\n         (&_he == &edges_[eh].halfedges_[1]));\r\n  return ((&_he == &edges_[eh].halfedges_[0]) ?\r\n                    HalfedgeHandle( int(eh)<<1) : HalfedgeHandle((int(eh)<<1)+1));\r\n}\r\n\r\nEdgeHandle ArrayKernel::handle(const Edge& _e) const\r\n{\r\n  return EdgeHandle( int(&_e - &edges_.front() ) );\r\n}\r\n\r\nFaceHandle ArrayKernel::handle(const Face& _f) const\r\n{\r\n  return FaceHandle( int(&_f - &faces_.front()) );\r\n}\r\n\r\n#define SIGNED(x) signed( (x) )\r\n\r\nbool ArrayKernel::is_valid_handle(VertexHandle _vh) const\r\n{\r\n  return 0 <= _vh.idx() && _vh.idx() < SIGNED(n_vertices());\r\n}\r\n\r\nbool ArrayKernel::is_valid_handle(HalfedgeHandle _heh) const\r\n{\r\n  return 0 <= _heh.idx() && _heh.idx() < SIGNED(n_edges()*2);\r\n}\r\n\r\nbool ArrayKernel::is_valid_handle(EdgeHandle _eh) const\r\n{\r\n  return 0 <= _eh.idx() && _eh.idx() < SIGNED(n_edges());\r\n}\r\n\r\nbool ArrayKernel::is_valid_handle(FaceHandle _fh) const\r\n{\r\n  return 0 <= _fh.idx() && _fh.idx() < SIGNED(n_faces());\r\n}\r\n\r\n#undef SIGNED\r\n\r\nunsigned int ArrayKernel::delete_isolated_vertices()\r\n{\r\n  assert(has_vertex_status());//this function requires vertex status property\r\n  unsigned int n_isolated = 0;\r\n  for (KernelVertexIter v_it = vertices_begin(); v_it != vertices_end(); ++v_it)\r\n  {\r\n    if (is_isolated(handle(*v_it)))\r\n    {\r\n      status(handle(*v_it)).set_deleted(true);\r\n      n_isolated++;\r\n    }\r\n  }\r\n  return n_isolated;\r\n}\r\n\r\nvoid ArrayKernel::garbage_collection(bool _v, bool _e, bool _f)\r\n{\r\n  std::vector<VertexHandle*> empty_vh;\r\n  std::vector<HalfedgeHandle*> empty_hh;\r\n  std::vector<FaceHandle*> empty_fh;\r\n  garbage_collection( empty_vh,empty_hh,empty_fh,_v, _e, _f);\r\n}\r\n\r\nvoid ArrayKernel::clean()\r\n{\r\n\r\n  vertices_.clear();\r\n  VertexContainer().swap( vertices_ );\r\n\r\n  edges_.clear();\r\n  EdgeContainer().swap( edges_ );\r\n\r\n  faces_.clear();\r\n  FaceContainer().swap( faces_ );\r\n\r\n}\r\n\r\n\r\nvoid ArrayKernel::clear()\r\n{\r\n  vprops_clear();\r\n  eprops_clear();\r\n  hprops_clear();\r\n  fprops_clear();\r\n\r\n  clean();\r\n}\r\n\r\n\r\n\r\nvoid ArrayKernel::resize( size_t _n_vertices, size_t _n_edges, size_t _n_faces )\r\n{\r\n  vertices_.resize(_n_vertices);\r\n  edges_.resize(_n_edges);\r\n  faces_.resize(_n_faces);\r\n\r\n  vprops_resize(n_vertices());\r\n  hprops_resize(n_halfedges());\r\n  eprops_resize(n_edges());\r\n  fprops_resize(n_faces());\r\n}\r\n\r\nvoid ArrayKernel::reserve(size_t _n_vertices, size_t _n_edges, size_t _n_faces )\r\n{\r\n  vertices_.reserve(_n_vertices);\r\n  edges_.reserve(_n_edges);\r\n  faces_.reserve(_n_faces);\r\n\r\n  vprops_reserve(_n_vertices);\r\n  hprops_reserve(_n_edges*2);\r\n  eprops_reserve(_n_edges);\r\n  fprops_reserve(_n_faces);\r\n}\r\n\r\n// Status Sets API\r\nvoid ArrayKernel::init_bit_masks(BitMaskContainer& _bmc)\r\n{\r\n  for (unsigned int i = Attributes::UNUSED; i != 0; i <<= 1)\r\n  {\r\n    _bmc.push_back(i);\r\n  }\r\n}\r\n\r\nvoid ArrayKernel::init_bit_masks()\r\n{\r\n  init_bit_masks(vertex_bit_masks_);\r\n  edge_bit_masks_ = vertex_bit_masks_;//init_bit_masks(edge_bit_masks_);\r\n  face_bit_masks_ = vertex_bit_masks_;//init_bit_masks(face_bit_masks_);\r\n  halfedge_bit_masks_= vertex_bit_masks_;//init_bit_masks(halfedge_bit_masks_);\r\n}\r\n\r\n\r\n};\r\n\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Mesh/ArrayKernel.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------*\n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         *\n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/\n\n/*===========================================================================*\\\n *                                                                           *\n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  CLASS ArrayKernel\n//\n//=============================================================================\n\n\n#ifndef OPENMESH_ARRAY_KERNEL_HH\n#define OPENMESH_ARRAY_KERNEL_HH\n\n\n//== INCLUDES =================================================================\n#include <vector>\n\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/Utils/GenProg.hh>\n\n#include <OpenMesh/Core/Mesh/ArrayItems.hh>\n#include <OpenMesh/Core/Mesh/BaseKernel.hh>\n#include <OpenMesh/Core/Mesh/Status.hh>\n\n//== NAMESPACES ===============================================================\nnamespace OpenMesh {\n\n\n//== CLASS DEFINITION =========================================================\n/** \\ingroup mesh_kernels_group\n\n    Mesh kernel using arrays for mesh item storage.\n\n    This mesh kernel uses the std::vector as container to store the\n    mesh items. Therefore all handle types are internally represented\n    by integers. To get the index from a handle use the handle's \\c\n    idx() method.\n\n    \\note For a description of the minimal kernel interface see\n    OpenMesh::Mesh::BaseKernel.\n    \\note You do not have to use this class directly, use the predefined\n    mesh-kernel combinations in \\ref mesh_types_group.\n    \\see OpenMesh::Concepts::KernelT, \\ref mesh_type\n*/\n\nclass OPENMESHDLLEXPORT ArrayKernel : public BaseKernel, public ArrayItems\n{\npublic:\n\n  // handles\n  typedef OpenMesh::VertexHandle            VertexHandle;\n  typedef OpenMesh::HalfedgeHandle          HalfedgeHandle;\n  typedef OpenMesh::EdgeHandle              EdgeHandle;\n  typedef OpenMesh::FaceHandle              FaceHandle;\n  typedef Attributes::StatusInfo            StatusInfo;\n  typedef VPropHandleT<StatusInfo>          VertexStatusPropertyHandle;\n  typedef HPropHandleT<StatusInfo>          HalfedgeStatusPropertyHandle;\n  typedef EPropHandleT<StatusInfo>          EdgeStatusPropertyHandle;\n  typedef FPropHandleT<StatusInfo>          FaceStatusPropertyHandle;\n\npublic:\n\n  // --- constructor/destructor ---\n  ArrayKernel();\n  virtual ~ArrayKernel();\n\n  /** ArrayKernel uses the default copy constructor and assignment operator, which means\n      that the connectivity and all properties are copied, including reference\n      counters, allocated bit status masks, etc.. In contrast assign_connectivity\n      copies only the connectivity, i.e. vertices, edges, faces and their status fields.\n      NOTE: The geometry (the points property) is NOT copied. Poly/TriConnectivity\n      override(and hide) that function to provide connectivity consistence.*/\n  void assign_connectivity(const ArrayKernel& _other);\n\n  // --- handle -> item ---\n  VertexHandle handle(const Vertex& _v) const;\n\n  HalfedgeHandle handle(const Halfedge& _he) const;\n\n  EdgeHandle handle(const Edge& _e) const;\n\n  FaceHandle handle(const Face& _f) const;\n\n\n  ///checks handle validity - useful for debugging\n  bool is_valid_handle(VertexHandle _vh) const;\n\n  ///checks handle validity - useful for debugging\n  bool is_valid_handle(HalfedgeHandle _heh) const;\n\n  ///checks handle validity - useful for debugging\n  bool is_valid_handle(EdgeHandle _eh) const;\n\n  ///checks handle validity - useful for debugging\n  bool is_valid_handle(FaceHandle _fh) const;\n\n\n  // --- item -> handle ---\n  const Vertex& vertex(VertexHandle _vh) const\n  {\n    assert(is_valid_handle(_vh));\n    return vertices_[_vh.idx()];\n  }\n\n  Vertex& vertex(VertexHandle _vh)\n  {\n    assert(is_valid_handle(_vh));\n    return vertices_[_vh.idx()];\n  }\n\n  const Halfedge& halfedge(HalfedgeHandle _heh) const\n  {\n    assert(is_valid_handle(_heh));\n    return edges_[_heh.idx() >> 1].halfedges_[_heh.idx() & 1];\n  }\n\n  Halfedge& halfedge(HalfedgeHandle _heh)\n  {\n    assert(is_valid_handle(_heh));\n    return edges_[_heh.idx() >> 1].halfedges_[_heh.idx() & 1];\n  }\n\n  const Edge& edge(EdgeHandle _eh) const\n  {\n    assert(is_valid_handle(_eh));\n    return edges_[_eh.idx()];\n  }\n\n  Edge& edge(EdgeHandle _eh)\n  {\n    assert(is_valid_handle(_eh));\n    return edges_[_eh.idx()];\n  }\n\n  const Face& face(FaceHandle _fh) const\n  {\n    assert(is_valid_handle(_fh));\n    return faces_[_fh.idx()];\n  }\n\n  Face& face(FaceHandle _fh)\n  {\n    assert(is_valid_handle(_fh));\n    return faces_[_fh.idx()];\n  }\n\n  // --- get i'th items ---\n\n  VertexHandle vertex_handle(unsigned int _i) const\n  { return (_i < n_vertices()) ? handle( vertices_[_i] ) : VertexHandle(); }\n\n  HalfedgeHandle halfedge_handle(unsigned int _i) const\n  {\n    return (_i < n_halfedges()) ?\n      halfedge_handle(edge_handle(_i/2), _i%2) : HalfedgeHandle();\n  }\n\n  EdgeHandle edge_handle(unsigned int _i) const\n  { return (_i < n_edges()) ? handle(edges_[_i]) : EdgeHandle(); }\n\n  FaceHandle face_handle(unsigned int _i) const\n  { return (_i < n_faces()) ? handle(faces_[_i]) : FaceHandle(); }\n\npublic:\n\n  inline VertexHandle new_vertex()\n  {\n    vertices_.push_back(Vertex());\n    vprops_resize(n_vertices());//TODO:should it be push_back()?\n\n    return handle(vertices_.back());\n  }\n\n  inline HalfedgeHandle new_edge(VertexHandle _start_vh, VertexHandle _end_vh)\n  {\n//     assert(_start_vh != _end_vh);\n    edges_.push_back(Edge());\n    eprops_resize(n_edges());//TODO:should it be push_back()?\n    hprops_resize(n_halfedges());//TODO:should it be push_back()?\n\n    EdgeHandle eh(handle(edges_.back()));\n    HalfedgeHandle heh0(halfedge_handle(eh, 0));\n    HalfedgeHandle heh1(halfedge_handle(eh, 1));\n    set_vertex_handle(heh0, _end_vh);\n    set_vertex_handle(heh1, _start_vh);\n    return heh0;\n  }\n\n  inline FaceHandle new_face()\n  {\n    faces_.push_back(Face());\n    fprops_resize(n_faces());\n    return handle(faces_.back());\n  }\n\n  inline FaceHandle new_face(const Face& _f)\n  {\n    faces_.push_back(_f);\n    fprops_resize(n_faces());\n    return handle(faces_.back());\n  }\n\npublic:\n  // --- resize/reserve ---\n  void resize( size_t _n_vertices, size_t _n_edges, size_t _n_faces );\n  void reserve(size_t _n_vertices, size_t _n_edges, size_t _n_faces );\n\n  // --- deletion ---\n  /** \\brief garbage collection\n   *\n   * Usually if you delete primitives in OpenMesh, they are only flagged as deleted.\n   * Only when you call garbage collection, they will be actually removed.\n   *\n   * \\note Garbage collection invalidates all handles. If you need to keep track of\n   *       a set of handles, you can pass them to the second garbage collection\n   *       function, which will update a vector of handles.\n   *       See also \\ref deletedElements.\n   *\n   * @param _v Remove deleted vertices?\n   * @param _e Remove deleted edges?\n   * @param _f Remove deleted faces?\n   *\n   */\n  void garbage_collection(bool _v=true, bool _e=true, bool _f=true);\n\n  /** \\brief garbage collection with handle tracking\n   *\n   * Usually if you delete primitives in OpenMesh, they are only flagged as deleted.\n   * Only when you call garbage collection, they will be actually removed.\n   *\n   * \\note Garbage collection invalidates all handles. If you need to keep track of\n   *       a set of handles, you can pass them to this function. The handles that the\n   *       given pointers point to are updated in place.\n   *       See also \\ref deletedElements.\n   *\n   * @param vh_to_update Pointers to vertex handles that should get updated\n   * @param hh_to_update Pointers to halfedge handles that should get updated\n   * @param fh_to_update Pointers to face handles that should get updated\n   * @param _v Remove deleted vertices?\n   * @param _e Remove deleted edges?\n   * @param _f Remove deleted faces?\n   */\n  template<typename std_API_Container_VHandlePointer,\n           typename std_API_Container_HHandlePointer,\n           typename std_API_Container_FHandlePointer>\n  void garbage_collection(std_API_Container_VHandlePointer& vh_to_update,\n                          std_API_Container_HHandlePointer& hh_to_update,\n                          std_API_Container_FHandlePointer& fh_to_update,\n                          bool _v=true, bool _e=true, bool _f=true);\n\n  /** \\brief Clear the whole mesh\n   *\n   *  This will remove all properties and elements from the mesh\n   */\n  void clear();\n\n  /** \\brief Reset the whole mesh\n   *\n   *  This will remove all elements from the mesh but keeps the properties\n   */\n  void clean();\n\n  // --- number of items ---\n  size_t n_vertices()  const { return vertices_.size(); }\n  size_t n_halfedges() const { return 2*edges_.size(); }\n  size_t n_edges()     const { return edges_.size(); }\n  size_t n_faces()     const { return faces_.size(); }\n\n  bool vertices_empty()  const { return vertices_.empty(); }\n  bool halfedges_empty() const { return edges_.empty(); }\n  bool edges_empty()     const { return edges_.empty(); }\n  bool faces_empty()     const { return faces_.empty(); }\n\n  // --- vertex connectivity ---\n\n  HalfedgeHandle halfedge_handle(VertexHandle _vh) const\n  { return vertex(_vh).halfedge_handle_; }\n\n  void set_halfedge_handle(VertexHandle _vh, HalfedgeHandle _heh)\n  {\n//     assert(is_valid_handle(_heh));\n    vertex(_vh).halfedge_handle_ = _heh;\n  }\n\n  bool is_isolated(VertexHandle _vh) const\n  { return !halfedge_handle(_vh).is_valid(); }\n\n  void set_isolated(VertexHandle _vh)\n  { vertex(_vh).halfedge_handle_.invalidate(); }\n\n  unsigned int delete_isolated_vertices();\n\n  // --- halfedge connectivity ---\n  VertexHandle to_vertex_handle(HalfedgeHandle _heh) const\n  { return halfedge(_heh).vertex_handle_; }\n\n  VertexHandle from_vertex_handle(HalfedgeHandle _heh) const\n  { return to_vertex_handle(opposite_halfedge_handle(_heh)); }\n\n  void set_vertex_handle(HalfedgeHandle _heh, VertexHandle _vh)\n  {\n//     assert(is_valid_handle(_vh));\n    halfedge(_heh).vertex_handle_ = _vh;\n  }\n\n  FaceHandle face_handle(HalfedgeHandle _heh) const\n  { return halfedge(_heh).face_handle_; }\n\n  void set_face_handle(HalfedgeHandle _heh, FaceHandle _fh)\n  {\n//     assert(is_valid_handle(_fh));\n    halfedge(_heh).face_handle_ = _fh;\n  }\n\n  void set_boundary(HalfedgeHandle _heh)\n  { halfedge(_heh).face_handle_.invalidate(); }\n\n  /// Is halfedge _heh a boundary halfedge (is its face handle invalid) ?\n  bool is_boundary(HalfedgeHandle _heh) const\n  { return !face_handle(_heh).is_valid(); }\n\n  HalfedgeHandle next_halfedge_handle(HalfedgeHandle _heh) const\n  { return halfedge(_heh).next_halfedge_handle_; }\n\n  void set_next_halfedge_handle(HalfedgeHandle _heh, HalfedgeHandle _nheh)\n  {\n    assert(is_valid_handle(_nheh));\n//     assert(to_vertex_handle(_heh) == from_vertex_handle(_nheh));\n    halfedge(_heh).next_halfedge_handle_ = _nheh;\n    set_prev_halfedge_handle(_nheh, _heh);\n  }\n\n\n  void set_prev_halfedge_handle(HalfedgeHandle _heh, HalfedgeHandle _pheh)\n  {\n    assert(is_valid_handle(_pheh));\n    set_prev_halfedge_handle(_heh, _pheh, HasPrevHalfedge());\n  }\n\n  void set_prev_halfedge_handle(HalfedgeHandle _heh, HalfedgeHandle _pheh,\n                                GenProg::True)\n  { halfedge(_heh).prev_halfedge_handle_ = _pheh; }\n\n  void set_prev_halfedge_handle(HalfedgeHandle /* _heh */, HalfedgeHandle /* _pheh */,\n                                GenProg::False)\n  {}\n\n  HalfedgeHandle prev_halfedge_handle(HalfedgeHandle _heh) const\n  { return prev_halfedge_handle(_heh, HasPrevHalfedge() ); }\n\n  HalfedgeHandle prev_halfedge_handle(HalfedgeHandle _heh, GenProg::True) const\n  { return halfedge(_heh).prev_halfedge_handle_; }\n\n  HalfedgeHandle prev_halfedge_handle(HalfedgeHandle _heh, GenProg::False) const\n  {\n    if (is_boundary(_heh))\n    {//iterating around the vertex should be faster than iterating the boundary\n      HalfedgeHandle curr_heh(opposite_halfedge_handle(_heh));\n      HalfedgeHandle next_heh(next_halfedge_handle(curr_heh));\n      do\n      {\n        curr_heh = opposite_halfedge_handle(next_heh);\n        next_heh = next_halfedge_handle(curr_heh);\n      }\n      while (next_heh != _heh);\n      return curr_heh;\n    }\n    else\n    {\n      HalfedgeHandle  heh(_heh);\n      HalfedgeHandle  next_heh(next_halfedge_handle(heh));\n      while (next_heh != _heh) {\n        heh = next_heh;\n        next_heh = next_halfedge_handle(next_heh);\n      }\n      return heh;\n    }\n  }\n\n\n  HalfedgeHandle opposite_halfedge_handle(HalfedgeHandle _heh) const\n  { return HalfedgeHandle((_heh.idx() & 1) ? _heh.idx()-1 : _heh.idx()+1); }\n\n\n  HalfedgeHandle ccw_rotated_halfedge_handle(HalfedgeHandle _heh) const\n  { return opposite_halfedge_handle(prev_halfedge_handle(_heh)); }\n\n\n  HalfedgeHandle cw_rotated_halfedge_handle(HalfedgeHandle _heh) const\n  { return next_halfedge_handle(opposite_halfedge_handle(_heh)); }\n\n  // --- edge connectivity ---\n  HalfedgeHandle halfedge_handle(EdgeHandle _eh, unsigned int _i) const\n  {\n    assert(_i<=1);\n    return HalfedgeHandle((_eh.idx() << 1) + _i);\n  }\n\n  EdgeHandle edge_handle(HalfedgeHandle _heh) const\n  { return EdgeHandle(_heh.idx() >> 1); }\n\n  // --- face connectivity ---\n  HalfedgeHandle halfedge_handle(FaceHandle _fh) const\n  { return face(_fh).halfedge_handle_; }\n\n  void set_halfedge_handle(FaceHandle _fh, HalfedgeHandle _heh)\n  {\n//     assert(is_valid_handle(_heh));\n    face(_fh).halfedge_handle_ = _heh;\n  }\n\n  /// Status Query API\n  //------------------------------------------------------------ vertex status\n  const StatusInfo&                         status(VertexHandle _vh) const\n  { return property(vertex_status_, _vh); }\n\n  StatusInfo&                               status(VertexHandle _vh)\n  { return property(vertex_status_, _vh); }\n\n  //----------------------------------------------------------- halfedge status\n  const StatusInfo&                         status(HalfedgeHandle _hh) const\n  { return property(halfedge_status_, _hh);  }\n\n  StatusInfo&                               status(HalfedgeHandle _hh)\n  { return property(halfedge_status_, _hh); }\n\n  //--------------------------------------------------------------- edge status\n  const StatusInfo&                         status(EdgeHandle _eh) const\n  { return property(edge_status_, _eh); }\n\n  StatusInfo&                               status(EdgeHandle _eh)\n  { return property(edge_status_, _eh); }\n\n  //--------------------------------------------------------------- face status\n  const StatusInfo&                         status(FaceHandle _fh) const\n  { return property(face_status_, _fh); }\n\n  StatusInfo&                               status(FaceHandle _fh)\n  { return property(face_status_, _fh); }\n\n  inline bool                               has_vertex_status() const\n  { return vertex_status_.is_valid();    }\n\n  inline bool                               has_halfedge_status() const\n  { return halfedge_status_.is_valid();  }\n\n  inline bool                               has_edge_status() const\n  { return edge_status_.is_valid(); }\n\n  inline bool                               has_face_status() const\n  { return face_status_.is_valid(); }\n\n  inline VertexStatusPropertyHandle         vertex_status_pph() const\n  { return vertex_status_;  }\n\n  inline HalfedgeStatusPropertyHandle       halfedge_status_pph() const\n  { return halfedge_status_; }\n\n  inline EdgeStatusPropertyHandle           edge_status_pph() const\n  { return edge_status_;  }\n\n  inline FaceStatusPropertyHandle           face_status_pph() const\n  { return face_status_; }\n\n  /// status property by handle\n  inline VertexStatusPropertyHandle         status_pph(VertexHandle /*_hnd*/) const\n  { return vertex_status_pph(); }\n\n  inline HalfedgeStatusPropertyHandle       status_pph(HalfedgeHandle /*_hnd*/) const\n  { return halfedge_status_pph(); }\n\n  inline EdgeStatusPropertyHandle           status_pph(EdgeHandle /*_hnd*/) const\n  { return edge_status_pph();  }\n\n  inline FaceStatusPropertyHandle           status_pph(FaceHandle /*_hnd*/) const\n  { return face_status_pph();  }\n\n  /// Status Request API\n  void request_vertex_status()\n  {\n    if (!refcount_vstatus_++)\n      add_property( vertex_status_, \"v:status\" );\n  }\n\n  void request_halfedge_status()\n  {\n    if (!refcount_hstatus_++)\n      add_property( halfedge_status_, \"h:status\" );\n  }\n\n  void request_edge_status()\n  {\n    if (!refcount_estatus_++)\n      add_property( edge_status_, \"e:status\" );\n  }\n\n  void request_face_status()\n  {\n    if (!refcount_fstatus_++)\n      add_property( face_status_, \"f:status\" );\n  }\n\n  /// Status Release API\n  void release_vertex_status()\n  {\n    if ((refcount_vstatus_ > 0) && (! --refcount_vstatus_))\n      remove_property(vertex_status_);\n  }\n\n  void release_halfedge_status()\n  {\n    if ((refcount_hstatus_ > 0) && (! --refcount_hstatus_))\n      remove_property(halfedge_status_);\n  }\n\n  void release_edge_status()\n  {\n    if ((refcount_estatus_ > 0) && (! --refcount_estatus_))\n      remove_property(edge_status_);\n  }\n\n  void release_face_status()\n  {\n    if ((refcount_fstatus_ > 0) && (! --refcount_fstatus_))\n      remove_property(face_status_);\n  }\n\n  /// --- StatusSet API ---\n\n  template <class Handle>\n  class StatusSetT\n  {\n  protected:\n    ArrayKernel&                            kernel_;\n\n  public:\n    const unsigned int                      bit_mask_;\n\n  public:\n    StatusSetT(ArrayKernel& _kernel, unsigned int _bit_mask)\n    : kernel_(_kernel), bit_mask_(_bit_mask)\n    {}\n\n    ~StatusSetT()\n    {}\n\n    inline bool                             is_in(Handle _hnd) const\n    { return kernel_.status(_hnd).is_bit_set(bit_mask_); }\n\n    inline void                             insert(Handle _hnd)\n    { kernel_.status(_hnd).set_bit(bit_mask_); }\n\n    inline void                             erase(Handle _hnd)\n    { kernel_.status(_hnd).unset_bit(bit_mask_); }\n\n    /// Note: 0(n) complexity\n    unsigned int                            size() const\n    {\n      unsigned int n_elements = kernel_.status_pph(Handle()).is_valid() ?\n                                kernel_.property(kernel_.status_pph(Handle())).n_elements() : 0;\n      unsigned int sz = 0;\n      for (unsigned int i = 0; i < n_elements; ++i)\n      {\n        sz += (unsigned int)is_in(Handle(i));\n      }\n      return sz;\n    }\n\n    /// Note: O(n) complexity\n    void                                    clear()\n    {\n      unsigned int n_elements = kernel_.status_pph(Handle()).is_valid() ?\n                                kernel_.property(kernel_.status_pph(Handle())).n_elements() : 0;\n      for (unsigned int i = 0; i < n_elements; ++i)\n      {\n        erase(Handle(i));\n      }\n    }\n  };\n\n  friend class StatusSetT<VertexHandle>;\n  friend class StatusSetT<EdgeHandle>;\n  friend class StatusSetT<FaceHandle>;\n  friend class StatusSetT<HalfedgeHandle>;\n\n  /// --- AutoStatusSet API ---\n\n  template <class Handle>\n  class AutoStatusSetT : public StatusSetT<Handle>\n  {\n  private:\n    typedef StatusSetT<Handle>              Base;\n  public:\n    AutoStatusSetT(ArrayKernel& _kernel)\n    : StatusSetT<Handle>(_kernel, _kernel.pop_bit_mask(Handle()))\n    { /*assert(size() == 0);*/ } //the set should be empty on creation\n\n    ~AutoStatusSetT()\n    {\n      //assert(size() == 0);//the set should be empty on leave?\n      Base::kernel_.push_bit_mask(Handle(), Base::bit_mask_);\n    }\n  };\n\n  friend class AutoStatusSetT<VertexHandle>;\n  friend class AutoStatusSetT<EdgeHandle>;\n  friend class AutoStatusSetT<FaceHandle>;\n  friend class AutoStatusSetT<HalfedgeHandle>;\n\n  typedef AutoStatusSetT<VertexHandle>      VertexStatusSet;\n  typedef AutoStatusSetT<EdgeHandle>        EdgeStatusSet;\n  typedef AutoStatusSetT<FaceHandle>        FaceStatusSet;\n  typedef AutoStatusSetT<HalfedgeHandle>    HalfedgeStatusSet;\n\n  /// --- ExtStatusSet API --- (hybrid between a set and an array)\n\n  template <class Handle>\n  class ExtStatusSetT : public AutoStatusSetT<Handle>\n  {\n  public:\n    typedef AutoStatusSetT<Handle>          Base;\n\n  protected:\n    typedef std::vector<Handle>             HandleContainer;\n    HandleContainer                         handles_;\n\n  public:\n    typedef typename HandleContainer::iterator\n                                            iterator;\n    typedef typename HandleContainer::const_iterator\n                                            const_iterator;\n  public:\n    ExtStatusSetT(ArrayKernel& _kernel, size_t _capacity_hint = 0)\n    : Base(_kernel)\n    { handles_.reserve(_capacity_hint); }\n\n    ~ExtStatusSetT()\n    { clear(); }\n\n    //set API\n    // Complexity: O(1)\n    inline void                             insert(Handle _hnd)\n    {\n      if (!is_in(_hnd))\n      {\n        Base::insert(_hnd);\n        handles_.push_back(_hnd);\n      }\n    }\n\n    // Complexity: O(k), (k - number of the elements in the set)\n    inline void                             erase(Handle _hnd)\n    {\n      if (is_in(_hnd))\n      {\n        iterator it = std::find(begin(), end(), _hnd);\n        erase(it);\n      }\n    }\n\n    // Complexity: O(1)\n    inline void                             erase(iterator _it)\n    {\n      assert(_it != end() && is_in(*_it));\n      clear(*_it);\n      *_it = handles_.back();\n      _it.pop_back();\n    }\n\n    inline void                             clear()\n    {\n      for (iterator it = begin(); it != end(); ++it)\n      {\n        assert(is_in(*it));\n        Base::erase(*it);\n      }\n      handles_.clear();\n    }\n\n    /// Complexity: 0(1)\n    inline unsigned int                     size() const\n    { return handles_.size(); }\n    inline bool                             empty() const\n    { return handles_.empty(); }\n\n    //Vector API\n    inline iterator                         begin()\n    { return handles_.begin(); }\n    inline const_iterator                   begin() const\n    { return handles_.begin(); }\n\n    inline iterator                         end()\n    { return handles_.end(); }\n    inline const_iterator                   end() const\n    { return handles_.end(); }\n\n    inline Handle&                          front()\n    { return handles_.front(); }\n    inline const Handle&                    front() const\n    { return handles_.front(); }\n\n    inline Handle&                          back()\n    { return handles_.back(); }\n    inline const Handle&                    back() const\n    { return handles_.back(); }\n  };\n\n  typedef ExtStatusSetT<FaceHandle>         ExtFaceStatusSet;\n  typedef ExtStatusSetT<VertexHandle>       ExtVertexStatusSet;\n  typedef ExtStatusSetT<EdgeHandle>         ExtEdgeStatusSet;\n  typedef ExtStatusSetT<HalfedgeHandle>     ExtHalfedgeStatusSet;\n\nprivate:\n  // iterators\n  typedef std::vector<Vertex>                VertexContainer;\n  typedef std::vector<Edge>                  EdgeContainer;\n  typedef std::vector<Face>                  FaceContainer;\n  typedef VertexContainer::iterator          KernelVertexIter;\n  typedef VertexContainer::const_iterator    KernelConstVertexIter;\n  typedef EdgeContainer::iterator            KernelEdgeIter;\n  typedef EdgeContainer::const_iterator      KernelConstEdgeIter;\n  typedef FaceContainer::iterator            KernelFaceIter;\n  typedef FaceContainer::const_iterator      KernelConstFaceIter;\n  typedef std::vector<unsigned int>          BitMaskContainer;\n\n\n  KernelVertexIter      vertices_begin()        { return vertices_.begin(); }\n  KernelConstVertexIter vertices_begin() const  { return vertices_.begin(); }\n  KernelVertexIter      vertices_end()          { return vertices_.end(); }\n  KernelConstVertexIter vertices_end() const    { return vertices_.end(); }\n\n  KernelEdgeIter        edges_begin()           { return edges_.begin(); }\n  KernelConstEdgeIter   edges_begin() const     { return edges_.begin(); }\n  KernelEdgeIter        edges_end()             { return edges_.end(); }\n  KernelConstEdgeIter   edges_end() const       { return edges_.end(); }\n\n  KernelFaceIter        faces_begin()           { return faces_.begin(); }\n  KernelConstFaceIter   faces_begin() const     { return faces_.begin(); }\n  KernelFaceIter        faces_end()             { return faces_.end(); }\n  KernelConstFaceIter   faces_end() const       { return faces_.end(); }\n\n  /// bit mask container by handle\n  inline BitMaskContainer&                  bit_masks(VertexHandle /*_dummy_hnd*/)\n  { return vertex_bit_masks_; }\n  inline BitMaskContainer&                  bit_masks(EdgeHandle /*_dummy_hnd*/)\n  { return edge_bit_masks_; }\n  inline BitMaskContainer&                  bit_masks(FaceHandle /*_dummy_hnd*/)\n  { return face_bit_masks_; }\n  inline BitMaskContainer&                  bit_masks(HalfedgeHandle /*_dummy_hnd*/)\n  { return halfedge_bit_masks_; }\n\n  template <class Handle>\n  unsigned int                              pop_bit_mask(Handle _hnd)\n  {\n    assert(!bit_masks(_hnd).empty());//check if the client request too many status sets\n    unsigned int bit_mask = bit_masks(_hnd).back();\n    bit_masks(_hnd).pop_back();\n    return bit_mask;\n  }\n\n  template <class Handle>\n  void                                      push_bit_mask(Handle _hnd, unsigned int _bit_mask)\n  {\n    assert(std::find(bit_masks(_hnd).begin(), bit_masks(_hnd).end(), _bit_mask) ==\n           bit_masks(_hnd).end());//this mask should be not already used\n    bit_masks(_hnd).push_back(_bit_mask);\n  }\n\n  void                                      init_bit_masks(BitMaskContainer& _bmc);\n  void                                      init_bit_masks();\n\nprivate:\n  VertexContainer                           vertices_;\n  EdgeContainer                             edges_;\n  FaceContainer                             faces_;\n\n  VertexStatusPropertyHandle                vertex_status_;\n  HalfedgeStatusPropertyHandle              halfedge_status_;\n  EdgeStatusPropertyHandle                  edge_status_;\n  FaceStatusPropertyHandle                  face_status_;\n\n  unsigned int                              refcount_vstatus_;\n  unsigned int                              refcount_hstatus_;\n  unsigned int                              refcount_estatus_;\n  unsigned int                              refcount_fstatus_;\n\n  BitMaskContainer                          halfedge_bit_masks_;\n  BitMaskContainer                          edge_bit_masks_;\n  BitMaskContainer                          vertex_bit_masks_;\n  BitMaskContainer                          face_bit_masks_;\n};\n\n\n//=============================================================================\n} // namespace OpenMesh\n//=============================================================================\n#if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_ARRAY_KERNEL_C)\n#  define OPENMESH_ARRAY_KERNEL_TEMPLATES\n#  include \"ArrayKernelT.cc\"\n#endif\n//=============================================================================\n#endif // OPENMESH_ARRAY_KERNEL_HH defined\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Mesh/ArrayKernelT.cc",
    "content": "/*===========================================================================*\\\r\n *                                                                           *\r\n *                               OpenMesh                                    *\r\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\r\n *                           www.openmesh.org                                *\r\n *                                                                           *\r\n *---------------------------------------------------------------------------* \r\n *  This file is part of OpenMesh.                                           *\r\n *                                                                           *\r\n *  OpenMesh is free software: you can redistribute it and/or modify         * \r\n *  it under the terms of the GNU Lesser General Public License as           *\r\n *  published by the Free Software Foundation, either version 3 of           *\r\n *  the License, or (at your option) any later version with the              *\r\n *  following exceptions:                                                    *\r\n *                                                                           *\r\n *  If other files instantiate templates or use macros                       *\r\n *  or inline functions from this file, or you compile this file and         *\r\n *  link it with other files to produce an executable, this file does        *\r\n *  not by itself cause the resulting executable to be covered by the        *\r\n *  GNU Lesser General Public License. This exception does not however       *\r\n *  invalidate any other reasons why the executable file might be            *\r\n *  covered by the GNU Lesser General Public License.                        *\r\n *                                                                           *\r\n *  OpenMesh is distributed in the hope that it will be useful,              *\r\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of           *\r\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            *\r\n *  GNU Lesser General Public License for more details.                      *\r\n *                                                                           *\r\n *  You should have received a copy of the GNU LesserGeneral Public          *\r\n *  License along with OpenMesh.  If not,                                    *\r\n *  see <http://www.gnu.org/licenses/>.                                      *\r\n *                                                                           *\r\n\\*===========================================================================*/ \r\n\r\n/*===========================================================================*\\\r\n *                                                                           *             \r\n *   $Revision: 362 $                                                         *\r\n *   $Date: 2011-01-26 10:21:12 +0100 (Mi, 26 Jan 2011) $                   *\r\n *                                                                           *\r\n\\*===========================================================================*/\r\n\r\n#define OPENMESH_ARRAY_KERNEL_C\r\n\r\n//== INCLUDES =================================================================\r\n\r\n#include <OpenMesh/Core/Mesh/ArrayKernel.hh>\r\n\r\n//== NAMESPACES ===============================================================\r\n\r\nnamespace OpenMesh\r\n{\r\n\r\n//== IMPLEMENTATION ==========================================================\r\n\r\ntemplate<typename std_API_Container_VHandlePointer,\r\n         typename std_API_Container_HHandlePointer,\r\n         typename std_API_Container_FHandlePointer>\r\nvoid ArrayKernel::garbage_collection(std_API_Container_VHandlePointer& vh_to_update,\r\n                                     std_API_Container_HHandlePointer& hh_to_update,\r\n                                     std_API_Container_FHandlePointer& fh_to_update,\r\n                                     bool _v, bool _e, bool _f)\r\n{\r\n\r\n#ifdef DEBUG\r\n  #ifndef OM_GARBAGE_NO_STATUS_WARNING\r\n    if ( !this->has_vertex_status() )\r\n      omerr() << \"garbage_collection: No vertex status available. You can request it: mesh.request_vertex_status() or define OM_GARBAGE_NO_STATUS_WARNING to silence this warning.\" << std::endl;\r\n    if ( !this->has_edge_status() )\r\n      omerr() << \"garbage_collection: No edge status available. You can request it: mesh.request_edge_status() or define OM_GARBAGE_NO_STATUS_WARNING to silence this warning.\" << std::endl;\r\n    if ( !this->has_face_status() )\r\n      omerr() << \"garbage_collection: No face status available. You can request it: mesh.request_face_status() or define OM_GARBAGE_NO_STATUS_WARNING to silence this warning.\" << std::endl;\r\n  #endif\r\n#endif\r\n\r\n  const bool track_vhandles = ( !vh_to_update.empty() );\r\n  const bool track_hhandles = ( !hh_to_update.empty() );\r\n  const bool track_fhandles = ( !fh_to_update.empty() );\r\n\r\n  int i, i0, i1;\r\n\r\n  int nV = int(n_vertices());\r\n  int nE = int(n_edges());\r\n  int nH = int(2*n_edges());\r\n  int nF = (int(n_faces()));\r\n\r\n  std::vector<VertexHandle>    vh_map;\r\n  std::vector<HalfedgeHandle>  hh_map;\r\n  std::vector<FaceHandle>      fh_map;\r\n\r\n  std::map <int, int> vertex_inverse_map;\r\n  std::map <int, int> halfedge_inverse_map;\r\n  std::map <int, int> face_inverse_map;\r\n\r\n  // setup handle mapping:\r\n  vh_map.reserve(nV);\r\n  for (i=0; i<nV; ++i) vh_map.push_back(VertexHandle(i));\r\n\r\n  hh_map.reserve(nH);\r\n  for (i=0; i<nH; ++i) hh_map.push_back(HalfedgeHandle(i));\r\n\r\n  fh_map.reserve(nF);\r\n  for (i=0; i<nF; ++i) fh_map.push_back(FaceHandle(i));\r\n\r\n  // remove deleted vertices\r\n  if (_v && n_vertices() > 0 && this->has_vertex_status() )\r\n  {\r\n    i0=0;  i1=nV-1;\r\n\r\n    while (1)\r\n    {\r\n      // find 1st deleted and last un-deleted\r\n      while (!status(VertexHandle(i0)).deleted() && i0 < i1)  ++i0;\r\n      while ( status(VertexHandle(i1)).deleted() && i0 < i1)  --i1;\r\n      if (i0 >= i1) break;\r\n\r\n      // If we keep track of the vertex handles for updates,\r\n      // we need to have the opposite direction\r\n      if ( track_vhandles ) {\r\n        vertex_inverse_map[i1] = i0;\r\n        vertex_inverse_map[i0] = -1;\r\n      }\r\n\r\n      // swap\r\n      std::swap(vertices_[i0], vertices_[i1]);\r\n      std::swap(vh_map[i0],  vh_map[i1]);\r\n      vprops_swap(i0, i1);\r\n    };\r\n\r\n    vertices_.resize(status(VertexHandle(i0)).deleted() ? i0 : i0+1);\r\n    vprops_resize(n_vertices());\r\n  }\r\n\r\n\r\n  // remove deleted edges\r\n  if (_e && n_edges() > 0 && this->has_edge_status() )\r\n  {\r\n    i0=0;  i1=nE-1;\r\n\r\n    while (1)\r\n    {\r\n      // find 1st deleted and last un-deleted\r\n      while (!status(EdgeHandle(i0)).deleted() && i0 < i1)  ++i0;\r\n      while ( status(EdgeHandle(i1)).deleted() && i0 < i1)  --i1;\r\n      if (i0 >= i1) break;\r\n\r\n      // If we keep track of the vertex handles for updates,\r\n      // we need to have the opposite direction\r\n      if ( track_hhandles ) {\r\n        halfedge_inverse_map[2*i1] = 2 * i0;\r\n        halfedge_inverse_map[2*i0] = -1;\r\n\r\n        halfedge_inverse_map[2*i1 + 1] = 2 * i0 + 1;\r\n        halfedge_inverse_map[2*i0 + 1] = -1;\r\n      }\r\n\r\n      // swap\r\n      std::swap(edges_[i0], edges_[i1]);\r\n      std::swap(hh_map[2*i0], hh_map[2*i1]);\r\n      std::swap(hh_map[2*i0+1], hh_map[2*i1+1]);\r\n      eprops_swap(i0, i1);\r\n      hprops_swap(2*i0,   2*i1);\r\n      hprops_swap(2*i0+1, 2*i1+1);\r\n    };\r\n\r\n    edges_.resize(status(EdgeHandle(i0)).deleted() ? i0 : i0+1);\r\n    eprops_resize(n_edges());\r\n    hprops_resize(n_halfedges());\r\n  }\r\n\r\n\r\n  // remove deleted faces\r\n  if (_f && n_faces() > 0 && this->has_face_status() )\r\n  {\r\n    i0=0;  i1=nF-1;\r\n\r\n    while (1)\r\n    {\r\n      // find 1st deleted and last un-deleted\r\n      while (!status(FaceHandle(i0)).deleted() && i0 < i1)  ++i0;\r\n      while ( status(FaceHandle(i1)).deleted() && i0 < i1)  --i1;\r\n      if (i0 >= i1) break;\r\n\r\n      // If we keep track of the face handles for updates,\r\n      // we need to have the opposite direction\r\n      if ( track_fhandles ) {\r\n        face_inverse_map[i1] = i0;\r\n        face_inverse_map[i0] = -1;\r\n      }\r\n\r\n      // swap\r\n      std::swap(faces_[i0], faces_[i1]);\r\n      std::swap(fh_map[i0], fh_map[i1]);\r\n      fprops_swap(i0, i1);\r\n    };\r\n\r\n    faces_.resize(status(FaceHandle(i0)).deleted() ? i0 : i0+1);\r\n    fprops_resize(n_faces());\r\n  }\r\n\r\n\r\n  // update handles of vertices\r\n  if (_e)\r\n  {\r\n    KernelVertexIter v_it(vertices_begin()), v_end(vertices_end());\r\n    VertexHandle     vh;\r\n\r\n    for (; v_it!=v_end; ++v_it)\r\n    {\r\n      vh = handle(*v_it);\r\n      if (!is_isolated(vh))\r\n      {\r\n        set_halfedge_handle(vh, hh_map[halfedge_handle(vh).idx()]);\r\n      }\r\n    }\r\n  }\r\n\r\n  HalfedgeHandle hh;\r\n  // update handles of halfedges\r\n  for (KernelEdgeIter e_it(edges_begin()); e_it != edges_end(); ++e_it)\r\n  {//in the first pass update the (half)edges vertices\r\n    hh = halfedge_handle(handle(*e_it), 0);\r\n    set_vertex_handle(hh, vh_map[to_vertex_handle(hh).idx()]);\r\n    hh = halfedge_handle(handle(*e_it), 1);\r\n    set_vertex_handle(hh, vh_map[to_vertex_handle(hh).idx()]);\r\n  }\r\n  for (KernelEdgeIter e_it(edges_begin()); e_it != edges_end(); ++e_it)\r\n  {//in the second pass update the connectivity of the (half)edges\r\n    hh = halfedge_handle(handle(*e_it), 0);\r\n    set_next_halfedge_handle(hh, hh_map[next_halfedge_handle(hh).idx()]);\r\n    if (!is_boundary(hh))\r\n    {\r\n      set_face_handle(hh, fh_map[face_handle(hh).idx()]);\r\n    }\r\n    hh = halfedge_handle(handle(*e_it), 1);\r\n    set_next_halfedge_handle(hh, hh_map[next_halfedge_handle(hh).idx()]);\r\n    if (!is_boundary(hh))\r\n    {\r\n      set_face_handle(hh, fh_map[face_handle(hh).idx()]);\r\n    }\r\n  }\r\n\r\n  // update handles of faces\r\n  if (_e)\r\n  {\r\n    KernelFaceIter  f_it(faces_begin()), f_end(faces_end());\r\n    FaceHandle      fh;\r\n\r\n    for (; f_it!=f_end; ++f_it)\r\n    {\r\n      fh = handle(*f_it);\r\n      set_halfedge_handle(fh, hh_map[halfedge_handle(fh).idx()]);\r\n    }\r\n  }\r\n\r\n  const int vertexCount   = int(vertices_.size());\r\n  const int halfedgeCount = int(edges_.size() * 2);\r\n  const int faceCount     = int(faces_.size());\r\n\r\n  // Update the vertex handles in the vertex handle vector\r\n  typename std_API_Container_VHandlePointer::iterator v_it(vh_to_update.begin()), v_it_end(vh_to_update.end());\r\n  for(; v_it != v_it_end; ++v_it)\r\n  {\r\n\r\n    // Only changed vertices need to be considered\r\n    if ( (*v_it)->idx() != vh_map[(*v_it)->idx()].idx() ) {\r\n      *(*v_it) = VertexHandle(vertex_inverse_map[(*v_it)->idx()]);\r\n\r\n      // Vertices above the vertex count have to be already mapped, or they are invalid now!\r\n    } else if ( ((*v_it)->idx() >= vertexCount) && (vertex_inverse_map.find((*v_it)->idx()) == vertex_inverse_map.end()) ) {\r\n      (*v_it)->invalidate();\r\n    }\r\n\r\n  }\r\n\r\n  // Update the halfedge handles in the halfedge handle vector\r\n  typename std_API_Container_HHandlePointer::iterator hh_it(hh_to_update.begin()), hh_it_end(hh_to_update.end());\r\n  for(; hh_it != hh_it_end; ++hh_it)\r\n  {\r\n    // Only changed faces need to be considered\r\n    if ( (*hh_it)->idx() != hh_map[(*hh_it)->idx()].idx() ) {\r\n      *(*hh_it) = HalfedgeHandle(halfedge_inverse_map[(*hh_it)->idx()]);\r\n\r\n      // Vertices above the face count have to be already mapped, or they are invalid now!\r\n    } else if ( ((*hh_it)->idx() >= halfedgeCount) && (halfedge_inverse_map.find((*hh_it)->idx()) == halfedge_inverse_map.end()) ) {\r\n      (*hh_it)->invalidate();\r\n    }\r\n\r\n  }\r\n\r\n  // Update the face handles in the face handle vector\r\n  typename std_API_Container_FHandlePointer::iterator fh_it(fh_to_update.begin()), fh_it_end(fh_to_update.end());\r\n  for(; fh_it != fh_it_end; ++fh_it)\r\n  {\r\n\r\n    // Only changed faces need to be considered\r\n    if ( (*fh_it)->idx() != fh_map[(*fh_it)->idx()].idx() ) {\r\n      *(*fh_it) = FaceHandle(face_inverse_map[(*fh_it)->idx()]);\r\n\r\n      // Vertices above the face count have to be already mapped, or they are invalid now!\r\n    } else if ( ((*fh_it)->idx() >= faceCount) && (face_inverse_map.find((*fh_it)->idx()) == face_inverse_map.end()) ) {\r\n      (*fh_it)->invalidate();\r\n    }\r\n\r\n  }\r\n}\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Mesh/AttribKernelT.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n#ifndef OPENMESH_ATTRIBKERNEL_HH\n#define OPENMESH_ATTRIBKERNEL_HH\n\n\n//== INCLUDES =================================================================\n\n#include <OpenMesh/Core/Mesh/Attributes.hh>\n#include <OpenMesh/Core/Utils/GenProg.hh>\n#include <OpenMesh/Core/Utils/vector_traits.hh>\n#include <vector>\n#include <algorithm>\n\n//== NAMESPACES ===============================================================\n\nnamespace OpenMesh {\n\n\n//== CLASS DEFINITION =========================================================\n\n/** \\class AttribKernelT AttribKernelT.hh <OpenMesh/Mesh/AttribKernelT.hh>\n\n The attribute kernel adds all standard properties to the kernel. Therefore\n the functions/types defined here provide a subset of the kernel\n interface as described in Concepts::KernelT.\n\n \\see Concepts::KernelT\n*/\ntemplate <class MeshItems, class Connectivity>\nclass AttribKernelT : public Connectivity\n{\npublic:\n\n  //---------------------------------------------------------------- item types\n\n  typedef MeshItems MeshItemsT;\n  typedef Connectivity ConnectivityT;\n  typedef typename Connectivity::Vertex     Vertex;\n  typedef typename Connectivity::Halfedge   Halfedge;\n  typedef typename Connectivity::Edge       Edge;\n  typedef typename Connectivity::Face       Face;\n\n  typedef typename MeshItems::Point         Point;\n  typedef typename MeshItems::Normal        Normal;\n  typedef typename MeshItems::Color         Color;\n  typedef typename MeshItems::TexCoord1D    TexCoord1D;\n  typedef typename MeshItems::TexCoord2D    TexCoord2D;\n  typedef typename MeshItems::TexCoord3D    TexCoord3D;\n  typedef typename MeshItems::Scalar        Scalar;\n  typedef typename MeshItems::TextureIndex  TextureIndex;\n\n  typedef typename MeshItems::VertexData    VertexData;\n  typedef typename MeshItems::HalfedgeData  HalfedgeData;\n  typedef typename MeshItems::EdgeData      EdgeData;\n  typedef typename MeshItems::FaceData      FaceData;\n\n  typedef AttribKernelT<MeshItems,Connectivity>  AttribKernel;\n\n  enum Attribs  {\n    VAttribs = MeshItems::VAttribs,\n    HAttribs = MeshItems::HAttribs,\n    EAttribs = MeshItems::EAttribs,\n    FAttribs = MeshItems::FAttribs\n  };\n\n  typedef VPropHandleT<VertexData>              DataVPropHandle;\n  typedef HPropHandleT<HalfedgeData>            DataHPropHandle;\n  typedef EPropHandleT<EdgeData>                DataEPropHandle;\n  typedef FPropHandleT<FaceData>                DataFPropHandle;\n\npublic:\n\n  //-------------------------------------------------- constructor / destructor\n\n  AttribKernelT()\n  : refcount_vnormals_(0),\n    refcount_vcolors_(0),\n    refcount_vtexcoords1D_(0),\n    refcount_vtexcoords2D_(0),\n    refcount_vtexcoords3D_(0),\n    refcount_htexcoords1D_(0),\n    refcount_htexcoords2D_(0),\n    refcount_htexcoords3D_(0),\n    refcount_henormals_(0),\n    refcount_hecolors_(0),\n    refcount_ecolors_(0),\n    refcount_fnormals_(0),\n    refcount_fcolors_(0),\n    refcount_ftextureIndex_(0)\n  {\n    this->add_property( points_, \"v:points\" );\n\n    if (VAttribs & Attributes::Normal)\n      request_vertex_normals();\n\n    if (VAttribs & Attributes::Color)\n      request_vertex_colors();\n\n    if (VAttribs & Attributes::TexCoord1D)\n      request_vertex_texcoords1D();\n\n    if (VAttribs & Attributes::TexCoord2D)\n      request_vertex_texcoords2D();\n\n    if (VAttribs & Attributes::TexCoord3D)\n      request_vertex_texcoords3D();\n\n    if (HAttribs & Attributes::TexCoord1D)\n      request_halfedge_texcoords1D();\n\n    if (HAttribs & Attributes::TexCoord2D)\n      request_halfedge_texcoords2D();\n\n    if (HAttribs & Attributes::TexCoord3D)\n      request_halfedge_texcoords3D();\n\n    if (HAttribs & Attributes::Color)\n      request_halfedge_colors();\n\n    if (VAttribs & Attributes::Status)\n      Connectivity::request_vertex_status();\n\n    if (HAttribs & Attributes::Status)\n      Connectivity::request_halfedge_status();\n\n    if (HAttribs & Attributes::Normal)\n      request_halfedge_normals();\n\n    if (EAttribs & Attributes::Status)\n      Connectivity::request_edge_status();\n    \n    if (EAttribs & Attributes::Color)\n      request_edge_colors();\n\n    if (FAttribs & Attributes::Normal)\n      request_face_normals();\n\n    if (FAttribs & Attributes::Color)\n      request_face_colors();\n\n    if (FAttribs & Attributes::Status)\n      Connectivity::request_face_status();\n\n    if (FAttribs & Attributes::TextureIndex)\n      request_face_texture_index();\n\n    //FIXME: data properties might actually cost storage even\n    //if there are no data traits??\n    this->add_property(data_vpph_);\n    this->add_property(data_fpph_);\n    this->add_property(data_hpph_);\n    this->add_property(data_epph_);\n  }\n\n  virtual ~AttribKernelT()\n  {\n    // should remove properties, but this will be done in\n    // BaseKernel's destructor anyway...\n  }\n\n  /** Assignment from another mesh of \\em another type.\n      \\note All that's copied is connectivity and vertex positions.\n      All other information (like e.g. attributes or additional\n      elements from traits classes) is not copied.\n      \\note If you want to copy all information, including *custom* properties,\n      use PolyMeshT::operator=() instead.\n      TODO: version which copies standard properties specified by the user\n  */\n  template <class _AttribKernel>\n  void assign(const _AttribKernel& _other)\n  {\n    this->assign_connectivity(_other);\n    for (typename Connectivity::VertexIter v_it = Connectivity::vertices_begin();\n         v_it != Connectivity::vertices_end(); ++v_it)\n    {//assumes Point constructor supports cast from _AttribKernel::Point\n      set_point(*v_it, (Point)_other.point(*v_it));\n    }\n  }\n\n  //-------------------------------------------------------------------- points\n\n  const Point* points() const\n  { return this->property(points_).data(); }\n\n  const Point& point(VertexHandle _vh) const\n  { return this->property(points_, _vh); }\n\n  Point& point(VertexHandle _vh)\n  { return this->property(points_, _vh); }\n\n  void set_point(VertexHandle _vh, const Point& _p)\n  { this->property(points_, _vh) = _p; }\n\n\n  //------------------------------------------------------------ vertex normals\n\n  const Normal* vertex_normals() const\n  { return this->property(vertex_normals_).data(); }\n\n  const Normal& normal(VertexHandle _vh) const\n  { return this->property(vertex_normals_, _vh); }\n\n  void set_normal(VertexHandle _vh, const Normal& _n)\n  { this->property(vertex_normals_, _vh) = _n; }\n\n\n  //------------------------------------------------------------- vertex colors\n\n  const Color* vertex_colors() const\n  { return this->property(vertex_colors_).data(); }\n\n  const Color& color(VertexHandle _vh) const\n  { return this->property(vertex_colors_, _vh); }\n\n  void set_color(VertexHandle _vh, const Color& _c)\n  { this->property(vertex_colors_, _vh) = _c; }\n\n\n  //------------------------------------------------------- vertex 1D texcoords\n\n  const TexCoord1D* texcoords1D() const {\n    return this->property(vertex_texcoords1D_).data();\n  }\n\n  const TexCoord1D& texcoord1D(VertexHandle _vh) const {\n    return this->property(vertex_texcoords1D_, _vh);\n  }\n\n  void set_texcoord1D(VertexHandle _vh, const TexCoord1D& _t) {\n    this->property(vertex_texcoords1D_, _vh) = _t;\n  }\n\n\n  //------------------------------------------------------- vertex 2D texcoords\n\n  const TexCoord2D* texcoords2D() const {\n    return this->property(vertex_texcoords2D_).data();\n  }\n\n  const TexCoord2D& texcoord2D(VertexHandle _vh) const {\n    return this->property(vertex_texcoords2D_, _vh);\n  }\n\n  void set_texcoord2D(VertexHandle _vh, const TexCoord2D& _t) {\n    this->property(vertex_texcoords2D_, _vh) = _t;\n  }\n\n\n  //------------------------------------------------------- vertex 3D texcoords\n\n  const TexCoord3D* texcoords3D() const {\n    return this->property(vertex_texcoords3D_).data();\n  }\n\n  const TexCoord3D& texcoord3D(VertexHandle _vh) const {\n    return this->property(vertex_texcoords3D_, _vh);\n  }\n\n  void set_texcoord3D(VertexHandle _vh, const TexCoord3D& _t) {\n    this->property(vertex_texcoords3D_, _vh) = _t;\n  }\n\n  //.------------------------------------------------------ halfedge 1D texcoords\n\n  const TexCoord1D* htexcoords1D() const {\n    return this->property(halfedge_texcoords1D_).data();\n  }\n\n  const TexCoord1D& texcoord1D(HalfedgeHandle _heh) const {\n    return this->property(halfedge_texcoords1D_, _heh);\n  }\n\n  void set_texcoord1D(HalfedgeHandle _heh, const TexCoord1D& _t) {\n    this->property(halfedge_texcoords1D_, _heh) = _t;\n  }\n\n\n  //------------------------------------------------------- halfedge 2D texcoords\n\n  const TexCoord2D* htexcoords2D() const {\n    return this->property(halfedge_texcoords2D_).data();\n  }\n\n  const TexCoord2D& texcoord2D(HalfedgeHandle _heh) const {\n    return this->property(halfedge_texcoords2D_, _heh);\n  }\n\n  void set_texcoord2D(HalfedgeHandle _heh, const TexCoord2D& _t) {\n    this->property(halfedge_texcoords2D_, _heh) = _t;\n  }\n\n\n  //------------------------------------------------------- halfedge 3D texcoords\n\n  const TexCoord3D* htexcoords3D() const {\n    return this->property(halfedge_texcoords3D_).data();\n  }\n\n  const TexCoord3D& texcoord3D(HalfedgeHandle _heh) const {\n    return this->property(halfedge_texcoords3D_, _heh);\n  }\n\n  void set_texcoord3D(HalfedgeHandle _heh, const TexCoord3D& _t) {\n    this->property(halfedge_texcoords3D_, _heh) = _t;\n  }\n  \n  //------------------------------------------------------------- edge colors\n  \n  const Color* edge_colors() const\n  { return this->property(edge_colors_).data(); }\n  \n  const Color& color(EdgeHandle _eh) const\n  { return this->property(edge_colors_, _eh); }\n  \n  void set_color(EdgeHandle _eh, const Color& _c)\n  { this->property(edge_colors_, _eh) = _c; }\n\n\n  //------------------------------------------------------------- halfedge normals\n\n  const Normal& normal(HalfedgeHandle _heh) const\n  { return this->property(halfedge_normals_, _heh); }\n\n  void set_normal(HalfedgeHandle _heh, const Normal& _n)\n  { this->property(halfedge_normals_, _heh) = _n; }\n\n\n  //------------------------------------------------------------- halfedge colors\n  \n  const Color* halfedge_colors() const\n  { return this->property(halfedge_colors_).data(); }\n  \n  const Color& color(HalfedgeHandle _heh) const\n  { return this->property(halfedge_colors_, _heh); }\n  \n  void set_color(HalfedgeHandle _heh, const Color& _c)\n  { this->property(halfedge_colors_, _heh) = _c; }\n\n  //-------------------------------------------------------------- face normals\n\n  const Normal& normal(FaceHandle _fh) const\n  { return this->property(face_normals_, _fh); }\n\n  void set_normal(FaceHandle _fh, const Normal& _n)\n  { this->property(face_normals_, _fh) = _n; }\n\n  //-------------------------------------------------------------- per Face Texture index\n\n  const TextureIndex& texture_index(FaceHandle _fh) const\n  { return this->property(face_texture_index_, _fh); }\n\n  void set_texture_index(FaceHandle _fh, const TextureIndex& _t)\n  { this->property(face_texture_index_, _fh) = _t; }\n\n  //--------------------------------------------------------------- face colors\n\n  const Color& color(FaceHandle _fh) const\n  { return this->property(face_colors_, _fh); }\n\n  void set_color(FaceHandle _fh, const Color& _c)\n  { this->property(face_colors_, _fh) = _c; }\n\n  //------------------------------------------------ request / alloc properties\n\n  void request_vertex_normals()\n  {\n    if (!refcount_vnormals_++)\n      this->add_property( vertex_normals_, \"v:normals\" );\n  }\n\n  void request_vertex_colors()\n  {\n    if (!refcount_vcolors_++)\n      this->add_property( vertex_colors_, \"v:colors\" );\n  }\n\n  void request_vertex_texcoords1D()\n  {\n    if (!refcount_vtexcoords1D_++)\n      this->add_property( vertex_texcoords1D_, \"v:texcoords1D\" );\n  }\n\n  void request_vertex_texcoords2D()\n  {\n    if (!refcount_vtexcoords2D_++)\n      this->add_property( vertex_texcoords2D_, \"v:texcoords2D\" );\n  }\n\n  void request_vertex_texcoords3D()\n  {\n    if (!refcount_vtexcoords3D_++)\n      this->add_property( vertex_texcoords3D_, \"v:texcoords3D\" );\n  }\n\n  void request_halfedge_texcoords1D()\n  {\n    if (!refcount_htexcoords1D_++)\n      this->add_property( halfedge_texcoords1D_, \"h:texcoords1D\" );\n  }\n\n  void request_halfedge_texcoords2D()\n  {\n    if (!refcount_htexcoords2D_++)\n      this->add_property( halfedge_texcoords2D_, \"h:texcoords2D\" );\n  }\n\n  void request_halfedge_texcoords3D()\n  {\n    if (!refcount_htexcoords3D_++)\n      this->add_property( halfedge_texcoords3D_, \"h:texcoords3D\" );\n  }\n  \n  void request_edge_colors()\n  {\n    if (!refcount_ecolors_++)\n      this->add_property( edge_colors_, \"e:colors\" );\n  }\n\n  void request_halfedge_normals()\n  {\n    if (!refcount_henormals_++)\n      this->add_property( halfedge_normals_, \"h:normals\" );\n  }\n\n  void request_halfedge_colors()\n  {\n    if (!refcount_hecolors_++)\n      this->add_property( halfedge_colors_, \"h:colors\" );\n  }\n\n  void request_face_normals()\n  {\n    if (!refcount_fnormals_++)\n      this->add_property( face_normals_, \"f:normals\" );\n  }\n\n  void request_face_colors()\n  {\n    if (!refcount_fcolors_++)\n      this->add_property( face_colors_, \"f:colors\" );\n  }\n\n  void request_face_texture_index()\n  {\n    if (!refcount_ftextureIndex_++)\n      this->add_property( face_texture_index_, \"f:textureindex\" );\n  }\n\n  //------------------------------------------------- release / free properties\n\n  void release_vertex_normals()\n  {\n    if ((refcount_vnormals_ > 0) && (! --refcount_vnormals_))\n      this->remove_property(vertex_normals_);\n  }\n\n  void release_vertex_colors()\n  {\n    if ((refcount_vcolors_ > 0) && (! --refcount_vcolors_))\n      this->remove_property(vertex_colors_);\n  }\n\n  void release_vertex_texcoords1D() {\n    if ((refcount_vtexcoords1D_ > 0) && (! --refcount_vtexcoords1D_))\n      this->remove_property(vertex_texcoords1D_);\n  }\n\n  void release_vertex_texcoords2D() {\n    if ((refcount_vtexcoords2D_ > 0) && (! --refcount_vtexcoords2D_))\n      this->remove_property(vertex_texcoords2D_);\n  }\n\n  void release_vertex_texcoords3D() {\n    if ((refcount_vtexcoords3D_ > 0) && (! --refcount_vtexcoords3D_))\n      this->remove_property(vertex_texcoords3D_);\n  }\n\n  void release_halfedge_texcoords1D() {\n    if ((refcount_htexcoords1D_ > 0) && (! --refcount_htexcoords1D_))\n      this->remove_property(halfedge_texcoords1D_);\n  }\n\n  void release_halfedge_texcoords2D() {\n    if ((refcount_htexcoords2D_ > 0) && (! --refcount_htexcoords2D_))\n      this->remove_property(halfedge_texcoords2D_);\n  }\n\n  void release_halfedge_texcoords3D() {\n    if ((refcount_htexcoords3D_ > 0) && (! --refcount_htexcoords3D_))\n      this->remove_property(halfedge_texcoords3D_);\n  }\n  \n  void release_edge_colors()\n  {\n      if ((refcount_ecolors_ > 0) && (! --refcount_ecolors_))\n          this->remove_property(edge_colors_);\n  }\n\n  void release_halfedge_normals()\n  {\n      if ((refcount_henormals_ > 0) && (! --refcount_henormals_))\n          this->remove_property(halfedge_normals_);\n  }\n\n  void release_halfedge_colors()\n  {\n      if ((refcount_hecolors_ > 0) && (! --refcount_hecolors_))\n          this->remove_property(halfedge_colors_);\n  }\n\n  void release_face_normals()\n  {\n    if ((refcount_fnormals_ > 0) && (! --refcount_fnormals_))\n      this->remove_property(face_normals_);\n  }\n\n  void release_face_colors()\n  {\n    if ((refcount_fcolors_ > 0) && (! --refcount_fcolors_))\n      this->remove_property(face_colors_);\n  }\n\n  void release_face_texture_index()\n  {\n    if ((refcount_ftextureIndex_ > 0) && (! --refcount_ftextureIndex_))\n      this->remove_property(face_texture_index_);\n  }\n\n  //---------------------------------------------- dynamic check for properties\n\n  bool has_vertex_normals()       const { return vertex_normals_.is_valid();      }\n  bool has_vertex_colors()        const { return vertex_colors_.is_valid();       }\n  bool has_vertex_texcoords1D()   const { return vertex_texcoords1D_.is_valid();  }\n  bool has_vertex_texcoords2D()   const { return vertex_texcoords2D_.is_valid();  }\n  bool has_vertex_texcoords3D()   const { return vertex_texcoords3D_.is_valid();  }\n  bool has_halfedge_texcoords1D() const { return halfedge_texcoords1D_.is_valid();}\n  bool has_halfedge_texcoords2D() const { return halfedge_texcoords2D_.is_valid();}\n  bool has_halfedge_texcoords3D() const { return halfedge_texcoords3D_.is_valid();}\n  bool has_edge_colors()          const { return edge_colors_.is_valid();         }\n  bool has_halfedge_normals()     const { return halfedge_normals_.is_valid();    }\n  bool has_halfedge_colors()      const { return halfedge_colors_.is_valid();     }\n  bool has_face_normals()         const { return face_normals_.is_valid();        }\n  bool has_face_colors()          const { return face_colors_.is_valid();         }\n  bool has_face_texture_index()   const { return face_texture_index_.is_valid();  }\n\npublic:\n\n  typedef VPropHandleT<Point>               PointsPropertyHandle;\n  typedef VPropHandleT<Normal>              VertexNormalsPropertyHandle;\n  typedef VPropHandleT<Color>               VertexColorsPropertyHandle;\n  typedef VPropHandleT<TexCoord1D>          VertexTexCoords1DPropertyHandle;\n  typedef VPropHandleT<TexCoord2D>          VertexTexCoords2DPropertyHandle;\n  typedef VPropHandleT<TexCoord3D>          VertexTexCoords3DPropertyHandle;\n  typedef HPropHandleT<TexCoord1D>          HalfedgeTexCoords1DPropertyHandle;\n  typedef HPropHandleT<TexCoord2D>          HalfedgeTexCoords2DPropertyHandle;\n  typedef HPropHandleT<TexCoord3D>          HalfedgeTexCoords3DPropertyHandle;\n  typedef EPropHandleT<Color>               EdgeColorsPropertyHandle;\n  typedef HPropHandleT<Normal>              HalfedgeNormalsPropertyHandle;\n  typedef HPropHandleT<Color>               HalfedgeColorsPropertyHandle;\n  typedef FPropHandleT<Normal>              FaceNormalsPropertyHandle;\n  typedef FPropHandleT<Color>               FaceColorsPropertyHandle;\n  typedef FPropHandleT<TextureIndex>        FaceTextureIndexPropertyHandle;\n\npublic:\n  //standard vertex properties\n  PointsPropertyHandle                      points_pph() const\n  { return points_; }\n\n  VertexNormalsPropertyHandle               vertex_normals_pph() const\n  { return vertex_normals_; }\n\n  VertexColorsPropertyHandle                vertex_colors_pph() const\n  { return vertex_colors_; }\n\n  VertexTexCoords1DPropertyHandle           vertex_texcoords1D_pph() const\n  { return vertex_texcoords1D_; }\n\n  VertexTexCoords2DPropertyHandle           vertex_texcoords2D_pph() const\n  { return vertex_texcoords2D_; }\n\n  VertexTexCoords3DPropertyHandle           vertex_texcoords3D_pph() const\n  { return vertex_texcoords3D_; }\n\n  //standard halfedge properties\n  HalfedgeTexCoords1DPropertyHandle           halfedge_texcoords1D_pph() const\n  { return halfedge_texcoords1D_; }\n\n  HalfedgeTexCoords2DPropertyHandle           halfedge_texcoords2D_pph() const\n  { return halfedge_texcoords2D_; }\n\n  HalfedgeTexCoords3DPropertyHandle           halfedge_texcoords3D_pph() const\n  { return halfedge_texcoords3D_; }\n\n  // standard edge properties\n  HalfedgeNormalsPropertyHandle              halfedge_normals_pph() const\n  { return halfedge_normals_; }\n\n\n  // standard edge properties\n  HalfedgeColorsPropertyHandle              halfedge_colors_pph() const\n  { return halfedge_colors_; }\n  \n  // standard edge properties\n  EdgeColorsPropertyHandle                  edge_colors_pph() const\n  { return edge_colors_; }\n\n  //standard face properties\n  FaceNormalsPropertyHandle                 face_normals_pph() const\n  { return face_normals_; }\n\n  FaceColorsPropertyHandle                  face_colors_pph() const\n  { return face_colors_; }\n\n  FaceTextureIndexPropertyHandle            face_texture_index_pph() const\n  { return face_texture_index_; }\n\n  VertexData&                               data(VertexHandle _vh)\n  { return this->property(data_vpph_, _vh); }\n\n  const VertexData&                         data(VertexHandle _vh) const\n  { return this->property(data_vpph_, _vh); }\n\n  FaceData&                                 data(FaceHandle _fh)\n  { return this->property(data_fpph_, _fh); }\n\n  const FaceData&                           data(FaceHandle _fh) const\n  { return this->property(data_fpph_, _fh); }\n\n  EdgeData&                                 data(EdgeHandle _eh)\n  { return this->property(data_epph_, _eh); }\n\n  const EdgeData&                           data(EdgeHandle _eh) const\n  { return this->property(data_epph_, _eh); }\n\n  HalfedgeData&                             data(HalfedgeHandle _heh)\n  { return this->property(data_hpph_, _heh); }\n\n  const HalfedgeData&                       data(HalfedgeHandle _heh) const\n  { return this->property(data_hpph_, _heh); }\n\nprivate:\n  //standard vertex properties\n  PointsPropertyHandle                      points_;\n  VertexNormalsPropertyHandle               vertex_normals_;\n  VertexColorsPropertyHandle                vertex_colors_;\n  VertexTexCoords1DPropertyHandle           vertex_texcoords1D_;\n  VertexTexCoords2DPropertyHandle           vertex_texcoords2D_;\n  VertexTexCoords3DPropertyHandle           vertex_texcoords3D_;\n  //standard halfedge properties\n  HalfedgeTexCoords1DPropertyHandle         halfedge_texcoords1D_;\n  HalfedgeTexCoords2DPropertyHandle         halfedge_texcoords2D_;\n  HalfedgeTexCoords3DPropertyHandle         halfedge_texcoords3D_;\n  HalfedgeNormalsPropertyHandle             halfedge_normals_;\n  HalfedgeColorsPropertyHandle              halfedge_colors_;\n  // standard edge properties\n  EdgeColorsPropertyHandle                  edge_colors_;\n  //standard face properties\n  FaceNormalsPropertyHandle                 face_normals_;\n  FaceColorsPropertyHandle                  face_colors_;\n  FaceTextureIndexPropertyHandle            face_texture_index_;\n  //data properties handles\n  DataVPropHandle                           data_vpph_;\n  DataHPropHandle                           data_hpph_;\n  DataEPropHandle                           data_epph_;\n  DataFPropHandle                           data_fpph_;\n\n  unsigned int                              refcount_vnormals_;\n  unsigned int                              refcount_vcolors_;\n  unsigned int                              refcount_vtexcoords1D_;\n  unsigned int                              refcount_vtexcoords2D_;\n  unsigned int                              refcount_vtexcoords3D_;\n  unsigned int                              refcount_htexcoords1D_;\n  unsigned int                              refcount_htexcoords2D_;\n  unsigned int                              refcount_htexcoords3D_;\n  unsigned int                              refcount_henormals_;\n  unsigned int                              refcount_hecolors_;\n  unsigned int                              refcount_ecolors_;\n  unsigned int                              refcount_fnormals_;\n  unsigned int                              refcount_fcolors_;\n  unsigned int                              refcount_ftextureIndex_;\n};\n\n//=============================================================================\n} // namespace OpenMesh\n//=============================================================================\n#endif // OPENMESH_ATTRIBKERNEL_HH defined\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Mesh/Attributes.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n/**\n    \\file Attributes.hh\n    This file provides some macros containing attribute usage.\n*/\n\n\n#ifndef OPENMESH_ATTRIBUTES_HH\n#define OPENMESH_ATTRIBUTES_HH\n\n\n//== INCLUDES =================================================================\n\n\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/Mesh/Status.hh>\n\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\nnamespace Attributes {\n\n\n//== CLASS DEFINITION  ========================================================\n\n/** Attribute bits\n *\n *  Use the bits to define a standard property at compile time using traits.\n *\n *  \\include traits5.cc\n *\n *  \\see \\ref mesh_type\n */\nenum AttributeBits\n{\n  None          = 0,  ///< Clear all attribute bits\n  Normal        = 1,  ///< Add normals to mesh item (vertices/faces)\n  Color         = 2,  ///< Add colors to mesh item (vertices/faces/edges)\n  PrevHalfedge  = 4,  ///< Add storage for previous halfedge (halfedges). The bit is set by default in the DefaultTraits.\n  Status        = 8,  ///< Add status to mesh item (all items)\n  TexCoord1D    = 16, ///< Add 1D texture coordinates (vertices, halfedges)\n  TexCoord2D    = 32, ///< Add 2D texture coordinates (vertices, halfedges)\n  TexCoord3D    = 64, ///< Add 3D texture coordinates (vertices, halfedges)\n  TextureIndex  = 128 ///< Add texture index (faces)\n};\n\n\n//=============================================================================\n} // namespace Attributes\n} // namespace OpenMesh\n//=============================================================================\n#endif // OPENMESH_ATTRIBUTES_HH defined\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Mesh/BaseKernel.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n#include <OpenMesh/Core/Mesh/BaseKernel.hh>\nnamespace OpenMesh\n{\n\nvoid BaseKernel::property_stats(std::ostream& _ostr) const\n{\n  const PropertyContainer::Properties& vps = vprops_.properties();\n  const PropertyContainer::Properties& hps = hprops_.properties();\n  const PropertyContainer::Properties& eps = eprops_.properties();\n  const PropertyContainer::Properties& fps = fprops_.properties();\n  const PropertyContainer::Properties& mps = mprops_.properties();\n\n  PropertyContainer::Properties::const_iterator it;\n\n  _ostr << vprops_.size() << \" vprops:\\n\";\n  for (it=vps.begin(); it!=vps.end(); ++it)\n  {\n    *it == NULL ? (void)(_ostr << \"[deleted]\" << \"\\n\") : (*it)->stats(_ostr);\n  }\n  _ostr << hprops_.size() << \" hprops:\\n\";\n  for (it=hps.begin(); it!=hps.end(); ++it)\n  {\n    *it == NULL ? (void)(_ostr << \"[deleted]\" << \"\\n\") : (*it)->stats(_ostr);\n  }\n  _ostr << eprops_.size() << \" eprops:\\n\";\n  for (it=eps.begin(); it!=eps.end(); ++it)\n  {\n    *it == NULL ? (void)(_ostr << \"[deleted]\" << \"\\n\") : (*it)->stats(_ostr);\n  }\n  _ostr << fprops_.size() << \" fprops:\\n\";\n  for (it=fps.begin(); it!=fps.end(); ++it)\n  {\n    *it == NULL ? (void)(_ostr << \"[deleted]\" << \"\\n\") : (*it)->stats(_ostr);\n  }\n  _ostr << mprops_.size() << \" mprops:\\n\";\n  for (it=mps.begin(); it!=mps.end(); ++it)\n  {\n    *it == NULL ? (void)(_ostr << \"[deleted]\" << \"\\n\") : (*it)->stats(_ostr);\n  }\n}\n\n\n\nvoid BaseKernel::vprop_stats( std::string& _string ) const\n{\n  _string.clear();\n\n  PropertyContainer::Properties::const_iterator it;\n  const PropertyContainer::Properties& vps = vprops_.properties();\n  for (it=vps.begin(); it!=vps.end(); ++it)\n    if ( *it == NULL )\n      _string += \"[deleted] \\n\";\n    else {\n      _string += (*it)->name();\n      _string += \"\\n\";\n    }\n\n}\n\nvoid BaseKernel::hprop_stats( std::string& _string ) const\n{\n  _string.clear();\n\n  PropertyContainer::Properties::const_iterator it;\n  const PropertyContainer::Properties& hps = hprops_.properties();\n  for (it=hps.begin(); it!=hps.end(); ++it)\n    if ( *it == NULL )\n      _string += \"[deleted] \\n\";\n    else {\n      _string += (*it)->name();\n      _string += \"\\n\";\n    }\n\n}\n\nvoid BaseKernel::eprop_stats( std::string& _string ) const\n{\n  _string.clear();\n\n  PropertyContainer::Properties::const_iterator it;\n  const PropertyContainer::Properties& eps = eprops_.properties();\n  for (it=eps.begin(); it!=eps.end(); ++it)\n    if ( *it == NULL )\n      _string += \"[deleted] \\n\";\n    else {\n      _string += (*it)->name();\n      _string += \"\\n\";\n    }\n\n}\nvoid BaseKernel::fprop_stats( std::string& _string ) const\n{\n  _string.clear();\n\n  PropertyContainer::Properties::const_iterator it;\n  const PropertyContainer::Properties& fps = fprops_.properties();\n  for (it=fps.begin(); it!=fps.end(); ++it)\n    if ( *it == NULL )\n      _string += \"[deleted] \\n\";\n    else {\n      _string += (*it)->name();\n      _string += \"\\n\";\n    }\n\n}\n\nvoid BaseKernel::mprop_stats( std::string& _string ) const\n{\n  _string.clear();\n\n  PropertyContainer::Properties::const_iterator it;\n  const PropertyContainer::Properties& mps = mprops_.properties();\n  for (it=mps.begin(); it!=mps.end(); ++it)\n    if ( *it == NULL )\n      _string += \"[deleted] \\n\";\n    else {\n      _string += (*it)->name();\n      _string += \"\\n\";\n    }\n\n}\n\nvoid BaseKernel::vprop_stats(std::ostream& _ostr ) const\n{\n  PropertyContainer::Properties::const_iterator it;\n  const PropertyContainer::Properties& vps = vprops_.properties();\n  for (it=vps.begin(); it!=vps.end(); ++it)\n    *it == NULL ? (void)(_ostr << \"[deleted]\" << \"\\n\") : (*it)->stats(_ostr);\n\n}\n\nvoid BaseKernel::hprop_stats(std::ostream& _ostr ) const\n{\n  PropertyContainer::Properties::const_iterator it;\n  const PropertyContainer::Properties& hps = hprops_.properties();\n  for (it=hps.begin(); it!=hps.end(); ++it)\n    *it == NULL ? (void)(_ostr << \"[deleted]\" << \"\\n\") : (*it)->stats(_ostr);\n\n}\nvoid BaseKernel::eprop_stats(std::ostream& _ostr ) const\n{\n  PropertyContainer::Properties::const_iterator it;\n  const PropertyContainer::Properties& eps = eprops_.properties();\n  for (it=eps.begin(); it!=eps.end(); ++it)\n    *it == NULL ? (void)(_ostr << \"[deleted]\" << \"\\n\") : (*it)->stats(_ostr);\n\n}\nvoid BaseKernel::fprop_stats(std::ostream& _ostr ) const\n{\n  PropertyContainer::Properties::const_iterator it;\n  const PropertyContainer::Properties& fps = fprops_.properties();\n  for (it=fps.begin(); it!=fps.end(); ++it)\n    *it == NULL ? (void)(_ostr << \"[deleted]\" << \"\\n\") : (*it)->stats(_ostr);\n\n}\nvoid BaseKernel::mprop_stats(std::ostream& _ostr ) const\n{\n  PropertyContainer::Properties::const_iterator it;\n  const PropertyContainer::Properties& mps = mprops_.properties();\n  for (it=mps.begin(); it!=mps.end(); ++it)\n    *it == NULL ? (void)(_ostr << \"[deleted]\" << \"\\n\") : (*it)->stats(_ostr);\n\n}\n\n\n}\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Mesh/BaseKernel.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  CLASS BaseKernel\n//\n//=============================================================================\n\n\n#ifndef OPENMESH_BASE_KERNEL_HH\n#define OPENMESH_BASE_KERNEL_HH\n\n\n//== INCLUDES =================================================================\n\n\n#include <OpenMesh/Core/System/config.h>\n// --------------------\n#include <vector>\n#include <string>\n#include <algorithm>\n// --------------------\n#include <OpenMesh/Core/Utils/PropertyContainer.hh>\n\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\n\n\n//== CLASS DEFINITION =========================================================\n\n/// This class provides the basic property management like adding/removing\n/// properties and access to properties.\n/// All operations provided by %BaseKernel need at least a property handle\n/// (VPropHandleT, EPropHandleT, HPropHandleT, FPropHandleT, MPropHandleT).\n/// which keeps the data type of the property, too.\n///\n/// There are two types of properties:\n/// -# Standard properties - mesh data (e.g. vertex normal or face color)\n/// -# Custom properties - user defined data\n///\n/// The differentiation is only semantically, technically both are\n/// equally handled. Therefore the methods provided by the %BaseKernel\n/// are applicable to both property types.\n///\n/// \\attention Since the class PolyMeshT derives from a kernel, hence all public\n/// elements of %BaseKernel are usable.\n\nclass OPENMESHDLLEXPORT BaseKernel\n{\npublic: //-------------------------------------------- constructor / destructor\n\n  BaseKernel() {}\n  virtual ~BaseKernel() {\n\tvprops_.clear();\n\teprops_.clear();\n\thprops_.clear();\n\tfprops_.clear();\n  }\n\n\npublic: //-------------------------------------------------- add new properties\n\n  /// \\name Add a property to a mesh item\n\n  //@{\n\n  /** Adds a property\n   *\n   *  Depending on the property handle type a vertex, (half-)edge, face or\n   *  mesh property is added to the mesh. If the action fails the handle\n   *  is invalid.\n   *  On success the handle must be used to access the property data with\n   *  property().\n   *\n   *  \\param  _ph   A property handle defining the data type to bind to mesh.\n   *                On success the handle is valid else invalid.\n   *  \\param  _name Optional name of property. Following restrictions apply\n   *                to the name:\n   *                -# Maximum length of name is 256 characters\n   *                -# The prefixes matching \"^[vhefm]:\" are reserved for\n   *                   internal usage.\n   *                -# The expression \"^<.*>$\" is reserved for internal usage.\n   *\n   */\n\n  template <class T>\n  void add_property( VPropHandleT<T>& _ph, const std::string& _name=\"<vprop>\")\n  {\n    _ph = VPropHandleT<T>( vprops_.add(T(), _name) );\n    vprops_.resize(n_vertices());\n  }\n\n  template <class T>\n  void add_property( HPropHandleT<T>& _ph, const std::string& _name=\"<hprop>\")\n  {\n    _ph = HPropHandleT<T>( hprops_.add(T(), _name) );\n    hprops_.resize(n_halfedges());\n  }\n\n  template <class T>\n  void add_property( EPropHandleT<T>& _ph, const std::string& _name=\"<eprop>\")\n  {\n    _ph = EPropHandleT<T>( eprops_.add(T(), _name) );\n    eprops_.resize(n_edges());\n  }\n\n  template <class T>\n  void add_property( FPropHandleT<T>& _ph, const std::string& _name=\"<fprop>\")\n  {\n    _ph = FPropHandleT<T>( fprops_.add(T(), _name) );\n    fprops_.resize(n_faces());\n  }\n\n  template <class T>\n  void add_property( MPropHandleT<T>& _ph, const std::string& _name=\"<mprop>\")\n  {\n    _ph = MPropHandleT<T>( mprops_.add(T(), _name) );\n    mprops_.resize(1);\n  }\n\n  //@}\n\n\npublic: //--------------------------------------------------- remove properties\n\n  /// \\name Removing a property from a mesh tiem\n  //@{\n\n  /** Remove a property.\n   *\n   *  Removes the property represented by the handle from the apropriate\n   *  mesh item.\n   *  \\param _ph Property to be removed. The handle is invalid afterwords.\n   */\n\n  template <typename T>\n  void remove_property(VPropHandleT<T>& _ph)\n  {\n    if (_ph.is_valid())\n      vprops_.remove(_ph);\n    _ph.reset();\n  }\n\n  template <typename T>\n  void remove_property(HPropHandleT<T>& _ph)\n  {\n    if (_ph.is_valid())\n      hprops_.remove(_ph);\n    _ph.reset();\n  }\n\n  template <typename T>\n  void remove_property(EPropHandleT<T>& _ph)\n  {\n    if (_ph.is_valid())\n      eprops_.remove(_ph);\n    _ph.reset();\n  }\n\n  template <typename T>\n  void remove_property(FPropHandleT<T>& _ph)\n  {\n    if (_ph.is_valid())\n      fprops_.remove(_ph);\n    _ph.reset();\n  }\n\n  template <typename T>\n  void remove_property(MPropHandleT<T>& _ph)\n  {\n    if (_ph.is_valid())\n      mprops_.remove(_ph);\n    _ph.reset();\n  }\n\n  //@}\n  \npublic: //------------------------------------------------ get handle from name\n\n  /// \\name Get property handle by name\n  //@{\n\n  /** Retrieves the handle to a named property by it's name.\n   *\n   *  \\param _ph    A property handle. On success the handle is valid else\n   *                invalid.\n   *  \\param _name  Name of wanted property.\n   *  \\return \\c true if such a named property is available, else \\c false.\n   */\n\n  template <class T>\n  bool get_property_handle(VPropHandleT<T>& _ph,\n         const std::string& _name) const\n  {\n    return (_ph = VPropHandleT<T>(vprops_.handle(T(), _name))).is_valid();\n  }\n\n  template <class T>\n  bool get_property_handle(HPropHandleT<T>& _ph,\n         const std::string& _name) const\n  {\n    return (_ph = HPropHandleT<T>(hprops_.handle(T(), _name))).is_valid();\n  }\n\n  template <class T>\n  bool get_property_handle(EPropHandleT<T>& _ph,\n         const std::string& _name) const\n  {\n    return (_ph = EPropHandleT<T>(eprops_.handle(T(), _name))).is_valid();\n  }\n\n  template <class T>\n  bool get_property_handle(FPropHandleT<T>& _ph,\n         const std::string& _name) const\n  {\n    return (_ph = FPropHandleT<T>(fprops_.handle(T(), _name))).is_valid();\n  }\n\n  template <class T>\n  bool get_property_handle(MPropHandleT<T>& _ph,\n         const std::string& _name) const\n  {\n    return (_ph = MPropHandleT<T>(mprops_.handle(T(), _name))).is_valid();\n  }\n\n  //@}\n\npublic: //--------------------------------------------------- access properties\n\n  /// \\name Access a property\n  //@{\n\n  /** Access a property\n   *\n   *  This method returns a reference to property. The property handle\n   *  must be valid! The result is unpredictable if the handle is invalid!\n   *\n   *  \\param  _ph     A \\em valid (!) property handle.\n   *  \\return The wanted property if the handle is valid.\n   */\n\n  template <class T>\n  PropertyT<T>& property(VPropHandleT<T> _ph) {\n    return vprops_.property(_ph);\n  }\n  template <class T>\n  const PropertyT<T>& property(VPropHandleT<T> _ph) const {\n    return vprops_.property(_ph);\n  }\n\n  template <class T>\n  PropertyT<T>& property(HPropHandleT<T> _ph) {\n    return hprops_.property(_ph);\n  }\n  template <class T>\n  const PropertyT<T>& property(HPropHandleT<T> _ph) const {\n    return hprops_.property(_ph);\n  }\n\n  template <class T>\n  PropertyT<T>& property(EPropHandleT<T> _ph) {\n    return eprops_.property(_ph);\n  }\n  template <class T>\n  const PropertyT<T>& property(EPropHandleT<T> _ph) const {\n    return eprops_.property(_ph);\n  }\n\n  template <class T>\n  PropertyT<T>& property(FPropHandleT<T> _ph) {\n    return fprops_.property(_ph);\n  }\n  template <class T>\n  const PropertyT<T>& property(FPropHandleT<T> _ph) const {\n    return fprops_.property(_ph);\n  }\n\n  template <class T>\n  PropertyT<T>& mproperty(MPropHandleT<T> _ph) {\n    return mprops_.property(_ph);\n  }\n  template <class T>\n  const PropertyT<T>& mproperty(MPropHandleT<T> _ph) const {\n    return mprops_.property(_ph);\n  }\n\n  //@}\n\npublic: //-------------------------------------------- access property elements\n\n  /// \\name Access a property element using a handle to a mesh item\n  //@{\n\n  /** Return value of property for an item\n   */\n\n  template <class T>\n  typename VPropHandleT<T>::reference\n  property(VPropHandleT<T> _ph, VertexHandle _vh) {\n    return vprops_.property(_ph)[_vh.idx()];\n  }\n\n  template <class T>\n  typename VPropHandleT<T>::const_reference\n  property(VPropHandleT<T> _ph, VertexHandle _vh) const {\n    return vprops_.property(_ph)[_vh.idx()];\n  }\n\n\n  template <class T>\n  typename HPropHandleT<T>::reference\n  property(HPropHandleT<T> _ph, HalfedgeHandle _hh) {\n    return hprops_.property(_ph)[_hh.idx()];\n  }\n\n  template <class T>\n  typename HPropHandleT<T>::const_reference\n  property(HPropHandleT<T> _ph, HalfedgeHandle _hh) const {\n    return hprops_.property(_ph)[_hh.idx()];\n  }\n\n\n  template <class T>\n  typename EPropHandleT<T>::reference\n  property(EPropHandleT<T> _ph, EdgeHandle _eh) {\n    return eprops_.property(_ph)[_eh.idx()];\n  }\n\n  template <class T>\n  typename EPropHandleT<T>::const_reference\n  property(EPropHandleT<T> _ph, EdgeHandle _eh) const {\n    return eprops_.property(_ph)[_eh.idx()];\n  }\n\n\n  template <class T>\n  typename FPropHandleT<T>::reference\n  property(FPropHandleT<T> _ph, FaceHandle _fh) {\n    return fprops_.property(_ph)[_fh.idx()];\n  }\n\n  template <class T>\n  typename FPropHandleT<T>::const_reference\n  property(FPropHandleT<T> _ph, FaceHandle _fh) const {\n    return fprops_.property(_ph)[_fh.idx()];\n  }\n\n\n  template <class T>\n  typename MPropHandleT<T>::reference\n  property(MPropHandleT<T> _ph) {\n    return mprops_.property(_ph)[0];\n  }\n\n  template <class T>\n  typename MPropHandleT<T>::const_reference\n  property(MPropHandleT<T> _ph) const {\n    return mprops_.property(_ph)[0];\n  }\n\n  //@}\n\n\npublic: //------------------------------------------------ copy property\n\n  /** Copies a single property from one mesh element to another (of the same type)\n   *\n   * @param _ph       A vertex property handle\n   * @param _vh_from  From vertex handle\n   * @param _vh_to    To vertex handle\n   */\n  template <class T>\n  void copy_property(VPropHandleT<T>& _ph, VertexHandle _vh_from, VertexHandle _vh_to) {\n    if(_vh_from.is_valid() && _vh_to.is_valid())\n      vprops_.property(_ph)[_vh_to.idx()] = vprops_.property(_ph)[_vh_from.idx()];\n  }\n\n  /** Copies a single property from one mesh element to another (of the same type)\n    *\n    * @param _ph       A halfedge property handle\n    * @param _hh_from  From halfedge handle\n    * @param _hh_to    To halfedge handle\n    */\n  template <class T>\n  void copy_property(HPropHandleT<T> _ph, HalfedgeHandle _hh_from, HalfedgeHandle _hh_to) {\n    if(_hh_from.is_valid() && _hh_to.is_valid())\n      hprops_.property(_ph)[_hh_to.idx()] = hprops_.property(_ph)[_hh_from.idx()];\n  }\n\n  /** Copies a single property from one mesh element to another (of the same type)\n    *\n    * @param _ph       An edge property handle\n    * @param _eh_from  From edge handle\n    * @param _eh_to    To edge handle\n    */\n  template <class T>\n  void copy_property(EPropHandleT<T> _ph, EdgeHandle _eh_from, EdgeHandle _eh_to) {\n    if(_eh_from.is_valid() && _eh_to.is_valid())\n      eprops_.property(_ph)[_eh_to.idx()] = eprops_.property(_ph)[_eh_from.idx()];\n  }\n\n  /** Copies a single property from one mesh element to another (of the same type)\n    *\n    * @param _ph       A face property handle\n    * @param _fh_from  From face handle\n    * @param _fh_to    To face handle\n    */\n  template <class T>\n  void copy_property(FPropHandleT<T> _ph, FaceHandle _fh_from, FaceHandle _fh_to) {\n    if(_fh_from.is_valid() && _fh_to.is_valid())\n      fprops_.property(_ph)[_fh_to.idx()] = fprops_.property(_ph)[_fh_from.idx()];\n  }\n\n\npublic:\n  //------------------------------------------------ copy all properties\n\n  /** Copies all properties from one mesh element to another (of the same type)\n   *\n   *\n   * @param _vh_from A vertex handle - source\n   * @param _vh_to   A vertex handle - target\n   * @param _copyBuildIn Should the internal properties (position, normal, texture coordinate,..) be copied?\n   */\n  void copy_all_properties(VertexHandle _vh_from, VertexHandle _vh_to, bool _copyBuildIn = false) {\n\n    for( PropertyContainer::iterator p_it = vprops_.begin();\n        p_it != vprops_.end(); ++p_it) {\n\n      // Copy all properties, if build in is true\n      // Otherwise, copy only properties without build in specifier\n      if ( *p_it && ( _copyBuildIn || (*p_it)->name().substr(0,2) != \"v:\" ) )\n        (*p_it)->copy(_vh_from.idx(), _vh_to.idx());\n\n    }\n  }\n\n  /** Copies all properties from one mesh element to another (of the same type)\n   *\n   * @param _hh_from A halfedge handle - source\n   * @param _hh_to   A halfedge handle - target\n   * @param _copyBuildIn Should the internal properties (position, normal, texture coordinate,..) be copied?\n   */\n  void copy_all_properties(HalfedgeHandle _hh_from, HalfedgeHandle _hh_to, bool _copyBuildIn = false) {\n\n    for( PropertyContainer::iterator p_it = hprops_.begin();\n        p_it != hprops_.end(); ++p_it) {\n\n      // Copy all properties, if build in is true\n      // Otherwise, copy only properties without build in specifier\n      if ( *p_it && ( _copyBuildIn || (*p_it)->name().substr(0,2) != \"h:\") )\n        (*p_it)->copy(_hh_from.idx(), _hh_to.idx());\n\n    }\n  }\n\n  /** Copies all properties from one mesh element to another (of the same type)\n   *\n   * @param _eh_from An edge handle - source\n   * @param _eh_to   An edge handle - target\n   * @param _copyBuildIn Should the internal properties (position, normal, texture coordinate,..) be copied?\n   */\n  void copy_all_properties(EdgeHandle _eh_from, EdgeHandle _eh_to, bool _copyBuildIn = false) {\n    for( PropertyContainer::iterator p_it = eprops_.begin();\n        p_it != eprops_.end(); ++p_it) {\n\n      // Copy all properties, if build in is true\n      // Otherwise, copy only properties without build in specifier\n      if ( *p_it && ( _copyBuildIn || (*p_it)->name().substr(0,2) != \"e:\") )\n        (*p_it)->copy(_eh_from.idx(), _eh_to.idx());\n\n    }\n  }\n\n  /** Copies all properties from one mesh element to another (of the same type)\n    *\n    * @param _fh_from A face handle - source\n    * @param _fh_to   A face handle - target\n    * @param _copyBuildIn Should the internal properties (position, normal, texture coordinate,..) be copied?\n    *\n    */\n  void copy_all_properties(FaceHandle _fh_from, FaceHandle _fh_to, bool _copyBuildIn = false) {\n\n    for( PropertyContainer::iterator p_it = fprops_.begin();\n        p_it != fprops_.end(); ++p_it) {\n\n      // Copy all properties, if build in is true\n      // Otherwise, copy only properties without build in specifier\n      if ( *p_it && ( _copyBuildIn || (*p_it)->name().substr(0,2) != \"f:\") )\n        (*p_it)->copy(_fh_from.idx(), _fh_to.idx());\n    }\n\n  }\n\nprotected: //------------------------------------------------- low-level access\n\npublic: // used by non-native kernel and MeshIO, should be protected\n\n  size_t n_vprops(void) const { return vprops_.size(); }\n\n  size_t n_eprops(void) const { return eprops_.size(); }\n\n  size_t n_hprops(void) const { return hprops_.size(); }\n\n  size_t n_fprops(void) const { return fprops_.size(); }\n\n  size_t n_mprops(void) const { return mprops_.size(); }\n\n  BaseProperty* _get_vprop( const std::string& _name)\n  { return vprops_.property(_name); }\n\n  BaseProperty* _get_eprop( const std::string& _name)\n  { return eprops_.property(_name); }\n\n  BaseProperty* _get_hprop( const std::string& _name)\n  { return hprops_.property(_name); }\n\n  BaseProperty* _get_fprop( const std::string& _name)\n  { return fprops_.property(_name); }\n\n  BaseProperty* _get_mprop( const std::string& _name)\n  { return mprops_.property(_name); }\n\n  const BaseProperty* _get_vprop( const std::string& _name) const\n  { return vprops_.property(_name); }\n\n  const BaseProperty* _get_eprop( const std::string& _name) const\n  { return eprops_.property(_name); }\n\n  const BaseProperty* _get_hprop( const std::string& _name) const\n  { return hprops_.property(_name); }\n\n  const BaseProperty* _get_fprop( const std::string& _name) const\n  { return fprops_.property(_name); }\n\n  const BaseProperty* _get_mprop( const std::string& _name) const\n  { return mprops_.property(_name); }\n\n  BaseProperty& _vprop( size_t _idx ) { return vprops_._property( _idx ); }\n  BaseProperty& _eprop( size_t _idx ) { return eprops_._property( _idx ); }\n  BaseProperty& _hprop( size_t _idx ) { return hprops_._property( _idx ); }\n  BaseProperty& _fprop( size_t _idx ) { return fprops_._property( _idx ); }\n  BaseProperty& _mprop( size_t _idx ) { return mprops_._property( _idx ); }\n\n  const BaseProperty& _vprop( size_t _idx ) const\n  { return vprops_._property( _idx ); }\n  const BaseProperty& _eprop( size_t _idx ) const\n  { return eprops_._property( _idx ); }\n  const BaseProperty& _hprop( size_t _idx ) const\n  { return hprops_._property( _idx ); }\n  const BaseProperty& _fprop( size_t _idx ) const\n  { return fprops_._property( _idx ); }\n  const BaseProperty& _mprop( size_t _idx ) const\n  { return mprops_._property( _idx ); }\n\n  size_t _add_vprop( BaseProperty* _bp ) { return vprops_._add( _bp ); }\n  size_t _add_eprop( BaseProperty* _bp ) { return eprops_._add( _bp ); }\n  size_t _add_hprop( BaseProperty* _bp ) { return hprops_._add( _bp ); }\n  size_t _add_fprop( BaseProperty* _bp ) { return fprops_._add( _bp ); }\n  size_t _add_mprop( BaseProperty* _bp ) { return mprops_._add( _bp ); }\n\nprotected: // low-level access non-public\n\n  BaseProperty& _vprop( BaseHandle _h )\n  { return vprops_._property( _h.idx() ); }\n  BaseProperty& _eprop( BaseHandle _h )\n  { return eprops_._property( _h.idx() ); }\n  BaseProperty& _hprop( BaseHandle _h )\n  { return hprops_._property( _h.idx() ); }\n  BaseProperty& _fprop( BaseHandle _h )\n  { return fprops_._property( _h.idx() ); }\n  BaseProperty& _mprop( BaseHandle _h )\n  { return mprops_._property( _h.idx() ); }\n\n  const BaseProperty& _vprop( BaseHandle _h ) const\n  { return vprops_._property( _h.idx() ); }\n  const BaseProperty& _eprop( BaseHandle _h ) const\n  { return eprops_._property( _h.idx() ); }\n  const BaseProperty& _hprop( BaseHandle _h ) const\n  { return hprops_._property( _h.idx() ); }\n  const BaseProperty& _fprop( BaseHandle _h ) const\n  { return fprops_._property( _h.idx() ); }\n  const BaseProperty& _mprop( BaseHandle _h ) const\n  { return mprops_._property( _h.idx() ); }\n\n\npublic: //----------------------------------------------------- element numbers\n\n\n  virtual size_t n_vertices()  const { return 0; }\n  virtual size_t n_halfedges() const { return 0; }\n  virtual size_t n_edges()     const { return 0; }\n  virtual size_t n_faces()     const { return 0; }\n\n\nprotected: //------------------------------------------- synchronize properties\n\n  void vprops_reserve(size_t _n) const { vprops_.reserve(_n); }\n  void vprops_resize(size_t _n) const { vprops_.resize(_n); }\n  void vprops_clear() {\n    vprops_.clear();\n  }\n  void vprops_swap(unsigned int _i0, unsigned int _i1) const {\n    vprops_.swap(_i0, _i1);\n  }\n\n  void hprops_reserve(size_t _n) const { hprops_.reserve(_n); }\n  void hprops_resize(size_t _n) const { hprops_.resize(_n); }\n  void hprops_clear() {\n    hprops_.clear();\n  }\n  void hprops_swap(unsigned int _i0, unsigned int _i1) const {\n    hprops_.swap(_i0, _i1);\n  }\n\n  void eprops_reserve(size_t _n) const { eprops_.reserve(_n); }\n  void eprops_resize(size_t _n) const { eprops_.resize(_n); }\n  void eprops_clear() {\n    eprops_.clear();\n  }\n  void eprops_swap(unsigned int _i0, unsigned int _i1) const {\n    eprops_.swap(_i0, _i1);\n  }\n\n  void fprops_reserve(size_t _n) const { fprops_.reserve(_n); }\n  void fprops_resize(size_t _n) const { fprops_.resize(_n); }\n  void fprops_clear() {\n    fprops_.clear();\n  }\n  void fprops_swap(unsigned int _i0, unsigned int _i1) const {\n    fprops_.swap(_i0, _i1);\n  }\n\n  void mprops_resize(size_t _n) const { mprops_.resize(_n); }\n  void mprops_clear() {\n    mprops_.clear();\n  }\n\npublic:\n\n  void property_stats(std::ostream& _ostr = std::clog) const;\n\n  void vprop_stats( std::string& _string ) const;\n  void hprop_stats( std::string& _string ) const;\n  void eprop_stats( std::string& _string ) const;\n  void fprop_stats( std::string& _string ) const;\n  void mprop_stats( std::string& _string ) const;\n\n  void vprop_stats(std::ostream& _ostr = std::clog) const;\n  void hprop_stats(std::ostream& _ostr = std::clog) const;\n  void eprop_stats(std::ostream& _ostr = std::clog) const;\n  void fprop_stats(std::ostream& _ostr = std::clog) const;\n  void mprop_stats(std::ostream& _ostr = std::clog) const;\n\npublic:\n\n  typedef PropertyContainer::iterator prop_iterator;\n  typedef PropertyContainer::const_iterator const_prop_iterator;\n\n  prop_iterator vprops_begin() { return vprops_.begin(); }\n  prop_iterator vprops_end()   { return vprops_.end(); }\n  const_prop_iterator vprops_begin() const { return vprops_.begin(); }\n  const_prop_iterator vprops_end()   const { return vprops_.end(); }\n\n  prop_iterator eprops_begin() { return eprops_.begin(); }\n  prop_iterator eprops_end()   { return eprops_.end(); }\n  const_prop_iterator eprops_begin() const { return eprops_.begin(); }\n  const_prop_iterator eprops_end()   const { return eprops_.end(); }\n\n  prop_iterator hprops_begin() { return hprops_.begin(); }\n  prop_iterator hprops_end()   { return hprops_.end(); }\n  const_prop_iterator hprops_begin() const { return hprops_.begin(); }\n  const_prop_iterator hprops_end()   const { return hprops_.end(); }\n\n  prop_iterator fprops_begin() { return fprops_.begin(); }\n  prop_iterator fprops_end()   { return fprops_.end(); }\n  const_prop_iterator fprops_begin() const { return fprops_.begin(); }\n  const_prop_iterator fprops_end()   const { return fprops_.end(); }\n\n  prop_iterator mprops_begin() { return mprops_.begin(); }\n  prop_iterator mprops_end()   { return mprops_.end(); }\n  const_prop_iterator mprops_begin() const { return mprops_.begin(); }\n  const_prop_iterator mprops_end()   const { return mprops_.end(); }\n\nprivate:\n\n  PropertyContainer  vprops_;\n  PropertyContainer  hprops_;\n  PropertyContainer  eprops_;\n  PropertyContainer  fprops_;\n  PropertyContainer  mprops_;\n};\n\n\n//=============================================================================\n} // namespace OpenMesh\n//=============================================================================\n#endif // OPENMESH_BASE_KERNEL_HH defined\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Mesh/BaseMesh.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  CLASS BaseMesh\n//\n//=============================================================================\n\n\n#ifndef OPENMESH_BASEMESH_HH\n#define OPENMESH_BASEMESH_HH\n\n\n//== INCLUDES =================================================================\n\n\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/Mesh/IteratorsT.hh>\n#include <OpenMesh/Core/Mesh/CirculatorsT.hh>\n#include <OpenMesh/Core/Mesh/Attributes.hh>\n#include <vector>\n\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\n\n\n//== CLASS DEFINITION =========================================================\n\n\n/** \\class BaseMesh BaseMesh.hh <OpenMesh/Mesh/BaseMesh.hh>\n\n    Base class for all meshes.\n*/\n\nclass BaseMesh {\npublic:\n  virtual ~BaseMesh(void) {;}\n};\n\n\n//=============================================================================\n} // namespace OpenMesh\n//=============================================================================\n\n//=============================================================================\n#endif // OPENMESH_BASEMESH_HH defined\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Mesh/Casts.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n#ifndef OPENMESH_CASTS_HH\n#define OPENMESH_CASTS_HH\n//== INCLUDES =================================================================\n\n#include <OpenMesh/Core/Mesh/PolyMesh_ArrayKernelT.hh>\n#include <OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh>\n\n//== NAMESPACES ===============================================================\nnamespace OpenMesh \n{\n\ntemplate <class Traits>\ninline TriMesh_ArrayKernelT<Traits>& TRIMESH_CAST(PolyMesh_ArrayKernelT<Traits>& _poly_mesh)\n{ return reinterpret_cast< TriMesh_ArrayKernelT<Traits>& >(_poly_mesh); }\n\ntemplate <class Traits>\ninline const TriMesh_ArrayKernelT<Traits>& TRIMESH_CAST(const PolyMesh_ArrayKernelT<Traits>& _poly_mesh)\n{ return reinterpret_cast< const TriMesh_ArrayKernelT<Traits>& >(_poly_mesh); }\n\ntemplate <class Traits>\ninline PolyMesh_ArrayKernelT<Traits>& POLYMESH_CAST(TriMesh_ArrayKernelT<Traits>& _tri_mesh)\n{ return reinterpret_cast< PolyMesh_ArrayKernelT<Traits>& >(_tri_mesh); }\n\ntemplate <class Traits>\ninline const PolyMesh_ArrayKernelT<Traits>& POLYMESH_CAST(const TriMesh_ArrayKernelT<Traits>& _tri_mesh)\n{ return reinterpret_cast< const PolyMesh_ArrayKernelT<Traits>& >(_tri_mesh); }\n\n};\n#endif//OPENMESH_CASTS_HH\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Mesh/CirculatorsT.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n#ifndef OPENMESH_CIRCULATORS_HH\n#define OPENMESH_CIRCULATORS_HH\n//=============================================================================\n//\n//  Vertex and Face circulators for PolyMesh/TriMesh\n//\n//=============================================================================\n\n\n\n//== INCLUDES =================================================================\n\n#include <OpenMesh/Core/System/config.h>\n#include <cassert>\n#include <cstddef>\n#include <iterator>\n\n//== NAMESPACES ===============================================================\n\nnamespace OpenMesh {\nnamespace Iterators {\n\ntemplate<class Mesh, class CenterEntityHandle>\nclass GenericCirculator_CenterEntityFnsT {\n    public:\n        static void increment(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter);\n        static void decrement(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter);\n};\n\ntemplate<class Mesh>\nclass GenericCirculator_CenterEntityFnsT<Mesh, typename Mesh::VertexHandle> {\n    public:\n        inline static void increment(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) {\n            heh = mesh->cw_rotated_halfedge_handle(heh);\n            if (heh == start) ++lap_counter;\n        }\n        inline static void decrement(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) {\n            if (heh == start) --lap_counter;\n            heh = mesh->ccw_rotated_halfedge_handle(heh);\n        }\n};\n\ntemplate<class Mesh>\nclass GenericCirculator_CenterEntityFnsT<Mesh, typename Mesh::FaceHandle> {\n    public:\n        inline static void increment(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) {\n            heh = mesh->next_halfedge_handle(heh);\n            if (heh == start) ++lap_counter;\n        }\n        inline static void decrement(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) {\n            if (heh == start) --lap_counter;\n            heh = mesh->prev_halfedge_handle(heh);\n        }\n};\n\ntemplate<class Mesh, class CenterEntityHandle, class ValueHandle>\nclass GenericCirculator_DereferenciabilityCheckT {\n    public:\n        //inline static bool isDereferenciable(const Mesh *mesh, const typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, const int &lap_counter);\n};\n\ntemplate<class Mesh>\nclass GenericCirculator_DereferenciabilityCheckT<Mesh, typename Mesh::FaceHandle, typename Mesh::FaceHandle> {\n    public:\n        inline static bool isDereferenciable(const Mesh *mesh, const typename Mesh::HalfedgeHandle &heh) {\n            return mesh->face_handle(mesh->opposite_halfedge_handle(heh)).is_valid();\n        }\n};\n\ntemplate<class Mesh>\nclass GenericCirculator_DereferenciabilityCheckT<Mesh, typename Mesh::VertexHandle, typename Mesh::FaceHandle> {\n    public:\n        inline static bool isDereferenciable(const Mesh *mesh, const typename Mesh::HalfedgeHandle &heh) {\n            return mesh->face_handle(heh).is_valid();\n        }\n};\n\ntemplate<class Mesh, class CenterEntityHandle, class ValueHandle>\nclass GenericCirculator_ValueHandleFnsT {\n    public:\n        inline static bool is_valid(const typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, const int &lap_counter) {\n            return heh.is_valid() && ((start != heh) || (lap_counter == 0));\n        }\n        inline static void init(const Mesh*, typename Mesh::HalfedgeHandle&, typename Mesh::HalfedgeHandle&, int&) {};\n        inline static void increment(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) {\n            GenericCirculator_CenterEntityFnsT<Mesh, CenterEntityHandle>::increment(mesh, heh, start, lap_counter);\n        }\n        inline static void decrement(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) {\n            GenericCirculator_CenterEntityFnsT<Mesh, CenterEntityHandle>::decrement(mesh, heh, start, lap_counter);\n        }\n};\n\ntemplate<class Mesh, class CenterEntityHandle>\nclass GenericCirculator_ValueHandleFnsT<Mesh, CenterEntityHandle, typename Mesh::FaceHandle> {\n    public:\n        typedef GenericCirculator_DereferenciabilityCheckT<Mesh, CenterEntityHandle, typename Mesh::FaceHandle> GenericCirculator_DereferenciabilityCheck;\n\n        inline static bool is_valid(const typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, const int &lap_counter) {\n            return heh.is_valid() && ((start != heh) || (lap_counter == 0));\n        }\n        inline static void init(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) {\n            if (heh.is_valid() && !GenericCirculator_DereferenciabilityCheck::isDereferenciable(mesh, heh) && lap_counter == 0)\n                increment(mesh, heh, start, lap_counter);\n        };\n        inline static void increment(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) {\n            do {\n                GenericCirculator_CenterEntityFnsT<Mesh, CenterEntityHandle>::increment(mesh, heh, start, lap_counter);\n            } while (is_valid(heh, start, lap_counter) && !GenericCirculator_DereferenciabilityCheck::isDereferenciable(mesh, heh));\n        }\n        inline static void decrement(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) {\n            do {\n                GenericCirculator_CenterEntityFnsT<Mesh, CenterEntityHandle>::decrement(mesh, heh, start, lap_counter);\n            } while (is_valid(heh, start, lap_counter) && !GenericCirculator_DereferenciabilityCheck::isDereferenciable(mesh, heh));\n        }\n};\n\ntemplate<class Mesh>\nclass GenericCirculatorBaseT {\n    public:\n        typedef const Mesh* mesh_ptr;\n        typedef const Mesh& mesh_ref;\n\n    public:\n        GenericCirculatorBaseT() : mesh_(0), lap_counter_(0) {}\n\n        GenericCirculatorBaseT(mesh_ref mesh, HalfedgeHandle heh, bool end = false) :\n            mesh_(&mesh), start_(heh), heh_(heh), lap_counter_(static_cast<int>(end)) {}\n\n        GenericCirculatorBaseT(const GenericCirculatorBaseT &rhs) :\n            mesh_(rhs.mesh_), start_(rhs.start_), heh_(rhs.heh_), lap_counter_(rhs.lap_counter_) {}\n\n        inline typename Mesh::FaceHandle toFaceHandle() const {\n            return mesh_->face_handle(heh_);\n        }\n\n        inline typename Mesh::FaceHandle toOppositeFaceHandle() const {\n            return mesh_->face_handle(toOppositeHalfedgeHandle());\n        }\n\n        inline typename Mesh::EdgeHandle toEdgeHandle() const {\n            return mesh_->edge_handle(heh_);\n        }\n\n        inline typename Mesh::HalfedgeHandle toHalfedgeHandle() const {\n            return heh_;\n        }\n\n        inline typename Mesh::HalfedgeHandle toOppositeHalfedgeHandle() const {\n            return mesh_->opposite_halfedge_handle(heh_);\n        }\n\n        inline typename Mesh::VertexHandle toVertexHandle() const {\n            return mesh_->to_vertex_handle(heh_);\n        }\n\n        inline GenericCirculatorBaseT &operator=(const GenericCirculatorBaseT &rhs) {\n            mesh_ = rhs.mesh_;\n            start_ = rhs.start_;\n            heh_ = rhs.heh_;\n            lap_counter_ = rhs.lap_counter_;\n            return *this;\n        }\n\n        inline bool operator==(const GenericCirculatorBaseT &rhs) const {\n            return mesh_ == rhs.mesh_ && start_ == rhs.start_ && heh_ == rhs.heh_ && lap_counter_ == rhs.lap_counter_;\n        }\n\n        inline bool operator!=(const GenericCirculatorBaseT &rhs) const {\n            return !operator==(rhs);\n        }\n\n    protected:\n        mesh_ptr mesh_;\n        typename Mesh::HalfedgeHandle start_, heh_;\n        int lap_counter_;\n};\n\ntemplate<class Mesh, class CenterEntityHandle, class ValueHandle,\n        ValueHandle (GenericCirculatorBaseT<Mesh>::*Handle2Value)() const>\nclass GenericCirculatorT : protected GenericCirculatorBaseT<Mesh> {\n    public:\n        typedef std::ptrdiff_t difference_type;\n        typedef ValueHandle value_type;\n        typedef const value_type& reference;\n        typedef const value_type* pointer;\n        typedef std::bidirectional_iterator_tag iterator_category;\n\n        typedef typename GenericCirculatorBaseT<Mesh>::mesh_ptr mesh_ptr;\n        typedef typename GenericCirculatorBaseT<Mesh>::mesh_ref mesh_ref;\n        typedef GenericCirculator_ValueHandleFnsT<Mesh, CenterEntityHandle, ValueHandle> GenericCirculator_ValueHandleFns;\n\n    public:\n        GenericCirculatorT() {}\n        GenericCirculatorT(mesh_ref mesh, CenterEntityHandle start, bool end = false) :\n            GenericCirculatorBaseT<Mesh>(mesh, mesh.halfedge_handle(start), end) {\n\n            GenericCirculator_ValueHandleFns::init(this->mesh_, this->heh_, this->start_, this->lap_counter_);\n        }\n        GenericCirculatorT(mesh_ref mesh, HalfedgeHandle heh, bool end = false) :\n            GenericCirculatorBaseT<Mesh>(mesh, heh, end) {\n\n            GenericCirculator_ValueHandleFns::init(this->mesh_, this->heh_, this->start_, this->lap_counter_);\n        }\n        GenericCirculatorT(const GenericCirculatorT &rhs) : GenericCirculatorBaseT<Mesh>(rhs) {}\n\n        GenericCirculatorT& operator++() {\n            assert(this->mesh_);\n            GenericCirculator_ValueHandleFns::increment(this->mesh_, this->heh_, this->start_, this->lap_counter_);\n            return *this;\n        }\n        GenericCirculatorT& operator--() {\n            assert(this->mesh_);\n            GenericCirculator_ValueHandleFns::decrement(this->mesh_, this->heh_, this->start_, this->lap_counter_);\n            return *this;\n        }\n\n        /// Post-increment\n        GenericCirculatorT operator++(int) {\n            assert(this->mesh_);\n            GenericCirculatorT cpy(*this);\n            ++(*this);\n            return cpy;\n        }\n\n        /// Post-decrement\n        GenericCirculatorT operator--(int) {\n            assert(this->mesh_);\n            GenericCirculatorT cpy(*this);\n            --(*this);\n            return cpy;\n        }\n\n        /// Standard dereferencing operator.\n        value_type operator*() const {\n#ifndef NDEBUG\n            assert(this->heh_.is_valid());\n            value_type res = (this->*Handle2Value)();\n            assert(res.is_valid());\n            return res;\n#else\n            return (this->*Handle2Value)();\n#endif\n        }\n\n        /**\n         * @brief Pointer dereferentiation.\n         *\n         * This returns a pointer which points to a handle\n         * that loses its validity once this dereferentiation is\n         * invoked again. Thus, do not store the result of\n         * this operation.\n         */\n        pointer operator->() const {\n            pointer_deref_value = **this;\n            return &pointer_deref_value;\n        }\n\n        GenericCirculatorT &operator=(const GenericCirculatorT &rhs) {\n            GenericCirculatorBaseT<Mesh>::operator=(rhs);\n            return *this;\n        };\n\n        bool operator==(const GenericCirculatorT &rhs) const {\n            return GenericCirculatorBaseT<Mesh>::operator==(rhs);\n        }\n\n        bool operator!=(const GenericCirculatorT &rhs) const {\n            return GenericCirculatorBaseT<Mesh>::operator!=(rhs);\n        }\n\n        bool is_valid() const {\n            return GenericCirculator_ValueHandleFns::is_valid(this->heh_, this->start_, this->lap_counter_);\n        }\n\n        DEPRECATED(\"current_halfedge_handle() is an implementation detail and should not be accessed from outside the iterator class.\")\n        /**\n         * \\deprecated\n         * current_halfedge_handle() is an implementation detail and should not\n         * be accessed from outside the iterator class.\n         */\n        const HalfedgeHandle &current_halfedge_handle() const {\n            return this->heh_;\n        }\n\n        DEPRECATED(\"Do not use this error prone implicit cast. Compare to end-iterator or use is_valid(), instead.\")\n        /**\n         * \\deprecated\n         * Do not use this error prone implicit cast. Compare to the\n         * end-iterator or use is_valid() instead.\n         */\n        operator bool() const {\n            return is_valid();\n        }\n\n        /**\n         * \\brief Return the handle of the current target.\n         * \\deprecated\n         * This function clutters your code. Use dereferencing operators -> and * instead.\n         */\n        DEPRECATED(\"This function clutters your code. Use dereferencing operators -> and * instead.\")\n        value_type handle() const {\n          return **this;\n        }\n\n        /**\n         * \\brief Cast to the handle of the current target.\n         * \\deprecated\n         * Implicit casts of iterators are unsafe. Use dereferencing operators\n         * -> and * instead.\n         */\n        DEPRECATED(\"Implicit casts of iterators are unsafe. Use dereferencing operators -> and * instead.\")\n        operator value_type() const {\n          return **this;\n        }\n\n        template<typename STREAM>\n        friend STREAM &operator<< (STREAM &s, const GenericCirculatorT &self) {\n            return s << self.mesh_ << \", \" << self.start_.idx() << \", \" << self.heh_.idx() << \", \" << self.lap_counter_;\n        }\n\n    private:\n        mutable value_type pointer_deref_value;\n};\n\n} // namespace Iterators\n} // namespace OpenMesh\n\n#endif\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Mesh/FinalMeshItemsT.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n#ifndef OPENMESH_MESH_ITEMS_HH\n#define OPENMESH_MESH_ITEMS_HH\n\n\n//== INCLUDES =================================================================\n\n\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/Utils/GenProg.hh>\n#include <OpenMesh/Core/Utils/vector_traits.hh>\n#include <OpenMesh/Core/Mesh/Handles.hh>\n\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\n\n\n//== CLASS DEFINITION =========================================================\n\n/// Definition of the mesh entities (items).\ntemplate <class Traits, bool IsTriMesh>\nstruct FinalMeshItemsT\n{\n  //--- build Refs structure ---\n#ifndef DOXY_IGNORE_THIS\n  struct Refs\n  {\n    typedef typename Traits::Point            Point;\n    typedef typename vector_traits<Point>::value_type Scalar;\n\n    typedef typename Traits::Normal           Normal;\n    typedef typename Traits::Color            Color;\n    typedef typename Traits::TexCoord1D       TexCoord1D;\n    typedef typename Traits::TexCoord2D       TexCoord2D;\n    typedef typename Traits::TexCoord3D       TexCoord3D;\n    typedef typename Traits::TextureIndex     TextureIndex;\n    typedef OpenMesh::VertexHandle            VertexHandle;\n    typedef OpenMesh::FaceHandle              FaceHandle;\n    typedef OpenMesh::EdgeHandle              EdgeHandle;\n    typedef OpenMesh::HalfedgeHandle          HalfedgeHandle;\n  };\n#endif\n  //--- export Refs types ---\n  typedef typename Refs::Point           Point;\n  typedef typename Refs::Scalar          Scalar;\n  typedef typename Refs::Normal          Normal;\n  typedef typename Refs::Color           Color;\n  typedef typename Refs::TexCoord1D      TexCoord1D;\n  typedef typename Refs::TexCoord2D      TexCoord2D;\n  typedef typename Refs::TexCoord3D      TexCoord3D;\n  typedef typename Refs::TextureIndex    TextureIndex;\n\n  //--- get attribute bits from Traits ---\n  enum Attribs\n  {\n    VAttribs = Traits::VertexAttributes,\n    HAttribs = Traits::HalfedgeAttributes,\n    EAttribs = Traits::EdgeAttributes,\n    FAttribs = Traits::FaceAttributes\n  };\n  //--- merge internal items with traits items ---\n\n\n/*\n  typedef typename GenProg::IF<\n    (bool)(HAttribs & Attributes::PrevHalfedge),\n    typename InternalItems::Halfedge_with_prev,\n    typename InternalItems::Halfedge_without_prev\n  >::Result   InternalHalfedge;\n*/\n  //typedef typename InternalItems::Vertex                     InternalVertex;\n  //typedef typename InternalItems::template Edge<Halfedge>      InternalEdge;\n  //typedef typename InternalItems::template Face<IsTriMesh>     InternalFace;\n  class ITraits\n  {};\n\n  typedef typename Traits::template VertexT<ITraits, Refs>      VertexData;\n  typedef typename Traits::template HalfedgeT<ITraits, Refs>    HalfedgeData;\n  typedef typename Traits::template EdgeT<ITraits, Refs>        EdgeData;\n  typedef typename Traits::template FaceT<ITraits, Refs>        FaceData;\n};\n\n\n#ifndef DOXY_IGNORE_THIS\nnamespace {\nnamespace TM {\ntemplate<typename Lhs, typename Rhs> struct TypeEquality;\ntemplate<typename Lhs> struct TypeEquality<Lhs, Lhs> {};\n\ntemplate<typename LhsTraits, typename RhsTraits> struct ItemsEquality {\n    TypeEquality<typename LhsTraits::Point, typename RhsTraits::Point> te1;\n    TypeEquality<typename LhsTraits::Scalar, typename RhsTraits::Scalar> te2;\n    TypeEquality<typename LhsTraits::Normal, typename RhsTraits::Normal> te3;\n    TypeEquality<typename LhsTraits::Color, typename RhsTraits::Color> te4;\n    TypeEquality<typename LhsTraits::TexCoord1D, typename RhsTraits::TexCoord1D> te5;\n    TypeEquality<typename LhsTraits::TexCoord2D, typename RhsTraits::TexCoord2D> te6;\n    TypeEquality<typename LhsTraits::TexCoord3D, typename RhsTraits::TexCoord3D> te7;\n    TypeEquality<typename LhsTraits::TextureIndex, typename RhsTraits::TextureIndex> te8;\n};\n\n} /* namespace TM */\n} /* anonymous namespace */\n#endif\n\n/**\n * @brief Cast a mesh with different but identical traits into each other.\n *\n * Note that there exists a syntactically more convenient global method\n * mesh_cast().\n *\n * Example:\n * @code{.cpp}\n * struct TriTraits1 : public OpenMesh::DefaultTraits {\n *   typedef Vec3d Point;\n * };\n * struct TriTraits2 : public OpenMesh::DefaultTraits {\n *   typedef Vec3d Point;\n * };\n * struct TriTraits3 : public OpenMesh::DefaultTraits {\n *   typedef Vec3f Point;\n * };\n *\n * TriMesh_ArrayKernelT<TriTraits1> a;\n * TriMesh_ArrayKernelT<TriTraits2> &b = MeshCast<TriMesh_ArrayKernelT<TriTraits2>&, TriMesh_ArrayKernelT<TriTraits1>&>::cast(a); // OK\n * TriMesh_ArrayKernelT<TriTraits3> &c = MeshCast<TriMesh_ArrayKernelT<TriTraits3>&, TriMesh_ArrayKernelT<TriTraits1>&>::cast(a); // ERROR\n * @endcode\n *\n * @see mesh_cast()\n *\n * @param rhs\n * @return\n */\ntemplate<typename LhsMeshT, typename RhsMeshT> struct MeshCast;\n\ntemplate<typename LhsMeshT, typename RhsMeshT>\nstruct MeshCast<LhsMeshT&, RhsMeshT&> {\n    static LhsMeshT &cast(RhsMeshT &rhs) {\n        (void)sizeof(TM::ItemsEquality<typename LhsMeshT::MeshItemsT, typename RhsMeshT::MeshItemsT>);\n        (void)sizeof(TM::TypeEquality<typename LhsMeshT::ConnectivityT, typename RhsMeshT::ConnectivityT>);\n        return reinterpret_cast<LhsMeshT&>(rhs);\n    }\n};\n\ntemplate<typename LhsMeshT, typename RhsMeshT>\nstruct MeshCast<const LhsMeshT&, const RhsMeshT&> {\n    static const LhsMeshT &cast(const RhsMeshT &rhs) {\n        (void)sizeof(TM::ItemsEquality<typename LhsMeshT::MeshItemsT, typename RhsMeshT::MeshItemsT>);\n        (void)sizeof(TM::TypeEquality<typename LhsMeshT::ConnectivityT, typename RhsMeshT::ConnectivityT>);\n        return reinterpret_cast<const LhsMeshT&>(rhs);\n    }\n};\n\ntemplate<typename LhsMeshT, typename RhsMeshT>\nstruct MeshCast<LhsMeshT*, RhsMeshT*> {\n    static LhsMeshT *cast(RhsMeshT *rhs) {\n        (void)sizeof(TM::ItemsEquality<typename LhsMeshT::MeshItemsT, typename RhsMeshT::MeshItemsT>);\n        (void)sizeof(TM::TypeEquality<typename LhsMeshT::ConnectivityT, typename RhsMeshT::ConnectivityT>);\n        return reinterpret_cast<LhsMeshT*>(rhs);\n    }\n};\n\ntemplate<typename LhsMeshT, typename RhsMeshT>\nstruct MeshCast<const LhsMeshT*, const RhsMeshT*> {\n    static const LhsMeshT *cast(const RhsMeshT *rhs) {\n        (void)sizeof(TM::ItemsEquality<typename LhsMeshT::MeshItemsT, typename RhsMeshT::MeshItemsT>);\n        (void)sizeof(TM::TypeEquality<typename LhsMeshT::ConnectivityT, typename RhsMeshT::ConnectivityT>);\n        return reinterpret_cast<const LhsMeshT*>(rhs);\n    }\n};\n\n\n//=============================================================================\n} // namespace OpenMesh\n//=============================================================================\n#endif // OPENMESH_MESH_ITEMS_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Mesh/Handles.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n#ifndef OPENMESH_HANDLES_HH\n#define OPENMESH_HANDLES_HH\n\n\n//== INCLUDES =================================================================\n\n#include <OpenMesh/Core/System/config.h>\n#include <iostream>\n\n\n//== NAMESPACES ===============================================================\n\nnamespace OpenMesh {\n\n//== CLASS DEFINITION =========================================================\n\n\n/// Base class for all handle types\nclass BaseHandle\n{ \npublic:\n  \n  explicit BaseHandle(int _idx=-1) : idx_(_idx) {}\n\n  /// Get the underlying index of this handle\n  int idx() const { return idx_; }\n\n  /// The handle is valid iff the index is not equal to -1.\n  bool is_valid() const { return idx_ != -1; }\n\n  /// reset handle to be invalid\n  void reset() { idx_=-1; }\n  /// reset handle to be invalid\n  void invalidate() { idx_ = -1; }\n\n  bool operator==(const BaseHandle& _rhs) const { \n    return (this->idx_ == _rhs.idx_); \n  }\n\n  bool operator!=(const BaseHandle& _rhs) const { \n    return (this->idx_ != _rhs.idx_); \n  }\n\n  bool operator<(const BaseHandle& _rhs) const { \n    return (this->idx_ < _rhs.idx_); \n  }\n\n\n  // this is to be used only by the iterators\n  void __increment() { ++idx_; }\n  void __decrement() { --idx_; }\n\n\nprivate:\n\n  int idx_; \n};\n\n\n//-----------------------------------------------------------------------------\n\n/// Write handle \\c _hnd to stream \\c _os\ninline std::ostream& operator<<(std::ostream& _os, const BaseHandle& _hnd) \n{\n  return (_os << _hnd.idx());\n}\n\n\n//-----------------------------------------------------------------------------\n\n\n/// Handle for a vertex entity\nstruct VertexHandle : public BaseHandle\n{\n  explicit VertexHandle(int _idx=-1) : BaseHandle(_idx) {}\n};\n\n\n/// Handle for a halfedge entity\nstruct HalfedgeHandle : public BaseHandle\n{\n  explicit HalfedgeHandle(int _idx=-1) : BaseHandle(_idx) {}\n};\n\n\n/// Handle for a edge entity\nstruct EdgeHandle : public BaseHandle\n{\n  explicit EdgeHandle(int _idx=-1) : BaseHandle(_idx) {}\n};\n\n\n/// Handle for a face entity\nstruct FaceHandle : public BaseHandle\n{\n  explicit FaceHandle(int _idx=-1) : BaseHandle(_idx) {}\n};\n\n\n//=============================================================================\n} // namespace OpenMesh\n//=============================================================================\n#endif // OPENMESH_HANDLES_HH\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Mesh/IteratorsT.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n#ifndef OPENMESH_ITERATORS_HH\n#define OPENMESH_ITERATORS_HH\n\n//=============================================================================\n//\n//  Iterators for PolyMesh/TriMesh\n//\n//=============================================================================\n\n\n\n//== INCLUDES =================================================================\n\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/Mesh/Status.hh>\n#include <cassert>\n#include <cstddef>\n#include <iterator>\n\n\n//== NAMESPACES ===============================================================\n\nnamespace OpenMesh {\nnamespace Iterators {\n\n\n//== FORWARD DECLARATIONS =====================================================\n\n\ntemplate <class Mesh> class ConstVertexIterT;\ntemplate <class Mesh> class VertexIterT;\ntemplate <class Mesh> class ConstHalfedgeIterT;\ntemplate <class Mesh> class HalfedgeIterT;\ntemplate <class Mesh> class ConstEdgeIterT;\ntemplate <class Mesh> class EdgeIterT;\ntemplate <class Mesh> class ConstFaceIterT;\ntemplate <class Mesh> class FaceIterT;\n\n\ntemplate <class Mesh, class ValueHandle, class MemberOwner, bool (MemberOwner::*PrimitiveStatusMember)() const, size_t (MemberOwner::*PrimitiveCountMember)() const>\nclass GenericIteratorT {\n    public:\n        //--- Typedefs ---\n\n        typedef ValueHandle                     value_handle;\n        typedef value_handle                    value_type;\n        typedef std::bidirectional_iterator_tag iterator_category;\n        typedef std::ptrdiff_t                  difference_type;\n        typedef const value_type&               reference;\n        typedef const value_type*               pointer;\n        typedef const Mesh*                     mesh_ptr;\n        typedef const Mesh&                     mesh_ref;\n\n        /// Default constructor.\n        GenericIteratorT()\n        : mesh_(0), skip_bits_(0)\n        {}\n\n        /// Construct with mesh and a target handle.\n        GenericIteratorT(mesh_ref _mesh, value_handle _hnd, bool _skip=false)\n        : mesh_(&_mesh), hnd_(_hnd), skip_bits_(0)\n        {\n            if (_skip) enable_skipping();\n\n            // Set vertex handle invalid if the mesh contains no vertex\n            if((mesh_->*PrimitiveCountMember)() == 0) hnd_ = value_handle(-1);\n        }\n\n        /// Standard dereferencing operator.\n        reference operator*() const {\n            return hnd_;\n        }\n\n        /// Standard pointer operator.\n        pointer operator->() const {\n            return &hnd_;\n        }\n\n        /**\n         * \\brief Get the handle of the item the iterator refers to.\n         * \\deprecated \n         * This function clutters your code. Use dereferencing operators -> and * instead.\n         */\n        DEPRECATED(\"This function clutters your code. Use dereferencing operators -> and * instead.\")\n        value_handle handle() const {\n            return hnd_;\n        }\n\n        /**\n         * \\brief Cast to the handle of the item the iterator refers to.\n         * \\deprecated\n         * Implicit casts of iterators are unsafe. Use dereferencing operators\n         * -> and * instead.\n         */\n        DEPRECATED(\"Implicit casts of iterators are unsafe. Use dereferencing operators -> and * instead.\")\n        operator value_handle() const {\n            return hnd_;\n        }\n\n        /// Are two iterators equal? Only valid if they refer to the same mesh!\n        bool operator==(const GenericIteratorT& _rhs) const {\n            return ((mesh_ == _rhs.mesh_) && (hnd_ == _rhs.hnd_));\n        }\n\n        /// Not equal?\n        bool operator!=(const GenericIteratorT& _rhs) const {\n            return !operator==(_rhs);\n        }\n\n        /// Standard pre-increment operator\n        GenericIteratorT& operator++() {\n            hnd_.__increment();\n            if (skip_bits_)\n                skip_fwd();\n            return *this;\n        }\n\n        /// Standard post-increment operator\n        GenericIteratorT operator++(int) {\n            GenericIteratorT cpy(*this);\n            ++(*this);\n            return cpy;\n        }\n\n        /// Standard pre-decrement operator\n        GenericIteratorT& operator--() {\n            hnd_.__decrement();\n            if (skip_bits_)\n                skip_bwd();\n            return *this;\n        }\n\n        /// Standard post-decrement operator\n        GenericIteratorT operator--(int) {\n            GenericIteratorT cpy(*this);\n            --(*this);\n            return cpy;\n        }\n\n        /// Turn on skipping: automatically skip deleted/hidden elements\n        void enable_skipping() {\n            if (mesh_ && (mesh_->*PrimitiveStatusMember)()) {\n                Attributes::StatusInfo status;\n                status.set_deleted(true);\n                status.set_hidden(true);\n                skip_bits_ = status.bits();\n                skip_fwd();\n            } else\n                skip_bits_ = 0;\n        }\n\n        /// Turn on skipping: automatically skip deleted/hidden elements\n        void disable_skipping() {\n            skip_bits_ = 0;\n        }\n\n    private:\n\n        void skip_fwd() {\n            assert(mesh_ && skip_bits_);\n            while ((hnd_.idx() < (signed) (mesh_->*PrimitiveCountMember)())\n                    && (mesh_->status(hnd_).bits() & skip_bits_))\n                hnd_.__increment();\n        }\n\n        void skip_bwd() {\n            assert(mesh_ && skip_bits_);\n            while ((hnd_.idx() >= 0) && (mesh_->status(hnd_).bits() & skip_bits_))\n                hnd_.__decrement();\n        }\n\n    protected:\n        mesh_ptr mesh_;\n        value_handle hnd_;\n        unsigned int skip_bits_;\n};\n\n//=============================================================================\n} // namespace Iterators\n} // namespace OpenMesh\n//=============================================================================\n#endif \n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Mesh/PolyConnectivity.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n//== IMPLEMENTATION ==========================================================\n#include <OpenMesh/Core/Mesh/PolyConnectivity.hh>\n#include <set>\n\nnamespace OpenMesh {\n\nconst PolyConnectivity::VertexHandle    PolyConnectivity::InvalidVertexHandle;\nconst PolyConnectivity::HalfedgeHandle  PolyConnectivity::InvalidHalfedgeHandle;\nconst PolyConnectivity::EdgeHandle      PolyConnectivity::InvalidEdgeHandle;\nconst PolyConnectivity::FaceHandle      PolyConnectivity::InvalidFaceHandle;\n\n//-----------------------------------------------------------------------------\n\nPolyConnectivity::HalfedgeHandle\nPolyConnectivity::find_halfedge(VertexHandle _start_vh, VertexHandle _end_vh ) const\n{\n  assert(_start_vh.is_valid() && _end_vh.is_valid());\n\n  for (ConstVertexOHalfedgeIter voh_it = cvoh_iter(_start_vh); voh_it.is_valid(); ++voh_it)\n    if (to_vertex_handle(*voh_it) == _end_vh)\n      return *voh_it;\n\n  return InvalidHalfedgeHandle;\n}\n\n\nbool PolyConnectivity::is_boundary(FaceHandle _fh, bool _check_vertex) const\n{\n  for (ConstFaceEdgeIter cfeit = cfe_iter( _fh ); cfeit.is_valid(); ++cfeit)\n      if (is_boundary( *cfeit ) )\n        return true;\n\n  if (_check_vertex)\n  {\n      for (ConstFaceVertexIter cfvit = cfv_iter( _fh ); cfvit.is_valid(); ++cfvit)\n        if (is_boundary( *cfvit ) )\n            return true;\n  }\n  return false;\n}\n\nbool PolyConnectivity::is_manifold(VertexHandle _vh) const\n{\n  /* The vertex is non-manifold if more than one gap exists, i.e.\n    more than one outgoing boundary halfedge. If (at least) one\n    boundary halfedge exists, the vertex' halfedge must be a\n    boundary halfedge. If iterating around the vertex finds another\n    boundary halfedge, the vertex is non-manifold. */\n\n  ConstVertexOHalfedgeIter vh_it(*this, _vh);\n  if (vh_it.is_valid())\n    for (++vh_it; vh_it.is_valid(); ++vh_it)\n        if (is_boundary(*vh_it))\n          return false;\n  return true;\n}\n\n//-----------------------------------------------------------------------------\nvoid PolyConnectivity::adjust_outgoing_halfedge(VertexHandle _vh)\n{\n  for (ConstVertexOHalfedgeIter vh_it=cvoh_iter(_vh); vh_it.is_valid(); ++vh_it)\n  {\n    if (is_boundary(*vh_it))\n    {\n      set_halfedge_handle(_vh, *vh_it);\n      break;\n    }\n  }\n}\n\n//-----------------------------------------------------------------------------\n\nPolyConnectivity::FaceHandle\nPolyConnectivity::add_face(const VertexHandle* _vertex_handles, size_t _vhs_size)\n{\n  VertexHandle                   vh;\n  size_t                         i, ii, n(_vhs_size);\n  HalfedgeHandle                 inner_next, inner_prev,\n                                 outer_next, outer_prev,\n                                 boundary_next, boundary_prev,\n                                 patch_start, patch_end;\n\n\n  // Check sufficient working storage available\n  if (edgeData_.size() < n)\n  {\n    edgeData_.resize(n);\n    next_cache_.resize(6*n);\n  }\n  next_cache_count_ = 0;\n\n  // don't allow degenerated faces\n  assert (n > 2);\n\n  // test for topological errors\n  for (i=0, ii=1; i<n; ++i, ++ii, ii%=n)\n  {\n    if ( !is_boundary(_vertex_handles[i]) )\n    {\n      omerr() << \"PolyMeshT::add_face: complex vertex\\n\";\n      return InvalidFaceHandle;\n    }\n\n    // Initialise edge attributes\n    edgeData_[i].halfedge_handle = find_halfedge(_vertex_handles[i],\n                                                 _vertex_handles[ii]);\n    edgeData_[i].is_new = !edgeData_[i].halfedge_handle.is_valid();\n    edgeData_[i].needs_adjust = false;\n\n    if (!edgeData_[i].is_new && !is_boundary(edgeData_[i].halfedge_handle))\n    {\n      omerr() << \"PolyMeshT::add_face: complex edge\\n\";\n      return InvalidFaceHandle;\n    }\n  }\n\n  // re-link patches if necessary\n  for (i=0, ii=1; i<n; ++i, ++ii, ii%=n)\n  {\n    if (!edgeData_[i].is_new && !edgeData_[ii].is_new)\n    {\n      inner_prev = edgeData_[i].halfedge_handle;\n      inner_next = edgeData_[ii].halfedge_handle;\n\n\n      if (next_halfedge_handle(inner_prev) != inner_next)\n      {\n        // here comes the ugly part... we have to relink a whole patch\n\n        // search a free gap\n        // free gap will be between boundary_prev and boundary_next\n        outer_prev = opposite_halfedge_handle(inner_next);\n        outer_next = opposite_halfedge_handle(inner_prev);\n        boundary_prev = outer_prev;\n        do\n          boundary_prev =\n            opposite_halfedge_handle(next_halfedge_handle(boundary_prev));\n        while (!is_boundary(boundary_prev) || boundary_prev==inner_prev);\n        boundary_next = next_halfedge_handle(boundary_prev);\n        assert(is_boundary(boundary_prev));\n        assert(is_boundary(boundary_next));\n        // ok ?\n        if (boundary_next == inner_next)\n        {\n          omerr() << \"PolyMeshT::add_face: patch re-linking failed\\n\";\n          return InvalidFaceHandle;\n        }\n\n        // other halfedges' handles\n        patch_start = next_halfedge_handle(inner_prev);\n        patch_end   = prev_halfedge_handle(inner_next);\n\n        assert(boundary_prev.is_valid());\n        assert(patch_start.is_valid());\n        assert(patch_end.is_valid());\n        assert(boundary_next.is_valid());\n        assert(inner_prev.is_valid());\n        assert(inner_next.is_valid());\n\n        // relink\n        next_cache_[next_cache_count_++] = std::make_pair(boundary_prev, patch_start);\n        next_cache_[next_cache_count_++] = std::make_pair(patch_end, boundary_next);\n        next_cache_[next_cache_count_++] = std::make_pair(inner_prev, inner_next);\n      }\n    }\n  }\n\n  // create missing edges\n  for (i=0, ii=1; i<n; ++i, ++ii, ii%=n)\n    if (edgeData_[i].is_new)\n      edgeData_[i].halfedge_handle = new_edge(_vertex_handles[i], _vertex_handles[ii]);\n\n  // create the face\n  FaceHandle fh(new_face());\n  set_halfedge_handle(fh, edgeData_[n-1].halfedge_handle);\n\n  // setup halfedges\n  for (i=0, ii=1; i<n; ++i, ++ii, ii%=n)\n  {\n    vh         = _vertex_handles[ii];\n\n    inner_prev = edgeData_[i].halfedge_handle;\n    inner_next = edgeData_[ii].halfedge_handle;\n    assert(inner_prev.is_valid());\n    assert(inner_next.is_valid());\n\n    size_t id = 0;\n    if (edgeData_[i].is_new)  id |= 1;\n    if (edgeData_[ii].is_new) id |= 2;\n\n\n    if (id)\n    {\n      outer_prev = opposite_halfedge_handle(inner_next);\n      outer_next = opposite_halfedge_handle(inner_prev);\n      assert(outer_prev.is_valid());\n      assert(outer_next.is_valid());\n\n      // set outer links\n      switch (id)\n      {\n        case 1: // prev is new, next is old\n          boundary_prev = prev_halfedge_handle(inner_next);\n          assert(boundary_prev.is_valid());\n          next_cache_[next_cache_count_++] = std::make_pair(boundary_prev, outer_next);\n          set_halfedge_handle(vh, outer_next);\n          break;\n\n        case 2: // next is new, prev is old\n          boundary_next = next_halfedge_handle(inner_prev);\n          assert(boundary_next.is_valid());\n          next_cache_[next_cache_count_++] = std::make_pair(outer_prev, boundary_next);\n          set_halfedge_handle(vh, boundary_next);\n          break;\n\n        case 3: // both are new\n          if (!halfedge_handle(vh).is_valid())\n          {\n            set_halfedge_handle(vh, outer_next);\n            next_cache_[next_cache_count_++] = std::make_pair(outer_prev, outer_next);\n          }\n          else\n          {\n            boundary_next = halfedge_handle(vh);\n            boundary_prev = prev_halfedge_handle(boundary_next);\n            assert(boundary_prev.is_valid());\n            assert(boundary_next.is_valid());\n            next_cache_[next_cache_count_++] = std::make_pair(boundary_prev, outer_next);\n            next_cache_[next_cache_count_++] = std::make_pair(outer_prev, boundary_next);\n          }\n          break;\n      }\n\n      // set inner link\n      next_cache_[next_cache_count_++] = std::make_pair(inner_prev, inner_next);\n    }\n    else edgeData_[ii].needs_adjust = (halfedge_handle(vh) == inner_next);\n\n\n    // set face handle\n    set_face_handle(edgeData_[i].halfedge_handle, fh);\n  }\n\n  // process next halfedge cache\n  for (i = 0; i < next_cache_count_; ++i)\n    set_next_halfedge_handle(next_cache_[i].first, next_cache_[i].second);\n\n\n  // adjust vertices' halfedge handle\n  for (i=0; i<n; ++i)\n    if (edgeData_[i].needs_adjust)\n      adjust_outgoing_halfedge(_vertex_handles[i]);\n\n  return fh;\n}\n\n//-----------------------------------------------------------------------------\n\nFaceHandle PolyConnectivity::add_face(VertexHandle _vh0, VertexHandle _vh1, VertexHandle _vh2, VertexHandle _vh3)\n{\n  VertexHandle vhs[4] = { _vh0, _vh1, _vh2, _vh3 };\n  return add_face(vhs, 4);\n}\n\n//-----------------------------------------------------------------------------\n\nFaceHandle PolyConnectivity::add_face(VertexHandle _vh0, VertexHandle _vh1, VertexHandle _vh2)\n{\n  VertexHandle vhs[3] = { _vh0, _vh1, _vh2 };\n  return add_face(vhs, 3);\n}\n\n//-----------------------------------------------------------------------------\n\nFaceHandle PolyConnectivity::add_face(const std::vector<VertexHandle>& _vhandles)\n{ return add_face(&_vhandles.front(), _vhandles.size()); }\n\n\n//-----------------------------------------------------------------------------\nbool PolyConnectivity::is_collapse_ok(HalfedgeHandle v0v1)\n{\n  //is edge already deleteed?\n  if (status(edge_handle(v0v1)).deleted())\n  {\n    return false;\n  }\n\n  HalfedgeHandle v1v0(opposite_halfedge_handle(v0v1));\n  VertexHandle v0(to_vertex_handle(v1v0));\n  VertexHandle v1(to_vertex_handle(v0v1));  \n\n  bool v0v1_triangle = false;\n  bool v1v0_triangle = false;\n  \n  if (!is_boundary(v0v1))\n    v0v1_triangle = valence(face_handle(v0v1)) == 3;\n  \n  if (!is_boundary(v1v0))\n    v1v0_triangle = valence(face_handle(v1v0)) == 3;\n\n  //in a quadmesh we dont have the \"next\" or \"previous\" vhandle, so we need to look at previous and next on both sides\n  VertexHandle v_01_p = from_vertex_handle(prev_halfedge_handle(v0v1));\n  VertexHandle v_01_n = to_vertex_handle(next_halfedge_handle(v0v1));  \n\n  VertexHandle v_10_p = from_vertex_handle(prev_halfedge_handle(v1v0));\n  VertexHandle v_10_n = to_vertex_handle(next_halfedge_handle(v1v0));\n\n  //are the vertices already deleted ?\n  if (status(v0).deleted() || status(v1).deleted())\n  {\n    return false;\n  }\n\n  //the edges v1-vl and vl-v0 must not be both boundary edges\n  //this test makes only sense in a polymesh if the side face is a triangle\n  if (!is_boundary(v0v1))\n  {\n    if (v0v1_triangle)\n    {\n      VertexHandle vl = to_vertex_handle(next_halfedge_handle(v0v1));\n\n      HalfedgeHandle h1 = next_halfedge_handle(v0v1);\n      HalfedgeHandle h2 = next_halfedge_handle(h1);\n      if (is_boundary(opposite_halfedge_handle(h1)) && is_boundary(opposite_halfedge_handle(h2)))\n\treturn false;\n    }\n  }\n\n  //the edges v0-vr and vr-v1 must not be both boundary edges\n  //this test makes only sense in a polymesh if the side face is a triangle\n  if (!is_boundary(v1v0))\n  {\n    if (v1v0_triangle)\n    {\n      VertexHandle vr = to_vertex_handle(next_halfedge_handle(v1v0));\n\n      HalfedgeHandle h1 = next_halfedge_handle(v1v0);\n      HalfedgeHandle h2 = next_halfedge_handle(h1);\n      if (is_boundary(opposite_halfedge_handle(h1)) && is_boundary(opposite_halfedge_handle(h2)))\n\treturn false;\n    }\n  }\n\n  // edge between two boundary vertices should be a boundary edge\n  if ( is_boundary(v0) && is_boundary(v1) && !is_boundary(v0v1) && !is_boundary(v1v0))\n    return false;\n  \n  VertexVertexIter vv_it;\n  // test intersection of the one-rings of v0 and v1\n  for (vv_it = vv_iter(v0); vv_it.is_valid(); ++vv_it)\n  {\n    status(*vv_it).set_tagged(false);\n  }\n\n  for (vv_it = vv_iter(v1); vv_it.is_valid(); ++vv_it)\n  {\n    status(*vv_it).set_tagged(true);\n  }\n\n  for (vv_it = vv_iter(v0); vv_it.is_valid(); ++vv_it)\n  {\n    if (status(*vv_it).tagged() &&\n      !(*vv_it == v_01_n && v0v1_triangle) &&\n      !(*vv_it == v_10_n && v1v0_triangle)\n      )\n    {\n      return false;\n    }\n  }\n  \n  //test for a face on the backside/other side that might degenerate\n  if (v0v1_triangle)\n  {\n    HalfedgeHandle one, two;\n    one = next_halfedge_handle(v0v1);\n    two = next_halfedge_handle(one);\n    \n    one = opposite_halfedge_handle(one);\n    two = opposite_halfedge_handle(two);\n    \n    if (face_handle(one) == face_handle(two) && valence(face_handle(one)) != 3)\n    {\n      return false;\n    }\n  }\n  \n  if (v1v0_triangle)\n  {\n    HalfedgeHandle one, two;\n    one = next_halfedge_handle(v1v0);\n    two = next_halfedge_handle(one);\n    \n    one = opposite_halfedge_handle(one);\n    two = opposite_halfedge_handle(two);\n    \n    if (face_handle(one) == face_handle(two) && valence(face_handle(one)) != 3)\n    {\n      return false;\n    }\n  }\n\n  if (status(*vv_it).tagged() && v_01_n == v_10_n && v0v1_triangle && v1v0_triangle)\n  {\n    return false;\n  }\n\n  // passed all tests\n  return true;\n}\n\n//-----------------------------------------------------------------------------\n\nvoid PolyConnectivity::delete_vertex(VertexHandle _vh, bool _delete_isolated_vertices)\n{\n  // store incident faces\n  std::vector<FaceHandle> face_handles;\n  face_handles.reserve(8);\n  for (VFIter vf_it(vf_iter(_vh)); vf_it.is_valid(); ++vf_it)\n    face_handles.push_back(*vf_it);\n\n\n  // delete collected faces\n  std::vector<FaceHandle>::iterator fh_it(face_handles.begin()),\n                                    fh_end(face_handles.end());\n\n  for (; fh_it!=fh_end; ++fh_it)\n    delete_face(*fh_it, _delete_isolated_vertices);\n\n  status(_vh).set_deleted(true);\n}\n\n//-----------------------------------------------------------------------------\n\nvoid PolyConnectivity::delete_edge(EdgeHandle _eh, bool _delete_isolated_vertices)\n{\n  FaceHandle fh0(face_handle(halfedge_handle(_eh, 0)));\n  FaceHandle fh1(face_handle(halfedge_handle(_eh, 1)));\n\n  if (fh0.is_valid())  delete_face(fh0, _delete_isolated_vertices);\n  if (fh1.is_valid())  delete_face(fh1, _delete_isolated_vertices);\n\n  // If there is no face, we delete the edge\n  // here\n  if ( ! fh0.is_valid() && !fh1.is_valid()) {\n    // mark edge deleted if the mesh has a edge status\n    if ( has_edge_status() )\n      status(_eh).set_deleted(true);\n\n    // mark corresponding halfedges as deleted\n    // As the deleted edge is boundary,\n    // all corresponding halfedges will also be deleted.\n    if ( has_halfedge_status() ) {\n      status(halfedge_handle(_eh, 0)).set_deleted(true);\n      status(halfedge_handle(_eh, 1)).set_deleted(true);\n    }\n  }\n}\n\n//-----------------------------------------------------------------------------\n\nvoid PolyConnectivity::delete_face(FaceHandle _fh, bool _delete_isolated_vertices)\n{\n  assert(_fh.is_valid() && !status(_fh).deleted());\n\n  // mark face deleted\n  status(_fh).set_deleted(true);\n\n\n  // this vector will hold all boundary edges of face _fh\n  // these edges will be deleted\n  std::vector<EdgeHandle> deleted_edges;\n  deleted_edges.reserve(3);\n\n\n  // this vector will hold all vertices of face _fh\n  // for updating their outgoing halfedge\n  std::vector<VertexHandle>  vhandles;\n  vhandles.reserve(3);\n\n\n  // for all halfedges of face _fh do:\n  //   1) invalidate face handle.\n  //   2) collect all boundary halfedges, set them deleted\n  //   3) store vertex handles\n  HalfedgeHandle hh;\n  for (FaceHalfedgeIter fh_it(fh_iter(_fh)); fh_it.is_valid(); ++fh_it)\n  {\n    hh = *fh_it;\n\n    set_boundary(hh);//set_face_handle(hh, InvalidFaceHandle);\n\n    if (is_boundary(opposite_halfedge_handle(hh)))\n        deleted_edges.push_back(edge_handle(hh));\n\n    vhandles.push_back(to_vertex_handle(hh));\n  }\n\n\n  // delete all collected (half)edges\n  // these edges were all boundary\n  // delete isolated vertices (if _delete_isolated_vertices is true)\n  if (!deleted_edges.empty())\n  {\n    std::vector<EdgeHandle>::iterator del_it(deleted_edges.begin()),\n                                      del_end(deleted_edges.end());\n    HalfedgeHandle h0, h1, next0, next1, prev0, prev1;\n    VertexHandle   v0, v1;\n\n    for (; del_it!=del_end; ++del_it)\n    {\n      h0    = halfedge_handle(*del_it, 0);\n      v0    = to_vertex_handle(h0);\n      next0 = next_halfedge_handle(h0);\n      prev0 = prev_halfedge_handle(h0);\n\n      h1    = halfedge_handle(*del_it, 1);\n      v1    = to_vertex_handle(h1);\n      next1 = next_halfedge_handle(h1);\n      prev1 = prev_halfedge_handle(h1);\n\n      // adjust next and prev handles\n      set_next_halfedge_handle(prev0, next1);\n      set_next_halfedge_handle(prev1, next0);\n\n      // mark edge deleted if the mesh has a edge status\n      if ( has_edge_status() )\n    \t status(*del_it).set_deleted(true);\n\n\n      // mark corresponding halfedges as deleted\n      // As the deleted edge is boundary,\n      // all corresponding halfedges will also be deleted.\n      if ( has_halfedge_status() ) {\n        status(h0).set_deleted(true);\n        status(h1).set_deleted(true);\n      }\n\n      // update v0\n      if (halfedge_handle(v0) == h1)\n      {\n        // isolated ?\n        if (next0 == h1)\n        {\n          if (_delete_isolated_vertices)\n            status(v0).set_deleted(true);\n          set_isolated(v0);\n        }\n        else set_halfedge_handle(v0, next0);\n      }\n\n      // update v1\n      if (halfedge_handle(v1) == h0)\n      {\n        // isolated ?\n        if (next1 == h0)\n        {\n          if (_delete_isolated_vertices)\n            status(v1).set_deleted(true);\n          set_isolated(v1);\n        }\n        else  set_halfedge_handle(v1, next1);\n      }\n    }\n  }\n\n  // update outgoing halfedge handles of remaining vertices\n  std::vector<VertexHandle>::iterator v_it(vhandles.begin()),\n                                      v_end(vhandles.end());\n  for (; v_it!=v_end; ++v_it)\n    adjust_outgoing_halfedge(*v_it);\n}\n\n//-----------------------------------------------------------------------------\nPolyConnectivity::VertexIter PolyConnectivity::vertices_begin()\n{\n  return VertexIter(*this, VertexHandle(0));\n}\n\n//-----------------------------------------------------------------------------\nPolyConnectivity::ConstVertexIter PolyConnectivity::vertices_begin() const\n{\n  return ConstVertexIter(*this, VertexHandle(0));\n}\n\n//-----------------------------------------------------------------------------\nPolyConnectivity::VertexIter PolyConnectivity::vertices_end()\n{\n  return VertexIter(*this, VertexHandle( int(n_vertices() ) ));\n}\n\n//-----------------------------------------------------------------------------\nPolyConnectivity::ConstVertexIter PolyConnectivity::vertices_end() const\n{\n  return ConstVertexIter(*this, VertexHandle( int(n_vertices()) ));\n}\n\n//-----------------------------------------------------------------------------\nPolyConnectivity::HalfedgeIter PolyConnectivity::halfedges_begin()\n{\n  return HalfedgeIter(*this, HalfedgeHandle(0));\n}\n\n//-----------------------------------------------------------------------------\nPolyConnectivity::ConstHalfedgeIter PolyConnectivity::halfedges_begin() const\n{\n  return ConstHalfedgeIter(*this, HalfedgeHandle(0));\n}\n\n//-----------------------------------------------------------------------------\nPolyConnectivity::HalfedgeIter PolyConnectivity::halfedges_end()\n{\n  return HalfedgeIter(*this, HalfedgeHandle(int(n_halfedges())));\n}\n\n//-----------------------------------------------------------------------------\nPolyConnectivity::ConstHalfedgeIter PolyConnectivity::halfedges_end() const\n{\n  return ConstHalfedgeIter(*this, HalfedgeHandle(int(n_halfedges())));\n}\n\n//-----------------------------------------------------------------------------\nPolyConnectivity::EdgeIter PolyConnectivity::edges_begin()\n{\n  return EdgeIter(*this, EdgeHandle(0));\n}\n\n//-----------------------------------------------------------------------------\nPolyConnectivity::ConstEdgeIter PolyConnectivity::edges_begin() const\n{\n  return ConstEdgeIter(*this, EdgeHandle(0));\n}\n\n//-----------------------------------------------------------------------------\nPolyConnectivity::EdgeIter PolyConnectivity::edges_end()\n{\n  return EdgeIter(*this, EdgeHandle(int(n_edges())));\n}\n\n//-----------------------------------------------------------------------------\nPolyConnectivity::ConstEdgeIter PolyConnectivity::edges_end() const\n{\n  return ConstEdgeIter(*this, EdgeHandle(int(n_edges())));\n}\n\n//-----------------------------------------------------------------------------\nPolyConnectivity::FaceIter PolyConnectivity::faces_begin()\n{\n  return FaceIter(*this, FaceHandle(0));\n}\n\n//-----------------------------------------------------------------------------\nPolyConnectivity::ConstFaceIter PolyConnectivity::faces_begin() const\n{\n  return ConstFaceIter(*this, FaceHandle(0));\n}\n\n//-----------------------------------------------------------------------------\nPolyConnectivity::FaceIter PolyConnectivity::faces_end()\n{\n  return FaceIter(*this, FaceHandle(int(n_faces())));\n}\n\n//-----------------------------------------------------------------------------\nPolyConnectivity::ConstFaceIter PolyConnectivity::faces_end() const\n{\n  return ConstFaceIter(*this, FaceHandle(int(n_faces())));\n}\n\n//-----------------------------------------------------------------------------\nvoid PolyConnectivity::collapse(HalfedgeHandle _hh)\n{\n  HalfedgeHandle h0 = _hh;\n  HalfedgeHandle h1 = next_halfedge_handle(h0);\n  HalfedgeHandle o0 = opposite_halfedge_handle(h0);\n  HalfedgeHandle o1 = next_halfedge_handle(o0);\n\n  // remove edge\n  collapse_edge(h0);\n\n  // remove loops\n  if (next_halfedge_handle(next_halfedge_handle(h1)) == h1)\n    collapse_loop(next_halfedge_handle(h1));\n  if (next_halfedge_handle(next_halfedge_handle(o1)) == o1)\n    collapse_loop(o1);\n}\n\n//-----------------------------------------------------------------------------\nvoid PolyConnectivity::collapse_edge(HalfedgeHandle _hh)\n{\n  HalfedgeHandle  h  = _hh;\n  HalfedgeHandle  hn = next_halfedge_handle(h);\n  HalfedgeHandle  hp = prev_halfedge_handle(h);\n\n  HalfedgeHandle  o  = opposite_halfedge_handle(h);\n  HalfedgeHandle  on = next_halfedge_handle(o);\n  HalfedgeHandle  op = prev_halfedge_handle(o);\n\n  FaceHandle      fh = face_handle(h);\n  FaceHandle      fo = face_handle(o);\n\n  VertexHandle    vh = to_vertex_handle(h);\n  VertexHandle    vo = to_vertex_handle(o);\n\n\n\n  // halfedge -> vertex\n  for (VertexIHalfedgeIter vih_it(vih_iter(vo)); vih_it.is_valid(); ++vih_it)\n    set_vertex_handle(*vih_it, vh);\n\n\n  // halfedge -> halfedge\n  set_next_halfedge_handle(hp, hn);\n  set_next_halfedge_handle(op, on);\n\n\n  // face -> halfedge\n  if (fh.is_valid())  set_halfedge_handle(fh, hn);\n  if (fo.is_valid())  set_halfedge_handle(fo, on);\n\n\n  // vertex -> halfedge\n  if (halfedge_handle(vh) == o)  set_halfedge_handle(vh, hn);\n  adjust_outgoing_halfedge(vh);\n  set_isolated(vo);\n\n  // delete stuff\n  status(edge_handle(h)).set_deleted(true);\n  status(vo).set_deleted(true);\n}\n\n//-----------------------------------------------------------------------------\nvoid PolyConnectivity::collapse_loop(HalfedgeHandle _hh)\n{\n  HalfedgeHandle  h0 = _hh;\n  HalfedgeHandle  h1 = next_halfedge_handle(h0);\n\n  HalfedgeHandle  o0 = opposite_halfedge_handle(h0);\n  HalfedgeHandle  o1 = opposite_halfedge_handle(h1);\n\n  VertexHandle    v0 = to_vertex_handle(h0);\n  VertexHandle    v1 = to_vertex_handle(h1);\n\n  FaceHandle      fh = face_handle(h0);\n  FaceHandle      fo = face_handle(o0);\n\n\n\n  // is it a loop ?\n  assert ((next_halfedge_handle(h1) == h0) && (h1 != o0));\n\n\n  // halfedge -> halfedge\n  set_next_halfedge_handle(h1, next_halfedge_handle(o0));\n  set_next_halfedge_handle(prev_halfedge_handle(o0), h1);\n\n\n  // halfedge -> face\n  set_face_handle(h1, fo);\n\n\n  // vertex -> halfedge\n  set_halfedge_handle(v0, h1);  adjust_outgoing_halfedge(v0);\n  set_halfedge_handle(v1, o1);  adjust_outgoing_halfedge(v1);\n\n\n  // face -> halfedge\n  if (fo.is_valid() && halfedge_handle(fo) == o0)\n  {\n    set_halfedge_handle(fo, h1);\n  }\n\n  // delete stuff\n  if (fh.is_valid())  \n  {\n    set_halfedge_handle(fh, InvalidHalfedgeHandle);\n    status(fh).set_deleted(true);\n  }\n  status(edge_handle(h0)).set_deleted(true);\n}\n\n//-----------------------------------------------------------------------------\nbool PolyConnectivity::is_simple_link(EdgeHandle _eh) const\n{\n  HalfedgeHandle heh0 = halfedge_handle(_eh, 0);\n  HalfedgeHandle heh1 = halfedge_handle(_eh, 1);\n  \n  FaceHandle fh0 = face_handle(heh0);//fh0 or fh1 might be a invalid,\n  FaceHandle fh1 = face_handle(heh1);//i.e., representing the boundary\n  \n  HalfedgeHandle next_heh = next_halfedge_handle(heh0);\n  while (next_heh != heh0)\n  {//check if there are no other edges shared between fh0 & fh1\n    if (opposite_face_handle(next_heh) == fh1)\n    {\n      return false;\n    }\n    next_heh = next_halfedge_handle(next_heh);\n  }\n  return true;\n}\n\n//-----------------------------------------------------------------------------\nbool PolyConnectivity::is_simply_connected(FaceHandle _fh) const\n{\n  std::set<FaceHandle> nb_fhs;\n  for (ConstFaceFaceIter cff_it = cff_iter(_fh); cff_it.is_valid(); ++cff_it)\n  {\n    if (nb_fhs.find(*cff_it) == nb_fhs.end())\n    {\n      nb_fhs.insert(*cff_it);\n    }\n    else\n    {//there is more than one link\n      return false;\n    }\n  }\n  return true;\n}\n  \n//-----------------------------------------------------------------------------\nPolyConnectivity::FaceHandle \nPolyConnectivity::remove_edge(EdgeHandle _eh)\n{\n  //don't allow \"dangling\" vertices and edges\n  assert(!status(_eh).deleted() && is_simple_link(_eh));\n  \n  HalfedgeHandle heh0 = halfedge_handle(_eh, 0);\n  HalfedgeHandle heh1 = halfedge_handle(_eh, 1);\n  \n  //deal with the faces\n  FaceHandle rem_fh = face_handle(heh0), del_fh = face_handle(heh1);\n  if (!del_fh.is_valid())\n  {//boundary case - we must delete the rem_fh\n    std::swap(del_fh, rem_fh);\n  }\n  assert(del_fh.is_valid());\n/*  for (FaceHalfedgeIter fh_it = fh_iter(del_fh); fh_it; ++fh_it)\n  {//set the face handle of the halfedges of del_fh to point to rem_fh\n    set_face_handle(fh_it, rem_fh);  \n  } */\n  //fix the halfedge relations\n  HalfedgeHandle prev_heh0 = prev_halfedge_handle(heh0);\n  HalfedgeHandle prev_heh1 = prev_halfedge_handle(heh1);\n\n  HalfedgeHandle next_heh0 = next_halfedge_handle(heh0);\n  HalfedgeHandle next_heh1 = next_halfedge_handle(heh1);\n  \n  set_next_halfedge_handle(prev_heh0, next_heh1);\n  set_next_halfedge_handle(prev_heh1, next_heh0);\n  //correct outgoing vertex handles for the _eh vertices (if needed)\n  VertexHandle vh0 = to_vertex_handle(heh0);\n  VertexHandle vh1 = to_vertex_handle(heh1);\n  \n  if (halfedge_handle(vh0) == heh1)\n  {\n    set_halfedge_handle(vh0, next_heh0);\n  }\n  if (halfedge_handle(vh1) == heh0)\n  {\n    set_halfedge_handle(vh1, next_heh1);\n  }\n  \n  //correct the hafledge handle of rem_fh if needed and preserve its first vertex\n  if (halfedge_handle(rem_fh) == heh0)\n  {//rem_fh is the face at heh0\n    set_halfedge_handle(rem_fh, prev_heh1);\n  }\n  else if (halfedge_handle(rem_fh) == heh1)\n  {//rem_fh is the face at heh1\n    set_halfedge_handle(rem_fh, prev_heh0);\n  }\n  for (FaceHalfedgeIter fh_it = fh_iter(rem_fh); fh_it.is_valid(); ++fh_it)\n  {//set the face handle of the halfedges of del_fh to point to rem_fh\n    set_face_handle(*fh_it, rem_fh);\n  } \n  \n  status(_eh).set_deleted(true);  \n  status(del_fh).set_deleted(true);  \n  return rem_fh;//returns the remaining face handle\n}\n\n//-----------------------------------------------------------------------------\nvoid PolyConnectivity::reinsert_edge(EdgeHandle _eh)\n{\n  //this does not work without prev_halfedge_handle\n  assert_compile(sizeof(Halfedge) == sizeof(Halfedge_with_prev));\n  //shoudl be deleted  \n  assert(status(_eh).deleted());\n  status(_eh).set_deleted(false);  \n  \n  HalfedgeHandle heh0 = halfedge_handle(_eh, 0);\n  HalfedgeHandle heh1 = halfedge_handle(_eh, 1);\n  FaceHandle rem_fh = face_handle(heh0), del_fh = face_handle(heh1);\n  if (!del_fh.is_valid())\n  {//boundary case - we must delete the rem_fh\n    std::swap(del_fh, rem_fh);\n  }\n  assert(status(del_fh).deleted());\n  status(del_fh).set_deleted(false); \n  \n  //restore halfedge relations\n  HalfedgeHandle prev_heh0 = prev_halfedge_handle(heh0);\n  HalfedgeHandle prev_heh1 = prev_halfedge_handle(heh1);\n\n  HalfedgeHandle next_heh0 = next_halfedge_handle(heh0);\n  HalfedgeHandle next_heh1 = next_halfedge_handle(heh1);\n  \n  set_next_halfedge_handle(prev_heh0, heh0);\n  set_prev_halfedge_handle(next_heh0, heh0);\n  \n  set_next_halfedge_handle(prev_heh1, heh1);\n  set_prev_halfedge_handle(next_heh1, heh1);\n  \n  for (FaceHalfedgeIter fh_it = fh_iter(del_fh); fh_it.is_valid(); ++fh_it)\n  {//reassign halfedges to del_fh  \n    set_face_handle(*fh_it, del_fh);\n  }\n   \n  if (face_handle(halfedge_handle(rem_fh)) == del_fh)\n  {//correct the halfedge handle of rem_fh\n    if (halfedge_handle(rem_fh) == prev_heh0)\n    {//rem_fh is the face at heh1\n      set_halfedge_handle(rem_fh, heh1);\n    }\n    else\n    {//rem_fh is the face at heh0\n      assert(halfedge_handle(rem_fh) == prev_heh1);\n      set_halfedge_handle(rem_fh, heh0);\n    }\n  }\n}\n\n//-----------------------------------------------------------------------------\nPolyConnectivity::HalfedgeHandle\nPolyConnectivity::insert_edge(HalfedgeHandle _prev_heh, HalfedgeHandle _next_heh)\n{\n  assert(face_handle(_prev_heh) == face_handle(_next_heh));//only the manifold case\n  assert(next_halfedge_handle(_prev_heh) != _next_heh);//this can not be done\n  VertexHandle vh0 = to_vertex_handle(_prev_heh);\n  VertexHandle vh1 = from_vertex_handle(_next_heh);\n  //create the link between vh0 and vh1\n  HalfedgeHandle heh0 = new_edge(vh0, vh1);\n  HalfedgeHandle heh1 = opposite_halfedge_handle(heh0);\n  HalfedgeHandle next_prev_heh = next_halfedge_handle(_prev_heh);\n  HalfedgeHandle prev_next_heh = prev_halfedge_handle(_next_heh);\n  set_next_halfedge_handle(_prev_heh, heh0);\n  set_next_halfedge_handle(heh0, _next_heh);\n  set_next_halfedge_handle(prev_next_heh, heh1);\n  set_next_halfedge_handle(heh1, next_prev_heh);\n  \n  //now set the face handles - the new face is assigned to heh0\n  FaceHandle new_fh = new_face();\n  set_halfedge_handle(new_fh, heh0);\n  for (FaceHalfedgeIter fh_it = fh_iter(new_fh); fh_it.is_valid(); ++fh_it)\n  {\n    set_face_handle(*fh_it, new_fh);\n  }  \n  FaceHandle old_fh = face_handle(next_prev_heh);\n  set_face_handle(heh1, old_fh);   \n  if (old_fh.is_valid() && face_handle(halfedge_handle(old_fh)) == new_fh)\n  {//fh pointed to one of the halfedges now assigned to new_fh\n    set_halfedge_handle(old_fh, heh1);\n  }\n  adjust_outgoing_halfedge(vh0);  \n  adjust_outgoing_halfedge(vh1);  \n  return heh0;\n}\n\n//-----------------------------------------------------------------------------\nvoid PolyConnectivity::triangulate(FaceHandle _fh)\n{\n  /*\n    Split an arbitrary face into triangles by connecting\n    each vertex of fh after its second to vh.\n\n    - fh will remain valid (it will become one of the\n      triangles)\n    - the halfedge handles of the new triangles will\n      point to the old halfedges\n  */\n\n  HalfedgeHandle base_heh(halfedge_handle(_fh));\n  VertexHandle start_vh = from_vertex_handle(base_heh);\n  HalfedgeHandle next_heh(next_halfedge_handle(base_heh));\n\n  while (to_vertex_handle(next_halfedge_handle(next_heh)) != start_vh)\n  {\n    HalfedgeHandle next_next_heh(next_halfedge_handle(next_heh));\n\n    FaceHandle new_fh = new_face();\n    set_halfedge_handle(new_fh, base_heh);\n\n    HalfedgeHandle new_heh = new_edge(to_vertex_handle(next_heh), start_vh);\n\n    set_next_halfedge_handle(base_heh, next_heh);\n    set_next_halfedge_handle(next_heh, new_heh);\n    set_next_halfedge_handle(new_heh, base_heh);\n\n    set_face_handle(base_heh, new_fh);\n    set_face_handle(next_heh, new_fh);\n    set_face_handle(new_heh,  new_fh);\n\n    base_heh = opposite_halfedge_handle(new_heh);\n    next_heh = next_next_heh;\n  }\n  set_halfedge_handle(_fh, base_heh);  //the last face takes the handle _fh\n\n  set_next_halfedge_handle(base_heh, next_heh);\n  set_next_halfedge_handle(next_halfedge_handle(next_heh), base_heh);\n\n  set_face_handle(base_heh, _fh);\n}\n\n//-----------------------------------------------------------------------------\nvoid PolyConnectivity::triangulate()\n{\n  /* The iterators will stay valid, even though new faces are added,\n     because they are now implemented index-based instead of\n     pointer-based.\n  */\n  FaceIter f_it(faces_begin()), f_end(faces_end());\n  for (; f_it!=f_end; ++f_it)\n    triangulate(*f_it);\n}\n\n//-----------------------------------------------------------------------------\nvoid PolyConnectivity::split(FaceHandle fh, VertexHandle vh)\n{\n  HalfedgeHandle hend = halfedge_handle(fh);\n  HalfedgeHandle hh   = next_halfedge_handle(hend);\n\n  HalfedgeHandle hold = new_edge(to_vertex_handle(hend), vh);\n\n  set_next_halfedge_handle(hend, hold);\n  set_face_handle(hold, fh);\n\n  hold = opposite_halfedge_handle(hold);\n\n  while (hh != hend) {\n\n    HalfedgeHandle hnext = next_halfedge_handle(hh);\n\n    FaceHandle fnew = new_face();\n    set_halfedge_handle(fnew, hh);\n\n    HalfedgeHandle hnew = new_edge(to_vertex_handle(hh), vh);\n\n    set_next_halfedge_handle(hnew, hold);\n    set_next_halfedge_handle(hold, hh);\n    set_next_halfedge_handle(hh, hnew);\n\n    set_face_handle(hnew, fnew);\n    set_face_handle(hold, fnew);\n    set_face_handle(hh,   fnew);\n\n    hold = opposite_halfedge_handle(hnew);\n\n    hh = hnext;\n  }\n\n  set_next_halfedge_handle(hold, hend);\n  set_next_halfedge_handle(next_halfedge_handle(hend), hold);\n\n  set_face_handle(hold, fh);\n\n  set_halfedge_handle(vh, hold);\n}\n\n\nvoid PolyConnectivity::split_copy(FaceHandle fh, VertexHandle vh) {\n\n  // Split the given face (fh will still be valid)\n  split(fh, vh);\n\n  // Copy the property of the original face to all new faces\n  for(VertexFaceIter vf_it =  vf_iter(vh); vf_it.is_valid(); ++vf_it)\n    copy_all_properties(fh, *vf_it);\n}\n\n//-----------------------------------------------------------------------------\nuint PolyConnectivity::valence(VertexHandle _vh) const\n{\n  uint count(0);\n  for (ConstVertexVertexIter vv_it=cvv_iter(_vh); vv_it.is_valid(); ++vv_it)\n    ++count;\n  return count;\n}\n\n//-----------------------------------------------------------------------------\nuint PolyConnectivity::valence(FaceHandle _fh) const\n{\n  uint count(0);\n  for (ConstFaceVertexIter fv_it=cfv_iter(_fh); fv_it.is_valid(); ++fv_it)\n    ++count;\n  return count;\n}\n\n//-----------------------------------------------------------------------------\nvoid PolyConnectivity::split_edge(EdgeHandle _eh, VertexHandle _vh)\n{\n  HalfedgeHandle h0 = halfedge_handle(_eh, 0);\n  HalfedgeHandle h1 = halfedge_handle(_eh, 1);\n  \n  VertexHandle vfrom = from_vertex_handle(h0);\n\n  HalfedgeHandle ph0 = prev_halfedge_handle(h0);\n  HalfedgeHandle ph1 = prev_halfedge_handle(h1);\n  \n  HalfedgeHandle nh0 = next_halfedge_handle(h0);\n  HalfedgeHandle nh1 = next_halfedge_handle(h1);\n  \n  bool boundary0 = is_boundary(h0);\n  bool boundary1 = is_boundary(h1);\n  \n  //add the new edge\n  HalfedgeHandle new_e = new_edge(from_vertex_handle(h0), _vh);\n  \n  //fix the vertex of the opposite halfedge\n  set_vertex_handle(h1, _vh);\n  \n  //fix the halfedge connectivity\n  set_next_halfedge_handle(new_e, h0);\n  set_next_halfedge_handle(h1, opposite_halfedge_handle(new_e));\n  \n  set_next_halfedge_handle(ph0, new_e);\n  set_next_halfedge_handle(opposite_halfedge_handle(new_e), nh1);\n  \n//  set_prev_halfedge_handle(new_e, ph0);\n//  set_prev_halfedge_handle(opposite_halfedge_handle(new_e), h1);\n  \n//  set_prev_halfedge_handle(nh1, opposite_halfedge_handle(new_e));\n//  set_prev_halfedge_handle(h0, new_e);\n  \n  if (!boundary0)\n  {\n    set_face_handle(new_e, face_handle(h0));\n  }\n  else\n  {\n    set_boundary(new_e);\n  }\n  \n  if (!boundary1)\n  {\n    set_face_handle(opposite_halfedge_handle(new_e), face_handle(h1));\n  }\n  else\n  {\n    set_boundary(opposite_halfedge_handle(new_e));\n  }\n\n  set_halfedge_handle( _vh, h0 );\n  adjust_outgoing_halfedge( _vh );\n  \n  if (halfedge_handle(vfrom) == h0)\n  {\n    set_halfedge_handle(vfrom, new_e);\n    adjust_outgoing_halfedge( vfrom );\n  }\n}\n\n//-----------------------------------------------------------------------------\n\nvoid PolyConnectivity::split_edge_copy(EdgeHandle _eh, VertexHandle _vh)\n{\n  // Split the edge (handle is kept!)\n  split_edge(_eh, _vh);\n\n  // Navigate to the new edge\n  EdgeHandle eh0 = edge_handle( next_halfedge_handle( halfedge_handle(_eh, 1) ) );\n\n  // Copy the property from the original to the new edge\n  copy_all_properties(_eh, eh0);\n}\n\n} // namespace OpenMesh\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Mesh/PolyConnectivity.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 1059 $                                                         *\n *   $Date: 2014-05-13 12:36:57 +0200 (火, 13 5 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n#ifndef OPENMESH_POLYCONNECTIVITY_HH\n#define OPENMESH_POLYCONNECTIVITY_HH\n\n#include <OpenMesh/Core/Mesh/ArrayKernel.hh>\n#include <OpenMesh/Core/Mesh/IteratorsT.hh>\n#include <OpenMesh/Core/Mesh/CirculatorsT.hh>\n\nnamespace OpenMesh\n{\n\n/** \\brief Connectivity Class for polygonal meshes\n*/\nclass OPENMESHDLLEXPORT PolyConnectivity : public ArrayKernel\n{\npublic:\n  /// \\name Mesh Handles\n  //@{\n  /// Invalid handle\n  static const VertexHandle                           InvalidVertexHandle;\n  /// Invalid handle\n  static const HalfedgeHandle                         InvalidHalfedgeHandle;\n  /// Invalid handle\n  static const EdgeHandle                             InvalidEdgeHandle;\n  /// Invalid handle\n  static const FaceHandle                             InvalidFaceHandle;\n  //@}\n\n  typedef PolyConnectivity                            This;\n\n  //--- iterators ---\n\n  /** \\name Mesh Iterators\n      Refer to OpenMesh::Mesh::Iterators or \\ref mesh_iterators for\n      documentation.\n  */\n  //@{\n  /// Linear iterator\n  typedef Iterators::GenericIteratorT<This, This::VertexHandle, ArrayKernel, &This::has_vertex_status, &This::n_vertices> VertexIter;\n  typedef Iterators::GenericIteratorT<This, This::HalfedgeHandle, ArrayKernel, &This::has_halfedge_status, &This::n_halfedges> HalfedgeIter;\n  typedef Iterators::GenericIteratorT<This, This::EdgeHandle, ArrayKernel, &This::has_edge_status, &This::n_edges> EdgeIter;\n  typedef Iterators::GenericIteratorT<This, This::FaceHandle, ArrayKernel, &This::has_face_status, &This::n_faces> FaceIter;\n\n  typedef VertexIter ConstVertexIter;\n  typedef HalfedgeIter ConstHalfedgeIter;\n  typedef EdgeIter ConstEdgeIter;\n  typedef FaceIter ConstFaceIter;\n  //@}\n\n  //--- circulators ---\n\n  /** \\name Mesh Circulators\n      Refer to OpenMesh::Mesh::Iterators or \\ref mesh_iterators\n      for documentation.\n  */\n  //@{\n\n  /*\n   * Vertex-centered circulators\n   */\n  typedef Iterators::GenericCirculatorT<This,  This::VertexHandle,  This::VertexHandle,\n          &Iterators::GenericCirculatorBaseT<This>::toVertexHandle>\n  VertexVertexIter;\n\n  typedef Iterators::GenericCirculatorT<This,  This::VertexHandle,  This::HalfedgeHandle,\n          &Iterators::GenericCirculatorBaseT<This>::toHalfedgeHandle>\n  VertexOHalfedgeIter;\n\n  typedef Iterators::GenericCirculatorT<This,  This::VertexHandle,  This::HalfedgeHandle,\n          &Iterators::GenericCirculatorBaseT<This>::toOppositeHalfedgeHandle>\n  VertexIHalfedgeIter;\n\n  typedef Iterators::GenericCirculatorT<This,  This::VertexHandle,  This::FaceHandle,\n          &Iterators::GenericCirculatorBaseT<This>::toFaceHandle>\n  VertexFaceIter;\n\n  typedef Iterators::GenericCirculatorT<This,  This::VertexHandle,  This::EdgeHandle,\n          &Iterators::GenericCirculatorBaseT<This>::toEdgeHandle>\n  VertexEdgeIter;\n\n  typedef Iterators::GenericCirculatorT<This, This::FaceHandle, This::HalfedgeHandle,\n      &Iterators::GenericCirculatorBaseT<This>::toHalfedgeHandle>\n  HalfedgeLoopIter;\n\n  typedef VertexVertexIter    ConstVertexVertexIter;\n  typedef VertexOHalfedgeIter ConstVertexOHalfedgeIter;\n  typedef VertexIHalfedgeIter ConstVertexIHalfedgeIter;\n  typedef VertexFaceIter      ConstVertexFaceIter;\n  typedef VertexEdgeIter      ConstVertexEdgeIter;\n\n  /*\n   * Face-centered circulators\n   */\n  typedef Iterators::GenericCirculatorT<This,  This::FaceHandle,  This::VertexHandle,\n          &Iterators::GenericCirculatorBaseT<This>::toVertexHandle>\n  FaceVertexIter;\n\n  typedef Iterators::GenericCirculatorT<This,  This::FaceHandle,  This::HalfedgeHandle,\n          &Iterators::GenericCirculatorBaseT<This>::toHalfedgeHandle>\n  FaceHalfedgeIter;\n\n  typedef Iterators::GenericCirculatorT<This,  This::FaceHandle,  This::EdgeHandle,\n          &Iterators::GenericCirculatorBaseT<This>::toEdgeHandle>\n  FaceEdgeIter;\n\n  typedef Iterators::GenericCirculatorT<This,  This::FaceHandle,  This::FaceHandle,\n          &Iterators::GenericCirculatorBaseT<This>::toOppositeFaceHandle>\n  FaceFaceIter;\n\n  typedef FaceVertexIter      ConstFaceVertexIter;\n  typedef FaceHalfedgeIter    ConstFaceHalfedgeIter;\n  typedef FaceEdgeIter        ConstFaceEdgeIter;\n  typedef FaceFaceIter        ConstFaceFaceIter;\n\n  /*\n   * Halfedge circulator\n   */\n  typedef HalfedgeLoopIter   ConstHalfedgeLoopIter;\n\n  //@}\n\n  // --- shortcuts\n\n  /** \\name Typedef Shortcuts\n      Provided for convenience only\n  */\n  //@{\n  /// Alias typedef\n  typedef VertexHandle    VHandle;\n  typedef HalfedgeHandle  HHandle;\n  typedef EdgeHandle      EHandle;\n  typedef FaceHandle      FHandle;\n\n  typedef VertexIter    VIter;\n  typedef HalfedgeIter  HIter;\n  typedef EdgeIter      EIter;\n  typedef FaceIter      FIter;\n\n  typedef ConstVertexIter    CVIter;\n  typedef ConstHalfedgeIter  CHIter;\n  typedef ConstEdgeIter      CEIter;\n  typedef ConstFaceIter      CFIter;\n\n  typedef VertexVertexIter      VVIter;\n  typedef VertexOHalfedgeIter   VOHIter;\n  typedef VertexIHalfedgeIter   VIHIter;\n  typedef VertexEdgeIter        VEIter;\n  typedef VertexFaceIter        VFIter;\n  typedef FaceVertexIter        FVIter;\n  typedef FaceHalfedgeIter      FHIter;\n  typedef FaceEdgeIter          FEIter;\n  typedef FaceFaceIter          FFIter;\n\n  typedef ConstVertexVertexIter      CVVIter;\n  typedef ConstVertexOHalfedgeIter   CVOHIter;\n  typedef ConstVertexIHalfedgeIter   CVIHIter;\n  typedef ConstVertexEdgeIter        CVEIter;\n  typedef ConstVertexFaceIter        CVFIter;\n  typedef ConstFaceVertexIter        CFVIter;\n  typedef ConstFaceHalfedgeIter      CFHIter;\n  typedef ConstFaceEdgeIter          CFEIter;\n  typedef ConstFaceFaceIter          CFFIter;\n  //@}\n\npublic:\n\n  PolyConnectivity()  {}\n  virtual ~PolyConnectivity() {}\n\n  inline static bool is_triangles()\n  { return false; }\n\n  /** assign_connectivity() method. See ArrayKernel::assign_connectivity()\n      for more details. */\n  inline void assign_connectivity(const PolyConnectivity& _other)\n  { ArrayKernel::assign_connectivity(_other); }\n  \n  /** \\name Adding items to a mesh\n  */\n  //@{\n\n  /// Add a new vertex \n  inline VertexHandle add_vertex()\n  { return new_vertex(); }\n\n  /** \\brief Add and connect a new face\n  *\n  * Create a new face consisting of the vertices provided by the vertex handle vector.\n  * (The vertices have to be already added to the mesh by add_vertex)\n  *\n  * @param _vhandles sorted list of vertex handles (also defines order in which the vertices are added to the face)\n  */\n  FaceHandle add_face(const std::vector<VertexHandle>& _vhandles);\n \n   \n  /** \\brief Add and connect a new face\n  *\n  * Create a new face consisting of three vertices provided by the handles.\n  * (The vertices have to be already added to the mesh by add_vertex)\n  *\n  * @param _vh0 First  vertex handle\n  * @param _vh1 Second vertex handle\n  * @param _vh2 Third  vertex handle\n  */\n  FaceHandle add_face(VertexHandle _vh0, VertexHandle _vh1, VertexHandle _vh2);\n\n  /** \\brief Add and connect a new face\n  *\n  * Create a new face consisting of four vertices provided by the handles.\n  * (The vertices have to be already added to the mesh by add_vertex)\n  *\n  * @param _vh0 First  vertex handle\n  * @param _vh1 Second vertex handle\n  * @param _vh2 Third  vertex handle\n  * @param _vh3 Fourth vertex handle\n  */\n  FaceHandle add_face(VertexHandle _vh0, VertexHandle _vh1, VertexHandle _vh2, VertexHandle _vh3);\n \n  /** \\brief Add and connect a new face\n  *\n  * Create a new face consisting of vertices provided by a handle array.\n  * (The vertices have to be already added to the mesh by add_vertex)\n  *\n  * @param _vhandles pointer to a sorted list of vertex handles (also defines order in which the vertices are added to the face)\n  * @param _vhs_size number of vertex handles in the array\n  */\n  FaceHandle add_face(const VertexHandle* _vhandles, size_t _vhs_size);\n\n  //@}\n\n  /// \\name Deleting mesh items and other connectivity/topology modifications\n  //@{\n\n  /** Returns whether collapsing halfedge _heh is ok or would lead to\n      topological inconsistencies.\n      \\attention This method need the Attributes::Status attribute and\n      changes the \\em tagged bit.  */\n  bool is_collapse_ok(HalfedgeHandle _he);\n    \n    \n  /** Mark vertex and all incident edges and faces deleted.\n      Items marked deleted will be removed by garbageCollection().\n      \\attention Needs the Attributes::Status attribute for vertices,\n      edges and faces.\n  */\n  void delete_vertex(VertexHandle _vh, bool _delete_isolated_vertices = true);\n\n  /** Mark edge (two opposite halfedges) and incident faces deleted.\n      Resulting isolated vertices are marked deleted if\n      _delete_isolated_vertices is true. Items marked deleted will be\n      removed by garbageCollection().\n\n      \\attention Needs the Attributes::Status attribute for vertices,\n      edges and faces.\n  */\n  void delete_edge(EdgeHandle _eh, bool _delete_isolated_vertices=true);\n\n  /** Delete face _fh and resulting degenerated empty halfedges as\n      well.  Resulting isolated vertices will be deleted if\n      _delete_isolated_vertices is true.\n\n      \\attention All item will only be marked to be deleted. They will\n      actually be removed by calling garbage_collection().\n\n      \\attention Needs the Attributes::Status attribute for vertices,\n      edges and faces.\n  */\n  void delete_face(FaceHandle _fh, bool _delete_isolated_vertices=true);\n\n  //@}\n  \n  /** \\name Begin and end iterators\n  */\n  //@{\n\n  /// Begin iterator for vertices\n  VertexIter vertices_begin();\n  /// Const begin iterator for vertices\n  ConstVertexIter vertices_begin() const;\n  /// End iterator for vertices\n  VertexIter vertices_end();\n  /// Const end iterator for vertices\n  ConstVertexIter vertices_end() const;\n\n  /// Begin iterator for halfedges\n  HalfedgeIter halfedges_begin();\n  /// Const begin iterator for halfedges\n  ConstHalfedgeIter halfedges_begin() const;\n  /// End iterator for halfedges\n  HalfedgeIter halfedges_end();\n  /// Const end iterator for halfedges\n  ConstHalfedgeIter halfedges_end() const;\n\n  /// Begin iterator for edges\n  EdgeIter edges_begin();\n  /// Const begin iterator for edges\n  ConstEdgeIter edges_begin() const;\n  /// End iterator for edges\n  EdgeIter edges_end();\n  /// Const end iterator for edges\n  ConstEdgeIter edges_end() const;\n\n  /// Begin iterator for faces\n  FaceIter faces_begin();\n  /// Const begin iterator for faces\n  ConstFaceIter faces_begin() const;\n  /// End iterator for faces\n  FaceIter faces_end();\n  /// Const end iterator for faces\n  ConstFaceIter faces_end() const;\n  //@}\n\n\n  /** \\name Begin for skipping iterators\n  */\n  //@{\n\n  /// Begin iterator for vertices\n  VertexIter vertices_sbegin()\n  { return VertexIter(*this, VertexHandle(0), true); }\n  /// Const begin iterator for vertices\n  ConstVertexIter vertices_sbegin() const\n  { return ConstVertexIter(*this, VertexHandle(0), true); }\n\n  /// Begin iterator for halfedges\n  HalfedgeIter halfedges_sbegin()\n  { return HalfedgeIter(*this, HalfedgeHandle(0), true); }\n  /// Const begin iterator for halfedges\n  ConstHalfedgeIter halfedges_sbegin() const\n  { return ConstHalfedgeIter(*this, HalfedgeHandle(0), true); }\n\n  /// Begin iterator for edges\n  EdgeIter edges_sbegin()\n  { return EdgeIter(*this, EdgeHandle(0), true); }\n  /// Const begin iterator for edges\n  ConstEdgeIter edges_sbegin() const\n  { return ConstEdgeIter(*this, EdgeHandle(0), true); }\n\n  /// Begin iterator for faces\n  FaceIter faces_sbegin()\n  { return FaceIter(*this, FaceHandle(0), true); }\n  /// Const begin iterator for faces\n  ConstFaceIter faces_sbegin() const\n  { return ConstFaceIter(*this, FaceHandle(0), true); }\n\n  //@}\n\n  //--- circulators ---\n\n  /** \\name Vertex and Face circulators\n  */\n  //@{\n\n  /// vertex - vertex circulator\n  VertexVertexIter vv_iter(VertexHandle _vh)\n  { return VertexVertexIter(*this, _vh); }\n  /// vertex - incoming halfedge circulator\n  VertexIHalfedgeIter vih_iter(VertexHandle _vh)\n  { return VertexIHalfedgeIter(*this, _vh); }\n  /// vertex - outgoing halfedge circulator\n  VertexOHalfedgeIter voh_iter(VertexHandle _vh)\n  { return VertexOHalfedgeIter(*this, _vh); }\n  /// vertex - edge circulator\n  VertexEdgeIter ve_iter(VertexHandle _vh)\n  { return VertexEdgeIter(*this, _vh); }\n  /// vertex - face circulator\n  VertexFaceIter vf_iter(VertexHandle _vh)\n  { return VertexFaceIter(*this, _vh); }\n\n  /// const vertex circulator\n  ConstVertexVertexIter cvv_iter(VertexHandle _vh) const\n  { return ConstVertexVertexIter(*this, _vh); }\n  /// const vertex - incoming halfedge circulator\n  ConstVertexIHalfedgeIter cvih_iter(VertexHandle _vh) const\n  { return ConstVertexIHalfedgeIter(*this, _vh); }\n  /// const vertex - outgoing halfedge circulator\n  ConstVertexOHalfedgeIter cvoh_iter(VertexHandle _vh) const\n  { return ConstVertexOHalfedgeIter(*this, _vh); }\n  /// const vertex - edge circulator\n  ConstVertexEdgeIter cve_iter(VertexHandle _vh) const\n  { return ConstVertexEdgeIter(*this, _vh); }\n  /// const vertex - face circulator\n  ConstVertexFaceIter cvf_iter(VertexHandle _vh) const\n  { return ConstVertexFaceIter(*this, _vh); }\n\n  /// face - vertex circulator\n  FaceVertexIter fv_iter(FaceHandle _fh)\n  { return FaceVertexIter(*this, _fh); }\n  /// face - halfedge circulator\n  FaceHalfedgeIter fh_iter(FaceHandle _fh)\n  { return FaceHalfedgeIter(*this, _fh); }\n  /// face - edge circulator\n  FaceEdgeIter fe_iter(FaceHandle _fh)\n  { return FaceEdgeIter(*this, _fh); }\n  /// face - face circulator\n  FaceFaceIter ff_iter(FaceHandle _fh)\n  { return FaceFaceIter(*this, _fh); }\n\n  /// const face - vertex circulator\n  ConstFaceVertexIter cfv_iter(FaceHandle _fh) const\n  { return ConstFaceVertexIter(*this, _fh); }\n  /// const face - halfedge circulator\n  ConstFaceHalfedgeIter cfh_iter(FaceHandle _fh) const\n  { return ConstFaceHalfedgeIter(*this, _fh); }\n  /// const face - edge circulator\n  ConstFaceEdgeIter cfe_iter(FaceHandle _fh) const\n  { return ConstFaceEdgeIter(*this, _fh); }\n  /// const face - face circulator\n  ConstFaceFaceIter cff_iter(FaceHandle _fh) const\n  { return ConstFaceFaceIter(*this, _fh); }\n  \n  // 'begin' circulators\n  \n  /// vertex - vertex circulator\n  VertexVertexIter vv_begin(VertexHandle _vh)\n  { return VertexVertexIter(*this, _vh); }\n  /// vertex - incoming halfedge circulator\n  VertexIHalfedgeIter vih_begin(VertexHandle _vh)\n  { return VertexIHalfedgeIter(*this, _vh); }\n  /// vertex - outgoing halfedge circulator\n  VertexOHalfedgeIter voh_begin(VertexHandle _vh)\n  { return VertexOHalfedgeIter(*this, _vh); }\n  /// vertex - edge circulator\n  VertexEdgeIter ve_begin(VertexHandle _vh)\n  { return VertexEdgeIter(*this, _vh); }\n  /// vertex - face circulator\n  VertexFaceIter vf_begin(VertexHandle _vh)\n  { return VertexFaceIter(*this, _vh); }\n\n  /// const vertex circulator\n  ConstVertexVertexIter cvv_begin(VertexHandle _vh) const\n  { return ConstVertexVertexIter(*this, _vh); }\n  /// const vertex - incoming halfedge circulator\n  ConstVertexIHalfedgeIter cvih_begin(VertexHandle _vh) const\n  { return ConstVertexIHalfedgeIter(*this, _vh); }\n  /// const vertex - outgoing halfedge circulator\n  ConstVertexOHalfedgeIter cvoh_begin(VertexHandle _vh) const\n  { return ConstVertexOHalfedgeIter(*this, _vh); }\n  /// const vertex - edge circulator\n  ConstVertexEdgeIter cve_begin(VertexHandle _vh) const\n  { return ConstVertexEdgeIter(*this, _vh); }\n  /// const vertex - face circulator\n  ConstVertexFaceIter cvf_begin(VertexHandle _vh) const\n  { return ConstVertexFaceIter(*this, _vh); }\n\n  /// face - vertex circulator\n  FaceVertexIter fv_begin(FaceHandle _fh)\n  { return FaceVertexIter(*this, _fh); }\n  /// face - halfedge circulator\n  FaceHalfedgeIter fh_begin(FaceHandle _fh)\n  { return FaceHalfedgeIter(*this, _fh); }\n  /// face - edge circulator\n  FaceEdgeIter fe_begin(FaceHandle _fh)\n  { return FaceEdgeIter(*this, _fh); }\n  /// face - face circulator\n  FaceFaceIter ff_begin(FaceHandle _fh)\n  { return FaceFaceIter(*this, _fh); }\n  /// halfedge circulator\n  HalfedgeLoopIter hl_begin(HalfedgeHandle _heh)\n  { return HalfedgeLoopIter(*this, _heh); }\n\n  /// const face - vertex circulator\n  ConstFaceVertexIter cfv_begin(FaceHandle _fh) const\n  { return ConstFaceVertexIter(*this, _fh); }\n  /// const face - halfedge circulator\n  ConstFaceHalfedgeIter cfh_begin(FaceHandle _fh) const\n  { return ConstFaceHalfedgeIter(*this, _fh); }\n  /// const face - edge circulator\n  ConstFaceEdgeIter cfe_begin(FaceHandle _fh) const\n  { return ConstFaceEdgeIter(*this, _fh); }\n  /// const face - face circulator\n  ConstFaceFaceIter cff_begin(FaceHandle _fh) const\n  { return ConstFaceFaceIter(*this, _fh); }\n  /// const halfedge circulator\n  ConstHalfedgeLoopIter chl_begin(HalfedgeHandle _heh) const\n  { return ConstHalfedgeLoopIter(*this, _heh); }\n  \n  // 'end' circulators\n  \n  /// vertex - vertex circulator\n  VertexVertexIter vv_end(VertexHandle _vh)\n  { return VertexVertexIter(*this, _vh, true); }\n  /// vertex - incoming halfedge circulator\n  VertexIHalfedgeIter vih_end(VertexHandle _vh)\n  { return VertexIHalfedgeIter(*this, _vh, true); }\n  /// vertex - outgoing halfedge circulator\n  VertexOHalfedgeIter voh_end(VertexHandle _vh)\n  { return VertexOHalfedgeIter(*this, _vh, true); }\n  /// vertex - edge circulator\n  VertexEdgeIter ve_end(VertexHandle _vh)\n  { return VertexEdgeIter(*this, _vh, true); }\n  /// vertex - face circulator\n  VertexFaceIter vf_end(VertexHandle _vh)\n  { return VertexFaceIter(*this, _vh, true); }\n\n  /// const vertex circulator\n  ConstVertexVertexIter cvv_end(VertexHandle _vh) const\n  { return ConstVertexVertexIter(*this, _vh, true); }\n  /// const vertex - incoming halfedge circulator\n  ConstVertexIHalfedgeIter cvih_end(VertexHandle _vh) const\n  { return ConstVertexIHalfedgeIter(*this, _vh, true); }\n  /// const vertex - outgoing halfedge circulator\n  ConstVertexOHalfedgeIter cvoh_end(VertexHandle _vh) const\n  { return ConstVertexOHalfedgeIter(*this, _vh, true); }\n  /// const vertex - edge circulator\n  ConstVertexEdgeIter cve_end(VertexHandle _vh) const\n  { return ConstVertexEdgeIter(*this, _vh, true); }\n  /// const vertex - face circulator\n  ConstVertexFaceIter cvf_end(VertexHandle _vh) const\n  { return ConstVertexFaceIter(*this, _vh, true); }\n\n  /// face - vertex circulator\n  FaceVertexIter fv_end(FaceHandle _fh)\n  { return FaceVertexIter(*this, _fh, true); }\n  /// face - halfedge circulator\n  FaceHalfedgeIter fh_end(FaceHandle _fh)\n  { return FaceHalfedgeIter(*this, _fh, true); }\n  /// face - edge circulator\n  FaceEdgeIter fe_end(FaceHandle _fh)\n  { return FaceEdgeIter(*this, _fh, true); }\n  /// face - face circulator\n  FaceFaceIter ff_end(FaceHandle _fh)\n  { return FaceFaceIter(*this, _fh, true); }\n  /// face - face circulator\n  HalfedgeLoopIter hl_end(HalfedgeHandle _heh)\n  { return HalfedgeLoopIter(*this, _heh, true); }\n\n  /// const face - vertex circulator\n  ConstFaceVertexIter cfv_end(FaceHandle _fh) const\n  { return ConstFaceVertexIter(*this, _fh, true); }\n  /// const face - halfedge circulator\n  ConstFaceHalfedgeIter cfh_end(FaceHandle _fh) const\n  { return ConstFaceHalfedgeIter(*this, _fh, true); }\n  /// const face - edge circulator\n  ConstFaceEdgeIter cfe_end(FaceHandle _fh) const\n  { return ConstFaceEdgeIter(*this, _fh, true); }\n  /// const face - face circulator\n  ConstFaceFaceIter cff_end(FaceHandle _fh) const\n  { return ConstFaceFaceIter(*this, _fh, true); }\n  /// const face - face circulator\n  ConstHalfedgeLoopIter chl_end(HalfedgeHandle _heh) const\n  { return ConstHalfedgeLoopIter(*this, _heh, true); }\n  //@}\n\n  /** @name Range based iterators and circulators */\n  //@{\n\n  /// Generic class for vertex/halfedge/edge/face ranges.\n  template<\n      typename CONTAINER_TYPE,\n      typename ITER_TYPE,\n      ITER_TYPE (CONTAINER_TYPE::*begin_fn)() const,\n      ITER_TYPE (CONTAINER_TYPE::*end_fn)() const>\n  class EntityRange {\n      public:\n          EntityRange(CONTAINER_TYPE &container) : container_(container) {}\n          ITER_TYPE begin() { return (container_.*begin_fn)(); }\n          ITER_TYPE end() { return (container_.*end_fn)(); }\n\n      private:\n          CONTAINER_TYPE &container_;\n  };\n  typedef EntityRange<\n          const PolyConnectivity,\n          PolyConnectivity::ConstVertexIter,\n          &PolyConnectivity::vertices_begin,\n          &PolyConnectivity::vertices_end> ConstVertexRange;\n  typedef EntityRange<\n          const PolyConnectivity,\n          PolyConnectivity::ConstHalfedgeIter,\n          &PolyConnectivity::halfedges_begin,\n          &PolyConnectivity::halfedges_end> ConstHalfedgeRange;\n  typedef EntityRange<\n          const PolyConnectivity,\n          PolyConnectivity::ConstEdgeIter,\n          &PolyConnectivity::edges_begin,\n          &PolyConnectivity::edges_end> ConstEdgeRange;\n  typedef EntityRange<\n          const PolyConnectivity,\n          PolyConnectivity::ConstFaceIter,\n          &PolyConnectivity::faces_begin,\n          &PolyConnectivity::faces_end> ConstFaceRange;\n\n  /**\n   * @return The vertices as a range object suitable\n   * for C++11 range based for loops.\n   */\n  ConstVertexRange vertices() const { return ConstVertexRange(*this); }\n\n  /**\n   * @return The halfedges as a range object suitable\n   * for C++11 range based for loops.\n   */\n  ConstHalfedgeRange halfedges() const { return ConstHalfedgeRange(*this); }\n\n  /**\n   * @return The edges as a range object suitabl\n   * for C++11 range based for loops.\n   */\n  ConstEdgeRange edges() const { return ConstEdgeRange(*this); }\n\n  /**\n   * @return The faces as a range object suitable\n   * for C++11 range based for loops.\n   */\n  ConstFaceRange faces() const { return ConstFaceRange(*this); }\n\n  /// Generic class for iterator ranges.\n  template<\n      typename CONTAINER_TYPE,\n      typename ITER_TYPE,\n      typename CENTER_ENTITY_TYPE,\n      ITER_TYPE (CONTAINER_TYPE::*begin_fn)(CENTER_ENTITY_TYPE) const,\n      ITER_TYPE (CONTAINER_TYPE::*end_fn)(CENTER_ENTITY_TYPE) const>\n  class CirculatorRange {\n      public:\n          CirculatorRange(\n                  CONTAINER_TYPE &container,\n                  CENTER_ENTITY_TYPE center) :\n              container_(container), center_(center) {}\n          ITER_TYPE begin() { return (container_.*begin_fn)(center_); }\n          ITER_TYPE end() { return (container_.*end_fn)(center_); }\n\n      private:\n          CONTAINER_TYPE &container_;\n          CENTER_ENTITY_TYPE center_;\n  };\n\n  typedef CirculatorRange<\n          const PolyConnectivity,\n          ConstVertexVertexIter,\n          VertexHandle,\n          &PolyConnectivity::cvv_begin,\n          &PolyConnectivity::cvv_end> ConstVertexVertexRange;\n  typedef CirculatorRange<\n          const PolyConnectivity,\n          ConstVertexIHalfedgeIter,\n          VertexHandle,\n          &PolyConnectivity::cvih_begin,\n          &PolyConnectivity::cvih_end> ConstVertexIHalfedgeRange;\n  typedef CirculatorRange<\n          const PolyConnectivity,\n          ConstVertexOHalfedgeIter, VertexHandle,\n          &PolyConnectivity::cvoh_begin,\n          &PolyConnectivity::cvoh_end> ConstVertexOHalfedgeRange;\n  typedef CirculatorRange<\n          const PolyConnectivity,\n          ConstVertexEdgeIter,\n          VertexHandle,\n          &PolyConnectivity::cve_begin,\n          &PolyConnectivity::cve_end> ConstVertexEdgeRange;\n  typedef CirculatorRange<\n          const PolyConnectivity,\n          ConstVertexFaceIter,\n          VertexHandle,\n          &PolyConnectivity::cvf_begin,\n          &PolyConnectivity::cvf_end> ConstVertexFaceRange;\n  typedef CirculatorRange<\n          const PolyConnectivity,\n          ConstFaceVertexIter,\n          FaceHandle,\n          &PolyConnectivity::cfv_begin,\n          &PolyConnectivity::cfv_end> ConstFaceVertexRange;\n  typedef CirculatorRange<\n          const PolyConnectivity,\n          ConstFaceHalfedgeIter,\n          FaceHandle,\n          &PolyConnectivity::cfh_begin,\n          &PolyConnectivity::cfh_end> ConstFaceHalfedgeRange;\n  typedef CirculatorRange<\n          const PolyConnectivity,\n          ConstFaceEdgeIter,\n          FaceHandle,\n          &PolyConnectivity::cfe_begin,\n          &PolyConnectivity::cfe_end> ConstFaceEdgeRange;\n  typedef CirculatorRange<\n          const PolyConnectivity,\n          ConstFaceFaceIter,\n          FaceHandle,\n          &PolyConnectivity::cff_begin,\n          &PolyConnectivity::cff_end> ConstFaceFaceRange;\n\n  /**\n   * @return The vertices adjacent to the specified vertex\n   * as a range object suitable for C++11 range based for loops.\n   */\n  ConstVertexVertexRange vv_range(VertexHandle _vh) const {\n      return ConstVertexVertexRange(*this, _vh);\n  }\n\n  /**\n   * @return The incoming halfedges incident to the specified vertex\n   * as a range object suitable for C++11 range based for loops.\n   */\n  ConstVertexIHalfedgeRange vih_range(VertexHandle _vh) const {\n      return ConstVertexIHalfedgeRange(*this, _vh);\n  }\n\n  /**\n   * @return The outgoing halfedges incident to the specified vertex\n   * as a range object suitable for C++11 range based for loops.\n   */\n  ConstVertexOHalfedgeRange voh_range(VertexHandle _vh) const {\n      return ConstVertexOHalfedgeRange(*this, _vh);\n  }\n\n  /**\n   * @return The edges incident to the specified vertex\n   * as a range object suitable for C++11 range based for loops.\n   */\n  ConstVertexEdgeRange ve_range(VertexHandle _vh) const {\n      return ConstVertexEdgeRange(*this, _vh);\n  }\n\n  /**\n   * @return The faces incident to the specified vertex\n   * as a range object suitable for C++11 range based for loops.\n   */\n  ConstVertexFaceRange vf_range(VertexHandle _vh) const {\n      return ConstVertexFaceRange(*this, _vh);\n  }\n\n  /**\n   * @return The vertices incident to the specified face\n   * as a range object suitable for C++11 range based for loops.\n   */\n  ConstFaceVertexRange fv_range(FaceHandle _fh) const {\n      return ConstFaceVertexRange(*this, _fh);\n  }\n\n  /**\n   * @return The halfedges incident to the specified face\n   * as a range object suitable for C++11 range based for loops.\n   */\n  ConstFaceHalfedgeRange fh_range(FaceHandle _fh) const {\n      return ConstFaceHalfedgeRange(*this, _fh);\n  }\n\n  /**\n   * @return The edges incident to the specified face\n   * as a range object suitable for C++11 range based for loops.\n   */\n  ConstFaceEdgeRange fe_range(FaceHandle _fh) const {\n      return ConstFaceEdgeRange(*this, _fh);\n  }\n\n  /**\n   * @return The faces adjacent to the specified face\n   * as a range object suitable for C++11 range based for loops.\n   */\n  ConstFaceFaceRange ff_range(FaceHandle _fh) const {\n      return ConstFaceFaceRange(*this, _fh);\n  }\n\n  //@}\n\n  //===========================================================================\n  /** @name Boundary and manifold tests\n   * @{ */\n  //===========================================================================\n\n  /** \\brief Check if the halfedge is at the boundary\n   *\n   * The halfedge is at the boundary, if no face is incident to it.\n   *\n   * @param _heh HalfedgeHandle to test\n   * @return boundary?\n   */\n  bool is_boundary(HalfedgeHandle _heh) const\n  { return ArrayKernel::is_boundary(_heh); }\n\n  /** \\brief Is the edge a boundary edge?\n   *\n   * Checks it the edge _eh is a boundary edge, i.e. is one of its halfedges\n   * a boundary halfedge.\n   *\n   * @param _eh Edge handle to test\n   * @return boundary?\n   */\n  bool is_boundary(EdgeHandle _eh) const\n  {\n    return (is_boundary(halfedge_handle(_eh, 0)) ||\n            is_boundary(halfedge_handle(_eh, 1)));\n  }\n\n  /** \\brief Is vertex _vh a boundary vertex ?\n   *\n   * Checks if the associated halfedge (which would on a boundary be the outside\n   * halfedge), is connected to a face. Which is equivalent, if the vertex is\n   * at the boundary of the mesh, as OpenMesh will make sure, that if there is a\n   * boundary halfedge at the vertex, the halfedge will be the one which is associated\n   * to the vertex.\n   *\n   * @param _vh VertexHandle to test\n   * @return boundary?\n   */\n  bool is_boundary(VertexHandle _vh) const\n  {\n    HalfedgeHandle heh(halfedge_handle(_vh));\n    return (!(heh.is_valid() && face_handle(heh).is_valid()));\n  }\n\n  /** \\brief Check if face is at the boundary\n   *\n   * Is face _fh at boundary, i.e. is one of its edges (or vertices)\n   * a boundary edge?\n   *\n   * @param _fh Check this face\n   * @param _check_vertex If \\c true, check the corner vertices of the face, too.\n   * @return boundary?\n   */\n  bool is_boundary(FaceHandle _fh, bool _check_vertex=false) const;\n\n  /** \\brief Is (the mesh at) vertex _vh  two-manifold ?\n   *\n   * The vertex is non-manifold if more than one gap exists, i.e.\n   * more than one outgoing boundary halfedge. If (at least) one\n   * boundary halfedge exists, the vertex' halfedge must be a\n   * boundary halfedge.\n   *\n   * @param _vh VertexHandle to test\n   * @return manifold?\n   */\n  bool is_manifold(VertexHandle _vh) const;\n\n  /** @} */\n\n  // --- shortcuts ---\n  \n  /// returns the face handle of the opposite halfedge \n  inline FaceHandle opposite_face_handle(HalfedgeHandle _heh) const\n  { return face_handle(opposite_halfedge_handle(_heh)); }\n    \n  // --- misc ---\n\n  /** Adjust outgoing halfedge handle for vertices, so that it is a\n      boundary halfedge whenever possible. \n  */\n  void adjust_outgoing_halfedge(VertexHandle _vh);\n\n  /// Find halfedge from _vh0 to _vh1. Returns invalid handle if not found.\n  HalfedgeHandle find_halfedge(VertexHandle _start_vh, VertexHandle _end_vh) const;\n  /// Vertex valence\n  uint valence(VertexHandle _vh) const;\n  /// Face valence\n  uint valence(FaceHandle _fh) const;\n  \n  // --- connectivity operattions \n    \n  /** Halfedge collapse: collapse the from-vertex of halfedge _heh\n      into its to-vertex.\n\n      \\attention Needs vertex/edge/face status attribute in order to\n      delete the items that degenerate.\n\n      \\note The from vertex is marked as deleted while the to vertex will still exist.\n\n      \\note This function does not perform a garbage collection. It\n      only marks degenerate items as deleted.\n\n      \\attention A halfedge collapse may lead to topological inconsistencies.\n      Therefore you should check this using is_collapse_ok().  \n  */\n  void collapse(HalfedgeHandle _heh);\n  /** return true if the this the only link between the faces adjacent to _eh.\n      _eh is allowed to be boundary, in which case true is returned iff _eh is \n      the only boundary edge of its ajdacent face.\n  */\n  bool is_simple_link(EdgeHandle _eh) const;\n  /** return true if _fh shares only one edge with all of its adjacent faces.\n      Boundary is treated as one face, i.e., the function false if _fh has more\n      than one boundary edge.\n  */\n  bool is_simply_connected(FaceHandle _fh) const;\n  /** Removes the edge _eh. Its adjacent faces are merged. _eh and one of the \n      adjacent faces are set deleted. The handle of the remaining face is \n      returned (InvalidFaceHandle is returned if _eh is a boundary edge).\n      \n      \\pre is_simple_link(_eh). This ensures that there are no hole faces\n      or isolated vertices appearing in result of the operation.\n      \n      \\attention Needs the Attributes::Status attribute for edges and faces.\n      \n      \\note This function does not perform a garbage collection. It\n      only marks items as deleted.\n  */\n  FaceHandle remove_edge(EdgeHandle _eh);\n  /** Inverse of remove_edge. _eh should be the handle of the edge and the\n      vertex and halfedge handles pointed by edge(_eh) should be valid. \n  */\n  void reinsert_edge(EdgeHandle _eh);\n  /** Inserts an edge between to_vh(_prev_heh) and from_vh(_next_heh).\n      A new face is created started at heh0 of the inserted edge and\n      its halfedges loop includes both _prev_heh and _next_heh. If an \n      old face existed which includes the argument halfedges, it is \n      split at the new edge. heh0 is returned. \n      \n      \\note assumes _prev_heh and _next_heh are either boundary or pointed\n      to the same face\n  */\n  HalfedgeHandle insert_edge(HalfedgeHandle _prev_heh, HalfedgeHandle _next_heh);\n    \n  /** \\brief Face split (= 1-to-n split).\n     *\n     * Split an arbitrary face into triangles by connecting each vertex of fh to vh.\n     *\n     * \\note fh will remain valid (it will become one of the triangles)\n     * \\note the halfedge handles of the new triangles will point to the old halfeges\n     *\n     * \\note The properties of the new faces and all other new primitives will be undefined!\n     *\n     * @param _fh Face handle that should be splitted\n     * @param _vh Vertex handle of the new vertex that will be inserted in the face\n     */\n  void split(FaceHandle _fh, VertexHandle _vh);\n\n  /** \\brief Face split (= 1-to-n split).\n   *\n   * Split an arbitrary face into triangles by connecting each vertex of fh to vh.\n   *\n   * \\note fh will remain valid (it will become one of the triangles)\n   * \\note the halfedge handles of the new triangles will point to the old halfeges\n   *\n   * \\note The properties of the new faces will be adjusted to the properties of the original faces\n   * \\note Properties of the new edges and halfedges will be undefined\n   *\n   * @param _fh Face handle that should be splitted\n   * @param _vh Vertex handle of the new vertex that will be inserted in the face\n   */\n  void split_copy(FaceHandle _fh, VertexHandle _vh);\n  \n  /** \\brief Triangulate the face _fh\n\n    Split an arbitrary face into triangles by connecting\n    each vertex of fh after its second to vh.\n\n    \\note _fh will remain valid (it will become one of the\n      triangles)\n\n    \\note The halfedge handles of the new triangles will\n      point to the old halfedges\n\n    @param _fh Handle of the face that should be triangulated\n  */\n  void triangulate(FaceHandle _fh);\n\n  /** \\brief triangulate the entire mesh  \n  */\n  void triangulate();\n  \n  /** Edge split (inserts a vertex on the edge only)\n   *\n   * This edge split only splits the edge without introducing new faces!\n   * As this is for polygonal meshes, we can have valence 2 vertices here.\n   *\n   * \\note The properties of the new edges and halfedges will be undefined!\n   *\n   * @param _eh Handle of the edge, that will be splitted\n   * @param _vh Handle of the vertex that will be inserted at the edge\n   */\n  void split_edge(EdgeHandle _eh, VertexHandle _vh);\n\n  /** Edge split (inserts a vertex on the edge only)\n   *\n   * This edge split only splits the edge without introducing new faces!\n   * As this is for polygonal meshes, we can have valence 2 vertices here.\n   *\n   * \\note The properties of the new edge will be copied from the splitted edge\n   * \\note Properties of the new halfedges will be undefined\n   *\n   * @param _eh Handle of the edge, that will be splitted\n   * @param _vh Handle of the vertex that will be inserted at the edge\n   */\n  void split_edge_copy(EdgeHandle _eh, VertexHandle _vh);\n\n\n  /** \\name Generic handle derefertiation.\n      Calls the respective vertex(), halfedge(), edge(), face()\n      method of the mesh kernel.\n  */\n  //@{\n  /// Get item from handle\n  const Vertex&    deref(VertexHandle _h)   const { return vertex(_h); }\n  Vertex&          deref(VertexHandle _h)         { return vertex(_h); }\n  const Halfedge&  deref(HalfedgeHandle _h) const { return halfedge(_h); }\n  Halfedge&        deref(HalfedgeHandle _h)       { return halfedge(_h); }\n  const Edge&      deref(EdgeHandle _h)     const { return edge(_h); }\n  Edge&            deref(EdgeHandle _h)           { return edge(_h); }\n  const Face&      deref(FaceHandle _h)     const { return face(_h); }\n  Face&            deref(FaceHandle _h)           { return face(_h); }\n  //@}\n\nprotected:  \n  /// Helper for halfedge collapse\n  void collapse_edge(HalfedgeHandle _hh);\n  /// Helper for halfedge collapse\n  void collapse_loop(HalfedgeHandle _hh);\n\n\n\nprivate: // Working storage for add_face()\n       struct AddFaceEdgeInfo\n       {\n               HalfedgeHandle halfedge_handle;\n               bool is_new;\n               bool needs_adjust;\n       };\n       std::vector<AddFaceEdgeInfo> edgeData_; //\n       std::vector<std::pair<HalfedgeHandle, HalfedgeHandle> > next_cache_; // cache for set_next_halfedge and vertex' set_halfedge\n       uint next_cache_count_;\n\n};\n\n}//namespace OpenMesh\n\n#endif//OPENMESH_POLYCONNECTIVITY_HH\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Mesh/PolyMeshT.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 1036 $                                                         *\n *   $Date: 2014-05-04 17:47:22 +0200 (日, 04 5 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  CLASS PolyMeshT - IMPLEMENTATION\n//\n//=============================================================================\n\n\n#define OPENMESH_POLYMESH_C\n\n\n//== INCLUDES =================================================================\n\n#include <OpenMesh/Core/Mesh/PolyMeshT.hh>\n#include <OpenMesh/Core/Geometry/LoopSchemeMaskT.hh>\n#include <OpenMesh/Core/Utils/vector_cast.hh>\n#include <OpenMesh/Core/System/omstream.hh>\n#include <vector>\n\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\n\n//== IMPLEMENTATION ==========================================================\n\ntemplate <class Kernel>\nuint PolyMeshT<Kernel>::find_feature_edges(Scalar _angle_tresh)\n{\n  assert(Kernel::has_edge_status());//this function needs edge status property\n  uint n_feature_edges = 0;\n  for (EdgeIter e_it = Kernel::edges_begin(); e_it != Kernel::edges_end(); ++e_it)\n  {\n    if (fabs(calc_dihedral_angle(e_it)) > _angle_tresh)\n    {//note: could be optimized by comparing cos(dih_angle) vs. cos(_angle_tresh)\n      status(e_it).set_feature(true);\n      n_feature_edges++;\n    }\n    else\n    {\n      status(e_it).set_feature(false);\n    }\n  }\n  return n_feature_edges;\n}\n\n//-----------------------------------------------------------------------------\n\ntemplate <class Kernel>\ntypename PolyMeshT<Kernel>::Normal\nPolyMeshT<Kernel>::\ncalc_face_normal(FaceHandle _fh) const\n{\n  assert(this->halfedge_handle(_fh).is_valid());\n  ConstFaceVertexIter fv_it(this->cfv_iter(_fh));\n  \n  Point p0 = this->point(*fv_it);\n  Point p0i = p0; //save point of vertex 0\n  ++fv_it;\n  Point p1 = this->point(*fv_it);\n  Point p1i = p1; //save point of vertex 1\n  ++fv_it;\n  Point p2;\n  \n  //calculate area-weighted average normal of polygon's ears\n  Normal n(0,0,0);\n  for(; fv_it.is_valid(); ++fv_it)\n  {\n    p2 = this->point(*fv_it);\n    n += vector_cast<Normal>(calc_face_normal(p0, p1, p2)); \n    p0 = p1;\n    p1 = p2;\n  }\n  \n  //two additional steps since we started at vertex 2, not 0\n  n += vector_cast<Normal>(calc_face_normal(p0i, p0, p1)); \n  n += vector_cast<Normal>(calc_face_normal(p1i, p0i, p1));\n\n  typename vector_traits<Normal>::value_type norm = n.length();\n  \n  // The expression ((n *= (1.0/norm)),n) is used because the OpenSG\n  // vector class does not return self after component-wise\n  // self-multiplication with a scalar!!!\n  return (norm != typename vector_traits<Normal>::value_type(0)) ? ((n *= (typename vector_traits<Normal>::value_type(1)/norm)),n) : Normal(0,0,0);\n}\n\n//-----------------------------------------------------------------------------\n\n\ntemplate <class Kernel>\ntypename PolyMeshT<Kernel>::Normal\nPolyMeshT<Kernel>::\ncalc_face_normal(const Point& _p0,\n     const Point& _p1,\n     const Point& _p2) const\n{\n#if 1\n  // The OpenSG <Vector>::operator -= () does not support the type Point\n  // as rhs. Therefore use vector_cast at this point!!!\n  // Note! OpenSG distinguishes between Normal and Point!!!\n  Normal p1p0(vector_cast<Normal>(_p0));  p1p0 -= vector_cast<Normal>(_p1);\n  Normal p1p2(vector_cast<Normal>(_p2));  p1p2 -= vector_cast<Normal>(_p1);\n\n  Normal n    = cross(p1p2, p1p0);\n  typename vector_traits<Normal>::value_type norm = n.length();\n\n  // The expression ((n *= (1.0/norm)),n) is used because the OpenSG\n  // vector class does not return self after component-wise\n  // self-multiplication with a scalar!!!\n  return (norm != typename vector_traits<Normal>::value_type(0)) ? ((n *= (typename vector_traits<Normal>::value_type(1)/norm)),n) : Normal(0,0,0);\n#else\n  Point p1p0 = _p0;  p1p0 -= _p1;\n  Point p1p2 = _p2;  p1p2 -= _p1;\n\n  Normal n = vector_cast<Normal>(cross(p1p2, p1p0));\n  typename vector_traits<Normal>::value_type norm = n.length();\n\n  return (norm != 0.0) ? n *= (1.0/norm) : Normal(0,0,0);\n#endif\n}\n\n//-----------------------------------------------------------------------------\n\ntemplate <class Kernel>\ntypename PolyMeshT<Kernel>::Point\nPolyMeshT<Kernel>::\ncalc_face_centroid(FaceHandle _fh) const\n{\n  Point _pt;\n  _pt.vectorize(0);\n  Scalar valence = 0.0;\n  for (ConstFaceVertexIter cfv_it = this->cfv_iter(_fh); cfv_it.is_valid(); ++cfv_it, valence += 1.0)\n  {\n    _pt += this->point(*cfv_it);\n  }\n  _pt /= valence;\n  return _pt;\n}\n//-----------------------------------------------------------------------------\n\n\ntemplate <class Kernel>\nvoid\nPolyMeshT<Kernel>::\nupdate_normals()\n{\n  // Face normals are required to compute the vertex and the halfedge normals\n  if (Kernel::has_face_normals() ) {     \n    update_face_normals();\n\n    if (Kernel::has_vertex_normals() ) update_vertex_normals();\n    if (Kernel::has_halfedge_normals()) update_halfedge_normals();\n  }\n}\n\n\n//-----------------------------------------------------------------------------\n\n\ntemplate <class Kernel>\nvoid\nPolyMeshT<Kernel>::\nupdate_face_normals()\n{\n  FaceIter f_it(Kernel::faces_begin()), f_end(Kernel::faces_end());\n\n  for (; f_it != f_end; ++f_it)\n    this->set_normal(*f_it, calc_face_normal(*f_it));\n}\n\n\n//-----------------------------------------------------------------------------\n\n\ntemplate <class Kernel>\nvoid\nPolyMeshT<Kernel>::\nupdate_halfedge_normals(const double _feature_angle)\n{\n  HalfedgeIter h_it(Kernel::halfedges_begin()), h_end(Kernel::halfedges_end());\n\n  for (; h_it != h_end; ++h_it)\n    this->set_normal(*h_it, calc_halfedge_normal(*h_it, _feature_angle));\n}\n\n\n//-----------------------------------------------------------------------------\n\n\ntemplate <class Kernel>\ntypename PolyMeshT<Kernel>::Normal\nPolyMeshT<Kernel>::\ncalc_halfedge_normal(HalfedgeHandle _heh, const double _feature_angle) const\n{\n  if(Kernel::is_boundary(_heh))\n    return Normal(0,0,0);\n  else\n  {\n    std::vector<FaceHandle> fhs; fhs.reserve(10);\n\n    HalfedgeHandle heh = _heh;\n\n    // collect CW face-handles\n    do\n    {\n      fhs.push_back(Kernel::face_handle(heh));\n\n      heh = Kernel::next_halfedge_handle(heh);\n      heh = Kernel::opposite_halfedge_handle(heh);\n    }\n    while(heh != _heh && !Kernel::is_boundary(heh) && !is_estimated_feature_edge(heh, _feature_angle));\n\n    // collect CCW face-handles\n    if(heh != _heh && !is_estimated_feature_edge(_heh, _feature_angle))\n    {\n      heh = Kernel::opposite_halfedge_handle(_heh);\n\n      if ( !Kernel::is_boundary(heh) ) {\n        do\n        {\n\n          fhs.push_back(Kernel::face_handle(heh));\n\n          heh = Kernel::prev_halfedge_handle(heh);\n          heh = Kernel::opposite_halfedge_handle(heh);\n        }\n        while(!Kernel::is_boundary(heh) && !is_estimated_feature_edge(heh, _feature_angle));\n      }\n    }\n\n    Normal n(0,0,0);\n    for(unsigned int i=0; i<fhs.size(); ++i)\n      n += Kernel::normal(fhs[i]);\n\n    return n.normalize();\n  }\n}\n\n\n//-----------------------------------------------------------------------------\n\n\ntemplate <class Kernel>\nbool\nPolyMeshT<Kernel>::\nis_estimated_feature_edge(HalfedgeHandle _heh, const double _feature_angle) const\n{\n  EdgeHandle eh = Kernel::edge_handle(_heh);\n\n  if(Kernel::has_edge_status())\n  {\n    if(Kernel::status(eh).feature())\n      return true;\n  }\n\n  if(Kernel::is_boundary(eh))\n    return false;\n\n  // compute angle between faces\n  FaceHandle fh0 = Kernel::face_handle(_heh);\n  FaceHandle fh1 = Kernel::face_handle(Kernel::opposite_halfedge_handle(_heh));\n\n  Normal fn0 = Kernel::normal(fh0);\n  Normal fn1 = Kernel::normal(fh1);\n\n  // dihedral angle above angle threshold\n  return ( dot(fn0,fn1) < cos(_feature_angle) );\n}\n\n\n//-----------------------------------------------------------------------------\n\n\ntemplate <class Kernel>\ntypename PolyMeshT<Kernel>::Normal\nPolyMeshT<Kernel>::\ncalc_vertex_normal(VertexHandle _vh) const\n{\n  Normal n;\n  calc_vertex_normal_fast(_vh,n);\n\n  Scalar norm = n.length();\n  if (norm != 0.0) n *= (Scalar(1.0)/norm);\n\n  return n;\n}\n\n//-----------------------------------------------------------------------------\ntemplate <class Kernel>\nvoid PolyMeshT<Kernel>::\ncalc_vertex_normal_fast(VertexHandle _vh, Normal& _n) const\n{\n  _n.vectorize(0.0);\n  for (ConstVertexFaceIter vf_it = this->cvf_iter(_vh); vf_it.is_valid(); ++vf_it)\n    _n += this->normal(*vf_it);\n}\n\n//-----------------------------------------------------------------------------\ntemplate <class Kernel>\nvoid PolyMeshT<Kernel>::\ncalc_vertex_normal_correct(VertexHandle _vh, Normal& _n) const\n{\n  _n.vectorize(0.0);\n  ConstVertexIHalfedgeIter cvih_it = this->cvih_iter(_vh);\n  if (! cvih_it.is_valid() )\n  {//don't crash on isolated vertices\n    return;\n  }\n  Normal in_he_vec;\n  calc_edge_vector(*cvih_it, in_he_vec);\n  for ( ; cvih_it.is_valid(); ++cvih_it)\n  {//calculates the sector normal defined by cvih_it and adds it to _n\n    if (this->is_boundary(*cvih_it))\n    {\n      continue;\n    }\n    HalfedgeHandle out_heh(this->next_halfedge_handle(*cvih_it));\n    Normal out_he_vec;\n    calc_edge_vector(out_heh, out_he_vec);\n    _n += cross(in_he_vec, out_he_vec);//sector area is taken into account\n    in_he_vec = out_he_vec;\n    in_he_vec *= -1;//change the orientation\n  }\n}\n\n//-----------------------------------------------------------------------------\ntemplate <class Kernel>\nvoid PolyMeshT<Kernel>::\ncalc_vertex_normal_loop(VertexHandle _vh, Normal& _n) const\n{\n  static const LoopSchemeMaskDouble& loop_scheme_mask__ =\n                  LoopSchemeMaskDoubleSingleton::Instance();\n\n  Normal t_v(0.0,0.0,0.0), t_w(0.0,0.0,0.0);\n  unsigned int vh_val = this->valence(_vh);\n  unsigned int i = 0;\n  for (ConstVertexOHalfedgeIter cvoh_it = this->cvoh_iter(_vh); cvoh_it.is_valid(); ++cvoh_it, ++i)\n  {\n    VertexHandle r1_v( this->to_vertex_handle(*cvoh_it) );\n    t_v += (typename vector_traits<Point>::value_type)(loop_scheme_mask__.tang0_weight(vh_val, i))*this->point(r1_v);\n    t_w += (typename vector_traits<Point>::value_type)(loop_scheme_mask__.tang1_weight(vh_val, i))*this->point(r1_v);\n  }\n  _n = cross(t_w, t_v);//hack: should be cross(t_v, t_w), but then the normals are reversed?\n}\n\n//-----------------------------------------------------------------------------\n\n\ntemplate <class Kernel>\nvoid\nPolyMeshT<Kernel>::\nupdate_vertex_normals()\n{\n  VertexIter  v_it(Kernel::vertices_begin()), v_end(Kernel::vertices_end());\n\n  for (; v_it!=v_end; ++v_it)\n    this->set_normal(*v_it, calc_vertex_normal(*v_it));\n}\n\n//=============================================================================\n} // namespace OpenMesh\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Mesh/PolyMeshT.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  CLASS PolyMeshT\n//\n//=============================================================================\n\n\n#ifndef OPENMESH_POLYMESHT_HH\n#define OPENMESH_POLYMESHT_HH\n\n\n//== INCLUDES =================================================================\n\n\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/Geometry/MathDefs.hh>\n#include <OpenMesh/Core/Mesh/PolyConnectivity.hh>\n#include <OpenMesh/Core/Mesh/FinalMeshItemsT.hh>\n#include <vector>\n\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\n\n//== CLASS DEFINITION =========================================================\n\n\n/** \\class PolyMeshT PolyMeshT.hh <OpenMesh/Mesh/PolyMeshT.hh>\n\n    Base type for a polygonal mesh.\n\n    This is the base class for a polygonal mesh. It is parameterized\n    by a mesh kernel that is given as a template argument. This class\n    inherits all methods from its mesh kernel.\n\n    \\param Kernel: template argument for the mesh kernel\n    \\note You should use the predefined mesh-kernel combinations in\n    \\ref mesh_types_group\n    \\see \\ref mesh_type\n*/\n\ntemplate <class Kernel>\nclass PolyMeshT : public Kernel\n{\npublic:\n\n  /// Self type. Used to specify iterators/circulators.\n  typedef PolyMeshT<Kernel>                   This;\n  //--- item types ---\n\n  //@{\n  /// Determine whether this is a PolyMeshT or TriMeshT ( This function does not check the per face vertex count! It only checks if the datatype is PolyMeshT or TriMeshT )\n  enum { IsPolyMesh = 1 };\n  enum { IsTriMesh  = 0 };\n  static bool is_polymesh() { return true;  }\n  static bool is_trimesh()  { return false; }\n  //@}\n\n  /// \\name Mesh Items\n  //@{\n  /// Scalar type\n  typedef typename Kernel::Scalar    Scalar;\n  /// Coordinate type\n  typedef typename Kernel::Point     Point;\n  /// Normal type\n  typedef typename Kernel::Normal    Normal;\n  /// Color type\n  typedef typename Kernel::Color     Color;\n  /// TexCoord1D type\n  typedef typename Kernel::TexCoord1D  TexCoord1D;\n  /// TexCoord2D type\n  typedef typename Kernel::TexCoord2D  TexCoord2D;\n  /// TexCoord3D type\n  typedef typename Kernel::TexCoord3D  TexCoord3D;\n  /// Vertex type\n  typedef typename Kernel::Vertex    Vertex;\n  /// Halfedge type\n  typedef typename Kernel::Halfedge  Halfedge;\n  /// Edge type\n  typedef typename Kernel::Edge      Edge;\n  /// Face type\n  typedef typename Kernel::Face      Face;\n  //@}\n\n  //--- handle types ---\n\n  /// Handle for referencing the corresponding item\n  typedef typename Kernel::VertexHandle       VertexHandle;\n  typedef typename Kernel::HalfedgeHandle     HalfedgeHandle;\n  typedef typename Kernel::EdgeHandle         EdgeHandle;\n  typedef typename Kernel::FaceHandle         FaceHandle;\n\n\n\n  typedef typename Kernel::VertexIter                 VertexIter;\n  typedef typename Kernel::HalfedgeIter               HalfedgeIter;\n  typedef typename Kernel::EdgeIter                   EdgeIter;\n  typedef typename Kernel::FaceIter                   FaceIter;\n\n  typedef typename Kernel::ConstVertexIter            ConstVertexIter;\n  typedef typename Kernel::ConstHalfedgeIter          ConstHalfedgeIter;\n  typedef typename Kernel::ConstEdgeIter              ConstEdgeIter;\n  typedef typename Kernel::ConstFaceIter              ConstFaceIter;\n  //@}\n\n  //--- circulators ---\n\n  /** \\name Mesh Circulators\n      Refer to OpenMesh::Mesh::Iterators or \\ref mesh_iterators\n      for documentation.\n  */\n  //@{\n  /// Circulator\n  typedef typename Kernel::VertexVertexIter          VertexVertexIter;\n  typedef typename Kernel::VertexOHalfedgeIter       VertexOHalfedgeIter;\n  typedef typename Kernel::VertexIHalfedgeIter       VertexIHalfedgeIter;\n  typedef typename Kernel::VertexEdgeIter            VertexEdgeIter;\n  typedef typename Kernel::VertexFaceIter            VertexFaceIter;\n  typedef typename Kernel::FaceVertexIter            FaceVertexIter;\n  typedef typename Kernel::FaceHalfedgeIter          FaceHalfedgeIter;\n  typedef typename Kernel::FaceEdgeIter              FaceEdgeIter;\n  typedef typename Kernel::FaceFaceIter              FaceFaceIter;\n\n  typedef typename Kernel::ConstVertexVertexIter     ConstVertexVertexIter;\n  typedef typename Kernel::ConstVertexOHalfedgeIter  ConstVertexOHalfedgeIter;\n  typedef typename Kernel::ConstVertexIHalfedgeIter  ConstVertexIHalfedgeIter;\n  typedef typename Kernel::ConstVertexEdgeIter       ConstVertexEdgeIter;\n  typedef typename Kernel::ConstVertexFaceIter       ConstVertexFaceIter;\n  typedef typename Kernel::ConstFaceVertexIter       ConstFaceVertexIter;\n  typedef typename Kernel::ConstFaceHalfedgeIter     ConstFaceHalfedgeIter;\n  typedef typename Kernel::ConstFaceEdgeIter         ConstFaceEdgeIter;\n  typedef typename Kernel::ConstFaceFaceIter         ConstFaceFaceIter;\n  //@}\n\n\n  // --- constructor/destructor\n  PolyMeshT() {}\n  virtual ~PolyMeshT() {}\n\n  /** Uses default copy and assignment operator.\n      Use them to assign two meshes of \\b equal type.\n      If the mesh types vary, use PolyMeshT::assign() instead. */\n\n   // --- creation ---\n  inline VertexHandle new_vertex()\n  { return Kernel::new_vertex(); }\n\n  inline VertexHandle new_vertex(const Point& _p)\n  {\n    VertexHandle vh(Kernel::new_vertex());\n    this->set_point(vh, _p);\n    return vh;\n  }\n\n  inline VertexHandle add_vertex(const Point& _p)\n  { return new_vertex(_p); }\n\n  // --- normal vectors ---\n\n  /** \\name Normal vector computation\n  */\n  //@{\n\n  /** \\brief Compute normals for all primitives\n   *\n   * Calls update_face_normals() , update_halfedge_normals()  and update_vertex_normals() if\n   * the normals (i.e. the properties) exist.\n   *\n   * \\note Face normals are required to compute vertex and halfedge normals!\n   */\n  void update_normals();\n\n  /// Update normal for face _fh\n  void update_normal(FaceHandle _fh)\n  { this->set_normal(_fh, calc_face_normal(_fh)); }\n\n  /** \\brief Update normal vectors for all faces.\n   *\n   * \\attention Needs the Attributes::Normal attribute for faces.\n   *            Call request_face_normals() before using it!\n   */\n  void update_face_normals();\n\n  /** Calculate normal vector for face _fh. */\n  virtual Normal calc_face_normal(FaceHandle _fh) const;\n\n  /** Calculate normal vector for face (_p0, _p1, _p2). */\n  Normal calc_face_normal(const Point& _p0, const Point& _p1,\n                                            const Point& _p2) const;\n  /// calculates the average of the vertices defining _fh\n  void calc_face_centroid(FaceHandle _fh, Point& _pt) const {\n      _pt = calc_face_centroid(_fh);\n  }\n\n  /// Computes and returns the average of the vertices defining _gh\n  Point calc_face_centroid(FaceHandle _fh) const;\n\n  /// Update normal for halfedge _heh\n  void update_normal(HalfedgeHandle _heh, const double _feature_angle = 0.8)\n  { this->set_normal(_heh, calc_halfedge_normal(_heh)); }\n\n  /** \\brief Update normal vectors for all halfedges.\n   *\n   * Uses the existing face normals to compute halfedge normals\n   *\n   * \\note Face normals have to be computed first!\n   *\n   * \\attention Needs the Attributes::Normal attribute for faces and halfedges.\n   *            Call request_face_normals() and request_halfedge_normals() before using it!\n   */\n  void update_halfedge_normals(const double _feature_angle = 0.8);\n\n  /** \\brief Calculate halfedge normal for one specific halfedge\n   *\n   * Calculate normal vector for halfedge _heh.\n   *\n   * \\note Face normals have to be computed first!\n   *\n   * \\attention Needs the Attributes::Normal attribute for faces and vertices.\n   *            Call request_face_normals() and request_halfedge_normals() before using it!\n   *\n   * @param _heh Handle of the halfedge\n   * @param _feature_angle If the dihedral angle across this edge is greater than this value, the edge is considered as a feature edge (angle in radians) \n   */\n  virtual Normal calc_halfedge_normal(HalfedgeHandle _heh, const double _feature_angle = 0.8) const;\n\n\n  /** identifies feature edges w.r.t. the minimal dihedral angle for feature edges (in radians) */\n  /** and the status feature tag */\n  bool is_estimated_feature_edge(HalfedgeHandle _heh, const double _feature_angle) const;\n\n  /// Update normal for vertex _vh\n  void update_normal(VertexHandle _vh)\n  { this->set_normal(_vh, calc_vertex_normal(_vh)); }\n\n  /** \\brief Update normal vectors for all vertices.\n   *\n   * Uses existing face normals to calculate new vertex normals.\n   *\n   * \\note Face normals have to be computed first!\n   *\n   * \\attention Needs the Attributes::Normal attribute for faces and vertices.\n   *            Call request_face_normals() and request_vertex_normals() before using it!\n   */\n  void update_vertex_normals();\n\n  /** \\brief Calculate vertex normal for one specific vertex\n   *\n   * Calculate normal vector for vertex _vh by averaging normals\n   * of adjacent faces.\n   *\n   * \\note Face normals have to be computed first!\n   *\n   * \\attention Needs the Attributes::Normal attribute for faces and vertices.\n   *            Call request_face_normals() and request_vertex_normals() before using it!\n   *\n   * @param _vh Handle of the vertex\n   */\n  Normal calc_vertex_normal(VertexHandle _vh) const;\n\n  /** Different methods for calculation of the normal at _vh:\n      - ..._fast    - the default one - the same as calc vertex_normal()\n                    - needs the Attributes::Normal attribute for faces\n      - ..._correct - works properly for non-triangular meshes\n                    - does not need any attributes\n      - ..._loop    - calculates loop surface normals\n                    - does not need any attributes */\n  void calc_vertex_normal_fast(VertexHandle _vh, Normal& _n) const;\n  void calc_vertex_normal_correct(VertexHandle _vh, Normal& _n) const;\n  void calc_vertex_normal_loop(VertexHandle _vh, Normal& _n) const;\n\n\n  //@}\n\n  // --- Geometry API - still in development ---\n\n  /** Calculates the edge vector as the vector defined by\n      the halfedge with id #0 (see below)  */\n  void calc_edge_vector(EdgeHandle _eh, Normal& _edge_vec) const\n  {\n    _edge_vec = calc_edge_vector(_eh);\n  }\n\n  /** Calculates the edge vector as the vector defined by\n      the halfedge with id #0 (see below)  */\n  Normal calc_edge_vector(EdgeHandle _eh) const\n  {\n    return calc_edge_vector(this->halfedge_handle(_eh,0));\n  }\n\n  /** Calculates the edge vector as the difference of the\n      the points defined by to_vertex_handle() and from_vertex_handle() */\n  void calc_edge_vector(HalfedgeHandle _heh, Normal& _edge_vec) const\n  {\n    _edge_vec = calc_edge_vector(_heh);\n  }\n\n  /** Calculates the edge vector as the difference of the\n      the points defined by to_vertex_handle() and from_vertex_handle() */\n  Normal calc_edge_vector(HalfedgeHandle _heh) const\n  {\n    return this->point(this->to_vertex_handle(_heh)) -\n            this->point(this->from_vertex_handle(_heh));\n  }\n\n  // Calculates the length of the edge _eh\n  Scalar calc_edge_length(EdgeHandle _eh) const\n  { return calc_edge_length(this->halfedge_handle(_eh,0)); }\n\n  /** Calculates the length of the edge _heh\n  */\n  Scalar calc_edge_length(HalfedgeHandle _heh) const\n  { return (Scalar)sqrt(calc_edge_sqr_length(_heh)); }\n\n  Scalar calc_edge_sqr_length(EdgeHandle _eh) const\n  { return calc_edge_sqr_length(this->halfedge_handle(_eh,0)); }\n\n  Scalar calc_edge_sqr_length(HalfedgeHandle _heh) const\n  {\n    Normal edge_vec;\n    calc_edge_vector(_heh, edge_vec);\n    return edge_vec.sqrnorm();\n  }\n\n  /** defines a consistent representation of a sector geometry:\n      the halfedge _in_heh defines the sector orientation\n      the vertex pointed by _in_heh defines the sector center\n      _vec0 and _vec1 are resp. the first and the second vectors defining the sector */\n  void calc_sector_vectors(HalfedgeHandle _in_heh, Normal& _vec0, Normal& _vec1) const\n  {\n    calc_edge_vector(this->next_halfedge_handle(_in_heh), _vec0);//p2 - p1\n    calc_edge_vector(this->opposite_halfedge_handle(_in_heh), _vec1);//p0 - p1\n  }\n\n  /** calculates the sector angle.\\n\n   * The vertex pointed by _in_heh defines the sector center\n   * The angle will be calculated between the given halfedge and the next halfedge.\\n\n   * Seen from the center vertex this will be the next halfedge in clockwise direction.\\n\n      NOTE: only boundary concave sectors are treated correctly */\n  Scalar calc_sector_angle(HalfedgeHandle _in_heh) const\n  {\n    Normal v0, v1;\n    calc_sector_vectors(_in_heh, v0, v1);\n    Scalar denom = v0.norm()*v1.norm();\n    if (is_zero(denom))\n    {\n      return 0;\n    }\n    Scalar cos_a = dot(v0 , v1) / denom;\n    if (this->is_boundary(_in_heh))\n    {//determine if the boundary sector is concave or convex\n      FaceHandle fh(this->face_handle(this->opposite_halfedge_handle(_in_heh)));\n      Normal f_n(calc_face_normal(fh));//this normal is (for convex fh) OK\n      Scalar sign_a = dot(cross(v0, v1), f_n);\n      return angle(cos_a, sign_a);\n    }\n    else\n    {\n      return acos(sane_aarg(cos_a));\n    }\n  }\n\n  // calculate the cos and the sin of angle <(_in_heh,next_halfedge(_in_heh))\n  /*\n  void calc_sector_angle_cos_sin(HalfedgeHandle _in_heh, Scalar& _cos_a, Scalar& _sin_a) const\n  {\n    Normal in_vec, out_vec;\n    calc_edge_vector(_in_heh, in_vec);\n    calc_edge_vector(next_halfedge_handle(_in_heh), out_vec);\n    Scalar denom = in_vec.norm()*out_vec.norm();\n    if (is_zero(denom))\n    {\n      _cos_a = 1;\n      _sin_a = 0;\n    }\n    else\n    {\n      _cos_a = dot(in_vec, out_vec)/denom;\n      _sin_a = cross(in_vec, out_vec).norm()/denom;\n    }\n  }\n  */\n  /** calculates the normal (non-normalized) of the face sector defined by\n      the angle <(_in_heh,next_halfedge(_in_heh)) */\n  void calc_sector_normal(HalfedgeHandle _in_heh, Normal& _sector_normal) const\n  {\n    Normal vec0, vec1;\n    calc_sector_vectors(_in_heh, vec0, vec1);\n    _sector_normal = cross(vec0, vec1);//(p2-p1)^(p0-p1)\n  }\n\n  /** calculates the area of the face sector defined by\n      the angle <(_in_heh,next_halfedge(_in_heh))\n      NOTE: special cases (e.g. concave sectors) are not handled correctly */\n  Scalar calc_sector_area(HalfedgeHandle _in_heh) const\n  {\n    Normal sector_normal;\n    calc_sector_normal(_in_heh, sector_normal);\n    return sector_normal.norm()/2;\n  }\n\n  /** calculates the dihedral angle on the halfedge _heh\n      \\attention Needs the Attributes::Normal attribute for faces */\n  Scalar calc_dihedral_angle_fast(HalfedgeHandle _heh) const\n  {\n    // Make sure that we have face normals on the mesh\n    assert(Kernel::has_face_normals());\n\n    if (this->is_boundary(this->edge_handle(_heh)))\n    {//the dihedral angle at a boundary edge is 0\n      return 0;\n    }\n    const Normal& n0 = this->normal(this->face_handle(_heh));\n    const Normal& n1 = this->normal(this->face_handle(this->opposite_halfedge_handle(_heh)));\n    Normal he;\n    calc_edge_vector(_heh, he);\n    Scalar da_cos = dot(n0, n1);\n    //should be normalized, but we need only the sign\n    Scalar da_sin_sign = dot(cross(n0, n1), he);\n    return angle(da_cos, da_sin_sign);\n  }\n\n  /** calculates the dihedral angle on the edge _eh\n      \\attention Needs the Attributes::Normal attribute for faces */\n  Scalar calc_dihedral_angle_fast(EdgeHandle _eh) const\n  { return calc_dihedral_angle_fast(this->halfedge_handle(_eh,0)); }\n\n  // calculates the dihedral angle on the halfedge _heh\n  Scalar calc_dihedral_angle(HalfedgeHandle _heh) const\n  {\n    if (this->is_boundary(this->edge_handle(_heh)))\n    {//the dihedral angle at a boundary edge is 0\n      return 0;\n    }\n    Normal n0, n1, he;\n    calc_sector_normal(_heh, n0);\n    calc_sector_normal(this->opposite_halfedge_handle(_heh), n1);\n    calc_edge_vector(_heh, he);\n    Scalar denom = n0.norm()*n1.norm();\n    if (denom == Scalar(0))\n    {\n      return 0;\n    }\n    Scalar da_cos = dot(n0, n1)/denom;\n    //should be normalized, but we need only the sign\n    Scalar da_sin_sign = dot(cross(n0, n1), he);\n    return angle(da_cos, da_sin_sign);\n  }\n\n  // calculates the dihedral angle on the edge _eh\n  Scalar calc_dihedral_angle(EdgeHandle _eh) const\n  { return calc_dihedral_angle(this->halfedge_handle(_eh,0)); }\n\n  /** tags an edge as a feature if its dihedral angle is larger than _angle_tresh\n      returns the number of the found feature edges, requires edge_status property*/\n  unsigned int find_feature_edges(Scalar _angle_tresh = OpenMesh::deg_to_rad(44.0));\n  // --- misc ---\n\n  /// Face split (= 1-to-n split)\n  inline void split(FaceHandle _fh, const Point& _p)\n  { Kernel::split(_fh, add_vertex(_p)); }\n\n  inline void split(FaceHandle _fh, VertexHandle _vh)\n  { Kernel::split(_fh, _vh); }\n\n  inline void split(EdgeHandle _eh, const Point& _p)\n  { Kernel::split_edge(_eh, add_vertex(_p)); }\n\n  inline void split(EdgeHandle _eh, VertexHandle _vh)\n  { Kernel::split_edge(_eh, _vh); }\n  \n};\n\n/**\n * @brief Cast a mesh with different but identical traits into each other.\n *\n * Example:\n * @code{.cpp}\n * struct TriTraits1 : public OpenMesh::DefaultTraits {\n *   typedef Vec3d Point;\n * };\n * struct TriTraits2 : public OpenMesh::DefaultTraits {\n *   typedef Vec3d Point;\n * };\n * struct TriTraits3 : public OpenMesh::DefaultTraits {\n *   typedef Vec3f Point;\n * };\n *\n * TriMesh_ArrayKernelT<TriTraits1> a;\n * TriMesh_ArrayKernelT<TriTraits2> &b = mesh_cast<TriMesh_ArrayKernelT<TriTraits2>&>(a); // OK\n * TriMesh_ArrayKernelT<TriTraits3> &c = mesh_cast<TriMesh_ArrayKernelT<TriTraits3>&>(a); // ERROR\n * @endcode\n *\n * @see MeshCast\n *\n * @param rhs\n * @return\n */\ntemplate<typename LHS, typename KERNEL>\nLHS mesh_cast(PolyMeshT<KERNEL> &rhs) {\n    return MeshCast<LHS, PolyMeshT<KERNEL>&>::cast(rhs);\n}\n\ntemplate<typename LHS, typename KERNEL>\nLHS mesh_cast(PolyMeshT<KERNEL> *rhs) {\n    return MeshCast<LHS, PolyMeshT<KERNEL>*>::cast(rhs);\n}\n\ntemplate<typename LHS, typename KERNEL>\nconst LHS mesh_cast(const PolyMeshT<KERNEL> &rhs) {\n    return MeshCast<LHS, const PolyMeshT<KERNEL>&>::cast(rhs);\n}\n\ntemplate<typename LHS, typename KERNEL>\nconst LHS mesh_cast(const PolyMeshT<KERNEL> *rhs) {\n    return MeshCast<LHS, const PolyMeshT<KERNEL>*>::cast(rhs);\n}\n\n\n//=============================================================================\n} // namespace OpenMesh\n//=============================================================================\n#if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_POLYMESH_C)\n#  define OPENMESH_POLYMESH_TEMPLATES\n#  include \"PolyMeshT.cc\"\n#endif\n//=============================================================================\n#endif // OPENMESH_POLYMESHT_HH defined\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Mesh/PolyMesh_ArrayKernelT.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  CLASS PolyMesh_ArrayKernelT\n//\n//=============================================================================\n\n\n#ifndef OPENMESH_POLY_MESH_ARRAY_KERNEL_HH\n#define OPENMESH_POLY_MESH_ARRAY_KERNEL_HH\n\n\n//== INCLUDES =================================================================\n\n\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/Mesh/PolyConnectivity.hh>\n#include <OpenMesh/Core/Mesh/Traits.hh>\n#include <OpenMesh/Core/Mesh/FinalMeshItemsT.hh>\n#include <OpenMesh/Core/Mesh/AttribKernelT.hh>\n#include <OpenMesh/Core/Mesh/PolyMeshT.hh>\n\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\n\n\n//== CLASS DEFINITION =========================================================\n\n/// Helper class to build a PolyMesh-type\ntemplate <class Traits>\nstruct PolyMesh_ArrayKernel_GeneratorT\n{\n  typedef FinalMeshItemsT<Traits, false>              MeshItems;\n  typedef AttribKernelT<MeshItems, PolyConnectivity>  AttribKernel;\n  typedef PolyMeshT<AttribKernel>                     Mesh;\n};\n\n\n/** \\class PolyMesh_ArrayKernelT PolyMesh_ArrayKernelT.hh <OpenMesh/Mesh/Types/PolyMesh_ArrayKernelT.hh>\n\n    \\ingroup mesh_types_group\n    Polygonal mesh based on the ArrayKernel.\n    \\see OpenMesh::PolyMeshT\n    \\see OpenMesh::ArrayKernel\n*/\ntemplate <class Traits = DefaultTraits>\nclass PolyMesh_ArrayKernelT\n  : public PolyMesh_ArrayKernel_GeneratorT<Traits>::Mesh\n{};\n\n\n//=============================================================================\n} // namespace OpenMesh\n//=============================================================================\n#endif // OPENMESH_POLY_MESH_ARRAY_KERNEL_HH\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Mesh/Status.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  CLASS Status\n//\n//=============================================================================\n\n\n#ifndef OPENMESH_ATTRIBUTE_STATUS_HH\n#define OPENMESH_ATTRIBUTE_STATUS_HH\n\n\n//== INCLUDES =================================================================\n\n#include <OpenMesh/Core/System/config.h>\n\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\nnamespace Attributes {\n\n \n//== CLASS DEFINITION  ========================================================\n  \n\n/** Status bits used by the Status class. \n *  \\see OpenMesh::Attributes::StatusInfo\n */\nenum StatusBits {\n\n  DELETED               = 1,    ///< Item has been deleted\n  LOCKED                = 2,    ///< Item is locked.\n  SELECTED              = 4,    ///< Item is selected.\n  HIDDEN                = 8,    ///< Item is hidden.\n  FEATURE               = 16,   ///< Item is a feature or belongs to a feature.\n  TAGGED                = 32,   ///< Item is tagged.\n  TAGGED2               = 64,   ///< Alternate bit for tagging an item.\n  FIXEDNONMANIFOLD      = 128,  ///< Item was non-two-manifold and had to be fixed\n  UNUSED                = 256   ///< Unused\n};\n\n\n/** \\class StatusInfo Status.hh <OpenMesh/Attributes/Status.hh>\n *\n *   Add status information to a base class.\n *\n *   \\see StatusBits\n */\nclass StatusInfo\n{\npublic:\n\n  typedef unsigned int value_type;\n    \n  StatusInfo() : status_(0) {}\n\n  /// is deleted ?\n  bool deleted() const  { return is_bit_set(DELETED); }\n  /// set deleted\n  void set_deleted(bool _b) { change_bit(DELETED, _b); }\n\n\n  /// is locked ?\n  bool locked() const  { return is_bit_set(LOCKED); }\n  /// set locked\n  void set_locked(bool _b) { change_bit(LOCKED, _b); }\n\n\n  /// is selected ?\n  bool selected() const  { return is_bit_set(SELECTED); }\n  /// set selected\n  void set_selected(bool _b) { change_bit(SELECTED, _b); }\n\n\n  /// is hidden ?\n  bool hidden() const  { return is_bit_set(HIDDEN); }\n  /// set hidden\n  void set_hidden(bool _b) { change_bit(HIDDEN, _b); }\n\n\n  /// is feature ?\n  bool feature() const  { return is_bit_set(FEATURE); }\n  /// set feature\n  void set_feature(bool _b) { change_bit(FEATURE, _b); }\n\n\n  /// is tagged ?\n  bool tagged() const  { return is_bit_set(TAGGED); }\n  /// set tagged\n  void set_tagged(bool _b) { change_bit(TAGGED, _b); }\n\n\n  /// is tagged2 ? This is just one more tag info.\n  bool tagged2() const  { return is_bit_set(TAGGED2); }\n  /// set tagged\n  void set_tagged2(bool _b) { change_bit(TAGGED2, _b); }\n  \n  \n  /// is fixed non-manifold ?\n  bool fixed_nonmanifold() const  { return is_bit_set(FIXEDNONMANIFOLD); }\n  /// set fixed non-manifold\n  void set_fixed_nonmanifold(bool _b) { change_bit(FIXEDNONMANIFOLD, _b); }\n\n\n  /// return whole status\n  unsigned int bits() const { return status_; }\n  /// set whole status at once\n  void set_bits(unsigned int _bits) { status_ = _bits; }\n\n\n  /// is a certain bit set ?\n  bool is_bit_set(unsigned int _s) const { return (status_ & _s) > 0; }\n  /// set a certain bit\n  void set_bit(unsigned int _s) { status_ |= _s; }\n  /// unset a certain bit\n  void unset_bit(unsigned int _s) { status_ &= ~_s; }\n  /// set or unset a certain bit\n  void change_bit(unsigned int _s, bool _b) {  \n    if (_b) status_ |= _s; else status_ &= ~_s; }\n\n\nprivate: \n\n  value_type status_;\n};\n\n\n//=============================================================================\n} // namespace Attributes\n} // namespace OpenMesh\n//=============================================================================\n#endif // OPENMESH_ATTRIBUTE_STATUS_HH defined\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Mesh/Traits.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n/** \\file Core/Mesh/Traits.hh\n    This file defines the default traits and some convenience macros.\n*/\n\n\n//=============================================================================\n//\n//  CLASS Traits\n//\n//=============================================================================\n\n#ifndef OPENMESH_TRAITS_HH\n#define OPENMESH_TRAITS_HH\n\n\n//== INCLUDES =================================================================\n\n\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/Geometry/VectorT.hh>\n#include <OpenMesh/Core/Mesh/Attributes.hh>\n#include <OpenMesh/Core/Mesh/Handles.hh>\n\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\n\n\n//== CLASS DEFINITION =========================================================\n\n\n/// Macro for defining the vertex attributes. See \\ref mesh_type.\n#define VertexAttributes(_i) enum { VertexAttributes = _i }\n\n/// Macro for defining the halfedge attributes. See \\ref mesh_type.\n#define HalfedgeAttributes(_i) enum { HalfedgeAttributes = _i }\n\n/// Macro for defining the edge attributes. See \\ref mesh_type.\n#define EdgeAttributes(_i) enum { EdgeAttributes = _i }\n\n/// Macro for defining the face attributes. See \\ref mesh_type.\n#define FaceAttributes(_i) enum { FaceAttributes = _i }\n\n/// Macro for defining the vertex traits. See \\ref mesh_type.\n#define VertexTraits \\\n  template <class Base, class Refs> struct VertexT : public Base\n\n/// Macro for defining the halfedge traits. See \\ref mesh_type.\n#define HalfedgeTraits \\\n  template <class Base, class Refs> struct HalfedgeT : public Base\n\n/// Macro for defining the edge traits. See \\ref mesh_type.\n#define EdgeTraits \\\n  template <class Base, class Refs> struct EdgeT : public Base\n\n/// Macro for defining the face traits. See \\ref mesh_type.\n#define FaceTraits \\\n  template <class Base, class Refs> struct FaceT : public Base\n\n\n\n//== CLASS DEFINITION =========================================================\n\n\n/** \\class DefaultTraits Traits.hh <OpenMesh/Mesh/Traits.hh>\n\n    Base class for all traits.  All user traits should be derived from\n    this class. You may enrich all basic items by additional\n    properties or define one or more of the types \\c Point, \\c Normal,\n    \\c TexCoord, or \\c Color.\n\n    \\see The Mesh docu section on \\ref mesh_type.\n    \\see Traits.hh for a list of macros for traits classes.\n*/\nstruct DefaultTraits\n{\n  /// The default coordinate type is OpenMesh::Vec3f.\n  typedef Vec3f  Point;\n\n  /// The default normal type is OpenMesh::Vec3f.\n  typedef Vec3f  Normal;\n\n  /// The default 1D texture coordinate type is float.\n  typedef float  TexCoord1D;\n  /// The default 2D texture coordinate type is OpenMesh::Vec2f.\n  typedef Vec2f  TexCoord2D;\n  /// The default 3D texture coordinate type is OpenMesh::Vec3f.\n  typedef Vec3f  TexCoord3D;\n\n  /// The default texture index type\n  typedef int TextureIndex;\n\n  /// The default color type is OpenMesh::Vec3uc.\n  typedef Vec3uc Color;\n\n#ifndef DOXY_IGNORE_THIS\n  VertexTraits    {};\n  HalfedgeTraits  {};\n  EdgeTraits      {};\n  FaceTraits      {};\n#endif\n\n  VertexAttributes(0);\n  HalfedgeAttributes(Attributes::PrevHalfedge);\n  EdgeAttributes(0);\n  FaceAttributes(0);\n};\n\n\n//== CLASS DEFINITION =========================================================\n\n\n/** Helper class to merge two mesh traits.\n *  \\internal\n *\n *  With the help of this class it's possible to merge two mesh traits.\n *  Whereby \\c _Traits1 overrides equally named symbols of \\c _Traits2.\n *\n *  For your convenience use the provided defines \\c OM_Merge_Traits\n *  and \\c OM_Merge_Traits_In_Template instead.\n *\n *  \\see OM_Merge_Traits, OM_Merge_Traits_In_Template\n */\ntemplate <class _Traits1, class _Traits2> struct MergeTraits\n{\n#ifndef DOXY_IGNORE_THIS\n  struct Result\n  {\n    // Mipspro needs this (strange) typedef\n    typedef _Traits1  T1;\n    typedef _Traits2  T2;\n\n\n    VertexAttributes   ( T1::VertexAttributes   | T2::VertexAttributes   );\n    HalfedgeAttributes ( T1::HalfedgeAttributes | T2::HalfedgeAttributes );\n    EdgeAttributes     ( T1::EdgeAttributes     | T2::EdgeAttributes     );\n    FaceAttributes     ( T1::FaceAttributes     | T2::FaceAttributes     );\n\n\n    typedef typename T1::Point    Point;\n    typedef typename T1::Normal   Normal;\n    typedef typename T1::Color    Color;\n    typedef typename T1::TexCoord TexCoord;\n\n    template <class Base, class Refs> class VertexT :\n      public T1::template VertexT<\n      typename T2::template VertexT<Base, Refs>, Refs>\n    {};\n\n    template <class Base, class Refs> class HalfedgeT :\n      public T1::template HalfedgeT<\n      typename T2::template HalfedgeT<Base, Refs>, Refs>\n    {};\n\n\n    template <class Base, class Refs> class EdgeT :\n      public T1::template EdgeT<\n      typename T2::template EdgeT<Base, Refs>, Refs>\n    {};\n\n\n    template <class Base, class Refs> class FaceT :\n      public T1::template FaceT<\n      typename T2::template FaceT<Base, Refs>, Refs>\n    {};\n  };\n#endif\n};\n\n\n/**\n    Macro for merging two traits classes _S1 and _S2 into one traits class _D.\n    Note that in case of ambiguities class _S1 overrides _S2, especially\n    the point/normal/color/texcoord type to be used is taken from _S1::Point /\n    _S1::Normal / _S1::Color / _S1::TexCoord\n*/\n#define OM_Merge_Traits(_S1, _S2, _D) \\\n  typedef OpenMesh::MergeTraits<_S1, _S2>::Result _D;\n\n\n/**\n    Macro for merging two traits classes _S1 and _S2 into one traits class _D.\n    Same as OM_Merge_Traits, but this can be used inside template classes.\n*/\n#define OM_Merge_Traits_In_Template(_S1, _S2, _D) \\\n  typedef typename OpenMesh::MergeTraits<_S1, _S2>::Result _D;\n\n\n//=============================================================================\n} // namespace OpenMesh\n//=============================================================================\n#endif // OPENMESH_TRAITS_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Mesh/TriConnectivity.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//  CLASS TriMeshT - IMPLEMENTATION\n\n#include <OpenMesh/Core/Mesh/TriConnectivity.hh>\n#include <OpenMesh/Core/System/omstream.hh>\n\nnamespace OpenMesh\n{\n\nTriConnectivity::FaceHandle\nTriConnectivity::add_face(const VertexHandle* _vertex_handles, size_t _vhs_size)\n{\n  // need at least 3 vertices\n  if (_vhs_size < 3) return InvalidFaceHandle;\n\n  /// face is triangle -> ok\n  if (_vhs_size == 3)\n    return PolyConnectivity::add_face(_vertex_handles, _vhs_size);\n\n  /// face is not a triangle -> triangulate\n  else\n  {\n    //omlog() << \"triangulating \" << _vhs_size << \"_gon\\n\";\n\n    VertexHandle vhandles[3];\n    vhandles[0] = _vertex_handles[0];\n\n    FaceHandle fh;\n    unsigned int i(1);\n    --_vhs_size;\n\n    while (i < _vhs_size)\n    {\n      vhandles[1] = _vertex_handles[i];\n      vhandles[2] = _vertex_handles[++i];\n      fh = PolyConnectivity::add_face(vhandles, 3);\n    }\n\n    return fh;\n  }\n}\n\n//-----------------------------------------------------------------------------\n\nFaceHandle TriConnectivity::add_face(const std::vector<VertexHandle>& _vhandles)\n{\n  return add_face(&_vhandles.front(), _vhandles.size());\n}\n\n//-----------------------------------------------------------------------------\n\n\nFaceHandle TriConnectivity::add_face(VertexHandle _vh0, VertexHandle _vh1, VertexHandle _vh2)\n{\n  VertexHandle vhs[3] = { _vh0, _vh1, _vh2 };\n  return PolyConnectivity::add_face(vhs, 3);\n}\n\n//-----------------------------------------------------------------------------\n\nbool TriConnectivity::is_collapse_ok(HalfedgeHandle v0v1)\n{\n  // is the edge already deleted?\n  if ( status(edge_handle(v0v1)).deleted() )\n    return false;\n\n  HalfedgeHandle  v1v0(opposite_halfedge_handle(v0v1));\n  VertexHandle    v0(to_vertex_handle(v1v0));\n  VertexHandle    v1(to_vertex_handle(v0v1));\n\n  // are vertices already deleted ?\n  if (status(v0).deleted() || status(v1).deleted())\n    return false;\n\n  VertexHandle    vl, vr;\n  HalfedgeHandle  h1, h2;\n\n  // the edges v1-vl and vl-v0 must not be both boundary edges\n  if (!is_boundary(v0v1))\n  {\n\n    h1 = next_halfedge_handle(v0v1);\n    h2 = next_halfedge_handle(h1);\n\n    vl = to_vertex_handle(h1);\n\n    if (is_boundary(opposite_halfedge_handle(h1)) &&\n        is_boundary(opposite_halfedge_handle(h2)))\n    {\n      return false;\n    }\n  }\n\n\n  // the edges v0-vr and vr-v1 must not be both boundary edges\n  if (!is_boundary(v1v0))\n  {\n\n    h1 = next_halfedge_handle(v1v0);\n    h2 = next_halfedge_handle(h1);\n\n    vr = to_vertex_handle(h1);\n\n    if (is_boundary(opposite_halfedge_handle(h1)) &&\n        is_boundary(opposite_halfedge_handle(h2)))\n      return false;\n  }\n\n  // if vl and vr are equal or both invalid -> fail\n  if (vl == vr) return false;\n\n  VertexVertexIter  vv_it;\n\n  // test intersection of the one-rings of v0 and v1\n  for (vv_it = vv_iter(v0); vv_it.is_valid(); ++vv_it)\n    status(*vv_it).set_tagged(false);\n\n  for (vv_it = vv_iter(v1); vv_it.is_valid(); ++vv_it)\n    status(*vv_it).set_tagged(true);\n\n  for (vv_it = vv_iter(v0); vv_it.is_valid(); ++vv_it)\n    if (status(*vv_it).tagged() && *vv_it != vl && *vv_it != vr)\n      return false;\n\n\n  // edge between two boundary vertices should be a boundary edge\n  if ( is_boundary(v0) && is_boundary(v1) &&\n       !is_boundary(v0v1) && !is_boundary(v1v0))\n    return false;\n\n  // passed all tests\n  return true;\n}\n\n//-----------------------------------------------------------------------------\nTriConnectivity::HalfedgeHandle\nTriConnectivity::vertex_split(VertexHandle v0, VertexHandle v1,\n                              VertexHandle vl, VertexHandle vr)\n{\n  HalfedgeHandle v1vl, vlv1, vrv1, v0v1;\n\n  // build loop from halfedge v1->vl\n  if (vl.is_valid())\n  {\n    v1vl = find_halfedge(v1, vl);\n    assert(v1vl.is_valid());\n    vlv1 = insert_loop(v1vl);\n  }\n\n  // build loop from halfedge vr->v1\n  if (vr.is_valid())\n  {\n    vrv1 = find_halfedge(vr, v1);\n    assert(vrv1.is_valid());\n    insert_loop(vrv1);\n  }\n\n  // handle boundary cases\n  if (!vl.is_valid())\n    vlv1 = prev_halfedge_handle(halfedge_handle(v1));\n  if (!vr.is_valid())\n    vrv1 = prev_halfedge_handle(halfedge_handle(v1));\n\n\n  // split vertex v1 into edge v0v1\n  v0v1 = insert_edge(v0, vlv1, vrv1);\n\n\n  return v0v1;\n}\n\n//-----------------------------------------------------------------------------\nTriConnectivity::HalfedgeHandle\nTriConnectivity::insert_loop(HalfedgeHandle _hh)\n{\n  HalfedgeHandle  h0(_hh);\n  HalfedgeHandle  o0(opposite_halfedge_handle(h0));\n\n  VertexHandle    v0(to_vertex_handle(o0));\n  VertexHandle    v1(to_vertex_handle(h0));\n\n  HalfedgeHandle  h1 = new_edge(v1, v0);\n  HalfedgeHandle  o1 = opposite_halfedge_handle(h1);\n\n  FaceHandle      f0 = face_handle(h0);\n  FaceHandle      f1 = new_face();\n\n  // halfedge -> halfedge\n  set_next_halfedge_handle(prev_halfedge_handle(h0), o1);\n  set_next_halfedge_handle(o1, next_halfedge_handle(h0));\n  set_next_halfedge_handle(h1, h0);\n  set_next_halfedge_handle(h0, h1);\n\n  // halfedge -> face\n  set_face_handle(o1, f0);\n  set_face_handle(h0, f1);\n  set_face_handle(h1, f1);\n\n  // face -> halfedge\n  set_halfedge_handle(f1, h0);\n  if (f0.is_valid())\n    set_halfedge_handle(f0, o1);\n\n\n  // vertex -> halfedge\n  adjust_outgoing_halfedge(v0);\n  adjust_outgoing_halfedge(v1);\n\n  return h1;\n}\n\n//-----------------------------------------------------------------------------\nTriConnectivity::HalfedgeHandle\nTriConnectivity::insert_edge(VertexHandle _vh, HalfedgeHandle _h0, HalfedgeHandle _h1)\n{\n  assert(_h0.is_valid() && _h1.is_valid());\n\n  VertexHandle  v0 = _vh;\n  VertexHandle  v1 = to_vertex_handle(_h0);\n\n  assert( v1 == to_vertex_handle(_h1));\n\n  HalfedgeHandle v0v1 = new_edge(v0, v1);\n  HalfedgeHandle v1v0 = opposite_halfedge_handle(v0v1);\n\n\n\n  // vertex -> halfedge\n  set_halfedge_handle(v0, v0v1);\n  set_halfedge_handle(v1, v1v0);\n\n\n  // halfedge -> halfedge\n  set_next_halfedge_handle(v0v1, next_halfedge_handle(_h0));\n  set_next_halfedge_handle(_h0, v0v1);\n  set_next_halfedge_handle(v1v0, next_halfedge_handle(_h1));\n  set_next_halfedge_handle(_h1, v1v0);\n\n\n  // halfedge -> vertex\n  for (VertexIHalfedgeIter vih_it(vih_iter(v0)); vih_it.is_valid(); ++vih_it)\n    set_vertex_handle(*vih_it, v0);\n\n\n  // halfedge -> face\n  set_face_handle(v0v1, face_handle(_h0));\n  set_face_handle(v1v0, face_handle(_h1));\n\n\n  // face -> halfedge\n  if (face_handle(v0v1).is_valid())\n    set_halfedge_handle(face_handle(v0v1), v0v1);\n  if (face_handle(v1v0).is_valid())\n    set_halfedge_handle(face_handle(v1v0), v1v0);\n\n\n  // vertex -> halfedge\n  adjust_outgoing_halfedge(v0);\n  adjust_outgoing_halfedge(v1);\n\n\n  return v0v1;\n}\n\n//-----------------------------------------------------------------------------\nbool TriConnectivity::is_flip_ok(EdgeHandle _eh) const\n{\n  // boundary edges cannot be flipped\n  if (is_boundary(_eh)) return false;\n\n\n  HalfedgeHandle hh = halfedge_handle(_eh, 0);\n  HalfedgeHandle oh = halfedge_handle(_eh, 1);\n\n\n  // check if the flipped edge is already present\n  // in the mesh\n\n  VertexHandle ah = to_vertex_handle(next_halfedge_handle(hh));\n  VertexHandle bh = to_vertex_handle(next_halfedge_handle(oh));\n\n  if (ah == bh)   // this is generally a bad sign !!!\n    return false;\n\n  for (ConstVertexVertexIter vvi(*this, ah); vvi.is_valid(); ++vvi)\n    if (*vvi == bh)\n      return false;\n\n  return true;\n}\n\n//-----------------------------------------------------------------------------\nvoid TriConnectivity::flip(EdgeHandle _eh)\n{\n  // CAUTION : Flipping a halfedge may result in\n  // a non-manifold mesh, hence check for yourself\n  // whether this operation is allowed or not!\n  assert(is_flip_ok(_eh));//let's make it sure it is actually checked\n  assert(!is_boundary(_eh));\n\n  HalfedgeHandle a0 = halfedge_handle(_eh, 0);\n  HalfedgeHandle b0 = halfedge_handle(_eh, 1);\n\n  HalfedgeHandle a1 = next_halfedge_handle(a0);\n  HalfedgeHandle a2 = next_halfedge_handle(a1);\n\n  HalfedgeHandle b1 = next_halfedge_handle(b0);\n  HalfedgeHandle b2 = next_halfedge_handle(b1);\n\n  VertexHandle   va0 = to_vertex_handle(a0);\n  VertexHandle   va1 = to_vertex_handle(a1);\n\n  VertexHandle   vb0 = to_vertex_handle(b0);\n  VertexHandle   vb1 = to_vertex_handle(b1);\n\n  FaceHandle     fa  = face_handle(a0);\n  FaceHandle     fb  = face_handle(b0);\n\n  set_vertex_handle(a0, va1);\n  set_vertex_handle(b0, vb1);\n\n  set_next_halfedge_handle(a0, a2);\n  set_next_halfedge_handle(a2, b1);\n  set_next_halfedge_handle(b1, a0);\n\n  set_next_halfedge_handle(b0, b2);\n  set_next_halfedge_handle(b2, a1);\n  set_next_halfedge_handle(a1, b0);\n\n  set_face_handle(a1, fb);\n  set_face_handle(b1, fa);\n\n  set_halfedge_handle(fa, a0);\n  set_halfedge_handle(fb, b0);\n\n  if (halfedge_handle(va0) == b0)\n    set_halfedge_handle(va0, a1);\n  if (halfedge_handle(vb0) == a0)\n    set_halfedge_handle(vb0, b1);\n}\n\n\n//-----------------------------------------------------------------------------\n\nvoid TriConnectivity::split(EdgeHandle _eh, VertexHandle _vh)\n{\n  HalfedgeHandle h0 = halfedge_handle(_eh, 0);\n  HalfedgeHandle o0 = halfedge_handle(_eh, 1);\n\n  VertexHandle   v2 = to_vertex_handle(o0);\n\n  HalfedgeHandle e1 = new_edge(_vh, v2);\n  HalfedgeHandle t1 = opposite_halfedge_handle(e1);\n\n  FaceHandle     f0 = face_handle(h0);\n  FaceHandle     f3 = face_handle(o0);\n\n  set_halfedge_handle(_vh, h0);\n  set_vertex_handle(o0, _vh);\n\n  if (!is_boundary(h0))\n  {\n    HalfedgeHandle h1 = next_halfedge_handle(h0);\n    HalfedgeHandle h2 = next_halfedge_handle(h1);\n\n    VertexHandle v1 = to_vertex_handle(h1);\n\n    HalfedgeHandle e0 = new_edge(_vh, v1);\n    HalfedgeHandle t0 = opposite_halfedge_handle(e0);\n\n    FaceHandle f1 = new_face();\n    set_halfedge_handle(f0, h0);\n    set_halfedge_handle(f1, h2);\n\n    set_face_handle(h1, f0);\n    set_face_handle(t0, f0);\n    set_face_handle(h0, f0);\n\n    set_face_handle(h2, f1);\n    set_face_handle(t1, f1);\n    set_face_handle(e0, f1);\n\n    set_next_halfedge_handle(h0, h1);\n    set_next_halfedge_handle(h1, t0);\n    set_next_halfedge_handle(t0, h0);\n\n    set_next_halfedge_handle(e0, h2);\n    set_next_halfedge_handle(h2, t1);\n    set_next_halfedge_handle(t1, e0);\n  }\n  else\n  {\n    set_next_halfedge_handle(prev_halfedge_handle(h0), t1);\n    set_next_halfedge_handle(t1, h0);\n    // halfedge handle of _vh already is h0\n  }\n\n\n  if (!is_boundary(o0))\n  {\n    HalfedgeHandle o1 = next_halfedge_handle(o0);\n    HalfedgeHandle o2 = next_halfedge_handle(o1);\n\n    VertexHandle v3 = to_vertex_handle(o1);\n\n    HalfedgeHandle e2 = new_edge(_vh, v3);\n    HalfedgeHandle t2 = opposite_halfedge_handle(e2);\n\n    FaceHandle f2 = new_face();\n    set_halfedge_handle(f2, o1);\n    set_halfedge_handle(f3, o0);\n\n    set_face_handle(o1, f2);\n    set_face_handle(t2, f2);\n    set_face_handle(e1, f2);\n\n    set_face_handle(o2, f3);\n    set_face_handle(o0, f3);\n    set_face_handle(e2, f3);\n\n    set_next_halfedge_handle(e1, o1);\n    set_next_halfedge_handle(o1, t2);\n    set_next_halfedge_handle(t2, e1);\n\n    set_next_halfedge_handle(o0, e2);\n    set_next_halfedge_handle(e2, o2);\n    set_next_halfedge_handle(o2, o0);\n  }\n  else\n  {\n    set_next_halfedge_handle(e1, next_halfedge_handle(o0));\n    set_next_halfedge_handle(o0, e1);\n    set_halfedge_handle(_vh, e1);\n  }\n\n  if (halfedge_handle(v2) == h0)\n    set_halfedge_handle(v2, t1);\n}\n\n//-----------------------------------------------------------------------------\n\nvoid TriConnectivity::split_copy(EdgeHandle _eh, VertexHandle _vh)\n{\n  // Split the halfedge ( handle will be preserved)\n  split(_eh, _vh);\n\n  // Copy the properties of the original edge to all neighbor edges that\n  // have been created\n  for(VEIter ve_it = ve_iter(_vh); ve_it.is_valid(); ++ve_it)\n    copy_all_properties(_eh, *ve_it);\n}\n\n}// namespace OpenMesh\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Mesh/TriConnectivity.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n#ifndef OPENMESH_TRICONNECTIVITY_HH\n#define OPENMESH_TRICONNECTIVITY_HH\n\n#include <OpenMesh/Core/Mesh/PolyConnectivity.hh>\n\nnamespace OpenMesh {\n\n/** \\brief Connectivity Class for Triangle Meshes\n*/\nclass OPENMESHDLLEXPORT TriConnectivity : public PolyConnectivity\n{\npublic:\n\n  TriConnectivity() {}\n  virtual ~TriConnectivity() {}\n\n  inline static bool is_triangles()\n  { return true; }\n\n  /** assign_connectivity() methods. See ArrayKernel::assign_connectivity()\n      for more details. When the source connectivity is not triangles, in\n      addition \"fan\" connectivity triangulation is performed*/\n  inline void assign_connectivity(const TriConnectivity& _other)\n  { PolyConnectivity::assign_connectivity(_other); }\n  \n  inline void assign_connectivity(const PolyConnectivity& _other)\n  { \n    PolyConnectivity::assign_connectivity(_other); \n    triangulate();\n  }\n  \n  /** \\name Addding items to a mesh\n  */\n\n  //@{\n\n  /** \\brief Add a face with arbitrary valence to the triangle mesh\n   *\n   * Override OpenMesh::Mesh::PolyMeshT::add_face(). Faces that aren't\n   * triangles will be triangulated and added. In this case an\n   * invalid face handle will be returned.\n   *\n   *\n   * */\n  FaceHandle add_face(const VertexHandle* _vhandles, size_t _vhs_size);\n  \n  /** \\brief Add a face with arbitrary valence to the triangle mesh\n     *\n     * Override OpenMesh::Mesh::PolyMeshT::add_face(). Faces that aren't\n     * triangles will be triangulated and added. In this case an\n     * invalid face handle will be returned.\n     *\n     *\n     * */\n  FaceHandle add_face(const std::vector<VertexHandle>& _vhandles);\n\n  /** \\brief Add a face to the mesh (triangle)\n   *\n   * This function adds a triangle to the mesh. The triangle is passed directly\n   * to the underlying PolyConnectivity as we don't explicitly need to triangulate something.\n   *\n   * @param _vh0 VertexHandle 1\n   * @param _vh1 VertexHandle 2\n   * @param _vh2 VertexHandle 3\n   * @return FaceHandle of the added face (invalid, if the operation failed)\n   */\n  FaceHandle add_face(VertexHandle _vh0, VertexHandle _vh1, VertexHandle _vh2);\n  \n  //@}\n\n  /** Returns the opposite vertex to the halfedge _heh in the face\n      referenced by _heh returns InvalidVertexHandle if the _heh is\n      boundary  */\n  inline VertexHandle opposite_vh(HalfedgeHandle _heh) const\n  {\n    return is_boundary(_heh) ? InvalidVertexHandle :\n                               to_vertex_handle(next_halfedge_handle(_heh));\n  }\n\n  /** Returns the opposite vertex to the opposite halfedge of _heh in\n      the face referenced by it returns InvalidVertexHandle if the\n      opposite halfedge is boundary  */\n  VertexHandle opposite_he_opposite_vh(HalfedgeHandle _heh) const\n  { return opposite_vh(opposite_halfedge_handle(_heh)); }\n\n  /** \\name Topology modifying operators\n  */\n  //@{\n\n\n  /** Returns whether collapsing halfedge _heh is ok or would lead to\n      topological inconsistencies.\n      \\attention This method need the Attributes::Status attribute and\n      changes the \\em tagged bit.  */\n  bool is_collapse_ok(HalfedgeHandle _heh);\n\n  /// Vertex Split: inverse operation to collapse().\n  HalfedgeHandle vertex_split(VertexHandle v0, VertexHandle v1,\n                              VertexHandle vl, VertexHandle vr);\n\n  /// Check whether flipping _eh is topologically correct.\n  bool is_flip_ok(EdgeHandle _eh) const;\n\n  /** Flip edge _eh.\n      Check for topological correctness first using is_flip_ok(). */\n  void flip(EdgeHandle _eh);\n\n\n  /** \\brief Edge split (= 2-to-4 split)\n   *\n   *\n   * The function will introduce two new faces ( non-boundary case) or\n   * one additional face (if edge is boundary)\n   *\n   * \\note The properties of the new edges, halfedges, and faces will be undefined!\n   *\n   * @param _eh Edge handle that should be splitted\n   * @param _vh Vertex handle that will be inserted at the edge\n   */\n  void split(EdgeHandle _eh, VertexHandle _vh);\n\n  /** \\brief Edge split (= 2-to-4 split)\n   *\n   * The function will introduce two new faces ( non-boundary case) or\n   * one additional face (if edge is boundary)\n   *\n   * \\note The properties of the new edges will be adjusted to the properties of the original edge\n   * \\note The properties of the new faces and halfedges will be undefined\n   *\n   * @param _eh Edge handle that should be splitted\n   * @param _vh Vertex handle that will be inserted at the edge\n   */\n  void split_copy(EdgeHandle _eh, VertexHandle _vh);\n\n  /** \\brief Face split (= 1-to-3) split, calls corresponding PolyMeshT function).\n   *\n   * @param _fh Face handle that should be splitted\n   * @param _vh Vertex handle that will be inserted at the face\n   */\n  inline void split(FaceHandle _fh, VertexHandle _vh)\n  { PolyConnectivity::split(_fh, _vh); }\n\n  /** \\brief Face split (= 1-to-3) split, calls corresponding PolyMeshT function).\n   *\n   * @param _fh Face handle that should be splitted\n   * @param _vh Vertex handle that will be inserted at the face\n   */\n  inline void split_copy(FaceHandle _fh, VertexHandle _vh)\n  { PolyConnectivity::split_copy(_fh, _vh); }\n\n  //@}\n\nprivate:\n  /// Helper for vertex split\n  HalfedgeHandle insert_loop(HalfedgeHandle _hh);\n  /// Helper for vertex split\n  HalfedgeHandle insert_edge(VertexHandle _vh,\n                             HalfedgeHandle _h0, HalfedgeHandle _h1);\n};\n\n}\n\n#endif//OPENMESH_TRICONNECTIVITY_HH\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Mesh/TriMeshT.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  CLASS TriMeshT - IMPLEMENTATION\n//\n//=============================================================================\n\n\n#define OPENMESH_TRIMESH_C\n\n\n//== INCLUDES =================================================================\n\n\n#include <OpenMesh/Core/Mesh/TriMeshT.hh>\n#include <OpenMesh/Core/System/omstream.hh>\n#include <vector>\n\n\n//== NAMESPACES ==============================================================\n\n\nnamespace OpenMesh {\n\n\n//== IMPLEMENTATION ==========================================================\n\ntemplate <class Kernel>\ntypename TriMeshT<Kernel>::Normal\nTriMeshT<Kernel>::\ncalc_face_normal(FaceHandle _fh) const\n{\n  assert(this->halfedge_handle(_fh).is_valid());\n  ConstFaceVertexIter fv_it(this->cfv_iter(_fh));\n\n  const Point& p0(this->point(*fv_it));  ++fv_it;\n  const Point& p1(this->point(*fv_it));  ++fv_it;\n  const Point& p2(this->point(*fv_it));\n\n  return PolyMesh::calc_face_normal(p0, p1, p2);\n}\n\n//=============================================================================\n} // namespace OpenMesh\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Mesh/TriMeshT.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  CLASS TriMeshT\n//\n//=============================================================================\n\n\n#ifndef OPENMESH_TRIMESH_HH\n#define OPENMESH_TRIMESH_HH\n\n\n//== INCLUDES =================================================================\n\n\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/Mesh/PolyMeshT.hh>\n#include <vector>\n\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\n\n\n//== CLASS DEFINITION =========================================================\n\n\n/** \\class TriMeshT TriMeshT.hh <OpenMesh/Mesh/TriMeshT.hh>\n\n    Base type for a triangle mesh.\n\n    Base type for a triangle mesh, parameterized by a mesh kernel. The\n    mesh inherits all methods from the kernel class and the\n    more general polygonal mesh PolyMeshT. Therefore it provides\n    the same types for items, handles, iterators and so on.\n\n    \\param Kernel: template argument for the mesh kernel\n    \\note You should use the predefined mesh-kernel combinations in\n    \\ref mesh_types_group\n    \\see \\ref mesh_type\n    \\see OpenMesh::PolyMeshT\n*/\n\ntemplate <class Kernel>\nclass TriMeshT : public PolyMeshT<Kernel>\n{\n\npublic:\n\n\n  // self\n  typedef TriMeshT<Kernel>                      This;\n  typedef PolyMeshT<Kernel>                     PolyMesh;\n\n  //@{\n  /// Determine whether this is a PolyMeshT or TriMeshT ( This function does not check the per face vertex count! It only checks if the datatype is PolyMeshT or TriMeshT )\n  enum { IsPolyMesh = 0 };\n  enum { IsTriMesh  = 1 };\n  static bool is_polymesh() { return false; }\n  static bool is_trimesh()  { return  true; }\n  //@}\n\n  //--- items ---\n\n  typedef typename PolyMesh::Scalar             Scalar;\n  typedef typename PolyMesh::Point              Point;\n  typedef typename PolyMesh::Normal             Normal;\n  typedef typename PolyMesh::Color              Color;\n  typedef typename PolyMesh::TexCoord1D         TexCoord1D;\n  typedef typename PolyMesh::TexCoord2D         TexCoord2D;\n  typedef typename PolyMesh::TexCoord3D         TexCoord3D;\n  typedef typename PolyMesh::Vertex             Vertex;\n  typedef typename PolyMesh::Halfedge           Halfedge;\n  typedef typename PolyMesh::Edge               Edge;\n  typedef typename PolyMesh::Face               Face;\n\n\n  //--- handles ---\n\n  typedef typename PolyMesh::VertexHandle       VertexHandle;\n  typedef typename PolyMesh::HalfedgeHandle     HalfedgeHandle;\n  typedef typename PolyMesh::EdgeHandle         EdgeHandle;\n  typedef typename PolyMesh::FaceHandle         FaceHandle;\n\n\n  //--- iterators ---\n\n  typedef typename PolyMesh::VertexIter         VertexIter;\n  typedef typename PolyMesh::ConstVertexIter    ConstVertexIter;\n  typedef typename PolyMesh::EdgeIter           EdgeIter;\n  typedef typename PolyMesh::ConstEdgeIter      ConstEdgeIter;\n  typedef typename PolyMesh::FaceIter           FaceIter;\n  typedef typename PolyMesh::ConstFaceIter      ConstFaceIter;\n\n\n\n  //--- circulators ---\n\n  typedef typename PolyMesh::VertexVertexIter         VertexVertexIter;\n  typedef typename PolyMesh::VertexOHalfedgeIter      VertexOHalfedgeIter;\n  typedef typename PolyMesh::VertexIHalfedgeIter      VertexIHalfedgeIter;\n  typedef typename PolyMesh::VertexEdgeIter           VertexEdgeIter;\n  typedef typename PolyMesh::VertexFaceIter           VertexFaceIter;\n  typedef typename PolyMesh::FaceVertexIter           FaceVertexIter;\n  typedef typename PolyMesh::FaceHalfedgeIter         FaceHalfedgeIter;\n  typedef typename PolyMesh::FaceEdgeIter             FaceEdgeIter;\n  typedef typename PolyMesh::FaceFaceIter             FaceFaceIter;\n  typedef typename PolyMesh::ConstVertexVertexIter    ConstVertexVertexIter;\n  typedef typename PolyMesh::ConstVertexOHalfedgeIter ConstVertexOHalfedgeIter;\n  typedef typename PolyMesh::ConstVertexIHalfedgeIter ConstVertexIHalfedgeIter;\n  typedef typename PolyMesh::ConstVertexEdgeIter      ConstVertexEdgeIter;\n  typedef typename PolyMesh::ConstVertexFaceIter      ConstVertexFaceIter;\n  typedef typename PolyMesh::ConstFaceVertexIter      ConstFaceVertexIter;\n  typedef typename PolyMesh::ConstFaceHalfedgeIter    ConstFaceHalfedgeIter;\n  typedef typename PolyMesh::ConstFaceEdgeIter        ConstFaceEdgeIter;\n  typedef typename PolyMesh::ConstFaceFaceIter        ConstFaceFaceIter;\n\n  // --- constructor/destructor\n\n  /// Default constructor\n  TriMeshT() : PolyMesh() {}\n  /// Destructor\n  virtual ~TriMeshT() {}\n\n  //--- halfedge collapse / vertex split ---\n\n  /** \\brief Vertex Split: inverse operation to collapse().\n   *\n   * Insert the new vertex at position v0. The vertex will be added\n   * as the inverse of the vertex split. The faces above the split\n   * will be correctly attached to the two new edges\n   *\n   * Before:\n   * v_l     v0     v_r\n   *  x      x      x\n   *   \\           /\n   *    \\         /\n   *     \\       /\n   *      \\     /\n   *       \\   /\n   *        \\ /\n   *         x\n   *         v1\n   *\n   * After:\n   * v_l    v0      v_r\n   *  x------x------x\n   *   \\     |     /\n   *    \\    |    /\n   *     \\   |   /\n   *      \\  |  /\n   *       \\ | /\n   *        \\|/\n   *         x\n   *         v1\n   *\n   * @param _v0_point Point position for the new point\n   * @param _v1       Vertex that will be split\n   * @param _vl       Left vertex handle\n   * @param _vr       Right vertex handle\n   * @return Newly inserted halfedge\n   */\n  inline HalfedgeHandle vertex_split(Point _v0_point,  VertexHandle _v1,\n                                     VertexHandle _vl, VertexHandle _vr)\n  { return PolyMesh::vertex_split(add_vertex(_v0_point), _v1, _vl, _vr); }\n\n  /** \\brief Vertex Split: inverse operation to collapse().\n   *\n   * Insert the new vertex at position v0. The vertex will be added\n   * as the inverse of the vertex split. The faces above the split\n   * will be correctly attached to the two new edges\n   *\n   * Before:\n   * v_l     v0     v_r\n   *  x      x      x\n   *   \\           /\n   *    \\         /\n   *     \\       /\n   *      \\     /\n   *       \\   /\n   *        \\ /\n   *         x\n   *         v1\n   *\n   * After:\n   * v_l    v0      v_r\n   *  x------x------x\n   *   \\     |     /\n   *    \\    |    /\n   *     \\   |   /\n   *      \\  |  /\n   *       \\ | /\n   *        \\|/\n   *         x\n   *         v1\n   *\n   * @param _v0 Vertex handle for the newly inserted point (Input has to be unconnected!)\n   * @param _v1 Vertex that will be split\n   * @param _vl Left vertex handle\n   * @param _vr Right vertex handle\n   * @return Newly inserted halfedge\n   */\n  inline HalfedgeHandle vertex_split(VertexHandle _v0, VertexHandle _v1,\n                                     VertexHandle _vl, VertexHandle _vr)\n  { return PolyMesh::vertex_split(_v0, _v1, _vl, _vr); }\n\n  /** \\brief Edge split (= 2-to-4 split)\n   *\n   * The properties of the new edges will be undefined!\n   *\n   *\n   * @param _eh Edge handle that should be splitted\n   * @param _p  New point position that will be inserted at the edge\n   * @return    Vertex handle of the newly added vertex\n   */\n  inline VertexHandle split(EdgeHandle _eh, const Point& _p)\n  {\n    //Do not call PolyMeshT function below as this does the wrong operation\n    const VertexHandle vh = this->add_vertex(_p); Kernel::split(_eh, vh); return vh;\n  }\n\n  /** \\brief Edge split (= 2-to-4 split)\n   *\n   * The properties of the new edges will be adjusted to the properties of the original edge\n   *\n   * @param _eh Edge handle that should be splitted\n   * @param _p  New point position that will be inserted at the edge\n   * @return    Vertex handle of the newly added vertex\n   */\n  inline VertexHandle split_copy(EdgeHandle _eh, const Point& _p)\n  {\n    //Do not call PolyMeshT function below as this does the wrong operation\n    const VertexHandle vh = this->add_vertex(_p); Kernel::split_copy(_eh, vh); return vh;\n  }\n\n  /** \\brief Edge split (= 2-to-4 split)\n   *\n   * The properties of the new edges will be undefined!\n   *\n   * @param _eh Edge handle that should be splitted\n   * @param _vh Vertex handle that will be inserted at the edge\n   */\n  inline void split(EdgeHandle _eh, VertexHandle _vh)\n  {\n    //Do not call PolyMeshT function below as this does the wrong operation\n    Kernel::split(_eh, _vh);\n  }\n\n  /** \\brief Edge split (= 2-to-4 split)\n   *\n   * The properties of the new edges will be adjusted to the properties of the original edge\n   *\n   * @param _eh Edge handle that should be splitted\n   * @param _vh Vertex handle that will be inserted at the edge\n   */\n  inline void split_copy(EdgeHandle _eh, VertexHandle _vh)\n  {\n    //Do not call PolyMeshT function below as this does the wrong operation\n    Kernel::split_copy(_eh, _vh);\n  }\n\n  /** \\brief Face split (= 1-to-3 split, calls corresponding PolyMeshT function).\n   *\n   * The properties of the new faces will be undefined!\n   *\n   * @param _fh Face handle that should be splitted\n   * @param _p  New point position that will be inserted in the face\n   *\n   * @return Vertex handle of the new vertex\n   */\n  inline VertexHandle split(FaceHandle _fh, const Point& _p)\n  { const VertexHandle vh = this->add_vertex(_p); PolyMesh::split(_fh, vh); return vh; }\n\n  /** \\brief Face split (= 1-to-3 split, calls corresponding PolyMeshT function).\n   *\n   * The properties of the new faces will be adjusted to the properties of the original face\n   *\n   * @param _fh Face handle that should be splitted\n   * @param _p  New point position that will be inserted in the face\n   *\n   * @return Vertex handle of the new vertex\n   */\n  inline VertexHandle split_copy(FaceHandle _fh, const Point& _p)\n  { const VertexHandle vh = this->add_vertex(_p);  PolyMesh::split_copy(_fh, vh); return vh; }\n\n  /** \\brief Face split (= 1-to-3 split, calls corresponding PolyMeshT function).\n   *\n   * The properties of the new faces will be undefined!\n   *\n   * @param _fh Face handle that should be splitted\n   * @param _vh Vertex handle that will be inserted at the face\n   */\n  inline void split(FaceHandle _fh, VertexHandle _vh)\n  { PolyMesh::split(_fh, _vh); }\n\n  /** \\brief Face split (= 1-to-3 split, calls corresponding PolyMeshT function).\n   *\n   * The properties of the new faces will be adjusted to the properties of the original face\n   *\n   * @param _fh Face handle that should be splitted\n   * @param _vh Vertex handle that will be inserted at the face\n   */\n  inline void split_copy(FaceHandle _fh, VertexHandle _vh)\n  { PolyMesh::split_copy(_fh, _vh); }\n  \n  /** \\name Normal vector computation\n  */\n  //@{\n\n  /** Calculate normal vector for face _fh (specialized for TriMesh). */\n  Normal calc_face_normal(FaceHandle _fh) const;\n\n  //@}\n};\n\n\n//=============================================================================\n} // namespace OpenMesh\n//=============================================================================\n#if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_TRIMESH_C)\n#define OPENMESH_TRIMESH_TEMPLATES\n#include \"TriMeshT.cc\"\n#endif\n//=============================================================================\n#endif // OPENMESH_TRIMESH_HH defined\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  CLASS TriMesh_ArrayKernelT\n//\n//=============================================================================\n\n\n#ifndef OPENMESH_TRIMESH_ARRAY_KERNEL_HH\n#define OPENMESH_TRIMESH_ARRAY_KERNEL_HH\n\n\n//== INCLUDES =================================================================\n\n\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/Mesh/TriConnectivity.hh>\n#include <OpenMesh/Core/Mesh/Traits.hh>\n#include <OpenMesh/Core/Mesh/FinalMeshItemsT.hh>\n#include <OpenMesh/Core/Mesh/AttribKernelT.hh>\n#include <OpenMesh/Core/Mesh/TriMeshT.hh>\n\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\n\n\n//== CLASS DEFINITION =========================================================\n\n\n/// Helper class to create a TriMesh-type based on ArrayKernelT\ntemplate <class Traits>\nstruct TriMesh_ArrayKernel_GeneratorT\n{\n  typedef FinalMeshItemsT<Traits, true>               MeshItems;\n  typedef AttribKernelT<MeshItems, TriConnectivity>   AttribKernel;\n  typedef TriMeshT<AttribKernel>                      Mesh;\n};\n\n\n\n/** \\ingroup mesh_types_group\n    Triangle mesh based on the ArrayKernel.\n    \\see OpenMesh::TriMeshT\n    \\see OpenMesh::ArrayKernelT\n*/\ntemplate <class Traits = DefaultTraits>\nclass TriMesh_ArrayKernelT\n  : public TriMesh_ArrayKernel_GeneratorT<Traits>::Mesh\n{};\n\n\n//=============================================================================\n} // namespace OpenMesh\n//=============================================================================\n#endif // OPENMESH_TRIMESH_ARRAY_KERNEL_HH\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/System/OpenMeshDLLMacros.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------*\n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         *\n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/\n\n/*===========================================================================*\\\n *                                                                           *\n *   $Revision: 566 $                                                         *\n *   $Date: 2012-03-23 18:00:57 +0100 (Fr, 23 Mär 2012) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n// Disable the warnings about needs to have DLL interface as we have tons of vector templates\n#ifdef WIN32\n  #pragma warning( disable: 4251 )\n#endif\n\n#ifndef OPENMESHDLLEXPORT\n\t#ifdef WIN32\n\t\t#ifdef OPENMESHDLL\n\t\t\t#ifdef BUILDOPENMESHDLL\n        #define OPENMESHDLLEXPORT __declspec(dllexport)\n        #define OPENMESHDLLEXPORTONLY __declspec(dllexport)\n\t\t\t#else\n        #define OPENMESHDLLEXPORT __declspec(dllimport)\n        #define OPENMESHDLLEXPORTONLY\n\t\t\t#endif\n\t\t#else\t\t\n\t\t\t#define OPENMESHDLLEXPORT\n\t\t\t#define OPENMESHDLLEXPORTONLY\n\t\t#endif\n\t#else\n\t\t#define OPENMESHDLLEXPORT\n\t\t#define OPENMESHDLLEXPORTONLY\n\t#endif\n#endif\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/System/compiler.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n#ifndef OPENMESH_COMPILER_H\n#define OPENMESH_COMPILER_H\n\n//=============================================================================\n\n#if defined(ACGMAKE_STATIC_BUILD)\n#  define OM_STATIC_BUILD 1\n#endif\n\n//=============================================================================\n\n#if defined(_DEBUG) || defined(DEBUG)\n#  define OM_DEBUG\n#endif\n\n//=============================================================================\n\n// Workaround for Intel Compiler with MS VC++ 6\n#if defined(_MSC_VER) && \\\n   ( defined(__ICL) || defined(__INTEL_COMPILER) || defined(__ICC) )\n#  if !defined(__INTEL_COMPILER)\n#    define __INTEL_COMPILER __ICL\n#  endif\n#  define OM_USE_INTEL_COMPILER 1\n#endif\n\n// --------------------------------------------------------- MS Visual C++ ----\n// Compiler _MSC_VER\n// .NET 2002 1300 \n// .NET 2003 1310\n// .NET 2005 1400\n#if defined(_MSC_VER) && !defined(OM_USE_INTEL_COMPILER)\n#  if (_MSC_VER == 1300)\n#    define OM_CC_MSVC\n#    define OM_TYPENAME\n#    define OM_OUT_OF_CLASS_TEMPLATE       0\n#    define OM_PARTIAL_SPECIALIZATION      0\n#    define OM_INCLUDE_TEMPLATES           1\n#  elif (_MSC_VER == 1310)\n#    define OM_CC_MSVC\n#    define OM_TYPENAME\n#    define OM_OUT_OF_CLASS_TEMPLATE       1\n#    define OM_PARTIAL_SPECIALIZATION      1\n#    define OM_INCLUDE_TEMPLATES           1\n#  elif (_MSC_VER >= 1400) // settings for .NET 2005 (NOTE: not fully tested)\n#    define OM_TYPENAME\n#    define OM_OUT_OF_CLASS_TEMPLATE       1\n#    define OM_PARTIAL_SPECIALIZATION      1\n#    define OM_INCLUDE_TEMPLATES           1\n#  else\n#    error \"Version 7 (.NET 2002) or higher of the MS VC++ is required!\"\n#  endif\n//   currently no windows dll supported\n#  define OM_STATIC_BUILD 1\n#  if defined(_MT)\n#    define OM_REENTRANT 1\n#  endif\n#  define OM_CC \"MSVC++\"\n#  define OM_CC_VERSION _MSC_VER\n// Does not work stable because the define _CPPRTTI sometimes does not exist,\n// though the option /GR is set!? \n#  if defined(__cplusplus) && !defined(_CPPRTTI)\n#    error \"Enable Runtime Type Information (Compiler Option /GR)!\"\n#  endif\n#  if !defined(_USE_MATH_DEFINES)\n#    error \"You have to define _USE_MATH_DEFINES in the compiler settings!\"\n#  endif\n// ------------------------------------------------------------- Borland C ----\n#elif defined(__BORLANDC__)\n#  error \"Borland Compiler are not supported yet!\"\n// ------------------------------------------------------------- GNU C/C++ ----\n#elif defined(__GNUC__) && !defined(__ICC)\n#  define OM_CC_GCC\n#  define OM_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 )\n#  define OM_GCC_MAJOR                __GNUC__\n#  define OM_GCC_MINOR                __GNUC_MINOR__\n#  if (OM_GCC_VERSION >= 30200)\n#    define OM_TYPENAME typename\n#    define OM_OUT_OF_CLASS_TEMPLATE  1\n#    define OM_PARTIAL_SPECIALIZATION 1\n#    define OM_INCLUDE_TEMPLATES      1\n#  else\n#    error \"Version 3.2.0 or better of the GNU Compiler is required!\"\n#  endif\n#  if defined(_REENTRANT)\n#    define OM_REENTRANT 1\n#  endif\n#  define OM_CC \"GCC\"\n#  define OM_CC_VERSION OM_GCC_VERSION\n// ------------------------------------------------------------- Intel icc ----\n#elif defined(__ICC) || defined(__INTEL_COMPILER)\n#  define OM_CC_ICC\n#  define OM_TYPENAME typename\n#  define OM_OUT_OF_CLASS_TEMPLATE  1\n#  define OM_PARTIAL_SPECIALIZATION 1\n#  define OM_INCLUDE_TEMPLATES      1\n#  if defined(_REENTRANT) || defined(_MT)\n#    define OM_REENTRANT 1\n#  endif\n#  define OM_CC \"ICC\"\n#  define OM_CC_VERSION __INTEL_COMPILER\n//   currently no windows dll supported\n#  if defined(_MSC_VER) || defined(WIN32)\n#    define OM_STATIC_BUILD 1\n#  endif\n// ------------------------------------------------------ MIPSpro Compiler ----\n#elif defined(__MIPS_ISA) || defined(__mips)\n// _MIPS_ISA                    \n// _COMPILER_VERSION            e.g. 730, 7 major, 3 minor\n// _MIPS_FPSET                  32|64\n// _MIPS_SZINT                  32|64\n// _MIPS_SZLONG                 32|64\n// _MIPS_SZPTR                  32|64\n#  define OM_CC_MIPS\n#  define OM_TYPENAME typename\n#  define OM_OUT_OF_CLASS_TEMPLATE    1\n#  define OM_PARTIAL_SPECIALIZATION   1\n#  define OM_INCLUDE_TEMPLATES        0\n#  define OM_CC \"MIPS\"\n#  define OM_CC_VERSION _COMPILER_VERSION\n// ------------------------------------------------------------------ ???? ----\n#else\n#  error \"You're using an unsupported compiler!\"\n#endif\n\n//=============================================================================\n#endif // OPENMESH_COMPILER_H defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/System/config.h",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 1054 $                                                         *\n *   $Date: 2014-05-09 14:44:42 +0200 (金, 09 5 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n/** \\file config.h\n *  \\todo Move content to config.hh and include it to be compatible with old\n *  source.\n */\n\n//=============================================================================\n\n#ifndef OPENMESH_CONFIG_H\n#define OPENMESH_CONFIG_H\n\n//=============================================================================\n\n#include <assert.h>\n#include <OpenMesh/Core/System/compiler.hh>\n#include <OpenMesh/Core/System/OpenMeshDLLMacros.hh>\n\n// ----------------------------------------------------------------------------\n\n#define OM_VERSION 0x30200\n\n// only defined, if it is a beta version\n//#define OM_VERSION_BETA 4\n\n#define OM_GET_VER ((OM_VERSION && 0xf0000) >> 16)\n#define OM_GET_MAJ ((OM_VERSION && 0x0ff00) >> 8)\n#define OM_GET_MIN  (OM_VERSION && 0x000ff)\n\n#ifdef WIN32\n#  ifdef min\n#    pragma message(\"Detected min macro! OpenMesh does not compile with min/max macros active! Please add a define NOMINMAX to your compiler flags or add #undef min before including OpenMesh headers !\")\n#    error min macro active \n#  endif\n#  ifdef max\n#    pragma message(\"Detected max macro! OpenMesh does not compile with min/max macros active! Please add a define NOMINMAX to your compiler flags or add #undef max before including OpenMesh headers !\")\n#    error max macro active \n#  endif\n#endif\n\n#if defined(_MSC_VER)\n#  define DEPRECATED(msg) __declspec(deprecated(msg))\n#elif defined(__GNUC__)\n#  if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >= 40500 /* Test for GCC >= 4.5.0 */\n#    define DEPRECATED(msg) __attribute__ ((deprecated(msg)))\n#  else\n#    define DEPRECATED(msg) __attribute__ ((deprecated))\n#  endif\n#elif defined(__clang__)\n#  define DEPRECATED(msg) __attribute__ ((deprecated(msg)))\n#else\n#  define DEPRECATED(msg)\n#endif\n\ntypedef unsigned int uint;\n//=============================================================================\n#endif // OPENMESH_CONFIG_H defined\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/System/config.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n#include <OpenMesh/Core/System/config.h>\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/System/mostream.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n//=============================================================================\n//\n//  multiplex streams & ultilities\n//\n//=============================================================================\n\n#ifndef OPENMESH_MOSTREAM_HH\n#define OPENMESH_MOSTREAM_HH\n\n\n//== INCLUDES =================================================================\n\n#include <OpenMesh/Core/System/config.h>\n#include <iostream>\n#if defined( OM_CC_GCC ) && OM_CC_VERSION < 30000\n#  include <streambuf.h>\n#else\n#  include <streambuf>\n#endif\n#include <vector>\n#include <map>\n#include <string>\n#include <algorithm>\n\n\n//== NAMESPACES ===============================================================\n\nnamespace OpenMesh {\n#ifndef DOXY_IGNORE_THIS\n\n\n//== CLASS DEFINITION =========================================================\n\n\nclass basic_multiplex_target\n{\npublic:\n  virtual ~basic_multiplex_target() {}\n  virtual void operator<<(const std::string& _s) = 0;\n};\n\n\ntemplate <class T>\nclass multiplex_target : public basic_multiplex_target\n{\npublic:\n  multiplex_target(T& _t) : target_(_t) {}\n  virtual void operator<<(const std::string& _s) { target_ << _s; }\nprivate:\n  T& target_;\n};\n\n\n\n//== CLASS DEFINITION =========================================================\n\n\n#if defined( OM_CC_GCC ) && OM_CC_VERSION < 30000\n#  define STREAMBUF   streambuf\n#  define INT_TYPE    int\n#  define TRAITS_TYPE \n#else\n#  define STREAMBUF std::basic_streambuf<char>\n#endif\n\nclass multiplex_streambuf : public STREAMBUF\n{\npublic:\n\n  typedef STREAMBUF                   base_type;\n#if defined( OM_CC_GCC ) && OM_CC_VERSION < 30000\n  typedef int                         int_type;\n  struct traits_type\n  {\n    static int_type eof() { return -1; }\n    static char to_char_type(int_type c) { return char(c); }\n  };\n#else\n  typedef base_type::int_type         int_type;\n  typedef base_type::traits_type      traits_type;\n#endif\n\n  // Constructor\n  multiplex_streambuf() : enabled_(true) { buffer_.reserve(100); }\n\n  // Destructor\n  ~multiplex_streambuf()\n  {\n    tmap_iter t_it(target_map_.begin()), t_end(target_map_.end());\n    for (; t_it!=t_end; ++t_it)\n      delete t_it->second;\n  }\n\n\n  // buffer enable/disable\n  bool is_enabled() const { return enabled_; }\n  void enable() { enabled_ = true; }\n  void disable() { enabled_ = false; }\n\n\n  // construct multiplex_target<T> and add it to targets\n  template <class T> bool connect(T& _target) \n  {\n    void* key = (void*) &_target;\n\n    if (target_map_.find(key) != target_map_.end())\n      return false;\n\n    target_type*  mtarget = new multiplex_target<T>(_target);\n    target_map_[key] = mtarget;\n\n    __connect(mtarget); \n    return true;\n  }\n\n\n  // disconnect target from multiplexer\n  template <class T> bool disconnect(T& _target) \n  {\n    void*      key  = (void*) &_target;\n    tmap_iter  t_it = target_map_.find(key);\n\n    if (t_it != target_map_.end())\n    {\n      __disconnect(t_it->second);\n      target_map_.erase(t_it);\n      return true;\n    }\n\n    return false;\n  }\n\n\nprotected:\n\n  // output what's in buffer_\n  virtual int sync() \n  {\n    if (!buffer_.empty())\n    {\n      if (enabled_) multiplex();\n#if defined( OM_CC_GCC ) && OM_CC_VERSION < 30000\n      buffer_ = \"\"; // member clear() not available!\n#else\n      buffer_.clear();\n#endif\n    }\n    return base_type::sync();\n  }\n\n\n  // take on char and add it to buffer_\n  // if '\\n' is encountered, trigger a sync()\n  virtual \n  int_type overflow(int_type _c = multiplex_streambuf::traits_type::eof())\n  {\n    char c = traits_type::to_char_type(_c);\n    buffer_.push_back(c);\n    if (c == '\\n') sync();\n    return 0;\n  }\n\n\nprivate:\n\n  typedef basic_multiplex_target          target_type;\n  typedef std::vector<target_type*>       target_list;\n  typedef target_list::iterator           tlist_iter;\n  typedef std::map<void*, target_type*>   target_map;\n  typedef target_map::iterator            tmap_iter;\n\n\n  // add _target to list of multiplex targets\n  void __connect(target_type* _target) { targets_.push_back(_target); }\n\n\n  // remove _target from list of multiplex targets\n  void __disconnect(target_type* _target) { \n    targets_.erase(std::find(targets_.begin(), targets_.end(), _target));\n  }\n\n\n  // multiplex output of buffer_ to all targets\n  void multiplex()\n  {\n    tlist_iter t_it(targets_.begin()), t_end(targets_.end());\n    for (; t_it!=t_end; ++t_it)\n      **t_it << buffer_;\n  }\n\n\nprivate:\n\n  target_list  targets_;\n  target_map   target_map_;\n  std::string  buffer_;\n  bool         enabled_;\n};\n\n#undef STREAMBUF\n\n\n//== CLASS DEFINITION =========================================================\n\n\n/** \\class mostream mostream.hh <OpenMesh/Core/System/mostream.hh>\n\n   This class provides streams that can easily be multiplexed (using\n   the connect() method) and toggled on/off (using enable() /\n   disable()).\n\n    \\see omlog, omout, omerr\n*/\n\nclass mostream : public std::ostream\n{\npublic:\n\n  /// Explicit constructor\n  explicit mostream() : std::ostream(NULL) { init(&streambuffer_); }\n\n\n  /// Connect target to multiplexer\n  template <class T> bool connect(T& _target) \n  { \n    return streambuffer_.connect(_target); \n  }\n\n\n  /// Disconnect target from multiplexer\n  template <class T> bool disconnect(T& _target) \n  {\n    return streambuffer_.disconnect(_target);\n  }\n\n\n  /// is buffer enabled\n  bool is_enabled() const { return streambuffer_.is_enabled(); }\n\n  /// enable this buffer\n  void enable() { streambuffer_.enable(); }\n\n  /// disable this buffer\n  void disable() { streambuffer_.disable(); }\n\n\nprivate:\n  multiplex_streambuf  streambuffer_;\n};\n\n\n//=============================================================================\n#endif\n} // namespace OpenMesh\n//=============================================================================\n#endif // OPENMESH_MOSTREAM_HH defined\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/System/omstream.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n//=============================================================================\n//\n//  CLASS mostream - IMPLEMENTATION\n//\n//=============================================================================\n\n\n//== INCLUDES =================================================================\n\n#include <OpenMesh/Core/System/omstream.hh>\n\n\n//== IMPLEMENTATION ========================================================== \n\n\nOpenMesh::mostream& omlog() \n{\n  static bool initialized = false;\n  static OpenMesh::mostream mystream;\n  if (!initialized)\n  {\n    mystream.connect(std::clog);\n#ifdef NDEBUG\n    mystream.disable();\n#endif\n    initialized = true;\n  }\n  return mystream;\n}\n\n\nOpenMesh::mostream& omout() \n{\n  static bool initialized = false;\n  static OpenMesh::mostream mystream;\n  if (!initialized)\n  {\n    mystream.connect(std::cout);\n    initialized = true;\n  }\n  return mystream;\n}\n\n\nOpenMesh::mostream& omerr() \n{\n  static bool initialized = false;\n  static OpenMesh::mostream mystream;\n  if (!initialized)\n  {\n    mystream.connect(std::cerr);\n    initialized = true;\n  }\n  return mystream;\n}\n\n\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/System/omstream.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n//=============================================================================\n//\n//  OpenMesh streams: omlog, omout, omerr\n//\n//=============================================================================\n\n#ifndef OPENMESH_OMSTREAMS_HH\n#define OPENMESH_OMSTREAMS_HH\n\n\n//== INCLUDES =================================================================\n\n#include <OpenMesh/Core/System/mostream.hh>\n\n\n//== CLASS DEFINITION =========================================================\n\n/** \\file omstream.hh\n    This file provides the streams omlog, omout, and omerr.\n*/\n\n/** \\name stream replacements\n    These stream provide replacements for clog, cout, and cerr. They have\n    the advantage that they can easily be multiplexed.\n    \\see OpenMesh::mostream\n*/\n//@{\nOPENMESHDLLEXPORT OpenMesh::mostream& omlog();\nOPENMESHDLLEXPORT OpenMesh::mostream& omout();\nOPENMESHDLLEXPORT OpenMesh::mostream& omerr();\n//@}\n\n//=============================================================================\n#endif // OPENMESH_OMSTREAMS_HH defined\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Utils/AutoPropertyHandleT.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n#ifndef OPENMESH_AutoPropertyHandleT_HH\n#define OPENMESH_AutoPropertyHandleT_HH\n\n//== INCLUDES =================================================================\n#include <assert.h>\n#include <string>\n\n//== NAMESPACES ===============================================================\n\nnamespace OpenMesh {\n\n//== CLASS DEFINITION =========================================================\n\ntemplate <class Mesh_, class PropertyHandle_>\nclass AutoPropertyHandleT : public PropertyHandle_\n{\npublic:\n  typedef Mesh_                             Mesh;\n  typedef PropertyHandle_                   PropertyHandle;\n  typedef PropertyHandle                    Base;\n  typedef typename PropertyHandle::Value    Value;\n  typedef AutoPropertyHandleT<Mesh, PropertyHandle>\n                                            Self;\nprotected:\n  Mesh*                                     m_;\n  bool                                      own_property_;//ref counting?\n\npublic:\n  AutoPropertyHandleT()\n  : m_(NULL), own_property_(false)\n  {}\n  \n  AutoPropertyHandleT(const Self& _other)\n  : Base(_other.idx()), m_(_other.m_), own_property_(false)\n  {}\n  \n  explicit AutoPropertyHandleT(Mesh& _m, const std::string& _pp_name = std::string())\n  { add_property(_m, _pp_name); }\n\n  AutoPropertyHandleT(Mesh& _m, PropertyHandle _pph)\n  : Base(_pph.idx()), m_(&_m), own_property_(false)\n  {}\n\n  ~AutoPropertyHandleT()\n  {\n    if (own_property_)\n    {\n      m_->remove_property(*this);\n    }\n  }\n\n  inline void                               add_property(Mesh& _m, const std::string& _pp_name = std::string())\n  {\n    assert(!is_valid());\n    m_ = &_m;\n    own_property_ = _pp_name.empty() || !m_->get_property_handle(*this, _pp_name);\n    if (own_property_)\n    {\n      m_->add_property(*this, _pp_name);\n    }\n  }\n  \n  inline void                               remove_property()\n  {\n    assert(own_property_);//only the owner can delete the property\n    m_->remove_property(*this);\n    own_property_ = false;\n    invalidate();\n  }\n  \n  template <class _Handle>\n  inline Value&                             operator [] (_Handle _hnd)\n  { return m_->property(*this, _hnd); }\n\n  template <class _Handle>\n  inline const Value&                       operator [] (_Handle _hnd) const\n  { return m_->property(*this, _hnd); }\n\n  inline bool                               own_property() const\n  { return own_property_; }\n\n  inline void                               free_property()\n  { own_property_ = false; }\n};\n\n//=============================================================================\n} // namespace OpenMesh\n//=============================================================================\n#endif // OPENMESH_AutoPropertyHandleT_HH defined\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Utils/BaseProperty.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n#include <OpenMesh/Core/Utils/BaseProperty.hh>\n#include <iostream>\n\nnamespace OpenMesh\n{\n\nvoid BaseProperty::stats(std::ostream& _ostr) const\n{\n  _ostr << \"  \" << name() << (persistent() ? \", persistent \" : \"\") << \"\\n\";\n}\n\n}\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Utils/BaseProperty.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n#ifndef OPENMESH_BASEPROPERTY_HH\n#define OPENMESH_BASEPROPERTY_HH\n\n#include <string>\n#include <OpenMesh/Core/IO/StoreRestore.hh>\n#include <OpenMesh/Core/System/omstream.hh>\n\nnamespace OpenMesh {\n\n//== CLASS DEFINITION =========================================================\n\n/** \\class BaseProperty Property.hh <OpenMesh/Core/Utils/PropertyT.hh>\n\n    Abstract class defining the basic interface of a dynamic property.\n**/\n\nclass OPENMESHDLLEXPORT BaseProperty\n{\npublic:\n\n  /// Indicates an error when a size is returned by a member.\n  static const size_t UnknownSize = size_t(-1);\n\npublic:\n\n  /// \\brief Default constructor.\n  ///\n  /// In %OpenMesh all mesh data is stored in so-called properties.\n  /// We distinuish between standard properties, which can be defined at\n  /// compile time using the Attributes in the traits definition and\n  /// at runtime using the request property functions defined in one of\n  /// the kernels.\n  ///\n  /// If the property should be stored along with the default properties\n  /// in the OM-format one must name the property and enable the persistant\n  /// flag with set_persistent().\n  ///\n  /// \\param _name Optional textual name for the property.\n  ///\n  BaseProperty(const std::string& _name = \"<unknown>\")\n  : name_(_name), persistent_(false)\n  {}\n\n  /// \\brief Copy constructor\n  BaseProperty(const BaseProperty & _rhs)\n      : name_( _rhs.name_ ), persistent_( _rhs.persistent_ ) {}\n\n  /// Destructor.\n  virtual ~BaseProperty() {}\n\npublic: // synchronized array interface\n\n  /// Reserve memory for n elements.\n  virtual void reserve(size_t _n) = 0;\n\n  /// Resize storage to hold n elements.\n  virtual void resize(size_t _n) = 0;\n\n  /// Clear all elements and free memory.\n  virtual void clear() = 0;\n\n  /// Extend the number of elements by one.\n  virtual void push_back() = 0;\n\n  /// Let two elements swap their storage place.\n  virtual void swap(size_t _i0, size_t _i1) = 0;\n\n  /// Copy one element to another\n  virtual void copy(size_t _io, size_t _i1) = 0;\n  \n  /// Return a deep copy of self.\n  virtual BaseProperty* clone () const = 0;\n\npublic: // named property interface\n\n  /// Return the name of the property\n  const std::string& name() const { return name_; }\n\n  virtual void stats(std::ostream& _ostr) const;\n\npublic: // I/O support\n\n  /// Returns true if the persistent flag is enabled else false.\n  bool persistent(void) const { return persistent_; }\n\n  /// Enable or disable persistency. Self must be a named property to enable\n  /// persistency.\n  virtual void set_persistent( bool _yn ) = 0;\n\n  /// Number of elements in property\n  virtual size_t       n_elements() const = 0;\n\n  /// Size of one element in bytes or UnknownSize if not known.\n  virtual size_t       element_size() const = 0;\n\n  /// Return size of property in bytes\n  virtual size_t       size_of() const\n  {\n    return size_of( n_elements() );\n  }\n\n  /// Estimated size of property if it has _n_elem elements.\n  /// The member returns UnknownSize if the size cannot be estimated.\n  virtual size_t       size_of(size_t _n_elem) const\n  {\n    return (element_size()!=UnknownSize)\n      ? (_n_elem*element_size())\n      : UnknownSize;\n  }\n\n  /// Store self as one binary block\n  virtual size_t store( std::ostream& _ostr, bool _swap ) const = 0;\n\n  /** Restore self from a binary block. Uses reserve() to set the\n      size of self before restoring.\n  **/\n  virtual size_t restore( std::istream& _istr, bool _swap ) = 0;\n\nprotected:\n\n  // To be used in a derived class, when overloading set_persistent()\n  template < typename T >\n  void check_and_set_persistent( bool _yn )\n  {\n    if ( _yn && !IO::is_streamable<T>() )\n      omerr() << \"Warning! Type of property value is not binary storable!\\n\";\n    persistent_ = IO::is_streamable<T>() && _yn;\n  }\n\nprivate:\n\n  std::string name_;\n  bool        persistent_;\n};\n\n}//namespace OpenMesh\n\n#endif //OPENMESH_BASEPROPERTY_HH\n\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Utils/Endian.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  Helper Functions for binary reading / writing\n//\n//=============================================================================\n\n\n//== INCLUDES =================================================================\n\n\n#include <iostream>\n#include <algorithm>\n#include <OpenMesh/Core/Utils/Endian.hh>\n\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\n\n\n//== IMPLEMENTATION ===========================================================\n\n//-----------------------------------------------------------------------------\n\nint Endian::one_ = 1;\n\nconst Endian::Type Endian::local_ = *((unsigned char*)&Endian::one_)\n   ? Endian::LSB\n   : Endian::MSB;\n\nconst char * Endian::as_string(Type _t)\n{\n   return _t == LSB ? \"LSB\" : \"MSB\";\n}\n   \n//=============================================================================\n} // namespace OpenMesh\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Utils/Endian.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  Helper Functions for binary reading / writing\n//\n//=============================================================================\n\n\n#ifndef OPENMESH_UTILS_ENDIAN_HH\n#define OPENMESH_UTILS_ENDIAN_HH\n\n\n//== INCLUDES =================================================================\n\n\n#include <OpenMesh/Core/System/config.h>\n#include <iostream>\n\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\n\n\n//=============================================================================\n\n\n/**  Determine byte order of host system.\n */\nclass OPENMESHDLLEXPORT Endian\n{\npublic:\n   \n  enum Type {\n    LSB = 1, ///< Little endian (Intel family and clones)\n    MSB      ///< big endian (Motorola's 68x family, DEC Alpha, MIPS)\n  };\n  \n  /// Return endian type of host system.\n  static Type local() { return local_; }\n\n  /// Return type _t as string.\n  static const char * as_string(Type _t);\n   \nprivate:\n   static int one_;\n   static const Type local_;\n};\n\n//=============================================================================\n} // namespace OpenMesh\n//=============================================================================\n#endif // OPENMESH_MESHREADER_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Utils/GenProg.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  Utils for generic/generative programming\n//\n//=============================================================================\n\n#ifndef OPENMESH_GENPROG_HH\n#define OPENMESH_GENPROG_HH\n\n\n//== INCLUDES =================================================================\n\n#include <OpenMesh/Core/System/config.h>\n\n\n//== NAMESPACES ===============================================================\n\nnamespace OpenMesh {\n\nnamespace GenProg  {\n#ifndef DOXY_IGNORE_THIS\n\n//== IMPLEMENTATION ===========================================================\n\n\n/// This type maps \\c true or \\c false to different types.\ntemplate <bool b> struct Bool2Type { enum { my_bool = b }; };\n\n/// This class generates different types from different \\c int 's.\ntemplate <int i>  struct Int2Type  { enum { my_int = i }; };\n\n/// Handy typedef for Bool2Type<true> classes\ntypedef Bool2Type<true> True;\n\n/// Handy typedef for Bool2Type<false> classes\ntypedef Bool2Type<false> False;\n\n//-----------------------------------------------------------------------------\n/// compile time assertions \ntemplate <bool Expr> struct AssertCompile;\ntemplate <> struct AssertCompile<true> {};\n\n\n\n//--- Template \"if\" w/ partial specialization ---------------------------------\n#if OM_PARTIAL_SPECIALIZATION\n\n\ntemplate <bool condition, class Then, class Else>\nstruct IF { typedef Then Result; };\n\n/** Template \\c IF w/ partial specialization\n\\code\ntypedef IF<bool, Then, Else>::Result  ResultType;\n\\endcode    \n*/\ntemplate <class Then, class Else>\nstruct IF<false, Then, Else> { typedef Else Result; };\n\n\n\n\n\n//--- Template \"if\" w/o partial specialization --------------------------------\n#else\n\n\nstruct SelectThen \n{\n  template <class Then, class Else> struct Select {\n    typedef Then Result;\n  };\n};\n\nstruct SelectElse\n{\n  template <class Then, class Else> struct Select {\n    typedef Else Result;\n  };\n};\n\ntemplate <bool condition> struct ChooseSelector {\n  typedef SelectThen Result;\n};\n\ntemplate <> struct ChooseSelector<false> {\n  typedef SelectElse Result;\n};\n\n\n/** Template \\c IF w/o partial specialization. Use it like\n\\code\ntypedef IF<bool, Then, Else>::Result  ResultType;\n\\endcode    \n*/\n\ntemplate <bool condition, class Then, class Else>\nclass IF \n{ \n  typedef typename ChooseSelector<condition>::Result  Selector;\npublic:\n  typedef typename Selector::template Select<Then, Else>::Result  Result;\n};\n\n#endif\n\n//=============================================================================\n#endif\n} // namespace GenProg\n} // namespace OpenMesh\n\n#define assert_compile(EXPR)                GenProg::AssertCompile<(EXPR)>();\n\n//=============================================================================\n#endif // OPENMESH_GENPROG_HH defined\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Utils/Noncopyable.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  Implements the Non-Copyable metapher\n//\n//=============================================================================\n\n#ifndef OPENMESH_NONCOPYABLE_HH\n#define OPENMESH_NONCOPYABLE_HH\n\n\n//-----------------------------------------------------------------------------\n\n#include <OpenMesh/Core/System/config.h>\n\n//-----------------------------------------------------------------------------\n\nnamespace OpenMesh {\nnamespace Utils {\n\n//-----------------------------------------------------------------------------\n   \n/** This class demonstrates the non copyable idiom. In some cases it is\n    important an object can't be copied. Deriving from Noncopyable makes sure\n    all relevant constructor and operators are made inaccessable, for public\n    AND derived classes.\n**/\nclass Noncopyable\n{\npublic:\n  Noncopyable() { }\n\nprivate:\n  /// Prevent access to copy constructor\n  Noncopyable( const Noncopyable& );\n  \n  /// Prevent access to assignment operator\n  const Noncopyable& operator=( const Noncopyable& );\n};\n\n//=============================================================================\n} // namespace Utils\n} // namespace OpenMesh\n//=============================================================================\n#endif // OPENMESH_NONCOPYABLE_HH\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Utils/Property.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n#ifndef OPENMESH_PROPERTY_HH\n#define OPENMESH_PROPERTY_HH\n\n\n//== INCLUDES =================================================================\n\n\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/Mesh/Handles.hh>\n#include <OpenMesh/Core/Utils/BaseProperty.hh>\n#include <vector>\n#include <string>\n#include <algorithm>\n\n\n//== NAMESPACES ===============================================================\n\nnamespace OpenMesh {\n\n//== CLASS DEFINITION =========================================================\n\n/** \\class PropertyT Property.hh <OpenMesh/Core/Utils/PropertyT.hh>\n *\n *  \\brief Default property class for any type T.\n *\n *  The default property class for any type T.\n *\n *  The property supports persistency if T is a \"fundamental\" type:\n *  - integer fundamental types except bool:\n *    char, short, int, long, long long (__int64 for MS VC++) and\n *    their unsigned companions.\n *  - float fundamentals except <tt>long double</tt>:\n *    float, double\n *  - %OpenMesh vector types\n *\n *  Persistency of non-fundamental types is supported if and only if a\n *  specialization of struct IO::binary<> exists for the wanted type.\n */\n\n// TODO: it might be possible to define Property using kind of a runtime info\n// structure holding the size of T. Then reserve, swap, resize, etc can be written\n// in pure malloc() style w/o virtual overhead. Template member function proved per\n// element access to the properties, asserting dynamic_casts in debug\n\ntemplate <class T>\nclass PropertyT : public BaseProperty\n{\npublic:\n\n  typedef T                                       Value;\n  typedef std::vector<T>                          vector_type;\n  typedef T                                       value_type;\n  typedef typename vector_type::reference         reference;\n  typedef typename vector_type::const_reference   const_reference;\n\npublic:\n\n  /// Default constructor\n  PropertyT(const std::string& _name = \"<unknown>\")\n  : BaseProperty(_name)\n  {}\n\n  /// Copy constructor\n  PropertyT(const PropertyT & _rhs)\n      : BaseProperty( _rhs ), data_( _rhs.data_ ) {}\n\npublic: // inherited from BaseProperty\n\n  virtual void reserve(size_t _n) { data_.reserve(_n);    }\n  virtual void resize(size_t _n)  { data_.resize(_n);     }\n  virtual void clear()  { data_.clear(); vector_type().swap(data_);    }\n  virtual void push_back()        { data_.push_back(T()); }\n  virtual void swap(size_t _i0, size_t _i1)\n  { std::swap(data_[_i0], data_[_i1]); }\n  virtual void copy(size_t _i0, size_t _i1)\n  { data_[_i1] = data_[_i0]; }\n\npublic:\n\n  virtual void set_persistent( bool _yn )\n  { check_and_set_persistent<T>( _yn ); }\n\n  virtual size_t       n_elements()   const { return data_.size(); }\n  virtual size_t       element_size() const { return IO::size_of<T>(); }\n\n#ifndef DOXY_IGNORE_THIS\n  struct plus {\n    size_t operator () ( size_t _b, const T& _v )\n    { return _b + IO::size_of<T>(_v); }\n  };\n#endif\n\n  virtual size_t size_of(void) const\n  {\n    if (element_size() != IO::UnknownSize)\n      return this->BaseProperty::size_of(n_elements());\n    return std::accumulate(data_.begin(), data_.end(), size_t(0), plus());\n  }\n\n  virtual size_t size_of(size_t _n_elem) const\n  { return this->BaseProperty::size_of(_n_elem); }\n\n  virtual size_t store( std::ostream& _ostr, bool _swap ) const\n  {\n    if ( IO::is_streamable<vector_type>() )\n      return IO::store(_ostr, data_, _swap );\n    size_t bytes = 0;\n    for (size_t i=0; i<n_elements(); ++i)\n      bytes += IO::store( _ostr, data_[i], _swap );\n    return bytes;\n  }\n\n  virtual size_t restore( std::istream& _istr, bool _swap )\n  {\n    if ( IO::is_streamable<vector_type>() )\n      return IO::restore(_istr, data_, _swap );\n    size_t bytes = 0;\n    for (size_t i=0; i<n_elements(); ++i)\n      bytes += IO::restore( _istr, data_[i], _swap );\n    return bytes;\n  }\n\npublic: // data access interface\n\n  /// Get pointer to array (does not work for T==bool)\n  const T* data() const {\n\n    if( data_.empty() )\n      return 0;\n\n    return &data_[0];\n  }\n\n  /// Get reference to property vector (be careful, improper usage, e.g. resizing, may crash OpenMesh!!!)\n  vector_type& data_vector() {\n\n    return data_;\n  }\n\n  /// Access the i'th element. No range check is performed!\n  reference operator[](int _idx)\n  {\n    assert( size_t(_idx) < data_.size() );\n    return data_[_idx];\n  }\n\n  /// Const access to the i'th element. No range check is performed!\n  const_reference operator[](int _idx) const\n  {\n    assert( size_t(_idx) < data_.size());\n    return data_[_idx];\n  }\n\n  /// Make a copy of self.\n  PropertyT<T>* clone() const\n  {\n    PropertyT<T>* p = new PropertyT<T>( *this );\n    return p;\n  }\n\n\nprivate:\n\n  vector_type data_;\n};\n\n//-----------------------------------------------------------------------------\n\n\n/** Property specialization for bool type. \n\n  The data will be stored as a bitset.\n */\ntemplate <>\nclass PropertyT<bool> : public BaseProperty\n{\npublic:\n\n  typedef std::vector<bool>                       vector_type;\n  typedef bool                                    value_type;\n  typedef vector_type::reference                  reference;\n  typedef vector_type::const_reference            const_reference;\n\npublic:\n\n  PropertyT(const std::string& _name = \"<unknown>\")\n    : BaseProperty(_name)\n  { }\n\npublic: // inherited from BaseProperty\n\n  virtual void reserve(size_t _n) { data_.reserve(_n);    }\n  virtual void resize(size_t _n)  { data_.resize(_n);     }\n  virtual void clear()  { data_.clear(); vector_type().swap(data_);    }\n  virtual void push_back()        { data_.push_back(bool()); }\n  virtual void swap(size_t _i0, size_t _i1)\n  { bool t(data_[_i0]); data_[_i0]=data_[_i1]; data_[_i1]=t; }\n  virtual void copy(size_t _i0, size_t _i1)\n  { data_[_i1] = data_[_i0]; }\n\npublic:\n\n  virtual void set_persistent( bool _yn )\n  {\n    check_and_set_persistent<bool>( _yn );\n  }\n\n  virtual size_t       n_elements()   const { return data_.size();  }\n  virtual size_t       element_size() const { return UnknownSize;    }\n  virtual size_t       size_of() const      { return size_of( n_elements() ); }\n  virtual size_t       size_of(size_t _n_elem) const\n  {\n    return _n_elem / 8 + ((_n_elem % 8)!=0);\n  }\n\n  size_t store( std::ostream& _ostr, bool /* _swap */ ) const\n  {\n    size_t bytes = 0;\n\n    size_t N = data_.size() / 8;\n    size_t R = data_.size() % 8;\n\n    size_t        idx;  // element index\n    size_t        bidx;\n    unsigned char bits; // bitset\n\n    for (bidx=idx=0; idx < N; ++idx, bidx+=8)\n    {\n      bits = !!data_[bidx]\n        | (!!data_[bidx+1] << 1)\n        | (!!data_[bidx+2] << 2)\n        | (!!data_[bidx+3] << 3)\n        | (!!data_[bidx+4] << 4)\n        | (!!data_[bidx+5] << 5)\n        | (!!data_[bidx+6] << 6)\n        | (!!data_[bidx+7] << 7);\n      _ostr << bits;\n    }\n    bytes = N;\n\n    if (R)\n    {\n      bits = 0;\n      for (idx=0; idx < R; ++idx)\n        bits |= !!data_[bidx+idx] << idx;\n      _ostr << bits;\n      ++bytes;\n    }\n\n    std::cout << std::endl;\n\n    assert( bytes == size_of() );\n\n    return bytes;\n  }\n\n  size_t restore( std::istream& _istr, bool /* _swap */ )\n  {\n    size_t bytes = 0;\n\n    size_t N = data_.size() / 8;\n    size_t R = data_.size() % 8;\n\n    size_t        idx;  // element index\n    size_t        bidx; //\n    unsigned char bits; // bitset\n\n    for (bidx=idx=0; idx < N; ++idx, bidx+=8)\n    {\n      _istr >> bits;\n      data_[bidx+0] = !!(bits & 0x01);\n      data_[bidx+1] = !!(bits & 0x02);\n      data_[bidx+2] = !!(bits & 0x04);\n      data_[bidx+3] = !!(bits & 0x08);\n      data_[bidx+4] = !!(bits & 0x10);\n      data_[bidx+5] = !!(bits & 0x20);\n      data_[bidx+6] = !!(bits & 0x40);\n      data_[bidx+7] = !!(bits & 0x80);\n    }\n    bytes = N;\n\n    if (R)\n    {\n      _istr >> bits;\n      for (idx=0; idx < R; ++idx)\n        data_[bidx+idx] = !!(bits & (1<<idx));\n      ++bytes;\n    }\n\n    std::cout << std::endl;\n\n    return bytes;\n  }\n\n\npublic:\n\n  /// Get reference to property vector (be careful, improper usage, e.g. resizing, may crash OpenMesh!!!)\n  vector_type& data_vector() {\n\n    return data_;\n  }\n\n  /// Access the i'th element. No range check is performed!\n  reference operator[](int _idx)\n  {\n    assert( size_t(_idx) < data_.size() );\n    return data_[_idx];\n  }\n\n  /// Const access to the i'th element. No range check is performed!\n  const_reference operator[](int _idx) const\n  {\n    assert( size_t(_idx) < data_.size());\n    return data_[_idx];\n  }\n\n  /// Make a copy of self.\n  PropertyT<bool>* clone() const\n  {\n    PropertyT<bool>* p = new PropertyT<bool>( *this );\n    return p;\n  }\n\n\nprivate:\n\n  vector_type data_;\n};\n\n\n//-----------------------------------------------------------------------------\n\n\n/** Property specialization for std::string type.\n*/\ntemplate <>\nclass PropertyT<std::string> : public BaseProperty\n{\npublic:\n\n  typedef std::string                             Value;\n  typedef std::vector<std::string>                vector_type;\n  typedef std::string                             value_type;\n  typedef vector_type::reference                  reference;\n  typedef vector_type::const_reference            const_reference;\n\npublic:\n\n  PropertyT(const std::string& _name = \"<unknown>\")\n    : BaseProperty(_name)\n  { }\n\npublic: // inherited from BaseProperty\n\n  virtual void reserve(size_t _n) { data_.reserve(_n);    }\n  virtual void resize(size_t _n)  { data_.resize(_n);     }\n  virtual void clear()  { data_.clear(); vector_type().swap(data_);    }\n  virtual void push_back()        { data_.push_back(std::string()); }\n  virtual void swap(size_t _i0, size_t _i1) {\n    std::swap(data_[_i0], data_[_i1]);\n  }\n  virtual void copy(size_t _i0, size_t _i1)\n  { data_[_i1] = data_[_i0]; }\n\npublic:\n\n  virtual void set_persistent( bool _yn )\n  { check_and_set_persistent<std::string>( _yn ); }\n\n  virtual size_t       n_elements()   const { return data_.size();  }\n  virtual size_t       element_size() const { return UnknownSize;    }\n  virtual size_t       size_of() const\n  { return IO::size_of( data_ ); }\n\n  virtual size_t       size_of(size_t /* _n_elem */) const\n  { return UnknownSize; }\n\n  /// Store self as one binary block. Max. length of a string is 65535 bytes.\n  size_t store( std::ostream& _ostr, bool _swap ) const\n  { return IO::store( _ostr, data_, _swap ); }\n\n  size_t restore( std::istream& _istr, bool _swap )\n  { return IO::restore( _istr, data_, _swap ); }\n\npublic:\n\n  const value_type* data() const {\n      if( data_.empty() )\n\t  return 0;\n\n      return (value_type*) &data_[0];\n  }\n\n  /// Access the i'th element. No range check is performed!\n  reference operator[](int _idx) {\n    assert( size_t(_idx) < data_.size());\n    return ((value_type*) &data_[0])[_idx];\n  }\n\n  /// Const access the i'th element. No range check is performed!\n  const_reference operator[](int _idx) const {\n    assert( size_t(_idx) < data_.size());\n    return ((value_type*) &data_[0])[_idx];\n  }\n\n  PropertyT<value_type>* clone() const {\n    PropertyT<value_type>* p = new PropertyT<value_type>( *this );\n    return p;\n  }\nprivate:\n\n  vector_type data_;\n\n};\n\n/// Base property handle.\ntemplate <class T>\nstruct BasePropHandleT : public BaseHandle\n{\n  typedef T                                       Value;\n  typedef std::vector<T>                          vector_type;\n  typedef T                                       value_type;\n  typedef typename vector_type::reference         reference;\n  typedef typename vector_type::const_reference   const_reference;\n\n  explicit BasePropHandleT(int _idx=-1) : BaseHandle(_idx) {}\n};\n\n\n/** \\ingroup mesh_property_handle_group\n *  Handle representing a vertex property\n */\ntemplate <class T>\nstruct VPropHandleT : public BasePropHandleT<T>\n{\n  typedef T                       Value;\n  typedef T                       value_type;\n\n  explicit VPropHandleT(int _idx=-1) : BasePropHandleT<T>(_idx) {}\n  explicit VPropHandleT(const BasePropHandleT<T>& _b) : BasePropHandleT<T>(_b) {}\n};\n\n\n/** \\ingroup mesh_property_handle_group\n *  Handle representing a halfedge property\n */\ntemplate <class T>\nstruct HPropHandleT : public BasePropHandleT<T>\n{\n  typedef T                       Value;\n  typedef T                       value_type;\n\n  explicit HPropHandleT(int _idx=-1) : BasePropHandleT<T>(_idx) {}\n  explicit HPropHandleT(const BasePropHandleT<T>& _b) : BasePropHandleT<T>(_b) {}\n};\n\n\n/** \\ingroup mesh_property_handle_group\n *  Handle representing an edge property\n */\ntemplate <class T>\nstruct EPropHandleT : public BasePropHandleT<T>\n{\n  typedef T                       Value;\n  typedef T                       value_type;\n\n  explicit EPropHandleT(int _idx=-1) : BasePropHandleT<T>(_idx) {}\n  explicit EPropHandleT(const BasePropHandleT<T>& _b) : BasePropHandleT<T>(_b) {}\n};\n\n\n/** \\ingroup mesh_property_handle_group\n *  Handle representing a face property\n */\ntemplate <class T>\nstruct FPropHandleT : public BasePropHandleT<T>\n{\n  typedef T                       Value;\n  typedef T                       value_type;\n\n  explicit FPropHandleT(int _idx=-1) : BasePropHandleT<T>(_idx) {}\n  explicit FPropHandleT(const BasePropHandleT<T>& _b) : BasePropHandleT<T>(_b) {}\n};\n\n\n/** \\ingroup mesh_property_handle_group\n *  Handle representing a mesh property\n */\ntemplate <class T>\nstruct MPropHandleT : public BasePropHandleT<T>\n{\n  typedef T                       Value;\n  typedef T                       value_type;\n\n  explicit MPropHandleT(int _idx=-1) : BasePropHandleT<T>(_idx) {}\n  explicit MPropHandleT(const BasePropHandleT<T>& _b) : BasePropHandleT<T>(_b) {}\n};\n\n} // namespace OpenMesh\n//=============================================================================\n#endif // OPENMESH_PROPERTY_HH defined\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Utils/PropertyContainer.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n#ifndef OPENMESH_PROPERTYCONTAINER\n#define OPENMESH_PROPERTYCONTAINER\n\n// Use static casts when not debugging\n#ifdef NDEBUG\n#define OM_FORCE_STATIC_CAST\n#endif\n\n#include <OpenMesh/Core/Utils/Property.hh>\n\n//-----------------------------------------------------------------------------\nnamespace OpenMesh\n{\n//== FORWARDDECLARATIONS ======================================================\n  class BaseKernel;\n\n//== CLASS DEFINITION =========================================================\n/// A a container for properties.\nclass PropertyContainer\n{\npublic:\n\n  //-------------------------------------------------- constructor / destructor\n\n  PropertyContainer() {}\n  virtual ~PropertyContainer() { std::for_each(properties_.begin(), properties_.end(), Delete()); }\n\n\n  //------------------------------------------------------------- info / access\n\n  typedef std::vector<BaseProperty*> Properties;\n  const Properties& properties() const { return properties_; }\n  size_t size() const { return properties_.size(); }\n\n\n\n  //--------------------------------------------------------- copy / assignment\n\n  PropertyContainer(const PropertyContainer& _rhs) { operator=(_rhs); }\n\n  PropertyContainer& operator=(const PropertyContainer& _rhs)\n  {\n    // The assignment below relies on all previous BaseProperty* elements having been deleted\n    std::for_each(properties_.begin(), properties_.end(), Delete());\n    properties_ = _rhs.properties_;\n    Properties::iterator p_it=properties_.begin(), p_end=properties_.end();\n    for (; p_it!=p_end; ++p_it)\n      if (*p_it)\n        *p_it = (*p_it)->clone();\n    return *this;\n  }\n\n\n\n  //--------------------------------------------------------- manage properties\n\n  template <class T>\n  BasePropHandleT<T> add(const T&, const std::string& _name=\"<unknown>\")\n  {\n    Properties::iterator p_it=properties_.begin(), p_end=properties_.end();\n    int idx=0;\n    for ( ; p_it!=p_end && *p_it!=NULL; ++p_it, ++idx ) {};\n    if (p_it==p_end) properties_.push_back(NULL);\n    properties_[idx] = new PropertyT<T>(_name);\n    return BasePropHandleT<T>(idx);\n  }\n\n\n  template <class T>\n  BasePropHandleT<T> handle(const T&, const std::string& _name) const\n  {\n    Properties::const_iterator p_it = properties_.begin();\n    for (int idx=0; p_it != properties_.end(); ++p_it, ++idx)\n    {\n      if (*p_it != NULL &&\n         (*p_it)->name() == _name  //skip deleted properties\n// Skip type check\n#ifndef OM_FORCE_STATIC_CAST\n          && dynamic_cast<PropertyT<T>*>(properties_[idx]) != NULL //check type\n#endif\n         )\n      {\n        return BasePropHandleT<T>(idx);\n      }\n    }\n    return BasePropHandleT<T>();\n  }\n\n  BaseProperty* property( const std::string& _name ) const\n  {\n    Properties::const_iterator p_it = properties_.begin();\n    for (int idx=0; p_it != properties_.end(); ++p_it, ++idx)\n    {\n      if (*p_it != NULL && (*p_it)->name() == _name) //skip deleted properties\n      {\n        return *p_it;\n      }\n    }\n    return NULL;\n  }\n\n  template <class T> PropertyT<T>& property(BasePropHandleT<T> _h)\n  {\n    assert(_h.idx() >= 0 && _h.idx() < (int)properties_.size());\n    assert(properties_[_h.idx()] != NULL);\n#ifdef OM_FORCE_STATIC_CAST\n    return *static_cast  <PropertyT<T>*> (properties_[_h.idx()]);\n#else\n    PropertyT<T>* p = dynamic_cast<PropertyT<T>*>(properties_[_h.idx()]);\n    assert(p != NULL);\n    return *p;\n#endif\n  }\n\n\n  template <class T> const PropertyT<T>& property(BasePropHandleT<T> _h) const\n  {\n    assert(_h.idx() >= 0 && _h.idx() < (int)properties_.size());\n    assert(properties_[_h.idx()] != NULL);\n#ifdef OM_FORCE_STATIC_CAST\n    return *static_cast<PropertyT<T>*>(properties_[_h.idx()]);\n#else\n    PropertyT<T>* p = dynamic_cast<PropertyT<T>*>(properties_[_h.idx()]);\n    assert(p != NULL);\n    return *p;\n#endif\n  }\n\n\n  template <class T> void remove(BasePropHandleT<T> _h)\n  {\n    assert(_h.idx() >= 0 && _h.idx() < (int)properties_.size());\n    delete properties_[_h.idx()];\n    properties_[_h.idx()] = NULL;\n  }\n\n\n  void clear()\n  {\n\t// Clear properties vector:\n\t// Replaced the old version with new one\n\t// which performs a swap to clear values and\n\t// deallocate memory.\n\n\t// Old version (changed 22.07.09) {\n\t// std::for_each(properties_.begin(), properties_.end(), Delete());\n    // }\n\n\tstd::for_each(properties_.begin(), properties_.end(), ClearAll());\n  }\n\n\n  //---------------------------------------------------- synchronize properties\n\n  void reserve(size_t _n) const {\n    std::for_each(properties_.begin(), properties_.end(), Reserve(_n));\n  }\n\n  void resize(size_t _n) const {\n    std::for_each(properties_.begin(), properties_.end(), Resize(_n));\n  }\n\n  void swap(size_t _i0, size_t _i1) const {\n    std::for_each(properties_.begin(), properties_.end(), Swap(_i0, _i1));\n  }\n\n\n\nprotected: // generic add/get\n\n  size_t _add( BaseProperty* _bp )\n  {\n    Properties::iterator p_it=properties_.begin(), p_end=properties_.end();\n    size_t idx=0;\n    for (; p_it!=p_end && *p_it!=NULL; ++p_it, ++idx) {};\n    if (p_it==p_end) properties_.push_back(NULL);\n    properties_[idx] = _bp;\n    return idx;\n  }\n\n  BaseProperty& _property( size_t _idx )\n  {\n    assert( _idx < properties_.size());\n    assert( properties_[_idx] != NULL);\n    BaseProperty *p = properties_[_idx];\n    assert( p != NULL );\n    return *p;\n  }\n\n  const BaseProperty& _property( size_t _idx ) const\n  {\n    assert( _idx < properties_.size());\n    assert( properties_[_idx] != NULL);\n    BaseProperty *p = properties_[_idx];\n    assert( p != NULL );\n    return *p;\n  }\n\n\n  typedef Properties::iterator       iterator;\n  typedef Properties::const_iterator const_iterator;\n  iterator begin() { return properties_.begin(); }\n  iterator end()   { return properties_.end(); }\n  const_iterator begin() const { return properties_.begin(); }\n  const_iterator end() const   { return properties_.end(); }\n\n  friend class BaseKernel;\n\nprivate:\n\n  //-------------------------------------------------- synchronization functors\n\n#ifndef DOXY_IGNORE_THIS\n  struct Reserve\n  {\n    Reserve(size_t _n) : n_(_n) {}\n    void operator()(BaseProperty* _p) const { if (_p) _p->reserve(n_); }\n    size_t n_;\n  };\n\n  struct Resize\n  {\n    Resize(size_t _n) : n_(_n) {}\n    void operator()(BaseProperty* _p) const { if (_p) _p->resize(n_); }\n    size_t n_;\n  };\n\n  struct ClearAll\n  {\n    ClearAll() {}\n    void operator()(BaseProperty* _p) const { if (_p) _p->clear(); }\n  };\n\n  struct Swap\n  {\n    Swap(size_t _i0, size_t _i1) : i0_(_i0), i1_(_i1) {}\n    void operator()(BaseProperty* _p) const { if (_p) _p->swap(i0_, i1_); }\n    size_t i0_, i1_;\n  };\n\n  struct Delete\n  {\n    Delete() {}\n    void operator()(BaseProperty* _p) const { if (_p) delete _p; _p=NULL; }\n  };\n#endif\n\n  Properties   properties_;\n};\n\n}//namespace OpenMesh\n\n#endif//OPENMESH_PROPERTYCONTAINER\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Utils/PropertyManager.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------*\n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         *\n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/\n\n/*===========================================================================*\\\n *                                                                           *\n *   $Revision$                                                              *\n *   $Date$                                                                  *\n *                                                                           *\n\\*===========================================================================*/\n\n#ifndef PROPERTYMANAGER_HH_\n#define PROPERTYMANAGER_HH_\n\n#include <sstream>\n#include <stdexcept>\n#include <string>\n\nnamespace OpenMesh {\n\n/**\n * This class is intended to manage the lifecycle of properties.\n * It also defines convenience operators to access the encapsulated\n * property's value.\n *\n * Usage example:\n *\n * \\code\n * TriMesh mesh;\n * PropertyManager<VPropHandleT<bool>, MeshT> visited(mesh, \"visited.plugin-example.i8.informatik.rwth-aachen.de\");\n *\n * for (TriMesh::VertexIter vh_it = mesh.begin(); ... ; ...) {\n *     if (!visited[*vh_it]) {\n *         visitComponent(mesh, *vh_it, visited);\n *     }\n * }\n * \\endcode\n *\n */\ntemplate<typename PROPTYPE, typename MeshT>\nclass PropertyManager {\n#if __cplusplus > 199711L or __GXX_EXPERIMENTAL_CXX0X__\n    public:\n        PropertyManager(const PropertyManager&) = delete;\n        PropertyManager& operator=(const PropertyManager&) = delete;\n#else\n    private:\n        /**\n         * Noncopyable because there aren't no straightforward copy semantics.\n         */\n        PropertyManager(const PropertyManager&);\n\n        /**\n         * Noncopyable because there aren't no straightforward copy semantics.\n         */\n        PropertyManager& operator=(const PropertyManager&);\n#endif\n\n    public:\n        /**\n         * Constructor.\n         *\n         * Throws an \\p std::runtime_error if \\p existing is true and\n         * no property named \\p propname of the appropriate property type\n         * exists.\n         *\n         * @param mesh The mesh on which to create the property.\n         * @param propname The name of the property.\n         * @param existing If false, a new property is created and its lifecycle is managed (i.e.\n         * the property is deleted upon destruction of the PropertyManager instance). If true,\n         * the instance merely acts as a convenience wrapper around an existing property with no\n         * lifecycle management whatsoever.\n         */\n        PropertyManager(MeshT &mesh, const char *propname, bool existing = false) : mesh_(&mesh), retain_(existing), name_(propname) {\n            if (existing) {\n                if (!mesh_->get_property_handle(prop_, propname)) {\n                    std::ostringstream oss;\n                    oss << \"Requested property handle \\\"\" << propname << \"\\\" does not exist.\";\n                    throw std::runtime_error(oss.str());\n                }\n            } else {\n                mesh_->add_property(prop_, propname);\n            }\n        }\n\n        PropertyManager() : mesh_(0), retain_(false) {\n        }\n\n        ~PropertyManager() {\n            deleteProperty();\n        }\n\n        void swap(PropertyManager &rhs) {\n            std::swap(mesh_, rhs.mesh_);\n            std::swap(prop_, rhs.prop_);\n            std::swap(retain_, rhs.retain_);\n            std::swap(name_, rhs.name_);\n        }\n\n        static bool propertyExists(MeshT &mesh, const char *propname) {\n            PROPTYPE dummy;\n            return mesh.get_property_handle(dummy, propname);\n        }\n\n        bool isValid() const { return mesh_ != 0; }\n        operator bool() const { return isValid(); }\n\n        const PROPTYPE &getRawProperty() const { return prop_; }\n\n        const std::string &getName() const { return name_; }\n\n        MeshT &getMesh() const { return *mesh_; }\n\n#if __cplusplus > 199711L or __GXX_EXPERIMENTAL_CXX0X__\n        /**\n         * Move constructor. Transfers ownership (delete responsibility).\n         */\n        PropertyManager(PropertyManager &&rhs) : mesh_(rhs.mesh_), prop_(rhs.prop_), retain_(rhs.retain_), name_(rhs.name_) {\n            rhs.retain_ = true;\n        }\n\n        /**\n         * Move assignment. Transfers ownership (delete responsibility).\n         */\n        PropertyManager &operator=(PropertyManager &&rhs) {\n\n            deleteProperty();\n\n            mesh_ = rhs.mesh_;\n            prop_ = rhs.prop_;\n            retain_ = rhs.retain_;\n            name_ = rhs.name_;\n            rhs.retain_ = true;\n\n            return *this;\n        }\n\n        /**\n         * Create a property manager for the supplied property and mesh.\n         * If the property doesn't exist, it is created. In any case,\n         * lifecycle management is disabled.\n         */\n        static PropertyManager createIfNotExists(MeshT &mesh, const char *propname) {\n            PROPTYPE dummy_prop;\n            PropertyManager pm(mesh, propname, mesh.get_property_handle(dummy_prop, propname));\n            pm.retain();\n            return std::move(pm);\n        }\n\n\n        PropertyManager duplicate(const char *clone_name) {\n            PropertyManager pm(*mesh_, clone_name, false);\n            pm.mesh_->property(pm.prop_) = mesh_->property(prop_);\n            return std::move(pm);\n        }\n\n#else\n        class Proxy {\n            private:\n                Proxy(MeshT *mesh_, PROPTYPE prop_, bool retain_, const std::string &name_) :\n                    mesh_(mesh_), prop_(prop_), retain_(retain_), name_(name_) {}\n                MeshT *mesh_;\n                PROPTYPE prop_;\n                bool retain_;\n                std::string name_;\n\n                friend class PropertyManager;\n        };\n\n        operator Proxy() {\n            Proxy p(mesh_, prop_, retain_, name_);\n            mesh_ = 0;\n            retain_ = true;\n            return p;\n        }\n\n        PropertyManager(Proxy p) : mesh_(p.mesh_), prop_(p.prop_), retain_(p.retain_), name_(p.name_) {}\n\n        PropertyManager &operator=(Proxy p) {\n            PropertyManager(p).swap(*this);\n            return *this;\n        }\n\n        /**\n         * Create a property manager for the supplied property and mesh.\n         * If the property doesn't exist, it is created. In any case,\n         * lifecycle management is disabled.\n         */\n        static Proxy createIfNotExists(MeshT &mesh, const char *propname) {\n            PROPTYPE dummy_prop;\n            PropertyManager pm(mesh, propname, mesh.get_property_handle(dummy_prop, propname));\n            pm.retain();\n            return (Proxy)pm;\n        }\n\n        Proxy duplicate(const char *clone_name) {\n            PropertyManager pm(*mesh_, clone_name, false);\n            pm.mesh_->property(pm.prop_) = mesh_->property(prop_);\n            return (Proxy)pm;\n        }\n#endif\n\n        /**\n         * \\brief Disable lifecycle management for this property.\n         *\n         * If this method is called, the encapsulated property will not be deleted\n         * upon destruction of the PropertyManager instance.\n         */\n        inline void retain(bool doRetain = true) {\n            retain_ = doRetain;\n        }\n\n        /**\n         * Access the encapsulated property.\n         */\n        inline PROPTYPE &operator* () {\n            return prop_;\n        }\n\n        /**\n         * Access the encapsulated property.\n         */\n        inline const PROPTYPE &operator* () const {\n            return prop_;\n        }\n\n        /**\n         * Enables convenient access to the encapsulated property.\n         *\n         * For a usage example see this class' documentation.\n         *\n         * @param handle A handle of the appropriate handle type. (I.e. \\p VertexHandle for \\p VPropHandleT, etc.)\n         */\n        template<typename HandleType>\n        inline typename PROPTYPE::reference operator[] (const HandleType &handle) {\n            return mesh_->property(prop_, handle);\n        }\n\n        /**\n         * Enables convenient access to the encapsulated property.\n         *\n         * For a usage example see this class' documentation.\n         *\n         * @param handle A handle of the appropriate handle type. (I.e. \\p VertexHandle for \\p VPropHandleT, etc.)\n         */\n        template<typename HandleType>\n        inline typename PROPTYPE::const_reference operator[] (const HandleType &handle) const {\n            return mesh_->property(prop_, handle);\n        }\n\n        /**\n         * Conveniently set the property for an entire range of values.\n         *\n         * Examples:\n         * \\code\n         * MeshT mesh;\n         * PropertyManager<VPropHandleT<double>, MeshT> distance(\n         *     mesh, \"distance.plugin-example.i8.informatik.rwth-aachen.de\");\n         * distance.set_range(\n         *     mesh.vertices_begin(), mesh.vertices_end(),\n         *     std::numeric_limits<double>::infinity());\n         * \\endcode\n         * or\n         * \\code\n         * MeshT::VertexHandle vh;\n         * distance.set_range(\n         *     mesh.vv_begin(vh), mesh.vv_end(vh),\n         *     std::numeric_limits<double>::infinity());\n         * \\endcode\n         *\n         * @param begin Start iterator. Needs to dereference to HandleType.\n         * @param end End iterator. (Exclusive.)\n         * @param value The value the range will be set to.\n         */\n        template<typename HandleTypeIterator>\n        void set_range(HandleTypeIterator begin, HandleTypeIterator end,\n                typename PROPTYPE::const_reference value) {\n            for (; begin != end; ++begin)\n                (*this)[*begin] = value;\n        }\n\n    private:\n        void deleteProperty() {\n            if (!retain_)\n                mesh_->remove_property(prop_);\n        }\n\n    private:\n        MeshT *mesh_;\n        PROPTYPE prop_;\n        bool retain_;\n        std::string name_;\n};\n\n} /* namespace OpenMesh */\n#endif /* PROPERTYMANAGER_HH_ */\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Utils/RandomNumberGenerator.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------*\n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         *\n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/\n\n/*===========================================================================*\\\n *                                                                           *\n *   $Revision: 362 $                                                         *\n *   $Date: 2011-01-26 10:21:12 +0100 (Mi, 26 Jan 2011) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  Helper Functions for generating a random number between 0.0 and 1.0 with\n//  a garantueed resolution\n//\n//=============================================================================\n\n\n//== INCLUDES =================================================================\n\n\n#include <OpenMesh/Core/Utils/RandomNumberGenerator.hh>\n#include <cstdlib>\n\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\n\n\n//== IMPLEMENTATION ===========================================================\n\nRandomNumberGenerator::RandomNumberGenerator(const size_t _resolution) :\n  resolution_(_resolution),\n  iterations_(1),\n  maxNum_(RAND_MAX + 1.0)\n{\n  double tmp = double(resolution_);\n  while (tmp > (double(RAND_MAX) + 1.0) ) {\n    iterations_++;\n    tmp /= (double(RAND_MAX) + 1.0);\n  }\n\n  for ( unsigned int i = 0 ; i < iterations_ - 1; ++i ) {\n    maxNum_ *= (RAND_MAX + 1.0);\n  }\n}\n\n//-----------------------------------------------------------------------------\n\ndouble RandomNumberGenerator::getRand() const {\n  double randNum = 0.0;\n  for ( unsigned int i = 0 ; i < iterations_; ++i ) {\n    randNum *= (RAND_MAX + 1.0);\n    randNum += rand();\n  }\n\n  return randNum / maxNum_;\n}\n\ndouble RandomNumberGenerator::resolution() const {\n  return maxNum_;\n}\n\n//=============================================================================\n} // namespace OpenMesh\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Utils/RandomNumberGenerator.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------*\n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         *\n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/\n\n/*===========================================================================*\\\n *                                                                           *\n *   $Revision: 693 $                                                         *\n *   $Date: 2012-09-23 16:25:16 +0200 (So, 23 Sep 2012) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  Helper Functions for generating a random number between 0.0 and 1.0 with\n//  a garantueed resolution\n//\n//=============================================================================\n\n\n#ifndef OPENMESH_UTILS_RANDOMNUMBERGENERATOR_HH\n#define OPENMESH_UTILS_RANDOMNUMBERGENERATOR_HH\n\n\n//== INCLUDES =================================================================\n\n\n#include <OpenMesh/Core/System/config.h>\n#include <cstdlib>\n\n\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\n\n\n//=============================================================================\n\n\n/**  Generate a random number between 0.0 and 1.0 with a guaranteed resolution\n *   ( Number of possible values )\n *\n * Especially useful on windows, as there MAX_RAND is often only 32k which is\n * not enough resolution for a lot of applications\n */\nclass OPENMESHDLLEXPORT RandomNumberGenerator\n{\npublic:\n\n  /** \\brief Constructor\n  *\n  * @param _resolution specifies the desired resolution for the random number generated\n  */\n  RandomNumberGenerator(const size_t _resolution);\n\n  /// returns a random double between 0.0 and 1.0 with a guaranteed resolution\n  double getRand() const;\n\n  double resolution() const;\n\nprivate:\n\n  /// desired resolution\n  const size_t resolution_;\n\n  /// number of \"blocks\" of RAND_MAX that make up the desired _resolution\n  size_t iterations_;\n\n  /// maximum random number generated, which is used for normalization\n  double maxNum_;\n};\n\n//=============================================================================\n} // namespace OpenMesh\n//=============================================================================\n#endif // OPENMESH_UTILS_RANDOMNUMBERGENERATOR_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Utils/SingletonT.cc",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  Implements a simple singleton template\n//\n//=============================================================================\n\n\n#define OPENMESH_SINGLETON_C\n\n\n//== INCLUDES =================================================================\n\n\n// header\n#include <OpenMesh/Core/Utils/SingletonT.hh>\n\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\n\n\n//== SINGLETON'S DATA =========================================================\n\n\ntemplate <class T> \nT* SingletonT<T>::pInstance__ = 0;\n\ntemplate <class T>\nbool SingletonT<T>::destroyed__ = false;\n\n\n//=============================================================================\n} // namespace OpenMesh\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Utils/SingletonT.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  Implements a simple singleton template\n//\n//=============================================================================\n\n\n#ifndef __SINGLETON_HH__\n#define __SINGLETON_HH__\n\n\n//=== INCLUDES ================================================================\n\n// OpenMesh\n#include <OpenMesh/Core/System/config.h>\n\n// STL\n#include <stdexcept>\n#include <iostream>\n\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\n\n\n//=== IMPLEMENTATION ==========================================================\n\n\n/** A simple singleton template.\n    Encapsulates an arbitrary class and enforces its uniqueness.\n*/\n\ntemplate <typename T>\nclass SingletonT\n{\npublic:\n\n  /** Singleton access function.\n      Use this function to obtain a reference to the instance of the \n      encapsulated class. Note that this instance is unique and created\n      on the first call to Instance().\n  */\n\n  static T& Instance()\n  {\n    if (!pInstance__)\n    {\n      // check if singleton alive\n      if (destroyed__)\n      {\n\tOnDeadReference();\n      }\n      // first time request -> initialize\n      else\n      {\n\tCreate();\n      }\n    }\n    return *pInstance__;\n  }\n\n\nprivate:\n\n  // Disable constructors/assignment to enforce uniqueness\n  SingletonT();\n  SingletonT(const SingletonT&);\n  SingletonT& operator=(const SingletonT&);\n\n  // Create a new singleton and store its pointer\n  static void Create()\n  {\n    static T theInstance;\n    pInstance__ = &theInstance;\n  }\n  \n  // Will be called if instance is accessed after its lifetime has expired\n  static void OnDeadReference()\n  {\n    throw std::runtime_error(\"[Singelton error] - Dead reference detected!\\n\");\n  }\n\n  virtual ~SingletonT()\n  {\n    pInstance__ = 0;\n    destroyed__ = true;\n  }\n  \n  static T*     pInstance__;\n  static bool   destroyed__;\n};\n\n\n\n//=============================================================================\n} // namespace OpenMesh\n//=============================================================================\n#if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_SINGLETON_C)\n#  define OPENMESH_SINGLETON_TEMPLATES\n#  include \"SingletonT.cc\"\n#endif\n//=============================================================================\n#endif // __SINGLETON_HH__\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Utils/color_cast.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------*\n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         *\n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/\n\n/*===========================================================================*\\\n *                                                                           *\n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  Helper Functions for binary reading / writing\n//\n//=============================================================================\n\n\n#ifndef OPENMESH_COLOR_CAST_HH\n#define OPENMESH_COLOR_CAST_HH\n\n\n//== INCLUDES =================================================================\n\n\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/Utils/vector_cast.hh>\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\n\n\n//=============================================================================\n\n\n/** \\name Cast vector type to another vector type.\n*/\n//@{\n\n//-----------------------------------------------------------------------------\n#ifndef DOXY_IGNORE_THIS\n\n/// Cast one color vector to another.\ntemplate <typename dst_t, typename src_t>\nstruct color_caster\n{\n  typedef dst_t  return_type;\n\n  inline static return_type cast(const src_t& _src)\n  {\n    dst_t dst;\n    vector_copy(_src, dst, GenProg::Int2Type<vector_traits<dst_t>::size_>());\n    return dst;\n  }\n};\n\n\ntemplate <>\nstruct color_caster<Vec3uc,Vec3f>\n{\n  typedef Vec3uc return_type;\n\n  inline static return_type cast(const Vec3f& _src)\n  {\n    return Vec3uc( (unsigned char)(_src[0]* 255.0f + 0.5f),\n\t\t               (unsigned char)(_src[1]* 255.0f + 0.5f),\n\t\t               (unsigned char)(_src[2]* 255.0f + 0.5f) );\n  }\n};\n\ntemplate <>\nstruct color_caster<Vec3uc,Vec4f>\n{\n  typedef Vec3uc return_type;\n\n  inline static return_type cast(const Vec4f& _src)\n  {\n    return Vec3uc( (unsigned char)(_src[0]* 255.0f + 0.5f),\n                   (unsigned char)(_src[1]* 255.0f + 0.5f),\n                   (unsigned char)(_src[2]* 255.0f + 0.5f) );\n  }\n};\n\ntemplate <>\nstruct color_caster<Vec3i,Vec3f>\n{\n  typedef Vec3i return_type;\n\n  inline static return_type cast(const Vec3f& _src)\n  {\n    return Vec3i( (int)(_src[0]* 255.0f + 0.5f),\n                  (int)(_src[1]* 255.0f + 0.5f),\n                  (int)(_src[2]* 255.0f + 0.5f) );\n  }\n};\n\ntemplate <>\nstruct color_caster<Vec3i,Vec4f>\n{\n  typedef Vec3i return_type;\n\n  inline static return_type cast(const Vec4f& _src)\n  {\n    return Vec3i( (int)(_src[0]* 255.0f + 0.5f),\n                  (int)(_src[1]* 255.0f + 0.5f),\n                  (int)(_src[2]* 255.0f + 0.5f) );\n  }\n};\n\ntemplate <>\nstruct color_caster<Vec4i,Vec4f>\n{\n  typedef Vec4i return_type;\n\n  inline static return_type cast(const Vec4f& _src)\n  {\n    return Vec4i( (int)(_src[0]* 255.0f + 0.5f),\n                  (int)(_src[1]* 255.0f + 0.5f),\n                  (int)(_src[2]* 255.0f + 0.5f),\n                  (int)(_src[3]* 255.0f + 0.5f) );\n  }\n};\n\ntemplate <>\nstruct color_caster<Vec3ui,Vec3f>\n{\n  typedef Vec3ui return_type;\n\n  inline static return_type cast(const Vec3f& _src)\n  {\n    return Vec3ui( (unsigned int)(_src[0]* 255.0f + 0.5f),\n                   (unsigned int)(_src[1]* 255.0f + 0.5f),\n                   (unsigned int)(_src[2]* 255.0f + 0.5f) );\n  }\n};\n\ntemplate <>\nstruct color_caster<Vec3ui,Vec4f>\n{\n  typedef Vec3ui return_type;\n\n  inline static return_type cast(const Vec4f& _src)\n  {\n    return Vec3ui( (unsigned int)(_src[0]* 255.0f + 0.5f),\n                   (unsigned int)(_src[1]* 255.0f + 0.5f),\n                   (unsigned int)(_src[2]* 255.0f + 0.5f) );\n  }\n};\n\ntemplate <>\nstruct color_caster<Vec4ui,Vec4f>\n{\n  typedef Vec4ui return_type;\n\n  inline static return_type cast(const Vec4f& _src)\n  {\n    return Vec4ui( (unsigned int)(_src[0]* 255.0f + 0.5f),\n                   (unsigned int)(_src[1]* 255.0f + 0.5f),\n                   (unsigned int)(_src[2]* 255.0f + 0.5f),\n                   (unsigned int)(_src[3]* 255.0f + 0.5f) );\n  }\n};\n\ntemplate <>\nstruct color_caster<Vec4uc,Vec3f>\n{\n  typedef Vec4uc return_type;\n\n  inline static return_type cast(const Vec3f& _src)\n  {\n    return Vec4uc( (unsigned char)(_src[0]* 255.0f + 0.5f),\n                   (unsigned char)(_src[1]* 255.0f + 0.5f),\n                   (unsigned char)(_src[2]* 255.0f + 0.5f),\n                   (unsigned char)(255) );\n  }\n};\n\ntemplate <>\nstruct color_caster<Vec4f,Vec3f>\n{\n  typedef Vec4f return_type;\n\n  inline static return_type cast(const Vec3f& _src)\n  {\n    return Vec4f( _src[0],\n                  _src[1],\n                  _src[2],\n                  1.0f );\n  }\n};\n\ntemplate <>\nstruct color_caster<Vec4uc,Vec4f>\n{\n  typedef Vec4uc return_type;\n\n  inline static return_type cast(const Vec4f& _src)\n  {\n    return Vec4uc( (unsigned char)(_src[0]* 255.0f + 0.5f),\n                   (unsigned char)(_src[1]* 255.0f + 0.5f),\n                   (unsigned char)(_src[2]* 255.0f + 0.5f),\n                   (unsigned char)(_src[3]* 255.0f + 0.5f) );\n  }\n};\n\ntemplate <>\nstruct color_caster<Vec4f,Vec4i>\n{\n  typedef Vec4f return_type;\n\n  inline static return_type cast(const Vec4i& _src)\n  {\n    const float f = 1.0f / 255.0f;\n    return Vec4f( _src[0] * f, _src[1] *  f, _src[2] * f , _src[3] * f  );\n  }\n};\n\ntemplate <>\nstruct color_caster<Vec4uc,Vec3uc>\n{\n  typedef Vec4uc return_type;\n\n  inline static return_type cast(const Vec3uc& _src)\n  {\n    return Vec4uc( _src[0], _src[1], _src[2], 255 );\n  }\n};\n\ntemplate <>\nstruct color_caster<Vec3f, Vec3uc>\n{\n  typedef Vec3f return_type;\n\n  inline static return_type cast(const Vec3uc& _src)\n  {\n    const float f = 1.0f / 255.0f;\n    return Vec3f(_src[0] * f, _src[1] *  f, _src[2] * f );\n  }\n};\n\ntemplate <>\nstruct color_caster<Vec3f, Vec4uc>\n{\n  typedef Vec3f return_type;\n\n  inline static return_type cast(const Vec4uc& _src)\n  {\n    const float f = 1.0f / 255.0f;\n    return Vec3f(_src[0] * f, _src[1] *  f, _src[2] * f );\n  }\n};\n\ntemplate <>\nstruct color_caster<Vec4f, Vec3uc>\n{\n  typedef Vec4f return_type;\n\n  inline static return_type cast(const Vec3uc& _src)\n  {\n    const float f = 1.0f / 255.0f;\n    return Vec4f(_src[0] * f, _src[1] *  f, _src[2] * f, 1.0f );\n  }\n};\n\ntemplate <>\nstruct color_caster<Vec4f, Vec4uc>\n{\n  typedef Vec4f return_type;\n\n  inline static return_type cast(const Vec4uc& _src)\n  {\n    const float f = 1.0f / 255.0f;\n    return Vec4f(_src[0] * f, _src[1] *  f, _src[2] * f, _src[3] * f );\n  }\n};\n\n// ----------------------------------------------------------------------------\n\n\n#ifndef DOXY_IGNORE_THIS\n\n#if !defined(OM_CC_MSVC)\ntemplate <typename dst_t>\nstruct color_caster<dst_t,dst_t>\n{\n  typedef const dst_t&  return_type;\n\n  inline static return_type cast(const dst_t& _src)\n  {\n    return _src;\n  }\n};\n#endif\n\n#endif\n\n//-----------------------------------------------------------------------------\n\n\ntemplate <typename dst_t, typename src_t>\ninline\ntypename color_caster<dst_t, src_t>::return_type\ncolor_cast(const src_t& _src )\n{\n  return color_caster<dst_t, src_t>::cast(_src);\n}\n\n#endif\n//-----------------------------------------------------------------------------\n\n//@}\n\n\n//=============================================================================\n} // namespace OpenMesh\n//=============================================================================\n#endif // OPENMESH_COLOR_CAST_HH defined\n//=============================================================================\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Utils/vector_cast.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  Helper Functions for binary reading / writing\n//\n//=============================================================================\n\n\n#ifndef OPENMESH_VECTORCAST_HH\n#define OPENMESH_VECTORCAST_HH\n\n\n//== INCLUDES =================================================================\n\n\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/Utils/vector_traits.hh>\n#include <OpenMesh/Core/Utils/GenProg.hh>\n#include <iostream>\n#include <algorithm>\n#include <OpenMesh/Core/Geometry/VectorT.hh>\n\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\n\n\n//=============================================================================\n\n\n/** \\name Cast vector type to another vector type.\n*/\n//@{\n\n//-----------------------------------------------------------------------------\n\n\ntemplate <typename src_t, typename dst_t>\ninline void vector_copy( const src_t &_src, dst_t &_dst, GenProg::Int2Type<1> )\n{\n  _dst[0] = _src[0];\n}\n\ntemplate <typename src_t, typename dst_t>\ninline void vector_copy( const src_t &_src, dst_t &_dst, GenProg::Int2Type<2> )\n{\n  _dst[0] = _src[0];\n  _dst[1] = _src[1];\n}\n\ntemplate <typename src_t, typename dst_t>\ninline void vector_copy( const src_t &_src, dst_t &_dst, GenProg::Int2Type<3> )\n{\n  _dst[0] = _src[0];\n  _dst[1] = _src[1];\n  _dst[2] = _src[2];\n}\n\ntemplate <typename src_t, typename dst_t>\ninline void vector_copy( const src_t &_src, dst_t &_dst, GenProg::Int2Type<4> )\n{\n  _dst[0] = _src[0];\n  _dst[1] = _src[1];\n  _dst[2] = _src[2];\n  _dst[3] = _src[3];\n}\n\ntemplate <typename src_t, typename dst_t>\ninline void vector_copy( const src_t &_src, dst_t &_dst, GenProg::Int2Type<5> )\n{\n  _dst[0] = _src[0];\n  _dst[1] = _src[1];\n  _dst[2] = _src[2];\n  _dst[3] = _src[3];\n  _dst[4] = _src[4];\n}\n\ntemplate <typename src_t, typename dst_t>\ninline void vector_copy( const src_t &_src, dst_t &_dst, GenProg::Int2Type<6> )\n{\n  _dst[0] = _src[0];\n  _dst[1] = _src[1];\n  _dst[2] = _src[2];\n  _dst[3] = _src[3];\n  _dst[4] = _src[4];\n  _dst[5] = _src[5];\n}\n\n\n//-----------------------------------------------------------------------------\n#ifndef DOXY_IGNORE_THIS\n\ntemplate <typename dst_t, typename src_t>\nstruct vector_caster\n{\n  typedef dst_t  return_type;\n\n  inline static return_type cast(const src_t& _src)\n  {\n    dst_t dst;\n    vector_copy(_src, dst, GenProg::Int2Type<vector_traits<dst_t>::size_>());\n    return dst;\n  }\n};\n\n#if !defined(OM_CC_MSVC)\ntemplate <typename dst_t>\nstruct vector_caster<dst_t,dst_t>\n{\n  typedef const dst_t&  return_type;\n\n  inline static return_type cast(const dst_t& _src)\n  {\n    return _src;\n  }\n};\n#endif\n\n#endif\n//-----------------------------------------------------------------------------\n\n\n/// Cast vector type to another vector type by copying the vector elements\ntemplate <typename dst_t, typename src_t>\ninline\ntypename vector_caster<dst_t, src_t>::return_type\nvector_cast(const src_t& _src )\n{\n  return vector_caster<dst_t, src_t>::cast(_src);\n}\n\n\n//@}\n\n\n//=============================================================================\n} // namespace OpenMesh\n//=============================================================================\n#endif // OPENMESH_MESHREADER_HH defined\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/OpenMesh/Core/Utils/vector_traits.hh",
    "content": "/*===========================================================================*\\\n *                                                                           *\n *                               OpenMesh                                    *\n *      Copyright (C) 2001-2014 by Computer Graphics Group, RWTH Aachen      *\n *                           www.openmesh.org                                *\n *                                                                           *\n *---------------------------------------------------------------------------* \n *  This file is part of OpenMesh.                                           *\n *                                                                           *\n *  OpenMesh is free software: you can redistribute it and/or modify         * \n *  it under the terms of the GNU Lesser General Public License as           *\n *  published by the Free Software Foundation, either version 3 of           *\n *  the License, or (at your option) any later version with the              *\n *  following exceptions:                                                    *\n *                                                                           *\n *  If other files instantiate templates or use macros                       *\n *  or inline functions from this file, or you compile this file and         *\n *  link it with other files to produce an executable, this file does        *\n *  not by itself cause the resulting executable to be covered by the        *\n *  GNU Lesser General Public License. This exception does not however       *\n *  invalidate any other reasons why the executable file might be            *\n *  covered by the GNU Lesser General Public License.                        *\n *                                                                           *\n *  OpenMesh 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 Lesser General Public License for more details.                      *\n *                                                                           *\n *  You should have received a copy of the GNU LesserGeneral Public          *\n *  License along with OpenMesh.  If not,                                    *\n *  see <http://www.gnu.org/licenses/>.                                      *\n *                                                                           *\n\\*===========================================================================*/ \n\n/*===========================================================================*\\\n *                                                                           *             \n *   $Revision: 990 $                                                         *\n *   $Date: 2014-02-05 10:01:07 +0100 (水, 05 2 2014) $                   *\n *                                                                           *\n\\*===========================================================================*/\n\n\n//=============================================================================\n//\n//  Helper Functions for binary reading / writing\n//\n//=============================================================================\n\n\n#ifndef OPENMESH_VECTOR_TRAITS_HH\n#define OPENMESH_VECTOR_TRAITS_HH\n\n\n//== INCLUDES =================================================================\n\n#include <OpenMesh/Core/System/config.h>\n#include <OpenMesh/Core/Utils/GenProg.hh>\n#if defined(OM_CC_MIPS)\n#  include <stdlib.h>\n#else\n#  include <cstdlib>\n#endif\n\n//== NAMESPACES ===============================================================\n\n\nnamespace OpenMesh {\n\n\n//=============================================================================\n\n\n/** \\name Provide a standardized access to relevant information about a\n     vector type.\n*/\n//@{\n\n//-----------------------------------------------------------------------------\n\n/** Helper class providing information about a vector type.\n *\n * If want to use a different vector type than the one provided %OpenMesh\n * you need to supply a specialization of this class for the new vector type.\n */\ntemplate <typename T>\nstruct vector_traits\n{\n  /// Type of the vector class\n  typedef typename T::vector_type vector_type;\n\n  /// Type of the scalar value\n  typedef typename T::value_type  value_type;\n\n  /// size/dimension of the vector\n  static const size_t size_ = T::size_;\n\n  /// size/dimension of the vector\n  static size_t size() { return size_; }\n};\n\n//@}\n\n\n//=============================================================================\n} // namespace OpenMesh\n//=============================================================================\n#endif // OPENMESH_MESHREADER_HH defined\n//=============================================================================\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/Patch.cpp",
    "content": "#include \"Patch.h\"\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/Patch.h",
    "content": "#pragma once\r\n#include <OpenMesh/Core/Mesh/PolyMesh_ArrayKernelT.hh>\r\n#include <patchgen/PatchVertexTraits.h>\r\n#include <kt84/openmesh/base/LaplaceDirect.h>\r\n\r\nnamespace patterns {\r\n\r\n\r\nstruct PatchTraits : public OpenMesh::DefaultTraits {\r\n        typedef OpenMesh::Vec3d Point;\r\n        typedef OpenMesh::Vec3d Normal;\r\n\r\n        VertexTraits\r\n            , public patchgen::PatchVertexTraits\r\n            , public kt84::LaplaceDirect_VertexTraits<3>\r\n        {};\r\n\r\n        HalfedgeTraits\r\n            , public kt84::LaplaceDirect_HalfedgeTraits\r\n        {};\r\n};\r\n\r\ntypedef OpenMesh::PolyMesh_ArrayKernelT<PatchTraits> PatchBase;\r\n\r\nstruct Patch\r\n    : public PatchBase\r\n    , public kt84::LaplaceDirect<PatchBase, Patch, 3>\r\n{\r\n    /*\r\nconventions for corner_index and boundary edge subdivision count l[i]\r\n\r\n2-sided:\r\n       l1\r\n      ____\r\n   __/    \\__\r\n  /          \\\r\n(0)          (1)\r\n  \\__      __/\r\n     \\____/\r\n       l0\r\n\r\n3-sided:\r\n    (2)\r\n    / \\\r\nl1 /   \\  l2\r\n  /     \\\r\n(0)-----(1)\r\n    l0\r\n\r\n4-sided:\r\n      l2\r\n (3)------(2)\r\n  |        |\r\nl3|        |l1\r\n  |        |\r\n (0)------(1)\r\n      l0\r\n\r\n5-sided\r\n     __(3)__\r\nl3 _/       \\_ l2\r\n  /           \\\r\n(4)           (2)\r\n  \\           /\r\nl4 \\         / l1\r\n   (0)-----(1)\r\n        l0\r\n\r\n6-sided\r\n         l3\r\n    (4)-----(3)\r\n    /         \\\r\nl4 /           \\ l2\r\n  /             \\\r\n(5)             (2)\r\n  \\             /\r\n   \\           / l1\r\nl5  \\         /\r\n    (0)-----(1)\r\n        l0\r\n    */\r\n};\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/determine_geometry.cpp",
    "content": "#include \"determine_geometry.h\"\r\n#include <patchgen/decl.h>\r\n\r\nusing namespace Eigen;\r\n\r\nvoid patterns::determine_geometry(Patch& patch, const VectorXi& l) {\r\n    // fix boundary vertices\r\n    Patch::HHandle h;\r\n    for (auto v : patch.vertices()) {\r\n        if (patch.data(v).patchgen.corner_index == 0) {\r\n            h = patch.halfedge_handle(v);\r\n            break;\r\n        }\r\n    }\r\n    int num_sides = l.size();\r\n    for (int i = 0; i < num_sides; ++i) {\r\n        for (int j = 0; j < l[i]; ++j) {\r\n            auto& vdata = patch.data(patch.from_vertex_handle(h)).laplaceDirect;\r\n            double t = i + j / static_cast<double>(l[i]);\r\n            vdata.value << patchgen::get_boundary_geometry(num_sides, t), 0;\r\n            vdata.is_fixed = true;\r\n            h = patch.prev_halfedge_handle(h);\r\n        }\r\n    }\r\n\r\n    // solve\r\n    patch.laplaceDirect_factorize();\r\n    patch.laplaceDirect_solve();\r\n\r\n    for (auto v : patch.vertices()) {\r\n        auto p = patch.data(v).laplaceDirect.value;\r\n        patch.set_point(v, patterns::Patch::Point(p.x(), p.y(), p.z()));\r\n    }\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/determine_geometry.h",
    "content": "#pragma once\r\n#include \"Patch.h\"\r\n\r\nnamespace patterns {\r\n    void determine_geometry(Patch& patch, const Eigen::VectorXi& l);\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/generate_patch.cpp",
    "content": "#include \"generate_patch.h\"\r\n\r\n#include <patchgen/generate_topology.h>\r\n#include <determine_geometry.h>\r\n\r\nusing namespace Eigen;\r\n\r\nvoid patterns::generatePatch(const Eigen::VectorXi& l, patchgen::PatchParam& param, Patch& patch) {\r\n    patchgen::generate_topology(l, param, patch);\r\n    patterns::determine_geometry(patch, l);\r\n}\r\n\r\nvoid patterns::generatePatch(const patchgen::PatchParam& param, Patch& patch) {\r\n    patchgen::generate_topology(param, patch);\r\n    patterns::determine_geometry(patch, param.l);\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/generate_patch.h",
    "content": "#pragma once\r\n#include <patchgen/PatchParam.h>\r\n#include \"Patch.h\"\r\n\r\nnamespace patterns {\r\n    void generatePatch(const Eigen::VectorXi& l, patchgen::PatchParam& param, Patch& patch);\r\n    void generatePatch(const patchgen::PatchParam& param, Patch& patch);\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/AutoDeleter.h",
    "content": "#pragma once\r\n\r\nnamespace kt84 {\r\n\r\ntemplate <typename T, typename DeleteFunc>\r\nclass AutoDeleter {\r\npublic:\r\n    AutoDeleter(T* ptr, DeleteFunc delete_func) : ptr(ptr), delete_func(delete_func) {}\r\n    AutoDeleter(const AutoDeleter& src) : ptr(src.ptr), delete_func(src.delete_func) {\r\n        src.ptr = nullptr;\r\n    }\r\n    AutoDeleter& operator=(const AutoDeleter& src) {\r\n        ptr         = src.ptr;\r\n        delete_func = src.delete_func;\r\n        src.ptr = nullptr;\r\n        return *this;\r\n    }\r\n    ~AutoDeleter() {\r\n        if (ptr != nullptr)\r\n            delete_func(ptr);\r\n    }\r\nprotected:\r\n    T* ptr;\r\n    DeleteFunc delete_func;\r\n};\r\ntemplate <typename T, typename DeleteFunc>\r\ninline AutoDeleter<T, DeleteFunc> make_AutoDeleter(T* ptr, DeleteFunc delete_func) {\r\n    return AutoDeleter<T, DeleteFunc>(ptr, delete_func);\r\n}\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/BaryCoordT.h",
    "content": "#pragma once\r\n\r\nnamespace kt84 {\r\n\r\ntemplate <bool SumToOne>\r\nclass BaryCoordT;\r\n\r\ntemplate <>\r\nclass BaryCoordT<true> {\r\n    double u;\r\n    double v;\r\n    \r\npublic:\r\n    BaryCoordT()\r\n        : u(1.0 / 3.0)\r\n        , v(1.0 / 3.0)\r\n    {}\r\n    BaryCoordT(double w0, double w1, double w2) { set(w0, w1, w2); }\r\n    \r\n    void set(double w0, double w1, double w2) {\r\n        double error = w0 + w1 + w2 - 1;\r\n        assert (-error_tolerance() < error && error < error_tolerance());\r\n        u = w1;\r\n        v = w2;\r\n    }\r\n    inline double operator[](int index) const {\r\n        return\r\n            index == 1 ? u :\r\n            index == 2 ? v :\r\n            (1 - u - v);\r\n    }\r\n    bool is_all_positive() const { return u >= 0 && v >= 0 && (1 - u - v) >= 0; }\r\n    \r\n    template <typename T>\r\n    T blend(const T& v0, const T& v1, const T& v2) const {\r\n        return static_cast<T>(\r\n            (1 - u - v) * v0 +\r\n            u           * v1 +\r\n            v           * v2);\r\n    }\r\nprivate:\r\n    static double error_tolerance() { return 0.001; }\r\n};\r\n\r\ntemplate <>\r\nclass BaryCoordT<false> {\r\n    double u;\r\n    double v;\r\n    \r\npublic:\r\n    BaryCoordT()\r\n        : u(1.0 / 3.0)\r\n        , v(1.0 / 3.0)\r\n    {}\r\n    BaryCoordT(double w0, double w1, double w2) { set(w0, w1, w2); }\r\n    \r\n    void set(double w0, double w1, double w2) {\r\n        double error = w0 + w1 + w2;\r\n        assert (-error_tolerance() < error && error < error_tolerance());\r\n        u = w1;\r\n        v = w2;\r\n    }\r\n    inline double operator[](int index) const {\r\n        return\r\n            index == 1 ? u :\r\n            index == 2 ? v :\r\n            (- u - v);\r\n    }\r\n    \r\n    template <typename T>\r\n    T blend(const T& v0, const T& v1, const T& v2) const {\r\n        return static_cast<T>(\r\n            (1 - u - v) * v0 +\r\n            u           * v1 +\r\n            v           * v2);\r\n    }\r\nprivate:\r\n    static double error_tolerance() { return 0.001; }\r\n};\r\n\r\ntypedef BaryCoordT<true > BaryCoord;\r\ntypedef BaryCoordT<false> BaryCoordZero;\r\n\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/Clock.h",
    "content": "#pragma once\r\n\r\n#include <ctime>\r\n#include <map>\r\n#include <iostream>\r\n#include <iomanip>\r\n#include <string>\r\n\r\nnamespace kt84 {\r\n\r\nclass ClkStart;\r\nclass ClkData\r\n{\r\n    friend ClkStart;\r\n    std::map<std::string, clock_t> m_ticks;\r\n    std::string m_clkName;\r\n    bool m_showPercent;\r\npublic:\r\n    ClkData(const std::string& clkName = \"\", bool showPercent = true)\r\n        : m_clkName(clkName)\r\n        , m_showPercent(showPercent)\r\n    {}\r\n    void setClkName(const std::string& clkName) {\r\n        m_clkName = clkName;\r\n    }\r\n    std::string getClkName() const {\r\n        return m_clkName;\r\n    }\r\n    void clearTicks() { m_ticks.clear(); }\r\n    clock_t getTick(const std::string& name) const {\r\n        auto p = m_ticks.find(name);\r\n        return p == m_ticks.end() ? 0 : p->second;\r\n    }\r\n    void setShowPercent(bool showPercent) {\r\n        m_showPercent = showPercent;\r\n    }\r\n    void print() {\r\n        double total = 0.0;\r\n        for (auto i = m_ticks.begin(); i != m_ticks.end(); ++i)\r\n            total += static_cast<double>(i->second);\r\n        std::cout << \"[\";\r\n        if (!m_clkName.empty())\r\n            std::cout << m_clkName << \" | \";\r\n        for (auto i = m_ticks.begin(); i != m_ticks.end(); ++i) {\r\n            std::cout << i->first << \":\";\r\n            if (m_showPercent) {\r\n                double percent = total == 0.0 ? 0.0 : (100 * i->second / total);\r\n                std::cout << std::setprecision(3) << percent << \"%, \";\r\n            } else {\r\n                std::cout << (1000 * i->second / static_cast<double>(CLOCKS_PER_SEC)) << \"msec, \";\r\n            }\r\n        }\r\n        std::cout << \"total:\" << (1000 * total / CLOCKS_PER_SEC) << \"msec]\\n\";\r\n    }\r\n};\r\n\r\nclass ClkStart\r\n{\r\n    ClkData* m_clkData;\r\n    std::string m_currentTick;\r\n    bool m_autoPrint;\r\n    clock_t m_clk;\r\npublic:\r\n    ClkStart(ClkData* clkData, const std::string& currentTick = \"\", bool autoPrint = false, bool clearTicks = false)\r\n        : m_clkData(clkData)\r\n        , m_currentTick(currentTick)\r\n        , m_autoPrint(autoPrint)\r\n        , m_clk(clock())\r\n    {\r\n        if (m_autoPrint)\r\n            std::cout << \"clock started: \" << m_clkData->getClkName() << std::endl;\r\n        if (clearTicks)\r\n            m_clkData->clearTicks();\r\n    }\r\n    void setCurrentTick(const std::string& tick) {\r\n        clock_t clk_old = m_clk;\r\n        m_clk = clock();\r\n        if (m_currentTick != \"\")\r\n            m_clkData->m_ticks[m_currentTick] += m_clk - clk_old;\r\n        m_currentTick = tick;\r\n    }\r\n    void print() {\r\n        clock_t clk_old = m_clk;\r\n        m_clk = clock();\r\n        m_clkData->m_ticks[m_currentTick] += m_clk - clk_old;\r\n        m_clkData->print();\r\n    }\r\n    ~ClkStart() {\r\n        clock_t clk_old = m_clk;\r\n        m_clk = clock();\r\n        m_clkData->m_ticks[m_currentTick] += m_clk - clk_old;\r\n        if (m_autoPrint) {\r\n            m_clkData->print();\r\n            std::cout << \"clock stopped: \" << m_clkData->getClkName() << std::endl;\r\n        }\r\n    }\r\n};\r\nclass ClkSimple\r\n{\r\n    std::string m_message;\r\n    clock_t m_clk;\r\npublic:\r\n    ClkSimple(const std::string& message = \"\")\r\n        : m_message(message)\r\n        , m_clk(clock())\r\n    {\r\n        std::cout << \"Start \" << m_message << \"...\";\r\n    }\r\n    ~ClkSimple()\r\n    {\r\n        std::cout << \"done: \" << (1000 * (clock() - m_clk) / CLOCKS_PER_SEC) << \"msec\\n\";\r\n    }\r\n    void print() {\r\n        std::cout << \"current: \" << (1000 * (clock() - m_clk) / CLOCKS_PER_SEC) << \"msec\\n\";\r\n    }\r\n};\n\nclass ClkLoop {\n    int m_tick;\n    int m_tickMax;\n    int m_printIntervalMilliSec;\n    std::string m_name;\n    clock_t m_clk, m_clkInit;\npublic:\n    ClkLoop()\n        : m_tick(0)\n        , m_tickMax(0)\n        , m_printIntervalMilliSec(0)\n        , m_clk(0)\n        , m_clkInit(0)\n    {}\n    ClkLoop(int tickMax, std::string name = \"\", int printIntervalMilliSec = 1000) {\n        init(tickMax, name, printIntervalMilliSec);\n    }\n    void init(int tickMax, std::string name = \"\", int printIntervalMilliSec = 1000) {\n        m_tick = 0;\n        m_tickMax = tickMax;\n        m_printIntervalMilliSec = printIntervalMilliSec;\n        m_name = name;\n        m_clk = m_clkInit = clock();\n    }\n    void tick() {\n        ++m_tick;\n        clock_t clk_new = clock();\n        if (m_tick == m_tickMax || m_printIntervalMilliSec < (clk_new - m_clk) * 1000 / CLOCKS_PER_SEC) {\n            double percent = (100. * m_tick) / m_tickMax;\n            int step = static_cast<int>(percent / 10);\n            std::cout << m_name << \" |\";\r\n            for (int i = 0; i < 10; ++i)\r\n                std::cout << (i < step ? \"#\" : \"-\");\r\n            std::cout << \"| \" << percent << \"% \";\r\n            if (m_tick < m_tickMax)\r\n                std::cout << \"     \\r\";\r\n            else\r\n                std::cout << ((clk_new - m_clkInit) / CLOCKS_PER_SEC) <<\"sec\\n\";\r\n            m_clk = clk_new;\n        }\n    }\n    void done() {     // i'm done!\n        if (m_tick == m_tickMax)\n            return;\n        m_tick = m_tickMax - 1;\n        tick();\n    }\n};\n\n}\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/Matrix11ToScalar.h",
    "content": "#pragma once\r\n#include <Eigen/Core>\r\n\r\nnamespace kt84 {\r\n    template <typename _Scalar, int _Rows, int _Cols>\r\n    struct Matrix11ToScalar {\r\n        using Type = Eigen::Matrix<_Scalar, _Rows, _Cols>;\r\n        static auto Zero() -> decltype(Type::Zero()) { return Type::Zero(); }\r\n        static auto Constant(const _Scalar& value) -> decltype(Type::Constant(value)) { return Type::Constant(value); }\r\n    };\r\n    template <typename _Scalar>\r\n    struct Matrix11ToScalar<_Scalar, 1, 1> {\r\n        using Type = _Scalar;\r\n        static _Scalar Zero() { return 0; }\r\n        static _Scalar Constant(const _Scalar& value) { return value; }\r\n    };\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/MaxSelector.h",
    "content": "#pragma once\r\n#include <limits>\r\n\r\nnamespace kt84 {\r\n\r\ntemplate <typename Value, typename Score = double>\r\nstruct MaxSelector {\r\n    Score score;\r\n    Value value;\r\n    MaxSelector(const Value& init_value = Value())\r\n        : score(-std::numeric_limits<Score>::max())\r\n        , value(init_value)\r\n    {}\r\n    bool update(Score score_, const Value& value_) {\r\n        if (score_ > score) {\r\n            score = score_;\r\n            value = value_;\r\n            return true;\r\n        }\r\n        return false;\r\n    }\r\n};\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/Memento.h",
    "content": "#include <vector>\r\n\r\nnamespace kt84 {\r\n\r\ntemplate <typename T>\r\nstruct Memento {\r\n    int undo_begin;\r\n    int undo_size;\r\n    std::vector<T> undo_buffer;\n    std::vector<T> redo_buffer;\n    \n    Memento(int buffer_size_ = 10) {\n        init(buffer_size_);\n    }\n    int buffer_size() const {\n        return undo_buffer.size();\n    }\n    void init(int buffer_size_) {\n        undo_buffer.resize(buffer_size_);\n        redo_buffer.clear();\n        redo_buffer.reserve(buffer_size_);\n        undo_begin = undo_size = 0;\n    }\n    void init() {\n        init(buffer_size());\n    }\n    void store(const T& data) {\n        // update undo_size or undo_begin\n        if (undo_size == buffer_size())\n            undo_begin = (undo_begin + 1) % buffer_size();\n        else\n            ++undo_size;\n    \n        // store current data into undo buffer\n        undo_buffer[(undo_begin + undo_size - 1) % buffer_size()] = data;\n        \n        // clear redo buffer\n        redo_buffer.clear();\n    }\n    bool undo(T& data) {\n        if (!undo_size)\n            // undo buffer is empty\n            return false;\n        \n        // store current data into redo buffer\n        redo_buffer.push_back(data);\n        \n        // restore data from undo buffer\n        data = undo_buffer[(undo_begin + undo_size - 1) % buffer_size()];\n        --undo_size;\n        \n        return true;\n    }\n    bool redo(T& data) {\n        if (redo_buffer.empty())\n            // redo buffer is empty\n            return false;\n        \n        // store current data into undo buffer\n        ++undo_size;\n        undo_buffer[(undo_begin + undo_size - 1) % buffer_size()] = data;\n        \n        // restore data from redo buffer\n        data = redo_buffer.back();\n        redo_buffer.pop_back();\n        \n        return true;\n    }\n};\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/MinSelector.h",
    "content": "#pragma once\r\n#include <limits>\r\n\r\nnamespace kt84 {\r\n\r\ntemplate <typename Value, typename Score = double>\r\nstruct MinSelector {\r\n    Score score;\r\n    Value value;\r\n    MinSelector(const Value& init_value = Value())\r\n        : score(std::numeric_limits<Score>::max())\r\n        , value(init_value)\r\n    {}\r\n    bool update(Score score_, const Value& value_) {\r\n        if (score_ < score) {\r\n            score = score_;\r\n            value = value_;\r\n            return true;\r\n        }\r\n        return false;\r\n    }\r\n};\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/PriorityElement.h",
    "content": "#pragma once\r\n\r\nnamespace kt84 {\r\n    template <typename PriorityType, typename ElementType>\r\n    struct PriorityElement {\r\n        PriorityType priority;\r\n        ElementType element;\r\n        bool operator<(const PriorityElement& rhs) const { return priority < rhs.priority; }\r\n    };\r\n    template <typename PriorityType, typename ElementType>\r\n    inline PriorityElement<PriorityType, ElementType> make_PriorityElement(PriorityType priority, const ElementType& element) {\r\n        PriorityElement<PriorityType, ElementType> result = { priority, element };\r\n        return result;\r\n    }\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/RangeAdaptor.h",
    "content": "#pragma once\r\n\r\nnamespace kt84 {\r\n    template <typename TIterator>\r\n    struct RangeAdaptor {\r\n        RangeAdaptor(TIterator begin_, TIterator end_) : iter_begin(begin_), iter_end(end_) {}\r\n        TIterator begin() const { return iter_begin; }\r\n        TIterator end  () const { return iter_end  ; }\r\n    private:\r\n        TIterator iter_begin, iter_end;\r\n    };\r\n    template <typename TIterator>\r\n    inline RangeAdaptor<TIterator> make_RangeAdaptor(TIterator begin_, TIterator end_) { return RangeAdaptor<TIterator>(begin_, end_); }\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/ReversedRange.h",
    "content": "#pragma once\r\n\r\nnamespace kt84 {\r\ntemplate <class Container>\r\nstruct ReversedRange {\r\nprotected:\r\n    Container& container;\r\npublic:\r\n    ReversedRange(Container& container) : container(container) {}\r\n    auto begin() -> decltype(container.rbegin()) { return container.rbegin(); }\r\n    auto end  () -> decltype(container.rend  ()) { return container.rend  (); }\r\n};\r\n\r\ntemplate <class Container>\r\ninline ReversedRange<Container> make_ReversedRange(Container& container) { return ReversedRange<Container>(container); }\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/ScopeExit.hh",
    "content": "#pragma once\r\n\r\nnamespace kt84 {\r\n    template <typename Func>\r\n    struct ScopeExit {\r\n        ScopeExit(Func func) : func(func) {}\r\n        ~ScopeExit() { func(); }\r\n        Func func;\r\n    };\r\n    template <typename Func>\r\n    inline ScopeExit<Func> make_ScopeExit(Func func) { return ScopeExit<Func>(func); }\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/Timer.hh",
    "content": "#pragma once\r\n#include <chrono>\r\n#include <unordered_map>\r\n\r\nnamespace kt84 {\r\n    template<class Rep, class Period>\r\n    struct Timer {\r\n        Timer(bool auto_start = false) : is_active() {\r\n            if (auto_start) start();\r\n        }\r\n        void reset() {\r\n            duration = std::chrono::duration<Rep, Period>::zero();\r\n            is_active = false;\r\n        }\r\n        void start() {\r\n            if (is_active) return;\r\n            clk_before = std::chrono::high_resolution_clock::now();\r\n            is_active = true;\r\n        }\r\n        Rep stop() {\r\n            if (is_active) {\r\n                auto clk_after = std::chrono::high_resolution_clock::now();\r\n                duration += clk_after - clk_before;\r\n                is_active = false;\r\n            }\r\n            return count();\r\n        }\r\n        Rep count() const {\r\n            return duration.count();\r\n        }\r\n        template <typename Func>\r\n        Rep start_stop(Func func) {\r\n            start();\r\n            func();\r\n            return stop();\r\n        }\r\n        std::chrono::high_resolution_clock::time_point clk_before;\r\n        std::chrono::duration<Rep, Period> duration;\r\n        bool is_active;\r\n    };\r\n    typedef Timer<float, std::milli> Timerf_milli;\r\n    typedef Timer<float, std::micro> Timerf_micro;\r\n    typedef Timer<float, std::nano > Timerf_nano ;\r\n    typedef Timer<double, std::milli> Timerd_milli;\r\n    typedef Timer<double, std::micro> Timerd_micro;\r\n    typedef Timer<double, std::nano > Timerd_nano ;\r\n    \r\n    template<class Rep, class Period>\r\n    struct NamedTimers : public std::unordered_map<const char*, Timer<Rep, Period>> {};\r\n    typedef NamedTimers<float, std::milli> NamedTimersf_milli;\r\n    typedef NamedTimers<float, std::micro> NamedTimersf_micro;\r\n    typedef NamedTimers<float, std::nano > NamedTimersf_nano ;\r\n    typedef NamedTimers<double, std::milli> NamedTimersd_milli;\r\n    typedef NamedTimers<double, std::micro> NamedTimersd_micro;\r\n    typedef NamedTimers<double, std::nano > NamedTimersd_nano ;\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/adjacent_pairs.h",
    "content": "#pragma once\r\n#include \"RangeAdaptor.h\"\r\n\r\nnamespace kt84 {\r\n    namespace internal {\r\n        template<typename Container, typename Iterator, typename Element>\r\n        struct AdjacentPairIter {\r\n            AdjacentPairIter(Container& parent_, Iterator pos_)\r\n                : parent(&parent_), pos(pos_)\r\n            {}\r\n            // minimal required member functions\r\n            typedef std::pair<Element&, Element&> DerefType;\r\n            DerefType operator*() const {\r\n                Iterator pos_next(pos);\r\n                auto& first  = *pos;\r\n                auto& second = *(++pos_next == parent->end() ? parent->begin() : pos_next);\r\n                return DerefType(first, second);\r\n            }\r\n            AdjacentPairIter& operator++() {\r\n                ++pos;\r\n                return *this;\r\n            }\r\n            bool operator!=(const AdjacentPairIter& rhs) const { return parent != rhs.parent || pos != rhs.pos; }\r\n        private:\r\n            Container* parent;\r\n            Iterator pos;\r\n        };\r\n    }\r\n    template<class Container>\r\n    inline auto adjacent_pairs(Container& c, bool is_loop) -> RangeAdaptor<internal::AdjacentPairIter<Container, decltype(c.begin()), decltype(*c.begin())>> {\r\n        typedef decltype( c.begin()) Iterator;\r\n        typedef decltype(*c.begin()) Element;\r\n        internal::AdjacentPairIter<Container, Iterator, Element> iter_begin(c, c.begin());\r\n        internal::AdjacentPairIter<Container, Iterator, Element> iter_end  (c, is_loop ? c.end() : --c.end());\r\n        return make_RangeAdaptor(iter_begin, iter_end);\r\n    }\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/container_cast.h",
    "content": "#pragma once\r\n#include <vector>\r\n#include <list>\r\n#include <set>\r\n\r\nnamespace kt84 {\r\n    template<typename T_to, typename T_from>\r\n\tstd::vector<T_to> container_cast(const std::vector<T_from>& container) {\r\n        std::vector<T_to> result;\r\n        result.reserve(container.size());\r\n        for (auto& e : container)\r\n            result.push_back(T_to(e));\r\n        return result;\r\n    }\r\n    template<typename T_to, typename T_from>\r\n\tstd::list<T_to> container_cast(const std::list<T_from>& container) {\r\n        std::list<T_to> result;\r\n        for (auto& e : container)\r\n            result.push_back(T_to(e));\r\n        return result;\r\n    }\r\n    template<typename T_to, typename T_from>\r\n\tstd::set<T_to> container_cast(const std::set<T_from>& container) {\r\n        std::set<T_to> result;\r\n        for (auto& e : container)\r\n            result.insert(T_to(e));\r\n        return result;\r\n    }\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/container_util.h",
    "content": "#pragma once\r\n#include <algorithm>\r\n#include <numeric>\r\n#include <boost/optional.hpp>\r\n#include \"RangeAdaptor.h\"\r\n\r\nnamespace kt84 {\r\nnamespace container_util {\r\n    template<class Map>\r\n    inline boost::optional<typename Map::mapped_type> at_optional(Map& map, const typename Map::key_type& key) {\r\n        auto p = map.find(key);\r\n        if (p == map.end())\r\n            return boost::none;\r\n        else\r\n            return p->second;\r\n    }\r\n    template<class Container>\r\n    inline void unique(Container& c) {\r\n        c.erase(std::unique(c.begin(), c.end()), c.end());\r\n    }\r\n    template<class Container>\r\n    inline void reverse(Container& c) {\r\n        std::reverse(c.begin(), c.end());\r\n    }\r\n    template<class Container>\r\n    inline int mod_index(Container& c, int index) {\r\n        while (index < 0) index += c.size();\r\n        return index % c.size();\r\n    }\r\n    template<class Container>\r\n    inline auto at_mod(Container& c, int index) -> decltype(c[index]) {\r\n        return c[mod_index(c,index)];\r\n    }\r\n    template<class Container, class Predicate>\r\n    inline void remove_if(Container& c, Predicate pred) {\r\n        c.erase(std::remove_if(c.begin(), c.end(), pred), c.end());\r\n    }\r\n    template<class Container, class Type> \r\n    inline void bring_front(Container& c, const Type& val) {\r\n        std::rotate(c.begin(), std::find(c.begin(), c.end(), val), c.end());\r\n    }\r\n    template<class Container, class Type> \r\n    inline auto find(Container& c, const Type& val) -> decltype(std::find(c.begin(), c.end(), val)) {\r\n        return std::find(c.begin(), c.end(), val);\r\n    }\r\n    template<class Container, class Predicate> \r\n    inline auto find_if(Container& c, Predicate pred) -> decltype(std::find_if(c.begin(), c.end(), pred)) {\r\n        return std::find_if(c.begin(), c.end(), pred);\r\n    }\r\n    template<class Container, class Type> \r\n    inline auto count(Container& c, const Type& val ) -> decltype(std::count(c.begin(), c.end(), val)) {\r\n        return std::count(c.begin(), c.end(), val);\r\n    }\r\n    template<class Container, class Predicate> \r\n    inline auto count_if(Container& c, Predicate pred) -> decltype(std::count_if(c.begin(), c.end(), pred)) {\r\n        return std::count_if(c.begin(), c.end(), pred);\r\n    }\r\n    template<class Container> \r\n    inline void sort(Container& c) {\r\n        return std::sort(c.begin(), c.end());\r\n    }\r\n    template<class Container, class Predicate> \r\n    inline void sort(Container& c, Predicate pred) {\r\n        return std::sort(c.begin(), c.end(), pred);\r\n    }\r\n    template<class Container> \r\n    inline auto erase_at(Container& c, int index) -> decltype(c.erase(c.begin())) {\r\n        auto pos = c.begin();\r\n        std::advance(pos, index);\r\n        return c.erase(pos);\r\n    }\r\n    template<class Container, typename Element>\r\n    inline Element accumulate(Container& c, const Element& val) {\r\n        return std::accumulate(c.begin(), c.end(), val);\r\n    }\r\n    template<class Container, typename Element, typename BinaryOp>\r\n    inline Element accumulate(Container& c, const Element& val, BinaryOp binary_op) {\r\n        return std::accumulate(c.begin(), c.end(), val, binary_op);\r\n    }\r\n    template<class Container>\r\n    inline void remove_duplicate(Container& c) {\r\n        sort(c);\r\n        unique(c);\r\n    }\r\n}\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/discrete_distribution.h",
    "content": "#pragma once\r\n#include <random>\n#include <iterator>\n\n// Workaround for the lacking ctor of (Iter, Iter) in the stupid VC11 implementation. Should be unnecessary in future...\nnamespace kt84 {\n\ntemplate <typename T = int>\nstruct discrete_distribution : public std::discrete_distribution<T> {\n    discrete_distribution() : std::discrete_distribution<T>() {}    // Default ctor\n    template<class InputIt>\r\n    discrete_distribution(InputIt first, InputIt last)\r\n        : std::discrete_distribution<T>(std::distance(first, last), 0, std::distance(first, last),\r\n                                        [&](double i){\r\n                                            auto temp = first;\r\n                                            std::advance(temp, static_cast<int>(i));\r\n                                            return *temp;\r\n                                        })\r\n    {}\r\n    template<class UnaryOperation>\r\n    discrete_distribution(std::size_t count, double xmin, double xmax, UnaryOperation unary_op)\n        : std::discrete_distribution<T>(count, xmin, xmax, unary_op)\n    {}\n};\n\n}\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/eigen_def.h",
    "content": "#pragma once\r\n#include <Eigen/Core>\r\n\nnamespace Eigen {\n\n//-------------------------------------+\n// mostly copied from src/Core/Array.h |\n//                                     |\n#define EIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, Size, SizeSuffix)   \\\n/** \\ingroup arraytypedefs */                                    \\\ntypedef Array<Type, Size, Size> Array##SizeSuffix##SizeSuffix##TypeSuffix;  \\\n/** \\ingroup arraytypedefs */                                    \\\ntypedef Array<Type, Size, 1>    Array##SizeSuffix##TypeSuffix;\n\n#define EIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, Size)         \\\n/** \\ingroup arraytypedefs */                                    \\\ntypedef Array<Type, Size, Dynamic> Array##Size##X##TypeSuffix;  \\\n/** \\ingroup arraytypedefs */                                    \\\ntypedef Array<Type, Dynamic, Size> Array##X##Size##TypeSuffix;\n\n#define EIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(Type, TypeSuffix) \\\nEIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, 2, 2) \\\nEIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, 3, 3) \\\nEIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, 4, 4) \\\nEIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, 5, 5) \\\nEIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, 6, 6) \\\nEIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, 7, 7) \\\nEIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, 8, 8) \\\nEIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, 9, 9) \\\nEIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, 10, 10) \\\nEIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, Dynamic, X) \\\nEIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, 2) \\\nEIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, 3) \\\nEIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, 4) \\\nEIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, 5) \\\nEIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, 6) \\\nEIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, 7) \\\nEIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, 8) \\\nEIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, 9) \\\nEIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, 10)\n\nEIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(bool, b)\nEIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(char, c)\nEIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(unsigned int, ui)\nEIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(unsigned char, uc)\n\n#define EIGEN_MAKE_ARRAY_TYPEDEFS_SIZES_5_10(Type, TypeSuffix) \\\nEIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, 5, 5) \\\nEIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, 6, 6) \\\nEIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, 7, 7) \\\nEIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, 8, 8) \\\nEIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, 9, 9) \\\nEIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, 10, 10) \\\nEIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, 5) \\\nEIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, 6) \\\nEIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, 7) \\\nEIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, 8) \\\nEIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, 9) \\\nEIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, 10)\n\nEIGEN_MAKE_ARRAY_TYPEDEFS_SIZES_5_10(int,                  i)\nEIGEN_MAKE_ARRAY_TYPEDEFS_SIZES_5_10(float,                f)\nEIGEN_MAKE_ARRAY_TYPEDEFS_SIZES_5_10(double,               d)\nEIGEN_MAKE_ARRAY_TYPEDEFS_SIZES_5_10(std::complex<float>,  cf)\nEIGEN_MAKE_ARRAY_TYPEDEFS_SIZES_5_10(std::complex<double>, cd)\n\n#undef EIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES\n#undef EIGEN_MAKE_ARRAY_TYPEDEFS_SIZES_5_10\n#undef EIGEN_MAKE_ARRAY_FIXED_TYPEDEFS\n#undef EIGEN_MAKE_ARRAY_TYPEDEFS\n//                                     |\n// mostly copied from src/Core/Array.h |\n//-------------------------------------+\n\r\n//--------------------------------------+\n// mostly copied from src/Core/Matrix.h |\n//                                      |\n#define EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, Size, SizeSuffix)   \\\n/** \\ingroup matrixtypedefs */                                    \\\ntypedef Matrix<Type, Size, Size> Matrix##SizeSuffix##TypeSuffix;  \\\n/** \\ingroup matrixtypedefs */                                    \\\ntypedef Matrix<Type, Size, 1>    Vector##SizeSuffix##TypeSuffix;  \\\n/** \\ingroup matrixtypedefs */                                    \\\ntypedef Matrix<Type, 1, Size>    RowVector##SizeSuffix##TypeSuffix;\n\n#define EIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, Size)         \\\n/** \\ingroup matrixtypedefs */                                    \\\ntypedef Matrix<Type, Size, Dynamic> Matrix##Size##X##TypeSuffix;  \\\n/** \\ingroup matrixtypedefs */                                    \\\ntypedef Matrix<Type, Dynamic, Size> Matrix##X##Size##TypeSuffix;\n\n#define EIGEN_MAKE_TYPEDEFS_ALL_SIZES(Type, TypeSuffix) \\\nEIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 2, 2) \\\nEIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 3, 3) \\\nEIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 4, 4) \\\nEIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 5, 5) \\\nEIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 6, 6) \\\nEIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 7, 7) \\\nEIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 8, 8) \\\nEIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 9, 9) \\\nEIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 10, 10) \\\nEIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, Dynamic, X) \\\nEIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 2) \\\nEIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 3) \\\nEIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 4) \\\nEIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 5) \\\nEIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 6) \\\nEIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 7) \\\nEIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 8) \\\nEIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 9) \\\nEIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 10)\n\nEIGEN_MAKE_TYPEDEFS_ALL_SIZES(bool, b)\nEIGEN_MAKE_TYPEDEFS_ALL_SIZES(char, c)\nEIGEN_MAKE_TYPEDEFS_ALL_SIZES(unsigned char, uc)\nEIGEN_MAKE_TYPEDEFS_ALL_SIZES(unsigned int, ui)\n\n#define EIGEN_MAKE_TYPEDEFS_SIZES_5_10(Type, TypeSuffix) \\\nEIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 5, 5) \\\nEIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 6, 6) \\\nEIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 7, 7) \\\nEIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 8, 8) \\\nEIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 9, 9) \\\nEIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 10, 10) \\\nEIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 5) \\\nEIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 6) \\\nEIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 7) \\\nEIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 8) \\\nEIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 9) \\\nEIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 10)\n\nEIGEN_MAKE_TYPEDEFS_SIZES_5_10(int,                  i)\nEIGEN_MAKE_TYPEDEFS_SIZES_5_10(float,                f)\nEIGEN_MAKE_TYPEDEFS_SIZES_5_10(double,               d)\nEIGEN_MAKE_TYPEDEFS_SIZES_5_10(std::complex<float>,  cf)\nEIGEN_MAKE_TYPEDEFS_SIZES_5_10(std::complex<double>, cd)\n\n#undef EIGEN_MAKE_TYPEDEFS_ALL_SIZES\n#undef EIGEN_MAKE_TYPEDEFS_SIZES_5_10\n#undef EIGEN_MAKE_TYPEDEFS\n#undef EIGEN_MAKE_FIXED_TYPEDEFS\n//                                      |\n// mostly copied from src/Core/Matrix.h |\n//--------------------------------------+\n\r\n}\r\n\r\n\nnamespace kt84 {\r\n\r\n#define EIGEN_MAKE_VECTOR_5(Type, TypeSuffix) \\\n    inline Eigen::Vector5##TypeSuffix make_Vector5##TypeSuffix (const Type& v0, const Type& v1, const Type& v2, const Type& v3, const Type& v4) { \\\n        Eigen::Vector5##TypeSuffix vec; \\\n        vec(0) = v0; \\\n        vec(1) = v1; \\\n        vec(2) = v2; \\\n        vec(3) = v3; \\\n        vec(4) = v4; \\\n        return vec; \\\n    }\n#define EIGEN_MAKE_VECTOR_6(Type, TypeSuffix) \\\n    inline Eigen::Vector6##TypeSuffix make_Vector6##TypeSuffix (const Type& v0, const Type& v1, const Type& v2, const Type& v3, const Type& v4, const Type& v5) { \\\n        Eigen::Vector6##TypeSuffix vec; \\\n        vec(0) = v0; \\\n        vec(1) = v1; \\\n        vec(2) = v2; \\\n        vec(3) = v3; \\\n        vec(4) = v4; \\\n        vec(5) = v5; \\\n        return vec; \\\n    }\n#define EIGEN_MAKE_VECTOR_7(Type, TypeSuffix) \\\n    inline Eigen::Vector7##TypeSuffix make_Vector7##TypeSuffix (const Type& v0, const Type& v1, const Type& v2, const Type& v3, const Type& v4, const Type& v5, const Type& v6) { \\\n        Eigen::Vector7##TypeSuffix vec; \\\n        vec(0) = v0; \\\n        vec(1) = v1; \\\n        vec(2) = v2; \\\n        vec(3) = v3; \\\n        vec(4) = v4; \\\n        vec(5) = v5; \\\n        vec(6) = v6; \\\n        return vec; \\\n    }\n#define EIGEN_MAKE_VECTOR_8(Type, TypeSuffix) \\\n    inline Eigen::Vector8##TypeSuffix make_Vector8##TypeSuffix (const Type& v0, const Type& v1, const Type& v2, const Type& v3, const Type& v4, const Type& v5, const Type& v6, const Type& v7) { \\\n        Eigen::Vector8##TypeSuffix vec; \\\n        vec(0) = v0; \\\n        vec(1) = v1; \\\n        vec(2) = v2; \\\n        vec(3) = v3; \\\n        vec(4) = v4; \\\n        vec(5) = v5; \\\n        vec(6) = v6; \\\n        vec(7) = v7; \\\n        return vec; \\\n    }\n#define EIGEN_MAKE_VECTOR_9(Type, TypeSuffix) \\\n    inline Eigen::Vector9##TypeSuffix make_Vector9##TypeSuffix (const Type& v0, const Type& v1, const Type& v2, const Type& v3, const Type& v4, const Type& v5, const Type& v6, const Type& v7, const Type& v8) { \\\n        Eigen::Vector9##TypeSuffix vec; \\\n        vec(0) = v0; \\\n        vec(1) = v1; \\\n        vec(2) = v2; \\\n        vec(3) = v3; \\\n        vec(4) = v4; \\\n        vec(5) = v5; \\\n        vec(6) = v6; \\\n        vec(7) = v7; \\\n        vec(8) = v8; \\\n        return vec; \\\n    }\n#define EIGEN_MAKE_VECTOR_10(Type, TypeSuffix) \\\n    inline Eigen::Vector10##TypeSuffix make_Vector10##TypeSuffix (const Type& v0, const Type& v1, const Type& v2, const Type& v3, const Type& v4, const Type& v5, const Type& v6, const Type& v7, const Type& v8, const Type& v9) { \\\n        Eigen::Vector10##TypeSuffix vec; \\\n        vec(0) = v0; \\\n        vec(1) = v1; \\\n        vec(2) = v2; \\\n        vec(3) = v3; \\\n        vec(4) = v4; \\\n        vec(5) = v5; \\\n        vec(6) = v6; \\\n        vec(7) = v7; \\\n        vec(8) = v8; \\\n        vec(9) = v9; \\\n        return vec; \\\n    }\n\n#define EIGEN_MAKE_VECTOR_5_10(Type, TypeSuffix) \\\nEIGEN_MAKE_VECTOR_5(Type, TypeSuffix) \\\r\nEIGEN_MAKE_VECTOR_6(Type, TypeSuffix) \\\r\nEIGEN_MAKE_VECTOR_7(Type, TypeSuffix) \\\r\nEIGEN_MAKE_VECTOR_8(Type, TypeSuffix) \\\r\nEIGEN_MAKE_VECTOR_9(Type, TypeSuffix) \\\r\nEIGEN_MAKE_VECTOR_10(Type, TypeSuffix)\r\n\r\nEIGEN_MAKE_VECTOR_5_10(int                 , i )\r\nEIGEN_MAKE_VECTOR_5_10(float               , f )\r\nEIGEN_MAKE_VECTOR_5_10(double              , d )\r\nEIGEN_MAKE_VECTOR_5_10(std::complex<float> , cf)\r\nEIGEN_MAKE_VECTOR_5_10(std::complex<double>, cd)\r\nEIGEN_MAKE_VECTOR_5_10(bool                , b )\r\nEIGEN_MAKE_VECTOR_5_10(char                , c )\r\nEIGEN_MAKE_VECTOR_5_10(unsigned char       , uc)\r\nEIGEN_MAKE_VECTOR_5_10(unsigned int        , ui)\r\n\r\n#undef EIGEN_MAKE_VECTOR_5_10\r\n#undef EIGEN_MAKE_VECTOR_5\r\n#undef EIGEN_MAKE_VECTOR_6\r\n#undef EIGEN_MAKE_VECTOR_7\r\n#undef EIGEN_MAKE_VECTOR_8\r\n#undef EIGEN_MAKE_VECTOR_9\r\n#undef EIGEN_MAKE_VECTOR_10\r\n\r\n#define EIGEN_MAKE_MATRIX_2(Type, TypeSuffix) \\\n    inline Eigen::Matrix2##TypeSuffix make_Matrix2##TypeSuffix ( \\\n        const Type& v00, const Type& v01, \\\n        const Type& v10, const Type& v11) \\\n    { \\\n        Eigen::Matrix2##TypeSuffix mat; \\\n        mat(0,0)=v00; mat(0,1)=v01; \\\n        mat(1,0)=v10; mat(1,1)=v11; \\\n        return mat; \\\n    }\n#define EIGEN_MAKE_MATRIX_3(Type, TypeSuffix) \\\n    inline Eigen::Matrix3##TypeSuffix make_Matrix3##TypeSuffix ( \\\n        const Type& v00, const Type& v01, const Type& v02, \\\n        const Type& v10, const Type& v11, const Type& v12, \\\n        const Type& v20, const Type& v21, const Type& v22) \\\n    { \\\n        Eigen::Matrix3##TypeSuffix mat; \\\n        mat(0,0)=v00; mat(0,1)=v01; mat(0,2)=v02; \\\n        mat(1,0)=v10; mat(1,1)=v11; mat(1,2)=v12; \\\n        mat(2,0)=v20; mat(2,1)=v21; mat(2,2)=v22; \\\n        return mat; \\\n    }\n#define EIGEN_MAKE_MATRIX_4(Type, TypeSuffix) \\\n    inline Eigen::Matrix4##TypeSuffix make_Matrix4##TypeSuffix ( \\\n        const Type& v00, const Type& v01, const Type& v02, const Type& v03, \\\n        const Type& v10, const Type& v11, const Type& v12, const Type& v13, \\\n        const Type& v20, const Type& v21, const Type& v22, const Type& v23, \\\n        const Type& v30, const Type& v31, const Type& v32, const Type& v33) \\\n    { \\\n        Eigen::Matrix4##TypeSuffix mat; \\\n        mat(0,0)=v00; mat(0,1)=v01; mat(0,2)=v02; mat(0,3)=v03; \\\n        mat(1,0)=v10; mat(1,1)=v11; mat(1,2)=v12; mat(1,3)=v13; \\\n        mat(2,0)=v20; mat(2,1)=v21; mat(2,2)=v22; mat(2,3)=v23; \\\n        mat(3,0)=v30; mat(3,1)=v31; mat(3,2)=v32; mat(3,3)=v33; \\\n        return mat; \\\n    }\n#define EIGEN_MAKE_MATRIX_5(Type, TypeSuffix) \\\n    inline Eigen::Matrix5##TypeSuffix make_Matrix5##TypeSuffix ( \\\n        const Type& v00, const Type& v01, const Type& v02, const Type& v03, const Type& v04, \\\n        const Type& v10, const Type& v11, const Type& v12, const Type& v13, const Type& v14, \\\n        const Type& v20, const Type& v21, const Type& v22, const Type& v23, const Type& v24, \\\n        const Type& v30, const Type& v31, const Type& v32, const Type& v33, const Type& v34, \\\n        const Type& v40, const Type& v41, const Type& v42, const Type& v43, const Type& v44) \\\n    { \\\n        Eigen::Matrix5##TypeSuffix mat; \\\n        mat(0,0)=v00; mat(0,1)=v01; mat(0,2)=v02; mat(0,3)=v03; mat(0,4)=v04; \\\n        mat(1,0)=v10; mat(1,1)=v11; mat(1,2)=v12; mat(1,3)=v13; mat(1,4)=v14; \\\n        mat(2,0)=v20; mat(2,1)=v21; mat(2,2)=v22; mat(2,3)=v23; mat(2,4)=v24; \\\n        mat(3,0)=v30; mat(3,1)=v31; mat(3,2)=v32; mat(3,3)=v33; mat(3,4)=v34; \\\n        mat(4,0)=v40; mat(4,1)=v41; mat(4,2)=v42; mat(4,3)=v43; mat(4,4)=v44; \\\n        return mat; \\\n    }\n#define EIGEN_MAKE_MATRIX_6(Type, TypeSuffix) \\\n    inline Eigen::Matrix6##TypeSuffix make_Matrix6##TypeSuffix ( \\\n        const Type& v00, const Type& v01, const Type& v02, const Type& v03, const Type& v04, const Type& v05, \\\n        const Type& v10, const Type& v11, const Type& v12, const Type& v13, const Type& v14, const Type& v15, \\\n        const Type& v20, const Type& v21, const Type& v22, const Type& v23, const Type& v24, const Type& v25, \\\n        const Type& v30, const Type& v31, const Type& v32, const Type& v33, const Type& v34, const Type& v35, \\\n        const Type& v40, const Type& v41, const Type& v42, const Type& v43, const Type& v44, const Type& v45, \\\n        const Type& v50, const Type& v51, const Type& v52, const Type& v53, const Type& v54, const Type& v55) \\\n    { \\\n        Eigen::Matrix6##TypeSuffix mat; \\\n        mat(0,0)=v00; mat(0,1)=v01; mat(0,2)=v02; mat(0,3)=v03; mat(0,4)=v04; mat(0,5)=v05; \\\n        mat(1,0)=v10; mat(1,1)=v11; mat(1,2)=v12; mat(1,3)=v13; mat(1,4)=v14; mat(1,5)=v15; \\\n        mat(2,0)=v20; mat(2,1)=v21; mat(2,2)=v22; mat(2,3)=v23; mat(2,4)=v24; mat(2,5)=v25; \\\n        mat(3,0)=v30; mat(3,1)=v31; mat(3,2)=v32; mat(3,3)=v33; mat(3,4)=v34; mat(3,5)=v35; \\\n        mat(4,0)=v40; mat(4,1)=v41; mat(4,2)=v42; mat(4,3)=v43; mat(4,4)=v44; mat(4,5)=v45; \\\n        mat(5,0)=v50; mat(5,1)=v51; mat(5,2)=v52; mat(5,3)=v53; mat(5,4)=v54; mat(5,5)=v55; \\\n        return mat; \\\n    }\n#define EIGEN_MAKE_MATRIX_7(Type, TypeSuffix) \\\n    inline Eigen::Matrix7##TypeSuffix make_Matrix7##TypeSuffix ( \\\n        const Type& v00, const Type& v01, const Type& v02, const Type& v03, const Type& v04, const Type& v05, const Type& v06, \\\n        const Type& v10, const Type& v11, const Type& v12, const Type& v13, const Type& v14, const Type& v15, const Type& v16, \\\n        const Type& v20, const Type& v21, const Type& v22, const Type& v23, const Type& v24, const Type& v25, const Type& v26, \\\n        const Type& v30, const Type& v31, const Type& v32, const Type& v33, const Type& v34, const Type& v35, const Type& v36, \\\n        const Type& v40, const Type& v41, const Type& v42, const Type& v43, const Type& v44, const Type& v45, const Type& v46, \\\n        const Type& v50, const Type& v51, const Type& v52, const Type& v53, const Type& v54, const Type& v55, const Type& v56, \\\n        const Type& v60, const Type& v61, const Type& v62, const Type& v63, const Type& v64, const Type& v65, const Type& v66) \\\n    { \\\n        Eigen::Matrix7##TypeSuffix mat; \\\n        mat(0,0)=v00; mat(0,1)=v01; mat(0,2)=v02; mat(0,3)=v03; mat(0,4)=v04; mat(0,5)=v05; mat(0,6)=v06; \\\n        mat(1,0)=v10; mat(1,1)=v11; mat(1,2)=v12; mat(1,3)=v13; mat(1,4)=v14; mat(1,5)=v15; mat(1,6)=v16; \\\n        mat(2,0)=v20; mat(2,1)=v21; mat(2,2)=v22; mat(2,3)=v23; mat(2,4)=v24; mat(2,5)=v25; mat(2,6)=v26; \\\n        mat(3,0)=v30; mat(3,1)=v31; mat(3,2)=v32; mat(3,3)=v33; mat(3,4)=v34; mat(3,5)=v35; mat(3,6)=v36; \\\n        mat(4,0)=v40; mat(4,1)=v41; mat(4,2)=v42; mat(4,3)=v43; mat(4,4)=v44; mat(4,5)=v45; mat(4,6)=v46; \\\n        mat(5,0)=v50; mat(5,1)=v51; mat(5,2)=v52; mat(5,3)=v53; mat(5,4)=v54; mat(5,5)=v55; mat(5,6)=v56; \\\n        mat(6,0)=v60; mat(6,1)=v61; mat(6,2)=v62; mat(6,3)=v63; mat(6,4)=v64; mat(6,5)=v65; mat(6,6)=v66; \\\n        return mat; \\\n    }\n#define EIGEN_MAKE_MATRIX_8(Type, TypeSuffix) \\\n    inline Eigen::Matrix8##TypeSuffix make_Matrix8##TypeSuffix ( \\\n        const Type& v00, const Type& v01, const Type& v02, const Type& v03, const Type& v04, const Type& v05, const Type& v06, const Type& v07, \\\n        const Type& v10, const Type& v11, const Type& v12, const Type& v13, const Type& v14, const Type& v15, const Type& v16, const Type& v17, \\\n        const Type& v20, const Type& v21, const Type& v22, const Type& v23, const Type& v24, const Type& v25, const Type& v26, const Type& v27, \\\n        const Type& v30, const Type& v31, const Type& v32, const Type& v33, const Type& v34, const Type& v35, const Type& v36, const Type& v37, \\\n        const Type& v40, const Type& v41, const Type& v42, const Type& v43, const Type& v44, const Type& v45, const Type& v46, const Type& v47, \\\n        const Type& v50, const Type& v51, const Type& v52, const Type& v53, const Type& v54, const Type& v55, const Type& v56, const Type& v57, \\\n        const Type& v60, const Type& v61, const Type& v62, const Type& v63, const Type& v64, const Type& v65, const Type& v66, const Type& v67, \\\n        const Type& v70, const Type& v71, const Type& v72, const Type& v73, const Type& v74, const Type& v75, const Type& v76, const Type& v77) \\\n    { \\\n        Eigen::Matrix8##TypeSuffix mat; \\\n        mat(0,0)=v00; mat(0,1)=v01; mat(0,2)=v02; mat(0,3)=v03; mat(0,4)=v04; mat(0,5)=v05; mat(0,6)=v06; mat(0,7)=v07; \\\n        mat(1,0)=v10; mat(1,1)=v11; mat(1,2)=v12; mat(1,3)=v13; mat(1,4)=v14; mat(1,5)=v15; mat(1,6)=v16; mat(1,7)=v17; \\\n        mat(2,0)=v20; mat(2,1)=v21; mat(2,2)=v22; mat(2,3)=v23; mat(2,4)=v24; mat(2,5)=v25; mat(2,6)=v26; mat(2,7)=v27; \\\n        mat(3,0)=v30; mat(3,1)=v31; mat(3,2)=v32; mat(3,3)=v33; mat(3,4)=v34; mat(3,5)=v35; mat(3,6)=v36; mat(3,7)=v37; \\\n        mat(4,0)=v40; mat(4,1)=v41; mat(4,2)=v42; mat(4,3)=v43; mat(4,4)=v44; mat(4,5)=v45; mat(4,6)=v46; mat(4,7)=v47; \\\n        mat(5,0)=v50; mat(5,1)=v51; mat(5,2)=v52; mat(5,3)=v53; mat(5,4)=v54; mat(5,5)=v55; mat(5,6)=v56; mat(5,7)=v57; \\\n        mat(6,0)=v60; mat(6,1)=v61; mat(6,2)=v62; mat(6,3)=v63; mat(6,4)=v64; mat(6,5)=v65; mat(6,6)=v66; mat(6,7)=v67; \\\n        mat(7,0)=v70; mat(7,1)=v71; mat(7,2)=v72; mat(7,3)=v73; mat(7,4)=v74; mat(7,5)=v75; mat(7,6)=v76; mat(7,7)=v77; \\\n        return mat; \\\n    }\n#define EIGEN_MAKE_MATRIX_9(Type, TypeSuffix) \\\n    inline Eigen::Matrix9##TypeSuffix make_Matrix9##TypeSuffix ( \\\n        const Type& v00, const Type& v01, const Type& v02, const Type& v03, const Type& v04, const Type& v05, const Type& v06, const Type& v07, const Type& v08, \\\n        const Type& v10, const Type& v11, const Type& v12, const Type& v13, const Type& v14, const Type& v15, const Type& v16, const Type& v17, const Type& v18, \\\n        const Type& v20, const Type& v21, const Type& v22, const Type& v23, const Type& v24, const Type& v25, const Type& v26, const Type& v27, const Type& v28, \\\n        const Type& v30, const Type& v31, const Type& v32, const Type& v33, const Type& v34, const Type& v35, const Type& v36, const Type& v37, const Type& v38, \\\n        const Type& v40, const Type& v41, const Type& v42, const Type& v43, const Type& v44, const Type& v45, const Type& v46, const Type& v47, const Type& v48, \\\n        const Type& v50, const Type& v51, const Type& v52, const Type& v53, const Type& v54, const Type& v55, const Type& v56, const Type& v57, const Type& v58, \\\n        const Type& v60, const Type& v61, const Type& v62, const Type& v63, const Type& v64, const Type& v65, const Type& v66, const Type& v67, const Type& v68, \\\n        const Type& v70, const Type& v71, const Type& v72, const Type& v73, const Type& v74, const Type& v75, const Type& v76, const Type& v77, const Type& v78, \\\n        const Type& v80, const Type& v81, const Type& v82, const Type& v83, const Type& v84, const Type& v85, const Type& v86, const Type& v87, const Type& v88) \\\n    { \\\n        Eigen::Matrix9##TypeSuffix mat; \\\n        mat(0,0)=v00; mat(0,1)=v01; mat(0,2)=v02; mat(0,3)=v03; mat(0,4)=v04; mat(0,5)=v05; mat(0,6)=v06; mat(0,7)=v07; mat(0,8)=v08; \\\n        mat(1,0)=v10; mat(1,1)=v11; mat(1,2)=v12; mat(1,3)=v13; mat(1,4)=v14; mat(1,5)=v15; mat(1,6)=v16; mat(1,7)=v17; mat(1,8)=v18; \\\n        mat(2,0)=v20; mat(2,1)=v21; mat(2,2)=v22; mat(2,3)=v23; mat(2,4)=v24; mat(2,5)=v25; mat(2,6)=v26; mat(2,7)=v27; mat(2,8)=v28; \\\n        mat(3,0)=v30; mat(3,1)=v31; mat(3,2)=v32; mat(3,3)=v33; mat(3,4)=v34; mat(3,5)=v35; mat(3,6)=v36; mat(3,7)=v37; mat(3,8)=v38; \\\n        mat(4,0)=v40; mat(4,1)=v41; mat(4,2)=v42; mat(4,3)=v43; mat(4,4)=v44; mat(4,5)=v45; mat(4,6)=v46; mat(4,7)=v47; mat(4,8)=v48; \\\n        mat(5,0)=v50; mat(5,1)=v51; mat(5,2)=v52; mat(5,3)=v53; mat(5,4)=v54; mat(5,5)=v55; mat(5,6)=v56; mat(5,7)=v57; mat(5,8)=v58; \\\n        mat(6,0)=v60; mat(6,1)=v61; mat(6,2)=v62; mat(6,3)=v63; mat(6,4)=v64; mat(6,5)=v65; mat(6,6)=v66; mat(6,7)=v67; mat(6,8)=v68; \\\n        mat(7,0)=v70; mat(7,1)=v71; mat(7,2)=v72; mat(7,3)=v73; mat(7,4)=v74; mat(7,5)=v75; mat(7,6)=v76; mat(7,7)=v77; mat(7,8)=v78; \\\n        mat(8,0)=v80; mat(8,1)=v81; mat(8,2)=v82; mat(8,3)=v83; mat(8,4)=v84; mat(8,5)=v85; mat(8,6)=v86; mat(8,7)=v87; mat(8,8)=v88; \\\n        return mat; \\\n    }\n#define EIGEN_MAKE_MATRIX_10(Type, TypeSuffix) \\\n    inline Eigen::Matrix10##TypeSuffix make_Matrix10##TypeSuffix ( \\\n        const Type& v00, const Type& v01, const Type& v02, const Type& v03, const Type& v04, const Type& v05, const Type& v06, const Type& v07, const Type& v08, const Type& v09, \\\n        const Type& v10, const Type& v11, const Type& v12, const Type& v13, const Type& v14, const Type& v15, const Type& v16, const Type& v17, const Type& v18, const Type& v19, \\\n        const Type& v20, const Type& v21, const Type& v22, const Type& v23, const Type& v24, const Type& v25, const Type& v26, const Type& v27, const Type& v28, const Type& v29, \\\n        const Type& v30, const Type& v31, const Type& v32, const Type& v33, const Type& v34, const Type& v35, const Type& v36, const Type& v37, const Type& v38, const Type& v39, \\\n        const Type& v40, const Type& v41, const Type& v42, const Type& v43, const Type& v44, const Type& v45, const Type& v46, const Type& v47, const Type& v48, const Type& v49, \\\n        const Type& v50, const Type& v51, const Type& v52, const Type& v53, const Type& v54, const Type& v55, const Type& v56, const Type& v57, const Type& v58, const Type& v59, \\\n        const Type& v60, const Type& v61, const Type& v62, const Type& v63, const Type& v64, const Type& v65, const Type& v66, const Type& v67, const Type& v68, const Type& v69, \\\n        const Type& v70, const Type& v71, const Type& v72, const Type& v73, const Type& v74, const Type& v75, const Type& v76, const Type& v77, const Type& v78, const Type& v79, \\\n        const Type& v80, const Type& v81, const Type& v82, const Type& v83, const Type& v84, const Type& v85, const Type& v86, const Type& v87, const Type& v88, const Type& v89, \\\n        const Type& v90, const Type& v91, const Type& v92, const Type& v93, const Type& v94, const Type& v95, const Type& v96, const Type& v97, const Type& v98, const Type& v99) \\\n    { \\\n        Eigen::Matrix10##TypeSuffix mat; \\\n        mat(0,0)=v00; mat(0,1)=v01; mat(0,2)=v02; mat(0,3)=v03; mat(0,4)=v04; mat(0,5)=v05; mat(0,6)=v06; mat(0,7)=v07; mat(0,8)=v08; mat(0,9)=v09; \\\n        mat(1,0)=v10; mat(1,1)=v11; mat(1,2)=v12; mat(1,3)=v13; mat(1,4)=v14; mat(1,5)=v15; mat(1,6)=v16; mat(1,7)=v17; mat(1,8)=v18; mat(1,9)=v19; \\\n        mat(2,0)=v20; mat(2,1)=v21; mat(2,2)=v22; mat(2,3)=v23; mat(2,4)=v24; mat(2,5)=v25; mat(2,6)=v26; mat(2,7)=v27; mat(2,8)=v28; mat(2,9)=v29; \\\n        mat(3,0)=v30; mat(3,1)=v31; mat(3,2)=v32; mat(3,3)=v33; mat(3,4)=v34; mat(3,5)=v35; mat(3,6)=v36; mat(3,7)=v37; mat(3,8)=v38; mat(3,9)=v39; \\\n        mat(4,0)=v40; mat(4,1)=v41; mat(4,2)=v42; mat(4,3)=v43; mat(4,4)=v44; mat(4,5)=v45; mat(4,6)=v46; mat(4,7)=v47; mat(4,8)=v48; mat(4,9)=v49; \\\n        mat(5,0)=v50; mat(5,1)=v51; mat(5,2)=v52; mat(5,3)=v53; mat(5,4)=v54; mat(5,5)=v55; mat(5,6)=v56; mat(5,7)=v57; mat(5,8)=v58; mat(5,9)=v59; \\\n        mat(6,0)=v60; mat(6,1)=v61; mat(6,2)=v62; mat(6,3)=v63; mat(6,4)=v64; mat(6,5)=v65; mat(6,6)=v66; mat(6,7)=v67; mat(6,8)=v68; mat(6,9)=v69; \\\n        mat(7,0)=v70; mat(7,1)=v71; mat(7,2)=v72; mat(7,3)=v73; mat(7,4)=v74; mat(7,5)=v75; mat(7,6)=v76; mat(7,7)=v77; mat(7,8)=v78; mat(7,9)=v79; \\\n        mat(8,0)=v80; mat(8,1)=v81; mat(8,2)=v82; mat(8,3)=v83; mat(8,4)=v84; mat(8,5)=v85; mat(8,6)=v86; mat(8,7)=v87; mat(8,8)=v88; mat(8,9)=v89; \\\n        mat(9,0)=v90; mat(9,1)=v91; mat(9,2)=v92; mat(9,3)=v93; mat(9,4)=v94; mat(9,5)=v95; mat(9,6)=v96; mat(9,7)=v97; mat(9,8)=v98; mat(9,9)=v99; \\\n        return mat; \\\n    }\n\n#define EIGEN_MAKE_MATRIX_5_10(Type, TypeSuffix) \\\nEIGEN_MAKE_MATRIX_2(Type, TypeSuffix) \\\r\nEIGEN_MAKE_MATRIX_3(Type, TypeSuffix) \\\r\nEIGEN_MAKE_MATRIX_4(Type, TypeSuffix) \\\r\nEIGEN_MAKE_MATRIX_5(Type, TypeSuffix) \\\r\nEIGEN_MAKE_MATRIX_6(Type, TypeSuffix) \\\r\nEIGEN_MAKE_MATRIX_7(Type, TypeSuffix) \\\r\nEIGEN_MAKE_MATRIX_8(Type, TypeSuffix) \\\r\nEIGEN_MAKE_MATRIX_9(Type, TypeSuffix) \\\r\nEIGEN_MAKE_MATRIX_10(Type, TypeSuffix)\r\n\r\nEIGEN_MAKE_MATRIX_5_10(int                 , i )\r\nEIGEN_MAKE_MATRIX_5_10(float               , f )\r\nEIGEN_MAKE_MATRIX_5_10(double              , d )\r\nEIGEN_MAKE_MATRIX_5_10(std::complex<float> , cf)\r\nEIGEN_MAKE_MATRIX_5_10(std::complex<double>, cd)\r\nEIGEN_MAKE_MATRIX_5_10(bool                , b )\r\nEIGEN_MAKE_MATRIX_5_10(char                , c )\r\nEIGEN_MAKE_MATRIX_5_10(unsigned char       , uc)\r\nEIGEN_MAKE_MATRIX_5_10(unsigned int        , ui)\r\n\r\n#undef EIGEN_MAKE_MATRIX_5_10\r\n#undef EIGEN_MAKE_MATRIX_2\r\n#undef EIGEN_MAKE_MATRIX_3\r\n#undef EIGEN_MAKE_MATRIX_4\r\n#undef EIGEN_MAKE_MATRIX_5\r\n#undef EIGEN_MAKE_MATRIX_6\r\n#undef EIGEN_MAKE_MATRIX_7\r\n#undef EIGEN_MAKE_MATRIX_8\r\n#undef EIGEN_MAKE_MATRIX_9\r\n#undef EIGEN_MAKE_MATRIX_10\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/eigen_util.h",
    "content": "#pragma once\r\n#include <cmath>\r\n#include <algorithm>\r\n#include <limits>\r\n#include <Eigen/Geometry>\r\n#include <boost/optional.hpp>\r\n#include \"BaryCoordT.h\"\r\n#include \"util.h\"\r\n#include \"RangeAdaptor.h\"\r\n\r\nnamespace kt84 {\r\n    namespace eigen_util {\r\n        template <typename TMatrix>\r\n        inline auto range_elements(TMatrix& m) -> RangeAdaptor<decltype(m.data())> {\r\n            return make_RangeAdaptor(m.data(), m.data() + m.size());\r\n        }\r\n        template <typename TVector, typename TScalar>\r\n        inline void push_back(TVector& v, TScalar s) {\r\n            int n = v.size();\r\n            v.conservativeResize(n + 1);\r\n            v[n] = s;\r\n        }\r\n        template <typename TVector>\r\n        inline void erase_at(TVector& v, int index) {\r\n            int n = v.size();\r\n            auto tmp(v);\r\n            v.resize(n - 1);\r\n            v << tmp.head(index), tmp.tail(n - 1 - index);\r\n        }\r\n        template <typename TVector>\r\n        inline void swap_xy(TVector& v) {\r\n            std::swap(v.x(), v.y());\r\n        }\r\n        template <typename TAlignedBox>\r\n        inline void bbox_add_margin(TAlignedBox& bbox, double ratio, bool is_margin_square = false) {\r\n            if (is_margin_square) {\r\n                typedef typename TAlignedBox::VectorType VectorType;\r\n                VectorType margin = VectorType::Ones();\r\n                margin *= bbox.diagonal().norm() * ratio;\r\n                bbox.max() += margin;\r\n                bbox.min() -= margin;\r\n            } else {\r\n                bbox.extend((1 + ratio) * bbox.max() - ratio * bbox.min());\r\n                bbox.extend((1 + ratio) * bbox.min() - ratio * bbox.max());\r\n            }\r\n        }\r\n        inline Eigen::Vector2d bbox_bilinear(const Eigen::AlignedBox2d& bbox, double tx, double ty) {            // (0, 0) corresponds to bbox.min, (1, 1) corresponds to bbox.max\r\n            double x = (1 - tx) * bbox.min().x() + tx * bbox.max().x();\r\n            double y = (1 - ty) * bbox.min().y() + ty * bbox.max().x();\r\n            return Eigen::Vector2d(x, y);\r\n        }\r\n        inline Eigen::Vector3d bbox_trilinear(const Eigen::AlignedBox3d& bbox, double tx, double ty, double tz) {            // (0, 0, 0) corresponds to bbox.min, (1, 1, 1) corresponds to bbox.max\r\n            double x = (1 - tx) * bbox.min().x() + tx * bbox.max().x();\r\n            double y = (1 - ty) * bbox.min().y() + ty * bbox.max().x();\r\n            double z = (1 - tz) * bbox.min().z() + tz * bbox.max().z();\r\n            return Eigen::Vector3d(x, y, z);\r\n        }\r\n        inline Eigen::Vector3d orientation_color(Eigen::Vector3d d) {\r\n            auto cx = d.x() > 0 ? Eigen::Vector3d(1, 0, 0) : Eigen::Vector3d(0, 1, 1);\r\n            auto cy = d.y() > 0 ? Eigen::Vector3d(0, 1, 0) : Eigen::Vector3d(1, 0, 1);\r\n            auto cz = d.z() > 0 ? Eigen::Vector3d(0, 0, 1) : Eigen::Vector3d(1, 1, 0);\r\n            d /= std::abs<double>(d.sum());\r\n            d = d.cwiseAbs();\r\n            return d.x() * cx + d.y() * cy + d.z() * cz;\r\n        }\r\n        inline Eigen::Vector3d heat_color(double t) {\r\n            // t     | 0    | 0.25 | 0.5   | 0.75   | 1   |\r\n            // color | blue | cyan | green | yellow | red |\r\n            t = util::clamp(t, 0., 1.);\r\n            Eigen::Vector3d colors[5] = {\r\n                Eigen::Vector3d(0, 0, 1),\r\n                Eigen::Vector3d(0, 1, 1),\r\n                Eigen::Vector3d(0, 1, 0),\r\n                Eigen::Vector3d(1, 1, 0),\r\n                Eigen::Vector3d(1, 0, 0)\r\n            };\r\n            int i = t < 0.25 ? 0 : t < 0.5 ? 1 : t < 0.75 ? 2 : 3;\r\n            double s = (t - i * 0.25) * 4;\r\n            return (1 - s) * colors[i] + s * colors[i + 1];\r\n        }\r\n        template <int N>\r\n        inline int closest_axis(const Eigen::Matrix<double, N, 1, 0, N, 1>& v) {\r\n            int result = -1;\r\n            double v_abs_max = 0;\r\n            for (int i = 0; i < N; ++i) {\r\n                double v_abs = std::abs(v[i]);\r\n                if (v_abs_max < v_abs) {\r\n                    v_abs_max = v_abs;\r\n                    result = i;\r\n                }\r\n            }\r\n            return result;\r\n        }\r\n        inline Eigen::Vector2d compute_gradient(const Eigen::Vector2d& x0, const Eigen::Vector2d& x1, const Eigen::Vector2d& x2, double y0, double y1, double y2) {\r\n            /*\r\n                a.x0 + b = y0\r\n                a.x1 + b = y1\r\n                a.x2 + b = y2\r\n                -->\r\n                a.(x1 - x0) = y1 - y0\r\n                a.(x2 - x0) = y2 - y0\r\n                -->\r\n                |(x1 - x0)^T| * a = |y1 - y0|\r\n                |(x2 - x0)^T|       |y2 - y0|\r\n            */\r\n            Eigen::Matrix2d A;\r\n            A << Eigen::RowVector2d(x1 - x0),\r\n                 Eigen::RowVector2d(x2 - x0);\r\n            return A.inverse() * Eigen::Vector2d(y1 - y0, y2 - y0);\r\n        }\r\n        inline Eigen::Vector3d compute_gradient(const Eigen::Vector3d& x0, const Eigen::Vector3d& x1, const Eigen::Vector3d& x2, const Eigen::Vector3d& x3, double y0, double y1, double y2, double y3) {\r\n            /*\r\n                a.x0 + b = y0\r\n                a.x1 + b = y1\r\n                a.x2 + b = y2\r\n                a.x3 + b = y3\r\n                -->\r\n                a.(x1 - x0) = y1 - y0\r\n                a.(x2 - x0) = y2 - y0\r\n                a.(x3 - x0) = y3 - y0\r\n                -->\r\n                |(x1 - x0)^T|       |y1 - y0|\r\n                |(x2 - x0)^T| * a = |y2 - y0|\r\n                |(x3 - x0)^T|       |y3 - y0|\r\n            */\r\n            Eigen::Matrix3d A;\r\n            A << Eigen::RowVector3d(x1 - x0),\r\n                 Eigen::RowVector3d(x2 - x0),\r\n                 Eigen::RowVector3d(x3 - x0);\r\n            return A.inverse() * Eigen::Vector3d(y1 - y0, y2 - y0, y3 - y0);\r\n        }\r\n        inline Eigen::Vector3d compute_gradient(const Eigen::Vector3d& x0, const Eigen::Vector3d& x1, const Eigen::Vector3d& x2, double y0, double y1, double y2) {\r\n            /*\r\n                Compute gradient restricted to the tangent vectors on the triangle x0-x1-x2.\r\n                a.x0 + b = y0\r\n                a.x1 + b = y1\r\n                a.x2 + b = y2\r\n                a.n      = 0                (n: normal)\r\n                -->\r\n                a.(x1 - x0) = y1 - y0\r\n                a.(x2 - x0) = y2 - y0\r\n                a.n         = 0\r\n                -->\r\n                |(x1 - x0)^T|       |y1 - y0|\r\n                |(x2 - x0)^T| * a = |y2 - y0|\r\n                | n       ^T|       |0      |\r\n            */\r\n            Eigen::Matrix3d A;\r\n            A << Eigen::RowVector3d(x1 - x0),\r\n                 Eigen::RowVector3d(x2 - x0),\r\n                 Eigen::RowVector3d((x1 - x0).cross(x2 - x0));\r\n            return A.inverse() * Eigen::Vector3d(y1 - y0, y2 - y0, 0);\r\n        }\r\n        inline Eigen::Vector2d rotate90(const Eigen::Vector2d& xy) { return Eigen::Vector2d(-xy[1], xy[0]); }\r\n        inline double angle(const Eigen::Vector2d& d0, const Eigen::Vector2d& d1) { return std::atan2(rotate90(d0).dot(d1), d0.dot(d1)); }\r\n        inline double angle(const Eigen::Vector3d& d0, const Eigen::Vector3d& d1) { return std::acos(d0.normalized().dot(d1.normalized())); }\r\n        template <class T>\r\n        inline void orthonormalize(const T& unit, T& p) {\r\n            p -= unit.dot(p) * unit;\r\n            p.normalize();\r\n        }\r\n        template <class T>\r\n        inline bool project_to_line(const T& line_v0, const T& line_v1, const T& point, Eigen::Vector2d& t) {\r\n            /*\r\n                x0 := line_v0\r\n                x1 := line_v1\r\n                y := point\r\n                compute t (which sums up to one) such that\r\n                    | t[0] * x0 + t[1] * x1 - y |^2\r\n                is minimized.\r\n                ---------------------\r\n                u := t[1]\r\n                (1 - u) * x0 + u * x1 =~ y\r\n                u =~ (y - x0).dot(x1 - x0) / (x1 - x0).squaredNorm()\r\n            */\r\n            \r\n            double r = (line_v1 - line_v0).squaredNorm();\r\n            if (r == 0)\r\n                // degenerate\r\n                return false;\r\n            \r\n            t[1] = (point - line_v0).dot(line_v1 - line_v0) / r;\r\n            t[0] = 1 - t[1];\r\n            \r\n            return true;\r\n        }\r\n        \r\n        template <class T>\r\n        inline bool project_to_triangle(const T& triangle_v0, const T& triangle_v1, const T& triangle_v2, const T& point, Eigen::Vector3d& t) {\r\n            /*\r\n                x0 := triangle_v0\r\n                x1 := triangle_v1\r\n                x2 := triangle_v2\r\n                y := point\r\n                compute t (which sums up to one) such that\r\n                    | t[0] * x0 + t[1] * x1 + t[2] * x2 - y |^2\r\n                is minimized.\r\n                ---------------------\r\n                u := t[1]\r\n                v := t[2]\r\n                (1 - u - v) * x0 + u * x1 + v * x2 =~ y\r\n                (x1-x0, x2-x0) * |u| =~ y-x0\r\n                                 |v|\r\n                |u| =~ |(x1-x0).squaredNorm(), (x1-x0).dot(x2-x0)   |^-1 * | (x1-x0).dot(y-x0) |\r\n                |v|    |(x1-x0).dot(x2-x0)   , (x2-x0).squaredNorm()|      | (x2-x0).dot(y-x0) |\r\n            */\r\n            \r\n            T d01 = triangle_v1 - triangle_v0;\r\n            T d02 = triangle_v2 - triangle_v0;\r\n            T d0p = point       - triangle_v0;\r\n            Eigen::Matrix2d M;\r\n            M <<\r\n                d01.squaredNorm(), d01.dot(d02),\r\n                d01.dot(d02)     , d02.squaredNorm();\r\n            if (M.determinant() == 0)\r\n                // degenerate\r\n                return false;\r\n            \r\n            Eigen::Vector2d b;\r\n            b <<\r\n                d01.dot(d0p),\r\n                d02.dot(d0p);\r\n            \r\n            Eigen::Vector2d uv = ((Eigen::Matrix2d)M.inverse()) * b;\r\n            \r\n            t[0] = 1 - uv[0] - uv[1];\r\n            t[1] = uv[0];\r\n            t[2] = uv[1];\r\n            \r\n            return true;\r\n        }\r\n        \r\n        template <class T>\r\n        inline boost::optional<double> distance_to_line(const T& line_v0, const T& line_v1, const T& point, bool do_clamp = false) {\r\n            Eigen::Vector2d t;\r\n            if (!project_to_line(line_v0, line_v1, point, t))\r\n                // degenrate case\r\n                return boost::none;\r\n            \r\n            if (do_clamp) {\r\n                t[0] = util::clamp(t[0], 0.0, 1.0);\r\n                t[1] = 1 - t[0];\r\n            }\r\n            \r\n            return (t[0] * line_v0 + t[1] * line_v1 - point).norm();\r\n        }\r\n        \r\n        template <class T>\r\n        inline boost::optional<double> distance_to_triangle(const T& triangle_v0, const T& triangle_v1, const T& triangle_v2, const T& point, bool do_clamp = false) {\r\n            Eigen::Vector3d t;\r\n            if (!project_to_triangle(triangle_v0, triangle_v1, triangle_v2, point, t))\r\n                // degenrate case\r\n                return boost::none;\r\n            \r\n            if (do_clamp && t[0] < 0 || t[1] < 0 || t[2] < 0) {\r\n                double d0 = *distance_to_line(triangle_v0, triangle_v1, point, true);\r\n                double d1 = *distance_to_line(triangle_v1, triangle_v2, point, true);\r\n                double d2 = *distance_to_line(triangle_v2, triangle_v0, point, true);\r\n                return util::min(d0, d1, d2);\r\n            }\r\n            \r\n            return (t[0] * triangle_v0 + t[1] * triangle_v1 + t[2] * triangle_v2 - point).norm();\r\n        }\r\n        inline double triangle_area(const Eigen::Vector2d& v0, const Eigen::Vector2d& v1, const Eigen::Vector2d& v2) {\r\n            Eigen::Vector2d d1 = v1 - v0;\r\n            Eigen::Vector2d d2 = v2 - v0;\r\n            return d1.x() * d2.y() - d1.y() * d2.x();\r\n        }\r\n        inline double triangle_area(const Eigen::Vector3d& v0, const Eigen::Vector3d& v1, const Eigen::Vector3d& v2) {\r\n            Eigen::Vector3d d1 = v1 - v0;\r\n            Eigen::Vector3d d2 = v2 - v0;\r\n            return d1.cross(d2).norm() / 2;\r\n        }\r\n        template <class T>\r\n        inline bool intersection(const T& line0_p0, const T& line0_p1, const T& line1_p0, const T& line1_p1, double& line0_coordinate, double& line1_coordinate) {\r\n            /*\r\n                notation:\r\n                    v0 := line0_p0\r\n                    v1 := line0_p1\r\n                    w0 := line1_p0\r\n                    w1 := line1_p1\r\n                    s  := line0_coordinate\r\n                    t  := line1_coordinate\r\n                seek for (s, t) which minimizes:\r\n                    |(1 - s) * v0 + s * v1 - (1 - t) * w0 - t * w1|^2\r\n                least square sense:\r\n                    | v1-v0, -w1+w0 | * |s| =~ -v0+w0\r\n                                        |t|\r\n            */\r\n            T d0 = line0_p1 - line0_p0;\r\n            T d1 = line1_p1 - line1_p0;\r\n            T e  = line1_p0 - line0_p0;\r\n            double d0d0 = d0.squaredNorm();\r\n            double d0d1 = d0.dot(d1);\r\n            double d1d1 = d1.squaredNorm();\r\n            Eigen::Matrix2d A;\r\n            A <<\r\n                d0d0, -d0d1,\r\n                -d0d1, d1d1;\r\n            \r\n            if (A.determinant() == 0)\r\n                // two lines are parallel\r\n                return false;\r\n            \r\n            Eigen::Vector2d b(d0.dot(e), -d1.dot(e));\r\n            Eigen::Vector2d st = ((Eigen::Matrix2d)A.inverse()) * b;\r\n            \r\n            line0_coordinate = st[0];\r\n            line1_coordinate = st[1];\r\n            return true;\r\n        }\r\n        template <typename T>\r\n        inline std::vector<T> eigen_vectorx_to_std_vector(const Eigen::Matrix<T, -1, 1>& eigen_vectorx) {\r\n            int n = eigen_vectorx.rows();\r\n            std::vector<T> result(n);\r\n            for (int i = 0; i < n; ++i)\r\n                result[i] = eigen_vectorx[i];\r\n            return result;\r\n        }\r\n        template <typename T>\r\n        inline Eigen::Matrix<T, -1, 1> std_vector_to_eigen_vectorx(const std::vector<T>& std_vector) {\r\n            int n = std_vector.size();\r\n            Eigen::Matrix<T, -1, 1> result = Eigen::Matrix<T, -1, 1>::Zero(n);\r\n            for (int i = 0; i < n; ++i)\r\n                result[i] = std_vector[i];\r\n            return result;\r\n        }\r\n        template <typename TVector>\r\n        inline int max_axis(const TVector& v) {\r\n            int index_max = -1;\r\n            typename TVector::Scalar value_max = -std::numeric_limits<typename TVector::Scalar>::max();\r\n            for (int i = 0; i < v.size(); ++i) {\r\n                if (value_max < v[i]) {\r\n                    value_max = v[i];\r\n                    index_max = i;\r\n                }\r\n            }\r\n            return index_max;\r\n        }\r\n        template <typename TVector>\r\n        inline int min_axis(const TVector& v) {\r\n            int index_min = -1;\r\n            typename TVector::Scalar value_min = std::numeric_limits<typename TVector::Scalar>::max();\r\n            for (int i = 0; i < v.size(); ++i) {\r\n                if (value_min < v[i]) {\r\n                    value_min = v[i];\r\n                    index_min = i;\r\n                }\r\n            }\r\n            return index_min;\r\n        }\r\n        template <typename TVector>\r\n        inline void rotate(TVector& v) {\r\n            TVector tmp(v);\r\n            int n = v.size();\r\n            for (int i = 0; i < n; ++i)\r\n                v[i] = tmp[(i + 1) % n];\r\n        }\r\n        template <typename TVector>\r\n        inline void reverse(TVector& v) {\r\n            TVector tmp(v);\r\n            int n = v.size();\r\n            for (int i = 0; i < n; ++i)\r\n                v[i] = tmp[n - 1 - i];\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/geometry/Camera.h",
    "content": "#pragma once\r\n\r\n#include <Eigen/Core>\r\n\r\nnamespace kt84 {\r\n\r\nstruct Camera {\r\n    enum class DragMode {\r\n        NONE = 0,\r\n        ROTATE,\r\n        PAN,\r\n        ZOOM,\r\n    };\r\n    \r\n    DragMode drag_mode;\r\n    Eigen::Vector3d center;\r\n    Eigen::Vector2i prev_pos;\r\n    int width;\r\n    int height;\r\n    bool auto_flip_y;\r\n    \r\n    Camera()\r\n        : drag_mode(DragMode::NONE)\r\n        , center(0, 0, 0)\r\n        , prev_pos(0, 0)\r\n        , width (0)\r\n        , height(0)\r\n        , auto_flip_y(true)\r\n    {}\r\n    virtual ~Camera() {};\r\n    \r\n    // abstract member function\r\n    virtual void init(const Eigen::Vector3d& eye_, const Eigen::Vector3d& center_, const Eigen::Vector3d& up_) = 0;\r\n    virtual Eigen::Vector3d get_eye() const = 0;\r\n    virtual Eigen::Vector3d get_up () const = 0;\r\n    virtual void mouse_move(int x, int y) = 0;\r\n    virtual void update_center(const Eigen::Vector3d& center_new) {}\r\n    virtual void snap_to_canonical() {}\r\n    \r\n    // non-abstract member function\r\n    void reshape(int width_, int height_) {\r\n        width  = width_;\r\n        height = height_;\r\n    }\r\n    \r\n    inline Eigen::Vector3d center_to_eye() const { return get_eye() - center; }\r\n    inline Eigen::Vector3d eye_to_center() const { return -center_to_eye(); }\r\n    \r\n    void mouse_down(int x, int y, DragMode drag_mode_) {\r\n        if (auto_flip_y) y = height - y;\r\n        prev_pos << x, y;\r\n        drag_mode = drag_mode_;\r\n    }\r\n    \r\n    void mouse_up() { drag_mode = DragMode::NONE; }\r\n    \r\n};\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/geometry/CameraFree.h",
    "content": "#pragma once\r\n\r\n#include \"Camera.h\"\r\n#include \"../eigen_util.h\"\r\n#include <Eigen/Geometry>\r\n\r\nnamespace kt84 {\r\n\r\nstruct CameraFree : public Camera {\r\n    Eigen::Vector3d eye, up;\r\n    \r\n    CameraFree()\r\n        : eye(Eigen::Vector3d::UnitZ())\r\n        , up(Eigen::Vector3d::UnitY())\r\n    {}\r\n    \r\n    void init(const Eigen::Vector3d& eye_, const Eigen::Vector3d& center_, const Eigen::Vector3d& up_) {\r\n        eye    = eye_   ;\r\n        center = center_;\r\n        up     = up_    ;\r\n    }\r\n    Eigen::Vector3d get_eye() const { return eye; }\r\n    Eigen::Vector3d get_up () const { return up ; }\r\n    \r\n    void mouse_move(int x, int y) {\r\n        if (auto_flip_y) y = height - y;\r\n        const int viewport_size = (width + height) / 2;\r\n        \r\n        if (drag_mode == DragMode::NONE)\r\n            return;\r\n        \r\n        Eigen::Vector2i pos(x, y);\r\n        static const double PI = 2.0 * std::asin(1.0);\r\n        switch (drag_mode) {\r\n        case DragMode::ROTATE:\r\n            {\r\n                double theta_x = (2 * PI * (pos.x() - prev_pos.x())) / viewport_size;\r\n                double theta_y = (2 * PI * (pos.y() - prev_pos.y())) / viewport_size;\r\n                \r\n                Eigen::AngleAxisd rot_hrz(-theta_x, up  );\r\n                auto center_to_eye_new = rot_hrz * center_to_eye();\r\n                \r\n                Eigen::Vector3d left = center_to_eye_new.cross(up).normalized();\r\n                Eigen::AngleAxisd rot_vrt(-theta_y, left);\r\n                center_to_eye_new = rot_vrt * center_to_eye_new;\r\n                up = rot_vrt * up;\r\n                \r\n                eye = center + center_to_eye_new;\r\n            }\r\n            break;\r\n        case DragMode::PAN:\r\n            {\r\n                double len = center_to_eye().norm();\r\n                \r\n                Eigen::Vector3d trans_x(eye_to_center().cross(up));\r\n                Eigen::Vector3d trans_y(up);\r\n                trans_x.normalize();\r\n                trans_y.normalize();\r\n                trans_x *= -len * (pos.x() - prev_pos.x()) / viewport_size;\r\n                trans_y *= -len * (pos.y() - prev_pos.y()) / viewport_size;\r\n                \r\n                eye    += trans_x + trans_y;\r\n                center += trans_x + trans_y;\r\n            }\r\n            break;\r\n        case DragMode::ZOOM:\r\n            {\r\n                auto delta = eye_to_center() * (pos.y() - prev_pos.y()) / static_cast<double>(viewport_size);\r\n                eye -= delta;\r\n            }\r\n            break;\r\n        }\r\n        prev_pos = pos;\r\n    }\r\n    \r\n    void update_center(const Eigen::Vector3d& center_new) {\r\n        // find the point closest to center_new between center and eye. update center and r accordingly.\r\n        // center + t * center_to_eye = center_new\r\n        auto d = center_to_eye();\r\n        double t = d.dot(center_new - center) / d.squaredNorm();\r\n        center += t * d;\r\n    }\r\n    void snap_to_canonical() {\r\n        auto d = center_to_eye();\r\n        double dr = d.norm();\r\n        int d_axis = eigen_util::closest_axis(d);\r\n        d[(d_axis + 1) % 3] = d[(d_axis + 2) % 3] = 0;\r\n        d[d_axis] = d[d_axis] < 0 ? -dr : dr;\r\n        eye = center + d;\r\n        int up_axis = eigen_util::closest_axis(up);\r\n        up[(up_axis + 1) % 3] = up[(up_axis + 2) % 3] = 0;\r\n        up[up_axis] = up[up_axis] < 0 ? -1 : 1;\r\n    }\r\n};\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/geometry/CameraUpright.h",
    "content": "#pragma once\r\n\r\n#include \"Camera.h\"\r\n#include \"../util.h\"\r\n#include <Eigen/Geometry>\r\n\r\nnamespace kt84 {\r\n\r\nstruct CameraUpright : public Camera {\r\n    double r, theta, phi;\r\n    \r\n    CameraUpright()\r\n        : r(1)\r\n        , theta(0)\r\n        , phi(0)\r\n    {}\r\n    \r\n    void init(const Eigen::Vector3d& eye, const Eigen::Vector3d& center_, const Eigen::Vector3d& up) {\r\n        center = center_;\r\n        Eigen::Vector3d v = eye - center;\r\n        r = v.norm();\r\n        double r_xz = std::sqrt(v.x() * v.x() + v.z() * v.z());\r\n        \r\n        if (r_xz == 0) {\r\n            bool is_y_positive = v.y() > 0;\r\n            theta = std::atan2(up.x(), up.z()) + (is_y_positive ? util::pi() : 0);\r\n            phi   = (is_y_positive ? 0.5 : -0.5) * util::pi();\r\n        } else {\r\n            theta = std::atan2(v.x(), v.z());\r\n            phi   = std::atan(v.y() / r_xz);\r\n        }\r\n        \r\n        if (up.y() < 0) {\r\n            theta += util::pi();\r\n            phi    = util::pi() - phi;\r\n        }\r\n    }\r\n    \r\n    Eigen::Vector3d get_up() const {\r\n        return Eigen::Vector3d(\r\n            -sin(theta) * sin(phi),\r\n            cos(phi),\r\n            -cos(theta) * sin(phi));\r\n    }\r\n    \r\n    Eigen::Vector3d get_eye() const {\r\n        return center + r * Eigen::Vector3d(\r\n            sin(theta) * cos(phi),\r\n            sin(phi),\r\n            cos(theta) * cos(phi));\r\n    }\r\n    \r\n    void mouse_move(int x, int y) {\r\n        if (auto_flip_y) y = height - y;\r\n        const int viewport_size = (width + height) / 2;\r\n        \r\n        if (drag_mode == DragMode::NONE)\r\n            return;\r\n        \r\n        Eigen::Vector2i pos(x, y);\r\n        switch (drag_mode) {\r\n        case DragMode::ROTATE:\r\n            {\r\n                theta -= (2 * util::pi() * (pos.x() - prev_pos.x())) / viewport_size;\r\n                phi   += (2 * util::pi() * (pos.y() - prev_pos.y())) / viewport_size;\r\n            }\r\n            break;\r\n        case DragMode::PAN:\r\n            {\r\n                Eigen::Vector3d right(cos(theta), 0, -sin(theta));\r\n                center -= (r * (pos.x() - prev_pos.x()) / viewport_size) * right;\r\n                center += (r * (pos.y() - prev_pos.y()) / viewport_size) * get_up();\r\n            }\r\n            break;\r\n        case DragMode::ZOOM:\r\n            {\r\n                r *= 1 - (pos.x() - prev_pos.x() + pos.y() - prev_pos.y()) / static_cast<double>(viewport_size);\r\n            }\r\n            break;\r\n        }\r\n        prev_pos = pos;\r\n    }\r\n    \r\n    void update_center(const Eigen::Vector3d& center_new) {\r\n        // find the point closest to center_new between center and eye. update center and r accordingly.\r\n        // center + t * center_to_eye = center_new\r\n        auto d = center_to_eye();\r\n        double t = d.dot(center_new - center) / d.squaredNorm();\r\n        center += t * d;\r\n        r *= 1 - t;\r\n    }\r\n    void snap_to_canonical() {\r\n        auto snap_to_pi_2 = [] (double& radian) {\r\n            while (radian < 0)\r\n                radian += 2 * util::pi();\r\n            \r\n            double t = radian / (0.5 * util::pi());\r\n            int n = static_cast<int>(t);\r\n            if (t - n > 0.5)\r\n                ++n;\r\n            \r\n            radian = n * 0.5 * util::pi();\r\n        };\r\n        \r\n        snap_to_pi_2(theta);\r\n        snap_to_pi_2(phi  );\r\n    }\r\n};\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/geometry/PointNormal.h",
    "content": "#pragma once\r\n\r\n#include <Eigen/Core>\r\n\r\nnamespace kt84 {\r\n\r\ntypedef Eigen::Matrix<double, 6, 1> PointNormal;\r\ninline double pn_norm(const PointNormal& pn) { return pn.head(3).norm(); }\ninline void   pn_normalize(PointNormal& pn) { pn.tail(3).normalize(); }\ninline PointNormal pn_normalized(const PointNormal& pn) { auto temp = pn; temp.tail(3).normalize(); return temp; }\n\n}\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/geometry/PolylineT.h",
    "content": "#pragma once\n\n#include <Eigen/Core>\n#include <vector>\n#include \"PointNormal.h\"\n#include \"../adjacent_pairs.h\"\n\nnamespace kt84 {\n\ntemplate <int N>\nstruct PolylineT {\n    typedef Eigen::Matrix<double, N, 1> Point;\n    typedef typename std::vector<Point>::iterator               iterator;\n    typedef typename std::vector<Point>::reverse_iterator       reverse_iterator;\n    typedef typename std::vector<Point>::const_iterator         const_iterator;\n    typedef typename std::vector<Point>::const_reverse_iterator const_reverse_iterator;\n    \n    std::vector<Point> points;\n    bool is_loop;\n    \n    PolylineT()\n        : is_loop()\n    {}\n    PolylineT(const std::vector<Point>& points_, bool is_loop_)\n        : points (points_ )\n        , is_loop(is_loop_)\n    {}\n    PolylineT(int size_, bool is_loop_)\n        : points (size_   )\n        , is_loop(is_loop_)\n    {}\n    \n    int size() const { return static_cast<int>(points.size()); }\n    bool empty() const { return points.empty(); }\n    void resize(int size_)                     { points.resize(size_); }\n    void resize(int size_, const Point& point) { points.resize(size_, point); }\n    void clear() { points.clear(); is_loop = false; }\n    void push_back(const Point& point) { points.push_back(point); }\n    void pop_back ()                   { points.pop_back (); }\n    iterator erase(iterator where_) { return points.erase(where_); }\n    iterator erase(iterator first, iterator last) { return points.erase(first, last); }\n    iterator insert(iterator where_, const Point& val) { return points.insert(where_, val); }\n    void     insert(iterator where_, int count, const Point& val) { points.insert(where_, count, val); }\n    template <class InputIterator>\n    void     insert(iterator where_, InputIterator first, InputIterator last) { points.insert(where_, first, last); }\n    iterator                begin()       { return points. begin(); }\n    iterator                end  ()       { return points. end  (); }\n    reverse_iterator       rbegin()       { return points.rbegin(); }\n    reverse_iterator       rend  ()       { return points.rend  (); }\n    const_iterator          begin() const { return points. begin(); }\n    const_iterator          end  () const { return points. end  (); }\n    const_reverse_iterator rbegin() const { return points.rbegin(); }\n    const_reverse_iterator rend  () const { return points.rend  (); }\n          Point& front()       { return points.front(); }\n    const Point& front() const { return points.front(); }\n          Point& back ()       { return points.back (); }\n    const Point& back () const { return points.back (); }\n          Point& operator[](int index)       { return points[index]; }\n    const Point& operator[](int index) const { return points[index]; }\n    \n    void reverse() {\n        if (is_loop) {\n            points.push_back(points.front());\n            std::reverse(points.begin(), points.end());\n            points.pop_back();\n        } else {\n            std::reverse(points.begin(), points.end());\n        }\n    }\n    \n    void offset_front(const Point& target) {\n        Point offset = target - front();\n        front() = target;\n        for (int i = 1; i < size() - 1; ++i) {\n            points[i] += offset * (size() - 1 - i) / (size() - 1.0);\n        }\n    }\n    \n    void offset_back (const Point& target) {\n        Point offset = target - back();\n        back() = target;\n        for (int i = 1; i < size() - 1; ++i) {\n            points[i] += offset * i / (size() - 1.0);\n        }\n    }\n    \n    double length() const {\n        double result = 0;\n        for (auto p : adjacent_pairs(*this, is_loop))\n            result += (p.first - p.second).norm();\n        \n        return result;\n    }\n    \n    void resample() { resample(size()); }\n    void resample_by_length(double segment_length) { resample(std::max<int>(static_cast<int>(length() / segment_length), 3)); }\n    void resample(int target_num_points) {\n        int NN = size();\n        \n        if (NN < 2 || target_num_points < 2)\n            return;\n        \n        if (target_num_points == 2) {\n            points[1] = back();\n            resize(2);\n            return;\n        }\n        \n        PolylineT result(target_num_points, is_loop);\n        \n        if (is_loop) {\n            push_back(front());\n            ++NN;\n        }\n        \n        std::vector<double> src_len_acc(NN, 0);\n        for (int i = 1; i < NN; ++i)\n            src_len_acc[i] = src_len_acc[i - 1] + (points[i] - points[i - 1]).norm();\n        \n        double tgt_len_segment = src_len_acc.back() / (target_num_points - 1.);\n        int src_i = 0;\n        double tgt_len_acc = 0;\n        int index = 0;\n        result[index++] = front();\n        while (true) {\n            while (tgt_len_acc + tgt_len_segment <= src_len_acc[src_i]) {\n                tgt_len_acc += tgt_len_segment;\n                double w1 = (tgt_len_acc - src_len_acc[src_i - 1]) / (src_len_acc[src_i] - src_len_acc[src_i - 1]);\n                double w0 = 1 - w1;\n                Point& p0 = points[src_i - 1];\n                Point& p1 = points[src_i];\n                Point p = p0 * w0 + p1 * w1;\n                result[index++] = p;\n                if (index == target_num_points - 1) break;\n            }\n            \n            if (index == target_num_points - 1) break;\n            \n            while (src_len_acc[src_i] <= tgt_len_acc + tgt_len_segment) {\n                ++src_i;\n            }\n        }\n        result[index++] = back();\n        \n        if (is_loop)\n            result.pop_back();\n        \n        *this = result;\n        return;\n    }\n    void insert_points_per_segment(int num_inserted_points_per_segment = 3) {\n        auto points_temp = points;\n        auto insert_pos = points_temp.begin();\n        for (auto i : adjacent_pairs(*this, is_loop)) {\n            auto d = (i.second - i.first) / (num_inserted_points_per_segment + 1.0);\n            Point p = i.first + d;\n            ++insert_pos;\n            for (int j = 0; j < num_inserted_points_per_segment; ++j, ++insert_pos, p += d)\n                insert_pos = points_temp.insert(insert_pos, p);\n        }\n        points = points_temp;\n    }\n    void smooth(int num_iter = 1, double weight_first_order = 1.0, double weight_second_order = 0.0, double damping = 0.5) {\n        for (int k = 0; k < num_iter; ++k) {\n            auto points_old = points;\n            for (int i = 0; i < size(); ++i) {\n                if (!is_loop && i == 0 || i == size() - 1)\n                    continue;\n                \n                int i_next  = (i + 1) % size();\n                int i_prev  = (i + size() - 1) % size();\n                int i_next2 = (i + 2) % size();\n                int i_prev2 = (i + size() - 2) % size();\n                \n                auto p_prev  = points_old[i_prev ];\n                auto p_next  = points_old[i_next ];\n                auto p_prev2 = points_old[i_prev2];\n                auto p_next2 = points_old[i_next2];\n                \n                Point p_first_order  = (p_prev + p_next) / 2.0;\n                Point p_second_order = (-p_prev2 + 4.0 * p_prev + 4.0 * p_next - p_next2) / 6.0;\n                \n                if (!is_loop && i == 1 || i == size() - 2)\n                    p_second_order = p_first_order;         // undefined\n                \n                Point p_target = (weight_first_order * p_first_order + weight_second_order * p_second_order) / (weight_first_order + weight_second_order);\n                \n                points[i] = damping * points_old[i] + (1 - damping) * p_target;\n            }\n        }\n    }\n    Point point_at(double arc_length_parameter) const {\n        if (arc_length_parameter < 0 || 1 < arc_length_parameter)\n            // arc length parameter should be between 0 and 1\n            return Point::Zero();\n        \n        if (arc_length_parameter == 0) return front();\n        if (arc_length_parameter == 1) return is_loop ? front() : back();\n        \n        const int NN = size();\n        const double target_length = length() * arc_length_parameter;\n        \n        double length_acc = 0;\n        for (int i = 0; i < NN; ++i) {\n            if (i == NN - 1 && !is_loop)\n                break;\n            \n            auto& p0 = points[i];\n            auto& p1 = points[(i + 1) % NN];\n            \n            double segment_length = (p1 - p0).norm();\n            if (length_acc <= target_length && target_length < length_acc + segment_length) {\n                double t = (target_length - length_acc) / segment_length;\n                return (1 - t) * p0 + t * p1;\n            }\n            \n            length_acc += segment_length;\n        }\n        \n        // something wrong happened\n        return Point::Zero();\n    }\n};\n\ntypedef PolylineT<2> Polyline2d;\ntypedef PolylineT<3> Polyline3d;\n\nstruct Polyline_PointNormal {\n    typedef std::vector<PointNormal>::iterator               iterator;\n    typedef std::vector<PointNormal>::reverse_iterator       reverse_iterator;\n    typedef std::vector<PointNormal>::const_iterator         const_iterator;\n    typedef std::vector<PointNormal>::const_reverse_iterator const_reverse_iterator;\n    \n    std::vector<PointNormal> points;\n    bool is_loop;\n    \n    Polyline_PointNormal()\n        : is_loop()\n    {}\n    Polyline_PointNormal(const std::vector<PointNormal>& points_, bool is_loop_)\n        : points (points_ )\n        , is_loop(is_loop_)\n    {}\n    Polyline_PointNormal(int size_, bool is_loop_)\n        : points (size_   )\n        , is_loop(is_loop_)\n    {}\n    \n    int size() const { return static_cast<int>(points.size()); }\n    bool empty() const { return points.empty(); }\n    void resize(int size_)                     { points.resize(size_); }\n    void resize(int size_, const PointNormal& point) { points.resize(size_, point); }\n    void clear() { points.clear(); }\n    void push_back(const PointNormal& point) { points.push_back(point); }\n    void pop_back ()                   { points.pop_back (); }\n    // Changed const_iterator to iterator to meet \"defect\" in standard\n    iterator  erase(iterator where_) { return points.erase(where_); }\n    iterator  erase(iterator first, iterator last) { return points.erase(first, last); }\n    iterator insert(iterator where_, const PointNormal& val) { return points.insert(where_, val); }\n    void     insert(iterator where_, int count, const PointNormal& val) { points.insert(where_, count, val); }\n    template <class InputIterator>\n    void     insert(iterator where_, InputIterator first, InputIterator last) { points.insert(where_, first, last); }\n    iterator                begin()       { return points. begin(); }\n    iterator                end  ()       { return points. end  (); }\n    reverse_iterator       rbegin()       { return points.rbegin(); }\n    reverse_iterator       rend  ()       { return points.rend  (); }\n    const_iterator          begin() const { return points. begin(); }\n    const_iterator          end  () const { return points. end  (); }\n    const_reverse_iterator rbegin() const { return points.rbegin(); }\n    const_reverse_iterator rend  () const { return points.rend  (); }\n          PointNormal& front()       { return points.front(); }\n    const PointNormal& front() const { return points.front(); }\n          PointNormal& back ()       { return points.back (); }\n    const PointNormal& back () const { return points.back (); }\n          PointNormal& operator[](int index)       { return points[index]; }\n    const PointNormal& operator[](int index) const { return points[index]; }\n    \n    void reverse() {\n        if (is_loop) {\n            std::reverse(points.begin(), points.end());\n        } else {\n            points.push_back(points.front());\n            std::reverse(points.begin(), points.end());\n            points.pop_back();\n        }\n    }\n    \n    void offset_front(const PointNormal& target) {\n        PointNormal offset = target - front();\n        front() = target;\n        for (int i = 1; i < size() - 1; ++i) {\n            points[i] += offset * (size() - 1 - i) / (size() - 1.0);\n            pn_normalize(points[i]);\n        }\n    }\n    \n    void offset_back (const PointNormal& target) {\n        PointNormal offset = target - back();\n        back() = target;\n        for (int i = 1; i < size() - 1; ++i) {\n            points[i] += offset * i / (size() - 1.0);\n            pn_normalize(points[i]);\n        }\n    }\n    \n    double length() const {\n        double result = 0;\n        \n        for (auto p : adjacent_pairs(*this, is_loop))\n            result += pn_norm(p.first - p.second);\n        \n        return result;\n    }\n    \n    void resample() { resample(size()); }\n    void resample_by_length(double segment_length) { resample(std::max<int>(static_cast<int>(length() / segment_length), 3)); }\n    void resample(int target_num_points) {\n        int N = size();\n        \n        if (N < 2 || target_num_points < 2)\n            return;\n        \n        if (target_num_points == 2) {\n            points[1] = back();\n            resize(2);\n            return;\n        }\n        \n        Polyline_PointNormal result(target_num_points, is_loop);\n        \n        if (is_loop) {\n            push_back(front());\n            ++N;\n        }\n        \n        std::vector<double> src_len_acc(N, 0);\n        for (int i = 1; i < N; ++i)\n            src_len_acc[i] = src_len_acc[i - 1] + pn_norm(points[i] - points[i - 1]);\n        \n        double tgt_len_segment = src_len_acc.back() / (target_num_points - 1.);\n        int src_i = 0;\n        double tgt_len_acc = 0;\n        int index = 0;\n        result[index++] = front();\n        while (true) {\n            while (tgt_len_acc + tgt_len_segment <= src_len_acc[src_i]) {\n                tgt_len_acc += tgt_len_segment;\n                double w1 = (tgt_len_acc - src_len_acc[src_i - 1]) / (src_len_acc[src_i] - src_len_acc[src_i - 1]);\n                double w0 = 1 - w1;\n                PointNormal& pn0 = points[src_i - 1];\n                PointNormal& pn1 = points[src_i];\n                PointNormal pn = pn0 * w0 + pn1 * w1;\n                pn_normalize(pn);\n                result[index++] = pn;\n                if (index == target_num_points - 1) break;\n            }\n            \n            if (index == target_num_points - 1) break;\n            \n            while (src_len_acc[src_i] <= tgt_len_acc + tgt_len_segment) {\n                ++src_i;\n            }\n        }\n        result[index++] = back();\n        \n        if (is_loop)\n            result.pop_back();\n        \n        *this = result;\n        return;\n    }\n    void insert_points_per_segment(int num_inserted_points_per_segment = 3) {\n        auto points_temp = points;\n        auto insert_pos = points_temp.begin();\n        for (auto i : adjacent_pairs(*this, is_loop)) {\n            auto d = (i.second - i.first) / (num_inserted_points_per_segment + 1.0);\n            PointNormal pn = i.first + d;\n            ++insert_pos;\n            for (int j = 0; j < num_inserted_points_per_segment; ++j, ++insert_pos, pn += d)\n                insert_pos = points_temp.insert(insert_pos, pn_normalized(pn));\n        }\n        points = points_temp;\n    }\n    void smooth(int num_iter = 1, double weight_first_order = 1.0, double weight_second_order = 0.0, double damping = 0.5) {\n        for (int k = 0; k < num_iter; ++k) {\n            auto points_old = points;\n            for (int i = 0; i < size(); ++i) {\n                if (!is_loop && i == 0 || i == size() - 1)\n                    continue;\n                \n                int i_next  = (i + 1) % size();\n                int i_prev  = (i + size() - 1) % size();\n                int i_next2 = (i + 2) % size();\n                int i_prev2 = (i + size() - 2) % size();\n                \n                auto p_prev  = points_old[i_prev ];\n                auto p_next  = points_old[i_next ];\n                auto p_prev2 = points_old[i_prev2];\n                auto p_next2 = points_old[i_next2];\n                \n                PointNormal p_first_order  = (p_prev + p_next) / 2.0;\n                PointNormal p_second_order = (-p_prev2 + 4.0 * p_prev + 4.0 * p_next - p_next2) / 6.0;\n                \n                if (!is_loop && i == 1 || i == size() - 2)\n                    p_second_order = p_first_order;         // undefined\n                \n                PointNormal p_target = (weight_first_order * p_first_order + weight_second_order * p_second_order) / (weight_first_order + weight_second_order);\n                \n                points[i] = damping * points_old[i] + (1 - damping) * p_target;\n                pn_normalize(points[i]);\n            }\n        }\n    }\n    PointNormal point_at(double arc_length_parameter) const {\n        if (arc_length_parameter < 0 || 1 < arc_length_parameter)\n            // arc length parameter should be between 0 and 1\n            return PointNormal::Zero();\n        \n        if (arc_length_parameter == 0) return front();\n        if (arc_length_parameter == 1) return is_loop ? front() : back();\n        \n        const int N = size();\n        const double target_length = length() * arc_length_parameter;\n        \n        double length_acc = 0;\n        for (int i = 0; i < N; ++i) {\n            if (i == N - 1 && !is_loop)\n                break;\n            \n            auto& pn0 = points[i];\n            auto& pn1 = points[(i + 1) % N];\n            \n            double segment_length = pn_norm(pn1 - pn0);\n            if (length_acc <= target_length && target_length < length_acc + segment_length) {\n                double t = (target_length - length_acc) / segment_length;\n                PointNormal pn = (1 - t) * pn0 + t * pn1;\n                pn_normalize(pn);\n                return pn;\n            }\n            \n            length_acc += segment_length;\n        }\n        \n        // something wrong happened\n        return PointNormal::Zero();\n    }\n};\n\n\n}\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/glut_util.h",
    "content": "#pragma once\r\n#if defined(__APPLE__) && defined(__MACH__)\r\n#   include <GLUT/glut.h>\r\n#else\r\n#   include <GL/glut.h>\r\n#endif\r\n\r\nnamespace kt84 {\r\n    namespace glut_util {\r\n        namespace defaultcb {\r\n            inline void display_pre() {\r\n                glPushAttrib(GL_ALL_ATTRIB_BITS);\r\n                glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);\r\n            }\r\n            inline void display_post() {\r\n                glPopAttrib();\r\n#ifdef TW_INCLUDED\r\n                TwDraw();\r\n#endif\r\n                glutSwapBuffers();\r\n                glutReportErrors();\r\n            }\r\n            inline void reshape(int width, int height) {\r\n                glViewport(0, 0, width, height);\r\n#ifdef TW_INCLUDED\r\n                TwWindowSize(width, height);\r\n#endif\r\n            }\r\n            inline void keyboard(unsigned char key, int x, int y) {\r\n#ifdef TW_INCLUDED\r\n                if (TwEventKeyboardGLUT(key, x, y)) return glutPostRedisplay();\r\n#endif\r\n            }\r\n            inline void special(int key, int x, int y) {\r\n#ifdef TW_INCLUDED\r\n                if (TwEventSpecialGLUT(key, x, y)) return glutPostRedisplay();\r\n#endif\r\n            }\r\n            inline void mouse(int glut_button, int state, int x, int y) {\r\n#ifdef TW_INCLUDED\r\n                if (TwEventMouseButtonGLUT(glut_button, state, x, y)) return glutPostRedisplay();\r\n#endif\r\n            }\r\n            inline void motion(int x, int y) {\r\n#ifdef TW_INCLUDED\r\n                if (TwEventMouseMotionGLUT(x, y)) return glutPostRedisplay();\r\n#endif\r\n            }\r\n        }\r\n        inline void init(\r\n            int argc, char* argv[],\r\n            unsigned int display_mode = GLUT_DOUBLE | GLUT_RGBA,\r\n            double screen_window_size_ratio = 0.5,\r\n            bool is_window_centered = true,\r\n            const char* window_title = \"glut_window\",\r\n            void (*display_pre)()                                   = defaultcb::display_pre,\r\n            void (*display_main)()                                  = [] () {},\r\n            void (*display_post)()                                  = defaultcb::display_post,\r\n            void (*reshape)(int width, int height)                  = defaultcb::reshape,\r\n            void (*keyboard)(unsigned char key, int x, int y)       = defaultcb::keyboard,\r\n            void (*keyboardup)(unsigned char key, int x, int y)     = nullptr,\r\n            void (*special)(int key, int x, int y)                  = defaultcb::special,\r\n            void (*mouse)(int glut_button, int state, int x, int y) = defaultcb::mouse,\r\n            void (*motion)(int x, int y)                            = defaultcb::motion, \r\n            void (*passive_motion)(int x, int y)                    = defaultcb::motion,\r\n            void (*idle)()                                          = nullptr)\r\n        {\r\n            glutInit(&argc, argv);\r\n            \r\n            // Create window\r\n            glutInitDisplayMode (display_mode);\r\n            int screen_width  = glutGet(GLUT_SCREEN_WIDTH );\r\n            int screen_height = glutGet(GLUT_SCREEN_HEIGHT);\r\n            int window_width  = static_cast<int>(screen_width  * screen_window_size_ratio);\r\n            int window_height = static_cast<int>(screen_height * screen_window_size_ratio);\r\n            glutInitWindowSize(window_width, window_height);\r\n            if (is_window_centered) {\r\n                int screen_center_x = screen_width  / 2;\r\n                int screen_center_y = screen_height / 2;\r\n                glutInitWindowPosition(screen_center_x - window_width / 2, screen_center_y - window_height / 2);\r\n            }\r\n            glutCreateWindow(window_title);\r\n            \r\n            // Register callback functions\r\n            static auto static_display_pre  = display_pre;\r\n            static auto static_display_main = display_main;\r\n            static auto static_display_post = display_post;\r\n            glutDisplayFunc([] () {\r\n                static_display_pre();\r\n                static_display_main();\r\n                static_display_post();\r\n            });\r\n            glutReshapeFunc(reshape);\r\n            glutKeyboardFunc(keyboard);\r\n            glutKeyboardUpFunc(keyboardup);\r\n            glutSpecialFunc(special);\r\n            glutMouseFunc(mouse);\r\n            glutMotionFunc(motion);\r\n            glutPassiveMotionFunc(passive_motion);\r\n            glutIdleFunc(idle);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/graphics/DisplayList.h",
    "content": "#pragma once\r\n\r\n#include <GL/glew.h>\r\n\r\nnamespace kt84 {\r\n\r\nstruct DisplayList {\r\n    unsigned int list;\r\n    bool is_valid;\r\n    \r\n    DisplayList()\r\n        : list()\r\n        , is_valid()\r\n    {}\r\n    void invalidate() { is_valid = false; }\r\n    template <typename TRenderFunc>\r\n    void render(TRenderFunc renderFunc) {\r\n        if (!is_valid) {\r\n            if (!list)\r\n                list = glGenLists(1);\r\n            \r\n            glNewList(list, GL_COMPILE);\r\n            renderFunc();\r\n            glEndList();\r\n            \r\n            is_valid = true;\r\n        }\r\n        glCallList(list);\r\n    }\r\n};\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/graphics/FramebufferObject.h",
    "content": "#pragma once\r\n#include <gl/glew.h>\r\n#include \"TextureObjectT.h\"\r\n#include \"RenderbufferObject.h\"\r\n\r\nnamespace kt84 {\r\n\r\nstruct FramebufferObject {\r\n    GLuint handle;\n    \n    FramebufferObject()\n        : handle(0)\n    {}\n    \n    void init() { glGenFramebuffersEXT(1, &handle); }\n    \n    void bind() const { glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, handle); }\n    \n    static void unbind() { glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); }\n    \n    bool is_bound() const {\n        GLint current_handle;\n        glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, &current_handle);\n        return handle == current_handle;\n    }\n    \n    template <GLenum Target>\r\n    static void attach_texture(GLenum attachment, const TextureObjectT<Target>& texture) {\n        glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, attachment, Target, texture.handle, 0);\n    }\n    template <GLenum Target>\r\n    static void detach_texture(GLenum attachment, const TextureObjectT<Target>& texture) {\n        glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, attachment, Target, 0, 0);\n    }\n    \n    static void attach_renderbuffer(GLenum attachment, const RenderbufferObject& renderbuffer) {\n        glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, attachment, GL_RENDERBUFFER_EXT, renderbuffer.handle);\n    }\n    static void detach_renderbuffer(GLenum attachment) {\n        glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, attachment, GL_RENDERBUFFER_EXT, 0);\n    }\n};\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/graphics/ParamName2.1.inl",
    "content": "// returns one value, the number of alpha bitplanes in the accumulation buffer.\r\nACCUM_ALPHA_BITS = GL_ACCUM_ALPHA_BITS,\r\n// returns one value, the number of blue bitplanes in the accumulation buffer.\r\nACCUM_BLUE_BITS = GL_ACCUM_BLUE_BITS,\r\n// returns four values: the red, green, blue, and alpha values used to clear the accumulation buffer. Integer values, if requested, are linearly mapped from the internal floating-point representation such that 1.0 returns the most positive representable integer value, and -1.0 returns the most negative representable integer value. The initial value is (0, 0, 0, 0). See glClearAccum.\r\nACCUM_CLEAR_VALUE = GL_ACCUM_CLEAR_VALUE,\r\n// returns one value, the number of green bitplanes in the accumulation buffer.\r\nACCUM_GREEN_BITS = GL_ACCUM_GREEN_BITS,\r\n// returns one value, the number of red bitplanes in the accumulation buffer.\r\nACCUM_RED_BITS = GL_ACCUM_RED_BITS,\r\n// returns a single value indicating the active multitexture unit. The initial value is GL_TEXTURE0. See glActiveTexture.\r\nACTIVE_TEXTURE = GL_ACTIVE_TEXTURE,\r\n// returns two values, the smallest and largest supported sizes for aliased points.\r\nALIASED_POINT_SIZE_RANGE = GL_ALIASED_POINT_SIZE_RANGE,\r\n// returns two values, the smallest and largest supported widths for aliased lines.\r\nALIASED_LINE_WIDTH_RANGE = GL_ALIASED_LINE_WIDTH_RANGE,\r\n// returns one value, the alpha bias factor used during pixel transfers. The initial value is 0. See glPixelTransfer.\r\nALPHA_BIAS = GL_ALPHA_BIAS,\r\n// returns one value, the number of alpha bitplanes in each color buffer.\r\nALPHA_BITS = GL_ALPHA_BITS,\r\n// returns one value, the alpha scale factor used during pixel transfers. The initial value is 1. See glPixelTransfer.\r\nALPHA_SCALE = GL_ALPHA_SCALE,\r\n// returns a single boolean value indicating whether alpha testing of fragments is enabled. The initial value is GL_FALSE. See glAlphaFunc.\r\nALPHA_TEST = GL_ALPHA_TEST,\r\n// returns one value, the symbolic name of the alpha test function. The initial value is GL_ALWAYS. See glAlphaFunc.\r\nALPHA_TEST_FUNC = GL_ALPHA_TEST_FUNC,\r\n// returns one value, the reference value for the alpha test. The initial value is 0. See glAlphaFunc. An integer value, if requested, is linearly mapped from the internal floating-point representation such that 1.0 returns the most positive representable integer value, and -1.0 returns the most negative representable integer value.\r\nALPHA_TEST_REF = GL_ALPHA_TEST_REF,\r\n// returns a single value, the name of the buffer object currently bound to the target GL_ARRAY_BUFFER. If no buffer object is bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\nARRAY_BUFFER_BINDING = GL_ARRAY_BUFFER_BINDING,\r\n// returns one value, the depth of the attribute stack. If the stack is empty, 0 is returned. The initial value is 0. See glPushAttrib.\r\nATTRIB_STACK_DEPTH = GL_ATTRIB_STACK_DEPTH,\r\n// returns a single boolean value indicating whether 2D map evaluation automatically generates surface normals. The initial value is GL_FALSE. See glMap2.\r\nAUTO_NORMAL = GL_AUTO_NORMAL,\r\n// returns one value, the number of auxiliary color buffers available.\r\nAUX_BUFFERS = GL_AUX_BUFFERS,\r\n// returns a single boolean value indicating whether blending is enabled. The initial value is GL_FALSE. See glBlendFunc.\r\nBLEND = GL_BLEND,\r\n// returns four values, the red, green, blue, and alpha values which are the components of the blend color. See glBlendColor.\r\nBLEND_COLOR = GL_BLEND_COLOR,\r\n// returns one value, the symbolic constant identifying the alpha destination blend function. The initial value is GL_ZERO. See glBlendFunc and glBlendFuncSeparate.\r\nBLEND_DST_ALPHA = GL_BLEND_DST_ALPHA,\r\n// returns one value, the symbolic constant identifying the RGB destination blend function. The initial value is GL_ZERO. See glBlendFunc and glBlendFuncSeparate.\r\nBLEND_DST_RGB = GL_BLEND_DST_RGB,\r\n// returns one value, a symbolic constant indicating whether the RGB blend equation is GL_FUNC_ADD, GL_FUNC_SUBTRACT, GL_FUNC_REVERSE_SUBTRACT, GL_MIN or GL_MAX. See glBlendEquationSeparate.\r\nBLEND_EQUATION_RGB = GL_BLEND_EQUATION_RGB,\r\n// returns one value, a symbolic constant indicating whether the Alpha blend equation is GL_FUNC_ADD, GL_FUNC_SUBTRACT, GL_FUNC_REVERSE_SUBTRACT, GL_MIN or GL_MAX. See glBlendEquationSeparate.\r\nBLEND_EQUATION_ALPHA = GL_BLEND_EQUATION_ALPHA,\r\n// returns one value, the symbolic constant identifying the alpha source blend function. The initial value is GL_ONE. See glBlendFunc and glBlendFuncSeparate.\r\nBLEND_SRC_ALPHA = GL_BLEND_SRC_ALPHA,\r\n// returns one value, the symbolic constant identifying the RGB source blend function. The initial value is GL_ONE. See glBlendFunc and glBlendFuncSeparate.\r\nBLEND_SRC_RGB = GL_BLEND_SRC_RGB,\r\n// returns one value, the blue bias factor used during pixel transfers. The initial value is 0. See glPixelTransfer.\r\nBLUE_BIAS = GL_BLUE_BIAS,\r\n// returns one value, the number of blue bitplanes in each color buffer.\r\nBLUE_BITS = GL_BLUE_BITS,\r\n// returns one value, the blue scale factor used during pixel transfers. The initial value is 1. See glPixelTransfer.\r\nBLUE_SCALE = GL_BLUE_SCALE,\r\n// returns a single integer value indicating the current client active multitexture unit. The initial value is GL_TEXTURE0. See glClientActiveTexture.\r\nCLIENT_ACTIVE_TEXTURE = GL_CLIENT_ACTIVE_TEXTURE,\r\n// returns one value indicating the depth of the attribute stack. The initial value is 0. See glPushClientAttrib.\r\nCLIENT_ATTRIB_STACK_DEPTH = GL_CLIENT_ATTRIB_STACK_DEPTH,\r\n// returns a single boolean value indicating whether the specified clipping plane is enabled. The initial value is GL_FALSE. See glClipPlane.\r\nCLIP_PLANE0 = GL_CLIP_PLANE0,\r\nCLIP_PLANE1 = GL_CLIP_PLANE1,\r\nCLIP_PLANE2 = GL_CLIP_PLANE2,\r\nCLIP_PLANE3 = GL_CLIP_PLANE3,\r\nCLIP_PLANE4 = GL_CLIP_PLANE4,\r\nCLIP_PLANE5 = GL_CLIP_PLANE5,\r\n// returns a single boolean value indicating whether the color array is enabled. The initial value is GL_FALSE. See glColorPointer.\r\nCOLOR_ARRAY = GL_COLOR_ARRAY,\r\n// returns a single value, the name of the buffer object associated with the color array. This buffer object would have been bound to the target GL_ARRAY_BUFFER at the time of the most recent call to glColorPointer. If no buffer object was bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\nCOLOR_ARRAY_BUFFER_BINDING = GL_COLOR_ARRAY_BUFFER_BINDING,\r\n// returns one value, the number of components per color in the color array. The initial value is 4. See glColorPointer.\r\nCOLOR_ARRAY_SIZE = GL_COLOR_ARRAY_SIZE,\r\n// returns one value, the byte offset between consecutive colors in the color array. The initial value is 0. See glColorPointer.\r\nCOLOR_ARRAY_STRIDE = GL_COLOR_ARRAY_STRIDE,\r\n// returns one value, the data type of each component in the color array. The initial value is GL_FLOAT. See glColorPointer.\r\nCOLOR_ARRAY_TYPE = GL_COLOR_ARRAY_TYPE,\r\n// returns four values: the red, green, blue, and alpha values used to clear the color buffers. Integer values, if requested, are linearly mapped from the internal floating-point representation such that 1.0 returns the most positive representable integer value, and -1.0 returns the most negative representable integer value. The initial value is (0, 0, 0, 0). See glClearColor.\r\nCOLOR_CLEAR_VALUE = GL_COLOR_CLEAR_VALUE,\r\n// returns a single boolean value indicating whether a fragment's RGBA color values are merged into the framebuffer using a logical operation. The initial value is GL_FALSE. See glLogicOp.\r\nCOLOR_LOGIC_OP = GL_COLOR_LOGIC_OP,\r\n// returns a single boolean value indicating whether one or more material parameters are tracking the current color. The initial value is GL_FALSE. See glColorMaterial.\r\nCOLOR_MATERIAL = GL_COLOR_MATERIAL,\r\n// returns one value, a symbolic constant indicating which materials have a parameter that is tracking the current color. The initial value is GL_FRONT_AND_BACK. See glColorMaterial.\r\nCOLOR_MATERIAL_FACE = GL_COLOR_MATERIAL_FACE,\r\n// returns one value, a symbolic constant indicating which material parameters are tracking the current color. The initial value is GL_AMBIENT_AND_DIFFUSE. See glColorMaterial.\r\nCOLOR_MATERIAL_PARAMETER = GL_COLOR_MATERIAL_PARAMETER,\r\n// returns sixteen values: the color matrix on the top of the color matrix stack. Initially this matrix is the identity matrix. See glPushMatrix.\r\nCOLOR_MATRIX = GL_COLOR_MATRIX,\r\n// returns one value, the maximum supported depth of the projection matrix stack. The value must be at least 2. See glPushMatrix.\r\nCOLOR_MATRIX_STACK_DEPTH = GL_COLOR_MATRIX_STACK_DEPTH,\r\n// returns a single boolean value indicating whether primary and secondary color sum is enabled. See glSecondaryColor.\r\nCOLOR_SUM = GL_COLOR_SUM,\r\n// returns a single boolean value indicating whether the color table lookup is enabled. See glColorTable.\r\nCOLOR_TABLE = GL_COLOR_TABLE,\r\n// returns four boolean values: the red, green, blue, and alpha write enables for the color buffers. The initial value is (GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE). See glColorMask.\r\nCOLOR_WRITEMASK = GL_COLOR_WRITEMASK,\r\n// returns a list of symbolic constants of length GL_NUM_COMPRESSED_TEXTURE_FORMATS indicating which compressed texture formats are available. See glCompressedTexImage2D.\r\nCOMPRESSED_TEXTURE_FORMATS = GL_COMPRESSED_TEXTURE_FORMATS,\r\n// returns a single boolean value indicating whether 1D convolution is enabled. The initial value is GL_FALSE. See glConvolutionFilter1D.\r\nCONVOLUTION_1D = GL_CONVOLUTION_1D,\r\n// returns a single boolean value indicating whether 2D convolution is enabled. The initial value is GL_FALSE. See glConvolutionFilter2D.\r\nCONVOLUTION_2D = GL_CONVOLUTION_2D,\r\n// returns a single boolean value indicating whether polygon culling is enabled. The initial value is GL_FALSE. See glCullFace.\r\nCULL_FACE = GL_CULL_FACE,\r\n// returns one value, a symbolic constant indicating which polygon faces are to be culled. The initial value is GL_BACK. See glCullFace.\r\nCULL_FACE_MODE = GL_CULL_FACE_MODE,\r\n// returns four values: the red, green, blue, and alpha values of the current color. Integer values, if requested, are linearly mapped from the internal floating-point representation such that 1.0 returns the most positive representable integer value, and -1.0 returns the most negative representable integer value. The initial value is (1, 1, 1, 1). See glColor.\r\nCURRENT_COLOR = GL_CURRENT_COLOR,\r\n// returns one value, the current fog coordinate. The initial value is 0. See glFogCoord.\r\nCURRENT_FOG_COORD = GL_CURRENT_FOG_COORD,\r\n// returns one value, the current color index. The initial value is 1. See glIndex.\r\nCURRENT_INDEX = GL_CURRENT_INDEX,\r\n// returns three values: the x, y, and z values of the current normal. Integer values, if requested, are linearly mapped from the internal floating-point representation such that 1.0 returns the most positive representable integer value, and -1.0 returns the most negative representable integer value. The initial value is (0, 0, 1). See glNormal.\r\nCURRENT_NORMAL = GL_CURRENT_NORMAL,\r\n// returns one value, the name of the program object that is currently active, or 0 if no program object is active. See glUseProgram.\r\nCURRENT_PROGRAM = GL_CURRENT_PROGRAM,\r\n// returns four values: the red, green, blue, and alpha color values of the current raster position. Integer values, if requested, are linearly mapped from the internal floating-point representation such that 1.0 returns the most positive representable integer value, and -1.0 returns the most negative representable integer value. The initial value is (1, 1, 1, 1). See glRasterPos.\r\nCURRENT_RASTER_COLOR = GL_CURRENT_RASTER_COLOR,\r\n// returns one value, the distance from the eye to the current raster position. The initial value is 0. See glRasterPos.\r\nCURRENT_RASTER_DISTANCE = GL_CURRENT_RASTER_DISTANCE,\r\n// returns one value, the color index of the current raster position. The initial value is 1. See glRasterPos.\r\nCURRENT_RASTER_INDEX = GL_CURRENT_RASTER_INDEX,\r\n// returns four values: the x, y, z, and w components of the current raster position. x, y, and z are in window coordinates, and w is in clip coordinates. The initial value is (0, 0, 0, 1). See glRasterPos.\r\nCURRENT_RASTER_POSITION = GL_CURRENT_RASTER_POSITION,\r\n// returns a single boolean value indicating whether the current raster position is valid. The initial value is GL_TRUE. See glRasterPos.\r\nCURRENT_RASTER_POSITION_VALID = GL_CURRENT_RASTER_POSITION_VALID,\r\n// returns four values: the red, green, blue, and alpha secondary color values of the current raster position. Integer values, if requested, are linearly mapped from the internal floating-point representation such that 1.0 returns the most positive representable integer value, and -1.0 returns the most negative representable integer value. The initial value is (1, 1, 1, 1). See glRasterPos.\r\nCURRENT_RASTER_SECONDARY_COLOR = GL_CURRENT_RASTER_SECONDARY_COLOR,\r\n// returns four values: the s, t, r, and q texture coordinates of the current raster position. The initial value is (0, 0, 0, 1). See glRasterPos and glMultiTexCoord.\r\nCURRENT_RASTER_TEXTURE_COORDS = GL_CURRENT_RASTER_TEXTURE_COORDS,\r\n// returns four values: the red, green, blue, and alpha values of the current secondary color. Integer values, if requested, are linearly mapped from the internal floating-point representation such that 1.0 returns the most positive representable integer value, and -1.0 returns the most negative representable integer value. The initial value is (0, 0, 0, 0). See glSecondaryColor.\r\nCURRENT_SECONDARY_COLOR = GL_CURRENT_SECONDARY_COLOR,\r\n// returns four values: the s, t, r, and q current texture coordinates. The initial value is (0, 0, 0, 1). See glMultiTexCoord.\r\nCURRENT_TEXTURE_COORDS = GL_CURRENT_TEXTURE_COORDS,\r\n// returns one value, the depth bias factor used during pixel transfers. The initial value is 0. See glPixelTransfer.\r\nDEPTH_BIAS = GL_DEPTH_BIAS,\r\n// returns one value, the number of bitplanes in the depth buffer.\r\nDEPTH_BITS = GL_DEPTH_BITS,\r\n// returns one value, the value that is used to clear the depth buffer. Integer values, if requested, are linearly mapped from the internal floating-point representation such that 1.0 returns the most positive representable integer value, and -1.0 returns the most negative representable integer value. The initial value is 1. See glClearDepth.\r\nDEPTH_CLEAR_VALUE = GL_DEPTH_CLEAR_VALUE,\r\n// returns one value, the symbolic constant that indicates the depth comparison function. The initial value is GL_LESS. See glDepthFunc.\r\nDEPTH_FUNC = GL_DEPTH_FUNC,\r\n// returns two values: the near and far mapping limits for the depth buffer. Integer values, if requested, are linearly mapped from the internal floating-point representation such that 1.0 returns the most positive representable integer value, and -1.0 returns the most negative representable integer value. The initial value is (0, 1). See glDepthRange.\r\nDEPTH_RANGE = GL_DEPTH_RANGE,\r\n// returns one value, the depth scale factor used during pixel transfers. The initial value is 1. See glPixelTransfer.\r\nDEPTH_SCALE = GL_DEPTH_SCALE,\r\n// returns a single boolean value indicating whether depth testing of fragments is enabled. The initial value is GL_FALSE. See glDepthFunc and glDepthRange.\r\nDEPTH_TEST = GL_DEPTH_TEST,\r\n// returns a single boolean value indicating if the depth buffer is enabled for writing. The initial value is GL_TRUE. See glDepthMask.\r\nDEPTH_WRITEMASK = GL_DEPTH_WRITEMASK,\r\n// returns a single boolean value indicating whether dithering of fragment colors and indices is enabled. The initial value is GL_TRUE.\r\nDITHER = GL_DITHER,\r\n// returns a single boolean value indicating whether double buffering is supported.\r\nDOUBLEBUFFER = GL_DOUBLEBUFFER,\r\n// returns one value, a symbolic constant indicating which buffers are being drawn to. See glDrawBuffer. The initial value is GL_BACK if there are back buffers, otherwise it is GL_FRONT.\r\nDRAW_BUFFER = GL_DRAW_BUFFER,\r\n// returns one value, a symbolic constant indicating which buffers are being drawn to by the corresponding output color. See glDrawBuffers. The initial value of GL_DRAW_BUFFER0 is GL_BACK if there are back buffers, otherwise it is GL_FRONT. The initial values of draw buffers for all other output colors is GL_NONE.\r\nDRAW_BUFFER0  = GL_DRAW_BUFFER0 ,\r\nDRAW_BUFFER1  = GL_DRAW_BUFFER1 ,\r\nDRAW_BUFFER2  = GL_DRAW_BUFFER2 ,\r\nDRAW_BUFFER3  = GL_DRAW_BUFFER3 ,\r\nDRAW_BUFFER4  = GL_DRAW_BUFFER4 ,\r\nDRAW_BUFFER5  = GL_DRAW_BUFFER5 ,\r\nDRAW_BUFFER6  = GL_DRAW_BUFFER6 ,\r\nDRAW_BUFFER7  = GL_DRAW_BUFFER7 ,\r\nDRAW_BUFFER8  = GL_DRAW_BUFFER8 ,\r\nDRAW_BUFFER9  = GL_DRAW_BUFFER9 ,\r\nDRAW_BUFFER10 = GL_DRAW_BUFFER10,\r\nDRAW_BUFFER11 = GL_DRAW_BUFFER11,\r\nDRAW_BUFFER12 = GL_DRAW_BUFFER12,\r\nDRAW_BUFFER13 = GL_DRAW_BUFFER13,\r\nDRAW_BUFFER14 = GL_DRAW_BUFFER14,\r\nDRAW_BUFFER15 = GL_DRAW_BUFFER15,\r\n// returns a single boolean value indicating whether the current edge flag is GL_TRUE or GL_FALSE. The initial value is GL_TRUE. See glEdgeFlag.\r\nEDGE_FLAG = GL_EDGE_FLAG,\r\n// returns a single boolean value indicating whether the edge flag array is enabled. The initial value is GL_FALSE. See glEdgeFlagPointer.\r\nEDGE_FLAG_ARRAY = GL_EDGE_FLAG_ARRAY,\r\n// returns a single value, the name of the buffer object associated with the edge flag array. This buffer object would have been bound to the target GL_ARRAY_BUFFER at the time of the most recent call to glEdgeFlagPointer. If no buffer object was bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\nEDGE_FLAG_ARRAY_BUFFER_BINDING = GL_EDGE_FLAG_ARRAY_BUFFER_BINDING,\r\n// returns one value, the byte offset between consecutive edge flags in the edge flag array. The initial value is 0. See glEdgeFlagPointer.\r\nEDGE_FLAG_ARRAY_STRIDE = GL_EDGE_FLAG_ARRAY_STRIDE,\r\n// returns a single value, the name of the buffer object currently bound to the target GL_ELEMENT_ARRAY_BUFFER. If no buffer object is bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\nELEMENT_ARRAY_BUFFER_BINDING = GL_ELEMENT_ARRAY_BUFFER_BINDING,\r\n// returns one value, the size of the feedback buffer. See glFeedbackBuffer.\r\nFEEDBACK_BUFFER_SIZE = GL_FEEDBACK_BUFFER_SIZE,\r\n// returns one value, the type of the feedback buffer. See glFeedbackBuffer.\r\nFEEDBACK_BUFFER_TYPE = GL_FEEDBACK_BUFFER_TYPE,\r\n// returns a single boolean value indicating whether fogging is enabled. The initial value is GL_FALSE. See glFog.\r\nFOG = GL_FOG,\r\n// returns a single boolean value indicating whether the fog coordinate array is enabled. The initial value is GL_FALSE. See glFogCoordPointer.\r\nFOG_COORD_ARRAY = GL_FOG_COORD_ARRAY,\r\n// returns a single value, the name of the buffer object associated with the fog coordinate array. This buffer object would have been bound to the target GL_ARRAY_BUFFER at the time of the most recent call to glFogCoordPointer. If no buffer object was bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\nFOG_COORD_ARRAY_BUFFER_BINDING = GL_FOG_COORD_ARRAY_BUFFER_BINDING,\r\n// returns one value, the byte offset between consecutive fog coordinates in the fog coordinate array. The initial value is 0. See glFogCoordPointer.\r\nFOG_COORD_ARRAY_STRIDE = GL_FOG_COORD_ARRAY_STRIDE,\r\n// returns one value, the type of the fog coordinate array. The initial value is GL_FLOAT. See glFogCoordPointer.\r\nFOG_COORD_ARRAY_TYPE = GL_FOG_COORD_ARRAY_TYPE,\r\n// returns one value, a symbolic constant indicating the source of the fog coordinate. The initial value is GL_FRAGMENT_DEPTH. See glFog.\r\nFOG_COORD_SRC = GL_FOG_COORD_SRC,\r\n// returns four values: the red, green, blue, and alpha components of the fog color. Integer values, if requested, are linearly mapped from the internal floating-point representation such that 1.0 returns the most positive representable integer value, and -1.0 returns the most negative representable integer value. The initial value is (0, 0, 0, 0). See glFog.\r\nFOG_COLOR = GL_FOG_COLOR,\r\n// returns one value, the fog density parameter. The initial value is 1. See glFog.\r\nFOG_DENSITY = GL_FOG_DENSITY,\r\n// returns one value, the end factor for the linear fog equation. The initial value is 1. See glFog.\r\nFOG_END = GL_FOG_END,\r\n// returns one value, a symbolic constant indicating the mode of the fog hint. The initial value is GL_DONT_CARE. See glHint.\r\nFOG_HINT = GL_FOG_HINT,\r\n// returns one value, the fog color index. The initial value is 0. See glFog.\r\nFOG_INDEX = GL_FOG_INDEX,\r\n// returns one value, a symbolic constant indicating which fog equation is selected. The initial value is GL_EXP. See glFog.\r\nFOG_MODE = GL_FOG_MODE,\r\n// returns one value, the start factor for the linear fog equation. The initial value is 0. See glFog.\r\nFOG_START = GL_FOG_START,\r\n// returns one value, a symbolic constant indicating the mode of the derivative accuracy hint for fragment shaders. The initial value is GL_DONT_CARE. See glHint.\r\nFRAGMENT_SHADER_DERIVATIVE_HINT = GL_FRAGMENT_SHADER_DERIVATIVE_HINT,\r\n// returns one value, a symbolic constant indicating whether clockwise or counterclockwise polygon winding is treated as front-facing. The initial value is GL_CCW. See glFrontFace.\r\nFRONT_FACE = GL_FRONT_FACE,\r\n// returns one value, a symbolic constant indicating the mode of the mipmap generation filtering hint. The initial value is GL_DONT_CARE. See glHint.\r\nGENERATE_MIPMAP_HINT = GL_GENERATE_MIPMAP_HINT,\r\n// returns one value, the green bias factor used during pixel transfers. The initial value is 0.\r\nGREEN_BIAS = GL_GREEN_BIAS,\r\n// returns one value, the number of green bitplanes in each color buffer.\r\nGREEN_BITS = GL_GREEN_BITS,\r\n// returns one value, the green scale factor used during pixel transfers. The initial value is 1. See glPixelTransfer.\r\nGREEN_SCALE = GL_GREEN_SCALE,\r\n// returns a single boolean value indicating whether histogram is enabled. The initial value is GL_FALSE. See glHistogram.\r\nHISTOGRAM = GL_HISTOGRAM,\r\n// returns a single boolean value indicating whether the color index array is enabled. The initial value is GL_FALSE. See glIndexPointer.\r\nINDEX_ARRAY = GL_INDEX_ARRAY,\r\n// returns a single value, the name of the buffer object associated with the color index array. This buffer object would have been bound to the target GL_ARRAY_BUFFER at the time of the most recent call to glIndexPointer. If no buffer object was bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\nINDEX_ARRAY_BUFFER_BINDING = GL_INDEX_ARRAY_BUFFER_BINDING,\r\n// returns one value, the byte offset between consecutive color indexes in the color index array. The initial value is 0. See glIndexPointer.\r\nINDEX_ARRAY_STRIDE = GL_INDEX_ARRAY_STRIDE,\r\n// returns one value, the data type of indexes in the color index array. The initial value is GL_FLOAT. See glIndexPointer.\r\nINDEX_ARRAY_TYPE = GL_INDEX_ARRAY_TYPE,\r\n// returns one value, the number of bitplanes in each color index buffer.\r\nINDEX_BITS = GL_INDEX_BITS,\r\n// returns one value, the color index used to clear the color index buffers. The initial value is 0. See glClearIndex.\r\nINDEX_CLEAR_VALUE = GL_INDEX_CLEAR_VALUE,\r\n// returns a single boolean value indicating whether a fragment's index values are merged into the framebuffer using a logical operation. The initial value is GL_FALSE. See glLogicOp.\r\nINDEX_LOGIC_OP = GL_INDEX_LOGIC_OP,\r\n// returns a single boolean value indicating whether the GL is in color index mode (GL_TRUE) or RGBA mode (GL_FALSE).\r\nINDEX_MODE = GL_INDEX_MODE,\r\n// returns one value, the offset added to color and stencil indices during pixel transfers. The initial value is 0. See glPixelTransfer.\r\nINDEX_OFFSET = GL_INDEX_OFFSET,\r\n// returns one value, the amount that color and stencil indices are shifted during pixel transfers. The initial value is 0. See glPixelTransfer.\r\nINDEX_SHIFT = GL_INDEX_SHIFT,\r\n// returns one value, a mask indicating which bitplanes of each color index buffer can be written. The initial value is all 1's. See glIndexMask.\r\nINDEX_WRITEMASK = GL_INDEX_WRITEMASK,\r\n// returns a single boolean value indicating whether the specified light is enabled. The initial value is GL_FALSE. See glLight and glLightModel.\r\nLIGHT0 = GL_LIGHT0,\r\nLIGHT1 = GL_LIGHT1,\r\nLIGHT2 = GL_LIGHT2,\r\nLIGHT3 = GL_LIGHT3,\r\nLIGHT4 = GL_LIGHT4,\r\nLIGHT5 = GL_LIGHT5,\r\nLIGHT6 = GL_LIGHT6,\r\nLIGHT7 = GL_LIGHT7,\r\n// returns a single boolean value indicating whether lighting is enabled. The initial value is GL_FALSE. See glLightModel.\r\nLIGHTING = GL_LIGHTING,\r\n// returns four values: the red, green, blue, and alpha components of the ambient intensity of the entire scene. Integer values, if requested, are linearly mapped from the internal floating-point representation such that 1.0 returns the most positive representable integer value, and -1.0 returns the most negative representable integer value. The initial value is (0.2, 0.2, 0.2, 1.0). See glLightModel.\r\nLIGHT_MODEL_AMBIENT = GL_LIGHT_MODEL_AMBIENT,\r\n// returns single enumerated value indicating whether specular reflection calculations are separated from normal lighting computations. The initial value is GL_SINGLE_COLOR.\r\nLIGHT_MODEL_COLOR_CONTROL = GL_LIGHT_MODEL_COLOR_CONTROL,\r\n// returns a single boolean value indicating whether specular reflection calculations treat the viewer as being local to the scene. The initial value is GL_FALSE. See glLightModel.\r\nLIGHT_MODEL_LOCAL_VIEWER = GL_LIGHT_MODEL_LOCAL_VIEWER,\r\n// returns a single boolean value indicating whether separate materials are used to compute lighting for front- and back-facing polygons. The initial value is GL_FALSE. See glLightModel.\r\nLIGHT_MODEL_TWO_SIDE = GL_LIGHT_MODEL_TWO_SIDE,\r\n// returns a single boolean value indicating whether antialiasing of lines is enabled. The initial value is GL_FALSE. See glLineWidth.\r\nLINE_SMOOTH = GL_LINE_SMOOTH,\r\n// returns one value, a symbolic constant indicating the mode of the line antialiasing hint. The initial value is GL_DONT_CARE. See glHint.\r\nLINE_SMOOTH_HINT = GL_LINE_SMOOTH_HINT,\r\n// returns a single boolean value indicating whether stippling of lines is enabled. The initial value is GL_FALSE. See glLineStipple.\r\nLINE_STIPPLE = GL_LINE_STIPPLE,\r\n// returns one value, the 16-bit line stipple pattern. The initial value is all 1's. See glLineStipple.\r\nLINE_STIPPLE_PATTERN = GL_LINE_STIPPLE_PATTERN,\r\n// returns one value, the line stipple repeat factor. The initial value is 1. See glLineStipple.\r\nLINE_STIPPLE_REPEAT = GL_LINE_STIPPLE_REPEAT,\r\n// returns one value, the line width as specified with glLineWidth. The initial value is 1.\r\nLINE_WIDTH = GL_LINE_WIDTH,\r\n// returns one value, the width difference between adjacent supported widths for antialiased lines. See glLineWidth.\r\nLINE_WIDTH_GRANULARITY = GL_LINE_WIDTH_GRANULARITY,\r\n// returns two values: the smallest and largest supported widths for antialiased lines. See glLineWidth.\r\nLINE_WIDTH_RANGE = GL_LINE_WIDTH_RANGE,\r\n// returns one value, the base offset added to all names in arrays presented to glCallLists. The initial value is 0. See glListBase.\r\nLIST_BASE = GL_LIST_BASE,\r\n// returns one value, the name of the display list currently under construction. 0 is returned if no display list is currently under construction. The initial value is 0. See glNewList.\r\nLIST_INDEX = GL_LIST_INDEX,\r\n// returns one value, a symbolic constant indicating the construction mode of the display list currently under construction. The initial value is 0. See glNewList.\r\nLIST_MODE = GL_LIST_MODE,\r\n// returns one value, a symbolic constant indicating the selected logic operation mode. The initial value is GL_COPY. See glLogicOp.\r\nLOGIC_OP_MODE = GL_LOGIC_OP_MODE,\r\n// returns a single boolean value indicating whether 1D evaluation generates colors. The initial value is GL_FALSE. See glMap1.\r\nMAP1_COLOR_4 = GL_MAP1_COLOR_4,\r\n// returns two values: the endpoints of the 1D map's grid domain. The initial value is (0, 1). See glMapGrid.\r\nMAP1_GRID_DOMAIN = GL_MAP1_GRID_DOMAIN,\r\n// returns one value, the number of partitions in the 1D map's grid domain. The initial value is 1. See glMapGrid.\r\nMAP1_GRID_SEGMENTS = GL_MAP1_GRID_SEGMENTS,\r\n// returns a single boolean value indicating whether 1D evaluation generates color indices. The initial value is GL_FALSE. See glMap1.\r\nMAP1_INDEX = GL_MAP1_INDEX,\r\n// returns a single boolean value indicating whether 1D evaluation generates normals. The initial value is GL_FALSE. See glMap1.\r\nMAP1_NORMAL = GL_MAP1_NORMAL,\r\n// returns a single boolean value indicating whether 1D evaluation generates 1D texture coordinates. The initial value is GL_FALSE. See glMap1.\r\nMAP1_TEXTURE_COORD_1 = GL_MAP1_TEXTURE_COORD_1,\r\n// returns a single boolean value indicating whether 1D evaluation generates 2D texture coordinates. The initial value is GL_FALSE. See glMap1.\r\nMAP1_TEXTURE_COORD_2 = GL_MAP1_TEXTURE_COORD_2,\r\n// returns a single boolean value indicating whether 1D evaluation generates 3D texture coordinates. The initial value is GL_FALSE. See glMap1.\r\nMAP1_TEXTURE_COORD_3 = GL_MAP1_TEXTURE_COORD_3,\r\n// returns a single boolean value indicating whether 1D evaluation generates 4D texture coordinates. The initial value is GL_FALSE. See glMap1.\r\nMAP1_TEXTURE_COORD_4 = GL_MAP1_TEXTURE_COORD_4,\r\n// returns a single boolean value indicating whether 1D evaluation generates 3D vertex coordinates. The initial value is GL_FALSE. See glMap1.\r\nMAP1_VERTEX_3 = GL_MAP1_VERTEX_3,\r\n// returns a single boolean value indicating whether 1D evaluation generates 4D vertex coordinates. The initial value is GL_FALSE. See glMap1.\r\nMAP1_VERTEX_4 = GL_MAP1_VERTEX_4,\r\n// returns a single boolean value indicating whether 2D evaluation generates colors. The initial value is GL_FALSE. See glMap2.\r\nMAP2_COLOR_4 = GL_MAP2_COLOR_4,\r\n// returns four values: the endpoints of the 2D map's i and j grid domains. The initial value is (0,1; 0,1). See glMapGrid.\r\nMAP2_GRID_DOMAIN = GL_MAP2_GRID_DOMAIN,\r\n// returns two values: the number of partitions in the 2D map's i and j grid domains. The initial value is (1,1). See glMapGrid.\r\nMAP2_GRID_SEGMENTS = GL_MAP2_GRID_SEGMENTS,\r\n// returns a single boolean value indicating whether 2D evaluation generates color indices. The initial value is GL_FALSE. See glMap2.\r\nMAP2_INDEX = GL_MAP2_INDEX,\r\n// returns a single boolean value indicating whether 2D evaluation generates normals. The initial value is GL_FALSE. See glMap2.\r\nMAP2_NORMAL = GL_MAP2_NORMAL,\r\n// returns a single boolean value indicating whether 2D evaluation generates 1D texture coordinates. The initial value is GL_FALSE. See glMap2.\r\nMAP2_TEXTURE_COORD_1 = GL_MAP2_TEXTURE_COORD_1,\r\n// returns a single boolean value indicating whether 2D evaluation generates 2D texture coordinates. The initial value is GL_FALSE. See glMap2.\r\nMAP2_TEXTURE_COORD_2 = GL_MAP2_TEXTURE_COORD_2,\r\n// returns a single boolean value indicating whether 2D evaluation generates 3D texture coordinates. The initial value is GL_FALSE. See glMap2.\r\nMAP2_TEXTURE_COORD_3 = GL_MAP2_TEXTURE_COORD_3,\r\n// returns a single boolean value indicating whether 2D evaluation generates 4D texture coordinates. The initial value is GL_FALSE. See glMap2.\r\nMAP2_TEXTURE_COORD_4 = GL_MAP2_TEXTURE_COORD_4,\r\n// returns a single boolean value indicating whether 2D evaluation generates 3D vertex coordinates. The initial value is GL_FALSE. See glMap2.\r\nMAP2_VERTEX_3 = GL_MAP2_VERTEX_3,\r\n// returns a single boolean value indicating whether 2D evaluation generates 4D vertex coordinates. The initial value is GL_FALSE. See glMap2.\r\nMAP2_VERTEX_4 = GL_MAP2_VERTEX_4,\r\n// returns a single boolean value indicating if colors and color indices are to be replaced by table lookup during pixel transfers. The initial value is GL_FALSE. See glPixelTransfer.\r\nMAP_COLOR = GL_MAP_COLOR,\r\n// returns a single boolean value indicating if stencil indices are to be replaced by table lookup during pixel transfers. The initial value is GL_FALSE. See glPixelTransfer.\r\nMAP_STENCIL = GL_MAP_STENCIL,\r\n// returns one value, a symbolic constant indicating which matrix stack is currently the target of all matrix operations. The initial value is GL_MODELVIEW. See glMatrixMode.\r\nMATRIX_MODE = GL_MATRIX_MODE,\r\n// returns one value, a rough estimate of the largest 3D texture that the GL can handle. The value must be at least 16. If the GL version is 1.2 or greater, use GL_PROXY_TEXTURE_3D to determine if a texture is too large. See glTexImage3D.\r\nMAX_3D_TEXTURE_SIZE = GL_MAX_3D_TEXTURE_SIZE,\r\n// returns one value indicating the maximum supported depth of the client attribute stack. See glPushClientAttrib.\r\nMAX_CLIENT_ATTRIB_STACK_DEPTH = GL_MAX_CLIENT_ATTRIB_STACK_DEPTH,\r\n// returns one value, the maximum supported depth of the attribute stack. The value must be at least 16. See glPushAttrib.\r\nMAX_ATTRIB_STACK_DEPTH = GL_MAX_ATTRIB_STACK_DEPTH,\r\n// returns one value, the maximum number of application-defined clipping planes. The value must be at least 6. See glClipPlane.\r\nMAX_CLIP_PLANES = GL_MAX_CLIP_PLANES,\r\n// returns one value, the maximum supported depth of the color matrix stack. The value must be at least 2. See glPushMatrix.\r\nMAX_COLOR_MATRIX_STACK_DEPTH = GL_MAX_COLOR_MATRIX_STACK_DEPTH,\r\n// returns one value, the maximum supported texture image units that can be used to access texture maps from the vertex shader and the fragment processor combined. If both the vertex shader and the fragment processing stage access the same texture image unit, then that counts as using two texture image units against this limit. The value must be at least 2. See glActiveTexture.\r\nMAX_COMBINED_TEXTURE_IMAGE_UNITS = GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS,\r\n// returns one value. The value gives a rough estimate of the largest cube-map texture that the GL can handle. The value must be at least 16. If the GL version is 1.3 or greater, use GL_PROXY_TEXTURE_CUBE_MAP to determine if a texture is too large. See glTexImage2D.\r\nMAX_CUBE_MAP_TEXTURE_SIZE = GL_MAX_CUBE_MAP_TEXTURE_SIZE,\r\n// returns one value, the maximum number of simultaneous output colors allowed from a fragment shader using the gl_FragData built-in array. The value must be at least 1. See glDrawBuffers.\r\nMAX_DRAW_BUFFERS = GL_MAX_DRAW_BUFFERS,\r\n// returns one value, the recommended maximum number of vertex array indices. See glDrawRangeElements.\r\nMAX_ELEMENTS_INDICES = GL_MAX_ELEMENTS_INDICES,\r\n// returns one value, the recommended maximum number of vertex array vertices. See glDrawRangeElements.\r\nMAX_ELEMENTS_VERTICES = GL_MAX_ELEMENTS_VERTICES,\r\n// returns one value, the maximum equation order supported by 1D and 2D evaluators. The value must be at least 8. See glMap1 and glMap2.\r\nMAX_EVAL_ORDER = GL_MAX_EVAL_ORDER,\r\n// returns one value, the maximum number of individual floating-point, integer, or boolean values that can be held in uniform variable storage for a fragment shader. The value must be at least 64. See glUniform.\r\nMAX_FRAGMENT_UNIFORM_COMPONENTS = GL_MAX_FRAGMENT_UNIFORM_COMPONENTS,\r\n// returns one value, the maximum number of lights. The value must be at least 8. See glLight.\r\nMAX_LIGHTS = GL_MAX_LIGHTS,\r\n// returns one value, the maximum recursion depth allowed during display-list traversal. The value must be at least 64. See glCallList.\r\nMAX_LIST_NESTING = GL_MAX_LIST_NESTING,\r\n// returns one value, the maximum supported depth of the modelview matrix stack. The value must be at least 32. See glPushMatrix.\r\nMAX_MODELVIEW_STACK_DEPTH = GL_MAX_MODELVIEW_STACK_DEPTH,\r\n// returns one value, the maximum supported depth of the selection name stack. The value must be at least 64. See glPushName.\r\nMAX_NAME_STACK_DEPTH = GL_MAX_NAME_STACK_DEPTH,\r\n// returns one value, the maximum supported size of a glPixelMap lookup table. The value must be at least 32. See glPixelMap.\r\nMAX_PIXEL_MAP_TABLE = GL_MAX_PIXEL_MAP_TABLE,\r\n// returns one value, the maximum supported depth of the projection matrix stack. The value must be at least 2. See glPushMatrix.\r\nMAX_PROJECTION_STACK_DEPTH = GL_MAX_PROJECTION_STACK_DEPTH,\r\n// returns one value, the maximum number of texture coordinate sets available to vertex and fragment shaders. The value must be at least 2. See glActiveTexture and glClientActiveTexture.\r\nMAX_TEXTURE_COORDS = GL_MAX_TEXTURE_COORDS,\r\n// returns one value, the maximum supported texture image units that can be used to access texture maps from the fragment shader. The value must be at least 2. See glActiveTexture.\r\nMAX_TEXTURE_IMAGE_UNITS = GL_MAX_TEXTURE_IMAGE_UNITS,\r\n// returns one value, the maximum, absolute value of the texture level-of-detail bias. The value must be at least 4.\r\nMAX_TEXTURE_LOD_BIAS = GL_MAX_TEXTURE_LOD_BIAS,\r\n// returns one value. The value gives a rough estimate of the largest texture that the GL can handle. The value must be at least 64. If the GL version is 1.1 or greater, use GL_PROXY_TEXTURE_1D or GL_PROXY_TEXTURE_2D to determine if a texture is too large. See glTexImage1D and glTexImage2D.\r\nMAX_TEXTURE_SIZE = GL_MAX_TEXTURE_SIZE,\r\n// returns one value, the maximum supported depth of the texture matrix stack. The value must be at least 2. See glPushMatrix.\r\nMAX_TEXTURE_STACK_DEPTH = GL_MAX_TEXTURE_STACK_DEPTH,\r\n// returns a single value indicating the number of conventional texture units supported. Each conventional texture unit includes both a texture coordinate set and a texture image unit. Conventional texture units may be used for fixed-function (non-shader) rendering. The value must be at least 2. Additional texture coordinate sets and texture image units may be accessed from vertex and fragment shaders. See glActiveTexture and glClientActiveTexture.\r\nMAX_TEXTURE_UNITS = GL_MAX_TEXTURE_UNITS,\r\n// returns one value, the maximum number of interpolators available for processing varying variables used by vertex and fragment shaders. This value represents the number of individual floating-point values that can be interpolated; varying variables declared as vectors, matrices, and arrays will all consume multiple interpolators. The value must be at least 32.\r\nMAX_VARYING_FLOATS = GL_MAX_VARYING_FLOATS,\r\n// returns one value, the maximum number of 4-component generic vertex attributes accessible to a vertex shader. The value must be at least 16. See glVertexAttrib.\r\nMAX_VERTEX_ATTRIBS = GL_MAX_VERTEX_ATTRIBS,\r\n// returns one value, the maximum supported texture image units that can be used to access texture maps from the vertex shader. The value may be 0. See glActiveTexture.\r\nMAX_VERTEX_TEXTURE_IMAGE_UNITS = GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS,\r\n// returns one value, the maximum number of individual floating-point, integer, or boolean values that can be held in uniform variable storage for a vertex shader. The value must be at least 512. See glUniform.\r\nMAX_VERTEX_UNIFORM_COMPONENTS = GL_MAX_VERTEX_UNIFORM_COMPONENTS,\r\n// returns two values: the maximum supported width and height of the viewport. These must be at least as large as the visible dimensions of the display being rendered to. See glViewport.\r\nMAX_VIEWPORT_DIMS = GL_MAX_VIEWPORT_DIMS,\r\n// returns a single boolean value indicating whether pixel minmax values are computed. The initial value is GL_FALSE. See glMinmax.\r\nMINMAX = GL_MINMAX,\r\n// returns sixteen values: the modelview matrix on the top of the modelview matrix stack. Initially this matrix is the identity matrix. See glPushMatrix.\r\nMODELVIEW_MATRIX = GL_MODELVIEW_MATRIX,\r\n// returns one value, the number of matrices on the modelview matrix stack. The initial value is 1. See glPushMatrix.\r\nMODELVIEW_STACK_DEPTH = GL_MODELVIEW_STACK_DEPTH,\r\n// returns one value, the number of names on the selection name stack. The initial value is 0. See glPushName.\r\nNAME_STACK_DEPTH = GL_NAME_STACK_DEPTH,\r\n// returns a single boolean value, indicating whether the normal array is enabled. The initial value is GL_FALSE. See glNormalPointer.\r\nNORMAL_ARRAY = GL_NORMAL_ARRAY,\r\n// returns a single value, the name of the buffer object associated with the normal array. This buffer object would have been bound to the target GL_ARRAY_BUFFER at the time of the most recent call to glNormalPointer. If no buffer object was bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\nNORMAL_ARRAY_BUFFER_BINDING = GL_NORMAL_ARRAY_BUFFER_BINDING,\r\n// returns one value, the byte offset between consecutive normals in the normal array. The initial value is 0. See glNormalPointer.\r\nNORMAL_ARRAY_STRIDE = GL_NORMAL_ARRAY_STRIDE,\r\n// returns one value, the data type of each coordinate in the normal array. The initial value is GL_FLOAT. See glNormalPointer.\r\nNORMAL_ARRAY_TYPE = GL_NORMAL_ARRAY_TYPE,\r\n// returns a single boolean value indicating whether normals are automatically scaled to unit length after they have been transformed to eye coordinates. The initial value is GL_FALSE. See glNormal.\r\nNORMALIZE = GL_NORMALIZE,\r\n// returns a single integer value indicating the number of available compressed texture formats. The minimum value is 0. See glCompressedTexImage2D.\r\nNUM_COMPRESSED_TEXTURE_FORMATS = GL_NUM_COMPRESSED_TEXTURE_FORMATS,\r\n// returns one value, the byte alignment used for writing pixel data to memory. The initial value is 4. See glPixelStore.\r\nPACK_ALIGNMENT = GL_PACK_ALIGNMENT,\r\n// returns one value, the image height used for writing pixel data to memory. The initial value is 0. See glPixelStore.\r\nPACK_IMAGE_HEIGHT = GL_PACK_IMAGE_HEIGHT,\r\n// returns a single boolean value indicating whether single-bit pixels being written to memory are written first to the least significant bit of each unsigned byte. The initial value is GL_FALSE. See glPixelStore.\r\nPACK_LSB_FIRST = GL_PACK_LSB_FIRST,\r\n// returns one value, the row length used for writing pixel data to memory. The initial value is 0. See glPixelStore.\r\nPACK_ROW_LENGTH = GL_PACK_ROW_LENGTH,\r\n// returns one value, the number of pixel images skipped before the first pixel is written into memory. The initial value is 0. See glPixelStore.\r\nPACK_SKIP_IMAGES = GL_PACK_SKIP_IMAGES,\r\n// returns one value, the number of pixel locations skipped before the first pixel is written into memory. The initial value is 0. See glPixelStore.\r\nPACK_SKIP_PIXELS = GL_PACK_SKIP_PIXELS,\r\n// returns one value, the number of rows of pixel locations skipped before the first pixel is written into memory. The initial value is 0. See glPixelStore.\r\nPACK_SKIP_ROWS = GL_PACK_SKIP_ROWS,\r\n// returns a single boolean value indicating whether the bytes of two-byte and four-byte pixel indices and components are swapped before being written to memory. The initial value is GL_FALSE. See glPixelStore.\r\nPACK_SWAP_BYTES = GL_PACK_SWAP_BYTES,\r\n// returns one value, a symbolic constant indicating the mode of the perspective correction hint. The initial value is GL_DONT_CARE. See glHint.\r\nPERSPECTIVE_CORRECTION_HINT = GL_PERSPECTIVE_CORRECTION_HINT,\r\n// returns one value, the size of the alpha-to-alpha pixel translation table. The initial value is 1. See glPixelMap.\r\nPIXEL_MAP_A_TO_A_SIZE = GL_PIXEL_MAP_A_TO_A_SIZE,\r\n// returns one value, the size of the blue-to-blue pixel translation table. The initial value is 1. See glPixelMap.\r\nPIXEL_MAP_B_TO_B_SIZE = GL_PIXEL_MAP_B_TO_B_SIZE,\r\n// returns one value, the size of the green-to-green pixel translation table. The initial value is 1. See glPixelMap.\r\nPIXEL_MAP_G_TO_G_SIZE = GL_PIXEL_MAP_G_TO_G_SIZE,\r\n// returns one value, the size of the index-to-alpha pixel translation table. The initial value is 1. See glPixelMap.\r\nPIXEL_MAP_I_TO_A_SIZE = GL_PIXEL_MAP_I_TO_A_SIZE,\r\n// returns one value, the size of the index-to-blue pixel translation table. The initial value is 1. See glPixelMap.\r\nPIXEL_MAP_I_TO_B_SIZE = GL_PIXEL_MAP_I_TO_B_SIZE,\r\n// returns one value, the size of the index-to-green pixel translation table. The initial value is 1. See glPixelMap.\r\nPIXEL_MAP_I_TO_G_SIZE = GL_PIXEL_MAP_I_TO_G_SIZE,\r\n// returns one value, the size of the index-to-index pixel translation table. The initial value is 1. See glPixelMap.\r\nPIXEL_MAP_I_TO_I_SIZE = GL_PIXEL_MAP_I_TO_I_SIZE,\r\n// returns one value, the size of the index-to-red pixel translation table. The initial value is 1. See glPixelMap.\r\nPIXEL_MAP_I_TO_R_SIZE = GL_PIXEL_MAP_I_TO_R_SIZE,\r\n// returns one value, the size of the red-to-red pixel translation table. The initial value is 1. See glPixelMap.\r\nPIXEL_MAP_R_TO_R_SIZE = GL_PIXEL_MAP_R_TO_R_SIZE,\r\n// returns one value, the size of the stencil-to-stencil pixel translation table. The initial value is 1. See glPixelMap.\r\nPIXEL_MAP_S_TO_S_SIZE = GL_PIXEL_MAP_S_TO_S_SIZE,\r\n// returns a single value, the name of the buffer object currently bound to the target GL_PIXEL_PACK_BUFFER. If no buffer object is bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\nPIXEL_PACK_BUFFER_BINDING = GL_PIXEL_PACK_BUFFER_BINDING,\r\n// returns a single value, the name of the buffer object currently bound to the target GL_PIXEL_UNPACK_BUFFER. If no buffer object is bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\nPIXEL_UNPACK_BUFFER_BINDING = GL_PIXEL_UNPACK_BUFFER_BINDING,\r\n// returns three values, the coefficients for computing the attenuation value for points. See glPointParameter.\r\nPOINT_DISTANCE_ATTENUATION = GL_POINT_DISTANCE_ATTENUATION,\r\n// returns one value, the point size threshold for determining the point size. See glPointParameter.\r\nPOINT_FADE_THRESHOLD_SIZE = GL_POINT_FADE_THRESHOLD_SIZE,\r\n// returns one value, the point size as specified by glPointSize. The initial value is 1.\r\nPOINT_SIZE = GL_POINT_SIZE,\r\n// returns one value, the size difference between adjacent supported sizes for antialiased points. See glPointSize.\r\nPOINT_SIZE_GRANULARITY = GL_POINT_SIZE_GRANULARITY,\r\n// returns one value, the upper bound for the attenuated point sizes. The initial value is 0.0. See glPointParameter.\r\nPOINT_SIZE_MAX = GL_POINT_SIZE_MAX,\r\n// returns one value, the lower bound for the attenuated point sizes. The initial value is 1.0. See glPointParameter.\r\nPOINT_SIZE_MIN = GL_POINT_SIZE_MIN,\r\n// returns two values: the smallest and largest supported sizes for antialiased points. The smallest size must be at most 1, and the largest size must be at least 1. See glPointSize.\r\nPOINT_SIZE_RANGE = GL_POINT_SIZE_RANGE,\r\n// returns a single boolean value indicating whether antialiasing of points is enabled. The initial value is GL_FALSE. See glPointSize.\r\nPOINT_SMOOTH = GL_POINT_SMOOTH,\r\n// returns one value, a symbolic constant indicating the mode of the point antialiasing hint. The initial value is GL_DONT_CARE. See glHint.\r\nPOINT_SMOOTH_HINT = GL_POINT_SMOOTH_HINT,\r\n// returns a single boolean value indicating whether point sprite is enabled. The initial value is GL_FALSE.\r\nPOINT_SPRITE = GL_POINT_SPRITE,\r\n// returns two values: symbolic constants indicating whether front-facing and back-facing polygons are rasterized as points, lines, or filled polygons. The initial value is GL_FILL. See glPolygonMode.\r\nPOLYGON_MODE = GL_POLYGON_MODE,\r\n// returns one value, the scaling factor used to determine the variable offset that is added to the depth value of each fragment generated when a polygon is rasterized. The initial value is 0. See glPolygonOffset.\r\nPOLYGON_OFFSET_FACTOR = GL_POLYGON_OFFSET_FACTOR,\r\n// returns one value. This value is multiplied by an implementation-specific value and then added to the depth value of each fragment generated when a polygon is rasterized. The initial value is 0. See glPolygonOffset.\r\nPOLYGON_OFFSET_UNITS = GL_POLYGON_OFFSET_UNITS,\r\n// returns a single boolean value indicating whether polygon offset is enabled for polygons in fill mode. The initial value is GL_FALSE. See glPolygonOffset.\r\nPOLYGON_OFFSET_FILL = GL_POLYGON_OFFSET_FILL,\r\n// returns a single boolean value indicating whether polygon offset is enabled for polygons in line mode. The initial value is GL_FALSE. See glPolygonOffset.\r\nPOLYGON_OFFSET_LINE = GL_POLYGON_OFFSET_LINE,\r\n// returns a single boolean value indicating whether polygon offset is enabled for polygons in point mode. The initial value is GL_FALSE. See glPolygonOffset.\r\nPOLYGON_OFFSET_POINT = GL_POLYGON_OFFSET_POINT,\r\n// returns a single boolean value indicating whether antialiasing of polygons is enabled. The initial value is GL_FALSE. See glPolygonMode.\r\nPOLYGON_SMOOTH = GL_POLYGON_SMOOTH,\r\n// returns one value, a symbolic constant indicating the mode of the polygon antialiasing hint. The initial value is GL_DONT_CARE. See glHint.\r\nPOLYGON_SMOOTH_HINT = GL_POLYGON_SMOOTH_HINT,\r\n// returns a single boolean value indicating whether polygon stippling is enabled. The initial value is GL_FALSE. See glPolygonStipple.\r\nPOLYGON_STIPPLE = GL_POLYGON_STIPPLE,\r\n// returns a single boolean value indicating whether post color matrix transformation lookup is enabled. The initial value is GL_FALSE. See glColorTable.\r\nPOST_COLOR_MATRIX_COLOR_TABLE = GL_POST_COLOR_MATRIX_COLOR_TABLE,\r\n// returns one value, the red bias factor applied to RGBA fragments after color matrix transformations. The initial value is 0. See glPixelTransfer.\r\nPOST_COLOR_MATRIX_RED_BIAS = GL_POST_COLOR_MATRIX_RED_BIAS,\r\n// returns one value, the green bias factor applied to RGBA fragments after color matrix transformations. The initial value is 0. See glPixelTransfer\r\nPOST_COLOR_MATRIX_GREEN_BIAS = GL_POST_COLOR_MATRIX_GREEN_BIAS,\r\n// returns one value, the blue bias factor applied to RGBA fragments after color matrix transformations. The initial value is 0. See glPixelTransfer.\r\nPOST_COLOR_MATRIX_BLUE_BIAS = GL_POST_COLOR_MATRIX_BLUE_BIAS,\r\n// returns one value, the alpha bias factor applied to RGBA fragments after color matrix transformations. The initial value is 0. See glPixelTransfer.\r\nPOST_COLOR_MATRIX_ALPHA_BIAS = GL_POST_COLOR_MATRIX_ALPHA_BIAS,\r\n// returns one value, the red scale factor applied to RGBA fragments after color matrix transformations. The initial value is 1. See glPixelTransfer.\r\nPOST_COLOR_MATRIX_RED_SCALE = GL_POST_COLOR_MATRIX_RED_SCALE,\r\n// returns one value, the green scale factor applied to RGBA fragments after color matrix transformations. The initial value is 1. See glPixelTransfer.\r\nPOST_COLOR_MATRIX_GREEN_SCALE = GL_POST_COLOR_MATRIX_GREEN_SCALE,\r\n// returns one value, the blue scale factor applied to RGBA fragments after color matrix transformations. The initial value is 1. See glPixelTransfer.\r\nPOST_COLOR_MATRIX_BLUE_SCALE = GL_POST_COLOR_MATRIX_BLUE_SCALE,\r\n// returns one value, the alpha scale factor applied to RGBA fragments after color matrix transformations. The initial value is 1. See glPixelTransfer.\r\nPOST_COLOR_MATRIX_ALPHA_SCALE = GL_POST_COLOR_MATRIX_ALPHA_SCALE,\r\n// returns a single boolean value indicating whether post convolution lookup is enabled. The initial value is GL_FALSE. See glColorTable.\r\nPOST_CONVOLUTION_COLOR_TABLE = GL_POST_CONVOLUTION_COLOR_TABLE,\r\n// returns one value, the red bias factor applied to RGBA fragments after convolution. The initial value is 0. See glPixelTransfer.\r\nPOST_CONVOLUTION_RED_BIAS = GL_POST_CONVOLUTION_RED_BIAS,\r\n// returns one value, the green bias factor applied to RGBA fragments after convolution. The initial value is 0. See glPixelTransfer.\r\nPOST_CONVOLUTION_GREEN_BIAS = GL_POST_CONVOLUTION_GREEN_BIAS,\r\n// returns one value, the blue bias factor applied to RGBA fragments after convolution. The initial value is 0. See glPixelTransfer.\r\nPOST_CONVOLUTION_BLUE_BIAS = GL_POST_CONVOLUTION_BLUE_BIAS,\r\n// returns one value, the alpha bias factor applied to RGBA fragments after convolution. The initial value is 0. See glPixelTransfer.\r\nPOST_CONVOLUTION_ALPHA_BIAS = GL_POST_CONVOLUTION_ALPHA_BIAS,\r\n// returns one value, the red scale factor applied to RGBA fragments after convolution. The initial value is 1. See glPixelTransfer.\r\nPOST_CONVOLUTION_RED_SCALE = GL_POST_CONVOLUTION_RED_SCALE,\r\n// returns one value, the green scale factor applied to RGBA fragments after convolution. The initial value is 1. See glPixelTransfer.\r\nPOST_CONVOLUTION_GREEN_SCALE = GL_POST_CONVOLUTION_GREEN_SCALE,\r\n// returns one value, the blue scale factor applied to RGBA fragments after convolution. The initial value is 1. See glPixelTransfer.\r\nPOST_CONVOLUTION_BLUE_SCALE = GL_POST_CONVOLUTION_BLUE_SCALE,\r\n// returns one value, the alpha scale factor applied to RGBA fragments after convolution. The initial value is 1. See glPixelTransfer.\r\nPOST_CONVOLUTION_ALPHA_SCALE = GL_POST_CONVOLUTION_ALPHA_SCALE,\r\n// returns sixteen values: the projection matrix on the top of the projection matrix stack. Initially this matrix is the identity matrix. See glPushMatrix.\r\nPROJECTION_MATRIX = GL_PROJECTION_MATRIX,\r\n// returns one value, the number of matrices on the projection matrix stack. The initial value is 1. See glPushMatrix.\r\nPROJECTION_STACK_DEPTH = GL_PROJECTION_STACK_DEPTH,\r\n// returns one value, a symbolic constant indicating which color buffer is selected for reading. The initial value is GL_BACK if there is a back buffer, otherwise it is GL_FRONT. See glReadPixels and glAccum.\r\nREAD_BUFFER = GL_READ_BUFFER,\r\n// returns one value, the red bias factor used during pixel transfers. The initial value is 0.\r\nRED_BIAS = GL_RED_BIAS,\r\n// returns one value, the number of red bitplanes in each color buffer.\r\nRED_BITS = GL_RED_BITS,\r\n// returns one value, the red scale factor used during pixel transfers. The initial value is 1. See glPixelTransfer.\r\nRED_SCALE = GL_RED_SCALE,\r\n// returns one value, a symbolic constant indicating whether the GL is in render, select, or feedback mode. The initial value is GL_RENDER. See glRenderMode.\r\nRENDER_MODE = GL_RENDER_MODE,\r\n// returns single boolean value indicating whether normal rescaling is enabled. See glEnable.\r\nRESCALE_NORMAL = GL_RESCALE_NORMAL,\r\n// returns a single boolean value indicating whether the GL is in RGBA mode (true) or color index mode (false). See glColor.\r\nRGBA_MODE = GL_RGBA_MODE,\r\n// returns a single integer value indicating the number of sample buffers associated with the framebuffer. See glSampleCoverage.\r\nSAMPLE_BUFFERS = GL_SAMPLE_BUFFERS,\r\n// returns a single positive floating-point value indicating the current sample coverage value. See glSampleCoverage.\r\nSAMPLE_COVERAGE_VALUE = GL_SAMPLE_COVERAGE_VALUE,\r\n// returns a single boolean value indicating if the temporary coverage value should be inverted. See glSampleCoverage.\r\nSAMPLE_COVERAGE_INVERT = GL_SAMPLE_COVERAGE_INVERT,\r\n// returns a single integer value indicating the coverage mask size. See glSampleCoverage.\r\nSAMPLES = GL_SAMPLES,\r\n// returns four values: the x and y window coordinates of the scissor box, followed by its width and height. Initially the x and y window coordinates are both 0 and the width and height are set to the size of the window. See glScissor.\r\nSCISSOR_BOX = GL_SCISSOR_BOX,\r\n// returns a single boolean value indicating whether scissoring is enabled. The initial value is GL_FALSE. See glScissor.\r\nSCISSOR_TEST = GL_SCISSOR_TEST,\r\n// returns a single boolean value indicating whether the secondary color array is enabled. The initial value is GL_FALSE. See glSecondaryColorPointer.\r\nSECONDARY_COLOR_ARRAY = GL_SECONDARY_COLOR_ARRAY,\r\n// returns a single value, the name of the buffer object associated with the secondary color array. This buffer object would have been bound to the target GL_ARRAY_BUFFER at the time of the most recent call to glSecondaryColorPointer. If no buffer object was bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\nSECONDARY_COLOR_ARRAY_BUFFER_BINDING = GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING,\r\n// returns one value, the number of components per color in the secondary color array. The initial value is 3. See glSecondaryColorPointer.\r\nSECONDARY_COLOR_ARRAY_SIZE = GL_SECONDARY_COLOR_ARRAY_SIZE,\r\n// returns one value, the byte offset between consecutive colors in the secondary color array. The initial value is 0. See glSecondaryColorPointer.\r\nSECONDARY_COLOR_ARRAY_STRIDE = GL_SECONDARY_COLOR_ARRAY_STRIDE,\r\n// returns one value, the data type of each component in the secondary color array. The initial value is GL_FLOAT. See glSecondaryColorPointer.\r\nSECONDARY_COLOR_ARRAY_TYPE = GL_SECONDARY_COLOR_ARRAY_TYPE,\r\n// return one value, the size of the selection buffer. See glSelectBuffer.\r\nSELECTION_BUFFER_SIZE = GL_SELECTION_BUFFER_SIZE,\r\n// returns a single boolean value indicating whether 2D separable convolution is enabled. The initial value is GL_FALSE. See glSeparableFilter2D.\r\nSEPARABLE_2D = GL_SEPARABLE_2D,\r\n// returns one value, a symbolic constant indicating whether the shading mode is flat or smooth. The initial value is GL_SMOOTH. See glShadeModel.\r\nSHADE_MODEL = GL_SHADE_MODEL,\r\n// returns two values, the smallest and largest supported widths for antialiased lines. See glLineWidth.\r\nSMOOTH_LINE_WIDTH_RANGE = GL_SMOOTH_LINE_WIDTH_RANGE,\r\n// returns one value, the granularity of widths for antialiased lines. See glLineWidth.\r\nSMOOTH_LINE_WIDTH_GRANULARITY = GL_SMOOTH_LINE_WIDTH_GRANULARITY,\r\n// returns two values, the smallest and largest supported widths for antialiased points. See glPointSize.\r\nSMOOTH_POINT_SIZE_RANGE = GL_SMOOTH_POINT_SIZE_RANGE,\r\n// returns one value, the granularity of sizes for antialiased points. See glPointSize.\r\nSMOOTH_POINT_SIZE_GRANULARITY = GL_SMOOTH_POINT_SIZE_GRANULARITY,\r\n// returns one value, a symbolic constant indicating what action is taken for back-facing polygons when the stencil test fails. The initial value is GL_KEEP. See glStencilOpSeparate.\r\nSTENCIL_BACK_FAIL = GL_STENCIL_BACK_FAIL,\r\n// returns one value, a symbolic constant indicating what function is used for back-facing polygons to compare the stencil reference value with the stencil buffer value. The initial value is GL_ALWAYS. See glStencilFuncSeparate.\r\nSTENCIL_BACK_FUNC = GL_STENCIL_BACK_FUNC,\r\n// returns one value, a symbolic constant indicating what action is taken for back-facing polygons when the stencil test passes, but the depth test fails. The initial value is GL_KEEP. See glStencilOpSeparate.\r\nSTENCIL_BACK_PASS_DEPTH_FAIL = GL_STENCIL_BACK_PASS_DEPTH_FAIL,\r\n// returns one value, a symbolic constant indicating what action is taken for back-facing polygons when the stencil test passes and the depth test passes. The initial value is GL_KEEP. See glStencilOpSeparate.\r\nSTENCIL_BACK_PASS_DEPTH_PASS = GL_STENCIL_BACK_PASS_DEPTH_PASS,\r\n// returns one value, the reference value that is compared with the contents of the stencil buffer for back-facing polygons. The initial value is 0. See glStencilFuncSeparate.\r\nSTENCIL_BACK_REF = GL_STENCIL_BACK_REF,\r\n// returns one value, the mask that is used for back-facing polygons to mask both the stencil reference value and the stencil buffer value before they are compared. The initial value is all 1's. See glStencilFuncSeparate.\r\nSTENCIL_BACK_VALUE_MASK = GL_STENCIL_BACK_VALUE_MASK,\r\n// returns one value, the mask that controls writing of the stencil bitplanes for back-facing polygons. The initial value is all 1's. See glStencilMaskSeparate.\r\nSTENCIL_BACK_WRITEMASK = GL_STENCIL_BACK_WRITEMASK,\r\n// returns one value, the number of bitplanes in the stencil buffer.\r\nSTENCIL_BITS = GL_STENCIL_BITS,\r\n// returns one value, the index to which the stencil bitplanes are cleared. The initial value is 0. See glClearStencil.\r\nSTENCIL_CLEAR_VALUE = GL_STENCIL_CLEAR_VALUE,\r\n// returns one value, a symbolic constant indicating what action is taken when the stencil test fails. The initial value is GL_KEEP. See glStencilOp. If the GL version is 2.0 or greater, this stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilOpSeparate.\r\nSTENCIL_FAIL = GL_STENCIL_FAIL,\r\n// returns one value, a symbolic constant indicating what function is used to compare the stencil reference value with the stencil buffer value. The initial value is GL_ALWAYS. See glStencilFunc. If the GL version is 2.0 or greater, this stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilFuncSeparate.\r\nSTENCIL_FUNC = GL_STENCIL_FUNC,\r\n// returns one value, a symbolic constant indicating what action is taken when the stencil test passes, but the depth test fails. The initial value is GL_KEEP. See glStencilOp. If the GL version is 2.0 or greater, this stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilOpSeparate.\r\nSTENCIL_PASS_DEPTH_FAIL = GL_STENCIL_PASS_DEPTH_FAIL,\r\n// returns one value, a symbolic constant indicating what action is taken when the stencil test passes and the depth test passes. The initial value is GL_KEEP. See glStencilOp. If the GL version is 2.0 or greater, this stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilOpSeparate.\r\nSTENCIL_PASS_DEPTH_PASS = GL_STENCIL_PASS_DEPTH_PASS,\r\n// returns one value, the reference value that is compared with the contents of the stencil buffer. The initial value is 0. See glStencilFunc. If the GL version is 2.0 or greater, this stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilFuncSeparate.\r\nSTENCIL_REF = GL_STENCIL_REF,\r\n// returns a single boolean value indicating whether stencil testing of fragments is enabled. The initial value is GL_FALSE. See glStencilFunc and glStencilOp.\r\nSTENCIL_TEST = GL_STENCIL_TEST,\r\n// returns one value, the mask that is used to mask both the stencil reference value and the stencil buffer value before they are compared. The initial value is all 1's. See glStencilFunc. If the GL version is 2.0 or greater, this stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilFuncSeparate.\r\nSTENCIL_VALUE_MASK = GL_STENCIL_VALUE_MASK,\r\n// returns one value, the mask that controls writing of the stencil bitplanes. The initial value is all 1's. See glStencilMask. If the GL version is 2.0 or greater, this stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilMaskSeparate.\r\nSTENCIL_WRITEMASK = GL_STENCIL_WRITEMASK,\r\n// returns a single boolean value indicating whether stereo buffers (left and right) are supported.\r\nSTEREO = GL_STEREO,\r\n// returns one value, an estimate of the number of bits of subpixel resolution that are used to position rasterized geometry in window coordinates. The value must be at least 4.\r\nSUBPIXEL_BITS = GL_SUBPIXEL_BITS,\r\n// returns a single boolean value indicating whether 1D texture mapping is enabled. The initial value is GL_FALSE. See glTexImage1D.\r\nTEXTURE_1D = GL_TEXTURE_1D,\r\n// returns a single value, the name of the texture currently bound to the target GL_TEXTURE_1D. The initial value is 0. See glBindTexture.\r\nTEXTURE_BINDING_1D = GL_TEXTURE_BINDING_1D,\r\n// returns a single boolean value indicating whether 2D texture mapping is enabled. The initial value is GL_FALSE. See glTexImage2D.\r\nTEXTURE_2D = GL_TEXTURE_2D,\r\n// returns a single value, the name of the texture currently bound to the target GL_TEXTURE_2D. The initial value is 0. See glBindTexture.\r\nTEXTURE_BINDING_2D = GL_TEXTURE_BINDING_2D,\r\n// returns a single boolean value indicating whether 3D texture mapping is enabled. The initial value is GL_FALSE. See glTexImage3D.\r\nTEXTURE_3D = GL_TEXTURE_3D,\r\n// returns a single value, the name of the texture currently bound to the target GL_TEXTURE_3D. The initial value is 0. See glBindTexture.\r\nTEXTURE_BINDING_3D = GL_TEXTURE_BINDING_3D,\r\n// returns a single value, the name of the texture currently bound to the target GL_TEXTURE_CUBE_MAP. The initial value is 0. See glBindTexture.\r\nTEXTURE_BINDING_CUBE_MAP = GL_TEXTURE_BINDING_CUBE_MAP,\r\n// returns a single value indicating the mode of the texture compression hint. The initial value is GL_DONT_CARE.\r\nTEXTURE_COMPRESSION_HINT = GL_TEXTURE_COMPRESSION_HINT,\r\n// returns a single boolean value indicating whether the texture coordinate array is enabled. The initial value is GL_FALSE. See glTexCoordPointer.\r\nTEXTURE_COORD_ARRAY = GL_TEXTURE_COORD_ARRAY,\r\n// returns a single value, the name of the buffer object associated with the texture coordinate array. This buffer object would have been bound to the target GL_ARRAY_BUFFER at the time of the most recent call to glTexCoordPointer. If no buffer object was bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\nTEXTURE_COORD_ARRAY_BUFFER_BINDING = GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING,\r\n// returns one value, the number of coordinates per element in the texture coordinate array. The initial value is 4. See glTexCoordPointer.\r\nTEXTURE_COORD_ARRAY_SIZE = GL_TEXTURE_COORD_ARRAY_SIZE,\r\n// returns one value, the byte offset between consecutive elements in the texture coordinate array. The initial value is 0. See glTexCoordPointer.\r\nTEXTURE_COORD_ARRAY_STRIDE = GL_TEXTURE_COORD_ARRAY_STRIDE,\r\n// returns one value, the data type of the coordinates in the texture coordinate array. The initial value is GL_FLOAT. See glTexCoordPointer.\r\nTEXTURE_COORD_ARRAY_TYPE = GL_TEXTURE_COORD_ARRAY_TYPE,\r\n// returns a single boolean value indicating whether cube-mapped texture mapping is enabled. The initial value is GL_FALSE. See glTexImage2D.\r\nTEXTURE_CUBE_MAP = GL_TEXTURE_CUBE_MAP,\r\n// returns a single boolean value indicating whether automatic generation of the q texture coordinate is enabled. The initial value is GL_FALSE. See glTexGen.\r\nTEXTURE_GEN_Q = GL_TEXTURE_GEN_Q,\r\n// returns a single boolean value indicating whether automatic generation of the r texture coordinate is enabled. The initial value is GL_FALSE. See glTexGen.\r\nTEXTURE_GEN_R = GL_TEXTURE_GEN_R,\r\n// returns a single boolean value indicating whether automatic generation of the S texture coordinate is enabled. The initial value is GL_FALSE. See glTexGen.\r\nTEXTURE_GEN_S = GL_TEXTURE_GEN_S,\r\n// returns a single boolean value indicating whether automatic generation of the T texture coordinate is enabled. The initial value is GL_FALSE. See glTexGen.\r\nTEXTURE_GEN_T = GL_TEXTURE_GEN_T,\r\n// returns sixteen values: the texture matrix on the top of the texture matrix stack. Initially this matrix is the identity matrix. See glPushMatrix.\r\nTEXTURE_MATRIX = GL_TEXTURE_MATRIX,\r\n// returns one value, the number of matrices on the texture matrix stack. The initial value is 1. See glPushMatrix.\r\nTEXTURE_STACK_DEPTH = GL_TEXTURE_STACK_DEPTH,\r\n// returns 16 values, the elements of the color matrix in row-major order. See glLoadTransposeMatrix.\r\nTRANSPOSE_COLOR_MATRIX = GL_TRANSPOSE_COLOR_MATRIX,\r\n// returns 16 values, the elements of the modelview matrix in row-major order. See glLoadTransposeMatrix.\r\nTRANSPOSE_MODELVIEW_MATRIX = GL_TRANSPOSE_MODELVIEW_MATRIX,\r\n// returns 16 values, the elements of the projection matrix in row-major order. See glLoadTransposeMatrix.\r\nTRANSPOSE_PROJECTION_MATRIX = GL_TRANSPOSE_PROJECTION_MATRIX,\r\n// returns 16 values, the elements of the texture matrix in row-major order. See glLoadTransposeMatrix.\r\nTRANSPOSE_TEXTURE_MATRIX = GL_TRANSPOSE_TEXTURE_MATRIX,\r\n// returns one value, the byte alignment used for reading pixel data from memory. The initial value is 4. See glPixelStore.\r\nUNPACK_ALIGNMENT = GL_UNPACK_ALIGNMENT,\r\n// returns one value, the image height used for reading pixel data from memory. The initial is 0. See glPixelStore.\r\nUNPACK_IMAGE_HEIGHT = GL_UNPACK_IMAGE_HEIGHT,\r\n// returns a single boolean value indicating whether single-bit pixels being read from memory are read first from the least significant bit of each unsigned byte. The initial value is GL_FALSE. See glPixelStore.\r\nUNPACK_LSB_FIRST = GL_UNPACK_LSB_FIRST,\r\n// returns one value, the row length used for reading pixel data from memory. The initial value is 0. See glPixelStore.\r\nUNPACK_ROW_LENGTH = GL_UNPACK_ROW_LENGTH,\r\n// returns one value, the number of pixel images skipped before the first pixel is read from memory. The initial value is 0. See glPixelStore.\r\nUNPACK_SKIP_IMAGES = GL_UNPACK_SKIP_IMAGES,\r\n// returns one value, the number of pixel locations skipped before the first pixel is read from memory. The initial value is 0. See glPixelStore.\r\nUNPACK_SKIP_PIXELS = GL_UNPACK_SKIP_PIXELS,\r\n// returns one value, the number of rows of pixel locations skipped before the first pixel is read from memory. The initial value is 0. See glPixelStore.\r\nUNPACK_SKIP_ROWS = GL_UNPACK_SKIP_ROWS,\r\n// returns a single boolean value indicating whether the bytes of two-byte and four-byte pixel indices and components are swapped after being read from memory. The initial value is GL_FALSE. See glPixelStore.\r\nUNPACK_SWAP_BYTES = GL_UNPACK_SWAP_BYTES,\r\n// returns a single boolean value indicating whether the vertex array is enabled. The initial value is GL_FALSE. See glVertexPointer.\r\nVERTEX_ARRAY = GL_VERTEX_ARRAY,\r\n// returns a single value, the name of the buffer object associated with the vertex array. This buffer object would have been bound to the target GL_ARRAY_BUFFER at the time of the most recent call to glVertexPointer. If no buffer object was bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\nVERTEX_ARRAY_BUFFER_BINDING = GL_VERTEX_ARRAY_BUFFER_BINDING,\r\n// returns one value, the number of coordinates per vertex in the vertex array. The initial value is 4. See glVertexPointer.\r\nVERTEX_ARRAY_SIZE = GL_VERTEX_ARRAY_SIZE,\r\n// returns one value, the byte offset between consecutive vertices in the vertex array. The initial value is 0. See glVertexPointer.\r\nVERTEX_ARRAY_STRIDE = GL_VERTEX_ARRAY_STRIDE,\r\n// returns one value, the data type of each coordinate in the vertex array. The initial value is GL_FLOAT. See glVertexPointer.\r\nVERTEX_ARRAY_TYPE = GL_VERTEX_ARRAY_TYPE,\r\n// returns a single boolean value indicating whether vertex program point size mode is enabled. If enabled, and a vertex shader is active, then the point size is taken from the shader built-in gl_PointSize. If disabled, and a vertex shader is active, then the point size is taken from the point state as specified by glPointSize. The initial value is GL_FALSE.\r\nVERTEX_PROGRAM_POINT_SIZE = GL_VERTEX_PROGRAM_POINT_SIZE,\r\n// returns a single boolean value indicating whether vertex program two-sided color mode is enabled. If enabled, and a vertex shader is active, then the GL chooses the back color output for back-facing polygons, and the front color output for non-polygons and front-facing polygons. If disabled, and a vertex shader is active, then the front color output is always selected. The initial value is GL_FALSE.\r\nVERTEX_PROGRAM_TWO_SIDE = GL_VERTEX_PROGRAM_TWO_SIDE,\r\n// returns four values: the x and y window coordinates of the viewport, followed by its width and height. Initially the x and y window coordinates are both set to 0, and the width and height are set to the width and height of the window into which the GL will do its rendering. See glViewport.\r\nVIEWPORT = GL_VIEWPORT,\r\n// returns one value, the x pixel zoom factor. The initial value is 1. See glPixelZoom.\r\nZOOM_X = GL_ZOOM_X,\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/graphics/ParamName2.1.txt",
    "content": "GL_ACCUM_ALPHA_BITS\r\nparams returns one value, the number of alpha bitplanes in the accumulation buffer.\r\n\r\nGL_ACCUM_BLUE_BITS\r\nparams returns one value, the number of blue bitplanes in the accumulation buffer.\r\n\r\nGL_ACCUM_CLEAR_VALUE\r\nparams returns four values: the red, green, blue, and alpha values used to clear the accumulation buffer. Integer values, if requested, are linearly mapped from the internal floating-point representation such that 1.0 returns the most positive representable integer value, and -1.0 returns the most negative representable integer value. The initial value is (0, 0, 0, 0). See glClearAccum.\r\n\r\nGL_ACCUM_GREEN_BITS\r\nparams returns one value, the number of green bitplanes in the accumulation buffer.\r\n\r\nGL_ACCUM_RED_BITS\r\nparams returns one value, the number of red bitplanes in the accumulation buffer.\r\n\r\nGL_ACTIVE_TEXTURE\r\nparams returns a single value indicating the active multitexture unit. The initial value is GL_TEXTURE0. See glActiveTexture.\r\n\r\nGL_ALIASED_POINT_SIZE_RANGE\r\nparams returns two values, the smallest and largest supported sizes for aliased points.\r\n\r\nGL_ALIASED_LINE_WIDTH_RANGE\r\nparams returns two values, the smallest and largest supported widths for aliased lines.\r\n\r\nGL_ALPHA_BIAS\r\nparams returns one value, the alpha bias factor used during pixel transfers. The initial value is 0. See glPixelTransfer.\r\n\r\nGL_ALPHA_BITS\r\nparams returns one value, the number of alpha bitplanes in each color buffer.\r\n\r\nGL_ALPHA_SCALE\r\nparams returns one value, the alpha scale factor used during pixel transfers. The initial value is 1. See glPixelTransfer.\r\n\r\nGL_ALPHA_TEST\r\nparams returns a single boolean value indicating whether alpha testing of fragments is enabled. The initial value is GL_FALSE. See glAlphaFunc.\r\n\r\nGL_ALPHA_TEST_FUNC\r\nparams returns one value, the symbolic name of the alpha test function. The initial value is GL_ALWAYS. See glAlphaFunc.\r\n\r\nGL_ALPHA_TEST_REF\r\nparams returns one value, the reference value for the alpha test. The initial value is 0. See glAlphaFunc. An integer value, if requested, is linearly mapped from the internal floating-point representation such that 1.0 returns the most positive representable integer value, and -1.0 returns the most negative representable integer value.\r\n\r\nGL_ARRAY_BUFFER_BINDING\r\nparams returns a single value, the name of the buffer object currently bound to the target GL_ARRAY_BUFFER. If no buffer object is bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\n\r\nGL_ATTRIB_STACK_DEPTH\r\nparams returns one value, the depth of the attribute stack. If the stack is empty, 0 is returned. The initial value is 0. See glPushAttrib.\r\n\r\nGL_AUTO_NORMAL\r\nparams returns a single boolean value indicating whether 2D map evaluation automatically generates surface normals. The initial value is GL_FALSE. See glMap2.\r\n\r\nGL_AUX_BUFFERS\r\nparams returns one value, the number of auxiliary color buffers available.\r\n\r\nGL_BLEND\r\nparams returns a single boolean value indicating whether blending is enabled. The initial value is GL_FALSE. See glBlendFunc.\r\n\r\nGL_BLEND_COLOR\r\nparams returns four values, the red, green, blue, and alpha values which are the components of the blend color. See glBlendColor.\r\n\r\nGL_BLEND_DST_ALPHA\r\nparams returns one value, the symbolic constant identifying the alpha destination blend function. The initial value is GL_ZERO. See glBlendFunc and glBlendFuncSeparate.\r\n\r\nGL_BLEND_DST_RGB\r\nparams returns one value, the symbolic constant identifying the RGB destination blend function. The initial value is GL_ZERO. See glBlendFunc and glBlendFuncSeparate.\r\n\r\nGL_BLEND_EQUATION_RGB\r\nparams returns one value, a symbolic constant indicating whether the RGB blend equation is GL_FUNC_ADD, GL_FUNC_SUBTRACT, GL_FUNC_REVERSE_SUBTRACT, GL_MIN or GL_MAX. See glBlendEquationSeparate.\r\n\r\nGL_BLEND_EQUATION_ALPHA\r\nparams returns one value, a symbolic constant indicating whether the Alpha blend equation is GL_FUNC_ADD, GL_FUNC_SUBTRACT, GL_FUNC_REVERSE_SUBTRACT, GL_MIN or GL_MAX. See glBlendEquationSeparate.\r\n\r\nGL_BLEND_SRC_ALPHA\r\nparams returns one value, the symbolic constant identifying the alpha source blend function. The initial value is GL_ONE. See glBlendFunc and glBlendFuncSeparate.\r\n\r\nGL_BLEND_SRC_RGB\r\nparams returns one value, the symbolic constant identifying the RGB source blend function. The initial value is GL_ONE. See glBlendFunc and glBlendFuncSeparate.\r\n\r\nGL_BLUE_BIAS\r\nparams returns one value, the blue bias factor used during pixel transfers. The initial value is 0. See glPixelTransfer.\r\n\r\nGL_BLUE_BITS\r\nparams returns one value, the number of blue bitplanes in each color buffer.\r\n\r\nGL_BLUE_SCALE\r\nparams returns one value, the blue scale factor used during pixel transfers. The initial value is 1. See glPixelTransfer.\r\n\r\nGL_CLIENT_ACTIVE_TEXTURE\r\nparams returns a single integer value indicating the current client active multitexture unit. The initial value is GL_TEXTURE0. See glClientActiveTexture.\r\n\r\nGL_CLIENT_ATTRIB_STACK_DEPTH\r\nparams returns one value indicating the depth of the attribute stack. The initial value is 0. See glPushClientAttrib.\r\n\r\nGL_CLIP_PLANEi\r\nparams returns a single boolean value indicating whether the specified clipping plane is enabled. The initial value is GL_FALSE. See glClipPlane.\r\n\r\nGL_COLOR_ARRAY\r\nparams returns a single boolean value indicating whether the color array is enabled. The initial value is GL_FALSE. See glColorPointer.\r\n\r\nGL_COLOR_ARRAY_BUFFER_BINDING\r\nparams returns a single value, the name of the buffer object associated with the color array. This buffer object would have been bound to the target GL_ARRAY_BUFFER at the time of the most recent call to glColorPointer. If no buffer object was bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\n\r\nGL_COLOR_ARRAY_SIZE\r\nparams returns one value, the number of components per color in the color array. The initial value is 4. See glColorPointer.\r\n\r\nGL_COLOR_ARRAY_STRIDE\r\nparams returns one value, the byte offset between consecutive colors in the color array. The initial value is 0. See glColorPointer.\r\n\r\nGL_COLOR_ARRAY_TYPE\r\nparams returns one value, the data type of each component in the color array. The initial value is GL_FLOAT. See glColorPointer.\r\n\r\nGL_COLOR_CLEAR_VALUE\r\nparams returns four values: the red, green, blue, and alpha values used to clear the color buffers. Integer values, if requested, are linearly mapped from the internal floating-point representation such that 1.0 returns the most positive representable integer value, and -1.0 returns the most negative representable integer value. The initial value is (0, 0, 0, 0). See glClearColor.\r\n\r\nGL_COLOR_LOGIC_OP\r\nparams returns a single boolean value indicating whether a fragment's RGBA color values are merged into the framebuffer using a logical operation. The initial value is GL_FALSE. See glLogicOp.\r\n\r\nGL_COLOR_MATERIAL\r\nparams returns a single boolean value indicating whether one or more material parameters are tracking the current color. The initial value is GL_FALSE. See glColorMaterial.\r\n\r\nGL_COLOR_MATERIAL_FACE\r\nparams returns one value, a symbolic constant indicating which materials have a parameter that is tracking the current color. The initial value is GL_FRONT_AND_BACK. See glColorMaterial.\r\n\r\nGL_COLOR_MATERIAL_PARAMETER\r\nparams returns one value, a symbolic constant indicating which material parameters are tracking the current color. The initial value is GL_AMBIENT_AND_DIFFUSE. See glColorMaterial.\r\n\r\nGL_COLOR_MATRIX\r\nparams returns sixteen values: the color matrix on the top of the color matrix stack. Initially this matrix is the identity matrix. See glPushMatrix.\r\n\r\nGL_COLOR_MATRIX_STACK_DEPTH\r\nparams returns one value, the maximum supported depth of the projection matrix stack. The value must be at least 2. See glPushMatrix.\r\n\r\nGL_COLOR_SUM\r\nparams returns a single boolean value indicating whether primary and secondary color sum is enabled. See glSecondaryColor.\r\n\r\nGL_COLOR_TABLE\r\nparams returns a single boolean value indicating whether the color table lookup is enabled. See glColorTable.\r\n\r\nGL_COLOR_WRITEMASK\r\nparams returns four boolean values: the red, green, blue, and alpha write enables for the color buffers. The initial value is (GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE). See glColorMask.\r\n\r\nGL_COMPRESSED_TEXTURE_FORMATS\r\nparams returns a list of symbolic constants of length GL_NUM_COMPRESSED_TEXTURE_FORMATS indicating which compressed texture formats are available. See glCompressedTexImage2D.\r\n\r\nGL_CONVOLUTION_1D\r\nparams returns a single boolean value indicating whether 1D convolution is enabled. The initial value is GL_FALSE. See glConvolutionFilter1D.\r\n\r\nGL_CONVOLUTION_2D\r\nparams returns a single boolean value indicating whether 2D convolution is enabled. The initial value is GL_FALSE. See glConvolutionFilter2D.\r\n\r\nGL_CULL_FACE\r\nparams returns a single boolean value indicating whether polygon culling is enabled. The initial value is GL_FALSE. See glCullFace.\r\n\r\nGL_CULL_FACE_MODE\r\nparams returns one value, a symbolic constant indicating which polygon faces are to be culled. The initial value is GL_BACK. See glCullFace.\r\n\r\nGL_CURRENT_COLOR\r\nparams returns four values: the red, green, blue, and alpha values of the current color. Integer values, if requested, are linearly mapped from the internal floating-point representation such that 1.0 returns the most positive representable integer value, and -1.0 returns the most negative representable integer value. The initial value is (1, 1, 1, 1). See glColor.\r\n\r\nGL_CURRENT_FOG_COORD\r\nparams returns one value, the current fog coordinate. The initial value is 0. See glFogCoord.\r\n\r\nGL_CURRENT_INDEX\r\nparams returns one value, the current color index. The initial value is 1. See glIndex.\r\n\r\nGL_CURRENT_NORMAL\r\nparams returns three values: the x, y, and z values of the current normal. Integer values, if requested, are linearly mapped from the internal floating-point representation such that 1.0 returns the most positive representable integer value, and -1.0 returns the most negative representable integer value. The initial value is (0, 0, 1). See glNormal.\r\n\r\nGL_CURRENT_PROGRAM\r\nparams returns one value, the name of the program object that is currently active, or 0 if no program object is active. See glUseProgram.\r\n\r\nGL_CURRENT_RASTER_COLOR\r\nparams returns four values: the red, green, blue, and alpha color values of the current raster position. Integer values, if requested, are linearly mapped from the internal floating-point representation such that 1.0 returns the most positive representable integer value, and -1.0 returns the most negative representable integer value. The initial value is (1, 1, 1, 1). See glRasterPos.\r\n\r\nGL_CURRENT_RASTER_DISTANCE\r\nparams returns one value, the distance from the eye to the current raster position. The initial value is 0. See glRasterPos.\r\n\r\nGL_CURRENT_RASTER_INDEX\r\nparams returns one value, the color index of the current raster position. The initial value is 1. See glRasterPos.\r\n\r\nGL_CURRENT_RASTER_POSITION\r\nparams returns four values: the x, y, z, and w components of the current raster position. x, y, and z are in window coordinates, and w is in clip coordinates. The initial value is (0, 0, 0, 1). See glRasterPos.\r\n\r\nGL_CURRENT_RASTER_POSITION_VALID\r\nparams returns a single boolean value indicating whether the current raster position is valid. The initial value is GL_TRUE. See glRasterPos.\r\n\r\nGL_CURRENT_RASTER_SECONDARY_COLOR\r\nparams returns four values: the red, green, blue, and alpha secondary color values of the current raster position. Integer values, if requested, are linearly mapped from the internal floating-point representation such that 1.0 returns the most positive representable integer value, and -1.0 returns the most negative representable integer value. The initial value is (1, 1, 1, 1). See glRasterPos.\r\n\r\nGL_CURRENT_RASTER_TEXTURE_COORDS\r\nparams returns four values: the s, t, r, and q texture coordinates of the current raster position. The initial value is (0, 0, 0, 1). See glRasterPos and glMultiTexCoord.\r\n\r\nGL_CURRENT_SECONDARY_COLOR\r\nparams returns four values: the red, green, blue, and alpha values of the current secondary color. Integer values, if requested, are linearly mapped from the internal floating-point representation such that 1.0 returns the most positive representable integer value, and -1.0 returns the most negative representable integer value. The initial value is (0, 0, 0, 0). See glSecondaryColor.\r\n\r\nGL_CURRENT_TEXTURE_COORDS\r\nparams returns four values: the s, t, r, and q current texture coordinates. The initial value is (0, 0, 0, 1). See glMultiTexCoord.\r\n\r\nGL_DEPTH_BIAS\r\nparams returns one value, the depth bias factor used during pixel transfers. The initial value is 0. See glPixelTransfer.\r\n\r\nGL_DEPTH_BITS\r\nparams returns one value, the number of bitplanes in the depth buffer.\r\n\r\nGL_DEPTH_CLEAR_VALUE\r\nparams returns one value, the value that is used to clear the depth buffer. Integer values, if requested, are linearly mapped from the internal floating-point representation such that 1.0 returns the most positive representable integer value, and -1.0 returns the most negative representable integer value. The initial value is 1. See glClearDepth.\r\n\r\nGL_DEPTH_FUNC\r\nparams returns one value, the symbolic constant that indicates the depth comparison function. The initial value is GL_LESS. See glDepthFunc.\r\n\r\nGL_DEPTH_RANGE\r\nparams returns two values: the near and far mapping limits for the depth buffer. Integer values, if requested, are linearly mapped from the internal floating-point representation such that 1.0 returns the most positive representable integer value, and -1.0 returns the most negative representable integer value. The initial value is (0, 1). See glDepthRange.\r\n\r\nGL_DEPTH_SCALE\r\nparams returns one value, the depth scale factor used during pixel transfers. The initial value is 1. See glPixelTransfer.\r\n\r\nGL_DEPTH_TEST\r\nparams returns a single boolean value indicating whether depth testing of fragments is enabled. The initial value is GL_FALSE. See glDepthFunc and glDepthRange.\r\n\r\nGL_DEPTH_WRITEMASK\r\nparams returns a single boolean value indicating if the depth buffer is enabled for writing. The initial value is GL_TRUE. See glDepthMask.\r\n\r\nGL_DITHER\r\nparams returns a single boolean value indicating whether dithering of fragment colors and indices is enabled. The initial value is GL_TRUE.\r\n\r\nGL_DOUBLEBUFFER\r\nparams returns a single boolean value indicating whether double buffering is supported.\r\n\r\nGL_DRAW_BUFFER\r\nparams returns one value, a symbolic constant indicating which buffers are being drawn to. See glDrawBuffer. The initial value is GL_BACK if there are back buffers, otherwise it is GL_FRONT.\r\n\r\nGL_DRAW_BUFFERi\r\nparams returns one value, a symbolic constant indicating which buffers are being drawn to by the corresponding output color. See glDrawBuffers. The initial value of GL_DRAW_BUFFER0 is GL_BACK if there are back buffers, otherwise it is GL_FRONT. The initial values of draw buffers for all other output colors is GL_NONE.\r\n\r\nGL_EDGE_FLAG\r\nparams returns a single boolean value indicating whether the current edge flag is GL_TRUE or GL_FALSE. The initial value is GL_TRUE. See glEdgeFlag.\r\n\r\nGL_EDGE_FLAG_ARRAY\r\nparams returns a single boolean value indicating whether the edge flag array is enabled. The initial value is GL_FALSE. See glEdgeFlagPointer.\r\n\r\nGL_EDGE_FLAG_ARRAY_BUFFER_BINDING\r\nparams returns a single value, the name of the buffer object associated with the edge flag array. This buffer object would have been bound to the target GL_ARRAY_BUFFER at the time of the most recent call to glEdgeFlagPointer. If no buffer object was bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\n\r\nGL_EDGE_FLAG_ARRAY_STRIDE\r\nparams returns one value, the byte offset between consecutive edge flags in the edge flag array. The initial value is 0. See glEdgeFlagPointer.\r\n\r\nGL_ELEMENT_ARRAY_BUFFER_BINDING\r\nparams returns a single value, the name of the buffer object currently bound to the target GL_ELEMENT_ARRAY_BUFFER. If no buffer object is bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\n\r\nGL_FEEDBACK_BUFFER_SIZE\r\nparams returns one value, the size of the feedback buffer. See glFeedbackBuffer.\r\n\r\nGL_FEEDBACK_BUFFER_TYPE\r\nparams returns one value, the type of the feedback buffer. See glFeedbackBuffer.\r\n\r\nGL_FOG\r\nparams returns a single boolean value indicating whether fogging is enabled. The initial value is GL_FALSE. See glFog.\r\n\r\nGL_FOG_COORD_ARRAY\r\nparams returns a single boolean value indicating whether the fog coordinate array is enabled. The initial value is GL_FALSE. See glFogCoordPointer.\r\n\r\nGL_FOG_COORD_ARRAY_BUFFER_BINDING\r\nparams returns a single value, the name of the buffer object associated with the fog coordinate array. This buffer object would have been bound to the target GL_ARRAY_BUFFER at the time of the most recent call to glFogCoordPointer. If no buffer object was bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\n\r\nGL_FOG_COORD_ARRAY_STRIDE\r\nparams returns one value, the byte offset between consecutive fog coordinates in the fog coordinate array. The initial value is 0. See glFogCoordPointer.\r\n\r\nGL_FOG_COORD_ARRAY_TYPE\r\nparams returns one value, the type of the fog coordinate array. The initial value is GL_FLOAT. See glFogCoordPointer.\r\n\r\nGL_FOG_COORD_SRC\r\nparams returns one value, a symbolic constant indicating the source of the fog coordinate. The initial value is GL_FRAGMENT_DEPTH. See glFog.\r\n\r\nGL_FOG_COLOR\r\nparams returns four values: the red, green, blue, and alpha components of the fog color. Integer values, if requested, are linearly mapped from the internal floating-point representation such that 1.0 returns the most positive representable integer value, and -1.0 returns the most negative representable integer value. The initial value is (0, 0, 0, 0). See glFog.\r\n\r\nGL_FOG_DENSITY\r\nparams returns one value, the fog density parameter. The initial value is 1. See glFog.\r\n\r\nGL_FOG_END\r\nparams returns one value, the end factor for the linear fog equation. The initial value is 1. See glFog.\r\n\r\nGL_FOG_HINT\r\nparams returns one value, a symbolic constant indicating the mode of the fog hint. The initial value is GL_DONT_CARE. See glHint.\r\n\r\nGL_FOG_INDEX\r\nparams returns one value, the fog color index. The initial value is 0. See glFog.\r\n\r\nGL_FOG_MODE\r\nparams returns one value, a symbolic constant indicating which fog equation is selected. The initial value is GL_EXP. See glFog.\r\n\r\nGL_FOG_START\r\nparams returns one value, the start factor for the linear fog equation. The initial value is 0. See glFog.\r\n\r\nGL_FRAGMENT_SHADER_DERIVATIVE_HINT\r\nparams returns one value, a symbolic constant indicating the mode of the derivative accuracy hint for fragment shaders. The initial value is GL_DONT_CARE. See glHint.\r\n\r\nGL_FRONT_FACE\r\nparams returns one value, a symbolic constant indicating whether clockwise or counterclockwise polygon winding is treated as front-facing. The initial value is GL_CCW. See glFrontFace.\r\n\r\nGL_GENERATE_MIPMAP_HINT\r\nparams returns one value, a symbolic constant indicating the mode of the mipmap generation filtering hint. The initial value is GL_DONT_CARE. See glHint.\r\n\r\nGL_GREEN_BIAS\r\nparams returns one value, the green bias factor used during pixel transfers. The initial value is 0.\r\n\r\nGL_GREEN_BITS\r\nparams returns one value, the number of green bitplanes in each color buffer.\r\n\r\nGL_GREEN_SCALE\r\nparams returns one value, the green scale factor used during pixel transfers. The initial value is 1. See glPixelTransfer.\r\n\r\nGL_HISTOGRAM\r\nparams returns a single boolean value indicating whether histogram is enabled. The initial value is GL_FALSE. See glHistogram.\r\n\r\nGL_INDEX_ARRAY\r\nparams returns a single boolean value indicating whether the color index array is enabled. The initial value is GL_FALSE. See glIndexPointer.\r\n\r\nGL_INDEX_ARRAY_BUFFER_BINDING\r\nparams returns a single value, the name of the buffer object associated with the color index array. This buffer object would have been bound to the target GL_ARRAY_BUFFER at the time of the most recent call to glIndexPointer. If no buffer object was bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\n\r\nGL_INDEX_ARRAY_STRIDE\r\nparams returns one value, the byte offset between consecutive color indexes in the color index array. The initial value is 0. See glIndexPointer.\r\n\r\nGL_INDEX_ARRAY_TYPE\r\nparams returns one value, the data type of indexes in the color index array. The initial value is GL_FLOAT. See glIndexPointer.\r\n\r\nGL_INDEX_BITS\r\nparams returns one value, the number of bitplanes in each color index buffer.\r\n\r\nGL_INDEX_CLEAR_VALUE\r\nparams returns one value, the color index used to clear the color index buffers. The initial value is 0. See glClearIndex.\r\n\r\nGL_INDEX_LOGIC_OP\r\nparams returns a single boolean value indicating whether a fragment's index values are merged into the framebuffer using a logical operation. The initial value is GL_FALSE. See glLogicOp.\r\n\r\nGL_INDEX_MODE\r\nparams returns a single boolean value indicating whether the GL is in color index mode (GL_TRUE) or RGBA mode (GL_FALSE).\r\n\r\nGL_INDEX_OFFSET\r\nparams returns one value, the offset added to color and stencil indices during pixel transfers. The initial value is 0. See glPixelTransfer.\r\n\r\nGL_INDEX_SHIFT\r\nparams returns one value, the amount that color and stencil indices are shifted during pixel transfers. The initial value is 0. See glPixelTransfer.\r\n\r\nGL_INDEX_WRITEMASK\r\nparams returns one value, a mask indicating which bitplanes of each color index buffer can be written. The initial value is all 1's. See glIndexMask.\r\n\r\nGL_LIGHTi\r\nparams returns a single boolean value indicating whether the specified light is enabled. The initial value is GL_FALSE. See glLight and glLightModel.\r\n\r\nGL_LIGHTING\r\nparams returns a single boolean value indicating whether lighting is enabled. The initial value is GL_FALSE. See glLightModel.\r\n\r\nGL_LIGHT_MODEL_AMBIENT\r\nparams returns four values: the red, green, blue, and alpha components of the ambient intensity of the entire scene. Integer values, if requested, are linearly mapped from the internal floating-point representation such that 1.0 returns the most positive representable integer value, and -1.0 returns the most negative representable integer value. The initial value is (0.2, 0.2, 0.2, 1.0). See glLightModel.\r\n\r\nGL_LIGHT_MODEL_COLOR_CONTROL\r\nparams returns single enumerated value indicating whether specular reflection calculations are separated from normal lighting computations. The initial value is GL_SINGLE_COLOR.\r\n\r\nGL_LIGHT_MODEL_LOCAL_VIEWER\r\nparams returns a single boolean value indicating whether specular reflection calculations treat the viewer as being local to the scene. The initial value is GL_FALSE. See glLightModel.\r\n\r\nGL_LIGHT_MODEL_TWO_SIDE\r\nparams returns a single boolean value indicating whether separate materials are used to compute lighting for front- and back-facing polygons. The initial value is GL_FALSE. See glLightModel.\r\n\r\nGL_LINE_SMOOTH\r\nparams returns a single boolean value indicating whether antialiasing of lines is enabled. The initial value is GL_FALSE. See glLineWidth.\r\n\r\nGL_LINE_SMOOTH_HINT\r\nparams returns one value, a symbolic constant indicating the mode of the line antialiasing hint. The initial value is GL_DONT_CARE. See glHint.\r\n\r\nGL_LINE_STIPPLE\r\nparams returns a single boolean value indicating whether stippling of lines is enabled. The initial value is GL_FALSE. See glLineStipple.\r\n\r\nGL_LINE_STIPPLE_PATTERN\r\nparams returns one value, the 16-bit line stipple pattern. The initial value is all 1's. See glLineStipple.\r\n\r\nGL_LINE_STIPPLE_REPEAT\r\nparams returns one value, the line stipple repeat factor. The initial value is 1. See glLineStipple.\r\n\r\nGL_LINE_WIDTH\r\nparams returns one value, the line width as specified with glLineWidth. The initial value is 1.\r\n\r\nGL_LINE_WIDTH_GRANULARITY\r\nparams returns one value, the width difference between adjacent supported widths for antialiased lines. See glLineWidth.\r\n\r\nGL_LINE_WIDTH_RANGE\r\nparams returns two values: the smallest and largest supported widths for antialiased lines. See glLineWidth.\r\n\r\nGL_LIST_BASE\r\nparams returns one value, the base offset added to all names in arrays presented to glCallLists. The initial value is 0. See glListBase.\r\n\r\nGL_LIST_INDEX\r\nparams returns one value, the name of the display list currently under construction. 0 is returned if no display list is currently under construction. The initial value is 0. See glNewList.\r\n\r\nGL_LIST_MODE\r\nparams returns one value, a symbolic constant indicating the construction mode of the display list currently under construction. The initial value is 0. See glNewList.\r\n\r\nGL_LOGIC_OP_MODE\r\nparams returns one value, a symbolic constant indicating the selected logic operation mode. The initial value is GL_COPY. See glLogicOp.\r\n\r\nGL_MAP1_COLOR_4\r\nparams returns a single boolean value indicating whether 1D evaluation generates colors. The initial value is GL_FALSE. See glMap1.\r\n\r\nGL_MAP1_GRID_DOMAIN\r\nparams returns two values: the endpoints of the 1D map's grid domain. The initial value is (0, 1). See glMapGrid.\r\n\r\nGL_MAP1_GRID_SEGMENTS\r\nparams returns one value, the number of partitions in the 1D map's grid domain. The initial value is 1. See glMapGrid.\r\n\r\nGL_MAP1_INDEX\r\nparams returns a single boolean value indicating whether 1D evaluation generates color indices. The initial value is GL_FALSE. See glMap1.\r\n\r\nGL_MAP1_NORMAL\r\nparams returns a single boolean value indicating whether 1D evaluation generates normals. The initial value is GL_FALSE. See glMap1.\r\n\r\nGL_MAP1_TEXTURE_COORD_1\r\nparams returns a single boolean value indicating whether 1D evaluation generates 1D texture coordinates. The initial value is GL_FALSE. See glMap1.\r\n\r\nGL_MAP1_TEXTURE_COORD_2\r\nparams returns a single boolean value indicating whether 1D evaluation generates 2D texture coordinates. The initial value is GL_FALSE. See glMap1.\r\n\r\nGL_MAP1_TEXTURE_COORD_3\r\nparams returns a single boolean value indicating whether 1D evaluation generates 3D texture coordinates. The initial value is GL_FALSE. See glMap1.\r\n\r\nGL_MAP1_TEXTURE_COORD_4\r\nparams returns a single boolean value indicating whether 1D evaluation generates 4D texture coordinates. The initial value is GL_FALSE. See glMap1.\r\n\r\nGL_MAP1_VERTEX_3\r\nparams returns a single boolean value indicating whether 1D evaluation generates 3D vertex coordinates. The initial value is GL_FALSE. See glMap1.\r\n\r\nGL_MAP1_VERTEX_4\r\nparams returns a single boolean value indicating whether 1D evaluation generates 4D vertex coordinates. The initial value is GL_FALSE. See glMap1.\r\n\r\nGL_MAP2_COLOR_4\r\nparams returns a single boolean value indicating whether 2D evaluation generates colors. The initial value is GL_FALSE. See glMap2.\r\n\r\nGL_MAP2_GRID_DOMAIN\r\nparams returns four values: the endpoints of the 2D map's i and j grid domains. The initial value is (0,1; 0,1). See glMapGrid.\r\n\r\nGL_MAP2_GRID_SEGMENTS\r\nparams returns two values: the number of partitions in the 2D map's i and j grid domains. The initial value is (1,1). See glMapGrid.\r\n\r\nGL_MAP2_INDEX\r\nparams returns a single boolean value indicating whether 2D evaluation generates color indices. The initial value is GL_FALSE. See glMap2.\r\n\r\nGL_MAP2_NORMAL\r\nparams returns a single boolean value indicating whether 2D evaluation generates normals. The initial value is GL_FALSE. See glMap2.\r\n\r\nGL_MAP2_TEXTURE_COORD_1\r\nparams returns a single boolean value indicating whether 2D evaluation generates 1D texture coordinates. The initial value is GL_FALSE. See glMap2.\r\n\r\nGL_MAP2_TEXTURE_COORD_2\r\nparams returns a single boolean value indicating whether 2D evaluation generates 2D texture coordinates. The initial value is GL_FALSE. See glMap2.\r\n\r\nGL_MAP2_TEXTURE_COORD_3\r\nparams returns a single boolean value indicating whether 2D evaluation generates 3D texture coordinates. The initial value is GL_FALSE. See glMap2.\r\n\r\nGL_MAP2_TEXTURE_COORD_4\r\nparams returns a single boolean value indicating whether 2D evaluation generates 4D texture coordinates. The initial value is GL_FALSE. See glMap2.\r\n\r\nGL_MAP2_VERTEX_3\r\nparams returns a single boolean value indicating whether 2D evaluation generates 3D vertex coordinates. The initial value is GL_FALSE. See glMap2.\r\n\r\nGL_MAP2_VERTEX_4\r\nparams returns a single boolean value indicating whether 2D evaluation generates 4D vertex coordinates. The initial value is GL_FALSE. See glMap2.\r\n\r\nGL_MAP_COLOR\r\nparams returns a single boolean value indicating if colors and color indices are to be replaced by table lookup during pixel transfers. The initial value is GL_FALSE. See glPixelTransfer.\r\n\r\nGL_MAP_STENCIL\r\nparams returns a single boolean value indicating if stencil indices are to be replaced by table lookup during pixel transfers. The initial value is GL_FALSE. See glPixelTransfer.\r\n\r\nGL_MATRIX_MODE\r\nparams returns one value, a symbolic constant indicating which matrix stack is currently the target of all matrix operations. The initial value is GL_MODELVIEW. See glMatrixMode.\r\n\r\nGL_MAX_3D_TEXTURE_SIZE\r\nparams returns one value, a rough estimate of the largest 3D texture that the GL can handle. The value must be at least 16. If the GL version is 1.2 or greater, use GL_PROXY_TEXTURE_3D to determine if a texture is too large. See glTexImage3D.\r\n\r\nGL_MAX_CLIENT_ATTRIB_STACK_DEPTH\r\nparams returns one value indicating the maximum supported depth of the client attribute stack. See glPushClientAttrib.\r\n\r\nGL_MAX_ATTRIB_STACK_DEPTH\r\nparams returns one value, the maximum supported depth of the attribute stack. The value must be at least 16. See glPushAttrib.\r\n\r\nGL_MAX_CLIP_PLANES\r\nparams returns one value, the maximum number of application-defined clipping planes. The value must be at least 6. See glClipPlane.\r\n\r\nGL_MAX_COLOR_MATRIX_STACK_DEPTH\r\nparams returns one value, the maximum supported depth of the color matrix stack. The value must be at least 2. See glPushMatrix.\r\n\r\nGL_MAX_COMBINED_TEXTURE_IMAGE_UNITS\r\nparams returns one value, the maximum supported texture image units that can be used to access texture maps from the vertex shader and the fragment processor combined. If both the vertex shader and the fragment processing stage access the same texture image unit, then that counts as using two texture image units against this limit. The value must be at least 2. See glActiveTexture.\r\n\r\nGL_MAX_CUBE_MAP_TEXTURE_SIZE\r\nparams returns one value. The value gives a rough estimate of the largest cube-map texture that the GL can handle. The value must be at least 16. If the GL version is 1.3 or greater, use GL_PROXY_TEXTURE_CUBE_MAP to determine if a texture is too large. See glTexImage2D.\r\n\r\nGL_MAX_DRAW_BUFFERS\r\nparams returns one value, the maximum number of simultaneous output colors allowed from a fragment shader using the gl_FragData built-in array. The value must be at least 1. See glDrawBuffers.\r\n\r\nGL_MAX_ELEMENTS_INDICES\r\nparams returns one value, the recommended maximum number of vertex array indices. See glDrawRangeElements.\r\n\r\nGL_MAX_ELEMENTS_VERTICES\r\nparams returns one value, the recommended maximum number of vertex array vertices. See glDrawRangeElements.\r\n\r\nGL_MAX_EVAL_ORDER\r\nparams returns one value, the maximum equation order supported by 1D and 2D evaluators. The value must be at least 8. See glMap1 and glMap2.\r\n\r\nGL_MAX_FRAGMENT_UNIFORM_COMPONENTS\r\nparams returns one value, the maximum number of individual floating-point, integer, or boolean values that can be held in uniform variable storage for a fragment shader. The value must be at least 64. See glUniform.\r\n\r\nGL_MAX_LIGHTS\r\nparams returns one value, the maximum number of lights. The value must be at least 8. See glLight.\r\n\r\nGL_MAX_LIST_NESTING\r\nparams returns one value, the maximum recursion depth allowed during display-list traversal. The value must be at least 64. See glCallList.\r\n\r\nGL_MAX_MODELVIEW_STACK_DEPTH\r\nparams returns one value, the maximum supported depth of the modelview matrix stack. The value must be at least 32. See glPushMatrix.\r\n\r\nGL_MAX_NAME_STACK_DEPTH\r\nparams returns one value, the maximum supported depth of the selection name stack. The value must be at least 64. See glPushName.\r\n\r\nGL_MAX_PIXEL_MAP_TABLE\r\nparams returns one value, the maximum supported size of a glPixelMap lookup table. The value must be at least 32. See glPixelMap.\r\n\r\nGL_MAX_PROJECTION_STACK_DEPTH\r\nparams returns one value, the maximum supported depth of the projection matrix stack. The value must be at least 2. See glPushMatrix.\r\n\r\nGL_MAX_TEXTURE_COORDS\r\nparams returns one value, the maximum number of texture coordinate sets available to vertex and fragment shaders. The value must be at least 2. See glActiveTexture and glClientActiveTexture.\r\n\r\nGL_MAX_TEXTURE_IMAGE_UNITS\r\nparams returns one value, the maximum supported texture image units that can be used to access texture maps from the fragment shader. The value must be at least 2. See glActiveTexture.\r\n\r\nGL_MAX_TEXTURE_LOD_BIAS\r\nparams returns one value, the maximum, absolute value of the texture level-of-detail bias. The value must be at least 4.\r\n\r\nGL_MAX_TEXTURE_SIZE\r\nparams returns one value. The value gives a rough estimate of the largest texture that the GL can handle. The value must be at least 64. If the GL version is 1.1 or greater, use GL_PROXY_TEXTURE_1D or GL_PROXY_TEXTURE_2D to determine if a texture is too large. See glTexImage1D and glTexImage2D.\r\n\r\nGL_MAX_TEXTURE_STACK_DEPTH\r\nparams returns one value, the maximum supported depth of the texture matrix stack. The value must be at least 2. See glPushMatrix.\r\n\r\nGL_MAX_TEXTURE_UNITS\r\nparams returns a single value indicating the number of conventional texture units supported. Each conventional texture unit includes both a texture coordinate set and a texture image unit. Conventional texture units may be used for fixed-function (non-shader) rendering. The value must be at least 2. Additional texture coordinate sets and texture image units may be accessed from vertex and fragment shaders. See glActiveTexture and glClientActiveTexture.\r\n\r\nGL_MAX_VARYING_FLOATS\r\nparams returns one value, the maximum number of interpolators available for processing varying variables used by vertex and fragment shaders. This value represents the number of individual floating-point values that can be interpolated; varying variables declared as vectors, matrices, and arrays will all consume multiple interpolators. The value must be at least 32.\r\n\r\nGL_MAX_VERTEX_ATTRIBS\r\nparams returns one value, the maximum number of 4-component generic vertex attributes accessible to a vertex shader. The value must be at least 16. See glVertexAttrib.\r\n\r\nGL_MAX_VERTEX_TEXTURE_IMAGE_UNITS\r\nparams returns one value, the maximum supported texture image units that can be used to access texture maps from the vertex shader. The value may be 0. See glActiveTexture.\r\n\r\nGL_MAX_VERTEX_UNIFORM_COMPONENTS\r\nparams returns one value, the maximum number of individual floating-point, integer, or boolean values that can be held in uniform variable storage for a vertex shader. The value must be at least 512. See glUniform.\r\n\r\nGL_MAX_VIEWPORT_DIMS\r\nparams returns two values: the maximum supported width and height of the viewport. These must be at least as large as the visible dimensions of the display being rendered to. See glViewport.\r\n\r\nGL_MINMAX\r\nparams returns a single boolean value indicating whether pixel minmax values are computed. The initial value is GL_FALSE. See glMinmax.\r\n\r\nGL_MODELVIEW_MATRIX\r\nparams returns sixteen values: the modelview matrix on the top of the modelview matrix stack. Initially this matrix is the identity matrix. See glPushMatrix.\r\n\r\nGL_MODELVIEW_STACK_DEPTH\r\nparams returns one value, the number of matrices on the modelview matrix stack. The initial value is 1. See glPushMatrix.\r\n\r\nGL_NAME_STACK_DEPTH\r\nparams returns one value, the number of names on the selection name stack. The initial value is 0. See glPushName.\r\n\r\nGL_NORMAL_ARRAY\r\nparams returns a single boolean value, indicating whether the normal array is enabled. The initial value is GL_FALSE. See glNormalPointer.\r\n\r\nGL_NORMAL_ARRAY_BUFFER_BINDING\r\nparams returns a single value, the name of the buffer object associated with the normal array. This buffer object would have been bound to the target GL_ARRAY_BUFFER at the time of the most recent call to glNormalPointer. If no buffer object was bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\n\r\nGL_NORMAL_ARRAY_STRIDE\r\nparams returns one value, the byte offset between consecutive normals in the normal array. The initial value is 0. See glNormalPointer.\r\n\r\nGL_NORMAL_ARRAY_TYPE\r\nparams returns one value, the data type of each coordinate in the normal array. The initial value is GL_FLOAT. See glNormalPointer.\r\n\r\nGL_NORMALIZE\r\nparams returns a single boolean value indicating whether normals are automatically scaled to unit length after they have been transformed to eye coordinates. The initial value is GL_FALSE. See glNormal.\r\n\r\nGL_NUM_COMPRESSED_TEXTURE_FORMATS\r\nparams returns a single integer value indicating the number of available compressed texture formats. The minimum value is 0. See glCompressedTexImage2D.\r\n\r\nGL_PACK_ALIGNMENT\r\nparams returns one value, the byte alignment used for writing pixel data to memory. The initial value is 4. See glPixelStore.\r\n\r\nGL_PACK_IMAGE_HEIGHT\r\nparams returns one value, the image height used for writing pixel data to memory. The initial value is 0. See glPixelStore.\r\n\r\nGL_PACK_LSB_FIRST\r\nparams returns a single boolean value indicating whether single-bit pixels being written to memory are written first to the least significant bit of each unsigned byte. The initial value is GL_FALSE. See glPixelStore.\r\n\r\nGL_PACK_ROW_LENGTH\r\nparams returns one value, the row length used for writing pixel data to memory. The initial value is 0. See glPixelStore.\r\n\r\nGL_PACK_SKIP_IMAGES\r\nparams returns one value, the number of pixel images skipped before the first pixel is written into memory. The initial value is 0. See glPixelStore.\r\n\r\nGL_PACK_SKIP_PIXELS\r\nparams returns one value, the number of pixel locations skipped before the first pixel is written into memory. The initial value is 0. See glPixelStore.\r\n\r\nGL_PACK_SKIP_ROWS\r\nparams returns one value, the number of rows of pixel locations skipped before the first pixel is written into memory. The initial value is 0. See glPixelStore.\r\n\r\nGL_PACK_SWAP_BYTES\r\nparams returns a single boolean value indicating whether the bytes of two-byte and four-byte pixel indices and components are swapped before being written to memory. The initial value is GL_FALSE. See glPixelStore.\r\n\r\nGL_PERSPECTIVE_CORRECTION_HINT\r\nparams returns one value, a symbolic constant indicating the mode of the perspective correction hint. The initial value is GL_DONT_CARE. See glHint.\r\n\r\nGL_PIXEL_MAP_A_TO_A_SIZE\r\nparams returns one value, the size of the alpha-to-alpha pixel translation table. The initial value is 1. See glPixelMap.\r\n\r\nGL_PIXEL_MAP_B_TO_B_SIZE\r\nparams returns one value, the size of the blue-to-blue pixel translation table. The initial value is 1. See glPixelMap.\r\n\r\nGL_PIXEL_MAP_G_TO_G_SIZE\r\nparams returns one value, the size of the green-to-green pixel translation table. The initial value is 1. See glPixelMap.\r\n\r\nGL_PIXEL_MAP_I_TO_A_SIZE\r\nparams returns one value, the size of the index-to-alpha pixel translation table. The initial value is 1. See glPixelMap.\r\n\r\nGL_PIXEL_MAP_I_TO_B_SIZE\r\nparams returns one value, the size of the index-to-blue pixel translation table. The initial value is 1. See glPixelMap.\r\n\r\nGL_PIXEL_MAP_I_TO_G_SIZE\r\nparams returns one value, the size of the index-to-green pixel translation table. The initial value is 1. See glPixelMap.\r\n\r\nGL_PIXEL_MAP_I_TO_I_SIZE\r\nparams returns one value, the size of the index-to-index pixel translation table. The initial value is 1. See glPixelMap.\r\n\r\nGL_PIXEL_MAP_I_TO_R_SIZE\r\nparams returns one value, the size of the index-to-red pixel translation table. The initial value is 1. See glPixelMap.\r\n\r\nGL_PIXEL_MAP_R_TO_R_SIZE\r\nparams returns one value, the size of the red-to-red pixel translation table. The initial value is 1. See glPixelMap.\r\n\r\nGL_PIXEL_MAP_S_TO_S_SIZE\r\nparams returns one value, the size of the stencil-to-stencil pixel translation table. The initial value is 1. See glPixelMap.\r\n\r\nGL_PIXEL_PACK_BUFFER_BINDING\r\nparams returns a single value, the name of the buffer object currently bound to the target GL_PIXEL_PACK_BUFFER. If no buffer object is bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\n\r\nGL_PIXEL_UNPACK_BUFFER_BINDING\r\nparams returns a single value, the name of the buffer object currently bound to the target GL_PIXEL_UNPACK_BUFFER. If no buffer object is bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\n\r\nGL_POINT_DISTANCE_ATTENUATION\r\nparams returns three values, the coefficients for computing the attenuation value for points. See glPointParameter.\r\n\r\nGL_POINT_FADE_THRESHOLD_SIZE\r\nparams returns one value, the point size threshold for determining the point size. See glPointParameter.\r\n\r\nGL_POINT_SIZE\r\nparams returns one value, the point size as specified by glPointSize. The initial value is 1.\r\n\r\nGL_POINT_SIZE_GRANULARITY\r\nparams returns one value, the size difference between adjacent supported sizes for antialiased points. See glPointSize.\r\n\r\nGL_POINT_SIZE_MAX\r\nparams returns one value, the upper bound for the attenuated point sizes. The initial value is 0.0. See glPointParameter.\r\n\r\nGL_POINT_SIZE_MIN\r\nparams returns one value, the lower bound for the attenuated point sizes. The initial value is 1.0. See glPointParameter.\r\n\r\nGL_POINT_SIZE_RANGE\r\nparams returns two values: the smallest and largest supported sizes for antialiased points. The smallest size must be at most 1, and the largest size must be at least 1. See glPointSize.\r\n\r\nGL_POINT_SMOOTH\r\nparams returns a single boolean value indicating whether antialiasing of points is enabled. The initial value is GL_FALSE. See glPointSize.\r\n\r\nGL_POINT_SMOOTH_HINT\r\nparams returns one value, a symbolic constant indicating the mode of the point antialiasing hint. The initial value is GL_DONT_CARE. See glHint.\r\n\r\nGL_POINT_SPRITE\r\nparams returns a single boolean value indicating whether point sprite is enabled. The initial value is GL_FALSE.\r\n\r\nGL_POLYGON_MODE\r\nparams returns two values: symbolic constants indicating whether front-facing and back-facing polygons are rasterized as points, lines, or filled polygons. The initial value is GL_FILL. See glPolygonMode.\r\n\r\nGL_POLYGON_OFFSET_FACTOR\r\nparams returns one value, the scaling factor used to determine the variable offset that is added to the depth value of each fragment generated when a polygon is rasterized. The initial value is 0. See glPolygonOffset.\r\n\r\nGL_POLYGON_OFFSET_UNITS\r\nparams returns one value. This value is multiplied by an implementation-specific value and then added to the depth value of each fragment generated when a polygon is rasterized. The initial value is 0. See glPolygonOffset.\r\n\r\nGL_POLYGON_OFFSET_FILL\r\nparams returns a single boolean value indicating whether polygon offset is enabled for polygons in fill mode. The initial value is GL_FALSE. See glPolygonOffset.\r\n\r\nGL_POLYGON_OFFSET_LINE\r\nparams returns a single boolean value indicating whether polygon offset is enabled for polygons in line mode. The initial value is GL_FALSE. See glPolygonOffset.\r\n\r\nGL_POLYGON_OFFSET_POINT\r\nparams returns a single boolean value indicating whether polygon offset is enabled for polygons in point mode. The initial value is GL_FALSE. See glPolygonOffset.\r\n\r\nGL_POLYGON_SMOOTH\r\nparams returns a single boolean value indicating whether antialiasing of polygons is enabled. The initial value is GL_FALSE. See glPolygonMode.\r\n\r\nGL_POLYGON_SMOOTH_HINT\r\nparams returns one value, a symbolic constant indicating the mode of the polygon antialiasing hint. The initial value is GL_DONT_CARE. See glHint.\r\n\r\nGL_POLYGON_STIPPLE\r\nparams returns a single boolean value indicating whether polygon stippling is enabled. The initial value is GL_FALSE. See glPolygonStipple.\r\n\r\nGL_POST_COLOR_MATRIX_COLOR_TABLE\r\nparams returns a single boolean value indicating whether post color matrix transformation lookup is enabled. The initial value is GL_FALSE. See glColorTable.\r\n\r\nGL_POST_COLOR_MATRIX_RED_BIAS\r\nparams returns one value, the red bias factor applied to RGBA fragments after color matrix transformations. The initial value is 0. See glPixelTransfer.\r\n\r\nGL_POST_COLOR_MATRIX_GREEN_BIAS\r\nparams returns one value, the green bias factor applied to RGBA fragments after color matrix transformations. The initial value is 0. See glPixelTransfer\r\n\r\nGL_POST_COLOR_MATRIX_BLUE_BIAS\r\nparams returns one value, the blue bias factor applied to RGBA fragments after color matrix transformations. The initial value is 0. See glPixelTransfer.\r\n\r\nGL_POST_COLOR_MATRIX_ALPHA_BIAS\r\nparams returns one value, the alpha bias factor applied to RGBA fragments after color matrix transformations. The initial value is 0. See glPixelTransfer.\r\n\r\nGL_POST_COLOR_MATRIX_RED_SCALE\r\nparams returns one value, the red scale factor applied to RGBA fragments after color matrix transformations. The initial value is 1. See glPixelTransfer.\r\n\r\nGL_POST_COLOR_MATRIX_GREEN_SCALE\r\nparams returns one value, the green scale factor applied to RGBA fragments after color matrix transformations. The initial value is 1. See glPixelTransfer.\r\n\r\nGL_POST_COLOR_MATRIX_BLUE_SCALE\r\nparams returns one value, the blue scale factor applied to RGBA fragments after color matrix transformations. The initial value is 1. See glPixelTransfer.\r\n\r\nGL_POST_COLOR_MATRIX_ALPHA_SCALE\r\nparams returns one value, the alpha scale factor applied to RGBA fragments after color matrix transformations. The initial value is 1. See glPixelTransfer.\r\n\r\nGL_POST_CONVOLUTION_COLOR_TABLE\r\nparams returns a single boolean value indicating whether post convolution lookup is enabled. The initial value is GL_FALSE. See glColorTable.\r\n\r\nGL_POST_CONVOLUTION_RED_BIAS\r\nparams returns one value, the red bias factor applied to RGBA fragments after convolution. The initial value is 0. See glPixelTransfer.\r\n\r\nGL_POST_CONVOLUTION_GREEN_BIAS\r\nparams returns one value, the green bias factor applied to RGBA fragments after convolution. The initial value is 0. See glPixelTransfer.\r\n\r\nGL_POST_CONVOLUTION_BLUE_BIAS\r\nparams returns one value, the blue bias factor applied to RGBA fragments after convolution. The initial value is 0. See glPixelTransfer.\r\n\r\nGL_POST_CONVOLUTION_ALPHA_BIAS\r\nparams returns one value, the alpha bias factor applied to RGBA fragments after convolution. The initial value is 0. See glPixelTransfer.\r\n\r\nGL_POST_CONVOLUTION_RED_SCALE\r\nparams returns one value, the red scale factor applied to RGBA fragments after convolution. The initial value is 1. See glPixelTransfer.\r\n\r\nGL_POST_CONVOLUTION_GREEN_SCALE\r\nparams returns one value, the green scale factor applied to RGBA fragments after convolution. The initial value is 1. See glPixelTransfer.\r\n\r\nGL_POST_CONVOLUTION_BLUE_SCALE\r\nparams returns one value, the blue scale factor applied to RGBA fragments after convolution. The initial value is 1. See glPixelTransfer.\r\n\r\nGL_POST_CONVOLUTION_ALPHA_SCALE\r\nparams returns one value, the alpha scale factor applied to RGBA fragments after convolution. The initial value is 1. See glPixelTransfer.\r\n\r\nGL_PROJECTION_MATRIX\r\nparams returns sixteen values: the projection matrix on the top of the projection matrix stack. Initially this matrix is the identity matrix. See glPushMatrix.\r\n\r\nGL_PROJECTION_STACK_DEPTH\r\nparams returns one value, the number of matrices on the projection matrix stack. The initial value is 1. See glPushMatrix.\r\n\r\nGL_READ_BUFFER\r\nparams returns one value, a symbolic constant indicating which color buffer is selected for reading. The initial value is GL_BACK if there is a back buffer, otherwise it is GL_FRONT. See glReadPixels and glAccum.\r\n\r\nGL_RED_BIAS\r\nparams returns one value, the red bias factor used during pixel transfers. The initial value is 0.\r\n\r\nGL_RED_BITS\r\nparams returns one value, the number of red bitplanes in each color buffer.\r\n\r\nGL_RED_SCALE\r\nparams returns one value, the red scale factor used during pixel transfers. The initial value is 1. See glPixelTransfer.\r\n\r\nGL_RENDER_MODE\r\nparams returns one value, a symbolic constant indicating whether the GL is in render, select, or feedback mode. The initial value is GL_RENDER. See glRenderMode.\r\n\r\nGL_RESCALE_NORMAL\r\nparams returns single boolean value indicating whether normal rescaling is enabled. See glEnable.\r\n\r\nGL_RGBA_MODE\r\nparams returns a single boolean value indicating whether the GL is in RGBA mode (true) or color index mode (false). See glColor.\r\n\r\nGL_SAMPLE_BUFFERS\r\nparams returns a single integer value indicating the number of sample buffers associated with the framebuffer. See glSampleCoverage.\r\n\r\nGL_SAMPLE_COVERAGE_VALUE\r\nparams returns a single positive floating-point value indicating the current sample coverage value. See glSampleCoverage.\r\n\r\nGL_SAMPLE_COVERAGE_INVERT\r\nparams returns a single boolean value indicating if the temporary coverage value should be inverted. See glSampleCoverage.\r\n\r\nGL_SAMPLES\r\nparams returns a single integer value indicating the coverage mask size. See glSampleCoverage.\r\n\r\nGL_SCISSOR_BOX\r\nparams returns four values: the x and y window coordinates of the scissor box, followed by its width and height. Initially the x and y window coordinates are both 0 and the width and height are set to the size of the window. See glScissor.\r\n\r\nGL_SCISSOR_TEST\r\nparams returns a single boolean value indicating whether scissoring is enabled. The initial value is GL_FALSE. See glScissor.\r\n\r\nGL_SECONDARY_COLOR_ARRAY\r\nparams returns a single boolean value indicating whether the secondary color array is enabled. The initial value is GL_FALSE. See glSecondaryColorPointer.\r\n\r\nGL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING\r\nparams returns a single value, the name of the buffer object associated with the secondary color array. This buffer object would have been bound to the target GL_ARRAY_BUFFER at the time of the most recent call to glSecondaryColorPointer. If no buffer object was bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\n\r\nGL_SECONDARY_COLOR_ARRAY_SIZE\r\nparams returns one value, the number of components per color in the secondary color array. The initial value is 3. See glSecondaryColorPointer.\r\n\r\nGL_SECONDARY_COLOR_ARRAY_STRIDE\r\nparams returns one value, the byte offset between consecutive colors in the secondary color array. The initial value is 0. See glSecondaryColorPointer.\r\n\r\nGL_SECONDARY_COLOR_ARRAY_TYPE\r\nparams returns one value, the data type of each component in the secondary color array. The initial value is GL_FLOAT. See glSecondaryColorPointer.\r\n\r\nGL_SELECTION_BUFFER_SIZE\r\nparams return one value, the size of the selection buffer. See glSelectBuffer.\r\n\r\nGL_SEPARABLE_2D\r\nparams returns a single boolean value indicating whether 2D separable convolution is enabled. The initial value is GL_FALSE. See glSeparableFilter2D.\r\n\r\nGL_SHADE_MODEL\r\nparams returns one value, a symbolic constant indicating whether the shading mode is flat or smooth. The initial value is GL_SMOOTH. See glShadeModel.\r\n\r\nGL_SMOOTH_LINE_WIDTH_RANGE\r\nparams returns two values, the smallest and largest supported widths for antialiased lines. See glLineWidth.\r\n\r\nGL_SMOOTH_LINE_WIDTH_GRANULARITY\r\nparams returns one value, the granularity of widths for antialiased lines. See glLineWidth.\r\n\r\nGL_SMOOTH_POINT_SIZE_RANGE\r\nparams returns two values, the smallest and largest supported widths for antialiased points. See glPointSize.\r\n\r\nGL_SMOOTH_POINT_SIZE_GRANULARITY\r\nparams returns one value, the granularity of sizes for antialiased points. See glPointSize.\r\n\r\nGL_STENCIL_BACK_FAIL\r\nparams returns one value, a symbolic constant indicating what action is taken for back-facing polygons when the stencil test fails. The initial value is GL_KEEP. See glStencilOpSeparate.\r\n\r\nGL_STENCIL_BACK_FUNC\r\nparams returns one value, a symbolic constant indicating what function is used for back-facing polygons to compare the stencil reference value with the stencil buffer value. The initial value is GL_ALWAYS. See glStencilFuncSeparate.\r\n\r\nGL_STENCIL_BACK_PASS_DEPTH_FAIL\r\nparams returns one value, a symbolic constant indicating what action is taken for back-facing polygons when the stencil test passes, but the depth test fails. The initial value is GL_KEEP. See glStencilOpSeparate.\r\n\r\nGL_STENCIL_BACK_PASS_DEPTH_PASS\r\nparams returns one value, a symbolic constant indicating what action is taken for back-facing polygons when the stencil test passes and the depth test passes. The initial value is GL_KEEP. See glStencilOpSeparate.\r\n\r\nGL_STENCIL_BACK_REF\r\nparams returns one value, the reference value that is compared with the contents of the stencil buffer for back-facing polygons. The initial value is 0. See glStencilFuncSeparate.\r\n\r\nGL_STENCIL_BACK_VALUE_MASK\r\nparams returns one value, the mask that is used for back-facing polygons to mask both the stencil reference value and the stencil buffer value before they are compared. The initial value is all 1's. See glStencilFuncSeparate.\r\n\r\nGL_STENCIL_BACK_WRITEMASK\r\nparams returns one value, the mask that controls writing of the stencil bitplanes for back-facing polygons. The initial value is all 1's. See glStencilMaskSeparate.\r\n\r\nGL_STENCIL_BITS\r\nparams returns one value, the number of bitplanes in the stencil buffer.\r\n\r\nGL_STENCIL_CLEAR_VALUE\r\nparams returns one value, the index to which the stencil bitplanes are cleared. The initial value is 0. See glClearStencil.\r\n\r\nGL_STENCIL_FAIL\r\nparams returns one value, a symbolic constant indicating what action is taken when the stencil test fails. The initial value is GL_KEEP. See glStencilOp. If the GL version is 2.0 or greater, this stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilOpSeparate.\r\n\r\nGL_STENCIL_FUNC\r\nparams returns one value, a symbolic constant indicating what function is used to compare the stencil reference value with the stencil buffer value. The initial value is GL_ALWAYS. See glStencilFunc. If the GL version is 2.0 or greater, this stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilFuncSeparate.\r\n\r\nGL_STENCIL_PASS_DEPTH_FAIL\r\nparams returns one value, a symbolic constant indicating what action is taken when the stencil test passes, but the depth test fails. The initial value is GL_KEEP. See glStencilOp. If the GL version is 2.0 or greater, this stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilOpSeparate.\r\n\r\nGL_STENCIL_PASS_DEPTH_PASS\r\nparams returns one value, a symbolic constant indicating what action is taken when the stencil test passes and the depth test passes. The initial value is GL_KEEP. See glStencilOp. If the GL version is 2.0 or greater, this stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilOpSeparate.\r\n\r\nGL_STENCIL_REF\r\nparams returns one value, the reference value that is compared with the contents of the stencil buffer. The initial value is 0. See glStencilFunc. If the GL version is 2.0 or greater, this stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilFuncSeparate.\r\n\r\nGL_STENCIL_TEST\r\nparams returns a single boolean value indicating whether stencil testing of fragments is enabled. The initial value is GL_FALSE. See glStencilFunc and glStencilOp.\r\n\r\nGL_STENCIL_VALUE_MASK\r\nparams returns one value, the mask that is used to mask both the stencil reference value and the stencil buffer value before they are compared. The initial value is all 1's. See glStencilFunc. If the GL version is 2.0 or greater, this stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilFuncSeparate.\r\n\r\nGL_STENCIL_WRITEMASK\r\nparams returns one value, the mask that controls writing of the stencil bitplanes. The initial value is all 1's. See glStencilMask. If the GL version is 2.0 or greater, this stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilMaskSeparate.\r\n\r\nGL_STEREO\r\nparams returns a single boolean value indicating whether stereo buffers (left and right) are supported.\r\n\r\nGL_SUBPIXEL_BITS\r\nparams returns one value, an estimate of the number of bits of subpixel resolution that are used to position rasterized geometry in window coordinates. The value must be at least 4.\r\n\r\nGL_TEXTURE_1D\r\nparams returns a single boolean value indicating whether 1D texture mapping is enabled. The initial value is GL_FALSE. See glTexImage1D.\r\n\r\nGL_TEXTURE_BINDING_1D\r\nparams returns a single value, the name of the texture currently bound to the target GL_TEXTURE_1D. The initial value is 0. See glBindTexture.\r\n\r\nGL_TEXTURE_2D\r\nparams returns a single boolean value indicating whether 2D texture mapping is enabled. The initial value is GL_FALSE. See glTexImage2D.\r\n\r\nGL_TEXTURE_BINDING_2D\r\nparams returns a single value, the name of the texture currently bound to the target GL_TEXTURE_2D. The initial value is 0. See glBindTexture.\r\n\r\nGL_TEXTURE_3D\r\nparams returns a single boolean value indicating whether 3D texture mapping is enabled. The initial value is GL_FALSE. See glTexImage3D.\r\n\r\nGL_TEXTURE_BINDING_3D\r\nparams returns a single value, the name of the texture currently bound to the target GL_TEXTURE_3D. The initial value is 0. See glBindTexture.\r\n\r\nGL_TEXTURE_BINDING_CUBE_MAP\r\nparams returns a single value, the name of the texture currently bound to the target GL_TEXTURE_CUBE_MAP. The initial value is 0. See glBindTexture.\r\n\r\nGL_TEXTURE_COMPRESSION_HINT\r\nparams returns a single value indicating the mode of the texture compression hint. The initial value is GL_DONT_CARE.\r\n\r\nGL_TEXTURE_COORD_ARRAY\r\nparams returns a single boolean value indicating whether the texture coordinate array is enabled. The initial value is GL_FALSE. See glTexCoordPointer.\r\n\r\nGL_TEXTURE_COORD_ARRAY_BUFFER_BINDING\r\nparams returns a single value, the name of the buffer object associated with the texture coordinate array. This buffer object would have been bound to the target GL_ARRAY_BUFFER at the time of the most recent call to glTexCoordPointer. If no buffer object was bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\n\r\nGL_TEXTURE_COORD_ARRAY_SIZE\r\nparams returns one value, the number of coordinates per element in the texture coordinate array. The initial value is 4. See glTexCoordPointer.\r\n\r\nGL_TEXTURE_COORD_ARRAY_STRIDE\r\nparams returns one value, the byte offset between consecutive elements in the texture coordinate array. The initial value is 0. See glTexCoordPointer.\r\n\r\nGL_TEXTURE_COORD_ARRAY_TYPE\r\nparams returns one value, the data type of the coordinates in the texture coordinate array. The initial value is GL_FLOAT. See glTexCoordPointer.\r\n\r\nGL_TEXTURE_CUBE_MAP\r\nparams returns a single boolean value indicating whether cube-mapped texture mapping is enabled. The initial value is GL_FALSE. See glTexImage2D.\r\n\r\nGL_TEXTURE_GEN_Q\r\nparams returns a single boolean value indicating whether automatic generation of the q texture coordinate is enabled. The initial value is GL_FALSE. See glTexGen.\r\n\r\nGL_TEXTURE_GEN_R\r\nparams returns a single boolean value indicating whether automatic generation of the r texture coordinate is enabled. The initial value is GL_FALSE. See glTexGen.\r\n\r\nGL_TEXTURE_GEN_S\r\nparams returns a single boolean value indicating whether automatic generation of the S texture coordinate is enabled. The initial value is GL_FALSE. See glTexGen.\r\n\r\nGL_TEXTURE_GEN_T\r\nparams returns a single boolean value indicating whether automatic generation of the T texture coordinate is enabled. The initial value is GL_FALSE. See glTexGen.\r\n\r\nGL_TEXTURE_MATRIX\r\nparams returns sixteen values: the texture matrix on the top of the texture matrix stack. Initially this matrix is the identity matrix. See glPushMatrix.\r\n\r\nGL_TEXTURE_STACK_DEPTH\r\nparams returns one value, the number of matrices on the texture matrix stack. The initial value is 1. See glPushMatrix.\r\n\r\nGL_TRANSPOSE_COLOR_MATRIX\r\nparams returns 16 values, the elements of the color matrix in row-major order. See glLoadTransposeMatrix.\r\n\r\nGL_TRANSPOSE_MODELVIEW_MATRIX\r\nparams returns 16 values, the elements of the modelview matrix in row-major order. See glLoadTransposeMatrix.\r\n\r\nGL_TRANSPOSE_PROJECTION_MATRIX\r\nparams returns 16 values, the elements of the projection matrix in row-major order. See glLoadTransposeMatrix.\r\n\r\nGL_TRANSPOSE_TEXTURE_MATRIX\r\nparams returns 16 values, the elements of the texture matrix in row-major order. See glLoadTransposeMatrix.\r\n\r\nGL_UNPACK_ALIGNMENT\r\nparams returns one value, the byte alignment used for reading pixel data from memory. The initial value is 4. See glPixelStore.\r\n\r\nGL_UNPACK_IMAGE_HEIGHT\r\nparams returns one value, the image height used for reading pixel data from memory. The initial is 0. See glPixelStore.\r\n\r\nGL_UNPACK_LSB_FIRST\r\nparams returns a single boolean value indicating whether single-bit pixels being read from memory are read first from the least significant bit of each unsigned byte. The initial value is GL_FALSE. See glPixelStore.\r\n\r\nGL_UNPACK_ROW_LENGTH\r\nparams returns one value, the row length used for reading pixel data from memory. The initial value is 0. See glPixelStore.\r\n\r\nGL_UNPACK_SKIP_IMAGES\r\nparams returns one value, the number of pixel images skipped before the first pixel is read from memory. The initial value is 0. See glPixelStore.\r\n\r\nGL_UNPACK_SKIP_PIXELS\r\nparams returns one value, the number of pixel locations skipped before the first pixel is read from memory. The initial value is 0. See glPixelStore.\r\n\r\nGL_UNPACK_SKIP_ROWS\r\nparams returns one value, the number of rows of pixel locations skipped before the first pixel is read from memory. The initial value is 0. See glPixelStore.\r\n\r\nGL_UNPACK_SWAP_BYTES\r\nparams returns a single boolean value indicating whether the bytes of two-byte and four-byte pixel indices and components are swapped after being read from memory. The initial value is GL_FALSE. See glPixelStore.\r\n\r\nGL_VERTEX_ARRAY\r\nparams returns a single boolean value indicating whether the vertex array is enabled. The initial value is GL_FALSE. See glVertexPointer.\r\n\r\nGL_VERTEX_ARRAY_BUFFER_BINDING\r\nparams returns a single value, the name of the buffer object associated with the vertex array. This buffer object would have been bound to the target GL_ARRAY_BUFFER at the time of the most recent call to glVertexPointer. If no buffer object was bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\n\r\nGL_VERTEX_ARRAY_SIZE\r\nparams returns one value, the number of coordinates per vertex in the vertex array. The initial value is 4. See glVertexPointer.\r\n\r\nGL_VERTEX_ARRAY_STRIDE\r\nparams returns one value, the byte offset between consecutive vertices in the vertex array. The initial value is 0. See glVertexPointer.\r\n\r\nGL_VERTEX_ARRAY_TYPE\r\nparams returns one value, the data type of each coordinate in the vertex array. The initial value is GL_FLOAT. See glVertexPointer.\r\n\r\nGL_VERTEX_PROGRAM_POINT_SIZE\r\nparams returns a single boolean value indicating whether vertex program point size mode is enabled. If enabled, and a vertex shader is active, then the point size is taken from the shader built-in gl_PointSize. If disabled, and a vertex shader is active, then the point size is taken from the point state as specified by glPointSize. The initial value is GL_FALSE.\r\n\r\nGL_VERTEX_PROGRAM_TWO_SIDE\r\nparams returns a single boolean value indicating whether vertex program two-sided color mode is enabled. If enabled, and a vertex shader is active, then the GL chooses the back color output for back-facing polygons, and the front color output for non-polygons and front-facing polygons. If disabled, and a vertex shader is active, then the front color output is always selected. The initial value is GL_FALSE.\r\n\r\nGL_VIEWPORT\r\nparams returns four values: the x and y window coordinates of the viewport, followed by its width and height. Initially the x and y window coordinates are both set to 0, and the width and height are set to the width and height of the window into which the GL will do its rendering. See glViewport.\r\n\r\nGL_ZOOM_X\r\nparams returns one value, the x pixel zoom factor. The initial value is 1. See glPixelZoom.\r\n\r\nGL_ZOOM_Y\r\nparams returns one value, the y pixel zoom factor. The initial value is 1. See glPixelZoom.\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/graphics/ParamName3.3.inl",
    "content": "// returns a single value indicating the active multitexture unit. The initial value is GL_TEXTURE0. See glActiveTexture.\r\nACTIVE_TEXTURE = GL_ACTIVE_TEXTURE,\r\n// returns a pair of values indicating the range of widths supported for aliased lines. See glLineWidth.\r\nALIASED_LINE_WIDTH_RANGE = GL_ALIASED_LINE_WIDTH_RANGE,\r\n// returns a pair of values indicating the range of widths supported for smooth (antialiased) lines. See glLineWidth.\r\nSMOOTH_LINE_WIDTH_RANGE = GL_SMOOTH_LINE_WIDTH_RANGE,\r\n// returns a single value indicating the level of quantization applied to smooth line width parameters.\r\nSMOOTH_LINE_WIDTH_GRANULARITY = GL_SMOOTH_LINE_WIDTH_GRANULARITY,\r\n// returns a single value, the name of the buffer object currently bound to the target GL_ARRAY_BUFFER. If no buffer object is bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\nARRAY_BUFFER_BINDING = GL_ARRAY_BUFFER_BINDING,\r\n// returns a single boolean value indicating whether blending is enabled. The initial value is GL_FALSE. See glBlendFunc.\r\nBLEND = GL_BLEND,\r\n// returns four values, the red, green, blue, and alpha values which are the components of the blend color. See glBlendColor.\r\nBLEND_COLOR = GL_BLEND_COLOR,\r\n// returns one value, the symbolic constant identifying the alpha destination blend function. The initial value is GL_ZERO. See glBlendFunc and glBlendFuncSeparate.\r\nBLEND_DST_ALPHA = GL_BLEND_DST_ALPHA,\r\n// returns one value, the symbolic constant identifying the RGB destination blend function. The initial value is GL_ZERO. See glBlendFunc and glBlendFuncSeparate.\r\nBLEND_DST_RGB = GL_BLEND_DST_RGB,\r\n// returns one value, a symbolic constant indicating whether the RGB blend equation is GL_FUNC_ADD, GL_FUNC_SUBTRACT, GL_FUNC_REVERSE_SUBTRACT, GL_MIN or GL_MAX. See glBlendEquationSeparate.\r\nBLEND_EQUATION_RGB = GL_BLEND_EQUATION_RGB,\r\n// returns one value, a symbolic constant indicating whether the Alpha blend equation is GL_FUNC_ADD, GL_FUNC_SUBTRACT, GL_FUNC_REVERSE_SUBTRACT, GL_MIN or GL_MAX. See glBlendEquationSeparate.\r\nBLEND_EQUATION_ALPHA = GL_BLEND_EQUATION_ALPHA,\r\n// returns one value, the symbolic constant identifying the alpha source blend function. The initial value is GL_ONE. See glBlendFunc and glBlendFuncSeparate.\r\nBLEND_SRC_ALPHA = GL_BLEND_SRC_ALPHA,\r\n// returns one value, the symbolic constant identifying the RGB source blend function. The initial value is GL_ONE. See glBlendFunc and glBlendFuncSeparate.\r\nBLEND_SRC_RGB = GL_BLEND_SRC_RGB,\r\n// returns four values: the red, green, blue, and alpha values used to clear the color buffers. Integer values, if requested, are linearly mapped from the internal floating-point representation such that 1.0 returns the most positive representable integer value, and -1.0 returns the most negative representable integer value. The initial value is (0, 0, 0, 0). See glClearColor.\r\nCOLOR_CLEAR_VALUE = GL_COLOR_CLEAR_VALUE,\r\n// returns a single boolean value indicating whether a fragment's RGBA color values are merged into the framebuffer using a logical operation. The initial value is GL_FALSE. See glLogicOp.\r\nCOLOR_LOGIC_OP = GL_COLOR_LOGIC_OP,\r\n// returns four boolean values: the red, green, blue, and alpha write enables for the color buffers. The initial value is (GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE). See glColorMask.\r\nCOLOR_WRITEMASK = GL_COLOR_WRITEMASK,\r\n// returns a list of symbolic constants of length GL_NUM_COMPRESSED_TEXTURE_FORMATS indicating which compressed texture formats are available. See glCompressedTexImage2D.\r\nCOMPRESSED_TEXTURE_FORMATS = GL_COMPRESSED_TEXTURE_FORMATS,\r\n// returns a single boolean value indicating whether polygon culling is enabled. The initial value is GL_FALSE. See glCullFace.\r\nCULL_FACE = GL_CULL_FACE,\r\n// returns one value, the name of the program object that is currently active, or 0 if no program object is active. See glUseProgram.\r\nCURRENT_PROGRAM = GL_CURRENT_PROGRAM,\r\n// returns one value, the value that is used to clear the depth buffer. Integer values, if requested, are linearly mapped from the internal floating-point representation such that 1.0 returns the most positive representable integer value, and -1.0 returns the most negative representable integer value. The initial value is 1. See glClearDepth.\r\nDEPTH_CLEAR_VALUE = GL_DEPTH_CLEAR_VALUE,\r\n// returns one value, the symbolic constant that indicates the depth comparison function. The initial value is GL_LESS. See glDepthFunc.\r\nDEPTH_FUNC = GL_DEPTH_FUNC,\r\n// returns two values: the near and far mapping limits for the depth buffer. Integer values, if requested, are linearly mapped from the internal floating-point representation such that 1.0 returns the most positive representable integer value, and -1.0 returns the most negative representable integer value. The initial value is (0, 1). See glDepthRange.\r\nDEPTH_RANGE = GL_DEPTH_RANGE,\r\n// returns a single boolean value indicating whether depth testing of fragments is enabled. The initial value is GL_FALSE. See glDepthFunc and glDepthRange.\r\nDEPTH_TEST = GL_DEPTH_TEST,\r\n// returns a single boolean value indicating if the depth buffer is enabled for writing. The initial value is GL_TRUE. See glDepthMask.\r\nDEPTH_WRITEMASK = GL_DEPTH_WRITEMASK,\r\n// returns a single boolean value indicating whether dithering of fragment colors and indices is enabled. The initial value is GL_TRUE.\r\nDITHER = GL_DITHER,\r\n// returns a single boolean value indicating whether double buffering is supported.\r\nDOUBLEBUFFER = GL_DOUBLEBUFFER,\r\n// returns one value, a symbolic constant indicating which buffers are being drawn to. See glDrawBuffer. The initial value is GL_BACK if there are back buffers, otherwise it is GL_FRONT.\r\nDRAW_BUFFER = GL_DRAW_BUFFER,\r\n// returns one value, a symbolic constant indicating which buffers are being drawn to by the corresponding output color. See glDrawBuffers. The initial value of GL_DRAW_BUFFER0 is GL_BACK if there are back buffers, otherwise it is GL_FRONT. The initial values of draw buffers for all other output colors is GL_NONE.\r\nDRAW_BUFFER0  = GL_DRAW_BUFFER0 ,\r\nDRAW_BUFFER1  = GL_DRAW_BUFFER1 ,\r\nDRAW_BUFFER2  = GL_DRAW_BUFFER2 ,\r\nDRAW_BUFFER3  = GL_DRAW_BUFFER3 ,\r\nDRAW_BUFFER4  = GL_DRAW_BUFFER4 ,\r\nDRAW_BUFFER5  = GL_DRAW_BUFFER5 ,\r\nDRAW_BUFFER6  = GL_DRAW_BUFFER6 ,\r\nDRAW_BUFFER7  = GL_DRAW_BUFFER7 ,\r\nDRAW_BUFFER8  = GL_DRAW_BUFFER8 ,\r\nDRAW_BUFFER9  = GL_DRAW_BUFFER9 ,\r\nDRAW_BUFFER10 = GL_DRAW_BUFFER10,\r\nDRAW_BUFFER11 = GL_DRAW_BUFFER11,\r\nDRAW_BUFFER12 = GL_DRAW_BUFFER12,\r\nDRAW_BUFFER13 = GL_DRAW_BUFFER13,\r\nDRAW_BUFFER14 = GL_DRAW_BUFFER14,\r\nDRAW_BUFFER15 = GL_DRAW_BUFFER15,\r\n// returns one value, the name of the framebuffer object currently bound to the GL_DRAW_FRAMEBUFFER target. If the default framebuffer is bound, this value will be zero. The initial value is zero. See glBindFramebuffer.\r\nDRAW_FRAMEBUFFER_BINDING = GL_DRAW_FRAMEBUFFER_BINDING,\r\n// returns one value, the name of the framebuffer object currently bound to the GL_READ_FRAMEBUFFER target. If the default framebuffer is bound, this value will be zero. The initial value is zero. See glBindFramebuffer.\r\nREAD_FRAMEBUFFER_BINDING = GL_READ_FRAMEBUFFER_BINDING,\r\n// returns a single value, the name of the buffer object currently bound to the target GL_ELEMENT_ARRAY_BUFFER. If no buffer object is bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\nELEMENT_ARRAY_BUFFER_BINDING = GL_ELEMENT_ARRAY_BUFFER_BINDING,\r\n// returns a single value, the name of the renderbuffer object currently bound to the target GL_RENDERBUFFER. If no renderbuffer object is bound to this target, 0 is returned. The initial value is 0. See glBindRenderbuffer.\r\nRENDERBUFFER_BINDING = GL_RENDERBUFFER_BINDING,\r\n// returns one value, a symbolic constant indicating the mode of the derivative accuracy hint for fragment shaders. The initial value is GL_DONT_CARE. See glHint.\r\nFRAGMENT_SHADER_DERIVATIVE_HINT = GL_FRAGMENT_SHADER_DERIVATIVE_HINT,\r\n// returns a single boolean value indicating whether antialiasing of lines is enabled. The initial value is GL_FALSE. See glLineWidth.\r\nLINE_SMOOTH = GL_LINE_SMOOTH,\r\n// returns one value, a symbolic constant indicating the mode of the line antialiasing hint. The initial value is GL_DONT_CARE. See glHint.\r\nLINE_SMOOTH_HINT = GL_LINE_SMOOTH_HINT,\r\n// returns one value, the line width as specified with glLineWidth. The initial value is 1.\r\nLINE_WIDTH = GL_LINE_WIDTH,\r\n// returns one value, a symbolic constant indicating the selected logic operation mode. The initial value is GL_COPY. See glLogicOp.\r\nLOGIC_OP_MODE = GL_LOGIC_OP_MODE,\r\n// returns one value, a rough estimate of the largest 3D texture that the GL can handle. The value must be at least 64. Use GL_PROXY_TEXTURE_3D to determine if a texture is too large. See glTexImage3D.\r\nMAX_3D_TEXTURE_SIZE = GL_MAX_3D_TEXTURE_SIZE,\r\n// returns one value, the maximum number of application-defined clipping distances. The value must be at least 8.\r\nMAX_CLIP_DISTANCES = GL_MAX_CLIP_DISTANCES,\r\n// returns one value, the number of words for fragment shader uniform variables in all uniform blocks (including default). The value must be at least 1. See glUniform.\r\nMAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS = GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS,\r\n// returns one value, the maximum supported texture image units that can be used to access texture maps from the vertex shader and the fragment processor combined. If both the vertex shader and the fragment processing stage access the same texture image unit, then that counts as using two texture image units against this limit. The value must be at least 48. See glActiveTexture.\r\nMAX_COMBINED_TEXTURE_IMAGE_UNITS = GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS,\r\n// returns one value, the number of words for vertex shader uniform variables in all uniform blocks (including default). The value must be at least 1. See glUniform.\r\nMAX_COMBINED_VERTEX_UNIFORM_COMPONENTS = GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS,\r\n// returns one value, the number of words for geometry shader uniform variables in all uniform blocks (including default). The value must be at least 1. See glUniform.\r\nMAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS = GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS,\r\n// returns one value, the number components for varying variables, which must be at least 60.\r\nMAX_VARYING_COMPONENTS = GL_MAX_VARYING_COMPONENTS,\r\n// returns one value, the maximum number of uniform blocks per program. The value must be at least 36. See glUniformBlockBinding.\r\nMAX_COMBINED_UNIFORM_BLOCKS = GL_MAX_COMBINED_UNIFORM_BLOCKS,\r\n// returns one value. The value gives a rough estimate of the largest cube-map texture that the GL can handle. The value must be at least 1024. Use GL_PROXY_TEXTURE_CUBE_MAP to determine if a texture is too large. See glTexImage2D.\r\nMAX_CUBE_MAP_TEXTURE_SIZE = GL_MAX_CUBE_MAP_TEXTURE_SIZE,\r\n// returns one value, the maximum number of simultaneous outputs that may be written in a fragment shader. The value must be at least 8. See glDrawBuffers.\r\nMAX_DRAW_BUFFERS = GL_MAX_DRAW_BUFFERS,\r\n// returns one value, the maximum number of active draw buffers when using dual-source blending. The value must be at least 1. See glBlendFunc and glBlendFuncSeparate.\r\nMAX_DUAL_SOURCE_DRAW_BUFFERS = GL_MAX_DUAL_SOURCE_DRAW_BUFFERS,\r\n// returns one value, the recommended maximum number of vertex array indices. See glDrawRangeElements.\r\nMAX_ELEMENTS_INDICES = GL_MAX_ELEMENTS_INDICES,\r\n// returns one value, the recommended maximum number of vertex array vertices. See glDrawRangeElements.\r\nMAX_ELEMENTS_VERTICES = GL_MAX_ELEMENTS_VERTICES,\r\n// returns one value, the maximum number of individual floating-point, integer, or boolean values that can be held in uniform variable storage for a fragment shader. The value must be at least 1024. See glUniform.\r\nMAX_FRAGMENT_UNIFORM_COMPONENTS = GL_MAX_FRAGMENT_UNIFORM_COMPONENTS,\r\n// returns one value, the maximum number of uniform blocks per fragment shader. The value must be at least 12. See glUniformBlockBinding.\r\nMAX_FRAGMENT_UNIFORM_BLOCKS = GL_MAX_FRAGMENT_UNIFORM_BLOCKS,\r\n// returns one value, the maximum number of components of the inputs read by the fragment shader, which must be at least 128.\r\nMAX_FRAGMENT_INPUT_COMPONENTS = GL_MAX_FRAGMENT_INPUT_COMPONENTS,\r\n// returns one value, the minimum texel offset allowed in a texture lookup, which must be at most -8.\r\nMIN_PROGRAM_TEXEL_OFFSET = GL_MIN_PROGRAM_TEXEL_OFFSET,\r\n// returns one value, the maximum texel offset allowed in a texture lookup, which must be at least 7.\r\nMAX_PROGRAM_TEXEL_OFFSET = GL_MAX_PROGRAM_TEXEL_OFFSET,\r\n// returns one value. The value gives a rough estimate of the largest rectangular texture that the GL can handle. The value must be at least 1024. Use GL_PROXY_TEXTURE_RECTANGLE to determine if a texture is too large. See glTexImage2D.\r\nMAX_RECTANGLE_TEXTURE_SIZE = GL_MAX_RECTANGLE_TEXTURE_SIZE,\r\n// returns one value, the maximum supported texture image units that can be used to access texture maps from the fragment shader. The value must be at least 16. See glActiveTexture.\r\nMAX_TEXTURE_IMAGE_UNITS = GL_MAX_TEXTURE_IMAGE_UNITS,\r\n// returns one value, the maximum, absolute value of the texture level-of-detail bias. The value must be at least 2.0.\r\nMAX_TEXTURE_LOD_BIAS = GL_MAX_TEXTURE_LOD_BIAS,\r\n// returns one value. The value gives a rough estimate of the largest texture that the GL can handle. The value must be at least 1024. Use a proxy texture target such as GL_PROXY_TEXTURE_1D or GL_PROXY_TEXTURE_2D to determine if a texture is too large. See glTexImage1D and glTexImage2D.\r\nMAX_TEXTURE_SIZE = GL_MAX_TEXTURE_SIZE,\r\n// returns one value. The value indicates the maximum supported size for renderbuffers. See glFramebufferRenderbuffer.\r\nMAX_RENDERBUFFER_SIZE = GL_MAX_RENDERBUFFER_SIZE,\r\n// returns one value. The value indicates the maximum number of layers allowed in an array texture, and must be at least 256. See glTexImage2D.\r\nMAX_ARRAY_TEXTURE_LAYERS = GL_MAX_ARRAY_TEXTURE_LAYERS,\r\n// returns one value. The value gives the maximum number of texels allowed in the texel array of a texture buffer object. Value must be at least 65536.\r\nMAX_TEXTURE_BUFFER_SIZE = GL_MAX_TEXTURE_BUFFER_SIZE,\r\n// returns one value, the maximum size in basic machine units of a uniform block. The value must be at least 16384. See glUniformBlockBinding.\r\nMAX_UNIFORM_BLOCK_SIZE = GL_MAX_UNIFORM_BLOCK_SIZE,\r\n// returns one value, the maximum number of interpolators available for processing varying variables used by vertex and fragment shaders. This value represents the number of individual floating-point values that can be interpolated; varying variables declared as vectors, matrices, and arrays will all consume multiple interpolators. The value must be at least 32.\r\nMAX_VARYING_FLOATS = GL_MAX_VARYING_FLOATS,\r\n// returns one value, the maximum number of 4-component generic vertex attributes accessible to a vertex shader. The value must be at least 16. See glVertexAttrib.\r\nMAX_VERTEX_ATTRIBS = GL_MAX_VERTEX_ATTRIBS,\r\n// returns one value, the maximum supported texture image units that can be used to access texture maps from the vertex shader. The value may be at least 16. See glActiveTexture.\r\nMAX_VERTEX_TEXTURE_IMAGE_UNITS = GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS,\r\n// returns one value, the maximum supported texture image units that can be used to access texture maps from the geometry shader. The value must be at least 16. See glActiveTexture.\r\nMAX_GEOMETRY_TEXTURE_IMAGE_UNITS = GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS,\r\n// returns one value, the maximum number of individual floating-point, integer, or boolean values that can be held in uniform variable storage for a vertex shader. The value must be at least 1024. See glUniform.\r\nMAX_VERTEX_UNIFORM_COMPONENTS = GL_MAX_VERTEX_UNIFORM_COMPONENTS,\r\n// returns one value, the maximum number of components of output written by a vertex shader, which must be at least 64.\r\nMAX_VERTEX_OUTPUT_COMPONENTS = GL_MAX_VERTEX_OUTPUT_COMPONENTS,\r\n// returns one value, the maximum number of individual floating-point, integer, or boolean values that can be held in uniform variable storage for a geometry shader. The value must be at least 1024. See glUniform.\r\nMAX_GEOMETRY_UNIFORM_COMPONENTS = GL_MAX_GEOMETRY_UNIFORM_COMPONENTS,\r\n// returns one value, the maximum number of sample mask words.\r\nMAX_SAMPLE_MASK_WORDS = GL_MAX_SAMPLE_MASK_WORDS,\r\n// returns one value, the maximum number of samples in a color multisample texture.\r\nMAX_COLOR_TEXTURE_SAMPLES = GL_MAX_COLOR_TEXTURE_SAMPLES,\r\n// returns one value, the maximum number of samples in a multisample depth or depth-stencil texture.\r\nMAX_DEPTH_TEXTURE_SAMPLES = GL_MAX_DEPTH_TEXTURE_SAMPLES,\r\n// returns one value, the maximum number of samples in a multisample depth or depth-stencil texture.\r\nMAX_DEPTH_TEXTURE_SAMPLES = GL_MAX_DEPTH_TEXTURE_SAMPLES,\r\n// returns one value, the maximum number of samples supported in integer format multisample buffers.\r\nMAX_INTEGER_SAMPLES = GL_MAX_INTEGER_SAMPLES,\r\n// returns one value, the maximum glWaitSync timeout interval.\r\nMAX_SERVER_WAIT_TIMEOUT = GL_MAX_SERVER_WAIT_TIMEOUT,\r\n// returns one value, the maximum number of uniform buffer binding points on the context, which must be at least 36.\r\nMAX_UNIFORM_BUFFER_BINDINGS = GL_MAX_UNIFORM_BUFFER_BINDINGS,\r\n// returns one value, the maximum size in basic machine units of a uniform block, which must be at least 16384.\r\nMAX_UNIFORM_BLOCK_SIZE = GL_MAX_UNIFORM_BLOCK_SIZE,\r\n// returns one value, the minimum required alignment for uniform buffer sizes and offsets.\r\nUNIFORM_BUFFER_OFFSET_ALIGNMENT = GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT,\r\n// returns one value, the maximum number of uniform blocks per vertex shader. The value must be at least 12. See glUniformBlockBinding.\r\nMAX_VERTEX_UNIFORM_BLOCKS = GL_MAX_VERTEX_UNIFORM_BLOCKS,\r\n// returns one value, the maximum number of uniform blocks per geometry shader. The value must be at least 12. See glUniformBlockBinding.\r\nMAX_GEOMETRY_UNIFORM_BLOCKS = GL_MAX_GEOMETRY_UNIFORM_BLOCKS,\r\n// returns one value, the maximum number of components of inputs read by a geometry shader, which must be at least 64.\r\nMAX_GEOMETRY_INPUT_COMPONENTS = GL_MAX_GEOMETRY_INPUT_COMPONENTS,\r\n// returns one value, the maximum number of components of outputs written by a geometry shader, which must be at least 128.\r\nMAX_GEOMETRY_OUTPUT_COMPONENTS = GL_MAX_GEOMETRY_OUTPUT_COMPONENTS,\r\n// returns two values: the maximum supported width and height of the viewport. These must be at least as large as the visible dimensions of the display being rendered to. See glViewport.\r\nMAX_VIEWPORT_DIMS = GL_MAX_VIEWPORT_DIMS,\r\n// returns a single integer value indicating the number of available compressed texture formats. The minimum value is 4. See glCompressedTexImage2D.\r\nNUM_COMPRESSED_TEXTURE_FORMATS = GL_NUM_COMPRESSED_TEXTURE_FORMATS,\r\n// returns one value, the byte alignment used for writing pixel data to memory. The initial value is 4. See glPixelStore.\r\nPACK_ALIGNMENT = GL_PACK_ALIGNMENT,\r\n// returns one value, the image height used for writing pixel data to memory. The initial value is 0. See glPixelStore.\r\nPACK_IMAGE_HEIGHT = GL_PACK_IMAGE_HEIGHT,\r\n// returns a single boolean value indicating whether single-bit pixels being written to memory are written first to the least significant bit of each unsigned byte. The initial value is GL_FALSE. See glPixelStore.\r\nPACK_LSB_FIRST = GL_PACK_LSB_FIRST,\r\n// returns one value, the row length used for writing pixel data to memory. The initial value is 0. See glPixelStore.\r\nPACK_ROW_LENGTH = GL_PACK_ROW_LENGTH,\r\n// returns one value, the number of pixel images skipped before the first pixel is written into memory. The initial value is 0. See glPixelStore.\r\nPACK_SKIP_IMAGES = GL_PACK_SKIP_IMAGES,\r\n// returns one value, the number of pixel locations skipped before the first pixel is written into memory. The initial value is 0. See glPixelStore.\r\nPACK_SKIP_PIXELS = GL_PACK_SKIP_PIXELS,\r\n// returns one value, the number of rows of pixel locations skipped before the first pixel is written into memory. The initial value is 0. See glPixelStore.\r\nPACK_SKIP_ROWS = GL_PACK_SKIP_ROWS,\r\n// returns a single boolean value indicating whether the bytes of two-byte and four-byte pixel indices and components are swapped before being written to memory. The initial value is GL_FALSE. See glPixelStore.\r\nPACK_SWAP_BYTES = GL_PACK_SWAP_BYTES,\r\n// returns a single value, the name of the buffer object currently bound to the target GL_PIXEL_PACK_BUFFER. If no buffer object is bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\nPIXEL_PACK_BUFFER_BINDING = GL_PIXEL_PACK_BUFFER_BINDING,\r\n// returns a single value, the name of the buffer object currently bound to the target GL_PIXEL_UNPACK_BUFFER. If no buffer object is bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\nPIXEL_UNPACK_BUFFER_BINDING = GL_PIXEL_UNPACK_BUFFER_BINDING,\r\n// returns one value, the point size threshold for determining the point size. See glPointParameter.\r\nPOINT_FADE_THRESHOLD_SIZE = GL_POINT_FADE_THRESHOLD_SIZE,\r\n// returns one value, the current primitive restart index. The initial value is 0. See glPrimitiveRestartIndex.\r\nPRIMITIVE_RESTART_INDEX = GL_PRIMITIVE_RESTART_INDEX,\r\n// returns a single boolean value indicating whether vertex program point size mode is enabled. If enabled, then the point size is taken from the shader built-in gl_PointSize. If disabled, then the point size is taken from the point state as specified by glPointSize. The initial value is GL_FALSE.\r\nPROGRAM_POINT_SIZE = GL_PROGRAM_POINT_SIZE,\r\n// returns one value, the currently selected provoking vertex convention. The initial value is GL_LAST_VERTEX_CONVENTION. See glProvokingVertex.\r\nPROVOKING_VERTEX = GL_PROVOKING_VERTEX,\r\n// returns one value, the point size as specified by glPointSize. The initial value is 1.\r\nPOINT_SIZE = GL_POINT_SIZE,\r\n// returns one value, the size difference between adjacent supported sizes for antialiased points. See glPointSize.\r\nPOINT_SIZE_GRANULARITY = GL_POINT_SIZE_GRANULARITY,\r\n// returns two values: the smallest and largest supported sizes for antialiased points. The smallest size must be at most 1, and the largest size must be at least 1. See glPointSize.\r\nPOINT_SIZE_RANGE = GL_POINT_SIZE_RANGE,\r\n// returns one value, the scaling factor used to determine the variable offset that is added to the depth value of each fragment generated when a polygon is rasterized. The initial value is 0. See glPolygonOffset.\r\nPOLYGON_OFFSET_FACTOR = GL_POLYGON_OFFSET_FACTOR,\r\n// returns one value. This value is multiplied by an implementation-specific value and then added to the depth value of each fragment generated when a polygon is rasterized. The initial value is 0. See glPolygonOffset.\r\nPOLYGON_OFFSET_UNITS = GL_POLYGON_OFFSET_UNITS,\r\n// returns a single boolean value indicating whether polygon offset is enabled for polygons in fill mode. The initial value is GL_FALSE. See glPolygonOffset.\r\nPOLYGON_OFFSET_FILL = GL_POLYGON_OFFSET_FILL,\r\n// returns a single boolean value indicating whether polygon offset is enabled for polygons in line mode. The initial value is GL_FALSE. See glPolygonOffset.\r\nPOLYGON_OFFSET_LINE = GL_POLYGON_OFFSET_LINE,\r\n// returns a single boolean value indicating whether polygon offset is enabled for polygons in point mode. The initial value is GL_FALSE. See glPolygonOffset.\r\nPOLYGON_OFFSET_POINT = GL_POLYGON_OFFSET_POINT,\r\n// returns a single boolean value indicating whether antialiasing of polygons is enabled. The initial value is GL_FALSE. See glPolygonMode.\r\nPOLYGON_SMOOTH = GL_POLYGON_SMOOTH,\r\n// returns one value, a symbolic constant indicating the mode of the polygon antialiasing hint. The initial value is GL_DONT_CARE. See glHint.\r\nPOLYGON_SMOOTH_HINT = GL_POLYGON_SMOOTH_HINT,\r\n// returns one value, a symbolic constant indicating which color buffer is selected for reading. The initial value is GL_BACK if there is a back buffer, otherwise it is GL_FRONT. See glReadPixels.\r\nREAD_BUFFER = GL_READ_BUFFER,\r\n// returns a single integer value indicating the number of sample buffers associated with the framebuffer. See glSampleCoverage.\r\nSAMPLE_BUFFERS = GL_SAMPLE_BUFFERS,\r\n// returns a single positive floating-point value indicating the current sample coverage value. See glSampleCoverage.\r\nSAMPLE_COVERAGE_VALUE = GL_SAMPLE_COVERAGE_VALUE,\r\n// returns a single boolean value indicating if the temporary coverage value should be inverted. See glSampleCoverage.\r\nSAMPLE_COVERAGE_INVERT = GL_SAMPLE_COVERAGE_INVERT,\r\n// returns a single value, the name of the sampler object currently bound to the active texture unit. The initial value is 0. See glBindSampler.\r\nSAMPLER_BINDING = GL_SAMPLER_BINDING,\r\n// returns a single integer value indicating the coverage mask size. See glSampleCoverage.\r\nSAMPLES = GL_SAMPLES,\r\n// returns four values: the x and y window coordinates of the scissor box, followed by its width and height. Initially the x and y window coordinates are both 0 and the width and height are set to the size of the window. See glScissor.\r\nSCISSOR_BOX = GL_SCISSOR_BOX,\r\n// returns a single boolean value indicating whether scissoring is enabled. The initial value is GL_FALSE. See glScissor.\r\nSCISSOR_TEST = GL_SCISSOR_TEST,\r\n// returns one value, a symbolic constant indicating what action is taken for back-facing polygons when the stencil test fails. The initial value is GL_KEEP. See glStencilOpSeparate.\r\nSTENCIL_BACK_FAIL = GL_STENCIL_BACK_FAIL,\r\n// returns one value, a symbolic constant indicating what function is used for back-facing polygons to compare the stencil reference value with the stencil buffer value. The initial value is GL_ALWAYS. See glStencilFuncSeparate.\r\nSTENCIL_BACK_FUNC = GL_STENCIL_BACK_FUNC,\r\n// returns one value, a symbolic constant indicating what action is taken for back-facing polygons when the stencil test passes, but the depth test fails. The initial value is GL_KEEP. See glStencilOpSeparate.\r\nSTENCIL_BACK_PASS_DEPTH_FAIL = GL_STENCIL_BACK_PASS_DEPTH_FAIL,\r\n// returns one value, a symbolic constant indicating what action is taken for back-facing polygons when the stencil test passes and the depth test passes. The initial value is GL_KEEP. See glStencilOpSeparate.\r\nSTENCIL_BACK_PASS_DEPTH_PASS = GL_STENCIL_BACK_PASS_DEPTH_PASS,\r\n// returns one value, the reference value that is compared with the contents of the stencil buffer for back-facing polygons. The initial value is 0. See glStencilFuncSeparate.\r\nSTENCIL_BACK_REF = GL_STENCIL_BACK_REF,\r\n// returns one value, the mask that is used for back-facing polygons to mask both the stencil reference value and the stencil buffer value before they are compared. The initial value is all 1's. See glStencilFuncSeparate.\r\nSTENCIL_BACK_VALUE_MASK = GL_STENCIL_BACK_VALUE_MASK,\r\n// returns one value, the mask that controls writing of the stencil bitplanes for back-facing polygons. The initial value is all 1's. See glStencilMaskSeparate.\r\nSTENCIL_BACK_WRITEMASK = GL_STENCIL_BACK_WRITEMASK,\r\n// returns one value, the index to which the stencil bitplanes are cleared. The initial value is 0. See glClearStencil.\r\nSTENCIL_CLEAR_VALUE = GL_STENCIL_CLEAR_VALUE,\r\n// returns one value, a symbolic constant indicating what action is taken when the stencil test fails. The initial value is GL_KEEP. See glStencilOp. This stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilOpSeparate.\r\nSTENCIL_FAIL = GL_STENCIL_FAIL,\r\n// returns one value, a symbolic constant indicating what function is used to compare the stencil reference value with the stencil buffer value. The initial value is GL_ALWAYS. See glStencilFunc. This stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilFuncSeparate.\r\nSTENCIL_FUNC = GL_STENCIL_FUNC,\r\n// returns one value, a symbolic constant indicating what action is taken when the stencil test passes, but the depth test fails. The initial value is GL_KEEP. See glStencilOp. This stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilOpSeparate.\r\nSTENCIL_PASS_DEPTH_FAIL = GL_STENCIL_PASS_DEPTH_FAIL,\r\n// returns one value, a symbolic constant indicating what action is taken when the stencil test passes and the depth test passes. The initial value is GL_KEEP. See glStencilOp. This stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilOpSeparate.\r\nSTENCIL_PASS_DEPTH_PASS = GL_STENCIL_PASS_DEPTH_PASS,\r\n// returns one value, the reference value that is compared with the contents of the stencil buffer. The initial value is 0. See glStencilFunc. This stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilFuncSeparate.\r\nSTENCIL_REF = GL_STENCIL_REF,\r\n// returns a single boolean value indicating whether stencil testing of fragments is enabled. The initial value is GL_FALSE. See glStencilFunc and glStencilOp.\r\nSTENCIL_TEST = GL_STENCIL_TEST,\r\n// returns one value, the mask that is used to mask both the stencil reference value and the stencil buffer value before they are compared. The initial value is all 1's. See glStencilFunc. This stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilFuncSeparate.\r\nSTENCIL_VALUE_MASK = GL_STENCIL_VALUE_MASK,\r\n// returns one value, the mask that controls writing of the stencil bitplanes. The initial value is all 1's. See glStencilMask. This stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilMaskSeparate.\r\nSTENCIL_WRITEMASK = GL_STENCIL_WRITEMASK,\r\n// returns a single boolean value indicating whether stereo buffers (left and right) are supported.\r\nSTEREO = GL_STEREO,\r\n// returns one value, an estimate of the number of bits of subpixel resolution that are used to position rasterized geometry in window coordinates. The value must be at least 4.\r\nSUBPIXEL_BITS = GL_SUBPIXEL_BITS,\r\n// returns a single value, the name of the texture currently bound to the target GL_TEXTURE_1D. The initial value is 0. See glBindTexture.\r\nTEXTURE_BINDING_1D = GL_TEXTURE_BINDING_1D,\r\n// returns a single value, the name of the texture currently bound to the target GL_TEXTURE_1D_ARRAY. The initial value is 0. See glBindTexture.\r\nTEXTURE_BINDING_1D_ARRAY = GL_TEXTURE_BINDING_1D_ARRAY,\r\n// returns a single value, the name of the texture currently bound to the target GL_TEXTURE_2D. The initial value is 0. See glBindTexture.\r\nTEXTURE_BINDING_2D = GL_TEXTURE_BINDING_2D,\r\n// returns a single value, the name of the texture currently bound to the target GL_TEXTURE_2D_ARRAY. The initial value is 0. See glBindTexture.\r\nTEXTURE_BINDING_2D_ARRAY = GL_TEXTURE_BINDING_2D_ARRAY,\r\n// returns a single value, the name of the texture currently bound to the target GL_TEXTURE_2D_MULTISAMPLE. The initial value is 0. See glBindTexture.\r\nTEXTURE_BINDING_2D_MULTISAMPLE = GL_TEXTURE_BINDING_2D_MULTISAMPLE,\r\n// returns a single value, the name of the texture currently bound to the target GL_TEXTURE_2D_MULTISAMPLE_ARRAY. The initial value is 0. See glBindTexture.\r\nTEXTURE_BINDING_2D_MULTISAMPLE_ARRAY = GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY,\r\n// returns a single value, the name of the texture currently bound to the target GL_TEXTURE_3D. The initial value is 0. See glBindTexture.\r\nTEXTURE_BINDING_3D = GL_TEXTURE_BINDING_3D,\r\n// returns a single value, the name of the texture currently bound to the target GL_TEXTURE_BUFFER. The initial value is 0. See glBindTexture.\r\nTEXTURE_BINDING_BUFFER = GL_TEXTURE_BINDING_BUFFER,\r\n// returns a single value, the name of the texture currently bound to the target GL_TEXTURE_CUBE_MAP. The initial value is 0. See glBindTexture.\r\nTEXTURE_BINDING_CUBE_MAP = GL_TEXTURE_BINDING_CUBE_MAP,\r\n// returns a single value, the name of the texture currently bound to the target GL_TEXTURE_RECTANGLE. The initial value is 0. See glBindTexture.\r\nTEXTURE_BINDING_RECTANGLE = GL_TEXTURE_BINDING_RECTANGLE,\r\n// returns a single value indicating the mode of the texture compression hint. The initial value is GL_DONT_CARE.\r\nTEXTURE_COMPRESSION_HINT = GL_TEXTURE_COMPRESSION_HINT,\r\n// returns a single value, the name of the texture buffer object currently bound. The initial value is 0. See glBindBuffer.\r\nTEXTURE_BINDING_BUFFER = GL_TEXTURE_BINDING_BUFFER,\r\n// returns a single value, the 64-bit value of the current GL time. See glQueryCounter.\r\nTIMESTAMP = GL_TIMESTAMP,\r\n// When used with non-indexed variants of glGet (such as glGetIntegerv), returns a single value, the name of the buffer object currently bound to the target GL_TRANSFORM_FEEDBACK_BUFFER. If no buffer object is bound to this target, 0 is returned. When used with indexed variants of glGet (such as glGetIntegeri_v), returns a single value, the name of the buffer object bound to the indexed transform feedback attribute stream. The initial value is 0 for all targets. See glBindBuffer, glBindBufferBase, and glBindBufferRange.\r\nTRANSFORM_FEEDBACK_BUFFER_BINDING = GL_TRANSFORM_FEEDBACK_BUFFER_BINDING,\r\n// When used with indexed variants of glGet (such as glGetInteger64i_v), returns a single value, the start offset of the binding range for each transform feedback attribute stream. The initial value is 0 for all streams. See glBindBufferRange.\r\nTRANSFORM_FEEDBACK_BUFFER_START = GL_TRANSFORM_FEEDBACK_BUFFER_START,\r\n// When used with indexed variants of glGet (such as glGetInteger64i_v), returns a single value, the size of the binding range for each transform feedback attribute stream. The initial value is 0 for all streams. See glBindBufferRange.\r\nTRANSFORM_FEEDBACK_BUFFER_SIZE = GL_TRANSFORM_FEEDBACK_BUFFER_SIZE,\r\n// When used with non-indexed variants of glGet (such as glGetIntegerv), returns a single value, the name of the buffer object currently bound to the target GL_UNIFORM_BUFFER. If no buffer object is bound to this target, 0 is returned. When used with indexed variants of glGet (such as glGetIntegeri_v), returns a single value, the name of the buffer object bound to the indexed uniform buffer binding point. The initial value is 0 for all targets. See glBindBuffer, glBindBufferBase, and glBindBufferRange.\r\nUNIFORM_BUFFER_BINDING = GL_UNIFORM_BUFFER_BINDING,\r\n// When used with indexed variants of glGet (such as glGetInteger64i_v), returns a single value, the start offset of the binding range for each indexed uniform buffer binding. The initial value is 0 for all bindings. See glBindBufferRange.\r\nUNIFORM_BUFFER_START = GL_UNIFORM_BUFFER_START,\r\n// When used with indexed variants of glGet (such as glGetInteger64i_v), returns a single value, the size of the binding range for each indexed uniform buffer binding. The initial value is 0 for all bindings. See glBindBufferRange.\r\nUNIFORM_BUFFER_SIZE = GL_UNIFORM_BUFFER_SIZE,\r\n// returns a single value, the minimum required alignment for uniform buffer sizes and offset. The initial value is 1. See glUniformBlockBinding.\r\nUNIFORM_BUFFER_OFFSET_ALIGNMENT = GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT,\r\n// returns one value, the byte alignment used for reading pixel data from memory. The initial value is 4. See glPixelStore.\r\nUNPACK_ALIGNMENT = GL_UNPACK_ALIGNMENT,\r\n// returns one value, the image height used for reading pixel data from memory. The initial is 0. See glPixelStore.\r\nUNPACK_IMAGE_HEIGHT = GL_UNPACK_IMAGE_HEIGHT,\r\n// returns a single boolean value indicating whether single-bit pixels being read from memory are read first from the least significant bit of each unsigned byte. The initial value is GL_FALSE. See glPixelStore.\r\nUNPACK_LSB_FIRST = GL_UNPACK_LSB_FIRST,\r\n// returns one value, the row length used for reading pixel data from memory. The initial value is 0. See glPixelStore.\r\nUNPACK_ROW_LENGTH = GL_UNPACK_ROW_LENGTH,\r\n// returns one value, the number of pixel images skipped before the first pixel is read from memory. The initial value is 0. See glPixelStore.\r\nUNPACK_SKIP_IMAGES = GL_UNPACK_SKIP_IMAGES,\r\n// returns one value, the number of pixel locations skipped before the first pixel is read from memory. The initial value is 0. See glPixelStore.\r\nUNPACK_SKIP_PIXELS = GL_UNPACK_SKIP_PIXELS,\r\n// returns one value, the number of rows of pixel locations skipped before the first pixel is read from memory. The initial value is 0. See glPixelStore.\r\nUNPACK_SKIP_ROWS = GL_UNPACK_SKIP_ROWS,\r\n// returns a single boolean value indicating whether the bytes of two-byte and four-byte pixel indices and components are swapped after being read from memory. The initial value is GL_FALSE. See glPixelStore.\r\nUNPACK_SWAP_BYTES = GL_UNPACK_SWAP_BYTES,\r\n// returns one value, the number of extensions supported by the GL implementation for the current context. See glGetString.\r\nNUM_EXTENSIONS = GL_NUM_EXTENSIONS,\r\n// returns one value, the major version number of the OpenGL API supported by the current context.\r\nMAJOR_VERSION = GL_MAJOR_VERSION,\r\n// returns one value, the minor version number of the OpenGL API supported by the current context.\r\nMINOR_VERSION = GL_MINOR_VERSION,\r\n// returns one value, the flags with which the context was created (such as debugging functionality).\r\nCONTEXT_FLAGS = GL_CONTEXT_FLAGS,\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/graphics/ParamName3.3.txt",
    "content": "GL_ACTIVE_TEXTURE\r\nparams returns a single value indicating the active multitexture unit. The initial value is GL_TEXTURE0. See glActiveTexture.\r\n\r\nGL_ALIASED_LINE_WIDTH_RANGE\r\nparams returns a pair of values indicating the range of widths supported for aliased lines. See glLineWidth.\r\n\r\nGL_SMOOTH_LINE_WIDTH_RANGE\r\nparams returns a pair of values indicating the range of widths supported for smooth (antialiased) lines. See glLineWidth.\r\n\r\nGL_SMOOTH_LINE_WIDTH_GRANULARITY\r\nparams returns a single value indicating the level of quantization applied to smooth line width parameters.\r\n\r\nGL_ARRAY_BUFFER_BINDING\r\nparams returns a single value, the name of the buffer object currently bound to the target GL_ARRAY_BUFFER. If no buffer object is bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\n\r\nGL_BLEND\r\nparams returns a single boolean value indicating whether blending is enabled. The initial value is GL_FALSE. See glBlendFunc.\r\n\r\nGL_BLEND_COLOR\r\nparams returns four values, the red, green, blue, and alpha values which are the components of the blend color. See glBlendColor.\r\n\r\nGL_BLEND_DST_ALPHA\r\nparams returns one value, the symbolic constant identifying the alpha destination blend function. The initial value is GL_ZERO. See glBlendFunc and glBlendFuncSeparate.\r\n\r\nGL_BLEND_DST_RGB\r\nparams returns one value, the symbolic constant identifying the RGB destination blend function. The initial value is GL_ZERO. See glBlendFunc and glBlendFuncSeparate.\r\n\r\nGL_BLEND_EQUATION_RGB\r\nparams returns one value, a symbolic constant indicating whether the RGB blend equation is GL_FUNC_ADD, GL_FUNC_SUBTRACT, GL_FUNC_REVERSE_SUBTRACT, GL_MIN or GL_MAX. See glBlendEquationSeparate.\r\n\r\nGL_BLEND_EQUATION_ALPHA\r\nparams returns one value, a symbolic constant indicating whether the Alpha blend equation is GL_FUNC_ADD, GL_FUNC_SUBTRACT, GL_FUNC_REVERSE_SUBTRACT, GL_MIN or GL_MAX. See glBlendEquationSeparate.\r\n\r\nGL_BLEND_SRC_ALPHA\r\nparams returns one value, the symbolic constant identifying the alpha source blend function. The initial value is GL_ONE. See glBlendFunc and glBlendFuncSeparate.\r\n\r\nGL_BLEND_SRC_RGB\r\nparams returns one value, the symbolic constant identifying the RGB source blend function. The initial value is GL_ONE. See glBlendFunc and glBlendFuncSeparate.\r\n\r\nGL_COLOR_CLEAR_VALUE\r\nparams returns four values: the red, green, blue, and alpha values used to clear the color buffers. Integer values, if requested, are linearly mapped from the internal floating-point representation such that 1.0 returns the most positive representable integer value, and -1.0 returns the most negative representable integer value. The initial value is (0, 0, 0, 0). See glClearColor.\r\n\r\nGL_COLOR_LOGIC_OP\r\nparams returns a single boolean value indicating whether a fragment's RGBA color values are merged into the framebuffer using a logical operation. The initial value is GL_FALSE. See glLogicOp.\r\n\r\nGL_COLOR_WRITEMASK\r\nparams returns four boolean values: the red, green, blue, and alpha write enables for the color buffers. The initial value is (GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE). See glColorMask.\r\n\r\nGL_COMPRESSED_TEXTURE_FORMATS\r\nparams returns a list of symbolic constants of length GL_NUM_COMPRESSED_TEXTURE_FORMATS indicating which compressed texture formats are available. See glCompressedTexImage2D.\r\n\r\nGL_CULL_FACE\r\nparams returns a single boolean value indicating whether polygon culling is enabled. The initial value is GL_FALSE. See glCullFace.\r\n\r\nGL_CURRENT_PROGRAM\r\nparams returns one value, the name of the program object that is currently active, or 0 if no program object is active. See glUseProgram.\r\n\r\nGL_DEPTH_CLEAR_VALUE\r\nparams returns one value, the value that is used to clear the depth buffer. Integer values, if requested, are linearly mapped from the internal floating-point representation such that 1.0 returns the most positive representable integer value, and -1.0 returns the most negative representable integer value. The initial value is 1. See glClearDepth.\r\n\r\nGL_DEPTH_FUNC\r\nparams returns one value, the symbolic constant that indicates the depth comparison function. The initial value is GL_LESS. See glDepthFunc.\r\n\r\nGL_DEPTH_RANGE\r\nparams returns two values: the near and far mapping limits for the depth buffer. Integer values, if requested, are linearly mapped from the internal floating-point representation such that 1.0 returns the most positive representable integer value, and -1.0 returns the most negative representable integer value. The initial value is (0, 1). See glDepthRange.\r\n\r\nGL_DEPTH_TEST\r\nparams returns a single boolean value indicating whether depth testing of fragments is enabled. The initial value is GL_FALSE. See glDepthFunc and glDepthRange.\r\n\r\nGL_DEPTH_WRITEMASK\r\nparams returns a single boolean value indicating if the depth buffer is enabled for writing. The initial value is GL_TRUE. See glDepthMask.\r\n\r\nGL_DITHER\r\nparams returns a single boolean value indicating whether dithering of fragment colors and indices is enabled. The initial value is GL_TRUE.\r\n\r\nGL_DOUBLEBUFFER\r\nparams returns a single boolean value indicating whether double buffering is supported.\r\n\r\nGL_DRAW_BUFFER\r\nparams returns one value, a symbolic constant indicating which buffers are being drawn to. See glDrawBuffer. The initial value is GL_BACK if there are back buffers, otherwise it is GL_FRONT.\r\n\r\nGL_DRAW_BUFFERi\r\nparams returns one value, a symbolic constant indicating which buffers are being drawn to by the corresponding output color. See glDrawBuffers. The initial value of GL_DRAW_BUFFER0 is GL_BACK if there are back buffers, otherwise it is GL_FRONT. The initial values of draw buffers for all other output colors is GL_NONE.\r\n\r\nGL_DRAW_FRAMEBUFFER_BINDING\r\nparams returns one value, the name of the framebuffer object currently bound to the GL_DRAW_FRAMEBUFFER target. If the default framebuffer is bound, this value will be zero. The initial value is zero. See glBindFramebuffer.\r\n\r\nGL_READ_FRAMEBUFFER_BINDING\r\nparams returns one value, the name of the framebuffer object currently bound to the GL_READ_FRAMEBUFFER target. If the default framebuffer is bound, this value will be zero. The initial value is zero. See glBindFramebuffer.\r\n\r\nGL_ELEMENT_ARRAY_BUFFER_BINDING\r\nparams returns a single value, the name of the buffer object currently bound to the target GL_ELEMENT_ARRAY_BUFFER. If no buffer object is bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\n\r\nGL_RENDERBUFFER_BINDING\r\nparams returns a single value, the name of the renderbuffer object currently bound to the target GL_RENDERBUFFER. If no renderbuffer object is bound to this target, 0 is returned. The initial value is 0. See glBindRenderbuffer.\r\n\r\nGL_FRAGMENT_SHADER_DERIVATIVE_HINT\r\nparams returns one value, a symbolic constant indicating the mode of the derivative accuracy hint for fragment shaders. The initial value is GL_DONT_CARE. See glHint.\r\n\r\nGL_LINE_SMOOTH\r\nparams returns a single boolean value indicating whether antialiasing of lines is enabled. The initial value is GL_FALSE. See glLineWidth.\r\n\r\nGL_LINE_SMOOTH_HINT\r\nparams returns one value, a symbolic constant indicating the mode of the line antialiasing hint. The initial value is GL_DONT_CARE. See glHint.\r\n\r\nGL_LINE_WIDTH\r\nparams returns one value, the line width as specified with glLineWidth. The initial value is 1.\r\n\r\nGL_LOGIC_OP_MODE\r\nparams returns one value, a symbolic constant indicating the selected logic operation mode. The initial value is GL_COPY. See glLogicOp.\r\n\r\nGL_MAX_3D_TEXTURE_SIZE\r\nparams returns one value, a rough estimate of the largest 3D texture that the GL can handle. The value must be at least 64. Use GL_PROXY_TEXTURE_3D to determine if a texture is too large. See glTexImage3D.\r\n\r\nGL_MAX_CLIP_DISTANCES\r\nparams returns one value, the maximum number of application-defined clipping distances. The value must be at least 8.\r\n\r\nGL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS\r\nparams returns one value, the number of words for fragment shader uniform variables in all uniform blocks (including default). The value must be at least 1. See glUniform.\r\n\r\nGL_MAX_COMBINED_TEXTURE_IMAGE_UNITS\r\nparams returns one value, the maximum supported texture image units that can be used to access texture maps from the vertex shader and the fragment processor combined. If both the vertex shader and the fragment processing stage access the same texture image unit, then that counts as using two texture image units against this limit. The value must be at least 48. See glActiveTexture.\r\n\r\nGL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS\r\nparams returns one value, the number of words for vertex shader uniform variables in all uniform blocks (including default). The value must be at least 1. See glUniform.\r\n\r\nGL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS\r\nparams returns one value, the number of words for geometry shader uniform variables in all uniform blocks (including default). The value must be at least 1. See glUniform.\r\n\r\nGL_MAX_VARYING_COMPONENTS\r\nparams returns one value, the number components for varying variables, which must be at least 60.\r\n\r\nGL_MAX_COMBINED_UNIFORM_BLOCKS\r\nparams returns one value, the maximum number of uniform blocks per program. The value must be at least 36. See glUniformBlockBinding.\r\n\r\nGL_MAX_CUBE_MAP_TEXTURE_SIZE\r\nparams returns one value. The value gives a rough estimate of the largest cube-map texture that the GL can handle. The value must be at least 1024. Use GL_PROXY_TEXTURE_CUBE_MAP to determine if a texture is too large. See glTexImage2D.\r\n\r\nGL_MAX_DRAW_BUFFERS\r\nparams returns one value, the maximum number of simultaneous outputs that may be written in a fragment shader. The value must be at least 8. See glDrawBuffers.\r\n\r\nGL_MAX_DUAL_SOURCE_DRAW_BUFFERS\r\nparams returns one value, the maximum number of active draw buffers when using dual-source blending. The value must be at least 1. See glBlendFunc and glBlendFuncSeparate.\r\n\r\nGL_MAX_ELEMENTS_INDICES\r\nparams returns one value, the recommended maximum number of vertex array indices. See glDrawRangeElements.\r\n\r\nGL_MAX_ELEMENTS_VERTICES\r\nparams returns one value, the recommended maximum number of vertex array vertices. See glDrawRangeElements.\r\n\r\nGL_MAX_FRAGMENT_UNIFORM_COMPONENTS\r\nparams returns one value, the maximum number of individual floating-point, integer, or boolean values that can be held in uniform variable storage for a fragment shader. The value must be at least 1024. See glUniform.\r\n\r\nGL_MAX_FRAGMENT_UNIFORM_BLOCKS\r\nparams returns one value, the maximum number of uniform blocks per fragment shader. The value must be at least 12. See glUniformBlockBinding.\r\n\r\nGL_MAX_FRAGMENT_INPUT_COMPONENTS\r\nparams returns one value, the maximum number of components of the inputs read by the fragment shader, which must be at least 128.\r\n\r\nGL_MIN_PROGRAM_TEXEL_OFFSET\r\nparams returns one value, the minimum texel offset allowed in a texture lookup, which must be at most -8.\r\n\r\nGL_MAX_PROGRAM_TEXEL_OFFSET\r\nparams returns one value, the maximum texel offset allowed in a texture lookup, which must be at least 7.\r\n\r\nGL_MAX_RECTANGLE_TEXTURE_SIZE\r\nparams returns one value. The value gives a rough estimate of the largest rectangular texture that the GL can handle. The value must be at least 1024. Use GL_PROXY_TEXTURE_RECTANGLE to determine if a texture is too large. See glTexImage2D.\r\n\r\nGL_MAX_TEXTURE_IMAGE_UNITS\r\nparams returns one value, the maximum supported texture image units that can be used to access texture maps from the fragment shader. The value must be at least 16. See glActiveTexture.\r\n\r\nGL_MAX_TEXTURE_LOD_BIAS\r\nparams returns one value, the maximum, absolute value of the texture level-of-detail bias. The value must be at least 2.0.\r\n\r\nGL_MAX_TEXTURE_SIZE\r\nparams returns one value. The value gives a rough estimate of the largest texture that the GL can handle. The value must be at least 1024. Use a proxy texture target such as GL_PROXY_TEXTURE_1D or GL_PROXY_TEXTURE_2D to determine if a texture is too large. See glTexImage1D and glTexImage2D.\r\n\r\nGL_MAX_RENDERBUFFER_SIZE\r\nparams returns one value. The value indicates the maximum supported size for renderbuffers. See glFramebufferRenderbuffer.\r\n\r\nGL_MAX_ARRAY_TEXTURE_LAYERS\r\nparams returns one value. The value indicates the maximum number of layers allowed in an array texture, and must be at least 256. See glTexImage2D.\r\n\r\nGL_MAX_TEXTURE_BUFFER_SIZE\r\nparams returns one value. The value gives the maximum number of texels allowed in the texel array of a texture buffer object. Value must be at least 65536.\r\n\r\nGL_MAX_UNIFORM_BLOCK_SIZE\r\nparams returns one value, the maximum size in basic machine units of a uniform block. The value must be at least 16384. See glUniformBlockBinding.\r\n\r\nGL_MAX_VARYING_FLOATS\r\nparams returns one value, the maximum number of interpolators available for processing varying variables used by vertex and fragment shaders. This value represents the number of individual floating-point values that can be interpolated; varying variables declared as vectors, matrices, and arrays will all consume multiple interpolators. The value must be at least 32.\r\n\r\nGL_MAX_VERTEX_ATTRIBS\r\nparams returns one value, the maximum number of 4-component generic vertex attributes accessible to a vertex shader. The value must be at least 16. See glVertexAttrib.\r\n\r\nGL_MAX_VERTEX_TEXTURE_IMAGE_UNITS\r\nparams returns one value, the maximum supported texture image units that can be used to access texture maps from the vertex shader. The value may be at least 16. See glActiveTexture.\r\n\r\nGL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS\r\nparams returns one value, the maximum supported texture image units that can be used to access texture maps from the geometry shader. The value must be at least 16. See glActiveTexture.\r\n\r\nGL_MAX_VERTEX_UNIFORM_COMPONENTS\r\nparams returns one value, the maximum number of individual floating-point, integer, or boolean values that can be held in uniform variable storage for a vertex shader. The value must be at least 1024. See glUniform.\r\n\r\nGL_MAX_VERTEX_OUTPUT_COMPONENTS\r\nparams returns one value, the maximum number of components of output written by a vertex shader, which must be at least 64.\r\n\r\nGL_MAX_GEOMETRY_UNIFORM_COMPONENTS\r\nparams returns one value, the maximum number of individual floating-point, integer, or boolean values that can be held in uniform variable storage for a geometry shader. The value must be at least 1024. See glUniform.\r\n\r\nGL_MAX_SAMPLE_MASK_WORDS\r\nparams returns one value, the maximum number of sample mask words.\r\n\r\nGL_MAX_COLOR_TEXTURE_SAMPLES\r\nparams returns one value, the maximum number of samples in a color multisample texture.\r\n\r\nGL_MAX_DEPTH_TEXTURE_SAMPLES\r\nparams returns one value, the maximum number of samples in a multisample depth or depth-stencil texture.\r\n\r\nGL_MAX_DEPTH_TEXTURE_SAMPLES\r\nparams returns one value, the maximum number of samples in a multisample depth or depth-stencil texture.\r\n\r\nGL_MAX_INTEGER_SAMPLES\r\nparams returns one value, the maximum number of samples supported in integer format multisample buffers.\r\n\r\nGL_MAX_SERVER_WAIT_TIMEOUT\r\nparams returns one value, the maximum glWaitSync timeout interval.\r\n\r\nGL_MAX_UNIFORM_BUFFER_BINDINGS\r\nparams returns one value, the maximum number of uniform buffer binding points on the context, which must be at least 36.\r\n\r\nGL_MAX_UNIFORM_BLOCK_SIZE\r\nparams returns one value, the maximum size in basic machine units of a uniform block, which must be at least 16384.\r\n\r\nGL_UNIFORM_BUFFER_OFFSET_ALIGNMENT\r\nparams returns one value, the minimum required alignment for uniform buffer sizes and offsets.\r\n\r\nGL_MAX_VERTEX_UNIFORM_BLOCKS\r\nparams returns one value, the maximum number of uniform blocks per vertex shader. The value must be at least 12. See glUniformBlockBinding.\r\n\r\nGL_MAX_GEOMETRY_UNIFORM_BLOCKS\r\nparams returns one value, the maximum number of uniform blocks per geometry shader. The value must be at least 12. See glUniformBlockBinding.\r\n\r\nGL_MAX_GEOMETRY_INPUT_COMPONENTS\r\nparams returns one value, the maximum number of components of inputs read by a geometry shader, which must be at least 64.\r\n\r\nGL_MAX_GEOMETRY_OUTPUT_COMPONENTS\r\nparams returns one value, the maximum number of components of outputs written by a geometry shader, which must be at least 128.\r\n\r\nGL_MAX_VIEWPORT_DIMS\r\nparams returns two values: the maximum supported width and height of the viewport. These must be at least as large as the visible dimensions of the display being rendered to. See glViewport.\r\n\r\nGL_NUM_COMPRESSED_TEXTURE_FORMATS\r\nparams returns a single integer value indicating the number of available compressed texture formats. The minimum value is 4. See glCompressedTexImage2D.\r\n\r\nGL_PACK_ALIGNMENT\r\nparams returns one value, the byte alignment used for writing pixel data to memory. The initial value is 4. See glPixelStore.\r\n\r\nGL_PACK_IMAGE_HEIGHT\r\nparams returns one value, the image height used for writing pixel data to memory. The initial value is 0. See glPixelStore.\r\n\r\nGL_PACK_LSB_FIRST\r\nparams returns a single boolean value indicating whether single-bit pixels being written to memory are written first to the least significant bit of each unsigned byte. The initial value is GL_FALSE. See glPixelStore.\r\n\r\nGL_PACK_ROW_LENGTH\r\nparams returns one value, the row length used for writing pixel data to memory. The initial value is 0. See glPixelStore.\r\n\r\nGL_PACK_SKIP_IMAGES\r\nparams returns one value, the number of pixel images skipped before the first pixel is written into memory. The initial value is 0. See glPixelStore.\r\n\r\nGL_PACK_SKIP_PIXELS\r\nparams returns one value, the number of pixel locations skipped before the first pixel is written into memory. The initial value is 0. See glPixelStore.\r\n\r\nGL_PACK_SKIP_ROWS\r\nparams returns one value, the number of rows of pixel locations skipped before the first pixel is written into memory. The initial value is 0. See glPixelStore.\r\n\r\nGL_PACK_SWAP_BYTES\r\nparams returns a single boolean value indicating whether the bytes of two-byte and four-byte pixel indices and components are swapped before being written to memory. The initial value is GL_FALSE. See glPixelStore.\r\n\r\nGL_PIXEL_PACK_BUFFER_BINDING\r\nparams returns a single value, the name of the buffer object currently bound to the target GL_PIXEL_PACK_BUFFER. If no buffer object is bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\n\r\nGL_PIXEL_UNPACK_BUFFER_BINDING\r\nparams returns a single value, the name of the buffer object currently bound to the target GL_PIXEL_UNPACK_BUFFER. If no buffer object is bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\n\r\nGL_POINT_FADE_THRESHOLD_SIZE\r\nparams returns one value, the point size threshold for determining the point size. See glPointParameter.\r\n\r\nGL_PRIMITIVE_RESTART_INDEX\r\nparams returns one value, the current primitive restart index. The initial value is 0. See glPrimitiveRestartIndex.\r\n\r\nGL_PROGRAM_POINT_SIZE\r\nparams returns a single boolean value indicating whether vertex program point size mode is enabled. If enabled, then the point size is taken from the shader built-in gl_PointSize. If disabled, then the point size is taken from the point state as specified by glPointSize. The initial value is GL_FALSE.\r\n\r\nGL_PROVOKING_VERTEX\r\nparams returns one value, the currently selected provoking vertex convention. The initial value is GL_LAST_VERTEX_CONVENTION. See glProvokingVertex.\r\n\r\nGL_POINT_SIZE\r\nparams returns one value, the point size as specified by glPointSize. The initial value is 1.\r\n\r\nGL_POINT_SIZE_GRANULARITY\r\nparams returns one value, the size difference between adjacent supported sizes for antialiased points. See glPointSize.\r\n\r\nGL_POINT_SIZE_RANGE\r\nparams returns two values: the smallest and largest supported sizes for antialiased points. The smallest size must be at most 1, and the largest size must be at least 1. See glPointSize.\r\n\r\nGL_POLYGON_OFFSET_FACTOR\r\nparams returns one value, the scaling factor used to determine the variable offset that is added to the depth value of each fragment generated when a polygon is rasterized. The initial value is 0. See glPolygonOffset.\r\n\r\nGL_POLYGON_OFFSET_UNITS\r\nparams returns one value. This value is multiplied by an implementation-specific value and then added to the depth value of each fragment generated when a polygon is rasterized. The initial value is 0. See glPolygonOffset.\r\n\r\nGL_POLYGON_OFFSET_FILL\r\nparams returns a single boolean value indicating whether polygon offset is enabled for polygons in fill mode. The initial value is GL_FALSE. See glPolygonOffset.\r\n\r\nGL_POLYGON_OFFSET_LINE\r\nparams returns a single boolean value indicating whether polygon offset is enabled for polygons in line mode. The initial value is GL_FALSE. See glPolygonOffset.\r\n\r\nGL_POLYGON_OFFSET_POINT\r\nparams returns a single boolean value indicating whether polygon offset is enabled for polygons in point mode. The initial value is GL_FALSE. See glPolygonOffset.\r\n\r\nGL_POLYGON_SMOOTH\r\nparams returns a single boolean value indicating whether antialiasing of polygons is enabled. The initial value is GL_FALSE. See glPolygonMode.\r\n\r\nGL_POLYGON_SMOOTH_HINT\r\nparams returns one value, a symbolic constant indicating the mode of the polygon antialiasing hint. The initial value is GL_DONT_CARE. See glHint.\r\n\r\nGL_READ_BUFFER\r\nparams returns one value, a symbolic constant indicating which color buffer is selected for reading. The initial value is GL_BACK if there is a back buffer, otherwise it is GL_FRONT. See glReadPixels.\r\n\r\nGL_SAMPLE_BUFFERS\r\nparams returns a single integer value indicating the number of sample buffers associated with the framebuffer. See glSampleCoverage.\r\n\r\nGL_SAMPLE_COVERAGE_VALUE\r\nparams returns a single positive floating-point value indicating the current sample coverage value. See glSampleCoverage.\r\n\r\nGL_SAMPLE_COVERAGE_INVERT\r\nparams returns a single boolean value indicating if the temporary coverage value should be inverted. See glSampleCoverage.\r\n\r\nGL_SAMPLER_BINDING\r\nparams returns a single value, the name of the sampler object currently bound to the active texture unit. The initial value is 0. See glBindSampler.\r\n\r\nGL_SAMPLES\r\nparams returns a single integer value indicating the coverage mask size. See glSampleCoverage.\r\n\r\nGL_SCISSOR_BOX\r\nparams returns four values: the x and y window coordinates of the scissor box, followed by its width and height. Initially the x and y window coordinates are both 0 and the width and height are set to the size of the window. See glScissor.\r\n\r\nGL_SCISSOR_TEST\r\nparams returns a single boolean value indicating whether scissoring is enabled. The initial value is GL_FALSE. See glScissor.\r\n\r\nGL_STENCIL_BACK_FAIL\r\nparams returns one value, a symbolic constant indicating what action is taken for back-facing polygons when the stencil test fails. The initial value is GL_KEEP. See glStencilOpSeparate.\r\n\r\nGL_STENCIL_BACK_FUNC\r\nparams returns one value, a symbolic constant indicating what function is used for back-facing polygons to compare the stencil reference value with the stencil buffer value. The initial value is GL_ALWAYS. See glStencilFuncSeparate.\r\n\r\nGL_STENCIL_BACK_PASS_DEPTH_FAIL\r\nparams returns one value, a symbolic constant indicating what action is taken for back-facing polygons when the stencil test passes, but the depth test fails. The initial value is GL_KEEP. See glStencilOpSeparate.\r\n\r\nGL_STENCIL_BACK_PASS_DEPTH_PASS\r\nparams returns one value, a symbolic constant indicating what action is taken for back-facing polygons when the stencil test passes and the depth test passes. The initial value is GL_KEEP. See glStencilOpSeparate.\r\n\r\nGL_STENCIL_BACK_REF\r\nparams returns one value, the reference value that is compared with the contents of the stencil buffer for back-facing polygons. The initial value is 0. See glStencilFuncSeparate.\r\n\r\nGL_STENCIL_BACK_VALUE_MASK\r\nparams returns one value, the mask that is used for back-facing polygons to mask both the stencil reference value and the stencil buffer value before they are compared. The initial value is all 1's. See glStencilFuncSeparate.\r\n\r\nGL_STENCIL_BACK_WRITEMASK\r\nparams returns one value, the mask that controls writing of the stencil bitplanes for back-facing polygons. The initial value is all 1's. See glStencilMaskSeparate.\r\n\r\nGL_STENCIL_CLEAR_VALUE\r\nparams returns one value, the index to which the stencil bitplanes are cleared. The initial value is 0. See glClearStencil.\r\n\r\nGL_STENCIL_FAIL\r\nparams returns one value, a symbolic constant indicating what action is taken when the stencil test fails. The initial value is GL_KEEP. See glStencilOp. This stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilOpSeparate.\r\n\r\nGL_STENCIL_FUNC\r\nparams returns one value, a symbolic constant indicating what function is used to compare the stencil reference value with the stencil buffer value. The initial value is GL_ALWAYS. See glStencilFunc. This stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilFuncSeparate.\r\n\r\nGL_STENCIL_PASS_DEPTH_FAIL\r\nparams returns one value, a symbolic constant indicating what action is taken when the stencil test passes, but the depth test fails. The initial value is GL_KEEP. See glStencilOp. This stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilOpSeparate.\r\n\r\nGL_STENCIL_PASS_DEPTH_PASS\r\nparams returns one value, a symbolic constant indicating what action is taken when the stencil test passes and the depth test passes. The initial value is GL_KEEP. See glStencilOp. This stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilOpSeparate.\r\n\r\nGL_STENCIL_REF\r\nparams returns one value, the reference value that is compared with the contents of the stencil buffer. The initial value is 0. See glStencilFunc. This stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilFuncSeparate.\r\n\r\nGL_STENCIL_TEST\r\nparams returns a single boolean value indicating whether stencil testing of fragments is enabled. The initial value is GL_FALSE. See glStencilFunc and glStencilOp.\r\n\r\nGL_STENCIL_VALUE_MASK\r\nparams returns one value, the mask that is used to mask both the stencil reference value and the stencil buffer value before they are compared. The initial value is all 1's. See glStencilFunc. This stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilFuncSeparate.\r\n\r\nGL_STENCIL_WRITEMASK\r\nparams returns one value, the mask that controls writing of the stencil bitplanes. The initial value is all 1's. See glStencilMask. This stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilMaskSeparate.\r\n\r\nGL_STEREO\r\nparams returns a single boolean value indicating whether stereo buffers (left and right) are supported.\r\n\r\nGL_SUBPIXEL_BITS\r\nparams returns one value, an estimate of the number of bits of subpixel resolution that are used to position rasterized geometry in window coordinates. The value must be at least 4.\r\n\r\nGL_TEXTURE_BINDING_1D\r\nparams returns a single value, the name of the texture currently bound to the target GL_TEXTURE_1D. The initial value is 0. See glBindTexture.\r\n\r\nGL_TEXTURE_BINDING_1D_ARRAY\r\nparams returns a single value, the name of the texture currently bound to the target GL_TEXTURE_1D_ARRAY. The initial value is 0. See glBindTexture.\r\n\r\nGL_TEXTURE_BINDING_2D\r\nparams returns a single value, the name of the texture currently bound to the target GL_TEXTURE_2D. The initial value is 0. See glBindTexture.\r\n\r\nGL_TEXTURE_BINDING_2D_ARRAY\r\nparams returns a single value, the name of the texture currently bound to the target GL_TEXTURE_2D_ARRAY. The initial value is 0. See glBindTexture.\r\n\r\nGL_TEXTURE_BINDING_2D_MULTISAMPLE\r\nparams returns a single value, the name of the texture currently bound to the target GL_TEXTURE_2D_MULTISAMPLE. The initial value is 0. See glBindTexture.\r\n\r\nGL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY\r\nparams returns a single value, the name of the texture currently bound to the target GL_TEXTURE_2D_MULTISAMPLE_ARRAY. The initial value is 0. See glBindTexture.\r\n\r\nGL_TEXTURE_BINDING_3D\r\nparams returns a single value, the name of the texture currently bound to the target GL_TEXTURE_3D. The initial value is 0. See glBindTexture.\r\n\r\nGL_TEXTURE_BINDING_BUFFER\r\nparams returns a single value, the name of the texture currently bound to the target GL_TEXTURE_BUFFER. The initial value is 0. See glBindTexture.\r\n\r\nGL_TEXTURE_BINDING_CUBE_MAP\r\nparams returns a single value, the name of the texture currently bound to the target GL_TEXTURE_CUBE_MAP. The initial value is 0. See glBindTexture.\r\n\r\nGL_TEXTURE_BINDING_RECTANGLE\r\nparams returns a single value, the name of the texture currently bound to the target GL_TEXTURE_RECTANGLE. The initial value is 0. See glBindTexture.\r\n\r\nGL_TEXTURE_COMPRESSION_HINT\r\nparams returns a single value indicating the mode of the texture compression hint. The initial value is GL_DONT_CARE.\r\n\r\nGL_TEXTURE_BINDING_BUFFER\r\nparams returns a single value, the name of the texture buffer object currently bound. The initial value is 0. See glBindBuffer.\r\n\r\nGL_TIMESTAMP\r\nparams returns a single value, the 64-bit value of the current GL time. See glQueryCounter.\r\n\r\nGL_TRANSFORM_FEEDBACK_BUFFER_BINDING\r\nWhen used with non-indexed variants of glGet (such as glGetIntegerv), params returns a single value, the name of the buffer object currently bound to the target GL_TRANSFORM_FEEDBACK_BUFFER. If no buffer object is bound to this target, 0 is returned. When used with indexed variants of glGet (such as glGetIntegeri_v), params returns a single value, the name of the buffer object bound to the indexed transform feedback attribute stream. The initial value is 0 for all targets. See glBindBuffer, glBindBufferBase, and glBindBufferRange.\r\n\r\nGL_TRANSFORM_FEEDBACK_BUFFER_START\r\nWhen used with indexed variants of glGet (such as glGetInteger64i_v), params returns a single value, the start offset of the binding range for each transform feedback attribute stream. The initial value is 0 for all streams. See glBindBufferRange.\r\n\r\nGL_TRANSFORM_FEEDBACK_BUFFER_SIZE\r\nWhen used with indexed variants of glGet (such as glGetInteger64i_v), params returns a single value, the size of the binding range for each transform feedback attribute stream. The initial value is 0 for all streams. See glBindBufferRange.\r\n\r\nGL_UNIFORM_BUFFER_BINDING\r\nWhen used with non-indexed variants of glGet (such as glGetIntegerv), params returns a single value, the name of the buffer object currently bound to the target GL_UNIFORM_BUFFER. If no buffer object is bound to this target, 0 is returned. When used with indexed variants of glGet (such as glGetIntegeri_v), params returns a single value, the name of the buffer object bound to the indexed uniform buffer binding point. The initial value is 0 for all targets. See glBindBuffer, glBindBufferBase, and glBindBufferRange.\r\n\r\nGL_UNIFORM_BUFFER_START\r\nWhen used with indexed variants of glGet (such as glGetInteger64i_v), params returns a single value, the start offset of the binding range for each indexed uniform buffer binding. The initial value is 0 for all bindings. See glBindBufferRange.\r\n\r\nGL_UNIFORM_BUFFER_SIZE\r\nWhen used with indexed variants of glGet (such as glGetInteger64i_v), params returns a single value, the size of the binding range for each indexed uniform buffer binding. The initial value is 0 for all bindings. See glBindBufferRange.\r\n\r\nGL_UNIFORM_BUFFER_OFFSET_ALIGNMENT\r\nparams returns a single value, the minimum required alignment for uniform buffer sizes and offset. The initial value is 1. See glUniformBlockBinding.\r\n\r\nGL_UNPACK_ALIGNMENT\r\nparams returns one value, the byte alignment used for reading pixel data from memory. The initial value is 4. See glPixelStore.\r\n\r\nGL_UNPACK_IMAGE_HEIGHT\r\nparams returns one value, the image height used for reading pixel data from memory. The initial is 0. See glPixelStore.\r\n\r\nGL_UNPACK_LSB_FIRST\r\nparams returns a single boolean value indicating whether single-bit pixels being read from memory are read first from the least significant bit of each unsigned byte. The initial value is GL_FALSE. See glPixelStore.\r\n\r\nGL_UNPACK_ROW_LENGTH\r\nparams returns one value, the row length used for reading pixel data from memory. The initial value is 0. See glPixelStore.\r\n\r\nGL_UNPACK_SKIP_IMAGES\r\nparams returns one value, the number of pixel images skipped before the first pixel is read from memory. The initial value is 0. See glPixelStore.\r\n\r\nGL_UNPACK_SKIP_PIXELS\r\nparams returns one value, the number of pixel locations skipped before the first pixel is read from memory. The initial value is 0. See glPixelStore.\r\n\r\nGL_UNPACK_SKIP_ROWS\r\nparams returns one value, the number of rows of pixel locations skipped before the first pixel is read from memory. The initial value is 0. See glPixelStore.\r\n\r\nGL_UNPACK_SWAP_BYTES\r\nparams returns a single boolean value indicating whether the bytes of two-byte and four-byte pixel indices and components are swapped after being read from memory. The initial value is GL_FALSE. See glPixelStore.\r\n\r\nGL_NUM_EXTENSIONS\r\nparams returns one value, the number of extensions supported by the GL implementation for the current context. See glGetString.\r\n\r\nGL_MAJOR_VERSION\r\nparams returns one value, the major version number of the OpenGL API supported by the current context.\r\n\r\nGL_MINOR_VERSION\r\nparams returns one value, the minor version number of the OpenGL API supported by the current context.\r\n\r\nGL_CONTEXT_FLAGS\r\nparams returns one value, the flags with which the context was created (such as debugging functionality).\r\n\r\nGL_VIEWPORT\r\nparams returns four values: the x and y window coordinates of the viewport, followed by its width and height. Initially the x and y window coordinates are both set to 0, and the width and height are set to the width and height of the window into which the GL will do its rendering. See glViewport.\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/graphics/ParamName4.inl",
    "content": "// data returns a single value indicating the active multitexture unit. The initial value is GL_TEXTURE0. See glActiveTexture.\r\nACTIVE_TEXTURE = GL_ACTIVE_TEXTURE,\r\n// data returns a pair of values indicating the range of widths supported for aliased lines. See glLineWidth.\r\nALIASED_LINE_WIDTH_RANGE = GL_ALIASED_LINE_WIDTH_RANGE,\r\n// returns a single value, the name of the buffer object currently bound to the target GL_ARRAY_BUFFER. If no buffer object is bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\nARRAY_BUFFER_BINDING = GL_ARRAY_BUFFER_BINDING,\r\n// returns a single boolean value indicating whether blending is enabled. The initial value is GL_FALSE. See glBlendFunc.\r\nBLEND = GL_BLEND,\r\n// returns four values, the red, green, blue, and alpha values which are the components of the blend color. See glBlendColor.\r\nBLEND_COLOR = GL_BLEND_COLOR,\r\n// returns one value, the symbolic constant identifying the alpha destination blend function. The initial value is GL_ZERO. See glBlendFunc and glBlendFuncSeparate.\r\nBLEND_DST_ALPHA = GL_BLEND_DST_ALPHA,\r\n// returns one value, the symbolic constant identifying the RGB destination blend function. The initial value is GL_ZERO. See glBlendFunc and glBlendFuncSeparate.\r\nBLEND_DST_RGB = GL_BLEND_DST_RGB,\r\n// returns one value, a symbolic constant indicating whether the RGB blend equation is GL_FUNC_ADD, GL_FUNC_SUBTRACT, GL_FUNC_REVERSE_SUBTRACT, GL_MIN or GL_MAX. See glBlendEquationSeparate.\r\nBLEND_EQUATION_RGB = GL_BLEND_EQUATION_RGB,\r\n// returns one value, a symbolic constant indicating whether the Alpha blend equation is GL_FUNC_ADD, GL_FUNC_SUBTRACT, GL_FUNC_REVERSE_SUBTRACT, GL_MIN or GL_MAX. See glBlendEquationSeparate.\r\nBLEND_EQUATION_ALPHA = GL_BLEND_EQUATION_ALPHA,\r\n// returns one value, the symbolic constant identifying the alpha source blend function. The initial value is GL_ONE. See glBlendFunc and glBlendFuncSeparate.\r\nBLEND_SRC_ALPHA = GL_BLEND_SRC_ALPHA,\r\n// returns one value, the symbolic constant identifying the RGB source blend function. The initial value is GL_ONE. See glBlendFunc and glBlendFuncSeparate.\r\nBLEND_SRC_RGB = GL_BLEND_SRC_RGB,\r\n// returns four values: the red, green, blue, and alpha values used to clear the color buffers. Integer values, if requested, are linearly mapped from the internal floating-point representation such that 1.0 returns the most positive representable integer value, and -1.0 returns the most negative representable integer value. The initial value is (0, 0, 0, 0). See glClearColor.\r\nCOLOR_CLEAR_VALUE = GL_COLOR_CLEAR_VALUE,\r\n// returns a single boolean value indicating whether a fragment's RGBA color values are merged into the framebuffer using a logical operation. The initial value is GL_FALSE. See glLogicOp.\r\nCOLOR_LOGIC_OP = GL_COLOR_LOGIC_OP,\r\n// returns four boolean values: the red, green, blue, and alpha write enables for the color buffers. The initial value is (GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE). See glColorMask.\r\nCOLOR_WRITEMASK = GL_COLOR_WRITEMASK,\r\n// returns a list of symbolic constants of length GL_NUM_COMPRESSED_TEXTURE_FORMATS indicating which compressed texture formats are available. See glCompressedTexImage2D.\r\nCOMPRESSED_TEXTURE_FORMATS = GL_COMPRESSED_TEXTURE_FORMATS,\r\n// returns one value, the maximum number of active shader storage blocks that may be accessed by a compute shader.\r\nMAX_COMPUTE_SHADER_STORAGE_BLOCKS = GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS,\r\n// returns one value, the maximum total number of active shader storage blocks that may be accessed by all active shaders.\r\nMAX_COMBINED_SHADER_STORAGE_BLOCKS = GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS,\r\n// returns one value, the maximum number of uniform blocks per compute shader. The value must be at least 14. See glUniformBlockBinding.\r\nMAX_COMPUTE_UNIFORM_BLOCKS = GL_MAX_COMPUTE_UNIFORM_BLOCKS,\r\n// returns one value, the maximum supported texture image units that can be used to access texture maps from the compute shader. The value may be at least 16. See glActiveTexture.\r\nMAX_COMPUTE_TEXTURE_IMAGE_UNITS = GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS,\r\n// returns one value, the maximum number of individual floating-point, integer, or boolean values that can be held in uniform variable storage for a compute shader. The value must be at least 1024. See glUniform.\r\nMAX_COMPUTE_UNIFORM_COMPONENTS = GL_MAX_COMPUTE_UNIFORM_COMPONENTS,\r\n// returns a single value, the maximum number of atomic counters available to compute shaders.\r\nMAX_COMPUTE_ATOMIC_COUNTERS = GL_MAX_COMPUTE_ATOMIC_COUNTERS,\r\n// returns a single value, the maximum number of atomic counter buffers that may be accessed by a compute shader.\r\nMAX_COMPUTE_ATOMIC_COUNTER_BUFFERS = GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS,\r\n// returns one value, the number of words for compute shader uniform variables in all uniform blocks (including default). The value must be at least 1. See glUniform.\r\nMAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS = GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS,\r\n// returns one value, the number of invocations in a single local work group (i.e., the product of the three dimensions) that may be dispatched to a compute shader.\r\nMAX_COMPUTE_WORK_GROUP_INVOCATIONS = GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS,\r\n// Accepted by the indexed versions of glGet. the maximum number of work groups that may be dispatched to a compute shader. Indices 0, 1, and 2 correspond to the X, Y and Z dimensions, respectively.\r\nMAX_COMPUTE_WORK_GROUP_COUNT = GL_MAX_COMPUTE_WORK_GROUP_COUNT,\r\n// Accepted by the indexed versions of glGet. the maximum size of a work groups that may be used during compilation of a compute shader. Indices 0, 1, and 2 correspond to the X, Y and Z dimensions, respectively.\r\nMAX_COMPUTE_WORK_GROUP_SIZE = GL_MAX_COMPUTE_WORK_GROUP_SIZE,\r\n// returns a single value, the name of the buffer object currently bound to the target GL_DISPATCH_INDIRECT_BUFFER. If no buffer object is bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\nDISPATCH_INDIRECT_BUFFER_BINDING = GL_DISPATCH_INDIRECT_BUFFER_BINDING,\r\n// returns a single value, the maximum depth of the debug message group stack.\r\nMAX_DEBUG_GROUP_STACK_DEPTH = GL_MAX_DEBUG_GROUP_STACK_DEPTH,\r\n// returns a single value, the current depth of the debug message group stack.\r\nDEBUG_GROUP_STACK_DEPTH = GL_DEBUG_GROUP_STACK_DEPTH,\r\n// returns one value, the flags with which the context was created (such as debugging functionality).\r\nCONTEXT_FLAGS = GL_CONTEXT_FLAGS,\r\n// returns a single boolean value indicating whether polygon culling is enabled. The initial value is GL_FALSE. See glCullFace.\r\nCULL_FACE = GL_CULL_FACE,\r\n// returns one value, the name of the program object that is currently active, or 0 if no program object is active. See glUseProgram.\r\nCURRENT_PROGRAM = GL_CURRENT_PROGRAM,\r\n// returns one value, the value that is used to clear the depth buffer. Integer values, if requested, are linearly mapped from the internal floating-point representation such that 1.0 returns the most positive representable integer value, and -1.0 returns the most negative representable integer value. The initial value is 1. See glClearDepth.\r\nDEPTH_CLEAR_VALUE = GL_DEPTH_CLEAR_VALUE,\r\n// returns one value, the symbolic constant that indicates the depth comparison function. The initial value is GL_LESS. See glDepthFunc.\r\nDEPTH_FUNC = GL_DEPTH_FUNC,\r\n// returns two values: the near and far mapping limits for the depth buffer. Integer values, if requested, are linearly mapped from the internal floating-point representation such that 1.0 returns the most positive representable integer value, and -1.0 returns the most negative representable integer value. The initial value is (0, 1). See glDepthRange.\r\nDEPTH_RANGE = GL_DEPTH_RANGE,\r\n// returns a single boolean value indicating whether depth testing of fragments is enabled. The initial value is GL_FALSE. See glDepthFunc and glDepthRange.\r\nDEPTH_TEST = GL_DEPTH_TEST,\r\n// returns a single boolean value indicating if the depth buffer is enabled for writing. The initial value is GL_TRUE. See glDepthMask.\r\nDEPTH_WRITEMASK = GL_DEPTH_WRITEMASK,\r\n// returns a single boolean value indicating whether dithering of fragment colors and indices is enabled. The initial value is GL_TRUE.\r\nDITHER = GL_DITHER,\r\n// returns a single boolean value indicating whether double buffering is supported.\r\nDOUBLEBUFFER = GL_DOUBLEBUFFER,\r\n// returns one value, a symbolic constant indicating which buffers are being drawn to. See glDrawBuffer. The initial value is GL_BACK if there are back buffers, otherwise it is GL_FRONT.\r\nDRAW_BUFFER = GL_DRAW_BUFFER,\r\n// returns one value, a symbolic constant indicating which buffers are being drawn to by the corresponding output color. See glDrawBuffers. The initial value of GL_DRAW_BUFFER0 is GL_BACK if there are back buffers, otherwise it is GL_FRONT. The initial values of draw buffers for all other output colors is GL_NONE.\r\nDRAW_BUFFER0  = GL_DRAW_BUFFER0 ,\r\nDRAW_BUFFER1  = GL_DRAW_BUFFER1 ,\r\nDRAW_BUFFER2  = GL_DRAW_BUFFER2 ,\r\nDRAW_BUFFER3  = GL_DRAW_BUFFER3 ,\r\nDRAW_BUFFER4  = GL_DRAW_BUFFER4 ,\r\nDRAW_BUFFER5  = GL_DRAW_BUFFER5 ,\r\nDRAW_BUFFER6  = GL_DRAW_BUFFER6 ,\r\nDRAW_BUFFER7  = GL_DRAW_BUFFER7 ,\r\nDRAW_BUFFER8  = GL_DRAW_BUFFER8 ,\r\nDRAW_BUFFER9  = GL_DRAW_BUFFER9 ,\r\nDRAW_BUFFER10 = GL_DRAW_BUFFER10,\r\nDRAW_BUFFER11 = GL_DRAW_BUFFER11,\r\nDRAW_BUFFER12 = GL_DRAW_BUFFER12,\r\nDRAW_BUFFER13 = GL_DRAW_BUFFER13,\r\nDRAW_BUFFER14 = GL_DRAW_BUFFER14,\r\nDRAW_BUFFER15 = GL_DRAW_BUFFER15,\r\n// returns one value, the name of the framebuffer object currently bound to the GL_DRAW_FRAMEBUFFER target. If the default framebuffer is bound, this value will be zero. The initial value is zero. See glBindFramebuffer.\r\nDRAW_FRAMEBUFFER_BINDING = GL_DRAW_FRAMEBUFFER_BINDING,\r\n// returns one value, the name of the framebuffer object currently bound to the GL_READ_FRAMEBUFFER target. If the default framebuffer is bound, this value will be zero. The initial value is zero. See glBindFramebuffer.\r\nREAD_FRAMEBUFFER_BINDING = GL_READ_FRAMEBUFFER_BINDING,\r\n// returns a single value, the name of the buffer object currently bound to the target GL_ELEMENT_ARRAY_BUFFER. If no buffer object is bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\nELEMENT_ARRAY_BUFFER_BINDING = GL_ELEMENT_ARRAY_BUFFER_BINDING,\r\n// returns one value, a symbolic constant indicating the mode of the derivative accuracy hint for fragment shaders. The initial value is GL_DONT_CARE. See glHint.\r\nFRAGMENT_SHADER_DERIVATIVE_HINT = GL_FRAGMENT_SHADER_DERIVATIVE_HINT,\r\n// returns a single GLenum value indicating the implementation's preferred pixel format. See glReadPixels.\r\nIMPLEMENTATION_COLOR_READ_FORMAT = GL_IMPLEMENTATION_COLOR_READ_FORMAT,\r\n// returns a single GLenum value indicating the implementation's preferred pixel type. See glReadPixels.\r\nIMPLEMENTATION_COLOR_READ_TYPE = GL_IMPLEMENTATION_COLOR_READ_TYPE,\r\n// returns a single boolean value indicating whether antialiasing of lines is enabled. The initial value is GL_FALSE. See glLineWidth.\r\nLINE_SMOOTH = GL_LINE_SMOOTH,\r\n// returns one value, a symbolic constant indicating the mode of the line antialiasing hint. The initial value is GL_DONT_CARE. See glHint.\r\nLINE_SMOOTH_HINT = GL_LINE_SMOOTH_HINT,\r\n// returns one value, the line width as specified with glLineWidth. The initial value is 1.\r\nLINE_WIDTH = GL_LINE_WIDTH,\r\n// returns one value, the implementation dependent specifc vertex of a primitive that is used to select the rendering layer. If the value returned is equivalent to GL_PROVOKING_VERTEX, then the vertex selection follows the convention specified by glProvokingVertex. If the value returned is equivalent to GL_FIRST_VERTEX_CONVENTION, then the selection is always taken from the first vertex in the primitive. If the value returned is equivalent to GL_LAST_VERTEX_CONVENTION, then the selection is always taken from the last vertex in the primitive. If the value returned is equivalent to GL_UNDEFINED_VERTEX, then the selection is not guaranteed to be taken from any specific vertex in the primitive.\r\nLAYER_PROVOKING_VERTEX = GL_LAYER_PROVOKING_VERTEX,\r\n// returns one value, a symbolic constant indicating the selected logic operation mode. The initial value is GL_COPY. See glLogicOp.\r\nLOGIC_OP_MODE = GL_LOGIC_OP_MODE,\r\n// returns one value, the major version number of the OpenGL API supported by the current context.\r\nMAJOR_VERSION = GL_MAJOR_VERSION,\r\n// returns one value, a rough estimate of the largest 3D texture that the GL can handle. The value must be at least 64. Use GL_PROXY_TEXTURE_3D to determine if a texture is too large. See glTexImage3D.\r\nMAX_3D_TEXTURE_SIZE = GL_MAX_3D_TEXTURE_SIZE,\r\n// returns one value. The value indicates the maximum number of layers allowed in an array texture, and must be at least 256. See glTexImage2D.\r\nMAX_ARRAY_TEXTURE_LAYERS = GL_MAX_ARRAY_TEXTURE_LAYERS,\r\n// returns one value, the maximum number of application-defined clipping distances. The value must be at least 8.\r\nMAX_CLIP_DISTANCES = GL_MAX_CLIP_DISTANCES,\r\n// returns one value, the maximum number of samples in a color multisample texture.\r\nMAX_COLOR_TEXTURE_SAMPLES = GL_MAX_COLOR_TEXTURE_SAMPLES,\r\n// returns a single value, the maximum number of atomic counters available to all active shaders.\r\nMAX_COMBINED_ATOMIC_COUNTERS = GL_MAX_COMBINED_ATOMIC_COUNTERS,\r\n// returns one value, the number of words for fragment shader uniform variables in all uniform blocks (including default). The value must be at least 1. See glUniform.\r\nMAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS = GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS,\r\n// returns one value, the number of words for geometry shader uniform variables in all uniform blocks (including default). The value must be at least 1. See glUniform.\r\nMAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS = GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS,\r\n// returns one value, the maximum supported texture image units that can be used to access texture maps from the vertex shader and the fragment processor combined. If both the vertex shader and the fragment processing stage access the same texture image unit, then that counts as using two texture image units against this limit. The value must be at least 48. See glActiveTexture.\r\nMAX_COMBINED_TEXTURE_IMAGE_UNITS = GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS,\r\n// returns one value, the maximum number of uniform blocks per program. The value must be at least 70. See glUniformBlockBinding.\r\nMAX_COMBINED_UNIFORM_BLOCKS = GL_MAX_COMBINED_UNIFORM_BLOCKS,\r\n// returns one value, the number of words for vertex shader uniform variables in all uniform blocks (including default). The value must be at least 1. See glUniform.\r\nMAX_COMBINED_VERTEX_UNIFORM_COMPONENTS = GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS,\r\n// returns one value. The value gives a rough estimate of the largest cube-map texture that the GL can handle. The value must be at least 1024. Use GL_PROXY_TEXTURE_CUBE_MAP to determine if a texture is too large. See glTexImage2D.\r\nMAX_CUBE_MAP_TEXTURE_SIZE = GL_MAX_CUBE_MAP_TEXTURE_SIZE,\r\n// returns one value, the maximum number of samples in a multisample depth or depth-stencil texture.\r\nMAX_DEPTH_TEXTURE_SAMPLES = GL_MAX_DEPTH_TEXTURE_SAMPLES,\r\n// returns one value, the maximum number of simultaneous outputs that may be written in a fragment shader. The value must be at least 8. See glDrawBuffers.\r\nMAX_DRAW_BUFFERS = GL_MAX_DRAW_BUFFERS,\r\n// returns one value, the maximum number of active draw buffers when using dual-source blending. The value must be at least 1. See glBlendFunc and glBlendFuncSeparate.\r\nMAX_DUAL_SOURCE_DRAW_BUFFERS = GL_MAX_DUAL_SOURCE_DRAW_BUFFERS,\r\n// returns one value, the recommended maximum number of vertex array indices. See glDrawRangeElements.\r\nMAX_ELEMENTS_INDICES = GL_MAX_ELEMENTS_INDICES,\r\n// returns one value, the recommended maximum number of vertex array vertices. See glDrawRangeElements.\r\nMAX_ELEMENTS_VERTICES = GL_MAX_ELEMENTS_VERTICES,\r\n// returns a single value, the maximum number of atomic counters available to fragment shaders.\r\nMAX_FRAGMENT_ATOMIC_COUNTERS = GL_MAX_FRAGMENT_ATOMIC_COUNTERS,\r\n// returns one value, the maximum number of active shader storage blocks that may be accessed by a fragment shader.\r\nMAX_FRAGMENT_SHADER_STORAGE_BLOCKS = GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS,\r\n// returns one value, the maximum number of components of the inputs read by the fragment shader, which must be at least 128.\r\nMAX_FRAGMENT_INPUT_COMPONENTS = GL_MAX_FRAGMENT_INPUT_COMPONENTS,\r\n// returns one value, the maximum number of individual floating-point, integer, or boolean values that can be held in uniform variable storage for a fragment shader. The value must be at least 1024. See glUniform.\r\nMAX_FRAGMENT_UNIFORM_COMPONENTS = GL_MAX_FRAGMENT_UNIFORM_COMPONENTS,\r\n// returns one value, the maximum number of individual 4-vectors of floating-point, integer, or boolean values that can be held in uniform variable storage for a fragment shader. The value is equal to the value of GL_MAX_FRAGMENT_UNIFORM_COMPONENTS divided by 4 and must be at least 256. See glUniform.\r\nMAX_FRAGMENT_UNIFORM_VECTORS = GL_MAX_FRAGMENT_UNIFORM_VECTORS,\r\n// returns one value, the maximum number of uniform blocks per fragment shader. The value must be at least 12. See glUniformBlockBinding.\r\nMAX_FRAGMENT_UNIFORM_BLOCKS = GL_MAX_FRAGMENT_UNIFORM_BLOCKS,\r\n// returns one value, the maximum width for a framebuffer that has no attachments, which must be at least 16384. See glFramebufferParameter.\r\nMAX_FRAMEBUFFER_WIDTH = GL_MAX_FRAMEBUFFER_WIDTH,\r\n// returns one value, the maximum height for a framebuffer that has no attachments, which must be at least 16384. See glFramebufferParameter.\r\nMAX_FRAMEBUFFER_HEIGHT = GL_MAX_FRAMEBUFFER_HEIGHT,\r\n// returns one value, the maximum number of layers for a framebuffer that has no attachments, which must be at least 2048. See glFramebufferParameter.\r\nMAX_FRAMEBUFFER_LAYERS = GL_MAX_FRAMEBUFFER_LAYERS,\r\n// returns one value, the maximum samples in a framebuffer that has no attachments, which must be at least 4. See glFramebufferParameter.\r\nMAX_FRAMEBUFFER_SAMPLES = GL_MAX_FRAMEBUFFER_SAMPLES,\r\n// returns a single value, the maximum number of atomic counters available to geometry shaders.\r\nMAX_GEOMETRY_ATOMIC_COUNTERS = GL_MAX_GEOMETRY_ATOMIC_COUNTERS,\r\n// returns one value, the maximum number of active shader storage blocks that may be accessed by a geometry shader.\r\nMAX_GEOMETRY_SHADER_STORAGE_BLOCKS = GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS,\r\n// returns one value, the maximum number of components of inputs read by a geometry shader, which must be at least 64.\r\nMAX_GEOMETRY_INPUT_COMPONENTS = GL_MAX_GEOMETRY_INPUT_COMPONENTS,\r\n// returns one value, the maximum number of components of outputs written by a geometry shader, which must be at least 128.\r\nMAX_GEOMETRY_OUTPUT_COMPONENTS = GL_MAX_GEOMETRY_OUTPUT_COMPONENTS,\r\n// returns one value, the maximum supported texture image units that can be used to access texture maps from the geometry shader. The value must be at least 16. See glActiveTexture.\r\nMAX_GEOMETRY_TEXTURE_IMAGE_UNITS = GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS,\r\n// returns one value, the maximum number of uniform blocks per geometry shader. The value must be at least 12. See glUniformBlockBinding.\r\nMAX_GEOMETRY_UNIFORM_BLOCKS = GL_MAX_GEOMETRY_UNIFORM_BLOCKS,\r\n// returns one value, the maximum number of individual floating-point, integer, or boolean values that can be held in uniform variable storage for a geometry shader. The value must be at least 1024. See glUniform.\r\nMAX_GEOMETRY_UNIFORM_COMPONENTS = GL_MAX_GEOMETRY_UNIFORM_COMPONENTS,\r\n// returns one value, the maximum number of samples supported in integer format multisample buffers.\r\nMAX_INTEGER_SAMPLES = GL_MAX_INTEGER_SAMPLES,\r\n// returns one value, the minimum alignment in basic machine units of pointers returned fromglMapBuffer and glMapBufferRange. This value must be a power of two and must be at least 64.\r\nMIN_MAP_BUFFER_ALIGNMENT = GL_MIN_MAP_BUFFER_ALIGNMENT,\r\n// returns one value, the maximum length of a label that may be assigned to an object. See glObjectLabel and glObjectPtrLabel.\r\nMAX_LABEL_LENGTH = GL_MAX_LABEL_LENGTH,\r\n// returns one value, the maximum texel offset allowed in a texture lookup, which must be at least 7.\r\nMAX_PROGRAM_TEXEL_OFFSET = GL_MAX_PROGRAM_TEXEL_OFFSET,\r\n// returns one value, the minimum texel offset allowed in a texture lookup, which must be at most -8.\r\nMIN_PROGRAM_TEXEL_OFFSET = GL_MIN_PROGRAM_TEXEL_OFFSET,\r\n// returns one value. The value gives a rough estimate of the largest rectangular texture that the GL can handle. The value must be at least 1024. Use GL_PROXY_TEXTURE_RECTANGLE to determine if a texture is too large. See glTexImage2D.\r\nMAX_RECTANGLE_TEXTURE_SIZE = GL_MAX_RECTANGLE_TEXTURE_SIZE,\r\n// returns one value. The value indicates the maximum supported size for renderbuffers. See glFramebufferRenderbuffer.\r\nMAX_RENDERBUFFER_SIZE = GL_MAX_RENDERBUFFER_SIZE,\r\n// returns one value, the maximum number of sample mask words.\r\nMAX_SAMPLE_MASK_WORDS = GL_MAX_SAMPLE_MASK_WORDS,\r\n// returns one value, the maximum glWaitSync timeout interval.\r\nMAX_SERVER_WAIT_TIMEOUT = GL_MAX_SERVER_WAIT_TIMEOUT,\r\n// returns one value, the maximum number of shader storage buffer binding points on the context, which must be at least 8.\r\nMAX_SHADER_STORAGE_BUFFER_BINDINGS = GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS,\r\n// returns a single value, the maximum number of atomic counters available to tessellation control shaders.\r\nMAX_TESS_CONTROL_ATOMIC_COUNTERS = GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS,\r\n// returns a single value, the maximum number of atomic counters available to tessellation evaluation shaders.\r\nMAX_TESS_EVALUATION_ATOMIC_COUNTERS = GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS,\r\n// returns one value, the maximum number of active shader storage blocks that may be accessed by a tessellation control shader.\r\nMAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS = GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS,\r\n// returns one value, the maximum number of active shader storage blocks that may be accessed by a tessellation evaluation shader.\r\nMAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS = GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS,\r\n// returns one value. The value gives the maximum number of texels allowed in the texel array of a texture buffer object. Value must be at least 65536.\r\nMAX_TEXTURE_BUFFER_SIZE = GL_MAX_TEXTURE_BUFFER_SIZE,\r\n// returns one value, the maximum supported texture image units that can be used to access texture maps from the fragment shader. The value must be at least 16. See glActiveTexture.\r\nMAX_TEXTURE_IMAGE_UNITS = GL_MAX_TEXTURE_IMAGE_UNITS,\r\n// returns one value, the maximum, absolute value of the texture level-of-detail bias. The value must be at least 2.0.\r\nMAX_TEXTURE_LOD_BIAS = GL_MAX_TEXTURE_LOD_BIAS,\r\n// returns one value. The value gives a rough estimate of the largest texture that the GL can handle. The value must be at least 1024. Use a proxy texture target such as GL_PROXY_TEXTURE_1D or GL_PROXY_TEXTURE_2D to determine if a texture is too large. See glTexImage1D and glTexImage2D.\r\nMAX_TEXTURE_SIZE = GL_MAX_TEXTURE_SIZE,\r\n// returns one value, the maximum number of uniform buffer binding points on the context, which must be at least 36.\r\nMAX_UNIFORM_BUFFER_BINDINGS = GL_MAX_UNIFORM_BUFFER_BINDINGS,\r\n// returns one value, the maximum size in basic machine units of a uniform block, which must be at least 16384.\r\nMAX_UNIFORM_BLOCK_SIZE = GL_MAX_UNIFORM_BLOCK_SIZE,\r\n// returns one value, the maximum number of explicitly assignable uniform locations, which must be at least 1024.\r\nMAX_UNIFORM_LOCATIONS = GL_MAX_UNIFORM_LOCATIONS,\r\n// returns one value, the number components for varying variables, which must be at least 60.\r\nMAX_VARYING_COMPONENTS = GL_MAX_VARYING_COMPONENTS,\r\n// returns one value, the number 4-vectors for varying variables, which is equal to the value of GL_MAX_VARYING_COMPONENTS and must be at least 15.\r\nMAX_VARYING_VECTORS = GL_MAX_VARYING_VECTORS,\r\n// returns one value, the maximum number of interpolators available for processing varying variables used by vertex and fragment shaders. This value represents the number of individual floating-point values that can be interpolated; varying variables declared as vectors, matrices, and arrays will all consume multiple interpolators. The value must be at least 32.\r\nMAX_VARYING_FLOATS = GL_MAX_VARYING_FLOATS,\r\n// returns a single value, the maximum number of atomic counters available to vertex shaders.\r\nMAX_VERTEX_ATOMIC_COUNTERS = GL_MAX_VERTEX_ATOMIC_COUNTERS,\r\n// returns one value, the maximum number of 4-component generic vertex attributes accessible to a vertex shader. The value must be at least 16. See glVertexAttrib.\r\nMAX_VERTEX_ATTRIBS = GL_MAX_VERTEX_ATTRIBS,\r\n// returns one value, the maximum number of active shader storage blocks that may be accessed by a vertex shader.\r\nMAX_VERTEX_SHADER_STORAGE_BLOCKS = GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS,\r\n// returns one value, the maximum supported texture image units that can be used to access texture maps from the vertex shader. The value may be at least 16. See glActiveTexture.\r\nMAX_VERTEX_TEXTURE_IMAGE_UNITS = GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS,\r\n// returns one value, the maximum number of individual floating-point, integer, or boolean values that can be held in uniform variable storage for a vertex shader. The value must be at least 1024. See glUniform.\r\nMAX_VERTEX_UNIFORM_COMPONENTS = GL_MAX_VERTEX_UNIFORM_COMPONENTS,\r\n// returns one value, the maximum number of 4-vectors that may be held in uniform variable storage for the vertex shader. The value of GL_MAX_VERTEX_UNIFORM_VECTORS is equal to the value of GL_MAX_VERTEX_UNIFORM_COMPONENTS and must be at least 256.\r\nMAX_VERTEX_UNIFORM_VECTORS = GL_MAX_VERTEX_UNIFORM_VECTORS,\r\n// returns one value, the maximum number of components of output written by a vertex shader, which must be at least 64.\r\nMAX_VERTEX_OUTPUT_COMPONENTS = GL_MAX_VERTEX_OUTPUT_COMPONENTS,\r\n// returns one value, the maximum number of uniform blocks per vertex shader. The value must be at least 12. See glUniformBlockBinding.\r\nMAX_VERTEX_UNIFORM_BLOCKS = GL_MAX_VERTEX_UNIFORM_BLOCKS,\r\n// returns two values: the maximum supported width and height of the viewport. These must be at least as large as the visible dimensions of the display being rendered to. See glViewport.\r\nMAX_VIEWPORT_DIMS = GL_MAX_VIEWPORT_DIMS,\r\n// returns one value, the maximum number of simultaneous viewports that are supported. The value must be at least 16. See glViewportIndexed.\r\nMAX_VIEWPORTS = GL_MAX_VIEWPORTS,\r\n// returns one value, the minor version number of the OpenGL API supported by the current context.\r\nMINOR_VERSION = GL_MINOR_VERSION,\r\n// returns a single integer value indicating the number of available compressed texture formats. The minimum value is 4. See glCompressedTexImage2D.\r\nNUM_COMPRESSED_TEXTURE_FORMATS = GL_NUM_COMPRESSED_TEXTURE_FORMATS,\r\n// returns one value, the number of extensions supported by the GL implementation for the current context. See glGetString.\r\nNUM_EXTENSIONS = GL_NUM_EXTENSIONS,\r\n// returns one value, the number of program binary formats supported by the implementation.\r\nNUM_PROGRAM_BINARY_FORMATS = GL_NUM_PROGRAM_BINARY_FORMATS,\r\n// returns one value, the number of binary shader formats supported by the implementation. If this value is greater than zero, then the implementation supports loading binary shaders. If it is zero, then the loading of binary shaders by the implementation is not supported.\r\nNUM_SHADER_BINARY_FORMATS = GL_NUM_SHADER_BINARY_FORMATS,\r\n// returns one value, the byte alignment used for writing pixel to memory. The initial value is 4. See glPixelStore.\r\nPACK_ALIGNMENT = GL_PACK_ALIGNMENT,\r\n// returns one value, the image height used for writing pixel to memory. The initial value is 0. See glPixelStore.\r\nPACK_IMAGE_HEIGHT = GL_PACK_IMAGE_HEIGHT,\r\n// returns a single boolean value indicating whether single-bit pixels being written to memory are written first to the least significant bit of each unsigned byte. The initial value is GL_FALSE. See glPixelStore.\r\nPACK_LSB_FIRST = GL_PACK_LSB_FIRST,\r\n// returns one value, the row length used for writing pixel to memory. The initial value is 0. See glPixelStore.\r\nPACK_ROW_LENGTH = GL_PACK_ROW_LENGTH,\r\n// returns one value, the number of pixel images skipped before the first pixel is written into memory. The initial value is 0. See glPixelStore.\r\nPACK_SKIP_IMAGES = GL_PACK_SKIP_IMAGES,\r\n// returns one value, the number of pixel locations skipped before the first pixel is written into memory. The initial value is 0. See glPixelStore.\r\nPACK_SKIP_PIXELS = GL_PACK_SKIP_PIXELS,\r\n// returns one value, the number of rows of pixel locations skipped before the first pixel is written into memory. The initial value is 0. See glPixelStore.\r\nPACK_SKIP_ROWS = GL_PACK_SKIP_ROWS,\r\n// returns a single boolean value indicating whether the bytes of two-byte and four-byte pixel indices and components are swapped before being written to memory. The initial value is GL_FALSE. See glPixelStore.\r\nPACK_SWAP_BYTES = GL_PACK_SWAP_BYTES,\r\n// returns a single value, the name of the buffer object currently bound to the target GL_PIXEL_PACK_BUFFER. If no buffer object is bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\nPIXEL_PACK_BUFFER_BINDING = GL_PIXEL_PACK_BUFFER_BINDING,\r\n// returns a single value, the name of the buffer object currently bound to the target GL_PIXEL_UNPACK_BUFFER. If no buffer object is bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\nPIXEL_UNPACK_BUFFER_BINDING = GL_PIXEL_UNPACK_BUFFER_BINDING,\r\n// returns one value, the point size threshold for determining the point size. See glPointParameter.\r\nPOINT_FADE_THRESHOLD_SIZE = GL_POINT_FADE_THRESHOLD_SIZE,\r\n// returns one value, the current primitive restart index. The initial value is 0. See glPrimitiveRestartIndex.\r\nPRIMITIVE_RESTART_INDEX = GL_PRIMITIVE_RESTART_INDEX,\r\n// an array of GL_NUM_PROGRAM_BINARY_FORMATS values, indicating the proram binary formats supported by the implementation.\r\nPROGRAM_BINARY_FORMATS = GL_PROGRAM_BINARY_FORMATS,\r\n// a single value, the name of the currently bound program pipeline object, or zero if no program pipeline object is bound. See glBindProgramPipeline.\r\nPROGRAM_PIPELINE_BINDING = GL_PROGRAM_PIPELINE_BINDING,\r\n// returns a single boolean value indicating whether vertex program point size mode is enabled. If enabled, then the point size is taken from the shader built-in gl_PointSize. If disabled, then the point size is taken from the point state as specified by glPointSize. The initial value is GL_FALSE.\r\nPROGRAM_POINT_SIZE = GL_PROGRAM_POINT_SIZE,\r\n// returns one value, the currently selected provoking vertex convention. The initial value is GL_LAST_VERTEX_CONVENTION. See glProvokingVertex.\r\nPROVOKING_VERTEX = GL_PROVOKING_VERTEX,\r\n// returns one value, the point size as specified by glPointSize. The initial value is 1.\r\nPOINT_SIZE = GL_POINT_SIZE,\r\n// returns one value, the size difference between adjacent supported sizes for antialiased points. See glPointSize.\r\nPOINT_SIZE_GRANULARITY = GL_POINT_SIZE_GRANULARITY,\r\n// returns two values: the smallest and largest supported sizes for antialiased points. The smallest size must be at most 1, and the largest size must be at least 1. See glPointSize.\r\nPOINT_SIZE_RANGE = GL_POINT_SIZE_RANGE,\r\n// returns one value, the scaling factor used to determine the variable offset that is added to the depth value of each fragment generated when a polygon is rasterized. The initial value is 0. See glPolygonOffset.\r\nPOLYGON_OFFSET_FACTOR = GL_POLYGON_OFFSET_FACTOR,\r\n// returns one value. This value is multiplied by an implementation-specific value and then added to the depth value of each fragment generated when a polygon is rasterized. The initial value is 0. See glPolygonOffset.\r\nPOLYGON_OFFSET_UNITS = GL_POLYGON_OFFSET_UNITS,\r\n// returns a single boolean value indicating whether polygon offset is enabled for polygons in fill mode. The initial value is GL_FALSE. See glPolygonOffset.\r\nPOLYGON_OFFSET_FILL = GL_POLYGON_OFFSET_FILL,\r\n// returns a single boolean value indicating whether polygon offset is enabled for polygons in line mode. The initial value is GL_FALSE. See glPolygonOffset.\r\nPOLYGON_OFFSET_LINE = GL_POLYGON_OFFSET_LINE,\r\n// returns a single boolean value indicating whether polygon offset is enabled for polygons in point mode. The initial value is GL_FALSE. See glPolygonOffset.\r\nPOLYGON_OFFSET_POINT = GL_POLYGON_OFFSET_POINT,\r\n// returns a single boolean value indicating whether antialiasing of polygons is enabled. The initial value is GL_FALSE. See glPolygonMode.\r\nPOLYGON_SMOOTH = GL_POLYGON_SMOOTH,\r\n// returns one value, a symbolic constant indicating the mode of the polygon antialiasing hint. The initial value is GL_DONT_CARE. See glHint.\r\nPOLYGON_SMOOTH_HINT = GL_POLYGON_SMOOTH_HINT,\r\n// returns one value, a symbolic constant indicating which color buffer is selected for reading. The initial value is GL_BACK if there is a back buffer, otherwise it is GL_FRONT. See glReadPixels.\r\nREAD_BUFFER = GL_READ_BUFFER,\r\n// returns a single value, the name of the renderbuffer object currently bound to the target GL_RENDERBUFFER. If no renderbuffer object is bound to this target, 0 is returned. The initial value is 0. See glBindRenderbuffer.\r\nRENDERBUFFER_BINDING = GL_RENDERBUFFER_BINDING,\r\n// returns a single integer value indicating the number of sample buffers associated with the framebuffer. See glSampleCoverage.\r\nSAMPLE_BUFFERS = GL_SAMPLE_BUFFERS,\r\n// returns a single positive floating-point value indicating the current sample coverage value. See glSampleCoverage.\r\nSAMPLE_COVERAGE_VALUE = GL_SAMPLE_COVERAGE_VALUE,\r\n// returns a single boolean value indicating if the temporary coverage value should be inverted. See glSampleCoverage.\r\nSAMPLE_COVERAGE_INVERT = GL_SAMPLE_COVERAGE_INVERT,\r\n// returns a single value, the name of the sampler object currently bound to the active texture unit. The initial value is 0. See glBindSampler.\r\nSAMPLER_BINDING = GL_SAMPLER_BINDING,\r\n// returns a single integer value indicating the coverage mask size. See glSampleCoverage.\r\nSAMPLES = GL_SAMPLES,\r\n// returns four values: the x and y window coordinates of the scissor box, followed by its width and height. Initially the x and y window coordinates are both 0 and the width and height are set to the size of the window. See glScissor.\r\nSCISSOR_BOX = GL_SCISSOR_BOX,\r\n// returns a single boolean value indicating whether scissoring is enabled. The initial value is GL_FALSE. See glScissor.\r\nSCISSOR_TEST = GL_SCISSOR_TEST,\r\n// returns a single boolean value indicating whether an online shader compiler is present in the implementation. All desktop OpenGL implementations must support online shader compilations, and therefore the value of GL_SHADER_COMPILER will always be GL_TRUE.\r\nSHADER_COMPILER = GL_SHADER_COMPILER,\r\n// When used with non-indexed variants of glGet (such as glGetIntegerv), returns a single value, the name of the buffer object currently bound to the target GL_SHADER_STORAGE_BUFFER. If no buffer object is bound to this target, 0 is returned. When used with indexed variants of glGet (such as glGetIntegeri_v), returns a single value, the name of the buffer object bound to the indexed shader storage buffer binding points. The initial value is 0 for all targets. See glBindBuffer, glBindBufferBase, and glBindBufferRange.\r\nSHADER_STORAGE_BUFFER_BINDING = GL_SHADER_STORAGE_BUFFER_BINDING,\r\n// returns a single value, the minimum required alignment for shader storage buffer sizes and offset. The initial value is 1. See glShaderStorateBlockBinding.\r\nSHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT = GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT,\r\n// When used with indexed variants of glGet (such as glGetInteger64i_v), returns a single value, the start offset of the binding range for each indexed shader storage buffer binding. The initial value is 0 for all bindings. See glBindBufferRange.\r\nSHADER_STORAGE_BUFFER_START = GL_SHADER_STORAGE_BUFFER_START,\r\n// When used with indexed variants of glGet (such as glGetInteger64i_v), returns a single value, the size of the binding range for each indexed shader storage buffer binding. The initial value is 0 for all bindings. See glBindBufferRange.\r\nSHADER_STORAGE_BUFFER_SIZE = GL_SHADER_STORAGE_BUFFER_SIZE,\r\n// returns a pair of values indicating the range of widths supported for smooth (antialiased) lines. See glLineWidth.\r\nSMOOTH_LINE_WIDTH_RANGE = GL_SMOOTH_LINE_WIDTH_RANGE,\r\n// returns a single value indicating the level of quantization applied to smooth line width parameters.\r\nSMOOTH_LINE_WIDTH_GRANULARITY = GL_SMOOTH_LINE_WIDTH_GRANULARITY,\r\n// returns one value, a symbolic constant indicating what action is taken for back-facing polygons when the stencil test fails. The initial value is GL_KEEP. See glStencilOpSeparate.\r\nSTENCIL_BACK_FAIL = GL_STENCIL_BACK_FAIL,\r\n// returns one value, a symbolic constant indicating what function is used for back-facing polygons to compare the stencil reference value with the stencil buffer value. The initial value is GL_ALWAYS. See glStencilFuncSeparate.\r\nSTENCIL_BACK_FUNC = GL_STENCIL_BACK_FUNC,\r\n// returns one value, a symbolic constant indicating what action is taken for back-facing polygons when the stencil test passes, but the depth test fails. The initial value is GL_KEEP. See glStencilOpSeparate.\r\nSTENCIL_BACK_PASS_DEPTH_FAIL = GL_STENCIL_BACK_PASS_DEPTH_FAIL,\r\n// returns one value, a symbolic constant indicating what action is taken for back-facing polygons when the stencil test passes and the depth test passes. The initial value is GL_KEEP. See glStencilOpSeparate.\r\nSTENCIL_BACK_PASS_DEPTH_PASS = GL_STENCIL_BACK_PASS_DEPTH_PASS,\r\n// returns one value, the reference value that is compared with the contents of the stencil buffer for back-facing polygons. The initial value is 0. See glStencilFuncSeparate.\r\nSTENCIL_BACK_REF = GL_STENCIL_BACK_REF,\r\n// returns one value, the mask that is used for back-facing polygons to mask both the stencil reference value and the stencil buffer value before they are compared. The initial value is all 1's. See glStencilFuncSeparate.\r\nSTENCIL_BACK_VALUE_MASK = GL_STENCIL_BACK_VALUE_MASK,\r\n// returns one value, the mask that controls writing of the stencil bitplanes for back-facing polygons. The initial value is all 1's. See glStencilMaskSeparate.\r\nSTENCIL_BACK_WRITEMASK = GL_STENCIL_BACK_WRITEMASK,\r\n// returns one value, the index to which the stencil bitplanes are cleared. The initial value is 0. See glClearStencil.\r\nSTENCIL_CLEAR_VALUE = GL_STENCIL_CLEAR_VALUE,\r\n// returns one value, a symbolic constant indicating what action is taken when the stencil test fails. The initial value is GL_KEEP. See glStencilOp. This stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilOpSeparate.\r\nSTENCIL_FAIL = GL_STENCIL_FAIL,\r\n// returns one value, a symbolic constant indicating what function is used to compare the stencil reference value with the stencil buffer value. The initial value is GL_ALWAYS. See glStencilFunc. This stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilFuncSeparate.\r\nSTENCIL_FUNC = GL_STENCIL_FUNC,\r\n// returns one value, a symbolic constant indicating what action is taken when the stencil test passes, but the depth test fails. The initial value is GL_KEEP. See glStencilOp. This stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilOpSeparate.\r\nSTENCIL_PASS_DEPTH_FAIL = GL_STENCIL_PASS_DEPTH_FAIL,\r\n// returns one value, a symbolic constant indicating what action is taken when the stencil test passes and the depth test passes. The initial value is GL_KEEP. See glStencilOp. This stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilOpSeparate.\r\nSTENCIL_PASS_DEPTH_PASS = GL_STENCIL_PASS_DEPTH_PASS,\r\n// returns one value, the reference value that is compared with the contents of the stencil buffer. The initial value is 0. See glStencilFunc. This stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilFuncSeparate.\r\nSTENCIL_REF = GL_STENCIL_REF,\r\n// returns a single boolean value indicating whether stencil testing of fragments is enabled. The initial value is GL_FALSE. See glStencilFunc and glStencilOp.\r\nSTENCIL_TEST = GL_STENCIL_TEST,\r\n// returns one value, the mask that is used to mask both the stencil reference value and the stencil buffer value before they are compared. The initial value is all 1's. See glStencilFunc. This stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilFuncSeparate.\r\nSTENCIL_VALUE_MASK = GL_STENCIL_VALUE_MASK,\r\n// returns one value, the mask that controls writing of the stencil bitplanes. The initial value is all 1's. See glStencilMask. This stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilMaskSeparate.\r\nSTENCIL_WRITEMASK = GL_STENCIL_WRITEMASK,\r\n// returns a single boolean value indicating whether stereo buffers (left and right) are supported.\r\nSTEREO = GL_STEREO,\r\n// returns one value, an estimate of the number of bits of subpixel resolution that are used to position rasterized geometry in window coordinates. The value must be at least 4.\r\nSUBPIXEL_BITS = GL_SUBPIXEL_BITS,\r\n// returns a single value, the name of the texture currently bound to the target GL_TEXTURE_1D. The initial value is 0. See glBindTexture.\r\nTEXTURE_BINDING_1D = GL_TEXTURE_BINDING_1D,\r\n// returns a single value, the name of the texture currently bound to the target GL_TEXTURE_1D_ARRAY. The initial value is 0. See glBindTexture.\r\nTEXTURE_BINDING_1D_ARRAY = GL_TEXTURE_BINDING_1D_ARRAY,\r\n// returns a single value, the name of the texture currently bound to the target GL_TEXTURE_2D. The initial value is 0. See glBindTexture.\r\nTEXTURE_BINDING_2D = GL_TEXTURE_BINDING_2D,\r\n// returns a single value, the name of the texture currently bound to the target GL_TEXTURE_2D_ARRAY. The initial value is 0. See glBindTexture.\r\nTEXTURE_BINDING_2D_ARRAY = GL_TEXTURE_BINDING_2D_ARRAY,\r\n// returns a single value, the name of the texture currently bound to the target GL_TEXTURE_2D_MULTISAMPLE. The initial value is 0. See glBindTexture.\r\nTEXTURE_BINDING_2D_MULTISAMPLE = GL_TEXTURE_BINDING_2D_MULTISAMPLE,\r\n// returns a single value, the name of the texture currently bound to the target GL_TEXTURE_2D_MULTISAMPLE_ARRAY. The initial value is 0. See glBindTexture.\r\nTEXTURE_BINDING_2D_MULTISAMPLE_ARRAY = GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY,\r\n// returns a single value, the name of the texture currently bound to the target GL_TEXTURE_3D. The initial value is 0. See glBindTexture.\r\nTEXTURE_BINDING_3D = GL_TEXTURE_BINDING_3D,\r\n// returns a single value, the name of the texture currently bound to the target GL_TEXTURE_BUFFER. The initial value is 0. See glBindTexture.\r\nTEXTURE_BINDING_BUFFER = GL_TEXTURE_BINDING_BUFFER,\r\n// returns a single value, the name of the texture currently bound to the target GL_TEXTURE_CUBE_MAP. The initial value is 0. See glBindTexture.\r\nTEXTURE_BINDING_CUBE_MAP = GL_TEXTURE_BINDING_CUBE_MAP,\r\n// returns a single value, the name of the texture currently bound to the target GL_TEXTURE_RECTANGLE. The initial value is 0. See glBindTexture.\r\nTEXTURE_BINDING_RECTANGLE = GL_TEXTURE_BINDING_RECTANGLE,\r\n// returns a single value indicating the mode of the texture compression hint. The initial value is GL_DONT_CARE.\r\nTEXTURE_COMPRESSION_HINT = GL_TEXTURE_COMPRESSION_HINT,\r\n// returns a single value, the name of the buffer object currently bound to the GL_TEXTURE_BUFFER buffer binding point. The initial value is 0. See glBindBuffer.\r\nTEXTURE_BINDING_BUFFER = GL_TEXTURE_BINDING_BUFFER,\r\n// returns a single value, the minimum required alignment for texture buffer sizes and offset. The initial value is 1. See glUniformBlockBinding.\r\nTEXTURE_BUFFER_OFFSET_ALIGNMENT = GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT,\r\n// returns a single value, the 64-bit value of the current GL time. See glQueryCounter.\r\nTIMESTAMP = GL_TIMESTAMP,\r\n// When used with non-indexed variants of glGet (such as glGetIntegerv), returns a single value, the name of the buffer object currently bound to the target GL_TRANSFORM_FEEDBACK_BUFFER. If no buffer object is bound to this target, 0 is returned. When used with indexed variants of glGet (such as glGetIntegeri_v), returns a single value, the name of the buffer object bound to the indexed transform feedback attribute stream. The initial value is 0 for all targets. See glBindBuffer, glBindBufferBase, and glBindBufferRange.\r\nTRANSFORM_FEEDBACK_BUFFER_BINDING = GL_TRANSFORM_FEEDBACK_BUFFER_BINDING,\r\n// When used with indexed variants of glGet (such as glGetInteger64i_v), returns a single value, the start offset of the binding range for each transform feedback attribute stream. The initial value is 0 for all streams. See glBindBufferRange.\r\nTRANSFORM_FEEDBACK_BUFFER_START = GL_TRANSFORM_FEEDBACK_BUFFER_START,\r\n// When used with indexed variants of glGet (such as glGetInteger64i_v), returns a single value, the size of the binding range for each transform feedback attribute stream. The initial value is 0 for all streams. See glBindBufferRange.\r\nTRANSFORM_FEEDBACK_BUFFER_SIZE = GL_TRANSFORM_FEEDBACK_BUFFER_SIZE,\r\n// When used with non-indexed variants of glGet (such as glGetIntegerv), returns a single value, the name of the buffer object currently bound to the target GL_UNIFORM_BUFFER. If no buffer object is bound to this target, 0 is returned. When used with indexed variants of glGet (such as glGetIntegeri_v), returns a single value, the name of the buffer object bound to the indexed uniform buffer binding point. The initial value is 0 for all targets. See glBindBuffer, glBindBufferBase, and glBindBufferRange.\r\nUNIFORM_BUFFER_BINDING = GL_UNIFORM_BUFFER_BINDING,\r\n// returns a single value, the minimum required alignment for uniform buffer sizes and offset. The initial value is 1. See glUniformBlockBinding.\r\nUNIFORM_BUFFER_OFFSET_ALIGNMENT = GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT,\r\n// When used with indexed variants of glGet (such as glGetInteger64i_v), returns a single value, the size of the binding range for each indexed uniform buffer binding. The initial value is 0 for all bindings. See glBindBufferRange.\r\nUNIFORM_BUFFER_SIZE = GL_UNIFORM_BUFFER_SIZE,\r\n// When used with indexed variants of glGet (such as glGetInteger64i_v), returns a single value, the start offset of the binding range for each indexed uniform buffer binding. The initial value is 0 for all bindings. See glBindBufferRange.\r\nUNIFORM_BUFFER_START = GL_UNIFORM_BUFFER_START,\r\n// returns one value, the byte alignment used for reading pixel from memory. The initial value is 4. See glPixelStore.\r\nUNPACK_ALIGNMENT = GL_UNPACK_ALIGNMENT,\r\n// returns one value, the image height used for reading pixel from memory. The initial is 0. See glPixelStore.\r\nUNPACK_IMAGE_HEIGHT = GL_UNPACK_IMAGE_HEIGHT,\r\n// returns a single boolean value indicating whether single-bit pixels being read from memory are read first from the least significant bit of each unsigned byte. The initial value is GL_FALSE. See glPixelStore.\r\nUNPACK_LSB_FIRST = GL_UNPACK_LSB_FIRST,\r\n// returns one value, the row length used for reading pixel from memory. The initial value is 0. See glPixelStore.\r\nUNPACK_ROW_LENGTH = GL_UNPACK_ROW_LENGTH,\r\n// returns one value, the number of pixel images skipped before the first pixel is read from memory. The initial value is 0. See glPixelStore.\r\nUNPACK_SKIP_IMAGES = GL_UNPACK_SKIP_IMAGES,\r\n// returns one value, the number of pixel locations skipped before the first pixel is read from memory. The initial value is 0. See glPixelStore.\r\nUNPACK_SKIP_PIXELS = GL_UNPACK_SKIP_PIXELS,\r\n// returns one value, the number of rows of pixel locations skipped before the first pixel is read from memory. The initial value is 0. See glPixelStore.\r\nUNPACK_SKIP_ROWS = GL_UNPACK_SKIP_ROWS,\r\n// returns a single boolean value indicating whether the bytes of two-byte and four-byte pixel indices and components are swapped after being read from memory. The initial value is GL_FALSE. See glPixelStore.\r\nUNPACK_SWAP_BYTES = GL_UNPACK_SWAP_BYTES,\r\n// returns a single value, the name of the vertex array object currently bound to the context. If no vertex array object is bound to the context, 0 is returned. The initial value is 0. See glBindVertexArray.\r\nVERTEX_ARRAY_BINDING = GL_VERTEX_ARRAY_BINDING,\r\n// Accepted by the indexed forms. returns a single integer value representing the instance step divisor of the first element in the bound buffer's store for vertex attribute bound to index.\r\nVERTEX_BINDING_DIVISOR = GL_VERTEX_BINDING_DIVISOR,\r\n// Accepted by the indexed forms. returns a single integer value representing the byte offset of the first element in the bound buffer's store for vertex attribute bound to index.\r\nVERTEX_BINDING_OFFSET = GL_VERTEX_BINDING_OFFSET,\r\n// Accepted by the indexed forms. returns a single integer value representing the byte offset between the start of each element in the bound buffer's store for vertex attribute bound to index.\r\nVERTEX_BINDING_STRIDE = GL_VERTEX_BINDING_STRIDE,\r\n// returns a single integer value containing the maximum offset that may be added to a vertex binding offset.\r\nMAX_VERTEX_ATTRIB_RELATIVE_OFFSET = GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET,\r\n// returns a single integer value containing the maximum number of vertex buffers that may be bound.\r\nMAX_VERTEX_ATTRIB_BINDINGS = GL_MAX_VERTEX_ATTRIB_BINDINGS,\r\n// When used with non-indexed variants of glGet (such as glGetIntegerv), returns four values: the x and y window coordinates of the viewport, followed by its width and height. Initially the x and y window coordinates are both set to 0, and the width and height are set to the width and height of the window into which the GL will do its rendering. See glViewport. When used with indexed variants of glGet (such as glGetIntegeri_v), returns four values: the x and y window coordinates of the indexed viewport, followed by its width and height. Initially the x and y window coordinates are both set to 0, and the width and height are set to the width and height of the window into which the GL will do its rendering. See glViewportIndexedf.\r\nVIEWPORT = GL_VIEWPORT,\r\n// returns two values, the minimum and maximum viewport bounds range. The minimum range should be at least [-32768, 32767].\r\nVIEWPORT_BOUNDS_RANGE = GL_VIEWPORT_BOUNDS_RANGE,\r\n// returns one value, the implementation dependent specifc vertex of a primitive that is used to select the viewport index. If the value returned is equivalent to GL_PROVOKING_VERTEX, then the vertex selection follows the convention specified by glProvokingVertex. If the value returned is equivalent to GL_FIRST_VERTEX_CONVENTION, then the selection is always taken from the first vertex in the primitive. If the value returned is equivalent to GL_LAST_VERTEX_CONVENTION, then the selection is always taken from the last vertex in the primitive. If the value returned is equivalent to GL_UNDEFINED_VERTEX, then the selection is not guaranteed to be taken from any specific vertex in the primitive.\r\nVIEWPORT_INDEX_PROVOKING_VERTEX = GL_VIEWPORT_INDEX_PROVOKING_VERTEX,\r\n// returns a single value, the number of bits of sub-pixel precision which the GL uses to interpret the floating point viewport bounds. The minimum value is 0.\r\nVIEWPORT_SUBPIXEL_BITS = GL_VIEWPORT_SUBPIXEL_BITS,\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/graphics/ParamName4.txt",
    "content": "GL_ACTIVE_TEXTURE\r\ndata returns a single value indicating the active multitexture unit. The initial value is GL_TEXTURE0. See glActiveTexture.\r\n\r\nGL_ALIASED_LINE_WIDTH_RANGE\r\ndata returns a pair of values indicating the range of widths supported for aliased lines. See glLineWidth.\r\n\r\nGL_ARRAY_BUFFER_BINDING\r\ndata returns a single value, the name of the buffer object currently bound to the target GL_ARRAY_BUFFER. If no buffer object is bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\n\r\nGL_BLEND\r\ndata returns a single boolean value indicating whether blending is enabled. The initial value is GL_FALSE. See glBlendFunc.\r\n\r\nGL_BLEND_COLOR\r\ndata returns four values, the red, green, blue, and alpha values which are the components of the blend color. See glBlendColor.\r\n\r\nGL_BLEND_DST_ALPHA\r\ndata returns one value, the symbolic constant identifying the alpha destination blend function. The initial value is GL_ZERO. See glBlendFunc and glBlendFuncSeparate.\r\n\r\nGL_BLEND_DST_RGB\r\ndata returns one value, the symbolic constant identifying the RGB destination blend function. The initial value is GL_ZERO. See glBlendFunc and glBlendFuncSeparate.\r\n\r\nGL_BLEND_EQUATION_RGB\r\ndata returns one value, a symbolic constant indicating whether the RGB blend equation is GL_FUNC_ADD, GL_FUNC_SUBTRACT, GL_FUNC_REVERSE_SUBTRACT, GL_MIN or GL_MAX. See glBlendEquationSeparate.\r\n\r\nGL_BLEND_EQUATION_ALPHA\r\ndata returns one value, a symbolic constant indicating whether the Alpha blend equation is GL_FUNC_ADD, GL_FUNC_SUBTRACT, GL_FUNC_REVERSE_SUBTRACT, GL_MIN or GL_MAX. See glBlendEquationSeparate.\r\n\r\nGL_BLEND_SRC_ALPHA\r\ndata returns one value, the symbolic constant identifying the alpha source blend function. The initial value is GL_ONE. See glBlendFunc and glBlendFuncSeparate.\r\n\r\nGL_BLEND_SRC_RGB\r\ndata returns one value, the symbolic constant identifying the RGB source blend function. The initial value is GL_ONE. See glBlendFunc and glBlendFuncSeparate.\r\n\r\nGL_COLOR_CLEAR_VALUE\r\ndata returns four values: the red, green, blue, and alpha values used to clear the color buffers. Integer values, if requested, are linearly mapped from the internal floating-point representation such that 1.0 returns the most positive representable integer value, and -1.0 returns the most negative representable integer value. The initial value is (0, 0, 0, 0). See glClearColor.\r\n\r\nGL_COLOR_LOGIC_OP\r\ndata returns a single boolean value indicating whether a fragment's RGBA color values are merged into the framebuffer using a logical operation. The initial value is GL_FALSE. See glLogicOp.\r\n\r\nGL_COLOR_WRITEMASK\r\ndata returns four boolean values: the red, green, blue, and alpha write enables for the color buffers. The initial value is (GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE). See glColorMask.\r\n\r\nGL_COMPRESSED_TEXTURE_FORMATS\r\ndata returns a list of symbolic constants of length GL_NUM_COMPRESSED_TEXTURE_FORMATS indicating which compressed texture formats are available. See glCompressedTexImage2D.\r\n\r\nGL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS\r\ndata returns one value, the maximum number of active shader storage blocks that may be accessed by a compute shader.\r\n\r\nGL_MAX_COMBINED_SHADER_STORAGE_BLOCKS\r\ndata returns one value, the maximum total number of active shader storage blocks that may be accessed by all active shaders.\r\n\r\nGL_MAX_COMPUTE_UNIFORM_BLOCKS\r\ndata returns one value, the maximum number of uniform blocks per compute shader. The value must be at least 14. See glUniformBlockBinding.\r\n\r\nGL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS\r\ndata returns one value, the maximum supported texture image units that can be used to access texture maps from the compute shader. The value may be at least 16. See glActiveTexture.\r\n\r\nGL_MAX_COMPUTE_UNIFORM_COMPONENTS\r\ndata returns one value, the maximum number of individual floating-point, integer, or boolean values that can be held in uniform variable storage for a compute shader. The value must be at least 1024. See glUniform.\r\n\r\nGL_MAX_COMPUTE_ATOMIC_COUNTERS\r\ndata returns a single value, the maximum number of atomic counters available to compute shaders.\r\n\r\nGL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS\r\ndata returns a single value, the maximum number of atomic counter buffers that may be accessed by a compute shader.\r\n\r\nGL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS\r\ndata returns one value, the number of words for compute shader uniform variables in all uniform blocks (including default). The value must be at least 1. See glUniform.\r\n\r\nGL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS\r\ndata returns one value, the number of invocations in a single local work group (i.e., the product of the three dimensions) that may be dispatched to a compute shader.\r\n\r\nGL_MAX_COMPUTE_WORK_GROUP_COUNT\r\nAccepted by the indexed versions of glGet. data the maximum number of work groups that may be dispatched to a compute shader. Indices 0, 1, and 2 correspond to the X, Y and Z dimensions, respectively.\r\n\r\nGL_MAX_COMPUTE_WORK_GROUP_SIZE\r\nAccepted by the indexed versions of glGet. data the maximum size of a work groups that may be used during compilation of a compute shader. Indices 0, 1, and 2 correspond to the X, Y and Z dimensions, respectively.\r\n\r\nGL_DISPATCH_INDIRECT_BUFFER_BINDING\r\ndata returns a single value, the name of the buffer object currently bound to the target GL_DISPATCH_INDIRECT_BUFFER. If no buffer object is bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\n\r\nGL_MAX_DEBUG_GROUP_STACK_DEPTH\r\ndata returns a single value, the maximum depth of the debug message group stack.\r\n\r\nGL_DEBUG_GROUP_STACK_DEPTH\r\ndata returns a single value, the current depth of the debug message group stack.\r\n\r\nGL_CONTEXT_FLAGS\r\ndata returns one value, the flags with which the context was created (such as debugging functionality).\r\n\r\nGL_CULL_FACE\r\ndata returns a single boolean value indicating whether polygon culling is enabled. The initial value is GL_FALSE. See glCullFace.\r\n\r\nGL_CURRENT_PROGRAM\r\ndata returns one value, the name of the program object that is currently active, or 0 if no program object is active. See glUseProgram.\r\n\r\nGL_DEPTH_CLEAR_VALUE\r\ndata returns one value, the value that is used to clear the depth buffer. Integer values, if requested, are linearly mapped from the internal floating-point representation such that 1.0 returns the most positive representable integer value, and -1.0 returns the most negative representable integer value. The initial value is 1. See glClearDepth.\r\n\r\nGL_DEPTH_FUNC\r\ndata returns one value, the symbolic constant that indicates the depth comparison function. The initial value is GL_LESS. See glDepthFunc.\r\n\r\nGL_DEPTH_RANGE\r\ndata returns two values: the near and far mapping limits for the depth buffer. Integer values, if requested, are linearly mapped from the internal floating-point representation such that 1.0 returns the most positive representable integer value, and -1.0 returns the most negative representable integer value. The initial value is (0, 1). See glDepthRange.\r\n\r\nGL_DEPTH_TEST\r\ndata returns a single boolean value indicating whether depth testing of fragments is enabled. The initial value is GL_FALSE. See glDepthFunc and glDepthRange.\r\n\r\nGL_DEPTH_WRITEMASK\r\ndata returns a single boolean value indicating if the depth buffer is enabled for writing. The initial value is GL_TRUE. See glDepthMask.\r\n\r\nGL_DITHER\r\ndata returns a single boolean value indicating whether dithering of fragment colors and indices is enabled. The initial value is GL_TRUE.\r\n\r\nGL_DOUBLEBUFFER\r\ndata returns a single boolean value indicating whether double buffering is supported.\r\n\r\nGL_DRAW_BUFFER\r\ndata returns one value, a symbolic constant indicating which buffers are being drawn to. See glDrawBuffer. The initial value is GL_BACK if there are back buffers, otherwise it is GL_FRONT.\r\n\r\nGL_DRAW_BUFFER i\r\ndata returns one value, a symbolic constant indicating which buffers are being drawn to by the corresponding output color. See glDrawBuffers. The initial value of GL_DRAW_BUFFER0 is GL_BACK if there are back buffers, otherwise it is GL_FRONT. The initial values of draw buffers for all other output colors is GL_NONE.\r\n\r\nGL_DRAW_FRAMEBUFFER_BINDING\r\ndata returns one value, the name of the framebuffer object currently bound to the GL_DRAW_FRAMEBUFFER target. If the default framebuffer is bound, this value will be zero. The initial value is zero. See glBindFramebuffer.\r\n\r\nGL_READ_FRAMEBUFFER_BINDING\r\ndata returns one value, the name of the framebuffer object currently bound to the GL_READ_FRAMEBUFFER target. If the default framebuffer is bound, this value will be zero. The initial value is zero. See glBindFramebuffer.\r\n\r\nGL_ELEMENT_ARRAY_BUFFER_BINDING\r\ndata returns a single value, the name of the buffer object currently bound to the target GL_ELEMENT_ARRAY_BUFFER. If no buffer object is bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\n\r\nGL_FRAGMENT_SHADER_DERIVATIVE_HINT\r\ndata returns one value, a symbolic constant indicating the mode of the derivative accuracy hint for fragment shaders. The initial value is GL_DONT_CARE. See glHint.\r\n\r\nGL_IMPLEMENTATION_COLOR_READ_FORMAT\r\ndata returns a single GLenum value indicating the implementation's preferred pixel data format. See glReadPixels.\r\n\r\nGL_IMPLEMENTATION_COLOR_READ_TYPE\r\ndata returns a single GLenum value indicating the implementation's preferred pixel data type. See glReadPixels.\r\n\r\nGL_LINE_SMOOTH\r\ndata returns a single boolean value indicating whether antialiasing of lines is enabled. The initial value is GL_FALSE. See glLineWidth.\r\n\r\nGL_LINE_SMOOTH_HINT\r\ndata returns one value, a symbolic constant indicating the mode of the line antialiasing hint. The initial value is GL_DONT_CARE. See glHint.\r\n\r\nGL_LINE_WIDTH\r\ndata returns one value, the line width as specified with glLineWidth. The initial value is 1.\r\n\r\nGL_LAYER_PROVOKING_VERTEX\r\ndata returns one value, the implementation dependent specifc vertex of a primitive that is used to select the rendering layer. If the value returned is equivalent to GL_PROVOKING_VERTEX, then the vertex selection follows the convention specified by glProvokingVertex. If the value returned is equivalent to GL_FIRST_VERTEX_CONVENTION, then the selection is always taken from the first vertex in the primitive. If the value returned is equivalent to GL_LAST_VERTEX_CONVENTION, then the selection is always taken from the last vertex in the primitive. If the value returned is equivalent to GL_UNDEFINED_VERTEX, then the selection is not guaranteed to be taken from any specific vertex in the primitive.\r\n\r\nGL_LOGIC_OP_MODE\r\ndata returns one value, a symbolic constant indicating the selected logic operation mode. The initial value is GL_COPY. See glLogicOp.\r\n\r\nGL_MAJOR_VERSION\r\ndata returns one value, the major version number of the OpenGL API supported by the current context.\r\n\r\nGL_MAX_3D_TEXTURE_SIZE\r\ndata returns one value, a rough estimate of the largest 3D texture that the GL can handle. The value must be at least 64. Use GL_PROXY_TEXTURE_3D to determine if a texture is too large. See glTexImage3D.\r\n\r\nGL_MAX_ARRAY_TEXTURE_LAYERS\r\ndata returns one value. The value indicates the maximum number of layers allowed in an array texture, and must be at least 256. See glTexImage2D.\r\n\r\nGL_MAX_CLIP_DISTANCES\r\ndata returns one value, the maximum number of application-defined clipping distances. The value must be at least 8.\r\n\r\nGL_MAX_COLOR_TEXTURE_SAMPLES\r\ndata returns one value, the maximum number of samples in a color multisample texture.\r\n\r\nGL_MAX_COMBINED_ATOMIC_COUNTERS\r\ndata returns a single value, the maximum number of atomic counters available to all active shaders.\r\n\r\nGL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS\r\ndata returns one value, the number of words for fragment shader uniform variables in all uniform blocks (including default). The value must be at least 1. See glUniform.\r\n\r\nGL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS\r\ndata returns one value, the number of words for geometry shader uniform variables in all uniform blocks (including default). The value must be at least 1. See glUniform.\r\n\r\nGL_MAX_COMBINED_TEXTURE_IMAGE_UNITS\r\ndata returns one value, the maximum supported texture image units that can be used to access texture maps from the vertex shader and the fragment processor combined. If both the vertex shader and the fragment processing stage access the same texture image unit, then that counts as using two texture image units against this limit. The value must be at least 48. See glActiveTexture.\r\n\r\nGL_MAX_COMBINED_UNIFORM_BLOCKS\r\ndata returns one value, the maximum number of uniform blocks per program. The value must be at least 70. See glUniformBlockBinding.\r\n\r\nGL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS\r\ndata returns one value, the number of words for vertex shader uniform variables in all uniform blocks (including default). The value must be at least 1. See glUniform.\r\n\r\nGL_MAX_CUBE_MAP_TEXTURE_SIZE\r\ndata returns one value. The value gives a rough estimate of the largest cube-map texture that the GL can handle. The value must be at least 1024. Use GL_PROXY_TEXTURE_CUBE_MAP to determine if a texture is too large. See glTexImage2D.\r\n\r\nGL_MAX_DEPTH_TEXTURE_SAMPLES\r\ndata returns one value, the maximum number of samples in a multisample depth or depth-stencil texture.\r\n\r\nGL_MAX_DRAW_BUFFERS\r\ndata returns one value, the maximum number of simultaneous outputs that may be written in a fragment shader. The value must be at least 8. See glDrawBuffers.\r\n\r\nGL_MAX_DUAL_SOURCE_DRAW_BUFFERS\r\ndata returns one value, the maximum number of active draw buffers when using dual-source blending. The value must be at least 1. See glBlendFunc and glBlendFuncSeparate.\r\n\r\nGL_MAX_ELEMENTS_INDICES\r\ndata returns one value, the recommended maximum number of vertex array indices. See glDrawRangeElements.\r\n\r\nGL_MAX_ELEMENTS_VERTICES\r\ndata returns one value, the recommended maximum number of vertex array vertices. See glDrawRangeElements.\r\n\r\nGL_MAX_FRAGMENT_ATOMIC_COUNTERS\r\ndata returns a single value, the maximum number of atomic counters available to fragment shaders.\r\n\r\nGL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS\r\ndata returns one value, the maximum number of active shader storage blocks that may be accessed by a fragment shader.\r\n\r\nGL_MAX_FRAGMENT_INPUT_COMPONENTS\r\ndata returns one value, the maximum number of components of the inputs read by the fragment shader, which must be at least 128.\r\n\r\nGL_MAX_FRAGMENT_UNIFORM_COMPONENTS\r\ndata returns one value, the maximum number of individual floating-point, integer, or boolean values that can be held in uniform variable storage for a fragment shader. The value must be at least 1024. See glUniform.\r\n\r\nGL_MAX_FRAGMENT_UNIFORM_VECTORS\r\ndata returns one value, the maximum number of individual 4-vectors of floating-point, integer, or boolean values that can be held in uniform variable storage for a fragment shader. The value is equal to the value of GL_MAX_FRAGMENT_UNIFORM_COMPONENTS divided by 4 and must be at least 256. See glUniform.\r\n\r\nGL_MAX_FRAGMENT_UNIFORM_BLOCKS\r\ndata returns one value, the maximum number of uniform blocks per fragment shader. The value must be at least 12. See glUniformBlockBinding.\r\n\r\nGL_MAX_FRAMEBUFFER_WIDTH\r\ndata returns one value, the maximum width for a framebuffer that has no attachments, which must be at least 16384. See glFramebufferParameter.\r\n\r\nGL_MAX_FRAMEBUFFER_HEIGHT\r\ndata returns one value, the maximum height for a framebuffer that has no attachments, which must be at least 16384. See glFramebufferParameter.\r\n\r\nGL_MAX_FRAMEBUFFER_LAYERS\r\ndata returns one value, the maximum number of layers for a framebuffer that has no attachments, which must be at least 2048. See glFramebufferParameter.\r\n\r\nGL_MAX_FRAMEBUFFER_SAMPLES\r\ndata returns one value, the maximum samples in a framebuffer that has no attachments, which must be at least 4. See glFramebufferParameter.\r\n\r\nGL_MAX_GEOMETRY_ATOMIC_COUNTERS\r\ndata returns a single value, the maximum number of atomic counters available to geometry shaders.\r\n\r\nGL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS\r\ndata returns one value, the maximum number of active shader storage blocks that may be accessed by a geometry shader.\r\n\r\nGL_MAX_GEOMETRY_INPUT_COMPONENTS\r\ndata returns one value, the maximum number of components of inputs read by a geometry shader, which must be at least 64.\r\n\r\nGL_MAX_GEOMETRY_OUTPUT_COMPONENTS\r\ndata returns one value, the maximum number of components of outputs written by a geometry shader, which must be at least 128.\r\n\r\nGL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS\r\ndata returns one value, the maximum supported texture image units that can be used to access texture maps from the geometry shader. The value must be at least 16. See glActiveTexture.\r\n\r\nGL_MAX_GEOMETRY_UNIFORM_BLOCKS\r\ndata returns one value, the maximum number of uniform blocks per geometry shader. The value must be at least 12. See glUniformBlockBinding.\r\n\r\nGL_MAX_GEOMETRY_UNIFORM_COMPONENTS\r\ndata returns one value, the maximum number of individual floating-point, integer, or boolean values that can be held in uniform variable storage for a geometry shader. The value must be at least 1024. See glUniform.\r\n\r\nGL_MAX_INTEGER_SAMPLES\r\ndata returns one value, the maximum number of samples supported in integer format multisample buffers.\r\n\r\nGL_MIN_MAP_BUFFER_ALIGNMENT\r\ndata returns one value, the minimum alignment in basic machine units of pointers returned fromglMapBuffer and glMapBufferRange. This value must be a power of two and must be at least 64.\r\n\r\nGL_MAX_LABEL_LENGTH\r\ndata returns one value, the maximum length of a label that may be assigned to an object. See glObjectLabel and glObjectPtrLabel.\r\n\r\nGL_MAX_PROGRAM_TEXEL_OFFSET\r\ndata returns one value, the maximum texel offset allowed in a texture lookup, which must be at least 7.\r\n\r\nGL_MIN_PROGRAM_TEXEL_OFFSET\r\ndata returns one value, the minimum texel offset allowed in a texture lookup, which must be at most -8.\r\n\r\nGL_MAX_RECTANGLE_TEXTURE_SIZE\r\ndata returns one value. The value gives a rough estimate of the largest rectangular texture that the GL can handle. The value must be at least 1024. Use GL_PROXY_TEXTURE_RECTANGLE to determine if a texture is too large. See glTexImage2D.\r\n\r\nGL_MAX_RENDERBUFFER_SIZE\r\ndata returns one value. The value indicates the maximum supported size for renderbuffers. See glFramebufferRenderbuffer.\r\n\r\nGL_MAX_SAMPLE_MASK_WORDS\r\ndata returns one value, the maximum number of sample mask words.\r\n\r\nGL_MAX_SERVER_WAIT_TIMEOUT\r\ndata returns one value, the maximum glWaitSync timeout interval.\r\n\r\nGL_MAX_SHADER_STORAGE_BUFFER_BINDINGS\r\ndata returns one value, the maximum number of shader storage buffer binding points on the context, which must be at least 8.\r\n\r\nGL_MAX_TESS_CONTROL_ATOMIC_COUNTERS\r\ndata returns a single value, the maximum number of atomic counters available to tessellation control shaders.\r\n\r\nGL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS\r\ndata returns a single value, the maximum number of atomic counters available to tessellation evaluation shaders.\r\n\r\nGL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS\r\ndata returns one value, the maximum number of active shader storage blocks that may be accessed by a tessellation control shader.\r\n\r\nGL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS\r\ndata returns one value, the maximum number of active shader storage blocks that may be accessed by a tessellation evaluation shader.\r\n\r\nGL_MAX_TEXTURE_BUFFER_SIZE\r\ndata returns one value. The value gives the maximum number of texels allowed in the texel array of a texture buffer object. Value must be at least 65536.\r\n\r\nGL_MAX_TEXTURE_IMAGE_UNITS\r\ndata returns one value, the maximum supported texture image units that can be used to access texture maps from the fragment shader. The value must be at least 16. See glActiveTexture.\r\n\r\nGL_MAX_TEXTURE_LOD_BIAS\r\ndata returns one value, the maximum, absolute value of the texture level-of-detail bias. The value must be at least 2.0.\r\n\r\nGL_MAX_TEXTURE_SIZE\r\ndata returns one value. The value gives a rough estimate of the largest texture that the GL can handle. The value must be at least 1024. Use a proxy texture target such as GL_PROXY_TEXTURE_1D or GL_PROXY_TEXTURE_2D to determine if a texture is too large. See glTexImage1D and glTexImage2D.\r\n\r\nGL_MAX_UNIFORM_BUFFER_BINDINGS\r\ndata returns one value, the maximum number of uniform buffer binding points on the context, which must be at least 36.\r\n\r\nGL_MAX_UNIFORM_BLOCK_SIZE\r\ndata returns one value, the maximum size in basic machine units of a uniform block, which must be at least 16384.\r\n\r\nGL_MAX_UNIFORM_LOCATIONS\r\ndata returns one value, the maximum number of explicitly assignable uniform locations, which must be at least 1024.\r\n\r\nGL_MAX_VARYING_COMPONENTS\r\ndata returns one value, the number components for varying variables, which must be at least 60.\r\n\r\nGL_MAX_VARYING_VECTORS\r\ndata returns one value, the number 4-vectors for varying variables, which is equal to the value of GL_MAX_VARYING_COMPONENTS and must be at least 15.\r\n\r\nGL_MAX_VARYING_FLOATS\r\ndata returns one value, the maximum number of interpolators available for processing varying variables used by vertex and fragment shaders. This value represents the number of individual floating-point values that can be interpolated; varying variables declared as vectors, matrices, and arrays will all consume multiple interpolators. The value must be at least 32.\r\n\r\nGL_MAX_VERTEX_ATOMIC_COUNTERS\r\ndata returns a single value, the maximum number of atomic counters available to vertex shaders.\r\n\r\nGL_MAX_VERTEX_ATTRIBS\r\ndata returns one value, the maximum number of 4-component generic vertex attributes accessible to a vertex shader. The value must be at least 16. See glVertexAttrib.\r\n\r\nGL_MAX_VERTEX_SHADER_STORAGE_BLOCKS\r\ndata returns one value, the maximum number of active shader storage blocks that may be accessed by a vertex shader.\r\n\r\nGL_MAX_VERTEX_TEXTURE_IMAGE_UNITS\r\ndata returns one value, the maximum supported texture image units that can be used to access texture maps from the vertex shader. The value may be at least 16. See glActiveTexture.\r\n\r\nGL_MAX_VERTEX_UNIFORM_COMPONENTS\r\ndata returns one value, the maximum number of individual floating-point, integer, or boolean values that can be held in uniform variable storage for a vertex shader. The value must be at least 1024. See glUniform.\r\n\r\nGL_MAX_VERTEX_UNIFORM_VECTORS\r\ndata returns one value, the maximum number of 4-vectors that may be held in uniform variable storage for the vertex shader. The value of GL_MAX_VERTEX_UNIFORM_VECTORS is equal to the value of GL_MAX_VERTEX_UNIFORM_COMPONENTS and must be at least 256.\r\n\r\nGL_MAX_VERTEX_OUTPUT_COMPONENTS\r\ndata returns one value, the maximum number of components of output written by a vertex shader, which must be at least 64.\r\n\r\nGL_MAX_VERTEX_UNIFORM_BLOCKS\r\ndata returns one value, the maximum number of uniform blocks per vertex shader. The value must be at least 12. See glUniformBlockBinding.\r\n\r\nGL_MAX_VIEWPORT_DIMS\r\ndata returns two values: the maximum supported width and height of the viewport. These must be at least as large as the visible dimensions of the display being rendered to. See glViewport.\r\n\r\nGL_MAX_VIEWPORTS\r\ndata returns one value, the maximum number of simultaneous viewports that are supported. The value must be at least 16. See glViewportIndexed.\r\n\r\nGL_MINOR_VERSION\r\ndata returns one value, the minor version number of the OpenGL API supported by the current context.\r\n\r\nGL_NUM_COMPRESSED_TEXTURE_FORMATS\r\ndata returns a single integer value indicating the number of available compressed texture formats. The minimum value is 4. See glCompressedTexImage2D.\r\n\r\nGL_NUM_EXTENSIONS\r\ndata returns one value, the number of extensions supported by the GL implementation for the current context. See glGetString.\r\n\r\nGL_NUM_PROGRAM_BINARY_FORMATS\r\ndata returns one value, the number of program binary formats supported by the implementation.\r\n\r\nGL_NUM_SHADER_BINARY_FORMATS\r\ndata returns one value, the number of binary shader formats supported by the implementation. If this value is greater than zero, then the implementation supports loading binary shaders. If it is zero, then the loading of binary shaders by the implementation is not supported.\r\n\r\nGL_PACK_ALIGNMENT\r\ndata returns one value, the byte alignment used for writing pixel data to memory. The initial value is 4. See glPixelStore.\r\n\r\nGL_PACK_IMAGE_HEIGHT\r\ndata returns one value, the image height used for writing pixel data to memory. The initial value is 0. See glPixelStore.\r\n\r\nGL_PACK_LSB_FIRST\r\ndata returns a single boolean value indicating whether single-bit pixels being written to memory are written first to the least significant bit of each unsigned byte. The initial value is GL_FALSE. See glPixelStore.\r\n\r\nGL_PACK_ROW_LENGTH\r\ndata returns one value, the row length used for writing pixel data to memory. The initial value is 0. See glPixelStore.\r\n\r\nGL_PACK_SKIP_IMAGES\r\ndata returns one value, the number of pixel images skipped before the first pixel is written into memory. The initial value is 0. See glPixelStore.\r\n\r\nGL_PACK_SKIP_PIXELS\r\ndata returns one value, the number of pixel locations skipped before the first pixel is written into memory. The initial value is 0. See glPixelStore.\r\n\r\nGL_PACK_SKIP_ROWS\r\ndata returns one value, the number of rows of pixel locations skipped before the first pixel is written into memory. The initial value is 0. See glPixelStore.\r\n\r\nGL_PACK_SWAP_BYTES\r\ndata returns a single boolean value indicating whether the bytes of two-byte and four-byte pixel indices and components are swapped before being written to memory. The initial value is GL_FALSE. See glPixelStore.\r\n\r\nGL_PIXEL_PACK_BUFFER_BINDING\r\ndata returns a single value, the name of the buffer object currently bound to the target GL_PIXEL_PACK_BUFFER. If no buffer object is bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\n\r\nGL_PIXEL_UNPACK_BUFFER_BINDING\r\ndata returns a single value, the name of the buffer object currently bound to the target GL_PIXEL_UNPACK_BUFFER. If no buffer object is bound to this target, 0 is returned. The initial value is 0. See glBindBuffer.\r\n\r\nGL_POINT_FADE_THRESHOLD_SIZE\r\ndata returns one value, the point size threshold for determining the point size. See glPointParameter.\r\n\r\nGL_PRIMITIVE_RESTART_INDEX\r\ndata returns one value, the current primitive restart index. The initial value is 0. See glPrimitiveRestartIndex.\r\n\r\nGL_PROGRAM_BINARY_FORMATS\r\ndata an array of GL_NUM_PROGRAM_BINARY_FORMATS values, indicating the proram binary formats supported by the implementation.\r\n\r\nGL_PROGRAM_PIPELINE_BINDING\r\ndata a single value, the name of the currently bound program pipeline object, or zero if no program pipeline object is bound. See glBindProgramPipeline.\r\n\r\nGL_PROGRAM_POINT_SIZE\r\ndata returns a single boolean value indicating whether vertex program point size mode is enabled. If enabled, then the point size is taken from the shader built-in gl_PointSize. If disabled, then the point size is taken from the point state as specified by glPointSize. The initial value is GL_FALSE.\r\n\r\nGL_PROVOKING_VERTEX\r\ndata returns one value, the currently selected provoking vertex convention. The initial value is GL_LAST_VERTEX_CONVENTION. See glProvokingVertex.\r\n\r\nGL_POINT_SIZE\r\ndata returns one value, the point size as specified by glPointSize. The initial value is 1.\r\n\r\nGL_POINT_SIZE_GRANULARITY\r\ndata returns one value, the size difference between adjacent supported sizes for antialiased points. See glPointSize.\r\n\r\nGL_POINT_SIZE_RANGE\r\ndata returns two values: the smallest and largest supported sizes for antialiased points. The smallest size must be at most 1, and the largest size must be at least 1. See glPointSize.\r\n\r\nGL_POLYGON_OFFSET_FACTOR\r\ndata returns one value, the scaling factor used to determine the variable offset that is added to the depth value of each fragment generated when a polygon is rasterized. The initial value is 0. See glPolygonOffset.\r\n\r\nGL_POLYGON_OFFSET_UNITS\r\ndata returns one value. This value is multiplied by an implementation-specific value and then added to the depth value of each fragment generated when a polygon is rasterized. The initial value is 0. See glPolygonOffset.\r\n\r\nGL_POLYGON_OFFSET_FILL\r\ndata returns a single boolean value indicating whether polygon offset is enabled for polygons in fill mode. The initial value is GL_FALSE. See glPolygonOffset.\r\n\r\nGL_POLYGON_OFFSET_LINE\r\ndata returns a single boolean value indicating whether polygon offset is enabled for polygons in line mode. The initial value is GL_FALSE. See glPolygonOffset.\r\n\r\nGL_POLYGON_OFFSET_POINT\r\ndata returns a single boolean value indicating whether polygon offset is enabled for polygons in point mode. The initial value is GL_FALSE. See glPolygonOffset.\r\n\r\nGL_POLYGON_SMOOTH\r\ndata returns a single boolean value indicating whether antialiasing of polygons is enabled. The initial value is GL_FALSE. See glPolygonMode.\r\n\r\nGL_POLYGON_SMOOTH_HINT\r\ndata returns one value, a symbolic constant indicating the mode of the polygon antialiasing hint. The initial value is GL_DONT_CARE. See glHint.\r\n\r\nGL_READ_BUFFER\r\ndata returns one value, a symbolic constant indicating which color buffer is selected for reading. The initial value is GL_BACK if there is a back buffer, otherwise it is GL_FRONT. See glReadPixels.\r\n\r\nGL_RENDERBUFFER_BINDING\r\ndata returns a single value, the name of the renderbuffer object currently bound to the target GL_RENDERBUFFER. If no renderbuffer object is bound to this target, 0 is returned. The initial value is 0. See glBindRenderbuffer.\r\n\r\nGL_SAMPLE_BUFFERS\r\ndata returns a single integer value indicating the number of sample buffers associated with the framebuffer. See glSampleCoverage.\r\n\r\nGL_SAMPLE_COVERAGE_VALUE\r\ndata returns a single positive floating-point value indicating the current sample coverage value. See glSampleCoverage.\r\n\r\nGL_SAMPLE_COVERAGE_INVERT\r\ndata returns a single boolean value indicating if the temporary coverage value should be inverted. See glSampleCoverage.\r\n\r\nGL_SAMPLER_BINDING\r\ndata returns a single value, the name of the sampler object currently bound to the active texture unit. The initial value is 0. See glBindSampler.\r\n\r\nGL_SAMPLES\r\ndata returns a single integer value indicating the coverage mask size. See glSampleCoverage.\r\n\r\nGL_SCISSOR_BOX\r\ndata returns four values: the x and y window coordinates of the scissor box, followed by its width and height. Initially the x and y window coordinates are both 0 and the width and height are set to the size of the window. See glScissor.\r\n\r\nGL_SCISSOR_TEST\r\ndata returns a single boolean value indicating whether scissoring is enabled. The initial value is GL_FALSE. See glScissor.\r\n\r\nGL_SHADER_COMPILER\r\ndata returns a single boolean value indicating whether an online shader compiler is present in the implementation. All desktop OpenGL implementations must support online shader compilations, and therefore the value of GL_SHADER_COMPILER will always be GL_TRUE.\r\n\r\nGL_SHADER_STORAGE_BUFFER_BINDING\r\nWhen used with non-indexed variants of glGet (such as glGetIntegerv), data returns a single value, the name of the buffer object currently bound to the target GL_SHADER_STORAGE_BUFFER. If no buffer object is bound to this target, 0 is returned. When used with indexed variants of glGet (such as glGetIntegeri_v), data returns a single value, the name of the buffer object bound to the indexed shader storage buffer binding points. The initial value is 0 for all targets. See glBindBuffer, glBindBufferBase, and glBindBufferRange.\r\n\r\nGL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT\r\ndata returns a single value, the minimum required alignment for shader storage buffer sizes and offset. The initial value is 1. See glShaderStorateBlockBinding.\r\n\r\nGL_SHADER_STORAGE_BUFFER_START\r\nWhen used with indexed variants of glGet (such as glGetInteger64i_v), data returns a single value, the start offset of the binding range for each indexed shader storage buffer binding. The initial value is 0 for all bindings. See glBindBufferRange.\r\n\r\nGL_SHADER_STORAGE_BUFFER_SIZE\r\nWhen used with indexed variants of glGet (such as glGetInteger64i_v), data returns a single value, the size of the binding range for each indexed shader storage buffer binding. The initial value is 0 for all bindings. See glBindBufferRange.\r\n\r\nGL_SMOOTH_LINE_WIDTH_RANGE\r\ndata returns a pair of values indicating the range of widths supported for smooth (antialiased) lines. See glLineWidth.\r\n\r\nGL_SMOOTH_LINE_WIDTH_GRANULARITY\r\ndata returns a single value indicating the level of quantization applied to smooth line width parameters.\r\n\r\nGL_STENCIL_BACK_FAIL\r\ndata returns one value, a symbolic constant indicating what action is taken for back-facing polygons when the stencil test fails. The initial value is GL_KEEP. See glStencilOpSeparate.\r\n\r\nGL_STENCIL_BACK_FUNC\r\ndata returns one value, a symbolic constant indicating what function is used for back-facing polygons to compare the stencil reference value with the stencil buffer value. The initial value is GL_ALWAYS. See glStencilFuncSeparate.\r\n\r\nGL_STENCIL_BACK_PASS_DEPTH_FAIL\r\ndata returns one value, a symbolic constant indicating what action is taken for back-facing polygons when the stencil test passes, but the depth test fails. The initial value is GL_KEEP. See glStencilOpSeparate.\r\n\r\nGL_STENCIL_BACK_PASS_DEPTH_PASS\r\ndata returns one value, a symbolic constant indicating what action is taken for back-facing polygons when the stencil test passes and the depth test passes. The initial value is GL_KEEP. See glStencilOpSeparate.\r\n\r\nGL_STENCIL_BACK_REF\r\ndata returns one value, the reference value that is compared with the contents of the stencil buffer for back-facing polygons. The initial value is 0. See glStencilFuncSeparate.\r\n\r\nGL_STENCIL_BACK_VALUE_MASK\r\ndata returns one value, the mask that is used for back-facing polygons to mask both the stencil reference value and the stencil buffer value before they are compared. The initial value is all 1's. See glStencilFuncSeparate.\r\n\r\nGL_STENCIL_BACK_WRITEMASK\r\ndata returns one value, the mask that controls writing of the stencil bitplanes for back-facing polygons. The initial value is all 1's. See glStencilMaskSeparate.\r\n\r\nGL_STENCIL_CLEAR_VALUE\r\ndata returns one value, the index to which the stencil bitplanes are cleared. The initial value is 0. See glClearStencil.\r\n\r\nGL_STENCIL_FAIL\r\ndata returns one value, a symbolic constant indicating what action is taken when the stencil test fails. The initial value is GL_KEEP. See glStencilOp. This stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilOpSeparate.\r\n\r\nGL_STENCIL_FUNC\r\ndata returns one value, a symbolic constant indicating what function is used to compare the stencil reference value with the stencil buffer value. The initial value is GL_ALWAYS. See glStencilFunc. This stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilFuncSeparate.\r\n\r\nGL_STENCIL_PASS_DEPTH_FAIL\r\ndata returns one value, a symbolic constant indicating what action is taken when the stencil test passes, but the depth test fails. The initial value is GL_KEEP. See glStencilOp. This stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilOpSeparate.\r\n\r\nGL_STENCIL_PASS_DEPTH_PASS\r\ndata returns one value, a symbolic constant indicating what action is taken when the stencil test passes and the depth test passes. The initial value is GL_KEEP. See glStencilOp. This stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilOpSeparate.\r\n\r\nGL_STENCIL_REF\r\ndata returns one value, the reference value that is compared with the contents of the stencil buffer. The initial value is 0. See glStencilFunc. This stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilFuncSeparate.\r\n\r\nGL_STENCIL_TEST\r\ndata returns a single boolean value indicating whether stencil testing of fragments is enabled. The initial value is GL_FALSE. See glStencilFunc and glStencilOp.\r\n\r\nGL_STENCIL_VALUE_MASK\r\ndata returns one value, the mask that is used to mask both the stencil reference value and the stencil buffer value before they are compared. The initial value is all 1's. See glStencilFunc. This stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilFuncSeparate.\r\n\r\nGL_STENCIL_WRITEMASK\r\ndata returns one value, the mask that controls writing of the stencil bitplanes. The initial value is all 1's. See glStencilMask. This stencil state only affects non-polygons and front-facing polygons. Back-facing polygons use separate stencil state. See glStencilMaskSeparate.\r\n\r\nGL_STEREO\r\ndata returns a single boolean value indicating whether stereo buffers (left and right) are supported.\r\n\r\nGL_SUBPIXEL_BITS\r\ndata returns one value, an estimate of the number of bits of subpixel resolution that are used to position rasterized geometry in window coordinates. The value must be at least 4.\r\n\r\nGL_TEXTURE_BINDING_1D\r\ndata returns a single value, the name of the texture currently bound to the target GL_TEXTURE_1D. The initial value is 0. See glBindTexture.\r\n\r\nGL_TEXTURE_BINDING_1D_ARRAY\r\ndata returns a single value, the name of the texture currently bound to the target GL_TEXTURE_1D_ARRAY. The initial value is 0. See glBindTexture.\r\n\r\nGL_TEXTURE_BINDING_2D\r\ndata returns a single value, the name of the texture currently bound to the target GL_TEXTURE_2D. The initial value is 0. See glBindTexture.\r\n\r\nGL_TEXTURE_BINDING_2D_ARRAY\r\ndata returns a single value, the name of the texture currently bound to the target GL_TEXTURE_2D_ARRAY. The initial value is 0. See glBindTexture.\r\n\r\nGL_TEXTURE_BINDING_2D_MULTISAMPLE\r\ndata returns a single value, the name of the texture currently bound to the target GL_TEXTURE_2D_MULTISAMPLE. The initial value is 0. See glBindTexture.\r\n\r\nGL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY\r\ndata returns a single value, the name of the texture currently bound to the target GL_TEXTURE_2D_MULTISAMPLE_ARRAY. The initial value is 0. See glBindTexture.\r\n\r\nGL_TEXTURE_BINDING_3D\r\ndata returns a single value, the name of the texture currently bound to the target GL_TEXTURE_3D. The initial value is 0. See glBindTexture.\r\n\r\nGL_TEXTURE_BINDING_BUFFER\r\ndata returns a single value, the name of the texture currently bound to the target GL_TEXTURE_BUFFER. The initial value is 0. See glBindTexture.\r\n\r\nGL_TEXTURE_BINDING_CUBE_MAP\r\ndata returns a single value, the name of the texture currently bound to the target GL_TEXTURE_CUBE_MAP. The initial value is 0. See glBindTexture.\r\n\r\nGL_TEXTURE_BINDING_RECTANGLE\r\ndata returns a single value, the name of the texture currently bound to the target GL_TEXTURE_RECTANGLE. The initial value is 0. See glBindTexture.\r\n\r\nGL_TEXTURE_COMPRESSION_HINT\r\ndata returns a single value indicating the mode of the texture compression hint. The initial value is GL_DONT_CARE.\r\n\r\nGL_TEXTURE_BINDING_BUFFER\r\ndata returns a single value, the name of the buffer object currently bound to the GL_TEXTURE_BUFFER buffer binding point. The initial value is 0. See glBindBuffer.\r\n\r\nGL_TEXTURE_BUFFER_OFFSET_ALIGNMENT\r\ndata returns a single value, the minimum required alignment for texture buffer sizes and offset. The initial value is 1. See glUniformBlockBinding.\r\n\r\nGL_TIMESTAMP\r\ndata returns a single value, the 64-bit value of the current GL time. See glQueryCounter.\r\n\r\nGL_TRANSFORM_FEEDBACK_BUFFER_BINDING\r\nWhen used with non-indexed variants of glGet (such as glGetIntegerv), data returns a single value, the name of the buffer object currently bound to the target GL_TRANSFORM_FEEDBACK_BUFFER. If no buffer object is bound to this target, 0 is returned. When used with indexed variants of glGet (such as glGetIntegeri_v), data returns a single value, the name of the buffer object bound to the indexed transform feedback attribute stream. The initial value is 0 for all targets. See glBindBuffer, glBindBufferBase, and glBindBufferRange.\r\n\r\nGL_TRANSFORM_FEEDBACK_BUFFER_START\r\nWhen used with indexed variants of glGet (such as glGetInteger64i_v), data returns a single value, the start offset of the binding range for each transform feedback attribute stream. The initial value is 0 for all streams. See glBindBufferRange.\r\n\r\nGL_TRANSFORM_FEEDBACK_BUFFER_SIZE\r\nWhen used with indexed variants of glGet (such as glGetInteger64i_v), data returns a single value, the size of the binding range for each transform feedback attribute stream. The initial value is 0 for all streams. See glBindBufferRange.\r\n\r\nGL_UNIFORM_BUFFER_BINDING\r\nWhen used with non-indexed variants of glGet (such as glGetIntegerv), data returns a single value, the name of the buffer object currently bound to the target GL_UNIFORM_BUFFER. If no buffer object is bound to this target, 0 is returned. When used with indexed variants of glGet (such as glGetIntegeri_v), data returns a single value, the name of the buffer object bound to the indexed uniform buffer binding point. The initial value is 0 for all targets. See glBindBuffer, glBindBufferBase, and glBindBufferRange.\r\n\r\nGL_UNIFORM_BUFFER_OFFSET_ALIGNMENT\r\ndata returns a single value, the minimum required alignment for uniform buffer sizes and offset. The initial value is 1. See glUniformBlockBinding.\r\n\r\nGL_UNIFORM_BUFFER_SIZE\r\nWhen used with indexed variants of glGet (such as glGetInteger64i_v), data returns a single value, the size of the binding range for each indexed uniform buffer binding. The initial value is 0 for all bindings. See glBindBufferRange.\r\n\r\nGL_UNIFORM_BUFFER_START\r\nWhen used with indexed variants of glGet (such as glGetInteger64i_v), data returns a single value, the start offset of the binding range for each indexed uniform buffer binding. The initial value is 0 for all bindings. See glBindBufferRange.\r\n\r\nGL_UNPACK_ALIGNMENT\r\ndata returns one value, the byte alignment used for reading pixel data from memory. The initial value is 4. See glPixelStore.\r\n\r\nGL_UNPACK_IMAGE_HEIGHT\r\ndata returns one value, the image height used for reading pixel data from memory. The initial is 0. See glPixelStore.\r\n\r\nGL_UNPACK_LSB_FIRST\r\ndata returns a single boolean value indicating whether single-bit pixels being read from memory are read first from the least significant bit of each unsigned byte. The initial value is GL_FALSE. See glPixelStore.\r\n\r\nGL_UNPACK_ROW_LENGTH\r\ndata returns one value, the row length used for reading pixel data from memory. The initial value is 0. See glPixelStore.\r\n\r\nGL_UNPACK_SKIP_IMAGES\r\ndata returns one value, the number of pixel images skipped before the first pixel is read from memory. The initial value is 0. See glPixelStore.\r\n\r\nGL_UNPACK_SKIP_PIXELS\r\ndata returns one value, the number of pixel locations skipped before the first pixel is read from memory. The initial value is 0. See glPixelStore.\r\n\r\nGL_UNPACK_SKIP_ROWS\r\ndata returns one value, the number of rows of pixel locations skipped before the first pixel is read from memory. The initial value is 0. See glPixelStore.\r\n\r\nGL_UNPACK_SWAP_BYTES\r\ndata returns a single boolean value indicating whether the bytes of two-byte and four-byte pixel indices and components are swapped after being read from memory. The initial value is GL_FALSE. See glPixelStore.\r\n\r\nGL_VERTEX_ARRAY_BINDING\r\ndata returns a single value, the name of the vertex array object currently bound to the context. If no vertex array object is bound to the context, 0 is returned. The initial value is 0. See glBindVertexArray.\r\n\r\nGL_VERTEX_BINDING_DIVISOR\r\nAccepted by the indexed forms. data returns a single integer value representing the instance step divisor of the first element in the bound buffer's data store for vertex attribute bound to index.\r\n\r\nGL_VERTEX_BINDING_OFFSET\r\nAccepted by the indexed forms. data returns a single integer value representing the byte offset of the first element in the bound buffer's data store for vertex attribute bound to index.\r\n\r\nGL_VERTEX_BINDING_STRIDE\r\nAccepted by the indexed forms. data returns a single integer value representing the byte offset between the start of each element in the bound buffer's data store for vertex attribute bound to index.\r\n\r\nGL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET\r\ndata returns a single integer value containing the maximum offset that may be added to a vertex binding offset.\r\n\r\nGL_MAX_VERTEX_ATTRIB_BINDINGS\r\ndata returns a single integer value containing the maximum number of vertex buffers that may be bound.\r\n\r\nGL_VIEWPORT\r\nWhen used with non-indexed variants of glGet (such as glGetIntegerv), data returns four values: the x and y window coordinates of the viewport, followed by its width and height. Initially the x and y window coordinates are both set to 0, and the width and height are set to the width and height of the window into which the GL will do its rendering. See glViewport. When used with indexed variants of glGet (such as glGetIntegeri_v), data returns four values: the x and y window coordinates of the indexed viewport, followed by its width and height. Initially the x and y window coordinates are both set to 0, and the width and height are set to the width and height of the window into which the GL will do its rendering. See glViewportIndexedf.\r\n\r\nGL_VIEWPORT_BOUNDS_RANGE\r\ndata returns two values, the minimum and maximum viewport bounds range. The minimum range should be at least [-32768, 32767].\r\n\r\nGL_VIEWPORT_INDEX_PROVOKING_VERTEX\r\ndata returns one value, the implementation dependent specifc vertex of a primitive that is used to select the viewport index. If the value returned is equivalent to GL_PROVOKING_VERTEX, then the vertex selection follows the convention specified by glProvokingVertex. If the value returned is equivalent to GL_FIRST_VERTEX_CONVENTION, then the selection is always taken from the first vertex in the primitive. If the value returned is equivalent to GL_LAST_VERTEX_CONVENTION, then the selection is always taken from the last vertex in the primitive. If the value returned is equivalent to GL_UNDEFINED_VERTEX, then the selection is not guaranteed to be taken from any specific vertex in the primitive.\r\n\r\nGL_VIEWPORT_SUBPIXEL_BITS\r\ndata returns a single value, the number of bits of sub-pixel precision which the GL uses to interpret the floating point viewport bounds. The minimum value is 0.\r\n\r\nGL_MAX_ELEMENT_INDEX\r\ndata returns a single value, the maximum index that may be specified during the transfer of generic vertex attributes to the GL."
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/graphics/ProgramObject.h",
    "content": "#pragma once\r\n\n#include \"ShaderObject.h\"\n\nnamespace kt84 {\n\nstruct ProgramObject {\n    GLuint\thandle;\n    \n    ProgramObject()\n        : handle(0)\n    {}\n    void init() {\n        handle = glCreateProgramObjectARB();\n    }\n    void attach(const ShaderObject& s) {\n\t    glAttachObjectARB(handle, s.handle);\n    }\n    void link(void) const {\n\t    glLinkProgramARB(handle);\n\t    GLint result;\n\t    glGetObjectParameterivARB(handle, GL_OBJECT_LINK_STATUS_ARB, &result);\n\t    if (result == GL_FALSE) {\n\t\t    int\tlength;\n\t\t    glGetObjectParameterivARB(handle, GL_OBJECT_INFO_LOG_LENGTH_ARB, &length);\n\t\t    if (length > 0) {\n\t\t\t    int\tl;\n                std::string info_log;\n                info_log.resize(length);\n\t\t\t    glGetInfoLogARB(handle, length, &l, &info_log[0]);\n                std::cerr << info_log << std::endl;\n\t\t    }\n\t    }\n    }\n    void enable() const { glUseProgramObjectARB(handle); }\n    static void disable() { glUseProgramObjectARB(0); }\n\n    GLint get_uniform_location(const std::string& name) const {\n        GLint ul = glGetUniformLocationARB(handle, name.c_str());\n        if (ul == -1) {\n            std::cerr << \"no such uniform named \" << name << std::endl;\n        }\n        return ul;\n    }\n\n    GLint get_attrib_location(const std::string& name) const {\n        GLint al = glGetAttribLocationARB(handle, name.c_str());\n        if (al == -1) {\n            std::cerr << \"no such attrib named \" << name << std::endl;\n        }\n        return al;\n    }\n\n#pragma warning(disable: 4244)\r\n    \n    // glUniform<N><T>\n    template <typename T>\n    void set_uniform_1(const std::string& name, T v0) const {\n        auto& t = typeid(T);\n        GLint location = get_uniform_location(name);\n        if      (t == typeid(GLint   )) glUniform1i (location, v0);\n        else if (t == typeid(GLuint  )) glUniform1ui(location, v0);\n        else if (t == typeid(GLfloat )) glUniform1f (location, v0);\n        else if (t == typeid(GLdouble)) glUniform1d (location, v0);\n    }\n    template <typename T>\n    void set_uniform_2(const std::string& name, T v0, T v1) const {\n        auto& t = typeid(T);\n        GLint location = get_uniform_location(name);\n        if      (t == typeid(GLint   )) glUniform2i (location, v0, v1);\n        else if (t == typeid(GLuint  )) glUniform2ui(location, v0, v1);\n        else if (t == typeid(GLfloat )) glUniform2f (location, v0, v1);\n        else if (t == typeid(GLdouble)) glUniform2d (location, v0, v1);\n    }\n    template <typename T>\n    void set_uniform_3(const std::string& name, T v0, T v1, T v2) const {\n        auto& t = typeid(T);\n        GLint location = get_uniform_location(name);\n        if      (t == typeid(GLint   )) glUniform3i (location, v0, v1, v2);\n        else if (t == typeid(GLuint  )) glUniform3ui(location, v0, v1, v2);\n        else if (t == typeid(GLfloat )) glUniform3f (location, v0, v1, v2);\n        else if (t == typeid(GLdouble)) glUniform3d (location, v0, v1, v2);\n    }\n    template <typename T>\n    void set_uniform_4(const std::string& name, T v0, T v1, T v2, T v3) const {\n        auto& t = typeid(T);\n        GLint location = get_uniform_location(name);\n        if      (t == typeid(GLint   )) glUniform4i (location, v0, v1, v2, v3);\n        else if (t == typeid(GLuint  )) glUniform4ui(location, v0, v1, v2, v3);\n        else if (t == typeid(GLfloat )) glUniform4f (location, v0, v1, v2, v3);\n        else if (t == typeid(GLdouble)) glUniform4d (location, v0, v1, v2, v3);\n    }\n    template <class TVector> void set_uniform_2( const std::string& name, const TVector& v ) const { set_uniform_2(name, v[0], v[1]); }\n    template <class TVector> void set_uniform_3( const std::string& name, const TVector& v ) const { set_uniform_3(name, v[0], v[1], v[2]); }\n    template <class TVector> void set_uniform_4( const std::string& name, const TVector& v ) const { set_uniform_4(name, v[0], v[1], v[2], v[3]); }\n    \n    // glUniform<N><T>v\n    template <typename T>\n    void set_uniform_1v( const std::string& name, GLuint count, const T *v ) const {\n        auto& t = typeid(T);\n        GLint location = get_uniform_location(name);\n        if      (t == typeid(GLint   )) glUniform1iv (location, count, v);\n        else if (t == typeid(GLuint  )) glUniform1uiv(location, count, v);\n        else if (t == typeid(GLfloat )) glUniform1fv (location, count, v);\n        else if (t == typeid(GLdouble)) glUniform1dv (location, count, v);\n    }\n    template <typename T>\n    void set_uniform_2v( const std::string& name, GLuint count, const T *v ) const {\n        auto& t = typeid(T);\n        GLint location = get_uniform_location(name);\n        if      (t == typeid(GLint   )) glUniform2iv (location, count, v);\n        else if (t == typeid(GLuint  )) glUniform2uiv(location, count, v);\n        else if (t == typeid(GLfloat )) glUniform2fv (location, count, v);\n        else if (t == typeid(GLdouble)) glUniform2dv (location, count, v);\n    }\n    template <typename T>\n    void set_uniform_3v( const std::string& name, GLuint count, const T *v ) const {\n        auto& t = typeid(T);\n        GLint location = get_uniform_location(name);\n        if      (t == typeid(GLint   )) glUniform3iv (location, count, v);\n        else if (t == typeid(GLuint  )) glUniform3uiv(location, count, v);\n        else if (t == typeid(GLfloat )) glUniform3fv (location, count, v);\n        else if (t == typeid(GLdouble)) glUniform3dv (location, count, v);\n    }\n    template <typename T>\n    void set_uniform_4v( const std::string& name, GLuint count, const T *v ) const {\n        auto& t = typeid(T);\n        GLint location = get_uniform_location(name);\n        if      (t == typeid(GLint   )) glUniform4iv (location, count, v);\n        else if (t == typeid(GLuint  )) glUniform4uiv(location, count, v);\n        else if (t == typeid(GLfloat )) glUniform4fv (location, count, v);\n        else if (t == typeid(GLdouble)) glUniform4dv (location, count, v);\n    }\n    \n    // glUniformMatrix<N><T>v\n    template <typename T>\n    void set_uniform_matrix_2v( const std::string& name, GLuint count, GLboolean transpose, const T *v ) const {\n        auto& t = typeid(T);\n        GLint location = get_uniform_location(name);\n        if      (t == typeid(GLfloat )) glUniformMatrix2fv(location, count, transpose, v);\n        else if (t == typeid(GLdouble)) glUniformMatrix2dv(location, count, transpose, v);\n    }\n    template <typename T>\n    void set_uniform_matrix_3v( const std::string& name, GLuint count, GLboolean transpose, const T *v ) const {\n        auto& t = typeid(T);\n        GLint location = get_uniform_location(name);\n        if      (t == typeid(GLfloat )) glUniformMatrix3fv(location, count, transpose, v);\n        else if (t == typeid(GLdouble)) glUniformMatrix3dv(location, count, transpose, v);\n    }\n    template <typename T>\n    void set_uniform_matrix_4v( const std::string& name, GLuint count, GLboolean transpose, const T *v ) const {\n        auto& t = typeid(T);\n        GLint location = get_uniform_location(name);\n        if      (t == typeid(GLfloat )) glUniformMatrix4fv(location, count, transpose, v);\n        else if (t == typeid(GLdouble)) glUniformMatrix4dv(location, count, transpose, v);\n    }\n    template <class TMatrix> void set_uniform_matrix_2( const std::string& name, const TMatrix& m) const { set_uniform_matrix_2v( name, 1, GL_TRUE, &m(0, 0)); }\n    template <class TMatrix> void set_uniform_matrix_3( const std::string& name, const TMatrix& m) const { set_uniform_matrix_3v( name, 1, GL_TRUE, &m(0, 0)); }\n    template <class TMatrix> void set_uniform_matrix_4( const std::string& name, const TMatrix& m) const { set_uniform_matrix_4v( name, 1, GL_TRUE, &m(0, 0)); }\n    \n    // glVertexattrib<N><T>\n    template <typename T>\n    void set_attrib_1(const std::string& name, T v0) const {\n        auto& t = typeid(T);\n        GLint location = get_attrib_location(name);\n        if      (t == typeid(GLfloat )) glVertexAttrib1f(location, v0);\n        else if (t == typeid(GLdouble)) glVertexAttrib1d(location, v0);\n        else if (t == typeid(GLshort )) glVertexAttrib1s(location, v0);\n    }\n    template <typename T>\n    void set_attrib_2(const std::string& name, T v0, T v1) const {\n        auto& t = typeid(T);\n        GLint location = get_attrib_location(name);\n        if      (t == typeid(GLfloat )) glVertexAttrib2f(location, v0, v1);\n        else if (t == typeid(GLdouble)) glVertexAttrib2d(location, v0, v1);\n        else if (t == typeid(GLshort )) glVertexAttrib2s(location, v0, v1);\n    }\n    template <typename T>\n    void set_attrib_3(const std::string& name, T v0, T v1, T v2) const {\n        auto& t = typeid(T);\n        GLint location = get_attrib_location(name);\n        if      (t == typeid(GLfloat )) glVertexAttrib3f(location, v0, v1, v2);\n        else if (t == typeid(GLdouble)) glVertexAttrib3d(location, v0, v1, v2);\n        else if (t == typeid(GLshort )) glVertexAttrib3s(location, v0, v1, v2);\n    }\n    template <typename T>\n    void set_attrib_4(const std::string& name, T v0, T v1, T v2, T v3) const {\n        auto& t = typeid(T);\n        GLint location = get_attrib_location(name);\n        if      (t == typeid(GLfloat )) glVertexAttrib4f(location, v0, v1, v2, v3);\n        else if (t == typeid(GLdouble)) glVertexAttrib4d(location, v0, v1, v2, v3);\n        else if (t == typeid(GLshort )) glVertexAttrib4s(location, v0, v1, v2, v3);\n    }\n    template <class TVector> void set_attrib_2( const std::string& name, const TVector& v ) const { set_attrib_2( name, v[0], v[1] ); }\n    template <class TVector> void set_attrib_3( const std::string& name, const TVector& v ) const { set_attrib_3( name, v[0], v[1], v[2] ); }\n    template <class TVector> void set_attrib_4( const std::string& name, const TVector& v ) const { set_attrib_4( name, v[0], v[1], v[2], v[3] ); }\n    \n    // glVertexattrib<N><T>v\n    template <typename T>\n    void set_attrib_1v( const std::string& name, const T *v ) const {\n        auto& t = typeid(T);\n        GLint location = get_attrib_location(name);\n        if      (t == typeid(GLfloat )) glVertexAttrib1fv(location, v);\n        else if (t == typeid(GLdouble)) glVertexAttrib1dv(location, v);\n        else if (t == typeid(GLshort )) glVertexAttrib1sv(location, v);\n    }\n    template <typename T>\n    void set_attrib_2v( const std::string& name, const T *v ) const {\n        auto& t = typeid(T);\n        GLint location = get_attrib_location(name);\n        if      (t == typeid(GLfloat )) glVertexAttrib2fv(location, v);\n        else if (t == typeid(GLdouble)) glVertexAttrib2dv(location, v);\n        else if (t == typeid(GLshort )) glVertexAttrib2sv(location, v);\n    }\n    template <typename T>\n    void set_attrib_3v( const std::string& name, const T *v ) const {\n        auto& t = typeid(T);\n        GLint location = get_attrib_location(name);\n        if      (t == typeid(GLfloat )) glVertexAttrib3fv(location, v);\n        else if (t == typeid(GLdouble)) glVertexAttrib3dv(location, v);\n        else if (t == typeid(GLshort )) glVertexAttrib3sv(location, v);\n    }\n    template <typename T>\n    void set_attrib_4v( const std::string& name, const T *v ) const {\n        auto& t = typeid(T);\n        GLint location = get_attrib_location(name);\n        if      (t == typeid(GLfloat )) glVertexAttrib4fv(location, v);\n        else if (t == typeid(GLdouble)) glVertexAttrib4dv(location, v);\n        else if (t == typeid(GLshort )) glVertexAttrib4sv(location, v);\n    }\n#pragma warning(default: 4244)\r\n};\n\n}\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/graphics/RenderbufferObject.h",
    "content": "#pragma once\r\n#include <gl/glew.h>\r\n\r\nnamespace kt84 {\r\n\r\nstruct RenderbufferObject {\r\n    GLuint  handle        ;\n    GLsizei width         ;\n    GLsizei height        ;\n    GLenum  internalformat;\n    \n    RenderbufferObject()\n        : handle        (0)\n        , width         (0)\n        , height        (0)\n        , internalformat(0)\n    {}\n    \n    void init() { glGenRenderbuffersEXT(1, &handle); }\n    \n    void bind() { glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, handle); }\n    \n    static void unbind() { glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0); }\n    \n    void allocate(GLsizei width_, GLsizei height_, GLenum internalformat_) {\n        width          = width_ ;\n        height         = height_;\n        internalformat = internalformat_;\n        glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, internalformat, width, height);\r\n    }\n};\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/graphics/ShaderObject.h",
    "content": "#pragma once\r\n\n#include <GL/glew.h>\n#include <iostream>\n#include <fstream>\n#include <sstream>\n\nnamespace kt84 {\n\nstruct ShaderObject {\n    enum class Type {\n        FRAGMENT_SHADER,\n        VERTEX_SHADER  ,\n        GEOMETRY_SHADER\n    };\n    \n    GLuint\thandle;\n    std::string filename;\n    \n    ShaderObject()\n        : handle(0)\n    {}\n    void init(Type type) {\n        handle = glCreateShaderObjectARB(\n            type == Type::FRAGMENT_SHADER ? GL_FRAGMENT_SHADER_ARB :\n            type == Type::VERTEX_SHADER   ? GL_VERTEX_SHADER_ARB   :\n            GL_GEOMETRY_SHADER_ARB);\n    }\n    void set_source( const std::string& source) {\n        int len = static_cast<int>(source.length());\n        auto source_ptr = source.c_str();\n        glShaderSourceARB(handle, 1, &source_ptr, &len);\n    }\n    bool set_source_from_file(const std::string& filename_) {\n        std::ifstream f_in(filename_.c_str(), std::ios::binary);\n        if (f_in.fail()) {\n            std::cerr << \"cannot open file: \" << filename_ << std::endl;\n            return false;\n        }\n        filename = filename_;\n        \n        std::ostringstream oss;\n        oss << f_in.rdbuf();\n        \n        set_source(oss.str());\n        \n        f_in.close();\n        return true;\n    }\n    void compile() {\n        // compile\n        glCompileShaderARB( handle );\n        \n        // check errors\n        GLint\tresult;\n        glGetObjectParameterivARB( handle, GL_OBJECT_COMPILE_STATUS_ARB, &result );\n        if (result == GL_FALSE ) {\n            int\tlength;\n            glGetObjectParameterivARB( handle, GL_OBJECT_INFO_LOG_LENGTH_ARB, &length );\n            if ( length > 0 ) {\n                int\tl;\n                std::string info_log;\n                info_log.resize(length);\n                glGetInfoLogARB(handle, length, &l, &info_log[0]);\n                std::cerr << \"(filename:\" << filename << \") \" << info_log << std::endl;\n            }\n        }\n    }\n};\n\n}\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/graphics/TextureObjectT.h",
    "content": "#pragma once\r\n#include <GL/glew.h>\r\n\r\nnamespace kt84 {\r\n\r\nstruct FramebufferObject;\r\n\r\ntemplate <GLenum TTarget = GL_TEXTURE_2D>\r\nstruct TextureObjectT {\r\n    static const GLenum Target = TTarget;\r\n    \r\n    GLuint  handle        ;\r\n    GLsizei width         ;\r\n    GLsizei height        ;\r\n    GLenum  format        ;\r\n    GLint   internalformat;\r\n    \r\n    TextureObjectT()\r\n        : handle        (0)\r\n        , width         (0)\r\n        , height        (0)\r\n        , format        (0)\r\n        , internalformat(0)\r\n    {}\r\n    \r\n    void init() { glGenTextures(1, &handle); }\r\n    \r\n    void bind() const { glBindTexture(TTarget, handle); }\r\n    \r\n    static void unbind() { glBindTexture(TTarget, 0); }\r\n    \r\n    static void enable () { glEnable (TTarget); }\r\n    \r\n    static void disable() { glDisable(TTarget); }\r\n    \r\n    void allocate(GLsizei width_, GLsizei height_, GLenum  format_ = GL_RGBA, GLint   internalformat_ = GL_RGBA) {\r\n        width          = width_;\r\n        height         = height_;\r\n        format         = format_;\r\n        internalformat = internalformat_;\r\n        glTexImage2D(TTarget, 0, internalformat, width, height, 0, format, GL_UNSIGNED_BYTE, 0);\r\n    }\r\n    \r\n    void copy_cpu2gpu(GLenum type, const GLvoid* pixels) {\r\n        glTexImage2D(TTarget, 0, internalformat, width, height, 0, format, type, pixels);\r\n    }\r\n    void copy_cpu2gpu(FramebufferObject& framebuffer, const GLvoid* pixels);\r\n    \r\n    void copy_gpu2cpu(GLenum type, GLvoid* pixels) {\r\n        glGetTexImage(TTarget, 0, format, type, pixels);\r\n    }\r\n    void copy_gpu2cpu(FramebufferObject& framebuffer, GLvoid* pixels);\r\n    \r\n    void copy_gpu2gpu(TextureObjectT<TTarget>& dst);\r\n    \r\n    void set_wrap (GLenum param) const {\r\n        glTexParameteri(TTarget, GL_TEXTURE_WRAP_S, param);\r\n        glTexParameteri(TTarget, GL_TEXTURE_WRAP_T, param);\r\n    }\r\n    void set_filter(GLenum param) const {\r\n        glTexParameteri(TTarget, GL_TEXTURE_MIN_FILTER, param);\r\n        glTexParameteri(TTarget, GL_TEXTURE_MAG_FILTER, param);\r\n    }\r\n    void set_env(GLint param) const {\r\n        glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, param);\r\n    }\r\n    void set_default_param() const {\r\n        set_wrap(GL_REPEAT);\r\n        set_filter(GL_LINEAR);\r\n        set_env(GL_REPLACE);\r\n    }\r\n    \r\n    bool is_compatible(const TextureObjectT<TTarget>& rhs) const {\r\n        return\r\n            width          == rhs.width          &&\r\n            height         == rhs.height         &&\r\n            format         == rhs.format         &&\r\n            internalformat == rhs.internalformat;\r\n    }\r\n};\r\n\r\ntypedef TextureObjectT<GL_TEXTURE_2D> TextureObject;\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/graphics/gen_ParamName.py",
    "content": "import sys\r\n\r\nif len(sys.argv) != 2:\r\n    print \"Usage: gen_ParamName.py ParamNameX.Y.txt\"\r\n    sys.exit()\r\n\r\nfin = open(sys.argv[1])\r\n\r\nlines = fin.readlines()\r\n\r\nfor i in range(len(lines) / 3):\r\n    name = lines[3 * i].rstrip(\"\\n\")\r\n    desc = lines[3 * i + 1].rstrip(\"\\n\")\r\n    print \"// \" + desc\r\n    print name[3:] + \" = \" + name + \",\"\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/graphics/graphics_util.h",
    "content": "#pragma once\r\n#include <GL/glew.h>\r\n#include <boost/optional.hpp>\r\n#include \"../eigen_def.h\"\r\n\r\nnamespace kt84 {\r\n\r\nnamespace graphics_util {\r\n    enum struct ParamName {\r\n        #if defined(KT84_USE_OPENGL_4)\r\n        #include \"ParamName4.inl\"\r\n        #elif defined(KT84_USE_OPENGL_3_3)\r\n        #include \"ParamName3.3.inl\"\r\n        #else\r\n        #include \"ParamName2.1.inl\"\r\n        #endif\r\n    };\r\n    inline int    glGet1i(ParamName pname) { int    value; glGetIntegerv(static_cast<GLenum>(pname), &value); return value; }\r\n    inline float  glGet1f(ParamName pname) { float  value; glGetFloatv  (static_cast<GLenum>(pname), &value); return value; }\r\n    inline double glGet1d(ParamName pname) { double value; glGetDoublev (static_cast<GLenum>(pname), &value); return value; }\r\n    template <class EigenType> inline EigenType glGetXi(ParamName pname) { EigenType value; glGetIntegerv(static_cast<GLenum>(pname), value.data()); return value; }\r\n    template <class EigenType> inline EigenType glGetXf(ParamName pname) { EigenType value; glGetFloatv  (static_cast<GLenum>(pname), value.data()); return value; }\r\n    template <class EigenType> inline EigenType glGetXd(ParamName pname) { EigenType value; glGetDoublev (static_cast<GLenum>(pname), value.data()); return value; }\r\n    \r\n    inline Eigen::Matrix4d get_modelview_matrix() {\r\n        return glGetXd<Eigen::Matrix4d>(ParamName::MODELVIEW_MATRIX);\r\n    }\r\n    inline Eigen::Matrix4d get_projection_matrix() {\r\n        return glGetXd<Eigen::Matrix4d>(ParamName::PROJECTION_MATRIX);\r\n    }\r\n    inline Eigen::Vector4i get_viewport() {\r\n        return glGetXi<Eigen::Vector4i>(ParamName::VIEWPORT);\r\n    }\r\n    inline float read_depth(int x, int y) {\r\n        float z = 0;\r\n    \tglReadPixels(x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &z);\r\n        return z;\r\n    }\r\n    inline Eigen::Vector3d unproject(const Eigen::Vector3d& win_xyz,\r\n                                     const Eigen::Matrix4d& modelview_matrix,\r\n                                     const Eigen::Matrix4d& projection_matrix,\r\n                                     const Eigen::Vector4i& viewport)\r\n    {\r\n        Eigen::Vector3d obj_xyz;\r\n    \tgluUnProject( win_xyz.x(),  win_xyz.y(),  win_xyz.z(),     modelview_matrix.data(), projection_matrix.data(), viewport.data(),\r\n                     &obj_xyz.x(), &obj_xyz.y(), &obj_xyz.z());\r\n        return obj_xyz;\r\n    }\r\n    inline Eigen::Vector3d unproject(const Eigen::Vector3d& win_xyz) {\r\n        return unproject(win_xyz, get_modelview_matrix(), get_projection_matrix(), get_viewport());\r\n    }\r\n    inline boost::optional<Eigen::Vector3d> read_and_unproject(int x, int y) {\r\n        auto modelview_matrix  = get_modelview_matrix();\r\n        auto projection_matrix = get_projection_matrix();\r\n        auto viewport          = get_viewport();\r\n        \r\n        float z = read_depth(x, y);\r\n        if (z == 1.0f)\r\n            return boost::none;\r\n        \r\n        return unproject(Eigen::Vector3d(x, y, z));\r\n    }\r\n    inline Eigen::Vector3d project(const Eigen::Vector3d& obj_xyz,\r\n                                   const Eigen::Matrix4d& modelview_matrix,\r\n                                   const Eigen::Matrix4d& projection_matrix,\r\n                                   const Eigen::Vector4i& viewport)\r\n    {\r\n        Eigen::Vector3d win_xyz;\r\n    \tgluProject( obj_xyz.x(),  obj_xyz.y(),  obj_xyz.z(),    modelview_matrix.data(), projection_matrix.data(), viewport.data(),\r\n                   &win_xyz.x(), &win_xyz.y(), &win_xyz.z());\r\n        return win_xyz;\r\n    }\r\n    inline Eigen::Vector3d project(const Eigen::Vector3d& obj_xyz) {\r\n        return project(obj_xyz, get_modelview_matrix(), get_projection_matrix(), get_viewport());\r\n    }\r\n\r\n    inline void glColor3f (const Eigen::Vector3f & color) { ::glColor3fv (&color[0]); }\r\n    inline void glColor3d (const Eigen::Vector3d & color) { ::glColor3dv (&color[0]); }\r\n    //inline void glColor3b (const Eigen::Vector3c & color) { ::glColor3bv (&color[0]); }       // Weird error: cannot convert parameter 1 from 'const char *' to 'const GLbyte *'\r\n    inline void glColor3i (const Eigen::Vector3i & color) { ::glColor3iv (&color[0]); }\r\n    inline void glColor3ub(const Eigen::Vector3uc& color) { ::glColor3ubv(&color[0]); }\r\n    inline void glColor3ui(const Eigen::Vector3ui& color) { ::glColor3uiv(&color[0]); }\r\n    inline void glColor4f (const Eigen::Vector4f & color) { ::glColor4fv (&color[0]); }\r\n    inline void glColor4d (const Eigen::Vector4d & color) { ::glColor4dv (&color[0]); }\r\n    //inline void glColor4b (const Eigen::Vector4c & color) { ::glColor4bv (&color[0]); }       // Weird error: cannot convert parameter 1 from 'const char *' to 'const GLbyte *'\r\n    inline void glColor4i (const Eigen::Vector4i & color) { ::glColor4iv (&color[0]); }\r\n    inline void glColor4ub(const Eigen::Vector4uc& color) { ::glColor4ubv(&color[0]); }\r\n    inline void glColor4ui(const Eigen::Vector4ui& color) { ::glColor4uiv(&color[0]); }\r\n    inline void glColor4f (const Eigen::Vector3f& color_rgb, float  color_alpha) { ::glColor4f(color_rgb[0], color_rgb[1], color_rgb[2], color_alpha); }\r\n    inline void glColor4d (const Eigen::Vector3d& color_rgb, double color_alpha) { ::glColor4d(color_rgb[0], color_rgb[1], color_rgb[2], color_alpha); }\r\n    inline void glVertex2f(const Eigen::Vector2f& vertex) { ::glVertex2fv(&vertex[0]); }\r\n    inline void glVertex2d(const Eigen::Vector2d& vertex) { ::glVertex2dv(&vertex[0]); }\r\n    inline void glVertex3f(const Eigen::Vector3f& vertex) { ::glVertex3fv(&vertex[0]); }\r\n    inline void glVertex3d(const Eigen::Vector3d& vertex) { ::glVertex3dv(&vertex[0]); }\r\n    inline void glNormal3f(const Eigen::Vector3f& normal) { ::glNormal3fv(&normal[0]); }\r\n    inline void glNormal3d(const Eigen::Vector3d& normal) { ::glNormal3dv(&normal[0]); }\r\n    inline void glTexCoord2f(const Eigen::Vector2f& texCoord) { ::glTexCoord2fv(&texCoord[0]); }\r\n    inline void glTexCoord2d(const Eigen::Vector2d& texCoord) { ::glTexCoord2dv(&texCoord[0]); }\r\n    inline void glTexCoord3f(const Eigen::Vector3f& texCoord) { ::glTexCoord3fv(&texCoord[0]); }\r\n    inline void glTexCoord3d(const Eigen::Vector3d& texCoord) { ::glTexCoord3dv(&texCoord[0]); }\r\n    inline void glTexCoord4f(const Eigen::Vector4f& texCoord) { ::glTexCoord4fv(&texCoord[0]); }\r\n    inline void glTexCoord4d(const Eigen::Vector4d& texCoord) { ::glTexCoord4dv(&texCoord[0]); }\r\n    inline void glTexCoord4f(const Eigen::Vector3f& texCoord_str, float  texCoord_q) { ::glTexCoord4f(texCoord_str[0], texCoord_str[1], texCoord_str[2], texCoord_q); }\r\n    inline void glTexCoord4d(const Eigen::Vector3d& texCoord_str, double texCoord_q) { ::glTexCoord4d(texCoord_str[0], texCoord_str[1], texCoord_str[2], texCoord_q); }\r\n    inline void glScalef(const Eigen::Vector3f& v) { ::glScalef(v[0], v[1], v[2]); }\r\n    inline void glScaled(const Eigen::Vector3d& v) { ::glScaled(v[0], v[1], v[2]); }\r\n    inline void glScalef(float  s) { ::glScalef(s, s, s); }\r\n    inline void glScaled(double s) { ::glScaled(s, s, s); }\r\n    inline void glTranslatef(const Eigen::Vector3f& v) { ::glTranslatef(v[0], v[1], v[2]); }\r\n    inline void glTranslated(const Eigen::Vector3d& v) { ::glTranslated(v[0], v[1], v[2]); }\r\n    inline void gluLookAt(const Eigen::Vector3d& eye, const Eigen::Vector3d& center, const Eigen::Vector3d& up) { ::gluLookAt(eye.x(), eye.y(), eye.z(), center.x(), center.y(), center.z(), up.x(), up.y(), up.z()); }\r\n#ifdef OPENMESH_VECTOR_HH\r\n    // for OpenMesh::VectorT\r\n    inline void glColor3f (const OpenMesh::Vec3f& color) { ::glColor3fv (&color[0]); }\r\n    inline void glColor3d (const OpenMesh::Vec3d& color) { ::glColor3dv (&color[0]); }\r\n    inline void glColor3i (const OpenMesh::Vec3i& color) { ::glColor3iv (&color[0]); }\r\n    inline void glColor3ub(const OpenMesh::Vec3uc& color) { ::glColor3ubv(&color[0]); }\r\n    inline void glColor3ui(const OpenMesh::Vec3ui& color) { ::glColor3uiv(&color[0]); }\r\n    inline void glColor4f (const OpenMesh::Vec4f & color) { ::glColor4fv (&color[0]); }\r\n    inline void glColor4d (const OpenMesh::Vec4d & color) { ::glColor4dv (&color[0]); }\r\n    inline void glColor4i (const OpenMesh::Vec4i & color) { ::glColor4iv (&color[0]); }\r\n    inline void glColor4ub(const OpenMesh::Vec4uc& color) { ::glColor4ubv(&color[0]); }\r\n    inline void glColor4ui(const OpenMesh::Vec4ui& color) { ::glColor4uiv(&color[0]); }\r\n    inline void glColor4f (const OpenMesh::Vec3f& color_rgb, float  color_alpha) { ::glColor4f(color_rgb[0], color_rgb[1], color_rgb[2], color_alpha); }\r\n    inline void glColor4d (const OpenMesh::Vec3d& color_rgb, double color_alpha) { ::glColor4d(color_rgb[0], color_rgb[1], color_rgb[2], color_alpha); }\r\n    inline void glVertex2f(const OpenMesh::Vec2f& vertex) { ::glVertex2fv(&vertex[0]); }\r\n    inline void glVertex2d(const OpenMesh::Vec2d& vertex) { ::glVertex2dv(&vertex[0]); }\r\n    inline void glVertex3f(const OpenMesh::Vec3f& vertex) { ::glVertex3fv(&vertex[0]); }\r\n    inline void glVertex3d(const OpenMesh::Vec3d& vertex) { ::glVertex3dv(&vertex[0]); }\r\n    inline void glNormal3f(const OpenMesh::Vec3f& normal) { ::glNormal3fv(&normal[0]); }\r\n    inline void glNormal3d(const OpenMesh::Vec3d& normal) { ::glNormal3dv(&normal[0]); }\r\n    inline void glTexCoord2f(const OpenMesh::Vec2f& texCoord) { ::glTexCoord2fv(&texCoord[0]); }\r\n    inline void glTexCoord2d(const OpenMesh::Vec2d& texCoord) { ::glTexCoord2dv(&texCoord[0]); }\r\n    inline void glTexCoord3f(const OpenMesh::Vec3f& texCoord) { ::glTexCoord3fv(&texCoord[0]); }\r\n    inline void glTexCoord3d(const OpenMesh::Vec3d& texCoord) { ::glTexCoord3dv(&texCoord[0]); }\r\n#endif\r\n\r\n}\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/graphics/phong_tessellation.h",
    "content": "#pragma once\r\n\r\n#include <GL/glew.h>\r\n#include <vector>\r\n#include <tuple>\r\n#include <Eigen/Core>\r\n#include \"../geometry/PointNormal.h\"\r\n\r\nnamespace kt84 {\r\n\r\nnamespace phong_tessellation {\r\n    enum struct Mode {\r\n        TRIANGLES = 0,\r\n        LINES,\r\n        TRIANGLE_FAN,\r\n        LINE_LOOP,\r\n        LINE_STRIP\r\n    };\r\n    \r\n    inline int& subdiv() {\r\n        static int subdiv = 3;\r\n        return subdiv;\r\n    }\r\n    inline double& weight() {\r\n        static double weight = 0.7;\r\n        return weight;\r\n    }\r\n    \r\n    namespace internal {\r\n        inline Mode& mode() {\r\n            static Mode mode = Mode::TRIANGLES;\r\n            return mode;\r\n        }\r\n        inline bool& enabled() {\r\n            static bool enabled = true;\r\n            return enabled;\r\n        }\r\n        inline std::vector<std::tuple<bool, int, double>>& config_stack() {\r\n            static std::vector<std::tuple<bool, int, double>> config_stack;\r\n            return config_stack;\r\n        }\r\n        inline std::vector<PointNormal>& pointnormals() {\r\n            static std::vector<PointNormal> pointnormals;\r\n            return pointnormals;\r\n        }\r\n        inline PointNormal project(const PointNormal& p, const PointNormal& q) {\r\n            PointNormal result;\r\n            result.head(3) = q.head(3) - (q - p).head(3).dot(p.tail(3)) * p.tail(3);\r\n            result.tail(3) = p.tail(3);\r\n            return result;\r\n        }\r\n        inline PointNormal interpolate(const Eigen::Vector3d& baryCoord, const PointNormal& pn0, const PointNormal& pn1, const PointNormal& pn2) {\r\n            PointNormal result = baryCoord[0] * pn0 + baryCoord[1] * pn1 + baryCoord[2] * pn2;\r\n            pn_normalize(result);\r\n            return result;\r\n        }\r\n        inline PointNormal interpolate(double u, const PointNormal& pn0, const PointNormal& pn1) {\r\n            PointNormal result = (1 - u) * pn0 + u * pn1;\r\n            pn_normalize(result);\r\n            return result;\r\n        }\r\n        inline void draw_triangle_sub(int i, int j, const PointNormal& pn0, const PointNormal& pn1, const PointNormal& pn2) {\r\n            Eigen::Vector3d baryCoord;\r\n            baryCoord[1] = i / static_cast<double>(subdiv());\r\n            baryCoord[2] = j / static_cast<double>(subdiv());\r\n            baryCoord[0] = 1.0 - baryCoord[1] - baryCoord[2];\r\n            PointNormal p  = interpolate(baryCoord, pn0, pn1, pn2);\r\n            PointNormal q0 = project(pn0, p);\r\n            PointNormal q1 = project(pn1, p);\r\n            PointNormal q2 = project(pn2, p);\r\n            PointNormal q  = interpolate(baryCoord, q0, q1, q2);\r\n            PointNormal r = (1.0 - weight()) * p + weight() * q;\r\n            pn_normalize(r);\r\n            glNormal3dv(&r[3]);\r\n            glVertex3dv(&r[0]);\r\n        }\r\n        inline void draw_line_sub(int i, const PointNormal& pn0, const PointNormal& pn1) {\r\n            double u = i / static_cast<double>(subdiv());\r\n            PointNormal p  = interpolate(u, pn0, pn1);\r\n            PointNormal q0 = project(pn0, p);\r\n            PointNormal q1 = project(pn1, p);\r\n            PointNormal q  = interpolate(u, q0, q1);\r\n            PointNormal r = (1.0 - weight()) * p + weight() * q;\r\n            pn_normalize(r);\r\n            glNormal3dv(&r[3]);\r\n            glVertex3dv(&r[0]);\r\n        }\r\n    }\r\n    \r\n    inline void begin(Mode mode_) { internal::mode() = mode_; }\r\n    \r\n    inline void vertex(const PointNormal& pn) { internal::pointnormals().push_back(pn); }\r\n    inline void vertex(const Eigen::Vector3d& point, const Eigen::Vector3d& normal) {\r\n        PointNormal pn;\r\n        pn << point, normal;\r\n        vertex(pn);\r\n    }\r\n    \r\n    inline void enable () { internal::enabled() = true; }\r\n    inline void disable() { internal::enabled() = false; }\r\n\r\n    // config stack\r\n    inline void push_config() {\r\n        internal::config_stack().push_back(std::make_tuple(internal::enabled(), subdiv(), weight()));\r\n    }\r\n    inline void pop_config () {\r\n        std::tie(internal::enabled(), subdiv(), weight()) = internal::config_stack().back();\r\n        internal::config_stack().pop_back();\r\n    }\r\n    \r\n    inline void draw_triangle(const PointNormal& pn0, const PointNormal& pn1, const PointNormal& pn2) {\r\n        glBegin(GL_TRIANGLES);\r\n        if (internal::enabled()) {\r\n            for (int i = 0; i < subdiv(); ++i) {\r\n                for (int j = 0; j < subdiv() - 1 - i; ++j) {\r\n                    internal::draw_triangle_sub(i    , j    , pn0, pn1, pn2);\r\n                    internal::draw_triangle_sub(i + 1, j    , pn0, pn1, pn2);\r\n                    internal::draw_triangle_sub(i    , j + 1, pn0, pn1, pn2);\r\n                    internal::draw_triangle_sub(i    , j + 1, pn0, pn1, pn2);\r\n                    internal::draw_triangle_sub(i + 1, j    , pn0, pn1, pn2);\r\n                    internal::draw_triangle_sub(i + 1, j + 1, pn0, pn1, pn2);\r\n                }\r\n                internal::draw_triangle_sub(i    , subdiv()     - i, pn0, pn1, pn2);\r\n                internal::draw_triangle_sub(i    , subdiv() - 1 - i, pn0, pn1, pn2);\r\n                internal::draw_triangle_sub(i + 1, subdiv() - 1 - i, pn0, pn1, pn2);\r\n            }\r\n        } else {\r\n            glNormal3dv(&pn0[3]);    glVertex3dv(&pn0[0]);\r\n            glNormal3dv(&pn1[3]);    glVertex3dv(&pn1[0]);\r\n            glNormal3dv(&pn2[3]);    glVertex3dv(&pn2[0]);\r\n        }\r\n        glEnd();\r\n    }\r\n    \r\n    inline void draw_line(const PointNormal& pn0, const PointNormal& pn1) {\r\n        glBegin(GL_LINE_STRIP);\r\n        if (internal::enabled()) {\r\n            for (int i = 0; i < subdiv(); ++i) {\r\n                internal::draw_line_sub(i    , pn0, pn1);\r\n                internal::draw_line_sub(i + 1, pn0, pn1);\r\n            }\r\n        } else {\r\n            glNormal3dv(&pn0[3]);    glVertex3dv(&pn0[0]);\r\n            glNormal3dv(&pn1[3]);    glVertex3dv(&pn1[0]);\r\n        }\r\n        glEnd();\r\n    }\r\n    \r\n    inline void end() {\r\n        auto& mode = internal::mode();\r\n        auto& pointnormals = internal::pointnormals();\r\n        auto n = pointnormals.size();\r\n        \r\n        if (mode == Mode::TRIANGLES) {\r\n            if (n < 3) return;\r\n            size_t m = n / 3;\r\n            for (size_t i = 0; i < m; ++i)\r\n                draw_triangle(pointnormals[3 * i], pointnormals[3 * i + 1], pointnormals[3 * i + 2]);\r\n        \r\n        } else if (mode == Mode::LINES) {\r\n            if (n < 2) return;\r\n            size_t m = n / 2;\r\n            for (size_t i = 0; i < m; ++i)\r\n                draw_line(pointnormals[2 * i], pointnormals[2 * i + 1]);\r\n        \r\n        } else if (mode == Mode::TRIANGLE_FAN) {\r\n            if (n < 3) return;\r\n            for (size_t i = 1; i < n - 1; ++i)\r\n                draw_triangle(pointnormals[0], pointnormals[i], pointnormals[i + 1]);\r\n        \r\n        } else if (mode == Mode::LINE_LOOP) {\r\n            if (n < 2) return;\r\n            for (size_t i = 0; i < n; ++i)\r\n                draw_line(pointnormals[i], pointnormals[(i + 1) % n]);\r\n        \r\n        } else if (mode == Mode::LINE_STRIP) {\r\n            if (n < 2) return;\r\n            for (size_t i = 0; i < n - 1; ++i)\r\n                draw_line(pointnormals[i], pointnormals[i + 1]);\r\n        }\r\n        \r\n        pointnormals .clear();\r\n    }\r\n};\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/loop_util.h",
    "content": "#pragma once\r\n\r\nnamespace kt84 {\r\n\r\nnamespace loop_util {\r\n    // find_if for two synchronized sequences\r\n    template<class InputIterator1, class InputIterator2, class Predicate>\r\n    inline InputIterator1 find_if(\r\n        InputIterator1 first1,\r\n        InputIterator1 last1,\r\n        InputIterator2 first2,\r\n        Predicate pred)\r\n    {\r\n        auto i1(first1);\r\n        auto i2(first2);\r\n        \r\n        for ( ; i1 != last1; ++i1, ++i2)\r\n            if (pred(*i1, *i2)) break;\r\n        \r\n        return i1;\r\n    }\r\n    \r\n    // accumulate for two synchronized sequences\r\n    template<class InputIterator1, class InputIterator2, class Type, class TernaryOperation> \r\n    inline Type accumulate(\r\n        InputIterator1 first1,\r\n        InputIterator1 last1,\r\n        InputIterator2 first2,\r\n        Type val,\r\n        TernaryOperation ternary_op)\r\n    {\r\n        Type partial_result(val);\r\n        \r\n        auto i1(first1);\r\n        auto i2(first2);\r\n        \r\n        for ( ; i1 != last1; ++i1, ++i2)\r\n            partial_result = ternary_op(partial_result, *i1, *i2);\r\n        \r\n        return partial_result;\r\n    }\r\n    \r\n    // for_each for two synchronized sequences\r\n    template <class InputIterator1, class InputIterator2, class BinaryFunction>\r\n    inline BinaryFunction for_each(\r\n        InputIterator1 first1,\r\n        InputIterator1 last1,\r\n        InputIterator2 first2,\r\n        BinaryFunction func)\r\n    {\r\n        auto i1(first1);\r\n        auto i2(first2);\r\n        \r\n        for ( ; i1 != last1; ++i1, ++i2)\r\n            func(*i1, *i2);\r\n        \r\n        return func;\r\n    }\r\n    \r\n    // for_each for three synchronized sequences\r\n    template <class InputIterator1, class InputIterator2, class InputIterator3, class TernaryFunction>\r\n    inline TernaryFunction for_each(\r\n        InputIterator1 first1,\r\n        InputIterator1 last1,\r\n        InputIterator2 first2,\r\n        InputIterator3 first3,\r\n        TernaryFunction func)\r\n    {\r\n        auto i1(first1);\r\n        auto i2(first2);\r\n        auto i3(first3);\r\n        \r\n        for ( ; i1 != last1; ++i1, ++i2, ++i3)\r\n            func(*i1, *i2, *i3);\r\n        \r\n        return func;\r\n    }\r\n    \r\n    // tansform for three synchronized sequences\r\n    template<class InputIterator1, class InputIterator2, class InputIterator3, class OutputIterator, class TernaryFunction> \r\n    inline OutputIterator transform(\r\n        InputIterator1 first1,\r\n        InputIterator1 last1,\r\n        InputIterator2 first2,\r\n        InputIterator3 first3,\r\n        OutputIterator result,\r\n        TernaryFunction func)\r\n    {\r\n        auto i1(first1);\r\n        auto i2(first2);\r\n        auto i3(first3);\r\n        auto o (result);\r\n        \r\n        for ( ; i1 != last1; ++i1, ++i2, ++i3, ++o)\r\n            *o = func(*i1, *i2, *i3);\r\n        \r\n        return o;\r\n    }\r\n    \r\n    // *_with_index versions, just for convenience... |\r\n    //------------------------------------------------+\r\n    \r\n    // accumulate with index itself\r\n    template<class IndexType, class Type, class BinaryOperation> \r\n    inline Type accumulate_with_index( \r\n        IndexType first_index,\r\n        IndexType last_index,\r\n        Type val,\r\n        BinaryOperation binary_op)\r\n    {\r\n        Type partial_result(val);\r\n        \r\n        auto index(first_index);\r\n        \r\n        for ( ; index != last_index; ++index)\r\n            partial_result = binary_op(partial_result, index);\r\n        \r\n        return partial_result;\r\n    }\r\n    \r\n    // accumulate over a sequence with index\r\n    template<class IndexType, class InputIterator, class Type, class TernaryOperation> \r\n    inline Type accumulate_with_index( \r\n        IndexType first_index,\r\n        IndexType last_index,\r\n        InputIterator first,\r\n        Type val,\r\n        TernaryOperation ternary_op)\r\n    {\r\n        Type partial_result(val);\r\n        \r\n        auto index(first_index);\r\n        auto i(first);\r\n        \r\n        for ( ; index != last_index; ++index, ++i)\r\n            partial_result = ternary_op(partial_result, index, *i);\r\n        \r\n        return partial_result;\r\n    }\r\n    \r\n    // for_each with index itself\r\n    template<class IndexType, class Function> \r\n    inline Function for_each_with_index( \r\n        IndexType first_index,\r\n        IndexType last_index,\r\n        Function func)\r\n    {\r\n        auto index(first_index);\r\n        \r\n        for ( ; index != last_index; ++index)\r\n            func(index);\r\n        \r\n        return func;\r\n    }\r\n\r\n    // for_each over a sequence with index\r\n    template<class IndexType, class InputIterator, class Function> \r\n    inline Function for_each_with_index( \r\n        IndexType first_index,\r\n        IndexType last_index,\r\n        InputIterator first,\r\n        Function func)\r\n    {\r\n        auto index(first_index);\r\n        auto i(first);\r\n        \r\n        for ( ; index != last_index; ++index, ++i)\r\n            func(index, *i);\r\n        \r\n        return func;\r\n    }\r\n    \r\n    // generate\r\n    template<class IndexType, class ForwardIterator, class Generator> \r\n    inline void generate_with_index(\r\n        IndexType first_index,\r\n        IndexType last_index,\r\n        ForwardIterator first,\r\n        Generator gen)\r\n    {\r\n        auto index(first_index);\r\n        auto i(first);\r\n        \r\n        for ( ; index != last_index; ++index, ++i)\r\n            *i = gen(index);\r\n    }\r\n\r\n    // tansform over a sequence with index\r\n    template<class IndexType, class InputIterator, class OutputIterator, class TernaryFunction> \r\n    inline OutputIterator transform_with_index(\r\n        IndexType first_index,\r\n        IndexType last_index,\r\n        InputIterator first,\r\n        OutputIterator result,\r\n        TernaryFunction func)\r\n    {\r\n        auto index(first_index);\r\n        auto i(first);\r\n        auto o(result);\r\n        \r\n        for ( ; index != last_index; ++index, ++i, ++o)\r\n            *o = func(index, *i);\r\n        \r\n        return o;\r\n    }\r\n    \r\n    // tansform_with_index for two synchronized sequences\r\n    template<class IndexType, class InputIterator1, class InputIterator2, class OutputIterator, class TernaryFunction> \r\n    inline OutputIterator transform_with_index(\r\n        IndexType first_index,\r\n        IndexType last_index,\r\n        InputIterator1 first1,\r\n        InputIterator2 first2,\r\n        OutputIterator result,\r\n        TernaryFunction func)\r\n    {\r\n        auto index(first_index);\r\n        auto i1(first1);\r\n        auto i2(first2);\r\n        auto o (result);\r\n        \r\n        for ( ; index != last_index; ++index, ++i1, ++i2, ++o)\r\n            *o = func(index, *i1, *i2);\r\n        \r\n        return o;\r\n    }\r\n    \r\n    // simple for loop with index\r\n    template<class IndexType, class Function> \r\n    inline Function loop_with_index( \r\n        IndexType first_index,\r\n        IndexType last_index,\r\n        Function func)\r\n    {\r\n        auto index(first_index);\r\n        \r\n        for ( ; index != last_index; ++index)\r\n            func(index);\r\n        \r\n        return func;\r\n    }\r\n    \r\n    // simple for loop without index\r\n    template<class Function> \r\n    inline Function loop_without_index( \r\n        int count,\r\n        Function func)\r\n    {\r\n        for (int i = 0; i < count; ++i)\r\n            func();\r\n        \r\n        return func;\r\n    }\r\n}\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/math/BinomialCoefficient.h",
    "content": "#pragma once\r\n\r\nnamespace kt84 {\r\n\r\ntemplate <int N, int K>\r\nstruct BinomialCoefficient {\r\n    static const int Value = BinomialCoefficient<N, K - 1>::Value * (N - K + 1) / K;\r\n};\r\n\r\ntemplate <int N>\r\nstruct BinomialCoefficient<N, 0> {\r\n    static const int Value = 1;\r\n};\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/math/FiniteDifferentiator.h",
    "content": "#pragma once\r\n\r\n#include <Eigen/Core>\r\n#include <boost/static_assert.hpp>\r\n\r\nnamespace kt84 {\r\n\r\ntemplate <class _Func, int _DimIn, int _DimOut>\r\nstruct FiniteDifferentiator {\r\n    typedef Eigen::Matrix<double, _DimIn , 1> Point;\r\n    typedef Eigen::Matrix<double, _DimOut, _DimIn> Gradient;\r\n    typedef Eigen::Matrix<double, _DimIn, _DimIn> Hessian;\r\n    \r\n    Gradient gradient_fd(const Point& point, double epsilon) const {\r\n        Gradient result;\r\n        const _Func& f = *reinterpret_cast<const _Func*>(this);\r\n        for (int i = 0; i < _DimIn; ++i) {\r\n            Point delta = Point::Unit(_DimIn, i) * epsilon;\r\n            result.col(i) = (f(point + delta) - f(point - delta)) / (2 * epsilon);\r\n        }\r\n        return result;\r\n    }\r\n    Hessian hessian_fd(const Point& point, double epsilon) const {\r\n        BOOST_STATIC_ASSERT(_DimOut == 1);\r\n        Hessian result;\r\n        for (int i = 0; i < _DimIn; ++i) {\r\n            Point delta = Point::Unit(_DimIn, i) * epsilon;\r\n            result.row(i) = (gradient_fd(point + delta, epsilon) - gradient_fd(point - delta, epsilon)) / (2 * epsilon);\r\n        }\r\n        return result;\r\n    }\r\n};\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/math/GeneralizedMLS.h",
    "content": "#pragma once\r\n\r\n#include \"../PolynomialBasisGen.h\"\r\n#include \"RBFKernel.h\"\r\n#include \"FiniteDifferentiator.h\"\r\n#include <Eigen/Dense>\r\n#include <boost/tuple/tuple.hpp>\r\n#include <boost/static_assert.hpp>\r\n#include <vector>\r\n\r\nnamespace kt84 {\r\n\r\ntemplate <int _DimIn, int _DimOut, class _RBFKernel_Core, int _DegreePolynomial>\r\nstruct GeneralizedMLS\r\n    : public FiniteDifferentiator<GeneralizedMLS<_DimIn, _DimOut, _RBFKernel_Core, _DegreePolynomial>, _DimIn, _DimOut>\r\n{\r\n    enum {\r\n        DimIn  = _DimIn,\r\n        DimOut = _DimOut,\r\n        DegreePolynomial = _DegreePolynomial,\r\n    };\r\n    \r\n    typedef Eigen::Matrix<double, DimIn , 1> Point;\r\n    typedef Eigen::Matrix<double, DimOut, 1> Value;\r\n    typedef Eigen::Matrix<double, DimOut, DimIn> Gradient;\r\n    typedef PolynomialBasisGen<DimIn, DegreePolynomial> PolynomialBasisGen;\r\n    typedef RBFKernel_Bivariate<DimIn, _RBFKernel_Core> Kernel;\r\n    typedef boost::tuple<Point, Value, Gradient> Constraint;\r\n    \r\n    BOOST_STATIC_ASSERT(Kernel::Decaying);\r\n    \r\n    std::vector<Constraint> constraints;\r\n    Kernel kernel;\r\n    \r\n    void clear_constraints() {\r\n        constraints.clear();\r\n    }\r\n    void add_constraint(const Point& point, const Value& value, const Gradient& gradient) {\r\n        constraints.push_back(Constraint(point, value, gradient));\r\n    }\r\n    Value operator()(const Point& point) const {\r\n        const int P = PolynomialBasisGen::DimOut;\r\n        Eigen::Matrix<double, P, P> A;\r\n        Eigen::Matrix<double, P, DimOut> b;\r\n        A.setZero();\r\n        b.setZero();\r\n        for (size_t i = 0; i < constraints.size(); ++i) {\r\n            const Point& point_i = constraints[i].get<0>();\r\n            const Value& value_i = constraints[i].get<1>();\r\n            const Gradient& gradient_i = constraints[i].get<2>();\r\n            double w_i = kernel(point, point_i);\r\n            if (w_i == std::numeric_limits<double>::infinity())\r\n                return value_i;\r\n            w_i = w_i * w_i;\r\n            // value constraint\r\n            PolynomialBasisGen::Basis basis_i = PolynomialBasisGen::basis(point_i);\r\n            A += w_i * basis_i * basis_i.transpose();\r\n            b += w_i * basis_i * value_i.transpose();\r\n            // gradient constraint\r\n            PolynomialBasisGen::Gradient basis_i_gradient = PolynomialBasisGen::gradient(point_i);\r\n            A += w_i * basis_i_gradient * basis_i_gradient.transpose();\r\n            b += w_i * basis_i_gradient * gradient_i.transpose();\r\n        }\r\n        Eigen::Matrix<double, P, DimOut> c = A.colPivHouseholderQr().solve(b);\r\n        return c.transpose() * PolynomialBasisGen::basis(point);\r\n    }\r\n};\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/math/HermiteRBF.h",
    "content": "#pragma once\r\n\r\n#include \"../PolynomialBasisGen.h\"\r\n#include \"RBFKernel.h\"\r\n#include \"FiniteDifferentiator.h\"\r\n#include <Eigen/Dense>\r\n#include <boost/tuple/tuple.hpp>\r\n#include <boost/static_assert.hpp>\r\n#include <vector>\r\n\r\nnamespace kt84 {\r\n\r\ntemplate <int _DimIn, int _DimOut, class _RBFKernel_Core, int _DegreePolynomial>\r\nstruct HermiteRBF\r\n    : public FiniteDifferentiator<HermiteRBF<_DimIn, _DimOut, _RBFKernel_Core, _DegreePolynomial>, _DimIn, _DimOut>\r\n{\r\n    enum {\r\n        DimIn  = _DimIn,\r\n        DimOut = _DimOut,\r\n        DegreePolynomial = _DegreePolynomial,\r\n    };\r\n    \r\n    typedef Eigen::Matrix<double, DimIn , 1> Point;\r\n    typedef Eigen::Matrix<double, DimOut, 1> Value;\r\n    typedef Eigen::Matrix<double, DimOut, DimIn> Gradient;\r\n    typedef PolynomialBasisGen<DimIn, DegreePolynomial> PolynomialBasisGen;\r\n    typedef RBFKernel_Bivariate<DimIn, _RBFKernel_Core> Kernel;\r\n    typedef boost::tuple<Point, Value, Gradient> Constraint;\r\n    \r\n    BOOST_STATIC_ASSERT(Kernel::GradientAlwaysDefined);\r\n    \r\n    std::vector<Constraint> constraints;\r\n    Kernel kernel;\r\n    Eigen::Matrix<double, -1, DimOut> weights;\r\n    Eigen::MatrixXd A_matrix;\r\n    Eigen::ColPivHouseholderQR<Eigen::MatrixXd> A_factorized;\r\n    \r\n    void clear_constraints() {\r\n        constraints.clear();\r\n    }\r\n    void add_constraint(const Point& point, const Value& value, const Gradient& gradient) {\r\n        constraints.push_back(Constraint(point, value, gradient));\r\n    }\r\n    void factorize() {\r\n        const int P = PolynomialBasisGen::DimOut;\r\n        const int D = 1 + DimIn;\r\n        const size_t n = constraints.size();\r\n        const int m = D * n + P;\r\n        A_matrix = Eigen::MatrixXd::Zero(m, m);\r\n        for (size_t i = 0; i < n; ++i) {\r\n            const Point& point_i = constraints[i].get<0>();\r\n            // rbf part\r\n            for (size_t j = 0; j < n; ++j) {       // note that A is not symmetric\r\n                const Point& point_j = constraints[j].get<0>();\r\n                // make submatrix\r\n                Eigen::Matrix<double, D, D> A_sub;\r\n                A_sub.setZero();\r\n                A_sub(0, 0) = kernel(point_i, point_j);\r\n                A_sub.block<1, DimIn>(0, 1) = kernel.gradient(point_i, point_j);\r\n                A_sub.block<DimIn, 1>(1, 0) = A_sub.block<1, DimIn>(0, 1).transpose();\r\n                A_sub.block<DimIn, DimIn>(1, 1) = kernel.hessian(point_i, point_j);\r\n                // insert submatrix\r\n                A_matrix.block<D, D>(D * i, D * j) = A_sub;\r\n            }\r\n            // polynomial part\r\n            A_matrix.block<P, D>(D * n, D * i) <<\r\n                PolynomialBasisGen::basis(point_i),\r\n                PolynomialBasisGen::gradient(point_i);\r\n            A_matrix.block<D, P>(D * i, D * n) = A_matrix.block<P, D>(D * n, D * i).transpose();\r\n        }\r\n        A_factorized.compute(A_matrix);         // factorize\r\n    }\r\n    void solve() {\r\n        const int P = PolynomialBasisGen::DimOut;\r\n        const int D = 1 + DimIn;\r\n        const size_t n = constraints.size();\r\n        const int m = D * n + P;\r\n        Eigen::Matrix<double, -1, DimOut> b;\r\n        b.setZero(m, DimOut);\r\n        // constraint part\r\n        for (size_t i = 0; i < n; ++i) {\r\n            const Value& value_i = constraints[i].get<1>();\r\n            const Gradient& gradient_i = constraints[i].get<2>();\r\n            b.block<D, DimOut>(D * i, 0).transpose() << value_i, gradient_i;\r\n        }\r\n        // polynomial part is just 0\r\n        weights = A_factorized.solve(b);        // solve\r\n    }\r\n    void factorize_and_solve() {\r\n        factorize();\r\n        solve();\r\n    }\r\n    Value operator()(const Point& point) const {\r\n        const int P = PolynomialBasisGen::DimOut;\r\n        const int D = 1 + DimIn;\r\n        Value result = Value::Zero();\r\n        for (size_t i = 0; i < constraints.size(); ++i) {\r\n            const Point& point_i = constraints[i].get<0>();\r\n            // first (value) rbf part\r\n            result += kernel(point, point_i) * weights.row(D * i).transpose();\r\n            // second (gradient) rbf part\r\n            result += (kernel.gradient(point, point_i) * weights.block<DimIn, DimOut>(D * i + 1, 0)).transpose();\r\n        }\r\n        // polynomial part\r\n        PolynomialBasisGen::Basis basis = PolynomialBasisGen::basis(point);\r\n        result += (basis.transpose() * weights.bottomRows(P)).transpose();\r\n        return result;\r\n    }\r\n    Gradient gradient(const Point& point) const {\r\n        const int P = PolynomialBasisGen::DimOut;\r\n        Gradient result = Gradient::Zero();\r\n        // rbf part\r\n        for (size_t i = 0; i < constraints.size(); ++i) {\r\n            const Point& point_i = constraints[i].get<0>();\r\n            const int D = 1 + DimIn;\r\n            // first (value) rbf part\r\n            result += weights.row(D * i).transpose() * kernel.gradient(point, point_i);\r\n            // second (gradient) rbf part\r\n            result += weights.block<DimIn, DimOut>(D * i + 1, 0).transpose() * kernel.hessian(point, point_i);\r\n        }\r\n        // polynomial part\r\n        PolynomialBasisGen::Gradient b_gradient = PolynomialBasisGen::gradient(point);\r\n        result += weights.bottomRows(P).transpose() * b_gradient;\r\n        return result;\r\n    }\r\n};\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/math/MLS.h",
    "content": "#pragma once\r\n\r\n#include \"PolynomialBasisGen.h\"\r\n#include \"RBFKernel.h\"\r\n#include \"FiniteDifferentiator.h\"\r\n#include <Eigen/Dense>\r\n#include <utility>\r\n#include <vector>\r\n\r\nnamespace kt84 {\r\n\r\ntemplate <int _DimIn, int _DimOut, class _RBFKernel_Core, int _DegreePolynomial>\r\nstruct MLS\r\n    : public FiniteDifferentiator<MLS<_DimIn, _DimOut, _RBFKernel_Core, _DegreePolynomial>, _DimIn, _DimOut>\r\n{\r\n    enum {\r\n        DimIn  = _DimIn,\r\n        DimOut = _DimOut,\r\n        DegreePolynomial = _DegreePolynomial,\r\n    };\r\n    \r\n    typedef Eigen::Matrix<double, DimIn , 1> Point;\r\n    typedef Eigen::Matrix<double, DimOut, 1> Value;\r\n    typedef Eigen::Matrix<double, DimOut, DimIn> Gradient;\r\n    typedef PolynomialBasisGen<DimIn, DegreePolynomial> PolynomialBasisGen;\r\n    typedef RBFKernel_Bivariate<DimIn, _RBFKernel_Core> Kernel;\r\n    typedef std::pair<Point, Value> Constraint;\r\n    \r\n    static_assert(Kernel::Decaying, \"MLS requires its kernel to be decaying!\");\r\n    \r\n    std::vector<Constraint> constraints;\r\n    Kernel kernel;\r\n    \r\n    void clear_constraints() {\r\n        constraints.clear();\r\n    }\r\n    void add_constraint(const Point& point, const Value& value) {\r\n        constraints.push_back(Constraint(point, value));\r\n    }\r\n    Value operator()(const Point& point) const {\r\n        const int P = PolynomialBasisGen::DimOut;\r\n        Eigen::Matrix<double, P, P> A;\r\n        Eigen::Matrix<double, P, DimOut> b;\r\n        A.setZero();\r\n        b.setZero();\r\n        for (size_t i = 0; i < constraints.size(); ++i) {\r\n            const Point& point_i = constraints[i].first;\r\n            const Value& value_i = constraints[i].second;\r\n            double w_i = kernel(point, point_i);\r\n            if (w_i == std::numeric_limits<double>::infinity())\r\n                return value_i;\r\n            w_i = w_i * w_i;\r\n            PolynomialBasisGen::Basis basis_i = PolynomialBasisGen::basis(point_i);\r\n            A += w_i * basis_i * basis_i.transpose();\r\n            b += w_i * basis_i * value_i.transpose();\r\n        }\r\n        Eigen::Matrix<double, P, DimOut> c = A.colPivHouseholderQr().solve(b);\r\n        return c.transpose() * PolynomialBasisGen::basis(point);\r\n    }\r\n};\r\n\r\n// template specialization for 0-degree polynomial due to Eigen's inability to handle 1x1 matrix (which is scalar) coherently\r\ntemplate <int _DimIn, int _DimOut, class _RBFKernel_Core>\r\nstruct MLS<_DimIn, _DimOut, _RBFKernel_Core, 0>\r\n    : public FiniteDifferentiator<MLS<_DimIn, _DimOut, _RBFKernel_Core, 0>, _DimIn, _DimOut>\r\n{\r\n    enum {\r\n        DimIn  = _DimIn,\r\n        DimOut = _DimOut,\r\n        DegreePolynomial = 0,\r\n    };\r\n    \r\n    typedef Eigen::Matrix<double, DimIn , 1> Point;\r\n    typedef Eigen::Matrix<double, DimOut, 1> Value;\r\n    typedef Eigen::Matrix<double, DimOut, DimIn> Gradient;\r\n    typedef PolynomialBasisGen<DimIn, 0> PolynomialBasisGen;\r\n    typedef RBFKernel_Bivariate<DimIn, _RBFKernel_Core> Kernel;\r\n    typedef std::pair<Point, Value> Constraint;\r\n    \r\n    static_assert(Kernel::Decaying, \"MLS requires its kernel to be decaying!\");\r\n    \r\n    std::vector<Constraint> constraints;\r\n    Kernel kernel;\r\n    \r\n    void clear_constraints() {\r\n        constraints.clear();\r\n    }\r\n    void add_constraint(const Point& point, const Value& value) {\r\n        constraints.push_back(Constraint(point, value));\r\n    }\r\n    Value operator()(const Point& point) const {\r\n        Eigen::Matrix<double, 1, DimOut> b;\r\n        double A = 0;\r\n        b.setZero();\r\n        for (size_t i = 0; i < constraints.size(); ++i) {\r\n            const Point& point_i = constraints[i].first;\r\n            const Value& value_i = constraints[i].second;\r\n            double w_i = kernel(point, point_i);\r\n            if (w_i == std::numeric_limits<double>::infinity())\r\n                return value_i;\r\n            w_i = w_i * w_i;\r\n            PolynomialBasisGen::Basis basis_i = PolynomialBasisGen::basis(point_i);\r\n            A += w_i * basis_i * basis_i.transpose();\r\n            b += w_i * basis_i * value_i.transpose();\r\n        }\r\n        Eigen::Matrix<double, 1, DimOut> c = b / A;\r\n        return c.transpose() * PolynomialBasisGen::basis(point);\r\n    }\r\n};\r\n\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/math/PolynomialBasisGen.h",
    "content": "#pragma once\r\n\r\n#include \"BinomialCoefficient.h\"\r\n#include <Eigen/Core>\r\n\r\nnamespace kt84 {\r\n\r\ntemplate <int _DimIn, int _Degree>\r\nstruct PolynomialBasisGenT {\r\n    enum { DimOut = PolynomialBasisGenT<_DimIn, _Degree - 1>::DimOut + BinomialCoefficient<_DimIn + _Degree - 1, _Degree>::Value };\r\n    typedef Eigen::Matrix<double, _DimIn , 1> Point;\r\n    typedef Eigen::Matrix<double, DimOut, 1> Basis;\r\n    typedef Eigen::Matrix<double, DimOut, _DimIn> Gradient;\r\n    \r\n    static Basis basis(const Point& x) {\r\n        const int N = BinomialCoefficient<_DimIn + _Degree - 1, _Degree>::Value;\r\n        Eigen::Matrix<double, N, 1> result_partial;\r\n        int index_out = 0;\r\n        int index_in[_Degree];\r\n        for (int i = 0; i < _Degree; ++i)\r\n            index_in[i] = 0;\r\n        while (true) {\r\n            double d = 1;\r\n            for (int i = 0; i < _Degree; ++i)\r\n                d *= x[index_in[i]];\r\n            result_partial[index_out++] = d;\r\n            int is_complete = true;\r\n            for (int i = _Degree - 1; i >= 0; --i) {\r\n                if (index_in[i] == _DimIn - 1)\r\n                    continue;\r\n                ++index_in[i];\r\n                for (int j = i + 1; j < _Degree; ++j)\r\n                    index_in[j] = index_in[i];\r\n                is_complete = false;\r\n                break;\r\n            }\r\n            if (is_complete)\r\n                break;\r\n        }\r\n        Basis result;\r\n        result << PolynomialBasisGenT<_DimIn, _Degree - 1>::basis(x), result_partial;\r\n        return result;\r\n    }\r\n    static Gradient gradient(const Point& x) {\r\n        const int N = BinomialCoefficient<_DimIn + _Degree - 1, _Degree>::Value;\r\n        Eigen::Matrix<double, N, _DimIn> result_partial;\r\n        int index_out = 0;\r\n        int index_in[_Degree];\r\n        for (int i = 0; i < _Degree; ++i)\r\n            index_in[i] = 0;\r\n        while (true) {\r\n            for (int i = 0; i < _DimIn; ++i) {\r\n                int cnt = 0;\r\n                double d = 1;\r\n                for (int j = 0; j < _Degree; ++j) {\r\n                    if (index_in[j] == i) {\r\n                        ++cnt;\r\n                        continue;\r\n                    }\r\n                    d *= x[index_in[j]];\r\n                }\r\n                result_partial(index_out, i) = cnt == 0 ? 0 : cnt * d * std::pow(x[i], cnt - 1);\r\n            }\r\n            ++index_out;\r\n            int is_complete = true;\r\n            for (int i = _Degree - 1; i >= 0; --i) {\r\n                if (index_in[i] == _DimIn - 1)\r\n                    continue;\r\n                ++index_in[i];\r\n                for (int j = i + 1; j < _Degree; ++j)\r\n                    index_in[j] = index_in[i];\r\n                is_complete = false;\r\n                break;\r\n            }\r\n            if (is_complete)\r\n                break;\r\n        }\r\n        Gradient result;\r\n        result << PolynomialBasisGenT<_DimIn, _Degree - 1>::gradient(x), result_partial;\r\n        return result;\r\n    }\r\n};\r\n\r\ntemplate <int _DimIn>\r\nstruct PolynomialBasisGenT<_DimIn, 0> {\r\n    enum { DimOut = 1 };\r\n    typedef Eigen::Matrix<double, _DimIn , 1> Point;\r\n    typedef Eigen::Matrix<double, DimOut, 1> Basis;\r\n    typedef Eigen::Matrix<double, DimOut, _DimIn> Gradient;\r\n    \r\n    static Basis basis(const Point& x) { return Basis::Constant(1); }\r\n    static Gradient gradient(const Point& x) { return Gradient::Zero(); }\r\n};\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/math/RBF.h",
    "content": "#pragma once\r\n\r\n#include \"PolynomialBasisGen.h\"\r\n#include \"RBFKernel.h\"\r\n#include \"FiniteDifferentiator.h\"\r\n#include <Eigen/Dense>\r\n#include <utility>\r\n#include <vector>\r\n\r\nnamespace kt84 {\r\n\r\ntemplate <int _DimIn, int _DimOut, class _RBFKernel_Core, int _DegreePolynomial>\r\nstruct RBF\r\n    : public FiniteDifferentiator<RBF<_DimIn, _DimOut, _RBFKernel_Core, _DegreePolynomial>, _DimIn, _DimOut>\r\n{\r\n    enum {\r\n        DimIn  = _DimIn,\r\n        DimOut = _DimOut,\r\n        DegreePolynomial = _DegreePolynomial,\r\n    };\r\n    \r\n    typedef Eigen::Matrix<double, DimIn , 1> Point;                 // TODO: treat 1x1 matrix as scalar using Matrix11ToScalar\r\n    typedef Eigen::Matrix<double, DimOut, 1> Value;\r\n    typedef Eigen::Matrix<double, DimOut, DimIn> Gradient;\r\n    typedef PolynomialBasisGenT<DimIn, DegreePolynomial> PolynomialBasisGen;\r\n    typedef RBFKernel_Bivariate<DimIn, _RBFKernel_Core> Kernel;\r\n    typedef std::pair<Point, Value> Constraint;\r\n    \r\n    std::vector<Constraint> constraints;\r\n    Kernel kernel;\r\n    Eigen::Matrix<double, -1, DimOut> weights;\r\n    Eigen::MatrixXd A_matrix;\r\n    Eigen::ColPivHouseholderQR<Eigen::MatrixXd> A_factorized;\r\n    \r\n    void clear_constraints() {\r\n        constraints.clear();\r\n    }\r\n    void add_constraint(const Point& point, const Value& value) {\r\n        constraints.push_back(Constraint(point, value));\r\n    }\r\n    void factorize() {\r\n        const int P = PolynomialBasisGen::DimOut;\r\n        const size_t n = constraints.size();\r\n        const int m = n + P;\r\n        A_matrix = Eigen::MatrixXd::Zero(m, m);\r\n        for (size_t i = 0; i < n; ++i) {\r\n            const Point& point_i = constraints[i].first;\r\n            // rbf part\r\n            A_matrix(i, i) = kernel.univariate(0);\r\n            for (size_t j = i + 1; j < n; ++j) {\r\n                const Point& point_j = constraints[j].first;\r\n                A_matrix(i, j) = A_matrix(j, i) = kernel(point_i, point_j);\r\n            }\r\n            // polynomial part\r\n            A_matrix.block<P, 1>(n, i) << PolynomialBasisGen::basis(point_i);\r\n            A_matrix.block<1, P>(i, n) = A_matrix.block<P, 1>(n, i).transpose();\r\n        }\r\n        A_factorized.compute(A_matrix);         // factorize\r\n    }\r\n    void solve() {\r\n        const int P = PolynomialBasisGen::DimOut;\r\n        const size_t n = constraints.size();\r\n        const int m = n + P;\r\n        Eigen::Matrix<double, -1, DimOut> b;\r\n        b.setZero(m, DimOut);\r\n        // constraint part\r\n        for (size_t i = 0; i < n; ++i) {\r\n            const Value& value_i = constraints[i].second;\r\n            b.row(i).transpose() << value_i;\r\n        }\r\n        // polynomial part is just 0\r\n        weights = A_factorized.solve(b);        // solve\r\n    }\r\n    void factorize_and_solve() {\r\n        factorize();\r\n        solve();\r\n    }\r\n    Value operator()(const Point& point) const {\r\n        const int P = PolynomialBasisGen::DimOut;\r\n        Value result = Value::Zero();\r\n        // rbf part\r\n        for (size_t i = 0; i < constraints.size(); ++i) {\r\n            const Point& point_i = constraints[i].first;\r\n            result += kernel(point, point_i) * weights.row(i).transpose();\r\n        }\r\n        // polynomial part\r\n        auto basis = PolynomialBasisGen::basis(point);\r\n        result += (basis.transpose() * weights.bottomRows(P)).transpose();\r\n        return result;\r\n    }\r\n    Gradient gradient(const Point& point) const {\r\n        const int P = PolynomialBasisGen::DimOut;\r\n        Gradient result = Gradient::Zero();\r\n        // rbf part\r\n        for (size_t i = 0; i < constraints.size(); ++i) {\r\n            const Point& point_i = constraints[i].first;\r\n            result += weights.row(i).transpose() * kernel.gradient(point, point_i);\r\n        }\r\n        // polynomial part\r\n        auto b_gradient = PolynomialBasisGen::gradient(point);\r\n        result += weights.bottomRows(P).transpose() * b_gradient;\r\n        return result;\r\n    }\r\n};\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/math/RBFKernel.h",
    "content": "#pragma once\r\n\r\n#include <cmath>\r\n#include <limits>\r\n#include <Eigen/Core>\r\n\r\nnamespace kt84 {\r\n\r\n// the definition of functions alpha(r) and beta(r) implemented in each kernel |\r\n//-----------------------------------------------------------------------------+\r\n/*\r\n\r\ninner product of vectors x and y:\r\n    x * y := x^T y (scalar)\r\nouter product of vectors x and y: \r\n    x % y := x y^T (matrix)\r\n\r\nnotations:\r\n    x := (x_1, ..., x_N)\r\n    r := |x| = sqrt(x * x)\r\n\r\nunivariate RBF kernel:\r\n    phi(r): R+ --> R;\r\n\r\nfirst & second derivatives of phi:\r\n    phi'(r) : R+ --> R\r\n    phi\"(r) : R+ --> R\r\n\r\nexamples of phi:\r\n    phi(r) := |r|^3                             // cubic\r\n    phi(r) := exp(-r^2/(2 * sigma^2))           // Gaussian\r\n\r\nmultivariate RBF kernel:\r\n    f(x): R^N --> R\r\n    f(x) := phi(r)\r\n          = phi(|x|)\r\n\r\ngradient:\r\n    g(x): R^N --> R^N\r\n    g(x) := df/dx(x)\r\n          = phi'(r) / r * x\r\n\r\ndefinition of alpha:\r\n    alpha(r) := phi'(r) / r\r\n    g(x) = alpha(r) * x\r\n\r\nHessian:\r\n    H(x): R^N --> R^(NxN)\r\n    H(x) := d^2f/dx^2\r\n          = dg/dx\r\n          = {(r * phi\"(r) - phi'(r)) / r^3} * (x % x) + {phi'(r) / r} * I\r\n\r\ndefinition of beta:\r\n    beta(r) := (r * phi\"(r) - phi'(r)) / r^3\r\n    H(x) = alpha(r) * I + beta(r) * (x % x);\r\n\r\n*/\r\n\r\n// Gradient is always defined even for singular (r=0) cases --> can be used with Hermite RBF |\r\n//-------------------------------------------------------------------------------------------+\r\nstruct RBFKernel_Gaussian {\r\n    struct Param {\r\n        double sigma;\r\n        Param(double sigma = 1) : sigma(sigma) {}\r\n    } param;\r\n    double operator()       (double r) const { return std::exp(-r * r / (2 * param.sigma * param.sigma)); }\r\n    double derivative_first (double r) const { return operator()(r) * r / (-param.sigma * param.sigma); }\r\n    double derivative_second(double r) const { return operator()(r) * (r * r - param.sigma * param.sigma) / (param.sigma * param.sigma * param.sigma * param.sigma); }\r\n    double alpha_singular() const { return -1 / (param.sigma * param.sigma); }\r\n    static const bool AlphaAlwaysDefined = true;\r\n    static const bool Decaying = true;\r\n};\r\n\r\nstruct RBFKernel_SquaredInverse {\r\n    struct Param {\r\n        double epsilon;\r\n        Param(double epsilon = 0) : epsilon(epsilon) {}\r\n    } param;\r\n    double operator()(double r) const {\r\n        if (r == 0 && param.epsilon == 0)\r\n            return std::numeric_limits<double>::infinity();         // indication of hard constraint (for MLS)\r\n        return 1 / (r * r + param.epsilon * param.epsilon);\r\n    }\r\n    double derivative_first(double r) const {\r\n        double t = operator()(r);\r\n        return -2 * r * t * t;\r\n    }\r\n    double derivative_second(double r) const {\r\n        double t = operator()(r);\r\n        return (6 * r * r - 2 * param.epsilon * param.epsilon) * t * t * t;\r\n    }\r\n    double alpha_singular() const {\r\n        return -2 / (param.epsilon * param.epsilon * param.epsilon * param.epsilon);\r\n    }\r\n    static const bool AlphaAlwaysDefined = true;\r\n    static const bool Decaying = true;\r\n};\r\n\r\nstruct RBFKernel_Wendland {\r\n    // Wendland, H. \r\n    // Piecewise polynomial, positive definite and compactly supported radial basis functions of minimal degree. \r\n    // Advances in Computational Mathematics 4, 389--396, 1995.\r\n    struct Param {\r\n        double support;\r\n        Param(double support = 1) : support(support) {}\r\n    } param;\r\n    double operator()(double r) const {\r\n        double t = r / param.support;\r\n        if (t > 1)\r\n            return 0;\r\n        return (1 - t) * (1 - t) * (1 - t) * (1 - t) * (4 * t + 1);\r\n    }\r\n    double derivative_first(double r) const {\r\n        double t = r / param.support;\r\n        if (t > 1)\r\n            return 0;\r\n        return -20 * t * (1 - t) * (1 - t) * (1 - t) / param.support;\r\n    }\r\n    double derivative_second(double r) const {\r\n        double t = r / param.support;\r\n        if (t > 1)\r\n            return 0;\r\n        return 20 * (1 - t) * (1 - t) * (4 * t - 1) / (param.support * param.support);\r\n    }\r\n    double alpha_singular() const { return -20 / (param.support * param.support); }\r\n    static const bool AlphaAlwaysDefined = true;\r\n    static const bool Decaying = true;\r\n};\r\n\r\nstruct RBFKernel_Cubed {\r\n    struct Param {} param;\r\n    double operator()       (double r) const { return r * r * r; }\r\n    double derivative_first (double r) const { return 3 * r * r; }\r\n    double derivative_second(double r) const { return 6 * r; }\r\n    double alpha_singular() const { return 0; }\r\n    static const bool AlphaAlwaysDefined = true;\r\n    static const bool Decaying = false;\r\n};\r\n\r\n// gradient is undefined for singular (r=0) cases --> cannot be used with HermiteRBF |\r\n//-----------------------------------------------------------------------------------+\r\nstruct RBFKernel_Identity {\r\n    struct Param {} param;\r\n    double operator()       (double r) const { return r; }\r\n    double derivative_first (double r) const { return 1; }\r\n    double derivative_second(double r) const { return 0; }\r\n    double alpha_singular() const { throw std::logic_error(\"undefined!\"); }\r\n    static const bool AlphaAlwaysDefined = false;\r\n    static const bool Decaying = false;\r\n};\r\n\r\nstruct RBFKernel_SquaredLog {\r\n    struct Param {} param;\r\n    double operator()(double r) const {\r\n        if (r == 0)\r\n            return 0;\r\n        return r * r * std::log(r);\r\n    }\r\n    double derivative_first(double r) const {\r\n        if (r == 0)\r\n            return 0;\r\n        return 2 * r * std::log(r) + r;\r\n    }\r\n    double derivative_second(double r) const {\r\n        if (r == 0)\r\n            return -std::numeric_limits<double>::infinity();        // not sure if this treatment is correct...\r\n        return 2 * std::log(r) + 3;\r\n    }\r\n    double alpha_singular() const { throw std::logic_error(\"undefined!\"); }\r\n    static const bool AlphaAlwaysDefined = false;\r\n    static const bool Decaying = false;\r\n};\r\n\r\n// general template classes |\r\n//--------------------------+\r\n\r\ntemplate <class _RBFKernel_Core>\r\nstruct RBFKernel_Univariate {\r\n    typedef _RBFKernel_Core Core;\r\n    \r\n    Core core;\r\n    \r\n    double operator()(double r) const { return core(r); }\r\n    double derivative_first(double r) const { return core.derivative_first(r); }\r\n    double derivative_second(double r) const { return core.derivative_second(r); }\r\n    double alpha(double r) const { return core.derivative_first(r) / r; }\r\n    double beta(double r) const { return (r * core.derivative_second(r) - core.derivative_first(r)) / (r * r * r); }\r\n};\r\n\r\ntemplate <int _Dim, class _RBFKernel_Core>\r\nstruct RBFKernel_Bivariate {\r\n    enum { Dim  = _Dim };\r\n    \r\n    typedef Eigen::Matrix<double, Dim, 1> Point;\r\n    typedef Eigen::Matrix<double, 1, Dim> Gradient;\r\n    typedef Eigen::Matrix<double, Dim, Dim> Hessian;\r\n    typedef RBFKernel_Univariate<_RBFKernel_Core> Univariate;\r\n    \r\n    static const bool GradientAlwaysDefined = Univariate::Core::AlphaAlwaysDefined;\r\n    static const bool Decaying              = Univariate::Core::Decaying;\r\n    \r\n    Univariate univariate;\r\n    \r\n    double operator()(const Point& p0, const Point& p1) const { return univariate((p1 - p0).norm()); }\r\n    Gradient gradient(const Point& p_variable, const Point& p_fixed) const {\r\n        Point p_diff = p_variable - p_fixed;\r\n        double r = p_diff.norm();\r\n        if (r == 0)\r\n            return Gradient::Zero();\r\n        return univariate.alpha(r) * p_diff.transpose();\r\n    }\r\n    Hessian hessian(const Point& p_variable, const Point& p_fixed) const {\r\n        Point p_diff = p_variable - p_fixed;\r\n        double r = p_diff.norm();\r\n        if (r == 0)\r\n            return univariate.core.alpha_singular() * Hessian::Identity();\r\n        return univariate.alpha(r) * Hessian::Identity() + univariate.beta(r) * p_diff * p_diff.transpose();\r\n    }\r\n    \r\n    // easy access to kernel parameters\r\n    typename Univariate::Core::Param& param() { return univariate.core.param; }\r\n    const typename Univariate::Core::Param& param() const { return univariate.core.param; }\r\n};\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/math/interpolant_test.cpp",
    "content": "#include <iostream>\r\n#include <fstream>\r\n#include <sstream>\r\n#include <string>\r\n#include <iomanip>\r\n#include \"RBF.h\"\r\n#include \"MLS.h\"\r\n#include \"HermiteRBF.h\"\r\n#include \"GeneralizedMLS.h\"\r\n#include <boost/mpl/list.hpp>\r\n#include <boost/mpl/for_each.hpp>\r\n#include <boost/mpl/int.hpp>\r\nusing namespace std;\r\nusing namespace kt84;\r\nnamespace mpl = boost::mpl;\r\n\r\n// utility for interpolation algorithms |\r\n//--------------------------------------+\r\ntemplate <template <int, int, class, int> class FuncT>\r\nstruct FuncUtil;\r\ntemplate <> struct FuncUtil<RBF> {\r\n    static const char* getName() { return \"RBF\"; }\r\n    template <class Func> static void add_constraint(Func& f, const typename Func::Point& p, const typename Func::Value& v, const typename Func::Gradient& g) { f.add_constraint(p, v); }\r\n    template <class Func> static void preprocess(Func& f) { f.factorize_and_solve(); }\r\n    template <class Func> static typename Func::Gradient gradient(const Func& f, const typename Func::Point& p) { return f.gradient(p); }\r\n    template <class Func>\r\n    static pair<double, double> getMaxError(const Func& f, double epsilon) {\r\n        pair<double, double> result(0, 0);\r\n        for (size_t i = 0; i < f.constraints.size(); ++i) {\r\n            double error_v = (f(f.constraints[i].first) - f.constraints[i].second).norm();\r\n            result.first = max<double>(result.first, error_v);\r\n        }\r\n        return result;\r\n    }\r\n};\r\ntemplate <> struct FuncUtil<MLS> {\r\n    static const char* getName() { return \"MLS\"; }\r\n    template <class Func> static void add_constraint(Func& f, const typename Func::Point& p, const typename Func::Value& v, const typename Func::Gradient& g) { f.add_constraint(p, v); }\r\n    template <class Func> static void preprocess(Func& f) { }\r\n    template <class Func> static typename Func::Gradient gradient(const Func& f, const typename Func::Point& p) { return typename Func::Gradient::Zero(); }\r\n    template <class Func>\r\n    static pair<double, double> getMaxError(const Func& f, double epsilon) {\r\n        pair<double, double> result(0, 0);\r\n        for (size_t i = 0; i < f.constraints.size(); ++i) {\r\n            double error_v = (f(f.constraints[i].first) - f.constraints[i].second).norm();\r\n            result.first = max<double>(result.first, error_v);\r\n        }\r\n        return result;\r\n    }\r\n};\r\ntemplate <> struct FuncUtil<HermiteRBF> {\r\n    static const char* getName() { return \"HRBF\"; }\r\n    template <class Func> static void add_constraint(Func& f, const typename Func::Point& p, const typename Func::Value& v, const typename Func::Gradient& g) { f.add_constraint(p, v, g); }\r\n    template <class Func> static void preprocess(Func& f) { f.factorize_and_solve(); }\r\n    template <class Func> static typename Func::Gradient gradient(const Func& f, const typename Func::Point& p) { return f.gradient(p); }\r\n    template <class Func>\r\n    static pair<double, double> getMaxError(const Func& f, double epsilon) {\r\n        pair<double, double> result(0, 0);\r\n        for (size_t i = 0; i < f.constraints.size(); ++i) {\r\n            double error_v = (f(f.constraints[i].get<0>()) - f.constraints[i].get<1>()).norm();\r\n            double error_g = (f.gradient_fd(f.constraints[i].get<0>(), epsilon) - f.constraints[i].get<2>()).norm();\r\n            result.first  = max<double>(result.first , error_v);\r\n            result.second = max<double>(result.second, error_g);\r\n        }\r\n        return result;\r\n    }\r\n};\r\ntemplate <> struct FuncUtil<GeneralizedMLS> {\r\n    static const char* getName() { return \"GMLS\"; }\r\n    template <class Func> static void add_constraint(Func& f, const typename Func::Point& p, const typename Func::Value& v, const typename Func::Gradient& g) { f.add_constraint(p, v, g); }\r\n    template <class Func> static void preprocess(Func& f) { }\r\n    template <class Func> static typename Func::Gradient gradient(const Func& f, const typename Func::Point& p) { return typename Func::Gradient::Zero(); }\r\n    template <class Func>\r\n    static pair<double, double> getMaxError(const Func& f, double epsilon) {\r\n        pair<double, double> result(0, 0);\r\n        for (size_t i = 0; i < f.constraints.size(); ++i) {\r\n            double error_v = (f(f.constraints[i].get<0>()) - f.constraints[i].get<1>()).norm();\r\n            double error_g = (f.gradient_fd(f.constraints[i].get<0>(), epsilon) - f.constraints[i].get<2>()).norm();\r\n            result.first  = max<double>(result.first , error_v);\r\n            result.second = max<double>(result.second, error_g);\r\n        }\r\n        return result;\r\n    }\r\n};\r\n\r\n// utility for RBF kernels |\r\n//-------------------------+\r\ntemplate <class RBFKernel_Core>\r\nstruct KernelUtil;\r\ntemplate <> struct KernelUtil<RBFKernel_Gaussian      > { static const char* getName() { return \"Gauss\"; } static RBFKernel_Gaussian      ::Param getParam() { return RBFKernel_Gaussian      ::Param(10); } };\r\ntemplate <> struct KernelUtil<RBFKernel_SquaredInverse> { static const char* getName() { return \"SqInv\"; } static RBFKernel_SquaredInverse::Param getParam() { return RBFKernel_SquaredInverse::Param(20); } };\r\ntemplate <> struct KernelUtil<RBFKernel_Wendland      > { static const char* getName() { return \"Wendl\"; } static RBFKernel_Wendland      ::Param getParam() { return RBFKernel_Wendland      ::Param(1.5); } };\r\ntemplate <> struct KernelUtil<RBFKernel_Cubed         > { static const char* getName() { return \"Cubed\"; } static RBFKernel_Cubed         ::Param getParam() { return RBFKernel_Cubed         ::Param()   ; } };\r\ntemplate <> struct KernelUtil<RBFKernel_Identity      > { static const char* getName() { return \"Ident\"; } static RBFKernel_Identity      ::Param getParam() { return RBFKernel_Identity      ::Param()   ; } };\r\ntemplate <> struct KernelUtil<RBFKernel_SquaredLog    > { static const char* getName() { return \"SqLog\"; } static RBFKernel_SquaredLog    ::Param getParam() { return RBFKernel_SquaredLog    ::Param()   ; } };\r\n\r\n// test functions |\r\n//----------------+\r\ntemplate <int Dim, template <int, int, class, int> class FuncT>\r\nstruct Tester;\r\n\r\n// 1D test\r\ntemplate <template <int, int, class, int> class FuncT>\r\nstruct Tester<1, FuncT> {\r\n    template <class RBFKernel_Core, int DegreePolynomial>\r\n    static void go(const typename RBFKernel_Core::Param& param) {\r\n        typedef FuncT<1, 1, RBFKernel_Core, DegreePolynomial> Func;\r\n        typedef Func::Point Point;\r\n        typedef Func::Value Value;\r\n        typedef Func::Gradient Gradient;\r\n        \r\n        Func f;\r\n        f.kernel.param() = param;\r\n        \r\n        ifstream fin(\"input1d.txt\");\r\n        if (!fin)\r\n            throw exception(\"input1d.txt not found!\");\r\n        while (!fin.eof()) {\r\n            Point p;\r\n            Value v;\r\n            Gradient g;\r\n            \r\n            fin >> p[0] >> v[0] >> g[0];\r\n            if (!fin.eof())\r\n                FuncUtil<FuncT>::add_constraint(f, p, v, g);\r\n        }\r\n        \r\n        FuncUtil<FuncT>::preprocess(f);\r\n        \r\n        stringstream fname;\r\n        fname << \"test1d_\" << FuncUtil<FuncT>::getName() << \"_\" << KernelUtil<RBFKernel_Core>::getName() << \"_p\" << DegreePolynomial << \".txt\";\r\n        ofstream fout(fname.str().c_str());\r\n        // report error first\r\n        pair<double, double> maxError = FuncUtil<FuncT>::getMaxError(f, 0.00001);\r\n        fout << \"# max error (value, gradient): (\" << maxError.first << \", \" << maxError.second << \")\" << endl << endl;\r\n        // plot data\r\n        const int N = 100;\r\n        for (double i = 0; i <= N; ++i) {\r\n            Func::Point point = Func::Point::Constant(i / N);\r\n            Func::Value value = f(point);\r\n            Func::Gradient gradient = FuncUtil<FuncT>::gradient(f, point);\r\n            Func::Gradient gradient_fd = f.gradient_fd(point, 0.00001);\r\n            fout\r\n                << setw(12) << point[0] << \" \"\r\n                << setw(12) << value[0] << \" \"\r\n                << setw(12) << gradient[0] << \" \"\r\n                << setw(12) << gradient_fd[0] << \" \"\r\n                << endl;\r\n        }\r\n    }\r\n    // generate gnuplot commands |\r\n    //---------------------------+\r\n    template <class RBFKernel_Core>\r\n    static void genCmd(int DegreePolynomial) {\r\n        stringstream fname;\r\n        const char* funcName = FuncUtil<FuncT>::getName();\r\n        const char* kernelName = KernelUtil<RBFKernel_Core>::getName();\r\n        fname << \"cmd1d_\" << funcName << \"_\" << kernelName << \".txt\";\r\n        ofstream fout(fname.str().c_str());\r\n        fout << \"plot\\\\\" << endl;\r\n        for (int i = 0; i <= DegreePolynomial; ++i) {\r\n            fout << \"    \\\"test1d_\" << funcName << \"_\" << kernelName << \"_p\" << i << \".txt\\\" w linespoints\";\r\n            if (i < DegreePolynomial)\r\n                fout << \",\\\\\";\r\n            fout << endl;\r\n        }\r\n        fout << \"pause -1\" << endl;\r\n        fout.close();\r\n        fname.str(\"\");\r\n        fname << \"cmd1d_\" << funcName << \"_\" << kernelName << \"_g.txt\";\r\n        fout.open(fname.str().c_str());\r\n        fout << \"plot\\\\\" << endl;\r\n        for (int i = 0; i <= DegreePolynomial; ++i) {\r\n            fout << \"    \\\"test1d_\" << funcName << \"_\" << kernelName << \"_p\" << i << \".txt\\\" u 1:4 w linespoints\";\r\n            if (i < DegreePolynomial)\r\n                fout << \",\\\\\";\r\n            fout << endl;\r\n        }\r\n        fout << \"pause -1\" << endl;\r\n    }\r\n};\r\n\r\n// 2D test\r\ntemplate <template <int, int, class, int> class FuncT>\r\nstruct Tester<2, FuncT> {\r\n    template <class RBFKernel_Core, int DegreePolynomial>\r\n    static void go(const typename RBFKernel_Core::Param& param) {\r\n        typedef FuncT<2, 1, RBFKernel_Core, DegreePolynomial> Func;\r\n        typedef Func::Point Point;\r\n        typedef Func::Value Value;\r\n        typedef Func::Gradient Gradient;\r\n        \r\n        Func f;\r\n        f.kernel.param() = param;\r\n        \r\n        ifstream fin(\"input2d.txt\");\r\n        if (!fin)\r\n            throw exception(\"input2d.txt not found!\");\r\n        while (!fin.eof()) {\r\n            Point p;\r\n            Value v;\r\n            Gradient g;\r\n            \r\n            fin >> p[0] >> p[1] >> v[0] >> g[0] >> g[1];\r\n            if (!fin.eof())\r\n                FuncUtil<FuncT>::add_constraint(f, p, v, g);\r\n        }\r\n        \r\n        FuncUtil<FuncT>::preprocess(f);\r\n        \r\n        stringstream fname;\r\n        fname << \"test2d_\" << FuncUtil<FuncT>::getName() << \"_\" << KernelUtil<RBFKernel_Core>::getName() << \"_p\" << DegreePolynomial << \".txt\";\r\n        ofstream fout(fname.str().c_str());\r\n        // report error first\r\n        pair<double, double> maxError = FuncUtil<FuncT>::getMaxError(f, 0.00001);\r\n        fout << \"# max error (value, gradient): (\" << maxError.first << \", \" << maxError.second << \")\" << endl << endl;\r\n        // plot data\r\n        const int N = 32;\r\n        for (double j = 0; j <= N; ++j) {\r\n            for (double i = 0; i <= N; ++i) {\r\n                Func::Point point = Func::Point(i / N, j / N);\r\n                Func::Value value = f(point);\r\n                Func::Gradient gradient = FuncUtil<FuncT>::gradient(f, point);\r\n                Func::Gradient gradient_fd = f.gradient_fd(point, 0.00001);\r\n                fout\r\n                    << setw(12) << point[0] << \" \"\r\n                    << setw(12) << point[1] << \" \"\r\n                    << setw(12) << value[0] << \" \"\r\n                    << setw(12) << gradient[0] << \" \"\r\n                    << setw(12) << gradient[1] << \" \"\r\n                    << setw(12) << gradient_fd[0] << \" \"\r\n                    << setw(12) << gradient_fd[1] << \" \"\r\n                    << endl;\r\n            }\r\n            fout << endl;\r\n        }\r\n    }\r\n    // generate gnuplot commands |\r\n    //---------------------------+\r\n    template <class RBFKernel_Core>\r\n    static void genCmd(int DegreePolynomial) {\r\n        const char* funcName = FuncUtil<FuncT>::getName();\r\n        const char* kernelName = KernelUtil<RBFKernel_Core>::getName();\r\n        for (int i = 0; i <= DegreePolynomial; ++i) {\r\n            // value\r\n            stringstream fname;\r\n            fname << \"cmd2d_\" << funcName << \"_\" << kernelName << \"_p\" << i << \".txt\";\r\n            ofstream fout(fname.str().c_str());\r\n            fout << \"set pm3d; unset surface; set pm3d hidden3d 100;set view 60, 320\\n\";\r\n            fout << \"splot \\\"test2d_\" << funcName << \"_\" << kernelName << \"_p\" << i << \".txt\\\" u 1:2:3\\n\";\r\n            fout << \"pause -1\\n\";\r\n            fout.close();\r\n            // gradient\r\n            fname.str(\"\");\r\n            fname << \"cmd2d_\" << funcName << \"_\" << kernelName << \"_p\" << i << \"_g.txt\";\r\n            fout.open(fname.str().c_str());\r\n            fout << \"set pm3d; unset surface; set pm3d hidden3d 100;set view 60, 320;\\n\";\r\n            fout << \"splot \\\"test2d_\" << funcName << \"_\" << kernelName << \"_p\" << i << \"_g.txt\\\" u 1:2:6\\n\";\r\n            fout << \"pause -1\\n\";\r\n        }\r\n    }\r\n};\r\n\r\n// list of valid kernels for each algorithm |\r\n//------------------------------------------+\r\ntemplate <template <int, int, class, int> class FuncT>\r\nstruct KernelList;\r\ntemplate <> struct KernelList<RBF> {\r\n    typedef mpl::list<\r\n        RBFKernel_Gaussian      ,\r\n        RBFKernel_SquaredInverse,\r\n        RBFKernel_Wendland      ,\r\n        RBFKernel_Cubed         ,\r\n        RBFKernel_Identity      ,\r\n        RBFKernel_SquaredLog    \r\n    > Value;\r\n};\r\ntemplate <> struct KernelList<HermiteRBF> {\r\n    typedef mpl::list<\r\n        RBFKernel_Gaussian      ,\r\n        RBFKernel_SquaredInverse,\r\n        RBFKernel_Cubed         \r\n    > Value;\r\n};\r\ntemplate <> struct KernelList<MLS> {\r\n    typedef mpl::list<\r\n        RBFKernel_Gaussian      ,\r\n        RBFKernel_SquaredInverse,\r\n        RBFKernel_Wendland      \r\n    > Value;\r\n};\r\ntemplate <> struct KernelList<GeneralizedMLS> {\r\n    typedef mpl::list<\r\n        RBFKernel_Gaussian      ,\r\n        RBFKernel_SquaredInverse,\r\n        RBFKernel_Wendland      \r\n    > Value;\r\n};\r\n\r\n// utility for looping over parameters |\r\n//-------------------------------------+\r\ntemplate <template <int, int, class, int> class FuncT>\r\nstruct TestLooper {\r\n    static void go() {\r\n        typedef mpl::list<\r\n            mpl::int_<1>,\r\n            mpl::int_<2>\r\n        > DimList;\r\n        mpl::for_each<DimList>(LoopDim());\r\n    }\r\n    struct LoopDim {\r\n        template <class IntDim>\r\n        void operator()(const IntDim&) const {\r\n            mpl::for_each<KernelList<FuncT>::Value>(LoopKernel<IntDim::value>());\r\n        }\r\n        template <int Dim>\r\n        struct LoopKernel {\r\n            template <class RBFKernel>\r\n            void operator()(const RBFKernel&) const {\r\n                typedef mpl::list<\r\n                    mpl::int_<0>,\r\n                    mpl::int_<1>,\r\n                    mpl::int_<2>\r\n                > DegreeList;\r\n                mpl::for_each<DegreeList>(LoopDegree<RBFKernel>());\r\n                Tester<Dim, FuncT>::genCmd<RBFKernel>(2);\r\n            }\r\n            template <class RBFKernel>\r\n            struct LoopDegree {\r\n                template <class IntDegree>\r\n                void operator()(const IntDegree&) const {\r\n                    Tester<Dim, FuncT>::go<RBFKernel, IntDegree::value>(KernelUtil<RBFKernel>::getParam());\r\n                }\r\n            };\r\n        };\r\n    };\r\n};\r\n\r\nint main() {\r\n    TestLooper<RBF           >::go();       // list of templates cannot be handled by Boost.MPL\r\n    TestLooper<MLS           >::go();\r\n    TestLooper<HermiteRBF    >::go();\r\n    TestLooper<GeneralizedMLS>::go();\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/multi_array.h",
    "content": "#pragma once\r\n#include <vector>\r\n#include <Eigen/Core>\r\n\r\nnamespace kt84 {\r\n    namespace internal {\r\n        template <typename T, int N>\r\n        struct multi_array_helper;\r\n    }\r\n\r\ntemplate <typename T, int N>\r\nstruct multi_array {\r\n    friend struct internal::multi_array_helper<T, N>;\r\n    \r\n    typedef Eigen::Matrix<int, N, 1> VectorNi;\r\n\r\n    static int total_size(const VectorNi& size) {\r\n        int result = 1;\r\n        for (int i = 0; i < N; ++i) result *= size[i];\r\n        return result;\r\n    }\r\n    \r\n    // ctor()\r\n    multi_array()\r\n        : size_(VectorNi::Zero())\r\n    {}\r\n    // ctor(size)\r\n    multi_array(const VectorNi& size__)\r\n        : size_(size__)\r\n        , data(total_size(size_))\r\n    {}\r\n    // ctor(size, val)\r\n    multi_array(const VectorNi& size__, const T& val)\r\n        : size_(size__)\r\n        , data(total_size(size_), val)\r\n    {}\r\n    // ctor(sx, ...) specialized for 2D & 3D\r\n    multi_array(int sx, int sy)         { internal::multi_array_helper<T, N>::ctor(sx, sy,     size_, data); }\r\n    multi_array(int sx, int sy, int sz) { internal::multi_array_helper<T, N>::ctor(sx, sy, sz, size_, data); }\r\n    multi_array(int sx, int sy,         const T& val) { internal::multi_array_helper<T, N>::ctor(sx, sy,     val, size_, data); }\r\n    multi_array(int sx, int sy, int sz, const T& val) { internal::multi_array_helper<T, N>::ctor(sx, sy, sz, val, size_, data); }\r\n    \r\n    void clear() {\r\n        size_.setZero();\r\n        data.clear();\r\n    }\r\n    \r\n    VectorNi size() const { return size_; }\r\n    int size(int coord) const { return size_[coord]; }\r\n    int total_size() const { return total_size(size_); }\r\n    bool empty() const { return data.empty(); }\r\n    \r\n    // width() and height() for 2D & 3D, depth() for 3D\r\n    int width () const { return internal::multi_array_helper<T, N>::width (*this); }\r\n    int height() const { return internal::multi_array_helper<T, N>::height(*this); }\r\n    int depth () const { return internal::multi_array_helper<T, N>::depth (*this); }\r\n    \r\n    int unroll_index(const VectorNi& index) const {\r\n        int result = index[N - 1];\r\n        for (int i = N - 2; i >= 0; --i) {\r\n            result *= size_[i];\r\n            result += index[i];\r\n        }\r\n        return result;\r\n    }\r\n    int unroll_index(int ix, int iy)         const { return internal::multi_array_helper<T, N>::unroll_index(*this, ix, iy); }\r\n    int unroll_index(int ix, int iy, int iz) const { return internal::multi_array_helper<T, N>::unroll_index(*this, ix, iy, iz); }\r\n    \r\n    // operator(index)\r\n    const T& operator()(const VectorNi& index) const { return data[unroll_index(index)]; }\r\n          T& operator()(const VectorNi& index)       { return data[unroll_index(index)]; }\r\n    // operator(ix, ...) specialized for 2D & 3D\r\n    const T& operator()(int ix, int iy)         const { return internal::multi_array_helper<T, N>::at(*this, ix, iy); }\r\n          T& operator()(int ix, int iy)               { return internal::multi_array_helper<T, N>::at(*this, ix, iy); }\r\n    const T& operator()(int ix, int iy, int iz) const { return internal::multi_array_helper<T, N>::at(*this, ix, iy, iz); }\r\n          T& operator()(int ix, int iy, int iz)       { return internal::multi_array_helper<T, N>::at(*this, ix, iy, iz); }\r\n    // operator[int]\r\n    const T& operator[](int i) const { return data[i]; }\r\n          T& operator[](int i)       { return data[i]; }\r\n    \r\n    // resize(size)\r\n    void resize(const VectorNi& size__) {\r\n        size_ = size__;\r\n        data.resize(total_size(size_));\r\n    }\r\n    // resize(size, val)\r\n    void resize(const VectorNi& size__, const T& val) {\r\n        size_ = size__;\r\n        data.resize(total_size(size_), val);\r\n    }\r\n    // resize(sx, ...) specialized for 2D & 3D\r\n    void resize(int sx, int sy)         { internal::multi_array_helper<T, N>::resize(*this, sx, sy); }\r\n    void resize(int sx, int sy, int sz) { internal::multi_array_helper<T, N>::resize(*this, sx, sy, sz); }\r\n    void resize(int sx, int sy,         const T& val) { internal::multi_array_helper<T, N>::resize(*this, sx, sy, val); }\r\n    void resize(int sx, int sy, int sz, const T& val) { internal::multi_array_helper<T, N>::resize(*this, sx, sy, sz, val); }\r\n    \r\n    // begin/end\r\n    typedef typename std::vector<T>::iterator iterator;\r\n    typedef typename std::vector<T>::const_iterator const_iterator;\r\n    typename iterator       begin()       { return data.begin(); }\r\n    typename iterator       end  ()       { return data.end  (); }\r\n    typename const_iterator begin() const { return data.begin(); }\r\n    typename const_iterator end  () const { return data.end  (); }\r\n    typename const_iterator cbegin() const { return begin(); }\r\n    typename const_iterator cend  () const { return end  (); }\r\n    \r\nprivate:\r\n    VectorNi size_;\r\n    std::vector<T> data;\r\n};\r\n\r\n    namespace internal {\r\n        template <typename T>\r\n        struct multi_array_helper<T, 2> {\r\n            static void ctor(int sx, int sy, Eigen::Vector2i& size, std::vector<T>& data) {\r\n                size = Eigen::Vector2i(sx, sy);\r\n                data.resize(multi_array<T, 2>::total_size(size));\r\n            }\r\n            static void ctor(int sx, int sy, const T& val, Eigen::Vector2i& size, std::vector<T>& data) {\r\n                size = Eigen::Vector2i(sx, sy);\r\n                data.resize(multi_array<T, 2>::total_size(size), val);\r\n            }\r\n            static int width (const multi_array<T, 2>& m) { return m.size_.x(); }\r\n            static int height(const multi_array<T, 2>& m) { return m.size_.y(); }\r\n            static int unroll_index(const multi_array<T, 2>& m, int ix, int iy) { return m.unroll_index(Eigen::Vector2i(ix, iy)); }\r\n            static const T& at(const multi_array<T, 2>& m, int ix, int iy) { return m(Eigen::Vector2i(ix, iy)); }\r\n            static       T& at(      multi_array<T, 2>& m, int ix, int iy) { return m(Eigen::Vector2i(ix, iy)); }\r\n            static void resize(multi_array<T, 2>& m, int sx, int sy)               { m.resize(Eigen::Vector2i(sx, sy)); }\r\n            static void resize(multi_array<T, 2>& m, int sx, int sy, const T& val) { m.resize(Eigen::Vector2i(sx, sy), val); }\r\n        };\r\n        template <typename T>\r\n        struct multi_array_helper<T, 3> {\r\n            static void ctor(int sx, int sy, int sz, Eigen::Vector3i& size, std::vector<T>& data) {\r\n                size = Eigen::Vector3i(sx, sy, sz);\r\n                data.resize(multi_array<T, 3>::total_size(size));\r\n            }\r\n            static void ctor(int sx, int sy, int sz, const T& val, Eigen::Vector3i& size, std::vector<T>& data) {\r\n                size = Eigen::Vector3i(sx, sy, sz);\r\n                data.resize(multi_array<T, 3>::total_size(size), val);\r\n            }\r\n            static int width (const multi_array<T, 3>& m) { return m.size_.x(); }\r\n            static int height(const multi_array<T, 3>& m) { return m.size_.y(); }\r\n            static int depth (const multi_array<T, 3>& m) { return m.size_.z(); }\r\n            static int unroll_index(const multi_array<T, 3>& m, int ix, int iy, int iz) { return m.unroll_index(Eigen::Vector3i(ix, iy, iz)); }\r\n            static const T& at(const multi_array<T, 3>& m, int ix, int iy, int iz) { return m(Eigen::Vector3i(ix, iy, iz)); }\r\n            static       T& at(      multi_array<T, 3>& m, int ix, int iy, int iz) { return m(Eigen::Vector3i(ix, iy, iz)); }\r\n            static void resize(multi_array<T, 3>& m, int sx, int sy, int sz)               { m.resize(Eigen::Vector3i(sx, sy, sz)); }\r\n            static void resize(multi_array<T, 3>& m, int sx, int sy, int sz, const T& val) { m.resize(Eigen::Vector2i(sx, sy, sz), val); }\r\n        };\r\n    }\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/myassert.h",
    "content": "#pragma once\r\n\r\nnamespace kt84 {\r\n\r\n#ifdef NDEBUG\r\n    inline void myassert(bool test) {}\r\n#else\r\n    inline void myassert(bool test) { test ? 1 : (*reinterpret_cast<int*>(0) = 1); }\r\n#endif\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/DerivedPtrHolder.h",
    "content": "#pragma once\r\n\r\nnamespace kt84 {\r\n    template <typename TDerived, class TBase>\r\n    struct DerivedPtrHolder {\r\n        DerivedPtrHolder() : derived_ptr(static_cast<TDerived*>(this)) {}\r\n        DerivedPtrHolder(const DerivedPtrHolder& rhs) : derived_ptr(static_cast<TDerived*>(this)) {}\r\n        DerivedPtrHolder& operator=(const DerivedPtrHolder& rhs) {\r\n            derived_ptr = static_cast<TDerived*>(this);\r\n            return *this;\r\n        }\r\n        TDerived* derived_ptr;\r\n    };\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/FaceBaryCoordT.h",
    "content": "#pragma once\r\n#include <functional>\r\n#include <OpenMesh/Core/Mesh/PolyConnectivity.hh>\r\n#include \"../BaryCoordT.h\"\r\n\r\nnamespace kt84 {\r\n\r\ntemplate <bool SumToOne = true>\r\nstruct FaceBaryCoordT {\r\n    OpenMesh::PolyConnectivity::FHandle f;\r\n    BaryCoordT<SumToOne> bc;                // barycentric coordinates of this point.\r\n    \r\n    FaceBaryCoordT() {}\r\n    FaceBaryCoordT(const OpenMesh::PolyConnectivity::FHandle& f_, const BaryCoordT<SumToOne>& bc_)\r\n        : f(f_)\r\n        , bc(bc_)\r\n    {}\r\n    \r\n    template <class TMesh>\r\n    typename TMesh::Point blend_point(const TMesh& mesh) const {\r\n        auto v = mesh.cfv_iter(f);\r\n        auto p0 = mesh.point(*v);\r\n        auto p1 = mesh.point(*++v);\r\n        auto p2 = mesh.point(*++v);\r\n        return bc.blend(p0, p1, p2);\r\n    }\r\n    \r\n    template <class TMesh>\r\n    typename TMesh::Normal blend_normal(const TMesh& mesh) const {\r\n        static_assert(SumToOne, \"blending normals with BaryCoordZero doesn't make sense!\");\r\n        \r\n        auto v = mesh.cfv_iter(f);\r\n        auto n0 = mesh.normal(v);\r\n        auto n1 = mesh.normal(++v);\r\n        auto n2 = mesh.normal(++v);\r\n        auto n = bc.blend(n0, n1, n2);\r\n        n.normalize();\r\n        return n;\r\n    }\r\n    \r\n    template <class TMesh, typename TValue>\r\n    TValue blend_value(const TMesh& mesh, const std::function<TValue(const TMesh& mesh, typename TMesh::VHandle v)>& value_getter) const {\r\n        auto v = mesh.cfv_iter(f);\r\n        auto x0 = value_getter(mesh, *v);\r\n        auto x1 = value_getter(mesh, *++v);\r\n        auto x2 = value_getter(mesh, *++v);\r\n        return bc.blend(x0, x1, x2);\r\n    }\r\n};\r\n\r\ntypedef FaceBaryCoordT<true > FaceBaryCoord;\r\ntypedef FaceBaryCoordT<false> FaceBaryCoordZero;\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/append_quad_strip.h",
    "content": "#pragma once\r\n#include <vector>\r\n#include <utility>\r\n#include <functional>\r\n#include <OpenMesh/Core/Mesh/PolyMesh_ArrayKernelT.hh>\r\n#include <OpenMesh/Core/Mesh/Handles.hh>\r\n\r\nnamespace kt84 {\r\n\r\ntemplate <class MeshTrait>\r\ninline bool append_quad_strip(                                          // Return: true if successful\r\n    OpenMesh::PolyMesh_ArrayKernelT<MeshTrait>& mesh,                   // Target mesh\r\n    OpenMesh::HalfedgeHandle                  & boundary_h_front,       // Halfedge where the first quad is attached to. Updated to the corresponding newly generated halfedge.\r\n    OpenMesh::HalfedgeHandle                  & boundary_h_back)        // Halfedge where the last  quad is attached to. Updated to the corresponding newly generated halfedge.\r\n{\r\n    typedef OpenMesh::PolyMesh_ArrayKernelT<MeshTrait> Mesh;\r\n    \r\n    if (!mesh.is_boundary(boundary_h_front) || !mesh.is_boundary(boundary_h_back))\r\n        return false;\r\n    \r\n    OpenMesh::VertexHandle v_prev, v_next;\r\n    for (auto h = boundary_h_front; ; ) {\r\n        auto h_next = mesh.next_halfedge_handle(h);\r\n        auto v_from = mesh.from_vertex_handle(h);\r\n        auto v_to   = mesh.to_vertex_handle  (h);\r\n        if (h == boundary_h_front)\r\n            v_prev = mesh.add_vertex(typename Mesh::Point());\r\n        v_next = mesh.add_vertex(typename Mesh::Point());\r\n        mesh.add_face(v_from, v_to, v_next, v_prev);\r\n        if (h == boundary_h_back)\r\n            break;\r\n        v_prev = v_next;\r\n        h      = h_next;\r\n    }\r\n    \r\n    boundary_h_front = mesh.opposite_halfedge_handle(mesh.next_halfedge_handle(mesh.next_halfedge_handle(boundary_h_front)));\r\n    boundary_h_back  = mesh.opposite_halfedge_handle(mesh.next_halfedge_handle(mesh.next_halfedge_handle(boundary_h_back )));\r\n    \r\n    return true;\r\n}\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/base/BoundingBox.h",
    "content": "#pragma once\r\n#include <Eigen/Geometry>\r\n#include \"../vector_convert.h\"\r\n#include \"../DerivedPtrHolder.h\"\r\n\r\nnamespace kt84 {\r\n\r\ntemplate <class TMeshBase, class TMesh>\r\nstruct BoundingBox : public DerivedPtrHolder<TMesh, BoundingBox<TMeshBase, TMesh>> {\r\n    static const int N = TMeshBase::Point::size_;\r\n    Eigen::AlignedBox<double, N> boundingBox;\r\n\r\n    void boundingBox_compute() {\r\n        TMesh* mesh = DerivedPtrHolder<TMesh, BoundingBox<TMeshBase, TMesh>>::derived_ptr;\r\n        boundingBox.setEmpty();\r\n        for (auto v : mesh->vertices())\r\n            boundingBox.extend(o2e(mesh->point(v)));\r\n    }\r\n    double boundingBox_diagonal_norm() const {\r\n        return boundingBox.diagonal().norm();\r\n    }\r\n};\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/base/CenterOfMass.h",
    "content": "#pragma once\r\n#include \"../vector_convert.h\"\r\n#include \"../DerivedPtrHolder.h\"\r\n\r\nnamespace kt84 {\r\n\r\ntemplate <class TMeshBase, class TMesh>\r\nstruct CenterOfMass : public DerivedPtrHolder<TMesh, CenterOfMass<TMeshBase, TMesh>> {\r\n    static const int N = TMeshBase::Point::size_;\r\n    Eigen::Matrix<double, N, 1> centerOfMass;\r\n    \r\n    void centerOfMass_compute() {\r\n        TMesh* mesh = DerivedPtrHolder<TMesh, CenterOfMass<TMeshBase, TMesh>>::derived_ptr;\r\n        centerOfMass.setZero();\r\n        for (auto v : mesh->vertices())\r\n            centerOfMass += o2e(mesh->point(v));\r\n        centerOfMass /= mesh->n_vertices();\r\n    }\r\n};\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/base/CotanWeight.h",
    "content": "#pragma once\r\n#include \"../DerivedPtrHolder.h\"\r\n#include \"FaceArea.h\"\r\n\r\nnamespace kt84 {\r\n\r\nstruct CotanWeight_HalfedgeTraits {\r\n    double cotangent;             // Cotangent of corner opposing this halfedge (i.e., the corner corresponds to this->next_halfedge->to_vertex)\r\n    CotanWeight_HalfedgeTraits()\r\n        : cotangent(0)\r\n    {}\r\n};\r\ntypedef FaceArea_EdgeTraits CotanWeight_EdgeTraits;\r\ntypedef FaceArea_FaceTraits CotanWeight_FaceTraits;\r\n\r\ntemplate <class TMeshBase, class TMesh>\r\nstruct CotanWeight\r\n    : public DerivedPtrHolder<TMesh, CotanWeight<TMeshBase, TMesh>>\r\n    , public FaceArea<TMeshBase, TMesh>\r\n{\r\n    double cotanWeight(OpenMesh::PolyConnectivity::EHandle e) {\r\n        TMesh* mesh = get_mesh();\r\n        return 0.5 * (mesh->data(mesh->halfedge_handle(e, 0)).cotangent + \r\n                      mesh->data(mesh->halfedge_handle(e, 1)).cotangent);\r\n    }\r\n    void cotanWeight_compute() {\r\n        TMesh* mesh = get_mesh();\r\n        mesh->faceArea_compute();\r\n        \r\n        for (auto f : mesh->faces()) {\r\n            // Intrinsig cotangent formula by Alec Jacobson: http://www.alecjacobson.com/weblog/?p=2405\r\n            OpenMesh::PolyConnectivity::HHandle h[3];\r\n            double l[3];\r\n            int i = 0;\r\n            for (auto fh = mesh->fh_iter(f); fh.is_valid(); ++fh, ++i) {\r\n                h[i] = *fh;\r\n                l[i] = mesh->data(mesh->edge_handle(h[i])).edgeLength;\r\n            }\r\n            double A = mesh->data(f).faceArea;\r\n            for (i = 0; i < 3; ++i) {\r\n                int i1 = (i + 1) % 3;\r\n                int i2 = (i + 2) % 3;\r\n                mesh->data(h[i]).cotangent = (l[i1] * l[i1] + l[i2] * l[i2] - l[i] * l[i]) / (4 * A);\r\n            }\r\n        }\r\n    }\r\nprivate:\r\n    TMesh* get_mesh() const { return DerivedPtrHolder<TMesh, CotanWeight<TMeshBase, TMesh>>::derived_ptr; }\r\n};\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/base/DebugInfo.h",
    "content": "#pragma once\r\n#include <iostream>\r\n#include <vector>\r\n#include <OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh>\r\n#include \"../DerivedPtrHolder.h\"\r\n\r\nnamespace kt84 {\r\n\r\ntemplate <class TMeshBase> struct DebugInfo_Vertex  ;\r\ntemplate <class TMeshBase> struct DebugInfo_Face    ;\r\ntemplate <class TMeshBase> struct DebugInfo_Edge    ;\r\ntemplate <class TMeshBase> struct DebugInfo_Halfedge;\r\n\r\ntemplate <class TMeshBase>\r\nstruct DebugInfo_Vertex {\r\n    int idx;\r\n    bool deleted;\r\n    typename TMeshBase::VertexData* data;\r\n    typename TMeshBase::Point  point ;\r\n    typename TMeshBase::Normal normal;\r\n    bool is_boundary;\r\n    DebugInfo_Halfedge<TMeshBase>* halfedge;\r\n    std::vector<DebugInfo_Vertex  <TMeshBase>*> vv;\r\n    std::vector<DebugInfo_Face    <TMeshBase>*> vf;\r\n    std::vector<DebugInfo_Edge    <TMeshBase>*> ve;\r\n    std::vector<DebugInfo_Halfedge<TMeshBase>*> voh;\r\n    std::vector<DebugInfo_Halfedge<TMeshBase>*> vih;\r\n    \r\n    DebugInfo_Vertex()\r\n        : idx(-1)\r\n        , deleted()\r\n        , data(nullptr)\r\n        , halfedge(nullptr)\r\n        , is_boundary(false)\r\n    {}\r\n};\r\n\r\ntemplate <class TMeshBase>\r\nstruct DebugInfo_Face {\r\n    int idx;\r\n    bool deleted;\r\n    typename TMeshBase::FaceData* data;\r\n    typename TMeshBase::Normal normal;\r\n    bool is_boundary;\r\n    DebugInfo_Halfedge<TMeshBase>* halfedge;\r\n    std::vector<DebugInfo_Vertex  <TMeshBase>*> fv;\r\n    std::vector<DebugInfo_Edge    <TMeshBase>*> fe;\r\n    std::vector<DebugInfo_Halfedge<TMeshBase>*> fh;\r\n    std::vector<DebugInfo_Face    <TMeshBase>*> ff;\r\n    \r\n    DebugInfo_Face()\r\n        : idx(-1)\r\n        , deleted()\r\n        , data(nullptr)\r\n        , is_boundary(false)\r\n    {}\r\n};\r\n\r\ntemplate <class TTrait>\r\nstruct DebugInfo_Face<OpenMesh::TriMesh_ArrayKernelT<TTrait>> {\r\n    typedef OpenMesh::TriMesh_ArrayKernelT<TTrait> MeshBase;\r\n    \r\n    int idx;\r\n    bool deleted;\r\n    typename MeshBase::FaceData* data;\r\n    typename MeshBase::Normal normal;\r\n    bool is_boundary;\r\n    DebugInfo_Halfedge<MeshBase>* halfedge;\r\n    DebugInfo_Vertex  <MeshBase>* fv[3];\r\n    DebugInfo_Edge    <MeshBase>* fe[3];\r\n    DebugInfo_Halfedge<MeshBase>* fh[3];\r\n    DebugInfo_Face    <MeshBase>* ff[3];\r\n    \r\n    DebugInfo_Face()\r\n        : idx(-1)\r\n        , deleted()\r\n        , data(nullptr)\r\n        , is_boundary(false)\r\n    {\r\n        fv[0] = fv[1] = fv[2] = nullptr;\r\n        fe[0] = fe[1] = fe[2] = nullptr;\r\n        fh[0] = fh[1] = fh[2] = nullptr;\r\n        ff[0] = ff[1] = ff[2] = nullptr;\r\n    }\r\n};\r\n\r\ntemplate <class TMeshBase>\r\nstruct DebugInfo_Edge {\r\n    int idx;\r\n    bool deleted;\r\n    typename TMeshBase::EdgeData* data;\r\n    bool is_boundary;\r\n    DebugInfo_Vertex  <TMeshBase>* vertex  [2];\r\n    DebugInfo_Face    <TMeshBase>* face    [2];\r\n    DebugInfo_Halfedge<TMeshBase>* halfedge[2];\r\n    \r\n    DebugInfo_Edge()\r\n        : idx(-1)\r\n        , deleted()\r\n        , data(nullptr)\r\n        , is_boundary(false)\r\n    {\r\n        vertex  [0] = vertex  [1] = nullptr;\r\n        face    [0] = face    [1] = nullptr;\r\n        halfedge[0] = halfedge[1] = nullptr;\r\n    }\r\n};\r\n\r\ntemplate <class TMeshBase>\r\nstruct DebugInfo_Halfedge {\r\n    int idx;\r\n    bool deleted;\r\n    typename TMeshBase::HalfedgeData* data;\r\n    bool is_boundary;\r\n    DebugInfo_Vertex  <TMeshBase>* to_vertex  ;\r\n    DebugInfo_Vertex  <TMeshBase>* from_vertex;\r\n    DebugInfo_Face    <TMeshBase>* face       ;\r\n    DebugInfo_Halfedge<TMeshBase>* next       ;\r\n    DebugInfo_Halfedge<TMeshBase>* prev       ;\r\n    DebugInfo_Halfedge<TMeshBase>* opposite   ;\r\n    DebugInfo_Edge    <TMeshBase>* edge       ;\r\n    \r\n    DebugInfo_Halfedge()\r\n        : idx(-1)\r\n        , deleted()\r\n        , data       (nullptr)\r\n        , is_boundary(false)\r\n        , to_vertex  (nullptr)\r\n        , from_vertex(nullptr)\r\n        , face       (nullptr)\r\n        , next       (nullptr)\r\n        , prev       (nullptr)\r\n        , opposite   (nullptr)\r\n        , edge       (nullptr)\r\n    {}\r\n};\r\n\r\nnamespace internal {\r\n    template <class T>\r\n    void debugInfo_get_common(T& object, typename T::MeshBase& mesh, bool with_normals_v, bool with_normals_f, bool is_verbose) {\r\n        // clear\r\n        object.debugInfo = typename T::Data();\r\n        \r\n        // number of elements\r\n        int nv = mesh.n_vertices ();\r\n        int nf = mesh.n_faces    ();\r\n        int ne = mesh.n_edges    ();\r\n        int nh = mesh.n_halfedges();\r\n        \r\n        if (is_verbose) {\r\n            std::cout << \"\\n[kt84/openmesh/DebugInfo] ---------------------------\\n\";\r\n            std::cout << nv << \" vertices\\n\";\r\n            std::cout << nf << \" faces\\n\";\r\n            std::cout << ne << \" edge\\n\";\r\n            std::cout << nh << \" halfedges\\n\";\r\n            std::cout << \"--------------------------- [kt84/openmesh/DebugInfo] \\n\";\r\n        }\r\n        \r\n        // resize arrays\r\n        object.debugInfo.vertices .resize(nv);\r\n        object.debugInfo.faces    .resize(nf);\r\n        object.debugInfo.edges    .resize(ne);\r\n        object.debugInfo.halfedges.resize(nh);\r\n        \r\n        // vertex\r\n        for (int i = 0; i < nv; ++i) {\r\n            auto v = mesh.vertex_handle(i);\r\n            auto& v_dbg = object.debugInfo.vertices[i];\r\n            v_dbg.idx = v.idx();\r\n            if (mesh.has_vertex_status()) v_dbg.deleted = mesh.status(v).deleted();\r\n            v_dbg.data = &mesh.data(v);\r\n            v_dbg.point = mesh.point(v);\r\n            v_dbg.is_boundary = mesh.is_boundary(v);\r\n            if (with_normals_v) v_dbg.normal = mesh.normal(v);\r\n            if (mesh.halfedge_handle(v).is_valid())\r\n                v_dbg.halfedge = &object.debugInfo.halfedges[mesh.halfedge_handle(v).idx()];\r\n            for (auto vv  = mesh.vv_iter (v); vv .is_valid(); ++vv ) v_dbg.vv .push_back(&object.debugInfo.vertices [vv ->idx()]);\r\n            for (auto vf  = mesh.vf_iter (v); vf .is_valid(); ++vf ) v_dbg.vf .push_back(&object.debugInfo.faces    [vf ->idx()]);\r\n            for (auto ve  = mesh.ve_iter (v); ve .is_valid(); ++ve ) v_dbg.ve .push_back(&object.debugInfo.edges    [ve ->idx()]);\r\n            for (auto voh = mesh.voh_iter(v); voh.is_valid(); ++voh) v_dbg.voh.push_back(&object.debugInfo.halfedges[voh->idx()]);\r\n            for (auto vih = mesh.vih_iter(v); vih.is_valid(); ++vih) v_dbg.vih.push_back(&object.debugInfo.halfedges[vih->idx()]);\r\n        }\r\n        \r\n        // edge\r\n        for (int i = 0; i < ne; ++i) {\r\n            auto e = mesh.edge_handle(i);\r\n            auto& e_dbg = object.debugInfo.edges[i];\r\n            e_dbg.idx = e.idx();\r\n            if (mesh.has_edge_status()) e_dbg.deleted = mesh.status(e).deleted();\r\n            e_dbg.data = &mesh.data(e);\r\n            e_dbg.is_boundary = mesh.is_boundary(e);\r\n            for (int j = 0; j < 2; ++j) {\r\n                auto h = mesh.halfedge_handle(e, j);\r\n                e_dbg.vertex  [j] = &object.debugInfo.vertices [mesh.to_vertex_handle(h).idx()];\r\n                e_dbg.halfedge[j] = &object.debugInfo.halfedges[h.idx()];\r\n                \r\n                auto f = mesh.face_handle(h);\r\n                e_dbg.face[j] = f.is_valid() ? &object.debugInfo.faces[f.idx()] : 0;\r\n            }\r\n        }\r\n        \r\n        // halfedge\r\n        for (int i = 0; i < nh; ++i) {\r\n            auto h = mesh.halfedge_handle(i);\r\n            auto& h_dbg = object.debugInfo.halfedges[i];\r\n            h_dbg.idx = h.idx();\r\n            if (mesh.has_halfedge_status()) h_dbg.deleted = mesh.status(h).deleted();\r\n            h_dbg.data = &mesh.data(h);\r\n            h_dbg.is_boundary = mesh.is_boundary(h);\r\n            h_dbg.to_vertex   = &object.debugInfo.vertices [mesh.to_vertex_handle        (h).idx()];\r\n            h_dbg.from_vertex = &object.debugInfo.vertices [mesh.from_vertex_handle      (h).idx()];\r\n            h_dbg.next        = &object.debugInfo.halfedges[mesh.next_halfedge_handle    (h).idx()];\r\n            h_dbg.prev        = &object.debugInfo.halfedges[mesh.prev_halfedge_handle    (h).idx()];\r\n            h_dbg.opposite    = &object.debugInfo.halfedges[mesh.opposite_halfedge_handle(h).idx()];\r\n            h_dbg.edge        = &object.debugInfo.edges    [mesh.edge_handle             (h).idx()];\r\n            \r\n            auto f = mesh.face_handle(h);\r\n            h_dbg.face = f.is_valid() ? &object.debugInfo.faces[f.idx()] : 0;\r\n        }\r\n    }\r\n}\r\n\r\ntemplate <class TMeshBase, class TMesh>\r\nstruct DebugInfo : public DerivedPtrHolder<TMesh, DebugInfo<TMeshBase, TMesh>> {\r\n    typedef TMeshBase MeshBase;\r\n    \r\n    static_assert(MeshBase::Point::size_ == 3, \"TMeshBase::Point should be 3D vector!\");\r\n    \r\n    struct Data {\r\n        std::vector<DebugInfo_Vertex  <MeshBase>> vertices ;\r\n        std::vector<DebugInfo_Face    <MeshBase>> faces    ;\r\n        std::vector<DebugInfo_Edge    <MeshBase>> edges    ;\r\n        std::vector<DebugInfo_Halfedge<MeshBase>> halfedges;\r\n    } debugInfo;\r\n    \r\n    void debugInfo_get(bool with_normals_v = false, bool with_normals_f = false, bool is_verbose = false) {\r\n        TMesh* mesh = DerivedPtrHolder<TMesh, DebugInfo<TMeshBase, TMesh>>::derived_ptr;\r\n        \r\n        internal::debugInfo_get_common(*this, *mesh, with_normals_v, with_normals_f, is_verbose);\r\n        \r\n        int nf = mesh->n_faces();\r\n        \r\n        // face\r\n        for (int i = 0; i < nf; ++i) {\r\n            auto f = mesh->face_handle(i);\r\n            auto& f_dbg = debugInfo.faces[i];\r\n            f_dbg.idx = f.idx();\r\n            if (mesh->has_face_status()) f_dbg.deleted = mesh->status(f).deleted();\r\n            f_dbg.data = &mesh->data(f);\r\n            f_dbg.is_boundary = mesh->is_boundary(f);\r\n            if (with_normals_f) f_dbg.normal = mesh->normal(f);\r\n            f_dbg.halfedge = &debugInfo.halfedges[mesh->halfedge_handle(f).idx()];\r\n            int n_sides = 0;\r\n            for (auto fh = mesh->fh_iter(f); fh.is_valid(); ++fh) ++n_sides;\r\n            f_dbg.fv.resize(n_sides, 0);\r\n            f_dbg.ff.resize(n_sides, 0);\r\n            f_dbg.fe.resize(n_sides, 0);\r\n            f_dbg.fh.resize(n_sides, 0);\r\n            auto fh = mesh->fh_iter(f);\r\n            for (int j = 0; j < n_sides; ++j, ++fh) {\r\n                auto v = mesh->to_vertex_handle(*fh);\r\n                auto e = mesh->edge_handle     (*fh);\r\n                auto f = mesh->face_handle     (mesh->opposite_halfedge_handle(*fh));\r\n                f_dbg.fv[j] = &debugInfo.vertices [v .idx()];\r\n                f_dbg.ff[j] = f.idx() == -1 ? nullptr : &debugInfo.faces[f.idx()];\r\n                f_dbg.fe[j] = &debugInfo.edges    [e .idx()];\r\n                f_dbg.fh[j] = &debugInfo.halfedges[fh->idx()];\r\n            }\r\n        }\r\n    }\r\n};\r\n\r\ntemplate <class TTrait, class TMesh>\r\nstruct DebugInfo<OpenMesh::TriMesh_ArrayKernelT<TTrait>, TMesh> : public DerivedPtrHolder<TMesh, DebugInfo<OpenMesh::TriMesh_ArrayKernelT<TTrait>, TMesh>> {\r\n    typedef OpenMesh::TriMesh_ArrayKernelT<TTrait> MeshBase;\r\n    \r\n    struct Data {\r\n        std::vector<DebugInfo_Vertex  <MeshBase>> vertices ;\r\n        std::vector<DebugInfo_Face    <MeshBase>> faces    ;\r\n        std::vector<DebugInfo_Edge    <MeshBase>> edges    ;\r\n        std::vector<DebugInfo_Halfedge<MeshBase>> halfedges;\r\n    } debugInfo;\r\n    \r\n    void debugInfo_get(bool with_normals_v = false, bool with_normals_f = false, bool is_verbose = false) {\r\n        TMesh* mesh = DerivedPtrHolder<TMesh, DebugInfo<OpenMesh::TriMesh_ArrayKernelT<TTrait>, TMesh>>::derived_ptr;\r\n        \r\n        internal::debugInfo_get_common(*this, *mesh, with_normals_v, with_normals_f, is_verbose);\r\n        \r\n        int nf = mesh->n_faces();\r\n        \r\n        // face\r\n        for (int i = 0; i < nf; ++i) {\r\n            auto f = mesh->face_handle(i);\r\n            auto& f_dbg = debugInfo.faces[i];\r\n            f_dbg.idx = f.idx();\r\n            if (mesh->has_face_status()) f_dbg.deleted = mesh->status(f).deleted();\r\n            f_dbg.data = &mesh->data(f);\r\n            f_dbg.is_boundary = mesh->is_boundary(f);\r\n            if (with_normals_f) f_dbg.normal = mesh->normal(f);\r\n            f_dbg.halfedge = &debugInfo.halfedges[mesh->halfedge_handle(f).idx()];\r\n            auto fh = mesh->fh_iter(f);\r\n            for (int j = 0; j < 3; ++j, ++fh) {\r\n                auto v = mesh->to_vertex_handle(*fh);\r\n                auto e = mesh->edge_handle     (*fh);\r\n                auto f = mesh->face_handle     (mesh->opposite_halfedge_handle(*fh));\r\n                f_dbg.fv[j] = &debugInfo.vertices [v .idx()];\r\n                f_dbg.ff[j] = f.idx() == -1 ? nullptr : &debugInfo.faces[f.idx()];\r\n                f_dbg.fe[j] = &debugInfo.edges    [e .idx()];\r\n                f_dbg.fh[j] = &debugInfo.halfedges[fh->idx()];\r\n            }\r\n        }\r\n    }\r\n};\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/base/EdgeLength.h",
    "content": "#pragma once\r\n#include \"../DerivedPtrHolder.h\"\r\n\r\nnamespace kt84 {\r\n\r\nstruct EdgeLength_EdgeTraits {\r\n    double edgeLength;\r\n    EdgeLength_EdgeTraits() : edgeLength() {}\r\n};\r\n\r\ntemplate <class TMeshBase, class TMesh>\r\nstruct EdgeLength : public DerivedPtrHolder<TMesh, EdgeLength<TMeshBase, TMesh>> {\r\n    void edgeLength_compute() {\r\n        TMesh* mesh = DerivedPtrHolder<TMesh, EdgeLength<TMeshBase, TMesh>>::derived_ptr;\r\n        for (auto e : mesh->edges()) {\r\n            auto p0 = mesh->point(mesh->to_vertex_handle(mesh->halfedge_handle(e, 0)));\r\n            auto p1 = mesh->point(mesh->to_vertex_handle(mesh->halfedge_handle(e, 1)));\r\n            mesh->data(e).edgeLength = (p1 - p0).norm();\r\n        }\r\n    }\r\n};\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/base/ExpMap.h",
    "content": "#pragma once\r\n#include <vector>\r\n#include <queue>\r\n#include <Eigen/Geometry>\r\n#include <boost/optional.hpp>\r\n#include <OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh>\r\n#include <OpenMesh/Core/Mesh/PolyConnectivity.hh>\r\n#include \"../vector_convert.h\"\r\n#include \"../FaceBaryCoordT.h\"\r\n#include \"../../eigen_util.h\"\r\n#include \"../../util.h\"\r\n#include \"../DerivedPtrHolder.h\"\r\n\r\nnamespace kt84 {\r\n\r\n/*\r\n    Implementation of a surface mesh parameterization algorithm descibed in the following articles:\r\n        Ryan Schmidt, Cindy Grimm, and Brian Wyvill.\r\n        Interactive decal compositing with discrete exponential maps.\r\n        ACM SIGGRAPH 2006.\r\n        \r\n        Ryan Schmidt and Karan Singh.\r\n        Drag, Drop, and Clone: An Interactive Interface for Surface Composition.\r\n        Technical Report CSRG-611, Department of Computer Science, University of Toronto, 2010.\r\n    \r\n    NOTE: The algorithm is implemented in a slightly different way; the uv coordiante of currently processed vertex q is estimated by rotating \r\n    its local frame to that of its adjacent vertex p that has been processed already, which is in contrast to what is claimed in the original \r\n    SIGGRAPH paper (see sentences below equation (3)). This modification seems to provide better robustness especially when parameterizing highly \r\n    curved surface regions (probably because normals at distant locations are very different from the seed's normal).\r\n\r\n    parameters:\r\n        seed(s)                 seed vertex id\r\n        seed(s)_basis_u         3D vector in object space corresponding to unit basis vector of u-coordinate.\r\n                                (its length determines the overall scaling of the parameterization)\r\n        seed(s)_uv              seed uv coordinate\r\n        dist_max                termination criteria based on object-space distance\r\n        uv_min, uv_max          termination criteria based on parameter-space bounding box\r\n*/\r\n\r\nstruct ExpMap_VertexTraits {\r\n    struct Data {\r\n        bool            paramed;\r\n        double          dist;\r\n        double          weight;\r\n        Eigen::Vector2d uv;\r\n        Eigen::Vector2d basis_u;              // represents u-coordiante basis vector in object space.\r\n                                            // (i.e., its length determines scaling of parameterization.)\r\n                                            // living on the tangent plane defined by intrinsic bases\r\n        \r\n        Data()\r\n            : paramed()\r\n            , dist   (util::dbl_max())\r\n            , weight ()\r\n            , uv     (Eigen::Vector2d::Zero())\r\n            , basis_u(Eigen::Vector2d::Zero())\r\n        {}\r\n    } expmap;\r\n};\r\n\r\nstruct ExpMap_FaceTraits {\r\n    bool expmap_paramed;\r\n    \r\n    ExpMap_FaceTraits()\r\n        : expmap_paramed()\r\n    {}\r\n};\r\n\r\nnamespace internal {\r\n    template <class TMeshBase>\r\n    void expmap_compute_common(TMeshBase* mesh,\r\n                               const std::vector<OpenMesh::PolyConnectivity::VHandle>& seeds,\r\n                               const std::vector<Eigen::Vector3d                    >& seeds_basis_u,\r\n                               const std::vector<Eigen::Vector2d                    >& seeds_uv,\r\n                               double dist_max,\r\n                               const Eigen::Vector2d& uv_min,\r\n                               const Eigen::Vector2d& uv_max,\r\n                               std::vector<OpenMesh::PolyConnectivity::FHandle>& expmap_paramed_faces)\r\n    {\r\n        // helper functions ==============================================================================================\r\n        auto get_intr_basis = [] (const Eigen::Vector3d& normal) -> Eigen::Vector3d {\n            // get unit basis vector orthogonal to input vector in intrinsical manner\n            double nx = std::abs(normal.x());\n            double ny = std::abs(normal.y());\n            double nz = std::abs(normal.z());\n            Eigen::Vector3d basis =\n                nx < ny && ny < nz ? Eigen::Vector3d::UnitX() :\n                ny < nz            ? Eigen::Vector3d::UnitY() :\n                                     Eigen::Vector3d::UnitZ();\n            eigen_util::orthonormalize(normal, basis);\n            return basis;\n        };\n        \n        auto compute_rotation = [get_intr_basis] (const Eigen::Vector3d& p_normal,\n                                                  const Eigen::Vector3d& q_normal) -> Eigen::Rotation2Dd\n            // compute 2D rotation which will be used to rotate basis_u of p to estimate that of q\n        {\n            // get intrinsic basis vectors of p, q\n            auto p_intr_basis = get_intr_basis(p_normal);\n            auto q_intr_basis = get_intr_basis(q_normal);\n            \n            // step 1: compute 3D rotation that aligns q_normal with p_normal. apply it to q_basis.\r\n            auto rot1_axis = q_normal.cross(p_normal);\r\n            if (!rot1_axis.isZero()) {\r\n                rot1_axis.normalize();\r\n                double rot1_angle = util::acos_clamped(q_normal.dot(p_normal));\r\n                q_intr_basis = Eigen::AngleAxisd(rot1_angle, rot1_axis) * q_intr_basis;\r\n            }\r\n            \r\n            // step 2: compute 2D rotation that makes (rotated) q_basis aligned with p_basis.\r\n            double rot2_angle = util::acos_clamped(q_intr_basis.dot(p_intr_basis));\r\n            if (q_intr_basis.cross(p_intr_basis).dot(p_normal) < 0)     // negative rotation\r\n                rot2_angle *= -1.0f;\r\n            \r\n            return Eigen::Rotation2Dd(rot2_angle);\r\n        };\r\n        \r\n        auto compute_uv = [get_intr_basis] (const Eigen::Vector3d& p_point ,\n                                            const Eigen::Vector3d& p_normal,\n                                            const Eigen::Vector2d& p_uv,\n                                            const Eigen::Vector2d& p_basis_u,\n                                            const Eigen::Vector3d& q_point ) -> Eigen::Vector2d\n            // computes uv for point q using p's point, normal, uv, basis_u\n        {\n            auto p_intr_basis_x = get_intr_basis(p_normal);\r\n            auto p_intr_basis_y = p_normal.cross(p_intr_basis_x);\r\n            \r\n            // project (rotate) pq into tangent plane\r\n            Eigen::Vector3d pq = q_point - p_point;\r\n            Eigen::Vector2d local_uv(pq.dot(p_intr_basis_x), pq.dot(p_intr_basis_y));\r\n            local_uv *= pq.norm() / local_uv.norm();\r\n            \r\n            // encode 2D local_uv using propagated (non-unit) basis vectors\r\n            auto p_basis_v = eigen_util::rotate90(p_basis_u);\r\n            local_uv = Eigen::Vector2d(p_basis_u.dot(local_uv), p_basis_v.dot(local_uv));\r\n            \r\n            // account for scale difference\r\n            local_uv /= p_basis_u.squaredNorm();\r\n            \r\n            Eigen::Vector2d q_uv = p_uv + local_uv;\r\n            \r\n            return q_uv;\r\n        };\r\n        // ============================================================================================== helper functions\r\n        \r\n        // clear all vertex data\r\n        for (auto v : mesh->vertices())\r\n            mesh->data(v).expmap = ExpMap_VertexTraits::Data();\r\n        \r\n        // priority queue for propagation front\r\n        struct QueueElement {\r\n            OpenMesh::PolyConnectivity::VHandle vhandle;\r\n            double dist;\r\n            \r\n            QueueElement() : dist(){}\r\n            QueueElement(OpenMesh::PolyConnectivity::VHandle vhandle_, double dist_) : vhandle(vhandle_) , dist(dist_) {}\r\n            bool operator<(const QueueElement& rhs) const { return dist > rhs.dist; }       // note: smaller distance gets higher priority\r\n        };\r\n        std::priority_queue<QueueElement> candidates;\r\n        \r\n        // init\r\n        for (size_t i = 0; i < seeds.size(); ++i) {\r\n            auto seed = seeds[i];\r\n            auto& seed_data = mesh->data(seed).expmap;\r\n            \r\n            Eigen::Vector3d seed_normal       = o2e(mesh->normal(seed));\r\n            Eigen::Vector3d seed_intr_basis_x = get_intr_basis(seed_normal);\r\n            Eigen::Vector3d seed_intr_basis_y = seed_normal.cross(seed_intr_basis_x);\r\n            Eigen::Vector3d seed_basis_u      = seeds_basis_u[i];\r\n            \r\n            seed_data.weight  += 1;\r\n            seed_data.dist     = 0;\r\n            seed_data.uv      += seeds_uv[i];\r\n            seed_data.basis_u += Eigen::Vector2d(seed_intr_basis_x.dot(seed_basis_u), seed_intr_basis_y.dot(seed_basis_u));\r\n            \r\n            candidates.push(QueueElement(seed, 0));\r\n        }\r\n        \r\n        while (!candidates.empty()) {\r\n            auto p = candidates.top().vhandle;\r\n            candidates.pop();\r\n            \r\n            auto& p_data   = mesh->data(p).expmap;\r\n            auto  p_point  = o2e(mesh->point (p));\r\n            auto  p_normal = o2e(mesh->normal(p));\r\n            \r\n            if (p_data.paramed) continue;\r\n            p_data.paramed = true;\r\n            \r\n            p_data.uv      /= p_data.weight;\r\n            p_data.basis_u /= p_data.weight;\r\n            \r\n            if (dist_max < p_data.dist) continue;\r\n            \r\n            if (!Eigen::AlignedBox2d(uv_min, uv_max).contains(p_data.uv)) continue;\r\n            \r\n            for (auto q = mesh->vv_iter(p); q.is_valid(); ++q) {\r\n                auto& q_data   = mesh->data(*q).expmap;\r\n                auto  q_point  = o2e(mesh->point (*q));\r\n                auto  q_normal = o2e(mesh->normal(*q));\r\n                \r\n                if (q_data.paramed) continue;\r\n                \r\n                // distance update\r\n                double dist_pq = (p_point - q_point).norm();\r\n                if (p_data.dist + dist_pq < q_data.dist)\r\n                    q_data.dist = p_data.dist + dist_pq;\r\n                \r\n                // weight based on distance between p and q\r\n                double weight = 1.0f / std::pow(dist_pq, 0.25);\r\n                q_data.weight += weight;\r\n                \r\n                // estimate of data by weighted averaging\r\n                q_data.uv      += weight * compute_uv(p_point, p_normal, p_data.uv, p_data.basis_u, q_point);\r\n                q_data.basis_u += weight * (compute_rotation(p_normal, q_normal) * p_data.basis_u);            // be sure to use parentheses! otherwise Eigen will happily go funny:)\n                \r\n                candidates.push(QueueElement(*q, q_data.dist));\r\n            }\r\n        }\r\n        \r\n        // collect faces with its vertices all paramed\r\n        expmap_paramed_faces.clear();\r\n        expmap_paramed_faces.reserve(mesh->n_faces());\r\n        for (auto f : mesh->faces()) {\r\n            mesh->data(f).expmap_paramed = true;\r\n            for (auto v = mesh->fv_iter(f); v.is_valid(); ++v) {\r\n                if (!mesh->data(*v).expmap.paramed) {\r\n                    mesh->data(f).expmap_paramed = false;\r\n                    break;\r\n                }\r\n            }\r\n            if (mesh->data(f).expmap_paramed)\r\n                expmap_paramed_faces.push_back(f);\r\n        }\r\n    }\r\n}\r\n\r\ntemplate <class TMeshBase, class TMesh>\r\nstruct ExpMap : public DerivedPtrHolder<TMesh, ExpMap<TMeshBase, TMesh>> {\r\n    std::vector<typename TMeshBase::FHandle> expmap_paramed_faces;\r\n    \r\n    void expmap_compute(\r\n        const std::vector<typename TMeshBase::VHandle>& seeds,\r\n        const std::vector<Eigen::Vector3d            >& seeds_basis_u,\r\n        const std::vector<Eigen::Vector2d            >& seeds_uv,\r\n        double dist_max,\r\n        const Eigen::Vector2d& uv_min = Eigen::Vector2d::Constant(-std::numeric_limits<double>::max()),\r\n        const Eigen::Vector2d& uv_max = Eigen::Vector2d::Constant( std::numeric_limits<double>::max()))\r\n    {\r\n        TMesh* mesh = DerivedPtrHolder<TMesh, ExpMap<TMeshBase, TMesh>>::derived_ptr;\r\n        internal::expmap_compute_common(mesh, seeds, seeds_basis_u, seeds_uv, dist_max, uv_min, uv_max, expmap_paramed_faces);\r\n    }\r\n    void expmap_compute(\r\n        typename TMeshBase::VHandle seed,\r\n        Eigen::Vector3d             seed_basis_u,\r\n        Eigen::Vector2d             seed_uv,\r\n        double dist_max,\r\n        const Eigen::Vector2d& uv_min = Eigen::Vector2d::Constant(-std::numeric_limits<double>::max()),\r\n        const Eigen::Vector2d& uv_max = Eigen::Vector2d::Constant( std::numeric_limits<double>::max()))\r\n    {\r\n        expmap_compute(\r\n            std::vector<typename TMeshBase::VHandle>(1, seed        ),\r\n            std::vector<Eigen::Vector3d            >(1, seed_basis_u),\r\n            std::vector<Eigen::Vector2d            >(1, seed_uv     ),\r\n            dist_max,\r\n            uv_min,\r\n            uv_max);\r\n    }\r\n};\r\n\r\n// specialization for triangle meshes, with functionality to convert on-surface position (face id + barycentric coord) into uv coordinates.\r\ntemplate <class TTrait, class TMesh>\r\nstruct ExpMap<OpenMesh::TriMesh_ArrayKernelT<TTrait>, TMesh> : public DerivedPtrHolder<TMesh, ExpMap<OpenMesh::TriMesh_ArrayKernelT<TTrait>, TMesh>> {\r\n    typedef OpenMesh::TriMesh_ArrayKernelT<TTrait> MeshBase;\r\n    \r\n    std::vector<typename MeshBase::FHandle> expmap_paramed_faces;\r\n    \r\n    void expmap_compute(\r\n        const std::vector<typename MeshBase::VHandle>& seeds,\r\n        const std::vector<Eigen::Vector3d           >& seeds_basis_u,\r\n        const std::vector<Eigen::Vector2d           >& seeds_uv,\r\n        double dist_max,\r\n        const Eigen::Vector2d& uv_min = Eigen::Vector2d::Constant(-std::numeric_limits<double>::max()),\r\n        const Eigen::Vector2d& uv_max = Eigen::Vector2d::Constant( std::numeric_limits<double>::max()))\r\n    {\r\n        TMesh* mesh = get_mesh();\r\n        internal::expmap_compute_common(mesh, seeds, seeds_basis_u, seeds_uv, dist_max, uv_min, uv_max, expmap_paramed_faces);\r\n    }\r\n    void expmap_compute(\r\n        typename MeshBase::VHandle seed,\r\n        Eigen::Vector3d            seed_basis_u,\r\n        Eigen::Vector2d            seed_uv,\r\n        double dist_max,\r\n        const Eigen::Vector2d& uv_min = Eigen::Vector2d::Constant(-std::numeric_limits<double>::max()),\r\n        const Eigen::Vector2d& uv_max = Eigen::Vector2d::Constant( std::numeric_limits<double>::max()))\r\n    {\r\n        expmap_compute(\r\n            std::vector<typename MeshBase::VHandle>(1, seed        ),\r\n            std::vector<Eigen::Vector3d           >(1, seed_basis_u),\r\n            std::vector<Eigen::Vector2d           >(1, seed_uv     ),\r\n            dist_max,\r\n            uv_min,\r\n            uv_max);\r\n    }\r\n    void expmap_compute(\r\n        const std::vector<FaceBaryCoord  >& seeds,\r\n        const std::vector<Eigen::Vector3d>& seeds_basis_u,\r\n        const std::vector<Eigen::Vector2d>& seeds_uv,\r\n        double dist_max,\r\n        const Eigen::Vector2d& uv_min = Eigen::Vector2d::Constant(-std::numeric_limits<double>::max()),\r\n        const Eigen::Vector2d& uv_max = Eigen::Vector2d::Constant( std::numeric_limits<double>::max()))\r\n    {\r\n        TMesh* mesh = get_mesh();\r\n        \r\n        std::vector<typename MeshBase::VHandle> seeds2;\r\n        std::vector<Eigen::Vector3d           > seeds2_basis_u;\r\n        std::vector<Eigen::Vector2d           > seeds2_uv;\r\n        \r\n        for (size_t i = 0; i < seeds.size(); ++i) {\r\n            auto& seed         = seeds        [i];\r\n            auto& seed_basis_u = seeds_basis_u[i];\r\n            auto& seed_uv      = seeds_uv     [i];\r\n            \r\n            Eigen::Vector3d p = o2e(seed.blend_point (*mesh));\r\n            Eigen::Vector3d n = o2e(seed.blend_normal(*mesh));\r\n            \r\n            Eigen::Vector3d seed_basis_v = n.cross(seed_basis_u);\r\n            \r\n            double offset_scaling = 1 / seed_basis_u.squaredNorm();\r\n            \r\n            for (auto v = mesh->fv_iter(seed.f); v; ++v) {\r\n                Eigen::Vector3d pq = o2e(mesh->point(v)) - p;\r\n                Eigen::Vector2d uv_offset(pq.dot(seed_basis_u), pq.dot(seed_basis_v));\r\n                uv_offset *= offset_scaling;\r\n                \r\n                seeds2        .push_back(v);\r\n                seeds2_basis_u.push_back(seed_basis_u);\r\n                seeds2_uv     .push_back(seed_uv + uv_offset);\r\n            }\r\n        }\r\n        \r\n        expmap_compute(seeds2, seeds2_basis_u, seeds2_uv, dist_max, uv_min, uv_max);\r\n    }\r\n    void expmap_compute(\r\n        FaceBaryCoord   seed,\r\n        Eigen::Vector3d seed_basis_u,\r\n        Eigen::Vector2d seed_uv,\r\n        double dist_max,\r\n        const Eigen::Vector2d& uv_min = Eigen::Vector2d::Constant(-std::numeric_limits<double>::max()),\r\n        const Eigen::Vector2d& uv_max = Eigen::Vector2d::Constant( std::numeric_limits<double>::max()))\r\n    {\r\n        expmap_compute(\r\n            std::vector<FaceBaryCoord  >(1, seed        ),\r\n            std::vector<Eigen::Vector3d>(1, seed_basis_u),\r\n            std::vector<Eigen::Vector2d>(1, seed_uv     ),\r\n            dist_max,\r\n            uv_min,\r\n            uv_max);\r\n    }\r\n    // conversion from on-surface position to uv coordinates\r\n    boost::optional<Eigen::Vector2d> fbc_to_uv(const FaceBaryCoord& fbc) const {\r\n        TMesh* mesh = get_mesh();\r\n        \r\n        if (!mesh->data(fbc.f).expmap_paramed)\r\n            return boost::none;\r\n        \r\n        return fbc.blend_value<MeshBase, Eigen::Vector2d>(\n            *mesh,\n            [](const MeshBase& mesh, typename MeshBase::VHandle v) { return mesh.data(v).expmap.uv; }\n        );\n    }\r\n    boost::optional<Eigen::Vector2d> fbc_to_uv(typename MeshBase::FHandle f, const BaryCoord& bc) const {\r\n        return fbc_to_uv(FaceBaryCoord(f, bc));\r\n    }\r\n    FaceBaryCoord uv_to_fbc(Eigen::Vector2d uv) const {\r\n        TMesh* mesh = get_mesh();\r\n        \r\n        for (auto f : expmap_paramed_faces) {\n            // compute bounding box of this face\n            Eigen::AlignedBox2d box;\n            std::vector<Eigen::Vector2d> face_uv;\n            for (auto v = mesh->cfv_iter(f); v.is_valid(); ++v) {\n                auto expmap_uv = mesh->data(*v).expmap.uv;\n                face_uv.push_back(expmap_uv);\n                box.extend(expmap_uv);\n            }\n            \n            // skip if uv is outside the bounding box\n            if (!box.contains(uv)) continue;\n            \n            // compute barycentric coordinate\n            // (1 - hit.u - hit.v) * face_uv[0] + hit.u * face_uv[1] + hit.v * face_uv[2] = uv\n            // | face_uv[1] - face_uv[0], face_uv[2] - face_uv[0] | * |hit.u| = | uv - face_uv[0] |\n            // |                                                  |   |hit.v|   |                 |\n            Eigen::Matrix2d A;\n            A << face_uv[1] - face_uv[0], face_uv[2] - face_uv[0];\n            Eigen::Vector2d hit_uv = A.inverse() * (uv - face_uv[0]);\n            \n            // skip if barycentric coordinate is negative\n            BaryCoord bc(1 - hit_uv[0] - hit_uv[1], hit_uv[0], hit_uv[1]);\n            if (!bc.is_all_positive()) continue;\n            \n            // return result\n            return FaceBaryCoord(f, bc);\r\n        }\r\n        \r\n        return FaceBaryCoord();\r\n    }\r\nprivate:\r\n    TMesh* get_mesh() const { return DerivedPtrHolder<TMesh, ExpMap<OpenMesh::TriMesh_ArrayKernelT<TTrait>, TMesh>>::derived_ptr; }\r\n};\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/base/FaceArea.h",
    "content": "#pragma once\r\n#include <cmath>\r\n#include <iostream>\r\n#include \"../DerivedPtrHolder.h\"\r\n#include \"EdgeLength.h\"\r\n\r\nnamespace kt84 {\r\n\r\nstruct FaceArea_FaceTraits {\r\n    double faceArea;\r\n    FaceArea_FaceTraits() : faceArea() {}\r\n};\r\ntypedef EdgeLength_EdgeTraits FaceArea_EdgeTraits;\r\n\r\ntemplate <class TMeshBase, class TMesh>\r\nstruct FaceArea\r\n    : public DerivedPtrHolder<TMesh, FaceArea<TMeshBase, TMesh>>\r\n    , public EdgeLength<TMeshBase, TMesh>\r\n{\r\n    void faceArea_compute() {\r\n        TMesh* mesh = DerivedPtrHolder<TMesh, FaceArea<TMeshBase, TMesh>>::derived_ptr;\r\n        \r\n        mesh->edgeLength_compute();\r\n        \r\n        for (auto f : mesh->faces()) {\r\n            if (mesh->valence(f) != 3) {\r\n                std::cerr << \"Error: faceArea_compute() is called on polygonal face!\\n\";\r\n                assert(false);\r\n            }\r\n            auto fh = mesh->fh_iter(f);\r\n            double a = mesh->data(mesh->edge_handle(*fh++)).edgeLength;\r\n            double b = mesh->data(mesh->edge_handle(*fh++)).edgeLength;\r\n            double c = mesh->data(mesh->edge_handle(*fh++)).edgeLength;\r\n            assert(!fh.is_valid());\r\n            // Heron's formula\r\n            double s = (a + b + c) / 2;\r\n            mesh->data(f).faceArea = std::sqrt(s * (s - a) * (s - b) * (s - c));\r\n        }\r\n    }\r\n};\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/base/Geodesic.h",
    "content": "#pragma once\r\n#include <memory>\r\n#include <iostream>\r\n#include <vector>\r\n#include <Eigen/Core>\r\n#include <OpenMesh/Core/Mesh/PolyConnectivity.hh>\r\n#include \"../../container_cast.h\"\r\n#include \"geodesic/geodesic_algorithm_dijkstra.h\"\r\n#include \"geodesic/geodesic_algorithm_exact.h\"\r\n#include \"geodesic/geodesic_algorithm_subdivision.h\"\r\n\r\nnamespace kt84 {\r\n\r\n    struct GeodesicPoint {\r\n        OpenMesh::PolyConnectivity::VHandle vhandle;\r\n        OpenMesh::PolyConnectivity::EHandle ehandle;\r\n        OpenMesh::PolyConnectivity::FHandle fhandle;\r\n        Eigen::Vector2d ecoord;         // barycentric coord for edge\r\n        Eigen::Vector3d fcoord;         // barycentric coord for face\r\n        GeodesicPoint(){}\r\n        GeodesicPoint(OpenMesh::PolyConnectivity::VHandle vhandle) : vhandle(vhandle) {}\r\n        GeodesicPoint(OpenMesh::PolyConnectivity::EHandle ehandle, const Eigen::Vector2d& ecoord) : ehandle(ehandle), ecoord(ecoord) {}\r\n        GeodesicPoint(OpenMesh::PolyConnectivity::FHandle fhandle, const Eigen::Vector3d& fcoord) : fhandle(fhandle), fcoord(fcoord) {}\r\n        GeodesicPoint(const geodesic::SurfacePoint& p) {\r\n            switch (p.type()) {\r\n            case geodesic::VERTEX:\r\n                vhandle = OpenMesh::PolyConnectivity::VHandle(p.base_element()->id);\r\n                break;\r\n            case geodesic::EDGE:\r\n                ehandle = OpenMesh::PolyConnectivity::EHandle(p.base_element()->id);\r\n                break;\r\n            }\r\n        }\r\n        operator geodesic::SurfacePoint() const {\r\n            geodesic::SurfacePoint p;\r\n            //...\r\n            return p;\r\n        }\r\n        bool is_vertex() const { return vhandle.is_valid(); }\r\n        bool is_edge  () const { return ehandle.is_valid(); }\r\n        bool is_face  () const { return fhandle.is_valid(); }\r\n    };\r\n    \r\n    template <class TMeshBase, class TMesh>\r\n    struct Geodesic : public DerivedPtrHolder<TMesh, Geodesic <TMeshBase, TMesh>> {\r\n        void geodesic_init() {\r\n            auto mesh = get_mesh();\r\n            std::vector<double> points;\r\n            points.reserve(mesh->n_vertices() * 3);\r\n            for (auto v : mesh->vertices()) {\r\n                auto p = mesh->point(v);\r\n                points.push_back(p[0]);\r\n                points.push_back(p[1]);\r\n                points.push_back(p[2]);\r\n            }\r\n            std::vector<unsigned> faces;\r\n            faces.reserve(mesh->n_faces() * 3);\r\n            for (auto f : mesh->faces()) {\r\n                if (mesh->valence(f) != 3) {\r\n                    std::cerr << \"Error: geodesic algorithm does not work on polygonal meshes!\\n\";\r\n                    assert(false);\r\n                }\r\n                for (auto v : mesh->fv_range(f))\r\n                    faces.push_back(v.idx());\r\n            }\r\n            geodesic.mesh.initialize_mesh_data(points, faces);\r\n            geodesic_set_algorithm_exact();      // default setting\r\n        }\r\n        void geodesic_set_algorithm_exact() {\r\n            geodesic.algorithm = std::make_shared<geodesic::GeodesicAlgorithmExact>(&geodesic.mesh);\r\n        }\r\n        void geodesic_set_algorithm_dijkstra() {\r\n            geodesic.algorithm = std::make_shared<geodesic::GeodesicAlgorithmDijkstra>(&geodesic.mesh);\r\n        }\r\n        void geodesic_set_algorithm_subdivision(int subdivision_level) {\r\n            geodesic.algorithm = std::make_shared<geodesic::GeodesicAlgorithmSubdivision>(&geodesic.mesh, subdivision_level);\r\n        }\r\n        std::vector<GeodesicPoint> geodesic_compute(const GeodesicPoint& source, const GeodesicPoint& target) {\r\n            assert(geodesic.algorithm);\r\n            std::vector<geodesic::SurfacePoint> path;\r\n            geodesic::SurfacePoint source_(source), target_(target);\r\n            geodesic.algorithm->geodesic(source_, target_, path);\r\n            return container_cast<GeodesicPoint>(path);\r\n        }\r\n        struct Data {\r\n            geodesic::Mesh mesh;\n            std::shared_ptr<geodesic::GeodesicAlgorithmBase> algorithm;\r\n            Data() {}\r\n            Data(const Data& src)\r\n                : mesh(src.mesh)\r\n            {\r\n                switch (src.algorithm->type()) {\r\n                case geodesic::GeodesicAlgorithmBase::EXACT:\r\n                    algorithm = std::make_shared<geodesic::GeodesicAlgorithmExact>(&mesh);\r\n                    break;\r\n                case geodesic::GeodesicAlgorithmBase::DIJKSTRA:\r\n                    algorithm = std::make_shared<geodesic::GeodesicAlgorithmDijkstra>(&mesh);\r\n                    break;\r\n                case geodesic::GeodesicAlgorithmBase::SUBDIVISION:\r\n                {\r\n                    auto subdivision_level = static_cast<geodesic::GeodesicAlgorithmSubdivision*>(algorithm.get())->subdivision_level();\r\n                    algorithm = std::make_shared<geodesic::GeodesicAlgorithmSubdivision>(&mesh, subdivision_level);\r\n                    break;\r\n                }\r\n                default:\r\n                    assert(false);\r\n                }\r\n            }\r\n            Data& Data::operator=(const Data& src) {\r\n                mesh = src.mesh;\r\n                switch (src.algorithm->type()) {\r\n                case geodesic::GeodesicAlgorithmBase::EXACT:\r\n                    algorithm = std::make_shared<geodesic::GeodesicAlgorithmExact>(&mesh);\r\n                    break;\r\n                case geodesic::GeodesicAlgorithmBase::DIJKSTRA:\r\n                    algorithm = std::make_shared<geodesic::GeodesicAlgorithmDijkstra>(&mesh);\r\n                    break;\r\n                case geodesic::GeodesicAlgorithmBase::SUBDIVISION:\r\n                {\r\n                    auto subdivision_level = static_cast<geodesic::GeodesicAlgorithmSubdivision*>(algorithm.get())->subdivision_level();\r\n                    algorithm = std::make_shared<geodesic::GeodesicAlgorithmSubdivision>(&mesh, subdivision_level);\r\n                    break;\r\n                }\r\n                default:\r\n                    assert(false);\r\n                }\r\n                return *this;\r\n            }\r\n        } geodesic;\r\n    private:\r\n        const TMesh* get_mesh() const { return DerivedPtrHolder<TMesh, Geodesic<TMeshBase, TMesh>>::derived_ptr; }\r\n    };\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/base/GeodesicLoop_incomplete.h",
    "content": "#pragma once\r\n#include <vector>\r\n#include <OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh>\r\n#include <OpenMesh/Core/Mesh/PolyConnectivity.hh>\r\n#include \"../../StdUtil.h\"\r\n#include \"../../EigenUtil.h\"\r\n#include \"../vector_convert.h\"\r\n\r\n/*\r\n    Implementation of the following article:\r\n        Shi-Qing Xin, Ying He, Chi-Wing Fu.\r\n        Efficiently Computing Exact Geodesic Loops within Finite Steps.\r\n        IEEE Transactions on Visualization and Computer Graphics.\r\n        vol.18, no.6, pp.879-889, June 2012.\r\n        doi: 10.1109/TVCG.2011.119\r\n    \r\n    The paper's webpage: https://sites.google.com/site/xinshiqing/\r\n}*/\r\n\r\nnamespace kt84 {\r\n\r\nstruct GeodesicLoop_VertexTraits {\r\n    enum class StripSide {\r\n        UNDEFINED = -1,\r\n        LEFT,\r\n        RIGHT\r\n    };\r\n    \r\n    struct Data {\r\n        StripSide stripSide;\r\n        Eigen::Vector2d uv;\r\n        Eigen::Vector2d uv_duplicate;       // for vertices on the cutting edge. corresponding to the duplicated vertex at the end of unfolded triangle strip.\r\n        \r\n        Data()\r\n            : stripSide(StripSide::UNDEFINED)\r\n            , uv(0, 0)\r\n            , uv_duplicate(0, 0)\r\n        {}\r\n    } geodesicLoop;\r\n};\r\n\r\nstruct GeodesicLoop_EdgeTraits {\r\n    enum class VertexSide {\r\n        UNDEFINED = -1,\r\n        COINCIDE,\r\n        LEFT,\r\n        RIGHT\r\n    } geodesicLoop_vertexSide;\r\n    \r\n    GeodesicLoop_EdgeTraits()\r\n        : geodesicLoop_vertexSide(VertexSide::UNDEFINED)\r\n    {}\r\n};\r\n\r\ntemplate <class TMeshBase>\r\nstruct GeodesicLoop;\r\n\r\ntemplate <class TTrait>\r\nstruct GeodesicLoop<OpenMesh::TriMesh_ArrayKernelT<TTrait>> {\r\n    typedef OpenMesh::TriMesh_ArrayKernelT<TTrait> MeshBase;\r\n    \r\n    struct PathPoint {\r\n        typename MeshBase::VHandle vertex;\r\n        typename MeshBase::EHandle edge;\r\n        double edge_coordinate;         // supposing vi corresponds to to_vertex(halfedge(edge, i)) where i = 0 or 1, \r\n                                        // this represents on-edge point as: (1 - edge_coordinate) * v0 + edge_coordinate * v1\r\n        enum class Type {\r\n            UNDEFINED,\r\n            VERTEX,\r\n            EDGE\r\n        };\r\n        Type type() const {\r\n            return\r\n                 vertex.is_valid() && !edge.is_valid() ? Type::VERTEX :\r\n                !vertex.is_valid() &&  edge.is_valid() ? Type::EDGE   : Type::UNDEFINED;\r\n        }\r\n        PathPoint() : edge_coordinate(-1) {}\r\n        PathPoint(typename MeshBase::VHandle vertex_) : vertex(vertex_), edge_coordinate(-1) {}\r\n        PathPoint(typename MeshBase::EHandle edge_, double edge_coordinate_) : edge(edge_), edge_coordinate(edge_coordinate_) {}\r\n        bool operator==(const PathPoint& rhs) const {\r\n            return\r\n                (type() == Type::VERTEX && vertex == rhs.vertex) ||\r\n                (type() == Type::EDGE   && edge   == rhs.edge   && edge_coordinate == rhs.edge_coordinate);\r\n        }\r\n    };\r\n    typedef std::vector<typename MeshBase::EHandle> EdgeSequence;\r\n    typedef std::vector<PathPoint> Path;\r\n    \r\n    virtual ~GeodesicLoop() {}\r\n    Path geodesicLoop_compute(const EdgeSequence& closed_edge_sequence) {\r\n        if (closed_edge_sequence.front() != closed_edge_sequence.back())\r\n            // semantics of closed sequence/loop: front and back are the same\r\n            return Path();\r\n        \r\n        auto mesh = dynamic_cast<MeshBase*>(this);\r\n        assert(mesh);\r\n        \r\n        auto E = closed_edge_sequence;\r\n        \r\n        // helper functions=====================================================================================================================================\r\n        auto determine_side_around_vertex = [mesh] (typename MeshBase::VHandle v, const PathPoint& point_prev, const PathPoint& point_next) -> void {\r\n            // init\r\n            for (auto e = mesh->ve_iter(v); e; ++e)\r\n                mesh->data(e).geodesicLoop_vertexSide = GeodesicLoop_EdgeTraits::VertexSide::UNDEFINED;\r\n            \r\n            // set side information immediately available from point_prev and point_next\r\n            for (auto h = mesh->voh_iter(v); h; ++h) {\r\n                auto v_to            = mesh->to_vertex_handle(h);\r\n                auto e               = mesh->edge_handle(h);\r\n                auto e_prev          = mesh->edge_handle(mesh->prev_halfedge_handle(h));\r\n                auto e_next          = mesh->edge_handle(mesh->prev_halfedge_handle(h));\r\n                auto e_opposite_next = mesh->edge_handle(mesh->next_halfedge_handle(mesh->opposite_halfedge_handle(h)));\r\n                \r\n                bool prev_is_left = v_to == point_next.vertex;\r\n                \r\n                if (v_to == point_prev.vertex || v_to == point_next.vertex) {\r\n                    mesh->data(e              ).geodesicLoop_vertexSide = GeodesicLoop_EdgeTraits::VertexSide::COINCIDE;\r\n                    mesh->data(e_prev         ).geodesicLoop_vertexSide = prev_is_left ? GeodesicLoop_EdgeTraits::VertexSide::LEFT  : GeodesicLoop_EdgeTraits::VertexSide::RIGHT;\r\n                    mesh->data(e_opposite_next).geodesicLoop_vertexSide = prev_is_left ? GeodesicLoop_EdgeTraits::VertexSide::RIGHT : GeodesicLoop_EdgeTraits::VertexSide::LEFT ;\r\n                    \r\n                } else if (e_next == point_prev.edge || e_next == point_next.edge) {\r\n                    mesh->data(e_prev).geodesicLoop_vertexSide = prev_is_left ? GeodesicLoop_EdgeTraits::VertexSide::LEFT  : GeodesicLoop_EdgeTraits::VertexSide::RIGHT;\r\n                    mesh->data(e     ).geodesicLoop_vertexSide = prev_is_left ? GeodesicLoop_EdgeTraits::VertexSide::RIGHT : GeodesicLoop_EdgeTraits::VertexSide::LEFT ;\r\n                }\r\n            }\r\n            \r\n            // find halfedge outgoing from v which is not yet assigned side info with its previous one side info assigned already\r\n            auto h_start = mesh->halfedge_handle(v);\r\n            for (; ; ) {\r\n                auto e = mesh->edge_handle(h_start);\r\n                if (mesh->data(e).geodesicLoop_vertexSide != GeodesicLoop_EdgeTraits::VertexSide::UNDEFINED)\r\n                    continue;\r\n                \r\n                auto e_prev = mesh->edge_handle(mesh->prev_halfedge_handle(h_start));\r\n                if (mesh->data(e_prev).geodesicLoop_vertexSide != GeodesicLoop_EdgeTraits::VertexSide::UNDEFINED)\r\n                    break;\r\n                \r\n                h_start = mesh->next_halfedge_handle(mesh->opposite_halfedge_handle(h_start));\r\n            }\r\n            \r\n            // set side flag for other halfedges by propagation\r\n            for (auto h = h_start; ; ) {\r\n                auto e = mesh->edge_handle(h);\r\n                auto& vertexSide = mesh->data(e).geodesicLoop_vertexSide;\r\n                \r\n                if (vertexSide == GeodesicLoop_EdgeTraits::VertexSide::UNDEFINED) {\r\n                    // assign the same side as the previous edge\r\n                    auto e_prev = mesh->edge_handle(mesh->prev_halfedge_handle(h_start));\r\n                    vertexSide = mesh->data(e_prev).geodesicLoop_vertexSide;\r\n                }\r\n                \r\n                h = mesh->next_halfedge_handle(mesh->opposite_halfedge_handle(h));\r\n                if (h == h_start)\r\n                    break;\r\n            }\r\n        };\r\n        auto get_edge_point = [mesh] (const PathPoint& point) -> Eigen::Vector3d {\r\n            assert(point.type() == PathPoint::Type::EDGE);\r\n            auto v0v1 = o2e(OpenMeshUtil::edge_to_point_pair(*mesh, point.edge));\r\n            return (1 - point.edge_coordinate) * v0v1.first + point.edge_coordinate * v0v1.second;\r\n        };\r\n        auto compute_incident_angles = [mesh, get_edge_point] (typename MeshBase::VHandle v, const PathPoint& point_prev, const PathPoint& point_next)-> std::pair<double, double> {\r\n            auto result = std::make_pair<double, double>(0, 0);\r\n            \r\n            Eigen::Vector3d edge_point_prev = get_edge_point(point_prev);\r\n            Eigen::Vector3d edge_point_next = get_edge_point(point_next);\r\n            \r\n            for (auto h = mesh->voh_iter(v); h; ++h) {\r\n                auto h_next = mesh->next_halfedge_handle(h);\r\n                auto h_prev = mesh->prev_halfedge_handle(h);\r\n            \r\n                Eigen::Vector3d d0 = -o2e(OpenMeshUtil::halfedge_to_vector(*mesh, h_prev)).normalized();\r\n                Eigen::Vector3d d1 =  o2e(OpenMeshUtil::halfedge_to_vector(*mesh, h     )).normalized();\r\n                \r\n                auto side0 = mesh->data(mesh->edge_handle(h_prev)).geodesicLoop_vertexSide;\r\n                auto side1 = mesh->data(mesh->edge_handle(h     )).geodesicLoop_vertexSide;\r\n                \r\n                if (side0 == GeodesicLoop_EdgeTraits::VertexSide::LEFT && side1 == GeodesicLoop_EdgeTraits::VertexSide::RIGHT) {\r\n                    // this face is at transition from left side to right side\r\n                    assert(point_next.edge == mesh->edge_handle(h_next));\r\n                    \r\n                    Eigen::Vector3d dm = (edge_point_next - o2e(mesh->point(v))).normalized();\r\n                    \r\n                    double angle_left  = StdUtil::acos_clamped(d0.dot(dm));\r\n                    double angle_right = StdUtil::acos_clamped(d1.dot(dm));\r\n                    \r\n                    result.first  += angle_left ;\r\n                    result.second += angle_right;\r\n                    \r\n                } else if (side0 == GeodesicLoop_EdgeTraits::VertexSide::RIGHT && side1 == GeodesicLoop_EdgeTraits::VertexSide::LEFT) {\r\n                    // this face is at transition from right side to left side\r\n                    assert(point_prev.edge == mesh->edge_handle(h_next));\r\n                    \r\n                    Eigen::Vector3d dm = (edge_point_prev - o2e(mesh->point(v))).normalized();\r\n                    \r\n                    double angle_left  = StdUtil::acos_clamped(d1.dot(dm));\r\n                    double angle_right = StdUtil::acos_clamped(d0.dot(dm));\r\n                    \r\n                    result.first  += angle_left ;\r\n                    result.second += angle_right;\r\n                    \r\n                \r\n                } else {\r\n                    // simply add angle subtending the face to appropriate side\r\n                    double angle = StdUtil::acos_clamped(d0.dot(d1));\r\n                    \r\n                    auto side = side0 == GeodesicLoop_EdgeTraits::VertexSide::COINCIDE ? side1 : side0;\r\n                    \r\n                    if (side == GeodesicLoop_EdgeTraits::VertexSide::LEFT)\r\n                        result.first  += angle;\r\n                    else\r\n                        result.second += angle;\r\n                }\r\n            }\r\n            \r\n            return result;\r\n        };\r\n        auto is_inward_convex         = [mesh, determine_side_around_vertex, compute_incident_angles] (const EdgeSequence& E, typename MeshBase::VHandle v, const PathPoint& point_prev, const PathPoint& point_next) -> bool {\r\n            determine_side_around_vertex(v, point_prev, point_next);\r\n            auto angles = compute_incident_angles(v, point_prev, point_next);\r\n            \r\n            auto vertexSide = GeodesicLoop_EdgeTraits::VertexSide::UNDEFINED;\r\n            for (auto e = mesh->ve_iter(v); e; ++e) {\r\n                if (StdUtil::find(E, e) != E.end()) {\r\n                    vertexSide = mesh->data(e).geodesicLoop_vertexSide;\r\n                    break;\r\n                }\r\n            }\r\n            \r\n            return\r\n                vertexSide == GeodesicLoop_EdgeTraits::VertexSide::LEFT  && angles.first  >= StdUtil::pi() ||\r\n                vertexSide == GeodesicLoop_EdgeTraits::VertexSide::RIGHT && angles.second >= StdUtil::pi();\r\n        };\r\n        auto is_fully_convex          = [mesh, determine_side_around_vertex, compute_incident_angles] (typename MeshBase::VHandle v, const PathPoint& point_prev, const PathPoint& point_next) -> bool {\r\n            determine_side_around_vertex(v, point_prev, point_next);\r\n            auto angles = compute_incident_angles(v, point_prev, point_next);\r\n            \r\n            return angles.first >= StdUtil::pi() && angles.second >= StdUtil::pi();\r\n        };\r\n        auto unfold_edge_sequence     = [mesh] (const EdgeSequence& E) -> void {\r\n            auto e = E.begin();\r\n            auto h = mesh->halfedge_handle(*e, 0);\r\n            \r\n            // ensure h is oriented from right to left\r\n            if (mesh->data(mesh->to_vertex_handle(h)).geodesicLoop.stripSide != GeodesicLoop_VertexTraits::StripSide::LEFT)\r\n                h = mesh->halfedge_handle(*e, 1);\r\n            \r\n            // fix first edge arbitrarily\r\n            mesh->data(mesh->from_vertex_handle(h)).geodesicLoop.uv << 0, 1;\r\n            mesh->data(mesh->to_vertex_handle  (h)).geodesicLoop.uv << 0, 0;\r\n            \r\n            MeshBase::VHandle endpoint[2] = { mesh->from_vertex_handle(h), mesh->to_vertex_handle(h) };\r\n            \r\n            while (true) {\r\n                auto h_next = mesh->next_halfedge_handle(h);\r\n                \r\n                auto v0 = mesh->from_vertex_handle(h);\r\n                auto v1 = mesh->to_vertex_handle  (h);\r\n                auto v2 = mesh->to_vertex_handle  (h_next);\r\n                // assuming that uv for v0 and v1 is known, compute uv for v2\r\n\r\n                Eigen::Vector3d p0 = o2e(mesh->point(v0));\r\n                Eigen::Vector3d p1 = o2e(mesh->point(v1));\r\n                Eigen::Vector3d p2 = o2e(mesh->point(v2));\r\n                Eigen::Vector3d n  = o2e(mesh->normal(mesh->face_handle(h)));\r\n                \r\n                Eigen::Vector3d p0p1 = p1 - p0;\r\n                Eigen::Vector3d p0p2 = p2 - p0;\r\n                Eigen::Vector3d p0pH = n.cross(p0p1);\r\n                \r\n                double a = p0p2.dot(p0p1) / p0p1.squaredNorm();\r\n                double b = p0p2.dot(p0pH) / p0pH.squaredNorm();\r\n                \r\n                Eigen::Vector2d q0 = mesh->data(v0).geodesicLoop.uv;\r\n                Eigen::Vector2d q1 = mesh->data(v1).geodesicLoop.uv;\r\n                \r\n                Eigen::Vector2d q0q1 = q1 - q0;\r\n                Eigen::Vector2d q0qH = EigenUtil::rotate90(q0q1);\r\n                \r\n                Eigen::Vector2d q2 = q0 + a * q0q1 + b * q0qH;\r\n                \r\n                // store result to approrpiate place by checking if v2 is endpoint or not\r\n                if (v2 == endpoint[0] || v2 == endpoint[1])\r\n                    mesh->data(v2).geodesicLoop.uv_duplicate = q2;\r\n                else\r\n                    mesh->data(v2).geodesicLoop.uv           = q2;\r\n                \r\n                // terminate if reaching the end\r\n                if (e == --E.end())\r\n                    break;\r\n                \r\n                // go to next edge\r\n                ++e;\r\n                h = h_next;\r\n                if (mesh->edge_handle(h) != *e)\r\n                    h = mesh->next_halfedge_handle(h);      // ensure h corresponds to e\r\n                h = mesh->opposite_halfedge_handle(h);\r\n            }\r\n        };\r\n        auto compute_relaxed_geodesic = [mesh] (const EdgeSequence& E, typename MeshBase::VHandle v_relaxed) -> Path {\r\n            // reference: http://digestingduck.blogspot.ch/2010/03/simple-stupid-funnel-algorithm.html\r\n            \r\n            // contract uv of the other endpoint (opposite side of v_relaxed) of E's first edge to uv of v_relaxed\r\n            {\r\n                auto v_other = OpenMeshUtil::opposite_vertex(*mesh, E[0], v_relaxed);\r\n                auto& v_relaxed_data = mesh->data(v_relaxed).geodesicLoop;\r\n                auto& v_other_data   = mesh->data(v_other  ).geodesicLoop;\r\n            \r\n                v_other_data.uv           = v_relaxed_data.uv;\r\n                v_other_data.uv_duplicate = v_relaxed_data.uv_duplicate;\r\n            }\r\n            \r\n            std::vector<MeshBase::VHandle> apices;\r\n            apices.push_back(v_relaxed);\r\n            \r\n            MeshBase::VHandle apex;\r\n            MeshBase::VHandle funnel_left;\r\n            MeshBase::VHandle funnel_right;\r\n            apex = funnel_left = funnel_right = v_relaxed;\r\n            \r\n            for (auto e = E.begin() + 2; e != --E.end(); ++e) {\r\n                auto portal_left  = mesh->to_vertex_handle(mesh->halfedge_handle(*e, 0));\r\n                auto portal_right = mesh->to_vertex_handle(mesh->halfedge_handle(*e, 1));\r\n                \r\n                // ensure correct side\r\n                bool is_portal_flipped = false;\r\n                if (mesh->data(portal_left).geodesicLoop.stripSide == GeodesicLoop_VertexTraits::StripSide::RIGHT) {\r\n                    std::swap(portal_left, portal_right);\r\n                    is_portal_flipped = true;\r\n                }\r\n                \r\n                Eigen::Vector2d apex_pos         = mesh->data(apex        ).geodesicLoop.uv;\r\n                Eigen::Vector2d funnel_left_pos  = mesh->data(funnel_left ).geodesicLoop.uv;\r\n                Eigen::Vector2d funnel_right_pos = mesh->data(funnel_right).geodesicLoop.uv;\r\n                Eigen::Vector2d portal_left_pos  = mesh->data(portal_left ).geodesicLoop.uv;\r\n                Eigen::Vector2d portal_right_pos = mesh->data(portal_right).geodesicLoop.uv;\r\n                \r\n                if (e == --E.end()) {\r\n                    portal_left_pos  = mesh->data(portal_left ).geodesicLoop.uv_duplicate;\r\n                    portal_right_pos = mesh->data(portal_right).geodesicLoop.uv_duplicate;\r\n                }\r\n                \r\n                if (EigenUtil::triangle_area(apex_pos, funnel_right_pos, portal_right_pos) <= 0) {\r\n                    // update right funnel\r\n                    if (apex == funnel_right || EigenUtil::triangle_area(apex_pos, funnel_left_pos, portal_right_pos) > 0) {\r\n                        // tighten right funnel\r\n                        funnel_right = portal_right;\r\n                        \r\n                    } else {\r\n                        // right portal occludes left funnel -> reset apex as left funnel\r\n                        apex = funnel_right = funnel_left;\r\n                        \r\n                        // add new apex\r\n                        apices.push_back(apex);\r\n                        \r\n                        // TODO: restart scan!\r\n                        \r\n                        continue;\r\n                    }\r\n                }\r\n                \r\n                if (EigenUtil::triangle_area(apex_pos, funnel_left_pos, portal_left_pos) >= 0) {\r\n                    // update left funnel\r\n                    if (apex == funnel_left || EigenUtil::triangle_area(apex_pos, funnel_right_pos, portal_left_pos) < 0) {\r\n                        // tighten left funnel\r\n                        funnel_left = portal_left;\r\n                        \r\n                    } else {\r\n                        // left portal occludes right funnel -> reset apex as right funnel\r\n                        apex = funnel_left = funnel_right;\r\n                        \r\n                        // add new apex\r\n                        apices.push_back(apex);\r\n                        \r\n                        // TODO: restart scan!\r\n                        \r\n                        continue;\r\n                    }\r\n                }\r\n            }\r\n            \r\n            // back of apices\r\n            apices.push_back(v_relaxed);\r\n            \r\n            // go through E, adding apices and edge points that apices intersect.\r\n            Path result;\r\n            auto apex0 = apices.begin();\r\n            auto apex1 = apex0 + 1;\r\n            for (auto e : E) {\r\n                if (OpenMeshUtil::contains(*mesh, e, *apex0)) {\r\n                    result.push_back(*apex0);\r\n                \r\n                } else if (OpenMeshUtil::contains(*mesh, e, *apex1)) {\r\n                    result.push_back(*apex1);\r\n                    ++apex0;\r\n                    ++apex1;\r\n                    if (apex1 == --apices.end())\r\n                        break;\r\n                \r\n                } else {\r\n                    // get intersection between (apex0, apex1) and (v0, v1) where vi is to_vertex(halfedge(e, i))\r\n                    Eigen::Vector2d apex0_pos = mesh->data(*apex0).geodesicLoop.uv;\r\n                    Eigen::Vector2d apex1_pos = mesh->data(*apex1).geodesicLoop.uv;\r\n                    if (apex1 == --apices.end())\r\n                        apex1_pos = mesh->data(*apex1).geodesicLoop.uv_duplicate;\r\n                    \r\n                    auto v0v1 = OpenMeshUtil::edge_to_vertex_pair(*mesh, e);\r\n                    Eigen::Vector2d v0_pos = mesh->data(v0v1.first ).geodesicLoop.uv;\r\n                    Eigen::Vector2d v1_pos = mesh->data(v0v1.second).geodesicLoop.uv;\r\n                    \r\n                    double s, t;\r\n                    EigenUtil::intersection(apex0_pos, apex1_pos, v0_pos, v1_pos, s, t);\r\n                    \r\n                    // insert edge point\r\n                    result.push_back(PathPoint(e, t));\r\n                }\r\n            }\r\n            result.erase(std::unique(result.begin(), result.end()), result.end());\r\n\r\n            return result;\r\n        };\r\n        auto next_edge_seuqnece       = [mesh] (const EdgeSequence& E, Path path) -> EdgeSequence {\r\n            EdgeSequence result;\r\n            \r\n            for (auto point = path.begin(); point != --path.end(); ++point) {\r\n                if (point->type() == PathPoint::Type::EDGE) {\r\n                    // very simple:)\r\n                    result.push_back(point->edge);\r\n                    continue;\r\n                }\r\n                \r\n                auto v = point->vertex;\r\n                auto point_prev = point == path.begin() ? --path.end() : (point - 1);\r\n                auto point_next = point == --path.end() ? path.begin() : (point + 1);\r\n                \r\n                // find an edge in E which doesn't contain v\r\n                auto search_pos = E.begin();\r\n                for (; search_pos != --E.end(); ++search_pos) {\r\n                    if (!OpenMeshUtil::contains(*mesh, *search_pos, v))\r\n                        break;\r\n                }\r\n                if (search_pos == --E.end())\r\n                    // degenerate case (probably?)\r\n                    return EdgeSequence();\r\n                \r\n                // advance search_pos until it finds the first edge that contains v\r\n                while (!OpenMeshUtil::contains(*mesh, *search_pos, v)) {\r\n                    ++search_pos;\r\n                    if (search_pos == --E.end())\r\n                        search_pos = E.begin();\r\n                }\r\n                \r\n                // add sequence of edges that contain v\r\n                EdgeSequence v_edges_old;\r\n                while (OpenMeshUtil::contains(*mesh, *search_pos, v)) {\r\n                    v_edges_old.push_back(*search_pos);\r\n                    ++search_pos;\r\n                    if (search_pos == --E.end())\r\n                        search_pos = E.begin();\r\n                }\r\n                \r\n                // collect ordered array of edges around v except for those coinciding with prev/next path vertex (if any)\r\n                EdgeSequence v_edges;\r\n                for (auto h = mesh->voh_iter(v); h; ++h) {\r\n                    auto v2 = mesh->to_vertex_handle(h);\r\n                    if (v2 == point_prev->vertex || v2 == point_next->vertex)\r\n                        continue;\r\n                    \r\n                    v_edges.push_back(mesh->edge_handle(h));\r\n                }\r\n                \r\n                // reorder the array s.t. edge sequence contained in the old one comes first\r\n                auto rotate_pos = v_edges.begin();\r\n                for (; rotate_pos != v_edges.end(); ++rotate_pos) {\r\n                    auto pos_prev = rotate_pos == v_edges.begin() ? --v_edges.end() : (rotate_pos - 1);\r\n                    if (std::find(v_edges_old.begin(), v_edges_old.end(), *pos_prev  ) == v_edges_old.end() &&\r\n                        std::find(v_edges_old.begin(), v_edges_old.end(), *rotate_pos) != v_edges_old.end())\r\n                    {\r\n                        break;\r\n                    }\r\n                }\r\n                std::rotate(v_edges_old.begin(), rotate_pos, v_edges_old.end());\r\n                \r\n                // get new edge sequence around v\r\n                auto insert_pos = v_edges.begin();\r\n                for (; insert_pos != v_edges.end(); ++insert_pos) {\r\n                    if (std::find(v_edges_old.begin(), v_edges_old.end(), *insert_pos) == v_edges_old.end())\r\n                        break;\r\n                }\r\n                EdgeSequence v_edges_new;\r\n                v_edges_new.insert(v_edges_new.end(), insert_pos, v_edges.end());\r\n                \r\n                // reverse the order if needed\r\n                if (v_edges.front() == v_edges_old.front())\r\n                    std::reverse(v_edges_new.begin(), v_edges_new.end());\r\n                \r\n                if (v_edges_new.empty())\r\n                    // v is on mesh boundary, cannot improve edge sequence here...\r\n                    result.insert(result.end(), v_edges_old.begin(), v_edges_old.end());\r\n                else\r\n                    result.insert(result.end(), v_edges_new.begin(), v_edges_new.end());\r\n            }\r\n            \r\n            // to comply with the semantics of closed sequence\r\n            result.push_back(result.front());\r\n            \r\n            return result;\r\n        };\r\n        // =====================================================================================================================================helper functions\r\n        \r\n        while (true) {\r\n            // clear side flag for all mesh vertices\r\n            for (auto v : mesh->vertices())\r\n                mesh->data(v).geodesicLoop.stripSide = GeodesicLoop_VertexTraits::StripSide::UNDEFINED;\r\n            \r\n            // set side flag for endpoints of the first edge in E\r\n            for (int i = 0; i < 2; ++i) {\r\n                auto h = mesh->halfedge_handle(E[0], i);\r\n                auto h_next  = mesh->next_halfedge_handle(h);\r\n                auto h_next2 = mesh->next_halfedge_handle(h_next);\r\n                \r\n                if (mesh->edge_handle(h_next) == E[1] || mesh->edge_handle(h_next2) == E[1]) {\r\n                    // this halfedge is on the side facing E[1] -> set its to/from vertex to left/right side\r\n                    mesh->data(mesh->to_vertex_handle  (h)).geodesicLoop.stripSide = GeodesicLoop_VertexTraits::StripSide::LEFT;\r\n                    mesh->data(mesh->from_vertex_handle(h)).geodesicLoop.stripSide = GeodesicLoop_VertexTraits::StripSide::RIGHT;\r\n                    break;\r\n                }\r\n            }\r\n            \r\n            // set side flag for other vertices in E\r\n            for (auto e = ++E.begin(); e != --E.end(); ++e) {\r\n                auto v0v1 = OpenMeshUtil::edge_to_vertex_pair(*mesh, *e);\r\n                auto& v0_side = mesh->data(v0v1.first ).geodesicLoop.stripSide;\r\n                auto& v1_side = mesh->data(v0v1.second).geodesicLoop.stripSide;\r\n                \r\n                // either v0 or v1 should be assigned side flag already\r\n                if (v0_side == GeodesicLoop_VertexTraits::StripSide::UNDEFINED)\r\n                    v0_side = static_cast<GeodesicLoop_VertexTraits::StripSide>((static_cast<int>(v1_side) + 1) % 2);\r\n                else\r\n                    v1_side = static_cast<GeodesicLoop_VertexTraits::StripSide>((static_cast<int>(v0_side) + 1) % 2);\r\n            }\r\n            \r\n            // initialize cutting edge in E as its shortest\r\n            typename MeshBase::EHandle e_cut;\r\n            {\r\n                double length_min = StdUtil::dbl_max();\r\n                for (auto e : E) {\r\n                    auto v0v1 = OpenMeshUtil::edge_to_point_pair(*mesh, e);\r\n                    double length_v0v1 = (v0v1.first - v0v1.second).length();\r\n                    if (length_v0v1 < length_min) {\r\n                        length_min = length_v0v1;\r\n                        e_cut = e;\r\n                    }\r\n                }\r\n            }\r\n            \r\n            // initialize v_relaxed as an endpoint of e_cut\r\n            typename MeshBase::VHandle v_relaxed = mesh->to_vertex_handle(mesh->halfedge_handle(e_cut, 0));\r\n            \r\n            // iterate until finding E-restricted geodesic loop\r\n            Path path;\r\n            while (true) {\r\n                // bring e_cut to front\r\n                E.pop_back();\r\n                StdUtil::bring_front(E, e_cut);\r\n                E.push_back(E.front());\r\n                \r\n                // compute 2D unfolding of E by cutting at front\r\n                unfold_edge_sequence(E);\r\n                \r\n                // compute v-relaxed geodesic loop by running funnel algorithm\r\n                path = compute_relaxed_geodesic(E, v_relaxed);\r\n                \r\n                // check if v_relaxed is inward convex (i.e. incident angle is greater than or equal to pi)\r\n                if (is_inward_convex(E, v_relaxed, path[path.size() - 2], path[1]))\r\n                    // algorithm will eventually reach here\r\n                    break;\r\n                \r\n                // update v_relaxed\r\n                auto side_v_relaxed = mesh->data(v_relaxed).geodesicLoop.stripSide;\r\n                typename MeshBase::VHandle v_touch_opposite_side;\r\n                typename MeshBase::VHandle v_touch_same_side;\r\n                for (auto point = ++path.begin(); point != --path.end(); ++point) {\r\n                    if (point->type() != PathPoint::Type::VERTEX)\r\n                        continue;\r\n                    \r\n                    auto side = mesh->data(point->vertex).geodesicLoop.stripSide;\r\n                    if (side != side_v_relaxed) {\r\n                        v_touch_opposite_side = point->vertex;\r\n                        break;\r\n                        \r\n                    } else {\r\n                        v_touch_same_side = point->vertex;\r\n                    }\r\n                }\r\n                \r\n                if (v_touch_opposite_side.is_valid() || v_touch_same_side.is_valid()) {\r\n                    // v-relaxed geodesic passed another vertex in E -> switch to it\r\n                    v_relaxed = v_touch_opposite_side.is_valid() ? v_touch_opposite_side : v_touch_same_side;\r\n                    \r\n                    // update e_cut\r\n                    for (auto e : E) {\r\n                        if (OpenMeshUtil::contains(*mesh, e, v_relaxed)) {\r\n                            e_cut = e;\r\n                            break;\r\n                        }\r\n                    }\r\n                    \r\n                } else {\r\n                    // otherwise, try the other endpoint of e_cut\r\n                    v_relaxed = OpenMeshUtil::opposite_vertex(*mesh, e_cut, v_relaxed);\r\n                }\r\n            }\r\n            \r\n            // check if every vertex the path passes through is fully convex (i.e. locally shortest)\r\n            bool is_path_fully_convex = true;\r\n            for (auto point = ++path.begin(); point != --path.end(); ++point) {\r\n                if (point->type() != PathPoint::Type::VERTEX)\r\n                    continue;\r\n                \r\n                auto point_prev = *(point - 1);\r\n                auto point_next = *(point + 1);\r\n                if (!is_fully_convex(point->vertex, point_prev, point_next)) {\r\n                    is_path_fully_convex = false;\r\n                    break;\r\n                }\r\n            }\r\n            if (is_path_fully_convex)\r\n                return path;\r\n\r\n            // update E\r\n            E = next_edge_seuqnece(E, path);\r\n            \r\n            if (E.empty())\r\n                // result in degenerate point\r\n                return Path();\r\n        }\r\n        \r\n        // should never reach here. algorithm is supposed to terminate within finite steps\r\n        return Path();\r\n    }\r\n};\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/base/Gradient.h",
    "content": "#pragma once\r\n#include <functional>\r\n#include <Eigen/Core>\r\n#include \"../vector_convert.h\"\r\n#include \"../../eigen_util.h\"\r\n#include \"../DerivedPtrHolder.h\"\r\n\r\nnamespace kt84 {\r\n\r\nstruct Gradient_VertexTraits {\r\n    double gradient_input;\r\n};\r\ntemplate <int Dim>\r\nstruct Gradient_FaceTraits {\r\n    Eigen::Matrix<double, Dim, 1> gradient_output;\r\n};\r\n\r\ntemplate <class TMeshBase, class TMesh>\r\nstruct Gradient : public DerivedPtrHolder<TMesh, Gradient<TMeshBase, TMesh>> {\r\n    void gradient_compute() {\r\n        TMesh* mesh = DerivedPtrHolder<TMesh, Gradient<TMeshBase, TMesh>>::derived_ptr;\r\n        \r\n        for (auto f : mesh->faces()) {\r\n            Eigen::Vector3d x[3];\r\n            double          y[3];\r\n            auto v = mesh->fv_iter(f);\r\n            for (int i = 0; i < 3; ++i, ++v) {\r\n                x[i] = o2e(mesh->point(*v));\r\n                y[i] = mesh->data(*v).gradient_input;\r\n            }\r\n            mesh->data(f).gradient_output = eigen_util::compute_gradient(x[0], x[1], x[2], y[0], y[1], y[2]);\r\n        }\r\n    }\r\n};\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/base/KdTree.h",
    "content": "#pragma once\r\n#include <memory>\r\n#include <vector>\r\n#include <flann/flann.hpp>\r\n#include <kt84/container_cast.h>\r\n\r\nnamespace kt84 {\r\n\r\n    template <class TMeshBase, class TMesh>\r\n    struct KdTree : public DerivedPtrHolder<TMesh, KdTree<TMeshBase, TMesh>> {\r\n        static const int N = TMeshBase::Point::size_;\r\n        \r\n        void kdtree_build() {\r\n            TMesh* mesh = DerivedPtrHolder<TMesh, KdTree<TMeshBase, TMesh>>::derived_ptr;\r\n            int n_vertices = mesh->n_vertices();\r\n            kdtree_points.resize(N * n_vertices);\r\n            for (int i = 0; i < n_vertices; ++i) {\r\n                auto& p = mesh->point(mesh->vertex_handle(i));\r\n                for (int j = 0; j < N; ++j)\r\n                    kdtree_points[N * i + j] = p[j];\r\n            }\r\n            kdtree = std::make_shared<flann::Index<flann::L2<double>>>(\r\n                flann::Matrix<double>(kdtree_points.data(), n_vertices, N),\r\n                flann::KDTreeIndexParams());\r\n            kdtree->buildIndex();\r\n        }\r\n        std::vector<typename TMeshBase::VHandle> kdtree_search(const typename TMeshBase::Point& point, int knn, std::vector<double>& knn_dist) const {\r\n            std::vector<int> knn_idx(knn);\r\n            knn_dist.resize(knn);\r\n            kdtree->knnSearch(\r\n                flann::Matrix<double>(const_cast<double*>(point.data()), 1, N),\r\n                flann::Matrix<int   >(                 knn_idx .data() , 1, knn),\r\n                flann::Matrix<double>(                 knn_dist.data() , 1, knn),\r\n                knn, flann::SearchParams());\r\n            return container_cast<typename TMeshBase::VHandle>(knn_idx);\r\n        }\r\n        typename TMeshBase::VHandle kdtree_search(const typename TMeshBase::Point& point, double& dist) const {\r\n            std::vector<double> knn_dist;\r\n            auto knn_idx = kdtree_search(point, 1, knn_dist);\r\n            dist = knn_dist.front();\r\n            return knn_idx .front();\r\n        }\r\n        std::vector<typename TMeshBase::VHandle> kdtree_search(const typename TMeshBase::Point& point, int knn) const {\r\n            std::vector<double> knn_dist;\r\n            return kdtree_search(point, knn, knn_dist);\r\n        }\r\n        typename TMeshBase::VHandle kdtree_search(const typename TMeshBase::Point& point) const {\r\n            double dist;\r\n            return kdtree_search(point, dist);\r\n        }\r\n        \r\n        std::shared_ptr<flann::Index<flann::L2<double>>> kdtree;\r\n        std::vector<double> kdtree_points;\r\n    };\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/base/LaplaceDirect.h",
    "content": "#pragma once\r\n#include <vector>\r\n#include <memory>\r\n#include <Eigen/Sparse>\r\n#include \"../DerivedPtrHolder.h\"\r\n\r\nnamespace kt84 {\r\n\r\ntemplate <int N>\r\nstruct LaplaceDirect_VertexTraits {\r\n    struct Data {\r\n        bool is_fixed;\r\n        Eigen::Matrix<double, N, 1> value;\r\n        Eigen::Matrix<double, N, 1> laplacian;\r\n        \r\n        Data()\r\n            : is_fixed()\r\n            , value    (Eigen::Matrix<double, N, 1>::Zero())\r\n            , laplacian(Eigen::Matrix<double, N, 1>::Zero())\r\n        {}\r\n    } laplaceDirect;\r\n};\r\n\r\nstruct LaplaceDirect_HalfedgeTraits {\r\n    double laplaceDirect_weight;\r\n    LaplaceDirect_HalfedgeTraits()\r\n        : laplaceDirect_weight(1)\r\n    {}\r\n};\r\n\r\ntemplate <class TMeshBase, class TMesh, int N>\r\nstruct LaplaceDirect : public DerivedPtrHolder<TMesh, LaplaceDirect<TMeshBase, TMesh, N>> {\r\n    typedef Eigen::Matrix<double,  N, 1> Value ;\r\n    typedef Eigen::Matrix<double, -1, N> Vector;\r\n    typedef Eigen::SparseMatrix <double> Matrix;\r\n    \r\n    double laplaceDirect_constraintWeight;\r\n    Matrix L;\r\n    std::shared_ptr<Eigen::SimplicialCholesky<Matrix>> solver;\r\n    \r\n    LaplaceDirect()\r\n        : laplaceDirect_constraintWeight(1000.0)            // better to set large value as default? not really sure...\r\n    {}\r\n    \r\n    void laplaceDirect_factorize() {\r\n        TMesh* mesh = get_mesh();\r\n        \r\n        int nv = mesh->n_vertices();\r\n        \r\n        typedef Eigen::Triplet<double> Triplet;\r\n        std::vector<Triplet> triplets;\r\n        for (int i = 0; i < nv; ++i) {\r\n            auto v = mesh->vertex_handle(i);\r\n            \r\n            triplets.push_back(Triplet(i, i, 1));\r\n            \r\n            double weight_sum = 0;\r\n            for (auto h = mesh->voh_iter(v); h.is_valid(); ++h)\r\n                weight_sum += mesh->data(*h).laplaceDirect_weight;\r\n            \r\n            for (auto h = mesh->voh_iter(v); h.is_valid(); ++h) {\r\n                auto w = mesh->to_vertex_handle(*h);\r\n                double weight = mesh->data(*h).laplaceDirect_weight / weight_sum;\r\n                \r\n                triplets.push_back(Triplet(i, w.idx(), -weight));\r\n            }\r\n            \r\n            if (mesh->data(v).laplaceDirect.is_fixed)\r\n                triplets.push_back(Triplet(i, i, laplaceDirect_constraintWeight));\r\n        }\r\n        \r\n        L.resize(nv, nv);\r\n        L.setFromTriplets(triplets.begin(), triplets.end());\r\n        \r\n        solver.reset(new Eigen::SimplicialCholesky<Matrix>(L.transpose() * L));\r\n    }\r\n    \r\n    void laplaceDirect_solve() {\r\n        TMesh* mesh = get_mesh();\r\n        \r\n        int nv = mesh->n_vertices();\r\n        \r\n        if (!solver || L.rows() != nv)\r\n            laplaceDirect_factorize();\r\n        \r\n        // set right hand side\r\n        Vector b(nv, N);\r\n        for (int i = 0; i < nv; ++i) {\r\n            auto& vdata = mesh->data(mesh->vertex_handle(i)).laplaceDirect;\r\n            \r\n            b.row(i) = vdata.laplacian.transpose();\r\n            \r\n            if (vdata.is_fixed)\r\n                b.row(i) += laplaceDirect_constraintWeight * vdata.value.transpose();\r\n        }\r\n        \r\n        // solve!\r\n        Vector x = solver->solve(L.transpose() * b);\r\n        \r\n        // copy result to Data::value\r\n        for (int i = 0; i < nv; ++i) {\r\n            auto& vdata = mesh->data(mesh->vertex_handle(i)).laplaceDirect;\r\n            \r\n            if (!vdata.is_fixed)\r\n                vdata.value = x.row(i).transpose();\r\n        }\r\n    }\r\n    \r\n    void laplaceDirect_set_laplacian_from_value() {\r\n        TMesh* mesh = get_mesh();\r\n        \r\n        for (auto v : mesh->vertices()) {\r\n            auto& vdata = mesh->data(v).laplaceDirect;\r\n            \r\n            vdata.laplacian = vdata.value;\r\n            \r\n            double weight_sum = 0;\r\n            for (auto h = mesh->voh_iter(v); h.is_valid(); ++h)\r\n                weight_sum += mesh->data(*h).laplaceDirect_weight;\r\n            \r\n            for (auto h = mesh->voh_iter(v); h.is_valid(); ++h) {\r\n                auto w = mesh->to_vertex_handle(*h);\r\n                auto& wdata = mesh->data(w).laplaceDirect;\r\n                double weight = mesh->data(*h).laplaceDirect_weight / weight_sum;\r\n                \r\n                vdata.laplacian -= weight * wdata.value;\r\n            }\r\n        }\r\n    }\r\nprivate:\r\n    TMesh* get_mesh() const { return DerivedPtrHolder<TMesh, LaplaceDirect<TMeshBase, TMesh, N>>::derived_ptr; }\r\n};\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/base/LaplaceIterative.h",
    "content": "#pragma once\r\n#include <vector>\r\n#include <Eigen/Core>\r\n#include \"../DerivedPtrHolder.h\"\r\n\r\nnamespace kt84 {\r\n\r\ntemplate <int N>\r\nstruct LaplaceIterative_VertexTraits {\r\n    struct Data {\r\n        bool is_fixed;\r\n        Eigen::Matrix<double, N, 1> value;\r\n        Eigen::Matrix<double, N, 1> laplacian;\r\n        \r\n        Data()\r\n            : is_fixed()\r\n            , value    (Eigen::Matrix<double, N, 1>::Zero())\r\n            , laplacian(Eigen::Matrix<double, N, 1>::Zero())\r\n        {}\r\n    } laplaceIterative;\r\n};\r\n\r\nstruct LaplaceIterative_HalfedgeTraits {\r\n    double laplaceIterative_weight;\r\n    LaplaceIterative_HalfedgeTraits()\r\n        : laplaceIterative_weight(1)\r\n    {}\r\n};\r\n\r\ntemplate <class TMeshBase, class TMesh, int N>\r\nstruct LaplaceIterative : public DerivedPtrHolder<TMesh, LaplaceIterative<TMeshBase, TMesh, N>> {\r\n    typedef Eigen::Matrix<double, N, 1> Value;\r\n    \r\n    void laplaceIterative_compute(int num_iter = 1, double damping  = 0.25) {          // 0: no damping, 1: no change\r\n        TMesh* mesh = get_mesh();\r\n        \r\n        int nv = mesh->n_vertices();\r\n        std::vector<Value> values_new(nv, Value::Zero());\r\n        \r\n        for (int iter = 0; iter < num_iter; ++iter) {\r\n            \r\n            for (int i = 0; i < nv; ++i) {\r\n                auto v = mesh->vertex_handle(i);\r\n                auto& vdata = mesh->data(v).laplaceIterative;\r\n                if (vdata.is_fixed) continue;\r\n                \r\n                // weighted sum among one-ring vertices\r\n                Value value_sum = Value::Zero();\r\n                double weight_sum = 0;\r\n                for (auto h = mesh->voh_iter(v); h.is_valid(); ++h) {\r\n                    double weight = mesh->data(*h).laplaceIterative_weight;\r\n                    value_sum  += weight * mesh->data(mesh->to_vertex_handle(*h)).laplaceIterative.value;\r\n                    weight_sum += weight;\r\n                }\r\n                \r\n                // store new value to a temporary array\r\n                value_sum /= weight_sum;\r\n                values_new[i] = vdata.laplacian + value_sum;\r\n            }\r\n            \r\n            // copy new value to the mesh\r\n            for (int i = 0; i < nv; ++i) {\r\n                auto v = mesh->vertex_handle(i);\r\n                auto& vdata = mesh->data(v).laplaceIterative;\r\n                if (vdata.is_fixed) continue;\r\n                \r\n                vdata.value = (1 - damping) * values_new[i] + damping * vdata.value;\r\n            }\r\n        }\r\n    }\r\n    void laplceIterative_set_laplacian_from_value() {\r\n        TMesh* mesh = get_mesh();\r\n        \r\n        for (auto v : mesh->vertices()) {\r\n            auto& vdata = mesh->data(v).laplaceIterative;\r\n            \r\n            vdata.laplacian = vdata.value;\r\n            \r\n            double weight_sum = 0;\r\n            for (auto h = mesh->voh_iter(v); h; ++h)\r\n                weight_sum += mesh->data(h).laplaceIterative_weight;\r\n            \r\n            for (auto h = mesh->voh_iter(v); h; ++h) {\r\n                auto w = mesh->to_vertex_handle(h);\r\n                auto& wdata = mesh->data(w).laplaceIterative;\r\n                double weight = mesh->data(h).laplaceIterative_weight / weight_sum;\r\n                \r\n                vdata.laplacian -= weight * wdata.value;\r\n            }\r\n        }\r\n    }\r\nprivate:\r\n    TMesh* get_mesh() const { return DerivedPtrHolder<TMesh, LaplaceIterative<TMeshBase, TMesh, N>>::derived_ptr; }\r\n};\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/base/NormalCurvature.h",
    "content": "#pragma once\r\n\r\n/*\r\n    Implementation of the following paper:\r\n        Chen-shi Dong, Guo-zhao Wang\r\n        Curvatures estimation on triangular mesh\r\n        Journal of Zhejiang University Science\r\n        August 2005, Volume 6, Issue 1 Supplement, pp 128-136\r\n        DOI: 10.1007/BF02887228\r\n        http://www.zju.edu.cn/jzus/2005/A05S1/A05S121.pdf\r\n    \r\n    which I found at the following forum posting:\r\n        http://www.sidefx.com/index.php?option=com_forum&Itemid=172&page=viewtopic&t=13855&highlight=&sid=2c56b6ede4383079db2ce0b1d9f97be5\r\n*/\r\n#include \"../DerivedPtrHolder.h\"\r\n\r\nnamespace kt84 {\r\n\r\nstruct NormalCurvature_VertexTraits {\r\n    double normalCurvature;\r\n    NormalCurvature_VertexTraits()\r\n        : normalCurvature()\r\n    {}\r\n};\r\n\r\ntemplate <class TMeshBase, class TMesh>\r\nstruct NormalCurvature : public DerivedPtrHolder<TMesh, NormalCurvature<TMeshBase, TMesh>> {\r\n    void normalCurvature_compute() {\r\n        TMesh* mesh = DerivedPtrHolder<TMesh, NormalCurvature<TMeshBase, TMesh>>::derived_ptr;\r\n        \r\n        for (auto v0 : mesh->vertices()) {\r\n            double& k0 = mesh->data(v0).normalCurvature;\r\n            k0 = 0;\r\n            auto n0 = mesh->normal(v0);\r\n            \r\n            for (auto v1 = mesh->vv_iter(v0); v1.is_valid(); ++v1) {\r\n                auto n1 = mesh->normal(*v1);\r\n                auto dp = mesh->point(*v1) - mesh->point(v0);\r\n                auto dn = n1 - n0;\r\n                double k1 = (dp | dn) / (dp | dp);\r\n                if (std::abs(k0) < std::abs(k1))\r\n                    k0 = k1;\r\n            }\r\n        }\r\n    }\r\n};\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/base/NormalVariation.h",
    "content": "#pragma once\r\n#include <limits>\r\n#include <algorithm>\r\n#include \"../DerivedPtrHolder.h\"\r\n\r\nnamespace kt84 {\r\n\r\nstruct NormalVariation_VertexTraits {\r\n    double normalVariation;\r\n    NormalVariation_VertexTraits()\r\n        : normalVariation()\r\n    {}\r\n};\r\n\r\ntemplate <class TMeshBase, class TMesh>\r\nstruct NormalVariation : public DerivedPtrHolder<TMesh, NormalVariation<TMeshBase, TMesh>> {\r\n    void normalVariation_compute() {\r\n        TMesh* mesh = DerivedPtrHolder<TMesh, NormalVariation<TMeshBase, TMesh>>::derived_ptr;\r\n        \r\n        for (auto v : mesh->vertices()) {\r\n            double& normalVariation = mesh->data(v).normalVariation;\r\n            auto nv = mesh->normal(v);\r\n\r\n            normalVariation = std::numeric_limits<double>::max();\r\n            \r\n            for (auto f = mesh->vf_iter(v); f.is_valid(); ++f) {\r\n                auto nf = mesh->normal(*f);\r\n                double d = nv | nf;\r\n                normalVariation = std::min<double>(normalVariation, d);\r\n            }\r\n        }\r\n    }\r\n};\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/base/SurfaceTopology.h",
    "content": "#pragma once\r\n#include <vector>\r\n#include <boost/graph/adjacency_list.hpp>\r\n#include <boost/graph/connected_components.hpp>\r\n#include \"../DerivedPtrHolder.h\"\r\n#include \"Utility.h\"        // assumption: TMesh is derived from TMeshBase and Utility<TMeshBase, TMesh>\r\n\r\nnamespace kt84 {\r\n\r\ntemplate <class TMeshBase, class TMesh>\r\nstruct SurfaceTopology : public DerivedPtrHolder<TMesh, SurfaceTopology<TMeshBase, TMesh>> {\r\n    struct Data {\r\n        int num_connected_components;\r\n        int num_boundary_loops;\r\n        Data()\r\n            : num_connected_components()\r\n            , num_boundary_loops()\r\n        {}\r\n        bool is_closed() const { return num_boundary_loops == 0; }\r\n    } surfaceTopology;\r\n    \r\n    void surfaceTopology_compute() {\r\n        TMesh* mesh = DerivedPtrHolder<TMesh, SurfaceTopology<TMeshBase, TMesh>>::derived_ptr;\r\n        \r\n        // count connected components\r\n        {\r\n            boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS> graph;\r\n            for (auto f : mesh->faces())\r\n                boost::add_vertex(graph);\r\n            for (auto e : mesh->edges()) {\r\n                if (mesh->is_boundary(e)) continue;\r\n                auto h0h1 = mesh->util_edge_to_halfedge_pair(e);\r\n                auto f0 = mesh->face_handle(h0h1.first );\r\n                auto f1 = mesh->face_handle(h0h1.second);\r\n                boost::add_edge(f0.idx(), f1.idx(), graph);\r\n            }\r\n            std::vector<int> f_component_id(mesh->n_faces());\r\n            surfaceTopology.num_connected_components = boost::connected_components(graph, &f_component_id[0]);\r\n        }\r\n        \r\n        // count boundary loops\r\n        {\r\n            boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS> graph;\r\n            for (auto v : mesh->vertices()) {\r\n                if (!mesh->is_boundary(v)) continue;\r\n                auto h0 = mesh->halfedge_handle(v);\r\n                auto h1 = mesh->prev_halfedge_handle(h0);\r\n                auto e0 = mesh->edge_handle(h0);\r\n                auto e1 = mesh->edge_handle(h1);\r\n                boost::add_edge(e0.idx(), e1.idx(), graph);\r\n            }\r\n            std::vector<int> e_component_id(mesh->n_edges());\r\n            surfaceTopology.num_boundary_loops = boost::connected_components(graph, &e_component_id[0]);\r\n        }\r\n    }\r\n};\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/base/Utility.h",
    "content": "#pragma once\r\n#include <utility>\r\n#include <vector>\r\n#include <OpenMesh/Core/Mesh/PolyConnectivity.hh>\r\n#include <OpenMesh/Core/Geometry/VectorT.hh>\r\n#include \"../../RangeAdaptor.h\"\r\n#include \"../DerivedPtrHolder.h\"\r\n\r\nnamespace kt84 {\r\n\r\ntemplate <typename TMeshBase, typename TMesh>\r\nstruct Utility : public DerivedPtrHolder<TMesh, Utility<TMeshBase, TMesh>> {\r\n    typedef std::pair<typename TMeshBase::VHandle, typename TMeshBase::VHandle> VertexPair;\r\n    typedef std::pair<typename TMeshBase::Point  , typename TMeshBase::Point  > PointPair;\r\n    typedef std::pair<typename TMeshBase::HHandle, typename TMeshBase::HHandle> HalfedgePair;\r\n    \r\n    // NOTE: every public function is prefixed by \"util_\" to avoid ambiguity\r\n    \r\n    // circulation around vertex/face stored in std::vector\r\n    std::vector<typename TMeshBase::VHandle> util_vv_vec (typename TMeshBase::VHandle handle) const { std::vector<typename TMeshBase::VHandle> result; result.reserve(get_mesh()->valence(handle)); for (auto x : get_mesh()->vv_range (handle)) result.push_back(x); return result; }\r\n    std::vector<typename TMeshBase::HHandle> util_voh_vec(typename TMeshBase::VHandle handle) const { std::vector<typename TMeshBase::HHandle> result; result.reserve(get_mesh()->valence(handle)); for (auto x : get_mesh()->voh_range(handle)) result.push_back(x); return result; }\r\n    std::vector<typename TMeshBase::HHandle> util_vih_vec(typename TMeshBase::VHandle handle) const { std::vector<typename TMeshBase::HHandle> result; result.reserve(get_mesh()->valence(handle)); for (auto x : get_mesh()->vih_range(handle)) result.push_back(x); return result; }\r\n    std::vector<typename TMeshBase::EHandle> util_ve_vec (typename TMeshBase::VHandle handle) const { std::vector<typename TMeshBase::EHandle> result; result.reserve(get_mesh()->valence(handle)); for (auto x : get_mesh()->ve_range (handle)) result.push_back(x); return result; }\r\n    std::vector<typename TMeshBase::FHandle> util_vf_vec (typename TMeshBase::VHandle handle) const { std::vector<typename TMeshBase::FHandle> result; result.reserve(get_mesh()->valence(handle)); for (auto x : get_mesh()->vf_range (handle)) result.push_back(x); return result; }\r\n    std::vector<typename TMeshBase::VHandle> util_fv_vec (typename TMeshBase::FHandle handle) const { std::vector<typename TMeshBase::VHandle> result; result.reserve(get_mesh()->valence(handle)); for (auto x : get_mesh()->fv_range (handle)) result.push_back(x); return result; }\r\n    std::vector<typename TMeshBase::HHandle> util_fh_vec (typename TMeshBase::FHandle handle) const { std::vector<typename TMeshBase::HHandle> result; result.reserve(get_mesh()->valence(handle)); for (auto x : get_mesh()->fh_range (handle)) result.push_back(x); return result; }\r\n    std::vector<typename TMeshBase::EHandle> util_fe_vec (typename TMeshBase::FHandle handle) const { std::vector<typename TMeshBase::EHandle> result; result.reserve(get_mesh()->valence(handle)); for (auto x : get_mesh()->fe_range (handle)) result.push_back(x); return result; }\r\n    std::vector<typename TMeshBase::FHandle> util_ff_vec (typename TMeshBase::FHandle handle) const { std::vector<typename TMeshBase::FHandle> result; result.reserve(get_mesh()->valence(handle)); for (auto x : get_mesh()->ff_range (handle)) result.push_back(x); return result; }\r\n    \r\n    // additional connectivity info\r\n    typename TMeshBase::HHandle util_next_halfedge_n(typename TMeshBase::HHandle h, int n) const {\r\n        auto mesh = get_mesh();\r\n        for (int i = 0; i < n; ++i)\r\n            h = mesh->next_halfedge_handle(h);\r\n        return h;\r\n    }\r\n    typename TMeshBase::VHandle util_opposite_vertex(typename TMeshBase::EHandle e, typename TMeshBase::VHandle v) const {\r\n        auto mesh = get_mesh();\r\n        auto v0 = mesh->to_vertex_handle(mesh->halfedge_handle(e, 0));\r\n        auto v1 = mesh->to_vertex_handle(mesh->halfedge_handle(e, 1));\r\n        return\r\n            v0 == v ? v1 :\r\n            v1 == v ? v0 :\r\n            typename TMeshBase::VHandle();\r\n    }\r\n    typename TMeshBase::VHandle util_opposite_vertex(typename TMeshBase::HHandle h, typename TMeshBase::VHandle v) const {\r\n        auto mesh = get_mesh();\r\n        return opposite_vertex(mesh, mesh->edge_handle(h), v);\r\n    }\r\n    typename TMeshBase::FHandle util_opposite_face(typename TMeshBase::EHandle e, typename TMeshBase::FHandle f) const {\r\n        auto mesh = get_mesh();\r\n        auto f0 = mesh->face_handle(mesh->halfedge_handle(e, 0));\r\n        auto f1 = mesh->face_handle(mesh->halfedge_handle(e, 1));\r\n        return\r\n            f0 == f ? f1 :\r\n            f1 == f ? f0 :\r\n            typename TMeshBase::FHandle();\r\n    }\r\n    typename TMeshBase::HHandle util_halfedge_handle(typename TMeshBase::VHandle v_from, typename TMeshBase::VHandle v_to) const {\r\n        auto mesh = get_mesh();\r\n        for (auto voh : mesh->voh_range(v_from)) {\r\n            if (mesh->to_vertex_handle(voh) == v_to)\r\n                return voh;\r\n        }\r\n        return typename TMeshBase::HHandle();\r\n    }\r\n    typename TMeshBase::EHandle util_edge_handle(typename TMeshBase::VHandle v0, typename TMeshBase::VHandle v1) const {\r\n        return get_mesh()->edge_handle(util_halfedge_handle(v0, v1));\r\n    }\r\n    typename TMeshBase::FHandle util_face_handle(typename TMeshBase::VHandle v0, typename TMeshBase::VHandle v1, typename TMeshBase::VHandle v2) const {\r\n        auto mesh = get_mesh();\r\n        for (auto voh : mesh->voh_range(v0)) {\r\n            if (mesh->to_vertex_handle(voh) != v1)\r\n                continue;\r\n            auto h1 = mesh->next_halfedge_handle(voh);\r\n            auto h2 = mesh->next_halfedge_handle(h1);\r\n            if (mesh->to_vertex_handle(h1) != v2 || mesh->to_vertex_handle(h2) != v0)\r\n                continue;\r\n            return mesh->face_handle(voh);\r\n        }\r\n        \r\n        return typename TMeshBase::FHandle();\r\n    }\r\n    \r\n    // halfedge-related functions\r\n    VertexPair util_halfedge_to_vertex_pair(typename TMeshBase::HHandle h) const { auto mesh = get_mesh(); return std::make_pair(mesh->from_vertex_handle(h), mesh->to_vertex_handle(h)); }\r\n    PointPair  util_halfedge_to_point_pair (typename TMeshBase::HHandle h) const { auto mesh = get_mesh(); auto p = util_halfedge_to_vertex_pair(h); return std::make_pair(mesh->point(p.first), mesh->point(p.second)); }\r\n    typename TMeshBase::Point util_halfedge_to_vector(typename TMeshBase::HHandle h) const {\r\n        auto mesh = get_mesh();\r\n        return mesh->point(mesh->  to_vertex_handle(h)) -\r\n               mesh->point(mesh->from_vertex_handle(h));\r\n    }\r\n    \r\n    // edge-related functions\r\n    typename TMeshBase::Point::value_type util_edge_length(typename TMeshBase::EHandle e) const {\r\n        return util_halfedge_to_vector(get_mesh()->halfedge_handle(e, 0)).length();\r\n    }\r\n    VertexPair   util_edge_to_vertex_pair    (typename TMeshBase::EHandle e) const { return util_halfedge_to_vertex_pair(get_mesh()->halfedge_handle(e, 0)); }\r\n    PointPair    util_edge_to_point_pair     (typename TMeshBase::EHandle e) const { return util_halfedge_to_point_pair (get_mesh()->halfedge_handle(e, 0)); }\r\n    HalfedgePair util_edge_to_halfedge_pair  (typename TMeshBase::EHandle e) const { auto mesh = get_mesh(); return std::make_pair(mesh->halfedge_handle(e, 0), mesh->halfedge_handle(e, 1)); }\r\n    \r\n    // face-related functions\r\n    std::vector<typename TMeshBase::Point> util_face_to_points(typename TMeshBase::FHandle f) const {\r\n        auto mesh = get_mesh();\r\n        std::vector<typename TMeshBase::Point> result;\r\n        result.reserve(mesh->valence(f));\r\n        for (auto v : mesh->fv_range(f))\r\n            result.push_back(mesh->point(v));\r\n        return result;\r\n    }\r\n    typename TMeshBase::Point util_face_center(typename TMeshBase::FHandle f) const {\r\n        auto mesh = get_mesh();\r\n        typedef typename TMeshBase::Point Point;\r\n        Point result =  Point::vectorized(0);\r\n        for (auto v : mesh->fv_range(f))\r\n            result += mesh->point(v);\r\n        result /= mesh->valence(f);\r\n        return result;\r\n    }\r\n    \r\n    // containment query\r\n    bool util_contains(typename TMeshBase::EHandle e, typename TMeshBase::VHandle v) const {\r\n        auto mesh = get_mesh();\r\n        return\r\n            mesh->to_vertex_handle(mesh->halfedge_handle(e, 0)) == v ||\r\n            mesh->to_vertex_handle(mesh->halfedge_handle(e, 1)) == v;\r\n    }\r\n    bool util_contains(typename TMeshBase::EHandle e, typename TMeshBase::HHandle h) const {\r\n        auto mesh = get_mesh();\r\n        return\r\n            mesh->halfedge_handle(e, 0) == h ||\r\n            mesh->halfedge_handle(e, 1) == h;\r\n    }\r\n    bool util_contains(typename TMeshBase::FHandle f, typename TMeshBase::VHandle v) const { for (auto fv : get_mesh()->fv_range(f)) if (fv == v) return true; return false; }\r\n    bool util_contains(typename TMeshBase::FHandle f, typename TMeshBase::HHandle h) const { for (auto fh : get_mesh()->fh_range(f)) if (fh == h) return true; return false; }\r\n    bool util_contains(typename TMeshBase::FHandle f, typename TMeshBase::EHandle e) const { for (auto fe : get_mesh()->fe_range(f)) if (fe == e) return true; return false; }\r\n\r\n    bool util_is_triangle_mesh() const {\r\n        auto mesh = get_mesh();\r\n        for (auto f : mesh->faces())\r\n            if (mesh->valence(f) != 3) return false;\r\n        return true;\r\n    }\r\n    \r\n    typename TMeshBase::VHandle util_add_vertex(const typename TMeshBase::Point& point, const typename TMeshBase::Normal& normal) {\r\n        auto mesh = get_mesh();\r\n        auto v = mesh->add_vertex(point);\r\n        mesh->set_normal(v, normal);\r\n        return v;\r\n    }\r\nprivate:\r\n    const TMesh* get_mesh() const { return DerivedPtrHolder<TMesh, Utility<TMeshBase, TMesh>>::derived_ptr; }\r\n          TMesh* get_mesh()       { return DerivedPtrHolder<TMesh, Utility<TMeshBase, TMesh>>::derived_ptr; }\r\n};\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/base/geodesic/geodesic_algorithm_base.h",
    "content": "//Copyright (C) 2008 Danil Kirsanov, MIT License\r\n\r\n#ifndef GEODESIC_ALGORITHM_BASE_122806\r\n#define GEODESIC_ALGORITHM_BASE_122806\r\n\r\n#include \"geodesic_mesh.h\"\r\n#include \"geodesic_constants_and_simple_functions.h\"\r\n#include <iostream>\r\n#include <ctime>\r\n\r\nnamespace geodesic{\r\n\r\nclass GeodesicAlgorithmBase\r\n{\r\npublic:\r\n    enum AlgorithmType\r\n    {\r\n        EXACT,\r\n\t\tDIJKSTRA,\r\n        SUBDIVISION,\r\n\t\tUNDEFINED_ALGORITHM\r\n    };\r\n\r\n\tGeodesicAlgorithmBase(geodesic::Mesh* mesh = 0):\r\n\t\tm_type(UNDEFINED_ALGORITHM),\r\n\t\tm_max_propagation_distance(1e100),\r\n\t\tm_mesh(mesh)\r\n\t{};\t\r\n\r\n\tvirtual ~GeodesicAlgorithmBase(){};\r\n\r\n\tvirtual void propagate(std::vector<SurfacePoint>& sources,\r\n   \t\t\t\t\t\t   double max_propagation_distance = GEODESIC_INF,\t\t\t//propagation algorithm stops after reaching the certain distance from the source\r\n\t\t\t\t\t\t   std::vector<SurfacePoint>* stop_points = NULL) = 0; //or after ensuring that all the stop_points are covered\r\n\r\n\tvirtual void trace_back(SurfacePoint& destination,\t\t//trace back piecewise-linear path\r\n\t\t\t\t\t\t\tstd::vector<SurfacePoint>& path) = 0;\r\n\r\n\tvoid geodesic(SurfacePoint& source,\r\n\t\t\t\t\t\t  SurfacePoint& destination,\r\n\t\t\t\t\t\t  std::vector<SurfacePoint>& path); //lazy people can find geodesic path with one function call\r\n\r\n\tvoid geodesic(std::vector<SurfacePoint>& sources,\r\n\t\t\t\t\t\t  std::vector<SurfacePoint>& destinations,\r\n\t\t\t\t\t\t  std::vector<std::vector<SurfacePoint> >& paths); //lazy people can find geodesic paths with one function call\r\n\r\n\tvirtual unsigned best_source(SurfacePoint& point,\t\t\t//after propagation step is done, quickly find what source this point belongs to and what is the distance to this source\r\n\t\t\t\t\t\t\t\t double& best_source_distance) = 0; \r\n\r\n\tvirtual void print_statistics()\t\t//print info about timing and memory usage in the propagation step of the algorithm\r\n\t{\r\n\t\tstd::cout << \"propagation step took \" << m_time_consumed << \" seconds \" << std::endl;\r\n\t};\t\r\n\r\n\tAlgorithmType type(){return m_type;};\r\n\r\n\tvirtual std::string name();\r\n\r\n\tgeodesic::Mesh* mesh(){return m_mesh;};\r\nprotected:\r\n\r\n\tvoid set_stop_conditions(std::vector<SurfacePoint>* stop_points, \r\n\t\t\t\t\t\t     double stop_distance);\r\n\tdouble stop_distance()\r\n\t{\r\n\t\treturn m_max_propagation_distance;\r\n\t}\r\n\r\n\tAlgorithmType m_type;\t\t\t\t\t   // type of the algorithm\r\n\r\n\ttypedef std::pair<vertex_pointer, double> stop_vertex_with_distace_type;\r\n\tstd::vector<stop_vertex_with_distace_type> m_stop_vertices; // algorithm stops propagation after covering certain vertices\r\n\tdouble m_max_propagation_distance;\t\t\t // or reaching the certain distance\r\n\r\n\tgeodesic::Mesh* m_mesh;\r\n\r\n\tdouble m_time_consumed;\t\t//how much time does the propagation step takes\r\n\tdouble m_propagation_distance_stopped;\t\t//at what distance (if any) the propagation algorithm stopped \r\n};\r\n\r\ninline double length(std::vector<SurfacePoint>& path)\r\n{\r\n\tdouble length = 0;\r\n\tif(!path.empty())\r\n\t{\r\n\t\tfor(unsigned i=0; i<path.size()-1; ++i)\r\n\t\t{\r\n\t\t\tlength += path[i].distance(&path[i+1]);\r\n\t\t}\r\n\t}\r\n\treturn length;\r\n}\r\n\r\ninline void print_info_about_path(std::vector<SurfacePoint>& path)\r\n{\r\n\tstd::cout << \"number of the points in the path = \" << path.size()\r\n\t\t\t  << \", length of the path = \" << length(path) \r\n\t\t\t  << std::endl;\r\n}\r\n\r\ninline std::string GeodesicAlgorithmBase::name()\r\n{\r\n\tswitch(m_type)\r\n\t{\r\n\tcase EXACT:\r\n\t\treturn \"exact\";\r\n\tcase DIJKSTRA:\r\n\t\treturn \"dijkstra\";\r\n\tcase SUBDIVISION:\r\n\t\treturn \"subdivision\";\r\n\tdefault:\r\n\tcase UNDEFINED_ALGORITHM:\r\n\t\treturn \"undefined\";\r\n\t}\r\n}\r\n\r\ninline void GeodesicAlgorithmBase::geodesic(SurfacePoint& source,\r\n\t\t\t\t\t\t\t\t\t\t\tSurfacePoint& destination,\r\n\t\t\t\t\t\t\t\t\t\t\tstd::vector<SurfacePoint>& path) //lazy people can find geodesic path with one function call\r\n{\r\n\tstd::vector<SurfacePoint> sources(1, source);\r\n\tstd::vector<SurfacePoint> stop_points(1, destination);\r\n\tdouble const max_propagation_distance = GEODESIC_INF;\r\n\r\n\tpropagate(sources, \r\n\t\t\t  max_propagation_distance,\r\n\t\t\t  &stop_points);\r\n\r\n\ttrace_back(destination, path);\r\n}\r\n\r\ninline void GeodesicAlgorithmBase::geodesic(std::vector<SurfacePoint>& sources,\r\n\t\t\t\t\t\t\t\t\t\t\tstd::vector<SurfacePoint>& destinations,\r\n\t\t\t\t\t\t\t\t\t\t\tstd::vector<std::vector<SurfacePoint> >& paths) //lazy people can find geodesic paths with one function call\r\n{\r\n\tdouble const max_propagation_distance = GEODESIC_INF;\r\n\r\n\tpropagate(sources, \r\n\t\t\t  max_propagation_distance,\r\n\t\t\t  &destinations);\t\t//we use desinations as stop points\r\n\r\n\tpaths.resize(destinations.size());\r\n\r\n\tfor(unsigned i=0; i<paths.size(); ++i)\r\n\t{\r\n\t\ttrace_back(destinations[i], paths[i]);\r\n\t}\r\n}\r\n\r\ninline void GeodesicAlgorithmBase::set_stop_conditions(std::vector<SurfacePoint>* stop_points, \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdouble stop_distance)\r\n{\r\n\tm_max_propagation_distance = stop_distance;\r\n\r\n\tif(!stop_points)\r\n\t{\r\n\t\tm_stop_vertices.clear();\r\n\t\treturn;\r\n\t}\r\n\r\n\tm_stop_vertices.resize(stop_points->size());\r\n\r\n\tstd::vector<vertex_pointer> possible_vertices;\r\n\tfor(unsigned i = 0; i < stop_points->size(); ++i)\r\n\t{\r\n\t\tSurfacePoint* point = &(*stop_points)[i];\r\n\r\n\t\tpossible_vertices.clear();\r\n\t\tm_mesh->closest_vertices(point, &possible_vertices);\r\n\t\t\r\n\t\tvertex_pointer closest_vertex = NULL;\r\n\t\tdouble min_distance = 1e100;\r\n\t\tfor(unsigned j = 0; j < possible_vertices.size(); ++j)\r\n\t\t{\r\n\t\t\tdouble distance = point->distance(possible_vertices[j]);\r\n\t\t\tif(distance < min_distance)\r\n\t\t\t{\r\n\t\t\t\tmin_distance = distance;\r\n\t\t\t\tclosest_vertex = possible_vertices[j];\r\n\t\t\t}\r\n\t\t}\r\n\t\tassert(closest_vertex);\r\n\r\n\t\tm_stop_vertices[i].first = closest_vertex;\r\n\t\tm_stop_vertices[i].second = min_distance;\r\n\t}\r\n}\r\n\r\n}//geodesic\r\n\r\n#endif //GEODESIC_ALGORITHM_BASE_122806\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/base/geodesic/geodesic_algorithm_dijkstra.h",
    "content": "//Copyright (C) 2008 Danil Kirsanov, MIT License\r\n#ifndef GEODESIC_ALGORITHM_DIJKSTRA_010506\r\n#define GEODESIC_ALGORITHM_DIJKSTRA_010506\r\n\r\n#include \"geodesic_algorithm_graph_base.h\"\r\n#include \"geodesic_mesh_elements.h\"\r\n#include <vector>\r\n#include <set>\r\n#include <assert.h>\r\n\r\nnamespace geodesic{\r\n\r\nclass DijkstraNode\r\n{\r\n\ttypedef DijkstraNode* node_pointer;\r\npublic: \r\n\tDijkstraNode(){};\r\n\t~DijkstraNode(){};\r\n\r\n\tdouble& distance_from_source(){return m_distance;};\r\n\tnode_pointer& previous(){return m_previous;};\r\n\tunsigned& source_index(){return m_source_index;};\r\n\tvertex_pointer& vertex(){return m_vertex;};\r\n\r\n\tvoid clear()\r\n\t{\r\n\t\tm_distance = GEODESIC_INF;\r\n\t\tm_previous = NULL;\r\n\t}\r\n\r\n\tbool operator()(node_pointer const s1, node_pointer const s2) const\r\n\t{\r\n\t\treturn s1->distance_from_source() != s2->distance_from_source() ?\r\n\t\t\t   s1->distance_from_source() < s2->distance_from_source() :\r\n\t\t\t   s1->vertex()->id() < s2->vertex()->id();\r\n\t};\r\n\r\n\tdouble distance(SurfacePoint* p)\r\n\t{\r\n\t\treturn m_vertex->distance(p);\r\n\t}\r\n\r\n\tSurfacePoint surface_point()\r\n\t{\r\n\t\treturn SurfacePoint(m_vertex);\r\n\t}\r\n\r\nprivate: \r\n\tdouble m_distance;\t\t\t\t\t//distance to the closest source\r\n\tunsigned m_source_index;\t\t\t//closest source index\r\n\tnode_pointer m_previous;\t\t\t//previous node in the geodesic path\r\n\tvertex_pointer m_vertex;\t\t\t//correspoding vertex\r\n};\r\n\r\nclass GeodesicAlgorithmDijkstra: public GeodesicAlgorithmGraphBase<DijkstraNode>\r\n{\r\npublic:\r\n\ttypedef DijkstraNode Node;\r\n\ttypedef Node* node_pointer;\r\n\r\n\tGeodesicAlgorithmDijkstra(geodesic::Mesh* mesh):\r\n\t\tGeodesicAlgorithmGraphBase<Node>(mesh)\r\n\t{\r\n\t\tm_type = DIJKSTRA;\r\n\r\n\t\tm_nodes.resize(mesh->vertices().size());\r\n\t\tfor(unsigned i=0; i<m_nodes.size(); ++i)\r\n\t\t{\r\n\t\t\tm_nodes[i].vertex() = &m_mesh->vertices()[i];\r\n\t\t}\r\n\t};\r\n\r\n\t~GeodesicAlgorithmDijkstra(){};\r\n\r\nprotected:\r\n\r\n\tvoid list_nodes_visible_from_source(MeshElementBase* p, \r\n\t\t\t\t\t\t\t\t\t\tstd::vector<node_pointer>& storage);\t\t//list all nodes that belong to this mesh element\r\n\r\n\tvoid list_nodes_visible_from_node(node_pointer node,\t\t\t//list all nodes that belong to this mesh element\r\n\t\t\t\t\t\t\t\t\t  std::vector<node_pointer>& storage,\r\n\t\t\t\t\t\t\t\t\t  std::vector<double>& distances, \r\n\t\t\t\t\t\t\t\t\t  double threshold_distance);\t//list only the nodes whose current distance is larger than the threshold\r\n};\r\n\r\nvoid GeodesicAlgorithmDijkstra::list_nodes_visible_from_source(MeshElementBase* p,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   std::vector<node_pointer>& storage)\r\n{\r\n\tassert(p->type() != UNDEFINED_POINT);\r\n\r\n\tif(p->type() == FACE)\r\n\t{\r\n\t\tface_pointer f = static_cast<face_pointer>(p);\r\n\t\tfor(unsigned i=0; i<3; ++i)\r\n\t\t{\r\n\t\t\tvertex_pointer v = f->adjacent_vertices()[i];\r\n\t\t\tstorage.push_back(&m_nodes[node_index(v)]);\r\n\t\t}\r\n\t}\r\n\telse if(p->type() == EDGE)\r\n\t{\r\n\t\tedge_pointer e = static_cast<edge_pointer>(p);\r\n\t\tfor(unsigned i=0; i<2; ++i)\r\n\t\t{\r\n\t\t\tvertex_pointer v = e->adjacent_vertices()[i];\r\n\t\t\tstorage.push_back(&m_nodes[node_index(v)]);\r\n\t\t}\r\n\t}\r\n\telse\t\t\t//VERTEX\r\n\t{\r\n\t\tvertex_pointer v = static_cast<vertex_pointer>(p);\r\n\t\tstorage.push_back(&m_nodes[node_index(v)]);\r\n\t}\r\n}\r\n\r\ninline void GeodesicAlgorithmDijkstra::list_nodes_visible_from_node(node_pointer node, //list all nodes that belong to this mesh element\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t std::vector<node_pointer>& storage,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t std::vector<double>& distances,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t double threshold_distance)\r\n{\r\n\tvertex_pointer v = node->vertex();\r\n\tassert(storage.size() == distances.size());\r\n\r\n\tfor(unsigned i=0; i<v->adjacent_edges().size(); ++i)\r\n\t{\r\n\t\tedge_pointer e = v->adjacent_edges()[i];\r\n\t\tvertex_pointer new_v = e->opposite_vertex(v);\r\n\t\tnode_pointer new_node = &m_nodes[node_index(new_v)];\r\n\r\n\t\tif(new_node->distance_from_source() > threshold_distance + e->length())\r\n\t\t{\r\n\t\t\tstorage.push_back(new_node);\r\n\t\t\tdistances.push_back(e->length());\r\n\t\t}\r\n\t}\r\n}\r\n\r\n}\t\t//geodesic\r\n\r\n#endif //GEODESIC_ALGORITHM_DIJKSTRA_010506\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/base/geodesic/geodesic_algorithm_dijkstra_alternative.h",
    "content": "//Copyright (C) 2008 Danil Kirsanov, MIT License\r\n#ifndef GEODESIC_ALGORITHM_DIJKSTRA_ALTERNATIVE_010506\r\n#define GEODESIC_ALGORITHM_DIJKSTRA_ALTERNATIVE_010506\r\n\r\n#include \"geodesic_algorithm_base.h\"\r\n#include \"geodesic_mesh_elements.h\"\r\n#include <vector>\r\n#include <set>\r\n#include <assert.h>\r\n\r\nnamespace geodesic{\r\n\r\nclass DijkstraNode1\r\n{\r\n\ttypedef DijkstraNode1* node_pointer;\r\npublic: \r\n\tDijkstraNode1(){};\r\n\t~DijkstraNode1(){};\r\n\r\n\tdouble& distance_from_source(){return m_distance;};\r\n\tnode_pointer& previous(){return m_previous;};\r\n\tunsigned& source_index(){return m_source_index;};\r\n\tvertex_pointer& vertex(){return m_vertex;};\r\n\r\n\tvoid clear()\r\n\t{\r\n\t\tm_distance = GEODESIC_INF;\r\n\t\tm_previous = NULL;\r\n\t}\r\n\r\n\tbool operator()(node_pointer const s1, node_pointer const s2) const\r\n\t{\r\n\t\treturn s1->distance_from_source() != s2->distance_from_source() ?\r\n\t\t\t   s1->distance_from_source() < s2->distance_from_source() :\r\n\t\t\t   s1->vertex()->id() < s2->vertex()->id();\r\n\t};\r\n\r\nprivate: \r\n\tdouble m_distance;\t\t\t\t\t//distance to the closest source\r\n\tunsigned m_source_index;\t\t\t//closest source index\r\n\tnode_pointer m_previous;\t\t\t//previous node in the geodesic path\r\n\tvertex_pointer m_vertex;\t\t\t//correspoding vertex\r\n};\r\n\r\nclass GeodesicAlgorithmDijkstraAlternative: public GeodesicAlgorithmBase\r\n{\r\npublic:\r\n\ttypedef DijkstraNode1 Node;\r\n\ttypedef Node* node_pointer;\r\n\r\n\tGeodesicAlgorithmDijkstraAlternative(geodesic::Mesh* mesh = NULL):\r\n\t\tGeodesicAlgorithmBase(mesh),\r\n\t\tm_nodes(mesh->vertices().size())\r\n\t{\r\n\t\tm_type = DIJKSTRA;\r\n\t\tfor(unsigned i=0; i<m_nodes.size(); ++i)\r\n\t\t{\r\n\t\t\tm_nodes[i].vertex() = &m_mesh->vertices()[i];\r\n\t\t}\r\n\t};\r\n\r\n\t~GeodesicAlgorithmDijkstraAlternative(){};\r\n\r\n\tvirtual void propagate(std::vector<SurfacePoint>& sources,\r\n   \t\t\t\t\t\t   double max_propagation_distance  = GEODESIC_INF,\t\t\t//propagation algorithm stops after reaching the certain distance from the source\r\n\t\t\t\t\t\t   std::vector<SurfacePoint>* stop_points = NULL); //or after ensuring that all the stop_points are covered\r\n\r\n\tvirtual void trace_back(SurfacePoint& destination,\t\t//trace back piecewise-linear path\r\n\t\t\t\t\t\t\tstd::vector<SurfacePoint>& path);\r\n\r\n\tvirtual unsigned best_source(SurfacePoint& point,\t\t\t//quickly find what source this point belongs to and what is the distance to this source\r\n\t\t\t\t\t\t\t\t\tdouble& best_source_distance); \r\nprivate:\r\n\r\n\tvoid set_sources(std::vector<SurfacePoint>& sources)\r\n\t{\r\n\t\tm_sources = sources;\r\n\t}\r\n\r\n\tbool check_stop_conditions();\r\n\t\r\n\tstd::vector<Node> m_nodes;\t//nodes of the subdivision graph located on the vertices\r\n\r\n\tstd::vector<SurfacePoint> m_sources;\t\t//for simplicity, we keep sources as they are\r\n\r\n\ttypedef std::set<node_pointer, Node> queue_type;\r\n\tqueue_type m_queue;\r\n};\r\n\r\ninline unsigned GeodesicAlgorithmDijkstraAlternative::best_source(SurfacePoint& point,\t\t\t//quickly find what source this point belongs to and what is the distance to this source\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   double& best_source_distance)\r\n{\r\n\tif(point.type() == VERTEX)\t\t\r\n\t{\r\n\t\tvertex_pointer v = (vertex_pointer)point.base_element();\r\n\t\tnode_pointer node = &m_nodes[v->id()];\r\n\t\tbest_source_distance = node->distance_from_source();\r\n\t\treturn node->source_index();\r\n\t}\r\n\telse\r\n\t{\r\n\t\tstd::vector<vertex_pointer> possible_vertices;\t\t//initialize vertices directly visible from sources\r\n\t\tm_mesh->closest_vertices(&point, &possible_vertices);\r\n\r\n\t\tbest_source_distance = GEODESIC_INF;\r\n\t\tvertex_pointer min_vertex = NULL;\r\n\t\tfor(unsigned i=0; i<possible_vertices.size(); ++i)\r\n\t\t{\r\n\t\t\tvertex_pointer v = possible_vertices[i];\r\n\r\n\t\t\tdouble distance_from_source = m_nodes[v->id()].distance_from_source();\r\n\t\t\tdouble distance_from_dest = v->distance(&point);\r\n\t\t\tif(distance_from_source + distance_from_dest < best_source_distance)\r\n\t\t\t{\r\n\t\t\t\tbest_source_distance = distance_from_source + distance_from_dest;\r\n\t\t\t\tmin_vertex = v;\r\n\t\t\t}\r\n\t\t}\r\n\t\tassert(min_vertex);\r\n\t\tnode_pointer node = &m_nodes[min_vertex->id()];\r\n\t\treturn node->source_index();\r\n\t}\r\n}\r\n\r\ninline void GeodesicAlgorithmDijkstraAlternative::trace_back(SurfacePoint& destination,\t\t//trace back piecewise-linear path\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t   std::vector<SurfacePoint>& path) \r\n{\r\n\tpath.clear();\r\n\tpath.push_back(destination);\r\n\r\n\tif(destination.type() != VERTEX)\t\t//snap to the closest vertex\r\n\t{\r\n\t\tstd::vector<vertex_pointer> possible_vertices;\t\t//initialize vertices directly visible from sources\r\n\t\tm_mesh->closest_vertices(&destination, &possible_vertices);\r\n\r\n\t\tdouble min_distance = GEODESIC_INF;\r\n\t\tvertex_pointer min_vertex = NULL;\r\n\t\tfor(unsigned i=0; i<possible_vertices.size(); ++i)\r\n\t\t{\r\n\t\t\tvertex_pointer v = possible_vertices[i];\r\n\r\n\t\t\tdouble distance_from_source = m_nodes[v->id()].distance_from_source();\r\n\t\t\tdouble distance_from_dest = v->distance(&destination);\r\n\t\t\tif(distance_from_source + distance_from_dest < min_distance)\r\n\t\t\t{\r\n\t\t\t\tmin_distance = distance_from_source + distance_from_dest;\r\n\t\t\t\tmin_vertex = v;\r\n\t\t\t}\r\n\t\t}\r\n\t\tassert(min_vertex);\r\n\t\tpath.push_back(SurfacePoint(min_vertex));\r\n\t}\r\n\r\n\tnode_pointer node = &m_nodes[path.back().base_element()->id()];\r\n\twhile(node->previous())\t\t\t//follow the path\r\n\t{\r\n\t\tnode = node->previous();\r\n\t\tpath.push_back(SurfacePoint(node->vertex()));\r\n\t}\r\n\r\n\tSurfacePoint& source = m_sources[node->source_index()];\t\t//add source to the path if it is not already there\r\n\tif(source.type() != VERTEX ||\r\n\t   source.base_element()->id() != node->vertex()->id())\r\n\t{\r\n\t\tpath.push_back(source);\r\n\t}\r\n}\r\n\r\ninline void GeodesicAlgorithmDijkstraAlternative::propagate(std::vector<SurfacePoint>& sources,\r\n   \t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdouble max_propagation_distance,\t\t\t//propagation algorithm stops after reaching the certain distance from the source\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstd::vector<SurfacePoint>* stop_points)   //or after ensuring that all the stop_points are covered\r\n{\r\n\tset_stop_conditions(stop_points, max_propagation_distance);\r\n\tset_sources(sources);\r\n\t\r\n\tm_queue.clear();\t\t\t\t\t\t\t\t\t//clear everything\r\n\tfor(unsigned i=0; i<m_nodes.size(); ++i)\r\n\t{\r\n\t\tm_nodes[i].clear();\r\n\t}\r\n\r\n\tclock_t start = clock();\r\n\r\n\tstd::vector<vertex_pointer> visible_vertices;\t\t//initialize vertices directly visible from sources\r\n\tfor(unsigned i=0; i<m_sources.size(); ++i)\r\n\t{\r\n\t\tSurfacePoint* s = &m_sources[i];\r\n\t\tm_mesh->closest_vertices(s, &visible_vertices);\r\n\t\tfor(unsigned j=0; j<visible_vertices.size(); ++j)\r\n\t\t{\r\n\t\t\tvertex_pointer v = visible_vertices[j];\r\n\t\t\tdouble distance = s->distance(v);\r\n\r\n\t\t\tnode_pointer node = &m_nodes[v->id()]; \r\n\t\t\tif(distance < node->distance_from_source())\r\n\t\t\t{\r\n\t\t\t\tnode->distance_from_source() = distance;\r\n\t\t\t\tnode->source_index() = i;\r\n\t\t\t\tnode->previous() = NULL;\r\n\t\t\t}\r\n\t\t}\r\n\t\tvisible_vertices.clear();\r\n\t}\r\n\r\n\tfor(unsigned i=0; i<m_nodes.size(); ++i)\t\t//initialize the queue\r\n\t{\r\n\t\tif(m_nodes[i].distance_from_source() < GEODESIC_INF)\r\n\t\t{\r\n\t\t\tm_queue.insert(&m_nodes[i]);\r\n\t\t}\r\n\t}\r\n\r\n\tunsigned counter = 0;\r\n\t\r\n\twhile(!m_queue.empty())\t\t\t\t\t//main cycle\r\n\t{\r\n\t\tif(counter++ % 10 == 0)\t\t//check if we covered all required vertices\r\n\t\t{\r\n\t\t\tif (check_stop_conditions())\r\n\t\t\t{\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\t//std::cout << counter << \" \" << m_queue.size() << \" \" << (*m_queue.begin())->distance_from_source()<< std::endl;\r\n\t\t}\r\n\r\n\t\tnode_pointer min_node = *m_queue.begin();\r\n\t\tm_queue.erase(m_queue.begin());\r\n\r\n\t\tvertex_pointer v = min_node->vertex();\r\n\r\n\t\tfor(unsigned i=0; i<v->adjacent_edges().size(); ++i)\t\t//update all the adgecent vertices\r\n\t\t{\r\n\t\t\tedge_pointer e = v->adjacent_edges()[i];\r\n\t\t\tvertex_pointer next_v = e->opposite_vertex(v);\r\n\t\t\tnode_pointer next_node = &m_nodes[next_v->id()];\r\n\t\t\t//double current_distance = \r\n\t\t\tif(next_node->distance_from_source() > min_node->distance_from_source() + e->length())\r\n\t\t\t{\r\n\t\t\t\tif(next_node->distance_from_source() < GEODESIC_INF)\t\t//remove it from the queue\r\n\t\t\t\t{\r\n\t\t\t\t\tqueue_type::iterator iter = m_queue.find(next_node);\r\n\t\t\t\t\tassert(iter != m_queue.end());\r\n\t\t\t\t\tm_queue.erase(iter);\r\n\t\t\t\t}\r\n\t\t\t\tnext_node->distance_from_source() = min_node->distance_from_source() + e->length();\r\n\t\t\t\tnext_node->source_index() = min_node->source_index();\r\n\t\t\t\tnext_node->previous() = min_node;\r\n\t\t\t\tm_queue.insert(next_node);\r\n\t\t\t}\r\n\t\t}\r\n\t} \r\n\t//std::cout << std::endl;\r\n\r\n\tclock_t finish = clock();\r\n\tm_time_consumed = (static_cast<double>(finish)-static_cast<double>(start))/CLOCKS_PER_SEC;\r\n}\r\n\r\ninline bool GeodesicAlgorithmDijkstraAlternative::check_stop_conditions()\r\n{\r\n\tdouble queue_min_distance = (*m_queue.begin())->distance_from_source();\r\n\r\n\tif(queue_min_distance > m_max_propagation_distance)\r\n\t{\r\n\t\treturn true;\r\n\t}\r\n\r\n\tfor (unsigned index = 0; index < m_stop_vertices.size(); ++index)\r\n\t{\r\n\t\tvertex_pointer v = m_stop_vertices[index].first;\r\n\t\tNode& node = m_nodes[v->id()];\r\n\t\tif(queue_min_distance > node.distance_from_source() + m_stop_vertices[index].second)\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\t}\r\n\treturn false;\r\n}\r\n\r\n}\t\t//geodesic\r\n\r\n#endif //GEODESIC_ALGORITHM_DIJKSTRA_ALTERNATIVE_010506\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/base/geodesic/geodesic_algorithm_exact.h",
    "content": "//Copyright (C) 2008 Danil Kirsanov, MIT License\r\n#ifndef GEODESIC_ALGORITHM_EXACT_20071231\r\n#define GEODESIC_ALGORITHM_EXACT_20071231\r\n\r\n#include \"geodesic_memory.h\"\r\n#include \"geodesic_algorithm_base.h\"\r\n#include \"geodesic_algorithm_exact_elements.h\"\r\n#include <vector>\r\n#include <cmath>\r\n#include <assert.h>\r\n#include <set>\r\n\r\nnamespace geodesic{\r\n\r\nclass GeodesicAlgorithmExact : public GeodesicAlgorithmBase\r\n{\r\npublic:\r\n    GeodesicAlgorithmExact() {}\r\n\tGeodesicAlgorithmExact(geodesic::Mesh* mesh):\r\n\t  \tGeodesicAlgorithmBase(mesh),\r\n\t\tm_memory_allocator(mesh->edges().size(), mesh->edges().size()),\r\n\t\tm_edge_interval_lists(mesh->edges().size())\r\n\t{\r\n\t\tm_type = EXACT;\r\n\r\n\t\tfor(unsigned i=0; i<m_edge_interval_lists.size(); ++i)\r\n\t\t{\r\n\t\t\tm_edge_interval_lists[i].initialize(&mesh->edges()[i]);\r\n\t\t}\r\n\t};\t\r\n\r\n\t~GeodesicAlgorithmExact(){};\r\n\r\n\tvoid propagate(std::vector<SurfacePoint>& sources,\r\n   \t\t\t\t   double max_propagation_distance = GEODESIC_INF,\t\t\t//propagation algorithm stops after reaching the certain distance from the source\r\n\t\t\t\t   std::vector<SurfacePoint>* stop_points = NULL); //or after ensuring that all the stop_points are covered\r\n\r\n\tvoid trace_back(SurfacePoint& destination,\t\t//trace back piecewise-linear path\r\n\t\t\t\t\tstd::vector<SurfacePoint>& path);\r\n\r\n\tunsigned best_source(SurfacePoint& point,\t\t\t//quickly find what source this point belongs to and what is the distance to this source\r\n\t\tdouble& best_source_distance); \r\n\r\n\tvoid print_statistics();\r\n\r\nprivate:\r\n\ttypedef std::set<interval_pointer, Interval> IntervalQueue;\r\n\r\n\tvoid update_list_and_queue(list_pointer list,\r\n\t\t\t\t\t\t\t   IntervalWithStop* candidates,\t//up to two candidates\r\n\t\t\t\t\t\t\t   unsigned num_candidates);\r\n\r\n\tunsigned compute_propagated_parameters(double pseudo_x, \r\n\t\t\t\t\t\t\t\t\t\t\tdouble pseudo_y, \r\n\t\t\t\t\t\t\t\t\t\t\tdouble d,\t\t//parameters of the interval\r\n\t\t\t\t\t\t\t\t\t\t\tdouble start, \r\n\t\t\t\t\t\t\t\t\t\t\tdouble end,\t\t//start/end of the interval\r\n\t\t\t\t\t\t\t\t\t\t\tdouble alpha,\t//corner angle\r\n\t\t\t\t\t\t\t\t\t\t\tdouble L,\t\t//length of the new edge\r\n\t\t\t\t\t\t\t\t\t\t\tbool first_interval,\t\t//if it is the first interval on the edge\r\n\t\t\t\t\t\t\t\t\t\t\tbool last_interval,\r\n\t\t\t\t\t\t\t\t\t\t\tbool turn_left,\r\n\t\t\t\t\t\t\t\t\t\t\tbool turn_right,\r\n\t\t\t\t\t\t\t\t\t\t\tIntervalWithStop* candidates);\t\t//if it is the last interval on the edge\r\n\r\n\tvoid construct_propagated_intervals(bool invert, \r\n\t\t\t\t\t\t\t\t\t  edge_pointer edge, \r\n\t\t\t\t\t\t\t\t\t  face_pointer face,\t\t//constructs iNew from the rest of the data\r\n\t\t\t\t\t\t\t\t\t  IntervalWithStop* candidates,\r\n\t\t\t\t\t\t\t\t\t  unsigned& num_candidates,\r\n\t\t\t\t\t\t\t\t\t  interval_pointer source_interval);\r\n\r\n\tdouble compute_positive_intersection(double start,\r\n\t\t\t\t\t\t\t\t\t\t double pseudo_x,\r\n\t\t\t\t\t\t\t\t\t\t double pseudo_y,\r\n\t\t\t\t\t\t\t\t\t\t double sin_alpha,\r\n\t\t\t\t\t\t\t\t\t\t double cos_alpha);\t\t//used in construct_propagated_intervals\r\n\r\n\tunsigned intersect_intervals(interval_pointer zero, \r\n\t\t\t\t\t\t\t\t    IntervalWithStop* one);\t\t\t//intersecting two intervals with up to three intervals in the end\r\n\r\n\tinterval_pointer best_first_interval(SurfacePoint& point, \r\n\t\t\t\t\t\t\t\t\t\tdouble& best_total_distance, \r\n\t\t\t\t\t\t\t\t\t\tdouble& best_interval_position,\r\n\t\t\t\t\t\t\t\t\t\tunsigned& best_source_index);\r\n\r\n\tbool check_stop_conditions();\r\n\r\n\tvoid clear()\r\n\t{\r\n\t\tm_memory_allocator.clear();\r\n\t\tm_queue.clear();\r\n\t\tfor(unsigned i=0; i<m_edge_interval_lists.size(); ++i)\r\n\t\t{\r\n\t\t\tm_edge_interval_lists[i].clear();\r\n\t\t}\r\n\t\tm_propagation_distance_stopped = GEODESIC_INF;\r\n\t};\r\n\r\n\tlist_pointer interval_list(edge_pointer e)\r\n\t{\r\n\t\treturn &m_edge_interval_lists[e->id()];\r\n\t};\r\n\r\n\tvoid set_sources(std::vector<SurfacePoint>& sources)\r\n\t{\r\n\t\tm_sources.initialize(sources);\r\n\t}\r\n\r\n\tvoid initialize_propagation_data();\t\t\r\n\r\n\tvoid list_edges_visible_from_source(MeshElementBase* p,\r\n\t\t\t\t\t\t\t\t\t\tstd::vector<edge_pointer>& storage); //used in initialization\r\n\r\n\tlong visible_from_source(SurfacePoint& point);\t//used in backtracing\r\n\r\n\tvoid best_point_on_the_edge_set(SurfacePoint& point, \r\n\t\t\t\t\t\t\t\t\tstd::vector<edge_pointer> const& storage,\r\n\t\t\t\t\t\t\t\t\tinterval_pointer& best_interval,\r\n\t\t\t\t\t\t\t\t\tdouble& best_total_distance,\r\n\t\t\t\t\t\t\t\t\tdouble& best_interval_position);\r\n\r\n\tvoid possible_traceback_edges(SurfacePoint& point, \r\n\t\t\t\t\t\t\t\t  std::vector<edge_pointer>& storage);\r\n\r\n\tbool erase_from_queue(interval_pointer p);\r\n\r\n\tIntervalQueue m_queue;\t//interval queue\r\n\r\n\tMemoryAllocator<Interval> m_memory_allocator;\t\t\t//quickly allocate and deallocate intervals \r\n\tstd::vector<IntervalList> m_edge_interval_lists;\t\t//every edge has its interval data \r\n\r\n\tenum MapType {OLD, NEW};\t\t//used for interval intersection\r\n\tMapType map[5];\t\t\r\n\tdouble start[6];\r\n\tinterval_pointer i_new[5];\r\n\r\n\tunsigned m_queue_max_size;\t\t\t//used for statistics\r\n\tunsigned m_iterations;\t\t\t//used for statistics\r\n\r\n\tSortedSources m_sources;\r\n};\r\n\r\ninline void GeodesicAlgorithmExact::best_point_on_the_edge_set(SurfacePoint& point, \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   std::vector<edge_pointer> const& storage,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   interval_pointer& best_interval,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   double& best_total_distance,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   double& best_interval_position)\r\n{\r\n\tbest_total_distance = 1e100;\r\n\tfor(unsigned i=0; i<storage.size(); ++i)\r\n\t{\r\n\t\tedge_pointer e = storage[i];\r\n\t\tlist_pointer list = interval_list(e);\r\n\r\n\t\tdouble offset;\r\n\t\tdouble distance;\r\n\t\tinterval_pointer interval;\r\n\r\n\t\tlist->find_closest_point(&point, \r\n\t\t\t\t\t\t\t\t offset, \r\n\t\t\t\t\t\t\t\t distance, \r\n\t\t\t\t\t\t\t\t interval);\r\n\r\n\t\tif(distance < best_total_distance)\r\n\t\t{\r\n\t\t\tbest_interval = interval;\r\n\t\t\tbest_total_distance = distance;\r\n\t\t\tbest_interval_position = offset;\r\n\t\t}\r\n\t}\r\n}\r\n\r\ninline void GeodesicAlgorithmExact::possible_traceback_edges(SurfacePoint& point, \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t std::vector<edge_pointer>& storage)\r\n{\r\n\tstorage.clear();\r\n\r\n\tif(point.type() == VERTEX)\r\n\t{\r\n\t\tvertex_pointer v = static_cast<vertex_pointer>(point.base_element());\r\n\t\tfor(unsigned i=0; i<v->adjacent_faces().size(); ++i)\r\n\t\t{\r\n\t\t\tface_pointer f = v->adjacent_faces()[i];\r\n\t\t\tstorage.push_back(f->opposite_edge(v));\r\n\t\t}\r\n\t}\r\n\telse if(point.type() == EDGE)\r\n\t{\r\n\t\tedge_pointer e = static_cast<edge_pointer>(point.base_element());\r\n\t\tfor(unsigned i=0; i<e->adjacent_faces().size(); ++i)\r\n\t\t{\r\n\t\t\tface_pointer f = e->adjacent_faces()[i];\r\n\r\n\t\t\tstorage.push_back(f->next_edge(e,e->v0()));\r\n\t\t\tstorage.push_back(f->next_edge(e,e->v1()));\r\n\t\t}\r\n\t}\r\n\telse\r\n\t{\r\n\t\tface_pointer f = static_cast<face_pointer>(point.base_element());\r\n\t\tstorage.push_back(f->adjacent_edges()[0]);\r\n\t\tstorage.push_back(f->adjacent_edges()[1]);\r\n\t\tstorage.push_back(f->adjacent_edges()[2]);\r\n\t}\r\n}\r\n\r\n\r\ninline long GeodesicAlgorithmExact::visible_from_source(SurfacePoint& point)\t//negative if not visible\r\n{\r\n\tassert(point.type() != UNDEFINED_POINT);\r\n\r\n\tif(point.type() == EDGE)\t\t\r\n\t{\r\n\t\tedge_pointer e = static_cast<edge_pointer>(point.base_element());\r\n\t\tlist_pointer list = interval_list(e);\r\n\t\tdouble position = std::min(point.distance(e->v0()), e->length());\r\n\t\tinterval_pointer interval = list->covering_interval(position);\r\n\t\t//assert(interval);\r\n\t\tif(interval && interval->visible_from_source())\r\n\t\t{\r\n\t\t\treturn (long)interval->source_index();\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\treturn -1;\r\n\t\t}\r\n\t}\r\n\telse if(point.type() == FACE)\t\t\r\n\t{\r\n\t\treturn -1;\r\n\t}\r\n\telse if(point.type() == VERTEX)\t\t\r\n\t{\r\n\t\tvertex_pointer v = static_cast<vertex_pointer>(point.base_element());\r\n\t\tfor(unsigned i=0; i<v->adjacent_edges().size(); ++i)\r\n\t\t{\r\n\t\t\tedge_pointer e = v->adjacent_edges()[i];\r\n\t\t\tlist_pointer list = interval_list(e);\r\n\r\n\t\t\tdouble position = e->v0()->id() == v->id() ? 0.0 : e->length();\r\n\t\t\tinterval_pointer interval = list->covering_interval(position);\r\n\t\t\tif(interval && interval->visible_from_source())\r\n\t\t\t{\r\n\t\t\t\treturn (long)interval->source_index();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn -1;\r\n\t}\r\n\r\n\tassert(0);\r\n\treturn 0;\r\n}\r\n\r\ninline double GeodesicAlgorithmExact::compute_positive_intersection(double start,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdouble pseudo_x,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdouble pseudo_y,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdouble sin_alpha,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdouble cos_alpha)\r\n{\r\n\tassert(pseudo_y < 0);\r\n\r\n\tdouble denominator = sin_alpha*(pseudo_x - start) - cos_alpha*pseudo_y;\r\n\tif(denominator<0.0)\r\n\t{\r\n\t\treturn -1.0;\r\n\t}\r\n\r\n\tdouble numerator = -pseudo_y*start;\r\n\r\n\tif(numerator < 1e-30)\r\n\t{\r\n\t\treturn 0.0;\r\n\t}\r\n\r\n\tif(denominator < 1e-30)\r\n\t{\r\n\t\treturn -1.0;\r\n\t}\r\n\r\n\treturn numerator/denominator;\r\n}\r\n\r\ninline void GeodesicAlgorithmExact::list_edges_visible_from_source(MeshElementBase* p,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   std::vector<edge_pointer>& storage)\r\n{\r\n\tassert(p->type() != UNDEFINED_POINT);\r\n\r\n\tif(p->type() == FACE)\r\n\t{\r\n\t\tface_pointer f = static_cast<face_pointer>(p);\r\n\t\tfor(unsigned i=0; i<3; ++i)\r\n\t\t{\r\n\t\t\tstorage.push_back(f->adjacent_edges()[i]);\r\n\t\t}\r\n\t}\r\n\telse if(p->type() == EDGE)\r\n\t{\r\n\t\tedge_pointer e = static_cast<edge_pointer>(p);\r\n\t\tstorage.push_back(e);\r\n\t}\r\n\telse\t\t\t//VERTEX\r\n\t{\r\n\t\tvertex_pointer v = static_cast<vertex_pointer>(p);\r\n\t\tfor(unsigned i=0; i<v->adjacent_edges().size(); ++i)\r\n\t\t{\r\n\t\t\tstorage.push_back(v->adjacent_edges()[i]);\r\n\t\t}\r\n\r\n\t}\r\n}\r\n\r\ninline bool GeodesicAlgorithmExact::erase_from_queue(interval_pointer p)\r\n{\r\n\tif(p->min() < GEODESIC_INF/10.0)// && p->min >= queue->begin()->first)\r\n\t{\r\n\t\tassert(m_queue.count(p)<=1);\t\t\t//the set is unique\r\n\r\n\t\tIntervalQueue::iterator it = m_queue.find(p);\r\n\r\n\t\tif(it != m_queue.end())\r\n\t\t{\r\n\t\t\tm_queue.erase(it);\r\n\t\t\treturn true;\r\n\t\t}\r\n\t}\r\n\r\n\treturn false;\r\n}\r\n\r\ninline unsigned GeodesicAlgorithmExact::intersect_intervals(interval_pointer zero, \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   IntervalWithStop* one)\t\t\t//intersecting two intervals with up to three intervals in the end\r\n{\r\n\tassert(zero->edge()->id() == one->edge()->id());\r\n\tassert(zero->stop() > one->start() && zero->start() < one->stop());\r\n\tassert(one->min() < GEODESIC_INF/10.0);\r\n\r\n\tdouble const local_epsilon = SMALLEST_INTERVAL_RATIO*one->edge()->length(); \r\n\r\n\tunsigned N=0;\r\n\tif(zero->min() > GEODESIC_INF/10.0)\r\n\t{\r\n\t\tstart[0] = zero->start();\r\n\t\tif(zero->start() < one->start() - local_epsilon)\r\n\t\t{\r\n\t\t\tmap[0] = OLD;\r\n\t\t\tstart[1] = one->start();\r\n\t\t\tmap[1] = NEW;\r\n\t\t\tN = 2;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tmap[0] = NEW;\r\n\t\t\tN = 1;\r\n\t\t}\r\n\r\n\t\tif(zero->stop() > one->stop() + local_epsilon)\r\n\t\t{\r\n\t\t\tmap[N] = OLD;\t\t\t\t\t\t\t//\"zero\" interval\r\n\t\t\tstart[N++] = one->stop();\r\n\t\t}\r\n\r\n\t\tstart[N+1] = zero->stop();\r\n\t\treturn N;\r\n\t}\r\n\r\n\tdouble const local_small_epsilon = 1e-8*one->edge()->length(); \r\n\r\n\tdouble D = zero->d() - one->d();\r\n\tdouble x0 = zero->pseudo_x();\r\n\tdouble x1 = one->pseudo_x();\r\n\tdouble R0 = x0*x0 + zero->pseudo_y()*zero->pseudo_y();\r\n\tdouble R1 = x1*x1 + one->pseudo_y()*one->pseudo_y();\r\n\r\n\tdouble inter[2];\t\t\t\t\t\t\t\t\t//points of intersection\r\n\tchar Ninter=0;\t\t\t\t\t\t\t\t\t\t//number of the points of the intersection\r\n\r\n\tif(std::abs(D)<local_epsilon)\t\t\t\t\t//if d1 == d0, equation is linear\r\n\t{\r\n\t\tdouble denom = x1 - x0;\r\n\t\tif(std::abs(denom)>local_small_epsilon)\r\n\t\t{\r\n\t\t\tinter[0] =  (R1 - R0)/(2.*denom);\t\t\t\t\t//one solution\r\n\t\t\tNinter = 1;\r\n\t\t}\r\n\t}\r\n\telse\r\n\t{\r\n\t\tdouble D2 = D*D;\r\n\t\tdouble Q = 0.5*(R1-R0-D2);\r\n\t\tdouble X = x0 - x1;\r\n\r\n\t\tdouble A = X*X - D2;\r\n\t\tdouble B = Q*X + D2*x0;\r\n\t\tdouble C = Q*Q - D2*R0;\r\n\r\n\t\tif (std::abs(A)<local_small_epsilon)\t\t\t\t\t\t\t//if A == 0, linear equation\r\n\t\t{\r\n\t\t\tif(std::abs(B)>local_small_epsilon)\r\n\t\t\t{\r\n\t\t\t\tinter[0] =  -C/B;\t\t\t\t\t\t\t//one solution\r\n\t\t\t\tNinter = 1;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tdouble det = B*B-A*C;\r\n\t\t\tif(det>local_small_epsilon*local_small_epsilon)\t\t\t//two roots\r\n\t\t\t{\r\n\t\t\t\tdet = sqrt(det);\r\n\t\t\t\tif(A>0.0)\t\t\t\t\t\t\t\t//make sure that the roots are ordered\r\n\t\t\t\t{\r\n\t\t\t\t\tinter[0] = (-B - det)/A;\r\n\t\t\t\t\tinter[1] = (-B + det)/A;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tinter[0] = (-B + det)/A;\r\n\t\t\t\t\tinter[1] = (-B - det)/A;\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tif(inter[1] - inter[0] > local_small_epsilon)\r\n\t\t\t\t{\r\n\t\t\t\t\tNinter = 2;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tNinter = 1;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if(det>=0.0)\t\t\t\t\t//single root\r\n\t\t\t{\r\n\t\t\t\tinter[0] = -B/A;\r\n\t\t\t\tNinter = 1;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t//---------------------------find possible intervals---------------------------------------\r\n\tdouble left = std::max(zero->start(), one->start());\t\t//define left and right boundaries of the intersection of the intervals\r\n\tdouble right = std::min(zero->stop(), one->stop());\r\n\r\n\tdouble good_start[4];\t\t\t\t\t\t\t\t\t\t//points of intersection within the (left, right) limits +\"left\" + \"right\"\r\n\tgood_start[0] = left;\r\n\tchar Ngood_start=1;\t\t\t\t\t\t\t\t\t\t//number of the points of the intersection\t\r\n\r\n\tfor(char i=0; i<Ninter; ++i)\t\t\t\t\t\t\t//for all points of intersection\r\n\t{\r\n\t\tdouble x = inter[i];\r\n\t\tif(x > left + local_epsilon && x < right - local_epsilon)\r\n\t\t{\r\n\t\t\tgood_start[Ngood_start++] = x;\r\n\t\t}\r\n\t}\r\n\tgood_start[Ngood_start++] = right;\r\n\r\n\tMapType mid_map[3];\r\n\tfor(char i=0; i<Ngood_start-1; ++i)\r\n\t{\r\n\t\tdouble mid = (good_start[i] + good_start[i+1])*0.5;\r\n\t\tmid_map[i] = zero->signal(mid) <= one->signal(mid) ? OLD : NEW;\r\n\t}\r\n\r\n\t//-----------------------------------output----------------------------------\r\n\tN = 0;\r\n\tif(zero->start() < left - local_epsilon)\t\t\t\t\t\t//additional \"zero\" interval\r\n\t{\r\n\t\tif(mid_map[0] == OLD)\t\t\t\t//first interval in the map is already the old one\r\n\t\t{\r\n\t\t\tgood_start[0] = zero->start();\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tmap[N] = OLD;\t\t\t\t\t//\"zero\" interval\r\n\t\t\tstart[N++] = zero->start();\r\n\t\t}\r\n\t}\r\n\r\n\tfor(long i=0;i<Ngood_start-1;++i)\t\t\t\t\t\t\t//for all intervals\r\n\t{\r\n\t\tMapType current_map = mid_map[i];\r\n\t\tif(N==0 || map[N-1] != current_map)\r\n\t\t{\r\n\t\t\tmap[N] = current_map;\t\t\t\t\r\n\t\t\tstart[N++] = good_start[i];\r\n\t\t}\r\n\t}\r\n\r\n\tif(zero->stop() > one->stop() + local_epsilon)\r\n\t{\r\n\t\tif(N==0 || map[N-1] == NEW)\r\n\t\t{\r\n\t\t\tmap[N] = OLD;\t\t\t\t\t\t\t//\"zero\" interval\r\n\t\t\tstart[N++] = one->stop();\r\n\t\t}\r\n\t}\r\n\r\n\tstart[0] = zero->start();\t\t// just to make sure that epsilons do not damage anything\r\n\t//start[N] = zero->stop();\r\n\r\n\treturn N; \r\n}\r\n\r\ninline void GeodesicAlgorithmExact::initialize_propagation_data()\r\n{\r\n\tclear();\r\n\r\n\tIntervalWithStop candidate;\r\n\tstd::vector<edge_pointer> edges_visible_from_source;\r\n\tfor(unsigned i=0; i<m_sources.size(); ++i)\t\t//for all edges adjacent to the starting vertex\t\t\t\r\n\t{\r\n\t\tSurfacePoint* source = &m_sources[i];\r\n\t\t\r\n\t\tedges_visible_from_source.clear();\r\n\t\tlist_edges_visible_from_source(source->base_element(), \r\n\t\t\t\t\t\t\t\t\t   edges_visible_from_source);\r\n\t\t\r\n\t\tfor(unsigned j=0; j<edges_visible_from_source.size(); ++j)\r\n\t\t{\r\n\t\t\tedge_pointer e = edges_visible_from_source[j];\r\n\t\t\tcandidate.initialize(e, source, i);\r\n            candidate.stop() = e->length();\r\n\t\t\tcandidate.compute_min_distance(candidate.stop());\r\n\t\t\tcandidate.direction() = Interval::FROM_SOURCE;\r\n\r\n\t\t\tupdate_list_and_queue(interval_list(e), &candidate, 1);\r\n\t\t}\r\n\t}\r\n}\r\n\r\ninline void GeodesicAlgorithmExact::propagate(std::vector<SurfacePoint>& sources,\r\n   \t\t\t\t\t\t\t\t\t   double max_propagation_distance,\t\t\t//propagation algorithm stops after reaching the certain distance from the source\r\n\t\t\t\t\t\t\t\t\t   std::vector<SurfacePoint>* stop_points)\r\n{\r\n\tset_stop_conditions(stop_points, max_propagation_distance);\r\n\tset_sources(sources);\r\n\tinitialize_propagation_data();\r\n\r\n\tclock_t start = clock();\r\n\r\n\tm_iterations = 0;\t\t//for statistics\r\n\tm_queue_max_size = 0;\r\n\r\n\tIntervalWithStop candidates[2];\r\n\r\n\twhile(!m_queue.empty())\r\n\t{\r\n\t\tm_queue_max_size = std::max((unsigned int)m_queue.size(), m_queue_max_size);\r\n\r\n\t\tunsigned const check_period = 10;\r\n    \tif(++m_iterations % check_period == 0)\t\t//check if we covered all required vertices\r\n\t\t{\r\n\t\t\tif (check_stop_conditions())\r\n\t\t\t{\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinterval_pointer min_interval = *m_queue.begin();\r\n\t\tm_queue.erase(m_queue.begin());\r\n\t\tedge_pointer edge = min_interval->edge();\r\n\t\tlist_pointer list = interval_list(edge);\r\n\r\n\t\tassert(min_interval->d() < GEODESIC_INF);\r\n\r\n\t\tbool const first_interval = min_interval->start() == 0.0;\r\n\t\t//bool const last_interval = min_interval->stop() == edge->length();\r\n\t\tbool const last_interval = min_interval->next() == NULL;\r\n\r\n\t\tbool const turn_left = edge->v0()->saddle_or_boundary();\r\n\t\tbool const turn_right = edge->v1()->saddle_or_boundary();\r\n\r\n\t\tfor(unsigned i=0; i<edge->adjacent_faces().size(); ++i)\t\t//two possible faces to propagate\r\n\t\t{\r\n\t\t\tif(!edge->is_boundary())\t\t//just in case, always propagate boundary edges\r\n\t\t\t{\r\n\t\t\t\tif((i == 0 && min_interval->direction() == Interval::FROM_FACE_0) ||\r\n\t\t\t\t\t(i == 1 && min_interval->direction() == Interval::FROM_FACE_1))\r\n\t\t\t\t{\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tface_pointer face = edge->adjacent_faces()[i];\t\t\t//if we come from 1, go to 2\r\n\t\t\tedge_pointer next_edge = face->next_edge(edge,edge->v0());\r\n\r\n\t\t\tunsigned num_propagated = compute_propagated_parameters(min_interval->pseudo_x(), \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t min_interval->pseudo_y(), \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t min_interval->d(),\t\t//parameters of the interval\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t min_interval->start(), \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t min_interval->stop(),\t\t//start/end of the interval\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t face->vertex_angle(edge->v0()),\t//corner angle\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t next_edge->length(),\t\t//length of the new edge\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t first_interval,\t\t//if it is the first interval on the edge\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t last_interval,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t turn_left,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t turn_right,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t candidates);\t\t//if it is the last interval on the edge\r\n\t\t\tbool propagate_to_right = true;\r\n\r\n\t\t\tif(num_propagated)\r\n\t\t\t{\r\n\t\t\t\tif(candidates[num_propagated-1].stop() != next_edge->length()) \r\n\t\t\t\t{\r\n\t\t\t\t\tpropagate_to_right = false;\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tbool const invert = next_edge->v0()->id() != edge->v0()->id(); //if the origins coinside, do not invert intervals\r\n\r\n\t\t\t\tconstruct_propagated_intervals(invert,\t\t//do not inverse \r\n\t\t\t\t\t\t\t\t\t\t\t next_edge, \r\n\t\t\t\t\t\t\t\t\t\t\t face,\r\n\t\t\t\t\t\t\t\t\t\t\t candidates,\r\n\t\t\t\t\t\t\t\t\t\t\t num_propagated,\r\n\t\t\t\t\t\t\t\t\t\t\t min_interval);\r\n\t\t\t\t\r\n\t\t\t\tupdate_list_and_queue(interval_list(next_edge), \r\n\t\t\t\t\t\t\t\t\t  candidates, \r\n\t\t\t\t\t\t\t\t\t  num_propagated);\r\n\t\t\t}\r\n\r\n\t\t\tif(propagate_to_right)\r\n\t\t\t{\r\n\t\t\t\t\t\t\t\t\t//propogation to the right edge\r\n\t\t\t\tdouble length = edge->length();\r\n\t\t\t\tnext_edge = face->next_edge(edge,edge->v1());\r\n\r\n\t\t\t\tnum_propagated = compute_propagated_parameters(length - min_interval->pseudo_x(), \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t min_interval->pseudo_y(), \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t min_interval->d(),\t\t//parameters of the interval\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t length - min_interval->stop(), \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t length - min_interval->start(),\t\t//start/end of the interval\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t face->vertex_angle(edge->v1()),\t//corner angle\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t next_edge->length(),\t\t//length of the new edge\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t last_interval,\t\t//if it is the first interval on the edge\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t first_interval,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t turn_right,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t turn_left,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t candidates);\t\t//if it is the last interval on the edge\r\n\r\n\t\t\t\tif(num_propagated)\r\n\t\t\t\t{\r\n\t\t\t\t\tbool const invert = next_edge->v0()->id() != edge->v1()->id();\t\t//if the origins coinside, do not invert intervals\r\n\r\n\t\t\t\t\tconstruct_propagated_intervals(invert,\t\t//do not inverse \r\n\t\t\t\t\t\t\t\t\t\t\t\t next_edge, \r\n\t\t\t\t\t\t\t\t\t\t\t\t face,\r\n\t\t\t\t\t\t\t\t\t\t\t\t candidates,\r\n\t\t\t\t\t\t\t\t\t\t\t\t num_propagated,\r\n\t\t\t\t\t\t\t\t\t\t\t\t min_interval);\r\n\r\n\t\t\t\t\tupdate_list_and_queue(interval_list(next_edge), \r\n\t\t\t\t\t\t\t\t\t      candidates, \r\n\t\t\t\t\t\t\t\t\t\t  num_propagated);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} \r\n\t} \r\n\r\n\tm_propagation_distance_stopped = m_queue.empty() ? GEODESIC_INF : (*m_queue.begin())->min();\r\n\tclock_t stop = clock();\r\n\tm_time_consumed = (static_cast<double>(stop)-static_cast<double>(start))/CLOCKS_PER_SEC;\r\n\r\n/*\tfor(unsigned i=0; i<m_edge_interval_lists.size(); ++i)\r\n\t{\r\n\t\tlist_pointer list = &m_edge_interval_lists[i];\r\n\t\tinterval_pointer p = list->first();\r\n\t\tassert(p->start() == 0.0);\r\n\t\twhile(p->next())\r\n\t\t{\r\n\t\t\tassert(p->stop() == p->next()->start());\r\n\t\t\tassert(p->d() < GEODESIC_INF);\r\n\t\t\tp = p->next();\r\n\t\t}\r\n\t}*/\r\n}\r\n\r\n\r\ninline bool GeodesicAlgorithmExact::check_stop_conditions()\r\n{\r\n\tdouble queue_distance = (*m_queue.begin())->min();\r\n\tif(queue_distance > stop_distance())\r\n\t{\r\n\t\treturn true;\r\n\t}\r\n\r\n\tfor (unsigned index = 0; index < m_stop_vertices.size(); ++index)\r\n\t{\r\n\t\tvertex_pointer v = m_stop_vertices[index].first;\r\n\t\tedge_pointer edge = v->adjacent_edges()[0];\t\t\t\t//take any edge\r\n\r\n\t\tdouble distance = edge->v0()->id() == v->id() ? \r\n\t\t\t\t\t\t  interval_list(edge)->signal(0.0) :\r\n\t\t\t\t\t\t  interval_list(edge)->signal(edge->length());\r\n\r\n\t\tif(queue_distance > distance + m_stop_vertices[index].second)\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\t}\r\n\treturn false;\r\n}\r\n\r\n\r\ninline void GeodesicAlgorithmExact::update_list_and_queue(list_pointer list,\r\n\t\t\t\t\t\t\t\t\t\t\t\tIntervalWithStop* candidates,\t//up to two candidates\r\n\t\t\t\t\t\t\t\t\t\t\t\tunsigned num_candidates)\r\n{\r\n\tassert(num_candidates <= 2);\r\n\t//assert(list->first() != NULL);\r\n\tedge_pointer edge = list->edge();\r\n\tdouble const local_epsilon = SMALLEST_INTERVAL_RATIO * edge->length(); \r\n\r\n\tif(list->first() == NULL) \r\n\t{\r\n\t\tinterval_pointer* p = &list->first();\r\n\t\tIntervalWithStop* first;\r\n\t\tIntervalWithStop* second; \r\n\r\n\t\tif(num_candidates == 1)\r\n\t\t{\r\n\t\t\tfirst = candidates;\r\n\t\t\tsecond = candidates;\r\n\t\t\tfirst->compute_min_distance(first->stop());\r\n\t\t}\r\n\t\telse \r\n\t\t{\t\r\n\t\t\tif(candidates->start() <= (candidates+1)->start())\r\n\t\t\t{\r\n\t\t\t\tfirst = candidates;\r\n\t\t\t\tsecond = candidates+1;\r\n\t\t\t}\r\n\t\t\telse \r\n\t\t\t{\r\n\t\t\t\tfirst = candidates+1;\r\n\t\t\t\tsecond = candidates;\r\n\t\t\t}\r\n\t\t\tassert(first->stop() == second->start());\r\n\r\n\t\t\tfirst->compute_min_distance(first->stop());\r\n\t\t\tsecond->compute_min_distance(second->stop());\r\n\t\t}\r\n\r\n\t\tif(first->start() > 0.0)\r\n\t\t{\r\n\t\t\t*p = m_memory_allocator.allocate();\r\n\t\t\t(*p)->initialize(edge);\r\n\t\t\tp = &(*p)->next();\r\n\t\t}\r\n\r\n\t\t*p = m_memory_allocator.allocate();\r\n\t\tmemcpy(*p,first,sizeof(Interval));\r\n\t\tm_queue.insert(*p);\r\n\r\n\t\tif(num_candidates == 2)\r\n\t\t{\r\n\t\t\tp = &(*p)->next();\r\n\t\t\t*p = m_memory_allocator.allocate();\r\n\t\t\tmemcpy(*p,second,sizeof(Interval));\r\n\t\t\tm_queue.insert(*p);\r\n\t\t}\r\n\r\n\t\tif(second->stop() < edge->length())\r\n\t\t{\r\n\t\t\tp = &(*p)->next();\r\n\t\t\t*p = m_memory_allocator.allocate();\r\n\t\t\t(*p)->initialize(edge);\r\n\t\t\t(*p)->start() = second->stop();\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\t(*p)->next() = NULL;\r\n\t\t}\r\n\t\treturn;\r\n\t}\r\n\r\n\tbool propagate_flag;\r\n\r\n\tfor(unsigned i=0; i<num_candidates; ++i)\t\t\t\t//for all new intervals\r\n\t{\r\n\t\tIntervalWithStop* q = &candidates[i];\r\n\t\r\n\t\tinterval_pointer previous = NULL;\r\n\r\n\t\tinterval_pointer p = list->first();\r\n\t\tassert(p->start() == 0.0);\r\n\r\n\t\twhile(p != NULL && p->stop() - local_epsilon < q->start())\r\n\t\t{\r\n\t\t\tp = p->next(); \r\n\t\t}\r\n\r\n\t\twhile(p != NULL && p->start() < q->stop() - local_epsilon)\t\t\t//go through all old intervals\r\n\t\t{\r\n\t\t\tunsigned const N = intersect_intervals(p, q);\t\t\t\t\t\t\t\t//interset two intervals\r\n\r\n\t\t\tif(N == 1)\t\t\t\r\n\t\t\t{\r\n\t\t\t\tif(map[0]==OLD)\t//if \"p\" is always better, we do not need to update anything)\r\n\t\t\t\t{\r\n\t\t\t\t\tif(previous)\t\t//close previous interval and put in into the queue\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tprevious->next() = p;\r\n\t\t\t\t\t\tprevious->compute_min_distance(p->start());\r\n\t\t\t\t\t\tm_queue.insert(previous);\r\n\t\t\t\t\t\tprevious = NULL;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tp = p->next(); \r\n\t\t\t\t\t\r\n\t\t\t\t}\r\n\t\t\t\telse if(previous)\t//extend previous interval to cover everything; remove p\r\n\t\t\t\t{\r\n\t\t\t\t\tprevious->next() = p->next(); \r\n\t\t\t\t\terase_from_queue(p);\r\n\t\t\t\t\tm_memory_allocator.deallocate(p);\r\n\r\n\t\t\t\t\tp = previous->next();\r\n\t\t\t\t}\r\n\t\t\t\telse\t\t\t\t//p becomes \"previous\"\r\n\t\t\t\t{\r\n\t\t\t\t\tprevious = p;\r\n\t\t\t\t\tinterval_pointer next = p->next();\r\n\t\t\t\t\terase_from_queue(p);\r\n\r\n\t\t\t\t\tmemcpy(previous,q,sizeof(Interval));\r\n\r\n\t\t\t\t\tprevious->start() = start[0];\r\n\t\t\t\t\tprevious->next() = next;\r\n\r\n\t\t\t\t\tp = next; \r\n\t\t\t\t}\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\t//update_flag = true;\r\n\r\n\t\t\tInterval swap(*p);\t\t\t\t\t\t\t//used for swapping information\r\n\t\t\tpropagate_flag = erase_from_queue(p);\r\n\r\n\t\t\tfor(unsigned j=1; j<N; ++j)\t\t\t\t//no memory is needed for the first one\r\n\t\t\t{\r\n\t\t\t\ti_new[j] = m_memory_allocator.allocate();\t//create new intervals\r\n\t\t\t}\r\n\r\n\t\t\tif(map[0]==OLD)\t//finish previous, if any\r\n\t\t\t{\r\n\t\t\t\tif(previous)\r\n\t\t\t\t{\r\n\t\t\t\t\tprevious->next() = p;\r\n\t\t\t\t\tprevious->compute_min_distance(previous->stop());\r\n\t\t\t\t\tm_queue.insert(previous);\r\n\t\t\t\t\tprevious = NULL;\r\n\t\t\t\t}\r\n\t\t\t\ti_new[0] = p;\r\n\t\t\t\tp->next() = i_new[1];\r\n\t\t\t\tp->start() = start[0];\r\n\t\t\t}\r\n\t\t\telse if(previous)\t//extend previous interval to cover everything; remove p\r\n\t\t\t{\r\n\t\t\t\ti_new[0] = previous;\r\n\t\t\t\tprevious->next() = i_new[1]; \r\n\t\t\t\tm_memory_allocator.deallocate(p);\r\n\t\t\t\tprevious = NULL;\r\n\t\t\t}\r\n\t\t\telse\t\t\t\t//p becomes \"previous\"\r\n\t\t\t{\r\n\t\t\t\ti_new[0] = p;\r\n\t\t\t\tmemcpy(p,q,sizeof(Interval));\r\n\r\n\t\t\t\tp->next() = i_new[1];\r\n\t\t\t\tp->start() = start[0];\r\n\t\t\t}\r\n\r\n\t\t\tassert(!previous);\r\n\r\n\t\t\tfor(unsigned j=1; j<N; ++j)\t\t\t\t\t\r\n\t\t\t{\r\n\t\t\t\tinterval_pointer current_interval = i_new[j];\r\n\r\n\t\t\t\tif(map[j] == OLD)\t\r\n\t\t\t\t{\r\n\t\t\t\t\tmemcpy(current_interval,&swap,sizeof(Interval));\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tmemcpy(current_interval,q,sizeof(Interval));\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tif(j == N-1)\t\r\n\t\t\t\t{\r\n\t\t\t\t\tcurrent_interval->next() = swap.next();\r\n\t\t\t\t}\r\n\t\t\t\telse\t\t\t\r\n\t\t\t\t{\r\n\t\t\t\t\tcurrent_interval->next() = i_new[j+1];\r\n\t\t\t\t}\r\n\r\n\t\t\t\tcurrent_interval->start() = start[j];\r\n\t\t\t}\r\n\r\n\t\t\tfor(unsigned j=0; j<N; ++j)\t\t\t\t\t\t\t\t//find \"min\" and add the intervals to the queue\r\n\t\t\t{\r\n\t\t\t\tif(j==N-1 && map[j]==NEW)\r\n\t\t\t\t{\r\n\t\t\t\t\tprevious = i_new[j];\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tinterval_pointer current_interval = i_new[j];\r\n\r\n\t\t\t\t\tcurrent_interval->compute_min_distance(current_interval->stop());\t\t\t\t\t//compute minimal distance\r\n\r\n\t\t\t\t\tif(map[j]==NEW || (map[j]==OLD && propagate_flag))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tm_queue.insert(current_interval);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tp = swap.next();\r\n\t\t}\r\n\r\n\t\tif(previous)\t\t//close previous interval and put in into the queue\r\n\t\t{\r\n\t\t\tprevious->compute_min_distance(previous->stop());\r\n\t\t\tm_queue.insert(previous);\r\n\t\t\tprevious = NULL;\r\n\t\t}\r\n\t}\r\n}\r\n\r\ninline unsigned GeodesicAlgorithmExact::compute_propagated_parameters(double pseudo_x, \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdouble pseudo_y, \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdouble d,\t\t//parameters of the interval\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdouble begin, \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdouble end,\t\t//start/end of the interval\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdouble alpha,\t//corner angle\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdouble L,\t\t//length of the new edge\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbool first_interval,\t\t//if it is the first interval on the edge\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbool last_interval,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbool turn_left,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbool turn_right,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tIntervalWithStop* candidates)\t\t//if it is the last interval on the edge\r\n{\t\t\t\t\r\n\tassert(pseudo_y<=0.0);\r\n\tassert(d<GEODESIC_INF/10.0);\r\n\tassert(begin<=end);\r\n\tassert(first_interval ? (begin == 0.0) : true);\r\n\r\n\tIntervalWithStop* p = candidates;\r\n\r\n\tif(std::abs(pseudo_y) <= 1e-30)\t\t\t\t//pseudo-source is on the edge\r\n\t{\r\n\t\tif(first_interval && pseudo_x <= 0.0)\r\n\t\t{\r\n\t\t\tp->start() = 0.0;\r\n\t\t\tp->stop() = L;\r\n\t\t\tp->d() = d - pseudo_x;\r\n\t\t\tp->pseudo_x() = 0.0;\r\n\t\t\tp->pseudo_y() = 0.0;\r\n\t\t\treturn 1;\r\n\t\t}\r\n\t\telse if(last_interval && pseudo_x >= end)\r\n\t\t{\r\n\t\t\tp->start() = 0.0;\r\n\t\t\tp->stop() = L;\r\n\t\t\tp->d() = d + pseudo_x-end;\r\n\t\t\tp->pseudo_x() = end*cos(alpha);\r\n\t\t\tp->pseudo_y() = -end*sin(alpha);\r\n\t\t\treturn 1;\r\n\t\t}\r\n\t\telse if(pseudo_x >= begin && pseudo_x <= end)\r\n\t\t{\r\n\t\t\tp->start() = 0.0;\r\n\t\t\tp->stop() = L;\r\n\t\t\tp->d() = d;\r\n\t\t\tp->pseudo_x() = pseudo_x*cos(alpha);\r\n\t\t\tp->pseudo_y() = -pseudo_x*sin(alpha);\r\n\t\t\treturn 1;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t}\r\n\r\n\tdouble sin_alpha = sin(alpha);\r\n\tdouble cos_alpha = cos(alpha);\r\n\r\n\t//important: for the first_interval, this function returns zero only if the new edge is \"visible\" from the source\r\n\t//if the new edge can be covered only after turn_over, the value is negative (-1.0)\r\n\tdouble L1 = compute_positive_intersection(begin, \r\n\t\t\t\t\t\t\t\t\t\t\t  pseudo_x, \r\n\t\t\t\t\t\t\t\t\t\t\t  pseudo_y, \r\n\t\t\t\t\t\t\t\t\t\t      sin_alpha, \r\n\t\t\t\t\t\t\t\t\t\t      cos_alpha);\r\n\r\n\tif(L1 < 0 || L1 >= L)\r\n\t{\r\n\t\tif(first_interval && turn_left)\r\n\t\t{\r\n\t\t\tp->start() = 0.0;\r\n\t\t\tp->stop() = L;\r\n\t\t\tp->d() = d + sqrt(pseudo_x*pseudo_x + pseudo_y*pseudo_y);\r\n\t\t\tp->pseudo_y() = 0.0;\r\n\t\t\tp->pseudo_x() = 0.0;\r\n\t\t\treturn 1;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t}\r\n\r\n\tdouble L2 = compute_positive_intersection(end, \r\n\t\t\t\t\t\t\t\t\t\t\t  pseudo_x, \r\n\t\t\t\t\t\t\t\t\t\t\t  pseudo_y, \r\n\t\t\t\t\t\t\t\t\t\t\t  sin_alpha, \r\n\t\t\t\t\t\t\t\t\t\t\t  cos_alpha);\r\n\r\n\tif(L2 < 0 || L2 >= L)\r\n\t{\r\n\t\tp->start() = L1;\r\n\t\tp->stop() = L;\r\n\t\tp->d() = d;\r\n\t\tp->pseudo_x() = cos_alpha*pseudo_x + sin_alpha*pseudo_y;\r\n\t\tp->pseudo_y() = -sin_alpha*pseudo_x + cos_alpha*pseudo_y;\r\n\r\n\t\treturn 1;\r\n\t}\r\n\r\n\tp->start() = L1;\r\n\tp->stop() = L2;\r\n\tp->d() = d;\r\n\tp->pseudo_x() = cos_alpha*pseudo_x + sin_alpha*pseudo_y;\r\n\tp->pseudo_y() = -sin_alpha*pseudo_x + cos_alpha*pseudo_y;\r\n\tassert(p->pseudo_y() <= 0.0);\r\n\r\n\tif(!(last_interval && turn_right))\r\n\t{\r\n\t\treturn 1;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tp = candidates + 1;\r\n\r\n\t\tp->start() = L2;\r\n\t\tp->stop() = L;\r\n\t\tdouble dx = pseudo_x - end;\r\n\t\tp->d() = d + sqrt(dx*dx + pseudo_y*pseudo_y);\r\n\t\tp->pseudo_x() = end*cos_alpha;\r\n\t\tp->pseudo_y() = -end*sin_alpha;\r\n\r\n\t\treturn 2;\r\n\t}\r\n}\r\n\r\ninline void GeodesicAlgorithmExact::construct_propagated_intervals(bool invert, \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tedge_pointer edge, \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tface_pointer face,\t\t//constructs iNew from the rest of the data\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tIntervalWithStop* candidates,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tunsigned& num_candidates,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tinterval_pointer source_interval)\t//up to two candidates\r\n{\r\n\tdouble edge_length = edge->length();\r\n\tdouble local_epsilon = SMALLEST_INTERVAL_RATIO * edge_length;\r\n\t\t\r\n\t\t//kill very small intervals in order to avoid precision problems\r\n\tif(num_candidates == 2)\t\t\r\n\t{\r\n\t\tdouble start = std::min(candidates->start(), (candidates+1)->start());\r\n\t\tdouble stop = std::max(candidates->stop(), (candidates+1)->stop());\r\n\t\tif(candidates->stop()-candidates->start() < local_epsilon) // kill interval 0\r\n\t\t{\r\n\t\t\t*candidates = *(candidates+1);\r\n\t\t\tnum_candidates = 1;\r\n\t\t\tcandidates->start() = start;\r\n\t\t\tcandidates->stop() = stop;\r\n\t\t}\r\n\t\telse if ((candidates+1)->stop() - (candidates+1)->start() < local_epsilon)\r\n\t\t{\r\n\t\t\tnum_candidates = 1;\r\n\t\t\tcandidates->start() = start;\r\n\t\t\tcandidates->stop() = stop;\r\n\t\t}\r\n\t}\r\n\r\n\tIntervalWithStop* first; \r\n\tIntervalWithStop* second; \r\n\tif(num_candidates == 1)\r\n\t{\r\n\t\tfirst = candidates;\r\n\t\tsecond = candidates;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tif(candidates->start() <= (candidates+1)->start())\r\n\t\t{\r\n\t\t\tfirst = candidates;\r\n\t\t\tsecond = candidates+1;\r\n\t\t}\r\n\t\telse \r\n\t\t{\r\n\t\t\tfirst = candidates+1;\r\n\t\t\tsecond = candidates;\r\n\t\t}\r\n\t\tassert(first->stop() == second->start());\r\n\t}\r\n\r\n\tif(first->start() < local_epsilon)\r\n\t{\r\n\t\tfirst->start() = 0.0;\r\n\t}\r\n\tif(edge_length - second->stop() < local_epsilon)\r\n\t{\r\n\t\tsecond->stop() = edge_length;\r\n\t}\r\n\r\n\t\t//invert intervals if necessary; fill missing data and set pointers correctly\r\n\tInterval::DirectionType direction = edge->adjacent_faces()[0]->id() == face->id() ? \r\n\t\t\t\t\t\t\t\t\t\tInterval::FROM_FACE_0 : \r\n\t\t\t\t\t\t\t\t\t\tInterval::FROM_FACE_1;\r\n\r\n\tif(!invert)\t\t\t\t\t//in this case everything is straighforward, we do not have to invert the intervals\r\n\t{\r\n\t\tfor(unsigned i=0; i<num_candidates; ++i)\r\n\t\t{\r\n\t\t\tIntervalWithStop* p = candidates + i;\r\n\r\n\t\t\tp->next() = (i == num_candidates - 1) ? NULL : candidates + i + 1;\r\n\t\t\tp->edge() = edge;\r\n\t\t\tp->direction() = direction;\r\n\t\t\tp->source_index() = source_interval->source_index();\r\n\r\n\t\t\tp->min() = 0.0;\t\t\t\t\t//it will be changed later on\r\n\r\n\t\t\tassert(p->start() < p->stop());\r\n\t\t}\r\n\t}\r\n\telse\t\t\t\t//now we have to invert the intervals \r\n\t{\r\n\t\tfor(unsigned i=0; i<num_candidates; ++i)\r\n\t\t{\r\n\t\t\tIntervalWithStop* p = candidates + i;\r\n\r\n\t\t\tp->next() = (i == 0) ? NULL : candidates + i - 1;\r\n\t\t\tp->edge() = edge;\r\n\t\t\tp->direction() = direction;\r\n\t\t\tp->source_index() = source_interval->source_index();\r\n\r\n\t\t\tdouble length = edge_length;\r\n\t\t\tp->pseudo_x() = length - p->pseudo_x();\r\n\r\n\t\t\tdouble start = length - p->stop();\r\n\t\t\tp->stop() = length - p->start();\r\n\t\t\tp->start() = start;\r\n\r\n\t\t\tp->min() = 0;\r\n\r\n\t\t\tassert(p->start() < p->stop());\r\n\t\t\tassert(p->start() >= 0.0);\r\n\t\t\tassert(p->stop() <= edge->length());\r\n\t\t}\r\n\t}\r\n}\r\n\r\n\r\ninline unsigned GeodesicAlgorithmExact::best_source(SurfacePoint& point,\t\t\t//quickly find what source this point belongs to and what is the distance to this source\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t   double& best_source_distance)\r\n{\r\n\tdouble best_interval_position; \r\n\tunsigned best_source_index;\r\n\r\n\tbest_first_interval(point, \r\n\t\t\t\t\t\tbest_source_distance, \r\n\t\t\t\t\t\tbest_interval_position, \r\n\t\t\t\t\t\tbest_source_index);\r\n\t\r\n\treturn best_source_index;\r\n} \r\n\r\ninline interval_pointer GeodesicAlgorithmExact::best_first_interval(SurfacePoint& point, \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t double& best_total_distance, \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t double& best_interval_position, \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t unsigned& best_source_index)\r\n{\r\n\tassert(point.type() != UNDEFINED_POINT);\r\n\r\n\tinterval_pointer best_interval = NULL;\t\r\n\tbest_total_distance = GEODESIC_INF;\r\n\r\n\tif(point.type() == EDGE)\t\t\r\n\t{\r\n\t\tedge_pointer e = static_cast<edge_pointer>(point.base_element());\r\n\t\tlist_pointer list = interval_list(e);\r\n\r\n\t\tbest_interval_position = point.distance(e->v0());\r\n\t\tbest_interval = list->covering_interval(best_interval_position);\r\n\t\tif(best_interval)\r\n\t\t{\r\n\t\t\t//assert(best_interval && best_interval->d() < GEODESIC_INF);\r\n\t\t\tbest_total_distance = best_interval->signal(best_interval_position);\r\n\t\t\tbest_source_index = best_interval->source_index();\r\n\t\t}\r\n\t}\r\n\telse if(point.type() == FACE)\t\t\r\n\t{\r\n\t\tface_pointer f = static_cast<face_pointer>(point.base_element());\r\n\t\tfor(unsigned i=0; i<3; ++i)\r\n\t\t{\r\n\t\t\tedge_pointer e = f->adjacent_edges()[i];\r\n\t\t\tlist_pointer list = interval_list(e);\r\n\r\n\t\t\tdouble offset;\r\n\t\t\tdouble distance;\r\n\t\t\tinterval_pointer interval;\r\n\r\n\t\t\tlist->find_closest_point(&point, \r\n\t\t\t\t\t\t\t\t\t offset, \r\n\t\t\t\t\t\t\t\t\t distance, \r\n\t\t\t\t\t\t\t\t\t interval);\r\n\r\n\t\t\tif(interval && distance < best_total_distance)\r\n\t\t\t{\r\n\t\t\t\tbest_interval = interval;\r\n\t\t\t\tbest_total_distance = distance;\r\n\t\t\t\tbest_interval_position = offset;\r\n\t\t\t\tbest_source_index = interval->source_index();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t\t//check for all sources that might be located inside this face\r\n\t\tSortedSources::sorted_iterator_pair local_sources = m_sources.sources(f);\r\n\t\tfor(SortedSources::sorted_iterator it=local_sources.first; it != local_sources.second; ++it)\r\n\t\t{\r\n\t\t\tSurfacePointWithIndex* source = *it;\r\n\t\t\tdouble distance = point.distance(source);\r\n\t\t\tif(distance < best_total_distance)\r\n\t\t\t{\r\n\t\t\t\tbest_interval = NULL;\r\n\t\t\t\tbest_total_distance = distance;\r\n\t\t\t\tbest_interval_position = 0.0;\r\n\t\t\t\tbest_source_index = source->index();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\telse if(point.type() == VERTEX)\t\t\r\n\t{\r\n\t\tvertex_pointer v = static_cast<vertex_pointer>(point.base_element());\r\n\t\tfor(unsigned i=0; i<v->adjacent_edges().size(); ++i)\r\n\t\t{\r\n\t\t\tedge_pointer e = v->adjacent_edges()[i];\r\n\t\t\tlist_pointer list = interval_list(e);\r\n\t\t\t\r\n\t\t\tdouble position = e->v0()->id() == v->id() ? 0.0 : e->length();\r\n\t\t\tinterval_pointer interval = list->covering_interval(position);\r\n\t\t\tif(interval)\r\n\t\t\t{\r\n\t\t\t\tdouble distance = interval->signal(position);\r\n\r\n\t\t\t\tif(distance < best_total_distance)\r\n\t\t\t\t{\r\n\t\t\t\t\tbest_interval = interval;\r\n\t\t\t\t\tbest_total_distance = distance;\r\n\t\t\t\t\tbest_interval_position = position;\r\n\t\t\t\t\tbest_source_index = interval->source_index();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif(best_total_distance > m_propagation_distance_stopped)\t\t//result is unreliable\r\n\t{\r\n\t\tbest_total_distance = GEODESIC_INF;\r\n\t\treturn NULL;\r\n\t}\r\n\telse\r\n\t{\r\n\t\treturn best_interval;\r\n\t}\r\n}\r\n\r\ninline void GeodesicAlgorithmExact::trace_back(SurfacePoint& destination,\t\t//trace back piecewise-linear path\r\n\t\t\t\t\t\t\t\t\t\tstd::vector<SurfacePoint>& path)\r\n{\t\t\t\t\t\r\n\tpath.clear();\r\n\tdouble best_total_distance; \r\n\tdouble best_interval_position;\r\n\tunsigned source_index = std::numeric_limits<unsigned>::max();\r\n\tinterval_pointer best_interval = best_first_interval(destination, \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t best_total_distance, \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t best_interval_position, \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t source_index);\r\n\r\n\tif(best_total_distance >= GEODESIC_INF/2.0)\t\t//unable to find the right path\r\n\t{\r\n\t\treturn;\r\n\t}\r\n\r\n\tpath.push_back(destination);\r\n\r\n\tif(best_interval)\t//if we did not hit the face source immediately  \r\n\t{\r\n\t\tstd::vector<edge_pointer> possible_edges;\r\n\t\tpossible_edges.reserve(10);\r\n\t\r\n\t\twhile(visible_from_source(path.back()) < 0)\t\t//while this point is not in the direct visibility of some source (if we are inside the FACE, we obviously hit the source)\r\n\t\t{\r\n\t\t\tSurfacePoint& q = path.back();\r\n\r\n\t\t\tpossible_traceback_edges(q, possible_edges);\r\n\r\n\t\t\tinterval_pointer interval;\r\n\t\t\tdouble total_distance;\r\n\t\t\tdouble position;\r\n\r\n\t\t\tbest_point_on_the_edge_set(q, \r\n\t\t\t\t\t\t\t\t\t   possible_edges,\r\n\t\t\t\t\t\t\t\t\t   interval,\r\n\t\t\t\t\t\t\t\t\t   total_distance,\r\n\t\t\t\t\t\t\t\t\t   position);\r\n\r\n\t\t\t//std::cout << total_distance + length(path) << std::endl;\r\n\t\t\tassert(total_distance<GEODESIC_INF);\r\n\t\t\tsource_index = interval->source_index();\r\n\r\n\t\t\tedge_pointer e = interval->edge();\r\n\t\t\tdouble local_epsilon = SMALLEST_INTERVAL_RATIO*e->length();\r\n\t\t\tif(position < local_epsilon)\r\n\t\t\t{\r\n\t\t\t\tpath.push_back(SurfacePoint(e->v0()));\r\n\t\t\t}\r\n\t\t\telse if(position > e->length()-local_epsilon)\r\n\t\t\t{\r\n\t\t\t\tpath.push_back(SurfacePoint(e->v1()));\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tdouble normalized_position = position/e->length();\r\n\t\t\t\tpath.push_back(SurfacePoint(e, normalized_position));\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tSurfacePoint& source = static_cast<SurfacePoint&>(m_sources[source_index]);\r\n\tif(path.back().distance(&source) > 0)\r\n\t{\r\n\t\tpath.push_back(source);\r\n\t}\r\n}\r\n\r\ninline void GeodesicAlgorithmExact::print_statistics()\r\n{\r\n\tGeodesicAlgorithmBase::print_statistics();\r\n\r\n\tunsigned interval_counter = 0;\r\n\tfor(unsigned i=0; i<m_edge_interval_lists.size(); ++i)\r\n\t{\r\n\t\tinterval_counter += m_edge_interval_lists[i].number_of_intervals();\r\n\t}\r\n\tdouble intervals_per_edge = (double)interval_counter/(double)m_edge_interval_lists.size();\r\n\r\n\tdouble memory = m_edge_interval_lists.size()*sizeof(IntervalList) + \r\n\t\t\t\t\tinterval_counter*sizeof(Interval);\r\n\r\n\tstd::cout << \"uses about \" << memory/1e6 << \"Mb of memory\" <<std::endl;\r\n\tstd::cout << interval_counter << \" total intervals, or \" \r\n\t\t\t  << intervals_per_edge << \" intervals per edge\"\r\n\t\t\t  << std::endl;\r\n\tstd::cout << \"maximum interval queue size is \" << m_queue_max_size << std::endl;\r\n\tstd::cout << \"number of interval propagations is \" << m_iterations << std::endl;\r\n}\r\n\r\n}\t\t//geodesic\r\n\r\n#endif //GEODESIC_ALGORITHM_EXACT_20071231\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/base/geodesic/geodesic_algorithm_exact_elements.h",
    "content": "//Copyright (C) 2008 Danil Kirsanov, MIT License\r\n#ifndef GEODESIC_ALGORITHM_EXACT_ELEMENTS_20071231\r\n#define GEODESIC_ALGORITHM_EXACT_ELEMENTS_20071231\r\n\r\n#include \"geodesic_memory.h\"\r\n#include \"geodesic_mesh_elements.h\"\r\n#include <vector>\r\n#include <cmath>\r\n#include <assert.h>\r\n#include <algorithm>\r\n\r\nnamespace geodesic{\r\n\r\nclass Interval;\r\nclass IntervalList;\r\ntypedef Interval* interval_pointer;\r\ntypedef IntervalList* list_pointer;\r\n\r\nclass Interval\t\t\t\t\t\t//interval of the edge\r\n{\r\npublic:\r\n\t\r\n\tInterval(){};\r\n\t~Interval(){};\r\n\r\n\tenum DirectionType\r\n    {\r\n        FROM_FACE_0,\r\n\t\tFROM_FACE_1,\r\n\t\tFROM_SOURCE,\r\n\t\tUNDEFINED_DIRECTION\r\n    };\r\n\r\n\tdouble signal(double x)\t\t//geodesic distance function at point x\r\n\t{\r\n\t\tassert(x>=0.0 && x <= m_edge->length());\r\n\r\n\t\tif(m_d == GEODESIC_INF)\r\n\t\t{\r\n\t\t\treturn GEODESIC_INF;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tdouble dx = x - m_pseudo_x;\r\n\t\t\tif(m_pseudo_y == 0.0)\r\n\t\t\t{\r\n\t\t\t\treturn m_d + std::abs(dx);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\treturn m_d + sqrt(dx*dx + m_pseudo_y*m_pseudo_y);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tdouble max_distance(double end)\t\r\n\t{\r\n\t\tif(m_d == GEODESIC_INF)\r\n\t\t{\r\n\t\t\treturn GEODESIC_INF;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tdouble a = std::abs(m_start - m_pseudo_x);\r\n\t\t\tdouble b = std::abs(end - m_pseudo_x);\r\n\r\n\t\t\treturn a > b ? m_d + sqrt(a*a + m_pseudo_y*m_pseudo_y): \r\n\t\t\t\t\t\t   m_d + sqrt(b*b + m_pseudo_y*m_pseudo_y);\r\n\t\t}\r\n\t}\r\n\r\n\tvoid compute_min_distance(double stop)\t\t\t//compute min, given c,d theta, start, end.\r\n\t{\r\n\t\tassert(stop > m_start);\r\n\r\n\t\tif(m_d == GEODESIC_INF)\r\n\t\t{\r\n\t\t\tm_min = GEODESIC_INF;\r\n\t\t}\r\n\t\telse if(m_start > m_pseudo_x)\r\n\t\t{\r\n\t\t\tm_min = signal(m_start);\r\n\t\t}\r\n\t\telse if(stop < m_pseudo_x)\r\n\t\t{\r\n\t\t\tm_min = signal(stop);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tassert(m_pseudo_y<=0);\r\n\t\t\tm_min = m_d - m_pseudo_y;\r\n\t\t} \r\n\t}\r\n\t\t\t//compare two intervals in the queue\r\n\tbool operator()(interval_pointer const x, interval_pointer const y) const\r\n\t{\r\n\t\tif(x->min() != y->min())\r\n\t\t{\r\n\t\t\treturn x->min() < y->min();\r\n\t\t}\r\n\t\telse if(x->start() != y->start())\r\n\t\t{\r\n\t\t\treturn x->start() < y->start();\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\treturn x->edge()->id() < y->edge()->id();\r\n\t\t}\r\n\t}\r\n\r\n\tdouble stop()\t\t//return the endpoint of the interval\r\n\t{\r\n\t\treturn m_next ? m_next->start() : m_edge->length();\r\n\t}\t\t\r\n\r\n\tdouble hypotenuse(double a, double b)\r\n\t{\r\n\t\treturn sqrt(a*a + b*b);\r\n\t}\r\n\r\n\tvoid find_closest_point(double const x, \r\n\t\t\t\t\t\t    double const y,\r\n\t\t\t\t\t\t    double& offset, \r\n\t\t\t\t\t\t    double& distance);\t\t\t//find the point on the interval that is closest to the point (alpha, s)\r\n\r\n\tdouble& start(){return m_start;}; \r\n\tdouble& d(){return m_d;};\r\n\tdouble& pseudo_x(){return m_pseudo_x;};\r\n\tdouble& pseudo_y(){return m_pseudo_y;};\r\n\tdouble& min(){return m_min;};\r\n\tinterval_pointer& next(){return m_next;};\r\n\tedge_pointer& edge(){return m_edge;};\r\n\tDirectionType& direction(){return m_direction;};\r\n\tbool visible_from_source(){return m_direction == FROM_SOURCE;};\r\n\tunsigned& source_index(){return m_source_index;};\r\n\r\n\tvoid initialize(edge_pointer edge, \r\n\t\t\t\t\tSurfacePoint* point = NULL, \r\n\t\t\t\t\tunsigned source_index = 0);\r\n\r\nprotected:\r\n\tdouble m_start;\t\t\t\t\t\t//initial point of the interval on the edge\r\n\tdouble m_d;\t\t\t\t\t\t\t//distance from the source to the pseudo-source\r\n\tdouble m_pseudo_x;\t\t\t\t\t//coordinates of the pseudo-source in the local coordinate system\r\n\tdouble m_pseudo_y;\t\t\t\t\t//y-coordinate should be always negative\r\n\tdouble m_min;\t\t\t\t\t\t//minimum distance on the interval\r\n\r\n\tinterval_pointer m_next;\t\t\t//pointer to the next interval in the list\t\r\n\tedge_pointer m_edge;\t\t\t\t//edge that the interval belongs to\r\n\tunsigned m_source_index;\t\t\t//the source it belongs to\r\n\tDirectionType m_direction;\t\t\t//where the interval is coming from\r\n};\r\n\r\nstruct IntervalWithStop : public Interval\r\n{\r\npublic:\r\n\tdouble& stop(){return m_stop;};\r\nprotected:\r\n\tdouble m_stop;\r\n};\r\n\r\nclass IntervalList\t\t\t\t\t\t//list of the of intervals of the given edge\r\n{\r\npublic:\r\n\tIntervalList(){m_first = NULL;};\t\r\n\t~IntervalList(){};\r\n\r\n\tvoid clear()\r\n\t{\r\n\t\tm_first = NULL;\r\n\t};\r\n\r\n\tvoid initialize(edge_pointer e)\r\n\t{\r\n\t\tm_edge = e;\r\n\t\tm_first = NULL;\r\n\t};\r\n\r\n\tinterval_pointer covering_interval(double offset)\t\t\t//returns the interval that covers the offset\r\n\t{\r\n\t\tassert(offset >= 0.0 && offset <= m_edge->length());\r\n\r\n\t\tinterval_pointer p = m_first; \r\n\t\twhile(p && p->stop() < offset)\r\n\t\t{\r\n\t\t\tp = p->next();\r\n\t\t}\r\n\r\n\t\treturn p;// && p->start() <= offset ? p : NULL;\r\n\t};\r\n\r\n\tvoid find_closest_point(SurfacePoint* point, \r\n\t\t\t\t\t\t\tdouble& offset, \r\n\t\t\t\t\t\t\tdouble& distance, \r\n\t\t\t\t\t\t\tinterval_pointer& interval)\r\n\t{\r\n\t\tinterval_pointer p = m_first; \r\n\t\tdistance = GEODESIC_INF;\r\n\t\tinterval = NULL;\r\n\r\n\t\tdouble x,y;\r\n\t\tm_edge->local_coordinates(point, x, y);\r\n\r\n\t\twhile(p)\r\n\t\t{\r\n\t\t\tif(p->min()<GEODESIC_INF)\r\n\t\t\t{\r\n\t\t\t\tdouble o, d;\r\n\t\t\t\tp->find_closest_point(x, y, o, d);\r\n\t\t\t\tif(d < distance)\r\n\t\t\t\t{\r\n\t\t\t\t\tdistance = d;\r\n\t\t\t\t\toffset = o;\r\n\t\t\t\t\tinterval = p;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tp = p->next();\r\n\t\t}\r\n\t};\r\n\r\n\tunsigned number_of_intervals()\r\n\t{\r\n\t\tinterval_pointer p = m_first; \r\n\t\tunsigned count = 0;\r\n\t\twhile(p)\r\n\t\t{\r\n\t\t\t++count;\r\n\t\t\tp = p->next();\r\n\t\t}\r\n\t\treturn count;\r\n\t}\r\n\r\n\tinterval_pointer last()\r\n\t{\r\n\t\tinterval_pointer p = m_first; \r\n\t\tif(p)\r\n\t\t{\r\n\t\t\twhile(p->next())\r\n\t\t\t{\r\n\t\t\t\tp = p->next();\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn p;\r\n\t}\r\n\r\n\tdouble signal(double x)\r\n\t{\r\n\t\tinterval_pointer interval = covering_interval(x);\r\n\r\n\t\treturn interval ? interval->signal(x) : GEODESIC_INF;\r\n\t}\r\n\r\n\tinterval_pointer& first(){return m_first;};\r\n\tedge_pointer& edge(){return m_edge;};\r\nprivate:\r\n\tinterval_pointer m_first;\t\t\t//pointer to the first member of the list\r\n\tedge_pointer m_edge;\t\t\t\t//edge that owns this list\r\n};\r\n\r\nclass SurfacePointWithIndex : public SurfacePoint\r\n{\r\npublic:\r\n\tunsigned index(){return m_index;};\r\n\r\n\tvoid initialize(SurfacePoint& p, unsigned index)\r\n\t{\r\n\t\tSurfacePoint::initialize(p);\r\n\t\tm_index = index;\r\n\t} \r\n\r\n\tbool operator()(SurfacePointWithIndex* x, SurfacePointWithIndex* y) const //used for sorting\r\n\t{\r\n\t\tassert(x->type() != UNDEFINED_POINT && y->type() !=UNDEFINED_POINT);\r\n\r\n\t\tif(x->type() != y->type())\r\n\t\t{\r\n\t\t\treturn x->type() < y->type();\r\n\t\t}\r\n\t\telse \r\n\t\t{\r\n\t\t\treturn x->base_element()->id() < y->base_element()->id();\r\n\t\t}\r\n\t}\r\n\r\nprivate:\r\n\tunsigned m_index;\r\n}; \r\n\r\nclass SortedSources : public std::vector<SurfacePointWithIndex>\r\n{\r\nprivate: \r\n\ttypedef std::vector<SurfacePointWithIndex*> sorted_vector_type;\t\r\npublic:\r\n\ttypedef sorted_vector_type::iterator sorted_iterator;\r\n\ttypedef std::pair<sorted_iterator, sorted_iterator> sorted_iterator_pair;\r\n\r\n\tsorted_iterator_pair sources(base_pointer mesh_element)\r\n\t{\r\n\t\tm_search_dummy.base_element() = mesh_element;\r\n\r\n\t\treturn equal_range(m_sorted.begin(), \r\n\t\t\t\t\t\t   m_sorted.end(), \r\n\t\t\t\t\t\t   &m_search_dummy, \r\n\t\t\t\t\t\t   m_compare_less);\r\n\t}\r\n\r\n\tvoid initialize(std::vector<SurfacePoint>& sources)\t//we initialize the sources by copie\r\n\t{\r\n\t\tresize(sources.size());\r\n\t\tm_sorted.resize(sources.size());\r\n\t\tfor(unsigned i=0; i<sources.size(); ++i)\r\n\t\t{\r\n\t\t\tSurfacePointWithIndex& p = *(begin() + i);\r\n\r\n\t\t\tp.initialize(sources[i],i);\r\n\t\t\tm_sorted[i] = &p;\r\n\t\t}\r\n\r\n\t\tstd::sort(m_sorted.begin(), m_sorted.end(), m_compare_less);\r\n\t};\r\n\r\n\tSurfacePointWithIndex& operator[](unsigned i)\r\n\t{\r\n\t\tassert(i < size());\r\n\t\treturn *(begin() + i);\r\n\t}\r\n\r\nprivate:\r\n\tsorted_vector_type m_sorted;\r\n\tSurfacePointWithIndex m_search_dummy;\t\t//used as a search template\r\n\tSurfacePointWithIndex m_compare_less;\t\t\t//used as a compare functor\r\n};\r\n\r\n\r\ninline void Interval::find_closest_point(double const rs, \r\n\t\t\t\t\t\t\t\t\t\t double const hs,\r\n\t\t\t\t\t\t\t\t\t\t double& r, \r\n\t\t\t\t\t\t\t\t\t\t double& d_out)\t\t\t//find the point on the interval that is closest to the point (alpha, s)\r\n\t{\r\n\t\tif(m_d == GEODESIC_INF)\r\n\t\t{\r\n\t\t\tr = GEODESIC_INF;\r\n\t\t\td_out = GEODESIC_INF;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tdouble hc = -m_pseudo_y;\r\n\t\tdouble rc = m_pseudo_x;\r\n\t\tdouble end = stop();\r\n\r\n\t\tdouble local_epsilon = SMALLEST_INTERVAL_RATIO*m_edge->length();\r\n\t\tif(std::abs(hs+hc) < local_epsilon)\r\n\t\t{\r\n\t\t\tif(rs<=m_start)\r\n\t\t\t{\r\n\t\t\t\tr = m_start;\r\n\t\t\t\td_out = signal(m_start) + std::abs(rs - m_start);\r\n\t\t\t}\r\n\t\t\telse if(rs>=end)\r\n\t\t\t{\r\n\t\t\t\tr = end;\r\n\t\t\t\td_out = signal(end) + fabs(end - rs);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tr = rs;\r\n\t\t\t\td_out = signal(rs);\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tdouble ri = (rs*hc + hs*rc)/(hs+hc);\r\n\r\n\t\t\tif(ri<m_start)\r\n\t\t\t{\r\n\t\t\t\tr = m_start;\r\n\t\t\t\td_out = signal(m_start) + hypotenuse(m_start - rs, hs);\r\n\t\t\t}\r\n\t\t\telse if(ri>end)\r\n\t\t\t{\r\n\t\t\t\tr = end;\r\n\t\t\t\td_out = signal(end) + hypotenuse(end - rs, hs);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tr = ri;\r\n\t\t\t\td_out = m_d + hypotenuse(rc - rs, hc + hs);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\r\ninline void Interval::initialize(edge_pointer edge, \r\n\t\t\t\t\t\t\t\t SurfacePoint* source,\t\t\r\n\t\t\t\t\t\t\t\t unsigned source_index)\r\n{\r\n\tm_next = NULL;\r\n\t//m_geodesic_previous = NULL;\t\r\n\tm_direction = UNDEFINED_DIRECTION;\r\n\tm_edge = edge;\r\n\tm_source_index = source_index;\r\n\r\n\tm_start = 0.0;\r\n\t//m_stop = edge->length();\r\n\tif(!source)\r\n\t{\r\n\t\tm_d = GEODESIC_INF;\r\n\t\tm_min = GEODESIC_INF;\r\n\t\treturn;\r\n\t}\r\n\tm_d = 0;\r\n\r\n\tif(source->base_element()->type() == VERTEX)\r\n\t{\r\n\t\tif(source->base_element()->id() == edge->v0()->id())\r\n\t\t{\r\n\t\t\tm_pseudo_x = 0.0;\r\n\t\t\tm_pseudo_y = 0.0;\r\n\t\t\tm_min = 0.0;\r\n\t\t\treturn;\r\n\t\t}\r\n\t\telse if(source->base_element()->id() == edge->v1()->id())\r\n\t\t{\r\n\t\t\tm_pseudo_x = stop();\r\n\t\t\tm_pseudo_y = 0.0;\r\n\t\t\tm_min = 0.0;\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n\r\n\tedge->local_coordinates(source, m_pseudo_x, m_pseudo_y);\r\n\tm_pseudo_y = -m_pseudo_y;\r\n\r\n\tcompute_min_distance(stop());\r\n} \r\n\r\n}\t\t//geodesic\r\n\r\n#endif //GEODESIC_ALGORITHM_EXACT_ELEMENTS_20071231\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/base/geodesic/geodesic_algorithm_graph_base.h",
    "content": "#ifndef GEODESIC_ALGORITHM_GRAPH_BASE_010907\r\n#define GEODESIC_ALGORITHM_GRAPH_BASE_010907\r\n\r\n#include \"geodesic_algorithm_base.h\"\r\n#include \"geodesic_mesh_elements.h\"\r\n#include <vector>\r\n#include <set>\r\n#include <assert.h>\r\n\r\nnamespace geodesic{\r\n\r\ntemplate<class Node>\r\nclass GeodesicAlgorithmGraphBase: public GeodesicAlgorithmBase\r\n{\r\npublic:\r\n\ttypedef Node* node_pointer;\r\n\r\n\tGeodesicAlgorithmGraphBase(geodesic::Mesh* mesh = 0):\r\n\t\tGeodesicAlgorithmBase(mesh)\r\n\t{};\r\n\r\n\t~GeodesicAlgorithmGraphBase(){};\r\n\r\n\tvoid propagate(std::vector<SurfacePoint>& sources,\r\n   \t\t\t\t   double max_propagation_distance = GEODESIC_INF,\t\t\t//propagation algorithm stops after reaching the certain distance from the source\r\n\t\t\t\t   std::vector<SurfacePoint>* stop_points = NULL); //or after ensuring that all the stop_points are covered\r\n\r\n\tvoid trace_back(SurfacePoint& destination,\t\t//trace back piecewise-linear path\r\n\t\tstd::vector<SurfacePoint>& path);\r\n\r\n\tunsigned best_source(SurfacePoint& point,\t\t\t//quickly find what source this point belongs to and what is the distance to this source\r\n\t\t\t\t\t\t\tdouble& best_source_distance); \r\n\r\n\tvoid print_statistics()\r\n\t{\r\n\t\tGeodesicAlgorithmBase::print_statistics();\r\n\r\n\t\tdouble memory = m_nodes.size()*sizeof(Node);\r\n\t\tstd::cout << \"uses about \" << memory/1e6 << \"Mb of memory\" <<std::endl;\r\n\t}\r\n\r\nprotected:\r\n\tunsigned node_index(vertex_pointer v)\t\t//gives index of the node that corresponds to this vertex\r\n\t{\r\n\t\treturn v->id();\r\n\t};\r\n\r\n\tvoid set_sources(std::vector<SurfacePoint>& sources)\r\n\t{\r\n\t\tm_sources = sources;\r\n\t}\r\n\r\n\tnode_pointer best_first_node(SurfacePoint& point, double& best_total_distance)\r\n\t{\r\n\t\tnode_pointer best_node = NULL;\t\r\n\t\tif(point.type() == VERTEX)\t\t\r\n\t\t{\r\n\t\t\tvertex_pointer v = (vertex_pointer)point.base_element();\r\n\t\t\tbest_node = &m_nodes[node_index(v)];\r\n\t\t\tbest_total_distance = best_node->distance_from_source(); \r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tstd::vector<node_pointer> possible_nodes;\r\n\t\t\tlist_nodes_visible_from_source(point.base_element(), possible_nodes);\r\n\r\n\t\t\tbest_total_distance = GEODESIC_INF;\r\n\t\t\tfor(unsigned i=0; i<possible_nodes.size(); ++i)\r\n\t\t\t{\r\n\t\t\t\tnode_pointer node = possible_nodes[i];\r\n\r\n\t\t\t\tdouble distance_from_dest = node->distance(&point);\r\n\t\t\t\tif(node->distance_from_source() + distance_from_dest < best_total_distance)\r\n\t\t\t\t{\r\n\t\t\t\t\tbest_total_distance = node->distance_from_source() + distance_from_dest;\r\n\t\t\t\t\tbest_node = node;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t//assert(best_node);\r\n\t\t//assert(best_total_distance<GEODESIC_INF);\r\n\t\tif(best_total_distance > m_propagation_distance_stopped)\t\t//result is unreliable\r\n\t\t{\r\n\t\t\tbest_total_distance = GEODESIC_INF;\r\n\t\t\treturn NULL;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\treturn best_node;\r\n\t\t}\r\n\t};\t//quickly find what node will be the next one in geodesic path\r\n\r\n\tbool check_stop_conditions();\t\t//check when propagation should stop\r\n\r\n\tvirtual void list_nodes_visible_from_source(MeshElementBase* p, \r\n\t\t\t\t\t\t\t\t\t\t\t\tstd::vector<node_pointer>& storage) = 0;\t\t//list all nodes that belong to this mesh element\r\n\r\n\tvirtual void list_nodes_visible_from_node(node_pointer node,\t\t\t//list all nodes that belong to this mesh element\r\n\t\t\t\t\t\t\t\t\t\t\t  std::vector<node_pointer>& storage,\r\n\t\t\t\t\t\t\t\t\t\t\t  std::vector<double>& distances, \r\n\t\t\t\t\t\t\t\t\t\t\t  double threshold_distance) = 0;\t//list only the nodes whose current distance is larger than the threshold\r\n\r\n\tstd::vector<Node> m_nodes;\t//nodes of the graph \r\n\r\n\ttypedef std::set<node_pointer, Node> queue_type;\r\n\tqueue_type m_queue;\r\n\r\n\tstd::vector<SurfacePoint> m_sources;\t\t//for simplicity, we keep sources as they are\r\n};\r\n\r\ntemplate<class Node>\r\nvoid GeodesicAlgorithmGraphBase<Node>::propagate(std::vector<SurfacePoint>& sources,\r\n   \t\t\t\t\t\t\t\t\t\t\t\t double max_propagation_distance,\t\t\t//propagation algorithm stops after reaching the certain distance from the source\r\n\t\t\t\t\t\t\t\t\t\t\t\t std::vector<SurfacePoint>* stop_points) //or after ensuring that all the stop_points are covered\r\n{\r\n\tset_stop_conditions(stop_points, max_propagation_distance);\r\n\tset_sources(sources);\r\n\t\r\n\tm_queue.clear();\r\n\tm_propagation_distance_stopped = GEODESIC_INF;\r\n\tfor(unsigned i=0; i<m_nodes.size(); ++i)\r\n\t{\r\n\t\tm_nodes[i].clear();\r\n\t}\r\n\r\n\tclock_t start = clock();\r\n\r\n\tstd::vector<node_pointer> visible_nodes;\t\t//initialize vertices directly visible from sources\r\n\tfor(unsigned i=0; i<m_sources.size(); ++i)\r\n\t{\r\n\t\tSurfacePoint* source = &m_sources[i];\r\n\t\tlist_nodes_visible_from_source(source->base_element(), \r\n\t\t\t\t\t\t\t\t\t   visible_nodes);\t\t\t\r\n\r\n\t\tfor(unsigned j=0; j<visible_nodes.size(); ++j)\r\n\t\t{\r\n\t\t\tnode_pointer node = visible_nodes[j];\r\n\t\t\tdouble distance = node->distance(source);\r\n\t\t\tif(distance < node->distance_from_source())\r\n\t\t\t{\r\n\t\t\t\tnode->distance_from_source() = distance;\r\n\t\t\t\tnode->source_index() = i;\r\n\t\t\t\tnode->previous() = NULL;\r\n\t\t\t}\r\n\t\t}\r\n\t\tvisible_nodes.clear();\r\n\t}\r\n\r\n\tfor(unsigned i=0; i<m_nodes.size(); ++i)\t\t//initialize the queue\r\n\t{\r\n\t\tif(m_nodes[i].distance_from_source() < GEODESIC_INF)\r\n\t\t{\r\n\t\t\tm_queue.insert(&m_nodes[i]);\r\n\t\t}\r\n\t}\r\n\r\n\tunsigned counter = 0;\r\n\t\r\n\tstd::vector<double> distances_between_nodes;\r\n\twhile(!m_queue.empty())\t\t\t\t\t//main cycle\r\n\t{\r\n\t\tif(counter++ % 10 == 0)\t\t//check if we covered all required vertices\r\n\t\t{\r\n\t\t\tif (check_stop_conditions())\r\n\t\t\t{\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tnode_pointer min_node = *m_queue.begin();\r\n\t\tm_queue.erase(m_queue.begin());\r\n\t\tassert(min_node->distance_from_source() < GEODESIC_INF);\r\n\r\n\t\tvisible_nodes.clear();\r\n\t\tdistances_between_nodes.clear();\r\n\t\tlist_nodes_visible_from_node(min_node, \r\n\t\t\t\t\t\t\t\t\t visible_nodes, \r\n\t\t\t\t\t\t\t\t\t distances_between_nodes, \r\n\t\t\t\t\t\t\t\t\t min_node->distance_from_source());\r\n\r\n\t\tfor(unsigned i=0; i<visible_nodes.size(); ++i)\t\t//update all the adgecent vertices\r\n\t\t{\r\n\t\t\tnode_pointer next_node = visible_nodes[i];\r\n\r\n\t\t\tif(next_node->distance_from_source() > min_node->distance_from_source() +\r\n\t\t\t\t\t\t\t\t\t\t\t\t   distances_between_nodes[i])\r\n\t\t\t{\r\n\t\t\t\tif(next_node->distance_from_source() < GEODESIC_INF)\t\t//remove it from the queue\r\n\t\t\t\t{\r\n\t\t\t\t\ttypename queue_type::iterator iter = m_queue.find(next_node);\r\n\t\t\t\t\tassert(iter != m_queue.end());\r\n\t\t\t\t\tm_queue.erase(iter);\r\n\t\t\t\t}\r\n\t\t\t\tnext_node->distance_from_source() = min_node->distance_from_source() +\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tdistances_between_nodes[i];\r\n\t\t\t\tnext_node->source_index() = min_node->source_index();\r\n\t\t\t\tnext_node->previous() = min_node;\r\n\t\t\t\tm_queue.insert(next_node);\r\n\t\t\t}\r\n\t\t}\r\n\t} \r\n\r\n\tm_propagation_distance_stopped = m_queue.empty() ? GEODESIC_INF : (*m_queue.begin())->distance_from_source();\r\n\tclock_t finish = clock();\r\n\tm_time_consumed = (static_cast<double>(finish)-static_cast<double>(start))/CLOCKS_PER_SEC;\r\n\t//std::cout << std::endl;\r\n}\r\n\r\ntemplate<class Node>\r\ninline bool GeodesicAlgorithmGraphBase<Node>::check_stop_conditions()\r\n{\r\n\tdouble queue_min_distance = (*m_queue.begin())->distance_from_source();\r\n\r\n\tif(queue_min_distance > m_max_propagation_distance)\r\n\t{\r\n\t\treturn true;\r\n\t}\r\n\r\n\tfor (unsigned index = 0; index < m_stop_vertices.size(); ++index)\r\n\t{\r\n\t\tvertex_pointer v = m_stop_vertices[index].first;\r\n\t\tNode& node = m_nodes[node_index(v)];\r\n\t\tif(queue_min_distance > node.distance_from_source() + m_stop_vertices[index].second)\r\n\t\t{\r\n\t\t\treturn true;\r\n\t\t}\r\n\t}\r\n\treturn false;\r\n}\r\n\r\ntemplate<class Node>\r\ninline void GeodesicAlgorithmGraphBase<Node>::trace_back(SurfacePoint& destination,\t\t//trace back piecewise-linear path\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t std::vector<SurfacePoint>& path) \r\n{\r\n\tpath.clear();\r\n\r\n\tdouble total_path_length;\r\n\tnode_pointer node = best_first_node(destination, total_path_length);\r\n\r\n\tif(total_path_length>GEODESIC_INF/2.0)\t\t//unable to find the path\r\n\t{\r\n\t\treturn;\r\n\t}\r\n\r\n\tpath.push_back(destination);\r\n\r\n\tif(node->distance(&destination) > 1e-50)\r\n\t{\r\n\t\tpath.push_back(node->surface_point());\r\n\t}\r\n\r\n\twhile(node->previous())\t\t\t//follow the path\r\n\t{\r\n\t\tnode = node->previous();\r\n\t\tpath.push_back(node->surface_point());\r\n\t}\r\n\r\n\tSurfacePoint& source = m_sources[node->source_index()];\t\t//add source to the path if it is not already there\r\n\tif(node->distance(&source) > 1e-50)\r\n\t{\r\n\t\tpath.push_back(source);\r\n\t}\r\n}\r\n\r\n\r\ntemplate<class Node>\r\ninline unsigned GeodesicAlgorithmGraphBase<Node>::best_source(SurfacePoint& point,\t\t\t//quickly find what source this point belongs to and what is the distance to this source\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t double& best_source_distance)\r\n{\r\n\tnode_pointer node = best_first_node(point, best_source_distance);\r\n\treturn node ? node->source_index() : 0;\r\n};\r\n\r\n}\t\t//geodesic\r\n\r\n#endif //GEODESIC_ALGORITHM_GRAPH_BASE_010907\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/base/geodesic/geodesic_algorithm_subdivision.h",
    "content": "//Copyright (C) 2008 Danil Kirsanov, MIT License\r\n#ifndef GEODESIC_ALGORITHM_SUBDIVISION_122806\r\n#define GEODESIC_ALGORITHM_SUBDIVISION_122806\r\n\r\n#include \"geodesic_algorithm_graph_base.h\"\r\n#include \"geodesic_mesh_elements.h\"\r\n#include <vector>\r\n#include <set>\r\n#include <assert.h>\r\n\r\nnamespace geodesic{\r\n\r\nclass SubdivisionNode: public SurfacePoint\r\n{\r\n\ttypedef SubdivisionNode* node_pointer;\r\npublic: \r\n\tSubdivisionNode(){};\r\n\r\n\ttemplate <class Pointer>\r\n\tSubdivisionNode(Pointer p):\r\n\t\tSurfacePoint(p),\r\n\t\tm_previous(NULL),\r\n\t\tm_distance(0.0)\r\n\t{};\r\n\r\n\ttemplate <class Pointer, class Parameter>\r\n\tSubdivisionNode(Pointer p, Parameter param):\r\n\t\tSurfacePoint(p, param),\r\n\t\tm_previous(NULL),\r\n\t\tm_distance(0.0)\r\n\t{};\r\n\r\n\t~SubdivisionNode(){};\r\n\r\n\tdouble& distance_from_source(){return m_distance;};\r\n\tnode_pointer& previous(){return m_previous;};\r\n\tunsigned& source_index(){return m_source_index;};\r\n\r\n\tvoid clear()\r\n\t{\r\n\t\tm_distance = GEODESIC_INF;\r\n\t\tm_previous = NULL;\r\n\t}\r\n\r\n\tbool operator()(node_pointer const s1, node_pointer const s2) const\r\n\t{\r\n\t\tif(s1 == s2)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif(s1->distance_from_source() != s2->distance_from_source())\r\n\t\t{\r\n\t\t\treturn s1->distance_from_source() < s2->distance_from_source();\r\n\t\t}\r\n/*\t\tif(s1->type() != s2->type())\r\n\t\t{\r\n\t\t\treturn s1->type() < s2->type();\r\n\t\t}\r\n\t\tif(s1->base_element()->id() != s2->base_element()->id())\r\n\t\t{\r\n\t\t    return s1->base_element()->id() < s2->base_element()->id();\r\n\t\t} */\r\n\t\tif(s1->x() != s2->x())\t\t//two nodes cannot be located in the same space \r\n\t\t{\r\n\t\t\treturn s1->x() < s2->x();\r\n\t\t}\r\n\t\tif(s1->y() != s2->y())\t\t\r\n\t\t{\r\n\t\t\treturn s1->y() < s2->y();\r\n\t\t}\r\n\t\tif(s1->z() != s2->z())\t\t\r\n\t\t{\r\n\t\t\treturn s1->z() < s2->z();\r\n\t\t}\r\n\r\n\t\tassert(0);\r\n\t\treturn true;\r\n\t};\r\n\r\n\tSurfacePoint& surface_point(){return static_cast<SurfacePoint&>(*this);};\r\n\r\nprivate: \r\n\tdouble m_distance;\t\t\t\t\t//distance to the closest source\r\n\tunsigned m_source_index;\t\t\t//closest source index\r\n\tnode_pointer m_previous;\t\t\t//previous node in the geodesic path\r\n};\r\n\r\nclass GeodesicAlgorithmSubdivision: public GeodesicAlgorithmGraphBase<SubdivisionNode>\r\n{\r\n\ttypedef SubdivisionNode Node;\r\npublic:\r\n    GeodesicAlgorithmSubdivision() {}\r\n\tGeodesicAlgorithmSubdivision(geodesic::Mesh* mesh, \r\n\t\t\t\t\t\t\t\t unsigned subdivision_level):\r\n\t\tGeodesicAlgorithmGraphBase<Node>(mesh)\r\n\t{\r\n\t\tm_type = SUBDIVISION;\r\n\r\n\t\tm_nodes.reserve(mesh->vertices().size());\r\n\t\tfor(unsigned i=0; i<mesh->vertices().size(); ++i)\r\n\t\t{\r\n\t\t\tvertex_pointer v = &mesh->vertices()[i];\r\n\t\t\tm_nodes.push_back(Node(v));\t\t//!!\r\n\t\t}\r\n\r\n\t\tset_subdivision_level(subdivision_level);\r\n\t};\r\n\r\n\t~GeodesicAlgorithmSubdivision(){};\r\n\r\n\tunsigned subdivision_level(){return m_subdivision_level;};\r\n\r\n\tvoid set_subdivision_level(unsigned subdivision_level)\r\n\t{\r\n\t\tm_subdivision_level = subdivision_level;\r\n\r\n\t\tm_nodes.resize(m_mesh->vertices().size());\r\n\t\tm_nodes.reserve(m_mesh->vertices().size() + \r\n\t\t\t\t\t\tm_mesh->edges().size()*subdivision_level);\r\n\r\n\t\tfor(unsigned i=0; i<m_mesh->edges().size(); ++i)\r\n\t\t{\r\n\t\t\tedge_pointer e = &m_mesh->edges()[i];\r\n\t\t\tfor(unsigned i=0; i<subdivision_level; ++i)\r\n\t\t\t{\r\n\t\t\t\tdouble offset = (double)(i+1)/(double)(subdivision_level+1);\r\n\t\t\t\tm_nodes.push_back(Node(e, offset));\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\nprotected:\r\n\tvoid list_nodes_visible_from_source(MeshElementBase* p, \r\n\t\t\t\t\t\t\t\t\t\tstd::vector<node_pointer>& storage);\t\t//list all nodes that belong to this mesh element\r\n\r\n\tvoid list_nodes_visible_from_node(node_pointer node,\t\t\t//list all nodes that belong to this mesh element\r\n\t\t\t\t\t\t\t\t\t  std::vector<node_pointer>& storage,\r\n\t\t\t\t\t\t\t\t\t  std::vector<double>& distances, \r\n\t\t\t\t\t\t\t\t\t  double threshold_distance);\t//list only the nodes whose current distance is larger than the threshold\r\n\t\r\n\tunsigned node_indexx(edge_pointer e)\r\n\t{\r\n\t\treturn e->id()*m_subdivision_level + m_mesh->vertices().size();\r\n\t};\r\n\r\nprivate:\r\n\tvoid list_nodes(MeshElementBase* p,\t\t//list nodes that belong to this mesh element\r\n\t\t\t\t\tstd::vector<node_pointer>& storage,\r\n\t\t\t\t\tdouble threshold_distance = -1.0);\t\t\t\t//list only the nodes whose current distance is larger than the threshold\r\n\r\n\tunsigned m_subdivision_level;\t//when level is equal to 1, this algorithm corresponds to the Dijkstra algorithm\r\n};\r\n\r\ninline void GeodesicAlgorithmSubdivision::list_nodes(MeshElementBase* p,\r\n\t\t\t\t\t\t\t\t\t\t\t         std::vector<node_pointer>& storage,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t double threshold_distance)\r\n{\r\n\tassert(p->type() != UNDEFINED_POINT);\r\n\r\n\tif(p->type() == VERTEX)\r\n\t{\r\n\t\tvertex_pointer v = static_cast<vertex_pointer>(p);\r\n\t\tnode_pointer node = &m_nodes[node_index(v)];\r\n\t\tif(node->distance_from_source() > threshold_distance)\r\n\t\t{\r\n\t\t\tstorage.push_back(node);\r\n\t\t}\r\n\t}\r\n\telse if(p->type() == EDGE)\r\n\t{\r\n\t\tedge_pointer e = static_cast<edge_pointer>(p);\r\n\t\tunsigned node_index = node_indexx(e);\r\n\t\tfor(unsigned i=0; i<m_subdivision_level; ++i)\r\n\t\t{\r\n\t\t\tnode_pointer node = &m_nodes[node_index++];\r\n\t\t\tif(node->distance_from_source() > threshold_distance)\r\n\t\t\t{\r\n\t\t\t\tstorage.push_back(node);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t//FACE has no nodes\r\n}\r\n\r\ninline void GeodesicAlgorithmSubdivision::list_nodes_visible_from_source(MeshElementBase* p,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  std::vector<node_pointer>& storage)\r\n{\r\n\tassert(p->type() != UNDEFINED_POINT);\r\n\r\n\tif(p->type() == FACE)\r\n\t{\r\n\t\tface_pointer f = static_cast<face_pointer>(p);\r\n\t\tfor(unsigned i=0; i<3; ++i)\r\n\t\t{\r\n\t\t\tlist_nodes(f->adjacent_vertices()[i],storage);\r\n\t\t\tlist_nodes(f->adjacent_edges()[i],storage);\r\n\t\t}\r\n\t}\r\n\telse if(p->type() == EDGE)\r\n\t{\r\n\t\tlist_nodes(p,storage);\r\n\t\tlist_nodes(p->adjacent_vertices()[0],storage);\r\n\t\tlist_nodes(p->adjacent_vertices()[1],storage);\r\n\t}\r\n\telse\t\t\t//VERTEX\r\n\t{\r\n\t\tlist_nodes(p,storage);\r\n\t}\r\n}\r\n\r\ninline void GeodesicAlgorithmSubdivision::list_nodes_visible_from_node(node_pointer node, //list all nodes that belong to this mesh element\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstd::vector<node_pointer>& storage,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstd::vector<double>& distances,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdouble threshold_distance)\r\n{\r\n\tMeshElementBase* p = node->base_element();\r\n\tassert(p->type() != UNDEFINED_POINT);\r\n\tassert(storage.size() == distances.size());\r\n\r\n\tif(p->type() == VERTEX)\r\n\t{\r\n\t\tvertex_pointer v = static_cast<vertex_pointer>(p);\r\n\r\n\t\tfor(unsigned i=0; i<v->adjacent_edges().size(); ++i)\r\n\t\t{\r\n\t\t\tedge_pointer e = v->adjacent_edges()[i];\r\n\t\t\tvertex_pointer v_opposite = e->opposite_vertex(v);\r\n\t\t\tlist_nodes(e, storage, threshold_distance);\r\n\t\t\tlist_nodes(v_opposite, storage, threshold_distance);\r\n\t\t}\r\n\t\tfor(unsigned i=0; i<v->adjacent_faces().size(); ++i)\r\n\t\t{\r\n\t\t\tface_pointer f = v->adjacent_faces()[i];\r\n\t\t\tedge_pointer e = f->opposite_edge(v);\r\n\t\t\tlist_nodes(e, storage, threshold_distance);\r\n\t\t}\r\n\t}\r\n\telse if(p->type() == EDGE)\r\n\t{\r\n\t\tedge_pointer e = static_cast<edge_pointer>(p);\r\n\r\n\t\tvertex_pointer v0 = e->adjacent_vertices()[0];\r\n\t\tvertex_pointer v1 = e->adjacent_vertices()[1];\r\n\t\tlist_nodes(v0, storage, threshold_distance);\r\n\t\tlist_nodes(v1, storage, threshold_distance);\r\n\r\n\t\tfor(unsigned i=0; i<e->adjacent_faces().size(); ++i)\r\n\t\t{\r\n\t\t\tface_pointer f = e->adjacent_faces()[i];\r\n\r\n\t\t\tlist_nodes(f->next_edge(e,v0), storage, threshold_distance);\r\n\t\t\tlist_nodes(f->next_edge(e,v1), storage, threshold_distance);\r\n\t\t\tlist_nodes(f->opposite_vertex(e), storage, threshold_distance);\r\n\t\t}\r\n\t}\r\n\telse \r\n\t{\r\n\t\tassert(0);\r\n\t}\r\n\r\n\tunsigned index = distances.size();\r\n\tdistances.resize(storage.size());\r\n\tfor(; index<storage.size(); ++index)\r\n\t{\t\r\n\t\tdistances[index] = node->distance(&storage[index]->surface_point());\r\n\t}\r\n}\r\n\r\n}\t\t//geodesic\r\n\r\n#endif //GEODESIC_ALGORITHM_SUBDIVISION_122806\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/base/geodesic/geodesic_constants_and_simple_functions.h",
    "content": "//Copyright (C) 2008 Danil Kirsanov, MIT License\r\n#ifndef GEODESIC_CONSTANTS_20071231\r\n#define GEODESIC_CONSTANTS_20071231\r\n\r\n// some constants and simple math functions\r\n\r\n#include <assert.h>\r\n#include <math.h>\r\n#include <limits>\r\n#include <fstream>\r\n\r\nnamespace geodesic{\r\n\r\n#ifndef M_PI\r\n#define M_PI 3.14159265358979323846\r\n#endif\r\n\r\n//double const GEODESIC_INF = std::numeric_limits<double>::max();\r\ndouble const GEODESIC_INF = 1e100;\r\n\r\n//in order to avoid numerical problems with \"infinitely small\" intervals,\r\n//we drop all the intervals smaller than SMALLEST_INTERVAL_RATIO*edge_length\r\ndouble const SMALLEST_INTERVAL_RATIO = 1e-6;\t\t\r\n//double const SMALL_EPSILON = 1e-10;\r\n\r\n\r\ninline double cos_from_edges(double const a,\t\t\t//compute the cosine of the angle given the lengths of the edges\r\n\t\t\t\t\t\t\t double const b,\r\n\t\t\t\t\t\t\t double const c)\r\n{\r\n\tassert(a>1e-50);\r\n\tassert(b>1e-50);\r\n\tassert(c>1e-50);\r\n\r\n\tdouble result = (b*b + c*c - a*a)/(2.0*b*c);\r\n\tresult = std::max(result, -1.0);\r\n\treturn std::min(result, 1.0);\r\n}\r\n\r\ninline double angle_from_edges(double const a,\t\t\t//compute the cosine of the angle given the lengths of the edges\r\n\t\t\t\t\t\t\t   double const b,\r\n\t\t\t\t\t\t\t   double const c)\r\n{\r\n\treturn acos(cos_from_edges(a,b,c));\r\n}\r\n\r\ntemplate<class Points, class Faces>\r\ninline bool read_mesh_from_file(char* filename,\r\n\t\t\t\t\t\t\t\tPoints& points,\r\n\t\t\t\t\t\t\t\tFaces& faces)\r\n{\r\n\tstd::ifstream file(filename);\r\n\tassert(file.is_open());\r\n\tif(!file.is_open()) return false;\r\n\t\r\n\tunsigned num_points;\r\n\tfile >> num_points;\r\n\tassert(num_points>=3);\r\n\r\n\tunsigned num_faces;\r\n\tfile >> num_faces;\r\n\r\n\tpoints.resize(num_points*3);\r\n\tfor(typename Points::iterator i=points.begin(); i!=points.end(); ++i)\r\n\t{\r\n\t\tfile >> *i;\r\n\t}\r\n\r\n\tfaces.resize(num_faces*3);\r\n\tfor(typename Faces::iterator i=faces.begin(); i!=faces.end(); ++i)\r\n\t{\r\n\t\tfile >> *i;\r\n\t}\r\n\tfile.close();\r\n\r\n\treturn true;\r\n}\r\n\r\n} //geodesic\r\n\r\n#endif\t//GEODESIC_CONSTANTS_20071231\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/base/geodesic/geodesic_matlab_api.h",
    "content": "#ifndef GEODESIC_DLL_HEADER_HPP_234232\r\n#define GEODESIC_DLL_HEADER_HPP_234232\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\nlong new_mesh(long num_points,\t\t//creates new mesh\r\n\t\t\t\t\t\t\t\t  double* points,\t\r\n\t\t\t\t\t\t\t\t  long num_triangles,\r\n\t\t\t\t\t\t\t\t  long* triangles, \r\n\t\t\t\t\t\t\t\t  long* num_edges, \r\n\t\t\t\t\t\t\t\t  double** edges);\r\n\r\nlong new_algorithm(long mesh_id,\t//creates a geodesic algorithm for a given mesh\r\n\t\t\t\t\t\t               long type,\r\n\t\t\t\t\t\t\t\t\t   long subdivision);\r\n\r\nvoid delete_algorithm(long id);\r\n\r\nvoid delete_mesh(long id);\t\t\t//delete mesh and all associated algorithms\r\n\r\nvoid propagate(long algorithm_id,\t\t//compute distance field for given source points\r\n\t\t\t\t\t\t\t\t\tdouble* source_points,\t\r\n\t\t\t\t\t\t\t\t\tlong num_sources,\r\n\t\t\t\t\t\t\t\t\tdouble* stop_points,\t//limitations on distance field propagation\r\n\t\t\t\t\t\t\t\t\tlong num_stop_points,\r\n\t\t\t\t\t\t\t\t\tdouble max_propagation_distance);\r\n\r\nlong trace_back(long algorithm_id,\t\t//using procomputed distance field, compute a shortest path from destination to the closest source\r\n\t\t\t\t\t\t\t\t\tdouble* destination,\r\n\t\t\t\t\t\t\t\t\tdouble** path);\r\n\r\nlong distance_and_source(long algorithm_id,\t\t//quickly find what source this point belongs to and what is the distance to this source\r\n\t\t\t\t\t\t\t\t\t\t\t double* destination,\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t double* best_source_distance);\r\n\r\nlong distance_and_source_for_all_vertices(long algorithm_id,\t//same idea as in the previous function\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  double** distances,\t//list distance/source info for all vertices of the mesh\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  long** sources);\r\n\r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#endif\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/base/geodesic/geodesic_memory.h",
    "content": "//Copyright (C) 2008 Danil Kirsanov, MIT License\r\n#ifndef _GEODESIC_MEMORY_20071231\r\n#define _GEODESIC_MEMORY_20071231\r\n\r\n//two fast and simple memory allocators\r\n\r\n#include <vector>\r\n#include <assert.h>\r\n#include <math.h>\r\n\r\nnamespace geodesic{\r\n\r\ntemplate<class T>\t\t\t//quickly allocates multiple elements of a given type; no deallocation\r\nclass SimlpeMemoryAllocator\r\n{\r\npublic:\r\n\ttypedef T* pointer;\r\n\r\n\tSimlpeMemoryAllocator(unsigned block_size = 0, \r\n\t\t\t\t\t\t  unsigned max_number_of_blocks = 0)\r\n\t{\r\n\t\treset(block_size, \r\n\t\t\t  max_number_of_blocks);\r\n\t};\r\n\r\n\t~SimlpeMemoryAllocator(){};\r\n\r\n\tvoid reset(unsigned block_size, \r\n\t\t\t   unsigned max_number_of_blocks)\r\n\t{\r\n\t\tm_block_size = block_size;\r\n\t\tm_max_number_of_blocks = max_number_of_blocks;\r\n\r\n\r\n\t\tm_current_position = 0;\r\n\r\n\t\tm_storage.reserve(max_number_of_blocks);\r\n\t\tm_storage.resize(1);\r\n\t\tm_storage[0].resize(block_size);\r\n\t};\r\n\r\n\tpointer allocate(unsigned const n)\t\t//allocate n units\r\n\t{\r\n\t\tassert(n < m_block_size);\r\n\r\n\t\tif(m_current_position + n >= m_block_size)\r\n\t\t{\r\n\t\t\tm_storage.push_back( std::vector<T>() );\r\n\t\t\tm_storage.back().resize(m_block_size);\r\n\t\t\tm_current_position = 0;\r\n\t\t}\r\n\t\tpointer result = & m_storage.back()[m_current_position];\r\n\t\tm_current_position += n;\r\n\r\n\t\treturn result;\r\n\t};\r\nprivate:\r\n\tstd::vector<std::vector<T> > m_storage;\t\r\n\tunsigned m_block_size;\t\t\t\t//size of a single block\r\n\tunsigned m_max_number_of_blocks;\t\t//maximum allowed number of blocks\r\n\tunsigned m_current_position;\t\t\t//first unused element inside the current block\r\n};\r\n\r\n\r\ntemplate<class T>\t\t//quickly allocates and deallocates single elements of a given type\r\nclass MemoryAllocator\r\n{\r\npublic:\r\n\ttypedef T* pointer;\r\n\r\n\tMemoryAllocator(unsigned block_size = 1024, \r\n\t\t\t\t    unsigned max_number_of_blocks = 1024)\r\n\t{\r\n\t\treset(block_size, \r\n\t\t\t  max_number_of_blocks);\r\n\t};\r\n\r\n\t~MemoryAllocator(){};\r\n\r\n\tvoid clear()\r\n\t{\r\n\t\treset(m_block_size, \r\n\t\t\t  m_max_number_of_blocks);\r\n\t}\r\n\r\n\tvoid reset(unsigned block_size, \r\n\t\t\t   unsigned max_number_of_blocks)\r\n\t{\r\n\t\tm_block_size = block_size;\r\n\t\tm_max_number_of_blocks = max_number_of_blocks;\r\n\r\n\t\tassert(m_block_size > 0);\r\n\t\tassert(m_max_number_of_blocks > 0);\r\n\r\n\t\tm_current_position = 0;\r\n\r\n\t\tm_storage.reserve(max_number_of_blocks);\r\n\t\tm_storage.resize(1);\r\n\t\tm_storage[0].resize(block_size);\r\n\r\n\t\tm_deleted.clear();\r\n\t\tm_deleted.reserve(2*block_size);\r\n\t};\r\n\r\n\tpointer allocate()\t\t//allocates single unit of memory\r\n\t{\r\n\t\tpointer result;\r\n\t\tif(m_deleted.empty())\r\n\t\t{\r\n\t\t\tif(m_current_position + 1 >= m_block_size)\r\n\t\t\t{\r\n\t\t\t\tm_storage.push_back( std::vector<T>() );\r\n\t\t\t\tm_storage.back().resize(m_block_size);\r\n\t\t\t\tm_current_position = 0;\r\n\t\t\t}\r\n\t\t\tresult = & m_storage.back()[m_current_position];\r\n\t\t\t++m_current_position;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tresult = m_deleted.back();\r\n\t\t\tm_deleted.pop_back();\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t};\r\n\r\n\tvoid deallocate(pointer p)\t\t//allocate n units\r\n\t{\r\n\t\tif(m_deleted.size() < m_deleted.capacity())\r\n\t\t{\r\n\t\t\tm_deleted.push_back(p);\r\n\t\t}\r\n\t};\r\n\r\nprivate:\r\n\tstd::vector<std::vector<T> > m_storage;\r\n\tunsigned m_block_size;\t\t\t\t//size of a single block\r\n\tunsigned m_max_number_of_blocks;\t\t//maximum allowed number of blocks\r\n\tunsigned m_current_position;\t\t\t//first unused element inside the current block\r\n\r\n\tstd::vector<pointer> m_deleted;\t\t\t//pointers to deleted elemets\r\n};\r\n\r\n\r\nclass OutputBuffer\r\n{\r\npublic:\r\n\tOutputBuffer():\r\n\t\tm_num_bytes(0)\r\n\t{}\r\n\r\n\tvoid clear()\r\n\t{\r\n\t\tm_num_bytes = 0;\r\n\t\tm_buffer = std::auto_ptr<double>();\r\n\t}\r\n\r\n\ttemplate<class T>\r\n\tT* allocate(unsigned n)\r\n\t{\r\n\t\tdouble wanted = n*sizeof(T);\r\n\t\tif(wanted > m_num_bytes)\r\n\t\t{\r\n\t\t\tunsigned new_size = (unsigned) ceil(wanted / (double)sizeof(double));\r\n\t\t\tm_buffer = std::auto_ptr<double>(new double[new_size]);\r\n\t\t\tm_num_bytes = new_size*sizeof(double);\r\n\t\t}\r\n\r\n\t\treturn (T*)m_buffer.get();\r\n\t}\r\n\r\n\ttemplate <class T>\r\n\tT* get()\r\n\t{\r\n\t\treturn (T*)m_buffer.get();\r\n\t}\r\n\r\n\ttemplate<class T>\r\n\tunsigned capacity()\r\n\t{\r\n\t\treturn (unsigned)floor((double)m_num_bytes/(double)sizeof(T));\r\n\t};\r\n\r\nprivate:\r\n\r\n\tstd::auto_ptr<double> m_buffer;\r\n\tunsigned m_num_bytes;\r\n};\r\n\r\n\r\n} //geodesic\r\n\r\n#endif\t//_GEODESIC_MEMORY_20071231\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/base/geodesic/geodesic_mesh.h",
    "content": "//Copyright (C) 2008 Danil Kirsanov, MIT License\r\n#ifndef GEODESIC_MESH_20071231\r\n#define GEODESIC_MESH_20071231\r\n\r\n#include <cstddef>\r\n#include <vector>\r\n#include <cmath>\r\n#include <iostream>\r\n#include <algorithm>\r\n#include <fstream>\r\n\r\n#include \"geodesic_mesh_elements.h\"\r\n#include \"geodesic_memory.h\"\r\n#include \"geodesic_constants_and_simple_functions.h\"\r\n\r\nnamespace geodesic{\r\n\r\nstruct edge_visible_from_source\r\n{\r\n\tunsigned source;\r\n\tedge_pointer edge;\r\n};\r\n\r\nclass Mesh\r\n{\r\npublic:\r\n\tMesh()\r\n\t{};\r\n\r\n\t~Mesh(){};\r\n\r\n\ttemplate<class Points, class Faces>\r\n\tvoid initialize_mesh_data(unsigned num_vertices,\r\n\t\t\t\t\t\t\t  Points& p, \r\n\t\t\t\t\t\t\t  unsigned num_faces,\r\n\t\t\t\t\t\t\t  Faces& tri);\t\t//build mesh from regular point-triangle representation\r\n\r\n\ttemplate<class Points, class Faces>\r\n\tvoid initialize_mesh_data(Points& p, Faces& tri);\t\t//build mesh from regular point-triangle representation\r\n\r\n\tstd::vector<Vertex>& vertices(){return m_vertices;};\r\n\tstd::vector<Edge>& edges(){return m_edges;};\r\n\tstd::vector<Face>& faces(){return m_faces;};\r\n\r\n\tunsigned closest_vertices(SurfacePoint* p, \r\n\t\t\t\t\t\t\t\t std::vector<vertex_pointer>* storage = NULL);\t\t//list vertices closest to the point\r\n\r\nprivate:\r\n\r\n\tvoid build_adjacencies();\t\t//build internal structure of the mesh\r\n\tbool verify();\t\t\t\t\t//verifies connectivity of the mesh and prints some debug info\r\n\r\n\ttypedef void* void_pointer;\r\n\tvoid_pointer allocate_pointers(unsigned n) \r\n\t{\r\n\t\treturn m_pointer_allocator.allocate(n); \r\n\t}\r\n\r\n\tstd::vector<Vertex> m_vertices;\r\n\tstd::vector<Edge> m_edges;\r\n\tstd::vector<Face> m_faces;\r\n\r\n\tSimlpeMemoryAllocator<void_pointer> m_pointer_allocator;\t//fast memory allocating for Face/Vertex/Edge cross-references\r\n};\r\n\r\ninline unsigned Mesh::closest_vertices(SurfacePoint* p, \r\n\t\t\t\t\t\t\t\t\t\t  std::vector<vertex_pointer>* storage)\r\n{\r\n\tassert(p->type() != UNDEFINED_POINT);\r\n\r\n\tif(p->type() == VERTEX)\r\n\t{\r\n\t\tif(storage)\r\n\t\t{\r\n\t\t\tstorage->push_back(static_cast<vertex_pointer>(p->base_element()));\r\n\t\t}\r\n\t\treturn 1;\r\n\t}\r\n\telse if(p->type() == FACE)\r\n\t{\r\n\t\tif(storage)\r\n\t\t{\r\n\t\t\tvertex_pointer* vp= p->base_element()->adjacent_vertices().begin();\r\n\t\t\tstorage->push_back(*vp);\r\n\t\t\tstorage->push_back(*(vp+1));\r\n\t\t\tstorage->push_back(*(vp+2));\r\n\t\t}\r\n\t\treturn 2;\r\n\t}\r\n\telse if(p->type() == EDGE)\t\t//for edge include all 4 adjacent vertices\r\n\t{\r\n\t\tedge_pointer edge = static_cast<edge_pointer>(p->base_element());\r\n\r\n\t\tif(storage)\r\n\t\t{\r\n\t\t\tstorage->push_back(edge->adjacent_vertices()[0]);\r\n\t\t\tstorage->push_back(edge->adjacent_vertices()[1]);\r\n\r\n\t\t\tfor(unsigned i = 0; i < edge->adjacent_faces().size(); ++i)\r\n\t\t\t{\r\n\t\t\t\tface_pointer face = edge->adjacent_faces()[i];\r\n\t\t\t\tstorage->push_back(face->opposite_vertex(edge));\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn 2 + edge->adjacent_faces().size();\r\n\t}\r\n\r\n\tassert(0);\r\n\treturn 0;\r\n}\r\n\r\ntemplate<class Points, class Faces>\r\nvoid Mesh::initialize_mesh_data(Points& p, Faces& tri)\t\t//build mesh from regular point-triangle representation\r\n{\r\n\tassert(p.size() % 3 == 0);\r\n\tunsigned const num_vertices = p.size() / 3;\r\n\tassert(tri.size() % 3 == 0);\r\n\tunsigned const num_faces = tri.size() / 3; \r\n\r\n\tinitialize_mesh_data(num_vertices, p, num_faces, tri);\r\n}\r\n\r\ntemplate<class Points, class Faces>\r\nvoid Mesh::initialize_mesh_data(unsigned num_vertices,\r\n\t\t\t\t\t\t\t\tPoints& p, \r\n\t\t\t\t\t\t\t\tunsigned num_faces,\r\n\t\t\t\t\t\t\t\tFaces& tri)\r\n{\r\n\tunsigned const approximate_number_of_internal_pointers = (num_vertices + num_faces)*4;\r\n\tunsigned const max_number_of_pointer_blocks = 100; \r\n\tm_pointer_allocator.reset(approximate_number_of_internal_pointers, \r\n\t\t\t\t\t\t\t  max_number_of_pointer_blocks);\r\n\r\n\tm_vertices.resize(num_vertices);\r\n\tfor(unsigned i=0; i<num_vertices; ++i)\t\t//copy coordinates to vertices\r\n\t{\r\n\t\tVertex& v = m_vertices[i];\r\n\t\tv.id() = i;\r\n\r\n\t\tunsigned shift = 3*i;\r\n\t\tv.x() = p[shift];\r\n\t\tv.y() = p[shift + 1];\r\n\t\tv.z() = p[shift + 2];\r\n\t}\r\n\r\n\tm_faces.resize(num_faces);\r\n\tfor(unsigned i=0; i<num_faces; ++i)\t\t//copy adjacent vertices to polygons/faces\r\n\t{\r\n\t\tFace& f = m_faces[i];\r\n\t\tf.id() = i;\r\n\t\tf.adjacent_vertices().set_allocation(allocate_pointers(3),3);\t//allocate three units of memory\r\n\r\n\t\tunsigned shift = 3*i;\r\n\t\tfor(unsigned j=0; j<3; ++j)\r\n\t\t{\r\n\t\t\tunsigned vertex_index = tri[shift + j];\r\n\t\t\tassert(vertex_index < num_vertices);\r\n\t\t\tf.adjacent_vertices()[j] = &m_vertices[vertex_index];\r\n\t\t}\r\n\t}\r\n\r\n\tbuild_adjacencies();\t//build the structure of the mesh\r\n}\r\n\r\ninline void Mesh::build_adjacencies()\r\n{\r\n\t//\t\tVertex->adjacent Faces\r\n\tstd::vector<unsigned> count(m_vertices.size());\t//count adjacent vertices\r\n\tfor(unsigned i=0; i<m_faces.size(); ++i)\r\n\t{\r\n\t\tFace& f = m_faces[i];\r\n\t\tfor(unsigned j=0; j<3; ++j)\r\n\t\t{\r\n\t\t\tunsigned vertex_id = f.adjacent_vertices()[j]->id();\r\n\t\t\tassert(vertex_id < m_vertices.size());\r\n\t\t\tcount[vertex_id]++;\r\n\t\t}\r\n\t}\r\n\r\n\tfor(unsigned i=0; i<m_vertices.size(); ++i)\t\t//reserve space\r\n\t{\r\n\t\tVertex& v = m_vertices[i];\r\n\t\tunsigned num_adjacent_faces = count[i];\r\n\r\n\t\tv.adjacent_faces().set_allocation(allocate_pointers(num_adjacent_faces),\t\t//allocate three units of memory\r\n\t\t\t\t\t\t\t\t\t\t  num_adjacent_faces);\t\r\n\t}\r\n\r\n\tstd::fill(count.begin(), count.end(), 0);\r\n\tfor(unsigned i=0; i<m_faces.size(); ++i)\r\n\t{\r\n\t\tFace& f = m_faces[i];\r\n\t\tfor(unsigned j=0; j<3; ++j)\r\n\t\t{\r\n\t\t\tvertex_pointer v = f.adjacent_vertices()[j];\r\n\t\t\tv->adjacent_faces()[count[v->id()]++] = &f;\r\n\t\t}\r\n\t}\r\n\r\n\t//find all edges\r\n\t//i.e. find all half-edges, sort and combine them into edges\r\n\tstd::vector<HalfEdge> half_edges(m_faces.size()*3);\r\n\tunsigned k = 0;\r\n\tfor(unsigned i=0; i<m_faces.size(); ++i)\r\n\t{\r\n\t\tFace& f = m_faces[i];\r\n\t\tfor(unsigned j=0; j<3; ++j)\r\n\t\t{\r\n\t\t\thalf_edges[k].face_id = i;\r\n\t\t\tunsigned vertex_id_1 = f.adjacent_vertices()[j]->id();\r\n\t\t\tunsigned vertex_id_2 = f.adjacent_vertices()[(j+1) % 3]->id();\r\n\t\t\thalf_edges[k].vertex_0 = std::min(vertex_id_1, vertex_id_2);\r\n\t\t\thalf_edges[k].vertex_1 = std::max(vertex_id_1, vertex_id_2);\r\n\r\n\t\t\tk++;\t\r\n\t\t}\r\n\t}\r\n\tstd::sort(half_edges.begin(), half_edges.end());\r\n\r\n\tunsigned number_of_edges = 1;\r\n\tfor(unsigned i=1; i<half_edges.size(); ++i)\r\n\t{\r\n\t\tif(half_edges[i] != half_edges[i-1])\r\n\t\t{\r\n\t\t\t++number_of_edges;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tif(i<half_edges.size()-1)\t\t//sanity check: there should be at most two equal half-edges\r\n\t\t\t{\t\t\t\t\t\t\t\t//if it fails, most likely the input data are messed up\r\n\t\t\t\tassert(half_edges[i] != half_edges[i+1]);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t//\t\tEdges->adjacent Vertices and Faces\r\n\tm_edges.resize(number_of_edges);\r\n\tunsigned edge_id = 0;\r\n\tfor(unsigned i=0; i<half_edges.size();)\r\n\t{\r\n\t\tEdge& e = m_edges[edge_id];\r\n\t\te.id() = edge_id++;\r\n\r\n\t\te.adjacent_vertices().set_allocation(allocate_pointers(2),2);\t\t//allocate two units of memory\r\n\r\n\t\te.adjacent_vertices()[0] = &m_vertices[half_edges[i].vertex_0];\r\n\t\te.adjacent_vertices()[1] = &m_vertices[half_edges[i].vertex_1];\r\n\r\n\t\te.length() = e.adjacent_vertices()[0]->distance(e.adjacent_vertices()[1]);\r\n\t\tassert(e.length() > 1e-100);\t\t//algorithm works well with non-degenerate meshes only \r\n\r\n\t\tif(i != half_edges.size()-1 && half_edges[i] == half_edges[i+1])\t//double edge\r\n\t\t{\r\n\t\t\te.adjacent_faces().set_allocation(allocate_pointers(2),2);\r\n\t\t\te.adjacent_faces()[0] = &m_faces[half_edges[i].face_id];\r\n\t\t\te.adjacent_faces()[1] = &m_faces[half_edges[i+1].face_id];\r\n\t\t\ti += 2;\r\n\t\t}\r\n\t\telse\t\t\t//single edge\r\n\t\t{\r\n\t\t\te.adjacent_faces().set_allocation(allocate_pointers(1),1);\t\t//one adjucent faces\r\n\t\t\te.adjacent_faces()[0] = &m_faces[half_edges[i].face_id];\r\n\t\t\ti += 1;\r\n\t\t}\r\n\t}\r\n\r\n\t//\t\t\tVertices->adjacent Edges\r\n\tstd::fill(count.begin(), count.end(), 0);\r\n\tfor(unsigned i=0; i<m_edges.size(); ++i)\r\n\t{\r\n\t\tEdge& e = m_edges[i];\r\n\t\tassert(e.adjacent_vertices().size()==2);\r\n\t\tcount[e.adjacent_vertices()[0]->id()]++;\r\n\t\tcount[e.adjacent_vertices()[1]->id()]++;\r\n\t}\r\n\tfor(unsigned i=0; i<m_vertices.size(); ++i)\r\n\t{\r\n\t\tm_vertices[i].adjacent_edges().set_allocation(allocate_pointers(count[i]),\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t  count[i]);\t\r\n\t}\r\n\tstd::fill(count.begin(), count.end(), 0);\r\n\tfor(unsigned i=0; i<m_edges.size(); ++i)\r\n\t{\r\n\t\tEdge& e = m_edges[i];\r\n\t\tfor(unsigned j=0; j<2; ++j)\r\n\t\t{\r\n\t\t\tvertex_pointer v = e.adjacent_vertices()[j];\r\n\t\t\tv->adjacent_edges()[count[v->id()]++] = &e;\r\n\t\t}\r\n\t}\t\r\n\r\n\t//\t\t\tFaces->adjacent Edges\r\n\tfor(unsigned i=0; i<m_faces.size(); ++i)\r\n\t{\r\n\t\tm_faces[i].adjacent_edges().set_allocation(allocate_pointers(3),3);\t\r\n\t}\r\n\r\n\tcount.resize(m_faces.size());\r\n\tstd::fill(count.begin(), count.end(), 0);\r\n\tfor(unsigned i=0; i<m_edges.size(); ++i)\r\n\t{\r\n\t\tEdge& e = m_edges[i];\r\n\t\tfor(unsigned j=0; j<e.adjacent_faces().size(); ++j)\r\n\t\t{\r\n\t\t\tface_pointer f = e.adjacent_faces()[j];\r\n\t\t\tassert(count[f->id()]<3);\r\n\t\t\tf->adjacent_edges()[count[f->id()]++] = &e;\r\n\t\t}\r\n\t}\t\r\n\r\n\t\t//compute angles for the faces\r\n\tfor(unsigned i=0; i<m_faces.size(); ++i)\r\n\t{\r\n\t\tFace& f = m_faces[i];\r\n\t\tdouble abc[3];\t\t\r\n\t\tdouble sum = 0;\r\n\t\tfor(unsigned j=0; j<3; ++j)\t\t//compute angle adjacent to the vertex j\r\n\t\t{\r\n\t\t\tfor(unsigned k=0; k<3; ++k)\r\n\t\t\t{\r\n\t\t\t\tvertex_pointer v = f.adjacent_vertices()[(j + k)%3];\r\n\t\t\t\tabc[k] = f.opposite_edge(v)->length();\r\n\t\t\t}\r\n\r\n\t\t\tdouble angle = angle_from_edges(abc[0], abc[1], abc[2]);\r\n\t\t\tassert(angle>1e-5);\t\t\t\t\t\t//algorithm works well with non-degenerate meshes only \r\n\r\n\t\t\tf.corner_angles()[j] = angle;\r\n\t\t\tsum += angle;\r\n\t\t}\r\n\t\tassert(std::abs(sum - M_PI) < 1e-5);\t\t//algorithm works well with non-degenerate meshes only \r\n\t}\r\n\r\n\t\t//define m_turn_around_flag for vertices\r\n\tstd::vector<double> total_vertex_angle(m_vertices.size());\r\n\tfor(unsigned i=0; i<m_faces.size(); ++i)\r\n\t{\r\n\t\tFace& f = m_faces[i];\r\n\t\tfor(unsigned j=0; j<3; ++j)\r\n\t\t{\r\n\t\t\tvertex_pointer v = f.adjacent_vertices()[j];\r\n\t\t\ttotal_vertex_angle[v->id()] += f.corner_angles()[j];\r\n\t\t}\r\n\t}\r\n\r\n\tfor(unsigned i=0; i<m_vertices.size(); ++i)\r\n\t{\r\n\t\tVertex& v = m_vertices[i];\r\n\t\tv.saddle_or_boundary() = (total_vertex_angle[v.id()] > 2.0*M_PI - 1e-5); \r\n\t}\r\n\r\n\tfor(unsigned i=0; i<m_edges.size(); ++i)\r\n\t{\r\n\t\tEdge& e = m_edges[i];\r\n\t\tif(e.is_boundary())\r\n\t\t{\r\n\t\t\te.adjacent_vertices()[0]->saddle_or_boundary() = true;\r\n\t\t\te.adjacent_vertices()[1]->saddle_or_boundary() = true;\r\n\t\t}\r\n\t}\r\n\r\n\tif (!verify())\r\n        std::cout << \"something wrong detected by geodesic::Mesh::verify()\" << std::endl;\r\n}\r\n\r\ninline bool Mesh::verify()\t\t//verifies connectivity of the mesh and prints some debug info\r\n{\r\n\tstd::cout << std::endl;\r\n\t// make sure that all vertices are mentioned at least once. \r\n\t// though the loose vertex is not a bug, it most likely indicates that something is wrong with the mesh\r\n\tstd::vector<bool> map(m_vertices.size(), false);\r\n\tfor(unsigned i=0; i<m_edges.size(); ++i)\r\n\t{\r\n\t\tedge_pointer e = &m_edges[i];\r\n\t\tmap[e->adjacent_vertices()[0]->id()] = true;\r\n\t\tmap[e->adjacent_vertices()[1]->id()] = true;\r\n\t}\r\n\tif(std::find(map.begin(), map.end(), false) == map.end())\r\n        return false;\r\n\r\n\t//make sure that the mesh is connected trough its edges\r\n\t//if mesh has more than one connected component, it is most likely a bug\r\n\tstd::vector<face_pointer> stack(1,&m_faces[0]);\r\n\tstack.reserve(m_faces.size());\r\n\r\n\tmap.resize(m_faces.size());\r\n\tstd::fill(map.begin(), map.end(), false);\r\n\tmap[0] = true;\r\n\r\n\twhile(!stack.empty())\r\n\t{\r\n\t\tface_pointer f = stack.back();\r\n\t\tstack.pop_back();\r\n\r\n\t\tfor(unsigned i=0; i<3; ++i)\r\n\t\t{\r\n\t\t\tedge_pointer e = f->adjacent_edges()[i];\r\n\t\t\tface_pointer f_adjacent = e->opposite_face(f);\r\n\t\t\tif(f_adjacent && !map[f_adjacent->id()])\r\n\t\t\t{\r\n\t\t\t\tmap[f_adjacent->id()] = true;\r\n\t\t\t\tstack.push_back(f_adjacent);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tif (std::find(map.begin(), map.end(), false) == map.end())\r\n        return false;\r\n\r\n\t//print some mesh statistics that can be useful in debugging\r\n\tstd::cout << \"mesh has \"\t<< m_vertices.size() \r\n\t\t\t  << \" vertices, \"\t<< m_faces.size() \r\n\t\t\t  << \" faces, \"\t\t<< m_edges.size() \r\n\t\t\t  << \" edges\\n\";\r\n\t\r\n\tunsigned total_boundary_edges = 0;\r\n\tdouble longest_edge = 0;\r\n\tdouble shortest_edge = 1e100;\r\n\tfor(unsigned i=0; i<m_edges.size(); ++i)\r\n\t{\r\n\t\tEdge& e = m_edges[i];\r\n\t\ttotal_boundary_edges += e.is_boundary() ? 1 : 0;\r\n\t\tlongest_edge = std::max(longest_edge, e.length());\r\n\t\tshortest_edge = std::min(shortest_edge, e.length());\r\n\t}\r\n\tstd::cout << total_boundary_edges << \" edges are boundary edges\\n\";\r\n\tstd::cout << \"shortest/longest edges are \" \r\n\t\t\t  << shortest_edge << \"/\"\r\n\t\t\t  << longest_edge << \" = \"\r\n\t\t\t  << shortest_edge/longest_edge\r\n\t\t\t  << std::endl;\r\n\r\n\tdouble minx = 1e100;\r\n\tdouble maxx = -1e100;\r\n\tdouble miny = 1e100;\r\n\tdouble maxy = -1e100;\r\n\tdouble minz = 1e100;\r\n\tdouble maxz = -1e100;\r\n\tfor(unsigned i=0; i<m_vertices.size(); ++i)\r\n\t{\r\n\t\tVertex& v = m_vertices[i];\r\n\t\tminx = std::min(minx, v.x());\r\n\t\tmaxx = std::max(maxx, v.x());\r\n\t\tminy = std::min(miny, v.y());\r\n\t\tmaxy = std::max(maxy, v.y());\r\n\t\tminz = std::min(minz, v.z());\r\n\t\tmaxz = std::max(maxz, v.z());\r\n\t}\r\n\tstd::cout << \"enclosing XYZ box:\"\r\n\t\t\t  <<\" X[\" << minx << \",\" << maxx << \"]\"\r\n\t\t\t  <<\" Y[\" << miny << \",\" << maxy << \"]\"\r\n\t\t\t  <<\" Z[\" << minz << \",\" << maxz << \"]\"\r\n\t\t\t  << std::endl;\r\n\r\n\tdouble dx = maxx - minx;\r\n\tdouble dy = maxy - miny;\r\n\tdouble dz = maxz - minz;\r\n\tstd::cout << \"approximate diameter of the mesh is \"\r\n\t\t\t  << sqrt(dx*dx + dy*dy + dz*dz)\r\n\t\t\t  << std::endl;\r\n\r\n\tdouble min_angle = 1e100;\r\n\tdouble max_angle = -1e100;\r\n\tfor(unsigned i=0; i<m_faces.size(); ++i)\r\n\t{\r\n\t\tFace& f = m_faces[i];\r\n\t\tfor(unsigned j=0; j<3; ++j)\r\n\t\t{\r\n\t\t\tdouble angle = f.corner_angles()[j];\r\n\t\t\tmin_angle = std::min(min_angle, angle);\r\n\t\t\tmax_angle = std::max(max_angle, angle);\r\n\t\t}\r\n\t}\r\n\tstd::cout << \"min/max face angles are \"\r\n\t\t\t  << min_angle/M_PI*180.0 << \"/\"\r\n\t\t\t  << max_angle/M_PI*180.0\r\n\t\t\t  << \" degrees\\n\";\r\n\r\n\tstd::cout << std::endl;\r\n\treturn true;\r\n}\r\n\r\ninline void fill_surface_point_structure(geodesic::SurfacePoint* point, \r\n\t\t\t\t\t\t\t\t\t\t double* data, \r\n\t\t\t\t\t\t\t\t\t\t Mesh* mesh)\r\n{\r\n\tpoint->set(data);\r\n\tunsigned type = (unsigned) data[3];\r\n\tunsigned id = (unsigned) data[4];\r\n\t\r\n\r\n\tif(type == 0)\t\t//vertex\r\n\t{\r\n\t\tpoint->base_element() = &mesh->vertices()[id];\r\n\t}\r\n\telse if(type == 1)\t//edge\r\n\t{\r\n\t\tpoint->base_element() = &mesh->edges()[id];\r\n\t}\r\n\telse\t\t\t\t//face\r\n\t{\r\n\t\tpoint->base_element() = &mesh->faces()[id];\r\n\t}\r\n}\r\n\r\ninline void fill_surface_point_double(geodesic::SurfacePoint* point, \r\n\t\t\t\t\t\t\t\t\t  double* data, \r\n\t\t\t\t\t\t\t\t\t  long mesh_id)\r\n{\r\n\tdata[0] = point->x();\r\n\tdata[1] = point->y();\r\n\tdata[2] = point->z();\r\n\tdata[4] = point->base_element()->id();\r\n\r\n\tif(point->type() == VERTEX)\t\t//vertex\r\n\t{\r\n\t\tdata[3] = 0;\r\n\t}\r\n\telse if(point->type() == EDGE)\t//edge\r\n\t{\r\n\t\tdata[3] = 1;\r\n\t}\r\n\telse\t\t\t\t//face\r\n\t{\r\n\t\tdata[3] = 2;\r\n\t}\r\n}\r\n\r\n} //geodesic\r\n\r\n#endif\t\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/base/geodesic/geodesic_mesh_elements.h",
    "content": "//Copyright (C) 2008 Danil Kirsanov, MIT License\r\n#ifndef GEODESIC_MESH_ELEMENTS_20071231\r\n#define GEODESIC_MESH_ELEMENTS_20071231\r\n\r\n// here we define the building elements of the mesh: \r\n// 3D-points, vertices, edges, faces, and surface points\r\n\r\n#include <assert.h>\r\n#include <cstddef>\r\n\r\nnamespace geodesic{\r\n\r\nclass Vertex; \r\nclass Edge; \r\nclass Face; \r\nclass Mesh; \r\nclass MeshElementBase;\r\n\r\ntypedef Vertex* vertex_pointer;\r\ntypedef Edge* edge_pointer;\r\ntypedef Face* face_pointer;\r\ntypedef Mesh* mesh_pointer;\r\ntypedef MeshElementBase* base_pointer;\r\n\r\ntemplate <class Data>\t\t//simple vector that stores info about mesh references \r\nclass SimpleVector\t\t\t//for efficiency, it uses an outside memory allocator\r\n{\r\npublic:\r\n\tSimpleVector():\r\n\t  m_size(0),\r\n\t  m_begin(NULL)\r\n\t{};\r\n\r\n\ttypedef Data* iterator;\r\n\r\n\tunsigned size(){return m_size;};\r\n\titerator begin(){return m_begin;};\r\n\titerator end(){return m_begin + m_size;};\r\n\r\n\ttemplate<class DataPointer>\r\n\tvoid set_allocation(DataPointer begin, unsigned size)\r\n\t{\r\n\t\tassert(begin != NULL || size == 0);\r\n\t\tm_size = size;\r\n\t\tm_begin = (iterator)begin;\r\n\t}\r\n\r\n\tData& operator[](unsigned i)\r\n\t{\r\n\t\tassert(i < m_size);\r\n\t\treturn *(m_begin + i);\r\n\t}\r\n\r\n\tvoid clear()\r\n\t{\r\n\t\tm_size = 0;\r\n\t\tm_begin = NULL;\r\n\t}\r\n\r\nprivate:\r\n\tunsigned m_size;\r\n\tData* m_begin;\r\n};\r\n\r\nenum PointType\r\n{\r\n    VERTEX,\r\n    EDGE,\r\n    FACE,\r\n\tUNDEFINED_POINT\r\n};\r\n\r\nclass MeshElementBase\t//prototype of vertices, edges and faces\r\n{\r\npublic:\r\n\ttypedef SimpleVector<vertex_pointer> vertex_pointer_vector;\t\r\n\ttypedef SimpleVector<edge_pointer> edge_pointer_vector;\t\r\n\ttypedef SimpleVector<face_pointer> face_pointer_vector;\t\r\n\r\n\tMeshElementBase():\r\n\t\tm_id(0),\r\n\t\tm_type(UNDEFINED_POINT)\r\n\t{};\r\n\r\n\tvertex_pointer_vector& adjacent_vertices(){return m_adjacent_vertices;};\r\n\tedge_pointer_vector& adjacent_edges(){return m_adjacent_edges;};\r\n\tface_pointer_vector& adjacent_faces(){return m_adjacent_faces;};\r\n\r\n\tunsigned& id(){return m_id;}; \r\n\tPointType type() const {return m_type;};\r\n\r\nprotected:\r\n\tvertex_pointer_vector m_adjacent_vertices;\t\t//list of the adjacent vertices\r\n\tedge_pointer_vector m_adjacent_edges;\t\t\t//list of the adjacent edges\r\n\tface_pointer_vector m_adjacent_faces;\t\t\t//list of the adjacent faces\r\n\r\n\tunsigned m_id;\t\t\t\t\t\t\t//unique id\r\n\tPointType m_type;\t\t\t\t\t\t\t//vertex, edge or face\r\n};\r\n\r\nclass Point3D\t\t\t//point in 3D and corresponding operations\r\n{\r\npublic:\r\n\tPoint3D(){};\r\n\tPoint3D(Point3D* p)\r\n\t{\r\n\t\tx() = p->x();\r\n\t\ty() = p->y();\r\n\t\tz() = p->z();\r\n\t};\r\n\r\n\tdouble* xyz(){return m_coordinates;};\r\n\tdouble& x(){return *m_coordinates;};\r\n\tdouble& y(){return *(m_coordinates+1);};\r\n\tdouble& z(){return *(m_coordinates+2);};\r\n\r\n\tvoid set(double new_x, double new_y, double new_z)\r\n\t{\r\n\t\tx() = new_x;\r\n\t\ty() = new_y;\r\n\t\tz() = new_z;\r\n\t}\r\n\r\n\tvoid set(double* data)\r\n\t{\r\n\t\tx() = *data;\r\n\t\ty() = *(data+1);\r\n\t\tz() = *(data+2);\r\n\t}\r\n\r\n\tdouble distance(double* v)\r\n\t{\r\n\t\tdouble dx = m_coordinates[0] - v[0];\r\n\t\tdouble dy = m_coordinates[1] - v[1];\r\n\t\tdouble dz = m_coordinates[2] - v[2];\r\n\r\n\t\treturn sqrt(dx*dx + dy*dy + dz*dz);\r\n\t};\r\n\r\n    double distance(Point3D* v)\r\n\t{\r\n\t\treturn distance(v->xyz());\r\n\t};\r\n\r\n\tvoid add(Point3D* v)\r\n\t{\r\n\t\tx() += v->x();\r\n\t\ty() += v->y();\r\n\t\tz() += v->z();\r\n\t};\r\n\r\n\tvoid multiply(double v)\r\n\t{\r\n\t\tx() *= v;\r\n\t\ty() *= v;\r\n\t\tz() *= v;\r\n\t};\r\n\r\nprivate:\r\n\tdouble m_coordinates[3];\t\t\t\t\t//xyz\r\n};\r\n\r\nclass Vertex: public MeshElementBase, public Point3D\r\n{\r\npublic:\r\n\tVertex()\r\n\t{\r\n\t\tm_type = VERTEX;\r\n\t};\r\n\r\n\t~Vertex(){};\r\n\r\n\tbool& saddle_or_boundary(){return m_saddle_or_boundary;};\r\nprivate:\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t//this flag speeds up exact geodesic algorithm\r\n\tbool m_saddle_or_boundary;\t\t//it is true if total adjacent angle is larger than 2*PI or this vertex belongs to the mesh boundary\r\n};\r\n\r\n\r\nclass Face: public MeshElementBase\r\n{\r\npublic:\r\n\tFace()\r\n\t{\r\n\t\tm_type = FACE;\r\n\t};\r\n\r\n\t~Face(){};\r\n\r\n\tedge_pointer opposite_edge(vertex_pointer v);\r\n\tvertex_pointer opposite_vertex(edge_pointer e);\r\n\tedge_pointer next_edge(edge_pointer e, vertex_pointer v);\r\n\r\n\tdouble vertex_angle(vertex_pointer v)\r\n\t{\r\n\t\tfor(unsigned i=0; i<3; ++i)\r\n\t\t{\r\n\t\t\tif(adjacent_vertices()[i]->id() == v->id())\r\n\t\t\t{\r\n\t\t\t\treturn m_corner_angles[i];\r\n\t\t\t}\r\n\t\t}\r\n\t\tassert(0);\r\n\t\treturn 0;\r\n\t}\r\n\r\n\tdouble* corner_angles(){return m_corner_angles;};\r\n\r\nprivate:\r\n\tdouble m_corner_angles[3];\t\t//triangle angles in radians; angles correspond to vertices in m_adjacent_vertices\r\n};\r\n\r\nclass Edge: public MeshElementBase\r\n{\r\npublic:\r\n\tEdge()\r\n\t{\r\n\t\tm_type = EDGE;\r\n\t};\r\n\r\n\t~Edge(){};\r\n\r\n\tdouble& length(){return m_length;};\r\n\r\n\tface_pointer opposite_face(face_pointer f)\r\n\t{\r\n\t\tif(adjacent_faces().size() == 1)\r\n\t\t{\r\n\t\t\tassert(adjacent_faces()[0]->id() == f->id());\r\n\t\t\treturn NULL;\r\n\t\t}\r\n\r\n\t\tassert(adjacent_faces()[0]->id() == f->id() || \r\n\t\t\t   adjacent_faces()[1]->id() == f->id());\r\n\r\n\t\treturn adjacent_faces()[0]->id() == f->id() ? \r\n\t\t\t   adjacent_faces()[1] : adjacent_faces()[0];\r\n\t};\r\n\r\n\tvertex_pointer opposite_vertex(vertex_pointer v)\r\n\t{\r\n\t\tassert(belongs(v));\r\n\r\n\t\treturn adjacent_vertices()[0]->id() == v->id() ?\r\n\t\t\t   adjacent_vertices()[1] : adjacent_vertices()[0];\r\n\t};\r\n\r\n\tbool belongs(vertex_pointer v)\r\n\t{\r\n\t\treturn adjacent_vertices()[0]->id() == v->id() || \r\n\t\t\t   adjacent_vertices()[1]->id() == v->id();\r\n\t}\r\n\r\n\tbool is_boundary(){return adjacent_faces().size() == 1;};\r\n\r\n\tvertex_pointer v0(){return adjacent_vertices()[0];};\r\n\tvertex_pointer v1(){return adjacent_vertices()[1];};\r\n\r\n\tvoid local_coordinates(Point3D* point, \r\n\t\t\t\t\t\t   double& x, \r\n\t\t\t\t\t\t   double& y)\r\n\t{\r\n\t\tdouble d0 = point->distance(v0());\r\n\t\tif(d0 < 1e-50)\r\n\t\t{\r\n\t\t\tx = 0.0;\r\n\t\t\ty = 0.0;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tdouble d1 = point->distance(v1());\r\n\t\tif(d1 < 1e-50)\r\n\t\t{\r\n\t\t\tx = m_length;\r\n\t\t\ty = 0.0;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tx = m_length/2.0 + (d0*d0 - d1*d1)/(2.0*m_length);\r\n\t\ty = sqrt(std::max(0.0, d0*d0 - x*x));\r\n\t\treturn;\r\n\t}\r\n\r\nprivate:\r\n\tdouble m_length;\t\t\t\t\t\t\t//length of the edge\r\n};\r\n\r\nclass SurfacePoint:public Point3D  //point on the surface of the mesh\r\n{\r\npublic:\r\n\tSurfacePoint():\r\n\t\tm_p(NULL)\r\n\t{};\r\n\r\n\tSurfacePoint(vertex_pointer v):\t\t//set the surface point in the vertex\r\n\t\tSurfacePoint::Point3D(v),\r\n\t\tm_p(v)\r\n\t{};\r\n\r\n\tSurfacePoint(face_pointer f, double w0 = 1./3., double w1 = 1./3., double w2 = 1./3.):\t\t//set the surface point on the face with specified barycentric coordinates\r\n\t\tm_p(f)\r\n\t{\r\n        Point3D v0 = f->adjacent_vertices()[0];\r\n        Point3D v1 = f->adjacent_vertices()[1];\r\n        Point3D v2 = f->adjacent_vertices()[2];\r\n        v0.multiply(w0);\r\n        v1.multiply(w1);\r\n        v2.multiply(w2);\r\n        set(0, 0, 0);\r\n        add(&v0);\r\n        add(&v1);\r\n        add(&v2);\r\n\t};\r\n\r\n\tSurfacePoint(edge_pointer e,\t\t//set the surface point in the middle of the edge\r\n\t\t\t\t double a = 0.5):\t\t\r\n\t\tm_p(e)\r\n\t{\r\n\t\tdouble b = 1 - a;\r\n\r\n\t\tvertex_pointer v0 = e->adjacent_vertices()[0];\r\n\t\tvertex_pointer v1 = e->adjacent_vertices()[1];\r\n\r\n\t\tx() = b*v0->x() + a*v1->x();\r\n\t\ty() = b*v0->y() + a*v1->y();\r\n\t\tz() = b*v0->z() + a*v1->z();\r\n\t};\r\n\r\n\tSurfacePoint(base_pointer g, \r\n\t\t\t\t double x,\r\n\t\t\t\t double y,\r\n\t\t\t\t double z,\r\n\t\t\t\t PointType t = UNDEFINED_POINT):\r\n\t\tm_p(g)\r\n\t{\r\n\t\tset(x,y,z);\r\n\t};\r\n\r\n\tvoid initialize(SurfacePoint const& p)\r\n\t{\r\n\t\t*this = p;\r\n\t}\r\n\r\n\t~SurfacePoint(){};\r\n\r\n\tPointType type() const{return m_p ? m_p->type() : UNDEFINED_POINT;};\r\n\tbase_pointer& base_element(){return m_p;};\r\n\tconst base_pointer& base_element() const {return m_p;};\r\nprotected:\r\n\tbase_pointer m_p;\t\t\t//could be face, vertex or edge pointer\r\n};\r\n\r\ninline edge_pointer Face::opposite_edge(vertex_pointer v)\r\n{\r\n\tfor(unsigned i=0; i<3; ++i)\r\n\t{\r\n\t\tedge_pointer e = adjacent_edges()[i];\r\n\t\tif(!e->belongs(v))\r\n\t\t{\r\n\t\t\treturn e;\r\n\t\t}\r\n\t}\r\n\tassert(0);\r\n\treturn NULL;\r\n}\r\n\r\ninline vertex_pointer Face::opposite_vertex(edge_pointer e)\r\n{\r\n\tfor(unsigned i=0; i<3; ++i)\r\n\t{\r\n\t\tvertex_pointer v = adjacent_vertices()[i];\r\n\t\tif(!e->belongs(v))\r\n\t\t{\r\n\t\t\treturn v;\r\n\t\t}\r\n\t}\r\n\tassert(0);\r\n\treturn NULL;\r\n}\r\n\r\ninline edge_pointer Face::next_edge(edge_pointer e, vertex_pointer v)\r\n{\r\n\tassert(e->belongs(v));\r\n\r\n\tfor(unsigned i=0; i<3; ++i)\r\n\t{\r\n\t\tedge_pointer next = adjacent_edges()[i];\r\n\t\tif(e->id() != next->id() && next->belongs(v))\r\n\t\t{\r\n\t\t\treturn next;\r\n\t\t}\r\n\t}\r\n\tassert(0);\r\n\treturn NULL;\r\n}\r\n\r\nstruct HalfEdge\t\t\t//prototype of the edge; used for mesh construction\r\n{\r\n\tunsigned face_id;\r\n\tunsigned vertex_0;\t\t//adjacent vertices sorted by id value\r\n\tunsigned vertex_1;\t\t//they are sorted, vertex_0 < vertex_1\r\n};\r\n\r\ninline bool operator < (const HalfEdge &x, const HalfEdge &y)\r\n{\r\n\tif(x.vertex_0 == y.vertex_0)\r\n\t{\r\n\t    return x.vertex_1 < y.vertex_1;\r\n\t}\r\n\telse\r\n\t{\r\n\t\treturn x.vertex_0 < y.vertex_0;\r\n\t}\r\n}\r\n\r\ninline bool operator != (const HalfEdge &x, const HalfEdge &y)\r\n{\r\n\treturn x.vertex_0 != y.vertex_0 || x.vertex_1 != y.vertex_1;\r\n}\r\n\r\ninline bool operator == (const HalfEdge &x, const HalfEdge &y)\r\n{\r\n\treturn x.vertex_0 == y.vertex_0 && x.vertex_1 == y.vertex_1;\r\n}\r\n\r\n} //geodesic\r\n\r\n#endif\t\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/combine_meshes.h",
    "content": "#pragma once\r\n#include <vector>\r\n\r\nnamespace kt84 {\r\n    template <class TMesh>\r\n    inline TMesh combine_meshes(const std::vector<TMesh>& meshes) {\r\n        TMesh result;\r\n        int offset = 0;\r\n        for (auto& mesh : meshes) {\r\n            // add vertices\r\n            for (auto v : mesh.vertices())\r\n                result.add_vertex(mesh.point(v));\r\n            \r\n            // add faces\r\n            for (auto f : mesh.faces()) {\r\n                std::vector<typename TMesh::VHandle> face_vhandles;\r\n                for (auto v = mesh.cfv_iter(f); v.is_valid(); ++v)\r\n                    face_vhandles.push_back(result.vertex_handle(offset + v->idx()));\r\n                result.add_face(face_vhandles);\r\n            }\r\n            \r\n            offset += mesh.n_vertices();\r\n        }\r\n        return result;\r\n    }\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/debug_writeSVG.h",
    "content": "#pragma once\r\n#include <cstdio>\r\n#include <sstream>\r\n#include \"simple_svg_1.0.0.hpp\"\r\n\r\nnamespace {\r\n#ifdef _WIN32\r\n    inline FILE* popen(const char* command, const char* mode) { return _popen(command, mode); }\r\n    inline int pclose(FILE* file) { return _pclose(file); }\r\n#endif\r\n}\r\nnamespace kt84 {\r\n\r\ntemplate <class TMesh>\r\ninline void debug_writeSVG(\r\n    const TMesh& mesh,\r\n    const char* filename          = \"debug.svg\",\r\n    bool export_pdf               = false,\r\n    double      dimension         = 500.0,\r\n    double      stroke_width      = 1.0,\r\n    bool        draw_vidx         = true,\r\n    bool        draw_fidx         = true,\r\n    bool        draw_eidx         = true,\r\n    const char* font_family       = \"Courier\",\r\n    double      font_size         = 10.0,\r\n    double      font_stroke_width = 1.0)\r\n{\r\n    auto p0 = mesh.point(mesh.vertex_handle(0));\r\n    double xmin = p0[0], xmax = xmin;\r\n    double ymin = p0[1], ymax = ymin;\r\n    for (auto v : mesh.vertices()) {\r\n        if (mesh.has_vertex_status() && mesh.status(v).deleted()) continue;\r\n        auto p = mesh.point(v);\r\n        xmin = std::min<double>(xmin, p[0]);\r\n        xmax = std::max<double>(xmax, p[0]);\r\n        ymin = std::min<double>(ymin, p[1]);\r\n        ymax = std::max<double>(ymax, p[1]);\r\n    }\r\n    double margin = (xmax - xmin + ymax - ymin) * 0.1;\r\n    xmin -= margin;     xmax += margin;\r\n    ymin -= margin;     ymax += margin;\r\n    double scaling = dimension / std::min<double>(xmax - xmin, ymax - ymin);\r\n        \r\n    svg::Document doc(filename, svg::Layout(svg::Dimensions(scaling * (xmax - xmin), scaling * (ymax - ymin))));\r\n\r\n    auto make_svgPoint = [&] (const typename TMesh::Point& p) {\r\n        return svg::Point(scaling * (p[0] - xmin),\r\n                            scaling * (p[1] - ymin));\r\n    };\r\n    auto int2str = [](int i) {\r\n        std::stringstream ss;\r\n        ss << i;\r\n        return ss.str();\r\n    };\r\n        \r\n    for (auto f : mesh.faces()) {\r\n        if (mesh.has_face_status() && mesh.status(f).deleted()) continue;\r\n        svg::Polygon polygon(svg::Fill(svg::Color::Silver), svg::Stroke(font_stroke_width, svg::Color::Black));\r\n        for (auto fv = mesh.cfv_iter(f); fv.is_valid(); ++fv)\r\n            polygon << make_svgPoint(mesh.point(*fv));\r\n        doc << polygon;\r\n    }\r\n        \r\n    svg::Font font(font_size, font_family);\r\n    if (draw_vidx) {\r\n        for (auto v : mesh.vertices()) {\r\n            if (mesh.has_vertex_status() && mesh.status(v).deleted()) continue;\r\n            doc << svg::Text(make_svgPoint(mesh.point(v)), int2str(v.idx()), svg::Fill(), font, svg::Stroke(font_stroke_width, svg::Color::Red));\r\n        }\r\n    }\r\n    if (draw_fidx) {\r\n        for (auto f : mesh.faces()) {\r\n            if (mesh.has_face_status() && mesh.status(f).deleted()) continue;\r\n            typename TMesh::Point p;\r\n            p.vectorize(0);\r\n            int cnt = 0;\r\n            for (auto fv = mesh.cfv_iter(f); fv.is_valid(); ++fv) {\r\n                p += mesh.point(*fv);\r\n                ++cnt;\r\n            }\r\n            p *= 1.0 / cnt;\r\n            doc << svg::Text(make_svgPoint(p), int2str(f.idx()), svg::Fill(), font, svg::Stroke(font_stroke_width, svg::Color::Blue));\r\n        }\r\n    }\r\n    if (draw_eidx) {\r\n        for (auto e : mesh.edges()) {\r\n            if (mesh.has_edge_status() && mesh.status(e).deleted()) continue;\r\n            auto p0 = mesh.point(mesh.to_vertex_handle(mesh.halfedge_handle(e, 0)));\r\n            auto p1 = mesh.point(mesh.to_vertex_handle(mesh.halfedge_handle(e, 1)));\r\n            doc << svg::Text(make_svgPoint((p0 + p1) * 0.5), int2str(e.idx()), svg::Fill(), font, svg::Stroke(1, svg::Color::Brown));\r\n        }\r\n    }\r\n    doc.save();\r\n    if (export_pdf) {\r\n        std::stringstream command;\r\n        command << \"inkscape --export-pdf=\" << filename << \".pdf \" << filename;\r\n        FILE* p = popen(command.str().c_str(), \"r\");\r\n        const int BUF_SIZE = 4096;\r\n        char buf[BUF_SIZE];\r\n        buf[0] = 0;\r\n        while (fgets(buf, BUF_SIZE, p) != nullptr) {}\r\n        pclose(p);\r\n    }\r\n}\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/delete_isolated_vertices.h",
    "content": "#pragma once\r\n#include <vector>\r\n#include <unordered_map>\r\n\r\nnamespace kt84 {\r\n    template <class TMesh>\r\n    inline TMesh delete_isolated_vertices(const TMesh& mesh) {\r\n        TMesh result;\r\n        std::unordered_map<int, typename TMesh::VHandle> vertex_map;\r\n        for (auto f : mesh.faces()) {\r\n            std::vector<typename TMesh::VHandle> face_vhandles; \r\n            for (auto v = mesh.cfv_iter(f); v.is_valid(); ++v) {\r\n                auto found = vertex_map.find(v->idx());\r\n                if (found == vertex_map.end()) {\r\n                    auto v_new = result.add_vertex(mesh.point(*v));\r\n                    vertex_map[v->idx()] = v_new;\r\n                    face_vhandles.push_back(v_new);\r\n                } else {\r\n                    face_vhandles.push_back(vertex_map[v->idx()]);\r\n                }\r\n            }\r\n            result.add_face(face_vhandles);\r\n        }\r\n        return result;\r\n    }\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/edgeloop.h",
    "content": "#pragma once\r\n#include <vector>\r\n#include <utility>\r\n#include <functional>\r\n#include <OpenMesh/Core/Mesh/Handles.hh>\r\n\r\nnamespace kt84 {\r\n\r\n//template <class Mesh>     // Should be done with template alias in C++11\r\n//struct EdgeLoop_VertexFunc : public std::function<void(Mesh&, OpenMesh::HalfedgeHandle, OpenMesh::VertexHandle)> {};\r\n\r\n\r\ntemplate <class Mesh>\r\ninline void insert_edgeloop(                                     // Return: array of newly generated vertices\r\n    Mesh&                       mesh,                                                           // Target mesh, assumed to be quad-only\r\n    OpenMesh::HalfedgeHandle    h_start,                                                        // Boundary halfedge where the edgeloop starts\r\n    double                      t = 0.5,                                                        // Position of splitting edges in the quad strip\r\n    std::function<void(Mesh&, OpenMesh::HalfedgeHandle, OpenMesh::VertexHandle)> \r\n    func = std::function<void(Mesh&, OpenMesh::HalfedgeHandle, OpenMesh::VertexHandle)>())      // Function called when making new vertex\r\n{\r\n    // check if this edge loop forms a loop by walking toward h1 of e\r\n    for (auto h = mesh.opposite_halfedge_handle(h_start); ; ) {\r\n        auto h_opposite           = mesh.opposite_halfedge_handle(h);\r\n        auto h_next_next          = mesh.next_halfedge_handle(mesh.next_halfedge_handle(h));\r\n        auto h_next_next_opposite = mesh.opposite_halfedge_handle(h_next_next);\r\n        \r\n        if (mesh.is_boundary(h)) {\r\n            // reached a boundary\r\n            h_start = h_opposite;\r\n            break;\r\n        } else if (h_start == h_next_next) {\r\n            // loop detected!\r\n            break;\r\n        }\r\n        h = h_next_next_opposite;\r\n    }\r\n        \r\n    // for each edge, insert a vertex at its middle\r\n    for (auto h = h_start; ;) {\r\n        auto h_next =\r\n            mesh.opposite_halfedge_handle(\r\n            mesh.next_halfedge_handle    (\r\n            mesh.next_halfedge_handle    (h)));\r\n            \r\n        auto p0 = mesh.point(mesh.from_vertex_handle(h));\r\n        auto p1 = mesh.point(mesh.  to_vertex_handle(h));\r\n        auto v_new = mesh.add_vertex((1 - t) * p0 + t * p1);\r\n        if (func)\r\n            func(mesh, h, v_new);\r\n\r\n        mesh.split_edge(mesh.edge_handle(h), v_new);\r\n            \r\n        if (mesh.is_boundary(h))\r\n            break;\r\n            \r\n        if (h_next == h_start)\r\n            break;\r\n            \r\n        h = h_next;\r\n    }\r\n        \r\n    // connect inserted vertices\r\n    for (auto h = h_start; ;) {\r\n        auto h_prev =\r\n            mesh.next_halfedge_handle(\r\n            mesh.next_halfedge_handle(h));\r\n            \r\n        auto h_next = mesh.opposite_halfedge_handle(h_prev);\r\n            \r\n        mesh.insert_edge(h_prev, h);\r\n            \r\n        h = h_next;\r\n        if (mesh.is_boundary(h) || h == h_start)\r\n            break;\r\n    }\r\n}\r\n\r\ntemplate <class Mesh>\r\ninline std::vector<OpenMesh::HalfedgeHandle> find_edgeloop(     // Return : array of halfedges belonging to the quad strip, starting with h_start\r\n    Mesh&                       mesh,                           // Target mesh, assumed to be quad-only\r\n    OpenMesh::HalfedgeHandle    h_start)                        // Boundary halfedge where the edgeloop starts\r\n{\r\n    // check if this edge loop forms a loop by walking toward h1 of e\r\n    for (auto h = mesh.opposite_halfedge_handle(h_start); ; ) {\r\n        auto h_opposite           = mesh.opposite_halfedge_handle(h);\r\n        auto h_next_next          = mesh.next_halfedge_handle(mesh.next_halfedge_handle(h));\r\n        auto h_next_next_opposite = mesh.opposite_halfedge_handle(h_next_next);\r\n            \r\n        if (mesh.is_boundary(h)) {\r\n            // reached a boundary\r\n            h_start = h_opposite;\r\n            break;\r\n        } else if (h_start == h_next_next) {\r\n            // loop detected!\r\n            break;\r\n        }\r\n        h = h_next_next_opposite;\r\n    }\r\n        \r\n    // collect result\r\n    std::vector<OpenMesh::HalfedgeHandle> result;\r\n    for (auto h = h_start; ;) {\r\n        result.push_back(h);\r\n            \r\n        if (mesh.is_boundary(h))\r\n            break;\r\n            \r\n        auto h_next =\r\n            mesh.opposite_halfedge_handle(\r\n            mesh.next_halfedge_handle    (\r\n            mesh.next_halfedge_handle    (h)));\r\n            \r\n        if (h_next == h_start) {\r\n            result.push_back(h_start);          // indication of loop\r\n            break;\r\n        }\r\n            \r\n        h = h_next;\r\n    }\r\n        \r\n    return result;\r\n}\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/flip_faces.h",
    "content": "#pragma once\r\n#include <vector>\r\n#include <algorithm>\r\n\r\nnamespace kt84 {\r\n\r\ntemplate <class Mesh>\r\ninline void flip_faces(Mesh& mesh) {\r\n    auto copied = mesh;\r\n    mesh.clear();\r\n        \r\n    // copy vertices\r\n    for (auto v : copied.vertices())\r\n        mesh.data(mesh.add_vertex(copied.point(v))) = copied.data(v);\r\n        \r\n    // copy faces\r\n    for (auto f : copied.faces()) {\r\n        std::vector<typename Mesh::VHandle> face_vhandles;\r\n        for (auto fv = copied.fv_iter(f); fv.is_valid(); ++fv)\r\n            face_vhandles.push_back(mesh.vertex_handle(fv->idx()));\r\n        // flip face\r\n        std::reverse(face_vhandles.begin(), face_vhandles.end());\r\n        mesh.data(mesh.add_face(face_vhandles)) = copied.data(f);\r\n    }\r\n    // TODO: copy edge/halfedge data?\r\n}\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/get_connected_components.h",
    "content": "#pragma once\r\n#include <vector>\r\n#include <unordered_map>\r\n#include <boost/graph/adjacency_list.hpp>\r\n#include <boost/graph/connected_components.hpp>\r\n\r\nnamespace kt84 {\r\n    template <class TMesh>\r\n    inline std::vector<TMesh> get_connected_components(const TMesh& mesh) {\r\n        assert(mesh.has_vertex_status() && mesh.has_face_status());\r\n        \r\n        std::vector<TMesh> result;\r\n        \r\n        boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS> graph;\r\n        for (auto e : mesh.edges()) {\r\n            int f0 = mesh.face_handle(mesh.halfedge_handle(e, 0)).idx();\r\n            int f1 = mesh.face_handle(mesh.halfedge_handle(e, 1)).idx();\r\n            boost::add_edge(f0, f1, graph);\r\n        }\r\n        \r\n        std::vector<int> f_component_id(mesh.n_faces());\r\n        int n_components = boost::connected_components(graph, &f_component_id[0]);\r\n        \r\n        // generate array of meshes according to component id\r\n        for (int i = 0; i < n_components; ++i) {\r\n            TMesh component = mesh;\r\n            for (auto f : component.faces()) {\r\n                if (f_component_id[f.idx()] != i)\r\n                    component.delete_face(f, true);\r\n            }\r\n            component.garbage_collection();\r\n            result.push_back(component);\r\n        }\r\n        \r\n        return result;\r\n    }\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/merge_nearby_vertices.h",
    "content": "#pragma once\r\n#include <OpenMesh/Core/Mesh/Handles.hh>\r\n#include <map>\r\n#include <vector>\r\n\r\nnamespace kt84 {\r\n\r\ntemplate <class Mesh>\r\ninline void merge_nearby_vertices(Mesh& mesh, double axis_aligned_distance) {\r\n    // WARNING! This doesn't take the manifoldness into account, could possibly result in some holes.\r\n    \r\n    typedef typename Mesh::Point Point;\r\n    typedef OpenMesh::VertexHandle VHandle;\r\n        \r\n    // map from Point to VHandle for detecting nearby vertices\r\n    auto pred = [&] (const Point& lhs, const Point& rhs) {\r\n        for (int i = 0; i < Point::size_; ++i) {\r\n            if (std::abs(lhs[i] - rhs[i]) <= axis_aligned_distance)\r\n                continue;\r\n            return lhs[i] < rhs[i];\r\n        }\r\n        return false;\r\n    };\r\n    std::map<Point, VHandle, decltype(pred)> point2vhandle(pred);\r\n        \r\n    // map from old vertex indices to new vertex indices\r\n    std::vector<int> index_map(mesh.n_vertices(), -1);\r\n        \r\n    // detect nearby vertices\r\n    for (auto v : mesh.vertices()) {\r\n        auto p = mesh.point(v);\r\n        auto found = point2vhandle.find(p);\r\n        if (found == point2vhandle.end()) {\r\n            point2vhandle.insert(std::make_pair(p, v));\r\n            index_map[v.idx()] = v.idx();\r\n        } else {\r\n            index_map[v.idx()] = found->second.idx();\r\n        }\r\n    }\r\n        \r\n    // make sure that the mesh can store deletion flag\r\n    mesh.request_vertex_status();\r\n    mesh.request_face_status();\r\n    mesh.request_edge_status();\r\n    mesh.request_halfedge_status();\r\n        \r\n    // update all faces\r\n    std::vector<std::vector<VHandle>> updated_faces;\r\n    for (auto f : mesh.faces()) {\r\n        std::vector<VHandle> face_vhandles;\r\n        for (auto fv = mesh.fv_iter(f); fv.is_valid(); ++fv)\r\n            face_vhandles.push_back(mesh.vertex_handle(index_map[fv->idx()]));\r\n        updated_faces.push_back(face_vhandles);\r\n        mesh.delete_face(f, false);\r\n    }\r\n    for (auto& face_vhandles : updated_faces) {\r\n        mesh.add_face(face_vhandles);\r\n    }\r\n        \r\n    // delete merged vertices\r\n    for (auto i = 0u; i < mesh.n_vertices(); ++i) {\r\n        if (index_map[i] != i)\r\n            mesh.delete_vertex(mesh.vertex_handle(i));\r\n    }\r\n        \r\n    mesh.garbage_collection();\r\n}\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/read_obj_soup.h",
    "content": "#pragma once\r\n#include <string>\r\n#include <iostream>\r\n#include <fstream>\r\n#include <sstream>\r\n#include <OpenMesh/Core/Mesh/Handles.hh>\n\r\n// Modified and simplified version of <OpenMesh/Core/IO/reader/OBJReader.cc>\r\n\r\nnamespace kt84 {\r\n\r\ntemplate <class Mesh>\r\ninline bool read_obj_soup(Mesh& mesh, const std::string& filename) {\r\n    using namespace OpenMesh;\r\n\r\n    std::ifstream fin( filename.c_str(), std::ios_base::in );\n    if (!fin.is_open()) {\n        std::cerr << \"  Warning! Could not open file properly!\\n\";\n        return false;\n    }\n    mesh.clear();\n    \n    std::string line;\n    std::string keyWrd;\n\n    std::vector<typename Mesh::Point> vertices;\n    float                     x, y, z;\n\n    auto trimString = [](std::string& _string) {\n        // Trim Both leading and trailing spaces\n        size_t start = _string.find_first_not_of(\" \\t\\r\\n\");\n        size_t end   = _string.find_last_not_of(\" \\t\\r\\n\");\n        if(( std::string::npos == start ) || ( std::string::npos == end))\n            _string = \"\";\n        else\n            _string = _string.substr( start, end-start+1 );\n    };\n    \n    while( fin && !fin.eof() )\n    {\n        std::getline(fin,line);\n        if ( fin.bad() ){\n            std::cerr << \"  Warning! Could not read file properly!\\n\";\n            return false;\n        }\n\n        // Trim Both leading and trailing spaces\n        trimString(line);\n\n        // comment\n        if ( line.size() == 0 || line[0] == '#' || isspace(line[0]) ) {\n            continue;\n        }\n\n        std::stringstream stream(line);\n\n        stream >> keyWrd;\n\n        // material file\n        if (keyWrd == \"mtllib\")\n        {\n            // TODO\n        }\n\n        // usemtl\n        else if (keyWrd == \"usemtl\")\n        {\n            // TODO\n        }\n\n        // vertex\n        else if (keyWrd == \"v\")\n        {\n            stream >> x; stream >> y; stream >> z;\n\n            if ( !stream.fail() )\n            {\n                vertices.push_back(typename Mesh::Point(x,y,z));\n            }\n        }\n\n        // texture coord\n        else if (keyWrd == \"vt\")\n        {\n            // TODO\n        }\n\n        // color per vertex\n        else if (keyWrd == \"vc\")\n        {\n            // TODO\n        }\n\n        // normal\n        else if (keyWrd == \"vn\")\n        {\n            // TODO\n        }\n\n\n        // face\n        else if (keyWrd == \"f\")\n        {\n            int component(0), nV(0);\n            int value;\n\n            // read full line after detecting a face\n            std::string faceLine;\n            std::getline(stream,faceLine);\n            std::stringstream lineData( faceLine );\n\n            FaceHandle fh;\n            std::vector<VertexHandle> faceVertices;\n\n            // work on the line until nothing left to read\n            while ( !lineData.eof() )\n            {\n                // read one block from the line ( vertex/texCoord/normal )\n                std::string vertex;\n                lineData >> vertex;\n\n                do{\n\n                    //get the component (vertex/texCoord/normal)\n                    size_t found=vertex.find(\"/\");\n\n                    // parts are seperated by '/' So if no '/' found its the last component\n                    if( found != std::string::npos ){\n\n                        // read the index value\n                        std::stringstream tmp( vertex.substr(0,found) );\n\n                        // If we get an empty string this property is undefined in the file\n                        if ( vertex.substr(0,found).empty() ) {\n                            // Switch to next field\n                            vertex = vertex.substr(found+1);\n\n                            // Now we are at the next component\n                            ++component;\n\n                            // Skip further processing of this component\n                            continue;\n                        }\n\n                        // Read current value\n                        tmp >> value;\n\n                        // remove the read part from the string\n                        vertex = vertex.substr(found+1);\n\n                    } else {\n\n                        // last component of the vertex, read it.\n                        std::stringstream tmp( vertex );\n                        tmp >> value;\n\n                        // Clear vertex after finished reading the line\n                        vertex=\"\";\n\n                        // Nothing to read here ( garbage at end of line )\n                        if ( tmp.fail() ) {\n                            continue;\n                        }\n                    }\n\n                    // store the component ( each component is referenced by the index here! )\n                    switch (component)\n                    {\n                    case 0: // vertex\n                        // Obj counts from 1 and not zero .. array counts from zero therefore -1\n                        faceVertices.push_back(mesh.add_vertex(vertices[value-1]));\n                        break;\n\n                    case 1: // texture coord\n                        // TODO\n                        break;\n\n                    case 2: // normal\n                        // TODO\n                        break;\n                    }\n\n                    // Prepare for reading next component\n                    ++component;\n\n                    // Read until line does not contain any other info\n                } while ( !vertex.empty() );\n\n                component = 0;\n                nV++;\n\n            }\n\n            mesh.add_face(faceVertices);\n        }\n    }\n\n    return true;\n}\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/simple_svg_1.0.0.hpp",
    "content": "\n/*******************************************************************************\n*  The \"New BSD License\" : http://www.opensource.org/licenses/bsd-license.php  *\n********************************************************************************\n\nCopyright (c) 2010, Mark Turney\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n    * Neither the name of the <organization> nor the\n      names of its contributors may be used to endorse or promote products\n      derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n******************************************************************************/\n\n#ifndef SIMPLE_SVG_HPP\n#define SIMPLE_SVG_HPP\n\n#include <vector>\n#include <string>\n#include <sstream>\n#include <fstream>\n\n#include <iostream>\n\nnamespace svg\n{\n    // Utility XML/String Functions.\n    template <typename T>\n    inline std::string attribute(std::string const & attribute_name,\n        T const & value, std::string const & unit = \"\")\n    {\n        std::stringstream ss;\n        ss << attribute_name << \"=\\\"\" << value << unit << \"\\\" \";\n        return ss.str();\n    }\n    inline std::string elemStart(std::string const & element_name)\n    {\n        return \"\\t<\" + element_name + \" \";\n    }\n    inline std::string elemEnd(std::string const & element_name)\n    {\n        return \"</\" + element_name + \">\\n\";\n    }\n    inline std::string emptyElemEnd()\n    {\n        return \"/>\\n\";\n    }\n\n    // Quick optional return type.  This allows functions to return an invalid\n    //  value if no good return is possible.  The user checks for validity\n    //  before using the returned value.\n    template <typename T>\n    class optional\n    {\n    public:\n        optional<T>(T const & type)\n            : valid(true), type(type) { }\n        optional<T>() : valid(false), type(T()) { }\n        T * operator->()\n        {\n            // If we try to access an invalid value, an exception is thrown.\n            if (!valid)\n                throw std::exception();\n\n            return &type;\n        }\n        // Test for validity.\n        bool operator!() const { return !valid; }\n    private:\n        bool valid;\n        T type;\n    };\n\n    struct Dimensions\n    {\n        Dimensions(double width, double height) : width(width), height(height) { }\n        Dimensions(double combined = 0) : width(combined), height(combined) { }\n        double width;\n        double height;\n    };\n\n    struct Point\n    {\n        Point(double x = 0, double y = 0) : x(x), y(y) { }\n        double x;\n        double y;\n    };\n    inline optional<Point> getMinPoint(std::vector<Point> const & points)\n    {\n        if (points.empty())\n            return optional<Point>();\n\n        Point min = points[0];\n        for (unsigned i = 0; i < points.size(); ++i) {\n            if (points[i].x < min.x)\n                min.x = points[i].x;\n            if (points[i].y < min.y)\n                min.y = points[i].y;\n        }\n        return optional<Point>(min);\n    }\n    inline optional<Point> getMaxPoint(std::vector<Point> const & points)\n    {\n        if (points.empty())\n            return optional<Point>();\n\n        Point max = points[0];\n        for (unsigned i = 0; i < points.size(); ++i) {\n            if (points[i].x > max.x)\n                max.x = points[i].x;\n            if (points[i].y > max.y)\n                max.y = points[i].y;\n        }\n        return optional<Point>(max);\n    }\n\n    // Defines the dimensions, scale, origin, and origin offset of the document.\n    struct Layout\n    {\n        enum Origin { TopLeft, BottomLeft, TopRight, BottomRight };\n\n        Layout(Dimensions const & dimensions = Dimensions(400, 300), Origin origin = BottomLeft,\n            double scale = 1, Point const & origin_offset = Point(0, 0))\n            : dimensions(dimensions), scale(scale), origin(origin), origin_offset(origin_offset) { }\n        Dimensions dimensions;\n        double scale;\n        Origin origin;\n        Point origin_offset;\n    };\n\n    // Convert coordinates in user space to SVG native space.\n    inline double translateX(double x, Layout const & layout)\n    {\n        if (layout.origin == Layout::BottomRight || layout.origin == Layout::TopRight)\n            return layout.dimensions.width - ((x + layout.origin_offset.x) * layout.scale);\n        else\n            return (layout.origin_offset.x + x) * layout.scale;\n    }\n\n    inline double translateY(double y, Layout const & layout)\n    {\n        if (layout.origin == Layout::BottomLeft || layout.origin == Layout::BottomRight)\n            return layout.dimensions.height - ((y + layout.origin_offset.y) * layout.scale);\n        else\n            return (layout.origin_offset.y + y) * layout.scale;\n    }\n    inline double translateScale(double dimension, Layout const & layout)\n    {\n        return dimension * layout.scale;\n    }\n\n    class Serializeable\n    {\n    public:\n        Serializeable() { }\n        virtual ~Serializeable() { };\n        virtual std::string toString(Layout const & layout) const = 0;\n    };\n\n    class Color : public Serializeable\n    {\n    public:\n        enum Defaults { Transparent = -1, Aqua, Black, Blue, Brown, Cyan, Fuchsia,\n            Green, Lime, Magenta, Orange, Purple, Red, Silver, White, Yellow };\n\n        Color(int r, int g, int b) : transparent(false), red(r), green(g), blue(b) { }\n        Color(Defaults color)\n            : transparent(false), red(0), green(0), blue(0)\n        {\n            switch (color)\n            {\n                case Aqua: assign(0, 255, 255); break;\n                case Black: assign(0, 0, 0); break;\n                case Blue: assign(0, 0, 255); break;\n                case Brown: assign(165, 42, 42); break;\n                case Cyan: assign(0, 255, 255); break;\n                case Fuchsia: assign(255, 0, 255); break;\n                case Green: assign(0, 128, 0); break;\n                case Lime: assign(0, 255, 0); break;\n                case Magenta: assign(255, 0, 255); break;\n                case Orange: assign(255, 165, 0); break;\n                case Purple: assign(128, 0, 128); break;\n                case Red: assign(255, 0, 0); break;\n                case Silver: assign(192, 192, 192); break;\n                case White: assign(255, 255, 255); break;\n                case Yellow: assign(255, 255, 0); break;\n                default: transparent = true; break;\n            }\n        }\n        virtual ~Color() { }\n        std::string toString(Layout const &) const\n        {\n            std::stringstream ss;\n            if (transparent)\n                ss << \"transparent\";\n            else\n                ss << \"rgb(\" << red << \",\" << green << \",\" << blue << \")\";\n            return ss.str();\n        }\n    private:\n            bool transparent;\n            int red;\n            int green;\n            int blue;\n\n            void assign(int r, int g, int b)\n            {\n                red = r;\n                green = g;\n                blue = b;\n            }\n    };\n\n    class Fill : public Serializeable\n    {\n    public:\n        Fill(Color::Defaults color) : color(color) { }\n        Fill(Color color = Color::Transparent)\n            : color(color) { }\n        std::string toString(Layout const & layout) const\n        {\n            std::stringstream ss;\n            ss << attribute(\"fill\", color.toString(layout));\n            return ss.str();\n        }\n    private:\n        Color color;\n    };\n\n    class Stroke : public Serializeable\n    {\n    public:\n        Stroke(double width = -1, Color color = Color::Transparent)\n            : width(width), color(color) { }\n        std::string toString(Layout const & layout) const\n        {\n            // If stroke width is invalid.\n            if (width < 0)\n                return std::string();\n\n            std::stringstream ss;\n            ss << attribute(\"stroke-width\", translateScale(width, layout)) << attribute(\"stroke\", color.toString(layout));\n            return ss.str();\n        }\n    private:\n        double width;\n        Color color;\n    };\n\n    class Font : public Serializeable\n    {\n    public:\n        Font(double size = 12, std::string const & family = \"Verdana\") : size(size), family(family) { }\n        std::string toString(Layout const & layout) const\n        {\n            std::stringstream ss;\n            ss << attribute(\"font-size\", translateScale(size, layout)) << attribute(\"font-family\", family);\n            return ss.str();\n        }\n    private:\n        double size;\n        std::string family;\n    };\n\n    class Shape : public Serializeable\n    {\n    public:\n        Shape(Fill const & fill = Fill(), Stroke const & stroke = Stroke())\n            : fill(fill), stroke(stroke) { }\n        virtual ~Shape() { }\n        virtual std::string toString(Layout const & layout) const = 0;\n        virtual void offset(Point const & offset) = 0;\n    protected:\n        Fill fill;\n        Stroke stroke;\n    };\n    template <typename T>\n    std::string vectorToString(std::vector<T> collection, Layout const & layout)\n    {\n        std::string combination_str;\n        for (unsigned i = 0; i < collection.size(); ++i)\n            combination_str += collection[i].toString(layout);\n\n        return combination_str;\n    }\n\n    class Circle : public Shape\n    {\n    public:\n        Circle(Point const & center, double diameter, Fill const & fill,\n            Stroke const & stroke = Stroke())\n            : Shape(fill, stroke), center(center), radius(diameter / 2) { }\n        std::string toString(Layout const & layout) const\n        {\n            std::stringstream ss;\n            ss << elemStart(\"circle\") << attribute(\"cx\", translateX(center.x, layout))\n                << attribute(\"cy\", translateY(center.y, layout))\n                << attribute(\"r\", translateScale(radius, layout)) << fill.toString(layout)\n                << stroke.toString(layout) << emptyElemEnd();\n            return ss.str();\n        }\n        void offset(Point const & offset)\n        {\n            center.x += offset.x;\n            center.y += offset.y;\n        }\n    private:\n        Point center;\n        double radius;\n    };\n\n    class Elipse : public Shape\n    {\n    public:\n        Elipse(Point const & center, double width, double height,\n            Fill const & fill = Fill(), Stroke const & stroke = Stroke())\n            : Shape(fill, stroke), center(center), radius_width(width / 2),\n            radius_height(height / 2) { }\n        std::string toString(Layout const & layout) const\n        {\n            std::stringstream ss;\n            ss << elemStart(\"ellipse\") << attribute(\"cx\", translateX(center.x, layout))\n                << attribute(\"cy\", translateY(center.y, layout))\n                << attribute(\"rx\", translateScale(radius_width, layout))\n                << attribute(\"ry\", translateScale(radius_height, layout))\n                << fill.toString(layout) << stroke.toString(layout) << emptyElemEnd();\n            return ss.str();\n        }\n        void offset(Point const & offset)\n        {\n            center.x += offset.x;\n            center.y += offset.y;\n        }\n    private:\n        Point center;\n        double radius_width;\n        double radius_height;\n    };\n\n    class Rectangle : public Shape\n    {\n    public:\n        Rectangle(Point const & edge, double width, double height,\n            Fill const & fill = Fill(), Stroke const & stroke = Stroke())\n            : Shape(fill, stroke), edge(edge), width(width),\n            height(height) { }\n        std::string toString(Layout const & layout) const\n        {\n            std::stringstream ss;\n            ss << elemStart(\"rect\") << attribute(\"x\", translateX(edge.x, layout))\n                << attribute(\"y\", translateY(edge.y, layout))\n                << attribute(\"width\", translateScale(width, layout))\n                << attribute(\"height\", translateScale(height, layout))\n                << fill.toString(layout) << stroke.toString(layout) << emptyElemEnd();\n            return ss.str();\n        }\n        void offset(Point const & offset)\n        {\n            edge.x += offset.x;\n            edge.y += offset.y;\n        }\n    private:\n        Point edge;\n        double width;\n        double height;\n    };\n\n    class Line : public Shape\n    {\n    public:\n        Line(Point const & start_point, Point const & end_point,\n            Stroke const & stroke = Stroke())\n            : Shape(Fill(), stroke), start_point(start_point),\n            end_point(end_point) { }\n        std::string toString(Layout const & layout) const\n        {\n            std::stringstream ss;\n            ss << elemStart(\"line\") << attribute(\"x1\", translateX(start_point.x, layout))\n                << attribute(\"y1\", translateY(start_point.y, layout))\n                << attribute(\"x2\", translateX(end_point.x, layout))\n                << attribute(\"y2\", translateY(end_point.y, layout))\n                << stroke.toString(layout) << emptyElemEnd();\n            return ss.str();\n        }\n        void offset(Point const & offset)\n        {\n            start_point.x += offset.x;\n            start_point.y += offset.y;\n\n            end_point.x += offset.x;\n            end_point.y += offset.y;\n        }\n    private:\n        Point start_point;\n        Point end_point;\n    };\n\n    class Polygon : public Shape\n    {\n    public:\n        Polygon(Fill const & fill = Fill(), Stroke const & stroke = Stroke())\n            : Shape(fill, stroke) { }\n        //Polygon(Stroke const & stroke = Stroke()) : Shape(Color::Transparent, stroke) { }\n        Polygon & operator<<(Point const & point)\n        {\n            points.push_back(point);\n            return *this;\n        }\n        std::string toString(Layout const & layout) const\n        {\n            std::stringstream ss;\n            ss << elemStart(\"polygon\");\n\n            ss << \"points=\\\"\";\n            for (unsigned i = 0; i < points.size(); ++i)\n                ss << translateX(points[i].x, layout) << \",\" << translateY(points[i].y, layout) << \" \";\n            ss << \"\\\" \";\n\n            ss << fill.toString(layout) << stroke.toString(layout) << emptyElemEnd();\n            return ss.str();\n        }\n        void offset(Point const & offset)\n        {\n            for (unsigned i = 0; i < points.size(); ++i) {\n                points[i].x += offset.x;\n                points[i].y += offset.y;\n            }\n        }\n    private:\n        std::vector<Point> points;\n    };\n\n    class Polyline : public Shape\n    {\n    public:\n        Polyline(Fill const & fill = Fill(), Stroke const & stroke = Stroke())\n            : Shape(fill, stroke) { }\n        //Polyline(Stroke const & stroke = Stroke()) : Shape(Color::Transparent, stroke) { }\n        Polyline(std::vector<Point> const & points,\n            Fill const & fill = Fill(), Stroke const & stroke = Stroke())\n            : Shape(fill, stroke), points(points) { }\n        Polyline & operator<<(Point const & point)\n        {\n            points.push_back(point);\n            return *this;\n        }\n        std::string toString(Layout const & layout) const\n        {\n            std::stringstream ss;\n            ss << elemStart(\"polyline\");\n\n            ss << \"points=\\\"\";\n            for (unsigned i = 0; i < points.size(); ++i)\n                ss << translateX(points[i].x, layout) << \",\" << translateY(points[i].y, layout) << \" \";\n            ss << \"\\\" \";\n\n            ss << fill.toString(layout) << stroke.toString(layout) << emptyElemEnd();\n            return ss.str();\n        }\n        void offset(Point const & offset)\n        {\n            for (unsigned i = 0; i < points.size(); ++i) {\n                points[i].x += offset.x;\n                points[i].y += offset.y;\n            }\n        }\n        std::vector<Point> points;\n    };\n\n    class Text : public Shape\n    {\n    public:\n        Text(Point const & origin, std::string const & content, Fill const & fill = Fill(),\n             Font const & font = Font(), Stroke const & stroke = Stroke())\n            : Shape(fill, stroke), origin(origin), content(content), font(font) { }\n        std::string toString(Layout const & layout) const\n        {\n            std::stringstream ss;\n            ss << elemStart(\"text\") << attribute(\"x\", translateX(origin.x, layout))\n                << attribute(\"y\", translateY(origin.y, layout))\n                << fill.toString(layout) << stroke.toString(layout) << font.toString(layout)\n                << \">\" << content << elemEnd(\"text\");\n            return ss.str();\n        }\n        void offset(Point const & offset)\n        {\n            origin.x += offset.x;\n            origin.y += offset.y;\n        }\n    private:\n        Point origin;\n        std::string content;\n        Font font;\n    };\n\n    // Sample charting class.\n    class LineChart : public Shape\n    {\n    public:\n        LineChart(Dimensions margin = Dimensions(), double scale = 1,\n                  Stroke const & axis_stroke = Stroke(.5, Color::Purple))\n            : axis_stroke(axis_stroke), margin(margin), scale(scale) { }\n        LineChart & operator<<(Polyline const & polyline)\n        {\n            if (polyline.points.empty())\n                return *this;\n\n            polylines.push_back(polyline);\n            return *this;\n        }\n        std::string toString(Layout const & layout) const\n        {\n            if (polylines.empty())\n                return \"\";\n\n            std::string ret;\n            for (unsigned i = 0; i < polylines.size(); ++i)\n                ret += polylineToString(polylines[i], layout);\n\n            return ret + axisString(layout);\n        }\n        void offset(Point const & offset)\n        {\n            for (unsigned i = 0; i < polylines.size(); ++i)\n                polylines[i].offset(offset);\n        }\n    private:\n        Stroke axis_stroke;\n        Dimensions margin;\n        double scale;\n        std::vector<Polyline> polylines;\n\n        optional<Dimensions> getDimensions() const\n        {\n            if (polylines.empty())\n                return optional<Dimensions>();\n\n            optional<Point> min = getMinPoint(polylines[0].points);\n            optional<Point> max = getMaxPoint(polylines[0].points);\n            for (unsigned i = 0; i < polylines.size(); ++i) {\n                if (getMinPoint(polylines[i].points)->x < min->x)\n                    min->x = getMinPoint(polylines[i].points)->x;\n                if (getMinPoint(polylines[i].points)->y < min->y)\n                    min->y = getMinPoint(polylines[i].points)->y;\n                if (getMaxPoint(polylines[i].points)->x > max->x)\n                    max->x = getMaxPoint(polylines[i].points)->x;\n                if (getMaxPoint(polylines[i].points)->y > max->y)\n                    max->y = getMaxPoint(polylines[i].points)->y;\n            }\n\n            return optional<Dimensions>(Dimensions(max->x - min->x, max->y - min->y));\n        }\n        std::string axisString(Layout const & layout) const\n        {\n            optional<Dimensions> dimensions = getDimensions();\n            if (!dimensions)\n                return \"\";\n\n            // Make the axis 10% wider and higher than the data points.\n            double width = dimensions->width * 1.1;\n            double height = dimensions->height * 1.1;\n\n            // Draw the axis.\n            Polyline axis(Color::Transparent, axis_stroke);\n            axis << Point(margin.width, margin.height + height) << Point(margin.width, margin.height)\n                << Point(margin.width + width, margin.height);\n\n            return axis.toString(layout);\n        }\n        std::string polylineToString(Polyline const & polyline, Layout const & layout) const\n        {\n            Polyline shifted_polyline = polyline;\n            shifted_polyline.offset(Point(margin.width, margin.height));\n\n            std::vector<Circle> vertices;\n            for (unsigned i = 0; i < shifted_polyline.points.size(); ++i)\n                vertices.push_back(Circle(shifted_polyline.points[i], getDimensions()->height / 30.0, Color::Black));\n\n            return shifted_polyline.toString(layout) + vectorToString(vertices, layout);\n        }\n    };\n\n    class Document\n    {\n    public:\n        Document(std::string const & file_name, Layout layout = Layout())\n            : file_name(file_name), layout(layout) { }\n\n        Document & operator<<(Shape const & shape)\n        {\n            body_nodes_str += shape.toString(layout);\n            return *this;\n        }\n        std::string toString() const\n        {\n            std::stringstream ss;\n            ss << \"<?xml \" << attribute(\"version\", \"1.0\") << attribute(\"standalone\", \"no\")\n                << \"?>\\n<!DOCTYPE svg PUBLIC \\\"-//W3C//DTD SVG 1.1//EN\\\" \"\n                << \"\\\"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\\\">\\n<svg \"\n                << attribute(\"width\", layout.dimensions.width, \"px\")\n                << attribute(\"height\", layout.dimensions.height, \"px\")\n                << attribute(\"xmlns\", \"http://www.w3.org/2000/svg\")\n                << attribute(\"version\", \"1.1\") << \">\\n\" << body_nodes_str << elemEnd(\"svg\");\n            return ss.str();\n        }\n        bool save() const\n        {\n            std::ofstream ofs(file_name.c_str());\n            if (!ofs.good())\n                return false;\n\n            ofs << toString();\n            ofs.close();\n            return true;\n        }\n    private:\n        std::string file_name;\n        Layout layout;\n\n        std::string body_nodes_str;\n    };\n}\n\n#endif\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/symmetrize.hh",
    "content": ""
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/openmesh/vector_convert.h",
    "content": "#pragma once\r\n\r\n#include <OpenMesh/Core/Geometry/VectorT.hh>\r\n#include <Eigen/Core>\r\n#include <utility>\r\n#include <vector>\r\n\r\nnamespace kt84 {\r\n\r\n// vector type conversion from Eigen to OpenMesh\r\ntemplate <int N>\r\ninline OpenMesh::VectorT<double, N> e2o (const Eigen::Matrix<double, N, 1, 0, N, 1>& v) {\r\n    OpenMesh::VectorT<double, N> result;\r\n    for (int i = 0; i < N; ++i)\r\n        result[i] = v[i];\r\n    return result;\r\n}\r\ntemplate <> inline OpenMesh::Vec2d e2o(const Eigen::Vector2d& v) { return OpenMesh::Vec2d(v[0], v[1]); }\r\ntemplate <> inline OpenMesh::Vec3d e2o(const Eigen::Vector3d& v) { return OpenMesh::Vec3d(v[0], v[1], v[2]); }\r\ntemplate <> inline OpenMesh::Vec4d e2o(const Eigen::Vector4d& v) { return OpenMesh::Vec4d(v[0], v[1], v[2], v[3]); }\r\ntemplate <int N>    // convert elements in std::pair\r\ninline std::pair<OpenMesh::VectorT<double, N>, OpenMesh::VectorT<double, N>> e2o(const std::pair<Eigen::Matrix<double, N, 1, 0, N, 1>, Eigen::Matrix<double, N, 1, 0, N, 1>>& v_pair) {\r\n    return std::make_pair(e2o(v_pair.first), e2o(v_pair.second));\r\n}\r\ntemplate <int N>    // convert elements in std::vector\r\ninline std::vector<OpenMesh::VectorT<double, N>> e2o(const std::vector<Eigen::Matrix<double, N, 1>>& v_list) {\r\n    std::vector<OpenMesh::VectorT<double, N>> result;\r\n    result.reserve(v_list.size());\r\n    for (auto& v : v_list)\r\n        result.push_back(e2o(v));\r\n    return result;\r\n}\r\n\r\n// vector type conversion from OpenMesh to Eigen\r\ntemplate <int N>\r\ninline Eigen::Matrix<double, N, 1, 0, N, 1> o2e(const OpenMesh::VectorT<double, N>& v) {\r\n    Eigen::Matrix<double, N, 1, 0, N, 1> result;\r\n    for (int i = 0; i < N; ++i)\r\n        result[i] = v[i];\r\n    return result;\r\n}\r\ntemplate <> inline Eigen::Vector2d o2e(const OpenMesh::Vec2d& v) { return Eigen::Vector2d(v[0], v[1]); }\r\ntemplate <> inline Eigen::Vector3d o2e(const OpenMesh::Vec3d& v) { return Eigen::Vector3d(v[0], v[1], v[2]); }\r\ntemplate <> inline Eigen::Vector4d o2e(const OpenMesh::Vec4d& v) { return Eigen::Vector4d(v[0], v[1], v[2], v[3]); }\r\ntemplate <int N>    // convert elements in std::pair\r\ninline std::pair<Eigen::Matrix<double, N, 1, 0, N, 1>, Eigen::Matrix<double, N, 1, 0, N, 1>> o2e(const std::pair<OpenMesh::VectorT<double, N>, OpenMesh::VectorT<double, N>>& v_pair) {\r\n    return std::make_pair(o2e(v_pair.first), o2e(v_pair.second));\r\n}\r\ntemplate <int N>    // convert elements in std::vector\r\ninline std::vector<Eigen::Matrix<double, N, 1>> o2e(const std::vector<OpenMesh::VectorT<double, N>>& v_list) {\r\n    std::vector<Eigen::Matrix<double, N, 1>> result;\r\n    result.reserve(v_list.size());\r\n    for (auto& v : v_list)\r\n        result.push_back(o2e(v));\r\n    return result;\r\n}\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/push_back_util.h",
    "content": "#pragma once\r\nnamespace kt84 {\r\n    namespace internal {\r\n        template <class Container>\r\n        struct PushBackUtil {\r\n            PushBackUtil(Container& container) : container(container) {}\r\n            template <class Element>\r\n            PushBackUtil& operator<<(const Element& element) {\r\n                container.push_back(element);\r\n                return *this;\r\n            }\r\n        protected:\r\n            Container& container;\r\n        };\r\n    }\r\n    template <class Container>\r\n    inline internal::PushBackUtil<Container> push_back_util(Container& container) { return internal::PushBackUtil<Container>(container); }\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/safe_istream.h",
    "content": "#pragma once\r\n#include <boost/lexical_cast.hpp>\r\n\r\nnamespace kt84 {\r\n    namespace internal {\r\n        template <class IStream>\r\n        struct SafeIStream {\r\n            SafeIStream(IStream& is) : is(is) {}\r\n            template <typename T>\r\n            SafeIStream& operator>>(T& value) {\r\n                std::string value_str;\r\n                is >> value_str;\r\n                try {\r\n                    value = boost::lexical_cast<T>(value_str);\r\n                    fail_flag = false;\r\n                } catch (const boost::bad_lexical_cast&){\r\n                    fail_flag = true;\r\n                }\r\n                return *this;\r\n            }\r\n            bool fail() const { return fail_flag; }\r\n        private:\r\n            IStream& is;\r\n            bool fail_flag;\r\n        };\r\n    }\r\n    template <class IStream>\r\n    inline internal::SafeIStream<IStream> make_safe_istream(IStream& is) { return internal::SafeIStream<IStream>(is); }\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/triangle_util.h",
    "content": "#pragma once\r\n// Remember to add TRILIBRARY to the compiler's preprocessor definitions\r\n\r\nextern \"C\" {\r\n#define ANSI_DECLARATORS\r\n#define REAL double\r\n#define VOID void\r\n#include <triangle.h>\r\n#undef ANSI_DECLARATORS\r\n#undef REAL\r\n#undef VOID\r\n}\r\n\r\n#include <vector>\r\n\r\nnamespace kt84 {\r\n    namespace triangle_util {\r\n        inline void init(triangulateio& data) {\r\n            data.numberofpoints             = 0;\r\n            data.numberofpointattributes    = 0;\r\n            data.numberoftriangles          = 0;\r\n            data.numberofcorners            = 0;\r\n            data.numberoftriangleattributes = 0;\r\n            data.numberofsegments           = 0;\r\n            data.numberofholes              = 0;\r\n            data.numberofregions            = 0;\r\n            data.numberofedges              = 0;\r\n            data.pointlist                  = nullptr;\r\n            data.pointattributelist         = nullptr;\r\n            data.pointmarkerlist            = nullptr;\r\n            data.trianglelist               = nullptr;\r\n            data.triangleattributelist      = nullptr;\r\n            data.trianglearealist           = nullptr;\r\n            data.neighborlist               = nullptr;\r\n            data.segmentlist                = nullptr;\r\n            data.segmentmarkerlist          = nullptr;\r\n            data.holelist                   = nullptr;\r\n            data.regionlist                 = nullptr;\r\n            data.edgelist                   = nullptr;\r\n            data.edgemarkerlist             = nullptr;\r\n            data.normlist                   = nullptr;\r\n        }\r\n        inline void free(triangulateio& data) {\r\n            trifree(data.pointlist            );\r\n            trifree(data.pointattributelist   );\r\n            trifree(data.pointmarkerlist      );\r\n            trifree(data.trianglelist         );\r\n            trifree(data.triangleattributelist);\r\n            trifree(data.trianglearealist     );\r\n            trifree(data.neighborlist         );\r\n            trifree(data.segmentlist          );\r\n            trifree(data.segmentmarkerlist    );\r\n            //trifree(data.holelist             );          // Triangle never allocates memory for this field\r\n            //trifree(data.regionlist           );          // Triangle never allocates memory for this field\r\n            trifree(data.edgelist             );\r\n            trifree(data.edgemarkerlist       );\r\n            trifree(data.normlist             );\r\n        }\r\n        struct Format_node {\r\n            std::vector<double> pointlist;\r\n            std::vector<double> pointattributelist;\r\n            std::vector<int   > pointmarkerlist;\r\n        };\r\n        struct Format_ele {\r\n            int numberofcorners;\r\n            std::vector<int   > trianglelist;\r\n            std::vector<double> triangleattributelist;\r\n            Format_ele() : numberofcorners() {}\r\n        };\r\n        struct Format_poly {\r\n            Format_node node;\r\n            std::vector<int> segmentlist;\r\n            std::vector<int> segmentmarkerlist;\r\n            std::vector<double> holelist;\r\n            // TODO: region list\r\n        };\r\n        struct Format_edge {\r\n            std::vector<int> edgelist;\r\n            std::vector<int> edgemarkerlist;\r\n        };\r\n        inline void triangulate(const Format_poly& in_poly, Format_poly& out_poly, Format_ele& out_ele, Format_edge& out_edge, char* switches = \"pzQ\") {\r\n            triangulateio in, out;\r\n            init(in);\r\n            init(out);\r\n            \r\n            //----+\r\n            // IN |\r\n            //----+\r\n            // points\r\n            in.numberofpoints = in_poly.node.pointlist.size() / 2;\r\n            in.pointlist      = const_cast<double*>(&in_poly.node.pointlist[0]);\r\n            // point attributes\r\n            in.numberofpointattributes = in_poly.node.pointattributelist.size() / in.numberofpoints;\r\n            if (!in_poly.node.pointattributelist.empty())\r\n                in.pointattributelist = const_cast<double*>(&in_poly.node.pointattributelist[0]);\r\n            // point markers\r\n            if (!in_poly.node.pointmarkerlist.empty())\r\n                in.pointmarkerlist = const_cast<int*>(&in_poly.node.pointmarkerlist[0]);\r\n            // segments\r\n            in.numberofsegments = in_poly.segmentlist.size() / 2;\r\n            if (!in_poly.segmentlist.empty())\r\n                in.segmentlist = const_cast<int*>(&in_poly.segmentlist[0]);\r\n            // segment markers\r\n            if (!in_poly.segmentmarkerlist.empty())\r\n                in.segmentmarkerlist = const_cast<int*>(&in_poly.segmentmarkerlist[0]);\r\n            // holes\r\n            in.numberofholes = in_poly.holelist.size() / 2;\r\n            if (!in_poly.holelist.empty())\r\n                in.holelist = const_cast<double*>(&in_poly.holelist[0]);\r\n            \r\n            ::triangulate(switches, &in, &out, 0);\r\n            \r\n            //-----+\r\n            // OUT |\r\n            //-----+\r\n            // points\r\n            out_poly.node.pointlist.resize(2 * out.numberofpoints);\r\n            for (size_t i = 0; i < out_poly.node.pointlist.size(); ++i)\r\n                out_poly.node.pointlist[i] = out.pointlist[i];\r\n            // point attributes\r\n            out_poly.node.pointattributelist.resize(out.numberofpointattributes * out.numberofpoints);\r\n            for (size_t i = 0; i < out_poly.node.pointattributelist.size(); ++i)\r\n                out_poly.node.pointattributelist[i] = out.pointattributelist[i];\r\n            // point markers\r\n            if (out.pointmarkerlist != nullptr) {\r\n                out_poly.node.pointmarkerlist.resize(out.numberofpoints);\r\n                for (size_t i = 0; i < out_poly.node.pointmarkerlist.size(); ++i)\r\n                    out_poly.node.pointmarkerlist[i] = out.pointmarkerlist[i];\r\n            } else {\r\n                out_poly.node.pointmarkerlist.clear();\r\n            }\r\n            // segments\r\n            if (out.segmentmarkerlist != nullptr) {\r\n                out_poly.segmentlist.resize(2 * out.numberofsegments);\r\n                for (size_t i = 0; i < out_poly.segmentlist.size(); ++i)\r\n                    out_poly.segmentlist[i] = out.segmentlist[i];\r\n            } else {\r\n                out_poly.segmentlist.clear();\r\n            }\r\n            // segment markers\r\n            if (out.segmentmarkerlist != nullptr) {\r\n                out_poly.segmentmarkerlist.resize(out.numberofsegments);\r\n                for (size_t i = 0; i < out_poly.segmentmarkerlist.size(); ++i)\r\n                    out_poly.segmentmarkerlist[i];\r\n            } else {\r\n                out_poly.segmentmarkerlist.clear();\r\n            }\r\n            // triangles\r\n            out_ele.numberofcorners = out.numberofcorners;\r\n            out_ele.trianglelist.resize(out.numberofcorners * out.numberoftriangles);\r\n            for (size_t i = 0; i < out_ele.trianglelist.size(); ++i)\r\n                out_ele.trianglelist[i] = out.trianglelist[i];\r\n            // triangle attributes\r\n            out_ele.triangleattributelist.resize(out.numberoftriangleattributes * out.numberoftriangles);\r\n            for (size_t i = 0; i < out_ele.triangleattributelist.size(); ++i)\r\n                out_ele.triangleattributelist[i] = out.triangleattributelist[i];\r\n            // edges\r\n            if (out.edgelist != nullptr) {\r\n                out_edge.edgelist.resize(2 * out.numberofedges);\r\n                for (size_t i = 0; i < out_edge.edgelist.size(); ++i)\r\n                    out_edge.edgelist[i] = out.edgelist[i];\r\n            } else {\r\n                out_edge.edgelist.clear();\r\n            }\r\n            // edge markers\r\n            if (out.edgemarkerlist != nullptr) {\r\n                out_edge.edgemarkerlist.resize(out.numberofedges);\r\n                for (size_t i = 0; i < out_edge.edgemarkerlist.size(); ++i)\r\n                    out_edge.edgemarkerlist[i] = out.edgemarkerlist[i];\r\n            } else {\r\n                out_edge.edgemarkerlist.clear();\r\n            }\r\n            \r\n            free(out);\r\n        }\r\n        inline void triangulate(const Format_node& in_node, Format_ele& out_ele, char* switches = \"zQ\") {\r\n            Format_poly in_poly, out_poly;\r\n            Format_edge out_edge;\r\n            in_poly.node = in_node;\r\n            triangulate(in_poly, out_poly, out_ele, out_edge, switches);\r\n        }\r\n        inline void triangulate(const Format_poly& in_poly, Format_poly& out_poly, Format_ele& out_ele, char* switches = \"zQ\") {\r\n            Format_edge out_edge;\r\n            triangulate(in_poly, out_poly, out_ele, out_edge, switches);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/tw_util.h",
    "content": "#pragma once\r\n#include <cassert>\r\n#include <functional>\r\n#include <AntTweakBar.h>\r\n\r\nnamespace kt84 {\r\n    namespace tw_util {\r\n        // AddButton |\r\n        //-----------+\r\n        namespace internal {\r\n            inline void TW_CALL AddButton_sub(void *clientData) {\r\n                auto& func = *static_cast<std::function<void(void)>*>(clientData);\r\n                func();\r\n            }\r\n        }\r\n        inline int AddButton(TwBar *bar, const char *name, std::function<void(void)> func, const char *def) {\r\n            static const int buffer_size = 1000;\r\n            static std::function<void(void)> buffer[buffer_size];\r\n            static int counter = 0;\r\n            assert(counter < buffer_size);\r\n            buffer[counter] = func;\r\n            return TwAddButton(bar, name, internal::AddButton_sub, &buffer[counter++], def);\r\n        }\r\n        // AddVarCB |\r\n        //----------+\r\n        namespace internal {\r\n            template <typename T>\r\n            struct FuncPair {\r\n                std::function<void(const T&)> set_func;\r\n                std::function<void(      T&)> get_func;\r\n            };\r\n            template <typename T>\r\n            inline FuncPair<T> make_FuncPair(std::function<void(const T&)> set_func, std::function<void(T&)> get_func) {\r\n                FuncPair<T> result = { set_func, get_func };\r\n                return result;\r\n            }\r\n            template <typename T>\r\n            inline void TW_CALL AddVar_sub_set(const void *value, void *clientData) {\r\n                static_cast<FuncPair<T>*>(clientData)->set_func(*static_cast<const T*>(value));\r\n            }\r\n            template <typename T>\r\n            inline void TW_CALL AddVar_sub_get(void *value, void *clientData) {\r\n                static_cast<FuncPair<T>*>(clientData)->get_func(*static_cast<      T*>(value));\r\n            }\r\n        }\r\n        template <typename T>\r\n        inline int AddVarCB(TwBar *bar, const char *name, TwType type, std::function<void(const T&)> set_func, std::function<void(T&)> get_func, const char *def) {\r\n            static const int buffer_size = 1000;\r\n            static internal::FuncPair<T> buffer[buffer_size];\r\n            static int counter = 0;\r\n            assert(counter < buffer_size);\r\n            buffer[counter] = internal::make_FuncPair(set_func, get_func);\r\n            return TwAddVarCB(bar, name, type, internal::AddVar_sub_set<T>, internal::AddVar_sub_get<T>, &buffer[counter++], def);\r\n        }\r\n        // AddVarCB_default: default get func and custom func after default set func |\r\n        //---------------------------------------------------------------------------+\r\n        //template <typename T> // This doesn't work in Visual Studio 2012 probably because of a compiler bug... (search keyword: _VARIADIC_EXPAND_P1_0)\r\n        //inline int AddVarCB_default(TwBar *bar, const char *name, TwType type, T& client_value, std::function<void(void)> func_after_set, const char *def) {\r\n        //    return AddVarCB<T>(bar, name, type, [&](const T& value) { client_value = value; func_after_set(); },\r\n        //                                        [&](      T& value) { value = client_value; }, def);\r\n        //}\r\n        namespace internal {\r\n            template <typename T>\r\n            struct ValueFunc {\r\n                T* value;\r\n                std::function<void(void)> func;\r\n            };\r\n            template <typename T>\r\n            inline ValueFunc<T> make_ValueFunc(T& value, std::function<void(void)> func) {\r\n                ValueFunc<T> result = { &value, func };\r\n                return result;\r\n            }\r\n            template <typename T>\r\n            inline void TW_CALL AddVar_default_sub_set(const void *value, void *clientData) {\r\n                ValueFunc<T>& value_func = *static_cast<ValueFunc<T>*>(clientData);\r\n                *value_func.value = *static_cast<const T*>(value);\r\n                value_func.func();\r\n            }\r\n            template <typename T>\r\n            inline void TW_CALL AddVar_default_sub_get(void *value, void *clientData) {\r\n                *static_cast<T*>(value) = *static_cast<ValueFunc<T>*>(clientData)->value;\r\n            }\r\n        }\r\n        template <typename T>\r\n        inline int AddVarCB_default(TwBar *bar, const char *name, TwType type, T& client_value, std::function<void(void)> func_after_set, const char *def) {\r\n            static const int buffer_size = 1000;\r\n            static internal::ValueFunc<T> buffer[buffer_size];\r\n            static int counter = 0;\r\n            assert(counter < buffer_size);\r\n            buffer[counter] = internal::make_ValueFunc(client_value, func_after_set);\r\n            return TwAddVarCB(bar, name, type, internal::AddVar_default_sub_set<T>, internal::AddVar_default_sub_get<T>, &buffer[counter++], def);\r\n        }\r\n        // API with TW_TYPE_*** omitted for certain types\r\n        namespace internal {\r\n            template <typename T> struct ETwTypeT;\r\n            template <> struct ETwTypeT<bool  > { static const ETwType Value = TW_TYPE_BOOLCPP; };\r\n            template <> struct ETwTypeT<int   > { static const ETwType Value = TW_TYPE_INT32  ; };\r\n            template <> struct ETwTypeT<float > { static const ETwType Value = TW_TYPE_FLOAT  ; };\r\n            template <> struct ETwTypeT<double> { static const ETwType Value = TW_TYPE_DOUBLE ; };\r\n        }\r\n        template <typename T>\r\n        inline int AddVarCB(TwBar *bar, const char *name, std::function<void(const T&)> set_func, std::function<void(T&)> get_func, const char *def) {\r\n            return AddVarCB<T>(bar, name, internal::ETwTypeT<T>::Value, set_func, get_func, def);\r\n        }\r\n        template <typename T>\r\n        inline int AddVarCB_default(TwBar *bar, const char *name, T& client_value, std::function<void(void)> func_after_set, const char *def) {\r\n            return AddVarCB_default(bar, name, internal::ETwTypeT<T>::Value, client_value, func_after_set, def);\r\n        }\r\n        // little shortcut for for custom enums\r\n        template <typename T>\r\n        inline int AddVarCB(TwBar *bar, const char *name, const char *enum_type_name, std::function<void(const T&)> set_func, std::function<void(T&)> get_func, const char *def) {\r\n            return AddVarCB<T>(bar, name, TwDefineEnum(enum_type_name, 0, 0), set_func, get_func, def);\r\n        }\r\n        template <typename T>\r\n        inline int AddVarCB_default(TwBar *bar, const char *name, const char *enum_type_name, T& client_value, std::function<void(void)> func_after_set, const char *def) {\r\n            return AddVarCB_default(bar, name, TwDefineEnum(enum_type_name, 0, 0), client_value, func_after_set, def);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/ubuntu_workaround.h",
    "content": "#pragma once\r\n#ifdef _UNIX\r\n#include <pthread.h>\r\nnamespace { struct X { X() { pthread_getconcurrency(); } } x; }\r\n#endif\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/util.h",
    "content": "#pragma once\r\n#include <cmath>\r\n#include <cstdarg>\r\n#include <limits>\r\n#include <vector>\r\n#include <list>\r\n#include <string>\r\n#include <sstream>\r\n#include <boost/algorithm/string.hpp>\r\n#include <algorithm>\r\n#include <iostream>\r\n#include <random>\r\n#include <ctime>\r\n\r\nnamespace kt84 {\r\n\r\nnamespace util {\r\n    template <typename T> inline T lexical_cast(const std::string& str) {\r\n        T ret;\r\n        std::stringstream ss;\r\n        ss.str(str);\r\n        ss >> ret;\r\n        return ret;\r\n    }\r\n    template <typename T> inline void append_str(std::string& str, const T& value) {\r\n        std::stringstream ss;\r\n        ss << str << value;\r\n        str = ss.str();\r\n    }\r\n    template <typename T> inline T& incr_mod(T& value, const T& mod) { return value = (value + 1) % mod; }\r\n    template <typename T> inline T& decr_mod(T& value, const T& mod) { return value = (value + mod - 1) % mod; }\r\n    inline bool ensure_filename_extension(std::string& filename, const std::string& extension_including_period) {\r\n        auto n = extension_including_period.size();\r\n        if (!boost::iequals(filename.substr(filename.size() - n, n), extension_including_period)) {\r\n            filename += extension_including_period;\r\n            return false;\r\n        }\r\n        return true;\r\n    }\r\n    inline void flip_bool(bool& b) { b = !b; }\r\n    template <typename T> inline void update_if_bigger (T& val_current, const T& val_new) { if (val_current < val_new) val_current = val_new; }\r\n    template <typename T> inline void update_if_smaller(T& val_current, const T& val_new) { if (val_current > val_new) val_current = val_new; }\r\n    template <typename T> inline T clamp(const T& value, const T& range_min, const T& range_max) { return std::max<T>(std::min<T>(value, range_max), range_min); }\r\n    inline double asin_clamped(double sine)   { return std::asin(clamp(sine  , -1.0, 1.0)); };\r\n    inline double acos_clamped(double cosine) { return std::acos(clamp(cosine, -1.0, 1.0)); };\r\n    inline double pi() { return std::acos(-1); }\r\n    inline double dbl_max() { return std::numeric_limits<double>::max(); }\r\n    inline int    int_max() { return std::numeric_limits<int   >::max(); }\r\n    template <typename T> inline T squared(const T& value) { return value * value; }\r\n    template <typename T> inline T cubed(const T& value) { return value * value * value; }\r\n    template <typename T> inline T normalize(const T& value, const T& value_min, const T& value_max) { return (value - value_min) / (value_max - value_min); }\r\n    \r\n    // max/min of more than two inputs. this is already possible in C++11 using initializer lists, but unfortunately it's still unsupported in VC11.\r\n    template <typename T> inline T max(const T& arg0, const T& arg1, const T& arg2) { return std::max<T>(std::max<T>(arg0, arg1), arg2); }\r\n    template <typename T> inline T min(const T& arg0, const T& arg1, const T& arg2) { return std::min<T>(std::min<T>(arg0, arg1), arg2); }\r\n    template <typename T> inline T max(const T& arg0, const T& arg1, const T& arg2, const T& arg3) { return std::max<T>(max(arg0, arg1, arg2), arg3); }\r\n    template <typename T> inline T min(const T& arg0, const T& arg1, const T& arg2, const T& arg3) { return std::min<T>(min(arg0, arg1, arg2), arg3); }\r\n    template <typename T> inline T max(const T& arg0, const T& arg1, const T& arg2, const T& arg3, const T& arg4) { return std::max<T>(max(arg0, arg1, arg2, arg3), arg4); }\r\n    template <typename T> inline T min(const T& arg0, const T& arg1, const T& arg2, const T& arg3, const T& arg4) { return std::min<T>(min(arg0, arg1, arg2, arg3), arg4); }\r\n\r\n    // not so great with va_arg, but just for convenience...\r\n    template <typename T>\r\n    inline std::vector<T> make_vector(int size, ...) {\r\n        va_list args;\r\n        va_start(args, size);\r\n        std::vector<T> result;\r\n        result.reserve(size);\r\n        for (int i = 0; i < size; ++i)\r\n            result.push_back(va_arg(args, T));\r\n        va_end(args);\r\n        return result;\r\n    }\r\n    template <typename T>\r\n    inline std::list<T> make_list(int size, ...) {\r\n        va_list args;\r\n        va_start(args, size);\r\n        std::list<T> result;\r\n        for (int i = 0; i < size; ++i)\r\n            result.push_back(va_arg(args, T));\r\n        va_end(args);\r\n        return result;\r\n    }\r\n    template <typename T>\r\n    inline T simple_prompt(const std::string& name) {\r\n        T value;\r\n        std::cout << name << \":\";\r\n        std::cin >> value;\r\n        return value;\r\n    }\r\n    template <typename T>\r\n    inline T simple_prompt_array(const std::string& name, int n) {\r\n        T value;\r\n        std::cout << name << \":\";\r\n        for (int i = 0; i < n; ++i)\r\n            std::cin >> value[i];\r\n        return value;\r\n    }\r\n    template <typename T>\r\n    inline T simple_prompt(const std::string& name, const T& current_value) {\r\n        T value;\r\n        std::cout << name << \" (current=\" << current_value << \"):\";\r\n        std::cin >> value;\r\n        return value;\r\n    }\r\n    template <typename T>\r\n    inline void swap_pair(std::pair<T, T>& p) { std::swap(p.first, p.second); }\r\n    template <typename T>\r\n    inline bool is_pair_equal(const std::pair<T, T>& p1, const std::pair<T, T>& p2) {       // compare p1 and p2 while ignoring ordering\r\n        return p1.first == p2.first  && p1.second == p2.second ||\r\n               p1.first == p2.second && p1.second == p2.first;\r\n    }\r\n    inline std::mt19937& random_engine() {\r\n        static std::mt19937 engine(static_cast<unsigned int>(std::time(nullptr)));\r\n        return engine;\r\n    }\r\n    template <typename T>\r\n    T random_real(T range_min, T range_max) {   // range: [min, max)\r\n        static std::uniform_real_distribution<T> dist(0, 1);       // range: [0, 1)\r\n        T t = dist(random_engine());\r\n        return (1 - t) * range_min + t * range_max;\r\n    }\r\n    inline double random_double(double range_min, double range_max) { return random_real<double>(range_min, range_max); }\r\n    inline float  random_float (float  range_min, float  range_max) { return random_real<float >(range_min, range_max); }\r\n    template <typename T>\r\n    T random_integral(T range_min, T range_max) {               // range: [min, max]\r\n        return range_min + static_cast<T>(random_double(0, 1) * (range_max - range_min + 1));\r\n    }\r\n    inline int  random_int (int  range_min, int  range_max ) { return random_integral<int > (range_min, range_max); }\r\n    inline int  random_long(long range_min, long range_max ) { return random_integral<long> (range_min, range_max); }\r\n    inline void srand(unsigned long seed) {\r\n        random_engine().seed(seed);\r\n    }\r\n    template <typename T1, typename T2>\r\n    inline void unfold_pair(const std::pair<T1, T2>& p, T1& val1, T2& val2) { val1 = p.first; val2 = p.second; }\r\n    template <typename TEnum, typename TInt>\r\n    inline TEnum add_enum(const TEnum& e, TInt n) { return static_cast<TEnum>(static_cast<TInt>(e) + n); }\r\n    template <typename Value, typename IStream>\r\n    Value query_istream(IStream& stream) {\r\n        Value value;\r\n        stream >> value;\r\n        return value;\r\n    }\r\n}\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/kt84/zenity_util.h",
    "content": "#pragma once\r\n\r\n#include <cstdio>\r\n#include <sstream>\r\n#include <boost/lexical_cast.hpp>\r\n\r\nnamespace kt84 {\r\n\r\nnamespace {\r\n#ifdef _WIN32\r\n    inline FILE* popen(const char* command, const char* mode) { return _popen(command, mode); }\r\n    inline int pclose(FILE* file) { return _pclose(file); }\r\n#endif\r\n}\r\n\r\nnamespace zenity_util {\r\n    inline int call(std::string& result, const std::string& param) {\r\n        std::stringstream command;\r\n        command << \"zenity \" << param;\r\n        FILE* p = popen(command.str().c_str(), \"r\");\r\n        const int BUF_SIZE = 4096;\r\n        char buf[BUF_SIZE];\r\n        buf[0] = 0;\r\n        while (fgets(buf, BUF_SIZE, p) != nullptr) {}\r\n        \r\n        // remove '\\n' stored at the back of the buffer\r\n        int result_len = strlen(buf);\r\n        if (result_len > 0) buf[result_len - 1] = 0;\r\n        \r\n        result = buf;\r\n        \r\n        return pclose(p);\r\n    }\r\n    \r\n    // text entry\r\n    inline bool entry(\r\n        std::string& result,\r\n        const std::string& title      = \"\",\r\n        const std::string& text       = \"\",\r\n        const std::string& entry_text = \"\",\r\n        bool hide_text = false)\r\n    {\r\n        std::stringstream param;\r\n        param << \"--entry\";\r\n        \r\n        if (!title      .empty()) param << \" --title=\\\"\"       << title       << \"\\\"\";\r\n        if (!text       .empty()) param << \" --text=\\\"\"        << text        << \"\\\"\";\r\n        if (!entry_text .empty()) param << \" --entry-text=\\\"\"  << entry_text  << \"\\\"\";\r\n        if (hide_text) param << \" --hide-text\";\r\n        \r\n        return call(result, param.str()) == 0;\r\n    }\r\n    \r\n    // text entry for non-string type via boost::lexical_cast\r\n    template <typename T>\r\n    inline bool entryT(\r\n        T& result,\r\n        const std::string& title      = \"\",\r\n        const std::string& text       = \"\",\r\n        const T& init_value = T(),\r\n        bool hide_text = false)\r\n    {\r\n        std::stringstream param;\r\n        param << \"--entry\";\r\n        \r\n        if (!title      .empty()) param << \" --title=\\\"\"       << title       << \"\\\"\";\r\n        if (!text       .empty()) param << \" --text=\\\"\"        << text        << \"\\\"\";\r\n        if (hide_text) param << \" --hide-text\";\r\n        \r\n        std::string entry_text = boost::lexical_cast<std::string>(init_value);\r\n        param << \" --entry-text=\\\"\"  << entry_text  << \"\\\"\";\r\n        \r\n        std::string result_str;\r\n        if (call(result_str, param.str()))\r\n            return false;\r\n        \r\n        try {\r\n            result = boost::lexical_cast<T>(result_str);\r\n        } catch (const boost::bad_lexical_cast&) {\r\n            return false;\r\n        }\r\n        return true;\r\n    }\r\n    \r\n    // dialog box with OK button only\r\n    enum class MsgBoxType {\r\n        Error,\r\n        Warning,\r\n        Info,\r\n    };\r\n    inline void msgbox(\r\n        MsgBoxType type,\r\n        const std::string& title = \"\",\r\n        const std::string& text  = \"\",\r\n        bool no_wrap = false)\r\n    {\r\n        std::string result;\r\n        std::stringstream param;\r\n        param << \"--\" << (type == MsgBoxType::Error ? \"error\" : type == MsgBoxType::Warning ? \"warning\" : \"info\");\r\n        \r\n        if (!title.empty()) param << \" --title=\\\"\" << title << \"\\\"\";\r\n        if (!text .empty()) param << \" --text=\\\"\"  << text  << \"\\\"\";\r\n        if (no_wrap) param << \" --no-wrap\";\r\n        \r\n        call(result, param.str());\r\n    }\r\n    \r\n    // dialog box with OK/Cancel buttons\r\n    inline bool question(\r\n        const std::string& title        = \"\",\r\n        const std::string& text         = \"\",\r\n        const std::string& ok_label     = \"\",\r\n        const std::string& cancel_label = \"\",\r\n        bool no_wrap = false)\r\n    {\r\n        std::string result;\r\n        std::stringstream param;\r\n        param << \"--question\";\r\n        \r\n        if (!title       .empty()) param << \"        --title=\\\"\" << title        << \"\\\"\";\r\n        if (!text        .empty()) param << \"         --text=\\\"\" << text         << \"\\\"\";\r\n        if (!ok_label    .empty()) param << \"     --ok-label=\\\"\" << ok_label     << \"\\\"\";\r\n        if (!cancel_label.empty()) param << \" --cancel-label=\\\"\" << cancel_label << \"\\\"\";\r\n        if (no_wrap) param << \" --no-wrap\";\r\n        \r\n        return call(result, param.str()) == 0;\r\n    }\r\n    \r\n    // file selection\r\n    inline bool file_selection_load(\r\n        std::string& result,\r\n        const std::string& title       = \"\",\r\n        const std::string& filename    = \"\",\r\n        const std::string& file_filter = \"\",\r\n        bool directory = false,\r\n        bool multiple = false,\r\n        char separator = 0)\r\n    {\r\n        std::stringstream param;\r\n        param << \"--file-selection\";\r\n        \r\n        if (!title      .empty()) param << \"       --title=\\\"\" << title       << \"\\\"\";\r\n        if (!filename   .empty()) param << \"    --filename=\\\"\" << filename    << \"\\\"\";\r\n        if (!file_filter.empty()) param << \" --file-filter=\\\"\" << file_filter << \"\\\"\";\r\n        if (directory) param << \" --directory\";\r\n        if (multiple ) param << \"  --multiple\";\r\n        if (separator) param << \" --separator=\" << separator;\r\n        \r\n        return call(result, param.str()) == 0;\r\n    }\r\n    \r\n    inline bool file_selection_save(\r\n        std::string& result,\r\n        const std::string& title       = \"\",\r\n        const std::string& filename    = \"\",\r\n        const std::string& file_filter = \"\",\r\n        bool confirm_overwrite = true ,\r\n        bool directory         = false,\r\n        bool multiple          = false,\r\n        char separator = 0)\r\n    {\r\n        std::stringstream param;\r\n        param << \"--file-selection --save\";\r\n        \r\n        if (!title      .empty()) param << \"       --title=\\\"\" << title       << \"\\\"\";\r\n        if (!filename   .empty()) param << \"    --filename=\\\"\" << filename    << \"\\\"\";\r\n        if (!file_filter.empty()) param << \" --file-filter=\\\"\" << file_filter << \"\\\"\";\r\n        if (confirm_overwrite) param << \" --confirm-overwrite\";\r\n        if (directory        ) param << \" --directory\";\r\n        if (multiple         ) param << \" --multiple\";\r\n        if (separator) param << \" --separator=\" << separator;\r\n        \r\n        return call(result, param.str()) == 0;\r\n    }\r\n    \r\n    // scale bar\r\n    inline bool scale(\r\n        int& result,\r\n        const std::string& title = \"\",\r\n        const std::string& text  = \"\",\r\n        int value       =   0,\r\n        int min_value   =   0,\r\n        int max_value   = 100,\r\n        int step        =   1,\r\n        bool hide_value = false)\r\n    {\r\n        std::string result_str;\r\n        std::stringstream param;\r\n        param << \"--scale\";\r\n        if (!title.empty()) param << \" --title=\\\"\" << title << \"\\\"\";\r\n        if (!text .empty()) param << \" --text=\\\"\"  << text  << \"\\\"\";\r\n        param << \"     --value=\" << value    ;\r\n        param << \" --min-value=\" << min_value;\r\n        param << \" --max-value=\" << max_value;\r\n        param << \"      --step=\" << step     ;\r\n        if (hide_value) param << \" --hide-value\";\r\n        \r\n        if (call(result_str, param.str()))\r\n            return false;\r\n        \r\n        result = boost::lexical_cast<int>(result_str);\r\n        return true;\r\n    }\r\n    \r\n    // reporting with text box\r\n    inline void text_info(\r\n        std::string& result,\r\n        const std::string& title    = \"\",\r\n        const std::string& filename = \"\",\r\n        bool editable = false)\r\n    {\r\n        /// TODO\r\n    }\r\n    \r\n    //--calendar\r\n    //--list\r\n    //--notification\r\n    //--progress\r\n}\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/README.txt",
    "content": "Introduction\n------------\nWhat is lp_solve and what is it not?\nThe simple answer is, lp_solve is a Mixed Integer Linear Programming (MILP) solver.\n\nIt is a free (see LGPL for the GNU lesser general public license) linear (integer) programming solver\nbased on the revised simplex method and the Branch-and-bound method for the integers.\nIt contains full source, examples and manuals.\nlp_solve solves pure linear, (mixed) integer/binary, semi-continuous and\nspecial ordered sets (SOS) models.\n\nSee the reference guide for more information.\n\n\nlp_solve 5.5\n------------\n\nWhy a jump from version numbers 5.1 to 5.5 ?\nThis is done to indicate that this is more than just another update.\nThe solver engine was revised and optimised in such a way that performance has improved considerably.\nNumerical stability is also better resulting in more models that can be solved.\nThe LUSOL bfp is now also the default. In the past, the etaPFI bfp package was the default,\nbut for larger models this leads faster to numerical instabilities and performance problems.\n\nOverall, the v5.5 code is faster and more robust than v5.1.\nThis robustness is for example proven by the fact that many more models can now be solved even without scaling.\n\nThe API hasn't changed very much.\nThere are a couple of new routines and one routine has an extra argument.\nSome constants got new values.\n\n    * Fundamental internal change to the solver engine resulting in better performance and numerical stability.\n      Both the LP solver and the B&B solvers are enhanced.\n    * Optimised MILP branch truncation, with reduced cost fixing.\n    * LUSOL bfp is now the default.\n    * Presolve is improved in functionality and performance.\n    * Better handling of degeneracy, with more options.\n    * Store and read options from a file make it easier to set options.\n    * Partial pricing for the primal simplex now works.\n    * Full support for xli_ZIMPL v2.0.3.\n    * The objective function is no longer stored as part of the constraint matrix.\n    * Dual-long step code is in place, but not fully activated yet.\n    * General code cleanup.\n    * Added OBJSENSE and OBJNAME headers in the free MPS format (See MPS file format).\n    * The MathProg xli driver has now the ability to generate a model.\n    * New API routines\n\nStart by taking a look at 'Changes compared to version 4', 'Changes from version 5.1 to version 5.5'\nand 'lp_solve usage'\nThis gives a good starting point.\n\n\nBFP's\n-----\n\nBFP stands for Basis Factorization Package, which is a unique lp_solve feature.  Considerable\neffort has been put in this new feature and we have big expectations for this. BFP is a generic\ninterface model and users can develop their own implementations based on the provided templates.\nWe are very interested in providing as many different BFPs as possible to the community.\n\nlp_solve 5.5 has the LUSOL BFP built in as default engine.  In addition two other\nBFPs are included for both Windows and Linux: bfp_etaPFI.dll, bfp_GLPK.dll for Windows and\nlibbfp_etaPFI.so, libbfp_GLPK.so for Linux.  The bfp_etaPFI includes\nadvanced column ordering using the COLAMD library, as well as better pivot management for\nstability.  For complex models, however, the LU factorization approach is much better, and\nlp_solve now includes LUSOL as one of the most stable engines available anywhere.  LUSOL was\noriginally developed by Prof. Saunders at Stanford, and it has now been ported to C\nand enhanced by Kjell.\n\nIf you compile BFPs yourself, make sure that under Windows, you use __stdcall convention and\nuse 8 byte alignments.  This is needed for the BFPs to work correctly with the general\ndistribution of lp_solve and also to make sharing BFPs as uncomplicated as possible.\n\nSee the reference guide for more information.\n\n\nXLI's\n-----\n\nXLI stands for eXternal Language Interface, also a unique lp_solve feature. XLI's are stand-alone\nlibraries used as add-on to lp_solve to make it possible to read and write lp models in a format\nnot natively supported by lp_solve. Examples are CPLEX lp format, LINDO lp format, MathProg format,\nXML format...\n\nSee the reference guide for more information.\n\n\nlpsolve API\n-----------\n\nDon't forget that the API has changed compared to previous versions of lpsolve and that you just\ncan't use the version 5 lpsolve library with your version 4 or older code.  That is also the\nreason why the library is now called lpsolve55.dll/lpsolve55.a.  lpsolve55.dll or lpsolve55.a are\nonly needed when you call the lpsolve library via the API interface from your program.\nThe lp_solve program is still a stand-alone executable program.\n\nThere are examples interfaces for different language like C, VB, C#, VB.NET, Java,\nDelphi, and there is now also even a COM object to access the lpsolve library.  This means that\nthe door is wide-open for using lp_solve in many different situations.  Thus everything that is\navailable in version 4 is now also available in version 5 and already much more!\n\nSee the reference guide for more information.\n\n\nConversion between lp modeling formats\n--------------------------------------\n\nNote that lp2mps and mps2lp don't exist anymore. However this functionality is now implemented\nin lp_solve:\n\nlp2mps can be simulated as following:\nlp_solve -parse_only -lp infile -wmps outfile\n\nmps2lp can be simulated as following:\nlp_solve -parse_only -mps infile -wlp outfile\n\n\nvia the -rxli option, a model can be read via an XLI library and via the -wxli option, a model\ncan be written via an XLI library.\n\n\nHow to build the executables yourself.\n---------------------------------------\n\nAt this time, there are no Makefiles yet. However for the time being, there are batch files/scripts\nto build. For the Microsoft compiler under Windows, use cvc6.bat, for the gnu compiler under Windows,\nuse cgcc.bat and for Unix/Linux, use the ccc shell script (sh ccc).\n\nSee the reference guide for more information.\n\n\nIDE\n---\n\nUnder Windows, there is now also a very user friendly lpsolve IDE. Check out LPSolveIDE\n\nSee the reference guide for more information.\n\n\nDocumentation (reference guide)\n-------------------------------\n\nSee lp_solve55.chm for a Windows HTML help documentation file.\nThe html files are also in lp_solve_5.5_doc.tar.gz. Start with index.htm\nAlso see http://lpsolve.sourceforge.net/ for a on-line documentation\n\n\nChange history:\n---------------\n\n17/05/05 version 5.5.0.0\n- Beta release of version 5.5\n\n??/??/05 version 5.5.0.1\n- ?\n\n26/06/05 version 5.5.0.2\n- ?\n\n29/06/05 version 5.5.0.3\n- ?\n\n16/08/05 version 5.5.0.4\n- There are no API changes\n- The LUSOL message routine could generate a crash under some cicumstances. Fixed\n- A crash could occur when building the model in add_row_mode. Fixed.\n- write_params didn't write the PRESOLVE and PRESOLVELOOPS correctly. Fixed.\n- write_params didn't write constants with value 0. Fixed.\n- The library did not compile under msdev 2002 (VC 7.0 _MSC_VER 1300). Fixed.\n- There were some problems with printing long long variables which could generate a crash. Fixed.\n- An overflow error could occur because memory was sometimes overwritten. Fixed.\n- Presolve routines are revised. They are again improved and made faster.\n  Also some problems with it are fixed (possible crashes).\n- Solver revised. Again made faster and more stable.\n- get_row/get_column returned FALSE if the row/column is empty. Fixed.\n- get_rowex/get_columnex now returns -1 if and error is detected. This instead of 0.\n  This to know the distinction between an empty row/column and an error.\n- set_bounds had a possible problem when min and max are equal. Fixed.\n- A crash/damage error could occur when rows/columns are added after a solve. Fixed.\n- The my_chsign macro in lp_types.h gave warnings with some compilers. Fixed.\n- The lp_solve program now returns 255 if an unexpected error occurs. Before this was 1\n  But this interferes with the lpsolve library return codes.\n- With the lp_solve program, debug and print modes were not written correctly in a\n  specified parameter file. Fixed.\n- With the lp_solve program, presolveloops was not set correctly. Fixed.\n\n17/09/05 version 5.5.0.5\n- In some cases, SOS restrictions were not optimized till optimality. Fixed.\n- Presolve sometimes generated 'Column -xxx out of range during presolve' with a possible crash.\n- Presolve sometimes removed integer and/or semi-cont variables that should not be deleted. Fixed.\n- B&B sometimes didn't find the most optimal solution. Fixed.\n- Internal constant COMP_EQUAL renamed to COMP_PREFERNONE because this could interfere with a define\n  in the standard header files.\n- The lp parser had problems with variables starting with INF and there is a + or - sign just before it.\n  Fixed.\n- Added options -presolvem, -presolvefd, -presolvebnd, -presolved, -presolveslk\n- Updated documentation. put_bb_branchfunc, put_bb_nodefunc, set_epslevel, dualize_lp, set_basisvar\n\n16/11/05 version 5.5.0.6\n- set_add_rowmode should not be called after a solve. There is now a test in this routine when this is\n  done and it then returns FALSE.\n- When an empty string (\"\") as filename is provided to set_outputfile, then output is completely\n  ignored.\n- In some cases, SOS models did not solve to their most optimal solution.\n- There was as problem with get_sensitivity_objex. Calling it (sometimes only after multiple times)\n  resulted in protection errors/core dumps.\n- When a model has no constraints, it did not solve most of the times.\n- column_in_lp didn't work anymore.\n- Large upper bounds could make the model unstable. A change was made to fix this.\n- set_improve could let crash the model.\n- lp_params.c used the non-ANSI function unlink(). Changed to ANSI function remove().\n- Presolve is again revised considerably.\n- SOS handling is improved when there are a lot of SOS constraints.\n- Limited constraint-to-SOS1 presolve to constraints with at least 4 variables.\n- Limited bound tightening presolve loops.\n\n12/02/06 version 5.5.0.7\n- When SOS restrictions are added after a previous solve, a crash could occur.\n- Optimized renaming a variable when the new name is equal to the old name.\n- A possible crash could occur when presolve was enabled\n- The constant ANTIDEGEN_DEFAULT is changed. ANTIDEGEN_INFEASIBLE is removed from it.\n  This constant should not be used unless you have some very tight and hard to solve\n  models where the optimal solution numerically straddles infeasibility.\n- There was a possible problem with set_row(ex). It sometimes wrongfully changed the row.\n- When integer variables were scaled, it could happen that because of rounding errors,\n  a loop was created.\n- Sometimes integer models kept on looping in the B&B algorithm.\n- A memory overrun could occur when an initial basis is set. This when variable names\n  are in Rnnn format and constraint names in Cnnn format.\n- Some fixes are made in presolve.\n- On 64-bit systems, compiler warnings were given and some code worked wrong resulting in\n  wrong results.\n- lp_solve.c didn't compile with some compilers because if a very deep nested if statement.\n- The distributed files now have the version number include in the filename.\n  For example lp_solve_5.5.0.7_exe.zip\n  This for a possible move to SourceForge in the (near?) future.\n- When illegal bounds are specified in the MPS format (lower bound larger than upper bound)\n  then a warning was given but the illegal bound was just ignored and the model was solved.\n  This resulted in a solution that did not comply to the original model. Now the message is\n  seen as an error and solving is aborted.\n\n\n06/09/06 version 5.5.0.8\n- When presolve is active and columns are removed and there are SOS constraints, then presolve\n  had an error which could result in hanging while solve or maybe wrong solutions.\n- set_row(ex) set wrong values when used after a previous solve and scaling is active.\n- disabled PRESOLVE_REDUCEMIP since it is very rare that this is effective, and also that it adds\n  code complications and delayed presolve effects that are not captured properly.\n- made routine guess_basis available for all languages (now exported by the dll).\n  The routine is now also documented.\n- some bug corrections in guess_basis.\n- Corrected a problem with add_column(ex) when add_rowmode is enabled.\n- write_lp now wraps long lines over multiple lines to make it more readable.\n- A compilation warning/error sometimes occured on is_fixedvar in lp_lusol.c with some compilers.\n- Added options -wxlisol and -wxlisolopt to lp_solve program to write a solution file for those\n  XLIs that support it.\n- Updated CPLEX XLI to support constants in objective.\n- Added documentation on infeasible models, guess_basis, DIMACS models, CPLEX format, Zimpl, GNU Mathprog.\n  Corrected/updated documentation on get_col_name, get_row_name, get_nameindex, write_xli,\n  External Language Interfaces.\n- The mps reader was improved for the rarely cases where the same elements are provided multiple\n  times. These are now added.\n- Revised the java unittest example because it gave some errors that it shouldn't give.\n\n07/10/06 version 5.5.0.9\n- set_row(ex) could sometimes set wrong values in the model.\n- Sometimes models with semi-cont variables which are also integer and scaling is active, a solution\n  was returned that is not most optimal or it returns infeasible.\n- write_mps didn't write semi-cont variables with an infinite upper bound.\n- When presolve can solve the model on its own and objective direction is maximize then a wrong sign\n  was shown in the reported price on screen.\n- write_lp writes constraint and bounds in the same way if a constraint is not named. If a constraint\n  only has one variable then it looks like a bound. This can give problems because when a constraint\n  is interpreted as bound and it is negative then the problem definition changes.\n  Therefore a constraint which is not named and having only one variable in it is getting a name to\n  make sure it is interpreted as a constraint.\n- The lp_solve program didn't interprete the PRESOLVED solve return code very well. Fixed.\n- bfp_GLPK and xli_MathProg are now compiled against GLPK 4.11\n- When an integer model is aborted before the most optimal solution is found (timeout or\n  break at first, ...) solve returned OPTIMAL (0) instead of SUBOPTIMAL (1). This is now corrected.\n\n14/01/07 version 5.5.0.10\n- If a model has integer variables, but the model is already integer optimal in the simplex fase,\n  then it was reported as suboptimal feasible.\n- get_objective, get_variables, get_ptr_variables, get_constraints, get_ptr_constraints, get_primal_solution\n  reported 'not a valid basis' when presolve is active and the model is entirely solved by presolve.\n- presolve on a model with SOS variables sometimes went wrong.\n- presolve on a model with SOS variables where infeasibility is detected crashed.\n- read_bas could fail when not all constraints had names or had names like default variable names.\n- A crash could occur with set_row(ex) in rowmode.\n- The lp format has been extended with a free section to define free variables.\n- bfp_GLPK and xli_MathProg are now compiled against GLPK 4.13\n- fixed bug in the pseudocost logic that can blow up subsequent pseudocost values in that\n  branch and make them almost random.\n- In some rare cases a memory overrun could occur when constraints are added after a previous solve.\n- Made the copy_lp routine work. Note that information about the optimisation of the original model\n  is not copied (at this time). Only the model is.\n- Fixed a bug in the hashing routines that had only influence in some rare cases in the\n  MATLAB, O-Matrix, Scilab, Octave, Python drivers.\n- coldual sometimes worked on a uninitialised variable value with unpredictable results.\n\n27/12/07 version 5.5.0.11\n- Fixed a problem in presolve. Sometimes an array-index-out-of-bounds error occured.\n- Added a makefile for Linux.\n- When adding constraints, in some rare cases a memory overrun could occur resulting in a crash.\n- add_constraintex with count=0 and row=colno=NULL gave a protection error.\n  several XLIs didn't work anymore because of this.\n- set_constr_type sometimes set wrong signs for the coefficient matrix when add_rowmode is on.\n- presolve did an unnecessary extra loop. Also a test is added to stop presolve when very few\n  changes are done.\n- for very large models, a request of much more memory than is reasonable could occur. Fixed.\n- Modified LINDO XLI to read keywords also not at column 1 and to accept an empty objective function.\n  Previously this wat not possible.\n- In some rare cases, numbers very close to their integer values (for example 11276.999999999998)\n  were truncated to their ceiling value (for example 11276) instead of rounded\n  (for example 11277).\n- Solved a problem with presolve with an all-int constraint.\n- Solved a problem with presolve coldominate\n- Added stronger checking of the MPS format.\n  Fields that must be blank are now also tested accordingly so that if data is there that it is\n  not ignored as before.\n- FREE MPS format was not read ok if row/column name were all numbers\n  or a FR, MI, PL, BV bound was defined. Fixed.\n- The lp-format now also supports a bin(ary) section to define binary variables.\n- When an integer model is aborted before the most optimal solution is found\n  via break at first or break at value, solve returned OPTIMAL (0) instead of SUBOPTIMAL (1).\n  This is now corrected. Problem occured in version 5.5.0.10\n- Fixed a problem with del_constraint. Constraints names were not shifted and reported variable result was incorrect.\n- read_XLI failed with MathProg if datamodel was provided with \"\" when there is no datamodel.\n  NULL was expected in the past. \"\" is now also accepted.\n- Added an XLI to read Xpress lp files.\n- Added routines MPS_writefileex, write_lpex.\n- Added options -o0, -o1 to lp_solve command driven program to specify if objective is in basis or not.\n- Added new information in the reference guide:\n   - Linear programming basics\n   - Presolve\n   - Xpress lp files\n\n04/01/08 version 5.5.0.11\n- There was an error in the lp-parser resulting is misreading the model in many cases. This was fixed in the existing release and an update of following files is posted:\n    lp_solve_5.5.0.11_exe.tar.gz\n    lp_solve_5.5.0.11_dev.tar.gz\n    lp_solve_5.5.0.11_source.tar.gz\n    lp_solve_5.5.0.11_exe.zip\n    lp_solve_5.5.0.11_dev.zip\n\n13/03/08 version 5.5.0.12\n- When NODE_RCOSTFIXING (bound tightening during B&B) (enabled by default) was enabled some models were not solved\n  to optimality.\n- In following situation a (sub-optimal) solution was returned while no integer\n  solution isn't found yet at this time.\n   - The model contains integers\n   - A break at first is set\n   - A timeout is set\n   - The timeout occurs before a first integer solution is found\n   - When the timeout occurs, the simplex algorithm is in phase 2 and has a feasible (but non-integer) solution, but not optimal yet.\n- If an integer solution is found with the same objective value as the relaxed solution then\n  B&B is stopped. However this resulted in a report of a SUBOPTIMAL solution while this is not true.\n  The found solution is then optimal.\n- On 64-bit Linux systems crashes occured when information is printed via variable argument routines.\n- There was a warning about redefinition of MAXINT32, MAXUINT32, MAXINT64, MAXUINT64 when compiled\n  with MS Visual C 2008.\n- The reference guide now also contains the Java documentation.\n\n03/08/08 version 5.5.0.13\n- The code should now completely be reentrant and thread safe.\n  Especially the lp-parser, but also the solver code itself used static variables which made it\n  not reentrant.\n  The lp parser code has changed considerably for this. Also the lex and yacc code had to be made\n  reentrant. This is only tested with GNU flex and bison. Not with lex and yacc.\n  This should be no problem since the corresponding c files are included with the source so people\n  don't have to build these themselves.\n- commonlib.c/h were also under BFP/BFP_LUSOL/LUSOL while a more advanced version is also\n  under the shared directory. The one from LUSOL is removed.\n- If objective coefficients are all integer and the columns are integer or objective coefficients\n  are zero, then B&B can stop when the objective function equals ceil/floor(real objective)\n  which results in a faster solving process. This did not work anymore and is now fixed.\n- The lpsolve IDE is now also on sourceforge (previously it was a link to another site).\n  Also the sources are included.\n\n02/02/09 version 5.5.0.14\n- The lp format now allows spaces between the row label and the colon.\n- Added better error handling in the copy_lp API\n- Timeout in a MIP model sometimes resulted in an endless loop\n- Revised isnan call for gnu compilers\n- Removed some extra static variables for better reentrance support.\n- REPORT_Objective now reports large objective values (>1e-5) with better precision\n- On Windows the binaries are again compiled with compiler optimization /O2 for better performance.\n- Compiled and tested on Windows and Linux 64-bit. 64-bit binaries are now provided.\n  Changed project files and compile scripts for 64-bit compilation.\n  Binaries are now located in a subdirectory bin\\platform\n- Added PHP driver so that lpsolve can be called from PHP\n- When an MPS file is created, upper bounds were written before lower bounds.\n  Now it is the other way around. First lower bounds and then upper bounds.\n- The MPS reader could not handle negative lower bounds where the lower bound was specified after the upper bound.\n- The MPS write now writes the implicit lower bound of zero if the variable has no lower bound and it is integer.\n  This to make sure that other solvers (like CPLEX) interprete the variable as integer and not binary.\n- The LINDO XLI parser interpreted negative lower and upper bounds as positive\n- Added the option -stat to the lp_solve driver program. It prints statistics of the model like number of\n  rows/columns used and smalled and largest value in objective, RHS and coefficient matrix.\n- Added the option -plp to the lp_solve driver program. It prints the model via the print_lp API function.\n\n09/09/09 version 5.5.0.15\n- Improved guess_basis\n- set_row(ex) corrections. Actually completely revised the routine.\n  Sometimes the matrix was corrupted after the call.\n- When in set_add_row mode, all API calls can now be used. For example printing or writing the model,\n  retrieving data from the model and so on are now all possible in that mode.\n  Will help greatly when debugging your models.\n- Sometimes an integer model is reported infeasible while it isn't because the integer solution\n  is much different from the relaxed (real) model. Then API call set_bb_depthlimit can be used\n  to increase the default B&B depth. However its new value was not used for the depth limit of an\n  individual variabled which could result in still infeasible results.\n- modified the demo program not to use the str_ versions of API calls, because they are not\n  performant and not intended to be used in real programs.\n- Added an lpsolve driver to Sysquake.\n- Added an lpsolve driver to FreeMat.\n- Added an lpsolve driver to Euler.\n- Added an Access example.\n- Added documentation to use lpsolve from Sage via the existing Python driver.\n- Changed the second parameter to read_mps, read_MPS, read_freemps and read_freeMPS from verbose to options.\n  These routines now supports via this options parameter the native IBM interpretation of\n  integer variables and allows to negate the objective constant.\n  This is also supported by the lp_solve command line program via the -mps_ibm and -mps_negobjconst options.\n  This is also supported by the IDE in the options tab.\n- Removed read_LPhandle and read_MPShandle from the lprec structure.\n  On their place there is now read_LP and read_MPS.\n  The handle functions are not usable anyway under windows as dll because the FILE structure\n  is searched in the dll space and therefore not working.\n  read_LP and read_MPS work on the file name and always work.\n  Since these handle routines were not documented anyway and the lp structure should not be\n  accessed by applications (except XLI and BFP drivers) this change should not give any (compatibility) problem at all.\n- write_lp/write_LP write just a + or - if the factor to a variable is +1 or -1\n  However when the number was not exactly one, for example 1.0000000000001, then the test\n  on equal to one gave false, but the writing was a 1 because only 12 significant digits are written.\n  The result was that the 1 was written in that case. Not an error, but when lp files are compared,\n  this is enoying. Now this is solved. When a +1 or -1 would be written then alyways only + and -\n  is written and +1 or -1 will never occur again.\n- When a message function is set via put_msgfunc,\n  in message MSG_LPOPTIMAL it was not possible to get the solution. Now it is.\n  Also when messages MSG_MILPFEASIBLE, MSG_MILPBETTER, MSG_MILPEQUAL were catched the\n  returned solution was the one from the previous MIP solution. This is now also fixed.\n  With this fix, the IDE now also shows the relaxed solution (column LP Optimal).\n- Extended the MATLAB, O-Matrix, Scilab, Octave, Python, PHP and of course the new\n  Sysquake, FreeMat and Euler drivers to support string constants. See the reference guide.\n- Compiled and tested lpsolve on MAC OSX 10.4.8 (Intel). Compilation scripts for this platform\n  were added and revised and binaries are provided to download.\n- Revised the c# and vb.net lpsolve code to pass arrays back and forth to the dll to make it also work on 64 bit systems.\n- IDE enhancements:\n      - Can talk to the lpsolve55.dll large address aware version so access to 3.4G 32 bit memory.\n      - Can write and read lp_solve parameter files ( type .lpi) via Options, Solver params, so\n        it is easy to save a readable file of parameters for a particular problem class when it is found.\n        The file can then be collected by the -rpar exe param or the read_params() API.\n      - Added Options, Reset to solver defaults to go back to all lp_solve defaults.\n      - Added in Help a link to the online help files.\n      - Resized the help, main and statistics windows for Vista.\n      - Added the Xpress XLI to the setup.\n      - Use the latest dlls, especially lpsolve55.dll, in the setup.\n      - Added the two new MPS options for IBM integer variables and negate objective constant.\n      - Added the option to ignore integer restrictions.\n17/09/09 version 5.5.0.15b\n- objfrom values where not correct if scaling is active.\n  Routine to calculate these values and the objective from-till values is revised\n  and made a bit more performant.\n- write_lp did not write all column data. For objective function and constraints.\n\n28/10/09 version 5.5.1.0\n- In some cases with a model with integer variables lp_solve did not find the most optimal solution. Fixed.\n- The reported relative gap for the optimal solution was not always ok.\n- Sensitivity on a zero upper bounded variable was not calculated. Now it is.\n\n08/03/10 version 5.5.1.2\n- When there are integer variables in the model then sensitivity is not correct.\n\n12/08/10 version 5.5.2.0\n- add_SOS did a wrong test when SOS type is bigger than 2 if this SOS is allowed in lp_solve. Fixed\n- new and improved MIP_stepOF function to find integer solutions.\n- fixes in set_row.\n- replaces code\n   w *= 2*lp->is_lower[i] - 1;\n  by\n   w = my_chsign(!lp->is_lower[i], w);\n  because the old failed on AIX\n  Also changed the definition of my_chsign in lp_types.h in the same way.\n- Added the option -BR in the lp_solve driver program to select branch rule NODE_PSEUDORATIOSELECT\n- lpsolve.pas updated for Delphi 2009.\n- Python driver updated to allow also to provide numpy arrays to the lpsolve driver.\n- xli_MathProg is now compiled against glpk 4.44 meaning that it now supports the MathProg Tables feature\n  as described in http://www.cs.unb.ca/~bremner/docs/glpk/tables.pdf\n  csv, ODBC and MySQL are supported on all platforms.\n- Added MSF support. MSF (Microsoft Solver Foundation) is a microsoft .NET library to access solvers via an OO way\n  MSF has a default lpsolve driver, but the one on the sourceforge site is enhanced in functionality and performance.\n  There is also documentation in the lpsolve reference guide.\n\nWe are thrilled to hear from you and your experiences with this new version. The good and the bad.\nAlso we would be pleased to hear about your experiences with the different BFPs on your models.\n\nPlease send reactions to:\nPeter Notebaert: lpsolve@peno.be\nKjell Eikland: kjell.eikland@broadpark.no\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/bfp/bfp_LUSOL/LUSOL/LUSOL-overview.txt",
    "content": "            Notes for Contribution of LUSOL to COIN-OR\n                            May 2004\n\nIntroduction\n============\n\nLUSOL maintains sparse LU factors of a square or rectangular sparse matrix.  It includes a Basis Factorization Package (BFP) suitable for implementing simplex and reduced-gradient methods for optimization.  It is a set of  routines written in ANSI C (adapted from the original Fortran 77 version).\n\nLUSOL includes the following features:\n\n-  A Markowitz-based sparse LU factorization for square,\n   rectangular and possibly singular matrices.\n\n-  Three options for balancing sparsity and stability:\n   Threshold Partial/Rook/Complete Pivoting (TPP, TRP, TCP).\n\n-  Rank-revealing properties.  TRP and TCP are intended for detecting singularities.\n\n-  Dynamic storage allocation (C version only).\n\n-  Stable column replacement as in the method of Bartels and Golub.\n\n-  Other stable updates: add, replace, or delete row or column\n   (currently F77 version only).\n\n-  Implementation into an easy-to-use BFP API (C version only).\n\n\nImplementation\n==============\n\nThe Factor routine is similar to the classical Markowitz routines MA28 and LA05 in the Harwell Subroutine Library. The source matrix nonzeros are stored column-wise with the largest entry at the top of each column.  Internally, the structure is also accessible row-wise.  All entries in a particular column or row are held in contiguous storage.  Fill is accommodated by moving a column or row to the beginning of free storage. Occasional compressions recover storage.  This scheme is effective for column-oriented TPP.  When the remaining matrix reaches a specified density, the factors are completed using dense processing.\n\nTRP uses an additional vector of storage to maintain the largest element in each remaining row.\n\nTCP uses a heap structure to hold the largest element in each column.  The largest element in the remaining matrix is then available at the top of the heap.\n\nThe final L is stored column-wise (and never changed).  The final U is stored row-wise as a triangular or trapezoidal sparse matrix.\n\nColumn replacements are implemented using a forward sweep of 2-by-2 stabilized elimination matrices.  L is updated in product form.  U is updated explicitly.\n\nThe other updates use either forward or backward sweeps. They tend to generate more nonzeros than column replacement.\n\nBoth the F77 and C versions contain extensive comments, method and implementational information as part of the code.\n\nThe C version contains a record-based wrapper for the data.  Function calls have been simplified by including references to this structure.  New maintenance routines enable dynamic instance creation and destruction, and  simplifies access to the most frequently used functions.  The LUSOL C library is multi-instance and fully re-entrant.  All control and output parameters have been given long descriptive names for usability. \n\n\nBenefits\n========\n\nRank-revealing properties and rectangular factors (and updates) have not previously been available in sparse LU software.  With sensible parameter settings and reasonably scaled data, all routines are numerically stable.  The updates may be called hundreds of times, and the decision to refactorize can be based on sparsity considerations alone.\n\nIn the Factor routine, rook pivoting (TRP) gives reliable rank determination without catastrophic degradation in sparsity or speed.  Complete pivoting (TCP) is included for moderate-sized matrices and for checking pathological cases (but the factors tend to be substantially more dense).\n\nTo conserve storage, one may request only the row and column pivot orders.  The factors are discarded as they are computed.  This is useful for basis repair, or for selecting a basis from a rectangular matrix.\n\n\nKnown Inefficiencies\n====================\n\nLUSOL is usually efficient on sparse matrices with dimensions up to about 100,000 (but not millions).\n\nIn the Factor routine, row and column lists must be updated each time a row and column is eliminated.  Deleting the pivot row and column is inefficient if the original matrix contains unusually dense rows or columns.  For TPP, dense columns could be kept aside and incorporated at the end via updates (but dense rows remain a difficulty).  For TRP and TCP, all rows and columns must be present to achieve the required numerical properties.\n\nFor TRP, the current bottleneck is updating the vector containing the largest element in each row.  One solution would be to include the matrix nonzeros in the row structure (but this carries its own cost).\n\nFor TCP, the heap structure is already efficient, but the dense factors (and the extended searching for acceptable pivots) are unavoidable expenses.\n\nThe triangular Solve routines do not take full of advantage of sparse right-hand sides.  Gilbert and Peierls have shown how to solve Lx = (sparse b) efficiently if L is stored column-wise.  Their approach could therefore be implemented in LUSOL for solves with L and U(transpose).  Solves with L(transpose) and U would need a second copy of L and U. \n\n\nOriginal Reference\n==================\n\nP. E. Gill, W. Murray, M. A. Saunders and M. H. Wright, Maintaining LU factors of a general sparse matrix, Linear Algebra and its Applications 88/89, 239-270 (1987).\n\n\nMaintainers\n===========\n\nF77 version: Michael Saunders (saunders@stanford.edu).\nC version: Kjell Eikland (kjell.eikland@broadpark.no).\n\n\nContributors\n============\n\nPhilip Gill, Walter Murray, Margaret Wright, Michael O'Sullivan.\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/bfp/bfp_LUSOL/LUSOL/LUSOL_LGPL.txt",
    "content": "\t\t  GNU LESSER GENERAL PUBLIC LICENSE\n\t\t       Version 2.1, February 1999\n\n Copyright (C) 1991, 1999 Free Software Foundation, Inc.\n     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n[This is the first released version of the Lesser GPL.  It also counts\n as the successor of the GNU Library Public License, version 2, hence\n the version number 2.1.]\n\n\t\t\t    Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicenses are intended to guarantee your freedom to share and change\nfree software--to make sure the software is free for all its users.\n\n  This license, the Lesser General Public License, applies to some\nspecially designated software packages--typically libraries--of the\nFree Software Foundation and other authors who decide to use it.  You\ncan use it too, but we suggest you first think carefully about whether\nthis license or the ordinary General Public License is the better\nstrategy to use in any particular case, based on the explanations below.\n\n  When we speak of free software, we are referring to freedom of use,\nnot price.  Our General Public Licenses are designed to make sure that\nyou have the freedom to distribute copies of free software (and charge\nfor this service if you wish); that you receive source code or can get\nit if you want it; that you can change the software and use pieces of\nit in new free programs; and that you are informed that you can do\nthese things.\n\n  To protect your rights, we need to make restrictions that forbid\ndistributors to deny you these rights or to ask you to surrender these\nrights.  These restrictions translate to certain responsibilities for\nyou if you distribute copies of the library or if you modify it.\n\n  For example, if you distribute copies of the library, whether gratis\nor for a fee, you must give the recipients all the rights that we gave\nyou.  You must make sure that they, too, receive or can get the source\ncode.  If you link other code with the library, you must provide\ncomplete object files to the recipients, so that they can relink them\nwith the library after making changes to the library and recompiling\nit.  And you must show them these terms so they know their rights.\n\n  We protect your rights with a two-step method: (1) we copyright the\nlibrary, and (2) we offer you this license, which gives you legal\npermission to copy, distribute and/or modify the library.\n\n  To protect each distributor, we want to make it very clear that\nthere is no warranty for the free library.  Also, if the library is\nmodified by someone else and passed on, the recipients should know\nthat what they have is not the original version, so that the original\nauthor's reputation will not be affected by problems that might be\nintroduced by others.\n\f\n  Finally, software patents pose a constant threat to the existence of\nany free program.  We wish to make sure that a company cannot\neffectively restrict the users of a free program by obtaining a\nrestrictive license from a patent holder.  Therefore, we insist that\nany patent license obtained for a version of the library must be\nconsistent with the full freedom of use specified in this license.\n\n  Most GNU software, including some libraries, is covered by the\nordinary GNU General Public License.  This license, the GNU Lesser\nGeneral Public License, applies to certain designated libraries, and\nis quite different from the ordinary General Public License.  We use\nthis license for certain libraries in order to permit linking those\nlibraries into non-free programs.\n\n  When a program is linked with a library, whether statically or using\na shared library, the combination of the two is legally speaking a\ncombined work, a derivative of the original library.  The ordinary\nGeneral Public License therefore permits such linking only if the\nentire combination fits its criteria of freedom.  The Lesser General\nPublic License permits more lax criteria for linking other code with\nthe library.\n\n  We call this license the \"Lesser\" General Public License because it\ndoes Less to protect the user's freedom than the ordinary General\nPublic License.  It also provides other free software developers Less\nof an advantage over competing non-free programs.  These disadvantages\nare the reason we use the ordinary General Public License for many\nlibraries.  However, the Lesser license provides advantages in certain\nspecial circumstances.\n\n  For example, on rare occasions, there may be a special need to\nencourage the widest possible use of a certain library, so that it becomes\na de-facto standard.  To achieve this, non-free programs must be\nallowed to use the library.  A more frequent case is that a free\nlibrary does the same job as widely used non-free libraries.  In this\ncase, there is little to gain by limiting the free library to free\nsoftware only, so we use the Lesser General Public License.\n\n  In other cases, permission to use a particular library in non-free\nprograms enables a greater number of people to use a large body of\nfree software.  For example, permission to use the GNU C Library in\nnon-free programs enables many more people to use the whole GNU\noperating system, as well as its variant, the GNU/Linux operating\nsystem.\n\n  Although the Lesser General Public License is Less protective of the\nusers' freedom, it does ensure that the user of a program that is\nlinked with the Library has the freedom and the wherewithal to run\nthat program using a modified version of the Library.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.  Pay close attention to the difference between a\n\"work based on the library\" and a \"work that uses the library\".  The\nformer contains code derived from the library, whereas the latter must\nbe combined with the library in order to run.\n\f\n\t\t  GNU LESSER GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License Agreement applies to any software library or other\nprogram which contains a notice placed by the copyright holder or\nother authorized party saying it may be distributed under the terms of\nthis Lesser General Public License (also called \"this License\").\nEach licensee is addressed as \"you\".\n\n  A \"library\" means a collection of software functions and/or data\nprepared so as to be conveniently linked with application programs\n(which use some of those functions and data) to form executables.\n\n  The \"Library\", below, refers to any such software library or work\nwhich has been distributed under these terms.  A \"work based on the\nLibrary\" means either the Library or any derivative work under\ncopyright law: that is to say, a work containing the Library or a\nportion of it, either verbatim or with modifications and/or translated\nstraightforwardly into another language.  (Hereinafter, translation is\nincluded without limitation in the term \"modification\".)\n\n  \"Source code\" for a work means the preferred form of the work for\nmaking modifications to it.  For a library, complete source code means\nall the source code for all modules it contains, plus any associated\ninterface definition files, plus the scripts used to control compilation\nand installation of the library.\n\n  Activities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning a program using the Library is not restricted, and output from\nsuch a program is covered only if its contents constitute a work based\non the Library (independent of the use of the Library in a tool for\nwriting it).  Whether that is true depends on what the Library does\nand what the program that uses the Library does.\n  \n  1. You may copy and distribute verbatim copies of the Library's\ncomplete source code as you receive it, in any medium, provided that\nyou conspicuously and appropriately publish on each copy an\nappropriate copyright notice and disclaimer of warranty; keep intact\nall the notices that refer to this License and to the absence of any\nwarranty; and distribute a copy of this License along with the\nLibrary.\n\n  You may charge a fee for the physical act of transferring a copy,\nand you may at your option offer warranty protection in exchange for a\nfee.\n\f\n  2. You may modify your copy or copies of the Library or any portion\nof it, thus forming a work based on the Library, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) The modified work must itself be a software library.\n\n    b) You must cause the files modified to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    c) You must cause the whole of the work to be licensed at no\n    charge to all third parties under the terms of this License.\n\n    d) If a facility in the modified Library refers to a function or a\n    table of data to be supplied by an application program that uses\n    the facility, other than as an argument passed when the facility\n    is invoked, then you must make a good faith effort to ensure that,\n    in the event an application does not supply such function or\n    table, the facility still operates, and performs whatever part of\n    its purpose remains meaningful.\n\n    (For example, a function in a library to compute square roots has\n    a purpose that is entirely well-defined independent of the\n    application.  Therefore, Subsection 2d requires that any\n    application-supplied function or table used by this function must\n    be optional: if the application does not supply it, the square\n    root function must still compute square roots.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Library,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Library, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote\nit.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Library.\n\nIn addition, mere aggregation of another work not based on the Library\nwith the Library (or with a work based on the Library) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may opt to apply the terms of the ordinary GNU General Public\nLicense instead of this License to a given copy of the Library.  To do\nthis, you must alter all the notices that refer to this License, so\nthat they refer to the ordinary GNU General Public License, version 2,\ninstead of to this License.  (If a newer version than version 2 of the\nordinary GNU General Public License has appeared, then you can specify\nthat version instead if you wish.)  Do not make any other change in\nthese notices.\n\f\n  Once this change is made in a given copy, it is irreversible for\nthat copy, so the ordinary GNU General Public License applies to all\nsubsequent copies and derivative works made from that copy.\n\n  This option is useful when you wish to copy part of the code of\nthe Library into a program that is not a library.\n\n  4. You may copy and distribute the Library (or a portion or\nderivative of it, under Section 2) in object code or executable form\nunder the terms of Sections 1 and 2 above provided that you accompany\nit with the complete corresponding machine-readable source code, which\nmust be distributed under the terms of Sections 1 and 2 above on a\nmedium customarily used for software interchange.\n\n  If distribution of object code is made by offering access to copy\nfrom a designated place, then offering equivalent access to copy the\nsource code from the same place satisfies the requirement to\ndistribute the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  5. A program that contains no derivative of any portion of the\nLibrary, but is designed to work with the Library by being compiled or\nlinked with it, is called a \"work that uses the Library\".  Such a\nwork, in isolation, is not a derivative work of the Library, and\ntherefore falls outside the scope of this License.\n\n  However, linking a \"work that uses the Library\" with the Library\ncreates an executable that is a derivative of the Library (because it\ncontains portions of the Library), rather than a \"work that uses the\nlibrary\".  The executable is therefore covered by this License.\nSection 6 states terms for distribution of such executables.\n\n  When a \"work that uses the Library\" uses material from a header file\nthat is part of the Library, the object code for the work may be a\nderivative work of the Library even though the source code is not.\nWhether this is true is especially significant if the work can be\nlinked without the Library, or if the work is itself a library.  The\nthreshold for this to be true is not precisely defined by law.\n\n  If such an object file uses only numerical parameters, data\nstructure layouts and accessors, and small macros and small inline\nfunctions (ten lines or less in length), then the use of the object\nfile is unrestricted, regardless of whether it is legally a derivative\nwork.  (Executables containing this object code plus portions of the\nLibrary will still fall under Section 6.)\n\n  Otherwise, if the work is a derivative of the Library, you may\ndistribute the object code for the work under the terms of Section 6.\nAny executables containing that work also fall under Section 6,\nwhether or not they are linked directly with the Library itself.\n\f\n  6. As an exception to the Sections above, you may also combine or\nlink a \"work that uses the Library\" with the Library to produce a\nwork containing portions of the Library, and distribute that work\nunder terms of your choice, provided that the terms permit\nmodification of the work for the customer's own use and reverse\nengineering for debugging such modifications.\n\n  You must give prominent notice with each copy of the work that the\nLibrary is used in it and that the Library and its use are covered by\nthis License.  You must supply a copy of this License.  If the work\nduring execution displays copyright notices, you must include the\ncopyright notice for the Library among them, as well as a reference\ndirecting the user to the copy of this License.  Also, you must do one\nof these things:\n\n    a) Accompany the work with the complete corresponding\n    machine-readable source code for the Library including whatever\n    changes were used in the work (which must be distributed under\n    Sections 1 and 2 above); and, if the work is an executable linked\n    with the Library, with the complete machine-readable \"work that\n    uses the Library\", as object code and/or source code, so that the\n    user can modify the Library and then relink to produce a modified\n    executable containing the modified Library.  (It is understood\n    that the user who changes the contents of definitions files in the\n    Library will not necessarily be able to recompile the application\n    to use the modified definitions.)\n\n    b) Use a suitable shared library mechanism for linking with the\n    Library.  A suitable mechanism is one that (1) uses at run time a\n    copy of the library already present on the user's computer system,\n    rather than copying library functions into the executable, and (2)\n    will operate properly with a modified version of the library, if\n    the user installs one, as long as the modified version is\n    interface-compatible with the version that the work was made with.\n\n    c) Accompany the work with a written offer, valid for at\n    least three years, to give the same user the materials\n    specified in Subsection 6a, above, for a charge no more\n    than the cost of performing this distribution.\n\n    d) If distribution of the work is made by offering access to copy\n    from a designated place, offer equivalent access to copy the above\n    specified materials from the same place.\n\n    e) Verify that the user has already received a copy of these\n    materials or that you have already sent this user a copy.\n\n  For an executable, the required form of the \"work that uses the\nLibrary\" must include any data and utility programs needed for\nreproducing the executable from it.  However, as a special exception,\nthe materials to be distributed need not include anything that is\nnormally distributed (in either source or binary form) with the major\ncomponents (compiler, kernel, and so on) of the operating system on\nwhich the executable runs, unless that component itself accompanies\nthe executable.\n\n  It may happen that this requirement contradicts the license\nrestrictions of other proprietary libraries that do not normally\naccompany the operating system.  Such a contradiction means you cannot\nuse both them and the Library together in an executable that you\ndistribute.\n\f\n  7. You may place library facilities that are a work based on the\nLibrary side-by-side in a single library together with other library\nfacilities not covered by this License, and distribute such a combined\nlibrary, provided that the separate distribution of the work based on\nthe Library and of the other library facilities is otherwise\npermitted, and provided that you do these two things:\n\n    a) Accompany the combined library with a copy of the same work\n    based on the Library, uncombined with any other library\n    facilities.  This must be distributed under the terms of the\n    Sections above.\n\n    b) Give prominent notice with the combined library of the fact\n    that part of it is a work based on the Library, and explaining\n    where to find the accompanying uncombined form of the same work.\n\n  8. You may not copy, modify, sublicense, link with, or distribute\nthe Library except as expressly provided under this License.  Any\nattempt otherwise to copy, modify, sublicense, link with, or\ndistribute the Library is void, and will automatically terminate your\nrights under this License.  However, parties who have received copies,\nor rights, from you under this License will not have their licenses\nterminated so long as such parties remain in full compliance.\n\n  9. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Library or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Library (or any work based on the\nLibrary), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Library or works based on it.\n\n  10. Each time you redistribute the Library (or any work based on the\nLibrary), the recipient automatically receives a license from the\noriginal licensor to copy, distribute, link with or modify the Library\nsubject to these terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties with\nthis License.\n\f\n  11. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions 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\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Library at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Library by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Library.\n\nIf any portion of this section is held invalid or unenforceable under any\nparticular circumstance, the balance of the section is intended to apply,\nand the section as a whole is intended to apply in other circumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  12. If the distribution and/or use of the Library is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Library under this License may add\nan explicit geographical distribution limitation excluding those countries,\nso that distribution is permitted only in or among countries not thus\nexcluded.  In such case, this License incorporates the limitation as if\nwritten in the body of this License.\n\n  13. The Free Software Foundation may publish revised and/or new\nversions of the Lesser General Public License from time to time.\nSuch new versions will be similar in spirit to the present version,\nbut may differ in detail to address new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Library\nspecifies a version number of this License which applies to it and\n\"any later version\", you have the option of following the terms and\nconditions either of that version or of any later version published by\nthe Free Software Foundation.  If the Library does not specify a\nlicense version number, you may choose any version ever published by\nthe Free Software Foundation.\n\f\n  14. If you wish to incorporate parts of the Library into other free\nprograms whose distribution conditions are incompatible with these,\nwrite to the author to ask for permission.  For software which is\ncopyrighted by the Free Software Foundation, write to the Free\nSoftware Foundation; we sometimes make exceptions for this.  Our\ndecision will be guided by the two goals of preserving the free status\nof all derivatives of our free software and of promoting the sharing\nand reuse of software generally.\n\n\t\t\t    NO WARRANTY\n\n  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO\nWARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.\nEXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR\nOTHER PARTIES PROVIDE THE LIBRARY \"AS IS\" WITHOUT WARRANTY OF ANY\nKIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE\nLIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME\nTHE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN\nWRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY\nAND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU\nFOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR\nCONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE\nLIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING\nRENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A\nFAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF\nSUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGES.\n\n\t\t     END OF TERMS AND CONDITIONS\n\f\n           How to Apply These Terms to Your New Libraries\n\n  If you develop a new library, and you want it to be of the greatest\npossible use to the public, we recommend making it free software that\neveryone can redistribute and change.  You can do so by permitting\nredistribution under these terms (or, alternatively, under the terms of the\nordinary General Public License).\n\n  To apply these terms, attach the following notices to the library.  It is\nsafest to attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least the\n\"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the library's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This library is free software; you can redistribute it and/or\n    modify it under the terms of the GNU Lesser General Public\n    License as published by the Free Software Foundation; either\n    version 2 of the License, or (at your option) any later version.\n\n    This library 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 GNU\n    Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public\n    License along with this library; if not, write to the Free Software\n    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\nAlso add information on how to contact you by electronic and paper mail.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the library, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the\n  library `Frob' (a library for tweaking knobs) written by James Random Hacker.\n\n  <signature of Ty Coon>, 1 April 1990\n  Ty Coon, President of Vice\n\nThat's all there is to it!\n\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/bfp/bfp_LUSOL/LUSOL/LUSOL_Overview.txt",
    "content": "            Notes for Contribution of LUSOL to COIN-OR\n                            May 2004\n\nIntroduction\n============\n\nLUSOL maintains sparse LU factors of a square or rectangular sparse matrix.  It includes a Basis Factorization Package (BFP) suitable for implementing simplex and reduced-gradient methods for optimization.  It is a set of  routines written in ANSI C (adapted from the original Fortran 77 version).\n\nLUSOL includes the following features:\n\n-  A Markowitz-based sparse LU factorization for square,\n   rectangular and possibly singular matrices.\n\n-  Three options for balancing sparsity and stability:\n   Threshold Partial/Rook/Complete Pivoting (TPP, TRP, TCP).\n\n-  Rank-revealing properties.  TRP and TCP are intended for detecting singularities.\n\n-  Dynamic storage allocation (C version only).\n\n-  Stable column replacement as in the method of Bartels and Golub.\n\n-  Other stable updates: add, replace, or delete row or column\n   (currently F77 version only).\n\n-  Implementation into an easy-to-use BFP API (C version only).\n\n\nImplementation\n==============\n\nThe Factor routine is similar to the classical Markowitz routines MA28 and LA05 in the Harwell Subroutine Library. The source matrix nonzeros are stored column-wise with the largest entry at the top of each column.  Internally, the structure is also accessible row-wise.  All entries in a particular column or row are held in contiguous storage.  Fill is accommodated by moving a column or row to the beginning of free storage. Occasional compressions recover storage.  This scheme is effective for column-oriented TPP.  When the remaining matrix reaches a specified density, the factors are completed using dense processing.\n\nTRP uses an additional vector of storage to maintain the largest element in each remaining row.\n\nTCP uses a heap structure to hold the largest element in each column.  The largest element in the remaining matrix is then available at the top of the heap.\n\nThe final L is stored column-wise (and never changed).  The final U is stored row-wise as a triangular or trapezoidal sparse matrix.\n\nColumn replacements are implemented using a forward sweep of 2-by-2 stabilized elimination matrices.  L is updated in product form.  U is updated explicitly.\n\nThe other updates use either forward or backward sweeps. They tend to generate more nonzeros than column replacement.\n\nBoth the F77 and C versions contain extensive comments, method and implementational information as part of the code.\n\nThe C version contains a record-based wrapper for the data.  Function calls have been simplified by including references to this structure.  New maintenance routines enable dynamic instance creation and destruction, and  simplifies access to the most frequently used functions.  The LUSOL C library is multi-instance and fully re-entrant.  All control and output parameters have been given long descriptive names for usability. \n\n\nBenefits\n========\n\nRank-revealing properties and rectangular factors (and updates) have not previously been available in sparse LU software.  With sensible parameter settings and reasonably scaled data, all routines are numerically stable.  The updates may be called hundreds of times, and the decision to refactorize can be based on sparsity considerations alone.\n\nIn the Factor routine, rook pivoting (TRP) gives reliable rank determination without catastrophic degradation in sparsity or speed.  Complete pivoting (TCP) is included for moderate-sized matrices and for checking pathological cases (but the factors tend to be substantially more dense).\n\nTo conserve storage, one may request only the row and column pivot orders.  The factors are discarded as they are computed.  This is useful for basis repair, or for selecting a basis from a rectangular matrix.\n\n\nKnown Inefficiencies\n====================\n\nLUSOL is usually efficient on sparse matrices with dimensions up to about 100,000 (but not millions).\n\nIn the Factor routine, row and column lists must be updated each time a row and column is eliminated.  Deleting the pivot row and column is inefficient if the original matrix contains unusually dense rows or columns.  For TPP, dense columns could be kept aside and incorporated at the end via updates (but dense rows remain a difficulty).  For TRP and TCP, all rows and columns must be present to achieve the required numerical properties.\n\nFor TRP, the current bottleneck is updating the vector containing the largest element in each row.  One solution would be to include the matrix nonzeros in the row structure (but this carries its own cost).\n\nFor TCP, the heap structure is already efficient, but the dense factors (and the extended searching for acceptable pivots) are unavoidable expenses.\n\nThe triangular Solve routines do not take full of advantage of sparse right-hand sides.  Gilbert and Peierls have shown how to solve Lx = (sparse b) efficiently if L is stored column-wise.  Their approach could therefore be implemented in LUSOL for solves with L and U(transpose).  Solves with L(transpose) and U would need a second copy of L and U. \n\n\nOriginal Reference\n==================\n\nP. E. Gill, W. Murray, M. A. Saunders and M. H. Wright, Maintaining LU factors of a general sparse matrix, Linear Algebra and its Applications 88/89, 239-270 (1987).\n\n\nMaintainers\n===========\n\nF77 version: Michael Saunders (saunders@stanford.edu).\nC version: Kjell Eikland (kjell.eikland@broadpark.no).\n\n\nContributors\n============\n\nPhilip Gill, Walter Murray, Margaret Wright, Michael O'Sullivan.\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/bfp/bfp_LUSOL/LUSOL/LUSOL_README.txt",
    "content": "README.TXT for LUSOL - Advanced LU solver with enhanced numerical stability options\n-----------------------------------------------------------------------------------\n\nLUSOL - pronounced \"L-U-SOL\" - was developed by Prof. Michael Saunders at the \nStanford (University) Optimization Laboratory over a period of 2 decades of \nprogressive improvements.  It is a particularly capable matrix factorization system\nand includes sparsity-preserving column updates and equation solving.  It is\ntherefore particularly well suited to be part of a system to solve tough mathematical \nprogramming problems.  Further details can be found in the file \"LUSOL-overview.txt.\"\n\nA big step has been made in converting the original Fortran code into a much more\neasily accessible and modularized system based on ANSI C as part of the release of\nlp_solve v5.  LUSOL is fully implemented as a \"Basis Factorization Package\", BFP in \nlp_solve and is the BFP of choice for large and complex models, if not all.  As part\nof the conversion to C, processor optimized BLAS functionality has been enabled, and\nfuture enhancements to LUSOL may make increasing use of this, ensuring top performance. \n\nFor the lp_solve release of LUSOL, a stand-alone equation solving system has also been\ndeveloped.  A pre-compiled Windows command-line executable version is included in the\nstandard distribution of LUSOL. In addition, the program options illustrate several \nadvanced uses of LUSOL.  The equation solving utility features reading of standard \nmatrix files in the Harwell-Boeing, MatrixMarket and text formats.  Sample matrix \nmodels are provided for Harwell-Boeing (.RUA) and MatrixMarket (.mtx).  \n\nThe LUSOL code is released under the GNU Lesser General Public Licence.  Confer the \nfile \"Licence_LGPL.txt\" for the full terms of this licence.  These terms make lp_solve\nand LUSOL available and distributable on equal licencing terms.  It is expected that\nLUSOL will have an official repository in the near future, but the LUSOL archive at\nthe Yahoo lp_solve group will be an official copy and the formal repository until\nfurther notice.\n\n\nKjell Eikland\n14 July 2004\nOslo, Norway\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/bfp/bfp_LUSOL/LUSOL/Row-based L0.txt",
    "content": "Traditional column-based L0\r\n---------------------------\r\nV[  3] = V[  3] + L[1,3]*V[  1]\r\n0.9375 = -1.26316 + -0.789474*-2.7875\r\nV[  2] = V[  2] + L[1,2]*V[  1]\r\n-0.846875 =  -0.15 +   0.25*-2.7875\r\nV[  2] = V[  2] + L[3,2]*V[  3]\r\n-0.925 = -0.846875 + -0.0833333*0.9375\r\nV[  4] = V[  4] + L[3,4]*V[  3]\r\n-0.3125 =      0 + -0.333333*0.9375\r\n\r\nSolution vector\r\n            -2.7875             -0.925             0.9375            -0.3125\r\n\r\n\r\nNew row-based L0\r\n----------------\r\nV[  4] = V[  4] + L[3,4]*V[  3]\r\n0.421053 =      0 + -0.333333*-1.26316\r\nV[  2] = V[  2] + L[3,2]*V[  3]\r\n-0.0447368 =  -0.15 + -0.0833333*-1.26316\r\nV[  2] = V[  2] + L[1,2]*V[  1]\r\n-0.741612 = -0.0447368 +   0.25*-2.7875\r\nV[  3] = V[  3] + L[1,3]*V[  1]\r\n0.9375 = -1.26316 + -0.789474*-2.7875\r\n\r\nSolution vector\r\n            -2.7875          -0.741612             0.9375           0.421053\r\n\r\n\r\nL0 generated\r\n----------------\r\n         0         0         0         0\r\n         0         0         0         0\r\n         0      0.25 -0.789474         0\r\n         0-0.0833333         0 -0.333333"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/bfp/bfp_LUSOL/LUSOL/Victoria1850.RUA",
    "content": "1UNSYMMETRIC MATRIX             MAHINDAS ST ERTAR             24OCT84   MAHINDAS\r\n          2488           126           769          1537            56          \r\nRUA                     1258          1258          7682             0          \r\n(10I8)          (10I8)          (1P5D16.8)          (1P5D16.8)                  \r\nM                         55           162                                      \r\n       1      37      74     111     148     185     222     259     296     317\r\n     337     351     366     378     394     407     422     434     444     456\r\n     466     478     486     497     511     526     541     556     572     589\r\n     611     624     638     655     670     683     697     709     720     730\r\n     742     756     777     789     801     815     827     852     862     874\r\n     881     885     889     891     893     895     897     899     901     903\r\n     905     907     909     911     913     915     917     919     921     923\r\n     925     927     929     931     933     935     937     939     941     943\r\n     945     947     949     951     953     955     957     959     961     963\r\n     965     967     969     971     973     975     977     979     981     983\r\n     985     986     987     989     991     993     995     997     999    1001\r\n    1003    1005    1007    1009    1011    1013    1015    1017    1019    1021\r\n    1023    1025    1027    1029    1031    1033    1035    1037    1039    1041\r\n    1043    1045    1047    1049    1051    1053    1055    1057    1059    1061\r\n    1063    1065    1067    1069    1071    1073    1075    1077    1079    1081\r\n    1083    1085    1087    1089    1091    1093    1095    1097    1099    1101\r\n    1103    1105    1107    1109    1111    1113    1115    1117    1119    1121\r\n    1123    1125    1127    1129    1131    1133    1135    1137    1139    1141\r\n    1143    1145    1147    1149    1151    1153    1155    1157    1159    1161\r\n    1163    1165    1167    1169    1171    1173    1175    1177    1179    1181\r\n    1183    1185    1187    1189    1191    1193    1195    1197    1199    1201\r\n    1203    1205    1207    1209    1211    1213    1215    1217    1219    1221\r\n    1223    1225    1227    1229    1231    1233    1235    1237    1239    1241\r\n    1243    1245    1247    1249    1251    1253    1255    1257    1259    1261\r\n    1263    1265    1267    1269    1271    1273    1275    1277    1279    1281\r\n    1283    1285    1287    1289    1291    1293    1295    1297    1299    1301\r\n    1303    1305    1307    1309    1311    1313    1315    1317    1319    1321\r\n    1323    1325    1327    1329    1331    1333    1335    1337    1339    1341\r\n    1343    1345    1347    1349    1351    1353    1355    1357    1359    1361\r\n    1363    1365    1367    1369    1371    1373    1375    1377    1379    1381\r\n    1383    1385    1387    1389    1391    1393    1395    1397    1399    1401\r\n    1403    1405    1407    1409    1411    1413    1415    1417    1419    1421\r\n    1423    1425    1427    1429    1431    1433    1435    1437    1439    1441\r\n    1443    1445    1447    1448    1449    1450    1452    1454    1455    1457\r\n    1458    1460    1462    1464    1466    1468    1469    1471    1473    1475\r\n    1477    1479    1481    1483    1485    1487    1488    1489    1491    1492\r\n    1493    1494    1496    1498    1500    1502    1504    1506    1508    1510\r\n    1512    1514    1516    1518    1520    1522    1524    1525    1526    1528\r\n    1530    1531    1533    1535    1536    1537    1538    1539    1540    1541\r\n    1543    1545    1547    1549    1550    1552    1554    1556    1558    1560\r\n    1561    1562    1564    1566    1568    1570    1572    1574    1576    1578\r\n    1579    1581    1583    1584    1585    1586    1588    1590    1592    1594\r\n    1596    1598    1600    1602    1604    1605    1607    1609    1611    1613\r\n    1615    1617    1619    1621    1623    1625    1627    1629    1630    1632\r\n    1634    1637    1640    1643    1646    1649    1652    1655    1658    1661\r\n    1664    1667    1670    1673    1676    1679    1682    1685    1688    1691\r\n    1694    1697    1700    1703    1706    1709    1712    1715    1718    1721\r\n    1724    1727    1730    1733    1736    1739    1742    1745    1748    1751\r\n    1754    1757    1760    1763    1766    1769    1772    1775    1778    1781\r\n    1784    1787    1790    1793    1796    1801    1806    1811    1816    1821\r\n    1826    1831    1832    1833    1834    1835    1836    1837    1838    1839\r\n    1840    1841    1842    1843    1844    1845    1846    1847    1848    1850\r\n    1851    1852    1853    1854    1855    1856    1857    1858    1859    1860\r\n    1861    1862    1863    1865    1866    1868    1870    1871    1872    1873\r\n    1875    1876    1877    1878    1879    1881    1882    1883    1885    1887\r\n    1888    1890    1891    1892    1894    1895    1896    1897    1898    1899\r\n    1900    1901    1902    1903    1904    1905    1906    1907    1908    1909\r\n    1910    1911    1912    1914    1915    1916    1917    1918    1919    1920\r\n    1922    1923    1924    1925    1926    1927    1928    1929    1930    1931\r\n    1932    1933    1934    1935    1936    1937    1938    1939    1940    1942\r\n    1943    1944    1945    1946    1947    1948    1949    1950    1951    1952\r\n    1954    1956    1958    1960    1962    1964    1966    1968    1970    1972\r\n    1974    1976    1978    1980    1982    1984    1986    1988    1990    1992\r\n    1994    1996    1998    2000    2002    2004    2006    2008    2010    2012\r\n    2014    2016    2018    2020    2022    2024    2026    2028    2030    2032\r\n    2034    2036    2038    2040    2042    2044    2046    2048    2050    2052\r\n    2054    2056    2058    2060    2062    2064    2066    2068    2070    2071\r\n    2073    2075    2077    2079    2081    2083    2085    2087    2089    2091\r\n    2093    2095    2097    2099    2101    2103    2105    2107    2109    2111\r\n    2113    2115    2117    2119    2121    2123    2125    2127    2129    2131\r\n    2133    2135    2137    2139    2140    2142    2144    2146    2147    2148\r\n    2149    2150    2151    2152    2153    2155    2156    2157    2166    2174\r\n    2181    2196    2199    2202    2205    2208    2211    2214    2217    2220\r\n    2223    2226    2229    2232    2235    2238    2241    2244    2247    2250\r\n    2253    2256    2259    2262    2265    2268    2271    2274    2277    2280\r\n    2283    2286    2289    2292    2295    2298    2301    2304    2307    2310\r\n    2313    2316    2319    2322    2325    2328    2331    2334    2337    2340\r\n    2343    2345    2347    2348    2442    2536    2630    2727    2824    2915\r\n    3014    3110    3208    3306    3323    3329    3338    3359    3367    3374\r\n    3380    3401    3407    3413    3419    3425    3431    3438    3445    3457\r\n    3464    3469    3477    3483    3511    3551    3572    3578    3587    3601\r\n    3610    3628    3667    3682    3688    3698    3720    3757    3763    3772\r\n    3871    3971    3979    4032    4037    4041    4045    4050    4055    4067\r\n    4079    4095    4104    4106    4114    4121    4126    4131    4136    4141\r\n    4149    4155    4160    4166    4171    4179    4184    4189    4195    4200\r\n    4207    4212    4221    4232    4238    4241    4246    4252    4271    4279\r\n    4300    4305    4310    4319    4325    4349    4386    4395    4397    4405\r\n    4420    4442    4444    4446    4448    4450    4452    4454    4456    4459\r\n    4461    4463    4666    4671    4676    4681    4686    4691    4696    4701\r\n    4706    4711    4716    4721    4726    4731    4736    4741    4746    4751\r\n    4756    4761    4766    4771    4776    4781    4786    4791    4796    4801\r\n    4806    4811    4816    4821    4826    4831    4836    4841    4846    4851\r\n    4856    4861    4866    4871    4876    4881    4886    4891    4896    4901\r\n    4906    4910    4914    4916    4918    4922    4926    4930    4934    4938\r\n    4942    4946    4950    4951    4952    4953    4954    4955    4956    4957\r\n    4958    4959    4960    4961    4962    4963    4964    4965    4966    4967\r\n    4968    4969    4970    4971    4972    4973    4974    4975    4976    4977\r\n    4978    4979    4980    4981    4982    4983    4984    4985    4986    4987\r\n    4988    4989    4990    4991    4992    4993    4994    4996    4998    5000\r\n    5055    5110    5112    5167    5169    5224    5279    5334    5389    5444\r\n    5446    5501    5556    5611    5666    5721    5776    5831    5886    5941\r\n    5943    5998    6053    6055    6057    6059    6114    6169    6224    6279\r\n    6334    6389    6444    6499    6554    6609    6664    6719    6774    6829\r\n    6884    6886    6888    6943    6998    7000    7055    7110    7112    7114\r\n    7116    7119    7122    7125    7128    7131    7133    7136    7139    7142\r\n    7145    7148    7151    7154    7157    7160    7163    7166    7169    7172\r\n    7175    7178    7181    7184    7186    7189    7192    7195    7198    7201\r\n    7204    7207    7210    7213    7216    7219    7222    7225    7228    7231\r\n    7234    7236    7239    7242    7245    7247    7250    7252    7254    7256\r\n    7258    7260    7263    7265    7267    7278    7315    7321    7329    7331\r\n    7333    7335    7337    7339    7341    7343    7345    7347    7349    7351\r\n    7353    7355    7357    7359    7361    7363    7365    7367    7369    7371\r\n    7373    7375    7377    7379    7381    7383    7385    7387    7389    7391\r\n    7393    7395    7397    7399    7401    7403    7405    7407    7409    7411\r\n    7413    7415    7417    7418    7419    7420    7421    7422    7423    7424\r\n    7426    7428    7430    7432    7434    7436    7438    7440    7442    7444\r\n    7446    7448    7450    7452    7454    7456    7458    7460    7462    7464\r\n    7466    7468    7470    7472    7474    7476    7478    7480    7482    7484\r\n    7486    7488    7490    7492    7494    7496    7498    7500    7502    7504\r\n    7506    7508    7510    7512    7514    7515    7516    7517    7518    7519\r\n    7520    7521    7523    7568    7569    7571    7573    7574    7577    7579\r\n    7634    7636    7637    7638    7639    7640    7641    7642    7643    7644\r\n    7645    7646    7647    7648    7649    7650    7651    7652    7653    7654\r\n    7655    7656    7657    7658    7659    7660    7661    7662    7663    7664\r\n    7665    7666    7667    7668    7669    7670    7671    7672    7673    7674\r\n    7675    7676    7677    7678    7679    7680    7681    7682    7683        \r\n       1      53     105     157     158     159     160     161     162     163\r\n     164     165     166     986     987     988     989     991     992     996\r\n     999    1003    1016    1017    1018    1029    1032    1033    1035    1200\r\n    1201    1202    1229    1231    1236    1242       2      54     106     167\r\n     168     169     170     171     172     173     174     175     176     986\r\n     987     988     989     990     991     992     996     999    1003    1016\r\n    1017    1018    1029    1032    1033    1035    1200    1201    1202    1229\r\n    1231    1236    1242       3      55     107     177     178     179     180\r\n     181     182     183     184     185     186     986     987     988     989\r\n     990     991     992     996     999    1003    1016    1017    1018    1029\r\n    1032    1033    1035    1200    1201    1202    1229    1231    1236    1242\r\n       4      56     108     187     188     189     190     191     192     193\r\n     194     195     196     986     987     988     989     990     991     992\r\n     996     999    1003    1016    1017    1018    1029    1032    1033    1035\r\n    1200    1201    1202    1229    1231    1236    1242       5      57     109\r\n     197     198     199     200     201     202     203     204     205     206\r\n     986     987     988     989     990     991     992     996     999    1003\r\n    1016    1017    1018    1029    1032    1033    1035    1200    1201    1202\r\n    1229    1231    1236    1242       6      58     110     207     208     209\r\n     210     211     212     213     214     215     216     986     987     988\r\n     989     990     991     992     996     999    1003    1016    1017    1018\r\n    1029    1032    1033    1035    1200    1201    1202    1229    1231    1236\r\n    1242       7      59     111     217     218     219     220     221     222\r\n     223     224     225     226     986     987     988     989     990     991\r\n     992     996     999    1003    1016    1017    1018    1029    1032    1033\r\n    1035    1200    1201    1202    1229    1231    1236    1242       8      60\r\n     112     227     228     229     230     231     232     233     234     235\r\n     236     986     987     988     989     990     991     992     996     999\r\n    1003    1016    1017    1018    1029    1032    1033    1035    1200    1201\r\n    1202    1229    1231    1236    1242       9      61     113     237     986\r\n     987     989     994    1016    1017    1018    1020    1024    1029    1032\r\n    1033    1035    1199    1231    1237    1242      10      62     114     238\r\n     988     989     990     992    1021    1024    1025    1032    1033    1035\r\n    1202    1203    1234    1236    1237    1238      11      63     115     239\r\n     993     999    1016    1017    1024    1032    1033    1035    1206    1237\r\n      12      64     116     240     993     995    1001    1016    1024    1032\r\n    1033    1035    1206    1212    1237      13      65     117     241    1024\r\n    1025    1029    1031    1032    1033    1035    1237      14      66     118\r\n     242     995     999    1016    1017    1022    1024    1029    1032    1033\r\n    1035    1214    1237      15      67     119     243     992    1021    1024\r\n    1029    1032    1033    1035    1205    1237      16      68     120     244\r\n    1016    1023    1024    1029    1032    1033    1035    1229    1236    1237\r\n    1242      17      69     121     245    1017    1023    1024    1028    1032\r\n    1033    1035    1237      18      70     122     246    1003    1016    1017\r\n    1032    1033    1035      19      71     123     247    1017    1023    1024\r\n    1032    1033    1035    1219    1237      20      72     124     248    1016\r\n    1024    1032    1033    1035    1237      21      73     125     249    1025\r\n    1027    1028    1029    1032    1033    1035    1221      22      74     126\r\n     250    1028    1032    1033    1035      23      75     127     251    1024\r\n    1028    1032    1033    1035    1223    1237      24      76     128     252\r\n    1017    1024    1028    1029    1032    1033    1035    1231    1237    1241\r\n      25      77     129     253     999    1017    1023    1024    1028    1029\r\n    1032    1033    1035    1225    1237      26      78     130     254    1017\r\n    1018    1023    1024    1028    1029    1032    1033    1035    1226    1237\r\n      27      79     131     255    1017    1023    1024    1025    1028    1029\r\n    1031    1032    1033    1035    1237      28      80     132     256     999\r\n    1017    1023    1024    1028    1032    1033    1035    1228    1229    1236\r\n    1237      29      81     133     257     999    1016    1017    1021    1024\r\n    1028    1029    1032    1033    1035    1229    1236    1237      30      82\r\n     134     258     993     995     998     999    1016    1017    1022    1024\r\n    1032    1033    1035    1206    1211    1212    1230    1231    1236    1237\r\n      31      83     135     259    1017    1018    1024    1029    1032    1033\r\n    1035    1231    1237      32      84     136     260     994     995    1017\r\n    1021    1024    1029    1032    1033    1035    1237      33      85     137\r\n     261     990     992     994     996    1003    1017    1020    1021    1024\r\n    1032    1033    1035    1237      34      86     138     262     992     994\r\n    1020    1024    1026    1032    1033    1035    1203    1234    1237      35\r\n      87     139     263     995     999    1017    1024    1032    1033    1035\r\n    1235    1237      36      88     140     264     996    1017    1023    1024\r\n    1029    1032    1033    1035    1236    1237      37      89     141     265\r\n    1023    1024    1029    1031    1032    1033    1035    1237      38      90\r\n     142     266    1024    1025    1029    1032    1033    1035    1237      39\r\n      91     143     267    1024    1026    1032    1033    1035    1237      40\r\n      92     144     268    1025    1027    1029    1031    1032    1033    1035\r\n    1240      41      93     145     269    1016    1024    1028    1029    1031\r\n    1032    1033    1035    1237    1241      42      94     146     270     994\r\n     996    1003    1016    1017    1018    1020    1021    1022    1024    1027\r\n    1028    1032    1033    1035    1237    1242      43      95     147     271\r\n    1010    1024    1029    1032    1033    1035    1223    1237      44      96\r\n     148     272    1017    1024    1032    1033    1035    1039    1223    1237\r\n      45      97     149     273    1017    1024    1028    1029    1032    1033\r\n    1035    1237    1241    1242      46      98     150     274    1003    1017\r\n    1018    1023    1032    1033    1035    1236      47      99     151     275\r\n    1000    1010    1014    1016    1017    1018    1023    1025    1028    1029\r\n    1030    1032    1033    1035    1213    1227    1229    1231    1236    1238\r\n    1241      48     100     152     276    1003    1017    1032    1033    1216\r\n    1236      49     101     153     277    1014    1016    1017    1025    1030\r\n    1032    1033    1035      50     102     154     278    1032    1033    1250\r\n      51     103     155     279      52     104     156     280       1    1094\r\n       2    1094       3    1094       4    1094       5    1094       6    1094\r\n       7    1094       8    1094       9    1094      10    1094      11    1094\r\n      12    1094      13    1094      14    1094      15    1094      16    1094\r\n      17    1094      18    1094      19    1094      20    1094      21    1094\r\n      22    1094      23    1094      24    1094      25    1094      26    1094\r\n      27    1094      28    1094      29    1094      30    1094      31    1094\r\n      32    1094      33    1094      34    1094      35    1094      36    1094\r\n      37    1094      38    1094      39    1094      40    1094      41    1094\r\n      42    1094      43    1094      44    1094      45    1094      46    1094\r\n      47    1094      48    1094      49      50      51    1094      52    1094\r\n      53    1095      54    1096      55    1097      56    1098      57    1099\r\n      58    1100      59    1101      60    1102      61    1103      62    1104\r\n      63    1105      64    1106      65    1107      66    1108      67    1109\r\n      68    1110      69    1111      70    1112      71    1113      72    1114\r\n      73    1115      74    1116      75    1117      76    1118      77    1119\r\n      78    1120      79    1121      80    1122      81    1123      82    1124\r\n      83    1125      84    1126      85    1127      86    1128      87    1129\r\n      88    1130      89    1131      90    1132      91    1133      92    1134\r\n      93    1135      94    1136      95    1137      96    1138      97    1139\r\n      98    1140      99    1141     100    1142     101    1143     102    1144\r\n     103    1145     104    1146     105    1147     106    1148     107    1149\r\n     108    1150     109    1151     110    1152     111    1153     112    1154\r\n     113    1155     114    1156     115    1157     116    1158     117    1159\r\n     118    1160     119    1161     120    1162     121    1163     122    1164\r\n     123    1165     124    1166     125    1167     126    1168     127    1169\r\n     128    1170     129    1171     130    1172     131    1173     132    1174\r\n     133    1175     134    1176     135    1177     136    1178     137    1179\r\n     138    1180     139    1181     140    1182     141    1183     142    1184\r\n     143    1185     144    1186     145    1187     146    1188     147    1189\r\n     148    1190     149    1191     150    1192     151    1193     152    1194\r\n     153    1195     154    1196     155    1197     156    1198     157    1040\r\n     158    1041     159    1042     160    1043     161    1044     162    1045\r\n     163    1046     164    1047     165    1048     166    1049     167    1040\r\n     168    1041     169    1042     170    1043     171    1044     172    1045\r\n     173    1046     174    1047     175    1048     176    1049     177    1040\r\n     178    1041     179    1042     180    1043     181    1044     182    1045\r\n     183    1046     184    1047     185    1048     186    1049     187    1040\r\n     188    1041     189    1042     190    1043     191    1044     192    1045\r\n     193    1046     194    1047     195    1048     196    1049     197    1040\r\n     198    1041     199    1042     200    1043     201    1044     202    1045\r\n     203    1046     204    1047     205    1048     206    1049     207    1040\r\n     208    1041     209    1042     210    1043     211    1044     212    1045\r\n     213    1046     214    1047     215    1048     216    1049     217    1040\r\n     218    1041     219    1042     220    1043     221    1044     222    1045\r\n     223    1046     224    1047     225    1048     226    1049     227    1040\r\n     228    1041     229    1042     230    1043     231    1044     232    1045\r\n     233    1046     234    1047     235    1048     236    1049     237    1050\r\n     238    1051     239    1052     240    1053     241    1054     242    1055\r\n     243    1056     244    1057     245    1058     246    1059     247    1060\r\n     248    1061     249    1062     250    1063     251    1064     252    1065\r\n     253    1066     254    1067     255    1068     256    1069     257    1070\r\n     258    1071     259    1072     260    1073     261    1074     262    1075\r\n     263    1076     264    1077     265    1078     266    1079     267    1080\r\n     268    1081     269    1082     270    1083     271    1084     272    1085\r\n     273    1086     274    1087     275    1088     276    1089     277    1090\r\n     278    1091     279    1092     280    1093     285     286     287     288\r\n     989     289     990     290     291     992     292     293     994     294\r\n     995     295     996     296     997     297     998     298     299    1000\r\n     300    1001     301    1002     302    1003     303    1004     304    1005\r\n     305    1006     306    1007     307    1008     308     309     310    1011\r\n     311     312     313     314    1015     315    1016     316    1017     317\r\n    1018     318    1019     319    1020     320    1021     321    1022     322\r\n    1023     323    1024     324    1025     325    1026     326    1027     327\r\n    1028     328    1029     329     330     331    1032     332    1033     333\r\n     334    1035     335    1036     336     337     338     339     340     341\r\n     342    1202     343    1203     344    1204     345    1205     346     347\r\n    1207     348    1208     349    1209     350    1210     351    1211     352\r\n     353     354    1214     355    1215     356    1216     357    1217     358\r\n    1218     359    1219     360    1220     361    1221     362     363    1223\r\n     364    1224     365     366     367     368    1228     369    1229     370\r\n    1230     371    1231     372    1232     373    1233     374    1234     375\r\n    1235     376    1236     377     378    1238     379    1239     380    1240\r\n     381    1241     382    1242     383    1243     384    1244     385    1245\r\n     386    1246     387    1247     388    1248     389    1249     390     391\r\n    1251     392    1252     285     339     447     286     340     448     287\r\n     341     449     288     342     450     289     343     451     290     344\r\n     452     291     345     453     292     346     454     293     347     455\r\n     294     348     456     295     349     457     296     350     458     297\r\n     351     459     298     352     460     299     353     461     300     354\r\n     462     301     355     463     302     356     464     303     357     465\r\n     304     358     466     305     359     467     306     360     468     307\r\n     361     469     308     362     470     309     363     471     310     364\r\n     472     311     365     473     312     366     474     313     367     475\r\n     314     368     476     315     369     477     316     370     478     317\r\n     371     479     318     372     480     319     373     481     320     374\r\n     482     321     375     483     322     376     484     323     377     485\r\n     324     378     486     325     379     487     326     380     488     327\r\n     381     489     328     382     490     329     383     491     330     384\r\n     492     331     385     493     332     386     494     333     387     495\r\n     334     388     496     335     389     497     336     390     498     337\r\n     391     499     338     392     500     501     986    1032    1033    1254\r\n     505     990    1032    1033    1254     508     993    1032    1033    1254\r\n     514     999    1032    1033    1254     516    1001    1032    1033    1254\r\n     534    1019    1032    1033    1254     546    1031    1032    1033    1254\r\n     555     556     557     558     559     560     561     562     563     564\r\n     565     566     567     568     569     570     571     572    1003     573\r\n     574     575     576     577     578     579     580     581     582     583\r\n     584     585     586    1017     587     588    1019     589    1020     590\r\n     591     592     593    1024     594     595     596     597     598    1029\r\n     599     600     601    1032     602    1033     603     604    1035     605\r\n     606     607    1038     608     609     610     611     612     613     614\r\n     615     616     617     618     619     620     621     622     623     624\r\n     625     626    1216     627     628     629     630     631     632     633\r\n    1223     634     635     636     637     638     639     640     641     642\r\n     643     644     645     646     647     648     649     650     651     652\r\n    1242     653     654     655     656     657     658     659     660     661\r\n     662     986    1040     987    1041     988    1042     989    1043     990\r\n    1044     991    1045     992    1046     993    1047     994    1048     995\r\n    1049     996    1050     997    1051     998    1052     999    1053    1000\r\n    1054    1001    1055    1002    1056    1003    1057    1004    1058    1005\r\n    1059    1006    1060    1007    1061    1008    1062    1009    1063    1010\r\n    1064    1011    1065    1012    1066    1013    1067    1014    1068    1015\r\n    1069    1016    1070    1017    1071    1018    1072    1019    1073    1020\r\n    1074    1021    1075    1022    1076    1023    1077    1024    1078    1025\r\n    1079    1026    1080    1027    1081    1028    1082    1029    1083    1030\r\n    1084    1031    1085    1032    1086    1033    1087    1034    1088    1035\r\n    1089    1036    1090    1037    1091    1038    1092    1039    1093    1199\r\n    1253    1200    1253    1201    1253    1202    1253    1203    1253    1204\r\n    1205    1253    1206    1253    1207    1253    1208    1253    1209    1253\r\n    1210    1253    1211    1253    1212    1253    1213    1253    1214    1253\r\n    1215    1253    1216    1253    1217    1253    1218    1253    1219    1253\r\n    1220    1253    1221    1253    1222    1253    1223    1253    1224    1253\r\n    1225    1253    1226    1253    1227    1253    1228    1253    1229    1253\r\n    1230    1253    1231    1253    1232    1253    1233    1253    1234    1253\r\n    1235    1253    1236    1253    1237    1253    1238    1253    1239    1240\r\n    1253    1241    1253    1242    1253    1243    1244    1245    1246    1247\r\n    1248    1249    1250    1253    1251    1252     281    1011    1032    1033\r\n    1034    1224    1231    1241    1242     282    1011    1032    1033    1034\r\n    1224    1241    1242     283    1011    1032    1033    1034    1224    1241\r\n     284    1009    1011    1012    1013    1028    1032    1033    1034    1221\r\n    1222    1224    1225    1241    1242     281     925     977     281     926\r\n     977     281     927     977     281     928     977     281     929     977\r\n     281     930     977     281     931     977     281     932     977     282\r\n     933     977     282     934     977     282     935     977     282     936\r\n     977     282     937     977     282     938     977     282     939     977\r\n     282     940     977     282     941     977     282     942     977     282\r\n     943     977     282     944     977     282     945     977     282     946\r\n     977     282     947     977     282     948     977     282     949     977\r\n     282     950     977     282     951     977     282     952     977     282\r\n     953     977     282     954     977     282     955     977     282     956\r\n     977     282     957     977     282     958     977     282     959     977\r\n     282     960     977     282     961     977     282     962     977     282\r\n     963     977     282     964     977     282     965     977     282     966\r\n     977     283     967     977     283     968     977     284     969     978\r\n     284     970     979     284     971     980     284     972     981     284\r\n     973     982     974     983     975     984     976     157     158     159\r\n     160     161     162     163     164     165     166     167     168     169\r\n     170     171     172     173     174     175     176     177     178     179\r\n     180     181     182     183     184     185     186     187     188     189\r\n     190     191     192     193     194     195     196     197     198     199\r\n     200     201     202     203     204     205     206     207     208     209\r\n     210     211     212     213     214     215     216     217     218     219\r\n     220     221     222     223     224     225     226     227     228     229\r\n     230     231     232     233     234     235     236     339     393     664\r\n     665     666     667     668     669     670     671     672     774     986\r\n    1199     157     158     159     160     161     162     163     164     165\r\n     166     167     168     169     170     171     172     173     174     175\r\n     176     177     178     179     180     181     182     183     184     185\r\n     186     187     188     189     190     191     192     193     194     195\r\n     196     197     198     199     200     201     202     203     204     205\r\n     206     207     208     209     210     211     212     213     214     215\r\n     216     217     218     219     220     221     222     223     224     225\r\n     226     227     228     229     230     231     232     233     234     235\r\n     236     340     394     664     665     666     667     668     669     670\r\n     671     672     775     987    1200     157     158     159     160     161\r\n     162     163     164     165     166     167     168     169     170     171\r\n     172     173     174     175     176     177     178     179     180     181\r\n     182     183     184     185     186     187     188     189     190     191\r\n     192     193     194     195     196     197     198     199     200     201\r\n     202     203     204     205     206     207     208     209     210     211\r\n     212     213     214     215     216     217     218     219     220     221\r\n     222     223     224     225     226     227     228     229     230     231\r\n     232     233     234     235     236     341     395     664     665     666\r\n     667     668     669     670     671     673     776     988    1201     157\r\n     158     159     160     161     162     163     164     165     166     167\r\n     168     169     170     171     172     173     174     175     176     177\r\n     178     179     180     181     182     183     184     185     186     187\r\n     188     189     190     191     192     193     194     195     196     197\r\n     198     199     200     201     202     203     204     205     206     207\r\n     208     209     210     211     212     213     214     215     216     217\r\n     218     219     220     221     222     223     224     225     226     227\r\n     228     229     230     231     232     233     234     235     236     288\r\n     342     396     664     665     666     667     668     669     670     671\r\n     672     673     777     989    1202    1256     157     158     159     160\r\n     161     162     163     164     165     166     167     168     169     170\r\n     171     172     173     174     175     176     177     178     179     180\r\n     181     182     183     184     185     186     187     188     189     190\r\n     191     192     193     194     195     196     197     198     199     200\r\n     201     202     203     204     205     206     207     208     209     210\r\n     211     212     213     214     215     216     217     218     219     220\r\n     221     222     223     224     225     226     227     228     229     230\r\n     231     232     233     234     235     236     289     343     397     664\r\n     665     666     667     668     669     670     671     673     696     778\r\n     990    1203    1256     157     158     159     160     161     162     163\r\n     164     165     166     167     168     169     170     171     172     173\r\n     174     175     176     177     178     179     180     181     182     183\r\n     184     185     186     187     188     189     190     191     192     193\r\n     194     195     196     197     198     199     200     201     202     203\r\n     204     205     206     207     208     209     210     211     212     213\r\n     214     215     216     217     218     219     220     221     222     223\r\n     224     225     226     227     228     229     230     231     232     233\r\n     234     235     236     344     398     664     665     666     667     668\r\n     669     670     671     779     157     158     159     160     161     162\r\n     163     164     165     166     167     168     169     170     171     172\r\n     173     174     175     176     177     178     179     180     181     182\r\n     183     184     185     186     187     188     189     190     191     192\r\n     193     194     195     196     197     198     199     200     201     202\r\n     203     204     205     206     207     208     209     210     211     212\r\n     213     214     215     216     217     218     219     220     221     222\r\n     223     224     225     226     227     228     229     230     231     232\r\n     233     234     235     236     291     345     399     664     665     666\r\n     667     668     669     670     671     673     678     696     697     780\r\n     992    1205    1256     157     158     159     160     161     162     163\r\n     164     165     166     167     168     169     170     171     172     173\r\n     174     175     176     177     178     179     180     181     182     183\r\n     184     185     186     187     188     189     190     191     192     193\r\n     194     195     196     197     198     199     200     201     202     203\r\n     204     205     206     207     208     209     210     211     212     213\r\n     214     215     216     217     218     219     220     221     222     223\r\n     224     225     226     227     228     229     230     231     232     233\r\n     234     235     236     346     400     664     665     666     667     668\r\n     669     670     671     674     675     693     781     993    1206     157\r\n     158     159     160     161     162     163     164     165     166     167\r\n     168     169     170     171     172     173     174     175     176     177\r\n     178     179     180     181     182     183     184     185     186     187\r\n     188     189     190     191     192     193     194     195     196     197\r\n     198     199     200     201     202     203     204     205     206     207\r\n     208     209     210     211     212     213     214     215     216     217\r\n     218     219     220     221     222     223     224     225     226     227\r\n     228     229     230     231     232     233     234     235     236     293\r\n     347     401     664     665     666     667     668     669     670     671\r\n     672     695     696     697     705     782    1256     157     158     159\r\n     160     161     162     163     164     165     166     167     168     169\r\n     170     171     172     173     174     175     176     177     178     179\r\n     180     181     182     183     184     185     186     187     188     189\r\n     190     191     192     193     194     195     196     197     198     199\r\n     200     201     202     203     204     205     206     207     208     209\r\n     210     211     212     213     214     215     216     217     218     219\r\n     220     221     222     223     224     225     226     227     228     229\r\n     230     231     232     233     234     235     236     294     348     402\r\n     664     665     666     667     668     669     670     671     675     677\r\n     693     695     698     783    1256     295     349     403     664     665\r\n     666     667     668     669     670     671     672     696     699     705\r\n     784    1256     296     350     404     673     785    1256     297     351\r\n     405     674     693     786     998    1211    1256     352     406     664\r\n     665     666     667     668     669     670     671     674     675     677\r\n     688     691     692     693     698     787     999    1212     353     407\r\n     676     710     788    1000    1213    1256     300     354     408     675\r\n     677     789    1256     301     355     409     678     790    1256     302\r\n     356     410     664     665     666     667     668     669     670     671\r\n     679     681     696     705     709     711     791    1003    1216    1256\r\n     303     357     411     680     792    1256     304     358     412     681\r\n     793    1256     305     359     413     682     794    1256     306     360\r\n     414     683     795    1256     307     361     415     684     796    1256\r\n     362     416     685     719     797    1009    1222     309     686     706\r\n     710     798    1010    1223     310     364     418     687     716     717\r\n     718     719     799    1011    1224    1256     365     419     688     719\r\n     800    1012    1225     366     420     689     719     801     367     421\r\n     690     710     712     802    1014    1227     314     368     422     691\r\n     803    1256     315     369     423     664     665     666     667     668\r\n     669     670     671     672     674     675     677     679     681     683\r\n     692     693     704     705     710     712     804    1016    1229    1256\r\n     316     370     424     664     665     666     667     668     669     670\r\n     671     672     674     677     680     681     682     687     688     689\r\n     690     691     692     693     694     695     696     698     699     705\r\n     707     708     709     710     711     712     805    1017    1230    1256\r\n     317     371     425     664     665     666     667     668     669     670\r\n     671     672     689     694     705     709     710     806    1018    1231\r\n    1256     318     372     426     695     807    1256     319     373     427\r\n     672     696     697     705     808    1256     320     374     428     673\r\n     678     692     695     696     697     705     809    1021    1234    1256\r\n     321     375     429     677     693     698     705     810    1256     322\r\n     376     430     679     680     682     688     689     690     691     699\r\n     700     709     710     811    1023    1236    1256     377     431     672\r\n     673     674     675     676     677     678     679     680     682     683\r\n     686     687     688     689     690     691     692     693     694     695\r\n     696     697     698     699     700     701     702     704     705     706\r\n     707     708     812    1024    1237    1256     324     378     432     673\r\n     676     684     690     701     703     710     712     813    1025    1238\r\n    1256     379     433     697     702     814    1256     326     380     434\r\n     684     703     705     815    1027    1240    1256     327     381     435\r\n     680     684     685     686     687     688     689     690     691     692\r\n     704     705     708     710     719     816    1028    1241    1256     328\r\n     382     436     664     665     666     667     668     669     670     671\r\n     672     676     677     678     679     684     687     688     689     690\r\n     692     694     695     699     700     701     703     704     705     706\r\n     708     710     817    1029    1242    1256     383     437     706     710\r\n     712     818     384     438     676     690     700     703     704     707\r\n     819     385     439     664     665     666     667     668     669     670\r\n     671     672     673     674     675     676     677     678     679     680\r\n     681     682     683     684     685     686     687     688     689     690\r\n     691     692     693     694     695     696     697     698     699     700\r\n     701     702     703     704     705     706     707     708     709     710\r\n     711     712     713     716     717     718     719     774     775     776\r\n     777     778     780     781     782     783     784     785     786     787\r\n     788     789     790     791     792     793     794     796     798     799\r\n     800     801     802     803     804     805     806     807     808     809\r\n     810     811     812     813     815     816     817     819     820    1256\r\n     386     440     664     665     666     667     668     669     670     671\r\n     672     673     674     675     676     677     678     679     680     681\r\n     682     683     684     685     686     687     688     689     690     691\r\n     692     693     694     695     696     697     698     699     700     701\r\n     702     703     704     705     706     707     708     709     710     711\r\n     712     713     716     717     718     719     774     775     776     777\r\n     778     780     781     782     783     784     785     786     787     788\r\n     789     790     791     792     793     794     795     796     798     799\r\n     800     801     802     803     804     805     806     807     808     809\r\n     810     811     812     813     815     816     817     819     821    1256\r\n     387     441     710     716     717     718     719     822     388     442\r\n     664     665     666     667     668     669     670     671     672     673\r\n     674     675     676     677     678     679     680     681     682     683\r\n     684     685     686     687     688     689     690     691     692     693\r\n     694     695     696     697     698     699     700     701     702     703\r\n     704     705     706     707     708     709     710     711     712     823\r\n    1256     389     443     712     824    1256     390     444     713     825\r\n     391     445     714     826     392     446     707     715     827     339\r\n     672     720     986    1199     340     664     665     666     667     668\r\n     669     670     671     721     987    1200     341     664     665     666\r\n     667     668     669     670     671     722     988    1201     288     342\r\n     396     664     665     666     667     668     669     670     671     673\r\n     723     989    1202    1256     289     343     397     673     697     724\r\n     990    1203    1256     344     725     291     345     399     678     726\r\n     992    1205    1256     346     674     675     693     727     993    1206\r\n     293     347     401     728    1256     294     348     402     729    1256\r\n     295     349     403     730    1256     296     350     404     731    1256\r\n     297     351     405     693     732     998    1211    1256     352     675\r\n     693     733     999    1212     353     710     734    1000    1213     300\r\n     354     408     677     735    1256     301     355     409     736    1256\r\n     302     356     410     711     737    1003    1216    1256     303     357\r\n     411     738    1256     304     358     412     739    1256     305     359\r\n     413     682     740    1256     306     360     414     741    1256     307\r\n     361     415     684     719     742    1256     362     719     743    1009\r\n    1222     309     417     686     706     707     744    1010    1223    1256\r\n     310     364     418     716     717     718     719     745    1011    1224\r\n    1256     365     688     719     746    1012    1225     366     689     747\r\n     367     710     748    1014    1227     314     368     422     691     749\r\n    1256     315     369     423     664     665     666     667     668     669\r\n     670     671     679     691     692     710     750    1016    1229    1256\r\n     316     370     424     693     751    1017    1230    1256     317     371\r\n     425     664     665     666     667     668     669     670     671     672\r\n     687     693     694     710     716     752    1018    1231    1256     318\r\n     372     426     753    1256     319     373     427     754    1256     320\r\n     374     428     673     697     755    1021    1234    1256     321     375\r\n     429     698     756    1256     322     376     430     664     665     666\r\n     667     668     669     670     671     673     679     691     692     693\r\n     699     709     710     711     757    1023    1236    1256     377     672\r\n     673     674     675     676     677     678     679     680     682     683\r\n     686     687     688     689     690     691     692     693     694     695\r\n     696     697     698     699     700     701     702     704     705     706\r\n     707     708     758    1024    1237     324     378     432     673     710\r\n     759    1025    1238    1256     379     760     326     380     434     703\r\n     761    1027    1240    1256     327     381     435     687     704     708\r\n     710     716     717     718     719     762    1028    1241    1256     328\r\n     382     436     664     665     666     667     668     669     670     671\r\n     672     679     705     708     716     717     719     763    1029    1242\r\n    1256     383     764     384     765     385     766     386     767     387\r\n     768     388     769     389     770     390     713     771     391     772\r\n     392     773       1       2       3       4       5       6       7       8\r\n       9      10      11      12      13      14      15      16      17      18\r\n      19      20      21      22      23      24      25      26      27      28\r\n      29      30      31      32      33      34      35      36      37      38\r\n      39      40      41      42      43      44      45      46      47      48\r\n      49      50      53      54      55      56      57      58      59      60\r\n      61      62      63      64      65      66      67      68      69      70\r\n      71      72      73      74      75      76      77      78      79      80\r\n      81      82      83      84      85      86      87      88      89      90\r\n      91      92      93      94      95      96      97      98      99     100\r\n     102     103     104     105     106     107     108     109     110     111\r\n     112     113     114     115     116     117     118     119     120     121\r\n     122     123     124     125     126     127     128     129     130     131\r\n     132     133     134     135     136     137     138     139     140     141\r\n     142     143     144     145     146     147     148     149     150     151\r\n     152     154     155     156     664     665     666     667     668     669\r\n     670     671     672     673     674     675     676     677     678     679\r\n     680     681     682     683     684     685     686     687     688     689\r\n     690     691     692     693     694     695     696     697     698     699\r\n     700     701     702     703     704     705     706     707     708     709\r\n     710     711     714     715    1258       1      53     105     664     828\r\n       2      54     106     665     829       3      55     107     666     830\r\n       4      56     108     667     831       5      57     109     668     832\r\n       6      58     110     669     833       7      59     111     670     834\r\n       8      60     112     671     835       9      61     113     672     836\r\n      10      62     114     673     837      11      63     115     674     838\r\n      12      64     116     675     839      13      65     117     676     840\r\n      14      66     118     677     841      15      67     119     678     842\r\n      16      68     120     679     843      17      69     121     680     844\r\n      18      70     122     681     845      19      71     123     682     846\r\n      20      72     124     683     847      21      73     125     684     848\r\n      22      74     126     685     849      23      75     127     686     850\r\n      24      76     128     687     851      25      77     129     688     852\r\n      26      78     130     689     853      27      79     131     690     854\r\n      28      80     132     691     855      29      81     133     692     856\r\n      30      82     134     693     857      31      83     135     694     858\r\n      32      84     136     695     859      33      85     137     696     860\r\n      34      86     138     697     861      35      87     139     698     862\r\n      36      88     140     699     863      37      89     141     700     864\r\n      38      90     142     701     865      39      91     143     702     866\r\n      40      92     144     703     867      41      93     145     704     868\r\n      42      94     146     705     869      43      95     147     706     870\r\n      44      96     148     707     871      45      97     149     708     872\r\n      46      98     150     709     873      47      99     151     710     874\r\n      48     100     152     711     875      49     153     712     876      50\r\n     102     154     877     103     878     104     879       1      53     105\r\n     664       2      54     106     665       3      55     107     666       4\r\n      56     108     667       5      57     109     668       6      58     110\r\n     669       7      59     111     670       8      60     112     671     113\r\n     114     115     116     117     118     119     120     121     122     123\r\n     124     125     126     127     128     129     130     131     132     133\r\n     134     135     136     137     138     139     140     141     142     143\r\n     144     145     146     147     148     149     150     151     152     153\r\n     154     155     156     393     447     394     448     395     449     396\r\n     447     448     449     450     451     452     453     454     455     456\r\n     457     458     459     460     461     462     463     464     465     466\r\n     467     468     469     470     471     472     473     474     475     476\r\n     477     478     479     480     481     482     483     484     485     486\r\n     487     488     489     490     491     492     493     494     495     496\r\n     497     498     499     500     397     447     448     449     450     451\r\n     452     453     454     455     456     457     458     459     460     461\r\n     462     463     464     465     466     467     468     469     470     471\r\n     472     473     474     475     476     477     478     479     480     481\r\n     482     483     484     485     486     487     488     489     490     491\r\n     492     493     494     495     496     497     498     499     500     398\r\n     452     399     447     448     449     450     451     452     453     454\r\n     455     456     457     458     459     460     461     462     463     464\r\n     465     466     467     468     469     470     471     472     473     474\r\n     475     476     477     478     479     480     481     482     483     484\r\n     485     486     487     488     489     490     491     492     493     494\r\n     495     496     497     498     499     500     400     454     401     447\r\n     448     449     450     451     452     453     454     455     456     457\r\n     458     459     460     461     462     463     464     465     466     467\r\n     468     469     470     471     472     473     474     475     476     477\r\n     478     479     480     481     482     483     484     485     486     487\r\n     488     489     490     491     492     493     494     495     496     497\r\n     498     499     500     402     447     448     449     450     451     452\r\n     453     454     455     456     457     458     459     460     461     462\r\n     463     464     465     466     467     468     469     470     471     472\r\n     473     474     475     476     477     478     479     480     481     482\r\n     483     484     485     486     487     488     489     490     491     492\r\n     493     494     495     496     497     498     499     500     403     447\r\n     448     449     450     451     452     453     454     455     456     457\r\n     458     459     460     461     462     463     464     465     466     467\r\n     468     469     470     471     472     473     474     475     476     477\r\n     478     479     480     481     482     483     484     485     486     487\r\n     488     489     490     491     492     493     494     495     496     497\r\n     498     499     500     404     447     448     449     450     451     452\r\n     453     454     455     456     457     458     459     460     461     462\r\n     463     464     465     466     467     468     469     470     471     472\r\n     473     474     475     476     477     478     479     480     481     482\r\n     483     484     485     486     487     488     489     490     491     492\r\n     493     494     495     496     497     498     499     500     405     447\r\n     448     449     450     451     452     453     454     455     456     457\r\n     458     459     460     461     462     463     464     465     466     467\r\n     468     469     470     471     472     473     474     475     476     477\r\n     478     479     480     481     482     483     484     485     486     487\r\n     488     489     490     491     492     493     494     495     496     497\r\n     498     499     500     406     460     407     447     448     449     450\r\n     451     452     453     454     455     456     457     458     459     460\r\n     461     462     463     464     465     466     467     468     469     470\r\n     471     472     473     474     475     476     477     478     479     480\r\n     481     482     483     484     485     486     487     488     489     490\r\n     491     492     493     494     495     496     497     498     499     500\r\n     408     447     448     449     450     451     452     453     454     455\r\n     456     457     458     459     460     461     462     463     464     465\r\n     466     467     468     469     470     471     472     473     474     475\r\n     476     477     478     479     480     481     482     483     484     485\r\n     486     487     488     489     490     491     492     493     494     495\r\n     496     497     498     499     500     409     447     448     449     450\r\n     451     452     453     454     455     456     457     458     459     460\r\n     461     462     463     464     465     466     467     468     469     470\r\n     471     472     473     474     475     476     477     478     479     480\r\n     481     482     483     484     485     486     487     488     489     490\r\n     491     492     493     494     495     496     497     498     499     500\r\n     410     447     448     449     450     451     452     453     454     455\r\n     456     457     458     459     460     461     462     463     464     465\r\n     466     467     468     469     470     471     472     473     474     475\r\n     476     477     478     479     480     481     482     483     484     485\r\n     486     487     488     489     490     491     492     493     494     495\r\n     496     497     498     499     500     411     447     448     449     450\r\n     451     452     453     454     455     456     457     458     459     460\r\n     461     462     463     464     465     466     467     468     469     470\r\n     471     472     473     474     475     476     477     478     479     480\r\n     481     482     483     484     485     486     487     488     489     490\r\n     491     492     493     494     495     496     497     498     499     500\r\n     412     447     448     449     450     451     452     453     454     455\r\n     456     457     458     459     460     461     462     463     464     465\r\n     466     467     468     469     470     471     472     473     474     475\r\n     476     477     478     479     480     481     482     483     484     485\r\n     486     487     488     489     490     491     492     493     494     495\r\n     496     497     498     499     500     413     447     448     449     450\r\n     451     452     453     454     455     456     457     458     459     460\r\n     461     462     463     464     465     466     467     468     469     470\r\n     471     472     473     474     475     476     477     478     479     480\r\n     481     482     483     484     485     486     487     488     489     490\r\n     491     492     493     494     495     496     497     498     499     500\r\n     414     447     448     449     450     451     452     453     454     455\r\n     456     457     458     459     460     461     462     463     464     465\r\n     466     467     468     469     470     471     472     473     474     475\r\n     476     477     478     479     480     481     482     483     484     485\r\n     486     487     488     489     490     491     492     493     494     495\r\n     496     497     498     499     500     415     447     448     449     450\r\n     451     452     453     454     455     456     457     458     459     460\r\n     461     462     463     464     465     466     467     468     469     470\r\n     471     472     473     474     475     476     477     478     479     480\r\n     481     482     483     484     485     486     487     488     489     490\r\n     491     492     493     494     495     496     497     498     499     500\r\n     416     470     417     447     448     449     450     451     452     453\r\n     454     455     456     457     458     459     460     461     462     463\r\n     464     465     466     467     468     469     470     471     472     473\r\n     474     475     476     477     478     479     480     481     482     483\r\n     484     485     486     487     488     489     490     491     492     493\r\n     494     495     496     497     498     499     500     418     447     448\r\n     449     450     451     452     453     454     455     456     457     458\r\n     459     460     461     462     463     464     465     466     467     468\r\n     469     470     471     472     473     474     475     476     477     478\r\n     479     480     481     482     483     484     485     486     487     488\r\n     489     490     491     492     493     494     495     496     497     498\r\n     499     500     419     473     420     474     421     475     422     447\r\n     448     449     450     451     452     453     454     455     456     457\r\n     458     459     460     461     462     463     464     465     466     467\r\n     468     469     470     471     472     473     474     475     476     477\r\n     478     479     480     481     482     483     484     485     486     487\r\n     488     489     490     491     492     493     494     495     496     497\r\n     498     499     500     423     447     448     449     450     451     452\r\n     453     454     455     456     457     458     459     460     461     462\r\n     463     464     465     466     467     468     469     470     471     472\r\n     473     474     475     476     477     478     479     480     481     482\r\n     483     484     485     486     487     488     489     490     491     492\r\n     493     494     495     496     497     498     499     500     424     447\r\n     448     449     450     451     452     453     454     455     456     457\r\n     458     459     460     461     462     463     464     465     466     467\r\n     468     469     470     471     472     473     474     475     476     477\r\n     478     479     480     481     482     483     484     485     486     487\r\n     488     489     490     491     492     493     494     495     496     497\r\n     498     499     500     425     447     448     449     450     451     452\r\n     453     454     455     456     457     458     459     460     461     462\r\n     463     464     465     466     467     468     469     470     471     472\r\n     473     474     475     476     477     478     479     480     481     482\r\n     483     484     485     486     487     488     489     490     491     492\r\n     493     494     495     496     497     498     499     500     426     447\r\n     448     449     450     451     452     453     454     455     456     457\r\n     458     459     460     461     462     463     464     465     466     467\r\n     468     469     470     471     472     473     474     475     476     477\r\n     478     479     480     481     482     483     484     485     486     487\r\n     488     489     490     491     492     493     494     495     496     497\r\n     498     499     500     427     447     448     449     450     451     452\r\n     453     454     455     456     457     458     459     460     461     462\r\n     463     464     465     466     467     468     469     470     471     472\r\n     473     474     475     476     477     478     479     480     481     482\r\n     483     484     485     486     487     488     489     490     491     492\r\n     493     494     495     496     497     498     499     500     428     447\r\n     448     449     450     451     452     453     454     455     456     457\r\n     458     459     460     461     462     463     464     465     466     467\r\n     468     469     470     471     472     473     474     475     476     477\r\n     478     479     480     481     482     483     484     485     486     487\r\n     488     489     490     491     492     493     494     495     496     497\r\n     498     499     500     429     447     448     449     450     451     452\r\n     453     454     455     456     457     458     459     460     461     462\r\n     463     464     465     466     467     468     469     470     471     472\r\n     473     474     475     476     477     478     479     480     481     482\r\n     483     484     485     486     487     488     489     490     491     492\r\n     493     494     495     496     497     498     499     500     430     447\r\n     448     449     450     451     452     453     454     455     456     457\r\n     458     459     460     461     462     463     464     465     466     467\r\n     468     469     470     471     472     473     474     475     476     477\r\n     478     479     480     481     482     483     484     485     486     487\r\n     488     489     490     491     492     493     494     495     496     497\r\n     498     499     500     431     447     448     449     450     451     452\r\n     453     454     455     456     457     458     459     460     461     462\r\n     463     464     465     466     467     468     469     470     471     472\r\n     473     474     475     476     477     478     479     480     481     482\r\n     483     484     485     486     487     488     489     490     491     492\r\n     493     494     495     496     497     498     499     500     432     447\r\n     448     449     450     451     452     453     454     455     456     457\r\n     458     459     460     461     462     463     464     465     466     467\r\n     468     469     470     471     472     473     474     475     476     477\r\n     478     479     480     481     482     483     484     485     486     487\r\n     488     489     490     491     492     493     494     495     496     497\r\n     498     499     500     433     447     448     449     450     451     452\r\n     453     454     455     456     457     458     459     460     461     462\r\n     463     464     465     466     467     468     469     470     471     472\r\n     473     474     475     476     477     478     479     480     481     482\r\n     483     484     485     486     487     488     489     490     491     492\r\n     493     494     495     496     497     498     499     500     434     447\r\n     448     449     450     451     452     453     454     455     456     457\r\n     458     459     460     461     462     463     464     465     466     467\r\n     468     469     470     471     472     473     474     475     476     477\r\n     478     479     480     481     482     483     484     485     486     487\r\n     488     489     490     491     492     493     494     495     496     497\r\n     498     499     500     435     447     448     449     450     451     452\r\n     453     454     455     456     457     458     459     460     461     462\r\n     463     464     465     466     467     468     469     470     471     472\r\n     473     474     475     476     477     478     479     480     481     482\r\n     483     484     485     486     487     488     489     490     491     492\r\n     493     494     495     496     497     498     499     500     436     447\r\n     448     449     450     451     452     453     454     455     456     457\r\n     458     459     460     461     462     463     464     465     466     467\r\n     468     469     470     471     472     473     474     475     476     477\r\n     478     479     480     481     482     483     484     485     486     487\r\n     488     489     490     491     492     493     494     495     496     497\r\n     498     499     500     437     491     438     492     439     447     448\r\n     449     450     451     452     453     454     455     456     457     458\r\n     459     460     461     462     463     464     465     466     467     468\r\n     469     470     471     472     473     474     475     476     477     478\r\n     479     480     481     482     483     484     485     486     487     488\r\n     489     490     491     492     493     494     495     496     497     498\r\n     499     500     440     447     448     449     450     451     452     453\r\n     454     455     456     457     458     459     460     461     462     463\r\n     464     465     466     467     468     469     470     471     472     473\r\n     474     475     476     477     478     479     480     481     482     483\r\n     484     485     486     487     488     489     490     491     492     493\r\n     494     495     496     497     498     499     500     441     495     442\r\n     447     448     449     450     451     452     453     454     455     456\r\n     457     458     459     460     461     462     463     464     465     466\r\n     467     468     469     470     471     472     473     474     475     476\r\n     477     478     479     480     481     482     483     484     485     486\r\n     487     488     489     490     491     492     493     494     495     496\r\n     497     498     499     500     443     447     448     449     450     451\r\n     452     453     454     455     456     457     458     459     460     461\r\n     462     463     464     465     466     467     468     469     470     471\r\n     472     473     474     475     476     477     478     479     480     481\r\n     482     483     484     485     486     487     488     489     490     491\r\n     492     493     494     495     496     497     498     499     500     444\r\n     498     445     499     446     500     501     774    1254     502     775\r\n    1254     503     776    1254     504     777    1254     505     778    1254\r\n     506     779     507     780    1254     508     781    1254     509     782\r\n    1254     510     783    1254     511     784    1254     512     785    1254\r\n     513     786    1254     514     787    1254     515     788    1254     516\r\n     789    1254     517     790    1254     518     791    1254     519     792\r\n    1254     520     793    1254     521     794    1254     522     795    1254\r\n     523     796    1254     524     797     525     798    1254     526     799\r\n    1254     527     800    1254     528     801    1254     529     802    1254\r\n     530     803    1254     531     804    1254     532     805    1254     533\r\n     806    1254     534     807    1254     535     808    1254     536     809\r\n    1254     537     810    1254     538     811    1254     539     812    1254\r\n     540     813    1254     541     814     542     815    1254     543     816\r\n    1254     544     817    1254     545     818     546     819    1254     547\r\n     820     548     821     549     822     550     823     551     824     552\r\n     825    1254     553     826     554     827     716     828     829     830\r\n     831     832     833     834     835     977    1257     717     836     837\r\n     838     839     840     841     842     843     844     845     846     847\r\n     848     849     850     851     852     853     854     855     856     857\r\n     858     859     860     861     862     863     864     865     866     867\r\n     868     869     977    1257     718     870     871     879     977    1257\r\n     719     872     873     874     875     876     877     878     880     925\r\n     881     926     882     927     883     928     884     929     885     930\r\n     886     931     887     932     888     933     889     934     890     935\r\n     891     936     892     937     893     938     894     939     895     940\r\n     896     941     897     942     898     943     899     944     900     945\r\n     901     946     902     947     903     948     904     949     905     950\r\n     906     951     907     952     908     953     909     954     910     955\r\n     911     956     912     957     913     958     914     959     915     960\r\n     916     961     917     962     918     963     919     964     920     965\r\n     921     966     922     967     923     968     969     970     971     972\r\n     973     974     975     924     976     828     880     829     881     830\r\n     882     831     883     832     884     833     885     834     886     835\r\n     887     836     888     837     889     838     890     839     891     840\r\n     892     841     893     842     894     843     895     844     896     845\r\n     897     846     898     847     899     848     900     849     901     850\r\n     902     851     903     852     904     853     905     854     906     855\r\n     907     856     908     857     909     858     910     859     911     860\r\n     912     861     913     862     914     863     915     864     916     865\r\n     917     866     918     867     919     868     920     869     921     870\r\n     922     871     923     872     873     874     875     876     877     878\r\n     879     924     880     881     882     883     884     885     886     887\r\n     888     889     890     891     892     893     894     895     896     897\r\n     898     899     900     901     902     903     904     905     906     907\r\n     908     909     910     911     912     913     914     915     916     917\r\n     918     919     920     921     922     923     924    1094    1253    1255\r\n    1254    1255    1255     663    1256    1258     985    1257     447     448\r\n     449     450     451     452     453     454     455     456     457     458\r\n     459     460     461     462     463     464     465     466     467     468\r\n     469     470     471     472     473     474     475     476     477     478\r\n     479     480     481     482     483     484     485     486     487     488\r\n     489     490     491     492     493     494     495     496     497     498\r\n     499     500     663     977     985     775     776     777     779     780\r\n     782     783     784     785     786     788     790     791     792     793\r\n     794     795     796     797     798     799     800     801     802     803\r\n     804     805     806     808     809     810     811     812     813     814\r\n     815     816     817     818     820     821     822     823     824     825\r\n     826     827                                                                \r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -5.93589153D-03 -8.27388279D-03\r\n -8.60892702D-03 -1.37353456D-03 -4.92890272D-03 -1.55171787D-04 -1.30801986D-04\r\n -8.56874278D-04 -1.83234370D-04 -1.37678441D-03 -9.81827034D-04 -3.93233960D-03\r\n -3.73784045D-04 -6.89376247D-05 -1.66634141D-04 -1.05326253D-04 -1.00132599D-02\r\n -9.98593494D-03 -5.46094589D-03 -7.06019695D-04 -2.78090150D-03 -2.38090535D-04\r\n -1.64178631D-03 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -6.19863123D-02\r\n -7.16687143D-02 -6.68680817D-02 -1.15005681D-02 -1.90558087D-04 -7.38000050D-02\r\n -2.59988802D-03 -1.93114602D-03 -3.63798230D-03 -1.55267026D-03 -9.03802924D-03\r\n -6.42052805D-03 -3.30437534D-02 -3.13421409D-03 -5.57913794D-04 -1.34995126D-03\r\n -6.88492961D-04 -7.00013712D-02 -7.00070336D-02 -3.82313095D-02 -8.13334715D-03\r\n -1.48213431D-02 -2.86629447D-03 -5.33711677D-03 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -6.43365784D-03 -1.46014765D-01 -1.32799476D-01 -4.80291620D-02\r\n -1.27418283D-02 -2.09978819D-01 -6.17644563D-03 -3.45171918D-03 -9.97103006D-03\r\n -2.30328832D-03 -1.80562958D-02 -1.28339566D-02 -4.90272008D-02 -4.65024495D-03\r\n -8.43684305D-04 -2.04204884D-03 -1.37659872D-03 -1.69996798D-01 -1.70007035D-01\r\n -9.28501487D-02 -3.88781494D-03 -4.44640294D-02 -6.44817576D-03 -9.85071808D-03\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -9.52748433D-02 -1.84948742D-01\r\n -2.01589674D-01 -2.73518991D-02 -4.88014601D-04 -1.38668075D-01 -6.40007528D-03\r\n -4.22320887D-03 -2.66946550D-03 -2.67779361D-03 -1.42026180D-02 -1.00969886D-02\r\n -5.69765754D-02 -5.40477782D-03 -9.67531581D-04 -2.34273169D-03 -1.08307914D-03\r\n -1.80010065D-01 -1.79992974D-01 -9.83157754D-02 -1.23726027D-02 -1.11134751D-02\r\n -4.53819009D-03 -7.38803856D-03 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -8.71037971D-03 -1.18917592D-01 -1.02624908D-01 -3.30613479D-02 -6.81361323D-03\r\n -1.36338934D-01 -3.95535911D-03 -2.64995149D-03 -1.38095417D-03 -1.48837746D-03\r\n -6.73240982D-03 -4.78634099D-03 -3.16886082D-02 -3.00652371D-03 -5.41481015D-04\r\n -1.31053664D-03 -5.13465493D-04 -1.29989490D-01 -1.29992962D-01 -7.10063577D-02\r\n -3.18179536D-03 -6.48370478D-03 -2.38879793D-03 -4.10446571D-03 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -2.51121563D-03 -2.03185737D-01 -1.92379743D-01\r\n -5.52012399D-02 -2.22557895D-02 -2.92612076D-01 -2.19613705D-02 -5.13518928D-03\r\n -1.95196667D-03 -2.93014268D-03 -1.19892228D-02 -8.52459297D-03 -6.23729564D-02\r\n -5.91553887D-03 -1.05771166D-03 -2.56029260D-03 -9.14247415D-04 -2.39998177D-01\r\n -2.40014061D-01 -1.31086141D-01 -3.88781494D-03 -8.33763927D-03 -4.29878384D-03\r\n -7.38803856D-03 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -9.12127737D-03\r\n -9.66502652D-02 -8.96248892D-02 -1.80861093D-02 -2.58647744D-03 -3.19746435D-02\r\n -8.87065381D-03 -2.36170273D-03 -8.52607656D-04 -6.57393481D-04 -4.91426373D-03\r\n -3.49397887D-03 -1.39749302D-02 -1.32565643D-03 -2.53706501D-04 -6.14048797D-04\r\n -3.74643947D-04 -1.10008687D-01 -1.09985933D-01 -6.00797832D-02 -1.76975597D-03\r\n -3.70280328D-03 -1.67189550D-03 -2.46267952D-03 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.72779313D-03 -7.32349306D-02 -6.92287683D-02 -3.76125723D-02\r\n -6.32327469D-03 -1.11695595D-01 -2.23021419D-03 -1.86090055D-03 -2.39640358D-04\r\n -1.08172570D-03 -4.17646533D-03 -2.96730525D-03 -2.30374597D-02 -2.18466320D-03\r\n -3.89978552D-04 -9.44000029D-04 -3.18302133D-04 -8.99821669D-02 -9.00140628D-02\r\n -4.91578877D-02 -1.41517725D-03 -9.26967128D-04 -1.43248949D-03 -2.87443749D-03\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -5.39141834D-01\r\n -7.24108219D-02 -2.70749658D-01 -1.21773174D-02 -4.69028950D-03 -1.54549666D-02\r\n -1.32671088D-01 -5.41632026D-02 -2.29070000D-02 -1.02059292D-02 -2.30139447D-03\r\n -5.57160983D-03 -7.13856425D-04 -1.00000000D+00 -4.73746061D-01 -3.32121551D-02\r\n -4.78609577D-02 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.28765732D-01 -3.11814636D-01 -2.33154781D-02 -7.09880516D-02 -4.69889343D-02\r\n -3.15410877D-03 -1.07982764D-02 -5.53905789D-04 -1.34165853D-03 -2.59249733D-04\r\n -1.31625205D-01 -1.44391209D-01 -5.64676113D-02 -2.39616428D-02 -5.95942466D-03\r\n -1.50985867D-01 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -6.88045193D-03 -1.94378905D-02 -4.44655260D-03 -2.45325267D-04 -5.37030539D-03\r\n -1.53506466D-04 -3.71707312D-04 -7.68649334D-05 -9.63710174D-02 -7.38798082D-03\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -9.01386291D-02\r\n -1.22320458D-01 -3.04286312D-02 -8.37532878D-02 -4.68578050D-03 -1.73666712D-03\r\n -4.20468301D-03 -6.42606348D-04 -6.97601080D-01 -3.87774557D-01 -6.43205643D-03\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -5.67285763D-03\r\n -8.43898356D-02 -7.12952465D-02 -2.18436681D-03 -2.09217687D-04 -5.06146345D-04\r\n -1.28947213D-04 -3.80237587D-03 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -2.41041323D-03 -1.25423633D-02 -1.31881451D-02 -1.33477459D-02\r\n -5.36979139D-01 -5.27575752D-03 -1.30613148D-01 -6.97793090D-04 -1.68956094D-03\r\n -2.89647200D-04 -3.43984067D-01 -5.14919870D-03 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.01745531D-01 -2.69539990D-02 -4.38700983D-04\r\n -3.81027572D-02 -2.16832879D-04 -5.24975592D-04 -9.08051734D-05 -4.47068959D-02\r\n -6.04115834D-04 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.70154739D-02 -5.44804186D-02 -2.94610416D-03 -3.52424942D-03 -5.30659396D-04\r\n -1.28507311D-03 -3.73675866D-04 -1.34332012D-02 -1.33385956D-01 -3.07743694D-03\r\n -3.23741399D-02 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -5.22729533D-04 -4.91144974D-03 -1.17239055D-04 -4.91660368D-03 -4.84968186D-05\r\n -1.17170734D-04 -3.02038534D-05 -1.20823162D-04 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.84873845D-02 -9.48597852D-04 -1.18245208D-03\r\n -3.76752141D-05 -9.16097561D-05 -2.07167450D-05 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -7.71998952D-04 -1.67202950D-02 -6.54269592D-04\r\n -8.01600327D-05 -1.94536580D-04 -4.97589099D-05 -2.03145415D-01 -7.49814324D-04\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -3.93997468D-02\r\n -3.02552417D-05 -1.28256052D-05 -3.05365866D-05 -9.09987830D-06 -3.55362245D-05\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -4.90518920D-02\r\n -3.67200300D-02 -2.71796845D-02 -3.59273776D-02 -2.38876892D-04 -5.77658531D-04\r\n -1.04939027D-04 -5.05565293D-02 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.21411122D-03 -6.01200236D-06 -1.42439021D-05 -3.67867437D-06\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -3.47935274D-04\r\n -2.35384447D-03 -3.32664131D-05 -7.99024419D-05 -1.47146975D-05 -1.36343017D-01\r\n -3.37594131D-04 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.82508340D-03 -9.35265142D-03 -3.97599563D-02 -5.92482509D-03 -5.05008211D-04\r\n -1.22273166D-03 -7.55212503D-03 -3.74332629D-03 -9.20388196D-03 -9.66170877D-02\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -5.53583428D-02\r\n -1.56889856D-02 -1.50773702D-02 -8.01763905D-04 -3.58140953D-02 -3.03902687D-03\r\n -5.37873828D-04 -1.30273169D-03 -3.15010693D-04 -7.46915162D-01 -9.20388207D-04\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.96155044D-03\r\n -2.13435292D-02 -3.22694657D-03 -3.08981654D-03 -8.41127534D-04 -1.17707148D-03\r\n -4.40880176D-05 -1.06243904D-04 -6.73778268D-05 -1.00000000D+00 -3.56072956D-03\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -6.53464487D-03\r\n -4.78093931D-03 -2.98770494D-04 -1.25943303D-01 -7.90266134D-03 -1.20934229D-02\r\n -8.96510552D-04 -1.88376071D-04 -4.56000009D-04 -1.34755654D-04 -3.02057917D-04\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -3.42344381D-02\r\n -7.49491062D-03 -5.08867763D-02 -1.53167162D-03 -4.46431991D-03 -4.15228977D-04\r\n -1.00536586D-03 -2.18397094D-04 -1.15931267D-02 -1.34739932D-02 -2.05113031D-02\r\n -1.80524017D-03 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -2.25418378D-04 -3.57041694D-03 -2.39277597D-05 -1.42107746D-02 -2.45445641D-03\r\n -6.50260481D-04 -9.39567667D-03 -1.57514456D-04 -3.81170743D-04 -7.84138465D-05\r\n -1.52073503D-01 -1.34146260D-02 -2.97793560D-03 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.39835760D-01 -5.19003533D-02 -4.34840858D-01\r\n -3.61280963D-02 -8.04134309D-02 -1.93728089D-01 -1.11547887D-01 -1.16482680D-03\r\n -3.34107014D-03 -8.08946323D-03 -1.76595734D-03 -2.06027895D-01 -3.05439346D-03\r\n -6.12225473D-01 -1.51701225D-02 -9.47329998D-02 -3.37812342D-02 -1.57425471D-03\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -2.20819050D-03\r\n -2.20815986D-02 -1.26315630D-03 -6.98581478D-03 -1.08616841D-04 -2.63512193D-04\r\n -4.74355365D-05 -1.68003932D-01 -1.38235907D-03 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -3.79240662D-02 -3.79112288D-02 -3.78637087D-05\r\n -2.06161980D-02 -1.18751824D-03 -9.24244896D-03 -3.09818512D-04 -7.49756116D-04\r\n -1.13651680D-04 -1.90118793D-03 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.03008263D-01 -3.86701792D-01 -2.99895387D-02 -5.25375903D-02\r\n -1.23860007D-02 -5.47971984D-04 -8.51425901D-02 -6.35736883D-02 -1.41821441D-03\r\n -8.42481910D-04 -2.03999993D-03 -3.50635761D-04 -2.42357049D-03 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.66872039D-01 -3.37420292D-02\r\n -8.80064443D-02 -3.89158027D-03 -6.62715316D-01 -5.41481015D-04 -1.31102442D-03\r\n -2.28077814D-04 -1.27128080D-01 -8.09310284D-03 -7.43773161D-03 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -2.97079161D-02 -5.42924087D-03\r\n -2.06804206D-03 -3.53608117D-03 -2.03606483D-04 -4.92780469D-04 -9.89369801D-05\r\n -3.20892364D-01 -4.84358752D-03 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.22674100D-01 -1.09305168D-02 -2.05520347D-01 -4.30607721D-02\r\n -4.88937367D-03 -2.13786797D-03 -5.17551228D-03 -9.38836427D-04 -4.67726886D-01\r\n -4.98075709D-02 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -2.56573432D-03 -9.37912439D-04 -9.42864418D-02 -1.70647688D-02 -3.70740134D-04\r\n -8.98439030D-04 -2.28465040D-04 -6.78741897D-04 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -2.07248400D-03 -2.02045768D-01 -6.14770278D-02\r\n -2.10019280D-04 -5.07902412D-04 -1.28366373D-04 -1.47830695D-03 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -3.40371451D-04 -2.59070516D-01\r\n -6.81360279D-06 -1.66829268D-05 -6.38927668D-06 -6.04115834D-04 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.57857910D-02 -4.08238396D-02\r\n -5.86399846D-02 -1.60451792D-02 -3.32263327D-04 -8.04975629D-04 -1.56246853D-04\r\n -7.34207183D-02 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -4.65537570D-02 -1.24538131D-02 -4.12854701D-01 -3.76570015D-03 -4.29942692D-03\r\n -2.45209527D-03 -5.93648758D-03 -1.22170709D-03 -2.08562091D-02 -1.58014163D-01\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -3.14314887D-02\r\n -3.47981751D-02 -4.16617095D-03 -1.12184873D-02 -1.80052444D-02 -2.45015007D-02\r\n -1.56204402D-02 -2.99912523D-02 -2.06400584D-02 -3.67979356D-03 -4.41914909D-02\r\n -4.77933232D-03 -4.08415362D-04 -9.88682965D-04 -1.65540347D-04 -6.01272890D-03\r\n -3.15532461D-02 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.85339358D-02 -1.16104481D-03 -4.73614549D-04 -9.61920341D-06 -2.31219510D-05\r\n -4.22079465D-05 -3.23306620D-02 -1.04121130D-03 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -4.53286432D-03 -1.78381115D-01 -3.97593743D-04\r\n -9.62439051D-04 -1.75821269D-03 -1.00000000D+00 -4.71103936D-01 -3.14317912D-01\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -4.37515154D-02\r\n -5.10670662D-01 -1.60897091D-01 -7.86571670D-03 -2.05049361D-03 -4.96419519D-03\r\n -1.57118123D-03 -5.00001788D-01 -6.21112846D-02 -4.10499051D-02 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -6.98079586D-01 -1.94451973D-01\r\n -8.52652192D-02 -3.07986289D-02 -7.04887230D-03 -1.70657560D-02 -2.77327120D-01\r\n -1.43419951D-02 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -7.45730400D-01 -6.41808689D-01 -9.49445844D-01 -1.16051726D-01 -7.41642267D-02\r\n -1.46283031D-01 -1.69224694D-01 -1.78926215D-01 -1.40577674D-01 -1.35398041D-02\r\n -9.27194357D-01 -4.80118487D-03 -1.16230240D-02 -3.06480043D-02 -1.00000000D+00\r\n -1.00000000D+00 -1.75491393D-01 -1.90357510D-02 -2.82683177D-03 -2.79957622D-01\r\n -4.48854752D-02 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.33129418D-01 -1.00396676D-02 -3.90780158D-04 -9.46048764D-04 -6.60542548D-02\r\n -1.13310050D-02 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -3.76148261D-02 -4.02495340D-02 -2.78500728D-02 -4.21503261D-02 -7.28056729D-02\r\n -2.98596104D-04 -7.22439028D-04 -2.63993279D-03 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -8.09095241D-03 -9.52975638D-03 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00  1.00000000D+00 -3.56158568D-03\r\n  1.00000000D+00 -3.36924791D-02  1.00000000D+00 -9.01731327D-02  1.00000000D+00\r\n -5.66755012D-02  1.00000000D+00 -2.80031972D-02  1.00000000D+00 -4.98667546D-02\r\n  1.00000000D+00 -2.37598270D-02  1.00000000D+00 -1.64391100D-02  1.00000000D+00\r\n -2.31136009D-03  1.00000000D+00 -2.48041283D-03  1.00000000D+00 -1.27226813D-03\r\n  1.00000000D+00 -5.37730055D-03  1.00000000D+00 -2.57951277D-03  1.00000000D+00\r\n -1.56978657D-03  1.00000000D+00 -2.18602782D-03  1.00000000D+00 -8.61218385D-03\r\n  1.00000000D+00 -6.97780051D-04  1.00000000D+00 -5.19145164D-04  1.00000000D+00\r\n -1.32793898D-03  1.00000000D+00 -2.91506789D-04  1.00000000D+00 -1.51601026D-03\r\n  1.00000000D+00 -9.04286790D-05  1.00000000D+00 -1.42273973D-04  1.00000000D+00\r\n -7.39766378D-03  1.00000000D+00 -8.19738582D-03  1.00000000D+00 -2.08459608D-03\r\n  1.00000000D+00 -3.65354470D-03  1.00000000D+00 -4.88446048D-03  1.00000000D+00\r\n -1.22504996D-03  1.00000000D+00 -4.36096154D-02  1.00000000D+00 -6.93262264D-04\r\n  1.00000000D+00 -1.65846641D-03  1.00000000D+00 -8.10870528D-03  1.00000000D+00\r\n -3.22366226D-03  1.00000000D+00 -1.27204950D-03  1.00000000D+00 -1.30607868D-02\r\n  1.00000000D+00 -1.65249128D-03  1.00000000D+00 -1.77341502D-03  1.00000000D+00\r\n -3.16500373D-04  1.00000000D+00 -2.04896391D-03  1.00000000D+00 -2.36979984D-02\r\n  1.00000000D+00 -1.35482708D-03  1.00000000D+00 -1.56581530D-03  1.00000000D+00\r\n -5.38427010D-02  1.00000000D+00 -2.21645720D-02  1.00000000D+00 -1.42507151D-01\r\n  1.00000000D+00 -4.82241735D-02  1.00000000D+00 -1.79205015D-01  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00 -5.76346964D-02  1.00000000D+00 -3.17968652D-02\r\n  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.78465787D-02\r\n  1.00000000D+00 -5.69905678D-04  1.00000000D+00 -4.49396856D-03  1.00000000D+00\r\n -5.19715795D-05  1.00000000D+00 -1.39432741D-05  1.00000000D+00 -3.59829981D-03\r\n  1.00000000D+00 -2.16023461D-03  1.00000000D+00 -2.96454262D-02  1.00000000D+00\r\n -4.90016444D-03  1.00000000D+00 -1.30853141D-02  1.00000000D+00 -2.92256594D-01\r\n  1.00000000D+00 -4.58589569D-02  1.00000000D+00 -2.51878798D-02  1.00000000D+00\r\n -7.07555935D-03  1.00000000D+00 -3.27899330D-03  1.00000000D+00 -6.71901256D-02\r\n  1.00000000D+00 -4.52964678D-02  1.00000000D+00 -1.56934559D-01  1.00000000D+00\r\n -5.25400750D-02  1.00000000D+00 -8.18570703D-02  1.00000000D+00 -3.68810818D-02\r\n  1.00000000D+00 -1.44300938D-01  1.00000000D+00 -7.79947191D-02  1.00000000D+00\r\n -2.54118741D-01  1.00000000D+00 -2.48348296D-01  1.00000000D+00 -2.14205191D-01\r\n  1.00000000D+00 -1.20531969D-01  1.00000000D+00 -4.81847942D-01  1.00000000D+00\r\n -1.67683020D-01  1.00000000D+00 -2.87884384D-01  1.00000000D+00 -5.31182885D-01\r\n  1.00000000D+00 -3.48290294D-01  1.00000000D+00 -6.13069355D-01  1.00000000D+00\r\n -2.59709395D-02  1.00000000D+00 -8.81912094D-03  1.00000000D+00 -1.31283581D-01\r\n  1.00000000D+00 -1.15888983D-01  1.00000000D+00 -1.19731724D-01  1.00000000D+00\r\n -1.63664266D-01  1.00000000D+00 -1.43314779D-01  1.00000000D+00 -4.88956943D-02\r\n  1.00000000D+00 -1.82706028D-01  1.00000000D+00 -6.37331307D-02  1.00000000D+00\r\n -1.64185643D-01  1.00000000D+00 -1.31180644D-01  1.00000000D+00 -1.37433782D-01\r\n  1.00000000D+00 -7.62486756D-02  1.00000000D+00 -6.59873635D-02  1.00000000D+00\r\n -1.53722018D-01  1.00000000D+00 -1.00952752D-01  1.00000000D+00 -1.59418490D-02\r\n  1.00000000D+00 -1.75022557D-01  1.00000000D+00 -1.48241401D-01  1.00000000D+00\r\n -2.95332223D-01  1.00000000D+00 -4.35067326D-01  1.00000000D+00 -2.99447656D-01\r\n  1.00000000D+00 -4.29889739D-01  1.00000000D+00 -9.46358740D-02  1.00000000D+00\r\n -2.62589782D-01  1.00000000D+00 -1.57239005D-01  1.00000000D+00 -4.79257405D-02\r\n  1.00000000D+00 -6.81549832D-02  1.00000000D+00 -4.14365530D-02  1.00000000D+00\r\n -3.13165896D-02  1.00000000D+00 -4.82902043D-02  1.00000000D+00 -3.12532112D-02\r\n  1.00000000D+00 -1.65843651D-01  1.00000000D+00 -3.94780114D-02  1.00000000D+00\r\n -1.06069766D-01  1.00000000D+00 -1.06182404D-01  1.00000000D+00 -9.06958152D-03\r\n  1.00000000D+00 -3.50963511D-02  1.00000000D+00 -2.58430243D-02  1.00000000D+00\r\n -2.21948341D-01  1.00000000D+00 -1.25001445D-01  1.00000000D+00 -1.15588143D-01\r\n  1.00000000D+00 -4.41402867D-02  1.00000000D+00 -1.17391003D-02  1.00000000D+00\r\n -8.88309106D-02  1.00000000D+00 -1.09484315D-01  1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n -3.03959493D-02  1.00000000D+00 -3.56015950D-01  1.00000000D+00  1.00000000D+00\r\n -2.09159389D-01  1.00000000D+00  1.00000000D+00 -8.19865763D-01  1.00000000D+00\r\n -6.45634174D-01  1.00000000D+00 -6.39332294D-01  1.00000000D+00 -9.97142851D-01\r\n  1.00000000D+00 -5.00000000D-01  1.00000000D+00  1.00000000D+00 -2.51026601D-01\r\n  1.00000000D+00 -5.73770761D-01  1.00000000D+00 -9.99197245D-01  1.00000000D+00\r\n -6.12838604D-02  1.00000000D+00 -9.79579866D-01  1.00000000D+00 -9.41222906D-01\r\n  1.00000000D+00 -9.82795656D-01  1.00000000D+00 -9.99544799D-01  1.00000000D+00\r\n -9.98440027D-01  1.00000000D+00  1.00000000D+00  1.00000000D+00 -6.87208250D-02\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00 -9.37243104D-01\r\n  1.00000000D+00 -3.05369467D-01  1.00000000D+00 -2.44393930D-01  1.00000000D+00\r\n -5.99167570D-02  1.00000000D+00 -4.09031749D-01  1.00000000D+00 -6.54813766D-01\r\n  1.00000000D+00 -7.75436103D-01  1.00000000D+00 -5.67775071D-02  1.00000000D+00\r\n -3.49151224D-01  1.00000000D+00 -1.00001134D-01  1.00000000D+00 -6.01657480D-02\r\n  1.00000000D+00 -7.82141462D-02  1.00000000D+00 -8.72963190D-01  1.00000000D+00\r\n -7.58721083D-02  1.00000000D+00 -6.22733496D-02  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00 -7.42725551D-01  1.00000000D+00 -7.90000021D-01  1.00000000D+00\r\n  1.00000000D+00 -6.62945509D-01  1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00 -3.22186440D-01  1.00000000D+00 -7.28480697D-01  1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -9.55293119D-01  1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -9.96945620D-01  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00 -6.56015933D-01  1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -8.67891490D-01  1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -7.96854556D-01  1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -8.03196490D-01  1.00000000D+00  1.00000000D+00 -2.34577850D-01\r\n  1.00000000D+00 -1.01583153D-01  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00 -9.88406897D-01  1.00000000D+00 -6.10173583D-01  1.00000000D+00\r\n -9.84829903D-01  1.00000000D+00 -1.45812437D-01  1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -9.35439289D-01  1.00000000D+00\r\n -6.79107606D-01  1.00000000D+00 -2.54835814D-01  1.00000000D+00  1.00000000D+00\r\n -5.69056511D-01  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -9.26579297D-01\r\n  1.00000000D+00 -3.86048704D-02  1.00000000D+00 -4.91169512D-01  1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n  1.00000000D+00 -1.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00 -1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n  5.00000007D-02 -2.69156814D-01 -4.65328991D-03 -6.22985372D-03 -3.80239636D-02\r\n  5.00000007D-02 -4.66260761D-01 -1.84849033D-03 -2.47492688D-03 -1.51058435D-02\r\n  5.60000002D-01 -7.63145924D-01 -1.06123865D-01 -9.68712196D-03 -2.16793314D-01\r\n  2.39999995D-01 -8.15083683D-01 -1.05610844D-02 -1.41391223D-02 -8.62984210D-02\r\n  5.00000007D-02 -3.95800620D-01 -1.64448307D-03 -2.20156088D-03 -1.34372637D-02\r\n  5.00000007D-02 -5.11013329D-01 -1.36712939D-03 -1.83034141D-03 -1.11717703D-02\r\n  5.00000007D-02 -9.59510028D-01 -2.95934808D-02 -3.96195129D-02 -2.41819128D-01\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00 -2.76298150D-02  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00 -3.40405246D-03  1.00000000D+00\r\n  1.00000000D+00 -7.99549520D-02  1.00000000D+00 -3.64257284D-02  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00 -6.36040792D-02  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00 -1.25452146D-01\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00 -1.37514537D-02  1.00000000D+00\r\n -2.57521961D-03  1.00000000D+00  1.00000000D+00 -1.06875168D-03  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00 -1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00 -6.60542548D-02  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n -1.25644520D-01  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n -7.15435967D-02  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n -2.12379946D-05  1.00000000D+00 -1.38877379D-03  1.00000000D+00 -1.69529160D-03\r\n  1.00000000D+00 -1.30305747D-02  1.00000000D+00 -7.15932772D-02  1.00000000D+00\r\n  1.00000000D+00 -1.56391002D-02  1.00000000D+00 -1.96913686D-02  1.00000000D+00\r\n -4.65031248D-04  1.00000000D+00 -6.46045059D-02  1.00000000D+00 -1.41096707D-05\r\n  1.00000000D+00 -2.13194918D-02  1.00000000D+00 -4.82018702D-02  1.00000000D+00\r\n -1.17546050D-02  1.00000000D+00 -7.12832334D-05  1.00000000D+00 -2.90225632D-03\r\n  1.00000000D+00 -4.32887627D-03  1.00000000D+00 -1.61347762D-02  1.00000000D+00\r\n -3.65646253D-03  1.00000000D+00 -1.12061657D-03  1.00000000D+00 -1.28508243D-03\r\n  1.00000000D+00 -7.21944845D-04  1.00000000D+00 -3.12227919D-03  1.00000000D+00\r\n -4.79361363D-04  1.00000000D+00 -3.76875186D-03  1.00000000D+00 -9.84223001D-03\r\n  1.00000000D+00 -1.19829318D-03  1.00000000D+00 -8.72301025D-05  1.00000000D+00\r\n -2.48197932D-03  1.00000000D+00 -2.69700470D-03  1.00000000D+00 -2.04223525D-02\r\n  1.00000000D+00 -1.21343024D-01  1.00000000D+00 -1.30022084D-02  1.00000000D+00\r\n -6.75853249D-03  1.00000000D+00 -1.29593657D-02  1.00000000D+00 -4.72033173D-02\r\n  1.00000000D+00 -2.85191718D-03  1.00000000D+00 -5.33207394D-02  1.00000000D+00\r\n -2.06797067D-02  1.00000000D+00 -9.44649801D-03  1.00000000D+00  1.00000000D+00\r\n -3.70004075D-03  1.00000000D+00 -5.03387488D-02  1.00000000D+00 -2.59307083D-02\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00 -2.88725168D-01  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00 -5.48067629D-01 -7.43604545D-03 -4.82097548D-03\r\n -1.31497085D-01 -2.47637033D-01 -2.29462353D-03 -1.01192757D-01 -2.62266193D-02\r\n  1.00000000D+00 -2.13327646D-01 -3.71461594D-03 -3.46439029D-03 -1.28691241D-01\r\n -3.02950412D-01 -8.93040746D-03 -2.01682709D-02  1.00000000D+00 -8.31404980D-03\r\n -2.52504105D-04 -1.63707315D-04 -3.93955124D-04 -6.25510290D-02 -1.97172053D-02\r\n  1.00000000D+00 -1.00000000D+00 -4.02082577D-02 -9.67077792D-01 -9.97612417D-01\r\n -5.00000529D-02 -4.88695642D-03 -2.11219513D-03 -7.39417732D-01 -1.46247000D-01\r\n -1.00000000D+00 -2.85278380D-01 -2.53084838D-01 -4.69926745D-01 -1.97006494D-01\r\n -3.99474278D-02 -5.00000007D-02  6.67069061D-03 -1.31836802D-01 -9.00000036D-02\r\n  2.20149979D-02 -2.42864177D-01 -5.00000007D-02  4.05550972D-02 -1.81239873D-01\r\n -9.00000036D-02  3.02646551D-02 -9.38324183D-02 -7.00000003D-02  1.56687703D-02\r\n -1.79161012D-01 -7.00000003D-02  2.99175121D-02 -6.24370202D-02 -7.00000003D-02\r\n  1.04261544D-02 -6.86812699D-02 -7.00000003D-02  1.14688613D-02 -6.83486238D-02\r\n -1.29999995D-01  8.17558262D-03 -5.05733937D-02 -7.99999982D-02  6.04938250D-03\r\n -3.38348635D-02 -1.00000001D-01  4.04718798D-03 -4.25351672D-02 -7.99999982D-02\r\n  5.08788275D-03 -1.93547402D-02 -1.09999999D-01  2.31513497D-03 -2.32370030D-02\r\n -1.80000007D-01  2.77951523D-03 -9.78440326D-03 -1.40000001D-01  1.17037038D-03\r\n -6.17706440D-02 -1.29999995D-01  7.38875149D-03 -7.21712539D-04 -1.29999995D-01\r\n  8.63283058D-05 -1.98470941D-03 -1.29999995D-01  2.37402841D-04 -2.72782869D-03\r\n -1.29999995D-01  3.26291716D-04 -1.98165141D-03 -1.00000001D-01  2.37037035D-04\r\n -7.97706377D-03 -1.40000001D-01  9.54183808D-04 -9.46483167D-04 -1.40000001D-01\r\n  1.13214446D-04 -1.12079515D-03 -1.29999995D-01  1.34064932D-04 -5.94709478D-02\r\n -9.00000036D-02  7.11367186D-03 -2.49847099D-02 -1.09999999D-01  2.98856874D-03\r\n -7.44204894D-02 -1.09999999D-01  8.90187453D-03 -1.95565750D-03 -1.50000006D-01\r\n  2.33927756D-04 -1.74281336D-02 -1.29999995D-01  2.08468223D-03 -1.33516816D-02\r\n -1.40000001D-01  1.59707363D-03 -4.67324145D-02 -1.09999999D-01  5.58994059D-03\r\n -6.00917451D-03 -1.40000001D-01  7.18792842D-04 -1.12645263D-02 -1.00000001D-01\r\n  1.34741655D-03 -1.53486235D-02 -1.19999997D-01  1.83593959D-03 -4.24143746D-02\r\n -1.40000001D-01  5.07343374D-03 -1.16284406D-02 -7.99999982D-02  1.39094645D-03\r\n -8.41406733D-02 -1.09999999D-01  1.00645637D-02 -1.31145254D-01 -2.00000003D-01\r\n  1.56870596D-02 -8.49541277D-03 -1.19999997D-01  1.01618655D-03 -3.09327221D-03\r\n -5.99999987D-02  3.70004564D-04 -7.79969431D-03 -1.50000006D-01  9.32967523D-04\r\n -7.35229328D-02 -1.19999997D-01  8.79451260D-03 -3.98944952D-02 -1.29999995D-01\r\n  4.77201631D-03 -1.77741945D-02 -2.00000003D-01  1.00777317D-04 -9.82225835D-01\r\n -2.00000003D-01  5.56909014D-03 -7.99999982D-02 -1.59999996D-01  1.00000000D+00\r\n -3.60000014D-01 -1.09999999D-01  1.00000000D+00 -7.99999982D-02 -2.00000003D-01\r\n  1.00000000D+00 -2.39999995D-01 -1.50000006D-01  1.00000000D+00 -2.39999995D-01\r\n -1.50000006D-01  1.00000000D+00 -1.59999996D-01  1.00000000D+00 -1.19999997D-01\r\n  1.00000000D+00 -2.00000003D-01 -2.03827190D+00  2.50722790D+00  2.50722790D+00\r\n  2.50722790D+00  2.50722790D+00  2.50722790D+00  2.50722790D+00  5.74199595D-02\r\n  8.89650881D-01  8.89650881D-01 -6.84651732D-01  7.57262707D-01  7.57262707D-01\r\n  7.57262707D-01  7.57262707D-01  7.57262707D-01  7.57262707D-01  1.71273291D-01\r\n  7.57262707D-01  2.98174381D-01 -1.73215106D-01 -1.73215106D-01 -1.73215106D-01\r\n -1.73215106D-01 -1.73215106D-01 -1.73215106D-01 -1.73215106D-01  6.30014949D-03\r\n  9.76129770D-02  9.76129770D-02 -7.40123630D-01  7.12008893D-01  2.81816572D-01\r\n  7.12008893D-01  7.12008893D-01  7.12008893D-01  7.12008893D-01  1.61038041D-01\r\n  7.12008893D-01  2.80355543D-01 -2.82574105D+00  1.02045894D+00  1.02045894D+00\r\n  1.02045894D+00  1.02045894D+00  3.05909496D-02  1.02045894D+00  1.67414490D-02\r\n  9.93608907D-02  9.93608907D-02 -3.01978122D-02 -3.01978122D-02 -3.01978122D-02\r\n -3.01978122D-02 -3.01978122D-02  4.75290697D-03 -3.01978122D-02  2.60111387D-03\r\n  1.54376719D-02  1.54376719D-02 -1.69090942D-01 -1.69090942D-01 -1.69090942D-01\r\n -1.69090942D-01 -1.69090942D-01 -1.69090942D-01 -1.69090942D-01  1.60707850D-02\r\n  9.53804851D-02  9.53804851D-02 -1.24394380D-01 -1.24394380D-01 -1.24394380D-01\r\n -1.24394380D-01 -1.24394380D-01  9.98765975D-03 -1.24394380D-01  5.46592707D-03\r\n  3.24404053D-02  3.24404053D-02 -5.00000000D-01 -1.00000000D+00  1.10741682D-01\r\n  2.62503922D-01  1.54968342D-02  3.03868353D-01  5.55011146D-02  1.02592101D-02\r\n  7.57173747D-02  1.59322936D-02 -6.12610757D-01 -8.69999826D-01  8.81728047D-05\r\n -4.99836445D-01  1.04071647D-02 -6.39951527D-02 -6.39951527D-02 -6.39951527D-02\r\n -6.39951527D-02 -6.39951527D-02 -6.39951527D-02  2.38342502D-04  3.69282067D-03\r\n  3.69282067D-03  1.54453237D-02 -7.84192756D-02 -7.84192756D-02 -7.84192756D-02\r\n -7.84192756D-02 -7.84192756D-02 -7.84192756D-02  2.84985313D-03  1.26002580D-02\r\n  4.96138772D-03 -8.80930871D-02 -8.80930871D-02 -8.80930871D-02 -8.80930871D-02\r\n -8.80930871D-02 -8.80930871D-02 -8.80930871D-02  3.20410589D-03  4.96436357D-02\r\n  4.96436357D-02  6.06838651D-02 -2.36646697D-01  1.95946172D-02 -2.36646697D-01\r\n -2.36646697D-01 -2.36646697D-01 -2.36646697D-01  1.11969244D-02  4.95057516D-02\r\n  1.94930322D-02  4.95642304D-01 -4.30728585D-01 -4.30728585D-01 -4.30728585D-01\r\n -4.30728585D-01  1.48581862D-02 -4.30728585D-01  8.13141000D-03  4.82601114D-02\r\n  4.82601114D-02 -4.30944450D-02 -4.30944450D-02 -4.30944450D-02 -4.30944450D-02\r\n -4.30944450D-02  6.78273896D-03 -4.30944450D-02  3.71197611D-03  2.20306665D-02\r\n  2.20306665D-02 -3.12564522D-02 -3.12564522D-02 -3.12564522D-02 -3.12564522D-02\r\n -3.12564522D-02 -3.12564522D-02 -3.12564522D-02  2.97068362D-03  1.76310781D-02\r\n  1.76310781D-02 -6.25699833D-02 -6.25699833D-02 -6.25699833D-02 -6.25699833D-02\r\n -6.25699833D-02  5.02376119D-03 -6.25699833D-02  2.74934387D-03  1.63174197D-02\r\n  1.63174197D-02 -5.00000000D-01 -1.00000000D+00 -9.31064598D-03 -3.82446544D-03\r\n -1.13382936D-04  1.48005467D-02  1.14515871D-02 -2.79633701D-03 -7.22729228D-03\r\n -1.07579976D-02 -1.06948726D-02 -8.69891703D-01  4.07628454D-02 -4.54577208D-01\r\n  6.21434972D-02 -3.82129312D-01 -3.82129312D-01 -3.82129312D-01 -3.82129312D-01\r\n -3.82129312D-01 -3.82129312D-01  1.42319617D-03  2.20506545D-02  2.20506545D-02\r\n  6.42392877D-03 -3.26156914D-02 -3.26156914D-02 -3.26156914D-02 -3.26156914D-02\r\n -3.26156914D-02 -3.26156914D-02  1.18529436D-03  5.24062570D-03  2.06351141D-03\r\n -3.60557176D-02 -3.60557176D-02 -3.60557176D-02 -3.60557176D-02 -3.60557176D-02\r\n -3.60557176D-02 -3.60557176D-02  1.31141208D-03  2.03187000D-02  2.03187000D-02\r\n  3.20153944D-02  2.61180811D-02 -5.10462344D-01  2.61180811D-02  2.61180811D-02\r\n  2.61180811D-02  2.61180811D-02  5.90723613D-03  2.61180811D-02  1.02840699D-02\r\n  1.30923346D-01 -1.13776460D-01 -1.13776460D-01 -1.13776460D-01 -1.13776460D-01\r\n  3.92477307D-03 -1.13776460D-01  2.14790273D-03  1.27478531D-02  1.27478531D-02\r\n -2.76396852D-02 -2.76396852D-02 -2.76396852D-02 -2.76396852D-02 -2.76396852D-02\r\n  4.35027713D-03 -2.76396852D-02  2.38076760D-03  1.41299125D-02  1.41299125D-02\r\n -1.43900374D-02 -1.43900374D-02 -1.43900374D-02 -1.43900374D-02 -1.43900374D-02\r\n -1.43900374D-02 -1.43900374D-02  1.36766164D-03  8.11710395D-03  8.11710395D-03\r\n -3.48886102D-02 -3.48886102D-02 -3.48886102D-02 -3.48886102D-02 -3.48886102D-02\r\n  2.80121644D-03 -3.48886102D-02  1.53301610D-03  9.09848697D-03  9.09848697D-03\r\n -5.00000000D-01 -1.00000000D+00 -3.76588060D-03 -4.67685144D-03 -2.74560135D-03\r\n  2.82335691D-02 -5.28713875D-03 -3.31864133D-03 -9.25511029D-03 -9.26723704D-03\r\n -3.04701719D-02 -8.70137990D-01  6.51841611D-02 -4.23311949D-01  5.24101779D-04\r\n -3.22277728D-03 -3.22277728D-03 -3.22277728D-03 -3.22277728D-03 -3.22277728D-03\r\n -3.22277728D-03  1.20028599D-05  1.85969388D-04  1.85969388D-04  1.31599407D-03\r\n -6.68158941D-03 -6.68158941D-03 -6.68158941D-03 -6.68158941D-03 -6.68158941D-03\r\n -6.68158941D-03  2.42817172D-04  1.07358478D-03  4.22727084D-04 -8.56701881D-02\r\n -8.56701881D-02 -8.56701881D-02 -8.56701881D-02 -8.56701881D-02 -8.56701881D-02\r\n -8.56701881D-02  3.11598089D-03  4.82782498D-02  4.82782498D-02  2.49884813D-03\r\n -9.74466838D-03  8.06869706D-04 -9.74466838D-03 -9.74466838D-03 -9.74466838D-03\r\n -9.74466838D-03  4.61068412D-04  2.03855429D-03  8.02686671D-04  2.45963693D-01\r\n -2.13750109D-01 -2.13750109D-01 -2.13750109D-01 -2.13750109D-01  7.37341121D-03\r\n -2.13750109D-01  4.03523212D-03  2.39491984D-02  2.39491984D-02 -4.01567370D-02\r\n -4.01567370D-02 -4.01567370D-02 -4.01567370D-02 -4.01567370D-02  6.32036664D-03\r\n -4.01567370D-02  3.45893437D-03  2.05288567D-02  2.05288567D-02 -7.93116167D-03\r\n -7.93116167D-03 -7.93116167D-03 -7.93116167D-03 -7.93116167D-03 -7.93116167D-03\r\n -7.93116167D-03  7.53795495D-04  4.47379425D-03  4.47379425D-03 -2.18512505D-01\r\n -2.18512505D-01 -2.18512505D-01 -2.18512505D-01 -2.18512505D-01  1.75444297D-02\r\n -2.18512505D-01  9.60150547D-03  5.69851622D-02  5.69851622D-02  4.71892297D-01\r\n -2.81077065D-02 -5.62154129D-02 -8.82008986D-04 -3.62094084D-04  7.52938213D-03\r\n -6.91006426D-05  1.29995495D-02  1.31666847D-02  1.85310841D-03  2.87142098D-02\r\n -2.20831167D-02 -5.38090281D-02 -8.70029628D-01  1.52490258D-01 -9.62755829D-02\r\n -1.12710521D-04  4.49230138D-04 -2.76238052D-03 -2.76238052D-03 -2.76238052D-03\r\n -2.76238052D-03 -2.76238052D-03 -2.76238052D-03  1.02881659D-05  1.59402334D-04\r\n  1.59402334D-04  1.94844441D-03 -9.89267789D-03 -9.89267789D-03 -9.89267789D-03\r\n -9.89267789D-03 -9.89267789D-03 -9.89267789D-03  3.59512109D-04  1.58953632D-03\r\n  6.25884510D-04 -2.67490625D-01 -2.67490625D-01 -2.67490625D-01 -2.67490625D-01\r\n -2.67490625D-01 -2.67490625D-01 -2.67490625D-01  9.72912088D-03  1.50740623D-01\r\n  1.50740623D-01  2.71101436D-03 -1.05720451D-02  8.75377445D-04 -1.05720451D-02\r\n -1.05720451D-02 -1.05720451D-02 -1.05720451D-02  5.00215683D-04  2.21163896D-03\r\n  8.70839227D-04  6.27855837D-01 -5.45626283D-01 -5.45626283D-01 -5.45626283D-01\r\n -5.45626283D-01  1.88216381D-02 -5.45626283D-01  1.03004798D-02  6.11335933D-02\r\n  6.11335933D-02 -1.88998535D-01 -1.88998535D-01 -1.88998535D-01 -1.88998535D-01\r\n -1.88998535D-01  2.97469385D-02 -1.88998535D-01  1.62795484D-02  9.66195017D-02\r\n  9.66195017D-02 -3.90729122D-02 -3.90729122D-02 -3.90729122D-02 -3.90729122D-02\r\n -3.90729122D-02 -3.90729122D-02 -3.90729122D-02  3.71357752D-03  2.20401697D-02\r\n  2.20401697D-02 -3.93182158D-01 -3.93182158D-01 -3.93182158D-01 -3.93182158D-01\r\n -3.93182158D-01  3.15687060D-02 -3.93182158D-01  1.72765423D-02  1.02536693D-01\r\n  1.02536693D-01  1.67131245D+00 -3.28687608D-01 -1.64343804D-01  2.97306397D-05\r\n  8.07423727D-04  2.75007710D-02  1.33185962D-03  3.93917151D-02  7.23160058D-02\r\n  2.04517543D-02  5.90625890D-02 -1.28545640D-02 -4.63634431D-02 -8.70002031D-01\r\n  4.37857695D-02 -1.76200569D-02 -4.21766937D-03  4.55968589D-01 -2.80381632D+00\r\n -2.80381632D+00 -2.80381632D+00 -2.80381632D+00 -2.80381632D+00 -2.80381632D+00\r\n  1.04424879D-02  1.61793381D-01  1.61793381D-01  1.57031372D-01 -7.97282577D-01\r\n -7.97282577D-01 -7.97282577D-01 -7.97282577D-01 -7.97282577D-01 -7.97282577D-01\r\n  2.89742295D-02  1.28105819D-01  5.04420325D-02 -9.07425106D-01 -9.07425106D-01\r\n -9.07425106D-01 -9.07425106D-01 -9.07425106D-01 -9.07425106D-01 -9.07425106D-01\r\n  3.30047049D-02  5.11366904D-01  5.11366904D-01  1.58726871D-01 -6.18981421D-01\r\n  5.12523726D-02 -6.18981421D-01 -6.18981421D-01 -6.18981421D-01 -6.18981421D-01\r\n  2.92870700D-02  1.29488990D-01  5.09866662D-02  7.75558501D-02  7.75558501D-02\r\n  7.75558501D-02  7.75558501D-02  7.75558501D-02 -1.12975061D-01  7.75558501D-02\r\n  1.27236603D-03  7.55152293D-03  7.55152293D-03  8.05267543D-02  8.05267543D-02\r\n  8.05267543D-02  8.05267543D-02  8.05267543D-02 -1.12885997D-01  8.05267543D-02\r\n  1.32110610D-03  7.84079637D-03  7.84079637D-03 -9.94591713D-02 -9.94591713D-02\r\n -9.94591713D-02 -9.94591713D-02 -9.94591713D-02 -9.94591713D-02 -9.94591713D-02\r\n  9.45282448D-03  5.61027341D-02  5.61027341D-02  1.14812307D-01  1.14812307D-01\r\n  1.14812307D-01  1.14812307D-01  1.14812307D-01 -1.11858197D-01  1.14812307D-01\r\n  1.88358827D-03  1.11791408D-02  1.11791408D-02 -2.00000000D+00 -1.00000000D+00\r\n -1.11589003D-02 -6.79647923D-03  1.94025785D-03 -4.64311987D-03  1.36367977D-03\r\n  4.70969081D-03 -1.26966089D-03  7.61918724D-03 -1.00000000D+00  1.06317788D-01\r\n -6.53763413D-01 -6.53763413D-01 -6.53763413D-01 -6.53763413D-01 -6.53763413D-01\r\n -6.53763413D-01  2.43486557D-03  3.77252176D-02  3.77252176D-02  4.11161855D-02\r\n -2.08755851D-01 -2.08755851D-01 -2.08755851D-01 -2.08755851D-01 -2.08755851D-01\r\n -2.08755851D-01  7.58644473D-03  3.35424840D-02  1.32074496D-02 -1.98312685D-01\r\n -1.98312685D-01 -1.98312685D-01 -1.98312685D-01 -1.98312685D-01 -1.98312685D-01\r\n -1.98312685D-01  7.21299369D-03  1.11756369D-01  1.11756369D-01  5.44188842D-02\r\n -2.12215364D-01  1.75716747D-02 -2.12215364D-01 -2.12215364D-01 -2.12215364D-01\r\n -2.12215364D-01  1.00409575D-02  4.43947949D-02  1.74805783D-02  5.57472408D-01\r\n -4.84460890D-01 -4.84460890D-01 -4.84460890D-01 -4.84460890D-01  1.67117082D-02\r\n -4.84460890D-01  9.14578326D-03  5.42804413D-02  5.42804413D-02 -2.85272539D-01\r\n -2.85272539D-01 -2.85272539D-01 -2.85272539D-01 -2.85272539D-01  4.48997393D-02\r\n -2.85272539D-01  2.45721899D-02  1.45836532D-01  1.45836532D-01 -2.04982370D-01\r\n -2.04982370D-01 -2.04982370D-01 -2.04982370D-01 -2.04982370D-01 -2.04982370D-01\r\n -2.04982370D-01  1.94819868D-02  1.15626052D-01  1.15626052D-01 -2.12087378D-01\r\n -2.12087378D-01 -2.12087378D-01 -2.12087378D-01 -2.12087378D-01  1.70285534D-02\r\n -2.12087378D-01  9.31918249D-03  5.53095713D-02  5.53095713D-02  1.46780527D+00\r\n -5.32194793D-01 -2.66097397D-01  6.53083064D-03  1.70512833D-02  2.03899294D-02\r\n  2.67378725D-02  3.49783003D-02  1.09160982D-01  1.07301265D-01  3.18611152D-02\r\n -5.97859584D-02 -3.35545868D-01 -2.65876949D-01 -1.57820597D-01 -8.70056510D-01\r\n  4.26713973D-02 -7.06640184D-02 -3.78513522D-03  1.96210727D-01  1.96210727D-01\r\n  1.96210727D-01  1.96210727D-01  1.96210727D-01  1.96210727D-01  1.96210727D-01\r\n -9.96064246D-02  6.96223304D-02  6.96223304D-02  1.89191252D-01  1.54341772D-01\r\n  1.54341772D-01  1.54341772D-01  1.54341772D-01  1.54341772D-01  1.54341772D-01\r\n -2.62691885D-01  1.54341772D-01  6.07725158D-02  1.69322357D-01  1.69322357D-01\r\n  1.69322357D-01  1.69322357D-01  1.69322357D-01  1.69322357D-01  1.69322357D-01\r\n -1.00222215D-01  6.00814112D-02  6.00814112D-02  7.46707991D-02  6.09162562D-02\r\n  2.41109487D-02  6.09162562D-02  6.09162562D-02  6.09162562D-02  6.09162562D-02\r\n -2.83822298D-01  6.09162562D-02  2.39859503D-02  4.64772396D-02  4.64772396D-02\r\n  4.64772396D-02  4.64772396D-02  4.64772396D-02  1.39327801D-03  4.64772396D-02\r\n -6.23375066D-02  4.52543469D-03  4.52543469D-03  3.17638852D-02  3.17638852D-02\r\n  3.17638852D-02  3.17638852D-02  3.17638852D-02  9.52206377D-04  3.17638852D-02\r\n -6.25788867D-02  3.09281261D-03  3.09281261D-03  2.72320695D-02  2.72320695D-02\r\n  2.72320695D-02  2.72320695D-02  2.72320695D-02  2.72320695D-02  2.72320695D-02\r\n -6.26532361D-02  2.65155477D-03  2.65155477D-03  1.45535357D-02  1.45535357D-02\r\n  1.45535357D-02  1.45535357D-02  1.45535357D-02  4.36280679D-04  1.45535357D-02\r\n -6.28612414D-02  1.41706085D-03  1.41706085D-03 -5.00000000D-01 -1.00000000D+00\r\n  5.67007899D-01  3.68021756D-01  5.04498124D-01  1.71694726D-01  1.87478885D-01\r\n  1.48706645D-01  1.58462361D-01  5.24044745D-02 -1.57417119D-01 -2.47411415D-01\r\n -1.41924486D-01 -8.90000045D-01  2.39348169D-02 -3.44784945D-01  2.74278283D-01\r\n  2.74278283D-01  2.74278283D-01  2.74278283D-01  2.74278283D-01  2.74278283D-01\r\n  2.74278283D-01  6.28145831D-03 -2.69419193D-01 -2.69419193D-01  1.52858287D-01\r\n  1.24701418D-01  1.24701418D-01  1.24701418D-01  1.24701418D-01  1.24701418D-01\r\n  1.24701418D-01  2.82042436D-02 -1.19109857D+00  4.91015427D-02  4.98320878D-01\r\n  4.98320878D-01  4.98320878D-01  4.98320878D-01  4.98320878D-01  4.98320878D-01\r\n  4.98320878D-01  1.14124306D-02 -3.29651117D-01 -3.29651117D-01  2.46326566D-01\r\n  2.00952619D-01  7.95380175D-02  2.00952619D-01  2.00952619D-01  2.00952619D-01\r\n  2.00952619D-01  4.54503000D-02 -1.11484730D+00  7.91256726D-02  3.50749463D-01\r\n  3.50749463D-01  3.50749463D-01  3.50749463D-01  3.50749463D-01  1.05146412D-02\r\n  3.50749463D-01  5.75432694D-03 -3.40347946D-01  3.41520645D-02  2.85520315D-01\r\n  2.85520315D-01  2.85520315D-01  2.85520315D-01  2.85520315D-01  8.55922513D-03\r\n  2.85520315D-01  4.68419027D-03 -3.46699238D-01  2.78007798D-02  2.37027302D-01\r\n  2.37027302D-01  2.37027302D-01  2.37027302D-01  2.37027302D-01  2.37027302D-01\r\n  2.37027302D-01  3.88862356D-03 -3.51420939D-01  2.30790731D-02  3.56762469D-01\r\n  3.56762469D-01  3.56762469D-01  3.56762469D-01  3.56762469D-01  1.06948968D-02\r\n  3.56762469D-01  5.85297495D-03 -3.39762479D-01  3.47375460D-02  7.39657879D-03\r\n -1.99260342D+00 -9.96301711D-01  5.11565208D-02  6.72518909D-02  9.58291367D-02\r\n  1.28103361D-01  2.38389209D-01  2.25222245D-01  2.32392117D-01  2.16449484D-01\r\n -1.55363604D-02 -2.75162965D-01 -6.60882518D-02 -1.02282472D-01 -1.53743282D-01\r\n -8.90000701D-01 -4.75550555D-02  9.31972265D-01  9.31972265D-01  9.31972265D-01\r\n  9.31972265D-01  9.31972265D-01  9.31972265D-01  9.31972265D-01  2.13438161D-02\r\n -9.15461600D-01 -9.15461600D-01  1.19320869D-01  9.73416790D-02  9.73416790D-02\r\n  9.73416790D-02  9.73416790D-02  9.73416790D-02  9.73416790D-02  2.20161770D-02\r\n  9.73416790D-02 -4.79771465D-01  1.08861959D+00  1.08861959D+00  1.08861959D+00\r\n  1.08861959D+00  1.08861959D+00  1.08861959D+00  1.08861959D+00  2.49313172D-02\r\n -7.20147789D-01 -7.20147789D-01  1.08071260D-01  8.81642774D-02  3.48958485D-02\r\n  8.81642774D-02  8.81642774D-02  8.81642774D-02  8.81642774D-02  1.99404843D-02\r\n  8.81642774D-02 -4.83385086D-01  2.93100953D-01  2.93100953D-01  2.93100953D-01\r\n  2.93100953D-01  2.93100953D-01  8.78647529D-03  2.93100953D-01  4.80855675D-03\r\n  2.85388995D-02 -3.45961124D-01  2.17549220D-01  2.17549220D-01  2.17549220D-01\r\n  2.17549220D-01  2.17549220D-01  6.52161241D-03  2.17549220D-01  3.56906978D-03\r\n  2.11825129D-02 -3.53317499D-01  3.01923811D-01  3.01923811D-01  3.01923811D-01\r\n  3.01923811D-01  3.01923811D-01  3.01923811D-01  3.01923811D-01  4.95330291D-03\r\n  2.93979701D-02 -3.45102042D-01  5.59506476D-01  5.59506476D-01  5.59506476D-01\r\n  5.59506476D-01  5.59506476D-01  1.67726837D-02  5.59506476D-01  9.17915348D-03\r\n  5.44784926D-02 -3.20021540D-01  6.95431352D-01 -1.30456865D+00 -6.52284324D-01\r\n  1.73825145D-01  1.33323938D-01  2.09345996D-01  1.42736718D-01  1.99208006D-01\r\n  1.71605751D-01  2.96019554D-01  3.39455217D-01 -2.33187303D-01 -1.43305426D-02\r\n -3.65852825D-02 -3.50010514D-01 -3.68325382D-01 -8.90000045D-01 -4.76517156D-02\r\n  4.57370246D-04 -2.09954262D+00 -9.99782205D-01 -1.07030303D-03 -1.93744991D-03\r\n -1.54613005D-03 -2.59090355D-03 -3.22100311D-03 -3.45216854D-03 -4.05561412D-03\r\n -3.55400215D-03  1.00000000D+00 -9.07458216D-02 -1.16984315D-01 -1.33410409D-01\r\n -8.70000362D-01 -2.90658250D-02  9.00660157D-01 -1.19933975D+00 -5.71114182D-01\r\n  1.00000000D+00 -8.70074153D-01 -2.14263145D-02  2.60216546D+00 -2.97834694D-01\r\n -1.02701619D-01  1.00000000D+00 -1.92899816D-02 -8.69974673D-01  3.76543887D-02\r\n -8.59325007D-03 -2.32234877D-03 -2.00000000D+00 -1.00000000D+00 -5.97090367D-03\r\n -3.10818246D-03 -3.80347972D-03 -1.39464473D-03 -1.42943056D-03 -1.11747673D-03\r\n -1.24684128D-03 -3.89749010D-04 -1.62022635D-01  1.00000000D+00 -3.91151533D-02\r\n -1.34885684D-01 -1.17574222D-01 -2.08823266D-03 -1.33590531D-02 -3.53096239D-02\r\n -8.69999945D-01  4.84563895D-02 -4.03310657D-01 -1.39999998D+00 -1.00000000D+00\r\n  1.00000000D+00 -2.96438169D-02 -8.69649827D-01  1.07462266D-02 -1.38558960D+00\r\n -9.52560804D-04  1.24517657D-01 -1.07548237D+00 -8.96235287D-01 -9.75699630D-03\r\n  1.00000000D+00 -8.69999290D-01 -7.12292502D-03  7.48468280D-01 -1.25153172D+00\r\n -6.25765860D-01  1.00000000D+00 -8.69565189D-01 -5.48300613D-03  1.67540276D+00\r\n -3.24597210D-01 -1.62298605D-01 -5.64882183D-04 -5.86885144D-04 -3.88702523D-04\r\n -6.18933933D-04 -6.81592501D-04 -7.42134813D-04 -4.25319507D-04 -7.78341491D-04\r\n  1.00000000D+00 -3.24237466D-01 -8.06020573D-03 -6.01767702D-03 -4.23720069D-02\r\n -1.60365067D-02 -8.70012224D-01  4.07752655D-02 -1.11877225D-01 -1.04968902D-03\r\n  6.68755710D-01 -5.31244338D-01 -4.42703605D-01  1.00000000D+00 -8.70578110D-01\r\n -1.33256649D-03  6.27053499D-01 -1.37294650D+00 -6.86473250D-01  1.00000000D+00\r\n -8.69837284D-01 -9.19193670D-04  1.86955050D-01 -1.01304495D+00 -8.44204128D-01\r\n  1.00000000D+00 -8.69710445D-01 -2.45653326D-03  7.21822023D-01 -1.27817798D+00\r\n -6.39088988D-01  1.00000000D+00 -8.88888896D-01 -4.83603566D-04  1.05930507D-01\r\n -3.94069493D-01 -7.88138986D-01  1.00000000D+00 -8.70722413D-01 -4.03519627D-03\r\n -5.00000000D-01 -1.00000000D+00  1.00000000D+00 -1.44721544D-03 -1.00000000D+00\r\n  2.69034058D-01 -2.30965927D-01  1.20000005D+00  1.00000000D+00 -6.98827021D-03\r\n -4.22448991D-03 -8.70033681D-01  1.82339847D-02 -6.98937196D-03  1.51235133D-01\r\n -3.48764867D-01 -6.97529733D-01  1.00000000D+00 -2.95740426D-01 -1.60700306D-01\r\n -1.32129028D-01 -5.11926599D-03 -8.70001733D-01  7.98794478D-02 -2.72300512D-01\r\n -9.32077994D-04 -5.00000000D-01 -1.00000000D+00  1.00000000D+00 -1.44242674D-01\r\n -8.69969308D-01  4.20977129D-03 -1.25440717D-01 -5.00000000D-01 -1.00000000D+00\r\n  1.00000000D+00 -3.19625288D-02 -8.68035197D-01 -1.29999995D+00 -1.00000000D+00\r\n  1.00000000D+00 -5.91685250D-02 -1.59905537D-03 -8.69984448D-01  1.75757363D-01\r\n -1.11488414D+00  2.00484842D-01 -1.69951510D+00 -8.94481659D-01  1.00000000D+00\r\n -8.69993567D-01 -1.05654960D-02  1.61500096D+00 -3.84999037D-01 -1.92499518D-01\r\n -1.03561732D-03 -8.33546976D-04 -7.43498676D-04 -8.00973328D-04 -7.52254389D-04\r\n -7.40913558D-04 -7.75766151D-04 -7.33237015D-04 -4.31161869D-04 -4.00092453D-03\r\n -9.04091913D-03 -4.43976279D-03 -4.15170519D-03 -4.05931100D-03 -3.40312958D-01\r\n  9.96429563D-01 -3.20973806D-03 -3.86491860D-03 -3.95374373D-03 -5.08075068D-03\r\n -1.20204582D-03 -8.69974256D-01  2.71766007D-01 -1.29452288D-01 -1.27621123D-03\r\n  2.23066592D+00 -1.16933417D+00 -3.43921810D-01 -1.85023677D-02 -1.48349488D-02\r\n -1.32394843D-02 -1.42659442D-02 -1.33985188D-02 -1.31980311D-02 -1.38182044D-02\r\n -1.30513879D-02 -3.55932601D-02 -5.53016691D-03 -1.12575263D-01 -4.02331427D-02\r\n -1.26768902D-01 -3.23383622D-02 -1.40888244D-02 -1.03382498D-01 -6.01734221D-02\r\n -1.15011364D-01 -6.96121082D-02 -5.99461142D-04  8.06271911D-01 -1.01612881D-01\r\n -4.95907036D-04 -2.17979099D-03 -3.63733061D-02 -2.40057558D-02 -1.58976257D-01\r\n -5.14993165D-03 -6.66899681D-02 -7.21485987D-02 -8.13447908D-02 -7.39258807D-03\r\n -2.08374932D-02 -8.69999588D-01  2.35442594D-02 -4.97347564D-02 -2.55885925D-02\r\n  2.04773259D+00 -3.52267474D-01 -1.46778107D-01 -1.61040970D-03 -1.65919599D-03\r\n -1.09910860D-03 -1.74943579D-03 -1.92774378D-03 -2.09857640D-03 -1.20108563D-03\r\n -2.20202422D-03 -6.64001377D-03 -1.42286755D-02  9.77918148D-01 -4.70131030D-03\r\n -6.87512336D-04 -3.48676136D-03 -8.70021164D-01  6.68438077D-01 -2.79838085D-01\r\n -1.36331830D-04  2.33849168D-01 -2.66150832D-01 -5.32301664D-01  1.00000000D+00\r\n -8.70003164D-01 -3.26989894D-03  2.91807085D-01 -8.08192909D-01 -7.34720826D-01\r\n -3.13579403D-02  9.14857388D-01 -1.21057041D-01 -3.46712917D-02 -8.69999170D-01\r\n -1.72352381D-02  1.14481020D+00 -8.55189800D-01 -4.27594900D-01 -4.18436378D-02\r\n -9.39895660D-02 -6.50645867D-02 -4.93461937D-02 -4.62170057D-02  1.00000000D+00\r\n -4.83944751D-02 -8.69988739D-01  5.37051633D-02 -4.83965762D-02 -1.48378145D-02\r\n  1.42642903D+00 -5.73570967D-01 -2.86785483D-01 -2.57495135D-01 -6.34217123D-03\r\n  1.00000000D+00 -1.03614554D-02 -8.70010138D-01 -3.37993901D-04  4.85329628D-01\r\n -1.51467037D+00 -7.57335186D-01 -1.51637703D-01 -1.72124177D-01 -3.18911761D-01\r\n -4.52379622D-02 -4.50736023D-02 -3.83139811D-02 -2.15203106D-01  7.94479668D-01\r\n -1.68030038D-02 -5.20322053D-03 -8.45131576D-02 -8.70004654D-01  2.90093929D-01\r\n -6.60795033D-01 -1.66454222D-02 -5.00000000D-01 -1.00000000D+00 -3.66790360D-03\r\n -1.06854446D-03 -8.41675978D-03 -8.81052285D-04 -1.08826561D-02 -3.09364079D-03\r\n -5.81978704D-04 -1.25210162D-03 -6.27377944D-04 -1.90549623D-03 -4.55192028D-04\r\n -4.03084466D-03 -5.01968898D-03 -3.67323461D-04 -6.59003854D-03 -3.65600252D-04\r\n -9.89085878D-04 -4.27527772D-03 -8.09862686D-05 -4.04128386D-03 -1.08135282D-03\r\n -3.92236834D-04 -1.48049882D-03 -4.32409951D-03 -6.57516345D-03  9.99062061D-01\r\n -3.75950173D-03 -4.98532085D-03 -1.80093071D-03 -2.25895038D-03 -5.07186539D-03\r\n -1.40905408D-02 -5.41200675D-02 -8.70759308D-01  2.29801148D-01 -2.15929925D-01\r\n -7.27965671D-04  1.27107942D+00 -1.28920481D-01 -9.20860618D-02 -2.01665331D-03\r\n -8.92450362D-02 -4.87057231D-02 -8.49580914D-02  7.97954261D-01 -1.26410509D-02\r\n -7.52177229D-03 -1.20873482D-03 -8.69994819D-01  1.69435248D-01 -1.62539542D-01\r\n -2.41443879D-04 -2.00000000D+00 -1.00000000D+00 -1.72134973D-02  7.40929484D-01\r\n -1.00000000D+00 -3.88732915D-05  3.33289057D-01 -9.66710925D-01 -7.43623793D-01\r\n -4.55313362D-02  9.59176183D-01 -1.86752286D-02 -8.70153308D-01  1.95702668D-02\r\n -6.02502711D-02 -4.37467685D-03  8.34249258D-02 -4.16575074D-01 -8.33150148D-01\r\n -1.81939617D-01 -3.38542223D-01 -3.96428585D-01 -1.88573435D-01 -1.47568300D-01\r\n -1.13464832D-01 -1.24057271D-02 -6.68724552D-02 -1.99355744D-02 -7.83251971D-03\r\n  5.87145507D-01 -2.02887654D-02 -1.17915452D-01 -7.41321817D-02 -2.36270837D-02\r\n -8.69995236D-01  7.48817250D-02 -1.90253779D-01 -3.81938345D-03  1.04966235D+00\r\n -1.50337696D-01 -1.25281408D-01 -7.97772198D-04 -8.20181100D-04 -5.43315487D-04\r\n -8.64872884D-04 -9.53199051D-04 -1.03727891D-03 -5.93783450D-04 -1.08829024D-03\r\n -2.66206125D-03 -2.22796991D-01 -1.24763541D-01 -8.23399574D-02 -2.43991031D-03\r\n -1.05415531D-01 -5.18004317D-03 -2.26804917D-03 -4.08953428D-03 -2.41064783D-02\r\n -2.66595520D-02 -3.64078544D-02 -1.37097631D-02 -1.21616852D-03 -1.53590724D-01\r\n -1.81663513D-01 -1.38760403D-01 -8.87066359D-04  1.00000000D+00 -3.37022962D-03\r\n -1.35791150D-03 -1.68195146D-03 -8.69997799D-01  3.93045694D-02 -4.44007665D-02\r\n -7.38454866D-04 -2.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.61861870D-02\r\n -8.67007475D-04 -1.00000000D+00 -5.00000000D-01 -1.00000000D+00 -5.30493185D-02\r\n -1.38881821D-02 -2.16033772D-01 -2.95067728D-01 -7.87093677D-03  1.00000000D+00\r\n -8.70000243D-01 -2.00000000D+00 -1.00000000D+00 -8.52278376D-04 -8.45697825D-04\r\n -5.70983102D-04 -8.96822661D-04 -9.94418398D-04 -1.07432459D-03 -6.58257341D-04\r\n -1.12529914D-03 -3.47715081D-03 -1.77065760D-03 -2.27015419D-03 -3.08119413D-03\r\n -3.78716434D-03 -3.86095257D-03 -2.71422835D-03 -2.12809048D-03 -2.44879792D-03\r\n -2.64982809D-03 -2.20288569D-03 -1.82076811D-03 -4.05994570D-03 -2.67857150D-03\r\n -3.63652292D-03 -2.55754474D-03 -2.32522679D-03 -8.87275673D-04 -2.17509014D-03\r\n -2.53010611D-03 -2.58888165D-03 -2.19188794D-03 -3.27900588D-03 -2.66205659D-03\r\n -2.19861837D-03 -1.94378418D-03 -2.34935014D-03 -3.08026723D-03 -3.49826226D-03\r\n -3.59485205D-03 -9.41671722D-04 -4.55429452D-03 -3.34591372D-03 -2.36574560D-03\r\n -3.96497606D-04 -2.96347367D-04  9.97949481D-01 -1.71580527D-03 -3.45474901D-03\r\n -1.88774109D-04 -1.46566963D-04 -4.98844869D-03 -2.03209203D-02 -1.41712539D-02\r\n -2.03225799D-02 -3.15105310D-03 -1.99997593D-02 -2.00722013D-02 -2.00752821D-02\r\n -1.99858136D-02 -1.99983530D-02 -1.99913085D-02 -7.99998567D-02 -8.00038800D-02\r\n -7.99991563D-02 -2.00005732D-02 -1.98985543D-02 -2.00221576D-02 -1.99998934D-02\r\n -1.94552504D-02 -2.00004857D-02 -2.17391308D-02 -1.99947488D-02 -1.98446941D-02\r\n -2.00250316D-02 -2.00445447D-02 -1.90114081D-02 -1.99775547D-02 -1.99930165D-02\r\n -2.00082418D-02 -2.05278583D-02 -1.99066866D-02 -2.00088024D-02 -2.00148020D-02\r\n -2.00016722D-02 -1.99828986D-02 -1.99990626D-02 -2.00033169D-02 -1.99887399D-02\r\n -1.99961830D-02 -1.99976135D-02 -1.93861071D-02 -1.99948251D-02 -1.98376905D-02\r\n -2.00031791D-02 -1.99988130D-02 -1.99998822D-02 -1.00000000D+00 -5.10172583D-02\r\n -2.00000000D+00 -1.00000000D+00 -8.46332218D-03 -8.40655249D-03 -5.67755196D-03\r\n -8.92104488D-03 -9.88750812D-03 -1.06834034D-02 -6.54513668D-03 -1.11905383D-02\r\n -3.45831774D-02 -1.76194515D-02 -2.25829966D-02 -3.06469649D-02 -3.76394801D-02\r\n -3.84055004D-02 -2.69967895D-02 -2.11716071D-02 -2.43058372D-02 -2.64700912D-02\r\n -2.19627712D-02 -1.78093892D-02 -4.03337888D-02 -2.60714293D-02 -3.58832814D-02\r\n -2.54394505D-02 -2.31361799D-02 -8.78402870D-03 -2.16305777D-02 -2.51667406D-02\r\n -2.57373042D-02 -2.18023974D-02 -3.26811634D-02 -2.64655948D-02 -2.18711272D-02\r\n -1.93342511D-02 -2.33593863D-02 -3.06346249D-02 -3.48275639D-02 -3.57152671D-02\r\n -9.47211031D-03 -4.53286879D-02 -3.32781151D-02 -2.35274453D-02 -3.91541375D-03\r\n -2.94704316D-03 -2.03939229D-02  9.82934237D-01 -3.43588740D-02 -1.87747960D-03\r\n -1.45681656D-03 -2.41378937D-02 -5.41237667D-02 -5.42966351D-02 -5.41290306D-02\r\n -5.59503818D-03 -1.10000402D-01 -1.10036097D-01 -1.09786704D-01 -1.09984562D-01\r\n -1.09999612D-01 -1.09952196D-01 -3.00000962D-02 -2.99953986D-02 -3.00008152D-02\r\n -1.09999068D-01 -1.10027306D-01 -1.10003166D-01 -1.10000178D-01 -1.10894933D-01\r\n -1.10000238D-01 -1.08695649D-01 -1.09992996D-01 -1.09577231D-01 -1.10137671D-01\r\n -1.10244997D-01 -1.11111112D-01 -1.10266164D-01 -1.09988779D-01 -1.10005237D-01\r\n -1.10022433D-01 -1.11436948D-01 -1.10108867D-01 -1.09997630D-01 -1.10010929D-01\r\n -1.09998740D-01 -1.09995946D-01 -1.09997772D-01 -1.09997511D-01 -1.10022523D-01\r\n -1.09993681D-01 -1.09997720D-01 -1.09854601D-01 -1.10010341D-01 -1.10009015D-01\r\n -1.10001586D-01 -1.10003375D-01 -1.09999895D-01 -1.00000000D+00 -2.22929522D-01\r\n -2.00000000D+00 -1.00000000D+00  1.00000000D+00 -4.99400884D-01 -6.82299674D-01\r\n -4.40645143D-02 -6.62580967D-01 -1.00000000D+00 -2.00000000D+00 -1.00000000D+00\r\n -2.69557815D-03 -2.16041761D-03 -1.92859373D-03 -2.07822118D-03 -1.95203384D-03\r\n -1.92230428D-03 -2.01220834D-03 -1.90132763D-03 -2.23271595D-03 -1.71556475D-03\r\n -2.35313643D-03 -2.36013927D-03 -4.83189942D-03 -3.31762480D-03 -2.35300022D-03\r\n -3.10212583D-03 -3.15712788D-03 -3.01629351D-03 -2.83070817D-03 -2.67425319D-03\r\n -3.69209819D-03 -3.39285703D-03 -3.32982815D-03 -7.91742802D-02 -2.81903427D-03\r\n -2.80701765D-03 -3.22098448D-03 -2.75478722D-03 -2.66793137D-03 -2.39829789D-03\r\n -2.96441489D-03 -2.02150992D-03 -1.89424248D-03 -1.69487623D-03 -2.36322428D-03\r\n -2.80019036D-03 -4.46264818D-03 -4.54844814D-03 -1.82795106D-03 -4.43343259D-03\r\n -3.45091801D-03 -1.98499765D-03 -3.60151986D-03 -2.71283323D-03 -3.25249461D-03\r\n -1.39743254D-01 -4.56520617D-02  1.00000000D+00 -2.68247048D-03 -1.00000000D+00\r\n -9.42663550D-02 -2.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n -1.39938340D-01 -2.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n -2.00000000D+00 -1.00000000D+00  1.00000000D+00 -1.00000000D+00 -2.00000000D+00\r\n -1.00000000D+00 -2.60716975D-01  1.00000000D+00 -1.00000000D+00  5.00000000D-01\r\n -2.00441820D-04  1.00000000D+00 -8.81728047D-05  4.99836445D-01  5.00000000D-01\r\n -1.08516833D-03 -9.30146081D-04 -1.00851082D-03 -1.46263081D-03 -2.09262152D-03\r\n -2.13684351D-03 -2.50200182D-03 -2.27604178D-03  1.00000000D+00 -4.07628454D-02\r\n  4.54577208D-01  5.00000000D-01 -1.40725030D-03 -1.20961515D-03 -1.31149800D-03\r\n -1.90175441D-03 -2.72121769D-03 -2.77883280D-03 -3.25281033D-03 -2.96070473D-03\r\n  1.00000000D+00 -6.51841611D-02  4.23311949D-01 -4.71892297D-01  2.81077027D-02\r\n -9.43784595D-01 -5.77269914D-03 -4.95510874D-03 -5.37293730D-03 -7.79202906D-03\r\n -1.11498525D-02 -1.13844210D-02 -1.33284107D-02 -1.21284807D-02 -3.59768905D-02\r\n  1.00000000D+00 -1.52490258D-01  9.62755829D-02 -1.89226482D-03 -1.67131233D+00\r\n  3.28687668D-01 -8.35656166D-01 -1.97824225D-01 -1.95589870D-01  1.00000000D+00\r\n -4.37857695D-02  1.76200569D-02 -2.14460250D-02  2.00000000D+00  1.00000000D+00\r\n -1.46780527D+00  5.32194734D-01 -7.33902633D-01 -8.90327096D-02  1.00000000D+00\r\n -4.26713973D-02  7.06640184D-02 -1.04394881D-02  5.00000000D-01 -1.53060555D-01\r\n -1.32922277D-01 -1.45159997D-02  1.00000000D+00 -2.39348169D-02  3.44784945D-01\r\n -7.39663653D-03  1.99260342D+00 -3.69831827D-03  1.00000000D+00 -1.76526592D-04\r\n -6.95431292D-01  1.30456877D+00 -3.47715646D-01  1.00000000D+00 -2.54018791D-02\r\n -4.57389804D-04  2.09954262D+00 -2.17804685D-04  1.00000000D+00 -6.33205173D-06\r\n -9.00660157D-01  1.19933975D+00 -4.28885818D-01  1.00000000D+00 -1.60903763D-02\r\n -2.60216546D+00  2.97834665D-01 -8.97298396D-01 -5.93723962D-04  1.00000000D+00\r\n -3.76543887D-02  8.59325007D-03 -2.02902332D-02  2.00000000D+00 -4.65898141D-02\r\n -2.71990262D-02  1.00000000D+00 -4.84563895D-02  4.03310657D-01  1.39999998D+00\r\n -3.08300077D-04  1.00000000D+00 -1.07462266D-02  1.38558960D+00 -1.24517642D-01\r\n  1.07548237D+00 -1.03764698D-01 -3.48328426D-02  1.00000000D+00 -8.24680901D-04\r\n -7.48468280D-01  1.25153172D+00 -3.74234140D-01  1.00000000D+00 -3.27906664D-03\r\n -1.67540276D+00  3.24597239D-01 -8.37701380D-01 -2.89995759D-03  1.00000000D+00\r\n -4.07752655D-02  1.11877225D-01 -5.41795138D-03 -6.68755710D-01  5.31244338D-01\r\n -5.57296395D-01  1.00000000D+00 -1.67749810D-03 -6.27053499D-01  1.37294650D+00\r\n -3.13526750D-01  1.00000000D+00 -4.19815013D-04 -1.86955050D-01  1.01304495D+00\r\n -1.55795872D-01 -4.62385714D-02  1.00000000D+00 -4.53347369D-04 -7.21822023D-01\r\n  1.27817798D+00 -3.60911012D-01  1.00000000D+00 -2.73104146D-04 -1.05930492D-01\r\n  3.94069523D-01 -2.11860985D-01 -1.68937333D-02 -1.85398629D-03  1.00000000D+00\r\n -1.08470803D-03  5.00000000D-01 -1.68574753D-03  1.00000000D+00 -2.69034058D-01\r\n  2.30965927D-01 -1.20000005D+00 -1.00000000D+00 -3.55678231D-01 -3.18024121D-02\r\n -8.37958045D-03  1.00000000D+00 -1.82339847D-02  6.98937196D-03 -3.84520710D-04\r\n -1.51235133D-01  3.48764867D-01 -3.02470267D-01 -3.91993411D-02 -6.69464841D-02\r\n -2.91612893D-01 -1.06548648D-02  1.00000000D+00 -7.98794478D-02  2.72300512D-01\r\n -4.04177612D-04  5.00000000D-01 -2.50663608D-02 -1.26683037D-03  1.00000000D+00\r\n -4.20977129D-03  1.25440717D-01  5.00000000D-01 -9.76003241D-03  1.00000000D+00\r\n  1.29999995D+00 -9.82436165D-03  1.00000000D+00 -1.75757363D-01  1.11488414D+00\r\n -2.00484797D-01  1.69951510D+00 -1.05518319D-01 -1.29680149D-03  1.00000000D+00\r\n -1.24636805D-03 -1.61500096D+00  3.84999037D-01 -8.07500482D-01 -1.11489906D-03\r\n -1.57474761D-03 -3.36079829D-04 -1.46485993D-03 -7.46365869D-04 -5.04391151D-04\r\n -5.86504175D-04 -5.21592912D-04 -6.88093295D-03 -1.04867527D-02 -3.19255888D-01\r\n -1.61293726D-02  1.00000000D+00 -2.71766007D-01  1.29452288D-01 -5.35347452D-03\r\n -2.23066592D+00  1.16933429D+00 -6.56078160D-01 -7.18148332D-03  1.00000000D+00\r\n -2.35442594D-02  4.97347564D-02 -4.88137603D-02 -2.04773259D+00  3.52267474D-01\r\n -8.53221893D-01 -2.72035366D-03 -1.77766650D-03 -2.38104025D-03 -8.15090723D-04\r\n -9.42158105D-04 -6.70078967D-04 -7.60167604D-04 -2.11644132D-04 -5.66360168D-02\r\n -1.50002027D-03 -4.91754897D-03 -4.01309192D-01 -1.08380883D-03 -4.96166467D-04\r\n  1.00000000D+00 -6.68438077D-01  2.79838085D-01 -7.92497536D-04 -2.33849168D-01\r\n  2.66150832D-01 -4.67698336D-01  1.00000000D+00 -2.87304446D-03 -2.91807055D-01\r\n  8.08192968D-01 -2.65279144D-01  1.00000000D+00 -6.22297544D-03 -1.14481020D+00\r\n  8.55189800D-01 -5.72405100D-01 -5.58000579D-02 -8.98083020D-03  1.00000000D+00\r\n -5.37051633D-02  4.83965762D-02 -1.98628195D-02 -1.42642903D+00  5.73570967D-01\r\n -7.13214517D-01 -6.67206198D-02  1.00000000D+00 -8.40566121D-04 -4.85329628D-01\r\n  1.51467037D+00 -2.42664814D-01 -8.96874291D-04 -1.32383301D-03 -1.32967182D-03\r\n -1.28170592D-03 -1.33668678D-03 -1.33038755D-03 -1.32171414D-03 -1.25945604D-03\r\n -2.33388562D-02 -1.62985370D-01 -3.80810276D-02 -6.71791732D-02 -6.75262418D-03\r\n -2.05335543D-01 -1.06370752D-03 -6.19772589D-04 -1.66779512D-03  1.00000000D+00\r\n -2.90093929D-01  6.60795033D-01 -5.33351488D-03  5.00000000D-01 -5.65960491D-03\r\n -2.14861985D-03 -1.23228477D-02 -1.28709001D-03 -7.76296109D-03 -3.21339467D-03\r\n -8.52899859D-04 -1.39193831D-03 -6.88091968D-04 -2.32404447D-03 -5.68990072D-04\r\n -4.16228548D-03 -5.25717530D-03 -4.48758365D-04 -8.08227435D-03 -3.93367372D-04\r\n -1.24063122D-03 -5.52031258D-03 -1.16483490D-04 -4.70676506D-03 -1.84243242D-03\r\n -7.13348098D-04 -3.01135471D-03 -6.30347338D-03 -8.09392985D-03 -7.22343859D-04\r\n -2.85392837D-03 -9.41671710D-03 -3.20973643D-03 -3.92820593D-03 -4.84057469D-03\r\n -2.64233109D-02 -5.63934073D-02  1.00000000D+00 -2.29801148D-01  2.15929925D-01\r\n -1.27107942D+00  1.28920510D-01 -9.07913923D-01 -2.93939412D-02 -1.22682666D-02\r\n  1.00000000D+00 -1.69435248D-01  1.62539542D-01 -2.38049356D-03  2.00000000D+00\r\n  1.00000000D+00 -3.33289027D-01  9.66710985D-01 -2.56376177D-01 -2.38482412D-02\r\n  1.00000000D+00 -1.95702668D-02  6.02502711D-02 -1.50823966D-03 -8.34249184D-02\r\n  4.16575074D-01 -1.66849837D-01 -1.41137898D-01 -6.21925406D-02 -1.79157741D-02\r\n -9.31619946D-03 -7.97656104D-02 -9.82721709D-03 -4.57741946D-01 -8.74001831D-02\r\n  1.00000000D+00 -7.48817250D-02  1.90253779D-01 -7.64884287D-04 -1.04966235D+00\r\n  1.50337681D-01 -8.74718606D-01 -3.10189673D-03 -1.23634702D-03 -1.01881835D-03\r\n -1.04654080D-03 -1.15193555D-03 -1.14678754D-03 -9.76467039D-04 -1.26755168D-03\r\n -1.10509451D-02 -1.98407471D-02 -2.79315859D-02 -6.27332646D-03 -1.09529030D-02\r\n -1.17584094D-02 -1.94125865D-02  1.00000000D+00 -3.93045694D-02  4.44007665D-02\r\n -5.15591446D-03  2.00000000D+00  1.00000000D+00  5.00000000D-01  1.00000000D+00\r\n  2.00000000D+00  1.00000000D+00  2.00000000D+00  1.00000000D+00  2.00000000D+00\r\n  1.00000000D+00  2.00000000D+00  1.00000000D+00  2.00000000D+00  1.00000000D+00\r\n  2.00000000D+00 -9.70873654D-01  1.00000000D+00  2.00000000D+00  1.00000000D+00\r\n  2.00000000D+00  1.00000000D+00  2.06969410D-01  1.42192304D-01  9.91375148D-02\r\n  1.21215612D-01  1.07199252D-01  9.79955196D-02  8.66832137D-02  1.13363981D-01\r\n  5.14388204D-01  3.99175406D-01  2.79817909D-01  3.77357244D-01  4.94234264D-02\r\n  3.67496192D-01  8.83079469D-02  2.73117274D-01  1.62650615D-01  1.08350277D-01\r\n  1.78367764D-01  1.42301500D-01  1.99999988D-01  1.57062501D-01  3.46346229D-01\r\n  1.68499485D-01  1.43396467D-01  2.21011877D-01  1.31137341D-01  2.03243569D-01\r\n  2.62830466D-01  2.20662773D-01  2.05521852D-01  3.04139465D-01  2.50172228D-01\r\n  3.27778846D-01  3.86875868D-01  2.86146790D-01  3.49301606D-01  2.04914153D-01\r\n  1.63164020D-01  1.44504279D-01  1.19339019D-01  4.49773788D-01  1.22339576D-01\r\n  1.75039321D-01  3.13483953D-01  2.35000014D-01  1.18269891D-01  9.08070803D-03\r\n  5.00000000D-01  2.50000000D-01 -2.93030590D-01 -3.57807696D-01 -4.00862485D-01\r\n -3.78784388D-01 -3.92800748D-01 -4.02004480D-01 -4.13316786D-01 -3.86636019D-01\r\n -1.85611829D-01 -1.00824602D-01 -2.20182091D-01 -2.22642779D-01 -4.50576574D-01\r\n -1.32503808D-01 -4.11692053D-01 -4.26882714D-01 -3.37349385D-01 -3.91649723D-01\r\n -4.21632260D-01 -3.57698500D-01 -5.00000000D-01 -5.42937458D-01 -2.53653795D-01\r\n -4.31500524D-01 -3.56603533D-01 -2.78988123D-01 -3.68862659D-01 -3.96756440D-01\r\n -2.37169534D-01 -3.79337251D-01 -2.94478148D-01 -3.95860523D-01 -4.49827760D-01\r\n -1.72221169D-01 -2.13124171D-01 -3.13853234D-01 -1.50698408D-01 -2.95085847D-01\r\n -3.36835980D-01 -3.55495721D-01 -3.80660981D-01 -1.50226235D-01 -3.77660424D-01\r\n -3.24960679D-01 -1.86516061D-01 -2.64999986D-01 -3.81730109D-01 -4.90919292D-01\r\n -2.50000000D-01 -5.00000000D-01 -5.00000000D-01 -2.93030590D-01 -3.57807696D-01\r\n -4.00862485D-01 -3.78784388D-01 -3.92800748D-01 -4.02004480D-01 -4.13316786D-01\r\n -3.86636019D-01 -1.85611829D-01 -1.00824602D-01 -2.20182091D-01 -2.22642779D-01\r\n -4.50576574D-01 -1.32503808D-01 -4.11692053D-01 -4.26882714D-01 -3.37349385D-01\r\n -3.91649723D-01 -4.21632260D-01 -3.57698500D-01 -5.00000000D-01 -5.42937458D-01\r\n -2.53653795D-01 -4.31500524D-01 -3.56603533D-01 -2.78988123D-01 -3.68862659D-01\r\n -3.96756440D-01 -2.37169534D-01 -3.79337251D-01 -2.94478148D-01 -3.95860523D-01\r\n -4.49827760D-01 -1.72221169D-01 -2.13124171D-01 -3.13853234D-01 -1.50698408D-01\r\n -2.95085847D-01 -3.36835980D-01 -3.55495721D-01 -3.80660981D-01 -1.50226235D-01\r\n -3.77660424D-01 -3.24960679D-01 -1.86516061D-01 -2.64999986D-01 -3.81730109D-01\r\n -4.90919292D-01 -2.50000000D-01 -5.00000000D-01 -5.00000000D-01 -4.84386444D-01\r\n -5.61829507D-01 -6.71342134D-01 -5.77910066D-01 -5.65740168D-01 -5.57189345D-01\r\n -6.78157926D-01 -5.21830022D-01 -3.84170078D-02 -8.72260258D-02 -2.06981167D-01\r\n -1.04951881D-01 -5.13661385D-01 -9.55502614D-02 -3.01023483D-01 -3.79936486D-01\r\n -3.87598157D-01 -4.01674479D-01 -4.01453912D-01 -4.55248922D-01 -2.83446878D-01\r\n -4.43214297D-01 -1.71091840D-01 -4.12138194D-01 -3.89837623D-01 -4.61512387D-01\r\n -4.64076310D-01 -3.27409387D-01 -2.21497595D-01 -3.14730257D-01 -2.30232194D-01\r\n -1.56761721D-01 -2.32789949D-01 -1.27302766D-01 -1.61466956D-01 -2.07014278D-01\r\n -1.71532094D-01 -3.33930194D-01 -4.81194258D-01 -3.08955878D-01 -3.55723470D-01\r\n -8.63323063D-02 -7.10011542D-01 -4.41480815D-01 -2.43827671D-01 -3.81600082D-01\r\n -3.81729990D-01 -9.52321470D-01 -1.00000000D+00 -1.00000000D+00  1.00000000D+00\r\n -1.75656468D-01  3.24343532D-01 -1.75656468D-01 -2.90364295D-01 -2.50000000D+00\r\n -7.48264492D-02  4.25173551D-01 -7.48264492D-02 -1.17492460D-01 -2.70000005D+00\r\n -5.77010401D-02  4.42298949D-01 -5.77010401D-02 -9.66344848D-02 -2.50000000D+00\r\n -6.47369847D-02  4.35263008D-01 -6.47369847D-02 -9.87690017D-02 -2.70000005D+00\r\n -7.03428686D-02  4.29657131D-01 -7.03428686D-02 -1.01312913D-01 -2.90000010D+00\r\n -7.71906078D-02  4.22809392D-01 -7.71906078D-02 -1.06988318D-01 -2.90000010D+00\r\n -5.80480322D-02  4.41951960D-01 -5.80480322D-02 -9.52434912D-02 -2.90000010D+00\r\n -8.63306150D-02  4.13669378D-01 -8.63306150D-02 -1.16517611D-01 -2.90000010D+00\r\n -5.14388204D-01  1.85611799D-01 -5.14388204D-01 -1.06465489D-01 -2.40000010D+00\r\n -3.99175406D-01  1.00824594D-01 -3.99175406D-01 -3.45337152D-01 -1.50000000D+00\r\n -2.79817909D-01  2.20182091D-01 -2.79817909D-01 -2.63041526D-01 -2.40000010D+00\r\n -3.77357244D-01  2.22642779D-01 -3.77357244D-01 -1.77882954D-01 -1.89999998D+00\r\n -4.94234152D-02  4.50576574D-01 -4.94234152D-02 -5.63431382D-02 -1.60000002D+00\r\n -3.67496192D-01  1.32503808D-01 -3.67496192D-01 -2.65006363D-01 -2.09999990D+00\r\n -8.83079469D-02  4.11692053D-01 -8.83079469D-02 -6.45695329D-02 -1.79999995D+00\r\n -2.73117244D-01  4.26882774D-01 -2.73117244D-01 -2.43081301D-01 -1.79999995D+00\r\n -1.62650600D-01  3.37349415D-01 -1.62650600D-01 -1.86877683D-01 -1.79999995D+00\r\n -1.08350284D-01  3.91649723D-01 -1.08350284D-01 -1.11123636D-01 -1.79999995D+00\r\n -1.78367749D-01  4.21632290D-01 -1.78367749D-01 -1.69831485D-01 -1.79999995D+00\r\n -1.42301500D-01  3.57698500D-01 -1.42301500D-01 -1.81109533D-01 -1.79999995D+00\r\n -2.00000003D-01  5.00000000D-01 -2.00000003D-01 -1.13378748D-01 -1.89999998D+00\r\n -1.57062501D-01  5.42937458D-01 -1.57062501D-01 -1.28214285D-01 -1.89999998D+00\r\n -3.46346229D-01  2.53653795D-01 -3.46346229D-01 -2.33613744D-01 -1.79999995D+00\r\n -1.68499500D-01  4.31500524D-01 -1.68499500D-01 -1.60938576D-01 -2.20000005D+00\r\n -1.43396482D-01  3.56603533D-01 -1.43396482D-01 -1.56760484D-01 -2.59999990D+00\r\n -2.21011877D-01  2.78988123D-01 -2.21011877D-01 -3.65605980D-01 -2.59999990D+00\r\n -1.31137356D-01  3.68862659D-01 -1.31137356D-01 -1.64987534D-01 -2.20000005D+00\r\n -2.03243569D-01  3.96756440D-01 -2.03243569D-01 -1.67719662D-01 -1.50000000D+00\r\n -2.62830466D-01  2.37169534D-01 -2.62830466D-01 -2.45462865D-01 -3.00000000D+00\r\n -2.20662788D-01  3.79337251D-01 -2.20662788D-01 -1.83080494D-01 -1.89999998D+00\r\n -2.05521852D-01  2.94478148D-01 -2.05521852D-01 -1.60683393D-01 -2.40000010D+00\r\n -3.04139495D-01  3.95860523D-01 -3.04139495D-01 -1.20439976D-01 -2.40000010D+00\r\n -2.50172228D-01  4.49827760D-01 -2.50172228D-01 -1.29466400D-01 -2.40000010D+00\r\n -3.27778846D-01  1.72221154D-01 -3.27778846D-01 -2.42288172D-01 -2.40000010D+00\r\n -3.86875868D-01  2.13124156D-01 -3.86875868D-01 -2.93104559D-01 -1.89999998D+00\r\n -2.86146790D-01  3.13853234D-01 -2.86146790D-01 -1.88739419D-01 -2.20000005D+00\r\n -3.49301606D-01  1.50698394D-01 -3.49301606D-01 -3.97591680D-01 -1.70000005D+00\r\n -2.04914153D-01  2.95085847D-01 -2.04914153D-01 -2.31888533D-01 -2.20000005D+00\r\n -1.63164020D-01  3.36835980D-01 -1.63164020D-01 -2.33091459D-01 -2.90000010D+00\r\n -1.44504279D-01  3.55495721D-01 -1.44504279D-01 -1.25586450D-01 -2.20000005D+00\r\n -1.19339012D-01  3.80660981D-01 -1.19339012D-01 -1.11520983D-01 -2.59999990D+00\r\n -4.49773788D-01  1.50226235D-01 -4.49773788D-01 -2.58476883D-01 -1.79999995D+00\r\n -1.22339584D-01  3.77660424D-01 -1.22339584D-01 -2.30001658D-01 -1.70000005D+00\r\n -1.75039321D-01  3.24960679D-01 -1.75039321D-01 -2.37802625D-01 -1.70000005D+00\r\n -3.13483924D-01  1.86516076D-01 -3.13483924D-01 -4.09809500D-01 -1.60000002D+00\r\n -2.34999999D-01  2.65000015D-01 -2.34999999D-01 -3.38400066D-01 -1.60000002D+00\r\n -1.18269883D-01  3.81730109D-01 -1.18269883D-01 -1.18269853D-01 -1.60000002D+00\r\n -9.08071082D-03  4.90919292D-01 -9.08071082D-03 -1.76154319D-02 -1.50000000D+00\r\n -5.00000000D-01 -5.00000000D-01 -9.69999790D-01 -1.50000000D+00 -2.50000000D-01\r\n  2.50000000D-01 -2.50000000D-01 -1.60000002D+00  5.00000000D-01 -1.70000005D+00\r\n  5.00000000D-01 -1.70000005D+00 -3.13129500D-02 -3.13129500D-02  4.68687057D-01\r\n -5.17610461D-02 -6.73658550D-02 -6.73658550D-02  4.32634145D-01 -1.05777845D-01\r\n -4.14364599D-02 -4.14364599D-02  4.58563536D-01 -6.93954676D-02 -5.64786419D-02\r\n -5.64786419D-02  4.43521351D-01 -8.61692801D-02 -3.68563868D-02 -3.68563868D-02\r\n  4.63143617D-01 -5.30832484D-02 -2.08049174D-02 -2.08049174D-02  4.79195088D-01\r\n -2.88361926D-02 -2.86351871D-02 -2.86351871D-02  4.71364826D-01 -4.69837673D-02\r\n -2.70333719D-02 -2.70333719D-02  4.72966641D-01 -3.64860594D-02  6.99999988D-01\r\n  5.00000000D-01  5.00000000D-01  6.00000024D-01  5.00000000D-01  5.00000000D-01\r\n  5.00000000D-01  6.99999988D-01  5.00000000D-01  5.00000000D-01  6.00000024D-01\r\n  5.00000000D-01  6.99999988D-01  6.99999988D-01  6.00000024D-01  6.00000024D-01\r\n  5.00000000D-01  5.00000000D-01  5.00000000D-01  6.00000024D-01  5.00000000D-01\r\n  6.00000024D-01  5.00000000D-01  6.99999988D-01  6.99999988D-01  5.00000000D-01\r\n  6.00000024D-01  6.00000024D-01  5.00000000D-01  5.00000000D-01  5.00000000D-01\r\n  5.00000000D-01  5.00000000D-01  6.00000024D-01  5.00000000D-01  5.00000000D-01\r\n  5.00000000D-01  5.00000000D-01  5.00000000D-01  5.00000000D-01  5.00000000D-01\r\n  5.00000000D-01  5.00000000D-01  5.00000000D-01  1.00000000D+00  2.17519850D-01\r\n  1.00000000D+00  2.17519850D-01  1.00000000D+00  2.17519850D-01  1.00000000D+00\r\n  7.78065412D-04  7.78065412D-04  7.78065412D-04  2.18297914D-01  7.78065412D-04\r\n  1.94401259D-03  7.78065412D-04  2.30427063D-03  1.10379385D-03  1.24306313D-03\r\n  7.78065412D-04  7.78065412D-04  2.30427063D-03  1.64245476D-03  1.48016575D-03\r\n  1.94401259D-03  7.78065412D-04  1.48016575D-03  1.48016575D-03  1.48016575D-03\r\n  1.94401259D-03  1.94401259D-03  1.48016575D-03  1.94401259D-03  1.94401259D-03\r\n  1.48016575D-03  1.94401259D-03  1.94401259D-03  1.94401259D-03  1.48016575D-03\r\n  1.94401259D-03  2.30427063D-03  1.48016575D-03  1.24306313D-03  7.78065412D-04\r\n  7.78065412D-04  1.64245476D-03  9.62222868D-04  9.62222868D-04  1.48016575D-03\r\n  7.78065412D-04  1.94401259D-03  1.48016575D-03  1.94401259D-03  1.94401259D-03\r\n  1.94401259D-03  1.94401259D-03  1.94401259D-03  1.94401259D-03  1.94401259D-03\r\n  1.44678715D-03  1.94401259D-03  1.94401259D-03  1.94401259D-03  1.00000000D+00\r\n  9.95924044D-03  9.95924044D-03  9.95924044D-03  9.95924044D-03  2.27479085D-01\r\n  2.48833690D-02  9.95924044D-03  2.94946730D-02  1.41285667D-02  1.59112141D-02\r\n  9.95924044D-03  9.95924044D-03  2.94946730D-02  2.10234281D-02  1.89461298D-02\r\n  2.48833690D-02  9.95924044D-03  1.89461298D-02  1.89461298D-02  1.89461298D-02\r\n  2.48833690D-02  2.48833690D-02  1.89461298D-02  2.48833690D-02  2.48833690D-02\r\n  1.89461298D-02  2.48833690D-02  2.48833690D-02  2.48833690D-02  1.89461298D-02\r\n  2.48833690D-02  2.94946730D-02  1.89461298D-02  1.59112141D-02  9.95924044D-03\r\n  9.95924044D-03  2.10234281D-02  1.23164579D-02  1.23164579D-02  1.89461298D-02\r\n  9.95924044D-03  2.48833690D-02  1.89461298D-02  2.48833690D-02  2.48833690D-02\r\n  2.48833690D-02  2.48833690D-02  2.48833690D-02  2.48833690D-02  2.48833690D-02\r\n  1.85188837D-02  2.48833690D-02  2.48833690D-02  2.48833690D-02  1.00000000D+00\r\n  5.43477893D-01  1.00000000D+00  5.52011142D-03  5.52011142D-03  5.52011142D-03\r\n  5.52011142D-03  5.52011142D-03  1.37921125D-02  2.23039955D-01  1.63480211D-02\r\n  7.83104450D-03  8.81911349D-03  5.52011142D-03  5.52011142D-03  1.63480211D-02\r\n  1.16526615D-02  1.05012767D-02  1.37921125D-02  5.52011142D-03  1.05012767D-02\r\n  1.05012767D-02  1.05012767D-02  1.37921125D-02  1.37921125D-02  1.05012767D-02\r\n  1.37921125D-02  1.37921125D-02  1.05012767D-02  1.37921125D-02  1.37921125D-02\r\n  1.37921125D-02  1.05012767D-02  1.37921125D-02  1.63480211D-02  1.05012767D-02\r\n  8.81911349D-03  5.52011142D-03  5.52011142D-03  1.16526615D-02  6.82664663D-03\r\n  6.82664663D-03  1.05012767D-02  5.52011142D-03  1.37921125D-02  1.05012767D-02\r\n  1.37921125D-02  1.37921125D-02  1.37921125D-02  1.37921125D-02  1.37921125D-02\r\n  1.37921125D-02  1.37921125D-02  1.02644665D-02  1.37921125D-02  1.37921125D-02\r\n  1.37921125D-02  1.00000000D+00  6.44193411D-01  1.00000000D+00  1.63674168D-02\r\n  1.63674168D-02  1.63674168D-02  1.63674168D-02  1.63674168D-02  4.08943295D-02\r\n  1.63674168D-02  4.84727360D-02  3.31801593D-01  2.61491276D-02  1.63674168D-02\r\n  1.63674168D-02  4.84727360D-02  3.45507450D-02  3.11368294D-02  4.08943295D-02\r\n  1.63674168D-02  3.11368294D-02  3.11368294D-02  3.11368294D-02  4.08943295D-02\r\n  4.08943295D-02  3.11368294D-02  4.08943295D-02  4.08943295D-02  3.11368294D-02\r\n  4.08943295D-02  4.08943295D-02  4.08943295D-02  3.11368294D-02  4.08943295D-02\r\n  4.84727360D-02  3.11368294D-02  2.61491276D-02  1.63674168D-02  1.63674168D-02\r\n  3.45507450D-02  2.02413611D-02  2.02413611D-02  3.11368294D-02  1.63674168D-02\r\n  4.08943295D-02  3.11368294D-02  4.08943295D-02  4.08943295D-02  4.08943295D-02\r\n  4.08943295D-02  4.08943295D-02  4.08943295D-02  4.08943295D-02  3.04346774D-02\r\n  4.08943295D-02  4.08943295D-02  4.08943295D-02  1.00000000D+00  2.36398429D-02\r\n  2.36398429D-02  2.36398429D-02  2.36398429D-02  2.36398429D-02  5.90646379D-02\r\n  2.36398429D-02  7.00103045D-02  3.35364044D-02  3.85284722D-01  2.36398429D-02\r\n  2.36398429D-02  7.00103045D-02  4.99024540D-02  4.49716561D-02  5.90646379D-02\r\n  2.36398429D-02  4.49716561D-02  4.49716561D-02  4.49716561D-02  5.90646379D-02\r\n  5.90646379D-02  4.49716561D-02  5.90646379D-02  5.90646379D-02  4.49716561D-02\r\n  5.90646379D-02  5.90646379D-02  5.90646379D-02  4.49716561D-02  5.90646379D-02\r\n  7.00103045D-02  4.49716561D-02  3.77677977D-02  2.36398429D-02  2.36398429D-02\r\n  4.99024540D-02  2.92350724D-02  2.92350724D-02  4.49716561D-02  2.36398429D-02\r\n  5.90646379D-02  4.49716561D-02  5.90646379D-02  5.90646379D-02  5.90646379D-02\r\n  5.90646379D-02  5.90646379D-02  5.90646379D-02  5.90646379D-02  4.39575128D-02\r\n  5.90646379D-02  5.90646379D-02  5.90646379D-02  1.00000000D+00  1.12819523D-02\r\n  1.12819523D-02  1.12819523D-02  1.12819523D-02  1.12819523D-02  2.81881951D-02\r\n  1.12819523D-02  3.34119350D-02  1.60050169D-02  1.80244222D-02  2.28801802D-01\r\n  1.12819523D-02  3.34119350D-02  2.38156039D-02  2.14624126D-02  2.81881951D-02\r\n  1.12819523D-02  2.14624126D-02  2.14624126D-02  2.14624126D-02  2.81881951D-02\r\n  2.81881951D-02  2.14624126D-02  2.81881951D-02  2.81881951D-02  2.14624126D-02\r\n  2.81881951D-02  2.81881951D-02  2.81881951D-02  2.14624126D-02  2.81881951D-02\r\n  3.34119350D-02  2.14624126D-02  1.80244222D-02  1.12819523D-02  1.12819523D-02\r\n  2.38156039D-02  1.39522376D-02  1.39522376D-02  2.14624126D-02  1.12819523D-02\r\n  2.81881951D-02  2.14624126D-02  2.81881951D-02  2.81881951D-02  2.81881951D-02\r\n  2.81881951D-02  2.81881951D-02  2.81881951D-02  2.81881951D-02  2.09784228D-02\r\n  2.81881951D-02  2.81881951D-02  2.81881951D-02  1.00000000D+00  1.45590007D-02\r\n  1.45590007D-02  1.45590007D-02  1.45590007D-02  1.45590007D-02  3.63759659D-02\r\n  1.45590007D-02  4.31170389D-02  2.06539650D-02  2.32599434D-02  1.45590007D-02\r\n  2.32078850D-01  4.31170389D-02  3.07332780D-02  2.76965592D-02  3.63759659D-02\r\n  1.45590007D-02  2.76965592D-02  2.76965592D-02  2.76965592D-02  3.63759659D-02\r\n  3.63759659D-02  2.76965592D-02  3.63759659D-02  3.63759659D-02  2.76965592D-02\r\n  3.63759659D-02  3.63759659D-02  3.63759659D-02  2.76965592D-02  3.63759659D-02\r\n  4.31170389D-02  2.76965592D-02  2.32599434D-02  1.45590007D-02  1.45590007D-02\r\n  3.07332780D-02  1.80049166D-02  1.80049166D-02  2.76965592D-02  1.45590007D-02\r\n  3.63759659D-02  2.76965592D-02  3.63759659D-02  3.63759659D-02  3.63759659D-02\r\n  3.63759659D-02  3.63759659D-02  3.63759659D-02  3.63759659D-02  2.70719863D-02\r\n  3.63759659D-02  3.63759659D-02  3.63759659D-02  1.00000000D+00  3.99022875D-03\r\n  3.99022875D-03  3.99022875D-03  3.99022875D-03  3.99022875D-03  9.96967033D-03\r\n  3.99022875D-03  1.18172178D-02  5.66069456D-03  6.37492212D-03  3.99022875D-03\r\n  3.99022875D-03  6.56010628D-01  8.42316169D-03  7.59087969D-03  9.96967033D-03\r\n  3.99022875D-03  7.59087969D-03  7.59087969D-03  7.59087969D-03  9.96967033D-03\r\n  9.96967033D-03  7.59087969D-03  9.96967033D-03  9.96967033D-03  7.59087969D-03\r\n  9.96967033D-03  9.96967033D-03  9.96967033D-03  7.59087969D-03  9.96967033D-03\r\n  1.18172178D-02  7.59087969D-03  6.37492212D-03  3.99022875D-03  3.99022875D-03\r\n  8.42316169D-03  4.93466202D-03  4.93466202D-03  7.59087969D-03  3.99022875D-03\r\n  9.96967033D-03  7.59087969D-03  9.96967033D-03  9.96967033D-03  9.96967033D-03\r\n  9.96967033D-03  9.96967033D-03  9.96967033D-03  9.96967033D-03  7.41970027D-03\r\n  9.96967033D-03  9.96967033D-03  9.96967033D-03  1.00000000D+00  4.59172845D-01\r\n  1.00000000D+00  2.76930194D-04  2.76930194D-04  2.76930194D-04  2.76930194D-04\r\n  2.76930194D-04  6.91915862D-04  2.76930194D-04  8.20139423D-04  3.92863934D-04\r\n  4.42432880D-04  2.76930194D-04  2.76930194D-04  8.20139423D-04  5.84584952D-04\r\n  4.14329380D-01  6.91915862D-04  2.76930194D-04  5.26822812D-04  5.26822812D-04\r\n  5.26822812D-04  6.91915862D-04  6.91915862D-04  5.26822812D-04  6.91915862D-04\r\n  6.91915862D-04  5.26822812D-04  6.91915862D-04  6.91915862D-04  6.91915862D-04\r\n  5.26822812D-04  6.91915862D-04  8.20139423D-04  5.26822812D-04  4.42432880D-04\r\n  2.76930194D-04  2.76930194D-04  5.84584952D-04  3.42475803D-04  3.42475803D-04\r\n  5.26822812D-04  2.76930194D-04  6.91915862D-04  5.26822812D-04  6.91915862D-04\r\n  6.91915862D-04  6.91915862D-04  6.91915862D-04  6.91915862D-04  6.91915862D-04\r\n  6.91915862D-04  5.14942629D-04  6.91915862D-04  6.91915862D-04  6.91915862D-04\r\n  1.00000000D+00  1.79941696D-03  1.79941696D-03  1.79941696D-03  1.79941696D-03\r\n  1.79941696D-03  4.49588103D-03  1.79941696D-03  5.32904267D-03  2.55272305D-03\r\n  2.87480839D-03  1.79941696D-03  1.79941696D-03  5.32904267D-03  3.79847386D-03\r\n  3.42315156D-03  5.47973752D-01  1.79941696D-03  3.42315156D-03  3.42315156D-03\r\n  3.42315156D-03  4.49588103D-03  4.49588103D-03  3.42315156D-03  4.49588103D-03\r\n  4.49588103D-03  3.42315156D-03  4.49588103D-03  4.49588103D-03  4.49588103D-03\r\n  3.42315156D-03  4.49588103D-03  5.32904267D-03  3.42315156D-03  2.87480839D-03\r\n  1.79941696D-03  1.79941696D-03  3.79847386D-03  2.22531473D-03  2.22531473D-03\r\n  3.42315156D-03  1.79941696D-03  4.49588103D-03  3.42315156D-03  4.49588103D-03\r\n  4.49588103D-03  4.49588103D-03  4.49588103D-03  4.49588103D-03  4.49588103D-03\r\n  4.49588103D-03  3.34595726D-03  4.49588103D-03  4.49588103D-03  4.49588103D-03\r\n  1.00000000D+00  3.40027385D-03  3.40027385D-03  3.40027385D-03  3.40027385D-03\r\n  3.40027385D-03  8.49565491D-03  3.40027385D-03  1.00700418D-02  4.82376106D-03\r\n  5.43239061D-03  3.40027385D-03  3.40027385D-03  1.00700418D-02  7.17779715D-03\r\n  6.46856846D-03  8.49565491D-03  2.20920131D-01  6.46856846D-03  6.46856846D-03\r\n  6.46856846D-03  8.49565491D-03  8.49565491D-03  6.46856846D-03  8.49565491D-03\r\n  8.49565491D-03  6.46856846D-03  8.49565491D-03  8.49565491D-03  8.49565491D-03\r\n  6.46856846D-03  8.49565491D-03  1.00700418D-02  6.46856846D-03  5.43239061D-03\r\n  3.40027385D-03  3.40027385D-03  7.17779715D-03  4.20507230D-03  4.20507230D-03\r\n  6.46856846D-03  3.40027385D-03  8.49565491D-03  6.46856846D-03  8.49565491D-03\r\n  8.49565491D-03  8.49565491D-03  8.49565491D-03  8.49565491D-03  8.49565491D-03\r\n  8.49565491D-03  6.32269774D-03  8.49565491D-03  8.49565491D-03  8.49565491D-03\r\n  1.00000000D+00  1.88028405D-03  1.88028405D-03  1.88028405D-03  1.88028405D-03\r\n  1.88028405D-03  4.69792867D-03  1.88028405D-03  5.56853367D-03  2.66744406D-03\r\n  3.00400425D-03  1.88028405D-03  1.88028405D-03  5.56853367D-03  3.96917993D-03\r\n  3.57698998D-03  4.69792867D-03  1.88028405D-03  4.17379558D-01  3.57698998D-03\r\n  3.57698998D-03  4.69792867D-03  4.69792867D-03  3.57698998D-03  4.69792867D-03\r\n  4.69792867D-03  3.57698998D-03  4.69792867D-03  4.69792867D-03  4.69792867D-03\r\n  3.57698998D-03  4.69792867D-03  5.56853367D-03  3.57698998D-03  3.00400425D-03\r\n  1.88028405D-03  1.88028405D-03  3.96917993D-03  2.32532178D-03  2.32532178D-03\r\n  3.57698998D-03  1.88028405D-03  4.69792867D-03  3.57698998D-03  4.69792867D-03\r\n  4.69792867D-03  4.69792867D-03  4.69792867D-03  4.69792867D-03  4.69792867D-03\r\n  4.69792867D-03  3.49632674D-03  4.69792867D-03  4.69792867D-03  4.69792867D-03\r\n  1.00000000D+00  8.75091413D-04  8.75091413D-04  8.75091413D-04  8.75091413D-04\r\n  8.75091413D-04  2.18643411D-03  8.75091413D-04  2.59161694D-03  1.24143891D-03\r\n  1.39807514D-03  8.75091413D-04  8.75091413D-04  2.59161694D-03  1.84727146D-03\r\n  1.66474504D-03  2.18643411D-03  8.75091413D-04  1.66474504D-03  4.15467322D-01\r\n  1.66474504D-03  2.18643411D-03  2.18643411D-03  1.66474504D-03  2.18643411D-03\r\n  2.18643411D-03  1.66474504D-03  2.18643411D-03  2.18643411D-03  2.18643411D-03\r\n  1.66474504D-03  2.18643411D-03  2.59161694D-03  1.66474504D-03  1.39807514D-03\r\n  8.75091413D-04  8.75091413D-04  1.84727146D-03  1.08221371D-03  1.08221371D-03\r\n  1.66474504D-03  8.75091413D-04  2.18643411D-03  1.66474504D-03  2.18643411D-03\r\n  2.18643411D-03  2.18643411D-03  2.18643411D-03  2.18643411D-03  2.18643411D-03\r\n  2.18643411D-03  1.62720389D-03  2.18643411D-03  2.18643411D-03  2.18643411D-03\r\n  1.00000000D+00  3.89279012D-04  3.89279012D-04  3.89279012D-04  3.89279012D-04\r\n  3.89279012D-04  9.72621783D-04  3.89279012D-04  1.15286477D-03  5.52246405D-04\r\n  6.21925166D-04  3.89279012D-04  3.89279012D-04  1.15286477D-03  8.21747351D-04\r\n  7.40551506D-04  9.72621783D-04  3.89279012D-04  7.40551506D-04  7.40551506D-04\r\n  4.14543122D-01  9.72621783D-04  9.72621783D-04  7.40551506D-04  9.72621783D-04\r\n  9.72621783D-04  7.40551506D-04  9.72621783D-04  9.72621783D-04  9.72621783D-04\r\n  7.40551506D-04  9.72621783D-04  1.15286477D-03  7.40551506D-04  6.21925166D-04\r\n  3.89279012D-04  3.89279012D-04  8.21747351D-04  4.81416093D-04  4.81416093D-04\r\n  7.40551506D-04  3.89279012D-04  9.72621783D-04  7.40551506D-04  9.72621783D-04\r\n  9.72621783D-04  9.72621783D-04  9.72621783D-04  9.72621783D-04  9.72621783D-04\r\n  9.72621783D-04  7.23851670D-04  9.72621783D-04  9.72621783D-04  9.72621783D-04\r\n  1.00000000D+00  6.58825913D-04  6.58825913D-04  6.58825913D-04  6.58825913D-04\r\n  6.58825913D-04  1.64609030D-03  6.58825913D-04  1.95113849D-03  9.34636162D-04\r\n  1.05256215D-03  6.58825913D-04  6.58825913D-04  1.95113849D-03  1.39074656D-03\r\n  1.25332864D-03  1.64609030D-03  6.58825913D-04  1.25332864D-03  1.25332864D-03\r\n  1.25332864D-03  5.45123994D-01  1.64609030D-03  1.25332864D-03  1.64609030D-03\r\n  1.64609030D-03  1.25332864D-03  1.64609030D-03  1.64609030D-03  1.64609030D-03\r\n  1.25332864D-03  1.64609030D-03  1.95113849D-03  1.25332864D-03  1.05256215D-03\r\n  6.58825913D-04  6.58825913D-04  1.39074656D-03  8.14761093D-04  8.14761093D-04\r\n  1.25332864D-03  6.58825913D-04  1.64609030D-03  1.25332864D-03  1.64609030D-03\r\n  1.64609030D-03  1.64609030D-03  1.64609030D-03  1.64609030D-03  1.64609030D-03\r\n  1.64609030D-03  1.22506532D-03  1.64609030D-03  1.64609030D-03  1.64609030D-03\r\n  1.00000000D+00  1.71326144D-04  1.71326144D-04  1.71326144D-04  1.71326144D-04\r\n  1.71326144D-04  4.28061961D-04  1.71326144D-04  5.07389021D-04  2.43049974D-04\r\n  2.73716345D-04  1.71326144D-04  1.71326144D-04  5.07389021D-04  3.61660408D-04\r\n  3.25925212D-04  4.28061961D-04  1.71326144D-04  3.25925212D-04  3.25925212D-04\r\n  3.25925212D-04  4.28061961D-04  5.43905973D-01  3.25925212D-04  4.28061961D-04\r\n  4.28061961D-04  3.25925212D-04  4.28061961D-04  4.28061961D-04  4.28061961D-04\r\n  3.25925212D-04  4.28061961D-04  5.07389021D-04  3.25925212D-04  2.73716345D-04\r\n  1.71326144D-04  1.71326144D-04  3.61660408D-04  2.11876730D-04  2.11876730D-04\r\n  3.25925212D-04  1.71326144D-04  4.28061961D-04  3.25925212D-04  4.28061961D-04\r\n  4.28061961D-04  4.28061961D-04  4.28061961D-04  4.28061961D-04  4.28061961D-04\r\n  4.28061961D-04  3.18575389D-04  4.28061961D-04  4.28061961D-04  4.28061961D-04\r\n  1.00000000D+00  1.48846791D-03  1.48846791D-03  1.48846791D-03  1.48846791D-03\r\n  1.48846791D-03  3.71896802D-03  1.48846791D-03  4.40815510D-03  2.11159862D-03\r\n  2.37802579D-03  1.48846791D-03  1.48846791D-03  4.40815510D-03  3.14207654D-03\r\n  2.83161202D-03  3.71896802D-03  1.48846791D-03  2.83161202D-03  2.83161202D-03\r\n  2.83161202D-03  3.71896802D-03  3.71896802D-03  4.16634172D-01  3.71896802D-03\r\n  3.71896802D-03  2.83161202D-03  3.71896802D-03  3.71896802D-03  3.71896802D-03\r\n  2.83161202D-03  3.71896802D-03  4.40815510D-03  2.83161202D-03  2.37802579D-03\r\n  1.48846791D-03  1.48846791D-03  3.14207654D-03  1.84076803D-03  1.84076803D-03\r\n  2.83161202D-03  1.48846791D-03  3.71896802D-03  2.83161202D-03  3.71896802D-03\r\n  3.71896802D-03  3.71896802D-03  3.71896802D-03  3.71896802D-03  3.71896802D-03\r\n  3.71896802D-03  2.76775728D-03  3.71896802D-03  3.71896802D-03  3.71896802D-03\r\n  1.00000000D+00  5.43477893D-01  1.00000000D+00  8.70593140D-05  8.70593140D-05\r\n  8.70593140D-05  8.70593140D-05  8.70593140D-05  2.17519526D-04  8.70593140D-05\r\n  2.57829524D-04  1.23505743D-04  1.39088850D-04  8.70593140D-05  8.70593140D-05\r\n  2.57829524D-04  1.83777607D-04  1.65618767D-04  2.17519526D-04  8.70593140D-05\r\n  1.65618767D-04  1.65618767D-04  1.65618767D-04  2.17519526D-04  2.17519526D-04\r\n  1.65618767D-04  2.17519526D-04  5.43695390D-01  1.65618767D-04  2.17519526D-04\r\n  2.17519526D-04  2.17519526D-04  1.65618767D-04  2.17519526D-04  2.57829524D-04\r\n  1.65618767D-04  1.39088850D-04  8.70593140D-05  8.70593140D-05  1.83777607D-04\r\n  1.07665073D-04  1.07665073D-04  1.65618767D-04  8.70593140D-05  2.17519526D-04\r\n  1.65618767D-04  2.17519526D-04  2.17519526D-04  2.17519526D-04  2.17519526D-04\r\n  2.17519526D-04  2.17519526D-04  2.17519526D-04  1.61883960D-04  2.17519526D-04\r\n  2.17519526D-04  2.17519526D-04  1.00000000D+00  3.88478627D-04  3.88478627D-04\r\n  3.88478627D-04  3.88478627D-04  3.88478627D-04  9.70622001D-04  3.88478627D-04\r\n  1.15049444D-03  5.51110948D-04  6.20646402D-04  3.88478627D-04  3.88478627D-04\r\n  1.15049444D-03  8.20057758D-04  7.39028910D-04  9.70622001D-04  3.88478627D-04\r\n  7.39028910D-04  7.39028910D-04  7.39028910D-04  9.70622001D-04  9.70622001D-04\r\n  7.39028910D-04  9.70622001D-04  9.70622001D-04  4.14541602D-01  9.70622001D-04\r\n  9.70622001D-04  9.70622001D-04  7.39028910D-04  9.70622001D-04  1.15049444D-03\r\n  7.39028910D-04  6.20646402D-04  3.88478627D-04  3.88478627D-04  8.20057758D-04\r\n  4.80426272D-04  4.80426272D-04  7.39028910D-04  3.88478627D-04  9.70622001D-04\r\n  7.39028910D-04  9.70622001D-04  9.70622001D-04  9.70622001D-04  9.70622001D-04\r\n  9.70622001D-04  9.70622001D-04  9.70622001D-04  7.22363358D-04  9.70622001D-04\r\n  9.70622001D-04  9.70622001D-04  1.00000000D+00  5.43477893D-01  1.00000000D+00\r\n  5.43477893D-01  1.00000000D+00  5.43477893D-01  1.00000000D+00  3.43396631D-03\r\n  3.43396631D-03  3.43396631D-03  3.43396631D-03  3.43396631D-03  8.57983623D-03\r\n  3.43396631D-03  1.01698246D-02  4.87155840D-03  5.48621872D-03  3.43396631D-03\r\n  3.43396631D-03  1.01698246D-02  7.24892039D-03  6.53266395D-03  8.57983623D-03\r\n  3.43396631D-03  6.53266395D-03  6.53266395D-03  6.53266395D-03  8.57983623D-03\r\n  8.57983623D-03  6.53266395D-03  8.57983623D-03  8.57983623D-03  6.53266395D-03\r\n  8.57983623D-03  8.57983623D-03  8.57983623D-03  4.20335233D-01  8.57983623D-03\r\n  1.01698246D-02  6.53266395D-03  5.48621872D-03  3.43396631D-03  3.43396631D-03\r\n  7.24892039D-03  4.24673967D-03  4.24673967D-03  6.53266395D-03  3.43396631D-03\r\n  8.57983623D-03  6.53266395D-03  8.57983623D-03  8.57983623D-03  8.57983623D-03\r\n  8.57983623D-03  8.57983623D-03  8.57983623D-03  8.57983623D-03  6.38534827D-03\r\n  8.57983623D-03  8.57983623D-03  8.57983623D-03  1.00000000D+00  1.50102680D-03\r\n  1.50102680D-03  1.50102680D-03  1.50102680D-03  1.50102680D-03  3.75034660D-03\r\n  1.50102680D-03  4.44534887D-03  2.12941528D-03  2.39809020D-03  1.50102680D-03\r\n  1.50102680D-03  4.44534887D-03  3.16858804D-03  2.85550370D-03  3.75034660D-03\r\n  1.50102680D-03  2.85550370D-03  2.85550370D-03  2.85550370D-03  3.75034660D-03\r\n  3.75034660D-03  2.85550370D-03  3.75034660D-03  3.75034660D-03  2.85550370D-03\r\n  3.75034660D-03  3.75034660D-03  3.75034660D-03  2.85550370D-03  5.47228217D-01\r\n  4.44534887D-03  2.85550370D-03  2.39809020D-03  1.50102680D-03  1.50102680D-03\r\n  3.16858804D-03  1.85629935D-03  1.85629935D-03  2.85550370D-03  1.50102680D-03\r\n  3.75034660D-03  2.85550370D-03  3.75034660D-03  3.75034660D-03  3.75034660D-03\r\n  3.75034660D-03  3.75034660D-03  3.75034660D-03  3.75034660D-03  2.79111019D-03\r\n  3.75034660D-03  3.75034660D-03  3.75034660D-03  1.00000000D+00  1.31290816D-02\r\n  1.31290816D-02  1.31290816D-02  1.31290816D-02  1.31290816D-02  3.28032821D-02\r\n  1.31290816D-02  3.88822779D-02  1.86254252D-02  2.09754556D-02  1.31290816D-02\r\n  1.31290816D-02  3.88822779D-02  2.77147945D-02  2.49763280D-02  3.28032821D-02\r\n  1.31290816D-02  2.49763280D-02  2.49763280D-02  2.49763280D-02  3.28032821D-02\r\n  3.28032821D-02  2.49763280D-02  3.28032821D-02  3.28032821D-02  2.49763280D-02\r\n  3.28032821D-02  3.28032821D-02  3.28032821D-02  2.49763280D-02  3.28032821D-02\r\n  6.83075666D-01  2.49763280D-02  2.09754556D-02  1.31290816D-02  1.31290816D-02\r\n  2.77147945D-02  1.62365567D-02  1.62365567D-02  2.49763280D-02  1.31290816D-02\r\n  3.28032821D-02  2.49763280D-02  3.28032821D-02  3.28032821D-02  3.28032821D-02\r\n  3.28032821D-02  3.28032821D-02  3.28032821D-02  3.28032821D-02  2.44130976D-02\r\n  3.28032821D-02  3.28032821D-02  3.28032821D-02  1.00000000D+00  2.70030956D-04\r\n  2.70030956D-04  2.70030956D-04  2.70030956D-04  2.70030956D-04  6.74678013D-04\r\n  2.70030956D-04  7.99707079D-04  3.83076462D-04  4.31410444D-04  2.70030956D-04\r\n  2.70030956D-04  7.99707079D-04  5.70021046D-04  5.13697974D-04  6.74678013D-04\r\n  2.70030956D-04  5.13697974D-04  5.13697974D-04  5.13697974D-04  6.74678013D-04\r\n  6.74678013D-04  5.13697974D-04  6.74678013D-04  6.74678013D-04  5.13697974D-04\r\n  6.74678013D-04  6.74678013D-04  6.74678013D-04  5.13697974D-04  6.74678013D-04\r\n  7.99707079D-04  4.14316267D-01  4.31410444D-04  2.70030956D-04  2.70030956D-04\r\n  5.70021046D-04  3.33943637D-04  3.33943637D-04  5.13697974D-04  2.70030956D-04\r\n  6.74678013D-04  5.13697974D-04  6.74678013D-04  6.74678013D-04  6.74678013D-04\r\n  6.74678013D-04  6.74678013D-04  6.74678013D-04  6.74678013D-04  5.02113777D-04\r\n  6.74678013D-04  6.74678013D-04  6.74678013D-04  1.00000000D+00  1.98783097D-03\r\n  1.98783097D-03  1.98783097D-03  1.98783097D-03  1.98783097D-03  4.96663759D-03\r\n  1.98783097D-03  5.88703807D-03  2.82001449D-03  3.17582488D-03  1.98783097D-03\r\n  1.98783097D-03  5.88703807D-03  4.19620611D-03  3.78158386D-03  4.96663759D-03\r\n  1.98783097D-03  3.78158386D-03  3.78158386D-03  3.78158386D-03  4.96663759D-03\r\n  4.96663759D-03  3.78158386D-03  4.96663759D-03  4.96663759D-03  3.78158386D-03\r\n  4.96663759D-03  4.96663759D-03  4.96663759D-03  3.78158386D-03  4.96663759D-03\r\n  5.88703807D-03  3.78158386D-03  3.50692749D-01  1.98783097D-03  1.98783097D-03\r\n  4.19620611D-03  2.45832372D-03  2.45832372D-03  3.78158386D-03  1.98783097D-03\r\n  4.96663759D-03  3.78158386D-03  4.96663759D-03  4.96663759D-03  4.96663759D-03\r\n  4.96663759D-03  4.96663759D-03  4.96663759D-03  4.96663759D-03  3.69630684D-03\r\n  4.96663759D-03  4.96663759D-03  4.96663759D-03  1.00000000D+00  9.10336524D-03\r\n  9.10336524D-03  9.10336524D-03  9.10336524D-03  9.10336524D-03  2.27449480D-02\r\n  9.10336524D-03  2.69599687D-02  1.29143884D-02  1.45438388D-02  9.10336524D-03\r\n  9.10336524D-03  2.69599687D-02  1.92167219D-02  1.73179395D-02  2.27449480D-02\r\n  9.10336524D-03  1.73179395D-02  1.73179395D-02  1.73179395D-02  2.27449480D-02\r\n  2.27449480D-02  1.73179395D-02  2.27449480D-02  2.27449480D-02  1.73179395D-02\r\n  2.27449480D-02  2.27449480D-02  2.27449480D-02  1.73179395D-02  2.27449480D-02\r\n  2.69599687D-02  1.73179395D-02  1.45438388D-02  2.26623222D-01  9.10336524D-03\r\n  1.92167219D-02  1.12580080D-02  1.12580080D-02  1.73179395D-02  9.10336524D-03\r\n  2.27449480D-02  1.73179395D-02  2.27449480D-02  2.27449480D-02  2.27449480D-02\r\n  2.27449480D-02  2.27449480D-02  2.27449480D-02  2.27449480D-02  1.69274099D-02\r\n  2.27449480D-02  2.27449480D-02  2.27449480D-02  1.00000000D+00  1.34661812D-02\r\n  1.34661812D-02  1.34661812D-02  1.34661812D-02  1.34661812D-02  3.36455368D-02\r\n  1.34661812D-02  3.98806147D-02  1.91036500D-02  2.15140190D-02  1.34661812D-02\r\n  1.34661812D-02  3.98806147D-02  2.84263939D-02  2.56176181D-02  3.36455368D-02\r\n  1.34661812D-02  2.56176181D-02  2.56176181D-02  2.56176181D-02  3.36455368D-02\r\n  3.36455368D-02  2.56176181D-02  3.36455368D-02  3.36455368D-02  2.56176181D-02\r\n  3.36455368D-02  3.36455368D-02  3.36455368D-02  2.56176181D-02  3.36455368D-02\r\n  3.98806147D-02  2.56176181D-02  2.15140190D-02  1.34661812D-02  2.30986029D-01\r\n  2.84263939D-02  1.66534446D-02  1.66534446D-02  2.56176181D-02  1.34661812D-02\r\n  3.36455368D-02  2.56176181D-02  3.36455368D-02  3.36455368D-02  3.36455368D-02\r\n  3.36455368D-02  3.36455368D-02  3.36455368D-02  3.36455368D-02  2.50399243D-02\r\n  3.36455368D-02  3.36455368D-02  3.36455368D-02  1.00000000D+00  3.16114078D-04\r\n  3.16114078D-04  3.16114078D-04  3.16114078D-04  3.16114078D-04  7.89817655D-04\r\n  3.16114078D-04  9.36184078D-04  4.48451785D-04  5.05034404D-04  3.16114078D-04\r\n  3.16114078D-04  9.36184078D-04  6.67300075D-04  6.01364998D-04  7.89817655D-04\r\n  3.16114078D-04  6.01364998D-04  6.01364998D-04  6.01364998D-04  7.89817655D-04\r\n  7.89817655D-04  6.01364998D-04  7.89817655D-04  7.89817655D-04  6.01364998D-04\r\n  7.89817655D-04  7.89817655D-04  7.89817655D-04  6.01364998D-04  7.89817655D-04\r\n  9.36184078D-04  6.01364998D-04  5.05034404D-04  3.16114078D-04  3.16114078D-04\r\n  4.59840149D-01  3.90934001D-04  3.90934001D-04  6.01364998D-04  3.16114078D-04\r\n  7.89817655D-04  6.01364998D-04  7.89817655D-04  7.89817655D-04  7.89817655D-04\r\n  7.89817655D-04  7.89817655D-04  7.89817655D-04  7.89817655D-04  5.87803836D-04\r\n  7.89817655D-04  7.89817655D-04  7.89817655D-04  1.00000000D+00  7.96811283D-03\r\n  7.96811283D-03  7.96811283D-03  7.96811283D-03  7.96811283D-03  1.99084971D-02\r\n  7.96811283D-03  2.35978737D-02  1.13038765D-02  1.27301235D-02  7.96811283D-03\r\n  7.96811283D-03  2.35978737D-02  1.68202631D-02  1.51582742D-02  1.99084971D-02\r\n  7.96811283D-03  1.51582742D-02  1.51582742D-02  1.51582742D-02  1.99084971D-02\r\n  1.99084971D-02  1.51582742D-02  1.99084971D-02  1.99084971D-02  1.51582742D-02\r\n  1.99084971D-02  1.99084971D-02  1.99084971D-02  1.51582742D-02  1.99084971D-02\r\n  2.35978737D-02  1.51582742D-02  1.27301235D-02  7.96811283D-03  7.96811283D-03\r\n  1.68202631D-02  2.78857887D-01  9.85405780D-03  1.51582742D-02  7.96811283D-03\r\n  1.99084971D-02  1.51582742D-02  1.99084971D-02  1.99084971D-02  1.99084971D-02\r\n  1.99084971D-02  1.99084971D-02  1.99084971D-02  1.99084971D-02  1.48164472D-02\r\n  1.99084971D-02  1.99084971D-02  1.99084971D-02  1.00000000D+00  2.63912370D-04\r\n  2.63912370D-04  2.63912370D-04  2.63912370D-04  2.63912370D-04  6.59390527D-04\r\n  2.63912370D-04  7.81586568D-04  3.74396332D-04  4.21635137D-04  2.63912370D-04\r\n  2.63912370D-04  7.81586568D-04  5.57104941D-04  5.02058130D-04  6.59390527D-04\r\n  2.63912370D-04  5.02058130D-04  5.02058130D-04  5.02058130D-04  6.59390527D-04\r\n  6.59390527D-04  5.02058130D-04  6.59390527D-04  6.59390527D-04  5.02058130D-04\r\n  6.59390527D-04  6.59390527D-04  6.59390527D-04  5.02058130D-04  6.59390527D-04\r\n  7.81586568D-04  5.02058130D-04  4.21635137D-04  2.63912370D-04  2.63912370D-04\r\n  5.57104941D-04  3.26376816D-04  2.69330204D-01  5.02058130D-04  2.63912370D-04\r\n  6.59390527D-04  5.02058130D-04  6.59390527D-04  6.59390527D-04  6.59390527D-04\r\n  6.59390527D-04  6.59390527D-04  6.59390527D-04  6.59390527D-04  4.90736391D-04\r\n  6.59390527D-04  6.59390527D-04  6.59390527D-04  1.00000000D+00  7.62254349D-04\r\n  7.62254349D-04  7.62254349D-04  7.62254349D-04  7.62254349D-04  1.90450845D-03\r\n  7.62254349D-04  2.25744559D-03  1.08136376D-03  1.21780287D-03  7.62254349D-04\r\n  7.62254349D-04  2.25744559D-03  1.60907849D-03  1.45008741D-03  1.90450845D-03\r\n  7.62254349D-04  1.45008741D-03  1.45008741D-03  1.45008741D-03  1.90450845D-03\r\n  1.90450845D-03  1.45008741D-03  1.90450845D-03  1.90450845D-03  1.45008741D-03\r\n  1.90450845D-03  1.90450845D-03  1.90450845D-03  1.45008741D-03  1.90450845D-03\r\n  2.25744559D-03  1.45008741D-03  1.21780287D-03  7.62254349D-04  7.62254349D-04\r\n  1.60907849D-03  9.42669634D-04  9.42669634D-04  4.15252656D-01  7.62254349D-04\r\n  1.90450845D-03  1.45008741D-03  1.90450845D-03  1.90450845D-03  1.90450845D-03\r\n  1.90450845D-03  1.90450845D-03  1.90450845D-03  1.90450845D-03  1.41738704D-03\r\n  1.90450845D-03  1.90450845D-03  1.90450845D-03  1.00000000D+00  1.50854530D-05\r\n  1.50854530D-05  1.50854530D-05  1.50854530D-05  1.50854530D-05  3.76913194D-05\r\n  1.50854530D-05  4.46761514D-05  2.14008123D-05  2.41010202D-05  1.50854530D-05\r\n  1.50854530D-05  4.46761514D-05  3.18445891D-05  2.86980667D-05  3.76913194D-05\r\n  1.50854530D-05  2.86980667D-05  2.86980667D-05  2.86980667D-05  3.76913194D-05\r\n  3.76913194D-05  2.86980667D-05  3.76913194D-05  3.76913194D-05  2.86980667D-05\r\n  3.76913194D-05  3.76913194D-05  3.76913194D-05  2.86980667D-05  3.76913194D-05\r\n  4.46761514D-05  2.86980667D-05  2.41010202D-05  1.50854530D-05  1.50854530D-05\r\n  3.18445891D-05  1.86559755D-05  1.86559755D-05  2.86980667D-05  2.17534930D-01\r\n  3.76913194D-05  2.86980667D-05  3.76913194D-05  3.76913194D-05  3.76913194D-05\r\n  3.76913194D-05  3.76913194D-05  3.76913194D-05  3.76913194D-05  2.80509066D-05\r\n  3.76913194D-05  3.76913194D-05  3.76913194D-05  1.00000000D+00  1.33195089D-03\r\n  1.33195089D-03  1.33195089D-03  1.33195089D-03  1.33195089D-03  3.32790706D-03\r\n  1.33195089D-03  3.94462375D-03  1.88955734D-03  2.12796894D-03  1.33195089D-03\r\n  1.33195089D-03  3.94462375D-03  2.81167752D-03  2.53385911D-03  3.32790706D-03\r\n  1.33195089D-03  2.53385911D-03  2.53385911D-03  2.53385911D-03  3.32790706D-03\r\n  3.32790706D-03  2.53385911D-03  3.32790706D-03  3.32790706D-03  2.53385911D-03\r\n  3.32790706D-03  3.32790706D-03  3.32790706D-03  2.53385911D-03  3.32790706D-03\r\n  3.94462375D-03  2.53385911D-03  2.12796894D-03  1.33195089D-03  1.33195089D-03\r\n  2.81167752D-03  1.64720556D-03  1.64720556D-03  2.53385911D-03  1.33195089D-03\r\n  5.46805799D-01  2.53385911D-03  3.32790706D-03  3.32790706D-03  3.32790706D-03\r\n  3.32790706D-03  3.32790706D-03  3.32790706D-03  3.32790706D-03  2.47671921D-03\r\n  3.32790706D-03  3.32790706D-03  3.32790706D-03  1.00000000D+00  1.33274659D-03\r\n  1.33274659D-03  1.33274659D-03  1.33274659D-03  1.33274659D-03  3.32989520D-03\r\n  1.33274659D-03  3.94698046D-03  1.89068634D-03  2.12924019D-03  1.33274659D-03\r\n  1.33274659D-03  3.94698046D-03  2.81335716D-03  2.53537297D-03  3.32989520D-03\r\n  1.33274659D-03  2.53537297D-03  2.53537297D-03  2.53537297D-03  3.32989520D-03\r\n  3.32989520D-03  2.53537297D-03  3.32989520D-03  3.32989520D-03  2.53537297D-03\r\n  3.32989520D-03  3.32989520D-03  3.32989520D-03  2.53537297D-03  3.32989520D-03\r\n  3.94698046D-03  2.53537297D-03  2.12924019D-03  1.33274659D-03  1.33274659D-03\r\n  2.81335716D-03  1.64818950D-03  1.64818950D-03  2.53537297D-03  1.33274659D-03\r\n  3.32989520D-03  4.16337937D-01  3.32989520D-03  3.32989520D-03  3.32989520D-03\r\n  3.32989520D-03  3.32989520D-03  3.32989520D-03  3.32989520D-03  2.47819885D-03\r\n  3.32989520D-03  3.32989520D-03  3.32989520D-03  1.00000000D+00  1.33454381D-03\r\n  1.33454381D-03  1.33454381D-03  1.33454381D-03  1.33454381D-03  3.33438558D-03\r\n  1.33454381D-03  3.95230297D-03  1.89323595D-03  2.13211169D-03  1.33454381D-03\r\n  1.33454381D-03  3.95230297D-03  2.81715114D-03  2.53879209D-03  3.33438558D-03\r\n  1.33454381D-03  2.53879209D-03  2.53879209D-03  2.53879209D-03  3.33438558D-03\r\n  3.33438558D-03  2.53879209D-03  3.33438558D-03  3.33438558D-03  2.53879209D-03\r\n  3.33438558D-03  3.33438558D-03  3.33438558D-03  2.53879209D-03  3.33438558D-03\r\n  3.95230297D-03  2.53879209D-03  2.13211169D-03  1.33454381D-03  1.33454381D-03\r\n  2.81715114D-03  1.65041210D-03  1.65041210D-03  2.53879209D-03  1.33454381D-03\r\n  3.33438558D-03  2.53879209D-03  5.46812296D-01  3.33438558D-03  3.33438558D-03\r\n  3.33438558D-03  3.33438558D-03  3.33438558D-03  3.33438558D-03  2.48154067D-03\r\n  3.33438558D-03  3.33438558D-03  3.33438558D-03  1.00000000D+00  5.43477893D-01\r\n  1.00000000D+00  5.43477893D-01  1.00000000D+00  1.15508148D-02  1.15508148D-02\r\n  1.15508148D-02  1.15508148D-02  1.15508148D-02  2.88599506D-02  1.15508148D-02\r\n  3.42081785D-02  1.63864344D-02  1.84539650D-02  1.15508148D-02  1.15508148D-02\r\n  3.42081785D-02  2.43831556D-02  2.19738856D-02  2.88599506D-02  1.15508148D-02\r\n  2.19738856D-02  2.19738856D-02  2.19738856D-02  2.88599506D-02  2.88599506D-02\r\n  2.19738856D-02  2.88599506D-02  2.88599506D-02  2.19738856D-02  2.88599506D-02\r\n  2.88599506D-02  2.88599506D-02  2.19738856D-02  2.88599506D-02  3.42081785D-02\r\n  2.19738856D-02  1.84539650D-02  1.15508148D-02  1.15508148D-02  2.43831556D-02\r\n  1.42847355D-02  1.42847355D-02  2.19738856D-02  1.15508148D-02  2.88599506D-02\r\n  2.19738856D-02  2.88599506D-02  2.88599506D-02  2.88599506D-02  5.72337866D-01\r\n  2.88599506D-02  2.88599506D-02  2.88599506D-02  2.14783605D-02  2.88599506D-02\r\n  2.88599506D-02  2.88599506D-02  1.00000000D+00  5.04734591D-02  5.04734591D-02\r\n  5.04734591D-02  5.04734591D-02  5.04734591D-02  1.26108989D-01  5.04734591D-02\r\n  1.49479091D-01  7.16036186D-02  8.06380734D-02  5.04734591D-02  5.04734591D-02\r\n  1.49479091D-01  1.06546797D-01  9.60190371D-02  1.26108989D-01  5.04734591D-02\r\n  9.60190371D-02  9.60190371D-02  9.60190371D-02  1.26108989D-01  1.26108989D-01\r\n  9.60190371D-02  1.26108989D-01  1.26108989D-01  9.60190371D-02  1.26108989D-01\r\n  1.26108989D-01  1.26108989D-01  9.60190371D-02  1.26108989D-01  1.49479091D-01\r\n  9.60190371D-02  8.06380734D-02  5.04734591D-02  5.04734591D-02  1.06546797D-01\r\n  6.24198392D-02  6.24198392D-02  9.60190371D-02  5.04734591D-02  1.26108989D-01\r\n  9.60190371D-02  1.26108989D-01  1.26108989D-01  1.26108989D-01  1.26108989D-01\r\n  6.69586897D-01  1.26108989D-01  1.26108989D-01  9.38537493D-02  1.26108989D-01\r\n  1.26108989D-01  1.26108989D-01  1.00000000D+00  5.43477893D-01  1.00000000D+00\r\n  2.13428419D-02  2.13428419D-02  2.13428419D-02  2.13428419D-02  2.13428419D-02\r\n  5.33255301D-02  2.13428419D-02  6.32076487D-02  3.02777849D-02  3.40980291D-02\r\n  2.13428419D-02  2.13428419D-02  6.32076487D-02  4.50536050D-02  4.06019129D-02\r\n  5.33255301D-02  2.13428419D-02  4.06019129D-02  4.06019129D-02  4.06019129D-02\r\n  5.33255301D-02  5.33255301D-02  4.06019129D-02  5.33255301D-02  5.33255301D-02\r\n  4.06019129D-02  5.33255301D-02  5.33255301D-02  5.33255301D-02  4.06019129D-02\r\n  5.33255301D-02  6.32076487D-02  4.06019129D-02  3.40980291D-02  2.13428419D-02\r\n  2.13428419D-02  4.50536050D-02  2.63944026D-02  2.63944026D-02  4.06019129D-02\r\n  2.13428419D-02  5.33255301D-02  4.06019129D-02  5.33255301D-02  5.33255301D-02\r\n  5.33255301D-02  5.33255301D-02  5.33255301D-02  5.33255301D-02  5.96803427D-01\r\n  3.96863185D-02  5.33255301D-02  5.33255301D-02  5.33255301D-02  1.00000000D+00\r\n  4.13307510D-02  4.13307510D-02  4.13307510D-02  4.13307510D-02  4.13307510D-02\r\n  1.03265740D-01  4.13307510D-02  1.22402608D-01  5.86334132D-02  6.60313815D-02\r\n  4.13307510D-02  4.13307510D-02  1.22402608D-01  8.72470215D-02  7.86262453D-02\r\n  1.03265740D-01  4.13307510D-02  7.86262453D-02  7.86262453D-02  7.86262453D-02\r\n  1.03265740D-01  1.03265740D-01  7.86262453D-02  1.03265740D-01  1.03265740D-01\r\n  7.86262453D-02  1.03265740D-01  1.03265740D-01  1.03265740D-01  7.86262453D-02\r\n  1.03265740D-01  1.22402608D-01  7.86262453D-02  6.60313815D-02  4.13307510D-02\r\n  4.13307510D-02  8.72470215D-02  5.11131771D-02  5.11131771D-02  7.86262453D-02\r\n  4.13307510D-02  1.03265740D-01  7.86262453D-02  1.03265740D-01  1.03265740D-01\r\n  1.03265740D-01  1.03265740D-01  1.03265740D-01  1.03265740D-01  1.03265740D-01\r\n  4.81324255D-01  1.03265740D-01  1.03265740D-01  1.03265740D-01  1.00000000D+00\r\n  5.43477893D-01  1.00000000D+00  5.43477893D-01  1.00000000D+00  5.43477893D-01\r\n  1.00000000D+00  1.00000000D+00 -3.80239636D-02  1.00000000D+00  1.00000000D+00\r\n -4.53596498D-04  1.00000000D+00  1.00000000D+00 -1.04409068D-04  1.00000000D+00\r\n  1.00000000D+00 -1.56986958D-03  1.00000000D+00  1.00000000D+00 -1.51058435D-02\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00 -6.02873974D-04\r\n  1.00000000D+00  1.00000000D+00 -2.16793314D-01  1.00000000D+00  1.00000000D+00\r\n -5.40687004D-03  1.00000000D+00  1.00000000D+00 -2.17261910D-02  1.00000000D+00\r\n  1.00000000D+00 -1.60277095D-02  1.00000000D+00  1.00000000D+00 -1.67879829D-04\r\n  1.00000000D+00  1.00000000D+00 -8.27674405D-04  1.00000000D+00  1.00000000D+00\r\n -8.62984210D-02  1.00000000D+00  1.00000000D+00 -3.36676676D-05  1.00000000D+00\r\n  1.00000000D+00 -1.34372637D-02  1.00000000D+00  1.00000000D+00 -1.20522391D-05\r\n  1.00000000D+00  1.00000000D+00 -1.49709766D-03  1.00000000D+00  1.00000000D+00\r\n -7.59160030D-05  1.00000000D+00  1.00000000D+00 -1.57006609D-04  1.00000000D+00\r\n  1.00000000D+00 -1.17640331D-04  1.00000000D+00  1.00000000D+00 -5.89511671D-07\r\n  1.00000000D+00  1.00000000D+00 -1.72268410D-05  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00 -5.83616551D-04  1.00000000D+00  1.00000000D+00\r\n -4.50151134D-03  1.00000000D+00  1.00000000D+00 -1.43061380D-03  1.00000000D+00\r\n  1.00000000D+00 -2.23359420D-05  1.00000000D+00  1.00000000D+00 -2.10586673D-04\r\n  1.00000000D+00  1.00000000D+00 -1.93471182D-03  1.00000000D+00  1.00000000D+00\r\n -1.85886130D-03  1.00000000D+00  1.00000000D+00 -1.56698748D-02  1.00000000D+00\r\n  1.00000000D+00 -1.45537336D-03  1.00000000D+00  1.00000000D+00 -1.11717703D-02\r\n  1.00000000D+00  1.00000000D+00 -4.73823305D-03  1.00000000D+00  1.00000000D+00\r\n -1.16330304D-03  1.00000000D+00  1.00000000D+00 -4.46149008D-03  1.00000000D+00\r\n  1.00000000D+00 -1.20798806D-02  1.00000000D+00  1.00000000D+00 -4.05453029D-05\r\n  1.00000000D+00  1.00000000D+00 -2.53228028D-03  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00 -7.26409417D-05  1.00000000D+00  1.00000000D+00\r\n -4.11937665D-03  1.00000000D+00  1.00000000D+00 -6.60947384D-03  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00 -2.41819128D-01  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00 -2.65067309D-01  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  2.50000000D+00  2.70000005D+00  2.50000000D+00\r\n  2.70000005D+00  2.90000010D+00  2.90000010D+00  2.90000010D+00  2.90000010D+00\r\n  1.66986734D-01 -5.71339190D-01  1.00000000D+00  2.40000010D+00  1.50000000D+00\r\n  2.40000010D+00  1.89999998D+00  1.60000002D+00  2.09999990D+00  1.79999995D+00\r\n  1.79999995D+00  1.79999995D+00  1.79999995D+00  1.79999995D+00  1.79999995D+00\r\n  1.89999998D+00  1.89999998D+00  1.79999995D+00  2.20000005D+00  2.59999990D+00\r\n  2.59999990D+00  2.20000005D+00  1.50000000D+00  3.00000000D+00  1.89999998D+00\r\n  2.40000010D+00  2.40000010D+00  2.40000010D+00  2.40000010D+00  1.89999998D+00\r\n  2.20000005D+00  1.70000005D+00  2.20000005D+00  2.90000010D+00  2.20000005D+00\r\n  2.59999990D+00  1.79999995D+00  1.19615935D-01 -4.09261674D-01  1.00000000D+00\r\n  1.70000005D+00  1.70000005D+00  1.70000005D+00  5.66986762D-03 -1.93992499D-02\r\n  1.00000000D+00  1.60000002D+00  1.60000002D+00  1.60000002D+00  1.50000000D+00\r\n  1.50000000D+00  1.60000002D+00  1.70000005D+00 -6.00000000D+01  1.00000000D+00\r\n -3.60000000D+01  1.00000000D+00 -6.00000000D+01  1.00000000D+00 -3.60000000D+01\r\n  1.00000000D+00 -4.10000000D+01  1.00000000D+00 -4.10000000D+01  1.00000000D+00\r\n -4.10000000D+01  1.00000000D+00 -4.10000000D+01  1.00000000D+00 -1.90000000D+01\r\n  1.00000000D+00 -3.30000000D+01  1.00000000D+00 -6.00000000D+01  1.00000000D+00\r\n -6.00000000D+01  1.00000000D+00 -3.20000000D+01  1.00000000D+00 -2.60000000D+01\r\n  1.00000000D+00 -6.00000000D+01  1.00000000D+00 -3.10000000D+01  1.00000000D+00\r\n -3.00000000D+01  1.00000000D+00 -3.10000000D+01  1.00000000D+00 -3.00000000D+01\r\n  1.00000000D+00 -4.10000000D+01  1.00000000D+00 -3.00000000D+01  1.00000000D+00\r\n -3.00000000D+01  1.00000000D+00 -3.00000000D+01  1.00000000D+00 -6.00000000D+01\r\n  1.00000000D+00 -2.80000000D+01  1.00000000D+00 -2.80000000D+01  1.00000000D+00\r\n -3.10000000D+01  1.00000000D+00 -2.30000000D+01  1.00000000D+00 -1.50000000D+01\r\n  1.00000000D+00 -4.50000000D+01  1.00000000D+00 -1.50000000D+01  1.00000000D+00\r\n -4.90000000D+01  1.00000000D+00 -2.60000000D+01  1.00000000D+00 -1.50000000D+01\r\n  1.00000000D+00 -6.00000000D+01  1.00000000D+00 -6.00000000D+01  1.00000000D+00\r\n -8.00000000D+00  1.00000000D+00 -2.50000000D+01  1.00000000D+00 -9.00000000D+00\r\n  1.00000000D+00 -3.10000000D+01  1.00000000D+00 -2.10000000D+01  1.00000000D+00\r\n -3.00000000D+01  1.00000000D+00 -8.00000000D+00  1.00000000D+00 -8.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00 -8.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00  1.00000000D+00  1.00000000D+00  1.36076880D+07\r\n  1.00000000D+00 -1.52668730D+07  1.00000000D+02  1.00000000D+00  1.00000000D+00\r\n -1.00000000D+00  1.00000000D+00  1.00000000D+00 -4.95945245D-01 -4.95945245D-01\r\n -4.95945245D-01 -4.95945245D-01 -4.95945245D-01 -1.23912954D+00 -4.95945245D-01\r\n -1.46876097D+00 -7.03567266D-01 -7.92338610D-01 -4.95945245D-01 -4.95945245D-01\r\n -1.46876097D+00 -1.04691410D+00 -9.43469822D-01 -1.23912954D+00 -4.95945245D-01\r\n -9.43469822D-01 -9.43469822D-01 -9.43469822D-01 -1.23912954D+00 -1.23912954D+00\r\n -9.43469822D-01 -1.23912954D+00 -1.23912954D+00 -9.43469822D-01 -1.23912954D+00\r\n -1.23912954D+00 -1.23912954D+00 -9.43469822D-01 -1.23912954D+00 -1.46876097D+00\r\n -9.43469822D-01 -7.92338610D-01 -4.95945245D-01 -4.95945245D-01 -1.04691410D+00\r\n -6.13328755D-01 -6.13328755D-01 -9.43469822D-01 -4.95945245D-01 -1.23912954D+00\r\n -9.43469822D-01 -1.23912954D+00 -1.23912954D+00 -1.23912954D+00 -1.23912954D+00\r\n -1.23912954D+00 -1.23912954D+00 -1.23912954D+00 -9.22194004D-01 -1.23912954D+00\r\n -1.23912954D+00 -1.23912954D+00 -1.00000000D+00 -2.92272508D-01 -1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00                                                \r\n       1     109     110     111     112     113     114     115     116     117\r\n     118     119     120     121     122     123     124     125     126     127\r\n     128     129     130     131     132     133     134     135     136     137\r\n     138     139     140     141     142     143     144     145     146     147\r\n     148     149     150     151     152     153     154     155     156     157\r\n     158     159     160     161     162     163                                \r\n     720     721     722     723     724     725     726     727     728     729\r\n     730     731     732     733     734     735     736     737     738     739\r\n     740     741     742     743     744     745     746     747     748     749\r\n     750     751     752     753     754     755     756     757     758     759\r\n     760     761     762     763     764     765     766     767     768     769\r\n     770     771     772     773     774     775     776     777     778     779\r\n     780     781     782     783     784     785     786     787     788     789\r\n     790     791     792     793     794     795     796     797     798     799\r\n     800     801     802     803     804     805     806     807     808     809\r\n     810     811     812     813     814     815     816     817     818     819\r\n     820     821     822     823     824     825     826     827     720     721\r\n     722     723     724     725     726     727     728     729     730     731\r\n     732     733     734     735     736     737     738     739     740     741\r\n     742     743     744     745     746     747     748     749     750     751\r\n     752     753     754     755     756     757     758     759     760     761\r\n     762     763     764     765     766     767     768     769     770     771\r\n     772     773                                                                \r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00 -1.00000000D+00\r\n -1.00000000D+00 -1.00000000D+00 -1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00  1.00000000D+00\r\n  1.00000000D+00  1.00000000D+00                                                \r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/bfp/bfp_LUSOL/LUSOL/bfile3.txt",
    "content": "       -0.187248E+05\n        0.112479E+05\n        0.132356E+05\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/bfp/bfp_LUSOL/LUSOL/hbio.c",
    "content": "\n/*                    Harwell-Boeing File I/O in C\n                                V. 1.0\n\n           National Institute of Standards and Technology, MD.\n                             K.A. Remington\n\n++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n                                NOTICE\n\n Permission to use, copy, modify, and distribute this software and\n its documentation for any purpose and without fee is hereby granted\n provided that the above copyright notice appear in all copies and\n that both the copyright notice and this permission notice appear in\n supporting documentation.\n\n Neither the Author nor the Institution (National Institute of Standards\n and Technology) make any representations about the suitability of this\n software for any purpose. This software is provided \"as is\" without\n expressed or implied warranty.\n++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n\n                         ---------------------\n                         INTERFACE DESCRIPTION\n                         ---------------------\n  ---------------\n  QUERY FUNCTIONS\n  ---------------\n\n  FUNCTION:\n\n  int readHB_info(const char *filename, int *M, int *N, int *nz,\n  char **Type, int *Nrhs)\n\n  DESCRIPTION:\n\n  The readHB_info function opens and reads the header information from\n  the specified Harwell-Boeing file, and reports back the number of rows\n  and columns in the stored matrix (M and N), the number of nonzeros in\n  the matrix (nz), the 3-character matrix type(Type), and the number of\n  right-hand-sides stored along with the matrix (Nrhs).  This function\n  is designed to retrieve basic size information which can be used to\n  allocate arrays.\n\n  FUNCTION:\n\n  int  readHB_header(FILE* in_file, char* Title, char* Key, char* Type,\n                    int* Nrow, int* Ncol, int* Nnzero, int* Nrhs, int* Nrhsix, \n                    char* Ptrfmt, char* Indfmt, char* Valfmt, char* Rhsfmt,\n                    int* Ptrcrd, int* Indcrd, int* Valcrd, int* Rhscrd,\n                    char *Rhstype)\n\n  DESCRIPTION:\n\n  More detailed than the readHB_info function, readHB_header() reads from\n  the specified Harwell-Boeing file all of the header information.\n\n\n  ------------------------------\n  DOUBLE PRECISION I/O FUNCTIONS\n  ------------------------------\n  FUNCTION:\n\n  int readHB_newmat_double(const char *filename, int *M, int *N, *int nz,\n  int **colptr, int **rowind,  double**val)\n\n  int readHB_mat_double(const char *filename, int *colptr, int *rowind,\n  double*val)\n\n\n  DESCRIPTION:\n\n  This function opens and reads the specified file, interpreting its\n  contents as a sparse matrix stored in the Harwell/Boeing standard\n  format.  (See readHB_aux_double to read auxillary vectors.)\n        -- Values are interpreted as double precision numbers. --\n\n  The \"mat\" function uses _pre-allocated_ vectors to hold the index and\n  nonzero value information.\n\n  The \"newmat\" function allocates vectors to hold the index and nonzero\n  value information, and returns pointers to these vectors along with\n  matrix dimension and number of nonzeros.\n\n  FUNCTION:\n\n  int readHB_aux_double(const char* filename, const char AuxType, double b[])\n\n  int readHB_newaux_double(const char* filename, const char AuxType, double** b)\n\n  DESCRIPTION:\n\n  This function opens and reads from the specified file auxillary vector(s).\n  The char argument Auxtype determines which type of auxillary vector(s)\n  will be read (if present in the file).\n\n                  AuxType = 'F'   right-hand-side\n                  AuxType = 'G'   initial estimate (Guess)\n                  AuxType = 'X'   eXact solution\n\n  If Nrhs > 1, all of the Nrhs vectors of the given type are read and\n  stored in column-major order in the vector b.\n\n  The \"newaux\" function allocates a vector to hold the values retrieved.\n  The \"mat\" function uses a _pre-allocated_ vector to hold the values.\n\n  FUNCTION:\n\n  int writeHB_mat_double(const char* filename, int M, int N,\n                        int nz, const int colptr[], const int rowind[],\n                        const double val[], int Nrhs, const double rhs[],\n                        const double guess[], const double exact[],\n                        const char* Title, const char* Key, const char* Type,\n                        char* Ptrfmt, char* Indfmt, char* Valfmt, char* Rhsfmt,\n                        const char* Rhstype)\n\n  DESCRIPTION:\n\n  The writeHB_mat_double function opens the named file and writes the specified\n  matrix and optional auxillary vector(s) to that file in Harwell-Boeing\n  format.  The format arguments (Ptrfmt,Indfmt,Valfmt, and Rhsfmt) are\n  character strings specifying \"Fortran-style\" output formats -- as they\n  would appear in a Harwell-Boeing file.  They are used to produce output\n  which is as close as possible to what would be produced by Fortran code,\n  but note that \"D\" and \"P\" edit descriptors are not supported.\n  If NULL, the following defaults will be used:\n                    Ptrfmt = Indfmt = \"(8I10)\"\n                    Valfmt = Rhsfmt = \"(4E20.13)\"\n\n  -----------------------\n  CHARACTER I/O FUNCTIONS\n  -----------------------\n  FUNCTION:\n\n  int readHB_mat_char(const char* filename, int colptr[], int rowind[],\n                                           char val[], char* Valfmt)\n  int readHB_newmat_char(const char* filename, int* M, int* N, int* nonzeros,\n                          int** colptr, int** rowind, char** val, char** Valfmt)\n\n  DESCRIPTION:\n\n  This function opens and reads the specified file, interpreting its\n  contents as a sparse matrix stored in the Harwell/Boeing standard\n  format.  (See readHB_aux_char to read auxillary vectors.)\n              -- Values are interpreted as char strings.     --\n  (Used to translate exact values from the file into a new storage format.)\n\n  The \"mat\" function uses _pre-allocated_ arrays to hold the index and\n  nonzero value information.\n\n  The \"newmat\" function allocates char arrays to hold the index\n  and nonzero value information, and returns pointers to these arrays\n  along with matrix dimension and number of nonzeros.\n\n  FUNCTION:\n\n  int readHB_aux_char(const char* filename, const char AuxType, char b[])\n  int readHB_newaux_char(const char* filename, const char AuxType, char** b,\n                         char** Rhsfmt)\n\n  DESCRIPTION:\n\n  This function opens and reads from the specified file auxillary vector(s).\n  The char argument Auxtype determines which type of auxillary vector(s)\n  will be read (if present in the file).\n\n                  AuxType = 'F'   right-hand-side\n                  AuxType = 'G'   initial estimate (Guess)\n                  AuxType = 'X'   eXact solution\n\n  If Nrhs > 1, all of the Nrhs vectors of the given type are read and\n  stored in column-major order in the vector b.\n\n  The \"newaux\" function allocates a character array to hold the values\n                retrieved.\n  The \"mat\" function uses a _pre-allocated_ array to hold the values.\n\n  FUNCTION:\n\n  int writeHB_mat_char(const char* filename, int M, int N,\n                        int nz, const int colptr[], const int rowind[],\n                        const char val[], int Nrhs, const char rhs[],\n                        const char guess[], const char exact[],\n                        const char* Title, const char* Key, const char* Type,\n                        char* Ptrfmt, char* Indfmt, char* Valfmt, char* Rhsfmt,\n                        const char* Rhstype)\n\n  DESCRIPTION:\n\n  The writeHB_mat_char function opens the named file and writes the specified\n  matrix and optional auxillary vector(s) to that file in Harwell-Boeing\n  format.  The format arguments (Ptrfmt,Indfmt,Valfmt, and Rhsfmt) are\n  character strings specifying \"Fortran-style\" output formats -- as they\n  would appear in a Harwell-Boeing file.  Valfmt and Rhsfmt must accurately\n  represent the character representation of the values stored in val[]\n  and rhs[].\n\n  If NULL, the following defaults will be used for the integer vectors:\n                    Ptrfmt = Indfmt = \"(8I10)\"\n                    Valfmt = Rhsfmt = \"(4E20.13)\"\n\n\n*/\n\n/*---------------------------------------------------------------------*/\n/* If zero-based indexing is desired, _SP_base should be set to 0      */\n/* This will cause indices read from H-B files to be decremented by 1  */\n/*             and indices written to H-B files to be incremented by 1 */\n/*            <<<  Standard usage is _SP_base = 1  >>>                 */\n#ifndef _SP_base\n#define _SP_base 1\n#endif\n/*---------------------------------------------------------------------*/\n\n#include \"hbio.h\"\n#include <string.h>\n#include <math.h>\n\nchar *substr(const char* S, const int pos, const int len);\nvoid upcase(char* S);\nvoid IOHBTerminate(char* message);\n\nint readHB_info(const char* filename, int* M, int* N, int* nz, char** Type,\n                                                      int* Nrhs)\n{\n/****************************************************************************/\n/*  The readHB_info function opens and reads the header information from    */\n/*  the specified Harwell-Boeing file, and reports back the number of rows  */\n/*  and columns in the stored matrix (M and N), the number of nonzeros in   */\n/*  the matrix (nz), and the number of right-hand-sides stored along with   */\n/*  the matrix (Nrhs).                                                      */\n/*                                                                          */\n/*  For a description of the Harwell Boeing standard, see:                  */\n/*            Duff, et al.,  ACM TOMS Vol.15, No.1, March 1989              */\n/*                                                                          */\n/*    ----------                                                            */\n/*    **CAVEAT**                                                            */\n/*    ----------                                                            */\n/*  **  If the input file does not adhere to the H/B format, the  **        */\n/*  **             results will be unpredictable.                 **        */\n/*                                                                          */\n/****************************************************************************/\n    FILE *in_file;\n    int Ptrcrd, Indcrd, Valcrd, Rhscrd;\n    int Nrow, Ncol, Nnzero, Nrhsix;\n    char *mat_type;\n    char Title[73], Key[9], Rhstype[4];\n    char Ptrfmt[17], Indfmt[17], Valfmt[21], Rhsfmt[21];\n\n    mat_type = (char *) malloc(4);\n    if ( mat_type == NULL ) IOHBTerminate(\"Insufficient memory for mat_typen\");\n\n    if ( (in_file = fopen( filename, \"r\")) == NULL ) {\n       fprintf(stderr,\"Error: Cannot open file: %s\\n\",filename);\n       return 0;\n    }\n\n    readHB_header(in_file, Title, Key, mat_type, &Nrow, &Ncol, &Nnzero, \n                  Nrhs,  &Nrhsix,\n                  Ptrfmt, Indfmt, Valfmt, Rhsfmt,\n                  &Ptrcrd, &Indcrd, &Valcrd, &Rhscrd, Rhstype);\n    fclose(in_file);\n    *Type = mat_type;\n    *(*Type+3) = (char) NULL;\n    *M    = Nrow;\n    *N    = Ncol;\n    *nz   = Nnzero;\n    if (Rhscrd == 0) {*Nrhs = 0;}\n\n/*  In verbose mode, print some of the header information:   */\n/*\n    if (verbose == 1)\n    {\n        printf(\"Reading from Harwell-Boeing file %s (verbose on)...\\n\",filename);\n        printf(\"  Title: %s\\n\",Title);\n        printf(\"  Key:   %s\\n\",Key);\n        printf(\"  The stored matrix is %i by %i with %i nonzeros.\\n\",\n                *M, *N, *nz );\n        printf(\"  %i right-hand--side(s) stored.\\n\",*Nrhs);\n    }\n*/\n\n    return 1;\n\n}\n\n\n\nint readHB_header(FILE* in_file, char* Title, char* Key, char* Type,\n                    int* Nrow, int* Ncol, int* Nnzero, int* Nrhs, int* Nrhsix,\n                    char* Ptrfmt, char* Indfmt, char* Valfmt, char* Rhsfmt,\n                    int* Ptrcrd, int* Indcrd, int* Valcrd, int* Rhscrd,\n                    char *Rhstype)\n{\n/*************************************************************************/\n/*  Read header information from the named H/B file...                   */\n/*************************************************************************/\n    int Totcrd,Neltvl;\n    char line[BUFSIZ];\n\n/*  First line:   */\n    fgets(line, BUFSIZ, in_file);\n    if ( sscanf(line,\"%*s\") < 0 )\n        IOHBTerminate(\"iohb.c: Null (or blank) first line of HB file.\\n\");\n    (void) sscanf(line, \"%72c%8[^\\n]\", Title, Key);\n    *(Key+8) = (char) NULL;\n    *(Title+72) = (char) NULL;\n\n/*  Second line:  */\n    fgets(line, BUFSIZ, in_file);\n    if ( sscanf(line,\"%*s\") < 0 )\n        IOHBTerminate(\"iohb.c: Null (or blank) second line of HB file.\\n\");\n    if ( sscanf(line,\"%i\",&Totcrd) != 1) Totcrd = 0;\n    if ( sscanf(line,\"%*i%i\",Ptrcrd) != 1) *Ptrcrd = 0;\n    if ( sscanf(line,\"%*i%*i%i\",Indcrd) != 1) *Indcrd = 0;\n    if ( sscanf(line,\"%*i%*i%*i%i\",Valcrd) != 1) *Valcrd = 0;\n    if ( sscanf(line,\"%*i%*i%*i%*i%i\",Rhscrd) != 1) *Rhscrd = 0;\n\n/*  Third line:   */\n    fgets(line, BUFSIZ, in_file);\n    if ( sscanf(line,\"%*s\") < 0 )\n        IOHBTerminate(\"iohb.c: Null (or blank) third line of HB file.\\n\");\n    if ( sscanf(line, \"%3c\", Type) != 1)\n        IOHBTerminate(\"iohb.c: Invalid Type info, line 3 of Harwell-Boeing file.\\n\");\n    upcase(Type);\n    if ( sscanf(line,\"%*3c%i\",Nrow) != 1) *Nrow = 0 ;\n    if ( sscanf(line,\"%*3c%*i%i\",Ncol) != 1) *Ncol = 0 ;\n    if ( sscanf(line,\"%*3c%*i%*i%i\",Nnzero) != 1) *Nnzero = 0 ;\n    if ( sscanf(line,\"%*3c%*i%*i%*i%i\",&Neltvl) != 1) Neltvl = 0 ;\n\n/*  Fourth line:  */\n    fgets(line, BUFSIZ, in_file);\n    if ( sscanf(line,\"%*s\") < 0 )\n        IOHBTerminate(\"iohb.c: Null (or blank) fourth line of HB file.\\n\");\n    if ( sscanf(line, \"%16c\",Ptrfmt) != 1)\n        IOHBTerminate(\"iohb.c: Invalid format info, line 4 of Harwell-Boeing file.\\n\");\n    if ( sscanf(line, \"%*16c%16c\",Indfmt) != 1)\n        IOHBTerminate(\"iohb.c: Invalid format info, line 4 of Harwell-Boeing file.\\n\");\n    if ( sscanf(line, \"%*16c%*16c%20c\",Valfmt) != 1)\n        IOHBTerminate(\"iohb.c: Invalid format info, line 4 of Harwell-Boeing file.\\n\");\n    sscanf(line, \"%*16c%*16c%*20c%20c\",Rhsfmt);\n    *(Ptrfmt+16) = (char) NULL;\n    *(Indfmt+16) = (char) NULL;\n    *(Valfmt+20) = (char) NULL;\n    *(Rhsfmt+20) = (char) NULL;\n\n/*  (Optional) Fifth line: */\n    if (*Rhscrd != 0 )\n    {\n       fgets(line, BUFSIZ, in_file);\n       if ( sscanf(line,\"%*s\") < 0 )\n           IOHBTerminate(\"iohb.c: Null (or blank) fifth line of HB file.\\n\");\n       if ( sscanf(line, \"%3c\", Rhstype) != 1)\n         IOHBTerminate(\"iohb.c: Invalid RHS type information, line 5 of Harwell-Boeing file.\\n\");\n       if ( sscanf(line, \"%*3c%i\", Nrhs) != 1) *Nrhs = 0;\n       if ( sscanf(line, \"%*3c%*i%i\", Nrhsix) != 1) *Nrhsix = 0;\n    }\n    return 1;\n}\n\n\nint readHB_mat_double(const char* filename, int colptr[], int rowind[],\n                                                                 double val[])\n{\n/****************************************************************************/\n/*  This function opens and reads the specified file, interpreting its      */\n/*  contents as a sparse matrix stored in the Harwell/Boeing standard       */\n/*  format and creating compressed column storage scheme vectors to hold    */\n/*  the index and nonzero value information.                                */\n/*                                                                          */\n/*    ----------                                                            */\n/*    **CAVEAT**                                                            */\n/*    ----------                                                            */\n/*  Parsing real formats from Fortran is tricky, and this file reader       */\n/*  does not claim to be foolproof.   It has been tested for cases when     */\n/*  the real values are printed consistently and evenly spaced on each      */\n/*  line, with Fixed (F), and Exponential (E or D) formats.                 */\n/*                                                                          */\n/*  **  If the input file does not adhere to the H/B format, the  **        */\n/*  **             results will be unpredictable.                 **        */\n/*                                                                          */\n/****************************************************************************/\n    FILE *in_file;\n    int i,j,ind,col,offset,count,last,Nrhs,Nrhsix;\n    int Ptrcrd, Indcrd, Valcrd, Rhscrd;\n    int Nrow, Ncol, Nnzero, Nentries;\n    int Ptrperline, Ptrwidth, Indperline, Indwidth;\n    int Valperline, Valwidth, Valprec;\n    int Valflag;           /* Indicates 'E','D', or 'F' float format */\n    char* ThisElement;\n    char Title[73], Key[9], Type[4], Rhstype[4];\n    char Ptrfmt[17], Indfmt[17], Valfmt[21], Rhsfmt[21];\n    char line[BUFSIZ];\n\n    if ( (in_file = fopen( filename, \"r\")) == NULL ) {\n       fprintf(stderr,\"Error: Cannot open file: %s\\n\",filename);\n       return 0;\n    }\n\n    readHB_header(in_file, Title, Key, Type, &Nrow, &Ncol, &Nnzero, \n                  &Nrhs, &Nrhsix,\n                  Ptrfmt, Indfmt, Valfmt, Rhsfmt,\n                  &Ptrcrd, &Indcrd, &Valcrd, &Rhscrd, Rhstype);\n\n/*  Parse the array input formats from Line 3 of HB file  */\n    ParseIfmt(Ptrfmt,&Ptrperline,&Ptrwidth);\n    ParseIfmt(Indfmt,&Indperline,&Indwidth);\n    if ( Type[0] != 'P' ) {          /* Skip if pattern only  */\n    ParseRfmt(Valfmt,&Valperline,&Valwidth,&Valprec,&Valflag);\n    }\n\n/*  Read column pointer array:   */\n\n    offset = 1-_SP_base;  /* if base 0 storage is declared (via macro definition), */\n                          /* then storage entries are offset by 1                  */\n\n    ThisElement = (char *) malloc(Ptrwidth+1);\n    if ( ThisElement == NULL ) IOHBTerminate(\"Insufficient memory for ThisElement.\");\n    *(ThisElement+Ptrwidth) = (char) NULL;\n    count=0;\n    for (i=0;i<Ptrcrd;i++)\n    {\n       fgets(line, BUFSIZ, in_file);\n       if ( sscanf(line,\"%*s\") < 0 )\n         IOHBTerminate(\"iohb.c: Null (or blank) line in pointer data region of HB file.\\n\");\n       col =  0;\n       for (ind = 0;ind<Ptrperline;ind++)\n       {\n          if (count > Ncol) break;\n          strncpy(ThisElement,line+col,Ptrwidth);\n  /* ThisElement = substr(line,col,Ptrwidth); */\n          colptr[count] = atoi(ThisElement)-offset;\n          count++; col += Ptrwidth;\n       }\n    }\n    free(ThisElement);\n\n/*  Read row index array:  */\n\n    ThisElement = (char *) malloc(Indwidth+1);\n    if ( ThisElement == NULL ) IOHBTerminate(\"Insufficient memory for ThisElement.\");\n    *(ThisElement+Indwidth) = (char) NULL;\n    count = 0;\n    for (i=0;i<Indcrd;i++)\n    {\n       fgets(line, BUFSIZ, in_file);\n       if ( sscanf(line,\"%*s\") < 0 )\n         IOHBTerminate(\"iohb.c: Null (or blank) line in index data region of HB file.\\n\");\n       col =  0;\n       for (ind = 0;ind<Indperline;ind++)\n       {\n          if (count == Nnzero) break;\n          strncpy(ThisElement,line+col,Indwidth);\n/*        ThisElement = substr(line,col,Indwidth); */\n          rowind[count] = atoi(ThisElement)-offset;\n          count++; col += Indwidth;\n       }\n    }\n    free(ThisElement);\n\n/*  Read array of values:  */\n\n    if ( Type[0] != 'P' ) {          /* Skip if pattern only  */\n\n       if ( Type[0] == 'C' ) Nentries = 2*Nnzero;\n           else Nentries = Nnzero;\n\n    ThisElement = (char *) malloc(Valwidth+1);\n    if ( ThisElement == NULL )\n      IOHBTerminate(\"Insufficient memory for ThisElement.\");\n    *(ThisElement+Valwidth) = (char) NULL;\n    count = 0;\n    for (i=0;i<Valcrd;i++)\n    {\n       fgets(line, BUFSIZ, in_file);\n       if ( sscanf(line,\"%*s\") < 0 )\n         IOHBTerminate(\"iohb.c: Null (or blank) line in value data region of HB file.\\n\");\n       if (Valflag == 'D')  {\n          while( strchr(line,'D') ) *strchr(line,'D') = 'E';\n/*           *strchr(Valfmt,'D') = 'E'; */\n       }\n       col =  0;\n       for (ind = 0;ind<Valperline;ind++)\n       {\n          if (count == Nentries) break;\n          strncpy(ThisElement,line+col,Valwidth);\n          /*ThisElement = substr(line,col,Valwidth);*/\n          if ( Valflag != 'F' && strchr(ThisElement,'E') == NULL ) {\n             /* insert a char prefix for exp */\n             last = strlen(ThisElement);\n             for (j=last+1;j>=0;j--) {\n                ThisElement[j] = ThisElement[j-1];\n                if ( ThisElement[j] == '+' || ThisElement[j] == '-' ) {\n                   ThisElement[j-1] = Valflag;\n                   break;\n                }\n             }\n          }\n          val[count] = atof(ThisElement);\n          count++; col += Valwidth;\n       }\n    }\n    free(ThisElement);\n    }\n\n    fclose(in_file);\n    return 1;\n}\n\nint readHB_newmat_double(const char* filename, int* M, int* N, int* nonzeros,\n                         int** colptr, int** rowind, double** val)\n{\n  int Nrhs;\n        char *Type;\n\n  readHB_info(filename, M, N, nonzeros, &Type, &Nrhs);\n\n        *colptr = (int *)malloc((*N+1)*sizeof(int));\n        if ( *colptr == NULL ) IOHBTerminate(\"Insufficient memory for colptr.\\n\");\n        *rowind = (int *)malloc(*nonzeros*sizeof(int));\n        if ( *rowind == NULL ) IOHBTerminate(\"Insufficient memory for rowind.\\n\");\n        if ( Type[0] == 'C' ) {\n/*\n   fprintf(stderr, \"Warning: Reading complex data from HB file %s.\\n\",filename);\n   fprintf(stderr, \"         Real and imaginary parts will be interlaced in val[].\\n\");\n*/\n           /* Malloc enough space for real AND imaginary parts of val[] */\n           *val = (double *)malloc(*nonzeros*sizeof(double)*2);\n           if ( *val == NULL ) IOHBTerminate(\"Insufficient memory for val.\\n\");\n        } else {\n           if ( Type[0] != 'P' ) {\n             /* Malloc enough space for real array val[] */\n             *val = (double *)malloc(*nonzeros*sizeof(double));\n             if ( *val == NULL ) IOHBTerminate(\"Insufficient memory for val.\\n\");\n           }\n        }  /* No val[] space needed if pattern only */\n  return readHB_mat_double(filename, *colptr, *rowind, *val);\n\n}\n\nint readHB_aux_double(const char* filename, const char AuxType, double b[])\n{\n/****************************************************************************/\n/*  This function opens and reads the specified file, placing auxillary     */\n/*  vector(s) of the given type (if available) in b.                        */\n/*  Return value is the number of vectors successfully read.                */\n/*                                                                          */\n/*                AuxType = 'F'   full right-hand-side vector(s)            */\n/*                AuxType = 'G'   initial Guess vector(s)                   */\n/*                AuxType = 'X'   eXact solution vector(s)                  */\n/*                                                                          */\n/*    ----------                                                            */\n/*    **CAVEAT**                                                            */\n/*    ----------                                                            */\n/*  Parsing real formats from Fortran is tricky, and this file reader       */\n/*  does not claim to be foolproof.   It has been tested for cases when     */\n/*  the real values are printed consistently and evenly spaced on each      */\n/*  line, with Fixed (F), and Exponential (E or D) formats.                 */\n/*                                                                          */\n/*  **  If the input file does not adhere to the H/B format, the  **        */\n/*  **             results will be unpredictable.                 **        */\n/*                                                                          */\n/****************************************************************************/\n    FILE *in_file;\n    int i,j,n,maxcol,start,stride,col,last,linel;\n    int Ptrcrd, Indcrd, Valcrd, Rhscrd;\n    int Nrow, Ncol, Nnzero, Nentries;\n    int Nrhs, Nrhsix, nvecs, rhsi;\n    int Rhsperline, Rhswidth, Rhsprec;\n    int Rhsflag;\n    char *ThisElement;\n    char Title[73], Key[9], Type[4], Rhstype[4];\n    char Ptrfmt[17], Indfmt[17], Valfmt[21], Rhsfmt[21];\n    char line[BUFSIZ];\n\n    if ((in_file = fopen( filename, \"r\")) == NULL) {\n      fprintf(stderr,\"Error: Cannot open file: %s\\n\",filename);\n      return 0;\n    }\n\n    readHB_header(in_file, Title, Key, Type, &Nrow, &Ncol, &Nnzero, \n                  &Nrhs, &Nrhsix,\n                  Ptrfmt, Indfmt, Valfmt, Rhsfmt,\n                  &Ptrcrd, &Indcrd, &Valcrd, &Rhscrd, Rhstype);\n\n    if (Nrhs <= 0)\n    {\n      fprintf(stderr, \"Warn: Attempt to read auxillary vector(s) when none are present.\\n\");\n      return 0;\n    }\n    if (Rhstype[0] != 'F' )\n    {\n      fprintf(stderr,\"Warn: Attempt to read auxillary vector(s) which are not stored in Full form.\\n\");\n      fprintf(stderr,\"       Rhs must be specified as full. \\n\");\n      return 0;\n    }\n\n/* If reading complex data, allow for interleaved real and imaginary values. */\n    if ( Type[0] == 'C' ) {\n       Nentries = 2*Nrow;\n     } else {\n       Nentries = Nrow;\n    }\n\n    nvecs = 1;\n\n    if ( Rhstype[1] == 'G' ) nvecs++;\n    if ( Rhstype[2] == 'X' ) nvecs++;\n\n    if ( AuxType == 'G' && Rhstype[1] != 'G' ) {\n      fprintf(stderr, \"Warn: Attempt to read auxillary Guess vector(s) when none are present.\\n\");\n      return 0;\n    }\n    if ( AuxType == 'X' && Rhstype[2] != 'X' ) {\n      fprintf(stderr, \"Warn: Attempt to read auxillary eXact solution vector(s) when none are present.\\n\");\n      return 0;\n    }\n\n    ParseRfmt(Rhsfmt, &Rhsperline, &Rhswidth, &Rhsprec,&Rhsflag);\n    maxcol = Rhsperline*Rhswidth;\n\n/*  Lines to skip before starting to read RHS values... */\n    n = Ptrcrd + Indcrd + Valcrd;\n\n    for (i = 0; i < n; i++)\n      fgets(line, BUFSIZ, in_file);\n\n/*  start  - number of initial aux vector entries to skip   */\n/*           to reach first  vector requested               */\n/*  stride - number of aux vector entries to skip between   */\n/*           requested vectors                              */\n    if ( AuxType == 'F' ) start = 0;\n    else if ( AuxType == 'G' ) start = Nentries;\n    else start = (nvecs-1)*Nentries;\n    stride = (nvecs-1)*Nentries;\n\n    fgets(line, BUFSIZ, in_file);\n    linel= strchr(line,'\\n')-line;\n    col = 0;\n/*  Skip to initial offset */\n\n    for (i=0;i<start;i++) {\n       if ( col >=  ( maxcol<linel?maxcol:linel ) ) {\n           fgets(line, BUFSIZ, in_file);\n           linel= strchr(line,'\\n')-line;\n           col = 0;\n       }\n       col += Rhswidth;\n    }\n    if (Rhsflag == 'D')  {\n       while( strchr(line,'D') ) *strchr(line,'D') = 'E';\n    }\n\n/*  Read a vector of desired type, then skip to next */\n/*  repeating to fill Nrhs vectors                   */\n\n  ThisElement = (char *) malloc(Rhswidth+1);\n  if ( ThisElement == NULL ) IOHBTerminate(\"Insufficient memory for ThisElement.\");\n  *(ThisElement+Rhswidth) = (char) NULL;\n  for (rhsi=0;rhsi<Nrhs;rhsi++) {\n\n    for (i=0;i<Nentries;i++) {\n       if ( col >= ( maxcol<linel?maxcol:linel ) ) {\n           fgets(line, BUFSIZ, in_file);\n           linel= strchr(line,'\\n')-line;\n           if (Rhsflag == 'D')  {\n              while( strchr(line,'D') ) *strchr(line,'D') = 'E';\n           }\n           col = 0;\n       }\n       strncpy(ThisElement,line+col,Rhswidth);\n       /*ThisElement = substr(line, col, Rhswidth);*/\n          if ( Rhsflag != 'F' && strchr(ThisElement,'E') == NULL ) {\n             /* insert a char prefix for exp */\n             last = strlen(ThisElement);\n             for (j=last+1;j>=0;j--) {\n                ThisElement[j] = ThisElement[j-1];\n                if ( ThisElement[j] == '+' || ThisElement[j] == '-' ) {\n                   ThisElement[j-1] = Rhsflag;\n                   break;\n                }\n             }\n          }\n       b[i] = atof(ThisElement);\n       col += Rhswidth;\n    }\n\n/*  Skip any interleaved Guess/eXact vectors */\n\n    for (i=0;i<stride;i++) {\n       if ( col >= ( maxcol<linel?maxcol:linel ) ) {\n           fgets(line, BUFSIZ, in_file);\n           linel= strchr(line,'\\n')-line;\n           col = 0;\n       }\n       col += Rhswidth;\n    }\n\n  }\n  free(ThisElement);\n\n\n    fclose(in_file);\n    return Nrhs;\n}\n\nint readHB_newaux_double(const char* filename, const char AuxType, double** b)\n{\n        int Nrhs,M,N,nonzeros;\n        char *Type;\n\n  readHB_info(filename, &M, &N, &nonzeros, &Type, &Nrhs);\n        if ( Nrhs <= 0 ) {\n          fprintf(stderr,\"Warn: Requested read of aux vector(s) when none are present.\\n\");\n          return 0;\n        } else {\n          if ( Type[0] == 'C' ) {\n            fprintf(stderr, \"Warning: Reading complex aux vector(s) from HB file %s.\",filename);\n            fprintf(stderr, \"         Real and imaginary parts will be interlaced in b[].\");\n            *b = (double *)malloc(M*Nrhs*sizeof(double)*2);\n            if ( *b == NULL ) IOHBTerminate(\"Insufficient memory for rhs.\\n\");\n            return readHB_aux_double(filename, AuxType, *b);\n          } else {\n            *b = (double *)malloc(M*Nrhs*sizeof(double));\n            if ( *b == NULL ) IOHBTerminate(\"Insufficient memory for rhs.\\n\");\n      return readHB_aux_double(filename, AuxType, *b);\n          }\n        }\n}\n\nint writeHB_mat_double(const char* filename, int M, int N,\n                        int nz, const int colptr[], const int rowind[],\n                        const double val[], int Nrhs, const double rhs[],\n                        const double guess[], const double exact[],\n                        const char* Title, const char* Key, const char* Type,\n                        char* Ptrfmt, char* Indfmt, char* Valfmt, char* Rhsfmt,\n                        const char* Rhstype)\n{\n/****************************************************************************/\n/*  The writeHB function opens the named file and writes the specified      */\n/*  matrix and optional right-hand-side(s) to that file in Harwell-Boeing   */\n/*  format.                                                                 */\n/*                                                                          */\n/*  For a description of the Harwell Boeing standard, see:                  */\n/*            Duff, et al.,  ACM TOMS Vol.15, No.1, March 1989              */\n/*                                                                          */\n/****************************************************************************/\n    FILE *out_file;\n    int i,j,entry,offset,acount,linemod;\n    int totcrd, ptrcrd, indcrd, valcrd, rhscrd;\n    int nvalentries, nrhsentries;\n    int Ptrperline, Ptrwidth, Indperline, Indwidth;\n    int Rhsperline, Rhswidth, Rhsprec;\n    int Rhsflag;\n    int Valperline, Valwidth, Valprec;\n    int Valflag;           /* Indicates 'E','D', or 'F' float format */\n    char pformat[16],iformat[16],vformat[19],rformat[19];\n\n    if ( Type[0] == 'C' ) {\n         nvalentries = 2*nz;\n         nrhsentries = 2*M;\n    } else {\n         nvalentries = nz;\n         nrhsentries = M;\n    }\n\n    if ( filename != NULL ) {\n       if ( (out_file = fopen( filename, \"w\")) == NULL ) {\n         fprintf(stderr,\"Error: Cannot open file: %s\\n\",filename);\n         return 0;\n       }\n    } else out_file = stdout;\n\n    if ( Ptrfmt == NULL ) Ptrfmt = \"(8I10)\";\n    ParseIfmt(Ptrfmt,&Ptrperline,&Ptrwidth);\n    sprintf(pformat,\"%%%dd\",Ptrwidth);\n    ptrcrd = (N+1)/Ptrperline;\n    if ( (N+1)%Ptrperline != 0) ptrcrd++;\n\n    if ( Indfmt == NULL ) Indfmt =  Ptrfmt;\n    ParseIfmt(Indfmt,&Indperline,&Indwidth);\n    sprintf(iformat,\"%%%dd\",Indwidth);\n    indcrd = nz/Indperline;\n    if ( nz%Indperline != 0) indcrd++;\n\n    if ( Type[0] != 'P' ) {          /* Skip if pattern only  */\n      if ( Valfmt == NULL ) Valfmt = \"(4E20.13)\";\n      ParseRfmt(Valfmt,&Valperline,&Valwidth,&Valprec,&Valflag);\n      if (Valflag == 'D') *strchr(Valfmt,'D') = 'E';\n      if (Valflag == 'F')\n         sprintf(vformat,\"%% %d.%df\",Valwidth,Valprec);\n      else\n         sprintf(vformat,\"%% %d.%dE\",Valwidth,Valprec);\n      valcrd = nvalentries/Valperline;\n      if ( nvalentries%Valperline != 0) valcrd++;\n    } else valcrd = 0;\n\n    if ( Nrhs > 0 ) {\n       if ( Rhsfmt == NULL ) Rhsfmt = Valfmt;\n       ParseRfmt(Rhsfmt,&Rhsperline,&Rhswidth,&Rhsprec, &Rhsflag);\n       if (Rhsflag == 'F')\n          sprintf(rformat,\"%% %d.%df\",Rhswidth,Rhsprec);\n       else\n          sprintf(rformat,\"%% %d.%dE\",Rhswidth,Rhsprec);\n       if (Rhsflag == 'D') *strchr(Rhsfmt,'D') = 'E';\n       rhscrd = nrhsentries/Rhsperline;\n       if ( nrhsentries%Rhsperline != 0) rhscrd++;\n       if ( Rhstype[1] == 'G' ) rhscrd+=rhscrd;\n       if ( Rhstype[2] == 'X' ) rhscrd+=rhscrd;\n       rhscrd*=Nrhs;\n    } else rhscrd = 0;\n\n    totcrd = 4+ptrcrd+indcrd+valcrd+rhscrd;\n\n\n/*  Print header information:  */\n\n    fprintf(out_file,\"%-72s%-8s\\n%14d%14d%14d%14d%14d\\n\",Title, Key, totcrd,\n            ptrcrd, indcrd, valcrd, rhscrd);\n    fprintf(out_file,\"%3s%11s%14d%14d%14d\\n\",Type,\"          \", M, N, nz);\n    fprintf(out_file,\"%-16s%-16s%-20s\", Ptrfmt, Indfmt, Valfmt);\n    if ( Nrhs != 0 ) {\n/*     Print Rhsfmt on fourth line and                                    */\n/*           optional fifth header line for auxillary vector information: */\n       fprintf(out_file,\"%-20s\\n%-14s%d\\n\",Rhsfmt,Rhstype,Nrhs);\n    } else fprintf(out_file,\"\\n\");\n\n    offset = 1-_SP_base;  /* if base 0 storage is declared (via macro definition), */\n                          /* then storage entries are offset by 1                  */\n\n/*  Print column pointers:   */\n    for (i=0;i<N+1;i++)\n    {\n       entry = colptr[i]+offset;\n       fprintf(out_file,pformat,entry);\n       if ( (i+1)%Ptrperline == 0 ) fprintf(out_file,\"\\n\");\n    }\n\n   if ( (N+1) % Ptrperline != 0 ) fprintf(out_file,\"\\n\");\n\n/*  Print row indices:       */\n    for (i=0;i<nz;i++)\n    {\n       entry = rowind[i]+offset;\n       fprintf(out_file,iformat,entry);\n       if ( (i+1)%Indperline == 0 ) fprintf(out_file,\"\\n\");\n    }\n\n   if ( nz % Indperline != 0 ) fprintf(out_file,\"\\n\");\n\n/*  Print values:            */\n\n    if ( Type[0] != 'P' ) {          /* Skip if pattern only  */\n\n    for (i=0;i<nvalentries;i++)\n    {\n       fprintf(out_file,vformat,val[i]);\n       if ( (i+1)%Valperline == 0 ) fprintf(out_file,\"\\n\");\n    }\n\n    if ( nvalentries % Valperline != 0 ) fprintf(out_file,\"\\n\");\n\n/*  If available,  print right hand sides,\n           guess vectors and exact solution vectors:  */\n    acount = 1;\n    linemod = 0;\n    if ( Nrhs > 0 ) {\n       for (i=0;i<Nrhs;i++)\n       {\n          for ( j=0;j<nrhsentries;j++ ) {\n            fprintf(out_file,rformat,rhs[j]);\n            if ( acount++%Rhsperline == linemod ) fprintf(out_file,\"\\n\");\n          }\n          if ( acount%Rhsperline != linemod ) {\n            fprintf(out_file,\"\\n\");\n            linemod = (acount-1)%Rhsperline;\n          }\n          rhs += nrhsentries;\n          if ( Rhstype[1] == 'G' ) {\n            for ( j=0;j<nrhsentries;j++ ) {\n              fprintf(out_file,rformat,guess[j]);\n              if ( acount++%Rhsperline == linemod ) fprintf(out_file,\"\\n\");\n            }\n            if ( acount%Rhsperline != linemod ) {\n              fprintf(out_file,\"\\n\");\n              linemod = (acount-1)%Rhsperline;\n            }\n            guess += nrhsentries;\n          }\n          if ( Rhstype[2] == 'X' ) {\n            for ( j=0;j<nrhsentries;j++ ) {\n              fprintf(out_file,rformat,exact[j]);\n              if ( acount++%Rhsperline == linemod ) fprintf(out_file,\"\\n\");\n            }\n            if ( acount%Rhsperline != linemod ) {\n              fprintf(out_file,\"\\n\");\n              linemod = (acount-1)%Rhsperline;\n            }\n            exact += nrhsentries;\n          }\n       }\n    }\n\n    }\n\n    if ( fclose(out_file) != 0){\n      fprintf(stderr,\"Error closing file in writeHB_mat_double().\\n\");\n      return 0;\n    } else return 1;\n\n}\n\nint readHB_mat_char(const char* filename, int colptr[], int rowind[],\n                                           char val[], char* Valfmt)\n{\n/****************************************************************************/\n/*  This function opens and reads the specified file, interpreting its      */\n/*  contents as a sparse matrix stored in the Harwell/Boeing standard       */\n/*  format and creating compressed column storage scheme vectors to hold    */\n/*  the index and nonzero value information.                                */\n/*                                                                          */\n/*    ----------                                                            */\n/*    **CAVEAT**                                                            */\n/*    ----------                                                            */\n/*  Parsing real formats from Fortran is tricky, and this file reader       */\n/*  does not claim to be foolproof.   It has been tested for cases when     */\n/*  the real values are printed consistently and evenly spaced on each      */\n/*  line, with Fixed (F), and Exponential (E or D) formats.                 */\n/*                                                                          */\n/*  **  If the input file does not adhere to the H/B format, the  **        */\n/*  **             results will be unpredictable.                 **        */\n/*                                                                          */\n/****************************************************************************/\n    FILE *in_file;\n    int i,j,ind,col,offset,count,last;\n    int Nrow,Ncol,Nnzero,Nentries,Nrhs,Nrhsix;\n    int Ptrcrd, Indcrd, Valcrd, Rhscrd;\n    int Ptrperline, Ptrwidth, Indperline, Indwidth;\n    int Valperline, Valwidth, Valprec;\n    int Valflag;           /* Indicates 'E','D', or 'F' float format */\n    char* ThisElement;\n    char line[BUFSIZ];\n    char Title[73], Key[9], Type[4], Rhstype[4];\n    char Ptrfmt[17], Indfmt[17], Rhsfmt[21];\n\n    if ( (in_file = fopen( filename, \"r\")) == NULL ) {\n       fprintf(stderr,\"Error: Cannot open file: %s\\n\",filename);\n       return 0;\n    }\n\n    readHB_header(in_file, Title, Key, Type, &Nrow, &Ncol, &Nnzero, \n                  &Nrhs, &Nrhsix,\n                  Ptrfmt, Indfmt, Valfmt, Rhsfmt,\n                  &Ptrcrd, &Indcrd, &Valcrd, &Rhscrd, Rhstype);\n\n/*  Parse the array input formats from Line 3 of HB file  */\n    ParseIfmt(Ptrfmt,&Ptrperline,&Ptrwidth);\n    ParseIfmt(Indfmt,&Indperline,&Indwidth);\n    if ( Type[0] != 'P' ) {          /* Skip if pattern only  */\n       ParseRfmt(Valfmt,&Valperline,&Valwidth,&Valprec,&Valflag);\n       if (Valflag == 'D') {\n          *strchr(Valfmt,'D') = 'E';\n       }\n    }\n\n/*  Read column pointer array:   */\n\n    offset = 1-_SP_base;  /* if base 0 storage is declared (via macro definition), */\n                          /* then storage entries are offset by 1                  */\n\n    ThisElement = (char *) malloc(Ptrwidth+1);\n    if ( ThisElement == NULL ) IOHBTerminate(\"Insufficient memory for ThisElement.\");\n    *(ThisElement+Ptrwidth) = (char) NULL;\n    count=0;\n    for (i=0;i<Ptrcrd;i++)\n    {\n       fgets(line, BUFSIZ, in_file);\n       if ( sscanf(line,\"%*s\") < 0 )\n         IOHBTerminate(\"iohb.c: Null (or blank) line in pointer data region of HB file.\\n\");\n       col =  0;\n       for (ind = 0;ind<Ptrperline;ind++)\n       {\n          if (count > Ncol) break;\n          strncpy(ThisElement,line+col,Ptrwidth);\n          /*ThisElement = substr(line,col,Ptrwidth);*/\n          colptr[count] = atoi(ThisElement)-offset;\n          count++; col += Ptrwidth;\n       }\n    }\n    free(ThisElement);\n\n/*  Read row index array:  */\n\n    ThisElement = (char *) malloc(Indwidth+1);\n    if ( ThisElement == NULL ) IOHBTerminate(\"Insufficient memory for ThisElement.\");\n    *(ThisElement+Indwidth) = (char) NULL;\n    count = 0;\n    for (i=0;i<Indcrd;i++)\n    {\n       fgets(line, BUFSIZ, in_file);\n       if ( sscanf(line,\"%*s\") < 0 )\n         IOHBTerminate(\"iohb.c: Null (or blank) line in index data region of HB file.\\n\");\n       col =  0;\n       for (ind = 0;ind<Indperline;ind++)\n       {\n          if (count == Nnzero) break;\n          strncpy(ThisElement,line+col,Indwidth);\n          /*ThisElement = substr(line,col,Indwidth);*/\n          rowind[count] = atoi(ThisElement)-offset;\n          count++; col += Indwidth;\n       }\n    }\n    free(ThisElement);\n\n/*  Read array of values:  AS CHARACTERS*/\n\n    if ( Type[0] != 'P' ) {          /* Skip if pattern only  */\n\n       if ( Type[0] == 'C' ) Nentries = 2*Nnzero;\n           else Nentries = Nnzero;\n\n    ThisElement = (char *) malloc(Valwidth+1);\n    if ( ThisElement == NULL ) IOHBTerminate(\"Insufficient memory for ThisElement.\");\n    *(ThisElement+Valwidth) = (char) NULL;\n    count = 0;\n    for (i=0;i<Valcrd;i++)\n    {\n       fgets(line, BUFSIZ, in_file);\n       if ( sscanf(line,\"%*s\") < 0 )\n         IOHBTerminate(\"iohb.c: Null (or blank) line in value data region of HB file.\\n\");\n       if (Valflag == 'D') {\n          while( strchr(line,'D') ) *strchr(line,'D') = 'E';\n       }\n       col =  0;\n       for (ind = 0;ind<Valperline;ind++)\n       {\n          if (count == Nentries) break;\n          ThisElement = &val[count*Valwidth];\n          strncpy(ThisElement,line+col,Valwidth);\n          /*strncpy(ThisElement,substr(line,col,Valwidth),Valwidth);*/\n          if ( Valflag != 'F' && strchr(ThisElement,'E') == NULL ) {\n             /* insert a char prefix for exp */\n             last = strlen(ThisElement);\n             for (j=last+1;j>=0;j--) {\n                ThisElement[j] = ThisElement[j-1];\n                if ( ThisElement[j] == '+' || ThisElement[j] == '-' ) {\n                   ThisElement[j-1] = Valflag;\n                   break;\n                }\n             }\n          }\n          count++; col += Valwidth;\n       }\n    }\n    }\n\n    return 1;\n}\n\nint readHB_newmat_char(const char* filename, int* M, int* N, int* nonzeros, int** colptr,\n                          int** rowind, char** val, char** Valfmt)\n{\n    FILE *in_file;\n    int Nrhs,Nrhsix;\n    int Ptrcrd, Indcrd, Valcrd, Rhscrd;\n    int Valperline, Valwidth, Valprec;\n    int Valflag;           /* Indicates 'E','D', or 'F' float format */\n    char Title[73], Key[9], Type[4], Rhstype[4];\n    char Ptrfmt[17], Indfmt[17], Rhsfmt[21];\n\n    if ((in_file = fopen( filename, \"r\")) == NULL) {\n      fprintf(stderr,\"Error: Cannot open file: %s\\n\",filename);\n      return 0;\n     }\n\n    *Valfmt = (char *)malloc(21*sizeof(char));\n    if ( *Valfmt == NULL ) IOHBTerminate(\"Insufficient memory for Valfmt.\");\n    readHB_header(in_file, Title, Key, Type, M, N, nonzeros, \n                  &Nrhs, &Nrhsix,\n                  Ptrfmt, Indfmt, (*Valfmt), Rhsfmt,\n                  &Ptrcrd, &Indcrd, &Valcrd, &Rhscrd, Rhstype);\n    fclose(in_file);\n    ParseRfmt(*Valfmt,&Valperline,&Valwidth,&Valprec,&Valflag);\n\n        *colptr = (int *)malloc((*N+1)*sizeof(int));\n        if ( *colptr == NULL ) IOHBTerminate(\"Insufficient memory for colptr.\\n\");\n        *rowind = (int *)malloc(*nonzeros*sizeof(int));\n        if ( *rowind == NULL ) IOHBTerminate(\"Insufficient memory for rowind.\\n\");\n        if ( Type[0] == 'C' ) {\n/*\n   fprintf(stderr, \"Warning: Reading complex data from HB file %s.\\n\",filename);\n   fprintf(stderr, \"         Real and imaginary parts will be interlaced in val[].\\n\");\n*/\n           /* Malloc enough space for real AND imaginary parts of val[] */\n           *val = (char *)malloc(*nonzeros*Valwidth*sizeof(char)*2);\n           if ( *val == NULL ) IOHBTerminate(\"Insufficient memory for val.\\n\");\n        } else {\n           if ( Type[0] != 'P' ) {\n             /* Malloc enough space for real array val[] */\n             *val = (char *)malloc(*nonzeros*Valwidth*sizeof(char));\n             if ( *val == NULL ) IOHBTerminate(\"Insufficient memory for val.\\n\");\n           }\n        }  /* No val[] space needed if pattern only */\n  return readHB_mat_char(filename, *colptr, *rowind, *val, *Valfmt);\n\n}\n\nint readHB_aux_char(const char* filename, const char AuxType, char b[])\n{\n/****************************************************************************/\n/*  This function opens and reads the specified file, placing auxilary      */\n/*  vector(s) of the given type (if available) in b :                       */\n/*  Return value is the number of vectors successfully read.                */\n/*                                                                          */\n/*                AuxType = 'F'   full right-hand-side vector(s)            */\n/*                AuxType = 'G'   initial Guess vector(s)                   */\n/*                AuxType = 'X'   eXact solution vector(s)                  */\n/*                                                                          */\n/*    ----------                                                            */\n/*    **CAVEAT**                                                            */\n/*    ----------                                                            */\n/*  Parsing real formats from Fortran is tricky, and this file reader       */\n/*  does not claim to be foolproof.   It has been tested for cases when     */\n/*  the real values are printed consistently and evenly spaced on each      */\n/*  line, with Fixed (F), and Exponential (E or D) formats.                 */\n/*                                                                          */\n/*  **  If the input file does not adhere to the H/B format, the  **        */\n/*  **             results will be unpredictable.                 **        */\n/*                                                                          */\n/****************************************************************************/\n    FILE *in_file;\n    int i,j,n,maxcol,start,stride,col,last,linel,nvecs,rhsi;\n    int Nrow, Ncol, Nnzero, Nentries,Nrhs,Nrhsix;\n    int Ptrcrd, Indcrd, Valcrd, Rhscrd;\n    int Rhsperline, Rhswidth, Rhsprec;\n    int Rhsflag;\n    char Title[73], Key[9], Type[4], Rhstype[4];\n    char Ptrfmt[17], Indfmt[17], Valfmt[21], Rhsfmt[21];\n    char line[BUFSIZ];\n    char *ThisElement;\n\n    if ((in_file = fopen( filename, \"r\")) == NULL) {\n      fprintf(stderr,\"Error: Cannot open file: %s\\n\",filename);\n      return 0;\n     }\n\n    readHB_header(in_file, Title, Key, Type, &Nrow, &Ncol, &Nnzero, \n                  &Nrhs, &Nrhsix,\n                  Ptrfmt, Indfmt, Valfmt, Rhsfmt,\n                  &Ptrcrd, &Indcrd, &Valcrd, &Rhscrd, Rhstype);\n\n    if (Nrhs <= 0)\n    {\n      fprintf(stderr, \"Warn: Attempt to read auxillary vector(s) when none are present.\\n\");\n      return 0;\n    }\n    if (Rhstype[0] != 'F' )\n    {\n      fprintf(stderr,\"Warn: Attempt to read auxillary vector(s) which are not stored in Full form.\\n\");\n      fprintf(stderr,\"       Rhs must be specified as full. \\n\");\n      return 0;\n    }\n\n/* If reading complex data, allow for interleaved real and imaginary values. */\n    if ( Type[0] == 'C' ) {\n       Nentries = 2*Nrow;\n     } else {\n       Nentries = Nrow;\n    }\n\n    nvecs = 1;\n\n    if ( Rhstype[1] == 'G' ) nvecs++;\n    if ( Rhstype[2] == 'X' ) nvecs++;\n\n    if ( AuxType == 'G' && Rhstype[1] != 'G' ) {\n      fprintf(stderr, \"Warn: Attempt to read auxillary Guess vector(s) when none are present.\\n\");\n      return 0;\n    }\n    if ( AuxType == 'X' && Rhstype[2] != 'X' ) {\n      fprintf(stderr, \"Warn: Attempt to read auxillary eXact solution vector(s) when none are present.\\n\");\n      return 0;\n    }\n\n    ParseRfmt(Rhsfmt, &Rhsperline, &Rhswidth, &Rhsprec,&Rhsflag);\n    maxcol = Rhsperline*Rhswidth;\n\n/*  Lines to skip before starting to read RHS values... */\n    n = Ptrcrd + Indcrd + Valcrd;\n\n    for (i = 0; i < n; i++)\n      fgets(line, BUFSIZ, in_file);\n\n/*  start  - number of initial aux vector entries to skip   */\n/*           to reach first  vector requested               */\n/*  stride - number of aux vector entries to skip between   */\n/*           requested vectors                              */\n    if ( AuxType == 'F' ) start = 0;\n    else if ( AuxType == 'G' ) start = Nentries;\n    else start = (nvecs-1)*Nentries;\n    stride = (nvecs-1)*Nentries;\n\n    fgets(line, BUFSIZ, in_file);\n    linel= strchr(line,'\\n')-line;\n    if ( sscanf(line,\"%*s\") < 0 )\n       IOHBTerminate(\"iohb.c: Null (or blank) line in auxillary vector data region of HB file.\\n\");\n    col = 0;\n/*  Skip to initial offset */\n\n    for (i=0;i<start;i++) {\n       col += Rhswidth;\n       if ( col >= ( maxcol<linel?maxcol:linel ) ) {\n           fgets(line, BUFSIZ, in_file);\n           linel= strchr(line,'\\n')-line;\n       if ( sscanf(line,\"%*s\") < 0 )\n       IOHBTerminate(\"iohb.c: Null (or blank) line in auxillary vector data region of HB file.\\n\");\n           col = 0;\n       }\n    }\n\n    if (Rhsflag == 'D')  {\n      while( strchr(line,'D') ) *strchr(line,'D') = 'E';\n    }\n/*  Read a vector of desired type, then skip to next */\n/*  repeating to fill Nrhs vectors                   */\n\n  for (rhsi=0;rhsi<Nrhs;rhsi++) {\n\n    for (i=0;i<Nentries;i++) {\n       if ( col >= ( maxcol<linel?maxcol:linel ) ) {\n           fgets(line, BUFSIZ, in_file);\n           linel= strchr(line,'\\n')-line;\n       if ( sscanf(line,\"%*s\") < 0 )\n       IOHBTerminate(\"iohb.c: Null (or blank) line in auxillary vector data region of HB file.\\n\");\n           if (Rhsflag == 'D')  {\n              while( strchr(line,'D') ) *strchr(line,'D') = 'E';\n           }\n           col = 0;\n       }\n       ThisElement = &b[i*Rhswidth];\n       strncpy(ThisElement,line+col,Rhswidth);\n          if ( Rhsflag != 'F' && strchr(ThisElement,'E') == NULL ) {\n             /* insert a char prefix for exp */\n             last = strlen(ThisElement);\n             for (j=last+1;j>=0;j--) {\n                ThisElement[j] = ThisElement[j-1];\n                if ( ThisElement[j] == '+' || ThisElement[j] == '-' ) {\n                   ThisElement[j-1] = Rhsflag;\n                   break;\n                }\n             }\n          }\n       col += Rhswidth;\n    }\n    b+=Nentries*Rhswidth;\n\n/*  Skip any interleaved Guess/eXact vectors */\n\n    for (i=0;i<stride;i++) {\n       col += Rhswidth;\n       if ( col >= ( maxcol<linel?maxcol:linel ) ) {\n           fgets(line, BUFSIZ, in_file);\n           linel= strchr(line,'\\n')-line;\n       if ( sscanf(line,\"%*s\") < 0 )\n       IOHBTerminate(\"iohb.c: Null (or blank) line in auxillary vector data region of HB file.\\n\");\n           col = 0;\n       }\n    }\n\n  }\n\n\n    fclose(in_file);\n    return Nrhs;\n}\n\nint readHB_newaux_char(const char* filename, const char AuxType, char** b, char** Rhsfmt)\n{\n    FILE *in_file;\n    int Ptrcrd, Indcrd, Valcrd, Rhscrd;\n    int Nrow,Ncol,Nnzero,Nrhs,Nrhsix;\n    int Rhsperline, Rhswidth, Rhsprec;\n    int Rhsflag;\n    char Title[73], Key[9], Type[4], Rhstype[4];\n    char Ptrfmt[17], Indfmt[17], Valfmt[21];\n\n    if ((in_file = fopen( filename, \"r\")) == NULL) {\n      fprintf(stderr,\"Error: Cannot open file: %s\\n\",filename);\n      return 0;\n     }\n\n    *Rhsfmt = (char *)malloc(21*sizeof(char));\n    if ( *Rhsfmt == NULL ) IOHBTerminate(\"Insufficient memory for Rhsfmt.\");\n    readHB_header(in_file, Title, Key, Type, &Nrow, &Ncol, &Nnzero, \n                  &Nrhs, &Nrhsix,\n                  Ptrfmt, Indfmt, Valfmt, (*Rhsfmt),\n                  &Ptrcrd, &Indcrd, &Valcrd, &Rhscrd, Rhstype);\n     fclose(in_file);\n        if ( Nrhs == 0 ) {\n          fprintf(stderr,\"Warn: Requested read of aux vector(s) when none are present.\\n\");\n          return 0;\n        } else {\n          ParseRfmt(*Rhsfmt,&Rhsperline,&Rhswidth,&Rhsprec,&Rhsflag);\n          if ( Type[0] == 'C' ) {\n            fprintf(stderr, \"Warning: Reading complex aux vector(s) from HB file %s.\",filename);\n            fprintf(stderr, \"         Real and imaginary parts will be interlaced in b[].\");\n            *b = (char *)malloc(Nrow*Nrhs*Rhswidth*sizeof(char)*2);\n            if ( *b == NULL ) IOHBTerminate(\"Insufficient memory for rhs.\\n\");\n      return readHB_aux_char(filename, AuxType, *b);\n          } else {\n            *b = (char *)malloc(Nrow*Nrhs*Rhswidth*sizeof(char));\n            if ( *b == NULL ) IOHBTerminate(\"Insufficient memory for rhs.\\n\");\n      return readHB_aux_char(filename, AuxType, *b);\n          }\n        }\n}\n\nint writeHB_mat_char(const char* filename, int M, int N,\n                        int nz, const int colptr[], const int rowind[],\n                        const char val[], int Nrhs, const char rhs[],\n                        const char guess[], const char exact[],\n                        const char* Title, const char* Key, const char* Type,\n                        char* Ptrfmt, char* Indfmt, char* Valfmt, char* Rhsfmt,\n                        const char* Rhstype)\n{\n/****************************************************************************/\n/*  The writeHB function opens the named file and writes the specified      */\n/*  matrix and optional right-hand-side(s) to that file in Harwell-Boeing   */\n/*  format.                                                                 */\n/*                                                                          */\n/*  For a description of the Harwell Boeing standard, see:                  */\n/*            Duff, et al.,  ACM TOMS Vol.15, No.1, March 1989              */\n/*                                                                          */\n/****************************************************************************/\n    FILE *out_file;\n    int i,j,acount,linemod,entry,offset;\n    int totcrd, ptrcrd, indcrd, valcrd, rhscrd;\n    int nvalentries, nrhsentries;\n    int Ptrperline, Ptrwidth, Indperline, Indwidth;\n    int Rhsperline, Rhswidth, Rhsprec;\n    int Rhsflag;\n    int Valperline, Valwidth, Valprec;\n    int Valflag;           /* Indicates 'E','D', or 'F' float format */\n    char pformat[16],iformat[16],vformat[19],rformat[19];\n\n    if ( Type[0] == 'C' ) {\n         nvalentries = 2*nz;\n         nrhsentries = 2*M;\n    } else {\n         nvalentries = nz;\n         nrhsentries = M;\n    }\n\n    if ( filename != NULL ) {\n       if ( (out_file = fopen( filename, \"w\")) == NULL ) {\n         fprintf(stderr,\"Error: Cannot open file: %s\\n\",filename);\n         return 0;\n       }\n    } else out_file = stdout;\n\n    if ( Ptrfmt == NULL ) Ptrfmt = \"(8I10)\";\n    ParseIfmt(Ptrfmt,&Ptrperline,&Ptrwidth);\n    sprintf(pformat,\"%%%dd\",Ptrwidth);\n\n    if ( Indfmt == NULL ) Indfmt =  Ptrfmt;\n    ParseIfmt(Indfmt,&Indperline,&Indwidth);\n    sprintf(iformat,\"%%%dd\",Indwidth);\n\n    if ( Type[0] != 'P' ) {          /* Skip if pattern only  */\n      if ( Valfmt == NULL ) Valfmt = \"(4E20.13)\";\n      ParseRfmt(Valfmt,&Valperline,&Valwidth,&Valprec,&Valflag);\n      sprintf(vformat,\"%%%ds\",Valwidth);\n    }\n\n    ptrcrd = (N+1)/Ptrperline;\n    if ( (N+1)%Ptrperline != 0) ptrcrd++;\n\n    indcrd = nz/Indperline;\n    if ( nz%Indperline != 0) indcrd++;\n\n    valcrd = nvalentries/Valperline;\n    if ( nvalentries%Valperline != 0) valcrd++;\n\n    if ( Nrhs > 0 ) {\n       if ( Rhsfmt == NULL ) Rhsfmt = Valfmt;\n       ParseRfmt(Rhsfmt,&Rhsperline,&Rhswidth,&Rhsprec, &Rhsflag);\n       sprintf(rformat,\"%%%ds\",Rhswidth);\n       rhscrd = nrhsentries/Rhsperline;\n       if ( nrhsentries%Rhsperline != 0) rhscrd++;\n       if ( Rhstype[1] == 'G' ) rhscrd+=rhscrd;\n       if ( Rhstype[2] == 'X' ) rhscrd+=rhscrd;\n       rhscrd*=Nrhs;\n    } else rhscrd = 0;\n\n    totcrd = 4+ptrcrd+indcrd+valcrd+rhscrd;\n\n\n/*  Print header information:  */\n\n    fprintf(out_file,\"%-72s%-8s\\n%14d%14d%14d%14d%14d\\n\",Title, Key, totcrd,\n            ptrcrd, indcrd, valcrd, rhscrd);\n    fprintf(out_file,\"%3s%11s%14d%14d%14d\\n\",Type,\"          \", M, N, nz);\n    fprintf(out_file,\"%-16s%-16s%-20s\", Ptrfmt, Indfmt, Valfmt);\n    if ( Nrhs != 0 ) {\n/*     Print Rhsfmt on fourth line and                                    */\n/*           optional fifth header line for auxillary vector information: */\n       fprintf(out_file,\"%-20s\\n%-14s%d\\n\",Rhsfmt,Rhstype,Nrhs);\n    } else fprintf(out_file,\"\\n\");\n\n    offset = 1-_SP_base;  /* if base 0 storage is declared (via macro definition), */\n                          /* then storage entries are offset by 1                  */\n\n/*  Print column pointers:   */\n    for (i=0;i<N+1;i++)\n    {\n       entry = colptr[i]+offset;\n       fprintf(out_file,pformat,entry);\n       if ( (i+1)%Ptrperline == 0 ) fprintf(out_file,\"\\n\");\n    }\n\n   if ( (N+1) % Ptrperline != 0 ) fprintf(out_file,\"\\n\");\n\n/*  Print row indices:       */\n    for (i=0;i<nz;i++)\n    {\n       entry = rowind[i]+offset;\n       fprintf(out_file,iformat,entry);\n       if ( (i+1)%Indperline == 0 ) fprintf(out_file,\"\\n\");\n    }\n\n   if ( nz % Indperline != 0 ) fprintf(out_file,\"\\n\");\n\n/*  Print values:            */\n\n    if ( Type[0] != 'P' ) {          /* Skip if pattern only  */\n    for (i=0;i<nvalentries;i++)\n    {\n       fprintf(out_file,vformat,val+i*Valwidth);\n       if ( (i+1)%Valperline == 0 ) fprintf(out_file,\"\\n\");\n    }\n\n    if ( nvalentries % Valperline != 0 ) fprintf(out_file,\"\\n\");\n\n/*  Print right hand sides:  */\n    acount = 1;\n    linemod=0;\n    if ( Nrhs > 0 ) {\n      for (j=0;j<Nrhs;j++) {\n       for (i=0;i<nrhsentries;i++)\n       {\n          fprintf(out_file,rformat,rhs+i*Rhswidth);\n          if ( acount++%Rhsperline == linemod ) fprintf(out_file,\"\\n\");\n       }\n       if ( acount%Rhsperline != linemod ) {\n          fprintf(out_file,\"\\n\");\n          linemod = (acount-1)%Rhsperline;\n       }\n       if ( Rhstype[1] == 'G' ) {\n         for (i=0;i<nrhsentries;i++)\n         {\n           fprintf(out_file,rformat,guess+i*Rhswidth);\n           if ( acount++%Rhsperline == linemod ) fprintf(out_file,\"\\n\");\n         }\n         if ( acount%Rhsperline != linemod ) {\n            fprintf(out_file,\"\\n\");\n            linemod = (acount-1)%Rhsperline;\n         }\n       }\n       if ( Rhstype[2] == 'X' ) {\n         for (i=0;i<nrhsentries;i++)\n         {\n           fprintf(out_file,rformat,exact+i*Rhswidth);\n           if ( acount++%Rhsperline == linemod ) fprintf(out_file,\"\\n\");\n         }\n         if ( acount%Rhsperline != linemod ) {\n            fprintf(out_file,\"\\n\");\n            linemod = (acount-1)%Rhsperline;\n         }\n       }\n      }\n    }\n\n    }\n\n    if ( fclose(out_file) != 0){\n      fprintf(stderr,\"Error closing file in writeHB_mat_char().\\n\");\n      return 0;\n    } else return 1;\n\n}\n\nint ParseIfmt(char* fmt, int* perline, int* width)\n{\n/*************************************************/\n/*  Parse an *integer* format field to determine */\n/*  width and number of elements per line.       */\n/*************************************************/\n    char *tmp;\n    if (fmt == NULL ) {\n      *perline = 0; *width = 0; return 0;\n    }\n    upcase(fmt);\n    tmp = strchr(fmt,'(');\n    tmp = substr(fmt,tmp - fmt + 1, strchr(fmt,'I') - tmp - 1);\n    *perline = atoi(tmp);\n    tmp = strchr(fmt,'I');\n    tmp = substr(fmt,tmp - fmt + 1, strchr(fmt,')') - tmp - 1);\n    return *width = atoi(tmp);\n}\n\nint ParseRfmt(char* fmt, int* perline, int* width, int* prec, int* flag)\n{\n/*************************************************/\n/*  Parse a *real* format field to determine     */\n/*  width and number of elements per line.       */\n/*  Also sets flag indicating 'E' 'F' 'P' or 'D' */\n/*  format.                                      */\n/*************************************************/\n    char* tmp;\n    char* tmp2;\n    char* tmp3;\n    int len;\n\n    if (fmt == NULL ) {\n      *perline = 0;\n      *width = 0;\n      flag = NULL;\n      return 0;\n    }\n\n    upcase(fmt);\n    if (strchr(fmt,'(') != NULL)  fmt = strchr(fmt,'(');\n    if (strchr(fmt,')') != NULL)  {\n       tmp2 = strchr(fmt,')');\n       while ( strchr(tmp2+1,')') != NULL ) {\n          tmp2 = strchr(tmp2+1,')');\n       }\n       *(tmp2+1) = (int) NULL;\n    }\n    if (strchr(fmt,'P') != NULL)  /* Remove any scaling factor, which */\n    {                             /* affects output only, not input */\n      if (strchr(fmt,'(') != NULL) {\n        tmp = strchr(fmt,'P');\n        if ( *(++tmp) == ',' ) tmp++;\n        tmp3 = strchr(fmt,'(')+1;\n        len = tmp-tmp3;\n        tmp2 = tmp3;\n        while ( *(tmp2+len) != (int) NULL ) {\n           *tmp2=*(tmp2+len);\n           tmp2++;\n        }\n        *(strchr(fmt,')')+1) = (int) NULL;\n      }\n    }\n    if (strchr(fmt,'E') != NULL) {\n       *flag = 'E';\n    } else if (strchr(fmt,'D') != NULL) {\n       *flag = 'D';\n    } else if (strchr(fmt,'F') != NULL) {\n       *flag = 'F';\n    } else {\n      fprintf(stderr,\"Real format %s in H/B file not supported.\\n\",fmt);\n      return 0;\n    }\n    tmp = strchr(fmt,'(');\n    tmp = substr(fmt,tmp - fmt + 1, strchr(fmt,*flag) - tmp - 1);\n    *perline = atoi(tmp);\n    tmp = strchr(fmt,*flag);\n    if ( strchr(fmt,'.') ) {\n      *prec = atoi( substr( fmt, strchr(fmt,'.') - fmt + 1, strchr(fmt,')') - strchr(fmt,'.')-1) );\n      tmp = substr(fmt,tmp - fmt + 1, strchr(fmt,'.') - tmp - 1);\n    } else {\n      tmp = substr(fmt,tmp - fmt + 1, strchr(fmt,')') - tmp - 1);\n    }\n    return *width = atoi(tmp);\n}\n\nchar* substr(const char* S, const int pos, const int len)\n{\n    int i;\n    char *SubS;\n    if ( pos+len <= strlen(S)) {\n    SubS = (char *)malloc(len+1);\n    if ( SubS == NULL ) IOHBTerminate(\"Insufficient memory for SubS.\");\n    for (i=0;i<len;i++) SubS[i] = S[pos+i];\n    SubS[len] = (char) NULL;\n    } else {\n      SubS = NULL;\n    }\n    return SubS;\n}\n\n#include<ctype.h>\nvoid upcase(char* S)\n{\n/*  Convert S to uppercase     */\n    int i,len;\n    len = strlen(S);\n    for (i=0;i< len;i++)\n       S[i] = toupper(S[i]);\n}\n\nvoid IOHBTerminate(char* message)\n{\n   fprintf(stderr,message);\n   exit(1);\n}\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/bfp/bfp_LUSOL/LUSOL/hbio.h",
    "content": "#ifndef IOHB_H\n#define IOHB_H\n\n#include<stdio.h>\n#include<stdlib.h>\n#include<sys/types.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nint readHB_info(const char* filename, int* M, int* N, int* nz, char** Type,\n                                                      int* Nrhs);\n\nint readHB_header(FILE* in_file, char* Title, char* Key, char* Type,\n                    int* Nrow, int* Ncol, int* Nnzero, int* Nrhs, int* Nrhsix,\n                    char* Ptrfmt, char* Indfmt, char* Valfmt, char* Rhsfmt,\n                    int* Ptrcrd, int* Indcrd, int* Valcrd, int* Rhscrd,\n                    char *Rhstype);\n\nint readHB_mat_double(const char* filename, int colptr[], int rowind[],\n                                                                 double val[]);\n\nint readHB_newmat_double(const char* filename, int* M, int* N, int* nonzeros,\n                         int** colptr, int** rowind, double** val);\n\nint readHB_aux_double(const char* filename, const char AuxType, double b[]);\n\nint readHB_newaux_double(const char* filename, const char AuxType, double** b);\n\nint writeHB_mat_double(const char* filename, int M, int N,\n                        int nz, const int colptr[], const int rowind[],\n                        const double val[], int Nrhs, const double rhs[],\n                        const double guess[], const double exact[],\n                        const char* Title, const char* Key, const char* Type,\n                        char* Ptrfmt, char* Indfmt, char* Valfmt, char* Rhsfmt,\n                        const char* Rhstype);\n\nint readHB_mat_char(const char* filename, int colptr[], int rowind[],\n                                           char val[], char* Valfmt);\n\nint readHB_newmat_char(const char* filename, int* M, int* N, int* nonzeros, int** colptr,\n                          int** rowind, char** val, char** Valfmt);\n\nint readHB_aux_char(const char* filename, const char AuxType, char b[]);\n\nint readHB_newaux_char(const char* filename, const char AuxType, char** b, char** Rhsfmt);\n\nint writeHB_mat_char(const char* filename, int M, int N,\n                        int nz, const int colptr[], const int rowind[],\n                        const char val[], int Nrhs, const char rhs[],\n                        const char guess[], const char exact[],\n                        const char* Title, const char* Key, const char* Type,\n                        char* Ptrfmt, char* Indfmt, char* Valfmt, char* Rhsfmt,\n                        const char* Rhstype);\n\nint ParseIfmt(char* fmt, int* perline, int* width);\n\nint ParseRfmt(char* fmt, int* perline, int* width, int* prec, int* flag);\n\nvoid IOHBTerminate(char* message);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/bfp/bfp_LUSOL/LUSOL/lusol.c",
    "content": "\n/* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n   LUSOL routines from the Stanford Optimization Laboratory\n   The parts included are:\n    lusol1      Factor a given matrix A from scratch (lu1fac).\n    lusol2      Heap-management routines for lu1fac.\n    lusol6      Solve with the current LU factors.\n    lusol7      Utilities for all update routines.\n    lusol8      Replace a column (Bartels-Golub update).\n   ------------------------------------------------------------------\n   26 Apr 2002: TCP implemented using heap data structure.\n   01 May 2002: lu1DCP implemented.\n   07 May 2002: lu1mxc must put 0.0 at top of empty columns.\n   09 May 2002: lu1mCP implements Markowitz with cols searched\n                in heap order.\n                Often faster (searching 20 or 40 cols) but more dense.\n   11 Jun 2002: TRP implemented.\n                lu1mRP implements Markowitz with Threshold Rook\n                Pivoting.\n                lu1mxc maintains max col elements  (was lu1max.)\n                lu1mxr maintains max row elements.\n   12 Jun 2002: lu1mCP seems too slow on big problems (e.g. memplus).\n                Disabled it for the moment.  (Use lu1mar + TCP.)\n   14 Dec 2002: TSP implemented.\n                lu1mSP implements Markowitz with TSP.\n   07 Mar 2003: character*1, character*2 changed to f90 form.\n                Comments changed from * in column to ! in column 1.\n                Comments kept within column 72 to avoid compiler\n                warning.\n   06 Mar 2004: Translation to C by Kjell Eikland with the addition\n                of data wrappers, parametric constants, various\n                helper routines, and dynamic memory reallocation.\n   26 May 2004: Added LUSOL_IP_UPDATELIMIT parameter and provided\n                for dynamic memory expansion based on possible\n                forward requirements.\n   08 Jul 2004: Revised logic in lu6chk based on new code from\n                Michael Saunders.\n   01 Dec 2005: Add support for CMEX interface (disable by undef MATLAB)\n                Also include various bug fixes (disable by undef YZHANG)\n                Yin Zhang <yzhang@cs.utexas.edu>\n   01 Jan 2006: Added storage of singular indeces, not only the last.\n   ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <string.h>\n#include <float.h>\n#include <math.h>\n#include \"lusol.h\"\n#include \"myblas.h\"\n#ifdef MATLAB\n  #include \"mex.h\"\n#endif\n\n#ifdef FORTIFY\n# include \"lp_fortify.h\"\n#endif\n\n/* LUSOL Object creation and destruction */\n\nvoid *clean_realloc(void *oldptr, int width, int newsize, int oldsize)\n{\n  newsize *= width;\n  oldsize *= width;\n  oldptr = LUSOL_REALLOC(oldptr, newsize);\n  if(newsize > oldsize)\n/*    MEMCLEAR(oldptr+oldsize, newsize-oldsize); */\n    memset((char *)oldptr+oldsize, '\\0', newsize-oldsize);\n  return(oldptr);\n}\n\nMYBOOL LUSOL_realloc_a(LUSOLrec *LUSOL, int newsize)\n{\n  int oldsize;\n\n  if(newsize < 0)\n    newsize = LUSOL->lena + MAX(abs(newsize), LUSOL_MINDELTA_a);\n\n  oldsize = LUSOL->lena;\n  LUSOL->lena = newsize;\n  if(newsize > 0)\n    newsize++;\n  if(oldsize > 0)\n    oldsize++;\n\n  LUSOL->a    = (REAL *) clean_realloc(LUSOL->a,    sizeof(*(LUSOL->a)),\n                                                    newsize, oldsize);\n  LUSOL->indc = (int *)  clean_realloc(LUSOL->indc, sizeof(*(LUSOL->indc)),\n                                                    newsize, oldsize);\n  LUSOL->indr = (int *)  clean_realloc(LUSOL->indr, sizeof(*(LUSOL->indr)),\n                                                    newsize, oldsize);\n  if((newsize == 0) ||\n     ((LUSOL->a != NULL) && (LUSOL->indc != NULL) && (LUSOL->indr != NULL)))\n    return( TRUE );\n  else\n    return( FALSE );\n}\n\nMYBOOL LUSOL_expand_a(LUSOLrec *LUSOL, int *delta_lena, int *right_shift)\n{\n#ifdef StaticMemAlloc\n  return( FALSE );\n#else\n  int LENA, NFREE, LFREE;\n\n  /* Add expansion factor to avoid having to resize too often/too much;\n     (exponential formula suggested by Michael A. Saunders) */\n  LENA = LUSOL->lena;\n  *delta_lena = DELTA_SIZE(*delta_lena, LENA);\n\n  /* Expand it! */\n  if((*delta_lena <= 0) || !LUSOL_realloc_a(LUSOL, LENA+(*delta_lena)))\n    return( FALSE );\n\n  /* Make sure we return the actual memory increase of a */\n  *delta_lena = LUSOL->lena-LENA;\n\n  /* Shift the used memory area to the right */\n  LFREE = *right_shift;\n  NFREE = LFREE+*delta_lena;\n  LENA  -= LFREE-1;\n  MEMMOVE(LUSOL->a+NFREE,    LUSOL->a+LFREE,    LENA);\n  MEMMOVE(LUSOL->indr+NFREE, LUSOL->indr+LFREE, LENA);\n  MEMMOVE(LUSOL->indc+NFREE, LUSOL->indc+LFREE, LENA);\n\n  /* Also return the new starting position for the used memory area of a */\n  *right_shift  = NFREE;\n\n  LUSOL->expanded_a++;\n  return( TRUE );\n#endif\n}\n\nMYBOOL LUSOL_realloc_r(LUSOLrec *LUSOL, int newsize)\n{\n  int oldsize;\n\n  if(newsize < 0)\n    newsize = LUSOL->maxm + MAX(abs(newsize), LUSOL_MINDELTA_rc);\n\n  oldsize = LUSOL->maxm;\n  LUSOL->maxm = newsize;\n  if(newsize > 0)\n    newsize++;\n  if(oldsize > 0)\n    oldsize++;\n\n  LUSOL->lenr  = (int *) clean_realloc(LUSOL->lenr,  sizeof(*(LUSOL->lenr)),\n                                                     newsize, oldsize);\n  LUSOL->ip    = (int *) clean_realloc(LUSOL->ip,    sizeof(*(LUSOL->ip)),\n                                                     newsize, oldsize);\n  LUSOL->iqloc = (int *) clean_realloc(LUSOL->iqloc, sizeof(*(LUSOL->iqloc)),\n                                                     newsize, oldsize);\n  LUSOL->ipinv = (int *) clean_realloc(LUSOL->ipinv, sizeof(*(LUSOL->ipinv)),\n                                                     newsize, oldsize);\n  LUSOL->locr  = (int *) clean_realloc(LUSOL->locr,  sizeof(*(LUSOL->locr)),\n                                                     newsize, oldsize);\n\n  if((newsize == 0) ||\n     ((LUSOL->lenr != NULL) &&\n      (LUSOL->ip != NULL) && (LUSOL->iqloc != NULL) &&\n      (LUSOL->ipinv != NULL) && (LUSOL->locr != NULL))) {\n\n#ifndef ClassicHamaxR\n#ifdef AlwaysSeparateHamaxR\n    if(LUSOL->luparm[LUSOL_IP_PIVOTTYPE] == LUSOL_PIVMOD_TRP)\n#endif\n    {\n      LUSOL->amaxr = (REAL *) clean_realloc(LUSOL->amaxr, sizeof(*(LUSOL->amaxr)),\n                                                          newsize, oldsize);\n      if((newsize > 0) && (LUSOL->amaxr == NULL))\n        return( FALSE );\n    }\n#endif\n    return( TRUE );\n  }\n  else\n    return( FALSE );\n}\n\nMYBOOL LUSOL_realloc_c(LUSOLrec *LUSOL, int newsize)\n{\n  int oldsize;\n\n  if(newsize < 0)\n    newsize = LUSOL->maxn + MAX(abs(newsize), LUSOL_MINDELTA_rc);\n\n  oldsize = LUSOL->maxn;\n  LUSOL->maxn = newsize;\n  if(newsize > 0)\n    newsize++;\n  if(oldsize > 0)\n    oldsize++;\n\n  LUSOL->lenc  = (int *)  clean_realloc(LUSOL->lenc,  sizeof(*(LUSOL->lenc)),\n                                                      newsize, oldsize);\n  LUSOL->iq    = (int *)  clean_realloc(LUSOL->iq,    sizeof(*(LUSOL->iq)),\n                                                      newsize, oldsize);\n  LUSOL->iploc = (int *)  clean_realloc(LUSOL->iploc, sizeof(*(LUSOL->iploc)),\n                                                      newsize, oldsize);\n  LUSOL->iqinv = (int *)  clean_realloc(LUSOL->iqinv, sizeof(*(LUSOL->iqinv)),\n                                                      newsize, oldsize);\n  LUSOL->locc  = (int *)  clean_realloc(LUSOL->locc,  sizeof(*(LUSOL->locc)),\n                                                      newsize, oldsize);\n  LUSOL->w     = (REAL *) clean_realloc(LUSOL->w,     sizeof(*(LUSOL->w)),\n                                                      newsize, oldsize);\n#ifdef LUSOLSafeFastUpdate\n  LUSOL->vLU6L = (REAL *) clean_realloc(LUSOL->vLU6L, sizeof(*(LUSOL->vLU6L)),\n                                                      newsize, oldsize);\n#else\n  LUSOL->vLU6L = LUSOL->w;\n#endif\n\n  if((newsize == 0) ||\n     ((LUSOL->w != NULL) && (LUSOL->lenc != NULL) &&\n      (LUSOL->iq != NULL) && (LUSOL->iploc != NULL) &&\n      (LUSOL->iqinv != NULL) && (LUSOL->locc != NULL))) {\n\n#ifndef ClassicHamaxR\n    if(LUSOL->luparm[LUSOL_IP_PIVOTTYPE] == LUSOL_PIVMOD_TCP) {\n      LUSOL->Ha = (REAL *) clean_realloc(LUSOL->Ha,   sizeof(*(LUSOL->Ha)),\n                                                      newsize, oldsize);\n      LUSOL->Hj = (int *)  clean_realloc(LUSOL->Hj,   sizeof(*(LUSOL->Hj)),\n                                                      newsize, oldsize);\n      LUSOL->Hk = (int *)  clean_realloc(LUSOL->Hk,   sizeof(*(LUSOL->Hk)),\n                                                      newsize, oldsize);\n      if((newsize > 0) &&\n         ((LUSOL->Ha == NULL) || (LUSOL->Hj == NULL) || (LUSOL->Hk == NULL)))\n        return( FALSE );\n    }\n#endif\n#ifndef ClassicdiagU\n    if(LUSOL->luparm[LUSOL_IP_KEEPLU] == FALSE) {\n      LUSOL->diagU = (REAL *) clean_realloc(LUSOL->diagU, sizeof(*(LUSOL->diagU)),\n                                                          newsize, oldsize);\n      if((newsize > 0) && (LUSOL->diagU == NULL))\n        return( FALSE );\n    }\n#endif\n\n    return( TRUE );\n  }\n  else\n    return( FALSE );\n}\n\nLUSOLrec *LUSOL_create(FILE *outstream, int msgfil, int pivotmodel, int updatelimit)\n{\n  LUSOLrec *newLU;\n\n  newLU = (LUSOLrec *) LUSOL_CALLOC(1, sizeof(*newLU));\n  if(newLU == NULL)\n    return( newLU );\n\n  newLU->luparm[LUSOL_IP_SCALAR_NZA]       = LUSOL_MULT_nz_a;\n  newLU->outstream = outstream;\n  newLU->luparm[LUSOL_IP_PRINTUNIT]        = msgfil;\n  newLU->luparm[LUSOL_IP_PRINTLEVEL]       = LUSOL_MSG_SINGULARITY;\n\n  LUSOL_setpivotmodel(newLU, pivotmodel, LUSOL_PIVTOL_DEFAULT);\n\n  newLU->parmlu[LUSOL_RP_GAMMA]            = LUSOL_DEFAULT_GAMMA;\n\n  newLU->parmlu[LUSOL_RP_ZEROTOLERANCE]    = 3.0e-13;\n\n  newLU->parmlu[LUSOL_RP_SMALLDIAG_U]      = /*3.7e-11;*/\n  newLU->parmlu[LUSOL_RP_EPSDIAG_U]        = 3.7e-11;\n\n  newLU->parmlu[LUSOL_RP_COMPSPACE_U]      = 3.0e+0;\n\n  newLU->luparm[LUSOL_IP_MARKOWITZ_MAXCOL] = 5;\n  newLU->parmlu[LUSOL_RP_MARKOWITZ_CONLY]  = 0.3e+0;\n  newLU->parmlu[LUSOL_RP_MARKOWITZ_DENSE]  = 0.5e+0;\n\n  newLU->parmlu[LUSOL_RP_SMARTRATIO]       = LUSOL_DEFAULT_SMARTRATIO;\n#ifdef ForceRowBasedL0\n  newLU->luparm[LUSOL_IP_ACCELERATION]     = LUSOL_BASEORDER;\n#endif\n  newLU->luparm[LUSOL_IP_KEEPLU]           = TRUE;\n  newLU->luparm[LUSOL_IP_UPDATELIMIT]      = updatelimit;\n\n  init_BLAS();\n\n  return( newLU );\n}\n\nMYBOOL LUSOL_sizeto(LUSOLrec *LUSOL, int init_r, int init_c, int init_a)\n{\n  if(init_c == 0)\n    LUSOL_FREE(LUSOL->isingular);\n  if(LUSOL_realloc_a(LUSOL, init_a) &&\n     LUSOL_realloc_r(LUSOL, init_r) &&\n     LUSOL_realloc_c(LUSOL, init_c))\n    return( TRUE );\n  else\n    return( FALSE );\n}\n\nchar *LUSOL_pivotLabel(LUSOLrec *LUSOL)\n{\n  static /*const*/ char *pivotText[LUSOL_PIVMOD_MAX+1] =\n  {\"TPP\", \"TRP\", \"TCP\", \"TSP\"};\n  return(pivotText[LUSOL->luparm[LUSOL_IP_PIVOTTYPE]]);\n}\n\nvoid LUSOL_setpivotmodel(LUSOLrec *LUSOL, int pivotmodel, int initlevel)\n{\n  REAL newFM, newUM;\n\n  /* Set pivotmodel if specified */\n  if(pivotmodel > LUSOL_PIVMOD_NOCHANGE) {\n    if((pivotmodel <= LUSOL_PIVMOD_DEFAULT) || (pivotmodel > LUSOL_PIVMOD_MAX))\n      pivotmodel = LUSOL_PIVMOD_TPP;\n    LUSOL->luparm[LUSOL_IP_PIVOTTYPE]        = pivotmodel;\n  }\n\n  /* Check if we need bother about changing tolerances */\n  if((initlevel <= LUSOL_PIVTOL_NOCHANGE) || (initlevel > LUSOL_PIVTOL_MAX))\n    return;\n\n  /* Set default pivot tolerances\n     (note that UPDATEMAX should always be <= FACTORMAX) */\n  if(initlevel == LUSOL_PIVTOL_BAGGY) {        /* Extra-loose pivot thresholds */\n    newFM = 500.0;\n    newUM = newFM / 20;\n  }\n  else if(initlevel == LUSOL_PIVTOL_LOOSE) {  /* Moderately tight pivot tolerances */\n    newFM = 100.0;\n    newUM = newFM / 10;\n  }\n  else if(initlevel == LUSOL_PIVTOL_NORMAL) { /* Standard pivot tolerances */\n    newFM = 28.0;\n    newUM = newFM / 4;\n  }\n  else if(initlevel == LUSOL_PIVTOL_SLIM) {   /* Better accuracy pivot tolerances */\n    newFM = 10.0;\n    newUM = newFM / 2;\n  }\n  else if(initlevel == LUSOL_PIVTOL_TIGHT) {  /* Enhanced accuracy pivot tolerances */\n    newFM = 5.0;\n    newUM = newFM / 2;\n  }\n  else if(initlevel == LUSOL_PIVTOL_SUPER) {  /* Very tight pivot tolerances for extra accuracy */\n    newFM = 2.5;\n    newUM = 1.99;\n  }\n  else {                                      /* Extremely tight pivot tolerances for extra accuracy */\n    newFM = 1.99;\n    newUM = newFM / 1.49;\n  }\n\n  /* Set the tolerances */\n  LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij] = newFM;\n  LUSOL->parmlu[LUSOL_RP_UPDATEMAX_Lij] = newUM;\n}\n\nMYBOOL LUSOL_tightenpivot(LUSOLrec *LUSOL)\n{\n#if 0\n  REAL newvalue;\n#endif\n\n  /* Give up tightening if we are already less than limit and we cannot change strategy */\n  if(MIN(LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij],\n         LUSOL->parmlu[LUSOL_RP_UPDATEMAX_Lij]) < 1.1) {\n    if(LUSOL->luparm[LUSOL_IP_PIVOTTYPE] >= LUSOL_PIVMOD_TRP)\n      return( FALSE );\n    LUSOL_setpivotmodel(LUSOL, LUSOL->luparm[LUSOL_IP_PIVOTTYPE]+1, LUSOL_PIVTOL_DEFAULT+1);\n    return( 2 );\n  }\n\n  /* Otherwise tighten according to defined schedule */\n#if 0   /* This is Michael Saunder's proposed tightening procedure */\n  newvalue = sqrt(LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij]);\n  LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij] = newvalue;\n  SETMIN(LUSOL->parmlu[LUSOL_RP_UPDATEMAX_Lij], newvalue);\n#elif 0 /* This is Kjell Eikland's schedule #1 */\n  newvalue = sqrt(LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij]);\n  LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij] = newvalue;\n  LUSOL->parmlu[LUSOL_RP_UPDATEMAX_Lij] = 1.0 + (newvalue - 1.0) / 2;\n#else   /* This was Kjell Eikland's schedule #2 */\n  LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij] = 1.0 + LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij]/3.0;\n  LUSOL->parmlu[LUSOL_RP_UPDATEMAX_Lij] = 1.0 + LUSOL->parmlu[LUSOL_RP_UPDATEMAX_Lij]/3.0;\n#endif\n  return( TRUE );\n}\n\nMYBOOL LUSOL_addSingularity(LUSOLrec *LUSOL, int singcol, int *inform)\n{\n  int NSING = LUSOL->luparm[LUSOL_IP_SINGULARITIES],\n      ASING = LUSOL->luparm[LUSOL_IP_SINGULARLISTSIZE];\n\n  /* Check if we need to allocated list memory to store multiple singularities */\n  if((NSING > 0) && (NSING >= ASING)) {\n\n    /* Increase list in \"reasonable\" steps */\n    ASING += (int) (10.0 * (log10((REAL) LUSOL->m)+1.0));\n    LUSOL->isingular = (int *) LUSOL_REALLOC(LUSOL->isingular, sizeof(*LUSOL->isingular)*(ASING+1));\n    if(LUSOL->isingular == NULL) {\n      LUSOL->luparm[LUSOL_IP_SINGULARLISTSIZE] = 0;\n      *inform = LUSOL_INFORM_NOMEMLEFT;\n      return( FALSE );\n    }\n    LUSOL->luparm[LUSOL_IP_SINGULARLISTSIZE] = ASING;\n\n    /* Transfer the first singularity if the list was just created */\n    if(NSING == 1)\n      LUSOL->isingular[NSING] = LUSOL->luparm[LUSOL_IP_SINGULARINDEX];\n  }\n\n  /* Update singularity count and store its index */\n  NSING++;\n  if(NSING > 1) {\n    LUSOL->isingular[0] = NSING;\n    LUSOL->isingular[NSING] = singcol;\n  }\n  LUSOL->luparm[LUSOL_IP_SINGULARITIES] = NSING;\n\n  /* Mimic old logic by keeping the last singularity stored */\n  LUSOL->luparm[LUSOL_IP_SINGULARINDEX] = singcol;\n\n  return( TRUE );\n}\n\nint LUSOL_getSingularity(LUSOLrec *LUSOL, int singitem)\n{\n  if((singitem > LUSOL->luparm[LUSOL_IP_SINGULARITIES]) || (singitem < 0))\n    singitem = -1;\n  else if(singitem == 0)\n    singitem = LUSOL->luparm[LUSOL_IP_SINGULARITIES];\n  else if(singitem > 1)\n    singitem = LUSOL->isingular[singitem];\n  else\n    singitem = LUSOL->luparm[LUSOL_IP_SINGULARINDEX];\n  return( singitem );\n}\n\nint LUSOL_findSingularityPosition(LUSOLrec *LUSOL, int singcol)\n/* The purpose of this routine is to find the slack row/column in\n   user-index that was singular in the last unsuccessful column\n   update; zero is returned if the search was unsuccessful.\n   By adding a slack at this position this particular singularity\n   should disappear.\n   (Source: Michael A. Saunders; private communication to KE) */\n{\n#if 0 /* Michael Saunders version */\n  int j;\n  for(j = LUSOL->m; j > 0; j--)\n    if(LUSOL->iq[j] == singcol)\n      break;\n  singcol = j;\n#else /* Kjell Eikland version (note that iqinv could be invalid in early versions of LUSOL) */\n  singcol = LUSOL->iqinv[singcol];\n#endif\n  return( LUSOL->ip[singcol] );\n}\n\nchar *LUSOL_informstr(LUSOLrec *LUSOL, int inform)\n{\n  static char *informText[LUSOL_INFORM_MAX-LUSOL_INFORM_MIN+1] =\n  {\"LUSOL_RANKLOSS: Lost rank\",\n   \"LUSOL_LUSUCCESS: Success\",\n   \"LUSOL_LUSINGULAR: Singular A\",\n   \"LUSOL_LUUNSTABLE: Unstable factorization\",\n   \"LUSOL_ADIMERR: Row or column count exceeded\",\n   \"LUSOL_ADUPLICATE: Duplicate A matrix entry found\",\n   \"(Undefined message)\",\n   \"(Undefined message)\",\n   \"LUSOL_ANEEDMEM: Insufficient memory for factorization\",\n   \"LUSOL_FATALERR: Fatal internal error\",\n   \"LUSOL_NOPIVOT: Found no suitable pivot\",\n   \"LUSOL_NOMEMLEFT: Could not obtain more memory\"};\n  if((inform < LUSOL_INFORM_MIN) || (inform > LUSOL_INFORM_MAX))\n    inform = LUSOL->luparm[LUSOL_IP_INFORM];\n  return(informText[inform-LUSOL_INFORM_MIN]);\n}\n\nvoid LUSOL_clear(LUSOLrec *LUSOL, MYBOOL nzonly)\n{\n  int len;\n\n  LUSOL->nelem = 0;\n  if(!nzonly) {\n\n   /* lena arrays */\n    len = LUSOL->lena + LUSOL_ARRAYOFFSET;\n    MEMCLEAR(LUSOL->a,    len);\n    MEMCLEAR(LUSOL->indc, len);\n    MEMCLEAR(LUSOL->indr, len);\n\n   /* maxm arrays */\n    len = LUSOL->maxm + LUSOL_ARRAYOFFSET;\n    MEMCLEAR(LUSOL->lenr,  len);\n    MEMCLEAR(LUSOL->ip,    len);\n    MEMCLEAR(LUSOL->iqloc, len);\n    MEMCLEAR(LUSOL->ipinv, len);\n    MEMCLEAR(LUSOL->locr,  len);\n\n#ifndef ClassicHamaxR\n    if((LUSOL->amaxr != NULL)\n#ifdef AlwaysSeparateHamaxR\n       && (LUSOL->luparm[LUSOL_IP_PIVOTTYPE] == LUSOL_PIVMOD_TRP)\n#endif\n      )\n      MEMCLEAR(LUSOL->amaxr, len);\n#endif\n\n   /* maxn arrays */\n    len = LUSOL->maxn + LUSOL_ARRAYOFFSET;\n    MEMCLEAR(LUSOL->lenc,  len);\n    MEMCLEAR(LUSOL->iq,    len);\n    MEMCLEAR(LUSOL->iploc, len);\n    MEMCLEAR(LUSOL->iqinv, len);\n    MEMCLEAR(LUSOL->locc,  len);\n    MEMCLEAR(LUSOL->w,     len);\n\n    if(LUSOL->luparm[LUSOL_IP_PIVOTTYPE] == LUSOL_PIVMOD_TCP) {\n      MEMCLEAR(LUSOL->Ha,  len);\n      MEMCLEAR(LUSOL->Hj,  len);\n      MEMCLEAR(LUSOL->Hk,  len);\n    }\n#ifndef ClassicdiagU\n    if(LUSOL->luparm[LUSOL_IP_KEEPLU] == FALSE) {\n      MEMCLEAR(LUSOL->diagU, len);\n    }\n#endif\n\n  }\n}\n\nMYBOOL LUSOL_assign(LUSOLrec *LUSOL, int iA[], int jA[], REAL Aij[], int nzcount, MYBOOL istriplet)\n{\n  int k, m, n, ij, kol;\n\n  /* Adjust the size of the a structure */\n  if(nzcount > (LUSOL->lena/LUSOL->luparm[LUSOL_IP_SCALAR_NZA]) &&\n     !LUSOL_realloc_a(LUSOL, nzcount*LUSOL->luparm[LUSOL_IP_SCALAR_NZA]))\n    return( FALSE );\n\n  m = 0;\n  n = 0;\n  kol = 1;\n  for(k = 1; k <= nzcount; k++) {\n    /* First the row indicator */\n    ij = iA[k];\n    if(ij > m) {\n      m = ij;\n      if(m > LUSOL->maxm &&\n         !LUSOL_realloc_r(LUSOL, -(m / LUSOL_MINDELTA_FACTOR + 1)))\n        return( FALSE );\n    }\n    LUSOL->indc[k] = ij;\n\n    /* Then the column indicator;\n       Handle both triplet and column count formats */\n    if(istriplet)\n      ij = jA[k];\n    else {\n      if(k >= jA[kol])\n        kol++;\n      ij = kol;\n    }\n    if(ij > n) {\n      n = ij;\n      if(n > LUSOL->maxn &&\n         !LUSOL_realloc_c(LUSOL, -(n / LUSOL_MINDELTA_FACTOR + 1)))\n        return( FALSE );\n    }\n    LUSOL->indr[k] = ij;\n\n    /* Lastly the matrix value itself */\n    LUSOL->a[k] = Aij[k];\n  }\n  LUSOL->m = m;\n  LUSOL->n = n;\n  LUSOL->nelem = nzcount;\n  return( TRUE );\n}\n\nint LUSOL_loadColumn(LUSOLrec *LUSOL, int iA[], int jA, REAL Aij[], int nzcount, int offset1)\n{\n  int i, ii, nz, k;\n\n  nz = LUSOL->nelem;\n  i = nz + nzcount;\n  if(i > (LUSOL->lena/LUSOL->luparm[LUSOL_IP_SCALAR_NZA]) &&\n     !LUSOL_realloc_a(LUSOL, i*LUSOL->luparm[LUSOL_IP_SCALAR_NZA]))\n  return( -1 );\n\n  k = 0;\n  for(ii = 1; ii <= nzcount; ii++) {\n    i = ii + offset1;\n    if(Aij[i] == 0)\n      continue;\n    if(iA[i] <= 0 || iA[i] > LUSOL->m ||\n       jA <= 0 || jA > LUSOL->n) {\n      LUSOL_report(LUSOL, 0, \"Variable index outside of set bounds (r:%d/%d, c:%d/%d)\\n\",\n                             iA[i], LUSOL->m, jA, LUSOL->n);\n      continue;\n    }\n    k++;\n    nz++;\n    LUSOL->a[nz]    = Aij[i];\n    LUSOL->indc[nz] = iA[i];\n    LUSOL->indr[nz] = jA;\n  }\n  LUSOL->nelem = nz;\n  return( k );\n}\n\nvoid LUSOL_free(LUSOLrec *LUSOL)\n{\n  LUSOL_realloc_a(LUSOL, 0);\n  LUSOL_realloc_r(LUSOL, 0);\n  LUSOL_realloc_c(LUSOL, 0);\n  if(LUSOL->L0 != NULL)\n    LUSOL_matfree(&(LUSOL->L0));\n  if(LUSOL->U != NULL)\n    LUSOL_matfree(&(LUSOL->U));\n  if(!is_nativeBLAS())\n    unload_BLAS();\n  LUSOL_FREE(LUSOL);\n}\n\nvoid LUSOL_report(LUSOLrec *LUSOL, int msglevel, char *format, ...)\n{\n  va_list ap;\n\n  if(LUSOL == NULL) {\n    va_start(ap, format);\n    vfprintf(stderr, format, ap);\n    va_end(ap);\n  }\n  else if(msglevel >= 0  /*LUSOL->luparm[2]*/) {\n    if(LUSOL->writelog != NULL) {\n      char buff[255];\n\n      va_start(ap, format);\n      vsprintf(buff, format, ap);\n      va_end(ap);\n      LUSOL->writelog(LUSOL, LUSOL->loghandle, buff);\n    }\n    if(LUSOL->outstream != NULL) {\n      va_start(ap, format);\n      vfprintf(LUSOL->outstream, format, ap);\n      va_end(ap);\n      fflush(LUSOL->outstream);\n    }\n  }\n}\n\nvoid LUSOL_timer(LUSOLrec *LUSOL, int timerid, char *text)\n{\n  LUSOL_report(LUSOL, -1, \"TimerID %d at %s - %s\\n\",\n                          timerid, \"\", text);\n}\n\nint LUSOL_factorize(LUSOLrec *LUSOL)\n{\n  int inform;\n\n  LU1FAC( LUSOL, &inform );\n  return( inform );\n}\n\nint LUSOL_ftran(LUSOLrec *LUSOL, REAL b[], int NZidx[], MYBOOL prepareupdate)\n{\n  int  inform;\n  REAL *vector;\n\n  if(prepareupdate)\n    vector = LUSOL->vLU6L;\n  else\n    vector = LUSOL->w;\n\n  /* Copy RHS vector, but make adjustment for offset since this\n     can create a memory error when the calling program uses\n     a 0-base vector offset back to comply with LUSOL. */\n  MEMCOPY(vector+1, b+1, LUSOL->n);\n  if (vector != NULL)\n    vector[0] = 0;\n\n  LU6SOL(LUSOL, LUSOL_SOLVE_Aw_v, vector, b, NZidx, &inform);\n  LUSOL->luparm[LUSOL_IP_FTRANCOUNT]++;\n\n  return(inform);\n}\n\n\nint LUSOL_btran(LUSOLrec *LUSOL, REAL b[], int NZidx[])\n{\n  int inform;\n\n  /* Copy RHS vector, but make adjustment for offset since this\n     can create a memory error when the calling program uses\n     a 0-base vector offset back to comply with LUSOL. */\n  MEMCOPY(LUSOL->w+1, b+1, LUSOL->m);\n  if (LUSOL->w != NULL)\n    LUSOL->w[0] = 0;\n\n  LU6SOL(LUSOL, LUSOL_SOLVE_Atv_w, b, LUSOL->w, NZidx, &inform);\n  LUSOL->luparm[LUSOL_IP_BTRANCOUNT]++;\n\n  return(inform);\n}\n\n\nint LUSOL_replaceColumn(LUSOLrec *LUSOL, int jcol, REAL v[])\n{\n  int  inform;\n  REAL DIAG, VNORM;\n\n  LU8RPC(LUSOL, LUSOL_UPDATE_OLDNONEMPTY, LUSOL_UPDATE_NEWNONEMPTY,\n                jcol, v, NULL,\n                &inform, &DIAG, &VNORM);\n\n  LUSOL->replaced_c++;\n  return( inform );\n}\n\nREAL LUSOL_vecdensity(LUSOLrec *LUSOL, REAL V[])\n{\n  int I, N = 0;\n\n  for(I = 1; I <= LUSOL->m; I++)\n    if(fabs(V[I]) > 0)\n      N++;\n  return( (REAL) N / (REAL) LUSOL->m );\n}\n\nchar relationChar(REAL left, REAL right)\n{\n  if(left > right)\n    return('>');\n  else if(left == right)\n    return('=');\n  else\n    return('<');\n}\n\n/* Retrieve the core modules ordered by order of dependency */\n\n#include \"lusol2.c\"      /* Heap management */\n#include \"lusol6a.c\"     /* Singularity checking and equation solving */\n#include \"lusol1.c\"      /* Factorization and core components */\n#include \"lusol7a.c\"     /* Utility routines for updates */\n#include \"lusol8a.c\"     /* Column update */\n\n\nvoid LUSOL_dump(FILE *output, LUSOLrec *LUSOL)\n{\n  MYBOOL userfile = (MYBOOL) (output != NULL);\n\n  if(!userfile)\n    output = fopen(\"LUSOL.dbg\", \"w\");\n\n  blockWriteREAL(output, \"a\", LUSOL->a, 1, LUSOL->lena);\n  blockWriteINT(output, \"indc\", LUSOL->indc, 1, LUSOL->lena);\n  blockWriteINT(output, \"indr\", LUSOL->indr, 1, LUSOL->lena);\n\n  blockWriteINT(output, \"ip\", LUSOL->ip, 1, LUSOL->m);\n  blockWriteINT(output, \"iq\", LUSOL->iq, 1, LUSOL->n);\n  blockWriteINT(output, \"lenc\", LUSOL->lenc, 1, LUSOL->n);\n  blockWriteINT(output, \"lenr\", LUSOL->lenr, 1, LUSOL->m);\n\n  blockWriteINT(output, \"locc\", LUSOL->locc, 1, LUSOL->n);\n  blockWriteINT(output, \"locr\", LUSOL->locr, 1, LUSOL->m);\n  blockWriteINT(output, \"iploc\", LUSOL->iploc, 1, LUSOL->n);\n  blockWriteINT(output, \"iqloc\", LUSOL->iqloc, 1, LUSOL->m);\n\n  blockWriteINT(output, \"ipinv\", LUSOL->ipinv, 1, LUSOL->m);\n  blockWriteINT(output, \"iqinv\", LUSOL->iqinv, 1, LUSOL->n);\n\n  if(!userfile)\n    fclose(output);\n}\n\nLUSOLmat *LUSOL_matcreate(int dim, int nz)\n{\n  LUSOLmat *newm;\n\n  newm = (LUSOLmat *) LUSOL_CALLOC(1, sizeof(*newm));\n  if(newm != NULL) {\n    newm->a    = (REAL *) LUSOL_MALLOC((nz+1)*sizeof(REAL));\n    newm->lenx = (int *)  LUSOL_MALLOC((dim+1)*sizeof(int));\n    newm->indx = (int *)  LUSOL_MALLOC((dim+1)*sizeof(int));\n    newm->indr = (int *)  LUSOL_MALLOC((nz+1)*sizeof(int));\n    newm->indc = (int *)  LUSOL_MALLOC((nz+1)*sizeof(int));\n    if((newm->a == NULL) ||\n       (newm->lenx == NULL) || (newm->indx == NULL) ||\n       (newm->indr == NULL) || (newm->indc == NULL))\n      LUSOL_matfree(&newm);\n  }\n  return(newm);\n}\nvoid LUSOL_matfree(LUSOLmat **mat)\n{\n  if((mat == NULL) || (*mat == NULL))\n    return;\n  LUSOL_FREE((*mat)->a);\n  LUSOL_FREE((*mat)->indc);\n  LUSOL_FREE((*mat)->indr);\n  LUSOL_FREE((*mat)->lenx);\n  LUSOL_FREE((*mat)->indx);\n  LUSOL_FREE(*mat);\n}\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/bfp/bfp_LUSOL/LUSOL/lusol.h",
    "content": "#ifndef HEADER_LUSOL\n#define HEADER_LUSOL\n\n/* Include necessary libraries                                               */\n/* ------------------------------------------------------------------------- */\n#include <stdio.h>\n#include \"commonlib.h\"\n\n/* Version information                                                       */\n/* ------------------------------------------------------------------------- */\n#define LUSOL_VERMAJOR   2\n#define LUSOL_VERMINOR   2\n#define LUSOL_RELEASE    2\n#define LUSOL_BUILD      0\n\n/* Dynamic memory management macros                                          */\n/* ------------------------------------------------------------------------- */\n#ifdef MATLAB\n  #define LUSOL_MALLOC(bytesize)        mxMalloc(bytesize)\n  #define LUSOL_CALLOC(count, recsize)  mxCalloc(count, recsize)\n  #define LUSOL_REALLOC(ptr, bytesize)  mxRealloc((void *) ptr, bytesize)\n  #define LUSOL_FREE(ptr)               {mxFree(ptr); ptr=NULL;}\n#else\n  #define LUSOL_MALLOC(bytesize)        malloc(bytesize)\n  #define LUSOL_CALLOC(count, recsize)  calloc(count, recsize)\n  #define LUSOL_REALLOC(ptr, bytesize)  realloc((void *) ptr, bytesize)\n  #define LUSOL_FREE(ptr)               {free(ptr); ptr=NULL;}\n#endif\n\n/* Performance compiler options                                              */\n/* ------------------------------------------------------------------------- */\n#if 1\n  #define ForceInitialization      /* Satisfy compilers, check during debugging! */\n  #define LUSOLFastDenseIndex           /* Increment the linearized dense address */\n  #define LUSOLFastClear           /* Use intrinsic functions for memory zeroing */\n  #define LUSOLFastMove              /* Use intrinsic functions for memory moves */\n  #define LUSOLFastCopy               /* Use intrinsic functions for memory copy */\n  #define LUSOLFastSolve           /* Use pointer operations in equation solving */\n  #define LUSOLSafeFastUpdate      /* Use separate array for LU6L result storage */\n/*#define UseOld_LU6CHK_20040510 */\n/*#define AlwaysSeparateHamaxR */       /* Enabled when the pivot model is fixed */\n  #if 0\n    #define ForceRowBasedL0                  /* Create a row-sorted version of L0 */\n  #endif\n/*  #define SetSmallToZero*/\n/*  #define DoTraceL0 */\n#endif\n/*#define UseTimer */\n\n\n/* Legacy compatibility and testing options (Fortran-LUSOL)                  */\n/* ------------------------------------------------------------------------- */\n#if 0\n  #define LegacyTesting\n  #define StaticMemAlloc           /* Preallocated vs. dynamic memory allocation */\n  #define ClassicdiagU                                  /* Store diagU at end of a */\n  #define ClassicHamaxR                    /* Store H+AmaxR at end of a/indc/indr */\n#endif\n\n\n/* General constants and data type definitions                               */\n/* ------------------------------------------------------------------------- */\n#define LUSOL_ARRAYOFFSET            1\n#ifndef ZERO\n  #define ZERO                       0\n#endif\n#ifndef ONE\n  #define ONE                        1\n#endif\n#ifndef FALSE\n  #define FALSE                      0\n#endif\n#ifndef TRUE\n  #define TRUE                       1\n#endif\n#ifndef NULL\n  #define NULL                       0\n#endif\n#ifndef REAL\n  #define REAL double\n#endif\n#ifndef REALXP\n  #define REALXP long double\n#endif\n#ifndef MYBOOL\n  #define MYBOOL unsigned char\n#endif\n\n\n/* User-settable default parameter values                                    */\n/* ------------------------------------------------------------------------- */\n#define LUSOL_DEFAULT_GAMMA        2.0\n#define LUSOL_SMALLNUM         1.0e-20  /* IAEE doubles have precision 2.22e-16 */\n#define LUSOL_BIGNUM           1.0e+20\n#define LUSOL_MINDELTA_FACTOR        4\n#define LUSOL_MINDELTA_a         10000\n#if 1\n  #define LUSOL_MULT_nz_a            2  /* Suggested by Yin Zhang */\n#else\n  #define LUSOL_MULT_nz_a            5  /* Could consider 6 or 7 */\n#endif\n#define LUSOL_MINDELTA_rc         1000\n#define LUSOL_DEFAULT_SMARTRATIO 0.667\n\n/* Fixed system parameters (changeable only by developers)                   */\n/* ------------------------------------------------------------------------- */\n\n/* parmlu INPUT parameters: */\n#define LUSOL_RP_SMARTRATIO          0\n#define LUSOL_RP_FACTORMAX_Lij       1\n#define LUSOL_RP_UPDATEMAX_Lij       2\n#define LUSOL_RP_ZEROTOLERANCE       3\n#define LUSOL_RP_SMALLDIAG_U         4\n#define LUSOL_RP_EPSDIAG_U           5\n#define LUSOL_RP_COMPSPACE_U         6\n#define LUSOL_RP_MARKOWITZ_CONLY     7\n#define LUSOL_RP_MARKOWITZ_DENSE     8\n#define LUSOL_RP_GAMMA               9\n\n/* parmlu OUPUT parameters: */\n#define LUSOL_RP_MAXELEM_A          10\n#define LUSOL_RP_MAXMULT_L          11\n#define LUSOL_RP_MAXELEM_U          12\n#define LUSOL_RP_MAXELEM_DIAGU      13\n#define LUSOL_RP_MINELEM_DIAGU      14\n#define LUSOL_RP_MAXELEM_TCP        15\n#define LUSOL_RP_GROWTHRATE         16\n#define LUSOL_RP_USERDATA_1         17\n#define LUSOL_RP_USERDATA_2         18\n#define LUSOL_RP_USERDATA_3         19\n#define LUSOL_RP_RESIDUAL_U         20\n#define LUSOL_RP_LASTITEM            LUSOL_RP_RESIDUAL_U\n\n/* luparm INPUT parameters: */\n#define LUSOL_IP_USERDATA_0          0\n#define LUSOL_IP_PRINTUNIT           1\n#define LUSOL_IP_PRINTLEVEL          2\n#define LUSOL_IP_MARKOWITZ_MAXCOL    3\n#define LUSOL_IP_SCALAR_NZA          4\n#define LUSOL_IP_UPDATELIMIT         5\n#define LUSOL_IP_PIVOTTYPE           6\n#define LUSOL_IP_ACCELERATION        7\n#define LUSOL_IP_KEEPLU              8\n#define LUSOL_IP_SINGULARLISTSIZE    9\n\n/* luparm OUTPUT parameters: */\n#define LUSOL_IP_INFORM             10\n#define LUSOL_IP_SINGULARITIES      11\n#define LUSOL_IP_SINGULARINDEX      12\n#define LUSOL_IP_MINIMUMLENA        13\n#define LUSOL_IP_MAXLEN             14\n#define LUSOL_IP_UPDATECOUNT        15\n#define LUSOL_IP_RANK_U             16\n#define LUSOL_IP_COLCOUNT_DENSE1    17\n#define LUSOL_IP_COLCOUNT_DENSE2    18\n#define LUSOL_IP_COLINDEX_DUMIN     19\n#define LUSOL_IP_COLCOUNT_L0        20\n#define LUSOL_IP_NONZEROS_L0        21\n#define LUSOL_IP_NONZEROS_U0        22\n#define LUSOL_IP_NONZEROS_L         23\n#define LUSOL_IP_NONZEROS_U         24\n#define LUSOL_IP_NONZEROS_ROW       25\n#define LUSOL_IP_COMPRESSIONS_LU    26\n#define LUSOL_IP_MARKOWITZ_MERIT    27\n#define LUSOL_IP_TRIANGROWS_U       28\n#define LUSOL_IP_TRIANGROWS_L       29\n#define LUSOL_IP_FTRANCOUNT         30\n#define LUSOL_IP_BTRANCOUNT         31\n#define LUSOL_IP_ROWCOUNT_L0        32\n#define LUSOL_IP_LASTITEM            LUSOL_IP_ROWCOUNT_L0\n\n\n/* Macros for matrix-based access for dense part of A and timer mapping      */\n/* ------------------------------------------------------------------------- */\n#define DAPOS(row, col)   (row + (col-1)*LDA)\n#define timer(text, id)   LUSOL_timer(LUSOL, id, text)\n\n\n/* Parameter/option defines                                                  */\n/* ------------------------------------------------------------------------- */\n#define LUSOL_MSG_NONE              -1\n#define LUSOL_MSG_SINGULARITY        0\n#define LUSOL_MSG_STATISTICS        10\n#define LUSOL_MSG_PIVOT             50\n\n#define LUSOL_BASEORDER              0\n#define LUSOL_OTHERORDER             1\n#define LUSOL_AUTOORDER              2\n#define LUSOL_ACCELERATE_L0          4\n#define LUSOL_ACCELERATE_U           8\n\n#define LUSOL_PIVMOD_NOCHANGE       -2  /* Don't change active pivoting model */\n#define LUSOL_PIVMOD_DEFAULT        -1  /* Set pivoting model to default */\n#define LUSOL_PIVMOD_TPP             0  /* Threshold Partial   pivoting (normal) */\n#define LUSOL_PIVMOD_TRP             1  /* Threshold Rook      pivoting */\n#define LUSOL_PIVMOD_TCP             2  /* Threshold Complete  pivoting */\n#define LUSOL_PIVMOD_TSP             3  /* Threshold Symmetric pivoting */\n#define LUSOL_PIVMOD_MAX             LUSOL_PIVMOD_TSP\n\n#define LUSOL_PIVTOL_NOCHANGE        0\n#define LUSOL_PIVTOL_BAGGY           1\n#define LUSOL_PIVTOL_LOOSE           2\n#define LUSOL_PIVTOL_NORMAL          3\n#define LUSOL_PIVTOL_SLIM            4\n#define LUSOL_PIVTOL_TIGHT           5\n#define LUSOL_PIVTOL_SUPER           6\n#define LUSOL_PIVTOL_CORSET          7\n#define LUSOL_PIVTOL_DEFAULT         LUSOL_PIVTOL_SLIM\n#define LUSOL_PIVTOL_MAX             LUSOL_PIVTOL_CORSET\n\n#define LUSOL_UPDATE_OLDEMPTY        0  /* No/empty current column. */\n#define LUSOL_UPDATE_OLDNONEMPTY     1  /* Current column need not have been empty. */\n#define LUSOL_UPDATE_NEWEMPTY        0  /* New column is taken to be zero. */\n#define LUSOL_UPDATE_NEWNONEMPTY     1  /* v(*) contains the new column;\n                                           on exit,  v(*)  satisfies  L*v = a(new). */\n#define LUSOL_UPDATE_USEPREPARED     2  /* v(*)  must satisfy  L*v = a(new). */\n\n#define LUSOL_SOLVE_Lv_v             1  /* v  solves   L v = v(input). w  is not touched. */\n#define LUSOL_SOLVE_Ltv_v            2  /* v  solves   L'v = v(input). w  is not touched. */\n#define LUSOL_SOLVE_Uw_v             3  /* w  solves   U w = v.        v  is not altered. */\n#define LUSOL_SOLVE_Utv_w            4  /* v  solves   U'v = w.        w  is destroyed. */\n#define LUSOL_SOLVE_Aw_v             5  /* w  solves   A w = v.        v  is altered as in 1. */\n#define LUSOL_FTRAN   LUSOL_SOLVE_Aw_v\n#define LUSOL_SOLVE_Atv_w            6  /* v  solves   A'v = w.        w  is destroyed. */\n#define LUSOL_BTRAN  LUSOL_SOLVE_Atv_w\n\n/* If mode = 3,4,5,6, v and w must not be the same arrays.\n   If lu1fac has just been used to factorize a symmetric matrix A\n   (which must be definite or quasi-definite), the factors A = L U\n   may be regarded as A = LDL', where D = diag(U).  In such cases,\n   the following (faster) solve codes may be used:                  */\n#define LUSOL_SOLVE_Av_v             7  /* v  solves   A v = L D L'v = v(input). w  is not touched. */\n#define LUSOL_SOLVE_LDLtv_v          8  /* v  solves       L |D| L'v = v(input). w  is not touched. */\n\n#define LUSOL_INFORM_RANKLOSS       -1\n#define LUSOL_INFORM_LUSUCCESS       0\n#define LUSOL_INFORM_LUSINGULAR      1\n#define LUSOL_INFORM_LUUNSTABLE      2\n#define LUSOL_INFORM_ADIMERR         3\n#define LUSOL_INFORM_ADUPLICATE      4\n#define LUSOL_INFORM_ANEEDMEM        7  /* Set lena >= luparm[LUSOL_IP_MINIMUMLENA] */\n#define LUSOL_INFORM_FATALERR        8\n#define LUSOL_INFORM_NOPIVOT         9  /* No diagonal pivot found with TSP or TDP. */\n#define LUSOL_INFORM_NOMEMLEFT      10\n\n#define LUSOL_INFORM_MIN             LUSOL_INFORM_RANKLOSS\n#define LUSOL_INFORM_MAX             LUSOL_INFORM_NOMEMLEFT\n\n#define LUSOL_INFORM_GETLAST        10  /* Code for LUSOL_informstr. */\n#define LUSOL_INFORM_SERIOUS         LUSOL_INFORM_LUUNSTABLE\n\n\n/* Prototypes for call-back functions                                        */\n/* ------------------------------------------------------------------------- */\ntypedef void LUSOLlogfunc(void *lp, void *userhandle, char *buf);\n\n\n/* Sparse matrix data */\ntypedef struct _LUSOLmat {\n  REAL *a;\n  int  *lenx, *indr, *indc, *indx;\n} LUSOLmat;\n\n\n/* The main LUSOL data record */\n/* ------------------------------------------------------------------------- */\ntypedef struct _LUSOLrec {\n\n  /* General data */\n  FILE         *outstream;           /* Output stream, initialized to STDOUT */\n  LUSOLlogfunc *writelog;\n    void       *loghandle;\n  LUSOLlogfunc *debuginfo;\n\n  /* Parameter storage arrays */\n  int    luparm[LUSOL_IP_LASTITEM + 1];\n  REAL   parmlu[LUSOL_RP_LASTITEM + 1];\n\n  /* Arrays of length lena+1 */\n  int    lena, nelem;\n  int    *indc, *indr;\n  REAL   *a;\n\n  /* Arrays of length maxm+1 (row storage) */\n  int    maxm, m;\n  int    *lenr, *ip, *iqloc, *ipinv, *locr;\n\n  /* Arrays of length maxn+1 (column storage) */\n  int    maxn, n;\n  int    *lenc, *iq, *iploc, *iqinv, *locc;\n  REAL   *w, *vLU6L;\n\n  /* List of singular columns, with dynamic size allocation */\n  int    *isingular;\n\n  /* Extra arrays of length n for TCP and keepLU == FALSE */\n  REAL   *Ha, *diagU;\n  int    *Hj, *Hk;\n\n  /* Extra arrays of length m for TRP*/\n  REAL   *amaxr;\n\n  /* Extra array for L0 and U stored by row/column for faster btran/ftran */\n  LUSOLmat *L0;\n  LUSOLmat *U;\n\n  /* Miscellaneous data */\n  int    expanded_a;\n  int    replaced_c;\n  int    replaced_r;\n\n} LUSOLrec;\n\n\nLUSOLrec *LUSOL_create(FILE *outstream, int msgfil, int pivotmodel, int updatelimit);\nMYBOOL LUSOL_sizeto(LUSOLrec *LUSOL, int init_r, int init_c, int init_a);\nMYBOOL LUSOL_assign(LUSOLrec *LUSOL, int iA[], int jA[], REAL Aij[],\n                                     int nzcount, MYBOOL istriplet);\nvoid LUSOL_clear(LUSOLrec *LUSOL, MYBOOL nzonly);\nvoid LUSOL_free(LUSOLrec *LUSOL);\n\nLUSOLmat *LUSOL_matcreate(int dim, int nz);\nvoid LUSOL_matfree(LUSOLmat **mat);\n\nint LUSOL_loadColumn(LUSOLrec *LUSOL, int iA[], int jA, REAL Aij[], int nzcount, int offset1);\nvoid LUSOL_setpivotmodel(LUSOLrec *LUSOL, int pivotmodel, int initlevel);\nint LUSOL_factorize(LUSOLrec *LUSOL);\nint LUSOL_replaceColumn(LUSOLrec *LUSOL, int jcol, REAL v[]);\n\nMYBOOL LUSOL_tightenpivot(LUSOLrec *LUSOL);\nMYBOOL LUSOL_addSingularity(LUSOLrec *LUSOL, int singcol, int *inform);\nint LUSOL_getSingularity(LUSOLrec *LUSOL, int singitem);\nint LUSOL_findSingularityPosition(LUSOLrec *LUSOL, int singcol);\n\nchar *LUSOL_pivotLabel(LUSOLrec *LUSOL);\nchar *LUSOL_informstr(LUSOLrec *LUSOL, int inform);\nREAL LUSOL_vecdensity(LUSOLrec *LUSOL, REAL V[]);\nvoid LUSOL_report(LUSOLrec *LUSOL, int msglevel, char *format, ...);\nvoid LUSOL_timer(LUSOLrec *LUSOL, int timerid, char *text);\n\nint LUSOL_ftran(LUSOLrec *LUSOL, REAL b[], int NZidx[], MYBOOL prepareupdate);\nint LUSOL_btran(LUSOLrec *LUSOL, REAL b[], int NZidx[]);\n\nvoid LU1FAC(LUSOLrec *LUSOL, int *INFORM);\nMYBOOL LU1L0(LUSOLrec *LUSOL, LUSOLmat **mat, int *inform);\nvoid LU6SOL(LUSOLrec *LUSOL, int MODE, REAL V[], REAL W[], int NZidx[], int *INFORM);\nvoid LU8RPC(LUSOLrec *LUSOL, int MODE1, int MODE2,\n            int JREP, REAL V[], REAL W[],\n            int *INFORM, REAL *DIAG, REAL *VNORM);\n\nvoid LUSOL_dump(FILE *output, LUSOLrec *LUSOL);\n\n\nvoid print_L0(LUSOLrec *LUSOL);\n\n\n#endif /* HEADER_LUSOL */\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/bfp/bfp_LUSOL/LUSOL/lusol1.c",
    "content": "\n/* ==================================================================\n   lu1DCP factors a dense m x n matrix A by Gaussian elimination,\n   using Complete Pivoting (row and column interchanges) for stability.\n   This version also uses column interchanges if all elements in a\n   pivot column are smaller than (or equal to) \"small\".  Such columns\n   are changed to zero and permuted to the right-hand end.\n   As in LINPACK's dgefa, ipvt(!) keeps track of pivot rows.\n   Rows of U are interchanged, but we don't have to physically\n   permute rows of L.  In contrast, column interchanges are applied\n   directly to the columns of both L and U, and to the column\n   permutation vector iq(*).\n   ------------------------------------------------------------------\n   On entry:\n      a       Array holding the matrix A to be factored.\n      lda     The leading dimension of the array  a.\n      m       The number of rows    in  A.\n      n       The number of columns in  A.\n      small   A drop tolerance.  Must be zero or positive.\n\n   On exit:\n      a       An upper triangular matrix and the multipliers\n              which were used to obtain it.\n              The factorization can be written  A = L*U  where\n              L  is a product of permutation and unit lower\n              triangular matrices and  U  is upper triangular.\n      nsing   Number of singularities detected.\n      ipvt    Records the pivot rows.\n      iq      A vector to which column interchanges are applied.\n   ------------------------------------------------------------------\n   01 May 2002: First dense Complete Pivoting, derived from lu1DPP.\n   07 May 2002: Another break needed at end of first loop.\n   07 May 2002: Current version of lu1DCP.\n   ================================================================== */\nvoid LU1DCP(LUSOLrec *LUSOL, REAL DA[], int LDA, int M, int N, REAL SMALL,\n            int *NSING, int IPVT[], int IX[])\n{\n\n  int       I, J, K, KP1, L, LAST, LENCOL, IMAX, JMAX, JLAST, JNEW;\n  REAL      AIJMAX, AJMAX;\n  register REAL T;\n#ifdef LUSOLFastDenseIndex\n  register REAL *DA1, *DA2;\n  int IDA1, IDA2;\n#else\n  register int IDA1, IDA2;\n#endif\n\n  *NSING = 0;\n  LENCOL = M+1;\n  LAST = N;\n/*     -----------------------------------------------------------------\n        Start of elimination loop.\n       ----------------------------------------------------------------- */\n  for(K = 1; K <= N; K++) {\n    KP1 = K+1;\n    LENCOL--;\n/*      Find the biggest aij in row imax and column jmax. */\n    AIJMAX = ZERO;\n    IMAX = K;\n    JMAX = K;\n    JLAST = LAST;\n    for(J = K; J <= JLAST; J++) {\nx10:\n      L = idamax(LENCOL,DA+DAPOS(K,J)-LUSOL_ARRAYOFFSET,1)+K-1;\n      AJMAX = fabs(DA[DAPOS(L,J)]);\n      if(AJMAX<=SMALL) {\n/*     ========================================================\n        Do column interchange, changing old column to zero.\n        Reduce  \"last\"  and try again with same j.\n       ======================================================== */\n        (*NSING)++;\n        JNEW = IX[LAST];\n        IX[LAST] = IX[J];\n        IX[J] = JNEW;\n#ifdef LUSOLFastDenseIndex\n        DA1 = DA+DAPOS(0,LAST);\n        DA2 = DA+DAPOS(0,J);\n        for(I = 1; I <= K-1; I++) {\n          DA1++;\n          DA2++;\n          T = *DA1;\n          *DA1 = *DA2;\n          *DA2 = T;\n#else\n        for(I = 1; I <= K-1; I++) {\n          IDA1 = DAPOS(I,LAST);\n          IDA2 = DAPOS(I,J);\n          T = DA[IDA1];\n          DA[IDA1] = DA[IDA2];\n          DA[IDA2] = T;\n#endif\n        }\n#ifdef LUSOLFastDenseIndex\n        for(I = K; I <= M; I++) {\n          DA1++;\n          DA2++;\n          T = *DA1;\n          *DA1 = ZERO;\n          *DA2 = T;\n#else\n        for(I = K; I <= M; I++) {\n          IDA1 = DAPOS(I,LAST);\n          IDA2 = DAPOS(I,J);\n          T = DA[IDA1];\n          DA[IDA1] = ZERO;\n          DA[IDA2] = T;\n#endif\n        }\n        LAST--;\n        if(J<=LAST)\n          goto x10;\n        break;\n      }\n/*      Check if this column has biggest aij so far. */\n      if(AIJMAX<AJMAX) {\n        AIJMAX = AJMAX;\n        IMAX = L;\n        JMAX = J;\n      }\n      if(J>=LAST)\n        break;\n    }\n    IPVT[K] = IMAX;\n    if(JMAX!=K) {\n/*     ==========================================================\n        Do column interchange (k and jmax).\n       ========================================================== */\n      JNEW = IX[JMAX];\n      IX[JMAX] = IX[K];\n      IX[K] = JNEW;\n#ifdef LUSOLFastDenseIndex\n      DA1 = DA+DAPOS(0,JMAX);\n      DA2 = DA+DAPOS(0,K);\n      for(I = 1; I <= M; I++) {\n        DA1++;\n        DA2++;\n        T = *DA1;\n        *DA1 = *DA2;\n        *DA2 = T;\n#else\n      for(I = 1; I <= M; I++) {\n        IDA1 = DAPOS(I,JMAX);\n        IDA2 = DAPOS(I,K);\n        T = DA[IDA1];\n        DA[IDA1] = DA[IDA2];\n        DA[IDA2] = T;\n#endif\n      }\n    }\n    if(M>K) {\n/*     ===========================================================\n        Do row interchange if necessary.\n       =========================================================== */\n      if(IMAX!=K) {\n        IDA1 = DAPOS(IMAX,K);\n        IDA2 = DAPOS(K,K);\n        T = DA[IDA1];\n        DA[IDA1] = DA[IDA2];\n        DA[IDA2] = T;\n      }\n/*     ===========================================================\n        Compute multipliers.\n        Do row elimination with column indexing.\n       =========================================================== */\n      T = -ONE/DA[DAPOS(K,K)];\n      dscal(M-K,T,DA+DAPOS(KP1,K)-LUSOL_ARRAYOFFSET,1);\n      for(J = KP1; J <= LAST; J++) {\n        IDA1 = DAPOS(IMAX,J);\n        T = DA[IDA1];\n        if(IMAX!=K) {\n          IDA2 = DAPOS(K,J);\n          DA[IDA1] = DA[IDA2];\n          DA[IDA2] = T;\n        }\n        daxpy(M-K,T,DA+DAPOS(KP1,K)-LUSOL_ARRAYOFFSET,1,\n                    DA+DAPOS(KP1,J)-LUSOL_ARRAYOFFSET,1);\n      }\n    }\n    else\n      break;\n    if(K>=LAST)\n      break;\n  }\n/*      Set ipvt(*) for singular rows. */\n  for(K = LAST+1; K <= M; K++)\n    IPVT[K] = K;\n\n}\n\n/* ==================================================================\n   lu1DPP factors a dense m x n matrix A by Gaussian elimination,\n   using row interchanges for stability, as in dgefa from LINPACK.\n   This version also uses column interchanges if all elements in a\n   pivot column are smaller than (or equal to) \"small\".  Such columns\n   are changed to zero and permuted to the right-hand end.\n   As in LINPACK, ipvt(*) keeps track of pivot rows.\n   Rows of U are interchanged, but we don't have to physically\n   permute rows of L.  In contrast, column interchanges are applied\n   directly to the columns of both L and U, and to the column\n   permutation vector iq(*).\n   ------------------------------------------------------------------\n   On entry:\n        a       Array holding the matrix A to be factored.\n        lda     The leading dimension of the array  a.\n        m       The number of rows    in  A.\n        n       The number of columns in  A.\n        small   A drop tolerance.  Must be zero or positive.\n\n   On exit:\n        a       An upper triangular matrix and the multipliers\n                which were used to obtain it.\n                The factorization can be written  A = L*U  where\n                L  is a product of permutation and unit lower\n                triangular matrices and  U  is upper triangular.\n        nsing   Number of singularities detected.\n        ipvt    Records the pivot rows.\n        iq      A vector to which column interchanges are applied.\n   ------------------------------------------------------------------\n   02 May 1989: First version derived from dgefa\n                in LINPACK (version dated 08/14/78).\n   05 Feb 1994: Generalized to treat rectangular matrices\n                and use column interchanges when necessary.\n                ipvt is retained, but column permutations are applied\n                directly to iq(*).\n   21 Dec 1994: Bug found via example from Steve Dirkse.\n                Loop 100 added to set ipvt(*) for singular rows.\n   ================================================================== */\nvoid LU1DPP(LUSOLrec *LUSOL, REAL DA[], int LDA, int M, int N, REAL SMALL,\n            int *NSING, int IPVT[], int IX[])\n{\n  int            I, J, K, KP1, L, LAST, LENCOL;\n  register REAL T;\n#ifdef LUSOLFastDenseIndex\n  register REAL *DA1, *DA2;\n  int IDA1, IDA2;\n#else\n  register int IDA1, IDA2;\n#endif\n\n  *NSING = 0;\n  K = 1;\n  LAST = N;\n/*      ------------------------------------------------------------------\n        Start of elimination loop.\n        ------------------------------------------------------------------ */\nx10:\n  KP1 = K+1;\n  LENCOL = (M-K)+1;\n/*      Find l, the pivot row. */\n  L = (idamax(LENCOL,DA+DAPOS(K,K)-LUSOL_ARRAYOFFSET,1)+K)-1;\n  IPVT[K] = L;\n  if(fabs(DA[DAPOS(L,K)])<=SMALL) {\n/*         ===============================================================\n           Do column interchange, changing old pivot column to zero.\n           Reduce  \"last\"  and try again with same k.\n           =============================================================== */\n    (*NSING)++;\n    J = IX[LAST];\n    IX[LAST] = IX[K];\n    IX[K] = J;\n#ifdef LUSOLFastDenseIndex\n    DA1 = DA+DAPOS(0,LAST);\n    DA2 = DA+DAPOS(0,K);\n    for(I = 1; I <= K-1; I++) {\n      DA1++;\n      DA2++;\n      T = *DA1;\n      *DA1 = *DA2;\n      *DA2 = T;\n#else\n    for(I = 1; I <= K-1; I++) {\n      IDA1 = DAPOS(I,LAST);\n      IDA2 = DAPOS(I,K);\n      T = DA[IDA1];\n      DA[IDA1] = DA[IDA2];\n      DA[IDA2] = T;\n#endif\n    }\n#ifdef LUSOLFastDenseIndex\n    for(I = K; I <= M; I++) {\n      DA1++;\n      DA2++;\n      T = *DA1;\n      *DA1 = ZERO;\n      *DA2 = T;\n#else\n    for(I = K; I <= M; I++) {\n      IDA1 = DAPOS(I,LAST);\n      IDA2 = DAPOS(I,K);\n      T = DA[IDA1];\n      DA[IDA1] = ZERO;\n      DA[IDA2] = T;\n#endif\n    }\n    LAST = LAST-1;\n    if(K<=LAST)\n      goto x10;\n  }\n  else if(M>K) {\n/*         ===============================================================\n           Do row interchange if necessary.\n           =============================================================== */\n    if(L!=K) {\n      IDA1 = DAPOS(L,K);\n      IDA2 = DAPOS(K,K);\n      T = DA[IDA1];\n      DA[IDA1] = DA[IDA2];\n      DA[IDA2] = T;\n    }\n/*         ===============================================================\n           Compute multipliers.\n           Do row elimination with column indexing.\n           =============================================================== */\n    T = -ONE/DA[DAPOS(K,K)];\n    dscal(M-K,T,DA+DAPOS(KP1,K)-LUSOL_ARRAYOFFSET,1);\n    for(J = KP1; J <= LAST; J++) {\n      IDA1 = DAPOS(L,J);\n      T = DA[IDA1];\n      if(L!=K) {\n        IDA2 = DAPOS(K,J);\n        DA[IDA1] = DA[IDA2];\n        DA[IDA2] = T;\n      }\n      daxpy(M-K,T,DA+DAPOS(KP1,K)-LUSOL_ARRAYOFFSET,1,\n                  DA+DAPOS(KP1,J)-LUSOL_ARRAYOFFSET,1);\n    }\n    K++;\n    if(K<=LAST)\n      goto x10;\n  }\n/*      Set ipvt(*) for singular rows. */\n  for(K = LAST+1; K <= M; K++)\n    IPVT[K] = K;\n\n}\n\n\n/* ==================================================================\n   lu1pq1  constructs a permutation  iperm  from the array  len.\n   ------------------------------------------------------------------\n   On entry:\n   len(i)  holds the number of nonzeros in the i-th row (say)\n           of an m by n matrix.\n   num(*)  can be anything (workspace).\n\n   On exit:\n   iperm   contains a list of row numbers in the order\n           rows of length 0,  rows of length 1,..., rows of length n.\n   loc(nz) points to the first row containing  nz  nonzeros,\n           nz = 1, n.\n   inv(i)  points to the position of row i within iperm(*).\n   ================================================================== */\nvoid LU1PQ1(LUSOLrec *LUSOL, int M, int N, int LEN[],\n            int IPERM[], int LOC[], int INV[], int NUM[])\n{\n  int NZEROS, NZ, I, L;\n\n/*      Count the number of rows of each length. */\n  NZEROS = 0;\n  for(NZ = 1; NZ <= N; NZ++) {\n    NUM[NZ] = 0;\n    LOC[NZ] = 0;\n  }\n  for(I = 1; I <= M; I++) {\n    NZ = LEN[I];\n    if(NZ==0)\n      NZEROS++;\n    else\n      NUM[NZ]++;\n  }\n/*      Set starting locations for each length. */\n  L = NZEROS+1;\n  for(NZ = 1; NZ <= N; NZ++) {\n    LOC[NZ] = L;\n    L += NUM[NZ];\n    NUM[NZ] = 0;\n  }\n/*      Form the list. */\n  NZEROS = 0;\n  for(I = 1; I <= M; I++) {\n    NZ = LEN[I];\n    if(NZ==0) {\n      NZEROS++;\n      IPERM[NZEROS] = I;\n    }\n    else {\n      L = LOC[NZ]+NUM[NZ];\n      IPERM[L] = I;\n      NUM[NZ]++;\n    }\n  }\n/*      Define the inverse of iperm. */\n  for(L = 1; L <= M; L++) {\n    I = IPERM[L];\n    INV[I] = L;\n  }\n}\n\n/* ==================================================================\n   lu1pq2 frees the space occupied by the pivot row,\n   and updates the column permutation iq.\n   Also used to free the pivot column and update the row perm ip.\n   ------------------------------------------------------------------\n   nzpiv   (input)    is the length of the pivot row (or column).\n   nzchng  (output)   is the net change in total nonzeros.\n   ------------------------------------------------------------------\n   14 Apr 1989  First version.\n   ================================================================== */\nvoid LU1PQ2(LUSOLrec *LUSOL, int NZPIV, int *NZCHNG,\n            int IND[], int LENOLD[], int LENNEW[], int IXLOC[], int IX[], int IXINV[])\n{\n  int LR, J, NZ, NZNEW, L, NEXT, LNEW, JNEW;\n\n  *NZCHNG = 0;\n  for(LR = 1; LR <= NZPIV; LR++) {\n    J = IND[LR];\n    IND[LR] = 0;\n    NZ = LENOLD[LR];\n    NZNEW = LENNEW[J];\n    if(NZ!=NZNEW) {\n      L = IXINV[J];\n      *NZCHNG = (*NZCHNG+NZNEW)-NZ;\n/*            l above is the position of column j in iq  (so j = iq(l)). */\n      if(NZ<NZNEW) {\n/*               Column  j  has to move towards the end of  iq. */\nx110:\n        NEXT = NZ+1;\n        LNEW = IXLOC[NEXT]-1;\n        if(LNEW!=L) {\n          JNEW = IX[LNEW];\n          IX[L] = JNEW;\n          IXINV[JNEW] = L;\n        }\n        L = LNEW;\n        IXLOC[NEXT] = LNEW;\n        NZ = NEXT;\n        if(NZ<NZNEW)\n          goto x110;\n      }\n      else {\n/*               Column  j  has to move towards the front of  iq. */\nx120:\n        LNEW = IXLOC[NZ];\n        if(LNEW!=L) {\n          JNEW = IX[LNEW];\n          IX[L] = JNEW;\n          IXINV[JNEW] = L;\n        }\n        L = LNEW;\n        IXLOC[NZ] = LNEW+1;\n        NZ = NZ-1;\n        if(NZ>NZNEW)\n          goto x120;\n      }\n      IX[LNEW] = J;\n      IXINV[J] = LNEW;\n    }\n  }\n}\n\n/* ==================================================================\n   lu1pq3  looks at the permutation  iperm(*)  and moves any entries\n   to the end whose corresponding length  len(*)  is zero.\n   ------------------------------------------------------------------\n   09 Feb 1994: Added work array iw(*) to improve efficiency.\n   ================================================================== */\nvoid LU1PQ3(LUSOLrec *LUSOL, int MN, int LEN[], int IPERM[], int IW[], int *NRANK)\n{\n  int NZEROS, K, I;\n\n  *NRANK = 0;\n  NZEROS = 0;\n  for(K = 1; K <= MN; K++) {\n    I = IPERM[K];\n    if(LEN[I]==0) {\n      NZEROS++;\n      IW[NZEROS] = I;\n    }\n    else {\n      (*NRANK)++;\n      IPERM[*NRANK] = I;\n    }\n  }\n  for(K = 1; K <= NZEROS; K++)\n    IPERM[(*NRANK)+K] = IW[K];\n}\n\n/* ==================================================================\n   lu1rec\n   ------------------------------------------------------------------\n   On exit:\n   ltop         is the length of useful entries in ind(*), a(*).\n   ind(ltop+1)  is \"i\" such that len(i), loc(i) belong to the last\n                item in ind(*), a(*).\n   ------------------------------------------------------------------\n   00 Jun 1983: Original version of lu1rec followed John Reid's\n                compression routine in LA05.  It recovered\n                space in ind(*) and optionally a(*)\n                by eliminating entries with ind(l) = 0.\n                The elements of ind(*) could not be negative.\n                If len(i) was positive, entry i contained\n                that many elements, starting at  loc(i).\n                Otherwise, entry i was eliminated.\n   23 Mar 2001: Realised we could have len(i) = 0 in rare cases!\n                (Mostly during TCP when the pivot row contains\n                a column of length 1 that couldn't be a pivot.)\n                Revised storage scheme to\n                   keep        entries with       ind(l) >  0,\n                   squeeze out entries with -n <= ind(l) <= 0,\n                and to allow len(i) = 0.\n                Empty items are moved to the end of the compressed\n                ind(*) and/or a(*) arrays are given one empty space.\n                Items with len(i) < 0 are still eliminated.\n   27 Mar 2001: Decided to use only ind(l) > 0 and = 0 in lu1fad.\n                Still have to keep entries with len(i) = 0.\n   ================================================================== */\nvoid LU1REC(LUSOLrec *LUSOL, int N, MYBOOL REALS, int *LTOP,\n                             int IND[], int LEN[], int LOC[])\n{\n  int  NEMPTY, I, LENI, L, LEND, K, KLAST, ILAST, LPRINT;\n\n  NEMPTY = 0;\n  for(I = 1; I <= N; I++) {\n    LENI = LEN[I];\n    if(LENI>0) {\n      L = (LOC[I]+LENI)-1;\n      LEN[I] = IND[L];\n      IND[L] = -(N+I);\n    }\n    else if(LENI==0)\n      NEMPTY++;\n  }\n  K = 0;\n/*      Previous k */\n  KLAST = 0;\n/*      Last entry moved. */\n  ILAST = 0;\n  LEND = *LTOP;\n  for(L = 1; L <= LEND; L++) {\n    I = IND[L];\n    if(I>0) {\n      K++;\n      IND[K] = I;\n      if(REALS)\n        LUSOL->a[K] = LUSOL->a[L];\n    }\n    else if(I<-N) {\n/*            This is the end of entry  i. */\n      I = -(N+I);\n      ILAST = I;\n      K++;\n      IND[K] = LEN[I];\n      if(REALS)\n        LUSOL->a[K] = LUSOL->a[L];\n      LOC[I] = KLAST+1;\n      LEN[I] = K-KLAST;\n      KLAST = K;\n    }\n  }\n/*      Move any empty items to the end, adding 1 free entry for each. */\n  if(NEMPTY>0) {\n    for(I = 1; I <= N; I++) {\n      if(LEN[I]==0) {\n        K++;\n        LOC[I] = K;\n        IND[K] = 0;\n        ILAST = I;\n      }\n    }\n  }\n  LPRINT = LUSOL->luparm[LUSOL_IP_PRINTLEVEL];\n  if(LPRINT>=LUSOL_MSG_PIVOT)\n    LUSOL_report(LUSOL, 0, \"lu1rec.  File compressed from %d to %d\\n\",\n                        *LTOP,K,REALS,NEMPTY);\n/*      ncp */\n  LUSOL->luparm[LUSOL_IP_COMPRESSIONS_LU]++;\n/*      Return ilast in ind(ltop + 1). */\n  *LTOP = K;\n  IND[(*LTOP)+1] = ILAST;\n}\n\n/* ==================================================================\n   lu1slk  sets w(j) > 0 if column j is a unit vector.\n   ------------------------------------------------------------------\n   21 Nov 2000: First version.  lu1fad needs it for TCP.\n                Note that w(*) is nominally an integer array,\n                but the only spare space is the double array w(*).\n   ================================================================== */\nvoid LU1SLK(LUSOLrec *LUSOL)\n{\n  int J, LC1, LQ, LQ1, LQ2;\n\n  for(J = 1; J <= LUSOL->n; J++) {\n    LUSOL->w[J] = 0;\n  }\n  LQ1 = (LUSOL->iqloc ? LUSOL->iqloc[1] : LUSOL->n+1);\n/*  LQ1 = LUSOL->iqloc[1];   This is the original version; correction above by Yin Zhang */\n  LQ2 = LUSOL->n;\n  if(LUSOL->m>1)\n    LQ2 = LUSOL->iqloc[2]-1;\n  for(LQ = LQ1; LQ <= LQ2; LQ++) {\n    J = LUSOL->iq[LQ];\n    LC1 = LUSOL->locc[J];\n    if(fabs(LUSOL->a[LC1])==1) {\n      LUSOL->w[J] = 1;\n    }\n  }\n}\n\n/* ==================================================================\n   lu1gau does most of the work for each step of Gaussian elimination.\n   A multiple of the pivot column is added to each other column j\n   in the pivot row.  The column list is fully updated.\n   The row list is updated if there is room, but some fill-ins may\n   remain, as indicated by ifill and jfill.\n   ------------------------------------------------------------------\n   Input:\n      ilast    is the row    at the end of the row    list.\n      jlast    is the column at the end of the column list.\n      lfirst   is the first column to be processed.\n      lu + 1   is the corresponding element of U in au(*).\n      nfill    keeps track of pending fill-in.\n      a(*)     contains the nonzeros for each column j.\n      indc(*)  contains the row indices for each column j.\n      al(*)    contains the new column of L.  A multiple of it is\n               used to modify each column.\n      mark(*)  has been set to -1, -2, -3, ... in the rows\n               corresponding to nonzero 1, 2, 3, ... of the col of L.\n      au(*)    contains the new row of U.  Each nonzero gives the\n               required multiple of the column of L.\n\n   Workspace:\n      markl(*) marks the nonzeros of L actually used.\n               (A different mark, namely j, is used for each column.)\n\n   Output:\n      ilast     New last row    in the row    list.\n      jlast     New last column in the column list.\n      lfirst    = 0 if all columns were completed,\n                > 0 otherwise.\n      lu        returns the position of the last nonzero of U\n                actually used, in case we come back in again.\n      nfill     keeps track of the total extra space needed in the\n                row file.\n      ifill(ll) counts pending fill-in for rows involved in the new\n                column of L.\n      jfill(lu) marks the first pending fill-in stored in columns\n                involved in the new row of U.\n   ------------------------------------------------------------------\n   16 Apr 1989: First version of lu1gau.\n   23 Apr 1989: lfirst, lu, nfill are now input and output\n                to allow re-entry if elimination is interrupted.\n   23 Mar 2001: Introduced ilast, jlast.\n   27 Mar 2001: Allow fill-in \"in situ\" if there is already room\n                up to but NOT INCLUDING the end of the\n                row or column file.\n                Seems safe way to avoid overwriting empty rows/cols\n                at the end.  (May not be needed though, now that we\n                have ilast and jlast.)\n   ================================================================== */\nvoid LU1GAU(LUSOLrec *LUSOL, int MELIM, int NSPARE,\n            REAL SMALL, int LPIVC1, int LPIVC2, int *LFIRST, int LPIVR2,\n            int LFREE, int MINFRE, int ILAST, int *JLAST, int *LROW, int *LCOL,\n            int *LU, int *NFILL,\n            int MARK[],  REAL AL[], int MARKL[], REAL AU[], int IFILL[], int JFILL[])\n{\n  MYBOOL ATEND;\n  int    LR, J, LENJ, NFREE, LC1, LC2, NDONE, NDROP, L, I, LL, K,\n         LR1, LAST, LREP, L1, L2, LC, LENI;\n  register REAL UJ;\n  REAL   AIJ;\n\n  for(LR = *LFIRST; LR <= LPIVR2; LR++) {\n    J = LUSOL->indr[LR];\n    LENJ = LUSOL->lenc[J];\n    NFREE = LFREE - *LCOL;\n    if(NFREE<MINFRE)\n      goto x900;\n/*         ---------------------------------------------------------------\n           Inner loop to modify existing nonzeros in column  j.\n           Loop 440 performs most of the arithmetic involved in the\n           whole LU factorization.\n           ndone counts how many multipliers were used.\n           ndrop counts how many modified nonzeros are negligibly small.\n           --------------------------------------------------------------- */\n    (*LU)++;\n    UJ = AU[*LU];\n    LC1 = LUSOL->locc[J];\n    LC2 = (LC1+LENJ)-1;\n    ATEND = (MYBOOL) (J==*JLAST);\n    NDONE = 0;\n    if(LENJ==0)\n      goto x500;\n    NDROP = 0;\n    for(L = LC1; L <= LC2; L++) {\n      I = LUSOL->indc[L];\n      LL = -MARK[I];\n      if(LL>0) {\n        NDONE++;\n        MARKL[LL] = J;\n        LUSOL->a[L] += AL[LL]*UJ;\n        if(fabs(LUSOL->a[L])<=SMALL) {\n          NDROP++;\n        }\n      }\n    }\n/*         ---------------------------------------------------------------\n           Remove any negligible modified nonzeros from both\n           the column file and the row file.\n           --------------------------------------------------------------- */\n    if(NDROP==0)\n      goto x500;\n    K = LC1;\n    for(L = LC1; L <= LC2; L++) {\n      I = LUSOL->indc[L];\n      if(fabs(LUSOL->a[L])<=SMALL)\n        goto x460;\n      LUSOL->a[K] = LUSOL->a[L];\n      LUSOL->indc[K] = I;\n      K++;\n      continue;\n/*            Delete the nonzero from the row file. */\nx460:\n      LENJ--;\n      LUSOL->lenr[I]--;\n      LR1 = LUSOL->locr[I];\n      LAST = LR1+LUSOL->lenr[I];\n      for(LREP = LR1; LREP <= LAST; LREP++) {\n        if(LUSOL->indr[LREP]==J)\n          break;\n      }\n      LUSOL->indr[LREP] = LUSOL->indr[LAST];\n      LUSOL->indr[LAST] = 0;\n      if(I==ILAST)\n        (*LROW)--;\n    }\n/*         Free the deleted elements from the column file. */\n#ifdef LUSOLFastClear\n    MEMCLEAR(LUSOL->indc+K, LC2-K+1);\n#else\n    for(L = K; L <= LC2; L++)\n      LUSOL->indc[L] = ZERO;\n#endif\n    if(ATEND)\n      *LCOL = K-1;\n/*         ---------------------------------------------------------------\n           Deal with the fill-in in column j.\n           --------------------------------------------------------------- */\nx500:\n    if(NDONE==MELIM)\n      goto x590;\n/*         See if column j already has room for the fill-in. */\n    if(ATEND)\n      goto x540;\n    LAST = (LC1+LENJ)-1;\n    L1 = LAST+1;\n    L2 = (LAST+MELIM)-NDONE;\n/*      27 Mar 2001: Be sure it's not at or past end of the col file. */\n    if(L2>=*LCOL)\n      goto x520;\n    for(L = L1; L <= L2; L++) {\n      if(LUSOL->indc[L]!=0)\n        goto x520;\n    }\n    goto x540;\n/*         We must move column j to the end of the column file.\n           First, leave some spare room at the end of the\n           current last column. */\nx520:\n#if 1\n    L1 = (*LCOL)+1;\n    L2 = (*LCOL)+NSPARE;\n    *LCOL = L2;\n    for(L = L1; L <= L2; L++) {\n#else\n    for(L = (*LCOL)+1; L <= (*LCOL)+NSPARE; L++) {\n      *LCOL = L;  /* ****** ERROR ???? */\n#endif\n/*      Spare space is free. */\n      LUSOL->indc[L] = 0;\n    }\n    ATEND = TRUE;\n    *JLAST = J;\n    L1 = LC1;\n    L2 = *LCOL;\n    LC1 = L2+1;\n    LUSOL->locc[J] = LC1;\n    for(L = L1; L <= LAST; L++) {\n      L2++;\n      LUSOL->a[L2] = LUSOL->a[L];\n      LUSOL->indc[L2] = LUSOL->indc[L];\n/*      Free space. */\n      LUSOL->indc[L] = 0;\n    }\n    *LCOL = L2;\n/*         ---------------------------------------------------------------\n           Inner loop for the fill-in in column j.\n           This is usually not very expensive.\n           --------------------------------------------------------------- */\nx540:\n    LAST = (LC1+LENJ)-1;\n    LL = 0;\n    for(LC = LPIVC1; LC <= LPIVC2; LC++) {\n      LL++;\n      if(MARKL[LL]==J)\n        continue;\n      AIJ = AL[LL]*UJ;\n      if(fabs(AIJ)<=SMALL)\n        continue;\n      LENJ++;\n      LAST++;\n      LUSOL->a[LAST] = AIJ;\n      I = LUSOL->indc[LC];\n      LUSOL->indc[LAST] = I;\n      LENI = LUSOL->lenr[I];\n/*            Add 1 fill-in to row i if there is already room.\n              27 Mar 2001: Be sure it's not at or past the }\n                           of the row file. */\n      L = LUSOL->locr[I]+LENI;\n      if(L>=*LROW)\n        goto x550;\n      if(LUSOL->indr[L]>0)\n        goto x550;\n      LUSOL->indr[L] = J;\n      LUSOL->lenr[I] = LENI+1;\n      continue;\n/*            Row i does not have room for the fill-in.\n              Increment ifill(ll) to count how often this has\n              happened to row i.  Also, add m to the row index\n              indc(last) in column j to mark it as a fill-in that is\n              still pending.\n              If this is the first pending fill-in for row i,\n              nfill includes the current length of row i\n              (since the whole row has to be moved later).\n              If this is the first pending fill-in for column j,\n              jfill(lu) records the current length of column j\n              (to shorten the search for pending fill-ins later). */\nx550:\n      if(IFILL[LL]==0)\n        (*NFILL) += LENI+NSPARE;\n      if(JFILL[*LU]==0)\n        JFILL[*LU] = LENJ;\n      (*NFILL)++;\n      IFILL[LL]++;\n      LUSOL->indc[LAST] = LUSOL->m+I;\n    }\n    if(ATEND)\n      *LCOL = LAST;\n/*         End loop for column  j.  Store its final length. */\nx590:\n    LUSOL->lenc[J] = LENJ;\n  }\n/*      Successful completion. */\n  *LFIRST = 0;\n  return;\n/*      Interruption.  We have to come back in after the\n        column file is compressed.  Give lfirst a new value.\n        lu and nfill will retain their current values. */\nx900:\n  *LFIRST = LR;\n}\n\n/* ==================================================================\n   lu1mar  uses a Markowitz criterion to select a pivot element\n   for the next stage of a sparse LU factorization,\n   subject to a Threshold Partial Pivoting stability criterion (TPP)\n   that bounds the elements of L.\n   ------------------------------------------------------------------\n   gamma  is \"gamma\" in the tie-breaking rule TB4 in the LUSOL paper.\n   ------------------------------------------------------------------\n   Search cols of length nz = 1, then rows of length nz = 1,\n   then   cols of length nz = 2, then rows of length nz = 2, etc.\n   ------------------------------------------------------------------\n   00 Jan 1986  Version documented in LUSOL paper:\n                Gill, Murray, Saunders and Wright (1987),\n                Maintaining LU factors of a general sparse matrix,\n                Linear algebra and its applications 88/89, 239-270.\n   02 Feb 1989  Following Suhl and Aittoniemi (1987), the largest\n                element in each column is now kept at the start of\n                the column, i.e. in position locc(j) of a and indc.\n                This should speed up the Markowitz searches.\n   26 Apr 1989  Both columns and rows searched during spars1 phase.\n                Only columns searched during spars2 phase.\n                maxtie replaced by maxcol and maxrow.\n   05 Nov 1993  Initializing  \"mbest = m * n\"  wasn't big enough when\n                m = 10, n = 3, and last column had 7 nonzeros.\n   09 Feb 1994  Realised that \"mbest = maxmn * maxmn\" might overflow.\n                Changed to    \"mbest = maxmn * 1000\".\n   27 Apr 2000  On large example from Todd Munson,\n                that allowed  \"if (mbest .le. nz1**2) go to 900\"\n                to exit before any pivot had been found.\n                Introduced kbest = mbest / nz1.\n                Most pivots can be rejected with no integer multiply.\n                TRUE merit is evaluated only if it's as good as the\n                best so far (or better).  There should be no danger\n                of integer overflow unless A is incredibly\n                large and dense.\n   10 Sep 2000  TCP, aijtol added for Threshold Complete Pivoting.\n   ================================================================== */\nvoid LU1MAR(LUSOLrec *LUSOL, int MAXMN, MYBOOL TCP, REAL AIJTOL, REAL LTOL,\n            int MAXCOL, int MAXROW, int *IBEST, int *JBEST, int *MBEST)\n{\n  int  KBEST, NCOL, NROW, NZ1, NZ, LQ1, LQ2, LQ, J, LC1, LC2, LC, I, LEN1, MERIT, LP1,\n       LP2, LP, LR1, LR2, LR;\n  REAL ABEST, LBEST, AMAX, AIJ, CMAX;\n\n  ABEST = ZERO;\n  LBEST = ZERO;\n  *IBEST = 0;\n  *MBEST = -1;\n  KBEST = MAXMN+1;\n  NCOL = 0;\n  NROW = 0;\n  NZ1 = 0;\n  for(NZ = 1; NZ <= MAXMN; NZ++) {\n/*         nz1    = nz - 1\n           if (mbest .le. nz1**2) go to 900 */\n    if(KBEST<=NZ1)\n      goto x900;\n    if(*IBEST>0) {\n      if(NCOL>=MAXCOL)\n        goto x200;\n    }\n    if(NZ>LUSOL->m)\n      goto x200;\n/*         ---------------------------------------------------------------\n           Search the set of columns of length  nz.\n           --------------------------------------------------------------- */\n    LQ1 = LUSOL->iqloc[NZ];\n    LQ2 = LUSOL->n;\n    if(NZ<LUSOL->m)\n      LQ2 = LUSOL->iqloc[NZ+1]-1;\n    for(LQ = LQ1; LQ <= LQ2; LQ++) {\n      NCOL = NCOL+1;\n      J = LUSOL->iq[LQ];\n      LC1 = LUSOL->locc[J];\n      LC2 = LC1+NZ1;\n      AMAX = fabs(LUSOL->a[LC1]);\n/*            Test all aijs in this column.\n              amax is the largest element (the first in the column).\n              cmax is the largest multiplier if aij becomes pivot. */\n      if(TCP) {\n/*      Nothing in whole column */\n        if(AMAX<AIJTOL)\n          continue;\n      }\n      for(LC = LC1; LC <= LC2; LC++) {\n        I = LUSOL->indc[LC];\n        LEN1 = LUSOL->lenr[I]-1;\n/*               merit  = nz1 * len1\n                 if (merit > mbest) continue; */\n        if(LEN1>KBEST)\n          continue;\n/*               aij  has a promising merit.\n                 Apply the stability test.\n                 We require  aij  to be sufficiently large compared to\n                 all other nonzeros in column  j.  This is equivalent\n                 to requiring cmax to be bounded by Ltol. */\n        if(LC==LC1) {\n/*                  This is the maximum element, amax.\n                    Find the biggest element in the rest of the column\n                    and hence get cmax.  We know cmax .le. 1, but\n                    we still want it exactly in order to break ties.\n                    27 Apr 2002: Settle for cmax = 1. */\n          AIJ = AMAX;\n          CMAX = ONE;\n/*                  cmax   = zero\n                    for (l = lc1 + 1; l <= lc2; l++)\n                       cmax  = max( cmax, abs( a(l) ) );\n                    cmax   = cmax / amax; */\n        }\n        else {\n/*                  aij is not the biggest element, so cmax .ge. 1.\n                    Bail out if cmax will be too big. */\n          AIJ = fabs(LUSOL->a[LC]);\n/*      Absolute test for Complete Pivoting */\n          if(TCP) {\n            if(AIJ<AIJTOL)\n              continue;\n/*      TPP */\n          }\n          else {\n            if(AIJ*LTOL<AMAX)\n              continue;\n          }\n          CMAX = AMAX/AIJ;\n        }\n/*               aij  is big enough.  Its maximum multiplier is cmax. */\n        MERIT = NZ1*LEN1;\n        if(MERIT==*MBEST) {\n/*                  Break ties.\n                    (Initializing mbest < 0 prevents getting here if\n                    nothing has been found yet.)\n                    In this version we minimize cmax\n                    but if it is already small we maximize the pivot. */\n          if(LBEST<=LUSOL->parmlu[LUSOL_RP_GAMMA] &&\n             CMAX<=LUSOL->parmlu[LUSOL_RP_GAMMA]) {\n            if(ABEST>=AIJ)\n              continue;\n          }\n          else {\n            if(LBEST<=CMAX)\n              continue;\n          }\n        }\n/*               aij  is the best pivot so far. */\n        *IBEST = I;\n        *JBEST = J;\n        KBEST = LEN1;\n        *MBEST = MERIT;\n        ABEST = AIJ;\n        LBEST = CMAX;\n        if(NZ==1)\n          goto x900;\n      }\n/*            Finished with that column. */\n      if(*IBEST>0) {\n        if(NCOL>=MAXCOL)\n          goto x200;\n      }\n    }\n/*         ---------------------------------------------------------------\n           Search the set of rows of length  nz.\n           --------------------------------------------------------------- */\nx200:\n/*    if (mbest .le. nz*nz1) go to 900 */\n    if(KBEST<=NZ)\n      goto x900;\n    if(*IBEST>0) {\n      if(NROW>=MAXROW)\n        goto x290;\n    }\n    if(NZ>LUSOL->n)\n      goto x290;\n    LP1 = LUSOL->iploc[NZ];\n    LP2 = LUSOL->m;\n    if(NZ<LUSOL->n)\n      LP2 = LUSOL->iploc[NZ+1]-1;\n    for(LP = LP1; LP <= LP2; LP++) {\n      NROW++;\n      I = LUSOL->ip[LP];\n      LR1 = LUSOL->locr[I];\n      LR2 = LR1+NZ1;\n      for(LR = LR1; LR <= LR2; LR++) {\n        J = LUSOL->indr[LR];\n        LEN1 = LUSOL->lenc[J]-1;\n/*               merit  = nz1 * len1\n                 if (merit .gt. mbest) continue */\n        if(LEN1>KBEST)\n          continue;\n/*               aij  has a promising merit.\n                 Find where  aij  is in column  j. */\n        LC1 = LUSOL->locc[J];\n        LC2 = LC1+LEN1;\n        AMAX = fabs(LUSOL->a[LC1]);\n        for(LC = LC1; LC <= LC2; LC++) {\n          if(LUSOL->indc[LC]==I)\n            break;\n        }\n/*               Apply the same stability test as above. */\n        AIJ = fabs(LUSOL->a[LC]);\n/*      Absolute test for Complete Pivoting */\n        if(TCP) {\n          if(AIJ<AIJTOL)\n            continue;\n        }\n        if(LC==LC1) {\n/*                  This is the maximum element, amax.\n                    Find the biggest element in the rest of the column\n                    and hence get cmax.  We know cmax .le. 1, but\n                    we still want it exactly in order to break ties.\n                    27 Apr 2002: Settle for cmax = 1. */\n          CMAX = ONE;\n/*                  cmax   = zero\n                    for(l = lc1 + 1; l <= lc2; l++)\n                       cmax  = max( cmax, fabs( a(l) ) )\n                    cmax   = cmax / amax */\n        }\n        else {\n/*                  aij is not the biggest element, so cmax .ge. 1.\n                    Bail out if cmax will be too big. */\n          if(TCP) {\n/*      relax */\n          }\n          else {\n            if(AIJ*LTOL<AMAX)\n              continue;\n          }\n          CMAX = AMAX/AIJ;\n        }\n/*               aij  is big enough.  Its maximum multiplier is cmax. */\n        MERIT = NZ1*LEN1;\n        if(MERIT==*MBEST) {\n/*                  Break ties as before.\n                    (Initializing mbest < 0 prevents getting here if\n                    nothing has been found yet.) */\n          if(LBEST<=LUSOL->parmlu[LUSOL_RP_GAMMA] &&\n             CMAX<=LUSOL->parmlu[LUSOL_RP_GAMMA]) {\n            if(ABEST>=AIJ)\n              continue;\n          }\n          else {\n            if(LBEST<=CMAX)\n              continue;\n          }\n        }\n/*               aij  is the best pivot so far. */\n        *IBEST = I;\n        *JBEST = J;\n        *MBEST = MERIT;\n        KBEST = LEN1;\n        ABEST = AIJ;\n        LBEST = CMAX;\n        if(NZ==1)\n          goto x900;\n      }\n/*            Finished with that row. */\n      if(*IBEST>0) {\n        if(NROW>=MAXROW)\n          goto x290;\n      }\n    }\n/*         See if it's time to quit. */\nx290:\n    if(*IBEST>0) {\n      if(NROW>=MAXROW && NCOL>=MAXCOL)\n        goto x900;\n    }\n/*         Press on with next nz. */\n    NZ1 = NZ;\n    if(*IBEST>0)\n      KBEST = *MBEST/NZ1;\n  }\nx900:\n;\n}\n\n/* ==================================================================\n   lu1mCP  uses a Markowitz criterion to select a pivot element\n   for the next stage of a sparse LU factorization,\n   subject to a Threshold Complete Pivoting stability criterion (TCP)\n   that bounds the elements of L and U.\n   ------------------------------------------------------------------\n   gamma  is \"gamma\" in the tie-breaking rule TB4 in the LUSOL paper.\n   ------------------------------------------------------------------\n   09 May 2002: First version of lu1mCP.\n                It searches columns only, using the heap that\n                holds the largest element in each column.\n   09 May 2002: Current version of lu1mCP.\n   ================================================================== */\nvoid LU1MCP(LUSOLrec *LUSOL, REAL AIJTOL, int *IBEST, int *JBEST, int *MBEST,\n            int HLEN, REAL HA[], int HJ[])\n{\n  int  J, KHEAP, LC, LC1, LC2, LENJ, MAXCOL, NCOL, NZ1, I, LEN1, MERIT;\n  REAL ABEST, AIJ, AMAX, CMAX, LBEST;\n\n/*      ------------------------------------------------------------------\n        Search up to maxcol columns stored at the top of the heap.\n        The very top column helps initialize mbest.\n        ------------------------------------------------------------------ */\n  ABEST = ZERO;\n  LBEST = ZERO;\n  *IBEST = 0;\n/*      Column at the top of the heap */\n  *JBEST = HJ[1];\n  LENJ = LUSOL->lenc[*JBEST];\n/*      Bigger than any possible merit */\n  *MBEST = LENJ*HLEN;\n/*      ??? Big question */\n  MAXCOL = 40;\n/*      No. of columns searched */\n  NCOL = 0;\n  for(KHEAP = 1; KHEAP <= HLEN; KHEAP++) {\n    AMAX = HA[KHEAP];\n    if(AMAX<AIJTOL)\n      continue;\n    NCOL++;\n    J = HJ[KHEAP];\n/*         ---------------------------------------------------------------\n           This column has at least one entry big enough (the top one).\n           Search the column for other possibilities.\n           --------------------------------------------------------------- */\n    LENJ = LUSOL->lenc[J];\n    NZ1 = LENJ-1;\n    LC1 = LUSOL->locc[J];\n    LC2 = LC1+NZ1;\n/* --      amax   = abs( a(lc1) )\n           Test all aijs in this column.\n           amax is the largest element (the first in the column).\n           cmax is the largest multiplier if aij becomes pivot. */\n    for(LC = LC1; LC <= LC2; LC++) {\n      I = LUSOL->indc[LC];\n      LEN1 = LUSOL->lenr[I]-1;\n      MERIT = NZ1*LEN1;\n      if(MERIT>*MBEST)\n        continue;\n/*            aij  has a promising merit. */\n      if(LC==LC1) {\n/*               This is the maximum element, amax.\n                 Find the biggest element in the rest of the column\n                 and hence get cmax.  We know cmax .le. 1, but\n                 we still want it exactly in order to break ties.\n                 27 Apr 2002: Settle for cmax = 1. */\n        AIJ = AMAX;\n        CMAX = ONE;\n/*               cmax   = ZERO;\n                 for(l = lc1 + 1; l <= lc2; l++)\n                    cmax  = max( cmax, abs( a(l) ) )\n                 cmax   = cmax / amax; */\n      }\n      else {\n/*               aij is not the biggest element, so cmax .ge. 1.\n                 Bail out if cmax will be too big. */\n        AIJ = fabs(LUSOL->a[LC]);\n        if(AIJ<AIJTOL)\n          continue;\n        CMAX = AMAX/AIJ;\n      }\n/*            aij  is big enough.  Its maximum multiplier is cmax. */\n      if(MERIT==*MBEST) {\n/*               Break ties.\n                 (Initializing mbest \"too big\" prevents getting here if\n                 nothing has been found yet.)\n                 In this version we minimize cmax\n                 but if it is already small we maximize the pivot. */\n        if(LBEST<=LUSOL->parmlu[LUSOL_RP_GAMMA] &&\n           CMAX<=LUSOL->parmlu[LUSOL_RP_GAMMA]) {\n          if(ABEST>=AIJ)\n            continue;\n        }\n        else {\n          if(LBEST<=CMAX)\n            continue;\n        }\n      }\n/*            aij  is the best pivot so far. */\n      *IBEST = I;\n      *JBEST = J;\n      *MBEST = MERIT;\n      ABEST = AIJ;\n      LBEST = CMAX;\n/*      Col or row of length 1 */\n      if(MERIT==0)\n        goto x900;\n    }\n    if(NCOL>=MAXCOL)\n      goto x900;\n  }\nx900:\n;\n}\n\n/* ==================================================================\n   lu1mRP  uses a Markowitz criterion to select a pivot element\n   for the next stage of a sparse LU factorization,\n   subject to a Threshold Rook Pivoting stability criterion (TRP)\n   that bounds the elements of L and U.\n   ------------------------------------------------------------------\n   11 Jun 2002: First version of lu1mRP derived from lu1mar.\n   11 Jun 2002: Current version of lu1mRP.\n   ================================================================== */\nvoid LU1MRP(LUSOLrec *LUSOL, int MAXMN, REAL LTOL, int MAXCOL, int MAXROW,\n  int *IBEST, int *JBEST, int *MBEST, REAL AMAXR[])\n{\n  int  I, J, KBEST, LC, LC1, LC2, LEN1, LP, LP1, LP2, LQ, LQ1,\n       LQ2, LR, LR1, LR2, MERIT, NCOL, NROW, NZ, NZ1;\n  REAL ABEST, AIJ, AMAX, ATOLI, ATOLJ;\n\n/*      ------------------------------------------------------------------\n        Search cols of length nz = 1, then rows of length nz = 1,\n        then   cols of length nz = 2, then rows of length nz = 2, etc.\n        ------------------------------------------------------------------ */\n  ABEST = ZERO;\n  *IBEST = 0;\n  KBEST = MAXMN+1;\n  *MBEST = -1;\n  NCOL = 0;\n  NROW = 0;\n  NZ1 = 0;\n  for(NZ = 1; NZ <= MAXMN; NZ++) {\n/*         nz1    = nz - 1\n           if (mbest .le. nz1**2) go to 900 */\n    if(KBEST<=NZ1)\n      goto x900;\n    if(*IBEST>0) {\n      if(NCOL>=MAXCOL)\n        goto x200;\n    }\n    if(NZ>LUSOL->m)\n      goto x200;\n/*         ---------------------------------------------------------------\n           Search the set of columns of length  nz.\n           --------------------------------------------------------------- */\n    LQ1 = LUSOL->iqloc[NZ];\n    LQ2 = LUSOL->n;\n    if(NZ<LUSOL->m)\n      LQ2 = LUSOL->iqloc[NZ+1]-1;\n    for(LQ = LQ1; LQ <= LQ2; LQ++) {\n      NCOL = NCOL+1;\n      J = LUSOL->iq[LQ];\n      LC1 = LUSOL->locc[J];\n      LC2 = LC1+NZ1;\n      AMAX = fabs(LUSOL->a[LC1]);\n/*      Min size of pivots in col j */\n      ATOLJ = AMAX/LTOL;\n/*            Test all aijs in this column. */\n      for(LC = LC1; LC <= LC2; LC++) {\n        I = LUSOL->indc[LC];\n        LEN1 = LUSOL->lenr[I]-1;\n/*               merit  = nz1 * len1\n                 if (merit .gt. mbest) continue; */\n        if(LEN1>KBEST)\n          continue;\n/*               aij  has a promising merit.\n                 Apply the Threshold Rook Pivoting stability test.\n                 First we require aij to be sufficiently large\n                 compared to other nonzeros in column j.\n                 Then  we require aij to be sufficiently large\n                 compared to other nonzeros in row    i. */\n        AIJ = fabs(LUSOL->a[LC]);\n        if(AIJ<ATOLJ)\n          continue;\n        if(AIJ*LTOL<AMAXR[I])\n          continue;\n/*               aij  is big enough. */\n        MERIT = NZ1*LEN1;\n        if(MERIT==*MBEST) {\n/*                  Break ties.\n                    (Initializing mbest < 0 prevents getting here if\n                    nothing has been found yet.) */\n          if(ABEST>=AIJ)\n            continue;\n        }\n/*               aij  is the best pivot so far. */\n        *IBEST = I;\n        *JBEST = J;\n        KBEST = LEN1;\n        *MBEST = MERIT;\n        ABEST = AIJ;\n        if(NZ==1)\n          goto x900;\n      }\n/*            Finished with that column. */\n      if(*IBEST>0) {\n        if(NCOL>=MAXCOL)\n          goto x200;\n      }\n    }\n/*         ---------------------------------------------------------------\n           Search the set of rows of length  nz.\n           --------------------------------------------------------------- */\nx200:\n/*    if (mbest .le. nz*nz1) go to 900 */\n    if(KBEST<=NZ)\n      goto x900;\n    if(*IBEST>0) {\n      if(NROW>=MAXROW)\n        goto x290;\n    }\n    if(NZ>LUSOL->n)\n      goto x290;\n    LP1 = LUSOL->iploc[NZ];\n    LP2 = LUSOL->m;\n    if(NZ<LUSOL->n)\n      LP2 = LUSOL->iploc[NZ+1]-1;\n    for(LP = LP1; LP <= LP2; LP++) {\n      NROW = NROW+1;\n      I = LUSOL->ip[LP];\n      LR1 = LUSOL->locr[I];\n      LR2 = LR1+NZ1;\n/*      Min size of pivots in row i */\n      ATOLI = AMAXR[I]/LTOL;\n      for(LR = LR1; LR <= LR2; LR++) {\n        J = LUSOL->indr[LR];\n        LEN1 = LUSOL->lenc[J]-1;\n/*               merit  = nz1 * len1\n                 if (merit .gt. mbest) continue; */\n        if(LEN1>KBEST)\n          continue;\n/*               aij  has a promising merit.\n                 Find where  aij  is in column j. */\n        LC1 = LUSOL->locc[J];\n        LC2 = LC1+LEN1;\n        AMAX = fabs(LUSOL->a[LC1]);\n        for(LC = LC1; LC <= LC2; LC++) {\n          if(LUSOL->indc[LC]==I)\n            break;\n        }\n/*               Apply the Threshold Rook Pivoting stability test.\n                 First we require aij to be sufficiently large\n                 compared to other nonzeros in row    i.\n                 Then  we require aij to be sufficiently large\n                 compared to other nonzeros in column j. */\n        AIJ = fabs(LUSOL->a[LC]);\n        if(AIJ<ATOLI)\n          continue;\n        if(AIJ*LTOL<AMAX)\n          continue;\n/*               aij  is big enough. */\n        MERIT = NZ1*LEN1;\n        if(MERIT==*MBEST) {\n/*                  Break ties as before.\n                    (Initializing mbest < 0 prevents getting here if\n                    nothing has been found yet.) */\n          if(ABEST>=AIJ)\n            continue;\n        }\n/*               aij  is the best pivot so far. */\n        *IBEST = I;\n        *JBEST = J;\n        KBEST = LEN1;\n        *MBEST = MERIT;\n        ABEST = AIJ;\n        if(NZ==1)\n          goto x900;\n      }\n/*            Finished with that row. */\n      if(*IBEST>0) {\n        if(NROW>=MAXROW)\n          goto x290;\n      }\n    }\n/*         See if it's time to quit. */\nx290:\n    if(*IBEST>0) {\n      if(NROW>=MAXROW && NCOL>=MAXCOL)\n        goto x900;\n    }\n/*         Press on with next nz. */\n    NZ1 = NZ;\n    if(*IBEST>0)\n      KBEST = *MBEST/NZ1;\n  }\nx900:\n;\n}\n\n/* ==================================================================\n   lu1mSP  is intended for symmetric matrices that are either\n   definite or quasi-definite.\n   lu1mSP  uses a Markowitz criterion to select a pivot element for\n   the next stage of a sparse LU factorization of a symmetric matrix,\n   subject to a Threshold Symmetric Pivoting stability criterion\n   (TSP) restricted to diagonal elements to preserve symmetry.\n   This bounds the elements of L and U and should have rank-revealing\n   properties analogous to Threshold Rook Pivoting for unsymmetric\n   matrices.\n   ------------------------------------------------------------------\n   14 Dec 2002: First version of lu1mSP derived from lu1mRP.\n                There is no safeguard to ensure that A is symmetric.\n   14 Dec 2002: Current version of lu1mSP.\n   ================================================================== */\nvoid LU1MSP(LUSOLrec *LUSOL, int MAXMN, REAL LTOL, int MAXCOL,\n            int *IBEST, int *JBEST, int *MBEST)\n{\n  int  I, J, KBEST, LC, LC1, LC2, LQ, LQ1, LQ2, MERIT, NCOL, NZ, NZ1;\n  REAL ABEST, AIJ, AMAX, ATOLJ;\n\n/*      ------------------------------------------------------------------\n        Search cols of length nz = 1, then cols of length nz = 2, etc.\n        ------------------------------------------------------------------ */\n  ABEST = ZERO;\n  *IBEST = 0;\n  *MBEST = -1;\n  KBEST = MAXMN+1;\n  NCOL = 0;\n  NZ1 = 0;\n  for(NZ = 1; NZ <= MAXMN; NZ++) {\n/*         nz1    = nz - 1\n           if (mbest .le. nz1**2) go to 900 */\n    if(KBEST<=NZ1)\n      goto x900;\n    if(*IBEST>0) {\n      if(NCOL>=MAXCOL)\n        goto x200;\n    }\n    if(NZ>LUSOL->m)\n      goto x200;\n/*         ---------------------------------------------------------------\n           Search the set of columns of length  nz.\n           --------------------------------------------------------------- */\n    LQ1 = LUSOL->iqloc[NZ];\n    LQ2 = LUSOL->n;\n    if(NZ<LUSOL->m)\n      LQ2 = LUSOL->iqloc[NZ+1]-1;\n    for(LQ = LQ1; LQ <= LQ2; LQ++) {\n      NCOL++;\n      J = LUSOL->iq[LQ];\n      LC1 = LUSOL->locc[J];\n      LC2 = LC1+NZ1;\n      AMAX = fabs(LUSOL->a[LC1]);\n/*      Min size of pivots in col j */\n      ATOLJ = AMAX/LTOL;\n/*            Test all aijs in this column.\n              Ignore everything except the diagonal. */\n      for(LC = LC1; LC <= LC2; LC++) {\n        I = LUSOL->indc[LC];\n/*      Skip off-diagonals. */\n        if(I!=J)\n          continue;\n/*               merit  = nz1 * nz1\n                 if (merit .gt. mbest) continue; */\n        if(NZ1>KBEST)\n          continue;\n/*               aij  has a promising merit.\n                 Apply the Threshold Partial Pivoting stability test\n                 (which is equivalent to Threshold Rook Pivoting for\n                 symmetric matrices).\n                 We require aij to be sufficiently large\n                 compared to other nonzeros in column j. */\n        AIJ = fabs(LUSOL->a[LC]);\n        if(AIJ<ATOLJ)\n          continue;\n/*               aij  is big enough. */\n        MERIT = NZ1*NZ1;\n        if(MERIT==*MBEST) {\n/*                  Break ties.\n                    (Initializing mbest < 0 prevents getting here if\n                    nothing has been found yet.) */\n          if(ABEST>=AIJ)\n            continue;\n        }\n/*               aij  is the best pivot so far. */\n        *IBEST = I;\n        *JBEST = J;\n        KBEST = NZ1;\n        *MBEST = MERIT;\n        ABEST = AIJ;\n        if(NZ==1)\n          goto x900;\n      }\n/*            Finished with that column. */\n      if(*IBEST>0) {\n        if(NCOL>=MAXCOL)\n          goto x200;\n      }\n    }\n/*         See if it's time to quit. */\nx200:\n    if(*IBEST>0) {\n      if(NCOL>=MAXCOL)\n        goto x900;\n    }\n/*         Press on with next nz. */\n    NZ1 = NZ;\n    if(*IBEST>0)\n      KBEST = *MBEST/NZ1;\n  }\nx900:\n;\n}\n\n/* ==================================================================\n   lu1mxc  moves the largest element in each of columns iq(k1:k2)\n   to the top of its column.\n   If k1 > k2, nothing happens.\n   ------------------------------------------------------------------\n   06 May 2002: (and earlier)\n                All columns k1:k2 must have one or more elements.\n   07 May 2002: Allow for empty columns.  The heap routines need to\n                find 0.0 as the \"largest element\".\n   29 Nov 2005: Bug fix - avoiding overwriting the next column when\n                the current column is empty (i.e. LENJ==0)\n                Yin Zhang <yzhang@cs.utexas.edu>\n   ================================================================== */\nvoid LU1MXC(LUSOLrec *LUSOL, int K1, int K2, int IX[])\n{\n  int  I, J, K, L, LC, LENJ;\n  REAL AMAX;\n\n  for(K = K1; K <= K2; K++) {\n    J = IX[K];\n    LC = LUSOL->locc[J];\n    LENJ = LUSOL->lenc[J];\n    if(LENJ==0)\n/*      LUSOL->a[LC] = ZERO;  Removal suggested by Yin Zhang to avoid overwriting next column when current is empty */\n      ;\n    else {\n      L = idamax(LUSOL->lenc[J], LUSOL->a + LC - LUSOL_ARRAYOFFSET,1) + LC - 1;\n      if(L>LC) {\n        AMAX = LUSOL->a[L];\n        LUSOL->a[L] = LUSOL->a[LC];\n        LUSOL->a[LC] = AMAX;\n        I = LUSOL->indc[L];\n        LUSOL->indc[L] = LUSOL->indc[LC];\n        LUSOL->indc[LC] = I;\n      }\n    }\n  }\n}\n\n/* ==================================================================\n   lu1mxr  finds the largest element in each of row ip(k1:k2)\n   and stores it in Amaxr(*).  The nonzeros are stored column-wise\n   in (a,indc,lenc,locc) and their structure is row-wise\n   in (  indr,lenr,locr).\n   If k1 > k2, nothing happens.\n   ------------------------------------------------------------------\n   11 Jun 2002: First version of lu1mxr.\n                Allow for empty columns.\n   ================================================================== */\nvoid LU1MXR(LUSOLrec *LUSOL, int K1, int K2, int IX[], REAL AMAXR[])\n{\n#define FastMXR\n#ifdef FastMXR\n  static int  I, *J, *IC, K, LC, LC1, LC2, LR, LR1, LR2;\n  static REAL AMAX;\n#else\n  int  I, J, K, LC, LC1, LC2, LR, LR1, LR2;\n  REAL AMAX;\n#endif\n\n  for(K = K1; K <= K2; K++) {\n    AMAX = ZERO;\n    I = IX[K];\n/*      Find largest element in row i. */\n    LR1 = LUSOL->locr[I];\n    LR2 = (LR1+LUSOL->lenr[I])-1;\n#ifdef FastMXR\n    for(LR = LR1, J = LUSOL->indr + LR1;\n        LR <= LR2; LR++, J++) {\n/*      Find where  aij  is in column  j. */\n      LC1 = LUSOL->locc[*J];\n      LC2 = LC1+LUSOL->lenc[*J];\n      for(LC = LC1, IC = LUSOL->indc + LC1;\n          LC < LC2; LC++, IC++) {\n        if(*IC==I)\n          break;\n      }\n      SETMAX(AMAX,fabs(LUSOL->a[LC]));\n    }\n#else\n    for(LR = LR1; LR <= LR2; LR++) {\n      J = LUSOL->indr[LR];\n/*      Find where  aij  is in column  j. */\n      LC1 = LUSOL->locc[J];\n      LC2 = (LC1+LUSOL->lenc[J])-1;\n      for(LC = LC1; LC <= LC2; LC++) {\n        if(LUSOL->indc[LC]==I)\n          break;\n      }\n      SETMAX(AMAX,fabs(LUSOL->a[LC]));\n    }\n#endif\n    AMAXR[I] = AMAX;\n  }\n}\n\n\n/* ==================================================================\n   lu1ful computes a dense (full) LU factorization of the\n   mleft by nleft matrix that remains to be factored at the\n   beginning of the nrowu-th pass through the main loop of lu1fad.\n   ------------------------------------------------------------------\n   02 May 1989: First version.\n   05 Feb 1994: Column interchanges added to lu1DPP.\n   08 Feb 1994: ipinv reconstructed, since lu1pq3 may alter ip.\n   ================================================================== */\nvoid LU1FUL(LUSOLrec *LUSOL, int LEND, int LU1, MYBOOL TPP,\n            int MLEFT, int NLEFT, int NRANK, int NROWU,\n            int *LENL, int *LENU, int *NSING,\n            MYBOOL KEEPLU, REAL SMALL, REAL D[], int IPVT[])\n{\n  int  L, I, J, IPBASE, LDBASE, LQ, LC1, LC2, LC, LD, LKK, LKN, LU, K, L1,\n       L2, IBEST, JBEST, LA, LL, NROWD, NCOLD;\n  REAL AI, AJ;\n\n/*      ------------------------------------------------------------------\n        If lu1pq3 moved any empty rows, reset ipinv = inverse of ip.\n        ------------------------------------------------------------------ */\n  if(NRANK<LUSOL->m) {\n    for(L = 1; L <= LUSOL->m; L++) {\n      I = LUSOL->ip[L];\n      LUSOL->ipinv[I] = L;\n    }\n  }\n/*      ------------------------------------------------------------------\n        Copy the remaining matrix into the dense matrix D.\n         ------------------------------------------------------------------ */\n#ifdef LUSOLFastClear\n  MEMCLEAR((D+1), LEND);\n#else\n/*   dload(LEND, ZERO, D, 1); */\n  for(J = 1; J <= LEND; J++)\n    D[J] = ZERO;\n#endif\n\n  IPBASE = NROWU-1;\n  LDBASE = 1-NROWU;\n  for(LQ = NROWU; LQ <= LUSOL->n; LQ++) {\n    J = LUSOL->iq[LQ];\n    LC1 = LUSOL->locc[J];\n    LC2 = (LC1+LUSOL->lenc[J])-1;\n    for(LC = LC1; LC <= LC2; LC++) {\n      I = LUSOL->indc[LC];\n      LD = LDBASE+LUSOL->ipinv[I];\n      D[LD] = LUSOL->a[LC];\n    }\n    LDBASE += MLEFT;\n  }\n/*      ------------------------------------------------------------------\n        Call our favorite dense LU factorizer.\n        ------------------------------------------------------------------ */\n  if(TPP)\n    LU1DPP(LUSOL, D,MLEFT,MLEFT,NLEFT,SMALL,NSING,IPVT,LUSOL->iq+NROWU-LUSOL_ARRAYOFFSET);\n  else\n    LU1DCP(LUSOL, D,MLEFT,MLEFT,NLEFT,SMALL,NSING,IPVT,LUSOL->iq+NROWU-LUSOL_ARRAYOFFSET);\n\n/*      ------------------------------------------------------------------\n        Move D to the beginning of A,\n        and pack L and U at the top of a, indc, indr.\n        In the process, apply the row permutation to ip.\n        lkk points to the diagonal of U.\n        ------------------------------------------------------------------ */\n#ifdef LUSOLFastCopy\n  MEMCOPY(LUSOL->a+1,D+1,LEND);\n#else\n  dcopy(LEND,D,1,LUSOL->a,1);\n#endif\n#ifdef ClassicdiagU\n  LUSOL->diagU = LUSOL->a + (LUSOL->lena-LUSOL->n);\n#endif\n  LKK = 1;\n  LKN = (LEND-MLEFT)+1;\n  LU = LU1;\n  for(K = 1; K <= MIN(MLEFT,NLEFT); K++) {\n    L1 = IPBASE+K;\n    L2 = IPBASE+IPVT[K];\n    if(L1!=L2) {\n      I = LUSOL->ip[L1];\n      LUSOL->ip[L1] = LUSOL->ip[L2];\n      LUSOL->ip[L2] = I;\n    }\n    IBEST = LUSOL->ip[L1];\n    JBEST = LUSOL->iq[L1];\n    if(KEEPLU) {\n/*            ===========================================================\n              Pack the next column of L.\n              =========================================================== */\n      LA = LKK;\n      LL = LU;\n      NROWD = 1;\n      for(I = K+1; I <= MLEFT; I++) {\n        LA++;\n        AI = LUSOL->a[LA];\n        if(fabs(AI)>SMALL) {\n          NROWD = NROWD+1;\n          LL--;\n          LUSOL->a[LL] = AI;\n          LUSOL->indc[LL] = LUSOL->ip[IPBASE+I];\n          LUSOL->indr[LL] = IBEST;\n        }\n      }\n/*            ===========================================================\n              Pack the next row of U.\n              We go backwards through the row of D\n              so the diagonal ends up at the front of the row of  U.\n              Beware -- the diagonal may be zero.\n              =========================================================== */\n      LA = LKN+MLEFT;\n      LU = LL;\n      NCOLD = 0;\n      for(J = NLEFT; J >= K; J--) {\n        LA = LA-MLEFT;\n        AJ = LUSOL->a[LA];\n        if(fabs(AJ)>SMALL || J==K) {\n          NCOLD++;\n          LU--;\n          LUSOL->a[LU] = AJ;\n          LUSOL->indr[LU] = LUSOL->iq[IPBASE+J];\n        }\n      }\n      LUSOL->lenr[IBEST] = -NCOLD;\n      LUSOL->lenc[JBEST] = -NROWD;\n      *LENL = ((*LENL)+NROWD)-1;\n      *LENU = (*LENU)+NCOLD;\n      LKN++;\n    }\n    else {\n/*            ===========================================================\n              Store just the diagonal of U, in natural order.\n              =========================================================== */\n      LUSOL->diagU[JBEST] = LUSOL->a[LKK];\n    }\n    LKK += MLEFT+1;\n  }\n}\n\n\n/* ==================================================================\n   lu1or1  organizes the elements of an  m by n  matrix  A  as\n   follows.  On entry, the parallel arrays   a, indc, indr,\n   contain  nelem  entries of the form     aij,    i,    j,\n   in any order.  nelem  must be positive.\n   Entries not larger than the input parameter  small  are treated as\n   zero and removed from   a, indc, indr.  The remaining entries are\n   defined to be nonzero.  numnz  returns the number of such nonzeros\n   and  Amax  returns the magnitude of the largest nonzero.\n   The arrays  lenc, lenr  return the number of nonzeros in each\n   column and row of  A.\n   inform = 0  on exit, except  inform = 1  if any of the indices in\n   indc, indr  imply that the element  aij  lies outside the  m by n\n   dimensions of  A.\n   ------------------------------------------------------------------\n   xx Feb 1985: Original version.\n   17 Oct 2000: a, indc, indr now have size lena to allow nelem = 0.\n   ================================================================== */\nvoid LU1OR1(LUSOLrec *LUSOL, REAL SMALL,\n            REAL *AMAX, int *NUMNZ, int *LERR, int *INFORM)\n{\n  int I, J, L, LDUMMY;\n\n#ifdef LUSOLFastClear\n  MEMCLEAR((LUSOL->lenr+1), LUSOL->m);\n  MEMCLEAR((LUSOL->lenc+1), LUSOL->n);\n#else\n  for(I = 1; I <= LUSOL->m; I++)\n    LUSOL->lenr[I] = ZERO;\n  for(I = 1; I <= LUSOL->n; I++)\n    LUSOL->lenc[I] = ZERO;\n#endif\n\n  *AMAX = 0;\n  *NUMNZ = LUSOL->nelem;\n  L = LUSOL->nelem+1;\n  for(LDUMMY = 1; LDUMMY <= LUSOL->nelem; LDUMMY++) {\n    L--;\n    if(fabs(LUSOL->a[L])>SMALL) {\n      I = LUSOL->indc[L];\n      J = LUSOL->indr[L];\n      SETMAX(*AMAX,fabs(LUSOL->a[L]));\n      if(I<1 || I>LUSOL->m)\n        goto x910;\n      if(J<1 || J>LUSOL->n)\n        goto x910;\n      LUSOL->lenr[I]++;\n      LUSOL->lenc[J]++;\n    }\n    else {\n/*            Replace a negligible element by last element.  Since\n              we are going backwards, we know the last element is ok. */\n      LUSOL->a[L] = LUSOL->a[*NUMNZ];\n      LUSOL->indc[L] = LUSOL->indc[*NUMNZ];\n      LUSOL->indr[L] = LUSOL->indr[*NUMNZ];\n      (*NUMNZ)--;\n    }\n  }\n  *LERR = 0;\n  *INFORM = LUSOL_INFORM_LUSUCCESS;\n  return;\n\nx910:\n  *LERR = L;\n  *INFORM = LUSOL_INFORM_LUSINGULAR;\n}\n\n/* ==================================================================\n   lu1or2  sorts a list of matrix elements  a(i,j)  into column\n   order, given  numa  entries  a(i,j),  i,  j  in the parallel\n   arrays  a, inum, jnum  respectively.  The matrix is assumed\n   to have  n  columns and an arbitrary number of rows.\n   On entry,  len(*)  must contain the length of each column.\n   On exit,  a(*) and inum(*)  are sorted,  jnum(*) = 0,  and\n   loc(j)  points to the start of column j.\n   lu1or2  is derived from  mc20ad,  a routine in the Harwell\n   Subroutine Library, author J. K. Reid.\n   ------------------------------------------------------------------\n   xx Feb 1985: Original version.\n   17 Oct 2000: a, inum, jnum now have size lena to allow nelem = 0.\n   ================================================================== */\nvoid LU1OR2(LUSOLrec *LUSOL)\n{\n  REAL ACE, ACEP;\n  int  L, J, I, JCE, ICE, ICEP, JCEP, JA, JB;\n\n/*      Set  loc(j)  to point to the beginning of column  j. */\n  L = 1;\n  for(J = 1; J <= LUSOL->n; J++) {\n    LUSOL->locc[J] = L;\n    L += LUSOL->lenc[J];\n  }\n/*      Sort the elements into column order.\n        The algorithm is an in-place sort and is of order  numa. */\n  for(I = 1; I <= LUSOL->nelem; I++) {\n/*         Establish the current entry. */\n    JCE = LUSOL->indr[I];\n    if(JCE==0)\n      continue;\n    ACE = LUSOL->a[I];\n    ICE = LUSOL->indc[I];\n    LUSOL->indr[I] = 0;\n/*         Chain from current entry. */\n    for(J = 1; J <= LUSOL->nelem; J++) {\n/*            The current entry is not in the correct position.\n              Determine where to store it. */\n      L = LUSOL->locc[JCE];\n      LUSOL->locc[JCE]++;\n/*            Save the contents of that location. */\n      ACEP = LUSOL->a[L];\n      ICEP = LUSOL->indc[L];\n      JCEP = LUSOL->indr[L];\n/*            Store current entry. */\n      LUSOL->a[L] = ACE;\n      LUSOL->indc[L] = ICE;\n      LUSOL->indr[L] = 0;\n/*            If next current entry needs to be processed,\n              copy it into current entry. */\n      if(JCEP==0)\n        break;\n      ACE = ACEP;\n      ICE = ICEP;\n      JCE = JCEP;\n    }\n  }\n/*      Reset loc(j) to point to the start of column j. */\n  JA = 1;\n  for(J = 1; J <= LUSOL->n; J++) {\n    JB = LUSOL->locc[J];\n    LUSOL->locc[J] = JA;\n    JA = JB;\n  }\n}\n\n/* ==================================================================\n   lu1or3  looks for duplicate elements in an  m by n  matrix  A\n   defined by the column list  indc, lenc, locc.\n   iw  is used as a work vector of length  m.\n   ------------------------------------------------------------------\n   xx Feb 1985: Original version.\n   17 Oct 2000: indc, indr now have size lena to allow nelem = 0.\n   ================================================================== */\nvoid LU1OR3(LUSOLrec *LUSOL, int *LERR, int *INFORM)\n{\n  int I, J, L1, L2, L;\n\n#ifdef LUSOLFastClear\n  MEMCLEAR((LUSOL->ip+1), LUSOL->m);\n#else\n  for(I = 1; I <= LUSOL->m; I++)\n    LUSOL->ip[I] = ZERO;\n#endif\n\n  for(J = 1; J <= LUSOL->n; J++) {\n    if(LUSOL->lenc[J]>0) {\n      L1 = LUSOL->locc[J];\n      L2 = (L1+LUSOL->lenc[J])-1;\n      for(L = L1; L <= L2; L++) {\n        I = LUSOL->indc[L];\n        if(LUSOL->ip[I]==J)\n          goto x910;\n        LUSOL->ip[I] = J;\n      }\n    }\n  }\n  *INFORM = LUSOL_INFORM_LUSUCCESS;\n  return;\nx910:\n  *LERR = L;\n  *INFORM = LUSOL_INFORM_LUSINGULAR;\n}\n\n/* ==================================================================\n   lu1or4 constructs a row list  indr, locr\n   from a corresponding column list  indc, locc,\n   given the lengths of both columns and rows in  lenc, lenr.\n   ------------------------------------------------------------------\n   xx Feb 1985: Original version.\n   17 Oct 2000: indc, indr now have size lena to allow nelem = 0.\n   ================================================================== */\nvoid LU1OR4(LUSOLrec *LUSOL)\n{\n  int L, I, L2, J, JDUMMY, L1, LR;\n\n/*      Initialize  locr(i)  to point just beyond where the\n        last component of row  i  will be stored. */\n  L = 1;\n  for(I = 1; I <= LUSOL->m; I++) {\n    L += LUSOL->lenr[I];\n    LUSOL->locr[I] = L;\n  }\n/*      By processing the columns backwards and decreasing  locr(i)\n        each time it is accessed, it will end up pointing to the\n        beginning of row  i  as required. */\n  L2 = LUSOL->nelem;\n  J = LUSOL->n+1;\n  for(JDUMMY = 1; JDUMMY <= LUSOL->n; JDUMMY++) {\n    J = J-1;\n    if(LUSOL->lenc[J]>0) {\n      L1 = LUSOL->locc[J];\n      for(L = L1; L <= L2; L++) {\n        I = LUSOL->indc[L];\n        LR = LUSOL->locr[I]-1;\n        LUSOL->locr[I] = LR;\n        LUSOL->indr[LR] = J;\n      }\n      L2 = L1-1;\n    }\n  }\n}\n\n/* ==================================================================\n   lu1pen deals with pending fill-in in the row file.\n   ------------------------------------------------------------------\n   ifill(ll) says if a row involved in the new column of L\n             has to be updated.  If positive, it is the total\n             length of the final updated row.\n   jfill(lu) says if a column involved in the new row of U\n             contains any pending fill-ins.  If positive, it points\n             to the first fill-in in the column that has yet to be\n             added to the row file.\n   ------------------------------------------------------------------\n   16 Apr 1989: First version of lu1pen.\n   23 Mar 2001: ilast used and updated.\n   ================================================================== */\nvoid LU1PEN(LUSOLrec *LUSOL, int NSPARE, int *ILAST,\n            int LPIVC1, int LPIVC2, int LPIVR1, int LPIVR2,\n            int *LROW, int IFILL[], int JFILL[])\n{\n  int  LL, LC, L, I, LR1, LR2, LR, LU, J, LC1, LC2, LAST;\n\n  LL = 0;\n  for(LC = LPIVC1; LC <= LPIVC2; LC++) {\n    LL++;\n    if(IFILL[LL]==0)\n      continue;\n/*      Another row has pending fill.\n        First, add some spare space at the }\n        of the current last row. */\n#if 1\n    LC1 = (*LROW)+1;\n    LC2 = (*LROW)+NSPARE;\n    *LROW = LC2;\n    for(L = LC1; L <= LC2; L++) {\n#else\n    for(L = (*LROW)+1; L <= (*LROW)+NSPARE; L++) {\n      *LROW = L;  /* ******* ERROR ???? */\n#endif\n      LUSOL->indr[L] = 0;\n    }\n/*      Now move row i to the end of the row file. */\n    I = LUSOL->indc[LC];\n    *ILAST = I;\n    LR1 = LUSOL->locr[I];\n    LR2 = (LR1+LUSOL->lenr[I])-1;\n    LUSOL->locr[I] = (*LROW)+1;\n    for(LR = LR1; LR <= LR2; LR++) {\n      (*LROW)++;\n      LUSOL->indr[*LROW] = LUSOL->indr[LR];\n      LUSOL->indr[LR] = 0;\n    }\n    (*LROW) += IFILL[LL];\n  }\n/*         Scan all columns of  D  and insert the pending fill-in\n           into the row file. */\n  LU = 1;\n  for(LR = LPIVR1; LR <= LPIVR2; LR++) {\n    LU++;\n    if(JFILL[LU]==0)\n      continue;\n    J = LUSOL->indr[LR];\n    LC1 = (LUSOL->locc[J]+JFILL[LU])-1;\n    LC2 = (LUSOL->locc[J]+LUSOL->lenc[J])-1;\n    for(LC = LC1; LC <= LC2; LC++) {\n      I = LUSOL->indc[LC]-LUSOL->m;\n      if(I>0) {\n        LUSOL->indc[LC] = I;\n        LAST = LUSOL->locr[I]+LUSOL->lenr[I];\n        LUSOL->indr[LAST] = J;\n        LUSOL->lenr[I]++;\n      }\n    }\n  }\n}\n\n\n/* ==================================================================\n   lu1fad  is a driver for the numerical phase of lu1fac.\n   At each stage it computes a column of  L  and a row of  U,\n   using a Markowitz criterion to select the pivot element,\n   subject to a stability criterion that bounds the elements of  L.\n   ------------------------------------------------------------------\n   Local variables\n   ---------------\n   lcol   is the length of the column file.  It points to the last\n          nonzero in the column list.\n   lrow   is the analogous quantity for the row file.\n   lfile  is the file length (lcol or lrow) after the most recent\n          compression of the column list or row list.\n   nrowd  and  ncold  are the number of rows and columns in the\n          matrix defined by the pivot column and row.  They are the\n          dimensions of the submatrix D being altered at this stage.\n   melim  and  nelim  are the number of rows and columns in the\n          same matrix D, excluding the pivot column and row.\n   mleft  and  nleft  are the number of rows and columns\n          still left to be factored.\n   nzchng is the increase in nonzeros in the matrix that remains\n          to be factored after the current elimination\n          (usually negative).\n   nzleft is the number of nonzeros still left to be factored.\n   nspare is the space we leave at the end of the last row or\n          column whenever a row or column is being moved to the }\n          of its file.  nspare = 1 or 2 might help reduce the\n          number of file compressions when storage is tight.\n   The row and column ordering permutes A into the form\n                      ------------------------\n                       \\                     |\n                        \\         U1         |\n                         \\                   |\n                          --------------------\n                          |\\\n                          | \\\n                          |  \\\n          P A Q   =       |   \\\n                          |    \\\n                          |     --------------\n                          |     |            |\n                          |     |            |\n                          | L1  |     A2     |\n                          |     |            |\n                          |     |            |\n                          --------------------\n   where the block A2 is factored as  A2 = L2 U2.\n   The phases of the factorization are as follows.\n   Utri   is true when U1 is being determined.\n          Any column of length 1 is accepted immediately (if TPP).\n   Ltri   is true when L1 is being determined.\n          lu1mar exits as soon as an acceptable pivot is found\n          in a row of length 1.\n   spars1 is true while the density of the (modified) A2 is less\n          than the parameter dens1 = parmlu(7) = 0.3 say.\n          lu1mar searches maxcol columns and maxrow rows,\n          where  maxcol = luparm(3),  maxrow = maxcol - 1.\n          lu1mxc is used to keep the biggest element at the top\n          of all remaining columns.\n   spars2 is true while the density of the modified A2 is less\n          than the parameter dens2 = parmlu(8) = 0.6 say.\n          lu1mar searches maxcol columns and no rows.\n          lu1mxc could fix up only the first maxcol cols (with TPP).\n          22 Sep 2000:  For simplicity, lu1mxc fixes all\n                        modified cols.\n   dense  is true once the density of A2 reaches dens2.\n          lu1mar searches only 1 column (the shortest).\n          lu1mxc could fix up only the first column (with TPP).\n   ------------------------------------------------------------------\n   00 Jan 1986  Version documented in LUSOL paper:\n                Gill, Murray, Saunders and Wright (1987),\n                Maintaining LU factors of a general sparse matrix,\n                Linear algebra and its applications 88/89, 239-270.\n   02 Feb 1989  Following Suhl and Aittoniemi (1987), the largest\n                element in each column is now kept at the start of\n                the column, i.e. in position locc(j) of a and indc.\n                This should speed up the Markowitz searches.\n                To save time on highly triangular matrices, we wait\n                until there are no further columns of length 1\n                before setting and maintaining that property.\n   12 Apr 1989  ipinv and iqinv added (inverses of ip and iq)\n                to save searching ip and iq for rows and columns\n                altered in each elimination step.  (Used in lu1pq2)\n   19 Apr 1989  Code segmented to reduce its size.\n                lu1gau does most of the Gaussian elimination work.\n                lu1mar does just the Markowitz search.\n                lu1mxc moves biggest elements to top of columns.\n                lu1pen deals with pending fill-in in the row list.\n                lu1pq2 updates the row and column permutations.\n   26 Apr 1989  maxtie replaced by maxcol, maxrow in the Markowitz\n                search.  maxcol, maxrow change as density increases.\n   25 Oct 1993  keepLU implemented.\n   07 Feb 1994  Exit main loop early to finish off with a dense LU.\n                densLU tells lu1fad whether to do it.\n   21 Dec 1994  Bug fixed.  nrank was wrong after the call to lu1ful.\n   12 Nov 1999  A parallel version of dcopy gave trouble in lu1ful\n                during left-shift of dense matrix D within a(*).\n                Fixed this unexpected problem here in lu1fad\n                by making sure the first and second D don't overlap.\n   13 Sep 2000  TCP (Threshold Complete Pivoting) implemented.\n                lu2max added\n                (finds aijmax from biggest elems in each col).\n                Utri, Ltri and Spars1 phases apply.\n                No switch to Dense CP yet.  (Only TPP switches.)\n   14 Sep 2000  imax needed to remember row containing aijmax.\n   22 Sep 2000  For simplicity, lu1mxc always fixes all modified cols.\n                (TPP spars2 used to fix just the first maxcol cols.)\n   08 Nov 2000: Speed up search for aijmax.\n                Don't need to search all columns if the elimination\n                didn't alter the col containing the current aijmax.\n   21 Nov 2000: lu1slk implemented for Utri phase with TCP\n                to guard against deceptive triangular matrices.\n                (Utri used to have aijtol >= 0.9999 to include\n                slacks, but this allows other 1s to be accepted.)\n                Utri now accepts slacks, but applies normal aijtol\n                test to other pivots.\n   28 Nov 2000: TCP with empty cols must call lu1mxc and lu2max\n                with ( lq1, n, ... ), not just ( 1, n, ... ).\n   23 Mar 2001: lu1fad bug with TCP.\n                A col of length 1 might not be accepted as a pivot.\n                Later it appears in a pivot row and temporarily\n                has length 0 (when pivot row is removed\n                but before the column is filled in).  If it is the\n                last column in storage, the preceding col also thinks\n                it is \"last\".  Trouble arises when the preceding col\n                needs fill-in -- it overlaps the real \"last\" column.\n                (Very rarely, same trouble might have happened if\n                the drop tolerance caused columns to have length 0.)\n                Introduced ilast to record the last row in row file,\n                           jlast to record the last col in col file.\n                lu1rec returns ilast = indr(lrow + 1)\n                            or jlast = indc(lcol + 1).\n                (Should be an output parameter, but didn't want to\n                alter lu1rec's parameter list.)\n                lu1rec also treats empty rows or cols safely.\n                (Doesn't eliminate them!)\n   26 Apr 2002: Heap routines added for TCP.\n                lu2max no longer needed.\n                imax, jmax used only for printing.\n   01 May 2002: lu1DCP implemented (dense complete pivoting).\n                Both TPP and TCP now switch to dense LU\n                when density exceeds dens2.\n   06 May 2002: In dense mode, store diag(U) in natural order.\n   09 May 2002: lu1mCP implemented (Markowitz TCP via heap).\n   11 Jun 2002: lu1mRP implemented (Markowitz TRP).\n   28 Jun 2002: Fixed call to lu1mxr.\n   14 Dec 2002: lu1mSP implemented (Markowitz TSP).\n   15 Dec 2002: Both TPP and TSP can grab cols of length 1\n                during Utri.\n   ================================================================== */\nvoid LU1FAD(LUSOLrec *LUSOL,\n#ifdef ClassicHamaxR\n            int LENA2, int LENH, REAL HA[], int HJ[], int HK[], REAL AMAXR[],\n#endif\n            int *INFORM, int *LENL, int *LENU, int *MINLEN,\n            int *MERSUM, int *NUTRI, int *NLTRI,\n            int *NDENS1, int *NDENS2, int *NRANK,\n            REAL *LMAX, REAL *UMAX, REAL *DUMAX, REAL *DUMIN, REAL *AKMAX)\n{\n  MYBOOL UTRI, LTRI, SPARS1, SPARS2, DENSE, DENSLU, KEEPLU, TCP, TPP, TRP,TSP;\n  int    HLEN, HOPS, H, LPIV, LPRINT, MAXCOL, MAXROW, ILAST, JLAST, LFILE, LROW, LCOL,\n         MINMN, MAXMN, NZLEFT, NSPARE, LU1, KK, J, LC, MLEFT, NLEFT, NROWU,\n         LQ1, LQ2, JBEST, LQ, I, IBEST, MBEST, LEND, NFREE, LD, NCOLD, NROWD,\n         MELIM, NELIM, JMAX, IMAX, LL1, LSAVE, LFREE, LIMIT, MINFRE, LPIVR, LPIVR1, LPIVR2,\n         L, LPIVC, LPIVC1, LPIVC2, KBEST, LU, LR, LENJ, LC1, LAST, LL, LS,\n         LENI, LR1, LFIRST, NFILL, NZCHNG, K, MRANK, NSING;\n  REAL   LIJ, LTOL, SMALL, USPACE, DENS1, DENS2, AIJMAX, AIJTOL, AMAX, ABEST, DIAG, V;\n#ifdef ClassicHamaxR\n  int    LDIAGU;\n#else\n  int    LENA2 = LUSOL->lena;\n#endif\n\n#ifdef UseTimer\n  int    eltime, mktime, ntime;\n  timer ( \"start\", 3 );\n  ntime = LUSOL->n / 4;\n#endif\n\n#ifdef ForceInitialization\n  AIJMAX = 0;\n  AIJTOL = 0;\n  HLEN   = 0;\n  JBEST  = 0;\n  IBEST  = 0;\n  MBEST  = 0;\n  LEND   = 0;\n  LD     = 0;\n#endif\n\n  LPRINT = LUSOL->luparm[LUSOL_IP_PRINTLEVEL];\n  MAXCOL = LUSOL->luparm[LUSOL_IP_MARKOWITZ_MAXCOL];\n  LPIV   = LUSOL->luparm[LUSOL_IP_PIVOTTYPE];\n  KEEPLU = (MYBOOL) (LUSOL->luparm[LUSOL_IP_KEEPLU]!=FALSE);\n/*      Threshold Partial   Pivoting (normal). */\n  TPP = (MYBOOL) (LPIV==LUSOL_PIVMOD_TPP);\n/*      Threshold Rook      Pivoting */\n  TRP = (MYBOOL) (LPIV==LUSOL_PIVMOD_TRP);\n/*      Threshold Complete  Pivoting. */\n  TCP = (MYBOOL) (LPIV==LUSOL_PIVMOD_TCP);\n/*      Threshold Symmetric Pivoting. */\n  TSP = (MYBOOL) (LPIV==LUSOL_PIVMOD_TSP);\n  DENSLU = FALSE;\n  MAXROW = MAXCOL-1;\n/*      Assume row m is last in the row file. */\n  ILAST = LUSOL->m;\n/*      Assume col n is last in the col file. */\n  JLAST = LUSOL->n;\n  LFILE = LUSOL->nelem;\n  LROW = LUSOL->nelem;\n  LCOL = LUSOL->nelem;\n  MINMN = MIN(LUSOL->m,LUSOL->n);\n  MAXMN = MAX(LUSOL->m,LUSOL->n);\n  NZLEFT = LUSOL->nelem;\n  NSPARE = 1;\n\n  if(KEEPLU)\n    LU1 = LENA2+1;\n  else {\n/*         Store only the diagonals of U in the top of memory. */\n#ifdef ClassicdiagU\n    LDIAGU = LENA2-LUSOL->n;\n    LU1 = LDIAGU+1;\n    LUSOL->diagU = LUSOL->a+LDIAGU;\n#else\n    LU1 = LENA2+1;\n#endif\n  }\n\n  LTOL = LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij];\n  SMALL = LUSOL->parmlu[LUSOL_RP_ZEROTOLERANCE];\n  USPACE = LUSOL->parmlu[LUSOL_RP_COMPSPACE_U];\n  DENS1 = LUSOL->parmlu[LUSOL_RP_MARKOWITZ_CONLY];\n  DENS2 = LUSOL->parmlu[LUSOL_RP_MARKOWITZ_DENSE];\n  UTRI = TRUE;\n  LTRI = FALSE;\n  SPARS1 = FALSE;\n  SPARS2 = FALSE;\n  DENSE = FALSE;\n/*      Check parameters. */\n  SETMAX(LTOL,1.0001E+0);\n  SETMIN(DENS1,DENS2);\n/*      Initialize output parameters.\n        lenL, lenU, minlen, mersum, nUtri, nLtri, ndens1, ndens2, nrank\n        are already initialized by lu1fac. */\n  *LMAX  = ZERO;\n  *UMAX  = ZERO;\n  *DUMAX = ZERO;\n  *DUMIN = LUSOL_BIGNUM;\n  if(LUSOL->nelem==0)\n    *DUMIN = ZERO;\n  *AKMAX = ZERO;\n  HOPS = 0;\n/*      More initialization.\n        Don't worry yet about lu1mxc. */\n  if(TPP || TSP) {\n    AIJMAX = ZERO;\n    AIJTOL = ZERO;\n    HLEN = 1;\n/*      TRP or TCP */\n  }\n  else {\n/*      Move biggest element to top of each column.\n        Set w(*) to mark slack columns (unit vectors). */\n    LU1MXC(LUSOL, 1,LUSOL->n,LUSOL->iq);\n    LU1SLK(LUSOL);\n  }\n  if(TRP)\n/*      Find biggest element in each row. */\n#ifdef ClassicHamaxR\n    LU1MXR(LUSOL, 1,LUSOL->m,LUSOL->ip,AMAXR);\n#else\n    LU1MXR(LUSOL, 1,LUSOL->m,LUSOL->ip,LUSOL->amaxr);\n#endif\n\n  if(TCP) {\n/*      Set Ha(1:Hlen) = biggest element in each column,\n            Hj(1:Hlen) = corresponding column indices. */\n    HLEN = 0;\n    for(KK = 1; KK <= LUSOL->n; KK++) {\n      HLEN++;\n      J = LUSOL->iq[KK];\n      LC = LUSOL->locc[J];\n#ifdef ClassicHamaxR\n      HA[HLEN] = fabs(LUSOL->a[LC]);\n      HJ[HLEN] = J;\n      HK[J] = HLEN;\n#else\n      LUSOL->Ha[HLEN] = fabs(LUSOL->a[LC]);\n      LUSOL->Hj[HLEN] = J;\n      LUSOL->Hk[J] = HLEN;\n#endif\n    }\n/*      Build the heap, creating new Ha, Hj and setting Hk(1:Hlen). */\n#ifdef ClassicHamaxR\n    HBUILD(HA,HJ,HK,HLEN,&HOPS);\n#else\n    HBUILD(LUSOL->Ha,LUSOL->Hj,LUSOL->Hk,HLEN,&HOPS);\n#endif\n  }\n/*      ------------------------------------------------------------------\n        Start of main loop.\n        ------------------------------------------------------------------ */\n  MLEFT = LUSOL->m+1;\n  NLEFT = LUSOL->n+1;\n  for(NROWU = 1; NROWU <= MINMN; NROWU++) {\n#ifdef UseTimer\n    mktime = (nrowu / ntime) + 4;\n    eltime = (nrowu / ntime) + 9;\n#endif\n    MLEFT--;\n    NLEFT--;\n/*         Bail out if there are no nonzero rows left. */\n    if(LUSOL->iploc[1]>LUSOL->m)\n      goto x900;\n/*      For TCP, the largest Aij is at the top of the heap. */\n   if(TCP) {\n/*\n              Marvelously easy */\n#ifdef ClassicHamaxR\n      AIJMAX = HA[1];\n#else\n      AIJMAX = LUSOL->Ha[1];\n#endif\n      SETMAX(*AKMAX,AIJMAX);\n      AIJTOL = AIJMAX/LTOL;\n    }\n/*         ===============================================================\n           Find a suitable pivot element.\n           =============================================================== */\n    if(UTRI) {\n/*            ------------------------------------------------------------\n              So far all columns have had length 1.\n              We are still looking for the (backward) triangular part of A\n              that forms the first rows and columns of U.\n              ------------------------------------------------------------ */\n      LQ1 = LUSOL->iqloc[1];\n      LQ2 = LUSOL->n;\n      if(LUSOL->m>1)\n        LQ2 = LUSOL->iqloc[2]-1;\n/*      There are more cols of length 1. */\n      if(LQ1<=LQ2) {\n        if(TPP || TSP) {\n/*      Grab the first one. */\n          JBEST = LUSOL->iq[LQ1];\n/*      Scan all columns of length 1 ... TRP or TCP */\n        }\n        else {\n          JBEST = 0;\n          for(LQ = LQ1; LQ <= LQ2; LQ++) {\n            J = LUSOL->iq[LQ];\n/*      Accept a slack */\n            if(LUSOL->w[J]>ZERO) {\n              JBEST = J;\n              goto x250;\n            }\n            LC = LUSOL->locc[J];\n            AMAX = fabs(LUSOL->a[LC]);\n            if(TRP) {\n              I = LUSOL->indc[LC];\n#ifdef ClassicHamaxR\n              AIJTOL = AMAXR[I]/LTOL;\n#else\n              AIJTOL = LUSOL->amaxr[I]/LTOL;\n#endif\n            }\n            if(AMAX>=AIJTOL) {\n              JBEST = J;\n              goto x250;\n            }\n          }\n        }\nx250:\n        if(JBEST>0) {\n          LC = LUSOL->locc[JBEST];\n          IBEST = LUSOL->indc[LC];\n          MBEST = 0;\n          goto x300;\n        }\n      }\n/*            This is the end of the U triangle.\n              We will not return to this part of the code.\n              TPP and TSP call lu1mxc for the first time\n              (to move biggest element to top of each column). */\n      if(LPRINT>=LUSOL_MSG_PIVOT)\n        LUSOL_report(LUSOL, 0, \"Utri ended.  spars1 = TRUE\\n\");\n      UTRI = FALSE;\n      LTRI = TRUE;\n      SPARS1 = TRUE;\n      *NUTRI = NROWU-1;\n      if(TPP || TSP)\n        LU1MXC(LUSOL, LQ1,LUSOL->n,LUSOL->iq);\n    }\n    if(SPARS1) {\n/*            ------------------------------------------------------------\n              Perform a Markowitz search.\n              Search cols of length 1, then rows of length 1,\n              then   cols of length 2, then rows of length 2, etc.\n              ------------------------------------------------------------ */\n#ifdef UseTimer\n        timer ( \"start\", mktime );\n#endif\n/*      12 Jun 2002: Next line disables lu1mCP below\n              if (TPP) then */\n      if(TPP || TCP) {\n        LU1MAR(LUSOL, MAXMN,TCP,AIJTOL,LTOL,MAXCOL,MAXROW,&IBEST,&JBEST,&MBEST);\n      }\n      else if(TRP) {\n#ifdef ClassicHamaxR\n        LU1MRP(LUSOL, MAXMN,LTOL,MAXCOL,MAXROW,&IBEST,&JBEST,&MBEST,AMAXR);\n#else\n        LU1MRP(LUSOL, MAXMN,LTOL,MAXCOL,MAXROW,&IBEST,&JBEST,&MBEST,LUSOL->amaxr);\n#endif\n/*      else if (TCP) {\n        lu1mCP( m    , n     , lena  , aijtol,\n                      ibest, jbest , mbest ,\n                      a    , indc  , indr  ,\n                      lenc , lenr  , locc  ,\n                      Hlen , Ha    , Hj    ) */\n      }\n      else if(TSP) {\n        LU1MSP(LUSOL, MAXMN,LTOL,MAXCOL,&IBEST,&JBEST,&MBEST);\n        if(IBEST==0)\n          goto x990;\n      }\n#ifdef UseTimer\n      timer ( \"finish\", mktime );\n#endif\n      if(LTRI) {\n/*               So far all rows have had length 1.\n                 We are still looking for the (forward) triangle of A\n                 that forms the first rows and columns of L. */\n        if(MBEST>0) {\n          LTRI = FALSE;\n          *NLTRI = NROWU-1-*NUTRI;\n          if(LPRINT>=LUSOL_MSG_PIVOT)\n            LUSOL_report(LUSOL, 0, \"Ltri ended.\\n\");\n        }\n      }\n      else {\n/*               See if what's left is as dense as dens1. */\n        if(NZLEFT>=(DENS1*MLEFT)*NLEFT) {\n          SPARS1 = FALSE;\n          SPARS2 = TRUE;\n          *NDENS1 = NLEFT;\n          MAXROW = 0;\n          if(LPRINT>=LUSOL_MSG_PIVOT)\n            LUSOL_report(LUSOL, 0, \"spars1 ended.  spars2 = TRUE\\n\");\n        }\n      }\n    }\n    else if(SPARS2 || DENSE) {\n/*            ------------------------------------------------------------\n              Perform a restricted Markowitz search,\n              looking at only the first maxcol columns.  (maxrow = 0.)\n              ------------------------------------------------------------ */\n#ifdef UseTimer\n      timer ( \"start\", mktime );\n#endif\n/*      12 Jun 2002: Next line disables lu1mCP below\n              if (TPP) then */\n      if(TPP || TCP) {\n        LU1MAR(LUSOL, MAXMN,TCP,AIJTOL,LTOL,MAXCOL,MAXROW,&IBEST,&JBEST,&MBEST);\n      }\n      else if(TRP) {\n#ifdef ClassicHamaxR\n        LU1MRP(LUSOL, MAXMN,LTOL,MAXCOL,MAXROW,&IBEST,&JBEST,&MBEST,AMAXR);\n#else\n        LU1MRP(LUSOL, MAXMN,LTOL,MAXCOL,MAXROW,&IBEST,&JBEST,&MBEST,LUSOL->amaxr);\n#endif\n/*      else if (TCP) {\n        lu1mCP( m    , n     , lena  , aijtol,\n                      ibest, jbest , mbest ,\n                      a    , indc  , indr  ,\n                      lenc , lenr  , locc  ,\n                      Hlen , Ha    , Hj    ) */\n      }\n      else if(TSP) {\n        LU1MSP(LUSOL, MAXMN,LTOL,MAXCOL,&IBEST,&JBEST,&MBEST);\n        if(IBEST==0)\n          goto x985;\n      }\n#ifdef UseTimer\n      timer ( \"finish\", mktime );\n#endif\n/*            See if what's left is as dense as dens2. */\n      if(SPARS2) {\n        if(NZLEFT>=(DENS2*MLEFT)*NLEFT) {\n          SPARS2 = FALSE;\n          DENSE = TRUE;\n          *NDENS2 = NLEFT;\n          MAXCOL = 1;\n          if(LPRINT>=LUSOL_MSG_PIVOT)\n            LUSOL_report(LUSOL, 0, \"spars2 ended.  dense = TRUE\\n\");\n        }\n      }\n    }\n/*         ---------------------------------------------------------------\n           See if we can finish quickly.\n           --------------------------------------------------------------- */\n    if(DENSE) {\n      LEND = MLEFT*NLEFT;\n      NFREE = LU1-1;\n      if(NFREE>=2*LEND) {\n/*               There is room to treat the remaining matrix as\n                 a dense matrix D.\n                 We may have to compress the column file first.\n                 12 Nov 1999: D used to be put at the\n                              beginning of free storage (lD = lcol + 1).\n                              Now put it at the end     (lD = lu1 - lenD)\n                              so the left-shift in lu1ful will not\n                              involve overlapping storage\n                              (fatal with parallel dcopy).\n   */\n        DENSLU = TRUE;\n        *NDENS2 = NLEFT;\n        LD = LU1-LEND;\n        if(LCOL>=LD) {\n          LU1REC(LUSOL, LUSOL->n,TRUE,&LCOL,\n                        LUSOL->indc,LUSOL->lenc,LUSOL->locc);\n          LFILE = LCOL;\n          JLAST = LUSOL->indc[LCOL+1];\n        }\n        goto x900;\n      }\n    }\n/*         ===============================================================\n           The best  aij  has been found.\n           The pivot row  ibest  and the pivot column  jbest\n           Define a dense matrix  D  of size  nrowd  by  ncold.\n           =============================================================== */\nx300:\n    NCOLD = LUSOL->lenr[IBEST];\n    NROWD = LUSOL->lenc[JBEST];\n    MELIM = NROWD-1;\n    NELIM = NCOLD-1;\n    (*MERSUM) += MBEST;\n    (*LENL) += MELIM;\n    (*LENU) += NCOLD;\n    if(LPRINT>=LUSOL_MSG_PIVOT) {\n      if(NROWU==1)\n        LUSOL_report(LUSOL, 0, \"lu1fad debug:\\n\");\n      if(TPP || TRP || TSP) {\n        LUSOL_report(LUSOL, 0, \"nrowu:%7d   i,jbest:%7d,%7d   nrowd,ncold:%6d,%6d\\n\",\n                            NROWU, IBEST,JBEST, NROWD,NCOLD);\n/*      TCP */\n      }\n      else {\n#ifdef ClassicHamaxR\n        JMAX = HJ[1];\n#else\n        JMAX = LUSOL->Hj[1];\n#endif\n        IMAX = LUSOL->indc[LUSOL->locc[JMAX]];\n        LUSOL_report(LUSOL, 0, \"nrowu:%7d   i,jbest:%7d,%7d   nrowd,ncold:%6d,%6d   i,jmax:%7d,%7d   aijmax:%g\\n\",\n                            NROWU, IBEST,JBEST, NROWD,NCOLD, IMAX,JMAX, AIJMAX);\n      }\n    }\n/*         ===============================================================\n           Allocate storage for the next column of  L  and next row of  U.\n           Initially the top of a, indc, indr are used as follows:\n                      ncold       melim       ncold        melim\n           a      |...........|...........|ujbest..ujn|li1......lim|\n           indc   |...........|  lenr(i)  |  lenc(j)  |  markl(i)  |\n           indr   |...........| iqloc(i)  |  jfill(j) |  ifill(i)  |\n                 ^           ^             ^           ^            ^\n                 lfree   lsave             lu1         ll1          oldlu1\n           Later the correct indices are inserted:\n           indc   |           |           |           |i1........im|\n           indr   |           |           |jbest....jn|ibest..ibest|\n           =============================================================== */\n    if(!KEEPLU) {\n/*            Always point to the top spot.\n              Only the current column of L and row of U will\n              take up space, overwriting the previous ones. */\n#ifdef ClassicHamaxR\n      LU1 = LDIAGU+1;\n#else\n      LU1 = LENA2+1;\n#endif\n    }\n    /* Update (left-shift) pointers to make room for the new data */\n    LL1 = LU1-MELIM;\n    LU1 = LL1-NCOLD;\n    LSAVE = LU1-NROWD;\n    LFREE = LSAVE-NCOLD;\n\n    /* Check if we need to allocate more memory, and allocate if necessary */\n#if 0  /* Proposal by Michael A. Saunders (logic based on Markowitz' rule) */\n    L = NROWD*NCOLD;\n\n    /* Try to avoid future expansions by anticipating further updates - KE extension */\n    if(LUSOL->luparm[LUSOL_IP_UPDATELIMIT] > 0)\n#if 1\n      L *= (int) (log(LUSOL->luparm[LUSOL_IP_UPDATELIMIT]-LUSOL->luparm[LUSOL_IP_UPDATECOUNT]+2.0) + 1);\n#else\n      L *= (LUSOL->luparm[LUSOL_IP_UPDATELIMIT]-LUSOL->luparm[LUSOL_IP_UPDATECOUNT]) / 2 + 1;\n#endif\n\n#else  /* Version by Kjell Eikland (from luparm[LUSOL_IP_MINIMUMLENA] and safety margin) */\n    L  = (KEEPLU ? MAX(LROW, LCOL) + 2*(LUSOL->m+LUSOL->n) : 0);\n    L *= LUSOL_MULT_nz_a;\n    SETMAX(L, NROWD*NCOLD);\n#endif\n\n    /* Do the memory expansion */\n    if((L > LFREE-LCOL) && LUSOL_expand_a(LUSOL, &L, &LFREE)) {\n      LL1   += L;\n      LU1   += L;\n      LSAVE += L;\n#ifdef ClassicdiagU\n      LUSOL->diagU += L;\n#endif\n#ifdef ClassicHamaxR\n      HA    += L;\n      HJ    += L;\n      HK    += L;\n      AMAXR += L;\n#endif\n    }\n    LIMIT = (int) (USPACE*LFILE)+LUSOL->m+LUSOL->n+1000;\n\n/*         Make sure the column file has room.\n           Also force a compression if its length exceeds a certain limit. */\n#ifdef StaticMemAlloc\n    MINFRE = NCOLD+MELIM;\n#else\n    MINFRE = NROWD*NCOLD;\n#endif\n    NFREE = LFREE-LCOL;\n    if(NFREE<MINFRE || LCOL>LIMIT) {\n      LU1REC(LUSOL, LUSOL->n,TRUE,&LCOL,\n                    LUSOL->indc,LUSOL->lenc,LUSOL->locc);\n      LFILE = LCOL;\n      JLAST = LUSOL->indc[LCOL+1];\n      NFREE = LFREE-LCOL;\n      if(NFREE<MINFRE)\n        goto x970;\n    }\n/*         Make sure the row file has room. */\n#ifdef StaticMemAlloc\n    MINFRE = NCOLD+MELIM;\n#else\n    MINFRE = NROWD*NCOLD;\n#endif\n    NFREE = LFREE-LROW;\n    if(NFREE<MINFRE || LROW>LIMIT) {\n      LU1REC(LUSOL, LUSOL->m,FALSE,&LROW,\n                    LUSOL->indr,LUSOL->lenr,LUSOL->locr);\n      LFILE = LROW;\n      ILAST = LUSOL->indr[LROW+1];\n      NFREE = LFREE-LROW;\n      if(NFREE<MINFRE)\n        goto x970;\n    }\n/*         ===============================================================\n           Move the pivot element to the front of its row\n           and to the top of its column.\n           =============================================================== */\n    LPIVR = LUSOL->locr[IBEST];\n    LPIVR1 = LPIVR+1;\n    LPIVR2 = LPIVR+NELIM;\n    for(L = LPIVR; L <= LPIVR2; L++) {\n      if(LUSOL->indr[L]==JBEST)\n        break;\n    }\n\n    LUSOL->indr[L] = LUSOL->indr[LPIVR];\n    LUSOL->indr[LPIVR] = JBEST;\n    LPIVC = LUSOL->locc[JBEST];\n    LPIVC1 = LPIVC+1;\n    LPIVC2 = LPIVC+MELIM;\n    for(L = LPIVC; L <= LPIVC2; L++) {\n      if(LUSOL->indc[L]==IBEST)\n        break;\n    }\n    LUSOL->indc[L] = LUSOL->indc[LPIVC];\n    LUSOL->indc[LPIVC] = IBEST;\n    ABEST = LUSOL->a[L];\n    LUSOL->a[L] = LUSOL->a[LPIVC];\n    LUSOL->a[LPIVC] = ABEST;\n    if(!KEEPLU)\n/*            Store just the diagonal of U, in natural order.\n   !!         a[ldiagU + nrowu] = abest ! This was in pivot order. */\n      LUSOL->diagU[JBEST] = ABEST;\n\n/*     ==============================================================\n        Delete pivot col from heap.\n        Hk tells us where it is in the heap.\n       ============================================================== */\n    if(TCP) {\n#ifdef ClassicHamaxR\n      KBEST = HK[JBEST];\n      HDELETE(HA,HJ,HK,&HLEN,KBEST,&H);\n#else\n      KBEST = LUSOL->Hk[JBEST];\n      HDELETE(LUSOL->Ha,LUSOL->Hj,LUSOL->Hk,&HLEN,KBEST,&H);\n#endif\n      HOPS += H;\n    }\n/*         ===============================================================\n           Delete the pivot row from the column file\n           and store it as the next row of  U.\n           set  indr(lu) = 0     to initialize jfill ptrs on columns of D,\n                indc(lu) = lenj  to save the original column lengths.\n           =============================================================== */\n    LUSOL->a[LU1] = ABEST;\n    LUSOL->indr[LU1] = JBEST;\n    LUSOL->indc[LU1] = NROWD;\n    LU = LU1;\n    DIAG = fabs(ABEST);\n    SETMAX(*UMAX,DIAG);\n    SETMAX(*DUMAX,DIAG);\n    SETMIN(*DUMIN,DIAG);\n    for(LR = LPIVR1; LR <= LPIVR2; LR++) {\n      LU++;\n      J = LUSOL->indr[LR];\n      LENJ = LUSOL->lenc[J];\n      LUSOL->lenc[J] = LENJ-1;\n      LC1 = LUSOL->locc[J];\n      LAST = LC1+LUSOL->lenc[J];\n      for(L = LC1; L <= LAST; L++) {\n        if(LUSOL->indc[L]==IBEST)\n          break;\n      }\n      LUSOL->a[LU] = LUSOL->a[L];\n      LUSOL->indr[LU] = 0;\n      LUSOL->indc[LU] = LENJ;\n      SETMAX(*UMAX,fabs(LUSOL->a[LU]));\n      LUSOL->a[L] = LUSOL->a[LAST];\n      LUSOL->indc[L] = LUSOL->indc[LAST];\n/*      Free entry */\n      LUSOL->indc[LAST] = 0;\n/* ???        if (j .eq. jlast) lcol = lcol - 1 */\n    }\n/*         ===============================================================\n           Delete the pivot column from the row file\n           and store the nonzeros of the next column of  L.\n           Set  indc(ll) = 0     to initialize markl(*) markers,\n                indr(ll) = 0     to initialize ifill(*) row fill-in cntrs,\n                indc(ls) = leni  to save the original row lengths,\n                indr(ls) = iqloc(i)    to save parts of  iqloc(*),\n                iqloc(i) = lsave - ls  to point to the nonzeros of  L\n                         = -1, -2, -3, ... in mark(*).\n           =============================================================== */\n    LUSOL->indc[LSAVE] = NCOLD;\n    if(MELIM==0)\n      goto x700;\n    LL = LL1-1;\n    LS = LSAVE;\n    ABEST = ONE/ABEST;\n    for(LC = LPIVC1; LC <= LPIVC2; LC++) {\n      LL++;\n      LS++;\n      I = LUSOL->indc[LC];\n      LENI = LUSOL->lenr[I];\n      LUSOL->lenr[I] = LENI-1;\n      LR1 = LUSOL->locr[I];\n      LAST = LR1+LUSOL->lenr[I];\n      for(L = LR1; L <= LAST; L++) {\n        if(LUSOL->indr[L]==JBEST)\n          break;\n      }\n      LUSOL->indr[L] = LUSOL->indr[LAST];\n/*      Free entry */\n      LUSOL->indr[LAST] = 0;\n      LUSOL->a[LL] = -LUSOL->a[LC]*ABEST;\n      LIJ = fabs(LUSOL->a[LL]);\n      SETMAX(*LMAX,LIJ);\n      LUSOL->indc[LL] = 0;\n      LUSOL->indr[LL] = 0;\n      LUSOL->indc[LS] = LENI;\n      LUSOL->indr[LS] = LUSOL->iqloc[I];\n      LUSOL->iqloc[I] = LSAVE-LS;\n    }\n/*         ===============================================================\n           Do the Gaussian elimination.\n           This involves adding a multiple of the pivot column\n           to all other columns in the pivot row.\n           Sometimes more than one call to lu1gau is needed to allow\n           compression of the column file.\n           lfirst  says which column the elimination should start with.\n           minfre  is a bound on the storage needed for any one column.\n           lu      points to off-diagonals of u.\n           nfill   keeps track of pending fill-in in the row file.\n           =============================================================== */\n    if(NELIM==0)\n      goto x700;\n    LFIRST = LPIVR1;\n    MINFRE = MLEFT+NSPARE;\n    LU = 1;\n    NFILL = 0;\n\nx400:\n#ifdef UseTimer\n    timer ( \"start\", eltime );\n#endif\n    LU1GAU(LUSOL, MELIM,NSPARE,SMALL,LPIVC1,LPIVC2,&LFIRST,LPIVR2,\n           LFREE,MINFRE,ILAST,&JLAST,&LROW,&LCOL,&LU,&NFILL,\n           LUSOL->iqloc, LUSOL->a+LL1-LUSOL_ARRAYOFFSET,\n           LUSOL->indc+LL1-LUSOL_ARRAYOFFSET, LUSOL->a+LU1-LUSOL_ARRAYOFFSET,\n           LUSOL->indr+LL1-LUSOL_ARRAYOFFSET, LUSOL->indr+LU1-LUSOL_ARRAYOFFSET);\n#ifdef UseTimer\n    timer ( \"finish\", eltime );\n#endif\n    if(LFIRST>0) {\n/*            The elimination was interrupted.\n              Compress the column file and try again.\n              lfirst, lu and nfill have appropriate new values. */\n      LU1REC(LUSOL, LUSOL->n,TRUE,&LCOL,\n                    LUSOL->indc,LUSOL->lenc,LUSOL->locc);\n      LFILE = LCOL;\n      JLAST = LUSOL->indc[LCOL+1];\n      LPIVC = LUSOL->locc[JBEST];\n      LPIVC1 = LPIVC+1;\n      LPIVC2 = LPIVC+MELIM;\n      NFREE = LFREE-LCOL;\n      if(NFREE<MINFRE) {\n          goto x970;\n      }\n      goto x400;\n    }\n/*         ===============================================================\n           The column file has been fully updated.\n           Deal with any pending fill-in in the row file.\n           =============================================================== */\n    if(NFILL>0) {\n/*            Compress the row file if necessary.\n              lu1gau has set nfill to be the number of pending fill-ins\n              plus the current length of any rows that need to be moved. */\n      MINFRE = NFILL;\n      NFREE = LFREE-LROW;\n      if(NFREE<MINFRE) {\n        LU1REC(LUSOL, LUSOL->m,FALSE,&LROW,\n                      LUSOL->indr,LUSOL->lenr,LUSOL->locr);\n        LFILE = LROW;\n        ILAST = LUSOL->indr[LROW+1];\n        LPIVR = LUSOL->locr[IBEST];\n        LPIVR1 = LPIVR+1;\n        LPIVR2 = LPIVR+NELIM;\n        NFREE = LFREE-LROW;\n        if(NFREE<MINFRE) {\n            goto x970;\n        }\n      }\n/*            Move rows that have pending fill-in to end of the row file.\n              Then insert the fill-in. */\n      LU1PEN(LUSOL, NSPARE,&ILAST,\n             LPIVC1,LPIVC2,LPIVR1,LPIVR2,\n             &LROW,LUSOL->indr+LL1-LUSOL_ARRAYOFFSET,LUSOL->indr+LU1-LUSOL_ARRAYOFFSET);\n    }\n/*         ===============================================================\n           Restore the saved values of  iqloc.\n           Insert the correct indices for the col of L and the row of U.\n           =============================================================== */\nx700:\n    LUSOL->lenr[IBEST] = 0;\n    LUSOL->lenc[JBEST] = 0;\n    LL = LL1-1;\n    LS = LSAVE;\n    for(LC = LPIVC1; LC <= LPIVC2; LC++) {\n      LL++;\n      LS++;\n      I = LUSOL->indc[LC];\n      LUSOL->iqloc[I] = LUSOL->indr[LS];\n      LUSOL->indc[LL] = I;\n      LUSOL->indr[LL] = IBEST;\n    }\n    LU = LU1-1;\n    for(LR = LPIVR; LR <= LPIVR2; LR++) {\n      LU++;\n      LUSOL->indr[LU] = LUSOL->indr[LR];\n    }\n/*         ===============================================================\n           Free the space occupied by the pivot row\n           and update the column permutation.\n           Then free the space occupied by the pivot column\n           and update the row permutation.\n           nzchng is found in both calls to lu1pq2, but we use it only\n           after the second.\n           =============================================================== */\n    LU1PQ2(LUSOL, NCOLD, &NZCHNG,\n           LUSOL->indr+LPIVR-LUSOL_ARRAYOFFSET,\n           LUSOL->indc+LU1-LUSOL_ARRAYOFFSET, LUSOL->lenc,\n           LUSOL->iqloc, LUSOL->iq, LUSOL->iqinv);\n    LU1PQ2(LUSOL, NROWD, &NZCHNG,\n           LUSOL->indc+LPIVC-LUSOL_ARRAYOFFSET,\n           LUSOL->indc+LSAVE-LUSOL_ARRAYOFFSET, LUSOL->lenr,\n           LUSOL->iploc, LUSOL->ip, LUSOL->ipinv);\n    NZLEFT += NZCHNG;\n\n/*         ===============================================================\n           lu1mxr resets Amaxr(i) in each modified row i.\n           lu1mxc moves the largest aij to the top of each modified col j.\n           28 Jun 2002: Note that cols of L have an implicit diag of 1.0,\n                        so lu1mxr is called with ll1, not ll1+1, whereas\n                           lu1mxc is called with          lu1+1.\n           =============================================================== */\n    if(UTRI && TPP) {\n/*      Relax -- we're not keeping big elements at the top yet. */\n    }\n    else {\n      if(TRP && MELIM>0)\n#ifdef ClassicHamaxR\n        LU1MXR(LUSOL, LL1,LL,LUSOL->indc,AMAXR);\n#else\n        LU1MXR(LUSOL, LL1,LL,LUSOL->indc,LUSOL->amaxr);\n#endif\n\n      if(NELIM>0) {\n        LU1MXC(LUSOL, LU1+1,LU,LUSOL->indr);\n/*      Update modified columns in heap */\n        if(TCP) {\n          for(KK = LU1+1; KK <= LU; KK++) {\n            J = LUSOL->indr[KK];\n#ifdef ClassicHamaxR\n            K = HK[J];\n#else\n            K = LUSOL->Hk[J];\n#endif\n/*      Biggest aij in column j */\n            V = fabs(LUSOL->a[LUSOL->locc[J]]);\n#ifdef ClassicHamaxR\n            HCHANGE(HA,HJ,HK,HLEN,K,V,J,&H);\n#else\n            HCHANGE(LUSOL->Ha,LUSOL->Hj,LUSOL->Hk,HLEN,K,V,J,&H);\n#endif\n            HOPS += H;\n          }\n        }\n      }\n    }\n/*         ===============================================================\n           Negate lengths of pivot row and column so they will be\n           eliminated during compressions.\n           =============================================================== */\n    LUSOL->lenr[IBEST] = -NCOLD;\n    LUSOL->lenc[JBEST] = -NROWD;\n\n/*         Test for fatal bug: row or column lists overwriting L and U. */\n    if(LROW>LSAVE || LCOL>LSAVE)\n      goto x980;\n\n/*         Reset the file lengths if pivot row or col was at the end. */\n    if(IBEST==ILAST)\n      LROW = LUSOL->locr[IBEST];\n\n    if(JBEST==JLAST)\n      LCOL = LUSOL->locc[JBEST];\n\n  }\n/*      ------------------------------------------------------------------\n        End of main loop.\n        ------------------------------------------------------------------\n        ------------------------------------------------------------------\n        Normal exit.\n        Move empty rows and cols to the end of ip, iq.\n        Then finish with a dense LU if necessary.\n        ------------------------------------------------------------------ */\nx900:\n  *INFORM = LUSOL_INFORM_LUSUCCESS;\n  LU1PQ3(LUSOL, LUSOL->m,LUSOL->lenr,LUSOL->ip,LUSOL->ipinv,&MRANK);\n  LU1PQ3(LUSOL, LUSOL->n,LUSOL->lenc,LUSOL->iq,LUSOL->iqinv,NRANK);\n  SETMIN(*NRANK, MRANK);\n  if(DENSLU) {\n#ifdef UseTimer\n    timer ( \"start\", 17 );\n#endif\n    LU1FUL(LUSOL, LEND,LU1,TPP,MLEFT,NLEFT,*NRANK,NROWU,LENL,LENU,\n           &NSING,KEEPLU,SMALL,LUSOL->a+LD-LUSOL_ARRAYOFFSET,LUSOL->locr);\n/* ***     21 Dec 1994: Bug in next line.\n   ***     nrank  = nrank - nsing */\n    *NRANK = MINMN-NSING;\n#ifdef UseTimer\n    timer ( \"finish\", 17 );\n#endif\n  }\n  *MINLEN = (*LENL)+(*LENU)+2*(LUSOL->m+LUSOL->n);\n  goto x990;\n/*      Not enough space free after a compress.\n        Set  minlen  to an estimate of the necessary value of  lena. */\nx970:\n  *INFORM = LUSOL_INFORM_ANEEDMEM;\n  *MINLEN = LENA2+LFILE+2*(LUSOL->m+LUSOL->n);\n  goto x990;\n/*      Fatal error.  This will never happen!\n       (Famous last words.) */\nx980:\n  *INFORM = LUSOL_INFORM_FATALERR;\n  goto x990;\n/*      Fatal error with TSP.  Diagonal pivot not found. */\nx985:\n  *INFORM = LUSOL_INFORM_NOPIVOT;\n/*      Exit. */\nx990:\n#ifdef UseTimer\n  timer ( \"finish\", 3 );\n#endif\n;\n}\n\n\n/* ==================================================================\n   lu1fac computes a factorization A = L*U, where A is a sparse\n   matrix with m rows and n columns, P*L*P' is lower triangular\n   and P*U*Q is upper triangular for certain permutations P, Q\n   (which are returned in the arrays ip, iq).\n   Stability is ensured by limiting the size of the elements of L.\n   The nonzeros of A are input via the parallel arrays a, indc, indr,\n   which should contain nelem entries of the form    aij,    i,    j\n   in any order.  There should be no duplicate pairs         i,    j.\n\n   ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n   +        Beware !!!   The row indices i must be in indc,         +\n   +              and the column indices j must be in indr.         +\n   +              (Not the other way round!)                        +\n   ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n\n   It does not matter if some of the entries in a(*) are zero.\n   Entries satisfying  abs( a(i) ) .le. parmlu(3)  are ignored.\n   Other parameters in luparm and parmlu are described below.\n   The matrix A may be singular.  On exit, nsing = luparm(11) gives\n   the number of apparent singularities.  This is the number of\n   \"small\" diagonals of the permuted factor U, as judged by\n   the input tolerances Utol1 = parmlu(4) and  Utol2 = parmlu(5).\n   The diagonal element diagj associated with column j of A is\n   \"small\" if\n               abs( diagj ) .le. Utol1\n   or\n               abs( diagj ) .le. Utol2 * max( uj ),\n   where max( uj ) is the maximum element in the j-th column of U.\n   The position of such elements is returned in w(*).  In general,\n   w(j) = + max( uj ),  but if column j is a singularity,\n   w(j) = - max( uj ).  Thus, w(j) .le. 0 if column j appears to be\n   dependent on the other columns of A.\n   NOTE: lu1fac (like certain other sparse LU packages) does not\n   treat dense columns efficiently.  This means it will be slow\n   on \"arrow matrices\" of the form\n                A = (x       a)\n                    (  x     b)\n                    (    x   c)\n                    (      x d)\n                    (x x x x e)\n   if the numerical values in the dense column allow it to be\n   chosen LATE in the pivot order.\n   With TPP (Threshold Partial Pivoting), the dense column is\n   likely to be chosen late.\n   With TCP (Threshold Complete Pivoting), if any of a,b,c,d\n   is significantly larger than other elements of A, it will\n   be chosen as the first pivot and the dense column will be\n   eliminated, giving reasonably sparse factors.\n   However, if element e is so big that TCP chooses it, the factors\n   will become dense.  (It's hard to win on these examples!)\n   ------------------------------------------------------------------\n\n   Notes on the array names\n   ------------------------\n   During the LU factorization, the sparsity pattern of the matrix\n   being factored is stored twice: in a column list and a row list.\n   The column list is ( a, indc, locc, lenc )\n   where\n         a(*)    holds the nonzeros,\n         indc(*) holds the indices for the column list,\n         locc(j) points to the start of column j in a(*) and indc(*),\n         lenc(j) is the number of nonzeros in column j.\n   The row list is    (    indr, locr, lenr )\n   where\n         indr(*) holds the indices for the row list,\n         locr(i) points to the start of row i in indr(*),\n         lenr(i) is the number of nonzeros in row i.\n   At all stages of the LU factorization, ip contains a complete\n   row permutation.  At the start of stage k,  ip(1), ..., ip(k-1)\n   are the first k-1 rows of the final row permutation P.\n   The remaining rows are stored in an ordered list\n                        ( ip, iploc, ipinv )\n   where\n         iploc(nz) points to the start in ip(*) of the set of rows\n                   that currently contain nz nonzeros,\n         ipinv(i)  points to the position of row i in ip(*).\n   For example,\n         iploc(1) = k   (and this is where rows of length 1 {),\n         iploc(2) = k+p  if there are p rows of length 1\n                        (and this is where rows of length 2 {).\n   Similarly for iq, iqloc, iqinv.\n   ---------------------------------------------------------------------\n   INPUT PARAMETERS\n   m      (not altered) is the number of rows in A.\n   n      (not altered) is the number of columns in A.\n   nelem  (not altered) is the number of matrix entries given in\n          the arrays a, indc, indr.\n   lena   (not altered) is the dimension of  a, indc, indr.\n          This should be significantly larger than nelem.\n          Typically one should have\n             lena > max( 2*nelem, 10*m, 10*n, 10000 )\n          but some applications may need more.\n          On machines with virtual memory it is safe to have\n          lena \"far bigger than necessary\", since not all of the\n          arrays will be used.\n   a      (overwritten) contains entries   Aij  in   a(1:nelem).\n   indc   (overwritten) contains the indices i in indc(1:nelem).\n   indr   (overwritten) contains the indices j in indr(1:nelem).\n   luparm input parameters:                                Typical value\n   luparm( 1) = nout     File number for printed messages.         6\n   luparm( 2) = lprint   Print level.                              0\n                    <  0 suppresses output.\n                    =  0 gives error messages.\n                   >= 10 gives statistics about the LU factors.\n                   >= 50 gives debug output from lu1fac\n                         (the pivot row and column and the\n                         no. of rows and columns involved at\n                         each elimination step).\n   luparm( 3) = maxcol   lu1fac: maximum number of columns         5\n                         searched allowed in a Markowitz-type\n                         search for the next pivot element.\n                         For some of the factorization, the\n                         number of rows searched is\n                         maxrow = maxcol - 1.\n   luparm( 6) = 0    =>  TPP: Threshold Partial   Pivoting.        0\n              = 1    =>  TRP: Threshold Rook      Pivoting.\n              = 2    =>  TCP: Threshold Complete  Pivoting.\n              = 3    =>  TSP: Threshold Symmetric Pivoting.\n              = 4    =>  TDP: Threshold Diagonal  Pivoting.\n                              (TDP not yet implemented).\n                         TRP and TCP are more expensive than TPP but\n                         more stable and better at revealing rank.\n                         Take care with setting parmlu(1), especially\n                         with TCP.\n                         NOTE: TSP and TDP are for symmetric matrices\n                         that are either definite or quasi-definite.\n                         TSP is effectively TRP for symmetric matrices.\n                         TDP is effectively TCP for symmetric matrices.\n   luparm( 8) = keepLU   lu1fac: keepLU = 1 means the numerical    1\n                         factors will be computed if possible.\n                         keepLU = 0 means L and U will be discarded\n                         but other information such as the row and\n                         column permutations will be returned.\n                         The latter option requires less storage.\n   parmlu input parameters:                                Typical value\n   parmlu( 1) = Ltol1    Max Lij allowed during Factor.\n                                                   TPP     10.0 or 100.0\n                                                   TRP      4.0 or  10.0\n                                                   TCP      5.0 or  10.0\n                                                   TSP      4.0 or  10.0\n                         With TRP and TCP (Rook and Complete Pivoting),\n                         values less than 25.0 may be expensive\n                         on badly scaled data.  However,\n                         values less than 10.0 may be needed\n                         to obtain a reliable rank-revealing\n                         factorization.\n   parmlu( 2) = Ltol2    Max Lij allowed during Updates.            10.0\n                         during updates.\n   parmlu( 3) = small    Absolute tolerance for       eps**0.8 = 3.0d-13\n                         treating reals as zero.\n   parmlu( 4) = Utol1    Absolute tol for flagging    eps**0.67= 3.7d-11\n                         small diagonals of U.\n   parmlu( 5) = Utol2    Relative tol for flagging    eps**0.67= 3.7d-11\n                         small diagonals of U.\n                         (eps = machine precision)\n   parmlu( 6) = Uspace   Factor limiting waste space in  U.      3.0\n                         In lu1fac, the row or column lists\n                         are compressed if their length\n                         exceeds Uspace times the length of\n                         either file after the last compression.\n   parmlu( 7) = dens1    The density at which the Markowitz      0.3\n                         pivot strategy should search maxcol\n                         columns and no rows.\n                         (Use 0.3 unless you are experimenting\n                         with the pivot strategy.)\n   parmlu( 8) = dens2    the density at which the Markowitz      0.5\n                         strategy should search only 1 column,\n                         or (if storage is available)\n                         the density at which all remaining\n                         rows and columns will be processed\n                         by a dense LU code.\n                         For example, if dens2 = 0.1 and lena is\n                         large enough, a dense LU will be used\n                         once more than 10 per cent of the\n                         remaining matrix is nonzero.\n\n   OUTPUT PARAMETERS\n   a, indc, indr     contain the nonzero entries in the LU factors of A.\n          If keepLU = 1, they are in a form suitable for use\n          by other parts of the LUSOL package, such as lu6sol.\n          U is stored by rows at the start of a, indr.\n          L is stored by cols at the end   of a, indc.\n          If keepLU = 0, only the diagonals of U are stored, at the\n          end of a.\n   ip, iq    are the row and column permutations defining the\n          pivot order.  For example, row ip(1) and column iq(1)\n          defines the first diagonal of U.\n   lenc(1:numl0) contains the number of entries in nontrivial\n          columns of L (in pivot order).\n   lenr(1:m) contains the number of entries in each row of U\n          (in original order).\n   locc(1:n) = 0 (ready for the LU update routines).\n   locr(1:m) points to the beginning of the rows of U in a, indr.\n   iploc, iqloc, ipinv, iqinv  are undefined.\n   w      indicates singularity as described above.\n   inform = 0 if the LU factors were obtained successfully.\n          = 1 if U appears to be singular, as judged by lu6chk.\n          = 3 if some index pair indc(l), indr(l) lies outside\n              the matrix dimensions 1:m , 1:n.\n          = 4 if some index pair indc(l), indr(l) duplicates\n              another such pair.\n          = 7 if the arrays a, indc, indr were not large enough.\n              Their length \"lena\" should be increase to at least\n              the value \"minlen\" given in luparm(13).\n          = 8 if there was some other fatal error.  (Shouldn't happen!)\n          = 9 if no diagonal pivot could be found with TSP or TDP.\n              The matrix must not be sufficiently definite\n              or quasi-definite.\n   luparm output parameters:\n   luparm(10) = inform   Return code from last call to any LU routine.\n   luparm(11) = nsing    No. of singularities marked in the\n                         output array w(*).\n   luparm(12) = jsing    Column index of last singularity.\n   luparm(13) = minlen   Minimum recommended value for  lena.\n   luparm(14) = maxlen   ?\n   luparm(15) = nupdat   No. of updates performed by the lu8 routines.\n   luparm(16) = nrank    No. of nonempty rows of U.\n   luparm(17) = ndens1   No. of columns remaining when the density of\n                         the matrix being factorized reached dens1.\n   luparm(18) = ndens2   No. of columns remaining when the density of\n                         the matrix being factorized reached dens2.\n   luparm(19) = jumin    The column index associated with DUmin.\n   luparm(20) = numL0    No. of columns in initial  L.\n   luparm(21) = lenL0    Size of initial  L  (no. of nonzeros).\n   luparm(22) = lenU0    Size of initial  U.\n   luparm(23) = lenL     Size of current  L.\n   luparm(24) = lenU     Size of current  U.\n   luparm(25) = lrow     Length of row file.\n   luparm(26) = ncp      No. of compressions of LU data structures.\n   luparm(27) = mersum   lu1fac: sum of Markowitz merit counts.\n   luparm(28) = nUtri    lu1fac: triangular rows in U.\n   luparm(29) = nLtri    lu1fac: triangular rows in L.\n   luparm(30) =\n   parmlu output parameters:\n   parmlu(10) = Amax     Maximum element in  A.\n   parmlu(11) = Lmax     Maximum multiplier in current  L.\n   parmlu(12) = Umax     Maximum element in current  U.\n   parmlu(13) = DUmax    Maximum diagonal in  U.\n   parmlu(14) = DUmin    Minimum diagonal in  U.\n   parmlu(15) = Akmax    Maximum element generated at any stage\n                         during TCP factorization.\n   parmlu(16) = growth   TPP: Umax/Amax    TRP, TCP, TSP: Akmax/Amax\n   parmlu(17) =\n   parmlu(18) =\n   parmlu(19) =\n   parmlu(20) = resid    lu6sol: residual after solve with U or U'.\n   ...\n   parmlu(30) =\n   ------------------------------------------------------------------\n   00 Jun 1983  Original version.\n   00 Jul 1987  nrank  saved in luparm(16).\n   12 Apr 1989  ipinv, iqinv added as workspace.\n   26 Apr 1989  maxtie replaced by maxcol in Markowitz search.\n   16 Mar 1992  jumin  saved in luparm(19).\n   10 Jun 1992  lu1fad has to move empty rows and cols to the bottom\n                (via lu1pq3) before doing the dense LU.\n   12 Jun 1992  Deleted dense LU (lu1ful, lu1vlu).\n   25 Oct 1993  keepLU implemented.\n   07 Feb 1994  Added new dense LU (lu1ful, lu1den).\n   21 Dec 1994  Bugs fixed in lu1fad (nrank) and lu1ful (ipvt).\n   08 Aug 1995  Use ip instead of w as parameter to lu1or3 (for F90).\n   13 Sep 2000  TPP and TCP options implemented.\n   17 Oct 2000  Fixed troubles due to A = empty matrix (Todd Munson).\n   01 Dec 2000  Save Lmax, Umax, etc. after both lu1fad and lu6chk.\n                lu1fad sets them when keepLU = false.\n                lu6chk sets them otherwise, and includes items\n                from the dense LU.\n   11 Mar 2001  lu6chk now looks at diag(U) when keepLU = false.\n   26 Apr 2002  New TCP implementation using heap routines to\n                store largest element in each column.\n                New workspace arrays Ha, Hj, Hk required.\n                For compatibility, borrow space from a, indc, indr\n                rather than adding new input parameters.\n   01 May 2002  lu1den changed to lu1DPP (dense partial  pivoting).\n                lu1DCP implemented       (dense complete pivoting).\n                Both TPP and TCP now switch to dense mode and end.\n   ================================================================== */\nvoid LU1FAC(LUSOLrec *LUSOL, int *INFORM)\n{\n  MYBOOL  KEEPLU, TCP, TPP, TRP, TSP;\n  int     LPIV, NELEM0, LPRINT, MINLEN, NUML0, LENL, LENU, LROW, MERSUM,\n          NUTRI, NLTRI, NDENS1, NDENS2, NRANK, NSING, JSING, JUMIN, NUMNZ, LERR,\n          LU, LL, LM, LTOPL, K, I, LENUK, J, LENLK, IDUMMY, LLSAVE, NMOVE, L2, L, NCP, NBUMP;\n#ifdef ClassicHamaxR\n  int     LENH, LENA2, LOCH, LMAXR;\n#endif\n\n  REAL    LMAX, LTOL, SMALL, AMAX, UMAX, DUMAX, DUMIN, AKMAX, DM, DN, DELEM, DENSTY,\n          AGRWTH, UGRWTH, GROWTH, CONDU, DINCR, AVGMER;\n\n/*      Free row-based version of L0 (regenerated by LUSOL_btran). */\n  if(LUSOL->L0 != NULL)\n    LUSOL_matfree(&(LUSOL->L0));\n\n/*      Grab relevant input parameters. */\n  NELEM0 = LUSOL->nelem;\n  LPRINT = LUSOL->luparm[LUSOL_IP_PRINTLEVEL];\n  LPIV   = LUSOL->luparm[LUSOL_IP_PIVOTTYPE];\n  KEEPLU = (MYBOOL) (LUSOL->luparm[LUSOL_IP_KEEPLU]!=FALSE);\n/*      Limit on size of Lij */\n  LTOL   = LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij];\n/*      Drop tolerance */\n  SMALL  = LUSOL->parmlu[LUSOL_RP_ZEROTOLERANCE];\n  TPP = (MYBOOL) (LPIV==LUSOL_PIVMOD_TPP);\n  TRP = (MYBOOL) (LPIV==LUSOL_PIVMOD_TRP);\n  TCP = (MYBOOL) (LPIV==LUSOL_PIVMOD_TCP);\n  TSP = (MYBOOL) (LPIV==LUSOL_PIVMOD_TSP);\n/*      Initialize output parameters. */\n  *INFORM = LUSOL_INFORM_LUSUCCESS;\n  LERR   = 0;\n  MINLEN = LUSOL->nelem + 2*(LUSOL->m+LUSOL->n);\n  NUML0  = 0;\n  LENL   = 0;\n  LENU   = 0;\n  LROW   = 0;\n  MERSUM = 0;\n  NUTRI  = LUSOL->m;\n  NLTRI  = 0;\n  NDENS1 = 0;\n  NDENS2 = 0;\n  NRANK  = 0;\n  NSING  = 0;\n  JSING  = 0;\n  JUMIN  = 0;\n  AMAX   = ZERO;\n  LMAX   = ZERO;\n  UMAX   = ZERO;\n  DUMAX  = ZERO;\n  DUMIN  = ZERO;\n  AKMAX  = ZERO;\n\n/*      Float version of dimensions. */\n  DM = LUSOL->m;\n  DN = LUSOL->n;\n  DELEM = LUSOL->nelem;\n\n/*      Initialize workspace parameters. */\n  LUSOL->luparm[LUSOL_IP_COMPRESSIONS_LU] = 0;\n  if(LUSOL->lena < MINLEN) {\n    if(!LUSOL_realloc_a(LUSOL, MINLEN))\n      goto x970;\n  }\n\n/*      ------------------------------------------------------------------\n        Organize the  aij's  in  a, indc, indr.\n        lu1or1  deletes small entries, tests for illegal  i,j's,\n                and counts the nonzeros in each row and column.\n        lu1or2  reorders the elements of  A  by columns.\n        lu1or3  uses the column list to test for duplicate entries\n                (same indices  i,j).\n        lu1or4  constructs a row list from the column list.\n        ------------------------------------------------------------------ */\n  LU1OR1(LUSOL, SMALL,&AMAX,&NUMNZ,&LERR,INFORM);\n  if(LPRINT>=LUSOL_MSG_STATISTICS) {\n    DENSTY = (100*DELEM)/(DM*DN);\n    LUSOL_report(LUSOL, 0, \"m:%6d %c n:%6d  nzcount:%9d  Amax:%g  Density:%g\\n\",\n                           LUSOL->m, relationChar(LUSOL->m, LUSOL->n), LUSOL->n,\n                           LUSOL->nelem, AMAX, DENSTY);\n  }\n  if(*INFORM!=LUSOL_INFORM_LUSUCCESS)\n    goto x930;\n  LUSOL->nelem = NUMNZ;\n  LU1OR2(LUSOL);\n  LU1OR3(LUSOL, &LERR,INFORM);\n  if(*INFORM!=LUSOL_INFORM_LUSUCCESS)\n    goto x940;\n  LU1OR4(LUSOL);\n/*      ------------------------------------------------------------------\n        Set up lists of rows and columns with equal numbers of nonzeros,\n        using  indc(*)  as workspace.\n        ------------------------------------------------------------------ */\n  LU1PQ1(LUSOL, LUSOL->m,LUSOL->n,LUSOL->lenr,\n         LUSOL->ip,LUSOL->iploc,LUSOL->ipinv,\n         LUSOL->indc+LUSOL->nelem); /* LUSOL_ARRAYOFFSET implied */\n  LU1PQ1(LUSOL, LUSOL->n,LUSOL->m,LUSOL->lenc,\n         LUSOL->iq,LUSOL->iqloc,LUSOL->iqinv,\n         LUSOL->indc+LUSOL->nelem); /* LUSOL_ARRAYOFFSET implied */\n/*      ------------------------------------------------------------------\n        For TCP, Ha, Hj, Hk are allocated separately, similarly amaxr\n        for TRP. Then compute the factorization  A = L*U.\n        ------------------------------------------------------------------ */\n#ifdef ClassicHamaxR\n  if(TPP || TSP) {\n    LENH  = 1;\n    LENA2 = LUSOL->lena;\n    LOCH  = LUSOL->lena;\n    LMAXR = 1;\n  }\n  else if(TRP) {\n    LENH  = 1;                     /* Dummy                                */\n    LENA2 = LUSOL->lena-LUSOL->m;  /* Reduced length of      a             */\n    LOCH  = LUSOL->lena;           /* Dummy                                */\n    LMAXR = LENA2+1;               /* Start of Amaxr      in a             */\n  }\n  else if(TCP) {\n    LENH  = LUSOL->n;              /* Length of heap                       */\n    LENA2 = LUSOL->lena-LENH;      /* Reduced length of      a, indc, indr */\n    LOCH  = LENA2+1;               /* Start of Ha, Hj, Hk in a, indc, indr */\n    LMAXR = 1;                     /* Dummy                                */\n  }\n  LU1FAD(LUSOL,\n         LENA2,LENH,\n         LUSOL->a+LOCH-LUSOL_ARRAYOFFSET,\n         LUSOL->indc+LOCH-LUSOL_ARRAYOFFSET,\n         LUSOL->indr+LOCH-LUSOL_ARRAYOFFSET,\n         LUSOL->a+LMAXR-LUSOL_ARRAYOFFSET,\n         INFORM,&LENL,&LENU,\n         &MINLEN,&MERSUM,&NUTRI,&NLTRI,&NDENS1,&NDENS2,\n         &NRANK,&LMAX,&UMAX,&DUMAX,&DUMIN,&AKMAX);\n#else\n  LU1FAD(LUSOL,\n         INFORM,&LENL,&LENU,\n         &MINLEN,&MERSUM,&NUTRI,&NLTRI,&NDENS1,&NDENS2,\n         &NRANK,&LMAX,&UMAX,&DUMAX,&DUMIN,&AKMAX);\n#endif\n  LUSOL->luparm[LUSOL_IP_RANK_U]     = NRANK;\n  LUSOL->luparm[LUSOL_IP_NONZEROS_L] = LENL;\n  if(*INFORM==LUSOL_INFORM_ANEEDMEM)\n    goto x970;\n  if(*INFORM==LUSOL_INFORM_NOPIVOT)\n    goto x985;\n  if(*INFORM>LUSOL_INFORM_LUSUCCESS)\n    goto x980;\n  if(KEEPLU) {\n/*         ---------------------------------------------------------------\n           The LU factors are at the top of  a, indc, indr,\n           with the columns of  L  and the rows of  U  in the order\n           ( free )   ... ( u3 ) ( l3 ) ( u2 ) ( l2 ) ( u1 ) ( l1 ).\n           Starting with ( l1 ) and ( u1 ), move the rows of  U  to the\n           left and the columns of  L  to the right, giving\n           ( u1 ) ( u2 ) ( u3 ) ...   ( free )   ... ( l3 ) ( l2 ) ( l1 ).\n           Also, set  numl0 = the number of nonempty columns of  U.\n           --------------------------------------------------------------- */\n    LU = 0;\n    LL = LUSOL->lena+1;\n#ifdef ClassicHamaxR\n    LM = LENA2+1;\n#else\n    LM = LL;\n#endif\n    LTOPL = LL-LENL-LENU;\n    LROW = LENU;\n    for(K = 1; K <= NRANK; K++) {\n      I = LUSOL->ip[K];\n      LENUK = -LUSOL->lenr[I];\n      LUSOL->lenr[I] = LENUK;\n      J = LUSOL->iq[K];\n      LENLK = -LUSOL->lenc[J]-1;\n      if(LENLK>0) {\n        NUML0++;\n        LUSOL->iqloc[NUML0] = LENLK;\n      }\n      if(LU+LENUK<LTOPL) {\n/*               =========================================================\n                 There is room to move ( uk ).  Just right-shift ( lk ).\n                 ========================================================= */\n        for(IDUMMY = 1; IDUMMY <= LENLK; IDUMMY++) {\n          LL--;\n          LM--;\n          LUSOL->a[LL] = LUSOL->a[LM];\n          LUSOL->indc[LL] = LUSOL->indc[LM];\n          LUSOL->indr[LL] = LUSOL->indr[LM];\n        }\n      }\n      else {\n/*               =========================================================\n                 There is no room for ( uk ) yet.  We have to\n                 right-shift the whole of the remaining LU file.\n                 Note that ( lk ) ends up in the correct place.\n                 ========================================================= */\n        LLSAVE = LL-LENLK;\n        NMOVE = LM-LTOPL;\n        for(IDUMMY = 1; IDUMMY <= NMOVE; IDUMMY++) {\n          LL--;\n          LM--;\n          LUSOL->a[LL] = LUSOL->a[LM];\n          LUSOL->indc[LL] = LUSOL->indc[LM];\n          LUSOL->indr[LL] = LUSOL->indr[LM];\n        }\n        LTOPL = LL;\n        LL = LLSAVE;\n        LM = LL;\n      }\n/*            ======================================================\n              Left-shift ( uk ).\n              ====================================================== */\n      LUSOL->locr[I] = LU+1;\n      L2 = LM-1;\n      LM = LM-LENUK;\n      for(L = LM; L <= L2; L++) {\n        LU = LU+1;\n        LUSOL->a[LU] = LUSOL->a[L];\n        LUSOL->indr[LU] = LUSOL->indr[L];\n      }\n    }\n/*         ---------------------------------------------------------------\n           Save the lengths of the nonempty columns of  L,\n           and initialize  locc(j)  for the LU update routines.\n           --------------------------------------------------------------- */\n    for(K = 1; K <= NUML0; K++) {\n      LUSOL->lenc[K] = LUSOL->iqloc[K];\n    }\n    for(J = 1; J <= LUSOL->n; J++) {\n      LUSOL->locc[J] = 0;\n    }\n/*         ---------------------------------------------------------------\n           Test for singularity.\n           lu6chk  sets  nsing, jsing, jumin, Lmax, Umax, DUmax, DUmin\n           (including entries from the dense LU).\n           inform = 1  if there are singularities (nsing gt 0).\n           --------------------------------------------------------------- */\n    LU6CHK(LUSOL, 1,LUSOL->lena,INFORM);\n    NSING = LUSOL->luparm[LUSOL_IP_SINGULARITIES];\n    JSING = LUSOL->luparm[LUSOL_IP_SINGULARINDEX];\n    JUMIN = LUSOL->luparm[LUSOL_IP_COLINDEX_DUMIN];\n    LMAX  = LUSOL->parmlu[LUSOL_RP_MAXMULT_L];\n    UMAX  = LUSOL->parmlu[LUSOL_RP_MAXELEM_U];\n    DUMAX = LUSOL->parmlu[LUSOL_RP_MAXELEM_DIAGU];\n    DUMIN = LUSOL->parmlu[LUSOL_RP_MINELEM_DIAGU];\n  }\n  else {\n/*         ---------------------------------------------------------------\n           keepLU = 0.  L and U were not kept, just the diagonals of U.\n           lu1fac will probably be called again soon with keepLU = .true.\n           11 Mar 2001: lu6chk revised.  We can call it with keepLU = 0,\n                        but we want to keep Lmax, Umax from lu1fad.\n           05 May 2002: Allow for TCP with new lu1DCP.  Diag(U) starts\n                        below lena2, not lena.  Need lena2 in next line.\n           --------------------------------------------------------------- */\n#ifdef ClassicHamaxR\n    LU6CHK(LUSOL, 1,LENA2,INFORM);\n#else\n    LU6CHK(LUSOL, 1,LUSOL->lena,INFORM);\n#endif\n    NSING = LUSOL->luparm[LUSOL_IP_SINGULARITIES];\n    JSING = LUSOL->luparm[LUSOL_IP_SINGULARINDEX];\n    JUMIN = LUSOL->luparm[LUSOL_IP_COLINDEX_DUMIN];\n    DUMAX = LUSOL->parmlu[LUSOL_RP_MAXELEM_DIAGU];\n    DUMIN = LUSOL->parmlu[LUSOL_RP_MINELEM_DIAGU];\n  }\n  goto x990;\n/*      ------------\n        Error exits.\n        ------------ */\nx930:\n  *INFORM = LUSOL_INFORM_ADIMERR;\n  if(LPRINT>=LUSOL_MSG_SINGULARITY)\n    LUSOL_report(LUSOL, 0, \"lu1fac  error...\\nentry  a[%d]  has an illegal row (%d) or column (%d) index\\n\",\n                        LERR,LUSOL->indc[LERR],LUSOL->indr[LERR]);\n  goto x990;\nx940:\n  *INFORM = LUSOL_INFORM_ADUPLICATE;\n  if(LPRINT>=LUSOL_MSG_SINGULARITY)\n    LUSOL_report(LUSOL, 0, \"lu1fac  error...\\nentry  a[%d]  is a duplicate with indeces indc=%d, indr=%d\\n\",\n                        LERR,LUSOL->indc[LERR],LUSOL->indr[LERR]);\n  goto x990;\nx970:\n  *INFORM = LUSOL_INFORM_ANEEDMEM;\n  if(LPRINT>=LUSOL_MSG_SINGULARITY)\n    LUSOL_report(LUSOL, 0, \"lu1fac  error...\\ninsufficient storage; increase  lena  from %d to at least %d\\n\",\n                        LUSOL->lena, MINLEN);\n  goto x990;\nx980:\n  *INFORM = LUSOL_INFORM_FATALERR;\n  if(LPRINT>=LUSOL_MSG_SINGULARITY)\n    LUSOL_report(LUSOL, 0, \"lu1fac  error...\\nfatal bug   (sorry --- this should never happen)\\n\");\n  goto x990;\nx985:\n  *INFORM = LUSOL_INFORM_NOPIVOT;\n  if(LPRINT>=LUSOL_MSG_SINGULARITY)\n    LUSOL_report(LUSOL, 0, \"lu1fac  error...\\nTSP used but diagonal pivot could not be found\\n\");\n\n/*      Finalize and store output parameters. */\nx990:\n  LUSOL->nelem = NELEM0;\n  LUSOL->luparm[LUSOL_IP_SINGULARITIES]   = NSING;\n  LUSOL->luparm[LUSOL_IP_SINGULARINDEX]   = JSING;\n  LUSOL->luparm[LUSOL_IP_MINIMUMLENA]     = MINLEN;\n  LUSOL->luparm[LUSOL_IP_UPDATECOUNT]     = 0;\n  LUSOL->luparm[LUSOL_IP_RANK_U]          = NRANK;\n  LUSOL->luparm[LUSOL_IP_COLCOUNT_DENSE1] = NDENS1;\n  LUSOL->luparm[LUSOL_IP_COLCOUNT_DENSE2] = NDENS2;\n  LUSOL->luparm[LUSOL_IP_COLINDEX_DUMIN]  = JUMIN;\n  LUSOL->luparm[LUSOL_IP_COLCOUNT_L0]     = NUML0;\n  LUSOL->luparm[LUSOL_IP_ROWCOUNT_L0]     = 0;\n  LUSOL->luparm[LUSOL_IP_NONZEROS_L0]     = LENL;\n  LUSOL->luparm[LUSOL_IP_NONZEROS_U0]     = LENU;\n  LUSOL->luparm[LUSOL_IP_NONZEROS_L]      = LENL;\n  LUSOL->luparm[LUSOL_IP_NONZEROS_U]      = LENU;\n  LUSOL->luparm[LUSOL_IP_NONZEROS_ROW]    = LROW;\n  LUSOL->luparm[LUSOL_IP_MARKOWITZ_MERIT] = MERSUM;\n  LUSOL->luparm[LUSOL_IP_TRIANGROWS_U]    = NUTRI;\n  LUSOL->luparm[LUSOL_IP_TRIANGROWS_L]    = NLTRI;\n  LUSOL->parmlu[LUSOL_RP_MAXELEM_A]       = AMAX;\n  LUSOL->parmlu[LUSOL_RP_MAXMULT_L]       = LMAX;\n  LUSOL->parmlu[LUSOL_RP_MAXELEM_U]       = UMAX;\n  LUSOL->parmlu[LUSOL_RP_MAXELEM_DIAGU]   = DUMAX;\n  LUSOL->parmlu[LUSOL_RP_MINELEM_DIAGU]   = DUMIN;\n  LUSOL->parmlu[LUSOL_RP_MAXELEM_TCP]     = AKMAX;\n  AGRWTH = AKMAX/(AMAX+LUSOL_SMALLNUM);\n  UGRWTH = UMAX/(AMAX+LUSOL_SMALLNUM);\n  if(TPP)\n    GROWTH = UGRWTH;\n/*      TRP or TCP or TSP */\n  else\n    GROWTH = AGRWTH;\n  LUSOL->parmlu[LUSOL_RP_GROWTHRATE]      = GROWTH;\n\n  LUSOL->luparm[LUSOL_IP_FTRANCOUNT]      = 0;\n  LUSOL->luparm[LUSOL_IP_BTRANCOUNT]      = 0;\n\n/*      ------------------------------------------------------------------\n        Set overall status variable.\n        ------------------------------------------------------------------ */\n  LUSOL->luparm[LUSOL_IP_INFORM]          = *INFORM;\n  if(*INFORM == LUSOL_INFORM_NOMEMLEFT)\n    LUSOL_report(LUSOL, 0, \"lu1fac  error...\\ninsufficient memory available\\n\");\n\n/*      ------------------------------------------------------------------\n        Print statistics for the LU factors.\n        ------------------------------------------------------------------ */\n  NCP   = LUSOL->luparm[LUSOL_IP_COMPRESSIONS_LU];\n  CONDU = DUMAX/MAX(DUMIN,LUSOL_SMALLNUM);\n  DINCR = (LENL+LENU)-LUSOL->nelem;\n  DINCR = (DINCR*100)/MAX(DELEM,ONE);\n  AVGMER = MERSUM;\n  AVGMER = AVGMER/DM;\n  NBUMP = LUSOL->m-NUTRI-NLTRI;\n  if(LPRINT>=LUSOL_MSG_STATISTICS) {\n    if(TPP) {\n      LUSOL_report(LUSOL, 0, \"Merit %g %d %d %d %g %d %d %g %g %d %d %d\\n\",\n                          AVGMER,LENL,LENL+LENU,NCP,DINCR,NUTRI,LENU,\n                          LTOL,UMAX,UGRWTH,NLTRI,NDENS1,LMAX);\n    }\n    else {\n      LUSOL_report(LUSOL, 0, \"Merit %s %g %d %d %d %g %d %d %g %g %d %d %d %g %g\\n\",\n                          LUSOL_pivotLabel(LUSOL),\n                          AVGMER,LENL,LENL+LENU,NCP,DINCR,NUTRI,LENU,\n                          LTOL,UMAX,UGRWTH,NLTRI,NDENS1,LMAX,AKMAX,AGRWTH);\n    }\n    LUSOL_report(LUSOL, 0, \"bump%9d  dense2%7d  DUmax%g DUmin%g  conDU%g\\n\",\n                          NBUMP,NDENS2,DUMAX,DUMIN,CONDU);\n  }\n}\n\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/bfp/bfp_LUSOL/LUSOL/lusol2.c",
    "content": "\n/* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n   File  lusol2 LUSOL heap management routines\n   Hbuild   Hchange  Hdelete  Hdown    Hinsert  Hup\n   Heap-management routines for LUSOL's lu1fac.\n   May be useful for other applications.\n   ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n   For LUSOL, the heap structure involves three arrays of length N.\n   N        is the current number of entries in the heap.\n   Ha(1:N)  contains the values that the heap is partially sorting.\n            For LUSOL they are double precision values -- the largest\n            element in each remaining column of the updated matrix.\n            The biggest entry is in Ha(1), the top of the heap.\n   Hj(1:N)  contains column numbers j.\n            Ha(k) is the biggest entry in column j = Hj(k).\n   Hk(1:N)  contains indices within the heap.  It is the\n            inverse of Hj(1:N), so  k = Hk(j)  <=>  j = Hj(k).\n            Column j is entry k in the heap.\n   hops     is the number of heap operations,\n            i.e., the number of times an entry is moved\n            (the number of \"hops\" up or down the heap).\n   Together, Hj and Hk let us find values inside the heap\n   whenever we want to change one of the values in Ha.\n   For other applications, Ha may need to be some other data type,\n   like the keys that sort routines operate on.\n   ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n   11 Feb 2002: MATLAB  version derived from \"Algorithms\" by\n                R. Sedgewick\n   03 Mar 2002: F77     version derived from MATLAB version.\n   07 May 2002: Safeguard input parameters k, N, Nk.\n                We don't want them to be output!\n   07 May 2002: Current version of lusol2.f.\n   ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */\n\n/* ==================================================================\n   Hdown  updates heap by moving down tree from node k.\n   ------------------------------------------------------------------\n   01 May 2002: Need Nk for length of Hk.\n   05 May 2002: Change input paramter k to kk to stop k being output.\n   05 May 2002: Current version of Hdown.\n   ================================================================== */\nvoid HDOWN(REAL HA[], int HJ[], int HK[], int N, int K, int *HOPS)\n{\n  int  J, JJ, JV, N2;\n  REAL V;\n\n  *HOPS = 0;\n  V = HA[K];\n  JV = HJ[K];\n N2 = N/2;\n/*      while 1\n        break */\nx100:\n  if(K>N2)\n    goto x200;\n  (*HOPS)++;\n  J = K+K;\n  if(J<N) {\n    if(HA[J]<HA[J+1])\n      J++;\n  }\n/*      break */\n  if(V>=HA[J])\n    goto x200;\n  HA[K] = HA[J];\n  JJ = HJ[J];\n  HJ[K] = JJ;\n  HK[JJ] = K;\n  K = J;\n  goto x100;\n/*      end while */\nx200:\n  HA[K] = V;\n  HJ[K] = JV;\n  HK[JV] = K;\n}\n\n/* ==================================================================\n   Hup updates heap by moving up tree from node k.\n   ------------------------------------------------------------------\n   01 May 2002: Need Nk for length of Hk.\n   05 May 2002: Change input paramter k to kk to stop k being output.\n   05 May 2002: Current version of Hup.\n   ================================================================== */\nvoid HUP(REAL HA[], int HJ[], int HK[], int K, int *HOPS)\n{\n  int  J, JV, K2;\n  REAL V;\n\n  *HOPS = 0;\n  V = HA[K];\n JV = HJ[K];\n/*      while 1\n        break */\nx100:\n  if(K<2)\n    goto x200;\n  K2 = K/2;\n/*      break */\n  if(V<HA[K2])\n    goto x200;\n  (*HOPS)++;\n  HA[K] = HA[K2];\n  J = HJ[K2];\n  HJ[K] = J;\n  HK[J] = K;\n  K = K2;\n  goto x100;\n/*      end while */\nx200:\n  HA[K] = V;\n  HJ[K] = JV;\n  HK[JV] = K;\n}\n\n/* ==================================================================\n   Hinsert inserts (v,jv) into heap of length N-1\n   to make heap of length N.\n   ------------------------------------------------------------------\n   03 Apr 2002: First version of Hinsert.\n   01 May 2002: Require N to be final length, not old length.\n                Need Nk for length of Hk.\n   07 May 2002: Protect input parameters N, Nk.\n   07 May 2002: Current version of Hinsert.\n   ================================================================== */\nvoid HINSERT(REAL HA[], int HJ[], int HK[], int N,\n             REAL V, int JV, int *HOPS)\n{\n  HA[N] = V;\n  HJ[N] = JV;\n  HK[JV] = N;\n  HUP(HA,HJ,HK,N,HOPS);\n}\n\n/* ==================================================================\n   Hchange changes Ha(k) to v in heap of length N.\n   ------------------------------------------------------------------\n   01 May 2002: Need Nk for length of Hk.\n   07 May 2002: Protect input parameters N, Nk, k.\n   07 May 2002: Current version of Hchange.\n   ================================================================== */\nvoid HCHANGE(REAL HA[], int HJ[], int HK[], int N, int K,\n             REAL V, int JV, int *HOPS)\n{\n  REAL V1;\n\n  V1 = HA[K];\n  HA[K] = V;\n  HJ[K] = JV;\n  HK[JV] = K;\n  if(V1<V)\n    HUP  (HA,HJ,HK,  K,HOPS);\n  else\n    HDOWN(HA,HJ,HK,N,K,HOPS);\n}\n\n/* ==================================================================\n   Hdelete deletes Ha(k) from heap of length N.\n   ------------------------------------------------------------------\n   03 Apr 2002: Current version of Hdelete.\n   01 May 2002: Need Nk for length of Hk.\n   07 May 2002: Protect input parameters N, Nk, k.\n   07 May 2002: Current version of Hdelete.\n   ================================================================== */\nvoid HDELETE(REAL HA[], int HJ[], int HK[], int *N, int K, int *HOPS)\n{\n\n  int  JV, NX;\n  REAL V;\n\n  NX = *N;\n  V = HA[NX];\n  JV = HJ[NX];\n  (*N)--;\n  *HOPS = 0;\n  if(K<NX)\n    HCHANGE(HA,HJ,HK,NX,K,V,JV,HOPS);\n}\n\n/* ==================================================================\n   Hbuild initializes the heap by inserting each element of Ha.\n   Input:  Ha, Hj.\n   Output: Ha, Hj, Hk, hops.\n   ------------------------------------------------------------------\n   01 May 2002: Use k for new length of heap, not k-1 for old length.\n   05 May 2002: Use kk in call to stop loop variable k being altered.\n                (Actually Hinsert no longer alters that parameter.)\n   07 May 2002: ftnchek wants us to protect Nk, Ha(k), Hj(k) too.\n   07 May 2002: Current version of Hbuild.\n   ================================================================== */\nvoid HBUILD(REAL HA[], int HJ[], int HK[], int N, int *HOPS)\n{\n  int  H, JV, K, KK;\n  REAL V;\n\n  *HOPS = 0;\n  for(K = 1; K <= N; K++) {\n    KK = K;\n    V = HA[K];\n    JV = HJ[K];\n    HINSERT(HA,HJ,HK,KK,V,JV,&H);\n    (*HOPS) += H;\n  }\n}\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/bfp/bfp_LUSOL/LUSOL/lusol6a.c",
    "content": "\n/* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n   File  lusol6a\n      lu6sol   lu6L     lu6Lt     lu6U     Lu6Ut   lu6LD   lu6chk\n   ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n   26 Apr 2002: lu6 routines put into a separate file.\n   15 Dec 2002: lu6sol modularized via lu6L, lu6Lt, lu6U, lu6Ut.\n                lu6LD implemented to allow solves with LDL' or L|D|L'.\n   15 Dec 2002: Current version of lusol6a.f.\n   ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */\n\n/* ==================================================================\n   lu6chk  looks at the LU factorization  A = L*U.\n   If mode = 1, lu6chk is being called by lu1fac.\n   (Other modes not yet implemented.)\n   ------------------------------------------------------------------\n   The important input parameters are\n\n                  lprint = luparm(2)\n                  keepLU = luparm(8)\n                  Utol1  = parmlu(4)\n                  Utol2  = parmlu(5)\n\n   and the significant output parameters are\n\n                  inform = luparm(10)\n                  nsing  = luparm(11)\n                  jsing  = luparm(12)\n                  jumin  = luparm(19)\n                  Lmax   = parmlu(11)\n                  Umax   = parmlu(12)\n                  DUmax  = parmlu(13)\n                  DUmin  = parmlu(14)\n                  and      w(*).\n\n   Lmax  and Umax  return the largest elements in L and U.\n   DUmax and DUmin return the largest and smallest diagonals of U\n                   (excluding diagonals that are exactly zero).\n   In general, w(j) is set to the maximum absolute element in\n   the j-th column of U.  However, if the corresponding diagonal\n   of U is small in absolute terms or relative to w(j)\n   (as judged by the parameters Utol1, Utol2 respectively),\n   then w(j) is changed to - w(j).\n   Thus, if w(j) is not positive, the j-th column of A\n   appears to be dependent on the other columns of A.\n   The number of such columns, and the position of the last one,\n   are returned as nsing and jsing.\n   Note that nrank is assumed to be set already, and is not altered.\n   Typically, nsing will satisfy      nrank + nsing = n,  but if\n   Utol1 and Utol2 are rather large,  nsing > n - nrank   may occur.\n   If keepLU = 0,\n   Lmax  and Umax  are already set by lu1fac.\n   The diagonals of U are in the top of A.\n   Only Utol1 is used in the singularity test to set w(*).\n   inform = 0  if  A  appears to have full column rank  (nsing = 0).\n   inform = 1  otherwise  (nsing .gt. 0).\n   ------------------------------------------------------------------\n   00 Jul 1987: Early version.\n   09 May 1988: f77 version.\n   11 Mar 2001: Allow for keepLU = 0.\n   17 Nov 2001: Briefer output for singular factors.\n   05 May 2002: Comma needed in format 1100 (via Kenneth Holmstrom).\n   06 May 2002: With keepLU = 0, diags of U are in natural order.\n                They were not being extracted correctly.\n   23 Apr 2004: TRP can judge singularity better by comparing\n                all diagonals to DUmax.\n   27 Jun 2004: (PEG) Allow write only if nout .gt. 0.\n   ================================================================== */\n#ifdef UseOld_LU6CHK_20040510\nvoid LU6CHK(LUSOLrec *LUSOL, int MODE, int LENA2, int *INFORM)\n{\n  MYBOOL KEEPLU;\n  int    I, J, JUMIN, K, L, L1, L2, LENL, LPRINT, NDEFIC, NRANK;\n  REAL   AIJ, DIAG, DUMAX, DUMIN, LMAX, UMAX, UTOL1, UTOL2;\n\n  LPRINT = LUSOL->luparm[LUSOL_IP_PRINTLEVEL];\n  KEEPLU = (MYBOOL) (LUSOL->luparm[LUSOL_IP_KEEPLU]!=0);\n  NRANK = LUSOL->luparm[LUSOL_IP_RANK_U];\n  LENL  = LUSOL->luparm[LUSOL_IP_NONZEROS_L];\n  UTOL1 = LUSOL->parmlu[LUSOL_RP_SMALLDIAG_U];\n  UTOL2 = LUSOL->parmlu[LUSOL_RP_EPSDIAG_U];\n  *INFORM = LUSOL_INFORM_LUSUCCESS;\n  LMAX  = ZERO;\n  UMAX  = ZERO;\n  LUSOL->luparm[LUSOL_IP_SINGULARITIES]  = 0;\n  LUSOL->luparm[LUSOL_IP_SINGULARINDEX]  = 0;\n  JUMIN = 0;\n  DUMAX = ZERO;\n  DUMIN = LUSOL_BIGNUM;\n\n#ifdef LUSOLFastClear\n  MEMCLEAR(LUSOL->w+1, LUSOL->n);\n#else\n  for(I = 1; I <= LUSOL->n; I++)\n    LUSOL->w[I] = ZERO;\n#endif\n\n  if(KEEPLU) {\n/*     --------------------------------------------------------------\n        Find  Lmax.\n       -------------------------------------------------------------- */\n    for(L = (LENA2+1)-LENL; L <= LENA2; L++) {\n      SETMAX(LMAX,fabs(LUSOL->a[L]));\n    }\n/*     --------------------------------------------------------------\n        Find Umax and set w(j) = maximum element in j-th column of U.\n       -------------------------------------------------------------- */\n    for(K = 1; K <= NRANK; K++) {\n      I = LUSOL->ip[K];\n      L1 = LUSOL->locr[I];\n      L2 = (L1+LUSOL->lenr[I])-1;\n      for(L = L1; L <= L2; L++) {\n        J = LUSOL->indr[L];\n        AIJ = fabs(LUSOL->a[L]);\n        SETMAX(LUSOL->w[J],AIJ);\n        SETMAX(UMAX,AIJ);\n      }\n    }\n/*     --------------------------------------------------------------\n        Negate w(j) if the corresponding diagonal of U is\n        too small in absolute terms or relative to the other elements\n        in the same column of  U.\n        Also find DUmax and DUmin, the extreme diagonals of U.\n       -------------------------------------------------------------- */\n    for(K = 1; K <= LUSOL->n; K++) {\n      J = LUSOL->iq[K];\n      if(K>NRANK)\n        DIAG = ZERO;\n      else {\n        I = LUSOL->ip[K];\n        L1 = LUSOL->locr[I];\n        DIAG = fabs(LUSOL->a[L1]);\n        SETMAX(DUMAX,DIAG);\n        if(DUMIN>DIAG) {\n          DUMIN = DIAG;\n          JUMIN = J;\n        }\n      }\n      if((DIAG<=UTOL1) || (DIAG<=UTOL2*LUSOL->w[J])) {\n        LUSOL_addSingularity(LUSOL, J, INFORM);\n        LUSOL->w[J] = -LUSOL->w[J];\n      }\n    }\n    LUSOL->parmlu[LUSOL_RP_MAXMULT_L] = LMAX;\n    LUSOL->parmlu[LUSOL_RP_MAXELEM_U] = UMAX;\n  }\n   else {\n/*     --------------------------------------------------------------\n        keepLU = 0.\n        Only diag(U) is stored.  Set w(*) accordingly.\n       -------------------------------------------------------------- */\n    for(K = 1; K <= LUSOL->n; K++) {\n      J = LUSOL->iq[K];\n      if(K>NRANK)\n        DIAG = ZERO;\n      else {\n/* !             diag   = abs( diagU(k) ) ! 06 May 2002: Diags are in natural order */\n        DIAG = fabs(LUSOL->diagU[J]);\n        LUSOL->w[J] = DIAG;\n        SETMAX(DUMAX,DIAG);\n        if(DUMIN>DIAG) {\n          DUMIN = DIAG;\n          JUMIN = J;\n        }\n      }\n      if(DIAG<=UTOL1) {\n        LUSOL_addSingularity(LUSOL, J, INFORM);\n        LUSOL->w[J] = -LUSOL->w[J];\n      }\n    }\n  }\n/*     -----------------------------------------------------------------\n        Set output parameters.\n       ----------------------------------------------------------------- */\n  if(JUMIN==0)\n    DUMIN = ZERO;\n  LUSOL->luparm[LUSOL_IP_COLINDEX_DUMIN] = JUMIN;\n  LUSOL->parmlu[LUSOL_RP_MAXELEM_DIAGU]  = DUMAX;\n  LUSOL->parmlu[LUSOL_RP_MINELEM_DIAGU]  = DUMIN;\n/*      The matrix has been judged singular. */\n  if(LUSOL->luparm[LUSOL_IP_SINGULARITIES]>0) {\n    *INFORM = LUSOL_INFORM_LUSINGULAR;\n    NDEFIC = LUSOL->n-NRANK;\n    if(LPRINT>=LUSOL_MSG_SINGULARITY) {\n      LUSOL_report(LUSOL, 0, \"Singular(m%cn)  rank:%9d  n-rank:%8d  nsing:%9d\\n\",\n                             relationChar(LUSOL->m, LUSOL->n),NRANK,NDEFIC,\n                             LUSOL->luparm[LUSOL_IP_SINGULARITIES]);\n    }\n  }\n/*      Exit. */\n  LUSOL->luparm[LUSOL_IP_INFORM] = *INFORM;\n}\n#else\nvoid LU6CHK(LUSOLrec *LUSOL, int MODE, int LENA2, int *INFORM)\n{\n  MYBOOL KEEPLU, TRP;\n  int    I, J, JUMIN, K, L, L1, L2, LENL, LDIAGU, LPRINT, NDEFIC, NRANK;\n  REAL   AIJ, DIAG, DUMAX, DUMIN, LMAX, UMAX, UTOL1, UTOL2;\n\n  LPRINT = LUSOL->luparm[LUSOL_IP_PRINTLEVEL];\n  KEEPLU = (MYBOOL) (LUSOL->luparm[LUSOL_IP_KEEPLU] != 0);\n  TRP    = (MYBOOL) (LUSOL->luparm[LUSOL_IP_PIVOTTYPE] == LUSOL_PIVMOD_TRP);\n  NRANK  = LUSOL->luparm[LUSOL_IP_RANK_U];\n  LENL   = LUSOL->luparm[LUSOL_IP_NONZEROS_L];\n  UTOL1  = LUSOL->parmlu[LUSOL_RP_SMALLDIAG_U];\n  UTOL2  = LUSOL->parmlu[LUSOL_RP_EPSDIAG_U];\n  *INFORM = LUSOL_INFORM_LUSUCCESS;\n  LMAX   = ZERO;\n  UMAX   = ZERO;\n  LUSOL->luparm[LUSOL_IP_SINGULARITIES] = 0;\n  LUSOL->luparm[LUSOL_IP_SINGULARINDEX] = 0;\n  JUMIN  = 0;\n  DUMAX  = ZERO;\n  DUMIN  = LUSOL_BIGNUM;\n\n#ifdef LUSOLFastClear\n  MEMCLEAR(LUSOL->w+1, LUSOL->n);\n#else\n  for(I = 1; I <= LUSOL->n; I++)\n    LUSOL->w[I] = ZERO;\n#endif\n\n  if(KEEPLU) {\n/*     --------------------------------------------------------------\n        Find  Lmax.\n       -------------------------------------------------------------- */\n    for(L = (LENA2+1)-LENL; L <= LENA2; L++) {\n      SETMAX(LMAX,fabs(LUSOL->a[L]));\n     }\n/*     --------------------------------------------------------------\n        Find Umax and set w(j) = maximum element in j-th column of U.\n       -------------------------------------------------------------- */\n    for(K = 1; K <= NRANK; K++) {\n      I = LUSOL->ip[K];\n      L1 = LUSOL->locr[I];\n      L2 = (L1+LUSOL->lenr[I])-1;\n      for(L = L1; L <= L2; L++) {\n        J = LUSOL->indr[L];\n        AIJ = fabs(LUSOL->a[L]);\n        SETMAX(LUSOL->w[J],AIJ);\n        SETMAX(UMAX,AIJ);\n      }\n    }\n    LUSOL->parmlu[LUSOL_RP_MAXMULT_L] = LMAX;\n    LUSOL->parmlu[LUSOL_RP_MAXELEM_U] = UMAX;\n/*     --------------------------------------------------------------\n       Find DUmax and DUmin, the extreme diagonals of U.\n       -------------------------------------------------------------- */\n    for(K = 1; K <= NRANK; K++) {\n      J     = LUSOL->iq[K];\n      I     = LUSOL->ip[K];\n      L1    = LUSOL->locr[I];\n      DIAG  = fabs(LUSOL->a[L1]);\n      SETMAX( DUMAX, DIAG );\n      if(DUMIN > DIAG) {\n        DUMIN  = DIAG;\n        JUMIN  = J;\n      }\n    }\n  }\n  else {\n/*     --------------------------------------------------------------\n       keepLU = 0.\n       Only diag(U) is stored.  Set w(*) accordingly.\n       Find DUmax and DUmin, the extreme diagonals of U.\n       -------------------------------------------------------------- */\n    LDIAGU = LENA2 - LUSOL->n;\n    for(K = 1; K <= NRANK; K++) {\n      J           = LUSOL->iq[K];\n      DIAG        = fabs( LUSOL->a[LDIAGU + J] ); /* are in natural order */\n      LUSOL->w[J] = DIAG;\n      SETMAX( DUMAX, DIAG );\n      if(DUMIN > DIAG) {\n        DUMIN = DIAG;\n        JUMIN = J;\n      }\n    }\n  }\n/*     --------------------------------------------------------------\n       Negate w(j) if the corresponding diagonal of U is\n       too small in absolute terms or relative to the other elements\n       in the same column of  U.\n\n       23 Apr 2004: TRP ensures that diags are NOT small relative to\n                    other elements in their own column.\n                    Much better, we can compare all diags to DUmax.\n      -------------------------------------------------------------- */\n  if((MODE == 1) && TRP) {\n    SETMAX( UTOL1, UTOL2*DUMAX );\n  }\n\n  if(KEEPLU) {\n    for(K = 1; K <= LUSOL->n; K++) {\n      J = LUSOL->iq[K];\n      if(K>NRANK)\n        DIAG = ZERO;\n      else {\n        I = LUSOL->ip[K];\n        L1 = LUSOL->locr[I];\n        DIAG = fabs(LUSOL->a[L1]);\n      }\n      if((DIAG<=UTOL1) || (DIAG<=UTOL2*LUSOL->w[J])) {\n        LUSOL_addSingularity(LUSOL, J, INFORM);\n        LUSOL->w[J] = -LUSOL->w[J];\n      }\n    }\n  }\n  else { /* keepLU = FALSE */\n    for(K = 1; K <= LUSOL->n; K++) {\n      J = LUSOL->iq[K];\n      DIAG = LUSOL->w[J];\n      if(DIAG<=UTOL1) {\n        LUSOL_addSingularity(LUSOL, J, INFORM);\n        LUSOL->w[J] = -LUSOL->w[J];\n      }\n    }\n  }\n/*     -----------------------------------------------------------------\n        Set output parameters.\n       ----------------------------------------------------------------- */\n  if(JUMIN==0)\n    DUMIN = ZERO;\n  LUSOL->luparm[LUSOL_IP_COLINDEX_DUMIN] = JUMIN;\n  LUSOL->parmlu[LUSOL_RP_MAXELEM_DIAGU]  = DUMAX;\n  LUSOL->parmlu[LUSOL_RP_MINELEM_DIAGU]  = DUMIN;\n/*      The matrix has been judged singular. */\n  if(LUSOL->luparm[LUSOL_IP_SINGULARITIES]>0) {\n    *INFORM = LUSOL_INFORM_LUSINGULAR;\n    NDEFIC = LUSOL->n-NRANK;\n    if((LUSOL->outstream!=NULL) && (LPRINT>=LUSOL_MSG_SINGULARITY)) {\n      LUSOL_report(LUSOL, 0, \"Singular(m%cn)  rank:%9d  n-rank:%8d  nsing:%9d\\n\",\n                             relationChar(LUSOL->m, LUSOL->n),NRANK,NDEFIC,\n                             LUSOL->luparm[LUSOL_IP_SINGULARITIES]);\n    }\n  }\n/*      Exit. */\n  LUSOL->luparm[LUSOL_IP_INFORM] = *INFORM;\n}\n#endif\n\n\n/* ------------------------------------------------------------------\n   Include routines for row-based L0.\n   20 Apr 2005 Current version - KE.\n   ------------------------------------------------------------------ */\n#include \"lusol6l0.c\"\n\n\n/* ------------------------------------------------------------------\n   lu6L   solves   L v = v(input).\n   ------------------------------------------------------------------\n   15 Dec 2002: First version derived from lu6sol.\n   15 Dec 2002: Current version.\n   ------------------------------------------------------------------ */\nvoid LU6L(LUSOLrec *LUSOL, int *INFORM, REAL V[], int NZidx[])\n{\n  int  JPIV, K, L, L1, LEN, LENL, LENL0, NUML, NUML0;\n  REAL SMALL;\n  register REAL VPIV;\n#ifdef LUSOLFastSolve\n  REAL *aptr;\n  int  *iptr, *jptr;\n#else\n  int  I, J;\n#endif\n\n  NUML0 = LUSOL->luparm[LUSOL_IP_COLCOUNT_L0];\n  LENL0 = LUSOL->luparm[LUSOL_IP_NONZEROS_L0];\n  LENL  = LUSOL->luparm[LUSOL_IP_NONZEROS_L];\n  SMALL = LUSOL->parmlu[LUSOL_RP_ZEROTOLERANCE];\n  *INFORM = LUSOL_INFORM_LUSUCCESS;\n  L1 = LUSOL->lena+1;\n  for(K = 1; K <= NUML0; K++) {\n    LEN = LUSOL->lenc[K];\n    L = L1;\n    L1 -= LEN;\n    JPIV = LUSOL->indr[L1];\n    VPIV = V[JPIV];\n    if(fabs(VPIV)>SMALL) {\n/*     ***** This loop could be coded specially. */\n#ifdef LUSOLFastSolve\n      L--;\n      for(aptr = LUSOL->a+L, iptr = LUSOL->indc+L;\n          LEN > 0; LEN--, aptr--, iptr--)\n        V[*iptr] += (*aptr) * VPIV;\n#else\n      for(; LEN > 0; LEN--) {\n        L--;\n        I = LUSOL->indc[L];\n        V[I] += LUSOL->a[L]*VPIV;\n      }\n#endif\n    }\n#ifdef SetSmallToZero\n    else\n      V[JPIV] = 0;\n#endif\n  }\n  L = (LUSOL->lena-LENL0)+1;\n  NUML = LENL-LENL0;\n/*     ***** This loop could be coded specially. */\n#ifdef LUSOLFastSolve\n  L--;\n  for(aptr = LUSOL->a+L, jptr = LUSOL->indr+L, iptr = LUSOL->indc+L;\n      NUML > 0; NUML--, aptr--, jptr--, iptr--) {\n    if(fabs(V[*jptr])>SMALL)\n      V[*iptr] += (*aptr) * V[*jptr];\n#ifdef SetSmallToZero\n    else\n      V[*jptr] = 0;\n#endif\n  }\n#else\n  for(; NUML > 0; NUML--) {\n    L--;\n    J = LUSOL->indr[L];\n    if(fabs(V[J])>SMALL) {\n      I = LUSOL->indc[L];\n      V[I] += LUSOL->a[L]*V[J];\n    }\n#ifdef SetSmallToZero\n    else\n      V[J] = 0;\n#endif\n  }\n#endif\n/*      Exit. */\n  LUSOL->luparm[LUSOL_IP_INFORM] = *INFORM;\n}\n\n/* ==================================================================\n   lu6LD  assumes lu1fac has computed factors A = LU of a\n   symmetric definite or quasi-definite matrix A,\n   using Threshold Symmetric Pivoting (TSP),   luparm(6) = 3,\n   or    Threshold Diagonal  Pivoting (TDP),   luparm(6) = 4.\n   It also assumes that no updates have been performed.\n   In such cases,  U = D L', where D = diag(U).\n   lu6LDL returns v as follows:\n\n   mode\n    1    v  solves   L D v = v(input).\n    2    v  solves   L|D|v = v(input).\n   ------------------------------------------------------------------\n   15 Dec 2002: First version of lu6LD.\n   15 Dec 2002: Current version.\n   ================================================================== */\nvoid LU6LD(LUSOLrec *LUSOL, int *INFORM, int MODE, REAL V[], int NZidx[])\n{\n  int  IPIV, K, L, L1, LEN, NUML0;\n  REAL DIAG, SMALL;\n  register REAL VPIV;\n#ifdef LUSOLFastSolve\n  REAL *aptr;\n  int  *jptr;\n#else\n  int  J;\n#endif\n\n/*      Solve L D v(new) = v  or  L|D|v(new) = v, depending on mode.\n        The code for L is the same as in lu6L,\n        but when a nonzero entry of v arises, we divide by\n        the corresponding entry of D or |D|. */\n  NUML0 = LUSOL->luparm[LUSOL_IP_COLCOUNT_L0];\n  SMALL = LUSOL->parmlu[LUSOL_RP_ZEROTOLERANCE];\n  *INFORM = LUSOL_INFORM_LUSUCCESS;\n  L1 = LUSOL->lena+1;\n  for(K = 1; K <= NUML0; K++) {\n    LEN = LUSOL->lenc[K];\n    L = L1;\n    L1 -= LEN;\n    IPIV = LUSOL->indr[L1];\n    VPIV = V[IPIV];\n    if(fabs(VPIV)>SMALL) {\n/*     ***** This loop could be coded specially. */\n#ifdef LUSOLFastSolve\n      L--;\n      for(aptr = LUSOL->a+L, jptr = LUSOL->indc+L;\n          LEN > 0; LEN--, aptr--, jptr--)\n        V[*jptr] += (*aptr)*VPIV;\n#else\n      for(; LEN > 0; LEN--) {\n        L--;\n        J = LUSOL->indc[L];\n        V[J] += LUSOL->a[L]*VPIV;\n      }\n#endif\n/*      Find diag = U(ipiv,ipiv) and divide by diag or |diag|. */\n      L = LUSOL->locr[IPIV];\n      DIAG = LUSOL->a[L];\n      if(MODE==2)\n        DIAG = fabs(DIAG);\n      V[IPIV] = VPIV/DIAG;\n    }\n#ifdef SetSmallToZero\n    else\n      V[IPIV] = 0;\n#endif\n  }\n}\n\n\n/* ==================================================================\n   lu6Lt  solves   L'v = v(input).\n   ------------------------------------------------------------------\n   15 Dec 2002: First version derived from lu6sol.\n   15 Dec 2002: Current version.\n   ================================================================== */\nvoid LU6LT(LUSOLrec *LUSOL, int *INFORM, REAL V[], int NZidx[])\n{\n#ifdef DoTraceL0\n  REAL    TEMP;\n#endif\n  int     K, L, L1, L2, LEN, LENL, LENL0, NUML0;\n  REAL    SMALL;\n  register REALXP SUM;\n  register REAL HOLD;\n#if (defined LUSOLFastSolve) && !(defined DoTraceL0)\n  REAL    *aptr;\n  int     *iptr, *jptr;\n#else\n  int     I, J;\n#endif\n\n  NUML0 = LUSOL->luparm[LUSOL_IP_COLCOUNT_L0];\n  LENL0 = LUSOL->luparm[LUSOL_IP_NONZEROS_L0];\n  LENL  = LUSOL->luparm[LUSOL_IP_NONZEROS_L];\n  SMALL = LUSOL->parmlu[LUSOL_RP_ZEROTOLERANCE];\n  *INFORM = LUSOL_INFORM_LUSUCCESS;\n  L1 = (LUSOL->lena-LENL)+1;\n  L2 = LUSOL->lena-LENL0;\n\n/*     ***** This loop could be coded specially. */\n#if (defined LUSOLFastSolve) && !(defined DoTraceL0)\n  for(L = L1, aptr = LUSOL->a+L1, iptr = LUSOL->indr+L1, jptr = LUSOL->indc+L1;\n      L <= L2; L++, aptr++, iptr++, jptr++) {\n    HOLD = V[*jptr];\n    if(fabs(HOLD)>SMALL)\n      V[*iptr] += (*aptr)*HOLD;\n#ifdef SetSmallToZero\n    else\n      V[*jptr] = 0;\n#endif\n  }\n#else\n  for(L = L1; L <= L2; L++) {\n    J = LUSOL->indc[L];\n    HOLD = V[J];\n    if(fabs(HOLD)>SMALL) {\n      I = LUSOL->indr[L];\n      V[I] += LUSOL->a[L]*HOLD;\n    }\n#ifdef SetSmallToZero\n    else\n      V[J] = 0;\n#endif\n  }\n#endif\n\n  /* Do row-based L0 version, if available */\n  if((LUSOL->L0 != NULL) ||\n     ((LUSOL->luparm[LUSOL_IP_BTRANCOUNT] == 0) && LU1L0(LUSOL, &(LUSOL->L0), INFORM))) {\n    LU6L0T_v(LUSOL, LUSOL->L0, V, NZidx, INFORM);\n  }\n\n  /* Alternatively, do the standard column-based L0 version */\n  else  {\n    /* Perform loop over columns */\n    for(K = NUML0; K >= 1; K--) {\n      SUM = ZERO;\n      LEN = LUSOL->lenc[K];\n      L1 = L2+1;\n      L2 += LEN;\n/*     ***** This loop could be coded specially. */\n#if (defined LUSOLFastSolve) && !(defined DoTraceL0)\n      for(L = L1, aptr = LUSOL->a+L1, jptr = LUSOL->indc+L1;\n          L <= L2; L++, aptr++, jptr++)\n        SUM += (*aptr) * V[*jptr];\n#else\n      for(L = L1; L <= L2; L++) {\n        J = LUSOL->indc[L];\n#ifndef DoTraceL0\n        SUM += LUSOL->a[L]*V[J];\n#else\n        TEMP = V[LUSOL->indr[L1]] + SUM;\n        SUM += LUSOL->a[L]*V[J];\n        printf(\"V[%3d] = V[%3d] + L[%d,%d]*V[%3d]\\n\", LUSOL->indr[L1], LUSOL->indr[L1], J,LUSOL->indr[L1], J);\n        printf(\"%6g = %6g + %6g*%6g\\n\", V[LUSOL->indr[L1]] + SUM, TEMP, LUSOL->a[L], V[J]);\n#endif\n      }\n#endif\n      V[LUSOL->indr[L1]] += (REAL) SUM;\n    }\n  }\n\n/*      Exit. */\n  LUSOL->luparm[LUSOL_IP_INFORM] = *INFORM;\n}\n\nvoid print_L0(LUSOLrec *LUSOL)\n{\n  int  I, J, K, L, L1, L2, LEN, LENL0, NUML0;\n  REAL *denseL0 = (REAL*) calloc(LUSOL->m+1, (LUSOL->n+1)*sizeof(*denseL0));\n\n  NUML0 = LUSOL->luparm[LUSOL_IP_COLCOUNT_L0];\n  LENL0 = LUSOL->luparm[LUSOL_IP_NONZEROS_L0];\n\n  L2 = LUSOL->lena-LENL0;\n  for(K = NUML0; K >= 1; K--) {\n    LEN = LUSOL->lenc[K];\n    L1 = L2+1;\n    L2 += LEN;\n    for(L = L1; L <= L2; L++) {\n      I = LUSOL->indc[L];\n      I = LUSOL->ipinv[I]; /* Undo row mapping */\n      J = LUSOL->indr[L];\n      denseL0[(LUSOL->n+1)*(J-1) + I] = LUSOL->a[L];\n    }\n  }\n\n  for(I = 1; I <= LUSOL->n; I++) {\n    for(J = 1; J <= LUSOL->m; J++)\n      fprintf(stdout, \"%10g\", denseL0[(LUSOL->n+1)*(J-1) + I]);\n    fprintf(stdout, \"\\n\");\n  }\n  LUSOL_FREE(denseL0);\n}\n\n\n/* ------------------------------------------------------------------\n   Include routines for column-based U.\n   5 Feb 2006 Current version - KE.\n   ------------------------------------------------------------------ */\n#include \"lusol6u.c\"\n\n\n/* ==================================================================\n   lu6U   solves   U w = v.          v  is not altered.\n   ------------------------------------------------------------------\n   15 Dec 2002: First version derived from lu6sol.\n   15 Dec 2002: Current version.\n   ================================================================== */\nvoid LU6U(LUSOLrec *LUSOL, int *INFORM, REAL V[], REAL W[], int NZidx[])\n{\n  /* Do column-based U version, if available */\n  if((LUSOL->U != NULL) ||\n     ((LUSOL->luparm[LUSOL_IP_FTRANCOUNT] == 0) && LU1U0(LUSOL, &(LUSOL->U), INFORM))) {\n    LU6U0_v(LUSOL, LUSOL->U, V, W, NZidx, INFORM);\n  }\n  /* Alternatively, do the standard column-based L0 version */\n  else {\n    int  I, J, K, KLAST, L, L1, L2, L3, NRANK, NRANK1;\n    REAL SMALL;\n    register REALXP T;\n#ifdef LUSOLFastSolve\n    REAL *aptr;\n    int  *jptr;\n#endif\n    NRANK = LUSOL->luparm[LUSOL_IP_RANK_U];\n    SMALL = LUSOL->parmlu[LUSOL_RP_ZEROTOLERANCE];\n    *INFORM = LUSOL_INFORM_LUSUCCESS;\n    NRANK1 = NRANK+1;\n/*      Find the first nonzero in v(1:nrank), counting backwards. */\n    for(KLAST = NRANK; KLAST >= 1; KLAST--) {\n      I = LUSOL->ip[KLAST];\n      if(fabs(V[I])>SMALL)\n        break;\n    }\n    L = LUSOL->n;\n#ifdef LUSOLFastSolve\n    for(K = KLAST+1, jptr = LUSOL->iq+K; K <= L; K++, jptr++)\n      W[*jptr] = ZERO;\n#else\n    for(K = KLAST+1; K <= L; K++) {\n      J = LUSOL->iq[K];\n      W[J] = ZERO;\n    }\n#endif\n/*      Do the back-substitution, using rows 1:klast of U. */\n    for(K = KLAST; K >= 1; K--) {\n      I = LUSOL->ip[K];\n      T = V[I];\n      L1 = LUSOL->locr[I];\n      L2 = L1+1;\n      L3 = (L1+LUSOL->lenr[I])-1;\n/*     ***** This loop could be coded specially. */\n#ifdef LUSOLFastSolve\n      for(L = L2, aptr = LUSOL->a+L2, jptr = LUSOL->indr+L2;\n          L <= L3; L++, aptr++, jptr++)\n        T -= (*aptr) * W[*jptr];\n#else\n      for(L = L2; L <= L3; L++) {\n        J = LUSOL->indr[L];\n        T -= LUSOL->a[L]*W[J];\n      }\n#endif\n      J = LUSOL->iq[K];\n      if(fabs((REAL) T)<=SMALL)\n        T = ZERO;\n      else\n        T /= LUSOL->a[L1];\n      W[J] = (REAL) T;\n    }\n/*      Compute residual for overdetermined systems. */\n    T = ZERO;\n    for(K = NRANK1; K <= LUSOL->m; K++) {\n      I = LUSOL->ip[K];\n      T += fabs(V[I]);\n    }\n/*      Exit. */\n    if(T>ZERO)\n      *INFORM = LUSOL_INFORM_LUSINGULAR;\n    LUSOL->luparm[LUSOL_IP_INFORM]     = *INFORM;\n    LUSOL->parmlu[LUSOL_RP_RESIDUAL_U] = (REAL) T;\n  }\n}\n\n/* ==================================================================\n   lu6Ut  solves   U'v = w.          w  is destroyed.\n   ------------------------------------------------------------------\n   15 Dec 2002: First version derived from lu6sol.\n   15 Dec 2002: Current version.\n   ================================================================== */\nvoid LU6UT(LUSOLrec *LUSOL, int *INFORM, REAL V[], REAL W[], int NZidx[])\n{\n  int  I, J, K, L, L1, L2, NRANK, NRANK1,\n       *ip = LUSOL->ip + 1, *iq = LUSOL->iq + 1;\n  REAL SMALL;\n  register REAL T;\n#ifdef LUSOLFastSolve\n  REAL *aptr;\n  int  *jptr;\n#endif\n\n  NRANK = LUSOL->luparm[LUSOL_IP_RANK_U];\n  SMALL = LUSOL->parmlu[LUSOL_RP_ZEROTOLERANCE];\n  *INFORM = LUSOL_INFORM_LUSUCCESS;\n  NRANK1 = NRANK+1;\n  L = LUSOL->m;\n#ifdef LUSOLFastSolve\n  for(K = NRANK1, jptr = LUSOL->ip+K; K <= L; K++, jptr++)\n    V[*jptr] = ZERO;\n#else\n  for(K = NRANK1; K <= L; K++) {\n    I = LUSOL->ip[K];\n    V[I] = ZERO;\n  }\n#endif\n/*      Do the forward-substitution, skipping columns of U(transpose)\n        when the associated element of w(*) is negligible. */\n#if 0\n  for(K = 1; K <= NRANK; K++) {\n    I = LUSOL->ip[K];\n    J = LUSOL->iq[K];\n#else\n  for(K = 1; K <= NRANK; K++, ip++, iq++) {\n    I = *ip;\n    J = *iq;\n#endif\n    T = W[J];\n    if(fabs(T)<=SMALL) {\n      V[I] = ZERO;\n      continue;\n    }\n    L1 = LUSOL->locr[I];\n    T /= LUSOL->a[L1];\n    V[I] = T;\n    L2 = (L1+LUSOL->lenr[I])-1;\n    L1++;\n/*     ***** This loop could be coded specially. */\n#ifdef LUSOLFastSolve\n    for(L = L1, aptr = LUSOL->a+L1, jptr = LUSOL->indr+L1;\n        L <= L2; L++, aptr++, jptr++)\n      W[*jptr] -= T * (*aptr);\n#else\n    for(L = L1; L <= L2; L++) {\n      J = LUSOL->indr[L];\n      W[J] -= T*LUSOL->a[L];\n    }\n#endif\n  }\n/*      Compute residual for overdetermined systems. */\n  T = ZERO;\n  for(K = NRANK1; K <= LUSOL->n; K++) {\n    J = LUSOL->iq[K];\n    T += fabs(W[J]);\n  }\n/*      Exit. */\n  if(T>ZERO)\n    *INFORM = LUSOL_INFORM_LUSINGULAR;\n  LUSOL->luparm[LUSOL_IP_INFORM]     = *INFORM;\n  LUSOL->parmlu[LUSOL_RP_RESIDUAL_U] = T;\n}\n\n/* ==================================================================\n   lu6sol  uses the factorization  A = L U  as follows:\n   ------------------------------------------------------------------\n   mode\n    1    v  solves   L v = v(input).   w  is not touched.\n    2    v  solves   L'v = v(input).   w  is not touched.\n    3    w  solves   U w = v.          v  is not altered.\n    4    v  solves   U'v = w.          w  is destroyed.\n    5    w  solves   A w = v.          v  is altered as in 1.\n    6    v  solves   A'v = w.          w  is destroyed.\n\n   If mode = 3,4,5,6, v and w must not be the same arrays.\n   If lu1fac has just been used to factorize a symmetric matrix A\n   (which must be definite or quasi-definite), the factors A = L U\n   may be regarded as A = LDL', where D = diag(U).  In such cases,\n\n   mode\n    7    v  solves   A v = L D L'v = v(input).   w  is not touched.\n    8    v  solves       L |D| L'v = v(input).   w  is not touched.\n\n   ip(*), iq(*)      hold row and column numbers in pivotal order.\n   lenc(k)           is the length of the k-th column of initial L.\n   lenr(i)           is the length of the i-th row of U.\n   locc(*)           is not used.\n   locr(i)           is the start  of the i-th row of U.\n\n   U is assumed to be in upper-trapezoidal form (nrank by n).\n   The first entry for each row is the diagonal element\n   (according to the permutations  ip, iq).  It is stored at\n   location locr(i) in a(*), indr(*).\n\n   On exit, inform = 0 except as follows.\n     if(mode = 3,4,5,6 and if U (and hence A) is singular,)\n     inform = 1 if there is a nonzero residual in solving the system\n     involving U.  parmlu(20) returns the norm of the residual.\n   ------------------------------------------------------------------\n     July 1987: Early version.\n   09 May 1988: f77 version.\n   27 Apr 2000: Abolished the dreaded \"computed go to\".\n                But hard to change other \"go to\"s to \"if then else\".\n   15 Dec 2002: lu6L, lu6Lt, lu6U, lu6Ut added to modularize lu6sol.\n   ================================================================== */\nvoid LU6SOL(LUSOLrec *LUSOL, int MODE, REAL V[], REAL W[], int NZidx[], int *INFORM)\n{\n  if(MODE==LUSOL_SOLVE_Lv_v) {          /* Solve  L v(new) = v. */\n    LU6L(LUSOL, INFORM,V, NZidx);\n  }\n  else if(MODE==LUSOL_SOLVE_Ltv_v) {    /* Solve  L'v(new) = v. */\n    LU6LT(LUSOL, INFORM,V, NZidx);\n  }\n  else if(MODE==LUSOL_SOLVE_Uw_v) {     /* Solve  U w = v. */\n    LU6U(LUSOL, INFORM,V,W, NZidx);\n  }\n  else if(MODE==LUSOL_SOLVE_Utv_w) {    /* Solve  U'v = w. */\n    LU6UT(LUSOL, INFORM,V,W, NZidx);\n  }\n  else if(MODE==LUSOL_SOLVE_Aw_v) {     /* Solve  A w      = v (i.e. FTRAN) */\n    LU6L(LUSOL, INFORM,V, NZidx);        /* via     L v(new) = v */\n    LU6U(LUSOL, INFORM,V,W, NULL);       /* ... and U w = v(new). */\n  }\n  else if(MODE==LUSOL_SOLVE_Atv_w) {    /* Solve  A'v = w (i.e. BTRAN) */\n    LU6UT(LUSOL, INFORM,V,W, NZidx);     /* via      U'v = w */\n    LU6LT(LUSOL, INFORM,V, NULL);        /* ... and  L'v(new) = v. */\n  }\n  else if(MODE==LUSOL_SOLVE_Av_v) {     /* Solve  LDv(bar) = v */\n    LU6LD(LUSOL, INFORM,1,V, NZidx);     /* and    L'v(new) = v(bar). */\n    LU6LT(LUSOL, INFORM,V, NULL);\n  }\n  else if(MODE==LUSOL_SOLVE_LDLtv_v) {  /* Solve  L|D|v(bar) = v */\n    LU6LD(LUSOL, INFORM,2,V, NZidx);     /* and    L'v(new) = v(bar). */\n    LU6LT(LUSOL, INFORM,V, NULL);\n  }\n}\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/bfp/bfp_LUSOL/LUSOL/lusol6l0.c",
    "content": "\n/* Create a row-based version of L0.\n   This makes it possible to solve L0'x=h (btran) faster for sparse h,\n   since we only run down the columns of L0' (rows of LO) for which\n   the corresponding entry in h is non-zero. */\nMYBOOL LU1L0(LUSOLrec *LUSOL, LUSOLmat **mat, int *inform)\n{\n  MYBOOL status = FALSE;\n  int    K, L, LL, L1, L2, LENL0, NUML0, I;\n  int    *lsumr;\n\n  /* Assume success */\n  *inform = LUSOL_INFORM_LUSUCCESS;\n\n  /* Check if there is anything worth doing */\n  if(mat == NULL)\n    return( status );\n  if(*mat != NULL)\n    LUSOL_matfree(mat);\n  NUML0 = LUSOL->luparm[LUSOL_IP_COLCOUNT_L0];\n  LENL0 = LUSOL->luparm[LUSOL_IP_NONZEROS_L0];\n  if((NUML0 == 0) || (LENL0 == 0) ||\n     (LUSOL->luparm[LUSOL_IP_ACCELERATION] == LUSOL_BASEORDER) ||\n     ((LUSOL->luparm[LUSOL_IP_ACCELERATION] & LUSOL_ACCELERATE_L0) == 0))\n    return( status );\n\n  /* Allocate temporary array */\n  lsumr = (int *) LUSOL_CALLOC((LUSOL->m+1), sizeof(*lsumr));\n  if(lsumr == NULL) {\n    *inform = LUSOL_INFORM_NOMEMLEFT;\n    return( status );\n  }\n\n  /* Compute non-zero counts by permuted row index (order is unimportant) */\n  K = 0;\n  L2 = LUSOL->lena;\n  L1 = L2-LENL0+1;\n  for(L = L1; L <= L2; L++) {\n    I = LUSOL->indc[L];\n    lsumr[I]++;\n    if(lsumr[I] == 1)\n      K++;\n  }\n  LUSOL->luparm[LUSOL_IP_ROWCOUNT_L0] = K;\n\n  /* Check if we should apply \"smarts\" before proceeding to the row matrix creation */\n  if((LUSOL->luparm[LUSOL_IP_ACCELERATION] & LUSOL_AUTOORDER) &&\n     ((REAL) LUSOL->luparm[LUSOL_IP_ROWCOUNT_L0] /\n#if 0\n             LUSOL->luparm[LUSOL_IP_COLCOUNT_L0]\n#else\n             LUSOL->m\n#endif\n      > LUSOL->parmlu[LUSOL_RP_SMARTRATIO]))\n    goto Finish;\n\n  /* We are Ok to create the new matrix object */\n  *mat = LUSOL_matcreate(LUSOL->m, LENL0);\n  if(*mat == NULL) {\n    *inform = LUSOL_INFORM_NOMEMLEFT;\n    goto Finish;\n  }\n\n  /* Cumulate row counts to get vector offsets; first row is leftmost\n     (stick with Fortran array offset for consistency) */\n  (*mat)->lenx[0] = 1;\n  for(K = 1; K <= LUSOL->m; K++) {\n    (*mat)->lenx[K] = (*mat)->lenx[K-1] + lsumr[K];\n    lsumr[K] = (*mat)->lenx[K-1];\n  }\n\n  /* Map the matrix into row order by permuted index;\n     Note: The first permuted row is located leftmost in the array.\n           The column order is irrelevant, since the indeces will\n           refer to constant / resolved values of V[] during solve. */\n  L2 = LUSOL->lena;\n  L1 = L2-LENL0+1;\n  for(L = L1; L <= L2; L++) {\n    I = LUSOL->indc[L];\n    LL = lsumr[I]++;\n    (*mat)->a[LL] = LUSOL->a[L];\n    (*mat)->indr[LL] = LUSOL->indr[L];\n    (*mat)->indc[LL] = I;\n  }\n\n  /* Pack row starting positions, and set mapper from original index to packed */\n  I = 0;\n  for(L = 1; L <= LUSOL->m; L++) {\n    K = LUSOL->ip[L];\n    if((*mat)->lenx[K] > (*mat)->lenx[K-1]) {\n      I++;\n      (*mat)->indx[I] = K;\n    }\n  }\n\n  /* Confirm that everything went well */\n  status = TRUE;\n\n  /* Clean up */\nFinish:\n  FREE(lsumr);\n  return( status );\n}\n\n/* Solve L0' v = v based on row-based version of L0, constructed by LU1L0 */\nvoid LU6L0T_v(LUSOLrec *LUSOL, LUSOLmat *mat, REAL V[], int NZidx[], int *INFORM)\n{\n#ifdef DoTraceL0\n  REAL TEMP;\n#endif\n  int  LEN, K, KK, L, L1, NUML0;\n  REAL SMALL;\n  register REAL VPIV;\n#if (defined LUSOLFastSolve) && !(defined DoTraceL0)\n  REAL *aptr;\n  int  *jptr;\n#else\n  int  J;\n#endif\n\n  NUML0 = LUSOL->luparm[LUSOL_IP_ROWCOUNT_L0];\n  SMALL = LUSOL->parmlu[LUSOL_RP_ZEROTOLERANCE];\n\n  /* Loop over the nz columns of L0' - from the end, going forward. */\n  for(K = NUML0; K > 0; K--) {\n    KK = mat->indx[K];\n    L  = mat->lenx[KK];\n    L1 = mat->lenx[KK-1];\n    LEN = L - L1;\n    if(LEN == 0)\n      continue;\n    /* Get value of the corresponding active entry of V[] */\n    VPIV = V[KK];\n    /* Only process the column of L0' if the value of V[] is non-zero */\n    if(fabs(VPIV)>SMALL) {\n/*     ***** This loop could be coded specially. */\n#if (defined LUSOLFastSolve) && !(defined DoTraceL0)\n      L--;\n      for(aptr = mat->a+L, jptr = mat->indr+L;\n          LEN > 0; LEN--, aptr--, jptr--)\n        V[*jptr] += VPIV * (*aptr);\n#else\n      for(; LEN > 0; LEN--) {\n        L--;\n        J = mat->indr[L];\n#ifndef DoTraceL0\n        V[J] += VPIV * mat->a[L];\n#else\n        TEMP = V[J];\n        V[J] += VPIV * mat->a[L];\n        printf(\"V[%3d] = V[%3d] + L[%d,%d]*V[%3d]\\n\", J, J, KK,J, KK);\n        printf(\"%6g = %6g + %6g*%6g\\n\", V[J], TEMP, mat->a[L], VPIV);\n#endif\n      }\n#endif\n    }\n#ifdef SetSmallToZero\n    else\n      V[KK] = 0;\n#endif\n  }\n\n}\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/bfp/bfp_LUSOL/LUSOL/lusol6u.c",
    "content": "\n/* Create a column-based version of U.\n   This makes it possible to solve Ux=h (ftran) faster for sparse h,\n   since we only run down the rows of U (columns of U') for which\n   the corresponding entry in h is non-zero. */\nMYBOOL LU1U0(LUSOLrec *LUSOL, LUSOLmat **mat, int *inform)\n{\n  MYBOOL status = FALSE;\n  int    K, L, LL, LENU, NUMU, J;\n  int    *lsumc;\n\n  /* Assume success */\n  *inform = LUSOL_INFORM_LUSUCCESS;\n\n  /* Check if there is anything worth doing */\n  if(mat == NULL)\n    return( status );\n  if(*mat != NULL)\n    LUSOL_matfree(mat);\n  NUMU = LUSOL->luparm[LUSOL_IP_RANK_U];\n  LENU = LUSOL->luparm[LUSOL_IP_NONZEROS_U];\n  if((NUMU == 0) || (LENU == 0) ||\n     (LUSOL->luparm[LUSOL_IP_ACCELERATION] == LUSOL_BASEORDER) ||\n     ((LUSOL->luparm[LUSOL_IP_ACCELERATION] & LUSOL_ACCELERATE_U) == 0))\n    return( status );\n\n  /* Allocate temporary array */\n  lsumc = (int *) LUSOL_CALLOC((LUSOL->n+1), sizeof(*lsumc));\n  if(lsumc == NULL) {\n    *inform = LUSOL_INFORM_NOMEMLEFT;\n    return( status );\n  }\n\n  /* Compute non-zero counts by permuted column index (order is unimportant) */\n  for(L = 1; L <= LENU; L++) {\n    J = LUSOL->indr[L];\n    lsumc[J]++;\n  }\n\n  /* Check if we should apply \"smarts\" before proceeding to the column matrix creation */\n  if((LUSOL->luparm[LUSOL_IP_ACCELERATION] & LUSOL_AUTOORDER) &&\n     ((REAL) sqrt((REAL) NUMU/LENU) > LUSOL->parmlu[LUSOL_RP_SMARTRATIO]))\n    goto Finish;\n\n  /* We are Ok to create the new matrix object */\n  *mat = LUSOL_matcreate(LUSOL->n, LENU);\n  if(*mat == NULL) {\n    *inform = LUSOL_INFORM_NOMEMLEFT;\n    goto Finish;\n  }\n\n  /* Cumulate row counts to get vector offsets; first column is leftmost\n     (stick with Fortran array offset for consistency) */\n  (*mat)->lenx[0] = 1;\n  for(K = 1; K <= LUSOL->n; K++) {\n    (*mat)->lenx[K] = (*mat)->lenx[K-1] + lsumc[K];\n    lsumc[K] = (*mat)->lenx[K-1];\n  }\n\n  /* Map the matrix into column order by permuted index;\n     Note: The first permuted column is located leftmost in the array.\n           The row order is irrelevant, since the indeces will\n           refer to constant / resolved values of V[] during solve. */\n  for(L = 1; L <= LENU; L++) {\n    J = LUSOL->indr[L];\n    LL = lsumc[J]++;\n    (*mat)->a[LL] = LUSOL->a[L];\n    (*mat)->indr[LL] = J;\n    (*mat)->indc[LL] = LUSOL->indc[L];\n  }\n\n  /* Pack column starting positions, and set mapper from original index to packed */\n  J = 0;\n  for(L = 1; L <= LUSOL->n; L++) {\n    K = LUSOL->iq[L];\n#if 1  /* Deactivate to produce a full-rank version (implicit unit diagonals) */\n    if((*mat)->lenx[K] > (*mat)->lenx[K-1])\n#endif\n    {\n      J++;\n     (*mat)->indx[J] = K;\n    }\n  }\n\n  /* Confirm that everything went well */\n  status = TRUE;\n\n  /* Clean up */\nFinish:\n  FREE(lsumc);\n  return( status );\n}\n\n/* Solve U w = v based on column-based version of U, constructed by LU1U0 */\nvoid LU6U0_v(LUSOLrec *LUSOL, LUSOLmat *mat, REAL V[], REAL W[], int NZidx[], int *INFORM)\n{\n#ifdef DoTraceU0\n  REAL TEMP;\n#endif\n  int  LEN, I, K, L, L1, NRANK, NRANK1, KLAST;\n  REAL SMALL;\n  register REAL T;\n#if (defined xxLUSOLFastSolve) && !(defined DoTraceU0)\n  REAL *aptr;\n  int  *jptr;\n#else\n  int  J;\n#endif\n\n  NRANK = LUSOL->luparm[LUSOL_IP_RANK_U];\n  SMALL = LUSOL->parmlu[LUSOL_RP_ZEROTOLERANCE];\n  *INFORM = LUSOL_INFORM_LUSUCCESS;\n  NRANK1 = NRANK+1;\n/*      Find the first nonzero in v(1:nrank), counting backwards. */\n  for(KLAST = NRANK; KLAST >= 1; KLAST--) {\n    I = LUSOL->ip[KLAST];\n    if(fabs(V[I])>SMALL)\n      break;\n  }\n  L = LUSOL->n;\n#ifdef xxLUSOLFastSolve\n  for(K = KLAST+1, jptr = LUSOL->iq+K; K <= L; K++, jptr++)\n    W[*jptr] = ZERO;\n#else\n  for(K = KLAST+1; K <= L; K++) {\n    J = LUSOL->iq[K];\n    W[J] = ZERO;\n  }\n#endif\n  /* Loop over the nz columns of U - from the right, going left. */\n  for(K = NRANK; K > 0; K--) {\n    I = mat->indx[K];\n    L = mat->lenx[I];\n    L1 = mat->lenx[I-1];\n    LEN = L - L1;\n    T = V[I];\n    if(fabs(T)<=SMALL) {\n      W[K] = ZERO;\n      continue;\n    }\n    T /= mat->a[L1];  /* Should it be L or L1 ? */\n    W[K] = T;\n    LEN--;\n/*     ***** This loop could be coded specially. */\n#ifdef xxLUSOLFastSolve\n    L--;\n    for(aptr = mat->a+L, jptr = mat->indc+L;\n        LEN > 0; LEN--, aptr--, jptr--)\n      V[*jptr] -= T * (*aptr);\n#else\n    for(; LEN > 0; LEN--) {\n      L--;\n      J = mat->indc[L];\n#ifndef DoTraceL0\n      V[J] -= T * mat->a[L];\n#else\n      TEMP = V[J];\n      V[J] += T * mat->a[L];\n      printf(\"V[%3d] = V[%3d] + L[%d,%d]*V[%3d]\\n\", J, J, I,J, I);\n      printf(\"%6g = %6g + %6g*%6g\\n\", V[J], TEMP, mat->a[L], T);\n#endif\n    }\n#endif\n  }\n/*      Compute residual for overdetermined systems. */\n  T = ZERO;\n  for(K = NRANK1; K <= LUSOL->m; K++) {\n    I = LUSOL->ip[K];\n    T += fabs(V[I]);\n  }\n/*      Exit. */\n  if(T>ZERO)\n    *INFORM = LUSOL_INFORM_LUSINGULAR;\n  LUSOL->luparm[LUSOL_IP_INFORM]     = *INFORM;\n  LUSOL->parmlu[LUSOL_RP_RESIDUAL_U] = (REAL) T;\n}\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/bfp/bfp_LUSOL/LUSOL/lusol7a.c",
    "content": "\n/* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n   File  lusol7a\n      lu7add   lu7cyc   lu7elm   lu7for   lu7rnk   lu7zap\n      Utilities for LUSOL's update routines.\n      lu7for is the most important -- the forward sweep.\n  01 May 2002: Derived from LUSOL's original lu7a.f file.\n  01 May 2002: Current version of lusol7a.f.\n   ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */\n\n/* ==================================================================\n   lu7add  inserts the first nrank elements of the vector v(*)\n   as column  jadd  of  U.  We assume that  U  does not yet have any\n   entries in this column.\n   Elements no larger than  parmlu(3)  are treated as zero.\n   klast  will be set so that the last row to be affected\n   (in pivotal order) is row  ip(klast).\n   ------------------------------------------------------------------\n   09 May 1988: First f77 version.\n   ================================================================== */\nvoid LU7ADD(LUSOLrec *LUSOL, int JADD, REAL V[], int LENL, int *LENU,\n  int *LROW, int NRANK, int *INFORM, int *KLAST, REAL *VNORM)\n{\n  REAL SMALL;\n  int  K, I, LENI, MINFRE, NFREE, LR1, LR2, L;\n#ifndef LUSOLFastMove\n  int J;\n#endif\n\n  SMALL = LUSOL->parmlu[LUSOL_RP_ZEROTOLERANCE];\n  *VNORM = ZERO;\n  *KLAST = 0;\n  for(K = 1; K <= NRANK; K++) {\n    I = LUSOL->ip[K];\n    if(fabs(V[I])<=SMALL)\n      continue;\n    *KLAST = K;\n    (*VNORM) += fabs(V[I]);\n    LENI = LUSOL->lenr[I];\n/*         Compress row file if necessary. */\n    MINFRE = LENI+1;\n    NFREE = LUSOL->lena - LENL - *LROW;\n    if(NFREE<MINFRE) {\n      LU1REC(LUSOL, LUSOL->m, TRUE,LROW,LUSOL->indr,LUSOL->lenr,LUSOL->locr);\n      NFREE = LUSOL->lena - LENL - *LROW;\n      if(NFREE<MINFRE)\n        goto x970;\n    }\n/*         Move row  i  to the end of the row file,\n           unless it is already there.\n           No need to move if there is a gap already. */\n    if(LENI==0)\n      LUSOL->locr[I] = (*LROW) + 1;\n    LR1 = LUSOL->locr[I];\n    LR2 = (LR1+LENI)-1;\n    if(LR2==*LROW)\n      goto x150;\n    if(LUSOL->indr[LR2+1]==0)\n      goto x180;\n    LUSOL->locr[I] = (*LROW) + 1;\n#ifdef LUSOLFastMove\n    L = LR2-LR1+1;\n    if(L > 0) {\n      LR2 = (*LROW)+1;\n      MEMMOVE(LUSOL->a+LR2,    LUSOL->a+LR1, L);\n      MEMMOVE(LUSOL->indr+LR2, LUSOL->indr+LR1, L);\n      MEMCLEAR(LUSOL->indr+LR1, L);\n      *LROW += L;\n    }\n#else\n    for(L = LR1; L <= LR2; L++) {\n      (*LROW)++;\n      LUSOL->a[*LROW] = LUSOL->a[L];\n      J = LUSOL->indr[L];\n      LUSOL->indr[L] = 0;\n      LUSOL->indr[*LROW] = J;\n    }\n#endif\nx150:\n    LR2 = *LROW;\n    (*LROW)++;\n/*         Add the element of  v. */\nx180:\n    LR2++;\n    LUSOL->a[LR2] = V[I];\n    LUSOL->indr[LR2] = JADD;\n    LUSOL->lenr[I] = LENI+1;\n    (*LENU)++;\n  }\n/*      Normal exit. */\n  *INFORM = LUSOL_INFORM_LUSUCCESS;\n  goto x990;\n/*      Not enough storage. */\nx970:\n  *INFORM = LUSOL_INFORM_ANEEDMEM;\nx990:\n;\n}\n\n/* ==================================================================\n   lu7cyc performs a cyclic permutation on the row or column ordering\n   stored in ip, moving entry kfirst down to klast.\n   If kfirst .ge. klast, lu7cyc should not be called.\n   Sometimes klast = 0 and nothing should happen.\n   ------------------------------------------------------------------\n   09 May 1988: First f77 version.\n   ================================================================== */\nvoid LU7CYC(LUSOLrec *LUSOL, int KFIRST, int KLAST, int IX[])\n{\n  if(KFIRST<KLAST) {\n    int IFIRST, K;\n#ifdef LUSOLFastMove\n#if 1\n    IFIRST = IX[KFIRST];\n    K = KLAST-KFIRST;\n    MEMMOVE(IX+KFIRST, IX+KFIRST+1, K);\n    IX[KLAST] = IFIRST;\n#else\n    int *IXK, *IXK1;\n    IXK = IX+KFIRST;\n    IFIRST = *IXK;\n    for(K = KFIRST, IXK1 = IXK+1; K <= KLAST-1; K++, IXK++, IXK1++) {\n      *IXK = *IXK1;\n    }\n    *IXK = IFIRST;\n#endif\n#else\n    IFIRST = IX[KFIRST];\n    for(K = KFIRST; K <= KLAST-1; K++) {\n      IX[K] = IX[K+1];\n    }\n    IX[KLAST] = IFIRST;\n#endif\n  }\n}\n\n/* ==================================================================\n   lu7elm  eliminates the subdiagonal elements of a vector  v(*),\n   where  L*v = y  for some vector y.\n   If  jelm > 0,  y  has just become column  jelm  of the matrix  A.\n   lu7elm  should not be called unless  m  is greater than  nrank.\n   inform = 0 if y contained no subdiagonal nonzeros to eliminate.\n   inform = 1 if y contained at least one nontrivial subdiagonal.\n   inform = 7 if there is insufficient storage.\n   ------------------------------------------------------------------\n   09 May 1988: First f77 version.\n                No longer calls lu7for at end.  lu8rpc, lu8mod do so.\n   ================================================================== */\nvoid LU7ELM(LUSOLrec *LUSOL, int JELM, REAL V[], int *LENL,\n            int *LROW, int NRANK, int *INFORM, REAL *DIAG)\n{\n  REAL VI, VMAX, SMALL;\n  int  NRANK1, MINFRE, NFREE, KMAX, L, K, I, LMAX, IMAX, L1, L2;\n\n#ifdef ForceInitialization\n  LMAX = 0;\n#endif\n\n  SMALL = LUSOL->parmlu[LUSOL_RP_ZEROTOLERANCE];\n  NRANK1 = NRANK+1;\n  *DIAG = ZERO;\n/*      Compress row file if necessary. */\n  MINFRE = LUSOL->m-NRANK;\n  NFREE = LUSOL->lena-(*LENL)-(*LROW);\n  if(NFREE>=MINFRE)\n    goto x100;\n  LU1REC(LUSOL, LUSOL->m,TRUE,LROW,LUSOL->indr,LUSOL->lenr,LUSOL->locr);\n  NFREE = LUSOL->lena-(*LENL)-(*LROW);\n  if(NFREE<MINFRE)\n    goto x970;\n    \n/*      Pack the subdiagonals of  v  into  L,  and find the largest. */\nx100:\n  VMAX = ZERO;\n  KMAX = 0;\n  L = (LUSOL->lena-(*LENL))+1;\n  for(K = NRANK1; K <= LUSOL->m; K++) {\n    I = LUSOL->ip[K];\n    VI = fabs(V[I]);\n    if(VI<=SMALL)\n      continue;\n    L--;\n    LUSOL->a[L] = V[I];\n    LUSOL->indc[L] = I;\n    if(VMAX>=VI)\n      continue;\n    VMAX = VI;\n    KMAX = K;\n    LMAX = L;\n  }\n  if(KMAX==0)\n    goto x900;\n/*      ------------------------------------------------------------------\n        Remove  vmax  by overwriting it with the last packed  v(i).\n        Then set the multipliers in  L  for the other elements.\n        ------------------------------------------------------------------ */\n  IMAX = LUSOL->ip[KMAX];\n  VMAX = LUSOL->a[LMAX];\n  LUSOL->a[LMAX] = LUSOL->a[L];\n  LUSOL->indc[LMAX] = LUSOL->indc[L];\n  L1 = L+1;\n  L2 = LUSOL->lena-(*LENL);\n  *LENL = ((*LENL)+L2)-L;\n  for(L = L1; L <= L2; L++) {\n    LUSOL->a[L] /= -VMAX;\n    LUSOL->indr[L] = IMAX;\n  }\n/*      Move the row containing vmax to pivotal position nrank + 1. */\n  LUSOL->ip[KMAX] = LUSOL->ip[NRANK1];\n  LUSOL->ip[NRANK1] = IMAX;\n  *DIAG = VMAX;\n/*      ------------------------------------------------------------------\n        If jelm is positive, insert  vmax  into a new row of  U.\n        This is now the only subdiagonal element.\n        ------------------------------------------------------------------ */\n  if(JELM>0) {\n    (*LROW)++;\n    LUSOL->locr[IMAX] = *LROW;\n    LUSOL->lenr[IMAX] = 1;\n    LUSOL->a[*LROW] = VMAX;\n    LUSOL->indr[*LROW] = JELM;\n  }\n  *INFORM = LUSOL_INFORM_LUSINGULAR;\n  goto x990;\n/*      No elements to eliminate. */\nx900:\n  *INFORM = LUSOL_INFORM_LUSUCCESS;\n  goto x990;\n/*      Not enough storage. */\nx970:\n  *INFORM = LUSOL_INFORM_ANEEDMEM;\nx990:\n;\n}\n\n/* ==================================================================\n   lu7for  (forward sweep) updates the LU factorization  A = L*U\n   when row  iw = ip(klast)  of  U  is eliminated by a forward\n   sweep of stabilized row operations, leaving  ip * U * iq  upper\n   triangular.\n   The row permutation  ip  is updated to preserve stability and/or\n   sparsity.  The column permutation  iq  is not altered.\n   kfirst  is such that row  ip(kfirst)  is the first row involved\n   in eliminating row  iw.  (Hence,  kfirst  marks the first nonzero\n   in row  iw  in pivotal order.)  If  kfirst  is unknown it may be\n   input as  1.\n   klast   is such that row  ip(klast)  is the row being eliminated.\n   klast   is not altered.\n   lu7for  should be called only if  kfirst .le. klast.\n   If  kfirst = klast,  there are no nonzeros to eliminate, but the\n   diagonal element of row  ip(klast)  may need to be moved to the\n   front of the row.\n   ------------------------------------------------------------------\n   On entry,  locc(*)  must be zero.\n\n   On exit:\n   inform = 0  if row iw has a nonzero diagonal (could be small).\n   inform = 1  if row iw has no diagonal.\n   inform = 7  if there is not enough storage to finish the update.\n\n   On a successful exit (inform le 1),  locc(*)  will again be zero.\n   ------------------------------------------------------------------\n      Jan 1985: Final f66 version.\n   09 May 1988: First f77 version.\n   ================================================================== */\nvoid LU7FOR(LUSOLrec *LUSOL, int KFIRST, int KLAST, int *LENL, int *LENU,\n                     int *LROW, int *INFORM, REAL *DIAG)\n{\n  MYBOOL SWAPPD;\n  int    KBEGIN, IW, LENW, LW1, LW2, JFIRST, MINFRE, NFREE, L, J, KSTART, KSTOP, K,\n         LFIRST, IV, LENV, LV1, JLAST, LV2, LV3, LV, JV, LW, LDIAG, LIMIT;\n  REAL   AMULT, LTOL, USPACE, SMALL, VJ, WJ;\n\n  LTOL   = LUSOL->parmlu[LUSOL_RP_UPDATEMAX_Lij];\n  SMALL  = LUSOL->parmlu[LUSOL_RP_ZEROTOLERANCE];\n  USPACE = LUSOL->parmlu[LUSOL_RP_COMPSPACE_U];\n  KBEGIN = KFIRST;\n  SWAPPD = FALSE;\n\n/*      We come back here from below if a row interchange is performed. */\nx100:\n  IW = LUSOL->ip[KLAST];\n  LENW = LUSOL->lenr[IW];\n  if(LENW==0)\n    goto x910;\n  LW1 = LUSOL->locr[IW];\n  LW2 = (LW1+LENW)-1;\n  JFIRST = LUSOL->iq[KBEGIN];\n  if(KBEGIN>=KLAST)\n    goto x700;\n/*      Make sure there is room at the end of the row file\n        in case row  iw  is moved there and fills in completely. */\n  MINFRE = LUSOL->n+1;\n  NFREE = LUSOL->lena-(*LENL)-(*LROW);\n  if(NFREE<MINFRE) {\n    LU1REC(LUSOL, LUSOL->m,TRUE,LROW,LUSOL->indr,LUSOL->lenr,LUSOL->locr);\n    LW1 = LUSOL->locr[IW];\n    LW2 = (LW1+LENW)-1;\n    NFREE = LUSOL->lena-(*LENL)-(*LROW);\n    if(NFREE<MINFRE)\n      goto x970;\n\n  }\n/*      Set markers on row  iw. */\n  for(L = LW1; L <= LW2; L++) {\n    J = LUSOL->indr[L];\n    LUSOL->locc[J] = L;\n  }\n/*      ==================================================================\n        Main elimination loop.\n        ================================================================== */\n  KSTART = KBEGIN;\n  KSTOP = MIN(KLAST,LUSOL->n);\n  for(K = KSTART; K <= KSTOP; K++) {\n    JFIRST = LUSOL->iq[K];\n    LFIRST = LUSOL->locc[JFIRST];\n    if(LFIRST==0)\n      goto x490;\n/*         Row  iw  has its first element in column  jfirst. */\n    WJ = LUSOL->a[LFIRST];\n    if(K==KLAST)\n      goto x490;\n/*         ---------------------------------------------------------------\n           We are about to use the first element of row  iv\n                  to eliminate the first element of row  iw.\n           However, we may wish to interchange the rows instead,\n           to preserve stability and/or sparsity.\n           --------------------------------------------------------------- */\n    IV = LUSOL->ip[K];\n    LENV = LUSOL->lenr[IV];\n    LV1 = LUSOL->locr[IV];\n    VJ = ZERO;\n    if(LENV==0)\n      goto x150;\n    if(LUSOL->indr[LV1]!=JFIRST)\n      goto x150;\n    VJ = LUSOL->a[LV1];\n    if(SWAPPD)\n      goto x200;\n    if(LTOL*fabs(WJ)<fabs(VJ))\n      goto x200;\n    if(LTOL*fabs(VJ)<fabs(WJ))\n      goto x150;\n    if(LENV<=LENW)\n      goto x200;\n/*         ---------------------------------------------------------------\n           Interchange rows  iv  and  iw.\n           --------------------------------------------------------------- */\nx150:\n    LUSOL->ip[KLAST] = IV;\n    LUSOL->ip[K] = IW;\n    KBEGIN = K;\n    SWAPPD = TRUE;\n    goto x600;\n/*         ---------------------------------------------------------------\n           Delete the eliminated element from row  iw\n           by overwriting it with the last element.\n           --------------------------------------------------------------- */\nx200:\n    LUSOL->a[LFIRST] = LUSOL->a[LW2];\n    JLAST = LUSOL->indr[LW2];\n    LUSOL->indr[LFIRST] = JLAST;\n    LUSOL->indr[LW2] = 0;\n    LUSOL->locc[JLAST] = LFIRST;\n    LUSOL->locc[JFIRST] = 0;\n    LENW--;\n    (*LENU)--;\n    if(*LROW==LW2)\n      (*LROW)--;\n    LW2 = LW2-1;\n/*         ---------------------------------------------------------------\n           Form the multiplier and store it in the  L  file.\n           --------------------------------------------------------------- */\n    if(fabs(WJ)<=SMALL)\n      goto x490;\n    AMULT = -WJ/VJ;\n    L = LUSOL->lena-(*LENL);\n    LUSOL->a[L] = AMULT;\n    LUSOL->indr[L] = IV;\n    LUSOL->indc[L] = IW;\n    (*LENL)++;\n/*         ---------------------------------------------------------------\n           Add the appropriate multiple of row  iv  to row  iw.\n           We use two different inner loops.  The first one is for the\n           case where row  iw  is not at the end of storage.\n           --------------------------------------------------------------- */\n    if(LENV==1)\n      goto x490;\n    LV2 = LV1+1;\n    LV3 = (LV1+LENV)-1;\n    if(LW2==*LROW)\n      goto x400;\n/*         ...............................................................\n           This inner loop will be interrupted only if\n           fill-in occurs enough to bump into the next row.\n           ............................................................... */\n    for(LV = LV2; LV <= LV3; LV++) {\n      JV = LUSOL->indr[LV];\n      LW = LUSOL->locc[JV];\n      if(LW>0) {\n/*               No fill-in. */\n        LUSOL->a[LW] += AMULT*LUSOL->a[LV];\n        if(fabs(LUSOL->a[LW])<=SMALL) {\n/*                  Delete small computed element. */\n          LUSOL->a[LW] = LUSOL->a[LW2];\n          J = LUSOL->indr[LW2];\n          LUSOL->indr[LW] = J;\n          LUSOL->indr[LW2] = 0;\n          LUSOL->locc[J] = LW;\n          LUSOL->locc[JV] = 0;\n          (*LENU)--;\n          LENW--;\n          LW2--;\n        }\n      }\n      else {\n/*               Row  iw  doesn't have an element in column  jv  yet\n                 so there is a fill-in. */\n        if(LUSOL->indr[LW2+1]!=0)\n          goto x360;\n        (*LENU)++;\n        LENW++;\n        LW2++;\n        LUSOL->a[LW2] = AMULT*LUSOL->a[LV];\n        LUSOL->indr[LW2] = JV;\n        LUSOL->locc[JV] = LW2;\n      }\n    }\n    goto x490;\n/*         Fill-in interrupted the previous loop.\n           Move row  iw  to the end of the row file. */\nx360:\n    LV2 = LV;\n    LUSOL->locr[IW] = (*LROW)+1;\n\n#ifdef LUSOLFastMove\n    L = LW2-LW1+1;\n    if(L > 0) {\n      int loci, *locp;\n      for(loci = LW1, locp = LUSOL->indr+LW1;\n          loci <= LW2; loci++, locp++) {\n        (*LROW)++;\n        LUSOL->locc[*locp] = *LROW;\n      }\n      LW2 = (*LROW)-L+1;\n      MEMMOVE(LUSOL->a+LW2,    LUSOL->a+LW1, L);\n      MEMMOVE(LUSOL->indr+LW2, LUSOL->indr+LW1, L);\n      MEMCLEAR(LUSOL->indr+LW1, L);\n    }\n#else\n    for(L = LW1; L <= LW2; L++) {\n      (*LROW)++;\n      LUSOL->a[*LROW] = LUSOL->a[L];\n      J = LUSOL->indr[L];\n      LUSOL->indr[L] = 0;\n      LUSOL->indr[*LROW] = J;\n      LUSOL->locc[J] = *LROW;\n    }\n#endif\n    LW1 = LUSOL->locr[IW];\n    LW2 = *LROW;\n/*         ...............................................................\n           Inner loop with row  iw  at the end of storage.\n           ............................................................... */\nx400:\n    for(LV = LV2; LV <= LV3; LV++) {\n      JV = LUSOL->indr[LV];\n      LW = LUSOL->locc[JV];\n      if(LW>0) {\n/*               No fill-in. */\n        LUSOL->a[LW] += AMULT*LUSOL->a[LV];\n        if(fabs(LUSOL->a[LW])<=SMALL) {\n/*                  Delete small computed element. */\n          LUSOL->a[LW] = LUSOL->a[LW2];\n          J = LUSOL->indr[LW2];\n          LUSOL->indr[LW] = J;\n          LUSOL->indr[LW2] = 0;\n          LUSOL->locc[J] = LW;\n          LUSOL->locc[JV] = 0;\n          (*LENU)--;\n          LENW--;\n          LW2--;\n        }\n      }\n      else {\n/*               Row  iw  doesn't have an element in column  jv  yet\n                 so there is a fill-in. */\n        (*LENU)++;\n        LENW++;\n        LW2++;\n        LUSOL->a[LW2] = AMULT*LUSOL->a[LV];\n        LUSOL->indr[LW2] = JV;\n        LUSOL->locc[JV] = LW2;\n      }\n    }\n    *LROW = LW2;\n/*         The  k-th  element of row  iw  has been processed.\n           Reset  swappd  before looking at the next element. */\nx490:\n    SWAPPD = FALSE;\n  }\n/*      ==================================================================\n        End of main elimination loop.\n        ==================================================================\n\n        Cancel markers on row  iw. */\nx600:\n  LUSOL->lenr[IW] = LENW;\n  if(LENW==0)\n    goto x910;\n  for(L = LW1; L <= LW2; L++) {\n    J = LUSOL->indr[L];\n    LUSOL->locc[J] = 0;\n  }\n/*      Move the diagonal element to the front of row  iw.\n        At this stage,  lenw gt 0  and  klast le n. */\nx700:\n  for(L = LW1; L <= LW2; L++) {\n    LDIAG = L;\n    if(LUSOL->indr[L]==JFIRST)\n      goto x730;\n  }\n  goto x910;\n\nx730:\n  *DIAG = LUSOL->a[LDIAG];\n  LUSOL->a[LDIAG] = LUSOL->a[LW1];\n  LUSOL->a[LW1] = *DIAG;\n  LUSOL->indr[LDIAG] = LUSOL->indr[LW1];\n  LUSOL->indr[LW1] = JFIRST;\n/*      If an interchange is needed, repeat from the beginning with the\n        new row  iw,  knowing that the opposite interchange cannot occur. */\n  if(SWAPPD)\n    goto x100;\n  *INFORM = LUSOL_INFORM_LUSUCCESS;\n  goto x950;\n/*      Singular. */\nx910:\n  *DIAG = ZERO;\n  *INFORM = LUSOL_INFORM_LUSINGULAR;\n/*      Force a compression if the file for  U  is much longer than the\n        no. of nonzeros in  U  (i.e. if  lrow  is much bigger than  lenU).\n        This should prevent memory fragmentation when there is far more\n        memory than necessary  (i.e. when  lena  is huge). */\nx950:\n  LIMIT = (int) (USPACE*(*LENU))+LUSOL->m+LUSOL->n+1000;\n  if(*LROW>LIMIT)\n    LU1REC(LUSOL, LUSOL->m,TRUE,LROW,LUSOL->indr,LUSOL->lenr,LUSOL->locr);\n  goto x990;\n/*      Not enough storage. */\nx970:\n  *INFORM = LUSOL_INFORM_ANEEDMEM;\n/*      Exit. */\nx990:\n;\n}\n\n/* ==================================================================\n   lu7rnk (check rank) assumes U is currently nrank by n\n   and determines if row nrank contains an acceptable pivot.\n   If not, the row is deleted and nrank is decreased by 1.\n   jsing is an input parameter (not altered).  If jsing is positive,\n   column jsing has already been judged dependent.  A substitute\n   (if any) must be some other column.\n   ------------------------------------------------------------------\n   -- Jul 1987: First version.\n   09 May 1988: First f77 version.\n   ================================================================== */\nvoid LU7RNK(LUSOLrec *LUSOL, int JSING, int *LENU,\n            int *LROW, int *NRANK, int *INFORM, REAL *DIAG)\n{\n  REAL UTOL1, UMAX;\n  int  IW, LENW, L1, L2, LMAX, L, JMAX, KMAX;\n\n#ifdef ForceInitialization\n  L1 = 0;\n  L2 = 0;\n#endif\n\n  UTOL1 = LUSOL->parmlu[LUSOL_RP_SMALLDIAG_U];\n  *DIAG = ZERO;\n/*      Find Umax, the largest element in row nrank. */\n  IW = LUSOL->ip[*NRANK];\n  LENW = LUSOL->lenr[IW];\n  if(LENW==0)\n    goto x400;\n  L1 = LUSOL->locr[IW];\n  L2 = (L1+LENW)-1;\n  UMAX = ZERO;\n  LMAX = L1;\n  for(L = L1; L <= L2; L++) {\n    if(UMAX<fabs(LUSOL->a[L])) {\n      UMAX = fabs(LUSOL->a[L]);\n      LMAX = L;\n    }\n  }\n/*      Find which column that guy is in (in pivotal order).\n        Interchange him with column nrank, then move him to be\n        the new diagonal at the front of row nrank. */\n  *DIAG = LUSOL->a[LMAX];\n  JMAX = LUSOL->indr[LMAX];\n  for(KMAX = *NRANK; KMAX <= LUSOL->n; KMAX++) {\n    if(LUSOL->iq[KMAX]==JMAX)\n      break;\n  }\n  LUSOL->iq[KMAX] = LUSOL->iq[*NRANK];\n  LUSOL->iq[*NRANK] = JMAX;\n  LUSOL->a[LMAX] = LUSOL->a[L1];\n  LUSOL->a[L1] = *DIAG;\n  LUSOL->indr[LMAX] = LUSOL->indr[L1];\n  LUSOL->indr[L1] = JMAX;\n/*      See if the new diagonal is big enough. */\n  if(UMAX<=UTOL1)\n    goto x400;\n  if(JMAX==JSING)\n    goto x400;\n/*      ------------------------------------------------------------------\n        The rank stays the same.\n        ------------------------------------------------------------------ */\n  *INFORM = LUSOL_INFORM_LUSUCCESS;\n  return;\n/*      ------------------------------------------------------------------\n        The rank decreases by one.\n        ------------------------------------------------------------------ */\nx400:\n  *INFORM = LUSOL_INFORM_RANKLOSS;\n  (*NRANK)--;\n  if(LENW>0) {\n/*         Delete row nrank from U. */\n    LENU = LENU-LENW;\n    LUSOL->lenr[IW] = 0;\n    for(L = L1; L <= L2; L++) {\n      LUSOL->indr[L] = 0;\n    }\n    if(L2==*LROW) {\n/*            This row was at the end of the data structure.\n              We have to reset lrow.\n              Preceding rows might already have been deleted, so we\n              have to be prepared to go all the way back to 1. */\n      for(L = 1; L <= L2; L++) {\n        if(LUSOL->indr[*LROW]>0)\n          goto x900;\n        (*LROW)--;\n      }\n    }\n  }\nx900:\n;\n}\n\n/* ==================================================================\n   lu7zap  eliminates all nonzeros in column  jzap  of  U.\n   It also sets  kzap  to the position of  jzap  in pivotal order.\n   Thus, on exit we have  iq(kzap) = jzap.\n   ------------------------------------------------------------------\n   -- Jul 1987: nrank added.\n   10 May 1988: First f77 version.\n   ================================================================== */\nvoid LU7ZAP(LUSOLrec *LUSOL, int JZAP, int *KZAP, int *LENU, int *LROW,\n            int NRANK)\n{\n  int K, I, LENI, LR1, LR2, L;\n\n  for(K = 1; K <= NRANK; K++) {\n    I = LUSOL->ip[K];\n    LENI = LUSOL->lenr[I];\n    if(LENI==0)\n      goto x90;\n    LR1 = LUSOL->locr[I];\n    LR2 = (LR1+LENI)-1;\n    for(L = LR1; L <= LR2; L++) {\n      if(LUSOL->indr[L]==JZAP)\n        goto x60;\n    }\n    goto x90;\n/*         Delete the old element. */\nx60:\n    LUSOL->a[L] = LUSOL->a[LR2];\n    LUSOL->indr[L] = LUSOL->indr[LR2];\n    LUSOL->indr[LR2] = 0;\n    LUSOL->lenr[I] = LENI-1;\n    (*LENU)--;\n/*         Stop if we know there are no more rows containing  jzap. */\nx90:\n    *KZAP = K;\n    if(LUSOL->iq[K]==JZAP)\n      goto x800;\n  }\n/*      nrank must be smaller than n because we haven't found kzap yet. */\n  L = LUSOL->n;\n  for(K = NRANK+1; K <= L; K++) {\n    *KZAP = K;\n    if(LUSOL->iq[K]==JZAP)\n      break;\n  }\n/*      See if we zapped the last element in the file. */\nx800:\n  if(*LROW>0) {\n    if(LUSOL->indr[*LROW]==0)\n      (*LROW)--;\n  }\n\n}\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/bfp/bfp_LUSOL/LUSOL/lusol8a.c",
    "content": "\n/* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n   File  lusol8a\n      lu8rpc\n      Sparse LU update: Replace Column\n      LUSOL's sparse implementation of the Bartels-Golub update.\n\n   01 May 2002: Derived from LUSOL's original lu8a.f file.\n   01 May 2002: Current version of lusol8a.f.\n   ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */\n\n/* ==================================================================\n   lu8rpc  updates the LU factorization  A = L*U  when column  jrep\n   is replaced by some vector  a(new).\n   lu8rpc  is an implementation of the Bartels-Golub update,\n   designed for the case where A is rectangular and/or singular.\n   L is a product of stabilized eliminations (m x m, nonsingular).\n   P U Q is upper trapezoidal (m x n, rank nrank).\n\n   If  mode1 = 0,  the old column is taken to be zero\n                   (so it does not have to be removed from  U).\n   If  mode1 = 1,  the old column need not have been zero.\n   If  mode2 = 0,  the new column is taken to be zero.\n                   v(*)  is not used or altered.\n   If  mode2 = 1,  v(*)  must contain the new column  a(new).\n                   On exit,  v(*)  will satisfy  L*v = a(new).\n   If  mode2 = 2,  v(*)  must satisfy  L*v = a(new).\n\n   The array  w(*)  is not used or altered.\n   On entry, all elements of  locc  are assumed to be zero.\n   On a successful exit (inform != 7), this will again be true.\n   On exit:\n\n   inform = -1  if the rank of U decreased by 1.\n   inform =  0  if the rank of U stayed the same.\n   inform =  1  if the rank of U increased by 1.\n   inform =  2  if the update seemed to be unstable\n                (diag much bigger than vnorm).\n   inform =  7  if the update was not completed (lack of storage).\n   inform =  8  if jrep is not between 1 and n.\n   ------------------------------------------------------------------\n   -- Jan 1985: Original F66 version.\n   -- Jul 1987: Modified to maintain U in trapezoidal form.\n   10 May 1988: First f77 version.\n   16 Oct 2000: Added test for instability (inform = 2).\n   ================================================================== */\nvoid LU8RPC(LUSOLrec *LUSOL, int MODE1, int MODE2,\n            int JREP, REAL V[], REAL W[],\n            int *INFORM, REAL *DIAG, REAL *VNORM)\n{\n  MYBOOL SINGLR;\n  int    LPRINT, NRANK, LENL, LENU, LROW, NRANK0, KREP, KLAST, IW, L1, J1, JSING;\n  REAL   UTOL1, UTOL2;\n\n  LPRINT = LUSOL->luparm[LUSOL_IP_PRINTLEVEL];\n  NRANK  = LUSOL->luparm[LUSOL_IP_RANK_U];\n  LENL   = LUSOL->luparm[LUSOL_IP_NONZEROS_L];\n  LENU   = LUSOL->luparm[LUSOL_IP_NONZEROS_U];\n  LROW   = LUSOL->luparm[LUSOL_IP_NONZEROS_ROW];\n  UTOL1  = LUSOL->parmlu[LUSOL_RP_SMALLDIAG_U];\n  UTOL2  = LUSOL->parmlu[LUSOL_RP_EPSDIAG_U];\n  NRANK0 = NRANK;\n  *DIAG  = ZERO;\n  *VNORM = ZERO;\n  if(JREP<1)\n    goto x980;\n  if(JREP>LUSOL->n)\n    goto x980;\n\n/*      ------------------------------------------------------------------\n        If mode1 = 0, there are no elements to be removed from  U\n        but we still have to set  krep  (using a backward loop).\n        Otherwise, use lu7zap to remove column  jrep  from  U\n        and set  krep  at the same time.\n        ------------------------------------------------------------------ */\n  if(MODE1==LUSOL_UPDATE_OLDEMPTY) {\n    KREP = LUSOL->n+1;\nx10:\n    KREP--;\n    if(LUSOL->iq[KREP]!=JREP)\n      goto x10;\n  }\n  else\n    LU7ZAP(LUSOL, JREP,&KREP,&LENU,&LROW,NRANK);\n\n/*      ------------------------------------------------------------------\n        Insert a new column of u and find klast.\n        ------------------------------------------------------------------ */\n  if(MODE2==LUSOL_UPDATE_NEWEMPTY) {\n    KLAST = 0;\n  }\n  else {\n    if(MODE2==LUSOL_UPDATE_NEWNONEMPTY) {\n/*            Transform v = a(new) to satisfy  L*v = a(new). */\n      LU6SOL(LUSOL, LUSOL_SOLVE_Lv_v, V,W, NULL, INFORM);\n    }\n    else if(V==NULL)\n/* Otherwise, the V vector is taken to satisfy this already, or stored earlier. */\n      V=LUSOL->vLU6L;\n      \n\n/*         Insert into  U  any nonzeros in the top of  v.\n           row  ip(klast)  will contain the last nonzero in pivotal order.\n           Note that  klast  will be in the range  ( 0, nrank ). */\n    LU7ADD(LUSOL, JREP,V,LENL,&LENU,&LROW,NRANK,INFORM,&KLAST,VNORM);\n    if(*INFORM==LUSOL_INFORM_ANEEDMEM)\n      goto x970;\n  }\n/*      ------------------------------------------------------------------\n        In general, the new column causes U to look like this:\n                    krep        n                 krep  n\n                   ....a.........          ..........a...\n                    .  a        .           .        a  .\n                     . a        .            .       a  .\n                      .a        .             .      a  .\n           P U Q =     a        .    or        .     a  .\n                       b.       .               .    a  .\n                       b .      .                .   a  .\n                       b  .     .                 .  a  .\n                       b   ......                  ..a...  nrank\n                       c                             c\n                       c                             c\n                       c                             c     m\n        klast points to the last nonzero \"a\" or \"b\".\n        klast = 0 means all \"a\" and \"b\" entries are zero.\n        ------------------------------------------------------------------ */\n  if(MODE2==LUSOL_UPDATE_NEWEMPTY) {\n    if(KREP>NRANK)\n      goto x900;\n  }\n  else if(NRANK<LUSOL->m) {\n/*         Eliminate any \"c\"s (in either case).\n           Row nrank + 1 may end up containing one nonzero. */\n    LU7ELM(LUSOL, JREP,V,&LENL,&LROW,NRANK,INFORM,DIAG);\n    if(*INFORM==LUSOL_INFORM_ANEEDMEM)\n      goto x970;\n    if(*INFORM==LUSOL_INFORM_LUSINGULAR) {\n/*            The nonzero is apparently significant.\n              Increase nrank by 1 and make klast point to the bottom. */\n      NRANK++;\n      KLAST = NRANK;\n    }\n  }\n  if(NRANK<LUSOL->n) {\n/*         The column rank is low.\n           In the first case, we want the new column to end up in\n           position nrank, so the trapezoidal columns will have a chance\n           later on (in lu7rnk) to pivot in that position.\n           Otherwise the new column is not part of the triangle.  We\n           swap it into position nrank so we can judge it for singularity.\n           lu7rnk might choose some other trapezoidal column later. */\n    if(KREP<NRANK)\n      KLAST = NRANK;\n    else {\n      LUSOL->iq[KREP] = LUSOL->iq[NRANK];\n      LUSOL->iq[NRANK] = JREP;\n      KREP = NRANK;\n    }\n  }\n/*      ------------------------------------------------------------------\n        If krep .lt. klast, there are some \"b\"s to eliminate:\n                     krep\n                   ....a.........\n                    .  a        .\n                     . a        .\n                      .a        .\n           P U Q =     a        .  krep\n                       b.       .\n                       b .      .\n                       b  .     .\n                       b   ......  nrank\n        If krep .eq. klast, there are no \"b\"s, but the last \"a\" still\n        has to be moved to the front of row krep (by lu7for).\n        ------------------------------------------------------------------ */\n  if(KREP<=KLAST) {\n/*         Perform a cyclic permutation on the current pivotal order,\n           and eliminate the resulting row spike.  krep becomes klast.\n           The final diagonal (if any) will be correctly positioned at\n           the front of the new krep-th row.  nrank stays the same. */\n    LU7CYC(LUSOL, KREP,KLAST,LUSOL->ip);\n    LU7CYC(LUSOL, KREP,KLAST,LUSOL->iq);\n    LU7FOR(LUSOL, KREP,KLAST,&LENL,&LENU,&LROW,INFORM,DIAG);\n    if(*INFORM==LUSOL_INFORM_ANEEDMEM)\n      goto x970;\n    KREP = KLAST;\n/*         Test for instability (diag much bigger than vnorm). */\n    SINGLR = (MYBOOL) ((*VNORM)<UTOL2*fabs(*DIAG));\n    if(SINGLR)\n      goto x920;\n  }\n/*      ------------------------------------------------------------------\n        Test for singularity in column krep (where krep<=nrank).\n        ------------------------------------------------------------------ */\n  *DIAG = ZERO;\n  IW = LUSOL->ip[KREP];\n  SINGLR = (MYBOOL) (LUSOL->lenr[IW]==0);\n  if(!SINGLR) {\n    L1 = LUSOL->locr[IW];\n    J1 = LUSOL->indr[L1];\n    SINGLR = (MYBOOL) (J1!=JREP);\n    if(!SINGLR) {\n      *DIAG = LUSOL->a[L1];\n      SINGLR = (MYBOOL) (fabs(*DIAG)<=UTOL1 || fabs(*DIAG)<=UTOL2*(*VNORM));\n    }\n  }\n  if(SINGLR && (KREP<NRANK)) {\n/*         Perform cyclic permutations to move column jrep to the end.\n           Move the corresponding row to position nrank\n           then eliminate the resulting row spike. */\n    LU7CYC(LUSOL, KREP,NRANK,LUSOL->ip);\n    LU7CYC(LUSOL, KREP,LUSOL->n,LUSOL->iq);\n    LU7FOR(LUSOL, KREP,NRANK,&LENL,&LENU,&LROW,INFORM,DIAG);\n    if(*INFORM==LUSOL_INFORM_ANEEDMEM)\n      goto x970;\n  }\n/*      Find the best column to be in position nrank.\n        If singlr, it can't be the new column, jrep.\n        If nothing satisfactory exists, nrank will be decreased. */\n  if(SINGLR || (NRANK<LUSOL->n)) {\n    JSING = 0;\n    if(SINGLR)\n      JSING = JREP;\n    LU7RNK(LUSOL, JSING,&LENU,&LROW,&NRANK,INFORM,DIAG);\n  }\n\n/*      ------------------------------------------------------------------\n        Update indeces of optional row-based version of L0.\n        ------------------------------------------------------------------ */\n#if 0\n  if(LUSOL->L0 != NULL)\n    LU1L0UPD(LUSOL, INFORM);\n#endif\n\n/*      ------------------------------------------------------------------\n        Set inform for exit.\n        ------------------------------------------------------------------ */\nx900:\n  if(NRANK==NRANK0)\n    *INFORM = LUSOL_INFORM_LUSUCCESS;\n  else if(NRANK<NRANK0) {\n    *INFORM = LUSOL_INFORM_RANKLOSS;\n    if(NRANK0==LUSOL->n) {\n      if(LPRINT>=LUSOL_MSG_SINGULARITY)\n        LUSOL_report(LUSOL, 0, \"lu8rpc  warning...\\nSingularity after replacing column.    jrep=%8d    diag=%g\\n\",\n                            JREP,DIAG);\n    }\n  }\n  else\n    *INFORM = LUSOL_INFORM_LUSINGULAR;\n  goto x990;\n/*      Instability. */\nx920:\n  *INFORM = LUSOL_INFORM_LUUNSTABLE;\n  if(LPRINT>=LUSOL_MSG_SINGULARITY)\n    LUSOL_report(LUSOL, 0, \"lu8rpc  warning...\\nInstability after replacing column.    jrep=%8d    diag=%g\\n\",\n                        JREP,DIAG);\n  goto x990;\n/*      Not enough storage. */\nx970:\n  *INFORM = LUSOL_INFORM_ANEEDMEM;\n  if(LPRINT>=LUSOL_MSG_SINGULARITY)\n    LUSOL_report(LUSOL, 0, \"lu8rpc  error...\\nInsufficient memory.    lena=%8d\\n\",\n                        LUSOL->lena);\n  goto x990;\n/*      jrep  is out of range. */\nx980:\n  *INFORM = LUSOL_INFORM_FATALERR;\n  if(LPRINT>=LUSOL_MSG_SINGULARITY)\n    LUSOL_report(LUSOL, 0, \"lu8rpc  error...\\njrep  is out of range.    m=%8d    n=%8d    jrep=%8d\\n\",\n                        LUSOL->m,LUSOL->n,JREP);\n/*      Exit. */\nx990:\n  LUSOL->luparm[LUSOL_IP_UPDATECOUNT]++;\n  LUSOL->luparm[LUSOL_IP_RANK_U]       = NRANK;\n  LUSOL->luparm[LUSOL_IP_NONZEROS_L]   = LENL;\n  LUSOL->luparm[LUSOL_IP_NONZEROS_U]   = LENU;\n  LUSOL->luparm[LUSOL_IP_NONZEROS_ROW] = LROW;\n  LUSOL->luparm[LUSOL_IP_INFORM]       = *INFORM;\n}\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/bfp/bfp_LUSOL/LUSOL/lusolio.c",
    "content": "\n#include <stdio.h>\n#include <string.h>\n#include \"mmio.h\"\n#include \"hbio.h\"\n#include \"lusolio.h\"\n\n/* Utility routines to read matrix files in the Coordinate Text File format*/\n\nMYBOOL ctf_read_A(char *filename, int maxm, int maxn, int maxnz,\n                  int *m, int *n, int *nnzero, int *iA, int *jA, REAL *Aij)\n{\n  FILE *iofile;\n  int  eof;\n  char buffer[100];\n  int  k, i, j;\n  REAL Ak;\n  MYBOOL filldata;\n\n  *nnzero = 0;\n  *m      = 0;\n  *n      = 0;\n\n  iofile = fopen(filename, \"r\" );\n  if(iofile == NULL) {\n    printf(\"A file %s does not exist\\n\", filename);\n    return( FALSE );\n  }\n\n  filldata = (MYBOOL) !((iA == NULL) && (jA == NULL) && (Aij == NULL));\n  eof = TRUE;\n  for (k = 1; k <= maxnz; k++) {\n    eof = feof(iofile);\n    if(eof)\n      break;\n    eof = fscanf(iofile, \"%d %d %s\", &i, &j, buffer);\n    if(eof == 0 || eof == EOF || i <= 0 || j <= 0 || strlen(buffer) == 0)\n      break;\n    Ak = atof(buffer);\n    (*nnzero)++;\n    if (filldata) {\n      iA[k]  = i;\n      jA[k]  = j;\n      Aij[k] = Ak;\n    }\n    if (i > *m) *m = i;\n    if (j > *n) *n = j;\n  }\n  fclose( iofile );\n  if(!eof) {\n    printf(\"Too much data in A file.  Increase maxnz\\n\");\n    printf(\"Current maxnz = %d\\n\", maxnz);\n    return( FALSE );\n  }\n  printf(\"A  read successfully\\n\");\n  printf(\"m      = %d   n      = %d   nnzero = %d\\n\",\n          *m, *n, *nnzero);\n  if (*m > maxm  ||  *n > maxn) {\n    printf(\"However, matrix dimensions exceed maxm or maxn\\n\");\n    return( FALSE );\n  }\n  return( TRUE );\n}\n\nMYBOOL ctf_size_A(char *filename, int *m, int *n, int *nnzero)\n{\n  int maxint = 200000000;\n\n  return( ctf_read_A(filename, maxint, maxint, maxint,\n                     m, n, nnzero, NULL, NULL, NULL) );\n}\n\nMYBOOL ctf_read_b(char *filename, int m, REAL *b)\n{\n  FILE *iofile;\n  int  eof;\n  char buffer[100];\n  int  i;\n\n  iofile = fopen(filename, \"r\");\n  if(iofile == NULL) {\n    printf(\"b file %s does not exist\\n\", filename);\n    return( FALSE );\n  }\n\n  for (i = 1; i <= m; i++) {\n    if(feof(iofile))\n      goto x350;\n    eof = fscanf(iofile, \"%s\", buffer);\n    if(eof == 0 || eof == EOF)\n      goto x350;\n    b[i] = atof(buffer);\n  }\n\n  fclose( iofile );\n  printf(\"b  read successfully\\n\");\n  return( TRUE );\n\nx350:\n  fclose( iofile );\n  printf(\"Not enough data in b file.\\n\");\n  return( FALSE );\n}\n\n\n/* Utility routines to read matrix files in the MatrixMarket format*/\n#define mmf_recsize 255\nMYBOOL mmf_read_A(char *filename, int maxM, int maxN, int maxnz,\n                  int *M, int *N, int *nz, int *iA, int *jA, REAL *Aij)\n{\n  MM_typecode matcode;\n  FILE   *f;\n  int    i, k, ret_code, ival, jval;\n  REAL   Aval;\n  MYBOOL status = FALSE, ispat, filldata;\n  char   buf[mmf_recsize];\n\n  f = fopen(filename, \"r\");\n  if(f == NULL) \n    return( status );\n\n  if(mm_read_banner(f, &matcode) != 0) {\n    printf(\"Could not process Matrix Market banner.\\n\");\n    goto x900;\n  }\n\n  /*  Screen matrix types since LUSOL only supports a \n      subset of the Matrix Market data types. */\n  if(mm_is_complex(matcode) || mm_is_pattern(matcode)) {\n    printf(\"Sorry, this application does not support \");\n    printf(\"Market Market type: [%s]\\n\", mm_typecode_to_str(matcode));\n    goto x900;\n  }\n\n  /* Verify that we have sufficient array storage */\n  filldata = (MYBOOL) !((iA == NULL) && (jA == NULL) && (Aij == NULL));\n  if(filldata && maxN > 1 && jA == NULL) {\n    printf(\"Market Market insufficient array storage specified\\n\");\n    goto x900;\n  }\n\n  /* Find out size of sparse matrix .... */\n  ret_code = mm_read_mtx_crd_size(f, M, N, nz);\n  if(ret_code != 0 || !filldata || (*M > maxM) || (*N > maxN) || (*nz > maxnz)) {\n    status = !filldata;\n    goto x900;\n  }\n\n\n  /* NOTE: when reading in doubles, ANSI C requires the use of the \"l\"  */\n  /* specifier as in \"%lg\", \"%lf\", \"%le\", otherwise errors will occur   */\n  /*  (ANSI C X3.159-1989, Sec. 4.9.6.2, p. 136 lines 13-15)            */\n\n  /* Read dense matrix in column order */\n  ispat = (MYBOOL) mm_is_pattern(matcode);\n  k = 1;\n  if(mm_is_dense(matcode)) {\n    maxN = MIN(maxN, *N);\n    for (jval = 1; jval <= maxN; jval++) {\n      for (i = 1; i <= *M; i++) {\n        if(fgets(buf, mmf_recsize-1, f) == NULL)\n          break;\n        if(sscanf(buf, \"%lg\\n\", &Aval) == 0)\n          break;\n        if(Aval != 0) {\n          if(iA != NULL)\n            iA[k] = i;\n          if(jA != NULL)\n            jA[k] = jval;\n\n          /* Make sure we handle dense vector reading properly */\n          if(iA == NULL && jA == NULL)\n            Aij[i] = Aval;\n          else\n            Aij[k] = Aval;\n          k++;\n        }\n      }\n    }\n  }\n  /* Read sparse matrix by coordinate */\n  else {\n    for (i = 1; i <= *nz; i++) {\n      if(fgets(buf, mmf_recsize-1, f) == NULL)\n        break;\n      if(buf[0] == '%')\n        continue;\n      if(ispat) {\n        if(sscanf(buf, \"%d %d\\n\", &ival, &jval) == 0)\n          continue;\n        Aij[k] = 1.0;\n      }\n      else\n        if(sscanf(buf, \"%d %d %lg\\n\", &ival, &jval, &Aval) == 0)\n          continue;\n\n      /* Check if it is a nonzero and we are within column dimension */\n      if(Aval != 0 && jval <= maxN) {\n        Aij[k] = Aval;\n        if(iA != NULL)\n          iA[k] = ival;\n        if(jA != NULL)\n          jA[k] = jval;\n        k++;\n      }\n    }\n  }\n  *nz = k - 1;\n\n  /* Handle case where only the lower triangular parts are given */\n  if(!mm_is_general(matcode)) {\n    if((M != N) || (maxN != maxM) || (2*(*nz) > maxnz)) {\n      printf(\"Market Market cannot fill in symmetry data\\n\");\n      goto x900;\n    }\n    ispat = mm_is_skew(matcode);\n    for(i = 1; i <= *nz; i++) {\n      iA[k] = jA[i];\n      jA[k] = iA[i];\n      if(ispat)\n        Aij[k] = -Aij[i];\n      else\n        Aij[k] = Aij[i];\n      k++;\n    }\n    *nz = k - 1;\n  }\n  status = TRUE;\n\n  /* Finish up */\nx900:\n  fclose( f );\n  return( status );\n}\n\nMYBOOL mmf_size_A(char *filename, int *M, int *N, int *nz)\n{\n  int maxint = 200000000;\n\n  return( mmf_read_A(filename, maxint, maxint, maxint,\n                     M, N, nz, NULL, NULL, NULL) );\n}\n\nMYBOOL mmf_read_b(char *filename, int m, REAL *b)\n{\n  int im, jn, nnzero;\n\n  return( mmf_read_A(filename, m, 1, m,\n                     &im, &jn, &nnzero, NULL, NULL, b));\n}\n\n\n/* Utility routines to read matrix files in Harwell-Boeing format*/\n\nMYBOOL hbf_read_A(char *filename, int maxM, int maxN, int maxnz,\n                  int *M, int *N, int *nz, int *iA, int *jA, REAL *Aij)\n{\n  MYBOOL success;\n\n  success = hbf_size_A(filename, M, N, nz);\n  if(!success)\n    return( success );\n\n  Aij[1] = 0;\n  success = (MYBOOL) readHB_mat_double(filename, jA, iA-1, Aij-1);\n\n  /* Test if we have a pattern matrix and fill it with all zeros */\n  if(Aij[1] == 0) {\n    int i;\n    for(i = 1; i <= *nz; i++)\n      Aij[i] = 1;\n  }\n\n  /* Expand the column nz counts to triplet format */\n  if(success) {\n    int i, j, ii, k;\n    k = *nz;\n    for(j = *N; j > 0; j--) {\n      ii = jA[j];\n      for(i = jA[j-1]; i < ii; i++, k--)\n        jA[k] = j;\n    }\n  }\n  return( success );\n}\n\nMYBOOL hbf_size_A(char *filename, int *M, int *N, int *nz)\n{\n  int  Nrhs;\n  char *Type;\n\n  return( (MYBOOL) readHB_info(filename, M, N, nz, &Type, &Nrhs) );\n}\n\nMYBOOL hbf_read_b(char *filename, int m, REAL *b)\n{\n  return( (MYBOOL) readHB_aux_double(filename, 'F', b) ); /* Same format as matrix */\n}\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/bfp/bfp_LUSOL/LUSOL/lusolio.h",
    "content": "#ifndef HEADER_lusolio\n#define HEADER_lusolio\n\n/* Include necessary libraries                                               */\n/* ------------------------------------------------------------------------- */\n#include \"lusol.h\"\n\nMYBOOL ctf_read_A(char *filename, int maxm, int maxn, int maxnz,\n                  int *m, int *n, int *nnzero, int *iA, int *jA, REAL *Aij);\nMYBOOL ctf_size_A(char *filename, int *m, int *n, int *nnzero);\nMYBOOL ctf_read_b(char *filename, int m, REAL *b);\n\nMYBOOL mmf_read_A(char *filename, int maxM, int maxN, int maxnz,\n                  int *M, int *N, int *nz, int *iA, int *jA, REAL *Aij);\nMYBOOL mmf_size_A(char *filename, int *M, int *N, int *nz);\nMYBOOL mmf_read_b(char *filename, int m, REAL *b);\n\nMYBOOL hbf_read_A(char *filename, int maxM, int maxN, int maxnz,\n                  int *M, int *N, int *nz, int *iA, int *jA, REAL *Aij);\nMYBOOL hbf_size_A(char *filename, int *M, int *N, int *nz);\nMYBOOL hbf_read_b(char *filename, int m, REAL *b);\n\n\n#endif /* HEADER_lusolio */\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/bfp/bfp_LUSOL/LUSOL/lusolmain.c",
    "content": "\n/*     This program solves a sparse linear system Ax = b using LUSOL. */\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <math.h>\n#include <string.h>\n#include <time.h>\n#include \"commonlib.h\"\n#include \"myblas.h\"\n#include \"lusol.h\"\n#include \"lusolio.h\"\n#include \"lusolmain.h\"\n\n#if (defined WIN32) || (defined WIN64)\nvoid _strupr_(char *s)\n{\n  _strupr(s);\n}\n#else\n/* Yin Zhang noted that _strupr() is not available on many Unix platforms */\nvoid _strupr_(char *s)\n{\n  int  i;\n  char c;\n  for (i = 0; i < strlen(s); i++) {\n    c = s[i];\n    if (c <= 'z' && c >= 'a') {\n      s[i] = c - 'a' + 'A';\n    }\n  }\n}\n#endif\n\nMYBOOL getFileName(char *filename, char *test)\n{\n  MYBOOL status;\n  status = (MYBOOL) (('-' != test[0]) && (strlen(test) > 1));\n  if(status)\n    strcpy(filename, test);\n  return(status);\n}\nMYBOOL isNum(char val)\n{\n  int ord;\n  ord = (int) val - 48;\n  return( (MYBOOL) ((ord >= 0) && (ord <= 9)) );\n}\n\nvoid main( int argc, char *argv[], char *envp[] )\n{\n/* Output device */\n  FILE *outunit = stdout;\n\n/* Overall dimensions allocated */\n  int    maxm = MAXROWS, maxn = MAXCOLS, maxnz = MAXNZ,\n         replace = 0, randcol = 0;\n  MYBOOL ftran = TRUE;\n\n/* Storage for A, b */\n  REAL   *Aij = NULL, *b = NULL, *xexact = NULL;\n  int    *iA = NULL, *jA = NULL;\n\n/* Storage for LUSOL */\n  LUSOLrec *LUSOL = NULL;\n\n/* Define local storage variables */\n  int  i     , inform, j     , k     , i1   ,\n       m     , useropt, lenb, lenx,\n       n     , nelem , nnzero;\n  REAL Amax  , test  ,\n       bnorm , rnorm , xnorm,\n       *rhs = NULL, *r = NULL, *x = NULL;\n  char fileext[50], filename[255], blasname[255];\n  MYBOOL printsolution = FALSE, success = FALSE;\n\n/* Check if we have input parameters */\n  useropt = argc;\n  if(useropt < 2) {\n    printf(\"LUSOL v%d.%d.%d.%d - Linear equation solver - Development edition.\\n\",\n           LUSOL_VERMAJOR, LUSOL_VERMINOR, LUSOL_RELEASE, LUSOL_BUILD);\n    printf(\"Usage:   lusol [-p <type>] [-t <tolerance>] [-m <memscalar>]\\n\");\n    printf(\"               [-s] <MatrixFile> [<RhsFile>]\\n\");\n    printf(\"Options: -p <type>        <0..3>    Selects pivot type.\\n\");\n    printf(\"         -t <tolerance>   <1..100>  Selects diagonal tolerance.\\n\");\n    printf(\"         -m <memscalar>   <%d..100> Memory allocation scalar.\\n\", LUSOL_MULT_nz_a);\n    printf(\"         -b               Solves using btran (rather than ftran).\\n\");\n    printf(\"         -r <times>       Randomly replace a column and resolve.\\n\");\n    printf(\"         -s               Show the computed solution.\\n\");\n    printf(\"         -blas <lib>      Activates external optimized BLAS library.\\n\");\n    printf(\"Formats: Conventional RCV .TXT, MatrixMarket .MTX, or Harwell-Boeing .RUA\\n\");\n    printf(\"Author:  Michael A. Saunders (original Fortran version)\\n\");\n    printf(\"         Kjell Eikland       (modified C version)\\n\");\n    return;\n  }\n\n/* Create the LUSOL object and set user options */\n  LUSOL = LUSOL_create(outunit, 0, LUSOL_PIVMOD_TPP, 0);\n#if 1\n  LUSOL->luparm[LUSOL_IP_ACCELERATION] = LUSOL_OTHERORDER | LUSOL_ACCELERATE_L0;\n#elif 0\n  LUSOL->luparm[LUSOL_IP_ACCELERATION] = LUSOL_AUTOORDER | LUSOL_ACCELERATE_L0;\n#endif\n  LUSOL->luparm[LUSOL_IP_SCALAR_NZA] = 10;\n  i = 1;\n  n = 0;\n  filename[0] = '\\0';\n  blasname[0] = '\\0';\n  while((n == 0) && (i < argc)) {\n    if(strcmp(\"-p\", argv[i]) == 0) {\n      i1 = i+1;\n      if((i1 < argc) && isNum(argv[i1][0])) {\n        i = i1;\n        m = atoi(argv[i]);\n        if(m < 0 || m > LUSOL_PIVMOD_MAX)\n          continue;\n        LUSOL->luparm[LUSOL_IP_PIVOTTYPE] = m;\n      }\n    }\n    else if(strcmp(\"-t\", argv[i]) == 0) {\n      i1 = i+1;\n      if((i1 < argc) && isNum(argv[i1][0])) {\n        i = i1;\n        Amax = atof(argv[i]);\n        if(Amax < 1 || Amax > 100)\n          continue;\n        LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij] = Amax;\n      }\n    }\n    else if(strcmp(\"-m\", argv[i]) == 0) {\n      i1 = i+1;\n      if((i1 < argc) && isNum(argv[i1][0])) {\n        i = i1;\n        m = atoi(argv[i]);\n        if(m < LUSOL_MULT_nz_a || m > 100)\n          continue;\n        LUSOL->luparm[LUSOL_IP_SCALAR_NZA] = atoi(argv[i]);\n      }\n    }\n    else if(strcmp(\"-s\", argv[i]) == 0)\n      printsolution = TRUE;\n    else if(strcmp(\"-b\", argv[i]) == 0)\n      ftran = FALSE;\n    else if(strcmp(\"-r\", argv[i]) == 0) {\n      i1 = i+1;\n      if((i1 < argc) && isNum(argv[i1][0])) {\n        i = i1;\n        m = atoi(argv[i]);\n        if(m < 0 || m > 10)\n          continue;\n      }\n      else\n        m = 1;\n      srand((unsigned) time( NULL ));\n      replace = 2*m;\n    }\n    else if(strcmp(\"-blas\", argv[i]) == 0) {\n      i1 = i+1;\n      if((i1 < argc) && getFileName(blasname, argv[i1])) {\n        if(!load_BLAS(blasname))\n          fprintf(outunit, \"Could not load external BLAS library '%s'\\n\", blasname);\n        i = i1;\n      }\n      else\n        fprintf(outunit, \"Ignoring incomplete parameter %d '%s'\\n\", i, argv[i]);\n    }\n    else {\n      if(getFileName(filename, argv[i])) {\n        useropt = i;\n        break;\n      }\n      else\n        fprintf(outunit, \"Ignoring unknown parameter %d '%s'\\n\", i, argv[i]);\n    }\n    i++;\n  }\n\n/* Obtain file extension and see if we must estimate matrix data size */\n  strcpy(fileext, strchr(argv[useropt], '.'));\n  /* Yin Zhang noted that _strupr() is not available on many Unix platforms. */\n  _strupr_(fileext);\n/*  _strupr(fileext);*/\n\n  /* Read conventional text file format */\n  if(strcmp(fileext, \".TXT\") == 0) {\n    if(!ctf_size_A(filename, &maxm, &maxn, &maxnz))\n      goto x900;\n  }\n  /* Read MatrixMarket file format */\n  else if(strcmp(fileext, \".MTX\") == 0) {\n    if(!mmf_size_A(filename, &maxm, &maxn, &maxnz))\n      goto x900;\n  }\n  /* Read Harwell-Boeing file format */\n  else if(strcmp(fileext, \".RUA\") == 0) {\n    if(!hbf_size_A(filename, &maxm, &maxn, &maxnz))\n      goto x900;\n  }\n  else {\n    fprintf(outunit, \"Unrecognized matrix file extension %s\\n\", fileext);\n    goto x900;\n  }\n\n/* Create the arrays */\n\n  Aij = (REAL *) LUSOL_CALLOC(maxnz + BLAS_BASE, sizeof(REAL));\n  iA = (int *)   LUSOL_CALLOC(maxnz + BLAS_BASE, sizeof(int));\n  jA = (int *)   LUSOL_CALLOC(maxnz + BLAS_BASE, sizeof(int));\n  if(ftran)\n    lenb = maxm;\n  else\n    lenb = maxn;\n  b   = (REAL *) LUSOL_CALLOC(lenb+BLAS_BASE, sizeof(REAL));\n  rhs = (REAL *) LUSOL_CALLOC(lenb+BLAS_BASE, sizeof(REAL));\n\n  if(ftran)\n    lenx = maxn;\n  else\n    lenx = maxm;\n  xexact = (REAL *) LUSOL_CALLOC(lenx+BLAS_BASE, sizeof(REAL));\n  r = (REAL *) LUSOL_CALLOC(lenx+BLAS_BASE, sizeof(REAL));\n  x = (REAL *) LUSOL_CALLOC(lenx+BLAS_BASE, sizeof(REAL));\n\n/* -----------------------------------------------------------------\n   Read data files.\n   ----------------------------------------------------------------- */\n  fprintf(stdout, \"\\n========================================\\n\");\n  fprintf(stdout,   \"LUSOL v%d.%d.%d.%d - Linear equation solver\",\n                    LUSOL_VERMAJOR, LUSOL_VERMINOR, LUSOL_RELEASE, LUSOL_BUILD);\n  fprintf(stdout, \"\\n========================================\\n\");\n\n/* -----------------------------------------------------------------\n   Read data for A\n   ----------------------------------------------------------------- */\n  /* Read conventional text file format */\n  if(strcmp(fileext, \".TXT\") == 0) {\n    if(!ctf_read_A(argv[useropt], maxm, maxn, maxnz,\n                   &m, &n, &nnzero, iA, jA, Aij))\n      goto x900;\n  }\n  /* Read MatrixMarket file format */\n  else if(strcmp(fileext, \".MTX\") == 0) {\n    if(!mmf_read_A(argv[useropt], maxm, maxn, maxnz,\n                   &m, &n, &nnzero, iA, jA, Aij))\n      goto x900;\n  }\n  /* Read Harwell-Boeing file format */\n  else if(strcmp(fileext, \".RUA\") == 0) {\n    if(!hbf_read_A(argv[useropt], maxm, maxn, maxnz,\n                   &m, &n, &nnzero, iA, jA, Aij))\n      goto x900;\n  }\n  else {\n    fprintf(outunit, \"Error: Unrecognized matrix file extension %s\\n\", fileext);\n    goto x900;\n  }\n\n/* -----------------------------------------------------------------\n   Read data for b\n   ----------------------------------------------------------------- */\n  /* Handle Harwell-Boeing case where the file contains a RHS */\n  i = strcmp(fileext, \".RUA\");\n\n  if((useropt == argc-1) && (i != 0)) {\n    srand(timeNow());\n    i1 = m;\n    while(i1 > 0) {\n      test = rand();\n      i = RAND_MAX;\n      i = (int) ((test/i)*(m-1));\n/*      b[i+1] = 1.0; */\n      b[i+1] = i - 5;\n      i1--;\n    }\n    if(printsolution)\n      blockWriteREAL(outunit, \"\\nGenerated RHS vector\", b, 1, lenb);\n  }\n  else {\n    if(i != 0)\n      useropt++;\n    strcpy(fileext, strchr(argv[useropt], '.'));\n    _strupr_(fileext);\n\n    /* Read conventional text file format */\n    if(strcmp(fileext, \".TXT\") == 0) {\n      if(!ctf_read_b(argv[useropt], lenb, b))\n        goto x900;\n    }\n    /* Read MatrixMarket file format */\n    else if(strcmp(fileext, \".MTX\") == 0) {\n      if(!mmf_read_b(argv[useropt], lenb, b))\n        goto x900;\n    }\n  /* Read Harwell-Boeing file format */\n    else if(strcmp(fileext, \".RUA\") == 0) {\n      if(!hbf_read_b(argv[useropt], lenb, b))\n        goto x900;\n    }\n    else {\n      fprintf(outunit, \"Error: Unrecognized vector file extension %s\\n\", fileext);\n      goto x900;\n    }\n  }\n  success = TRUE;\n\n/* -----------------------------------------------------------------\n   Show data on input\n   ----------------------------------------------------------------- */\n  fprintf(outunit, \"\\nData read from:\\n%s\\n\", filename);\n  test = (double) nnzero / ((double) m * (double) n);\n  test *= 100.0;\n  fprintf(outunit, \"Rows = %d   Columns = %d   Non-zeros = %d  Density =%8.4f%%\\n\",\n                   m, n, nnzero, test);\n\n/* -----------------------------------------------------------------\n   Load A into (a, indc, indr).\n   ----------------------------------------------------------------- */\n#if 0 /* BUG !!! */\n  if(n != m)\n    LUSOL->luparm[LUSOL_IP_KEEPLU] = FALSE;\n#endif\n#ifdef LegacyTesting\n  LUSOL->luparm[LUSOL_IP_SCALAR_NZA] = LUSOL_MULT_nz_a;\n  LUSOL_sizeto(LUSOL, MAXROWS, MAXCOLS, MAXNZ*LUSOL_MULT_nz_a);\n#endif\n\n  if(!LUSOL_assign(LUSOL, iA, jA, Aij, nnzero, TRUE)) {\n    fprintf(outunit, \"Error: LUSOL failed due to insufficient memory.\\n\");\n    goto x900;\n  }\n\n/* ------------------------------------------------------------------\n   Factor  A = L U.\n   ------------------------------------------------------------------ */\n  nelem = nnzero;\n  inform = LUSOL_factorize( LUSOL);\n  if(inform > LUSOL_INFORM_SERIOUS) {\n    fprintf(outunit, \"Error:\\n%s\\n\", LUSOL_informstr(LUSOL, inform));\n    goto x900;\n  }\n  if(n != m)\n    goto x800;\n\n  /* Get the largest element in A; we use it below as an estimate\n     of ||A||_inf, even though it isn't a proper norm. */\n  Amax = LUSOL->parmlu[LUSOL_RP_MAXELEM_A];\n\n/* ------------------------------------------------------------------\n   SOLVE  A x = b  or  x'A = b'.\n   Save b first because lu6sol() overwrites the rhs.\n   ------------------------------------------------------------------ */\n  MEMCOPY(x, b, lenb+BLAS_BASE);\n\nResolve:\n  if(ftran)\n    inform = LUSOL_ftran(LUSOL, x, NULL, FALSE);\n  else\n    inform = LUSOL_btran(LUSOL, x, NULL);\n  if(inform > LUSOL_INFORM_SERIOUS) {\n    fprintf(outunit, \"Error:\\n%s\\n\", LUSOL_informstr(LUSOL, inform));\n    goto x900;\n  }\n  if(printsolution)\n    blockWriteREAL(outunit, \"\\nSolution vector\", x, 1, lenb);\n\n/* ------------------------------------------------------------------\n   Set r = b - Ax.\n   Find norm of r and x.\n   ------------------------------------------------------------------ */\n  MEMCOPY(r, b, lenb+BLAS_BASE);\n  for(k = 1; k <= nnzero; k++) {\n    i    = iA[k];  /* Row number    */\n    j    = jA[k];  /* Column number */\n    if(ftran)\n      r[i] -= Aij[k]*x[j];\n    else\n      r[j] -= Aij[k]*x[i];\n  }\n/*  blockWriteREAL(outunit, \"\\nResidual vector\", r, 1, lenb);*/\n  bnorm  = dnormi( lenb, b );\n  rnorm  = dnormi( lenb, r );\n  xnorm  = dnormi( lenx, x );\n\n/* ------------------------------------------------------------------\n   Report the findings.\n   ------------------------------------------------------------------ */\n  if(randcol > 0)\n    fprintf(outunit, \"\\n\\nColumn %d was %s\\n\",\n                      randcol,\n                      (mod(replace,2) == 1 ? \"replaced with random data\" : \"restored\"));\n\nx800:\n  fprintf(outunit, \"\\nLU size statistics (%d reallocations):\\n\",\n                   LUSOL->expanded_a);\n  test = LUSOL->luparm[LUSOL_IP_NONZEROS_U0]+LUSOL->luparm[LUSOL_IP_NONZEROS_L0];\n  fprintf(outunit, \"L0-size = %d   U0-size = %d   LU-nonzeros = %d   Fill-in = %.1fx\\n\",\n                   LUSOL->luparm[LUSOL_IP_NONZEROS_L0],\n                   LUSOL->luparm[LUSOL_IP_NONZEROS_U0],\n                   (int) test, test/nnzero);\n  if(n != m) {\n    fprintf(outunit, \"%s with a factor tol. of %g identified %d singularities.\\n\",\n                     LUSOL_pivotLabel(LUSOL), LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij],\n                     LUSOL->luparm[LUSOL_IP_SINGULARITIES]);\n    goto x900;\n  }\n\n  test   = rnorm / (Amax*xnorm);\n  fprintf(outunit, \"\\nAccuracy statistics:\\n\");\n  fprintf(outunit, \"%s with a factor tol. of %g gave a rel.error of %g and %d singularities.\\n\",\n                   LUSOL_pivotLabel(LUSOL), LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij], test,\n                   LUSOL->luparm[LUSOL_IP_SINGULARITIES]);\n  fprintf(outunit, \"Amax = %g   bnorm = %g   rnorm = %g   xnorm = %g\\n\",\n                   Amax, bnorm, rnorm, xnorm);\n\n  fprintf(outunit, \"\\n\");\n\n  if (test <= 1.0e-8)\n    fprintf(outunit, \"The equations were solved with very high accuracy.\\n\");\n  else if (test <= 1.0e-6)\n    fprintf(outunit, \"The equations were solved with reasonably good accuracy.\\n\");\n  else {\n    if (test <= 1.0e-4)\n      fprintf(outunit, \"Questionable accuracy; the LU factors may not be good enough.\\n\");\n    else\n      fprintf(outunit, \"Poor accuracy; the LU factorization probably failed.\\n\");\n    if(LUSOL->luparm[LUSOL_IP_PIVOTTYPE] == LUSOL_PIVMOD_TRP)\n      fprintf(outunit, \"Try a smaller factor tolerance (current is %g).\\n\",\n                       LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij]);\n    else\n      fprintf(outunit, \"Try a smaller factor tolerance and/or TRP pivoting.\\n\");\n  }\n\n /* Check if we should replace a column and resolve */\n  if(replace > 0) {\n    replace--;\n    MEMCLEAR(x, lenb+BLAS_BASE);\n    if(mod(replace, 2) == 1) {\n      /* Randomly find a column and replace the column values with random data */\n      rnorm   = rand();\n      randcol = (int) (n * rnorm / (RAND_MAX+1.0)) + 1;\n      for(i = 1; i < m; i++)\n        x[i] = Amax * rand() / RAND_MAX;\n    }\n    else {\n      /* Put the previously replaced column back and resolve */\n      for (k = 1; k <= nnzero; k++) {\n        i    = iA[k];\n        j    = jA[k];\n        if(j == randcol)\n          x[i] = Aij[k];\n      }\n    }\n    inform = LUSOL_replaceColumn(LUSOL, randcol, x);\n    MEMCOPY(b, x, lenb+BLAS_BASE);\n    if(inform != LUSOL_INFORM_LUSUCCESS)\n      fprintf(outunit, \"Error:\\n%s\\n\", LUSOL_informstr(LUSOL, inform));\n    else\n      goto Resolve;\n  }\n\n\n/* Free memory */\nx900:\n  if(!success)\n    fprintf(outunit, \"Insufficient memory or data file not found.\\n\");\n\n  LUSOL_FREE(Aij);\n  LUSOL_FREE(b);\n  LUSOL_FREE(xexact);\n  LUSOL_FREE(iA);\n  LUSOL_FREE(jA);\n\n  LUSOL_FREE(rhs);\n  LUSOL_FREE(r);\n  LUSOL_FREE(x);\n\n#if 0\n  LUSOL_dump(NULL, LUSOL);\n -blas \"atlas_AXP_512_360.dll\" -b -p 1 \"STP3D_A.MTX\"\n \"C:\\Shared Files\\Visual Studio Projects\\LU\\MatrixMarket\\sherman5.mtx\" \"C:\\Shared Files\\Visual Studio Projects\\LU\\MatrixMarket\\sherman5_rhs1.mtx\"\n A6805.txt b6805.txt\n A10009.txt b10009.txt\n fidap005.mtx fidap005_rhs1.mtx\n fidapm05.mtx fidapm05_rhs1.mtx\n -b -p 1 \"basis.mtx\"\n -b -p 1 \"LU-test3.mtx\"\n#endif\n\n  LUSOL_free(LUSOL);\n\n/*     End of main program for Test of LUSOL */\n}\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/bfp/bfp_LUSOL/LUSOL/lusolmain.h",
    "content": "\n#ifdef StaticMemAlloc\n\n#if 0\n  #define MAXNZ        300000\n  #define MAXROWS       15000\n#elif 0\n  #define MAXNZ         60000\n  #define MAXROWS       12500\n#elif 1\n  #define MAXNZ         40000\n  #define MAXROWS        3500\n#else\n  #define MAXNZ          1000\n  #define MAXROWS          50\n#endif\n\n#else\n\n  #define MAXNZ          1000\n  #define MAXROWS          50\n\n#endif\n\n#define MAXCOLS     MAXROWS\n#define MAXLU      (LUSOL_MULT_nz_a*MAXNZ)\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/bfp/bfp_LUSOL/LUSOL/mmio.c",
    "content": "/* \n*   Matrix Market I/O library for ANSI C\n*\n*   See http://math.nist.gov/MatrixMarket for details.\n*\n*   (Version 1.01, 5/2003)\n*/\n\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <ctype.h>\n\n#include \"mmio.h\"\n\nint mm_read_unsymmetric_sparse(const char *fname, int *M_, int *N_, int *nz_,\n                double **val_, int **I_, int **J_)\n{\n    FILE *f;\n    MM_typecode matcode;\n    int M, N, nz;\n    int i;\n    double *val;\n    int *I, *J;\n \n    if ((f = fopen(fname, \"r\")) == NULL)\n            return -1;\n \n \n    if (mm_read_banner(f, &matcode) != 0)\n    {\n        printf(\"mm_read_unsymetric: Could not process Matrix Market banner \");\n        printf(\" in file [%s]\\n\", fname);\n        return -1;\n    }\n \n \n \n    if ( !(mm_is_real(matcode) && mm_is_matrix(matcode) &&\n            mm_is_sparse(matcode)))\n    {\n        fprintf(stderr, \"Sorry, this application does not support \");\n        fprintf(stderr, \"Market Market type: [%s]\\n\",\n                mm_typecode_to_str(matcode));\n        return -1;\n    }\n \n    /* find out size of sparse matrix: M, N, nz .... */\n \n    if (mm_read_mtx_crd_size(f, &M, &N, &nz) !=0)\n    {\n        fprintf(stderr, \"read_unsymmetric_sparse(): could not parse matrix size.\\n\");\n        return -1;\n    }\n \n    *M_ = M;\n    *N_ = N;\n    *nz_ = nz;\n \n    /* reseve memory for matrices */\n \n    I = (int *) malloc(nz * sizeof(int));\n    J = (int *) malloc(nz * sizeof(int));\n    val = (double *) malloc(nz * sizeof(double));\n \n    *val_ = val;\n    *I_ = I;\n    *J_ = J;\n \n    /* NOTE: when reading in doubles, ANSI C requires the use of the \"l\"  */\n    /*   specifier as in \"%lg\", \"%lf\", \"%le\", otherwise errors will occur */\n    /*  (ANSI C X3.159-1989, Sec. 4.9.6.2, p. 136 lines 13-15)            */\n \n    for (i=0; i<nz; i++)\n    {\n        fscanf(f, \"%d %d %lg\\n\", &I[i], &J[i], &val[i]);\n        I[i]--;  /* adjust from 1-based to 0-based */\n        J[i]--;\n    }\n    fclose(f);\n \n    return 0;\n}\n\nint mm_is_valid(MM_typecode matcode)\n{\n    if (!mm_is_matrix(matcode)) return 0;\n    if (mm_is_dense(matcode) && mm_is_pattern(matcode)) return 0;\n    if (mm_is_real(matcode) && mm_is_hermitian(matcode)) return 0;\n    if (mm_is_pattern(matcode) && (mm_is_hermitian(matcode) || \n                mm_is_skew(matcode))) return 0;\n    return 1;\n}\n\nint mm_read_banner(FILE *f, MM_typecode *matcode)\n{\n    char line[MM_MAX_LINE_LENGTH];\n    char banner[MM_MAX_TOKEN_LENGTH];\n    char mtx[MM_MAX_TOKEN_LENGTH]; \n    char crd[MM_MAX_TOKEN_LENGTH];\n    char data_type[MM_MAX_TOKEN_LENGTH];\n    char storage_scheme[MM_MAX_TOKEN_LENGTH];\n    char *p;\n\n\n    mm_clear_typecode(matcode);  \n\n    if (fgets(line, MM_MAX_LINE_LENGTH, f) == NULL) \n        return MM_PREMATURE_EOF;\n\n    if (sscanf(line, \"%s %s %s %s %s\", banner, mtx, crd, data_type, \n        storage_scheme) != 5)\n        return MM_PREMATURE_EOF;\n\n\t/* convert to lower case */\n    for (p=mtx; *p!='\\0'; *p= (char) tolower(*p),p++);  \n    for (p=crd; *p!='\\0'; *p= (char) tolower(*p),p++);  \n    for (p=data_type; *p!='\\0'; *p= (char) tolower(*p),p++);\n    for (p=storage_scheme; *p!='\\0'; *p= (char) tolower(*p),p++);\n\n    /* check for banner */\n    if (strncmp(banner, MatrixMarketBanner, strlen(MatrixMarketBanner)) != 0)\n        return MM_NO_HEADER;\n\n    /* first field should be \"mtx\" */\n    if (strcmp(mtx, MM_MTX_STR) != 0)\n        return  MM_UNSUPPORTED_TYPE;\n    mm_set_matrix(matcode);\n\n\n    /* second field describes whether this is a sparse matrix (in coordinate\n            storgae) or a dense array */\n\n\n    if (strcmp(crd, MM_SPARSE_STR) == 0)\n        mm_set_sparse(matcode);\n    else\n    if (strcmp(crd, MM_DENSE_STR) == 0)\n            mm_set_dense(matcode);\n    else\n        return MM_UNSUPPORTED_TYPE;\n    \n\n    /* third field */\n\n    if (strcmp(data_type, MM_REAL_STR) == 0)\n        mm_set_real(matcode);\n    else\n    if (strcmp(data_type, MM_COMPLEX_STR) == 0)\n        mm_set_complex(matcode);\n    else\n    if (strcmp(data_type, MM_PATTERN_STR) == 0)\n        mm_set_pattern(matcode);\n    else\n    if (strcmp(data_type, MM_INT_STR) == 0)\n        mm_set_integer(matcode);\n    else\n        return MM_UNSUPPORTED_TYPE;\n    \n\n    /* fourth field */\n\n    if (strcmp(storage_scheme, MM_GENERAL_STR) == 0)\n        mm_set_general(matcode);\n    else\n    if (strcmp(storage_scheme, MM_SYMM_STR) == 0)\n        mm_set_symmetric(matcode);\n    else\n    if (strcmp(storage_scheme, MM_HERM_STR) == 0)\n        mm_set_hermitian(matcode);\n    else\n    if (strcmp(storage_scheme, MM_SKEW_STR) == 0)\n        mm_set_skew(matcode);\n    else\n        return MM_UNSUPPORTED_TYPE;\n        \n\n    return 0;\n}\n\nint mm_write_mtx_crd_size(FILE *f, int M, int N, int nz)\n{\n    if (fprintf(f, \"%d %d %d\\n\", M, N, nz) < 0)\n        return MM_COULD_NOT_WRITE_FILE;\n    else \n        return 0;\n}\n\nint mm_read_mtx_crd_size(FILE *f, int *M, int *N, int *nz )\n{\n    char line[MM_MAX_LINE_LENGTH];\n    int num_items_read;\n\n    /* set return null parameter values, in case we exit with errors */\n    *M = *N = *nz = 0;\n\n    /* now continue scanning until you reach the end-of-comments */\n    do {\n      if (fgets(line,MM_MAX_LINE_LENGTH,f) == NULL) \n          return MM_PREMATURE_EOF;\n    } while (line[0] == '%');\n\n    /* line[] is either blank, har M,N or M,N,nz */\n    if (sscanf(line, \"%d %d %d\", M, N, nz) >= 2)\n      return 0;\n        \n    else\n    do { \n        num_items_read = fscanf(f, \"%d %d %d\", M, N, nz); \n        if (num_items_read == EOF) return MM_PREMATURE_EOF;\n    } while (num_items_read < 2);\n\n    return 0;\n}\n\n\nint mm_read_mtx_array_size(FILE *f, int *M, int *N)\n{\n    char line[MM_MAX_LINE_LENGTH];\n    int num_items_read;\n    /* set return null parameter values, in case we exit with errors */\n    *M = *N = 0;\n\t\n    /* now continue scanning until you reach the end-of-comments */\n    do \n    {\n        if (fgets(line,MM_MAX_LINE_LENGTH,f) == NULL) \n            return MM_PREMATURE_EOF;\n    }while (line[0] == '%');\n\n    /* line[] is either blank or has M,N, nz */\n    if (sscanf(line, \"%d %d\", M, N) == 2)\n        return 0;\n        \n    else /* we have a blank line */\n    do\n    { \n        num_items_read = fscanf(f, \"%d %d\", M, N); \n        if (num_items_read == EOF) return MM_PREMATURE_EOF;\n    }\n    while (num_items_read != 2);\n\n    return 0;\n}\n\nint mm_write_mtx_array_size(FILE *f, int M, int N)\n{\n    if (fprintf(f, \"%d %d\\n\", M, N) < 0)\n        return MM_COULD_NOT_WRITE_FILE;\n    else \n        return 0;\n}\n\n\n\n/*-------------------------------------------------------------------------*/\n\n/******************************************************************/\n/* use when I[], J[], and val[]J, and val[] are already allocated */\n/******************************************************************/\n\nint mm_read_mtx_crd_data(FILE *f, int M, int N, int nz, int I[], int J[],\n        double val[], MM_typecode matcode)\n{\n    int i;\n    if (mm_is_complex(matcode))\n    {\n        for (i=0; i<nz; i++)\n            if (fscanf(f, \"%d %d %lg %lg\", &I[i], &J[i], &val[2*i], &val[2*i+1])\n                != 4) return MM_PREMATURE_EOF;\n    }\n    else if (mm_is_real(matcode))\n    {\n        for (i=0; i<nz; i++)\n        {\n            if (fscanf(f, \"%d %d %lg\\n\", &I[i], &J[i], &val[i])\n                != 3) return MM_PREMATURE_EOF;\n\n        }\n    }\n\n    else if (mm_is_pattern(matcode))\n    {\n        for (i=0; i<nz; i++)\n            if (fscanf(f, \"%d %d\", &I[i], &J[i])\n                != 2) return MM_PREMATURE_EOF;\n    }\n    else\n        return MM_UNSUPPORTED_TYPE;\n\n    return 0;\n        \n}\n\nint mm_read_mtx_crd_entry(FILE *f, int *I, int *J,\n        double *real, double *imag, MM_typecode matcode)\n{\n    if (mm_is_complex(matcode))\n    {\n            if (fscanf(f, \"%d %d %lg %lg\", I, J, real, imag)\n                != 4) return MM_PREMATURE_EOF;\n    }\n    else if (mm_is_real(matcode))\n    {\n            if (fscanf(f, \"%d %d %lg\\n\", I, J, real)\n                != 3) return MM_PREMATURE_EOF;\n\n    }\n\n    else if (mm_is_pattern(matcode))\n    {\n            if (fscanf(f, \"%d %d\", I, J) != 2) return MM_PREMATURE_EOF;\n    }\n    else\n        return MM_UNSUPPORTED_TYPE;\n\n    return 0;\n        \n}\n\n\n/************************************************************************\n    mm_read_mtx_crd()  fills M, N, nz, array of values, and return\n                        type code, e.g. 'MCRS'\n\n                        if matrix is complex, values[] is of size 2*nz,\n                            (nz pairs of real/imaginary values)\n************************************************************************/\n\nint mm_read_mtx_crd(char *fname, int *M, int *N, int *nz, int **I, int **J, \n        double **val, MM_typecode *matcode)\n{\n    int ret_code;\n    FILE *f;\n\n    if (strcmp(fname, \"stdin\") == 0) f=stdin;\n    else\n    if ((f = fopen(fname, \"r\")) == NULL)\n        return MM_COULD_NOT_READ_FILE;\n\n\n    if ((ret_code = mm_read_banner(f, matcode)) != 0)\n        return ret_code;\n\n    if (!(mm_is_valid(*matcode) && mm_is_sparse(*matcode) && \n            mm_is_matrix(*matcode)))\n        return MM_UNSUPPORTED_TYPE;\n\n    if ((ret_code = mm_read_mtx_crd_size(f, M, N, nz)) != 0)\n        return ret_code;\n\n\n    *I = (int *)  malloc(*nz * sizeof(int));\n    *J = (int *)  malloc(*nz * sizeof(int));\n    *val = NULL;\n\n    if (mm_is_complex(*matcode))\n    {\n        *val = (double *) malloc(*nz * 2 * sizeof(double));\n        ret_code = mm_read_mtx_crd_data(f, *M, *N, *nz, *I, *J, *val, \n                *matcode);\n        if (ret_code != 0) return ret_code;\n    }\n    else if (mm_is_real(*matcode))\n    {\n        *val = (double *) malloc(*nz * sizeof(double));\n        ret_code = mm_read_mtx_crd_data(f, *M, *N, *nz, *I, *J, *val, \n                *matcode);\n        if (ret_code != 0) return ret_code;\n    }\n\n    else if (mm_is_pattern(*matcode))\n    {\n        ret_code = mm_read_mtx_crd_data(f, *M, *N, *nz, *I, *J, *val, \n                *matcode);\n        if (ret_code != 0) return ret_code;\n    }\n\n    if (f != stdin) fclose(f);\n    return 0;\n}\n\nint mm_write_banner(FILE *f, MM_typecode matcode)\n{\n    char *str = mm_typecode_to_str(matcode);\n    int ret_code;\n\n    ret_code = fprintf(f, \"%s %s\\n\", MatrixMarketBanner, str);\n/*    free(str);  This is a bug from the official distribution - KE fixed */\n    if (ret_code < 0 )\n        return MM_COULD_NOT_WRITE_FILE;\n    else\n        return 0;\n}\n\nint mm_write_mtx_crd(char fname[], int M, int N, int nz, int I[], int J[],\n        double val[], MM_typecode matcode)\n{\n    FILE *f;\n    int i;\n\n    if (strcmp(fname, \"stdout\") == 0) \n        f = stdout;\n    else\n    if ((f = fopen(fname, \"w\")) == NULL)\n        return MM_COULD_NOT_WRITE_FILE;\n    \n    /* print banner followed by typecode */\n    fprintf(f, \"%s \", MatrixMarketBanner);\n    fprintf(f, \"%s\\n\", mm_typecode_to_str(matcode));\n\n    /* print matrix sizes and nonzeros */\n    fprintf(f, \"%d %d %d\\n\", M, N, nz);\n\n    /* print values */\n    if (mm_is_pattern(matcode))\n        for (i=0; i<nz; i++)\n            fprintf(f, \"%d %d\\n\", I[i], J[i]);\n    else\n    if (mm_is_real(matcode))\n        for (i=0; i<nz; i++)\n            fprintf(f, \"%d %d %20.16g\\n\", I[i], J[i], val[i]);\n    else\n    if (mm_is_complex(matcode))\n        for (i=0; i<nz; i++)\n            fprintf(f, \"%d %d %20.16g %20.16g\\n\", I[i], J[i], val[2*i], \n                        val[2*i+1]);\n    else\n    {\n        if (f != stdout) fclose(f);\n        return MM_UNSUPPORTED_TYPE;\n    }\n\n    if (f !=stdout) fclose(f);\n\n    return 0;\n}\n    \n\nchar  *mm_typecode_to_str(MM_typecode matcode)\n{\n    static char buffer[MM_MAX_LINE_LENGTH];\n    char *types[4];\n\n    /* check for MTX type */\n    if (mm_is_matrix(matcode)) \n        types[0] = MM_MTX_STR;\n    else\n        return NULL;\n\n    /* check for CRD or ARR matrix */\n    if (mm_is_sparse(matcode))\n        types[1] = MM_SPARSE_STR;\n    else\n    if (mm_is_dense(matcode))\n        types[1] = MM_DENSE_STR;\n    else\n        return NULL;\n\n    /* check for element data type */\n    if (mm_is_real(matcode))\n        types[2] = MM_REAL_STR;\n    else\n    if (mm_is_complex(matcode))\n        types[2] = MM_COMPLEX_STR;\n    else\n    if (mm_is_pattern(matcode))\n        types[2] = MM_PATTERN_STR;\n    else\n    if (mm_is_integer(matcode))\n        types[2] = MM_INT_STR;\n    else\n        return NULL;\n\n\n    /* check for symmetry type */\n    if (mm_is_general(matcode))\n        types[3] = MM_GENERAL_STR;\n    else\n    if (mm_is_symmetric(matcode))\n        types[3] = MM_SYMM_STR;\n    else \n    if (mm_is_hermitian(matcode))\n        types[3] = MM_HERM_STR;\n    else \n    if (mm_is_skew(matcode))\n        types[3] = MM_SKEW_STR;\n    else\n        return NULL;\n\n    sprintf(buffer,\"%s %s %s %s\", types[0], types[1], types[2], types[3]);\n    return & buffer[0];\n\n}\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/bfp/bfp_LUSOL/LUSOL/mmio.h",
    "content": "/*\n*   Matrix Market I/O library for ANSI C\n*\n*   See http://math.nist.gov/MatrixMarket for details.\n*\n*\n*/\n\n#ifndef MM_IO_H\n#define MM_IO_H\n\n#define MM_MAX_LINE_LENGTH 1025\n#define MatrixMarketBanner \"%%MatrixMarket\"\n#define MM_MAX_TOKEN_LENGTH 64\n\ntypedef char MM_typecode[4];\n\nchar *mm_typecode_to_str(MM_typecode matcode);\n\nint mm_read_banner(FILE *f, MM_typecode *matcode);\nint mm_read_mtx_crd_size(FILE *f, int *M, int *N, int *nz);\nint mm_read_mtx_array_size(FILE *f, int *M, int *N);\n\nint mm_write_banner(FILE *f, MM_typecode matcode);\nint mm_write_mtx_crd_size(FILE *f, int M, int N, int nz);\nint mm_write_mtx_array_size(FILE *f, int M, int N);\n\n\n/********************* MM_typecode query fucntions ***************************/\n\n#define mm_is_matrix(typecode)  ((typecode)[0]=='M')\n\n#define mm_is_sparse(typecode)  ((typecode)[1]=='C')\n#define mm_is_coordinate(typecode)((typecode)[1]=='C')\n#define mm_is_dense(typecode) ((typecode)[1]=='A')\n#define mm_is_array(typecode) ((typecode)[1]=='A')\n\n#define mm_is_complex(typecode) ((typecode)[2]=='C')\n#define mm_is_real(typecode)    ((typecode)[2]=='R')\n#define mm_is_pattern(typecode) ((typecode)[2]=='P')\n#define mm_is_integer(typecode) ((typecode)[2]=='I')\n\n#define mm_is_symmetric(typecode)((typecode)[3]=='S')\n#define mm_is_general(typecode) ((typecode)[3]=='G')\n#define mm_is_skew(typecode)  ((typecode)[3]=='K')\n#define mm_is_hermitian(typecode)((typecode)[3]=='H')\n\nint mm_is_valid(MM_typecode matcode);   /* too complex for a macro */\n\n\n/********************* MM_typecode modify fucntions ***************************/\n\n#define mm_set_matrix(typecode) ((*typecode)[0]='M')\n#define mm_set_coordinate(typecode) ((*typecode)[1]='C')\n#define mm_set_array(typecode)  ((*typecode)[1]='A')\n#define mm_set_dense(typecode)  mm_set_array(typecode)\n#define mm_set_sparse(typecode) mm_set_coordinate(typecode)\n\n#define mm_set_complex(typecode)((*typecode)[2]='C')\n#define mm_set_real(typecode) ((*typecode)[2]='R')\n#define mm_set_pattern(typecode)((*typecode)[2]='P')\n#define mm_set_integer(typecode)((*typecode)[2]='I')\n\n\n#define mm_set_symmetric(typecode)((*typecode)[3]='S')\n#define mm_set_general(typecode)((*typecode)[3]='G')\n#define mm_set_skew(typecode) ((*typecode)[3]='K')\n#define mm_set_hermitian(typecode)((*typecode)[3]='H')\n\n#define mm_clear_typecode(typecode) ((*typecode)[0]=(*typecode)[1]= \\\n                  (*typecode)[2]=' ',(*typecode)[3]='G')\n\n#define mm_initialize_typecode(typecode) mm_clear_typecode(typecode)\n\n\n/********************* Matrix Market error codes ***************************/\n\n\n#define MM_COULD_NOT_READ_FILE  11\n#define MM_PREMATURE_EOF        12\n#define MM_NOT_MTX              13\n#define MM_NO_HEADER            14\n#define MM_UNSUPPORTED_TYPE     15\n#define MM_LINE_TOO_LONG        16\n#define MM_COULD_NOT_WRITE_FILE 17\n\n\n/******************** Matrix Market internal definitions ********************\n\n   MM_matrix_typecode: 4-character sequence\n\n            ojbect    sparse/     data        storage\n                  dense       type        scheme\n\n   string position:  [0]        [1]     [2]         [3]\n\n   Matrix typecode:  M(atrix)  C(oord)    R(eal)    G(eneral)\n                    A(array)  C(omplex)   H(ermitian)\n                      P(attern)   S(ymmetric)\n                        I(nteger) K(kew)\n\n ***********************************************************************/\n\n#define MM_MTX_STR    \"matrix\"\n#define MM_ARRAY_STR  \"array\"\n#define MM_DENSE_STR  \"array\"\n#define MM_COORDINATE_STR \"coordinate\"\n#define MM_SPARSE_STR \"coordinate\"\n#define MM_COMPLEX_STR  \"complex\"\n#define MM_REAL_STR   \"real\"\n#define MM_INT_STR    \"integer\"\n#define MM_GENERAL_STR  \"general\"\n#define MM_SYMM_STR   \"symmetric\"\n#define MM_HERM_STR   \"hermitian\"\n#define MM_SKEW_STR   \"skew-symmetric\"\n#define MM_PATTERN_STR  \"pattern\"\n\n\n/*  high level routines */\n\nint mm_write_mtx_crd(char fname[], int M, int N, int nz, int I[], int J[],\n     double val[], MM_typecode matcode);\nint mm_read_mtx_crd_data(FILE *f, int M, int N, int nz, int I[], int J[],\n    double val[], MM_typecode matcode);\nint mm_read_mtx_crd_entry(FILE *f, int *I, int *J, double *real, double *img,\n      MM_typecode matcode);\n\nint mm_read_unsymmetric_sparse(const char *fname, int *M_, int *N_, int *nz_,\n                double **val_, int **I_, int **J_);\n\n\n\n#endif\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/bfp/bfp_LUSOL/LUSOL/myblas.c",
    "content": "\n#include <stdlib.h>\n#include <stdio.h>\n/*#include <memory.h>*/\n#include <string.h>\n#include <math.h>\n#include \"myblas.h\"\n\n#ifdef FORTIFY\n# include \"lp_fortify.h\"\n#endif\n\n/* ************************************************************************ */\n/* Initialize BLAS interfacing routines                                     */\n/* ************************************************************************ */\nMYBOOL mustinitBLAS = TRUE;\n#if (defined WIN32) || (defined WIN64)\n  HINSTANCE hBLAS = NULL;\n#else\n  void     *hBLAS = NULL;\n#endif\n\n\n/* ************************************************************************ */\n/* Function pointers for external BLAS library (C base 0)                   */\n/* ************************************************************************ */\nBLAS_dscal_func  *BLAS_dscal;\nBLAS_dcopy_func  *BLAS_dcopy;\nBLAS_daxpy_func  *BLAS_daxpy;\nBLAS_dswap_func  *BLAS_dswap;\nBLAS_ddot_func   *BLAS_ddot;\nBLAS_idamax_func *BLAS_idamax;\nBLAS_idamin_func *BLAS_idamin;\nBLAS_dload_func  *BLAS_dload;\nBLAS_dnormi_func *BLAS_dnormi;\n\n\n/* ************************************************************************ */\n/* Define the BLAS interfacing routines                                     */\n/* ************************************************************************ */\n\nvoid init_BLAS(void)\n{\n  if(mustinitBLAS) {\n    load_BLAS(NULL);\n    mustinitBLAS = FALSE;\n  }\n}\n\nMYBOOL is_nativeBLAS(void)\n{\n#ifdef LoadableBlasLib\n  return( (MYBOOL) (hBLAS == NULL) );\n#else\n  return( TRUE );\n#endif\n}\n\nMYBOOL load_BLAS(char *libname)\n{\n  MYBOOL result = TRUE;\n\n#ifdef LoadableBlasLib\n  if(hBLAS != NULL) {\n    my_FreeLibrary(hBLAS);\n  }\n#endif\n\n  if(libname == NULL) {\n    if(!mustinitBLAS && is_nativeBLAS())\n      return( FALSE );\n    BLAS_dscal = my_dscal;\n    BLAS_dcopy = my_dcopy;\n    BLAS_daxpy = my_daxpy;\n    BLAS_dswap = my_dswap;\n    BLAS_ddot  = my_ddot;\n    BLAS_idamax = my_idamax;\n    BLAS_idamin = my_idamin;\n    BLAS_dload = my_dload;\n    BLAS_dnormi = my_dnormi;\n    if(mustinitBLAS)\n      mustinitBLAS = FALSE;\n  }\n  else {\n#ifdef LoadableBlasLib\n  #if (defined WIN32) || (defined WIN64)\n    char *blasname = libname;\n  #else\n   /* First standardize UNIX .SO library name format. */\n    char blasname[260];\n    if(!so_stdname(blasname, libname, 260))\n      return( FALSE );\n  #endif\n   /* Get a handle to the Windows DLL module. */\n    hBLAS = my_LoadLibrary(blasname);\n\n   /* If the handle is valid, try to get the function addresses. */\n    result = (MYBOOL) (hBLAS != NULL);\n    if(result) {\n      BLAS_dscal  = (BLAS_dscal_func *)  my_GetProcAddress(hBLAS, BLAS_prec \"scal\");\n      BLAS_dcopy  = (BLAS_dcopy_func *)  my_GetProcAddress(hBLAS, BLAS_prec \"copy\");\n      BLAS_daxpy  = (BLAS_daxpy_func *)  my_GetProcAddress(hBLAS, BLAS_prec \"axpy\");\n      BLAS_dswap  = (BLAS_dswap_func *)  my_GetProcAddress(hBLAS, BLAS_prec \"swap\");\n      BLAS_ddot   = (BLAS_ddot_func *)   my_GetProcAddress(hBLAS, BLAS_prec \"dot\");\n      BLAS_idamax = (BLAS_idamax_func *) my_GetProcAddress(hBLAS, \"i\" BLAS_prec \"amax\");\n      BLAS_idamin = (BLAS_idamin_func *) my_GetProcAddress(hBLAS, \"i\" BLAS_prec \"amin\");\n#if 0      \n      BLAS_dload  = (BLAS_dload_func *)  my_GetProcAddress(hBLAS, BLAS_prec \"load\");\n      BLAS_dnormi = (BLAS_dnormi_func *) my_GetProcAddress(hBLAS, BLAS_prec \"normi\");\n#endif      \n    }\n#endif\n    /* Do validation */\n    if(!result ||\n       ((BLAS_dscal  == NULL) ||\n        (BLAS_dcopy  == NULL) ||\n        (BLAS_daxpy  == NULL) ||\n        (BLAS_dswap  == NULL) ||\n        (BLAS_ddot   == NULL) ||\n        (BLAS_idamax == NULL) ||\n        (BLAS_idamin == NULL) ||\n        (BLAS_dload  == NULL) ||\n        (BLAS_dnormi == NULL))\n      ) {\n      load_BLAS(NULL);\n      result = FALSE;\n    }\n  }\n  return( result );\n}\nMYBOOL unload_BLAS(void)\n{\n  return( load_BLAS(NULL) );\n}\n\n\n/* ************************************************************************ */\n/* Now define the unoptimized local BLAS functions                          */\n/* ************************************************************************ */\nvoid daxpy( int n, REAL da, REAL *dx, int incx, REAL *dy, int incy)\n{\n  dx++;\n  dy++;\n  BLAS_daxpy( &n, &da, dx, &incx, dy, &incy);\n}\nvoid BLAS_CALLMODEL my_daxpy( int *_n, REAL *_da, REAL *dx, int *_incx, REAL *dy, int *_incy)\n{\n\n/* constant times a vector plus a vector.\n   uses unrolled loops for increments equal to one.\n   jack dongarra, linpack, 3/11/78.\n   modified 12/3/93, array[1] declarations changed to array[*] */\n\n  int      i, ix, iy; \n#ifndef DOFASTMATH\n  int      m, mp1;\n#endif\n  register REAL rda;\n  REAL     da = *_da;\n  int      n = *_n, incx = *_incx, incy = *_incy;\n\n  if (n <= 0) return;\n  if (da == 0.0) return;\n\n  dx--;\n  dy--;\n  ix = 1;\n  iy = 1;\n  if (incx < 0)\n     ix = (-n+1)*incx + 1;\n  if (incy < 0)\n     iy = (-n+1)*incy + 1;\n  rda = da;\n\n/* CPU intensive loop; option to do pointer arithmetic */\n#if defined DOFASTMATH\n  {\n    REAL *xptr, *yptr;\n    for (i = 1, xptr = dx + ix, yptr = dy + iy;\n         i <= n; i++, xptr += incx, yptr += incy)\n      (*yptr) += rda*(*xptr);\n  }\n#else\n\n  if (incx==1 && incy==1) goto x20;\n\n/* code for unequal increments or equal increments not equal to 1 */\n  for (i = 1; i<=n; i++) {\n     dy[iy]+= rda*dx[ix];\n     ix+= incx;\n     iy+= incy;\n  }\n  return;\n\n/*  code for both increments equal to 1 */\n\n/*  clean-up loop */\nx20:\n  m = n % 4;\n  if (m == 0) goto x40;\n  for (i = 1; i<=m; i++)\n     dy[i]+= rda*dx[i];\n  if(n < 4) return;\nx40:\n  mp1 = m + 1;\n  for (i = mp1; i<=n; i=i+4) {\n    dy[i]+= rda*dx[i];\n    dy[i + 1]+= rda*dx[i + 1];\n    dy[i + 2]+= rda*dx[i + 2];\n    dy[i + 3]+= rda*dx[i + 3];\n  }\n#endif  \n}\n\n\n/* ************************************************************************ */\nvoid dcopy( int n, REAL *dx, int incx, REAL *dy, int incy)\n{\n  dx++;\n  dy++;\n  BLAS_dcopy( &n, dx, &incx, dy, &incy);\n}\n\nvoid BLAS_CALLMODEL my_dcopy (int *_n, REAL *dx, int *_incx, REAL *dy, int *_incy)\n{\n\n/* copies a vector, x, to a vector, y.\n   uses unrolled loops for increments equal to one.\n   jack dongarra, linpack, 3/11/78.\n   modified 12/3/93, array[1] declarations changed to array[*] */\n\n  int      i, ix, iy;\n#ifndef DOFASTMATH\n  int      m, mp1;\n#endif\n  int      n = *_n, incx = *_incx, incy = *_incy;\n\n  if(n<=0) \n    return;\n\n  dx--;\n  dy--;\n  ix = 1;\n  iy = 1;\n  if(incx<0)\n    ix = (-n+1)*incx + 1;\n  if(incy<0)\n    iy = (-n+1)*incy + 1;\n\n\n/* CPU intensive loop; option to do pointer arithmetic */\n#if defined DOFASTMATH\n  {\n    REAL *xptr, *yptr;\n    for (i = 1, xptr = dx + ix, yptr = dy + iy;\n         i <= n; i++, xptr += incx, yptr += incy)\n      (*yptr) = (*xptr);\n  }\n#else\n\n  if(incx==1 && incy==1) \n    goto x20;\n\n/* code for unequal increments or equal increments not equal to 1 */\n\n  for(i = 1; i<=n; i++) {\n    dy[iy] = dx[ix];\n    ix+= incx;\n    iy+= incy;\n  }\n  return;\n\n/* code for both increments equal to 1 */\n\n/* version with fast machine copy logic (requires memory.h or string.h) */\nx20:\n  m = n % 7;\n  if (m == 0) goto x40;\n  for (i = 1; i<=m; i++)\n     dy[i] = dx[i];\n  if (n < 7) return;\n\nx40:\n  mp1 = m + 1;\n  for (i = mp1; i<=n; i=i+7) {\n     dy[i] = dx[i];\n     dy[i + 1] = dx[i + 1];\n     dy[i + 2] = dx[i + 2];\n     dy[i + 3] = dx[i + 3];\n     dy[i + 4] = dx[i + 4];\n     dy[i + 5] = dx[i + 5];\n     dy[i + 6] = dx[i + 6];\n  }\n#endif\n}\n\n\n/* ************************************************************************ */\n\nvoid dscal (int n, REAL da, REAL *dx, int incx)\n{\n  dx++;\n  BLAS_dscal (&n, &da, dx, &incx);\n}\n\nvoid BLAS_CALLMODEL my_dscal (int *_n, REAL *_da, REAL *dx, int *_incx)\n{\n\n/* Multiply a vector by a constant.\n\n     --Input--\n        N  number of elements in input vector(s)\n       DA  double precision scale factor\n       DX  double precision vector with N elements\n     INCX  storage spacing between elements of DX\n\n     --Output--\n       DX  double precision result (unchanged if N.LE.0)\n\n     Replace double precision DX by double precision DA*DX.\n     For I = 0 to N-1, replace DX(IX+I*INCX) with  DA * DX(IX+I*INCX),\n     where IX = 1 if INCX .GE. 0, else IX = 1+(1-N)*INCX. */\n\n  int      i;\n#ifndef DOFASTMATH\n  int      m, mp1, ix;\n#endif\n  register REAL rda;\n  REAL      da = *_da;\n  int      n = *_n, incx = *_incx;\n\n  if (n <= 0)\n    return;\n  rda = da;  \n  \n  dx--;\n\n/* Optionally do fast pointer arithmetic */\n#if defined DOFASTMATH\n  {\n    REAL *xptr;\n    for (i = 1, xptr = dx + 1; i <= n; i++, xptr += incx)\n      (*xptr) *= rda;\n  }\n#else\n\n  if (incx == 1)\n    goto x20;\n\n/* Code for increment not equal to 1 */\n  ix = 1;\n  if (incx < 0)\n    ix = (-n+1)*incx + 1;\n  for(i = 1; i <= n; i++, ix += incx)\n    dx[ix] *= rda;\n  return;\n\n/* Code for increment equal to 1. */\n/* Clean-up loop so remaining vector length is a multiple of 5. */\nx20:\n  m = n % 5;\n  if (m == 0) goto x40;\n  for( i = 1; i <= m; i++)\n    dx[i] *= rda;\n  if (n < 5)\n    return;\nx40:\n  mp1 = m + 1;\n  for(i = mp1; i <= n; i += 5) {\n    dx[i]   *= rda;\n    dx[i+1] *= rda;\n    dx[i+2] *= rda;\n    dx[i+3] *= rda;\n    dx[i+4] *= rda;\n  }\n#endif\n}\n\n\n/* ************************************************************************ */\n\nREAL ddot(int n, REAL *dx, int incx, REAL *dy, int incy)\n{\n  dx++;\n  dy++;\n  return( BLAS_ddot (&n, dx, &incx, dy, &incy) );\n}\n\nREAL BLAS_CALLMODEL my_ddot(int *_n, REAL *dx, int *_incx, REAL *dy, int *_incy)\n{\n\n/* forms the dot product of two vectors.\n   uses unrolled loops for increments equal to one.\n   jack dongarra, linpack, 3/11/78.\n   modified 12/3/93, array[1] declarations changed to array[*] */\n\n  register REAL dtemp;\n  int      i, ix, iy;\n#ifndef DOFASTMATH\n  int      m, mp1;\n#endif\n  int      n = *_n, incx = *_incx, incy = *_incy;\n\n  dtemp = 0.0;\n  if (n<=0)\n    return( (REAL) dtemp);\n\n  dx--;\n  dy--;\n  ix = 1;\n  iy = 1;\n  if (incx<0)\n     ix = (-n+1)*incx + 1;\n  if (incy<0)\n     iy = (-n+1)*incy + 1;\n\n/* CPU intensive loop; option to do pointer arithmetic */\n\n#if defined DOFASTMATH\n  {\n    REAL *xptr, *yptr;\n    for (i = 1, xptr = dx + ix, yptr = dy + iy;\n         i <= n; i++, xptr += incx, yptr += incy)\n      dtemp+= (*yptr)*(*xptr);\n  }\n#else\n\n  if (incx==1 && incy==1) goto x20;\n\n/* code for unequal increments or equal increments not equal to 1 */\n\n  for (i = 1; i<=n; i++) {\n     dtemp+= dx[ix]*dy[iy];\n     ix+= incx;\n     iy+= incy;\n  }\n  return(dtemp);\n\n/* code for both increments equal to 1 */\n\n/* clean-up loop */\n\nx20:\n  m = n % 5;\n  if (m == 0) goto x40;\n  for (i = 1; i<=m; i++)\n     dtemp+= dx[i]*dy[i];\n  if (n < 5) goto x60;\n\nx40:\n  mp1 = m + 1;\n  for (i = mp1; i<=n; i=i+5)\n     dtemp+= dx[i]*dy[i] + dx[i + 1]*dy[i + 1] +\n             dx[i + 2]*dy[i + 2] + dx[i + 3]*dy[i + 3] + dx[i + 4]*dy[i + 4];\n\nx60:\n#endif\n  return(dtemp);\n}\n\n\n/* ************************************************************************ */\n\nvoid dswap( int n, REAL *dx, int incx, REAL *dy, int incy )\n{\n  dx++;\n  dy++;\n  BLAS_dswap( &n, dx, &incx, dy, &incy );\n}\n\nvoid BLAS_CALLMODEL my_dswap( int *_n, REAL *dx, int *_incx, REAL *dy, int *_incy )\n{\n  int   i, ix, iy;\n#ifndef DOFASTMATH\n  int   m, mp1, ns;\n  REAL  dtemp2, dtemp3;\n#endif\n  register REAL  dtemp1;\n  int   n = *_n, incx = *_incx, incy = *_incy;\n\n  if (n <= 0) return;\n\n  dx--;\n  dy--;\n  ix = 1;\n  iy = 1;\n  if (incx < 0)\n    ix = (-n+1)*incx + 1;\n  if (incy < 0)\n    iy = (-n+1)*incy + 1;\n\n/* CPU intensive loop; option to do pointer arithmetic */\n#if defined DOFASTMATH\n  {\n    REAL *xptr, *yptr;\n    for (i = 1, xptr = dx + ix, yptr = dy + iy;\n         i <= n; i++, xptr += incx, yptr += incy) {\n      dtemp1 = (*xptr);\n     (*xptr) = (*yptr);\n     (*yptr) = dtemp1;\n    }\n  }\n#else\n\n  if (incx == incy) {\n    if (incx <= 0) goto x5;\n    if (incx == 1) goto x20;\n    goto x60;\n  }\n\n/* code for unequal or nonpositive increments. */\nx5:\n  for (i = 1; i<=n; i++) {\n     dtemp1 = dx[ix];\n     dx[ix] = dy[iy];\n     dy[iy] = dtemp1;\n     ix+= incx;\n     iy+= incy;\n  }\n  return;\n\n/* code for both increments equal to 1.\n   clean-up loop so remaining vector length is a multiple of 3. */\nx20:\n  m = n % 3;\n  if (m == 0) goto x40;\n  for (i = 1; i<=m; i++) {\n     dtemp1 = dx[i];\n     dx[i] = dy[i];\n     dy[i] = dtemp1;\n  }\n  if (n < 3) return;\n\nx40:\n  mp1 = m + 1;\n  for (i = mp1; i<=n; i=i+3) {\n     dtemp1 = dx[i];\n     dtemp2 = dx[i+1];\n     dtemp3 = dx[i+2];\n     dx[i] = dy[i];\n     dx[i+1] = dy[i+1];\n     dx[i+2] = dy[i+2];\n     dy[i] = dtemp1;\n     dy[i+1] = dtemp2;\n     dy[i+2] = dtemp3;\n  }\n  return;\n\n/* code for equal, positive, non-unit increments. */\nx60:\n  ns = n*incx;\n  for (i = 1; i<=ns; i=i+incx) {\n     dtemp1 = dx[i];\n     dx[i] = dy[i];\n     dy[i] = dtemp1;\n  }\n#endif\n\n}\n\n\n/* ************************************************************************ */\n\nvoid dload(int n, REAL da, REAL *dx, int incx)\n{\n  dx++;\n  BLAS_dload (&n, &da, dx, &incx);\n}\n\nvoid BLAS_CALLMODEL my_dload (int *_n, REAL *_da, REAL *dx, int *_incx)\n{\n/* copies a scalar, a, to a vector, x.\n   uses unrolled loops when incx equals one.\n\n   To change the precision of this program, run the change\n   program on dload.f\n   Alternatively, to make a single precision version append a\n   comment character to the start of all lines between sequential\n      precision > double\n   and\n      end precision > double\n   comments and delete the comment character at the start of all\n   lines between sequential\n      precision > single\n   and\n      end precision > single\n   comments.  To make a double precision version interchange\n    the append and delete operations in these instructions. */\n\n  int    i, ix, m, mp1;\n  REAL   da = *_da;\n  int    n = *_n, incx = *_incx;\n\n  if (n<=0) return;\n  dx--;\n  if (incx==1) goto x20;\n\n/* code for incx not equal to 1 */\n\n  ix = 1;\n  if (incx<0)\n     ix = (-n+1)*incx + 1;\n  for (i = 1; i<=n; i++) {\n     dx[ix] = da;\n     ix+= incx;\n  }\n  return;\n\n/* code for incx equal to 1 and clean-up loop */\n\nx20:\n  m = n % 7;\n  if (m == 0) goto x40;\n  for (i = 1; i<=m; i++)\n     dx[i] = da;\n  if (n < 7) return;\n\nx40:\n  mp1 = m + 1;\n  for (i = mp1; i<=n; i=i+7) {\n     dx[i] = da;\n     dx[i + 1] = da;\n     dx[i + 2] = da;\n     dx[i + 3] = da;\n     dx[i + 4] = da;\n     dx[i + 5] = da;\n     dx[i + 6] = da;\n  }\n}\n\n/* ************************************************************************ */\nint idamax( int n, REAL *x, int is )\n{\n  x++;\n  return ( BLAS_idamax( &n, x, &is ) );\n}\n\nint idamin( int n, REAL *x, int is )\n{\n  x++;\n  return ( BLAS_idamin( &n, x, &is ) );\n}\n\nint BLAS_CALLMODEL my_idamax( int *_n, REAL *x, int *_is )\n{\n  register REAL xmax, xtest;\n  int    i, imax = 0;\n#if !defined DOFASTMATH\n  int    ii;\n#endif\n  int    n = *_n, is = *_is;\n\n  if((n < 1) || (is <= 0))\n    return(imax);\n  imax = 1;\n  if(n == 1)\n    return(imax);\n\n#if defined DOFASTMATH\n  xmax = fabs(*x);\n  for (i = 2, x += is; i <= n; i++, x += is) {\n    xtest = fabs(*x);\n    if(xtest > xmax) {\n      xmax = xtest;\n      imax = i;\n    }\n  }\n#else\n  x--;\n  ii = 1;\n  xmax = fabs(x[ii]);\n  for(i = 2, ii+ = is; i <= n; i++, ii+ = is) {\n    xtest = fabs(x[ii]);\n    if(xtest > xmax) {\n      xmax = xtest;\n      imax = i;\n    }\n  }\n#endif  \n  return(imax);\n}\n\nint BLAS_CALLMODEL my_idamin( int *_n, REAL *x, int *_is )\n{\n  register REAL xmin, xtest;\n  int    i, imin = 0;\n#if !defined DOFASTMATH\n  int    ii;\n#endif\n  int    n = *_n, is = *_is;\n\n  if((n < 1) || (is <= 0))\n    return(imin);\n  imin = 1;\n  if(n == 1)\n    return(imin);\n\n#if defined DOFASTMATH\n  xmin = fabs(*x);\n  for (i = 2, x += is; i <= n; i++, x += is) {\n    xtest = fabs(*x);\n    if(xtest < xmin) {\n      xmin = xtest;\n      imin = i;\n    }\n  }\n#else\n  x--;\n  ii = 1;\n  xmin = fabs(x[ii]);\n  for(i = 2, ii+ = is; i <= n; i++, ii+ = is) {\n    xtest = fabs(x[ii]);\n    if(xtest < xmin) {\n      xmin = xtest;\n      imin = i;\n    }\n  }\n#endif  \n  return(imin);\n}\n\n/* ************************************************************************ */\nREAL dnormi( int n, REAL *x )\n{\n  x++;\n  return( BLAS_dnormi( &n, x ) );\n}\n\nREAL BLAS_CALLMODEL my_dnormi( int *_n, REAL *x )\n{\n/* ===============================================================\n   dnormi  returns the infinity-norm of the vector x.\n   =============================================================== */\n   int      j;\n   register REAL hold, absval;\n   int      n = *_n;\n\n   x--;\n   hold = 0.0;\n/*   for(j = 1; j <= n; j++) */\n   for(j = n; j > 0; j--) {\n     absval = fabs(x[j]);\n     hold = MAX( hold, absval );\n   }\n\n   return( hold );\n}\n\n\n/* ************************************************************************ */\n/* Subvector and submatrix access routines (Fortran compatibility)          */\n/* ************************************************************************ */\n\n#ifndef UseMacroVector\nint  subvec( int item)\n{\n  return( item-1 );\n}\n#endif\n\nint submat( int nrowb, int row, int col)\n{\n  return( nrowb*(col-1) + subvec(row) );\n}\n\nint posmat( int nrowb, int row, int col)\n{\n  return( submat(nrowb, row, col)+BLAS_BASE );\n}\n\n/* ************************************************************************ */\n/* Randomization functions                                                  */\n/* ************************************************************************ */\n\nvoid randomseed(int seeds[])\n/* Simply create some default seed values */\n{\n  seeds[1] = 123456;\n  seeds[2] = 234567;\n  seeds[3] = 345678;\n}\n\nvoid randomdens( int n, REAL *x, REAL r1, REAL r2, REAL densty, int *seeds )\n{\n/* ------------------------------------------------------------------\n   random  generates a vector x[*] of random numbers\n   in the range (r1, r2) with (approximate) specified density.\n   seeds[*] must be initialized before the first call.\n   ------------------------------------------------------------------ */\n\n  int   i;\n  REAL  *y;\n\n  y = (REAL *) malloc(sizeof(*y) * (n+1));\n  ddrand( n, x, 1, seeds );\n  ddrand( n, y, 1, seeds );\n\n  for (i = 1; i<=n; i++) {\n     if (y[i] < densty)\n        x[i] = r1  +  (r2 - r1) * x[i];\n     else\n        x[i] = 0.0;\n  }\n  free(y);\n}\n\n\n/* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */\n\nvoid ddrand( int n, REAL *x, int incx, int *seeds )\n{\n\n/* ------------------------------------------------------------------\n   ddrand fills a vector x with uniformly distributed random numbers\n   in the interval (0, 1) using a method due to  Wichman and Hill.\n\n   seeds[1..3] should be set to integer values\n   between 1 and 30000 before the first entry.\n\n   Integer arithmetic up to 30323 is required.\n\n   Blatantly copied from Wichman and Hill 19-January-1987.\n   14-Feb-94. Original version.\n   30 Jun 1999. seeds stored in an array.\n   30 Jun 1999. This version of ddrand.\n   ------------------------------------------------------------------ */\n\n  int    ix, xix;\n\n  if (n < 1) return;\n\n  for (ix = 1; ix<=1+(n-1)*incx; ix=ix+incx) {\n     seeds[1]     = 171*(seeds[1] % 177) -  2*(seeds[1]/177);\n     seeds[2]     = 172*(seeds[2] % 176) - 35*(seeds[2]/176);\n     seeds[3]     = 170*(seeds[3] % 178) - 63*(seeds[3]/178);\n\n     if (seeds[1] < 0) seeds[1] = seeds[1] + 30269;\n     if (seeds[2] < 0) seeds[2] = seeds[2] + 30307;\n     if (seeds[3] < 0) seeds[3] = seeds[3] + 30323;\n\n\t x[ix]  = ((REAL) seeds[1])/30269.0 +\n              ((REAL) seeds[2])/30307.0 +\n              ((REAL) seeds[3])/30323.0;\n     xix    = (int) x[ix];\n\t x[ix]  = fabs(x[ix] - xix);\n   }\n\n}\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/bfp/bfp_LUSOL/LUSOL/myblas.h",
    "content": "#ifndef HEADER_myblas\n#define HEADER_myblas\n\n/* ************************************************************************ */\n/* BLAS function interface with local and external loadable versions        */\n/* Author:  Kjell Eikland                                                   */\n/* Version: Initial version spring 2004                                     */\n/* Licence: LGPL                                                            */\n/* ************************************************************************ */\n/* Changes: 19 September 2004   Moved function pointer variable             */\n/*                              declarations from myblas.h to myblas.c      */\n/*                              to avoid linker problems with the Mac.      */\n/*          20 April 2005       Modified all double types to REAL to self-  */\n/*                              adjust to global settings.  Note that BLAS  */\n/*                              as of now does not have double double.      */\n/*          15 December 2005    Added idamin()                              */\n/* ************************************************************************ */\n\n#define BLAS_BASE         1\n#define UseMacroVector\n#define LoadableBlasLib\n\n\n/* ************************************************************************ */\n/* Include necessary libraries                                              */\n/* ************************************************************************ */\n#include \"commonlib.h\"\n#ifdef LoadableBlasLib\n  #if (defined WIN32) || (defined WIN64)\n    #include <windows.h>\n  #else\n    #include <dlfcn.h>\n  #endif\n#endif\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n/* ************************************************************************ */\n/* BLAS functions                                                           */\n/* ************************************************************************ */\n\n#ifndef BLAS_CALLMODEL\n  #if (defined WIN32) || (defined WIN64)\n    #define BLAS_CALLMODEL _cdecl\n  #else\n    #define BLAS_CALLMODEL\n  #endif\n#endif\n\ntypedef void   (BLAS_CALLMODEL BLAS_dscal_func) (int *n, REAL *da, REAL *dx, int *incx);\ntypedef void   (BLAS_CALLMODEL BLAS_dcopy_func) (int *n, REAL *dx, int *incx,  REAL *dy, int *incy);\ntypedef void   (BLAS_CALLMODEL BLAS_daxpy_func) (int *n, REAL *da, REAL *dx, int *incx,  REAL *dy, int *incy);\ntypedef void   (BLAS_CALLMODEL BLAS_dswap_func) (int *n, REAL *dx, int *incx,  REAL *dy, int *incy);\ntypedef double (BLAS_CALLMODEL BLAS_ddot_func)  (int *n, REAL *dx, int *incx,  REAL *dy, int *incy);\ntypedef int    (BLAS_CALLMODEL BLAS_idamax_func)(int *n, REAL *x,  int *is);\ntypedef int    (BLAS_CALLMODEL BLAS_idamin_func)(int *n, REAL *x,  int *is);\ntypedef void   (BLAS_CALLMODEL BLAS_dload_func) (int *n, REAL *da, REAL *dx, int *incx);\ntypedef double (BLAS_CALLMODEL BLAS_dnormi_func)(int *n, REAL *x);\n\n#ifndef __WINAPI\n  #if (defined WIN32) || (defined WIN64)\n    #define __WINAPI WINAPI\n  #else\n    #define __WINAPI\n  #endif\n#endif\n\nvoid init_BLAS(void);\nMYBOOL is_nativeBLAS(void);\nMYBOOL load_BLAS(char *libname);\nMYBOOL unload_BLAS(void);\n\n/* ************************************************************************ */\n/* User-callable BLAS definitions (C base 1)                                */\n/* ************************************************************************ */\nvoid dscal ( int n, REAL da,  REAL *dx, int incx );\nvoid dcopy ( int n, REAL *dx, int incx, REAL *dy, int incy );\nvoid daxpy ( int n, REAL da,  REAL *dx, int incx,   REAL *dy, int incy );\nvoid dswap ( int n, REAL *dx, int incx, REAL *dy, int incy );\nREAL ddot  ( int n, REAL *dx, int incx, REAL *dy, int incy );\nint  idamax( int n, REAL *x,  int is );\nint  idamin( int n, REAL *x,  int is );\nvoid dload ( int n, REAL da,  REAL *dx, int incx );\nREAL dnormi( int n, REAL *x );\n\n\n/* ************************************************************************ */\n/* Locally implemented BLAS functions (C base 0)                            */\n/* ************************************************************************ */\nvoid BLAS_CALLMODEL my_dscal ( int *n, REAL *da, REAL *dx,  int *incx );\nvoid BLAS_CALLMODEL my_dcopy ( int *n, REAL *dx, int *incx, REAL *dy, int *incy );\nvoid BLAS_CALLMODEL my_daxpy ( int *n, REAL *da, REAL *dx,  int *incx,  REAL *dy, int *incy );\nvoid BLAS_CALLMODEL my_dswap ( int *n, REAL *dx, int *incx, REAL *dy, int *incy );\nREAL BLAS_CALLMODEL my_ddot  ( int *n, REAL *dx, int *incx,  REAL *dy, int *incy );\nint  BLAS_CALLMODEL my_idamax( int *n, REAL *x,  int *is );\nint  BLAS_CALLMODEL my_idamin( int *n, REAL *x,  int *is );\nvoid BLAS_CALLMODEL my_dload ( int *n, REAL *da, REAL *dx, int *incx );\nREAL BLAS_CALLMODEL my_dnormi( int *n, REAL *x );\n\n\n/* ************************************************************************ */\n/* Subvector and submatrix access routines (Fortran compatibility)          */\n/* ************************************************************************ */\n#ifdef UseMacroVector\n  #define subvec(item) (item - 1)\n#else\n  int subvec( int item );\n#endif\n\nint submat( int nrowb, int row, int col );\nint posmat( int nrowb, int row, int col );\n\n\n/* ************************************************************************ */\n/* Randomization functions                                                  */\n/* ************************************************************************ */\nvoid randomseed(int *seeds);\nvoid randomdens( int n, REAL *x, REAL r1, REAL r2, REAL densty, int *seeds);\nvoid ddrand( int n, REAL *x, int incx, int *seeds );\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/bfp/bfp_LUSOL/LUSOL/sherman5.mtx",
    "content": "%%MatrixMarket matrix coordinate real general\r\n3312 3312 20793\r\n1 1  1.0000000000000e+00\r\n2 2  1.0000000000000e+00\r\n3 3  1.0000000000000e+00\r\n4 4  1.0000000000000e+00\r\n5 5  1.0000000000000e+00\r\n6 6  1.0000000000000e+00\r\n7 7  1.0000000000000e+00\r\n8 8  1.0000000000000e+00\r\n9 9  1.0000000000000e+00\r\n10 10  1.0000000000000e+00\r\n11 11  1.0000000000000e+00\r\n12 12  1.0000000000000e+00\r\n13 13  1.0000000000000e+00\r\n14 14  1.0000000000000e+00\r\n15 15  1.0000000000000e+00\r\n16 16  1.0000000000000e+00\r\n17 17  1.0000000000000e+00\r\n18 18  1.0000000000000e+00\r\n19 19  1.0000000000000e+00\r\n20 20  1.0000000000000e+00\r\n21 21  1.0000000000000e+00\r\n22 22  1.0000000000000e+00\r\n23 23  1.0000000000000e+00\r\n24 24  1.0000000000000e+00\r\n25 25  1.0000000000000e+00\r\n26 26  1.0000000000000e+00\r\n27 27  1.0000000000000e+00\r\n28 28  1.0000000000000e+00\r\n29 29  1.0000000000000e+00\r\n30 30  1.0000000000000e+00\r\n31 31  1.0000000000000e+00\r\n32 32  1.0000000000000e+00\r\n33 33  1.0000000000000e+00\r\n34 34  1.0000000000000e+00\r\n35 35  1.0000000000000e+00\r\n36 36  1.0000000000000e+00\r\n37 37  1.0000000000000e+00\r\n38 38  1.0000000000000e+00\r\n39 39  1.0000000000000e+00\r\n40 40  1.0000000000000e+00\r\n41 41  1.0000000000000e+00\r\n42 42  1.0000000000000e+00\r\n43 43  1.0000000000000e+00\r\n44 44  1.0000000000000e+00\r\n45 45  1.0000000000000e+00\r\n46 46  1.0000000000000e+00\r\n47 47  1.0000000000000e+00\r\n48 48  1.0000000000000e+00\r\n49 49  1.0000000000000e+00\r\n50 50  1.0000000000000e+00\r\n51 51  1.0000000000000e+00\r\n52 52  1.0000000000000e+00\r\n53 53  1.0000000000000e+00\r\n54 54  1.0000000000000e+00\r\n55 55  1.0000000000000e+00\r\n56 56  1.0000000000000e+00\r\n57 57  1.0000000000000e+00\r\n58 58  1.0000000000000e+00\r\n59 59  1.0000000000000e+00\r\n60 60  1.0000000000000e+00\r\n61 61  1.0000000000000e+00\r\n62 62  1.0000000000000e+00\r\n63 63  1.0000000000000e+00\r\n64 64  1.0000000000000e+00\r\n65 65  1.0000000000000e+00\r\n66 66  1.0000000000000e+00\r\n67 67  1.0000000000000e+00\r\n68 68  1.0000000000000e+00\r\n69 69  1.0000000000000e+00\r\n70 70  1.0000000000000e+00\r\n71 71  1.0000000000000e+00\r\n72 72  1.0000000000000e+00\r\n73 73  1.0000000000000e+00\r\n74 74  1.0000000000000e+00\r\n75 75  1.0000000000000e+00\r\n76 76  1.0000000000000e+00\r\n77 77  1.0000000000000e+00\r\n78 78  1.0000000000000e+00\r\n79 79  1.0000000000000e+00\r\n80 80  1.0000000000000e+00\r\n81 81  1.0000000000000e+00\r\n82 82  1.0000000000000e+00\r\n83 83  1.0000000000000e+00\r\n84 84  1.0000000000000e+00\r\n85 85  1.0000000000000e+00\r\n86 86  1.0000000000000e+00\r\n87 87  1.0000000000000e+00\r\n88 88  1.0000000000000e+00\r\n89 89  1.0000000000000e+00\r\n90 90  1.0000000000000e+00\r\n91 91  1.0000000000000e+00\r\n92 92  1.0000000000000e+00\r\n93 93  1.0000000000000e+00\r\n94 94  1.0000000000000e+00\r\n95 95  1.0000000000000e+00\r\n96 96  1.0000000000000e+00\r\n97 97  1.0000000000000e+00\r\n98 98  1.0000000000000e+00\r\n99 99  1.0000000000000e+00\r\n100 100  1.0000000000000e+00\r\n101 101  1.0000000000000e+00\r\n102 102  1.0000000000000e+00\r\n103 103  1.0000000000000e+00\r\n104 104  1.0000000000000e+00\r\n105 105  1.0000000000000e+00\r\n106 106  1.0000000000000e+00\r\n107 107  1.0000000000000e+00\r\n108 108  1.0000000000000e+00\r\n109 109  1.0000000000000e+00\r\n110 110  1.0000000000000e+00\r\n111 111  1.0000000000000e+00\r\n112 112  5.8231501000000e+02\r\n114 112  5.2492442000000e-01\r\n115 112 -2.0203364000000e+00\r\n117 112 -2.7550543000000e-01\r\n160 112 -5.6252230000000e+00\r\n162 112 -1.6807221000000e-01\r\n112 113 -3.5663180000000e+02\r\n113 113 -8.8662401000000e+01\r\n114 113  4.3323260000000e+00\r\n117 113 -1.9094766000000e+00\r\n160 113  2.6312807000000e+01\r\n162 113 -2.4130042000000e+00\r\n112 114 -6.0285039000000e+02\r\n113 114  7.5193603000000e+01\r\n114 114  7.3233615000000e+00\r\n117 114 -3.2277769000000e+00\r\n160 114  4.4479169000000e+01\r\n161 114 -5.0183851000000e+00\r\n162 114 -4.0789423000000e+00\r\n112 115 -1.6998248000000e+00\r\n114 115 -2.7550543000000e-01\r\n115 115  5.8372624000000e+02\r\n117 115  6.3124101000000e-01\r\n163 115 -7.3516016000000e+00\r\n165 115 -2.7406444000000e-01\r\n112 116  1.4215287000000e+00\r\n114 116 -1.9094766000000e+00\r\n115 116 -3.5731519000000e+02\r\n116 116 -8.2875303000000e+01\r\n117 116  3.8183672000000e+00\r\n163 116  2.5567757000000e+01\r\n165 116 -1.8996892000000e+00\r\n112 117  2.4029503000000e+00\r\n113 117 -2.3924408000000e-01\r\n114 117 -3.2277769000000e+00\r\n115 117 -6.0400514000000e+02\r\n116 117  7.0151506000000e+01\r\n117 117  6.4545628000000e+00\r\n163 117  4.3219704000000e+01\r\n164 117 -4.3030678000000e+00\r\n165 117 -3.2112320000000e+00\r\n118 118  1.0000000000000e+00\r\n119 119  1.0000000000000e+00\r\n120 120  1.0000000000000e+00\r\n121 121  1.0000000000000e+00\r\n122 122  1.0000000000000e+00\r\n123 123  1.0000000000000e+00\r\n124 124  5.3832442000000e+02\r\n126 124  5.3782022000000e-01\r\n127 124 -6.3733512000000e-01\r\n129 124 -1.5517509000000e-01\r\n172 124 -8.9792671000000e+00\r\n174 124 -3.0109811000000e-01\r\n124 125 -3.3089489000000e+02\r\n125 125 -7.4442006000000e+01\r\n126 125  3.7903600000000e+00\r\n129 125 -2.1251184000000e+00\r\n172 125  2.6986678000000e+01\r\n174 125 -1.6569781000000e+00\r\n124 126 -5.5934473000000e+02\r\n125 126  6.3483385000000e+01\r\n126 126  6.4072219000000e+00\r\n129 126 -3.5922975000000e+00\r\n172 126  4.5618281000000e+01\r\n173 126 -4.5334382000000e+00\r\n174 126 -2.8009558000000e+00\r\n124 127 -1.3980131000000e+00\r\n126 127 -1.5517509000000e-01\r\n127 127  5.0198176000000e+02\r\n129 127  4.7689354000000e-01\r\n130 127 -6.3224679000000e-01\r\n132 127 -8.6217037000000e-02\r\n175 127 -5.7287189000000e+00\r\n177 127 -1.5448592000000e-01\r\n124 128  1.3851396000000e+00\r\n126 128 -2.1251184000000e+00\r\n127 128 -3.1288440000000e+02\r\n128 128 -7.5938657000000e+01\r\n129 128  6.6177709000000e+00\r\n132 128 -2.3682623000000e+00\r\n175 128  2.7415937000000e+01\r\n177 128 -2.1159596000000e+00\r\n124 129  2.3414383000000e+00\r\n125 129 -2.6047842000000e-01\r\n126 129 -3.5922975000000e+00\r\n127 129 -5.2889940000000e+02\r\n128 129  6.5540651000000e+01\r\n129 129  1.1186675000000e+01\r\n132 129 -4.0033106000000e+00\r\n175 129  4.6343867000000e+01\r\n176 129 -5.1556247000000e+00\r\n177 129 -3.5768156000000e+00\r\n127 130 -1.4107303000000e+00\r\n129 130 -8.6217037000000e-02\r\n130 130  4.6586228000000e+02\r\n132 130  2.9383283000000e-01\r\n133 130 -3.8013097000000e-01\r\n135 130 -4.2128177000000e-02\r\n178 130 -4.3311389000000e+00\r\n180 130 -8.4835819000000e-02\r\n127 131  4.3689315000000e+00\r\n129 131 -2.3682623000000e+00\r\n130 131 -2.9407852000000e+02\r\n131 131 -7.4441522000000e+01\r\n132 131  7.2325006000000e+00\r\n135 131 -2.5253587000000e+00\r\n178 131  2.5448551000000e+01\r\n180 131 -2.3306147000000e+00\r\n127 132  7.3852418000000e+00\r\n128 132 -9.3201429000000e-01\r\n129 132 -4.0033106000000e+00\r\n130 132 -4.9711033000000e+02\r\n131 132  6.5294128000000e+01\r\n132 132  1.2225815000000e+01\r\n135 132 -4.2688625000000e+00\r\n178 132  4.3018230000000e+01\r\n179 132 -5.4288819000000e+00\r\n180 132 -3.9396711000000e+00\r\n130 133 -1.4010699000000e+00\r\n132 133 -4.2128177000000e-02\r\n133 133  4.2014767000000e+02\r\n135 133  2.8664674000000e-01\r\n136 133 -4.5043645000000e-01\r\n138 133 -2.8088374000000e-02\r\n181 133 -3.0132612000000e+00\r\n183 133 -4.1440337000000e-02\r\n1237 133 -1.5185682000000e+00\r\n1239 133 -9.4695072000000e-02\r\n130 134  8.3901469000000e+00\r\n132 134 -2.5253587000000e+00\r\n133 134 -2.7386615000000e+02\r\n134 134 -7.0163194000000e+01\r\n135 134  8.4045939000000e+00\r\n138 134 -2.4770889000000e+00\r\n181 134  2.7643276000000e+01\r\n183 134 -2.4844433000000e+00\r\n1239 134 -9.0991269000000e-01\r\n130 135  1.4182692000000e+01\r\n131 135 -1.8692398000000e+00\r\n132 135 -4.2688625000000e+00\r\n133 135 -4.6294292000000e+02\r\n134 135  6.3568717000000e+01\r\n135 135  1.4207117000000e+01\r\n138 135 -4.1872710000000e+00\r\n181 135  4.6728152000000e+01\r\n182 135 -6.1586425000000e+00\r\n183 135 -4.1996989000000e+00\r\n1239 135 -1.5381153000000e+00\r\n133 136 -1.1205588000000e+00\r\n135 136 -2.8088374000000e-02\r\n136 136  3.9605626000000e+02\r\n138 136  2.1289817000000e-01\r\n139 136 -4.3256755000000e-01\r\n141 136 -1.9131946000000e-02\r\n184 136 -2.4236070000000e+00\r\n186 136 -2.7943549000000e-02\r\n1240 136 -1.3020729000000e+00\r\n1242 136 -5.7589129000000e-02\r\n133 137  7.3902619000000e+00\r\n135 137 -2.4770889000000e+00\r\n136 137 -2.5965366000000e+02\r\n137 137 -6.7508510000000e+01\r\n138 137  8.6129243000000e+00\r\n141 137 -2.4530265000000e+00\r\n184 137  2.7643725000000e+01\r\n186 137 -2.4646498000000e+00\r\n1242 137 -1.2106635000000e+00\r\n133 138  1.2492498000000e+01\r\n134 138 -1.6776607000000e+00\r\n135 138 -4.1872710000000e+00\r\n136 138 -4.3891854000000e+02\r\n137 138  6.1392103000000e+01\r\n138 138  1.4559283000000e+01\r\n141 138 -4.1465920000000e+00\r\n184 138  4.6728953000000e+01\r\n185 138 -6.2753919000000e+00\r\n186 138 -4.1662440000000e+00\r\n1242 138 -2.0465056000000e+00\r\n136 139 -8.1089445000000e-01\r\n138 139 -1.9131946000000e-02\r\n139 139  3.7180667000000e+02\r\n141 139  1.6790239000000e-01\r\n142 139 -2.7576248000000e-01\r\n144 139 -1.2196645000000e-02\r\n187 139 -2.0755418000000e+00\r\n189 139 -1.8758993000000e-02\r\n1243 139 -8.5465113000000e-01\r\n1245 139 -3.7800198000000e-02\r\n136 140  5.6903327000000e+00\r\n138 140 -2.4530265000000e+00\r\n139 140 -2.4225577000000e+02\r\n140 140 -6.4514006000000e+01\r\n141 140  8.7655485000000e+00\r\n144 140 -2.4257603000000e+00\r\n187 140  2.5159407000000e+01\r\n189 140 -2.4055380000000e+00\r\n1245 140 -1.4740605000000e+00\r\n136 141  9.6189292000000e+00\r\n137 141 -1.3569623000000e+00\r\n138 141 -4.1465920000000e+00\r\n139 141 -4.0950877000000e+02\r\n140 141  5.8423373000000e+01\r\n141 141  1.4817273000000e+01\r\n144 141 -4.1005051000000e+00\r\n187 141  4.2529422000000e+01\r\n188 141 -5.9997136000000e+00\r\n189 141 -4.0663174000000e+00\r\n1245 141 -2.4917501000000e+00\r\n139 142 -5.8379831000000e-01\r\n141 142 -1.2196645000000e-02\r\n142 142  3.4769930000000e+02\r\n144 142  1.2785204000000e-01\r\n190 142 -1.5025582000000e+00\r\n192 142 -1.1948511000000e-02\r\n1246 142 -8.1286985000000e-01\r\n1248 142 -2.3819524000000e-02\r\n139 143  3.4445751000000e+00\r\n141 143 -2.4257603000000e+00\r\n142 143 -2.2507085000000e+02\r\n143 143 -6.1460330000000e+01\r\n144 143  6.5646306000000e+00\r\n190 143  2.3436855000000e+01\r\n192 143 -2.3767260000000e+00\r\n1248 143 -1.7553192000000e+00\r\n139 144  5.8227096000000e+00\r\n140 144 -8.3153640000000e-01\r\n141 144 -4.1005051000000e+00\r\n142 144 -3.8045976000000e+02\r\n143 144  5.5129317000000e+01\r\n144 144  1.1096852000000e+01\r\n190 144  3.9617660000000e+01\r\n191 144 -5.6577656000000e+00\r\n192 144 -4.0176177000000e+00\r\n1248 144 -2.9671916000000e+00\r\n145 145  1.0000000000000e+00\r\n146 146  1.0000000000000e+00\r\n147 147  1.0000000000000e+00\r\n148 148  1.0000000000000e+00\r\n149 149  1.0000000000000e+00\r\n150 150  1.0000000000000e+00\r\n151 151  1.0000000000000e+00\r\n152 152  1.0000000000000e+00\r\n153 153  1.0000000000000e+00\r\n154 154  1.0000000000000e+00\r\n155 155  1.0000000000000e+00\r\n156 156  1.0000000000000e+00\r\n157 157  1.0000000000000e+00\r\n158 158  1.0000000000000e+00\r\n159 159  1.0000000000000e+00\r\n112 160 -9.5033409000000e+00\r\n114 160 -1.6807221000000e-01\r\n160 160  5.8715640000000e+02\r\n162 160  2.0768709000000e-01\r\n163 160 -6.6263142000000e-01\r\n165 160 -1.1226122000000e-02\r\n208 160 -1.4917882000000e+00\r\n210 160 -1.1178095000000e-02\r\n1264 160 -8.8143285000000e-01\r\n1266 160 -1.5588662000000e-02\r\n114 161 -2.4130042000000e+00\r\n160 161 -3.6403964000000e+02\r\n161 161 -1.0420357000000e+02\r\n162 161  1.1702675000000e+01\r\n163 161  1.0112293000000e+00\r\n165 161 -4.1288435000000e+00\r\n208 161  3.2774276000000e+01\r\n210 161 -4.1117354000000e+00\r\n1266 161 -1.0375061000000e+00\r\n114 162 -4.0789423000000e+00\r\n160 162 -6.1537261000000e+02\r\n161 162  9.0595331000000e+01\r\n162 162  1.9782202000000e+01\r\n163 162  1.7093819000000e+00\r\n164 162 -2.4808822000000e-01\r\n165 162 -6.9793971000000e+00\r\n208 162  5.5401636000000e+01\r\n209 162 -8.0406217000000e+00\r\n210 162 -6.9504776000000e+00\r\n1266 162 -1.7538002000000e+00\r\n115 163 -9.3527780000000e+00\r\n117 163 -2.7406444000000e-01\r\n160 163 -3.8310490000000e-01\r\n162 163 -1.1226122000000e-02\r\n163 163  5.8877517000000e+02\r\n165 163  3.7583663000000e-01\r\n166 163 -9.7621276000000e-01\r\n168 163 -2.8605960000000e-02\r\n211 163 -2.1579866000000e+00\r\n213 163 -2.2766993000000e-02\r\n1267 163 -1.2770249000000e+00\r\n1269 163 -3.7420658000000e-02\r\n117 164 -1.8996892000000e+00\r\n162 164 -4.1288435000000e+00\r\n163 164 -3.6275210000000e+02\r\n164 164 -1.0186561000000e+02\r\n165 164  1.4544988000000e+01\r\n166 164  7.2034968000000e-01\r\n168 164 -3.8446595000000e+00\r\n211 164  3.1763844000000e+01\r\n213 164 -3.8235852000000e+00\r\n1269 164 -8.3688804000000e-01\r\n117 165 -3.2112320000000e+00\r\n162 165 -6.9793971000000e+00\r\n163 165 -6.1319572000000e+02\r\n164 165  8.8189741000000e+01\r\n165 165  2.4586836000000e+01\r\n166 165  1.2176783000000e+00\r\n167 165 -1.7063358000000e-01\r\n168 165 -6.4990078000000e+00\r\n211 165  5.3693564000000e+01\r\n212 165 -7.5240940000000e+00\r\n213 165 -6.4633840000000e+00\r\n1269 165 -1.4146747000000e+00\r\n163 166 -6.9261266000000e-01\r\n165 166 -2.8605960000000e-02\r\n166 166  5.7964280000000e+02\r\n168 166  2.1236083000000e-01\r\n169 166 -6.4659514000000e-01\r\n171 166 -2.8598130000000e-02\r\n214 166 -2.6326900000000e+00\r\n216 166 -2.8465858000000e-02\r\n1270 166 -1.0407070000000e+00\r\n1272 166 -4.6029227000000e-02\r\n165 167 -3.8446595000000e+00\r\n166 167 -3.6080559000000e+02\r\n167 167 -9.2549851000000e+01\r\n168 167  1.2072043000000e+01\r\n171 167 -3.7281591000000e+00\r\n214 167  3.0535283000000e+01\r\n216 167 -3.7102441000000e+00\r\n1272 167 -7.7776517000000e-01\r\n165 168 -6.4990078000000e+00\r\n166 168 -6.0990576000000e+02\r\n167 168  1.0113849000000e+02\r\n168 168  2.0406572000000e+01\r\n171 168 -6.3020758000000e+00\r\n214 168  5.1616842000000e+01\r\n215 168 -7.2946364000000e+00\r\n216 168 -6.2717966000000e+00\r\n1272 168 -1.3147342000000e+00\r\n166 169 -7.4936863000000e-01\r\n168 169 -2.8598130000000e-02\r\n169 169  5.7960782000000e+02\r\n171 169  2.0612325000000e-01\r\n172 169 -5.0660252000000e-01\r\n174 169 -2.2406424000000e-02\r\n217 169 -2.6813113000000e+00\r\n219 169 -2.8468338000000e-02\r\n1273 169 -1.0397916000000e+00\r\n1275 169 -4.5988738000000e-02\r\n166 170  1.6519968000000e+00\r\n168 170 -3.7281591000000e+00\r\n169 170 -3.6323852000000e+02\r\n170 170 -1.0089664000000e+02\r\n171 170  1.2039996000000e+01\r\n174 170 -3.8116668000000e+00\r\n217 170  3.1315243000000e+01\r\n219 170 -3.7116769000000e+00\r\n1275 170 -7.7727817000000e-01\r\n166 171  2.7925334000000e+00\r\n167 171 -3.9466218000000e-01\r\n168 171 -6.3020758000000e+00\r\n169 171 -6.1401798000000e+02\r\n170 171  8.7613858000000e+01\r\n171 171  2.0352399000000e+01\r\n174 171 -6.4432415000000e+00\r\n217 171  5.2935250000000e+01\r\n218 171 -7.4812153000000e+00\r\n219 171 -6.2742143000000e+00\r\n1275 171 -1.3139100000000e+00\r\n124 172 -1.0275334000000e+01\r\n126 172 -3.0109811000000e-01\r\n169 172 -9.2027711000000e-01\r\n171 172 -2.2406424000000e-02\r\n172 172  5.7841498000000e+02\r\n174 172  4.0105527000000e-01\r\n175 172 -6.0633936000000e-01\r\n177 172 -1.7767561000000e-02\r\n220 172 -2.2549502000000e+00\r\n222 172 -2.2319387000000e-02\r\n1276 172 -1.2199801000000e+00\r\n1278 172 -3.5749077000000e-02\r\n126 173 -1.6569781000000e+00\r\n169 173  4.9808187000000e+00\r\n171 173 -3.8116668000000e+00\r\n172 173 -3.6291867000000e+02\r\n173 173 -9.9874183000000e+01\r\n174 173  1.3885676000000e+01\r\n177 173 -3.7395622000000e+00\r\n220 173  3.4272320000000e+01\r\n222 173 -3.7973032000000e+00\r\n1278 173 -8.6906437000000e-01\r\n126 174 -2.8009558000000e+00\r\n169 174  8.4195758000000e+00\r\n170 174 -1.1816716000000e+00\r\n171 174 -6.4432415000000e+00\r\n172 174 -6.1347772000000e+02\r\n173 174  8.8241532000000e+01\r\n174 174  2.3472342000000e+01\r\n177 174 -6.3213517000000e+00\r\n220 174  5.7933929000000e+01\r\n221 174 -8.1309186000000e+00\r\n222 174 -6.4189614000000e+00\r\n1278 174 -1.4690664000000e+00\r\n127 175 -5.2720176000000e+00\r\n129 175 -1.5448592000000e-01\r\n172 175 -8.8376592000000e-01\r\n174 175 -1.7767561000000e-02\r\n175 175  5.3819049000000e+02\r\n177 175  2.2860480000000e-01\r\n178 175 -3.6629296000000e-01\r\n180 175 -1.0733482000000e-02\r\n223 175 -2.1028053000000e+00\r\n225 175 -1.7511047000000e-02\r\n1279 175 -9.0554114000000e-01\r\n1281 175 -2.6535070000000e-02\r\n129 176 -2.1159596000000e+00\r\n172 176  6.4992267000000e+00\r\n174 176 -3.7395622000000e+00\r\n175 176 -3.4501964000000e+02\r\n176 176 -9.4437882000000e+01\r\n177 176  1.4167430000000e+01\r\n180 176 -3.5930102000000e+00\r\n223 176  3.4671114000000e+01\r\n225 176 -3.6860291000000e+00\r\n1281 176 -1.0223718000000e+00\r\n129 177 -3.5768156000000e+00\r\n172 177  1.0986285000000e+01\r\n173 177 -1.5779046000000e+00\r\n174 177 -6.3213517000000e+00\r\n175 177 -5.8322082000000e+02\r\n176 177  8.4628322000000e+01\r\n177 177  2.3948610000000e+01\r\n180 177 -6.0736243000000e+00\r\n223 177  5.8608013000000e+01\r\n224 177 -8.4175711000000e+00\r\n225 177 -6.2308592000000e+00\r\n1281 177 -1.7282160000000e+00\r\n130 178 -4.7968887000000e+00\r\n132 178 -8.4835819000000e-02\r\n175 178 -8.0210585000000e-01\r\n177 178 -1.0733482000000e-02\r\n178 178  4.9120539000000e+02\r\n180 178  1.3248632000000e-01\r\n181 178 -3.9934254000000e-01\r\n183 178 -7.0626095000000e-03\r\n226 178 -1.5065650000000e+00\r\n228 178 -1.0573342000000e-02\r\n1282 178 -1.0123748000000e+00\r\n1284 178 -1.7904448000000e-02\r\n132 179 -2.3306147000000e+00\r\n175 179  7.4001667000000e+00\r\n177 179 -3.5930102000000e+00\r\n178 179 -3.1953541000000e+02\r\n179 179 -8.7270037000000e+01\r\n180 179  1.4135047000000e+01\r\n183 179 -3.4167533000000e+00\r\n226 179  3.4709746000000e+01\r\n228 179 -3.5398843000000e+00\r\n1284 179 -1.2450844000000e+00\r\n132 180 -3.9396711000000e+00\r\n175 180  1.2509242000000e+01\r\n176 180 -1.7988232000000e+00\r\n177 180 -6.0736243000000e+00\r\n178 180 -5.4014266000000e+02\r\n179 180  7.9198658000000e+01\r\n180 180  2.3893881000000e+01\r\n183 180 -5.7756766000000e+00\r\n226 180  5.8673355000000e+01\r\n227 180 -8.4372023000000e+00\r\n228 180 -5.9838204000000e+00\r\n1284 180 -2.1046906000000e+00\r\n133 181 -2.3431693000000e+00\r\n135 181 -4.1440337000000e-02\r\n178 181 -6.0882022000000e-01\r\n180 181 -7.0626095000000e-03\r\n181 181  4.5308736000000e+02\r\n183 181  6.8671832000000e-02\r\n184 181 -1.7952822000000e-01\r\n186 181 -3.1750629000000e-03\r\n229 181 -1.2500289000000e+00\r\n231 181 -6.9509890000000e-03\r\n1285 181 -4.9817901000000e-01\r\n1287 181 -8.8105909000000e-03\r\n135 182 -2.4844433000000e+00\r\n178 182  8.0397464000000e+00\r\n180 182 -3.4167533000000e+00\r\n181 182 -2.9842278000000e+02\r\n182 182 -8.1860502000000e+01\r\n183 182  1.4079488000000e+01\r\n186 182 -3.2915798000000e+00\r\n229 182  3.2776872000000e+01\r\n231 182 -3.3632083000000e+00\r\n1287 182 -1.5144038000000e+00\r\n135 183 -4.1996989000000e+00\r\n178 183  1.3590380000000e+01\r\n179 183 -2.0179013000000e+00\r\n180 183 -5.7756766000000e+00\r\n181 183 -5.0445359000000e+02\r\n182 183  7.4924081000000e+01\r\n183 183  2.3799955000000e+01\r\n186 183 -5.5640865000000e+00\r\n229 183  5.5405994000000e+01\r\n230 183 -8.2266890000000e+00\r\n231 183 -5.6851642000000e+00\r\n1287 183 -2.5599466000000e+00\r\n136 184 -1.5800177000000e+00\r\n138 184 -2.7943549000000e-02\r\n181 184 -3.8085523000000e-01\r\n183 184 -3.1750629000000e-03\r\n184 184  4.1704012000000e+02\r\n186 184  4.2224667000000e-02\r\n187 184 -1.2247098000000e-01\r\n189 184 -2.1659719000000e-03\r\n232 184 -9.6282021000000e-01\r\n234 184 -3.1237309000000e-03\r\n1288 184 -2.6765315000000e-01\r\n1290 184 -4.7336046000000e-03\r\n138 185 -2.4646498000000e+00\r\n181 185  7.6865494000000e+00\r\n183 185 -3.2915798000000e+00\r\n184 185 -2.7554457000000e+02\r\n185 185 -7.6543503000000e+01\r\n186 185  1.3835576000000e+01\r\n189 185 -3.0734057000000e+00\r\n232 185  3.0072650000000e+01\r\n234 185 -3.2388179000000e+00\r\n1290 185 -1.7586124000000e+00\r\n138 186 -4.1662440000000e+00\r\n181 186  1.2993343000000e+01\r\n182 186 -2.0075327000000e+00\r\n183 186 -5.5640865000000e+00\r\n184 186 -4.6578054000000e+02\r\n185 186  7.0327031000000e+01\r\n186 186  2.3387654000000e+01\r\n189 186 -5.1952822000000e+00\r\n232 186  5.0834807000000e+01\r\n233 186 -7.8542169000000e+00\r\n234 186 -5.4748978000000e+00\r\n1290 186 -2.9727583000000e+00\r\n139 187 -1.7974492000000e+00\r\n141 187 -1.8758993000000e-02\r\n184 187 -2.8221387000000e-01\r\n186 187 -2.1659719000000e-03\r\n187 187  3.8232845000000e+02\r\n189 187  2.9595214000000e-02\r\n190 187 -1.7389934000000e-01\r\n192 187 -1.8148921000000e-03\r\n235 187 -4.6688455000000e-01\r\n237 187 -2.1283901000000e-03\r\n1291 187 -3.5963947000000e-01\r\n1293 187 -3.7533603000000e-03\r\n141 188 -2.4055380000000e+00\r\n184 188  7.2573020000000e+00\r\n186 188 -3.0734057000000e+00\r\n187 188 -2.5249098000000e+02\r\n188 188 -7.0502971000000e+01\r\n189 188  1.3352024000000e+01\r\n192 188 -2.8726571000000e+00\r\n235 188  2.7264523000000e+01\r\n237 188 -3.0204609000000e+00\r\n1293 188 -1.9721237000000e+00\r\n141 189 -4.0663174000000e+00\r\n184 189  1.2267737000000e+01\r\n185 189 -1.8598161000000e+00\r\n186 189 -5.1952822000000e+00\r\n187 189 -4.2681054000000e+02\r\n188 189  6.4538446000000e+01\r\n189 189  2.2570249000000e+01\r\n192 189 -4.8559394000000e+00\r\n235 189  4.6087927000000e+01\r\n236 189 -6.9870316000000e+00\r\n237 189 -5.1057843000000e+00\r\n1293 189 -3.3336753000000e+00\r\n142 190 -1.1448824000000e+00\r\n144 190 -1.1948511000000e-02\r\n187 190 -2.2552177000000e-01\r\n189 190 -1.8148921000000e-03\r\n190 190  3.5827852000000e+02\r\n192 190  1.9645213000000e-02\r\n238 190 -3.4041326000000e-01\r\n240 190 -1.8063119000000e-03\r\n1294 190 -3.0363694000000e-01\r\n1296 190 -3.1688925000000e-03\r\n144 191 -2.3767260000000e+00\r\n187 191  5.0814602000000e+00\r\n189 191 -2.8726571000000e+00\r\n190 191 -2.3237971000000e+02\r\n191 191 -6.6372454000000e+01\r\n192 191  1.0250425000000e+01\r\n238 191  2.2538935000000e+01\r\n240 191 -2.8594450000000e+00\r\n1296 191 -2.1342173000000e+00\r\n144 192 -4.0176177000000e+00\r\n187 192  8.5897002000000e+00\r\n188 192 -1.3110006000000e+00\r\n189 192 -4.8559394000000e+00\r\n190 192 -3.9281466000000e+02\r\n191 192  5.9555841000000e+01\r\n192 192  1.7327318000000e+01\r\n238 192  3.8099815000000e+01\r\n239 192 -5.8149738000000e+00\r\n240 192 -4.8336058000000e+00\r\n1296 192 -3.6076809000000e+00\r\n193 193  1.0000000000000e+00\r\n194 194  1.0000000000000e+00\r\n195 195  1.0000000000000e+00\r\n196 196  1.0000000000000e+00\r\n197 197  1.0000000000000e+00\r\n198 198  1.0000000000000e+00\r\n199 199  1.0000000000000e+00\r\n200 200  1.0000000000000e+00\r\n201 201  1.0000000000000e+00\r\n202 202  1.0000000000000e+00\r\n203 203  1.0000000000000e+00\r\n204 204  1.0000000000000e+00\r\n205 205  1.0000000000000e+00\r\n206 206  1.0000000000000e+00\r\n207 207  1.0000000000000e+00\r\n160 208 -1.0710627000000e+00\r\n162 208 -1.1178095000000e-02\r\n208 208  5.7664083000000e+02\r\n210 208  2.0060363000000e-02\r\n211 208 -2.4673275000000e-01\r\n213 208 -2.4431051000000e-03\r\n256 208 -5.0275251000000e-01\r\n258 208 -2.4344383000000e-03\r\n1312 208 -2.4521007000000e-01\r\n1314 208 -2.5591232000000e-03\r\n162 209 -4.1117354000000e+00\r\n208 209 -3.6951689000000e+02\r\n209 209 -1.0739081000000e+02\r\n210 209  1.4473053000000e+01\r\n211 209  1.2598142000000e+00\r\n213 209 -4.5324730000000e+00\r\n256 209  3.8055507000000e+01\r\n258 209 -4.5169952000000e+00\r\n1314 209 -1.2998960000000e+00\r\n162 210 -6.9504776000000e+00\r\n208 210 -6.2463134000000e+02\r\n209 210  9.4914364000000e+01\r\n210 210  2.4465248000000e+01\r\n211 210  2.1295899000000e+00\r\n212 210 -3.2783572000000e-01\r\n213 210 -7.6616923000000e+00\r\n256 210  6.4329029000000e+01\r\n257 210 -9.9030117000000e+00\r\n258 210 -7.6355288000000e+00\r\n1314 210 -2.1973442000000e+00\r\n163 211 -2.1814878000000e+00\r\n165 211 -2.2766993000000e-02\r\n208 211 -2.3409345000000e-01\r\n210 211 -2.4431051000000e-03\r\n211 211  5.7810629000000e+02\r\n213 211  3.4919008000000e-02\r\n214 211 -2.6512178000000e-01\r\n216 211 -2.6886511000000e-03\r\n259 211 -5.7254940000000e-01\r\n261 211 -2.6800805000000e-03\r\n1315 211 -2.7636288000000e-01\r\n1317 211 -2.8842481000000e-03\r\n165 212 -3.8235852000000e+00\r\n210 212 -4.5324730000000e+00\r\n211 212 -3.6896133000000e+02\r\n212 212 -1.0720477000000e+02\r\n213 212  1.8657388000000e+01\r\n214 212  7.4248961000000e-01\r\n216 212 -4.5082972000000e+00\r\n259 212  3.8015026000000e+01\r\n261 212 -4.4945266000000e+00\r\n1317 212 -1.2865738000000e+00\r\n165 213 -6.4633840000000e+00\r\n210 213 -7.6616923000000e+00\r\n211 213 -6.2369183000000e+02\r\n212 213  9.4574832000000e+01\r\n213 213  3.1538432000000e+01\r\n214 213  1.2551036000000e+00\r\n215 213 -1.9218681000000e-01\r\n216 213 -7.6208205000000e+00\r\n259 213  6.4260557000000e+01\r\n260 213 -9.8398496000000e+00\r\n261 213 -7.5975428000000e+00\r\n1317 213 -2.1748226000000e+00\r\n166 214 -2.7275416000000e+00\r\n168 214 -2.8465858000000e-02\r\n211 214 -2.5762117000000e-01\r\n213 214 -2.6886511000000e-03\r\n214 214  5.7892699000000e+02\r\n216 214  4.2732943000000e-02\r\n217 214 -3.2769397000000e-01\r\n219 214 -3.4199625000000e-03\r\n262 214 -6.9620582000000e-01\r\n264 214 -3.1666804000000e-03\r\n1318 214 -3.3683290000000e-01\r\n1320 214 -3.5153406000000e-03\r\n168 215 -3.7102441000000e+00\r\n213 215 -4.5082972000000e+00\r\n214 215 -3.6893026000000e+02\r\n215 215 -9.8002191000000e+01\r\n216 215  1.8375718000000e+01\r\n219 215 -4.4366481000000e+00\r\n262 215  3.8721161000000e+01\r\n264 215 -4.4472212000000e+00\r\n1320 215 -1.2614183000000e+00\r\n168 216 -6.2717966000000e+00\r\n213 216 -7.6208205000000e+00\r\n214 216 -6.2363972000000e+02\r\n215 216  1.0911105000000e+02\r\n216 216  3.1062304000000e+01\r\n219 216 -7.4997050000000e+00\r\n262 216  6.5454250000000e+01\r\n263 216 -9.9161438000000e+00\r\n264 216 -7.5175827000000e+00\r\n1320 216 -2.1323014000000e+00\r\n169 217 -2.7277792000000e+00\r\n171 217 -2.8468338000000e-02\r\n214 217 -3.3767214000000e-01\r\n216 217 -3.4199625000000e-03\r\n217 217  5.7908054000000e+02\r\n219 217  4.4058334000000e-02\r\n220 217 -3.2755690000000e-01\r\n222 217 -3.4185321000000e-03\r\n265 217 -7.3488848000000e-01\r\n267 217 -3.4093212000000e-03\r\n1321 217 -3.6942559000000e-01\r\n1323 217 -3.8554926000000e-03\r\n171 218 -3.7116769000000e+00\r\n214 218  9.8147627000000e-01\r\n216 218 -4.4366481000000e+00\r\n217 218 -3.7128234000000e+02\r\n218 218 -1.0664909000000e+02\r\n219 218  1.8269537000000e+01\r\n222 218 -4.4365683000000e+00\r\n265 218  4.0088522000000e+01\r\n267 218 -4.4233411000000e+00\r\n1323 218 -1.2494341000000e+00\r\n171 219 -6.2742143000000e+00\r\n214 219  1.6590864000000e+00\r\n215 219 -2.5000051000000e-01\r\n216 219 -7.4997050000000e+00\r\n217 219 -6.2761527000000e+02\r\n218 219  9.4589072000000e+01\r\n219 219  3.0882809000000e+01\r\n222 219 -7.4995750000000e+00\r\n265 219  6.7765594000000e+01\r\n266 219 -1.0211302000000e+01\r\n267 219 -7.4772107000000e+00\r\n1323 219 -2.1120419000000e+00\r\n172 220 -2.1385990000000e+00\r\n174 220 -2.2319387000000e-02\r\n217 220 -3.6012857000000e-01\r\n219 220 -3.4185321000000e-03\r\n220 220  5.7847280000000e+02\r\n222 220  3.7287746000000e-02\r\n223 220 -2.6939197000000e-01\r\n225 220 -2.8114965000000e-03\r\n268 220 -7.5130318000000e-01\r\n270 220 -3.4090856000000e-03\r\n1324 220 -3.6819108000000e-01\r\n1326 220 -3.8426087000000e-03\r\n174 221 -3.7973032000000e+00\r\n217 221  3.2107202000000e+00\r\n219 221 -4.4365683000000e+00\r\n220 221 -3.7513644000000e+02\r\n221 221 -1.0664886000000e+02\r\n222 221  1.8317866000000e+01\r\n225 221 -4.3982700000000e+00\r\n268 221  4.1711503000000e+01\r\n270 221 -4.4248029000000e+00\r\n1326 221 -1.2490543000000e+00\r\n174 222 -6.4189614000000e+00\r\n217 222  5.4274013000000e+00\r\n218 222 -8.1785463000000e-01\r\n219 222 -7.4995750000000e+00\r\n220 222 -6.3413063000000e+02\r\n221 222  9.5574845000000e+01\r\n222 222  3.0964516000000e+01\r\n225 222 -7.4348304000000e+00\r\n268 222  7.0509125000000e+01\r\n269 222 -1.0625014000000e+01\r\n270 222 -7.4796868000000e+00\r\n1326 222 -2.1114013000000e+00\r\n175 223 -1.6778735000000e+00\r\n177 223 -1.7511047000000e-02\r\n220 223 -3.1793598000000e-01\r\n222 223 -2.8114965000000e-03\r\n223 223  5.5474903000000e+02\r\n225 223  2.9553440000000e-02\r\n226 223 -1.8227636000000e-01\r\n228 223 -1.9023186000000e-03\r\n271 223 -6.7335162000000e-01\r\n273 223 -2.8042008000000e-03\r\n1327 223 -2.9888915000000e-01\r\n1329 223 -3.1193424000000e-03\r\n177 224 -3.6860291000000e+00\r\n220 224  4.7680567000000e+00\r\n222 224 -4.3982700000000e+00\r\n223 224 -3.6390682000000e+02\r\n224 224 -1.0278084000000e+02\r\n225 224  1.8064403000000e+01\r\n228 224 -4.2463847000000e+00\r\n271 224  4.2136737000000e+01\r\n273 224 -4.3874214000000e+00\r\n1329 224 -1.3348595000000e+00\r\n177 225 -6.2308592000000e+00\r\n220 225  8.0599173000000e+00\r\n221 225 -1.2292842000000e+00\r\n222 225 -7.4348304000000e+00\r\n223 225 -6.1514765000000e+02\r\n224 225  9.3163769000000e+01\r\n225 225  3.0536050000000e+01\r\n228 225 -7.1780887000000e+00\r\n271 225  7.1227889000000e+01\r\n272 225 -1.0863549000000e+01\r\n273 225 -7.4164918000000e+00\r\n1329 225 -2.2564449000000e+00\r\n178 226 -1.0131165000000e+00\r\n180 226 -1.0573342000000e-02\r\n223 226 -2.4825922000000e-01\r\n225 226 -1.9023186000000e-03\r\n226 226  5.1920487000000e+02\r\n228 226  1.8823489000000e-02\r\n229 226 -1.1827383000000e-01\r\n231 226 -1.2343592000000e-03\r\n274 226 -5.1884683000000e-01\r\n276 226 -1.8782924000000e-03\r\n1330 226 -1.8675856000000e-01\r\n1332 226 -1.9490968000000e-03\r\n180 227 -3.5398843000000e+00\r\n223 227  6.4838811000000e+00\r\n225 227 -4.2463847000000e+00\r\n226 227 -3.4419200000000e+02\r\n227 227 -9.6916962000000e+01\r\n228 227  1.7439049000000e+01\r\n231 227 -3.9733548000000e+00\r\n274 227  4.0524145000000e+01\r\n276 227 -4.1932912000000e+00\r\n1332 227 -1.4753468000000e+00\r\n180 228 -5.9838204000000e+00\r\n223 228  1.0960352000000e+01\r\n224 228 -1.7017208000000e+00\r\n225 228 -7.1780887000000e+00\r\n226 228 -5.8182216000000e+02\r\n227 228  8.8768635000000e+01\r\n228 228  2.9478962000000e+01\r\n231 228 -6.7165536000000e+00\r\n274 228  6.8502014000000e+01\r\n275 228 -1.0635726000000e+01\r\n276 228 -7.0883394000000e+00\r\n1332 228 -2.4939263000000e+00\r\n181 229 -6.6602986000000e-01\r\n183 229 -6.9509890000000e-03\r\n226 229 -1.9858635000000e-01\r\n228 229 -1.2343592000000e-03\r\n229 229  4.7252958000000e+02\r\n231 229  1.2074909000000e-02\r\n232 229 -2.8192377000000e-02\r\n234 229 -2.9422840000000e-04\r\n277 229 -3.6741877000000e-01\r\n279 229 -1.2175774000000e-03\r\n1333 229 -1.1756918000000e-01\r\n1335 229 -1.2270051000000e-03\r\n183 230 -3.3632083000000e+00\r\n226 230  7.8886303000000e+00\r\n228 230 -3.9733548000000e+00\r\n229 230 -3.1651079000000e+02\r\n230 230 -8.8678619000000e+01\r\n231 230  1.6662947000000e+01\r\n234 230 -3.7352263000000e+00\r\n277 230  3.7856342000000e+01\r\n279 230 -3.9198308000000e+00\r\n1335 230 -1.6614562000000e+00\r\n183 231 -5.6851642000000e+00\r\n226 231  1.3334930000000e+01\r\n227 231 -2.0974954000000e+00\r\n228 231 -6.7165536000000e+00\r\n229 231 -5.3502944000000e+02\r\n230 231  8.2092491000000e+01\r\n231 231  2.8167030000000e+01\r\n234 231 -6.3140265000000e+00\r\n277 231  6.3992312000000e+01\r\n278 231 -1.0065562000000e+01\r\n279 231 -6.6260765000000e+00\r\n1335 231 -2.8085241000000e+00\r\n184 232 -2.9930964000000e-01\r\n186 232 -3.1237309000000e-03\r\n229 232 -1.1643972000000e-01\r\n231 232 -2.9422840000000e-04\r\n232 232  4.3738055000000e+02\r\n234 232  5.5958296000000e-03\r\n235 232 -1.6217394000000e-03\r\n237 232 -1.6925206000000e-05\r\n280 232 -2.0947241000000e-01\r\n282 232 -2.8999742000000e-04\r\n1336 232 -8.0340221000000e-02\r\n1338 232 -8.3846689000000e-04\r\n186 233 -3.2388179000000e+00\r\n229 233  8.6664178000000e+00\r\n231 233 -3.7352263000000e+00\r\n232 233 -2.9406254000000e+02\r\n233 233 -8.2802041000000e+01\r\n234 233  1.5978837000000e+01\r\n237 233 -3.4760355000000e+00\r\n280 233  3.4447542000000e+01\r\n282 233 -3.6819706000000e+00\r\n1338 233 -1.8375694000000e+00\r\n186 234 -5.4748978000000e+00\r\n229 234  1.4649713000000e+01\r\n230 234 -2.3563697000000e+00\r\n231 234 -6.3140265000000e+00\r\n232 234 -4.9708331000000e+02\r\n233 234  7.7003990000000e+01\r\n234 234  2.7010623000000e+01\r\n237 234 -5.8758874000000e+00\r\n280 234  5.8230126000000e+01\r\n281 234 -9.3661703000000e+00\r\n282 234 -6.2240031000000e+00\r\n1338 234 -3.1062273000000e+00\r\n187 235 -2.0393809000000e-01\r\n189 235 -2.1283901000000e-03\r\n232 235 -1.1023481000000e-01\r\n234 235 -1.6925206000000e-05\r\n235 235  4.0269551000000e+02\r\n237 235  3.7167283000000e-03\r\n238 235 -1.4737675000000e-03\r\n240 235 -1.5380905000000e-05\r\n283 235 -1.2353727000000e-01\r\n285 235 -1.6665148000000e-05\r\n1339 235 -5.7366022000000e-02\r\n1341 235 -5.9869776000000e-04\r\n189 236 -3.0204609000000e+00\r\n232 236  9.0983861000000e+00\r\n234 236 -3.4760355000000e+00\r\n235 236 -2.6989504000000e+02\r\n236 236 -7.6449015000000e+01\r\n237 236  1.5194425000000e+01\r\n240 236 -3.2404837000000e+00\r\n283 236  2.9659902000000e+01\r\n285 236 -3.4229940000000e+00\r\n1341 236 -2.0259409000000e+00\r\n189 237 -5.1057843000000e+00\r\n232 237  1.5379904000000e+01\r\n233 237 -2.4917653000000e+00\r\n234 237 -5.8758874000000e+00\r\n235 237 -4.5623034000000e+02\r\n236 237  7.0887220000000e+01\r\n237 237  2.5684645000000e+01\r\n240 237 -5.4777135000000e+00\r\n283 237  5.0137073000000e+01\r\n284 237 -8.1229254000000e+00\r\n285 237 -5.7862261000000e+00\r\n1341 237 -3.4246482000000e+00\r\n190 238 -1.7307719000000e-01\r\n192 238 -1.8063119000000e-03\r\n235 238 -1.4162830000000e-01\r\n237 238 -1.5380905000000e-05\r\n238 238  3.7956711000000e+02\r\n240 238  2.7342053000000e-03\r\n286 238 -1.8468844000000e-03\r\n288 238 -1.5122013000000e-05\r\n1342 238 -3.5584583000000e-02\r\n1344 238 -1.0490999000000e-05\r\n192 239 -2.8594450000000e+00\r\n235 239  8.7075681000000e+00\r\n237 239 -3.2404837000000e+00\r\n238 239 -2.4332481000000e+02\r\n239 239 -7.2082031000000e+01\r\n240 239  1.1483163000000e+01\r\n286 239  1.6689927000000e+01\r\n288 239 -3.1862433000000e+00\r\n1344 239 -2.1889664000000e+00\r\n192 240 -4.8336058000000e+00\r\n235 240  1.4719273000000e+01\r\n236 240 -2.3847611000000e+00\r\n237 240 -5.4777135000000e+00\r\n238 240 -4.1131626000000e+02\r\n239 240  6.3780781000000e+01\r\n240 240  1.9411139000000e+01\r\n286 240  2.8212653000000e+01\r\n287 240 -4.5709076000000e+00\r\n288 240 -5.3860258000000e+00\r\n1344 240 -3.7002288000000e+00\r\n241 241  1.0000000000000e+00\r\n242 242  1.0000000000000e+00\r\n243 243  1.0000000000000e+00\r\n244 244  1.0000000000000e+00\r\n245 245  1.0000000000000e+00\r\n246 246  1.0000000000000e+00\r\n247 247  1.0000000000000e+00\r\n248 248  1.0000000000000e+00\r\n249 249  1.0000000000000e+00\r\n250 250  1.0000000000000e+00\r\n251 251  1.0000000000000e+00\r\n252 252  1.0000000000000e+00\r\n253 253  1.0000000000000e+00\r\n254 254  1.0000000000000e+00\r\n255 255  1.0000000000000e+00\r\n208 256 -2.3326301000000e-01\r\n210 256 -2.4344383000000e-03\r\n256 256  5.7507916000000e+02\r\n258 256  3.8357379000000e-03\r\n259 256 -6.1330853000000e-02\r\n261 256 -2.4941367000000e-05\r\n304 256 -2.4053318000000e-01\r\n306 256 -2.4894191000000e-05\r\n1360 256 -1.9741121000000e-02\r\n1362 256 -7.6162909000000e-06\r\n210 257 -4.5169952000000e+00\r\n256 257 -3.7305396000000e+02\r\n257 257 -1.0022923000000e+02\r\n258 257  1.5487904000000e+01\r\n259 257  1.2056910000000e+00\r\n261 257 -4.7705675000000e+00\r\n304 257  4.1710395000000e+01\r\n306 257 -4.7620287000000e+00\r\n1362 257 -1.4261365000000e+00\r\n210 258 -7.6355288000000e+00\r\n256 258 -6.3061041000000e+02\r\n257 258  1.1299210000000e+02\r\n258 258  2.6180753000000e+01\r\n259 258  2.0381001000000e+00\r\n260 258 -3.3018964000000e-01\r\n261 258 -8.0641672000000e+00\r\n304 258  7.0507252000000e+01\r\n305 258 -1.1422778000000e+01\r\n306 258 -8.0497333000000e+00\r\n1362 258 -2.4107412000000e+00\r\n211 259 -2.5679995000000e-01\r\n213 259 -2.6800805000000e-03\r\n256 259 -2.3898319000000e-03\r\n258 259 -2.4941367000000e-05\r\n259 259  5.7512775000000e+02\r\n261 259  4.1066606000000e-03\r\n262 259 -8.7123907000000e-02\r\n264 259 -2.5087633000000e-05\r\n307 259 -2.4811441000000e-01\r\n309 259 -2.5032665000000e-05\r\n1363 259 -5.1195054000000e-03\r\n1365 259 -7.6616229000000e-06\r\n213 260 -4.4945266000000e+00\r\n258 260 -4.7705675000000e+00\r\n259 260 -3.7403651000000e+02\r\n260 260 -1.0925131000000e+02\r\n261 260  2.0220255000000e+01\r\n262 260  1.4464879000000e+00\r\n264 260 -4.7706176000000e+00\r\n307 260  4.2446987000000e+01\r\n309 260 -4.7606802000000e+00\r\n1365 260 -1.4116883000000e+00\r\n213 261 -7.5975428000000e+00\r\n258 261 -8.0641672000000e+00\r\n259 261 -6.3227092000000e+02\r\n260 261  9.8012889000000e+01\r\n261 261  3.4180302000000e+01\r\n262 261  2.4451416000000e+00\r\n263 261 -3.9613289000000e-01\r\n264 261 -8.0642470000000e+00\r\n307 261  7.1752342000000e+01\r\n308 261 -1.1624465000000e+01\r\n309 261 -8.0474488000000e+00\r\n1365 261 -2.3863159000000e+00\r\n214 262 -3.0342498000000e-01\r\n216 262 -3.1666804000000e-03\r\n259 262 -2.4038469000000e-03\r\n261 262 -2.5087633000000e-05\r\n262 262  5.7515641000000e+02\r\n264 262  5.2770057000000e-03\r\n265 262 -7.9344378000000e-03\r\n267 262 -2.5382928000000e-05\r\n310 262 -2.4183986000000e-01\r\n312 262 -2.5312166000000e-05\r\n1366 262 -6.6178409000000e-02\r\n1368 262 -6.9066782000000e-04\r\n216 263 -4.4472212000000e+00\r\n261 263 -4.7706176000000e+00\r\n262 263 -3.7464345000000e+02\r\n263 263 -1.0924511000000e+02\r\n264 263  2.0149213000000e+01\r\n265 263  3.9033555000000e-01\r\n267 263 -4.7709720000000e+00\r\n310 263  4.4102251000000e+01\r\n312 263 -4.7581730000000e+00\r\n1368 263 -1.3900576000000e+00\r\n216 264 -7.5175827000000e+00\r\n261 264 -8.0642470000000e+00\r\n262 264 -6.3329729000000e+02\r\n263 264  9.8193118000000e+01\r\n264 264  3.4060225000000e+01\r\n265 264  6.5982322000000e-01\r\n266 264 -1.0689604000000e-01\r\n267 264 -8.0648511000000e+00\r\n310 264  7.4550445000000e+01\r\n311 264 -1.2077701000000e+01\r\n312 264 -8.0432156000000e+00\r\n1368 264 -2.3497534000000e+00\r\n217 265 -3.2667434000000e-01\r\n219 265 -3.4093212000000e-03\r\n262 265 -2.4321414000000e-03\r\n264 265 -2.5382928000000e-05\r\n265 265  5.7529329000000e+02\r\n267 265  6.3019063000000e-03\r\n268 265 -4.7552521000000e-02\r\n270 265 -4.9627962000000e-04\r\n313 265 -3.0674308000000e-01\r\n315 265 -2.5241294000000e-04\r\n1369 265 -7.3306335000000e-02\r\n1371 265 -7.6505808000000e-04\r\n219 266 -4.4233411000000e+00\r\n264 266 -4.7709720000000e+00\r\n265 266 -3.7636258000000e+02\r\n266 266 -1.0907205000000e+02\r\n267 266  2.0050582000000e+01\r\n270 266 -4.7241863000000e+00\r\n313 266  4.6208999000000e+01\r\n315 266 -4.7371923000000e+00\r\n1371 266 -1.3827379000000e+00\r\n219 267 -7.4772107000000e+00\r\n264 267 -8.0648511000000e+00\r\n265 267 -6.3620291000000e+02\r\n266 267  9.8474973000000e+01\r\n267 267  3.3893491000000e+01\r\n270 267 -7.9857645000000e+00\r\n313 267  7.8111643000000e+01\r\n314 267 -1.2595337000000e+01\r\n315 267 -8.0077441000000e+00\r\n1371 267 -2.3373788000000e+00\r\n220 268 -3.2665177000000e-01\r\n222 268 -3.4090856000000e-03\r\n265 268 -6.3767677000000e-02\r\n267 268 -4.9627962000000e-04\r\n268 268  5.7538353000000e+02\r\n270 268  6.6288635000000e-03\r\n271 268 -2.4141033000000e-03\r\n273 268 -2.5194674000000e-05\r\n316 268 -3.7051672000000e-01\r\n318 268 -4.9508786000000e-04\r\n1372 268 -8.0441990000000e-02\r\n1374 268 -8.3952900000000e-04\r\n222 269 -4.4248029000000e+00\r\n265 269  1.5957294000000e+00\r\n267 269 -4.7241863000000e+00\r\n268 269 -3.7965795000000e+02\r\n269 269 -1.0888646000000e+02\r\n270 269  2.0020417000000e+01\r\n273 269 -4.7703035000000e+00\r\n316 269  4.7904941000000e+01\r\n318 269 -4.7132973000000e+00\r\n1374 269 -1.3756968000000e+00\r\n222 270 -7.4796868000000e+00\r\n265 270  2.6974210000000e+00\r\n266 270 -4.3276435000000e-01\r\n267 270 -7.9857645000000e+00\r\n268 270 -6.4177380000000e+02\r\n269 270  9.9168081000000e+01\r\n270 270  3.3842508000000e+01\r\n273 270 -8.0637164000000e+00\r\n316 270  8.0978512000000e+01\r\n317 270 -1.2991897000000e+01\r\n318 270 -7.9673577000000e+00\r\n1374 270 -2.3254778000000e+00\r\n223 271 -2.6869291000000e-01\r\n225 271 -2.8042008000000e-03\r\n268 271 -6.3581913000000e-02\r\n270 271 -2.5194674000000e-05\r\n271 271  5.7525873000000e+02\r\n273 271  4.8382758000000e-03\r\n274 271 -2.3029972000000e-03\r\n276 271 -2.4035121000000e-05\r\n319 271 -3.3088133000000e-01\r\n321 271 -2.5145119000000e-05\r\n1375 271 -5.9007951000000e-02\r\n1377 271 -6.1583367000000e-04\r\n225 272 -4.3874214000000e+00\r\n268 272  3.5641332000000e+00\r\n270 272 -4.7703035000000e+00\r\n271 272 -3.8200388000000e+02\r\n272 272 -1.0924551000000e+02\r\n273 272  1.9950620000000e+01\r\n276 272 -4.6228863000000e+00\r\n319 272  4.8289200000000e+01\r\n321 272 -4.7614281000000e+00\r\n1377 272 -1.3964088000000e+00\r\n225 273 -7.4164918000000e+00\r\n268 273  6.0248073000000e+00\r\n269 273 -9.7606576000000e-01\r\n270 273 -8.0637164000000e+00\r\n271 273 -6.4573900000000e+02\r\n272 273  1.0020851000000e+02\r\n273 273  3.3724511000000e+01\r\n276 273 -7.8145269000000e+00\r\n319 273  8.1628018000000e+01\r\n320 273 -1.3224376000000e+01\r\n321 273 -8.0487133000000e+00\r\n1377 273 -2.3604874000000e+00\r\n226 274 -1.7997422000000e-01\r\n228 274 -1.8782924000000e-03\r\n271 274 -1.1448077000000e-01\r\n273 274 -2.4035121000000e-05\r\n274 274  5.4067833000000e+02\r\n276 274  3.2197793000000e-03\r\n277 274 -2.1259208000000e-03\r\n279 274 -2.2187071000000e-05\r\n322 274 -3.0833229000000e-01\r\n324 274 -2.3990032000000e-05\r\n1378 274 -1.3839797000000e-02\r\n1380 274 -8.0577291000000e-06\r\n228 275 -4.1932912000000e+00\r\n271 275  5.7457621000000e+00\r\n273 275 -4.6228863000000e+00\r\n274 275 -3.6306423000000e+02\r\n275 275 -1.0269365000000e+02\r\n276 275  1.9287736000000e+01\r\n279 275 -4.3364913000000e+00\r\n322 275  4.6980387000000e+01\r\n324 275 -4.6146947000000e+00\r\n1380 275 -1.5089297000000e+00\r\n228 276 -7.0883394000000e+00\r\n271 276  9.7126360000000e+00\r\n272 276 -1.5735346000000e+00\r\n273 276 -7.8145269000000e+00\r\n274 276 -6.1372377000000e+02\r\n275 276  9.5280061000000e+01\r\n276 276  3.2603984000000e+01\r\n279 276 -7.3304000000000e+00\r\n322 276  7.9415645000000e+01\r\n323 276 -1.2866050000000e+01\r\n324 276 -7.8006799000000e+00\r\n1380 276 -2.5506948000000e+00\r\n229 277 -1.1666583000000e-01\r\n231 277 -1.2175774000000e-03\r\n274 277 -1.5370768000000e-01\r\n276 277 -2.2187071000000e-05\r\n277 277  5.0616727000000e+02\r\n279 277  2.4728039000000e-03\r\n280 277 -1.9243063000000e-03\r\n282 277 -2.0082931000000e-05\r\n325 277 -2.6547366000000e-01\r\n327 277 -2.1915232000000e-05\r\n1381 277 -4.5514360000000e-02\r\n1383 277 -8.4730171000000e-06\r\n231 278 -3.9198308000000e+00\r\n274 278  7.8590684000000e+00\r\n276 278 -4.3364913000000e+00\r\n277 278 -3.4227959000000e+02\r\n278 278 -9.6142388000000e+01\r\n279 278  1.8194383000000e+01\r\n282 278 -3.9985084000000e+00\r\n325 278  4.3895681000000e+01\r\n327 278 -4.2838474000000e+00\r\n1383 278 -1.6449913000000e+00\r\n231 279 -6.6260765000000e+00\r\n274 279  1.3284960000000e+01\r\n275 279 -2.1523019000000e+00\r\n276 279 -7.3304000000000e+00\r\n277 279 -5.7858903000000e+02\r\n278 279  8.9845061000000e+01\r\n279 279  3.0755768000000e+01\r\n282 279 -6.7590784000000e+00\r\n325 279  7.4201208000000e+01\r\n326 279 -1.2021368000000e+01\r\n327 279 -7.2414106000000e+00\r\n1383 279 -2.7806916000000e+00\r\n232 280 -2.7786973000000e-02\r\n234 280 -2.8999742000000e-04\r\n277 280 -1.4812760000000e-01\r\n279 280 -2.0082931000000e-05\r\n280 280  4.6009423000000e+02\r\n282 280  1.4319779000000e-03\r\n283 280 -1.7349305000000e-03\r\n285 280 -1.8106519000000e-05\r\n328 280 -2.3696305000000e-01\r\n330 280 -1.9590447000000e-05\r\n1384 280 -5.8360867000000e-02\r\n1386 280 -9.1538248000000e-06\r\n234 281 -3.6819706000000e+00\r\n277 281  9.5606028000000e+00\r\n279 281 -3.9985084000000e+00\r\n280 281 -3.1505563000000e+02\r\n281 281 -8.7403089000000e+01\r\n282 281  1.7081396000000e+01\r\n285 281 -3.6678429000000e+00\r\n328 281  4.1382436000000e+01\r\n330 281 -3.9008968000000e+00\r\n1386 281 -1.8224369000000e+00\r\n234 282 -6.2240031000000e+00\r\n277 282  1.6161243000000e+01\r\n278 282 -2.6183124000000e+00\r\n279 282 -6.7590784000000e+00\r\n280 282 -5.3257003000000e+02\r\n281 282  8.2741962000000e+01\r\n282 282  2.8874387000000e+01\r\n285 282 -6.2001176000000e+00\r\n328 282  6.9952869000000e+01\r\n329 282 -1.1333192000000e+01\r\n330 282 -6.5940759000000e+00\r\n1386 282 -3.0806474000000e+00\r\n235 283 -1.5968212000000e-03\r\n237 283 -1.6665148000000e-05\r\n280 283 -1.6533186000000e-01\r\n282 283 -1.8106519000000e-05\r\n283 283  4.2564353000000e+02\r\n285 283  1.0727203000000e-03\r\n286 283 -1.5518553000000e-03\r\n288 283 -1.6195864000000e-05\r\n331 283 -2.6510563000000e-01\r\n333 283 -1.7618593000000e-05\r\n1387 283 -5.9577134000000e-02\r\n1389 283 -9.7283995000000e-06\r\n237 284 -3.4229940000000e+00\r\n280 284  1.1886166000000e+01\r\n282 284 -3.6678429000000e+00\r\n283 284 -2.9901873000000e+02\r\n284 284 -8.0847251000000e+01\r\n285 284  1.6020787000000e+01\r\n288 284 -3.3809302000000e+00\r\n331 284  4.2827330000000e+01\r\n333 284 -3.5694188000000e+00\r\n1389 284 -1.9705921000000e+00\r\n237 285 -5.7862261000000e+00\r\n280 285  2.0092362000000e+01\r\n281 285 -3.2552296000000e+00\r\n282 285 -6.2001176000000e+00\r\n283 285 -5.0546093000000e+02\r\n284 285  7.8617985000000e+01\r\n285 285  2.7081526000000e+01\r\n288 285 -5.7151243000000e+00\r\n331 285  7.2395271000000e+01\r\n332 285 -1.1728997000000e+01\r\n333 285 -6.0337414000000e+00\r\n1389 285 -3.3310866000000e+00\r\n238 286 -1.4489610000000e-03\r\n240 286 -1.5122013000000e-05\r\n283 286 -2.6775677000000e-01\r\n285 286 -1.6195864000000e-05\r\n286 286  3.9101108000000e+02\r\n288 286  9.5535783000000e-04\r\n1390 286 -5.9779534000000e-02\r\n1392 286 -1.0278589000000e-05\r\n240 287 -3.1862433000000e+00\r\n283 287  2.0669061000000e+01\r\n285 287 -3.3809302000000e+00\r\n286 287 -2.4516982000000e+02\r\n287 287 -7.4289358000000e+01\r\n288 287  8.7210274000000e+00\r\n1392 287 -2.1455762000000e+00\r\n240 288 -5.3860258000000e+00\r\n283 288  3.4938980000000e+01\r\n284 288 -5.6606570000000e+00\r\n285 288 -5.7151243000000e+00\r\n286 288 -4.1443506000000e+02\r\n287 288  6.4143619000000e+01\r\n288 288  1.4742025000000e+01\r\n1392 288 -3.6268820000000e+00\r\n289 289  1.0000000000000e+00\r\n290 290  1.0000000000000e+00\r\n291 291  1.0000000000000e+00\r\n292 292  1.0000000000000e+00\r\n293 293  1.0000000000000e+00\r\n294 294  1.0000000000000e+00\r\n295 295  1.0000000000000e+00\r\n296 296  1.0000000000000e+00\r\n297 297  1.0000000000000e+00\r\n298 298  1.0000000000000e+00\r\n299 299  1.0000000000000e+00\r\n300 300  1.0000000000000e+00\r\n301 301  1.0000000000000e+00\r\n302 302  1.0000000000000e+00\r\n303 303  1.0000000000000e+00\r\n256 304 -2.3853116000000e-03\r\n258 304 -2.4894191000000e-05\r\n304 304  5.7485382000000e+02\r\n306 304  1.4276539000000e-03\r\n307 304 -6.9040852000000e-02\r\n309 304 -2.5585438000000e-05\r\n352 304 -2.3914903000000e-01\r\n354 304 -2.5509959000000e-05\r\n1408 304 -5.5206415000000e-02\r\n1410 304 -7.8195004000000e-06\r\n258 305 -4.7620287000000e+00\r\n304 305 -3.7818800000000e+02\r\n305 305 -1.0026451000000e+02\r\n306 305  1.5762163000000e+01\r\n307 305  1.9554283000000e+00\r\n309 305 -4.7716102000000e+00\r\n352 305  4.6140393000000e+01\r\n354 305 -4.7580907000000e+00\r\n1410 305 -1.4582423000000e+00\r\n258 306 -8.0497333000000e+00\r\n304 306 -6.3928900000000e+02\r\n305 306  1.1431216000000e+02\r\n306 306  2.6644360000000e+01\r\n307 306  3.3054560000000e+00\r\n308 306 -5.3550504000000e-01\r\n309 306 -8.0659299000000e+00\r\n352 306  7.7995721000000e+01\r\n353 306 -1.2635806000000e+01\r\n354 306 -8.0430765000000e+00\r\n1410 306 -2.4650128000000e+00\r\n259 307 -2.3985799000000e-03\r\n261 307 -2.5032665000000e-05\r\n304 307 -2.4515455000000e-03\r\n306 307 -2.5585438000000e-05\r\n307 307  5.7486458000000e+02\r\n309 307  1.4534908000000e-03\r\n310 307 -8.0982370000000e-02\r\n312 307 -2.5634127000000e-05\r\n355 307 -2.3200970000000e-01\r\n357 307 -2.5550840000000e-05\r\n1411 307 -5.5119630000000e-02\r\n1413 307 -7.8381908000000e-06\r\n261 308 -4.7606802000000e+00\r\n306 308 -4.7716102000000e+00\r\n307 308 -3.8094393000000e+02\r\n308 308 -1.0928573000000e+02\r\n309 308  2.0531953000000e+01\r\n310 308  3.1282473000000e+00\r\n312 308 -4.7717070000000e+00\r\n355 308  4.7718748000000e+01\r\n357 308 -4.7567900000000e+00\r\n1413 308 -1.4589760000000e+00\r\n261 309 -8.0474488000000e+00\r\n306 309 -8.0659299000000e+00\r\n307 309 -6.4394718000000e+02\r\n308 309  9.9820041000000e+01\r\n309 309  3.4707196000000e+01\r\n310 309  5.2879856000000e+00\r\n311 309 -8.5668723000000e-01\r\n312 309 -8.0660879000000e+00\r\n355 309  8.0663716000000e+01\r\n356 309 -1.3068034000000e+01\r\n357 309 -8.0408723000000e+00\r\n1413 309 -2.4662515000000e+00\r\n262 310 -2.4253612000000e-03\r\n264 310 -2.5312166000000e-05\r\n307 310 -2.4562108000000e-03\r\n309 310 -2.5634127000000e-05\r\n310 310  5.7484861000000e+02\r\n312 310  1.4539954000000e-03\r\n313 310 -5.1146276000000e-02\r\n315 310 -2.5710072000000e-05\r\n358 310 -2.4387167000000e-01\r\n360 310 -2.5618235000000e-05\r\n1414 310 -5.3671820000000e-02\r\n1416 310 -7.8650378000000e-06\r\n264 311 -4.7581730000000e+00\r\n309 311 -4.7717070000000e+00\r\n310 311 -3.8375362000000e+02\r\n311 311 -1.0928258000000e+02\r\n312 311  2.0527605000000e+01\r\n313 311  2.4899798000000e+00\r\n315 311 -4.7718289000000e+00\r\n358 311  5.1162626000000e+01\r\n360 311 -4.7553911000000e+00\r\n1416 311 -1.4583174000000e+00\r\n264 312 -8.0432156000000e+00\r\n309 312 -8.0660879000000e+00\r\n310 312 -6.4869713000000e+02\r\n311 312  1.0059674000000e+02\r\n312 312  3.4699859000000e+01\r\n313 312  4.2090618000000e+00\r\n314 312 -6.8189325000000e-01\r\n315 312 -8.0662996000000e+00\r\n358 312  8.6485303000000e+01\r\n359 312 -1.4011138000000e+01\r\n360 312 -8.0385130000000e+00\r\n1416 312 -2.4651397000000e+00\r\n265 313 -2.4185703000000e-02\r\n267 313 -2.5241294000000e-04\r\n310 313 -2.4634877000000e-03\r\n312 313 -2.5710072000000e-05\r\n313 313  5.7490045000000e+02\r\n315 313  1.6813887000000e-03\r\n316 313 -2.6877149000000e-02\r\n318 313 -2.5804428000000e-05\r\n361 313 -3.0468985000000e-01\r\n363 313 -2.5711604000000e-05\r\n1417 313 -4.6162916000000e-02\r\n1419 313 -7.8893794000000e-06\r\n267 314 -4.7371923000000e+00\r\n312 314 -4.7718289000000e+00\r\n313 314 -3.8505782000000e+02\r\n314 314 -1.0928134000000e+02\r\n315 314  2.0498379000000e+01\r\n316 314  1.0447785000000e-01\r\n318 314 -4.7717809000000e+00\r\n361 314  5.4850702000000e+01\r\n363 314 -4.7552271000000e+00\r\n1419 314 -1.4501622000000e+00\r\n267 315 -8.0077441000000e+00\r\n312 315 -8.0662996000000e+00\r\n313 315 -6.5090125000000e+02\r\n314 315  1.0095682000000e+02\r\n315 315  3.4650441000000e+01\r\n316 315  1.7660924000000e-01\r\n317 315 -2.8611716000000e-02\r\n318 315 -8.0662125000000e+00\r\n361 315  9.2719559000000e+01\r\n362 315 -1.5021105000000e+01\r\n363 315 -8.0382301000000e+00\r\n1419 315 -2.4513525000000e+00\r\n268 316 -4.7438329000000e-02\r\n270 316 -4.9508786000000e-04\r\n313 316 -2.4725287000000e-03\r\n315 316 -2.5804428000000e-05\r\n316 316  5.7491829000000e+02\r\n318 316  1.9241236000000e-03\r\n319 316 -2.4623592000000e-03\r\n321 316 -2.5698295000000e-05\r\n364 316 -3.2828139000000e-01\r\n366 316 -2.5763098000000e-05\r\n1420 316 -3.9116784000000e-02\r\n1422 316 -7.9051779000000e-06\r\n270 317 -4.7132973000000e+00\r\n315 317 -4.7717809000000e+00\r\n316 317 -3.8727296000000e+02\r\n317 317 -1.0025400000000e+02\r\n318 317  2.0466586000000e+01\r\n321 317 -4.7712987000000e+00\r\n364 317  5.7167553000000e+01\r\n366 317 -4.7551848000000e+00\r\n1422 317 -1.4428372000000e+00\r\n270 318 -7.9673577000000e+00\r\n315 318 -8.0662125000000e+00\r\n316 318 -6.5464621000000e+02\r\n317 318  1.1682452000000e+02\r\n318 318  3.4596706000000e+01\r\n321 318 -8.0653990000000e+00\r\n364 318  9.6636031000000e+01\r\n365 318 -1.5655569000000e+01\r\n366 318 -8.0381643000000e+00\r\n1422 318 -2.4389721000000e+00\r\n271 319 -2.4093550000000e-03\r\n273 319 -2.5145119000000e-05\r\n316 319 -5.8354240000000e-02\r\n318 319 -2.5698295000000e-05\r\n319 319  5.7493642000000e+02\r\n321 319  1.4537194000000e-03\r\n322 319 -2.4482718000000e-03\r\n324 319 -2.5551272000000e-05\r\n367 319 -3.2882232000000e-01\r\n369 319 -2.5608416000000e-05\r\n1423 319 -4.6988259000000e-02\r\n1425 319 -7.8592885000000e-06\r\n273 320 -4.7614281000000e+00\r\n316 320  3.1989950000000e+00\r\n318 320 -4.7712987000000e+00\r\n319 320 -3.9052649000000e+02\r\n320 320 -1.0928015000000e+02\r\n321 320  2.0521060000000e+01\r\n324 320 -4.7704788000000e+00\r\n367 320  5.7223219000000e+01\r\n369 320 -4.7552192000000e+00\r\n1425 320 -1.4504481000000e+00\r\n273 321 -8.0487133000000e+00\r\n316 321  5.4075782000000e+00\r\n317 321 -8.7606062000000e-01\r\n318 321 -8.0653990000000e+00\r\n319 321 -6.6014561000000e+02\r\n320 321  1.0245752000000e+02\r\n321 321  3.4688785000000e+01\r\n324 321 -8.0640173000000e+00\r\n367 321  9.6730076000000e+01\r\n368 321 -1.5670861000000e+01\r\n369 321 -8.0382181000000e+00\r\n1425 321 -2.4518359000000e+00\r\n274 322 -2.2986769000000e-03\r\n276 322 -2.3990032000000e-05\r\n319 322 -1.3090690000000e-01\r\n321 322 -2.5551272000000e-05\r\n322 322  5.7501910000000e+02\r\n324 322  1.4509787000000e-03\r\n325 322 -2.3278464000000e-03\r\n327 322 -2.4294459000000e-05\r\n370 322 -3.3392357000000e-01\r\n372 322 -2.5481281000000e-05\r\n1426 322 -5.6475911000000e-02\r\n1428 322 -7.8137698000000e-06\r\n276 323 -4.6146947000000e+00\r\n319 323  5.7425527000000e+00\r\n321 323 -4.7704788000000e+00\r\n322 323 -3.9129491000000e+02\r\n323 323 -1.0928448000000e+02\r\n324 323  2.0186025000000e+01\r\n327 323 -4.5718624000000e+00\r\n370 323  5.5453699000000e+01\r\n372 323 -4.7580243000000e+00\r\n1428 323 -1.4587762000000e+00\r\n276 324 -7.8006799000000e+00\r\n319 324  9.7072109000000e+00\r\n320 324 -1.5726313000000e+00\r\n321 324 -8.0640173000000e+00\r\n322 324 -6.6144491000000e+02\r\n323 324  1.0265780000000e+02\r\n324 324  3.4122453000000e+01\r\n327 324 -7.7282720000000e+00\r\n370 324  9.3738933000000e+01\r\n371 324 -1.5186317000000e+01\r\n372 324 -8.0429643000000e+00\r\n1428 324 -2.4659153000000e+00\r\n277 325 -2.0998737000000e-03\r\n279 325 -2.1915232000000e-05\r\n322 325 -1.8420454000000e-01\r\n324 325 -2.4294459000000e-05\r\n325 325  5.2909333000000e+02\r\n327 325  1.3365414000000e-03\r\n328 325 -2.1140734000000e-03\r\n330 325 -2.2063427000000e-05\r\n373 325 -3.2053148000000e-01\r\n375 325 -2.3521242000000e-05\r\n1429 325 -5.7097011000000e-02\r\n1431 325 -8.4205212000000e-06\r\n279 326 -4.2838474000000e+00\r\n322 326  7.9814062000000e+00\r\n324 326 -4.5718624000000e+00\r\n325 326 -3.6183494000000e+02\r\n326 326 -1.0054776000000e+02\r\n327 326  1.9068643000000e+01\r\n330 326 -4.1902376000000e+00\r\n373 326  5.0170634000000e+01\r\n375 326 -4.4269149000000e+00\r\n1431 326 -1.5845640000000e+00\r\n279 327 -7.2414106000000e+00\r\n322 327  1.3491762000000e+01\r\n323 327 -2.1857632000000e+00\r\n324 327 -7.7282720000000e+00\r\n325 327 -6.1164545000000e+02\r\n326 327  9.4936056000000e+01\r\n327 327  3.2233618000000e+01\r\n330 327 -7.0831776000000e+00\r\n373 327  8.4808394000000e+01\r\n374 327 -1.3739575000000e+01\r\n375 327 -7.4832529000000e+00\r\n1431 327 -2.6785451000000e+00\r\n280 328 -1.8771175000000e-03\r\n282 328 -1.9590447000000e-05\r\n325 328 -1.6038550000000e-01\r\n327 328 -2.2063427000000e-05\r\n328 328  4.8305359000000e+02\r\n330 328  1.2210278000000e-03\r\n331 328 -1.9047534000000e-03\r\n333 328 -1.9878868000000e-05\r\n376 328 -2.6610429000000e-01\r\n378 328 -2.1544321000000e-05\r\n1432 328 -5.7996357000000e-02\r\n1434 328 -9.1411352000000e-06\r\n282 329 -3.9008968000000e+00\r\n325 329  8.5022034000000e+00\r\n327 329 -4.1902376000000e+00\r\n328 329 -3.3090803000000e+02\r\n329 329 -9.1807741000000e+01\r\n330 329  1.7737475000000e+01\r\n333 329 -3.8079455000000e+00\r\n376 329  4.5134249000000e+01\r\n378 329 -4.0921523000000e+00\r\n1434 329 -1.7360007000000e+00\r\n282 330 -6.5940759000000e+00\r\n325 330  1.4372125000000e+01\r\n326 330 -2.3283983000000e+00\r\n327 330 -7.0831776000000e+00\r\n328 330 -5.5936694000000e+02\r\n329 330  8.6820392000000e+01\r\n330 330  2.9983424000000e+01\r\n333 330 -6.4369470000000e+00\r\n376 330  7.6294935000000e+01\r\n377 330 -1.2360385000000e+01\r\n378 330 -6.9173742000000e+00\r\n1434 330 -2.9345355000000e+00\r\n283 331 -1.6881784000000e-03\r\n285 331 -1.7618593000000e-05\r\n328 331 -1.2017962000000e-01\r\n330 331 -1.9878868000000e-05\r\n331 331  4.3702283000000e+02\r\n333 331  1.0881647000000e-03\r\n379 331 -2.3734229000000e-01\r\n381 331 -1.9354806000000e-05\r\n1435 331 -5.8560585000000e-02\r\n1437 331 -1.0017061000000e-05\r\n285 332 -3.5694188000000e+00\r\n328 332  7.0459977000000e+00\r\n330 332 -3.8079455000000e+00\r\n331 332 -2.9843639000000e+02\r\n332 332 -8.3065671000000e+01\r\n333 332  1.3013397000000e+01\r\n379 332  4.0527498000000e+01\r\n381 332 -3.7079928000000e+00\r\n1437 332 -1.9187718000000e+00\r\n285 333 -6.0337414000000e+00\r\n328 333  1.1910547000000e+01\r\n329 333 -1.9296126000000e+00\r\n330 333 -6.4369470000000e+00\r\n331 333 -5.0447656000000e+02\r\n332 333  7.8286656000000e+01\r\n333 333  2.1997831000000e+01\r\n379 333  6.8507639000000e+01\r\n380 333 -1.1098836000000e+01\r\n381 333 -6.2679871000000e+00\r\n1437 333 -3.2434895000000e+00\r\n334 334  1.0000000000000e+00\r\n335 335  1.0000000000000e+00\r\n336 336  1.0000000000000e+00\r\n337 337  1.0000000000000e+00\r\n338 338  1.0000000000000e+00\r\n339 339  1.0000000000000e+00\r\n340 340  1.0000000000000e+00\r\n341 341  1.0000000000000e+00\r\n342 342  1.0000000000000e+00\r\n343 343  1.0000000000000e+00\r\n344 344  1.0000000000000e+00\r\n345 345  1.0000000000000e+00\r\n346 346  1.0000000000000e+00\r\n347 347  1.0000000000000e+00\r\n348 348  1.0000000000000e+00\r\n349 349  1.0000000000000e+00\r\n350 350  1.0000000000000e+00\r\n351 351  1.0000000000000e+00\r\n304 352 -2.4443132000000e-03\r\n306 352 -2.5509959000000e-05\r\n352 352  5.7478946000000e+02\r\n354 352  1.4296456000000e-03\r\n355 352 -6.2044278000000e-02\r\n357 352 -2.6688160000000e-05\r\n400 352 -2.2352072000000e-01\r\n402 352 -2.5425414000000e-05\r\n1456 352 -5.6169102000000e-02\r\n1458 352 -8.1663047000000e-06\r\n306 353 -4.7580907000000e+00\r\n352 353 -3.8266089000000e+02\r\n353 353 -1.0030582000000e+02\r\n354 353  1.5551099000000e+01\r\n355 353  3.5517256000000e+00\r\n357 353 -4.7728386000000e+00\r\n400 353  4.9071106000000e+01\r\n402 353 -4.5475998000000e+00\r\n1458 353 -1.4603618000000e+00\r\n306 354 -8.0430765000000e+00\r\n352 354 -6.4684997000000e+02\r\n353 354  1.1543532000000e+02\r\n354 354  2.6287578000000e+01\r\n355 354  6.0038370000000e+00\r\n356 354 -9.7263799000000e-01\r\n357 354 -8.0680064000000e+00\r\n400 354  8.2949797000000e+01\r\n401 354 -1.3438094000000e+01\r\n402 354 -7.6872627000000e+00\r\n1458 354 -2.4685955000000e+00\r\n307 355 -2.4482304000000e-03\r\n309 355 -2.5550840000000e-05\r\n352 355 -2.5572061000000e-03\r\n354 355 -2.6688160000000e-05\r\n355 355  5.7484386000000e+02\r\n357 355  1.4571430000000e-03\r\n358 355 -9.3051196000000e-02\r\n360 355 -2.6770459000000e-05\r\n403 355 -2.4476972000000e-01\r\n405 355 -2.6083358000000e-05\r\n1459 355 -5.5215162000000e-02\r\n1461 355 -8.1907446000000e-06\r\n309 356 -4.7567900000000e+00\r\n354 356 -4.7728386000000e+00\r\n355 356 -3.8785209000000e+02\r\n356 356 -1.0932835000000e+02\r\n357 356  2.0425388000000e+01\r\n358 356  6.5986580000000e+00\r\n360 356 -4.7726485000000e+00\r\n403 356  5.1214427000000e+01\r\n405 356 -4.6507363000000e+00\r\n1461 356 -1.4601662000000e+00\r\n309 357 -8.0408723000000e+00\r\n354 357 -8.0680064000000e+00\r\n355 357 -6.5562483000000e+02\r\n356 357  1.0160568000000e+02\r\n357 357  3.4527060000000e+01\r\n358 357  1.1154366000000e+01\r\n359 357 -1.8070354000000e+00\r\n360 357 -8.0676805000000e+00\r\n403 357  8.6572821000000e+01\r\n404 357 -1.4025016000000e+01\r\n405 357 -7.8616002000000e+00\r\n1461 357 -2.4682635000000e+00\r\n310 358 -2.4546880000000e-03\r\n312 358 -2.5618235000000e-05\r\n355 358 -2.5650918000000e-03\r\n357 358 -2.6770459000000e-05\r\n358 358  5.7493309000000e+02\r\n360 358  1.4582277000000e-03\r\n361 358 -1.1228963000000e-01\r\n363 358 -2.6928272000000e-05\r\n406 358 -3.1656758000000e-01\r\n408 358 -2.6806025000000e-05\r\n1462 358 -5.3682695000000e-02\r\n1464 358 -8.2386264000000e-06\r\n312 359 -4.7553911000000e+00\r\n357 359 -4.7726485000000e+00\r\n358 359 -3.9452018000000e+02\r\n359 359 -1.0932875000000e+02\r\n360 359  2.0524561000000e+01\r\n361 359  6.1930383000000e+00\r\n363 359 -4.7726177000000e+00\r\n406 359  5.8288778000000e+01\r\n408 359 -4.7516012000000e+00\r\n1464 359 -1.4600938000000e+00\r\n312 360 -8.0385130000000e+00\r\n357 360 -8.0676805000000e+00\r\n358 360 -6.6689692000000e+02\r\n359 360  1.0343025000000e+02\r\n360 360  3.4694713000000e+01\r\n361 360  1.0468712000000e+01\r\n362 360 -1.6959515000000e+00\r\n363 360 -8.0676330000000e+00\r\n406 360  9.8531351000000e+01\r\n407 360 -1.5962269000000e+01\r\n408 360 -8.0321067000000e+00\r\n1464 360 -2.4681426000000e+00\r\n313 361 -2.4636345000000e-03\r\n315 361 -2.5711604000000e-05\r\n358 361 -2.5802131000000e-03\r\n360 361 -2.6928272000000e-05\r\n361 361  5.7492132000000e+02\r\n363 361  1.4588529000000e-03\r\n364 361 -5.0668791000000e-02\r\n366 361 -2.7077998000000e-05\r\n409 361 -3.6617143000000e-01\r\n411 361 -2.6972819000000e-05\r\n1465 361 -5.2128653000000e-02\r\n1467 361 -8.2886627000000e-06\r\n315 362 -4.7552271000000e+00\r\n360 362 -4.7726177000000e+00\r\n361 362 -3.9794035000000e+02\r\n362 362 -1.0932680000000e+02\r\n363 362  2.0528588000000e+01\r\n364 362  2.4299921000000e+00\r\n366 362 -4.7727468000000e+00\r\n409 362  6.5469467000000e+01\r\n411 362 -4.7549139000000e+00\r\n1467 362 -1.4608747000000e+00\r\n315 363 -8.0382301000000e+00\r\n360 363 -8.0676330000000e+00\r\n361 363 -6.7267788000000e+02\r\n362 363  1.0437131000000e+02\r\n363 363  3.4701505000000e+01\r\n364 363  4.1076556000000e+00\r\n365 363 -6.6544656000000e-01\r\n366 363 -8.0678453000000e+00\r\n409 363  1.1066951000000e+02\r\n410 363 -1.7928632000000e+01\r\n411 363 -8.0377006000000e+00\r\n1467 363 -2.4694602000000e+00\r\n316 364 -2.4685685000000e-03\r\n318 364 -2.5763098000000e-05\r\n361 364 -2.5945596000000e-03\r\n363 364 -2.7077998000000e-05\r\n364 364  5.7491705000000e+02\r\n366 364  1.4591127000000e-03\r\n367 364 -2.5925027000000e-03\r\n369 364 -2.7056531000000e-05\r\n412 364 -4.0929373000000e-01\r\n414 364 -2.7031042000000e-05\r\n1468 364 -5.1377246000000e-02\r\n1470 364 -8.3065546000000e-06\r\n318 365 -4.7551848000000e+00\r\n363 365 -4.7727468000000e+00\r\n364 365 -3.9975022000000e+02\r\n365 365 -1.0932556000000e+02\r\n366 365  2.0528470000000e+01\r\n369 365 -4.7725660000000e+00\r\n412 365  6.9707805000000e+01\r\n414 365 -4.7549027000000e+00\r\n1470 365 -1.4608630000000e+00\r\n318 366 -8.0381643000000e+00\r\n363 366 -8.0678453000000e+00\r\n364 366 -6.7573777000000e+02\r\n365 366  1.0486962000000e+02\r\n366 366  3.4701317000000e+01\r\n369 366 -8.0675420000000e+00\r\n412 366  1.1783407000000e+02\r\n413 366 -1.9089266000000e+01\r\n414 366 -8.0376875000000e+00\r\n1470 366 -2.4694428000000e+00\r\n319 367 -2.4537472000000e-03\r\n321 367 -2.5608416000000e-05\r\n364 367 -5.7927708000000e-02\r\n366 367 -2.7056531000000e-05\r\n367 367  5.7495935000000e+02\r\n369 367  1.4586587000000e-03\r\n370 367 -2.5753546000000e-03\r\n372 367 -2.6877566000000e-05\r\n415 367 -3.9677260000000e-01\r\n417 367 -2.6960165000000e-05\r\n1471 367 -5.1990619000000e-02\r\n1473 367 -8.2830240000000e-06\r\n321 368 -4.7552192000000e+00\r\n364 368  3.1437670000000e+00\r\n366 368 -4.7725660000000e+00\r\n367 368 -4.0167152000000e+02\r\n368 368 -1.0932652000000e+02\r\n369 368  2.0529394000000e+01\r\n372 368 -4.7721327000000e+00\r\n415 368  6.8486522000000e+01\r\n417 368 -4.7562860000000e+00\r\n1473 368 -1.4609828000000e+00\r\n321 369 -8.0382181000000e+00\r\n364 369  5.3142214000000e+00\r\n365 369 -8.6091209000000e-01\r\n366 369 -8.0675420000000e+00\r\n367 369 -6.7898527000000e+02\r\n368 369  1.0539374000000e+02\r\n369 369  3.4702875000000e+01\r\n372 369 -8.0668130000000e+00\r\n415 369  1.1576957000000e+02\r\n416 369 -1.8754848000000e+01\r\n417 369 -8.0400223000000e+00\r\n1473 369 -2.4696437000000e+00\r\n322 370 -2.4415654000000e-03\r\n324 370 -2.5481281000000e-05\r\n367 370 -1.2610705000000e-01\r\n369 370 -2.6877566000000e-05\r\n370 370  5.7500724000000e+02\r\n372 370  1.4570466000000e-03\r\n373 370 -2.4732826000000e-03\r\n375 370 -2.5812297000000e-05\r\n418 370 -3.7633253000000e-01\r\n420 370 -2.6785208000000e-05\r\n1474 370 -5.3475055000000e-02\r\n1476 370 -8.2253849000000e-06\r\n324 371 -4.7580243000000e+00\r\n367 371  7.5519975000000e+00\r\n369 371 -4.7721327000000e+00\r\n370 371 -4.0178322000000e+02\r\n371 371 -1.0932794000000e+02\r\n372 371  2.0383029000000e+01\r\n375 371 -4.6239093000000e+00\r\n418 371  6.4191733000000e+01\r\n420 371 -4.7564077000000e+00\r\n1476 371 -1.4603466000000e+00\r\n324 372 -8.0429643000000e+00\r\n367 372  1.2765896000000e+01\r\n368 372 -2.0681019000000e+00\r\n369 372 -8.0668130000000e+00\r\n370 372 -6.7917436000000e+02\r\n371 372  1.0542131000000e+02\r\n372 372  3.4455466000000e+01\r\n375 372 -7.8162509000000e+00\r\n418 372  1.0850970000000e+02\r\n419 372 -1.7578799000000e+01\r\n420 372 -8.0402315000000e+00\r\n1476 372 -2.4685699000000e+00\r\n325 373 -2.2537584000000e-03\r\n327 373 -2.3521242000000e-05\r\n370 373 -1.7606838000000e-01\r\n372 373 -2.5812297000000e-05\r\n373 373  5.4055330000000e+02\r\n375 373  1.3706714000000e-03\r\n376 373 -2.2970968000000e-03\r\n378 373 -2.3973542000000e-05\r\n421 373 -3.4175937000000e-01\r\n423 373 -2.5475303000000e-05\r\n1477 373 -5.4844342000000e-02\r\n1479 373 -8.6688503000000e-06\r\n327 374 -4.4269149000000e+00\r\n370 374  9.5580479000000e+00\r\n372 374 -4.6239093000000e+00\r\n373 374 -3.7674337000000e+02\r\n374 374 -1.0277157000000e+02\r\n375 374  1.9517038000000e+01\r\n378 374 -4.3377454000000e+00\r\n421 374  5.6952369000000e+01\r\n423 374 -4.5641563000000e+00\r\n1479 374 -1.5528349000000e+00\r\n327 375 -7.4832529000000e+00\r\n370 375  1.6156913000000e+01\r\n371 375 -2.6174681000000e+00\r\n372 375 -7.8162509000000e+00\r\n373 375 -6.3684655000000e+02\r\n374 375  9.8833318000000e+01\r\n375 375  3.2991584000000e+01\r\n378 375 -7.3325248000000e+00\r\n421 375  9.6272217000000e+01\r\n422 375 -1.5596386000000e+01\r\n423 375 -7.7152444000000e+00\r\n1479 375 -2.6249103000000e+00\r\n328 376 -2.0643337000000e-03\r\n330 376 -2.1544321000000e-05\r\n373 376 -1.9807344000000e-01\r\n375 376 -2.3973542000000e-05\r\n376 376  5.0605598000000e+02\r\n378 376  1.2828126000000e-03\r\n379 376 -2.1007017000000e-03\r\n381 376 -2.1923874000000e-05\r\n424 376 -2.9231577000000e-01\r\n426 376 -2.3634552000000e-05\r\n1480 376 -5.6318974000000e-02\r\n1482 376 -9.1602712000000e-06\r\n330 377 -4.0921523000000e+00\r\n373 377  1.0116997000000e+01\r\n375 377 -4.3377454000000e+00\r\n376 377 -3.4911006000000e+02\r\n377 377 -9.6216272000000e+01\r\n378 377  1.8374990000000e+01\r\n381 377 -4.0000020000000e+00\r\n424 377  4.8568136000000e+01\r\n426 377 -4.2769539000000e+00\r\n1482 377 -1.6573901000000e+00\r\n330 378 -6.9173742000000e+00\r\n373 378  1.7101772000000e+01\r\n374 378 -2.7705515000000e+00\r\n375 378 -7.3325248000000e+00\r\n376 378 -5.9013565000000e+02\r\n377 378  9.1532256000000e+01\r\n378 378  3.1061078000000e+01\r\n381 378 -6.7615985000000e+00\r\n424 378  8.2099576000000e+01\r\n425 378 -1.3300440000000e+01\r\n426 378 -7.2297629000000e+00\r\n1482 378 -2.8016522000000e+00\r\n331 379 -1.8545388000000e-03\r\n333 379 -1.9354806000000e-05\r\n376 379 -1.3037112000000e-01\r\n378 379 -2.1923874000000e-05\r\n379 379  4.5988358000000e+02\r\n381 379  1.1474481000000e-03\r\n427 379 -1.4544903000000e-01\r\n429 379 -2.1098457000000e-05\r\n1483 379 -5.7318543000000e-02\r\n1485 379 -1.0010604000000e-05\r\n333 380 -3.7079928000000e+00\r\n376 380  7.7991083000000e+00\r\n378 380 -4.0000020000000e+00\r\n379 380 -3.0975874000000e+02\r\n380 380 -8.7470802000000e+01\r\n381 380  1.3394024000000e+01\r\n427 380  3.7938706000000e+01\r\n429 380 -3.8499013000000e+00\r\n1485 380 -1.8263584000000e+00\r\n333 381 -6.2679871000000e+00\r\n376 381  1.3183603000000e+01\r\n377 381 -2.1358043000000e+00\r\n378 381 -6.7615985000000e+00\r\n379 381 -5.2361580000000e+02\r\n380 381  8.1123098000000e+01\r\n381 381  2.2641243000000e+01\r\n427 381  6.4131542000000e+01\r\n428 381 -1.0389604000000e+01\r\n429 381 -6.5078683000000e+00\r\n1485 381 -3.0872741000000e+00\r\n382 382  1.0000000000000e+00\r\n383 383  1.0000000000000e+00\r\n384 384  1.0000000000000e+00\r\n385 385  1.0000000000000e+00\r\n386 386  1.0000000000000e+00\r\n387 387  1.0000000000000e+00\r\n388 388  1.0000000000000e+00\r\n389 389  1.0000000000000e+00\r\n390 390  1.0000000000000e+00\r\n391 391  1.0000000000000e+00\r\n392 392  1.0000000000000e+00\r\n393 393  1.0000000000000e+00\r\n394 394  1.0000000000000e+00\r\n395 395  1.0000000000000e+00\r\n396 396  1.0000000000000e+00\r\n397 397  5.0551705000000e+02\r\n399 397  1.2406478000000e-03\r\n400 397 -2.4057914000000e-03\r\n402 397 -2.5107928000000e-05\r\n445 397 -2.2066738000000e-03\r\n447 397 -2.3029846000000e-05\r\n1501 397 -5.7686407000000e-02\r\n1503 397 -9.9051999000000e-06\r\n397 398 -3.1019601000000e+02\r\n398 398 -9.6262683000000e+01\r\n399 398  9.7862578000000e+00\r\n402 398 -4.2940391000000e+00\r\n445 398  1.9835020000000e+01\r\n447 398 -3.8097221000000e+00\r\n1503 398 -1.6717298000000e+00\r\n397 399 -5.2435500000000e+02\r\n398 399  8.0758997000000e+01\r\n399 399  1.6542684000000e+01\r\n402 399 -7.2586437000000e+00\r\n445 399  3.3529096000000e+01\r\n446 399 -5.4316301000000e+00\r\n447 399 -6.4399502000000e+00\r\n1503 399 -2.8258900000000e+00\r\n352 400 -2.4362123000000e-03\r\n354 400 -2.5425414000000e-05\r\n397 400 -7.4876051000000e-02\r\n399 400 -2.5107928000000e-05\r\n400 400  5.2865880000000e+02\r\n402 400  1.3461324000000e-03\r\n403 400 -7.3997074000000e-02\r\n405 400 -2.6227671000000e-05\r\n448 400 -8.4434598000000e-03\r\n450 400 -2.3686270000000e-05\r\n1504 400 -5.6046068000000e-02\r\n1506 400 -9.3289205000000e-06\r\n354 401 -4.5475998000000e+00\r\n397 401  1.3837884000000e+01\r\n399 401 -4.2940391000000e+00\r\n400 401 -3.5889487000000e+02\r\n401 401 -1.0062627000000e+02\r\n402 401  1.8984973000000e+01\r\n403 401  4.3310283000000e+00\r\n405 401 -4.4853735000000e+00\r\n448 401  3.7150315000000e+01\r\n450 401 -4.0513848000000e+00\r\n1506 401 -1.5953249000000e+00\r\n354 402 -7.6872627000000e+00\r\n397 402  2.3391558000000e+01\r\n398 402 -3.7894005000000e+00\r\n399 402 -7.2586437000000e+00\r\n400 402 -6.0667588000000e+02\r\n401 402  9.3934360000000e+01\r\n402 402  3.2092198000000e+01\r\n403 402  7.3211702000000e+00\r\n404 402 -1.1860196000000e+00\r\n405 402 -7.5820754000000e+00\r\n448 402  6.2798893000000e+01\r\n449 402 -1.0173335000000e+01\r\n450 402 -6.8484609000000e+00\r\n1506 402 -2.6967372000000e+00\r\n355 403 -2.4992552000000e-03\r\n357 403 -2.6083358000000e-05\r\n400 403 -2.5130830000000e-03\r\n402 403 -2.6227671000000e-05\r\n403 403  5.5177232000000e+02\r\n405 403  1.4044010000000e-03\r\n406 403 -1.5668612000000e-01\r\n408 403 -2.7455381000000e-05\r\n451 403 -1.3782599000000e-01\r\n453 403 -2.5552152000000e-05\r\n1507 403 -5.3265675000000e-02\r\n1509 403 -8.9667033000000e-06\r\n357 404 -4.6507363000000e+00\r\n402 404 -4.4853735000000e+00\r\n403 404 -3.7906662000000e+02\r\n404 404 -1.0500044000000e+02\r\n405 404  1.9704360000000e+01\r\n406 404  1.2333979000000e+01\r\n408 404 -4.6764159000000e+00\r\n451 404  4.9956892000000e+01\r\n453 404 -4.3529070000000e+00\r\n1509 404 -1.5271880000000e+00\r\n357 405 -7.8616002000000e+00\r\n402 405 -7.5820754000000e+00\r\n403 405 -6.4077381000000e+02\r\n404 405  9.9271279000000e+01\r\n405 405  3.3308234000000e+01\r\n406 405  2.0849344000000e+01\r\n407 405 -3.3775593000000e+00\r\n408 405 -7.9050080000000e+00\r\n451 405  8.4447076000000e+01\r\n452 405 -1.3680288000000e+01\r\n453 405 -7.3581490000000e+00\r\n1509 405 -2.5815568000000e+00\r\n358 406 -2.5684997000000e-03\r\n360 406 -2.6806025000000e-05\r\n403 406 -2.6307197000000e-03\r\n405 406 -2.7455381000000e-05\r\n406 406  5.7492296000000e+02\r\n408 406  1.4624084000000e-03\r\n409 406 -1.6198256000000e-01\r\n411 406 -2.8322849000000e-05\r\n454 406 -3.1386583000000e-01\r\n456 406 -2.7259136000000e-05\r\n1510 406 -4.8974647000000e-02\r\n1512 406 -8.6838251000000e-06\r\n360 407 -4.7516012000000e+00\r\n405 407 -4.6764159000000e+00\r\n406 407 -4.0792812000000e+02\r\n407 407 -1.0937761000000e+02\r\n408 407  2.0272988000000e+01\r\n409 407  1.3362148000000e+01\r\n411 407 -4.7738776000000e+00\r\n454 407  6.4594518000000e+01\r\n456 407 -4.5952814000000e+00\r\n1512 407 -1.4635822000000e+00\r\n360 408 -8.0321067000000e+00\r\n405 408 -7.9050080000000e+00\r\n406 408 -6.8956168000000e+02\r\n407 408  1.0697965000000e+02\r\n408 408  3.4269454000000e+01\r\n409 408  2.2587375000000e+01\r\n410 408 -3.6590933000000e+00\r\n411 408 -8.0697626000000e+00\r\n454 408  1.0919057000000e+02\r\n455 408 -1.7688576000000e+01\r\n456 408 -7.7678636000000e+00\r\n1512 408 -2.4740393000000e+00\r\n361 409 -2.5844816000000e-03\r\n363 409 -2.6972819000000e-05\r\n406 409 -2.7138387000000e-03\r\n408 409 -2.8322849000000e-05\r\n409 409  5.7507018000000e+02\r\n411 409  1.4650380000000e-03\r\n412 409 -9.4098850000000e-02\r\n414 409 -2.8635332000000e-05\r\n457 409 -5.3819792000000e-01\r\n459 409 -2.8456061000000e-05\r\n1513 409 -4.3304230000000e-02\r\n1515 409 -8.7599193000000e-06\r\n363 410 -4.7549139000000e+00\r\n408 410 -4.7738776000000e+00\r\n409 410 -4.1669717000000e+02\r\n410 410 -1.0938061000000e+02\r\n411 410  2.0519955000000e+01\r\n412 410  6.6853787000000e+00\r\n414 410 -4.7738909000000e+00\r\n457 410  8.0044732000000e+01\r\n459 410 -4.7447320000000e+00\r\n1515 410 -1.4603090000000e+00\r\n363 411 -8.0377006000000e+00\r\n408 411 -8.0697626000000e+00\r\n409 411 -7.0438450000000e+02\r\n410 411  1.0937287000000e+02\r\n411 411  3.4686913000000e+01\r\n412 411  1.1300958000000e+01\r\n413 411 -1.8307135000000e+00\r\n414 411 -8.0697798000000e+00\r\n457 411  1.3530754000000e+02\r\n458 411 -2.1919324000000e+01\r\n459 411 -8.0204896000000e+00\r\n1515 411 -2.4685050000000e+00\r\n364 412 -2.5900604000000e-03\r\n366 412 -2.7031042000000e-05\r\n409 412 -2.7437802000000e-03\r\n411 412 -2.8635332000000e-05\r\n412 412  5.7506595000000e+02\r\n414 412  1.4657043000000e-03\r\n415 412 -2.7497649000000e-03\r\n417 412 -2.8697790000000e-05\r\n460 412 -6.2907866000000e-01\r\n462 412 -2.8632140000000e-05\r\n1516 412 -3.9838055000000e-02\r\n1518 412 -8.8100746000000e-06\r\n366 413 -4.7549027000000e+00\r\n411 413 -4.7738909000000e+00\r\n412 413 -4.1895970000000e+02\r\n413 413 -1.0938104000000e+02\r\n414 413  2.0522181000000e+01\r\n417 413 -4.7738956000000e+00\r\n460 413  8.8993349000000e+01\r\n462 413 -4.7469534000000e+00\r\n1518 413 -1.4603067000000e+00\r\n366 414 -8.0376875000000e+00\r\n411 414 -8.0697798000000e+00\r\n412 414 -7.0820948000000e+02\r\n413 414  1.0999085000000e+02\r\n414 414  3.4690686000000e+01\r\n417 414 -8.0697896000000e+00\r\n460 414  1.5043436000000e+02\r\n461 414 -2.4369717000000e+01\r\n462 414 -8.0242501000000e+00\r\n1518 414 -2.4685025000000e+00\r\n367 415 -2.5832691000000e-03\r\n369 415 -2.6960165000000e-05\r\n412 415 -7.0760107000000e-02\r\n414 415 -2.8697790000000e-05\r\n415 415  5.7510738000000e+02\r\n417 415  1.4652996000000e-03\r\n418 415 -2.7223071000000e-03\r\n420 415 -2.8411228000000e-05\r\n463 415 -6.0098619000000e-01\r\n465 415 -2.8563549000000e-05\r\n1519 415 -4.1964468000000e-02\r\n1521 415 -8.7739954000000e-06\r\n369 416 -4.7562860000000e+00\r\n412 416  4.3901562000000e+00\r\n414 416 -4.7738956000000e+00\r\n415 416 -4.1833130000000e+02\r\n416 416 -1.0938150000000e+02\r\n417 416  2.0527906000000e+01\r\n420 416 -4.7737187000000e+00\r\n463 416  8.3975321000000e+01\r\n465 416 -4.7522972000000e+00\r\n1521 416 -1.4594767000000e+00\r\n369 417 -8.0400223000000e+00\r\n412 417  7.4211168000000e+00\r\n413 417 -1.2021920000000e+00\r\n414 417 -8.0697896000000e+00\r\n415 417 -7.0714692000000e+02\r\n416 417  1.0981801000000e+02\r\n417 417  3.4700360000000e+01\r\n420 417 -8.0694940000000e+00\r\n463 417  1.4195182000000e+02\r\n464 417 -2.2995641000000e+01\r\n465 417 -8.0332795000000e+00\r\n1521 417 -2.4670980000000e+00\r\n370 418 -2.5665051000000e-03\r\n372 418 -2.6785208000000e-05\r\n415 418 -1.4676595000000e-01\r\n417 418 -2.8411228000000e-05\r\n418 418  5.7507029000000e+02\r\n420 418  1.4638510000000e-03\r\n421 418 -2.6614878000000e-03\r\n423 418 -2.7776491000000e-05\r\n466 418 -4.8044860000000e-01\r\n468 418 -2.8301956000000e-05\r\n1522 418 -4.6530041000000e-02\r\n1524 418 -8.6924355000000e-06\r\n372 419 -4.7564077000000e+00\r\n415 419  1.1865530000000e+01\r\n417 419 -4.7737187000000e+00\r\n418 419 -4.1626645000000e+02\r\n419 419 -1.0937908000000e+02\r\n420 419  2.0483830000000e+01\r\n423 419 -4.7250120000000e+00\r\n466 419  7.4431540000000e+01\r\n468 419 -4.7560321000000e+00\r\n1524 419 -1.4604292000000e+00\r\n372 420 -8.0402315000000e+00\r\n415 420  2.0057491000000e+01\r\n416 420 -3.2492529000000e+00\r\n417 420 -8.0694940000000e+00\r\n418 420 -7.0365680000000e+02\r\n419 420  1.0925919000000e+02\r\n420 420  3.4625861000000e+01\r\n423 420 -7.9871544000000e+00\r\n466 420  1.2581907000000e+02\r\n467 420 -2.0382310000000e+01\r\n468 420 -8.0395966000000e+00\r\n1524 420 -2.4687096000000e+00\r\n373 421 -2.4409926000000e-03\r\n375 421 -2.5475303000000e-05\r\n418 421 -2.0002262000000e-01\r\n420 421 -2.7776491000000e-05\r\n421 421  5.6352835000000e+02\r\n423 421  1.4329259000000e-03\r\n424 421 -2.5152802000000e-03\r\n426 421 -2.6250602000000e-05\r\n469 421 -3.6799836000000e-01\r\n471 421 -2.7663830000000e-05\r\n1525 421 -5.0662846000000e-02\r\n1527 421 -8.7673732000000e-06\r\n375 422 -4.5641563000000e+00\r\n418 422  1.4573841000000e+01\r\n420 422 -4.7250120000000e+00\r\n421 422 -4.0302041000000e+02\r\n422 422 -1.0719043000000e+02\r\n423 422  2.0027838000000e+01\r\n426 422 -4.5288581000000e+00\r\n469 422  6.5074723000000e+01\r\n471 422 -4.7065101000000e+00\r\n1527 422 -1.4913157000000e+00\r\n375 423 -7.7152444000000e+00\r\n418 423  2.4635603000000e+01\r\n419 423 -3.9909248000000e+00\r\n420 423 -7.9871544000000e+00\r\n421 423 -6.8126520000000e+02\r\n422 423  1.0573024000000e+02\r\n423 423  3.3855038000000e+01\r\n426 423 -7.6555817000000e+00\r\n469 423  1.1000223000000e+02\r\n470 423 -1.7820172000000e+01\r\n471 423 -7.9558789000000e+00\r\n1527 423 -2.5209182000000e+00\r\n376 424 -2.2646155000000e-03\r\n378 424 -2.3634552000000e-05\r\n421 424 -2.3641910000000e-01\r\n423 424 -2.6250602000000e-05\r\n424 424  5.2896125000000e+02\r\n426 424  1.3447081000000e-03\r\n427 424 -2.2650799000000e-03\r\n429 424 -2.3639399000000e-05\r\n472 424 -2.2590056000000e-01\r\n474 424 -2.5613009000000e-05\r\n1528 424 -5.3706823000000e-02\r\n1530 424 -9.2257162000000e-06\r\n378 425 -4.2769539000000e+00\r\n421 425  1.5644070000000e+01\r\n423 425 -4.5288581000000e+00\r\n424 425 -3.7281321000000e+02\r\n425 425 -1.0062862000000e+02\r\n426 425  1.8965360000000e+01\r\n429 425 -4.1372028000000e+00\r\n472 425  5.3596444000000e+01\r\n474 425 -4.4195152000000e+00\r\n1530 425 -1.5915783000000e+00\r\n378 426 -7.2297629000000e+00\r\n421 426  2.6444736000000e+01\r\n422 426 -4.2840328000000e+00\r\n423 426 -7.6555817000000e+00\r\n424 426 -6.3020345000000e+02\r\n425 426  9.7740717000000e+01\r\n426 426  3.2059040000000e+01\r\n429 426 -6.9935225000000e+00\r\n472 426  9.0599428000000e+01\r\n473 426 -1.4677058000000e+01\r\n474 426 -7.4707486000000e+00\r\n1530 426 -2.6904039000000e+00\r\n379 427 -2.0216120000000e-03\r\n381 427 -2.1098457000000e-05\r\n424 427 -2.6132781000000e-01\r\n426 427 -2.3639399000000e-05\r\n427 427  4.7136634000000e+02\r\n429 427  1.1796732000000e-03\r\n475 427 -5.1081988000000e-02\r\n477 427 -2.2804627000000e-05\r\n1531 427 -5.5373045000000e-02\r\n1533 427 -1.0189061000000e-05\r\n381 428 -3.8499013000000e+00\r\n424 428  1.4276224000000e+01\r\n426 428 -4.1372028000000e+00\r\n427 428 -3.1413612000000e+02\r\n428 428 -8.9695520000000e+01\r\n429 428  1.3771905000000e+01\r\n475 428  2.9290310000000e+01\r\n477 428 -3.9916066000000e+00\r\n1533 428 -1.7831636000000e+00\r\n381 429 -6.5078683000000e+00\r\n424 429  2.4132512000000e+01\r\n425 429 -3.9094881000000e+00\r\n426 429 -6.9935225000000e+00\r\n427 429 -5.3101534000000e+02\r\n428 429  8.2134742000000e+01\r\n429 429  2.3280012000000e+01\r\n475 429  4.9512306000000e+01\r\n476 429 -8.0210370000000e+00\r\n477 429 -6.7474068000000e+00\r\n1533 429 -3.0142581000000e+00\r\n430 430  1.0000000000000e+00\r\n431 431  1.0000000000000e+00\r\n432 432  1.0000000000000e+00\r\n433 433  1.0000000000000e+00\r\n434 434  1.0000000000000e+00\r\n435 435  1.0000000000000e+00\r\n436 436  1.0000000000000e+00\r\n437 437  1.0000000000000e+00\r\n438 438  1.0000000000000e+00\r\n439 439  1.0000000000000e+00\r\n440 440  1.0000000000000e+00\r\n441 441  1.0000000000000e+00\r\n442 442  1.0000000000000e+00\r\n443 443  1.0000000000000e+00\r\n444 444  1.0000000000000e+00\r\n397 445 -1.8958112000000e-01\r\n399 445 -2.3029846000000e-05\r\n445 445  4.2537296000000e+02\r\n447 445  1.0715340000000e-03\r\n448 445 -1.2628141000000e-01\r\n450 445 -2.2183240000000e-05\r\n493 445 -1.9073349000000e-03\r\n495 445 -1.9905810000000e-05\r\n1549 445 -5.7003955000000e-02\r\n1551 445 -1.1969802000000e-05\r\n399 446 -3.8097221000000e+00\r\n445 446 -2.6914069000000e+02\r\n446 446 -8.0988821000000e+01\r\n447 446  1.2675962000000e+01\r\n448 446  2.7187583000000e+00\r\n450 446 -3.6700656000000e+00\r\n493 446  2.2310249000000e+01\r\n495 446 -3.2068077000000e+00\r\n1551 446 -1.9802948000000e+00\r\n399 447 -6.4399502000000e+00\r\n445 447 -4.5495508000000e+02\r\n446 447  7.0082321000000e+01\r\n447 447  2.1427431000000e+01\r\n448 447  4.5957857000000e+00\r\n449 447 -7.4449701000000e-01\r\n450 447 -6.2038744000000e+00\r\n493 447  3.7713218000000e+01\r\n494 447 -6.1093750000000e+00\r\n495 447 -5.4207838000000e+00\r\n1551 447 -3.3474880000000e+00\r\n400 448 -2.2695710000000e-03\r\n402 448 -2.3686270000000e-05\r\n445 448 -2.1255537000000e-03\r\n447 448 -2.2183240000000e-05\r\n448 448  4.5971170000000e+02\r\n450 448  1.1786059000000e-03\r\n451 448 -1.8440792000000e-01\r\n453 448 -2.4261411000000e-05\r\n496 448 -2.1320279000000e-03\r\n498 448 -2.2250808000000e-05\r\n1552 448 -5.4499852000000e-02\r\n1554 448 -1.1137754000000e-05\r\n402 449 -4.0513848000000e+00\r\n447 449 -3.6700656000000e+00\r\n448 449 -3.0965220000000e+02\r\n449 449 -8.7547250000000e+01\r\n450 449  1.7112696000000e+01\r\n451 449  1.3093529000000e+01\r\n453 449 -4.0014572000000e+00\r\n496 449  3.2643080000000e+01\r\n498 449 -3.5431100000000e+00\r\n1554 449 -1.8368744000000e+00\r\n402 450 -6.8484609000000e+00\r\n447 450 -6.2038744000000e+00\r\n448 450 -5.2343607000000e+02\r\n449 450  8.0902187000000e+01\r\n450 450  2.8927296000000e+01\r\n451 450  2.2133302000000e+01\r\n452 450 -3.5854881000000e+00\r\n453 450 -6.7640633000000e+00\r\n496 450  5.5179862000000e+01\r\n497 450 -8.9388715000000e+00\r\n498 450 -5.9892731000000e+00\r\n1554 450 -3.1050525000000e+00\r\n403 451 -2.4483561000000e-03\r\n405 451 -2.5552152000000e-05\r\n448 451 -2.3246798000000e-03\r\n450 451 -2.4261411000000e-05\r\n451 451  5.0591618000000e+02\r\n453 451  1.2930679000000e-03\r\n454 451 -3.0440354000000e-01\r\n456 451 -2.6645486000000e-05\r\n499 451 -1.4649951000000e-01\r\n501 451 -2.3763460000000e-05\r\n1555 451 -4.8561085000000e-02\r\n1557 451 -1.0237645000000e-05\r\n405 452 -4.3529070000000e+00\r\n450 452 -4.0014572000000e+00\r\n451 452 -3.6019235000000e+02\r\n452 452 -9.6302513000000e+01\r\n453 452  1.8242362000000e+01\r\n454 452  2.2638721000000e+01\r\n456 452 -4.3393966000000e+00\r\n499 452  4.7247510000000e+01\r\n501 452 -3.8706427000000e+00\r\n1557 452 -1.6671745000000e+00\r\n405 453 -7.3581490000000e+00\r\n450 453 -6.7640633000000e+00\r\n451 453 -6.0886882000000e+02\r\n452 453  9.4350579000000e+01\r\n453 453  3.0836875000000e+01\r\n454 453  3.8268474000000e+01\r\n455 453 -6.1992643000000e+00\r\n456 453 -7.3353123000000e+00\r\n499 453  7.9867150000000e+01\r\n500 453 -1.2938001000000e+01\r\n501 453 -6.5429310000000e+00\r\n1557 453 -2.8181894000000e+00\r\n406 454 -2.6119159000000e-03\r\n408 454 -2.7259136000000e-05\r\n451 454 -2.5531172000000e-03\r\n453 454 -2.6645486000000e-05\r\n454 454  5.4060151000000e+02\r\n456 454  1.3826741000000e-03\r\n457 454 -3.6581696000000e-01\r\n459 454 -2.8986084000000e-05\r\n502 454 -3.2336120000000e-01\r\n504 454 -2.6733988000000e-05\r\n1558 454 -3.7939151000000e-02\r\n1560 454 -9.7877547000000e-06\r\n408 455 -4.5952814000000e+00\r\n453 455 -4.3393966000000e+00\r\n454 455 -4.0561228000000e+02\r\n455 455 -1.0287077000000e+02\r\n456 455  1.9402726000000e+01\r\n457 455  2.5964243000000e+01\r\n459 455 -4.6265250000000e+00\r\n502 455  6.9551885000000e+01\r\n504 455 -4.2678508000000e+00\r\n1560 455 -1.5621511000000e+00\r\n408 456 -7.7678636000000e+00\r\n453 456 -7.3353123000000e+00\r\n454 456 -6.8564699000000e+02\r\n455 456  1.0648907000000e+02\r\n456 456  3.2798363000000e+01\r\n457 456  4.3889957000000e+01\r\n458 456 -7.1098200000000e+00\r\n459 456 -7.8206778000000e+00\r\n502 456  1.1757051000000e+02\r\n503 456 -1.9045476000000e+01\r\n504 456 -7.2143749000000e+00\r\n1560 456 -2.6406602000000e+00\r\n409 457 -2.7266028000000e-03\r\n411 457 -2.8456061000000e-05\r\n454 457 -2.7773886000000e-03\r\n456 457 -2.8986084000000e-05\r\n457 457  5.7512809000000e+02\r\n459 457  1.4710524000000e-03\r\n460 457 -1.8542539000000e-01\r\n462 457 -3.0563854000000e-05\r\n505 457 -5.8596145000000e-01\r\n507 457 -2.9723276000000e-05\r\n1561 457 -2.3834622000000e-02\r\n1563 457 -9.4021289000000e-06\r\n411 458 -4.7447320000000e+00\r\n456 458 -4.6265250000000e+00\r\n457 458 -4.4592885000000e+02\r\n458 458 -1.0943785000000e+02\r\n459 458  2.0272320000000e+01\r\n460 458  1.5650290000000e+01\r\n462 458 -4.7751626000000e+00\r\n505 458  1.0039086000000e+02\r\n507 458 -4.6448017000000e+00\r\n1563 458 -1.4688418000000e+00\r\n411 459 -8.0204896000000e+00\r\n456 459 -7.8206778000000e+00\r\n457 459 -7.5379764000000e+02\r\n458 459  1.1723273000000e+02\r\n459 459  3.4268312000000e+01\r\n460 459  2.6455233000000e+01\r\n461 459 -4.2854807000000e+00\r\n462 459 -8.0719295000000e+00\r\n505 459  1.6970060000000e+02\r\n506 459 -2.7489782000000e+01\r\n507 459 -7.8515677000000e+00\r\n1563 459 -2.4829287000000e+00\r\n412 460 -2.7434744000000e-03\r\n414 460 -2.8632140000000e-05\r\n457 460 -2.9285674000000e-03\r\n459 460 -3.0563854000000e-05\r\n460 460  5.7520322000000e+02\r\n462 460  1.4740832000000e-03\r\n463 460 -2.9416280000000e-03\r\n465 460 -3.0700161000000e-05\r\n508 460 -8.5968395000000e-01\r\n510 460 -3.0749960000000e-05\r\n1564 460 -1.1791679000000e-02\r\n1566 460 -9.5039760000000e-06\r\n414 461 -4.7469534000000e+00\r\n459 461 -4.7751626000000e+00\r\n460 461 -4.5529778000000e+02\r\n461 461 -1.0944174000000e+02\r\n462 461  2.0525033000000e+01\r\n465 461 -4.7749737000000e+00\r\n508 461  1.2541576000000e+02\r\n510 461 -4.7484940000000e+00\r\n1566 461 -1.4671910000000e+00\r\n414 462 -8.0242501000000e+00\r\n459 462 -8.0719295000000e+00\r\n460 462 -7.6963537000000e+02\r\n461 462  1.1978744000000e+02\r\n462 462  3.4695505000000e+01\r\n465 462 -8.0716104000000e+00\r\n508 462  2.1200280000000e+02\r\n509 462 -3.4342032000000e+01\r\n510 462 -8.0268543000000e+00\r\n1566 462 -2.4801396000000e+00\r\n415 463 -2.7369021000000e-03\r\n417 463 -2.8563549000000e-05\r\n460 463 -9.9876087000000e-02\r\n462 463 -3.0700161000000e-05\r\n463 463  5.7516494000000e+02\r\n465 463  1.4732997000000e-03\r\n466 463 -2.8922477000000e-03\r\n468 463 -3.0184806000000e-05\r\n511 463 -7.1220218000000e-01\r\n513 463 -3.0505978000000e-05\r\n1567 463 -2.0158733000000e-02\r\n1569 463 -9.4187340000000e-06\r\n417 464 -4.7522972000000e+00\r\n460 464  9.5332522000000e+00\r\n462 464 -4.7749737000000e+00\r\n463 464 -4.4573274000000e+02\r\n464 464 -1.0943806000000e+02\r\n465 464  2.0524459000000e+01\r\n468 464 -4.7743924000000e+00\r\n511 464  1.0631215000000e+02\r\n513 464 -4.7456943000000e+00\r\n1569 464 -1.4648449000000e+00\r\n417 465 -8.0332795000000e+00\r\n460 465  1.6114999000000e+01\r\n461 465 -2.6104598000000e+00\r\n462 465 -8.0716104000000e+00\r\n463 465 -7.5346616000000e+02\r\n464 465  1.1717810000000e+02\r\n465 465  3.4694530000000e+01\r\n468 465 -8.0706327000000e+00\r\n511 465  1.7970995000000e+02\r\n512 465 -2.9111112000000e+01\r\n513 465 -8.0221160000000e+00\r\n1569 465 -2.4761723000000e+00\r\n418 466 -2.7118368000000e-03\r\n420 466 -2.8301956000000e-05\r\n463 466 -2.6835624000000e-01\r\n465 466 -3.0184806000000e-05\r\n466 466  5.7520815000000e+02\r\n468 466  1.4712649000000e-03\r\n469 466 -2.8382956000000e-03\r\n471 466 -2.9621737000000e-05\r\n514 466 -5.6931617000000e-01\r\n516 466 -3.0004439000000e-05\r\n1570 466 -3.3098183000000e-02\r\n1572 466 -9.2428001000000e-06\r\n420 467 -4.7560321000000e+00\r\n463 467  2.1512569000000e+01\r\n465 467 -4.7743924000000e+00\r\n466 467 -4.3681580000000e+02\r\n467 467 -1.0943408000000e+02\r\n468 467  2.0524231000000e+01\r\n471 467 -4.7731085000000e+00\r\n514 467  8.5410030000000e+01\r\n516 467 -4.7465937000000e+00\r\n1572 467 -1.4618491000000e+00\r\n420 468 -8.0395966000000e+00\r\n463 468  3.6364846000000e+01\r\n464 468 -5.8907798000000e+00\r\n465 468 -8.0706327000000e+00\r\n466 468 -7.3839342000000e+02\r\n467 468  1.1474748000000e+02\r\n468 468  3.4694155000000e+01\r\n471 468 -8.0684581000000e+00\r\n514 468  1.4437711000000e+02\r\n515 468 -2.3387800000000e+01\r\n516 468 -8.0236419000000e+00\r\n1572 468 -2.4711096000000e+00\r\n421 469 -2.6506929000000e-03\r\n423 469 -2.7663830000000e-05\r\n466 469 -3.1107453000000e-01\r\n468 469 -2.9621737000000e-05\r\n469 469  5.7514268000000e+02\r\n471 469  1.4678365000000e-03\r\n472 469 -2.6956843000000e-03\r\n474 469 -2.8133381000000e-05\r\n517 469 -4.4832657000000e-01\r\n519 469 -2.9452477000000e-05\r\n1573 469 -4.3135835000000e-02\r\n1575 469 -9.0771279000000e-06\r\n423 470 -4.7065101000000e+00\r\n466 470  2.3423199000000e+01\r\n468 470 -4.7731085000000e+00\r\n469 470 -4.2683226000000e+02\r\n470 470 -1.0943152000000e+02\r\n471 470  2.0326504000000e+01\r\n474 470 -4.6255575000000e+00\r\n517 470  7.3511831000000e+01\r\n519 470 -4.7465231000000e+00\r\n1575 470 -1.4625507000000e+00\r\n423 471 -7.9558789000000e+00\r\n466 471  3.9594554000000e+01\r\n467 471 -6.4140399000000e+00\r\n468 471 -8.0684581000000e+00\r\n469 471 -7.2151684000000e+02\r\n470 471  1.1202164000000e+02\r\n471 471  3.4359905000000e+01\r\n474 471 -7.8190422000000e+00\r\n517 471  1.2426433000000e+02\r\n518 471 -2.0129948000000e+01\r\n519 471 -8.0235181000000e+00\r\n1575 471 -2.4722944000000e+00\r\n424 472 -2.4541873000000e-03\r\n426 472 -2.5613009000000e-05\r\n469 472 -3.6670428000000e-01\r\n471 472 -2.8133381000000e-05\r\n472 472  5.4076809000000e+02\r\n474 472  1.3791015000000e-03\r\n475 472 -2.4187469000000e-03\r\n477 472 -2.5243137000000e-05\r\n520 472 -4.7462177000000e-01\r\n522 472 -2.7428044000000e-05\r\n1576 472 -4.8717647000000e-02\r\n1578 472 -9.4536151000000e-06\r\n426 473 -4.4195152000000e+00\r\n469 473  2.3835402000000e+01\r\n471 473 -4.6255575000000e+00\r\n472 473 -4.0613436000000e+02\r\n473 473 -1.0286765000000e+02\r\n474 473  1.9409339000000e+01\r\n477 473 -4.2882222000000e+00\r\n520 473  7.2197736000000e+01\r\n522 473 -4.5102819000000e+00\r\n1578 473 -1.5542434000000e+00\r\n426 474 -7.4707486000000e+00\r\n469 474  4.0291363000000e+01\r\n470 474 -6.5269939000000e+00\r\n471 474 -7.8190422000000e+00\r\n472 474 -6.8652953000000e+02\r\n473 474  1.0664209000000e+02\r\n474 474  3.2809543000000e+01\r\n477 474 -7.2488069000000e+00\r\n520 474  1.2204305000000e+02\r\n521 474 -1.9770349000000e+01\r\n522 474 -7.6241805000000e+00\r\n1578 474 -2.6272931000000e+00\r\n427 475 -2.1850937000000e-03\r\n429 475 -2.2804627000000e-05\r\n472 475 -4.3512517000000e-01\r\n474 475 -2.5243137000000e-05\r\n475 475  4.9442470000000e+02\r\n477 475  1.2137476000000e-03\r\n1579 475 -5.3505942000000e-02\r\n1581 475 -1.0006409000000e-05\r\n429 476 -3.9916066000000e+00\r\n472 476  3.5331745000000e+01\r\n474 476 -4.2882222000000e+00\r\n475 476 -3.1905106000000e+02\r\n476 476 -9.4106391000000e+01\r\n477 476  9.9901027000000e+00\r\n1581 476 -1.6997381000000e+00\r\n429 477 -6.7474068000000e+00\r\n472 477  5.9724749000000e+01\r\n473 477 -9.6752944000000e+00\r\n474 477 -7.2488069000000e+00\r\n475 477 -5.3932361000000e+02\r\n476 477  8.3202806000000e+01\r\n477 477  1.6887259000000e+01\r\n1581 477 -2.8732354000000e+00\r\n478 478  1.0000000000000e+00\r\n479 479  1.0000000000000e+00\r\n480 480  1.0000000000000e+00\r\n481 481  1.0000000000000e+00\r\n482 482  1.0000000000000e+00\r\n483 483  1.0000000000000e+00\r\n484 484  1.0000000000000e+00\r\n485 485  1.0000000000000e+00\r\n486 486  1.0000000000000e+00\r\n487 487  1.0000000000000e+00\r\n488 488  1.0000000000000e+00\r\n489 489  1.0000000000000e+00\r\n490 490  1.0000000000000e+00\r\n491 491  1.0000000000000e+00\r\n492 492  1.0000000000000e+00\r\n445 493 -2.2188495000000e-02\r\n447 493 -1.9905810000000e-05\r\n493 493  3.5624958000000e+02\r\n495 493  9.0470568000000e-04\r\n496 493 -1.2056436000000e-01\r\n498 493 -1.9490644000000e-05\r\n541 493 -1.6758613000000e-03\r\n543 493 -1.7490047000000e-05\r\n1597 493 -5.6812041000000e-02\r\n1599 493 -1.4640770000000e-05\r\n447 494 -3.2068077000000e+00\r\n493 494 -2.3145383000000e+02\r\n494 494 -6.7884610000000e+01\r\n495 494  1.1464227000000e+01\r\n496 494  9.4096397000000e+00\r\n498 494 -3.1402877000000e+00\r\n541 494  1.7558430000000e+01\r\n543 494 -2.7507270000000e+00\r\n1599 494 -2.3587909000000e+00\r\n447 495 -5.4207838000000e+00\r\n493 495 -3.9124930000000e+02\r\n494 495  6.0276811000000e+01\r\n495 495  1.9379115000000e+01\r\n496 495  1.5906044000000e+01\r\n497 495 -2.5766673000000e+00\r\n498 495 -5.3083387000000e+00\r\n541 495  2.9680750000000e+01\r\n542 495 -4.8080725000000e+00\r\n543 495 -4.6498258000000e+00\r\n1599 495 -3.9872974000000e+00\r\n448 496 -1.0442122000000e-02\r\n450 496 -2.2250808000000e-05\r\n493 496 -1.8675545000000e-03\r\n495 496 -1.9490644000000e-05\r\n496 496  4.0240967000000e+02\r\n498 496  1.0367382000000e-03\r\n499 496 -2.9821239000000e-01\r\n501 496 -2.1851909000000e-05\r\n544 496 -5.8779169000000e-02\r\n546 496 -1.9325226000000e-05\r\n1600 496 -5.2065558000000e-02\r\n1602 496 -1.3125358000000e-05\r\n450 497 -3.5431100000000e+00\r\n495 497 -3.1402877000000e+00\r\n496 497 -2.7845932000000e+02\r\n497 497 -7.6645502000000e+01\r\n498 497  1.5340356000000e+01\r\n499 497  2.1802822000000e+01\r\n501 497 -3.4800929000000e+00\r\n544 497  2.5787942000000e+01\r\n546 497 -3.0780453000000e+00\r\n1602 497 -2.0902235000000e+00\r\n450 498 -5.9892731000000e+00\r\n495 498 -5.3083387000000e+00\r\n496 498 -4.7070763000000e+02\r\n497 498  7.2743432000000e+01\r\n498 498  2.5931334000000e+01\r\n499 498  3.6855490000000e+01\r\n500 498 -5.9702838000000e+00\r\n501 498 -5.8827489000000e+00\r\n544 498  4.3591937000000e+01\r\n545 498 -7.0615323000000e+00\r\n546 498 -5.2031278000000e+00\r\n1602 498 -3.5333138000000e+00\r\n451 499 -2.2769672000000e-03\r\n453 499 -2.3763460000000e-05\r\n496 499 -2.0938062000000e-03\r\n498 499 -2.1851909000000e-05\r\n499 499  4.3705599000000e+02\r\n501 499  1.1260789000000e-03\r\n502 499 -4.1640767000000e-01\r\n504 499 -2.4773945000000e-05\r\n547 499 -1.5382048000000e-01\r\n549 499 -2.1953293000000e-05\r\n1603 499 -3.9166332000000e-02\r\n1605 499 -1.2390340000000e-05\r\n453 500 -3.8706427000000e+00\r\n498 500 -3.4800929000000e+00\r\n499 500 -3.2692845000000e+02\r\n500 500 -8.3216692000000e+01\r\n501 500  1.6556385000000e+01\r\n502 500  3.5863226000000e+01\r\n504 500 -3.8537242000000e+00\r\n547 500  4.0410594000000e+01\r\n549 500 -3.4153510000000e+00\r\n1605 500 -1.9272396000000e+00\r\n453 501 -6.5429310000000e+00\r\n498 501 -5.8827489000000e+00\r\n499 501 -5.5263943000000e+02\r\n500 501  8.5709818000000e+01\r\n501 501  2.7986897000000e+01\r\n502 501  6.0623151000000e+01\r\n503 501 -9.8203101000000e+00\r\n504 501 -6.5143303000000e+00\r\n547 501  6.8310016000000e+01\r\n548 501 -1.1065501000000e+01\r\n549 501 -5.7733048000000e+00\r\n1605 501 -3.2578037000000e+00\r\n454 502 -2.5615973000000e-03\r\n456 502 -2.6733988000000e-05\r\n499 502 -2.3737899000000e-03\r\n501 502 -2.4773945000000e-05\r\n502 502  4.9493426000000e+02\r\n504 502  1.2728968000000e-03\r\n505 502 -5.6088406000000e-01\r\n507 502 -2.8811357000000e-05\r\n550 502 -4.9629986000000e-01\r\n552 502 -2.5522785000000e-05\r\n1606 502 -1.4348107000000e-02\r\n1608 502 -1.1291817000000e-05\r\n456 503 -4.2678508000000e+00\r\n501 503 -3.8537242000000e+00\r\n502 503 -3.9920173000000e+02\r\n503 503 -9.4176106000000e+01\r\n504 503  1.8002224000000e+01\r\n505 503  4.7350486000000e+01\r\n507 503 -4.3330727000000e+00\r\n550 503  6.8230276000000e+01\r\n552 503 -3.8389315000000e+00\r\n1608 503 -1.6980784000000e+00\r\n456 504 -7.2143749000000e+00\r\n501 504 -6.5143303000000e+00\r\n502 504 -6.7481061000000e+02\r\n503 504  1.0497153000000e+02\r\n504 504  3.0430955000000e+01\r\n505 504  8.0041261000000e+01\r\n506 504 -1.2965548000000e+01\r\n507 504 -7.3246260000000e+00\r\n550 504  1.1533646000000e+02\r\n551 504 -1.8682869000000e+01\r\n552 504 -6.4893297000000e+00\r\n1608 504 -2.8704318000000e+00\r\n457 505 -2.8480249000000e-03\r\n459 505 -2.9723276000000e-05\r\n502 505 -2.7606466000000e-03\r\n504 505 -2.8811357000000e-05\r\n505 505  5.5265280000000e+02\r\n507 505  1.4215661000000e-03\r\n508 505 -4.3860921000000e-01\r\n510 505 -3.2333973000000e-05\r\n553 505 -9.3809341000000e-01\r\n555 505 -3.0174259000000e-05\r\n1609 505 -9.8984396000000e-04\r\n1611 505 -1.0330459000000e-05\r\n459 506 -4.6448017000000e+00\r\n504 506 -4.3330727000000e+00\r\n505 506 -4.7899523000000e+02\r\n506 506 -1.0513858000000e+02\r\n507 506  1.9561832000000e+01\r\n508 506  3.7782580000000e+01\r\n510 506 -4.6790249000000e+00\r\n553 506  1.2462987000000e+02\r\n555 506 -4.3673821000000e+00\r\n1611 506 -1.5257493000000e+00\r\n459 507 -7.8515677000000e+00\r\n504 507 -7.3246260000000e+00\r\n505 507 -8.0969294000000e+02\r\n506 507  1.2628357000000e+02\r\n507 507  3.3067302000000e+01\r\n508 507  6.3867626000000e+01\r\n509 507 -1.0345390000000e+01\r\n510 507 -7.9094179000000e+00\r\n553 507  2.1067418000000e+02\r\n554 507 -3.4125373000000e+01\r\n555 507 -7.3826173000000e+00\r\n1611 507 -2.5791245000000e+00\r\n460 508 -2.9463997000000e-03\r\n462 508 -3.0749960000000e-05\r\n505 508 -3.0981766000000e-03\r\n507 508 -3.2333973000000e-05\r\n508 508  5.7610393000000e+02\r\n510 508  1.4841410000000e-03\r\n511 508 -3.1852221000000e-03\r\n513 508 -3.3242419000000e-05\r\n556 508 -1.8658174000000e+00\r\n558 508 -3.3766112000000e-05\r\n1612 508 -9.6472465000000e-04\r\n1614 508 -1.0068303000000e-05\r\n462 509 -4.7484940000000e+00\r\n507 509 -4.6790249000000e+00\r\n508 509 -5.4056621000000e+02\r\n509 509 -1.0952935000000e+02\r\n510 509  2.0434084000000e+01\r\n513 509 -4.7765998000000e+00\r\n556 509  2.1080725000000e+02\r\n558 509 -4.7563521000000e+00\r\n1614 509 -1.4613155000000e+00\r\n462 510 -8.0268543000000e+00\r\n507 510 -7.9094179000000e+00\r\n508 510 -9.1377311000000e+02\r\n509 510  1.4291169000000e+02\r\n510 510  3.4541762000000e+01\r\n513 510 -8.0743576000000e+00\r\n556 510  3.5634858000000e+02\r\n557 510 -5.7720843000000e+01\r\n558 510 -8.0401375000000e+00\r\n1614 510 -2.4702077000000e+00\r\n463 511 -2.9230218000000e-03\r\n465 511 -3.0505978000000e-05\r\n508 511 -2.4803450000000e-01\r\n510 511 -3.3242419000000e-05\r\n511 511  5.7550887000000e+02\r\n513 511  1.4829856000000e-03\r\n514 511 -3.0883055000000e-03\r\n516 511 -3.2230953000000e-05\r\n559 511 -1.0092726000000e+00\r\n561 511 -3.3068305000000e-05\r\n1615 511 -9.5556070000000e-04\r\n1617 511 -9.9726638000000e-06\r\n465 512 -4.7456943000000e+00\r\n508 512  2.8689754000000e+01\r\n510 512 -4.7765998000000e+00\r\n511 512 -4.9409341000000e+02\r\n512 512 -1.0951398000000e+02\r\n513 512  2.0528275000000e+01\r\n516 512 -4.7759952000000e+00\r\n559 512  1.3562274000000e+02\r\n561 512 -4.7524962000000e+00\r\n1617 512 -1.4651993000000e+00\r\n465 513 -8.0221160000000e+00\r\n508 513  4.8497120000000e+01\r\n509 513 -7.8556109000000e+00\r\n510 513 -8.0743576000000e+00\r\n511 513 -8.3521480000000e+02\r\n512 513  1.3022704000000e+02\r\n513 513  3.4700975000000e+01\r\n516 513 -8.0733421000000e+00\r\n559 513  2.2925650000000e+02\r\n560 513 -3.7135191000000e+01\r\n561 513 -8.0336129000000e+00\r\n1617 513 -2.4767708000000e+00\r\n466 514 -2.8749653000000e-03\r\n468 514 -3.0004439000000e-05\r\n511 514 -4.1241729000000e-01\r\n513 514 -3.2230953000000e-05\r\n514 514  5.7519069000000e+02\r\n516 514  1.4795120000000e-03\r\n517 514 -3.0069859000000e-03\r\n519 514 -3.1382266000000e-05\r\n562 514 -4.9911312000000e-01\r\n564 514 -3.2047129000000e-05\r\n1618 514 -8.0139423000000e-03\r\n1620 514 -9.9070950000000e-06\r\n468 515 -4.7465937000000e+00\r\n511 515  4.2569293000000e+01\r\n513 515 -4.7759952000000e+00\r\n514 515 -4.6234161000000e+02\r\n515 515 -1.0949542000000e+02\r\n516 515  2.0527064000000e+01\r\n519 515 -4.7748703000000e+00\r\n562 515  8.9964943000000e+01\r\n564 515 -4.7494534000000e+00\r\n1620 515 -1.4678694000000e+00\r\n468 516 -8.0236419000000e+00\r\n511 516  7.1959131000000e+01\r\n512 516 -1.1656244000000e+01\r\n513 516 -8.0733421000000e+00\r\n514 516 -7.8154226000000e+02\r\n515 516  1.2158133000000e+02\r\n516 516  3.4698943000000e+01\r\n519 516 -8.0714349000000e+00\r\n562 516  1.5207674000000e+02\r\n563 516 -2.4634033000000e+01\r\n564 516 -8.0284759000000e+00\r\n1620 516 -2.4812864000000e+00\r\n469 517 -2.8220775000000e-03\r\n471 517 -2.9452477000000e-05\r\n514 517 -4.3290524000000e-01\r\n516 517 -3.1382266000000e-05\r\n517 517  5.7503149000000e+02\r\n519 517  1.4758353000000e-03\r\n520 517 -2.8957310000000e-03\r\n522 517 -3.0221159000000e-05\r\n565 517 -2.8886261000000e-01\r\n567 517 -3.1218023000000e-05\r\n1621 517 -3.0579909000000e-02\r\n1623 517 -9.6501086000000e-06\r\n471 518 -4.7465231000000e+00\r\n514 518  3.5396470000000e+01\r\n516 518 -4.7748703000000e+00\r\n517 518 -4.3450468000000e+02\r\n518 518 -1.0948827000000e+02\r\n519 518  2.0429436000000e+01\r\n522 518 -4.6769808000000e+00\r\n565 518  6.9290058000000e+01\r\n567 518 -4.7506181000000e+00\r\n1623 518 -1.4681648000000e+00\r\n471 519 -8.0235181000000e+00\r\n514 519  5.9834150000000e+01\r\n515 519 -9.6923637000000e+00\r\n516 519 -8.0714349000000e+00\r\n517 519 -7.3448618000000e+02\r\n518 519  1.1397923000000e+02\r\n519 519  3.4533900000000e+01\r\n522 519 -7.9059682000000e+00\r\n565 519  1.1712783000000e+02\r\n566 519 -1.8973202000000e+01\r\n567 519 -8.0304389000000e+00\r\n1623 519 -2.4817839000000e+00\r\n472 520 -2.6281004000000e-03\r\n474 520 -2.7428044000000e-05\r\n517 520 -3.2038204000000e-01\r\n519 520 -3.0221159000000e-05\r\n520 520  5.5186282000000e+02\r\n522 520  1.3874395000000e-03\r\n568 520 -1.9750234000000e-01\r\n570 520 -2.9774965000000e-05\r\n1624 520 -3.9997528000000e-02\r\n1626 520 -9.8819052000000e-06\r\n474 521 -4.5102819000000e+00\r\n517 521  2.1665194000000e+01\r\n519 521 -4.6769808000000e+00\r\n520 521 -3.9709700000000e+02\r\n521 521 -9.6452757000000e+01\r\n522 521  1.5336972000000e+01\r\n568 521  5.8806825000000e+01\r\n570 521 -4.6086963000000e+00\r\n1626 521 -1.5292250000000e+00\r\n474 522 -7.6241805000000e+00\r\n517 522  3.6622843000000e+01\r\n518 522 -5.9324904000000e+00\r\n519 522 -7.9059682000000e+00\r\n520 522 -6.7125278000000e+02\r\n521 522  1.1856897000000e+02\r\n522 522  2.5925617000000e+01\r\n568 522  9.9407057000000e+01\r\n569 522 -1.6102830000000e+01\r\n570 522 -7.7905402000000e+00\r\n1626 522 -2.5850020000000e+00\r\n523 523  1.0000000000000e+00\r\n524 524  1.0000000000000e+00\r\n525 525  1.0000000000000e+00\r\n526 526  1.0000000000000e+00\r\n527 527  1.0000000000000e+00\r\n528 528  1.0000000000000e+00\r\n529 529  1.0000000000000e+00\r\n530 530  1.0000000000000e+00\r\n531 531  1.0000000000000e+00\r\n532 532  1.0000000000000e+00\r\n533 533  1.0000000000000e+00\r\n534 534  1.0000000000000e+00\r\n535 535  1.0000000000000e+00\r\n536 536  1.0000000000000e+00\r\n537 537  1.0000000000000e+00\r\n538 538  1.0000000000000e+00\r\n539 539  1.0000000000000e+00\r\n540 540  1.0000000000000e+00\r\n493 541 -4.8867607000000e-03\r\n495 541 -1.7490047000000e-05\r\n541 541  3.1031167000000e+02\r\n543 541  7.9300686000000e-04\r\n544 541 -1.5765390000000e-01\r\n546 541 -1.7263735000000e-05\r\n589 541 -9.1135186000000e-03\r\n591 541 -1.5422818000000e-05\r\n1645 541 -5.7152102000000e-02\r\n1647 541 -1.7161875000000e-05\r\n495 542 -2.7507270000000e+00\r\n541 542 -1.9981890000000e+02\r\n542 542 -5.9147403000000e+01\r\n543 542  1.0598055000000e+01\r\n544 542  1.3552430000000e+01\r\n546 542 -2.7154363000000e+00\r\n589 542  8.1967632000000e+00\r\n591 542 -2.4259626000000e+00\r\n1647 542 -2.6992882000000e+00\r\n495 543 -4.6498258000000e+00\r\n541 543 -3.3777366000000e+02\r\n542 543  5.1959485000000e+01\r\n543 543  1.7914941000000e+01\r\n544 543  2.2909013000000e+01\r\n545 543 -3.7110429000000e+00\r\n546 543 -4.5901706000000e+00\r\n589 543  1.3855800000000e+01\r\n590 543 -2.2445083000000e+00\r\n591 543 -4.1008446000000e+00\r\n1647 543 -4.5628743000000e+00\r\n496 544 -1.8517045000000e-03\r\n498 544 -1.9325226000000e-05\r\n541 544 -1.6541766000000e-03\r\n543 544 -1.7263735000000e-05\r\n544 544  3.4496899000000e+02\r\n546 544  8.9592176000000e-04\r\n547 544 -3.3972665000000e-01\r\n549 544 -1.9714003000000e-05\r\n592 544 -4.4239529000000e-02\r\n594 544 -1.7560687000000e-05\r\n1648 544 -4.9122130000000e-02\r\n1650 544 -1.5748757000000e-05\r\n498 545 -3.0780453000000e+00\r\n543 545 -2.7154363000000e+00\r\n544 545 -2.4255089000000e+02\r\n545 545 -6.5723061000000e+01\r\n546 545  1.3987573000000e+01\r\n547 545  2.9580329000000e+01\r\n549 545 -3.0438226000000e+00\r\n592 545  1.5120848000000e+01\r\n594 545 -2.7114628000000e+00\r\n1650 545 -2.4314260000000e+00\r\n498 546 -5.2031278000000e+00\r\n543 546 -4.5901706000000e+00\r\n544 546 -4.1000802000000e+02\r\n545 546  6.3344299000000e+01\r\n546 546  2.3644591000000e+01\r\n547 546  5.0002588000000e+01\r\n548 546 -8.0998458000000e+00\r\n549 546 -5.1452776000000e+00\r\n592 546  2.5560282000000e+01\r\n593 546 -4.1404725000000e+00\r\n594 546 -4.5834567000000e+00\r\n1650 546 -4.1100826000000e+00\r\n499 547 -2.1035206000000e-03\r\n501 547 -2.1953293000000e-05\r\n544 547 -1.8889563000000e-03\r\n546 547 -1.9714003000000e-05\r\n547 547  3.9125737000000e+02\r\n549 547  1.0133153000000e-03\r\n550 547 -6.5888912000000e-01\r\n552 547 -2.2988498000000e-05\r\n595 547 -1.0794534000000e-01\r\n597 547 -2.0394295000000e-05\r\n1651 547 -2.6226452000000e-02\r\n1653 547 -1.4424569000000e-05\r\n501 548 -3.4153510000000e+00\r\n546 548 -3.0438226000000e+00\r\n547 548 -3.0226887000000e+02\r\n548 548 -7.4494601000000e+01\r\n549 548  1.5085272000000e+01\r\n550 548  5.2248365000000e+01\r\n552 548 -3.4270315000000e+00\r\n595 548  2.5803312000000e+01\r\n597 548 -3.0405040000000e+00\r\n1653 548 -2.1501943000000e+00\r\n501 549 -5.7733048000000e+00\r\n546 549 -5.1452776000000e+00\r\n547 549 -5.1095495000000e+02\r\n548 549  7.9264038000000e+01\r\n549 549  2.5500128000000e+01\r\n550 549  8.8320577000000e+01\r\n551 549 -1.4306604000000e+01\r\n552 549 -5.7930501000000e+00\r\n595 549  4.3617890000000e+01\r\n596 549 -7.0654417000000e+00\r\n597 549 -5.1396644000000e+00\r\n1653 549 -3.6346854000000e+00\r\n502 550 -2.4455422000000e-03\r\n504 550 -2.5522785000000e-05\r\n547 550 -2.2027119000000e-03\r\n549 550 -2.2988498000000e-05\r\n550 550  4.3748058000000e+02\r\n552 550  1.1357538000000e-03\r\n553 550 -8.3735753000000e-01\r\n555 550 -2.7548317000000e-05\r\n598 550 -2.5091805000000e-01\r\n600 550 -2.4896148000000e-05\r\n1654 550 -1.2839192000000e-03\r\n1656 550 -1.3399561000000e-05\r\n504 551 -3.8389315000000e+00\r\n549 551 -3.4270315000000e+00\r\n550 551 -3.8540336000000e+02\r\n551 551 -8.3267654000000e+01\r\n552 551  1.6619424000000e+01\r\n553 551  8.4500754000000e+01\r\n555 551 -3.8958941000000e+00\r\n598 551  5.0320737000000e+01\r\n600 551 -3.5209698000000e+00\r\n1656 551 -1.9272400000000e+00\r\n504 552 -6.4893297000000e+00\r\n549 552 -5.7930501000000e+00\r\n550 552 -6.5148583000000e+02\r\n551 552  1.0158914000000e+02\r\n552 552  2.8093470000000e+01\r\n553 552  1.4284007000000e+02\r\n554 552 -2.3137098000000e+01\r\n555 552 -6.5856193000000e+00\r\n598 552  8.5062173000000e+01\r\n599 552 -1.3778289000000e+01\r\n600 552 -5.9518472000000e+00\r\n1656 552 -3.2578065000000e+00\r\n505 553 -2.8912371000000e-03\r\n507 553 -3.0174259000000e-05\r\n550 553 -2.6396247000000e-03\r\n552 553 -2.7548317000000e-05\r\n553 553  5.0753119000000e+02\r\n555 553  1.3171729000000e-03\r\n556 553 -1.2129343000000e+00\r\n558 553 -3.3917203000000e-05\r\n601 553 -1.0637215000000e+00\r\n603 553 -3.0689517000000e-05\r\n1657 553 -1.1608889000000e-03\r\n1659 553 -1.2115562000000e-05\r\n507 554 -4.3673821000000e+00\r\n552 554 -3.8958941000000e+00\r\n553 554 -5.2536138000000e+02\r\n554 554 -9.6452559000000e+01\r\n555 554  1.8456140000000e+01\r\n556 554  1.0669878000000e+02\r\n558 554 -4.4722193000000e+00\r\n601 554  1.2856937000000e+02\r\n603 554 -4.0471967000000e+00\r\n1659 554 -1.6625969000000e+00\r\n507 555 -7.3826173000000e+00\r\n552 555 -6.5856193000000e+00\r\n553 555 -8.8807032000000e+02\r\n554 555  1.3918923000000e+02\r\n555 555  3.1198243000000e+01\r\n556 555  1.8036351000000e+02\r\n557 555 -2.9213649000000e+01\r\n558 555 -7.5598347000000e+00\r\n601 555  2.1733352000000e+02\r\n602 555 -3.5201717000000e+01\r\n603 555 -6.8413770000000e+00\r\n1659 555 -2.8104518000000e+00\r\n508 556 -3.2354013000000e-03\r\n510 556 -3.3766112000000e-05\r\n553 556 -3.2498785000000e-03\r\n555 556 -3.3917203000000e-05\r\n556 556  5.7849567000000e+02\r\n558 556  1.4973431000000e-03\r\n559 556 -3.4951579000000e-03\r\n561 556 -3.6477050000000e-05\r\n604 556 -4.3747313000000e+00\r\n606 556 -3.8023947000000e-05\r\n1660 556 -1.0601736000000e-03\r\n1662 556 -1.1064451000000e-05\r\n510 557 -4.7563521000000e+00\r\n555 557 -4.4722193000000e+00\r\n556 557 -7.9450407000000e+02\r\n557 557 -1.0963647000000e+02\r\n558 557  2.0151920000000e+01\r\n561 557 -4.7785850000000e+00\r\n604 557  4.6489940000000e+02\r\n606 557 -4.6673536000000e+00\r\n1662 557 -1.4650651000000e+00\r\n510 558 -8.0401375000000e+00\r\n555 558 -7.5598347000000e+00\r\n556 558 -1.3430296000000e+03\r\n557 558  2.1215420000000e+02\r\n558 558  3.4064795000000e+01\r\n561 558 -8.0777140000000e+00\r\n604 558  7.8586592000000e+02\r\n605 558 -1.2728026000000e+02\r\n606 558 -7.8896943000000e+00\r\n1662 558 -2.4765460000000e+00\r\n511 559 -3.1685388000000e-03\r\n513 559 -3.3068305000000e-05\r\n556 559 -1.1079898000000e+00\r\n558 559 -3.6477050000000e-05\r\n559 559  5.7644819000000e+02\r\n561 559  1.4950011000000e-03\r\n562 559 -3.2937125000000e-03\r\n564 559 -3.4374674000000e-05\r\n607 559 -1.1830743000000e+00\r\n609 559 -3.6365310000000e-05\r\n1663 559 -1.0245894000000e-03\r\n1665 559 -1.0693079000000e-05\r\n513 560 -4.7524962000000e+00\r\n556 560  1.0412546000000e+02\r\n558 560 -4.7785850000000e+00\r\n559 560 -5.7975761000000e+02\r\n560 560 -1.0960089000000e+02\r\n561 560  2.0548189000000e+01\r\n564 560 -4.7776800000000e+00\r\n607 560  1.4597505000000e+02\r\n609 560 -4.7645572000000e+00\r\n1665 560 -1.4625411000000e+00\r\n513 561 -8.0336129000000e+00\r\n556 561  1.7601354000000e+02\r\n557 561 -2.8508945000000e+01\r\n558 561 -8.0777140000000e+00\r\n559 561 -9.8002155000000e+02\r\n560 561  1.5345788000000e+02\r\n561 561  3.4734637000000e+01\r\n564 561 -8.0761900000000e+00\r\n607 561  2.4675605000000e+02\r\n608 561 -3.9967119000000e+01\r\n609 561 -8.0540009000000e+00\r\n1665 561 -2.4722779000000e+00\r\n514 562 -3.0706918000000e-03\r\n516 562 -3.2047129000000e-05\r\n559 562 -9.2503375000000e-01\r\n561 562 -3.4374674000000e-05\r\n562 562  5.7558862000000e+02\r\n564 562  1.4879754000000e-03\r\n565 562 -3.1647136000000e-03\r\n567 562 -3.3028383000000e-05\r\n610 562 -4.7106134000000e-01\r\n612 562 -3.4274280000000e-05\r\n1666 562 -9.8565306000000e-04\r\n1668 562 -1.0286721000000e-05\r\n516 563 -4.7494534000000e+00\r\n559 563  8.8420532000000e+01\r\n561 563 -4.7776800000000e+00\r\n562 563 -4.9169918000000e+02\r\n563 563 -1.0956911000000e+02\r\n564 563  2.0541572000000e+01\r\n567 563 -4.7763472000000e+00\r\n610 563  7.3575168000000e+01\r\n612 563 -4.7640016000000e+00\r\n1668 563 -1.4617749000000e+00\r\n516 564 -8.0284759000000e+00\r\n559 564  1.4946606000000e+02\r\n560 564 -2.4210075000000e+01\r\n561 564 -8.0761900000000e+00\r\n562 564 -8.3116828000000e+02\r\n563 564  1.2943272000000e+02\r\n564 564  3.4723467000000e+01\r\n567 564 -8.0739316000000e+00\r\n610 564  1.2437146000000e+02\r\n611 564 -2.0145325000000e+01\r\n612 564 -8.0530681000000e+00\r\n1668 564 -2.4709843000000e+00\r\n517 565 -2.9912485000000e-03\r\n519 565 -3.1218023000000e-05\r\n562 565 -6.4445134000000e-01\r\n564 565 -3.3028383000000e-05\r\n565 565  5.7516975000000e+02\r\n567 565  1.4832013000000e-03\r\n568 565 -3.0629382000000e-03\r\n570 565 -3.1966208000000e-05\r\n613 565 -3.0291400000000e-01\r\n615 565 -3.2962271000000e-05\r\n1669 565 -1.4067534000000e-02\r\n1671 565 -1.0104963000000e-05\r\n519 566 -4.7506181000000e+00\r\n562 566  5.6210454000000e+01\r\n564 566 -4.7763472000000e+00\r\n565 566 -4.4068899000000e+02\r\n566 566 -1.0955398000000e+02\r\n567 566  2.0495125000000e+01\r\n570 566 -4.7275361000000e+00\r\n613 566  5.4752635000000e+01\r\n615 566 -4.7671558000000e+00\r\n1671 566 -1.4611605000000e+00\r\n519 567 -8.0304389000000e+00\r\n562 567  9.5018084000000e+01\r\n563 567 -1.5391186000000e+01\r\n564 567 -8.0739316000000e+00\r\n565 567 -7.4494017000000e+02\r\n566 567  1.1550708000000e+02\r\n567 567  3.4644941000000e+01\r\n570 567 -7.9914270000000e+00\r\n613 567  9.2553790000000e+01\r\n614 567 -1.4992013000000e+01\r\n615 567 -8.0583944000000e+00\r\n1671 567 -2.4699439000000e+00\r\n520 568 -2.8529776000000e-03\r\n522 568 -2.9774965000000e-05\r\n565 568 -4.0867176000000e-01\r\n567 568 -3.1966208000000e-05\r\n568 568  5.6332193000000e+02\r\n570 568  1.4207330000000e-03\r\n616 568 -1.5716562000000e-01\r\n618 568 -3.1899025000000e-05\r\n1672 568 -3.1166100000000e-02\r\n1674 568 -1.0076485000000e-05\r\n522 569 -4.6086963000000e+00\r\n565 569  3.0525309000000e+01\r\n567 569 -4.7275361000000e+00\r\n568 569 -3.9126151000000e+02\r\n569 569 -1.0736000000000e+02\r\n570 569  1.5556430000000e+01\r\n616 569  3.7600113000000e+01\r\n618 569 -4.7180090000000e+00\r\n1674 569 -1.4901284000000e+00\r\n522 570 -7.7905402000000e+00\r\n565 570  5.1599982000000e+01\r\n566 570 -8.3583710000000e+00\r\n567 570 -7.9914270000000e+00\r\n568 570 -6.6138846000000e+02\r\n569 570  1.0208534000000e+02\r\n570 570  2.6296589000000e+01\r\n616 570  6.3559232000000e+01\r\n617 570 -1.0295578000000e+01\r\n618 570 -7.9753225000000e+00\r\n1674 570 -2.5189130000000e+00\r\n571 571  1.0000000000000e+00\r\n572 572  1.0000000000000e+00\r\n573 573  1.0000000000000e+00\r\n574 574  1.0000000000000e+00\r\n575 575  1.0000000000000e+00\r\n576 576  1.0000000000000e+00\r\n577 577  1.0000000000000e+00\r\n578 578  1.0000000000000e+00\r\n579 579  1.0000000000000e+00\r\n580 580  1.0000000000000e+00\r\n581 581  1.0000000000000e+00\r\n582 582  1.0000000000000e+00\r\n583 583  1.0000000000000e+00\r\n584 584  1.0000000000000e+00\r\n585 585  1.0000000000000e+00\r\n586 586  2.2978609000000e+02\r\n588 586  5.8613218000000e-04\r\n589 586 -3.5185103000000e-02\r\n591 586 -1.3283667000000e-05\r\n634 586 -1.1599025000000e-03\r\n636 586 -1.2105267000000e-05\r\n1690 586 -6.2688382000000e-02\r\n1692 586 -2.3213044000000e-05\r\n586 587 -1.3774419000000e+02\r\n587 587 -4.3816660000000e+01\r\n588 587  7.6424481000000e+00\r\n589 587  5.8459524000000e+00\r\n591 587 -2.0845371000000e+00\r\n636 587 -1.9104687000000e+00\r\n1692 587 -3.6425216000000e+00\r\n586 588 -2.3284278000000e+02\r\n587 588  3.5667017000000e+01\r\n588 588  1.2918794000000e+01\r\n589 588  9.8819980000000e+00\r\n590 588 -1.6007868000000e+00\r\n591 588 -3.5237015000000e+00\r\n636 588 -3.2294562000000e+00\r\n1692 588 -6.1573185000000e+00\r\n541 589 -1.4777835000000e-03\r\n543 589 -1.5422818000000e-05\r\n586 589 -1.2728144000000e-03\r\n588 589 -1.3283667000000e-05\r\n589 589  2.7585334000000e+02\r\n591 589  7.2235850000000e-04\r\n592 589 -1.7145267000000e-01\r\n594 589 -1.5635827000000e-05\r\n637 589 -1.2860444000000e-03\r\n639 589 -1.3421741000000e-05\r\n1693 589 -5.8961975000000e-02\r\n1695 589 -1.9556480000000e-05\r\n543 590 -2.4259626000000e+00\r\n588 590 -2.0845371000000e+00\r\n589 590 -1.7607907000000e+02\r\n590 590 -5.2585057000000e+01\r\n591 590  1.2065069000000e+01\r\n592 590  1.7455773000000e+01\r\n594 590 -2.4283018000000e+00\r\n637 590  3.5253523000000e-01\r\n639 590 -2.0833663000000e+00\r\n1695 590 -3.0369940000000e+00\r\n543 591 -4.1008446000000e+00\r\n588 591 -3.5237015000000e+00\r\n589 591 -2.9764387000000e+02\r\n590 591  4.5741228000000e+01\r\n591 591  2.0394783000000e+01\r\n592 591  2.9507220000000e+01\r\n593 591 -4.7798516000000e+00\r\n594 591 -4.1047987000000e+00\r\n637 591  5.9592515000000e-01\r\n638 591 -9.6533443000000e-02\r\n639 591 -3.5217201000000e+00\r\n1695 591 -5.1337324000000e+00\r\n544 592 -1.6826299000000e-03\r\n546 592 -1.7560687000000e-05\r\n589 592 -1.4981936000000e-03\r\n591 592 -1.5635827000000e-05\r\n592 592  3.1047109000000e+02\r\n594 592  8.1079021000000e-04\r\n595 592 -3.5516694000000e-01\r\n597 592 -1.7948696000000e-05\r\n640 592 -1.5437154000000e-03\r\n642 592 -1.6110912000000e-05\r\n1696 592 -4.8563239000000e-02\r\n1698 592 -1.7854924000000e-05\r\n546 593 -2.7114628000000e+00\r\n591 593 -2.4283018000000e+00\r\n592 593 -2.1574654000000e+02\r\n593 593 -5.9166043000000e+01\r\n594 593  1.2989807000000e+01\r\n595 593  3.4295519000000e+01\r\n597 593 -2.7159780000000e+00\r\n640 593  3.4077931000000e+00\r\n642 593 -2.4258745000000e+00\r\n1698 593 -2.7015410000000e+00\r\n546 594 -4.5834567000000e+00\r\n591 594 -4.1047987000000e+00\r\n592 594 -3.6469795000000e+02\r\n593 594  5.6273456000000e+01\r\n594 594  2.1957967000000e+01\r\n595 594  5.7973145000000e+01\r\n596 594 -9.3908619000000e+00\r\n597 594 -4.5910892000000e+00\r\n640 594  5.7605335000000e+00\r\n641 594 -9.3312816000000e-01\r\n642 594 -4.1006982000000e+00\r\n1698 594 -4.5666848000000e+00\r\n547 595 -1.9541406000000e-03\r\n549 595 -2.0394295000000e-05\r\n592 595 -1.7198082000000e-03\r\n594 595 -1.7948696000000e-05\r\n595 595  3.4523209000000e+02\r\n597 595  9.0225060000000e-04\r\n598 595 -7.1300240000000e-01\r\n600 595 -2.1604671000000e-05\r\n643 595 -1.8373648000000e-03\r\n645 595 -1.9175571000000e-05\r\n1699 595 -1.4615176000000e-02\r\n1701 595 -1.6793702000000e-05\r\n549 596 -3.0405040000000e+00\r\n594 596 -2.7159780000000e+00\r\n595 596 -2.6674948000000e+02\r\n596 596 -6.5753455000000e+01\r\n597 596  1.4087562000000e+01\r\n598 596  6.5837486000000e+01\r\n600 596 -3.1277751000000e+00\r\n643 596  3.1057057000000e+00\r\n645 596 -2.7649448000000e+00\r\n1701 596 -2.4309664000000e+00\r\n549 597 -5.1396644000000e+00\r\n594 597 -4.5910892000000e+00\r\n595 597 -4.5091303000000e+02\r\n596 597  6.9892338000000e+01\r\n597 597  2.3813602000000e+01\r\n598 597  1.1129162000000e+02\r\n599 597 -1.8027209000000e+01\r\n600 597 -5.2871876000000e+00\r\n643 597  5.2498816000000e+00\r\n644 597 -8.5038494000000e-01\r\n645 597 -4.6738596000000e+00\r\n1701 597 -4.1093030000000e+00\r\n550 598 -2.3854991000000e-03\r\n552 598 -2.4896148000000e-05\r\n595 598 -2.0701163000000e-03\r\n597 598 -2.1604671000000e-05\r\n598 598  4.1487000000000e+02\r\n600 598  1.0797161000000e-03\r\n601 598 -1.4893747000000e+00\r\n603 598 -2.7142091000000e-05\r\n646 598 -2.2757736000000e-03\r\n648 598 -2.3751003000000e-05\r\n1702 598 -1.4057315000000e-03\r\n1704 598 -1.4670850000000e-05\r\n552 599 -3.5209698000000e+00\r\n597 599 -3.1277751000000e+00\r\n598 599 -3.8085355000000e+02\r\n599 599 -7.8927659000000e+01\r\n600 599  1.5582531000000e+01\r\n601 599  1.4352064000000e+02\r\n603 599 -3.6647369000000e+00\r\n648 599 -3.2334390000000e+00\r\n1704 599 -2.0267265000000e+00\r\n552 600 -5.9518472000000e+00\r\n597 600 -5.2871876000000e+00\r\n598 600 -6.4379484000000e+02\r\n599 600  1.0044229000000e+02\r\n600 600  2.6340706000000e+01\r\n601 600  2.4260728000000e+02\r\n602 600 -3.9295989000000e+01\r\n603 600 -6.1948711000000e+00\r\n648 600 -5.4658053000000e+00\r\n1704 600 -3.4259784000000e+00\r\n553 601 -2.9406082000000e-03\r\n555 601 -3.0689517000000e-05\r\n598 601 -2.6007009000000e-03\r\n600 601 -2.7142091000000e-05\r\n601 601  4.7473149000000e+02\r\n603 601  1.2383838000000e-03\r\n604 601 -3.9991868000000e+00\r\n606 601 -3.5238816000000e-05\r\n649 601 -2.8115951000000e-03\r\n651 601 -2.9343079000000e-05\r\n1705 601 -1.3243924000000e-03\r\n1707 601 -1.3821958000000e-05\r\n555 602 -4.0471967000000e+00\r\n600 602 -3.6647369000000e+00\r\n601 602 -6.5802809000000e+02\r\n602 602 -8.9945654000000e+01\r\n603 602  1.7444635000000e+01\r\n604 602  3.8781468000000e+02\r\n606 602 -4.2295457000000e+00\r\n651 602 -3.7128363000000e+00\r\n1707 602 -1.7801773000000e+00\r\n555 603 -6.8413770000000e+00\r\n600 603 -6.1948711000000e+00\r\n601 603 -1.1123300000000e+03\r\n602 603  1.7564428000000e+02\r\n603 603  2.9488395000000e+01\r\n604 603  6.5556152000000e+02\r\n605 603 -1.0617404000000e+02\r\n606 603 -7.1496192000000e+00\r\n651 603 -6.2761737000000e+00\r\n1707 603 -3.0092095000000e+00\r\n556 604 -3.6433786000000e-03\r\n558 604 -3.8023947000000e-05\r\n601 604 -3.3765129000000e-03\r\n603 604 -3.5238816000000e-05\r\n604 604  5.6907973000000e+02\r\n606 604  1.5789273000000e-03\r\n607 604 -3.7515504000000e-03\r\n609 604 -3.9152878000000e-05\r\n652 604 -3.6096880000000e-03\r\n654 604 -3.7672337000000e-05\r\n1708 604 -1.2329110000000e-03\r\n1710 604 -1.2867217000000e-05\r\n558 605 -4.6673536000000e+00\r\n603 605 -4.2295457000000e+00\r\n604 605 -2.1044274000000e+03\r\n605 605 -1.0545640000000e+02\r\n606 605  3.1506343000000e+01\r\n609 605 -4.6844756000000e+00\r\n654 605 -4.4348850000000e+00\r\n1710 605 -1.5208751000000e+00\r\n558 606 -7.8896943000000e+00\r\n603 606 -7.1496192000000e+00\r\n604 606 -3.5573237000000e+03\r\n605 606  5.7035342000000e+02\r\n606 606  5.3258311000000e+01\r\n609 606 -7.9186335000000e+00\r\n654 606 -7.4967294000000e+00\r\n1710 606 -2.5708872000000e+00\r\n559 607 -3.4844513000000e-03\r\n561 607 -3.6365310000000e-05\r\n604 607 -4.3132374000000e+00\r\n606 607 -3.9152878000000e-05\r\n607 607  5.7838196000000e+02\r\n609 607  1.5051761000000e-03\r\n610 607 -3.4620455000000e-03\r\n612 607 -3.6131473000000e-05\r\n655 607 -3.6521160000000e-03\r\n657 607 -3.8115135000000e-05\r\n1711 607 -1.0845381000000e-03\r\n1713 607 -1.1318731000000e-05\r\n561 608 -4.7645572000000e+00\r\n604 608  4.2514024000000e+02\r\n606 608 -4.6844756000000e+00\r\n607 608 -7.5467552000000e+02\r\n608 608 -1.0968478000000e+02\r\n609 608  2.0472160000000e+01\r\n612 608 -4.7794951000000e+00\r\n657 608 -4.7715009000000e+00\r\n1713 608 -1.4597647000000e+00\r\n561 609 -8.0540009000000e+00\r\n604 609  7.1865668000000e+02\r\n605 609 -1.1639256000000e+02\r\n606 609 -7.9186335000000e+00\r\n607 609 -1.2757028000000e+03\r\n608 609  2.0112619000000e+02\r\n609 609  3.4606123000000e+01\r\n612 609 -8.0792585000000e+00\r\n657 609 -8.0657406000000e+00\r\n1713 609 -2.4675848000000e+00\r\n562 610 -3.2840929000000e-03\r\n564 610 -3.4274280000000e-05\r\n607 610 -1.6392645000000e+00\r\n609 610 -3.6131473000000e-05\r\n610 610  5.7577660000000e+02\r\n612 610  1.4956980000000e-03\r\n613 610 -3.2907314000000e-03\r\n615 610 -3.4343562000000e-05\r\n658 610 -3.4728984000000e-03\r\n660 610 -3.6244739000000e-05\r\n1714 610 -1.0266717000000e-03\r\n1716 610 -1.0714810000000e-05\r\n564 611 -4.7640016000000e+00\r\n607 611  1.6106208000000e+02\r\n609 611 -4.7794951000000e+00\r\n610 611 -4.9827023000000e+02\r\n611 611 -1.0962325000000e+02\r\n612 611  2.0564645000000e+01\r\n615 611 -4.7780980000000e+00\r\n658 611  7.5819676000000e+00\r\n660 611 -4.7703929000000e+00\r\n1716 611 -1.4603184000000e+00\r\n564 612 -8.0530681000000e+00\r\n607 612  2.7225934000000e+02\r\n608 612 -4.4098175000000e+01\r\n609 612 -8.0792585000000e+00\r\n610 612 -8.4227598000000e+02\r\n611 612  1.3109326000000e+02\r\n612 612  3.4762469000000e+01\r\n615 612 -8.0768906000000e+00\r\n658 612  1.2816558000000e+01\r\n659 612 -2.0759135000000e+00\r\n660 612 -8.0638721000000e+00\r\n1716 612 -2.4685221000000e+00\r\n565 613 -3.1583789000000e-03\r\n567 613 -3.2962271000000e-05\r\n610 613 -8.1337681000000e-01\r\n612 613 -3.4343562000000e-05\r\n613 613  5.7519600000000e+02\r\n615 613  1.4890724000000e-03\r\n616 613 -3.1813009000000e-03\r\n618 613 -3.3201496000000e-05\r\n661 613 -2.2166944000000e-01\r\n663 613 -3.4294215000000e-05\r\n1717 613 -9.9022856000000e-04\r\n1719 613 -1.0334473000000e-05\r\n567 614 -4.7671558000000e+00\r\n610 614  7.5140097000000e+01\r\n612 614 -4.7780980000000e+00\r\n613 614 -4.4468461000000e+02\r\n614 614 -1.0959875000000e+02\r\n615 614  2.0565455000000e+01\r\n618 614 -4.7774699000000e+00\r\n661 614  3.9882149000000e+01\r\n663 614 -4.7713253000000e+00\r\n1719 614 -1.4590786000000e+00\r\n567 615 -8.0583944000000e+00\r\n610 615  1.2701672000000e+02\r\n611 615 -2.0573825000000e+01\r\n612 615 -8.0768906000000e+00\r\n613 615 -7.5169429000000e+02\r\n614 615  1.1648750000000e+02\r\n615 615  3.4763825000000e+01\r\n618 615 -8.0758350000000e+00\r\n661 615  6.7416734000000e+01\r\n662 615 -1.0919981000000e+01\r\n663 615 -8.0654413000000e+00\r\n1719 615 -2.4664250000000e+00\r\n568 616 -3.0565007000000e-03\r\n570 616 -3.1899025000000e-05\r\n613 616 -5.5733083000000e-01\r\n615 616 -3.3201496000000e-05\r\n616 616  5.7475318000000e+02\r\n618 616  1.4191498000000e-03\r\n1720 616 -2.5510073000000e-02\r\n1722 616 -1.0149217000000e-05\r\n570 617 -4.7180090000000e+00\r\n613 617  4.7641436000000e+01\r\n615 617 -4.7774699000000e+00\r\n616 617 -3.7732136000000e+02\r\n617 617 -1.0958694000000e+02\r\n618 617  1.0968069000000e+01\r\n1722 617 -1.4602675000000e+00\r\n570 618 -7.9753225000000e+00\r\n613 618  8.0533082000000e+01\r\n614 618 -1.3044827000000e+01\r\n615 618 -8.0758350000000e+00\r\n616 618 -6.3782403000000e+02\r\n617 618  9.8074874000000e+01\r\n618 618  1.8540423000000e+01\r\n1722 618 -2.4684361000000e+00\r\n619 619  1.0000000000000e+00\r\n620 620  1.0000000000000e+00\r\n621 621  1.0000000000000e+00\r\n622 622  1.0000000000000e+00\r\n623 623  1.0000000000000e+00\r\n624 624  1.0000000000000e+00\r\n625 625  1.0000000000000e+00\r\n626 626  1.0000000000000e+00\r\n627 627  1.0000000000000e+00\r\n628 628  1.0000000000000e+00\r\n629 629  1.0000000000000e+00\r\n630 630  1.0000000000000e+00\r\n631 631  1.0000000000000e+00\r\n632 632  1.0000000000000e+00\r\n633 633  1.0000000000000e+00\r\n586 634 -6.7886457000000e-02\r\n588 634 -1.2105267000000e-05\r\n634 634  2.2985844000000e+02\r\n636 634  5.9672425000000e-04\r\n637 634 -4.1488017000000e-02\r\n639 634 -1.2103840000000e-05\r\n682 634 -1.1404836000000e-03\r\n684 634 -1.1902603000000e-05\r\n1738 634 -6.3308042000000e-02\r\n1740 634 -2.3087268000000e-05\r\n586 635  2.8870110000000e+00\r\n588 635 -1.9104687000000e+00\r\n634 635 -1.4334945000000e+02\r\n635 635 -4.3819004000000e+01\r\n636 635  9.3800710000000e+00\r\n637 635  8.5673652000000e+00\r\n639 635 -1.9103693000000e+00\r\n684 635 -1.9106725000000e+00\r\n1740 635 -3.6436389000000e+00\r\n586 636  4.8802034000000e+00\r\n587 636 -7.9054791000000e-01\r\n588 636 -3.2294562000000e+00\r\n634 636 -2.4231791000000e+02\r\n635 636  3.7196344000000e+01\r\n636 636  1.5856072000000e+01\r\n637 636  1.4482274000000e+01\r\n638 636 -2.3459947000000e+00\r\n639 636 -3.2292883000000e+00\r\n684 636 -3.2298007000000e+00\r\n1740 636 -6.1592072000000e+00\r\n589 637 -6.3956856000000e-02\r\n591 637 -1.3421741000000e-05\r\n634 637 -1.1597657000000e-03\r\n636 637 -1.2103840000000e-05\r\n637 637  2.2995780000000e+02\r\n639 637  6.1212934000000e-04\r\n640 637 -1.5422862000000e-01\r\n642 637 -1.3429905000000e-05\r\n685 637 -1.1663975000000e-03\r\n687 637 -1.2173052000000e-05\r\n1741 637 -6.0973523000000e-02\r\n1743 637 -2.3473926000000e-05\r\n591 638 -2.0833663000000e+00\r\n636 638 -1.9103693000000e+00\r\n637 638 -1.4944624000000e+02\r\n638 638 -4.3826616000000e+01\r\n639 638  1.1637723000000e+01\r\n640 638  1.7561895000000e+01\r\n642 638 -2.0848288000000e+00\r\n687 638 -1.9104756000000e+00\r\n1743 638 -3.6437574000000e+00\r\n591 639 -3.5217201000000e+00\r\n636 639 -3.2292883000000e+00\r\n637 639 -2.5262376000000e+02\r\n638 639  3.8846729000000e+01\r\n639 639  1.9672395000000e+01\r\n640 639  2.9686608000000e+01\r\n641 639 -4.8089082000000e+00\r\n642 639 -3.5241921000000e+00\r\n687 639 -3.2294658000000e+00\r\n1743 639 -6.1594038000000e+00\r\n592 640 -6.6318298000000e-02\r\n594 640 -1.6110912000000e-05\r\n637 640 -1.2868267000000e-03\r\n639 640 -1.3429905000000e-05\r\n640 640  2.7605201000000e+02\r\n642 640  7.2487228000000e-04\r\n643 640 -3.2951707000000e-01\r\n645 640 -1.6403515000000e-05\r\n688 640 -1.3144753000000e-03\r\n690 640 -1.3718459000000e-05\r\n1744 640 -5.2938282000000e-02\r\n1746 640 -2.0166959000000e-05\r\n594 641 -2.4258745000000e+00\r\n639 641 -2.0848288000000e+00\r\n640 641 -1.8874184000000e+02\r\n641 641 -5.2601941000000e+01\r\n642 641  1.2107669000000e+01\r\n643 641  3.0495022000000e+01\r\n645 641 -2.4701913000000e+00\r\n690 641 -2.0841773000000e+00\r\n1746 641 -3.0366821000000e+00\r\n594 642 -4.1006982000000e+00\r\n639 642 -3.5241921000000e+00\r\n640 642 -3.1904920000000e+02\r\n641 642  4.9165927000000e+01\r\n642 642  2.0466800000000e+01\r\n643 642  5.1548785000000e+01\r\n644 642 -8.3501761000000e+00\r\n645 642 -4.1756113000000e+00\r\n690 642 -3.5230932000000e+00\r\n1746 642 -5.1332074000000e+00\r\n595 643 -6.8362792000000e-02\r\n597 643 -1.9175571000000e-05\r\n640 643 -1.5717520000000e-03\r\n642 643 -1.6403515000000e-05\r\n643 643  3.2214757000000e+02\r\n645 643  8.4329072000000e-04\r\n646 643 -5.2465201000000e-01\r\n648 643 -1.9795671000000e-05\r\n691 643 -1.6557416000000e-03\r\n693 643 -1.7280069000000e-05\r\n1747 643 -2.9494763000000e-02\r\n1749 643 -1.8063337000000e-05\r\n597 644 -2.7649448000000e+00\r\n642 644 -2.4701913000000e+00\r\n643 644 -2.3400402000000e+02\r\n644 644 -6.1379794000000e+01\r\n645 644  1.3221950000000e+01\r\n646 644  4.9398648000000e+01\r\n648 644 -2.8547062000000e+00\r\n693 644 -2.5206038000000e+00\r\n1749 644 -2.6045985000000e+00\r\n597 645 -4.6738596000000e+00\r\n642 645 -4.1756113000000e+00\r\n643 645 -3.9556015000000e+02\r\n644 645  6.1111547000000e+01\r\n645 645  2.2350372000000e+01\r\n646 645  8.3503422000000e+01\r\n647 645 -1.3525992000000e+01\r\n648 645 -4.8255923000000e+00\r\n693 645 -4.2608252000000e+00\r\n1749 645 -4.4028107000000e+00\r\n598 646 -2.2283947000000e-01\r\n600 646 -2.3751003000000e-05\r\n643 646 -1.8967816000000e-03\r\n645 646 -1.9795671000000e-05\r\n646 646  3.6847470000000e+02\r\n648 646  9.6544672000000e-04\r\n649 646 -8.1318431000000e-01\r\n651 646 -2.4093738000000e-05\r\n694 646 -2.0286485000000e-03\r\n696 646 -2.1171893000000e-05\r\n1750 646 -1.5824708000000e-03\r\n1752 646 -1.6515382000000e-05\r\n598 647  8.4749399000000e+00\r\n600 647 -3.2334390000000e+00\r\n645 647 -2.8547062000000e+00\r\n646 647 -2.9669662000000e+02\r\n647 647 -7.0166544000000e+01\r\n648 647  1.4612125000000e+01\r\n649 647  7.7270965000000e+01\r\n651 647 -3.2805685000000e+00\r\n696 647 -2.9554628000000e+00\r\n1752 647 -2.2800486000000e+00\r\n598 648  1.4326038000000e+01\r\n599 648 -2.3204550000000e+00\r\n600 648 -5.4658053000000e+00\r\n645 648 -4.8255923000000e+00\r\n646 648 -5.0153595000000e+02\r\n647 648  7.7805696000000e+01\r\n648 648  2.4700333000000e+01\r\n649 648  1.3061884000000e+02\r\n650 648 -2.1156940000000e+01\r\n651 648 -5.5454729000000e+00\r\n696 648 -4.9959143000000e+00\r\n1752 648 -3.8541941000000e+00\r\n601 649 -8.4451639000000e-01\r\n603 649 -2.9343079000000e-05\r\n646 649 -2.3086138000000e-03\r\n648 649 -2.4093738000000e-05\r\n649 649  4.2671000000000e+02\r\n651 649  1.1198369000000e-03\r\n652 649 -1.0475849000000e+00\r\n654 649 -3.0681625000000e-05\r\n697 649 -2.5012740000000e-03\r\n699 649 -2.6104427000000e-05\r\n1753 649 -1.4416386000000e-03\r\n1755 649 -1.5045593000000e-05\r\n601 650  6.7680332000000e+01\r\n603 650 -3.7128363000000e+00\r\n648 650 -3.2805685000000e+00\r\n649 650 -4.0881465000000e+02\r\n650 650 -8.1159344000000e+01\r\n651 650  1.6340623000000e+01\r\n652 650  9.7265790000000e+01\r\n654 650 -3.8824558000000e+00\r\n699 650 -3.4832142000000e+00\r\n1755 650 -1.9724001000000e+00\r\n601 651  1.1440675000000e+02\r\n602 651 -1.8529986000000e+01\r\n603 651 -6.2761737000000e+00\r\n648 651 -5.5454729000000e+00\r\n649 651 -6.9105976000000e+02\r\n650 651  1.0788868000000e+02\r\n651 651  2.7622172000000e+01\r\n652 651  1.6441797000000e+02\r\n653 651 -2.6630093000000e+01\r\n654 651 -6.5628982000000e+00\r\n699 651 -5.8880212000000e+00\r\n1755 651 -3.3341428000000e+00\r\n604 652 -4.0053101000000e+00\r\n606 652 -3.7672337000000e-05\r\n649 652 -2.9398520000000e-03\r\n651 652 -3.0681625000000e-05\r\n652 652  5.2063920000000e+02\r\n654 652  1.3599029000000e-03\r\n655 652 -3.4660619000000e-03\r\n657 652 -3.6173390000000e-05\r\n700 652 -3.1482507000000e-03\r\n702 652 -3.2856569000000e-05\r\n1756 652 -1.2296929000000e-03\r\n1758 652 -1.2833632000000e-05\r\n604 653  3.7637479000000e+02\r\n606 653 -4.4348850000000e+00\r\n651 653 -3.8824558000000e+00\r\n652 653 -6.7291882000000e+02\r\n653 653 -9.8742650000000e+01\r\n654 653  1.8725128000000e+01\r\n657 653 -4.5287714000000e+00\r\n702 653 -4.2455944000000e+00\r\n1758 653 -1.6222799000000e+00\r\n604 654  6.3622393000000e+02\r\n605 654 -1.0304043000000e+02\r\n606 654 -7.4967294000000e+00\r\n651 654 -6.5628982000000e+00\r\n652 654 -1.1375019000000e+03\r\n653 654  1.7922403000000e+02\r\n654 654  3.1652947000000e+01\r\n657 654 -7.6554309000000e+00\r\n702 654 -7.1767526000000e+00\r\n1758 654 -2.7423019000000e+00\r\n607 655 -9.7162808000000e-01\r\n609 655 -3.8115135000000e-05\r\n652 655 -1.0016969000000e+00\r\n654 655 -3.6173390000000e-05\r\n655 655  5.7604994000000e+02\r\n657 655  1.5023318000000e-03\r\n658 655 -3.4792827000000e-03\r\n660 655 -3.6311369000000e-05\r\n703 655 -3.4989709000000e-03\r\n705 655 -3.6516844000000e-05\r\n1759 655 -1.0719859000000e-03\r\n1761 655 -1.1187730000000e-05\r\n607 656  7.4628540000000e+01\r\n609 656 -4.7715009000000e+00\r\n652 656  9.7489376000000e+01\r\n654 656 -4.5287714000000e+00\r\n655 656 -5.0166834000000e+02\r\n656 656 -1.0967559000000e+02\r\n657 656  2.0323078000000e+01\r\n660 656 -4.7798171000000e+00\r\n705 656 -4.7714255000000e+00\r\n1761 656 -1.4592005000000e+00\r\n607 657  1.2615201000000e+02\r\n608 657 -2.0432140000000e+01\r\n609 657 -8.0657406000000e+00\r\n652 657  1.6479595000000e+02\r\n653 657 -2.6691085000000e+01\r\n654 657 -7.6554309000000e+00\r\n655 657 -8.4801969000000e+02\r\n656 657  1.3188810000000e+02\r\n657 657  3.4354116000000e+01\r\n660 657 -8.0798027000000e+00\r\n705 657 -8.0656140000000e+00\r\n1761 657 -2.4666309000000e+00\r\n610 658 -1.5987333000000e-01\r\n612 658 -3.6244739000000e-05\r\n655 658 -8.2628466000000e-01\r\n657 658 -3.6311369000000e-05\r\n658 658  5.7509413000000e+02\r\n660 658  1.4986357000000e-03\r\n661 658 -3.3828411000000e-03\r\n663 658 -3.5304860000000e-05\r\n706 658 -3.4459143000000e-03\r\n708 658 -3.5963121000000e-05\r\n1762 658 -1.0383418000000e-03\r\n1764 658 -1.0836605000000e-05\r\n612 659 -4.7703929000000e+00\r\n655 659  7.8714003000000e+01\r\n657 659 -4.7798171000000e+00\r\n658 659 -4.0830577000000e+02\r\n659 659 -1.0964765000000e+02\r\n660 659  2.0571294000000e+01\r\n663 659 -4.7794430000000e+00\r\n708 659 -4.7708020000000e+00\r\n1764 659 -1.4584898000000e+00\r\n612 660 -8.0638721000000e+00\r\n655 660  1.3305815000000e+02\r\n656 660 -2.1551510000000e+01\r\n657 660 -8.0798027000000e+00\r\n658 660 -6.9020007000000e+02\r\n659 660  1.0640089000000e+02\r\n660 660  3.4773710000000e+01\r\n663 660 -8.0791644000000e+00\r\n708 660 -8.0645636000000e+00\r\n1764 660 -2.4654311000000e+00\r\n613 661 -3.2860031000000e-03\r\n615 661 -3.4294215000000e-05\r\n658 661 -4.3816125000000e-01\r\n660 661 -3.5304860000000e-05\r\n661 661  5.7456493000000e+02\r\n663 661  1.4597886000000e-03\r\n709 661 -3.3981475000000e-03\r\n711 661 -3.5464605000000e-05\r\n1765 661 -2.1262248000000e-03\r\n1767 661 -1.0778205000000e-05\r\n615 662 -4.7713253000000e+00\r\n658 662  4.2804789000000e+01\r\n660 662 -4.7794430000000e+00\r\n661 662 -3.8206304000000e+02\r\n662 662 -1.0963121000000e+02\r\n663 662  1.5793919000000e+01\r\n709 662  9.6425004000000e+00\r\n711 662 -4.7718529000000e+00\r\n1767 662 -1.4589556000000e+00\r\n615 663 -8.0654413000000e+00\r\n658 663  7.2357161000000e+01\r\n659 663 -1.1719986000000e+01\r\n660 663 -8.0791644000000e+00\r\n661 663 -6.4583890000000e+02\r\n662 663  9.9258914000000e+01\r\n663 663  2.6698019000000e+01\r\n709 663  1.6299671000000e+01\r\n710 663 -2.6401245000000e+00\r\n711 663 -8.0663336000000e+00\r\n1767 663 -2.4662167000000e+00\r\n664 664  1.0000000000000e+00\r\n665 665  1.0000000000000e+00\r\n666 666  1.0000000000000e+00\r\n667 667  1.0000000000000e+00\r\n668 668  1.0000000000000e+00\r\n669 669  1.0000000000000e+00\r\n670 670  1.0000000000000e+00\r\n671 671  1.0000000000000e+00\r\n672 672  1.0000000000000e+00\r\n673 673  1.0000000000000e+00\r\n674 674  1.0000000000000e+00\r\n675 675  1.0000000000000e+00\r\n676 676  1.0000000000000e+00\r\n677 677  1.0000000000000e+00\r\n678 678  1.0000000000000e+00\r\n679 679  2.4128114000000e+02\r\n681 679  6.1053060000000e-04\r\n682 679 -3.6745224000000e-02\r\n684 679 -1.1963890000000e-05\r\n727 679 -1.2401056000000e-03\r\n729 679 -1.2942303000000e-05\r\n1783 679 -6.3456979000000e-02\r\n1785 679 -2.1232487000000e-05\r\n679 680 -1.4777267000000e+02\r\n680 680 -4.6000009000000e+01\r\n681 680  7.5709913000000e+00\r\n682 680  9.2686398000000e+00\r\n684 680 -1.9555350000000e+00\r\n729 680 -2.1400582000000e+00\r\n1785 680 -3.4702348000000e+00\r\n679 681 -2.4979476000000e+02\r\n680 681  3.8330186000000e+01\r\n681 681  1.2797995000000e+01\r\n682 681  1.5667699000000e+01\r\n683 681 -2.5380787000000e+00\r\n684 681 -3.3056342000000e+00\r\n729 681 -3.6175519000000e+00\r\n1785 681 -5.8660810000000e+00\r\n634 682 -1.1595734000000e-01\r\n636 682 -1.1902603000000e-05\r\n679 682 -1.1463560000000e-03\r\n681 682 -1.1963890000000e-05\r\n682 682  2.2992078000000e+02\r\n684 682  6.0799291000000e-04\r\n685 682 -5.3412268000000e-02\r\n687 682 -1.1896592000000e-05\r\n730 682 -1.1498448000000e-03\r\n732 682 -1.2000301000000e-05\r\n1786 682 -6.3594462000000e-02\r\n1788 682 -2.2712078000000e-05\r\n634 683  8.5387112000000e+00\r\n636 683 -1.9106725000000e+00\r\n681 683 -1.9555350000000e+00\r\n682 683 -1.5201540000000e+02\r\n683 683 -4.3818310000000e+01\r\n684 683  1.1383840000000e+01\r\n685 683  1.1580450000000e+01\r\n687 683 -1.9098309000000e+00\r\n732 683 -1.9571084000000e+00\r\n1788 683 -3.6457717000000e+00\r\n634 684  1.4433837000000e+01\r\n635 684 -2.3381730000000e+00\r\n636 684 -3.2298007000000e+00\r\n681 684 -3.3056342000000e+00\r\n682 684 -2.5696684000000e+02\r\n683 684  3.9571585000000e+01\r\n684 684  1.9243241000000e+01\r\n685 684  1.9575592000000e+01\r\n686 684 -3.1710985000000e+00\r\n687 684 -3.2283782000000e+00\r\n732 684 -3.3082960000000e+00\r\n1788 684 -6.1628125000000e+00\r\n637 685 -1.0399828000000e-01\r\n639 685 -1.2173052000000e-05\r\n682 685 -1.1399077000000e-03\r\n684 685 -1.1896592000000e-05\r\n685 685  2.2998800000000e+02\r\n687 685  6.0896425000000e-04\r\n688 685 -1.4493342000000e-01\r\n690 685 -1.2176631000000e-05\r\n733 685 -1.1487335000000e-03\r\n735 685 -1.1988703000000e-05\r\n1789 685 -6.2686689000000e-02\r\n1791 685 -2.3209883000000e-05\r\n637 686  5.5208100000000e+00\r\n639 686 -1.9104756000000e+00\r\n684 686 -1.9098309000000e+00\r\n685 686 -1.5431280000000e+02\r\n686 686 -4.3828808000000e+01\r\n687 686  1.1289908000000e+01\r\n688 686  1.6910541000000e+01\r\n690 686 -1.9111809000000e+00\r\n735 686 -1.9108935000000e+00\r\n1791 686 -3.6426013000000e+00\r\n637 687  9.3323711000000e+00\r\n638 687 -1.5117534000000e+00\r\n639 687 -3.2294658000000e+00\r\n684 687 -3.2283782000000e+00\r\n685 687 -2.6085019000000e+02\r\n686 687  4.0174310000000e+01\r\n687 687  1.9084451000000e+01\r\n688 687  2.8585561000000e+01\r\n689 687 -4.6305832000000e+00\r\n690 687 -3.2306580000000e+00\r\n735 687 -3.2301723000000e+00\r\n1791 687 -6.1574493000000e+00\r\n640 688 -1.0959146000000e-01\r\n642 688 -1.3718459000000e-05\r\n685 688 -1.1667404000000e-03\r\n687 688 -1.2176631000000e-05\r\n688 688  2.3007758000000e+02\r\n690 688  6.1374558000000e-04\r\n691 688 -2.4328091000000e-01\r\n693 688 -1.3979237000000e-05\r\n736 688 -1.1848147000000e-03\r\n738 688 -1.2365262000000e-05\r\n1792 688 -5.8185297000000e-02\r\n1794 688 -2.3977760000000e-05\r\n640 689  5.1372413000000e+00\r\n642 689 -2.0841773000000e+00\r\n687 689 -1.9111809000000e+00\r\n688 689 -1.6120435000000e+02\r\n689 689 -4.3837882000000e+01\r\n690 689  1.1678161000000e+01\r\n691 689  2.4198730000000e+01\r\n693 689 -2.1239615000000e+00\r\n738 689 -1.9111011000000e+00\r\n1794 689 -3.6428105000000e+00\r\n640 690  8.6839927000000e+00\r\n641 690 -1.4066924000000e+00\r\n642 690 -3.5230932000000e+00\r\n687 690 -3.2306580000000e+00\r\n688 690 -2.7249984000000e+02\r\n689 690  4.2037981000000e+01\r\n690 690  1.9740762000000e+01\r\n691 690  4.0905532000000e+01\r\n692 690 -6.6261574000000e+00\r\n693 690 -3.5903445000000e+00\r\n738 690 -3.2305253000000e+00\r\n1794 690 -6.1578069000000e+00\r\n643 691 -1.8009043000000e-01\r\n645 691 -1.7280069000000e-05\r\n688 691 -1.3394625000000e-03\r\n690 691 -1.3979237000000e-05\r\n691 691  2.8765248000000e+02\r\n693 691  7.5606631000000e-04\r\n694 691 -3.5662905000000e-01\r\n696 691 -1.7870173000000e-05\r\n739 691 -1.4366905000000e-03\r\n741 691 -1.4993952000000e-05\r\n1795 691 -4.5081617000000e-02\r\n1797 691 -2.0015607000000e-05\r\n643 692  8.6115155000000e+00\r\n645 692 -2.5206038000000e+00\r\n690 692 -2.1239615000000e+00\r\n691 692 -2.0758615000000e+02\r\n692 692 -5.4808161000000e+01\r\n693 692  1.2411776000000e+01\r\n694 692  3.4155028000000e+01\r\n696 692 -2.6069066000000e+00\r\n741 692 -2.2345164000000e+00\r\n1797 692 -2.9196208000000e+00\r\n643 693  1.4556894000000e+01\r\n644 693 -2.3579633000000e+00\r\n645 693 -4.2608252000000e+00\r\n690 693 -3.5903445000000e+00\r\n691 693 -3.5090337000000e+02\r\n692 693  5.4184103000000e+01\r\n693 693  2.0980854000000e+01\r\n694 693  5.7735619000000e+01\r\n695 693 -9.3521645000000e+00\r\n696 693 -4.4067113000000e+00\r\n741 693 -3.7772243000000e+00\r\n1797 693 -4.9353235000000e+00\r\n646 694 -3.5002965000000e-01\r\n648 694 -2.1171893000000e-05\r\n691 694 -1.7122843000000e-03\r\n693 694 -1.7870173000000e-05\r\n694 694  3.4530721000000e+02\r\n696 694  9.0444207000000e-04\r\n697 694 -4.7150985000000e-01\r\n699 694 -2.2409953000000e-05\r\n742 694 -1.8424100000000e-03\r\n744 694 -1.9228224000000e-05\r\n1798 694 -1.5534761000000e-02\r\n1800 694 -1.7423765000000e-05\r\n646 695  2.2515897000000e+01\r\n648 695 -2.9554628000000e+00\r\n693 695 -2.6069066000000e+00\r\n694 695 -2.6385430000000e+02\r\n695 695 -6.5783412000000e+01\r\n696 695  1.3891176000000e+01\r\n697 695  4.3574756000000e+01\r\n699 695 -3.1285009000000e+00\r\n744 695 -2.7607207000000e+00\r\n1800 695 -2.4321780000000e+00\r\n646 696  3.8060872000000e+01\r\n647 696 -6.1650064000000e+00\r\n648 696 -4.9959143000000e+00\r\n693 696 -4.4067113000000e+00\r\n694 696 -4.4601930000000e+02\r\n695 696  6.9023803000000e+01\r\n696 696  2.3481640000000e+01\r\n697 696  7.3658766000000e+01\r\n698 696 -1.1931066000000e+01\r\n699 696 -5.2884179000000e+00\r\n744 696 -4.6667223000000e+00\r\n1800 696 -4.1113536000000e+00\r\n649 697 -7.5095722000000e-01\r\n651 697 -2.6104427000000e-05\r\n694 697 -2.1472769000000e-03\r\n696 697 -2.2409953000000e-05\r\n697 697  4.1453605000000e+02\r\n699 697  1.0835157000000e-03\r\n700 697 -4.3707748000000e-01\r\n702 697 -2.8371765000000e-05\r\n745 697 -2.3028751000000e-03\r\n747 697 -2.4033846000000e-05\r\n1801 697 -1.4331548000000e-03\r\n1803 697 -1.4957052000000e-05\r\n649 698  6.0063016000000e+01\r\n651 698 -3.4832142000000e+00\r\n696 698 -3.1285009000000e+00\r\n697 698 -3.3647841000000e+02\r\n698 698 -7.8955712000000e+01\r\n699 698  1.5770532000000e+01\r\n700 698  3.9122168000000e+01\r\n702 698 -3.7857528000000e+00\r\n747 698 -3.3371646000000e+00\r\n1803 698 -2.0270036000000e+00\r\n649 699  1.0153045000000e+02\r\n650 699 -1.6445125000000e+01\r\n651 699 -5.8880212000000e+00\r\n696 699 -5.2884179000000e+00\r\n697 699 -5.6878271000000e+02\r\n698 699  8.8222558000000e+01\r\n699 699  2.6658491000000e+01\r\n700 699  6.6132068000000e+01\r\n701 699 -1.0711566000000e+01\r\n702 699 -6.3994322000000e+00\r\n747 699 -5.6411381000000e+00\r\n1803 699 -3.4264445000000e+00\r\n652 700 -1.5705797000000e+00\r\n654 700 -3.2856569000000e-05\r\n697 700 -2.7185258000000e-03\r\n699 700 -2.8371765000000e-05\r\n700 700  5.0676230000000e+02\r\n702 700  1.3209824000000e-03\r\n703 700 -3.2815703000000e-03\r\n705 700 -3.4247952000000e-05\r\n748 700 -2.9025049000000e-03\r\n750 700 -3.0291855000000e-05\r\n1804 700 -1.1989549000000e-03\r\n1806 700 -1.2512836000000e-05\r\n652 701  1.3569495000000e+02\r\n654 701 -4.2455944000000e+00\r\n699 701 -3.7857528000000e+00\r\n700 701 -4.2570079000000e+02\r\n701 701 -9.6514271000000e+01\r\n702 701  1.8276708000000e+01\r\n705 701 -4.4749500000000e+00\r\n750 701 -4.1004355000000e+00\r\n1806 701 -1.6590973000000e+00\r\n652 702  2.2937874000000e+02\r\n653 702 -3.7152092000000e+01\r\n654 702 -7.1767526000000e+00\r\n699 702 -6.3994322000000e+00\r\n700 702 -7.1960461000000e+02\r\n701 702  1.1174866000000e+02\r\n702 702  3.0894940000000e+01\r\n705 702 -7.5644520000000e+00\r\n750 702 -6.9313760000000e+00\r\n1806 702 -2.8045381000000e+00\r\n655 703 -8.7393253000000e-01\r\n657 703 -3.6516844000000e-05\r\n700 703 -1.5378390000000e-01\r\n702 703 -3.4247952000000e-05\r\n703 703  5.7511438000000e+02\r\n705 703  1.4971549000000e-03\r\n706 703 -3.4522739000000e-03\r\n708 703 -3.6029493000000e-05\r\n751 703 -3.3966575000000e-03\r\n753 703 -3.5449055000000e-05\r\n1807 703 -1.0485927000000e-03\r\n1809 703 -1.0943588000000e-05\r\n655 704  6.7319482000000e+01\r\n657 704 -4.7714255000000e+00\r\n700 704  1.6436817000000e+01\r\n702 704 -4.4749500000000e+00\r\n703 704 -4.1332039000000e+02\r\n704 704 -1.0966693000000e+02\r\n705 704  2.0268791000000e+01\r\n708 704 -4.7798503000000e+00\r\n753 704 -4.7704216000000e+00\r\n1809 704 -1.4597855000000e+00\r\n655 705  1.1379680000000e+02\r\n656 705 -1.8431643000000e+01\r\n657 705 -8.0656140000000e+00\r\n700 705  2.7784783000000e+01\r\n701 705 -4.5002953000000e+00\r\n702 705 -7.5644520000000e+00\r\n703 705 -6.9867647000000e+02\r\n704 705  1.0772560000000e+02\r\n705 705  3.4262351000000e+01\r\n708 705 -8.0798587000000e+00\r\n753 705 -8.0639167000000e+00\r\n1809 705 -2.4676190000000e+00\r\n658 706 -2.8639730000000e-01\r\n660 706 -3.5963121000000e-05\r\n703 706 -2.3772233000000e-01\r\n705 706 -3.6029493000000e-05\r\n706 706  5.7461766000000e+02\r\n708 706  1.4623046000000e-03\r\n709 706 -3.4034794000000e-03\r\n711 706 -3.5520251000000e-05\r\n1810 706 -1.0384528000000e-03\r\n1812 706 -1.0837763000000e-05\r\n658 707  1.1770645000000e+01\r\n660 707 -4.7708020000000e+00\r\n703 707  2.3067276000000e+01\r\n705 707 -4.7798503000000e+00\r\n706 707 -3.6441519000000e+02\r\n707 707 -1.0965817000000e+02\r\n708 707  1.5803139000000e+01\r\n711 707 -4.7796613000000e+00\r\n1812 707 -1.4604714000000e+00\r\n658 708  1.9897097000000e+01\r\n659 708 -3.2227639000000e+00\r\n660 708 -8.0645636000000e+00\r\n703 708  3.8992923000000e+01\r\n704 708 -6.3157445000000e+00\r\n705 708 -8.0798587000000e+00\r\n706 708 -6.1600743000000e+02\r\n707 708  9.4358729000000e+01\r\n708 708  2.6713622000000e+01\r\n711 708 -8.0795357000000e+00\r\n1812 708 -2.4687808000000e+00\r\n661 709 -9.2241827000000e-02\r\n663 709 -3.5464605000000e-05\r\n706 709 -2.4367706000000e-01\r\n708 709 -3.5520251000000e-05\r\n709 709  5.7444270000000e+02\r\n711 709  1.4257672000000e-03\r\n1813 709 -1.1013347000000e-02\r\n1815 709 -1.0844475000000e-05\r\n663 710 -4.7718529000000e+00\r\n706 710  2.1354776000000e+01\r\n708 710 -4.7796613000000e+00\r\n709 710 -3.5094102000000e+02\r\n710 710 -1.0965215000000e+02\r\n711 710  1.1023000000000e+01\r\n1815 710 -1.4591348000000e+00\r\n663 711 -8.0663336000000e+00\r\n706 711  3.6098097000000e+01\r\n707 711 -5.8469286000000e+00\r\n708 711 -8.0795357000000e+00\r\n709 711 -5.9323041000000e+02\r\n710 711  9.0685708000000e+01\r\n711 711  1.8633268000000e+01\r\n1815 711 -2.4665199000000e+00\r\n712 712  1.0000000000000e+00\r\n713 713  1.0000000000000e+00\r\n714 714  1.0000000000000e+00\r\n715 715  1.0000000000000e+00\r\n716 716  1.0000000000000e+00\r\n717 717  1.0000000000000e+00\r\n718 718  1.0000000000000e+00\r\n719 719  1.0000000000000e+00\r\n720 720  1.0000000000000e+00\r\n721 721  1.0000000000000e+00\r\n722 722  1.0000000000000e+00\r\n723 723  1.0000000000000e+00\r\n724 724  1.0000000000000e+00\r\n725 725  1.0000000000000e+00\r\n726 726  1.0000000000000e+00\r\n679 727 -5.0524872000000e-02\r\n681 727 -1.2942303000000e-05\r\n727 727  2.7575451000000e+02\r\n729 727  7.0388324000000e-04\r\n730 727 -1.2552775000000e-03\r\n732 727 -1.3100644000000e-05\r\n775 727 -1.3823857000000e-03\r\n777 727 -1.4427202000000e-05\r\n1831 727 -6.3023480000000e-02\r\n1833 727 -1.8396914000000e-05\r\n679 728  6.2654400000000e+00\r\n681 728 -2.1400582000000e+00\r\n727 728 -1.7223406000000e+02\r\n728 728 -5.2567430000000e+01\r\n729 728  9.7508953000000e+00\r\n730 728  7.6726354000000e+00\r\n732 728 -2.1364055000000e+00\r\n777 728 -2.4266808000000e+00\r\n1833 728 -3.0418515000000e+00\r\n679 729  1.0591093000000e+01\r\n680 729 -1.7157092000000e+00\r\n681 729 -3.6175519000000e+00\r\n727 729 -2.9114430000000e+02\r\n728 729  4.4733734000000e+01\r\n729 729  1.6482902000000e+01\r\n730 729  1.2969815000000e+01\r\n731 729 -2.1010516000000e+00\r\n732 729 -3.6113775000000e+00\r\n777 729 -4.1020580000000e+00\r\n1833 729 -5.1419423000000e+00\r\n682 730 -1.0974181000000e-01\r\n684 730 -1.2000301000000e-05\r\n727 730 -3.1715043000000e-02\r\n729 730 -1.3100644000000e-05\r\n730 730  2.4142916000000e+02\r\n732 730  6.3568310000000e-04\r\n733 730 -5.2575007000000e-02\r\n735 730 -1.1994335000000e-05\r\n778 730 -1.2365576000000e-03\r\n780 730 -1.2905275000000e-05\r\n1834 730 -6.3367554000000e-02\r\n1836 730 -2.1296887000000e-05\r\n682 731  7.9768355000000e+00\r\n684 731 -1.9571084000000e+00\r\n729 731 -2.1364055000000e+00\r\n730 731 -1.5824006000000e+02\r\n731 731 -4.6008688000000e+01\r\n732 731  1.1667628000000e+01\r\n733 731  1.1771221000000e+01\r\n735 731 -1.9562652000000e+00\r\n780 731 -2.1395018000000e+00\r\n1836 731 -3.4731796000000e+00\r\n682 732  1.3484043000000e+01\r\n683 732 -2.1843344000000e+00\r\n684 732 -3.3082960000000e+00\r\n729 732 -3.6113775000000e+00\r\n730 732 -2.6748900000000e+02\r\n731 732  4.1175183000000e+01\r\n732 732  1.9722955000000e+01\r\n733 732  1.9898073000000e+01\r\n734 732 -3.2233689000000e+00\r\n735 732 -3.3068706000000e+00\r\n780 732 -3.6166139000000e+00\r\n1836 732 -5.8710629000000e+00\r\n685 733 -1.0923002000000e-01\r\n687 733 -1.1988703000000e-05\r\n730 733 -1.1492732000000e-03\r\n732 733 -1.1994335000000e-05\r\n733 733  2.2997364000000e+02\r\n735 733  6.0811355000000e-04\r\n736 733 -1.2408179000000e-01\r\n738 733 -1.1983552000000e-05\r\n781 733 -1.1284540000000e-03\r\n783 733 -1.1777057000000e-05\r\n1837 733 -6.3341723000000e-02\r\n1839 733 -2.2857855000000e-05\r\n685 734  7.8766213000000e+00\r\n687 734 -1.9108935000000e+00\r\n732 734 -1.9562652000000e+00\r\n733 734 -1.5553723000000e+02\r\n734 734 -4.3828367000000e+01\r\n735 734  1.1336191000000e+01\r\n736 734  1.5778360000000e+01\r\n738 734 -1.9101879000000e+00\r\n783 734 -1.9106690000000e+00\r\n1839 734 -3.6432492000000e+00\r\n685 735  1.3314632000000e+01\r\n686 735 -2.1568618000000e+00\r\n687 735 -3.2301723000000e+00\r\n732 735 -3.3068706000000e+00\r\n733 735 -2.6291996000000e+02\r\n734 735  4.0511193000000e+01\r\n735 735  1.9162684000000e+01\r\n736 735  2.6671722000000e+01\r\n737 735 -4.3206013000000e+00\r\n738 735 -3.2289795000000e+00\r\n783 735 -3.2297921000000e+00\r\n1839 735 -6.1585434000000e+00\r\n688 736 -1.3003196000000e-01\r\n690 736 -1.2365262000000e-05\r\n733 736 -1.1482400000000e-03\r\n735 736 -1.1983552000000e-05\r\n736 736  2.3001051000000e+02\r\n738 736  6.1051613000000e-04\r\n739 736 -1.5214170000000e-01\r\n741 736 -1.2950488000000e-05\r\n784 736 -1.1609537000000e-03\r\n786 736 -1.2116238000000e-05\r\n1840 736 -6.1680865000000e-02\r\n1842 736 -2.3581201000000e-05\r\n688 737  9.0008987000000e+00\r\n690 737 -1.9111011000000e+00\r\n735 737 -1.9101879000000e+00\r\n736 737 -1.6126652000000e+02\r\n737 737 -4.3837874000000e+01\r\n738 737  1.1383674000000e+01\r\n739 737  2.0397004000000e+01\r\n741 737 -2.0017149000000e+00\r\n786 737 -1.9112524000000e+00\r\n1842 737 -3.6444874000000e+00\r\n688 738  1.5215119000000e+01\r\n689 738 -2.4646760000000e+00\r\n690 738 -3.2305253000000e+00\r\n735 738 -3.2289795000000e+00\r\n736 738 -2.7260493000000e+02\r\n737 738  4.2055632000000e+01\r\n738 738  1.9242960000000e+01\r\n739 738  3.4479096000000e+01\r\n740 738 -5.5852208000000e+00\r\n741 738 -3.3836988000000e+00\r\n786 738 -3.2307810000000e+00\r\n1842 738 -6.1606414000000e+00\r\n691 739 -2.3814062000000e-01\r\n693 739 -1.4993952000000e-05\r\n736 739 -1.2408899000000e-03\r\n738 739 -1.2950488000000e-05\r\n739 739  2.5318809000000e+02\r\n741 739  6.7070663000000e-04\r\n742 739 -2.7655441000000e-01\r\n744 739 -1.5803473000000e-05\r\n787 739 -1.2889535000000e-03\r\n789 739 -1.3452102000000e-05\r\n1843 739 -5.5112544000000e-02\r\n1845 739 -2.2226569000000e-05\r\n691 740  1.3212071000000e+01\r\n693 740 -2.2345164000000e+00\r\n738 740 -2.0017149000000e+00\r\n739 740 -1.8333979000000e+02\r\n740 740 -4.8235318000000e+01\r\n741 740  1.1962878000000e+01\r\n742 740  2.5091868000000e+01\r\n744 740 -2.3553143000000e+00\r\n789 740 -2.0535280000000e+00\r\n1845 740 -3.3123752000000e+00\r\n691 741  2.2333672000000e+01\r\n692 741 -3.6177164000000e+00\r\n693 741 -3.7772243000000e+00\r\n738 741 -3.3836988000000e+00\r\n739 741 -3.0991742000000e+02\r\n740 741  4.7854592000000e+01\r\n741 741  2.0222038000000e+01\r\n742 741  4.2415271000000e+01\r\n743 741 -6.8706306000000e+00\r\n744 741 -3.9814210000000e+00\r\n789 741 -3.4712812000000e+00\r\n1845 741 -5.5992353000000e+00\r\n694 742 -3.4772057000000e-01\r\n696 742 -1.9228224000000e-05\r\n739 742 -1.5142572000000e-03\r\n741 742 -1.5803473000000e-05\r\n742 742  3.2221786000000e+02\r\n744 742  8.4364185000000e-04\r\n745 742 -3.2405406000000e-01\r\n747 742 -2.0445989000000e-05\r\n790 742 -1.6677751000000e-03\r\n792 742 -1.7405656000000e-05\r\n1846 742 -4.1786403000000e-02\r\n1848 742 -1.8199507000000e-05\r\n694 743  2.3081303000000e+01\r\n696 743 -2.7607207000000e+00\r\n741 743 -2.3553143000000e+00\r\n742 743 -2.3689682000000e+02\r\n743 743 -6.1399215000000e+01\r\n744 743  1.3243956000000e+01\r\n745 743  2.9237469000000e+01\r\n747 743 -2.9356936000000e+00\r\n792 743 -2.5723639000000e+00\r\n1848 743 -2.6129498000000e+00\r\n694 744  3.9016635000000e+01\r\n695 744 -6.3199419000000e+00\r\n696 744 -4.6667223000000e+00\r\n741 744 -3.9814210000000e+00\r\n742 744 -4.0045039000000e+02\r\n743 744  6.1855639000000e+01\r\n744 744  2.2387581000000e+01\r\n745 744  4.9423017000000e+01\r\n746 744 -8.0055750000000e+00\r\n747 744 -4.9624965000000e+00\r\n792 744 -4.3483240000000e+00\r\n1848 744 -4.4169304000000e+00\r\n697 745 -5.5488178000000e-01\r\n699 745 -2.4033846000000e-05\r\n742 745 -1.9590937000000e-03\r\n744 745 -2.0445989000000e-05\r\n745 745  3.9127008000000e+02\r\n747 745  1.0222417000000e-03\r\n748 745 -3.0670813000000e-01\r\n750 745 -2.5872768000000e-05\r\n793 745 -2.1638333000000e-03\r\n795 745 -2.2582743000000e-05\r\n1849 745 -2.1586607000000e-02\r\n1851 745 -1.5462216000000e-05\r\n697 746  4.1144406000000e+01\r\n699 746 -3.3371646000000e+00\r\n744 746 -2.9356936000000e+00\r\n745 746 -2.9348485000000e+02\r\n746 746 -7.4565981000000e+01\r\n747 746  1.5258691000000e+01\r\n748 746  2.8224648000000e+01\r\n750 746 -3.5925698000000e+00\r\n795 746 -3.2380134000000e+00\r\n1851 746 -2.1468502000000e+00\r\n697 747  6.9550444000000e+01\r\n698 747 -1.1265575000000e+01\r\n699 747 -5.6411381000000e+00\r\n744 747 -4.9624965000000e+00\r\n745 747 -4.9610636000000e+02\r\n746 747  7.6678890000000e+01\r\n747 747  2.5793274000000e+01\r\n748 747  4.7710903000000e+01\r\n749 747 -7.7280713000000e+00\r\n750 747 -6.0728747000000e+00\r\n795 747 -5.4735325000000e+00\r\n1851 747 -3.6290334000000e+00\r\n700 748 -8.0505229000000e-01\r\n702 748 -3.0291855000000e-05\r\n745 748 -2.4790769000000e-03\r\n747 748 -2.5872768000000e-05\r\n748 748  4.8314666000000e+02\r\n750 748  1.2586842000000e-03\r\n751 748 -1.0306687000000e-01\r\n753 748 -3.2242448000000e-05\r\n796 748 -2.7353350000000e-03\r\n798 748 -2.8547194000000e-05\r\n1852 748 -6.9197351000000e-03\r\n1854 748 -1.2840853000000e-05\r\n700 749  6.0712756000000e+01\r\n702 749 -4.1004355000000e+00\r\n747 749 -3.5925698000000e+00\r\n748 749 -3.4528836000000e+02\r\n749 749 -9.2121217000000e+01\r\n750 749  1.7763898000000e+01\r\n751 749  7.7418258000000e+00\r\n753 749 -4.3643937000000e+00\r\n798 749 -3.9580552000000e+00\r\n1854 749 -1.7380630000000e+00\r\n700 750  1.0262884000000e+02\r\n701 750 -1.6623199000000e+01\r\n702 750 -6.9313760000000e+00\r\n747 750 -6.0728747000000e+00\r\n748 750 -5.8367545000000e+02\r\n749 750  8.9969790000000e+01\r\n750 750  3.0028088000000e+01\r\n751 750  1.3086782000000e+01\r\n752 750 -2.1197178000000e+00\r\n753 750 -7.3775710000000e+00\r\n798 750 -6.6906964000000e+00\r\n1854 750 -2.9380216000000e+00\r\n703 751 -6.6691780000000e-01\r\n705 751 -3.5449055000000e-05\r\n748 751 -3.0894068000000e-03\r\n750 751 -3.2242448000000e-05\r\n751 751  5.7476523000000e+02\r\n753 751  1.4569444000000e-03\r\n799 751 -3.3038625000000e-03\r\n801 751 -3.4480604000000e-05\r\n1855 751 -1.4370886000000e-02\r\n1857 751 -1.0849465000000e-05\r\n703 752  4.4649890000000e+01\r\n705 752 -4.7704216000000e+00\r\n750 752 -4.3643937000000e+00\r\n751 752 -3.7421213000000e+02\r\n752 752 -1.0966919000000e+02\r\n753 752  1.5329533000000e+01\r\n801 752 -4.7224174000000e+00\r\n1857 752 -1.4599415000000e+00\r\n703 753  7.5476138000000e+01\r\n704 753 -1.2225121000000e+01\r\n705 753 -8.0639167000000e+00\r\n750 753 -7.3775710000000e+00\r\n751 753 -6.3256788000000e+02\r\n752 753  9.7015417000000e+01\r\n753 753  2.5913031000000e+01\r\n801 753 -7.9827685000000e+00\r\n1857 753 -2.4678833000000e+00\r\n754 754  1.0000000000000e+00\r\n755 755  1.0000000000000e+00\r\n756 756  1.0000000000000e+00\r\n757 757  1.0000000000000e+00\r\n758 758  1.0000000000000e+00\r\n759 759  1.0000000000000e+00\r\n760 760  1.0000000000000e+00\r\n761 761  1.0000000000000e+00\r\n762 762  1.0000000000000e+00\r\n763 763  1.0000000000000e+00\r\n764 764  1.0000000000000e+00\r\n765 765  1.0000000000000e+00\r\n766 766  1.0000000000000e+00\r\n767 767  1.0000000000000e+00\r\n768 768  1.0000000000000e+00\r\n769 769  1.0000000000000e+00\r\n770 770  1.0000000000000e+00\r\n771 771  1.0000000000000e+00\r\n772 772  3.4465067000000e+02\r\n774 772  8.5349529000000e-04\r\n775 772 -1.5446407000000e-03\r\n777 772 -1.6120569000000e-05\r\n820 772 -1.6955321000000e-02\r\n822 772 -1.6827433000000e-05\r\n1876 772 -6.1746864000000e-02\r\n1878 772 -1.4279239000000e-05\r\n772 773 -2.0606605000000e+02\r\n773 773 -6.5688502000000e+01\r\n774 773  8.0134569000000e+00\r\n775 773  8.1670580000000e+00\r\n777 773 -2.7112761000000e+00\r\n822 773 -2.8642856000000e+00\r\n1878 773 -2.4305303000000e+00\r\n772 774 -3.4833405000000e+02\r\n773 774  5.3442501000000e+01\r\n774 774  1.3545947000000e+01\r\n775 774  1.3805595000000e+01\r\n776 774 -2.2364809000000e+00\r\n777 774 -4.5831412000000e+00\r\n822 774 -4.8417883000000e+00\r\n1878 774 -4.1085685000000e+00\r\n727 775 -8.0360452000000e-02\r\n729 775 -1.4427202000000e-05\r\n772 775 -1.6347658000000e-02\r\n774 775 -1.6120569000000e-05\r\n775 775  3.1027071000000e+02\r\n777 775  8.0301749000000e-04\r\n778 775 -1.4011493000000e-03\r\n780 775 -1.4623028000000e-05\r\n823 775 -9.4939016000000e-03\r\n825 775 -1.6134123000000e-05\r\n1879 775 -6.2288830000000e-02\r\n1881 775 -1.6074153000000e-05\r\n727 776  1.0544002000000e+01\r\n729 776 -2.4266808000000e+00\r\n774 776 -2.7112761000000e+00\r\n775 776 -1.9758860000000e+02\r\n776 776 -5.9131265000000e+01\r\n777 776  1.2985718000000e+01\r\n778 776  8.9515889000000e+00\r\n780 776 -2.4240280000000e+00\r\n825 776 -2.7135730000000e+00\r\n1881 776 -2.7035268000000e+00\r\n727 777  1.7823566000000e+01\r\n728 777 -2.8873665000000e+00\r\n729 777 -4.1020580000000e+00\r\n774 777 -4.5831412000000e+00\r\n775 777 -3.3400353000000e+02\r\n776 777  5.1391010000000e+01\r\n777 777  2.1951045000000e+01\r\n778 777  1.5131755000000e+01\r\n779 777 -2.4513007000000e+00\r\n780 777 -4.0975736000000e+00\r\n825 777 -4.5870206000000e+00\r\n1881 777 -4.5700380000000e+00\r\n730 778 -4.7710277000000e-02\r\n732 778 -1.2905275000000e-05\r\n775 778 -9.7353670000000e-03\r\n777 778 -1.4623028000000e-05\r\n778 778  2.7578622000000e+02\r\n780 778  7.1734272000000e-04\r\n781 778 -3.2091054000000e-02\r\n783 778 -1.2554981000000e-05\r\n826 778 -1.3328196000000e-03\r\n828 778 -1.3909909000000e-05\r\n1882 778 -6.2920115000000e-02\r\n1884 778 -1.8339563000000e-05\r\n730 779  9.0787260000000e+00\r\n732 779 -2.1395018000000e+00\r\n777 779 -2.4240280000000e+00\r\n778 779 -1.7892355000000e+02\r\n779 779 -5.2573077000000e+01\r\n780 779  1.2029808000000e+01\r\n781 779  1.1556585000000e+01\r\n783 779 -2.0814907000000e+00\r\n828 779 -2.3386791000000e+00\r\n1884 779 -3.0402072000000e+00\r\n730 780  1.5346678000000e+01\r\n731 780 -2.4860947000000e+00\r\n732 780 -3.6166139000000e+00\r\n777 780 -4.0975736000000e+00\r\n778 780 -3.0245236000000e+02\r\n779 780  4.6551825000000e+01\r\n780 780  2.0335185000000e+01\r\n781 780  1.9535251000000e+01\r\n782 780 -3.1646251000000e+00\r\n783 780 -3.5185518000000e+00\r\n828 780 -3.9533031000000e+00\r\n1884 780 -5.1391662000000e+00\r\n733 781 -6.4501178000000e-02\r\n735 781 -1.1777057000000e-05\r\n778 781 -1.2029931000000e-03\r\n780 781 -1.2554981000000e-05\r\n781 781  2.2988296000000e+02\r\n783 781  6.0793532000000e-04\r\n784 781 -7.1293148000000e-02\r\n786 781 -1.1759384000000e-05\r\n829 781 -1.1352142000000e-03\r\n831 781 -1.1847609000000e-05\r\n1885 781 -6.3524363000000e-02\r\n1887 781 -2.2487696000000e-05\r\n733 782  8.9962395000000e+00\r\n735 782 -1.9106690000000e+00\r\n780 782 -2.0814907000000e+00\r\n781 782 -1.5514131000000e+02\r\n782 782 -4.3822323000000e+01\r\n783 782  1.1509553000000e+01\r\n784 782  1.4254211000000e+01\r\n786 782 -1.9078821000000e+00\r\n831 782 -1.9564876000000e+00\r\n1887 782 -3.6481002000000e+00\r\n733 783  1.5207231000000e+01\r\n734 783 -2.4634745000000e+00\r\n735 783 -3.2297921000000e+00\r\n780 783 -3.5185518000000e+00\r\n781 783 -2.6225068000000e+02\r\n782 783  4.0418167000000e+01\r\n783 783  1.9455737000000e+01\r\n784 783  2.4095299000000e+01\r\n785 783 -3.9032848000000e+00\r\n786 783 -3.2250813000000e+00\r\n831 783 -3.3072448000000e+00\r\n1887 783 -6.1667448000000e+00\r\n736 784 -1.1725771000000e-01\r\n738 784 -1.2116238000000e-05\r\n781 784 -1.1267607000000e-03\r\n783 784 -1.1759384000000e-05\r\n784 784  2.2994354000000e+02\r\n786 784  6.0877046000000e-04\r\n787 784 -9.2996664000000e-02\r\n789 784 -1.2390710000000e-05\r\n832 784 -1.1361215000000e-03\r\n834 784 -1.1857078000000e-05\r\n1888 784 -6.3099117000000e-02\r\n1890 784 -2.3135219000000e-05\r\n736 785  1.0506499000000e+01\r\n738 785 -1.9112524000000e+00\r\n783 785 -1.9078821000000e+00\r\n784 785 -1.5977102000000e+02\r\n785 785 -4.3834704000000e+01\r\n786 785  1.1338339000000e+01\r\n787 785  1.7391223000000e+01\r\n789 785 -1.9546905000000e+00\r\n834 785 -1.9103239000000e+00\r\n1890 785 -3.6492619000000e+00\r\n736 786  1.7760186000000e+01\r\n737 786 -2.8769849000000e+00\r\n738 786 -3.2307810000000e+00\r\n783 786 -3.2250813000000e+00\r\n784 786 -2.7007692000000e+02\r\n785 786  4.1654598000000e+01\r\n786 786  1.9166326000000e+01\r\n787 786  2.9398124000000e+01\r\n788 786 -4.7622225000000e+00\r\n789 786 -3.3042088000000e+00\r\n834 786 -3.2292116000000e+00\r\n1890 786 -6.1687123000000e+00\r\n739 787 -1.8435981000000e-01\r\n741 787 -1.3452102000000e-05\r\n784 787 -1.1872531000000e-03\r\n786 787 -1.2390710000000e-05\r\n787 787  2.4151139000000e+02\r\n789 787  6.4034340000000e-04\r\n790 787 -1.2935698000000e-01\r\n792 787 -1.4531498000000e-05\r\n835 787 -1.2285658000000e-03\r\n837 787 -1.2821869000000e-05\r\n1891 787 -6.0194981000000e-02\r\n1893 787 -2.2755466000000e-05\r\n739 788  1.3942145000000e+01\r\n741 788 -2.0535280000000e+00\r\n786 788 -1.9546905000000e+00\r\n787 788 -1.7286665000000e+02\r\n788 788 -4.6041311000000e+01\r\n789 788  1.1712269000000e+01\r\n790 788  2.0478718000000e+01\r\n792 788 -2.2184736000000e+00\r\n837 788 -2.0067788000000e+00\r\n1893 788 -3.4736169000000e+00\r\n739 789  2.3567784000000e+01\r\n740 789 -3.8176844000000e+00\r\n741 789 -3.4712812000000e+00\r\n786 789 -3.3042088000000e+00\r\n787 789 -2.9221357000000e+02\r\n788 789  4.5098157000000e+01\r\n789 789  1.9798408000000e+01\r\n790 789  3.4617200000000e+01\r\n791 789 -5.6075503000000e+00\r\n792 789 -3.7501050000000e+00\r\n837 789 -3.3922563000000e+00\r\n1893 789 -5.8717972000000e+00\r\n742 790 -3.8295568000000e-01\r\n744 790 -1.7405656000000e-05\r\n787 790 -1.3923791000000e-03\r\n789 790 -1.4531498000000e-05\r\n790 790  2.9929629000000e+02\r\n792 790  7.8507417000000e-04\r\n793 790 -3.2737127000000e-01\r\n795 790 -1.9053771000000e-05\r\n838 790 -1.5647942000000e-03\r\n840 790 -1.6330900000000e-05\r\n1894 790 -5.3320545000000e-02\r\n1896 790 -1.8974124000000e-05\r\n742 791  2.1121733000000e+01\r\n744 791 -2.5723639000000e+00\r\n789 791 -2.2184736000000e+00\r\n790 791 -2.1642027000000e+02\r\n791 791 -5.7020556000000e+01\r\n792 791  1.2900552000000e+01\r\n793 791  2.3913941000000e+01\r\n795 791 -2.8160557000000e+00\r\n840 791 -2.4830562000000e+00\r\n1896 791 -2.8041797000000e+00\r\n742 792  3.5704177000000e+01\r\n743 792 -5.7835004000000e+00\r\n744 792 -4.3483240000000e+00\r\n789 792 -3.7501050000000e+00\r\n790 792 -3.6583682000000e+02\r\n791 792  5.6448122000000e+01\r\n792 792  2.1807090000000e+01\r\n793 792  4.0424126000000e+01\r\n794 792 -6.5480560000000e+00\r\n795 792 -4.7602606000000e+00\r\n840 792 -4.1973582000000e+00\r\n1896 792 -4.7401854000000e+00\r\n745 793 -4.6302039000000e-01\r\n747 793 -2.2582743000000e-05\r\n790 793 -1.8256942000000e-03\r\n792 793 -1.9053771000000e-05\r\n793 793  3.9127995000000e+02\r\n795 793  1.0169382000000e-03\r\n796 793 -3.8635653000000e-01\r\n798 793 -2.4784809000000e-05\r\n841 793 -2.0770616000000e-03\r\n843 793 -2.1677154000000e-05\r\n1897 793 -4.4529385000000e-02\r\n1899 793 -1.5027311000000e-05\r\n745 794  3.1337242000000e+01\r\n747 794 -3.2380134000000e+00\r\n792 794 -2.8160557000000e+00\r\n793 794 -2.9176279000000e+02\r\n794 794 -7.4567079000000e+01\r\n795 794  1.5008424000000e+01\r\n796 794  3.6310525000000e+01\r\n798 794 -3.5539269000000e+00\r\n843 794 -3.2374225000000e+00\r\n1899 794 -2.1546054000000e+00\r\n745 795  5.2972422000000e+01\r\n746 795 -8.5805093000000e+00\r\n747 795 -5.4735325000000e+00\r\n792 795 -4.7602606000000e+00\r\n793 795 -4.9319535000000e+02\r\n794 795  7.6206877000000e+01\r\n795 795  2.5370222000000e+01\r\n796 795  6.1379251000000e+01\r\n797 795 -9.9422529000000e+00\r\n798 795 -6.0075522000000e+00\r\n843 795 -5.4725347000000e+00\r\n1899 795 -3.6421424000000e+00\r\n748 796 -4.7355919000000e-01\r\n750 796 -2.8547194000000e-05\r\n793 796 -2.3748308000000e-03\r\n795 796 -2.4784809000000e-05\r\n796 796  4.7143383000000e+02\r\n798 796  1.1989427000000e-03\r\n799 796 -1.8473176000000e-01\r\n801 796 -3.0784169000000e-05\r\n1900 796 -3.3230226000000e-02\r\n1902 796 -1.2848602000000e-05\r\n748 797  2.8960471000000e+01\r\n750 797 -3.9580552000000e+00\r\n795 797 -3.5539269000000e+00\r\n796 797 -3.1504032000000e+02\r\n797 797 -8.9932956000000e+01\r\n798 797  1.3571840000000e+01\r\n799 797  1.5843805000000e+01\r\n801 797 -4.2683282000000e+00\r\n1902 797 -1.7813940000000e+00\r\n748 798  4.8954780000000e+01\r\n749 798 -7.9295357000000e+00\r\n750 798 -6.6906964000000e+00\r\n795 798 -6.0075522000000e+00\r\n796 798 -5.3254415000000e+02\r\n797 798  8.1786007000000e+01\r\n798 798  2.2941832000000e+01\r\n799 798  2.6782368000000e+01\r\n800 798 -4.3381207000000e+00\r\n801 798 -7.2151819000000e+00\r\n1902 798 -3.0112683000000e+00\r\n751 799 -4.7209570000000e-01\r\n753 799 -3.4480604000000e-05\r\n796 799 -2.9496775000000e-03\r\n798 799 -3.0784169000000e-05\r\n799 799  5.6309388000000e+02\r\n801 799  1.3931534000000e-03\r\n1903 799 -3.2800322000000e-02\r\n1905 799 -1.0878457000000e-05\r\n751 800  2.5400288000000e+01\r\n753 800 -4.7224174000000e+00\r\n798 800 -4.2683282000000e+00\r\n799 800 -3.4835832000000e+02\r\n800 800 -1.0748533000000e+02\r\n801 800  1.0492712000000e+01\r\n1905 800 -1.4898504000000e+00\r\n751 801  4.2936615000000e+01\r\n752 801 -6.9546765000000e+00\r\n753 801 -7.9827685000000e+00\r\n798 801 -7.2151819000000e+00\r\n799 801 -5.8886449000000e+02\r\n800 801  9.0023638000000e+01\r\n801 801  1.7736873000000e+01\r\n1905 801 -2.5184421000000e+00\r\n802 802  1.0000000000000e+00\r\n803 803  1.0000000000000e+00\r\n804 804  1.0000000000000e+00\r\n805 805  1.0000000000000e+00\r\n806 806  1.0000000000000e+00\r\n807 807  1.0000000000000e+00\r\n808 808  1.0000000000000e+00\r\n809 809  1.0000000000000e+00\r\n810 810  1.0000000000000e+00\r\n811 811  1.0000000000000e+00\r\n812 812  1.0000000000000e+00\r\n813 813  1.0000000000000e+00\r\n814 814  1.0000000000000e+00\r\n815 815  1.0000000000000e+00\r\n816 816  1.0000000000000e+00\r\n817 817  1.0000000000000e+00\r\n818 818  1.0000000000000e+00\r\n819 819  1.0000000000000e+00\r\n772 820 -1.6123710000000e-03\r\n774 820 -1.6827433000000e-05\r\n820 820  3.4466858000000e+02\r\n822 820  8.7085051000000e-04\r\n823 820 -1.6123285000000e-03\r\n825 820 -1.6826990000000e-05\r\n868 820 -2.6112782000000e-02\r\n870 820 -1.6734138000000e-05\r\n1924 820 -6.1603359000000e-02\r\n1926 820 -1.4191919000000e-05\r\n772 821  4.0042888000000e+00\r\n774 821 -2.8642856000000e+00\r\n820 821 -2.0657734000000e+02\r\n821 821 -6.0270803000000e+01\r\n822 821  1.1026543000000e+01\r\n823 821  4.6647492000000e+00\r\n825 821 -2.8613005000000e+00\r\n870 821 -2.8643717000000e+00\r\n1926 821 -2.4292229000000e+00\r\n772 822  6.7688497000000e+00\r\n773 822 -1.0965447000000e+00\r\n774 822 -4.8417883000000e+00\r\n820 822 -3.4919834000000e+02\r\n821 822  6.2745862000000e+01\r\n822 822  1.8639267000000e+01\r\n823 822  7.8852921000000e+00\r\n824 822 -1.2774069000000e+00\r\n825 822 -4.8367423000000e+00\r\n870 822 -4.8419339000000e+00\r\n1926 822 -4.1063585000000e+00\r\n775 823 -1.5459394000000e-03\r\n777 823 -1.6134123000000e-05\r\n820 823 -2.4181174000000e-02\r\n822 823 -1.6826990000000e-05\r\n823 823  3.4465958000000e+02\r\n825 823  8.8570179000000e-04\r\n826 823 -1.4820698000000e-03\r\n828 823 -1.5467551000000e-05\r\n871 823 -1.5995969000000e-03\r\n873 823 -1.6694117000000e-05\r\n1927 823 -6.2083342000000e-02\r\n1929 823 -1.4311777000000e-05\r\n775 824  7.5436455000000e+00\r\n777 824 -2.7135730000000e+00\r\n822 824 -2.8613005000000e+00\r\n823 824 -2.1303816000000e+02\r\n824 824 -6.5690055000000e+01\r\n825 824  1.3480709000000e+01\r\n826 824  7.5976270000000e+00\r\n828 824 -2.6002803000000e+00\r\n873 824 -2.8645800000000e+00\r\n1929 824 -2.4336098000000e+00\r\n775 825  1.2751770000000e+01\r\n776 825 -2.0657632000000e+00\r\n777 825 -4.5870206000000e+00\r\n822 825 -4.8367423000000e+00\r\n823 825 -3.6011950000000e+02\r\n824 825  5.5347981000000e+01\r\n825 825  2.2787778000000e+01\r\n826 825  1.2843021000000e+01\r\n827 825 -2.0805458000000e+00\r\n828 825 -4.3955109000000e+00\r\n873 825 -4.8422821000000e+00\r\n1929 825 -4.1137712000000e+00\r\n778 826 -3.8541788000000e-02\r\n780 826 -1.3909909000000e-05\r\n823 826 -5.9415082000000e-02\r\n825 826 -1.5467551000000e-05\r\n826 826  2.8730014000000e+02\r\n828 826  7.4559879000000e-04\r\n829 826 -1.2714392000000e-02\r\n831 826 -1.2947817000000e-05\r\n874 826 -1.3440434000000e-03\r\n876 826 -1.4027045000000e-05\r\n1930 826 -6.2647550000000e-02\r\n1932 826 -1.7362667000000e-05\r\n778 827  8.3044124000000e+00\r\n780 827 -2.3386791000000e+00\r\n825 827 -2.6002803000000e+00\r\n826 827 -1.8323488000000e+02\r\n827 827 -5.4755899000000e+01\r\n828 827  1.2428043000000e+01\r\n829 827  1.0036045000000e+01\r\n831 827 -2.1769877000000e+00\r\n876 827 -2.3869578000000e+00\r\n1932 827 -2.9189937000000e+00\r\n778 828  1.4037779000000e+01\r\n779 828 -2.2740776000000e+00\r\n780 828 -3.9533031000000e+00\r\n825 828 -4.3955109000000e+00\r\n826 828 -3.0974023000000e+02\r\n827 828  4.7649979000000e+01\r\n828 828  2.1008360000000e+01\r\n829 828  1.6964930000000e+01\r\n830 828 -2.7482673000000e+00\r\n831 828 -3.6799801000000e+00\r\n876 828 -4.0349134000000e+00\r\n1932 828 -4.9342670000000e+00\r\n781 829 -5.0980577000000e-02\r\n783 829 -1.1847609000000e-05\r\n826 829 -1.2406339000000e-03\r\n828 829 -1.2947817000000e-05\r\n829 829  2.4133039000000e+02\r\n831 829  6.3401457000000e-04\r\n832 829 -4.0353251000000e-02\r\n834 829 -1.1828373000000e-05\r\n877 829 -1.1450563000000e-03\r\n879 829 -1.1950326000000e-05\r\n1933 829 -6.3485672000000e-02\r\n1935 829 -2.1059135000000e-05\r\n781 830  8.7901707000000e+00\r\n783 830 -1.9564876000000e+00\r\n828 830 -2.1769877000000e+00\r\n829 830 -1.5972654000000e+02\r\n830 830 -4.6006226000000e+01\r\n831 830  1.1574441000000e+01\r\n832 830  1.2440799000000e+01\r\n834 830 -1.9533845000000e+00\r\n879 830 -2.0049953000000e+00\r\n1935 830 -3.4774202000000e+00\r\n781 831  1.4858896000000e+01\r\n782 831 -2.4070718000000e+00\r\n783 831 -3.3072448000000e+00\r\n828 831 -3.6799801000000e+00\r\n829 831 -2.7000159000000e+02\r\n830 831  4.1588697000000e+01\r\n831 831  1.9565427000000e+01\r\n832 831  2.1029915000000e+01\r\n833 831 -3.4067479000000e+00\r\n834 831 -3.3019994000000e+00\r\n879 831 -3.3892421000000e+00\r\n1935 831 -5.8782276000000e+00\r\n784 832 -8.1700425000000e-02\r\n786 832 -1.1857078000000e-05\r\n829 832 -1.1333710000000e-03\r\n831 832 -1.1828373000000e-05\r\n832 832  2.2988232000000e+02\r\n834 832  6.0759939000000e-04\r\n835 832 -5.9511872000000e-02\r\n837 832 -1.2122750000000e-05\r\n880 832 -1.1122322000000e-03\r\n882 832 -1.1607759000000e-05\r\n1936 832 -6.3616243000000e-02\r\n1938 832 -2.2676231000000e-05\r\n784 833  1.0688462000000e+01\r\n786 833 -1.9103239000000e+00\r\n831 833 -1.9533845000000e+00\r\n832 833 -1.5760196000000e+02\r\n833 833 -4.3828011000000e+01\r\n834 833  1.1384557000000e+01\r\n835 833  1.5030646000000e+01\r\n837 833 -1.9532233000000e+00\r\n882 833 -1.9095173000000e+00\r\n1938 833 -3.6531824000000e+00\r\n784 834  1.8067775000000e+01\r\n785 834 -2.9268498000000e+00\r\n786 834 -3.2292116000000e+00\r\n831 834 -3.3019994000000e+00\r\n832 834 -2.6641036000000e+02\r\n833 834  4.1077746000000e+01\r\n834 834  1.9244453000000e+01\r\n835 834  2.5407804000000e+01\r\n836 834 -4.1158816000000e+00\r\n837 834 -3.3017287000000e+00\r\n882 834 -3.2278480000000e+00\r\n1938 834 -6.1753395000000e+00\r\n787 835 -1.2015405000000e-01\r\n789 835 -1.2821869000000e-05\r\n832 835 -1.1615777000000e-03\r\n834 835 -1.2122750000000e-05\r\n835 835  2.4140711000000e+02\r\n837 835  6.3818803000000e-04\r\n838 835 -7.9495381000000e-02\r\n840 835 -1.4154005000000e-05\r\n883 835 -1.1963318000000e-03\r\n885 835 -1.2485460000000e-05\r\n1939 835 -6.2279773000000e-02\r\n1941 835 -2.2219399000000e-05\r\n787 836  1.3639587000000e+01\r\n789 836 -2.0067788000000e+00\r\n834 836 -1.9532233000000e+00\r\n835 836 -1.6979047000000e+02\r\n836 836 -4.6034272000000e+01\r\n837 836  1.1661624000000e+01\r\n838 836  1.7694926000000e+01\r\n840 836 -2.2153792000000e+00\r\n885 836 -2.0036945000000e+00\r\n1941 836 -3.4773703000000e+00\r\n787 837  2.3056342000000e+01\r\n788 837 -3.7348969000000e+00\r\n789 837 -3.3922563000000e+00\r\n834 837 -3.3017287000000e+00\r\n835 837 -2.8701362000000e+02\r\n836 837  4.4274019000000e+01\r\n837 837  1.9712798000000e+01\r\n838 837  2.9911484000000e+01\r\n839 837 -4.8453611000000e+00\r\n840 837 -3.7448743000000e+00\r\n885 837 -3.3870428000000e+00\r\n1941 837 -5.8781421000000e+00\r\n790 838 -2.0433902000000e-01\r\n792 838 -1.6330900000000e-05\r\n835 838 -1.3562085000000e-03\r\n837 838 -1.4154005000000e-05\r\n838 838  2.9882746000000e+02\r\n840 838  7.8228312000000e-04\r\n841 838 -2.2783386000000e-02\r\n843 838 -1.8495824000000e-05\r\n886 838 -1.5362482000000e-03\r\n888 838 -1.6032981000000e-05\r\n1942 838 -5.9223097000000e-02\r\n1944 838 -1.8503913000000e-05\r\n790 839  1.9964062000000e+01\r\n792 839 -2.4830562000000e+00\r\n837 839 -2.2153792000000e+00\r\n838 839 -2.0562103000000e+02\r\n839 839 -5.7012907000000e+01\r\n840 839  1.2812149000000e+01\r\n841 839  1.4261129000000e+01\r\n843 839 -2.8123255000000e+00\r\n888 839 -2.4817049000000e+00\r\n1944 839 -2.8132636000000e+00\r\n790 840  3.3747250000000e+01\r\n791 840 -5.4666118000000e+00\r\n792 840 -4.1973582000000e+00\r\n837 840 -3.7448743000000e+00\r\n838 840 -3.4758178000000e+02\r\n839 840  5.3511216000000e+01\r\n840 840  2.1657654000000e+01\r\n841 840  2.4107012000000e+01\r\n842 840 -3.9050196000000e+00\r\n843 840 -4.7539550000000e+00\r\n888 840 -4.1950740000000e+00\r\n1944 840 -4.7555408000000e+00\r\n793 841 -6.1648801000000e-01\r\n795 841 -2.1677154000000e-05\r\n838 841 -1.7722328000000e-03\r\n840 841 -1.8495824000000e-05\r\n841 841  3.9105156000000e+02\r\n843 841  9.8930809000000e-04\r\n889 841 -2.0095705000000e-03\r\n891 841 -2.0972787000000e-05\r\n1945 841 -5.6386148000000e-02\r\n1947 841 -1.4393578000000e-05\r\n793 842  3.7103314000000e+01\r\n795 842 -3.2374225000000e+00\r\n840 842 -2.8123255000000e+00\r\n841 842 -2.6120857000000e+02\r\n842 842 -7.4574783000000e+01\r\n843 842  1.1401721000000e+01\r\n891 842 -3.1939497000000e+00\r\n1947 842 -2.1496197000000e+00\r\n793 843  6.2719392000000e+01\r\n794 843 -1.0159607000000e+01\r\n795 843 -5.4725347000000e+00\r\n840 843 -4.7539550000000e+00\r\n841 843 -4.4154665000000e+02\r\n842 843  6.7824365000000e+01\r\n843 843  1.9273457000000e+01\r\n891 843 -5.3990486000000e+00\r\n1947 843 -3.6337143000000e+00\r\n844 844  1.0000000000000e+00\r\n845 845  1.0000000000000e+00\r\n846 846  1.0000000000000e+00\r\n847 847  1.0000000000000e+00\r\n848 848  1.0000000000000e+00\r\n849 849  1.0000000000000e+00\r\n850 850  1.0000000000000e+00\r\n851 851  1.0000000000000e+00\r\n852 852  1.0000000000000e+00\r\n853 853  1.0000000000000e+00\r\n854 854  1.0000000000000e+00\r\n855 855  1.0000000000000e+00\r\n856 856  1.0000000000000e+00\r\n857 857  1.0000000000000e+00\r\n858 858  1.0000000000000e+00\r\n859 859  1.0000000000000e+00\r\n860 860  1.0000000000000e+00\r\n861 861  1.0000000000000e+00\r\n862 862  1.0000000000000e+00\r\n863 863  1.0000000000000e+00\r\n864 864  1.0000000000000e+00\r\n865 865  1.0000000000000e+00\r\n866 866  1.0000000000000e+00\r\n867 867  1.0000000000000e+00\r\n820 868 -1.6034316000000e-03\r\n822 868 -1.6734138000000e-05\r\n868 868  3.4466303000000e+02\r\n870 868  8.7042247000000e-04\r\n871 868 -1.5980291000000e-03\r\n873 868 -1.6677755000000e-05\r\n916 868 -1.1800204000000e-02\r\n918 868 -1.6632213000000e-05\r\n1972 868 -6.1592932000000e-02\r\n1974 868 -1.4105490000000e-05\r\n820 869  4.4809201000000e+00\r\n822 869 -2.8643717000000e+00\r\n868 869 -2.0522846000000e+02\r\n869 869 -6.0262267000000e+01\r\n870 869  1.1027649000000e+01\r\n871 869  2.8279019000000e+00\r\n873 869 -2.8615690000000e+00\r\n918 869 -2.8647960000000e+00\r\n1974 869 -2.4295537000000e+00\r\n820 870  7.5745473000000e+00\r\n821 870 -1.2270711000000e+00\r\n822 870 -4.8419339000000e+00\r\n868 870 -3.4691819000000e+02\r\n869 870  6.2397303000000e+01\r\n870 870  1.8641137000000e+01\r\n871 870  4.7802854000000e+00\r\n872 870 -7.7440273000000e-01\r\n873 870 -4.8371963000000e+00\r\n918 870 -4.8426511000000e+00\r\n1974 870 -4.1069176000000e+00\r\n823 871 -2.3809981000000e-02\r\n825 871 -1.6694117000000e-05\r\n868 871 -7.0844374000000e-02\r\n870 871 -1.6677755000000e-05\r\n871 871  3.4475336000000e+02\r\n873 871  8.8551476000000e-04\r\n874 871 -1.4651131000000e-03\r\n876 871 -1.5290583000000e-05\r\n919 871 -1.9760735000000e-02\r\n921 871 -1.6411306000000e-05\r\n1975 871 -6.1994042000000e-02\r\n1977 871 -1.4174587000000e-05\r\n823 872  6.3203559000000e+00\r\n825 872 -2.8645800000000e+00\r\n870 872 -2.8615690000000e+00\r\n871 872 -2.0969684000000e+02\r\n872 872 -6.5683722000000e+01\r\n873 872  1.3583208000000e+01\r\n874 872  5.4707735000000e+00\r\n876 872 -2.6017154000000e+00\r\n921 872 -2.8158806000000e+00\r\n1977 872 -2.4321006000000e+00\r\n823 873  1.0683921000000e+01\r\n824 873 -1.7307849000000e+00\r\n825 873 -4.8422821000000e+00\r\n870 873 -4.8371963000000e+00\r\n871 873 -3.5447129000000e+02\r\n872 873  5.4448839000000e+01\r\n873 873  2.2961043000000e+01\r\n874 873  9.2477889000000e+00\r\n875 873 -1.4981326000000e+00\r\n876 873 -4.3979361000000e+00\r\n921 873 -4.7599617000000e+00\r\n1977 873 -4.1112205000000e+00\r\n826 874 -1.6360339000000e-02\r\n828 874 -1.4027045000000e-05\r\n871 874 -5.5631807000000e-02\r\n873 874 -1.5290583000000e-05\r\n874 874  2.8727143000000e+02\r\n876 874  7.4492479000000e-04\r\n877 874 -1.2435232000000e-03\r\n879 874 -1.2977970000000e-05\r\n922 874 -1.3030250000000e-03\r\n924 874 -1.3598958000000e-05\r\n1978 874 -6.2596797000000e-02\r\n1980 874 -1.7146335000000e-05\r\n826 875  7.2214688000000e+00\r\n828 875 -2.3869578000000e+00\r\n873 875 -2.6017154000000e+00\r\n874 875 -1.7984791000000e+02\r\n875 875 -5.4747707000000e+01\r\n876 875  1.2427625000000e+01\r\n877 875  7.7206051000000e+00\r\n879 875 -2.1771781000000e+00\r\n924 875 -2.3380768000000e+00\r\n1980 875 -2.9175561000000e+00\r\n826 876  1.2207171000000e+01\r\n827 876 -1.9775386000000e+00\r\n828 876 -4.0349134000000e+00\r\n873 876 -4.3979361000000e+00\r\n874 876 -3.0401491000000e+02\r\n875 876  4.6742926000000e+01\r\n876 876  2.1007653000000e+01\r\n877 876  1.3050911000000e+01\r\n878 876 -2.1142229000000e+00\r\n879 876 -3.6803018000000e+00\r\n924 876 -3.9522850000000e+00\r\n1980 876 -4.9318369000000e+00\r\n829 877 -2.5620619000000e-02\r\n831 877 -1.1950326000000e-05\r\n874 877 -2.6518293000000e-03\r\n876 877 -1.2977970000000e-05\r\n877 877  2.4128914000000e+02\r\n879 877  6.3315052000000e-04\r\n880 877 -1.3810981000000e-02\r\n882 877 -1.1634779000000e-05\r\n925 877 -1.1006289000000e-03\r\n927 877 -1.1486661000000e-05\r\n1981 877 -6.3481695000000e-02\r\n1983 877 -2.0719887000000e-05\r\n829 878  8.1989485000000e+00\r\n831 878 -2.0049953000000e+00\r\n876 878 -2.1771781000000e+00\r\n877 878 -1.5653041000000e+02\r\n878 878 -4.5997623000000e+01\r\n879 878  1.1571691000000e+01\r\n880 878  9.8238567000000e+00\r\n882 878 -1.9520974000000e+00\r\n927 878 -1.9561967000000e+00\r\n1983 878 -3.4760615000000e+00\r\n829 879  1.3859495000000e+01\r\n830 879 -2.2451946000000e+00\r\n831 879 -3.3892421000000e+00\r\n876 879 -3.6803018000000e+00\r\n877 879 -2.6459887000000e+02\r\n878 879  4.0735007000000e+01\r\n879 879  1.9560777000000e+01\r\n880 879  1.6606239000000e+01\r\n881 879 -2.6901584000000e+00\r\n882 879 -3.2998235000000e+00\r\n927 879 -3.3067529000000e+00\r\n1983 879 -5.8759299000000e+00\r\n832 880 -5.0339268000000e-02\r\n834 880 -1.1607759000000e-05\r\n877 880 -1.1148212000000e-03\r\n879 880 -1.1634779000000e-05\r\n880 880  2.2981958000000e+02\r\n882 880  6.0621082000000e-04\r\n883 880 -1.8023531000000e-02\r\n885 880 -1.1876018000000e-05\r\n928 880 -1.0881183000000e-03\r\n930 880 -1.1356095000000e-05\r\n1984 880 -6.3837177000000e-02\r\n1986 880 -2.2231077000000e-05\r\n832 881  1.0360255000000e+01\r\n834 881 -1.9095173000000e+00\r\n879 881 -1.9520974000000e+00\r\n880 881 -1.5508784000000e+02\r\n881 881 -4.3818848000000e+01\r\n882 881  1.1386064000000e+01\r\n883 881  1.2831785000000e+01\r\n885 881 -1.9537229000000e+00\r\n930 881 -1.9090161000000e+00\r\n1986 881 -3.6567886000000e+00\r\n832 882  1.7512975000000e+01\r\n833 882 -2.8370121000000e+00\r\n834 882 -3.2278480000000e+00\r\n879 882 -3.2998235000000e+00\r\n880 882 -2.6216048000000e+02\r\n881 882  4.0412391000000e+01\r\n882 882  1.9247000000000e+01\r\n883 882  2.1690848000000e+01\r\n884 882 -3.5138060000000e+00\r\n885 882 -3.3025732000000e+00\r\n930 882 -3.2270008000000e+00\r\n1986 882 -6.1814354000000e+00\r\n835 883 -9.5382011000000e-02\r\n837 883 -1.2485460000000e-05\r\n880 883 -1.1379363000000e-03\r\n882 883 -1.1876018000000e-05\r\n883 883  2.4148168000000e+02\r\n885 883  6.3659101000000e-04\r\n886 883 -1.6867021000000e-01\r\n888 883 -1.3820054000000e-05\r\n931 883 -1.1826096000000e-03\r\n933 883 -1.2342249000000e-05\r\n1987 883 -6.3020186000000e-02\r\n1989 883 -2.1688252000000e-05\r\n835 884  1.3129917000000e+01\r\n837 884 -2.0036945000000e+00\r\n882 884 -1.9537229000000e+00\r\n883 884 -1.7274263000000e+02\r\n884 884 -4.6025611000000e+01\r\n885 884  1.1710275000000e+01\r\n886 884  2.1144376000000e+01\r\n888 884 -2.2179112000000e+00\r\n933 884 -2.0494640000000e+00\r\n1989 884 -3.4803075000000e+00\r\n835 885  2.2194797000000e+01\r\n836 885 -3.5953912000000e+00\r\n837 885 -3.3870428000000e+00\r\n882 885 -3.3025732000000e+00\r\n883 885 -2.9200397000000e+02\r\n884 885  4.5104546000000e+01\r\n885 885  1.9795037000000e+01\r\n886 885  3.5742431000000e+01\r\n887 885 -5.7900063000000e+00\r\n888 885 -3.7491545000000e+00\r\n933 885 -3.4644117000000e+00\r\n1989 885 -5.8831074000000e+00\r\n838 886 -1.8480862000000e-02\r\n840 886 -1.6032981000000e-05\r\n883 886 -1.3242099000000e-03\r\n885 886 -1.3820054000000e-05\r\n886 886  2.9865514000000e+02\r\n888 886  7.6469165000000e-04\r\n889 886 -2.0105532000000e-02\r\n891 886 -1.7925139000000e-05\r\n1990 886 -6.0966350000000e-02\r\n1992 886 -1.8146949000000e-05\r\n838 887  1.2425388000000e+01\r\n840 887 -2.4817049000000e+00\r\n885 887 -2.2179112000000e+00\r\n886 887 -1.9650986000000e+02\r\n887 887 -5.6998073000000e+01\r\n888 887  1.0289227000000e+01\r\n889 887  1.2667573000000e+01\r\n891 887 -2.7745677000000e+00\r\n1992 887 -2.8086301000000e+00\r\n838 888  2.1003875000000e+01\r\n839 888 -3.4023914000000e+00\r\n840 888 -4.1950740000000e+00\r\n885 888 -3.7491545000000e+00\r\n886 888 -3.3218027000000e+02\r\n887 888  5.1053573000000e+01\r\n888 888  1.7392906000000e+01\r\n889 888  2.1413265000000e+01\r\n890 888 -3.4687080000000e+00\r\n891 888 -4.6901292000000e+00\r\n1992 888 -4.7477083000000e+00\r\n841 889 -2.6512448000000e-02\r\n843 889 -2.0972787000000e-05\r\n886 889 -1.7175510000000e-03\r\n888 889 -1.7925139000000e-05\r\n889 889  3.7900353000000e+02\r\n891 889  9.4034887000000e-04\r\n1993 889 -5.9610596000000e-02\r\n1995 889 -1.4556352000000e-05\r\n841 890  1.7605472000000e+01\r\n843 890 -3.1939497000000e+00\r\n888 890 -2.7745677000000e+00\r\n889 890 -2.3514888000000e+02\r\n890 890 -7.2360764000000e+01\r\n891 890  8.1931919000000e+00\r\n1995 890 -2.2165275000000e+00\r\n841 891  2.9760267000000e+01\r\n842 891 -4.8207812000000e+00\r\n843 891 -5.3990486000000e+00\r\n888 891 -4.6901292000000e+00\r\n889 891 -3.9749538000000e+02\r\n890 891  6.0849346000000e+01\r\n891 891  1.3849764000000e+01\r\n1995 891 -3.7468149000000e+00\r\n892 892  1.0000000000000e+00\r\n893 893  1.0000000000000e+00\r\n894 894  1.0000000000000e+00\r\n895 895  1.0000000000000e+00\r\n896 896  1.0000000000000e+00\r\n897 897  1.0000000000000e+00\r\n898 898  1.0000000000000e+00\r\n899 899  1.0000000000000e+00\r\n900 900  1.0000000000000e+00\r\n901 901  1.0000000000000e+00\r\n902 902  1.0000000000000e+00\r\n903 903  1.0000000000000e+00\r\n904 904  1.0000000000000e+00\r\n905 905  1.0000000000000e+00\r\n906 906  1.0000000000000e+00\r\n907 907  1.0000000000000e+00\r\n908 908  1.0000000000000e+00\r\n909 909  1.0000000000000e+00\r\n910 910  1.0000000000000e+00\r\n911 911  1.0000000000000e+00\r\n912 912  1.0000000000000e+00\r\n913 913  1.0000000000000e+00\r\n914 914  1.0000000000000e+00\r\n915 915  1.0000000000000e+00\r\n868 916 -1.5936654000000e-03\r\n870 916 -1.6632213000000e-05\r\n916 916  3.4465667000000e+02\r\n918 916  8.5322576000000e-04\r\n919 916 -1.5603987000000e-03\r\n921 916 -1.6285026000000e-05\r\n2020 916 -6.1605779000000e-02\r\n2022 916 -1.4034255000000e-05\r\n868 917  3.1315115000000e+00\r\n870 917 -2.8647960000000e+00\r\n916 917 -2.0210141000000e+02\r\n917 917 -6.5668414000000e+01\r\n918 917  8.1139592000000e+00\r\n919 917  1.0432158000000e+00\r\n921 917 -2.8137417000000e+00\r\n2022 917 -2.4280655000000e+00\r\n868 918  5.2935070000000e+00\r\n869 918 -8.5754645000000e-01\r\n870 918 -4.8426511000000e+00\r\n916 918 -3.4163222000000e+02\r\n917 918  5.2406411000000e+01\r\n918 918  1.3715837000000e+01\r\n919 918  1.7634519000000e+00\r\n920 918 -2.8567865000000e-01\r\n921 918 -4.7563489000000e+00\r\n2022 918 -4.1044020000000e+00\r\n871 919 -1.5724985000000e-03\r\n873 919 -1.6411306000000e-05\r\n916 919 -6.1502372000000e-02\r\n918 919 -1.6285026000000e-05\r\n919 919  3.3323007000000e+02\r\n921 919  8.5636298000000e-04\r\n922 919 -1.3963692000000e-03\r\n924 919 -1.4573141000000e-05\r\n967 919 -5.3339692000000e-03\r\n969 919 -1.5145699000000e-05\r\n2023 919 -6.2108993000000e-02\r\n2025 919 -1.4554666000000e-05\r\n871 920  4.8166846000000e+00\r\n873 920 -2.8158806000000e+00\r\n918 920 -2.8137417000000e+00\r\n919 920 -1.9928675000000e+02\r\n920 920 -6.3486307000000e+01\r\n921 920  1.3273757000000e+01\r\n922 920  3.1502848000000e+00\r\n924 920 -2.5053347000000e+00\r\n969 920 -2.6169199000000e+00\r\n2025 920 -2.5147666000000e+00\r\n871 921  8.1421188000000e+00\r\n872 921 -1.3190203000000e+00\r\n873 921 -4.7599617000000e+00\r\n918 921 -4.7563489000000e+00\r\n919 921 -3.3687412000000e+02\r\n920 921  5.1716900000000e+01\r\n921 921  2.2437948000000e+01\r\n922 921  5.3252382000000e+00\r\n923 921 -8.6268678000000e-01\r\n924 921 -4.2350152000000e+00\r\n969 921 -4.4236383000000e+00\r\n2025 921 -4.2509584000000e+00\r\n874 922 -6.2867949000000e-03\r\n876 922 -1.3598958000000e-05\r\n919 922 -7.5083445000000e-02\r\n921 922 -1.4573141000000e-05\r\n922 922  2.7580705000000e+02\r\n924 922  7.1551982000000e-04\r\n925 922 -1.1711663000000e-03\r\n927 922 -1.2222822000000e-05\r\n970 922 -4.9045070000000e-03\r\n972 922 -1.2440083000000e-05\r\n2026 922 -6.2807060000000e-02\r\n2028 922 -1.7675613000000e-05\r\n874 923  5.9756739000000e+00\r\n876 923 -2.3380768000000e+00\r\n921 923 -2.5053347000000e+00\r\n922 923 -1.6923485000000e+02\r\n923 923 -5.2550474000000e+01\r\n924 923  1.2108122000000e+01\r\n925 923  4.9393941000000e+00\r\n927 923 -2.0813670000000e+00\r\n972 923 -2.1386753000000e+00\r\n2028 923 -3.0387763000000e+00\r\n874 924  1.0101279000000e+01\r\n875 924 -1.6363979000000e+00\r\n876 924 -3.9522850000000e+00\r\n921 924 -4.2350152000000e+00\r\n922 924 -2.8607459000000e+02\r\n923 924  4.3955116000000e+01\r\n924 924  2.0467567000000e+01\r\n925 924  8.3495517000000e+00\r\n926 924 -1.3526197000000e+00\r\n927 924 -3.5183427000000e+00\r\n972 924 -3.6152167000000e+00\r\n2028 924 -5.1367475000000e+00\r\n877 925 -2.8587000000000e-02\r\n879 925 -1.1486661000000e-05\r\n922 925 -2.7329265000000e-02\r\n924 925 -1.2222822000000e-05\r\n925 925  2.2982680000000e+02\r\n927 925  6.0506617000000e-04\r\n928 925 -1.0877487000000e-03\r\n930 925 -1.1352238000000e-05\r\n973 925 -1.0614415000000e-03\r\n975 925 -1.1077684000000e-05\r\n2029 925 -6.3624211000000e-02\r\n2031 925 -2.1422054000000e-05\r\n877 926  7.2941785000000e+00\r\n879 926 -1.9561967000000e+00\r\n924 926 -2.0813670000000e+00\r\n925 926 -1.4544989000000e+02\r\n926 926 -4.3800301000000e+01\r\n927 926  1.1508061000000e+01\r\n928 926  6.2339408000000e+00\r\n930 926 -1.9081462000000e+00\r\n975 926 -1.9094757000000e+00\r\n2031 926 -3.6479617000000e+00\r\n877 927  1.2330072000000e+01\r\n878 927 -1.9974504000000e+00\r\n879 927 -3.3067529000000e+00\r\n924 927 -3.5183427000000e+00\r\n925 927 -2.4586833000000e+02\r\n926 927  3.7819564000000e+01\r\n927 927  1.9453216000000e+01\r\n928 927  1.0537847000000e+01\r\n929 927 -1.7071130000000e+00\r\n930 927 -3.2255284000000e+00\r\n975 927 -3.2277759000000e+00\r\n2031 927 -6.1665103000000e+00\r\n880 928 -5.1644733000000e-02\r\n882 928 -1.1356095000000e-05\r\n925 928 -1.2405304000000e-02\r\n927 928 -1.1352238000000e-05\r\n928 928  2.2982524000000e+02\r\n930 928  6.0513208000000e-04\r\n931 928 -1.1533051000000e-03\r\n933 928 -1.2036414000000e-05\r\n976 928 -1.0709075000000e-03\r\n978 928 -1.1176475000000e-05\r\n2032 928 -6.3794897000000e-02\r\n2034 928 -2.1708012000000e-05\r\n880 929  1.0488328000000e+01\r\n882 929 -1.9090161000000e+00\r\n927 929 -1.9081462000000e+00\r\n928 929 -1.4859170000000e+02\r\n929 929 -4.3809625000000e+01\r\n930 929  1.1378192000000e+01\r\n931 929  6.1945942000000e+00\r\n933 929 -1.9983706000000e+00\r\n978 929 -1.9088204000000e+00\r\n2034 929 -3.6489216000000e+00\r\n880 930  1.7729469000000e+01\r\n881 930 -2.8721199000000e+00\r\n882 930 -3.2270008000000e+00\r\n927 930 -3.2255284000000e+00\r\n928 930 -2.5117942000000e+02\r\n929 930  3.8656718000000e+01\r\n930 930  1.9233694000000e+01\r\n931 930  1.0471342000000e+01\r\n932 930 -1.6963254000000e+00\r\n933 930 -3.3780457000000e+00\r\n978 930 -3.2266700000000e+00\r\n2034 930 -6.1681371000000e+00\r\n883 931 -7.6275901000000e-02\r\n885 931 -1.2342249000000e-05\r\n928 931 -4.1889144000000e-03\r\n930 931 -1.2036414000000e-05\r\n931 931  2.5280021000000e+02\r\n933 931  6.4834342000000e-04\r\n979 931 -1.2183070000000e-03\r\n981 931 -1.2714803000000e-05\r\n2035 931 -6.3493138000000e-02\r\n2037 931 -1.9998318000000e-05\r\n883 932  1.8367232000000e+01\r\n885 932 -2.0494640000000e+00\r\n930 932 -1.9983706000000e+00\r\n931 932 -1.6345444000000e+02\r\n932 932 -4.8199513000000e+01\r\n933 932  9.5205031000000e+00\r\n981 932 -2.1469161000000e+00\r\n2037 932 -3.3203392000000e+00\r\n883 933  3.1047948000000e+01\r\n884 933 -5.0296385000000e+00\r\n885 933 -3.4644117000000e+00\r\n930 933 -3.3780457000000e+00\r\n931 933 -2.7630321000000e+02\r\n932 933  4.2501223000000e+01\r\n933 933  1.6093452000000e+01\r\n981 933 -3.6291456000000e+00\r\n2037 933 -5.6126982000000e+00\r\n934 934  1.0000000000000e+00\r\n935 935  1.0000000000000e+00\r\n936 936  1.0000000000000e+00\r\n937 937  1.0000000000000e+00\r\n938 938  1.0000000000000e+00\r\n939 939  1.0000000000000e+00\r\n940 940  1.0000000000000e+00\r\n941 941  1.0000000000000e+00\r\n942 942  1.0000000000000e+00\r\n943 943  1.0000000000000e+00\r\n944 944  1.0000000000000e+00\r\n945 945  1.0000000000000e+00\r\n946 946  1.0000000000000e+00\r\n947 947  1.0000000000000e+00\r\n948 948  1.0000000000000e+00\r\n949 949  1.0000000000000e+00\r\n950 950  1.0000000000000e+00\r\n951 951  1.0000000000000e+00\r\n952 952  1.0000000000000e+00\r\n953 953  1.0000000000000e+00\r\n954 954  1.0000000000000e+00\r\n955 955  1.0000000000000e+00\r\n956 956  1.0000000000000e+00\r\n957 957  1.0000000000000e+00\r\n958 958  1.0000000000000e+00\r\n959 959  1.0000000000000e+00\r\n960 960  1.0000000000000e+00\r\n961 961  1.0000000000000e+00\r\n962 962  1.0000000000000e+00\r\n963 963  1.0000000000000e+00\r\n964 964  1.0000000000000e+00\r\n965 965  1.0000000000000e+00\r\n966 966  1.0000000000000e+00\r\n919 967 -1.4512306000000e-03\r\n921 967 -1.5145699000000e-05\r\n967 967  2.9870923000000e+02\r\n969 967  7.4286310000000e-04\r\n970 967 -1.2253255000000e-03\r\n972 967 -1.2788052000000e-05\r\n2071 967 -6.2497635000000e-02\r\n2073 967 -1.6162266000000e-05\r\n919 968  2.9235106000000e+00\r\n921 968 -2.6169199000000e+00\r\n967 968 -1.7516579000000e+02\r\n968 968 -5.6914730000000e+01\r\n969 968  7.6454607000000e+00\r\n970 968  7.0861485000000e-01\r\n972 968 -2.2168790000000e+00\r\n2073 968 -2.8052857000000e+00\r\n919 969  4.9418988000000e+00\r\n920 969 -8.0058804000000e-01\r\n921 969 -4.4236383000000e+00\r\n967 969 -2.9610005000000e+02\r\n968 969  4.5417038000000e+01\r\n969 969  1.2923878000000e+01\r\n970 969  1.1978417000000e+00\r\n971 969 -1.9405045000000e-01\r\n972 969 -3.7474097000000e+00\r\n2073 969 -4.7420516000000e+00\r\n922 970 -1.1919839000000e-03\r\n924 970 -1.2440083000000e-05\r\n967 970 -6.5872756000000e-02\r\n969 970 -1.2788052000000e-05\r\n970 970  2.4133995000000e+02\r\n972 970  6.3226544000000e-04\r\n973 970 -1.0868674000000e-03\r\n975 970 -1.1343040000000e-05\r\n1018 970 -2.6363345000000e-03\r\n1020 970 -1.1284175000000e-05\r\n2074 970 -6.3248693000000e-02\r\n2076 970 -2.0025997000000e-05\r\n922 971  4.3947349000000e+00\r\n924 971 -2.1386753000000e+00\r\n969 971 -2.2168790000000e+00\r\n970 971 -1.4570455000000e+02\r\n971 971 -4.2188136000000e+01\r\n972 971  1.1743620000000e+01\r\n973 971  2.7719884000000e+00\r\n975 971 -1.9550432000000e+00\r\n1020 971 -1.9561966000000e+00\r\n2076 971 -3.4716727000000e+00\r\n922 972  7.4288598000000e+00\r\n923 972 -1.2034742000000e+00\r\n924 972 -3.6152167000000e+00\r\n969 972 -3.7474097000000e+00\r\n970 972 -2.4629897000000e+02\r\n971 972  4.4227243000000e+01\r\n972 972  1.9851412000000e+01\r\n973 972  4.6857691000000e+00\r\n974 972 -7.5909392000000e-01\r\n975 972 -3.3048051000000e+00\r\n1020 972 -3.3067548000000e+00\r\n2076 972 -5.8685156000000e+00\r\n925 973 -1.2781218000000e-02\r\n927 973 -1.1077684000000e-05\r\n970 973 -4.1053693000000e-02\r\n972 973 -1.1343040000000e-05\r\n973 973  2.2983246000000e+02\r\n975 973  6.0332626000000e-04\r\n976 973 -1.0707159000000e-03\r\n978 973 -1.1174475000000e-05\r\n1021 973 -1.6420732000000e-03\r\n1023 973 -1.1077758000000e-05\r\n2077 973 -6.3744100000000e-02\r\n2079 973 -2.1148424000000e-05\r\n925 974  5.7477390000000e+00\r\n927 974 -1.9094757000000e+00\r\n972 974 -1.9550432000000e+00\r\n973 974 -1.4206599000000e+02\r\n974 974 -4.3793757000000e+01\r\n975 974  1.1332200000000e+01\r\n976 974  4.3873821000000e+00\r\n978 974 -1.9082874000000e+00\r\n1023 974 -1.9093383000000e+00\r\n2079 974 -3.6451450000000e+00\r\n925 975  9.7159725000000e+00\r\n926 975 -1.5739818000000e+00\r\n927 975 -3.2277759000000e+00\r\n972 975 -3.3048051000000e+00\r\n973 975 -2.4014821000000e+02\r\n974 975  3.6909200000000e+01\r\n975 975  1.9155942000000e+01\r\n976 975  7.4164266000000e+00\r\n977 975 -1.2014568000000e+00\r\n978 975 -3.2257672000000e+00\r\n1023 975 -3.2275438000000e+00\r\n2079 975 -6.1617491000000e+00\r\n928 976 -1.2881402000000e-02\r\n930 976 -1.1176475000000e-05\r\n973 976 -1.2486327000000e-02\r\n975 976 -1.1174475000000e-05\r\n976 976  2.2979623000000e+02\r\n978 976  6.0487171000000e-04\r\n979 976 -1.1582667000000e-03\r\n981 976 -1.2088195000000e-05\r\n1024 976 -1.1079653000000e-03\r\n1026 976 -1.1563228000000e-05\r\n2080 976 -6.3757781000000e-02\r\n2082 976 -2.1366055000000e-05\r\n928 977  7.5932097000000e+00\r\n930 977 -1.9088204000000e+00\r\n975 977 -1.9082874000000e+00\r\n976 977 -1.4534879000000e+02\r\n977 977 -4.3800643000000e+01\r\n978 977  1.1511560000000e+01\r\n979 977  5.8342629000000e+00\r\n981 977 -2.0408938000000e+00\r\n1026 977 -1.9998514000000e+00\r\n2082 977 -3.6487932000000e+00\r\n928 978  1.2835562000000e+01\r\n929 978 -2.0793411000000e+00\r\n930 978 -3.2266700000000e+00\r\n975 978 -3.2257672000000e+00\r\n976 978 -2.4569759000000e+02\r\n977 978  3.7791073000000e+01\r\n978 978  1.9459139000000e+01\r\n979 978  9.8622379000000e+00\r\n980 978 -1.5976672000000e+00\r\n981 978 -3.4499269000000e+00\r\n1026 978 -3.3805488000000e+00\r\n2082 978 -6.1679201000000e+00\r\n931 979 -2.8942638000000e-02\r\n933 979 -1.2714803000000e-05\r\n976 979 -1.7989387000000e-02\r\n978 979 -1.2088195000000e-05\r\n979 979  2.6426011000000e+02\r\n981 979  6.6172256000000e-04\r\n2083 979 -6.3402179000000e-02\r\n2085 979 -1.8793556000000e-05\r\n931 980  9.0579294000000e+00\r\n933 980 -2.1469161000000e+00\r\n978 980 -2.0408938000000e+00\r\n979 980 -1.6075354000000e+02\r\n980 980 -5.0380740000000e+01\r\n981 980  7.3665337000000e+00\r\n2085 980 -3.1730689000000e+00\r\n931 981  1.5311518000000e+01\r\n932 981 -2.4804263000000e+00\r\n933 981 -3.6291456000000e+00\r\n978 981 -3.4499269000000e+00\r\n979 981 -2.7173768000000e+02\r\n980 981  4.1683042000000e+01\r\n981 981  1.2452383000000e+01\r\n2085 981 -5.3637519000000e+00\r\n982 982  1.0000000000000e+00\r\n983 983  1.0000000000000e+00\r\n984 984  1.0000000000000e+00\r\n985 985  1.0000000000000e+00\r\n986 986  1.0000000000000e+00\r\n987 987  1.0000000000000e+00\r\n988 988  1.0000000000000e+00\r\n989 989  1.0000000000000e+00\r\n990 990  1.0000000000000e+00\r\n991 991  1.0000000000000e+00\r\n992 992  1.0000000000000e+00\r\n993 993  1.0000000000000e+00\r\n994 994  1.0000000000000e+00\r\n995 995  1.0000000000000e+00\r\n996 996  1.0000000000000e+00\r\n997 997  1.0000000000000e+00\r\n998 998  1.0000000000000e+00\r\n999 999  1.0000000000000e+00\r\n1000 1000  1.0000000000000e+00\r\n1001 1001  1.0000000000000e+00\r\n1002 1002  1.0000000000000e+00\r\n1003 1003  1.0000000000000e+00\r\n1004 1004  1.0000000000000e+00\r\n1005 1005  1.0000000000000e+00\r\n1006 1006  1.0000000000000e+00\r\n1007 1007  1.0000000000000e+00\r\n1008 1008  1.0000000000000e+00\r\n1009 1009  1.0000000000000e+00\r\n1010 1010  1.0000000000000e+00\r\n1011 1011  1.0000000000000e+00\r\n1012 1012  1.0000000000000e+00\r\n1013 1013  1.0000000000000e+00\r\n1014 1014  1.0000000000000e+00\r\n1015 1015  1.0000000000000e+00\r\n1016 1016  1.0000000000000e+00\r\n1017 1017  1.0000000000000e+00\r\n970 1018 -1.0812271000000e-03\r\n972 1018 -1.1284175000000e-05\r\n1018 1018  2.2980627000000e+02\r\n1020 1018  5.9156273000000e-04\r\n1021 1018 -1.0508456000000e-03\r\n1023 1018 -1.0967101000000e-05\r\n1066 1018 -1.5430391000000e-02\r\n1068 1018 -1.0935180000000e-05\r\n2122 1018 -6.3775482000000e-02\r\n2124 1018 -2.0866851000000e-05\r\n970 1019  3.4945548000000e+00\r\n972 1019 -1.9561966000000e+00\r\n1018 1019 -1.3702239000000e+02\r\n1019 1019 -4.3781862000000e+01\r\n1020 1019  9.4233865000000e+00\r\n1021 1019  1.5805871000000e+00\r\n1023 1019 -1.9089412000000e+00\r\n1068 1019 -1.9095203000000e+00\r\n2124 1019 -3.6438231000000e+00\r\n970 1020  5.9071955000000e+00\r\n971 1020 -9.5696878000000e-01\r\n972 1020 -3.3067548000000e+00\r\n1018 1020 -2.3162265000000e+02\r\n1019 1020  3.5557344000000e+01\r\n1020 1020  1.5929293000000e+01\r\n1021 1020  2.6718245000000e+00\r\n1022 1020 -4.3283697000000e-01\r\n1023 1020 -3.2268743000000e+00\r\n1068 1020 -3.2278531000000e+00\r\n2124 1020 -6.1595186000000e+00\r\n973 1021 -1.0614486000000e-03\r\n975 1021 -1.1077758000000e-05\r\n1018 1021 -4.1015050000000e-02\r\n1020 1021 -1.0967101000000e-05\r\n1021 1021  2.2983972000000e+02\r\n1023 1021  6.0301883000000e-04\r\n1024 1021 -1.1082774000000e-03\r\n1026 1021 -1.1566485000000e-05\r\n1069 1021 -1.4084164000000e-02\r\n1071 1021 -1.0968606000000e-05\r\n2125 1021 -6.3794062000000e-02\r\n2127 1021 -2.0933286000000e-05\r\n973 1022  4.5370145000000e+00\r\n975 1022 -1.9093383000000e+00\r\n1020 1022 -1.9089412000000e+00\r\n1021 1022 -1.3962158000000e+02\r\n1022 1022 -4.3787669000000e+01\r\n1023 1022  1.1376364000000e+01\r\n1024 1022  3.1452839000000e+00\r\n1026 1022 -2.0002494000000e+00\r\n1071 1022 -1.9092098000000e+00\r\n2127 1022 -3.6437176000000e+00\r\n973 1023  7.6693654000000e+00\r\n974 1023 -1.2424395000000e+00\r\n975 1023 -3.2275438000000e+00\r\n1020 1023 -3.2268743000000e+00\r\n1021 1023 -2.3601620000000e+02\r\n1022 1023  3.6254915000000e+01\r\n1023 1023  1.9230594000000e+01\r\n1024 1023  5.3167851000000e+00\r\n1025 1023 -8.6132074000000e-01\r\n1026 1023 -3.3812198000000e+00\r\n1071 1023 -3.2273259000000e+00\r\n2127 1023 -6.1593344000000e+00\r\n976 1024 -3.0386974000000e-03\r\n978 1024 -1.1563228000000e-05\r\n1021 1024 -1.5614702000000e-02\r\n1023 1024 -1.1566485000000e-05\r\n1024 1024  2.5276665000000e+02\r\n1026 1024  6.3354621000000e-04\r\n2128 1024 -6.3580760000000e-02\r\n2130 1024 -1.9161880000000e-05\r\n976 1025  6.2052888000000e+00\r\n978 1025 -1.9998514000000e+00\r\n1023 1025 -2.0002494000000e+00\r\n1024 1025 -1.5133049000000e+02\r\n1025 1025 -4.8172242000000e+01\r\n1026 1025  7.3192863000000e+00\r\n2130 1025 -3.3137845000000e+00\r\n976 1026  1.0489420000000e+01\r\n977 1026 -1.6992821000000e+00\r\n978 1026 -3.3805488000000e+00\r\n1023 1026 -3.3812198000000e+00\r\n1024 1026 -2.5580907000000e+02\r\n1025 1026  3.9248992000000e+01\r\n1026 1026  1.2372520000000e+01\r\n2130 1026 -5.6016213000000e+00\r\n1027 1027  1.0000000000000e+00\r\n1028 1028  1.0000000000000e+00\r\n1029 1029  1.0000000000000e+00\r\n1030 1030  1.0000000000000e+00\r\n1031 1031  1.0000000000000e+00\r\n1032 1032  1.0000000000000e+00\r\n1033 1033  1.0000000000000e+00\r\n1034 1034  1.0000000000000e+00\r\n1035 1035  1.0000000000000e+00\r\n1036 1036  1.0000000000000e+00\r\n1037 1037  1.0000000000000e+00\r\n1038 1038  1.0000000000000e+00\r\n1039 1039  1.0000000000000e+00\r\n1040 1040  1.0000000000000e+00\r\n1041 1041  1.0000000000000e+00\r\n1042 1042  1.0000000000000e+00\r\n1043 1043  1.0000000000000e+00\r\n1044 1044  1.0000000000000e+00\r\n1045 1045  1.0000000000000e+00\r\n1046 1046  1.0000000000000e+00\r\n1047 1047  1.0000000000000e+00\r\n1048 1048  1.0000000000000e+00\r\n1049 1049  1.0000000000000e+00\r\n1050 1050  1.0000000000000e+00\r\n1051 1051  1.0000000000000e+00\r\n1052 1052  1.0000000000000e+00\r\n1053 1053  1.0000000000000e+00\r\n1054 1054  1.0000000000000e+00\r\n1055 1055  1.0000000000000e+00\r\n1056 1056  1.0000000000000e+00\r\n1057 1057  1.0000000000000e+00\r\n1058 1058  1.0000000000000e+00\r\n1059 1059  1.0000000000000e+00\r\n1060 1060  1.0000000000000e+00\r\n1061 1061  1.0000000000000e+00\r\n1062 1062  1.0000000000000e+00\r\n1063 1063  1.0000000000000e+00\r\n1064 1064  1.0000000000000e+00\r\n1065 1065  1.0000000000000e+00\r\n1018 1066 -1.0477870000000e-03\r\n1020 1066 -1.0935180000000e-05\r\n1066 1066  2.2979553000000e+02\r\n1068 1066  5.8009517000000e-04\r\n1069 1066 -1.0433945000000e-03\r\n1071 1066 -1.0889337000000e-05\r\n2170 1066 -6.3870563000000e-02\r\n2172 1066 -2.0759632000000e-05\r\n1018 1067  2.2605796000000e+00\r\n1020 1067 -1.9095203000000e+00\r\n1066 1067 -1.3474317000000e+02\r\n1067 1067 -4.3777519000000e+01\r\n1068 1067  7.4661549000000e+00\r\n1069 1067  5.2937606000000e-01\r\n1071 1067 -1.9090927000000e+00\r\n2172 1067 -3.6426386000000e+00\r\n1018 1068  3.8212837000000e+00\r\n1019 1068 -6.1905167000000e-01\r\n1020 1068 -3.2278531000000e+00\r\n1066 1068 -2.2776985000000e+02\r\n1067 1068  3.4943889000000e+01\r\n1068 1068  1.2620788000000e+01\r\n1069 1068  8.9485729000000e-01\r\n1070 1068 -1.4496775000000e-01\r\n1071 1068 -3.2271302000000e+00\r\n2172 1068 -6.1575162000000e+00\r\n1021 1069 -1.0509899000000e-03\r\n1023 1069 -1.0968606000000e-05\r\n1066 1069 -4.2359559000000e-02\r\n1068 1069 -1.0889337000000e-05\r\n1069 1069  2.2983197000000e+02\r\n1071 1069  5.8014818000000e-04\r\n2173 1069 -6.3888929000000e-02\r\n2175 1069 -2.0783011000000e-05\r\n1021 1070  3.3115470000000e+00\r\n1023 1070 -1.9092098000000e+00\r\n1068 1070 -1.9090927000000e+00\r\n1069 1070 -1.3525858000000e+02\r\n1070 1070 -4.3782057000000e+01\r\n1071 1070  7.4668641000000e+00\r\n2175 1070 -3.6436564000000e+00\r\n1021 1071  5.5978351000000e+00\r\n1022 1071 -9.0685487000000e-01\r\n1023 1071 -3.2273259000000e+00\r\n1068 1071 -3.2271302000000e+00\r\n1069 1071 -2.2864096000000e+02\r\n1070 1071  3.5074011000000e+01\r\n1071 1071  1.2621981000000e+01\r\n2175 1071 -6.1592331000000e+00\r\n1072 1072  1.0000000000000e+00\r\n1073 1073  1.0000000000000e+00\r\n1074 1074  1.0000000000000e+00\r\n1075 1075  1.0000000000000e+00\r\n1076 1076  1.0000000000000e+00\r\n1077 1077  1.0000000000000e+00\r\n1078 1078  1.0000000000000e+00\r\n1079 1079  1.0000000000000e+00\r\n1080 1080  1.0000000000000e+00\r\n1081 1081  1.0000000000000e+00\r\n1082 1082  1.0000000000000e+00\r\n1083 1083  1.0000000000000e+00\r\n1084 1084  1.0000000000000e+00\r\n1085 1085  1.0000000000000e+00\r\n1086 1086  1.0000000000000e+00\r\n1087 1087  1.0000000000000e+00\r\n1088 1088  1.0000000000000e+00\r\n1089 1089  1.0000000000000e+00\r\n1090 1090  1.0000000000000e+00\r\n1091 1091  1.0000000000000e+00\r\n1092 1092  1.0000000000000e+00\r\n1093 1093  1.0000000000000e+00\r\n1094 1094  1.0000000000000e+00\r\n1095 1095  1.0000000000000e+00\r\n1096 1096  1.0000000000000e+00\r\n1097 1097  1.0000000000000e+00\r\n1098 1098  1.0000000000000e+00\r\n1099 1099  1.0000000000000e+00\r\n1100 1100  1.0000000000000e+00\r\n1101 1101  1.0000000000000e+00\r\n1102 1102  1.0000000000000e+00\r\n1103 1103  1.0000000000000e+00\r\n1104 1104  1.0000000000000e+00\r\n1105 1105  1.0000000000000e+00\r\n1106 1106  1.0000000000000e+00\r\n1107 1107  1.0000000000000e+00\r\n1108 1108  1.0000000000000e+00\r\n1109 1109  1.0000000000000e+00\r\n1110 1110  1.0000000000000e+00\r\n1111 1111  1.0000000000000e+00\r\n1112 1112  1.0000000000000e+00\r\n1113 1113  1.0000000000000e+00\r\n1114 1114  1.0000000000000e+00\r\n1115 1115  1.0000000000000e+00\r\n1116 1116  1.0000000000000e+00\r\n1117 1117  1.0000000000000e+00\r\n1118 1118  1.0000000000000e+00\r\n1119 1119  1.0000000000000e+00\r\n1120 1120  1.0000000000000e+00\r\n1121 1121  1.0000000000000e+00\r\n1122 1122  1.0000000000000e+00\r\n1123 1123  1.0000000000000e+00\r\n1124 1124  1.0000000000000e+00\r\n1125 1125  1.0000000000000e+00\r\n1126 1126  1.0000000000000e+00\r\n1127 1127  1.0000000000000e+00\r\n1128 1128  1.0000000000000e+00\r\n1129 1129  1.0000000000000e+00\r\n1130 1130  1.0000000000000e+00\r\n1131 1131  1.0000000000000e+00\r\n1132 1132  1.0000000000000e+00\r\n1133 1133  1.0000000000000e+00\r\n1134 1134  1.0000000000000e+00\r\n1135 1135  1.0000000000000e+00\r\n1136 1136  1.0000000000000e+00\r\n1137 1137  1.0000000000000e+00\r\n1138 1138  1.0000000000000e+00\r\n1139 1139  1.0000000000000e+00\r\n1140 1140  1.0000000000000e+00\r\n1141 1141  1.0000000000000e+00\r\n1142 1142  1.0000000000000e+00\r\n1143 1143  1.0000000000000e+00\r\n1144 1144  1.0000000000000e+00\r\n1145 1145  1.0000000000000e+00\r\n1146 1146  1.0000000000000e+00\r\n1147 1147  1.0000000000000e+00\r\n1148 1148  1.0000000000000e+00\r\n1149 1149  1.0000000000000e+00\r\n1150 1150  1.0000000000000e+00\r\n1151 1151  1.0000000000000e+00\r\n1152 1152  1.0000000000000e+00\r\n1153 1153  1.0000000000000e+00\r\n1154 1154  1.0000000000000e+00\r\n1155 1155  1.0000000000000e+00\r\n1156 1156  1.0000000000000e+00\r\n1157 1157  1.0000000000000e+00\r\n1158 1158  1.0000000000000e+00\r\n1159 1159  1.0000000000000e+00\r\n1160 1160  1.0000000000000e+00\r\n1161 1161  1.0000000000000e+00\r\n1162 1162  1.0000000000000e+00\r\n1163 1163  1.0000000000000e+00\r\n1164 1164  1.0000000000000e+00\r\n1165 1165  1.0000000000000e+00\r\n1166 1166  1.0000000000000e+00\r\n1167 1167  1.0000000000000e+00\r\n1168 1168  1.0000000000000e+00\r\n1169 1169  1.0000000000000e+00\r\n1170 1170  1.0000000000000e+00\r\n1171 1171  1.0000000000000e+00\r\n1172 1172  1.0000000000000e+00\r\n1173 1173  1.0000000000000e+00\r\n1174 1174  1.0000000000000e+00\r\n1175 1175  1.0000000000000e+00\r\n1176 1176  1.0000000000000e+00\r\n1177 1177  1.0000000000000e+00\r\n1178 1178  1.0000000000000e+00\r\n1179 1179  1.0000000000000e+00\r\n1180 1180  1.0000000000000e+00\r\n1181 1181  1.0000000000000e+00\r\n1182 1182  1.0000000000000e+00\r\n1183 1183  1.0000000000000e+00\r\n1184 1184  1.0000000000000e+00\r\n1185 1185  1.0000000000000e+00\r\n1186 1186  1.0000000000000e+00\r\n1187 1187  1.0000000000000e+00\r\n1188 1188  1.0000000000000e+00\r\n1189 1189  1.0000000000000e+00\r\n1190 1190  1.0000000000000e+00\r\n1191 1191  1.0000000000000e+00\r\n1192 1192  1.0000000000000e+00\r\n1193 1193  1.0000000000000e+00\r\n1194 1194  1.0000000000000e+00\r\n1195 1195  1.0000000000000e+00\r\n1196 1196  1.0000000000000e+00\r\n1197 1197  1.0000000000000e+00\r\n1198 1198  1.0000000000000e+00\r\n1199 1199  1.0000000000000e+00\r\n1200 1200  1.0000000000000e+00\r\n1201 1201  1.0000000000000e+00\r\n1202 1202  1.0000000000000e+00\r\n1203 1203  1.0000000000000e+00\r\n1204 1204  1.0000000000000e+00\r\n1205 1205  1.0000000000000e+00\r\n1206 1206  1.0000000000000e+00\r\n1207 1207  1.0000000000000e+00\r\n1208 1208  1.0000000000000e+00\r\n1209 1209  1.0000000000000e+00\r\n1210 1210  1.0000000000000e+00\r\n1211 1211  1.0000000000000e+00\r\n1212 1212  1.0000000000000e+00\r\n1213 1213  1.0000000000000e+00\r\n1214 1214  1.0000000000000e+00\r\n1215 1215  1.0000000000000e+00\r\n1216 1216  1.0000000000000e+00\r\n1217 1217  1.0000000000000e+00\r\n1218 1218  1.0000000000000e+00\r\n1219 1219  1.0000000000000e+00\r\n1220 1220  1.0000000000000e+00\r\n1221 1221  1.0000000000000e+00\r\n1222 1222  1.0000000000000e+00\r\n1223 1223  1.0000000000000e+00\r\n1224 1224  1.0000000000000e+00\r\n1225 1225  1.0000000000000e+00\r\n1226 1226  1.0000000000000e+00\r\n1227 1227  1.0000000000000e+00\r\n1228 1228  1.0000000000000e+00\r\n1229 1229  1.0000000000000e+00\r\n1230 1230  1.0000000000000e+00\r\n1231 1231  1.0000000000000e+00\r\n1232 1232  1.0000000000000e+00\r\n1233 1233  1.0000000000000e+00\r\n1234 1234  1.0000000000000e+00\r\n1235 1235  1.0000000000000e+00\r\n1236 1236  1.0000000000000e+00\r\n133 1237 -2.5994143000000e+00\r\n135 1237 -9.4695072000000e-02\r\n1237 1237  1.9983945000000e+02\r\n1239 1237  2.6103739000000e-01\r\n1240 1237 -1.8307631000000e-01\r\n1242 1237 -3.0282569000000e-02\r\n1285 1237 -2.6654401000000e+00\r\n1287 1237 -5.6301327000000e-02\r\n133 1238  1.0350072000000e+01\r\n135 1238 -9.0991269000000e-01\r\n1237 1238 -1.3370690000000e+02\r\n1238 1238 -2.8933988000000e+01\r\n1239 1238  2.0907142000000e+00\r\n1242 1238 -6.3656354000000e-01\r\n1285 1238  1.1613324000000e+01\r\n1287 1238 -5.4102785000000e-01\r\n133 1239  1.7495750000000e+01\r\n134 1239 -1.8416690000000e+00\r\n135 1239 -1.5381153000000e+00\r\n1237 1239 -2.2601800000000e+02\r\n1238 1239  2.6839463000000e+01\r\n1239 1239  3.5341416000000e+00\r\n1242 1239 -1.0760470000000e+00\r\n1285 1239  1.9631152000000e+01\r\n1286 1239 -2.0664493000000e+00\r\n1287 1239 -9.1455284000000e-01\r\n136 1240 -2.0304410000000e+00\r\n138 1240 -5.7589129000000e-02\r\n1237 1240 -5.0296613000000e-01\r\n1239 1240 -3.0282569000000e-02\r\n1240 1240  1.8993261000000e+02\r\n1242 1240  3.9513066000000e-01\r\n1243 1240 -1.5909447000000e-01\r\n1245 1240 -1.7631713000000e-02\r\n1288 1240 -2.0257365000000e+00\r\n1290 1240 -3.0138742000000e-02\r\n2344 1240 -1.6231279000000e+00\r\n2346 1240 -1.7988385000000e-01\r\n136 1241  1.1063571000000e+01\r\n138 1241 -1.2106635000000e+00\r\n1237 1241  1.5421811000000e+00\r\n1239 1241 -6.3656354000000e-01\r\n1240 1241 -1.3058767000000e+02\r\n1241 1241 -2.9175140000000e+01\r\n1242 1241  4.0757323000000e+00\r\n1245 1241 -6.8751686000000e-01\r\n1288 1241  1.2447368000000e+01\r\n1290 1241 -6.3364510000000e-01\r\n2346 1241 -9.0410623000000e-01\r\n136 1242  1.8701860000000e+01\r\n137 1242 -2.2185372000000e+00\r\n138 1242 -2.0465056000000e+00\r\n1237 1242  2.6069029000000e+00\r\n1238 1242 -3.0924792000000e-01\r\n1239 1242 -1.0760470000000e+00\r\n1240 1242 -2.2074539000000e+02\r\n1241 1242  2.8144064000000e+01\r\n1242 1242  6.8896171000000e+00\r\n1245 1242 -1.1621777000000e+00\r\n1288 1242  2.1041031000000e+01\r\n1289 1242 -2.4960249000000e+00\r\n1290 1242 -1.0711137000000e+00\r\n2346 1242 -1.5283012000000e+00\r\n139 1243 -1.5798380000000e+00\r\n141 1243 -3.7800198000000e-02\r\n1240 1243 -3.0421249000000e-01\r\n1242 1243 -1.7631713000000e-02\r\n1243 1243  1.7737888000000e+02\r\n1245 1243  2.5785878000000e-01\r\n1246 1243 -1.0992009000000e-01\r\n1248 1243 -9.7964493000000e-03\r\n1291 1243 -1.5190962000000e+00\r\n1293 1243 -1.7293696000000e-02\r\n2347 1243 -1.0753633000000e+00\r\n2349 1243 -9.5840005000000e-02\r\n139 1244  1.0271379000000e+01\r\n141 1244 -1.4740605000000e+00\r\n1240 1244  7.6804050000000e-01\r\n1242 1244 -6.8751686000000e-01\r\n1243 1244 -1.2169148000000e+02\r\n1244 1244 -2.8598581000000e+01\r\n1245 1244  4.9391117000000e+00\r\n1248 1244 -7.2186927000000e-01\r\n1291 1244  1.1326966000000e+01\r\n1293 1244 -6.7444889000000e-01\r\n2349 1244 -1.3780428000000e+00\r\n139 1245  1.7362727000000e+01\r\n140 1245 -2.2457823000000e+00\r\n141 1245 -2.4917501000000e+00\r\n1240 1245  1.2982948000000e+00\r\n1241 1245 -1.6792798000000e-01\r\n1242 1245 -1.1621777000000e+00\r\n1243 1245 -2.0570714000000e+02\r\n1244 1245  2.7549954000000e+01\r\n1245 1245  8.3490693000000e+00\r\n1248 1245 -1.2202478000000e+00\r\n1291 1245  1.9147090000000e+01\r\n1292 1245 -2.4765803000000e+00\r\n1293 1245 -1.1400876000000e+00\r\n2349 1245 -2.3294416000000e+00\r\n142 1246 -1.2449286000000e+00\r\n144 1246 -2.3819524000000e-02\r\n1243 1246 -2.1725091000000e-01\r\n1245 1246 -9.7964493000000e-03\r\n1246 1246  1.6530078000000e+02\r\n1248 1246  1.7101052000000e-01\r\n1294 1246 -1.0736056000000e+00\r\n1296 1246 -9.6005376000000e-03\r\n2350 1246 -7.7598780000000e-01\r\n2352 1246 -4.8389152000000e-02\r\n142 1247  9.9607313000000e+00\r\n144 1247 -1.7553192000000e+00\r\n1243 1247  3.9035433000000e-01\r\n1245 1247 -7.2186927000000e-01\r\n1246 1247 -1.1383567000000e+02\r\n1247 1247 -2.7734053000000e+01\r\n1248 1247  5.0443281000000e+00\r\n1294 1247  1.0369892000000e+01\r\n1296 1247 -7.0754460000000e-01\r\n2352 1247 -1.8565169000000e+00\r\n142 1248  1.6837620000000e+01\r\n143 1248 -2.2908186000000e+00\r\n144 1248 -2.9671916000000e+00\r\n1243 1248  6.5985496000000e-01\r\n1244 1248 -8.9775633000000e-02\r\n1245 1248 -1.2202478000000e+00\r\n1246 1248 -1.9242782000000e+02\r\n1247 1248  2.6733771000000e+01\r\n1248 1248  8.5269322000000e+00\r\n1294 1248  1.7529266000000e+01\r\n1295 1248 -2.3849195000000e+00\r\n1296 1248 -1.1960334000000e+00\r\n2352 1248 -3.1382562000000e+00\r\n1249 1249  1.0000000000000e+00\r\n1250 1250  1.0000000000000e+00\r\n1251 1251  1.0000000000000e+00\r\n1252 1252  1.0000000000000e+00\r\n1253 1253  1.0000000000000e+00\r\n1254 1254  1.0000000000000e+00\r\n1255 1255  1.0000000000000e+00\r\n1256 1256  1.0000000000000e+00\r\n1257 1257  1.0000000000000e+00\r\n1258 1258  1.0000000000000e+00\r\n1259 1259  1.0000000000000e+00\r\n1260 1260  1.0000000000000e+00\r\n1261 1261  1.0000000000000e+00\r\n1262 1262  1.0000000000000e+00\r\n1263 1263  1.0000000000000e+00\r\n160 1264 -9.4341750000000e-01\r\n162 1264 -1.5588662000000e-02\r\n1264 1264  2.7372638000000e+02\r\n1266 1264  1.8675300000000e-01\r\n1267 1264 -3.1063380000000e-01\r\n1269 1264 -1.7255584000000e-02\r\n1312 1264 -1.5953616000000e+00\r\n1314 1264 -1.7181733000000e-02\r\n2368 1264 -9.1320914000000e-01\r\n2370 1264 -5.6946019000000e-02\r\n160 1265  7.7871889000000e+00\r\n162 1265 -1.0375061000000e+00\r\n1264 1265 -1.7821273000000e+02\r\n1265 1265 -4.6024490000000e+01\r\n1266 1265  4.0170978000000e+00\r\n1269 1265 -9.2429644000000e-01\r\n1312 1265  1.5256565000000e+01\r\n1314 1265 -1.1435802000000e+00\r\n2370 1265 -9.0660211000000e-01\r\n160 1266  1.3163464000000e+01\r\n161 1266 -1.7642359000000e+00\r\n162 1266 -1.7538002000000e+00\r\n1264 1266 -3.0125080000000e+02\r\n1265 1266  4.1622307000000e+01\r\n1266 1266  6.7905012000000e+00\r\n1269 1266 -1.5624298000000e+00\r\n1312 1266  2.5789698000000e+01\r\n1313 1266 -3.4564694000000e+00\r\n1314 1266 -1.9331079000000e+00\r\n2370 1266 -1.5325202000000e+00\r\n163 1267 -1.3679222000000e+00\r\n165 1267 -3.7420658000000e-02\r\n1264 1267 -1.5570059000000e-01\r\n1266 1267 -1.7255584000000e-02\r\n1267 1267  2.7429668000000e+02\r\n1269 1267  2.2662886000000e-01\r\n1270 1267 -4.5924620000000e-01\r\n1272 1267 -5.0896157000000e-02\r\n1315 1267 -2.3447556000000e+00\r\n1317 1267 -4.1112199000000e-02\r\n163 1268  7.2414355000000e+00\r\n165 1268 -8.3688804000000e-01\r\n1264 1268  6.6831393000000e-03\r\n1266 1268 -9.2429644000000e-01\r\n1267 1268 -1.7646757000000e+02\r\n1268 1268 -4.3113782000000e+01\r\n1269 1268  3.5454112000000e+00\r\n1272 1268 -8.5993164000000e-01\r\n1315 1268  1.4043798000000e+01\r\n1317 1268 -9.1950682000000e-01\r\n163 1269  1.2240915000000e+01\r\n164 1269 -1.4746526000000e+00\r\n165 1269 -1.4146747000000e+00\r\n1264 1269  1.1297172000000e-02\r\n1265 1269 -1.3609606000000e-03\r\n1266 1269 -1.5624298000000e+00\r\n1267 1269 -2.9830062000000e+02\r\n1268 1269  3.8450812000000e+01\r\n1269 1269  5.9931604000000e+00\r\n1272 1269 -1.4536284000000e+00\r\n1315 1269  2.3739623000000e+01\r\n1316 1269 -2.8598919000000e+00\r\n1317 1269 -1.5543334000000e+00\r\n166 1270 -1.5307554000000e+00\r\n168 1270 -4.6029227000000e-02\r\n1267 1270 -4.2528600000000e-01\r\n1269 1270 -5.0896157000000e-02\r\n1270 1270  2.7499971000000e+02\r\n1272 1270  2.7845349000000e-01\r\n1273 1270 -3.7315851000000e-01\r\n1275 1270 -5.0886177000000e-02\r\n1318 1270 -2.6999874000000e+00\r\n1320 1270 -5.0646805000000e-02\r\n166 1271  7.3587639000000e+00\r\n168 1271 -7.7776517000000e-01\r\n1267 1271  3.5203495000000e-01\r\n1269 1271 -8.5993164000000e-01\r\n1270 1271 -1.7669933000000e+02\r\n1271 1271 -4.2206845000000e+01\r\n1272 1271  3.3582000000000e+00\r\n1275 1271 -8.5997629000000e-01\r\n1318 1271  1.3811176000000e+01\r\n1320 1271 -8.5583973000000e-01\r\n166 1272  1.2439255000000e+01\r\n167 1272 -1.4685408000000e+00\r\n168 1272 -1.3147342000000e+00\r\n1267 1272  5.9507987000000e-01\r\n1268 1272 -7.0253332000000e-02\r\n1269 1272 -1.4536284000000e+00\r\n1270 1272 -2.9869255000000e+02\r\n1271 1272  3.7696049000000e+01\r\n1272 1272  5.6767002000000e+00\r\n1275 1272 -1.4537028000000e+00\r\n1318 1272  2.3346412000000e+01\r\n1319 1272 -2.7562069000000e+00\r\n1320 1272 -1.4467115000000e+00\r\n169 1273 -1.5171271000000e+00\r\n171 1273 -4.5988738000000e-02\r\n1270 1273 -4.3522813000000e-01\r\n1272 1273 -5.0886177000000e-02\r\n1273 1273  2.7494106000000e+02\r\n1275 1273  2.6592512000000e-01\r\n1276 1273 -2.8159209000000e-01\r\n1278 1273 -3.8399619000000e-02\r\n1321 1273 -2.7363301000000e+00\r\n1323 1273 -5.0655485000000e-02\r\n169 1274  7.2782798000000e+00\r\n171 1274 -7.7727817000000e-01\r\n1270 1274  3.7276885000000e-01\r\n1272 1274 -8.5997629000000e-01\r\n1273 1274 -1.7682748000000e+02\r\n1274 1274 -4.2207454000000e+01\r\n1275 1274  3.4315562000000e+00\r\n1278 1274 -9.3341499000000e-01\r\n1321 1274  1.3998636000000e+01\r\n1323 1274 -8.5619956000000e-01\r\n169 1275  1.2303195000000e+01\r\n170 1275 -1.4525767000000e+00\r\n171 1275 -1.3139100000000e+00\r\n1270 1275  6.3012799000000e-01\r\n1271 1275 -7.4396062000000e-02\r\n1272 1275 -1.4537028000000e+00\r\n1273 1275 -2.9890894000000e+02\r\n1274 1275  3.7723230000000e+01\r\n1275 1275  5.8006993000000e+00\r\n1278 1275 -1.5778447000000e+00\r\n1321 1275  2.3663276000000e+01\r\n1322 1275 -2.7938047000000e+00\r\n1323 1275 -1.4473186000000e+00\r\n172 1276 -1.3225046000000e+00\r\n174 1276 -3.5749077000000e-02\r\n1273 1276 -4.2846889000000e-01\r\n1275 1276 -3.8399619000000e-02\r\n1276 1276  2.6894547000000e+02\r\n1278 1276  2.1794486000000e-01\r\n1279 1276 -2.3129015000000e-01\r\n1281 1276 -2.5632829000000e-02\r\n1324 1276 -2.3927782000000e+00\r\n1326 1276 -3.8254744000000e-02\r\n172 1277  7.0173118000000e+00\r\n174 1277 -8.6906437000000e-01\r\n1273 1277  5.3178770000000e-01\r\n1275 1277 -9.3341499000000e-01\r\n1276 1277 -1.7415171000000e+02\r\n1277 1277 -4.2499768000000e+01\r\n1278 1277  3.7247494000000e+00\r\n1281 1277 -9.8752534000000e-01\r\n1324 1277  1.4529641000000e+01\r\n1326 1277 -9.3002484000000e-01\r\n172 1278  1.1862064000000e+01\r\n173 1278 -1.4575026000000e+00\r\n174 1278 -1.4690664000000e+00\r\n1273 1278  8.9893392000000e-01\r\n1274 1278 -1.1045283000000e-01\r\n1275 1278 -1.5778447000000e+00\r\n1276 1278 -2.9438605000000e+02\r\n1277 1278  3.8216679000000e+01\r\n1278 1278  6.2963151000000e+00\r\n1281 1278 -1.6693115000000e+00\r\n1324 1278  2.4560905000000e+01\r\n1325 1278 -3.0178208000000e+00\r\n1326 1278 -1.5721140000000e+00\r\n175 1279 -1.1990370000000e+00\r\n177 1279 -2.6535070000000e-02\r\n1276 1279 -4.8675089000000e-01\r\n1278 1279 -2.5632829000000e-02\r\n1279 1279  2.5345377000000e+02\r\n1281 1279  2.7783541000000e-01\r\n1282 1279 -1.6380963000000e-01\r\n1284 1279 -1.4599267000000e-02\r\n1327 1279 -2.0431895000000e+00\r\n1329 1279 -2.5273315000000e-02\r\n2383 1279 -1.1895630000000e+00\r\n2385 1279 -1.0601787000000e-01\r\n175 1280  7.5441924000000e+00\r\n177 1280 -1.0223718000000e+00\r\n1276 1280  1.6053408000000e+00\r\n1278 1280 -9.8752534000000e-01\r\n1279 1280 -1.6708346000000e+02\r\n1280 1280 -4.1094302000000e+01\r\n1281 1280  4.7692005000000e+00\r\n1284 1280 -1.0151535000000e+00\r\n1327 1280  1.5172454000000e+01\r\n1329 1280 -9.7381837000000e-01\r\n2385 1280 -7.6576743000000e-01\r\n175 1281  1.2752693000000e+01\r\n176 1281 -1.6457484000000e+00\r\n177 1281 -1.7282160000000e+00\r\n1276 1281  2.7136660000000e+00\r\n1277 1281 -3.5020145000000e-01\r\n1278 1281 -1.6693115000000e+00\r\n1279 1281 -2.8243766000000e+02\r\n1280 1281  3.7822306000000e+01\r\n1281 1281  8.0618517000000e+00\r\n1284 1281 -1.7160154000000e+00\r\n1327 1281  2.5647495000000e+01\r\n1328 1281 -3.3098362000000e+00\r\n1329 1281 -1.6461413000000e+00\r\n2385 1281 -1.2944525000000e+00\r\n178 1282 -9.4429877000000e-01\r\n180 1282 -1.7904448000000e-02\r\n1279 1282 -3.2832762000000e-01\r\n1281 1282 -1.4599267000000e-02\r\n1282 1282  2.3061226000000e+02\r\n1284 1282  1.9055436000000e-01\r\n1285 1282 -2.7684053000000e-01\r\n1287 1282 -1.3444978000000e-02\r\n1330 1282 -1.4800182000000e+00\r\n1332 1282 -1.4389328000000e-02\r\n2386 1282 -8.1124421000000e-01\r\n2388 1282 -5.0587676000000e-02\r\n178 1283  7.0004257000000e+00\r\n180 1283 -1.2450844000000e+00\r\n1279 1283  7.7100684000000e-01\r\n1281 1283 -1.0151535000000e+00\r\n1282 1283 -1.5247358000000e+02\r\n1283 1283 -3.8737952000000e+01\r\n1284 1283  5.3963467000000e+00\r\n1285 1283  3.3671755000000e-02\r\n1287 1283 -9.3492686000000e-01\r\n1330 1283  1.4324093000000e+01\r\n1332 1283 -1.0007156000000e+00\r\n2388 1283 -1.1961635000000e+00\r\n178 1284  1.1833520000000e+01\r\n179 1284 -1.5965280000000e+00\r\n180 1284 -2.1046906000000e+00\r\n1279 1284  1.3033100000000e+00\r\n1280 1284 -1.7583702000000e-01\r\n1281 1284 -1.7160154000000e+00\r\n1282 1284 -2.5774134000000e+02\r\n1283 1284  3.5691370000000e+01\r\n1284 1284  9.1219845000000e+00\r\n1285 1284  5.6918735000000e-02\r\n1286 1284 -7.6792327000000e-03\r\n1287 1284 -1.5804004000000e+00\r\n1330 1284  2.4213447000000e+01\r\n1331 1284 -3.2667749000000e+00\r\n1332 1284 -1.6916096000000e+00\r\n2388 1284 -2.0219947000000e+00\r\n181 1285 -4.9113639000000e-01\r\n183 1285 -8.8105909000000e-03\r\n1237 1285 -1.9213504000000e+00\r\n1239 1285 -5.6301327000000e-02\r\n1282 1285 -4.5882599000000e-01\r\n1284 1285 -1.3444978000000e-02\r\n1285 1285  2.1517023000000e+02\r\n1287 1285  1.1397561000000e-01\r\n1288 1285 -9.6336002000000e-02\r\n1290 1285 -2.8229337000000e-03\r\n1333 1285 -7.4843137000000e-01\r\n1335 1285 -6.0525091000000e-03\r\n2389 1285 -8.8396792000000e-01\r\n2391 1285 -2.5902910000000e-02\r\n181 1286  4.3571752000000e+00\r\n183 1286 -1.5144038000000e+00\r\n1239 1286 -5.4102785000000e-01\r\n1284 1286 -9.3492686000000e-01\r\n1285 1286 -1.3784731000000e+02\r\n1286 1286 -3.7353073000000e+01\r\n1287 1286  6.6361713000000e+00\r\n1290 1286 -1.0486939000000e+00\r\n1333 1286  1.2460168000000e+01\r\n1335 1286 -1.0404125000000e+00\r\n2391 1286 -1.5525563000000e+00\r\n181 1287  7.3653644000000e+00\r\n182 1287 -1.0349868000000e+00\r\n183 1287 -2.5599466000000e+00\r\n1239 1287 -9.1455284000000e-01\r\n1284 1287 -1.5804004000000e+00\r\n1285 1287 -2.3301694000000e+02\r\n1286 1287  3.3533235000000e+01\r\n1287 1287  1.1217779000000e+01\r\n1290 1287 -1.7727122000000e+00\r\n1333 1287  2.1062655000000e+01\r\n1334 1287 -2.9597410000000e+00\r\n1335 1287 -1.7587122000000e+00\r\n2391 1287 -2.6244395000000e+00\r\n184 1288 -3.5135249000000e-01\r\n186 1288 -4.7336046000000e-03\r\n1240 1288 -1.7041409000000e+00\r\n1242 1288 -3.0138742000000e-02\r\n1285 1288 -2.0094568000000e-01\r\n1287 1288 -2.8229337000000e-03\r\n1288 1288  1.9779559000000e+02\r\n1290 1288  5.3736241000000e-02\r\n1291 1288 -1.0674129000000e-01\r\n1293 1288 -1.8877829000000e-03\r\n1336 1288 -4.5062396000000e-01\r\n1338 1288 -2.7784901000000e-03\r\n2392 1288 -6.1217237000000e-01\r\n2394 1288 -1.0826631000000e-02\r\n184 1289  3.1476727000000e+00\r\n186 1289 -1.7586124000000e+00\r\n1242 1289 -6.3364510000000e-01\r\n1285 1289  1.5631499000000e+00\r\n1287 1289 -1.0486939000000e+00\r\n1288 1289 -1.2762179000000e+02\r\n1289 1289 -3.5250430000000e+01\r\n1290 1289  7.4250632000000e+00\r\n1293 1289 -9.9184626000000e-01\r\n1336 1289  1.1194629000000e+01\r\n1338 1289 -1.0323390000000e+00\r\n2394 1289 -1.9560092000000e+00\r\n184 1290  5.3208259000000e+00\r\n185 1290 -7.7296038000000e-01\r\n186 1290 -2.9727583000000e+00\r\n1242 1290 -1.0711137000000e+00\r\n1285 1290  2.6423486000000e+00\r\n1286 1290 -3.8385597000000e-01\r\n1287 1290 -1.7727122000000e+00\r\n1288 1290 -2.1573187000000e+02\r\n1289 1290  3.1772134000000e+01\r\n1290 1290  1.2551325000000e+01\r\n1293 1290 -1.6766156000000e+00\r\n1336 1290  1.8923400000000e+01\r\n1337 1290 -2.7490166000000e+00\r\n1338 1290 -1.7450659000000e+00\r\n2394 1290 -3.3064380000000e+00\r\n187 1291 -2.8222379000000e-01\r\n189 1291 -3.7533603000000e-03\r\n1243 1291 -9.7784090000000e-01\r\n1245 1291 -1.7293696000000e-02\r\n1288 1291 -1.5896989000000e-01\r\n1290 1291 -1.8877829000000e-03\r\n1291 1291  1.8041258000000e+02\r\n1293 1291  3.3488050000000e-02\r\n1294 1291 -7.8484528000000e-02\r\n1296 1291 -1.3880454000000e-03\r\n1339 1291 -3.5805095000000e-01\r\n1341 1291 -1.8557042000000e-03\r\n2395 1291 -3.8579490000000e-01\r\n2397 1291 -6.8230113000000e-03\r\n187 1292  2.7004002000000e+00\r\n189 1292 -1.9721237000000e+00\r\n1245 1292 -6.7444889000000e-01\r\n1288 1292  2.0088489000000e+00\r\n1290 1292 -9.9184626000000e-01\r\n1291 1292 -1.1678376000000e+02\r\n1292 1292 -3.2598054000000e+01\r\n1293 1292  7.8000515000000e+00\r\n1296 1292 -9.3479640000000e-01\r\n1339 1292  9.6689609000000e+00\r\n1341 1292 -9.7512180000000e-01\r\n2397 1292 -2.2480915000000e+00\r\n187 1293  4.5647529000000e+00\r\n188 1293 -6.8172614000000e-01\r\n189 1293 -3.3336753000000e+00\r\n1245 1293 -1.1400876000000e+00\r\n1288 1293  3.3957556000000e+00\r\n1289 1293 -5.0714144000000e-01\r\n1290 1293 -1.6766156000000e+00\r\n1291 1293 -1.9741111000000e+02\r\n1292 1293  2.9396479000000e+01\r\n1293 1293  1.3185199000000e+01\r\n1296 1293 -1.5801798000000e+00\r\n1339 1293  1.6344398000000e+01\r\n1340 1293 -2.4409657000000e+00\r\n1341 1293 -1.6483446000000e+00\r\n2397 1293 -3.8001718000000e+00\r\n190 1294 -2.4677947000000e-01\r\n192 1294 -3.1688925000000e-03\r\n1246 1294 -5.4284512000000e-01\r\n1248 1294 -9.6005376000000e-03\r\n1291 1294 -1.1892199000000e-01\r\n1293 1294 -1.3880454000000e-03\r\n1294 1294  1.6891509000000e+02\r\n1296 1294  2.2088858000000e-02\r\n1342 1294 -2.8875352000000e-01\r\n1344 1294 -1.3818955000000e-03\r\n2398 1294 -3.4495919000000e-01\r\n2400 1294 -6.1008077000000e-03\r\n190 1295  2.6224513000000e+00\r\n192 1295 -2.1342173000000e+00\r\n1248 1295 -7.0754460000000e-01\r\n1291 1295  1.5524766000000e+00\r\n1293 1295 -9.3479640000000e-01\r\n1294 1295 -1.0842997000000e+02\r\n1295 1295 -3.0770477000000e+01\r\n1296 1295  7.1518116000000e+00\r\n1342 1295  8.0561138000000e+00\r\n1344 1295 -9.3077878000000e-01\r\n2400 1295 -2.4410548000000e+00\r\n190 1296  4.4329917000000e+00\r\n191 1296 -6.7205137000000e-01\r\n192 1296 -3.6076809000000e+00\r\n1248 1296 -1.1960334000000e+00\r\n1291 1296  2.6243064000000e+00\r\n1292 1296 -3.9785068000000e-01\r\n1293 1296 -1.5801798000000e+00\r\n1294 1296 -1.8329003000000e+02\r\n1295 1296  2.7455917000000e+01\r\n1296 1296  1.2089422000000e+01\r\n1342 1296  1.3618055000000e+01\r\n1343 1296 -2.0645273000000e+00\r\n1344 1296 -1.5733884000000e+00\r\n2400 1296 -4.1263590000000e+00\r\n1297 1297  1.0000000000000e+00\r\n1298 1298  1.0000000000000e+00\r\n1299 1299  1.0000000000000e+00\r\n1300 1300  1.0000000000000e+00\r\n1301 1301  1.0000000000000e+00\r\n1302 1302  1.0000000000000e+00\r\n1303 1303  1.0000000000000e+00\r\n1304 1304  1.0000000000000e+00\r\n1305 1305  1.0000000000000e+00\r\n1306 1306  1.0000000000000e+00\r\n1307 1307  1.0000000000000e+00\r\n1308 1308  1.0000000000000e+00\r\n1309 1309  1.0000000000000e+00\r\n1310 1310  1.0000000000000e+00\r\n1311 1311  1.0000000000000e+00\r\n208 1312 -2.2967574000000e-01\r\n210 1312 -2.5591232000000e-03\r\n1264 1312 -9.7151014000000e-01\r\n1266 1312 -1.7181733000000e-02\r\n1312 1312  2.7223071000000e+02\r\n1314 1312  3.2932197000000e-02\r\n1315 1312 -1.7210740000000e-01\r\n1317 1312 -2.8294990000000e-03\r\n1360 1312 -5.3250509000000e-01\r\n1362 1312 -2.8194601000000e-03\r\n2416 1312 -3.8467931000000e-01\r\n2418 1312 -6.8032816000000e-03\r\n208 1313  3.2697759000000e+00\r\n210 1313 -1.2998960000000e+00\r\n1266 1313 -1.1435802000000e+00\r\n1312 1313 -1.7317694000000e+02\r\n1313 1313 -4.9368972000000e+01\r\n1314 1313  6.7511947000000e+00\r\n1315 1313  4.9197405000000e-01\r\n1317 1313 -1.4371314000000e+00\r\n1360 1313  1.4275476000000e+01\r\n1362 1313 -1.4322317000000e+00\r\n2418 1313 -1.4328639000000e+00\r\n208 1314  5.5272291000000e+00\r\n209 1314 -8.2353642000000e-01\r\n210 1314 -2.1973442000000e+00\r\n1266 1314 -1.9331079000000e+00\r\n1312 1314 -2.9273829000000e+02\r\n1313 1314  4.3512859000000e+01\r\n1314 1314  1.1412219000000e+01\r\n1315 1314  8.3163294000000e-01\r\n1316 1314 -1.2391019000000e-01\r\n1317 1314 -2.4293269000000e+00\r\n1360 1314  2.4131264000000e+01\r\n1361 1314 -3.5954678000000e+00\r\n1362 1314 -2.4210445000000e+00\r\n2418 1314 -2.4221131000000e+00\r\n211 1315 -2.4668124000000e-01\r\n213 1315 -2.8842481000000e-03\r\n1267 1315 -2.3246153000000e+00\r\n1269 1315 -4.1112199000000e-02\r\n1312 1315 -1.5998893000000e-01\r\n1314 1315 -2.8294990000000e-03\r\n1315 1315  2.7395310000000e+02\r\n1317 1315  6.3605256000000e-02\r\n1318 1315 -1.8438923000000e-01\r\n1320 1315 -3.1910365000000e-03\r\n1363 1315 -5.5027657000000e-01\r\n1365 1315 -3.1808633000000e-03\r\n2419 1315 -5.4619795000000e-01\r\n2421 1315 -9.6598344000000e-03\r\n211 1316  3.1960331000000e+00\r\n213 1316 -1.2865738000000e+00\r\n1269 1316 -9.1950682000000e-01\r\n1314 1316 -1.4371314000000e+00\r\n1315 1316 -1.7264244000000e+02\r\n1316 1316 -4.9216982000000e+01\r\n1317 1316  7.8573807000000e+00\r\n1318 1316  1.6264263000000e-01\r\n1320 1316 -1.4233134000000e+00\r\n1363 1316  1.4143033000000e+01\r\n1365 1316 -1.4189740000000e+00\r\n2421 1316 -1.3664069000000e+00\r\n211 1317  5.4025700000000e+00\r\n212 1317 -7.9723475000000e-01\r\n213 1317 -2.1748226000000e+00\r\n1269 1317 -1.5543334000000e+00\r\n1314 1317 -2.4293269000000e+00\r\n1315 1317 -2.9183455000000e+02\r\n1316 1317  4.3218287000000e+01\r\n1317 1317  1.3282108000000e+01\r\n1318 1317  2.7493090000000e-01\r\n1319 1317 -4.0570407000000e-02\r\n1320 1317 -2.4059670000000e+00\r\n1363 1317  2.3907365000000e+01\r\n1364 1317 -3.5279108000000e+00\r\n1365 1317 -2.3986317000000e+00\r\n2421 1317 -2.3097726000000e+00\r\n214 1318 -2.8443899000000e-01\r\n216 1318 -3.5153406000000e-03\r\n1270 1318 -2.8637324000000e+00\r\n1272 1318 -5.0646805000000e-02\r\n1315 1318 -1.8043142000000e-01\r\n1317 1318 -3.1910365000000e-03\r\n1318 1318  2.7481093000000e+02\r\n1320 1318  7.8662068000000e-02\r\n1321 1318 -2.4138800000000e-01\r\n1323 1318 -4.2690898000000e-03\r\n1366 1318 -5.9699022000000e-01\r\n1368 1318 -3.8802399000000e-03\r\n2422 1318 -7.0088362000000e-01\r\n2424 1318 -1.2395542000000e-02\r\n214 1319  3.2664290000000e+00\r\n216 1319 -1.2614183000000e+00\r\n1272 1319 -8.5583973000000e-01\r\n1317 1319 -1.4233134000000e+00\r\n1318 1319 -1.7281288000000e+02\r\n1319 1319 -4.8921717000000e+01\r\n1320 1319  7.6431732000000e+00\r\n1323 1319 -1.3833851000000e+00\r\n1366 1319  1.4403206000000e+01\r\n1368 1319 -1.3924364000000e+00\r\n2424 1319 -1.3213394000000e+00\r\n214 1320  5.5215716000000e+00\r\n215 1320 -7.9947677000000e-01\r\n216 1320 -2.1323014000000e+00\r\n1272 1320 -1.4467115000000e+00\r\n1317 1320 -2.4059670000000e+00\r\n1318 1320 -2.9212289000000e+02\r\n1319 1320  4.2950807000000e+01\r\n1320 1320  1.2920016000000e+01\r\n1323 1320 -2.3384726000000e+00\r\n1366 1320  2.4347179000000e+01\r\n1367 1320 -3.5252652000000e+00\r\n1368 1320 -2.3537745000000e+00\r\n2424 1320 -2.2335922000000e+00\r\n217 1321 -2.6456607000000e-01\r\n219 1321 -3.8554926000000e-03\r\n1273 1321 -1.7286792000000e+00\r\n1275 1321 -5.0655485000000e-02\r\n1318 1321 -1.5451154000000e-01\r\n1320 1321 -4.2690898000000e-03\r\n1321 1321  2.7349579000000e+02\r\n1323 1321  8.2507420000000e-02\r\n1324 1321 -1.4526412000000e-01\r\n1326 1321 -4.2566742000000e-03\r\n1369 1321 -7.6581908000000e-01\r\n1371 1321 -4.2558043000000e-03\r\n2425 1321 -4.9287455000000e-01\r\n2427 1321 -1.4442702000000e-02\r\n217 1322  3.0876061000000e+00\r\n219 1322 -1.2494341000000e+00\r\n1275 1322 -8.5619956000000e-01\r\n1318 1322  2.4181193000000e-01\r\n1320 1322 -1.3833851000000e+00\r\n1321 1322 -1.7276544000000e+02\r\n1322 1322 -4.8774953000000e+01\r\n1323 1322  7.5456821000000e+00\r\n1326 1322 -1.3835616000000e+00\r\n1369 1322  1.4291331000000e+01\r\n1371 1322 -1.3792433000000e+00\r\n2427 1322 -1.2884342000000e+00\r\n217 1323  5.2192858000000e+00\r\n218 1323 -7.7639466000000e-01\r\n219 1323 -2.1120419000000e+00\r\n1275 1323 -1.4473186000000e+00\r\n1318 1323  4.0875861000000e-01\r\n1319 1323 -6.0804872000000e-02\r\n1320 1323 -2.3384726000000e+00\r\n1321 1323 -2.9204251000000e+02\r\n1322 1323  4.2945063000000e+01\r\n1323 1323  1.2755213000000e+01\r\n1326 1323 -2.3387725000000e+00\r\n1369 1323  2.4158050000000e+01\r\n1370 1323 -3.5936298000000e+00\r\n1371 1323 -2.3314713000000e+00\r\n2427 1323 -2.1779671000000e+00\r\n220 1324 -2.5348871000000e-01\r\n222 1324 -3.8426087000000e-03\r\n1276 1324 -1.3054890000000e+00\r\n1278 1324 -3.8254744000000e-02\r\n1321 1324 -1.7752046000000e-01\r\n1323 1324 -4.2566742000000e-03\r\n1324 1324  2.7306577000000e+02\r\n1326 1324  6.9051934000000e-02\r\n1327 1324 -1.1080353000000e-01\r\n1329 1324 -3.2468757000000e-03\r\n1372 1324 -7.8112229000000e-01\r\n1374 1324 -4.2450288000000e-03\r\n2428 1324 -4.9257780000000e-01\r\n2430 1324 -1.4434007000000e-02\r\n220 1325  2.8481953000000e+00\r\n222 1325 -1.2490543000000e+00\r\n1278 1325 -9.3002484000000e-01\r\n1321 1325  7.5067591000000e-01\r\n1323 1325 -1.3835616000000e+00\r\n1324 1325 -1.7340412000000e+02\r\n1325 1325 -4.8777713000000e+01\r\n1326 1325  7.6252238000000e+00\r\n1329 1325 -1.3893338000000e+00\r\n1372 1325  1.4659879000000e+01\r\n1374 1325 -1.3799393000000e+00\r\n2430 1325 -1.2878855000000e+00\r\n220 1326  4.8145894000000e+00\r\n221 1326 -7.1633806000000e-01\r\n222 1326 -2.1114013000000e+00\r\n1278 1326 -1.5721140000000e+00\r\n1321 1326  1.2689425000000e+00\r\n1322 1326 -1.8879944000000e-01\r\n1323 1326 -2.3387725000000e+00\r\n1324 1326 -2.9312233000000e+02\r\n1325 1326  4.3110071000000e+01\r\n1326 1326  1.2889677000000e+01\r\n1329 1326 -2.3485284000000e+00\r\n1372 1326  2.4781060000000e+01\r\n1373 1326 -3.6870468000000e+00\r\n1374 1326 -2.3326495000000e+00\r\n2430 1326 -2.1770417000000e+00\r\n223 1327 -2.4545835000000e-01\r\n225 1327 -3.1193424000000e-03\r\n1279 1327 -1.4290341000000e+00\r\n1281 1327 -2.5273315000000e-02\r\n1324 1327 -2.1351350000000e-01\r\n1326 1327 -3.2468757000000e-03\r\n1327 1327  2.6218126000000e+02\r\n1329 1327  4.5701364000000e-02\r\n1330 1327 -1.0206592000000e-01\r\n1332 1327 -1.8050962000000e-03\r\n1375 1327 -5.7719046000000e-01\r\n1377 1327 -3.2392722000000e-03\r\n2431 1327 -4.6913868000000e-01\r\n2433 1327 -8.2969956000000e-03\r\n223 1328  2.6556692000000e+00\r\n225 1328 -1.3348595000000e+00\r\n1281 1328 -9.7381837000000e-01\r\n1324 1328  1.1211317000000e+00\r\n1326 1328 -1.3893338000000e+00\r\n1327 1328 -1.6777298000000e+02\r\n1328 1328 -4.7196986000000e+01\r\n1329 1328  7.9181472000000e+00\r\n1332 1328 -1.3662471000000e+00\r\n1375 1328  1.5059125000000e+01\r\n1377 1328 -1.3862673000000e+00\r\n2433 1328 -1.4623719000000e+00\r\n223 1329  4.4891401000000e+00\r\n224 1329 -6.6023896000000e-01\r\n225 1329 -2.2564449000000e+00\r\n1281 1329 -1.6461413000000e+00\r\n1324 1329  1.8951598000000e+00\r\n1325 1329 -2.7873005000000e-01\r\n1326 1329 -2.3485284000000e+00\r\n1327 1329 -2.8360325000000e+02\r\n1328 1329  4.1945986000000e+01\r\n1329 1329  1.3384829000000e+01\r\n1332 1329 -2.3095040000000e+00\r\n1375 1329  2.5455928000000e+01\r\n1376 1329 -3.7439226000000e+00\r\n1377 1329 -2.3433446000000e+00\r\n2433 1329 -2.4719924000000e+00\r\n226 1330 -1.6964017000000e-01\r\n228 1330 -1.9490968000000e-03\r\n1282 1330 -8.1361864000000e-01\r\n1284 1330 -1.4389328000000e-02\r\n1327 1330 -1.4452863000000e-01\r\n1329 1330 -1.8050962000000e-03\r\n1330 1330  2.4486254000000e+02\r\n1332 1330  2.6182592000000e-02\r\n1333 1330 -5.4021312000000e-02\r\n1335 1330 -9.5539891000000e-04\r\n1378 1330 -4.7203252000000e-01\r\n1380 1330 -1.7830369000000e-03\r\n2434 1330 -2.6316000000000e-01\r\n2436 1330 -4.6541406000000e-03\r\n226 1331  2.2969720000000e+00\r\n228 1331 -1.4753468000000e+00\r\n1284 1331 -1.0007156000000e+00\r\n1327 1331  1.6297685000000e+00\r\n1329 1331 -1.3662471000000e+00\r\n1330 1331 -1.5774793000000e+02\r\n1331 1331 -4.1064603000000e+01\r\n1332 1331  8.1507424000000e+00\r\n1335 1331 -1.2936026000000e+00\r\n1378 1331  1.4196280000000e+01\r\n1380 1331 -1.3497327000000e+00\r\n2436 1331 -1.6601180000000e+00\r\n226 1332  3.8828015000000e+00\r\n227 1332 -5.9213620000000e-01\r\n228 1332 -2.4939263000000e+00\r\n1284 1332 -1.6916096000000e+00\r\n1327 1332  2.7549606000000e+00\r\n1328 1332 -4.2013785000000e-01\r\n1329 1332 -2.3095040000000e+00\r\n1330 1332 -2.6665710000000e+02\r\n1331 1332  4.6264109000000e+01\r\n1332 1332  1.3778014000000e+01\r\n1335 1332 -2.1867046000000e+00\r\n1378 1332  2.3997392000000e+01\r\n1379 1332 -3.6596577000000e+00\r\n1380 1332 -2.2815881000000e+00\r\n2436 1332 -2.8062634000000e+00\r\n229 1333 -1.3642991000000e-01\r\n231 1333 -1.2270051000000e-03\r\n1285 1333 -5.7993932000000e-01\r\n1287 1333 -6.0525091000000e-03\r\n1330 1333 -1.1300694000000e-01\r\n1332 1333 -9.5539891000000e-04\r\n1333 1333  2.2278356000000e+02\r\n1335 1333  1.3701012000000e-02\r\n1336 1333 -5.3377101000000e-02\r\n1338 1333 -5.5706758000000e-04\r\n1381 1333 -2.2680976000000e-01\r\n1383 1333 -9.4287598000000e-04\r\n2437 1333 -3.2536038000000e-01\r\n2439 1333 -3.3956081000000e-03\r\n229 1334  1.8522376000000e+00\r\n231 1334 -1.6614562000000e+00\r\n1287 1334 -1.0404125000000e+00\r\n1330 1334  2.0830028000000e+00\r\n1332 1334 -1.2936026000000e+00\r\n1333 1334 -1.4455120000000e+02\r\n1334 1334 -4.1118626000000e+01\r\n1335 1334  8.3866352000000e+00\r\n1338 1334 -1.2207824000000e+00\r\n1381 1334  1.3404257000000e+01\r\n1383 1334 -1.2768153000000e+00\r\n2439 1334 -1.8889917000000e+00\r\n229 1335  3.1310206000000e+00\r\n230 1335 -4.7319693000000e-01\r\n231 1335 -2.8085241000000e+00\r\n1287 1335 -1.7587122000000e+00\r\n1330 1335  3.5211060000000e+00\r\n1331 1335 -5.3215124000000e-01\r\n1332 1335 -2.1867046000000e+00\r\n1333 1335 -2.4434921000000e+02\r\n1334 1335  3.6879671000000e+01\r\n1335 1335  1.4176761000000e+01\r\n1338 1335 -2.0636106000000e+00\r\n1381 1335  2.2658544000000e+01\r\n1382 1335 -3.4244273000000e+00\r\n1383 1335 -2.1583274000000e+00\r\n2439 1335 -3.1931494000000e+00\r\n232 1336 -9.4691775000000e-02\r\n234 1336 -8.3846689000000e-04\r\n1288 1336 -2.6622936000000e-01\r\n1290 1336 -2.7784901000000e-03\r\n1333 1336 -7.9317551000000e-02\r\n1335 1336 -5.5706758000000e-04\r\n1336 1336  2.0593401000000e+02\r\n1338 1336  7.1190537000000e-03\r\n1339 1336 -3.2430064000000e-02\r\n1341 1336 -3.3845482000000e-04\r\n1384 1336 -1.6328562000000e-01\r\n1386 1336 -5.4926603000000e-04\r\n2440 1336 -1.4818824000000e-01\r\n2442 1336 -1.5465596000000e-03\r\n232 1337  1.4134890000000e+00\r\n234 1337 -1.8375694000000e+00\r\n1290 1337 -1.0323390000000e+00\r\n1333 1337  2.5500288000000e+00\r\n1335 1337 -1.2207824000000e+00\r\n1336 1337 -1.3389236000000e+02\r\n1337 1337 -3.8434575000000e+01\r\n1338 1337  8.5689023000000e+00\r\n1341 1337 -1.1452500000000e+00\r\n1384 1337  1.2028529000000e+01\r\n1386 1337 -1.2038403000000e+00\r\n2442 1337 -2.1248446000000e+00\r\n232 1338  2.3893618000000e+00\r\n233 1338 -3.7068624000000e-01\r\n234 1338 -3.1062273000000e+00\r\n1290 1338 -1.7450659000000e+00\r\n1333 1338  4.3105686000000e+00\r\n1334 1338 -6.6874278000000e-01\r\n1335 1338 -2.0636106000000e+00\r\n1336 1338 -2.2633164000000e+02\r\n1337 1338  3.4516930000000e+01\r\n1338 1338  1.4484871000000e+01\r\n1341 1338 -1.9359292000000e+00\r\n1384 1338  2.0333025000000e+01\r\n1385 1338 -3.1544711000000e+00\r\n1386 1338 -2.0349717000000e+00\r\n2442 1338 -3.5918374000000e+00\r\n235 1339 -5.9815559000000e-02\r\n237 1339 -5.9869776000000e-04\r\n1291 1339 -1.7780986000000e-01\r\n1293 1339 -1.8557042000000e-03\r\n1336 1339 -6.1814214000000e-02\r\n1338 1339 -3.3845482000000e-04\r\n1339 1339  1.8949353000000e+02\r\n1341 1339  4.9610741000000e-03\r\n1342 1339 -1.0790809000000e-02\r\n1344 1339 -1.1261776000000e-04\r\n1387 1339 -1.0917736000000e-01\r\n1389 1339 -3.3334856000000e-04\r\n2443 1339 -1.2089323000000e-01\r\n2445 1339 -1.2616964000000e-03\r\n235 1340  1.1849396000000e+00\r\n237 1340 -2.0259409000000e+00\r\n1293 1340 -9.7512180000000e-01\r\n1336 1340  2.8854936000000e+00\r\n1338 1340 -1.1452500000000e+00\r\n1339 1340 -1.2295136000000e+02\r\n1340 1340 -3.5577035000000e+01\r\n1341 1340  8.7141966000000e+00\r\n1344 1340 -1.0875644000000e+00\r\n1387 1340  1.0289212000000e+01\r\n1389 1340 -1.1280965000000e+00\r\n2445 1340 -2.3482642000000e+00\r\n235 1341  2.0030206000000e+00\r\n236 1341 -3.1551711000000e-01\r\n237 1341 -3.4246482000000e+00\r\n1293 1341 -1.6483446000000e+00\r\n1336 1341  4.8776351000000e+00\r\n1337 1341 -7.6832827000000e-01\r\n1338 1341 -1.9359292000000e+00\r\n1339 1341 -2.0783683000000e+02\r\n1340 1341  3.1890305000000e+01\r\n1341 1341  1.4730469000000e+01\r\n1344 1341 -1.8384188000000e+00\r\n1387 1341  1.7392873000000e+01\r\n1388 1341 -2.7397367000000e+00\r\n1389 1341 -1.9069330000000e+00\r\n2445 1341 -3.9695031000000e+00\r\n238 1342 -1.0052266000000e-03\r\n240 1342 -1.0490999000000e-05\r\n1294 1342 -1.3241047000000e-01\r\n1296 1342 -1.3818955000000e-03\r\n1339 1342 -3.9817283000000e-02\r\n1341 1342 -1.1261776000000e-04\r\n1342 1342  1.7843031000000e+02\r\n1344 1342  2.8591254000000e-03\r\n1390 1342 -2.3448881000000e-02\r\n1392 1342 -1.1074615000000e-04\r\n2446 1342 -7.8631371000000e-02\r\n2448 1342 -8.2063256000000e-04\r\n238 1343  1.0530149000000e+00\r\n240 1343 -2.1889664000000e+00\r\n1296 1343 -9.3077878000000e-01\r\n1339 1343  2.8496034000000e+00\r\n1341 1343 -1.0875644000000e+00\r\n1342 1343 -1.1210207000000e+02\r\n1343 1343 -3.3750151000000e+01\r\n1344 1343  7.8225303000000e+00\r\n1390 1343  5.8141667000000e+00\r\n1392 1343 -1.0695946000000e+00\r\n2448 1343 -2.5418704000000e+00\r\n238 1344  1.7800163000000e+00\r\n239 1344 -2.8562166000000e-01\r\n240 1344 -3.7002288000000e+00\r\n1296 1344 -1.5733884000000e+00\r\n1339 1344  4.8169695000000e+00\r\n1340 1344 -7.7293156000000e-01\r\n1341 1344 -1.8384188000000e+00\r\n1342 1344 -1.8949733000000e+02\r\n1343 1344  2.9257887000000e+01\r\n1344 1344  1.3223205000000e+01\r\n1390 1344  9.8282675000000e+00\r\n1391 1344 -1.5770451000000e+00\r\n1392 1344 -1.8080426000000e+00\r\n2448 1344 -4.2967777000000e+00\r\n1345 1345  1.0000000000000e+00\r\n1346 1346  1.0000000000000e+00\r\n1347 1347  1.0000000000000e+00\r\n1348 1348  1.0000000000000e+00\r\n1349 1349  1.0000000000000e+00\r\n1350 1350  1.0000000000000e+00\r\n1351 1351  1.0000000000000e+00\r\n1352 1352  1.0000000000000e+00\r\n1353 1353  1.0000000000000e+00\r\n1354 1354  1.0000000000000e+00\r\n1355 1355  1.0000000000000e+00\r\n1356 1356  1.0000000000000e+00\r\n1357 1357  1.0000000000000e+00\r\n1358 1358  1.0000000000000e+00\r\n1359 1359  1.0000000000000e+00\r\n256 1360 -7.2977776000000e-04\r\n258 1360 -7.6162909000000e-06\r\n1312 1360 -2.7015503000000e-01\r\n1314 1360 -2.8194601000000e-03\r\n1360 1360  2.7046663000000e+02\r\n1362 1360  5.1151597000000e-03\r\n1363 1360 -3.7651590000000e-02\r\n1365 1360 -3.5388657000000e-04\r\n1408 1360 -1.5377477000000e-01\r\n1410 1360 -3.5321712000000e-04\r\n2464 1360 -8.9063470000000e-02\r\n2466 1360 -9.2950667000000e-04\r\n256 1361  1.6788203000000e+00\r\n258 1361 -1.4261365000000e+00\r\n1314 1361 -1.4322317000000e+00\r\n1360 1361 -1.7189519000000e+02\r\n1361 1361 -4.6745499000000e+01\r\n1362 1361  7.6639625000000e+00\r\n1363 1361  3.6624285000000e-01\r\n1365 1361 -1.5827589000000e+00\r\n1408 1361  1.4741648000000e+01\r\n1410 1361 -1.5799292000000e+00\r\n2466 1361 -1.6372305000000e+00\r\n256 1362  2.8378778000000e+00\r\n257 1362 -4.5011231000000e-01\r\n258 1362 -2.4107412000000e+00\r\n1314 1362 -2.4210445000000e+00\r\n1360 1362 -2.9057162000000e+02\r\n1361 1362  5.1757860000000e+01\r\n1362 1362  1.2955162000000e+01\r\n1363 1362  6.1909691000000e-01\r\n1364 1362 -9.8194198000000e-02\r\n1365 1362 -2.6754957000000e+00\r\n1408 1362  2.4919282000000e+01\r\n1409 1362 -3.9524166000000e+00\r\n1410 1362 -2.6707124000000e+00\r\n2466 1362 -2.7675744000000e+00\r\n259 1363 -7.3412139000000e-04\r\n261 1363 -7.6616229000000e-06\r\n1315 1363 -3.0478396000000e-01\r\n1317 1363 -3.1808633000000e-03\r\n1360 1363 -3.3908703000000e-02\r\n1362 1363 -3.5388657000000e-04\r\n1363 1363  2.7060496000000e+02\r\n1365 1363  6.3467067000000e-03\r\n1366 1363 -5.4179127000000e-02\r\n1368 1363 -5.1886286000000e-04\r\n1411 1363 -1.8816192000000e-01\r\n1413 1363 -5.1772590000000e-04\r\n2467 1363 -1.0603352000000e-01\r\n2469 1363 -1.1066138000000e-03\r\n259 1364  1.7171980000000e+00\r\n261 1364 -1.4116883000000e+00\r\n1317 1364 -1.4189740000000e+00\r\n1362 1364 -1.5827589000000e+00\r\n1363 1364 -1.7228586000000e+02\r\n1364 1364 -5.0782874000000e+01\r\n1365 1364  9.1689950000000e+00\r\n1366 1364  4.3654628000000e-01\r\n1368 1364 -1.5665785000000e+00\r\n1411 1364  1.5021144000000e+01\r\n1413 1364 -1.5633187000000e+00\r\n2469 1364 -1.6200209000000e+00\r\n259 1365  2.9027491000000e+00\r\n260 1365 -4.5568920000000e-01\r\n261 1365 -2.3863159000000e+00\r\n1317 1365 -2.3986317000000e+00\r\n1362 1365 -2.6754957000000e+00\r\n1363 1365 -2.9123177000000e+02\r\n1364 1365  4.4566443000000e+01\r\n1365 1365  1.5499259000000e+01\r\n1366 1365  7.3793721000000e-01\r\n1367 1365 -1.1584536000000e-01\r\n1368 1365 -2.6481421000000e+00\r\n1411 1365  2.5391720000000e+01\r\n1412 1365 -3.9861297000000e+00\r\n1413 1365 -2.6426316000000e+00\r\n2469 1365 -2.7384818000000e+00\r\n262 1366 -8.3648948000000e-02\r\n264 1366 -6.9066782000000e-04\r\n1318 1366 -3.7179683000000e-01\r\n1320 1366 -3.8802399000000e-03\r\n1363 1366 -4.9716401000000e-02\r\n1365 1366 -5.1886286000000e-04\r\n1366 1366  2.7088887000000e+02\r\n1368 1366  8.9254441000000e-03\r\n1369 1366 -7.5229391000000e-02\r\n1371 1366 -7.6641004000000e-04\r\n1414 1366 -2.3217630000000e-01\r\n1416 1366 -7.6427333000000e-04\r\n2470 1366 -1.5613218000000e-01\r\n2472 1366 -1.6294661000000e-03\r\n262 1367  1.7659413000000e+00\r\n264 1367 -1.3900576000000e+00\r\n1320 1367 -1.3924364000000e+00\r\n1365 1367 -1.5665785000000e+00\r\n1366 1367 -1.7267578000000e+02\r\n1367 1367 -5.0522390000000e+01\r\n1368 1367  9.0250451000000e+00\r\n1369 1367  1.7603575000000e-01\r\n1371 1367 -1.5423978000000e+00\r\n1414 1367  1.5619168000000e+01\r\n1416 1367 -1.5382633000000e+00\r\n2472 1367 -1.5896856000000e+00\r\n262 1368  2.9851472000000e+00\r\n263 1368 -4.6135374000000e-01\r\n264 1368 -2.3497534000000e+00\r\n1320 1368 -2.3537745000000e+00\r\n1365 1368 -2.6481421000000e+00\r\n1366 1368 -2.9189114000000e+02\r\n1367 1368  4.4401261000000e+01\r\n1368 1368  1.5255934000000e+01\r\n1369 1368  2.9757084000000e-01\r\n1370 1368 -4.5989498000000e-02\r\n1371 1368 -2.6072693000000e+00\r\n1414 1368  2.6402642000000e+01\r\n1415 1368 -4.0805217000000e+00\r\n1416 1368 -2.6002803000000e+00\r\n2472 1368 -2.6872046000000e+00\r\n265 1369 -9.0841256000000e-02\r\n267 1369 -7.6505808000000e-04\r\n1321 1369 -4.0778265000000e-01\r\n1323 1369 -4.2558043000000e-03\r\n1366 1369 -7.3435877000000e-02\r\n1368 1369 -7.6641004000000e-04\r\n1369 1369  2.7102069000000e+02\r\n1371 1369  1.0247861000000e-02\r\n1372 1369 -8.9236815000000e-02\r\n1374 1369 -9.3131578000000e-04\r\n1417 1369 -2.4653057000000e-01\r\n1419 1369 -8.4683365000000e-04\r\n2473 1369 -1.9183742000000e-01\r\n2475 1369 -2.0021021000000e-03\r\n265 1370  1.7265057000000e+00\r\n267 1370 -1.3827379000000e+00\r\n1323 1370 -1.3792433000000e+00\r\n1368 1370 -1.5423978000000e+00\r\n1369 1370 -1.7309385000000e+02\r\n1370 1370 -5.0435532000000e+01\r\n1371 1370  8.9420690000000e+00\r\n1374 1370 -1.5260234000000e+00\r\n1417 1370  1.6251500000000e+01\r\n1419 1370 -1.5306042000000e+00\r\n2475 1370 -1.5754464000000e+00\r\n265 1371  2.9184835000000e+00\r\n266 1371 -4.4868031000000e-01\r\n267 1371 -2.3373788000000e+00\r\n1323 1371 -2.3314713000000e+00\r\n1368 1371 -2.6072693000000e+00\r\n1369 1371 -2.9259767000000e+02\r\n1370 1371  4.4420332000000e+01\r\n1371 1371  1.5115667000000e+01\r\n1374 1371 -2.5795900000000e+00\r\n1417 1371  2.7471520000000e+01\r\n1418 1371 -4.2234023000000e+00\r\n1419 1371 -2.5873318000000e+00\r\n2475 1371 -2.6631324000000e+00\r\n268 1372 -9.6814191000000e-02\r\n270 1372 -8.3952900000000e-04\r\n1324 1372 -4.0675017000000e-01\r\n1326 1372 -4.2450288000000e-03\r\n1369 1372 -9.3438877000000e-02\r\n1371 1372 -9.3131578000000e-04\r\n1372 1372  2.7107150000000e+02\r\n1374 1372  1.0687625000000e-02\r\n1375 1372 -6.5512219000000e-02\r\n1377 1372 -6.8371516000000e-04\r\n1420 1372 -2.5906107000000e-01\r\n1422 1372 -9.2907918000000e-04\r\n2476 1372 -2.2745387000000e-01\r\n2478 1372 -2.3738115000000e-03\r\n268 1373  1.6122468000000e+00\r\n270 1373 -1.3756968000000e+00\r\n1326 1373 -1.3799393000000e+00\r\n1369 1373  4.1368427000000e-01\r\n1371 1373 -1.5260234000000e+00\r\n1372 1373 -1.7385172000000e+02\r\n1373 1373 -5.0348460000000e+01\r\n1374 1373  8.9215598000000e+00\r\n1377 1373 -1.5502175000000e+00\r\n1420 1373  1.6708277000000e+01\r\n1422 1373 -1.5225090000000e+00\r\n2478 1373 -1.5615681000000e+00\r\n268 1374  2.7253420000000e+00\r\n269 1374 -4.1677580000000e-01\r\n270 1374 -2.3254778000000e+00\r\n1326 1374 -2.3326495000000e+00\r\n1369 1374  6.9929187000000e-01\r\n1370 1374 -1.0693995000000e-01\r\n1371 1374 -2.5795900000000e+00\r\n1372 1374 -2.9387895000000e+02\r\n1373 1374  4.4526891000000e+01\r\n1374 1374  1.5081003000000e+01\r\n1377 1374 -2.6204856000000e+00\r\n1420 1374  2.8243671000000e+01\r\n1421 1374 -4.3191932000000e+00\r\n1422 1374 -2.5736492000000e+00\r\n2478 1374 -2.6396747000000e+00\r\n271 1375 -6.5999328000000e-02\r\n273 1375 -6.1583367000000e-04\r\n1327 1375 -3.1038059000000e-01\r\n1329 1375 -3.2392722000000e-03\r\n1372 1375 -7.5844300000000e-02\r\n1374 1375 -6.8371516000000e-04\r\n1375 1375  2.7077148000000e+02\r\n1377 1375  7.6019344000000e-03\r\n1378 1375 -4.1026695000000e-02\r\n1380 1375 -4.2817315000000e-04\r\n1423 1375 -2.3560074000000e-01\r\n1425 1375 -6.8240063000000e-04\r\n2479 1375 -1.2282236000000e-01\r\n2481 1375 -1.2818297000000e-03\r\n271 1376  1.4359568000000e+00\r\n273 1376 -1.3964088000000e+00\r\n1329 1376 -1.3862673000000e+00\r\n1372 1376  1.0137104000000e+00\r\n1374 1376 -1.5502175000000e+00\r\n1375 1376 -1.7428890000000e+02\r\n1376 1376 -5.0608681000000e+01\r\n1377 1376  9.0132706000000e+00\r\n1380 1376 -1.5252253000000e+00\r\n1423 1376  1.6724953000000e+01\r\n1425 1376 -1.5474048000000e+00\r\n2481 1376 -1.6021115000000e+00\r\n271 1377  2.4273393000000e+00\r\n272 1377 -3.7711731000000e-01\r\n273 1377 -2.3604874000000e+00\r\n1329 1377 -2.3433446000000e+00\r\n1372 1377  1.7135748000000e+00\r\n1373 1377 -2.6622512000000e-01\r\n1374 1377 -2.6204856000000e+00\r\n1375 1377 -2.9461773000000e+02\r\n1376 1377  4.4916084000000e+01\r\n1377 1377  1.5236023000000e+01\r\n1380 1377 -2.5782408000000e+00\r\n1423 1377  2.8271838000000e+01\r\n1424 1377 -4.3923811000000e+00\r\n1425 1377 -2.6157309000000e+00\r\n2481 1377 -2.7082075000000e+00\r\n274 1378 -7.7207549000000e-04\r\n276 1378 -8.0577291000000e-06\r\n1330 1378 -1.7084703000000e-01\r\n1332 1378 -1.7830369000000e-03\r\n1375 1378 -5.8311841000000e-02\r\n1377 1378 -4.2817315000000e-04\r\n1378 1378  2.5425503000000e+02\r\n1380 1378  4.4242257000000e-03\r\n1381 1378 -1.0246567000000e-02\r\n1383 1378 -1.0693781000000e-04\r\n1426 1378 -1.9127099000000e-01\r\n1428 1378 -4.2747906000000e-04\r\n2482 1378 -1.0092811000000e-01\r\n2484 1378 -1.0533314000000e-03\r\n274 1379  1.2813488000000e+00\r\n276 1379 -1.5089297000000e+00\r\n1332 1379 -1.3497327000000e+00\r\n1375 1379  1.6975120000000e+00\r\n1377 1379 -1.5252253000000e+00\r\n1378 1379 -1.6491776000000e+02\r\n1379 1379 -4.7810756000000e+01\r\n1380 1379  9.1070254000000e+00\r\n1383 1379 -1.4596526000000e+00\r\n1426 1379  1.6134038000000e+01\r\n1428 1379 -1.5229139000000e+00\r\n2484 1379 -1.7352467000000e+00\r\n274 1380  2.1659920000000e+00\r\n275 1380 -3.4166937000000e-01\r\n276 1380 -2.5506948000000e+00\r\n1332 1380 -2.2815881000000e+00\r\n1375 1380  2.8694743000000e+00\r\n1376 1380 -4.5263855000000e-01\r\n1377 1380 -2.5782408000000e+00\r\n1378 1380 -2.7877699000000e+02\r\n1379 1380  4.2765198000000e+01\r\n1380 1380  1.5394514000000e+01\r\n1383 1380 -2.4673954000000e+00\r\n1426 1380  2.7272978000000e+01\r\n1427 1380 -4.3021124000000e+00\r\n1428 1380 -2.5743337000000e+00\r\n2484 1380 -2.9332610000000e+00\r\n277 1381 -8.1186756000000e-04\r\n279 1381 -8.4730171000000e-06\r\n1333 1381 -9.0344491000000e-02\r\n1335 1381 -9.4287598000000e-04\r\n1378 1381 -3.4337972000000e-02\r\n1380 1381 -1.0693781000000e-04\r\n1381 1381  2.3782966000000e+02\r\n1383 1381  2.4260529000000e-03\r\n1384 1381 -6.5885284000000e-04\r\n1386 1381 -6.8760863000000e-06\r\n1429 1381 -1.1179913000000e-01\r\n1431 1381 -1.0565836000000e-04\r\n2485 1381 -6.6503128000000e-02\r\n2487 1381 -6.9405673000000e-04\r\n277 1382  1.0325500000000e+00\r\n279 1382 -1.6449913000000e+00\r\n1335 1382 -1.2768153000000e+00\r\n1378 1382  2.3644677000000e+00\r\n1380 1382 -1.4596526000000e+00\r\n1381 1382 -1.5480489000000e+02\r\n1382 1382 -4.5058371000000e+01\r\n1383 1382  9.0804599000000e+00\r\n1386 1382 -1.3549230000000e+00\r\n1429 1382  1.4912651000000e+01\r\n1431 1382 -1.4423564000000e+00\r\n2487 1382 -1.8967026000000e+00\r\n277 1383  1.7454215000000e+00\r\n278 1383 -2.8089742000000e-01\r\n279 1383 -2.7806916000000e+00\r\n1335 1383 -2.1583274000000e+00\r\n1378 1383  3.9968939000000e+00\r\n1379 1383 -6.4323556000000e-01\r\n1380 1383 -2.4673954000000e+00\r\n1381 1383 -2.6168204000000e+02\r\n1382 1383  4.0473282000000e+01\r\n1383 1383  1.5349602000000e+01\r\n1386 1383 -2.2903617000000e+00\r\n1429 1383  2.5208332000000e+01\r\n1430 1383 -4.0568740000000e+00\r\n1431 1383 -2.4381578000000e+00\r\n2487 1383 -3.2061840000000e+00\r\n280 1384 -8.7710119000000e-04\r\n282 1384 -9.1538248000000e-06\r\n1336 1384 -5.2629573000000e-02\r\n1338 1384 -5.4926603000000e-04\r\n1381 1384 -4.4043340000000e-02\r\n1383 1384 -6.8760863000000e-06\r\n1384 1384  2.1612747000000e+02\r\n1386 1384  1.0941948000000e-03\r\n1387 1384 -5.9104318000000e-04\r\n1389 1384 -6.1683940000000e-06\r\n1432 1384 -8.2149322000000e-02\r\n1434 1384 -6.7098090000000e-06\r\n2488 1384 -1.6242420000000e-02\r\n2490 1384 -1.0967924000000e-05\r\n280 1385  8.3364392000000e-01\r\n282 1385 -1.8224369000000e+00\r\n1338 1385 -1.2038403000000e+00\r\n1381 1385  3.0148106000000e+00\r\n1383 1385 -1.3549230000000e+00\r\n1384 1385 -1.4190275000000e+02\r\n1385 1385 -4.1054366000000e+01\r\n1386 1385  9.0787282000000e+00\r\n1389 1385 -1.2428850000000e+00\r\n1432 1385  1.3969117000000e+01\r\n1434 1385 -1.3223121000000e+00\r\n2490 1385 -2.1277579000000e+00\r\n280 1386  1.4091917000000e+00\r\n281 1386 -2.2830455000000e-01\r\n282 1386 -3.0806474000000e+00\r\n1338 1386 -2.0349717000000e+00\r\n1381 1386  5.0962357000000e+00\r\n1382 1386 -8.2564623000000e-01\r\n1383 1386 -2.2903617000000e+00\r\n1384 1386 -2.3987241000000e+02\r\n1385 1386  3.7214192000000e+01\r\n1386 1386  1.5346681000000e+01\r\n1389 1386 -2.1009714000000e+00\r\n1432 1386  2.3613395000000e+01\r\n1433 1386 -3.8256296000000e+00\r\n1434 1386 -2.2352363000000e+00\r\n2490 1386 -3.5967619000000e+00\r\n283 1387 -9.3215578000000e-04\r\n285 1387 -9.7283995000000e-06\r\n1339 1387 -3.1940792000000e-02\r\n1341 1387 -3.3334856000000e-04\r\n1384 1387 -5.8247628000000e-02\r\n1386 1387 -6.1683940000000e-06\r\n1387 1387  1.9996790000000e+02\r\n1389 1387  8.3949727000000e-04\r\n1390 1387 -5.2533485000000e-04\r\n1392 1387 -5.4826322000000e-06\r\n1435 1387 -9.0193798000000e-02\r\n1437 1387 -6.0039162000000e-06\r\n2491 1387 -5.0112401000000e-02\r\n2493 1387 -1.1599637000000e-05\r\n283 1388  7.2120326000000e-01\r\n285 1388 -1.9705921000000e+00\r\n1341 1388 -1.1280965000000e+00\r\n1384 1388  3.9142685000000e+00\r\n1386 1388 -1.2428850000000e+00\r\n1387 1388 -1.3385425000000e+02\r\n1388 1388 -3.7975522000000e+01\r\n1389 1388  9.0385088000000e+00\r\n1392 1388 -1.1456522000000e+00\r\n1435 1388  1.4440091000000e+01\r\n1437 1388 -1.2098873000000e+00\r\n2493 1388 -2.3371655000000e+00\r\n283 1389  1.2191212000000e+00\r\n284 1389 -1.9751333000000e-01\r\n285 1389 -3.3310866000000e+00\r\n1341 1389 -1.9069330000000e+00\r\n1384 1389  6.6166751000000e+00\r\n1385 1389 -1.0719866000000e+00\r\n1386 1389 -2.1009714000000e+00\r\n1387 1389 -2.2626707000000e+02\r\n1388 1389  3.5133565000000e+01\r\n1389 1389  1.5278686000000e+01\r\n1392 1389 -1.9366105000000e+00\r\n1435 1389  2.4409514000000e+01\r\n1436 1389 -3.9546552000000e+00\r\n1437 1389 -2.0451922000000e+00\r\n2493 1389 -3.9507414000000e+00\r\n286 1390 -9.8487380000000e-04\r\n288 1390 -1.0278589000000e-05\r\n1342 1390 -1.0611475000000e-02\r\n1344 1390 -1.1074615000000e-04\r\n1387 1390 -9.3439445000000e-02\r\n1389 1390 -5.4826322000000e-06\r\n1390 1390  1.8369762000000e+02\r\n1392 1390  5.6796279000000e-04\r\n2494 1390 -5.0293461000000e-02\r\n2496 1390 -1.2178326000000e-05\r\n286 1391  7.1032899000000e-01\r\n288 1391 -2.1455762000000e+00\r\n1344 1391 -1.0695946000000e+00\r\n1387 1391  6.9641265000000e+00\r\n1389 1391 -1.1456522000000e+00\r\n1390 1391 -1.1314811000000e+02\r\n1391 1391 -3.4895594000000e+01\r\n1392 1391  6.9094057000000e+00\r\n2496 1391 -2.5446960000000e+00\r\n286 1392  1.2007401000000e+00\r\n287 1392 -1.9453863000000e-01\r\n288 1392 -3.6268820000000e+00\r\n1344 1392 -1.8080426000000e+00\r\n1387 1392  1.1772159000000e+01\r\n1388 1392 -1.9072734000000e+00\r\n1389 1392 -1.9366105000000e+00\r\n1390 1392 -1.9126556000000e+02\r\n1391 1392  2.9589117000000e+01\r\n1392 1392  1.1679659000000e+01\r\n2496 1392 -4.3015541000000e+00\r\n1393 1393  1.0000000000000e+00\r\n1394 1394  1.0000000000000e+00\r\n1395 1395  1.0000000000000e+00\r\n1396 1396  1.0000000000000e+00\r\n1397 1397  1.0000000000000e+00\r\n1398 1398  1.0000000000000e+00\r\n1399 1399  1.0000000000000e+00\r\n1400 1400  1.0000000000000e+00\r\n1401 1401  1.0000000000000e+00\r\n1402 1402  1.0000000000000e+00\r\n1403 1403  1.0000000000000e+00\r\n1404 1404  1.0000000000000e+00\r\n1405 1405  1.0000000000000e+00\r\n1406 1406  1.0000000000000e+00\r\n1407 1407  1.0000000000000e+00\r\n304 1408 -7.4924889000000e-04\r\n306 1408 -7.8195004000000e-06\r\n1360 1408 -3.3844558000000e-02\r\n1362 1408 -3.5321712000000e-04\r\n1408 1408  2.7006466000000e+02\r\n1410 1408  1.0190183000000e-03\r\n1411 1408 -2.3272008000000e-02\r\n1413 1408 -8.6914551000000e-06\r\n1456 1408 -8.1983186000000e-02\r\n1458 1408 -8.6631152000000e-06\r\n2512 1408 -2.6950785000000e-02\r\n2514 1408 -9.2959444000000e-06\r\n304 1409  1.1331974000000e+00\r\n306 1409 -1.4582423000000e+00\r\n1362 1409 -1.5799292000000e+00\r\n1408 1409 -1.7259416000000e+02\r\n1409 1409 -4.7092408000000e+01\r\n1410 1409  7.9812487000000e+00\r\n1411 1409  6.5042611000000e-01\r\n1413 1409 -1.6170433000000e+00\r\n1456 1409  1.5723926000000e+01\r\n1458 1409 -1.6119602000000e+00\r\n2514 1409 -1.7083509000000e+00\r\n304 1410  1.9155568000000e+00\r\n305 1410 -3.1033210000000e-01\r\n306 1410 -2.4650128000000e+00\r\n1362 1410 -2.6707124000000e+00\r\n1408 1410 -2.9175317000000e+02\r\n1409 1410  5.2338123000000e+01\r\n1410 1410  1.3491503000000e+01\r\n1411 1410  1.0994803000000e+00\r\n1412 1410 -1.7812263000000e-01\r\n1413 1410 -2.7334499000000e+00\r\n1456 1410  2.6579724000000e+01\r\n1457 1410 -4.3060803000000e+00\r\n1458 1410 -2.7248575000000e+00\r\n2514 1410 -2.8877963000000e+00\r\n307 1411 -7.5103977000000e-04\r\n309 1411 -7.8381908000000e-06\r\n1363 1411 -4.9607460000000e-02\r\n1365 1411 -5.1772590000000e-04\r\n1408 1411 -8.3279784000000e-04\r\n1410 1411 -8.6914551000000e-06\r\n1411 1411  2.7006462000000e+02\r\n1413 1411  1.1924069000000e-03\r\n1414 1411 -2.5815780000000e-02\r\n1416 1411 -8.7442691000000e-06\r\n1459 1411 -7.8661667000000e-02\r\n1461 1411 -8.7145283000000e-06\r\n2515 1411 -9.3601400000000e-03\r\n2517 1411 -9.3569795000000e-06\r\n307 1412  1.1448642000000e+00\r\n309 1412 -1.4589760000000e+00\r\n1365 1412 -1.5633187000000e+00\r\n1410 1412 -1.6170433000000e+00\r\n1411 1412 -1.7344824000000e+02\r\n1412 1412 -5.1330777000000e+01\r\n1413 1412  9.5657797000000e+00\r\n1414 1412  1.0439707000000e+00\r\n1416 1412 -1.6170724000000e+00\r\n1459 1412  1.6170540000000e+01\r\n1461 1412 -1.6117717000000e+00\r\n2517 1412 -1.6918757000000e+00\r\n307 1413  1.9352772000000e+00\r\n308 1413 -3.1352611000000e-01\r\n309 1413 -2.4662515000000e+00\r\n1365 1413 -2.6426316000000e+00\r\n1410 1413 -2.7334499000000e+00\r\n1411 1413 -2.9319672000000e+02\r\n1412 1413  4.5408629000000e+01\r\n1413 1413  1.6169985000000e+01\r\n1414 1413  1.7647269000000e+00\r\n1415 1413 -2.8589598000000e-01\r\n1416 1413 -2.7334974000000e+00\r\n1459 1413  2.7334664000000e+01\r\n1460 1413 -4.4283740000000e+00\r\n1461 1413 -2.7245372000000e+00\r\n2517 1413 -2.8599448000000e+00\r\n310 1414 -7.5361219000000e-04\r\n312 1414 -7.8650378000000e-06\r\n1366 1414 -7.3231142000000e-02\r\n1368 1414 -7.6427333000000e-04\r\n1411 1414 -8.3785838000000e-04\r\n1413 1414 -8.7442691000000e-06\r\n1414 1414  2.7012596000000e+02\r\n1416 1414  2.0389723000000e-03\r\n1417 1414 -1.0518080000000e-02\r\n1419 1414 -2.4119375000000e-05\r\n1462 1414 -8.4096921000000e-02\r\n1464 1414 -2.4033219000000e-05\r\n2518 1414 -5.5354421000000e-02\r\n2520 1414 -5.7770378000000e-04\r\n310 1415  1.1600652000000e+00\r\n312 1415 -1.4583174000000e+00\r\n1368 1415 -1.5382633000000e+00\r\n1413 1415 -1.6170724000000e+00\r\n1414 1415 -1.7424625000000e+02\r\n1415 1415 -5.1313295000000e+01\r\n1416 1415  9.5203559000000e+00\r\n1417 1415  8.0556735000000e-01\r\n1419 1415 -1.6156055000000e+00\r\n1462 1415  1.7189845000000e+01\r\n1464 1415 -1.6100400000000e+00\r\n2520 1415 -1.6753377000000e+00\r\n310 1416  1.9609742000000e+00\r\n311 1416 -3.1739229000000e-01\r\n312 1416 -2.4651397000000e+00\r\n1368 1416 -2.6002803000000e+00\r\n1413 1416 -2.7334974000000e+00\r\n1414 1416 -2.9454586000000e+02\r\n1415 1416  4.5613128000000e+01\r\n1416 1416  1.6093208000000e+01\r\n1417 1416  1.3617310000000e+00\r\n1418 1416 -2.2040215000000e-01\r\n1419 1416 -2.7310196000000e+00\r\n1462 1416  2.9057715000000e+01\r\n1463 1416 -4.7031187000000e+00\r\n1464 1416 -2.7216116000000e+00\r\n2520 1416 -2.8319909000000e+00\r\n313 1417 -7.5594456000000e-04\r\n315 1417 -7.8893794000000e-06\r\n1369 1417 -8.1141907000000e-02\r\n1371 1417 -8.4683365000000e-04\r\n1414 1417 -2.3110703000000e-03\r\n1416 1417 -2.4119375000000e-05\r\n1417 1417  2.7017949000000e+02\r\n1419 1417  2.3944515000000e-03\r\n1420 1417 -1.0675461000000e-02\r\n1422 1417 -1.0662713000000e-04\r\n1465 1417 -1.1909565000000e-01\r\n1467 1417 -1.0624358000000e-04\r\n2521 1417 -6.3785526000000e-02\r\n2523 1417 -6.6569460000000e-04\r\n313 1418  1.1939511000000e+00\r\n315 1418 -1.4501622000000e+00\r\n1371 1418 -1.5306042000000e+00\r\n1416 1418 -1.6156055000000e+00\r\n1417 1418 -1.7463575000000e+02\r\n1418 1418 -5.1226801000000e+01\r\n1419 1418  9.4771723000000e+00\r\n1420 1418  4.4261743000000e-02\r\n1422 1418 -1.6074876000000e+00\r\n1465 1418  1.8305960000000e+01\r\n1467 1418 -1.6019100000000e+00\r\n2523 1418 -1.6656929000000e+00\r\n313 1419  2.0182535000000e+00\r\n314 1419 -3.2502469000000e-01\r\n315 1419 -2.4513525000000e+00\r\n1371 1419 -2.5873318000000e+00\r\n1416 1419 -2.7310196000000e+00\r\n1417 1419 -2.9520408000000e+02\r\n1418 1419  4.5626707000000e+01\r\n1419 1419  1.6020203000000e+01\r\n1420 1419  7.4820002000000e-02\r\n1421 1419 -1.2049203000000e-02\r\n1422 1419 -2.7172951000000e+00\r\n1465 1419  3.0944375000000e+01\r\n1466 1419 -4.9833605000000e+00\r\n1467 1419 -2.7078668000000e+00\r\n2523 1419 -2.8156854000000e+00\r\n316 1420 -7.5745833000000e-04\r\n318 1420 -7.9051779000000e-06\r\n1372 1420 -8.9022509000000e-02\r\n1374 1420 -9.2907918000000e-04\r\n1417 1420 -1.0216799000000e-02\r\n1419 1420 -1.0662713000000e-04\r\n1420 1420  2.7022719000000e+02\r\n1422 1420  2.7344592000000e-03\r\n1423 1420 -1.0210680000000e-02\r\n1425 1420 -1.0656327000000e-04\r\n1468 1420 -1.4191900000000e-01\r\n1470 1420 -1.8843431000000e-04\r\n2524 1420 -7.2246429000000e-02\r\n2526 1420 -7.5399642000000e-04\r\n316 1421  1.1859610000000e+00\r\n318 1421 -1.4428372000000e+00\r\n1374 1421 -1.5225090000000e+00\r\n1419 1421 -1.6074876000000e+00\r\n1420 1421 -1.7527966000000e+02\r\n1421 1421 -5.1139888000000e+01\r\n1422 1421  9.4366858000000e+00\r\n1425 1421 -1.6073277000000e+00\r\n1468 1421  1.9000849000000e+01\r\n1470 1421 -1.5938227000000e+00\r\n2526 1421 -1.6570018000000e+00\r\n316 1422  2.0047484000000e+00\r\n317 1422 -3.2122225000000e-01\r\n318 1422 -2.4389721000000e+00\r\n1374 1422 -2.5736492000000e+00\r\n1419 1422 -2.7172951000000e+00\r\n1420 1422 -2.9629274000000e+02\r\n1421 1422  4.5709042000000e+01\r\n1422 1422  1.5951770000000e+01\r\n1425 1422 -2.7170249000000e+00\r\n1468 1422  3.2119036000000e+01\r\n1469 1422 -5.1464557000000e+00\r\n1470 1422 -2.6941978000000e+00\r\n2526 1422 -2.8009959000000e+00\r\n319 1423 -7.5306130000000e-04\r\n321 1423 -7.8592885000000e-06\r\n1375 1423 -6.5386264000000e-02\r\n1377 1423 -6.8240063000000e-04\r\n1420 1423 -2.0434374000000e-02\r\n1422 1423 -1.0656327000000e-04\r\n1423 1423  2.7017970000000e+02\r\n1425 1423  2.2144193000000e-03\r\n1426 1423 -8.3475666000000e-04\r\n1428 1423 -8.7118981000000e-06\r\n1471 1423 -1.2621266000000e-01\r\n1473 1423 -1.0619059000000e-04\r\n2527 1423 -6.3781487000000e-02\r\n2529 1423 -6.6565245000000e-04\r\n319 1424  1.1138329000000e+00\r\n321 1424 -1.4504481000000e+00\r\n1377 1424 -1.5474048000000e+00\r\n1420 1424  1.0039705000000e+00\r\n1422 1424 -1.6073277000000e+00\r\n1423 1424 -1.7621607000000e+02\r\n1424 1424 -5.1226311000000e+01\r\n1425 1424  9.4953093000000e+00\r\n1428 1424 -1.6164755000000e+00\r\n1471 1424  1.9005981000000e+01\r\n1473 1424 -1.6019098000000e+00\r\n2529 1424 -1.6660338000000e+00\r\n319 1425  1.8828219000000e+00\r\n320 1425 -3.0321541000000e-01\r\n321 1425 -2.4518359000000e+00\r\n1377 1425 -2.6157309000000e+00\r\n1420 1425  1.6971106000000e+00\r\n1421 1425 -2.7330792000000e-01\r\n1422 1425 -2.7170249000000e+00\r\n1423 1425 -2.9787545000000e+02\r\n1424 1425  4.6058279000000e+01\r\n1425 1425  1.6050862000000e+01\r\n1428 1425 -2.7324901000000e+00\r\n1471 1425  3.2127690000000e+01\r\n1472 1425 -5.1739417000000e+00\r\n1473 1425 -2.7078666000000e+00\r\n2529 1425 -2.8162617000000e+00\r\n322 1426 -7.4869979000000e-04\r\n324 1426 -7.8137698000000e-06\r\n1378 1426 -4.0960189000000e-02\r\n1380 1426 -4.2747906000000e-04\r\n1423 1426 -3.3836202000000e-02\r\n1425 1426 -8.7118981000000e-06\r\n1426 1426  2.7009668000000e+02\r\n1428 1426  1.1015790000000e-03\r\n1429 1426 -7.8804909000000e-04\r\n1431 1426 -8.2244368000000e-06\r\n1474 1426 -1.0977257000000e-01\r\n1476 1426 -8.6890117000000e-06\r\n2530 1426 -1.0376518000000e-02\r\n2532 1426 -9.3263373000000e-06\r\n322 1427  1.0105250000000e+00\r\n324 1427 -1.4587762000000e+00\r\n1380 1427 -1.5229139000000e+00\r\n1423 1427  1.8318018000000e+00\r\n1425 1427 -1.6164755000000e+00\r\n1426 1427 -1.7638804000000e+02\r\n1427 1427 -5.1330268000000e+01\r\n1428 1427  9.4573617000000e+00\r\n1431 1427 -1.5490538000000e+00\r\n1474 1427  1.8456170000000e+01\r\n1476 1427 -1.6124359000000e+00\r\n2532 1427 -1.6919846000000e+00\r\n322 1428  1.7081915000000e+00\r\n323 1428 -2.7673724000000e-01\r\n324 1428 -2.4659153000000e+00\r\n1380 1428 -2.5743337000000e+00\r\n1423 1428  3.0964777000000e+00\r\n1424 1428 -5.0164789000000e-01\r\n1425 1428 -2.7324901000000e+00\r\n1426 1428 -2.9816634000000e+02\r\n1427 1428  4.6214953000000e+01\r\n1428 1428  1.5986723000000e+01\r\n1431 1428 -2.6185188000000e+00\r\n1474 1428  3.1198310000000e+01\r\n1475 1428 -5.0543129000000e+00\r\n1476 1428 -2.7256617000000e+00\r\n2532 1428 -2.8601308000000e+00\r\n325 1429 -8.0683750000000e-04\r\n327 1429 -8.4205212000000e-06\r\n1381 1429 -1.0123973000000e-02\r\n1383 1429 -1.0565836000000e-04\r\n1426 1429 -6.6563982000000e-02\r\n1428 1429 -8.2244368000000e-06\r\n1429 1429  2.4853926000000e+02\r\n1431 1429  7.2852564000000e-04\r\n1432 1429 -7.1484597000000e-04\r\n1434 1429 -7.4604560000000e-06\r\n1477 1429 -1.0755802000000e-01\r\n1479 1429 -7.9657624000000e-06\r\n2533 1429 -4.9089751000000e-02\r\n2535 1429 -9.9785368000000e-06\r\n325 1430  9.5135559000000e-01\r\n327 1430 -1.5845640000000e+00\r\n1383 1430 -1.4423564000000e+00\r\n1426 1430  2.5614310000000e+00\r\n1428 1430 -1.5490538000000e+00\r\n1429 1430 -1.6295395000000e+02\r\n1430 1430 -4.7227537000000e+01\r\n1431 1430  9.3810030000000e+00\r\n1434 1430 -1.4198346000000e+00\r\n1477 1430  1.6763446000000e+01\r\n1479 1430 -1.5005276000000e+00\r\n2535 1430 -1.8794010000000e+00\r\n325 1431  1.6081704000000e+00\r\n326 1431 -2.6053543000000e-01\r\n327 1431 -2.6785451000000e+00\r\n1383 1431 -2.4381578000000e+00\r\n1426 1431  4.3298401000000e+00\r\n1427 1431 -7.0146590000000e-01\r\n1428 1431 -2.6185188000000e+00\r\n1429 1431 -2.7545719000000e+02\r\n1430 1431  4.2694757000000e+01\r\n1431 1431  1.5857638000000e+01\r\n1434 1431 -2.4000884000000e+00\r\n1477 1431  2.8336913000000e+01\r\n1478 1431 -4.5907875000000e+00\r\n1479 1431 -2.5364900000000e+00\r\n2535 1431 -3.1769365000000e+00\r\n328 1432 -8.7588529000000e-04\r\n330 1432 -9.1411352000000e-06\r\n1384 1432 -6.4292048000000e-04\r\n1386 1432 -6.7098090000000e-06\r\n1429 1432 -5.8069268000000e-02\r\n1431 1432 -7.4604560000000e-06\r\n1432 1432  2.2691115000000e+02\r\n1434 1432  5.7844776000000e-04\r\n1435 1432 -6.4440876000000e-04\r\n1437 1432 -6.7253413000000e-06\r\n1480 1432 -9.0980477000000e-02\r\n1482 1432 -7.2877828000000e-06\r\n2536 1432 -4.9472007000000e-02\r\n2538 1432 -1.0817669000000e-05\r\n328 1433  8.7183274000000e-01\r\n330 1433 -1.7360007000000e+00\r\n1386 1433 -1.3223121000000e+00\r\n1429 1433  2.7416608000000e+00\r\n1431 1433 -1.4198346000000e+00\r\n1432 1433 -1.4900934000000e+02\r\n1433 1433 -4.3123039000000e+01\r\n1434 1433  9.2191644000000e+00\r\n1437 1433 -1.2903395000000e+00\r\n1480 1433  1.5127805000000e+01\r\n1482 1433 -1.3871457000000e+00\r\n2538 1433 -2.0587232000000e+00\r\n328 1434  1.4737461000000e+00\r\n329 1434 -2.3875883000000e-01\r\n330 1434 -2.9345355000000e+00\r\n1386 1434 -2.2352363000000e+00\r\n1429 1434  4.6345034000000e+00\r\n1430 1434 -7.5082716000000e-01\r\n1431 1434 -2.4000884000000e+00\r\n1432 1434 -2.5188539000000e+02\r\n1433 1434  3.9038658000000e+01\r\n1434 1434  1.5584074000000e+01\r\n1437 1434 -2.1811882000000e+00\r\n1480 1434  2.5572042000000e+01\r\n1481 1434 -4.1428785000000e+00\r\n1482 1434 -2.3448311000000e+00\r\n2538 1434 -3.4800657000000e+00\r\n331 1435 -9.5981471000000e-04\r\n333 1435 -1.0017061000000e-05\r\n1387 1435 -5.7528325000000e-04\r\n1389 1435 -6.0039162000000e-06\r\n1432 1435 -4.4446802000000e-02\r\n1434 1435 -6.7253413000000e-06\r\n1435 1435  2.0529453000000e+02\r\n1437 1435  5.2095283000000e-04\r\n1483 1435 -8.1520667000000e-02\r\n1485 1435 -6.5501878000000e-06\r\n2539 1435 -4.9415207000000e-02\r\n2541 1435 -1.1860249000000e-05\r\n331 1436  8.2470459000000e-01\r\n333 1436 -1.9187718000000e+00\r\n1389 1436 -1.2098873000000e+00\r\n1432 1436  2.2942588000000e+00\r\n1434 1436 -1.2903395000000e+00\r\n1435 1436 -1.3459675000000e+02\r\n1436 1436 -3.9017438000000e+01\r\n1437 1436  7.9557264000000e+00\r\n1483 1436  1.3617892000000e+01\r\n1485 1436 -1.2568843000000e+00\r\n2541 1436 -2.2754922000000e+00\r\n331 1437  1.3940796000000e+00\r\n332 1437 -2.2585332000000e-01\r\n333 1437 -3.2434895000000e+00\r\n1389 1437 -2.0451922000000e+00\r\n1432 1437  3.8782123000000e+00\r\n1433 1437 -6.2830496000000e-01\r\n1434 1437 -2.1811882000000e+00\r\n1435 1437 -2.2752218000000e+02\r\n1436 1437  3.5257103000000e+01\r\n1437 1437  1.3448350000000e+01\r\n1483 1437  2.3019668000000e+01\r\n1484 1437 -3.7293910000000e+00\r\n1485 1437 -2.1246357000000e+00\r\n2541 1437 -3.8464892000000e+00\r\n1438 1438  1.0000000000000e+00\r\n1439 1439  1.0000000000000e+00\r\n1440 1440  1.0000000000000e+00\r\n1441 1441  1.0000000000000e+00\r\n1442 1442  1.0000000000000e+00\r\n1443 1443  1.0000000000000e+00\r\n1444 1444  1.0000000000000e+00\r\n1445 1445  1.0000000000000e+00\r\n1446 1446  1.0000000000000e+00\r\n1447 1447  1.0000000000000e+00\r\n1448 1448  1.0000000000000e+00\r\n1449 1449  1.0000000000000e+00\r\n1450 1450  1.0000000000000e+00\r\n1451 1451  1.0000000000000e+00\r\n1452 1452  1.0000000000000e+00\r\n1453 1453  1.0000000000000e+00\r\n1454 1454  1.0000000000000e+00\r\n1455 1455  1.0000000000000e+00\r\n352 1456 -7.8247898000000e-04\r\n354 1456 -8.1663047000000e-06\r\n1408 1456 -8.3008238000000e-04\r\n1410 1456 -8.6631152000000e-06\r\n1456 1456  2.7001834000000e+02\r\n1458 1456  6.7542648000000e-04\r\n1459 1456 -1.9974614000000e-02\r\n1461 1456 -9.0183575000000e-06\r\n1504 1456 -7.0525855000000e-02\r\n1506 1456 -8.5828473000000e-06\r\n2560 1456 -4.8509484000000e-02\r\n2562 1456 -9.6623255000000e-06\r\n352 1457  1.0519100000000e+00\r\n354 1457 -1.4603618000000e+00\r\n1410 1457 -1.6119602000000e+00\r\n1456 1457 -1.7386680000000e+02\r\n1457 1457 -4.7111932000000e+01\r\n1458 1457  7.9679799000000e+00\r\n1459 1457  1.1004158000000e+00\r\n1461 1457 -1.6174652000000e+00\r\n1504 1457  1.6653300000000e+01\r\n1506 1457 -1.5395618000000e+00\r\n2562 1457 -1.7328999000000e+00\r\n352 1458  1.7781486000000e+00\r\n353 1458 -2.8806540000000e-01\r\n354 1458 -2.4685955000000e+00\r\n1410 1458 -2.7248575000000e+00\r\n1456 1458 -2.9390444000000e+02\r\n1457 1458  5.2638811000000e+01\r\n1458 1458  1.3469073000000e+01\r\n1459 1458  1.8601429000000e+00\r\n1460 1458 -3.0134873000000e-01\r\n1461 1458 -2.7341631000000e+00\r\n1504 1458  2.8150739000000e+01\r\n1505 1458 -4.5605041000000e+00\r\n1506 1458 -2.6024753000000e+00\r\n2562 1458 -2.9292939000000e+00\r\n355 1459 -7.8482076000000e-04\r\n357 1459 -8.1907446000000e-06\r\n1411 1459 -8.3500867000000e-04\r\n1413 1459 -8.7145283000000e-06\r\n1456 1459 -8.6412098000000e-04\r\n1458 1459 -9.0183575000000e-06\r\n1459 1459  2.7003674000000e+02\r\n1461 1459  6.8480065000000e-04\r\n1462 1459 -2.9835450000000e-02\r\n1464 1459 -9.0455668000000e-06\r\n1507 1459 -7.8257894000000e-02\r\n1509 1459 -8.8081726000000e-06\r\n2563 1459 -4.8060852000000e-02\r\n2565 1459 -9.6879349000000e-06\r\n355 1460  1.1450184000000e+00\r\n357 1460 -1.4601662000000e+00\r\n1413 1460 -1.6117717000000e+00\r\n1458 1460 -1.6174652000000e+00\r\n1459 1460 -1.7544405000000e+02\r\n1460 1460 -5.1350908000000e+01\r\n1461 1460  9.6198756000000e+00\r\n1462 1460  2.0692633000000e+00\r\n1464 1460 -1.6173997000000e+00\r\n1507 1460  1.7168040000000e+01\r\n1509 1460 -1.5751537000000e+00\r\n2565 1460 -1.7321883000000e+00\r\n355 1461  1.9355381000000e+00\r\n356 1461 -3.1356263000000e-01\r\n357 1461 -2.4682635000000e+00\r\n1413 1461 -2.7245372000000e+00\r\n1458 1461 -2.7341631000000e+00\r\n1459 1461 -2.9657046000000e+02\r\n1460 1461  4.5905440000000e+01\r\n1461 1461  1.6261429000000e+01\r\n1462 1461  3.4978806000000e+00\r\n1463 1461 -5.6666650000000e-01\r\n1464 1461 -2.7340508000000e+00\r\n1507 1461  2.9020837000000e+01\r\n1508 1461 -4.7014575000000e+00\r\n1509 1461 -2.6626383000000e+00\r\n2565 1461 -2.9280891000000e+00\r\n358 1462 -7.8940871000000e-04\r\n360 1462 -8.2386264000000e-06\r\n1414 1462 -2.3028150000000e-03\r\n1416 1462 -2.4033219000000e-05\r\n1459 1462 -8.6672812000000e-04\r\n1461 1462 -9.0455668000000e-06\r\n1462 1462  2.7006740000000e+02\r\n1464 1462  7.0053882000000e-04\r\n1465 1462 -3.6297248000000e-02\r\n1467 1462 -9.0947386000000e-06\r\n1510 1462 -1.0191037000000e-01\r\n1512 1462 -9.0508544000000e-06\r\n2566 1462 -4.7232910000000e-02\r\n2568 1462 -9.7375877000000e-06\r\n358 1463  1.2957864000000e+00\r\n360 1463 -1.4600938000000e+00\r\n1416 1463 -1.6100400000000e+00\r\n1461 1463 -1.6173997000000e+00\r\n1462 1463 -1.7750451000000e+02\r\n1463 1463 -5.1350998000000e+01\r\n1464 1463  9.6521019000000e+00\r\n1465 1463  1.9262750000000e+00\r\n1467 1463 -1.6173879000000e+00\r\n1510 1463  1.9220924000000e+01\r\n1512 1463 -1.6098024000000e+00\r\n2568 1463 -1.7316471000000e+00\r\n358 1464  2.1903974000000e+00\r\n359 1464 -3.5484929000000e-01\r\n360 1464 -2.4681426000000e+00\r\n1416 1464 -2.7216116000000e+00\r\n1461 1464 -2.7340508000000e+00\r\n1462 1464 -3.0005362000000e+02\r\n1463 1464  4.6469243000000e+01\r\n1464 1464  1.6315911000000e+01\r\n1465 1464  3.2561752000000e+00\r\n1466 1464 -5.2750769000000e-01\r\n1467 1464 -2.7340325000000e+00\r\n1510 1464  3.2491049000000e+01\r\n1511 1464 -5.2636228000000e+00\r\n1512 1464 -2.7212100000000e+00\r\n2568 1464 -2.9271763000000e+00\r\n361 1465 -7.9420309000000e-04\r\n363 1465 -8.2886627000000e-06\r\n1417 1465 -1.0180047000000e-02\r\n1419 1465 -1.0624358000000e-04\r\n1462 1465 -8.7143967000000e-04\r\n1464 1465 -9.0947386000000e-06\r\n1465 1465  2.7006765000000e+02\r\n1467 1465  7.8304509000000e-04\r\n1468 1465 -1.6336949000000e-02\r\n1470 1465 -9.1531613000000e-06\r\n1513 1465 -1.1435344000000e-01\r\n1515 1465 -9.1176109000000e-06\r\n2569 1465 -4.6196229000000e-02\r\n2571 1465 -9.8051430000000e-06\r\n361 1466  1.4523774000000e+00\r\n363 1466 -1.4608747000000e+00\r\n1419 1466 -1.6019100000000e+00\r\n1464 1466 -1.6173879000000e+00\r\n1465 1466 -1.7848422000000e+02\r\n1466 1466 -5.1349972000000e+01\r\n1467 1466  9.6472855000000e+00\r\n1468 1466  7.4175981000000e-01\r\n1470 1466 -1.6174298000000e+00\r\n1513 1466  2.1227252000000e+01\r\n1515 1466 -1.6113827000000e+00\r\n2571 1466 -1.7325699000000e+00\r\n361 1467  2.4550965000000e+00\r\n362 1467 -3.9773011000000e-01\r\n363 1467 -2.4694602000000e+00\r\n1419 1467 -2.7078668000000e+00\r\n1464 1467 -2.7340325000000e+00\r\n1465 1467 -3.0170946000000e+02\r\n1466 1467  4.6739878000000e+01\r\n1467 1467  1.6307760000000e+01\r\n1468 1467  1.2538697000000e+00\r\n1469 1467 -2.0312916000000e-01\r\n1470 1467 -2.7341007000000e+00\r\n1513 1467  3.5882516000000e+01\r\n1514 1467 -5.8130322000000e+00\r\n1515 1467 -2.7238788000000e+00\r\n2571 1467 -2.9287341000000e+00\r\n364 1468 -7.9591745000000e-04\r\n366 1468 -8.3065546000000e-06\r\n1420 1468 -1.8055398000000e-02\r\n1422 1468 -1.8843431000000e-04\r\n1465 1468 -8.7703761000000e-04\r\n1467 1468 -9.1531613000000e-06\r\n1468 1468  2.7007190000000e+02\r\n1470 1468  8.6537164000000e-04\r\n1471 1468 -8.7636085000000e-04\r\n1473 1468 -9.1460984000000e-06\r\n1516 1468 -1.2596991000000e-01\r\n1518 1468 -9.1484399000000e-06\r\n2572 1468 -4.5679259000000e-02\r\n2574 1468 -9.8382960000000e-06\r\n364 1469  1.5262413000000e+00\r\n366 1469 -1.4608630000000e+00\r\n1422 1469 -1.5938227000000e+00\r\n1467 1469 -1.6174298000000e+00\r\n1468 1469 -1.7895839000000e+02\r\n1469 1469 -5.1349336000000e+01\r\n1470 1469  9.6391433000000e+00\r\n1473 1469 -1.6173685000000e+00\r\n1516 1469  2.2368532000000e+01\r\n1518 1469 -1.6113755000000e+00\r\n2574 1469 -1.7325536000000e+00\r\n364 1470  2.5799584000000e+00\r\n365 1470 -4.1795678000000e-01\r\n366 1470 -2.4694428000000e+00\r\n1422 1470 -2.6941978000000e+00\r\n1467 1470 -2.7341007000000e+00\r\n1468 1470 -3.0251126000000e+02\r\n1469 1470  4.6871070000000e+01\r\n1470 1470  1.6294003000000e+01\r\n1473 1470 -2.7339979000000e+00\r\n1516 1470  3.7811766000000e+01\r\n1517 1470 -6.1255577000000e+00\r\n1518 1470 -2.7238692000000e+00\r\n2574 1470 -2.9287086000000e+00\r\n367 1471 -7.9366279000000e-04\r\n369 1471 -8.2830240000000e-06\r\n1423 1471 -1.0174970000000e-02\r\n1425 1471 -1.0619059000000e-04\r\n1468 1471 -1.8953762000000e-02\r\n1470 1471 -9.1460984000000e-06\r\n1471 1471  2.7007945000000e+02\r\n1473 1471  7.8294893000000e-04\r\n1474 1471 -8.6954137000000e-04\r\n1476 1471 -9.0749271000000e-06\r\n1519 1471 -1.2342382000000e-01\r\n1521 1471 -9.1135260000000e-06\r\n2575 1471 -4.6118381000000e-02\r\n2577 1471 -9.7986799000000e-06\r\n367 1472  1.4663627000000e+00\r\n369 1472 -1.4609828000000e+00\r\n1425 1472 -1.6019098000000e+00\r\n1468 1472  9.9902844000000e-01\r\n1470 1472 -1.6173685000000e+00\r\n1471 1472 -1.7965018000000e+02\r\n1472 1472 -5.1349843000000e+01\r\n1473 1472  9.6476569000000e+00\r\n1476 1472 -1.6171212000000e+00\r\n1519 1472  2.2121760000000e+01\r\n1521 1472 -1.6118470000000e+00\r\n2577 1472 -1.7326971000000e+00\r\n367 1473  2.4787378000000e+00\r\n368 1473 -4.0156009000000e-01\r\n369 1473 -2.4696437000000e+00\r\n1425 1473 -2.7078666000000e+00\r\n1468 1473  1.6887565000000e+00\r\n1469 1473 -2.7358167000000e-01\r\n1470 1473 -2.7339979000000e+00\r\n1471 1473 -3.0368046000000e+02\r\n1472 1473  4.7059527000000e+01\r\n1473 1473  1.6308390000000e+01\r\n1476 1473 -2.7335816000000e+00\r\n1519 1473  3.7394598000000e+01\r\n1520 1473 -6.0579939000000e+00\r\n1521 1473 -2.7246643000000e+00\r\n2577 1473 -2.9289491000000e+00\r\n370 1474 -7.8813993000000e-04\r\n372 1474 -8.2253849000000e-06\r\n1426 1474 -8.3256372000000e-04\r\n1428 1474 -8.6890117000000e-06\r\n1471 1474 -4.1060224000000e-02\r\n1473 1474 -9.0749271000000e-06\r\n1474 1474  2.7008865000000e+02\r\n1476 1474  6.8481087000000e-04\r\n1477 1474 -8.3543184000000e-04\r\n1479 1474 -8.7189446000000e-06\r\n1522 1474 -1.1984362000000e-01\r\n1524 1474 -9.0443172000000e-06\r\n2578 1474 -4.6864971000000e-02\r\n2580 1474 -9.7207651000000e-06\r\n370 1475  1.3171960000000e+00\r\n372 1475 -1.4603466000000e+00\r\n1428 1475 -1.6124359000000e+00\r\n1471 1475  2.3948027000000e+00\r\n1473 1475 -1.6171212000000e+00\r\n1474 1475 -1.7976978000000e+02\r\n1475 1475 -5.1350607000000e+01\r\n1476 1475  9.6064392000000e+00\r\n1479 1475 -1.5667697000000e+00\r\n1522 1475  2.0995709000000e+01\r\n1524 1475 -1.6118921000000e+00\r\n2580 1475 -1.7321429000000e+00\r\n370 1476  2.2265881000000e+00\r\n371 1476 -3.6071267000000e-01\r\n372 1476 -2.4685699000000e+00\r\n1428 1476 -2.7256617000000e+00\r\n1471 1476  4.0481744000000e+00\r\n1472 1476 -6.5581405000000e-01\r\n1473 1476 -2.7335816000000e+00\r\n1474 1476 -3.0388283000000e+02\r\n1475 1476  4.7090596000000e+01\r\n1476 1476  1.6238723000000e+01\r\n1479 1476 -2.6484659000000e+00\r\n1522 1476  3.5491147000000e+01\r\n1523 1476 -5.7496518000000e+00\r\n1524 1476 -2.7247424000000e+00\r\n2580 1476 -2.9280144000000e+00\r\n373 1477 -8.3063190000000e-04\r\n375 1477 -8.6688503000000e-06\r\n1429 1477 -7.6326343000000e-04\r\n1431 1477 -7.9657624000000e-06\r\n1474 1477 -6.1690204000000e-02\r\n1476 1477 -8.7189446000000e-06\r\n1477 1477  2.5390840000000e+02\r\n1479 1477  6.4576394000000e-04\r\n1480 1477 -7.7640669000000e-04\r\n1482 1477 -8.1029315000000e-06\r\n1525 1477 -1.1373980000000e-01\r\n1527 1477 -8.6082212000000e-06\r\n2581 1477 -4.7159864000000e-02\r\n2583 1477 -1.0248069000000e-05\r\n373 1478  1.1837465000000e+00\r\n375 1478 -1.5528349000000e+00\r\n1431 1478 -1.5005276000000e+00\r\n1474 1478  3.0200314000000e+00\r\n1476 1478 -1.5667697000000e+00\r\n1477 1478 -1.6878018000000e+02\r\n1478 1478 -4.8271778000000e+01\r\n1479 1478  9.4839287000000e+00\r\n1482 1478 -1.4698187000000e+00\r\n1525 1478  1.8820856000000e+01\r\n1527 1478 -1.5470819000000e+00\r\n2583 1478 -1.8415082000000e+00\r\n373 1479  2.0010037000000e+00\r\n374 1479 -3.2416910000000e-01\r\n375 1479 -2.6249103000000e+00\r\n1431 1479 -2.5364900000000e+00\r\n1474 1479  5.1050579000000e+00\r\n1475 1479 -8.2703595000000e-01\r\n1476 1479 -2.6484659000000e+00\r\n1477 1479 -2.8530584000000e+02\r\n1478 1479  4.4204439000000e+01\r\n1479 1479  1.6031624000000e+01\r\n1482 1479 -2.4845815000000e+00\r\n1525 1479  3.1814754000000e+01\r\n1526 1479 -5.1540934000000e+00\r\n1527 1479 -2.6151855000000e+00\r\n2583 1479 -3.1128835000000e+00\r\n376 1480 -8.7771886000000e-04\r\n378 1480 -9.1602712000000e-06\r\n1432 1480 -6.9830077000000e-04\r\n1434 1480 -7.2877828000000e-06\r\n1477 1480 -6.9078878000000e-02\r\n1479 1480 -8.1029315000000e-06\r\n1480 1480  2.3770616000000e+02\r\n1482 1480  6.0635441000000e-04\r\n1483 1480 -7.1017836000000e-04\r\n1485 1480 -7.4117426000000e-06\r\n1528 1480 -9.8724622000000e-02\r\n1530 1480 -7.9912181000000e-06\r\n2584 1480 -4.7971359000000e-02\r\n2586 1480 -1.0835706000000e-05\r\n376 1481  1.0382496000000e+00\r\n378 1481 -1.6573901000000e+00\r\n1434 1481 -1.3871457000000e+00\r\n1477 1481  3.2285571000000e+00\r\n1479 1481 -1.4698187000000e+00\r\n1480 1481 -1.5688330000000e+02\r\n1481 1481 -4.5193359000000e+01\r\n1482 1481  9.2900489000000e+00\r\n1485 1481 -1.3554128000000e+00\r\n1528 1481  1.6168101000000e+01\r\n1530 1481 -1.4497408000000e+00\r\n2586 1481 -1.9654957000000e+00\r\n376 1482  1.7550571000000e+00\r\n377 1482 -2.8432625000000e-01\r\n378 1482 -2.8016522000000e+00\r\n1434 1482 -2.3448311000000e+00\r\n1477 1482  5.4575529000000e+00\r\n1478 1482 -8.8414531000000e-01\r\n1479 1482 -2.4845815000000e+00\r\n1480 1482 -2.6519553000000e+02\r\n1481 1482  4.1068716000000e+01\r\n1482 1482  1.5703897000000e+01\r\n1485 1482 -2.2911882000000e+00\r\n1528 1482  2.7330557000000e+01\r\n1529 1482 -4.4276594000000e+00\r\n1530 1482 -2.4506419000000e+00\r\n2586 1482 -3.3224740000000e+00\r\n379 1483 -9.5919609000000e-04\r\n381 1483 -1.0010604000000e-05\r\n1435 1483 -6.2762590000000e-04\r\n1437 1483 -6.5501878000000e-06\r\n1480 1483 -4.7692092000000e-02\r\n1482 1483 -7.4117426000000e-06\r\n1483 1483  2.1604354000000e+02\r\n1485 1483  5.4800677000000e-04\r\n1531 1483 -4.8856002000000e-02\r\n1533 1483 -7.1352826000000e-06\r\n2587 1483 -4.8565204000000e-02\r\n2589 1483 -1.1844695000000e-05\r\n379 1484  9.5949762000000e-01\r\n381 1484 -1.8263584000000e+00\r\n1437 1484 -1.2568843000000e+00\r\n1480 1484  2.5058817000000e+00\r\n1482 1484 -1.3554128000000e+00\r\n1483 1484 -1.4020691000000e+02\r\n1484 1484 -4.1086240000000e+01\r\n1485 1484  7.9143095000000e+00\r\n1531 1484  1.2699265000000e+01\r\n1533 1484 -1.3050280000000e+00\r\n2589 1484 -2.1660390000000e+00\r\n379 1485  1.6219336000000e+00\r\n380 1485 -2.6276103000000e-01\r\n381 1485 -3.0872741000000e+00\r\n1437 1485 -2.1246357000000e+00\r\n1480 1485  4.2359396000000e+00\r\n1481 1485 -6.8624254000000e-01\r\n1482 1485 -2.2911882000000e+00\r\n1483 1485 -2.3700561000000e+02\r\n1484 1485  3.6671012000000e+01\r\n1485 1485  1.3378339000000e+01\r\n1531 1485  2.1466823000000e+01\r\n1532 1485 -3.4777282000000e+00\r\n1533 1485 -2.2060178000000e+00\r\n2589 1485 -3.6614697000000e+00\r\n1486 1486  1.0000000000000e+00\r\n1487 1487  1.0000000000000e+00\r\n1488 1488  1.0000000000000e+00\r\n1489 1489  1.0000000000000e+00\r\n1490 1490  1.0000000000000e+00\r\n1491 1491  1.0000000000000e+00\r\n1492 1492  1.0000000000000e+00\r\n1493 1493  1.0000000000000e+00\r\n1494 1494  1.0000000000000e+00\r\n1495 1495  1.0000000000000e+00\r\n1496 1496  1.0000000000000e+00\r\n1497 1497  1.0000000000000e+00\r\n1498 1498  1.0000000000000e+00\r\n1499 1499  1.0000000000000e+00\r\n1500 1500  1.0000000000000e+00\r\n397 1501 -9.4909644000000e-04\r\n399 1501 -9.9051999000000e-06\r\n1501 1501  2.3751600000000e+02\r\n1503 1501  5.9348746000000e-04\r\n1504 1501 -8.1308798000000e-04\r\n1506 1501 -8.4857540000000e-06\r\n1549 1501 -7.4546262000000e-04\r\n1551 1501 -7.7799852000000e-06\r\n2605 1501 -4.9070637000000e-02\r\n2607 1501 -1.1738265000000e-05\r\n397 1502  9.6736796000000e-01\r\n399 1502 -1.6717298000000e+00\r\n1501 1502 -1.4417444000000e+02\r\n1502 1502 -4.5215223000000e+01\r\n1503 1502  6.4070392000000e+00\r\n1506 1502 -1.4551388000000e+00\r\n1549 1502  6.7886956000000e+00\r\n1551 1502 -1.2892139000000e+00\r\n2607 1502 -1.9859020000000e+00\r\n397 1503  1.6352377000000e+00\r\n398 1503 -2.6490482000000e-01\r\n399 1503 -2.8258900000000e+00\r\n1501 1503 -2.4371230000000e+02\r\n1502 1503  3.7533536000000e+01\r\n1503 1503  1.0830453000000e+01\r\n1506 1503 -2.4597666000000e+00\r\n1549 1503  1.1475603000000e+01\r\n1550 1503 -1.8590219000000e+00\r\n1551 1503 -2.1792857000000e+00\r\n2607 1503 -3.3569658000000e+00\r\n400 1504 -8.9387850000000e-04\r\n402 1504 -9.3289205000000e-06\r\n1456 1504 -8.2239126000000e-04\r\n1458 1504 -8.5828473000000e-06\r\n1501 1504 -2.4458134000000e-02\r\n1503 1504 -8.4857540000000e-06\r\n1504 1504  2.4836450000000e+02\r\n1506 1504  6.3543396000000e-04\r\n1507 1504 -2.4687892000000e-02\r\n1509 1504 -8.8644260000000e-06\r\n1552 1504 -7.9467502000000e-04\r\n1554 1504 -8.2935881000000e-06\r\n2608 1504 -4.8017324000000e-02\r\n2610 1504 -1.1047996000000e-05\r\n400 1505  1.1078724000000e+00\r\n402 1505 -1.5953249000000e+00\r\n1458 1505 -1.5395618000000e+00\r\n1501 1505  4.8579944000000e+00\r\n1503 1505 -1.4551388000000e+00\r\n1504 1505 -1.6231943000000e+02\r\n1505 1505 -4.7264376000000e+01\r\n1506 1505  9.3809026000000e+00\r\n1507 1505  1.1591144000000e+00\r\n1509 1505 -1.5200077000000e+00\r\n1552 1505  1.2566956000000e+01\r\n1554 1505 -1.3712112000000e+00\r\n2610 1505 -1.8943762000000e+00\r\n400 1506  1.8727475000000e+00\r\n401 1506 -3.0338303000000e-01\r\n402 1506 -2.6967372000000e+00\r\n1458 1506 -2.6024753000000e+00\r\n1501 1506  8.2119536000000e+00\r\n1502 1506 -1.3303274000000e+00\r\n1503 1506 -2.4597666000000e+00\r\n1504 1506 -2.7438477000000e+02\r\n1505 1506  4.2428957000000e+01\r\n1506 1506  1.5857478000000e+01\r\n1507 1506  1.9593670000000e+00\r\n1508 1506 -3.1741530000000e-01\r\n1509 1506 -2.5694210000000e+00\r\n1552 1506  2.1243182000000e+01\r\n1553 1506 -3.4413720000000e+00\r\n1554 1506 -2.3178955000000e+00\r\n2610 1506 -3.2022536000000e+00\r\n403 1507 -8.5917158000000e-04\r\n405 1507 -8.9667033000000e-06\r\n1459 1507 -8.4398148000000e-04\r\n1461 1507 -8.8081726000000e-06\r\n1504 1507 -8.4937157000000e-04\r\n1506 1507 -8.8644260000000e-06\r\n1507 1507  2.5919759000000e+02\r\n1509 1507  6.6122729000000e-04\r\n1510 1507 -5.0848390000000e-02\r\n1512 1507 -9.2733182000000e-06\r\n1555 1507 -3.8161872000000e-02\r\n1557 1507 -8.6210888000000e-06\r\n2611 1507 -4.6123540000000e-02\r\n2613 1507 -1.0607112000000e-05\r\n403 1508  1.3706750000000e+00\r\n405 1508 -1.5271880000000e+00\r\n1461 1508 -1.5751537000000e+00\r\n1506 1508 -1.5200077000000e+00\r\n1507 1508 -1.7047620000000e+02\r\n1508 1508 -4.9318400000000e+01\r\n1509 1508  9.4987930000000e+00\r\n1510 1508  3.6763866000000e+00\r\n1512 1508 -1.5847634000000e+00\r\n1555 1508  1.6599150000000e+01\r\n1557 1508 -1.4735359000000e+00\r\n2613 1508 -1.8126331000000e+00\r\n403 1509  2.3169875000000e+00\r\n404 1509 -3.7534895000000e-01\r\n405 1509 -2.5815568000000e+00\r\n1461 1509 -2.6626383000000e+00\r\n1506 1509 -2.5694210000000e+00\r\n1507 1509 -2.8817279000000e+02\r\n1508 1509  4.4577014000000e+01\r\n1509 1509  1.6056750000000e+01\r\n1510 1509  6.2145599000000e+00\r\n1511 1509 -1.0067506000000e+00\r\n1512 1509 -2.6788823000000e+00\r\n1555 1509  2.8059187000000e+01\r\n1556 1509 -4.5455510000000e+00\r\n1557 1509 -2.4908634000000e+00\r\n2613 1509 -3.0640727000000e+00\r\n406 1510 -8.3206675000000e-04\r\n408 1510 -8.6838251000000e-06\r\n1462 1510 -8.6723476000000e-04\r\n1464 1510 -9.0508544000000e-06\r\n1507 1510 -8.8855081000000e-04\r\n1509 1510 -9.2733182000000e-06\r\n1510 1510  2.7004009000000e+02\r\n1512 1510  6.8734928000000e-04\r\n1513 1510 -4.8725905000000e-02\r\n1515 1510 -9.5533495000000e-06\r\n1558 1510 -9.1979919000000e-02\r\n1560 1510 -9.1876557000000e-06\r\n2614 1510 -4.3192237000000e-02\r\n2616 1510 -1.0255506000000e-05\r\n406 1511  1.7787051000000e+00\r\n408 1511 -1.4635822000000e+00\r\n1464 1511 -1.6098024000000e+00\r\n1509 1511 -1.5847634000000e+00\r\n1510 1511 -1.8161181000000e+02\r\n1511 1511 -5.1373691000000e+01\r\n1512 1511  9.5744591000000e+00\r\n1513 1511  3.9218115000000e+00\r\n1515 1511 -1.6178102000000e+00\r\n1558 1511  2.0880731000000e+01\r\n1560 1511 -1.5561203000000e+00\r\n2616 1511 -1.7366396000000e+00\r\n406 1512  3.0067231000000e+00\r\n407 1512 -4.8708231000000e-01\r\n408 1512 -2.4740393000000e+00\r\n1464 1512 -2.7212100000000e+00\r\n1509 1512 -2.6788823000000e+00\r\n1510 1512 -3.0699661000000e+02\r\n1511 1512  4.7537372000000e+01\r\n1512 1512  1.6184664000000e+01\r\n1513 1512  6.6294301000000e+00\r\n1514 1512 -1.0739526000000e+00\r\n1515 1512 -2.7347463000000e+00\r\n1558 1512  3.5296787000000e+01\r\n1559 1512 -5.7179994000000e+00\r\n1560 1512 -2.6304658000000e+00\r\n2616 1512 -2.9356156000000e+00\r\n409 1513 -8.3935795000000e-04\r\n411 1513 -8.7599193000000e-06\r\n1465 1513 -8.7363124000000e-04\r\n1467 1513 -9.1176109000000e-06\r\n1510 1513 -9.1538284000000e-04\r\n1512 1513 -9.5533495000000e-06\r\n1513 1513  2.7008309000000e+02\r\n1515 1513  6.8833418000000e-04\r\n1516 1513 -2.8041727000000e-02\r\n1518 1513 -9.6454470000000e-06\r\n1561 1513 -1.6072546000000e-01\r\n1563 1513 -9.5827761000000e-06\r\n2617 1513 -3.9367327000000e-02\r\n2619 1513 -1.0326069000000e-05\r\n409 1514  2.3223633000000e+00\r\n411 1514 -1.4603090000000e+00\r\n1467 1514 -1.6113827000000e+00\r\n1512 1514 -1.6178102000000e+00\r\n1513 1514 -1.8423016000000e+02\r\n1514 1514 -5.1374787000000e+01\r\n1515 1514  9.6524961000000e+00\r\n1516 1514  1.8876594000000e+00\r\n1518 1514 -1.6178115000000e+00\r\n1561 1514  2.4991137000000e+01\r\n1563 1514 -1.6075376000000e+00\r\n2619 1514 -1.7319037000000e+00\r\n409 1515  3.9257207000000e+00\r\n410 1515 -6.3595464000000e-01\r\n411 1515 -2.4685050000000e+00\r\n1467 1515 -2.7238788000000e+00\r\n1512 1515 -2.7347463000000e+00\r\n1513 1515 -3.1142250000000e+02\r\n1514 1515  4.8251452000000e+01\r\n1515 1515  1.6316571000000e+01\r\n1516 1515  3.1908977000000e+00\r\n1517 1515 -5.1691558000000e-01\r\n1518 1515 -2.7347471000000e+00\r\n1561 1515  4.2244995000000e+01\r\n1562 1515 -6.8435583000000e+00\r\n1563 1515 -2.7173801000000e+00\r\n2619 1515 -2.9276085000000e+00\r\n412 1516 -8.4416373000000e-04\r\n414 1516 -8.8100746000000e-06\r\n1468 1516 -8.7658522000000e-04\r\n1470 1516 -9.1484399000000e-06\r\n1513 1516 -9.2420744000000e-04\r\n1515 1516 -9.6454470000000e-06\r\n1516 1516  2.7007521000000e+02\r\n1518 1516  6.8862876000000e-04\r\n1519 1516 -9.2584909000000e-04\r\n1521 1516 -9.6625799000000e-06\r\n1564 1516 -1.8218975000000e-01\r\n1566 1516 -9.6351775000000e-06\r\n2620 1516 -3.7136019000000e-02\r\n2622 1516 -1.0375283000000e-05\r\n412 1517  2.6636120000000e+00\r\n414 1517 -1.4603067000000e+00\r\n1470 1517 -1.6113755000000e+00\r\n1515 1517 -1.6178115000000e+00\r\n1516 1517 -1.8480023000000e+02\r\n1517 1517 -5.1374772000000e+01\r\n1518 1517  9.6536146000000e+00\r\n1521 1517 -1.6178126000000e+00\r\n1564 1517  2.7107692000000e+01\r\n1566 1517 -1.6086679000000e+00\r\n2622 1517 -1.7318990000000e+00\r\n412 1518  4.5025698000000e+00\r\n413 1518 -7.2939997000000e-01\r\n414 1518 -2.4685025000000e+00\r\n1470 1518 -2.7238692000000e+00\r\n1515 1518 -2.7347471000000e+00\r\n1516 1518 -3.1238630000000e+02\r\n1517 1518  4.8407342000000e+01\r\n1518 1518  1.6318467000000e+01\r\n1521 1518 -2.7347488000000e+00\r\n1564 1518  4.5822842000000e+01\r\n1565 1518 -7.4231342000000e+00\r\n1566 1518 -2.7192922000000e+00\r\n2622 1518 -2.9276020000000e+00\r\n415 1519 -8.4070669000000e-04\r\n417 1519 -8.7739954000000e-06\r\n1471 1519 -8.7323983000000e-04\r\n1473 1519 -9.1135260000000e-06\r\n1516 1519 -2.1590804000000e-02\r\n1518 1519 -9.6625799000000e-06\r\n1519 1519  2.7009410000000e+02\r\n1521 1519  6.8843280000000e-04\r\n1522 1519 -9.1766119000000e-04\r\n1524 1519 -9.5771274000000e-06\r\n1567 1519 -1.7948756000000e-01\r\n1569 1519 -9.6173852000000e-06\r\n2623 1519 -3.8450156000000e-02\r\n2625 1519 -1.0338482000000e-05\r\n415 1520  2.4505236000000e+00\r\n417 1520 -1.4594767000000e+00\r\n1473 1520 -1.6118470000000e+00\r\n1516 1520  1.2533309000000e+00\r\n1518 1520 -1.6178126000000e+00\r\n1519 1520 -1.8481019000000e+02\r\n1520 1520 -5.1375126000000e+01\r\n1521 1520  9.6540106000000e+00\r\n1524 1520 -1.6177334000000e+00\r\n1567 1520  2.6077818000000e+01\r\n1569 1520 -1.6104834000000e+00\r\n2625 1520 -1.7309160000000e+00\r\n415 1521  4.1423626000000e+00\r\n416 1521 -6.7104929000000e-01\r\n417 1521 -2.4670980000000e+00\r\n1473 1521 -2.7246643000000e+00\r\n1516 1521  2.1186294000000e+00\r\n1517 1521 -3.4321107000000e-01\r\n1518 1521 -2.7347488000000e+00\r\n1519 1521 -3.1240296000000e+02\r\n1520 1521  4.8409390000000e+01\r\n1521 1521  1.6319131000000e+01\r\n1524 1521 -2.7346166000000e+00\r\n1567 1521  4.4081918000000e+01\r\n1568 1521 -7.1411270000000e+00\r\n1569 1521 -2.7223596000000e+00\r\n2625 1521 -2.9259386000000e+00\r\n418 1522 -8.3289178000000e-04\r\n420 1522 -8.6924355000000e-06\r\n1474 1522 -8.6660839000000e-04\r\n1476 1522 -9.0443172000000e-06\r\n1519 1522 -4.4701745000000e-02\r\n1521 1522 -9.5771274000000e-06\r\n1522 1522  2.7008965000000e+02\r\n1524 1522  6.8782746000000e-04\r\n1525 1522 -8.9809299000000e-04\r\n1527 1522 -9.3729048000000e-06\r\n1570 1522 -1.4792916000000e-01\r\n1572 1522 -9.5404218000000e-06\r\n2626 1522 -4.1432319000000e-02\r\n2628 1522 -1.0254566000000e-05\r\n418 1523  2.0051029000000e+00\r\n420 1523 -1.4604292000000e+00\r\n1476 1523 -1.6118921000000e+00\r\n1519 1523  3.5260769000000e+00\r\n1521 1523 -1.6177334000000e+00\r\n1522 1523 -1.8431844000000e+02\r\n1523 1523 -5.1374246000000e+01\r\n1524 1523  9.6407722000000e+00\r\n1527 1523 -1.6011305000000e+00\r\n1570 1523  2.3757471000000e+01\r\n1572 1523 -1.6117570000000e+00\r\n2628 1523 -1.7320887000000e+00\r\n418 1524  3.3894259000000e+00\r\n419 1524 -5.4907849000000e-01\r\n420 1524 -2.4687096000000e+00\r\n1476 1524 -2.7247424000000e+00\r\n1519 1524  5.9604802000000e+00\r\n1520 1524 -9.6558282000000e-01\r\n1521 1524 -2.7346166000000e+00\r\n1522 1524 -3.1157189000000e+02\r\n1523 1524  4.8277121000000e+01\r\n1524 1524  1.6296759000000e+01\r\n1527 1524 -2.7065491000000e+00\r\n1570 1524  4.0159629000000e+01\r\n1571 1524 -6.5057592000000e+00\r\n1572 1524 -2.7245140000000e+00\r\n2628 1524 -2.9279228000000e+00\r\n421 1525 -8.4007217000000e-04\r\n423 1525 -8.7673732000000e-06\r\n1477 1525 -8.2482254000000e-04\r\n1479 1525 -8.6082212000000e-06\r\n1522 1525 -6.4392667000000e-02\r\n1524 1525 -9.3729048000000e-06\r\n1525 1525  2.6468463000000e+02\r\n1527 1525  6.7401653000000e-04\r\n1528 1525 -8.4943775000000e-04\r\n1530 1525 -8.8651167000000e-06\r\n1573 1525 -1.1755223000000e-01\r\n1575 1525 -9.3363636000000e-06\r\n2629 1525 -4.4120055000000e-02\r\n2631 1525 -1.0353917000000e-05\r\n421 1526  1.6041890000000e+00\r\n423 1526 -1.4913157000000e+00\r\n1479 1526 -1.5470819000000e+00\r\n1522 1526  4.4628450000000e+00\r\n1524 1526 -1.6011305000000e+00\r\n1525 1526 -1.7920248000000e+02\r\n1526 1526 -5.0346702000000e+01\r\n1527 1526  9.5433280000000e+00\r\n1530 1526 -1.5344165000000e+00\r\n1573 1526  2.1205997000000e+01\r\n1575 1526 -1.5951116000000e+00\r\n2631 1526 -1.7686457000000e+00\r\n421 1527  2.7117191000000e+00\r\n422 1527 -4.3929488000000e-01\r\n423 1527 -2.5209182000000e+00\r\n1479 1527 -2.6151855000000e+00\r\n1522 1527  7.5439876000000e+00\r\n1523 1527 -1.2221159000000e+00\r\n1524 1527 -2.7065491000000e+00\r\n1525 1527 -3.0292365000000e+02\r\n1526 1527  4.6920720000000e+01\r\n1527 1527  1.6132032000000e+01\r\n1530 1527 -2.5937775000000e+00\r\n1573 1527  3.5846591000000e+01\r\n1574 1527 -5.8070999000000e+00\r\n1575 1527 -2.6963746000000e+00\r\n2631 1527 -2.9897163000000e+00\r\n424 1528 -8.8398968000000e-04\r\n426 1528 -9.2257162000000e-06\r\n1480 1528 -7.6570254000000e-04\r\n1482 1528 -7.9912181000000e-06\r\n1525 1528 -8.0443630000000e-02\r\n1527 1528 -8.8651167000000e-06\r\n1528 1528  2.4846584000000e+02\r\n1530 1528  6.3445574000000e-04\r\n1531 1528 -7.6536868000000e-04\r\n1533 1528 -7.9877338000000e-06\r\n1576 1528 -7.2952815000000e-02\r\n1578 1528 -8.6533326000000e-06\r\n2632 1528 -4.6164921000000e-02\r\n2634 1528 -1.0907693000000e-05\r\n424 1529  1.3215054000000e+00\r\n426 1529 -1.5915783000000e+00\r\n1482 1529 -1.4497408000000e+00\r\n1525 1529  4.9241295000000e+00\r\n1527 1529 -1.5344165000000e+00\r\n1528 1529 -1.6654788000000e+02\r\n1529 1529 -4.7265374000000e+01\r\n1530 1529  9.3684860000000e+00\r\n1533 1529 -1.4015808000000e+00\r\n1576 1529  1.7675979000000e+01\r\n1578 1529 -1.4979855000000e+00\r\n2634 1529 -1.8879020000000e+00\r\n424 1530  2.2338727000000e+00\r\n425 1530 -3.6188685000000e-01\r\n426 1530 -2.6904039000000e+00\r\n1482 1530 -2.4506419000000e+00\r\n1525 1530  8.3237484000000e+00\r\n1526 1530 -1.3484453000000e+00\r\n1527 1530 -2.5937775000000e+00\r\n1528 1530 -2.8153254000000e+02\r\n1529 1530  4.3584773000000e+01\r\n1530 1530  1.5836487000000e+01\r\n1533 1530 -2.3692308000000e+00\r\n1576 1530  2.9879475000000e+01\r\n1577 1530 -4.8404679000000e+00\r\n1578 1530 -2.5321947000000e+00\r\n2634 1530 -3.1913095000000e+00\r\n427 1531 -9.7629545000000e-04\r\n429 1531 -1.0189061000000e-05\r\n1483 1531 -6.8368851000000e-04\r\n1485 1531 -7.1352826000000e-06\r\n1528 1531 -9.2297563000000e-02\r\n1530 1531 -7.9877338000000e-06\r\n1531 1531  2.2143450000000e+02\r\n1533 1531  5.6275922000000e-04\r\n1579 1531 -1.7879426000000e-02\r\n1581 1531 -7.7108176000000e-06\r\n2635 1531 -4.7265566000000e-02\r\n2637 1531 -1.2053366000000e-05\r\n427 1532  1.1575908000000e+00\r\n429 1532 -1.7831636000000e+00\r\n1485 1532 -1.3050280000000e+00\r\n1528 1532  4.5828135000000e+00\r\n1530 1532 -1.4015808000000e+00\r\n1531 1532 -1.4260298000000e+02\r\n1532 1532 -4.2130994000000e+01\r\n1533 1532  7.9625911000000e+00\r\n1579 1532  9.7432456000000e+00\r\n1581 1532 -1.3531654000000e+00\r\n2637 1532 -2.1149439000000e+00\r\n427 1533  1.9567904000000e+00\r\n428 1533 -3.1700217000000e-01\r\n429 1533 -3.0142581000000e+00\r\n1485 1533 -2.2060178000000e+00\r\n1528 1533  7.7467837000000e+00\r\n1529 1533 -1.2549874000000e+00\r\n1530 1533 -2.3692308000000e+00\r\n1531 1533 -2.4105594000000e+02\r\n1532 1533  3.7240289000000e+01\r\n1533 1533  1.3459956000000e+01\r\n1579 1533  1.6469973000000e+01\r\n1580 1533 -2.6681535000000e+00\r\n1581 1533 -2.2873895000000e+00\r\n2637 1533 -3.5750987000000e+00\r\n1534 1534  1.0000000000000e+00\r\n1535 1535  1.0000000000000e+00\r\n1536 1536  1.0000000000000e+00\r\n1537 1537  1.0000000000000e+00\r\n1538 1538  1.0000000000000e+00\r\n1539 1539  1.0000000000000e+00\r\n1540 1540  1.0000000000000e+00\r\n1541 1541  1.0000000000000e+00\r\n1542 1542  1.0000000000000e+00\r\n1543 1543  1.0000000000000e+00\r\n1544 1544  1.0000000000000e+00\r\n1545 1545  1.0000000000000e+00\r\n1546 1546  1.0000000000000e+00\r\n1547 1547  1.0000000000000e+00\r\n1548 1548  1.0000000000000e+00\r\n445 1549 -1.1469225000000e-03\r\n447 1549 -1.1969802000000e-05\r\n1501 1549 -7.1538059000000e-02\r\n1503 1549 -7.7799852000000e-06\r\n1549 1549  1.9983026000000e+02\r\n1551 1549  5.1535618000000e-04\r\n1552 1549 -4.3887336000000e-02\r\n1554 1549 -7.5037232000000e-06\r\n1597 1549 -6.4507151000000e-04\r\n1599 1549 -6.7322581000000e-06\r\n2653 1549 -4.8488816000000e-02\r\n2655 1549 -1.4188647000000e-05\r\n445 1550  1.0287243000000e+00\r\n447 1550 -1.9802948000000e+00\r\n1503 1550 -1.2892139000000e+00\r\n1549 1550 -1.2404451000000e+02\r\n1550 1550 -3.8042021000000e+01\r\n1551 1550  7.9546088000000e+00\r\n1552 1550  6.9714899000000e-01\r\n1554 1550 -1.2435723000000e+00\r\n1597 1550  7.6305992000000e+00\r\n1599 1550 -1.0858122000000e+00\r\n2655 1550 -2.3514563000000e+00\r\n445 1551  1.7389544000000e+00\r\n446 1551 -2.8170320000000e-01\r\n447 1551 -3.3474880000000e+00\r\n1503 1551 -2.1792857000000e+00\r\n1549 1551 -2.0968470000000e+02\r\n1550 1551  3.2281529000000e+01\r\n1551 1551  1.3446461000000e+01\r\n1552 1551  1.1784598000000e+00\r\n1553 1551 -1.9090548000000e-01\r\n1554 1551 -2.1021332000000e+00\r\n1597 1551  1.2898756000000e+01\r\n1598 1551 -2.0895436000000e+00\r\n1599 1551 -1.8354556000000e+00\r\n2655 1551 -3.9748983000000e+00\r\n448 1552 -1.0671973000000e-03\r\n450 1552 -1.1137754000000e-05\r\n1504 1552 -6.2085766000000e-03\r\n1506 1552 -8.2935881000000e-06\r\n1549 1552 -7.1899175000000e-04\r\n1551 1552 -7.5037232000000e-06\r\n1552 1552  2.1597555000000e+02\r\n1554 1552  5.6090580000000e-04\r\n1555 1552 -6.1745967000000e-02\r\n1557 1552 -8.1998813000000e-06\r\n1600 1552 -7.1997856000000e-04\r\n1602 1552 -7.5140220000000e-06\r\n2656 1552 -4.6791177000000e-02\r\n2658 1552 -1.3190472000000e-05\r\n448 1553  1.2852983000000e+00\r\n450 1553 -1.8368744000000e+00\r\n1506 1553 -1.3712112000000e+00\r\n1551 1553 -1.2435723000000e+00\r\n1552 1553 -1.4018058000000e+02\r\n1553 1553 -4.1122058000000e+01\r\n1554 1553  9.1927650000000e+00\r\n1555 1553  3.8809383000000e+00\r\n1557 1553 -1.3559021000000e+00\r\n1600 1553  1.1021295000000e+01\r\n1602 1553 -1.1995306000000e+00\r\n2658 1553 -2.1810716000000e+00\r\n448 1554  2.1726682000000e+00\r\n449 1554 -3.5196233000000e-01\r\n450 1554 -3.1050525000000e+00\r\n1506 1554 -2.3178955000000e+00\r\n1551 1554 -2.1021332000000e+00\r\n1552 1554 -2.3696125000000e+02\r\n1553 1554  3.6574131000000e+01\r\n1554 1554  1.5539449000000e+01\r\n1555 1554  6.5603381000000e+00\r\n1556 1554 -1.0627448000000e+00\r\n1557 1554 -2.2920168000000e+00\r\n1600 1554  1.8630397000000e+01\r\n1601 1554 -3.0180392000000e+00\r\n1602 1554 -2.0276865000000e+00\r\n2658 1554 -3.6868835000000e+00\r\n451 1555 -9.8095071000000e-04\r\n453 1555 -1.0237645000000e-05\r\n1507 1555 -8.2605548000000e-04\r\n1509 1555 -8.6210888000000e-06\r\n1552 1555 -7.8569623000000e-04\r\n1554 1555 -8.1998813000000e-06\r\n1555 1555  2.3762407000000e+02\r\n1557 1555  6.1174842000000e-04\r\n1558 1555 -9.6016617000000e-02\r\n1560 1555 -8.9917060000000e-06\r\n1603 1555 -3.8034348000000e-02\r\n1605 1555 -8.0120757000000e-06\r\n2659 1555 -4.2697007000000e-02\r\n2661 1555 -1.2107049000000e-05\r\n451 1556  1.8502484000000e+00\r\n453 1556 -1.6671745000000e+00\r\n1509 1556 -1.4735359000000e+00\r\n1554 1556 -1.3559021000000e+00\r\n1555 1556 -1.6037733000000e+02\r\n1556 1556 -4.5233550000000e+01\r\n1557 1556  9.2621788000000e+00\r\n1558 1556  6.5768912000000e+00\r\n1560 1556 -1.4703690000000e+00\r\n1603 1556  1.5556959000000e+01\r\n1605 1556 -1.3103950000000e+00\r\n2661 1556 -1.9797396000000e+00\r\n451 1557  3.1276573000000e+00\r\n452 1557 -5.0666325000000e-01\r\n453 1557 -2.8181894000000e+00\r\n1509 1557 -2.4908634000000e+00\r\n1554 1557 -2.2920168000000e+00\r\n1555 1557 -2.7110161000000e+02\r\n1556 1557  4.1924961000000e+01\r\n1557 1557  1.5656777000000e+01\r\n1558 1557  1.1117568000000e+01\r\n1559 1557 -1.8009847000000e+00\r\n1560 1557 -2.4855097000000e+00\r\n1603 1557  2.6297461000000e+01\r\n1604 1557 -4.2600436000000e+00\r\n1605 1557 -2.2150898000000e+00\r\n2661 1557 -3.3465496000000e+00\r\n454 1558 -9.3784308000000e-04\r\n456 1558 -9.7877547000000e-06\r\n1510 1558 -8.8034279000000e-04\r\n1512 1558 -9.1876557000000e-06\r\n1555 1558 -8.6156728000000e-04\r\n1557 1558 -8.9917060000000e-06\r\n1558 1558  2.5387027000000e+02\r\n1560 1558  6.5172112000000e-04\r\n1561 1558 -1.1131295000000e-01\r\n1563 1558 -9.7550158000000e-06\r\n1606 1558 -8.6572045000000e-02\r\n1608 1558 -8.9907933000000e-06\r\n2662 1558 -3.5557201000000e-02\r\n2664 1558 -1.1539199000000e-05\r\n454 1559  2.8964717000000e+00\r\n456 1559 -1.5621511000000e+00\r\n1512 1559 -1.5561203000000e+00\r\n1557 1559 -1.4703690000000e+00\r\n1558 1559 -1.7753410000000e+02\r\n1559 1559 -4.8317530000000e+01\r\n1560 1559  9.4613899000000e+00\r\n1561 1559  7.1354518000000e+00\r\n1563 1559 -1.5677348000000e+00\r\n1606 1559  2.1809515000000e+01\r\n1608 1559 -1.4451929000000e+00\r\n2664 1559 -1.8544138000000e+00\r\n454 1560  4.8961958000000e+00\r\n455 1560 -7.9314774000000e-01\r\n456 1560 -2.6406602000000e+00\r\n1512 1560 -2.6304658000000e+00\r\n1557 1560 -2.4855097000000e+00\r\n1558 1560 -3.0010364000000e+02\r\n1559 1560  4.6486840000000e+01\r\n1560 1560  1.5993531000000e+01\r\n1561 1560  1.2061768000000e+01\r\n1562 1560 -1.9539178000000e+00\r\n1563 1560 -2.6500988000000e+00\r\n1606 1560  3.6866804000000e+01\r\n1607 1560 -5.9721515000000e+00\r\n1608 1560 -2.4429541000000e+00\r\n2664 1560 -3.1347010000000e+00\r\n457 1561 -9.0089319000000e-04\r\n459 1561 -9.4021289000000e-06\r\n1513 1561 -9.1820244000000e-04\r\n1515 1561 -9.5827761000000e-06\r\n1558 1561 -9.3470610000000e-04\r\n1560 1561 -9.7550158000000e-06\r\n1561 1561  2.7005098000000e+02\r\n1563 1561  6.9134172000000e-04\r\n1564 1561 -4.9570185000000e-02\r\n1566 1561 -1.0246668000000e-05\r\n1609 1561 -1.4764679000000e-01\r\n1611 1561 -9.9586297000000e-06\r\n2665 1561 -2.6542630000000e-02\r\n2667 1561 -1.1035480000000e-05\r\n457 1562  4.2818111000000e+00\r\n459 1562 -1.4688418000000e+00\r\n1515 1562 -1.6075376000000e+00\r\n1560 1562 -1.5677348000000e+00\r\n1561 1562 -1.9255353000000e+02\r\n1562 1562 -5.1400549000000e+01\r\n1563 1562  9.5838566000000e+00\r\n1564 1562  3.9993039000000e+00\r\n1566 1562 -1.6182239000000e+00\r\n1609 1562  2.9278995000000e+01\r\n1611 1562 -1.5730491000000e+00\r\n2667 1562 -1.7427167000000e+00\r\n457 1563  7.2379693000000e+00\r\n458 1563 -1.1724858000000e+00\r\n459 1563 -2.4829287000000e+00\r\n1515 1563 -2.7173801000000e+00\r\n1560 1563 -2.6500988000000e+00\r\n1561 1563 -3.2549230000000e+02\r\n1562 1563  5.0465801000000e+01\r\n1563 1563  1.6200543000000e+01\r\n1564 1563  6.7604194000000e+00\r\n1565 1563 -1.0951270000000e+00\r\n1566 1563 -2.7354441000000e+00\r\n1609 1563  4.9493185000000e+01\r\n1610 1563 -8.0174499000000e+00\r\n1611 1563 -2.6590806000000e+00\r\n2667 1563 -2.9458861000000e+00\r\n460 1564 -9.1065197000000e-04\r\n462 1564 -9.5039760000000e-06\r\n1516 1564 -9.2322343000000e-04\r\n1518 1564 -9.6351775000000e-06\r\n1561 1564 -9.8181522000000e-04\r\n1563 1564 -1.0246668000000e-05\r\n1564 1564  2.7005242000000e+02\r\n1566 1564  6.9243691000000e-04\r\n1567 1564 -9.8558489000000e-04\r\n1569 1564 -1.0286010000000e-05\r\n1612 1564 -2.0590679000000e-01\r\n1614 1564 -1.0280249000000e-05\r\n2668 1564 -1.9502765000000e-02\r\n2670 1564 -1.1119317000000e-05\r\n460 1565  5.4598407000000e+00\r\n462 1565 -1.4671910000000e+00\r\n1518 1565 -1.6086679000000e+00\r\n1563 1565 -1.6182239000000e+00\r\n1564 1565 -1.9454466000000e+02\r\n1565 1565 -5.1401676000000e+01\r\n1566 1565  9.6671848000000e+00\r\n1569 1565 -1.6181589000000e+00\r\n1612 1565  3.4093072000000e+01\r\n1614 1565 -1.6091451000000e+00\r\n2670 1565 -1.7400448000000e+00\r\n460 1566  9.2293147000000e+00\r\n461 1566 -1.4950565000000e+00\r\n462 1566 -2.4801396000000e+00\r\n1518 1566 -2.7192922000000e+00\r\n1563 1566 -2.7354441000000e+00\r\n1564 1566 -3.2885829000000e+02\r\n1565 1566  5.1007865000000e+01\r\n1566 1566  1.6341406000000e+01\r\n1569 1566 -2.7353340000000e+00\r\n1612 1566  5.7630928000000e+01\r\n1613 1566 -9.3356331000000e+00\r\n1614 1566 -2.7200988000000e+00\r\n2670 1566 -2.9413717000000e+00\r\n463 1567 -9.0248425000000e-04\r\n465 1567 -9.4187340000000e-06\r\n1519 1567 -9.2151861000000e-04\r\n1521 1567 -9.6173852000000e-06\r\n1564 1567 -2.4568362000000e-02\r\n1566 1567 -1.0286010000000e-05\r\n1567 1567  2.7006275000000e+02\r\n1569 1567  6.9209336000000e-04\r\n1570 1567 -9.7191607000000e-04\r\n1572 1567 -1.0143356000000e-05\r\n1615 1567 -1.8675828000000e-01\r\n1617 1567 -1.0220960000000e-05\r\n2671 1567 -2.4154394000000e-02\r\n2673 1567 -1.1043669000000e-05\r\n463 1568  4.6256579000000e+00\r\n465 1568 -1.4648449000000e+00\r\n1521 1568 -1.6104834000000e+00\r\n1564 1568  2.3189631000000e+00\r\n1566 1568 -1.6181589000000e+00\r\n1567 1568 -1.9259145000000e+02\r\n1568 1568 -5.1400420000000e+01\r\n1569 1568  9.6626938000000e+00\r\n1572 1568 -1.6179695000000e+00\r\n1615 1568  3.0653316000000e+01\r\n1617 1568 -1.6082163000000e+00\r\n2673 1568 -1.7372681000000e+00\r\n463 1569  7.8192072000000e+00\r\n464 1569 -1.2666381000000e+00\r\n465 1569 -2.4761723000000e+00\r\n1521 1569 -2.7223596000000e+00\r\n1564 1569  3.9199728000000e+00\r\n1565 1569 -6.3499882000000e-01\r\n1566 1569 -2.7353340000000e+00\r\n1567 1569 -3.2555639000000e+02\r\n1568 1569  5.0476322000000e+01\r\n1569 1569  1.6333809000000e+01\r\n1572 1569 -2.7350156000000e+00\r\n1615 1569  5.1816332000000e+01\r\n1616 1569 -8.3937590000000e+00\r\n1617 1569 -2.7185272000000e+00\r\n2673 1569 -2.9366758000000e+00\r\n466 1570 -8.8562662000000e-04\r\n468 1570 -9.2428001000000e-06\r\n1522 1570 -9.1414414000000e-04\r\n1524 1570 -9.5404218000000e-06\r\n1567 1570 -7.6561930000000e-02\r\n1569 1570 -1.0143356000000e-05\r\n1570 1570  2.7010278000000e+02\r\n1572 1570  6.9121367000000e-04\r\n1573 1570 -9.5611433000000e-04\r\n1575 1570 -9.9784417000000e-06\r\n1618 1570 -1.6525313000000e-01\r\n1620 1570 -1.0082749000000e-05\r\n2674 1570 -3.2290073000000e-02\r\n2676 1570 -1.0869548000000e-05\r\n466 1571  3.3381173000000e+00\r\n468 1571 -1.4618491000000e+00\r\n1524 1571 -1.6117570000000e+00\r\n1567 1571  5.8761202000000e+00\r\n1569 1571 -1.6179695000000e+00\r\n1570 1571 -1.9042826000000e+02\r\n1571 1571 -5.1399319000000e+01\r\n1572 1571  9.6569757000000e+00\r\n1575 1571 -1.6173807000000e+00\r\n1618 1571  2.6218808000000e+01\r\n1620 1571 -1.6085433000000e+00\r\n2676 1571 -1.7337240000000e+00\r\n466 1572  5.6427535000000e+00\r\n467 1572 -9.1408041000000e-01\r\n468 1572 -2.4711096000000e+00\r\n1524 1572 -2.7245140000000e+00\r\n1567 1572  9.9329935000000e+00\r\n1568 1572 -1.6090646000000e+00\r\n1569 1572 -2.7350156000000e+00\r\n1570 1572 -3.2189992000000e+02\r\n1571 1572  4.9887176000000e+01\r\n1572 1572  1.6324150000000e+01\r\n1575 1572 -2.7340189000000e+00\r\n1618 1572  4.4320273000000e+01\r\n1619 1572 -7.1795256000000e+00\r\n1620 1572 -2.7190816000000e+00\r\n2676 1572 -2.9306871000000e+00\r\n469 1573 -8.6975225000000e-04\r\n471 1573 -9.0771279000000e-06\r\n1525 1573 -8.9459169000000e-04\r\n1527 1573 -9.3363636000000e-06\r\n1570 1573 -9.4315298000000e-02\r\n1572 1573 -9.9784417000000e-06\r\n1573 1573  2.7010058000000e+02\r\n1575 1573  6.8985677000000e-04\r\n1576 1573 -9.0942543000000e-04\r\n1578 1573 -9.4911753000000e-06\r\n1621 1573 -1.3796283000000e-01\r\n1623 1573 -9.9224252000000e-06\r\n2677 1573 -3.8943053000000e-02\r\n2679 1573 -1.0703731000000e-05\r\n469 1574  2.3525033000000e+00\r\n471 1574 -1.4625507000000e+00\r\n1527 1574 -1.5951116000000e+00\r\n1570 1574  6.8457526000000e+00\r\n1572 1574 -1.6173807000000e+00\r\n1573 1574 -1.8773039000000e+02\r\n1574 1574 -5.1398707000000e+01\r\n1575 1574  9.5914529000000e+00\r\n1578 1574 -1.5672576000000e+00\r\n1621 1574  2.3535825000000e+01\r\n1623 1574 -1.6085332000000e+00\r\n2679 1574 -1.7348672000000e+00\r\n469 1575  3.9766696000000e+00\r\n470 1575 -6.4419486000000e-01\r\n471 1575 -2.4722944000000e+00\r\n1527 1575 -2.6963746000000e+00\r\n1570 1575  1.1572054000000e+01\r\n1571 1575 -1.8745984000000e+00\r\n1572 1575 -2.7340189000000e+00\r\n1573 1575 -3.1733928000000e+02\r\n1574 1575  4.9150588000000e+01\r\n1575 1575  1.6213383000000e+01\r\n1578 1575 -2.6492923000000e+00\r\n1621 1575  3.9784937000000e+01\r\n1622 1575 -6.4449045000000e+00\r\n1623 1575 -2.7190631000000e+00\r\n2679 1575 -2.9326171000000e+00\r\n472 1576 -9.0582650000000e-04\r\n474 1576 -9.4536151000000e-06\r\n1528 1576 -8.2914502000000e-04\r\n1530 1576 -8.6533326000000e-06\r\n1573 1576 -1.2133851000000e-01\r\n1575 1576 -9.4911753000000e-06\r\n1576 1576  2.5395488000000e+02\r\n1578 1576  6.4999981000000e-04\r\n1579 1576 -8.1695519000000e-04\r\n1581 1576 -8.5261140000000e-06\r\n1624 1576 -1.5291237000000e-01\r\n1626 1576 -9.2566637000000e-06\r\n2680 1576 -4.2703690000000e-02\r\n2682 1576 -1.1163654000000e-05\r\n472 1577  1.8001589000000e+00\r\n474 1577 -1.5542434000000e+00\r\n1530 1577 -1.4979855000000e+00\r\n1573 1577  7.3708350000000e+00\r\n1575 1577 -1.5672576000000e+00\r\n1576 1577 -1.7841532000000e+02\r\n1577 1577 -4.8316631000000e+01\r\n1578 1577  9.4500405000000e+00\r\n1581 1577 -1.4529925000000e+00\r\n1624 1577  2.3550095000000e+01\r\n1626 1577 -1.5287703000000e+00\r\n2682 1577 -1.8433836000000e+00\r\n472 1578  3.0429885000000e+00\r\n473 1578 -4.9294985000000e-01\r\n474 1578 -2.6272931000000e+00\r\n1530 1578 -2.5321947000000e+00\r\n1573 1578  1.2459659000000e+01\r\n1574 1578 -2.0184063000000e+00\r\n1575 1578 -2.6492923000000e+00\r\n1576 1578 -3.0159326000000e+02\r\n1577 1578  4.6731329000000e+01\r\n1578 1578  1.5974347000000e+01\r\n1581 1578 -2.4561369000000e+00\r\n1624 1578  3.9809080000000e+01\r\n1625 1578 -6.4488840000000e+00\r\n1626 1578 -2.5842333000000e+00\r\n2682 1578 -3.1160556000000e+00\r\n475 1579 -9.5879409000000e-04\r\n477 1579 -1.0006409000000e-05\r\n1531 1579 -7.3883512000000e-04\r\n1533 1579 -7.7108176000000e-06\r\n1576 1579 -1.4722774000000e-01\r\n1578 1579 -8.5261140000000e-06\r\n1579 1579  2.3224678000000e+02\r\n1581 1579  5.8100696000000e-04\r\n2683 1579 -4.5977340000000e-02\r\n2685 1579 -1.1828495000000e-05\r\n475 1580  1.3378595000000e+00\r\n477 1580 -1.6997381000000e+00\r\n1533 1580 -1.3531654000000e+00\r\n1576 1580  1.1432940000000e+01\r\n1578 1580 -1.4529925000000e+00\r\n1579 1580 -1.4606883000000e+02\r\n1580 1580 -4.4202421000000e+01\r\n1581 1580  6.5265189000000e+00\r\n2685 1580 -2.0156766000000e+00\r\n475 1581  2.2615161000000e+00\r\n476 1581 -3.6636200000000e-01\r\n477 1581 -2.8732354000000e+00\r\n1533 1581 -2.2873895000000e+00\r\n1576 1581  1.9326230000000e+01\r\n1577 1581 -3.1308183000000e+00\r\n1578 1581 -2.4561369000000e+00\r\n1579 1581 -2.4691459000000e+02\r\n1580 1581  3.8060785000000e+01\r\n1581 1581  1.1032421000000e+01\r\n2685 1581 -3.4072979000000e+00\r\n1582 1582  1.0000000000000e+00\r\n1583 1583  1.0000000000000e+00\r\n1584 1584  1.0000000000000e+00\r\n1585 1585  1.0000000000000e+00\r\n1586 1586  1.0000000000000e+00\r\n1587 1587  1.0000000000000e+00\r\n1588 1588  1.0000000000000e+00\r\n1589 1589  1.0000000000000e+00\r\n1590 1590  1.0000000000000e+00\r\n1591 1591  1.0000000000000e+00\r\n1592 1592  1.0000000000000e+00\r\n1593 1593  1.0000000000000e+00\r\n1594 1594  1.0000000000000e+00\r\n1595 1595  1.0000000000000e+00\r\n1596 1596  1.0000000000000e+00\r\n493 1597 -1.4028493000000e-03\r\n495 1597 -1.4640770000000e-05\r\n1549 1597 -1.2626206000000e-02\r\n1551 1597 -6.7322581000000e-06\r\n1597 1597  1.6737565000000e+02\r\n1599 1597  4.4266306000000e-04\r\n1600 1597 -4.1726548000000e-02\r\n1602 1597 -6.5970170000000e-06\r\n1645 1597 -5.6705978000000e-04\r\n1647 1597 -5.9180924000000e-06\r\n2701 1597 -4.8243544000000e-02\r\n2703 1597 -1.7355340000000e-05\r\n493 1598  1.0597904000000e+00\r\n495 1598 -2.3587909000000e+00\r\n1551 1598 -1.0858122000000e+00\r\n1597 1598 -1.0603673000000e+02\r\n1598 1598 -3.1887467000000e+01\r\n1599 1598  8.2435414000000e+00\r\n1600 1598  2.8951741000000e+00\r\n1602 1598 -1.0641238000000e+00\r\n1645 1598  6.0116601000000e+00\r\n1647 1598 -9.3182338000000e-01\r\n2703 1598 -2.7994161000000e+00\r\n493 1599  1.7914685000000e+00\r\n494 1599 -2.9020548000000e-01\r\n495 1599 -3.9872974000000e+00\r\n1551 1599 -1.8354556000000e+00\r\n1597 1599 -1.7924437000000e+02\r\n1598 1599  2.7588098000000e+01\r\n1599 1599  1.3934873000000e+01\r\n1600 1599  4.8939990000000e+00\r\n1601 1599 -7.9279391000000e-01\r\n1602 1599 -1.7987936000000e+00\r\n1645 1599  1.0162103000000e+01\r\n1646 1599 -1.6461903000000e+00\r\n1647 1599 -1.5751531000000e+00\r\n2703 1599 -4.7321305000000e+00\r\n496 1600 -1.2576456000000e-03\r\n498 1600 -1.3125358000000e-05\r\n1552 1600 -9.2589174000000e-03\r\n1554 1600 -7.5140220000000e-06\r\n1597 1600 -6.3211298000000e-04\r\n1599 1600 -6.5970170000000e-06\r\n1600 1600  1.8902105000000e+02\r\n1602 1600  4.9862145000000e-04\r\n1603 1600 -9.5628774000000e-02\r\n1605 1600 -7.3856317000000e-06\r\n1648 1600 -1.4988432000000e-02\r\n1650 1600 -6.5290539000000e-06\r\n2704 1600 -4.4944929000000e-02\r\n2706 1600 -1.5540863000000e-05\r\n496 1601  1.5156651000000e+00\r\n498 1601 -2.0902235000000e+00\r\n1554 1601 -1.1995306000000e+00\r\n1599 1601 -1.0641238000000e+00\r\n1600 1601 -1.2523525000000e+02\r\n1601 1601 -3.6002030000000e+01\r\n1602 1601  9.0609038000000e+00\r\n1603 1601  6.5392851000000e+00\r\n1605 1601 -1.1792028000000e+00\r\n1648 1601  8.7142602000000e+00\r\n1650 1601 -1.0425703000000e+00\r\n2706 1601 -2.4812165000000e+00\r\n496 1602  2.5620804000000e+00\r\n497 1602 -4.1503644000000e-01\r\n498 1602 -3.5333138000000e+00\r\n1554 1602 -2.0276865000000e+00\r\n1599 1602 -1.7987936000000e+00\r\n1600 1602 -2.1169766000000e+02\r\n1601 1602  3.2657959000000e+01\r\n1602 1602  1.5316551000000e+01\r\n1603 1602  1.1054008000000e+01\r\n1604 1602 -1.7906604000000e+00\r\n1605 1602 -1.9933245000000e+00\r\n1648 1602  1.4730585000000e+01\r\n1649 1602 -2.3862365000000e+00\r\n1650 1602 -1.7623608000000e+00\r\n2706 1602 -4.1942484000000e+00\r\n499 1603 -1.1872176000000e-03\r\n501 1603 -1.2390340000000e-05\r\n1555 1603 -7.6770106000000e-04\r\n1557 1603 -8.0120757000000e-06\r\n1600 1603 -7.0767646000000e-04\r\n1602 1603 -7.3856317000000e-06\r\n1603 1603  2.0524886000000e+02\r\n1605 1603  5.3797809000000e-04\r\n1606 1603 -1.2557096000000e-01\r\n1608 1603 -8.3489597000000e-06\r\n1651 1603 -4.2672522000000e-02\r\n1653 1603 -7.3950702000000e-06\r\n2707 1603 -3.6136438000000e-02\r\n2709 1603 -1.4627561000000e-05\r\n499 1604  2.7846523000000e+00\r\n501 1604 -1.9272396000000e+00\r\n1557 1604 -1.3103950000000e+00\r\n1602 1604 -1.1792028000000e+00\r\n1603 1604 -1.4376079000000e+02\r\n1604 1604 -3.9087761000000e+01\r\n1605 1604  9.1712597000000e+00\r\n1606 1604  1.0042669000000e+01\r\n1608 1604 -1.3057448000000e+00\r\n1651 1604  1.3170317000000e+01\r\n1653 1604 -1.1567119000000e+00\r\n2709 1604 -2.2875832000000e+00\r\n499 1605  4.7071732000000e+00\r\n500 1605 -7.6251491000000e-01\r\n501 1605 -3.2578037000000e+00\r\n1557 1605 -2.2150898000000e+00\r\n1602 1605 -1.9933245000000e+00\r\n1603 1605 -2.4301308000000e+02\r\n1604 1605  3.7590468000000e+01\r\n1605 1605  1.5503089000000e+01\r\n1606 1605  1.6976116000000e+01\r\n1607 1605 -2.7499606000000e+00\r\n1608 1605 -2.2072296000000e+00\r\n1651 1605  2.2263089000000e+01\r\n1652 1605 -3.6063975000000e+00\r\n1653 1605 -1.9553045000000e+00\r\n2709 1605 -3.8669288000000e+00\r\n502 1606 -1.0819594000000e-03\r\n504 1606 -1.1291817000000e-05\r\n1558 1606 -8.6147983000000e-04\r\n1560 1606 -8.9907933000000e-06\r\n1603 1606 -7.9998062000000e-04\r\n1605 1606 -8.3489597000000e-06\r\n1606 1606  2.3233074000000e+02\r\n1608 1606  6.0306568000000e-04\r\n1609 1606 -1.5408543000000e-01\r\n1611 1606 -9.6579554000000e-06\r\n1654 1606 -1.3601395000000e-01\r\n1656 1606 -8.5524443000000e-06\r\n2710 1606 -1.9913327000000e-02\r\n2712 1606 -1.3258716000000e-05\r\n502 1607  5.1966535000000e+00\r\n504 1607 -1.6980784000000e+00\r\n1560 1607 -1.4451929000000e+00\r\n1605 1607 -1.3057448000000e+00\r\n1606 1607 -1.7083276000000e+02\r\n1607 1607 -4.4233502000000e+01\r\n1608 1607  9.2379422000000e+00\r\n1609 1607  1.1851465000000e+01\r\n1611 1607 -1.4681910000000e+00\r\n1654 1607  2.0530332000000e+01\r\n1656 1607 -1.3003019000000e+00\r\n2712 1607 -2.0154729000000e+00\r\n502 1608  8.7844231000000e+00\r\n503 1608 -1.4229619000000e+00\r\n504 1608 -2.8704318000000e+00\r\n1560 1608 -2.4429541000000e+00\r\n1605 1608 -2.2072296000000e+00\r\n1606 1608 -2.8877570000000e+02\r\n1607 1608  4.4762455000000e+01\r\n1608 1608  1.5615816000000e+01\r\n1609 1608  2.0033716000000e+01\r\n1610 1608 -3.2452005000000e+00\r\n1611 1608 -2.4818300000000e+00\r\n1654 1608  3.4704472000000e+01\r\n1655 1608 -5.6216716000000e+00\r\n1656 1608 -2.1980304000000e+00\r\n2712 1608 -3.4069554000000e+00\r\n505 1609 -2.6456252000000e-02\r\n507 1609 -1.0330459000000e-05\r\n1561 1609 -9.5421598000000e-04\r\n1563 1609 -9.9586297000000e-06\r\n1606 1609 -9.2540597000000e-04\r\n1608 1609 -9.6579554000000e-06\r\n1609 1609  2.5933862000000e+02\r\n1611 1609  6.6893971000000e-04\r\n1612 1609 -1.0266790000000e-01\r\n1614 1609 -1.0736130000000e-05\r\n1657 1609 -2.1242437000000e-01\r\n1659 1609 -1.0013213000000e-05\r\n2713 1609 -1.1620610000000e-03\r\n2715 1609 -1.2127795000000e-05\r\n505 1610  9.0270468000000e+00\r\n507 1610 -1.5257493000000e+00\r\n1563 1610 -1.5730491000000e+00\r\n1608 1610 -1.4681910000000e+00\r\n1609 1610 -1.9814194000000e+02\r\n1610 1610 -4.9379196000000e+01\r\n1611 1610  9.4479177000000e+00\r\n1612 1610  7.9992192000000e+00\r\n1614 1610 -1.5855539000000e+00\r\n1657 1610  3.2370162000000e+01\r\n1659 1610 -1.4790745000000e+00\r\n2715 1610 -1.8107620000000e+00\r\n505 1611  1.5259307000000e+01\r\n506 1611 -2.4717635000000e+00\r\n507 1611 -2.5791245000000e+00\r\n1563 1611 -2.6590806000000e+00\r\n1608 1611 -2.4818300000000e+00\r\n1609 1611 -3.3493888000000e+02\r\n1610 1611  5.1999266000000e+01\r\n1611 1611  1.5970750000000e+01\r\n1612 1611  1.3521870000000e+01\r\n1613 1611 -2.1903262000000e+00\r\n1614 1611 -2.6802181000000e+00\r\n1657 1611  5.4718480000000e+01\r\n1658 1611 -8.8635174000000e+00\r\n1659 1611 -2.5002256000000e+00\r\n2715 1611 -3.0609100000000e+00\r\n508 1612 -6.7715004000000e-02\r\n510 1612 -1.0068303000000e-05\r\n1564 1612 -9.8503287000000e-04\r\n1566 1612 -1.0280249000000e-05\r\n1609 1612 -1.0287145000000e-03\r\n1611 1612 -1.0736130000000e-05\r\n1612 1612  2.7021955000000e+02\r\n1614 1612  6.9634780000000e-04\r\n1615 1612 -1.0557024000000e-03\r\n1617 1612 -1.1017788000000e-05\r\n1660 1612 -3.6415174000000e-01\r\n1662 1612 -1.1100880000000e-05\r\n2716 1612 -1.1272357000000e-03\r\n2718 1612 -1.1764342000000e-05\r\n508 1613  1.3074018000000e+01\r\n510 1613 -1.4613155000000e+00\r\n1566 1613 -1.6091451000000e+00\r\n1611 1613 -1.5855539000000e+00\r\n1612 1613 -2.1305004000000e+02\r\n1613 1613 -5.1438365000000e+01\r\n1614 1613  9.6248333000000e+00\r\n1617 1613 -1.6186598000000e+00\r\n1660 1613  4.5035434000000e+01\r\n1662 1613 -1.6113632000000e+00\r\n2718 1613 -1.7330264000000e+00\r\n508 1614  2.2100320000000e+01\r\n509 1614 -3.5798534000000e+00\r\n510 1614 -2.4702077000000e+00\r\n1566 1614 -2.7200988000000e+00\r\n1611 1614 -2.6802181000000e+00\r\n1612 1614 -3.6013979000000e+02\r\n1613 1614  5.5982322000000e+01\r\n1614 1614  1.6269814000000e+01\r\n1617 1614 -2.7361804000000e+00\r\n1660 1614  7.6127896000000e+01\r\n1661 1614 -1.2331347000000e+01\r\n1662 1614 -2.7238483000000e+00\r\n2718 1614 -2.9295078000000e+00\r\n511 1615 -3.1451497000000e-02\r\n513 1615 -9.9726638000000e-06\r\n1567 1615 -9.7935191000000e-04\r\n1569 1615 -1.0220960000000e-05\r\n1612 1615 -4.3788619000000e-02\r\n1614 1615 -1.1017788000000e-05\r\n1615 1615  2.7009141000000e+02\r\n1617 1615  6.9600893000000e-04\r\n1618 1615 -1.0320963000000e-03\r\n1620 1615 -1.0771424000000e-05\r\n1663 1615 -2.2408230000000e-01\r\n1665 1615 -1.0960101000000e-05\r\n2719 1615 -1.1200582000000e-03\r\n2721 1615 -1.1689435000000e-05\r\n511 1616  9.5237157000000e+00\r\n513 1616 -1.4651993000000e+00\r\n1569 1616 -1.6082163000000e+00\r\n1612 1616  5.7618926000000e+00\r\n1614 1616 -1.6186598000000e+00\r\n1615 1616 -2.0458147000000e+02\r\n1616 1616 -5.1433248000000e+01\r\n1617 1616  9.6644380000000e+00\r\n1620 1616 -1.6184823000000e+00\r\n1663 1616  3.4348042000000e+01\r\n1665 1616 -1.6104571000000e+00\r\n2721 1616 -1.7376559000000e+00\r\n511 1617  1.6098875000000e+01\r\n512 1617 -2.6077513000000e+00\r\n513 1617 -2.4767708000000e+00\r\n1569 1617 -2.7185272000000e+00\r\n1612 1617  9.7398956000000e+00\r\n1613 1617 -1.5777018000000e+00\r\n1614 1617 -2.7361804000000e+00\r\n1615 1617 -3.4582425000000e+02\r\n1616 1617  5.3676628000000e+01\r\n1617 1617  1.6336756000000e+01\r\n1620 1617 -2.7358825000000e+00\r\n1663 1617  5.8061886000000e+01\r\n1664 1617 -9.4050628000000e+00\r\n1665 1617 -2.7223145000000e+00\r\n2721 1617 -2.9373322000000e+00\r\n514 1618 -9.4927803000000e-04\r\n516 1618 -9.9070950000000e-06\r\n1570 1618 -9.6610888000000e-04\r\n1572 1618 -1.0082749000000e-05\r\n1615 1618 -9.8287232000000e-02\r\n1617 1618 -1.0771424000000e-05\r\n1618 1618  2.7003821000000e+02\r\n1620 1618  6.9496775000000e-04\r\n1621 1618 -1.0100503000000e-03\r\n1623 1618 -1.0541342000000e-05\r\n1666 1618 -1.2446857000000e-01\r\n1668 1618 -1.0709992000000e-05\r\n2722 1618 -1.6260742000000e-02\r\n2724 1618 -1.1586719000000e-05\r\n514 1619  5.8398884000000e+00\r\n516 1619 -1.4678694000000e+00\r\n1572 1619 -1.6085433000000e+00\r\n1615 1619  1.0345519000000e+01\r\n1617 1619 -1.6184823000000e+00\r\n1618 1619 -1.9723158000000e+02\r\n1619 1619 -5.1426699000000e+01\r\n1620 1619  9.6690332000000e+00\r\n1623 1619 -1.6180395000000e+00\r\n1666 1619  2.6089067000000e+01\r\n1668 1619 -1.6094869000000e+00\r\n2724 1619 -1.7408475000000e+00\r\n514 1620  9.8717472000000e+00\r\n515 1620 -1.5990822000000e+00\r\n516 1620 -2.4812864000000e+00\r\n1572 1620 -2.7190816000000e+00\r\n1615 1620  1.7488065000000e+01\r\n1616 1620 -2.8328170000000e+00\r\n1617 1620 -2.7358825000000e+00\r\n1618 1620 -3.3340025000000e+02\r\n1619 1620  5.1680985000000e+01\r\n1620 1620  1.6344532000000e+01\r\n1623 1620 -2.7351320000000e+00\r\n1666 1620  4.4100959000000e+01\r\n1667 1620 -7.1437259000000e+00\r\n1668 1620 -2.7206767000000e+00\r\n2724 1620 -2.9427286000000e+00\r\n517 1621 -9.2465410000000e-04\r\n519 1621 -9.6501086000000e-06\r\n1573 1621 -9.5074694000000e-04\r\n1575 1621 -9.9224252000000e-06\r\n1618 1621 -1.2181232000000e-01\r\n1620 1621 -1.0541342000000e-05\r\n1621 1621  2.7003369000000e+02\r\n1623 1621  6.9347917000000e-04\r\n1624 1621 -9.7504882000000e-04\r\n1626 1621 -1.0176051000000e-05\r\n1669 1621 -7.9817295000000e-02\r\n1671 1621 -1.0486731000000e-05\r\n2725 1621 -3.0551219000000e-02\r\n2727 1621 -1.1345441000000e-05\r\n517 1622  3.6187819000000e+00\r\n519 1622 -1.4681648000000e+00\r\n1575 1622 -1.6085332000000e+00\r\n1618 1622  9.5462132000000e+00\r\n1620 1622 -1.6180395000000e+00\r\n1621 1622 -1.8982629000000e+02\r\n1622 1622 -5.1424648000000e+01\r\n1623 1622  9.6365862000000e+00\r\n1626 1622 -1.5848009000000e+00\r\n1669 1622  2.1701004000000e+01\r\n1671 1622 -1.6099108000000e+00\r\n2727 1622 -1.7413736000000e+00\r\n517 1623  6.1171845000000e+00\r\n518 1623 -9.9091094000000e-01\r\n519 1623 -2.4817839000000e+00\r\n1575 1623 -2.7190631000000e+00\r\n1618 1623  1.6136907000000e+01\r\n1619 1623 -2.6139865000000e+00\r\n1620 1623 -2.7351320000000e+00\r\n1621 1623 -3.2088212000000e+02\r\n1622 1623  4.9659240000000e+01\r\n1623 1623  1.6289676000000e+01\r\n1626 1623 -2.6789474000000e+00\r\n1669 1623  3.6683350000000e+01\r\n1670 1623 -5.9422651000000e+00\r\n1671 1623 -2.7213913000000e+00\r\n2727 1623 -2.9436164000000e+00\r\n520 1624 -9.4686439000000e-04\r\n522 1624 -9.8819052000000e-06\r\n1576 1624 -8.8695501000000e-04\r\n1578 1624 -9.2566637000000e-06\r\n1621 1624 -1.0010991000000e-01\r\n1623 1624 -1.0176051000000e-05\r\n1624 1624  2.5920303000000e+02\r\n1626 1624  6.5708136000000e-04\r\n1672 1624 -5.8725439000000e-02\r\n1674 1624 -1.0028607000000e-05\r\n2728 1624 -3.6772028000000e-02\r\n2730 1624 -1.1644704000000e-05\r\n520 1625  2.6940643000000e+00\r\n522 1625 -1.5292250000000e+00\r\n1578 1625 -1.5287703000000e+00\r\n1621 1625  6.2274337000000e+00\r\n1623 1625 -1.5848009000000e+00\r\n1624 1625 -1.7666489000000e+02\r\n1625 1625 -4.9368903000000e+01\r\n1626 1625  8.0239023000000e+00\r\n1672 1625  1.8983067000000e+01\r\n1674 1625 -1.5621015000000e+00\r\n2730 1625 -1.8134713000000e+00\r\n520 1626  4.5540463000000e+00\r\n521 1626 -7.3770750000000e-01\r\n522 1626 -2.5850020000000e+00\r\n1578 1626 -2.5842333000000e+00\r\n1621 1626  1.0526854000000e+01\r\n1622 1626 -1.7052394000000e+00\r\n1623 1626 -2.6789474000000e+00\r\n1624 1626 -2.9863434000000e+02\r\n1625 1626  4.6145579000000e+01\r\n1626 1626  1.3563604000000e+01\r\n1672 1626  3.2088976000000e+01\r\n1673 1626 -5.1980760000000e+00\r\n1674 1626 -2.6405763000000e+00\r\n2730 1626 -3.0654918000000e+00\r\n1627 1627  1.0000000000000e+00\r\n1628 1628  1.0000000000000e+00\r\n1629 1629  1.0000000000000e+00\r\n1630 1630  1.0000000000000e+00\r\n1631 1631  1.0000000000000e+00\r\n1632 1632  1.0000000000000e+00\r\n1633 1633  1.0000000000000e+00\r\n1634 1634  1.0000000000000e+00\r\n1635 1635  1.0000000000000e+00\r\n1636 1636  1.0000000000000e+00\r\n1637 1637  1.0000000000000e+00\r\n1638 1638  1.0000000000000e+00\r\n1639 1639  1.0000000000000e+00\r\n1640 1640  1.0000000000000e+00\r\n1641 1641  1.0000000000000e+00\r\n1642 1642  1.0000000000000e+00\r\n1643 1643  1.0000000000000e+00\r\n1644 1644  1.0000000000000e+00\r\n541 1645 -1.6444165000000e-03\r\n543 1645 -1.7161875000000e-05\r\n1597 1645 -4.3774437000000e-03\r\n1599 1645 -5.9180924000000e-06\r\n1645 1645  1.4578467000000e+02\r\n1647 1645  3.9539125000000e-04\r\n1648 1645 -5.2525336000000e-02\r\n1650 1645 -5.8435869000000e-06\r\n1693 1645 -1.6373276000000e-03\r\n1695 1645 -5.2194194000000e-06\r\n2749 1645 -4.8402572000000e-02\r\n2751 1645 -2.0336349000000e-05\r\n541 1646  1.0288629000000e+00\r\n543 1646 -2.6992882000000e+00\r\n1599 1646 -9.3182338000000e-01\r\n1645 1646 -9.1799685000000e+01\r\n1646 1646 -2.7783778000000e+01\r\n1647 1646  8.5786460000000e+00\r\n1648 1646  4.2579789000000e+00\r\n1650 1646 -9.2019439000000e-01\r\n1693 1646  2.8539434000000e+00\r\n1695 1646 -8.2194276000000e-01\r\n2751 1646 -3.2022787000000e+00\r\n541 1647  1.7391889000000e+00\r\n542 1647 -2.8173234000000e-01\r\n543 1647 -4.5628743000000e+00\r\n1599 1647 -1.5751531000000e+00\r\n1645 1647 -1.5517811000000e+02\r\n1646 1647  2.3849486000000e+01\r\n1647 1647  1.4501334000000e+01\r\n1648 1647  7.1976838000000e+00\r\n1649 1647 -1.1659574000000e+00\r\n1650 1647 -1.5554957000000e+00\r\n1693 1647  4.8243035000000e+00\r\n1694 1647 -7.8149195000000e-01\r\n1695 1647 -1.3894113000000e+00\r\n2751 1647 -5.4131281000000e+00\r\n544 1648 -1.5090144000000e-03\r\n546 1648 -1.5748757000000e-05\r\n1600 1648 -6.2560088000000e-04\r\n1602 1648 -6.5290539000000e-06\r\n1645 1648 -5.5992081000000e-04\r\n1647 1648 -5.8435869000000e-06\r\n1648 1648  1.6202622000000e+02\r\n1650 1648  4.3815254000000e-04\r\n1651 1648 -1.0683496000000e-01\r\n1653 1648 -6.6625540000000e-06\r\n1696 1648 -1.2933066000000e-02\r\n1698 1648 -5.9343868000000e-06\r\n2752 1648 -4.2824486000000e-02\r\n2754 1648 -1.8637995000000e-05\r\n544 1649  1.8112808000000e+00\r\n546 1649 -2.4314260000000e+00\r\n1602 1649 -1.0425703000000e+00\r\n1647 1649 -9.2019439000000e-01\r\n1648 1649 -1.0877024000000e+02\r\n1649 1649 -3.0872090000000e+01\r\n1650 1649  9.2324532000000e+00\r\n1651 1649  8.8405414000000e+00\r\n1653 1649 -1.0313028000000e+00\r\n1696 1649  5.1659370000000e+00\r\n1698 1649 -9.1863870000000e-01\r\n2754 1649 -2.8848554000000e+00\r\n544 1650  3.0617890000000e+00\r\n545 1650 -4.9597554000000e-01\r\n546 1650 -4.1100826000000e+00\r\n1602 1650 -1.7623608000000e+00\r\n1647 1650 -1.5554957000000e+00\r\n1648 1650 -1.8386522000000e+02\r\n1649 1650  2.8349994000000e+01\r\n1650 1650  1.5606538000000e+01\r\n1651 1650  1.4944051000000e+01\r\n1652 1650 -2.4207689000000e+00\r\n1653 1650 -1.7433142000000e+00\r\n1696 1650  8.7324999000000e+00\r\n1697 1650 -1.4145672000000e+00\r\n1698 1650 -1.5528669000000e+00\r\n2754 1650 -4.8765596000000e+00\r\n547 1651 -1.3821334000000e-03\r\n549 1651 -1.4424569000000e-05\r\n1603 1651 -7.0858084000000e-04\r\n1605 1651 -7.3950702000000e-06\r\n1648 1651 -6.3839260000000e-04\r\n1650 1651 -6.6625540000000e-06\r\n1651 1651  1.8368970000000e+02\r\n1653 1651  4.8940519000000e-04\r\n1654 1651 -1.9026575000000e-01\r\n1656 1651 -7.7383422000000e-06\r\n1699 1651 -3.0179617000000e-02\r\n1701 1651 -6.8637821000000e-06\r\n2755 1651 -2.7383811000000e-02\r\n2757 1651 -1.7008204000000e-05\r\n547 1652  4.0665688000000e+00\r\n549 1652 -2.1501943000000e+00\r\n1605 1652 -1.1567119000000e+00\r\n1650 1652 -1.0313028000000e+00\r\n1651 1652 -1.3193041000000e+02\r\n1652 1652 -3.4991172000000e+01\r\n1653 1652  9.0855690000000e+00\r\n1654 1652  1.4042325000000e+01\r\n1656 1652 -1.1612148000000e+00\r\n1699 1652  8.4795271000000e+00\r\n1701 1652 -1.0300719000000e+00\r\n2757 1652 -2.5521445000000e+00\r\n547 1653  6.8741223000000e+00\r\n548 1653 -1.1135093000000e+00\r\n549 1653 -3.6346854000000e+00\r\n1605 1653 -1.9553045000000e+00\r\n1650 1653 -1.7433142000000e+00\r\n1651 1653 -2.2301501000000e+02\r\n1652 1653  3.4492949000000e+01\r\n1653 1653  1.5358235000000e+01\r\n1654 1653  2.3737128000000e+01\r\n1655 1653 -3.8450744000000e+00\r\n1656 1653 -1.9629160000000e+00\r\n1699 1653  1.4333783000000e+01\r\n1700 1653 -2.3218674000000e+00\r\n1701 1653 -1.7412321000000e+00\r\n2757 1653 -4.3141417000000e+00\r\n550 1654 -3.3803668000000e-02\r\n552 1654 -1.3399561000000e-05\r\n1606 1654 -8.1947810000000e-04\r\n1608 1654 -8.5524443000000e-06\r\n1651 1654 -7.4147247000000e-04\r\n1653 1654 -7.7383422000000e-06\r\n1654 1654  2.0530217000000e+02\r\n1656 1654  5.4275019000000e-04\r\n1657 1654 -1.9002003000000e-01\r\n1659 1654 -9.1776761000000e-06\r\n1702 1654 -5.7100965000000e-02\r\n1704 1654 -8.2919913000000e-06\r\n2758 1654 -1.5092283000000e-03\r\n2760 1654 -1.5750990000000e-05\r\n550 1655  9.7233247000000e+00\r\n552 1655 -1.9272400000000e+00\r\n1608 1655 -1.3003019000000e+00\r\n1653 1655 -1.1612148000000e+00\r\n1654 1655 -1.6066937000000e+02\r\n1655 1655 -3.9109356000000e+01\r\n1656 1655  9.1921782000000e+00\r\n1657 1655  1.8701559000000e+01\r\n1659 1655 -1.3200215000000e+00\r\n1702 1655  1.4512037000000e+01\r\n1704 1655 -1.1927259000000e+00\r\n2760 1655 -2.2862821000000e+00\r\n550 1656  1.6436308000000e+01\r\n551 1656 -2.6623687000000e+00\r\n552 1656 -3.2578065000000e+00\r\n1608 1656 -2.1980304000000e+00\r\n1653 1656 -1.9629160000000e+00\r\n1654 1656 -2.7159550000000e+02\r\n1655 1656  4.2164769000000e+01\r\n1656 1656  1.5538456000000e+01\r\n1657 1656  3.1613115000000e+01\r\n1658 1656 -5.1207224000000e+00\r\n1659 1656 -2.2313643000000e+00\r\n1702 1656  2.4531147000000e+01\r\n1703 1656 -3.9735786000000e+00\r\n1704 1656 -2.0161839000000e+00\r\n2760 1656 -3.8647313000000e+00\r\n553 1657 -1.4724815000000e-01\r\n555 1657 -1.2115562000000e-05\r\n1609 1657 -9.5944604000000e-04\r\n1611 1657 -1.0013213000000e-05\r\n1654 1657 -8.7938657000000e-04\r\n1656 1657 -9.1776761000000e-06\r\n1657 1657  2.3794610000000e+02\r\n1659 1657  6.2205494000000e-04\r\n1660 1657 -2.2289853000000e-01\r\n1662 1657 -1.1041321000000e-05\r\n1705 1657 -1.9544122000000e-01\r\n1707 1657 -9.9884456000000e-06\r\n2761 1657 -1.3508199000000e-03\r\n2763 1657 -1.4097767000000e-05\r\n553 1658  2.0895887000000e+01\r\n555 1658 -1.6625969000000e+00\r\n1611 1658 -1.4790745000000e+00\r\n1656 1658 -1.3200215000000e+00\r\n1657 1658 -2.0170899000000e+02\r\n1658 1658 -4.5295405000000e+01\r\n1659 1658  9.3258634000000e+00\r\n1660 1658  1.6827796000000e+01\r\n1662 1658 -1.5150411000000e+00\r\n1705 1658  2.7679249000000e+01\r\n1707 1658 -1.3707856000000e+00\r\n2763 1658 -1.9732535000000e+00\r\n553 1659  3.5322382000000e+01\r\n554 1659 -5.7213681000000e+00\r\n555 1659 -2.8104518000000e+00\r\n1611 1659 -2.5002256000000e+00\r\n1656 1659 -2.2313643000000e+00\r\n1657 1659 -3.4096864000000e+02\r\n1658 1659  5.3084456000000e+01\r\n1659 1659  1.5764430000000e+01\r\n1660 1659  2.8445687000000e+01\r\n1661 1659 -4.6075103000000e+00\r\n1662 1659 -2.5610236000000e+00\r\n1705 1659  4.6788972000000e+01\r\n1706 1659 -7.5786762000000e+00\r\n1707 1659 -2.3171744000000e+00\r\n2763 1659 -3.3355854000000e+00\r\n556 1660 -3.1161847000000e-01\r\n558 1660 -1.1064451000000e-05\r\n1612 1660 -1.0636641000000e-03\r\n1614 1660 -1.1100880000000e-05\r\n1657 1660 -1.0579573000000e-03\r\n1659 1660 -1.1041321000000e-05\r\n1660 1660  2.7055967000000e+02\r\n1662 1660  7.0111889000000e-04\r\n1663 1660 -1.1344195000000e-03\r\n1665 1660 -1.1839315000000e-05\r\n1708 1660 -4.9982639000000e-01\r\n1710 1660 -1.1934851000000e-05\r\n2764 1660 -1.2195763000000e-03\r\n2766 1660 -1.2728050000000e-05\r\n556 1661  3.7096615000000e+01\r\n558 1661 -1.4650651000000e+00\r\n1614 1661 -1.6113632000000e+00\r\n1659 1661 -1.5150411000000e+00\r\n1660 1661 -2.5296939000000e+02\r\n1661 1661 -5.1474670000000e+01\r\n1662 1661  9.5348012000000e+00\r\n1665 1661 -1.6191856000000e+00\r\n1708 1661  6.0983824000000e+01\r\n1710 1661 -1.5804774000000e+00\r\n2766 1661 -1.7378832000000e+00\r\n556 1662  6.2708117000000e+01\r\n557 1662 -1.0156920000000e+01\r\n558 1662 -2.4765460000000e+00\r\n1614 1662 -2.7238483000000e+00\r\n1659 1662 -2.5610236000000e+00\r\n1660 1662 -4.2761945000000e+02\r\n1661 1662  6.6818708000000e+01\r\n1662 1662  1.6117624000000e+01\r\n1665 1662 -2.7370696000000e+00\r\n1708 1662  1.0308706000000e+02\r\n1709 1662 -1.6697151000000e+01\r\n1710 1662 -2.6716390000000e+00\r\n2766 1662 -2.9377177000000e+00\r\n559 1663 -1.3855821000000e-01\r\n561 1663 -1.0693079000000e-05\r\n1615 1663 -1.0501750000000e-03\r\n1617 1663 -1.0960101000000e-05\r\n1660 1663 -1.8446945000000e-01\r\n1662 1663 -1.1839315000000e-05\r\n1663 1663  2.7028462000000e+02\r\n1665 1663  7.0049918000000e-04\r\n1666 1663 -1.0916982000000e-03\r\n1668 1663 -1.1393456000000e-05\r\n1711 1663 -2.0698907000000e-01\r\n1713 1663 -1.1803048000000e-05\r\n2767 1663 -1.1897661000000e-03\r\n2769 1663 -1.2416937000000e-05\r\n559 1664  2.0050906000000e+01\r\n561 1664 -1.4625411000000e+00\r\n1617 1664 -1.6104571000000e+00\r\n1660 1664  1.6483139000000e+01\r\n1662 1664 -1.6191856000000e+00\r\n1663 1664 -2.2180181000000e+02\r\n1664 1664 -5.1467914000000e+01\r\n1665 1664  9.6658244000000e+00\r\n1668 1664 -1.6189908000000e+00\r\n1711 1664  3.0368874000000e+01\r\n1713 1664 -1.6144318000000e+00\r\n2769 1664 -1.7344354000000e+00\r\n559 1665  3.3894031000000e+01\r\n560 1665 -5.4899961000000e+00\r\n561 1665 -2.4722779000000e+00\r\n1617 1665 -2.7223145000000e+00\r\n1660 1665  2.7863080000000e+01\r\n1661 1665 -4.5131313000000e+00\r\n1662 1665 -2.7370696000000e+00\r\n1663 1665 -3.7493354000000e+02\r\n1664 1665  5.8303482000000e+01\r\n1665 1665  1.6339100000000e+01\r\n1668 1665 -2.7367420000000e+00\r\n1711 1665  5.1335512000000e+01\r\n1712 1665 -8.3150859000000e+00\r\n1713 1665 -2.7290339000000e+00\r\n2769 1665 -2.9318876000000e+00\r\n562 1666 -3.4524809000000e-02\r\n564 1666 -1.0286721000000e-05\r\n1618 1666 -1.0262100000000e-03\r\n1620 1666 -1.0709992000000e-05\r\n1663 1666 -1.9838020000000e-01\r\n1665 1666 -1.1393456000000e-05\r\n1666 1666  2.7011203000000e+02\r\n1668 1666  6.9824186000000e-04\r\n1669 1666 -1.0595532000000e-03\r\n1671 1666 -1.1057976000000e-05\r\n1714 1666 -1.1455620000000e-01\r\n1716 1666 -1.1360162000000e-05\r\n2770 1666 -1.1553500000000e-03\r\n2772 1666 -1.2057755000000e-05\r\n562 1667  9.8107963000000e+00\r\n564 1667 -1.4617749000000e+00\r\n1620 1667 -1.6094869000000e+00\r\n1663 1667  1.8634428000000e+01\r\n1665 1667 -1.6189908000000e+00\r\n1666 1667 -2.0385159000000e+02\r\n1667 1667 -5.1459003000000e+01\r\n1668 1667  9.6625734000000e+00\r\n1671 1667 -1.6185609000000e+00\r\n1714 1667  2.0494516000000e+01\r\n1716 1667 -1.6143877000000e+00\r\n2772 1667 -1.7335935000000e+00\r\n562 1668  1.6584170000000e+01\r\n563 1668 -2.6862973000000e+00\r\n564 1668 -2.4709843000000e+00\r\n1620 1668 -2.7206767000000e+00\r\n1663 1668  3.1499637000000e+01\r\n1664 1668 -5.1022988000000e+00\r\n1665 1668 -2.7367420000000e+00\r\n1666 1668 -3.4459073000000e+02\r\n1667 1668  5.3412258000000e+01\r\n1668 1668  1.6333612000000e+01\r\n1671 1668 -2.7360136000000e+00\r\n1714 1668  3.4643930000000e+01\r\n1715 1668 -5.6116100000000e+00\r\n1716 1668 -2.7289610000000e+00\r\n2772 1668 -2.9304664000000e+00\r\n565 1669 -9.6823731000000e-04\r\n567 1669 -1.0104963000000e-05\r\n1621 1669 -1.0048176000000e-03\r\n1623 1669 -1.0486731000000e-05\r\n1666 1669 -1.6675602000000e-01\r\n1668 1669 -1.1057976000000e-05\r\n1669 1669  2.7004389000000e+02\r\n1671 1669  6.9663137000000e-04\r\n1672 1669 -1.0295369000000e-03\r\n1674 1669 -1.0744713000000e-05\r\n1717 1669 -8.7898661000000e-02\r\n1719 1669 -1.1036116000000e-05\r\n2773 1669 -1.9894113000000e-02\r\n2775 1669 -1.1840431000000e-05\r\n565 1670  5.2180375000000e+00\r\n567 1670 -1.4611605000000e+00\r\n1623 1670 -1.6099108000000e+00\r\n1666 1670  1.3966226000000e+01\r\n1668 1670 -1.6185609000000e+00\r\n1669 1670 -1.9120414000000e+02\r\n1670 1670 -5.1454603000000e+01\r\n1671 1670  9.6458946000000e+00\r\n1674 1670 -1.6020081000000e+00\r\n1717 1670  1.7101421000000e+01\r\n1719 1670 -1.6155050000000e+00\r\n2775 1670 -1.7329727000000e+00\r\n565 1671  8.8205643000000e+00\r\n566 1671 -1.4287813000000e+00\r\n567 1671 -2.4699439000000e+00\r\n1623 1671 -2.7213913000000e+00\r\n1666 1671  2.3608493000000e+01\r\n1667 1671 -3.8241739000000e+00\r\n1668 1671 -2.7360136000000e+00\r\n1669 1671 -3.2321126000000e+02\r\n1670 1671  4.9961416000000e+01\r\n1671 1671  1.6305411000000e+01\r\n1674 1671 -2.7080345000000e+00\r\n1717 1671  2.8908223000000e+01\r\n1718 1671 -4.6826404000000e+00\r\n1719 1671 -2.7308478000000e+00\r\n2775 1671 -2.9294150000000e+00\r\n568 1672 -9.6550868000000e-04\r\n570 1672 -1.0076485000000e-05\r\n1624 1672 -9.6092110000000e-04\r\n1626 1672 -1.0028607000000e-05\r\n1669 1672 -1.2038901000000e-01\r\n1671 1672 -1.0744713000000e-05\r\n1672 1672  2.6457226000000e+02\r\n1674 1672  6.7214879000000e-04\r\n1720 1672 -4.7733116000000e-02\r\n1722 1672 -1.0724002000000e-05\r\n2776 1672 -3.0770786000000e-02\r\n2778 1672 -1.1852882000000e-05\r\n568 1673  3.5314347000000e+00\r\n570 1673 -1.4901284000000e+00\r\n1626 1673 -1.5621015000000e+00\r\n1669 1673  8.4202293000000e+00\r\n1671 1673 -1.6020081000000e+00\r\n1672 1673 -1.7582806000000e+02\r\n1673 1673 -5.0425341000000e+01\r\n1674 1673  8.0261255000000e+00\r\n1720 1673  1.2055848000000e+01\r\n1722 1673 -1.5990651000000e+00\r\n2778 1673 -1.7671616000000e+00\r\n568 1674  5.9695372000000e+00\r\n569 1674 -9.6697473000000e-01\r\n570 1674 -2.5189130000000e+00\r\n1626 1674 -2.6405763000000e+00\r\n1669 1674  1.4233556000000e+01\r\n1670 1674 -2.3056207000000e+00\r\n1671 1674 -2.7080345000000e+00\r\n1672 1674 -2.9721975000000e+02\r\n1673 1674  4.5800144000000e+01\r\n1674 1674  1.3567363000000e+01\r\n1720 1674  2.0379205000000e+01\r\n1721 1674 -3.3011229000000e+00\r\n1722 1674 -2.7030597000000e+00\r\n2778 1674 -2.9872100000000e+00\r\n1675 1675  1.0000000000000e+00\r\n1676 1676  1.0000000000000e+00\r\n1677 1677  1.0000000000000e+00\r\n1678 1678  1.0000000000000e+00\r\n1679 1679  1.0000000000000e+00\r\n1680 1680  1.0000000000000e+00\r\n1681 1681  1.0000000000000e+00\r\n1682 1682  1.0000000000000e+00\r\n1683 1683  1.0000000000000e+00\r\n1684 1684  1.0000000000000e+00\r\n1685 1685  1.0000000000000e+00\r\n1686 1686  1.0000000000000e+00\r\n1687 1687  1.0000000000000e+00\r\n1688 1688  1.0000000000000e+00\r\n1689 1689  1.0000000000000e+00\r\n586 1690 -2.2242274000000e-03\r\n588 1690 -2.3213044000000e-05\r\n1690 1690  1.0797413000000e+02\r\n1692 1690  3.1185895000000e-04\r\n1693 1690 -1.3479570000000e-02\r\n1695 1690 -4.5005320000000e-06\r\n1738 1690 -3.9297606000000e-04\r\n1740 1690 -4.1012760000000e-06\r\n2794 1690 -5.2332926000000e-02\r\n2796 1690 -2.7518009000000e-05\r\n586 1691  5.3852628000000e-01\r\n588 1691 -3.6425216000000e+00\r\n1690 1691 -6.4387337000000e+01\r\n1691 1691 -1.8888764000000e+01\r\n1692 1691  9.3186480000000e+00\r\n1693 1691  1.8825568000000e+00\r\n1695 1691 -7.0652571000000e-01\r\n1740 1691 -6.4747945000000e-01\r\n2796 1691 -4.3198103000000e+00\r\n586 1692  9.1032483000000e-01\r\n587 1692 -1.4746373000000e-01\r\n588 1692 -6.1573185000000e+00\r\n1690 1692 -1.0884036000000e+02\r\n1691 1692  1.9535090000000e+01\r\n1692 1692  1.5752243000000e+01\r\n1693 1692  3.1822740000000e+00\r\n1694 1692 -5.1549731000000e-01\r\n1695 1692 -1.1943111000000e+00\r\n1740 1692 -1.0944993000000e+00\r\n2796 1692 -7.3022073000000e+00\r\n589 1693 -1.8738628000000e-03\r\n591 1693 -1.9556480000000e-05\r\n1645 1693 -5.0011433000000e-04\r\n1647 1693 -5.2194194000000e-06\r\n1690 1693 -4.3123198000000e-04\r\n1692 1693 -4.5005320000000e-06\r\n1693 1693  1.2959451000000e+02\r\n1695 1693  3.6533244000000e-04\r\n1696 1693 -5.6913742000000e-02\r\n1698 1693 -5.2950538000000e-06\r\n1741 1693 -4.3554724000000e-04\r\n1743 1693 -4.5455680000000e-06\r\n2797 1693 -4.9675742000000e-02\r\n2799 1693 -2.3182994000000e-05\r\n589 1694  8.7410339000000e-01\r\n591 1694 -3.0369940000000e+00\r\n1647 1694 -8.2194276000000e-01\r\n1692 1694 -7.0652571000000e-01\r\n1693 1694 -8.0993831000000e+01\r\n1694 1694 -2.4701508000000e+01\r\n1695 1694  9.7001595000000e+00\r\n1696 1694  5.5783043000000e+00\r\n1698 1694 -8.2297257000000e-01\r\n1741 1694  1.8469536000000e-01\r\n1743 1694 -7.0596904000000e-01\r\n2799 1694 -3.6029813000000e+00\r\n589 1695  1.4775837000000e+00\r\n590 1695 -2.3935269000000e-01\r\n591 1695 -5.1337324000000e+00\r\n1647 1695 -1.3894113000000e+00\r\n1692 1695 -1.1943111000000e+00\r\n1693 1695 -1.3691191000000e+02\r\n1694 1695  2.1021639000000e+01\r\n1695 1695  1.6397142000000e+01\r\n1696 1695  9.4295614000000e+00\r\n1697 1695 -1.5274876000000e+00\r\n1698 1695 -1.3911522000000e+00\r\n1741 1695  3.1220889000000e-01\r\n1742 1695 -5.0574491000000e-02\r\n1743 1695 -1.1933695000000e+00\r\n2799 1695 -6.0904761000000e+00\r\n592 1696 -1.7108231000000e-03\r\n594 1696 -1.7854924000000e-05\r\n1648 1696 -5.6862107000000e-04\r\n1650 1696 -5.9343868000000e-06\r\n1693 1696 -5.0736147000000e-04\r\n1695 1696 -5.2950538000000e-06\r\n1696 1696  1.4582182000000e+02\r\n1698 1696  4.0265233000000e-04\r\n1699 1696 -1.0932543000000e-01\r\n1701 1696 -6.0680834000000e-06\r\n1744 1696 -5.2222217000000e-04\r\n1746 1696 -5.4501468000000e-06\r\n2800 1696 -4.2453271000000e-02\r\n2802 1696 -2.1133029000000e-05\r\n592 1697  1.8863610000000e+00\r\n594 1697 -2.7015410000000e+00\r\n1650 1697 -9.1863870000000e-01\r\n1695 1697 -8.2297257000000e-01\r\n1696 1697 -9.7152630000000e+01\r\n1697 1697 -2.7792393000000e+01\r\n1698 1697  9.3935802000000e+00\r\n1699 1697  1.0289578000000e+01\r\n1701 1697 -9.2035445000000e-01\r\n1744 1697  1.3299976000000e+00\r\n1746 1697 -8.2190450000000e-01\r\n2802 1697 -3.2050468000000e+00\r\n592 1698  3.1887047000000e+00\r\n593 1698 -5.1652764000000e-01\r\n594 1698 -4.5666848000000e+00\r\n1650 1698 -1.5528669000000e+00\r\n1695 1698 -1.3911522000000e+00\r\n1696 1698 -1.6422681000000e+02\r\n1697 1698  2.5293396000000e+01\r\n1698 1698  1.5878907000000e+01\r\n1699 1698  1.7393503000000e+01\r\n1700 1698 -2.8175155000000e+00\r\n1701 1698 -1.5557672000000e+00\r\n1744 1698  2.2482280000000e+00\r\n1745 1698 -3.6418296000000e-01\r\n1746 1698 -1.3893474000000e+00\r\n2802 1698 -5.4178110000000e+00\r\n595 1699 -1.6091390000000e-03\r\n597 1699 -1.6793702000000e-05\r\n1651 1699 -6.5767387000000e-04\r\n1653 1699 -6.8637821000000e-06\r\n1696 1699 -5.8143161000000e-04\r\n1698 1699 -6.0680834000000e-06\r\n1699 1699  1.6206276000000e+02\r\n1701 1699  4.4204789000000e-04\r\n1702 1699 -1.9328197000000e-01\r\n1704 1699 -7.2681221000000e-06\r\n1747 1699 -6.1959745000000e-04\r\n1749 1699 -6.4663993000000e-06\r\n2803 1699 -1.9960069000000e-02\r\n2805 1699 -1.9781345000000e-05\r\n595 1700  5.2167878000000e+00\r\n597 1700 -2.4309664000000e+00\r\n1653 1700 -1.0300719000000e+00\r\n1698 1700 -9.2035445000000e-01\r\n1699 1700 -1.1684341000000e+02\r\n1700 1700 -3.0885659000000e+01\r\n1701 1700  9.2656855000000e+00\r\n1702 1700  1.6984846000000e+01\r\n1704 1700 -1.0598049000000e+00\r\n1747 1700  1.7085869000000e+00\r\n1749 1700 -9.3682947000000e-01\r\n2805 1700 -2.8841868000000e+00\r\n595 1701  8.8184523000000e+00\r\n596 1701 -1.4284351000000e+00\r\n597 1701 -4.1093030000000e+00\r\n1653 1701 -1.7412321000000e+00\r\n1698 1701 -1.5557672000000e+00\r\n1699 1701 -1.9751197000000e+02\r\n1700 1701  3.0525937000000e+01\r\n1701 1701  1.5662705000000e+01\r\n1702 1701  2.8711166000000e+01\r\n1703 1701 -4.6507071000000e+00\r\n1704 1701 -1.7914930000000e+00\r\n1747 1701  2.8881934000000e+00\r\n1748 1701 -4.6783688000000e-01\r\n1749 1701 -1.5836155000000e+00\r\n2805 1701 -4.8754260000000e+00\r\n598 1702 -8.2984683000000e-02\r\n600 1702 -1.4670850000000e-05\r\n1654 1702 -7.9452202000000e-04\r\n1656 1702 -8.2919913000000e-06\r\n1699 1702 -6.9641692000000e-04\r\n1701 1702 -7.2681221000000e-06\r\n1702 1702  1.9459037000000e+02\r\n1704 1702  5.1894309000000e-04\r\n1705 1702 -2.9625002000000e-01\r\n1707 1702 -8.9874061000000e-06\r\n1750 1702 -7.6037108000000e-04\r\n1752 1702 -7.9355766000000e-06\r\n2806 1702 -1.6482663000000e-03\r\n2808 1702 -1.7202053000000e-05\r\n598 1703  1.4531280000000e+01\r\n600 1703 -2.0267265000000e+00\r\n1656 1703 -1.1927259000000e+00\r\n1701 1703 -1.0598049000000e+00\r\n1702 1703 -1.5383473000000e+02\r\n1703 1703 -3.7069915000000e+01\r\n1704 1703  9.0252440000000e+00\r\n1705 1703  2.7552567000000e+01\r\n1707 1703 -1.2416079000000e+00\r\n1750 1703  2.4164380000000e-01\r\n1752 1703 -1.0954366000000e+00\r\n2808 1703 -2.4047730000000e+00\r\n598 1704  2.4563675000000e+01\r\n599 1704 -3.9787347000000e+00\r\n600 1704 -3.4259784000000e+00\r\n1656 1704 -2.0161839000000e+00\r\n1701 1704 -1.7914930000000e+00\r\n1702 1704 -2.6004222000000e+02\r\n1703 1704  4.0341763000000e+01\r\n1704 1704  1.5256271000000e+01\r\n1705 1704  4.6574860000000e+01\r\n1706 1704 -7.5440262000000e+00\r\n1707 1704 -2.0988139000000e+00\r\n1750 1704  4.0847468000000e-01\r\n1751 1704 -6.6163242000000e-02\r\n1752 1704 -1.8517261000000e+00\r\n2808 1704 -4.0650283000000e+00\r\n601 1705 -3.7175945000000e-01\r\n603 1705 -1.3821958000000e-05\r\n1657 1705 -9.5707288000000e-04\r\n1659 1705 -9.9884456000000e-06\r\n1702 1705 -8.6115528000000e-04\r\n1704 1705 -8.9874061000000e-06\r\n1705 1705  2.2200070000000e+02\r\n1707 1705  5.8719055000000e-04\r\n1708 1705 -4.5948004000000e-01\r\n1710 1705 -1.1123200000000e-05\r\n1753 1705 -9.1943302000000e-04\r\n1755 1705 -9.5956190000000e-06\r\n2809 1705 -1.5255790000000e-03\r\n2811 1705 -1.5921633000000e-05\r\n601 1706  4.2979748000000e+01\r\n603 1706 -1.7801773000000e+00\r\n1659 1706 -1.3707856000000e+00\r\n1704 1706 -1.2416079000000e+00\r\n1705 1706 -2.1221385000000e+02\r\n1706 1706 -4.2232058000000e+01\r\n1707 1706  9.1999729000000e+00\r\n1708 1706  4.2257388000000e+01\r\n1710 1706 -1.4325391000000e+00\r\n1755 1706 -1.2577860000000e+00\r\n2811 1706 -2.1123227000000e+00\r\n601 1707  7.2652915000000e+01\r\n602 1707 -1.1767451000000e+01\r\n603 1707 -3.0092095000000e+00\r\n1659 1707 -2.3171744000000e+00\r\n1704 1707 -2.0988139000000e+00\r\n1705 1707 -3.5872605000000e+02\r\n1706 1707  5.6042433000000e+01\r\n1707 1707  1.5551625000000e+01\r\n1708 1707  7.1431844000000e+01\r\n1709 1707 -1.1569677000000e+01\r\n1710 1707 -2.4215624000000e+00\r\n1755 1707 -2.1261600000000e+00\r\n2811 1707 -3.5706677000000e+00\r\n604 1708 -1.2680469000000e+00\r\n606 1708 -1.2867217000000e-05\r\n1660 1708 -1.1435735000000e-03\r\n1662 1708 -1.1934851000000e-05\r\n1705 1708 -1.0658028000000e-03\r\n1707 1708 -1.1123200000000e-05\r\n1708 1708  2.6110786000000e+02\r\n1710 1708  6.8404619000000e-04\r\n1711 1708 -1.1789649000000e-03\r\n1713 1708 -1.2304211000000e-05\r\n1756 1708 -1.1386170000000e-03\r\n1758 1708 -1.1883122000000e-05\r\n2812 1708 -1.3844402000000e-03\r\n2814 1708 -1.4448644000000e-05\r\n604 1709  1.3131564000000e+02\r\n606 1709 -1.5208751000000e+00\r\n1662 1709 -1.5804774000000e+00\r\n1707 1709 -1.4325391000000e+00\r\n1708 1709 -3.7165501000000e+02\r\n1709 1709 -4.9462685000000e+01\r\n1710 1709  9.8205637000000e+00\r\n1713 1709 -1.5868194000000e+00\r\n1758 1709 -1.5019716000000e+00\r\n2814 1709 -1.8034786000000e+00\r\n604 1710  2.2197596000000e+02\r\n605 1710 -3.5950514000000e+01\r\n606 1710 -2.5708872000000e+00\r\n1662 1710 -2.6716390000000e+00\r\n1707 1710 -2.4215624000000e+00\r\n1708 1710 -6.2824561000000e+02\r\n1709 1710  9.9286469000000e+01\r\n1710 1710  1.6600677000000e+01\r\n1713 1710 -2.6823581000000e+00\r\n1758 1710 -2.5389328000000e+00\r\n2814 1710 -3.0486002000000e+00\r\n607 1711 -3.1361874000000e-01\r\n609 1711 -1.1318731000000e-05\r\n1663 1711 -1.1309445000000e-03\r\n1665 1711 -1.1803048000000e-05\r\n1708 1711 -4.7911884000000e-01\r\n1710 1711 -1.2304211000000e-05\r\n1711 1711  2.7051663000000e+02\r\n1713 1711  7.0413969000000e-04\r\n1714 1711 -1.1386034000000e-03\r\n1716 1711 -1.1882980000000e-05\r\n1759 1711 -1.1879351000000e-03\r\n1761 1711 -1.2397828000000e-05\r\n2815 1711 -1.2479521000000e-03\r\n2817 1711 -1.3024193000000e-05\r\n607 1712  3.7277203000000e+01\r\n609 1712 -1.4597647000000e+00\r\n1665 1712 -1.6144318000000e+00\r\n1708 1712  4.7530409000000e+01\r\n1710 1712 -1.5868194000000e+00\r\n1711 1712 -2.3966453000000e+02\r\n1712 1712 -5.1497262000000e+01\r\n1713 1712  9.6341451000000e+00\r\n1716 1712 -1.6195096000000e+00\r\n1761 1712 -1.6167865000000e+00\r\n2817 1712 -1.7310373000000e+00\r\n607 1713  6.3013350000000e+01\r\n608 1713 -1.0206158000000e+01\r\n609 1713 -2.4675848000000e+00\r\n1665 1713 -2.7290339000000e+00\r\n1708 1713  8.0345359000000e+01\r\n1709 1713 -1.3013393000000e+01\r\n1710 1713 -2.6823581000000e+00\r\n1711 1713 -4.0512869000000e+02\r\n1712 1713  6.3118938000000e+01\r\n1713 1713  1.6285550000000e+01\r\n1716 1713 -2.7376190000000e+00\r\n1761 1713 -2.7330142000000e+00\r\n2817 1713 -2.9261433000000e+00\r\n610 1714 -7.5290694000000e-02\r\n612 1714 -1.0714810000000e-05\r\n1666 1714 -1.0885080000000e-03\r\n1668 1714 -1.1360162000000e-05\r\n1711 1714 -2.9111676000000e-01\r\n1713 1714 -1.1882980000000e-05\r\n1714 1714  2.7010717000000e+02\r\n1716 1714  7.0134261000000e-04\r\n1717 1714 -1.0989148000000e-03\r\n1719 1714 -1.1468772000000e-05\r\n1762 1714 -1.1510559000000e-03\r\n1764 1714 -1.2012940000000e-05\r\n2818 1714 -1.1995862000000e-03\r\n2820 1714 -1.2519425000000e-05\r\n610 1715  1.3815885000000e+01\r\n612 1715 -1.4603184000000e+00\r\n1668 1715 -1.6143877000000e+00\r\n1711 1715  2.8543428000000e+01\r\n1713 1715 -1.6195096000000e+00\r\n1714 1715 -2.0363473000000e+02\r\n1715 1715 -5.1482107000000e+01\r\n1716 1715  9.6675806000000e+00\r\n1719 1715 -1.6191732000000e+00\r\n1762 1715  6.3963030000000e+00\r\n1764 1715 -1.6165621000000e+00\r\n2820 1715 -1.7318408000000e+00\r\n610 1716  2.3354372000000e+01\r\n611 1716 -3.7828194000000e+00\r\n612 1716 -2.4685221000000e+00\r\n1668 1716 -2.7289610000000e+00\r\n1711 1716  4.8249810000000e+01\r\n1712 1716 -7.8152526000000e+00\r\n1713 1716 -2.7376190000000e+00\r\n1714 1716 -3.4422415000000e+02\r\n1715 1716  5.3294295000000e+01\r\n1716 1716  1.6342077000000e+01\r\n1719 1716 -2.7370489000000e+00\r\n1762 1716  1.0812310000000e+01\r\n1763 1716 -1.7513217000000e+00\r\n1764 1716 -2.7326365000000e+00\r\n2820 1716 -2.9275037000000e+00\r\n613 1717 -1.2372172000000e-03\r\n615 1717 -1.0334473000000e-05\r\n1669 1717 -1.0574586000000e-03\r\n1671 1717 -1.1036116000000e-05\r\n1714 1717 -1.9358587000000e-01\r\n1716 1717 -1.1468772000000e-05\r\n1717 1717  2.7002973000000e+02\r\n1719 1717  6.9906204000000e-04\r\n1720 1717 -1.0680400000000e-03\r\n1722 1717 -1.1146549000000e-05\r\n1765 1717 -7.6600454000000e-02\r\n1767 1717 -1.1452271000000e-05\r\n2821 1717 -1.1850076000000e-02\r\n2823 1717 -1.2257771000000e-05\r\n613 1718  6.5236915000000e+00\r\n615 1718 -1.4590786000000e+00\r\n1671 1718 -1.6155050000000e+00\r\n1714 1718  1.7385177000000e+01\r\n1716 1718 -1.6191732000000e+00\r\n1717 1718 -1.9245925000000e+02\r\n1718 1718 -5.1474884000000e+01\r\n1719 1718  9.6658804000000e+00\r\n1722 1718 -1.6190032000000e+00\r\n1765 1718  1.3660612000000e+01\r\n1767 1718 -1.6169162000000e+00\r\n2823 1718 -1.7304186000000e+00\r\n613 1719  1.1027642000000e+01\r\n614 1719 -1.7862458000000e+00\r\n615 1719 -2.4664250000000e+00\r\n1671 1719 -2.7308478000000e+00\r\n1714 1719  2.9387887000000e+01\r\n1715 1719 -4.7602190000000e+00\r\n1716 1719 -2.7370489000000e+00\r\n1717 1719 -3.2533292000000e+02\r\n1718 1719  5.0253828000000e+01\r\n1719 1719  1.6339196000000e+01\r\n1722 1719 -2.7367630000000e+00\r\n1765 1719  2.3091886000000e+01\r\n1766 1719 -3.7403991000000e+00\r\n1767 1719 -2.7332335000000e+00\r\n2823 1719 -2.9250977000000e+00\r\n616 1720 -9.7247768000000e-04\r\n618 1720 -1.0149217000000e-05\r\n1672 1720 -1.0275524000000e-03\r\n1674 1720 -1.0724002000000e-05\r\n1717 1720 -1.6140711000000e-01\r\n1719 1720 -1.1146549000000e-05\r\n1720 1720  2.6993957000000e+02\r\n1722 1720  6.7529411000000e-04\r\n2824 1720 -2.7057739000000e-02\r\n2826 1720 -1.1922981000000e-05\r\n616 1721  4.0892497000000e+00\r\n618 1721 -1.4602675000000e+00\r\n1674 1721 -1.5990651000000e+00\r\n1717 1721  1.3440870000000e+01\r\n1719 1721 -1.6190032000000e+00\r\n1720 1721 -1.7242606000000e+02\r\n1721 1721 -5.1470763000000e+01\r\n1722 1721  6.4157856000000e+00\r\n2826 1721 -1.7316662000000e+00\r\n616 1722  6.9124677000000e+00\r\n617 1722 -1.1196955000000e+00\r\n618 1722 -2.4684361000000e+00\r\n1674 1722 -2.7030597000000e+00\r\n1717 1722  2.2720447000000e+01\r\n1718 1722 -3.6803039000000e+00\r\n1719 1722 -2.7367630000000e+00\r\n1720 1722 -2.9146900000000e+02\r\n1721 1722  4.4779759000000e+01\r\n1722 1722  1.0845244000000e+01\r\n2826 1722 -2.9272085000000e+00\r\n1723 1723  1.0000000000000e+00\r\n1724 1724  1.0000000000000e+00\r\n1725 1725  1.0000000000000e+00\r\n1726 1726  1.0000000000000e+00\r\n1727 1727  1.0000000000000e+00\r\n1728 1728  1.0000000000000e+00\r\n1729 1729  1.0000000000000e+00\r\n1730 1730  1.0000000000000e+00\r\n1731 1731  1.0000000000000e+00\r\n1732 1732  1.0000000000000e+00\r\n1733 1733  1.0000000000000e+00\r\n1734 1734  1.0000000000000e+00\r\n1735 1735  1.0000000000000e+00\r\n1736 1736  1.0000000000000e+00\r\n1737 1737  1.0000000000000e+00\r\n634 1738 -2.2121759000000e-03\r\n636 1738 -2.3087268000000e-05\r\n1690 1738 -2.2899062000000e-02\r\n1692 1738 -4.1012760000000e-06\r\n1738 1738  1.0799645000000e+02\r\n1740 1738  3.1521981000000e-04\r\n1741 1738 -1.3641424000000e-02\r\n1743 1738 -4.1010484000000e-06\r\n1786 1738 -3.8641520000000e-04\r\n1788 1738 -4.0328039000000e-06\r\n2842 1738 -5.2763589000000e-02\r\n2844 1738 -2.7373634000000e-05\r\n634 1739  4.7833739000000e-01\r\n636 1739 -3.6436389000000e+00\r\n1690 1739  9.6773944000000e-01\r\n1692 1739 -6.4747945000000e-01\r\n1738 1739 -6.6273133000000e+01\r\n1739 1739 -2.0584062000000e+01\r\n1740 1739  9.9100283000000e+00\r\n1741 1739  2.8622958000000e+00\r\n1743 1739 -6.4748607000000e-01\r\n1788 1739 -6.4756021000000e-01\r\n2844 1739 -4.3215522000000e+00\r\n634 1740  8.0858152000000e-01\r\n635 1740 -1.3098277000000e-01\r\n636 1740 -6.1592072000000e+00\r\n1690 1740  1.6358668000000e+00\r\n1691 1740 -2.6499537000000e-01\r\n1692 1740 -1.0944993000000e+00\r\n1738 1740 -1.1202810000000e+02\r\n1739 1740  1.7184991000000e+01\r\n1740 1740  1.6751912000000e+01\r\n1741 1740  4.8384248000000e+00\r\n1742 1740 -7.8378034000000e-01\r\n1743 1740 -1.0945105000000e+00\r\n1788 1740 -1.0946358000000e+00\r\n2844 1740 -7.3051519000000e+00\r\n637 1741 -2.2492247000000e-03\r\n639 1741 -2.3473926000000e-05\r\n1693 1741 -2.3565069000000e-02\r\n1695 1741 -4.5455680000000e-06\r\n1738 1741 -3.9295426000000e-04\r\n1740 1741 -4.1010484000000e-06\r\n1741 1741  1.0803119000000e+02\r\n1743 1741  3.2114201000000e-04\r\n1744 1741 -5.2755570000000e-02\r\n1746 1741 -4.5491599000000e-06\r\n1789 1741 -3.9523853000000e-04\r\n1791 1741 -4.1248881000000e-06\r\n2845 1741 -5.1145261000000e-02\r\n2847 1741 -2.7822909000000e-05\r\n637 1742  7.1202527000000e-01\r\n639 1742 -3.6437574000000e+00\r\n1695 1742 -7.0596904000000e-01\r\n1740 1742 -6.4748607000000e-01\r\n1741 1742 -6.8419519000000e+01\r\n1742 1742 -2.0587619000000e+01\r\n1743 1742  1.0674876000000e+01\r\n1744 1742  5.7477272000000e+00\r\n1746 1742 -7.0659250000000e-01\r\n1791 1742 -6.4748172000000e-01\r\n2847 1742 -4.3212757000000e+00\r\n637 1743  1.2036068000000e+00\r\n638 1743 -1.9497134000000e-01\r\n639 1743 -6.1594038000000e+00\r\n1695 1743 -1.1933695000000e+00\r\n1740 1743 -1.0945105000000e+00\r\n1741 1743 -1.1565628000000e+02\r\n1742 1743  1.7763824000000e+01\r\n1743 1743  1.8044799000000e+01\r\n1744 1743  9.7159521000000e+00\r\n1745 1743 -1.5738796000000e+00\r\n1746 1743 -1.1944232000000e+00\r\n1791 1743 -1.0945024000000e+00\r\n2847 1743 -7.3046794000000e+00\r\n640 1744 -1.9323577000000e-03\r\n642 1744 -2.0166959000000e-05\r\n1696 1744 -2.2917029000000e-02\r\n1698 1744 -5.4501468000000e-06\r\n1741 1744 -4.3589141000000e-04\r\n1743 1744 -4.5491599000000e-06\r\n1744 1744  1.2965391000000e+02\r\n1746 1744  3.6728552000000e-04\r\n1747 1744 -1.0653696000000e-01\r\n1749 1744 -5.5503435000000e-06\r\n1792 1744 -4.4507975000000e-04\r\n1794 1744 -4.6450536000000e-06\r\n2848 1744 -4.5466010000000e-02\r\n2850 1744 -2.3889507000000e-05\r\n640 1745  1.4723184000000e+00\r\n642 1745 -3.0366821000000e+00\r\n1698 1745 -8.2190450000000e-01\r\n1743 1745 -7.0659250000000e-01\r\n1744 1745 -8.5348337000000e+01\r\n1745 1745 -2.4709362000000e+01\r\n1746 1745  9.7140832000000e+00\r\n1747 1745  9.5303947000000e+00\r\n1749 1745 -8.3709780000000e-01\r\n1794 1745 -7.0625909000000e-01\r\n2850 1745 -3.6027696000000e+00\r\n640 1746  2.4888069000000e+00\r\n641 1746 -4.0315204000000e-01\r\n642 1746 -5.1332074000000e+00\r\n1698 1746 -1.3893474000000e+00\r\n1743 1746 -1.1944232000000e+00\r\n1744 1746 -1.4427283000000e+02\r\n1745 1746  2.2194201000000e+01\r\n1746 1746  1.6420685000000e+01\r\n1747 1746  1.6110179000000e+01\r\n1748 1746 -2.6096245000000e+00\r\n1749 1746 -1.4150301000000e+00\r\n1794 1746 -1.1938604000000e+00\r\n2850 1746 -6.0901217000000e+00\r\n643 1747 -1.7307928000000e-03\r\n645 1747 -1.8063337000000e-05\r\n1699 1747 -1.8186795000000e-02\r\n1701 1747 -6.4663993000000e-06\r\n1744 1747 -5.3182282000000e-04\r\n1746 1747 -5.5503435000000e-06\r\n1747 1747  1.5125413000000e+02\r\n1749 1747  4.1747288000000e-04\r\n1750 1747 -1.5298080000000e-01\r\n1752 1747 -6.6764701000000e-06\r\n1795 1747 -5.5931807000000e-04\r\n1797 1747 -5.8372964000000e-06\r\n2851 1747 -2.9380086000000e-02\r\n2853 1747 -2.1328591000000e-05\r\n643 1748  3.7646537000000e+00\r\n645 1748 -2.6045985000000e+00\r\n1701 1748 -9.3682947000000e-01\r\n1746 1748 -8.3709780000000e-01\r\n1747 1748 -1.0444681000000e+02\r\n1748 1748 -2.8831816000000e+01\r\n1749 1748  9.2932034000000e+00\r\n1750 1748  1.3951809000000e+01\r\n1752 1748 -9.6736793000000e-01\r\n1797 1748 -8.5397505000000e-01\r\n2853 1748 -3.0900922000000e+00\r\n643 1749  6.3637670000000e+00\r\n644 1749 -1.0308146000000e+00\r\n645 1749 -4.4028107000000e+00\r\n1701 1749 -1.5836155000000e+00\r\n1746 1749 -1.4150301000000e+00\r\n1747 1749 -1.7655678000000e+02\r\n1748 1749  2.7216494000000e+01\r\n1749 1749  1.5709222000000e+01\r\n1750 1749  2.3584125000000e+01\r\n1751 1749 -3.8201994000000e+00\r\n1752 1749 -1.6352378000000e+00\r\n1797 1749 -1.4435584000000e+00\r\n2853 1749 -5.2234888000000e+00\r\n646 1750 -3.5777127000000e-02\r\n648 1750 -1.6515382000000e-05\r\n1702 1750 -4.7829871000000e-02\r\n1704 1750 -7.9355766000000e-06\r\n1747 1750 -6.3972601000000e-04\r\n1749 1750 -6.6764701000000e-06\r\n1750 1750  1.7290657000000e+02\r\n1752 1750  4.6981893000000e-04\r\n1753 1750 -1.9763276000000e-01\r\n1755 1750 -8.0510325000000e-06\r\n1798 1750 -6.8268354000000e-04\r\n1800 1750 -7.1247943000000e-06\r\n2854 1750 -1.8630208000000e-03\r\n2856 1750 -1.9443328000000e-05\r\n646 1751  9.8677828000000e+00\r\n648 1751 -2.2800486000000e+00\r\n1704 1751 -1.0954366000000e+00\r\n1749 1751 -9.6736793000000e-01\r\n1750 1751 -1.2699346000000e+02\r\n1751 1751 -3.2957137000000e+01\r\n1752 1751  9.1643487000000e+00\r\n1753 1751  1.8014880000000e+01\r\n1755 1751 -1.1115071000000e+00\r\n1800 1751 -1.0013891000000e+00\r\n2856 1751 -2.7048907000000e+00\r\n646 1752  1.6680500000000e+01\r\n647 1752 -2.7018452000000e+00\r\n648 1752 -3.8541941000000e+00\r\n1704 1752 -1.8517261000000e+00\r\n1749 1752 -1.6352378000000e+00\r\n1750 1752 -2.1466975000000e+02\r\n1751 1752  3.3175169000000e+01\r\n1752 1752  1.5491414000000e+01\r\n1753 1752  3.0452353000000e+01\r\n1754 1752 -4.9325587000000e+00\r\n1755 1752 -1.8788916000000e+00\r\n1800 1752 -1.6927482000000e+00\r\n2856 1752 -4.5723473000000e+00\r\n649 1753 -1.6926658000000e-01\r\n651 1753 -1.5045593000000e-05\r\n1705 1753 -1.3140085000000e-01\r\n1707 1753 -9.5956190000000e-06\r\n1750 1753 -7.7143383000000e-04\r\n1752 1753 -8.0510325000000e-06\r\n1753 1753  2.0007792000000e+02\r\n1755 1753  5.3619780000000e-04\r\n1756 1753 -1.8912705000000e-01\r\n1758 1753 -1.0034359000000e-05\r\n1801 1753 -8.3448985000000e-04\r\n1803 1753 -8.7091136000000e-06\r\n2857 1753 -1.6801156000000e-03\r\n2859 1753 -1.7534446000000e-05\r\n649 1754  2.3028724000000e+01\r\n651 1754 -1.9724001000000e+00\r\n1705 1754  7.2474017000000e+00\r\n1707 1754 -1.2577860000000e+00\r\n1752 1754 -1.1115071000000e+00\r\n1753 1754 -1.6054765000000e+02\r\n1754 1754 -3.8115097000000e+01\r\n1755 1754  9.1815998000000e+00\r\n1756 1754  1.5687094000000e+01\r\n1758 1754 -1.3153713000000e+00\r\n1803 1754 -1.1802067000000e+00\r\n2859 1754 -2.3400367000000e+00\r\n649 1755  3.8927728000000e+01\r\n650 1755 -6.3051332000000e+00\r\n651 1755 -3.3341428000000e+00\r\n1705 1755  1.2251000000000e+01\r\n1706 1755 -1.9842972000000e+00\r\n1707 1755 -2.1261600000000e+00\r\n1752 1755 -1.8788916000000e+00\r\n1753 1755 -2.7138957000000e+02\r\n1754 1755  4.2090424000000e+01\r\n1755 1755  1.5520567000000e+01\r\n1756 1755  2.6517446000000e+01\r\n1757 1755 -4.2950369000000e+00\r\n1758 1755 -2.2235022000000e+00\r\n1803 1755 -1.9950201000000e+00\r\n2859 1755 -3.9555957000000e+00\r\n652 1756 -3.4375572000000e-01\r\n654 1756 -1.2833632000000e-05\r\n1708 1756 -4.2269746000000e-01\r\n1710 1756 -1.1883122000000e-05\r\n1753 1756 -9.6147224000000e-04\r\n1755 1756 -1.0034359000000e-05\r\n1756 1756  2.4350342000000e+02\r\n1758 1756  6.4041493000000e-04\r\n1759 1756 -1.1274298000000e-03\r\n1761 1756 -1.1766367000000e-05\r\n1804 1756 -1.0395140000000e-03\r\n1806 1756 -1.0848838000000e-05\r\n2860 1756 -1.4161375000000e-03\r\n2862 1756 -1.4779451000000e-05\r\n652 1757  4.0238110000000e+01\r\n654 1757 -1.6222799000000e+00\r\n1708 1757  3.5046687000000e+01\r\n1710 1757 -1.5019716000000e+00\r\n1755 1757 -1.3153713000000e+00\r\n1756 1757 -2.1463638000000e+02\r\n1757 1757 -4.6361346000000e+01\r\n1758 1757  9.3417448000000e+00\r\n1761 1757 -1.5345715000000e+00\r\n1806 1757 -1.4383759000000e+00\r\n2862 1757 -1.9239522000000e+00\r\n652 1758  6.8018501000000e+01\r\n653 1758 -1.1016657000000e+01\r\n654 1758 -2.7423019000000e+00\r\n1708 1758  5.9242920000000e+01\r\n1709 1758 -9.5953152000000e+00\r\n1710 1758 -2.5389328000000e+00\r\n1755 1758 -2.2235022000000e+00\r\n1756 1758 -3.6282133000000e+02\r\n1757 1758  5.6481337000000e+01\r\n1758 1758  1.5791282000000e+01\r\n1761 1758 -2.5940381000000e+00\r\n1806 1758 -2.4314307000000e+00\r\n2862 1758 -3.2522488000000e+00\r\n655 1759 -1.3674684000000e-01\r\n657 1759 -1.1187730000000e-05\r\n1711 1759 -1.3342204000000e-01\r\n1713 1759 -1.2397828000000e-05\r\n1756 1759 -1.5808714000000e-01\r\n1758 1759 -1.1766367000000e-05\r\n1759 1759  2.7014495000000e+02\r\n1761 1759  7.0391015000000e-04\r\n1762 1759 -1.1531738000000e-03\r\n1764 1759 -1.2035044000000e-05\r\n1807 1759 -1.1615426000000e-03\r\n1809 1759 -1.2122384000000e-05\r\n2863 1759 -1.2461293000000e-03\r\n2865 1759 -1.3005170000000e-05\r\n655 1760  1.9861190000000e+01\r\n657 1760 -1.4592005000000e+00\r\n1711 1760  6.0085957000000e+00\r\n1713 1760 -1.6167865000000e+00\r\n1756 1760  1.5859809000000e+01\r\n1758 1760 -1.5345715000000e+00\r\n1759 1760 -1.9657855000000e+02\r\n1760 1760 -5.1503173000000e+01\r\n1761 1760  9.5834246000000e+00\r\n1764 1760 -1.6197167000000e+00\r\n1809 1760 -1.6168748000000e+00\r\n2865 1760 -1.7304764000000e+00\r\n655 1761  3.3573335000000e+01\r\n656 1761 -5.4378591000000e+00\r\n657 1761 -2.4666309000000e+00\r\n1711 1761  1.0156924000000e+01\r\n1712 1761 -1.6451127000000e+00\r\n1713 1761 -2.7330142000000e+00\r\n1756 1761  2.6809404000000e+01\r\n1757 1761 -4.3423080000000e+00\r\n1758 1761 -2.5940381000000e+00\r\n1759 1761 -3.3229618000000e+02\r\n1760 1761  5.1308508000000e+01\r\n1761 1761  1.6199811000000e+01\r\n1764 1761 -2.7379691000000e+00\r\n1809 1761 -2.7331625000000e+00\r\n2865 1761 -2.9251949000000e+00\r\n658 1762 -4.0112686000000e-02\r\n660 1762 -1.0836605000000e-05\r\n1714 1762 -1.5265340000000e-02\r\n1716 1762 -1.2012940000000e-05\r\n1759 1762 -1.7280484000000e-01\r\n1761 1762 -1.2035044000000e-05\r\n1762 1762  2.6995334000000e+02\r\n1764 1762  7.0276120000000e-04\r\n1765 1762 -1.1303636000000e-03\r\n1767 1762 -1.1796986000000e-05\r\n1810 1762 -1.1496815000000e-03\r\n1812 1762 -1.1998596000000e-05\r\n2866 1762 -1.2169571000000e-03\r\n2868 1762 -1.2700715000000e-05\r\n658 1763  1.0345366000000e+01\r\n660 1763 -1.4584898000000e+00\r\n1716 1763 -1.6165621000000e+00\r\n1759 1763  1.6117870000000e+01\r\n1761 1763 -1.6197167000000e+00\r\n1762 1763 -1.8132328000000e+02\r\n1763 1763 -5.1495627000000e+01\r\n1764 1763  9.6666238000000e+00\r\n1767 1763 -1.6196478000000e+00\r\n1812 1763 -1.6167175000000e+00\r\n2868 1763 -1.7296952000000e+00\r\n658 1764  1.7487807000000e+01\r\n659 1764 -2.8325578000000e+00\r\n660 1764 -2.4654311000000e+00\r\n1716 1764 -2.7326365000000e+00\r\n1759 1764  2.7245647000000e+01\r\n1760 1764 -4.4130674000000e+00\r\n1761 1764 -2.7379691000000e+00\r\n1762 1764 -3.0650887000000e+02\r\n1763 1764  4.7151643000000e+01\r\n1764 1764  1.6340459000000e+01\r\n1767 1764 -2.7378505000000e+00\r\n1812 1764 -2.7328993000000e+00\r\n2868 1764 -2.9238767000000e+00\r\n661 1765 -1.0327461000000e-03\r\n663 1765 -1.0778205000000e-05\r\n1717 1765 -1.0973337000000e-03\r\n1719 1765 -1.1452271000000e-05\r\n1762 1765 -1.0388055000000e-01\r\n1764 1765 -1.1796986000000e-05\r\n1765 1765  2.6984629000000e+02\r\n1767 1765  6.8987731000000e-04\r\n1813 1765 -1.1378693000000e-03\r\n1815 1765 -1.1875319000000e-05\r\n2869 1765 -1.1707371000000e-02\r\n2871 1765 -1.2603672000000e-05\r\n661 1766  6.3924356000000e+00\r\n663 1766 -1.4589556000000e+00\r\n1719 1766 -1.6169162000000e+00\r\n1762 1766  1.0114327000000e+01\r\n1764 1766 -1.6196478000000e+00\r\n1765 1766 -1.7561032000000e+02\r\n1766 1766 -5.1490230000000e+01\r\n1767 1766  8.0486866000000e+00\r\n1813 1766  4.2357121000000e+00\r\n1815 1766 -1.6171003000000e+00\r\n2871 1766 -1.7302744000000e+00\r\n661 1767  1.0805765000000e+01\r\n662 1767 -1.7502718000000e+00\r\n663 1767 -2.4662167000000e+00\r\n1719 1767 -2.7332335000000e+00\r\n1762 1767  1.7097245000000e+01\r\n1763 1767 -2.7693391000000e+00\r\n1764 1767 -2.7378505000000e+00\r\n1765 1767 -2.9685147000000e+02\r\n1766 1767  4.5601587000000e+01\r\n1767 1767  1.3605490000000e+01\r\n1813 1767  7.1600424000000e+00\r\n1814 1767 -1.1597532000000e+00\r\n1815 1767 -2.7335442000000e+00\r\n2871 1767 -2.9248541000000e+00\r\n1768 1768  1.0000000000000e+00\r\n1769 1769  1.0000000000000e+00\r\n1770 1770  1.0000000000000e+00\r\n1771 1771  1.0000000000000e+00\r\n1772 1772  1.0000000000000e+00\r\n1773 1773  1.0000000000000e+00\r\n1774 1774  1.0000000000000e+00\r\n1775 1775  1.0000000000000e+00\r\n1776 1776  1.0000000000000e+00\r\n1777 1777  1.0000000000000e+00\r\n1778 1778  1.0000000000000e+00\r\n1779 1779  1.0000000000000e+00\r\n1780 1780  1.0000000000000e+00\r\n1781 1781  1.0000000000000e+00\r\n1782 1782  1.0000000000000e+00\r\n679 1783 -2.0344545000000e-03\r\n681 1783 -2.1232487000000e-05\r\n1783 1783  1.1337215000000e+02\r\n1785 1783  3.1999143000000e-04\r\n1786 1783 -1.1889087000000e-02\r\n1788 1783 -4.0530144000000e-06\r\n1831 1783 -4.2009502000000e-04\r\n1833 1783 -4.3843017000000e-06\r\n2887 1783 -5.2840465000000e-02\r\n2889 1783 -2.5176046000000e-05\r\n679 1784  4.4623239000000e-01\r\n681 1784 -3.4702348000000e+00\r\n1783 1784 -6.8660562000000e+01\r\n1784 1784 -2.1608517000000e+01\r\n1785 1784  8.9769714000000e+00\r\n1786 1784  3.1445519000000e+00\r\n1788 1784 -6.6272767000000e-01\r\n1833 1784 -7.2523623000000e-01\r\n2889 1784 -4.1163478000000e+00\r\n679 1785  7.5431073000000e-01\r\n680 1785 -1.2219412000000e-01\r\n681 1785 -5.8660810000000e+00\r\n1783 1785 -1.1606375000000e+02\r\n1784 1785  1.7802766000000e+01\r\n1785 1785  1.5174662000000e+01\r\n1786 1785  5.3155474000000e+00\r\n1787 1785 -8.6108879000000e-01\r\n1788 1785 -1.1202741000000e+00\r\n1833 1785 -1.2259385000000e+00\r\n2889 1785 -6.9582695000000e+00\r\n682 1786 -2.1762259000000e-03\r\n684 1786 -2.2712078000000e-05\r\n1738 1786 -3.9250766000000e-02\r\n1740 1786 -4.0328039000000e-06\r\n1783 1786 -3.8835173000000e-04\r\n1785 1786 -4.0530144000000e-06\r\n1786 1786  1.0801808000000e+02\r\n1788 1786  3.1834302000000e-04\r\n1789 1786 -1.7943929000000e-02\r\n1791 1786 -4.0306948000000e-06\r\n1834 1786 -3.8955156000000e-04\r\n1836 1786 -4.0655363000000e-06\r\n2890 1786 -5.2961635000000e-02\r\n2892 1786 -2.6928775000000e-05\r\n682 1787  4.5034387000000e-01\r\n684 1787 -3.6457717000000e+00\r\n1738 1787  2.8889618000000e+00\r\n1740 1787 -6.4756021000000e-01\r\n1785 1787 -6.6272767000000e-01\r\n1786 1787 -6.9213653000000e+01\r\n1787 1787 -2.0583738000000e+01\r\n1788 1787  1.0592832000000e+01\r\n1789 1787  3.9090414000000e+00\r\n1791 1787 -6.4726334000000e-01\r\n1836 1787 -6.6324472000000e-01\r\n2892 1787 -4.3239533000000e+00\r\n682 1788  7.6126127000000e-01\r\n683 1788 -1.2331862000000e-01\r\n684 1788 -6.1628125000000e+00\r\n1738 1788  4.8835010000000e+00\r\n1739 1788 -7.9109055000000e-01\r\n1740 1788 -1.0946358000000e+00\r\n1785 1788 -1.1202741000000e+00\r\n1786 1788 -1.1699876000000e+02\r\n1787 1788  1.7991234000000e+01\r\n1788 1788  1.7906123000000e+01\r\n1789 1788  6.6078435000000e+00\r\n1790 1788 -1.0704211000000e+00\r\n1791 1788 -1.0941339000000e+00\r\n1836 1788 -1.1211489000000e+00\r\n2892 1788 -7.3092107000000e+00\r\n685 1789 -2.2239246000000e-03\r\n687 1789 -2.3209883000000e-05\r\n1741 1789 -3.4935035000000e-02\r\n1743 1789 -4.1248881000000e-06\r\n1786 1789 -3.8621311000000e-04\r\n1788 1789 -4.0306948000000e-06\r\n1789 1789  1.0803820000000e+02\r\n1791 1789  3.1959802000000e-04\r\n1792 1789 -4.8309404000000e-02\r\n1794 1789 -4.1261489000000e-06\r\n1837 1789 -3.8920994000000e-04\r\n1839 1789 -4.0619711000000e-06\r\n2893 1789 -5.2331484000000e-02\r\n2895 1789 -2.7523332000000e-05\r\n685 1790  5.3879822000000e-01\r\n687 1790 -3.6426013000000e+00\r\n1741 1790  1.8403586000000e+00\r\n1743 1790 -6.4748172000000e-01\r\n1788 1790 -6.4726334000000e-01\r\n1789 1790 -6.9988742000000e+01\r\n1790 1790 -2.0588667000000e+01\r\n1791 1790  1.0555334000000e+01\r\n1792 1790  5.6511986000000e+00\r\n1794 1790 -6.4772801000000e-01\r\n1839 1790 -6.4762352000000e-01\r\n2895 1790 -4.3203223000000e+00\r\n685 1791  9.1078393000000e-01\r\n686 1791 -1.4753817000000e-01\r\n687 1791 -6.1574493000000e+00\r\n1741 1791  3.1109401000000e+00\r\n1742 1791 -5.0394217000000e-01\r\n1743 1791 -1.0945024000000e+00\r\n1788 1791 -1.0941339000000e+00\r\n1789 1791 -1.1830889000000e+02\r\n1790 1791  1.8191121000000e+01\r\n1791 1791  1.7842726000000e+01\r\n1792 1791  9.5527798000000e+00\r\n1793 1791 -1.5474577000000e+00\r\n1794 1791 -1.0949187000000e+00\r\n1839 1791 -1.0947419000000e+00\r\n2895 1791 -7.3030692000000e+00\r\n688 1792 -2.2975010000000e-03\r\n690 1792 -2.3977760000000e-05\r\n1744 1792 -3.8165343000000e-02\r\n1746 1792 -4.6450536000000e-06\r\n1789 1792 -3.9535934000000e-04\r\n1791 1792 -4.1261489000000e-06\r\n1792 1792  1.0806751000000e+02\r\n1794 1792  3.2261263000000e-04\r\n1795 1792 -8.2053303000000e-02\r\n1797 1792 -4.7339249000000e-06\r\n1840 1792 -4.0135963000000e-04\r\n1842 1792 -4.1887707000000e-06\r\n2896 1792 -4.9200501000000e-02\r\n2898 1792 -2.8415874000000e-05\r\n688 1793  9.8968364000000e-01\r\n690 1793 -3.6428105000000e+00\r\n1744 1793  1.5903447000000e+00\r\n1746 1793 -7.0625909000000e-01\r\n1791 1793 -6.4772801000000e-01\r\n1792 1793 -7.2373388000000e+01\r\n1793 1793 -2.0592885000000e+01\r\n1794 1793  1.0687176000000e+01\r\n1795 1793  7.8410561000000e+00\r\n1797 1793 -7.1982591000000e-01\r\n1842 1793 -6.4769346000000e-01\r\n2898 1793 -4.3205436000000e+00\r\n688 1794  1.6729612000000e+00\r\n689 1794 -2.7099783000000e-01\r\n690 1794 -6.1578069000000e+00\r\n1744 1794  2.6883187000000e+00\r\n1745 1794 -4.3547246000000e-01\r\n1746 1794 -1.1938604000000e+00\r\n1791 1794 -1.0949187000000e+00\r\n1792 1794 -1.2233997000000e+02\r\n1793 1794  1.8833227000000e+01\r\n1794 1794  1.8065601000000e+01\r\n1795 1794  1.3254521000000e+01\r\n1796 1794 -2.1470590000000e+00\r\n1797 1794 -1.2167937000000e+00\r\n1842 1794 -1.0948610000000e+00\r\n2898 1794 -7.3034469000000e+00\r\n691 1795 -1.9178555000000e-03\r\n693 1795 -2.0015607000000e-05\r\n1747 1795 -5.7493821000000e-02\r\n1749 1795 -5.8372964000000e-06\r\n1792 1795 -4.5359522000000e-04\r\n1794 1795 -4.7339249000000e-06\r\n1795 1795  1.3507698000000e+02\r\n1797 1795  3.8104181000000e-04\r\n1798 1795 -1.1283663000000e-01\r\n1800 1795 -6.0380577000000e-06\r\n1843 1795 -4.8625713000000e-04\r\n1845 1795 -5.0747994000000e-06\r\n2899 1795 -4.0000201000000e-02\r\n2901 1795 -2.3677654000000e-05\r\n691 1796  2.2545016000000e+00\r\n693 1796 -2.9196208000000e+00\r\n1747 1796  2.3427932000000e+00\r\n1749 1796 -8.5397505000000e-01\r\n1794 1796 -7.1982591000000e-01\r\n1795 1796 -9.2422249000000e+01\r\n1796 1796 -2.5745523000000e+01\r\n1797 1796  9.6008817000000e+00\r\n1798 1796  1.0391003000000e+01\r\n1800 1796 -8.8341743000000e-01\r\n1845 1796 -7.5715025000000e-01\r\n2901 1796 -3.4639961000000e+00\r\n691 1797  3.8110069000000e+00\r\n692 1797 -6.1731790000000e-01\r\n693 1797 -4.9353235000000e+00\r\n1747 1797  3.9602548000000e+00\r\n1748 1797 -6.4149352000000e-01\r\n1749 1797 -1.4435584000000e+00\r\n1794 1797 -1.2167937000000e+00\r\n1795 1797 -1.5623046000000e+02\r\n1796 1797  2.4065408000000e+01\r\n1797 1797  1.6229320000000e+01\r\n1798 1797  1.7564939000000e+01\r\n1799 1797 -2.8452196000000e+00\r\n1800 1797 -1.4933278000000e+00\r\n1845 1797 -1.2798859000000e+00\r\n2901 1797 -5.8555350000000e+00\r\n694 1798 -1.6695103000000e-03\r\n696 1798 -1.7423765000000e-05\r\n1750 1798 -9.7878816000000e-02\r\n1752 1798 -7.1247943000000e-06\r\n1795 1798 -5.7855462000000e-04\r\n1797 1798 -6.0380577000000e-06\r\n1798 1798  1.6208701000000e+02\r\n1800 1798  4.4396095000000e-04\r\n1801 1798 -1.3546725000000e-01\r\n1803 1798 -7.5417599000000e-06\r\n1846 1798 -6.2223328000000e-04\r\n1848 1798 -6.4939081000000e-06\r\n2902 1798 -1.9986854000000e-02\r\n2904 1798 -2.0530161000000e-05\r\n694 1799  5.1369605000000e+00\r\n696 1799 -2.4321780000000e+00\r\n1750 1799  5.4105136000000e+00\r\n1752 1799 -1.0013891000000e+00\r\n1797 1799 -8.8341743000000e-01\r\n1798 1799 -1.1526550000000e+02\r\n1799 1799 -3.0899754000000e+01\r\n1800 1799  9.2013852000000e+00\r\n1801 1799  1.1804877000000e+01\r\n1803 1799 -1.0600584000000e+00\r\n1848 1799 -9.3536084000000e-01\r\n2904 1799 -2.8855036000000e+00\r\n694 1800  8.6835180000000e+00\r\n695 1800 -1.4065417000000e+00\r\n696 1800 -4.1113536000000e+00\r\n1750 1800  9.1459321000000e+00\r\n1751 1800 -1.4814428000000e+00\r\n1752 1800 -1.6927482000000e+00\r\n1797 1800 -1.4933278000000e+00\r\n1798 1800 -1.9484480000000e+02\r\n1799 1800  3.0058278000000e+01\r\n1800 1800  1.5554020000000e+01\r\n1801 1800  1.9954964000000e+01\r\n1802 1800 -3.2322717000000e+00\r\n1803 1800 -1.7919227000000e+00\r\n1848 1800 -1.5811340000000e+00\r\n2904 1800 -4.8776553000000e+00\r\n697 1801 -3.6361006000000e-02\r\n699 1801 -1.4957052000000e-05\r\n1753 1801 -1.7438127000000e-01\r\n1755 1801 -8.7091136000000e-06\r\n1798 1801 -7.2263635000000e-04\r\n1800 1801 -7.5417599000000e-06\r\n1801 1801  1.9451755000000e+02\r\n1803 1801  5.2093730000000e-04\r\n1804 1801 -1.1214604000000e-01\r\n1806 1801 -9.4657299000000e-06\r\n1849 1801 -7.7490891000000e-04\r\n1851 1801 -8.0873000000000e-06\r\n2905 1801 -1.6856987000000e-03\r\n2907 1801 -1.7592714000000e-05\r\n697 1802  9.9422740000000e+00\r\n699 1802 -2.0270036000000e+00\r\n1753 1802  1.2361556000000e+01\r\n1755 1802 -1.1802067000000e+00\r\n1800 1802 -1.0600584000000e+00\r\n1801 1802 -1.4259383000000e+02\r\n1802 1802 -3.7084526000000e+01\r\n1803 1802  9.0899510000000e+00\r\n1804 1802  8.8013890000000e+00\r\n1806 1802 -1.2827506000000e+00\r\n1851 1802 -1.1308285000000e+00\r\n2907 1802 -2.4049276000000e+00\r\n697 1803  1.6806408000000e+01\r\n698 1803 -2.7222043000000e+00\r\n699 1803 -3.4264445000000e+00\r\n1753 1803  2.0895960000000e+01\r\n1754 1803 -3.3846061000000e+00\r\n1755 1803 -1.9950201000000e+00\r\n1800 1803 -1.7919227000000e+00\r\n1801 1803 -2.4104046000000e+02\r\n1802 1803  3.7227496000000e+01\r\n1803 1803  1.5365644000000e+01\r\n1804 1803  1.4877859000000e+01\r\n1805 1803 -2.4098289000000e+00\r\n1806 1803 -2.1683601000000e+00\r\n1851 1803 -1.9115514000000e+00\r\n2907 1803 -4.0652867000000e+00\r\n700 1804 -7.6291503000000e-02\r\n702 1804 -1.2512836000000e-05\r\n1756 1804 -2.9356815000000e-01\r\n1758 1804 -1.0848838000000e-05\r\n1801 1804 -9.0698731000000e-04\r\n1803 1804 -9.4657299000000e-06\r\n1804 1804  2.3771689000000e+02\r\n1806 1804  6.2461449000000e-04\r\n1807 1804 -1.0893372000000e-03\r\n1809 1804 -1.1368816000000e-05\r\n1852 1804 -9.7283384000000e-04\r\n1854 1804 -1.0152934000000e-05\r\n2908 1804 -1.4038815000000e-03\r\n2910 1804 -1.4651543000000e-05\r\n700 1805  1.3900146000000e+01\r\n702 1805 -1.6590973000000e+00\r\n1756 1805  2.2350159000000e+01\r\n1758 1805 -1.4383759000000e+00\r\n1803 1805 -1.2827506000000e+00\r\n1804 1805 -1.7251084000000e+02\r\n1805 1805 -4.5327617000000e+01\r\n1806 1805  9.2591950000000e+00\r\n1809 1805 -1.5164090000000e+00\r\n1854 1805 -1.3893235000000e+00\r\n2910 1805 -1.9681342000000e+00\r\n700 1806  2.3496806000000e+01\r\n701 1806 -3.8058128000000e+00\r\n702 1806 -2.8045381000000e+00\r\n1756 1806  3.7780708000000e+01\r\n1757 1806 -6.1193978000000e+00\r\n1758 1806 -2.4314307000000e+00\r\n1803 1806 -2.1683601000000e+00\r\n1804 1806 -2.9161233000000e+02\r\n1805 1806  4.5009350000000e+01\r\n1806 1806  1.5651739000000e+01\r\n1809 1806 -2.5633354000000e+00\r\n1854 1806 -2.3485125000000e+00\r\n2910 1806 -3.3269340000000e+00\r\n703 1807 -3.3713512000000e-02\r\n705 1807 -1.0943588000000e-05\r\n1759 1807 -1.8201594000000e-01\r\n1761 1807 -1.2122384000000e-05\r\n1804 1807 -1.7390544000000e-02\r\n1806 1807 -1.1368816000000e-05\r\n1807 1807  2.6994798000000e+02\r\n1809 1807  7.0255065000000e-04\r\n1810 1807 -1.1518031000000e-03\r\n1812 1807 -1.2020739000000e-05\r\n1855 1807 -1.1382751000000e-03\r\n1857 1807 -1.1879554000000e-05\r\n2911 1807 -1.2300748000000e-03\r\n2913 1807 -1.2837617000000e-05\r\n703 1808  9.7211886000000e+00\r\n705 1808 -1.4597855000000e+00\r\n1759 1808  1.1574085000000e+01\r\n1761 1808 -1.6168748000000e+00\r\n1804 1808  2.9635679000000e+00\r\n1806 1808 -1.5164090000000e+00\r\n1807 1808 -1.7910548000000e+02\r\n1808 1808 -5.1505101000000e+01\r\n1809 1808  9.5663979000000e+00\r\n1812 1808 -1.6197874000000e+00\r\n1857 1808 -1.6165056000000e+00\r\n2913 1808 -1.7312366000000e+00\r\n703 1809  1.6432681000000e+01\r\n704 1809 -2.6616403000000e+00\r\n705 1809 -2.4676190000000e+00\r\n1759 1809  1.9564815000000e+01\r\n1760 1809 -3.1689595000000e+00\r\n1761 1809 -2.7331625000000e+00\r\n1804 1809  5.0096107000000e+00\r\n1805 1809 -8.1141850000000e-01\r\n1806 1809 -2.5633354000000e+00\r\n1807 1809 -3.0275963000000e+02\r\n1808 1809  4.6520833000000e+01\r\n1809 1809  1.6171028000000e+01\r\n1812 1809 -2.7380886000000e+00\r\n1857 1809 -2.7325391000000e+00\r\n2913 1809 -2.9264805000000e+00\r\n706 1810 -8.8675252000000e-03\r\n708 1810 -1.0837763000000e-05\r\n1762 1810 -6.2403481000000e-02\r\n1764 1810 -1.1998596000000e-05\r\n1807 1810 -5.2988615000000e-02\r\n1809 1810 -1.2020739000000e-05\r\n1810 1810  2.6984590000000e+02\r\n1812 1810  6.9097931000000e-04\r\n1813 1810 -1.1396550000000e-03\r\n1815 1810 -1.1893955000000e-05\r\n2914 1810 -6.0311753000000e-03\r\n2916 1810 -1.2854729000000e-05\r\n706 1811  7.2786198000000e+00\r\n708 1811 -1.4604714000000e+00\r\n1762 1811  5.7891668000000e-01\r\n1764 1811 -1.6167175000000e+00\r\n1807 1811  5.1032672000000e+00\r\n1809 1811 -1.6197874000000e+00\r\n1810 1811 -1.6781140000000e+02\r\n1811 1811 -5.1502392000000e+01\r\n1812 1811  8.0545803000000e+00\r\n1815 1811 -1.6197401000000e+00\r\n2916 1811 -1.7320662000000e+00\r\n706 1812  1.2303779000000e+01\r\n707 1812 -1.9928854000000e+00\r\n708 1812 -2.4687808000000e+00\r\n1762 1812  9.7860075000000e-01\r\n1763 1812 -1.5850733000000e-01\r\n1764 1812 -2.7328993000000e+00\r\n1807 1812  8.6265627000000e+00\r\n1808 1812 -1.3972740000000e+00\r\n1809 1812 -2.7380886000000e+00\r\n1810 1812 -2.8366839000000e+02\r\n1811 1812  4.3435542000000e+01\r\n1812 1812  1.3615461000000e+01\r\n1815 1812 -2.7380070000000e+00\r\n2916 1812 -2.9278847000000e+00\r\n709 1813 -1.0390959000000e-03\r\n711 1813 -1.0844475000000e-05\r\n1765 1813 -2.1406402000000e-02\r\n1767 1813 -1.1875319000000e-05\r\n1810 1813 -6.2819843000000e-02\r\n1812 1813 -1.1893955000000e-05\r\n1813 1813  2.6981877000000e+02\r\n1815 1813  6.7868937000000e-04\r\n2917 1813 -1.7018529000000e-02\r\n2919 1813 -1.2707884000000e-05\r\n709 1814  5.5196546000000e+00\r\n711 1814 -1.4591348000000e+00\r\n1767 1814 -1.6171003000000e+00\r\n1810 1814  5.2919592000000e+00\r\n1812 1814 -1.6197401000000e+00\r\n1813 1814 -1.6566496000000e+02\r\n1814 1814 -5.1500595000000e+01\r\n1815 1814  6.4322654000000e+00\r\n2919 1814 -1.7304932000000e+00\r\n709 1815  9.3304182000000e+00\r\n710 1815 -1.5112923000000e+00\r\n711 1815 -2.4665199000000e+00\r\n1767 1815 -2.7335442000000e+00\r\n1810 1815  8.9455222000000e+00\r\n1811 1815 -1.4489489000000e+00\r\n1812 1815 -2.7380070000000e+00\r\n1813 1815 -2.8003986000000e+02\r\n1814 1815  4.2852774000000e+01\r\n1815 1815  1.0873094000000e+01\r\n2919 1815 -2.9252241000000e+00\r\n1816 1816  1.0000000000000e+00\r\n1817 1817  1.0000000000000e+00\r\n1818 1818  1.0000000000000e+00\r\n1819 1819  1.0000000000000e+00\r\n1820 1820  1.0000000000000e+00\r\n1821 1821  1.0000000000000e+00\r\n1822 1822  1.0000000000000e+00\r\n1823 1823  1.0000000000000e+00\r\n1824 1824  1.0000000000000e+00\r\n1825 1825  1.0000000000000e+00\r\n1826 1826  1.0000000000000e+00\r\n1827 1827  1.0000000000000e+00\r\n1828 1828  1.0000000000000e+00\r\n1829 1829  1.0000000000000e+00\r\n1830 1830  1.0000000000000e+00\r\n727 1831 -1.7627555000000e-03\r\n729 1831 -1.8396914000000e-05\r\n1783 1831 -1.5354290000000e-02\r\n1785 1831 -4.3843017000000e-06\r\n1831 1831  1.2956429000000e+02\r\n1833 1831  3.5694669000000e-04\r\n1834 1831 -4.2519978000000e-04\r\n1836 1831 -4.4375773000000e-06\r\n1879 1831 -4.6811103000000e-04\r\n1881 1831 -4.8854185000000e-06\r\n2935 1831 -5.2523826000000e-02\r\n2937 1831 -2.1820208000000e-05\r\n727 1832  4.7361598000000e-01\r\n729 1832 -3.0418515000000e+00\r\n1783 1832  2.1429853000000e+00\r\n1785 1832 -7.2523623000000e-01\r\n1831 1832 -7.9601512000000e+01\r\n1832 1832 -2.4693282000000e+01\r\n1833 1832  8.9252988000000e+00\r\n1834 1832  2.6163863000000e+00\r\n1836 1832 -7.2388289000000e-01\r\n1881 1832 -8.2228962000000e-01\r\n2937 1832 -3.6092681000000e+00\r\n727 1833  8.0059990000000e-01\r\n728 1833 -1.2969360000000e-01\r\n729 1833 -5.1419423000000e+00\r\n1783 1833  3.6224997000000e+00\r\n1784 1833 -5.8682873000000e-01\r\n1785 1833 -1.2259385000000e+00\r\n1831 1833 -1.3455832000000e+02\r\n1832 1833  2.0661564000000e+01\r\n1833 1833  1.5087315000000e+01\r\n1834 1833  4.4227367000000e+00\r\n1835 1833 -7.1646354000000e-01\r\n1836 1833 -1.2236508000000e+00\r\n1881 1833 -1.3899972000000e+00\r\n2937 1833 -6.1011032000000e+00\r\n730 1834 -2.0406251000000e-03\r\n732 1834 -2.1296887000000e-05\r\n1786 1834 -3.6654252000000e-02\r\n1788 1834 -4.0655363000000e-06\r\n1831 1834 -1.2541000000000e-02\r\n1833 1834 -4.4375773000000e-06\r\n1834 1834  1.1342234000000e+02\r\n1836 1834  3.2863431000000e-04\r\n1837 1834 -1.7241399000000e-02\r\n1839 1834 -4.0635890000000e-06\r\n1882 1834 -4.1884696000000e-04\r\n1884 1834 -4.3712764000000e-06\r\n2938 1834 -5.2799427000000e-02\r\n2940 1834 -2.5256853000000e-05\r\n730 1835  4.6115962000000e-01\r\n732 1835 -3.4731796000000e+00\r\n1786 1835  2.7094703000000e+00\r\n1788 1835 -6.6324472000000e-01\r\n1833 1835 -7.2388289000000e-01\r\n1834 1835 -7.2226180000000e+01\r\n1835 1835 -2.1612590000000e+01\r\n1836 1835  1.0370998000000e+01\r\n1837 1835  3.9914205000000e+00\r\n1839 1835 -6.6297106000000e-01\r\n1884 1835 -7.2501701000000e-01\r\n2940 1835 -4.1202759000000e+00\r\n730 1836  7.7954422000000e-01\r\n731 1836 -1.2628154000000e-01\r\n732 1836 -5.8710629000000e+00\r\n1786 1836  4.5800887000000e+00\r\n1787 1836 -7.4194717000000e-01\r\n1788 1836 -1.1211489000000e+00\r\n1833 1836 -1.2236508000000e+00\r\n1834 1836 -1.2209113000000e+02\r\n1835 1836  1.8769138000000e+01\r\n1836 1836  1.7531134000000e+01\r\n1837 1836  6.7470971000000e+00\r\n1838 1836 -1.0929897000000e+00\r\n1839 1836 -1.1206863000000e+00\r\n1884 1836 -1.2255687000000e+00\r\n2940 1836 -6.9649144000000e+00\r\n733 1837 -2.1901939000000e-03\r\n735 1837 -2.2857855000000e-05\r\n1789 1837 -3.6900348000000e-02\r\n1791 1837 -4.0619711000000e-06\r\n1834 1837 -3.8936497000000e-04\r\n1836 1837 -4.0635890000000e-06\r\n1837 1837  1.0803430000000e+02\r\n1839 1837  3.1865465000000e-04\r\n1840 1837 -4.1747791000000e-02\r\n1842 1837 -4.0605177000000e-06\r\n1885 1837 -3.8233605000000e-04\r\n1887 1837 -3.9902320000000e-06\r\n2941 1837 -5.2785699000000e-02\r\n2943 1837 -2.7102875000000e-05\r\n733 1838  4.7214194000000e-01\r\n735 1838 -3.6432492000000e+00\r\n1789 1838  2.6576715000000e+00\r\n1791 1838 -6.4762352000000e-01\r\n1836 1838 -6.6297106000000e-01\r\n1837 1838 -7.0405894000000e+01\r\n1838 1838 -2.0588468000000e+01\r\n1839 1838  1.0572209000000e+01\r\n1840 1838  5.3173207000000e+00\r\n1842 1838 -6.4743079000000e-01\r\n1887 1838 -6.4753076000000e-01\r\n2943 1838 -4.3210899000000e+00\r\n733 1839  7.9810807000000e-01\r\n734 1839 -1.2928706000000e-01\r\n735 1839 -6.1585434000000e+00\r\n1789 1839  4.4925241000000e+00\r\n1790 1839 -7.2775254000000e-01\r\n1791 1839 -1.0947419000000e+00\r\n1836 1839 -1.1206863000000e+00\r\n1837 1839 -1.1901402000000e+02\r\n1838 1839  1.8306083000000e+01\r\n1839 1839  1.7871250000000e+01\r\n1840 1839  8.9883915000000e+00\r\n1841 1839 -1.4560467000000e+00\r\n1842 1839 -1.0944161000000e+00\r\n1887 1839 -1.0945853000000e+00\r\n2943 1839 -7.3043660000000e+00\r\n736 1840 -2.2595035000000e-03\r\n738 1840 -2.3581201000000e-05\r\n1792 1840 -4.3447644000000e-02\r\n1794 1840 -4.1887707000000e-06\r\n1837 1840 -3.8907069000000e-04\r\n1839 1840 -4.0605177000000e-06\r\n1840 1840  1.0804453000000e+02\r\n1842 1840  3.2079552000000e-04\r\n1843 1840 -5.1357459000000e-02\r\n1845 1840 -4.3870749000000e-06\r\n1888 1840 -3.9332922000000e-04\r\n1890 1840 -4.1049617000000e-06\r\n2944 1840 -5.1639411000000e-02\r\n2946 1840 -2.7951990000000e-05\r\n736 1841  6.4480901000000e-01\r\n738 1841 -3.6444874000000e+00\r\n1792 1841  2.9892049000000e+00\r\n1794 1841 -6.4769346000000e-01\r\n1839 1841 -6.4743079000000e-01\r\n1840 1841 -7.2357808000000e+01\r\n1841 1841 -2.0592914000000e+01\r\n1842 1841  1.0590126000000e+01\r\n1843 1841  6.7714276000000e+00\r\n1845 1841 -6.7841061000000e-01\r\n1890 1841 -6.4774506000000e-01\r\n2946 1841 -4.3220435000000e+00\r\n736 1842  1.0899851000000e+00\r\n737 1842 -1.7656524000000e-01\r\n738 1842 -6.1606414000000e+00\r\n1792 1842  5.0529519000000e+00\r\n1793 1842 -8.1852092000000e-01\r\n1794 1842 -1.0948610000000e+00\r\n1839 1842 -1.0944161000000e+00\r\n1840 1842 -1.2231364000000e+02\r\n1841 1842  1.8829160000000e+01\r\n1842 1842  1.7901548000000e+01\r\n1843 1842  1.1446421000000e+01\r\n1844 1842 -1.8541905000000e+00\r\n1845 1842 -1.1467853000000e+00\r\n1890 1842 -1.0949482000000e+00\r\n2946 1842 -7.3059823000000e+00\r\n739 1843 -2.1297054000000e-03\r\n741 1843 -2.2226569000000e-05\r\n1795 1843 -7.9778375000000e-02\r\n1797 1843 -5.0747994000000e-06\r\n1840 1843 -4.2036074000000e-04\r\n1842 1843 -4.3870749000000e-06\r\n1843 1843  1.1890076000000e+02\r\n1845 1843  3.4570613000000e-04\r\n1846 1843 -9.3184508000000e-02\r\n1848 1843 -5.3491131000000e-06\r\n1891 1843 -4.3647705000000e-04\r\n1893 1843 -4.5552719000000e-06\r\n2947 1843 -4.7033577000000e-02\r\n2949 1843 -2.6336006000000e-05\r\n739 1844  1.2772920000000e+00\r\n741 1844 -3.3123752000000e+00\r\n1795 1844  4.1842642000000e+00\r\n1797 1844 -7.5715025000000e-01\r\n1842 1844 -6.7841061000000e-01\r\n1843 1844 -8.1623769000000e+01\r\n1844 1844 -2.2658386000000e+01\r\n1845 1844  1.0173885000000e+01\r\n1846 1844  8.0234414000000e+00\r\n1848 1844 -7.9812720000000e-01\r\n1893 1844 -6.9594388000000e-01\r\n2949 1844 -3.9293287000000e+00\r\n739 1845  2.1591329000000e+00\r\n740 1845 -3.4974716000000e-01\r\n741 1845 -5.5992353000000e+00\r\n1795 1845  7.0730753000000e+00\r\n1796 1845 -1.1457322000000e+00\r\n1797 1845 -1.2798859000000e+00\r\n1842 1845 -1.1467853000000e+00\r\n1843 1845 -1.3797673000000e+02\r\n1844 1845  2.1252222000000e+01\r\n1845 1845  1.7197926000000e+01\r\n1846 1845  1.3562817000000e+01\r\n1847 1845 -2.1969729000000e+00\r\n1848 1845 -1.3491533000000e+00\r\n1893 1845 -1.1764226000000e+00\r\n2949 1845 -6.6421333000000e+00\r\n742 1846 -1.7438404000000e-03\r\n744 1846 -1.8199507000000e-05\r\n1798 1846 -1.0881623000000e-01\r\n1800 1846 -6.4939081000000e-06\r\n1843 1846 -5.1254132000000e-04\r\n1845 1846 -5.3491131000000e-06\r\n1846 1846  1.5129408000000e+02\r\n1848 1846  4.1790688000000e-04\r\n1849 1846 -1.0388809000000e-01\r\n1851 1846 -6.9062408000000e-06\r\n1894 1846 -5.6426636000000e-04\r\n1896 1846 -5.8889390000000e-06\r\n2950 1846 -3.7777033000000e-02\r\n2952 1846 -2.1524741000000e-05\r\n742 1847  2.5773871000000e+00\r\n744 1847 -2.6129498000000e+00\r\n1798 1847  6.7675836000000e+00\r\n1800 1847 -9.3536084000000e-01\r\n1845 1847 -7.9812720000000e-01\r\n1846 1847 -1.0485422000000e+02\r\n1847 1847 -2.8841163000000e+01\r\n1848 1847  9.3164495000000e+00\r\n1849 1847  8.7920353000000e+00\r\n1851 1847 -9.9479200000000e-01\r\n1896 1847 -8.7164905000000e-01\r\n2952 1847 -3.1003240000000e+00\r\n742 1848  4.3568151000000e+00\r\n743 1848 -7.0572155000000e-01\r\n744 1848 -4.4169304000000e+00\r\n1798 1848  1.1439923000000e+01\r\n1799 1848 -1.8530510000000e+00\r\n1800 1848 -1.5811340000000e+00\r\n1845 1848 -1.3491533000000e+00\r\n1846 1848 -1.7724558000000e+02\r\n1847 1848  2.7304935000000e+01\r\n1848 1848  1.5748525000000e+01\r\n1849 1848  1.4862056000000e+01\r\n1850 1848 -2.4073717000000e+00\r\n1851 1848 -1.6815964000000e+00\r\n1896 1848 -1.4734355000000e+00\r\n2952 1848 -5.2407877000000e+00\r\n745 1849 -1.4815586000000e-03\r\n747 1849 -1.5462216000000e-05\r\n1801 1849 -1.5796506000000e-01\r\n1803 1849 -8.0873000000000e-06\r\n1846 1849 -6.6174218000000e-04\r\n1848 1849 -6.9062408000000e-06\r\n1849 1849  1.8368457000000e+02\r\n1851 1849  4.9431217000000e-04\r\n1852 1849 -9.6520723000000e-02\r\n1854 1849 -8.7060903000000e-06\r\n1897 1849 -7.3050679000000e-04\r\n1899 1849 -7.6238993000000e-06\r\n2953 1849 -2.4271380000000e-02\r\n2955 1849 -1.8212201000000e-05\r\n745 1850  4.5255625000000e+00\r\n747 1850 -2.1468502000000e+00\r\n1801 1850  1.0780072000000e+01\r\n1803 1850 -1.1308285000000e+00\r\n1848 1850 -9.9479200000000e-01\r\n1849 1850 -1.2856659000000e+02\r\n1850 1850 -3.5024614000000e+01\r\n1851 1850  9.1376521000000e+00\r\n1852 1850  7.9663073000000e+00\r\n1854 1850 -1.2173762000000e+00\r\n1899 1850 -1.0973587000000e+00\r\n2955 1850 -2.5465029000000e+00\r\n745 1851  7.6500063000000e+00\r\n746 1851 -1.2391313000000e+00\r\n747 1851 -3.6290334000000e+00\r\n1801 1851  1.8222623000000e+01\r\n1802 1851 -2.9516605000000e+00\r\n1803 1851 -1.9115514000000e+00\r\n1848 1851 -1.6815964000000e+00\r\n1849 1851 -2.1732884000000e+02\r\n1850 1851  3.3487759000000e+01\r\n1851 1851  1.5446279000000e+01\r\n1852 1851  1.3466238000000e+01\r\n1853 1851 -2.1812317000000e+00\r\n1854 1851 -2.0578516000000e+00\r\n1899 1851 -1.8549738000000e+00\r\n2955 1851 -4.3046060000000e+00\r\n748 1852 -1.2303848000000e-03\r\n750 1852 -1.2840853000000e-05\r\n1804 1852 -2.0536677000000e-01\r\n1806 1852 -1.0152934000000e-05\r\n1849 1852 -8.3420016000000e-04\r\n1851 1852 -8.7060903000000e-06\r\n1852 1852  2.2682106000000e+02\r\n1854 1852  5.9753006000000e-04\r\n1855 1852 -4.3583597000000e-02\r\n1857 1852 -1.0807959000000e-05\r\n1900 1852 -9.2131834000000e-04\r\n1902 1852 -9.6152951000000e-06\r\n2956 1852 -1.5524926000000e-02\r\n2958 1852 -1.5067541000000e-05\r\n748 1853  5.9457629000000e+00\r\n750 1853 -1.7380630000000e+00\r\n1804 1853  1.3685122000000e+01\r\n1806 1853 -1.3893235000000e+00\r\n1851 1853 -1.2173762000000e+00\r\n1852 1853 -1.5211895000000e+02\r\n1853 1853 -4.3268319000000e+01\r\n1854 1853  9.2315550000000e+00\r\n1855 1853  2.4221967000000e+00\r\n1857 1853 -1.4789555000000e+00\r\n1902 1853 -1.3411889000000e+00\r\n2958 1853 -2.0617751000000e+00\r\n748 1854  1.0050718000000e+01\r\n749 1854 -1.6279674000000e+00\r\n750 1854 -2.9380216000000e+00\r\n1804 1854  2.3133330000000e+01\r\n1805 1854 -3.7470265000000e+00\r\n1806 1854 -2.3485125000000e+00\r\n1851 1854 -2.0578516000000e+00\r\n1852 1854 -2.5714188000000e+02\r\n1853 1854  3.9525830000000e+01\r\n1854 1854  1.5605019000000e+01\r\n1855 1854  4.0944812000000e+00\r\n1856 1854 -6.6320456000000e-01\r\n1857 1854 -2.5000264000000e+00\r\n1902 1854 -2.2671456000000e+00\r\n2958 1854 -3.4852246000000e+00\r\n751 1855 -1.0395741000000e-03\r\n753 1855 -1.0849465000000e-05\r\n1807 1855 -1.7507871000000e-01\r\n1809 1855 -1.1879554000000e-05\r\n1852 1855 -1.0355970000000e-03\r\n1854 1855 -1.0807959000000e-05\r\n1855 1855  2.6990596000000e+02\r\n1857 1855  6.8922445000000e-04\r\n1903 1855 -1.1115532000000e-03\r\n1905 1855 -1.1600672000000e-05\r\n2959 1855 -1.9985788000000e-02\r\n2961 1855 -1.2725786000000e-05\r\n751 1856  5.1931919000000e+00\r\n753 1856 -1.4599415000000e+00\r\n1807 1856  1.0116538000000e+01\r\n1809 1856 -1.6165056000000e+00\r\n1854 1856 -1.4789555000000e+00\r\n1855 1856 -1.7015155000000e+02\r\n1856 1856 -5.1508807000000e+01\r\n1857 1856  7.8930001000000e+00\r\n1905 1856 -1.6001767000000e+00\r\n2961 1856 -1.7316203000000e+00\r\n751 1857  8.7785651000000e+00\r\n752 1857 -1.4219055000000e+00\r\n753 1857 -2.4678833000000e+00\r\n1807 1857  1.7100984000000e+01\r\n1808 1857 -2.7699267000000e+00\r\n1809 1857 -2.7325391000000e+00\r\n1854 1857 -2.5000264000000e+00\r\n1855 1857 -2.8762397000000e+02\r\n1856 1857  4.4061014000000e+01\r\n1857 1857  1.3342320000000e+01\r\n1905 1857 -2.7049376000000e+00\r\n2961 1857 -2.9271289000000e+00\r\n1858 1858  1.0000000000000e+00\r\n1859 1859  1.0000000000000e+00\r\n1860 1860  1.0000000000000e+00\r\n1861 1861  1.0000000000000e+00\r\n1862 1862  1.0000000000000e+00\r\n1863 1863  1.0000000000000e+00\r\n1864 1864  1.0000000000000e+00\r\n1865 1865  1.0000000000000e+00\r\n1866 1866  1.0000000000000e+00\r\n1867 1867  1.0000000000000e+00\r\n1868 1868  1.0000000000000e+00\r\n1869 1869  1.0000000000000e+00\r\n1870 1870  1.0000000000000e+00\r\n1871 1871  1.0000000000000e+00\r\n1872 1872  1.0000000000000e+00\r\n1873 1873  1.0000000000000e+00\r\n1874 1874  1.0000000000000e+00\r\n1875 1875  1.0000000000000e+00\r\n772 1876 -1.3682081000000e-03\r\n774 1876 -1.4279239000000e-05\r\n1876 1876  1.6193772000000e+02\r\n1878 1876  4.2113976000000e-04\r\n1879 1876 -5.2298365000000e-04\r\n1881 1876 -5.4580940000000e-06\r\n1924 1876 -5.7036811000000e-03\r\n1926 1876 -5.6985528000000e-06\r\n2980 1876 -5.1615507000000e-02\r\n2982 1876 -1.6926631000000e-05\r\n772 1877  5.5238695000000e-01\r\n774 1877 -2.4305303000000e+00\r\n1876 1877 -9.6325749000000e+01\r\n1877 1877 -3.0856113000000e+01\r\n1878 1877  7.2066814000000e+00\r\n1879 1877  2.7981439000000e+00\r\n1881 1877 -9.1859475000000e-01\r\n1926 1877 -9.7071914000000e-01\r\n2982 1877 -2.8833788000000e+00\r\n772 1878  9.3375490000000e-01\r\n773 1878 -1.5126664000000e-01\r\n774 1878 -4.1085685000000e+00\r\n1876 1878 -1.6282905000000e+02\r\n1877 1878  2.4983323000000e+01\r\n1878 1878  1.2182174000000e+01\r\n1879 1878  4.7299825000000e+00\r\n1880 1878 -7.6624879000000e-01\r\n1881 1878 -1.5527926000000e+00\r\n1926 1878 -1.6409036000000e+00\r\n2982 1878 -4.8740636000000e+00\r\n775 1879 -1.5401932000000e-03\r\n777 1879 -1.6074153000000e-05\r\n1831 1879 -2.5316249000000e-02\r\n1833 1879 -4.8854185000000e-06\r\n1876 1879 -7.7146665000000e-03\r\n1878 1879 -5.4580940000000e-06\r\n1879 1879  1.4577699000000e+02\r\n1881 1879  3.9679183000000e-04\r\n1882 1879 -4.7447408000000e-04\r\n1884 1879 -4.9518262000000e-06\r\n1927 1879 -5.4925528000000e-03\r\n1929 1879 -5.4636132000000e-06\r\n2983 1879 -5.2014773000000e-02\r\n2985 1879 -1.9060727000000e-05\r\n775 1880  5.2312342000000e-01\r\n777 1880 -2.7035268000000e+00\r\n1831 1880  3.6040503000000e+00\r\n1833 1880 -8.2228962000000e-01\r\n1878 1880 -9.1859475000000e-01\r\n1879 1880 -9.0858930000000e+01\r\n1880 1880 -2.7776287000000e+01\r\n1881 1880  9.3962922000000e+00\r\n1882 1880  3.0620254000000e+00\r\n1884 1880 -8.2121591000000e-01\r\n1929 1880 -9.1952951000000e-01\r\n2985 1880 -3.2080206000000e+00\r\n775 1881  8.8428709000000e-01\r\n776 1881 -1.4325203000000e-01\r\n777 1881 -4.5700380000000e+00\r\n1831 1881  6.0922817000000e+00\r\n1832 1881 -9.8693260000000e-01\r\n1833 1881 -1.3899972000000e+00\r\n1878 1881 -1.5527926000000e+00\r\n1879 1881 -1.5358782000000e+02\r\n1880 1881  2.3611475000000e+01\r\n1881 1881  1.5883482000000e+01\r\n1882 1881  5.1760440000000e+00\r\n1883 1881 -8.3850459000000e-01\r\n1884 1881 -1.3881823000000e+00\r\n1929 1881 -1.5543716000000e+00\r\n2985 1881 -5.4228342000000e+00\r\n778 1882 -1.7572603000000e-03\r\n780 1882 -1.8339563000000e-05\r\n1834 1882 -1.4385499000000e-02\r\n1836 1882 -4.3712764000000e-06\r\n1879 1882 -5.2273750000000e-03\r\n1881 1882 -4.9518262000000e-06\r\n1882 1882  1.2957379000000e+02\r\n1884 1882  3.6139659000000e-04\r\n1885 1882 -8.5518109000000e-03\r\n1887 1882 -4.2522785000000e-06\r\n1930 1882 -4.5146567000000e-04\r\n1932 1882 -4.7117000000000e-06\r\n2986 1882 -5.2447066000000e-02\r\n2988 1882 -2.1750669000000e-05\r\n778 1883  4.7974413000000e-01\r\n780 1883 -3.0402072000000e+00\r\n1834 1883  3.0947403000000e+00\r\n1836 1883 -7.2501701000000e-01\r\n1881 1883 -8.2121591000000e-01\r\n1882 1883 -8.1877839000000e+01\r\n1883 1883 -2.4695931000000e+01\r\n1884 1883  9.6944012000000e+00\r\n1885 1883  3.9384884000000e+00\r\n1887 1883 -7.0530200000000e-01\r\n1932 1883 -7.9257688000000e-01\r\n2988 1883 -3.6073107000000e+00\r\n778 1884  8.1095948000000e-01\r\n779 1884 -1.3137192000000e-01\r\n780 1884 -5.1391662000000e+00\r\n1834 1884  5.2313490000000e+00\r\n1835 1884 -8.4745588000000e-01\r\n1836 1884 -1.2255687000000e+00\r\n1881 1884 -1.3881823000000e+00\r\n1882 1884 -1.3840630000000e+02\r\n1883 1884  2.1278445000000e+01\r\n1884 1884  1.6387415000000e+01\r\n1885 1884  6.6576208000000e+00\r\n1886 1884 -1.0785057000000e+00\r\n1887 1884 -1.1922425000000e+00\r\n1932 1884 -1.3397720000000e+00\r\n2988 1884 -6.0977979000000e+00\r\n781 1885 -2.1547261000000e-03\r\n783 1885 -2.2487696000000e-05\r\n1837 1885 -2.1837092000000e-02\r\n1839 1885 -3.9902320000000e-06\r\n1882 1885 -4.0744482000000e-04\r\n1884 1885 -4.2522785000000e-06\r\n1885 1885  1.0800479000000e+02\r\n1887 1885  3.1791075000000e-04\r\n1888 1885 -2.4076337000000e-02\r\n1890 1885 -3.9845664000000e-06\r\n1933 1885 -3.8464484000000e-04\r\n1935 1885 -4.0143276000000e-06\r\n2989 1885 -5.2925043000000e-02\r\n2991 1885 -2.6665641000000e-05\r\n781 1886  4.5923005000000e-01\r\n783 1886 -3.6481002000000e+00\r\n1837 1886  3.0465115000000e+00\r\n1839 1886 -6.4753076000000e-01\r\n1884 1886 -7.0530200000000e-01\r\n1885 1886 -7.0290947000000e+01\r\n1886 1886 -2.0585626000000e+01\r\n1887 1886  1.0639977000000e+01\r\n1888 1886  4.8224163000000e+00\r\n1890 1886 -6.4663870000000e-01\r\n1935 1886 -6.6305749000000e-01\r\n2991 1886 -4.3270355000000e+00\r\n781 1887  7.7628199000000e-01\r\n782 1887 -1.2575274000000e-01\r\n783 1887 -6.1667448000000e+00\r\n1837 1887  5.1498198000000e+00\r\n1838 1887 -8.3423801000000e-01\r\n1839 1887 -1.0945853000000e+00\r\n1884 1887 -1.1922425000000e+00\r\n1885 1887 -1.1881974000000e+02\r\n1886 1887  1.8281811000000e+01\r\n1887 1887  1.7985806000000e+01\r\n1888 1887  8.1518075000000e+00\r\n1889 1887 -1.3205409000000e+00\r\n1890 1887 -1.0930774000000e+00\r\n1935 1887 -1.1208317000000e+00\r\n2991 1887 -7.3144156000000e+00\r\n784 1888 -2.2167704000000e-03\r\n786 1888 -2.3135219000000e-05\r\n1840 1888 -3.9496526000000e-02\r\n1842 1888 -4.1049617000000e-06\r\n1885 1888 -3.8179319000000e-04\r\n1887 1888 -3.9845664000000e-06\r\n1888 1888  1.0802336000000e+02\r\n1890 1888  3.1938638000000e-04\r\n1891 1888 -3.1541777000000e-02\r\n1893 1888 -4.1991334000000e-06\r\n1936 1888 -3.8492957000000e-04\r\n1938 1888 -4.0172991000000e-06\r\n2992 1888 -5.2634792000000e-02\r\n2994 1888 -2.7427728000000e-05\r\n784 1889  5.0941971000000e-01\r\n786 1889 -3.6492619000000e+00\r\n1840 1889  3.5366700000000e+00\r\n1842 1889 -6.4774506000000e-01\r\n1887 1889 -6.4663870000000e-01\r\n1888 1889 -7.1838586000000e+01\r\n1889 1889 -2.0591437000000e+01\r\n1890 1889  1.0583862000000e+01\r\n1891 1889  5.8379544000000e+00\r\n1893 1889 -6.6265230000000e-01\r\n1938 1889 -6.4743050000000e-01\r\n2994 1889 -4.3278193000000e+00\r\n784 1890  8.6112308000000e-01\r\n785 1890 -1.3949396000000e-01\r\n786 1890 -6.1687123000000e+00\r\n1840 1890  5.9783870000000e+00\r\n1841 1890 -9.6844330000000e-01\r\n1842 1890 -1.0949482000000e+00\r\n1887 1890 -1.0930774000000e+00\r\n1888 1890 -1.2143595000000e+02\r\n1889 1890  1.8690919000000e+01\r\n1890 1890  1.7890960000000e+01\r\n1891 1890  9.8684780000000e+00\r\n1892 1890 -1.5986020000000e+00\r\n1893 1890 -1.1201474000000e+00\r\n1938 1890 -1.0944165000000e+00\r\n2994 1890 -7.3157458000000e+00\r\n787 1891 -2.1803832000000e-03\r\n789 1891 -2.2755466000000e-05\r\n1843 1891 -6.1991313000000e-02\r\n1845 1891 -4.5552719000000e-06\r\n1888 1891 -4.0235257000000e-04\r\n1890 1891 -4.1991334000000e-06\r\n1891 1891  1.1344473000000e+02\r\n1893 1891  3.3287716000000e-04\r\n1894 1891 -4.5095527000000e-02\r\n1896 1891 -4.9208480000000e-06\r\n1939 1891 -4.1622535000000e-04\r\n1941 1891 -4.3439161000000e-06\r\n2995 1891 -5.0597208000000e-02\r\n2997 1891 -2.6957113000000e-05\r\n787 1892  7.8845270000000e-01\r\n789 1892 -3.4736169000000e+00\r\n1843 1892  4.6147383000000e+00\r\n1845 1892 -6.9594388000000e-01\r\n1890 1892 -6.6265230000000e-01\r\n1891 1892 -7.7174379000000e+01\r\n1892 1892 -2.1627893000000e+01\r\n1893 1892  1.0384961000000e+01\r\n1894 1892  6.7286829000000e+00\r\n1896 1892 -7.5184989000000e-01\r\n1941 1892 -6.8011853000000e-01\r\n2997 1892 -4.1183464000000e+00\r\n787 1893  1.3327994000000e+00\r\n788 1893 -2.1589688000000e-01\r\n789 1893 -5.8717972000000e+00\r\n1843 1893  7.8007472000000e+00\r\n1844 1893 -1.2636238000000e+00\r\n1845 1893 -1.1764226000000e+00\r\n1890 1893 -1.1201474000000e+00\r\n1891 1893 -1.3045548000000e+02\r\n1892 1893  2.0085606000000e+01\r\n1893 1893  1.7554727000000e+01\r\n1894 1893  1.1374157000000e+01\r\n1895 1893 -1.8424714000000e+00\r\n1896 1893 -1.2709260000000e+00\r\n1941 1893 -1.1496714000000e+00\r\n2997 1893 -6.9616488000000e+00\r\n790 1894 -1.8180626000000e-03\r\n792 1894 -1.8974124000000e-05\r\n1846 1894 -1.2712021000000e-01\r\n1848 1894 -5.8889390000000e-06\r\n1891 1894 -4.7150582000000e-04\r\n1893 1894 -4.9208480000000e-06\r\n1894 1894  1.4053661000000e+02\r\n1896 1894  3.9251933000000e-04\r\n1897 1894 -1.1247037000000e-01\r\n1899 1894 -6.4451798000000e-06\r\n1942 1894 -5.2983208000000e-04\r\n1944 1894 -5.5295673000000e-06\r\n2998 1894 -4.5817235000000e-02\r\n3000 1894 -2.2481667000000e-05\r\n790 1895  1.4265019000000e+00\r\n792 1895 -2.8041797000000e+00\r\n1846 1895  6.7410271000000e+00\r\n1848 1895 -8.7164905000000e-01\r\n1893 1895 -7.5184989000000e-01\r\n1894 1895 -9.6260607000000e+01\r\n1895 1895 -2.6784777000000e+01\r\n1896 1895  9.5539122000000e+00\r\n1897 1895  7.5749029000000e+00\r\n1899 1895 -9.5401471000000e-01\r\n1944 1895 -8.4152480000000e-01\r\n3000 1895 -3.3276778000000e+00\r\n790 1896  2.4113587000000e+00\r\n791 1896 -3.9060161000000e-01\r\n792 1896 -4.7401854000000e+00\r\n1846 1896  1.1395032000000e+01\r\n1847 1896 -1.8458133000000e+00\r\n1848 1896 -1.4734355000000e+00\r\n1893 1896 -1.2709260000000e+00\r\n1894 1896 -1.6271893000000e+02\r\n1895 1896  2.5043815000000e+01\r\n1896 1896  1.6149932000000e+01\r\n1897 1896  1.2804616000000e+01\r\n1898 1896 -2.0741433000000e+00\r\n1899 1896 -1.6126664000000e+00\r\n1944 1896 -1.4225135000000e+00\r\n3000 1896 -5.6251066000000e+00\r\n793 1897 -1.4398869000000e-03\r\n795 1897 -1.5027311000000e-05\r\n1849 1897 -1.4525831000000e-01\r\n1851 1897 -7.6238993000000e-06\r\n1894 1897 -6.1756424000000e-04\r\n1896 1897 -6.4451798000000e-06\r\n1897 1897  1.8371826000000e+02\r\n1899 1897  4.9185286000000e-04\r\n1900 1897 -1.2848283000000e-01\r\n1902 1897 -8.3665884000000e-06\r\n1945 1897 -7.0272142000000e-04\r\n1947 1897 -7.3339187000000e-06\r\n3001 1897 -3.9784889000000e-02\r\n3003 1897 -1.7755663000000e-05\r\n793 1898  2.2860263000000e+00\r\n795 1898 -2.1546054000000e+00\r\n1849 1898  9.4717085000000e+00\r\n1851 1898 -1.0973587000000e+00\r\n1896 1898 -9.5401471000000e-01\r\n1897 1898 -1.2836321000000e+02\r\n1898 1898 -3.5025750000000e+01\r\n1899 1898  9.0671103000000e+00\r\n1900 1898  1.1312072000000e+01\r\n1902 1898 -1.2043097000000e+00\r\n1947 1898 -1.0972324000000e+00\r\n3003 1898 -2.5556453000000e+00\r\n793 1899  3.8642962000000e+00\r\n794 1899 -6.2594283000000e-01\r\n795 1899 -3.6421424000000e+00\r\n1849 1899  1.6010965000000e+01\r\n1850 1899 -2.5934732000000e+00\r\n1851 1899 -1.8549738000000e+00\r\n1896 1899 -1.6126664000000e+00\r\n1897 1899 -2.1698503000000e+02\r\n1898 1899  3.3430196000000e+01\r\n1899 1899  1.5327034000000e+01\r\n1900 1899  1.9121914000000e+01\r\n1901 1899 -3.0973879000000e+00\r\n1902 1899 -2.0357636000000e+00\r\n1947 1899 -1.8547602000000e+00\r\n3003 1899 -4.3200606000000e+00\r\n796 1900 -1.2311274000000e-03\r\n798 1900 -1.2848602000000e-05\r\n1852 1900 -1.4077561000000e-01\r\n1854 1900 -9.6152951000000e-06\r\n1897 1900 -8.0166977000000e-04\r\n1899 1900 -8.3665884000000e-06\r\n1900 1900  2.2139825000000e+02\r\n1902 1900  5.7404826000000e-04\r\n1903 1900 -6.7449494000000e-02\r\n1905 1900 -1.0368966000000e-05\r\n3004 1900 -3.2199498000000e-02\r\n3006 1900 -1.5150297000000e-05\r\n796 1901  3.3587507000000e+00\r\n798 1901 -1.7813940000000e+00\r\n1852 1901  7.7545697000000e+00\r\n1854 1901 -1.3411889000000e+00\r\n1899 1901 -1.2043097000000e+00\r\n1900 1901 -1.4289282000000e+02\r\n1901 1901 -4.2241754000000e+01\r\n1902 1901  7.8912239000000e+00\r\n1903 1901  4.8152646000000e+00\r\n1905 1901 -1.4463522000000e+00\r\n3006 1901 -2.1132209000000e+00\r\n796 1902  5.6776321000000e+00\r\n797 1902 -9.1964831000000e-01\r\n798 1902 -3.0112683000000e+00\r\n1852 1902  1.3108325000000e+01\r\n1853 1902 -2.1232529000000e+00\r\n1854 1902 -2.2671456000000e+00\r\n1899 1902 -2.0357636000000e+00\r\n1900 1902 -2.4154602000000e+02\r\n1901 1902  3.7042029000000e+01\r\n1902 1902  1.3339323000000e+01\r\n1903 1902  8.1397233000000e+00\r\n1904 1902 -1.3184515000000e+00\r\n1905 1902 -2.4449138000000e+00\r\n3006 1902 -3.5721885000000e+00\r\n799 1903 -1.0423520000000e-03\r\n801 1903 -1.0878457000000e-05\r\n1855 1903 -1.4048118000000e-01\r\n1857 1903 -1.1600672000000e-05\r\n1900 1903 -9.9353355000000e-04\r\n1902 1903 -1.0368966000000e-05\r\n1903 1903  2.6448201000000e+02\r\n1905 1903  6.6438031000000e-04\r\n3007 1903 -3.1922291000000e-02\r\n3009 1903 -1.2812511000000e-05\r\n799 1904  3.3795222000000e+00\r\n801 1904 -1.4898504000000e+00\r\n1855 1904  6.5452608000000e+00\r\n1857 1904 -1.6001767000000e+00\r\n1902 1904 -1.4463522000000e+00\r\n1903 1904 -1.6166186000000e+02\r\n1904 1904 -5.0484398000000e+01\r\n1905 1904  6.3093915000000e+00\r\n3009 1904 -1.7673253000000e+00\r\n799 1905  5.7127422000000e+00\r\n800 1905 -9.2532827000000e-01\r\n801 1905 -2.5184421000000e+00\r\n1855 1905  1.1064105000000e+01\r\n1856 1905 -1.7921216000000e+00\r\n1857 1905 -2.7049376000000e+00\r\n1902 1905 -2.4449138000000e+00\r\n1903 1905 -2.7327311000000e+02\r\n1904 1905  4.1773412000000e+01\r\n1905 1905  1.0665392000000e+01\r\n3009 1905 -2.9874848000000e+00\r\n1906 1906  1.0000000000000e+00\r\n1907 1907  1.0000000000000e+00\r\n1908 1908  1.0000000000000e+00\r\n1909 1909  1.0000000000000e+00\r\n1910 1910  1.0000000000000e+00\r\n1911 1911  1.0000000000000e+00\r\n1912 1912  1.0000000000000e+00\r\n1913 1913  1.0000000000000e+00\r\n1914 1914  1.0000000000000e+00\r\n1915 1915  1.0000000000000e+00\r\n1916 1916  1.0000000000000e+00\r\n1917 1917  1.0000000000000e+00\r\n1918 1918  1.0000000000000e+00\r\n1919 1919  1.0000000000000e+00\r\n1920 1920  1.0000000000000e+00\r\n1921 1921  1.0000000000000e+00\r\n1922 1922  1.0000000000000e+00\r\n1923 1923  1.0000000000000e+00\r\n820 1924 -1.3598413000000e-03\r\n822 1924 -1.4191919000000e-05\r\n1876 1924 -5.4602393000000e-04\r\n1878 1924 -5.6985528000000e-06\r\n1924 1924  1.6194470000000e+02\r\n1926 1924  4.2684968000000e-04\r\n1927 1924 -5.4574734000000e-04\r\n1929 1924 -5.6956662000000e-06\r\n1972 1924 -8.8439480000000e-03\r\n1974 1924 -5.6667857000000e-06\r\n3028 1924 -5.1505774000000e-02\r\n3030 1924 -1.6818596000000e-05\r\n820 1925  5.6215850000000e-01\r\n822 1925 -2.4292229000000e+00\r\n1876 1925  1.3611340000000e+00\r\n1878 1925 -9.7071914000000e-01\r\n1924 1925 -9.6497379000000e+01\r\n1925 1925 -3.0852941000000e+01\r\n1926 1925  8.2246738000000e+00\r\n1927 1925  1.5944959000000e+00\r\n1929 1925 -9.6938615000000e-01\r\n1974 1925 -9.7074826000000e-01\r\n3030 1925 -2.8811403000000e+00\r\n820 1926  9.5027273000000e-01\r\n821 1926 -1.5394300000000e-01\r\n822 1926 -4.1063585000000e+00\r\n1876 1926  2.3008609000000e+00\r\n1877 1926 -3.7273661000000e-01\r\n1878 1926 -1.6409036000000e+00\r\n1924 1926 -1.6311917000000e+02\r\n1925 1926  2.5038158000000e+01\r\n1926 1926  1.3902989000000e+01\r\n1927 1926  2.6953358000000e+00\r\n1928 1926 -4.3664106000000e-01\r\n1929 1926 -1.6386503000000e+00\r\n1974 1926 -1.6409528000000e+00\r\n3030 1926 -4.8702796000000e+00\r\n823 1927 -1.3713259000000e-03\r\n825 1927 -1.4311777000000e-05\r\n1879 1927 -5.2351249000000e-04\r\n1881 1927 -5.4636132000000e-06\r\n1924 1927 -8.0473167000000e-03\r\n1926 1927 -5.6956662000000e-06\r\n1927 1927  1.6194053000000e+02\r\n1929 1927  4.3210605000000e-04\r\n1930 1927 -5.0176739000000e-04\r\n1932 1927 -5.2366715000000e-06\r\n1975 1927 -5.4167195000000e-04\r\n1977 1927 -5.6531335000000e-06\r\n3031 1927 -5.1855591000000e-02\r\n3033 1927 -1.6968364000000e-05\r\n823 1928  5.2784843000000e-01\r\n825 1928 -2.4336098000000e+00\r\n1879 1928  2.5778537000000e+00\r\n1881 1928 -9.1952951000000e-01\r\n1926 1928 -9.6938615000000e-01\r\n1927 1928 -9.8694245000000e+01\r\n1928 1928 -3.0856855000000e+01\r\n1929 1928  9.0656151000000e+00\r\n1930 1928  2.6143063000000e+00\r\n1932 1928 -8.8078221000000e-01\r\n1977 1928 -9.7084846000000e-01\r\n3033 1928 -2.8880003000000e+00\r\n823 1929  8.9227438000000e-01\r\n824 1929 -1.4454689000000e-01\r\n825 1929 -4.1137712000000e+00\r\n1879 1929  4.3576008000000e+00\r\n1880 1929 -7.0592372000000e-01\r\n1881 1929 -1.5543716000000e+00\r\n1926 1929 -1.6386503000000e+00\r\n1927 1929 -1.6683264000000e+02\r\n1928 1929  2.5630146000000e+01\r\n1929 1929  1.5324507000000e+01\r\n1930 1929  4.4192202000000e+00\r\n1931 1929 -7.1590595000000e-01\r\n1932 1929 -1.4888732000000e+00\r\n1977 1929 -1.6411213000000e+00\r\n3033 1929 -4.8818723000000e+00\r\n826 1930 -1.6636560000000e-03\r\n828 1930 -1.7362667000000e-05\r\n1882 1930 -1.2450066000000e-02\r\n1884 1930 -4.7117000000000e-06\r\n1927 1930 -2.3695041000000e-02\r\n1929 1930 -5.2366715000000e-06\r\n1930 1930  1.3498291000000e+02\r\n1932 1930  3.7268180000000e-04\r\n1933 1930 -1.9379559000000e-03\r\n1935 1930 -4.3848042000000e-06\r\n1978 1930 -4.5528563000000e-04\r\n1980 1930 -4.7515669000000e-06\r\n3034 1930 -5.2252131000000e-02\r\n3036 1930 -2.0589990000000e-05\r\n826 1931  4.9816244000000e-01\r\n828 1931 -2.9189937000000e+00\r\n1882 1931  2.8246275000000e+00\r\n1884 1931 -7.9257688000000e-01\r\n1929 1931 -8.8078221000000e-01\r\n1930 1931 -8.4221274000000e+01\r\n1931 1931 -2.5721199000000e+01\r\n1932 1931  9.6051625000000e+00\r\n1933 1931  3.4298592000000e+00\r\n1935 1931 -7.3761286000000e-01\r\n1980 1931 -8.0898352000000e-01\r\n3036 1931 -3.4633279000000e+00\r\n826 1932  8.4209378000000e-01\r\n827 1932 -1.3641669000000e-01\r\n828 1932 -4.9342670000000e+00\r\n1882 1932  4.7747504000000e+00\r\n1883 1932 -7.7349535000000e-01\r\n1884 1932 -1.3397720000000e+00\r\n1929 1932 -1.4888732000000e+00\r\n1930 1932 -1.4236764000000e+02\r\n1931 1932  2.1881898000000e+01\r\n1932 1932  1.6236566000000e+01\r\n1933 1932  5.7978341000000e+00\r\n1934 1932 -9.3923186000000e-01\r\n1935 1932 -1.2468608000000e+00\r\n1980 1932 -1.3675057000000e+00\r\n3036 1932 -5.8544095000000e+00\r\n829 1933 -2.0178442000000e-03\r\n831 1933 -2.1059135000000e-05\r\n1885 1933 -1.6712968000000e-02\r\n1887 1933 -4.0143276000000e-06\r\n1930 1933 -4.2014317000000e-04\r\n1932 1933 -4.3848042000000e-06\r\n1933 1933  1.1338744000000e+02\r\n1935 1933  3.2763065000000e-04\r\n1936 1933 -1.3111279000000e-02\r\n1938 1933 -4.0079459000000e-06\r\n1981 1933 -3.8802292000000e-04\r\n1983 1933 -4.0495827000000e-06\r\n3037 1933 -5.2868056000000e-02\r\n3039 1933 -2.4974195000000e-05\r\n829 1934  4.5515115000000e-01\r\n831 1934 -3.4774202000000e+00\r\n1885 1934  2.9823913000000e+00\r\n1887 1934 -6.6305749000000e-01\r\n1932 1934 -7.3761286000000e-01\r\n1933 1934 -7.2722891000000e+01\r\n1934 1934 -2.1611440000000e+01\r\n1935 1934  1.0346880000000e+01\r\n1936 1934  4.2195423000000e+00\r\n1938 1934 -6.6202847000000e-01\r\n1983 1934 -6.7953492000000e-01\r\n3039 1934 -4.1247997000000e+00\r\n829 1935  7.6938705000000e-01\r\n830 1935 -1.2463713000000e-01\r\n831 1935 -5.8782276000000e+00\r\n1885 1935  5.0414313000000e+00\r\n1886 1935 -8.1668844000000e-01\r\n1887 1935 -1.1208317000000e+00\r\n1932 1935 -1.2468608000000e+00\r\n1933 1935 -1.2293071000000e+02\r\n1934 1935  1.8908185000000e+01\r\n1935 1935  1.7490356000000e+01\r\n1936 1935  7.1327105000000e+00\r\n1937 1935 -1.1554659000000e+00\r\n1938 1935 -1.1190923000000e+00\r\n1983 1935 -1.1486850000000e+00\r\n3039 1935 -6.9725578000000e+00\r\n832 1936 -2.1727911000000e-03\r\n834 1936 -2.2676231000000e-05\r\n1888 1936 -2.7603420000000e-02\r\n1890 1936 -4.0172991000000e-06\r\n1933 1936 -3.8403337000000e-04\r\n1935 1936 -4.0079459000000e-06\r\n1936 1936  1.0800416000000e+02\r\n1938 1936  3.1814256000000e-04\r\n1939 1936 -2.0496111000000e-02\r\n1941 1936 -4.1087426000000e-06\r\n1984 1936 -3.7683306000000e-04\r\n1986 1936 -3.9328003000000e-06\r\n3040 1936 -5.2989792000000e-02\r\n3042 1936 -2.6884237000000e-05\r\n832 1937  4.6107399000000e-01\r\n834 1937 -3.6531824000000e+00\r\n1888 1937  3.6138554000000e+00\r\n1890 1937 -6.4743050000000e-01\r\n1935 1937 -6.6202847000000e-01\r\n1936 1937 -7.1102064000000e+01\r\n1937 1937 -2.0588297000000e+01\r\n1938 1937  1.0606735000000e+01\r\n1939 1937  5.0681113000000e+00\r\n1941 1937 -6.6219948000000e-01\r\n1986 1937 -6.4715713000000e-01\r\n3042 1937 -4.3324235000000e+00\r\n832 1938  7.7939948000000e-01\r\n833 1938 -1.2625714000000e-01\r\n834 1938 -6.1753395000000e+00\r\n1888 1938  6.1088611000000e+00\r\n1889 1938 -9.8959181000000e-01\r\n1890 1938 -1.0944165000000e+00\r\n1935 1938 -1.1190923000000e+00\r\n1936 1938 -1.2019093000000e+02\r\n1937 1938  1.8497248000000e+01\r\n1938 1938  1.7929624000000e+01\r\n1939 1938  8.5671354000000e+00\r\n1940 1938 -1.3878147000000e+00\r\n1941 1938 -1.1193820000000e+00\r\n1986 1938 -1.0939544000000e+00\r\n3042 1938 -7.3235287000000e+00\r\n835 1939 -2.1290183000000e-03\r\n837 1939 -2.2219399000000e-05\r\n1891 1939 -4.0318724000000e-02\r\n1893 1939 -4.3439161000000e-06\r\n1936 1939 -3.9369150000000e-04\r\n1938 1939 -4.1087426000000e-06\r\n1939 1939  1.1341229000000e+02\r\n1941 1939  3.3117479000000e-04\r\n1942 1939 -2.9311834000000e-02\r\n1944 1939 -4.7987089000000e-06\r\n1987 1939 -4.0538554000000e-04\r\n1989 1939 -4.2307869000000e-06\r\n3043 1939 -5.2052241000000e-02\r\n3045 1939 -2.6331117000000e-05\r\n835 1940  5.8499962000000e-01\r\n837 1940 -3.4773703000000e+00\r\n1891 1940  4.5827496000000e+00\r\n1893 1940 -6.8011853000000e-01\r\n1938 1940 -6.6219948000000e-01\r\n1939 1940 -7.6112701000000e+01\r\n1940 1940 -2.1624608000000e+01\r\n1941 1940  1.0374867000000e+01\r\n1942 1940  5.8976992000000e+00\r\n1944 1940 -7.5135589000000e-01\r\n1989 1940 -6.7902624000000e-01\r\n3045 1940 -4.1223643000000e+00\r\n835 1941  9.8888256000000e-01\r\n836 1941 -1.6018912000000e-01\r\n837 1941 -5.8781421000000e+00\r\n1891 1941  7.7466736000000e+00\r\n1892 1941 -1.2548840000000e+00\r\n1893 1941 -1.1496714000000e+00\r\n1938 1941 -1.1193820000000e+00\r\n1939 1941 -1.2866081000000e+02\r\n1940 1941  1.9803364000000e+01\r\n1941 1941  1.7537663000000e+01\r\n1942 1941  9.9694632000000e+00\r\n1943 1941 -1.6149535000000e+00\r\n1944 1941 -1.2700910000000e+00\r\n1989 1941 -1.1478251000000e+00\r\n3045 1941 -6.9684400000000e+00\r\n838 1942 -1.7730079000000e-03\r\n840 1942 -1.8503913000000e-05\r\n1894 1942 -6.7527563000000e-02\r\n1896 1942 -5.5295673000000e-06\r\n1939 1942 -4.5980269000000e-04\r\n1941 1942 -4.7987089000000e-06\r\n1942 1942  1.4038514000000e+02\r\n1944 1942  3.9070966000000e-04\r\n1945 1942 -1.2654397000000e-02\r\n1947 1942 -6.2646258000000e-06\r\n1990 1942 -5.2024449000000e-04\r\n1992 1942 -5.4295069000000e-06\r\n3046 1942 -4.9917517000000e-02\r\n3048 1942 -2.1910194000000e-05\r\n838 1943  8.6180402000000e-01\r\n840 1943 -2.8132636000000e+00\r\n1894 1943  6.5958573000000e+00\r\n1896 1943 -8.4152480000000e-01\r\n1941 1943 -7.5135589000000e-01\r\n1942 1943 -9.2621167000000e+01\r\n1943 1943 -2.6781272000000e+01\r\n1944 1943  9.5378830000000e+00\r\n1945 1943  4.6401891000000e+00\r\n1947 1943 -9.5341677000000e-01\r\n1992 1943 -8.4106769000000e-01\r\n3048 1943 -3.3342396000000e+00\r\n838 1944  1.4567935000000e+00\r\n839 1944 -2.3598159000000e-01\r\n840 1944 -4.7555408000000e+00\r\n1894 1944  1.1149637000000e+01\r\n1895 1944 -1.8060961000000e+00\r\n1896 1944 -1.4225135000000e+00\r\n1941 1944 -1.2700910000000e+00\r\n1942 1944 -1.5656682000000e+02\r\n1943 1944  2.4056464000000e+01\r\n1944 1944  1.6122836000000e+01\r\n1945 1944  7.8437756000000e+00\r\n1946 1944 -1.2705895000000e+00\r\n1947 1944 -1.6116557000000e+00\r\n1992 1944 -1.4217408000000e+00\r\n3048 1944 -5.6361987000000e+00\r\n841 1945 -1.3791639000000e-03\r\n843 1945 -1.4393578000000e-05\r\n1897 1945 -2.0282098000000e-01\r\n1899 1945 -7.3339187000000e-06\r\n1942 1945 -6.0026392000000e-04\r\n1944 1945 -6.2646258000000e-06\r\n1945 1945  1.8365159000000e+02\r\n1947 1945  4.8141925000000e-04\r\n1993 1945 -6.8042328000000e-04\r\n1995 1945 -7.1012052000000e-06\r\n3049 1945 -4.7987493000000e-02\r\n3051 1945 -1.7045630000000e-05\r\n841 1946  1.0974181000000e+00\r\n843 1946 -2.1496197000000e+00\r\n1897 1946  1.1971675000000e+01\r\n1899 1946 -1.0972324000000e+00\r\n1944 1946 -9.5341677000000e-01\r\n1945 1946 -1.1835743000000e+02\r\n1946 1946 -3.5029675000000e+01\r\n1947 1946  7.8370049000000e+00\r\n1995 1946 -1.0825693000000e+00\r\n3051 1946 -2.5502210000000e+00\r\n841 1947  1.8550741000000e+00\r\n842 1947 -3.0049472000000e-01\r\n843 1947 -3.6337143000000e+00\r\n1897 1947  2.0236903000000e+01\r\n1898 1947 -3.2780807000000e+00\r\n1899 1947 -1.8547602000000e+00\r\n1944 1947 -1.6116557000000e+00\r\n1945 1947 -2.0007125000000e+02\r\n1946 1947  3.0681916000000e+01\r\n1947 1947  1.3247663000000e+01\r\n1995 1947 -1.8299736000000e+00\r\n3051 1947 -4.3108899000000e+00\r\n1948 1948  1.0000000000000e+00\r\n1949 1949  1.0000000000000e+00\r\n1950 1950  1.0000000000000e+00\r\n1951 1951  1.0000000000000e+00\r\n1952 1952  1.0000000000000e+00\r\n1953 1953  1.0000000000000e+00\r\n1954 1954  1.0000000000000e+00\r\n1955 1955  1.0000000000000e+00\r\n1956 1956  1.0000000000000e+00\r\n1957 1957  1.0000000000000e+00\r\n1958 1958  1.0000000000000e+00\r\n1959 1959  1.0000000000000e+00\r\n1960 1960  1.0000000000000e+00\r\n1961 1961  1.0000000000000e+00\r\n1962 1962  1.0000000000000e+00\r\n1963 1963  1.0000000000000e+00\r\n1964 1964  1.0000000000000e+00\r\n1965 1965  1.0000000000000e+00\r\n1966 1966  1.0000000000000e+00\r\n1967 1967  1.0000000000000e+00\r\n1968 1968  1.0000000000000e+00\r\n1969 1969  1.0000000000000e+00\r\n1970 1970  1.0000000000000e+00\r\n1971 1971  1.0000000000000e+00\r\n868 1972 -1.3515598000000e-03\r\n870 1972 -1.4105490000000e-05\r\n1924 1972 -5.4298008000000e-04\r\n1926 1972 -5.6667857000000e-06\r\n1972 1972  1.6194398000000e+02\r\n1974 1972  4.2654555000000e-04\r\n1975 1972 -5.4097895000000e-04\r\n1977 1972 -5.6459011000000e-06\r\n2020 1972 -4.0204471000000e-03\r\n2022 1972 -5.6321296000000e-06\r\n3076 1972 -5.1494177000000e-02\r\n3078 1972 -1.6715752000000e-05\r\n868 1973  5.6322181000000e-01\r\n870 1973 -2.4295537000000e+00\r\n1924 1973  1.5190409000000e+00\r\n1926 1973 -9.7074826000000e-01\r\n1972 1973 -9.6038303000000e+01\r\n1973 1973 -3.0849071000000e+01\r\n1974 1973  8.2257191000000e+00\r\n1975 1973  9.7113107000000e-01\r\n1977 1973 -9.6953747000000e-01\r\n2022 1973 -9.7089198000000e-01\r\n3078 1973 -2.8815324000000e+00\r\n868 1974  9.5207014000000e-01\r\n869 1974 -1.5423474000000e-01\r\n870 1974 -4.1069176000000e+00\r\n1924 1974  2.5677867000000e+00\r\n1925 1974 -4.1597978000000e-01\r\n1926 1974 -1.6409528000000e+00\r\n1972 1974 -1.6234315000000e+02\r\n1973 1974  2.4921984000000e+01\r\n1974 1974  1.3904756000000e+01\r\n1975 1974  1.6416000000000e+00\r\n1976 1974 -2.6593812000000e-01\r\n1977 1974 -1.6389061000000e+00\r\n2022 1974 -1.6411958000000e+00\r\n3078 1974 -4.8709424000000e+00\r\n871 1975 -1.3581805000000e-03\r\n873 1975 -1.4174587000000e-05\r\n1927 1975 -8.0863543000000e-03\r\n1929 1975 -5.6531335000000e-06\r\n1972 1975 -2.3869829000000e-02\r\n1974 1975 -5.6459011000000e-06\r\n1975 1975  1.6197244000000e+02\r\n1977 1975  4.3178912000000e-04\r\n1978 1975 -4.9605957000000e-04\r\n1980 1975 -5.1771021000000e-06\r\n2023 1975 -5.9434076000000e-03\r\n2025 1975 -5.5576398000000e-06\r\n3079 1975 -5.1778327000000e-02\r\n3081 1975 -1.6804275000000e-05\r\n871 1976  5.3125815000000e-01\r\n873 1976 -2.4321006000000e+00\r\n1927 1976  2.1436200000000e+00\r\n1929 1976 -9.7084846000000e-01\r\n1974 1976 -9.6953747000000e-01\r\n1975 1976 -9.7548639000000e+01\r\n1976 1976 -3.0853874000000e+01\r\n1977 1976  9.0974374000000e+00\r\n1978 1976  1.8954181000000e+00\r\n1980 1976 -8.8134172000000e-01\r\n2025 1976 -9.5439186000000e-01\r\n3081 1976 -2.8857599000000e+00\r\n871 1977  8.9803826000000e-01\r\n872 1977 -1.4548135000000e-01\r\n873 1977 -4.1112205000000e+00\r\n1927 1977  3.6235731000000e+00\r\n1928 1977 -5.8701546000000e-01\r\n1929 1977 -1.6411213000000e+00\r\n1974 1977 -1.6389061000000e+00\r\n1975 1977 -1.6489613000000e+02\r\n1976 1977  2.5323854000000e+01\r\n1977 1977  1.5378299000000e+01\r\n1978 1977  3.2040130000000e+00\r\n1979 1977 -5.1904706000000e-01\r\n1980 1977 -1.4898192000000e+00\r\n2025 1977 -1.6133028000000e+00\r\n3081 1977 -4.8780844000000e+00\r\n874 1978 -1.6429276000000e-03\r\n876 1978 -1.7146335000000e-05\r\n1930 1978 -5.5463550000000e-03\r\n1932 1978 -4.7515669000000e-06\r\n1975 1978 -2.2403983000000e-02\r\n1977 1978 -5.1771021000000e-06\r\n1978 1978  1.3497725000000e+02\r\n1980 1978  3.7205450000000e-04\r\n1981 1978 -4.2127940000000e-04\r\n1983 1978 -4.3966624000000e-06\r\n2026 1978 -4.4144999000000e-04\r\n2028 1978 -4.6071718000000e-06\r\n3082 1978 -5.2196358000000e-02\r\n3084 1978 -2.0331213000000e-05\r\n874 1979  4.9785899000000e-01\r\n876 1979 -2.9175561000000e+00\r\n1930 1979  2.4475345000000e+00\r\n1932 1979 -8.0898352000000e-01\r\n1977 1979 -8.8134172000000e-01\r\n1978 1979 -8.3065857000000e+01\r\n1979 1979 -2.5717348000000e+01\r\n1980 1979  9.6022467000000e+00\r\n1981 1979  2.6464787000000e+00\r\n1983 1979 -7.3769417000000e-01\r\n2028 1979 -7.9248720000000e-01\r\n3084 1979 -3.4613003000000e+00\r\n874 1980  8.4158084000000e-01\r\n875 1980 -1.3633455000000e-01\r\n876 1980 -4.9318369000000e+00\r\n1930 1980  4.1373122000000e+00\r\n1931 1980 -6.7023700000000e-01\r\n1932 1980 -1.3675057000000e+00\r\n1977 1980 -1.4898192000000e+00\r\n1978 1980 -1.4041452000000e+02\r\n1979 1980  2.1575094000000e+01\r\n1980 1980  1.6231637000000e+01\r\n1981 1980  4.4736076000000e+00\r\n1982 1980 -7.2471622000000e-01\r\n1983 1980 -1.2469982000000e+00\r\n2028 1980 -1.3396204000000e+00\r\n3084 1980 -5.8509821000000e+00\r\n877 1981 -1.9853381000000e-03\r\n879 1981 -2.0719887000000e-05\r\n1933 1981 -8.6747483000000e-03\r\n1935 1981 -4.0495827000000e-06\r\n1978 1981 -3.2578681000000e-03\r\n1980 1981 -4.3966624000000e-06\r\n1981 1981  1.1337756000000e+02\r\n1983 1981  3.2671386000000e-04\r\n1984 1981 -4.1423520000000e-03\r\n1986 1981 -3.9426131000000e-06\r\n2029 1981 -3.7298957000000e-04\r\n2031 1981 -3.8926879000000e-06\r\n3085 1981 -5.2842909000000e-02\r\n3087 1981 -2.4571963000000e-05\r\n877 1982  4.4971537000000e-01\r\n879 1982 -3.4760615000000e+00\r\n1933 1982  2.7778289000000e+00\r\n1935 1982 -6.7953492000000e-01\r\n1980 1982 -7.3769417000000e-01\r\n1981 1982 -7.1634305000000e+01\r\n1982 1982 -2.1607397000000e+01\r\n1983 1982  1.0343291000000e+01\r\n1984 1982  3.3352763000000e+00\r\n1986 1982 -6.6160067000000e-01\r\n2031 1982 -6.6299625000000e-01\r\n3087 1982 -4.1229794000000e+00\r\n877 1983  7.6019829000000e-01\r\n878 1983 -1.2314977000000e-01\r\n879 1983 -5.8759299000000e+00\r\n1933 1983  4.6956385000000e+00\r\n1934 1983 -7.6067890000000e-01\r\n1935 1983 -1.1486850000000e+00\r\n1980 1983 -1.2469982000000e+00\r\n1981 1983 -1.2109054000000e+02\r\n1982 1983  1.8620214000000e+01\r\n1983 1983  1.7484288000000e+01\r\n1984 1983  5.6379468000000e+00\r\n1985 1983 -9.1332988000000e-01\r\n1986 1983 -1.1183689000000e+00\r\n2031 1983 -1.1207281000000e+00\r\n3087 1983 -6.9694796000000e+00\r\n880 1984 -2.1301373000000e-03\r\n882 1984 -2.2231077000000e-05\r\n1936 1984 -1.7026601000000e-02\r\n1938 1984 -3.9328003000000e-06\r\n1981 1984 -3.7777331000000e-04\r\n1983 1984 -3.9426131000000e-06\r\n1984 1984  1.0798437000000e+02\r\n1986 1984  3.1684869000000e-04\r\n1987 1984 -6.5332251000000e-03\r\n1989 1984 -4.0245300000000e-06\r\n2032 1984 -3.6867044000000e-04\r\n2034 1984 -3.8476115000000e-06\r\n3088 1984 -5.3129053000000e-02\r\n3090 1984 -2.6355745000000e-05\r\n880 1985  4.4145583000000e-01\r\n882 1985 -3.6567886000000e+00\r\n1936 1985  3.5077310000000e+00\r\n1938 1985 -6.4715713000000e-01\r\n1983 1985 -6.6160067000000e-01\r\n1984 1985 -7.0246557000000e+01\r\n1985 1985 -2.0583992000000e+01\r\n1986 1985  1.0613731000000e+01\r\n1987 1985  4.3322745000000e+00\r\n1989 1985 -6.6227664000000e-01\r\n2034 1985 -6.4698723000000e-01\r\n3090 1985 -4.3366092000000e+00\r\n880 1986  7.4623694000000e-01\r\n881 1986 -1.2088658000000e-01\r\n882 1986 -6.1814354000000e+00\r\n1936 1986  5.9294684000000e+00\r\n1937 1986 -9.6054362000000e-01\r\n1938 1986 -1.0939544000000e+00\r\n1983 1986 -1.1183689000000e+00\r\n1984 1986 -1.1874478000000e+02\r\n1985 1986  1.8273817000000e+01\r\n1986 1986  1.7941450000000e+01\r\n1987 1986  7.3232768000000e+00\r\n1988 1986 -1.1863335000000e+00\r\n1989 1986 -1.1195124000000e+00\r\n2034 1986 -1.0936672000000e+00\r\n3090 1986 -7.3306042000000e+00\r\n883 1987 -2.0781249000000e-03\r\n885 1987 -2.1688252000000e-05\r\n1939 1987 -3.2182024000000e-02\r\n1941 1987 -4.2307869000000e-06\r\n1984 1987 -3.8562242000000e-04\r\n1986 1987 -4.0245300000000e-06\r\n1987 1987  1.1343962000000e+02\r\n1989 1987  3.2966748000000e-04\r\n1990 1987 -5.9885713000000e-02\r\n1992 1987 -4.6855457000000e-06\r\n2035 1987 -4.0055791000000e-04\r\n2037 1987 -4.1804036000000e-06\r\n3091 1987 -5.2581036000000e-02\r\n3093 1987 -2.5718390000000e-05\r\n883 1988  5.1242768000000e-01\r\n885 1988 -3.4803075000000e+00\r\n1939 1988  4.4354063000000e+00\r\n1941 1988 -6.7902624000000e-01\r\n1986 1988 -6.6227664000000e-01\r\n1987 1988 -7.7100192000000e+01\r\n1988 1988 -2.1620543000000e+01\r\n1989 1988  1.0397991000000e+01\r\n1990 1988  7.0993032000000e+00\r\n1992 1988 -7.5202197000000e-01\r\n2037 1988 -6.9450959000000e-01\r\n3093 1988 -4.1274186000000e+00\r\n883 1989  8.6620710000000e-01\r\n884 1989 -1.4031909000000e-01\r\n885 1989 -5.8831074000000e+00\r\n1939 1989  7.4976051000000e+00\r\n1940 1989 -1.2145561000000e+00\r\n1941 1989 -1.1478251000000e+00\r\n1986 1989 -1.1195124000000e+00\r\n1987 1989 -1.3033007000000e+02\r\n1988 1989  2.0084135000000e+01\r\n1989 1989  1.7576753000000e+01\r\n1990 1989  1.2000653000000e+01\r\n1991 1989 -1.9440162000000e+00\r\n1992 1989 -1.2712170000000e+00\r\n2037 1989 -1.1739984000000e+00\r\n3093 1989 -6.9769843000000e+00\r\n886 1990 -1.7388043000000e-03\r\n888 1990 -1.8146949000000e-05\r\n1942 1990 -5.7052761000000e-03\r\n1944 1990 -5.4295069000000e-06\r\n1987 1990 -4.4895961000000e-04\r\n1989 1990 -4.6855457000000e-06\r\n1990 1990  1.4033051000000e+02\r\n1992 1990  3.8410423000000e-04\r\n1993 1990 -1.1692933000000e-02\r\n1995 1990 -6.0745924000000e-06\r\n3094 1990 -5.1128589000000e-02\r\n3096 1990 -2.1493975000000e-05\r\n886 1991  6.7593607000000e-01\r\n888 1991 -2.8086301000000e+00\r\n1942 1991  4.1559287000000e+00\r\n1944 1991 -8.4106769000000e-01\r\n1989 1991 -7.5202197000000e-01\r\n1990 1991 -8.9553894000000e+01\r\n1991 1991 -2.6774330000000e+01\r\n1992 1991  8.6749636000000e+00\r\n1993 1991  4.1888701000000e+00\r\n1995 1991 -9.4098208000000e-01\r\n3096 1991 -3.3292502000000e+00\r\n886 1992  1.1426023000000e+00\r\n887 1992 -1.8508882000000e-01\r\n888 1992 -4.7477083000000e+00\r\n1942 1992  7.0251819000000e+00\r\n1943 1992 -1.1380010000000e+00\r\n1944 1992 -1.4217408000000e+00\r\n1989 1992 -1.2712170000000e+00\r\n1990 1992 -1.5138190000000e+02\r\n1991 1992  2.3233965000000e+01\r\n1992 1992  1.4664157000000e+01\r\n1993 1992  7.0808660000000e+00\r\n1994 1992 -1.1470212000000e+00\r\n1995 1992 -1.5906361000000e+00\r\n3096 1992 -5.6277646000000e+00\r\n889 1993 -1.3947605000000e-03\r\n891 1993 -1.4556352000000e-05\r\n1945 1993 -8.2597725000000e-03\r\n1947 1993 -7.1012052000000e-06\r\n1990 1993 -5.8205529000000e-04\r\n1992 1993 -6.0745924000000e-06\r\n1993 1993  1.7807479000000e+02\r\n1995 1993  4.6162173000000e-04\r\n3097 1993 -5.0210142000000e-02\r\n3099 1993 -1.7234427000000e-05\r\n889 1994  7.8644259000000e-01\r\n891 1994 -2.2165275000000e+00\r\n1945 1994  5.7988949000000e+00\r\n1947 1994 -1.0825693000000e+00\r\n1992 1994 -9.4098208000000e-01\r\n1993 1994 -1.0879048000000e+02\r\n1994 1994 -3.3989894000000e+01\r\n1995 1994  6.8709941000000e+00\r\n3099 1994 -2.6270897000000e+00\r\n889 1995  1.3294014000000e+00\r\n890 1995 -2.1534613000000e-01\r\n891 1995 -3.7468149000000e+00\r\n1945 1995  9.8024438000000e+00\r\n1946 1995 -1.5878712000000e+00\r\n1947 1995 -1.8299736000000e+00\r\n1992 1995 -1.5906361000000e+00\r\n1993 1995 -1.8389928000000e+02\r\n1994 1995  2.8136886000000e+01\r\n1995 1995  1.1614721000000e+01\r\n3099 1995 -4.4408299000000e+00\r\n1996 1996  1.0000000000000e+00\r\n1997 1997  1.0000000000000e+00\r\n1998 1998  1.0000000000000e+00\r\n1999 1999  1.0000000000000e+00\r\n2000 2000  1.0000000000000e+00\r\n2001 2001  1.0000000000000e+00\r\n2002 2002  1.0000000000000e+00\r\n2003 2003  1.0000000000000e+00\r\n2004 2004  1.0000000000000e+00\r\n2005 2005  1.0000000000000e+00\r\n2006 2006  1.0000000000000e+00\r\n2007 2007  1.0000000000000e+00\r\n2008 2008  1.0000000000000e+00\r\n2009 2009  1.0000000000000e+00\r\n2010 2010  1.0000000000000e+00\r\n2011 2011  1.0000000000000e+00\r\n2012 2012  1.0000000000000e+00\r\n2013 2013  1.0000000000000e+00\r\n2014 2014  1.0000000000000e+00\r\n2015 2015  1.0000000000000e+00\r\n2016 2016  1.0000000000000e+00\r\n2017 2017  1.0000000000000e+00\r\n2018 2018  1.0000000000000e+00\r\n2019 2019  1.0000000000000e+00\r\n916 2020 -1.3447343000000e-03\r\n918 2020 -1.4034255000000e-05\r\n1972 2020 -5.3965939000000e-04\r\n1974 2020 -5.6321296000000e-06\r\n2020 2020  1.6194250000000e+02\r\n2022 2020  4.2059232000000e-04\r\n2023 2020 -5.2827979000000e-04\r\n2025 2020 -5.5133669000000e-06\r\n3124 2020 -5.1491502000000e-02\r\n3126 2020 -1.6632414000000e-05\r\n916 2021  5.5729081000000e-01\r\n918 2021 -2.4280655000000e+00\r\n1972 2021  1.0590800000000e+00\r\n1974 2021 -9.7089198000000e-01\r\n2020 2021 -9.4979557000000e+01\r\n2021 2021 -3.0846670000000e+01\r\n2022 2021  7.2356360000000e+00\r\n2023 2021  3.7497811000000e-01\r\n2025 2021 -9.5329954000000e-01\r\n3126 2021 -2.8799247000000e+00\r\n916 2022  9.4204439000000e-01\r\n917 2022 -1.5261097000000e-01\r\n918 2022 -4.1044020000000e+00\r\n1972 2022  1.7902689000000e+00\r\n1973 2022 -2.9002313000000e-01\r\n1974 2022 -1.6411958000000e+00\r\n2020 2022 -1.6055344000000e+02\r\n2021 2022  2.4637981000000e+01\r\n2022 2022  1.2231119000000e+01\r\n2023 2022  6.3386300000000e-01\r\n2024 2022 -1.0268565000000e-01\r\n2025 2022 -1.6114575000000e+00\r\n3126 2022 -4.8682248000000e+00\r\n919 2023 -1.3945990000000e-03\r\n921 2023 -1.4554666000000e-05\r\n1975 2023 -5.3252193000000e-04\r\n1977 2023 -5.5576398000000e-06\r\n2020 2023 -2.1480390000000e-02\r\n2022 2023 -5.5133669000000e-06\r\n2023 2023  1.5656494000000e+02\r\n2025 2023  4.1907539000000e-04\r\n2026 2023 -4.7280605000000e-04\r\n2028 2023 -4.9344178000000e-06\r\n2071 2023 -4.8938068000000e-04\r\n2073 2023 -5.1073982000000e-06\r\n3127 2023 -5.1839685000000e-02\r\n3129 2023 -1.7256323000000e-05\r\n919 2024  5.2039201000000e-01\r\n921 2024 -2.5147666000000e+00\r\n1975 2024  1.6215986000000e+00\r\n1977 2024 -9.5439186000000e-01\r\n2022 2024 -9.5329954000000e-01\r\n2023 2024 -9.3134441000000e+01\r\n2024 2024 -2.9821783000000e+01\r\n2025 2024  9.1453456000000e+00\r\n2026 2024  1.1083786000000e+00\r\n2028 2024 -8.4869448000000e-01\r\n2073 2024 -8.8708335000000e-01\r\n3129 2024 -2.9837693000000e+00\r\n919 2025  8.7967001000000e-01\r\n920 2025 -1.4250631000000e-01\r\n921 2025 -4.2509584000000e+00\r\n1975 2025  2.7411483000000e+00\r\n1976 2025 -4.4406532000000e-01\r\n1977 2025 -1.6133028000000e+00\r\n2022 2025 -1.6114575000000e+00\r\n2023 2025 -1.5743434000000e+02\r\n2024 2025  2.4170331000000e+01\r\n2025 2025  1.5459282000000e+01\r\n2026 2025  1.8736018000000e+00\r\n2027 2025 -3.0352301000000e-01\r\n2028 2025 -1.4346321000000e+00\r\n2073 2025 -1.4995246000000e+00\r\n3129 2025 -5.0437600000000e+00\r\n922 2026 -1.6936419000000e-03\r\n924 2026 -1.7675613000000e-05\r\n1978 2026 -2.7509738000000e-03\r\n1980 2026 -4.6071718000000e-06\r\n2023 2026 -2.8855918000000e-02\r\n2025 2026 -4.9344178000000e-06\r\n2026 2026  1.2958883000000e+02\r\n2028 2026  3.5951497000000e-04\r\n2029 2026 -3.9681458000000e-04\r\n2031 2026 -4.1413365000000e-06\r\n2074 2026 -4.0048567000000e-04\r\n2076 2026 -4.1796496000000e-06\r\n3130 2026 -5.2323006000000e-02\r\n3132 2026 -2.0957870000000e-05\r\n922 2027  4.8137961000000e-01\r\n924 2027 -3.0387763000000e+00\r\n1978 2027  2.0158029000000e+00\r\n1980 2027 -7.9248720000000e-01\r\n2025 2027 -8.4869448000000e-01\r\n2026 2027 -7.8577491000000e+01\r\n2027 2027 -2.4685307000000e+01\r\n2028 2027  9.7176880000000e+00\r\n2029 2027  1.7006406000000e+00\r\n2031 2027 -7.0527590000000e-01\r\n2076 2027 -7.2489488000000e-01\r\n3132 2027 -3.6047923000000e+00\r\n922 2028  8.1372409000000e-01\r\n923 2028 -1.3182259000000e-01\r\n924 2028 -5.1367475000000e+00\r\n1978 2028  3.4075133000000e+00\r\n1979 2028 -5.5201418000000e-01\r\n1980 2028 -1.3396204000000e+00\r\n2025 2028 -1.4346321000000e+00\r\n2026 2028 -1.3282739000000e+02\r\n2027 2028  2.0401186000000e+01\r\n2028 2028  1.6426779000000e+01\r\n2029 2028  2.8747629000000e+00\r\n2030 2028 -4.6570909000000e-01\r\n2031 2028 -1.1921984000000e+00\r\n2076 2028 -1.2253623000000e+00\r\n3132 2028 -6.0935410000000e+00\r\n925 2029 -2.0526183000000e-03\r\n927 2029 -2.1422054000000e-05\r\n1981 2029 -1.0229231000000e-02\r\n1983 2029 -3.8926879000000e-06\r\n2026 2029 -1.1539562000000e-02\r\n2028 2029 -4.1413365000000e-06\r\n2029 2029  1.0799165000000e+02\r\n2031 2029  3.1497476000000e-04\r\n2032 2029 -3.6857629000000e-04\r\n2034 2029 -3.8466289000000e-06\r\n2077 2029 -3.5959229000000e-04\r\n2079 2029 -3.7528679000000e-06\r\n3133 2029 -5.2937329000000e-02\r\n3135 2029 -2.5405001000000e-05\r\n925 2030  4.3884976000000e-01\r\n927 2030 -3.6479617000000e+00\r\n1981 2030  2.4661872000000e+00\r\n1983 2030 -6.6299625000000e-01\r\n2028 2030 -7.0527590000000e-01\r\n2029 2030 -6.6997482000000e+01\r\n2030 2030 -2.0575274000000e+01\r\n2031 2030  1.0639110000000e+01\r\n2032 2030  2.1151711000000e+00\r\n2034 2030 -6.4674675000000e-01\r\n2079 2030 -6.4714282000000e-01\r\n3135 2030 -4.3266793000000e+00\r\n925 2031  7.4183114000000e-01\r\n926 2031 -1.2017539000000e-01\r\n927 2031 -6.1665103000000e+00\r\n1981 2031  4.1688401000000e+00\r\n1982 2031 -6.7534503000000e-01\r\n1983 2031 -1.1207281000000e+00\r\n2028 2031 -1.1921984000000e+00\r\n2029 2031 -1.1325247000000e+02\r\n2030 2031  1.7405884000000e+01\r\n2031 2031  1.7984341000000e+01\r\n2032 2031  3.5754831000000e+00\r\n2033 2031 -5.7922216000000e-01\r\n2034 2031 -1.0932600000000e+00\r\n2079 2031 -1.0939295000000e+00\r\n3135 2031 -7.3138141000000e+00\r\n928 2032 -2.0800183000000e-03\r\n930 2032 -2.1708012000000e-05\r\n1984 2032 -1.7480067000000e-02\r\n1986 2032 -3.8476115000000e-06\r\n2029 2032 -4.1808220000000e-03\r\n2031 2032 -3.8466289000000e-06\r\n2032 2032  1.0798712000000e+02\r\n2034 2032  3.1546660000000e-04\r\n2035 2032 -4.6396661000000e-04\r\n2037 2032 -4.0290025000000e-06\r\n2080 2032 -3.6280034000000e-04\r\n2082 2032 -3.7863485000000e-06\r\n3136 2032 -5.3056770000000e-02\r\n3138 2032 -2.5735744000000e-05\r\n928 2033  4.2656881000000e-01\r\n930 2033 -3.6489216000000e+00\r\n1984 2033  3.5522180000000e+00\r\n1986 2033 -6.4698723000000e-01\r\n2031 2033 -6.4674675000000e-01\r\n2032 2033 -6.8038213000000e+01\r\n2033 2033 -2.0579659000000e+01\r\n2034 2033  1.0596529000000e+01\r\n2035 2033  2.0882388000000e+00\r\n2037 2033 -6.7748189000000e-01\r\n2082 2033 -6.4687038000000e-01\r\n3138 2033 -4.3272116000000e+00\r\n928 2034  7.2107192000000e-01\r\n929 2034 -1.1681147000000e-01\r\n930 2034 -6.1681371000000e+00\r\n1984 2034  6.0046692000000e+00\r\n1985 2034 -9.7273828000000e-01\r\n1986 2034 -1.0936672000000e+00\r\n2031 2034 -1.0932600000000e+00\r\n2032 2034 -1.1501180000000e+02\r\n2033 2034  1.7679983000000e+01\r\n2034 2034  1.7912372000000e+01\r\n2035 2034  3.5299588000000e+00\r\n2036 2034 -5.7184267000000e-01\r\n2037 2034 -1.1452154000000e+00\r\n2082 2034 -1.0934697000000e+00\r\n3138 2034 -7.3147185000000e+00\r\n931 2035 -1.9161989000000e-03\r\n933 2035 -1.9998318000000e-05\r\n1987 2035 -2.5132937000000e-02\r\n1989 2035 -4.1804036000000e-06\r\n2032 2035 -3.8605096000000e-04\r\n2034 2035 -4.0290025000000e-06\r\n2035 2035  1.1877676000000e+02\r\n2037 2035  3.3397726000000e-04\r\n2083 2035 -4.1260535000000e-04\r\n2085 2035 -4.3061361000000e-06\r\n3139 2035 -5.2823657000000e-02\r\n3141 2035 -2.3699441000000e-05\r\n931 2036  4.4637846000000e-01\r\n933 2036 -3.3203392000000e+00\r\n1987 2036  6.2154245000000e+00\r\n1989 2036 -6.9450959000000e-01\r\n2034 2036 -6.7748189000000e-01\r\n2035 2036 -7.4824506000000e+01\r\n2036 2036 -2.2641647000000e+01\r\n2037 2036  9.3592333000000e+00\r\n2085 2036 -7.2755535000000e-01\r\n3141 2036 -3.9368051000000e+00\r\n931 2037  7.5455772000000e-01\r\n932 2037 -1.2223526000000e-01\r\n933 2037 -5.6126982000000e+00\r\n1987 2037  1.0506548000000e+01\r\n1988 2037 -1.7020177000000e+00\r\n1989 2037 -1.1739984000000e+00\r\n2034 2037 -1.1452154000000e+00\r\n2035 2037 -1.2648328000000e+02\r\n2036 2037  1.9433192000000e+01\r\n2037 2037  1.5820839000000e+01\r\n2085 2037 -1.2298587000000e+00\r\n3141 2037 -6.6547709000000e+00\r\n2038 2038  1.0000000000000e+00\r\n2039 2039  1.0000000000000e+00\r\n2040 2040  1.0000000000000e+00\r\n2041 2041  1.0000000000000e+00\r\n2042 2042  1.0000000000000e+00\r\n2043 2043  1.0000000000000e+00\r\n2044 2044  1.0000000000000e+00\r\n2045 2045  1.0000000000000e+00\r\n2046 2046  1.0000000000000e+00\r\n2047 2047  1.0000000000000e+00\r\n2048 2048  1.0000000000000e+00\r\n2049 2049  1.0000000000000e+00\r\n2050 2050  1.0000000000000e+00\r\n2051 2051  1.0000000000000e+00\r\n2052 2052  1.0000000000000e+00\r\n2053 2053  1.0000000000000e+00\r\n2054 2054  1.0000000000000e+00\r\n2055 2055  1.0000000000000e+00\r\n2056 2056  1.0000000000000e+00\r\n2057 2057  1.0000000000000e+00\r\n2058 2058  1.0000000000000e+00\r\n2059 2059  1.0000000000000e+00\r\n2060 2060  1.0000000000000e+00\r\n2061 2061  1.0000000000000e+00\r\n2062 2062  1.0000000000000e+00\r\n2063 2063  1.0000000000000e+00\r\n2064 2064  1.0000000000000e+00\r\n2065 2065  1.0000000000000e+00\r\n2066 2066  1.0000000000000e+00\r\n2067 2067  1.0000000000000e+00\r\n2068 2068  1.0000000000000e+00\r\n2069 2069  1.0000000000000e+00\r\n2070 2070  1.0000000000000e+00\r\n967 2071 -1.5486360000000e-03\r\n969 2071 -1.6162266000000e-05\r\n2023 2071 -1.3177635000000e-03\r\n2025 2071 -5.1073982000000e-06\r\n2071 2071  1.4035733000000e+02\r\n2073 2071  3.7303392000000e-04\r\n2074 2071 -4.1502002000000e-04\r\n2076 2071 -4.3313367000000e-06\r\n3175 2071 -5.2088389000000e-02\r\n3177 2071 -1.9158914000000e-05\r\n967 2072  4.9811720000000e-01\r\n969 2072 -2.8052857000000e+00\r\n2023 2072  9.6498412000000e-01\r\n2025 2072 -8.8708335000000e-01\r\n2071 2072 -8.2325452000000e+01\r\n2072 2072 -2.6735187000000e+01\r\n2073 2072  7.7740211000000e+00\r\n2074 2072  2.7443005000000e-01\r\n2076 2072 -7.5114428000000e-01\r\n3177 2072 -3.3275135000000e+00\r\n967 2073  8.4201672000000e-01\r\n968 2073 -1.3640684000000e-01\r\n969 2073 -4.7420516000000e+00\r\n2023 2073  1.6312080000000e+00\r\n2024 2073 -2.6425593000000e-01\r\n2025 2073 -1.4995246000000e+00\r\n2071 2073 -1.3916285000000e+02\r\n2072 2073  2.1352282000000e+01\r\n2073 2073  1.3141196000000e+01\r\n2074 2073  4.6389624000000e-01\r\n2075 2073 -7.5151254000000e-02\r\n2076 2073 -1.2697334000000e+00\r\n3177 2073 -5.6248248000000e+00\r\n970 2074 -1.9188510000000e-03\r\n972 2074 -2.0025997000000e-05\r\n2026 2074 -9.1575328000000e-04\r\n2028 2074 -4.1796496000000e-06\r\n2071 2074 -2.5369610000000e-02\r\n2073 2074 -4.3313367000000e-06\r\n2074 2074  1.1339891000000e+02\r\n2076 2074  3.2508782000000e-04\r\n2077 2074 -3.6819004000000e-04\r\n2079 2074 -3.8425978000000e-06\r\n2122 2074 -4.2051555000000e-04\r\n2124 2074 -3.8229533000000e-06\r\n3178 2074 -5.2643162000000e-02\r\n3180 2074 -2.3743447000000e-05\r\n970 2075  4.5778494000000e-01\r\n972 2075 -3.4716727000000e+00\r\n2026 2075  1.4703649000000e+00\r\n2028 2075 -7.2489488000000e-01\r\n2073 2075 -7.5114428000000e-01\r\n2074 2075 -6.7964341000000e+01\r\n2075 2075 -2.1597166000000e+01\r\n2076 2075  1.0393410000000e+01\r\n2077 2075  9.5055489000000e-01\r\n2079 2075 -6.6255674000000e-01\r\n2124 2075 -6.6299206000000e-01\r\n3180 2075 -4.1177292000000e+00\r\n970 2076  7.7383966000000e-01\r\n971 2076 -1.2536194000000e-01\r\n972 2076 -5.8685156000000e+00\r\n2026 2076  2.4855048000000e+00\r\n2027 2076 -4.0265152000000e-01\r\n2028 2076 -1.2253623000000e+00\r\n2073 2076 -1.2697334000000e+00\r\n2074 2076 -1.1488692000000e+02\r\n2075 2076  1.7640585000000e+01\r\n2076 2076  1.7569019000000e+01\r\n2077 2076  1.6068180000000e+00\r\n2078 2076 -2.6030434000000e-01\r\n2079 2076 -1.1199859000000e+00\r\n2124 2076 -1.1207218000000e+00\r\n3180 2076 -6.9606094000000e+00\r\n973 2077 -2.0263996000000e-03\r\n975 2077 -2.1148424000000e-05\r\n2029 2077 -4.2983185000000e-03\r\n2031 2077 -3.7528679000000e-06\r\n2074 2077 -1.4398817000000e-02\r\n2076 2077 -3.8425978000000e-06\r\n2077 2077  1.0799211000000e+02\r\n2079 2077  3.1387052000000e-04\r\n2080 2077 -3.6281552000000e-04\r\n2082 2077 -3.7865069000000e-06\r\n2125 2077 -5.7231082000000e-04\r\n2127 2077 -3.7528929000000e-06\r\n3181 2077 -5.2986287000000e-02\r\n3183 2077 -2.5073077000000e-05\r\n973 2078  4.1947629000000e-01\r\n975 2078 -3.6451450000000e+00\r\n2029 2078  1.9446345000000e+00\r\n2031 2078 -6.4714282000000e-01\r\n2076 2078 -6.6255674000000e-01\r\n2077 2078 -6.5831628000000e+01\r\n2078 2078 -2.0572200000000e+01\r\n2079 2078  1.0574418000000e+01\r\n2080 2078  1.4859701000000e+00\r\n2082 2078 -6.4683245000000e-01\r\n2127 2078 -6.4709638000000e-01\r\n3183 2078 -4.3233388000000e+00\r\n973 2079  7.0908224000000e-01\r\n974 2079 -1.1487093000000e-01\r\n975 2079 -6.1617491000000e+00\r\n2029 2079  3.2872081000000e+00\r\n2030 2079 -5.3252586000000e-01\r\n2031 2079 -1.0939295000000e+00\r\n2076 2079 -1.1199859000000e+00\r\n2077 2079 -1.1128171000000e+02\r\n2078 2079  1.7094281000000e+01\r\n2079 2079  1.7874985000000e+01\r\n2080 2079  2.5118822000000e+00\r\n2081 2079 -4.0692347000000e-01\r\n2082 2079 -1.0934048000000e+00\r\n2127 2079 -1.0938507000000e+00\r\n3183 2079 -7.3081667000000e+00\r\n976 2080 -2.0472526000000e-03\r\n978 2080 -2.1366055000000e-05\r\n2032 2080 -4.3670855000000e-03\r\n2034 2080 -3.7863485000000e-06\r\n2077 2080 -4.2436261000000e-03\r\n2079 2080 -3.7865069000000e-06\r\n2080 2080  1.0797900000000e+02\r\n2082 2080  3.1484536000000e-04\r\n2083 2080 -3.9241329000000e-04\r\n2085 2080 -4.0954026000000e-06\r\n2128 2080 -8.9023778000000e-04\r\n2130 2080 -3.9670213000000e-06\r\n3184 2080 -5.3021985000000e-02\r\n3186 2080 -2.5330574000000e-05\r\n976 2081  4.2670123000000e-01\r\n978 2081 -3.6487932000000e+00\r\n2032 2081  2.5733037000000e+00\r\n2034 2081 -6.4687038000000e-01\r\n2079 2081 -6.4683245000000e-01\r\n2080 2081 -6.6940390000000e+01\r\n2081 2081 -2.0575438000000e+01\r\n2082 2081  1.0641571000000e+01\r\n2083 2081  1.9633149000000e+00\r\n2085 2081 -6.9187750000000e-01\r\n2130 2081 -6.7766514000000e-01\r\n3186 2081 -4.3272245000000e+00\r\n976 2082  7.2129575000000e-01\r\n977 2082 -1.1684882000000e-01\r\n978 2082 -6.1679201000000e+00\r\n2032 2082  4.3499125000000e+00\r\n2033 2082 -7.0467922000000e-01\r\n2034 2082 -1.0934697000000e+00\r\n2079 2082 -1.0934048000000e+00\r\n2080 2082 -1.1315604000000e+02\r\n2081 2082  1.7389873000000e+01\r\n2082 2082  1.7988511000000e+01\r\n2083 2082  3.3187875000000e+00\r\n2084 2082 -5.3763854000000e-01\r\n2085 2082 -1.1695497000000e+00\r\n2130 2082 -1.1455251000000e+00\r\n3186 2082 -7.3147403000000e+00\r\n979 2083 -1.8007609000000e-03\r\n981 2083 -1.8793556000000e-05\r\n2035 2083 -9.1781122000000e-03\r\n2037 2083 -4.3061361000000e-06\r\n2080 2083 -4.3665315000000e-03\r\n2082 2083 -4.0954026000000e-06\r\n2083 2083  1.2416444000000e+02\r\n2085 2083  3.3985653000000e-04\r\n3187 2083 -5.2728554000000e-02\r\n3189 2083 -2.2272105000000e-05\r\n979 2084  4.3795089000000e-01\r\n981 2084 -3.1730689000000e+00\r\n2035 2084  3.0722658000000e+00\r\n2037 2084 -7.2755535000000e-01\r\n2082 2084 -6.9187750000000e-01\r\n2083 2084 -7.4777714000000e+01\r\n2084 2084 -2.3666192000000e+01\r\n2085 2084  8.3579258000000e+00\r\n3189 2084 -3.7627684000000e+00\r\n979 2085  7.4031168000000e-01\r\n980 2085 -1.1992867000000e-01\r\n981 2085 -5.3637519000000e+00\r\n2035 2085  5.1933545000000e+00\r\n2036 2085 -8.4131068000000e-01\r\n2037 2085 -1.2298587000000e+00\r\n2082 2085 -1.1695497000000e+00\r\n2083 2085 -1.2640416000000e+02\r\n2084 2085  1.9383922000000e+01\r\n2085 2085  1.4128229000000e+01\r\n3189 2085 -6.3605797000000e+00\r\n2086 2086  1.0000000000000e+00\r\n2087 2087  1.0000000000000e+00\r\n2088 2088  1.0000000000000e+00\r\n2089 2089  1.0000000000000e+00\r\n2090 2090  1.0000000000000e+00\r\n2091 2091  1.0000000000000e+00\r\n2092 2092  1.0000000000000e+00\r\n2093 2093  1.0000000000000e+00\r\n2094 2094  1.0000000000000e+00\r\n2095 2095  1.0000000000000e+00\r\n2096 2096  1.0000000000000e+00\r\n2097 2097  1.0000000000000e+00\r\n2098 2098  1.0000000000000e+00\r\n2099 2099  1.0000000000000e+00\r\n2100 2100  1.0000000000000e+00\r\n2101 2101  1.0000000000000e+00\r\n2102 2102  1.0000000000000e+00\r\n2103 2103  1.0000000000000e+00\r\n2104 2104  1.0000000000000e+00\r\n2105 2105  1.0000000000000e+00\r\n2106 2106  1.0000000000000e+00\r\n2107 2107  1.0000000000000e+00\r\n2108 2108  1.0000000000000e+00\r\n2109 2109  1.0000000000000e+00\r\n2110 2110  1.0000000000000e+00\r\n2111 2111  1.0000000000000e+00\r\n2112 2112  1.0000000000000e+00\r\n2113 2113  1.0000000000000e+00\r\n2114 2114  1.0000000000000e+00\r\n2115 2115  1.0000000000000e+00\r\n2116 2116  1.0000000000000e+00\r\n2117 2117  1.0000000000000e+00\r\n2118 2118  1.0000000000000e+00\r\n2119 2119  1.0000000000000e+00\r\n2120 2120  1.0000000000000e+00\r\n2121 2121  1.0000000000000e+00\r\n1018 2122 -1.9994199000000e-03\r\n1020 2122 -2.0866851000000e-05\r\n2074 2122 -3.6630774000000e-04\r\n2076 2122 -3.8229533000000e-06\r\n2122 2122  1.0798444000000e+02\r\n2124 2122  3.0936880000000e-04\r\n2125 2122 -3.5610536000000e-04\r\n2127 2122 -3.7164766000000e-06\r\n2170 2122 -5.2512808000000e-03\r\n2172 2122 -3.7048953000000e-06\r\n3226 2122 -5.2989099000000e-02\r\n3228 2122 -2.4741284000000e-05\r\n1018 2123  4.1131826000000e-01\r\n1020 2123 -3.6438231000000e+00\r\n2074 2123  1.1718104000000e+00\r\n2076 2123 -6.6299206000000e-01\r\n2122 2123 -6.4108336000000e+01\r\n2123 2123 -2.0566613000000e+01\r\n2124 2123  9.9250470000000e+00\r\n2125 2123  5.3596728000000e-01\r\n2127 2123 -6.4700011000000e-01\r\n2172 2123 -6.4715796000000e-01\r\n3228 2123 -4.3217700000000e+00\r\n1018 2124  6.9529239000000e-01\r\n1019 2124 -1.1263776000000e-01\r\n1020 2124 -6.1595186000000e+00\r\n2074 2124  1.9808284000000e+00\r\n2075 2124 -3.2089530000000e-01\r\n2076 2124 -1.1207218000000e+00\r\n2122 2124 -1.0836873000000e+02\r\n2123 2124  1.6636125000000e+01\r\n2124 2124  1.6777299000000e+01\r\n2125 2124  9.0599909000000e-01\r\n2126 2124 -1.4677236000000e-01\r\n2127 2124 -1.0936890000000e+00\r\n2172 2124 -1.0939558000000e+00\r\n3228 2124 -7.3055200000000e+00\r\n1021 2125 -2.0057856000000e-03\r\n1023 2125 -2.0933286000000e-05\r\n2077 2125 -3.5959469000000e-04\r\n2079 2125 -3.7528929000000e-06\r\n2122 2125 -1.3898480000000e-02\r\n2124 2125 -3.7164766000000e-06\r\n2125 2125  1.0799500000000e+02\r\n2127 2125  3.1337447000000e-04\r\n2128 2125 -3.7552166000000e-04\r\n2130 2125 -3.9191139000000e-06\r\n2173 2125 -4.7921739000000e-03\r\n2175 2125 -3.7167668000000e-06\r\n3229 2125 -5.3004344000000e-02\r\n3231 2125 -2.4821271000000e-05\r\n1021 2126  4.0990778000000e-01\r\n1023 2126 -3.6437176000000e+00\r\n2077 2126  1.5360070000000e+00\r\n2079 2126 -6.4709638000000e-01\r\n2124 2126 -6.4700011000000e-01\r\n2125 2126 -6.4988562000000e+01\r\n2126 2126 -2.0569350000000e+01\r\n2127 2126  1.0586380000000e+01\r\n2128 2126  1.0571098000000e+00\r\n2130 2126 -6.7798617000000e-01\r\n2175 2126 -6.4705268000000e-01\r\n3231 2126 -4.3212217000000e+00\r\n1021 2127  6.9290745000000e-01\r\n1022 2127 -1.1225128000000e-01\r\n1023 2127 -6.1593344000000e+00\r\n2077 2127  2.5964637000000e+00\r\n2078 2127 -4.2062815000000e-01\r\n2079 2127 -1.0938507000000e+00\r\n2124 2127 -1.0936890000000e+00\r\n2125 2127 -1.0985656000000e+02\r\n2126 2127  1.6870519000000e+01\r\n2127 2127  1.7895203000000e+01\r\n2128 2127  1.7869368000000e+00\r\n2129 2127 -2.8948447000000e-01\r\n2130 2127 -1.1460667000000e+00\r\n2175 2127 -1.0937772000000e+00\r\n3231 2127 -7.3045892000000e+00\r\n1024 2128 -1.8360530000000e-03\r\n1026 2128 -1.9161880000000e-05\r\n2080 2128 -3.8011205000000e-04\r\n2082 2128 -3.9670213000000e-06\r\n2125 2128 -4.1560972000000e-03\r\n2127 2128 -3.9191139000000e-06\r\n2128 2128  1.1876910000000e+02\r\n2130 2128  3.2753322000000e-04\r\n3232 2128 -5.2835255000000e-02\r\n3234 2128 -2.2719784000000e-05\r\n1024 2129  4.1682311000000e-01\r\n1026 2129 -3.3137845000000e+00\r\n2080 2129  2.1087471000000e+00\r\n2082 2129 -6.7766514000000e-01\r\n2127 2129 -6.7798617000000e-01\r\n2128 2129 -7.0706098000000e+01\r\n2129 2129 -2.2628834000000e+01\r\n2130 2129  8.6024284000000e+00\r\n3234 2129 -3.9304561000000e+00\r\n1024 2130  7.0459778000000e-01\r\n1025 2130 -1.1414460000000e-01\r\n1026 2130 -5.6016213000000e+00\r\n2080 2130  3.5646261000000e+00\r\n2081 2130 -5.7746821000000e-01\r\n2082 2130 -1.1455251000000e+00\r\n2127 2130 -1.1460667000000e+00\r\n2128 2130 -1.1952159000000e+02\r\n2129 2130  1.8337250000000e+01\r\n2130 2130  1.4541544000000e+01\r\n3234 2130 -6.6440430000000e+00\r\n2131 2131  1.0000000000000e+00\r\n2132 2132  1.0000000000000e+00\r\n2133 2133  1.0000000000000e+00\r\n2134 2134  1.0000000000000e+00\r\n2135 2135  1.0000000000000e+00\r\n2136 2136  1.0000000000000e+00\r\n2137 2137  1.0000000000000e+00\r\n2138 2138  1.0000000000000e+00\r\n2139 2139  1.0000000000000e+00\r\n2140 2140  1.0000000000000e+00\r\n2141 2141  1.0000000000000e+00\r\n2142 2142  1.0000000000000e+00\r\n2143 2143  1.0000000000000e+00\r\n2144 2144  1.0000000000000e+00\r\n2145 2145  1.0000000000000e+00\r\n2146 2146  1.0000000000000e+00\r\n2147 2147  1.0000000000000e+00\r\n2148 2148  1.0000000000000e+00\r\n2149 2149  1.0000000000000e+00\r\n2150 2150  1.0000000000000e+00\r\n2151 2151  1.0000000000000e+00\r\n2152 2152  1.0000000000000e+00\r\n2153 2153  1.0000000000000e+00\r\n2154 2154  1.0000000000000e+00\r\n2155 2155  1.0000000000000e+00\r\n2156 2156  1.0000000000000e+00\r\n2157 2157  1.0000000000000e+00\r\n2158 2158  1.0000000000000e+00\r\n2159 2159  1.0000000000000e+00\r\n2160 2160  1.0000000000000e+00\r\n2161 2161  1.0000000000000e+00\r\n2162 2162  1.0000000000000e+00\r\n2163 2163  1.0000000000000e+00\r\n2164 2164  1.0000000000000e+00\r\n2165 2165  1.0000000000000e+00\r\n2166 2166  1.0000000000000e+00\r\n2167 2167  1.0000000000000e+00\r\n2168 2168  1.0000000000000e+00\r\n2169 2169  1.0000000000000e+00\r\n1066 2170 -1.9891465000000e-03\r\n1068 2170 -2.0759632000000e-05\r\n2122 2170 -3.5499566000000e-04\r\n2124 2170 -3.7048953000000e-06\r\n2170 2170  1.0798140000000e+02\r\n2172 2170  3.0528560000000e-04\r\n2173 2170 -3.5354396000000e-04\r\n2175 2170 -3.6897447000000e-06\r\n3274 2170 -5.3043057000000e-02\r\n3276 2170 -2.4614233000000e-05\r\n1066 2171  3.9883469000000e-01\r\n1068 2171 -3.6426386000000e+00\r\n2122 2171  7.6395676000000e-01\r\n2124 2171 -6.4715796000000e-01\r\n2170 2171 -6.3334227000000e+01\r\n2171 2171 -2.0564573000000e+01\r\n2172 2171  9.2594774000000e+00\r\n2173 2171  1.7939655000000e-01\r\n2175 2171 -6.4701297000000e-01\r\n3276 2171 -4.3203650000000e+00\r\n1066 2172  6.7419016000000e-01\r\n1067 2172 -1.0921948000000e-01\r\n1068 2172 -6.1575162000000e+00\r\n2122 2172  1.2913925000000e+00\r\n2123 2172 -2.0920688000000e-01\r\n2124 2172 -1.0939558000000e+00\r\n2170 2172 -1.0706018000000e+02\r\n2171 2172  1.6429162000000e+01\r\n2172 2172  1.5652221000000e+01\r\n2173 2172  3.0325193000000e-01\r\n2174 2172 -4.9127116000000e-02\r\n2175 2172 -1.0937107000000e+00\r\n3276 2172 -7.3031450000000e+00\r\n1069 2173 -1.9913866000000e-03\r\n1071 2173 -2.0783011000000e-05\r\n2125 2173 -3.5613316000000e-04\r\n2127 2173 -3.7167668000000e-06\r\n2170 2173 -1.4356213000000e-02\r\n2172 2173 -3.6897447000000e-06\r\n2173 2173  1.0799313000000e+02\r\n2175 2173  3.0534932000000e-04\r\n3277 2173 -5.3060893000000e-02\r\n3279 2173 -2.4644423000000e-05\r\n1069 2174  3.9904024000000e-01\r\n1071 2174 -3.6436564000000e+00\r\n2125 2174  1.1204141000000e+00\r\n2127 2174 -6.4705268000000e-01\r\n2172 2174 -6.4701297000000e-01\r\n2173 2174 -6.3508591000000e+01\r\n2174 2174 -2.0566709000000e+01\r\n2175 2174  9.2615989000000e+00\r\n3279 2174 -4.3215731000000e+00\r\n1069 2175  6.7453723000000e-01\r\n1070 2175 -1.0927570000000e-01\r\n1071 2175 -6.1592331000000e+00\r\n2125 2175  1.8939468000000e+00\r\n2126 2175 -3.0682126000000e-01\r\n2127 2175 -1.0937772000000e+00\r\n2172 2175 -1.0937107000000e+00\r\n2173 2175 -1.0735486000000e+02\r\n2174 2175  1.6471721000000e+01\r\n2175 2175  1.5655799000000e+01\r\n3279 2175 -7.3051832000000e+00\r\n2176 2176  1.0000000000000e+00\r\n2177 2177  1.0000000000000e+00\r\n2178 2178  1.0000000000000e+00\r\n2179 2179  1.0000000000000e+00\r\n2180 2180  1.0000000000000e+00\r\n2181 2181  1.0000000000000e+00\r\n2182 2182  1.0000000000000e+00\r\n2183 2183  1.0000000000000e+00\r\n2184 2184  1.0000000000000e+00\r\n2185 2185  1.0000000000000e+00\r\n2186 2186  1.0000000000000e+00\r\n2187 2187  1.0000000000000e+00\r\n2188 2188  1.0000000000000e+00\r\n2189 2189  1.0000000000000e+00\r\n2190 2190  1.0000000000000e+00\r\n2191 2191  1.0000000000000e+00\r\n2192 2192  1.0000000000000e+00\r\n2193 2193  1.0000000000000e+00\r\n2194 2194  1.0000000000000e+00\r\n2195 2195  1.0000000000000e+00\r\n2196 2196  1.0000000000000e+00\r\n2197 2197  1.0000000000000e+00\r\n2198 2198  1.0000000000000e+00\r\n2199 2199  1.0000000000000e+00\r\n2200 2200  1.0000000000000e+00\r\n2201 2201  1.0000000000000e+00\r\n2202 2202  1.0000000000000e+00\r\n2203 2203  1.0000000000000e+00\r\n2204 2204  1.0000000000000e+00\r\n2205 2205  1.0000000000000e+00\r\n2206 2206  1.0000000000000e+00\r\n2207 2207  1.0000000000000e+00\r\n2208 2208  1.0000000000000e+00\r\n2209 2209  1.0000000000000e+00\r\n2210 2210  1.0000000000000e+00\r\n2211 2211  1.0000000000000e+00\r\n2212 2212  1.0000000000000e+00\r\n2213 2213  1.0000000000000e+00\r\n2214 2214  1.0000000000000e+00\r\n2215 2215  1.0000000000000e+00\r\n2216 2216  1.0000000000000e+00\r\n2217 2217  1.0000000000000e+00\r\n2218 2218  1.0000000000000e+00\r\n2219 2219  1.0000000000000e+00\r\n2220 2220  1.0000000000000e+00\r\n2221 2221  1.0000000000000e+00\r\n2222 2222  1.0000000000000e+00\r\n2223 2223  1.0000000000000e+00\r\n2224 2224  1.0000000000000e+00\r\n2225 2225  1.0000000000000e+00\r\n2226 2226  1.0000000000000e+00\r\n2227 2227  1.0000000000000e+00\r\n2228 2228  1.0000000000000e+00\r\n2229 2229  1.0000000000000e+00\r\n2230 2230  1.0000000000000e+00\r\n2231 2231  1.0000000000000e+00\r\n2232 2232  1.0000000000000e+00\r\n2233 2233  1.0000000000000e+00\r\n2234 2234  1.0000000000000e+00\r\n2235 2235  1.0000000000000e+00\r\n2236 2236  1.0000000000000e+00\r\n2237 2237  1.0000000000000e+00\r\n2238 2238  1.0000000000000e+00\r\n2239 2239  1.0000000000000e+00\r\n2240 2240  1.0000000000000e+00\r\n2241 2241  1.0000000000000e+00\r\n2242 2242  1.0000000000000e+00\r\n2243 2243  1.0000000000000e+00\r\n2244 2244  1.0000000000000e+00\r\n2245 2245  1.0000000000000e+00\r\n2246 2246  1.0000000000000e+00\r\n2247 2247  1.0000000000000e+00\r\n2248 2248  1.0000000000000e+00\r\n2249 2249  1.0000000000000e+00\r\n2250 2250  1.0000000000000e+00\r\n2251 2251  1.0000000000000e+00\r\n2252 2252  1.0000000000000e+00\r\n2253 2253  1.0000000000000e+00\r\n2254 2254  1.0000000000000e+00\r\n2255 2255  1.0000000000000e+00\r\n2256 2256  1.0000000000000e+00\r\n2257 2257  1.0000000000000e+00\r\n2258 2258  1.0000000000000e+00\r\n2259 2259  1.0000000000000e+00\r\n2260 2260  1.0000000000000e+00\r\n2261 2261  1.0000000000000e+00\r\n2262 2262  1.0000000000000e+00\r\n2263 2263  1.0000000000000e+00\r\n2264 2264  1.0000000000000e+00\r\n2265 2265  1.0000000000000e+00\r\n2266 2266  1.0000000000000e+00\r\n2267 2267  1.0000000000000e+00\r\n2268 2268  1.0000000000000e+00\r\n2269 2269  1.0000000000000e+00\r\n2270 2270  1.0000000000000e+00\r\n2271 2271  1.0000000000000e+00\r\n2272 2272  1.0000000000000e+00\r\n2273 2273  1.0000000000000e+00\r\n2274 2274  1.0000000000000e+00\r\n2275 2275  1.0000000000000e+00\r\n2276 2276  1.0000000000000e+00\r\n2277 2277  1.0000000000000e+00\r\n2278 2278  1.0000000000000e+00\r\n2279 2279  1.0000000000000e+00\r\n2280 2280  1.0000000000000e+00\r\n2281 2281  1.0000000000000e+00\r\n2282 2282  1.0000000000000e+00\r\n2283 2283  1.0000000000000e+00\r\n2284 2284  1.0000000000000e+00\r\n2285 2285  1.0000000000000e+00\r\n2286 2286  1.0000000000000e+00\r\n2287 2287  1.0000000000000e+00\r\n2288 2288  1.0000000000000e+00\r\n2289 2289  1.0000000000000e+00\r\n2290 2290  1.0000000000000e+00\r\n2291 2291  1.0000000000000e+00\r\n2292 2292  1.0000000000000e+00\r\n2293 2293  1.0000000000000e+00\r\n2294 2294  1.0000000000000e+00\r\n2295 2295  1.0000000000000e+00\r\n2296 2296  1.0000000000000e+00\r\n2297 2297  1.0000000000000e+00\r\n2298 2298  1.0000000000000e+00\r\n2299 2299  1.0000000000000e+00\r\n2300 2300  1.0000000000000e+00\r\n2301 2301  1.0000000000000e+00\r\n2302 2302  1.0000000000000e+00\r\n2303 2303  1.0000000000000e+00\r\n2304 2304  1.0000000000000e+00\r\n2305 2305  1.0000000000000e+00\r\n2306 2306  1.0000000000000e+00\r\n2307 2307  1.0000000000000e+00\r\n2308 2308  1.0000000000000e+00\r\n2309 2309  1.0000000000000e+00\r\n2310 2310  1.0000000000000e+00\r\n2311 2311  1.0000000000000e+00\r\n2312 2312  1.0000000000000e+00\r\n2313 2313  1.0000000000000e+00\r\n2314 2314  1.0000000000000e+00\r\n2315 2315  1.0000000000000e+00\r\n2316 2316  1.0000000000000e+00\r\n2317 2317  1.0000000000000e+00\r\n2318 2318  1.0000000000000e+00\r\n2319 2319  1.0000000000000e+00\r\n2320 2320  1.0000000000000e+00\r\n2321 2321  1.0000000000000e+00\r\n2322 2322  1.0000000000000e+00\r\n2323 2323  1.0000000000000e+00\r\n2324 2324  1.0000000000000e+00\r\n2325 2325  1.0000000000000e+00\r\n2326 2326  1.0000000000000e+00\r\n2327 2327  1.0000000000000e+00\r\n2328 2328  1.0000000000000e+00\r\n2329 2329  1.0000000000000e+00\r\n2330 2330  1.0000000000000e+00\r\n2331 2331  1.0000000000000e+00\r\n2332 2332  1.0000000000000e+00\r\n2333 2333  1.0000000000000e+00\r\n2334 2334  1.0000000000000e+00\r\n2335 2335  1.0000000000000e+00\r\n2336 2336  1.0000000000000e+00\r\n2337 2337  1.0000000000000e+00\r\n2338 2338  1.0000000000000e+00\r\n2339 2339  1.0000000000000e+00\r\n2340 2340  1.0000000000000e+00\r\n2341 2341  1.0000000000000e+00\r\n2342 2342  1.0000000000000e+00\r\n2343 2343  1.0000000000000e+00\r\n1240 2344 -2.5971423000000e+00\r\n1242 2344 -1.7988385000000e-01\r\n2344 2344  2.0608732000000e+02\r\n2346 2344  4.2725065000000e-01\r\n2347 2344 -4.3744598000000e-01\r\n2349 2344 -8.1460968000000e-02\r\n2392 2344 -4.1557028000000e+00\r\n2394 2344 -8.6020643000000e-02\r\n1240 2345  6.7813736000000e+00\r\n1242 2345 -9.0410623000000e-01\r\n2344 2345 -1.3475629000000e+02\r\n2345 2345 -2.7720556000000e+01\r\n2346 2345  1.7489967000000e+00\r\n2347 2345  4.4770925000000e-01\r\n2349 2345 -4.0941591000000e-01\r\n2392 2345  1.3190091000000e+01\r\n2394 2345 -4.3240035000000e-01\r\n1240 2346  1.1463234000000e+01\r\n1241 2346 -1.0989584000000e+00\r\n1242 2346 -1.5283012000000e+00\r\n2344 2346 -2.2779204000000e+02\r\n2345 2346  2.5292823000000e+01\r\n2346 2346  2.9565041000000e+00\r\n2347 2346  7.5680772000000e-01\r\n2348 2346 -7.2553717000000e-02\r\n2349 2346 -6.9207666000000e-01\r\n2392 2346  2.2296530000000e+01\r\n2393 2346 -2.1375259000000e+00\r\n2394 2346 -7.3092956000000e-01\r\n1243 2347 -1.5646243000000e+00\r\n1245 2347 -9.5840005000000e-02\r\n2344 2347 -5.9736957000000e-01\r\n2346 2347 -8.1460968000000e-02\r\n2347 2347  1.9213530000000e+02\r\n2349 2347  3.3537638000000e-01\r\n2350 2347 -2.9022544000000e-01\r\n2352 2347 -3.8350367000000e-02\r\n2395 2347 -2.4885005000000e+00\r\n2397 2347 -4.0056499000000e-02\r\n1243 2348  5.7342234000000e+00\r\n1245 2348 -1.3780428000000e+00\r\n2346 2348 -4.0941591000000e-01\r\n2347 2348 -1.2662709000000e+02\r\n2348 2348 -2.8872728000000e+01\r\n2349 2348  2.9181068000000e+00\r\n2350 2348  2.5214740000000e-01\r\n2352 2348 -5.5141574000000e-01\r\n2395 2348  1.3032447000000e+01\r\n2397 2348 -5.7602974000000e-01\r\n1243 2349  9.6931234000000e+00\r\n1244 2349 -1.0942175000000e+00\r\n1245 2349 -2.3294416000000e+00\r\n2346 2349 -6.9207666000000e-01\r\n2347 2349 -2.1405027000000e+02\r\n2348 2349  2.6519672000000e+01\r\n2349 2349  4.9327643000000e+00\r\n2350 2349  4.2622967000000e-01\r\n2351 2349 -4.8115337000000e-02\r\n2352 2349 -9.3211241000000e-01\r\n2395 2349  2.2030033000000e+01\r\n2396 2349 -2.4868810000000e+00\r\n2397 2349 -9.7371988000000e-01\r\n1246 2350 -9.9109871000000e-01\r\n1248 2350 -4.8389152000000e-02\r\n2347 2350 -4.3030649000000e-01\r\n2349 2350 -3.8350367000000e-02\r\n2350 2350  1.7850343000000e+02\r\n2352 2350  1.8406498000000e-01\r\n2398 2350 -1.5899806000000e+00\r\n2400 2350 -1.7817074000000e-02\r\n1246 2351  4.9601271000000e+00\r\n1248 2351 -1.8565169000000e+00\r\n2349 2351 -5.5141574000000e-01\r\n2350 2351 -1.1776387000000e+02\r\n2351 2351 -2.9017221000000e+01\r\n2352 2351  3.0948062000000e+00\r\n2398 2351  1.1924609000000e+01\r\n2400 2351 -6.8365407000000e-01\r\n1246 2352  8.3845988000000e+00\r\n1247 2352 -1.0812350000000e+00\r\n1248 2352 -3.1382562000000e+00\r\n2349 2352 -9.3211241000000e-01\r\n2350 2352 -1.9906804000000e+02\r\n2351 2352  2.6676978000000e+01\r\n2352 2352  5.2314596000000e+00\r\n2398 2352  2.0157360000000e+01\r\n2399 2352 -2.5993900000000e+00\r\n2400 2352 -1.1556488000000e+00\r\n2353 2353  1.0000000000000e+00\r\n2354 2354  1.0000000000000e+00\r\n2355 2355  1.0000000000000e+00\r\n2356 2356  1.0000000000000e+00\r\n2357 2357  1.0000000000000e+00\r\n2358 2358  1.0000000000000e+00\r\n2359 2359  1.0000000000000e+00\r\n2360 2360  1.0000000000000e+00\r\n2361 2361  1.0000000000000e+00\r\n2362 2362  1.0000000000000e+00\r\n2363 2363  1.0000000000000e+00\r\n2364 2364  1.0000000000000e+00\r\n2365 2365  1.0000000000000e+00\r\n2366 2366  1.0000000000000e+00\r\n2367 2367  1.0000000000000e+00\r\n1264 2368 -1.0598457000000e+00\r\n1266 2368 -5.6946019000000e-02\r\n2368 2368  2.9681124000000e+02\r\n2370 2368  1.9437580000000e-01\r\n2416 2368 -3.2797939000000e+00\r\n2418 2368 -5.7327535000000e-02\r\n1264 2369  4.3202257000000e+00\r\n1266 2369 -9.0660211000000e-01\r\n2368 2369 -1.8942500000000e+02\r\n2369 2369 -4.5507683000000e+01\r\n2370 2369  1.8244089000000e+00\r\n2416 2369  1.6991600000000e+01\r\n2418 2369 -9.1275390000000e-01\r\n1264 2370  7.3029095000000e+00\r\n1265 2370 -8.4853454000000e-01\r\n1266 2370 -1.5325202000000e+00\r\n2368 2370 -3.2020402000000e+02\r\n2369 2370  4.0208884000000e+01\r\n2370 2370  3.0839808000000e+00\r\n2416 2370  2.8722601000000e+01\r\n2417 2370 -3.3373163000000e+00\r\n2418 2370 -1.5429192000000e+00\r\n2371 2371  1.0000000000000e+00\r\n2372 2372  1.0000000000000e+00\r\n2373 2373  1.0000000000000e+00\r\n2374 2374  1.0000000000000e+00\r\n2375 2375  1.0000000000000e+00\r\n2376 2376  1.0000000000000e+00\r\n2377 2377  1.0000000000000e+00\r\n2378 2378  1.0000000000000e+00\r\n2379 2379  1.0000000000000e+00\r\n2380 2380  1.0000000000000e+00\r\n2381 2381  1.0000000000000e+00\r\n2382 2382  1.0000000000000e+00\r\n1279 2383 -1.6396503000000e+00\r\n1281 2383 -1.0601787000000e-01\r\n2383 2383  2.7574247000000e+02\r\n2385 2383  3.6499262000000e-01\r\n2386 2383 -6.1507789000000e-01\r\n2388 2383 -8.6551270000000e-02\r\n2431 2383 -4.4085565000000e+00\r\n2433 2383 -9.2258094000000e-02\r\n1279 2384  5.0504538000000e+00\r\n1281 2384 -7.6576743000000e-01\r\n2383 2384 -1.7744806000000e+02\r\n2384 2384 -3.8965438000000e+01\r\n2385 2384  2.0616847000000e+00\r\n2386 2384  9.0536898000000e-01\r\n2388 2384 -6.2514227000000e-01\r\n2431 2384  1.6821468000000e+01\r\n2433 2384 -6.6644976000000e-01\r\n1279 2385  8.5372823000000e+00\r\n1280 2385 -8.6332697000000e-01\r\n1281 2385 -1.2944525000000e+00\r\n2383 2385 -2.9995803000000e+02\r\n2384 2385  3.4751750000000e+01\r\n2385 2385  3.4850699000000e+00\r\n2386 2385  1.5304349000000e+00\r\n2387 2385 -1.5476419000000e-01\r\n2388 2385 -1.0567399000000e+00\r\n2431 2385  2.8434994000000e+01\r\n2432 2385 -2.8754695000000e+00\r\n2433 2385 -1.1265661000000e+00\r\n1282 2386 -9.3051390000000e-01\r\n1284 2386 -5.0587676000000e-02\r\n2383 2386 -7.8096942000000e-01\r\n2385 2386 -8.6551270000000e-02\r\n2386 2386  2.5031789000000e+02\r\n2388 2386  2.8883617000000e-01\r\n2389 2386 -3.2579693000000e-01\r\n2391 2386 -3.4705689000000e-02\r\n2434 2386 -2.6040483000000e+00\r\n2436 2386 -3.7153598000000e-02\r\n1282 2387  4.0955182000000e+00\r\n1284 2387 -1.1961635000000e+00\r\n2385 2387 -6.2514227000000e-01\r\n2386 2387 -1.6186823000000e+02\r\n2387 2387 -3.9385424000000e+01\r\n2388 2387  3.5248979000000e+00\r\n2389 2387  3.9373351000000e-01\r\n2391 2387 -8.2061419000000e-01\r\n2434 2387  1.6163394000000e+01\r\n2436 2387 -8.7860497000000e-01\r\n1282 2388  6.9230640000000e+00\r\n1283 2388 -8.4521630000000e-01\r\n1284 2388 -2.0219947000000e+00\r\n2385 2388 -1.0567399000000e+00\r\n2386 2388 -2.7362206000000e+02\r\n2387 2388  3.5440174000000e+01\r\n2388 2388  5.9584868000000e+00\r\n2389 2388  6.6556713000000e-01\r\n2390 2388 -8.1257112000000e-02\r\n2391 2388 -1.3871662000000e+00\r\n2434 2388  2.7322602000000e+01\r\n2435 2388 -3.3357352000000e+00\r\n2436 2388 -1.4851938000000e+00\r\n1285 2389 -8.4718938000000e-01\r\n1287 2389 -2.5902910000000e-02\r\n2386 2389 -5.5655431000000e-01\r\n2388 2389 -3.4705689000000e-02\r\n2389 2389  2.3133653000000e+02\r\n2391 2389  1.7179654000000e-01\r\n2392 2389 -2.9991573000000e-01\r\n2394 2389 -1.5280895000000e-02\r\n2437 2389 -1.5088876000000e+00\r\n2439 2389 -1.6257926000000e-02\r\n1285 2390  4.2913868000000e+00\r\n1287 2390 -1.5525563000000e+00\r\n2388 2390 -8.2061419000000e-01\r\n2389 2390 -1.5005877000000e+02\r\n2390 2390 -3.8687284000000e+01\r\n2391 2390  4.2679152000000e+00\r\n2392 2390  1.5790958000000e-01\r\n2394 2390 -9.1589138000000e-01\r\n2437 2390  1.4485912000000e+01\r\n2439 2390 -9.7455670000000e-01\r\n1285 2391  7.2541553000000e+00\r\n1286 2391 -9.5604276000000e-01\r\n1287 2391 -2.6244395000000e+00\r\n2388 2391 -1.3871662000000e+00\r\n2389 2391 -2.5365918000000e+02\r\n2390 2391  3.4830996000000e+01\r\n2391 2391  7.2144801000000e+00\r\n2392 2391  2.6693018000000e-01\r\n2393 2391 -3.5179377000000e-02\r\n2394 2391 -1.5482218000000e+00\r\n2437 2391  2.4486970000000e+01\r\n2438 2391 -3.2271970000000e+00\r\n2439 2391 -1.6473896000000e+00\r\n1288 2392 -4.4712793000000e-01\r\n1290 2392 -1.0826631000000e-02\r\n2344 2392 -2.9355577000000e+00\r\n2346 2392 -8.6020643000000e-02\r\n2389 2392 -5.2147888000000e-01\r\n2391 2392 -1.5280895000000e-02\r\n2392 2392  2.1531326000000e+02\r\n2394 2392  1.2170622000000e-01\r\n2395 2392 -1.0698811000000e-01\r\n2397 2392 -3.1350724000000e-03\r\n2440 2392 -7.3065393000000e-01\r\n2442 2392 -5.8063662000000e-03\r\n1288 2393  1.7302139000000e+00\r\n1290 2393 -1.9560092000000e+00\r\n2346 2393 -4.3240035000000e-01\r\n2391 2393 -9.1589138000000e-01\r\n2392 2393 -1.3496158000000e+02\r\n2393 2393 -3.7418826000000e+01\r\n2394 2393  5.3905033000000e+00\r\n2397 2393 -1.0329256000000e+00\r\n2440 2393  1.2199921000000e+01\r\n2442 2393 -1.0491197000000e+00\r\n1288 2394  2.9247536000000e+00\r\n1289 2394 -4.1335937000000e-01\r\n1290 2394 -3.3064380000000e+00\r\n2346 2394 -7.3092956000000e-01\r\n2391 2394 -1.5482218000000e+00\r\n2392 2394 -2.2813906000000e+02\r\n2393 2394  3.2922321000000e+01\r\n2394 2394  9.1121048000000e+00\r\n2397 2394 -1.7460565000000e+00\r\n2440 2394  2.0622746000000e+01\r\n2441 2394 -2.9146405000000e+00\r\n2442 2394 -1.7734320000000e+00\r\n1291 2395 -2.9366187000000e-01\r\n1293 2395 -6.8230113000000e-03\r\n2347 2395 -1.3669761000000e+00\r\n2349 2395 -4.0056499000000e-02\r\n2392 2395 -1.8661935000000e-01\r\n2394 2395 -3.1350724000000e-03\r\n2395 2395  1.9551180000000e+02\r\n2397 2395  5.6089800000000e-02\r\n2398 2395 -8.3317449000000e-02\r\n2400 2395 -2.4414511000000e-03\r\n2443 2395 -5.5883715000000e-01\r\n2445 2395 -3.0823466000000e-03\r\n1291 2396  1.3289956000000e+00\r\n1293 2396 -2.2480915000000e+00\r\n2349 2396 -5.7602974000000e-01\r\n2392 2396  1.8415965000000e+00\r\n2394 2396 -1.0329256000000e+00\r\n2395 2396 -1.2451462000000e+02\r\n2396 2396 -3.4875408000000e+01\r\n2397 2396  5.8534598000000e+00\r\n2400 2396 -9.7684548000000e-01\r\n2443 2396  1.0400277000000e+01\r\n2445 2396 -1.0156925000000e+00\r\n1291 2397  2.2465328000000e+00\r\n1292 2397 -3.3455223000000e-01\r\n1293 2397 -3.8001718000000e+00\r\n2349 2397 -9.7371988000000e-01\r\n2392 2397  3.1130329000000e+00\r\n2393 2397 -4.6359086000000e-01\r\n2394 2397 -1.7460565000000e+00\r\n2395 2397 -2.1047939000000e+02\r\n2396 2397  3.0994421000000e+01\r\n2397 2397  9.8946836000000e+00\r\n2400 2397 -1.6512596000000e+00\r\n2443 2397  1.7580618000000e+01\r\n2444 2397 -2.6180942000000e+00\r\n2445 2397 -1.7169257000000e+00\r\n1294 2398 -3.8461282000000e-01\r\n1296 2398 -6.1008077000000e-03\r\n2350 2398 -1.0074344000000e+00\r\n2352 2398 -1.7817074000000e-02\r\n2395 2398 -1.8152092000000e-01\r\n2397 2398 -2.4414511000000e-03\r\n2398 2398  1.8327200000000e+02\r\n2400 2398  2.9297710000000e-02\r\n2446 2398 -3.7470591000000e-01\r\n2448 2398 -2.4309867000000e-03\r\n1294 2399  1.4905014000000e+00\r\n1296 2399 -2.4410548000000e+00\r\n2352 2399 -6.8365407000000e-01\r\n2395 2399  1.6902004000000e+00\r\n2397 2399 -9.7684548000000e-01\r\n2398 2399 -1.1646374000000e+02\r\n2399 2399 -3.2951383000000e+01\r\n2400 2399  5.0780055000000e+00\r\n2446 2399  9.0636068000000e+00\r\n2448 2399 -9.7278993000000e-01\r\n1294 2400  2.5195436000000e+00\r\n1295 2400 -3.6847132000000e-01\r\n1296 2400 -4.1263590000000e+00\r\n2352 2400 -1.1556488000000e+00\r\n2395 2400  2.8571148000000e+00\r\n2396 2400 -4.1783950000000e-01\r\n2397 2400 -1.6512596000000e+00\r\n2398 2400 -1.9687031000000e+02\r\n2399 2400  2.9082529000000e+01\r\n2400 2400  8.5838604000000e+00\r\n2446 2400  1.5321121000000e+01\r\n2447 2400 -2.2406414000000e+00\r\n2448 2400 -1.6444041000000e+00\r\n2401 2401  1.0000000000000e+00\r\n2402 2402  1.0000000000000e+00\r\n2403 2403  1.0000000000000e+00\r\n2404 2404  1.0000000000000e+00\r\n2405 2405  1.0000000000000e+00\r\n2406 2406  1.0000000000000e+00\r\n2407 2407  1.0000000000000e+00\r\n2408 2408  1.0000000000000e+00\r\n2409 2409  1.0000000000000e+00\r\n2410 2410  1.0000000000000e+00\r\n2411 2411  1.0000000000000e+00\r\n2412 2412  1.0000000000000e+00\r\n2413 2413  1.0000000000000e+00\r\n2414 2414  1.0000000000000e+00\r\n2415 2415  1.0000000000000e+00\r\n1312 2416 -3.0967807000000e-01\r\n1314 2416 -6.8032816000000e-03\r\n2368 2416 -1.9563709000000e+00\r\n2370 2416 -5.7327535000000e-02\r\n2416 2416  2.9596269000000e+02\r\n2418 2416  8.1607565000000e-02\r\n2419 2416 -3.3311843000000e-01\r\n2421 2416 -9.7613690000000e-03\r\n2464 2416 -9.1982911000000e-01\r\n2466 2416 -6.8459793000000e-03\r\n1312 2417  1.7834780000000e+00\r\n1314 2417 -1.4328639000000e+00\r\n2370 2417 -9.1275390000000e-01\r\n2416 2417 -1.8566944000000e+02\r\n2417 2417 -5.2249143000000e+01\r\n2418 2417  5.1741385000000e+00\r\n2421 2417 -1.3807167000000e+00\r\n2464 2417  1.5807417000000e+01\r\n2466 2417 -1.4419946000000e+00\r\n1312 2418  3.0147912000000e+00\r\n1313 2418 -4.3302307000000e-01\r\n1314 2418 -2.4221131000000e+00\r\n2370 2418 -1.5429192000000e+00\r\n2416 2418 -3.1385562000000e+02\r\n2417 2418  4.5541410000000e+01\r\n2418 2418  8.7463620000000e+00\r\n2421 2418 -2.3339618000000e+00\r\n2464 2418  2.6720858000000e+01\r\n2465 2418 -3.8379931000000e+00\r\n2466 2418 -2.4375476000000e+00\r\n1315 2419 -4.7974428000000e-01\r\n1317 2419 -9.6598344000000e-03\r\n2416 2419 -3.4809373000000e-01\r\n2418 2419 -9.7613690000000e-03\r\n2419 2419  2.9481710000000e+02\r\n2421 2419  1.1867912000000e-01\r\n2422 2419 -2.3723633000000e-01\r\n2424 2419 -9.7613843000000e-03\r\n2467 2419 -1.3068024000000e+00\r\n2469 2419 -9.7302577000000e-03\r\n1315 2420  2.8271925000000e+00\r\n1317 2420 -1.3664069000000e+00\r\n2416 2420  6.3114563000000e-01\r\n2418 2420 -1.3807167000000e+00\r\n2419 2420 -1.8761480000000e+02\r\n2420 2420 -5.1494702000000e+01\r\n2421 2420  5.4655191000000e+00\r\n2424 2420 -1.3361793000000e+00\r\n2467 2420  1.6075890000000e+01\r\n2469 2420 -1.3764911000000e+00\r\n1315 2421  4.7790828000000e+00\r\n1316 2421 -6.8126319000000e-01\r\n1317 2421 -2.3097726000000e+00\r\n2416 2421  1.0668878000000e+00\r\n2417 2421 -1.5208596000000e-01\r\n2418 2421 -2.3339618000000e+00\r\n2419 2421 -3.1714383000000e+02\r\n2420 2421  4.5386677000000e+01\r\n2421 2421  9.2389084000000e+00\r\n2424 2421 -2.2586774000000e+00\r\n2467 2421  2.7174665000000e+01\r\n2468 2421 -3.8737766000000e+00\r\n2469 2421 -2.3268189000000e+00\r\n1318 2422 -5.3440022000000e-01\r\n1320 2422 -1.2395542000000e-02\r\n2419 2422 -2.2070197000000e-01\r\n2421 2422 -9.7613843000000e-03\r\n2422 2422  2.9491118000000e+02\r\n2424 2422  1.2905618000000e-01\r\n2425 2422 -3.3024883000000e-01\r\n2427 2422 -1.4606511000000e-02\r\n2470 2422 -1.3780511000000e+00\r\n2472 2422 -1.2496808000000e-02\r\n1318 2423  3.2197658000000e+00\r\n1320 2423 -1.3213394000000e+00\r\n2419 2423  2.3582194000000e-01\r\n2421 2423 -1.3361793000000e+00\r\n2422 2423 -1.8821336000000e+02\r\n2423 2423 -5.0966088000000e+01\r\n2424 2423  5.2984249000000e+00\r\n2427 2423 -1.3029946000000e+00\r\n2470 2423  1.6674148000000e+01\r\n2472 2423 -1.3322460000000e+00\r\n1318 2424  5.4426922000000e+00\r\n1319 2424 -7.5084820000000e-01\r\n1320 2424 -2.2335922000000e+00\r\n2419 2424  3.9863340000000e-01\r\n2420 2424 -5.4993585000000e-02\r\n2421 2424 -2.2586774000000e+00\r\n2422 2424 -3.1815586000000e+02\r\n2423 2424  4.4963881000000e+01\r\n2424 2424  8.9564554000000e+00\r\n2427 2424 -2.2025800000000e+00\r\n2470 2424  2.8185979000000e+01\r\n2471 2424 -3.8884051000000e+00\r\n2472 2424 -2.2520286000000e+00\r\n1321 2425 -5.8237589000000e-01\r\n1323 2425 -1.4442702000000e-02\r\n2422 2425 -3.4512318000000e-01\r\n2424 2425 -1.4606511000000e-02\r\n2425 2425  2.9515983000000e+02\r\n2427 2425  1.3803140000000e-01\r\n2428 2425 -3.3017192000000e-01\r\n2430 2425 -1.4603109000000e-02\r\n2473 2425 -1.4531784000000e+00\r\n2475 2425 -1.4561047000000e-02\r\n1321 2426  3.2091214000000e+00\r\n1323 2426 -1.2884342000000e+00\r\n2422 2426  2.4120100000000e-01\r\n2424 2426 -1.3029946000000e+00\r\n2425 2426 -1.8867034000000e+02\r\n2426 2426 -5.0571975000000e+01\r\n2427 2426  5.1990686000000e+00\r\n2430 2426 -1.3029156000000e+00\r\n2473 2426  1.7134703000000e+01\r\n2475 2426 -1.2991028000000e+00\r\n1321 2427  5.4246936000000e+00\r\n1322 2427 -7.2975635000000e-01\r\n1323 2427 -2.1779671000000e+00\r\n2422 2427  4.0772578000000e-01\r\n2423 2427 -5.4849268000000e-02\r\n2424 2427 -2.2025800000000e+00\r\n2425 2427 -3.1892805000000e+02\r\n2426 2427  4.4643506000000e+01\r\n2427 2427  8.7884993000000e+00\r\n2430 2427 -2.2024485000000e+00\r\n2473 2427  2.8964476000000e+01\r\n2474 2427 -3.8964426000000e+00\r\n2475 2427 -2.1960012000000e+00\r\n1324 2428 -5.4870071000000e-01\r\n1326 2428 -1.4434007000000e-02\r\n2425 2428 -3.4452271000000e-01\r\n2427 2428 -1.4603109000000e-02\r\n2428 2428  2.9519042000000e+02\r\n2430 2428  1.3772053000000e-01\r\n2431 2428 -3.9655657000000e-01\r\n2433 2428 -1.4302015000000e-02\r\n2476 2428 -1.4513846000000e+00\r\n2478 2428 -1.4563380000000e-02\r\n1324 2429  2.6632591000000e+00\r\n1326 2429 -1.2878855000000e+00\r\n2425 2429  2.3108844000000e-01\r\n2427 2429 -1.3029156000000e+00\r\n2428 2429 -1.8840910000000e+02\r\n2429 2429 -5.0572276000000e+01\r\n2430 2429  5.1720305000000e+00\r\n2431 2429  3.2512559000000e-01\r\n2433 2429 -1.2760733000000e+00\r\n2476 2429  1.7104165000000e+01\r\n2478 2429 -1.2995346000000e+00\r\n1324 2430  4.5019731000000e+00\r\n1325 2430 -6.0564353000000e-01\r\n1326 2430 -2.1770417000000e+00\r\n2425 2430  3.9063189000000e-01\r\n2426 2430 -5.2551108000000e-02\r\n2427 2430 -2.2024485000000e+00\r\n2428 2430 -3.1848675000000e+02\r\n2429 2430  4.4584784000000e+01\r\n2430 2430  8.7428003000000e+00\r\n2431 2430  5.4959229000000e-01\r\n2432 2430 -7.3935807000000e-02\r\n2433 2430 -2.1570743000000e+00\r\n2476 2430  2.8912880000000e+01\r\n2477 2430 -3.8896053000000e+00\r\n2478 2430 -2.1967333000000e+00\r\n1327 2431 -3.4095124000000e-01\r\n1329 2431 -8.2969956000000e-03\r\n2383 2431 -3.1484183000000e+00\r\n2385 2431 -9.2258094000000e-02\r\n2428 2431 -4.8807342000000e-01\r\n2430 2431 -1.4302015000000e-02\r\n2431 2431  2.8583675000000e+02\r\n2433 2431  1.2751677000000e-01\r\n2434 2431 -1.3435734000000e-01\r\n2436 2431 -3.9370728000000e-03\r\n2479 2431 -9.7714131000000e-01\r\n2481 2431 -7.8713173000000e-03\r\n1327 2432  1.2994774000000e+00\r\n1329 2432 -1.4623719000000e+00\r\n2385 2432 -6.6644976000000e-01\r\n2430 2432 -1.2760733000000e+00\r\n2431 2432 -1.7893272000000e+02\r\n2432 2432 -4.9860319000000e+01\r\n2433 2432  6.2021635000000e+00\r\n2436 2432 -1.4042632000000e+00\r\n2479 2432  1.6275427000000e+01\r\n2481 2432 -1.3874621000000e+00\r\n1327 2433  2.1966357000000e+00\r\n1328 2433 -3.0957355000000e-01\r\n1329 2433 -2.4719924000000e+00\r\n2385 2433 -1.1265661000000e+00\r\n2430 2433 -2.1570743000000e+00\r\n2431 2433 -3.0246773000000e+02\r\n2432 2433  4.3576472000000e+01\r\n2433 2433  1.0484134000000e+01\r\n2436 2433 -2.3737664000000e+00\r\n2479 2433  2.7511970000000e+01\r\n2480 2433 -3.8772832000000e+00\r\n2481 2433 -2.3453649000000e+00\r\n1330 2434 -2.9504895000000e-01\r\n1332 2434 -4.6541406000000e-03\r\n2386 2434 -2.1007833000000e+00\r\n2388 2434 -3.7153598000000e-02\r\n2431 2434 -2.6304068000000e-01\r\n2433 2434 -3.9370728000000e-03\r\n2434 2434  2.6662637000000e+02\r\n2436 2434  5.2795262000000e-02\r\n2437 2434 -1.3656872000000e-01\r\n2439 2434 -2.4152988000000e-03\r\n2482 2434 -6.3341179000000e-01\r\n2484 2434 -3.8897599000000e-03\r\n1330 2435  1.1842029000000e+00\r\n1332 2435 -1.6601180000000e+00\r\n2388 2435 -8.7860497000000e-01\r\n2431 2435  1.5518434000000e+00\r\n2433 2435 -1.4042632000000e+00\r\n2434 2435 -1.6978536000000e+02\r\n2435 2435 -4.7687417000000e+01\r\n2436 2435  6.6794454000000e+00\r\n2439 2435 -1.3435779000000e+00\r\n2482 2435  1.5780879000000e+01\r\n2484 2435 -1.3875787000000e+00\r\n1330 2436  2.0017766000000e+00\r\n1331 2436 -2.8967534000000e-01\r\n1332 2436 -2.8062634000000e+00\r\n2388 2436 -1.4851938000000e+00\r\n2431 2436  2.6232360000000e+00\r\n2432 2436 -3.7960619000000e-01\r\n2433 2436 -2.3737664000000e+00\r\n2434 2436 -2.8700517000000e+02\r\n2435 2436  4.2190864000000e+01\r\n2436 2436  1.1290933000000e+01\r\n2439 2436 -2.2711827000000e+00\r\n2482 2436  2.6675998000000e+01\r\n2483 2436 -3.8602604000000e+00\r\n2484 2436 -2.3455630000000e+00\r\n1333 2437 -2.2019369000000e-01\r\n1335 2437 -3.3956081000000e-03\r\n2389 2437 -9.1927516000000e-01\r\n2391 2437 -1.6257926000000e-02\r\n2434 2437 -1.8953279000000e-01\r\n2436 2437 -2.4152988000000e-03\r\n2437 2437  2.4169261000000e+02\r\n2439 2437  2.6043391000000e-02\r\n2440 2437 -5.3069369000000e-02\r\n2442 2437 -9.3856322000000e-04\r\n2485 2437 -5.1077148000000e-01\r\n2487 2437 -2.3842212000000e-03\r\n1333 2438  1.1119848000000e+00\r\n1335 2438 -1.8889917000000e+00\r\n2391 2438 -9.7455670000000e-01\r\n2434 2438  2.0469679000000e+00\r\n2436 2438 -1.3435779000000e+00\r\n2437 2438 -1.5535403000000e+02\r\n2438 2438 -4.3939068000000e+01\r\n2439 2438  6.8279238000000e+00\r\n2442 2438 -1.2894421000000e+00\r\n2485 2438  1.4375670000000e+01\r\n2487 2438 -1.3264689000000e+00\r\n1333 2439  1.8796978000000e+00\r\n1334 2439 -2.8178126000000e-01\r\n1335 2439 -3.1931494000000e+00\r\n2391 2439 -1.6473896000000e+00\r\n2434 2439  3.4601925000000e+00\r\n2435 2439 -5.1870963000000e-01\r\n2436 2439 -2.2711827000000e+00\r\n2437 2439 -2.6261028000000e+02\r\n2438 2439  3.9136646000000e+01\r\n2439 2439  1.1541916000000e+01\r\n2442 2439 -2.1796728000000e+00\r\n2485 2439  2.4300617000000e+01\r\n2486 2439 -3.6428508000000e+00\r\n2487 2439 -2.2422615000000e+00\r\n1336 2440 -1.5634686000000e-01\r\n1338 2440 -1.5465596000000e-03\r\n2392 2440 -5.5635440000000e-01\r\n2394 2440 -5.8063662000000e-03\r\n2437 2440 -1.1556991000000e-01\r\n2439 2440 -9.3856322000000e-04\r\n2440 2440  2.2336393000000e+02\r\n2442 2440  1.0440761000000e-02\r\n2443 2440 -6.2428621000000e-02\r\n2445 2440 -6.5153333000000e-04\r\n2488 2440 -2.2303952000000e-01\r\n2490 2440 -9.2559310000000e-04\r\n1336 2441  7.9859598000000e-01\r\n1338 2441 -2.1248446000000e+00\r\n2394 2441 -1.0491197000000e+00\r\n2437 2441  2.4947264000000e+00\r\n2439 2441 -1.2894421000000e+00\r\n2440 2441 -1.4421959000000e+02\r\n2441 2441 -4.1297090000000e+01\r\n2442 2441  6.9523798000000e+00\r\n2445 2441 -1.2125901000000e+00\r\n2488 2441  1.3195320000000e+01\r\n2490 2441 -1.2717896000000e+00\r\n1336 2442  1.3499466000000e+00\r\n1337 2442 -2.0421983000000e-01\r\n1338 2442 -3.5918374000000e+00\r\n2394 2442 -1.7734320000000e+00\r\n2437 2442  4.2170855000000e+00\r\n2438 2442 -6.3796040000000e-01\r\n2439 2442 -2.1796728000000e+00\r\n2440 2442 -2.4378879000000e+02\r\n2441 2442  3.6812861000000e+01\r\n2442 2442  1.1752301000000e+01\r\n2445 2442 -2.0497609000000e+00\r\n2488 2442  2.2305368000000e+01\r\n2489 2442 -3.3743546000000e+00\r\n2490 2442 -2.1498331000000e+00\r\n1339 2443 -1.2770622000000e-01\r\n1341 2443 -1.2616964000000e-03\r\n2395 2443 -2.9534429000000e-01\r\n2397 2443 -3.0823466000000e-03\r\n2440 2443 -9.3203764000000e-02\r\n2442 2443 -6.5153333000000e-04\r\n2443 2443  2.0543003000000e+02\r\n2445 2443  6.5246799000000e-03\r\n2446 2443 -3.5684063000000e-02\r\n2448 2443 -3.7241503000000e-04\r\n2491 2443 -1.7500042000000e-01\r\n2493 2443 -6.4179336000000e-04\r\n1339 2444  6.7186696000000e-01\r\n1341 2444 -2.3482642000000e+00\r\n2397 2444 -1.0156925000000e+00\r\n2440 2444  3.0248844000000e+00\r\n2442 2444 -1.2125901000000e+00\r\n2443 2444 -1.3262705000000e+02\r\n2444 2444 -3.8253343000000e+01\r\n2445 2444  6.9288974000000e+00\r\n2448 2444 -1.1534979000000e+00\r\n2491 2444  1.1284571000000e+01\r\n2493 2444 -1.1945971000000e+00\r\n1339 2445  1.1357231000000e+00\r\n1340 2445 -1.7486584000000e-01\r\n1341 2445 -3.9695031000000e+00\r\n2397 2445 -1.7169257000000e+00\r\n2440 2445  5.1132610000000e+00\r\n2441 2445 -7.8728226000000e-01\r\n2442 2445 -2.0497609000000e+00\r\n2443 2445 -2.2419261000000e+02\r\n2444 2445  3.4089825000000e+01\r\n2445 2445  1.1712602000000e+01\r\n2448 2445 -1.9498729000000e+00\r\n2491 2445  1.9075426000000e+01\r\n2492 2445 -2.9370187000000e+00\r\n2493 2445 -2.0193456000000e+00\r\n1342 2446 -8.5011201000000e-02\r\n1344 2446 -8.2063256000000e-04\r\n2398 2446 -2.3293228000000e-01\r\n2400 2446 -2.4309867000000e-03\r\n2443 2446 -6.6743872000000e-02\r\n2445 2446 -3.7241503000000e-04\r\n2446 2446  1.9346372000000e+02\r\n2448 2446  4.4624599000000e-03\r\n2494 2446 -7.4440291000000e-02\r\n2496 2446 -3.6626510000000e-04\r\n1342 2447  6.2918306000000e-01\r\n1344 2447 -2.5418704000000e+00\r\n2400 2447 -9.7278993000000e-01\r\n2443 2447  3.0489591000000e+00\r\n2445 2447 -1.1534979000000e+00\r\n2446 2447 -1.2100872000000e+02\r\n2447 2447 -3.6306218000000e+01\r\n2448 2447  5.8067595000000e+00\r\n2494 2447  6.4090076000000e+00\r\n2496 2447 -1.1345621000000e+00\r\n1342 2448  1.0635711000000e+00\r\n1343 2448 -1.6709874000000e-01\r\n1344 2448 -4.2967777000000e+00\r\n2400 2448 -1.6444041000000e+00\r\n2443 2448  5.1539605000000e+00\r\n2444 2448 -8.0974397000000e-01\r\n2445 2448 -1.9498729000000e+00\r\n2446 2448 -2.0455313000000e+02\r\n2447 2448  3.1328710000000e+01\r\n2448 2448  9.8157463000000e+00\r\n2494 2448  1.0833787000000e+01\r\n2495 2448 -1.7021073000000e+00\r\n2496 2448 -1.9178638000000e+00\r\n2449 2449  1.0000000000000e+00\r\n2450 2450  1.0000000000000e+00\r\n2451 2451  1.0000000000000e+00\r\n2452 2452  1.0000000000000e+00\r\n2453 2453  1.0000000000000e+00\r\n2454 2454  1.0000000000000e+00\r\n2455 2455  1.0000000000000e+00\r\n2456 2456  1.0000000000000e+00\r\n2457 2457  1.0000000000000e+00\r\n2458 2458  1.0000000000000e+00\r\n2459 2459  1.0000000000000e+00\r\n2460 2460  1.0000000000000e+00\r\n2461 2461  1.0000000000000e+00\r\n2462 2462  1.0000000000000e+00\r\n2463 2463  1.0000000000000e+00\r\n1360 2464 -9.8766101000000e-02\r\n1362 2464 -9.2950667000000e-04\r\n2416 2464 -6.5596805000000e-01\r\n2418 2464 -6.8459793000000e-03\r\n2464 2464  2.9352001000000e+02\r\n2466 2464  1.0396617000000e-02\r\n2467 2464 -9.3000819000000e-02\r\n2469 2464 -9.4227837000000e-04\r\n2512 2464 -2.5620509000000e-01\r\n2514 2464 -9.4049579000000e-04\r\n1360 2465  9.5313717000000e-01\r\n1362 2465 -1.6372305000000e+00\r\n2418 2465 -1.4419946000000e+00\r\n2464 2465 -1.8558381000000e+02\r\n2465 2465 -5.0099419000000e+01\r\n2466 2465  6.4016278000000e+00\r\n2467 2465  2.7167489000000e-01\r\n2469 2465 -1.6596434000000e+00\r\n2512 2465  1.6314945000000e+01\r\n2514 2465 -1.6566787000000e+00\r\n1360 2466  1.6111831000000e+00\r\n1361 2466 -2.4736688000000e-01\r\n1362 2466 -2.7675744000000e+00\r\n2418 2466 -2.4375476000000e+00\r\n2464 2466 -3.1371087000000e+02\r\n2465 2466  5.5228420000000e+01\r\n2466 2466  1.0821312000000e+01\r\n2467 2466  4.5923923000000e-01\r\n2468 2466 -7.0507554000000e-02\r\n2469 2466 -2.8054613000000e+00\r\n2512 2466  2.7578783000000e+01\r\n2513 2466 -4.2342038000000e+00\r\n2514 2466 -2.8004497000000e+00\r\n1363 2467 -1.1706066000000e-01\r\n1365 2467 -1.1066138000000e-03\r\n2419 2467 -9.3233383000000e-01\r\n2421 2467 -9.7302577000000e-03\r\n2464 2467 -9.0287229000000e-02\r\n2466 2467 -9.4227837000000e-04\r\n2467 2467  2.9394698000000e+02\r\n2469 2467  1.4768954000000e-02\r\n2470 2467 -1.1206181000000e-01\r\n2472 2467 -1.1217214000000e-03\r\n2515 2467 -2.7705098000000e-01\r\n2517 2467 -1.1192633000000e-03\r\n1363 2468  1.0766425000000e+00\r\n1365 2468 -1.6200209000000e+00\r\n2421 2468 -1.3764911000000e+00\r\n2466 2468 -1.6596434000000e+00\r\n2467 2468 -1.8620080000000e+02\r\n2468 2468 -5.4424641000000e+01\r\n2469 2468  7.9428916000000e+00\r\n2470 2468  4.0444868000000e-01\r\n2472 2468 -1.6420458000000e+00\r\n2515 2468  1.6672940000000e+01\r\n2517 2468 -1.6386315000000e+00\r\n1363 2469  1.8199554000000e+00\r\n1364 2469 -2.7645389000000e-01\r\n1365 2469 -2.7384818000000e+00\r\n2421 2469 -2.3268189000000e+00\r\n2466 2469 -2.8054613000000e+00\r\n2467 2469 -3.1475365000000e+02\r\n2468 2469  4.7565742000000e+01\r\n2469 2469  1.3426657000000e+01\r\n2470 2469  6.8367964000000e-01\r\n2471 2469 -1.0385194000000e-01\r\n2472 2469 -2.7757126000000e+00\r\n2515 2469  2.8183922000000e+01\r\n2516 2469 -4.2811790000000e+00\r\n2517 2469 -2.7699410000000e+00\r\n1366 2470 -1.2019010000000e-01\r\n1368 2470 -1.6294661000000e-03\r\n2422 2470 -7.0660953000000e-01\r\n2424 2470 -1.2496808000000e-02\r\n2467 2470 -6.3425720000000e-02\r\n2469 2470 -1.1217214000000e-03\r\n2470 2470  2.9394226000000e+02\r\n2472 2470  1.9313937000000e-02\r\n2473 2470 -9.9581074000000e-02\r\n2475 2470 -1.6515049000000e-03\r\n2518 2470 -5.3094432000000e-01\r\n2520 2470 -1.6469005000000e-03\r\n1366 2471  1.1063236000000e+00\r\n1368 2471 -1.5896856000000e+00\r\n2424 2471 -1.3322460000000e+00\r\n2469 2471 -1.6420458000000e+00\r\n2470 2471 -1.8614785000000e+02\r\n2471 2471 -5.4087451000000e+01\r\n2472 2471  7.7879090000000e+00\r\n2473 2471  2.3826939000000e-01\r\n2475 2471 -1.6111141000000e+00\r\n2518 2471  1.6752403000000e+01\r\n2520 2471 -1.6067971000000e+00\r\n1366 2472  1.8701294000000e+00\r\n1367 2472 -2.8829951000000e-01\r\n1368 2472 -2.6872046000000e+00\r\n2424 2472 -2.2520286000000e+00\r\n2469 2472 -2.7757126000000e+00\r\n2470 2472 -3.1466433000000e+02\r\n2471 2472  4.7365100000000e+01\r\n2472 2472  1.3164680000000e+01\r\n2473 2472  4.0277057000000e-01\r\n2474 2472 -6.2091190000000e-02\r\n2475 2472 -2.7234273000000e+00\r\n2518 2472  2.8318262000000e+01\r\n2519 2472 -4.3655487000000e+00\r\n2520 2472 -2.7161298000000e+00\r\n1369 2473 -1.3991115000000e-01\r\n1371 2473 -2.0021021000000e-03\r\n2425 2473 -8.2332821000000e-01\r\n2427 2473 -1.4561047000000e-02\r\n2470 2473 -9.3381374000000e-02\r\n2472 2473 -1.6515049000000e-03\r\n2473 2473  2.9418307000000e+02\r\n2475 2473  2.3420341000000e-02\r\n2476 2473 -1.3599737000000e-01\r\n2478 2473 -2.4051940000000e-03\r\n2521 2473 -5.6806606000000e-01\r\n2523 2473 -2.0241031000000e-03\r\n1369 2474  1.0531180000000e+00\r\n1371 2474 -1.5754464000000e+00\r\n2427 2474 -1.2991028000000e+00\r\n2472 2474 -1.6111141000000e+00\r\n2473 2474 -1.8645872000000e+02\r\n2474 2474 -5.3928425000000e+01\r\n2475 2474  7.6666907000000e+00\r\n2478 2474 -1.5821610000000e+00\r\n2521 2474  1.7353461000000e+01\r\n2523 2474 -1.5928640000000e+00\r\n1369 2475  1.7801893000000e+00\r\n1370 2475 -2.7197895000000e-01\r\n1371 2475 -2.6631324000000e+00\r\n2427 2475 -2.1960012000000e+00\r\n2472 2475 -2.7234273000000e+00\r\n2473 2475 -3.1518956000000e+02\r\n2474 2475  4.7280929000000e+01\r\n2475 2475  1.2959767000000e+01\r\n2478 2475 -2.6744850000000e+00\r\n2521 2475  2.9334266000000e+01\r\n2522 2475 -4.4817162000000e+00\r\n2523 2475 -2.6925751000000e+00\r\n1372 2476 -1.5717120000000e-01\r\n1374 2476 -2.3738115000000e-03\r\n2428 2476 -8.2346008000000e-01\r\n2430 2476 -1.4563380000000e-02\r\n2473 2476 -1.4350652000000e-01\r\n2475 2476 -2.4051940000000e-03\r\n2476 2476  2.9422033000000e+02\r\n2478 2476  2.3826699000000e-02\r\n2479 2476 -7.3488376000000e-02\r\n2481 2476 -1.2996855000000e-03\r\n2524 2476 -5.9882884000000e-01\r\n2526 2476 -2.3994175000000e-03\r\n1372 2477  9.1004946000000e-01\r\n1374 2477 -1.5615681000000e+00\r\n2430 2477 -1.2995346000000e+00\r\n2473 2477  2.8805878000000e-01\r\n2475 2477 -1.5821610000000e+00\r\n2476 2477 -1.8697054000000e+02\r\n2477 2477 -5.3769714000000e+01\r\n2478 2477  7.6521091000000e+00\r\n2481 2477 -1.6243419000000e+00\r\n2524 2477  1.7718613000000e+01\r\n2526 2477 -1.5785190000000e+00\r\n1372 2478  1.5383476000000e+00\r\n1373 2478 -2.3291596000000e-01\r\n1374 2478 -2.6396747000000e+00\r\n2430 2478 -2.1967333000000e+00\r\n2473 2478  4.8693456000000e-01\r\n2474 2478 -7.3725097000000e-02\r\n2475 2478 -2.6744850000000e+00\r\n2476 2478 -3.1605500000000e+02\r\n2477 2478  4.7247887000000e+01\r\n2478 2478  1.2935123000000e+01\r\n2481 2478 -2.7457858000000e+00\r\n2524 2478  2.9951544000000e+01\r\n2525 2478 -4.5348610000000e+00\r\n2526 2478 -2.6683286000000e+00\r\n1375 2479 -1.3041278000000e-01\r\n1377 2479 -1.2818297000000e-03\r\n2431 2479 -7.5421388000000e-01\r\n2433 2479 -7.8713173000000e-03\r\n2476 2479 -1.3407438000000e-01\r\n2478 2479 -1.2996855000000e-03\r\n2479 2479  2.9384226000000e+02\r\n2481 2479  1.3481846000000e-02\r\n2482 2479 -9.3191329000000e-02\r\n2484 2479 -9.7258687000000e-04\r\n2527 2479 -3.0950011000000e-01\r\n2529 2479 -1.2972209000000e-03\r\n1375 2480  7.4406680000000e-01\r\n1377 2480 -1.6021115000000e+00\r\n2433 2480 -1.3874621000000e+00\r\n2476 2480  8.9881285000000e-01\r\n2478 2480 -1.6243419000000e+00\r\n2479 2480 -1.8788211000000e+02\r\n2480 2480 -5.4236743000000e+01\r\n2481 2480  7.8435408000000e+00\r\n2484 2480 -1.6021489000000e+00\r\n2527 2480  1.8189066000000e+01\r\n2529 2480 -1.6214392000000e+00\r\n1375 2481  1.2577697000000e+00\r\n1376 2481 -1.8902202000000e-01\r\n1377 2481 -2.7082075000000e+00\r\n2433 2481 -2.3453649000000e+00\r\n2476 2481  1.5193522000000e+00\r\n2477 2481 -2.2833356000000e-01\r\n2478 2481 -2.7457858000000e+00\r\n2479 2481 -3.1759570000000e+02\r\n2480 2481  4.7803050000000e+01\r\n2481 2481  1.3258715000000e+01\r\n2484 2481 -2.7082724000000e+00\r\n2527 2481  3.0746777000000e+01\r\n2528 2481 -4.6207335000000e+00\r\n2529 2481 -2.7408791000000e+00\r\n1378 2482 -1.0800179000000e-01\r\n1380 2482 -1.0533314000000e-03\r\n2434 2482 -3.7270901000000e-01\r\n2436 2482 -3.8897599000000e-03\r\n2479 2482 -1.1099011000000e-01\r\n2481 2482 -9.7258687000000e-04\r\n2482 2482  2.7579034000000e+02\r\n2484 2482  8.1467754000000e-03\r\n2485 2482 -5.3900889000000e-02\r\n2487 2482 -5.6253407000000e-04\r\n2530 2482 -2.7171014000000e-01\r\n2532 2482 -9.7113407000000e-04\r\n1378 2483  6.9758497000000e-01\r\n1380 2483 -1.7352467000000e+00\r\n2436 2483 -1.3875787000000e+00\r\n2479 2483  1.7518766000000e+00\r\n2481 2483 -1.6021489000000e+00\r\n2482 2483 -1.7796595000000e+02\r\n2483 2483 -5.1274641000000e+01\r\n2484 2483  7.8678110000000e+00\r\n2487 2483 -1.5372026000000e+00\r\n2530 2483  1.7552672000000e+01\r\n2532 2483 -1.5999259000000e+00\r\n1378 2484  1.1791976000000e+00\r\n1379 2484 -1.8038458000000e-01\r\n1380 2484 -2.9332610000000e+00\r\n2436 2484 -2.3455630000000e+00\r\n2479 2484  2.9613722000000e+00\r\n2480 2484 -4.5300793000000e-01\r\n2481 2484 -2.7082724000000e+00\r\n2482 2484 -3.0083364000000e+02\r\n2483 2484  4.5592825000000e+01\r\n2484 2484  1.3299746000000e+01\r\n2487 2484 -2.5984856000000e+00\r\n2530 2484  2.9671036000000e+01\r\n2531 2484 -4.5388468000000e+00\r\n2532 2484 -2.7045147000000e+00\r\n1381 2485 -7.2669536000000e-02\r\n1383 2485 -6.9405673000000e-04\r\n2437 2485 -2.2845131000000e-01\r\n2439 2485 -2.3842212000000e-03\r\n2482 2485 -7.8869753000000e-02\r\n2484 2485 -5.6253407000000e-04\r\n2485 2485  2.5793638000000e+02\r\n2487 2485  5.0683106000000e-03\r\n2488 2485 -2.2847552000000e-02\r\n2490 2485 -2.3844739000000e-04\r\n2533 2485 -2.0865268000000e-01\r\n2535 2485 -5.5588756000000e-04\r\n1381 2486  6.0934250000000e-01\r\n1383 2486 -1.8967026000000e+00\r\n2439 2486 -1.3264689000000e+00\r\n2482 2486  2.4509331000000e+00\r\n2484 2486 -1.5372026000000e+00\r\n2485 2486 -1.6719294000000e+02\r\n2486 2486 -4.8357234000000e+01\r\n2487 2486  7.7299432000000e+00\r\n2490 2486 -1.4449656000000e+00\r\n2533 2486  1.6255375000000e+01\r\n2535 2486 -1.5192191000000e+00\r\n1381 2487  1.0300319000000e+00\r\n1382 2487 -1.6116763000000e-01\r\n1383 2487 -3.2061840000000e+00\r\n2439 2487 -2.2422615000000e+00\r\n2482 2487  4.1430546000000e+00\r\n2483 2487 -6.4825788000000e-01\r\n2484 2487 -2.5984856000000e+00\r\n2485 2487 -2.8262276000000e+02\r\n2486 2487  4.3219585000000e+01\r\n2487 2487  1.3066689000000e+01\r\n2490 2487 -2.4425698000000e+00\r\n2533 2487  2.7478068000000e+01\r\n2534 2487 -4.2994544000000e+00\r\n2535 2487 -2.5680863000000e+00\r\n1384 2488 -1.0509246000000e-03\r\n1386 2488 -1.0967924000000e-05\r\n2440 2488 -8.8688480000000e-02\r\n2442 2488 -9.2559310000000e-04\r\n2485 2488 -5.4919468000000e-02\r\n2487 2488 -2.3844739000000e-04\r\n2488 2488  2.3420959000000e+02\r\n2490 2488  1.9744794000000e-03\r\n2491 2488 -6.4639159000000e-04\r\n2493 2488 -6.7460351000000e-06\r\n2536 2488 -1.3424802000000e-01\r\n2538 2488 -2.3272242000000e-04\r\n1384 2489  4.9940552000000e-01\r\n1386 2489 -2.1277579000000e+00\r\n2442 2489 -1.2717896000000e+00\r\n2485 2489  3.1495184000000e+00\r\n2487 2489 -1.4449656000000e+00\r\n2488 2489 -1.5324261000000e+02\r\n2489 2489 -4.4241303000000e+01\r\n2490 2489  7.6061764000000e+00\r\n2493 2489 -1.3462969000000e+00\r\n2536 2489  1.5161974000000e+01\r\n2538 2489 -1.4104398000000e+00\r\n1384 2490  8.4419509000000e-01\r\n1385 2490 -1.3465477000000e-01\r\n1386 2490 -3.5967619000000e+00\r\n2442 2490 -2.1498331000000e+00\r\n2485 2490  5.3239458000000e+00\r\n2486 2490 -8.4920502000000e-01\r\n2487 2490 -2.4425698000000e+00\r\n2488 2490 -2.5904131000000e+02\r\n2489 2490  3.9933058000000e+01\r\n2490 2490  1.2857479000000e+01\r\n2493 2490 -2.2757787000000e+00\r\n2536 2490  2.5629800000000e+01\r\n2537 2490 -4.0881248000000e+00\r\n2538 2490 -2.3842075000000e+00\r\n1387 2491 -1.1114540000000e-03\r\n1389 2491 -1.1599637000000e-05\r\n2443 2491 -6.1495356000000e-02\r\n2445 2491 -6.4179336000000e-04\r\n2488 2491 -4.4340814000000e-02\r\n2490 2491 -6.7460351000000e-06\r\n2491 2491  2.1659033000000e+02\r\n2493 2491  1.1787646000000e-03\r\n2494 2491 -5.7061594000000e-04\r\n2496 2491 -5.9552061000000e-06\r\n2539 2491 -9.8060401000000e-02\r\n2541 2491 -6.5671194000000e-06\r\n1387 2492  3.8041292000000e-01\r\n1389 2492 -2.3371655000000e+00\r\n2445 2492 -1.1945971000000e+00\r\n2488 2492  4.1481179000000e+00\r\n2490 2492 -1.3462969000000e+00\r\n2491 2492 -1.4447455000000e+02\r\n2492 2492 -4.1136159000000e+01\r\n2493 2492  7.4343623000000e+00\r\n2496 2492 -1.2409730000000e+00\r\n2539 2492  1.5597252000000e+01\r\n2541 2492 -1.3107487000000e+00\r\n1387 2493  6.4304949000000e-01\r\n1388 2493 -1.0418182000000e-01\r\n1389 2493 -3.9507414000000e+00\r\n2445 2493 -2.0193456000000e+00\r\n2488 2493  7.0119733000000e+00\r\n2489 2493 -1.1360247000000e+00\r\n2490 2493 -2.2757787000000e+00\r\n2491 2493 -2.4421959000000e+02\r\n2492 2493  3.7924460000000e+01\r\n2493 2493  1.2567038000000e+01\r\n2496 2493 -2.0977408000000e+00\r\n2539 2493  2.6365575000000e+01\r\n2540 2493 -4.2715430000000e+00\r\n2541 2493 -2.2156878000000e+00\r\n1390 2494 -1.1669028000000e-03\r\n1392 2494 -1.2178326000000e-05\r\n2446 2494 -3.5094789000000e-02\r\n2448 2494 -3.6626510000000e-04\r\n2491 2494 -1.0328185000000e-01\r\n2493 2494 -5.9552061000000e-06\r\n2494 2494  1.9898050000000e+02\r\n2496 2494  8.4945259000000e-04\r\n1390 2495  3.7138614000000e-01\r\n1392 2495 -2.5446960000000e+00\r\n2448 2495 -1.1345621000000e+00\r\n2491 2495  7.5228875000000e+00\r\n2493 2495 -1.2409730000000e+00\r\n2494 2495 -1.2216176000000e+02\r\n2495 2495 -3.7800226000000e+01\r\n2496 2495  4.9244403000000e+00\r\n1390 2496  6.2779113000000e-01\r\n1391 2496 -1.0171182000000e-01\r\n1392 2496 -4.3015541000000e+00\r\n2448 2496 -1.9178638000000e+00\r\n2491 2496  1.2716689000000e+01\r\n2492 2496 -2.0602993000000e+00\r\n2493 2496 -2.0977408000000e+00\r\n2494 2496 -2.0650224000000e+02\r\n2495 2496  3.1949098000000e+01\r\n2496 2496  8.3242739000000e+00\r\n2497 2497  1.0000000000000e+00\r\n2498 2498  1.0000000000000e+00\r\n2499 2499  1.0000000000000e+00\r\n2500 2500  1.0000000000000e+00\r\n2501 2501  1.0000000000000e+00\r\n2502 2502  1.0000000000000e+00\r\n2503 2503  1.0000000000000e+00\r\n2504 2504  1.0000000000000e+00\r\n2505 2505  1.0000000000000e+00\r\n2506 2506  1.0000000000000e+00\r\n2507 2507  1.0000000000000e+00\r\n2508 2508  1.0000000000000e+00\r\n2509 2509  1.0000000000000e+00\r\n2510 2510  1.0000000000000e+00\r\n2511 2511  1.0000000000000e+00\r\n1408 2512 -8.9071880000000e-04\r\n1410 2512 -9.2959444000000e-06\r\n2464 2512 -9.0116425000000e-02\r\n2466 2512 -9.4049579000000e-04\r\n2512 2512  2.9264749000000e+02\r\n2514 2512  2.0997959000000e-03\r\n2515 2512 -2.8238988000000e-02\r\n2517 2512 -2.2707097000000e-04\r\n2560 2512 -1.3122752000000e-01\r\n2562 2512 -2.2629472000000e-04\r\n1408 2513  6.1242007000000e-01\r\n1410 2513 -1.7083509000000e+00\r\n2466 2513 -1.6566787000000e+00\r\n2512 2513 -1.8638173000000e+02\r\n2513 2513 -5.0801262000000e+01\r\n2514 2513  6.8260786000000e+00\r\n2515 2513  6.3495161000000e-01\r\n2517 2513 -1.7302944000000e+00\r\n2560 2513  1.7114212000000e+01\r\n2562 2513 -1.7245833000000e+00\r\n1408 2514  1.0352349000000e+00\r\n1409 2514 -1.6566752000000e-01\r\n1410 2514 -2.8877963000000e+00\r\n2466 2514 -2.8004497000000e+00\r\n2512 2514 -3.1505967000000e+02\r\n2513 2514  5.6283224000000e+01\r\n2514 2514  1.1538803000000e+01\r\n2515 2514  1.0733222000000e+00\r\n2516 2514 -1.7176259000000e-01\r\n2517 2514 -2.9248897000000e+00\r\n2560 2514  2.8929865000000e+01\r\n2561 2514 -4.6296150000000e+00\r\n2562 2514 -2.9152356000000e+00\r\n1411 2515 -8.9656706000000e-04\r\n1413 2515 -9.3569795000000e-06\r\n2467 2515 -1.0724558000000e-01\r\n2469 2515 -1.1192633000000e-03\r\n2512 2515 -2.1757486000000e-02\r\n2514 2515 -2.2707097000000e-04\r\n2515 2515  2.9274063000000e+02\r\n2517 2515  2.8729248000000e-03\r\n2518 2515 -4.9798591000000e-02\r\n2520 2515 -4.0579256000000e-04\r\n2563 2515 -1.6202618000000e-01\r\n2565 2515 -4.0438183000000e-04\r\n1411 2516  6.8153890000000e-01\r\n1413 2516 -1.6918757000000e+00\r\n2469 2516 -1.6386315000000e+00\r\n2514 2516 -1.7302944000000e+00\r\n2515 2516 -1.8740171000000e+02\r\n2516 2516 -5.5188260000000e+01\r\n2517 2516  8.4867624000000e+00\r\n2518 2516  1.0712380000000e+00\r\n2520 2516 -1.7127767000000e+00\r\n2563 2516  1.7626293000000e+01\r\n2565 2516 -1.7070344000000e+00\r\n1411 2517  1.1520726000000e+00\r\n1412 2517 -1.8249471000000e-01\r\n1413 2517 -2.8599448000000e+00\r\n2469 2517 -2.7699410000000e+00\r\n2514 2517 -2.9248897000000e+00\r\n2515 2517 -3.1678364000000e+02\r\n2516 2517  4.8630497000000e+01\r\n2517 2517  1.4346016000000e+01\r\n2518 2517  1.8108195000000e+00\r\n2519 2517 -2.8684389000000e-01\r\n2520 2517 -2.8952758000000e+00\r\n2563 2517  2.9795467000000e+01\r\n2564 2517 -4.7197678000000e+00\r\n2565 2517 -2.8855691000000e+00\r\n1414 2518 -6.2840163000000e-02\r\n1416 2518 -5.7770378000000e-04\r\n2470 2518 -1.5780271000000e-01\r\n2472 2518 -1.6469005000000e-03\r\n2515 2518 -3.8882232000000e-02\r\n2517 2518 -4.0579256000000e-04\r\n2518 2518  2.9292368000000e+02\r\n2520 2518  4.5149893000000e-03\r\n2521 2518 -6.4822814000000e-02\r\n2523 2518 -5.8459832000000e-04\r\n2566 2518 -1.9865773000000e-01\r\n2568 2518 -5.8251011000000e-04\r\n1414 2519  7.4086655000000e-01\r\n1416 2519 -1.6753377000000e+00\r\n2472 2519 -1.6067971000000e+00\r\n2517 2519 -1.7127767000000e+00\r\n2518 2519 -1.8834113000000e+02\r\n2519 2519 -5.5000471000000e+01\r\n2520 2519  8.3857228000000e+00\r\n2521 2519  8.6492273000000e-01\r\n2523 2519 -1.6952612000000e+00\r\n2566 2519  1.8710595000000e+01\r\n2568 2519 -1.6894219000000e+00\r\n1414 2520  1.2523608000000e+00\r\n1415 2520 -1.9634685000000e-01\r\n1416 2520 -2.8319909000000e+00\r\n2472 2520 -2.7161298000000e+00\r\n2517 2520 -2.8952758000000e+00\r\n2518 2520 -3.1837184000000e+02\r\n2519 2520  4.8683506000000e+01\r\n2520 2520  1.4175224000000e+01\r\n2521 2520  1.4620654000000e+00\r\n2522 2520 -2.2922462000000e-01\r\n2523 2520 -2.8656695000000e+00\r\n2566 2520  3.1628390000000e+01\r\n2567 2520 -4.9587423000000e+00\r\n2568 2520 -2.8557988000000e+00\r\n1417 2521 -7.1349256000000e-02\r\n1419 2521 -6.6569460000000e-04\r\n2473 2521 -1.9394551000000e-01\r\n2475 2521 -2.0241031000000e-03\r\n2518 2521 -5.6015042000000e-02\r\n2520 2521 -5.8459832000000e-04\r\n2521 2521  2.9302351000000e+02\r\n2523 2521  5.3427201000000e-03\r\n2524 2521 -6.5409750000000e-02\r\n2526 2521 -6.7402542000000e-04\r\n2569 2521 -2.3558105000000e-01\r\n2571 2521 -6.7160093000000e-04\r\n1417 2522  7.4808903000000e-01\r\n1419 2522 -1.6656929000000e+00\r\n2475 2522 -1.5928640000000e+00\r\n2520 2522 -1.6952612000000e+00\r\n2521 2522 -1.8867626000000e+02\r\n2522 2522 -5.4906725000000e+01\r\n2523 2522  8.3270121000000e+00\r\n2524 2522  8.0747099000000e-02\r\n2526 2522 -1.6864639000000e+00\r\n2569 2522  1.9821857000000e+01\r\n2571 2522 -1.6806124000000e+00\r\n1417 2523  1.2645688000000e+00\r\n1418 2523 -1.9723372000000e-01\r\n1419 2523 -2.8156854000000e+00\r\n2475 2523 -2.6925751000000e+00\r\n2520 2523 -2.8656695000000e+00\r\n2521 2523 -3.1893814000000e+02\r\n2522 2523  4.8672218000000e+01\r\n2523 2523  1.4075973000000e+01\r\n2524 2523  1.3649481000000e-01\r\n2525 2523 -2.1288979000000e-02\r\n2526 2523 -2.8507966000000e+00\r\n2569 2523  3.3506847000000e+01\r\n2570 2523 -5.2260336000000e+00\r\n2571 2523 -2.8409053000000e+00\r\n1420 2524 -7.9485143000000e-02\r\n1422 2524 -7.5399642000000e-04\r\n2476 2524 -2.2990739000000e-01\r\n2478 2524 -2.3994175000000e-03\r\n2521 2524 -6.4583768000000e-02\r\n2523 2524 -6.7402542000000e-04\r\n2524 2524  2.9310045000000e+02\r\n2526 2524  5.9898177000000e-03\r\n2527 2524 -6.4560309000000e-02\r\n2529 2524 -6.7378059000000e-04\r\n2572 2524 -2.5945883000000e-01\r\n2574 2524 -7.6068636000000e-04\r\n1420 2525  7.1569311000000e-01\r\n1422 2525 -1.6570018000000e+00\r\n2478 2525 -1.5785190000000e+00\r\n2523 2525 -1.6864639000000e+00\r\n2524 2525 -1.8923331000000e+02\r\n2525 2525 -5.4812579000000e+01\r\n2526 2525  8.2862473000000e+00\r\n2529 2525 -1.6863082000000e+00\r\n2572 2525  2.0490641000000e+01\r\n2574 2525 -1.6718474000000e+00\r\n1420 2526  1.2098076000000e+00\r\n1421 2526 -1.8770999000000e-01\r\n1422 2526 -2.8009959000000e+00\r\n2478 2526 -2.6683286000000e+00\r\n2523 2526 -2.8507966000000e+00\r\n2524 2526 -3.1987998000000e+02\r\n2525 2526  4.8719147000000e+01\r\n2526 2526  1.4007069000000e+01\r\n2529 2526 -2.8505336000000e+00\r\n2572 2526  3.4637380000000e+01\r\n2573 2526 -5.3742280000000e+00\r\n2574 2526 -2.8260909000000e+00\r\n1423 2527 -7.0592166000000e-02\r\n1425 2527 -6.6565245000000e-04\r\n2479 2527 -1.2429711000000e-01\r\n2481 2527 -1.2972209000000e-03\r\n2524 2527 -7.5201414000000e-02\r\n2526 2527 -6.7378059000000e-04\r\n2527 2527  2.9295322000000e+02\r\n2529 2527  4.4363327000000e-03\r\n2530 2527 -3.8860587000000e-02\r\n2532 2527 -4.0556666000000e-04\r\n2575 2527 -2.4243745000000e-01\r\n2577 2527 -6.7142407000000e-04\r\n1423 2528  6.7520554000000e-01\r\n1425 2528 -1.6660338000000e+00\r\n2481 2528 -1.6214392000000e+00\r\n2524 2528  1.0464732000000e+00\r\n2526 2528 -1.6863082000000e+00\r\n2527 2528 -1.9024661000000e+02\r\n2528 2528 -5.4906377000000e+01\r\n2529 2528  8.3725627000000e+00\r\n2532 2528 -1.7120399000000e+00\r\n2575 2528  2.0498619000000e+01\r\n2577 2528 -1.6806242000000e+00\r\n1423 2529  1.1413667000000e+00\r\n1424 2529 -1.7801982000000e-01\r\n1425 2529 -2.8162617000000e+00\r\n2481 2529 -2.7408791000000e+00\r\n2524 2529  1.7689573000000e+00\r\n2525 2529 -2.7590558000000e-01\r\n2526 2529 -2.8505336000000e+00\r\n2527 2529 -3.2159269000000e+02\r\n2528 2529  4.9087749000000e+01\r\n2529 2529  1.4152973000000e+01\r\n2532 2529 -2.8940321000000e+00\r\n2575 2529  3.4650845000000e+01\r\n2576 2529 -5.4045176000000e+00\r\n2577 2529 -2.8409252000000e+00\r\n1426 2530 -8.9363099000000e-04\r\n1428 2530 -9.3263373000000e-06\r\n2482 2530 -9.3052124000000e-02\r\n2484 2530 -9.7113407000000e-04\r\n2527 2530 -5.8123209000000e-02\r\n2529 2530 -4.0556666000000e-04\r\n2530 2530  2.9274599000000e+02\r\n2532 2530  2.5066052000000e-03\r\n2533 2530 -8.6187384000000e-04\r\n2535 2530 -8.9949054000000e-06\r\n2578 2530 -1.9353555000000e-01\r\n2580 2530 -4.0452664000000e-04\r\n1426 2531  5.8169256000000e-01\r\n1428 2531 -1.6919846000000e+00\r\n2484 2531 -1.5999259000000e+00\r\n2527 2531  1.8896683000000e+00\r\n2529 2531 -1.7120399000000e+00\r\n2530 2531 -1.9037896000000e+02\r\n2531 2531 -5.5187799000000e+01\r\n2532 2531  8.3957998000000e+00\r\n2535 2531 -1.6778310000000e+00\r\n2578 2531  1.9884307000000e+01\r\n2580 2531 -1.7078690000000e+00\r\n1426 2532  9.8329310000000e-01\r\n1427 2532 -1.5575948000000e-01\r\n1428 2532 -2.8601308000000e+00\r\n2484 2532 -2.7045147000000e+00\r\n2527 2532  3.1942953000000e+00\r\n2528 2532 -5.0599540000000e-01\r\n2529 2532 -2.8940321000000e+00\r\n2530 2532 -3.2181660000000e+02\r\n2531 2532  4.9428946000000e+01\r\n2532 2532  1.4192258000000e+01\r\n2535 2532 -2.8362030000000e+00\r\n2578 2532  3.3612433000000e+01\r\n2579 2532 -5.3244095000000e+00\r\n2580 2532 -2.8869818000000e+00\r\n1429 2533 -9.5612344000000e-04\r\n1431 2533 -9.9785368000000e-06\r\n2485 2533 -5.3264034000000e-02\r\n2487 2533 -5.5588756000000e-04\r\n2530 2533 -3.8332653000000e-02\r\n2532 2533 -8.9949054000000e-06\r\n2533 2533  2.6921187000000e+02\r\n2535 2533  1.2209128000000e-03\r\n2536 2533 -7.7697458000000e-04\r\n2538 2533 -8.1088582000000e-06\r\n2581 2533 -1.1567965000000e-01\r\n2583 2533 -8.7137452000000e-06\r\n1429 2534  4.6451832000000e-01\r\n1431 2534 -1.8794010000000e+00\r\n2487 2534 -1.5192191000000e+00\r\n2530 2534  2.6251845000000e+00\r\n2532 2534 -1.6778310000000e+00\r\n2533 2534 -1.7564264000000e+02\r\n2534 2534 -5.1156974000000e+01\r\n2535 2534  8.2456741000000e+00\r\n2538 2534 -1.5379209000000e+00\r\n2581 2534  1.7977306000000e+01\r\n2583 2534 -1.6256003000000e+00\r\n1429 2535  7.8522103000000e-01\r\n1430 2535 -1.2721097000000e-01\r\n1431 2535 -3.1769365000000e+00\r\n2487 2535 -2.5680863000000e+00\r\n2530 2535  4.4376080000000e+00\r\n2531 2535 -7.1892165000000e-01\r\n2532 2535 -2.8362030000000e+00\r\n2533 2535 -2.9690607000000e+02\r\n2534 2535  4.6023370000000e+01\r\n2535 2535  1.3938478000000e+01\r\n2538 2535 -2.5997015000000e+00\r\n2581 2535  3.0388813000000e+01\r\n2582 2535 -4.9231871000000e+00\r\n2583 2535 -2.7479122000000e+00\r\n1432 2536 -1.0365274000000e-03\r\n1434 2536 -1.0817669000000e-05\r\n2488 2536 -2.2298997000000e-02\r\n2490 2536 -2.3272242000000e-04\r\n2533 2536 -6.6109854000000e-02\r\n2535 2536 -8.1088582000000e-06\r\n2536 2536  2.4579760000000e+02\r\n2538 2536  8.4135438000000e-04\r\n2539 2536 -6.9746052000000e-04\r\n2541 2536 -7.2790136000000e-06\r\n2584 2536 -9.9112757000000e-02\r\n2586 2536 -7.9227719000000e-06\r\n1432 2537  4.3621853000000e-01\r\n1434 2537 -2.0587232000000e+00\r\n2490 2537 -1.4104398000000e+00\r\n2533 2537  2.9155404000000e+00\r\n2535 2537 -1.5379209000000e+00\r\n2536 2537 -1.6074289000000e+02\r\n2537 2537 -4.6711518000000e+01\r\n2538 2537  7.9127908000000e+00\r\n2541 2537 -1.3976821000000e+00\r\n2584 2537  1.6260700000000e+01\r\n2586 2537 -1.5028176000000e+00\r\n1432 2538  7.3738381000000e-01\r\n1433 2538 -1.1946196000000e-01\r\n1434 2538 -3.4800657000000e+00\r\n2490 2538 -2.3842075000000e+00\r\n2533 2538  4.9284294000000e+00\r\n2534 2538 -7.9844421000000e-01\r\n2535 2538 -2.5997015000000e+00\r\n2536 2538 -2.7171979000000e+02\r\n2537 2538  4.2116819000000e+01\r\n2538 2538  1.3375780000000e+01\r\n2541 2538 -2.3626400000000e+00\r\n2584 2538  2.7487088000000e+01\r\n2585 2538 -4.4531237000000e+00\r\n2586 2538 -2.5403629000000e+00\r\n1435 2539 -1.1364253000000e-03\r\n1437 2539 -1.1860249000000e-05\r\n2491 2539 -6.2924825000000e-04\r\n2493 2539 -6.5671194000000e-06\r\n2536 2539 -5.1374736000000e-02\r\n2538 2539 -7.2790136000000e-06\r\n2539 2539  2.2235750000000e+02\r\n2541 2539  5.5257934000000e-04\r\n2587 2539 -8.9255292000000e-02\r\n2589 2539 -7.0906607000000e-06\r\n1435 2540  4.5215280000000e-01\r\n1437 2540 -2.2754922000000e+00\r\n2493 2540 -1.3107487000000e+00\r\n2536 2540  2.4667704000000e+00\r\n2538 2540 -1.3976821000000e+00\r\n2539 2540 -1.4528699000000e+02\r\n2540 2540 -4.2264729000000e+01\r\n2541 2540  6.3503151000000e+00\r\n2587 2540  1.4681026000000e+01\r\n2589 2540 -1.3616800000000e+00\r\n1435 2541  7.6431855000000e-01\r\n1436 2541 -1.2382645000000e-01\r\n1437 2541 -3.8464892000000e+00\r\n2493 2541 -2.2156878000000e+00\r\n2536 2541  4.1698256000000e+00\r\n2537 2541 -6.7554911000000e-01\r\n2538 2541 -2.3626400000000e+00\r\n2539 2541 -2.4559295000000e+02\r\n2540 2541  3.8061162000000e+01\r\n2541 2541  1.0734565000000e+01\r\n2587 2541  2.4816788000000e+01\r\n2588 2541 -4.0205418000000e+00\r\n2589 2541 -2.3017823000000e+00\r\n2542 2542  1.0000000000000e+00\r\n2543 2543  1.0000000000000e+00\r\n2544 2544  1.0000000000000e+00\r\n2545 2545  1.0000000000000e+00\r\n2546 2546  1.0000000000000e+00\r\n2547 2547  1.0000000000000e+00\r\n2548 2548  1.0000000000000e+00\r\n2549 2549  1.0000000000000e+00\r\n2550 2550  1.0000000000000e+00\r\n2551 2551  1.0000000000000e+00\r\n2552 2552  1.0000000000000e+00\r\n2553 2553  1.0000000000000e+00\r\n2554 2554  1.0000000000000e+00\r\n2555 2555  1.0000000000000e+00\r\n2556 2556  1.0000000000000e+00\r\n2557 2557  1.0000000000000e+00\r\n2558 2558  1.0000000000000e+00\r\n2559 2559  1.0000000000000e+00\r\n1456 2560 -9.2582470000000e-04\r\n1458 2560 -9.6623255000000e-06\r\n2512 2560 -2.1683108000000e-02\r\n2514 2560 -2.2629472000000e-04\r\n2560 2560  2.9249089000000e+02\r\n2562 2560  9.3899797000000e-04\r\n2563 2560 -2.1203776000000e-02\r\n2565 2560 -9.7832424000000e-06\r\n2608 2560 -7.1925308000000e-02\r\n2610 2560 -9.3059444000000e-06\r\n1456 2561  5.3099880000000e-01\r\n1458 2561 -1.7328999000000e+00\r\n2514 2561 -1.7245833000000e+00\r\n2560 2561 -1.8766696000000e+02\r\n2561 2561 -5.1030416000000e+01\r\n2562 2561  6.8826972000000e+00\r\n2563 2561  1.1494059000000e+00\r\n2565 2561 -1.7521309000000e+00\r\n2608 2561  1.7993985000000e+01\r\n2610 2561 -1.6668777000000e+00\r\n1456 2562  8.9760037000000e-01\r\n1457 2562 -1.4541384000000e-01\r\n1458 2562 -2.9292939000000e+00\r\n2514 2562 -2.9152356000000e+00\r\n2560 2562 -3.1723224000000e+02\r\n2561 2562  5.6854685000000e+01\r\n2562 2562  1.1634511000000e+01\r\n2563 2562  1.9429557000000e+00\r\n2564 2562 -3.1476442000000e-01\r\n2565 2562 -2.9618020000000e+00\r\n2608 2562  3.0417032000000e+01\r\n2609 2562 -4.9276468000000e+00\r\n2610 2562 -2.8176901000000e+00\r\n1459 2563 -9.2827855000000e-04\r\n1461 2563 -9.6879349000000e-06\r\n2515 2563 -3.8747058000000e-02\r\n2517 2563 -4.0438183000000e-04\r\n2560 2563 -9.3741072000000e-04\r\n2562 2563 -9.7832424000000e-06\r\n2563 2563  2.9252851000000e+02\r\n2565 2563  1.1272212000000e-03\r\n2566 2563 -3.1497905000000e-02\r\n2568 2563 -9.8369999000000e-06\r\n2611 2563 -8.0804250000000e-02\r\n2613 2563 -9.5760031000000e-06\r\n1459 2564  5.7296891000000e-01\r\n1461 2564 -1.7321883000000e+00\r\n2517 2564 -1.7070344000000e+00\r\n2562 2564 -1.7521309000000e+00\r\n2563 2564 -1.8913401000000e+02\r\n2564 2564 -5.5622843000000e+01\r\n2565 2564  8.6554071000000e+00\r\n2566 2564  2.1606308000000e+00\r\n2568 2564 -1.7520569000000e+00\r\n2611 2564  1.8407184000000e+01\r\n2613 2564 -1.7057913000000e+00\r\n1459 2565  9.6854598000000e-01\r\n1460 2565 -1.5690687000000e-01\r\n1461 2565 -2.9280891000000e+00\r\n2517 2565 -2.8855691000000e+00\r\n2562 2565 -2.9618020000000e+00\r\n2563 2565 -3.1971192000000e+02\r\n2564 2565  4.9493657000000e+01\r\n2565 2565  1.4631092000000e+01\r\n2566 2565  3.6523280000000e+00\r\n2567 2565 -5.9168619000000e-01\r\n2568 2565 -2.9616750000000e+00\r\n2611 2565  3.1115484000000e+01\r\n2612 2565 -5.0407855000000e+00\r\n2613 2565 -2.8834677000000e+00\r\n1462 2566 -9.3303617000000e-04\r\n1464 2566 -9.7375877000000e-06\r\n2518 2566 -5.5814953000000e-02\r\n2520 2566 -5.8251011000000e-04\r\n2563 2566 -9.4256166000000e-04\r\n2565 2566 -9.8369999000000e-06\r\n2566 2566  2.9257763000000e+02\r\n2568 2566  1.3058487000000e-03\r\n2569 2566 -3.8248922000000e-02\r\n2571 2566 -9.9264522000000e-06\r\n2614 2566 -1.0616624000000e-01\r\n2616 2566 -9.8771465000000e-06\r\n1462 2567  6.5284766000000e-01\r\n1464 2567 -1.7316471000000e+00\r\n2520 2567 -1.6894219000000e+00\r\n2565 2567 -1.7520569000000e+00\r\n2566 2567 -1.9102779000000e+02\r\n2567 2567 -5.5622856000000e+01\r\n2568 2567  8.6749437000000e+00\r\n2569 2567  1.9808075000000e+00\r\n2571 2567 -1.7520397000000e+00\r\n2614 2567  2.0401092000000e+01\r\n2616 2567 -1.7435727000000e+00\r\n1462 2568  1.1035737000000e+00\r\n1463 2568 -1.7878067000000e-01\r\n1464 2568 -2.9271763000000e+00\r\n2520 2568 -2.8557988000000e+00\r\n2565 2568 -2.9616750000000e+00\r\n2566 2568 -3.2291338000000e+02\r\n2567 2568  5.0011819000000e+01\r\n2568 2568  1.4664123000000e+01\r\n2569 2568  3.3483570000000e+00\r\n2570 2568 -5.4243911000000e-01\r\n2571 2568 -2.9616479000000e+00\r\n2614 2568  3.4486006000000e+01\r\n2615 2568 -5.5867871000000e+00\r\n2616 2568 -2.9473353000000e+00\r\n1465 2569 -9.3950919000000e-04\r\n1467 2569 -9.8051430000000e-06\r\n2521 2569 -6.4351458000000e-02\r\n2523 2569 -6.7160093000000e-04\r\n2566 2569 -9.5113280000000e-04\r\n2568 2569 -9.9264522000000e-06\r\n2569 2569  2.9257699000000e+02\r\n2571 2569  1.3952789000000e-03\r\n2572 2569 -1.7181466000000e-02\r\n2574 2569 -1.0009662000000e-05\r\n2617 2569 -1.1698968000000e-01\r\n2619 2569 -9.9707864000000e-06\r\n1465 2570  7.5794506000000e-01\r\n1467 2570 -1.7325699000000e+00\r\n2523 2570 -1.6806124000000e+00\r\n2568 2570 -1.7520397000000e+00\r\n2569 2570 -1.9181884000000e+02\r\n2570 2570 -5.5621662000000e+01\r\n2571 2570  8.6690385000000e+00\r\n2572 2570  7.5206056000000e-01\r\n2574 2570 -1.7520824000000e+00\r\n2617 2570  2.2314308000000e+01\r\n2619 2570 -1.7455292000000e+00\r\n1465 2571  1.2812295000000e+00\r\n1466 2571 -2.0756036000000e-01\r\n1467 2571 -2.9287341000000e+00\r\n2523 2571 -2.8409053000000e+00\r\n2568 2571 -2.9616479000000e+00\r\n2569 2571 -3.2425036000000e+02\r\n2570 2571  5.0231084000000e+01\r\n2571 2571  1.4654135000000e+01\r\n2572 2571  1.2712824000000e+00\r\n2573 2571 -2.0594892000000e-01\r\n2574 2571 -2.9617180000000e+00\r\n2617 2571  3.7720082000000e+01\r\n2618 2571 -6.1106878000000e+00\r\n2619 2571 -2.9506406000000e+00\r\n1468 2572 -9.4268585000000e-04\r\n1470 2572 -9.8382960000000e-06\r\n2524 2572 -7.2887446000000e-02\r\n2526 2572 -7.6068636000000e-04\r\n2569 2572 -9.5910582000000e-04\r\n2571 2572 -1.0009662000000e-05\r\n2572 2572  2.9258100000000e+02\r\n2574 2572  1.4845354000000e-03\r\n2575 2572 -9.5913579000000e-04\r\n2577 2572 -1.0009975000000e-05\r\n2620 2572 -1.2784603000000e-01\r\n2622 2572 -1.0021305000000e-05\r\n1468 2573  8.0885568000000e-01\r\n1470 2573 -1.7325536000000e+00\r\n2526 2573 -1.6718474000000e+00\r\n2571 2573 -1.7520824000000e+00\r\n2572 2573 -1.9218464000000e+02\r\n2573 2573 -5.5620927000000e+01\r\n2574 2573  8.6602214000000e+00\r\n2577 2573 -1.7520151000000e+00\r\n2620 2573  2.3380365000000e+01\r\n2622 2573 -1.7455184000000e+00\r\n1468 2574  1.3672896000000e+00\r\n1469 2574 -2.2150141000000e-01\r\n1470 2574 -2.9287086000000e+00\r\n2526 2574 -2.8260909000000e+00\r\n2571 2574 -2.9617180000000e+00\r\n2572 2574 -3.2486892000000e+02\r\n2573 2574  5.0332785000000e+01\r\n2574 2574  1.4639234000000e+01\r\n2577 2574 -2.9616042000000e+00\r\n2620 2574  3.9522169000000e+01\r\n2621 2574 -6.4026056000000e+00\r\n2622 2574 -2.9506243000000e+00\r\n1471 2575 -9.3888991000000e-04\r\n1473 2575 -9.7986799000000e-06\r\n2527 2575 -6.4334512000000e-02\r\n2529 2575 -6.7142407000000e-04\r\n2572 2575 -2.0098704000000e-02\r\n2574 2575 -1.0009975000000e-05\r\n2575 2575  2.9258909000000e+02\r\n2577 2575  1.3950558000000e-03\r\n2578 2575 -9.4692422000000e-04\r\n2580 2575 -9.8825296000000e-06\r\n2623 2575 -1.2599173000000e-01\r\n2625 2575 -9.9743272000000e-06\r\n1471 2576  7.6584105000000e-01\r\n1473 2576 -1.7326971000000e+00\r\n2529 2576 -1.6806242000000e+00\r\n2572 2576  1.0386881000000e+00\r\n2574 2576 -1.7520151000000e+00\r\n2575 2576 -1.9300135000000e+02\r\n2576 2576 -5.5621503000000e+01\r\n2577 2576  8.6692625000000e+00\r\n2580 2576 -1.7516908000000e+00\r\n2623 2576  2.3202076000000e+01\r\n2625 2576 -1.7460305000000e+00\r\n1471 2577  1.2945768000000e+00\r\n1472 2577 -2.0972263000000e-01\r\n1473 2577 -2.9289491000000e+00\r\n2529 2577 -2.8409252000000e+00\r\n2572 2577  1.7557971000000e+00\r\n2573 2577 -2.8444074000000e-01\r\n2574 2577 -2.9616042000000e+00\r\n2575 2577 -3.2624926000000e+02\r\n2576 2577  5.0555316000000e+01\r\n2577 2577  1.4654513000000e+01\r\n2580 2577 -2.9610581000000e+00\r\n2623 2577  3.9220762000000e+01\r\n2624 2577 -6.3537996000000e+00\r\n2625 2577 -2.9514879000000e+00\r\n1474 2578 -9.3142427000000e-04\r\n1476 2578 -9.7207651000000e-06\r\n2530 2578 -3.8760933000000e-02\r\n2532 2578 -4.0452664000000e-04\r\n2575 2578 -4.3707890000000e-02\r\n2577 2578 -9.8825296000000e-06\r\n2578 2578  2.9258464000000e+02\r\n2580 2578  1.1273703000000e-03\r\n2581 2578 -9.0379544000000e-04\r\n2583 2578 -9.4324181000000e-06\r\n2626 2578 -1.2432188000000e-01\r\n2628 2578 -9.8495447000000e-06\r\n1474 2579  6.9052184000000e-01\r\n1476 2579 -1.7321429000000e+00\r\n2532 2579 -1.7078690000000e+00\r\n2575 2579  2.5182774000000e+00\r\n2577 2579 -1.7516908000000e+00\r\n2578 2579 -1.9340288000000e+02\r\n2579 2579 -5.5622434000000e+01\r\n2580 2579  8.6410780000000e+00\r\n2583 2579 -1.6970838000000e+00\r\n2626 2579  2.2200415000000e+01\r\n2628 2579 -1.7460864000000e+00\r\n1474 2580  1.1672581000000e+00\r\n1475 2580 -1.8909809000000e-01\r\n1476 2580 -2.9280144000000e+00\r\n2532 2580 -2.8869818000000e+00\r\n2575 2580  4.2568961000000e+00\r\n2576 2580 -6.8962550000000e-01\r\n2577 2580 -2.9610581000000e+00\r\n2578 2580 -3.2692822000000e+02\r\n2579 2580  5.0663406000000e+01\r\n2580 2580  1.4606876000000e+01\r\n2583 2580 -2.8687486000000e+00\r\n2626 2580  3.7527582000000e+01\r\n2627 2580 -6.0795416000000e+00\r\n2628 2580 -2.9515844000000e+00\r\n1477 2581 -9.8194949000000e-04\r\n1479 2581 -1.0248069000000e-05\r\n2533 2581 -8.3493364000000e-04\r\n2535 2581 -8.7137452000000e-06\r\n2578 2581 -6.9271226000000e-02\r\n2580 2581 -9.4324181000000e-06\r\n2581 2581  2.7502451000000e+02\r\n2583 2581  6.8938559000000e-04\r\n2584 2581 -8.4001290000000e-04\r\n2586 2581 -8.7667547000000e-06\r\n2629 2581 -1.2208159000000e-01\r\n2631 2581 -9.3143151000000e-06\r\n1477 2582  6.6369623000000e-01\r\n1479 2582 -1.8415082000000e+00\r\n2535 2582 -1.6256003000000e+00\r\n2578 2582  3.2064503000000e+00\r\n2580 2582 -1.6970838000000e+00\r\n2581 2582 -1.8185558000000e+02\r\n2582 2582 -5.2287970000000e+01\r\n2583 2582  8.4381586000000e+00\r\n2586 2582 -1.5920711000000e+00\r\n2629 2582  2.0074998000000e+01\r\n2631 2582 -1.6760612000000e+00\r\n1477 2583  1.1219114000000e+00\r\n1478 2583 -1.8175342000000e-01\r\n1479 2583 -3.1128835000000e+00\r\n2535 2583 -2.7479122000000e+00\r\n2578 2583  5.4201800000000e+00\r\n2579 2583 -8.7808747000000e-01\r\n2580 2583 -2.8687486000000e+00\r\n2581 2583 -3.0740847000000e+02\r\n2582 2583  4.7632801000000e+01\r\n2583 2583  1.4263855000000e+01\r\n2586 2583 -2.6912369000000e+00\r\n2629 2583  3.3934755000000e+01\r\n2630 2583 -5.4975455000000e+00\r\n2631 2583 -2.8332120000000e+00\r\n1480 2584 -1.0382557000000e-03\r\n1482 2584 -1.0835706000000e-05\r\n2536 2584 -7.5914416000000e-04\r\n2538 2584 -7.9227719000000e-06\r\n2581 2584 -7.6734055000000e-02\r\n2583 2584 -8.7667547000000e-06\r\n2584 2584  2.5747100000000e+02\r\n2586 2584  6.4606008000000e-04\r\n2587 2584 -7.6858040000000e-04\r\n2589 2584 -8.0212528000000e-06\r\n2632 2584 -1.0700336000000e-01\r\n2634 2584 -8.6474752000000e-06\r\n1480 2585  5.8532222000000e-01\r\n1482 2585 -1.9654957000000e+00\r\n2538 2585 -1.5028176000000e+00\r\n2581 2585  3.3975388000000e+00\r\n2583 2585 -1.5920711000000e+00\r\n2584 2585 -1.6914037000000e+02\r\n2585 2585 -4.8953851000000e+01\r\n2586 2585  8.1046240000000e+00\r\n2589 2585 -1.4681644000000e+00\r\n2632 2585  1.7330914000000e+01\r\n2634 2585 -1.5706120000000e+00\r\n1480 2586  9.8942868000000e-01\r\n1481 2586 -1.6029150000000e-01\r\n1482 2586 -3.3224740000000e+00\r\n2538 2586 -2.5403629000000e+00\r\n2581 2586  5.7431995000000e+00\r\n2582 2586 -9.3042188000000e-01\r\n2583 2586 -2.6912369000000e+00\r\n2584 2586 -2.8591488000000e+02\r\n2585 2586  4.4281127000000e+01\r\n2586 2586  1.3700055000000e+01\r\n2589 2586 -2.4817834000000e+00\r\n2632 2586  2.9296178000000e+01\r\n2633 2586 -4.7461009000000e+00\r\n2634 2586 -2.6549625000000e+00\r\n1483 2587 -1.1349350000000e-03\r\n1485 2587 -1.1844695000000e-05\r\n2539 2587 -6.7941293000000e-04\r\n2541 2587 -7.0906607000000e-06\r\n2584 2587 -5.4570200000000e-02\r\n2586 2587 -8.0212528000000e-06\r\n2587 2587  2.3400232000000e+02\r\n2589 2587  5.8182586000000e-04\r\n2635 2587 -5.2806300000000e-02\r\n2637 2587 -7.7235182000000e-06\r\n1483 2588  5.4602781000000e-01\r\n1485 2588 -2.1660390000000e+00\r\n2541 2588 -1.3616800000000e+00\r\n2584 2588  2.6473125000000e+00\r\n2586 2588 -1.4681644000000e+00\r\n2587 2588 -1.5123902000000e+02\r\n2588 2588 -4.4505464000000e+01\r\n2589 2588  6.4147095000000e+00\r\n2635 2588  1.3660367000000e+01\r\n2637 2588 -1.4138587000000e+00\r\n1483 2589  9.2300475000000e-01\r\n1484 2589 -1.4953127000000e-01\r\n1485 2589 -3.6614697000000e+00\r\n2541 2589 -2.3017823000000e+00\r\n2584 2589  4.4750140000000e+00\r\n2585 2589 -7.2497412000000e-01\r\n2586 2589 -2.4817834000000e+00\r\n2587 2589 -2.5565427000000e+02\r\n2588 2589  3.9559654000000e+01\r\n2589 2589  1.0843417000000e+01\r\n2635 2589  2.3091469000000e+01\r\n2636 2589 -3.7409303000000e+00\r\n2637 2589 -2.3899851000000e+00\r\n2590 2590  1.0000000000000e+00\r\n2591 2591  1.0000000000000e+00\r\n2592 2592  1.0000000000000e+00\r\n2593 2593  1.0000000000000e+00\r\n2594 2594  1.0000000000000e+00\r\n2595 2595  1.0000000000000e+00\r\n2596 2596  1.0000000000000e+00\r\n2597 2597  1.0000000000000e+00\r\n2598 2598  1.0000000000000e+00\r\n2599 2599  1.0000000000000e+00\r\n2600 2600  1.0000000000000e+00\r\n2601 2601  1.0000000000000e+00\r\n2602 2602  1.0000000000000e+00\r\n2603 2603  1.0000000000000e+00\r\n2604 2604  1.0000000000000e+00\r\n1501 2605 -1.1247371000000e-03\r\n1503 2605 -1.1738265000000e-05\r\n2605 2605  2.5726183000000e+02\r\n2607 2605  6.3121360000000e-04\r\n2608 2605 -8.7969584000000e-04\r\n2610 2605 -9.1809038000000e-06\r\n2653 2605 -8.0616683000000e-04\r\n2655 2605 -8.4135217000000e-06\r\n1501 2606  5.3992581000000e-01\r\n1503 2606 -1.9859020000000e+00\r\n2605 2606 -1.5570736000000e+02\r\n2606 2606 -4.8977572000000e+01\r\n2607 2606  4.9631555000000e+00\r\n2610 2606 -1.5762532000000e+00\r\n2653 2606  7.3733402000000e+00\r\n2655 2606 -1.3955268000000e+00\r\n1501 2607  9.1268979000000e-01\r\n1502 2607 -1.4785378000000e-01\r\n1503 2607 -3.3569658000000e+00\r\n2605 2607 -2.6320750000000e+02\r\n2606 2607  4.0543038000000e+01\r\n2607 2607  8.3897130000000e+00\r\n2610 2607 -2.6644983000000e+00\r\n2653 2607  1.2463884000000e+01\r\n2654 2607 -2.0191221000000e+00\r\n2655 2607 -2.3589964000000e+00\r\n1504 2608 -1.0585969000000e-03\r\n1506 2608 -1.1047996000000e-05\r\n2560 2608 -8.9167698000000e-04\r\n2562 2608 -9.3059444000000e-06\r\n2605 2608 -2.5480273000000e-02\r\n2607 2608 -9.1809038000000e-06\r\n2608 2608  2.6901524000000e+02\r\n2610 2608  6.7733017000000e-04\r\n2611 2608 -2.6901940000000e-02\r\n2613 2608 -9.5907170000000e-06\r\n2656 2608 -8.5919741000000e-04\r\n2658 2608 -8.9669729000000e-06\r\n1504 2609  6.2262536000000e-01\r\n1506 2609 -1.8943762000000e+00\r\n2562 2609 -1.6668777000000e+00\r\n2605 2609  5.3520116000000e+00\r\n2607 2609 -1.5762532000000e+00\r\n2608 2609 -1.7513816000000e+02\r\n2609 2609 -5.1196925000000e+01\r\n2610 2609  8.2741795000000e+00\r\n2611 2609  1.0732459000000e+00\r\n2613 2609 -1.6465357000000e+00\r\n2656 2609  1.3568905000000e+01\r\n2658 2609 -1.4844173000000e+00\r\n1504 2610  1.0524859000000e+00\r\n1505 2610 -1.7050168000000e-01\r\n1506 2610 -3.2022536000000e+00\r\n2562 2610 -2.8176901000000e+00\r\n2605 2610  9.0470403000000e+00\r\n2606 2610 -1.4656116000000e+00\r\n2607 2610 -2.6644983000000e+00\r\n2608 2610 -2.9605355000000e+02\r\n2609 2610  4.5785790000000e+01\r\n2610 2610  1.3986673000000e+01\r\n2611 2610  1.8142149000000e+00\r\n2612 2610 -2.9390103000000e-01\r\n2613 2610 -2.7833040000000e+00\r\n2656 2610  2.2936876000000e+01\r\n2657 2610 -3.7157514000000e+00\r\n2658 2610 -2.5092590000000e+00\r\n1507 2611 -1.0163523000000e-03\r\n1509 2611 -1.0607112000000e-05\r\n2563 2611 -9.1755346000000e-04\r\n2565 2611 -9.5760031000000e-06\r\n2608 2611 -9.1896332000000e-04\r\n2610 2611 -9.5907170000000e-06\r\n2611 2611  2.8074737000000e+02\r\n2613 2611  7.0571194000000e-04\r\n2614 2611 -5.4088750000000e-02\r\n2616 2611 -1.0025034000000e-05\r\n2659 2611 -3.5101311000000e-02\r\n2661 2611 -9.3148164000000e-06\r\n1507 2612  7.9655881000000e-01\r\n1509 2612 -1.8126331000000e+00\r\n2565 2612 -1.7057913000000e+00\r\n2610 2612 -1.6465357000000e+00\r\n2611 2612 -1.8345941000000e+02\r\n2612 2612 -5.3421482000000e+01\r\n2613 2612  8.4829556000000e+00\r\n2614 2612  3.6783861000000e+00\r\n2616 2612 -1.7166919000000e+00\r\n2659 2612  1.7742896000000e+01\r\n2661 2612 -1.5953361000000e+00\r\n1507 2613  1.3465020000000e+00\r\n1508 2613 -2.1813184000000e-01\r\n1509 2613 -3.0640727000000e+00\r\n2565 2613 -2.8834677000000e+00\r\n2610 2613 -2.7833040000000e+00\r\n2611 2613 -3.1011955000000e+02\r\n2612 2613  4.7973334000000e+01\r\n2613 2613  1.4339579000000e+01\r\n2614 2613  6.2179390000000e+00\r\n2615 2613 -1.0072993000000e+00\r\n2616 2613 -2.9018937000000e+00\r\n2659 2613  2.9992569000000e+01\r\n2660 2613 -4.8587629000000e+00\r\n2661 2613 -2.6967541000000e+00\r\n1510 2614 -9.8266211000000e-04\r\n1512 2614 -1.0255506000000e-05\r\n2566 2614 -9.4640842000000e-04\r\n2568 2614 -9.8771465000000e-06\r\n2611 2614 -9.6057866000000e-04\r\n2613 2614 -1.0025034000000e-05\r\n2614 2614  2.9249122000000e+02\r\n2616 2614  7.3436965000000e-04\r\n2617 2614 -4.9024073000000e-02\r\n2619 2614 -1.0324474000000e-05\r\n2662 2614 -8.9967129000000e-02\r\n2664 2614 -9.9255482000000e-06\r\n1510 2615  1.0708972000000e+00\r\n1512 2615 -1.7366396000000e+00\r\n2568 2615 -1.7435727000000e+00\r\n2613 2615 -1.7166919000000e+00\r\n2614 2615 -1.9487570000000e+02\r\n2615 2615 -5.5647323000000e+01\r\n2616 2615  8.6406706000000e+00\r\n2617 2615  3.8787961000000e+00\r\n2619 2615 -1.7525021000000e+00\r\n2662 2615  2.1966129000000e+01\r\n2664 2615 -1.6850482000000e+00\r\n1510 2616  1.8102447000000e+00\r\n1511 2616 -2.9325594000000e-01\r\n1512 2616 -2.9356156000000e+00\r\n2568 2616 -2.9473353000000e+00\r\n2613 2616 -2.9018937000000e+00\r\n2614 2616 -3.2941788000000e+02\r\n2615 2616  5.1004900000000e+01\r\n2616 2616  1.4606187000000e+01\r\n2617 2616  6.5567169000000e+00\r\n2618 2616 -1.0621747000000e+00\r\n2619 2616 -2.9624295000000e+00\r\n2662 2616  3.7131544000000e+01\r\n2663 2616 -6.0152344000000e+00\r\n2664 2616 -2.8484055000000e+00\r\n1513 2617 -9.8942330000000e-04\r\n1515 2617 -1.0326069000000e-05\r\n2569 2617 -9.5538081000000e-04\r\n2571 2617 -9.9707864000000e-06\r\n2614 2617 -9.8927044000000e-04\r\n2616 2617 -1.0324474000000e-05\r\n2617 2617  2.9254014000000e+02\r\n2619 2617  7.3535632000000e-04\r\n2620 2617 -2.8113285000000e-02\r\n2622 2617 -1.0418811000000e-05\r\n2665 2617 -1.6098640000000e-01\r\n2667 2617 -1.0349907000000e-05\r\n1513 2618  1.4333144000000e+00\r\n1515 2618 -1.7319037000000e+00\r\n2571 2618 -1.7455292000000e+00\r\n2616 2618 -1.7525021000000e+00\r\n2617 2618 -1.9699295000000e+02\r\n2618 2618 -5.5648296000000e+01\r\n2619 2618  8.7298165000000e+00\r\n2620 2618  1.8224452000000e+00\r\n2622 2618 -1.7525012000000e+00\r\n2665 2618  2.5778745000000e+01\r\n2667 2618 -1.7411638000000e+00\r\n1513 2619  2.4228734000000e+00\r\n1514 2619 -3.9249862000000e-01\r\n1515 2619 -2.9276085000000e+00\r\n2571 2619 -2.9506406000000e+00\r\n2616 2619 -2.9624295000000e+00\r\n2617 2619 -3.3299670000000e+02\r\n2618 2619  5.1582022000000e+01\r\n2619 2619  1.4756875000000e+01\r\n2620 2619  3.0806597000000e+00\r\n2621 2619 -4.9905816000000e-01\r\n2622 2619 -2.9624265000000e+00\r\n2665 2619  4.3576367000000e+01\r\n2666 2619 -7.0592488000000e+00\r\n2667 2619 -2.9432618000000e+00\r\n1516 2620 -9.9413888000000e-04\r\n1518 2620 -1.0375283000000e-05\r\n2572 2620 -9.6022143000000e-04\r\n2574 2620 -1.0021305000000e-05\r\n2617 2620 -9.9830961000000e-04\r\n2619 2620 -1.0418811000000e-05\r\n2620 2620  2.9253173000000e+02\r\n2622 2620  7.3561402000000e-04\r\n2623 2620 -9.9942208000000e-04\r\n2625 2620 -1.0430421000000e-05\r\n2668 2620 -1.7947806000000e-01\r\n2670 2620 -1.0399223000000e-05\r\n1516 2621  1.6531461000000e+00\r\n1518 2621 -1.7318990000000e+00\r\n2574 2621 -1.7455184000000e+00\r\n2619 2621 -1.7525012000000e+00\r\n2620 2621 -1.9721627000000e+02\r\n2621 2621 -5.5648176000000e+01\r\n2622 2621  8.7312260000000e+00\r\n2625 2621 -1.7525027000000e+00\r\n2668 2621  2.7604579000000e+01\r\n2670 2621 -1.7425884000000e+00\r\n1516 2622  2.7944782000000e+00\r\n1517 2622 -4.5269632000000e-01\r\n1518 2622 -2.9276020000000e+00\r\n2574 2622 -2.9506243000000e+00\r\n2619 2622 -2.9624265000000e+00\r\n2620 2622 -3.3337438000000e+02\r\n2621 2622  5.1643267000000e+01\r\n2622 2622  1.4759261000000e+01\r\n2625 2622 -2.9624289000000e+00\r\n2668 2622  4.6662780000000e+01\r\n2669 2622 -7.5592177000000e+00\r\n2670 2622 -2.9456714000000e+00\r\n1519 2623 -9.9061269000000e-04\r\n1521 2623 -1.0338482000000e-05\r\n2575 2623 -9.5572009000000e-04\r\n2577 2623 -9.9743272000000e-06\r\n2620 2623 -2.2031607000000e-02\r\n2622 2623 -1.0430421000000e-05\r\n2623 2623  2.9255261000000e+02\r\n2625 2623  7.3543773000000e-04\r\n2626 2623 -9.9135378000000e-04\r\n2628 2623 -1.0346217000000e-05\r\n2671 2623 -1.7989024000000e-01\r\n2673 2623 -1.0381639000000e-05\r\n1519 2624  1.5206748000000e+00\r\n1521 2624 -1.7309160000000e+00\r\n2577 2624 -1.7460305000000e+00\r\n2620 2624  1.2245586000000e+00\r\n2622 2624 -1.7525027000000e+00\r\n2623 2624 -1.9752059000000e+02\r\n2624 2624 -5.5648621000000e+01\r\n2625 2624  8.7326296000000e+00\r\n2628 2624 -1.7524060000000e+00\r\n2671 2624  2.6817401000000e+01\r\n2673 2624 -1.7445577000000e+00\r\n1519 2625  2.5705472000000e+00\r\n1520 2625 -4.1642114000000e-01\r\n1521 2625 -2.9259386000000e+00\r\n2577 2625 -2.9514879000000e+00\r\n2620 2625  2.0699926000000e+00\r\n2621 2625 -3.3533278000000e-01\r\n2622 2625 -2.9624289000000e+00\r\n2623 2625 -3.3388862000000e+02\r\n2624 2625  5.1725673000000e+01\r\n2625 2625  1.4761630000000e+01\r\n2628 2625 -2.9622671000000e+00\r\n2671 2625  4.5332109000000e+01\r\n2672 2625 -7.3436692000000e+00\r\n2673 2625 -2.9489986000000e+00\r\n1522 2626 -9.8257199000000e-04\r\n1524 2626 -1.0254566000000e-05\r\n2578 2626 -9.4376367000000e-04\r\n2580 2626 -9.8495447000000e-06\r\n2623 2626 -4.5424895000000e-02\r\n2625 2626 -1.0346217000000e-05\r\n2626 2626  2.9254806000000e+02\r\n2628 2626  7.3485204000000e-04\r\n2629 2626 -9.7085662000000e-04\r\n2631 2626 -1.0132299000000e-05\r\n2674 2626 -1.5096113000000e-01\r\n2676 2626 -1.0306636000000e-05\r\n1522 2627  1.2302176000000e+00\r\n1524 2627 -1.7320887000000e+00\r\n2580 2627 -1.7460864000000e+00\r\n2623 2627  3.5248492000000e+00\r\n2625 2627 -1.7524060000000e+00\r\n2626 2627 -1.9753514000000e+02\r\n2627 2627 -5.5647836000000e+01\r\n2628 2627  8.7171013000000e+00\r\n2631 2627 -1.7343623000000e+00\r\n2674 2627  2.4820915000000e+01\r\n2676 2627 -1.7459416000000e+00\r\n1522 2628  2.0795599000000e+00\r\n1523 2628 -3.3688403000000e-01\r\n1524 2628 -2.9279228000000e+00\r\n2580 2628 -2.9515844000000e+00\r\n2623 2628  5.9584050000000e+00\r\n2624 2628 -9.6524821000000e-01\r\n2625 2628 -2.9622671000000e+00\r\n2626 2628 -3.3391340000000e+02\r\n2627 2628  5.1731839000000e+01\r\n2628 2628  1.4735386000000e+01\r\n2631 2628 -2.9317638000000e+00\r\n2674 2628  4.1957275000000e+01\r\n2675 2628 -6.7969844000000e+00\r\n2676 2628 -2.9513397000000e+00\r\n1525 2629 -9.9209166000000e-04\r\n1527 2629 -1.0353917000000e-05\r\n2581 2629 -8.9247904000000e-04\r\n2583 2629 -9.3143151000000e-06\r\n2626 2629 -6.7965128000000e-02\r\n2628 2629 -1.0132299000000e-05\r\n2629 2629  2.8669542000000e+02\r\n2631 2629  7.1975809000000e-04\r\n2632 2629 -9.1858604000000e-04\r\n2634 2629 -9.5867796000000e-06\r\n2677 2629 -1.2299397000000e-01\r\n2679 2629 -1.0093614000000e-05\r\n1525 2630  9.7046859000000e-01\r\n1527 2630 -1.7686457000000e+00\r\n2583 2630 -1.6760612000000e+00\r\n2626 2630  4.5542143000000e+00\r\n2628 2630 -1.7343623000000e+00\r\n2629 2630 -1.9256389000000e+02\r\n2630 2630 -5.4535101000000e+01\r\n2631 2630  8.5750910000000e+00\r\n2634 2630 -1.6619487000000e+00\r\n2677 2630  2.2439305000000e+01\r\n2679 2630 -1.7279811000000e+00\r\n1525 2631  1.6404788000000e+00\r\n1526 2631 -2.6575571000000e-01\r\n1527 2631 -2.9897163000000e+00\r\n2583 2631 -2.8332120000000e+00\r\n2626 2631  7.6984380000000e+00\r\n2627 2631 -1.2471382000000e+00\r\n2628 2631 -2.9317638000000e+00\r\n2629 2631 -3.2550975000000e+02\r\n2630 2631  5.0417700000000e+01\r\n2631 2631  1.4495325000000e+01\r\n2634 2631 -2.8093580000000e+00\r\n2677 2631  3.7931372000000e+01\r\n2678 2631 -6.1448394000000e+00\r\n2679 2631 -2.9209771000000e+00\r\n1528 2632 -1.0451533000000e-03\r\n1530 2632 -1.0907693000000e-05\r\n2584 2632 -8.2858378000000e-04\r\n2586 2632 -8.6474752000000e-06\r\n2629 2632 -8.7940613000000e-02\r\n2631 2632 -9.5867796000000e-06\r\n2632 2632  2.6912665000000e+02\r\n2634 2632  6.7637135000000e-04\r\n2635 2632 -8.2768535000000e-04\r\n2637 2632 -8.6380988000000e-06\r\n2680 2632 -7.6916466000000e-02\r\n2682 2632 -9.3597604000000e-06\r\n1528 2633  7.8546443000000e-01\r\n1530 2633 -1.8879020000000e+00\r\n2586 2633 -1.5706120000000e+00\r\n2629 2633  5.1131268000000e+00\r\n2631 2633 -1.6619487000000e+00\r\n2632 2633 -1.7926113000000e+02\r\n2633 2633 -5.1197932000000e+01\r\n2634 2633  8.2670121000000e+00\r\n2637 2633 -1.5179900000000e+00\r\n2680 2633  1.8842384000000e+01\r\n2682 2633 -1.6228397000000e+00\r\n1528 2634  1.3277491000000e+00\r\n1529 2634 -2.1509523000000e-01\r\n1530 2634 -3.1913095000000e+00\r\n2586 2634 -2.6549625000000e+00\r\n2629 2634  8.6432294000000e+00\r\n2630 2634 -1.4002024000000e+00\r\n2631 2634 -2.8093580000000e+00\r\n2632 2634 -3.0302301000000e+02\r\n2633 2634  4.6912740000000e+01\r\n2634 2634  1.3974555000000e+01\r\n2637 2634 -2.5660085000000e+00\r\n2680 2634  3.1851165000000e+01\r\n2681 2634 -5.1598860000000e+00\r\n2682 2634 -2.7432483000000e+00\r\n1531 2635 -1.1549294000000e-03\r\n1533 2635 -1.2053366000000e-05\r\n2587 2635 -7.4005207000000e-04\r\n2589 2635 -7.7235182000000e-06\r\n2632 2635 -1.0315068000000e-01\r\n2634 2635 -8.6380988000000e-06\r\n2635 2635  2.3984529000000e+02\r\n2637 2635  5.9758328000000e-04\r\n2683 2635 -2.0030928000000e-02\r\n2685 2635 -8.3415062000000e-06\r\n1531 2636  6.8019859000000e-01\r\n1533 2636 -2.1149439000000e+00\r\n2589 2636 -1.4138587000000e+00\r\n2632 2636  4.8202674000000e+00\r\n2634 2636 -1.5179900000000e+00\r\n2635 2636 -1.5366395000000e+02\r\n2636 2636 -4.5637013000000e+01\r\n2637 2636  6.5179537000000e+00\r\n2683 2636  1.0444244000000e+01\r\n2685 2636 -1.4660613000000e+00\r\n1531 2637  1.1498069000000e+00\r\n1532 2637 -1.8627016000000e-01\r\n1533 2637 -3.5750987000000e+00\r\n2589 2637 -2.3899851000000e+00\r\n2632 2637  8.1481742000000e+00\r\n2633 2637 -1.3200144000000e+00\r\n2634 2637 -2.5660085000000e+00\r\n2635 2637 -2.5975337000000e+02\r\n2636 2637  4.0130338000000e+01\r\n2637 2637  1.1017941000000e+01\r\n2683 2637  1.7654939000000e+01\r\n2684 2637 -2.8601219000000e+00\r\n2685 2637 -2.4782283000000e+00\r\n2638 2638  1.0000000000000e+00\r\n2639 2639  1.0000000000000e+00\r\n2640 2640  1.0000000000000e+00\r\n2641 2641  1.0000000000000e+00\r\n2642 2642  1.0000000000000e+00\r\n2643 2643  1.0000000000000e+00\r\n2644 2644  1.0000000000000e+00\r\n2645 2645  1.0000000000000e+00\r\n2646 2646  1.0000000000000e+00\r\n2647 2647  1.0000000000000e+00\r\n2648 2648  1.0000000000000e+00\r\n2649 2649  1.0000000000000e+00\r\n2650 2650  1.0000000000000e+00\r\n2651 2651  1.0000000000000e+00\r\n2652 2652  1.0000000000000e+00\r\n1549 2653 -1.3595278000000e-03\r\n1551 2653 -1.4188647000000e-05\r\n2605 2653 -8.3154072000000e-02\r\n2607 2653 -8.4135217000000e-06\r\n2653 2653  2.1644135000000e+02\r\n2655 2653  5.4412163000000e-04\r\n2656 2653 -4.8657587000000e-02\r\n2658 2653 -8.1200792000000e-06\r\n2701 2653 -6.9781846000000e-04\r\n2703 2653 -7.2827492000000e-06\r\n1549 2654  5.9776879000000e-01\r\n1551 2654 -2.3514563000000e+00\r\n2607 2654 -1.3955268000000e+00\r\n2653 2654 -1.3376399000000e+02\r\n2654 2654 -4.1208238000000e+01\r\n2655 2654  6.2743035000000e+00\r\n2656 2654  6.2226571000000e-01\r\n2658 2654 -1.3470069000000e+00\r\n2701 2654  8.2931739000000e+00\r\n2703 2654 -1.1757010000000e+00\r\n1549 2655  1.0104675000000e+00\r\n1550 2655 -1.6369156000000e-01\r\n1551 2655 -3.9748983000000e+00\r\n2607 2655 -2.3589964000000e+00\r\n2653 2655 -2.2611446000000e+02\r\n2654 2655  3.4812190000000e+01\r\n2655 2655  1.0606074000000e+01\r\n2656 2655  1.0518771000000e+00\r\n2657 2655 -1.7039975000000e-01\r\n2658 2655 -2.2769786000000e+00\r\n2701 2655  1.4018770000000e+01\r\n2702 2655 -2.2709827000000e+00\r\n2703 2655 -1.9874033000000e+00\r\n1552 2656 -1.2638846000000e-03\r\n1554 2656 -1.3190472000000e-05\r\n2608 2656 -1.2520418000000e-02\r\n2610 2656 -8.9669729000000e-06\r\n2653 2656 -7.7804975000000e-04\r\n2655 2656 -8.1200792000000e-06\r\n2656 2656  2.3393384000000e+02\r\n2658 2656  5.9443179000000e-04\r\n2659 2656 -6.7042905000000e-02\r\n2661 2656 -8.8708119000000e-06\r\n2704 2656 -7.7850049000000e-04\r\n2706 2656 -8.1247834000000e-06\r\n1552 2657  7.6965209000000e-01\r\n1554 2657 -2.1810716000000e+00\r\n2610 2657 -1.4844173000000e+00\r\n2655 2657 -1.3470069000000e+00\r\n2656 2657 -1.5086242000000e+02\r\n2657 2657 -4.4544210000000e+01\r\n2658 2657  7.7849314000000e+00\r\n2659 2657  3.8661218000000e+00\r\n2661 2657 -1.4686982000000e+00\r\n2704 2657  1.1894484000000e+01\r\n2706 2657 -1.2987530000000e+00\r\n1552 2658  1.3010199000000e+00\r\n1553 2658 -2.1075945000000e-01\r\n1554 2658 -3.6868835000000e+00\r\n2610 2658 -2.5092590000000e+00\r\n2655 2658 -2.2769786000000e+00\r\n2656 2658 -2.5501783000000e+02\r\n2657 2658  3.9359599000000e+01\r\n2658 2658  1.3159646000000e+01\r\n2659 2658  6.5352923000000e+00\r\n2660 2658 -1.0586883000000e+00\r\n2661 2658 -2.4826874000000e+00\r\n2704 2658  2.0106436000000e+01\r\n2705 2658 -3.2571535000000e+00\r\n2706 2658 -2.1954121000000e+00\r\n1555 2659 -1.1600733000000e-03\r\n1557 2659 -1.2107049000000e-05\r\n2611 2659 -8.9252708000000e-04\r\n2613 2659 -9.3148164000000e-06\r\n2656 2659 -8.4998345000000e-04\r\n2658 2659 -8.8708119000000e-06\r\n2659 2659  2.5737405000000e+02\r\n2661 2659  6.5055223000000e-04\r\n2662 2659 -1.0018150000000e-01\r\n2664 2659 -9.7205287000000e-06\r\n2707 2659 -3.2965212000000e-02\r\n2709 2659 -8.6576764000000e-06\r\n1555 2660  1.1539528000000e+00\r\n1557 2660 -1.9797396000000e+00\r\n2613 2660 -1.5953361000000e+00\r\n2658 2660 -1.4686982000000e+00\r\n2659 2660 -1.7192855000000e+02\r\n2660 2660 -4.8997177000000e+01\r\n2661 2660  8.0606971000000e+00\r\n2662 2660  6.4604988000000e+00\r\n2664 2660 -1.5926681000000e+00\r\n2707 2660  1.6546834000000e+01\r\n2709 2660 -1.4187729000000e+00\r\n1555 2661  1.9506405000000e+00\r\n1556 2661 -3.1599334000000e-01\r\n1557 2661 -3.3465496000000e+00\r\n2613 2661 -2.6967541000000e+00\r\n2658 2661 -2.4826874000000e+00\r\n2659 2661 -2.9062782000000e+02\r\n2660 2661  4.4936312000000e+01\r\n2661 2661  1.3625795000000e+01\r\n2662 2661  1.0920820000000e+01\r\n2663 2661 -1.7691144000000e+00\r\n2664 2661 -2.6922443000000e+00\r\n2707 2661  2.7970749000000e+01\r\n2708 2661 -4.5311117000000e+00\r\n2709 2661 -2.3982922000000e+00\r\n1558 2662 -1.1056630000000e-03\r\n1560 2662 -1.1539199000000e-05\r\n2614 2662 -9.5104618000000e-04\r\n2616 2662 -9.9255482000000e-06\r\n2659 2662 -9.3140161000000e-04\r\n2661 2662 -9.7205287000000e-06\r\n2662 2662  2.7497376000000e+02\r\n2664 2662  6.9434127000000e-04\r\n2665 2662 -1.1386525000000e-01\r\n2667 2662 -1.0527775000000e-05\r\n2710 2662 -7.9156590000000e-02\r\n2712 2662 -9.6995821000000e-06\r\n1558 2663  1.8536711000000e+00\r\n1560 2663 -1.8544138000000e+00\r\n2616 2663 -1.6850482000000e+00\r\n2661 2663 -1.5926681000000e+00\r\n2662 2663 -1.8901619000000e+02\r\n2663 2663 -5.2337002000000e+01\r\n2664 2663  8.4010547000000e+00\r\n2665 2663  6.7628026000000e+00\r\n2667 2663 -1.6981766000000e+00\r\n2710 2663  2.2556493000000e+01\r\n2712 2663 -1.5648924000000e+00\r\n1558 2664  3.1334456000000e+00\r\n1559 2664 -5.0759633000000e-01\r\n1560 2664 -3.1347010000000e+00\r\n2616 2664 -2.8484055000000e+00\r\n2661 2664 -2.6922443000000e+00\r\n2662 2664 -3.1951296000000e+02\r\n2663 2664  4.9470820000000e+01\r\n2664 2664  1.4201141000000e+01\r\n2665 2664  1.1431841000000e+01\r\n2666 2664 -1.8518786000000e+00\r\n2667 2664 -2.8705978000000e+00\r\n2710 2664  3.8129496000000e+01\r\n2711 2664 -6.1767123000000e+00\r\n2712 2664 -2.6452942000000e+00\r\n1561 2665 -1.0573977000000e-03\r\n1563 2665 -1.1035480000000e-05\r\n2617 2665 -9.9170737000000e-04\r\n2619 2665 -1.0349907000000e-05\r\n2662 2665 -1.0087504000000e-03\r\n2664 2665 -1.0527775000000e-05\r\n2665 2665  2.9249969000000e+02\r\n2667 2665  7.3764742000000e-04\r\n2668 2665 -4.6634590000000e-02\r\n2670 2665 -1.1034998000000e-05\r\n2713 2665 -1.3131832000000e-01\r\n2715 2665 -1.0721463000000e-05\r\n1561 2666  2.7340495000000e+00\r\n1563 2666 -1.7427167000000e+00\r\n2619 2666 -1.7411638000000e+00\r\n2664 2666 -1.6981766000000e+00\r\n2665 2666 -2.0339245000000e+02\r\n2666 2666 -5.5675534000000e+01\r\n2667 2666  8.6446883000000e+00\r\n2668 2666  3.6380749000000e+00\r\n2670 2666 -1.7529377000000e+00\r\n2713 2666  2.9099360000000e+01\r\n2715 2666 -1.7034650000000e+00\r\n1561 2667  4.6216337000000e+00\r\n1562 2667 -7.4866592000000e-01\r\n1563 2667 -2.9458861000000e+00\r\n2619 2667 -2.9432618000000e+00\r\n2664 2667 -2.8705978000000e+00\r\n2665 2667 -3.4381433000000e+02\r\n2666 2667  5.3266037000000e+01\r\n2667 2667  1.4612973000000e+01\r\n2668 2667  6.1497971000000e+00\r\n2669 2667 -9.9621561000000e-01\r\n2670 2667 -2.9631636000000e+00\r\n2713 2667  4.9189521000000e+01\r\n2714 2667 -7.9682905000000e+00\r\n2715 2667 -2.8795349000000e+00\r\n1564 2668 -1.0654307000000e-03\r\n1566 2668 -1.1119317000000e-05\r\n2620 2668 -9.9643280000000e-04\r\n2622 2668 -1.0399223000000e-05\r\n2665 2668 -1.0573514000000e-03\r\n2667 2668 -1.1034998000000e-05\r\n2668 2668  2.9250316000000e+02\r\n2670 2668  7.3866338000000e-04\r\n2671 2668 -1.0608347000000e-03\r\n2673 2668 -1.1071350000000e-05\r\n2716 2668 -1.8115654000000e-01\r\n2718 2668 -1.1056198000000e-05\r\n1564 2669  3.4190776000000e+00\r\n1566 2669 -1.7400448000000e+00\r\n2622 2669 -1.7425884000000e+00\r\n2667 2669 -1.7529377000000e+00\r\n2668 2669 -2.0414700000000e+02\r\n2669 2669 -5.5676391000000e+01\r\n2670 2669  8.7377492000000e+00\r\n2673 2669 -1.7528667000000e+00\r\n2716 2669  3.2808237000000e+01\r\n2718 2669 -1.7430828000000e+00\r\n1564 2670  5.7796087000000e+00\r\n1565 2670 -9.3624299000000e-01\r\n1566 2670 -2.9413717000000e+00\r\n2622 2670 -2.9456714000000e+00\r\n2667 2670 -2.9631636000000e+00\r\n2668 2670 -3.4509008000000e+02\r\n2669 2670  5.3470185000000e+01\r\n2670 2670  1.4770287000000e+01\r\n2673 2670 -2.9630436000000e+00\r\n2716 2670  5.5459044000000e+01\r\n2717 2670 -8.9838507000000e+00\r\n2718 2670 -2.9465071000000e+00\r\n1567 2671 -1.0581823000000e-03\r\n1569 2671 -1.1043669000000e-05\r\n2623 2671 -9.9474788000000e-04\r\n2625 2671 -1.0381639000000e-05\r\n2668 2671 -2.1878828000000e-02\r\n2670 2671 -1.1071350000000e-05\r\n2671 2671  2.9251661000000e+02\r\n2673 2671  7.3841610000000e-04\r\n2674 2671 -1.0480451000000e-03\r\n2676 2671 -1.0937873000000e-05\r\n2719 2671 -1.7267209000000e-01\r\n2721 2671 -1.1001340000000e-05\r\n1567 2672  2.9525885000000e+00\r\n1569 2672 -1.7372681000000e+00\r\n2625 2672 -1.7445577000000e+00\r\n2668 2672  2.0469226000000e+00\r\n2670 2672 -1.7528667000000e+00\r\n2671 2672 -2.0320912000000e+02\r\n2672 2672 -5.5675291000000e+01\r\n2673 2672  8.7356720000000e+00\r\n2676 2672 -1.7526655000000e+00\r\n2719 2672  3.0288338000000e+01\r\n2721 2672 -1.7420857000000e+00\r\n1567 2673  4.9910519000000e+00\r\n1568 2673 -8.0850686000000e-01\r\n1569 2673 -2.9366758000000e+00\r\n2625 2673 -2.9489986000000e+00\r\n2668 2673  3.4601153000000e+00\r\n2669 2673 -5.6050850000000e-01\r\n2670 2673 -2.9630436000000e+00\r\n2671 2673 -3.4350445000000e+02\r\n2672 2673  5.3216309000000e+01\r\n2673 2673  1.4766772000000e+01\r\n2676 2673 -2.9627057000000e+00\r\n2719 2673  5.1199370000000e+01\r\n2720 2673 -8.2938510000000e+00\r\n2721 2673 -2.9448195000000e+00\r\n1570 2674 -1.0414984000000e-03\r\n1572 2674 -1.0869548000000e-05\r\n2626 2674 -9.8756126000000e-04\r\n2628 2674 -1.0306636000000e-05\r\n2671 2674 -7.4649095000000e-02\r\n2673 2674 -1.0937873000000e-05\r\n2674 2674  2.9256049000000e+02\r\n2676 2674  7.3773362000000e-04\r\n2677 2674 -1.0322977000000e-03\r\n2679 2674 -1.0773526000000e-05\r\n2722 2674 -1.6278700000000e-01\r\n2724 2674 -1.0872520000000e-05\r\n1570 2675  2.1402522000000e+00\r\n1572 2675 -1.7337240000000e+00\r\n2628 2675 -1.7459416000000e+00\r\n2671 2675  5.5504345000000e+00\r\n2673 2675 -1.7526655000000e+00\r\n2674 2675 -2.0241726000000e+02\r\n2675 2675 -5.5674523000000e+01\r\n2676 2675  8.7329503000000e+00\r\n2679 2675 -1.7519398000000e+00\r\n2722 2675  2.6804110000000e+01\r\n2724 2675 -1.7424514000000e+00\r\n1570 2676  3.6178823000000e+00\r\n1571 2676 -5.8606934000000e-01\r\n1572 2676 -2.9306871000000e+00\r\n2628 2676 -2.9513397000000e+00\r\n2671 2676  9.3824543000000e+00\r\n2672 2676 -1.5198860000000e+00\r\n2673 2676 -2.9627057000000e+00\r\n2674 2676 -3.4216613000000e+02\r\n2675 2676  5.3001769000000e+01\r\n2676 2676  1.4762177000000e+01\r\n2679 2676 -2.9614766000000e+00\r\n2722 2676  4.5309667000000e+01\r\n2723 2676 -7.3398205000000e+00\r\n2724 2676 -2.9454398000000e+00\r\n1573 2677 -1.0256101000000e-03\r\n1575 2677 -1.0703731000000e-05\r\n2629 2677 -9.6714994000000e-04\r\n2631 2677 -1.0093614000000e-05\r\n2674 2677 -9.5453332000000e-02\r\n2676 2677 -1.0773526000000e-05\r\n2677 2677  2.9255970000000e+02\r\n2679 2677  7.3650612000000e-04\r\n2680 2677 -9.8283089000000e-04\r\n2682 2677 -1.0257268000000e-05\r\n2725 2677 -1.4086685000000e-01\r\n2727 2677 -1.0713617000000e-05\r\n1573 2678  1.4879109000000e+00\r\n1575 2678 -1.7348672000000e+00\r\n2631 2678 -1.7279811000000e+00\r\n2674 2678  6.7553990000000e+00\r\n2676 2678 -1.7519398000000e+00\r\n2677 2678 -2.0081608000000e+02\r\n2678 2678 -5.5674209000000e+01\r\n2679 2678  8.6610325000000e+00\r\n2682 2678 -1.6975677000000e+00\r\n2725 2678  2.4649625000000e+01\r\n2727 2678 -1.7424488000000e+00\r\n1573 2679  2.5151624000000e+00\r\n1574 2679 -4.0744107000000e-01\r\n1575 2679 -2.9326171000000e+00\r\n2631 2679 -2.9209771000000e+00\r\n2674 2679  1.1419317000000e+01\r\n2675 2679 -1.8498602000000e+00\r\n2676 2679 -2.9614766000000e+00\r\n2677 2679 -3.3945922000000e+02\r\n2678 2679  5.2564782000000e+01\r\n2679 2679  1.4640600000000e+01\r\n2682 2679 -2.8695684000000e+00\r\n2725 2679  4.1667691000000e+01\r\n2726 2679 -6.7499140000000e+00\r\n2727 2679 -2.9454330000000e+00\r\n1576 2680 -1.0696790000000e-03\r\n1578 2680 -1.1163654000000e-05\r\n2632 2680 -8.9683352000000e-04\r\n2634 2680 -9.3597604000000e-06\r\n2677 2680 -1.3019587000000e-01\r\n2679 2680 -1.0257268000000e-05\r\n2680 2680  2.7507258000000e+02\r\n2682 2680  6.9292462000000e-04\r\n2683 2680 -8.8381229000000e-04\r\n2685 2680 -9.2238649000000e-06\r\n2728 2680 -1.6083653000000e-01\r\n2730 2680 -1.0005744000000e-05\r\n1576 2681  1.1161550000000e+00\r\n1578 2681 -1.8433836000000e+00\r\n2634 2681 -1.6228397000000e+00\r\n2677 2681  7.5559522000000e+00\r\n2679 2681 -1.6975677000000e+00\r\n2680 2681 -1.9145418000000e+02\r\n2681 2681 -5.2336375000000e+01\r\n2682 2681  8.3996613000000e+00\r\n2685 2681 -1.5738155000000e+00\r\n2728 2681  2.4937640000000e+01\r\n2730 2681 -1.6561995000000e+00\r\n1576 2682  1.8867484000000e+00\r\n1577 2682 -3.0564480000000e-01\r\n1578 2682 -3.1160556000000e+00\r\n2634 2682 -2.7432483000000e+00\r\n2677 2682  1.2772581000000e+01\r\n2678 2682 -2.0691010000000e+00\r\n2679 2682 -2.8695684000000e+00\r\n2680 2682 -3.2363415000000e+02\r\n2681 2682  5.0140954000000e+01\r\n2682 2682  1.4198786000000e+01\r\n2685 2682 -2.6603763000000e+00\r\n2728 2682  4.2154587000000e+01\r\n2729 2682 -6.8288545000000e+00\r\n2730 2682 -2.7996396000000e+00\r\n1579 2683 -1.1333827000000e-03\r\n1581 2683 -1.1828495000000e-05\r\n2635 2683 -7.9926644000000e-04\r\n2637 2683 -8.3415062000000e-06\r\n2680 2683 -1.6001362000000e-01\r\n2682 2683 -9.2238649000000e-06\r\n2683 2683  2.5155729000000e+02\r\n2685 2683  6.1757781000000e-04\r\n1579 2684  8.0249788000000e-01\r\n1581 2684 -2.0156766000000e+00\r\n2637 2684 -1.4660613000000e+00\r\n2680 2684  1.2057719000000e+01\r\n2682 2684 -1.5738155000000e+00\r\n2683 2684 -1.5727378000000e+02\r\n2684 2684 -4.7880521000000e+01\r\n2685 2684  5.0609096000000e+00\r\n1579 2685  1.3565417000000e+00\r\n1580 2685 -2.1975770000000e-01\r\n1581 2685 -3.4072979000000e+00\r\n2637 2685 -2.4782283000000e+00\r\n2680 2685  2.0382357000000e+01\r\n2681 2685 -3.3019111000000e+00\r\n2682 2685 -2.6603763000000e+00\r\n2683 2685 -2.6585545000000e+02\r\n2684 2685  4.0980820000000e+01\r\n2685 2685  8.5549565000000e+00\r\n2686 2686  1.0000000000000e+00\r\n2687 2687  1.0000000000000e+00\r\n2688 2688  1.0000000000000e+00\r\n2689 2689  1.0000000000000e+00\r\n2690 2690  1.0000000000000e+00\r\n2691 2691  1.0000000000000e+00\r\n2692 2692  1.0000000000000e+00\r\n2693 2693  1.0000000000000e+00\r\n2694 2694  1.0000000000000e+00\r\n2695 2695  1.0000000000000e+00\r\n2696 2696  1.0000000000000e+00\r\n2697 2697  1.0000000000000e+00\r\n2698 2698  1.0000000000000e+00\r\n2699 2699  1.0000000000000e+00\r\n2700 2700  1.0000000000000e+00\r\n1597 2701 -1.6629540000000e-03\r\n1599 2701 -1.7355340000000e-05\r\n2653 2701 -1.7666840000000e-02\r\n2655 2701 -7.2827492000000e-06\r\n2701 2701  1.8127945000000e+02\r\n2703 2701  4.6222261000000e-04\r\n2704 2701 -4.6208187000000e-02\r\n2706 2701 -7.1392325000000e-06\r\n2749 2701 -6.1374639000000e-04\r\n2751 2701 -6.4053350000000e-06\r\n1597 2702  6.3855364000000e-01\r\n1599 2702 -2.7994161000000e+00\r\n2655 2702 -1.1757010000000e+00\r\n2701 2702 -1.1421835000000e+02\r\n2702 2702 -3.4541974000000e+01\r\n2703 2702  6.1408649000000e+00\r\n2704 2702  2.9579518000000e+00\r\n2706 2702 -1.1526676000000e+00\r\n2749 2702  6.5420961000000e+00\r\n2751 2702 -1.0092086000000e+00\r\n1597 2703  1.0794105000000e+00\r\n1598 2703 -1.7485713000000e-01\r\n1599 2703 -4.7321305000000e+00\r\n2655 2703 -1.9874033000000e+00\r\n2701 2703 -1.9307461000000e+02\r\n2702 2703  2.9714594000000e+01\r\n2703 2703  1.0380512000000e+01\r\n2704 2703  5.0001190000000e+00\r\n2705 2703 -8.0998503000000e-01\r\n2706 2703 -1.9484682000000e+00\r\n2749 2703  1.1058753000000e+01\r\n2750 2703 -1.7914423000000e+00\r\n2751 2703 -1.7059653000000e+00\r\n1600 2704 -1.4890944000000e-03\r\n1602 2704 -1.5540863000000e-05\r\n2656 2704 -1.4379690000000e-02\r\n2658 2704 -8.1247834000000e-06\r\n2701 2704 -6.8406698000000e-04\r\n2703 2704 -7.1392325000000e-06\r\n2704 2704  2.0472575000000e+02\r\n2706 2704  5.2461509000000e-04\r\n2707 2704 -1.0061139000000e-01\r\n2709 2704 -7.9893061000000e-06\r\n2752 2704 -1.2523663000000e-02\r\n2754 2704 -7.0613706000000e-06\r\n1600 2705  9.4957271000000e-01\r\n1602 2705 -2.4812165000000e+00\r\n2658 2705 -1.2987530000000e+00\r\n2703 2705 -1.1526676000000e+00\r\n2704 2705 -1.3443133000000e+02\r\n2705 2705 -3.8998572000000e+01\r\n2706 2705  7.3433625000000e+00\r\n2707 2705  6.5601441000000e+00\r\n2709 2705 -1.2772784000000e+00\r\n2752 2705  9.4117655000000e+00\r\n2754 2705 -1.1290759000000e+00\r\n1600 2706  1.6051577000000e+00\r\n1601 2706 -2.6002288000000e-01\r\n1602 2706 -4.1942484000000e+00\r\n2658 2706 -2.1954121000000e+00\r\n2703 2706 -1.9484682000000e+00\r\n2704 2706 -2.2724272000000e+02\r\n2705 2706  3.5048730000000e+01\r\n2706 2706  1.2413219000000e+01\r\n2707 2706  1.1089268000000e+01\r\n2708 2706 -1.7963738000000e+00\r\n2709 2706 -2.1591114000000e+00\r\n2752 2706  1.5909648000000e+01\r\n2753 2706 -2.5772374000000e+00\r\n2754 2706 -1.9085899000000e+00\r\n1603 2707 -1.4015836000000e-03\r\n1605 2707 -1.4627561000000e-05\r\n2659 2707 -8.2956124000000e-04\r\n2661 2707 -8.6576764000000e-06\r\n2704 2707 -7.6551933000000e-04\r\n2706 2707 -7.9893061000000e-06\r\n2707 2707  2.2230395000000e+02\r\n2709 2707  5.6808927000000e-04\r\n2710 2707 -1.2762543000000e-01\r\n2712 2707 -9.0204335000000e-06\r\n2755 2707 -3.9837085000000e-02\r\n2757 2707 -7.9881879000000e-06\r\n1603 2708  1.8125664000000e+00\r\n1605 2708 -2.2875832000000e+00\r\n2661 2708 -1.4187729000000e+00\r\n2706 2708 -1.2772784000000e+00\r\n2707 2708 -1.5295853000000e+02\r\n2708 2708 -4.2340527000000e+01\r\n2709 2708  7.6553068000000e+00\r\n2710 2708  9.6268453000000e+00\r\n2712 2708 -1.4142972000000e+00\r\n2755 2708  1.3936147000000e+01\r\n2757 2708 -1.2526296000000e+00\r\n1603 2709  3.0639608000000e+00\r\n1604 2709 -4.9633165000000e-01\r\n1605 2709 -3.8669288000000e+00\r\n2661 2709 -2.3982922000000e+00\r\n2706 2709 -2.1591114000000e+00\r\n2707 2709 -2.5856097000000e+02\r\n2708 2709  3.9972265000000e+01\r\n2709 2709  1.2940525000000e+01\r\n2710 2709  1.6273212000000e+01\r\n2711 2709 -2.6361010000000e+00\r\n2712 2709 -2.3907268000000e+00\r\n2755 2709  2.3557652000000e+01\r\n2756 2709 -3.8161090000000e+00\r\n2757 2709 -2.1174440000000e+00\r\n1606 2710 -1.2704236000000e-03\r\n1608 2710 -1.3258716000000e-05\r\n2662 2710 -9.2939455000000e-04\r\n2664 2710 -9.6995821000000e-06\r\n2707 2710 -8.6431990000000e-04\r\n2709 2710 -9.0204335000000e-06\r\n2710 2710  2.5163973000000e+02\r\n2712 2710  6.3979946000000e-04\r\n2713 2710 -1.4877012000000e-01\r\n2715 2710 -1.0399190000000e-05\r\n2758 2710 -1.2819117000000e-01\r\n2760 2710 -9.2072237000000e-06\r\n1606 2711  3.3798375000000e+00\r\n1608 2711 -2.0154729000000e+00\r\n2664 2711 -1.5648924000000e+00\r\n2709 2711 -1.4142972000000e+00\r\n2710 2711 -1.7909886000000e+02\r\n2711 2711 -4.7913181000000e+01\r\n2712 2711  7.9985067000000e+00\r\n2713 2711  1.0574914000000e+01\r\n2715 2711 -1.5902782000000e+00\r\n2758 2711  2.0776367000000e+01\r\n2760 2711 -1.4081953000000e+00\r\n1606 2712  5.7132773000000e+00\r\n1607 2712 -9.2547996000000e-01\r\n1608 2712 -3.4069554000000e+00\r\n2664 2712 -2.6452942000000e+00\r\n2709 2712 -2.3907268000000e+00\r\n2710 2712 -3.0274871000000e+02\r\n2711 2712  4.6873893000000e+01\r\n2712 2712  1.3520675000000e+01\r\n2713 2712  1.7875834000000e+01\r\n2714 2712 -2.8956631000000e+00\r\n2715 2712 -2.6882062000000e+00\r\n2758 2712  3.5120371000000e+01\r\n2759 2712 -5.6890638000000e+00\r\n2760 2712 -2.3804134000000e+00\r\n1609 2713 -5.0642588000000e-03\r\n1611 2713 -1.2127795000000e-05\r\n2665 2713 -1.0273091000000e-03\r\n2667 2713 -1.0721463000000e-05\r\n2710 2713 -9.9642962000000e-04\r\n2712 2713 -1.0399190000000e-05\r\n2713 2713  2.8086435000000e+02\r\n2715 2713  7.1210420000000e-04\r\n2716 2713 -9.1822370000000e-02\r\n2718 2713 -1.1503691000000e-05\r\n2761 2713 -1.7873749000000e-01\r\n2763 2713 -1.0725980000000e-05\r\n1609 2714  5.6128305000000e+00\r\n1611 2714 -1.8107620000000e+00\r\n2667 2714 -1.7034650000000e+00\r\n2712 2714 -1.5902782000000e+00\r\n2713 2714 -2.0370738000000e+02\r\n2714 2714 -5.3485001000000e+01\r\n2715 2714  8.4296870000000e+00\r\n2716 2714  6.5513147000000e+00\r\n2718 2714 -1.7174988000000e+00\r\n2761 2714  3.0389582000000e+01\r\n2763 2714 -1.6016877000000e+00\r\n1609 2715  9.4879220000000e+00\r\n1610 2715 -1.5369025000000e+00\r\n1611 2715 -3.0609100000000e+00\r\n2667 2715 -2.8795349000000e+00\r\n2712 2715 -2.6882062000000e+00\r\n2713 2715 -3.4434672000000e+02\r\n2714 2715  5.3357989000000e+01\r\n2715 2715  1.4249535000000e+01\r\n2716 2715  1.1074335000000e+01\r\n2717 2715 -1.7938779000000e+00\r\n2718 2715 -2.9032579000000e+00\r\n2761 2715  5.1370514000000e+01\r\n2762 2715 -8.3212602000000e+00\r\n2763 2715 -2.7074910000000e+00\r\n1612 2716 -2.4425209000000e-02\r\n1614 2716 -1.1764342000000e-05\r\n2668 2716 -1.0593828000000e-03\r\n2670 2716 -1.1056198000000e-05\r\n2713 2716 -1.1022607000000e-03\r\n2715 2716 -1.1503691000000e-05\r\n2716 2716  2.9260413000000e+02\r\n2718 2716  7.4196018000000e-04\r\n2719 2716 -1.1302282000000e-03\r\n2721 2716 -1.1795573000000e-05\r\n2764 2716 -2.9916952000000e-01\r\n2766 2716 -1.1845982000000e-05\r\n1612 2717  7.5049402000000e+00\r\n1614 2717 -1.7330264000000e+00\r\n2670 2717 -1.7430828000000e+00\r\n2715 2717 -1.7174988000000e+00\r\n2716 2717 -2.1477488000000e+02\r\n2717 2717 -5.5713949000000e+01\r\n2718 2717  8.6985085000000e+00\r\n2721 2717 -1.7533842000000e+00\r\n2764 2717  3.9402394000000e+01\r\n2766 2717 -1.7452709000000e+00\r\n1612 2718  1.2686351000000e+01\r\n1613 2718 -2.0549809000000e+00\r\n1614 2718 -2.9295078000000e+00\r\n2670 2718 -2.9465071000000e+00\r\n2715 2718 -2.9032579000000e+00\r\n2716 2718 -3.6305546000000e+02\r\n2717 2718  5.6285871000000e+01\r\n2718 2718  1.4703956000000e+01\r\n2721 2718 -2.9639196000000e+00\r\n2764 2718  6.6605807000000e+01\r\n2765 2718 -1.0789049000000e+01\r\n2766 2718 -2.9502058000000e+00\r\n1615 2719 -7.5910558000000e-03\r\n1617 2719 -1.1689435000000e-05\r\n2671 2719 -1.0541264000000e-03\r\n2673 2719 -1.1001340000000e-05\r\n2716 2719 -3.0381201000000e-02\r\n2718 2719 -1.1795573000000e-05\r\n2719 2719  2.9251143000000e+02\r\n2721 2719  7.4179220000000e-04\r\n2722 2719 -1.1095801000000e-03\r\n2724 2719 -1.1580080000000e-05\r\n2767 2719 -1.8912806000000e-01\r\n2769 2719 -1.1733822000000e-05\r\n1615 2720  5.8632704000000e+00\r\n1617 2720 -1.7376559000000e+00\r\n2673 2720 -1.7420857000000e+00\r\n2716 2720  4.5648266000000e+00\r\n2718 2720 -1.7533842000000e+00\r\n2719 2720 -2.1023215000000e+02\r\n2720 2720 -5.5709291000000e+01\r\n2721 2720  8.7370563000000e+00\r\n2724 2720 -1.7532047000000e+00\r\n2767 2720  3.1930030000000e+01\r\n2769 2720 -1.7444824000000e+00\r\n1615 2721  9.9112681000000e+00\r\n1616 2721 -1.6054733000000e+00\r\n1617 2721 -2.9373322000000e+00\r\n2673 2721 -2.9448195000000e+00\r\n2716 2721  7.7163801000000e+00\r\n2717 2721 -1.2499351000000e+00\r\n2718 2721 -2.9639196000000e+00\r\n2719 2721 -3.5537629000000e+02\r\n2720 2721  5.5053787000000e+01\r\n2721 2721  1.4769114000000e+01\r\n2724 2721 -2.9636172000000e+00\r\n2767 2721  5.3974502000000e+01\r\n2768 2721 -8.7430406000000e+00\r\n2769 2721 -2.9488718000000e+00\r\n1618 2722 -1.1102163000000e-03\r\n1620 2722 -1.1586719000000e-05\r\n2674 2722 -1.0417831000000e-03\r\n2676 2722 -1.0872520000000e-05\r\n2719 2722 -8.4683273000000e-02\r\n2721 2722 -1.1580080000000e-05\r\n2722 2722  2.9248778000000e+02\r\n2724 2722  7.4090287000000e-04\r\n2725 2722 -1.0889092000000e-03\r\n2727 2722 -1.1364349000000e-05\r\n2770 2722 -1.1103176000000e-01\r\n2772 2722 -1.1514036000000e-05\r\n1618 2723  3.7457762000000e+00\r\n1620 2723 -1.7408475000000e+00\r\n2676 2723 -1.7424514000000e+00\r\n2719 2723  9.0636672000000e+00\r\n2721 2723 -1.7532047000000e+00\r\n2722 2723 -2.0660967000000e+02\r\n2723 2723 -5.5703345000000e+01\r\n2724 2723  8.7388936000000e+00\r\n2727 2723 -1.7526895000000e+00\r\n2770 2723  2.5917748000000e+01\r\n2772 2723 -1.7434598000000e+00\r\n1618 2724  6.3318601000000e+00\r\n1619 2724 -1.0256761000000e+00\r\n1620 2724 -2.9427286000000e+00\r\n2676 2724 -2.9454398000000e+00\r\n2719 2724  1.5321223000000e+01\r\n2720 2724 -2.4818319000000e+00\r\n2721 2724 -2.9636172000000e+00\r\n2722 2724 -3.4925298000000e+02\r\n2723 2724  5.4077195000000e+01\r\n2724 2724  1.4772224000000e+01\r\n2727 2724 -2.9627448000000e+00\r\n2770 2724  4.3811362000000e+01\r\n2771 2724 -7.0968508000000e+00\r\n2772 2724 -2.9471445000000e+00\r\n1621 2725 -1.0870975000000e-03\r\n1623 2725 -1.1345441000000e-05\r\n2677 2725 -1.0265574000000e-03\r\n2679 2725 -1.0713617000000e-05\r\n2722 2725 -1.1755392000000e-01\r\n2724 2725 -1.1364349000000e-05\r\n2725 2725  2.9248715000000e+02\r\n2727 2725  7.3968854000000e-04\r\n2728 2725 -1.0525810000000e-03\r\n2730 2725 -1.0985212000000e-05\r\n2773 2725 -7.5843231000000e-02\r\n2775 2725 -1.1305784000000e-05\r\n1621 2726  2.3393978000000e+00\r\n1623 2726 -1.7413736000000e+00\r\n2679 2726 -1.7424488000000e+00\r\n2722 2726  8.9243960000000e+00\r\n2724 2726 -1.7526895000000e+00\r\n2725 2726 -2.0161014000000e+02\r\n2726 2726 -5.5701882000000e+01\r\n2727 2726  8.7033340000000e+00\r\n2730 2726 -1.7166474000000e+00\r\n2773 2726  2.2461520000000e+01\r\n2775 2726 -1.7439346000000e+00\r\n1621 2727  3.9545158000000e+00\r\n1622 2727 -6.4058624000000e-01\r\n1623 2727 -2.9436164000000e+00\r\n2679 2727 -2.9454330000000e+00\r\n2722 2727  1.5085791000000e+01\r\n2723 2727 -2.4437253000000e+00\r\n2724 2727 -2.9627448000000e+00\r\n2725 2727 -3.4080161000000e+02\r\n2726 2727  5.2712667000000e+01\r\n2727 2727  1.4712108000000e+01\r\n2730 2727 -2.9018208000000e+00\r\n2773 2727  3.7968935000000e+01\r\n2774 2727 -6.1505323000000e+00\r\n2775 2727 -2.9479454000000e+00\r\n1624 2728 -1.1157723000000e-03\r\n1626 2728 -1.1644704000000e-05\r\n2680 2728 -9.5873036000000e-04\r\n2682 2728 -1.0005744000000e-05\r\n2725 2728 -1.0373638000000e-01\r\n2727 2728 -1.0985212000000e-05\r\n2728 2728  2.8076162000000e+02\r\n2730 2728  7.0006857000000e-04\r\n2776 2728 -5.8737235000000e-02\r\n2778 2728 -1.0827533000000e-05\r\n1624 2729  1.7290239000000e+00\r\n1626 2729 -1.8134713000000e+00\r\n2682 2729 -1.6561995000000e+00\r\n2725 2729  6.0763390000000e+00\r\n2727 2729 -1.7166474000000e+00\r\n2728 2729 -1.8895409000000e+02\r\n2729 2729 -5.3475766000000e+01\r\n2730 2729  6.8846034000000e+00\r\n2776 2729  1.9981820000000e+01\r\n2778 2729 -1.6922940000000e+00\r\n1624 2730  2.9227420000000e+00\r\n1625 2730 -4.7345444000000e-01\r\n1626 2730 -3.0654918000000e+00\r\n2682 2730 -2.7996396000000e+00\r\n2725 2730  1.0271443000000e+01\r\n2726 2730 -1.6638692000000e+00\r\n2727 2730 -2.9018208000000e+00\r\n2728 2730 -3.1940800000000e+02\r\n2729 2730  4.9342559000000e+01\r\n2730 2730  1.1637733000000e+01\r\n2776 2730  3.3777269000000e+01\r\n2777 2730 -5.4715737000000e+00\r\n2778 2730 -2.8606537000000e+00\r\n2731 2731  1.0000000000000e+00\r\n2732 2732  1.0000000000000e+00\r\n2733 2733  1.0000000000000e+00\r\n2734 2734  1.0000000000000e+00\r\n2735 2735  1.0000000000000e+00\r\n2736 2736  1.0000000000000e+00\r\n2737 2737  1.0000000000000e+00\r\n2738 2738  1.0000000000000e+00\r\n2739 2739  1.0000000000000e+00\r\n2740 2740  1.0000000000000e+00\r\n2741 2741  1.0000000000000e+00\r\n2742 2742  1.0000000000000e+00\r\n2743 2743  1.0000000000000e+00\r\n2744 2744  1.0000000000000e+00\r\n2745 2745  1.0000000000000e+00\r\n2746 2746  1.0000000000000e+00\r\n2747 2747  1.0000000000000e+00\r\n2748 2748  1.0000000000000e+00\r\n1645 2749 -1.9485883000000e-03\r\n1647 2749 -2.0336349000000e-05\r\n2701 2749 -6.8896215000000e-03\r\n2703 2749 -6.4053350000000e-06\r\n2749 2749  1.5788405000000e+02\r\n2751 2749  4.0803991000000e-04\r\n2752 2749 -5.6619370000000e-02\r\n2754 2749 -6.3257706000000e-06\r\n2797 2749 -5.8544193000000e-04\r\n2799 2749 -5.6495585000000e-06\r\n1645 2750  6.3186954000000e-01\r\n1647 2750 -3.2022787000000e+00\r\n2703 2750 -1.0092086000000e+00\r\n2749 2750 -9.8805163000000e+01\r\n2750 2750 -3.0096993000000e+01\r\n2751 2750  6.1019210000000e+00\r\n2752 2750  4.4049677000000e+00\r\n2754 2750 -9.9678295000000e-01\r\n2797 2750  3.1349304000000e+00\r\n2799 2750 -8.9027329000000e-01\r\n1645 2751  1.0681115000000e+00\r\n1646 2751 -1.7302417000000e-01\r\n1647 2751 -5.4131281000000e+00\r\n2703 2751 -1.7059653000000e+00\r\n2749 2751 -1.6702013000000e+02\r\n2750 2751  2.5665630000000e+01\r\n2751 2751  1.0314680000000e+01\r\n2752 2751  7.4461520000000e+00\r\n2753 2751 -1.2062076000000e+00\r\n2754 2751 -1.6849607000000e+00\r\n2797 2751  5.2992825000000e+00\r\n2798 2751 -8.5843462000000e-01\r\n2799 2751 -1.5049169000000e+00\r\n1648 2752 -1.7858554000000e-03\r\n1650 2752 -1.8637995000000e-05\r\n2704 2752 -6.7660641000000e-04\r\n2706 2752 -7.0613706000000e-06\r\n2749 2752 -6.0612268000000e-04\r\n2751 2752 -6.3257706000000e-06\r\n2752 2752  1.7547880000000e+02\r\n2754 2752  4.5601491000000e-04\r\n2755 2752 -1.1110441000000e-01\r\n2757 2752 -7.2066013000000e-06\r\n2800 2752 -1.2406400000000e-02\r\n2802 2752 -6.4187999000000e-06\r\n1648 2753  1.1698018000000e+00\r\n1650 2753 -2.8848554000000e+00\r\n2706 2753 -1.1290759000000e+00\r\n2751 2753 -9.9678295000000e-01\r\n2752 2753 -1.1634166000000e+02\r\n2753 2753 -3.3442061000000e+01\r\n2754 2753  7.1265019000000e+00\r\n2755 2753  8.8524187000000e+00\r\n2757 2753 -1.1170418000000e+00\r\n2800 2753  5.6171805000000e+00\r\n2802 2753 -9.9499262000000e-01\r\n1648 2754  1.9774329000000e+00\r\n1649 2754 -3.2032228000000e-01\r\n1650 2754 -4.8765596000000e+00\r\n2706 2754 -1.9085899000000e+00\r\n2751 2754 -1.6849607000000e+00\r\n2752 2754 -1.9666394000000e+02\r\n2753 2754  3.0310371000000e+01\r\n2754 2754  1.2046637000000e+01\r\n2755 2754  1.4964129000000e+01\r\n2756 2754 -2.4240235000000e+00\r\n2757 2754 -1.8882474000000e+00\r\n2800 2754  9.4952819000000e+00\r\n2801 2754 -1.5381307000000e+00\r\n2802 2754 -1.6819355000000e+00\r\n1651 2755 -1.6296921000000e-03\r\n1653 2755 -1.7008204000000e-05\r\n2707 2755 -7.6541219000000e-04\r\n2709 2755 -7.9881879000000e-06\r\n2752 2755 -6.9052212000000e-04\r\n2754 2755 -7.2066013000000e-06\r\n2755 2755  1.9894931000000e+02\r\n2757 2755  5.1304880000000e-04\r\n2758 2755 -1.8796678000000e-01\r\n2760 2755 -8.3498387000000e-06\r\n2803 2755 -2.8417687000000e-02\r\n2805 2755 -7.4056227000000e-06\r\n1651 2756  2.6875379000000e+00\r\n1653 2756 -2.5521445000000e+00\r\n2709 2756 -1.2526296000000e+00\r\n2754 2756 -1.1170418000000e+00\r\n2755 2756 -1.3896930000000e+02\r\n2756 2756 -3.7903255000000e+01\r\n2757 2756  7.2995082000000e+00\r\n2758 2756  1.3123630000000e+01\r\n2760 2756 -1.2577767000000e+00\r\n2803 2756  9.0322981000000e+00\r\n2805 2756 -1.1156610000000e+00\r\n1651 2757  4.5430105000000e+00\r\n1652 2757 -7.3590446000000e-01\r\n1653 2757 -4.3141417000000e+00\r\n2709 2757 -2.1174440000000e+00\r\n2754 2757 -1.8882474000000e+00\r\n2755 2757 -2.3491353000000e+02\r\n2756 2757  3.6293837000000e+01\r\n2757 2757  1.2339081000000e+01\r\n2758 2757  2.2184168000000e+01\r\n2759 2757 -3.5935266000000e+00\r\n2760 2757 -2.1261440000000e+00\r\n2803 2757  1.5268185000000e+01\r\n2804 2757 -2.4732336000000e+00\r\n2805 2757 -1.8859120000000e+00\r\n1654 2758 -1.1397067000000e-02\r\n1656 2758 -1.5750990000000e-05\r\n2710 2758 -8.8221776000000e-04\r\n2712 2758 -9.2072237000000e-06\r\n2755 2758 -8.0006484000000e-04\r\n2757 2758 -8.3498387000000e-06\r\n2758 2758  2.2233358000000e+02\r\n2760 2758  5.7188245000000e-04\r\n2761 2758 -1.6313315000000e-01\r\n2763 2758 -9.8498578000000e-06\r\n2806 2758 -4.7986726000000e-02\r\n2808 2758 -8.8984680000000e-06\r\n1654 2759  6.2010410000000e+00\r\n1656 2759 -2.2862821000000e+00\r\n2712 2759 -1.4081953000000e+00\r\n2757 2759 -1.2577767000000e+00\r\n2758 2759 -1.6380015000000e+02\r\n2759 2759 -4.2362572000000e+01\r\n2760 2759  7.6785119000000e+00\r\n2761 2759  1.5538893000000e+01\r\n2763 2759 -1.4297386000000e+00\r\n2806 2759  1.4508479000000e+01\r\n2808 2759 -1.2917639000000e+00\r\n1654 2760  1.0482240000000e+01\r\n1655 2760 -1.6979338000000e+00\r\n1656 2760 -3.8647313000000e+00\r\n2712 2760 -2.3804134000000e+00\r\n2757 2760 -2.1261440000000e+00\r\n2758 2760 -2.7688778000000e+02\r\n2759 2760  4.2884400000000e+01\r\n2760 2760  1.2979755000000e+01\r\n2761 2760  2.6266945000000e+01\r\n2762 2760 -4.2547715000000e+00\r\n2763 2760 -2.4168301000000e+00\r\n2806 2760  2.4525133000000e+01\r\n2807 2760 -3.9726294000000e+00\r\n2808 2760 -2.1835977000000e+00\r\n1657 2761 -6.8801674000000e-02\r\n1659 2761 -1.4097767000000e-05\r\n2713 2761 -1.0277419000000e-03\r\n2715 2761 -1.0725980000000e-05\r\n2758 2761 -9.4379367000000e-04\r\n2760 2761 -9.8498578000000e-06\r\n2761 2761  2.5758060000000e+02\r\n2763 2761  6.5892147000000e-04\r\n2764 2761 -1.8589673000000e-01\r\n2766 2761 -1.1723957000000e-05\r\n2809 2761 -1.5404578000000e-01\r\n2811 2761 -1.0604971000000e-05\r\n1657 2762  1.1863207000000e+01\r\n1659 2762 -1.9732535000000e+00\r\n2715 2762 -1.6016877000000e+00\r\n2760 2762 -1.4297386000000e+00\r\n2761 2762 -1.9628414000000e+02\r\n2762 2762 -4.9059757000000e+01\r\n2763 2762  8.1355860000000e+00\r\n2764 2762  1.2169841000000e+01\r\n2766 2762 -1.6408829000000e+00\r\n2809 2762  2.4571690000000e+01\r\n2811 2762 -1.4845134000000e+00\r\n1657 2763  2.0053552000000e+01\r\n1658 2763 -3.2482342000000e+00\r\n1659 2763 -3.3355854000000e+00\r\n2715 2763 -2.7074910000000e+00\r\n2760 2763 -2.4168301000000e+00\r\n2761 2763 -3.3179848000000e+02\r\n2762 2763  5.1446462000000e+01\r\n2763 2763  1.3752387000000e+01\r\n2764 2763  2.0571884000000e+01\r\n2765 2763 -3.3321924000000e+00\r\n2766 2763 -2.7737464000000e+00\r\n2809 2763  4.1535956000000e+01\r\n2810 2763 -6.7279109000000e+00\r\n2811 2763 -2.5094197000000e+00\r\n1660 2764 -1.1943183000000e-01\r\n1662 2764 -1.2728050000000e-05\r\n2716 2764 -1.1350583000000e-03\r\n2718 2764 -1.1845982000000e-05\r\n2761 2764 -1.1233661000000e-03\r\n2763 2764 -1.1723957000000e-05\r\n2764 2764  2.9273776000000e+02\r\n2766 2764  7.4540679000000e-04\r\n2767 2764 -1.2031711000000e-03\r\n2769 2764 -1.2556838000000e-05\r\n2812 2764 -3.7509276000000e-01\r\n2814 2764 -1.2533584000000e-05\r\n1660 2765  1.6863026000000e+01\r\n1662 2765 -1.7378832000000e+00\r\n2718 2765 -1.7452709000000e+00\r\n2763 2765 -1.6408829000000e+00\r\n2764 2765 -2.3456261000000e+02\r\n2765 2765 -5.5748297000000e+01\r\n2766 2765  8.5957874000000e+00\r\n2769 2765 -1.7538992000000e+00\r\n2812 2765  4.9880579000000e+01\r\n2814 2765 -1.7115905000000e+00\r\n1660 2766  2.8505260000000e+01\r\n1661 2766 -4.6171404000000e+00\r\n1662 2766 -2.9377177000000e+00\r\n2718 2766 -2.9502058000000e+00\r\n2763 2766 -2.7737464000000e+00\r\n2764 2766 -3.9650463000000e+02\r\n2765 2766  6.1616126000000e+01\r\n2766 2766  1.4530315000000e+01\r\n2769 2766 -2.9647895000000e+00\r\n2812 2766  8.4318130000000e+01\r\n2813 2766 -1.3657432000000e+01\r\n2814 2766 -2.8932726000000e+00\r\n1663 2767 -6.0944376000000e-02\r\n1665 2767 -1.2416937000000e-05\r\n2719 2767 -1.1243114000000e-03\r\n2721 2767 -1.1733822000000e-05\r\n2764 2767 -1.4093544000000e-01\r\n2766 2767 -1.2556838000000e-05\r\n2767 2767  2.9261218000000e+02\r\n2769 2767  7.4542913000000e-04\r\n2770 2767 -1.1687854000000e-03\r\n2772 2767 -1.2197973000000e-05\r\n2815 2767 -1.6354702000000e-01\r\n2817 2767 -1.2518373000000e-05\r\n1663 2768  1.1099187000000e+01\r\n1665 2768 -1.7344354000000e+00\r\n2721 2768 -1.7444824000000e+00\r\n2764 2768  1.2060554000000e+01\r\n2766 2768 -1.7538992000000e+00\r\n2767 2768 -2.1790806000000e+02\r\n2768 2768 -5.5744062000000e+01\r\n2769 2768  8.7415519000000e+00\r\n2772 2768 -1.7537264000000e+00\r\n2815 2768  2.6923069000000e+01\r\n2817 2768 -1.7487497000000e+00\r\n1663 2769  1.8762053000000e+01\r\n1664 2769 -3.0390354000000e+00\r\n1665 2769 -2.9318876000000e+00\r\n2721 2769 -2.9488718000000e+00\r\n2764 2769  2.0387148000000e+01\r\n2765 2769 -3.3022646000000e+00\r\n2766 2769 -2.9647895000000e+00\r\n2767 2769 -3.6835155000000e+02\r\n2768 2769  5.7067662000000e+01\r\n2769 2769  1.4776712000000e+01\r\n2772 2769 -2.9644990000000e+00\r\n2815 2769  4.5510728000000e+01\r\n2816 2769 -7.3717256000000e+00\r\n2817 2769 -2.9560846000000e+00\r\n1666 2770 -9.7364176000000e-03\r\n1668 2770 -1.2057755000000e-05\r\n2722 2770 -1.1032519000000e-03\r\n2724 2770 -1.1514036000000e-05\r\n2767 2770 -1.6315817000000e-01\r\n2769 2770 -1.2197973000000e-05\r\n2770 2770  2.9253163000000e+02\r\n2772 2770  7.4382185000000e-04\r\n2773 2770 -1.1401135000000e-03\r\n2775 2770 -1.1898740000000e-05\r\n2818 2770 -1.0412500000000e-01\r\n2820 2770 -1.2162317000000e-05\r\n1666 2771  6.0604122000000e+00\r\n1668 2771 -1.7335935000000e+00\r\n2724 2771 -1.7434598000000e+00\r\n2767 2771  1.5094148000000e+01\r\n2769 2771 -1.7537264000000e+00\r\n2770 2771 -2.0922440000000e+02\r\n2771 2771 -5.5737111000000e+01\r\n2772 2771  8.7390582000000e+00\r\n2775 2771 -1.7532679000000e+00\r\n2818 2771  2.0234483000000e+01\r\n2820 2771 -1.7487549000000e+00\r\n1666 2772  1.0244521000000e+01\r\n1667 2772 -1.6594169000000e+00\r\n1668 2772 -2.9304664000000e+00\r\n2724 2772 -2.9471445000000e+00\r\n2767 2772  2.5515148000000e+01\r\n2768 2772 -4.1329672000000e+00\r\n2769 2772 -2.9644990000000e+00\r\n2770 2772 -3.5367293000000e+02\r\n2771 2772  5.4708381000000e+01\r\n2772 2772  1.4772502000000e+01\r\n2775 2772 -2.9637219000000e+00\r\n2818 2772  3.4204370000000e+01\r\n2819 2772 -5.5404554000000e+00\r\n2820 2772 -2.9560952000000e+00\r\n1669 2773 -1.1345264000000e-03\r\n1671 2773 -1.1840431000000e-05\r\n2725 2773 -1.0832977000000e-03\r\n2727 2773 -1.1305784000000e-05\r\n2770 2773 -1.5298635000000e-01\r\n2772 2773 -1.1898740000000e-05\r\n2773 2773  2.9249952000000e+02\r\n2775 2773  7.4248403000000e-04\r\n2776 2773 -1.1102413000000e-03\r\n2778 2773 -1.1586981000000e-05\r\n2821 2773 -8.7072756000000e-02\r\n2823 2773 -1.1875363000000e-05\r\n1669 2774  3.3681829000000e+00\r\n1671 2774 -1.7329727000000e+00\r\n2727 2774 -1.7439346000000e+00\r\n2770 2774  1.2407653000000e+01\r\n2772 2774 -1.7532679000000e+00\r\n2773 2774 -2.0133903000000e+02\r\n2774 2774 -5.5733785000000e+01\r\n2775 2774  8.7217496000000e+00\r\n2778 2774 -1.7353310000000e+00\r\n2821 2774  1.7722819000000e+01\r\n2823 2774 -1.7499893000000e+00\r\n1669 2775  5.6935723000000e+00\r\n1670 2775 -9.2226603000000e-01\r\n1671 2775 -2.9294150000000e+00\r\n2727 2775 -2.9479454000000e+00\r\n2770 2775  2.0973881000000e+01\r\n2771 2775 -3.3974275000000e+00\r\n2772 2775 -2.9637219000000e+00\r\n2773 2775 -3.4034325000000e+02\r\n2774 2775  5.2558623000000e+01\r\n2775 2775  1.4743237000000e+01\r\n2778 2775 -2.9334035000000e+00\r\n2821 2775  2.9958631000000e+01\r\n2822 2775 -4.8528105000000e+00\r\n2823 2775 -2.9581798000000e+00\r\n1672 2776 -1.1357195000000e-03\r\n1674 2776 -1.1852882000000e-05\r\n2728 2776 -1.0374725000000e-03\r\n2730 2776 -1.0827533000000e-05\r\n2773 2776 -1.2009796000000e-01\r\n2775 2776 -1.1586981000000e-05\r\n2776 2776  2.8658158000000e+02\r\n2778 2776  7.1611912000000e-04\r\n2824 2776 -4.8588756000000e-02\r\n2826 2776 -1.1565613000000e-05\r\n1672 2777  2.2946266000000e+00\r\n1674 2777 -1.7671616000000e+00\r\n2730 2777 -1.6922940000000e+00\r\n2773 2777  8.0019043000000e+00\r\n2775 2777 -1.7353310000000e+00\r\n2776 2777 -1.8742792000000e+02\r\n2777 2777 -5.4619660000000e+01\r\n2778 2777  6.9332076000000e+00\r\n2824 2777  1.2648323000000e+01\r\n2826 2777 -1.7322918000000e+00\r\n1672 2778  3.8788368000000e+00\r\n1673 2778 -6.2831477000000e-01\r\n1674 2778 -2.9872100000000e+00\r\n2730 2778 -2.8606537000000e+00\r\n2773 2778  1.3526419000000e+01\r\n2774 2778 -2.1910817000000e+00\r\n2775 2778 -2.9334035000000e+00\r\n2776 2778 -3.1682815000000e+02\r\n2777 2778  4.8800221000000e+01\r\n2778 2778  1.1719894000000e+01\r\n2824 2778  2.1380725000000e+01\r\n2825 2778 -3.4633644000000e+00\r\n2826 2778 -2.9282661000000e+00\r\n2779 2779  1.0000000000000e+00\r\n2780 2780  1.0000000000000e+00\r\n2781 2781  1.0000000000000e+00\r\n2782 2782  1.0000000000000e+00\r\n2783 2783  1.0000000000000e+00\r\n2784 2784  1.0000000000000e+00\r\n2785 2785  1.0000000000000e+00\r\n2786 2786  1.0000000000000e+00\r\n2787 2787  1.0000000000000e+00\r\n2788 2788  1.0000000000000e+00\r\n2789 2789  1.0000000000000e+00\r\n2790 2790  1.0000000000000e+00\r\n2791 2791  1.0000000000000e+00\r\n2792 2792  1.0000000000000e+00\r\n2793 2793  1.0000000000000e+00\r\n1690 2794 -2.6367206000000e-03\r\n1692 2794 -2.7518009000000e-05\r\n2794 2794  1.1691798000000e+02\r\n2796 2794  3.1040631000000e-04\r\n2797 2794 -1.5879240000000e-02\r\n2799 2794 -4.8749114000000e-06\r\n2842 2794 -4.2567276000000e-04\r\n2844 2794 -4.4425135000000e-06\r\n1690 2795  3.0894644000000e-01\r\n1692 2795 -4.3198103000000e+00\r\n2794 2795 -6.9421330000000e+01\r\n2795 2795 -2.2297074000000e+01\r\n2796 2795  5.7891290000000e+00\r\n2797 2795  1.9807205000000e+00\r\n2799 2795 -7.6539824000000e-01\r\n2844 2795 -7.0141742000000e-01\r\n1690 2796  5.2224306000000e-01\r\n1691 2796 -8.4598286000000e-02\r\n1692 2796 -7.3022073000000e+00\r\n2794 2796 -1.1734982000000e+02\r\n2795 2796  1.7972447000000e+01\r\n2796 2796  9.7859437000000e+00\r\n2797 2796  3.3482100000000e+00\r\n2798 2796 -5.4237739000000e-01\r\n2799 2796 -1.2938292000000e+00\r\n2844 2796 -1.1856760000000e+00\r\n1693 2797 -2.2213481000000e-03\r\n1695 2797 -2.3182994000000e-05\r\n2749 2797 -5.4132940000000e-04\r\n2751 2797 -5.6495585000000e-06\r\n2794 2797 -4.6710426000000e-04\r\n2796 2797 -4.8749114000000e-06\r\n2797 2797  1.4034169000000e+02\r\n2799 2797  3.7264749000000e-04\r\n2800 2797 -6.1160249000000e-02\r\n2802 2797 -5.7321406000000e-06\r\n2845 2797 -4.7157255000000e-04\r\n2847 2797 -4.9215445000000e-06\r\n1693 2798  5.3417080000000e-01\r\n1695 2798 -3.6029813000000e+00\r\n2751 2798 -8.9027329000000e-01\r\n2796 2798 -7.6539824000000e-01\r\n2797 2798 -8.7160026000000e+01\r\n2798 2798 -2.6758321000000e+01\r\n2799 2798  6.9178904000000e+00\r\n2800 2798  5.8331968000000e+00\r\n2802 2798 -8.9151591000000e-01\r\n2845 2798  2.3724452000000e-01\r\n2847 2798 -7.6471706000000e-01\r\n1693 2799  9.0296180000000e-01\r\n1694 2799 -1.4627021000000e-01\r\n1695 2799 -6.0904761000000e+00\r\n2751 2799 -1.5049169000000e+00\r\n2796 2799 -1.2938292000000e+00\r\n2797 2799 -1.4733522000000e+02\r\n2798 2799  2.2617766000000e+01\r\n2799 2799  1.1693996000000e+01\r\n2800 2799  9.8604302000000e+00\r\n2801 2799 -1.5972850000000e+00\r\n2802 2799 -1.5070176000000e+00\r\n2845 2799  4.0103791000000e-01\r\n2846 2799 -6.4963886000000e-02\r\n2847 2799 -1.2926770000000e+00\r\n1696 2800 -2.0249245000000e-03\r\n1698 2800 -2.1133029000000e-05\r\n2752 2800 -6.1503657000000e-04\r\n2754 2800 -6.4187999000000e-06\r\n2797 2800 -5.4924225000000e-04\r\n2799 2800 -5.7321406000000e-06\r\n2800 2800  1.5792382000000e+02\r\n2802 2800  4.1507500000000e-04\r\n2803 2800 -1.1209667000000e-01\r\n2805 2800 -6.5647585000000e-06\r\n2848 2800 -5.6517062000000e-04\r\n2850 2800 -5.8983763000000e-06\r\n1696 2801  1.2295079000000e+00\r\n1698 2801 -3.2050468000000e+00\r\n2754 2801 -9.9499262000000e-01\r\n2799 2801 -8.9151591000000e-01\r\n2800 2801 -1.0373876000000e+02\r\n2801 2801 -3.0106230000000e+01\r\n2802 2801  6.9820971000000e+00\r\n2803 2801  1.0342836000000e+01\r\n2805 2801 -9.9693289000000e-01\r\n2848 2801  1.5461141000000e+00\r\n2850 2801 -8.9022740000000e-01\r\n1696 2802  2.0783602000000e+00\r\n1697 2802 -3.3666692000000e-01\r\n1698 2802 -5.4178110000000e+00\r\n2754 2802 -1.6819355000000e+00\r\n2799 2802 -1.5070176000000e+00\r\n2800 2802 -1.7536000000000e+02\r\n2801 2802  2.6993128000000e+01\r\n2802 2802  1.1802536000000e+01\r\n2803 2802  1.7483529000000e+01\r\n2804 2802 -2.8321010000000e+00\r\n2805 2802 -1.6852153000000e+00\r\n2848 2802  2.6135512000000e+00\r\n2849 2802 -4.2336080000000e-01\r\n2850 2802 -1.5048404000000e+00\r\n1699 2803 -1.8954089000000e-03\r\n1701 2803 -1.9781345000000e-05\r\n2755 2803 -7.0959196000000e-04\r\n2757 2803 -7.4056227000000e-06\r\n2800 2803 -6.2902203000000e-04\r\n2802 2803 -6.5647585000000e-06\r\n2803 2803  1.7552542000000e+02\r\n2805 2803  4.5895273000000e-04\r\n2806 2803 -1.8490299000000e-01\r\n2808 2803 -7.8425031000000e-06\r\n2851 2803 -6.6915747000000e-04\r\n2853 2803 -6.9836301000000e-06\r\n1699 2804  3.4299646000000e+00\r\n1701 2804 -2.8841868000000e+00\r\n2757 2804 -1.1156610000000e+00\r\n2802 2804 -9.9693289000000e-01\r\n2803 2804 -1.2191790000000e+02\r\n2804 2804 -3.3456331000000e+01\r\n2805 2804  7.1631975000000e+00\r\n2806 2804  1.5575259000000e+01\r\n2808 2804 -1.1479232000000e+00\r\n2851 2804  2.2306585000000e+00\r\n2853 2804 -1.0147341000000e+00\r\n1699 2805  5.7980083000000e+00\r\n1700 2805 -9.3917852000000e-01\r\n1701 2805 -4.8754260000000e+00\r\n2757 2805 -1.8859120000000e+00\r\n2802 2805 -1.6852153000000e+00\r\n2803 2805 -2.0608989000000e+02\r\n2804 2805  3.1800895000000e+01\r\n2805 2805  1.2108662000000e+01\r\n2806 2805  2.6328400000000e+01\r\n2807 2805 -4.2647520000000e+00\r\n2808 2805 -1.9404481000000e+00\r\n2851 2805  3.7707026000000e+00\r\n2852 2805 -6.1078954000000e-01\r\n2853 2805 -1.7153054000000e+00\r\n1702 2806 -3.7829768000000e-02\r\n1704 2806 -1.7202053000000e-05\r\n2758 2806 -8.5263341000000e-04\r\n2760 2806 -8.8984680000000e-06\r\n2803 2806 -7.5145296000000e-04\r\n2805 2806 -7.8425031000000e-06\r\n2806 2806  2.1068091000000e+02\r\n2808 2806  5.4456009000000e-04\r\n2809 2806 -2.4297827000000e-01\r\n2811 2806 -9.6193652000000e-06\r\n2854 2806 -8.1726223000000e-04\r\n2856 2806 -8.5293184000000e-06\r\n1702 2807  8.7724127000000e+00\r\n1704 2807 -2.4047730000000e+00\r\n2760 2807 -1.2917639000000e+00\r\n2805 2807 -1.1479232000000e+00\r\n2806 2807 -1.5312802000000e+02\r\n2807 2807 -4.0153071000000e+01\r\n2808 2807  7.3802059000000e+00\r\n2809 2807  2.1768511000000e+01\r\n2811 2807 -1.3447723000000e+00\r\n2854 2807  1.7769103000000e+00\r\n2856 2807 -1.1864595000000e+00\r\n1702 2808  1.4828886000000e+01\r\n1703 2808 -2.4019494000000e+00\r\n1704 2808 -4.0650283000000e+00\r\n2760 2808 -2.1835977000000e+00\r\n2805 2808 -1.9404481000000e+00\r\n2806 2808 -2.5884760000000e+02\r\n2807 2808  4.0015170000000e+01\r\n2808 2808  1.2475499000000e+01\r\n2809 2808  3.6797491000000e+01\r\n2810 2808 -5.9603741000000e+00\r\n2811 2808 -2.2732032000000e+00\r\n2854 2808  3.0036892000000e+00\r\n2855 2808 -4.8653076000000e-01\r\n2856 2808 -2.0055911000000e+00\r\n1705 2809 -1.5567512000000e-01\r\n1707 2809 -1.5921633000000e-05\r\n2761 2809 -1.0161471000000e-03\r\n2763 2809 -1.0604971000000e-05\r\n2806 2809 -9.2170833000000e-04\r\n2808 2809 -9.6193652000000e-06\r\n2809 2809  2.4012212000000e+02\r\n2811 2809  6.1893949000000e-04\r\n2812 2809 -3.5472890000000e-01\r\n2814 2809 -1.1694541000000e-05\r\n2857 2809 -9.7819414000000e-04\r\n2859 2809 -1.0208877000000e-05\r\n1705 2810  2.0388768000000e+01\r\n1707 2810 -2.1123227000000e+00\r\n2763 2810 -1.4845134000000e+00\r\n2808 2810 -1.3447723000000e+00\r\n2809 2810 -1.8900300000000e+02\r\n2810 2810 -4.5739429000000e+01\r\n2811 2810  7.8605356000000e+00\r\n2812 2810  3.1038869000000e+01\r\n2814 2810 -1.5515063000000e+00\r\n2859 2810 -1.3622756000000e+00\r\n1705 2811  3.4465149000000e+01\r\n1706 2811 -5.5823791000000e+00\r\n1707 2811 -3.5706677000000e+00\r\n2763 2811 -2.5094197000000e+00\r\n2808 2811 -2.2732032000000e+00\r\n2809 2811 -3.1949044000000e+02\r\n2810 2811  4.9546697000000e+01\r\n2811 2811  1.3287442000000e+01\r\n2812 2811  5.2468065000000e+01\r\n2813 2811 -8.4983418000000e+00\r\n2814 2811 -2.6226644000000e+00\r\n2859 2811 -2.3027894000000e+00\r\n1708 2812 -2.9914070000000e-01\r\n1710 2812 -1.4448644000000e-05\r\n2764 2812 -1.2009430000000e-03\r\n2766 2812 -1.2533584000000e-05\r\n2809 2812 -1.1205475000000e-03\r\n2811 2812 -1.1694541000000e-05\r\n2812 2812  2.8189826000000e+02\r\n2814 2812  7.2416564000000e-04\r\n2815 2812 -1.2390640000000e-03\r\n2817 2812 -1.2931432000000e-05\r\n2860 2812 -1.1974085000000e-03\r\n2862 2812 -1.2496697000000e-05\r\n1708 2813  3.4530089000000e+01\r\n1710 2813 -1.8034786000000e+00\r\n2766 2813 -1.7115905000000e+00\r\n2811 2813 -1.5515063000000e+00\r\n2812 2813 -3.0295866000000e+02\r\n2813 2813 -5.3561180000000e+01\r\n2814 2813  8.8391322000000e+00\r\n2817 2813 -1.7187497000000e+00\r\n2862 2813 -1.6266867000000e+00\r\n1708 2814  5.8369661000000e+01\r\n1709 2814 -9.4537851000000e+00\r\n1710 2814 -3.0486002000000e+00\r\n2766 2814 -2.8932726000000e+00\r\n2811 2814 -2.6226644000000e+00\r\n2812 2814 -5.1212130000000e+02\r\n2813 2814  8.0335994000000e+01\r\n2814 2814  1.4941665000000e+01\r\n2817 2814 -2.9053725000000e+00\r\n2862 2814 -2.7497511000000e+00\r\n1711 2815 -1.2091038000000e-01\r\n1713 2815 -1.3024193000000e-05\r\n2767 2815 -1.1994854000000e-03\r\n2769 2815 -1.2518373000000e-05\r\n2812 2815 -3.5400654000000e-01\r\n2814 2815 -1.2931432000000e-05\r\n2815 2815  2.9269180000000e+02\r\n2817 2815  7.4833530000000e-04\r\n2818 2815 -1.2151085000000e-03\r\n2820 2815 -1.2681422000000e-05\r\n2863 2815 -1.2612720000000e-03\r\n2865 2815 -1.3163206000000e-05\r\n1711 2816  1.6989522000000e+01\r\n1713 2816 -1.7310373000000e+00\r\n2769 2816 -1.7487497000000e+00\r\n2812 2816  3.5445146000000e+01\r\n2814 2816 -1.7187497000000e+00\r\n2815 2816 -2.2021925000000e+02\r\n2816 2816 -5.5772693000000e+01\r\n2817 2816  8.7103667000000e+00\r\n2820 2816 -1.7542574000000e+00\r\n2865 2816 -1.7513011000000e+00\r\n1711 2817  2.8719068000000e+01\r\n1712 2817 -4.6516829000000e+00\r\n1713 2817 -2.9261433000000e+00\r\n2769 2817 -2.9560846000000e+00\r\n2812 2817  5.9916433000000e+01\r\n2813 2817 -9.7047802000000e+00\r\n2814 2817 -2.9053725000000e+00\r\n2815 2817 -3.7225837000000e+02\r\n2816 2817  5.7627715000000e+01\r\n2817 2817  1.4723995000000e+01\r\n2820 2817 -2.9653966000000e+00\r\n2865 2817 -2.9603970000000e+00\r\n1714 2818 -2.9539221000000e-02\r\n1716 2818 -1.2519425000000e-05\r\n2770 2818 -1.1653689000000e-03\r\n2772 2818 -1.2162317000000e-05\r\n2815 2818 -2.2278842000000e-01\r\n2817 2818 -1.2681422000000e-05\r\n2818 2818  2.9248278000000e+02\r\n2820 2818  7.4634292000000e-04\r\n2821 2818 -1.1808282000000e-03\r\n2823 2818 -1.2323657000000e-05\r\n2866 2818 -1.7655237000000e-03\r\n2868 2818 -1.2658465000000e-05\r\n1714 2819  8.0014028000000e+00\r\n1716 2819 -1.7318408000000e+00\r\n2772 2819 -1.7487549000000e+00\r\n2815 2819  2.1807030000000e+01\r\n2817 2819 -1.7542574000000e+00\r\n2818 2819 -2.0609693000000e+02\r\n2819 2819 -5.5761113000000e+01\r\n2820 2819  8.7461764000000e+00\r\n2823 2819 -1.7539435000000e+00\r\n2866 2819  8.4869924000000e+00\r\n2868 2819 -1.7511135000000e+00\r\n1714 2820  1.3525571000000e+01\r\n1715 2820 -2.1908251000000e+00\r\n1716 2820 -2.9275037000000e+00\r\n2772 2820 -2.9560952000000e+00\r\n2815 2820  3.6862603000000e+01\r\n2816 2820 -5.9708767000000e+00\r\n2817 2820 -2.9653966000000e+00\r\n2818 2820 -3.4838625000000e+02\r\n2819 2820  5.3791450000000e+01\r\n2820 2820  1.4784534000000e+01\r\n2823 2820 -2.9648641000000e+00\r\n2866 2820  1.4346412000000e+01\r\n2867 2820 -2.3237821000000e+00\r\n2868 2820 -2.9600823000000e+00\r\n1717 2821 -1.1745151000000e-03\r\n1719 2821 -1.2257771000000e-05\r\n2773 2821 -1.1378735000000e-03\r\n2775 2821 -1.1875363000000e-05\r\n2818 2821 -1.7018751000000e-01\r\n2820 2821 -1.2323657000000e-05\r\n2821 2821  2.9248926000000e+02\r\n2823 2821  7.4475699000000e-04\r\n2824 2821 -1.1509821000000e-03\r\n2826 2821 -1.2012170000000e-05\r\n2869 2821 -8.2800114000000e-02\r\n2871 2821 -1.2305913000000e-05\r\n1717 2822  4.1569139000000e+00\r\n1719 2822 -1.7304186000000e+00\r\n2775 2822 -1.7499893000000e+00\r\n2818 2822  1.4942885000000e+01\r\n2820 2822 -1.7539435000000e+00\r\n2821 2822 -2.0168972000000e+02\r\n2822 2822 -5.5755356000000e+01\r\n2823 2822  8.7459120000000e+00\r\n2826 2822 -1.7537806000000e+00\r\n2869 2822  1.4779875000000e+01\r\n2871 2822 -1.7515163000000e+00\r\n1717 2823  7.0268425000000e+00\r\n1718 2823 -1.1382070000000e+00\r\n1719 2823 -2.9250977000000e+00\r\n2775 2823 -2.9581798000000e+00\r\n2818 2823  2.5259436000000e+01\r\n2819 2823 -4.0915200000000e+00\r\n2820 2823 -2.9648641000000e+00\r\n2821 2823 -3.4093608000000e+02\r\n2822 2823  5.2600284000000e+01\r\n2823 2823  1.4784082000000e+01\r\n2826 2823 -2.9645908000000e+00\r\n2869 2823  2.4983885000000e+01\r\n2870 2823 -4.0468861000000e+00\r\n2871 2823 -2.9607612000000e+00\r\n1720 2824 -1.1424362000000e-03\r\n1722 2824 -1.1922981000000e-05\r\n2776 2824 -1.1081939000000e-03\r\n2778 2824 -1.1565613000000e-05\r\n2821 2824 -1.5942759000000e-01\r\n2823 2824 -1.2012170000000e-05\r\n2824 2824  2.9239877000000e+02\r\n2826 2824  7.1946840000000e-04\r\n1720 2825  2.6606893000000e+00\r\n1722 2825 -1.7316662000000e+00\r\n2778 2825 -1.7322918000000e+00\r\n2821 2825  1.3042016000000e+01\r\n2823 2825 -1.7537806000000e+00\r\n2824 2825 -1.8351822000000e+02\r\n2825 2825 -5.5751694000000e+01\r\n2826 2825  5.2240006000000e+00\r\n1720 2826  4.4976292000000e+00\r\n1721 2826 -7.2853764000000e-01\r\n1722 2826 -2.9272085000000e+00\r\n2778 2826 -2.9282661000000e+00\r\n2821 2826  2.2046224000000e+01\r\n2822 2826 -3.5711044000000e+00\r\n2823 2826 -2.9645908000000e+00\r\n2824 2826 -3.1021919000000e+02\r\n2825 2826  4.7634733000000e+01\r\n2826 2826  8.8306505000000e+00\r\n2827 2827  1.0000000000000e+00\r\n2828 2828  1.0000000000000e+00\r\n2829 2829  1.0000000000000e+00\r\n2830 2830  1.0000000000000e+00\r\n2831 2831  1.0000000000000e+00\r\n2832 2832  1.0000000000000e+00\r\n2833 2833  1.0000000000000e+00\r\n2834 2834  1.0000000000000e+00\r\n2835 2835  1.0000000000000e+00\r\n2836 2836  1.0000000000000e+00\r\n2837 2837  1.0000000000000e+00\r\n2838 2838  1.0000000000000e+00\r\n2839 2839  1.0000000000000e+00\r\n2840 2840  1.0000000000000e+00\r\n2841 2841  1.0000000000000e+00\r\n1738 2842 -2.6228869000000e-03\r\n1740 2842 -2.7373634000000e-05\r\n2794 2842 -2.4738193000000e-02\r\n2796 2842 -4.4425135000000e-06\r\n2842 2842  1.1694008000000e+02\r\n2844 2842  3.1419533000000e-04\r\n2845 2842 -1.4510170000000e-02\r\n2847 2842 -4.4423605000000e-06\r\n2890 2842 -4.1857439000000e-04\r\n2892 2842 -4.3684318000000e-06\r\n1738 2843  2.6728897000000e-01\r\n1740 2843 -4.3215522000000e+00\r\n2794 2843  1.0415918000000e+00\r\n2796 2843 -7.0141742000000e-01\r\n2842 2843 -7.1513262000000e+01\r\n2843 2843 -2.2298278000000e+01\r\n2844 2843  6.4284232000000e+00\r\n2845 2843  3.0743413000000e+00\r\n2847 2843 -7.0143927000000e-01\r\n2892 2843 -7.0151062000000e-01\r\n1738 2844  4.5182528000000e-01\r\n1739 2844 -7.3191547000000e-02\r\n1740 2844 -7.3051519000000e+00\r\n2794 2844  1.7607067000000e+00\r\n2795 2844 -2.8521833000000e-01\r\n2796 2844 -1.1856760000000e+00\r\n2842 2844 -1.2088602000000e+02\r\n2843 2844  1.8542426000000e+01\r\n2844 2844  1.0866607000000e+01\r\n2845 2844  5.1968665000000e+00\r\n2846 2844 -8.4184466000000e-01\r\n2847 2844 -1.1857129000000e+00\r\n2892 2844 -1.1858335000000e+00\r\n1741 2845 -2.6659355000000e-03\r\n1743 2845 -2.7822909000000e-05\r\n2797 2845 -2.7018673000000e-02\r\n2799 2845 -4.9215445000000e-06\r\n2842 2845 -4.2565810000000e-04\r\n2844 2845 -4.4423605000000e-06\r\n2845 2845  1.1698186000000e+02\r\n2847 2845  3.2014905000000e-04\r\n2848 2845 -5.7738694000000e-02\r\n2850 2845 -4.9258151000000e-06\r\n2893 2845 -4.2805601000000e-04\r\n2895 2845 -4.4673862000000e-06\r\n1741 2846  4.3056606000000e-01\r\n1743 2846 -4.3212757000000e+00\r\n2799 2846 -7.6471706000000e-01\r\n2844 2846 -7.0143927000000e-01\r\n2845 2846 -7.3655198000000e+01\r\n2846 2846 -2.2302114000000e+01\r\n2847 2846  7.2568081000000e+00\r\n2848 2846  6.0999914000000e+00\r\n2850 2846 -7.6545108000000e-01\r\n2895 2846 -7.0141963000000e-01\r\n1741 2847  7.2782837000000e-01\r\n1742 2847 -1.1790039000000e-01\r\n1743 2847 -7.3046794000000e+00\r\n2799 2847 -1.2926770000000e+00\r\n2844 2847 -1.1857129000000e+00\r\n2845 2847 -1.2450666000000e+02\r\n2846 2847  1.9119340000000e+01\r\n2847 2847  1.2266901000000e+01\r\n2848 2847  1.0311418000000e+01\r\n2849 2847 -1.6703392000000e+00\r\n2850 2847 -1.2939176000000e+00\r\n2895 2847 -1.1856792000000e+00\r\n1744 2848 -2.2890448000000e-03\r\n1746 2848 -2.3889507000000e-05\r\n2800 2848 -2.5381719000000e-02\r\n2802 2848 -5.8983763000000e-06\r\n2845 2848 -4.7198175000000e-04\r\n2847 2848 -4.9258151000000e-06\r\n2848 2848  1.4040886000000e+02\r\n2850 2848  3.7403923000000e-04\r\n2851 2848 -1.1256435000000e-01\r\n2853 2848 -6.0074212000000e-06\r\n2896 2848 -4.8193290000000e-04\r\n2898 2848 -5.0296698000000e-06\r\n1744 2849  9.5493991000000e-01\r\n1746 2849 -3.6027696000000e+00\r\n2802 2849 -8.9022740000000e-01\r\n2847 2849 -7.6545108000000e-01\r\n2848 2849 -9.1323808000000e+01\r\n2849 2849 -2.6766776000000e+01\r\n2850 2849  6.9332679000000e+00\r\n2851 2849  9.8254101000000e+00\r\n2853 2849 -9.0677263000000e-01\r\n2898 2849 -7.6503890000000e-01\r\n1744 2850  1.6142304000000e+00\r\n1745 2850 -2.6148297000000e-01\r\n1746 2850 -6.0901217000000e+00\r\n2802 2850 -1.5048404000000e+00\r\n2847 2850 -1.2939176000000e+00\r\n2848 2850 -1.5437376000000e+02\r\n2849 2850  2.3736591000000e+01\r\n2850 2850  1.1719995000000e+01\r\n2851 2850  1.6608873000000e+01\r\n2852 2850 -2.6904074000000e+00\r\n2853 2850 -1.5328084000000e+00\r\n2898 2850 -1.2932218000000e+00\r\n1747 2851 -2.0436630000000e-03\r\n1749 2851 -2.1328591000000e-05\r\n2803 2851 -1.7076097000000e-02\r\n2805 2851 -6.9836301000000e-06\r\n2848 2851 -5.7561908000000e-04\r\n2850 2851 -6.0074212000000e-06\r\n2851 2851  1.6381310000000e+02\r\n2853 2851  4.3085910000000e-04\r\n2854 2851 -1.5171947000000e-01\r\n2856 2851 -7.2108945000000e-06\r\n2899 2851 -6.0504245000000e-04\r\n2901 2851 -6.3144968000000e-06\r\n1747 2852  2.5176735000000e+00\r\n1749 2852 -3.0900922000000e+00\r\n2805 2852 -1.0147341000000e+00\r\n2850 2852 -9.0677263000000e-01\r\n2851 2852 -1.0996184000000e+02\r\n2852 2852 -3.1231894000000e+01\r\n2853 2852  6.9879250000000e+00\r\n2854 2852  1.3482684000000e+01\r\n2856 2852 -1.0478604000000e+00\r\n2901 2852 -9.2495411000000e-01\r\n1747 2853  4.2558728000000e+00\r\n1748 2853 -6.8937538000000e-01\r\n1749 2853 -5.2234888000000e+00\r\n2805 2853 -1.7153054000000e+00\r\n2850 2853 -1.5328084000000e+00\r\n2851 2853 -1.8587939000000e+02\r\n2852 2853  2.8617763000000e+01\r\n2853 2853  1.1812382000000e+01\r\n2854 2853  2.2791115000000e+01\r\n2855 2853 -3.6917533000000e+00\r\n2856 2853 -1.7713021000000e+00\r\n2901 2853 -1.5635414000000e+00\r\n1750 2854 -1.4069406000000e-02\r\n1752 2854 -1.9443328000000e-05\r\n2806 2854 -3.9305704000000e-02\r\n2808 2854 -8.5293184000000e-06\r\n2851 2854 -6.9093349000000e-04\r\n2853 2854 -7.2108945000000e-06\r\n2854 2854  1.8724325000000e+02\r\n2856 2854  4.8926994000000e-04\r\n2857 2854 -1.7655716000000e-01\r\n2859 2854 -8.6535764000000e-06\r\n2902 2854 -7.3661529000000e-04\r\n2904 2854 -7.6876504000000e-06\r\n1750 2855  6.4125036000000e+00\r\n1752 2855 -2.7048907000000e+00\r\n2808 2855 -1.1864595000000e+00\r\n2853 2855 -1.0478604000000e+00\r\n2854 2855 -1.2924567000000e+02\r\n2855 2855 -3.5699346000000e+01\r\n2856 2855  7.2317654000000e+00\r\n2857 2855  1.5457157000000e+01\r\n2859 2855 -1.2038711000000e+00\r\n2904 2855 -1.0846679000000e+00\r\n1750 2856  1.0839696000000e+01\r\n1751 2856 -1.7557832000000e+00\r\n1752 2856 -4.5723473000000e+00\r\n2808 2856 -2.0055911000000e+00\r\n2853 2856 -1.7713021000000e+00\r\n2854 2856 -2.1847689000000e+02\r\n2855 2856  3.3669408000000e+01\r\n2856 2856  1.2224575000000e+01\r\n2857 2856  2.6128778000000e+01\r\n2858 2856 -4.2322654000000e+00\r\n2859 2856 -2.0350237000000e+00\r\n2904 2856 -1.8335227000000e+00\r\n1753 2857 -8.5146637000000e-02\r\n1755 2857 -1.7534446000000e-05\r\n2809 2857 -9.1496839000000e-02\r\n2811 2857 -1.0208877000000e-05\r\n2854 2857 -8.2916838000000e-04\r\n2856 2857 -8.6535764000000e-06\r\n2857 2857  2.1655768000000e+02\r\n2859 2857  5.6258459000000e-04\r\n2860 2857 -1.5399105000000e-01\r\n2862 2857 -1.0675720000000e-05\r\n2905 2857 -8.9608978000000e-04\r\n2907 2857 -9.3519983000000e-06\r\n1753 2858  1.3430198000000e+01\r\n1755 2858 -2.3400367000000e+00\r\n2809 2858  2.5196135000000e+00\r\n2811 2858 -1.3622756000000e+00\r\n2856 2858 -1.2038711000000e+00\r\n2857 2858 -1.5139205000000e+02\r\n2858 2858 -4.1283654000000e+01\r\n2859 2858  7.6138360000000e+00\r\n2860 2858  1.1298069000000e+01\r\n2862 2858 -1.4246489000000e+00\r\n2907 2858 -1.2783576000000e+00\r\n1753 2859  2.2702394000000e+01\r\n1754 2859 -3.6771606000000e+00\r\n1755 2859 -3.9555957000000e+00\r\n2809 2859  4.2591523000000e+00\r\n2810 2859 -6.8986500000000e-01\r\n2811 2859 -2.3027894000000e+00\r\n2856 2859 -2.0350237000000e+00\r\n2857 2859 -2.5591297000000e+02\r\n2858 2859  3.9447704000000e+01\r\n2859 2859  1.2870422000000e+01\r\n2860 2859  1.9098244000000e+01\r\n2861 2859 -3.0933880000000e+00\r\n2862 2859 -2.4082250000000e+00\r\n2907 2859 -2.1609341000000e+00\r\n1756 2860 -1.3871496000000e-01\r\n1758 2860 -1.4779451000000e-05\r\n2812 2860 -3.0534456000000e-01\r\n2814 2860 -1.2496697000000e-05\r\n2857 2860 -1.0229261000000e-03\r\n2859 2860 -1.0675720000000e-05\r\n2860 2860  2.6342252000000e+02\r\n2862 2860  6.7765910000000e-04\r\n2863 2860 -1.1970207000000e-03\r\n2865 2860 -1.2492650000000e-05\r\n2908 2860 -1.1113436000000e-03\r\n2910 2860 -1.1598485000000e-05\r\n1756 2861  1.8730508000000e+01\r\n1758 2861 -1.9239522000000e+00\r\n2812 2861  2.2650621000000e+01\r\n2814 2861 -1.6266867000000e+00\r\n2859 2861 -1.4246489000000e+00\r\n2860 2861 -1.9236509000000e+02\r\n2861 2861 -5.0211097000000e+01\r\n2862 2861  8.2011099000000e+00\r\n2865 2861 -1.6622378000000e+00\r\n2910 2861 -1.5579331000000e+00\r\n1756 2862  3.1662050000000e+01\r\n1757 2862 -5.1282795000000e+00\r\n1758 2862 -3.2522488000000e+00\r\n2812 2862  3.8288610000000e+01\r\n2813 2862 -6.2015787000000e+00\r\n2814 2862 -2.7497511000000e+00\r\n2859 2862 -2.4082250000000e+00\r\n2860 2862 -3.2517394000000e+02\r\n2861 2862  5.0228609000000e+01\r\n2862 2862  1.3863152000000e+01\r\n2865 2862 -2.8098445000000e+00\r\n2910 2862 -2.6335301000000e+00\r\n1759 2863 -6.1195760000000e-02\r\n1761 2863 -1.3005170000000e-05\r\n2815 2863 -8.4129370000000e-02\r\n2817 2863 -1.3163206000000e-05\r\n2860 2863 -1.1019069000000e-01\r\n2862 2863 -1.2492650000000e-05\r\n2863 2863  2.9246116000000e+02\r\n2865 2863  7.4854041000000e-04\r\n2866 2863 -1.2344464000000e-03\r\n2868 2863 -1.2883241000000e-05\r\n2911 2863 -1.2445215000000e-03\r\n2913 2863 -1.2988390000000e-05\r\n1759 2864  1.1111017000000e+01\r\n1761 2864 -1.7304764000000e+00\r\n2815 2864  5.6564743000000e-01\r\n2817 2864 -1.7513011000000e+00\r\n2860 2864  1.1669962000000e+01\r\n2862 2864 -1.6622378000000e+00\r\n2863 2864 -1.9111799000000e+02\r\n2864 2864 -5.5782280000000e+01\r\n2865 2864  8.6562392000000e+00\r\n2868 2864 -1.7545128000000e+00\r\n2913 2864 -1.7514355000000e+00\r\n1759 2865  1.8782047000000e+01\r\n1760 2865 -3.0421668000000e+00\r\n1761 2865 -2.9251949000000e+00\r\n2815 2865  9.5616964000000e-01\r\n2816 2865 -1.5487277000000e-01\r\n2817 2865 -2.9603970000000e+00\r\n2860 2865  1.9726888000000e+01\r\n2861 2865 -3.1952047000000e+00\r\n2862 2865 -2.8098445000000e+00\r\n2863 2865 -3.2306559000000e+02\r\n2864 2865  4.9636495000000e+01\r\n2865 2865  1.4632498000000e+01\r\n2868 2865 -2.9658283000000e+00\r\n2913 2865 -2.9606246000000e+00\r\n1762 2866 -1.3869516000000e-02\r\n1764 2866 -1.2700715000000e-05\r\n2818 2866 -1.2129088000000e-03\r\n2820 2866 -1.2658465000000e-05\r\n2863 2866 -1.3924076000000e-01\r\n2865 2866 -1.2883241000000e-05\r\n2866 2866  2.9236641000000e+02\r\n2868 2866  7.4779983000000e-04\r\n2869 2866 -1.2146362000000e-03\r\n2871 2866 -1.2676493000000e-05\r\n2914 2866 -1.2346491000000e-03\r\n2916 2866 -1.2885356000000e-05\r\n1762 2867  6.4520954000000e+00\r\n1764 2867 -1.7296952000000e+00\r\n2820 2867 -1.7511135000000e+00\r\n2863 2867  1.2739216000000e+01\r\n2865 2867 -1.7545128000000e+00\r\n2866 2867 -1.8808195000000e+02\r\n2867 2867 -5.5776604000000e+01\r\n2868 2867  8.7473522000000e+00\r\n2871 2867 -1.7544652000000e+00\r\n2914 2867  1.1109602000000e+00\r\n2916 2867 -1.7512923000000e+00\r\n1762 2868  1.0906622000000e+01\r\n1763 2868 -1.7665969000000e+00\r\n1764 2868 -2.9238767000000e+00\r\n2820 2868 -2.9600823000000e+00\r\n2863 2868  2.1534371000000e+01\r\n2864 2868 -3.4880233000000e+00\r\n2865 2868 -2.9658283000000e+00\r\n2866 2868 -3.1793373000000e+02\r\n2867 2868  4.8820171000000e+01\r\n2868 2868  1.4786522000000e+01\r\n2871 2868 -2.9657462000000e+00\r\n2914 2868  1.8779672000000e+00\r\n2915 2868 -3.0418317000000e-01\r\n2916 2868 -2.9603845000000e+00\r\n1765 2869 -1.2076586000000e-03\r\n1767 2869 -1.2603672000000e-05\r\n2821 2869 -1.1791280000000e-03\r\n2823 2869 -1.2305913000000e-05\r\n2866 2869 -8.9047699000000e-02\r\n2868 2869 -1.2676493000000e-05\r\n2869 2869  2.9230729000000e+02\r\n2871 2869  7.3435172000000e-04\r\n2917 2869 -1.2243854000000e-03\r\n2919 2869 -1.2778240000000e-05\r\n1765 2870  4.1746113000000e+00\r\n1767 2870 -1.7302744000000e+00\r\n2823 2870 -1.7515163000000e+00\r\n2866 2870  8.6450985000000e+00\r\n2868 2870 -1.7544652000000e+00\r\n2869 2870 -1.8572204000000e+02\r\n2870 2870 -5.5771995000000e+01\r\n2871 2870  6.9942460000000e+00\r\n2917 2870  5.1159495000000e+00\r\n2919 2870 -1.7517190000000e+00\r\n1765 2871  7.0567586000000e+00\r\n1766 2871 -1.1430303000000e+00\r\n1767 2871 -2.9248541000000e+00\r\n2823 2871 -2.9607612000000e+00\r\n2866 2871  1.4613665000000e+01\r\n2867 2871 -2.3670729000000e+00\r\n2868 2871 -2.9657462000000e+00\r\n2869 2871 -3.1394434000000e+02\r\n2870 2871  4.8186100000000e+01\r\n2871 2871  1.1823066000000e+01\r\n2917 2871  8.6479957000000e+00\r\n2918 2871 -1.4007736000000e+00\r\n2919 2871 -2.9611039000000e+00\r\n2872 2872  1.0000000000000e+00\r\n2873 2873  1.0000000000000e+00\r\n2874 2874  1.0000000000000e+00\r\n2875 2875  1.0000000000000e+00\r\n2876 2876  1.0000000000000e+00\r\n2877 2877  1.0000000000000e+00\r\n2878 2878  1.0000000000000e+00\r\n2879 2879  1.0000000000000e+00\r\n2880 2880  1.0000000000000e+00\r\n2881 2881  1.0000000000000e+00\r\n2882 2882  1.0000000000000e+00\r\n2883 2883  1.0000000000000e+00\r\n2884 2884  1.0000000000000e+00\r\n2885 2885  1.0000000000000e+00\r\n2886 2886  1.0000000000000e+00\r\n1783 2887 -2.4123184000000e-03\r\n1785 2887 -2.5176046000000e-05\r\n2887 2887  1.2276367000000e+02\r\n2889 2887  3.2155676000000e-04\r\n2890 2887 -1.2450511000000e-02\r\n2892 2887 -4.3893722000000e-06\r\n2935 2887 -4.5507138000000e-04\r\n2937 2887 -4.7493308000000e-06\r\n1783 2888  2.3967335000000e-01\r\n1785 2888 -4.1163478000000e+00\r\n2887 2888 -7.4141000000000e+01\r\n2888 2888 -2.3407988000000e+01\r\n2889 2888  5.6225115000000e+00\r\n2890 2888  3.4073757000000e+00\r\n2892 2888 -7.1792217000000e-01\r\n2937 2888 -7.8561509000000e-01\r\n1783 2889  4.0514354000000e-01\r\n1784 2889 -6.5630999000000e-02\r\n1785 2889 -6.9582695000000e+00\r\n2887 2889 -1.2532787000000e+02\r\n2888 2889  1.9223281000000e+01\r\n2889 2889  9.5042871000000e+00\r\n2890 2889  5.7598242000000e+00\r\n2891 2889 -9.3305935000000e-01\r\n2892 2889 -1.2135748000000e+00\r\n2937 2889 -1.3280030000000e+00\r\n1786 2890 -2.5802613000000e-03\r\n1788 2890 -2.6928775000000e-05\r\n2842 2890 -4.2487643000000e-02\r\n2844 2890 -4.3684318000000e-06\r\n2887 2890 -4.2058086000000e-04\r\n2889 2890 -4.3893722000000e-06\r\n2890 2890  1.1696348000000e+02\r\n2892 2890  3.1802070000000e-04\r\n2893 2890 -1.9335764000000e-02\r\n2895 2890 -4.3661119000000e-06\r\n2938 2890 -4.2194337000000e-04\r\n2940 2890 -4.4035919000000e-06\r\n1786 2891  2.4644381000000e-01\r\n1788 2891 -4.3239533000000e+00\r\n2842 2891  3.1262924000000e+00\r\n2844 2891 -7.0151062000000e-01\r\n2889 2891 -7.1792217000000e-01\r\n2890 2891 -7.4727793000000e+01\r\n2891 2891 -2.2297929000000e+01\r\n2892 2891  7.1655433000000e+00\r\n2893 2891  4.2244279000000e+00\r\n2895 2891 -7.0118328000000e-01\r\n2940 2891 -7.1847045000000e-01\r\n1786 2892  4.1658861000000e-01\r\n1787 2892 -6.7484236000000e-02\r\n1788 2892 -7.3092107000000e+00\r\n2842 2892  5.2846847000000e+00\r\n2843 2892 -8.5607937000000e-01\r\n2844 2892 -1.1858335000000e+00\r\n2889 2892 -1.2135748000000e+00\r\n2890 2892 -1.2631986000000e+02\r\n2891 2892  1.9423783000000e+01\r\n2892 2892  1.2112634000000e+01\r\n2893 2892  7.1409730000000e+00\r\n2894 2892 -1.1567842000000e+00\r\n2895 2892 -1.1852802000000e+00\r\n2940 2892 -1.2145024000000e+00\r\n1789 2893 -2.6372306000000e-03\r\n1791 2893 -2.7523332000000e-05\r\n2845 2893 -3.7647060000000e-02\r\n2847 2893 -4.4673862000000e-06\r\n2890 2893 -4.1835211000000e-04\r\n2892 2893 -4.3661119000000e-06\r\n2893 2893  1.1698538000000e+02\r\n2895 2893  3.1879142000000e-04\r\n2896 2893 -5.1812949000000e-02\r\n2898 2893 -4.4687159000000e-06\r\n2941 2893 -4.2164408000000e-04\r\n2943 2893 -4.4004684000000e-06\r\n1789 2894  3.0979913000000e-01\r\n1791 2894 -4.3203223000000e+00\r\n2845 2894  1.9741084000000e+00\r\n2847 2894 -7.0141963000000e-01\r\n2892 2894 -7.0118328000000e-01\r\n2893 2894 -7.5477566000000e+01\r\n2894 2894 -2.2303262000000e+01\r\n2895 2894  7.1286849000000e+00\r\n2896 2894  6.0705380000000e+00\r\n2898 2894 -7.0168061000000e-01\r\n2943 2894 -7.0157335000000e-01\r\n1789 2895  5.2368419000000e-01\r\n1790 2895 -8.4831764000000e-02\r\n1791 2895 -7.3030692000000e+00\r\n2845 2895  3.3370312000000e+00\r\n2846 2895 -5.4056672000000e-01\r\n2847 2895 -1.1856792000000e+00\r\n2892 2895 -1.1852802000000e+00\r\n2893 2895 -1.2758722000000e+02\r\n2894 2895  1.9615711000000e+01\r\n2895 2895  1.2050324000000e+01\r\n2896 2895  1.0261632000000e+01\r\n2897 2895 -1.6622850000000e+00\r\n2898 2895 -1.1861203000000e+00\r\n2943 2895 -1.1859389000000e+00\r\n1792 2896 -2.7227522000000e-03\r\n1794 2896 -2.8415874000000e-05\r\n2848 2896 -4.2281181000000e-02\r\n2850 2896 -5.0296698000000e-06\r\n2893 2896 -4.2818342000000e-04\r\n2895 2896 -4.4687159000000e-06\r\n2896 2896  1.1702233000000e+02\r\n2898 2896  3.2114696000000e-04\r\n2899 2896 -8.8994729000000e-02\r\n2901 2896 -5.1260958000000e-06\r\n2944 2896 -4.3471186000000e-04\r\n2946 2896 -4.5368496000000e-06\r\n1792 2897  6.2673462000000e-01\r\n1794 2897 -4.3205436000000e+00\r\n2848 2897  1.6309355000000e+00\r\n2850 2897 -7.6503890000000e-01\r\n2895 2897 -7.0168061000000e-01\r\n2896 2897 -7.7644013000000e+01\r\n2897 2897 -2.2307808000000e+01\r\n2898 2897  7.2711835000000e+00\r\n2899 2897  8.2697436000000e+00\r\n2901 2897 -7.7976354000000e-01\r\n2946 2897 -7.0164907000000e-01\r\n1792 2898  1.0594322000000e+00\r\n1793 2898 -1.7161420000000e-01\r\n1794 2898 -7.3034469000000e+00\r\n2848 2898  2.7569334000000e+00\r\n2849 2898 -4.4658727000000e-01\r\n2850 2898 -1.2932218000000e+00\r\n2895 2898 -1.1861203000000e+00\r\n2896 2898 -1.3124944000000e+02\r\n2897 2898  2.0197250000000e+01\r\n2898 2898  1.2291208000000e+01\r\n2899 2898  1.3979175000000e+01\r\n2900 2898 -2.2644440000000e+00\r\n2901 2898 -1.3181123000000e+00\r\n2946 2898 -1.1860676000000e+00\r\n1795 2899 -2.2687455000000e-03\r\n1797 2899 -2.3677654000000e-05\r\n2851 2899 -6.0381371000000e-02\r\n2853 2899 -6.3144968000000e-06\r\n2896 2899 -4.9117225000000e-04\r\n2898 2899 -5.1260958000000e-06\r\n2899 2899  1.4628593000000e+02\r\n2901 2899  3.8911555000000e-04\r\n2902 2899 -1.1778417000000e-01\r\n2904 2899 -6.5322551000000e-06\r\n2947 2899 -5.2642474000000e-04\r\n2949 2899 -5.4940068000000e-06\r\n1795 2900  1.4991793000000e+00\r\n1797 2900 -3.4639961000000e+00\r\n2851 2900  2.1842910000000e+00\r\n2853 2900 -9.2495411000000e-01\r\n2898 2900 -7.7976354000000e-01\r\n2899 2900 -9.8102872000000e+01\r\n2900 2900 -2.7889063000000e+01\r\n2901 2900  6.9489161000000e+00\r\n2902 2900  1.0529944000000e+01\r\n2904 2900 -9.5692617000000e-01\r\n2949 2900 -8.2013940000000e-01\r\n1795 2901  2.5342110000000e+00\r\n1796 2901 -4.1049921000000e-01\r\n1797 2901 -5.8555350000000e+00\r\n2851 2901  3.6923229000000e+00\r\n2852 2901 -5.9809366000000e-01\r\n2853 2901 -1.5635414000000e+00\r\n2898 2901 -1.3181123000000e+00\r\n2899 2901 -1.6583299000000e+02\r\n2900 2901  2.5522133000000e+01\r\n2901 2901  1.1746441000000e+01\r\n2902 2901  1.7799806000000e+01\r\n2903 2901 -2.8832664000000e+00\r\n2904 2901 -1.6175869000000e+00\r\n2949 2901 -1.3863628000000e+00\r\n1798 2902 -1.9671590000000e-03\r\n1800 2902 -2.0530161000000e-05\r\n2854 2902 -9.4353779000000e-02\r\n2856 2902 -7.6876504000000e-06\r\n2899 2902 -6.2590762000000e-04\r\n2901 2902 -6.5322551000000e-06\r\n2902 2902  1.7555154000000e+02\r\n2904 2902  4.6028580000000e-04\r\n2905 2902 -1.3385002000000e-01\r\n2907 2902 -8.1373237000000e-06\r\n2950 2902 -6.7278096000000e-04\r\n2952 2902 -7.0214465000000e-06\r\n1798 2903  3.4378157000000e+00\r\n1800 2903 -2.8855036000000e+00\r\n2854 2903  4.5815569000000e+00\r\n2856 2903 -1.0846679000000e+00\r\n2901 2903 -9.5692617000000e-01\r\n2902 2903 -1.1978282000000e+02\r\n2903 2903 -3.3471603000000e+01\r\n2904 2903  7.0921696000000e+00\r\n2905 2903  1.1103122000000e+01\r\n2907 2903 -1.1481787000000e+00\r\n2952 2903 -1.0131270000000e+00\r\n1798 2904  5.8112836000000e+00\r\n1799 2904 -9.4130456000000e-01\r\n1800 2904 -4.8776553000000e+00\r\n2854 2904  7.7446637000000e+00\r\n2855 2904 -1.2544711000000e+00\r\n2856 2904 -1.8335227000000e+00\r\n2901 2904 -1.6175869000000e+00\r\n2902 2904 -2.0248088000000e+02\r\n2903 2904  3.1177756000000e+01\r\n2904 2904  1.1988602000000e+01\r\n2905 2904  1.8768717000000e+01\r\n2906 2904 -3.0401336000000e+00\r\n2907 2904 -1.9408812000000e+00\r\n2952 2904 -1.7125898000000e+00\r\n1801 2905 -1.3655556000000e-02\r\n1803 2905 -1.7592714000000e-05\r\n2857 2905 -1.4965754000000e-01\r\n2859 2905 -9.3519983000000e-06\r\n2902 2905 -7.7970208000000e-04\r\n2904 2905 -8.1373237000000e-06\r\n2905 2905  2.1065174000000e+02\r\n2907 2905  5.4643995000000e-04\r\n2908 2905 -1.0697527000000e-01\r\n2910 2905 -1.0164005000000e-05\r\n2953 2905 -8.3633053000000e-04\r\n2955 2905 -8.7283238000000e-06\r\n1801 2906  6.3913273000000e+00\r\n1803 2906 -2.4049276000000e+00\r\n2857 2906  9.4506934000000e+00\r\n2859 2906 -1.2783576000000e+00\r\n2904 2906 -1.1481787000000e+00\r\n2905 2906 -1.4406601000000e+02\r\n2906 2906 -4.0169576000000e+01\r\n2907 2906  7.4502841000000e+00\r\n2908 2906  7.4370771000000e+00\r\n2910 2906 -1.3893702000000e+00\r\n2955 2906 -1.2249288000000e+00\r\n1801 2907  1.0803892000000e+01\r\n1802 2907 -1.7499627000000e+00\r\n1803 2907 -4.0652867000000e+00\r\n2857 2907  1.5975441000000e+01\r\n2858 2907 -2.5876255000000e+00\r\n2859 2907 -2.1609341000000e+00\r\n2904 2907 -1.9408812000000e+00\r\n2905 2907 -2.4352901000000e+02\r\n2906 2907  3.7492727000000e+01\r\n2907 2907  1.2593953000000e+01\r\n2908 2907  1.2571626000000e+01\r\n2909 2907 -2.0362919000000e+00\r\n2910 2907 -2.3485896000000e+00\r\n2955 2907 -2.0706186000000e+00\r\n1804 2908 -3.1731369000000e-02\r\n1806 2908 -1.4651543000000e-05\r\n2860 2908 -2.3081970000000e-01\r\n2862 2908 -1.1598485000000e-05\r\n2905 2908 -9.7389460000000e-04\r\n2907 2908 -1.0164005000000e-05\r\n2908 2908  2.5739641000000e+02\r\n2910 2908  6.6144089000000e-04\r\n2911 2908 -1.1671148000000e-03\r\n2913 2908 -1.2180538000000e-05\r\n2956 2908 -1.0475229000000e-03\r\n2958 2908 -1.0932423000000e-05\r\n1804 2909  8.1999829000000e+00\r\n1806 2909 -1.9681342000000e+00\r\n2860 2909  1.5533079000000e+01\r\n2862 2909 -1.5579331000000e+00\r\n2907 2909 -1.3893702000000e+00\r\n2908 2909 -1.7136108000000e+02\r\n2909 2909 -4.9096209000000e+01\r\n2910 2909  8.0683912000000e+00\r\n2913 2909 -1.6425735000000e+00\r\n2958 2909 -1.5048543000000e+00\r\n1804 2910  1.3861251000000e+01\r\n1805 2910 -2.2451493000000e+00\r\n1806 2910 -3.3269340000000e+00\r\n2860 2910  2.6257116000000e+01\r\n2861 2910 -4.2529456000000e+00\r\n2862 2910 -2.6335301000000e+00\r\n2907 2910 -2.3485896000000e+00\r\n2908 2910 -2.8966876000000e+02\r\n2909 2910  4.4531218000000e+01\r\n2910 2910  1.3638805000000e+01\r\n2913 2910 -2.7766044000000e+00\r\n2958 2910 -2.5438056000000e+00\r\n1807 2911 -9.9412422000000e-03\r\n1809 2911 -1.2837617000000e-05\r\n2863 2911 -1.4530947000000e-01\r\n2865 2911 -1.2988390000000e-05\r\n2908 2911 -1.7789741000000e-03\r\n2910 2911 -1.2180538000000e-05\r\n2911 2911  2.9235758000000e+02\r\n2913 2911  7.4769519000000e-04\r\n2914 2911 -1.2369273000000e-03\r\n2916 2911 -1.2909133000000e-05\r\n2959 2911 -1.2251659000000e-03\r\n2961 2911 -1.2786386000000e-05\r\n1807 2912  6.0694391000000e+00\r\n1809 2912 -1.7312366000000e+00\r\n2863 2912  7.4327847000000e+00\r\n2865 2912 -1.7514355000000e+00\r\n2908 2912  2.1251653000000e+00\r\n2910 2912 -1.6425735000000e+00\r\n2911 2912 -1.8339221000000e+02\r\n2912 2912 -5.5787051000000e+01\r\n2913 2912  8.6371571000000e+00\r\n2916 2912 -1.7546171000000e+00\r\n2961 2912 -1.7510167000000e+00\r\n1807 2913  1.0259773000000e+01\r\n1808 2913 -1.6618126000000e+00\r\n1809 2913 -2.9264805000000e+00\r\n2863 2913  1.2564371000000e+01\r\n2864 2913 -2.0350968000000e+00\r\n2865 2913 -2.9606246000000e+00\r\n2908 2913  3.5923771000000e+00\r\n2909 2913 -5.8187035000000e-01\r\n2910 2913 -2.7766044000000e+00\r\n2911 2913 -3.1000599000000e+02\r\n2912 2913  4.7510016000000e+01\r\n2913 2913  1.4600243000000e+01\r\n2916 2913 -2.9660047000000e+00\r\n2961 2913 -2.9599166000000e+00\r\n1810 2914 -1.2317144000000e-03\r\n1812 2914 -1.2854729000000e-05\r\n2866 2914 -4.9930138000000e-02\r\n2868 2914 -1.2885356000000e-05\r\n2911 2914 -4.3702887000000e-02\r\n2913 2914 -1.2909133000000e-05\r\n2914 2914  2.9229690000000e+02\r\n2916 2914  7.3543728000000e-04\r\n2917 2914 -1.2263071000000e-03\r\n2919 2914 -1.2798296000000e-05\r\n1810 2915  4.7417388000000e+00\r\n1812 2915 -1.7320662000000e+00\r\n2868 2915 -1.7512923000000e+00\r\n2911 2915  4.1803082000000e+00\r\n2913 2915 -1.7546171000000e+00\r\n2914 2915 -1.7669016000000e+02\r\n2915 2915 -5.5784865000000e+01\r\n2916 2915  6.9988269000000e+00\r\n2919 2915 -1.7545746000000e+00\r\n1810 2916  8.0154353000000e+00\r\n1811 2916 -1.2982959000000e+00\r\n1812 2916 -2.9278847000000e+00\r\n2868 2916 -2.9603845000000e+00\r\n2911 2916  7.0663930000000e+00\r\n2912 2916 -1.1445752000000e+00\r\n2913 2916 -2.9660047000000e+00\r\n2914 2916 -2.9867705000000e+02\r\n2915 2916  4.5680730000000e+01\r\n2916 2916  1.1830815000000e+01\r\n2919 2916 -2.9659313000000e+00\r\n1813 2917 -1.2176441000000e-03\r\n1815 2917 -1.2707884000000e-05\r\n2869 2917 -1.7815582000000e-02\r\n2871 2917 -1.2778240000000e-05\r\n2914 2917 -5.6888197000000e-02\r\n2916 2917 -1.2798296000000e-05\r\n2917 2917  2.9227822000000e+02\r\n2919 2917  7.2226879000000e-04\r\n1813 2918  3.6538981000000e+00\r\n1815 2918 -1.7304932000000e+00\r\n2871 2918 -1.7517190000000e+00\r\n2914 2918  4.6340972000000e+00\r\n2916 2918 -1.7545746000000e+00\r\n2917 2918 -1.7605817000000e+02\r\n2918 2918 -5.5783494000000e+01\r\n2919 2918  5.2430629000000e+00\r\n1813 2919  6.1765459000000e+00\r\n1814 2919 -1.0004495000000e+00\r\n1815 2919 -2.9252241000000e+00\r\n2871 2919 -2.9611039000000e+00\r\n2914 2919  7.8334735000000e+00\r\n2915 2919 -1.2688313000000e+00\r\n2916 2919 -2.9659313000000e+00\r\n2917 2919 -2.9760857000000e+02\r\n2918 2919  4.5511484000000e+01\r\n2919 2919  8.8628684000000e+00\r\n2920 2920  1.0000000000000e+00\r\n2921 2921  1.0000000000000e+00\r\n2922 2922  1.0000000000000e+00\r\n2923 2923  1.0000000000000e+00\r\n2924 2924  1.0000000000000e+00\r\n2925 2925  1.0000000000000e+00\r\n2926 2926  1.0000000000000e+00\r\n2927 2927  1.0000000000000e+00\r\n2928 2928  1.0000000000000e+00\r\n2929 2929  1.0000000000000e+00\r\n2930 2930  1.0000000000000e+00\r\n2931 2931  1.0000000000000e+00\r\n2932 2932  1.0000000000000e+00\r\n2933 2933  1.0000000000000e+00\r\n2934 2934  1.0000000000000e+00\r\n1831 2935 -2.0907687000000e-03\r\n1833 2935 -2.1820208000000e-05\r\n2887 2935 -1.5280454000000e-02\r\n2889 2935 -4.7493308000000e-06\r\n2935 2935  1.4030494000000e+02\r\n2937 2935  3.6494319000000e-04\r\n2938 2935 -4.6051907000000e-04\r\n2940 2935 -4.8061854000000e-06\r\n2983 2935 -5.0706768000000e-04\r\n2985 2935 -5.2919878000000e-06\r\n1831 2936  2.4986659000000e-01\r\n1833 2936 -3.6092681000000e+00\r\n2887 2936  2.3300809000000e+00\r\n2889 2936 -7.8561509000000e-01\r\n2935 2936 -8.5988916000000e+01\r\n2936 2936 -2.6749432000000e+01\r\n2937 2936  6.0726827000000e+00\r\n2938 2936  2.8408732000000e+00\r\n2940 2936 -7.8409278000000e-01\r\n2985 2936 -8.9070618000000e-01\r\n1831 2937  4.2237423000000e-01\r\n1832 2937 -6.8422734000000e-02\r\n1833 2937 -6.1011032000000e+00\r\n2887 2937  3.9387665000000e+00\r\n2888 2937 -6.3806251000000e-01\r\n2889 2937 -1.3280030000000e+00\r\n2935 2937 -1.4535558000000e+02\r\n2936 2937  2.2319922000000e+01\r\n2937 2937  1.0265257000000e+01\r\n2938 2937  4.8022092000000e+00\r\n2939 2937 -7.7793632000000e-01\r\n2940 2937 -1.3254297000000e+00\r\n2985 2937 -1.5056487000000e+00\r\n1834 2938 -2.4200611000000e-03\r\n1836 2938 -2.5256853000000e-05\r\n2890 2938 -3.9294061000000e-02\r\n2892 2938 -4.4035919000000e-06\r\n2935 2938 -1.4951867000000e-02\r\n2937 2938 -4.8061854000000e-06\r\n2938 2938  1.2281904000000e+02\r\n2940 2938  3.3084145000000e-04\r\n2941 2938 -1.8239248000000e-02\r\n2943 2938 -4.4015426000000e-06\r\n2986 2938 -4.5364268000000e-04\r\n2988 2938 -4.7344203000000e-06\r\n1834 2939  2.4940594000000e-01\r\n1836 2939 -4.1202759000000e+00\r\n2890 2939  2.9376635000000e+00\r\n2892 2939 -7.1847045000000e-01\r\n2937 2939 -7.8409278000000e-01\r\n2938 2939 -7.7998744000000e+01\r\n2939 2939 -2.3412403000000e+01\r\n2940 2939  7.1290163000000e+00\r\n2941 2939  4.3238292000000e+00\r\n2943 2939 -7.1818374000000e-01\r\n2988 2939 -7.8536504000000e-01\r\n1834 2940  4.2159580000000e-01\r\n1835 2940 -6.8296022000000e-02\r\n1836 2940 -6.9649144000000e+00\r\n2890 2940  4.9658263000000e+00\r\n2891 2940 -8.0443445000000e-01\r\n2892 2940 -1.2145024000000e+00\r\n2937 2940 -1.3254297000000e+00\r\n2938 2940 -1.3184908000000e+02\r\n2939 2940  2.0268814000000e+01\r\n2940 2940  1.2050888000000e+01\r\n2941 2940  7.3090009000000e+00\r\n2942 2940 -1.1840149000000e+00\r\n2943 2940 -1.2140178000000e+00\r\n2988 2940 -1.3275811000000e+00\r\n1837 2941 -2.5969432000000e-03\r\n1839 2941 -2.7102875000000e-05\r\n2893 2941 -3.9896689000000e-02\r\n2895 2941 -4.4004684000000e-06\r\n2938 2941 -4.2174700000000e-04\r\n2940 2941 -4.4015426000000e-06\r\n2941 2941  1.1698109000000e+02\r\n2943 2941  3.1818732000000e-04\r\n2944 2941 -4.5028381000000e-02\r\n2946 2941 -4.3990367000000e-06\r\n2989 2941 -4.1409852000000e-04\r\n2991 2941 -4.3217195000000e-06\r\n1837 2942  2.6194740000000e-01\r\n1839 2942 -4.3210899000000e+00\r\n2893 2942  2.8713325000000e+00\r\n2895 2942 -7.0157335000000e-01\r\n2940 2942 -7.1818374000000e-01\r\n2941 2942 -7.5997533000000e+01\r\n2942 2942 -2.2303045000000e+01\r\n2943 2942  7.1462039000000e+00\r\n2944 2942  5.7407411000000e+00\r\n2946 2942 -7.0138732000000e-01\r\n2991 2942 -7.0146394000000e-01\r\n1837 2943  4.4279562000000e-01\r\n1838 2943 -7.1729294000000e-02\r\n1839 2943 -7.3043660000000e+00\r\n2893 2943  4.8536977000000e+00\r\n2894 2943 -7.8625959000000e-01\r\n2895 2943 -1.1859389000000e+00\r\n2940 2943 -1.2140178000000e+00\r\n2941 2943 -1.2846615000000e+02\r\n2942 2943  1.9758867000000e+01\r\n2943 2943  1.2079937000000e+01\r\n2944 2943  9.7041432000000e+00\r\n2945 2943 -1.5719925000000e+00\r\n2946 2943 -1.1856244000000e+00\r\n2991 2943 -1.1857538000000e+00\r\n1840 2944 -2.6783038000000e-03\r\n1842 2944 -2.7951990000000e-05\r\n2896 2944 -4.6667797000000e-02\r\n2898 2944 -4.5368496000000e-06\r\n2941 2944 -4.2150690000000e-04\r\n2943 2944 -4.3990367000000e-06\r\n2944 2944  1.1699333000000e+02\r\n2946 2944  3.1965121000000e-04\r\n2947 2944 -5.5637401000000e-02\r\n2949 2944 -4.7515607000000e-06\r\n2992 2944 -4.2604735000000e-04\r\n2994 2944 -4.4464229000000e-06\r\n1840 2945  3.8406668000000e-01\r\n1842 2945 -4.3220435000000e+00\r\n2896 2945  3.1988388000000e+00\r\n2898 2945 -7.0164907000000e-01\r\n2943 2945 -7.0138732000000e-01\r\n2944 2945 -7.7946499000000e+01\r\n2945 2945 -2.2307860000000e+01\r\n2946 2945  7.1642056000000e+00\r\n2947 2945  7.2469567000000e+00\r\n2949 2945 -7.3491268000000e-01\r\n2994 2945 -7.0170517000000e-01\r\n1840 2946  6.4922631000000e-01\r\n1841 2946 -1.0516732000000e-01\r\n1842 2946 -7.3059823000000e+00\r\n2896 2946  5.4073170000000e+00\r\n2897 2946 -8.7592417000000e-01\r\n2898 2946 -1.1860676000000e+00\r\n2943 2946 -1.1856244000000e+00\r\n2944 2946 -1.3176076000000e+02\r\n2945 2946  2.0280237000000e+01\r\n2946 2946  1.2110372000000e+01\r\n2947 2946  1.2250255000000e+01\r\n2948 2946 -1.9844028000000e+00\r\n2949 2946 -1.2422964000000e+00\r\n2994 2946 -1.1861624000000e+00\r\n1843 2947 -2.5234634000000e-03\r\n1845 2947 -2.6336006000000e-05\r\n2899 2947 -8.6060744000000e-02\r\n2901 2947 -5.4940068000000e-06\r\n2944 2947 -4.5528504000000e-04\r\n2946 2947 -4.7515607000000e-06\r\n2947 2947  1.2875970000000e+02\r\n2949 2947  3.4823164000000e-04\r\n2950 2947 -1.0110620000000e-01\r\n2952 2947 -5.7909466000000e-06\r\n2995 2947 -4.7264122000000e-04\r\n2997 2947 -4.9326976000000e-06\r\n1843 2948  8.2261853000000e-01\r\n1845 2948 -3.9293287000000e+00\r\n2899 2948  4.3492109000000e+00\r\n2901 2948 -8.2013940000000e-01\r\n2946 2948 -7.3491268000000e-01\r\n2947 2948 -8.7385812000000e+01\r\n2948 2948 -2.4545170000000e+01\r\n2949 2948  7.1055679000000e+00\r\n2950 2948  8.3950323000000e+00\r\n2952 2948 -8.6451796000000e-01\r\n2997 2948 -7.5390765000000e-01\r\n1843 2949  1.3905535000000e+00\r\n1844 2949 -2.2524889000000e-01\r\n1845 2949 -6.6421333000000e+00\r\n2899 2949  7.3519017000000e+00\r\n2900 2949 -1.1908982000000e+00\r\n2901 2949 -1.3863628000000e+00\r\n2946 2949 -1.2422964000000e+00\r\n2947 2949 -1.4771689000000e+02\r\n2948 2949  2.2741959000000e+01\r\n2949 2949  1.2011246000000e+01\r\n2950 2949  1.4190954000000e+01\r\n2951 2949 -2.2987224000000e+00\r\n2952 2949 -1.4613803000000e+00\r\n2997 2949 -1.2744047000000e+00\r\n1846 2950 -2.0624577000000e-03\r\n1848 2950 -2.1524741000000e-05\r\n2902 2950 -1.1252369000000e-01\r\n2904 2950 -7.0214465000000e-06\r\n2947 2950 -5.5487692000000e-04\r\n2949 2950 -5.7909466000000e-06\r\n2950 2950  1.6385552000000e+02\r\n2952 2950  4.3118608000000e-04\r\n2953 2950 -1.0965209000000e-01\r\n2955 2950 -7.4674546000000e-06\r\n2998 2950 -6.1070402000000e-04\r\n3000 2950 -6.3735834000000e-06\r\n1846 2951  1.7105763000000e+00\r\n1848 2951 -3.1003240000000e+00\r\n2902 2951  6.6823870000000e+00\r\n2904 2951 -1.0131270000000e+00\r\n2949 2951 -8.6451796000000e-01\r\n2950 2951 -1.1119055000000e+02\r\n2951 2951 -3.1242159000000e+01\r\n2952 2951  7.0031835000000e+00\r\n2953 2951  8.8505135000000e+00\r\n2955 2951 -1.0775222000000e+00\r\n3000 2951 -9.4417640000000e-01\r\n1846 2952  2.8915581000000e+00\r\n1847 2952 -4.6837824000000e-01\r\n1848 2952 -5.2407877000000e+00\r\n2902 2952  1.1295907000000e+01\r\n2903 2952 -1.8297253000000e+00\r\n2904 2952 -1.7125898000000e+00\r\n2949 2952 -1.4613803000000e+00\r\n2950 2952 -1.8795651000000e+02\r\n2951 2952  2.8928800000000e+01\r\n2952 2952  1.1838180000000e+01\r\n2953 2952  1.4960908000000e+01\r\n2954 2952 -2.4233868000000e+00\r\n2955 2952 -1.8214435000000e+00\r\n3000 2952 -1.5960358000000e+00\r\n1849 2953 -1.7450567000000e-03\r\n1851 2953 -1.8212201000000e-05\r\n2905 2953 -1.5418602000000e-01\r\n2907 2953 -8.7283238000000e-06\r\n2950 2953 -7.1551657000000e-04\r\n2952 2953 -7.4674546000000e-06\r\n2953 2953  1.9895003000000e+02\r\n2955 2953  5.1713859000000e-04\r\n2956 2953 -1.0189083000000e-01\r\n2958 2953 -9.3955150000000e-06\r\n3001 2953 -7.8983668000000e-04\r\n3003 2953 -8.2430930000000e-06\r\n1849 2954  2.9953742000000e+00\r\n1851 2954 -2.5465029000000e+00\r\n2905 2954  9.8630409000000e+00\r\n2907 2954 -1.2249288000000e+00\r\n2952 2954 -1.0775222000000e+00\r\n2953 2954 -1.3466501000000e+02\r\n2954 2954 -3.7939422000000e+01\r\n2955 2954  7.3605572000000e+00\r\n2956 2954  7.7318862000000e+00\r\n2958 2954 -1.3185876000000e+00\r\n3003 2954 -1.1887451000000e+00\r\n1849 2955  5.0633777000000e+00\r\n1850 2955 -8.2015700000000e-01\r\n1851 2955 -4.3046060000000e+00\r\n2905 2955  1.6672475000000e+01\r\n2906 2955 -2.7005780000000e+00\r\n2907 2955 -2.0706186000000e+00\r\n2952 2955 -1.8214435000000e+00\r\n2953 2955 -2.2763761000000e+02\r\n2954 2955  3.5024388000000e+01\r\n2955 2955  1.2442280000000e+01\r\n2956 2955  1.3069973000000e+01\r\n2957 2955 -2.1170510000000e+00\r\n2958 2955 -2.2289392000000e+00\r\n3003 2955 -2.0094537000000e+00\r\n1852 2956 -1.4437416000000e-03\r\n1854 2956 -1.5067541000000e-05\r\n2908 2956 -1.8899141000000e-01\r\n2910 2956 -1.0932423000000e-05\r\n2953 2956 -9.0025946000000e-04\r\n2955 2956 -9.3955150000000e-06\r\n2956 2956  2.4568578000000e+02\r\n2958 2956  6.3195050000000e-04\r\n2959 2956 -5.3626918000000e-02\r\n2961 2956 -1.1637965000000e-05\r\n3004 2956 -9.9467506000000e-04\r\n3006 2956 -1.0380879000000e-05\r\n1852 2957  3.8277950000000e+00\r\n1854 2957 -2.0617751000000e+00\r\n2908 2957  1.1347922000000e+01\r\n2910 2957 -1.5048543000000e+00\r\n2955 2957 -1.3185876000000e+00\r\n2956 2957 -1.5857358000000e+02\r\n2957 2957 -4.6867737000000e+01\r\n2958 2957  7.9452507000000e+00\r\n2959 2957  2.4842690000000e+00\r\n2961 2957 -1.6019820000000e+00\r\n3006 2957 -1.4527757000000e+00\r\n1852 2958  6.4705046000000e+00\r\n1853 2958 -1.0480660000000e+00\r\n1854 2958 -3.4852246000000e+00\r\n2908 2958  1.9182526000000e+01\r\n2909 2958 -3.1071076000000e+00\r\n2910 2958 -2.5438056000000e+00\r\n2955 2958 -2.2289392000000e+00\r\n2956 2958 -2.6805278000000e+02\r\n2957 2958  4.1131714000000e+01\r\n2958 2958  1.3430650000000e+01\r\n2959 2958  4.1994083000000e+00\r\n2960 2958 -6.8020307000000e-01\r\n2961 2958 -2.7079903000000e+00\r\n3006 2958 -2.4557720000000e+00\r\n1855 2959 -1.2193593000000e-03\r\n1857 2959 -1.2725786000000e-05\r\n2911 2959 -1.6186938000000e-01\r\n2913 2959 -1.2786386000000e-05\r\n2956 2959 -1.1151265000000e-03\r\n2958 2959 -1.1637965000000e-05\r\n2959 2959  2.9235799000000e+02\r\n2961 2959  7.3364169000000e-04\r\n3007 2959 -1.1991036000000e-03\r\n3009 2959 -1.2514388000000e-05\r\n1855 2960  3.3656994000000e+00\r\n1857 2960 -1.7316203000000e+00\r\n2911 2960  8.2236014000000e+00\r\n2913 2960 -1.7510167000000e+00\r\n2958 2960 -1.6019820000000e+00\r\n2959 2960 -1.7934679000000e+02\r\n2960 2960 -5.5792557000000e+01\r\n2961 2960  6.8241964000000e+00\r\n3009 2960 -1.7332974000000e+00\r\n1855 2961  5.6893743000000e+00\r\n1856 2961 -9.2153890000000e-01\r\n1857 2961 -2.9271289000000e+00\r\n2911 2961  1.3901166000000e+01\r\n2912 2961 -2.2516474000000e+00\r\n2913 2961 -2.9599166000000e+00\r\n2958 2961 -2.7079903000000e+00\r\n2959 2961 -3.0316761000000e+02\r\n2960 2961  4.6389658000000e+01\r\n2961 2961  1.1535616000000e+01\r\n3009 2961 -2.9299642000000e+00\r\n2962 2962  1.0000000000000e+00\r\n2963 2963  1.0000000000000e+00\r\n2964 2964  1.0000000000000e+00\r\n2965 2965  1.0000000000000e+00\r\n2966 2966  1.0000000000000e+00\r\n2967 2967  1.0000000000000e+00\r\n2968 2968  1.0000000000000e+00\r\n2969 2969  1.0000000000000e+00\r\n2970 2970  1.0000000000000e+00\r\n2971 2971  1.0000000000000e+00\r\n2972 2972  1.0000000000000e+00\r\n2973 2973  1.0000000000000e+00\r\n2974 2974  1.0000000000000e+00\r\n2975 2975  1.0000000000000e+00\r\n2976 2976  1.0000000000000e+00\r\n2977 2977  1.0000000000000e+00\r\n2978 2978  1.0000000000000e+00\r\n2979 2979  1.0000000000000e+00\r\n1876 2980 -1.6218760000000e-03\r\n1878 2980 -1.6926631000000e-05\r\n2980 2980  1.7537941000000e+02\r\n2982 2980  4.3935417000000e-04\r\n2983 2980 -5.6647007000000e-04\r\n2985 2980 -5.9119379000000e-06\r\n3028 2980 -6.1556137000000e-03\r\n3030 2980 -6.1714783000000e-06\r\n1876 2981  2.8576449000000e-01\r\n1878 2981 -2.8833788000000e+00\r\n2980 2981 -1.0405696000000e+02\r\n2981 2981 -3.3424919000000e+01\r\n2982 2981  4.9336497000000e+00\r\n2983 2981  3.0445818000000e+00\r\n2985 2981 -9.9495519000000e-01\r\n3030 2981 -1.0515702000000e+00\r\n1876 2982  4.8305630000000e-01\r\n1877 2982 -7.8254280000000e-02\r\n1878 2982 -4.8740636000000e+00\r\n2980 2982 -1.7589789000000e+02\r\n2981 2982  2.6990414000000e+01\r\n2982 2982  8.3398415000000e+00\r\n2983 2982  5.1465611000000e+00\r\n2984 2982 -8.3373394000000e-01\r\n2985 2982 -1.6818723000000e+00\r\n3030 2982 -1.7775743000000e+00\r\n1879 2983 -1.8263607000000e-03\r\n1881 2983 -1.9060727000000e-05\r\n2935 2983 -2.5935914000000e-02\r\n2937 2983 -5.2919878000000e-06\r\n2980 2983 -1.0039632000000e-02\r\n2982 2983 -5.9119379000000e-06\r\n2983 2983  1.5787298000000e+02\r\n2985 2983  4.1085346000000e-04\r\n2986 2983 -5.1382266000000e-04\r\n2988 2983 -5.3624858000000e-06\r\n3031 2983 -7.6890951000000e-03\r\n3033 2983 -5.9184280000000e-06\r\n1879 2984  2.7351888000000e-01\r\n1881 2984 -3.2080206000000e+00\r\n2935 2984  3.9182695000000e+00\r\n2937 2984 -8.9070618000000e-01\r\n2982 2984 -9.9495519000000e-01\r\n2983 2984 -9.8166516000000e+01\r\n2984 2984 -3.0088923000000e+01\r\n2985 2984  6.9825585000000e+00\r\n2986 2984  3.3297181000000e+00\r\n2988 2984 -8.8944881000000e-01\r\n3033 2984 -9.9605394000000e-01\r\n1879 2985  4.6235599000000e-01\r\n1880 2985 -7.4900371000000e-02\r\n1881 2985 -5.4228342000000e+00\r\n2935 2985  6.6234381000000e+00\r\n2936 2985 -1.0729783000000e+00\r\n2937 2985 -1.5056487000000e+00\r\n2982 2985 -1.6818723000000e+00\r\n2983 2985 -1.6594056000000e+02\r\n2984 2985  2.5511811000000e+01\r\n2985 2985  1.1803310000000e+01\r\n2986 2985  5.6285516000000e+00\r\n2987 2985 -9.1180951000000e-01\r\n2988 2985 -1.5035232000000e+00\r\n3033 2985 -1.6837284000000e+00\r\n1882 2986 -2.0841056000000e-03\r\n1884 2986 -2.1750669000000e-05\r\n2938 2986 -1.4222408000000e-02\r\n2940 2986 -4.7344203000000e-06\r\n2983 2986 -7.1571804000000e-03\r\n2985 2986 -5.3624858000000e-06\r\n2986 2986  1.4031504000000e+02\r\n2988 2986  3.6982836000000e-04\r\n2989 2986 -7.4921983000000e-03\r\n2991 2986 -4.6053461000000e-06\r\n3034 2986 -4.8897810000000e-04\r\n3036 2986 -5.1031967000000e-06\r\n1882 2987  2.5395958000000e-01\r\n1884 2987 -3.6073107000000e+00\r\n2938 2987  3.3601425000000e+00\r\n2940 2987 -7.8536504000000e-01\r\n2985 2987 -8.8944881000000e-01\r\n2986 2987 -8.8453895000000e+01\r\n2987 2987 -2.6752309000000e+01\r\n2988 2987  6.9076900000000e+00\r\n2989 2987  4.2756307000000e+00\r\n2991 2987 -7.6397796000000e-01\r\n3036 2987 -8.5858568000000e-01\r\n1882 2988  4.2929328000000e-01\r\n1883 2988 -6.9543659000000e-02\r\n1884 2988 -6.0977979000000e+00\r\n2938 2988  5.6799849000000e+00\r\n2939 2988 -9.2013306000000e-01\r\n2940 2988 -1.3275811000000e+00\r\n2985 2988 -1.5035232000000e+00\r\n2986 2988 -1.4952246000000e+02\r\n2987 2988  2.2987933000000e+01\r\n2988 2988  1.1676758000000e+01\r\n2989 2988  7.2275262000000e+00\r\n2990 2988 -1.1708281000000e+00\r\n2991 2988 -1.2914283000000e+00\r\n3036 2988 -1.4513532000000e+00\r\n1885 2989 -2.5550484000000e-03\r\n1887 2989 -2.6665641000000e-05\r\n2941 2989 -2.3639000000000e-02\r\n2943 2989 -4.3217195000000e-06\r\n2986 2989 -4.4127505000000e-04\r\n2988 2989 -4.6053461000000e-06\r\n2989 2989  1.1694917000000e+02\r\n2991 2989  3.1781661000000e-04\r\n2992 2989 -2.6024437000000e-02\r\n2994 2989 -4.3157520000000e-06\r\n3037 2989 -4.1664047000000e-04\r\n3039 2989 -4.3482484000000e-06\r\n1885 2990  2.5126827000000e-01\r\n1887 2990 -4.3270355000000e+00\r\n2941 2990  3.2985162000000e+00\r\n2943 2990 -7.0146394000000e-01\r\n2988 2990 -7.6397796000000e-01\r\n2989 2990 -7.5896088000000e+01\r\n2990 2990 -2.2299969000000e+01\r\n2991 2990  7.2137900000000e+00\r\n2992 2990  5.2184149000000e+00\r\n2994 2990 -7.0052491000000e-01\r\n3039 2990 -7.1828335000000e-01\r\n1885 2991  4.2474358000000e-01\r\n1886 2991 -6.8805773000000e-02\r\n1887 2991 -7.3144156000000e+00\r\n2941 2991  5.5758076000000e+00\r\n2942 2991 -9.0324552000000e-01\r\n2943 2991 -1.1857538000000e+00\r\n2988 2991 -1.2914283000000e+00\r\n2989 2991 -1.2829465000000e+02\r\n2990 2991  1.9738918000000e+01\r\n2991 2991  1.2194183000000e+01\r\n2992 2991  8.8212022000000e+00\r\n2993 2991 -1.4289789000000e+00\r\n2994 2991 -1.1841664000000e+00\r\n3039 2991 -1.2141856000000e+00\r\n1888 2992 -2.6280701000000e-03\r\n1890 2992 -2.7427728000000e-05\r\n2944 2992 -4.2629391000000e-02\r\n2946 2992 -4.4464229000000e-06\r\n2989 2992 -4.1352672000000e-04\r\n2991 2992 -4.3157520000000e-06\r\n2992 2992  1.1696963000000e+02\r\n2994 2992  3.1865200000000e-04\r\n2995 2992 -3.4250593000000e-02\r\n2997 2992 -4.5489783000000e-06\r\n3040 2992 -4.1695912000000e-04\r\n3042 2992 -4.3515740000000e-06\r\n1888 2993  2.8803691000000e-01\r\n1890 2993 -4.3278193000000e+00\r\n2944 2993  3.8156956000000e+00\r\n2946 2993 -7.0170517000000e-01\r\n2991 2993 -7.0052491000000e-01\r\n2992 2993 -7.7511946000000e+01\r\n2993 2993 -2.2306268000000e+01\r\n2994 2993  7.1518615000000e+00\r\n2995 2993  6.2892341000000e+00\r\n2997 2993 -7.1794048000000e-01\r\n3042 2993 -7.0136448000000e-01\r\n1888 2994  4.8689758000000e-01\r\n1889 2994 -7.8872904000000e-02\r\n1890 2994 -7.3157458000000e+00\r\n2944 2994  6.4500519000000e+00\r\n2945 2994 -1.0448487000000e+00\r\n2946 2994 -1.1861624000000e+00\r\n2991 2994 -1.1841664000000e+00\r\n2992 2994 -1.3102619000000e+02\r\n2993 2994  2.0165486000000e+01\r\n2994 2994  1.2089506000000e+01\r\n2995 2994  1.0631321000000e+01\r\n2996 2994 -1.7221757000000e+00\r\n2997 2994 -1.2136066000000e+00\r\n3042 2994 -1.1855865000000e+00\r\n1891 2995 -2.5829767000000e-03\r\n1893 2995 -2.6957113000000e-05\r\n2947 2995 -6.6907064000000e-02\r\n2949 2995 -4.9326976000000e-06\r\n2992 2995 -4.3587400000000e-04\r\n2994 2995 -4.5489783000000e-06\r\n2995 2995  1.2284613000000e+02\r\n2997 2995  3.3371446000000e-04\r\n2998 2995 -5.0043636000000e-02\r\n3000 2995 -5.3283485000000e-06\r\n3043 2995 -4.5087345000000e-04\r\n3045 2995 -4.7055193000000e-06\r\n1891 2996  4.8005106000000e-01\r\n1893 2996 -4.1183464000000e+00\r\n2947 2996  4.9292198000000e+00\r\n2949 2996 -7.5390765000000e-01\r\n2994 2996 -7.1794048000000e-01\r\n2995 2996 -8.3034678000000e+01\r\n2996 2996 -2.3428959000000e+01\r\n2997 2996  7.1440394000000e+00\r\n2998 2996  7.1609685000000e+00\r\n3000 2996 -8.1443468000000e-01\r\n3045 2996 -7.3677436000000e-01\r\n1891 2997  8.1147783000000e-01\r\n1892 2997 -1.3144930000000e-01\r\n1893 2997 -6.9616488000000e+00\r\n2947 2997  8.3323483000000e+00\r\n2948 2997 -1.3497365000000e+00\r\n2949 2997 -1.2744047000000e+00\r\n2994 2997 -1.2136066000000e+00\r\n2995 2997 -1.4036174000000e+02\r\n2996 2997  2.1606154000000e+01\r\n2997 2997  1.2076278000000e+01\r\n2998 2997  1.2104894000000e+01\r\n2999 2997 -1.9608419000000e+00\r\n3000 2997 -1.3767196000000e+00\r\n3045 2997 -1.2454426000000e+00\r\n1894 2998 -2.1541484000000e-03\r\n1896 2998 -2.2481667000000e-05\r\n2950 2998 -1.3618978000000e-01\r\n2952 2998 -6.3735834000000e-06\r\n2995 2998 -5.1055170000000e-04\r\n2997 2998 -5.3283485000000e-06\r\n2998 2998  1.5220095000000e+02\r\n3000 2998  4.0278264000000e-04\r\n3001 2998 -1.2365296000000e-01\r\n3003 2998 -6.9744586000000e-06\r\n3046 2998 -5.7371574000000e-04\r\n3048 2998 -5.9875571000000e-06\r\n1894 2999  9.1064474000000e-01\r\n1896 2999 -3.3276778000000e+00\r\n2950 2999  7.0395525000000e+00\r\n2952 2999 -9.4417640000000e-01\r\n2997 2999 -8.1443468000000e-01\r\n2998 2999 -1.0306843000000e+02\r\n2999 2999 -2.9014860000000e+01\r\n3000 2999  7.0343971000000e+00\r\n3001 2999  7.8874247000000e+00\r\n3003 2999 -1.0332217000000e+00\r\n3048 2999 -9.1161978000000e-01\r\n1894 3000  1.5393539000000e+00\r\n1895 3000 -2.4935089000000e-01\r\n1896 3000 -5.6251066000000e+00\r\n2950 3000  1.1899659000000e+01\r\n2951 3000 -1.9275560000000e+00\r\n2952 3000 -1.5960358000000e+00\r\n2997 3000 -1.3767196000000e+00\r\n2998 3000 -1.7422688000000e+02\r\n2999 3000  2.6803302000000e+01\r\n3000 3000  1.1890944000000e+01\r\n3001 3000  1.3332903000000e+01\r\n3002 3000 -2.1597186000000e+00\r\n3003 3000 -1.7465580000000e+00\r\n3048 3000 -1.5410021000000e+00\r\n1897 3001 -1.7013121000000e-03\r\n1899 3001 -1.7755663000000e-05\r\n2953 3001 -1.5016361000000e-01\r\n2955 3001 -8.2430930000000e-06\r\n2998 3001 -6.6827867000000e-04\r\n3000 3001 -6.9744586000000e-06\r\n3001 3001  1.9898128000000e+02\r\n3003 3001  5.1503403000000e-04\r\n3004 3001 -1.3871730000000e-01\r\n3006 3001 -9.0451660000000e-06\r\n3049 3001 -7.6061183000000e-04\r\n3051 3001 -7.9380892000000e-06\r\n1897 3002  1.4824585000000e+00\r\n1899 3002 -2.5556453000000e+00\r\n2953 3002  9.5520967000000e+00\r\n2955 3002 -1.1887451000000e+00\r\n3000 3002 -1.0332217000000e+00\r\n3001 3002 -1.3676547000000e+02\r\n3002 3002 -3.7941031000000e+01\r\n3003 3002  7.2749930000000e+00\r\n3004 3002  1.1658090000000e+01\r\n3006 3002 -1.3044628000000e+00\r\n3051 3002 -1.1886468000000e+00\r\n1897 3003  2.5059465000000e+00\r\n1898 3003 -4.0591642000000e-01\r\n1899 3003 -4.3200606000000e+00\r\n2953 3003  1.6146856000000e+01\r\n2954 3003 -2.6154883000000e+00\r\n2955 3003 -2.0094537000000e+00\r\n3000 3003 -1.7465580000000e+00\r\n3001 3003 -2.3118823000000e+02\r\n3002 3003  3.5596443000000e+01\r\n3003 3003  1.2297642000000e+01\r\n3004 3003  1.9706825000000e+01\r\n3005 3003 -3.1921367000000e+00\r\n3006 3003 -2.2050628000000e+00\r\n3051 3003 -2.0092868000000e+00\r\n1900 3004 -1.4516712000000e-03\r\n1902 3004 -1.5150297000000e-05\r\n2956 3004 -1.4127870000000e-01\r\n2958 3004 -1.0380879000000e-05\r\n3001 3004 -8.6668972000000e-04\r\n3003 3004 -9.0451660000000e-06\r\n3004 3004  2.3981230000000e+02\r\n3006 3004  6.0661304000000e-04\r\n3007 3004 -7.7472854000000e-02\r\n3009 3004 -1.1193885000000e-05\r\n1900 3005  2.1898569000000e+00\r\n1902 3005 -2.1132209000000e+00\r\n2956 3005  7.2084319000000e+00\r\n2958 3005 -1.4527757000000e+00\r\n3003 3005 -1.3044628000000e+00\r\n3004 3005 -1.5184615000000e+02\r\n3005 3005 -4.5756514000000e+01\r\n3006 3005  6.4422035000000e+00\r\n3007 3005  4.8956587000000e+00\r\n3009 3005 -1.5665916000000e+00\r\n1900 3006  3.7017341000000e+00\r\n1901 3006 -5.9959884000000e-01\r\n1902 3006 -3.5721885000000e+00\r\n2956 3006  1.2185133000000e+01\r\n2957 3006 -1.9737214000000e+00\r\n2958 3006 -2.4557720000000e+00\r\n3003 3006 -2.2050628000000e+00\r\n3004 3006 -2.5668073000000e+02\r\n3005 3006  3.9333292000000e+01\r\n3006 3006  1.0889900000000e+01\r\n3007 3006  8.2756215000000e+00\r\n3008 3006 -1.3404672000000e+00\r\n3009 3006 -2.6481665000000e+00\r\n1903 3007 -1.2276692000000e-03\r\n1905 3007 -1.2812511000000e-05\r\n2959 3007 -1.4085507000000e-01\r\n2961 3007 -1.2514388000000e-05\r\n3004 3007 -1.0725757000000e-03\r\n3006 3007 -1.1193885000000e-05\r\n3007 3007  2.8648462000000e+02\r\n3009 3007  7.0680430000000e-04\r\n1903 3008  2.1925545000000e+00\r\n1905 3008 -1.7673253000000e+00\r\n2959 3008  5.8715541000000e+00\r\n2961 3008 -1.7332974000000e+00\r\n3006 3008 -1.5665916000000e+00\r\n3007 3008 -1.7245683000000e+02\r\n3008 3008 -5.4683742000000e+01\r\n3009 3008  5.0733718000000e+00\r\n1903 3009  3.7062920000000e+00\r\n1904 3009 -6.0033301000000e-01\r\n1905 3009 -2.9874848000000e+00\r\n2959 3009  9.9252692000000e+00\r\n2960 3009 -1.6076626000000e+00\r\n2961 3009 -2.9299642000000e+00\r\n3006 3009 -2.6481665000000e+00\r\n3007 3009 -2.9152085000000e+02\r\n3008 3009  4.4540689000000e+01\r\n3009 3009  8.5760242000000e+00\r\n3010 3010  1.0000000000000e+00\r\n3011 3011  1.0000000000000e+00\r\n3012 3012  1.0000000000000e+00\r\n3013 3013  1.0000000000000e+00\r\n3014 3014  1.0000000000000e+00\r\n3015 3015  1.0000000000000e+00\r\n3016 3016  1.0000000000000e+00\r\n3017 3017  1.0000000000000e+00\r\n3018 3018  1.0000000000000e+00\r\n3019 3019  1.0000000000000e+00\r\n3020 3020  1.0000000000000e+00\r\n3021 3021  1.0000000000000e+00\r\n3022 3022  1.0000000000000e+00\r\n3023 3023  1.0000000000000e+00\r\n3024 3024  1.0000000000000e+00\r\n3025 3025  1.0000000000000e+00\r\n3026 3026  1.0000000000000e+00\r\n3027 3027  1.0000000000000e+00\r\n1924 3028 -1.6115242000000e-03\r\n1926 3028 -1.6818596000000e-05\r\n2980 3028 -5.9133870000000e-04\r\n2982 3028 -6.1714783000000e-06\r\n3028 3028  1.7538712000000e+02\r\n3030 3028  4.4563921000000e-04\r\n3031 3028 -5.9091291000000e-04\r\n3033 3028 -6.1670345000000e-06\r\n3076 3028 -9.5763281000000e-03\r\n3078 3028 -6.1369889000000e-06\r\n1924 3029  2.9148652000000e-01\r\n1926 3029 -2.8811403000000e+00\r\n2980 3029  1.4767022000000e+00\r\n2982 3029 -1.0515702000000e+00\r\n3028 3029 -1.0423432000000e+02\r\n3029 3029 -3.3421480000000e+01\r\n3030 3029  6.0380010000000e+00\r\n3031 3029  1.7347769000000e+00\r\n3033 3029 -1.0499448000000e+00\r\n3078 3029 -1.0516017000000e+00\r\n1924 3030  4.9272882000000e-01\r\n1925 3030 -7.9821473000000e-02\r\n1926 3030 -4.8702796000000e+00\r\n2980 3030  2.4962175000000e+00\r\n2981 3030 -4.0438421000000e-01\r\n2982 3030 -1.7775743000000e+00\r\n3028 3030 -1.7619769000000e+02\r\n3029 3030  2.7047472000000e+01\r\n3030 3030  1.0206637000000e+01\r\n3031 3030  2.9324669000000e+00\r\n3032 3030 -4.7505609000000e-01\r\n3033 3030 -1.7748266000000e+00\r\n3078 3030 -1.7776276000000e+00\r\n1927 3031 -1.6258747000000e-03\r\n1929 3031 -1.6968364000000e-05\r\n2983 3031 -5.6709193000000e-04\r\n2985 3031 -5.9184280000000e-06\r\n3028 3031 -8.6361060000000e-03\r\n3030 3031 -6.1670345000000e-06\r\n3031 3031  1.7538214000000e+02\r\n3033 3031  4.5119202000000e-04\r\n3034 3031 -5.4331590000000e-04\r\n3036 3031 -5.6702906000000e-06\r\n3079 3031 -5.8681485000000e-04\r\n3081 3031 -6.1242653000000e-06\r\n1927 3032  2.7089122000000e-01\r\n1929 3032 -2.8880003000000e+00\r\n2983 3032  2.8009460000000e+00\r\n2985 3032 -9.9605394000000e-01\r\n3030 3032 -1.0499448000000e+00\r\n3031 3032 -1.0664585000000e+02\r\n3032 3032 -3.3425726000000e+01\r\n3033 3032  6.9433508000000e+00\r\n3034 3032  2.8484679000000e+00\r\n3036 3032 -9.5388098000000e-01\r\n3081 3032 -1.0517250000000e+00\r\n1927 3033  4.5791421000000e-01\r\n1928 3033 -7.4181320000000e-02\r\n1929 3033 -4.8818723000000e+00\r\n2983 3033  4.7347159000000e+00\r\n2984 3033 -7.6701587000000e-01\r\n2985 3033 -1.6837284000000e+00\r\n3030 3033 -1.7748266000000e+00\r\n3031 3033 -1.8027402000000e+02\r\n3032 3033  2.7697435000000e+01\r\n3033 3033  1.1737033000000e+01\r\n3034 3033  4.8150467000000e+00\r\n3035 3033 -7.8002927000000e-01\r\n3036 3033 -1.6124393000000e+00\r\n3081 3033 -1.7778344000000e+00\r\n1930 3034 -1.9728916000000e-03\r\n1932 3034 -2.0589990000000e-05\r\n2986 3034 -1.3010801000000e-02\r\n2988 3034 -5.1031967000000e-06\r\n3031 3034 -2.8402342000000e-02\r\n3033 3034 -5.6702906000000e-06\r\n3034 3034  1.4617753000000e+02\r\n3036 3034  3.8329670000000e-04\r\n3037 3034 -4.6348563000000e-04\r\n3039 3034 -4.8371457000000e-06\r\n3082 3034 -4.9312692000000e-04\r\n3084 3034 -5.1464957000000e-06\r\n1930 3035  2.6262155000000e-01\r\n1932 3035 -3.4633279000000e+00\r\n2986 3035  3.0645876000000e+00\r\n2988 3035 -8.5858568000000e-01\r\n3033 3035 -9.5388098000000e-01\r\n3034 3035 -9.0982103000000e+01\r\n3035 3035 -2.7862876000000e+01\r\n3036 3035  6.9542530000000e+00\r\n3037 3035  3.7281401000000e+00\r\n3039 3035 -7.9895138000000e-01\r\n3084 3035 -8.7638198000000e-01\r\n1930 3036  4.4393547000000e-01\r\n1931 3036 -7.1916234000000e-02\r\n1932 3036 -5.8544095000000e+00\r\n2986 3036  5.1803789000000e+00\r\n2987 3036 -8.3920606000000e-01\r\n2988 3036 -1.4513532000000e+00\r\n3033 3036 -1.6124393000000e+00\r\n3034 3036 -1.5379615000000e+02\r\n3035 3036  2.3639133000000e+01\r\n3036 3036  1.1755468000000e+01\r\n3037 3036  6.3020480000000e+00\r\n3038 3036 -1.0209131000000e+00\r\n3039 3036 -1.3505474000000e+00\r\n3084 3036 -1.4814361000000e+00\r\n1933 3037 -2.3929774000000e-03\r\n1935 3037 -2.4974195000000e-05\r\n2989 3037 -1.7678043000000e-02\r\n2991 3037 -4.3482484000000e-06\r\n3034 3037 -6.3985924000000e-04\r\n3036 3037 -4.8371457000000e-06\r\n3037 3037  1.2277994000000e+02\r\n3039 3037  3.3012322000000e-04\r\n3040 3037 -1.3774656000000e-02\r\n3042 3037 -4.3414042000000e-06\r\n3085 3037 -4.2021413000000e-04\r\n3087 3037 -4.3855448000000e-06\r\n1933 3038  2.4566396000000e-01\r\n1935 3038 -4.1247997000000e+00\r\n2989 3038  3.2319114000000e+00\r\n2991 3038 -7.1828335000000e-01\r\n3036 3038 -7.9895138000000e-01\r\n3037 3038 -7.8539113000000e+01\r\n3038 3038 -2.3411151000000e+01\r\n3039 3038  7.0979949000000e+00\r\n3040 3038  4.5718862000000e+00\r\n3042 3038 -7.1717987000000e-01\r\n3087 3038 -7.3615276000000e-01\r\n1933 3039  4.1527015000000e-01\r\n1934 3039 -6.7271826000000e-02\r\n1935 3039 -6.9725578000000e+00\r\n2989 3039  5.4632203000000e+00\r\n2990 3039 -8.8501622000000e-01\r\n2991 3039 -1.2141856000000e+00\r\n3036 3039 -1.3505474000000e+00\r\n3037 3039 -1.3276245000000e+02\r\n3038 3039  2.0420065000000e+01\r\n3039 3039  1.1998445000000e+01\r\n3040 3039  7.7283124000000e+00\r\n3041 3039 -1.2519506000000e+00\r\n3042 3039 -1.2123202000000e+00\r\n3087 3039 -1.2443918000000e+00\r\n1936 3040 -2.5759938000000e-03\r\n1938 3040 -2.6884237000000e-05\r\n2992 3040 -2.9847192000000e-02\r\n2994 3040 -4.3515740000000e-06\r\n3037 3040 -4.1598466000000e-04\r\n3039 3040 -4.3414042000000e-06\r\n3040 3040  1.1694874000000e+02\r\n3042 3040  3.1784780000000e-04\r\n3043 3040 -2.2480601000000e-02\r\n3045 3040 -4.4513079000000e-06\r\n3088 3040 -4.0819198000000e-04\r\n3090 3040 -4.2600762000000e-06\r\n1936 3041  2.5344182000000e-01\r\n1938 3041 -4.3324235000000e+00\r\n2992 3041  3.9093144000000e+00\r\n2994 3041 -7.0136448000000e-01\r\n3039 3041 -7.1717987000000e-01\r\n3040 3041 -7.6761331000000e+01\r\n3041 3041 -2.2302868000000e+01\r\n3042 3041  7.1720149000000e+00\r\n3043 3041  5.4747474000000e+00\r\n3045 3041 -7.1747312000000e-01\r\n3090 3041 -7.0106833000000e-01\r\n1936 3042  4.2841805000000e-01\r\n1937 3042 -6.9400666000000e-02\r\n1938 3042 -7.3235287000000e+00\r\n2992 3042  6.6083050000000e+00\r\n2993 3042 -1.0704982000000e+00\r\n2994 3042 -1.1855865000000e+00\r\n3039 3042 -1.2123202000000e+00\r\n3040 3042 -1.2975735000000e+02\r\n3041 3042  1.9968614000000e+01\r\n3042 3042  1.2123573000000e+01\r\n3043 3042  9.2545130000000e+00\r\n3044 3042 -1.4991650000000e+00\r\n3045 3042 -1.2128166000000e+00\r\n3090 3042 -1.1850859000000e+00\r\n1939 3043 -2.5229950000000e-03\r\n1941 3043 -2.6331117000000e-05\r\n2995 3043 -4.3417094000000e-02\r\n2997 3043 -4.7055193000000e-06\r\n3040 3043 -4.2651542000000e-04\r\n3042 3043 -4.4513079000000e-06\r\n3043 3043  1.2281008000000e+02\r\n3045 3043  3.3250862000000e-04\r\n3046 3043 -3.3660399000000e-02\r\n3048 3043 -5.1997375000000e-06\r\n3091 3043 -4.3909792000000e-04\r\n3093 3043 -4.5826245000000e-06\r\n1939 3044  3.3584186000000e-01\r\n1941 3044 -4.1223643000000e+00\r\n2995 3044  4.9387264000000e+00\r\n2997 3044 -7.3677436000000e-01\r\n3042 3044 -7.1747312000000e-01\r\n3043 3044 -8.2076518000000e+01\r\n3044 3044 -2.3425410000000e+01\r\n3045 3044  7.1290006000000e+00\r\n3046 3044  6.3323798000000e+00\r\n3048 3044 -8.1418837000000e-01\r\n3093 3044 -7.3556628000000e-01\r\n1939 3045  5.6770671000000e-01\r\n1940 3045 -9.1962831000000e-02\r\n1941 3045 -6.9684400000000e+00\r\n2995 3045  8.3484175000000e+00\r\n2996 3045 -1.3523605000000e+00\r\n2997 3045 -1.2454426000000e+00\r\n3042 3045 -1.2128166000000e+00\r\n3043 3045 -1.3874205000000e+02\r\n3044 3045  2.1352934000000e+01\r\n3045 3045  1.2050855000000e+01\r\n3046 3045  1.0704248000000e+01\r\n3047 3045 -1.7339814000000e+00\r\n3048 3045 -1.3763031000000e+00\r\n3093 3045 -1.2434005000000e+00\r\n1942 3046 -2.0993909000000e-03\r\n1944 3046 -2.1910194000000e-05\r\n2998 3046 -7.2043370000000e-02\r\n3000 3046 -5.9875571000000e-06\r\n3043 3046 -4.9822845000000e-04\r\n3045 3046 -5.1997375000000e-06\r\n3046 3046  1.5203491000000e+02\r\n3048 3046  4.0139243000000e-04\r\n3049 3046 -1.7673544000000e-02\r\n3051 3046 -6.7841610000000e-06\r\n3094 3046 -5.6341016000000e-04\r\n3096 3046 -5.8800034000000e-06\r\n1942 3047  5.1172148000000e-01\r\n1944 3047 -3.3342396000000e+00\r\n2998 3047  7.0358413000000e+00\r\n3000 3047 -9.1161978000000e-01\r\n3045 3047 -8.1418837000000e-01\r\n3046 3047 -9.9703530000000e+01\r\n3047 3047 -2.9011120000000e+01\r\n3048 3047  7.0073651000000e+00\r\n3049 3047  4.9196764000000e+00\r\n3051 3047 -1.0329272000000e+00\r\n3096 3047 -9.1112511000000e-01\r\n1942 3048  8.6501399000000e-01\r\n1943 3048 -1.4012105000000e-01\r\n1944 3048 -5.6361987000000e+00\r\n2998 3048  1.1893386000000e+01\r\n2999 3048 -1.9265743000000e+00\r\n3000 3048 -1.5410021000000e+00\r\n3045 3048 -1.3763031000000e+00\r\n3046 3048 -1.6853885000000e+02\r\n3047 3048  2.5891734000000e+01\r\n3048 3048  1.1845249000000e+01\r\n3049 3048  8.3162210000000e+00\r\n3050 3048 -1.3471200000000e+00\r\n3051 3048 -1.7460601000000e+00\r\n3096 3048 -1.5401659000000e+00\r\n1945 3049 -1.6332782000000e-03\r\n1947 3049 -1.7045630000000e-05\r\n3001 3049 -2.1583579000000e-01\r\n3003 3049 -7.9380892000000e-06\r\n3046 3049 -6.5004474000000e-04\r\n3048 3049 -6.7841610000000e-06\r\n3049 3049  1.9890370000000e+02\r\n3051 3049  5.0451300000000e-04\r\n3097 3049 -7.3674286000000e-04\r\n3099 3049 -7.6889818000000e-06\r\n1945 3050  6.5701978000000e-01\r\n1947 3050 -2.5502210000000e+00\r\n3001 3050  1.2586195000000e+01\r\n3003 3050 -1.1886468000000e+00\r\n3048 3050 -1.0329272000000e+00\r\n3049 3050 -1.2731025000000e+02\r\n3050 3050 -3.7945497000000e+01\r\n3051 3050  5.9488665000000e+00\r\n3099 3050 -1.1727986000000e+00\r\n1945 3051  1.1106253000000e+00\r\n1946 3051 -1.7990509000000e-01\r\n1947 3051 -4.3108899000000e+00\r\n3001 3051  2.1275686000000e+01\r\n3002 3051 -3.4463504000000e+00\r\n3003 3051 -2.0092868000000e+00\r\n3048 3051 -1.7460601000000e+00\r\n3049 3051 -2.1520507000000e+02\r\n3050 3051  3.2997687000000e+01\r\n3051 3051  1.0055958000000e+01\r\n3099 3051 -1.9824976000000e+00\r\n3052 3052  1.0000000000000e+00\r\n3053 3053  1.0000000000000e+00\r\n3054 3054  1.0000000000000e+00\r\n3055 3055  1.0000000000000e+00\r\n3056 3056  1.0000000000000e+00\r\n3057 3057  1.0000000000000e+00\r\n3058 3058  1.0000000000000e+00\r\n3059 3059  1.0000000000000e+00\r\n3060 3060  1.0000000000000e+00\r\n3061 3061  1.0000000000000e+00\r\n3062 3062  1.0000000000000e+00\r\n3063 3063  1.0000000000000e+00\r\n3064 3064  1.0000000000000e+00\r\n3065 3065  1.0000000000000e+00\r\n3066 3066  1.0000000000000e+00\r\n3067 3067  1.0000000000000e+00\r\n3068 3068  1.0000000000000e+00\r\n3069 3069  1.0000000000000e+00\r\n3070 3070  1.0000000000000e+00\r\n3071 3071  1.0000000000000e+00\r\n3072 3072  1.0000000000000e+00\r\n3073 3073  1.0000000000000e+00\r\n3074 3074  1.0000000000000e+00\r\n3075 3075  1.0000000000000e+00\r\n1972 3076 -1.6016700000000e-03\r\n1974 3076 -1.6715752000000e-05\r\n3028 3076 -5.8803400000000e-04\r\n3030 3076 -6.1369889000000e-06\r\n3076 3076  1.7538637000000e+02\r\n3078 3076  4.4541420000000e-04\r\n3079 3076 -5.8597202000000e-04\r\n3081 3076 -6.1154691000000e-06\r\n3124 3076 -4.3665739000000e-03\r\n3126 3076 -6.0994334000000e-06\r\n1972 3077  2.9235146000000e-01\r\n1974 3077 -2.8815324000000e+00\r\n3028 3077  1.6458959000000e+00\r\n3030 3077 -1.0516017000000e+00\r\n3076 3077 -1.0373450000000e+02\r\n3077 3077 -3.3417286000000e+01\r\n3078 3077  6.0387736000000e+00\r\n3079 3077  1.0591455000000e+00\r\n3081 3077 -1.0501400000000e+00\r\n3126 3077 -1.0517574000000e+00\r\n1972 3078  4.9419092000000e-01\r\n1973 3078 -8.0058621000000e-02\r\n1974 3078 -4.8709424000000e+00\r\n3028 3078  2.7822224000000e+00\r\n3029 3078 -4.5071831000000e-01\r\n3030 3078 -1.7776276000000e+00\r\n3076 3078 -1.7535280000000e+02\r\n3077 3078  2.6920936000000e+01\r\n3078 3078  1.0207943000000e+01\r\n3079 3078  1.7903796000000e+00\r\n3080 3078 -2.9004039000000e-01\r\n3081 3078 -1.7751567000000e+00\r\n3126 3078 -1.7778907000000e+00\r\n1975 3079 -1.6101520000000e-03\r\n1977 3079 -1.6804275000000e-05\r\n3031 3079 -8.7696541000000e-03\r\n3033 3079 -6.1242653000000e-06\r\n3076 3079 -2.5780045000000e-02\r\n3078 3079 -6.1154691000000e-06\r\n3079 3079  1.7541622000000e+02\r\n3081 3079  4.5101433000000e-04\r\n3082 3079 -5.3715474000000e-04\r\n3084 3079 -5.6059899000000e-06\r\n3127 3079 -5.8534991000000e-03\r\n3129 3079 -6.0209255000000e-06\r\n1975 3080  2.7282565000000e-01\r\n1977 3080 -2.8857599000000e+00\r\n3031 3080  2.3230251000000e+00\r\n3033 3080 -1.0517250000000e+00\r\n3078 3080 -1.0501400000000e+00\r\n3079 3080 -1.0539655000000e+02\r\n3080 3080 -3.3422495000000e+01\r\n3081 3080  6.9798114000000e+00\r\n3082 3080  2.0706710000000e+00\r\n3084 3080 -9.5452483000000e-01\r\n3129 3080 -1.0339173000000e+00\r\n1975 3081  4.6118410000000e-01\r\n1976 3081 -7.4711409000000e-02\r\n1977 3081 -4.8780844000000e+00\r\n3031 3081  3.9268383000000e+00\r\n3032 3081 -6.3614422000000e-01\r\n3033 3081 -1.7778344000000e+00\r\n3078 3081 -1.7751567000000e+00\r\n3079 3081 -1.7816218000000e+02\r\n3080 3081  2.7363394000000e+01\r\n3081 3081  1.1798665000000e+01\r\n3082 3081  3.5002593000000e+00\r\n3083 3081 -5.6703886000000e-01\r\n3084 3081 -1.6135274000000e+00\r\n3129 3081 -1.7477327000000e+00\r\n1978 3082 -1.9480962000000e-03\r\n1980 3082 -2.0331213000000e-05\r\n3034 3082 -6.0100663000000e-03\r\n3036 3082 -5.1464957000000e-06\r\n3079 3082 -2.7000336000000e-02\r\n3081 3082 -5.6059899000000e-06\r\n3082 3082  1.4617357000000e+02\r\n3084 3082  3.8278450000000e-04\r\n3085 3082 -4.5616848000000e-04\r\n3087 3082 -4.7607806000000e-06\r\n3130 3082 -4.7816925000000e-04\r\n3132 3082 -4.9903907000000e-06\r\n1978 3083  2.6258576000000e-01\r\n1980 3083 -3.4613003000000e+00\r\n3034 3083  2.6515217000000e+00\r\n3036 3083 -8.7638198000000e-01\r\n3081 3083 -9.5452483000000e-01\r\n3082 3083 -8.9727004000000e+01\r\n3083 3083 -2.7858703000000e+01\r\n3084 3083  6.9529221000000e+00\r\n3085 3083  2.8803403000000e+00\r\n3087 3083 -7.9904805000000e-01\r\n3132 3083 -8.5854366000000e-01\r\n1978 3084  4.4387497000000e-01\r\n1979 3084 -7.1906941000000e-02\r\n1980 3084 -5.8509821000000e+00\r\n3034 3084  4.4821323000000e+00\r\n3035 3084 -7.2609731000000e-01\r\n3036 3084 -1.4814361000000e+00\r\n3081 3084 -1.6135274000000e+00\r\n3082 3084 -1.5167453000000e+02\r\n3083 3084  2.3305832000000e+01\r\n3084 3084  1.1753218000000e+01\r\n3085 3084  4.8689272000000e+00\r\n3086 3084 -7.8875738000000e-01\r\n3087 3084 -1.3507108000000e+00\r\n3132 3084 -1.4512822000000e+00\r\n1981 3085 -2.3544364000000e-03\r\n1983 3085 -2.4571963000000e-05\r\n3037 3085 -9.3922807000000e-03\r\n3039 3085 -4.3855448000000e-06\r\n3082 3085 -5.3424284000000e-03\r\n3084 3085 -4.7607806000000e-06\r\n3085 3085  1.2277133000000e+02\r\n3087 3085  3.2944068000000e-04\r\n3088 3085 -4.0755025000000e-03\r\n3090 3085 -4.2696781000000e-06\r\n3133 3085 -4.0399608000000e-04\r\n3135 3085 -4.2162858000000e-06\r\n1981 3086  2.4204843000000e-01\r\n1983 3086 -4.1229794000000e+00\r\n3037 3086  3.0086929000000e+00\r\n3039 3086 -7.3615276000000e-01\r\n3084 3086 -7.9904805000000e-01\r\n3085 3086 -7.7362189000000e+01\r\n3086 3086 -2.3406774000000e+01\r\n3087 3086  7.0957632000000e+00\r\n3088 3086  3.6156603000000e+00\r\n3090 3086 -7.1672088000000e-01\r\n3135 3086 -7.1823623000000e-01\r\n1981 3087  4.0915839000000e-01\r\n1982 3087 -6.6282403000000e-02\r\n1983 3087 -6.9694796000000e+00\r\n3037 3087  5.0858910000000e+00\r\n3038 3087 -8.2389872000000e-01\r\n3039 3087 -1.2443918000000e+00\r\n3084 3087 -1.3507108000000e+00\r\n3085 3087 -1.3077296000000e+02\r\n3086 3087  2.0108738000000e+01\r\n3087 3087  1.1994671000000e+01\r\n3088 3087  6.1119084000000e+00\r\n3089 3087 -9.9011034000000e-01\r\n3090 3087 -1.2115442000000e+00\r\n3135 3087 -1.2141058000000e+00\r\n1984 3088 -2.5253548000000e-03\r\n1986 3088 -2.6355745000000e-05\r\n3040 3088 -1.8423678000000e-02\r\n3042 3088 -4.2600762000000e-06\r\n3085 3088 -4.0911202000000e-04\r\n3087 3088 -4.2696781000000e-06\r\n3088 3088  1.1692724000000e+02\r\n3090 3088  3.1697125000000e-04\r\n3091 3088 -7.4196533000000e-03\r\n3093 3088 -4.3598154000000e-06\r\n3136 3088 -3.9935147000000e-04\r\n3138 3088 -4.1678126000000e-06\r\n1984 3089  2.3972266000000e-01\r\n1986 3089 -4.3366092000000e+00\r\n3040 3089  3.7977394000000e+00\r\n3042 3089 -7.0106833000000e-01\r\n3087 3089 -7.1672088000000e-01\r\n3088 3089 -7.5851741000000e+01\r\n3089 3089 -2.2298205000000e+01\r\n3090 3089  7.1752949000000e+00\r\n3091 3089  4.6838793000000e+00\r\n3093 3089 -7.1750870000000e-01\r\n3138 3089 -7.0088425000000e-01\r\n1984 3090  4.0522718000000e-01\r\n1985 3090 -6.5644740000000e-02\r\n1986 3090 -7.3306042000000e+00\r\n3040 3090  6.4196986000000e+00\r\n3041 3090 -1.0399585000000e+00\r\n3042 3090 -1.1850859000000e+00\r\n3087 3090 -1.2115442000000e+00\r\n3088 3090 -1.2821978000000e+02\r\n3089 3090  1.9731273000000e+01\r\n3090 3090  1.2129118000000e+01\r\n3091 3090  7.9176295000000e+00\r\n3092 3090 -1.2826157000000e+00\r\n3093 3090 -1.2128767000000e+00\r\n3138 3090 -1.1847747000000e+00\r\n1987 3091 -2.4642846000000e-03\r\n1989 3091 -2.5718390000000e-05\r\n3043 3091 -3.4769833000000e-02\r\n3045 3091 -4.5826245000000e-06\r\n3088 3091 -4.1774879000000e-04\r\n3090 3091 -4.3598154000000e-06\r\n3091 3091  1.2283951000000e+02\r\n3093 3091  3.3150008000000e-04\r\n3094 3091 -6.7005388000000e-02\r\n3096 3091 -5.0763157000000e-06\r\n3139 3091 -4.3380501000000e-04\r\n3141 3091 -4.5273854000000e-06\r\n1987 3092  2.8433118000000e-01\r\n1989 3092 -4.1274186000000e+00\r\n3043 3092  4.7955485000000e+00\r\n3045 3092 -7.3556628000000e-01\r\n3090 3092 -7.1750870000000e-01\r\n3091 3092 -8.3210913000000e+01\r\n3092 3092 -2.3421014000000e+01\r\n3093 3092  7.1502657000000e+00\r\n3094 3092  7.6551978000000e+00\r\n3096 3092 -8.1481601000000e-01\r\n3141 3092 -7.5232399000000e-01\r\n1987 3093  4.8063314000000e-01\r\n1988 3093 -7.7858981000000e-02\r\n1989 3093 -6.9769843000000e+00\r\n3043 3093  8.1063905000000e+00\r\n3044 3093 -1.3131747000000e+00\r\n3045 3093 -1.2434005000000e+00\r\n3090 3093 -1.2128767000000e+00\r\n3091 3093 -1.4065965000000e+02\r\n3092 3093  2.1674765000000e+01\r\n3093 3093  1.2086803000000e+01\r\n3094 3093  1.2940339000000e+01\r\n3095 3093 -2.0962386000000e+00\r\n3096 3093 -1.3773642000000e+00\r\n3141 3093 -1.2717276000000e+00\r\n1990 3094 -2.0595097000000e-03\r\n1992 3094 -2.1493975000000e-05\r\n3046 3094 -5.8206311000000e-03\r\n3048 3094 -5.8800034000000e-06\r\n3091 3094 -4.8640242000000e-04\r\n3093 3094 -5.0763157000000e-06\r\n3094 3094  1.5197500000000e+02\r\n3096 3094  3.9466216000000e-04\r\n3097 3094 -1.6491555000000e-02\r\n3099 3094 -6.5805009000000e-06\r\n1990 3095  3.8066337000000e-01\r\n1992 3095 -3.3292502000000e+00\r\n3046 3095  4.4665247000000e+00\r\n3048 3095 -9.1112511000000e-01\r\n3093 3095 -8.1481601000000e-01\r\n3094 3095 -9.6579452000000e+01\r\n3095 3095 -2.9003616000000e+01\r\n3096 3095  6.0781023000000e+00\r\n3097 3095  4.4853469000000e+00\r\n3099 3095 -1.0196493000000e+00\r\n1990 3096  6.4347336000000e-01\r\n1991 3096 -1.0423552000000e-01\r\n1992 3096 -5.6277646000000e+00\r\n3046 3096  7.5502134000000e+00\r\n3047 3096 -1.2230505000000e+00\r\n3048 3096 -1.5401659000000e+00\r\n3093 3096 -1.3773642000000e+00\r\n3094 3096 -1.6325790000000e+02\r\n3095 3096  2.5055078000000e+01\r\n3096 3096  1.0274423000000e+01\r\n3097 3096  7.5820305000000e+00\r\n3098 3096 -1.2282045000000e+00\r\n3099 3096 -1.7236152000000e+00\r\n1993 3097 -1.6513683000000e-03\r\n1995 3097 -1.7234427000000e-05\r\n3049 3097 -8.5913082000000e-03\r\n3051 3097 -7.6889818000000e-06\r\n3094 3097 -6.3053043000000e-04\r\n3096 3097 -6.5805009000000e-06\r\n3097 3097  1.9286305000000e+02\r\n3099 3097  4.8288283000000e-04\r\n1993 3098  4.3902760000000e-01\r\n1995 3098 -2.6270897000000e+00\r\n3049 3098  6.1762049000000e+00\r\n3051 3098 -1.1727986000000e+00\r\n3096 3098 -1.0196493000000e+00\r\n3097 3098 -1.1734177000000e+02\r\n3098 3098 -3.6819304000000e+01\r\n3099 3098  4.8236805000000e+00\r\n1993 3099  7.4213181000000e-01\r\n1994 3099 -1.2021593000000e-01\r\n1995 3099 -4.4408299000000e+00\r\n3049 3099  1.0440251000000e+01\r\n3050 3099 -1.6911879000000e+00\r\n3051 3099 -1.9824976000000e+00\r\n3096 3099 -1.7236152000000e+00\r\n3097 3099 -1.9835441000000e+02\r\n3098 3099  3.0348281000000e+01\r\n3099 3099  8.1539458000000e+00\r\n3100 3100  1.0000000000000e+00\r\n3101 3101  1.0000000000000e+00\r\n3102 3102  1.0000000000000e+00\r\n3103 3103  1.0000000000000e+00\r\n3104 3104  1.0000000000000e+00\r\n3105 3105  1.0000000000000e+00\r\n3106 3106  1.0000000000000e+00\r\n3107 3107  1.0000000000000e+00\r\n3108 3108  1.0000000000000e+00\r\n3109 3109  1.0000000000000e+00\r\n3110 3110  1.0000000000000e+00\r\n3111 3111  1.0000000000000e+00\r\n3112 3112  1.0000000000000e+00\r\n3113 3113  1.0000000000000e+00\r\n3114 3114  1.0000000000000e+00\r\n3115 3115  1.0000000000000e+00\r\n3116 3116  1.0000000000000e+00\r\n3117 3117  1.0000000000000e+00\r\n3118 3118  1.0000000000000e+00\r\n3119 3119  1.0000000000000e+00\r\n3120 3120  1.0000000000000e+00\r\n3121 3121  1.0000000000000e+00\r\n3122 3122  1.0000000000000e+00\r\n3123 3123  1.0000000000000e+00\r\n2020 3124 -1.5936846000000e-03\r\n2022 3124 -1.6632414000000e-05\r\n3076 3124 -5.8443551000000e-04\r\n3078 3124 -6.0994334000000e-06\r\n3124 3124  1.7538475000000e+02\r\n3126 3124  4.3905139000000e-04\r\n3127 3124 -5.7225107000000e-04\r\n3129 3124 -5.9722711000000e-06\r\n2020 3125  2.8891914000000e-01\r\n2022 3125 -2.8799247000000e+00\r\n3076 3125  1.1461200000000e+00\r\n3078 3125 -1.0517574000000e+00\r\n3124 3125 -1.0259257000000e+02\r\n3125 3125 -3.3414684000000e+01\r\n3126 3125  4.9679571000000e+00\r\n3127 3125  4.1685342000000e-01\r\n3129 3125 -1.0325340000000e+00\r\n2020 3126  4.8838892000000e-01\r\n2021 3126 -7.9118903000000e-02\r\n2022 3126 -4.8682248000000e+00\r\n3076 3126  1.9374013000000e+00\r\n3077 3126 -3.1385861000000e-01\r\n3078 3126 -1.7778907000000e+00\r\n3124 3126 -1.7342248000000e+02\r\n3125 3126  2.6614646000000e+01\r\n3126 3126  8.3978347000000e+00\r\n3127 3126  7.0464903000000e-01\r\n3128 3126 -1.1415300000000e-01\r\n3129 3126 -1.7453955000000e+00\r\n2023 3127 -1.6534664000000e-03\r\n2025 3127 -1.7256323000000e-05\r\n3079 3127 -5.7691304000000e-04\r\n3081 3127 -6.0209255000000e-06\r\n3124 3127 -2.3788469000000e-02\r\n3126 3127 -5.9722711000000e-06\r\n3127 3127  1.6955904000000e+02\r\n3129 3127  4.3679250000000e-04\r\n3130 3127 -5.1198579000000e-04\r\n3132 3127 -5.3433153000000e-06\r\n3175 3127 -5.3019016000000e-04\r\n3177 3127 -5.5333043000000e-06\r\n2023 3128  2.6840621000000e-01\r\n2025 3128 -2.9837693000000e+00\r\n3079 3128  1.7520136000000e+00\r\n3081 3128 -1.0339173000000e+00\r\n3126 3128 -1.0325340000000e+00\r\n3127 3128 -1.0061618000000e+02\r\n3128 3128 -3.2304568000000e+01\r\n3129 3128  6.9340649000000e+00\r\n3130 3128  1.2181112000000e+00\r\n3132 3128 -9.1916787000000e-01\r\n3177 3128 -9.6105850000000e-01\r\n2023 3129  4.5371354000000e-01\r\n2024 3129 -7.3501466000000e-02\r\n2025 3129 -5.0437600000000e+00\r\n3079 3129  2.9616017000000e+00\r\n3080 3129 -4.7977864000000e-01\r\n3081 3129 -1.7477327000000e+00\r\n3126 3129 -1.7453955000000e+00\r\n3127 3129 -1.7008148000000e+02\r\n3128 3129  2.6113754000000e+01\r\n3129 3129  1.1721336000000e+01\r\n3130 3129  2.0590938000000e+00\r\n3131 3129 -3.3357259000000e-01\r\n3132 3129 -1.5537603000000e+00\r\n3177 3129 -1.6245722000000e+00\r\n2026 3130 -2.0081412000000e-03\r\n2028 3130 -2.0957870000000e-05\r\n3082 3130 -3.4615309000000e-03\r\n3084 3130 -4.9903907000000e-06\r\n3127 3130 -3.3882048000000e-02\r\n3129 3130 -5.3433153000000e-06\r\n3130 3130  1.4033621000000e+02\r\n3132 3130  3.6857606000000e-04\r\n3133 3130 -4.2975731000000e-04\r\n3135 3130 -4.4851417000000e-06\r\n3178 3130 -4.3381469000000e-04\r\n3180 3130 -4.5274864000000e-06\r\n2026 3131  2.5495473000000e-01\r\n2028 3131 -3.6047923000000e+00\r\n3082 3131  2.1794546000000e+00\r\n3084 3131 -8.5854366000000e-01\r\n3129 3131 -9.1916787000000e-01\r\n3130 3131 -8.4868844000000e+01\r\n3131 3131 -2.6740796000000e+01\r\n3132 3131  6.9347739000000e+00\r\n3133 3131  1.8542489000000e+00\r\n3135 3131 -7.6395798000000e-01\r\n3180 3131 -7.8531531000000e-01\r\n2026 3132  4.3097547000000e-01\r\n2027 3132 -6.9817658000000e-02\r\n2028 3132 -6.0935410000000e+00\r\n3082 3132  3.6841500000000e+00\r\n3083 3132 -5.9682916000000e-01\r\n3084 3132 -1.4512822000000e+00\r\n3129 3132 -1.5537603000000e+00\r\n3130 3132 -1.4346229000000e+02\r\n3131 3132  2.2034918000000e+01\r\n3132 3132  1.1722541000000e+01\r\n3133 3132  3.1344224000000e+00\r\n3134 3132 -5.0777376000000e-01\r\n3135 3132 -1.2913946000000e+00\r\n3180 3132 -1.3274970000000e+00\r\n2029 3133 -2.4342564000000e-03\r\n2031 3133 -2.5405001000000e-05\r\n3085 3133 -1.1494214000000e-02\r\n3087 3133 -4.2162858000000e-06\r\n3130 3133 -1.4244710000000e-02\r\n3132 3133 -4.4851417000000e-06\r\n3133 3133  1.1693718000000e+02\r\n3135 3133  3.1589702000000e-04\r\n3136 3133 -3.9926474000000e-04\r\n3138 3133 -4.1669075000000e-06\r\n3181 3133 -3.8956671000000e-04\r\n3183 3133 -4.0656945000000e-06\r\n2029 3134  2.3759323000000e-01\r\n2031 3134 -4.3266793000000e+00\r\n3085 3134  2.6689809000000e+00\r\n3087 3134 -7.1823623000000e-01\r\n3132 3134 -7.6395798000000e-01\r\n3133 3134 -7.2342964000000e+01\r\n3134 3134 -2.2288761000000e+01\r\n3135 3134  7.2130763000000e+00\r\n3136 3134  2.2927909000000e+00\r\n3138 3134 -7.0065061000000e-01\r\n3183 3134 -7.0105282000000e-01\r\n2029 3135  4.0162735000000e-01\r\n2030 3135 -6.5062949000000e-02\r\n2031 3135 -7.3138141000000e+00\r\n3085 3135  4.5116426000000e+00\r\n3086 3135 -7.3087850000000e-01\r\n3087 3135 -1.2141058000000e+00\r\n3132 3135 -1.2913946000000e+00\r\n3133 3135 -1.2228847000000e+02\r\n3134 3135  1.8794041000000e+01\r\n3135 3135  1.2192977000000e+01\r\n3136 3135  3.8757313000000e+00\r\n3137 3135 -6.2786194000000e-01\r\n3138 3135 -1.1843791000000e+00\r\n3183 3135 -1.1850588000000e+00\r\n2032 3136 -2.4659475000000e-03\r\n2034 3136 -2.5735744000000e-05\r\n3088 3136 -1.8922096000000e-02\r\n3090 3136 -4.1678126000000e-06\r\n3133 3136 -4.5151370000000e-03\r\n3135 3136 -4.1669075000000e-06\r\n3136 3136  1.1693079000000e+02\r\n3138 3136  3.1609362000000e-04\r\n3139 3136 -1.3475450000000e-03\r\n3141 3136 -4.3649100000000e-06\r\n3184 3136 -3.9297458000000e-04\r\n3186 3136 -4.1012605000000e-06\r\n2032 3137  2.2961507000000e-01\r\n2034 3137 -4.3272116000000e+00\r\n3088 3137  3.8466372000000e+00\r\n3090 3137 -7.0088425000000e-01\r\n3135 3137 -7.0065061000000e-01\r\n3136 3137 -7.3470486000000e+01\r\n3137 3137 -2.2293510000000e+01\r\n3138 3137  7.1659987000000e+00\r\n3139 3137  2.2572397000000e+00\r\n3141 3137 -7.3402094000000e-01\r\n3186 3137 -7.0072984000000e-01\r\n2032 3138  3.8814131000000e-01\r\n2033 3138 -6.2877724000000e-02\r\n2034 3138 -7.3147185000000e+00\r\n3088 3138  6.5023555000000e+00\r\n3089 3138 -1.0533620000000e+00\r\n3090 3138 -1.1847747000000e+00\r\n3135 3138 -1.1843791000000e+00\r\n3136 3138 -1.2419451000000e+02\r\n3137 3138  1.9090994000000e+01\r\n3138 3138  1.2113403000000e+01\r\n3139 3138  3.8156380000000e+00\r\n3140 3138 -6.1812187000000e-01\r\n3141 3138 -1.2407890000000e+00\r\n3186 3138 -1.1845137000000e+00\r\n2035 3139 -2.2708331000000e-03\r\n2037 3139 -2.3699441000000e-05\r\n3091 3139 -2.6702316000000e-02\r\n3093 3139 -4.5273854000000e-06\r\n3136 3139 -4.1823695000000e-04\r\n3138 3139 -4.3649100000000e-06\r\n3139 3139  1.2861869000000e+02\r\n3141 3139  3.3816896000000e-04\r\n3187 3139 -4.4700789000000e-04\r\n3189 3139 -4.6651766000000e-06\r\n2035 3140  2.3735622000000e-01\r\n2037 3140 -3.9368051000000e+00\r\n3091 3140  6.7264661000000e+00\r\n3093 3140 -7.5232399000000e-01\r\n3138 3140 -7.3402094000000e-01\r\n3139 3140 -8.0808617000000e+01\r\n3140 3140 -2.4527093000000e+01\r\n3141 3140  6.2140349000000e+00\r\n3189 3140 -7.8813147000000e-01\r\n2035 3141  4.0122669000000e-01\r\n2036 3141 -6.4997097000000e-02\r\n2037 3141 -6.6547709000000e+00\r\n3091 3141  1.1370411000000e+01\r\n3092 3141 -1.8419604000000e+00\r\n3093 3141 -1.2717276000000e+00\r\n3138 3141 -1.2407890000000e+00\r\n3139 3141 -1.3659880000000e+02\r\n3140 3141  2.0987143000000e+01\r\n3141 3141  1.0504199000000e+01\r\n3189 3141 -1.3322566000000e+00\r\n3142 3142  1.0000000000000e+00\r\n3143 3143  1.0000000000000e+00\r\n3144 3144  1.0000000000000e+00\r\n3145 3145  1.0000000000000e+00\r\n3146 3146  1.0000000000000e+00\r\n3147 3147  1.0000000000000e+00\r\n3148 3148  1.0000000000000e+00\r\n3149 3149  1.0000000000000e+00\r\n3150 3150  1.0000000000000e+00\r\n3151 3151  1.0000000000000e+00\r\n3152 3152  1.0000000000000e+00\r\n3153 3153  1.0000000000000e+00\r\n3154 3154  1.0000000000000e+00\r\n3155 3155  1.0000000000000e+00\r\n3156 3156  1.0000000000000e+00\r\n3157 3157  1.0000000000000e+00\r\n3158 3158  1.0000000000000e+00\r\n3159 3159  1.0000000000000e+00\r\n3160 3160  1.0000000000000e+00\r\n3161 3161  1.0000000000000e+00\r\n3162 3162  1.0000000000000e+00\r\n3163 3163  1.0000000000000e+00\r\n3164 3164  1.0000000000000e+00\r\n3165 3165  1.0000000000000e+00\r\n3166 3166  1.0000000000000e+00\r\n3167 3167  1.0000000000000e+00\r\n3168 3168  1.0000000000000e+00\r\n3169 3169  1.0000000000000e+00\r\n3170 3170  1.0000000000000e+00\r\n3171 3171  1.0000000000000e+00\r\n3172 3172  1.0000000000000e+00\r\n3173 3173  1.0000000000000e+00\r\n3174 3174  1.0000000000000e+00\r\n2071 3175 -1.8357689000000e-03\r\n2073 3175 -1.9158914000000e-05\r\n3127 3175 -3.0789269000000e-03\r\n3129 3175 -5.5333043000000e-06\r\n3175 3175  1.5200117000000e+02\r\n3177 3175  3.8501504000000e-04\r\n3178 3175 -4.4948165000000e-04\r\n3180 3175 -4.6909939000000e-06\r\n2071 3176  2.6104710000000e-01\r\n2073 3176 -3.3275135000000e+00\r\n3127 3176  1.0344195000000e+00\r\n3129 3176 -9.6105850000000e-01\r\n3175 3176 -8.8913889000000e+01\r\n3176 3176 -2.8961215000000e+01\r\n3177 3176  5.1054270000000e+00\r\n3178 3176  3.1225563000000e-01\r\n3180 3176 -8.1361201000000e-01\r\n2071 3177  4.4127371000000e-01\r\n2072 3177 -7.1486405000000e-02\r\n2073 3177 -5.6248248000000e+00\r\n3127 3177  1.7485815000000e+00\r\n3128 3177 -2.8327046000000e-01\r\n3129 3177 -1.6245722000000e+00\r\n3175 3177 -1.5029994000000e+02\r\n3176 3177  2.3061769000000e+01\r\n3177 3177  8.6302077000000e+00\r\n3178 3177  5.2783656000000e-01\r\n3179 3177 -8.5509590000000e-02\r\n3180 3177 -1.3753288000000e+00\r\n2074 3178 -2.2750497000000e-03\r\n2076 3178 -2.3743447000000e-05\r\n3130 3178 -2.3480074000000e-03\r\n3132 3178 -4.5274864000000e-06\r\n3175 3178 -2.9814492000000e-02\r\n3177 3178 -4.6909939000000e-06\r\n3178 3178  1.2279692000000e+02\r\n3180 3178  3.2847402000000e-04\r\n3181 3178 -3.9887265000000e-04\r\n3183 3178 -4.1628155000000e-06\r\n3226 3178 -3.9392972000000e-04\r\n3228 3178 -4.1112288000000e-06\r\n2074 3179  2.4712686000000e-01\r\n2076 3179 -4.1177292000000e+00\r\n3130 3179  1.5845342000000e+00\r\n3132 3179 -7.8531531000000e-01\r\n3177 3179 -8.1361201000000e-01\r\n3178 3179 -7.3378153000000e+01\r\n3179 3179 -2.3395689000000e+01\r\n3180 3179  7.1552419000000e+00\r\n3181 3179  1.0353616000000e+00\r\n3183 3179 -7.1773490000000e-01\r\n3228 3179 -7.1822949000000e-01\r\n2074 3180  4.1774324000000e-01\r\n2075 3180 -6.7674367000000e-02\r\n2076 3180 -6.9606094000000e+00\r\n3130 3180  2.6784966000000e+00\r\n3131 3180 -4.3391621000000e-01\r\n3132 3180 -1.3274970000000e+00\r\n3177 3180 -1.3753288000000e+00\r\n3178 3180 -1.2403843000000e+02\r\n3179 3180  1.9045226000000e+01\r\n3180 3180  1.2095220000000e+01\r\n3181 3180  1.7501753000000e+00\r\n3182 3180 -2.8352823000000e-01\r\n3183 3180 -1.2132591000000e+00\r\n3228 3180 -1.2140951000000e+00\r\n2077 3181 -2.4024521000000e-03\r\n2079 3181 -2.5073077000000e-05\r\n3133 3181 -4.6378412000000e-03\r\n3135 3181 -4.0656945000000e-06\r\n3178 3181 -1.5979302000000e-02\r\n3180 3181 -4.1628155000000e-06\r\n3181 3181  1.1693584000000e+02\r\n3183 3181  3.1502718000000e-04\r\n3184 3181 -3.9303164000000e-04\r\n3186 3181 -4.1018560000000e-06\r\n3229 3181 -6.3020376000000e-04\r\n3231 3181 -4.0657214000000e-06\r\n2077 3182  2.2554864000000e-01\r\n2079 3182 -4.3233388000000e+00\r\n3133 3182  2.1047377000000e+00\r\n3135 3182 -7.0105282000000e-01\r\n3180 3182 -7.1773490000000e-01\r\n3181 3182 -7.1087844000000e+01\r\n3182 3182 -2.2285431000000e+01\r\n3183 3182  7.1463879000000e+00\r\n3184 3182  1.6093254000000e+00\r\n3186 3182 -7.0076116000000e-01\r\n3231 3182 -7.0100227000000e-01\r\n2077 3183  3.8126714000000e-01\r\n2078 3183 -6.1765073000000e-02\r\n2079 3183 -7.3081667000000e+00\r\n3133 3183  3.5578461000000e+00\r\n3134 3183 -5.7636917000000e-01\r\n3135 3183 -1.1850588000000e+00\r\n3180 3183 -1.2132591000000e+00\r\n3181 3183 -1.2016681000000e+02\r\n3182 3183  1.8458632000000e+01\r\n3183 3183  1.2080246000000e+01\r\n3184 3183  2.7204018000000e+00\r\n3185 3183 -4.4070362000000e-01\r\n3186 3183 -1.1845658000000e+00\r\n3231 3183 -1.1849736000000e+00\r\n2080 3184 -2.4271249000000e-03\r\n2082 3184 -2.5330574000000e-05\r\n3136 3184 -4.7311540000000e-03\r\n3138 3184 -4.1012605000000e-06\r\n3181 3184 -4.6023346000000e-03\r\n3183 3184 -4.1018560000000e-06\r\n3184 3184  1.1692209000000e+02\r\n3186 3184  3.1582529000000e-04\r\n3187 3184 -4.2520237000000e-04\r\n3189 3184 -4.4376044000000e-06\r\n3232 3184 -1.8415784000000e-03\r\n3234 3184 -4.2967900000000e-06\r\n2080 3185  2.2919201000000e-01\r\n2082 3185 -4.3272245000000e+00\r\n3136 3185  2.7875323000000e+00\r\n3138 3185 -7.0072984000000e-01\r\n3183 3185 -7.0076116000000e-01\r\n3184 3185 -7.2281303000000e+01\r\n3185 3185 -2.2288936000000e+01\r\n3186 3185  7.2148813000000e+00\r\n3187 3185  2.1212159000000e+00\r\n3189 3185 -7.4960785000000e-01\r\n3234 3185 -7.3405848000000e-01\r\n2080 3186  3.8742616000000e-01\r\n2081 3186 -6.2762455000000e-02\r\n2082 3186 -7.3147403000000e+00\r\n3136 3186  4.7120446000000e+00\r\n3137 3186 -7.6334412000000e-01\r\n3138 3186 -1.1845137000000e+00\r\n3183 3186 -1.1845658000000e+00\r\n3184 3186 -1.2218432000000e+02\r\n3185 3186  1.8776741000000e+01\r\n3186 3186  1.2196034000000e+01\r\n3187 3186  3.5857033000000e+00\r\n3188 3186 -5.8087853000000e-01\r\n3189 3186 -1.2671371000000e+00\r\n3234 3186 -1.2408525000000e+00\r\n2083 3187 -2.1340685000000e-03\r\n2085 3187 -2.2272105000000e-05\r\n3139 3187 -9.4670244000000e-03\r\n3141 3187 -4.6651766000000e-06\r\n3184 3187 -3.4153136000000e-03\r\n3186 3187 -4.4376044000000e-06\r\n3187 3187  1.3445432000000e+02\r\n3189 3187  3.4596464000000e-04\r\n2083 3188  2.2916280000000e-01\r\n2085 3188 -3.7627684000000e+00\r\n3139 3188  3.3285979000000e+00\r\n3141 3188 -7.8813147000000e-01\r\n3186 3188 -7.4960785000000e-01\r\n3187 3188 -8.0766249000000e+01\r\n3188 3188 -2.5636890000000e+01\r\n3189 3188  5.3033841000000e+00\r\n2083 3189  3.8737656000000e-01\r\n2084 3189 -6.2754044000000e-02\r\n2085 3189 -6.3605797000000e+00\r\n3139 3189  5.6266585000000e+00\r\n3140 3189 -9.1150468000000e-01\r\n3141 3189 -1.3322566000000e+00\r\n3186 3189 -1.2671371000000e+00\r\n3187 3189 -1.3652718000000e+02\r\n3188 3189  2.0936337000000e+01\r\n3189 3189  8.9648357000000e+00\r\n3190 3190  1.0000000000000e+00\r\n3191 3191  1.0000000000000e+00\r\n3192 3192  1.0000000000000e+00\r\n3193 3193  1.0000000000000e+00\r\n3194 3194  1.0000000000000e+00\r\n3195 3195  1.0000000000000e+00\r\n3196 3196  1.0000000000000e+00\r\n3197 3197  1.0000000000000e+00\r\n3198 3198  1.0000000000000e+00\r\n3199 3199  1.0000000000000e+00\r\n3200 3200  1.0000000000000e+00\r\n3201 3201  1.0000000000000e+00\r\n3202 3202  1.0000000000000e+00\r\n3203 3203  1.0000000000000e+00\r\n3204 3204  1.0000000000000e+00\r\n3205 3205  1.0000000000000e+00\r\n3206 3206  1.0000000000000e+00\r\n3207 3207  1.0000000000000e+00\r\n3208 3208  1.0000000000000e+00\r\n3209 3209  1.0000000000000e+00\r\n3210 3210  1.0000000000000e+00\r\n3211 3211  1.0000000000000e+00\r\n3212 3212  1.0000000000000e+00\r\n3213 3213  1.0000000000000e+00\r\n3214 3214  1.0000000000000e+00\r\n3215 3215  1.0000000000000e+00\r\n3216 3216  1.0000000000000e+00\r\n3217 3217  1.0000000000000e+00\r\n3218 3218  1.0000000000000e+00\r\n3219 3219  1.0000000000000e+00\r\n3220 3220  1.0000000000000e+00\r\n3221 3221  1.0000000000000e+00\r\n3222 3222  1.0000000000000e+00\r\n3223 3223  1.0000000000000e+00\r\n3224 3224  1.0000000000000e+00\r\n3225 3225  1.0000000000000e+00\r\n2122 3226 -2.3706604000000e-03\r\n2124 3226 -2.4741284000000e-05\r\n3178 3226 -7.0890245000000e-04\r\n3180 3226 -4.1112288000000e-06\r\n3226 3226  1.1692746000000e+02\r\n3228 3226  3.1045107000000e-04\r\n3229 3226 -3.8566782000000e-04\r\n3231 3226 -4.0250039000000e-06\r\n3274 3226 -5.7017845000000e-03\r\n3276 3226 -4.0132230000000e-06\r\n2122 3227  2.2026949000000e-01\r\n2124 3227 -4.3217700000000e+00\r\n3178 3227  1.2629601000000e+00\r\n3180 3227 -7.1822949000000e-01\r\n3226 3227 -6.9220622000000e+01\r\n3227 3227 -2.2279374000000e+01\r\n3228 3227  6.4444803000000e+00\r\n3229 3227  5.8085413000000e-01\r\n3231 3227 -7.0091648000000e-01\r\n3276 3227 -7.0106907000000e-01\r\n2122 3228  3.7234355000000e-01\r\n2123 3228 -6.0319866000000e-02\r\n2124 3228 -7.3055200000000e+00\r\n3178 3228  2.1349078000000e+00\r\n3179 3228 -3.4585627000000e-01\r\n3180 3228 -1.2140951000000e+00\r\n3226 3228 -1.1701054000000e+02\r\n3227 3228  1.7962197000000e+01\r\n3228 3228  1.0893749000000e+01\r\n3229 3228  9.8187582000000e-01\r\n3230 3228 -1.5906444000000e-01\r\n3231 3228 -1.1848292000000e+00\r\n3276 3228 -1.1850872000000e+00\r\n2125 3229 -2.3783246000000e-03\r\n2127 3229 -2.4821271000000e-05\r\n3181 3229 -3.8956930000000e-04\r\n3183 3229 -4.0657214000000e-06\r\n3226 3229 -1.5054090000000e-02\r\n3228 3229 -4.0250039000000e-06\r\n3229 3229  1.1693855000000e+02\r\n3231 3229  3.1474105000000e-04\r\n3232 3229 -4.0678672000000e-04\r\n3234 3229 -4.2454102000000e-06\r\n3277 3229 -5.2020450000000e-03\r\n3279 3229 -4.0252116000000e-06\r\n2125 3230  2.1891350000000e-01\r\n2127 3230 -4.3212217000000e+00\r\n3181 3230  1.6629280000000e+00\r\n3183 3230 -7.0100227000000e-01\r\n3228 3230 -7.0091648000000e-01\r\n3229 3230 -7.0175975000000e+01\r\n3230 3230 -2.2282337000000e+01\r\n3231 3230  7.1610951000000e+00\r\n3232 3230  1.1416356000000e+00\r\n3234 3230 -7.3450310000000e-01\r\n3279 3230 -7.0095502000000e-01\r\n2125 3231  3.7005118000000e-01\r\n2126 3231 -5.9948420000000e-02\r\n2127 3231 -7.3045892000000e+00\r\n3181 3231  2.8110119000000e+00\r\n3182 3231 -4.5538492000000e-01\r\n3183 3231 -1.1849736000000e+00\r\n3228 3231 -1.1848292000000e+00\r\n3229 3231 -1.1862540000000e+02\r\n3230 3231  1.8216588000000e+01\r\n3231 3231  1.2105109000000e+01\r\n3232 3231  1.9298198000000e+00\r\n3233 3231 -3.1263150000000e-01\r\n3234 3231 -1.2416034000000e+00\r\n3279 3231 -1.1848937000000e+00\r\n2128 3232 -2.1769643000000e-03\r\n2130 3232 -2.2719784000000e-05\r\n3184 3232 -4.1170983000000e-04\r\n3186 3232 -4.2967900000000e-06\r\n3229 3232 -3.6404805000000e-03\r\n3231 3232 -4.2454102000000e-06\r\n3232 3232  1.2861005000000e+02\r\n3234 3232  3.3217568000000e-04\r\n2128 3233  2.1844699000000e-01\r\n2130 3233 -3.9304561000000e+00\r\n3184 3233  2.2861829000000e+00\r\n3186 3233 -7.3405848000000e-01\r\n3231 3233 -7.3450310000000e-01\r\n3232 3233 -7.6368722000000e+01\r\n3233 3233 -2.4513213000000e+01\r\n3234 3233  5.4017650000000e+00\r\n2128 3234  3.6926279000000e-01\r\n2129 3234 -5.9820451000000e-02\r\n2130 3234 -6.6440430000000e+00\r\n3184 3234  3.8645636000000e+00\r\n3185 3234 -6.2605803000000e-01\r\n3186 3234 -1.2408525000000e+00\r\n3231 3234 -1.2416034000000e+00\r\n3232 3234 -1.2909369000000e+02\r\n3233 3234  1.9805802000000e+01\r\n3234 3234  9.1311429000000e+00\r\n3235 3235  1.0000000000000e+00\r\n3236 3236  1.0000000000000e+00\r\n3237 3237  1.0000000000000e+00\r\n3238 3238  1.0000000000000e+00\r\n3239 3239  1.0000000000000e+00\r\n3240 3240  1.0000000000000e+00\r\n3241 3241  1.0000000000000e+00\r\n3242 3242  1.0000000000000e+00\r\n3243 3243  1.0000000000000e+00\r\n3244 3244  1.0000000000000e+00\r\n3245 3245  1.0000000000000e+00\r\n3246 3246  1.0000000000000e+00\r\n3247 3247  1.0000000000000e+00\r\n3248 3248  1.0000000000000e+00\r\n3249 3249  1.0000000000000e+00\r\n3250 3250  1.0000000000000e+00\r\n3251 3251  1.0000000000000e+00\r\n3252 3252  1.0000000000000e+00\r\n3253 3253  1.0000000000000e+00\r\n3254 3254  1.0000000000000e+00\r\n3255 3255  1.0000000000000e+00\r\n3256 3256  1.0000000000000e+00\r\n3257 3257  1.0000000000000e+00\r\n3258 3258  1.0000000000000e+00\r\n3259 3259  1.0000000000000e+00\r\n3260 3260  1.0000000000000e+00\r\n3261 3261  1.0000000000000e+00\r\n3262 3262  1.0000000000000e+00\r\n3263 3263  1.0000000000000e+00\r\n3264 3264  1.0000000000000e+00\r\n3265 3265  1.0000000000000e+00\r\n3266 3266  1.0000000000000e+00\r\n3267 3267  1.0000000000000e+00\r\n3268 3268  1.0000000000000e+00\r\n3269 3269  1.0000000000000e+00\r\n3270 3270  1.0000000000000e+00\r\n3271 3271  1.0000000000000e+00\r\n3272 3272  1.0000000000000e+00\r\n3273 3273  1.0000000000000e+00\r\n2170 3274 -2.3584866000000e-03\r\n2172 3274 -2.4614233000000e-05\r\n3226 3274 -3.8453900000000e-04\r\n3228 3274 -4.0132230000000e-06\r\n3274 3274  1.1692377000000e+02\r\n3276 3274  3.0618521000000e-04\r\n3277 3274 -3.8294690000000e-04\r\n3279 3274 -3.9966072000000e-06\r\n2170 3275  2.1207041000000e-01\r\n2172 3275 -4.3203650000000e+00\r\n3226 3275  8.2629021000000e-01\r\n3228 3275 -7.0106907000000e-01\r\n3274 3275 -6.8392282000000e+01\r\n3275 3275 -2.2277164000000e+01\r\n3276 3275  5.7248404000000e+00\r\n3277 3275  1.9435409000000e-01\r\n3279 3275 -7.0091203000000e-01\r\n2170 3276  3.5848382000000e-01\r\n2171 3276 -5.8074741000000e-02\r\n2172 3276 -7.3031450000000e+00\r\n3226 3276  1.3967610000000e+00\r\n3227 3276 -2.2627669000000e-01\r\n3228 3276 -1.1850872000000e+00\r\n3274 3276 -1.1561031000000e+02\r\n3275 3276  1.7740800000000e+01\r\n3276 3276  9.6772702000000e+00\r\n3277 3276  3.2853615000000e-01\r\n3278 3276 -5.3223188000000e-02\r\n3279 3276 -1.1848217000000e+00\r\n2173 3277 -2.3613793000000e-03\r\n2175 3277 -2.4644423000000e-05\r\n3229 3277 -3.8568773000000e-04\r\n3231 3277 -4.0252116000000e-06\r\n3274 3277 -1.5551920000000e-02\r\n3276 3277 -3.9966072000000e-06\r\n3277 3277  1.1693647000000e+02\r\n3279 3277  3.0622550000000e-04\r\n2173 3278  2.1205822000000e-01\r\n2175 3278 -4.3215731000000e+00\r\n3229 3278  1.2126517000000e+00\r\n3231 3278 -7.0095502000000e-01\r\n3276 3278 -7.0091203000000e-01\r\n3277 3278 -6.8581138000000e+01\r\n3278 3278 -2.2279477000000e+01\r\n3279 3278  5.7259355000000e+00\r\n2173 3279  3.5846302000000e-01\r\n2174 3279 -5.8071371000000e-02\r\n2175 3279 -7.3051832000000e+00\r\n3229 3279  2.0498654000000e+00\r\n3230 3279 -3.3208026000000e-01\r\n3231 3279 -1.1848937000000e+00\r\n3276 3279 -1.1848217000000e+00\r\n3277 3279 -1.1592949000000e+02\r\n3278 3279  1.7786906000000e+01\r\n3279 3279  9.6791167000000e+00\r\n3280 3280  1.0000000000000e+00\r\n3281 3281  1.0000000000000e+00\r\n3282 3282  1.0000000000000e+00\r\n3283 3283  1.0000000000000e+00\r\n3284 3284  1.0000000000000e+00\r\n3285 3285  1.0000000000000e+00\r\n3286 3286  1.0000000000000e+00\r\n3287 3287  1.0000000000000e+00\r\n3288 3288  1.0000000000000e+00\r\n3289 3289  1.0000000000000e+00\r\n3290 3290  1.0000000000000e+00\r\n3291 3291  1.0000000000000e+00\r\n3292 3292  1.0000000000000e+00\r\n3293 3293  1.0000000000000e+00\r\n3294 3294  1.0000000000000e+00\r\n3295 3295  1.0000000000000e+00\r\n3296 3296  1.0000000000000e+00\r\n3297 3297  1.0000000000000e+00\r\n3298 3298  1.0000000000000e+00\r\n3299 3299  1.0000000000000e+00\r\n3300 3300  1.0000000000000e+00\r\n3301 3301  1.0000000000000e+00\r\n3302 3302  1.0000000000000e+00\r\n3303 3303  1.0000000000000e+00\r\n3304 3304  1.0000000000000e+00\r\n3305 3305  1.0000000000000e+00\r\n3306 3306  1.0000000000000e+00\r\n3307 3307  1.0000000000000e+00\r\n3308 3308  1.0000000000000e+00\r\n3309 3309  1.0000000000000e+00\r\n3310 3310  1.0000000000000e+00\r\n3311 3311  1.0000000000000e+00\r\n3312 3312  1.0000000000000e+00\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/bfp/bfp_LUSOL/LUSOL/sherman5_rhs1.mtx",
    "content": "%%MatrixMarket matrix array real general\r\n% RBTitle: 1U FULLY IMPLICIT BLACK OIL SIMULATOR   16 BY 23 BY  3 GRID, THREE UNK  \r\n% RBKey:   SHERMAN5\r\n% Right-hand-side: 1\r\n3312 1\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n -0.73007589E+00\r\n -0.47791410E+01\r\n -0.80786603E+01\r\n -0.10735529E+01\r\n -0.45423119E+01\r\n -0.76783303E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n -0.12875379E+01\r\n -0.42729598E+01\r\n -0.72230115E+01\r\n -0.86232178E+00\r\n -0.44841105E+01\r\n -0.75799067E+01\r\n -0.73193270E+00\r\n -0.44916564E+01\r\n -0.75926988E+01\r\n -0.51603338E+00\r\n -0.45085547E+01\r\n -0.76212363E+01\r\n -0.61948008E+00\r\n -0.43775531E+01\r\n -0.73998181E+01\r\n -0.68304074E+00\r\n -0.42793760E+01\r\n -0.72338543E+01\r\n -0.71426769E+00\r\n -0.41984834E+01\r\n -0.70971163E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.35601016E+00\r\n -0.15060889E+01\r\n -0.25458927E+01\r\n  0.64500903E+00\r\n -0.16689431E+01\r\n -0.28211711E+01\r\n -0.21215130E+00\r\n -0.52607998E+01\r\n -0.88928567E+01\r\n -0.22257718E+00\r\n -0.52416289E+01\r\n -0.88604592E+01\r\n  0.83707514E+00\r\n -0.17437449E+01\r\n -0.29476284E+01\r\n  0.38187663E+00\r\n -0.13952795E+01\r\n -0.23586135E+01\r\n  0.19964828E+00\r\n -0.11927143E+01\r\n -0.20161661E+01\r\n  0.92284651E-01\r\n -0.10434371E+01\r\n -0.17638169E+01\r\n  0.67937173E-01\r\n -0.95358111E+00\r\n -0.16119355E+01\r\n  0.45402680E-01\r\n -0.85441984E+00\r\n -0.14443376E+01\r\n  0.28001318E-01\r\n -0.79615742E+00\r\n -0.13458247E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.19607089E-01\r\n -0.13666893E+01\r\n -0.23102515E+01\r\n  0.41824926E-01\r\n -0.13828718E+01\r\n -0.23376242E+01\r\n  0.54009602E-01\r\n -0.13798434E+01\r\n -0.23324877E+01\r\n  0.54886968E-01\r\n -0.13858378E+01\r\n -0.23426572E+01\r\n  0.41994337E-01\r\n -0.13663276E+01\r\n -0.23096417E+01\r\n  0.34842476E-01\r\n -0.13133247E+01\r\n -0.22200348E+01\r\n  0.21929996E-01\r\n -0.12106125E+01\r\n -0.20464221E+01\r\n  0.14816440E-01\r\n -0.11068098E+01\r\n -0.18709649E+01\r\n  0.71735406E-02\r\n -0.10058716E+01\r\n -0.17003275E+01\r\n  0.46638650E-02\r\n -0.92740099E+00\r\n -0.15676581E+01\r\n  0.26555312E-02\r\n -0.85507323E+00\r\n -0.14454159E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.36676090E-02\r\n -0.13998433E+01\r\n -0.23662951E+01\r\n  0.47453482E-02\r\n -0.13948700E+01\r\n -0.23579180E+01\r\n  0.72339044E-02\r\n -0.14109662E+01\r\n -0.23850976E+01\r\n  0.77620945E-02\r\n -0.13957068E+01\r\n -0.23593177E+01\r\n  0.74975053E-02\r\n -0.14068059E+01\r\n -0.23780657E+01\r\n  0.65886737E-02\r\n -0.13862602E+01\r\n -0.23433394E+01\r\n  0.38731180E-02\r\n -0.13098881E+01\r\n -0.22142374E+01\r\n  0.19912716E-02\r\n -0.12089198E+01\r\n -0.20435172E+01\r\n  0.34457596E-03\r\n -0.11017995E+01\r\n -0.18624857E+01\r\n -0.17084600E-04\r\n -0.10031355E+01\r\n -0.16956826E+01\r\n -0.41829973E-04\r\n -0.89521077E+00\r\n -0.15132649E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n -0.18117608E-04\r\n -0.14382016E+01\r\n -0.24311360E+01\r\n -0.19541025E-04\r\n -0.14512249E+01\r\n -0.24531659E+01\r\n -0.41104053E-05\r\n -0.14412508E+01\r\n -0.24362913E+01\r\n  0.35810686E-03\r\n -0.14474765E+01\r\n -0.24468168E+01\r\n  0.86262602E-03\r\n -0.14377778E+01\r\n -0.24304205E+01\r\n  0.61385471E-05\r\n -0.14467032E+01\r\n -0.24455055E+01\r\n -0.55054371E-05\r\n -0.14303970E+01\r\n -0.24179451E+01\r\n -0.18857532E-04\r\n -0.13150356E+01\r\n -0.22229503E+01\r\n -0.19545600E-04\r\n -0.11872204E+01\r\n -0.20068795E+01\r\n -0.26680571E-04\r\n -0.10736020E+01\r\n -0.18148355E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n -0.16404615E-04\r\n -0.14868600E+01\r\n -0.25133882E+01\r\n -0.92369949E-05\r\n -0.14778511E+01\r\n -0.24981171E+01\r\n -0.23710578E-04\r\n -0.14851980E+01\r\n -0.25105803E+01\r\n -0.10057016E-04\r\n -0.14792956E+01\r\n -0.25006310E+01\r\n -0.66869617E-05\r\n -0.14893809E+01\r\n -0.25176509E+01\r\n -0.49755106E-05\r\n -0.14752451E+01\r\n -0.24937695E+01\r\n -0.95114750E-05\r\n -0.14824034E+01\r\n -0.25058580E+01\r\n -0.64772759E-05\r\n -0.13795586E+01\r\n -0.23320204E+01\r\n -0.24176065E-04\r\n -0.12904761E+01\r\n -0.21814234E+01\r\n -0.17189726E-04\r\n -0.11638123E+01\r\n -0.19673279E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.28471641E-04\r\n -0.13773314E+01\r\n -0.23282318E+01\r\n  0.95816722E-06\r\n -0.14072786E+01\r\n -0.23788637E+01\r\n -0.12076326E-04\r\n -0.14714681E+01\r\n -0.24874129E+01\r\n -0.10807086E-04\r\n -0.15207585E+01\r\n -0.25706943E+01\r\n -0.11161304E-04\r\n -0.15263816E+01\r\n -0.25801916E+01\r\n -0.20055691E-04\r\n -0.15181462E+01\r\n -0.25662770E+01\r\n -0.26852077E-04\r\n -0.15227043E+01\r\n -0.25739554E+01\r\n -0.19050641E-04\r\n -0.15127609E+01\r\n -0.25571761E+01\r\n -0.19715413E-04\r\n -0.14913835E+01\r\n -0.25210167E+01\r\n  0.33878064E-05\r\n -0.13892753E+01\r\n -0.23484356E+01\r\n -0.34576010E-04\r\n -0.12239378E+01\r\n -0.20689494E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n -0.56398446E-04\r\n -0.11405498E+01\r\n -0.19279831E+01\r\n -0.15864107E-04\r\n -0.12545651E+01\r\n -0.21207178E+01\r\n -0.34396076E-04\r\n -0.13648443E+01\r\n -0.23071364E+01\r\n -0.21986729E-04\r\n -0.14743089E+01\r\n -0.24921774E+01\r\n  0.52056130E-05\r\n -0.15736459E+01\r\n -0.26600491E+01\r\n -0.13752350E-05\r\n -0.15813178E+01\r\n -0.26730676E+01\r\n -0.46498680E-05\r\n -0.15685133E+01\r\n -0.26514487E+01\r\n -0.19054566E-04\r\n -0.15681498E+01\r\n -0.26508067E+01\r\n -0.12723450E-04\r\n -0.15526272E+01\r\n -0.26245537E+01\r\n -0.41287490E-04\r\n -0.14520409E+01\r\n -0.24545388E+01\r\n -0.67649937E-04\r\n -0.12879069E+01\r\n -0.21771004E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n -0.33357966E-04\r\n -0.98516893E+00\r\n -0.16653495E+01\r\n -0.49860107E-04\r\n -0.11012408E+01\r\n -0.18615406E+01\r\n -0.29121356E-04\r\n -0.12150149E+01\r\n -0.20538326E+01\r\n -0.64973913E-04\r\n -0.13596684E+01\r\n -0.22983959E+01\r\n -0.47182663E-04\r\n -0.15436715E+01\r\n -0.26094265E+01\r\n -0.67505641E-04\r\n -0.15979560E+01\r\n -0.27012088E+01\r\n -0.28856358E-04\r\n -0.16156942E+01\r\n -0.27311742E+01\r\n  0.66711107E-05\r\n -0.16110310E+01\r\n -0.27232994E+01\r\n -0.88580379E-05\r\n -0.16122189E+01\r\n -0.27252734E+01\r\n -0.18625635E-04\r\n -0.15272640E+01\r\n -0.25816878E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n -0.41683819E-04\r\n -0.86574634E+00\r\n -0.14634723E+01\r\n -0.38333279E-04\r\n -0.97176765E+00\r\n -0.16426802E+01\r\n -0.57507505E-04\r\n -0.10931890E+01\r\n -0.18479170E+01\r\n  0.68280592E-05\r\n -0.12635463E+01\r\n -0.21359138E+01\r\n -0.10174167E-03\r\n -0.14315321E+01\r\n -0.24198258E+01\r\n -0.66316080E-04\r\n -0.16799063E+01\r\n -0.28397741E+01\r\n -0.74049959E-04\r\n -0.16408147E+01\r\n -0.27736115E+01\r\n -0.53376426E-04\r\n -0.16438845E+01\r\n -0.27788402E+01\r\n -0.48810071E-04\r\n -0.16228442E+01\r\n -0.27432591E+01\r\n -0.73584354E-04\r\n -0.15841441E+01\r\n -0.26778375E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n -0.48118420E-05\r\n -0.66277511E+00\r\n -0.11203550E+01\r\n -0.18260330E-04\r\n -0.79174586E+00\r\n -0.13383640E+01\r\n -0.22777606E-04\r\n -0.88713826E+00\r\n -0.14996240E+01\r\n -0.42816896E-04\r\n -0.99285880E+00\r\n -0.16783249E+01\r\n -0.57540209E-04\r\n -0.11913010E+01\r\n -0.20137940E+01\r\n -0.12622011E-03\r\n -0.13789037E+01\r\n -0.23308702E+01\r\n -0.10976066E-02\r\n -0.65360711E+00\r\n -0.11050275E+01\r\n -0.13944407E-03\r\n -0.16889513E+01\r\n -0.28550835E+01\r\n -0.39006204E-04\r\n -0.16721192E+01\r\n -0.28265820E+01\r\n -0.49153549E-04\r\n -0.16707199E+01\r\n -0.28242130E+01\r\n -0.80289801E-04\r\n -0.16295539E+01\r\n -0.27545982E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n -0.94335240E-05\r\n -0.66738691E+00\r\n -0.11281508E+01\r\n -0.24013672E-04\r\n -0.65966426E+00\r\n -0.11151072E+01\r\n -0.33650011E-04\r\n -0.79829526E+00\r\n -0.13494442E+01\r\n -0.25928102E-04\r\n -0.93667321E+00\r\n -0.15833201E+01\r\n -0.32623966E-04\r\n -0.10845518E+01\r\n -0.18333416E+01\r\n -0.55343833E-04\r\n -0.12528916E+01\r\n -0.21178357E+01\r\n -0.79205561E-04\r\n -0.15505039E+01\r\n -0.26210261E+01\r\n -0.38003714E-04\r\n -0.17022137E+01\r\n -0.28773975E+01\r\n -0.48634295E-04\r\n -0.17002884E+01\r\n -0.28741819E+01\r\n -0.10361308E-04\r\n -0.16898889E+01\r\n -0.28566784E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n -0.59119322E-05\r\n -0.70017737E+00\r\n -0.11835785E+01\r\n -0.14543802E-04\r\n -0.66353971E+00\r\n -0.11216505E+01\r\n -0.27038167E-04\r\n -0.66683954E+00\r\n -0.11272254E+01\r\n -0.24881679E-04\r\n -0.66659284E+00\r\n -0.11268136E+01\r\n -0.22336300E-04\r\n -0.84891238E+00\r\n -0.14349973E+01\r\n -0.29986663E-04\r\n -0.10174238E+01\r\n -0.17198650E+01\r\n -0.30273510E-04\r\n -0.12378458E+01\r\n -0.20924453E+01\r\n -0.33218393E-04\r\n -0.15112191E+01\r\n -0.25545802E+01\r\n -0.12291160E-04\r\n -0.17294887E+01\r\n -0.29234863E+01\r\n -0.55390439E-04\r\n -0.16986944E+01\r\n -0.28714782E+01\r\n -0.67921277E-04\r\n -0.16955332E+01\r\n -0.28660843E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.22892619E-05\r\n -0.79970068E+00\r\n -0.13518220E+01\r\n -0.34042565E-04\r\n -0.69427548E+00\r\n -0.11736054E+01\r\n -0.29322870E-04\r\n -0.66133833E+00\r\n -0.11179188E+01\r\n -0.18520892E-04\r\n -0.67574534E+00\r\n -0.11422847E+01\r\n -0.44095333E-04\r\n -0.73570177E+00\r\n -0.12436208E+01\r\n -0.13631124E-04\r\n -0.96566424E+00\r\n -0.16323655E+01\r\n -0.18403631E-04\r\n -0.11684261E+01\r\n -0.19751242E+01\r\n -0.30182810E-04\r\n -0.14573423E+01\r\n -0.24635024E+01\r\n -0.21977258E-04\r\n -0.17288422E+01\r\n -0.29224149E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n -0.96096956E-05\r\n -0.98866951E+00\r\n -0.16712469E+01\r\n -0.25788017E-04\r\n -0.89318277E+00\r\n -0.15098393E+01\r\n -0.17901886E-04\r\n -0.79396960E+00\r\n -0.13421295E+01\r\n -0.15515695E-04\r\n -0.66932056E+00\r\n -0.11314188E+01\r\n -0.20788614E-04\r\n -0.66957888E+00\r\n -0.11318615E+01\r\n -0.29950432E-04\r\n -0.71221837E+00\r\n -0.12039388E+01\r\n -0.79763861E-04\r\n -0.86679264E+00\r\n -0.14652332E+01\r\n  0.62146229E-05\r\n -0.11891561E+01\r\n -0.20101667E+01\r\n -0.60913855E-04\r\n -0.14057552E+01\r\n -0.23763045E+01\r\n -0.59914479E-04\r\n -0.16912205E+01\r\n -0.28588373E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n -0.73316461E-05\r\n -0.99293752E+00\r\n -0.16784616E+01\r\n -0.65075077E-05\r\n -0.99357334E+00\r\n -0.16795566E+01\r\n -0.24474551E-04\r\n -0.82784379E+00\r\n -0.13993893E+01\r\n -0.18857208E-04\r\n -0.69572056E+00\r\n -0.11760444E+01\r\n -0.19047106E-04\r\n -0.67271434E+00\r\n -0.11371597E+01\r\n -0.19226591E-04\r\n -0.70880567E+00\r\n -0.11981386E+01\r\n -0.33449801E-04\r\n -0.88789729E+00\r\n -0.15009068E+01\r\n -0.11609816E-03\r\n -0.11333208E+01\r\n -0.19157639E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.37105963E-05\r\n -0.98969264E+00\r\n -0.16729764E+01\r\n -0.14729875E-04\r\n -0.99001307E+00\r\n -0.16735492E+01\r\n -0.19591296E-04\r\n -0.82089647E+00\r\n -0.13876453E+01\r\n -0.93112312E-05\r\n -0.70053389E+00\r\n -0.11841959E+01\r\n -0.10793624E-04\r\n -0.66765328E+00\r\n -0.11286039E+01\r\n -0.40392857E-04\r\n -0.70163762E+00\r\n -0.11860383E+01\r\n  0.11634927E-04\r\n -0.89600441E+00\r\n -0.15146117E+01\r\n -0.99461805E-05\r\n -0.11367258E+01\r\n -0.19215158E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.15589030E-05\r\n -0.99061413E+00\r\n -0.16745341E+01\r\n -0.25002085E-06\r\n -0.95293809E+00\r\n -0.16108464E+01\r\n -0.18340935E-04\r\n -0.79103403E+00\r\n -0.13371649E+01\r\n -0.12199068E-04\r\n -0.65779221E+00\r\n -0.11119297E+01\r\n -0.17449818E-04\r\n -0.66517975E+00\r\n -0.11244218E+01\r\n -0.15437209E-04\r\n -0.73064797E+00\r\n -0.12350862E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n -0.15361566E-05\r\n -0.85824196E+00\r\n -0.14507853E+01\r\n -0.12983907E-04\r\n -0.68618697E+00\r\n -0.11599307E+01\r\n -0.12926853E-04\r\n -0.65903822E+00\r\n -0.11140329E+01\r\n -0.10409705E-04\r\n -0.65942056E+00\r\n -0.11146858E+01\r\n -0.12116367E-04\r\n -0.76283043E+00\r\n -0.12895077E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n -0.53194151E-05\r\n -0.65811632E+00\r\n -0.11124798E+01\r\n -0.16225085E-04\r\n -0.65181712E+00\r\n -0.11018309E+01\r\n -0.12175012E-04\r\n -0.72381679E+00\r\n -0.12235406E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n -0.93218916E-06\r\n -0.65479993E+00\r\n -0.11068738E+01\r\n -0.11427151E-04\r\n -0.65261348E+00\r\n -0.11031850E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n -0.11374207E+01\r\n -0.35988748E+01\r\n -0.60835282E+01\r\n -0.81269119E+00\r\n -0.37569236E+01\r\n -0.63507039E+01\r\n -0.86204067E+00\r\n -0.37062973E+01\r\n -0.62651237E+01\r\n -0.86132270E+00\r\n -0.36842788E+01\r\n -0.62279049E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n -0.41876580E+00\r\n -0.43708098E+01\r\n -0.73884170E+01\r\n -0.57469749E+00\r\n -0.42656638E+01\r\n -0.72106682E+01\r\n -0.63737822E+00\r\n -0.42206050E+01\r\n -0.71345108E+01\r\n -0.64582562E+00\r\n -0.42103360E+01\r\n -0.71171524E+01\r\n -0.58794794E+00\r\n -0.42355747E+01\r\n -0.71598159E+01\r\n -0.46057242E+00\r\n -0.42666316E+01\r\n -0.72122914E+01\r\n -0.49824978E+00\r\n -0.42016028E+01\r\n -0.71023894E+01\r\n  0.21671793E+00\r\n -0.58070052E+00\r\n -0.98161902E+00\r\n  0.11361062E+00\r\n -0.48930719E+00\r\n -0.82712555E+00\r\n  0.60520075E-01\r\n -0.42085475E+00\r\n -0.71141235E+00\r\n  0.30968605E-01\r\n -0.38103848E+00\r\n -0.64410745E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.47423322E-01\r\n -0.65342197E+00\r\n -0.11045445E+01\r\n  0.12746087E+00\r\n -0.70065447E+00\r\n -0.11843766E+01\r\n  0.16209582E+00\r\n -0.71631155E+00\r\n -0.12108532E+01\r\n  0.16496496E+00\r\n -0.71845553E+00\r\n -0.12144852E+01\r\n  0.12210256E+00\r\n -0.68999000E+00\r\n -0.11663594E+01\r\n  0.79605960E-01\r\n -0.64335472E+00\r\n -0.10875327E+01\r\n  0.44568974E-01\r\n -0.58333030E+00\r\n -0.98606204E+00\r\n  0.14726045E-01\r\n -0.51951564E+00\r\n -0.87819327E+00\r\n  0.60058456E-02\r\n -0.47233539E+00\r\n -0.79843672E+00\r\n  0.39690732E-02\r\n -0.43482169E+00\r\n -0.73502610E+00\r\n  0.30008818E-02\r\n -0.40397232E+00\r\n -0.68287481E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.64757041E-02\r\n -0.65788842E+00\r\n -0.11120946E+01\r\n  0.68846046E-02\r\n -0.65510621E+00\r\n -0.11073899E+01\r\n  0.78823979E-02\r\n -0.65845485E+00\r\n -0.11130522E+01\r\n  0.89068724E-02\r\n -0.65354439E+00\r\n -0.11047603E+01\r\n  0.88172434E-02\r\n -0.65672103E+00\r\n -0.11101216E+01\r\n  0.68877520E-02\r\n -0.65015083E+00\r\n -0.10989916E+01\r\n  0.37512450E-02\r\n -0.61314243E+00\r\n -0.10364566E+01\r\n  0.23534657E-02\r\n -0.56977568E+00\r\n -0.96315275E+00\r\n  0.12966358E-02\r\n -0.51846792E+00\r\n -0.87641939E+00\r\n  0.59107988E-03\r\n -0.47296938E+00\r\n -0.79951156E+00\r\n  0.24698769E-04\r\n -0.42305505E+00\r\n -0.71513230E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.69521364E-03\r\n -0.67645089E+00\r\n -0.11434726E+01\r\n  0.11916901E-02\r\n -0.68104524E+00\r\n -0.11512495E+01\r\n  0.20687820E-02\r\n -0.67814869E+00\r\n -0.11463429E+01\r\n  0.22345994E-02\r\n -0.67940676E+00\r\n -0.11484613E+01\r\n  0.23542486E-02\r\n -0.67541762E+00\r\n -0.11417263E+01\r\n  0.17995186E-02\r\n -0.67841717E+00\r\n -0.11467999E+01\r\n  0.11005083E-02\r\n -0.67336022E+00\r\n -0.11382489E+01\r\n  0.18317815E-03\r\n -0.61788539E+00\r\n -0.10444794E+01\r\n -0.23565402E-05\r\n -0.55906796E+00\r\n -0.94504933E+00\r\n -0.22613593E-05\r\n -0.50507304E+00\r\n -0.85377435E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n -0.39444853E-06\r\n -0.69842407E+00\r\n -0.11806161E+01\r\n -0.11278175E-05\r\n -0.69505700E+00\r\n -0.11749439E+01\r\n  0.17555177E-04\r\n -0.69741390E+00\r\n -0.11789090E+01\r\n  0.17626733E-03\r\n -0.69548116E+00\r\n -0.11756298E+01\r\n  0.37656054E-03\r\n -0.69884659E+00\r\n -0.11813309E+01\r\n  0.18953378E-03\r\n -0.69366649E+00\r\n -0.11725707E+01\r\n  0.19224752E-05\r\n -0.69573161E+00\r\n -0.11760656E+01\r\n  0.72776430E-07\r\n -0.64863065E+00\r\n -0.10964368E+01\r\n -0.37043390E-05\r\n -0.60671845E+00\r\n -0.10255977E+01\r\n -0.36241908E-05\r\n -0.54781537E+00\r\n -0.92601912E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.19012713E-04\r\n -0.64575511E+00\r\n -0.10915739E+01\r\n  0.51958204E-05\r\n -0.66149195E+00\r\n -0.11181860E+01\r\n  0.41671327E-05\r\n -0.69065903E+00\r\n -0.11674826E+01\r\n  0.20589718E-05\r\n -0.71540506E+00\r\n -0.12093218E+01\r\n -0.41078028E-05\r\n -0.71694651E+00\r\n -0.12119179E+01\r\n -0.19347201E-05\r\n -0.71415345E+00\r\n -0.12072059E+01\r\n -0.23046668E-05\r\n -0.71538948E+00\r\n -0.12093029E+01\r\n -0.15559414E-05\r\n -0.71176873E+00\r\n -0.12031754E+01\r\n -0.73063887E-07\r\n -0.70022290E+00\r\n -0.11836332E+01\r\n  0.62054871E-05\r\n -0.65305800E+00\r\n -0.11039304E+01\r\n -0.72453857E-05\r\n -0.57615041E+00\r\n -0.97392807E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n -0.16038825E-04\r\n -0.53943966E+00\r\n -0.91187777E+00\r\n -0.10430093E-05\r\n -0.58970937E+00\r\n -0.99684495E+00\r\n -0.49696521E-05\r\n -0.64340420E+00\r\n -0.10876054E+01\r\n -0.22329447E-05\r\n -0.69263650E+00\r\n -0.11708354E+01\r\n  0.10760681E-04\r\n -0.73892071E+00\r\n -0.12490696E+01\r\n  0.50173076E-05\r\n -0.74118669E+00\r\n -0.12529037E+01\r\n  0.68646709E-05\r\n -0.73670040E+00\r\n -0.12453183E+01\r\n -0.13448756E-05\r\n -0.73624371E+00\r\n -0.12445482E+01\r\n  0.40206064E-05\r\n -0.73075910E+00\r\n -0.12352771E+01\r\n -0.90326372E-05\r\n -0.68330929E+00\r\n -0.11550697E+01\r\n -0.19861518E-04\r\n -0.60926912E+00\r\n -0.10299216E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n -0.46458303E-05\r\n -0.46478996E+00\r\n -0.78568709E+00\r\n -0.11749638E-04\r\n -0.52107741E+00\r\n -0.88083010E+00\r\n -0.27788905E-05\r\n -0.57184261E+00\r\n -0.96663572E+00\r\n -0.16167461E-04\r\n -0.64224198E+00\r\n -0.10856490E+01\r\n -0.41299555E-05\r\n -0.72606644E+00\r\n -0.12273160E+01\r\n -0.13886318E-04\r\n -0.75255815E+00\r\n -0.12721290E+01\r\n -0.92050466E-05\r\n -0.75848577E+00\r\n -0.12821369E+01\r\n  0.79349533E-05\r\n -0.75643700E+00\r\n -0.12786842E+01\r\n -0.24503081E-05\r\n -0.75643239E+00\r\n -0.12786750E+01\r\n -0.17133109E-05\r\n -0.71868438E+00\r\n -0.12148642E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n -0.87522032E-05\r\n -0.40997152E+00\r\n -0.69301945E+00\r\n -0.81547734E-05\r\n -0.45879548E+00\r\n -0.77554885E+00\r\n -0.13747454E-04\r\n -0.51738513E+00\r\n -0.87459035E+00\r\n  0.77440868E-05\r\n -0.59198985E+00\r\n -0.10007045E+01\r\n -0.21312925E-04\r\n -0.67509196E+00\r\n -0.11411619E+01\r\n  0.56932475E-05\r\n -0.78494207E+00\r\n -0.13268755E+01\r\n -0.13946572E-04\r\n -0.77182693E+00\r\n -0.13046697E+01\r\n -0.11045417E-04\r\n -0.77288926E+00\r\n -0.13064968E+01\r\n -0.11674239E-04\r\n -0.76545634E+00\r\n -0.12939092E+01\r\n -0.19866208E-04\r\n -0.74732760E+00\r\n -0.12632829E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.34535457E-05\r\n -0.31336739E+00\r\n -0.52971623E+00\r\n  0.24296697E-06\r\n -0.37415911E+00\r\n -0.63247865E+00\r\n -0.22256012E-05\r\n -0.41950437E+00\r\n -0.70913135E+00\r\n -0.10299729E-04\r\n -0.46842439E+00\r\n -0.79182793E+00\r\n -0.11236372E-04\r\n -0.56268915E+00\r\n -0.95117478E+00\r\n -0.17455445E-04\r\n -0.64775557E+00\r\n -0.10949579E+01\r\n -0.50071338E-04\r\n -0.72985406E+00\r\n -0.12337681E+01\r\n -0.10169126E-04\r\n -0.79241794E+00\r\n -0.13395053E+01\r\n -0.54241855E-05\r\n -0.78673965E+00\r\n -0.13299096E+01\r\n -0.27368962E-05\r\n -0.78572068E+00\r\n -0.13281721E+01\r\n -0.21514621E-04\r\n -0.77033882E+00\r\n -0.13021807E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.22923616E-05\r\n -0.31547640E+00\r\n -0.53328130E+00\r\n -0.40516783E-05\r\n -0.31265450E+00\r\n -0.52851059E+00\r\n -0.57661815E-05\r\n -0.37775848E+00\r\n -0.63856463E+00\r\n -0.25586938E-05\r\n -0.44268374E+00\r\n -0.74831429E+00\r\n -0.49584183E-05\r\n -0.51081530E+00\r\n -0.86348621E+00\r\n -0.66552786E-05\r\n -0.59014282E+00\r\n -0.99756439E+00\r\n -0.39262067E-05\r\n -0.72695048E+00\r\n -0.12288458E+01\r\n  0.21200911E-05\r\n -0.80108884E+00\r\n -0.13541672E+01\r\n -0.10099852E-04\r\n -0.79986012E+00\r\n -0.13520873E+01\r\n  0.49990834E-05\r\n -0.79593480E+00\r\n -0.13454764E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.21803910E-05\r\n -0.33082342E+00\r\n -0.55923432E+00\r\n  0.27233588E-06\r\n -0.31431008E+00\r\n -0.53131064E+00\r\n -0.19962890E-05\r\n -0.31593264E+00\r\n -0.53405116E+00\r\n -0.37438644E-05\r\n -0.31593646E+00\r\n -0.53406066E+00\r\n -0.61062647E-06\r\n -0.40074212E+00\r\n -0.67742088E+00\r\n -0.43291055E-05\r\n -0.48068105E+00\r\n -0.81254646E+00\r\n -0.50593711E-05\r\n -0.58274882E+00\r\n -0.98507711E+00\r\n -0.29719517E-05\r\n -0.71178735E+00\r\n -0.12032092E+01\r\n -0.94859199E-06\r\n -0.81300493E+00\r\n -0.13743075E+01\r\n -0.12937396E-04\r\n -0.80142190E+00\r\n -0.13547251E+01\r\n -0.17955245E-04\r\n -0.80004249E+00\r\n -0.13523941E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.34550382E-05\r\n -0.37763105E+00\r\n -0.63835282E+00\r\n -0.66919980E-05\r\n -0.32900294E+00\r\n -0.55614735E+00\r\n -0.28111336E-05\r\n -0.31413021E+00\r\n -0.53100365E+00\r\n -0.88323442E-06\r\n -0.31961926E+00\r\n -0.54028648E+00\r\n -0.10614214E-04\r\n -0.34939198E+00\r\n -0.59060352E+00\r\n  0.10594819E-05\r\n -0.45497981E+00\r\n -0.76910013E+00\r\n -0.46984886E-05\r\n -0.55102613E+00\r\n -0.93145259E+00\r\n -0.48102490E-05\r\n -0.68564782E+00\r\n -0.11590213E+01\r\n -0.95605717E-06\r\n -0.81497777E+00\r\n -0.13776385E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.19850434E-05\r\n -0.46652454E+00\r\n -0.78861308E+00\r\n -0.34539835E-05\r\n -0.42162136E+00\r\n -0.71271825E+00\r\n -0.68278058E-06\r\n -0.37578995E+00\r\n -0.63523639E+00\r\n -0.98047378E-06\r\n -0.31653168E+00\r\n -0.53506158E+00\r\n -0.16492219E-05\r\n -0.31753365E+00\r\n -0.53676042E+00\r\n -0.51517036E-05\r\n -0.33705691E+00\r\n -0.56976425E+00\r\n -0.22231837E-04\r\n -0.41263982E+00\r\n -0.69752866E+00\r\n  0.84971603E-05\r\n -0.55866818E+00\r\n -0.94437437E+00\r\n -0.15677310E-04\r\n -0.66436600E+00\r\n -0.11230482E+01\r\n -0.13341378E-04\r\n -0.79867406E+00\r\n -0.13500775E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.23323241E-05\r\n -0.46751943E+00\r\n -0.79029484E+00\r\n  0.10315786E-04\r\n -0.46854070E+00\r\n -0.79201667E+00\r\n -0.33532295E-05\r\n -0.39108471E+00\r\n -0.66109043E+00\r\n -0.16521591E-06\r\n -0.32960973E+00\r\n -0.55717415E+00\r\n -0.12620752E-05\r\n -0.31825347E+00\r\n -0.53797677E+00\r\n -0.22622202E-05\r\n -0.33569787E+00\r\n -0.56745673E+00\r\n -0.64161669E-05\r\n -0.41959159E+00\r\n -0.70927964E+00\r\n -0.31584037E-04\r\n -0.54021088E+00\r\n -0.91317481E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.60439200E-05\r\n -0.46607089E+00\r\n -0.78784623E+00\r\n -0.20541069E-05\r\n -0.46682901E+00\r\n -0.78912858E+00\r\n -0.17550235E-05\r\n -0.38831959E+00\r\n -0.65641592E+00\r\n  0.19694874E-05\r\n -0.33082038E+00\r\n -0.55921016E+00\r\n  0.14344787E-05\r\n -0.31605076E+00\r\n -0.53425337E+00\r\n -0.84770233E-05\r\n -0.33268918E+00\r\n -0.56236811E+00\r\n  0.89194562E-05\r\n -0.42185938E+00\r\n -0.71311363E+00\r\n  0.26511716E-06\r\n -0.53598003E+00\r\n -0.90603132E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.54260049E-05\r\n -0.46620085E+00\r\n -0.78806591E+00\r\n  0.27218236E-05\r\n -0.44965874E+00\r\n -0.76011034E+00\r\n -0.12675630E-05\r\n -0.37355368E+00\r\n -0.63145550E+00\r\n  0.86251805E-06\r\n -0.31144821E+00\r\n -0.52647519E+00\r\n -0.94779313E-06\r\n -0.31461331E+00\r\n -0.53182295E+00\r\n -0.12677737E-05\r\n -0.34610251E+00\r\n -0.58504794E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.77216518E-05\r\n -0.40432863E+00\r\n -0.68347667E+00\r\n -0.65683610E-07\r\n -0.32459688E+00\r\n -0.54869865E+00\r\n  0.38143907E-06\r\n -0.31162344E+00\r\n -0.52676415E+00\r\n  0.10659711E-05\r\n -0.31201245E+00\r\n -0.52742629E+00\r\n -0.31393068E-07\r\n -0.36084677E+00\r\n -0.60998104E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.30716571E-05\r\n -0.31077867E+00\r\n -0.52534027E+00\r\n -0.43111039E-06\r\n -0.30882335E+00\r\n -0.52203278E+00\r\n  0.12214547E-05\r\n -0.34230789E+00\r\n -0.57863771E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.46257771E-05\r\n -0.30947873E+00\r\n -0.52314285E+00\r\n  0.11230187E-05\r\n -0.30889848E+00\r\n -0.52216158E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n -0.15262064E+01\r\n -0.33090381E+01\r\n -0.55935980E+01\r\n -0.10995579E+01\r\n -0.35566602E+01\r\n -0.60121910E+01\r\n -0.95196898E+00\r\n -0.36325096E+01\r\n -0.61403943E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n -0.71494664E+00\r\n -0.41858508E+01\r\n -0.70757623E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n -0.10504815E+01\r\n -0.38935606E+01\r\n -0.65816757E+01\r\n -0.65785838E+00\r\n -0.41074444E+01\r\n -0.69432242E+01\r\n -0.57144652E+00\r\n -0.41371735E+01\r\n -0.69934691E+01\r\n  0.41099112E+00\r\n -0.69170369E+00\r\n -0.11692564E+01\r\n  0.16529191E+00\r\n -0.51152301E+00\r\n -0.86468364E+00\r\n  0.62338300E-01\r\n -0.42756221E+00\r\n -0.72275117E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.19487414E+00\r\n -0.78161394E+00\r\n -0.13212404E+01\r\n -0.21719217E+00\r\n -0.46521428E+01\r\n -0.78639731E+01\r\n -0.22592071E+00\r\n -0.46393976E+01\r\n -0.78424377E+01\r\n -0.23935866E+00\r\n -0.46285000E+01\r\n -0.78240151E+01\r\n -0.24464477E+00\r\n -0.46217358E+01\r\n -0.78125822E+01\r\n  0.37947245E+00\r\n -0.85786354E+00\r\n -0.14501260E+01\r\n  0.13127482E+00\r\n -0.67509707E+00\r\n -0.11411847E+01\r\n  0.48557227E-01\r\n -0.57819252E+00\r\n -0.97736893E+00\r\n  0.13526292E-01\r\n -0.51461205E+00\r\n -0.86990111E+00\r\n  0.61471090E-02\r\n -0.47132774E+00\r\n -0.79673015E+00\r\n  0.49468496E-02\r\n -0.43830867E+00\r\n -0.74091705E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.15593223E-01\r\n -0.71408510E+00\r\n -0.12070895E+01\r\n  0.26556009E-01\r\n -0.71720185E+00\r\n -0.12123663E+01\r\n  0.33724910E-01\r\n -0.72368244E+00\r\n -0.12233129E+01\r\n  0.40136961E-01\r\n -0.72143388E+00\r\n -0.12195293E+01\r\n  0.38753434E-01\r\n -0.72356315E+00\r\n -0.12231114E+01\r\n  0.18237140E-01\r\n -0.70780665E+00\r\n -0.11964704E+01\r\n  0.79213715E-02\r\n -0.66372107E+00\r\n -0.11219548E+01\r\n  0.49058533E-02\r\n -0.61682435E+00\r\n -0.10426771E+01\r\n  0.18340632E-02\r\n -0.56160525E+00\r\n -0.94933894E+00\r\n  0.15584380E-02\r\n -0.51443330E+00\r\n -0.86959745E+00\r\n  0.32433237E-03\r\n -0.45990383E+00\r\n -0.77742144E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.20026106E-02\r\n -0.73284130E+00\r\n -0.12387949E+01\r\n  0.21106504E-02\r\n -0.73617889E+00\r\n -0.12444157E+01\r\n  0.31036832E-02\r\n -0.73192112E+00\r\n -0.12372398E+01\r\n  0.39019721E-02\r\n -0.73361373E+00\r\n -0.12401391E+01\r\n  0.47250335E-02\r\n -0.72988246E+00\r\n -0.12337936E+01\r\n  0.17903180E-02\r\n -0.73172469E+00\r\n -0.12369094E+01\r\n  0.16765488E-02\r\n -0.72839585E+00\r\n -0.12312815E+01\r\n  0.14747603E-02\r\n -0.67142582E+00\r\n -0.11349873E+01\r\n  0.47992153E-03\r\n -0.60735601E+00\r\n -0.10266754E+01\r\n -0.21995421E-05\r\n -0.54837970E+00\r\n -0.92698122E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.37540469E-03\r\n -0.75821003E+00\r\n -0.12816782E+01\r\n  0.75929842E-03\r\n -0.75484646E+00\r\n -0.12760103E+01\r\n  0.12721476E-02\r\n -0.75757842E+00\r\n -0.12806112E+01\r\n  0.17610847E-02\r\n -0.75572739E+00\r\n -0.12774873E+01\r\n  0.21797866E-02\r\n -0.75948931E+00\r\n -0.12838413E+01\r\n  0.18340514E-02\r\n -0.75382956E+00\r\n -0.12742610E+01\r\n  0.95625940E-03\r\n -0.75576823E+00\r\n -0.12775516E+01\r\n  0.95307621E-05\r\n -0.70377734E+00\r\n -0.11896828E+01\r\n  0.18464373E-05\r\n -0.65871648E+00\r\n -0.11134952E+01\r\n  0.44716180E-05\r\n -0.59489957E+00\r\n -0.10056409E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.17576459E-04\r\n -0.70136215E+00\r\n -0.11855891E+01\r\n  0.12008442E-04\r\n -0.71811897E+00\r\n -0.12139083E+01\r\n  0.12018808E-04\r\n -0.74951824E+00\r\n -0.12669860E+01\r\n  0.93681519E-05\r\n -0.77657870E+00\r\n -0.13127299E+01\r\n  0.16778629E-05\r\n -0.77794654E+00\r\n -0.13150384E+01\r\n  0.44673968E-05\r\n -0.77491752E+00\r\n -0.13099213E+01\r\n  0.15071943E-05\r\n -0.77637248E+00\r\n -0.13124036E+01\r\n  0.48165762E-05\r\n -0.77243688E+00\r\n -0.13057289E+01\r\n  0.10478180E-04\r\n -0.75998537E+00\r\n -0.12846952E+01\r\n  0.13107010E-04\r\n -0.70906833E+00\r\n -0.11986107E+01\r\n -0.50722414E-05\r\n -0.62548585E+00\r\n -0.10573175E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n -0.12419986E-04\r\n -0.58595184E+00\r\n -0.99048779E+00\r\n  0.48147855E-05\r\n -0.64045010E+00\r\n -0.10826171E+01\r\n -0.25142174E-05\r\n -0.69877984E+00\r\n -0.11812119E+01\r\n  0.43019547E-05\r\n -0.75183846E+00\r\n -0.12709097E+01\r\n  0.16630537E-04\r\n -0.80204649E+00\r\n -0.13557728E+01\r\n  0.12346482E-04\r\n -0.80415182E+00\r\n -0.13593403E+01\r\n  0.67621486E-05\r\n -0.79931157E+00\r\n -0.13511575E+01\r\n  0.51967287E-05\r\n -0.79893118E+00\r\n -0.13505158E+01\r\n  0.89498202E-05\r\n -0.79328363E+00\r\n -0.13409688E+01\r\n -0.33266488E-05\r\n -0.74180317E+00\r\n -0.12539472E+01\r\n -0.15233154E-04\r\n -0.66154749E+00\r\n -0.11182700E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n -0.19223968E-05\r\n -0.50530184E+00\r\n -0.85416090E+00\r\n -0.61814809E-05\r\n -0.56649563E+00\r\n -0.95760501E+00\r\n -0.22013850E-05\r\n -0.62106131E+00\r\n -0.10498414E+01\r\n -0.10310776E-04\r\n -0.69739357E+00\r\n -0.11788763E+01\r\n -0.23673627E-05\r\n -0.78808910E+00\r\n -0.13321802E+01\r\n -0.63241010E-05\r\n -0.81636590E+00\r\n -0.13799877E+01\r\n  0.41924869E-05\r\n -0.82277577E+00\r\n -0.13908122E+01\r\n  0.15804959E-04\r\n -0.82081299E+00\r\n -0.13875044E+01\r\n  0.17387077E-04\r\n -0.82106924E+00\r\n -0.13879656E+01\r\n  0.45349850E-05\r\n -0.78004278E+00\r\n -0.13185844E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n -0.51280017E-05\r\n -0.44622403E+00\r\n -0.75429165E+00\r\n -0.25244722E-05\r\n -0.49903143E+00\r\n -0.84356416E+00\r\n -0.88417906E-05\r\n -0.56253212E+00\r\n -0.95090892E+00\r\n  0.15206261E-04\r\n -0.64274428E+00\r\n -0.10864996E+01\r\n -0.19964766E-04\r\n -0.73232426E+00\r\n -0.12379073E+01\r\n  0.19901317E-04\r\n -0.85106672E+00\r\n -0.14386503E+01\r\n -0.65841589E-05\r\n -0.83701939E+00\r\n -0.14148842E+01\r\n -0.39377926E-05\r\n -0.83856117E+00\r\n -0.14175079E+01\r\n -0.74456242E-05\r\n -0.83089133E+00\r\n -0.14045317E+01\r\n -0.14641721E-04\r\n -0.81118722E+00\r\n -0.13712309E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.10031318E-04\r\n -0.34175735E+00\r\n -0.57770662E+00\r\n  0.52204219E-05\r\n -0.40770908E+00\r\n -0.68918729E+00\r\n  0.43838974E-05\r\n -0.45671306E+00\r\n -0.77202937E+00\r\n -0.12448984E-05\r\n -0.50938593E+00\r\n -0.86107302E+00\r\n -0.35282645E-05\r\n -0.61147283E+00\r\n -0.10336386E+01\r\n -0.92237562E-05\r\n -0.70257277E+00\r\n -0.11876224E+01\r\n -0.19790747E-04\r\n -0.79155376E+00\r\n -0.13380632E+01\r\n -0.12311129E-04\r\n -0.85899104E+00\r\n -0.14520437E+01\r\n  0.24987754E-05\r\n -0.85350853E+00\r\n -0.14427760E+01\r\n -0.48216252E-05\r\n -0.85269814E+00\r\n -0.14414079E+01\r\n -0.15858060E-04\r\n -0.83627770E+00\r\n -0.14136442E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.90615401E-05\r\n -0.34417517E+00\r\n -0.58179372E+00\r\n -0.22372602E-07\r\n -0.34086435E+00\r\n -0.57619304E+00\r\n  0.62647501E-06\r\n -0.41160313E+00\r\n -0.69577591E+00\r\n  0.47173876E-05\r\n -0.48184793E+00\r\n -0.81451995E+00\r\n  0.20263113E-05\r\n -0.55529347E+00\r\n -0.93867174E+00\r\n -0.31757637E-05\r\n -0.64052595E+00\r\n -0.10827418E+01\r\n  0.76586851E-05\r\n -0.78831985E+00\r\n -0.13325834E+01\r\n  0.14396884E-05\r\n -0.86912419E+00\r\n -0.14691915E+01\r\n -0.29478576E-05\r\n -0.86794837E+00\r\n -0.14671827E+01\r\n  0.31289099E-06\r\n -0.86401590E+00\r\n -0.14605308E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.87405669E-05\r\n -0.36063124E+00\r\n -0.60961186E+00\r\n  0.66210980E-05\r\n -0.34285397E+00\r\n -0.57956141E+00\r\n  0.16397731E-05\r\n -0.34464530E+00\r\n -0.58258152E+00\r\n  0.20268795E-05\r\n -0.34443634E+00\r\n -0.58223663E+00\r\n  0.45575515E-05\r\n -0.43651951E+00\r\n -0.73788988E+00\r\n  0.26015813E-05\r\n -0.52291758E+00\r\n -0.88394325E+00\r\n  0.53487280E-06\r\n -0.63317006E+00\r\n -0.10702990E+01\r\n  0.56459683E-05\r\n -0.77282508E+00\r\n -0.13063867E+01\r\n  0.62247018E-05\r\n -0.88255714E+00\r\n -0.14919108E+01\r\n -0.61726221E-05\r\n -0.86985659E+00\r\n -0.14704068E+01\r\n -0.17331946E-04\r\n -0.86850716E+00\r\n -0.14681238E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.14162502E-04\r\n -0.41144323E+00\r\n -0.69550083E+00\r\n -0.11975233E-05\r\n -0.35867596E+00\r\n -0.60630658E+00\r\n  0.22588616E-05\r\n -0.34272098E+00\r\n -0.57933422E+00\r\n  0.56065710E-05\r\n -0.34865306E+00\r\n -0.58936467E+00\r\n -0.48043723E-05\r\n -0.38072807E+00\r\n -0.64358021E+00\r\n  0.82632406E-05\r\n -0.49521199E+00\r\n -0.83710889E+00\r\n  0.37626127E-05\r\n -0.59891220E+00\r\n -0.10124041E+01\r\n  0.21057070E-05\r\n -0.74460432E+00\r\n -0.12586812E+01\r\n  0.12678650E-04\r\n -0.88531777E+00\r\n -0.14965587E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.85396360E-05\r\n -0.50760401E+00\r\n -0.85805382E+00\r\n -0.18473856E-05\r\n -0.45894137E+00\r\n -0.77579345E+00\r\n  0.57245816E-05\r\n -0.40948922E+00\r\n -0.69220165E+00\r\n  0.42157353E-05\r\n -0.34518905E+00\r\n -0.58350421E+00\r\n  0.47307198E-05\r\n -0.34642022E+00\r\n -0.58559044E+00\r\n -0.70538838E-06\r\n -0.36749160E+00\r\n -0.62120511E+00\r\n -0.17704109E-04\r\n -0.44920918E+00\r\n -0.75934523E+00\r\n  0.14319676E-04\r\n -0.60747806E+00\r\n -0.10268680E+01\r\n -0.10025376E-04\r\n -0.72165070E+00\r\n -0.12198814E+01\r\n -0.29572064E-05\r\n -0.86753038E+00\r\n -0.14664712E+01\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.85821419E-05\r\n -0.50854347E+00\r\n -0.85964188E+00\r\n  0.16493335E-04\r\n -0.51003093E+00\r\n -0.86216342E+00\r\n  0.24876358E-05\r\n -0.42590887E+00\r\n -0.71995724E+00\r\n  0.59709092E-05\r\n -0.35943482E+00\r\n -0.60758471E+00\r\n  0.49496341E-05\r\n -0.34715486E+00\r\n -0.58683164E+00\r\n  0.42827298E-05\r\n -0.36596509E+00\r\n -0.61862629E+00\r\n -0.57452087E-06\r\n -0.45678338E+00\r\n -0.77214869E+00\r\n -0.26366656E-04\r\n -0.58794746E+00\r\n -0.99385686E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.12565208E-04\r\n -0.50695871E+00\r\n -0.85696300E+00\r\n  0.46891907E-05\r\n -0.50808141E+00\r\n -0.85886385E+00\r\n  0.41420104E-05\r\n -0.42289361E+00\r\n -0.71486018E+00\r\n  0.80703502E-05\r\n -0.36065842E+00\r\n -0.60965826E+00\r\n  0.77446881E-05\r\n -0.34474650E+00\r\n -0.58276050E+00\r\n -0.25735036E-05\r\n -0.36269755E+00\r\n -0.61310652E+00\r\n  0.16030019E-04\r\n -0.45925201E+00\r\n -0.77632187E+00\r\n  0.99968945E-05\r\n -0.58320085E+00\r\n -0.98583832E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.11964946E-04\r\n -0.50713051E+00\r\n -0.85725341E+00\r\n  0.99516441E-05\r\n -0.48943012E+00\r\n -0.82733309E+00\r\n  0.46683721E-05\r\n -0.40693178E+00\r\n -0.68787787E+00\r\n  0.39080770E-05\r\n -0.33966027E+00\r\n -0.57416086E+00\r\n  0.50132371E-05\r\n -0.34315556E+00\r\n -0.58007083E+00\r\n  0.78247889E-05\r\n -0.37733096E+00\r\n -0.63783911E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.99089532E-05\r\n -0.44026646E+00\r\n -0.74422855E+00\r\n  0.54465978E-05\r\n -0.35375295E+00\r\n -0.59798408E+00\r\n  0.48361284E-05\r\n -0.33992768E+00\r\n -0.57461634E+00\r\n  0.68805448E-05\r\n -0.34022345E+00\r\n -0.57511425E+00\r\n  0.98595301E-05\r\n -0.39338020E+00\r\n -0.66496888E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.92026895E-05\r\n -0.33896389E+00\r\n -0.57298455E+00\r\n  0.35225491E-05\r\n -0.33682498E+00\r\n -0.56935837E+00\r\n  0.76078588E-05\r\n -0.37324699E+00\r\n -0.63093700E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.10923226E-04\r\n -0.33757462E+00\r\n -0.57063614E+00\r\n  0.59470629E-05\r\n -0.33692929E+00\r\n -0.56954298E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n  0.00000000E+00\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/bfp/bfp_LUSOL/LUSOL/sparselib.c",
    "content": "\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <math.h>\n#include \"commonlib.h\"\n#include \"myblas.h\"\n#include \"sparselib.h\"\n\n\nsparseMatrix *createMatrix(int dimLimit, int lenLimit, int initVectors)\n{\n  int          initsize;\n  sparseMatrix *matrix;\n\n  if(initVectors < 0)\n    initVectors = 0;\n  if(initVectors == 0)\n    initsize = MIN(INITIALSIZE, dimLimit);\n  else\n    initsize = MAX(INITIALSIZE, initVectors);\n\n  CALLOC(matrix, 1);\n  matrix->limit = dimLimit;\n  matrix->limitVector = lenLimit;\n  resizeMatrix(matrix, initsize);\n  while(initVectors > 0) {\n    initVectors--;\n    appendMatrix(matrix, createVector(lenLimit, 2));\n  }\n  return(matrix);\n}\n\n\nvoid resizeMatrix(sparseMatrix *matrix, int newSize)\n{\n  int oldSize;\n\n  if(matrix == NULL)\n    oldSize = 0;\n  else\n    oldSize = matrix->size;\n  while(oldSize>newSize) {\n\t  oldSize--;\n\t  freeVector(matrix->list[oldSize]);\n    return;\n  }\n  REALLOC(matrix->list, newSize);\n  while(oldSize<newSize) {\n\t  matrix->list[oldSize] = NULL;\n\t  oldSize++;\n  }\n  if(newSize>0)\n    matrix->size = newSize;\n}\n\nint appendMatrix(sparseMatrix *matrix, sparseVector *newVector)\n{\n   if(matrix->count == matrix->size)\n     resizeMatrix(matrix, matrix->size + 10);\n   matrix->list[matrix->count] = newVector;\n   matrix->count++;\n   putDiagonalIndex(newVector, matrix->count);\n   return(matrix->count);\n}\n\n\nint NZcountMatrix(sparseMatrix *matrix)\n{\n  int i, nz;\n\n  nz = 0;\n  for(i = 0; i < matrix->count; i++)\n    nz += matrix->list[i]->count;\n\n  return( nz );\n}\n\n\nvoid freeMatrix(sparseMatrix *matrix)\n{\n  resizeMatrix(matrix, 0);\n  FREE(matrix);\n}\n\n\nvoid printMatrix(int n, sparseMatrix *matrix, int modulo, MYBOOL showEmpty)\n{\n   int i;\n   for(i = 1; i<=matrix->count; i++) \n     if(matrix->list[i-1] != NULL) { \n       if(showEmpty || matrix->list[i-1]->count>0)\n         printVector(n, matrix->list[i-1], modulo);\n   }\n}\n\n\nsparseVector *createVector(int dimLimit, int initSize)\n{\n  sparseVector *newitem;\n  CALLOC(newitem, 1);\n  newitem->limit = dimLimit;\n  initSize = resizeVector(newitem, initSize);\n  return(newitem);\n}\n\n\nsparseVector *cloneVector(sparseVector *sparse)\n{\n  sparseVector *hold;\n  hold = createVector(sparse->limit, sparse->count);\n  hold->count = sparse->count;\n  MEMCOPY(&hold->value[0], &sparse->value[0], (sparse->count+1));\n  MEMCOPY(&hold->index[0], &sparse->index[0], (sparse->count+1));\n  return(hold);\n}\n\nint redimensionVector(sparseVector *sparse, int newDim)\n{\n  int olddim, i;\n\n  olddim = sparse->limit;\n  sparse->limit = newDim;\n  if(lastIndex(sparse)>newDim) {\n    i = sparse->count;\n    while(i>0 && sparse->index[i]>newDim) i--;\n    sparse->count = i;\n    resizeVector(sparse, sparse->count);\n  }\n  return(olddim);\n}\n\n\nint resizeVector(sparseVector *sparse, int newSize)\n{\n  int oldsize;\n\n  oldsize = sparse->size;\n  REALLOC(sparse->value, (newSize+1));\n  REALLOC(sparse->index, (newSize+1));\n  sparse->size = newSize;\n  return(oldsize);\n}\n\n\nvoid moveVector(sparseVector *sparse, int destPos, int sourcePos, int itemCount)\n{\n  int i;\n  \n  if(itemCount <= 0 || sourcePos == destPos)\n    return;\n\n#if defined DOFASTMATH\n  if(TRUE) {\n    MEMMOVE(&sparse->value[destPos], &sparse->value[sourcePos], itemCount);\n    MEMMOVE(&sparse->index[destPos], &sparse->index[sourcePos], itemCount);\n  }\n  else {\n    int    *idxPtr1, *idxPtr2;\n    double *valPtr1, *valPtr2;\n\n    for(i = 1, idxPtr1 = sparse->index+destPos, idxPtr2 = sparse->index+sourcePos,\n               valPtr1 = sparse->value+destPos, valPtr2 = sparse->value+sourcePos; \n        i<=itemCount; i++, idxPtr1++, idxPtr2++, valPtr1++, valPtr2++) {\n      *idxPtr1 = *idxPtr2;\n      *valPtr1 = *valPtr2;\n    }\n  }\n#else\n  for(i = 1; i<=itemCount; i++) {\n    sparse->value[destPos] = sparse->value[sourcePos];\n    sparse->index[destPos] = sparse->index[sourcePos];\n    destPos++;\n    sourcePos++;\n  }\n#endif\n}\n\n\nvoid rotateVector(sparseVector *sparse, int startPos, int chainSize, int stepDelta)\n{\n/*  int idxHold; */\n/*  double valHold; */\n\n}\n\n\nvoid swapVector(sparseVector *sparse1, sparseVector *sparse2)\n{\n  int n, m, *idx;\n  REAL *val;\n\n  n = sparse1->count;\n  sparse1->count = sparse2->count;\n  sparse2->count = n;\n\n  n = sparse1->size;\n  sparse1->size = sparse2->size;\n  sparse2->size = n;\n\n  n = sparse1->limit;\n  sparse1->limit = sparse2->limit;\n  sparse2->limit = n;\n\n  idx = sparse1->index;\n  sparse1->index = sparse2->index;\n  sparse2->index = idx;\n\n  val = sparse1->value;\n  sparse1->value = sparse2->value;\n  sparse2->value = val;\n\n  n = getDiagonalIndex(sparse1);\n  m = getDiagonalIndex(sparse2);\n  putDiagonalIndex(sparse1, m);\n  putDiagonalIndex(sparse2, n);\n\n}\n\n\nvoid freeVector(sparseVector *sparse)\n{\n\tif(sparse != NULL) {\n    FREE(sparse->value);\n    FREE(sparse->index);\n    FREE(sparse);\n  }\n}\n\n\nMYBOOL verifyVector(sparseVector *sparse)\n{\n  int i, n, k1, k2, kd; \n  int  err = 0;\n  double vd;\n\n  n = sparse->count;\n  kd = sparse->index[0];\n  vd = sparse->value[0];\n  if(n <= 1)\n    return(TRUE);\n  k1 = 0;\n  k2 = sparse->index[1];\n  if(k2 == kd && sparse->value[1] != vd) \n    err = 2;\n\n  for(i = 2; i <= n && err == 0; i++) {\n    k1 = k2;\n    k2 = sparse->index[i];\n    if(k1 >= k2) err = 1;\n    if(k2 == kd && sparse->value[i] != vd) err = 2;\n  }\n  if(err == 0)\n    return(TRUE);\n  else if(err == 1)\n    printf(\"Invalid sparse vector index order\");\n  else if(err == 2)\n    printf(\"Invalid sparse vector diagonal value\");\n  return(FALSE);\n}\n\n\nint firstIndex(sparseVector *sparse)\n{\n  return(sparse->index[1]);\n}\n\n\nint lastIndex(sparseVector *sparse)\n{\n  return(sparse->index[sparse->count]);\n}\n\n\nint getDiagonalIndex(sparseVector *sparse)\n{\n  return(sparse->index[0]);\n}\n\n\nint putDiagonalIndex(sparseVector *sparse, int index)\n{\n  int oldindex;\n  oldindex = sparse->index[0];\n  if(index > 0) {\n    sparse->index[0] = 0; /* Must temporarily set to zero to force vector search in getItem */\n    sparse->value[0] = getItem(sparse, index);\n  }\n  else\n    sparse->value[0] = 0;\n  sparse->index[0] = index;\n  return(oldindex);\n}\n\n\nMYBOOL putDiagonal(sparseVector *sparse, REAL value)\n{\n  if(sparse->index[0]>0) {\n    putItem(sparse, sparse->index[0], value); \n    return(TRUE);\n  }\n  else\n    return(FALSE);\n}\n\n\nREAL getDiagonal(sparseVector *sparse)\n{\n   return(sparse->value[0]);\n}\n\n\nREAL getItem(sparseVector *sparse, int targetIndex)\n{\n  /* First check if we want the diagonal element */ \n  if(targetIndex == sparse->index[0])\n    return(sparse->value[0]);\n\n  /* If not, search for the variable's position in the index list */\n  targetIndex = findIndex(targetIndex, sparse->index, sparse->count, BLAS_BASE);\n  if(targetIndex < 0)\n    return(0);\n  else\n    return(sparse->value[targetIndex]);\n}\n\n\nREAL addtoItem(sparseVector *sparse, int targetIndex, REAL value)\n{\n  int idx;\n\n  if(targetIndex > 0) \n    idx = findIndex(targetIndex, sparse->index, sparse->count, BLAS_BASE);\n  else {\n    idx = -targetIndex;\n    if(idx > sparse->count)\n      /* Index error; ignore item */\n      return(0.0);\n  }\n\n  if(idx <=0 )\n    value = putItem(sparse, targetIndex, value);\n  else {\n    value += sparse->value[idx];\n    putItem(sparse, -idx, value);\n  }\n  return(value);\n}\n\n\nREAL putItem(sparseVector *sparse, int targetIndex, REAL value)\n{\n  REAL last = 0.0;\n  int  posIndex;\n\n  if(targetIndex < 0) {\n    posIndex = -targetIndex;\n    if(posIndex > sparse->count)\n      return(last);\n    targetIndex = sparse->index[posIndex];\n  }\n  else\n    posIndex = findIndex(targetIndex, sparse->index, sparse->count, BLAS_BASE);\n\n  if(fabs(value) < MACHINEPREC)\n    value = 0;\n\n  if(targetIndex == sparse->index[0]) \n    sparse->value[0] = value;\n\n  if(posIndex < 0) {\n    if(value != 0) {\n      if(sparse->count == sparse->size)\n        resizeVector(sparse, sparse->size + RESIZEDELTA);\n      posIndex = -posIndex;\n      sparse->count++;\n      if(posIndex < sparse->count) \n        moveVector(sparse, posIndex+1, posIndex, sparse->count-posIndex);\n      sparse->value[posIndex] = value;\n      sparse->index[posIndex] = targetIndex;\n    }\n  }\n  else {\n    if(value == 0) {\n      last = sparse->value[posIndex];\n      if(sparse->count > posIndex) \n        moveVector(sparse, posIndex, posIndex+1, sparse->count-posIndex);\n      sparse->count--;\n    }\n    else {\n      sparse->value[posIndex] = value;\n      sparse->index[posIndex] = targetIndex;\n    }\n  }\n\n#ifdef DEBUG_SPARSELIB\n  verifyVector(sparse);\n#endif\n\n  return(last);\n}\n\n\nvoid swapItems(sparseVector *sparse, int firstIndex, int secondIndex)\n{\n  int i,j,ki,kj;\n  REAL hold;\n\n  if(firstIndex == secondIndex)\n    return;\n  if(firstIndex > secondIndex) {\n    i = firstIndex;\n    firstIndex = secondIndex;\n    secondIndex = i;\n  }\n\n  if(FALSE) {\n    i = 1;\n    ki = 0;\n    while(i <= sparse->count && (ki = sparse->index[i])<firstIndex) i++;\n    j = i;\n    kj = 0;\n    while(j <= sparse->count && (kj = sparse->index[j])<secondIndex) j++;\n  }\n  else {\n    i = findIndex(firstIndex, sparse->index, sparse->count, BLAS_BASE);\n    if(i < 0)\n      i = -i;\n    j = findIndex(secondIndex, sparse->index, sparse->count, BLAS_BASE);\n    if(j < 0)\n      j = -j;\n  }\n\n  if(i > sparse->count)\n    ki = 0;\n  else\n    ki = sparse->index[i];\n  if(j > sparse->count)\n    kj = 0;\n  else\n    kj = sparse->index[j];\n\n  if(ki == firstIndex && kj == secondIndex) {   /* Found both -> swap in place */\n    hold = sparse->value[i];\n    sparse->value[i] = sparse->value[j];\n    sparse->value[j] = hold;\n\n    if(sparse->index[0] == firstIndex)\n      sparse->value[0] = sparse->value[i];\n    else if(sparse->index[0] == secondIndex)\n      sparse->value[0] = sparse->value[j];\n  }\n  else if(ki == firstIndex) {                   /* Found first, but not the second -> shift left */\n    j--;\n    if(i < j) {\n      hold = sparse->value[i];\n      moveVector(sparse, i, i+1, j-i);\n      sparse->value[j] = hold;\n    }\n    sparse->index[j] = secondIndex;\n\n    if(sparse->index[0] == firstIndex)\n      sparse->value[0] = 0;\n    else if(sparse->index[0] == secondIndex)\n      sparse->value[0] = sparse->value[j];\n\n  }\n  else if(kj == secondIndex) {                  /* Found second, but not the first -> shift right */\n    if(i < j) {\n      hold = sparse->value[j];\n      moveVector(sparse, i+1, i, j-i);\n      sparse->value[i] = hold;\n    }\n    sparse->index[i] = firstIndex;\n\n    if(sparse->index[0] == firstIndex)\n      sparse->value[0] = sparse->value[i];\n    else if(sparse->index[0] == secondIndex)\n      sparse->value[0] = 0;\n  }\n\n#ifdef DEBUG_SPARSELIB\n  verifyVector(sparse);\n#endif\n\n}\n\n\nvoid clearVector(sparseVector *sparse, int indexStart, int indexEnd)\n{\n  int i;\n\n  i = sparse->count;\n  if(i==0) return;\n\n  if(indexStart<=0)\n    indexStart=sparse->index[1];\n  if(indexEnd<=0)\n    indexEnd=sparse->index[i];\n\n  if(indexStart>indexEnd) return;\n\n  if(sparse->index[0]>=indexStart && sparse->index[0]<=indexEnd) {\n    sparse->value[0] = 0;\n  }\n  if(indexStart<=sparse->index[1] && indexEnd>=sparse->index[i]) \n    sparse->count = 0;\n  else {\n    while(i>0 && sparse->index[i]>indexEnd) i--;\n    indexEnd = i;\n    while(i>0 && sparse->index[i]>=indexStart) i--;\n    indexStart = i+1;\n    if(indexEnd>=indexStart) {\n      i = sparse->count-indexEnd;\n      moveVector(sparse, indexStart, indexEnd+1, i);\n      sparse->count -= indexEnd-indexStart+1;\n    }\n  }\n\n#ifdef DEBUG_SPARSELIB\n  verifyVector(sparse);\n#endif\n\n}\n\n\nint getVector(sparseVector *sparse, REAL *dense, int indexStart, int indexEnd, MYBOOL doClear)\n{\n  int i,k;\n\n  i = 1;\n  while(i<=sparse->count && sparse->index[i]<indexStart) i++;\n\n  while(i<=sparse->count && (k=sparse->index[i])<=indexEnd) {\n    while(indexStart<k) {\n      dense[indexStart] = 0;\n      indexStart++;\n    }\n    dense[indexStart] = sparse->value[i];\n    indexStart++;\n    i++;\n  }\n\n  while(indexStart<=indexEnd) {\n    dense[indexStart] = 0;\n    indexStart++;\n  }\n\n  k = sparse->count;\n  if(doClear) {\n    sparse->count = 0;\n    sparse->value[0] = 0;\n  }\n  return(k);\n}\n\nvoid putVector(sparseVector *sparse, REAL *dense, int indexStart, int indexEnd)\n{\n  int i,n;\n\n  n = sparse->count;\n  if(indexStart<=0)\n    indexStart=sparse->index[1];\n  if(indexEnd<=0)\n    indexEnd=sparse->index[n];\n\n  if(n==0 || sparse->index[n]<indexStart) {\n    i = sparse->index[0];\n    if(i>=indexStart && i<=indexEnd)\n      sparse->value[0] = 0;\n    for(i = indexStart; i<=indexEnd; i++) {\n      if(dense[i] == 0) continue;\n      if(sparse->size == sparse->count)\n        resizeVector(sparse, sparse->size + RESIZEDELTA);\n      sparse->count++;\n      sparse->value[sparse->count] = dense[i];\n      sparse->index[sparse->count] = i;\n      if(i == sparse->index[0]) \n        sparse->value[0] = dense[i];\n    }\n  }\n  else {\n    while(indexStart <= indexEnd) {\n      putItem(sparse, indexStart, dense[indexStart]);\n      indexStart++;\n    }\n  }\n\n#ifdef DEBUG_SPARSELIB\n  verifyVector(sparse);\n#endif\n\n}\n\n\nvoid fillVector(sparseVector *sparse, int count, REAL value)\n{\n  int i;\n\n  if(sparse->count > 0) \n    clearVector(sparse, 0, 0);\n  for(i = 1; i<=count; i++)\n    putItem(sparse, i, value);\n}\n\n\nREAL dotVector(sparseVector *sparse, REAL *dense, int indexStart, int indexEnd)\n{\n  int  i, n;\n  long REAL sum;\n  \n  n = sparse->count;\n  sum = 0;\n\n  if(n > 0) {\n    if(indexStart<=0)\n      indexStart=sparse->index[1];\n    if(indexEnd<=0)\n      indexEnd=sparse->index[n];\n\n    if(indexStart > 1) {\n      i = findIndex(indexStart, sparse->index, sparse->count, BLAS_BASE);\n      if(i < 0) {\n        i = -i;\n        if(i > n) \n          return(sum);\n      }\n    }\n    else\n      i = 1;\n\n    /* CPU intensive loop; provide alternative evaluation models */\n#if defined DOFASTMATH\n    {\n      /* Do fast pointer arithmetic */\n      int  *indexptr;\n      REAL *valueptr;\n/*      for(i = 1, indexptr = sparse->index + 1;\n          i <= n && (*indexptr) < indexStart; i++, indexptr++); */\n      indexptr = sparse->index + i;\n      for(valueptr = sparse->value + i;\n          i <= n && (*indexptr) <= indexEnd;  i++, indexptr++, valueptr++) \n        sum += (*valueptr) * dense[(*indexptr)];\n    }\n#else\n    {\n      /* Do traditional indexed access */\n      int k;\n/*      i = 1; */\n/*      while(i<=n && sparse->index[i]<indexStart) i++; */\n      while(i<=n && (k = sparse->index[i])<=indexEnd) {\n        sum += sparse->value[i] * dense[k];\n        i++;\n      }\n    }\n#endif    \n  }\n\n  return(sum);\n}\n\n\nvoid daxpyVector1(sparseVector *sparse, REAL scalar, REAL *dense, int indexStart, int indexEnd)\n{\n  int i, n;\n\n  if(scalar == 0) return;\n\n  n = sparse->count;\n  if(indexStart<=0)\n    indexStart=sparse->index[1];\n  if(indexEnd<=0)\n    indexEnd=sparse->index[n];\n\n  /* CPU intensive loop; provide alternative evaluation models */\n#if defined DOFASTMATH\n  {\n    /* Do fast pointer arithmetic */\n    int    *indexptr;\n    REAL *valueptr;\n    for(i = 1, indexptr = sparse->index + 1;\n        i <= n && (*indexptr) < indexStart; i++, indexptr++);\n    for(valueptr = sparse->value + i;\n        i <= n && (*indexptr) <= indexEnd;  i++, indexptr++, valueptr++) \n      dense[(*indexptr)] += (*valueptr) * scalar;\n  }\n#else\n  {\n    /* Do traditional indexed access */\n    int k;\n    for(i = 1; i<= n; i++) {\n      k = sparse->index[i];\n      if(k<indexStart) continue;\n      if(k>indexEnd) break;\n      dense[k] += sparse->value[i] * scalar;\n    }\n  }\n#endif  \n}\nvoid daxpyVector2(REAL *dense, REAL scalar, sparseVector *sparse, int indexStart, int indexEnd)\n{\n  sparseVector *hold;\n\n  hold = createVector(sparse->limit, sparse->count);\n  putDiagonalIndex(hold, getDiagonalIndex(sparse));\n  putVector(hold, dense, indexStart, indexEnd);\n  daxpyVector3(hold, scalar, sparse, indexStart, indexEnd);\n  freeVector(hold);\n}\nvoid daxpyVector3(sparseVector *sparse1, REAL scalar, sparseVector *sparse2, int indexStart, int indexEnd)\n{\n  int i1, i2, k, p1, p2, c1, c2;\n  sparseVector *hold;\n\n  if(sparse1->count == 0) return;\n\n /* Spool to start positions */\n  i1 = 1;\n  c1 = sparse1->count;\n  while(i1 <= c1 && sparse1->index[i1] < indexStart) i1++;\n  if(i1 <= c1)\n    p1 = sparse1->index[i1];\n  else\n    p1 = indexEnd+1;\n\n  i2 = 1;\n  c2 = sparse2->count;\n  while(i2 <= c2 && sparse2->index[i2] < indexStart) i2++;\n  if(i2 <= c2)\n    p2 = sparse2->index[i2];\n  else\n    p2 = indexEnd+1;\n\n /* Create a temporary vector */\n  k = c1+c2;\n  if(k > 0) {\n    hold = createVector(MAX(sparse1->limit, sparse2->limit), k);\n    putDiagonalIndex(hold, getDiagonalIndex(sparse2));\n  }\n  else\n    hold = sparse2;\n\n /* Loop over all items in both vectors */\n  while((i1 <= c1 && p1 <= indexEnd) || \n        (i2 <= c2 && p2 <= indexEnd)) {\n\n    k = 0;\n\n   /* Add/spool exclusive right-vector items */\n    while(i2 <= c2 && p2 < p1) {\n      if(hold != sparse2)\n        putItem(hold, p2, sparse2->value[i2]);\n      i2++;\n      if(i2 <= c2)\n        p2 = sparse2->index[i2];\n      else\n        p2 = indexEnd+1;\n      k++;\n    }\n   /* Add equal-indexed items */\n    while(i1 <= c1 && i2 <= c2 && p1 == p2) {\n/*      if(hold != sparse2) */\n        putItem(hold, p1, scalar*sparse1->value[i1]+sparse2->value[i2]);\n/*      else\n          addtoItem(sparse2, -i2, scalar*sparse1->value[i1]); */\n      i1++;\n      if(i1 <= c1)\n        p1 = sparse1->index[i1];\n      else\n        p1 = indexEnd+1;\n      i2++;\n      if(i2 <= c2)\n        p2 = sparse2->index[i2];\n      else\n        p2 = indexEnd+1;\n      k++;\n    }\n   /* Add exclusive left-vector items */\n    while(i1 <= c1 && p1 < p2) {\n      putItem(hold, p1, scalar*sparse1->value[i1]);\n/*      if(hold == sparse2) c2++; */\n      i1++;\n      if(i1 <= c1)\n        p1 = sparse1->index[i1];\n      else\n        p1 = indexEnd+1;\n      k++;\n    }\n\n    if(k == 0) break;\n  }\n\n/*  if(hold != sparse2) */\n  {\n    swapVector(hold, sparse2);\n    freeVector(hold);\n  }\n\n#ifdef DEBUG_SPARSELIB\n  verifyVector(sparse2);\n#endif\n\n}\n\n\nvoid dswapVector1(sparseVector *sparse, REAL *dense, int indexStart, int indexEnd)\n{\n  int i, d, n;\n  REAL *x;\n\n  if(indexStart <= 0)\n    indexStart = 1;\n  n = lastIndex(sparse);\n  if(indexEnd <= 0) \n    indexEnd = n;\n  CALLOC(x, (MAX(indexEnd,n)+1));\n\n  getVector(sparse, x, indexStart, n, FALSE);\n  d = getDiagonalIndex(sparse);\n  clearVector(sparse, indexStart, n);\n  for(i = indexStart; i<=indexEnd; i++) {\n    if(dense[i] != 0)\n      putItem(sparse, i, dense[i]);\n  }\n  for(i = indexEnd+1; i<=n; i++) {\n    if(x[i] != 0)\n      putItem(sparse, i, x[i]);\n  }\n  MEMCOPY(&dense[indexStart], &x[indexStart], (indexEnd-indexStart+1));\n\n#ifdef DEBUG_SPARSELIB\n  verifyVector(sparse);\n#endif\n  \n  FREE(x);\n}\nvoid dswapVector2(REAL *dense, sparseVector *sparse, int indexStart, int indexEnd)\n{\n  dswapVector1(sparse, dense, indexStart, indexEnd);\n}\n\n\nvoid dswapVector3(sparseVector *sparse1, sparseVector *sparse2, int indexStart, int indexEnd)\n{\n\n  REAL *dense1, *dense2;\n\n  if(indexStart<=0)\n    indexStart = 1;\n  if(indexEnd<=0)\n    indexEnd = MAX(lastIndex(sparse1), lastIndex(sparse2));\n\n  if(indexStart <= firstIndex(sparse1) && indexStart <= firstIndex(sparse2) && \n     indexEnd >= lastIndex(sparse1) && indexEnd >= lastIndex(sparse2)) {\n    swapVector(sparse1, sparse2);\n  }\n  else {\n\n    CALLOC(dense1, (indexEnd+1));\n    CALLOC(dense2, (indexEnd+1));\n    getVector(sparse1, dense1, indexStart, indexEnd, TRUE);\n    getVector(sparse2, dense2, indexStart, indexEnd, TRUE);\n    clearVector(sparse1, indexStart, indexEnd);\n    clearVector(sparse2, indexStart, indexEnd);\n    putVector(sparse1, dense2, indexStart, indexEnd);\n    putVector(sparse2, dense1, indexStart, indexEnd);\n    FREE(dense1);\n    FREE(dense2);\n  }\n}\n\n\nint idamaxVector(sparseVector *sparse, int is, REAL *maxValue)\n{\n  int    i, n, imax;\n  REAL xmax;\n\n  n = sparse->count;\n  imax = 1;\n  if(n == 0)\n    xmax = 0;\n  else {\n    xmax = fabs(sparse->value[imax]);\n\n    /* CPU intensive loop; provide alternative evaluation models */\n#if defined DOFASTMATH\n    {\n      /* Do fast pointer arithmetic */\n      int  *indexptr;\n      REAL *valueptr;\n      for(i = 1, indexptr = sparse->index + 1;\n          i <= n && (*indexptr) <= is; i++, indexptr++);\n      for(valueptr = sparse->value + i;\n          i <= n; i++, indexptr++, valueptr++) {\n\t      if((*valueptr)>xmax) {\n\t\t      xmax = (*valueptr);\n\t\t      imax = (*indexptr);\n        }\n      }\n    }\n#else\n    {\n      REAL xtest;\n      /* Do traditional indexed access */\n      i = 1;\n      while(i <= n && sparse->index[i] <= is) i++;\n      for(; i<=n; i++) {\n        xtest = fabs(sparse->value[i]);\n\t      if(xtest>xmax) {\n\t\t      xmax = xtest;\n\t\t      imax = sparse->index[i];\n        }\n      }\n    }\n#endif    \n  }\n  if(maxValue != NULL)\n    (*maxValue) = sparse->index[imax];\n  return(imax);\n}\n\n\nvoid printVector(int n, sparseVector *sparse, int modulo )\n{\n  int i,j,k;\n\n  if(sparse == NULL) return;\n\n  if (modulo <= 0) modulo = 5;\n  for (i = 1, j = 1; j<=n; i++, j++) {\n    if(i<=sparse->count)\n      k = sparse->index[i];\n    else\n      k = n+1;\n    while (j < k) {\n      if(mod(j, modulo) == 1) \n        printf(\"\\n%2d:%12g\", j, 0.0);\n      else\n        printf(\" %2d:%12g\", j, 0.0);\n      j++;\n    }\n    if(k<=n) {\n      if(mod(j, modulo) == 1) \n        printf(\"\\n%2d:%12g\", k, sparse->value[i]);\n      else\n        printf(\" %2d:%12g\", k, sparse->value[i]);\n    }\n  }\n  if(mod(j, modulo) != 0) printf(\"\\n\");\n}\n\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/bfp/bfp_LUSOL/LUSOL/sparselib.h",
    "content": "\n#include \"commonlib.h\"\n\n/*#define DEBUG_SPARSELIB*/\n\n#define INITIALSIZE 10\n#define RESIZEDELTA  4\n\n#ifndef SPARSELIB\n\n#define SPARSELIB\n\ntypedef struct _sparseVector {\n  int    limit;\n  int    size;\n  int    count;\n  int    *index;\n  REAL *value;\n} sparseVector;\n\ntypedef struct _sparseMatrix {\n  int    limit;\n  int    size;\n  int    count;\n  int    limitVector;\n  sparseVector **list;\n} sparseMatrix;\n\n#endif\n\n\n#ifdef __cplusplus\n  extern \"C\" {\n#endif\n\nsparseMatrix *createMatrix(int dimLimit, int lenLimit, int initVectors);\nvoid resizeMatrix(sparseMatrix *matrix, int newSize);\nint appendMatrix(sparseMatrix *matrix, sparseVector *newVector);\nint NZcountMatrix(sparseMatrix *matrix);\nvoid freeMatrix(sparseMatrix *matrix);\nvoid printMatrix(int n, sparseMatrix *matrix, int modulo, MYBOOL showEmpty);\n\nsparseVector *createVector(int dimLimit, int initSize);\nsparseVector *cloneVector(sparseVector *sparse);\nint  redimensionVector(sparseVector *sparse, int newDim);\nint  resizeVector(sparseVector *sparse, int newSize);\nvoid moveVector(sparseVector *sparse, int destPos, int sourcePos, int itemCount);\nvoid rotateVector(sparseVector *sparse, int startPos, int chainSize, int stepDelta);\nvoid swapVector(sparseVector *sparse1, sparseVector *sparse2);\nvoid freeVector(sparseVector *sparse);\nvoid printVector(int n, sparseVector *sparse, int modulo);\nMYBOOL verifyVector(sparseVector *sparse);\n\nint firstIndex(sparseVector *sparse);\nint lastIndex(sparseVector *sparse);\nint getDiagonalIndex(sparseVector *sparse);\nint putDiagonalIndex(sparseVector *sparse, int index);\nMYBOOL putDiagonal(sparseVector *sparse, REAL value);\nREAL getDiagonal(sparseVector *sparse);\nREAL getItem(sparseVector *sparse, int targetIndex);\nREAL putItem(sparseVector *sparse, int targetIndex, REAL value);\nREAL addtoItem(sparseVector *sparse, int targetIndex, REAL value);\nvoid swapItems(sparseVector *sparse, int firstIndex, int secondIndex);\nvoid clearVector(sparseVector *sparse, int indexStart, int indexEnd);\nint getVector(sparseVector *sparse, REAL *dense, int indexStart, int indexEnd, MYBOOL doClear);\nvoid putVector(sparseVector *sparse, REAL *dense, int indexStart, int indexEnd);\nvoid fillVector(sparseVector *sparse, int count, REAL value);\n\nREAL dotVector(sparseVector *sparse, REAL *dense, int indexStart, int indexEnd);\n\nvoid daxpyVector1(sparseVector *sparse, REAL scalar, REAL *dense, int indexStart, int indexEnd);\nvoid daxpyVector2(REAL *dense, REAL scalar, sparseVector *sparse, int indexStart, int indexEnd);\nvoid daxpyVector3(sparseVector *sparse1, REAL scalar, sparseVector *sparse2, int indexStart, int indexEnd);\n\nvoid dswapVector1(sparseVector *sparse, REAL *dense, int indexStart, int indexEnd);\nvoid dswapVector2(REAL *dense, sparseVector *sparse, int indexStart, int indexEnd);\nvoid dswapVector3(sparseVector *sparse1, sparseVector *sparse2, int indexStart, int indexEnd);\n\nint idamaxVector(sparseVector *sparse, int is, REAL *maxValue);\n\n#ifdef __cplusplus\n  }\n#endif\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/bfp/bfp_LUSOL/bfp_LUSOL.c",
    "content": "\n#include \"bfp_LUSOL.h\"\n#include \"lp_lib.h\"\n#include \"lp_LUSOL.h\"\n\nBOOL APIENTRY DllMain( HANDLE hModule, \n                       DWORD  ul_reason_for_call, \n                       LPVOID lpReserved\n\t\t\t\t\t )\n{\n\tswitch (ul_reason_for_call)\n\t{\n\tcase DLL_PROCESS_ATTACH:\n\tcase DLL_THREAD_ATTACH:\n\tcase DLL_THREAD_DETACH:\n\tcase DLL_PROCESS_DETACH:\n\t\tbreak;\n\t}\n    return TRUE;\n}\n\n#if defined FORTIFY\nint EndOfPgr(int i)\n{\n    exit(i);\n}\n#endif\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/bfp/bfp_LUSOL/bfp_LUSOL.h",
    "content": "// stdafx.h : include file for standard system include files,\n// or project specific include files that are used frequently, but\n// are changed infrequently\n//\n\n//#pragma once\n\n//RoleIsExternalInvEngine;INVERSE_ACTIVE=INVERSE_LUSOL\n\n#define WIN32_LEAN_AND_MEAN\t\t// Exclude rarely-used stuff from Windows headers\n// Windows Header Files:\n#include <windows.h>\n\n// TODO: reference additional headers your program requires here\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/bfp/bfp_LUSOL/lp_LUSOL.c",
    "content": "\n/*  Modularized simplex basis factorization module - w/interface for lp_solve v5.0+\n   ----------------------------------------------------------------------------------\n    Author:        Kjell Eikland\n    Contact:       kjell.eikland@broadpark.no\n    License terms: LGPL.\n\n    Requires:      lusol.h, lp_lib.h, myblas.h\n\n    Release notes:\n    v2.0.0  1 March 2004        First implementation of the LUSOL v2.0 C translation.\n    v2.0.1  1 April 2004        Added singularity recovery and fast/reuse update logic.\n    v2.0.2  23 May 2004         Moved mustrefact() function into the BFP structure.\n    v2.0.3  5 September 2004    Reworked pivot threshold tightening logic and default\n                                values.\n    v2.1.0  18 June 2005        Made changes to allow for \"pure\" factorization;\n                                i.e. without the objective function included.\n\n   ---------------------------------------------------------------------------------- */\n\n/* Generic include libraries */\n#include <stdlib.h>\n#include <string.h>\n#include \"lp_lib.h\"\n\n/* Include libraries for this factorization system */\n#include \"myblas.h\"\n#include \"commonlib.h\"\n#include \"lp_LUSOL.h\"\n#include \"lusol.h\"\n\n#ifdef FORTIFY\n# include \"lp_fortify.h\"\n#endif\n\n/* Include routines common to factorization engine implementations */\n#include \"lp_BFP1.c\"\n#include \"lp_BFP2.c\"\n\n\n/* MUST MODIFY */\nchar * BFP_CALLMODEL bfp_name(void)\n{\n  return( \"LUSOL v2.2.1.0\" );\n}\n\n\n/* MUST MODIFY */\nMYBOOL BFP_CALLMODEL bfp_resize(lprec *lp, int newsize)\n{\n  INVrec *lu;\n\n  lu = lp->invB;\n\n  /* Increment dimensionality since we put the objective row at the top */\n  newsize = newsize + bfp_rowoffset(lp);\n  lu->dimalloc = newsize;\n\n  /* Allocate index tracker arrays, LU matrices and various work vectors */\n  if(!allocREAL(lp, &(lu->value), newsize+MATINDEXBASE, AUTOMATIC))\n    return( FALSE );\n\n  /* Data specific to the factorization engine */\n  if(lu->LUSOL != NULL) {\n    if(newsize > 0 || 1)\n      LUSOL_sizeto(lu->LUSOL, newsize, newsize, 0);\n    else {\n      LUSOL_free(lu->LUSOL);\n      lu->LUSOL = NULL;\n    }\n  }\n  else if(newsize > 0 || 1) {\n    int  asize;\n    REAL bsize;\n\n    lu->LUSOL = LUSOL_create(NULL, 0, LUSOL_PIVMOD_TPP, bfp_pivotmax(lp)*0);\n\n#if 1\n    lu->LUSOL->luparm[LUSOL_IP_ACCELERATION]  = LUSOL_AUTOORDER;\n    lu->LUSOL->parmlu[LUSOL_RP_SMARTRATIO]    = 0.50;\n#endif\n#if 0\n    lu->timed_refact = DEF_TIMEDREFACT;\n#else\n    lu->timed_refact = FALSE;\n#endif\n\n    /* The following adjustments seem necessary to make the really tough NETLIB\n       models perform reliably and still performant (e.g. cycle.mps) */\n#if 0\n    lu->LUSOL->parmlu[LUSOL_RP_SMALLDIAG_U]   =\n    lu->LUSOL->parmlu[LUSOL_RP_EPSDIAG_U]     = lp->epsprimal;\n#endif\n#if 0\n    lu->LUSOL->parmlu[LUSOL_RP_ZEROTOLERANCE] = lp->epsvalue;\n#endif\n\n#if 1\n    LUSOL_setpivotmodel(lu->LUSOL, LUSOL_PIVMOD_NOCHANGE, LUSOL_PIVTOL_SLIM);\n#else\n    LUSOL_setpivotmodel(lu->LUSOL, LUSOL_PIVMOD_NOCHANGE, LUSOL_PIVTOL_TIGHT);\n#endif\n\n#ifdef LUSOL_UseBLAS\n/*    if(fileSearchPath(\"PATH\", \"myBLAS.DLL\", NULL) && load_BLAS(\"myBLAS\")) */\n    if(is_nativeBLAS() && load_BLAS(libnameBLAS))\n      lp->report(lp, NORMAL, \"Optimized BLAS was successfully loaded for bfp_LUSOL.\\n\");\n#endif\n\n    /* Try to minimize memory allocation if we have a large number of unit columns */\n    bsize = (REAL) lp->get_nonzeros(lp);\n    if(newsize > lp->columns)\n      bsize += newsize;\n    else\n      bsize = bsize/lp->columns*newsize;\n    /* Add a \"reasonable\" delta to allow for B and associated factorizations\n       that are denser than average; this makes reallocations less frequent.\n       Values between 1.2 and 1.5 appear to be reasonable. */\n    asize = (int) (bsize*MAX_DELTAFILLIN*1.3333);\n    if(!LUSOL_sizeto(lu->LUSOL, newsize, newsize, asize))\n      return( FALSE );\n  }\n  lu->dimcount = newsize;\n  return( TRUE );\n}\n\n\n/* MUST MODIFY */\nvoid BFP_CALLMODEL bfp_free(lprec *lp)\n{\n  INVrec *lu;\n\n  lu = lp->invB;\n  if(lu == NULL)\n    return;\n\n  /* General arrays */\n  FREE(lu->opts);\n  FREE(lu->value);\n\n  /* Data specific to the factorization engine */\n  LUSOL_free(lu->LUSOL);\n\n  FREE(lu);\n  lp->invB = NULL;\n}\n\n\n/* MUST MODIFY */\nint BFP_CALLMODEL bfp_nonzeros(lprec *lp, MYBOOL maximum)\n{\n  INVrec *lu;\n\n  lu = lp->invB;\n  if(maximum == TRUE)\n    return(lu->max_LUsize);\n  else if(maximum == AUTOMATIC)\n    return(lu->max_Bsize);\n  else\n    return(lu->LUSOL->luparm[LUSOL_IP_NONZEROS_L0]+lu->LUSOL->luparm[LUSOL_IP_NONZEROS_U0]);\n/*    return(lu->LUSOL->luparm[LUSOL_IP_NONZEROS_ROW]); */\n}\n\n\n/* MUST MODIFY (or ignore) */\nint BFP_CALLMODEL bfp_memallocated(lprec *lp)\n{\n  int      mem;\n  LUSOLrec *LUSOL = lp->invB->LUSOL;\n\n  mem = sizeof(REAL) * (LUSOL->lena+LUSOL->maxm+LUSOL_RP_LASTITEM);\n  mem += sizeof(int) * (2*LUSOL->lena+5*LUSOL->maxm+5*LUSOL->maxn+LUSOL_IP_LASTITEM);\n  if(LUSOL->luparm[LUSOL_IP_PIVOTTYPE] == LUSOL_PIVMOD_TCP)\n    mem += sizeof(REAL) * LUSOL->maxn + 2*sizeof(REAL)*LUSOL->maxn;\n  else if(LUSOL->luparm[LUSOL_IP_PIVOTTYPE] == LUSOL_PIVMOD_TRP)\n    mem += sizeof(REAL) * LUSOL->maxn;\n  if(!LUSOL->luparm[LUSOL_IP_KEEPLU])\n    mem += sizeof(REAL) * LUSOL->maxn;\n  return( mem );\n}\n\n\n/* MUST MODIFY */\nint BFP_CALLMODEL bfp_preparefactorization(lprec *lp)\n{\n  INVrec *lu = lp->invB;\n\n  /* Finish any outstanding business */\n  if(lu->is_dirty == AUTOMATIC)\n    lp->bfp_finishfactorization(lp);\n\n  /* Clear or resize the existing LU matrices - specific for the factorization engine */\n  LUSOL_clear(lu->LUSOL, TRUE);\n  if(lu->dimcount != lp->rows + bfp_rowoffset(lp))\n    lp->bfp_resize(lp, lp->rows);\n\n  /* Reset additional indicators */\n  lp->bfp_updaterefactstats(lp);\n  lu->col_pos = 0;\n\n  return(0);\n\n}\n\n\n/* LOCAL HELPER ROUTINE - Replace a basis column with corresponding slack */\nint bfp_LUSOLsetcolumn(lprec *lp, int posnr, int colnr)\n{\n  int nz, inform;\n\n  nz = lp->get_lpcolumn(lp, colnr, lp->invB->LUSOL->w + bfp_rowoffset(lp), NULL, NULL);\n  inform = LUSOL_replaceColumn(lp->invB->LUSOL, posnr, lp->invB->LUSOL->w);\n  return( inform );\n}\n\n\n/* LOCAL HELPER ROUTINE - force the basis to be the identity matrix */\nint bfp_LUSOLidentity(lprec *lp, int *rownum)\n{\n  int    i, nz;\n  INVrec *invB = lp->invB;\n\n  /* Reset the factorization engine */\n  LUSOL_clear(invB->LUSOL, TRUE);\n\n  /* Add the basis columns */\n  lp->invB->set_Bidentity = TRUE;\n  for(i = 1; i <= invB->dimcount; i++) {\n    nz = lp->get_basiscolumn(lp, i, rownum, invB->value);\n    LUSOL_loadColumn(invB->LUSOL, rownum, i, invB->value, nz, 0);\n  }\n  lp->invB->set_Bidentity = FALSE;\n\n  /* Factorize */\n  i = LUSOL_factorize(invB->LUSOL);\n\n  return( i );\n}\n\n\n/* LOCAL HELPER ROUTINE */\nint bfp_LUSOLfactorize(lprec *lp, MYBOOL *usedpos, int *rownum, int *singular)\n{\n  int    i, j, nz, deltarows = bfp_rowoffset(lp);\n  INVrec *invB = lp->invB;\n\n  /* Handle normal, presumed nonsingular case */\n  if(singular == NULL) {\n\n  /* Optionally do a symbolic minimum degree ordering;\n     not that slack variables should not be processed */\n/*#define UsePreprocessMDO*/\n#ifdef UsePreprocessMDO\n    int *mdo;\n    mdo = lp->bfp_createMDO(lp, usedpos, lp->rows, TRUE);\n    if(mdo != NULL) {\n      for(i = 1; i <= lp->rows; i++)\n        lp->set_basisvar(lp, i, mdo[i]);\n      FREE(mdo);\n    }\n#endif\n\n    /* Reset the factorization engine */\n    LUSOL_clear(invB->LUSOL, TRUE);\n\n    /* Add the basis columns in the original order */\n    for(i = 1; i <= invB->dimcount; i++) {\n      nz = lp->get_basiscolumn(lp, i, rownum, invB->value);\n      LUSOL_loadColumn(invB->LUSOL, rownum, i, invB->value, nz, 0);\n      if((i > deltarows) && (lp->var_basic[i-deltarows] > lp->rows))\n        lp->invB->user_colcount++;\n    }\n\n    /* Factorize */\n    i = LUSOL_factorize(invB->LUSOL);\n  }\n\n  /* Handle case where a column may be singular */\n  else {\n    LLrec *map;\n\n    /* Reset the factorization engine */\n    i = bfp_LUSOLidentity(lp, rownum);\n\n    /* Build map of available columns */\n    nz = createLink(lp->rows, &map, NULL);\n    for(i = 1; i <= lp->rows; i++) {\n      if(lp->var_basic[i] <= lp->rows)\n        removeLink(map, i);\n    }\n\n    /* Rebuild the basis, column by column, while skipping slack columns */\n    j = firstActiveLink(map);\n    for(i = 1; i <= lp->rows; i++) {\n      if(lp->var_basic[i] <= lp->rows)\n        continue;\n      nz = bfp_LUSOLsetcolumn(lp, j+deltarows, lp->var_basic[i]);\n      if(nz == LUSOL_INFORM_LUSUCCESS)\n        lp->invB->user_colcount++;\n      else {\n        nz = bfp_LUSOLsetcolumn(lp, j+deltarows, i);\n        lp->set_basisvar(lp, i, i);\n      }\n      j = nextActiveLink(map, j);\n    }\n\n    /* Sort the basis list */\n    MEMCOPY(rownum, lp->var_basic, lp->rows+1);\n    sortByINT(lp->var_basic, rownum, lp->rows, 1, TRUE);\n\n  }\n\n  return( i );\n}\n/* LOCAL HELPER ROUTINE */\nvoid bfp_LUSOLtighten(lprec *lp)\n{\n  int infolevel = DETAILED;\n\n  switch(LUSOL_tightenpivot(lp->invB->LUSOL)) {\n    case FALSE: lp->report(lp, infolevel, \"bfp_factorize: Very hard numerics, but cannot tighten LUSOL thresholds further.\\n\");\n                 break;\n    case TRUE:  lp->report(lp, infolevel, \"bfp_factorize: Frequent refact pivot count %d at iter %.0f; tightened thresholds.\\n\",\n                                           lp->invB->num_pivots, (REAL) lp->get_total_iter(lp));\n                 break;\n    default:    lp->report(lp, infolevel, \"bfp_factorize: LUSOL switched to %s pivoting model to enhance stability.\\n\",\n                                           LUSOL_pivotLabel(lp->invB->LUSOL));\n  }\n}\n\n#define is_fixedvar is_fixedvar_ /* resolves a compiler warning/error conflict with lp_lib.h */\n\nstatic MYBOOL is_fixedvar(lprec *lp, int variable)\n{\n  if((lp->bb_bounds != NULL && lp->bb_bounds->UBzerobased) || (variable <= lp->rows))\n    return( (MYBOOL) (lp->upbo[variable] < lp->epsprimal) );\n  else\n    return( (MYBOOL) (lp->upbo[variable]-lp->lowbo[variable] < lp->epsprimal) );\n} /* is_fixedvar */\n\n/* MUST MODIFY */\nint BFP_CALLMODEL bfp_factorize(lprec *lp, int uservars, int Bsize, MYBOOL *usedpos, MYBOOL final)\n{\n  int      kcol, inform,\n           *rownum = NULL,\n           singularities = 0,\n           dimsize = lp->invB->dimcount;\n  LUSOLrec *LUSOL = lp->invB->LUSOL;\n\n /* Set dimensions and create work array */\n  SETMAX(lp->invB->max_Bsize, Bsize+(1+lp->rows-uservars));\n  kcol = lp->invB->dimcount;\n  LUSOL->m = kcol;\n  LUSOL->n = kcol;\n  allocINT(lp, &rownum, kcol+1, FALSE);\n\n /* Check if the refactorization frequency is low;\n    tighten pivot thresholds if appropriate */\n  inform = lp->bfp_pivotcount(lp);\n  if(!final &&                        /* No solution update-based refactorization */\n     !lp->invB->force_refact &&       /* No sparsity-based refactorization */\n     !lp->is_action(lp->spx_action,\n          ACTION_TIMEDREINVERT) &&    /* No optimal time-based refactorization */\n     (inform > 5) && (inform < 0.25*lp->bfp_pivotmax(lp)))\n    bfp_LUSOLtighten(lp);\n\n\n /* Reload B and factorize */\n  inform = bfp_LUSOLfactorize(lp, usedpos, rownum, NULL);\n\n /* Do some checks */\n#ifdef Paranoia\n  if(uservars != lp->invB->user_colcount) {\n    lp->report(lp, SEVERE, \"bfp_factorize: User variable count reconciliation failed\\n\");\n    return( singularities );\n  }\n#endif\n\n  /* Check result and do further remedial action if necessary */\n  if(inform != LUSOL_INFORM_LUSUCCESS) {\n    int  singularcols,\n         replacedcols = 0;\n    REAL hold;\n\n    /* Make sure we do not tighten factorization pivot criteria too often, and simply\n       accept the substitution of slack columns into the basis */\n    if((lp->invB->num_singular+1) % TIGHTENAFTER == 0)\n      bfp_LUSOLtighten(lp);\n\n    /* Try to restore a non-singular basis by substituting singular columns with slacks */\n    while((inform == LUSOL_INFORM_LUSINGULAR) && (replacedcols < dimsize)) {\n      int    iLeave, jLeave, iEnter;\n      MYBOOL isfixed;\n\n      singularities++;\n      singularcols = LUSOL->luparm[LUSOL_IP_SINGULARITIES];\n      hold = (REAL) lp->get_total_iter(lp);\n      lp->report(lp, NORMAL, \"bfp_factorize: Resolving %d singularit%s at refact %d, iter %.0f\\n\",\n                             singularcols, my_plural_y(singularcols), lp->invB->num_refact, hold);\n\n      /* Find the failing / singular column(s) and make slack substitutions */\n      for(kcol = 1; kcol <= singularcols; kcol++) {\n\n        /* Determine leaving and entering columns. */\n        iLeave = LUSOL_getSingularity(LUSOL, kcol);        /* This is the singular column as natural index */\n        iEnter = iLeave;                                   /* This is the target replacement slack         */\n#if 1\n        iEnter = LUSOL->iqinv[iEnter];\n        iEnter = LUSOL->ip[iEnter];\n#endif\n        iLeave-= bfp_rowextra(lp);                         /* This is the original B column/basis index    */\n        jLeave = lp->var_basic[iLeave];                    /* This is the IA column index in lp_solve      */\n\n        /* Express the slack index in original lp_solve [1..rows] reference and check validity */\n /*       if(B4 != NULL) iEnter = B4->B4_row[iEnter]; v6 FUNCTIONALITY */\n        iEnter -=  bfp_rowextra(lp);\n        if(lp->is_basic[iEnter]) {\n          lp->report(lp, DETAILED, \"bfp_factorize: Replacement slack %d is already basic!\\n\", iEnter);\n\n          /* See if we can find a good alternative slack variable to enter */\n          iEnter = 0;\n          for(inform = 1; inform <= lp->rows; inform++)\n            if(!lp->is_basic[inform]) {\n              if((iEnter == 0) || (lp->upbo[inform] > lp->upbo[iEnter])) {\n                iEnter = inform;\n                if(my_infinite(lp, lp->upbo[iEnter]))\n                  break;\n              }\n            }\n          if(iEnter == 0) {\n            lp->report(lp, SEVERE, \"bfp_factorize: Could not find replacement slack variable!\\n\");\n            break;\n          }\n        }\n\n        /* We should update bound states for both the entering and leaving variables.\n           Note that this may cause (primal or dual) infeasibility, but I assume that\n           lp_solve traps this and takes necessary corrective action. */\n        isfixed = is_fixedvar(lp, iEnter);\n        if(isfixed)\n          lp->fixedvars++;\n        hold = lp->upbo[jLeave];\n        lp->is_lower[jLeave] = isfixed || (fabs(hold)>=lp->infinite) || (lp->rhs[iLeave] < hold);\n        lp->is_lower[iEnter] = TRUE;\n\n        /* Do the basis replacement */\n        lp->set_basisvar(lp, iLeave, iEnter);\n\n      }\n\n      /* Refactorize with slack substitutions */\n      inform = bfp_LUSOLfactorize(lp, NULL, rownum, NULL);\n      replacedcols += singularcols;\n    }\n\n    /* Check if we had a fundamental problem */\n    if(singularities >= dimsize) {\n      lp->report(lp, IMPORTANT, \"bfp_factorize: LUSOL was unable to recover from a singular basis\\n\");\n      lp->spx_status = NUMFAILURE;\n    }\n  }\n\n  /* Clean up before returning */\n  FREE(rownum);\n\n  /* Update statistics */\n  /* SETMAX(lp->invB->max_Bsize, (*Bsize)); */\n  lp->invB->num_singular += singularities;    /* The total number of singular updates */\n\n  return( singularities );\n}\n\n/* MUST MODIFY */\nMYBOOL BFP_CALLMODEL bfp_finishupdate(lprec *lp, MYBOOL changesign)\n/* Was addetacol() in versions of lp_solve before 4.0.1.8 - KE */\n{\n  int      i, k, kcol, deltarows = bfp_rowoffset(lp);\n  REAL     DIAG, VNORM;\n  INVrec   *lu = lp->invB;\n  LUSOLrec *LUSOL = lu->LUSOL;\n\n  if(!lu->is_dirty)\n    return( FALSE );\n  if(lu->is_dirty != AUTOMATIC)\n    lu->is_dirty = FALSE;\n\n  /* Perform the update */\n  k = lu->col_pos+deltarows;\n  lu->num_pivots++;\n  if(lu->col_leave > lu->dimcount-deltarows)\n    lu->user_colcount--;\n  if(lu->col_enter > lu->dimcount-deltarows)\n    lu->user_colcount++;\n  kcol = lu->col_pos;\n  lu->col_pos = 0;\n\n  /* Do standard update */\n#ifdef LUSOLSafeFastUpdate      /* NB! Defined in lusol.h */\n  if(TRUE || !changesign) {\n    if(changesign) {\n      REAL *temp = LUSOL->vLU6L;\n      for(i = 1, temp++; i <= lp->rows+deltarows; i++, temp++)\n        if(*temp != 0)\n          *temp = -(*temp);\n    }\n    /* Execute the update using data prepared earlier */\n    LU8RPC(LUSOL, LUSOL_UPDATE_OLDNONEMPTY, LUSOL_UPDATE_USEPREPARED,\n           k, NULL, NULL, &i, &DIAG, &VNORM);\n  }\n  else\n#endif\n  {\n    /* Retrieve the data for the entering column (base 0) */\n    i = lp->get_lpcolumn(lp, lu->col_enter, lu->value+deltarows, NULL, NULL);\n    lu->value[0] = 0;\n    /* Execute the update */\n    LU8RPC(LUSOL, LUSOL_UPDATE_OLDNONEMPTY, LUSOL_UPDATE_NEWNONEMPTY,\n           k, lu->value, NULL, &i, &DIAG, &VNORM);\n  }\n\n  if(i == LUSOL_INFORM_LUSUCCESS) {\n\n    /* Check if we should refactorize based on accumulation of fill-in */\n    DIAG  = LUSOL->luparm[LUSOL_IP_NONZEROS_L]+LUSOL->luparm[LUSOL_IP_NONZEROS_U];\n    VNORM = LUSOL->luparm[LUSOL_IP_NONZEROS_L0]+LUSOL->luparm[LUSOL_IP_NONZEROS_U0];\n#if 0\n    /* This is Michael Saunder's fixed parameter */\n    VNORM *= MAX_DELTAFILLIN;\n#else\n    /* This is Kjell Eikland's dynamic error accumulation measure */\n    VNORM *= pow(MAX_DELTAFILLIN, pow((0.5*LUSOL->nelem/VNORM), 0.25));\n#endif\n    lu->force_refact = (MYBOOL) ((DIAG > VNORM) && (lu->num_pivots > 20));\n\n#if 0\n    /* Additional KE logic to reduce maximum pivot count based on the density of B */\n    if(!lu->force_refact) {\n      VNORM = lp->rows+1;\n      VNORM = 1.0 - pow((REAL) LUSOL->nelem/VNORM/VNORM, 0.2);\n      lu->force_refact = (MYBOOL) (lu->num_pivots > VNORM*lp->bfp_pivotmax(lp));\n    }\n#endif\n  }\n\n  /* Handle errors */\n  else {\n/*    int infolevel = NORMAL; */\n    int infolevel = DETAILED;\n    lp->report(lp, infolevel, \"bfp_finishupdate: Failed at iter %.0f, pivot %d;\\n%s\\n\",\n                   (REAL) (lp->total_iter+lp->current_iter), lu->num_pivots, LUSOL_informstr(LUSOL, i));\n    if(i == LUSOL_INFORM_ANEEDMEM) {       /* To compress used memory and realloc, if necessary */\n      lp->invert(lp, INITSOL_USEZERO, FALSE);\n      if(i != LUSOL_INFORM_LUSUCCESS)\n        lp->report(lp, NORMAL, \"bfp_finishupdate: Insufficient memory at iter %.0f;\\n%s\\n\",\n                       (REAL) (lp->total_iter+lp->current_iter), LUSOL_informstr(LUSOL, i));\n    }\n    else if(i == LUSOL_INFORM_RANKLOSS) {  /* To fix rank loss and clear cumulative errors */\n#if 0\n      /* This is test code to do pivot in slack BEFORE refactorization (pessimistic approach);\n        assumes that LUSOL returns correct information about the source of the singularity */\n      kcol = LUSOL->luparm[LUSOL_IP_SINGULARINDEX];\n#ifdef MAPSINGULARCOLUMN\n      kcol = LUSOL_findColumnPosition(LUSOL, kcol);\n#endif\n      lp->set_basisvar(lp, kcol-deltarows, kcol-deltarows);\n#endif\n      lp->invert(lp, INITSOL_USEZERO, FALSE);\n      i = LUSOL->luparm[LUSOL_IP_INFORM];\n      if(i != LUSOL_INFORM_LUSUCCESS)\n        lp->report(lp, NORMAL, \"bfp_finishupdate: Recovery attempt unsuccessful at iter %.0f;\\n%s\\n\",\n                       (REAL) (lp->total_iter+lp->current_iter), LUSOL_informstr(LUSOL, i));\n      else\n        lp->report(lp, infolevel, \"bfp_finishupdate: Correction or recovery was successful.\\n\");\n    }\n  }\n  return( (MYBOOL) (i == LUSOL_INFORM_LUSUCCESS) );\n\n} /* bfp_finishupdate */\n\n\n/* MUST MODIFY */\nvoid BFP_CALLMODEL bfp_ftran_normal(lprec *lp, REAL *pcol, int *nzidx)\n{\n  int    i;\n  INVrec *lu;\n\n  lu = lp->invB;\n\n  /* Do the LUSOL ftran */\n  i = LUSOL_ftran(lu->LUSOL, pcol-bfp_rowoffset(lp), nzidx, FALSE);\n  if(i != LUSOL_INFORM_LUSUCCESS) {\n    lu->status = BFP_STATUS_ERROR;\n    lp->report(lp, NORMAL, \"bfp_ftran_normal: Failed at iter %.0f, pivot %d;\\n%s\\n\",\n                   (REAL) (lp->total_iter+lp->current_iter), lu->num_pivots, LUSOL_informstr(lu->LUSOL, i));\n  }\n}\n\n\n/* MAY MODIFY */\nvoid BFP_CALLMODEL bfp_ftran_prepare(lprec *lp, REAL *pcol, int *nzidx)\n{\n  int    i;\n  INVrec *lu;\n\n  lu = lp->invB;\n\n  /* Do the LUSOL ftran */\n  i = LUSOL_ftran(lu->LUSOL, pcol-bfp_rowoffset(lp), nzidx, TRUE);\n  if(i != LUSOL_INFORM_LUSUCCESS) {\n    lu->status = BFP_STATUS_ERROR;\n    lp->report(lp, NORMAL, \"bfp_ftran_prepare: Failed at iter %.0f, pivot %d;\\n%s\\n\",\n                   (REAL) (lp->total_iter+lp->current_iter), lu->num_pivots, LUSOL_informstr(lu->LUSOL, i));\n  }\n}\n\n\n/* MUST MODIFY */\nvoid BFP_CALLMODEL bfp_btran_normal(lprec *lp, REAL *prow, int *nzidx)\n{\n  int    i;\n  INVrec *lu;\n\n  lu = lp->invB;\n\n  /* Do the LUSOL btran */\n  i = LUSOL_btran(lu->LUSOL, prow-bfp_rowoffset(lp), nzidx);\n  if(i != LUSOL_INFORM_LUSUCCESS) {\n    lu->status = BFP_STATUS_ERROR;\n    lp->report(lp, NORMAL, \"bfp_btran_normal: Failed at iter %.0f, pivot %d;\\n%s\\n\",\n                   (REAL) (lp->total_iter+lp->current_iter), lu->num_pivots, LUSOL_informstr(lu->LUSOL, i));\n  }\n\n  /* Check performance data */\n#if 0\n  if(lu->num_pivots == 1) {\n    if(lu->LUSOL->luparm[LUSOL_IP_ACCELERATION] > 0)\n      lp->report(lp, NORMAL, \"RowL0 R:%10.7f  C:%10.7f  NZ:%10.7f\\n\",\n                             (REAL) lu->LUSOL->luparm[LUSOL_IP_ROWCOUNT_L0] / lu->LUSOL->m,\n                             (REAL) lu->LUSOL->luparm[LUSOL_IP_COLCOUNT_L0] / lu->LUSOL->m,\n                             (REAL) lu->LUSOL->luparm[LUSOL_IP_NONZEROS_L0] / pow((REAL) lu->LUSOL->m, 2));\n    else\n      lp->report(lp, NORMAL, \"ColL0 C:%10.7f  NZ:%10.7f\\n\",\n                             (REAL) lu->LUSOL->luparm[LUSOL_IP_COLCOUNT_L0] / lu->LUSOL->m,\n                             (REAL) lu->LUSOL->luparm[LUSOL_IP_NONZEROS_L0] / pow((REAL) lu->LUSOL->m, 2));\n  }\n#endif\n\n}\n\n/* MUST MODIFY - Routine to find maximum rank of equality constraints */\nint BFP_CALLMODEL bfp_findredundant(lprec *lp, int items, getcolumnex_func cb, int *maprow, int *mapcol)\n{\n  int       i, j, nz = 0, m = 0, n = 0, *nzrows = NULL;\n  REAL      *nzvalues = NULL, *arraymax = NULL;\n  LUSOLrec  *LUSOL;\n\n  /* Are we capable of finding redundancy with this BFP? */\n  if((maprow == NULL) && (mapcol == NULL))\n    return( n );\n\n  /* If so, initialize memory structures */\n  if(!allocINT(lp, &nzrows, items, FALSE) ||\n     !allocREAL(lp, &nzvalues, items, FALSE))\n    return( n );\n\n  /* Compute the number of non-empty columns */\n  m = 0;\n  for(j = 1; j <= mapcol[0]; j++) {\n    n = cb(lp, mapcol[j], NULL, NULL, maprow);\n    if(n > 0) {\n      m++;\n      mapcol[m] = mapcol[j];\n      nz += n;\n    }\n  }\n  mapcol[0] = m;\n\n  /* Instantiate a LUSOL object */\n  LUSOL = LUSOL_create(NULL, 0, LUSOL_PIVMOD_TRP, 0);\n  if((LUSOL == NULL) || !LUSOL_sizeto(LUSOL, items, m, nz*LUSOL_MULT_nz_a))\n    goto Finish;\n\n  /* Modify relevant LUSOL parameters */\n  LUSOL->m = items;\n  LUSOL->n = m;\n#if 0\n  LUSOL->luparm[LUSOL_IP_KEEPLU]        = FALSE;\n  LUSOL->luparm[LUSOL_IP_PIVOTTYPE]     = LUSOL_PIVMOD_TRP;\n  LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij] = 2.0;\n#endif\n\n  /* Load the columns into LUSOL */\n  for(j = 1; j <= m; j++) {\n    n = cb(lp, mapcol[j], nzvalues, nzrows, maprow);\n    i = LUSOL_loadColumn(LUSOL, nzrows, j, nzvalues, n, -1);\n    if(n != i) {\n      lp->report(lp, IMPORTANT, \"bfp_findredundant: Error %d while loading column %d with %d nz\\n\",\n                                i, j, n);\n      n = 0;\n      goto Finish;\n    }\n  }\n\n  /* Scale rows to prevent numerical problems */\n  if((lp->scalemode != SCALE_NONE) && allocREAL(lp, &arraymax, items+1, TRUE)) {\n    for(i = 1; i <= nz; i++) {\n      SETMAX(arraymax[LUSOL->indc[i]], fabs(LUSOL->a[i]));\n    }\n    for(i = 1; i <= nz; i++)\n      LUSOL->a[i] /= arraymax[LUSOL->indc[i]];\n    FREE(arraymax);\n  }\n\n  /* Factorize for maximum rank */\n  n = 0;\n  i = LUSOL_factorize(LUSOL);\n  /*  lp->report(lp, NORMAL, \"bfp_findredundant: r=%d c=%d - %s\\n\", items, m, LUSOL_informstr(LUSOL, i));*/\n  if((i == LUSOL_INFORM_LUSUCCESS) || (i != LUSOL_INFORM_LUSINGULAR))\n    goto Finish;\n\n  /* We have a singular matrix, obtain the indeces of the singular rows */\n  for(i = LUSOL->luparm[LUSOL_IP_RANK_U] + 1; i <= items; i++) {\n    n++;\n    maprow[n] = LUSOL->ip[i];\n  }\n  maprow[0] = n;\n\n  /* Clean up */\nFinish:\n  LUSOL_free(LUSOL);\n  FREE(nzrows);\n  FREE(nzvalues);\n\n  return( n );\n}\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/bfp/bfp_LUSOL/lp_LUSOL.h",
    "content": "#ifndef HEADER_lp_LUSOL\n#define HEADER_lp_LUSOL\n\n/* Include libraries for this inverse system */\n#include \"lp_types.h\"\n#include \"lusol.h\"\n\n/* LUSOL defines */\n#ifdef WIN32\n# define LUSOL_UseBLAS\n#endif\n/*#define MAPSINGULARCOLUMN*/\n#define MATINDEXBASE LUSOL_ARRAYOFFSET /* Inversion engine index start for arrays */\n#define LU_START_SIZE           10000  /* Start size of LU; realloc'ed if needed */\n#define DEF_MAXPIVOT              250  /* Maximum number of pivots before refactorization */\n#define MAX_DELTAFILLIN           2.0  /* Do refactorizations based on sparsity considerations */\n#define TIGHTENAFTER               10  /* Tighten LU pivot criteria only after this number of singularities */\n\n/* typedef */ struct _INVrec\n{\n  int       status;                 /* Last operation status code */\n  int       dimcount;               /* The actual number of LU rows/columns */\n  int       dimalloc;               /* The allocated LU rows/columns size */\n  int       user_colcount;          /* The number of user LU columns */\n  LUSOLrec  *LUSOL;\n  int       col_enter;              /* The full index of the entering column */\n  int       col_leave;              /* The full index of the leaving column */\n  int       col_pos;                /* The B column to be changed at the next update using data in value[.]*/\n  REAL      *value;\n  REAL      *pcol;                  /* Reference to the elimination vector */\n  REAL      theta_enter;            /* Value of the entering column theta */\n\n  int       max_Bsize;              /* The largest B matrix of user variables */\n  int       max_colcount;           /* The maximum number of user columns in LU */\n  int       max_LUsize;             /* The largest NZ-count of LU-files generated */\n  int       num_refact;             /* Number of times the basis was refactored */\n  int       num_timed_refact;\n  int       num_dense_refact;\n  double    time_refactstart;       /* Time since start of last refactorization-pivots cyle */\n  double    time_refactnext;        /* Time estimated to next refactorization */\n  int       num_pivots;             /* Number of pivots since last refactorization */\n  int       num_singular;           /* The total number of singular updates */\n  char      *opts;\n  MYBOOL    is_dirty;               /* Specifies if a column is incompletely processed */\n  MYBOOL    force_refact;           /* Force refactorization at the next opportunity */\n  MYBOOL    timed_refact;           /* Set if timer-driven refactorization should be active */\n  MYBOOL    set_Bidentity;          /* Force B to be the identity matrix at the next refactorization */\n} /* INVrec */;\n\n\n#ifdef __cplusplus\n/* namespace LUSOL */\nextern \"C\" {\n#endif\n\n/* Put function headers here */\n#include \"lp_BFP.h\"\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* HEADER_lp_LUSOL */\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/bfp/lp_BFP.h",
    "content": "\n/* ---------------------------------------------------------------------------------- */\n/* lp_solve v5+ headers for basis inversion / factorization libraries                 */\n/* ---------------------------------------------------------------------------------- */\n#define BFP_STATUS_RANKLOSS     -1\n#define BFP_STATUS_SUCCESS       0\n#define BFP_STATUS_SINGULAR      1\n#define BFP_STATUS_UNSTABLE      2\n#define BFP_STATUS_NOPIVOT       3\n#define BFP_STATUS_DIMERROR      4\n#define BFP_STATUS_DUPLICATE     5\n#define BFP_STATUS_NOMEMORY      6\n#define BFP_STATUS_ERROR         7             /* Unspecified, command-related error */\n#define BFP_STATUS_FATAL         8\n\n#define BFP_STAT_ERROR          -1\n#define BFP_STAT_REFACT_TOTAL    0\n#define BFP_STAT_REFACT_TIMED    1\n#define BFP_STAT_REFACT_DENSE    2\n\n#ifndef BFP_CALLMODEL\n  #ifdef WIN32\n    #define BFP_CALLMODEL __stdcall   /* \"Standard\" call model */\n  #else\n    #define BFP_CALLMODEL\n  #endif\n#endif\n\n#ifdef RoleIsExternalInvEngine\n  #define __BFP_EXPORT_TYPE __EXPORT_TYPE\n#else\n  #define __BFP_EXPORT_TYPE\n#endif\n\n\n/* Routines with UNIQUE implementations for each inversion engine                     */\n/* ---------------------------------------------------------------------------------- */\nchar   __BFP_EXPORT_TYPE *(BFP_CALLMODEL bfp_name)(void);\nvoid   __BFP_EXPORT_TYPE (BFP_CALLMODEL bfp_free)(lprec *lp);\nMYBOOL __BFP_EXPORT_TYPE (BFP_CALLMODEL bfp_resize)(lprec *lp, int newsize);\nint    __BFP_EXPORT_TYPE (BFP_CALLMODEL bfp_nonzeros)(lprec *lp, MYBOOL maximum);\nint    __BFP_EXPORT_TYPE (BFP_CALLMODEL bfp_memallocated)(lprec *lp);\nint    __BFP_EXPORT_TYPE (BFP_CALLMODEL bfp_preparefactorization)(lprec *lp);\nint    __BFP_EXPORT_TYPE (BFP_CALLMODEL bfp_factorize)(lprec *lp, int uservars, int Bsize, MYBOOL *usedpos, MYBOOL final);\nMYBOOL __BFP_EXPORT_TYPE (BFP_CALLMODEL bfp_finishupdate)(lprec *lp, MYBOOL changesign);\nvoid   __BFP_EXPORT_TYPE (BFP_CALLMODEL bfp_ftran_normal)(lprec *lp, REAL *pcol, int *nzidx);\nvoid   __BFP_EXPORT_TYPE (BFP_CALLMODEL bfp_ftran_prepare)(lprec *lp, REAL *pcol, int *nzidx);\nvoid   __BFP_EXPORT_TYPE (BFP_CALLMODEL bfp_btran_normal)(lprec *lp, REAL *prow, int *nzidx);\nint    __BFP_EXPORT_TYPE (BFP_CALLMODEL bfp_status)(lprec *lp);\nint    __BFP_EXPORT_TYPE (BFP_CALLMODEL bfp_findredundant)(lprec *lp, int items, getcolumnex_func cb, int *maprow, int*mapcol);\n\n\n/* Routines SHARED for all inverse implementations; located in lp_BFP1.c              */\n/* ---------------------------------------------------------------------------------- */\nMYBOOL __BFP_EXPORT_TYPE (BFP_CALLMODEL bfp_compatible)(lprec *lp, int bfpversion, int lpversion, int sizeofvar);\nint    __BFP_EXPORT_TYPE (BFP_CALLMODEL bfp_indexbase)(lprec *lp);\nint    __BFP_EXPORT_TYPE (BFP_CALLMODEL bfp_rowoffset)(lprec *lp);\nint    __BFP_EXPORT_TYPE (BFP_CALLMODEL bfp_pivotmax)(lprec *lp);\nREAL   __BFP_EXPORT_TYPE (BFP_CALLMODEL bfp_efficiency)(lprec *lp);\nREAL   __BFP_EXPORT_TYPE *(BFP_CALLMODEL bfp_pivotvector)(lprec *lp);\nint    __BFP_EXPORT_TYPE (BFP_CALLMODEL bfp_pivotcount)(lprec *lp);\nMYBOOL __BFP_EXPORT_TYPE (BFP_CALLMODEL bfp_mustrefactorize)(lprec *lp);\nint    __BFP_EXPORT_TYPE (BFP_CALLMODEL bfp_refactcount)(lprec *lp, int kind);\nMYBOOL __BFP_EXPORT_TYPE (BFP_CALLMODEL bfp_isSetI)(lprec *lp);\nint    *bfp_createMDO(lprec *lp, MYBOOL *usedpos, int count, MYBOOL doMDO);\nvoid   __BFP_EXPORT_TYPE (BFP_CALLMODEL bfp_updaterefactstats)(lprec *lp);\nint    BFP_CALLMODEL bfp_rowextra(lprec *lp);\n\n/* Routines with OPTIONAL SHARED code; template routines suitable for canned          */\n/* inverse engines are located in lp_BFP2.c                                           */\n/* ---------------------------------------------------------------------------------- */\nMYBOOL __BFP_EXPORT_TYPE (BFP_CALLMODEL bfp_init)(lprec *lp, int size, int deltasize, char *options);\nMYBOOL __BFP_EXPORT_TYPE (BFP_CALLMODEL bfp_restart)(lprec *lp);\nMYBOOL __BFP_EXPORT_TYPE (BFP_CALLMODEL bfp_implicitslack)(lprec *lp);\nMYBOOL __BFP_EXPORT_TYPE (BFP_CALLMODEL bfp_pivotalloc)(lprec *lp, int newsize);\nint    __BFP_EXPORT_TYPE (BFP_CALLMODEL bfp_colcount)(lprec *lp);\nMYBOOL __BFP_EXPORT_TYPE (BFP_CALLMODEL bfp_canresetbasis)(lprec *lp);\nvoid   __BFP_EXPORT_TYPE (BFP_CALLMODEL bfp_finishfactorization)(lprec *lp);\nLREAL  __BFP_EXPORT_TYPE (BFP_CALLMODEL bfp_prepareupdate)(lprec *lp, int row_nr, int col_nr, REAL *pcol);\nREAL   __BFP_EXPORT_TYPE (BFP_CALLMODEL bfp_pivotRHS)(lprec *lp, LREAL theta, REAL *pcol);\nvoid   __BFP_EXPORT_TYPE (BFP_CALLMODEL bfp_btran_double)(lprec *lp, REAL *prow, int *pnzidx, REAL *drow, int *dnzidx);\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/bfp/lp_BFP1.c",
    "content": "\n/* Routines located in lp_BFP1.cpp; common for all factorization engines              */\n/* Cfr. lp_BFP.h for definitions                                                      */\n/* ---------------------------------------------------------------------------------- */\n/* Changes:                                                                           */\n/* 29 May 2004       Corrected calculation of bfp_efficiency(), which required        */\n/*                   modifying the max_Bsize to include slack variables. KE.          */\n/* 16 June 2004      Make the symbolic minimum degree ordering routine available      */\n/*                   to BFPs as a routine internal to the library. KE                 */\n/* 1  July 2004      Change due to change in MDO naming.                              */\n/* ---------------------------------------------------------------------------------- */\n\n\n/* MUST MODIFY */\nMYBOOL BFP_CALLMODEL bfp_compatible(lprec *lp, int bfpversion, int lpversion, int sizeofvar)\n{\n  MYBOOL status = FALSE;\n\n  if((lp != NULL) && (bfpversion == BFPVERSION) && (sizeof(REAL) == sizeofvar)) {\n#if 0\n    if(lpversion == MAJORVERSION)  /* Forces BFP renewal at lp_solve major version changes */\n#endif\n      status = TRUE;\n  }\n  return( status );\n}\n\n/* DON'T MODIFY */\nint BFP_CALLMODEL bfp_status(lprec *lp)\n{\n  return(lp->invB->status);\n}\n\n/* DON'T MODIFY */\nint BFP_CALLMODEL bfp_indexbase(lprec *lp)\n{\n  return( MATINDEXBASE );\n}\n\n/* DON'T MODIFY */\nint BFP_CALLMODEL bfp_rowoffset(lprec *lp)\n{\n  if(lp->obj_in_basis)\n    return( 1 );\n  else\n    return( 0 );\n}\n\n/* DON'T MODIFY */\nint BFP_CALLMODEL bfp_pivotmax(lprec *lp)\n{\n  if(lp->max_pivots > 0)\n    return( lp->max_pivots );\n  else\n    return( DEF_MAXPIVOT );\n}\n\n/* DON'T MODIFY */\nREAL * BFP_CALLMODEL bfp_pivotvector(lprec *lp)\n{\n  return( lp->invB->pcol );\n}\n\n/* DON'T MODIFY */\nREAL BFP_CALLMODEL bfp_efficiency(lprec *lp)\n{\n  REAL hold;\n\n  hold = lp->bfp_nonzeros(lp, AUTOMATIC);\n  if(hold == 0)\n    hold = 1 + lp->rows;\n  hold = lp->bfp_nonzeros(lp, TRUE)/hold;\n\n  return(hold);\n}\n\n/* DON'T MODIFY */\nint BFP_CALLMODEL bfp_pivotcount(lprec *lp)\n{\n  return(lp->invB->num_pivots);\n}\n\n\n/* DON'T MODIFY */\nint BFP_CALLMODEL bfp_refactcount(lprec *lp, int kind)\n{\n  if(kind == BFP_STAT_REFACT_TOTAL)\n    return(lp->invB->num_refact);\n  else if(kind == BFP_STAT_REFACT_TIMED)\n    return(lp->invB->num_timed_refact);\n  else if(kind == BFP_STAT_REFACT_DENSE)\n    return(lp->invB->num_dense_refact);\n  else\n    return( BFP_STAT_ERROR );\n}\n\n/* DON'T MODIFY */\nMYBOOL BFP_CALLMODEL bfp_mustrefactorize(lprec *lp)\n{\n  MYBOOL test = lp->is_action(lp->spx_action, ACTION_REINVERT | ACTION_TIMEDREINVERT);\n  if(!test) {\n    REAL   f;\n    INVrec *lu = lp->invB;\n\n    if(lu->num_pivots > 0)\n      f = (timeNow()-lu->time_refactstart) / (REAL) lu->num_pivots;\n    else\n      f = 0;\n\n    /* Always refactorize if we are above the set pivot limit */\n    if(lu->force_refact ||\n       (lu->num_pivots >= lp->bfp_pivotmax(lp)))\n      lp->set_action(&lp->spx_action, ACTION_REINVERT);\n\n    /* Check if we should do an optimal time-based refactorization */\n    else if(lu->timed_refact && (lu->num_pivots > 1) &&\n            (f > MIN_TIMEPIVOT) && (f > lu->time_refactnext)) {\n      /* If we have excessive time usage in automatic mode then\n         treat as untimed case and update optimal time metric, ... */\n      if((lu->timed_refact == AUTOMATIC) &&\n         (lu->num_pivots < 0.4*lp->bfp_pivotmax(lp)))\n        lu->time_refactnext = f;\n      /* ... otherwise set flag for the optimal time-based refactorization */\n      else\n        lp->set_action(&lp->spx_action, ACTION_TIMEDREINVERT);\n    }\n\n    /* Otherwise simply update the optimal time metric */\n    else\n      lu->time_refactnext = f;\n#if 0\n    if(lu->num_pivots % 10 == 0)\n      lp->report(lp, NORMAL, \"bfp pivot %d - start %f - timestat %f\",\n                             lu->num_pivots, lu->time_refactstart, f);\n#endif\n  }\n\n  test = lp->is_action(lp->spx_action, ACTION_REINVERT | ACTION_TIMEDREINVERT);\n  return(test);\n}\n\n/* DON'T MODIFY */\nMYBOOL BFP_CALLMODEL bfp_isSetI(lprec *lp)\n{\n  return( (MYBOOL) lp->invB->set_Bidentity );\n}\n\n/* DON'T MODIFY */\nint *bfp_createMDO(lprec *lp, MYBOOL *usedpos, int count, MYBOOL doMDO)\n{\n  int *mdo, i, j, kk;\n\n  mdo = (int *) malloc((count + 1)*sizeof(*mdo));\n/*  allocINT(lp, &mdo, count + 1, FALSE); */\n\n /* Fill the mdo[] array with remaining full-pivot basic user variables */\n  kk = 0;\n  for(j = 1; j <= lp->columns; j++) {\n    i = lp->rows + j;\n    if(usedpos[i] == TRUE) {\n      kk++;\n      mdo[kk] = i;\n    }\n  }\n  mdo[0] = kk;\n  if(kk == 0)\n    goto Process;\n\n /* Calculate the approximate minimum degree column ordering */\n  if(doMDO) {\n    i = lp->getMDO(lp, usedpos, mdo, NULL, FALSE);\n    if(i != 0) {\n      lp->report(lp, CRITICAL, \"bfp_createMDO: Internal error %d in minimum degree ordering routine\", i);\n      FREE(mdo);\n    }\n  }\nProcess:\n  return( mdo );\n}\nvoid BFP_CALLMODEL bfp_updaterefactstats(lprec *lp)\n{\n  INVrec *lu = lp->invB;\n\n  /* Signal that we are refactorizing */\n  lu->is_dirty = AUTOMATIC;\n\n  /* Set time of start of current refactorization cycle */\n  lu->time_refactstart = timeNow();\n  lu->time_refactnext  = 0;\n  lu->user_colcount = 0;\n\n  /* Do the numbers */\n  if(lu->force_refact)\n    lu->num_dense_refact++;\n  else if(lu->timed_refact && lp->is_action(lp->spx_action, ACTION_TIMEDREINVERT))\n    lu->num_timed_refact++;\n  lu->num_refact++;\n}\n\nint BFP_CALLMODEL bfp_rowextra(lprec *lp)\n{\n  if(lp->is_obj_in_basis(lp))\n    return( 1 );\n  else\n    return( 0 );\n}\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/bfp/lp_BFP2.c",
    "content": "\n\n/* Routines located in lp_BFP2.cpp; optional shared for canned implementations        */\n/* Cfr. lp_BFP.h for definitions                                                      */\n/* ---------------------------------------------------------------------------------- */\n\n\n/* DON'T MODIFY */\nMYBOOL BFP_CALLMODEL bfp_init(lprec *lp, int size, int delta, char *options)\n{\n  INVrec *lu;\n\n  lp->invB = (INVrec *) calloc(1, sizeof(*(lp->invB)));\n  lu = lp->invB;\n  if((lu == NULL) || \n     !lp->bfp_resize(lp, size) ||\n     !lp->bfp_restart(lp))\n    return( FALSE );\n\n  /* Store any passed options */\n  if(options != NULL) {\n    size_t len = strlen(options);\n    lu->opts = (char *) malloc(len + 1);\n    strcpy(lu->opts, options);\n  }\n\n  /* Prepare for factorization and undo values reset by bfp_preparefactorization */\n  lp->bfp_preparefactorization(lp);\n  lu->num_refact = 0;\n\n  return( TRUE );\n}\n\n/* DON'T MODIFY */\nMYBOOL BFP_CALLMODEL bfp_restart(lprec *lp)\n{\n  INVrec *lu;\n\n  lu = lp->invB;\n  if(lu == NULL)\n    return( FALSE );\n\n  lu->status = BFP_STATUS_SUCCESS;\n  lu->max_Bsize = 0;          /* The largest NZ-count of the B matrix            */\n  lu->max_colcount = 0;       /* The maximum number of user columns in B         */\n  lu->max_LUsize = 0;         /* The largest NZ-count of LU-files generated      */\n  lu->num_refact = 0;         /* The number of times the basis has been factored */\n  lu->num_timed_refact = 0;\n  lu->num_dense_refact = 0;\n  lu->num_pivots = 0;         /* The number of pivots since last factorization   */\n  lu->pcol = NULL;\n  lu->set_Bidentity = FALSE;\n\n  return( TRUE );\n}\n\n/* DON'T MODIFY */\nMYBOOL BFP_CALLMODEL bfp_implicitslack(lprec *lp)\n{\n  return( FALSE );\n}\n\n/* DON'T MODIFY */\nint BFP_CALLMODEL bfp_colcount(lprec *lp)\n{\n  return(lp->invB->user_colcount);\n}\n\n\n/* DON'T MODIFY */\nMYBOOL BFP_CALLMODEL bfp_canresetbasis(lprec *lp)\n{\n  return( FALSE );\n}\n\n\n/* DON'T MODIFY */\nMYBOOL BFP_CALLMODEL bfp_pivotalloc(lprec *lp, int newsize)\n{\n  /* Does nothing in the default implementation */\n  return( TRUE );\n}\n\n\n/* DON'T MODIFY */\nvoid BFP_CALLMODEL bfp_finishfactorization(lprec *lp)\n{\n  INVrec *lu;\n\n  lu = lp->invB;\n\n  SETMAX(lu->max_colcount, lp->bfp_colcount(lp));\n  SETMAX(lu->max_LUsize, lp->bfp_nonzeros(lp, FALSE));\n\n  /* Signal that we done factorizing/reinverting */\n  lu->is_dirty = FALSE;\n  lp->clear_action(&lp->spx_action, ACTION_REINVERT | ACTION_TIMEDREINVERT);\n  lu->force_refact = FALSE;\n\n  /* Store information about the current inverse */\n  lu->num_pivots = 0;\n\n}\n\n\n/* DON'T MODIFY */\nLREAL BFP_CALLMODEL bfp_prepareupdate(lprec *lp, int row_nr, int col_nr, REAL *pcol)\n/* Was condensecol() in versions of lp_solve before 4.0.1.8 - KE */\n{\n  LREAL  pivValue;\n  INVrec *lu;\n\n  lu = lp->invB;\n\n  /* Store the incoming pivot value for RHS update purposes */\n  lu->col_enter = col_nr;  /* The index of the new data column */\n  lu->col_pos   = row_nr;  /* The basis column to be replaced */\n  lu->col_leave = lp->var_basic[row_nr];\n  if(pcol == NULL)\n    pivValue = 0;\n  else\n    pivValue = pcol[row_nr];\n  lu->theta_enter = pivValue;\n\n  /* Save reference to the elimination vector */\n  lu->pcol = pcol;\n\n  /* Set completion status; but hold if we are reinverting */\n  if(lu->is_dirty != AUTOMATIC)\n    lu->is_dirty = TRUE;\n\n  return( pivValue );\n}\n\n\n/* DON'T MODIFY */\nREAL BFP_CALLMODEL bfp_pivotRHS(lprec *lp, LREAL theta, REAL *pcol)\n/* This function is used to adjust the RHS in bound swap operations as\n   well as handling the updating of the RHS for normal basis changes.\n   Was rhsmincol(), ie. \"rhs minus column\" in versions of lp_solve before 4.0.1.8 - KE */\n{\n  INVrec    *lu;\n\n  lu = lp->invB;\n\n  if(pcol == NULL)\n    pcol = lu->pcol;\n\n  if(theta != 0) {\n    register int    i, n = lp->rows;\n    register LREAL  roundzero = lp->epsvalue;\n    register LREAL  *rhs = lp->rhs, rhsmax = 0;\n\n    for(i = 0; i <= n; i++, rhs++, pcol++) {\n      (*rhs) -= theta * (*pcol);\n      my_roundzero(*rhs, roundzero);\n      SETMAX(rhsmax, fabs(*rhs));\n    }\n    lp->rhsmax = rhsmax;\n  }\n\n  if(pcol == lu->pcol)\n    return( lu->theta_enter );\n  else\n    return( 0.0 );\n}\n\n\n/* DON'T MODIFY */\nvoid BFP_CALLMODEL bfp_btran_double(lprec *lp, REAL *prow, int *pnzidx, REAL *drow, int *dnzidx)\n{\n  if(prow != NULL)\n    lp->bfp_btran_normal(lp, prow, pnzidx);\n  if(drow != NULL)\n    lp->bfp_btran_normal(lp, drow, dnzidx);\n}\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/c",
    "content": "distribution_5.5.0.15.htm\r\nlp_solve_5.5.0.15.chm\r\nlp_solve_5.5.0.15_access.zip\r\nlp_solve_5.5.0.15_AMPL_exe_osx32.tar.gz\r\nlp_solve_5.5.0.15_AMPL_exe_ux32.tar.gz\r\nlp_solve_5.5.0.15_AMPL_exe_win32.zip\r\nlp_solve_5.5.0.15_AMPL_source.tar.gz\r\nlp_solve_5.5.0.15_bfp_etaPFI_source.tar.gz\r\nlp_solve_5.5.0.15_bfp_GLPK_source.tar.gz\r\nlp_solve_5.5.0.15_bfp_LUSOL_source.tar.gz\r\nlp_solve_5.5.0.15_c.tar.gz\r\nlp_solve_5.5.0.15_COM.zip\r\nlp_solve_5.5.0.15_cs.net.zip\r\nlp_solve_5.5.0.15_Delphi.zip\r\nlp_solve_5.5.0.15_dev_osx32.tar.gz\r\nlp_solve_5.5.0.15_dev_ux32.tar.gz\r\nlp_solve_5.5.0.15_dev_ux64.tar.gz\r\nlp_solve_5.5.0.15_dev_win32.zip\r\nlp_solve_5.5.0.15_dev_win64.zip\r\nlp_solve_5.5.0.15_doc.tar.gz\r\nlp_solve_5.5.0.15_Euler_exe_win32.zip\r\nlp_solve_5.5.0.15_Euler_source.tar.gz\r\nlp_solve_5.5.0.15_excel.zip\r\nlp_solve_5.5.0.15_exe_osx32.tar.gz\r\nlp_solve_5.5.0.15_exe_ux32.tar.gz\r\nlp_solve_5.5.0.15_exe_ux64.tar.gz\r\nlp_solve_5.5.0.15_exe_win32.zip\r\nlp_solve_5.5.0.15_exe_win64.zip\r\nlp_solve_5.5.0.15_FreeMat_exe_osx32.tar.gz\r\nlp_solve_5.5.0.15_FreeMat_exe_ux32.tar.gz\r\nlp_solve_5.5.0.15_FreeMat_exe_ux64.tar.gz\r\nlp_solve_5.5.0.15_FreeMat_exe_win32.zip\r\nlp_solve_5.5.0.15_FreeMat_source.tar.gz\r\nlp_solve_5.5.0.15_IDE_Setup.exe\r\nlp_solve_5.5.0.15_IDE_source.zip\r\nlp_solve_5.5.0.15_java.zip\r\nlp_solve_5.5.0.15_MATLAB_exe_osx32.tar.gz\r\nlp_solve_5.5.0.15_MATLAB_exe_ux32.tar.gz\r\nlp_solve_5.5.0.15_MATLAB_exe_ux64.tar.gz\r\nlp_solve_5.5.0.15_MATLAB_exe_win32.zip\r\nlp_solve_5.5.0.15_MATLAB_exe_win64.zip\r\nlp_solve_5.5.0.15_MATLAB_source.tar.gz\r\nlp_solve_5.5.0.15_octave_exe_osx32.tar.gz\r\nlp_solve_5.5.0.15_octave_exe_ux32.tar.gz\r\nlp_solve_5.5.0.15_octave_exe_ux64.tar.gz\r\nlp_solve_5.5.0.15_octave_exe_win32.zip\r\nlp_solve_5.5.0.15_octave_source.tar.gz\r\nlp_solve_5.5.0.15_OMATRIX_exe_win32.zip\r\nlp_solve_5.5.0.15_OMATRIX_source.tar.gz\r\nlp_solve_5.5.0.15_PHP_exe_ux32.tar.gz\r\nlp_solve_5.5.0.15_PHP_exe_ux64.tar.gz\r\nlp_solve_5.5.0.15_PHP_exe_win32.zip\r\nlp_solve_5.5.0.15_PHP_source.tar.gz\r\nlp_solve_5.5.0.15_Python_source.tar.gz\r\nlp_solve_5.5.0.15_Python2.4_exe_win32.zip\r\nlp_solve_5.5.0.15_Python2.5_exe_win32.zip\r\nlp_solve_5.5.0.15_Python2.6_exe_ux32.tar.gz\r\nlp_solve_5.5.0.15_Python2.6_exe_ux64.tar.gz\r\nlp_solve_5.5.0.15_Python2.6_exe_win32.zip\r\nlp_solve_5.5.0.15_Python2.6_exe_win64.zip\r\nlp_solve_5.5.0.15_scilab_exe_osx32.tar.gz\r\nlp_solve_5.5.0.15_scilab_exe_ux32.tar.gz\r\nlp_solve_5.5.0.15_scilab_exe_ux64.tar.gz\r\nlp_solve_5.5.0.15_scilab_exe_win32.zip\r\nlp_solve_5.5.0.15_scilab_exe_win64.zip\r\nlp_solve_5.5.0.15_scilab_source.tar.gz\r\nlp_solve_5.5.0.15_source.tar.gz\r\nlp_solve_5.5.0.15_Sysquake_exe_osx32.tar.gz\r\nlp_solve_5.5.0.15_Sysquake_exe_ux32.tar.gz\r\nlp_solve_5.5.0.15_Sysquake_exe_win32.zip\r\nlp_solve_5.5.0.15_Sysquake_source.tar.gz\r\nlp_solve_5.5.0.15_vb.net.zip\r\nlp_solve_5.5.0.15_vb.zip\r\nlp_solve_5.5.0.15_xli_CPLEX_source.tar.gz\r\nlp_solve_5.5.0.15_xli_DIMACS_source.tar.gz\r\nlp_solve_5.5.0.15_xli_LINDO_source.tar.gz\r\nlp_solve_5.5.0.15_xli_LPFML_source.tar.gz\r\nlp_solve_5.5.0.15_xli_MathProg_source.tar.gz\r\nlp_solve_5.5.0.15_xli_XPRESS_source.tar.gz\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/colamd/colamd.c",
    "content": "/* ========================================================================== */\n/* === colamd/symamd - a sparse matrix column ordering algorithm ============ */\n/* ========================================================================== */\n\n/*\n    colamd:  an approximate minimum degree column ordering algorithm,\n    \tfor LU factorization of symmetric or unsymmetric matrices,\n\tQR factorization, least squares, interior point methods for\n\tlinear programming problems, and other related problems.\n\n    symamd:  an approximate minimum degree ordering algorithm for Cholesky\n    \tfactorization of symmetric matrices.\n\n    Purpose:\n\n\tColamd computes a permutation Q such that the Cholesky factorization of\n\t(AQ)'(AQ) has less fill-in and requires fewer floating point operations\n\tthan A'A.  This also provides a good ordering for sparse partial\n\tpivoting methods, P(AQ) = LU, where Q is computed prior to numerical\n\tfactorization, and P is computed during numerical factorization via\n\tconventional partial pivoting with row interchanges.  Colamd is the\n\tcolumn ordering method used in SuperLU, part of the ScaLAPACK library.\n\tIt is also available as built-in function in Matlab Version 6,\n\tavailable from MathWorks, Inc. (http://www.mathworks.com).  This\n\troutine can be used in place of colmmd in Matlab.  By default, the \\\n\tand / operators in Matlab perform a column ordering (using colmmd\n\tor colamd) prior to LU factorization using sparse partial pivoting,\n\tin the built-in Matlab lu(A) routine.\n\n    \tSymamd computes a permutation P of a symmetric matrix A such that the\n\tCholesky factorization of PAP' has less fill-in and requires fewer\n\tfloating point operations than A.  Symamd constructs a matrix M such\n\tthat M'M has the same nonzero pattern of A, and then orders the columns\n\tof M using colmmd.  The column ordering of M is then returned as the\n\trow and column ordering P of A. \n\n    Authors:\n\n\tThe authors of the code itself are Stefan I. Larimore and Timothy A.\n\tDavis (davis@cise.ufl.edu), University of Florida.  The algorithm was\n\tdeveloped in collaboration with John Gilbert, Xerox PARC, and Esmond\n\tNg, Oak Ridge National Laboratory.\n\n    Date:\n\n\tMay 4, 2001.  Version 2.1.\n\n    Acknowledgements:\n\n\tThis work was supported by the National Science Foundation, under\n\tgrants DMS-9504974 and DMS-9803599.\n\n    Notice:\n\n\tCopyright (c) 1998-2001 by the University of Florida.\n\tAll Rights Reserved.\n\n\tTHIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY\n\tEXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.\n\n\tPermission is hereby granted to use or copy this program for any\n\tpurpose, provided the above notices are retained on all copies.\n\tUser documentation of any code that uses this code must cite the\n\tAuthors, the Copyright, and \"Used by permission.\"  If this code is\n\taccessible from within Matlab, then typing \"help colamd\" and \"help\n\tsymamd\" must cite the Authors.  Permission to modify the code and to\n\tdistribute modified code is granted, provided the above notices are\n\tretained, and a notice that the code was modified is included with the\n\tabove copyright notice.  You must also retain the Availability\n\tinformation below, of the original version.\n\n\tThis software is provided free of charge.\n\n    Availability:\n\n\tThe colamd/symamd library is available at\n\n\t    http://www.cise.ufl.edu/research/sparse/colamd/\n\n\tThis is the http://www.cise.ufl.edu/research/sparse/colamd/colamd.c\n\tfile.  It requires the colamd.h file.  It is required by the colamdmex.c\n\tand symamdmex.c files, for the Matlab interface to colamd and symamd.\n\n    Changes to the colamd library since Version 1.0 and 1.1:\n\n\tNo bugs were found in version 1.1.  These changes merely add new\n\tfunctionality.\n\n    \t* added the COLAMD_RECOMMENDED (nnz, n_row, n_col) macro.\n\n\t* moved the output statistics, from A, to a separate output argument.\n\t\tThe arguments changed for the C-callable routines.\n\n\t* added colamd_report and symamd_report.\n\n\t* added a C-callable symamd routine.  Formerly, symamd was only\n\t\tavailable as a mexFunction from Matlab.\n\n\t* added error-checking to symamd.  Formerly, it assumed its input\n\t\twas error-free.\n\n\t* added the optional stats and knobs arguments to the symamd mexFunction\n\n\t* deleted colamd_help.  A help message is still available from\n\t\t\"help colamd\" and \"help symamd\" in Matlab.\n\n\t* deleted colamdtree.m and symamdtree.m.  Now, colamd.m and symamd.m\n\t\talso do the elimination tree post-ordering.  The Version 1.1\n\t\tcolamd and symamd mexFunctions, which do not do the post-\n\t\tordering, are now visible as colamdmex and symamdmex from\n\t\tMatlab.  Essentialy, the post-ordering is now the default\n\t\tbehavior of colamd.m and symamd.m, to match the behavior of\n\t\tcolmmd and symmmd.  The post-ordering is only available in the\n\t\tMatlab interface, not the C-callable interface.\n\n\t* made a slight change to the dense row/column detection in symamd,\n\t\tto match the stated specifications.\n\n    Changes from Version 2.0 to 2.1:\n\n\t* TRUE and FALSE are predefined on some systems, so they are defined\n\t\there only if not already defined.\n\t\n\t* web site changed\n\n\t* UNIX Makefile modified, to handle the case if \".\" is not in your path.\n\n*/\n\n/* ========================================================================== */\n/* === Description of user-callable routines ================================ */\n/* ========================================================================== */\n\n/*\n    ----------------------------------------------------------------------------\n    colamd_recommended:\n    ----------------------------------------------------------------------------\n\n\tC syntax:\n\n\t    #include \"colamd.h\"\n\t    int colamd_recommended (int nnz, int n_row, int n_col) ;\n\n\t    or as a C macro\n\n\t    #include \"colamd.h\"\n\t    Alen = COLAMD_RECOMMENDED (int nnz, int n_row, int n_col) ;\n\n\tPurpose:\n\n\t    Returns recommended value of Alen for use by colamd.  Returns -1\n\t    if any input argument is negative.  The use of this routine\n\t    or macro is optional.  Note that the macro uses its arguments\n\t    more than once, so be careful for side effects, if you pass\n\t    expressions as arguments to COLAMD_RECOMMENDED.  Not needed for\n\t    symamd, which dynamically allocates its own memory.\n\n\tArguments (all input arguments):\n\n\t    int nnz ;\t\tNumber of nonzeros in the matrix A.  This must\n\t\t\t\tbe the same value as p [n_col] in the call to\n\t\t\t\tcolamd - otherwise you will get a wrong value\n\t\t\t\tof the recommended memory to use.\n\n\t    int n_row ;\t\tNumber of rows in the matrix A.\n\n\t    int n_col ;\t\tNumber of columns in the matrix A.\n\n    ----------------------------------------------------------------------------\n    colamd_set_defaults:\n    ----------------------------------------------------------------------------\n\n\tC syntax:\n\n\t    #include \"colamd.h\"\n\t    colamd_set_defaults (int knobs [COLAMD_KNOBS]) ;\n\n\tPurpose:\n\n\t    Sets the default parameters.  The use of this routine is optional.\n\n\tArguments:\n\n\t    double knobs [COLAMD_KNOBS] ;\tOutput only.\n\n\t\tColamd: rows with more than (knobs [COLAMD_DENSE_ROW] * n_col)\n\t\tentries are removed prior to ordering.  Columns with more than\n\t\t(knobs [COLAMD_DENSE_COL] * n_row) entries are removed prior to\n\t\tordering, and placed last in the output column ordering. \n\n\t\tSymamd: uses only knobs [COLAMD_DENSE_ROW], which is knobs [0].\n\t\tRows and columns with more than (knobs [COLAMD_DENSE_ROW] * n)\n\t\tentries are removed prior to ordering, and placed last in the\n\t\toutput ordering.\n\n\t\tCOLAMD_DENSE_ROW and COLAMD_DENSE_COL are defined as 0 and 1,\n\t\trespectively, in colamd.h.  Default values of these two knobs\n\t\tare both 0.5.  Currently, only knobs [0] and knobs [1] are\n\t\tused, but future versions may use more knobs.  If so, they will\n\t\tbe properly set to their defaults by the future version of\n\t\tcolamd_set_defaults, so that the code that calls colamd will\n\t\tnot need to change, assuming that you either use\n\t\tcolamd_set_defaults, or pass a (double *) NULL pointer as the\n\t\tknobs array to colamd or symamd.\n\n    ----------------------------------------------------------------------------\n    colamd:\n    ----------------------------------------------------------------------------\n\n\tC syntax:\n\n\t    #include \"colamd.h\"\n\t    int colamd (int n_row, int n_col, int Alen, int *A, int *p,\n\t    \tdouble knobs [COLAMD_KNOBS], int stats [COLAMD_STATS]) ;\n\n\tPurpose:\n\n\t    Computes a column ordering (Q) of A such that P(AQ)=LU or\n\t    (AQ)'AQ=LL' have less fill-in and require fewer floating point\n\t    operations than factorizing the unpermuted matrix A or A'A,\n\t    respectively.\n\t    \n\tReturns:\n\n\t    TRUE (1) if successful, FALSE (0) otherwise.\n\n\tArguments:\n\n\t    int n_row ;\t\tInput argument.\n\n\t\tNumber of rows in the matrix A.\n\t\tRestriction:  n_row >= 0.\n\t\tColamd returns FALSE if n_row is negative.\n\n\t    int n_col ;\t\tInput argument.\n\n\t\tNumber of columns in the matrix A.\n\t\tRestriction:  n_col >= 0.\n\t\tColamd returns FALSE if n_col is negative.\n\n\t    int Alen ;\t\tInput argument.\n\n\t\tRestriction (see note):\n\t\tAlen >= 2*nnz + 6*(n_col+1) + 4*(n_row+1) + n_col\n\t\tColamd returns FALSE if these conditions are not met.\n\n\t\tNote:  this restriction makes an modest assumption regarding\n\t\tthe size of the two typedef's structures in colamd.h.\n\t\tWe do, however, guarantee that\n\n\t\t\tAlen >= colamd_recommended (nnz, n_row, n_col)\n\t\t\n\t\tor equivalently as a C preprocessor macro: \n\n\t\t\tAlen >= COLAMD_RECOMMENDED (nnz, n_row, n_col)\n\n\t\twill be sufficient.\n\n\t    int A [Alen] ;\tInput argument, undefined on output.\n\n\t\tA is an integer array of size Alen.  Alen must be at least as\n\t\tlarge as the bare minimum value given above, but this is very\n\t\tlow, and can result in excessive run time.  For best\n\t\tperformance, we recommend that Alen be greater than or equal to\n\t\tcolamd_recommended (nnz, n_row, n_col), which adds\n\t\tnnz/5 to the bare minimum value given above.\n\n\t\tOn input, the row indices of the entries in column c of the\n\t\tmatrix are held in A [(p [c]) ... (p [c+1]-1)].  The row indices\n\t\tin a given column c need not be in ascending order, and\n\t\tduplicate row indices may be be present.  However, colamd will\n\t\twork a little faster if both of these conditions are met\n\t\t(Colamd puts the matrix into this format, if it finds that the\n\t\tthe conditions are not met).\n\n\t\tThe matrix is 0-based.  That is, rows are in the range 0 to\n\t\tn_row-1, and columns are in the range 0 to n_col-1.  Colamd\n\t\treturns FALSE if any row index is out of range.\n\n\t\tThe contents of A are modified during ordering, and are\n\t\tundefined on output.\n\n\t    int p [n_col+1] ;\tBoth input and output argument.\n\n\t\tp is an integer array of size n_col+1.  On input, it holds the\n\t\t\"pointers\" for the column form of the matrix A.  Column c of\n\t\tthe matrix A is held in A [(p [c]) ... (p [c+1]-1)].  The first\n\t\tentry, p [0], must be zero, and p [c] <= p [c+1] must hold\n\t\tfor all c in the range 0 to n_col-1.  The value p [n_col] is\n\t\tthus the total number of entries in the pattern of the matrix A.\n\t\tColamd returns FALSE if these conditions are not met.\n\n\t\tOn output, if colamd returns TRUE, the array p holds the column\n\t\tpermutation (Q, for P(AQ)=LU or (AQ)'(AQ)=LL'), where p [0] is\n\t\tthe first column index in the new ordering, and p [n_col-1] is\n\t\tthe last.  That is, p [k] = j means that column j of A is the\n\t\tkth pivot column, in AQ, where k is in the range 0 to n_col-1\n\t\t(p [0] = j means that column j of A is the first column in AQ).\n\n\t\tIf colamd returns FALSE, then no permutation is returned, and\n\t\tp is undefined on output.\n\n\t    double knobs [COLAMD_KNOBS] ;\tInput argument.\n\n\t\tSee colamd_set_defaults for a description.\n\n\t    int stats [COLAMD_STATS] ;\t\tOutput argument.\n\n\t\tStatistics on the ordering, and error status.\n\t\tSee colamd.h for related definitions.\n\t\tColamd returns FALSE if stats is not present.\n\n\t\tstats [0]:  number of dense or empty rows ignored.\n\n\t\tstats [1]:  number of dense or empty columns ignored (and\n\t\t\t\tordered last in the output permutation p)\n\t\t\t\tNote that a row can become \"empty\" if it\n\t\t\t\tcontains only \"dense\" and/or \"empty\" columns,\n\t\t\t\tand similarly a column can become \"empty\" if it\n\t\t\t\tonly contains \"dense\" and/or \"empty\" rows.\n\n\t\tstats [2]:  number of garbage collections performed.\n\t\t\t\tThis can be excessively high if Alen is close\n\t\t\t\tto the minimum required value.\n\n\t\tstats [3]:  status code.  < 0 is an error code.\n\t\t\t    > 1 is a warning or notice.\n\n\t\t\t0\tOK.  Each column of the input matrix contained\n\t\t\t\trow indices in increasing order, with no\n\t\t\t\tduplicates.\n\n\t\t\t1\tOK, but columns of input matrix were jumbled\n\t\t\t\t(unsorted columns or duplicate entries).  Colamd\n\t\t\t\thad to do some extra work to sort the matrix\n\t\t\t\tfirst and remove duplicate entries, but it\n\t\t\t\tstill was able to return a valid permutation\n\t\t\t\t(return value of colamd was TRUE).\n\n\t\t\t\t\tstats [4]: highest numbered column that\n\t\t\t\t\t\tis unsorted or has duplicate\n\t\t\t\t\t\tentries.\n\t\t\t\t\tstats [5]: last seen duplicate or\n\t\t\t\t\t\tunsorted row index.\n\t\t\t\t\tstats [6]: number of duplicate or\n\t\t\t\t\t\tunsorted row indices.\n\n\t\t\t-1\tA is a null pointer\n\n\t\t\t-2\tp is a null pointer\n\n\t\t\t-3 \tn_row is negative\n\n\t\t\t\t\tstats [4]: n_row\n\n\t\t\t-4\tn_col is negative\n\n\t\t\t\t\tstats [4]: n_col\n\n\t\t\t-5\tnumber of nonzeros in matrix is negative\n\n\t\t\t\t\tstats [4]: number of nonzeros, p [n_col]\n\n\t\t\t-6\tp [0] is nonzero\n\n\t\t\t\t\tstats [4]: p [0]\n\n\t\t\t-7\tA is too small\n\n\t\t\t\t\tstats [4]: required size\n\t\t\t\t\tstats [5]: actual size (Alen)\n\n\t\t\t-8\ta column has a negative number of entries\n\n\t\t\t\t\tstats [4]: column with < 0 entries\n\t\t\t\t\tstats [5]: number of entries in col\n\n\t\t\t-9\ta row index is out of bounds\n\n\t\t\t\t\tstats [4]: column with bad row index\n\t\t\t\t\tstats [5]: bad row index\n\t\t\t\t\tstats [6]: n_row, # of rows of matrx\n\n\t\t\t-10\t(unused; see symamd.c)\n\n\t\t\t-999\t(unused; see symamd.c)\n\n\t\tFuture versions may return more statistics in the stats array.\n\n\tExample:\n\t\n\t    See http://www.cise.ufl.edu/research/sparse/colamd/example.c\n\t    for a complete example.\n\n\t    To order the columns of a 5-by-4 matrix with 11 nonzero entries in\n\t    the following nonzero pattern\n\n\t    \tx 0 x 0\n\t\tx 0 x x\n\t\t0 x x 0\n\t\t0 0 x x\n\t\tx x 0 0\n\n\t    with default knobs and no output statistics, do the following:\n\n\t\t#include \"colamd.h\"\n\t\t#define ALEN COLAMD_RECOMMENDED (11, 5, 4)\n\t\tint A [ALEN] = {1, 2, 5, 3, 5, 1, 2, 3, 4, 2, 4} ;\n\t\tint p [ ] = {0, 3, 5, 9, 11} ;\n\t\tint stats [COLAMD_STATS] ;\n\t\tcolamd (5, 4, ALEN, A, p, (double *) NULL, stats) ;\n\n\t    The permutation is returned in the array p, and A is destroyed.\n\n    ----------------------------------------------------------------------------\n    symamd:\n    ----------------------------------------------------------------------------\n\n\tC syntax:\n\n\t    #include \"colamd.h\"\n\t    int symamd (int n, int *A, int *p, int *perm,\n\t    \tint knobs [COLAMD_KNOBS], int stats [COLAMD_STATS],\n\t\tvoid (*allocate) (size_t, size_t), void (*release) (void *)) ;\n\n\tPurpose:\n\n    \t    The symamd routine computes an ordering P of a symmetric sparse\n\t    matrix A such that the Cholesky factorization PAP' = LL' remains\n\t    sparse.  It is based on a column ordering of a matrix M constructed\n\t    so that the nonzero pattern of M'M is the same as A.  The matrix A\n\t    is assumed to be symmetric; only the strictly lower triangular part\n\t    is accessed.  You must pass your selected memory allocator (usually\n\t    calloc/free or mxCalloc/mxFree) to symamd, for it to allocate\n\t    memory for the temporary matrix M.\n\n\tReturns:\n\n\t    TRUE (1) if successful, FALSE (0) otherwise.\n\n\tArguments:\n\n\t    int n ;\t\tInput argument.\n\n\t    \tNumber of rows and columns in the symmetrix matrix A.\n\t\tRestriction:  n >= 0.\n\t\tSymamd returns FALSE if n is negative.\n\n\t    int A [nnz] ;\tInput argument.\n\n\t    \tA is an integer array of size nnz, where nnz = p [n].\n\t\t\n\t\tThe row indices of the entries in column c of the matrix are\n\t\theld in A [(p [c]) ... (p [c+1]-1)].  The row indices in a\n\t\tgiven column c need not be in ascending order, and duplicate\n\t\trow indices may be present.  However, symamd will run faster\n\t\tif the columns are in sorted order with no duplicate entries. \n\n\t\tThe matrix is 0-based.  That is, rows are in the range 0 to\n\t\tn-1, and columns are in the range 0 to n-1.  Symamd\n\t\treturns FALSE if any row index is out of range.\n\n\t\tThe contents of A are not modified.\n\n\t    int p [n+1] ;   \tInput argument.\n\n\t\tp is an integer array of size n+1.  On input, it holds the\n\t\t\"pointers\" for the column form of the matrix A.  Column c of\n\t\tthe matrix A is held in A [(p [c]) ... (p [c+1]-1)].  The first\n\t\tentry, p [0], must be zero, and p [c] <= p [c+1] must hold\n\t\tfor all c in the range 0 to n-1.  The value p [n] is\n\t\tthus the total number of entries in the pattern of the matrix A.\n\t\tSymamd returns FALSE if these conditions are not met.\n\n\t\tThe contents of p are not modified.\n\n\t    int perm [n+1] ;   \tOutput argument.\n\n\t\tOn output, if symamd returns TRUE, the array perm holds the\n\t\tpermutation P, where perm [0] is the first index in the new\n\t\tordering, and perm [n-1] is the last.  That is, perm [k] = j\n\t\tmeans that row and column j of A is the kth column in PAP',\n\t\twhere k is in the range 0 to n-1 (perm [0] = j means\n\t\tthat row and column j of A are the first row and column in\n\t\tPAP').  The array is used as a workspace during the ordering,\n\t\twhich is why it must be of length n+1, not just n.\n\n\t    double knobs [COLAMD_KNOBS] ;\tInput argument.\n\n\t\tSee colamd_set_defaults for a description.\n\n\t    int stats [COLAMD_STATS] ;\t\tOutput argument.\n\n\t\tStatistics on the ordering, and error status.\n\t\tSee colamd.h for related definitions.\n\t\tSymamd returns FALSE if stats is not present.\n\n\t\tstats [0]:  number of dense or empty row and columns ignored\n\t\t\t\t(and ordered last in the output permutation \n\t\t\t\tperm).  Note that a row/column can become\n\t\t\t\t\"empty\" if it contains only \"dense\" and/or\n\t\t\t\t\"empty\" columns/rows.\n\n\t\tstats [1]:  (same as stats [0])\n\n\t\tstats [2]:  number of garbage collections performed.\n\n\t\tstats [3]:  status code.  < 0 is an error code.\n\t\t\t    > 1 is a warning or notice.\n\n\t\t\t0\tOK.  Each column of the input matrix contained\n\t\t\t\trow indices in increasing order, with no\n\t\t\t\tduplicates.\n\n\t\t\t1\tOK, but columns of input matrix were jumbled\n\t\t\t\t(unsorted columns or duplicate entries).  Symamd\n\t\t\t\thad to do some extra work to sort the matrix\n\t\t\t\tfirst and remove duplicate entries, but it\n\t\t\t\tstill was able to return a valid permutation\n\t\t\t\t(return value of symamd was TRUE).\n\n\t\t\t\t\tstats [4]: highest numbered column that\n\t\t\t\t\t\tis unsorted or has duplicate\n\t\t\t\t\t\tentries.\n\t\t\t\t\tstats [5]: last seen duplicate or\n\t\t\t\t\t\tunsorted row index.\n\t\t\t\t\tstats [6]: number of duplicate or\n\t\t\t\t\t\tunsorted row indices.\n\n\t\t\t-1\tA is a null pointer\n\n\t\t\t-2\tp is a null pointer\n\n\t\t\t-3\t(unused, see colamd.c)\n\n\t\t\t-4 \tn is negative\n\n\t\t\t\t\tstats [4]: n\n\n\t\t\t-5\tnumber of nonzeros in matrix is negative\n\n\t\t\t\t\tstats [4]: # of nonzeros (p [n]).\n\n\t\t\t-6\tp [0] is nonzero\n\n\t\t\t\t\tstats [4]: p [0]\n\n\t\t\t-7\t(unused)\n\n\t\t\t-8\ta column has a negative number of entries\n\n\t\t\t\t\tstats [4]: column with < 0 entries\n\t\t\t\t\tstats [5]: number of entries in col\n\n\t\t\t-9\ta row index is out of bounds\n\n\t\t\t\t\tstats [4]: column with bad row index\n\t\t\t\t\tstats [5]: bad row index\n\t\t\t\t\tstats [6]: n_row, # of rows of matrx\n\n\t\t\t-10\tout of memory (unable to allocate temporary\n\t\t\t\tworkspace for M or count arrays using the\n\t\t\t\t\"allocate\" routine passed into symamd).\n\n\t\t\t-999\tinternal error.  colamd failed to order the\n\t\t\t\tmatrix M, when it should have succeeded.  This\n\t\t\t\tindicates a bug.  If this (and *only* this)\n\t\t\t\terror code occurs, please contact the authors.\n\t\t\t\tDon't contact the authors if you get any other\n\t\t\t\terror code.\n\n\t\tFuture versions may return more statistics in the stats array.\n\n\t    void * (*allocate) (size_t, size_t)\n\n\t    \tA pointer to a function providing memory allocation.  The\n\t\tallocated memory must be returned initialized to zero.  For a\n\t\tC application, this argument should normally be a pointer to\n\t\tcalloc.  For a Matlab mexFunction, the routine mxCalloc is\n\t\tpassed instead.\n\n\t    void (*release) (size_t, size_t)\n\n\t    \tA pointer to a function that frees memory allocated by the\n\t\tmemory allocation routine above.  For a C application, this\n\t\targument should normally be a pointer to free.  For a Matlab\n\t\tmexFunction, the routine mxFree is passed instead.\n\n\n    ----------------------------------------------------------------------------\n    colamd_report:\n    ----------------------------------------------------------------------------\n\n\tC syntax:\n\n\t    #include \"colamd.h\"\n\t    colamd_report (int stats [COLAMD_STATS]) ;\n\n\tPurpose:\n\n\t    Prints the error status and statistics recorded in the stats\n\t    array on the standard error output (for a standard C routine)\n\t    or on the Matlab output (for a mexFunction).\n\n\tArguments:\n\n\t    int stats [COLAMD_STATS] ;\tInput only.  Statistics from colamd.\n\n\n    ----------------------------------------------------------------------------\n    symamd_report:\n    ----------------------------------------------------------------------------\n\n\tC syntax:\n\n\t    #include \"colamd.h\"\n\t    symamd_report (int stats [COLAMD_STATS]) ;\n\n\tPurpose:\n\n\t    Prints the error status and statistics recorded in the stats\n\t    array on the standard error output (for a standard C routine)\n\t    or on the Matlab output (for a mexFunction).\n\n\tArguments:\n\n\t    int stats [COLAMD_STATS] ;\tInput only.  Statistics from symamd.\n\n\n*/\n\n/* ========================================================================== */\n/* === Scaffolding code definitions  ======================================== */\n/* ========================================================================== */\n\n/* Ensure that debugging is turned off: */\n#ifndef NDEBUG\n#define NDEBUG\n#endif /* NDEBUG */\n\n/*\n   Our \"scaffolding code\" philosophy:  In our opinion, well-written library\n   code should keep its \"debugging\" code, and just normally have it turned off\n   by the compiler so as not to interfere with performance.  This serves\n   several purposes:\n\n   (1) assertions act as comments to the reader, telling you what the code\n\texpects at that point.  All assertions will always be true (unless\n\tthere really is a bug, of course).\n\n   (2) leaving in the scaffolding code assists anyone who would like to modify\n\tthe code, or understand the algorithm (by reading the debugging output,\n\tone can get a glimpse into what the code is doing).\n\n   (3) (gasp!) for actually finding bugs.  This code has been heavily tested\n\tand \"should\" be fully functional and bug-free ... but you never know...\n\n    To enable debugging, comment out the \"#define NDEBUG\" above.  For a Matlab\n    mexFunction, you will also need to modify mexopts.sh to remove the -DNDEBUG\n    definition.  The code will become outrageously slow when debugging is\n    enabled.  To control the level of debugging output, set an environment\n    variable D to 0 (little), 1 (some), 2, 3, or 4 (lots).  When debugging,\n    you should see the following message on the standard output:\n\n    \tcolamd: debug version, D = 1 (THIS WILL BE SLOW!)\n\n    or a similar message for symamd.  If you don't, then debugging has not\n    been enabled.\n\n*/\n\n/* ========================================================================== */\n/* === Include files ======================================================== */\n/* ========================================================================== */\n\n#include \"colamd.h\"\n#include <limits.h>\n\n#ifdef MATLAB_MEX_FILE\n#include \"mex.h\"\n#include \"matrix.h\"\n#else\n#include <stdio.h>\n#include <assert.h>\n#endif /* MATLAB_MEX_FILE */\n\n#ifdef FORTIFY\n# include \"lp_fortify.h\"\n#endif\n\n\n/* ========================================================================== */\n/* === Definitions ========================================================== */\n/* ========================================================================== */\n\n/* Routines are either PUBLIC (user-callable) or PRIVATE (not user-callable) */\n#define PUBLIC\n#define PRIVATE static\n\n#define MAX(a,b) (((a) > (b)) ? (a) : (b))\n#define MIN(a,b) (((a) < (b)) ? (a) : (b))\n\n#define ONES_COMPLEMENT(r) (-(r)-1)\n\n/* -------------------------------------------------------------------------- */\n/* Change for version 2.1:  define TRUE and FALSE only if not yet defined */  \n/* -------------------------------------------------------------------------- */\n\n#ifndef TRUE\n#define TRUE (1)\n#endif\n\n#ifndef FALSE\n#define FALSE (0)\n#endif\n\n/* -------------------------------------------------------------------------- */\n\n#define EMPTY\t(-1)\n\n/* Row and column status */\n#define ALIVE\t(0)\n#define DEAD\t(-1)\n\n/* Column status */\n#define DEAD_PRINCIPAL\t\t(-1)\n#define DEAD_NON_PRINCIPAL\t(-2)\n\n/* Macros for row and column status update and checking. */\n#define ROW_IS_DEAD(r)\t\t\tROW_IS_MARKED_DEAD (Row[r].shared2.mark)\n#define ROW_IS_MARKED_DEAD(row_mark)\t(row_mark < ALIVE)\n#define ROW_IS_ALIVE(r)\t\t\t(Row [r].shared2.mark >= ALIVE)\n#define COL_IS_DEAD(c)\t\t\t(Col [c].start < ALIVE)\n#define COL_IS_ALIVE(c)\t\t\t(Col [c].start >= ALIVE)\n#define COL_IS_DEAD_PRINCIPAL(c)\t(Col [c].start == DEAD_PRINCIPAL)\n#define KILL_ROW(r)\t\t\t{ Row [r].shared2.mark = DEAD ; }\n#define KILL_PRINCIPAL_COL(c)\t\t{ Col [c].start = DEAD_PRINCIPAL ; }\n#define KILL_NON_PRINCIPAL_COL(c)\t{ Col [c].start = DEAD_NON_PRINCIPAL ; }\n\n/* ========================================================================== */\n/* === Colamd reporting mechanism =========================================== */\n/* ========================================================================== */\n\n#ifdef MATLAB_MEX_FILE\n\n/* use mexPrintf in a Matlab mexFunction, for debugging and statistics output */\n#define PRINTF mexPrintf\n\n/* In Matlab, matrices are 1-based to the user, but 0-based internally */\n#define INDEX(i) ((i)+1)\n\n#else\n\n/* Use printf in standard C environment, for debugging and statistics output. */\n/* Output is generated only if debugging is enabled at compile time, or if */\n/* the caller explicitly calls colamd_report or symamd_report. */\n#define PRINTF printf\n\n/* In C, matrices are 0-based and indices are reported as such in *_report */\n#define INDEX(i) (i)\n\n#endif /* MATLAB_MEX_FILE */\n\n/* ========================================================================== */\n/* === Prototypes of PRIVATE routines ======================================= */\n/* ========================================================================== */\n\nPRIVATE int init_rows_cols\n(\n    int n_row,\n    int n_col,\n    Colamd_Row Row [],\n    Colamd_Col Col [],\n    int A [],\n    int p [],\n    int stats [COLAMD_STATS]\n) ;\n\nPRIVATE void init_scoring\n(\n    int n_row,\n    int n_col,\n    Colamd_Row Row [],\n    Colamd_Col Col [],\n    int A [],\n    int head [],\n    double knobs [COLAMD_KNOBS],\n    int *p_n_row2,\n    int *p_n_col2,\n    int *p_max_deg\n) ;\n\nPRIVATE int find_ordering\n(\n    int n_row,\n    int n_col,\n    int Alen,\n    Colamd_Row Row [],\n    Colamd_Col Col [],\n    int A [],\n    int head [],\n    int n_col2,\n    int max_deg,\n    int pfree\n) ;\n\nPRIVATE void order_children\n(\n    int n_col,\n    Colamd_Col Col [],\n    int p []\n) ;\n\nPRIVATE void detect_super_cols\n(\n\n#ifndef NDEBUG\n    int n_col,\n    Colamd_Row Row [],\n#endif /* NDEBUG */\n\n    Colamd_Col Col [],\n    int A [],\n    int head [],\n    int row_start,\n    int row_length\n) ;\n\nPRIVATE int garbage_collection\n(\n    int n_row,\n    int n_col,\n    Colamd_Row Row [],\n    Colamd_Col Col [],\n    int A [],\n    int *pfree\n) ;\n\nPRIVATE int clear_mark\n(\n    int n_row,\n    Colamd_Row Row []\n) ;\n\nPRIVATE void print_report\n(\n    char *method,\n    int stats [COLAMD_STATS]\n) ;\n\n/* ========================================================================== */\n/* === Debugging prototypes and definitions ================================= */\n/* ========================================================================== */\n\n#ifndef NDEBUG\n\n/* colamd_debug is the *ONLY* global variable, and is only */\n/* present when debugging */\n\nPRIVATE int colamd_debug ;\t/* debug print level */\n\n#define DEBUG0(params) { (void) PRINTF params ; }\n#define DEBUG1(params) { if (colamd_debug >= 1) (void) PRINTF params ; }\n#define DEBUG2(params) { if (colamd_debug >= 2) (void) PRINTF params ; }\n#define DEBUG3(params) { if (colamd_debug >= 3) (void) PRINTF params ; }\n#define DEBUG4(params) { if (colamd_debug >= 4) (void) PRINTF params ; }\n\n#ifdef MATLAB_MEX_FILE\n#define ASSERT(expression) (mxAssert ((expression), \"\"))\n#else\n#define ASSERT(expression) (assert (expression))\n#endif /* MATLAB_MEX_FILE */\n\nPRIVATE void colamd_get_debug\t/* gets the debug print level from getenv */\n(\n    char *method\n) ;\n\nPRIVATE void debug_deg_lists\n(\n    int n_row,\n    int n_col,\n    Colamd_Row Row [],\n    Colamd_Col Col [],\n    int head [],\n    int min_score,\n    int should,\n    int max_deg\n) ;\n\nPRIVATE void debug_mark\n(\n    int n_row,\n    Colamd_Row Row [],\n    int tag_mark,\n    int max_mark\n) ;\n\nPRIVATE void debug_matrix\n(\n    int n_row,\n    int n_col,\n    Colamd_Row Row [],\n    Colamd_Col Col [],\n    int A []\n) ;\n\nPRIVATE void debug_structures\n(\n    int n_row,\n    int n_col,\n    Colamd_Row Row [],\n    Colamd_Col Col [],\n    int A [],\n    int n_col2\n) ;\n\n#else /* NDEBUG */\n\n/* === No debugging ========================================================= */\n\n#define DEBUG0(params) ;\n#define DEBUG1(params) ;\n#define DEBUG2(params) ;\n#define DEBUG3(params) ;\n#define DEBUG4(params) ;\n\n#define ASSERT(expression) ((void) 0)\n\n#endif /* NDEBUG */\n\n/* ========================================================================== */\n\n\n\n/* ========================================================================== */\n/* === USER-CALLABLE ROUTINES: ============================================== */\n/* ========================================================================== */\n\n\n/* ========================================================================== */\n/* === colamd_recommended =================================================== */\n/* ========================================================================== */\n\n/*\n    The colamd_recommended routine returns the suggested size for Alen.  This\n    value has been determined to provide good balance between the number of\n    garbage collections and the memory requirements for colamd.  If any\n    argument is negative, a -1 is returned as an error condition.  This\n    function is also available as a macro defined in colamd.h, so that you\n    can use it for a statically-allocated array size.\n*/\n\nPUBLIC int colamd_recommended\t/* returns recommended value of Alen. */\n(\n    /* === Parameters ======================================================= */\n\n    int nnz,\t\t\t/* number of nonzeros in A */\n    int n_row,\t\t\t/* number of rows in A */\n    int n_col\t\t\t/* number of columns in A */\n)\n{\n    return (COLAMD_RECOMMENDED (nnz, n_row, n_col)) ; \n}\n\n\n/* ========================================================================== */\n/* === colamd_set_defaults ================================================== */\n/* ========================================================================== */\n\n/*\n    The colamd_set_defaults routine sets the default values of the user-\n    controllable parameters for colamd:\n\n\tknobs [0]\trows with knobs[0]*n_col entries or more are removed\n\t\t\tprior to ordering in colamd.  Rows and columns with\n\t\t\tknobs[0]*n_col entries or more are removed prior to\n\t\t\tordering in symamd and placed last in the output\n\t\t\tordering.\n\n\tknobs [1]\tcolumns with knobs[1]*n_row entries or more are removed\n\t\t\tprior to ordering in colamd, and placed last in the\n\t\t\tcolumn permutation.  Symamd ignores this knob.\n\n\tknobs [2..19]\tunused, but future versions might use this\n*/\n\nPUBLIC void colamd_set_defaults\n(\n    /* === Parameters ======================================================= */\n\n    double knobs [COLAMD_KNOBS]\t\t/* knob array */\n)\n{\n    /* === Local variables ================================================== */\n\n    int i ;\n\n    if (!knobs)\n    {\n\treturn ;\t\t\t/* no knobs to initialize */\n    }\n    for (i = 0 ; i < COLAMD_KNOBS ; i++)\n    {\n\tknobs [i] = 0 ;\n    }\n    knobs [COLAMD_DENSE_ROW] = 0.5 ;\t/* ignore rows over 50% dense */\n    knobs [COLAMD_DENSE_COL] = 0.5 ;\t/* ignore columns over 50% dense */\n}\n\n\n/* ========================================================================== */\n/* === symamd =============================================================== */\n/* ========================================================================== */\n\nPUBLIC int symamd\t\t\t/* return TRUE if OK, FALSE otherwise */\n(\n    /* === Parameters ======================================================= */\n\n    int n,\t\t\t\t/* number of rows and columns of A */\n    int A [],\t\t\t\t/* row indices of A */\n    int p [],\t\t\t\t/* column pointers of A */\n    int perm [],\t\t\t/* output permutation, size n+1 */\n    double knobs [COLAMD_KNOBS],\t/* parameters (uses defaults if NULL) */\n    int stats [COLAMD_STATS],\t\t/* output statistics and error codes */\n    void * (*allocate) (size_t, size_t),\n    \t\t\t\t\t/* pointer to calloc (ANSI C) or */\n\t\t\t\t\t/* mxCalloc (for Matlab mexFunction) */\n    void (*release) (void *)\n    \t\t\t\t\t/* pointer to free (ANSI C) or */\n    \t\t\t\t\t/* mxFree (for Matlab mexFunction) */\n)\n{\n    /* === Local variables ================================================== */\n\n    int *count ;\t\t/* length of each column of M, and col pointer*/\n    int *mark ;\t\t\t/* mark array for finding duplicate entries */\n    int *M ;\t      /* row indices of matrix M */\n    int Mlen ;\t\t\t/* length of M */\n    int n_row ;\t\t\t/* number of rows in M */\n    int nnz ;\t\t\t/* number of entries in A */\n    int i ;\t\t\t/* row index of A */\n    int j ;\t\t\t/* column index of A */\n    int k ;\t\t\t/* row index of M */ \n    int mnz ;\t\t\t/* number of nonzeros in M */\n    int pp ;\t\t\t/* index into a column of A */\n    int last_row ;\t\t/* last row seen in the current column */\n    int length ;\t\t/* number of nonzeros in a column */\n\n    double cknobs [COLAMD_KNOBS] ;\t\t/* knobs for colamd */\n    double default_knobs [COLAMD_KNOBS] ;\t/* default knobs for colamd */\n    int cstats [COLAMD_STATS] ;\t\t\t/* colamd stats */\n\n#ifndef NDEBUG\n    colamd_get_debug (\"symamd\") ;\n#endif /* NDEBUG */\n\n    /* === Check the input arguments ======================================== */\n\n    if (!stats)\n    {\n\tDEBUG0 ((\"symamd: stats not present\\n\")) ;\n\treturn (FALSE) ;\n    }\n    for (i = 0 ; i < COLAMD_STATS ; i++)\n    {\n\tstats [i] = 0 ;\n    }\n    stats [COLAMD_STATUS] = COLAMD_OK ;\n    stats [COLAMD_INFO1] = -1 ;\n    stats [COLAMD_INFO2] = -1 ;\n\n    if (!A)\n    {\n    \tstats [COLAMD_STATUS] = COLAMD_ERROR_A_not_present ;\n\tDEBUG0 ((\"symamd: A not present\\n\")) ;\n\treturn (FALSE) ;\n    }\n\n    if (!p)\t\t/* p is not present */\n    {\n\tstats [COLAMD_STATUS] = COLAMD_ERROR_p_not_present ;\n\tDEBUG0 ((\"symamd: p not present\\n\")) ;\n    \treturn (FALSE) ;\n    }\n\n    if (n < 0)\t\t/* n must be >= 0 */\n    {\n\tstats [COLAMD_STATUS] = COLAMD_ERROR_ncol_negative ;\n\tstats [COLAMD_INFO1] = n ;\n\tDEBUG0 ((\"symamd: n negative %d\\n\", n)) ;\n    \treturn (FALSE) ;\n    }\n\n    nnz = p [n] ;\n    if (nnz < 0)\t/* nnz must be >= 0 */\n    {\n\tstats [COLAMD_STATUS] = COLAMD_ERROR_nnz_negative ;\n\tstats [COLAMD_INFO1] = nnz ;\n\tDEBUG0 ((\"symamd: number of entries negative %d\\n\", nnz)) ;\n\treturn (FALSE) ;\n    }\n\n    if (p [0] != 0)\n    {\n\tstats [COLAMD_STATUS] = COLAMD_ERROR_p0_nonzero ;\n\tstats [COLAMD_INFO1] = p [0] ;\n\tDEBUG0 ((\"symamd: p[0] not zero %d\\n\", p [0])) ;\n\treturn (FALSE) ;\n    }\n\n    /* === If no knobs, set default knobs =================================== */\n\n    if (!knobs)\n    {\n\tcolamd_set_defaults (default_knobs) ;\n\tknobs = default_knobs ;\n    }\n\n    /* === Allocate count and mark ========================================== */\n\n    count = (int *) ((*allocate) (n+1, sizeof (int))) ;\n    if (!count)\n    {\n\tstats [COLAMD_STATUS] = COLAMD_ERROR_out_of_memory ;\n\tDEBUG0 ((\"symamd: allocate count (size %d) failed\\n\", n+1)) ;\n\treturn (FALSE) ;\n    }\n\n    mark = (int *) ((*allocate) (n+1, sizeof (int))) ;\n    if (!mark)\n    {\n\tstats [COLAMD_STATUS] = COLAMD_ERROR_out_of_memory ;\n\t(*release) ((void *) count) ;\n\tDEBUG0 ((\"symamd: allocate mark (size %d) failed\\n\", n+1)) ;\n\treturn (FALSE) ;\n    }\n\n    /* === Compute column counts of M, check if A is valid ================== */\n\n    stats [COLAMD_INFO3] = 0 ;  /* number of duplicate or unsorted row indices*/\n\n    for (i = 0 ; i < n ; i++)\n    {\n    \tmark [i] = -1 ;\n    }\n\n    for (j = 0 ; j < n ; j++)\n    {\n\tlast_row = -1 ;\n\n\tlength = p [j+1] - p [j] ;\n\tif (length < 0)\n\t{\n\t    /* column pointers must be non-decreasing */\n\t    stats [COLAMD_STATUS] = COLAMD_ERROR_col_length_negative ;\n\t    stats [COLAMD_INFO1] = j ;\n\t    stats [COLAMD_INFO2] = length ;\n\t    (*release) ((void *) count) ;\n\t    (*release) ((void *) mark) ;\n\t    DEBUG0 ((\"symamd: col %d negative length %d\\n\", j, length)) ;\n\t    return (FALSE) ;\n\t}\n\n\tfor (pp = p [j] ; pp < p [j+1] ; pp++)\n\t{\n\t    i = A [pp] ;\n\t    if (i < 0 || i >= n)\n\t    {\n\t\t/* row index i, in column j, is out of bounds */\n\t\tstats [COLAMD_STATUS] = COLAMD_ERROR_row_index_out_of_bounds ;\n\t\tstats [COLAMD_INFO1] = j ;\n\t\tstats [COLAMD_INFO2] = i ;\n\t\tstats [COLAMD_INFO3] = n ;\n\t\t(*release) ((void *) count) ;\n\t\t(*release) ((void *) mark) ;\n\t\tDEBUG0 ((\"symamd: row %d col %d out of bounds\\n\", i, j)) ;\n\t\treturn (FALSE) ;\n\t    }\n\n\t    if (i <= last_row || mark [i] == j)\n\t    {\n\t\t/* row index is unsorted or repeated (or both), thus col */\n\t\t/* is jumbled.  This is a notice, not an error condition. */\n\t\tstats [COLAMD_STATUS] = COLAMD_OK_BUT_JUMBLED ;\n\t\tstats [COLAMD_INFO1] = j ;\n\t\tstats [COLAMD_INFO2] = i ;\n\t\t(stats [COLAMD_INFO3]) ++ ;\n\t\tDEBUG1 ((\"symamd: row %d col %d unsorted/duplicate\\n\", i, j)) ;\n\t    }\n\n\t    if (i > j && mark [i] != j)\n\t    {\n\t\t/* row k of M will contain column indices i and j */\n\t\tcount [i]++ ;\n\t\tcount [j]++ ;\n\t    }\n\n\t    /* mark the row as having been seen in this column */\n\t    mark [i] = j ;\n\n\t    last_row = i ;\n\t}\n    }\n\n    if (stats [COLAMD_STATUS] == COLAMD_OK)\n    {\n\t/* if there are no duplicate entries, then mark is no longer needed */\n\t(*release) ((void *) mark) ;\n    }\n\n    /* === Compute column pointers of M ===================================== */\n\n    /* use output permutation, perm, for column pointers of M */\n    perm [0] = 0 ;\n    for (j = 1 ; j <= n ; j++)\n    {\n\tperm [j] = perm [j-1] + count [j-1] ;\n    }\n    for (j = 0 ; j < n ; j++)\n    {\n\tcount [j] = perm [j] ;\n    }\n\n    /* === Construct M ====================================================== */\n\n    mnz = perm [n] ;\n    n_row = mnz / 2 ;\n    Mlen = colamd_recommended (mnz, n_row, n) ;\n    M = (int *) ((*allocate) (Mlen, sizeof (int))) ;\n    DEBUG0 ((\"symamd: M is %d-by-%d with %d entries, Mlen = %d\\n\",\n    \tn_row, n, mnz, Mlen)) ;\n\n    if (!M)\n    {\n\tstats [COLAMD_STATUS] = COLAMD_ERROR_out_of_memory ;\n\t(*release) ((void *) count) ;\n\t(*release) ((void *) mark) ;\n\tDEBUG0 ((\"symamd: allocate M (size %d) failed\\n\", Mlen)) ;\n\treturn (FALSE) ;\n    }\n\n    k = 0 ;\n\n    if (stats [COLAMD_STATUS] == COLAMD_OK)\n    {\n\t/* Matrix is OK */\n\tfor (j = 0 ; j < n ; j++)\n\t{\n\t    ASSERT (p [j+1] - p [j] >= 0) ;\n\t    for (pp = p [j] ; pp < p [j+1] ; pp++)\n\t    {\n\t\ti = A [pp] ;\n\t\tASSERT (i >= 0 && i < n) ;\n\t\tif (i > j)\n\t\t{\n\t\t    /* row k of M contains column indices i and j */\n\t\t    M [count [i]++] = k ;\n\t\t    M [count [j]++] = k ;\n\t\t    k++ ;\n\t\t}\n\t    }\n\t}\n    }\n    else\n    {\n\t/* Matrix is jumbled.  Do not add duplicates to M.  Unsorted cols OK. */\n\tDEBUG0 ((\"symamd: Duplicates in A.\\n\")) ;\n\tfor (i = 0 ; i < n ; i++)\n\t{\n\t    mark [i] = -1 ;\n\t}\n\tfor (j = 0 ; j < n ; j++)\n\t{\n\t    ASSERT (p [j+1] - p [j] >= 0) ;\n\t    for (pp = p [j] ; pp < p [j+1] ; pp++)\n\t    {\n\t\ti = A [pp] ;\n\t\tASSERT (i >= 0 && i < n) ;\n\t\tif (i > j && mark [i] != j)\n\t\t{\n\t\t    /* row k of M contains column indices i and j */\n\t\t    M [count [i]++] = k ;\n\t\t    M [count [j]++] = k ;\n\t\t    k++ ;\n\t\t    mark [i] = j ;\n\t\t}\n\t    }\n\t}\n\t(*release) ((void *) mark) ;\n    }\n\n    /* count and mark no longer needed */\n    (*release) ((void *) count) ;\n    ASSERT (k == n_row) ;\n\n    /* === Adjust the knobs for M =========================================== */\n\n    for (i = 0 ; i < COLAMD_KNOBS ; i++)\n    {\n\tcknobs [i] = knobs [i] ;\n    }\n\n    /* there are no dense rows in M */\n    cknobs [COLAMD_DENSE_ROW] = 1.0 ;\n\n    if (n_row != 0 && n < n_row)\n    {\n\t/* On input, the knob is a fraction of 1..n, the number of rows of A. */\n\t/* Convert it to a fraction of 1..n_row, of the number of rows of M. */\n    \tcknobs [COLAMD_DENSE_COL] = (knobs [COLAMD_DENSE_ROW] * n) / n_row ;\n    }\n    else\n    {\n\t/* no dense columns in M */\n    \tcknobs [COLAMD_DENSE_COL] = 1.0 ;\n    }\n\n    DEBUG0 ((\"symamd: dense col knob for M: %g\\n\", cknobs [COLAMD_DENSE_COL])) ;\n\n    /* === Order the columns of M =========================================== */\n\n    if (!colamd (n_row, n, Mlen, M, perm, cknobs, cstats))\n    {\n\t/* This \"cannot\" happen, unless there is a bug in the code. */\n\tstats [COLAMD_STATUS] = COLAMD_ERROR_internal_error ;\n\t(*release) ((void *) M) ;\n\tDEBUG0 ((\"symamd: internal error!\\n\")) ;\n\treturn (FALSE) ;\n    }\n\n    /* Note that the output permutation is now in perm */\n\n    /* === get the statistics for symamd from colamd ======================== */\n\n    /* note that a dense column in colamd means a dense row and col in symamd */\n    stats [COLAMD_DENSE_ROW]    = cstats [COLAMD_DENSE_COL] ;\n    stats [COLAMD_DENSE_COL]    = cstats [COLAMD_DENSE_COL] ;\n    stats [COLAMD_DEFRAG_COUNT] = cstats [COLAMD_DEFRAG_COUNT] ;\n\n    /* === Free M =========================================================== */\n\n    (*release) ((void *) M) ;\n    DEBUG0 ((\"symamd: done.\\n\")) ;\n    return (TRUE) ;\n\n}\n\n/* ========================================================================== */\n/* === colamd =============================================================== */\n/* ========================================================================== */\n\n/*\n    The colamd routine computes a column ordering Q of a sparse matrix\n    A such that the LU factorization P(AQ) = LU remains sparse, where P is\n    selected via partial pivoting.   The routine can also be viewed as\n    providing a permutation Q such that the Cholesky factorization\n    (AQ)'(AQ) = LL' remains sparse.\n*/\n\nPUBLIC int colamd\t\t/* returns TRUE if successful, FALSE otherwise*/\n(\n    /* === Parameters ======================================================= */\n\n    int n_row,\t\t\t/* number of rows in A */\n    int n_col,\t\t\t/* number of columns in A */\n    int Alen,\t\t\t/* length of A */\n    int A [],\t\t\t/* row indices of A */\n    int p [],\t\t\t/* pointers to columns in A */\n    double knobs [COLAMD_KNOBS],/* parameters (uses defaults if NULL) */\n    int stats [COLAMD_STATS]\t/* output statistics and error codes */\n)\n{\n    /* === Local variables ================================================== */\n\n    int i ;\t\t\t/* loop index */\n    int nnz ;\t\t\t/* nonzeros in A */\n    int Row_size ;\t\t/* size of Row [], in integers */\n    int Col_size ;\t\t/* size of Col [], in integers */\n    int need ;\t\t\t/* minimum required length of A */\n    Colamd_Row *Row ;\t\t/* pointer into A of Row [0..n_row] array */\n    Colamd_Col *Col ;\t\t/* pointer into A of Col [0..n_col] array */\n    int n_col2 ;\t\t/* number of non-dense, non-empty columns */\n    int n_row2 ;\t\t/* number of non-dense, non-empty rows */\n    int ngarbage ;\t\t/* number of garbage collections performed */\n    int max_deg ;\t\t/* maximum row degree */\n    double default_knobs [COLAMD_KNOBS] ;\t/* default knobs array */\n\n#ifndef NDEBUG\n    colamd_get_debug (\"colamd\") ;\n#endif /* NDEBUG */\n\n    /* === Check the input arguments ======================================== */\n\n    if (!stats)\n    {\n\tDEBUG0 ((\"colamd: stats not present\\n\")) ;\n\treturn (FALSE) ;\n    }\n    for (i = 0 ; i < COLAMD_STATS ; i++)\n    {\n\tstats [i] = 0 ;\n    }\n    stats [COLAMD_STATUS] = COLAMD_OK ;\n    stats [COLAMD_INFO1] = -1 ;\n    stats [COLAMD_INFO2] = -1 ;\n\n    if (!A)\t\t/* A is not present */\n    {\n\tstats [COLAMD_STATUS] = COLAMD_ERROR_A_not_present ;\n\tDEBUG0 ((\"colamd: A not present\\n\")) ;\n\treturn (FALSE) ;\n    }\n\n    if (!p)\t\t/* p is not present */\n    {\n\tstats [COLAMD_STATUS] = COLAMD_ERROR_p_not_present ;\n\tDEBUG0 ((\"colamd: p not present\\n\")) ;\n    \treturn (FALSE) ;\n    }\n\n    if (n_row < 0)\t/* n_row must be >= 0 */\n    {\n\tstats [COLAMD_STATUS] = COLAMD_ERROR_nrow_negative ;\n\tstats [COLAMD_INFO1] = n_row ;\n\tDEBUG0 ((\"colamd: nrow negative %d\\n\", n_row)) ;\n    \treturn (FALSE) ;\n    }\n\n    if (n_col < 0)\t/* n_col must be >= 0 */\n    {\n\tstats [COLAMD_STATUS] = COLAMD_ERROR_ncol_negative ;\n\tstats [COLAMD_INFO1] = n_col ;\n\tDEBUG0 ((\"colamd: ncol negative %d\\n\", n_col)) ;\n    \treturn (FALSE) ;\n    }\n\n    nnz = p [n_col] ;\n    if (nnz < 0)\t/* nnz must be >= 0 */\n    {\n\tstats [COLAMD_STATUS] = COLAMD_ERROR_nnz_negative ;\n\tstats [COLAMD_INFO1] = nnz ;\n\tDEBUG0 ((\"colamd: number of entries negative %d\\n\", nnz)) ;\n\treturn (FALSE) ;\n    }\n\n    if (p [0] != 0)\n    {\n\tstats [COLAMD_STATUS] = COLAMD_ERROR_p0_nonzero\t;\n\tstats [COLAMD_INFO1] = p [0] ;\n\tDEBUG0 ((\"colamd: p[0] not zero %d\\n\", p [0])) ;\n\treturn (FALSE) ;\n    }\n\n    /* === If no knobs, set default knobs =================================== */\n\n    if (!knobs)\n    {\n\tcolamd_set_defaults (default_knobs) ;\n\tknobs = default_knobs ;\n    }\n\n    /* === Allocate the Row and Col arrays from array A ===================== */\n\n    Col_size = COLAMD_C (n_col) ;\n    Row_size = COLAMD_R (n_row) ;\n    need = 2*nnz + n_col + Col_size + Row_size ;\n\n    if (need > Alen)\n    {\n\t/* not enough space in array A to perform the ordering */\n\tstats [COLAMD_STATUS] = COLAMD_ERROR_A_too_small ;\n\tstats [COLAMD_INFO1] = need ;\n\tstats [COLAMD_INFO2] = Alen ;\n\tDEBUG0 ((\"colamd: Need Alen >= %d, given only Alen = %d\\n\", need,Alen));\n\treturn (FALSE) ;\n    }\n\n    Alen -= Col_size + Row_size ;\n    Col = (Colamd_Col *) &A [Alen] ;\n    Row = (Colamd_Row *) &A [Alen + Col_size] ;\n\n    /* === Construct the row and column data structures ===================== */\n\n    if (!init_rows_cols (n_row, n_col, Row, Col, A, p, stats))\n    {\n\t/* input matrix is invalid */\n\tDEBUG0 ((\"colamd: Matrix invalid\\n\")) ;\n\treturn (FALSE) ;\n    }\n\n    /* === Initialize scores, kill dense rows/columns ======================= */\n\n    init_scoring (n_row, n_col, Row, Col, A, p, knobs,\n\t&n_row2, &n_col2, &max_deg) ;\n\n    /* === Order the supercolumns =========================================== */\n\n    ngarbage = find_ordering (n_row, n_col, Alen, Row, Col, A, p,\n\tn_col2, max_deg, 2*nnz) ;\n\n    /* === Order the non-principal columns ================================== */\n\n    order_children (n_col, Col, p) ;\n\n    /* === Return statistics in stats ======================================= */\n\n    stats [COLAMD_DENSE_ROW] = n_row - n_row2 ;\n    stats [COLAMD_DENSE_COL] = n_col - n_col2 ;\n    stats [COLAMD_DEFRAG_COUNT] = ngarbage ;\n    DEBUG0 ((\"colamd: done.\\n\")) ; \n    return (TRUE) ;\n}\n\n\n/* ========================================================================== */\n/* === colamd_report ======================================================== */\n/* ========================================================================== */\n\nPUBLIC void colamd_report\n(\n    int stats [COLAMD_STATS]\n)\n{\n    print_report (\"colamd\", stats) ;\n}\n\n\n/* ========================================================================== */\n/* === symamd_report ======================================================== */\n/* ========================================================================== */\n\nPUBLIC void symamd_report\n(\n    int stats [COLAMD_STATS]\n)\n{\n    print_report (\"symamd\", stats) ;\n}\n\n\n\n/* ========================================================================== */\n/* === NON-USER-CALLABLE ROUTINES: ========================================== */\n/* ========================================================================== */\n\n/* There are no user-callable routines beyond this point in the file */\n\n\n/* ========================================================================== */\n/* === init_rows_cols ======================================================= */\n/* ========================================================================== */\n\n/*\n    Takes the column form of the matrix in A and creates the row form of the\n    matrix.  Also, row and column attributes are stored in the Col and Row\n    structs.  If the columns are un-sorted or contain duplicate row indices,\n    this routine will also sort and remove duplicate row indices from the\n    column form of the matrix.  Returns FALSE if the matrix is invalid,\n    TRUE otherwise.  Not user-callable.\n*/\n\nPRIVATE int init_rows_cols\t/* returns TRUE if OK, or FALSE otherwise */\n(\n    /* === Parameters ======================================================= */\n\n    int n_row,\t\t\t/* number of rows of A */\n    int n_col,\t\t\t/* number of columns of A */\n    Colamd_Row Row [],\t\t/* of size n_row+1 */\n    Colamd_Col Col [],\t\t/* of size n_col+1 */\n    int A [],\t\t\t/* row indices of A, of size Alen */\n    int p [],\t\t\t/* pointers to columns in A, of size n_col+1 */\n    int stats [COLAMD_STATS]\t/* colamd statistics */ \n)\n{\n    /* === Local variables ================================================== */\n\n    int col ;\t\t\t/* a column index */\n    int row ;\t\t\t/* a row index */\n    int *cp ;\t\t\t/* a column pointer */\n    int *cp_end ;\t\t/* a pointer to the end of a column */\n    int *rp ;\t\t\t/* a row pointer */\n    int *rp_end ;\t\t/* a pointer to the end of a row */\n    int last_row ;\t\t/* previous row */\n\n    /* === Initialize columns, and check column pointers ==================== */\n\n    for (col = 0 ; col < n_col ; col++)\n    {\n\tCol [col].start = p [col] ;\n\tCol [col].length = p [col+1] - p [col] ;\n\n\tif (Col [col].length < 0)\n\t{\n\t    /* column pointers must be non-decreasing */\n\t    stats [COLAMD_STATUS] = COLAMD_ERROR_col_length_negative ;\n\t    stats [COLAMD_INFO1] = col ;\n\t    stats [COLAMD_INFO2] = Col [col].length ;\n\t    DEBUG0 ((\"colamd: col %d length %d < 0\\n\", col, Col [col].length)) ;\n\t    return (FALSE) ;\n\t}\n\n\tCol [col].shared1.thickness = 1 ;\n\tCol [col].shared2.score = 0 ;\n\tCol [col].shared3.prev = EMPTY ;\n\tCol [col].shared4.degree_next = EMPTY ;\n    }\n\n    /* p [0..n_col] no longer needed, used as \"head\" in subsequent routines */\n\n    /* === Scan columns, compute row degrees, and check row indices ========= */\n\n    stats [COLAMD_INFO3] = 0 ;\t/* number of duplicate or unsorted row indices*/\n\n    for (row = 0 ; row < n_row ; row++)\n    {\n\tRow [row].length = 0 ;\n\tRow [row].shared2.mark = -1 ;\n    }\n\n    for (col = 0 ; col < n_col ; col++)\n    {\n\tlast_row = -1 ;\n\n\tcp = &A [p [col]] ;\n\tcp_end = &A [p [col+1]] ;\n\n\twhile (cp < cp_end)\n\t{\n\t    row = *cp++ ;\n\n\t    /* make sure row indices within range */\n\t    if (row < 0 || row >= n_row)\n\t    {\n\t\tstats [COLAMD_STATUS] = COLAMD_ERROR_row_index_out_of_bounds ;\n\t\tstats [COLAMD_INFO1] = col ;\n\t\tstats [COLAMD_INFO2] = row ;\n\t\tstats [COLAMD_INFO3] = n_row ;\n\t\tDEBUG0 ((\"colamd: row %d col %d out of bounds\\n\", row, col)) ;\n\t\treturn (FALSE) ;\n\t    }\n\n\t    if (row <= last_row || Row [row].shared2.mark == col)\n\t    {\n\t\t/* row index are unsorted or repeated (or both), thus col */\n\t\t/* is jumbled.  This is a notice, not an error condition. */\n\t\tstats [COLAMD_STATUS] = COLAMD_OK_BUT_JUMBLED ;\n\t\tstats [COLAMD_INFO1] = col ;\n\t\tstats [COLAMD_INFO2] = row ;\n\t\t(stats [COLAMD_INFO3]) ++ ;\n\t\tDEBUG1 ((\"colamd: row %d col %d unsorted/duplicate\\n\",row,col));\n\t    }\n\n\t    if (Row [row].shared2.mark != col)\n\t    {\n\t\tRow [row].length++ ;\n\t    }\n\t    else\n\t    {\n\t\t/* this is a repeated entry in the column, */\n\t\t/* it will be removed */\n\t\tCol [col].length-- ;\n\t    }\n\n\t    /* mark the row as having been seen in this column */\n\t    Row [row].shared2.mark = col ;\n\n\t    last_row = row ;\n\t}\n    }\n\n    /* === Compute row pointers ============================================= */\n\n    /* row form of the matrix starts directly after the column */\n    /* form of matrix in A */\n    Row [0].start = p [n_col] ;\n    Row [0].shared1.p = Row [0].start ;\n    Row [0].shared2.mark = -1 ;\n    for (row = 1 ; row < n_row ; row++)\n    {\n\tRow [row].start = Row [row-1].start + Row [row-1].length ;\n\tRow [row].shared1.p = Row [row].start ;\n\tRow [row].shared2.mark = -1 ;\n    }\n\n    /* === Create row form ================================================== */\n\n    if (stats [COLAMD_STATUS] == COLAMD_OK_BUT_JUMBLED)\n    {\n\t/* if cols jumbled, watch for repeated row indices */\n\tfor (col = 0 ; col < n_col ; col++)\n\t{\n\t    cp = &A [p [col]] ;\n\t    cp_end = &A [p [col+1]] ;\n\t    while (cp < cp_end)\n\t    {\n\t\trow = *cp++ ;\n\t\tif (Row [row].shared2.mark != col)\n\t\t{\n\t\t    A [(Row [row].shared1.p)++] = col ;\n\t\t    Row [row].shared2.mark = col ;\n\t\t}\n\t    }\n\t}\n    }\n    else\n    {\n\t/* if cols not jumbled, we don't need the mark (this is faster) */\n\tfor (col = 0 ; col < n_col ; col++)\n\t{\n\t    cp = &A [p [col]] ;\n\t    cp_end = &A [p [col+1]] ;\n\t    while (cp < cp_end)\n\t    {\n\t\tA [(Row [*cp++].shared1.p)++] = col ;\n\t    }\n\t}\n    }\n\n    /* === Clear the row marks and set row degrees ========================== */\n\n    for (row = 0 ; row < n_row ; row++)\n    {\n\tRow [row].shared2.mark = 0 ;\n\tRow [row].shared1.degree = Row [row].length ;\n    }\n\n    /* === See if we need to re-create columns ============================== */\n\n    if (stats [COLAMD_STATUS] == COLAMD_OK_BUT_JUMBLED)\n    {\n    \tDEBUG0 ((\"colamd: reconstructing column form, matrix jumbled\\n\")) ;\n\n#ifndef NDEBUG\n\t/* make sure column lengths are correct */\n\tfor (col = 0 ; col < n_col ; col++)\n\t{\n\t    p [col] = Col [col].length ;\n\t}\n\tfor (row = 0 ; row < n_row ; row++)\n\t{\n\t    rp = &A [Row [row].start] ;\n\t    rp_end = rp + Row [row].length ;\n\t    while (rp < rp_end)\n\t    {\n\t\tp [*rp++]-- ;\n\t    }\n\t}\n\tfor (col = 0 ; col < n_col ; col++)\n\t{\n\t    ASSERT (p [col] == 0) ;\n\t}\n\t/* now p is all zero (different than when debugging is turned off) */\n#endif /* NDEBUG */\n\n\t/* === Compute col pointers ========================================= */\n\n\t/* col form of the matrix starts at A [0]. */\n\t/* Note, we may have a gap between the col form and the row */\n\t/* form if there were duplicate entries, if so, it will be */\n\t/* removed upon the first garbage collection */\n\tCol [0].start = 0 ;\n\tp [0] = Col [0].start ;\n\tfor (col = 1 ; col < n_col ; col++)\n\t{\n\t    /* note that the lengths here are for pruned columns, i.e. */\n\t    /* no duplicate row indices will exist for these columns */\n\t    Col [col].start = Col [col-1].start + Col [col-1].length ;\n\t    p [col] = Col [col].start ;\n\t}\n\n\t/* === Re-create col form =========================================== */\n\n\tfor (row = 0 ; row < n_row ; row++)\n\t{\n\t    rp = &A [Row [row].start] ;\n\t    rp_end = rp + Row [row].length ;\n\t    while (rp < rp_end)\n\t    {\n\t\tA [(p [*rp++])++] = row ;\n\t    }\n\t}\n    }\n\n    /* === Done.  Matrix is not (or no longer) jumbled ====================== */\n\n    return (TRUE) ;\n}\n\n\n/* ========================================================================== */\n/* === init_scoring ========================================================= */\n/* ========================================================================== */\n\n/*\n    Kills dense or empty columns and rows, calculates an initial score for\n    each column, and places all columns in the degree lists.  Not user-callable.\n*/\n\nPRIVATE void init_scoring\n(\n    /* === Parameters ======================================================= */\n\n    int n_row,\t\t\t/* number of rows of A */\n    int n_col,\t\t\t/* number of columns of A */\n    Colamd_Row Row [],\t\t/* of size n_row+1 */\n    Colamd_Col Col [],\t\t/* of size n_col+1 */\n    int A [],\t\t\t/* column form and row form of A */\n    int head [],\t\t/* of size n_col+1 */\n    double knobs [COLAMD_KNOBS],/* parameters */\n    int *p_n_row2,\t\t/* number of non-dense, non-empty rows */\n    int *p_n_col2,\t\t/* number of non-dense, non-empty columns */\n    int *p_max_deg\t\t/* maximum row degree */\n)\n{\n    /* === Local variables ================================================== */\n\n    int c ;         /* a column index */\n    int r, row ;\t\t/* a row index */\n    int *cp ;\t\t    /* a column pointer */\n    int deg ;\t      /* degree of a row or column */\n    int *cp_end ;\t  /* a pointer to the end of a column */\n    int *new_cp ;\t  /* new column pointer */\n    int col_length ;\t\t/* length of pruned column */\n    int score ;\t    /* current column score */\n    int n_col2 ;    /* number of non-dense, non-empty columns */\n    int n_row2 ;    /* number of non-dense, non-empty rows */\n    int dense_row_count ;\t/* remove rows with more entries than this */\n    int dense_col_count ;\t/* remove cols with more entries than this */\n    int min_score ; /* smallest column score */\n    int max_deg ;\t  /* maximum row degree */\n    int next_col ;  /* Used to add to degree list.*/\n\n#ifndef NDEBUG\n    int debug_count ;\t\t/* debug only. */\n#endif /* NDEBUG */\n\n    /* === Extract knobs ==================================================== */\n\n    dense_row_count = (int) MAX (0, MIN (knobs [COLAMD_DENSE_ROW] * n_col, n_col)) ;\n    dense_col_count = (int) MAX (0, MIN (knobs [COLAMD_DENSE_COL] * n_row, n_row)) ;\n    DEBUG1 ((\"colamd: densecount: %d %d\\n\", dense_row_count, dense_col_count)) ;\n    max_deg = 0 ;\n    n_col2 = n_col ;\n    n_row2 = n_row ;\n\n    /* === Kill empty columns =============================================== */\n\n    /* Put the empty columns at the end in their natural order, so that LU */\n    /* factorization can proceed as far as possible. */\n    for (c = n_col-1 ; c >= 0 ; c--)\n    {\n\tdeg = Col [c].length ;\n\tif (deg == 0)\n\t{\n\t    /* this is a empty column, kill and order it last */\n\t    Col [c].shared2.order = --n_col2 ;\n\t    KILL_PRINCIPAL_COL (c) ;\n\t}\n    }\n    DEBUG1 ((\"colamd: null columns killed: %d\\n\", n_col - n_col2)) ;\n\n    /* === Kill dense columns =============================================== */\n\n    /* Put the dense columns at the end, in their natural order */\n    for (c = n_col-1 ; c >= 0 ; c--)\n    {\n\t/* skip any dead columns */\n\tif (COL_IS_DEAD (c))\n\t{\n\t    continue ;\n\t}\n\tdeg = Col [c].length ;\n\tif (deg > dense_col_count)\n\t{\n\t    /* this is a dense column, kill and order it last */\n\t    Col [c].shared2.order = --n_col2 ;\n\t    /* decrement the row degrees */\n\t    cp = &A [Col [c].start] ;\n\t    cp_end = cp + Col [c].length ;\n\t    while (cp < cp_end)\n\t    {\n\t\tRow [*cp++].shared1.degree-- ;\n\t    }\n\t    KILL_PRINCIPAL_COL (c) ;\n\t}\n    }\n    DEBUG1 ((\"colamd: Dense and null columns killed: %d\\n\", n_col - n_col2)) ;\n\n    /* === Kill dense and empty rows ======================================== */\n\n    for (r = 0 ; r < n_row ; r++)\n    {\n\tdeg = Row [r].shared1.degree ;\n\tASSERT (deg >= 0 && deg <= n_col) ;\n\tif (deg > dense_row_count || deg == 0)\n\t{\n\t    /* kill a dense or empty row */\n\t    KILL_ROW (r) ;\n\t    --n_row2 ;\n\t}\n\telse\n\t{\n\t    /* keep track of max degree of remaining rows */\n\t    max_deg = MAX (max_deg, deg) ;\n\t}\n    }\n    DEBUG1 ((\"colamd: Dense and null rows killed: %d\\n\", n_row - n_row2)) ;\n\n    /* === Compute initial column scores ==================================== */\n\n    /* At this point the row degrees are accurate.  They reflect the number */\n    /* of \"live\" (non-dense) columns in each row.  No empty rows exist. */\n    /* Some \"live\" columns may contain only dead rows, however.  These are */\n    /* pruned in the code below. */\n\n    /* now find the initial matlab score for each column */\n    for (c = n_col-1 ; c >= 0 ; c--)\n    {\n\t/* skip dead column */\n\tif (COL_IS_DEAD (c))\n\t{\n\t    continue ;\n\t}\n\tscore = 0 ;\n\tcp = &A [Col [c].start] ;\n\tnew_cp = cp ;\n\tcp_end = cp + Col [c].length ;\n\twhile (cp < cp_end)\n\t{\n\t    /* get a row */\n\t    row = *cp++ ;\n\t    /* skip if dead */\n\t    if (ROW_IS_DEAD (row))\n\t    {\n\t\tcontinue ;\n\t    }\n\t    /* compact the column */\n\t    *new_cp++ = row ;\n\t    /* add row's external degree */\n\t    score += Row [row].shared1.degree - 1 ;\n\t    /* guard against integer overflow */\n\t    score = MIN (score, n_col) ;\n\t}\n\t/* determine pruned column length */\n\tcol_length = (int) (new_cp - &A [Col [c].start]) ;\n\tif (col_length == 0)\n\t{\n\t    /* a newly-made null column (all rows in this col are \"dense\" */\n\t    /* and have already been killed) */\n\t    DEBUG2 ((\"Newly null killed: %d\\n\", c)) ;\n\t    Col [c].shared2.order = --n_col2 ;\n\t    KILL_PRINCIPAL_COL (c) ;\n\t}\n\telse\n\t{\n\t    /* set column length and set score */\n\t    ASSERT (score >= 0) ;\n\t    ASSERT (score <= n_col) ;\n\t    Col [c].length = col_length ;\n\t    Col [c].shared2.score = score ;\n\t}\n    }\n    DEBUG1 ((\"colamd: Dense, null, and newly-null columns killed: %d\\n\",\n    \tn_col-n_col2)) ;\n\n    /* At this point, all empty rows and columns are dead.  All live columns */\n    /* are \"clean\" (containing no dead rows) and simplicial (no supercolumns */\n    /* yet).  Rows may contain dead columns, but all live rows contain at */\n    /* least one live column. */\n\n#ifndef NDEBUG\n    debug_structures (n_row, n_col, Row, Col, A, n_col2) ;\n#endif /* NDEBUG */\n\n    /* === Initialize degree lists ========================================== */\n\n#ifndef NDEBUG\n    debug_count = 0 ;\n#endif /* NDEBUG */\n\n    /* clear the hash buckets */\n    for (c = 0 ; c <= n_col ; c++)\n    {\n\thead [c] = EMPTY ;\n    }\n    min_score = n_col ;\n    /* place in reverse order, so low column indices are at the front */\n    /* of the lists.  This is to encourage natural tie-breaking */\n    for (c = n_col-1 ; c >= 0 ; c--)\n    {\n\t/* only add principal columns to degree lists */\n\tif (COL_IS_ALIVE (c))\n\t{\n\t    DEBUG4 ((\"place %d score %d minscore %d ncol %d\\n\",\n\t\tc, Col [c].shared2.score, min_score, n_col)) ;\n\n\t    /* === Add columns score to DList =============================== */\n\n\t    score = Col [c].shared2.score ;\n\n\t    ASSERT (min_score >= 0) ;\n\t    ASSERT (min_score <= n_col) ;\n\t    ASSERT (score >= 0) ;\n\t    ASSERT (score <= n_col) ;\n\t    ASSERT (head [score] >= EMPTY) ;\n\n\t    /* now add this column to dList at proper score location */\n\t    next_col = head [score] ;\n\t    Col [c].shared3.prev = EMPTY ;\n\t    Col [c].shared4.degree_next = next_col ;\n\n\t    /* if there already was a column with the same score, set its */\n\t    /* previous pointer to this new column */\n\t    if (next_col != EMPTY)\n\t    {\n\t\tCol [next_col].shared3.prev = c ;\n\t    }\n\t    head [score] = c ;\n\n\t    /* see if this score is less than current min */\n\t    min_score = MIN (min_score, score) ;\n\n#ifndef NDEBUG\n\t    debug_count++ ;\n#endif /* NDEBUG */\n\n\t}\n    }\n\n#ifndef NDEBUG\n    DEBUG1 ((\"colamd: Live cols %d out of %d, non-princ: %d\\n\",\n\tdebug_count, n_col, n_col-debug_count)) ;\n    ASSERT (debug_count == n_col2) ;\n    debug_deg_lists (n_row, n_col, Row, Col, head, min_score, n_col2, max_deg) ;\n#endif /* NDEBUG */\n\n    /* === Return number of remaining columns, and max row degree =========== */\n\n    *p_n_col2 = n_col2 ;\n    *p_n_row2 = n_row2 ;\n    *p_max_deg = max_deg ;\n}\n\n\n/* ========================================================================== */\n/* === find_ordering ======================================================== */\n/* ========================================================================== */\n\n/*\n    Order the principal columns of the supercolumn form of the matrix\n    (no supercolumns on input).  Uses a minimum approximate column minimum\n    degree ordering method.  Not user-callable.\n*/\n\nPRIVATE int find_ordering\t/* return the number of garbage collections */\n(\n    /* === Parameters ======================================================= */\n\n    int n_row,\t\t\t/* number of rows of A */\n    int n_col,\t\t\t/* number of columns of A */\n    int Alen,\t\t\t/* size of A, 2*nnz + n_col or larger */\n    Colamd_Row Row [],\t\t/* of size n_row+1 */\n    Colamd_Col Col [],\t\t/* of size n_col+1 */\n    int A [],\t\t\t/* column form and row form of A */\n    int head [],\t\t/* of size n_col+1 */\n    int n_col2,\t\t\t/* Remaining columns to order */\n    int max_deg,\t\t/* Maximum row degree */\n    int pfree\t\t\t/* index of first free slot (2*nnz on entry) */\n)\n{\n    /* === Local variables ================================================== */\n\n    int k ;\t\t\t/* current pivot ordering step */\n    int pivot_col ;\t\t/* current pivot column */\n    int *cp ;\t\t\t/* a column pointer */\n    int *rp ;\t\t\t/* a row pointer */\n    int pivot_row ;\t\t/* current pivot row */\n    int *new_cp ;\t\t/* modified column pointer */\n    int *new_rp ;\t\t/* modified row pointer */\n    int pivot_row_start ;\t/* pointer to start of pivot row */\n    int pivot_row_degree ;\t/* number of columns in pivot row */\n    int pivot_row_length ;\t/* number of supercolumns in pivot row */\n    int pivot_col_score ;\t/* score of pivot column */\n    int needed_memory ;\t\t/* free space needed for pivot row */\n    int *cp_end ;\t\t/* pointer to the end of a column */\n    int *rp_end ;\t\t/* pointer to the end of a row */\n    int row ;\t\t\t/* a row index */\n    int col ;\t\t\t/* a column index */\n    int max_score ;\t\t/* maximum possible score */\n    int cur_score ;\t\t/* score of current column */\n    unsigned int hash ;\t\t/* hash value for supernode detection */\n    int head_column ;\t\t/* head of hash bucket */\n    int first_col ;\t\t/* first column in hash bucket */\n    int tag_mark ;\t\t/* marker value for mark array */\n    int row_mark ;\t\t/* Row [row].shared2.mark */\n    int set_difference ;\t/* set difference size of row with pivot row */\n    int min_score ;\t\t/* smallest column score */\n    int col_thickness ;\t\t/* \"thickness\" (no. of columns in a supercol) */\n    int max_mark ;\t\t/* maximum value of tag_mark */\n    int pivot_col_thickness ;\t/* number of columns represented by pivot col */\n    int prev_col ;\t\t/* Used by Dlist operations. */\n    int next_col ;\t\t/* Used by Dlist operations. */\n    int ngarbage ;\t\t/* number of garbage collections performed */\n\n#ifndef NDEBUG\n    int debug_d ;\t\t/* debug loop counter */\n    int debug_step = 0 ;\t/* debug loop counter */\n#endif /* NDEBUG */\n\n    /* === Initialization and clear mark ==================================== */\n\n    max_mark = INT_MAX - n_col ;\t/* INT_MAX defined in <limits.h> */\n    tag_mark = clear_mark (n_row, Row) ;\n    min_score = 0 ;\n    ngarbage = 0 ;\n    DEBUG1 ((\"colamd: Ordering, n_col2=%d\\n\", n_col2)) ;\n\n    /* === Order the columns ================================================ */\n\n    for (k = 0 ; k < n_col2 ; /* 'k' is incremented below */)\n    {\n\n#ifndef NDEBUG\n\tif (debug_step % 100 == 0)\n\t{\n\t    DEBUG2 ((\"\\n...       Step k: %d out of n_col2: %d\\n\", k, n_col2)) ;\n\t}\n\telse\n\t{\n\t    DEBUG3 ((\"\\n----------Step k: %d out of n_col2: %d\\n\", k, n_col2)) ;\n\t}\n\tdebug_step++ ;\n\tdebug_deg_lists (n_row, n_col, Row, Col, head,\n\t\tmin_score, n_col2-k, max_deg) ;\n\tdebug_matrix (n_row, n_col, Row, Col, A) ;\n#endif /* NDEBUG */\n\n\t/* === Select pivot column, and order it ============================ */\n\n\t/* make sure degree list isn't empty */\n\tASSERT (min_score >= 0) ;\n\tASSERT (min_score <= n_col) ;\n\tASSERT (head [min_score] >= EMPTY) ;\n\n#ifndef NDEBUG\n\tfor (debug_d = 0 ; debug_d < min_score ; debug_d++)\n\t{\n\t    ASSERT (head [debug_d] == EMPTY) ;\n\t}\n#endif /* NDEBUG */\n\n\t/* get pivot column from head of minimum degree list */\n\twhile (head [min_score] == EMPTY && min_score < n_col)\n\t{\n\t    min_score++ ;\n\t}\n\tpivot_col = head [min_score] ;\n\tASSERT (pivot_col >= 0 && pivot_col <= n_col) ;\n\tnext_col = Col [pivot_col].shared4.degree_next ;\n\thead [min_score] = next_col ;\n\tif (next_col != EMPTY)\n\t{\n\t    Col [next_col].shared3.prev = EMPTY ;\n\t}\n\n\tASSERT (COL_IS_ALIVE (pivot_col)) ;\n\tDEBUG3 ((\"Pivot col: %d\\n\", pivot_col)) ;\n\n\t/* remember score for defrag check */\n\tpivot_col_score = Col [pivot_col].shared2.score ;\n\n\t/* the pivot column is the kth column in the pivot order */\n\tCol [pivot_col].shared2.order = k ;\n\n\t/* increment order count by column thickness */\n\tpivot_col_thickness = Col [pivot_col].shared1.thickness ;\n\tk += pivot_col_thickness ;\n\tASSERT (pivot_col_thickness > 0) ;\n\n\t/* === Garbage_collection, if necessary ============================= */\n\n\tneeded_memory = MIN (pivot_col_score, n_col - k) ;\n\tif (pfree + needed_memory >= Alen)\n\t{\n\t    pfree = garbage_collection (n_row, n_col, Row, Col, A, &A [pfree]) ;\n\t    ngarbage++ ;\n\t    /* after garbage collection we will have enough */\n\t    ASSERT (pfree + needed_memory < Alen) ;\n\t    /* garbage collection has wiped out the Row[].shared2.mark array */\n\t    tag_mark = clear_mark (n_row, Row) ;\n\n#ifndef NDEBUG\n\t    debug_matrix (n_row, n_col, Row, Col, A) ;\n#endif /* NDEBUG */\n\t}\n\n\t/* === Compute pivot row pattern ==================================== */\n\n\t/* get starting location for this new merged row */\n\tpivot_row_start = pfree ;\n\n\t/* initialize new row counts to zero */\n\tpivot_row_degree = 0 ;\n\n\t/* tag pivot column as having been visited so it isn't included */\n\t/* in merged pivot row */\n\tCol [pivot_col].shared1.thickness = -pivot_col_thickness ;\n\n\t/* pivot row is the union of all rows in the pivot column pattern */\n\tcp = &A [Col [pivot_col].start] ;\n\tcp_end = cp + Col [pivot_col].length ;\n\twhile (cp < cp_end)\n\t{\n\t    /* get a row */\n\t    row = *cp++ ;\n\t    DEBUG4 ((\"Pivot col pattern %d %d\\n\", ROW_IS_ALIVE (row), row)) ;\n\t    /* skip if row is dead */\n\t    if (ROW_IS_DEAD (row))\n\t    {\n\t\tcontinue ;\n\t    }\n\t    rp = &A [Row [row].start] ;\n\t    rp_end = rp + Row [row].length ;\n\t    while (rp < rp_end)\n\t    {\n\t\t/* get a column */\n\t\tcol = *rp++ ;\n\t\t/* add the column, if alive and untagged */\n\t\tcol_thickness = Col [col].shared1.thickness ;\n\t\tif (col_thickness > 0 && COL_IS_ALIVE (col))\n\t\t{\n\t\t    /* tag column in pivot row */\n\t\t    Col [col].shared1.thickness = -col_thickness ;\n\t\t    ASSERT (pfree < Alen) ;\n\t\t    /* place column in pivot row */\n\t\t    A [pfree++] = col ;\n\t\t    pivot_row_degree += col_thickness ;\n\t\t}\n\t    }\n\t}\n\n\t/* clear tag on pivot column */\n\tCol [pivot_col].shared1.thickness = pivot_col_thickness ;\n\tmax_deg = MAX (max_deg, pivot_row_degree) ;\n\n#ifndef NDEBUG\n\tDEBUG3 ((\"check2\\n\")) ;\n\tdebug_mark (n_row, Row, tag_mark, max_mark) ;\n#endif /* NDEBUG */\n\n\t/* === Kill all rows used to construct pivot row ==================== */\n\n\t/* also kill pivot row, temporarily */\n\tcp = &A [Col [pivot_col].start] ;\n\tcp_end = cp + Col [pivot_col].length ;\n\twhile (cp < cp_end)\n\t{\n\t    /* may be killing an already dead row */\n\t    row = *cp++ ;\n\t    DEBUG3 ((\"Kill row in pivot col: %d\\n\", row)) ;\n\t    KILL_ROW (row) ;\n\t}\n\n\t/* === Select a row index to use as the new pivot row =============== */\n\n\tpivot_row_length = pfree - pivot_row_start ;\n\tif (pivot_row_length > 0)\n\t{\n\t    /* pick the \"pivot\" row arbitrarily (first row in col) */\n\t    pivot_row = A [Col [pivot_col].start] ;\n\t    DEBUG3 ((\"Pivotal row is %d\\n\", pivot_row)) ;\n\t}\n\telse\n\t{\n\t    /* there is no pivot row, since it is of zero length */\n\t    pivot_row = EMPTY ;\n\t    ASSERT (pivot_row_length == 0) ;\n\t}\n\tASSERT (Col [pivot_col].length > 0 || pivot_row_length == 0) ;\n\n\t/* === Approximate degree computation =============================== */\n\n\t/* Here begins the computation of the approximate degree.  The column */\n\t/* score is the sum of the pivot row \"length\", plus the size of the */\n\t/* set differences of each row in the column minus the pattern of the */\n\t/* pivot row itself.  The column (\"thickness\") itself is also */\n\t/* excluded from the column score (we thus use an approximate */\n\t/* external degree). */\n\n\t/* The time taken by the following code (compute set differences, and */\n\t/* add them up) is proportional to the size of the data structure */\n\t/* being scanned - that is, the sum of the sizes of each column in */\n\t/* the pivot row.  Thus, the amortized time to compute a column score */\n\t/* is proportional to the size of that column (where size, in this */\n\t/* context, is the column \"length\", or the number of row indices */\n\t/* in that column).  The number of row indices in a column is */\n\t/* monotonically non-decreasing, from the length of the original */\n\t/* column on input to colamd. */\n\n\t/* === Compute set differences ====================================== */\n\n\tDEBUG3 ((\"** Computing set differences phase. **\\n\")) ;\n\n\t/* pivot row is currently dead - it will be revived later. */\n\n\tDEBUG3 ((\"Pivot row: \")) ;\n\t/* for each column in pivot row */\n\trp = &A [pivot_row_start] ;\n\trp_end = rp + pivot_row_length ;\n\twhile (rp < rp_end)\n\t{\n\t    col = *rp++ ;\n\t    ASSERT (COL_IS_ALIVE (col) && col != pivot_col) ;\n\t    DEBUG3 ((\"Col: %d\\n\", col)) ;\n\n\t    /* clear tags used to construct pivot row pattern */\n\t    col_thickness = -Col [col].shared1.thickness ;\n\t    ASSERT (col_thickness > 0) ;\n\t    Col [col].shared1.thickness = col_thickness ;\n\n\t    /* === Remove column from degree list =========================== */\n\n\t    cur_score = Col [col].shared2.score ;\n\t    prev_col = Col [col].shared3.prev ;\n\t    next_col = Col [col].shared4.degree_next ;\n\t    ASSERT (cur_score >= 0) ;\n\t    ASSERT (cur_score <= n_col) ;\n\t    ASSERT (cur_score >= EMPTY) ;\n\t    if (prev_col == EMPTY)\n\t    {\n\t\thead [cur_score] = next_col ;\n\t    }\n\t    else\n\t    {\n\t\tCol [prev_col].shared4.degree_next = next_col ;\n\t    }\n\t    if (next_col != EMPTY)\n\t    {\n\t\tCol [next_col].shared3.prev = prev_col ;\n\t    }\n\n\t    /* === Scan the column ========================================== */\n\n\t    cp = &A [Col [col].start] ;\n\t    cp_end = cp + Col [col].length ;\n\t    while (cp < cp_end)\n\t    {\n\t\t/* get a row */\n\t\trow = *cp++ ;\n\t\trow_mark = Row [row].shared2.mark ;\n\t\t/* skip if dead */\n\t\tif (ROW_IS_MARKED_DEAD (row_mark))\n\t\t{\n\t\t    continue ;\n\t\t}\n\t\tASSERT (row != pivot_row) ;\n\t\tset_difference = row_mark - tag_mark ;\n\t\t/* check if the row has been seen yet */\n\t\tif (set_difference < 0)\n\t\t{\n\t\t    ASSERT (Row [row].shared1.degree <= max_deg) ;\n\t\t    set_difference = Row [row].shared1.degree ;\n\t\t}\n\t\t/* subtract column thickness from this row's set difference */\n\t\tset_difference -= col_thickness ;\n\t\tASSERT (set_difference >= 0) ;\n\t\t/* absorb this row if the set difference becomes zero */\n\t\tif (set_difference == 0)\n\t\t{\n\t\t    DEBUG3 ((\"aggressive absorption. Row: %d\\n\", row)) ;\n\t\t    KILL_ROW (row) ;\n\t\t}\n\t\telse\n\t\t{\n\t\t    /* save the new mark */\n\t\t    Row [row].shared2.mark = set_difference + tag_mark ;\n\t\t}\n\t    }\n\t}\n\n#ifndef NDEBUG\n\tdebug_deg_lists (n_row, n_col, Row, Col, head,\n\t\tmin_score, n_col2-k-pivot_row_degree, max_deg) ;\n#endif /* NDEBUG */\n\n\t/* === Add up set differences for each column ======================= */\n\n\tDEBUG3 ((\"** Adding set differences phase. **\\n\")) ;\n\n\t/* for each column in pivot row */\n\trp = &A [pivot_row_start] ;\n\trp_end = rp + pivot_row_length ;\n\twhile (rp < rp_end)\n\t{\n\t    /* get a column */\n\t    col = *rp++ ;\n\t    ASSERT (COL_IS_ALIVE (col) && col != pivot_col) ;\n\t    hash = 0 ;\n\t    cur_score = 0 ;\n\t    cp = &A [Col [col].start] ;\n\t    /* compact the column */\n\t    new_cp = cp ;\n\t    cp_end = cp + Col [col].length ;\n\n\t    DEBUG4 ((\"Adding set diffs for Col: %d.\\n\", col)) ;\n\n\t    while (cp < cp_end)\n\t    {\n\t\t/* get a row */\n\t\trow = *cp++ ;\n\t\tASSERT(row >= 0 && row < n_row) ;\n\t\trow_mark = Row [row].shared2.mark ;\n\t\t/* skip if dead */\n\t\tif (ROW_IS_MARKED_DEAD (row_mark))\n\t\t{\n\t\t    continue ;\n\t\t}\n\t\tASSERT (row_mark > tag_mark) ;\n\t\t/* compact the column */\n\t\t*new_cp++ = row ;\n\t\t/* compute hash function */\n\t\thash += row ;\n\t\t/* add set difference */\n\t\tcur_score += row_mark - tag_mark ;\n\t\t/* integer overflow... */\n\t\tcur_score = MIN (cur_score, n_col) ;\n\t    }\n\n\t    /* recompute the column's length */\n\t    Col [col].length = (int) (new_cp - &A [Col [col].start]) ;\n\n\t    /* === Further mass elimination ================================= */\n\n\t    if (Col [col].length == 0)\n\t    {\n\t\tDEBUG4 ((\"further mass elimination. Col: %d\\n\", col)) ;\n\t\t/* nothing left but the pivot row in this column */\n\t\tKILL_PRINCIPAL_COL (col) ;\n\t\tpivot_row_degree -= Col [col].shared1.thickness ;\n\t\tASSERT (pivot_row_degree >= 0) ;\n\t\t/* order it */\n\t\tCol [col].shared2.order = k ;\n\t\t/* increment order count by column thickness */\n\t\tk += Col [col].shared1.thickness ;\n\t    }\n\t    else\n\t    {\n\t\t/* === Prepare for supercolumn detection ==================== */\n\n\t\tDEBUG4 ((\"Preparing supercol detection for Col: %d.\\n\", col)) ;\n\n\t\t/* save score so far */\n\t\tCol [col].shared2.score = cur_score ;\n\n\t\t/* add column to hash table, for supercolumn detection */\n\t\thash %= n_col + 1 ;\n\n\t\tDEBUG4 ((\" Hash = %d, n_col = %d.\\n\", hash, n_col)) ;\n\t\tASSERT (hash <= n_col) ;\n\n\t\thead_column = head [hash] ;\n\t\tif (head_column > EMPTY)\n\t\t{\n\t\t    /* degree list \"hash\" is non-empty, use prev (shared3) of */\n\t\t    /* first column in degree list as head of hash bucket */\n\t\t    first_col = Col [head_column].shared3.headhash ;\n\t\t    Col [head_column].shared3.headhash = col ;\n\t\t}\n\t\telse\n\t\t{\n\t\t    /* degree list \"hash\" is empty, use head as hash bucket */\n\t\t    first_col = - (head_column + 2) ;\n\t\t    head [hash] = - (col + 2) ;\n\t\t}\n\t\tCol [col].shared4.hash_next = first_col ;\n\n\t\t/* save hash function in Col [col].shared3.hash */\n\t\tCol [col].shared3.hash = (int) hash ;\n\t\tASSERT (COL_IS_ALIVE (col)) ;\n\t    }\n\t}\n\n\t/* The approximate external column degree is now computed.  */\n\n\t/* === Supercolumn detection ======================================== */\n\n\tDEBUG3 ((\"** Supercolumn detection phase. **\\n\")) ;\n\n\tdetect_super_cols (\n\n#ifndef NDEBUG\n\t\tn_col, Row,\n#endif /* NDEBUG */\n\n\t\tCol, A, head, pivot_row_start, pivot_row_length) ;\n\n\t/* === Kill the pivotal column ====================================== */\n\n\tKILL_PRINCIPAL_COL (pivot_col) ;\n\n\t/* === Clear mark =================================================== */\n\n\ttag_mark += (max_deg + 1) ;\n\tif (tag_mark >= max_mark)\n\t{\n\t    DEBUG2 ((\"clearing tag_mark\\n\")) ;\n\t    tag_mark = clear_mark (n_row, Row) ;\n\t}\n\n#ifndef NDEBUG\n\tDEBUG3 ((\"check3\\n\")) ;\n\tdebug_mark (n_row, Row, tag_mark, max_mark) ;\n#endif /* NDEBUG */\n\n\t/* === Finalize the new pivot row, and column scores ================ */\n\n\tDEBUG3 ((\"** Finalize scores phase. **\\n\")) ;\n\n\t/* for each column in pivot row */\n\trp = &A [pivot_row_start] ;\n\t/* compact the pivot row */\n\tnew_rp = rp ;\n\trp_end = rp + pivot_row_length ;\n\twhile (rp < rp_end)\n\t{\n\t    col = *rp++ ;\n\t    /* skip dead columns */\n\t    if (COL_IS_DEAD (col))\n\t    {\n\t\tcontinue ;\n\t    }\n\t    *new_rp++ = col ;\n\t    /* add new pivot row to column */\n\t    A [Col [col].start + (Col [col].length++)] = pivot_row ;\n\n\t    /* retrieve score so far and add on pivot row's degree. */\n\t    /* (we wait until here for this in case the pivot */\n\t    /* row's degree was reduced due to mass elimination). */\n\t    cur_score = Col [col].shared2.score + pivot_row_degree ;\n\n\t    /* calculate the max possible score as the number of */\n\t    /* external columns minus the 'k' value minus the */\n\t    /* columns thickness */\n\t    max_score = n_col - k - Col [col].shared1.thickness ;\n\n\t    /* make the score the external degree of the union-of-rows */\n\t    cur_score -= Col [col].shared1.thickness ;\n\n\t    /* make sure score is less or equal than the max score */\n\t    cur_score = MIN (cur_score, max_score) ;\n\t    ASSERT (cur_score >= 0) ;\n\n\t    /* store updated score */\n\t    Col [col].shared2.score = cur_score ;\n\n\t    /* === Place column back in degree list ========================= */\n\n\t    ASSERT (min_score >= 0) ;\n\t    ASSERT (min_score <= n_col) ;\n\t    ASSERT (cur_score >= 0) ;\n\t    ASSERT (cur_score <= n_col) ;\n\t    ASSERT (head [cur_score] >= EMPTY) ;\n\t    next_col = head [cur_score] ;\n\t    Col [col].shared4.degree_next = next_col ;\n\t    Col [col].shared3.prev = EMPTY ;\n\t    if (next_col != EMPTY)\n\t    {\n\t\tCol [next_col].shared3.prev = col ;\n\t    }\n\t    head [cur_score] = col ;\n\n\t    /* see if this score is less than current min */\n\t    min_score = MIN (min_score, cur_score) ;\n\n\t}\n\n#ifndef NDEBUG\n\tdebug_deg_lists (n_row, n_col, Row, Col, head,\n\t\tmin_score, n_col2-k, max_deg) ;\n#endif /* NDEBUG */\n\n\t/* === Resurrect the new pivot row ================================== */\n\n\tif (pivot_row_degree > 0)\n\t{\n\t    /* update pivot row length to reflect any cols that were killed */\n\t    /* during super-col detection and mass elimination */\n\t    Row [pivot_row].start  = pivot_row_start ;\n\t    Row [pivot_row].length = (int) (new_rp - &A[pivot_row_start]) ;\n\t    Row [pivot_row].shared1.degree = pivot_row_degree ;\n\t    Row [pivot_row].shared2.mark = 0 ;\n\t    /* pivot row is no longer dead */\n\t}\n    }\n\n    /* === All principal columns have now been ordered ====================== */\n\n    return (ngarbage) ;\n}\n\n\n/* ========================================================================== */\n/* === order_children ======================================================= */\n/* ========================================================================== */\n\n/*\n    The find_ordering routine has ordered all of the principal columns (the\n    representatives of the supercolumns).  The non-principal columns have not\n    yet been ordered.  This routine orders those columns by walking up the\n    parent tree (a column is a child of the column which absorbed it).  The\n    final permutation vector is then placed in p [0 ... n_col-1], with p [0]\n    being the first column, and p [n_col-1] being the last.  It doesn't look\n    like it at first glance, but be assured that this routine takes time linear\n    in the number of columns.  Although not immediately obvious, the time\n    taken by this routine is O (n_col), that is, linear in the number of\n    columns.  Not user-callable.\n*/\n\nPRIVATE void order_children\n(\n    /* === Parameters ======================================================= */\n\n    int n_col,\t\t\t/* number of columns of A */\n    Colamd_Col Col [],\t\t/* of size n_col+1 */\n    int p []\t\t\t/* p [0 ... n_col-1] is the column permutation*/\n)\n{\n    /* === Local variables ================================================== */\n\n    int i ;\t\t\t/* loop counter for all columns */\n    int c ;\t\t\t/* column index */\n    int parent ;\t\t/* index of column's parent */\n    int order ;\t\t\t/* column's order */\n\n    /* === Order each non-principal column ================================== */\n\n    for (i = 0 ; i < n_col ; i++)\n    {\n\t/* find an un-ordered non-principal column */\n\tASSERT (COL_IS_DEAD (i)) ;\n\tif (!COL_IS_DEAD_PRINCIPAL (i) && Col [i].shared2.order == EMPTY)\n\t{\n\t    parent = i ;\n\t    /* once found, find its principal parent */\n\t    do\n\t    {\n\t\tparent = Col [parent].shared1.parent ;\n\t    } while (!COL_IS_DEAD_PRINCIPAL (parent)) ;\n\n\t    /* now, order all un-ordered non-principal columns along path */\n\t    /* to this parent.  collapse tree at the same time */\n\t    c = i ;\n\t    /* get order of parent */\n\t    order = Col [parent].shared2.order ;\n\n\t    do\n\t    {\n\t\tASSERT (Col [c].shared2.order == EMPTY) ;\n\n\t\t/* order this column */\n\t\tCol [c].shared2.order = order++ ;\n\t\t/* collaps tree */\n\t\tCol [c].shared1.parent = parent ;\n\n\t\t/* get immediate parent of this column */\n\t\tc = Col [c].shared1.parent ;\n\n\t\t/* continue until we hit an ordered column.  There are */\n\t\t/* guarranteed not to be anymore unordered columns */\n\t\t/* above an ordered column */\n\t    } while (Col [c].shared2.order == EMPTY) ;\n\n\t    /* re-order the super_col parent to largest order for this group */\n\t    Col [parent].shared2.order = order ;\n\t}\n    }\n\n    /* === Generate the permutation ========================================= */\n\n    for (c = 0 ; c < n_col ; c++)\n    {\n\tp [Col [c].shared2.order] = c ;\n    }\n}\n\n\n/* ========================================================================== */\n/* === detect_super_cols ==================================================== */\n/* ========================================================================== */\n\n/*\n    Detects supercolumns by finding matches between columns in the hash buckets.\n    Check amongst columns in the set A [row_start ... row_start + row_length-1].\n    The columns under consideration are currently *not* in the degree lists,\n    and have already been placed in the hash buckets.\n\n    The hash bucket for columns whose hash function is equal to h is stored\n    as follows:\n\n\tif head [h] is >= 0, then head [h] contains a degree list, so:\n\n\t\thead [h] is the first column in degree bucket h.\n\t\tCol [head [h]].headhash gives the first column in hash bucket h.\n\n\totherwise, the degree list is empty, and:\n\n\t\t-(head [h] + 2) is the first column in hash bucket h.\n\n    For a column c in a hash bucket, Col [c].shared3.prev is NOT a \"previous\n    column\" pointer.  Col [c].shared3.hash is used instead as the hash number\n    for that column.  The value of Col [c].shared4.hash_next is the next column\n    in the same hash bucket.\n\n    Assuming no, or \"few\" hash collisions, the time taken by this routine is\n    linear in the sum of the sizes (lengths) of each column whose score has\n    just been computed in the approximate degree computation.\n    Not user-callable.\n*/\n\nPRIVATE void detect_super_cols\n(\n    /* === Parameters ======================================================= */\n\n#ifndef NDEBUG\n    /* these two parameters are only needed when debugging is enabled: */\n    int n_col,\t\t\t/* number of columns of A */\n    Colamd_Row Row [],\t\t/* of size n_row+1 */\n#endif /* NDEBUG */\n\n    Colamd_Col Col [],\t\t/* of size n_col+1 */\n    int A [],\t\t\t/* row indices of A */\n    int head [],\t\t/* head of degree lists and hash buckets */\n    int row_start,\t\t/* pointer to set of columns to check */\n    int row_length\t\t/* number of columns to check */\n)\n{\n    /* === Local variables ================================================== */\n\n    int hash ;\t\t\t/* hash value for a column */\n    int *rp ;\t\t\t/* pointer to a row */\n    int c ;\t\t\t/* a column index */\n    int super_c ;\t\t/* column index of the column to absorb into */\n    int *cp1 ;\t\t\t/* column pointer for column super_c */\n    int *cp2 ;\t\t\t/* column pointer for column c */\n    int length ;\t\t/* length of column super_c */\n    int prev_c ;\t\t/* column preceding c in hash bucket */\n    int i ;\t\t\t/* loop counter */\n    int *rp_end ;\t\t/* pointer to the end of the row */\n    int col ;\t\t\t/* a column index in the row to check */\n    int head_column ;\t\t/* first column in hash bucket or degree list */\n    int first_col ;\t\t/* first column in hash bucket */\n\n    /* === Consider each column in the row ================================== */\n\n    rp = &A [row_start] ;\n    rp_end = rp + row_length ;\n    while (rp < rp_end)\n    {\n\tcol = *rp++ ;\n\tif (COL_IS_DEAD (col))\n\t{\n\t    continue ;\n\t}\n\n\t/* get hash number for this column */\n\thash = Col [col].shared3.hash ;\n\tASSERT (hash <= n_col) ;\n\n\t/* === Get the first column in this hash bucket ===================== */\n\n\thead_column = head [hash] ;\n\tif (head_column > EMPTY)\n\t{\n\t    first_col = Col [head_column].shared3.headhash ;\n\t}\n\telse\n\t{\n\t    first_col = - (head_column + 2) ;\n\t}\n\n\t/* === Consider each column in the hash bucket ====================== */\n\n\tfor (super_c = first_col ; super_c != EMPTY ;\n\t    super_c = Col [super_c].shared4.hash_next)\n\t{\n\t    ASSERT (COL_IS_ALIVE (super_c)) ;\n\t    ASSERT (Col [super_c].shared3.hash == hash) ;\n\t    length = Col [super_c].length ;\n\n\t    /* prev_c is the column preceding column c in the hash bucket */\n\t    prev_c = super_c ;\n\n\t    /* === Compare super_c with all columns after it ================ */\n\n\t    for (c = Col [super_c].shared4.hash_next ;\n\t\t c != EMPTY ; c = Col [c].shared4.hash_next)\n\t    {\n\t\tASSERT (c != super_c) ;\n\t\tASSERT (COL_IS_ALIVE (c)) ;\n\t\tASSERT (Col [c].shared3.hash == hash) ;\n\n\t\t/* not identical if lengths or scores are different */\n\t\tif (Col [c].length != length ||\n\t\t    Col [c].shared2.score != Col [super_c].shared2.score)\n\t\t{\n\t\t    prev_c = c ;\n\t\t    continue ;\n\t\t}\n\n\t\t/* compare the two columns */\n\t\tcp1 = &A [Col [super_c].start] ;\n\t\tcp2 = &A [Col [c].start] ;\n\n\t\tfor (i = 0 ; i < length ; i++)\n\t\t{\n\t\t    /* the columns are \"clean\" (no dead rows) */\n\t\t    ASSERT (ROW_IS_ALIVE (*cp1))  ;\n\t\t    ASSERT (ROW_IS_ALIVE (*cp2))  ;\n\t\t    /* row indices will same order for both supercols, */\n\t\t    /* no gather scatter nessasary */\n\t\t    if (*cp1++ != *cp2++)\n\t\t    {\n\t\t\tbreak ;\n\t\t    }\n\t\t}\n\n\t\t/* the two columns are different if the for-loop \"broke\" */\n\t\tif (i != length)\n\t\t{\n\t\t    prev_c = c ;\n\t\t    continue ;\n\t\t}\n\n\t\t/* === Got it!  two columns are identical =================== */\n\n\t\tASSERT (Col [c].shared2.score == Col [super_c].shared2.score) ;\n\n\t\tCol [super_c].shared1.thickness += Col [c].shared1.thickness ;\n\t\tCol [c].shared1.parent = super_c ;\n\t\tKILL_NON_PRINCIPAL_COL (c) ;\n\t\t/* order c later, in order_children() */\n\t\tCol [c].shared2.order = EMPTY ;\n\t\t/* remove c from hash bucket */\n\t\tCol [prev_c].shared4.hash_next = Col [c].shared4.hash_next ;\n\t    }\n\t}\n\n\t/* === Empty this hash bucket ======================================= */\n\n\tif (head_column > EMPTY)\n\t{\n\t    /* corresponding degree list \"hash\" is not empty */\n\t    Col [head_column].shared3.headhash = EMPTY ;\n\t}\n\telse\n\t{\n\t    /* corresponding degree list \"hash\" is empty */\n\t    head [hash] = EMPTY ;\n\t}\n    }\n}\n\n\n/* ========================================================================== */\n/* === garbage_collection =================================================== */\n/* ========================================================================== */\n\n/*\n    Defragments and compacts columns and rows in the workspace A.  Used when\n    all avaliable memory has been used while performing row merging.  Returns\n    the index of the first free position in A, after garbage collection.  The\n    time taken by this routine is linear is the size of the array A, which is\n    itself linear in the number of nonzeros in the input matrix.\n    Not user-callable.\n*/\n\nPRIVATE int garbage_collection  /* returns the new value of pfree */\n(\n    /* === Parameters ======================================================= */\n\n    int n_row,\t\t\t/* number of rows */\n    int n_col,\t\t\t/* number of columns */\n    Colamd_Row Row [],\t\t/* row info */\n    Colamd_Col Col [],\t\t/* column info */\n    int A [],\t\t\t/* A [0 ... Alen-1] holds the matrix */\n    int *pfree\t\t\t/* &A [0] ... pfree is in use */\n)\n{\n    /* === Local variables ================================================== */\n\n    int *psrc ;\t\t\t/* source pointer */\n    int *pdest ;\t\t/* destination pointer */\n    int j ;\t\t\t/* counter */\n    int r ;\t\t\t/* a row index */\n    int c ;\t\t\t/* a column index */\n    int length ;\t\t/* length of a row or column */\n\n#ifndef NDEBUG\n    int debug_rows ;\n    DEBUG2 ((\"Defrag..\\n\")) ;\n    for (psrc = &A[0] ; psrc < pfree ; psrc++) ASSERT (*psrc >= 0) ;\n    debug_rows = 0 ;\n#endif /* NDEBUG */\n\n    /* === Defragment the columns =========================================== */\n\n    pdest = &A[0] ;\n    for (c = 0 ; c < n_col ; c++)\n    {\n\tif (COL_IS_ALIVE (c))\n\t{\n\t    psrc = &A [Col [c].start] ;\n\n\t    /* move and compact the column */\n\t    ASSERT (pdest <= psrc) ;\n\t    Col [c].start = (int) (pdest - &A [0]) ;\n\t    length = Col [c].length ;\n\t    for (j = 0 ; j < length ; j++)\n\t    {\n\t\tr = *psrc++ ;\n\t\tif (ROW_IS_ALIVE (r))\n\t\t{\n\t\t    *pdest++ = r ;\n\t\t}\n\t    }\n\t    Col [c].length = (int) (pdest - &A [Col [c].start]) ;\n\t}\n    }\n\n    /* === Prepare to defragment the rows =================================== */\n\n    for (r = 0 ; r < n_row ; r++)\n    {\n\tif (ROW_IS_ALIVE (r))\n\t{\n\t    if (Row [r].length == 0)\n\t    {\n\t\t/* this row is of zero length.  cannot compact it, so kill it */\n\t\tDEBUG3 ((\"Defrag row kill\\n\")) ;\n\t\tKILL_ROW (r) ;\n\t    }\n\t    else\n\t    {\n\t\t/* save first column index in Row [r].shared2.first_column */\n\t\tpsrc = &A [Row [r].start] ;\n\t\tRow [r].shared2.first_column = *psrc ;\n\t\tASSERT (ROW_IS_ALIVE (r)) ;\n\t\t/* flag the start of the row with the one's complement of row */\n\t\t*psrc = ONES_COMPLEMENT (r) ;\n\n#ifndef NDEBUG\n\t\tdebug_rows++ ;\n#endif /* NDEBUG */\n\n\t    }\n\t}\n    }\n\n    /* === Defragment the rows ============================================== */\n\n    psrc = pdest ;\n    while (psrc < pfree)\n    {\n\t/* find a negative number ... the start of a row */\n\tif (*psrc++ < 0)\n\t{\n\t    psrc-- ;\n\t    /* get the row index */\n\t    r = ONES_COMPLEMENT (*psrc) ;\n\t    ASSERT (r >= 0 && r < n_row) ;\n\t    /* restore first column index */\n\t    *psrc = Row [r].shared2.first_column ;\n\t    ASSERT (ROW_IS_ALIVE (r)) ;\n\n\t    /* move and compact the row */\n\t    ASSERT (pdest <= psrc) ;\n\t    Row [r].start = (int) (pdest - &A [0]) ;\n\t    length = Row [r].length ;\n\t    for (j = 0 ; j < length ; j++)\n\t    {\n\t\tc = *psrc++ ;\n\t\tif (COL_IS_ALIVE (c))\n\t\t{\n\t\t    *pdest++ = c ;\n\t\t}\n\t    }\n\t    Row [r].length = (int) (pdest - &A [Row [r].start]) ;\n\n#ifndef NDEBUG\n\t    debug_rows-- ;\n#endif /* NDEBUG */\n\n\t}\n    }\n    /* ensure we found all the rows */\n    ASSERT (debug_rows == 0) ;\n\n    /* === Return the new value of pfree ==================================== */\n\n    return ((int) (pdest - &A [0])) ;\n}\n\n\n/* ========================================================================== */\n/* === clear_mark =========================================================== */\n/* ========================================================================== */\n\n/*\n    Clears the Row [].shared2.mark array, and returns the new tag_mark.\n    Return value is the new tag_mark.  Not user-callable.\n*/\n\nPRIVATE int clear_mark\t/* return the new value for tag_mark */\n(\n    /* === Parameters ======================================================= */\n\n    int n_row,\t\t/* number of rows in A */\n    Colamd_Row Row []\t/* Row [0 ... n_row-1].shared2.mark is set to zero */\n)\n{\n    /* === Local variables ================================================== */\n\n    int r ;\n\n    for (r = 0 ; r < n_row ; r++)\n    {\n\tif (ROW_IS_ALIVE (r))\n\t{\n\t    Row [r].shared2.mark = 0 ;\n\t}\n    }\n    return (1) ;\n}\n\n\n/* ========================================================================== */\n/* === print_report ========================================================= */\n/* ========================================================================== */\n\nPRIVATE void print_report\n(\n    char *method,\n    int stats [COLAMD_STATS]\n)\n{\n\n    int i1, i2, i3 ;\n\n    if (!stats)\n    {\n    \tPRINTF (\"%s: No statistics available.\\n\", method) ;\n\treturn ;\n    }\n\n    i1 = stats [COLAMD_INFO1] ;\n    i2 = stats [COLAMD_INFO2] ;\n    i3 = stats [COLAMD_INFO3] ;\n\n    if (stats [COLAMD_STATUS] >= 0)\n    {\n    \tPRINTF (\"%s: OK.  \", method) ;\n    }\n    else\n    {\n    \tPRINTF (\"%s: ERROR.  \", method) ;\n    }\n\n    switch (stats [COLAMD_STATUS])\n    {\n\n\tcase COLAMD_OK_BUT_JUMBLED:\n\n\t    PRINTF (\"Matrix has unsorted or duplicate row indices.\\n\") ;\n\n\t    PRINTF (\"%s: number of duplicate or out-of-order row indices: %d\\n\",\n\t    method, i3) ;\n\n\t    PRINTF (\"%s: last seen duplicate or out-of-order row index:   %d\\n\",\n\t    method, INDEX (i2)) ;\n\n\t    PRINTF (\"%s: last seen in column:                             %d\",\n\t    method, INDEX (i1)) ;\n\n\t    /* no break - fall through to next case instead */\n\n\tcase COLAMD_OK:\n\n\t    PRINTF (\"\\n\") ;\n\n \t    PRINTF (\"%s: number of dense or empty rows ignored:           %d\\n\",\n\t    method, stats [COLAMD_DENSE_ROW]) ;\n\n\t    PRINTF (\"%s: number of dense or empty columns ignored:        %d\\n\",\n\t    method, stats [COLAMD_DENSE_COL]) ;\n\n\t    PRINTF (\"%s: number of garbage collections performed:         %d\\n\",\n\t    method, stats [COLAMD_DEFRAG_COUNT]) ;\n\t    break ;\n\n\tcase COLAMD_ERROR_A_not_present:\n\n\t    PRINTF (\"Array A (row indices of matrix) not present.\\n\") ;\n\t    break ;\n\n\tcase COLAMD_ERROR_p_not_present:\n\n\t    PRINTF (\"Array p (column pointers for matrix) not present.\\n\") ;\n\t    break ;\n\n\tcase COLAMD_ERROR_nrow_negative:\n\n\t    PRINTF (\"Invalid number of rows (%d).\\n\", i1) ;\n\t    break ;\n\n\tcase COLAMD_ERROR_ncol_negative:\n\n\t    PRINTF (\"Invalid number of columns (%d).\\n\", i1) ;\n\t    break ;\n\n\tcase COLAMD_ERROR_nnz_negative:\n\n\t    PRINTF (\"Invalid number of nonzero entries (%d).\\n\", i1) ;\n\t    break ;\n\n\tcase COLAMD_ERROR_p0_nonzero:\n\n\t    PRINTF (\"Invalid column pointer, p [0] = %d, must be zero.\\n\", i1) ;\n\t    break ;\n\n\tcase COLAMD_ERROR_A_too_small:\n\n\t    PRINTF (\"Array A too small.\\n\") ;\n\t    PRINTF (\"        Need Alen >= %d, but given only Alen = %d.\\n\",\n\t    i1, i2) ;\n\t    break ;\n\n\tcase COLAMD_ERROR_col_length_negative:\n\n\t    PRINTF\n\t    (\"Column %d has a negative number of nonzero entries (%d).\\n\",\n\t    INDEX (i1), i2) ;\n\t    break ;\n\n\tcase COLAMD_ERROR_row_index_out_of_bounds:\n\n\t    PRINTF\n\t    (\"Row index (row %d) out of bounds (%d to %d) in column %d.\\n\",\n\t    INDEX (i2), INDEX (0), INDEX (i3-1), INDEX (i1)) ;\n\t    break ;\n\n\tcase COLAMD_ERROR_out_of_memory:\n\n\t    PRINTF (\"Out of memory.\\n\") ;\n\t    break ;\n\n\tcase COLAMD_ERROR_internal_error:\n\n\t    /* if this happens, there is a bug in the code */\n\t    PRINTF\n\t    (\"Internal error! Please contact authors (davis@cise.ufl.edu).\\n\") ;\n\t    break ;\n    }\n}\n\n\n\n\n/* ========================================================================== */\n/* === colamd debugging routines ============================================ */\n/* ========================================================================== */\n\n/* When debugging is disabled, the remainder of this file is ignored. */\n\n#ifndef NDEBUG\n\n\n/* ========================================================================== */\n/* === debug_structures ===================================================== */\n/* ========================================================================== */\n\n/*\n    At this point, all empty rows and columns are dead.  All live columns\n    are \"clean\" (containing no dead rows) and simplicial (no supercolumns\n    yet).  Rows may contain dead columns, but all live rows contain at\n    least one live column.\n*/\n\nPRIVATE void debug_structures\n(\n    /* === Parameters ======================================================= */\n\n    int n_row,\n    int n_col,\n    Colamd_Row Row [],\n    Colamd_Col Col [],\n    int A [],\n    int n_col2\n)\n{\n    /* === Local variables ================================================== */\n\n    int i ;\n    int c ;\n    int *cp ;\n    int *cp_end ;\n    int len ;\n    int score ;\n    int r ;\n    int *rp ;\n    int *rp_end ;\n    int deg ;\n\n    /* === Check A, Row, and Col ============================================ */\n\n    for (c = 0 ; c < n_col ; c++)\n    {\n\tif (COL_IS_ALIVE (c))\n\t{\n\t    len = Col [c].length ;\n\t    score = Col [c].shared2.score ;\n\t    DEBUG4 ((\"initial live col %5d %5d %5d\\n\", c, len, score)) ;\n\t    ASSERT (len > 0) ;\n\t    ASSERT (score >= 0) ;\n\t    ASSERT (Col [c].shared1.thickness == 1) ;\n\t    cp = &A [Col [c].start] ;\n\t    cp_end = cp + len ;\n\t    while (cp < cp_end)\n\t    {\n\t\tr = *cp++ ;\n\t\tASSERT (ROW_IS_ALIVE (r)) ;\n\t    }\n\t}\n\telse\n\t{\n\t    i = Col [c].shared2.order ;\n\t    ASSERT (i >= n_col2 && i < n_col) ;\n\t}\n    }\n\n    for (r = 0 ; r < n_row ; r++)\n    {\n\tif (ROW_IS_ALIVE (r))\n\t{\n\t    i = 0 ;\n\t    len = Row [r].length ;\n\t    deg = Row [r].shared1.degree ;\n\t    ASSERT (len > 0) ;\n\t    ASSERT (deg > 0) ;\n\t    rp = &A [Row [r].start] ;\n\t    rp_end = rp + len ;\n\t    while (rp < rp_end)\n\t    {\n\t\tc = *rp++ ;\n\t\tif (COL_IS_ALIVE (c))\n\t\t{\n\t\t    i++ ;\n\t\t}\n\t    }\n\t    ASSERT (i > 0) ;\n\t}\n    }\n}\n\n\n/* ========================================================================== */\n/* === debug_deg_lists ====================================================== */\n/* ========================================================================== */\n\n/*\n    Prints the contents of the degree lists.  Counts the number of columns\n    in the degree list and compares it to the total it should have.  Also\n    checks the row degrees.\n*/\n\nPRIVATE void debug_deg_lists\n(\n    /* === Parameters ======================================================= */\n\n    int n_row,\n    int n_col,\n    Colamd_Row Row [],\n    Colamd_Col Col [],\n    int head [],\n    int min_score,\n    int should,\n    int max_deg\n)\n{\n    /* === Local variables ================================================== */\n\n    int deg ;\n    int col ;\n    int have ;\n    int row ;\n\n    /* === Check the degree lists =========================================== */\n\n    if (n_col > 10000 && colamd_debug <= 0)\n    {\n\treturn ;\n    }\n    have = 0 ;\n    DEBUG4 ((\"Degree lists: %d\\n\", min_score)) ;\n    for (deg = 0 ; deg <= n_col ; deg++)\n    {\n\tcol = head [deg] ;\n\tif (col == EMPTY)\n\t{\n\t    continue ;\n\t}\n\tDEBUG4 ((\"%d:\", deg)) ;\n\twhile (col != EMPTY)\n\t{\n\t    DEBUG4 ((\" %d\", col)) ;\n\t    have += Col [col].shared1.thickness ;\n\t    ASSERT (COL_IS_ALIVE (col)) ;\n\t    col = Col [col].shared4.degree_next ;\n\t}\n\tDEBUG4 ((\"\\n\")) ;\n    }\n    DEBUG4 ((\"should %d have %d\\n\", should, have)) ;\n    ASSERT (should == have) ;\n\n    /* === Check the row degrees ============================================ */\n\n    if (n_row > 10000 && colamd_debug <= 0)\n    {\n\treturn ;\n    }\n    for (row = 0 ; row < n_row ; row++)\n    {\n\tif (ROW_IS_ALIVE (row))\n\t{\n\t    ASSERT (Row [row].shared1.degree <= max_deg) ;\n\t}\n    }\n}\n\n\n/* ========================================================================== */\n/* === debug_mark =========================================================== */\n/* ========================================================================== */\n\n/*\n    Ensures that the tag_mark is less that the maximum and also ensures that\n    each entry in the mark array is less than the tag mark.\n*/\n\nPRIVATE void debug_mark\n(\n    /* === Parameters ======================================================= */\n\n    int n_row,\n    Colamd_Row Row [],\n    int tag_mark,\n    int max_mark\n)\n{\n    /* === Local variables ================================================== */\n\n    int r ;\n\n    /* === Check the Row marks ============================================== */\n\n    ASSERT (tag_mark > 0 && tag_mark <= max_mark) ;\n    if (n_row > 10000 && colamd_debug <= 0)\n    {\n\treturn ;\n    }\n    for (r = 0 ; r < n_row ; r++)\n    {\n\tASSERT (Row [r].shared2.mark < tag_mark) ;\n    }\n}\n\n\n/* ========================================================================== */\n/* === debug_matrix ========================================================= */\n/* ========================================================================== */\n\n/*\n    Prints out the contents of the columns and the rows.\n*/\n\nPRIVATE void debug_matrix\n(\n    /* === Parameters ======================================================= */\n\n    int n_row,\n    int n_col,\n    Colamd_Row Row [],\n    Colamd_Col Col [],\n    int A []\n)\n{\n    /* === Local variables ================================================== */\n\n    int r ;\n    int c ;\n    int *rp ;\n    int *rp_end ;\n    int *cp ;\n    int *cp_end ;\n\n    /* === Dump the rows and columns of the matrix ========================== */\n\n    if (colamd_debug < 3)\n    {\n\treturn ;\n    }\n    DEBUG3 ((\"DUMP MATRIX:\\n\")) ;\n    for (r = 0 ; r < n_row ; r++)\n    {\n\tDEBUG3 ((\"Row %d alive? %d\\n\", r, ROW_IS_ALIVE (r))) ;\n\tif (ROW_IS_DEAD (r))\n\t{\n\t    continue ;\n\t}\n\tDEBUG3 ((\"start %d length %d degree %d\\n\",\n\t\tRow [r].start, Row [r].length, Row [r].shared1.degree)) ;\n\trp = &A [Row [r].start] ;\n\trp_end = rp + Row [r].length ;\n\twhile (rp < rp_end)\n\t{\n\t    c = *rp++ ;\n\t    DEBUG4 ((\"\t%d col %d\\n\", COL_IS_ALIVE (c), c)) ;\n\t}\n    }\n\n    for (c = 0 ; c < n_col ; c++)\n    {\n\tDEBUG3 ((\"Col %d alive? %d\\n\", c, COL_IS_ALIVE (c))) ;\n\tif (COL_IS_DEAD (c))\n\t{\n\t    continue ;\n\t}\n\tDEBUG3 ((\"start %d length %d shared1 %d shared2 %d\\n\",\n\t\tCol [c].start, Col [c].length,\n\t\tCol [c].shared1.thickness, Col [c].shared2.score)) ;\n\tcp = &A [Col [c].start] ;\n\tcp_end = cp + Col [c].length ;\n\twhile (cp < cp_end)\n\t{\n\t    r = *cp++ ;\n\t    DEBUG4 ((\"\t%d row %d\\n\", ROW_IS_ALIVE (r), r)) ;\n\t}\n    }\n}\n\nPRIVATE void colamd_get_debug\n(\n    char *method\n)\n{\n    colamd_debug = 0 ;\t\t/* no debug printing */\n\n    /* get \"D\" environment variable, which gives the debug printing level */\n    if (getenv (\"D\"))\n    {\n    \tcolamd_debug = atoi (getenv (\"D\")) ;\n    }\n\n    DEBUG0 ((\"%s: debug version, D = %d (THIS WILL BE SLOW!)\\n\",\n    \tmethod, colamd_debug)) ;\n}\n\n#endif /* NDEBUG */\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/colamd/colamd.h",
    "content": "/* ========================================================================== */\n/* === colamd/symamd prototypes and definitions ============================= */\n/* ========================================================================== */\n\n/*\n    You must include this file (colamd.h) in any routine that uses colamd,\n    symamd, or the related macros and definitions.\n\n    Authors:\n\n\tThe authors of the code itself are Stefan I. Larimore and Timothy A.\n\tDavis (davis@cise.ufl.edu), University of Florida.  The algorithm was\n\tdeveloped in collaboration with John Gilbert, Xerox PARC, and Esmond\n\tNg, Oak Ridge National Laboratory.\n\n    Date:\n\n\tMay 4, 2001.  Version 2.1.\n\n    Acknowledgements:\n\n\tThis work was supported by the National Science Foundation, under\n\tgrants DMS-9504974 and DMS-9803599.\n\n    Notice:\n\n\tCopyright (c) 1998-2001 by the University of Florida.\n\tAll Rights Reserved.\n\n\tTHIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY\n\tEXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.\n\n\tPermission is hereby granted to use or copy this program for any\n\tpurpose, provided the above notices are retained on all copies.\n\tUser documentation of any code that uses this code must cite the\n\tAuthors, the Copyright, and \"Used by permission.\"  If this code is\n\taccessible from within Matlab, then typing \"help colamd\" and \"help\n\tsymamd\" must cite the Authors.  Permission to modify the code and to\n\tdistribute modified code is granted, provided the above notices are\n\tretained, and a notice that the code was modified is included with the\n\tabove copyright notice.  You must also retain the Availability\n\tinformation below, of the original version.\n\n\tThis software is provided free of charge.\n\n    Availability:\n\n\tThe colamd/symamd library is available at\n\n\t    http://www.cise.ufl.edu/research/sparse/colamd\n\n\tThis is the http://www.cise.ufl.edu/research/sparse/colamd/colamd.h\n\tfile.  It is required by the colamd.c, colamdmex.c, and symamdmex.c\n\tfiles, and by any C code that calls the routines whose prototypes are\n\tlisted below, or that uses the colamd/symamd definitions listed below.\n\n*/\n\n#ifndef COLAMD_H\n#define COLAMD_H\n\n/* ========================================================================== */\n/* === Include files ======================================================== */\n/* ========================================================================== */\n\n#include <stdlib.h>\n\n/* ========================================================================== */\n/* === Knob and statistics definitions ====================================== */\n/* ========================================================================== */\n\n/* size of the knobs [ ] array.  Only knobs [0..1] are currently used. */\n#define COLAMD_KNOBS 20\n\n/* number of output statistics.  Only stats [0..6] are currently used. */\n#define COLAMD_STATS 20\n\n/* knobs [0] and stats [0]: dense row knob and output statistic. */\n#define COLAMD_DENSE_ROW 0\n\n/* knobs [1] and stats [1]: dense column knob and output statistic. */\n#define COLAMD_DENSE_COL 1\n\n/* stats [2]: memory defragmentation count output statistic */\n#define COLAMD_DEFRAG_COUNT 2\n\n/* stats [3]: colamd status:  zero OK, > 0 warning or notice, < 0 error */\n#define COLAMD_STATUS 3\n\n/* stats [4..6]: error info, or info on jumbled columns */\n#define COLAMD_INFO1 4\n#define COLAMD_INFO2 5\n#define COLAMD_INFO3 6\n\n/* error codes returned in stats [3]: */\n#define COLAMD_OK\t\t\t\t(0)\n#define COLAMD_OK_BUT_JUMBLED\t\t\t(1)\n#define COLAMD_ERROR_A_not_present\t\t(-1)\n#define COLAMD_ERROR_p_not_present\t\t(-2)\n#define COLAMD_ERROR_nrow_negative\t\t(-3)\n#define COLAMD_ERROR_ncol_negative\t\t(-4)\n#define COLAMD_ERROR_nnz_negative\t\t(-5)\n#define COLAMD_ERROR_p0_nonzero\t\t\t(-6)\n#define COLAMD_ERROR_A_too_small\t\t(-7)\n#define COLAMD_ERROR_col_length_negative\t(-8)\n#define COLAMD_ERROR_row_index_out_of_bounds\t(-9)\n#define COLAMD_ERROR_out_of_memory\t\t(-10)\n#define COLAMD_ERROR_internal_error\t\t(-999)\n\n\n\n/* ========================================================================== */\n/* === Row and Column structures ============================================ */\n/* ========================================================================== */\n\n/* User code that makes use of the colamd/symamd routines need not directly */\n/* reference these structures.  They are used only for the COLAMD_RECOMMENDED */\n/* macro. */\n\ntypedef struct Colamd_Col_struct\n{\n    int start ;\t\t/* index for A of first row in this column, or DEAD */\n\t\t\t/* if column is dead */\n    int length ;\t/* number of rows in this column */\n    union\n    {\n\tint thickness ;\t/* number of original columns represented by this */\n\t\t\t/* col, if the column is alive */\n\tint parent ;\t/* parent in parent tree super-column structure, if */\n\t\t\t/* the column is dead */\n    } shared1 ;\n    union\n    {\n\tint score ;\t/* the score used to maintain heap, if col is alive */\n\tint order ;\t/* pivot ordering of this column, if col is dead */\n    } shared2 ;\n    union\n    {\n\tint headhash ;\t/* head of a hash bucket, if col is at the head of */\n\t\t\t/* a degree list */\n\tint hash ;\t/* hash value, if col is not in a degree list */\n\tint prev ;\t/* previous column in degree list, if col is in a */\n\t\t\t/* degree list (but not at the head of a degree list) */\n    } shared3 ;\n    union\n    {\n\tint degree_next ;\t/* next column, if col is in a degree list */\n\tint hash_next ;\t\t/* next column, if col is in a hash list */\n    } shared4 ;\n\n} Colamd_Col ;\n\ntypedef struct Colamd_Row_struct\n{\n    int start ;\t\t/* index for A of first col in this row */\n    int length ;\t/* number of principal columns in this row */\n    union\n    {\n\tint degree ;\t/* number of principal & non-principal columns in row */\n\tint p ;\t\t/* used as a row pointer in init_rows_cols () */\n    } shared1 ;\n    union\n    {\n\tint mark ;\t/* for computing set differences and marking dead rows*/\n\tint first_column ;/* first column in row (used in garbage collection) */\n    } shared2 ;\n\n} Colamd_Row ;\n\n/* ========================================================================== */\n/* === Colamd recommended memory size ======================================= */\n/* ========================================================================== */\n\n/*\n    The recommended length Alen of the array A passed to colamd is given by\n    the COLAMD_RECOMMENDED (nnz, n_row, n_col) macro.  It returns -1 if any\n    argument is negative.  2*nnz space is required for the row and column\n    indices of the matrix. COLAMD_C (n_col) + COLAMD_R (n_row) space is\n    required for the Col and Row arrays, respectively, which are internal to\n    colamd.  An additional n_col space is the minimal amount of \"elbow room\",\n    and nnz/5 more space is recommended for run time efficiency.\n\n    This macro is not needed when using symamd.\n*/\n\n#define COLAMD_C(n_col) (((n_col) + 1) * sizeof (Colamd_Col) / sizeof (int))\n#define COLAMD_R(n_row) (((n_row) + 1) * sizeof (Colamd_Row) / sizeof (int))\n\n#define COLAMD_RECOMMENDED(nnz, n_row, n_col)                                 \\\n(                                                                             \\\n((nnz) < 0 || (n_row) < 0 || (n_col) < 0)                                     \\\n?                                                                             \\\n    (-1)                                                                      \\\n:                                                                             \\\n    (int) (2 * (nnz) + COLAMD_C (n_col) + COLAMD_R (n_row) + (n_col) + ((nnz) / 5)) \\\n)\n\n/* ========================================================================== */\n/* === Prototypes of user-callable routines ================================= */\n/* ========================================================================== */\n\n/*\n#ifdef __cplusplus\n  #define __EXTERN_C extern \"C\"\n#else\n  #define __EXTERN_C\n#endif\n*/\n\n#ifndef __BORLANDC__\n\n  #ifdef __cplusplus\n    #define __EXTERN_C extern \"C\"\n  #else\n    #define __EXTERN_C\n  #endif\n\n#else  /* Otherwise set up for the Borland compiler */\n\n  #define __EXTERN_C extern \"C\"\n\n#endif\n\n#ifdef __cplusplus\n__EXTERN_C {\n#endif\n\n\n\nint colamd_recommended\t\t/* returns recommended value of Alen, */\n\t\t\t\t/* or (-1) if input arguments are erroneous */\n(\n    int nnz,\t\t\t/* nonzeros in A */\n    int n_row,\t\t/* number of rows in A */\n    int n_col\t\t\t/* number of columns in A */\n) ;\n\nvoid colamd_set_defaults\t/* sets default parameters */\n(\t\t\t\t/* knobs argument is modified on output */\n    double knobs [COLAMD_KNOBS]\t/* parameter settings for colamd */\n) ;\n\nint colamd\t\t\t/* returns (1) if successful, (0) otherwise*/\n(\t\t\t\t/* A and p arguments are modified on output */\n    int n_row,\t\t/* number of rows in A */\n    int n_col,\t\t/* number of columns in A */\n    int Alen,\t\t\t/* size of the array A */\n    int A [],\t\t\t/* row indices of A, of size Alen */\n    int p [],\t\t\t/* column pointers of A, of size n_col+1 */\n    double knobs [COLAMD_KNOBS],/* parameter settings for colamd */\n    int stats [COLAMD_STATS]\t/* colamd output statistics and error codes */\n) ;\n\nint symamd\t\t\t\t/* return (1) if OK, (0) otherwise */\n(\n    int n,\t\t\t\t/* number of rows and columns of A */\n    int A [],\t\t\t/* row indices of A */\n    int p [],\t\t\t/* column pointers of A */\n    int perm [],\t/* output permutation, size n_col+1 */\n    double knobs [COLAMD_KNOBS],\t/* parameters (uses defaults if NULL) */\n    int stats [COLAMD_STATS],\t\t/* output statistics and error codes */\n    void * (*allocate) (size_t, size_t),\n    \t\t\t\t\t/* pointer to calloc (ANSI C) or */\n\t\t\t\t\t/* mxCalloc (for Matlab mexFunction) */\n    void (*release) (void *)\n    \t\t\t\t\t/* pointer to free (ANSI C) or */\n    \t\t\t\t\t/* mxFree (for Matlab mexFunction) */\n) ;\n\nvoid colamd_report\n(\n    int stats [COLAMD_STATS]\n) ;\n\nvoid symamd_report\n(\n    int stats [COLAMD_STATS]\n) ;\n\n#endif /* COLAMD_H */\n\n\n#ifdef __cplusplus\n}\n#endif\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/config.log",
    "content": "This file contains any messages produced by compilers while\nrunning configure, to aid debugging if configure makes a mistake.\n\nIt was created by lpsolve configure 5.5.2.0, which was\ngenerated by GNU Autoconf 2.59.  Invocation command line was\n\n  $ ./configure \n\n## --------- ##\n## Platform. ##\n## --------- ##\n\nhostname = ZephyrusLinux\nuname -m = x86_64\nuname -r = 5.0.0-37-generic\nuname -s = Linux\nuname -v = #40-Ubuntu SMP Thu Nov 14 00:14:01 UTC 2019\n\n/usr/bin/uname -p = x86_64\n/bin/uname -X     = unknown\n\n/bin/arch              = x86_64\n/usr/bin/arch -k       = unknown\n/usr/convex/getsysinfo = unknown\nhostinfo               = unknown\n/bin/machine           = unknown\n/usr/bin/oslevel       = unknown\n/bin/universe          = unknown\n\nPATH: /usr/local/sbin\nPATH: /usr/local/bin\nPATH: /usr/sbin\nPATH: /usr/bin\nPATH: /sbin\nPATH: /bin\nPATH: /usr/games\nPATH: /usr/local/games\nPATH: /snap/bin\nPATH: /usr/include/gurobi811/linux64/bin\nPATH: /usr/include/gurobi811/linux64/bin\n\n\n## ----------- ##\n## Core tests. ##\n## ----------- ##\n\nconfigure:1277: error: cannot find install-sh or install.sh in . ./.. ./../..\n\n## ---------------- ##\n## Cache variables. ##\n## ---------------- ##\n\nac_cv_env_CC_set=\nac_cv_env_CC_value=\nac_cv_env_CFLAGS_set=\nac_cv_env_CFLAGS_value=\nac_cv_env_CPPFLAGS_set=\nac_cv_env_CPPFLAGS_value=\nac_cv_env_LDFLAGS_set=\nac_cv_env_LDFLAGS_value=\nac_cv_env_build_alias_set=\nac_cv_env_build_alias_value=\nac_cv_env_host_alias_set=\nac_cv_env_host_alias_value=\nac_cv_env_target_alias_set=\nac_cv_env_target_alias_value=\n\n## ----------------- ##\n## Output variables. ##\n## ----------------- ##\n\nCC=''\nCCSHARED=''\nCFLAGS=''\nCPPFLAGS=''\nDEF=''\nDEFS=''\nECHO_C=''\nECHO_N='-n'\nECHO_T=''\nEXEEXT=''\nINSTALL_DATA=''\nINSTALL_PROGRAM=''\nINSTALL_SCRIPT=''\nLDFLAGS=''\nLIBOBJS=''\nLIBS=''\nLTLIBOBJS=''\nOBJEXT=''\nPACKAGE_BUGREPORT=''\nPACKAGE_NAME='lpsolve'\nPACKAGE_STRING='lpsolve 5.5.2.0'\nPACKAGE_TARNAME='lpsolve'\nPACKAGE_VERSION='5.5.2.0'\nPATH_SEPARATOR=':'\nSHARED_LIB=''\nSHELL='/bin/bash'\nSO=''\nac_ct_CC=''\nbindir='${exec_prefix}/bin'\nbuild=''\nbuild_alias=''\nbuild_cpu=''\nbuild_os=''\nbuild_vendor=''\ndatadir='${prefix}/share'\nexec_prefix='NONE'\nhost=''\nhost_alias=''\nhost_cpu=''\nhost_os=''\nhost_vendor=''\nincludedir='${prefix}/include'\ninfodir='${prefix}/info'\nlibdir='${exec_prefix}/lib'\nlibexecdir='${exec_prefix}/libexec'\nlocalstatedir='${prefix}/var'\nmandir='${prefix}/man'\noldincludedir='/usr/include'\nprefix='NONE'\nprogram_transform_name='s,x,x,'\nsbindir='${exec_prefix}/sbin'\nsharedstatedir='${prefix}/com'\nsysconfdir='${prefix}/etc'\ntarget_alias=''\n\n## ----------- ##\n## confdefs.h. ##\n## ----------- ##\n\n#define PACKAGE_BUGREPORT \"\"\n#define PACKAGE_NAME \"lpsolve\"\n#define PACKAGE_STRING \"lpsolve 5.5.2.0\"\n#define PACKAGE_TARNAME \"lpsolve\"\n#define PACKAGE_VERSION \"5.5.2.0\"\n\nconfigure: exit 1\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/configure",
    "content": "#! /bin/sh\n# Guess values for system-dependent variables and create Makefiles.\n# Generated by GNU Autoconf 2.59 for lpsolve 5.5.2.0.\n#\n# Copyright (C) 2003 Free Software Foundation, Inc.\n# This configure script is free software; the Free Software Foundation\n# gives unlimited permission to copy, distribute and modify it.\n## --------------------- ##\n## M4sh Initialization.  ##\n## --------------------- ##\n\n# Be Bourne compatible\nif test -n \"${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then\n  emulate sh\n  NULLCMD=:\n  # Zsh 3.x and 4.x performs word splitting on ${1+\"$@\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '${1+\"$@\"}'='\"$@\"'\nelif test -n \"${BASH_VERSION+set}\" && (set -o posix) >/dev/null 2>&1; then\n  set -o posix\nfi\nDUALCASE=1; export DUALCASE # for MKS sh\n\n# Support unset when possible.\nif ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then\n  as_unset=unset\nelse\n  as_unset=false\nfi\n\n\n# Work around bugs in pre-3.0 UWIN ksh.\n$as_unset ENV MAIL MAILPATH\nPS1='$ '\nPS2='> '\nPS4='+ '\n\n# NLS nuisances.\nfor as_var in \\\n  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \\\n  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \\\n  LC_TELEPHONE LC_TIME\ndo\n  if (set +x; test -z \"`(eval $as_var=C; export $as_var) 2>&1`\"); then\n    eval $as_var=C; export $as_var\n  else\n    $as_unset $as_var\n  fi\ndone\n\n# Required to use basename.\nif expr a : '\\(a\\)' >/dev/null 2>&1; then\n  as_expr=expr\nelse\n  as_expr=false\nfi\n\nif (basename /) >/dev/null 2>&1 && test \"X`basename / 2>&1`\" = \"X/\"; then\n  as_basename=basename\nelse\n  as_basename=false\nfi\n\n\n# Name of the executable.\nas_me=`$as_basename \"$0\" ||\n$as_expr X/\"$0\" : '.*/\\([^/][^/]*\\)/*$' \\| \\\n\t X\"$0\" : 'X\\(//\\)$' \\| \\\n\t X\"$0\" : 'X\\(/\\)$' \\| \\\n\t .     : '\\(.\\)' 2>/dev/null ||\necho X/\"$0\" |\n    sed '/^.*\\/\\([^/][^/]*\\)\\/*$/{ s//\\1/; q; }\n  \t  /^X\\/\\(\\/\\/\\)$/{ s//\\1/; q; }\n  \t  /^X\\/\\(\\/\\).*/{ s//\\1/; q; }\n  \t  s/.*/./; q'`\n\n\n# PATH needs CR, and LINENO needs CR and PATH.\n# Avoid depending upon Character Ranges.\nas_cr_letters='abcdefghijklmnopqrstuvwxyz'\nas_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'\nas_cr_Letters=$as_cr_letters$as_cr_LETTERS\nas_cr_digits='0123456789'\nas_cr_alnum=$as_cr_Letters$as_cr_digits\n\n# The user is always right.\nif test \"${PATH_SEPARATOR+set}\" != set; then\n  echo \"#! /bin/sh\" >conf$$.sh\n  echo  \"exit 0\"   >>conf$$.sh\n  chmod +x conf$$.sh\n  if (PATH=\"/nonexistent;.\"; conf$$.sh) >/dev/null 2>&1; then\n    PATH_SEPARATOR=';'\n  else\n    PATH_SEPARATOR=:\n  fi\n  rm -f conf$$.sh\nfi\n\n\n  as_lineno_1=$LINENO\n  as_lineno_2=$LINENO\n  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`\n  test \"x$as_lineno_1\" != \"x$as_lineno_2\" &&\n  test \"x$as_lineno_3\"  = \"x$as_lineno_2\"  || {\n  # Find who we are.  Look in the path if we contain no path at all\n  # relative or not.\n  case $0 in\n    *[\\\\/]* ) as_myself=$0 ;;\n    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  test -r \"$as_dir/$0\" && as_myself=$as_dir/$0 && break\ndone\n\n       ;;\n  esac\n  # We did not find ourselves, most probably we were run as `sh COMMAND'\n  # in which case we are not to be found in the path.\n  if test \"x$as_myself\" = x; then\n    as_myself=$0\n  fi\n  if test ! -f \"$as_myself\"; then\n    { echo \"$as_me: error: cannot find myself; rerun with an absolute path\" >&2\n   { (exit 1); exit 1; }; }\n  fi\n  case $CONFIG_SHELL in\n  '')\n    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for as_base in sh bash ksh sh5; do\n\t case $as_dir in\n\t /*)\n\t   if (\"$as_dir/$as_base\" -c '\n  as_lineno_1=$LINENO\n  as_lineno_2=$LINENO\n  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`\n  test \"x$as_lineno_1\" != \"x$as_lineno_2\" &&\n  test \"x$as_lineno_3\"  = \"x$as_lineno_2\" ') 2>/dev/null; then\n\t     $as_unset BASH_ENV || test \"${BASH_ENV+set}\" != set || { BASH_ENV=; export BASH_ENV; }\n\t     $as_unset ENV || test \"${ENV+set}\" != set || { ENV=; export ENV; }\n\t     CONFIG_SHELL=$as_dir/$as_base\n\t     export CONFIG_SHELL\n\t     exec \"$CONFIG_SHELL\" \"$0\" ${1+\"$@\"}\n\t   fi;;\n\t esac\n       done\ndone\n;;\n  esac\n\n  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO\n  # uniformly replaced by the line number.  The first 'sed' inserts a\n  # line-number line before each line; the second 'sed' does the real\n  # work.  The second script uses 'N' to pair each line-number line\n  # with the numbered line, and appends trailing '-' during\n  # substitution so that $LINENO is not a special case at line end.\n  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the\n  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)\n  sed '=' <$as_myself |\n    sed '\n      N\n      s,$,-,\n      : loop\n      s,^\\(['$as_cr_digits']*\\)\\(.*\\)[$]LINENO\\([^'$as_cr_alnum'_]\\),\\1\\2\\1\\3,\n      t loop\n      s,-$,,\n      s,^['$as_cr_digits']*\\n,,\n    ' >$as_me.lineno &&\n  chmod +x $as_me.lineno ||\n    { echo \"$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell\" >&2\n   { (exit 1); exit 1; }; }\n\n  # Don't try to exec as it changes $[0], causing all sort of problems\n  # (the dirname of $[0] is not the place where we might find the\n  # original and so on.  Autoconf is especially sensible to this).\n  . ./$as_me.lineno\n  # Exit status is that of the last command.\n  exit\n}\n\n\ncase `echo \"testing\\c\"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in\n  *c*,-n*) ECHO_N= ECHO_C='\n' ECHO_T='\t' ;;\n  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;\n  *)       ECHO_N= ECHO_C='\\c' ECHO_T= ;;\nesac\n\nif expr a : '\\(a\\)' >/dev/null 2>&1; then\n  as_expr=expr\nelse\n  as_expr=false\nfi\n\nrm -f conf$$ conf$$.exe conf$$.file\necho >conf$$.file\nif ln -s conf$$.file conf$$ 2>/dev/null; then\n  # We could just check for DJGPP; but this test a) works b) is more generic\n  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).\n  if test -f conf$$.exe; then\n    # Don't use ln at all; we don't have any links\n    as_ln_s='cp -p'\n  else\n    as_ln_s='ln -s'\n  fi\nelif ln conf$$.file conf$$ 2>/dev/null; then\n  as_ln_s=ln\nelse\n  as_ln_s='cp -p'\nfi\nrm -f conf$$ conf$$.exe conf$$.file\n\nif mkdir -p . 2>/dev/null; then\n  as_mkdir_p=:\nelse\n  test -d ./-p && rmdir ./-p\n  as_mkdir_p=false\nfi\n\nas_executable_p=\"test -f\"\n\n# Sed expression to map a string onto a valid CPP name.\nas_tr_cpp=\"eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'\"\n\n# Sed expression to map a string onto a valid variable name.\nas_tr_sh=\"eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'\"\n\n\n# IFS\n# We need space, tab and new line, in precisely that order.\nas_nl='\n'\nIFS=\" \t$as_nl\"\n\n# CDPATH.\n$as_unset CDPATH\n\n\n# Name of the host.\n# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,\n# so uname gets run too.\nac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`\n\nexec 6>&1\n\n#\n# Initializations.\n#\nac_default_prefix=/usr/local\nac_config_libobj_dir=.\ncross_compiling=no\nsubdirs=\nMFLAGS=\nMAKEFLAGS=\nSHELL=${CONFIG_SHELL-/bin/sh}\n\n# Maximum number of lines to put in a shell here document.\n# This variable seems obsolete.  It should probably be removed, and\n# only ac_max_sed_lines should be used.\n: ${ac_max_here_lines=38}\n\n# Identity of this package.\nPACKAGE_NAME='lpsolve'\nPACKAGE_TARNAME='lpsolve'\nPACKAGE_VERSION='5.5.2.0'\nPACKAGE_STRING='lpsolve 5.5.2.0'\nPACKAGE_BUGREPORT=''\n\nac_unique_file=\"lp_simplex.c\"\nac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os SO CCSHARED DEF SHARED_LIB CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA LIBOBJS LTLIBOBJS'\nac_subst_files=''\n\n# Initialize some variables set by options.\nac_init_help=\nac_init_version=false\n# The variables have the same names as the options, with\n# dashes changed to underlines.\ncache_file=/dev/null\nexec_prefix=NONE\nno_create=\nno_recursion=\nprefix=NONE\nprogram_prefix=NONE\nprogram_suffix=NONE\nprogram_transform_name=s,x,x,\nsilent=\nsite=\nsrcdir=\nverbose=\nx_includes=NONE\nx_libraries=NONE\n\n# Installation directory options.\n# These are left unexpanded so users can \"make install exec_prefix=/foo\"\n# and all the variables that are supposed to be based on exec_prefix\n# by default will actually change.\n# Use braces instead of parens because sh, perl, etc. also accept them.\nbindir='${exec_prefix}/bin'\nsbindir='${exec_prefix}/sbin'\nlibexecdir='${exec_prefix}/libexec'\ndatadir='${prefix}/share'\nsysconfdir='${prefix}/etc'\nsharedstatedir='${prefix}/com'\nlocalstatedir='${prefix}/var'\nlibdir='${exec_prefix}/lib'\nincludedir='${prefix}/include'\noldincludedir='/usr/include'\ninfodir='${prefix}/info'\nmandir='${prefix}/man'\n\nac_prev=\nfor ac_option\ndo\n  # If the previous option needs an argument, assign it.\n  if test -n \"$ac_prev\"; then\n    eval \"$ac_prev=\\$ac_option\"\n    ac_prev=\n    continue\n  fi\n\n  ac_optarg=`expr \"x$ac_option\" : 'x[^=]*=\\(.*\\)'`\n\n  # Accept the important Cygnus configure options, so we can diagnose typos.\n\n  case $ac_option in\n\n  -bindir | --bindir | --bindi | --bind | --bin | --bi)\n    ac_prev=bindir ;;\n  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)\n    bindir=$ac_optarg ;;\n\n  -build | --build | --buil | --bui | --bu)\n    ac_prev=build_alias ;;\n  -build=* | --build=* | --buil=* | --bui=* | --bu=*)\n    build_alias=$ac_optarg ;;\n\n  -cache-file | --cache-file | --cache-fil | --cache-fi \\\n  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)\n    ac_prev=cache_file ;;\n  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \\\n  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)\n    cache_file=$ac_optarg ;;\n\n  --config-cache | -C)\n    cache_file=config.cache ;;\n\n  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)\n    ac_prev=datadir ;;\n  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \\\n  | --da=*)\n    datadir=$ac_optarg ;;\n\n  -disable-* | --disable-*)\n    ac_feature=`expr \"x$ac_option\" : 'x-*disable-\\(.*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_feature\" : \".*[^-_$as_cr_alnum]\" >/dev/null &&\n      { echo \"$as_me: error: invalid feature name: $ac_feature\" >&2\n   { (exit 1); exit 1; }; }\n    ac_feature=`echo $ac_feature | sed 's/-/_/g'`\n    eval \"enable_$ac_feature=no\" ;;\n\n  -enable-* | --enable-*)\n    ac_feature=`expr \"x$ac_option\" : 'x-*enable-\\([^=]*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_feature\" : \".*[^-_$as_cr_alnum]\" >/dev/null &&\n      { echo \"$as_me: error: invalid feature name: $ac_feature\" >&2\n   { (exit 1); exit 1; }; }\n    ac_feature=`echo $ac_feature | sed 's/-/_/g'`\n    case $ac_option in\n      *=*) ac_optarg=`echo \"$ac_optarg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;;\n      *) ac_optarg=yes ;;\n    esac\n    eval \"enable_$ac_feature='$ac_optarg'\" ;;\n\n  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \\\n  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \\\n  | --exec | --exe | --ex)\n    ac_prev=exec_prefix ;;\n  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \\\n  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \\\n  | --exec=* | --exe=* | --ex=*)\n    exec_prefix=$ac_optarg ;;\n\n  -gas | --gas | --ga | --g)\n    # Obsolete; use --with-gas.\n    with_gas=yes ;;\n\n  -help | --help | --hel | --he | -h)\n    ac_init_help=long ;;\n  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)\n    ac_init_help=recursive ;;\n  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)\n    ac_init_help=short ;;\n\n  -host | --host | --hos | --ho)\n    ac_prev=host_alias ;;\n  -host=* | --host=* | --hos=* | --ho=*)\n    host_alias=$ac_optarg ;;\n\n  -includedir | --includedir | --includedi | --included | --include \\\n  | --includ | --inclu | --incl | --inc)\n    ac_prev=includedir ;;\n  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \\\n  | --includ=* | --inclu=* | --incl=* | --inc=*)\n    includedir=$ac_optarg ;;\n\n  -infodir | --infodir | --infodi | --infod | --info | --inf)\n    ac_prev=infodir ;;\n  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)\n    infodir=$ac_optarg ;;\n\n  -libdir | --libdir | --libdi | --libd)\n    ac_prev=libdir ;;\n  -libdir=* | --libdir=* | --libdi=* | --libd=*)\n    libdir=$ac_optarg ;;\n\n  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \\\n  | --libexe | --libex | --libe)\n    ac_prev=libexecdir ;;\n  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \\\n  | --libexe=* | --libex=* | --libe=*)\n    libexecdir=$ac_optarg ;;\n\n  -localstatedir | --localstatedir | --localstatedi | --localstated \\\n  | --localstate | --localstat | --localsta | --localst \\\n  | --locals | --local | --loca | --loc | --lo)\n    ac_prev=localstatedir ;;\n  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \\\n  | --localstate=* | --localstat=* | --localsta=* | --localst=* \\\n  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)\n    localstatedir=$ac_optarg ;;\n\n  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)\n    ac_prev=mandir ;;\n  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)\n    mandir=$ac_optarg ;;\n\n  -nfp | --nfp | --nf)\n    # Obsolete; use --without-fp.\n    with_fp=no ;;\n\n  -no-create | --no-create | --no-creat | --no-crea | --no-cre \\\n  | --no-cr | --no-c | -n)\n    no_create=yes ;;\n\n  -no-recursion | --no-recursion | --no-recursio | --no-recursi \\\n  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)\n    no_recursion=yes ;;\n\n  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \\\n  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \\\n  | --oldin | --oldi | --old | --ol | --o)\n    ac_prev=oldincludedir ;;\n  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \\\n  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \\\n  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)\n    oldincludedir=$ac_optarg ;;\n\n  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)\n    ac_prev=prefix ;;\n  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)\n    prefix=$ac_optarg ;;\n\n  -program-prefix | --program-prefix | --program-prefi | --program-pref \\\n  | --program-pre | --program-pr | --program-p)\n    ac_prev=program_prefix ;;\n  -program-prefix=* | --program-prefix=* | --program-prefi=* \\\n  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)\n    program_prefix=$ac_optarg ;;\n\n  -program-suffix | --program-suffix | --program-suffi | --program-suff \\\n  | --program-suf | --program-su | --program-s)\n    ac_prev=program_suffix ;;\n  -program-suffix=* | --program-suffix=* | --program-suffi=* \\\n  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)\n    program_suffix=$ac_optarg ;;\n\n  -program-transform-name | --program-transform-name \\\n  | --program-transform-nam | --program-transform-na \\\n  | --program-transform-n | --program-transform- \\\n  | --program-transform | --program-transfor \\\n  | --program-transfo | --program-transf \\\n  | --program-trans | --program-tran \\\n  | --progr-tra | --program-tr | --program-t)\n    ac_prev=program_transform_name ;;\n  -program-transform-name=* | --program-transform-name=* \\\n  | --program-transform-nam=* | --program-transform-na=* \\\n  | --program-transform-n=* | --program-transform-=* \\\n  | --program-transform=* | --program-transfor=* \\\n  | --program-transfo=* | --program-transf=* \\\n  | --program-trans=* | --program-tran=* \\\n  | --progr-tra=* | --program-tr=* | --program-t=*)\n    program_transform_name=$ac_optarg ;;\n\n  -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n  | -silent | --silent | --silen | --sile | --sil)\n    silent=yes ;;\n\n  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)\n    ac_prev=sbindir ;;\n  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \\\n  | --sbi=* | --sb=*)\n    sbindir=$ac_optarg ;;\n\n  -sharedstatedir | --sharedstatedir | --sharedstatedi \\\n  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \\\n  | --sharedst | --shareds | --shared | --share | --shar \\\n  | --sha | --sh)\n    ac_prev=sharedstatedir ;;\n  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \\\n  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \\\n  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \\\n  | --sha=* | --sh=*)\n    sharedstatedir=$ac_optarg ;;\n\n  -site | --site | --sit)\n    ac_prev=site ;;\n  -site=* | --site=* | --sit=*)\n    site=$ac_optarg ;;\n\n  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)\n    ac_prev=srcdir ;;\n  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)\n    srcdir=$ac_optarg ;;\n\n  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \\\n  | --syscon | --sysco | --sysc | --sys | --sy)\n    ac_prev=sysconfdir ;;\n  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \\\n  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)\n    sysconfdir=$ac_optarg ;;\n\n  -target | --target | --targe | --targ | --tar | --ta | --t)\n    ac_prev=target_alias ;;\n  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)\n    target_alias=$ac_optarg ;;\n\n  -v | -verbose | --verbose | --verbos | --verbo | --verb)\n    verbose=yes ;;\n\n  -version | --version | --versio | --versi | --vers | -V)\n    ac_init_version=: ;;\n\n  -with-* | --with-*)\n    ac_package=`expr \"x$ac_option\" : 'x-*with-\\([^=]*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_package\" : \".*[^-_$as_cr_alnum]\" >/dev/null &&\n      { echo \"$as_me: error: invalid package name: $ac_package\" >&2\n   { (exit 1); exit 1; }; }\n    ac_package=`echo $ac_package| sed 's/-/_/g'`\n    case $ac_option in\n      *=*) ac_optarg=`echo \"$ac_optarg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;;\n      *) ac_optarg=yes ;;\n    esac\n    eval \"with_$ac_package='$ac_optarg'\" ;;\n\n  -without-* | --without-*)\n    ac_package=`expr \"x$ac_option\" : 'x-*without-\\(.*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_package\" : \".*[^-_$as_cr_alnum]\" >/dev/null &&\n      { echo \"$as_me: error: invalid package name: $ac_package\" >&2\n   { (exit 1); exit 1; }; }\n    ac_package=`echo $ac_package | sed 's/-/_/g'`\n    eval \"with_$ac_package=no\" ;;\n\n  --x)\n    # Obsolete; use --with-x.\n    with_x=yes ;;\n\n  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \\\n  | --x-incl | --x-inc | --x-in | --x-i)\n    ac_prev=x_includes ;;\n  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \\\n  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)\n    x_includes=$ac_optarg ;;\n\n  -x-libraries | --x-libraries | --x-librarie | --x-librari \\\n  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)\n    ac_prev=x_libraries ;;\n  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \\\n  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)\n    x_libraries=$ac_optarg ;;\n\n  -*) { echo \"$as_me: error: unrecognized option: $ac_option\nTry \\`$0 --help' for more information.\" >&2\n   { (exit 1); exit 1; }; }\n    ;;\n\n  *=*)\n    ac_envvar=`expr \"x$ac_option\" : 'x\\([^=]*\\)='`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_envvar\" : \".*[^_$as_cr_alnum]\" >/dev/null &&\n      { echo \"$as_me: error: invalid variable name: $ac_envvar\" >&2\n   { (exit 1); exit 1; }; }\n    ac_optarg=`echo \"$ac_optarg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`\n    eval \"$ac_envvar='$ac_optarg'\"\n    export $ac_envvar ;;\n\n  *)\n    # FIXME: should be removed in autoconf 3.0.\n    echo \"$as_me: WARNING: you should use --build, --host, --target\" >&2\n    expr \"x$ac_option\" : \".*[^-._$as_cr_alnum]\" >/dev/null &&\n      echo \"$as_me: WARNING: invalid host type: $ac_option\" >&2\n    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}\n    ;;\n\n  esac\ndone\n\nif test -n \"$ac_prev\"; then\n  ac_option=--`echo $ac_prev | sed 's/_/-/g'`\n  { echo \"$as_me: error: missing argument to $ac_option\" >&2\n   { (exit 1); exit 1; }; }\nfi\n\n# Be sure to have absolute paths.\nfor ac_var in exec_prefix prefix\ndo\n  eval ac_val=$`echo $ac_var`\n  case $ac_val in\n    [\\\\/$]* | ?:[\\\\/]* | NONE | '' ) ;;\n    *)  { echo \"$as_me: error: expected an absolute directory name for --$ac_var: $ac_val\" >&2\n   { (exit 1); exit 1; }; };;\n  esac\ndone\n\n# Be sure to have absolute paths.\nfor ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \\\n\t      localstatedir libdir includedir oldincludedir infodir mandir\ndo\n  eval ac_val=$`echo $ac_var`\n  case $ac_val in\n    [\\\\/$]* | ?:[\\\\/]* ) ;;\n    *)  { echo \"$as_me: error: expected an absolute directory name for --$ac_var: $ac_val\" >&2\n   { (exit 1); exit 1; }; };;\n  esac\ndone\n\n# There might be people who depend on the old broken behavior: `$host'\n# used to hold the argument of --host etc.\n# FIXME: To remove some day.\nbuild=$build_alias\nhost=$host_alias\ntarget=$target_alias\n\n# FIXME: To remove some day.\nif test \"x$host_alias\" != x; then\n  if test \"x$build_alias\" = x; then\n    cross_compiling=maybe\n    echo \"$as_me: WARNING: If you wanted to set the --build type, don't use --host.\n    If a cross compiler is detected then cross compile mode will be used.\" >&2\n  elif test \"x$build_alias\" != \"x$host_alias\"; then\n    cross_compiling=yes\n  fi\nfi\n\nac_tool_prefix=\ntest -n \"$host_alias\" && ac_tool_prefix=$host_alias-\n\ntest \"$silent\" = yes && exec 6>/dev/null\n\n\n# Find the source files, if location was not specified.\nif test -z \"$srcdir\"; then\n  ac_srcdir_defaulted=yes\n  # Try the directory containing this script, then its parent.\n  ac_confdir=`(dirname \"$0\") 2>/dev/null ||\n$as_expr X\"$0\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$0\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$0\" : 'X\\(//\\)$' \\| \\\n\t X\"$0\" : 'X\\(/\\)' \\| \\\n\t .     : '\\(.\\)' 2>/dev/null ||\necho X\"$0\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{ s//\\1/; q; }\n  \t  /^X\\(\\/\\/\\)[^/].*/{ s//\\1/; q; }\n  \t  /^X\\(\\/\\/\\)$/{ s//\\1/; q; }\n  \t  /^X\\(\\/\\).*/{ s//\\1/; q; }\n  \t  s/.*/./; q'`\n  srcdir=$ac_confdir\n  if test ! -r $srcdir/$ac_unique_file; then\n    srcdir=..\n  fi\nelse\n  ac_srcdir_defaulted=no\nfi\nif test ! -r $srcdir/$ac_unique_file; then\n  if test \"$ac_srcdir_defaulted\" = yes; then\n    { echo \"$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or ..\" >&2\n   { (exit 1); exit 1; }; }\n  else\n    { echo \"$as_me: error: cannot find sources ($ac_unique_file) in $srcdir\" >&2\n   { (exit 1); exit 1; }; }\n  fi\nfi\n(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||\n  { echo \"$as_me: error: sources are in $srcdir, but \\`cd $srcdir' does not work\" >&2\n   { (exit 1); exit 1; }; }\nsrcdir=`echo \"$srcdir\" | sed 's%\\([^\\\\/]\\)[\\\\/]*$%\\1%'`\nac_env_build_alias_set=${build_alias+set}\nac_env_build_alias_value=$build_alias\nac_cv_env_build_alias_set=${build_alias+set}\nac_cv_env_build_alias_value=$build_alias\nac_env_host_alias_set=${host_alias+set}\nac_env_host_alias_value=$host_alias\nac_cv_env_host_alias_set=${host_alias+set}\nac_cv_env_host_alias_value=$host_alias\nac_env_target_alias_set=${target_alias+set}\nac_env_target_alias_value=$target_alias\nac_cv_env_target_alias_set=${target_alias+set}\nac_cv_env_target_alias_value=$target_alias\nac_env_CC_set=${CC+set}\nac_env_CC_value=$CC\nac_cv_env_CC_set=${CC+set}\nac_cv_env_CC_value=$CC\nac_env_CFLAGS_set=${CFLAGS+set}\nac_env_CFLAGS_value=$CFLAGS\nac_cv_env_CFLAGS_set=${CFLAGS+set}\nac_cv_env_CFLAGS_value=$CFLAGS\nac_env_LDFLAGS_set=${LDFLAGS+set}\nac_env_LDFLAGS_value=$LDFLAGS\nac_cv_env_LDFLAGS_set=${LDFLAGS+set}\nac_cv_env_LDFLAGS_value=$LDFLAGS\nac_env_CPPFLAGS_set=${CPPFLAGS+set}\nac_env_CPPFLAGS_value=$CPPFLAGS\nac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}\nac_cv_env_CPPFLAGS_value=$CPPFLAGS\n\n#\n# Report the --help message.\n#\nif test \"$ac_init_help\" = \"long\"; then\n  # Omit some internal or obsolete options to make the list less imposing.\n  # This message is too long to be a string in the A/UX 3.1 sh.\n  cat <<_ACEOF\n\\`configure' configures lpsolve 5.5.2.0 to adapt to many kinds of systems.\n\nUsage: $0 [OPTION]... [VAR=VALUE]...\n\nTo assign environment variables (e.g., CC, CFLAGS...), specify them as\nVAR=VALUE.  See below for descriptions of some of the useful variables.\n\nDefaults for the options are specified in brackets.\n\nConfiguration:\n  -h, --help              display this help and exit\n      --help=short        display options specific to this package\n      --help=recursive    display the short help of all the included packages\n  -V, --version           display version information and exit\n  -q, --quiet, --silent   do not print \\`checking...' messages\n      --cache-file=FILE   cache test results in FILE [disabled]\n  -C, --config-cache      alias for \\`--cache-file=config.cache'\n  -n, --no-create         do not create output files\n      --srcdir=DIR        find the sources in DIR [configure dir or \\`..']\n\n_ACEOF\n\n  cat <<_ACEOF\nInstallation directories:\n  --prefix=PREFIX         install architecture-independent files in PREFIX\n\t\t\t  [$ac_default_prefix]\n  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX\n\t\t\t  [PREFIX]\n\nBy default, \\`make install' will install all the files in\n\\`$ac_default_prefix/bin', \\`$ac_default_prefix/lib' etc.  You can specify\nan installation prefix other than \\`$ac_default_prefix' using \\`--prefix',\nfor instance \\`--prefix=\\$HOME'.\n\nFor better control, use the options below.\n\nFine tuning of the installation directories:\n  --bindir=DIR           user executables [EPREFIX/bin]\n  --sbindir=DIR          system admin executables [EPREFIX/sbin]\n  --libexecdir=DIR       program executables [EPREFIX/libexec]\n  --datadir=DIR          read-only architecture-independent data [PREFIX/share]\n  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]\n  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]\n  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]\n  --libdir=DIR           object code libraries [EPREFIX/lib]\n  --includedir=DIR       C header files [PREFIX/include]\n  --oldincludedir=DIR    C header files for non-gcc [/usr/include]\n  --infodir=DIR          info documentation [PREFIX/info]\n  --mandir=DIR           man documentation [PREFIX/man]\n_ACEOF\n\n  cat <<\\_ACEOF\n\nSystem types:\n  --build=BUILD     configure for building on BUILD [guessed]\n  --host=HOST       cross-compile to build programs to run on HOST [BUILD]\n_ACEOF\nfi\n\nif test -n \"$ac_init_help\"; then\n  case $ac_init_help in\n     short | recursive ) echo \"Configuration of lpsolve 5.5.2.0:\";;\n   esac\n  cat <<\\_ACEOF\n\nSome influential environment variables:\n  CC          C compiler command\n  CFLAGS      C compiler flags\n  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a\n              nonstandard directory <lib dir>\n  CPPFLAGS    C/C++ preprocessor flags, e.g. -I<include dir> if you have\n              headers in a nonstandard directory <include dir>\n\nUse these variables to override the choices made by `configure' or to help\nit to find libraries and programs with nonstandard names/locations.\n\n_ACEOF\nfi\n\nif test \"$ac_init_help\" = \"recursive\"; then\n  # If there are subdirs, report their specific --help.\n  ac_popdir=`pwd`\n  for ac_dir in : $ac_subdirs_all; do test \"x$ac_dir\" = x: && continue\n    test -d $ac_dir || continue\n    ac_builddir=.\n\nif test \"$ac_dir\" != .; then\n  ac_dir_suffix=/`echo \"$ac_dir\" | sed 's,^\\.[\\\\/],,'`\n  # A \"../\" for each directory in $ac_dir_suffix.\n  ac_top_builddir=`echo \"$ac_dir_suffix\" | sed 's,/[^\\\\/]*,../,g'`\nelse\n  ac_dir_suffix= ac_top_builddir=\nfi\n\ncase $srcdir in\n  .)  # No --srcdir option.  We are building in place.\n    ac_srcdir=.\n    if test -z \"$ac_top_builddir\"; then\n       ac_top_srcdir=.\n    else\n       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`\n    fi ;;\n  [\\\\/]* | ?:[\\\\/]* )  # Absolute path.\n    ac_srcdir=$srcdir$ac_dir_suffix;\n    ac_top_srcdir=$srcdir ;;\n  *) # Relative path.\n    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix\n    ac_top_srcdir=$ac_top_builddir$srcdir ;;\nesac\n\n# Do not use `cd foo && pwd` to compute absolute paths, because\n# the directories may not exist.\ncase `pwd` in\n.) ac_abs_builddir=\"$ac_dir\";;\n*)\n  case \"$ac_dir\" in\n  .) ac_abs_builddir=`pwd`;;\n  [\\\\/]* | ?:[\\\\/]* ) ac_abs_builddir=\"$ac_dir\";;\n  *) ac_abs_builddir=`pwd`/\"$ac_dir\";;\n  esac;;\nesac\ncase $ac_abs_builddir in\n.) ac_abs_top_builddir=${ac_top_builddir}.;;\n*)\n  case ${ac_top_builddir}. in\n  .) ac_abs_top_builddir=$ac_abs_builddir;;\n  [\\\\/]* | ?:[\\\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;\n  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;\n  esac;;\nesac\ncase $ac_abs_builddir in\n.) ac_abs_srcdir=$ac_srcdir;;\n*)\n  case $ac_srcdir in\n  .) ac_abs_srcdir=$ac_abs_builddir;;\n  [\\\\/]* | ?:[\\\\/]* ) ac_abs_srcdir=$ac_srcdir;;\n  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;\n  esac;;\nesac\ncase $ac_abs_builddir in\n.) ac_abs_top_srcdir=$ac_top_srcdir;;\n*)\n  case $ac_top_srcdir in\n  .) ac_abs_top_srcdir=$ac_abs_builddir;;\n  [\\\\/]* | ?:[\\\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;\n  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;\n  esac;;\nesac\n\n    cd $ac_dir\n    # Check for guested configure; otherwise get Cygnus style configure.\n    if test -f $ac_srcdir/configure.gnu; then\n      echo\n      $SHELL $ac_srcdir/configure.gnu  --help=recursive\n    elif test -f $ac_srcdir/configure; then\n      echo\n      $SHELL $ac_srcdir/configure  --help=recursive\n    elif test -f $ac_srcdir/configure.ac ||\n\t   test -f $ac_srcdir/configure.in; then\n      echo\n      $ac_configure --help\n    else\n      echo \"$as_me: WARNING: no configuration information is in $ac_dir\" >&2\n    fi\n    cd $ac_popdir\n  done\nfi\n\ntest -n \"$ac_init_help\" && exit 0\nif $ac_init_version; then\n  cat <<\\_ACEOF\nlpsolve configure 5.5.2.0\ngenerated by GNU Autoconf 2.59\n\nCopyright (C) 2003 Free Software Foundation, Inc.\nThis configure script is free software; the Free Software Foundation\ngives unlimited permission to copy, distribute and modify it.\n_ACEOF\n  exit 0\nfi\nexec 5>config.log\ncat >&5 <<_ACEOF\nThis file contains any messages produced by compilers while\nrunning configure, to aid debugging if configure makes a mistake.\n\nIt was created by lpsolve $as_me 5.5.2.0, which was\ngenerated by GNU Autoconf 2.59.  Invocation command line was\n\n  $ $0 $@\n\n_ACEOF\n{\ncat <<_ASUNAME\n## --------- ##\n## Platform. ##\n## --------- ##\n\nhostname = `(hostname || uname -n) 2>/dev/null | sed 1q`\nuname -m = `(uname -m) 2>/dev/null || echo unknown`\nuname -r = `(uname -r) 2>/dev/null || echo unknown`\nuname -s = `(uname -s) 2>/dev/null || echo unknown`\nuname -v = `(uname -v) 2>/dev/null || echo unknown`\n\n/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`\n/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`\n\n/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`\n/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`\n/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`\nhostinfo               = `(hostinfo) 2>/dev/null               || echo unknown`\n/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`\n/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`\n/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`\n\n_ASUNAME\n\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  echo \"PATH: $as_dir\"\ndone\n\n} >&5\n\ncat >&5 <<_ACEOF\n\n\n## ----------- ##\n## Core tests. ##\n## ----------- ##\n\n_ACEOF\n\n\n# Keep a trace of the command line.\n# Strip out --no-create and --no-recursion so they do not pile up.\n# Strip out --silent because we don't want to record it for future runs.\n# Also quote any args containing shell meta-characters.\n# Make two passes to allow for proper duplicate-argument suppression.\nac_configure_args=\nac_configure_args0=\nac_configure_args1=\nac_sep=\nac_must_keep_next=false\nfor ac_pass in 1 2\ndo\n  for ac_arg\n  do\n    case $ac_arg in\n    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;\n    -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n    | -silent | --silent | --silen | --sile | --sil)\n      continue ;;\n    *\" \"*|*\"\t\"*|*[\\[\\]\\~\\#\\$\\^\\&\\*\\(\\)\\{\\}\\\\\\|\\;\\<\\>\\?\\\"\\']*)\n      ac_arg=`echo \"$ac_arg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    esac\n    case $ac_pass in\n    1) ac_configure_args0=\"$ac_configure_args0 '$ac_arg'\" ;;\n    2)\n      ac_configure_args1=\"$ac_configure_args1 '$ac_arg'\"\n      if test $ac_must_keep_next = true; then\n\tac_must_keep_next=false # Got value, back to normal.\n      else\n\tcase $ac_arg in\n\t  *=* | --config-cache | -C | -disable-* | --disable-* \\\n\t  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \\\n\t  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \\\n\t  | -with-* | --with-* | -without-* | --without-* | --x)\n\t    case \"$ac_configure_args0 \" in\n\t      \"$ac_configure_args1\"*\" '$ac_arg' \"* ) continue ;;\n\t    esac\n\t    ;;\n\t  -* ) ac_must_keep_next=true ;;\n\tesac\n      fi\n      ac_configure_args=\"$ac_configure_args$ac_sep'$ac_arg'\"\n      # Get rid of the leading space.\n      ac_sep=\" \"\n      ;;\n    esac\n  done\ndone\n$as_unset ac_configure_args0 || test \"${ac_configure_args0+set}\" != set || { ac_configure_args0=; export ac_configure_args0; }\n$as_unset ac_configure_args1 || test \"${ac_configure_args1+set}\" != set || { ac_configure_args1=; export ac_configure_args1; }\n\n# When interrupted or exit'd, cleanup temporary files, and complete\n# config.log.  We remove comments because anyway the quotes in there\n# would cause problems or look ugly.\n# WARNING: Be sure not to use single quotes in there, as some shells,\n# such as our DU 5.0 friend, will then `close' the trap.\ntrap 'exit_status=$?\n  # Save into config.log some information that might help in debugging.\n  {\n    echo\n\n    cat <<\\_ASBOX\n## ---------------- ##\n## Cache variables. ##\n## ---------------- ##\n_ASBOX\n    echo\n    # The following way of writing the cache mishandles newlines in values,\n{\n  (set) 2>&1 |\n    case `(ac_space='\"'\"' '\"'\"'; set | grep ac_space) 2>&1` in\n    *ac_space=\\ *)\n      sed -n \\\n\t\"s/'\"'\"'/'\"'\"'\\\\\\\\'\"'\"''\"'\"'/g;\n\t  s/^\\\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\\\)=\\\\(.*\\\\)/\\\\1='\"'\"'\\\\2'\"'\"'/p\"\n      ;;\n    *)\n      sed -n \\\n\t\"s/^\\\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\\\)=\\\\(.*\\\\)/\\\\1=\\\\2/p\"\n      ;;\n    esac;\n}\n    echo\n\n    cat <<\\_ASBOX\n## ----------------- ##\n## Output variables. ##\n## ----------------- ##\n_ASBOX\n    echo\n    for ac_var in $ac_subst_vars\n    do\n      eval ac_val=$`echo $ac_var`\n      echo \"$ac_var='\"'\"'$ac_val'\"'\"'\"\n    done | sort\n    echo\n\n    if test -n \"$ac_subst_files\"; then\n      cat <<\\_ASBOX\n## ------------- ##\n## Output files. ##\n## ------------- ##\n_ASBOX\n      echo\n      for ac_var in $ac_subst_files\n      do\n\teval ac_val=$`echo $ac_var`\n\techo \"$ac_var='\"'\"'$ac_val'\"'\"'\"\n      done | sort\n      echo\n    fi\n\n    if test -s confdefs.h; then\n      cat <<\\_ASBOX\n## ----------- ##\n## confdefs.h. ##\n## ----------- ##\n_ASBOX\n      echo\n      sed \"/^$/d\" confdefs.h | sort\n      echo\n    fi\n    test \"$ac_signal\" != 0 &&\n      echo \"$as_me: caught signal $ac_signal\"\n    echo \"$as_me: exit $exit_status\"\n  } >&5\n  rm -f core *.core &&\n  rm -rf conftest* confdefs* conf$$* $ac_clean_files &&\n    exit $exit_status\n     ' 0\nfor ac_signal in 1 2 13 15; do\n  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal\ndone\nac_signal=0\n\n# confdefs.h avoids OS command line length limits that DEFS can exceed.\nrm -rf conftest* confdefs.h\n# AIX cpp loses on an empty file, so make sure it contains at least a newline.\necho >confdefs.h\n\n# Predefined preprocessor variables.\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_NAME \"$PACKAGE_NAME\"\n_ACEOF\n\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"\n_ACEOF\n\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_VERSION \"$PACKAGE_VERSION\"\n_ACEOF\n\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_STRING \"$PACKAGE_STRING\"\n_ACEOF\n\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"\n_ACEOF\n\n\n# Let the site file select an alternate cache file if it wants to.\n# Prefer explicitly selected file to automatically selected ones.\nif test -z \"$CONFIG_SITE\"; then\n  if test \"x$prefix\" != xNONE; then\n    CONFIG_SITE=\"$prefix/share/config.site $prefix/etc/config.site\"\n  else\n    CONFIG_SITE=\"$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site\"\n  fi\nfi\nfor ac_site_file in $CONFIG_SITE; do\n  if test -r \"$ac_site_file\"; then\n    { echo \"$as_me:$LINENO: loading site script $ac_site_file\" >&5\necho \"$as_me: loading site script $ac_site_file\" >&6;}\n    sed 's/^/| /' \"$ac_site_file\" >&5\n    . \"$ac_site_file\"\n  fi\ndone\n\nif test -r \"$cache_file\"; then\n  # Some versions of bash will fail to source /dev/null (special\n  # files actually), so we avoid doing that.\n  if test -f \"$cache_file\"; then\n    { echo \"$as_me:$LINENO: loading cache $cache_file\" >&5\necho \"$as_me: loading cache $cache_file\" >&6;}\n    case $cache_file in\n      [\\\\/]* | ?:[\\\\/]* ) . $cache_file;;\n      *)                      . ./$cache_file;;\n    esac\n  fi\nelse\n  { echo \"$as_me:$LINENO: creating cache $cache_file\" >&5\necho \"$as_me: creating cache $cache_file\" >&6;}\n  >$cache_file\nfi\n\n# Check that the precious variables saved in the cache have kept the same\n# value.\nac_cache_corrupted=false\nfor ac_var in `(set) 2>&1 |\n\t       sed -n 's/^ac_env_\\([a-zA-Z_0-9]*\\)_set=.*/\\1/p'`; do\n  eval ac_old_set=\\$ac_cv_env_${ac_var}_set\n  eval ac_new_set=\\$ac_env_${ac_var}_set\n  eval ac_old_val=\"\\$ac_cv_env_${ac_var}_value\"\n  eval ac_new_val=\"\\$ac_env_${ac_var}_value\"\n  case $ac_old_set,$ac_new_set in\n    set,)\n      { echo \"$as_me:$LINENO: error: \\`$ac_var' was set to \\`$ac_old_val' in the previous run\" >&5\necho \"$as_me: error: \\`$ac_var' was set to \\`$ac_old_val' in the previous run\" >&2;}\n      ac_cache_corrupted=: ;;\n    ,set)\n      { echo \"$as_me:$LINENO: error: \\`$ac_var' was not set in the previous run\" >&5\necho \"$as_me: error: \\`$ac_var' was not set in the previous run\" >&2;}\n      ac_cache_corrupted=: ;;\n    ,);;\n    *)\n      if test \"x$ac_old_val\" != \"x$ac_new_val\"; then\n\t{ echo \"$as_me:$LINENO: error: \\`$ac_var' has changed since the previous run:\" >&5\necho \"$as_me: error: \\`$ac_var' has changed since the previous run:\" >&2;}\n\t{ echo \"$as_me:$LINENO:   former value:  $ac_old_val\" >&5\necho \"$as_me:   former value:  $ac_old_val\" >&2;}\n\t{ echo \"$as_me:$LINENO:   current value: $ac_new_val\" >&5\necho \"$as_me:   current value: $ac_new_val\" >&2;}\n\tac_cache_corrupted=:\n      fi;;\n  esac\n  # Pass precious variables to config.status.\n  if test \"$ac_new_set\" = set; then\n    case $ac_new_val in\n    *\" \"*|*\"\t\"*|*[\\[\\]\\~\\#\\$\\^\\&\\*\\(\\)\\{\\}\\\\\\|\\;\\<\\>\\?\\\"\\']*)\n      ac_arg=$ac_var=`echo \"$ac_new_val\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    *) ac_arg=$ac_var=$ac_new_val ;;\n    esac\n    case \" $ac_configure_args \" in\n      *\" '$ac_arg' \"*) ;; # Avoid dups.  Use of quotes ensures accuracy.\n      *) ac_configure_args=\"$ac_configure_args '$ac_arg'\" ;;\n    esac\n  fi\ndone\nif $ac_cache_corrupted; then\n  { echo \"$as_me:$LINENO: error: changes in the environment can compromise the build\" >&5\necho \"$as_me: error: changes in the environment can compromise the build\" >&2;}\n  { { echo \"$as_me:$LINENO: error: run \\`make distclean' and/or \\`rm $cache_file' and start over\" >&5\necho \"$as_me: error: run \\`make distclean' and/or \\`rm $cache_file' and start over\" >&2;}\n   { (exit 1); exit 1; }; }\nfi\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\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\nac_aux_dir=\nfor ac_dir in $srcdir $srcdir/.. $srcdir/../..; do\n  if test -f $ac_dir/install-sh; then\n    ac_aux_dir=$ac_dir\n    ac_install_sh=\"$ac_aux_dir/install-sh -c\"\n    break\n  elif test -f $ac_dir/install.sh; then\n    ac_aux_dir=$ac_dir\n    ac_install_sh=\"$ac_aux_dir/install.sh -c\"\n    break\n  elif test -f $ac_dir/shtool; then\n    ac_aux_dir=$ac_dir\n    ac_install_sh=\"$ac_aux_dir/shtool install -c\"\n    break\n  fi\ndone\nif test -z \"$ac_aux_dir\"; then\n  { { echo \"$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../..\" >&5\necho \"$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../..\" >&2;}\n   { (exit 1); exit 1; }; }\nfi\nac_config_guess=\"$SHELL $ac_aux_dir/config.guess\"\nac_config_sub=\"$SHELL $ac_aux_dir/config.sub\"\nac_configure=\"$SHELL $ac_aux_dir/configure\" # This should be Cygnus configure.\n\n# Make sure we can run config.sub.\n$ac_config_sub sun4 >/dev/null 2>&1 ||\n  { { echo \"$as_me:$LINENO: error: cannot run $ac_config_sub\" >&5\necho \"$as_me: error: cannot run $ac_config_sub\" >&2;}\n   { (exit 1); exit 1; }; }\n\necho \"$as_me:$LINENO: checking build system type\" >&5\necho $ECHO_N \"checking build system type... $ECHO_C\" >&6\nif test \"${ac_cv_build+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  ac_cv_build_alias=$build_alias\ntest -z \"$ac_cv_build_alias\" &&\n  ac_cv_build_alias=`$ac_config_guess`\ntest -z \"$ac_cv_build_alias\" &&\n  { { echo \"$as_me:$LINENO: error: cannot guess build type; you must specify one\" >&5\necho \"$as_me: error: cannot guess build type; you must specify one\" >&2;}\n   { (exit 1); exit 1; }; }\nac_cv_build=`$ac_config_sub $ac_cv_build_alias` ||\n  { { echo \"$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed\" >&5\necho \"$as_me: error: $ac_config_sub $ac_cv_build_alias failed\" >&2;}\n   { (exit 1); exit 1; }; }\n\nfi\necho \"$as_me:$LINENO: result: $ac_cv_build\" >&5\necho \"${ECHO_T}$ac_cv_build\" >&6\nbuild=$ac_cv_build\nbuild_cpu=`echo $ac_cv_build | sed 's/^\\([^-]*\\)-\\([^-]*\\)-\\(.*\\)$/\\1/'`\nbuild_vendor=`echo $ac_cv_build | sed 's/^\\([^-]*\\)-\\([^-]*\\)-\\(.*\\)$/\\2/'`\nbuild_os=`echo $ac_cv_build | sed 's/^\\([^-]*\\)-\\([^-]*\\)-\\(.*\\)$/\\3/'`\n\n\necho \"$as_me:$LINENO: checking host system type\" >&5\necho $ECHO_N \"checking host system type... $ECHO_C\" >&6\nif test \"${ac_cv_host+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  ac_cv_host_alias=$host_alias\ntest -z \"$ac_cv_host_alias\" &&\n  ac_cv_host_alias=$ac_cv_build_alias\nac_cv_host=`$ac_config_sub $ac_cv_host_alias` ||\n  { { echo \"$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed\" >&5\necho \"$as_me: error: $ac_config_sub $ac_cv_host_alias failed\" >&2;}\n   { (exit 1); exit 1; }; }\n\nfi\necho \"$as_me:$LINENO: result: $ac_cv_host\" >&5\necho \"${ECHO_T}$ac_cv_host\" >&6\nhost=$ac_cv_host\nhost_cpu=`echo $ac_cv_host | sed 's/^\\([^-]*\\)-\\([^-]*\\)-\\(.*\\)$/\\1/'`\nhost_vendor=`echo $ac_cv_host | sed 's/^\\([^-]*\\)-\\([^-]*\\)-\\(.*\\)$/\\2/'`\nhost_os=`echo $ac_cv_host | sed 's/^\\([^-]*\\)-\\([^-]*\\)-\\(.*\\)$/\\3/'`\n\n\n\nSHARED_LIB=liblpsolve55.so\nSO=.so\ncase $host_os in\n  hp*|HP*)\n    DEF=-ldld\n    case `uname -m` in\n      ia64) SO=.so;;\n      *)    SO=.sl;;\n    esac\n    if test \"$GCC\" = yes;\n      then CCSHARED=\"-fPIC\";\n      else CCSHARED=\"+z\";\n    fi;;\n  CYGWIN*)\n    SO=.dll;;\n  linux)\n    CCSHARED=\"-fPIC\";;\n  apple-darwin)\n    DEF=-ldl -idirafter /usr/include/sys -DINTEGERTIME -Wno-long-double\n    ;;\n  OpenUNIX*|UnixWare*)\n    DEF='-dy -DNOLONGLONG'\n    if test \"$GCC\" = \"yes\"\n      then CCSHARED=\"-fPIC\"\n      else CCSHARED=\"-K PIC\"\n    fi;;\n  SCO_SV*)\n    DEF='-dy -DNOLONGLONG'\n    if test \"$GCC\" = \"yes\"\n      then CCSHARED=\"-fPIC\"\n      else CCSHARED=\"-Kpic -belf\"\n    fi;;\n *)\nesac\n\n\n\n\n\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}gcc\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}gcc; ac_word=$2\necho \"$as_me:$LINENO: checking for $ac_word\" >&5\necho $ECHO_N \"checking for $ac_word... $ECHO_C\" >&6\nif test \"${ac_cv_prog_CC+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for ac_exec_ext in '' $ac_executable_extensions; do\n  if $as_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CC=\"${ac_tool_prefix}gcc\"\n    echo \"$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\ndone\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  echo \"$as_me:$LINENO: result: $CC\" >&5\necho \"${ECHO_T}$CC\" >&6\nelse\n  echo \"$as_me:$LINENO: result: no\" >&5\necho \"${ECHO_T}no\" >&6\nfi\n\nfi\nif test -z \"$ac_cv_prog_CC\"; then\n  ac_ct_CC=$CC\n  # Extract the first word of \"gcc\", so it can be a program name with args.\nset dummy gcc; ac_word=$2\necho \"$as_me:$LINENO: checking for $ac_word\" >&5\necho $ECHO_N \"checking for $ac_word... $ECHO_C\" >&6\nif test \"${ac_cv_prog_ac_ct_CC+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  if test -n \"$ac_ct_CC\"; then\n  ac_cv_prog_ac_ct_CC=\"$ac_ct_CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for ac_exec_ext in '' $ac_executable_extensions; do\n  if $as_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_CC=\"gcc\"\n    echo \"$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\ndone\n\nfi\nfi\nac_ct_CC=$ac_cv_prog_ac_ct_CC\nif test -n \"$ac_ct_CC\"; then\n  echo \"$as_me:$LINENO: result: $ac_ct_CC\" >&5\necho \"${ECHO_T}$ac_ct_CC\" >&6\nelse\n  echo \"$as_me:$LINENO: result: no\" >&5\necho \"${ECHO_T}no\" >&6\nfi\n\n  CC=$ac_ct_CC\nelse\n  CC=\"$ac_cv_prog_CC\"\nfi\n\nif test -z \"$CC\"; then\n  if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}cc\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}cc; ac_word=$2\necho \"$as_me:$LINENO: checking for $ac_word\" >&5\necho $ECHO_N \"checking for $ac_word... $ECHO_C\" >&6\nif test \"${ac_cv_prog_CC+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for ac_exec_ext in '' $ac_executable_extensions; do\n  if $as_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CC=\"${ac_tool_prefix}cc\"\n    echo \"$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\ndone\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  echo \"$as_me:$LINENO: result: $CC\" >&5\necho \"${ECHO_T}$CC\" >&6\nelse\n  echo \"$as_me:$LINENO: result: no\" >&5\necho \"${ECHO_T}no\" >&6\nfi\n\nfi\nif test -z \"$ac_cv_prog_CC\"; then\n  ac_ct_CC=$CC\n  # Extract the first word of \"cc\", so it can be a program name with args.\nset dummy cc; ac_word=$2\necho \"$as_me:$LINENO: checking for $ac_word\" >&5\necho $ECHO_N \"checking for $ac_word... $ECHO_C\" >&6\nif test \"${ac_cv_prog_ac_ct_CC+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  if test -n \"$ac_ct_CC\"; then\n  ac_cv_prog_ac_ct_CC=\"$ac_ct_CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for ac_exec_ext in '' $ac_executable_extensions; do\n  if $as_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_CC=\"cc\"\n    echo \"$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\ndone\n\nfi\nfi\nac_ct_CC=$ac_cv_prog_ac_ct_CC\nif test -n \"$ac_ct_CC\"; then\n  echo \"$as_me:$LINENO: result: $ac_ct_CC\" >&5\necho \"${ECHO_T}$ac_ct_CC\" >&6\nelse\n  echo \"$as_me:$LINENO: result: no\" >&5\necho \"${ECHO_T}no\" >&6\nfi\n\n  CC=$ac_ct_CC\nelse\n  CC=\"$ac_cv_prog_CC\"\nfi\n\nfi\nif test -z \"$CC\"; then\n  # Extract the first word of \"cc\", so it can be a program name with args.\nset dummy cc; ac_word=$2\necho \"$as_me:$LINENO: checking for $ac_word\" >&5\necho $ECHO_N \"checking for $ac_word... $ECHO_C\" >&6\nif test \"${ac_cv_prog_CC+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\n  ac_prog_rejected=no\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for ac_exec_ext in '' $ac_executable_extensions; do\n  if $as_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    if test \"$as_dir/$ac_word$ac_exec_ext\" = \"/usr/ucb/cc\"; then\n       ac_prog_rejected=yes\n       continue\n     fi\n    ac_cv_prog_CC=\"cc\"\n    echo \"$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\ndone\n\nif test $ac_prog_rejected = yes; then\n  # We found a bogon in the path, so make sure we never use it.\n  set dummy $ac_cv_prog_CC\n  shift\n  if test $# != 0; then\n    # We chose a different compiler from the bogus one.\n    # However, it has the same basename, so the bogon will be chosen\n    # first if we set CC to just the basename; use the full file name.\n    shift\n    ac_cv_prog_CC=\"$as_dir/$ac_word${1+' '}$@\"\n  fi\nfi\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  echo \"$as_me:$LINENO: result: $CC\" >&5\necho \"${ECHO_T}$CC\" >&6\nelse\n  echo \"$as_me:$LINENO: result: no\" >&5\necho \"${ECHO_T}no\" >&6\nfi\n\nfi\nif test -z \"$CC\"; then\n  if test -n \"$ac_tool_prefix\"; then\n  for ac_prog in cl\n  do\n    # Extract the first word of \"$ac_tool_prefix$ac_prog\", so it can be a program name with args.\nset dummy $ac_tool_prefix$ac_prog; ac_word=$2\necho \"$as_me:$LINENO: checking for $ac_word\" >&5\necho $ECHO_N \"checking for $ac_word... $ECHO_C\" >&6\nif test \"${ac_cv_prog_CC+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for ac_exec_ext in '' $ac_executable_extensions; do\n  if $as_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CC=\"$ac_tool_prefix$ac_prog\"\n    echo \"$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\ndone\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  echo \"$as_me:$LINENO: result: $CC\" >&5\necho \"${ECHO_T}$CC\" >&6\nelse\n  echo \"$as_me:$LINENO: result: no\" >&5\necho \"${ECHO_T}no\" >&6\nfi\n\n    test -n \"$CC\" && break\n  done\nfi\nif test -z \"$CC\"; then\n  ac_ct_CC=$CC\n  for ac_prog in cl\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\necho \"$as_me:$LINENO: checking for $ac_word\" >&5\necho $ECHO_N \"checking for $ac_word... $ECHO_C\" >&6\nif test \"${ac_cv_prog_ac_ct_CC+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  if test -n \"$ac_ct_CC\"; then\n  ac_cv_prog_ac_ct_CC=\"$ac_ct_CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for ac_exec_ext in '' $ac_executable_extensions; do\n  if $as_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_CC=\"$ac_prog\"\n    echo \"$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\ndone\n\nfi\nfi\nac_ct_CC=$ac_cv_prog_ac_ct_CC\nif test -n \"$ac_ct_CC\"; then\n  echo \"$as_me:$LINENO: result: $ac_ct_CC\" >&5\necho \"${ECHO_T}$ac_ct_CC\" >&6\nelse\n  echo \"$as_me:$LINENO: result: no\" >&5\necho \"${ECHO_T}no\" >&6\nfi\n\n  test -n \"$ac_ct_CC\" && break\ndone\n\n  CC=$ac_ct_CC\nfi\n\nfi\n\n\ntest -z \"$CC\" && { { echo \"$as_me:$LINENO: error: no acceptable C compiler found in \\$PATH\nSee \\`config.log' for more details.\" >&5\necho \"$as_me: error: no acceptable C compiler found in \\$PATH\nSee \\`config.log' for more details.\" >&2;}\n   { (exit 1); exit 1; }; }\n\n# Provide some information about the compiler.\necho \"$as_me:$LINENO:\" \\\n     \"checking for C compiler version\" >&5\nac_compiler=`set X $ac_compile; echo $2`\n{ (eval echo \"$as_me:$LINENO: \\\"$ac_compiler --version </dev/null >&5\\\"\") >&5\n  (eval $ac_compiler --version </dev/null >&5) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }\n{ (eval echo \"$as_me:$LINENO: \\\"$ac_compiler -v </dev/null >&5\\\"\") >&5\n  (eval $ac_compiler -v </dev/null >&5) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }\n{ (eval echo \"$as_me:$LINENO: \\\"$ac_compiler -V </dev/null >&5\\\"\") >&5\n  (eval $ac_compiler -V </dev/null >&5) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }\n\ncat >conftest.$ac_ext <<_ACEOF\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nac_clean_files_save=$ac_clean_files\nac_clean_files=\"$ac_clean_files a.out a.exe b.out\"\n# Try to create an executable without -o first, disregard a.out.\n# It will help us diagnose broken compilers, and finding out an intuition\n# of exeext.\necho \"$as_me:$LINENO: checking for C compiler default output file name\" >&5\necho $ECHO_N \"checking for C compiler default output file name... $ECHO_C\" >&6\nac_link_default=`echo \"$ac_link\" | sed 's/ -o *conftest[^ ]*//'`\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_link_default\\\"\") >&5\n  (eval $ac_link_default) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; then\n  # Find the output, starting from the most likely.  This scheme is\n# not robust to junk in `.', hence go to wildcards (a.*) only as a last\n# resort.\n\n# Be careful to initialize this variable, since it used to be cached.\n# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.\nac_cv_exeext=\n# b.out is created by i960 compilers.\nfor ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out\ndo\n  test -f \"$ac_file\" || continue\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )\n\t;;\n    conftest.$ac_ext )\n\t# This is the source file.\n\t;;\n    [ab].out )\n\t# We found the default executable, but exeext='' is most\n\t# certainly right.\n\tbreak;;\n    *.* )\n\tac_cv_exeext=`expr \"$ac_file\" : '[^.]*\\(\\..*\\)'`\n\t# FIXME: I believe we export ac_cv_exeext for Libtool,\n\t# but it would be cool to find out if it's true.  Does anybody\n\t# maintain Libtool? --akim.\n\texport ac_cv_exeext\n\tbreak;;\n    * )\n\tbreak;;\n  esac\ndone\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n{ { echo \"$as_me:$LINENO: error: C compiler cannot create executables\nSee \\`config.log' for more details.\" >&5\necho \"$as_me: error: C compiler cannot create executables\nSee \\`config.log' for more details.\" >&2;}\n   { (exit 77); exit 77; }; }\nfi\n\nac_exeext=$ac_cv_exeext\necho \"$as_me:$LINENO: result: $ac_file\" >&5\necho \"${ECHO_T}$ac_file\" >&6\n\n# Check the compiler produces executables we can run.  If not, either\n# the compiler is broken, or we cross compile.\necho \"$as_me:$LINENO: checking whether the C compiler works\" >&5\necho $ECHO_N \"checking whether the C compiler works... $ECHO_C\" >&6\n# FIXME: These cross compiler hacks should be removed for Autoconf 3.0\n# If not cross compiling, check that we can run a simple program.\nif test \"$cross_compiling\" != yes; then\n  if { ac_try='./$ac_file'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n    cross_compiling=no\n  else\n    if test \"$cross_compiling\" = maybe; then\n\tcross_compiling=yes\n    else\n\t{ { echo \"$as_me:$LINENO: error: cannot run C compiled programs.\nIf you meant to cross compile, use \\`--host'.\nSee \\`config.log' for more details.\" >&5\necho \"$as_me: error: cannot run C compiled programs.\nIf you meant to cross compile, use \\`--host'.\nSee \\`config.log' for more details.\" >&2;}\n   { (exit 1); exit 1; }; }\n    fi\n  fi\nfi\necho \"$as_me:$LINENO: result: yes\" >&5\necho \"${ECHO_T}yes\" >&6\n\nrm -f a.out a.exe conftest$ac_cv_exeext b.out\nac_clean_files=$ac_clean_files_save\n# Check the compiler produces executables we can run.  If not, either\n# the compiler is broken, or we cross compile.\necho \"$as_me:$LINENO: checking whether we are cross compiling\" >&5\necho $ECHO_N \"checking whether we are cross compiling... $ECHO_C\" >&6\necho \"$as_me:$LINENO: result: $cross_compiling\" >&5\necho \"${ECHO_T}$cross_compiling\" >&6\n\necho \"$as_me:$LINENO: checking for suffix of executables\" >&5\necho $ECHO_N \"checking for suffix of executables... $ECHO_C\" >&6\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_link\\\"\") >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; then\n  # If both `conftest.exe' and `conftest' are `present' (well, observable)\n# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will\n# work properly (i.e., refer to `conftest.exe'), while it won't with\n# `rm'.\nfor ac_file in conftest.exe conftest conftest.*; do\n  test -f \"$ac_file\" || continue\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;\n    *.* ) ac_cv_exeext=`expr \"$ac_file\" : '[^.]*\\(\\..*\\)'`\n\t  export ac_cv_exeext\n\t  break;;\n    * ) break;;\n  esac\ndone\nelse\n  { { echo \"$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link\nSee \\`config.log' for more details.\" >&5\necho \"$as_me: error: cannot compute suffix of executables: cannot compile and link\nSee \\`config.log' for more details.\" >&2;}\n   { (exit 1); exit 1; }; }\nfi\n\nrm -f conftest$ac_cv_exeext\necho \"$as_me:$LINENO: result: $ac_cv_exeext\" >&5\necho \"${ECHO_T}$ac_cv_exeext\" >&6\n\nrm -f conftest.$ac_ext\nEXEEXT=$ac_cv_exeext\nac_exeext=$EXEEXT\necho \"$as_me:$LINENO: checking for suffix of object files\" >&5\necho $ECHO_N \"checking for suffix of object files... $ECHO_C\" >&6\nif test \"${ac_cv_objext+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.o conftest.obj\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; then\n  for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;\n    *) ac_cv_objext=`expr \"$ac_file\" : '.*\\.\\(.*\\)'`\n       break;;\n  esac\ndone\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n{ { echo \"$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile\nSee \\`config.log' for more details.\" >&5\necho \"$as_me: error: cannot compute suffix of object files: cannot compile\nSee \\`config.log' for more details.\" >&2;}\n   { (exit 1); exit 1; }; }\nfi\n\nrm -f conftest.$ac_cv_objext conftest.$ac_ext\nfi\necho \"$as_me:$LINENO: result: $ac_cv_objext\" >&5\necho \"${ECHO_T}$ac_cv_objext\" >&6\nOBJEXT=$ac_cv_objext\nac_objext=$OBJEXT\necho \"$as_me:$LINENO: checking whether we are using the GNU C compiler\" >&5\necho $ECHO_N \"checking whether we are using the GNU C compiler... $ECHO_C\" >&6\nif test \"${ac_cv_c_compiler_gnu+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n#ifndef __GNUC__\n       choke me\n#endif\n\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>conftest.er1\n  ac_status=$?\n  grep -v '^ *+' conftest.er1 >conftest.err\n  rm -f conftest.er1\n  cat conftest.err >&5\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n\t { ac_try='test -z \"$ac_c_werror_flag\"\n\t\t\t || test ! -s conftest.err'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; } &&\n\t { ac_try='test -s conftest.$ac_objext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_compiler_gnu=yes\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\nac_compiler_gnu=no\nfi\nrm -f conftest.err conftest.$ac_objext conftest.$ac_ext\nac_cv_c_compiler_gnu=$ac_compiler_gnu\n\nfi\necho \"$as_me:$LINENO: result: $ac_cv_c_compiler_gnu\" >&5\necho \"${ECHO_T}$ac_cv_c_compiler_gnu\" >&6\nGCC=`test $ac_compiler_gnu = yes && echo yes`\nac_test_CFLAGS=${CFLAGS+set}\nac_save_CFLAGS=$CFLAGS\nCFLAGS=\"-g\"\necho \"$as_me:$LINENO: checking whether $CC accepts -g\" >&5\necho $ECHO_N \"checking whether $CC accepts -g... $ECHO_C\" >&6\nif test \"${ac_cv_prog_cc_g+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>conftest.er1\n  ac_status=$?\n  grep -v '^ *+' conftest.er1 >conftest.err\n  rm -f conftest.er1\n  cat conftest.err >&5\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n\t { ac_try='test -z \"$ac_c_werror_flag\"\n\t\t\t || test ! -s conftest.err'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; } &&\n\t { ac_try='test -s conftest.$ac_objext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_prog_cc_g=yes\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\nac_cv_prog_cc_g=no\nfi\nrm -f conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\necho \"$as_me:$LINENO: result: $ac_cv_prog_cc_g\" >&5\necho \"${ECHO_T}$ac_cv_prog_cc_g\" >&6\nif test \"$ac_test_CFLAGS\" = set; then\n  CFLAGS=$ac_save_CFLAGS\nelif test $ac_cv_prog_cc_g = yes; then\n  if test \"$GCC\" = yes; then\n    CFLAGS=\"-g -O2\"\n  else\n    CFLAGS=\"-g\"\n  fi\nelse\n  if test \"$GCC\" = yes; then\n    CFLAGS=\"-O2\"\n  else\n    CFLAGS=\n  fi\nfi\necho \"$as_me:$LINENO: checking for $CC option to accept ANSI C\" >&5\necho $ECHO_N \"checking for $CC option to accept ANSI C... $ECHO_C\" >&6\nif test \"${ac_cv_prog_cc_stdc+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  ac_cv_prog_cc_stdc=no\nac_save_CC=$CC\ncat >conftest.$ac_ext <<_ACEOF\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n#include <stdarg.h>\n#include <stdio.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */\nstruct buf { int x; };\nFILE * (*rcsopen) (struct buf *, struct stat *, int);\nstatic char *e (p, i)\n     char **p;\n     int i;\n{\n  return p[i];\n}\nstatic char *f (char * (*g) (char **, int), char **p, ...)\n{\n  char *s;\n  va_list v;\n  va_start (v,p);\n  s = g (p, va_arg (v,int));\n  va_end (v);\n  return s;\n}\n\n/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has\n   function prototypes and stuff, but not '\\xHH' hex character constants.\n   These don't provoke an error unfortunately, instead are silently treated\n   as 'x'.  The following induces an error, until -std1 is added to get\n   proper ANSI mode.  Curiously '\\x00'!='x' always comes out true, for an\n   array size at least.  It's necessary to write '\\x00'==0 to get something\n   that's true only with -std1.  */\nint osf4_cc_array ['\\x00' == 0 ? 1 : -1];\n\nint test (int i, double x);\nstruct s1 {int (*f) (int a);};\nstruct s2 {int (*f) (double a);};\nint pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);\nint argc;\nchar **argv;\nint\nmain ()\n{\nreturn f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];\n  ;\n  return 0;\n}\n_ACEOF\n# Don't try gcc -ansi; that turns off useful extensions and\n# breaks some systems' header files.\n# AIX\t\t\t-qlanglvl=ansi\n# Ultrix and OSF/1\t-std1\n# HP-UX 10.20 and later\t-Ae\n# HP-UX older versions\t-Aa -D_HPUX_SOURCE\n# SVR4\t\t\t-Xc -D__EXTENSIONS__\nfor ac_arg in \"\" -qlanglvl=ansi -std1 -Ae \"-Aa -D_HPUX_SOURCE\" \"-Xc -D__EXTENSIONS__\"\ndo\n  CC=\"$ac_save_CC $ac_arg\"\n  rm -f conftest.$ac_objext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>conftest.er1\n  ac_status=$?\n  grep -v '^ *+' conftest.er1 >conftest.err\n  rm -f conftest.er1\n  cat conftest.err >&5\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n\t { ac_try='test -z \"$ac_c_werror_flag\"\n\t\t\t || test ! -s conftest.err'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; } &&\n\t { ac_try='test -s conftest.$ac_objext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_prog_cc_stdc=$ac_arg\nbreak\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\nfi\nrm -f conftest.err conftest.$ac_objext\ndone\nrm -f conftest.$ac_ext conftest.$ac_objext\nCC=$ac_save_CC\n\nfi\n\ncase \"x$ac_cv_prog_cc_stdc\" in\n  x|xno)\n    echo \"$as_me:$LINENO: result: none needed\" >&5\necho \"${ECHO_T}none needed\" >&6 ;;\n  *)\n    echo \"$as_me:$LINENO: result: $ac_cv_prog_cc_stdc\" >&5\necho \"${ECHO_T}$ac_cv_prog_cc_stdc\" >&6\n    CC=\"$CC $ac_cv_prog_cc_stdc\" ;;\nesac\n\n# Some people use a C++ compiler to compile C.  Since we use `exit',\n# in C++ we need to declare it.  In case someone uses the same compiler\n# for both compiling C and C++ we need to have the C++ compiler decide\n# the declaration of exit, since it's the most demanding environment.\ncat >conftest.$ac_ext <<_ACEOF\n#ifndef __cplusplus\n  choke me\n#endif\n_ACEOF\nrm -f conftest.$ac_objext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>conftest.er1\n  ac_status=$?\n  grep -v '^ *+' conftest.er1 >conftest.err\n  rm -f conftest.er1\n  cat conftest.err >&5\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n\t { ac_try='test -z \"$ac_c_werror_flag\"\n\t\t\t || test ! -s conftest.err'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; } &&\n\t { ac_try='test -s conftest.$ac_objext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  for ac_declaration in \\\n   '' \\\n   'extern \"C\" void std::exit (int) throw (); using std::exit;' \\\n   'extern \"C\" void std::exit (int); using std::exit;' \\\n   'extern \"C\" void exit (int) throw ();' \\\n   'extern \"C\" void exit (int);' \\\n   'void exit (int);'\ndo\n  cat >conftest.$ac_ext <<_ACEOF\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n$ac_declaration\n#include <stdlib.h>\nint\nmain ()\n{\nexit (42);\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>conftest.er1\n  ac_status=$?\n  grep -v '^ *+' conftest.er1 >conftest.err\n  rm -f conftest.er1\n  cat conftest.err >&5\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n\t { ac_try='test -z \"$ac_c_werror_flag\"\n\t\t\t || test ! -s conftest.err'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; } &&\n\t { ac_try='test -s conftest.$ac_objext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  :\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\ncontinue\nfi\nrm -f conftest.err conftest.$ac_objext conftest.$ac_ext\n  cat >conftest.$ac_ext <<_ACEOF\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n$ac_declaration\nint\nmain ()\n{\nexit (42);\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>conftest.er1\n  ac_status=$?\n  grep -v '^ *+' conftest.er1 >conftest.err\n  rm -f conftest.er1\n  cat conftest.err >&5\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n\t { ac_try='test -z \"$ac_c_werror_flag\"\n\t\t\t || test ! -s conftest.err'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; } &&\n\t { ac_try='test -s conftest.$ac_objext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  break\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\nfi\nrm -f conftest.err conftest.$ac_objext conftest.$ac_ext\ndone\nrm -f conftest*\nif test -n \"$ac_declaration\"; then\n  echo '#ifdef __cplusplus' >>confdefs.h\n  echo $ac_declaration      >>confdefs.h\n  echo '#endif'             >>confdefs.h\nfi\n\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\nfi\nrm -f conftest.err conftest.$ac_objext conftest.$ac_ext\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\nif test \"x$GCC\" != \"xyes\"\nthen\n  echo \"*** non GNU CC compiler detected.\"\n  echo \"*** This package has not been tested very well with non GNU compilers\"\nfi\n\n# Find a good install program.  We prefer a C program (faster),\n# so one script is as good as another.  But avoid the broken or\n# incompatible versions:\n# SysV /etc/install, /usr/sbin/install\n# SunOS /usr/etc/install\n# IRIX /sbin/install\n# AIX /bin/install\n# AmigaOS /C/install, which installs bootblocks on floppy discs\n# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag\n# AFS /usr/afsws/bin/install, which mishandles nonexistent args\n# SVR4 /usr/ucb/install, which tries to use the nonexistent group \"staff\"\n# OS/2's system install, which has a completely different semantic\n# ./install, which can be erroneously created by make from ./install.sh.\necho \"$as_me:$LINENO: checking for a BSD-compatible install\" >&5\necho $ECHO_N \"checking for a BSD-compatible install... $ECHO_C\" >&6\nif test -z \"$INSTALL\"; then\nif test \"${ac_cv_path_install+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  # Account for people who put trailing slashes in PATH elements.\ncase $as_dir/ in\n  ./ | .// | /cC/* | \\\n  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \\\n  ?:\\\\/os2\\\\/install\\\\/* | ?:\\\\/OS2\\\\/INSTALL\\\\/* | \\\n  /usr/ucb/* ) ;;\n  *)\n    # OSF1 and SCO ODT 3.0 have their own names for install.\n    # Don't use installbsd from OSF since it installs stuff as root\n    # by default.\n    for ac_prog in ginstall scoinst install; do\n      for ac_exec_ext in '' $ac_executable_extensions; do\n\tif $as_executable_p \"$as_dir/$ac_prog$ac_exec_ext\"; then\n\t  if test $ac_prog = install &&\n\t    grep dspmsg \"$as_dir/$ac_prog$ac_exec_ext\" >/dev/null 2>&1; then\n\t    # AIX install.  It has an incompatible calling convention.\n\t    :\n\t  elif test $ac_prog = install &&\n\t    grep pwplus \"$as_dir/$ac_prog$ac_exec_ext\" >/dev/null 2>&1; then\n\t    # program-specific install script used by HP pwplus--don't use.\n\t    :\n\t  else\n\t    ac_cv_path_install=\"$as_dir/$ac_prog$ac_exec_ext -c\"\n\t    break 3\n\t  fi\n\tfi\n      done\n    done\n    ;;\nesac\ndone\n\n\nfi\n  if test \"${ac_cv_path_install+set}\" = set; then\n    INSTALL=$ac_cv_path_install\n  else\n    # As a last resort, use the slow shell script.  We don't cache a\n    # path for INSTALL within a source directory, because that will\n    # break other packages using the cache if that directory is\n    # removed, or if the path is relative.\n    INSTALL=$ac_install_sh\n  fi\nfi\necho \"$as_me:$LINENO: result: $INSTALL\" >&5\necho \"${ECHO_T}$INSTALL\" >&6\n\n# Use test -z because SunOS4 sh mishandles braces in ${var-val}.\n# It thinks the first close brace ends the variable substitution.\ntest -z \"$INSTALL_PROGRAM\" && INSTALL_PROGRAM='${INSTALL}'\n\ntest -z \"$INSTALL_SCRIPT\" && INSTALL_SCRIPT='${INSTALL}'\n\ntest -z \"$INSTALL_DATA\" && INSTALL_DATA='${INSTALL} -m 644'\n\n          ac_config_files=\"$ac_config_files Makefile\"\n\ncat >confcache <<\\_ACEOF\n# This file is a shell script that caches the results of configure\n# tests run on this system so they can be shared between configure\n# scripts and configure runs, see configure's option --config-cache.\n# It is not useful on other systems.  If it contains results you don't\n# want to keep, you may remove or edit it.\n#\n# config.status only pays attention to the cache file if you give it\n# the --recheck option to rerun configure.\n#\n# `ac_cv_env_foo' variables (set or unset) will be overridden when\n# loading this file, other *unset* `ac_cv_foo' will be assigned the\n# following values.\n\n_ACEOF\n\n# The following way of writing the cache mishandles newlines in values,\n# but we know of no workaround that is simple, portable, and efficient.\n# So, don't put newlines in cache variables' values.\n# Ultrix sh set writes to stderr and can't be redirected directly,\n# and sets the high bit in the cache file unless we assign to the vars.\n{\n  (set) 2>&1 |\n    case `(ac_space=' '; set | grep ac_space) 2>&1` in\n    *ac_space=\\ *)\n      # `set' does not quote correctly, so add quotes (double-quote\n      # substitution turns \\\\\\\\ into \\\\, and sed turns \\\\ into \\).\n      sed -n \\\n\t\"s/'/'\\\\\\\\''/g;\n\t  s/^\\\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\\\)=\\\\(.*\\\\)/\\\\1='\\\\2'/p\"\n      ;;\n    *)\n      # `set' quotes correctly as required by POSIX, so do not add quotes.\n      sed -n \\\n\t\"s/^\\\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\\\)=\\\\(.*\\\\)/\\\\1=\\\\2/p\"\n      ;;\n    esac;\n} |\n  sed '\n     t clear\n     : clear\n     s/^\\([^=]*\\)=\\(.*[{}].*\\)$/test \"${\\1+set}\" = set || &/\n     t end\n     /^ac_cv_env/!s/^\\([^=]*\\)=\\(.*\\)$/\\1=${\\1=\\2}/\n     : end' >>confcache\nif diff $cache_file confcache >/dev/null 2>&1; then :; else\n  if test -w $cache_file; then\n    test \"x$cache_file\" != \"x/dev/null\" && echo \"updating cache $cache_file\"\n    cat confcache >$cache_file\n  else\n    echo \"not updating unwritable cache $cache_file\"\n  fi\nfi\nrm -f confcache\n\ntest \"x$prefix\" = xNONE && prefix=$ac_default_prefix\n# Let make expand exec_prefix.\ntest \"x$exec_prefix\" = xNONE && exec_prefix='${prefix}'\n\n# VPATH may cause trouble with some makes, so we remove $(srcdir),\n# ${srcdir} and @srcdir@ from VPATH if srcdir is \".\", strip leading and\n# trailing colons and then remove the whole line if VPATH becomes empty\n# (actually we leave an empty line to preserve line numbers).\nif test \"x$srcdir\" = x.; then\n  ac_vpsub='/^[\t ]*VPATH[\t ]*=/{\ns/:*\\$(srcdir):*/:/;\ns/:*\\${srcdir}:*/:/;\ns/:*@srcdir@:*/:/;\ns/^\\([^=]*=[\t ]*\\):*/\\1/;\ns/:*$//;\ns/^[^=]*=[\t ]*$//;\n}'\nfi\n\n# Transform confdefs.h into DEFS.\n# Protect against shell expansion while executing Makefile rules.\n# Protect against Makefile macro expansion.\n#\n# If the first sed substitution is executed (which looks for macros that\n# take arguments), then we branch to the quote section.  Otherwise,\n# look for a macro that doesn't take arguments.\ncat >confdef2opt.sed <<\\_ACEOF\nt clear\n: clear\ns,^[\t ]*#[\t ]*define[\t ][\t ]*\\([^\t (][^\t (]*([^)]*)\\)[\t ]*\\(.*\\),-D\\1=\\2,g\nt quote\ns,^[\t ]*#[\t ]*define[\t ][\t ]*\\([^\t ][^\t ]*\\)[\t ]*\\(.*\\),-D\\1=\\2,g\nt quote\nd\n: quote\ns,[\t `~#$^&*(){}\\\\|;'\"<>?],\\\\&,g\ns,\\[,\\\\&,g\ns,\\],\\\\&,g\ns,\\$,$$,g\np\n_ACEOF\n# We use echo to avoid assuming a particular line-breaking character.\n# The extra dot is to prevent the shell from consuming trailing\n# line-breaks from the sub-command output.  A line-break within\n# single-quotes doesn't work because, if this script is created in a\n# platform that uses two characters for line-breaks (e.g., DOS), tr\n# would break.\nac_LF_and_DOT=`echo; echo .`\nDEFS=`sed -n -f confdef2opt.sed confdefs.h | tr \"$ac_LF_and_DOT\" ' .'`\nrm -f confdef2opt.sed\n\n\nac_libobjs=\nac_ltlibobjs=\nfor ac_i in : $LIBOBJS; do test \"x$ac_i\" = x: && continue\n  # 1. Remove the extension, and $U if already installed.\n  ac_i=`echo \"$ac_i\" |\n\t sed 's/\\$U\\././;s/\\.o$//;s/\\.obj$//'`\n  # 2. Add them.\n  ac_libobjs=\"$ac_libobjs $ac_i\\$U.$ac_objext\"\n  ac_ltlibobjs=\"$ac_ltlibobjs $ac_i\"'$U.lo'\ndone\nLIBOBJS=$ac_libobjs\n\nLTLIBOBJS=$ac_ltlibobjs\n\n\n\n: ${CONFIG_STATUS=./config.status}\nac_clean_files_save=$ac_clean_files\nac_clean_files=\"$ac_clean_files $CONFIG_STATUS\"\n{ echo \"$as_me:$LINENO: creating $CONFIG_STATUS\" >&5\necho \"$as_me: creating $CONFIG_STATUS\" >&6;}\ncat >$CONFIG_STATUS <<_ACEOF\n#! $SHELL\n# Generated by $as_me.\n# Run this file to recreate the current configuration.\n# Compiler output produced by configure, useful for debugging\n# configure, is in config.log if it exists.\n\ndebug=false\nac_cs_recheck=false\nac_cs_silent=false\nSHELL=\\${CONFIG_SHELL-$SHELL}\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF\n## --------------------- ##\n## M4sh Initialization.  ##\n## --------------------- ##\n\n# Be Bourne compatible\nif test -n \"${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then\n  emulate sh\n  NULLCMD=:\n  # Zsh 3.x and 4.x performs word splitting on ${1+\"$@\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '${1+\"$@\"}'='\"$@\"'\nelif test -n \"${BASH_VERSION+set}\" && (set -o posix) >/dev/null 2>&1; then\n  set -o posix\nfi\nDUALCASE=1; export DUALCASE # for MKS sh\n\n# Support unset when possible.\nif ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then\n  as_unset=unset\nelse\n  as_unset=false\nfi\n\n\n# Work around bugs in pre-3.0 UWIN ksh.\n$as_unset ENV MAIL MAILPATH\nPS1='$ '\nPS2='> '\nPS4='+ '\n\n# NLS nuisances.\nfor as_var in \\\n  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \\\n  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \\\n  LC_TELEPHONE LC_TIME\ndo\n  if (set +x; test -z \"`(eval $as_var=C; export $as_var) 2>&1`\"); then\n    eval $as_var=C; export $as_var\n  else\n    $as_unset $as_var\n  fi\ndone\n\n# Required to use basename.\nif expr a : '\\(a\\)' >/dev/null 2>&1; then\n  as_expr=expr\nelse\n  as_expr=false\nfi\n\nif (basename /) >/dev/null 2>&1 && test \"X`basename / 2>&1`\" = \"X/\"; then\n  as_basename=basename\nelse\n  as_basename=false\nfi\n\n\n# Name of the executable.\nas_me=`$as_basename \"$0\" ||\n$as_expr X/\"$0\" : '.*/\\([^/][^/]*\\)/*$' \\| \\\n\t X\"$0\" : 'X\\(//\\)$' \\| \\\n\t X\"$0\" : 'X\\(/\\)$' \\| \\\n\t .     : '\\(.\\)' 2>/dev/null ||\necho X/\"$0\" |\n    sed '/^.*\\/\\([^/][^/]*\\)\\/*$/{ s//\\1/; q; }\n  \t  /^X\\/\\(\\/\\/\\)$/{ s//\\1/; q; }\n  \t  /^X\\/\\(\\/\\).*/{ s//\\1/; q; }\n  \t  s/.*/./; q'`\n\n\n# PATH needs CR, and LINENO needs CR and PATH.\n# Avoid depending upon Character Ranges.\nas_cr_letters='abcdefghijklmnopqrstuvwxyz'\nas_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'\nas_cr_Letters=$as_cr_letters$as_cr_LETTERS\nas_cr_digits='0123456789'\nas_cr_alnum=$as_cr_Letters$as_cr_digits\n\n# The user is always right.\nif test \"${PATH_SEPARATOR+set}\" != set; then\n  echo \"#! /bin/sh\" >conf$$.sh\n  echo  \"exit 0\"   >>conf$$.sh\n  chmod +x conf$$.sh\n  if (PATH=\"/nonexistent;.\"; conf$$.sh) >/dev/null 2>&1; then\n    PATH_SEPARATOR=';'\n  else\n    PATH_SEPARATOR=:\n  fi\n  rm -f conf$$.sh\nfi\n\n\n  as_lineno_1=$LINENO\n  as_lineno_2=$LINENO\n  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`\n  test \"x$as_lineno_1\" != \"x$as_lineno_2\" &&\n  test \"x$as_lineno_3\"  = \"x$as_lineno_2\"  || {\n  # Find who we are.  Look in the path if we contain no path at all\n  # relative or not.\n  case $0 in\n    *[\\\\/]* ) as_myself=$0 ;;\n    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  test -r \"$as_dir/$0\" && as_myself=$as_dir/$0 && break\ndone\n\n       ;;\n  esac\n  # We did not find ourselves, most probably we were run as `sh COMMAND'\n  # in which case we are not to be found in the path.\n  if test \"x$as_myself\" = x; then\n    as_myself=$0\n  fi\n  if test ! -f \"$as_myself\"; then\n    { { echo \"$as_me:$LINENO: error: cannot find myself; rerun with an absolute path\" >&5\necho \"$as_me: error: cannot find myself; rerun with an absolute path\" >&2;}\n   { (exit 1); exit 1; }; }\n  fi\n  case $CONFIG_SHELL in\n  '')\n    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for as_base in sh bash ksh sh5; do\n\t case $as_dir in\n\t /*)\n\t   if (\"$as_dir/$as_base\" -c '\n  as_lineno_1=$LINENO\n  as_lineno_2=$LINENO\n  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`\n  test \"x$as_lineno_1\" != \"x$as_lineno_2\" &&\n  test \"x$as_lineno_3\"  = \"x$as_lineno_2\" ') 2>/dev/null; then\n\t     $as_unset BASH_ENV || test \"${BASH_ENV+set}\" != set || { BASH_ENV=; export BASH_ENV; }\n\t     $as_unset ENV || test \"${ENV+set}\" != set || { ENV=; export ENV; }\n\t     CONFIG_SHELL=$as_dir/$as_base\n\t     export CONFIG_SHELL\n\t     exec \"$CONFIG_SHELL\" \"$0\" ${1+\"$@\"}\n\t   fi;;\n\t esac\n       done\ndone\n;;\n  esac\n\n  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO\n  # uniformly replaced by the line number.  The first 'sed' inserts a\n  # line-number line before each line; the second 'sed' does the real\n  # work.  The second script uses 'N' to pair each line-number line\n  # with the numbered line, and appends trailing '-' during\n  # substitution so that $LINENO is not a special case at line end.\n  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the\n  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)\n  sed '=' <$as_myself |\n    sed '\n      N\n      s,$,-,\n      : loop\n      s,^\\(['$as_cr_digits']*\\)\\(.*\\)[$]LINENO\\([^'$as_cr_alnum'_]\\),\\1\\2\\1\\3,\n      t loop\n      s,-$,,\n      s,^['$as_cr_digits']*\\n,,\n    ' >$as_me.lineno &&\n  chmod +x $as_me.lineno ||\n    { { echo \"$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell\" >&5\necho \"$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell\" >&2;}\n   { (exit 1); exit 1; }; }\n\n  # Don't try to exec as it changes $[0], causing all sort of problems\n  # (the dirname of $[0] is not the place where we might find the\n  # original and so on.  Autoconf is especially sensible to this).\n  . ./$as_me.lineno\n  # Exit status is that of the last command.\n  exit\n}\n\n\ncase `echo \"testing\\c\"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in\n  *c*,-n*) ECHO_N= ECHO_C='\n' ECHO_T='\t' ;;\n  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;\n  *)       ECHO_N= ECHO_C='\\c' ECHO_T= ;;\nesac\n\nif expr a : '\\(a\\)' >/dev/null 2>&1; then\n  as_expr=expr\nelse\n  as_expr=false\nfi\n\nrm -f conf$$ conf$$.exe conf$$.file\necho >conf$$.file\nif ln -s conf$$.file conf$$ 2>/dev/null; then\n  # We could just check for DJGPP; but this test a) works b) is more generic\n  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).\n  if test -f conf$$.exe; then\n    # Don't use ln at all; we don't have any links\n    as_ln_s='cp -p'\n  else\n    as_ln_s='ln -s'\n  fi\nelif ln conf$$.file conf$$ 2>/dev/null; then\n  as_ln_s=ln\nelse\n  as_ln_s='cp -p'\nfi\nrm -f conf$$ conf$$.exe conf$$.file\n\nif mkdir -p . 2>/dev/null; then\n  as_mkdir_p=:\nelse\n  test -d ./-p && rmdir ./-p\n  as_mkdir_p=false\nfi\n\nas_executable_p=\"test -f\"\n\n# Sed expression to map a string onto a valid CPP name.\nas_tr_cpp=\"eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'\"\n\n# Sed expression to map a string onto a valid variable name.\nas_tr_sh=\"eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'\"\n\n\n# IFS\n# We need space, tab and new line, in precisely that order.\nas_nl='\n'\nIFS=\" \t$as_nl\"\n\n# CDPATH.\n$as_unset CDPATH\n\nexec 6>&1\n\n# Open the log real soon, to keep \\$[0] and so on meaningful, and to\n# report actual input values of CONFIG_FILES etc. instead of their\n# values after options handling.  Logging --version etc. is OK.\nexec 5>>config.log\n{\n  echo\n  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX\n## Running $as_me. ##\n_ASBOX\n} >&5\ncat >&5 <<_CSEOF\n\nThis file was extended by lpsolve $as_me 5.5.2.0, which was\ngenerated by GNU Autoconf 2.59.  Invocation command line was\n\n  CONFIG_FILES    = $CONFIG_FILES\n  CONFIG_HEADERS  = $CONFIG_HEADERS\n  CONFIG_LINKS    = $CONFIG_LINKS\n  CONFIG_COMMANDS = $CONFIG_COMMANDS\n  $ $0 $@\n\n_CSEOF\necho \"on `(hostname || uname -n) 2>/dev/null | sed 1q`\" >&5\necho >&5\n_ACEOF\n\n# Files that config.status was made for.\nif test -n \"$ac_config_files\"; then\n  echo \"config_files=\\\"$ac_config_files\\\"\" >>$CONFIG_STATUS\nfi\n\nif test -n \"$ac_config_headers\"; then\n  echo \"config_headers=\\\"$ac_config_headers\\\"\" >>$CONFIG_STATUS\nfi\n\nif test -n \"$ac_config_links\"; then\n  echo \"config_links=\\\"$ac_config_links\\\"\" >>$CONFIG_STATUS\nfi\n\nif test -n \"$ac_config_commands\"; then\n  echo \"config_commands=\\\"$ac_config_commands\\\"\" >>$CONFIG_STATUS\nfi\n\ncat >>$CONFIG_STATUS <<\\_ACEOF\n\nac_cs_usage=\"\\\n\\`$as_me' instantiates files from templates according to the\ncurrent configuration.\n\nUsage: $0 [OPTIONS] [FILE]...\n\n  -h, --help       print this help, then exit\n  -V, --version    print version number, then exit\n  -q, --quiet      do not print progress messages\n  -d, --debug      don't remove temporary files\n      --recheck    update $as_me by reconfiguring in the same conditions\n  --file=FILE[:TEMPLATE]\n\t\t   instantiate the configuration file FILE\n\nConfiguration files:\n$config_files\n\nReport bugs to <bug-autoconf@gnu.org>.\"\n_ACEOF\n\ncat >>$CONFIG_STATUS <<_ACEOF\nac_cs_version=\"\\\\\nlpsolve config.status 5.5.2.0\nconfigured by $0, generated by GNU Autoconf 2.59,\n  with options \\\\\"`echo \"$ac_configure_args\" | sed 's/[\\\\\"\"\\`\\$]/\\\\\\\\&/g'`\\\\\"\n\nCopyright (C) 2003 Free Software Foundation, Inc.\nThis config.status script is free software; the Free Software Foundation\ngives unlimited permission to copy, distribute and modify it.\"\nsrcdir=$srcdir\nINSTALL=\"$INSTALL\"\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF\n# If no file are specified by the user, then we need to provide default\n# value.  By we need to know if files were specified by the user.\nac_need_defaults=:\nwhile test $# != 0\ndo\n  case $1 in\n  --*=*)\n    ac_option=`expr \"x$1\" : 'x\\([^=]*\\)='`\n    ac_optarg=`expr \"x$1\" : 'x[^=]*=\\(.*\\)'`\n    ac_shift=:\n    ;;\n  -*)\n    ac_option=$1\n    ac_optarg=$2\n    ac_shift=shift\n    ;;\n  *) # This is not an option, so the user has probably given explicit\n     # arguments.\n     ac_option=$1\n     ac_need_defaults=false;;\n  esac\n\n  case $ac_option in\n  # Handling of the options.\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF\n  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)\n    ac_cs_recheck=: ;;\n  --version | --vers* | -V )\n    echo \"$ac_cs_version\"; exit 0 ;;\n  --he | --h)\n    # Conflict between --help and --header\n    { { echo \"$as_me:$LINENO: error: ambiguous option: $1\nTry \\`$0 --help' for more information.\" >&5\necho \"$as_me: error: ambiguous option: $1\nTry \\`$0 --help' for more information.\" >&2;}\n   { (exit 1); exit 1; }; };;\n  --help | --hel | -h )\n    echo \"$ac_cs_usage\"; exit 0 ;;\n  --debug | --d* | -d )\n    debug=: ;;\n  --file | --fil | --fi | --f )\n    $ac_shift\n    CONFIG_FILES=\"$CONFIG_FILES $ac_optarg\"\n    ac_need_defaults=false;;\n  --header | --heade | --head | --hea )\n    $ac_shift\n    CONFIG_HEADERS=\"$CONFIG_HEADERS $ac_optarg\"\n    ac_need_defaults=false;;\n  -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n  | -silent | --silent | --silen | --sile | --sil | --si | --s)\n    ac_cs_silent=: ;;\n\n  # This is an error.\n  -*) { { echo \"$as_me:$LINENO: error: unrecognized option: $1\nTry \\`$0 --help' for more information.\" >&5\necho \"$as_me: error: unrecognized option: $1\nTry \\`$0 --help' for more information.\" >&2;}\n   { (exit 1); exit 1; }; } ;;\n\n  *) ac_config_targets=\"$ac_config_targets $1\" ;;\n\n  esac\n  shift\ndone\n\nac_configure_extra_args=\n\nif $ac_cs_silent; then\n  exec 6>/dev/null\n  ac_configure_extra_args=\"$ac_configure_extra_args --silent\"\nfi\n\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF\nif \\$ac_cs_recheck; then\n  echo \"running $SHELL $0 \" $ac_configure_args \\$ac_configure_extra_args \" --no-create --no-recursion\" >&6\n  exec $SHELL $0 $ac_configure_args \\$ac_configure_extra_args --no-create --no-recursion\nfi\n\n_ACEOF\n\n\n\n\n\ncat >>$CONFIG_STATUS <<\\_ACEOF\nfor ac_config_target in $ac_config_targets\ndo\n  case \"$ac_config_target\" in\n  # Handling of arguments.\n  \"Makefile\" ) CONFIG_FILES=\"$CONFIG_FILES Makefile\" ;;\n  *) { { echo \"$as_me:$LINENO: error: invalid argument: $ac_config_target\" >&5\necho \"$as_me: error: invalid argument: $ac_config_target\" >&2;}\n   { (exit 1); exit 1; }; };;\n  esac\ndone\n\n# If the user did not use the arguments to specify the items to instantiate,\n# then the envvar interface is used.  Set only those that are not.\n# We use the long form for the default assignment because of an extremely\n# bizarre bug on SunOS 4.1.3.\nif $ac_need_defaults; then\n  test \"${CONFIG_FILES+set}\" = set || CONFIG_FILES=$config_files\nfi\n\n# Have a temporary directory for convenience.  Make it in the build tree\n# simply because there is no reason to put it here, and in addition,\n# creating and moving files from /tmp can sometimes cause problems.\n# Create a temporary directory, and hook for its removal unless debugging.\n$debug ||\n{\n  trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0\n  trap '{ (exit 1); exit 1; }' 1 2 13 15\n}\n\n# Create a (secure) tmp directory for tmp files.\n\n{\n  tmp=`(umask 077 && mktemp -d -q \"./confstatXXXXXX\") 2>/dev/null` &&\n  test -n \"$tmp\" && test -d \"$tmp\"\n}  ||\n{\n  tmp=./confstat$$-$RANDOM\n  (umask 077 && mkdir $tmp)\n} ||\n{\n   echo \"$me: cannot create a temporary directory in .\" >&2\n   { (exit 1); exit 1; }\n}\n\n_ACEOF\n\ncat >>$CONFIG_STATUS <<_ACEOF\n\n#\n# CONFIG_FILES section.\n#\n\n# No need to generate the scripts if there are no CONFIG_FILES.\n# This happens for instance when ./config.status config.h\nif test -n \"\\$CONFIG_FILES\"; then\n  # Protect against being on the right side of a sed subst in config.status.\n  sed 's/,@/@@/; s/@,/@@/; s/,;t t\\$/@;t t/; /@;t t\\$/s/[\\\\\\\\&,]/\\\\\\\\&/g;\n   s/@@/,@/; s/@@/@,/; s/@;t t\\$/,;t t/' >\\$tmp/subs.sed <<\\\\CEOF\ns,@SHELL@,$SHELL,;t t\ns,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t\ns,@PACKAGE_NAME@,$PACKAGE_NAME,;t t\ns,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t\ns,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t\ns,@PACKAGE_STRING@,$PACKAGE_STRING,;t t\ns,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t\ns,@exec_prefix@,$exec_prefix,;t t\ns,@prefix@,$prefix,;t t\ns,@program_transform_name@,$program_transform_name,;t t\ns,@bindir@,$bindir,;t t\ns,@sbindir@,$sbindir,;t t\ns,@libexecdir@,$libexecdir,;t t\ns,@datadir@,$datadir,;t t\ns,@sysconfdir@,$sysconfdir,;t t\ns,@sharedstatedir@,$sharedstatedir,;t t\ns,@localstatedir@,$localstatedir,;t t\ns,@libdir@,$libdir,;t t\ns,@includedir@,$includedir,;t t\ns,@oldincludedir@,$oldincludedir,;t t\ns,@infodir@,$infodir,;t t\ns,@mandir@,$mandir,;t t\ns,@build_alias@,$build_alias,;t t\ns,@host_alias@,$host_alias,;t t\ns,@target_alias@,$target_alias,;t t\ns,@DEFS@,$DEFS,;t t\ns,@ECHO_C@,$ECHO_C,;t t\ns,@ECHO_N@,$ECHO_N,;t t\ns,@ECHO_T@,$ECHO_T,;t t\ns,@LIBS@,$LIBS,;t t\ns,@build@,$build,;t t\ns,@build_cpu@,$build_cpu,;t t\ns,@build_vendor@,$build_vendor,;t t\ns,@build_os@,$build_os,;t t\ns,@host@,$host,;t t\ns,@host_cpu@,$host_cpu,;t t\ns,@host_vendor@,$host_vendor,;t t\ns,@host_os@,$host_os,;t t\ns,@SO@,$SO,;t t\ns,@CCSHARED@,$CCSHARED,;t t\ns,@DEF@,$DEF,;t t\ns,@SHARED_LIB@,$SHARED_LIB,;t t\ns,@CC@,$CC,;t t\ns,@CFLAGS@,$CFLAGS,;t t\ns,@LDFLAGS@,$LDFLAGS,;t t\ns,@CPPFLAGS@,$CPPFLAGS,;t t\ns,@ac_ct_CC@,$ac_ct_CC,;t t\ns,@EXEEXT@,$EXEEXT,;t t\ns,@OBJEXT@,$OBJEXT,;t t\ns,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t\ns,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t\ns,@INSTALL_DATA@,$INSTALL_DATA,;t t\ns,@LIBOBJS@,$LIBOBJS,;t t\ns,@LTLIBOBJS@,$LTLIBOBJS,;t t\nCEOF\n\n_ACEOF\n\n  cat >>$CONFIG_STATUS <<\\_ACEOF\n  # Split the substitutions into bite-sized pieces for seds with\n  # small command number limits, like on Digital OSF/1 and HP-UX.\n  ac_max_sed_lines=48\n  ac_sed_frag=1 # Number of current file.\n  ac_beg=1 # First line for current file.\n  ac_end=$ac_max_sed_lines # Line after last line for current file.\n  ac_more_lines=:\n  ac_sed_cmds=\n  while $ac_more_lines; do\n    if test $ac_beg -gt 1; then\n      sed \"1,${ac_beg}d; ${ac_end}q\" $tmp/subs.sed >$tmp/subs.frag\n    else\n      sed \"${ac_end}q\" $tmp/subs.sed >$tmp/subs.frag\n    fi\n    if test ! -s $tmp/subs.frag; then\n      ac_more_lines=false\n    else\n      # The purpose of the label and of the branching condition is to\n      # speed up the sed processing (if there are no `@' at all, there\n      # is no need to browse any of the substitutions).\n      # These are the two extra sed commands mentioned above.\n      (echo ':t\n  /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed\n      if test -z \"$ac_sed_cmds\"; then\n\tac_sed_cmds=\"sed -f $tmp/subs-$ac_sed_frag.sed\"\n      else\n\tac_sed_cmds=\"$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed\"\n      fi\n      ac_sed_frag=`expr $ac_sed_frag + 1`\n      ac_beg=$ac_end\n      ac_end=`expr $ac_end + $ac_max_sed_lines`\n    fi\n  done\n  if test -z \"$ac_sed_cmds\"; then\n    ac_sed_cmds=cat\n  fi\nfi # test -n \"$CONFIG_FILES\"\n\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF\nfor ac_file in : $CONFIG_FILES; do test \"x$ac_file\" = x: && continue\n  # Support \"outfile[:infile[:infile...]]\", defaulting infile=\"outfile.in\".\n  case $ac_file in\n  - | *:- | *:-:* ) # input from stdin\n\tcat >$tmp/stdin\n\tac_file_in=`echo \"$ac_file\" | sed 's,[^:]*:,,'`\n\tac_file=`echo \"$ac_file\" | sed 's,:.*,,'` ;;\n  *:* ) ac_file_in=`echo \"$ac_file\" | sed 's,[^:]*:,,'`\n\tac_file=`echo \"$ac_file\" | sed 's,:.*,,'` ;;\n  * )   ac_file_in=$ac_file.in ;;\n  esac\n\n  # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.\n  ac_dir=`(dirname \"$ac_file\") 2>/dev/null ||\n$as_expr X\"$ac_file\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$ac_file\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$ac_file\" : 'X\\(//\\)$' \\| \\\n\t X\"$ac_file\" : 'X\\(/\\)' \\| \\\n\t .     : '\\(.\\)' 2>/dev/null ||\necho X\"$ac_file\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{ s//\\1/; q; }\n  \t  /^X\\(\\/\\/\\)[^/].*/{ s//\\1/; q; }\n  \t  /^X\\(\\/\\/\\)$/{ s//\\1/; q; }\n  \t  /^X\\(\\/\\).*/{ s//\\1/; q; }\n  \t  s/.*/./; q'`\n  { if $as_mkdir_p; then\n    mkdir -p \"$ac_dir\"\n  else\n    as_dir=\"$ac_dir\"\n    as_dirs=\n    while test ! -d \"$as_dir\"; do\n      as_dirs=\"$as_dir $as_dirs\"\n      as_dir=`(dirname \"$as_dir\") 2>/dev/null ||\n$as_expr X\"$as_dir\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)$' \\| \\\n\t X\"$as_dir\" : 'X\\(/\\)' \\| \\\n\t .     : '\\(.\\)' 2>/dev/null ||\necho X\"$as_dir\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{ s//\\1/; q; }\n  \t  /^X\\(\\/\\/\\)[^/].*/{ s//\\1/; q; }\n  \t  /^X\\(\\/\\/\\)$/{ s//\\1/; q; }\n  \t  /^X\\(\\/\\).*/{ s//\\1/; q; }\n  \t  s/.*/./; q'`\n    done\n    test ! -n \"$as_dirs\" || mkdir $as_dirs\n  fi || { { echo \"$as_me:$LINENO: error: cannot create directory \\\"$ac_dir\\\"\" >&5\necho \"$as_me: error: cannot create directory \\\"$ac_dir\\\"\" >&2;}\n   { (exit 1); exit 1; }; }; }\n\n  ac_builddir=.\n\nif test \"$ac_dir\" != .; then\n  ac_dir_suffix=/`echo \"$ac_dir\" | sed 's,^\\.[\\\\/],,'`\n  # A \"../\" for each directory in $ac_dir_suffix.\n  ac_top_builddir=`echo \"$ac_dir_suffix\" | sed 's,/[^\\\\/]*,../,g'`\nelse\n  ac_dir_suffix= ac_top_builddir=\nfi\n\ncase $srcdir in\n  .)  # No --srcdir option.  We are building in place.\n    ac_srcdir=.\n    if test -z \"$ac_top_builddir\"; then\n       ac_top_srcdir=.\n    else\n       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`\n    fi ;;\n  [\\\\/]* | ?:[\\\\/]* )  # Absolute path.\n    ac_srcdir=$srcdir$ac_dir_suffix;\n    ac_top_srcdir=$srcdir ;;\n  *) # Relative path.\n    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix\n    ac_top_srcdir=$ac_top_builddir$srcdir ;;\nesac\n\n# Do not use `cd foo && pwd` to compute absolute paths, because\n# the directories may not exist.\ncase `pwd` in\n.) ac_abs_builddir=\"$ac_dir\";;\n*)\n  case \"$ac_dir\" in\n  .) ac_abs_builddir=`pwd`;;\n  [\\\\/]* | ?:[\\\\/]* ) ac_abs_builddir=\"$ac_dir\";;\n  *) ac_abs_builddir=`pwd`/\"$ac_dir\";;\n  esac;;\nesac\ncase $ac_abs_builddir in\n.) ac_abs_top_builddir=${ac_top_builddir}.;;\n*)\n  case ${ac_top_builddir}. in\n  .) ac_abs_top_builddir=$ac_abs_builddir;;\n  [\\\\/]* | ?:[\\\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;\n  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;\n  esac;;\nesac\ncase $ac_abs_builddir in\n.) ac_abs_srcdir=$ac_srcdir;;\n*)\n  case $ac_srcdir in\n  .) ac_abs_srcdir=$ac_abs_builddir;;\n  [\\\\/]* | ?:[\\\\/]* ) ac_abs_srcdir=$ac_srcdir;;\n  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;\n  esac;;\nesac\ncase $ac_abs_builddir in\n.) ac_abs_top_srcdir=$ac_top_srcdir;;\n*)\n  case $ac_top_srcdir in\n  .) ac_abs_top_srcdir=$ac_abs_builddir;;\n  [\\\\/]* | ?:[\\\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;\n  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;\n  esac;;\nesac\n\n\n  case $INSTALL in\n  [\\\\/$]* | ?:[\\\\/]* ) ac_INSTALL=$INSTALL ;;\n  *) ac_INSTALL=$ac_top_builddir$INSTALL ;;\n  esac\n\n  if test x\"$ac_file\" != x-; then\n    { echo \"$as_me:$LINENO: creating $ac_file\" >&5\necho \"$as_me: creating $ac_file\" >&6;}\n    rm -f \"$ac_file\"\n  fi\n  # Let's still pretend it is `configure' which instantiates (i.e., don't\n  # use $as_me), people would be surprised to read:\n  #    /* config.h.  Generated by config.status.  */\n  if test x\"$ac_file\" = x-; then\n    configure_input=\n  else\n    configure_input=\"$ac_file.  \"\n  fi\n  configure_input=$configure_input\"Generated from `echo $ac_file_in |\n\t\t\t\t     sed 's,.*/,,'` by configure.\"\n\n  # First look for the input files in the build tree, otherwise in the\n  # src tree.\n  ac_file_inputs=`IFS=:\n    for f in $ac_file_in; do\n      case $f in\n      -) echo $tmp/stdin ;;\n      [\\\\/$]*)\n\t # Absolute (can't be DOS-style, as IFS=:)\n\t test -f \"$f\" || { { echo \"$as_me:$LINENO: error: cannot find input file: $f\" >&5\necho \"$as_me: error: cannot find input file: $f\" >&2;}\n   { (exit 1); exit 1; }; }\n\t echo \"$f\";;\n      *) # Relative\n\t if test -f \"$f\"; then\n\t   # Build tree\n\t   echo \"$f\"\n\t elif test -f \"$srcdir/$f\"; then\n\t   # Source tree\n\t   echo \"$srcdir/$f\"\n\t else\n\t   # /dev/null tree\n\t   { { echo \"$as_me:$LINENO: error: cannot find input file: $f\" >&5\necho \"$as_me: error: cannot find input file: $f\" >&2;}\n   { (exit 1); exit 1; }; }\n\t fi;;\n      esac\n    done` || { (exit 1); exit 1; }\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF\n  sed \"$ac_vpsub\n$extrasub\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF\n:t\n/@[a-zA-Z_][a-zA-Z_0-9]*@/!b\ns,@configure_input@,$configure_input,;t t\ns,@srcdir@,$ac_srcdir,;t t\ns,@abs_srcdir@,$ac_abs_srcdir,;t t\ns,@top_srcdir@,$ac_top_srcdir,;t t\ns,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t\ns,@builddir@,$ac_builddir,;t t\ns,@abs_builddir@,$ac_abs_builddir,;t t\ns,@top_builddir@,$ac_top_builddir,;t t\ns,@abs_top_builddir@,$ac_abs_top_builddir,;t t\ns,@INSTALL@,$ac_INSTALL,;t t\n\" $ac_file_inputs | (eval \"$ac_sed_cmds\") >$tmp/out\n  rm -f $tmp/stdin\n  if test x\"$ac_file\" != x-; then\n    mv $tmp/out $ac_file\n  else\n    cat $tmp/out\n    rm -f $tmp/out\n  fi\n\ndone\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF\n\n{ (exit 0); exit 0; }\n_ACEOF\nchmod +x $CONFIG_STATUS\nac_clean_files=$ac_clean_files_save\n\n\n# configure is writing to config.log, and then calls config.status.\n# config.status does its own redirection, appending to config.log.\n# Unfortunately, on DOS this fails, as config.log is still kept open\n# by configure, so config.status won't be able to write to it; its\n# output is simply discarded.  So we exec the FD to /dev/null,\n# effectively closing config.log, so it can be properly (re)opened and\n# appended to by config.status.  When coming back to configure, we\n# need to make the FD available again.\nif test \"$no_create\" != yes; then\n  ac_cs_success=:\n  ac_config_status_args=\n  test \"$silent\" = yes &&\n    ac_config_status_args=\"$ac_config_status_args --quiet\"\n  exec 5>/dev/null\n  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false\n  exec 5>>config.log\n  # Use ||, not &&, to avoid exiting from the if with $? = 1, which\n  # would make configure fail if this is the last instruction.\n  $ac_cs_success || { (exit 1); exit 1; }\nfi\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/configure.ac",
    "content": "AC_PREREQ(2.52)\nAC_INIT([lpsolve],5.5.0.14,[], [])\nAC_CONFIG_SRCDIR(lp_simplex.c)\nAC_CANONICAL_HOST\n\nSHARED_LIB=liblpsolve55.so\nSO=.so\ncase $host_os in\n  hp*|HP*)\n    DEF=-ldld\n    case `uname -m` in\n      ia64) SO=.so;;\n      *)    SO=.sl;;\n    esac\n    if test \"$GCC\" = yes;\n      then CCSHARED=\"-fPIC\";\n      else CCSHARED=\"+z\";\n    fi;;\n  CYGWIN*)\n    SO=.dll;;\n  linux)\n    CCSHARED=\"-fPIC\";;\n  apple-darwin)\n    DEF=-ldl -idirafter /usr/include/sys -DINTEGERTIME -Wno-long-double\n    ;;\n  OpenUNIX*|UnixWare*)\n    DEF='-dy -DNOLONGLONG'\n    if test \"$GCC\" = \"yes\"\n      then CCSHARED=\"-fPIC\"\n      else CCSHARED=\"-K PIC\"\n    fi;;\n  SCO_SV*)\n    DEF='-dy -DNOLONGLONG'\n    if test \"$GCC\" = \"yes\"\n      then CCSHARED=\"-fPIC\"\n      else CCSHARED=\"-Kpic -belf\"\n    fi;;\n *)\nesac\n\nAC_SUBST(SO)\nAC_SUBST(CCSHARED)\nAC_SUBST(DEF)\nAC_SUBST(SHARED_LIB)\n\nAC_PROG_CC\nif test \"x$GCC\" != \"xyes\"\nthen\n  echo \"*** non GNU CC compiler detected.\"\n  echo \"*** This package has not been tested very well with non GNU compilers\"\nfi\n\nAC_PROG_INSTALL\nAC_CONFIG_FILES([ \\\n\tMakefile \\\n])\nAC_OUTPUT\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/declare.h",
    "content": "#ifndef __DECLARE_H__\n#define __DECLARE_H__\n\n#if !defined ANSI_PROTOTYPES\n# if defined MSDOS || defined __BORLANDC__ || defined __HIGHC__ || defined SCO_UNIX || defined AViiON\n#  define ANSI_PROTOTYPES 1\n# endif\n#endif\n\n#if ANSI_PROTOTYPES!=0\n# define __OF(args)  args\n#else\n# define __OF(args)  ()\n#endif\n\n#if defined __HIGHC__\n# define VARARG    ...\n#else\n# define VARARG\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/fortify.c",
    "content": "/*\n * FILE:\n *   fortify.c\n *\n * DESCRIPTION:\n *     A fortified shell for malloc, realloc, calloc, strdup, getcwd, tempnam\n *     and free.\n *     To use Fortify, each source file will need to #include \"fortify.h\".  To\n * enable  Fortify,  define the symbol FORTIFY.  If FORTIFY is not defined, it\n * will compile away to nothing.  If you do not have stderr available, you may\n * wish  to  set  an  alternate output function.  See _Fortify_SetOutputFunc(),\n * below.\n *     You will also need to link in fortify.o\n *\n *     None of the functions in this file should really be called\n *   directly; they really should be called through the macros\n *   defined in fortify.h\n *\n */\n\n#if defined FORTIFY\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <sys/types.h>\n#include <stdlib.h>\n\n#if defined MSDOS || defined __BORLANDC__ || defined WIN32 || defined __HIGHC__\n# include <direct.h>\n#endif\n\nextern int EndOfPgr(int);\n\n#define __FORTIFY_C__ /* So fortify.h knows to not define the fortify macros */\n#include \"fortify.h\"\n\n#include \"ufortify.h\" /* the user's options */\n\nchar *_Fortify_file=NULL;\nint _Fortify_line=0;\n\n#ifndef FORTIFY_TRANSPARENT\n\n#include <string.h>\n#include <math.h>\n#include <time.h>\n#include <ctype.h>\n\n#if defined MSDOS || defined __BORLANDC__ || defined WIN32 || defined __HIGHC__\n# if !defined WIN32\n#  undef MSDOS\n#  define MSDOS\n# endif\n# include <conio.h>\n#else\n# include <unistd.h>\n# include <termio.h>\n# define getch() getchar()\n#endif\n\n#if defined _WINDOWS\n# include \"windows.h\"\n# if !defined WIN32\n#  include \"toolhelp.h\"\n# endif\n#endif\n\n#if defined LONGNAME\n# include \"longname.h\"\n#endif\n\n#if !defined MIN\n# define MIN(a, b) ((a) < (b) ? (a) : (b))\n#endif\n\nstruct Header\n{\n\tchar          *File;   /* The sourcefile of the caller   */\n\tunsigned short Line;   /* The sourceline of the caller   */\n\tsize_t         Size;   /* The size of the malloc'd block */\n\tstruct Header *Prev,   /* List pointers                  */\n\t\t      *Next;\n\tint            Checksum;  /* For validating the Header structure; see ChecksumHeader() */\n\tunsigned char  Scope;\n};\n\n#if defined AViiON || defined __GNUC__ || defined _MSC_VER\n# define _static static\n#else\n# define _static\n#endif\n\n_static char *address __OF((void *addr));\n_static int TimeToCheck __OF((void));\n_static int CheckBlock __OF((struct Header *h, char *file, unsigned long line));\n_static int CheckPointer __OF((unsigned char *ptr, unsigned long size, char *file, unsigned long line));\n_static int CheckFortification __OF((unsigned char *ptr, unsigned char value, size_t size));\n_static void SetFortification __OF((unsigned char *ptr, unsigned char value, size_t size));\n_static void OutputFortification __OF((unsigned char *ptr, unsigned char value, size_t size));\n_static int IsHeaderValid __OF((struct Header *h));\n_static void MakeHeaderValid __OF((struct Header *h));\n_static int ChecksumHeader __OF((struct Header *h));\n_static int IsOnList __OF((struct Header *h));\n_static void OutputHeader __OF((struct Header *h));\n_static void OutputMemory __OF((struct Header *h));\n_static void st_DefaultOutput __OF((char *String));\n_static void WaitIfstdOutput __OF((void));\n\nstatic char stdOutput = 0;        /* If true, did some stderr output */\nstatic OutputFuncPtr  st_Output = st_DefaultOutput; /* Output function for errors */\n\n#if !defined MSDOS && !defined WIN32\nstatic int strnicmp(s1,s2,maxlen)\n char *s1,*s2;\n size_t maxlen;\n {\n  while ((maxlen) && (*s1) && (*s2) && (toupper(*s1)==toupper(*s2))) {\n   maxlen--;\n   s1++;\n   s2++;\n  }\n  return((maxlen) ? toupper(*s1)-toupper(*s2) : 0);\n }\n\nstatic int stricmp(s1,s2)\n char *s1,*s2;\n {\n  return(strnicmp(s1,s2,strlen(s1)+1));\n }\n#endif\n\nstatic char *address(void *addr)\n{\n        static char str[80];\n\n#if defined KNOWS_POINTER_TYPE\n        sprintf(str,\"%p\",addr);\n#else\n        sprintf(str,\"%lx\",(unsigned long) addr);\n#endif\n        return(str);\n}\n\n#ifdef FORTIFY_CheckInterval\nint TimeToCheck()\n{\n        static time_t lastcheck=0L;\n\ttime_t t;\n        int ret = 0;\n\n\ttime(&t);\n\tif ((lastcheck==0L) || (t-lastcheck>=FORTIFY_CheckInterval))\n        {\n                lastcheck = t;\n                ret = 1;\n        }\n        return(ret);\n}\n#endif\n\nstatic FILE *gfile=NULL;\nstatic int Nchars=0,Nlines=0;\nstatic char flag=0;\n\nstatic void _Fortify_NoOutput()\n {\n }\n\nstatic void st_DefaultOutput(char *String)\n{\n        static FILE *file;\n        static char first=1;\n\n        if (first) {\n                file=stderr;\n                first=0;\n        }\n\n        if (stdOutput==0) {\n        \tNchars=Nlines=0;\n                if (gfile!=NULL) rewind(gfile);\n        }\n\n        if (flag==0)\n        {\n                char *ptr;\n\n        \tfile=stderr;\n                flag = 1;\n                if ((ptr=getenv(\"FORTIFY_OUTPUT\"))!=NULL)\n                {\n                        if ((stricmp(ptr,\"null\")==0) || (stricmp(ptr,\"nul\")==0))\n                                file=NULL;\n                        else if (stricmp(ptr,\"stderr\")==0)\n                                file=stderr;\n                        else if (stricmp(ptr,\"stdout\")==0)\n                                file=stdout;\n#if defined MSDOS && !defined _WINDOWS && !defined WIN32\n                        else if (stricmp(ptr,\"stdprn\")==0)\n                                file=stdprn;\n#endif\n                        else if ((file=fopen(ptr,\"w\"))==NULL)\n                        {\n#if !defined _WINDOWS\n                                fprintf(stderr,\"\\r\\nFortify: Unable to create logfile %s\\r\\n\",ptr);\n\t\t\t\tEndOfPgr(4);\n#else\n    \t\t\t\t{\n    \t\t\t\t\tchar str[255];\n\n    \t\t\t\t\tsprintf(str,\"Unable to create logfile\\n \\\"%s\\\"\",ptr);\n    \t\t\t\t\tMessageBox((HWND) NULL,(LPCSTR) str,(LPCSTR) \"Fortify\",(UINT) MB_ICONSTOP);\n#if 0\n#if defined WIN32\n\t\t\t\t        /* TerminateProcess(GetCurrentProcess(),65535); */\n                                        ExitProcess(65535);\n#else\n    \t\t\t\t\tTerminateApp((HTASK) NULL,(WORD) NO_UAE_BOX);\n#endif\n#else\n                                        EndOfPgr(1);\n#endif\n    \t\t\t\t}\n#endif\n                        }\n\t\t}\n\t\tif ((file!=NULL) && (file!=stderr) && (file!=stdout))\n\t\t{\n\t\t\ttime_t t;\n\n\t\t\ttime(&t);\n\t\t\tfprintf(file,\"Generated on: %s%s\\n\",\n                                ctime(&t),\n                                (file==stdout) || (file==stderr) ? \"\\r\" : \"\"\n                               );\n\t\t}\n\t}\n\tif (file!=NULL)\n\t{\n#if defined _WINDOWS\n                if ((file==stdout) || (file==stderr)) {\n#if defined LINE_BY_LINE\n                \tif (MessageBox((HWND) NULL,(LPCSTR) String,(LPCSTR) \"Fortify\",(UINT) MB_OKCANCEL /* |MB_ICONINFORMATION */)==IDCANCEL)\n#if 0\n#if defined WIN32\n                         /* TerminateProcess(GetCurrentProcess(),65535); */\n                         ExitProcess(65535);\n#else\n    \t\t\t TerminateApp((HTASK) NULL,(WORD) NO_UAE_BOX);\n#endif\n#else\n                         EndOfPgr(1);\n#endif\n#else\n\t\t\t{\n                        \tchar *ptr;\n\n                        \tptr=\"fortify.tmp\";\n\t\t\t\tif ((ptr==NULL) || ((file=gfile=fopen(ptr,\"w+\"))==NULL))\n                        \t{\n    \t\t\t\t\tchar str[255];\n\n    \t\t\t\t\tsprintf(str,\"Unable to create temporary file\\n \\\"%s\\\"\",(ptr==NULL) ? \"(NULL)\" : ptr);\n    \t\t\t\t\tMessageBox((HWND) NULL,(LPCSTR) str,(LPCSTR) \"Fortify\",(UINT) MB_ICONSTOP);\n#if 0\n#if defined WIN32\n                                        /* TerminateProcess(GetCurrentProcess(),65535); */\n                                        ExitProcess(65535);\n#else\n    \t\t\t\t\tTerminateApp((HTASK) NULL,(WORD) NO_UAE_BOX);\n#endif\n#else\n                                        EndOfPgr(1);\n#endif\n                        \t}\n                    \t}\n#endif\n                }\n                if ((file!=stdout) && (file!=stderr))\n#endif\n                        {\n                                int i,ch=-1;\n\n                        \tfor (i=0;(String[i]) && (Nlines<30);i++)\n                                 if (String[i]=='\\n') Nlines++;\n\t\t\t\tif ((String[i]) && (String[i+1])) {\n\t\t\t\t\tch=String[i+1];\n\t\t\t\t\tString[i+1]=0;\n\t\t\t\t}\n                                if ((file==stdout) || (file==stderr)) {\n                                 char *ptr=String;\n                                 int i;\n\n                                 do {\n                                  for (i=0;(ptr[i]) && (ptr[i]!='\\r') && (ptr[i]!='\\n');i++);\n                                  Nchars+=fprintf(file,\"%-*.*s%s\",\n                                                  i,i,\n                                                  ptr,\n                                                  (ptr[i]) ? \"\\r\\n\" : \"\"\n                                                 );\n                                  ptr+=i;\n                                  if (ptr[0]=='\\r') ptr++;\n                                  if (ptr[0]=='\\n') ptr++;\n                                 } while (*ptr);\n                                }\n                                else Nchars+=fprintf(file,String);\n\t\t\t\tif (ch>=0) String[i+1]=(char)ch;\n\t\t\t\tif (Nlines>=30) {\n                                \tWaitIfstdOutput();\n                                    \tNchars=Nlines=0;\n                                    \tstdOutput = 0;\n                                        if ((String[i]) && (String[i+1])) {\n                                                if ((file==stderr) || (file==stdout) || ((gfile!=NULL) && (Nchars)))\n                                                \tstdOutput = 1;\n                                         \tst_DefaultOutput(String+i);\n                                        }\n                                }\n                        }\n                if ((file==stderr) || (file==stdout) || ((gfile!=NULL) && (Nchars)))\n                \tstdOutput = 1;\n\t}\n}\n\nstatic void WaitIfstdOutput()\n{\n#if !defined _WINDOWS\n        if((stdOutput) && (st_Output != (OutputFuncPtr) _Fortify_NoOutput))\n        {\n#ifdef FORTIFY_WAIT_FOR_KEY\n                static signed char wait_on_key=-1;\n\n                if(wait_on_key<0)\n\t\t{\n\t\t\tchar *ptr;\n\n                        if (((ptr=getenv(\"FORTIFY_WAIT_FOR_KEY\"))!=NULL) &&\n\t\t\t    (tolower(*ptr)=='n')) wait_on_key = 0;\n                        else wait_on_key = 1;\n\n                }\n\t\tif(wait_on_key)\n\t\t{\n                        char c;\n\n#if !defined MSDOS && !defined WIN32\n                        struct termio tio,tiobak;\n                        char flag;\n\n                        if ((flag=ioctl(0,TCGETA,&tio))==0) /* handle 0 is stdin */\n                        {\n                                tiobak=tio;\n                        \ttio.c_lflag&=~ICANON;\n                                tio.c_lflag&=~ECHO;\n                        \ttio.c_cc[VMIN]=1;\n                        \tioctl(0,TCSETA,&tio);\n\t                }\n#endif /* !MSDOS */\n\t\t\tc = (char)getch();\n\n#if !defined MSDOS && !defined WIN32\n                        if (flag==0)\n                        \tioctl(0,TCSETA,&tiobak);\n#endif /* !MSDOS */\n\n\t\t\tif ((c == 3) || (c == 0x1b)) EndOfPgr(3);\n\t\t}\n#endif /* FORTIFY_WAIT_FOR_KEY */\n\n        }\n#else\n# if !defined LINE_BY_LINE\n        if ((stdOutput) && (gfile!=NULL) && (Nchars))\n        {\n                char *ptr;\n\n                ptr=(char *) malloc(Nchars+1);\n                if (ptr!=NULL)\n                {\n                        int n=0,l=0;\n\n                        rewind(gfile);\n                        while ((n<Nchars) && (l<Nlines))\n                        {\n                                fgets(ptr+n,Nchars-n+1,gfile);\n                                n+=(int)strlen(ptr+n);\n                                l++;\n                        }\n                \tif (MessageBox((HWND) NULL,(LPCSTR) ptr,(LPCSTR) \"Fortify\",(UINT) MB_OKCANCEL /* |MB_ICONINFORMATION */)==IDCANCEL)\n#if 0\n#if defined WIN32\n                         /* TerminateProcess(GetCurrentProcess(),65535); */\n                         ExitProcess(65535);\n#else\n    \t\t\t TerminateApp((HTASK) NULL,(WORD) NO_UAE_BOX);\n#endif\n#else\n                         EndOfPgr(1);\n#endif\n                }\n                free(ptr);\n        }\n# endif\n#endif\n\tstdOutput = 0;\n}\n\nstatic struct Header *st_Head = NULL; /* Head of alloc'd memory list */\nstatic char st_Buffer[256];       /* Temporary buffer for sprintf's */\nstatic int st_Disabled = 0;       /* If true, Fortify is inactive */\nstatic int st_MallocFailRate = 0; /* % of the time to fail mallocs */\n\nstatic char          *st_LastVerifiedFile = \"unknown\";\nstatic unsigned short st_LastVerifiedLine = 0;\nstatic unsigned char  st_Scope            = 0;\nstatic void           OutputLastVerifiedPoint __OF((void));\n\nvoid FORTIFY_STORAGE\n_Fortify_Init(char *file,unsigned long line)\n{\n\tif (gfile!=NULL) fclose(gfile);\n\tgfile=NULL;\n\tNchars=Nlines=0;\n        flag=0;\n        st_Head=NULL;\n        stdOutput=0;\n        st_Output=st_DefaultOutput;\n        st_Disabled=0;\n        st_MallocFailRate=0;\n        st_LastVerifiedFile=\"unknown\";\n        st_LastVerifiedLine=0;\n        st_Scope=0;\n}\n\n\n/*\n * _Fortify_malloc() - Allocates a block of memory, with extra bits for\n *                    misuse protection/detection.\n *\n *    Features:\n *     +  Adds the malloc'd memory onto Fortify's own private list.\n *        (With a checksum'd header to detect corruption of the memory list)\n *     +  Places sentinals on either side of the user's memory with\n *        known data in them, to detect use outside of the bounds\n *        of the block\n *     +  Initializes the malloc'd memory to some \"nasty\" value, so code\n *        can't rely on it's contents.\n *     +  Can check all sentinals on every malloc.\n *     +  Can generate a warning message on a malloc fail.\n *     +  Can randomly \"fail\" at a set fail rate\n */\nvoid *FORTIFY_STORAGE\n_Fortify_malloc(size_t size,char *file,unsigned long line)\n{\n\tunsigned char *ptr;\n\tstruct Header *h;\n\n        stdOutput = 0;\n\n\tFORTIFY_LOCK();\n\n\tif(st_Disabled)\n\t{\n\t\tptr = (unsigned char *) malloc(size);\n\t\tFORTIFY_UNLOCK();\n                WaitIfstdOutput();\n\t\treturn((void *) ptr);\n\t}\n\n#ifdef CHECK_ALL_MEMORY_ON_MALLOC\n#ifdef FORTIFY_CheckInterval\n        if (TimeToCheck())\n#endif\n\t\t_Fortify_CheckAllMemory(file, line);\n#endif\n\n\tif(size == 0)\n\t{\n#ifdef WARN_ON_ZERO_MALLOC\n    \tsprintf(st_Buffer,\n        \t    \"\\nFortify: %s.%ld\\n         malloc(0) attempted failed\\n\",\n            \tfile, line);\n\t\tst_Output(st_Buffer);\n#endif\n\n\t\tFORTIFY_UNLOCK();\n\t\tWaitIfstdOutput();\n\t\treturn(0);\n\t}\n\n\tif(st_MallocFailRate > 0)\n\t{\n\t\tif(rand() % 100 < st_MallocFailRate)\n\t\t{\n#ifdef WARN_ON_FALSE_FAIL\n\t\t\tsprintf(st_Buffer,\n\t\t\t\t\t\"\\nFortify: %s.%ld\\n         malloc(%ld) \\\"false\\\" failed\\n\",\n\t\t\t\t\t\t\tfile, line, (unsigned long)size);\n\t\t\tst_Output(st_Buffer);\n#endif\n\t\t\tFORTIFY_UNLOCK();\n                        WaitIfstdOutput();\n                        return(0);\n\t\t}\n\t}\n\n\t/*\n\t * malloc the memory, including the space for the header and fortification\n\t * buffers\n\t */\n#ifdef WARN_ON_SIZE_T_OVERFLOW\n\t{\n\t\tsize_t private_size = sizeof(struct Header)\n\t\t\t\t\t\t\t+ FORTIFY_BEFORE_SIZE + size + FORTIFY_AFTER_SIZE;\n\n\t\tif(private_size < size) /* Check to see if the added baggage is larger than size_t */\n\t\t{\n\t\t\tsprintf(st_Buffer,\n\t\t\t\t\t\"\\nFortify: %s.%ld\\n         malloc(%ld) has overflowed size_t.\\n\",\n\t\t\t\t\tfile, line, (unsigned long)size);\n\t\t\tst_Output(st_Buffer);\n\t\t\tFORTIFY_UNLOCK();\n\t\t\tWaitIfstdOutput();\n\t\t\treturn(0);\n\t\t}\n\t}\n#endif\n\n\tptr = (unsigned char *) malloc(sizeof(struct Header) +\n\t\t\t\t FORTIFY_BEFORE_SIZE + size + FORTIFY_AFTER_SIZE);\n\tif(!ptr)\n\t{\n#ifdef WARN_ON_MALLOC_FAIL\n\t\tsprintf(st_Buffer, \"\\nFortify: %s.%ld\\n         malloc(%ld) failed\\n\",\n\t\t\t\tfile, line, (unsigned long)size);\n\t\tst_Output(st_Buffer);\n#endif\n\n\t\tFORTIFY_UNLOCK();\n                WaitIfstdOutput();\n                return(0);\n\t}\n\n\t/*\n\t * Initialize and validate the header\n\t */\n\th = (struct Header *)ptr;\n\n\th->Size = size;\n\n\th->File = file;\n\th->Line = (unsigned short) line;\n\n\th->Next = st_Head;\n\th->Prev = 0;\n\n\th->Scope = st_Scope;\n\n\tif(st_Head)\n\t{\n\t\tst_Head->Prev = h;\n\t\tMakeHeaderValid(st_Head);\n\t}\n\n\tst_Head = h;\n\n\tMakeHeaderValid(h);\n\n\n\t/*\n\t * Initialize the fortifications\n\t */\n\tSetFortification(ptr + sizeof(struct Header),\n\t                 FORTIFY_BEFORE_VALUE, FORTIFY_BEFORE_SIZE);\n\tSetFortification(ptr + sizeof(struct Header) + FORTIFY_BEFORE_SIZE + size,\n\t                 FORTIFY_AFTER_VALUE, FORTIFY_AFTER_SIZE);\n\n#ifdef FILL_ON_MALLOC\n\t/*\n\t * Fill the actual user memory\n\t */\n\tSetFortification(ptr + sizeof(struct Header) + FORTIFY_BEFORE_SIZE,\n\t                 FILL_ON_MALLOC_VALUE, size);\n#endif\n\n\t/*\n\t * We return the address of the user's memory, not the start of the block,\n\t * which points to our magic cookies\n\t */\n\n\tFORTIFY_UNLOCK();\n        WaitIfstdOutput();\n\treturn((void *) (ptr + sizeof(struct Header) + FORTIFY_BEFORE_SIZE));\n}\n\n/*\n * _Fortify_free() - This free must be used for all memory allocated with\n *                  _Fortify_malloc().\n *\n *   Features:\n *     + Pointers are validated before attempting a free - the pointer\n *       must point to a valid malloc'd bit of memory.\n *     + Detects attempts at freeing the same block of memory twice\n *     + Can clear out memory as it is free'd, to prevent code from using\n *       the memory after it's been freed.\n *     + Checks the sentinals of the memory being freed.\n *     + Can check the sentinals of all memory.\n */\n\nvoid FORTIFY_STORAGE\n_Fortify_free(void *uptr,char *file,unsigned long line)\n{\n\tunsigned char *ptr;\n\tstruct Header *h;\n\n\tif(uptr == NULL)\n\t\treturn;\n\n\tptr = (unsigned char *)uptr - sizeof(struct Header) - FORTIFY_BEFORE_SIZE;\n\th = (struct Header *)ptr;\n\n\tstdOutput = 0;\n\n\tFORTIFY_LOCK();\n\n\tif(st_Disabled)\n\t{\n\t\tfree(uptr);\n\t\tFORTIFY_UNLOCK();\n                WaitIfstdOutput();\n                return;\n\t}\n\n#ifdef CHECK_ALL_MEMORY_ON_FREE\n#ifdef FORTIFY_CheckInterval\n        if (TimeToCheck())\n#endif\n\t\t_Fortify_CheckAllMemory(file, line);\n#endif\n\n#ifdef PARANOID_FREE\n\tif(!IsOnList(h))\n\t{\n\t\tsprintf(st_Buffer,\n\t\t \"\\nFortify: %s.%ld\\n         Invalid pointer, corrupted header, or possible free twice\\n\",\n\t\t\t\tfile, line);\n\t\tst_Output(st_Buffer);\n\t\tOutputLastVerifiedPoint();\n\t\tgoto fail;\n\t}\n#endif\n\n\tif(!CheckBlock(h, file, line))\n\t\tgoto fail;\n\n\t/*\n\t * Remove the block from the list\n\t */\n\tif(h->Prev)\n\t{\n\t\tif(!CheckBlock(h->Prev, file, line))\n\t\t\tgoto fail;\n\n\t\th->Prev->Next = h->Next;\n\t\tMakeHeaderValid(h->Prev);\n\t}\n\telse\n\t\tst_Head = h->Next;\n\n\tif(h->Next)\n\t{\n\t\tif(!CheckBlock(h->Next, file, line))\n\t\t\tgoto fail;\n\n\t\th->Next->Prev = h->Prev;\n\t\tMakeHeaderValid(h->Next);\n\t}\n\n#ifdef FILL_ON_FREE\n\t/*\n\t * Nuke out all memory that is about to be freed\n\t */\n\tSetFortification(ptr, FILL_ON_FREE_VALUE,\n\t                 sizeof(struct Header) + FORTIFY_BEFORE_SIZE + h->Size + FORTIFY_AFTER_SIZE);\n#endif\n\n\t/*\n\t * And do the actual free\n\t */\n\tfree(ptr);\n\tFORTIFY_UNLOCK();\n        WaitIfstdOutput();\n        return;\n\nfail:\n\tsprintf(st_Buffer, \"         free(%s) failed\\n\", address(uptr));\n\tst_Output(st_Buffer);\n\tFORTIFY_UNLOCK();\n        WaitIfstdOutput();\n}\n\n/*\n * _Fortify_realloc() - Uses _Fortify_malloc() and _Fortify_free() to implement\n *                     realloc().\n *\n *   Features:\n *        + The realloc'd block is ALWAYS moved.\n *        + The pointer passed to realloc() is verified in the same way that\n *          _Fortify_free() verifies pointers before it frees them.\n *        + All the _Fortify_malloc() and _Fortify_free() protection\n */\nvoid *FORTIFY_STORAGE\n_Fortify_realloc(void *ptr,size_t new_size,char *file,unsigned long line)\n{\n\tvoid *new_ptr;\n\tstruct Header *h;\n\n\tif(new_size == 0)\n\t{\n\t\t_Fortify_free(ptr,file,line);\n\t\treturn(NULL);\n\t}\n\n\th = (struct Header *)((unsigned char *)ptr - sizeof(struct Header) - FORTIFY_BEFORE_SIZE);\n\n        stdOutput = 0;\n\n\tif(st_Disabled)\n\t{\n\t\tFORTIFY_LOCK();\n\t\tnew_ptr = (void *) realloc(ptr, new_size);\n\t\tFORTIFY_UNLOCK();\n\t\tWaitIfstdOutput();\n                return(new_ptr);\n\t}\n\n\tif(!ptr)\n        {\n\t\tvoid *FORTIFY_STORAGE ret = _Fortify_malloc(new_size, file, line);\n\n                WaitIfstdOutput();\n\t\treturn(ret);\n        }\n\n\tFORTIFY_LOCK();\n\n\tif(!IsOnList(h))\n\t{\n\t\tsprintf(st_Buffer,\n\t\t\t\t\"\\nFortify: %s.%ld\\n         Invalid pointer or corrupted header passed to realloc\\n\",\n\t\t\t\tfile, line);\n\t\tst_Output(st_Buffer);\n\t\tgoto fail;\n\t}\n\n\tif(!CheckBlock(h, file, line))\n\t\tgoto fail;\n\n\tnew_ptr = _Fortify_malloc(new_size, file, line);\n\tif(!new_ptr)\n\t{\n\t\tFORTIFY_UNLOCK();\n                WaitIfstdOutput();\n                return(0);\n\t}\n\n\tif(h->Size < new_size)\n\t\tmemcpy(new_ptr, ptr, h->Size);\n\telse\n\t\tmemcpy(new_ptr, ptr, new_size);\n\n\t_Fortify_free(ptr, file, line);\n\tFORTIFY_UNLOCK();\n        WaitIfstdOutput();\n        return(new_ptr);\n\nfail:\n\tsprintf(st_Buffer, \"         realloc(%s, %ld) failed\\n\", address(ptr), (unsigned long)new_size);\n\tst_Output(st_Buffer);\n\tFORTIFY_UNLOCK();\n        WaitIfstdOutput();\n        return(NULL);\n}\n\n\n/*\n * __Fortify_CheckPointer() - Returns true if the uptr points to a valid\n *   piece of _Fortify_malloc()'d memory. The memory must be on the malloc'd\n *   list, and it's sentinals must be in tact.\n *     If anything is wrong, an error message is issued.\n *\n *   (Note - if fortify is disabled, this function always returns true).\n */\nstatic int FORTIFY_STORAGE\n__Fortify_CheckPointer(void *uptr,char OnlyStart,unsigned long size,char *file,unsigned long line)\n{\n\tunsigned char *ptr = (unsigned char *)uptr - sizeof(struct Header) - FORTIFY_BEFORE_SIZE;\n\tint r = 1, StartPointer;\n\n        stdOutput = 0;\n\n\tif(st_Disabled)\n        {\n                WaitIfstdOutput();\n\t\treturn(1);\n        }\n\n\tFORTIFY_LOCK();\n\n\tStartPointer = IsOnList((struct Header *)ptr);\n\tif((OnlyStart) && (!StartPointer))\n\t{\n\t\tsprintf(st_Buffer,\n\t\t       \"\\nFortify: %s.%ld\\n         Invalid pointer or corrupted header detected (%s)\\n\",\n\t\t       file, line, address(uptr));\n\t\tst_Output(st_Buffer);\n\t\tFORTIFY_UNLOCK();\n                WaitIfstdOutput();\n                return(0);\n\t}\n\n\tif((OnlyStart) || (StartPointer))\n\t\tr = CheckBlock((struct Header *)ptr, file, line);\n\tif(!OnlyStart)\n\t\tr = CheckPointer((unsigned char *)uptr, size, file, line);\n\tFORTIFY_UNLOCK();\n        WaitIfstdOutput();\n        return(r);\n}\n\n\nint FORTIFY_STORAGE\n_Fortify_CheckPointer(void *uptr,char *file,unsigned long line)\n{\n\treturn(__Fortify_CheckPointer(uptr,1,0,file,line));\n}\n\n/*\n * Fortify_SetOutputFunc(OutputFuncPtr Output) - Sets the function used to\n *   output all error and diagnostic messages by fortify. The output function\n *   takes a single unsigned char * argument, and must be able to handle newlines.\n *     The function returns the old pointer.\n */\nFortify_OutputFuncPtr FORTIFY_STORAGE\n_Fortify_SetOutputFunc(Fortify_OutputFuncPtr Output)\n{\n\tOutputFuncPtr Old = st_Output;\n\n\tst_Output = (OutputFuncPtr) Output;\n\n\treturn((Fortify_OutputFuncPtr FORTIFY_STORAGE) Old);\n}\n\n/*\n * _Fortify_SetMallocFailRate(int Percent) - _Fortify_malloc() will make the\n *   malloc attempt fail this Percent of the time, even if the memory is\n *   available. Useful to \"stress-test\" an application. Returns the old\n *   value. The fail rate defaults to 0.\n */\nint FORTIFY_STORAGE\n_Fortify_SetMallocFailRate(int Percent)\n{\n\tint Old = st_MallocFailRate;\n\n\tst_MallocFailRate = Percent;\n\n\treturn(Old);\n}\n\n\n/*\n * _Fortify_CheckAllMemory() - Checks the sentinals of all malloc'd memory.\n *   Returns the number of blocks that failed.\n *\n *  (If Fortify is disabled, this function always returns 0).\n */\nint FORTIFY_STORAGE\n_Fortify_CheckAllMemory(char *file,unsigned long line)\n{\n\tstruct Header *curr = st_Head;\n\tint count = 0;\n\n\tstdOutput = 0;\n\n\tif(st_Disabled)\n\t{\n\t\tWaitIfstdOutput();\n\t\treturn(0);\n\t}\n\n\tFORTIFY_LOCK();\n\n\twhile(curr)\n\t{\n\t\tif(!CheckBlock(curr, file, line))\n\t\t\tcount++;\n\n\t\tcurr = curr->Next;\n\t}\n\n\tif(file)\n\t{\n\t\tst_LastVerifiedFile = file;\n\t\tst_LastVerifiedLine = (short) line;\n\t}\n\n\tFORTIFY_UNLOCK();\n        WaitIfstdOutput();\n        return(count);\n}\n\n/* _Fortify_EnterScope - enters a new Fortify scope level.\n * returns the new scope level.\n */\nint FORTIFY_STORAGE\n_Fortify_EnterScope(char *file,unsigned long line)\n{\n\treturn((int) ++st_Scope);\n}\n\n/* _Fortify_LeaveScope - leaves a Fortify scope level,\n * also prints a memory dump of all non-freed memory that was allocated\n * during the scope being exited.\n */\nint FORTIFY_STORAGE\n_Fortify_LeaveScope(char *file,unsigned long line)\n{\n\tstruct Header *curr = st_Head;\n\tint count = 0;\n\tsize_t size = 0;\n\n        stdOutput = 0;\n\n\tif(st_Disabled)\n        {\n                WaitIfstdOutput();\n                return(0);\n        }\n\n\tFORTIFY_LOCK();\n\n\tst_Scope--;\n\twhile(curr)\n\t{\n\t\tif(curr->Scope > st_Scope)\n\t\t{\n\t\t\tif(count == 0)\n\t\t\t{\n\t\t\t\tsprintf(st_Buffer, \"\\nFortify: Memory Dump at %s.%ld\\n\", file, line);\n\t\t\t\tst_Output(st_Buffer);\n\t\t\t\tOutputLastVerifiedPoint();\n\t\t\t\tsprintf(st_Buffer, \"%11s %8s %s\\n\", \"Address\", \"Size\", \"Allocator\");\n\t\t\t\tst_Output(st_Buffer);\n\t\t\t}\n\n\t\t\tOutputHeader(curr);\n\t\t\tcount++;\n\t\t\tsize += curr->Size;\n\t\t}\n\n\t\tcurr = curr->Next;\n\t}\n\n\tif(count)\n\t{\n\t\tsprintf(st_Buffer, \"%11s %8ld bytes overhead\\n\", \"and\",\n\t\t\t\t\t\t(unsigned long)(count * (sizeof(struct Header) + FORTIFY_BEFORE_SIZE + FORTIFY_AFTER_SIZE)));\n\t\t\t\t\t\tst_Output(st_Buffer);\n\n\t\tsprintf(st_Buffer,\"%11s %8ld bytes in %d blocks\\n\", \"total\", size, count);\n\t\tst_Output(st_Buffer);\n\t}\n\n\tFORTIFY_UNLOCK();\n        WaitIfstdOutput();\n        return(count);\n}\n\n/*\n * _Fortify_OutputAllMemory() - Outputs the entire list of currently\n *     malloc'd memory. For each malloc'd block is output it's Address,\n *   Size, and the SourceFile and Line that allocated it.\n *\n *   If there is no memory on the list, this function outputs nothing.\n *\n *   It returns the number of blocks on the list, unless fortify has been\n *   disabled, in which case it always returns 0.\n */\nint FORTIFY_STORAGE\n_Fortify_OutputAllMemory(char *file,unsigned long line)\n{\n\tstruct Header *curr = st_Head;\n\tint count = 0;\n\tsize_t size = 0;\n\n        stdOutput = 0;\n\n\tif(st_Disabled)\n        {\n                WaitIfstdOutput();\n                return(0);\n        }\n\n\tFORTIFY_LOCK();\n\n\tif(curr)\n\t{\n\t\tsprintf(st_Buffer, \"\\nFortify: Memory Dump at %s.%ld\\n\", file, line);\n\t\tst_Output(st_Buffer);\n\t\tOutputLastVerifiedPoint();\n\t\tsprintf(st_Buffer, \"%11s %8s %s\\n\", \"Address\", \"Size\", \"Allocator\");\n\t\tst_Output(st_Buffer);\n\n\t\twhile(curr)\n\t\t{\n\t\t\tOutputHeader(curr);\n\t\t\tcount++;\n\t\t\tsize += curr->Size;\n\t\t\tcurr = curr->Next;\n\t\t}\n\n\t\tsprintf(st_Buffer, \"%11s %8ld bytes overhead\\n\", \"and\",\n\t\t\t\t(unsigned long)(count * (sizeof(struct Header) + FORTIFY_BEFORE_SIZE + FORTIFY_AFTER_SIZE)));\n\t\tst_Output(st_Buffer);\n\n\t\tsprintf(st_Buffer,\"%11s %8ld bytes in %d blocks\\n\", \"total\", size, count);\n\t\tst_Output(st_Buffer);\n\t}\n\n\tFORTIFY_UNLOCK();\n        WaitIfstdOutput();\n\treturn(count);\n}\n\n/* _Fortify_DumpAllMemory(Scope) - Outputs the entire list of currently\n * new'd memory within the specified scope. For each new'd block is output\n * it's Address, Size, the SourceFile and Line that allocated it, a hex dump\n * of the contents of the memory and an ascii dump of printable characters.\n *\n * If there is no memory on the list, this function outputs nothing.\n *\n * It returns the number of blocks on the list, unless Fortify has been\n * disabled, in which case it always returns 0.\n */\nint FORTIFY_STORAGE\n_Fortify_DumpAllMemory(int scope,char *file,unsigned long line)\n{\n\tstruct Header *curr = st_Head;\n\tint count = 0;\n\tsize_t size = 0;\n\n        stdOutput = 0;\n\n\tif(st_Disabled)\n        {\n                WaitIfstdOutput();\n\t\treturn(0);\n        }\n\n\tFORTIFY_LOCK();\n\n\twhile(curr)\n\t{\n\t\tif(curr->Scope >= scope)\n\t\t{\n\t\t\tif(count == 0)\n\t\t\t{\n\t\t\t\tsprintf(st_Buffer, \"\\nFortify: Memory Dump at %s.%ld\\n\", file, line);\n\t\t\t\tst_Output(st_Buffer);\n\t\t\t\tOutputLastVerifiedPoint();\n\t\t\t\tsprintf(st_Buffer, \"%11s %8s %s\\n\", \"Address\", \"Size\", \"Allocator\");\n\t\t\t\tst_Output(st_Buffer);\n\t\t\t}\n\n\t\t\tOutputHeader(curr);\n\t\t\tOutputMemory(curr);\n\t\t\tst_Output(\"\\n\");\n\t\t\tcount++;\n\t\t\tsize += curr->Size;\n\t\t}\n\n\t\tcurr = curr->Next;\n\t}\n\n\tif(count)\n\t{\n\t\tsprintf(st_Buffer, \"%11s %8ld bytes overhead\\n\", \"and\",\n\t\t\t\t\t\t(unsigned long)(count * (sizeof(struct Header) + FORTIFY_BEFORE_SIZE + FORTIFY_AFTER_SIZE)));\n\t\t\t\t\t\tst_Output(st_Buffer);\n\n\t\tsprintf(st_Buffer,\"%11s %8ld bytes in %d blocks\\n\", \"total\", size, count);\n\t\tst_Output(st_Buffer);\n\t}\n\n\tFORTIFY_UNLOCK();\n        WaitIfstdOutput();\n        return(count);\n}\n\n/*\n * _Fortify_Disable() - This function provides a mechanism to disable Fortify\n *   without recompiling all the sourcecode.\n *   If 'how' is zero then it can only be called when there is no memory on the\n *   Fortify malloc'd list. (Ideally, at the start of the program before any\n *   memory has been allocated). If you call this function when there IS\n *   memory on the Fortify malloc'd list, it will issue an error, and fortify\n *   will not be disabled.\n *   If 'how' is nonzero then output will only be disabled. This can always be\n *   done.\n */\n\nint FORTIFY_STORAGE\n_Fortify_Disable(char *file,unsigned long line,int how)\n{\n\tint result;\n\n        if (how <= 0)\n        {\n    \t    stdOutput = 0;\n\n    \t    FORTIFY_LOCK();\n\n    \t    if((st_Head) && (how == 0))\n    \t    {\n    \t\t    sprintf(st_Buffer, \"Fortify: %s.%d\\n\", file, line);\n    \t\t    st_Output(st_Buffer);\n    \t\t    st_Output(\"         Fortify_Disable failed\\n\");\n    \t\t    st_Output(\"         (because there is memory on the Fortify memory list)\\n\");\n\n    \t\t    _Fortify_OutputAllMemory(file, line);\n    \t\t    result = 0;\n    \t    }\n    \t    else\n    \t    {\n    \t\t    st_Disabled = (how >= -1 ? 1 : 0);\n    \t\t    result = 1;\n    \t    }\n\n    \t    FORTIFY_UNLOCK();\n            WaitIfstdOutput();\n        }\n        else\n        {\n            _Fortify_SetOutputFunc((Fortify_OutputFuncPtr) _Fortify_NoOutput);\n            result = 1;\n        }\n\treturn(result);\n}\n\n/*\n * Check a block's header and fortifications.\n */\nstatic int CheckBlock(struct Header *h,char *file,unsigned long line)\n{\n\tunsigned char *ptr = (unsigned char *)h;\n\tint result = 1;\n\n        stdOutput = 0;\n\n\tif(!IsHeaderValid(h))\n\t{\n\t\tsprintf(st_Buffer,\n\t\t\t\t\"\\nFortify: %s.%ld\\n         Invalid pointer or corrupted header detected (%s)\\n\",\n\t\t\t\tfile, line, address(ptr + sizeof(struct Header) + FORTIFY_BEFORE_SIZE));\n\t\tst_Output(st_Buffer);\n\t\tOutputLastVerifiedPoint();\n                WaitIfstdOutput();\n                return(0);\n\t}\n\n\tif(!CheckFortification(ptr + sizeof(struct Header),\n\t\t                   FORTIFY_BEFORE_VALUE, FORTIFY_BEFORE_SIZE))\n\t{\n\t\tsprintf(st_Buffer,\n\t\t        \"\\nFortify: %s.%ld\\n         Memory overrun detected before block\\n\",\n\t\t        file, line);\n\t\tst_Output(st_Buffer);\n\n\t\tsprintf(st_Buffer,\"         (%s,%ld,%s.%u)\\n\",\n\t\t\taddress(ptr + sizeof(struct Header) + FORTIFY_BEFORE_SIZE),\n\t\t       (unsigned long)h->Size, h->File, h->Line);\n\t\tst_Output(st_Buffer);\n\n\t\tOutputFortification(ptr + sizeof(struct Header),\n\t\t                    FORTIFY_BEFORE_VALUE, FORTIFY_BEFORE_SIZE);\n\t\tOutputLastVerifiedPoint();\n\t\tresult = 0;\n\t}\n\n\tif(!CheckFortification(ptr + sizeof(struct Header) + FORTIFY_BEFORE_SIZE + h->Size,\n\t                       FORTIFY_AFTER_VALUE, FORTIFY_AFTER_SIZE))\n\t{\n\t\tsprintf(st_Buffer, \"\\nFortify: %s.%ld\\n         Memory overrun detected after block\\n\",\n\t\t                   file, line);\n\t\tst_Output(st_Buffer);\n\n\t\tsprintf(st_Buffer,\"         (%s,%ld,%s.%u)\\n\",\n\t\t\t\t  address(ptr + sizeof(struct Header) + FORTIFY_BEFORE_SIZE),\n\t\t\t\t (unsigned long)h->Size, h->File, h->Line);\n\t\tst_Output(st_Buffer);\n\n\t\tOutputFortification(ptr + sizeof(struct Header) + FORTIFY_BEFORE_SIZE + h->Size,\n\t\t                    FORTIFY_AFTER_VALUE, FORTIFY_AFTER_SIZE);\n\t\tOutputLastVerifiedPoint();\n\t\tresult = 0;\n\t}\n\n        WaitIfstdOutput();\n\treturn(result);\n}\n\nstatic int CheckPointer(unsigned char *ptr,unsigned long size,char *file,unsigned long line)\n{\n\tstruct Header *curr;\n\tunsigned char *ptr1;\n\n\tcurr = st_Head;\n\twhile(curr)\n\t{\n\t\tptr1 = (unsigned char *)curr + sizeof(struct Header) + FORTIFY_BEFORE_SIZE;\n\t\tif(ptr + size <= (unsigned char *)curr)\n\t\t\t;\n\t\telse if(ptr >= ptr1)\n\t\t\t;\n\t\telse\n\t\t{\n\t\t\tsprintf(st_Buffer, \"\\nFortify: %s.%ld\\n         Memory access detected before block\\n\",\n\t\t                file, line);\n\t\t\tst_Output(st_Buffer);\n\n\t\t\tsprintf(st_Buffer,\"         (%s,%ld,%s.%u)\\n\",\n\t\t\t\t\taddress(ptr1),\n\t\t\t\t\t(unsigned long)curr->Size, curr->File, curr->Line);\n\t\t\tst_Output(st_Buffer);\n\n\t\t\tWaitIfstdOutput();\n\t\t\treturn(0);\n\t\t}\n\n\t\tif(ptr + size <= ptr1 + curr->Size)\n\t\t\t;\n\t\telse if(ptr >= ptr1 + curr->Size + FORTIFY_AFTER_SIZE)\n\t\t\t;\n\t\telse\n\t\t{\n\t\t\tsprintf(st_Buffer, \"\\nFortify: %s.%ld\\n         Memory access detected after block\\n\",\n\t\t                file, line);\n\t\t\tst_Output(st_Buffer);\n\n\t\t\tsprintf(st_Buffer,\"         (%s,%ld,%s.%u)\\n\",\n\t\t\t\t\taddress(ptr1),\n\t\t\t\t\t(unsigned long)curr->Size, curr->File, curr->Line);\n\t\t\tst_Output(st_Buffer);\n\n\t\t\tWaitIfstdOutput();\n\t\t\treturn(0);\n\t\t}\n\n\t\tif((ptr >= ptr1) && (ptr < ptr1 + curr->Size) && (ptr + size > ptr1 + curr->Size))\n\t\t{\n\t\t\tsprintf(st_Buffer, \"\\nFortify: %s.%ld\\n         Memory access detected after block\\n\",\n\t\t                file, line);\n\t\t\tst_Output(st_Buffer);\n\n\t\t\tsprintf(st_Buffer,\"         (%s,%ld,%s.%u)\\n\",\n\t\t\t\t\taddress(ptr + sizeof(struct Header) + FORTIFY_BEFORE_SIZE),\n\t\t\t\t\t(unsigned long)curr->Size, curr->File, curr->Line);\n\t\t\tst_Output(st_Buffer);\n\t\t\tWaitIfstdOutput();\n\t\t\treturn(0);\n\t\t}\n\n\t\tcurr = curr->Next;\n\t}\n\treturn(1);\n}\n\n/*\n * Checks if the _size_ bytes from _ptr_ are all set to _value_\n */\nstatic int CheckFortification(unsigned char *ptr,unsigned char value,size_t size)\n{\n\twhile(size--)\n\t\tif(*ptr++ != value)\n\t\t\treturn(0);\n\n\treturn(1);\n}\n\n/*\n * Set the _size_ bytes from _ptr_ to _value_.\n */\nstatic void SetFortification(unsigned char *ptr,unsigned char value,size_t size)\n{\n\tmemset(ptr, value, size);\n}\n\n/*\n * Output the corrupted section of the fortification\n */\n/* Output the corrupted section of the fortification */\nstatic void\nOutputFortification(unsigned char *ptr,unsigned char value,size_t size)\n{\n\tunsigned long offset, column;\n\tchar\tascii[17];\n\n\tst_Output(\"Address     Offset Data\");\n\n\toffset = 0;\n\tcolumn = 0;\n\n\twhile(offset < size)\n\t{\n\t\tif(column == 0)\n\t\t{\n\t\t\tsprintf(st_Buffer, \"\\n%8s %8d \", address(ptr), offset);\n\t\t\tst_Output(st_Buffer);\n\t\t}\n\n\t\tsprintf(st_Buffer, \"%02x \", *ptr);\n\t\tst_Output(st_Buffer);\n\n\t\tascii[ (int) column ] = isprint( *ptr ) ? (char)(*ptr) : (char)(' ');\n\t\tascii[ (int) (column + 1) ] = '\\0';\n\n\t\tptr++;\n\t\toffset++;\n\t\tcolumn++;\n\n\t\tif(column == 16)\n\t\t{\n\t\t\tst_Output( \"   \\\"\" );\n\t\t\tst_Output( ascii );\n\t\t\tst_Output( \"\\\"\" );\n\t\t\tcolumn = 0;\n\t\t}\n\t}\n\n\tif ( column != 0 )\n\t{\n\t\twhile ( column ++ < 16 )\n\t\t{\n\t\t\tst_Output( \"   \" );\n\t\t}\n\t\tst_Output( \"   \\\"\" );\n\t\tst_Output( ascii );\n\t\tst_Output( \"\\\"\" );\n\t}\n\n\tst_Output(\"\\n\");\n}\n\n/*\n * Returns true if the supplied pointer does indeed point to a real Header\n */\nstatic int IsHeaderValid(struct Header *h)\n{\n\treturn(!ChecksumHeader(h));\n}\n\n/*\n * Updates the checksum to make the header valid\n */\nstatic void MakeHeaderValid(struct Header *h)\n{\n\th->Checksum = 0;\n\th->Checksum = -ChecksumHeader(h);\n}\n\n/*\n * Calculate (and return) the checksum of the header. (Including the Checksum\n * variable itself. If all is well, the checksum returned by this function should\n * be 0.\n */\nstatic int ChecksumHeader(struct Header *h)\n{\n\tregister int c, checksum, *p;\n\n\tfor(c = 0, checksum = 0, p = (int *)h; c < sizeof(struct Header)/sizeof(int); c++)\n\t\tchecksum += *p++;\n\n\treturn(checksum);\n}\n\n/*\n * Examines the malloc'd list to see if the given header is on it.\n */\nstatic int IsOnList(struct Header *h)\n{\n\tstruct Header *curr;\n\n\tcurr = st_Head;\n\twhile(curr)\n\t{\n\t\tif(curr == h)\n\t\t\treturn(1);\n\t\tcurr = curr->Next;\n\t}\n\n\treturn(0);\n}\n\n\n/*\n * Hex and ascii dump the memory\n */\nstatic void\nOutputMemory(struct Header *h)\n{\n\tOutputFortification((unsigned char*)h + sizeof(struct Header) + FORTIFY_BEFORE_SIZE,\n\t\t\t\t\t\t0, h->Size);\n}\n\n\n/*\n * Output the header...\n */\nstatic void OutputHeader(struct Header *h)\n{\n\tsprintf(st_Buffer, \"%11s %8ld %s.%u (%d)\\n\",\n\t\t\t   address((unsigned char*)h + sizeof(struct Header) + FORTIFY_BEFORE_SIZE),\n\t\t\t   (unsigned long)h->Size,\n\t\t\t   h->File, h->Line, (int) h->Scope);\n\tst_Output(st_Buffer);\n}\n\nstatic void OutputLastVerifiedPoint()\n{\n\tsprintf(st_Buffer, \"\\nLast Verified point: %s.%u\\n\",\n\t\t\t   st_LastVerifiedFile,\n\t\t\t   st_LastVerifiedLine);\n\tst_Output(st_Buffer);\n}\n\n#else  /* FORTIFY_TRANSPARENT */\n\nvoid *FORTIFY_STORAGE\n_Fortify_malloc(size,file,line)\n size_t size;\n char *file;\n unsigned long line;\n{\n\treturn(malloc(size));\n}\n\nvoid FORTIFY_STORAGE\n_Fortify_free(uptr,file,line)\n void *uptr;\n char *file;\n unsigned long line;\n{\n\tfree(uptr);\n}\n\nvoid *FORTIFY_STORAGE\n_Fortify_realloc(ptr,new_size,file,line)\n void *ptr;\n size_t new_size;\n char *file;\n unsigned long line;\n{\n\treturn(realloc(ptr, new_size));\n}\n\nint FORTIFY_STORAGE\n_Fortify_CheckPointer(uptr,file,line)\n void *uptr;\n char *file;\n unsigned long line;\n{\n\treturn(1);\n}\n\nFortify_OutputFuncPtr FORTIFY_STORAGE\n_Fortify_SetOutputFunc(Output)\n Fortify_OutputFuncPtr Output;\n{\n\treturn(0);\n}\n\nint FORTIFY_STORAGE\n_Fortify_SetMallocFailRate(Percent)\n int Percent;\n{\n\treturn(0);\n}\n\nint FORTIFY_STORAGE\n_Fortify_CheckAllMemory(file,line)\n char *file;\n unsigned long line;\n{\n\treturn(0);\n}\n\nint FORTIFY_STORAGE\n_Fortify_EnterScope(file,line)\n char *file;\n unsigned long line;\n{\n\treturn(0);\n}\n\nint FORTIFY_STORAGE\n_Fortify_LeaveScope(file,line)\n char *file;\n unsigned long line;\n{\n\treturn(0);\n}\n\nint FORTIFY_STORAGE\n_Fortify_OutputAllMemory(file,line)\n char *file;\n unsigned long line;\n{\n\treturn(0);\n}\n\nint FORTIFY_STORAGE\n_Fortify_DumpAllMemory(scope,file,line)\n int scope;\n char *file;\n unsigned long line;\n{\n\treturn(0);\n}\n\nint FORTIFY_STORAGE\n_Fortify_Disable(file,line)\n char *file;\n unsigned long line;\n{\n\treturn(1);\n}\n\n#endif /* !FORTIFY_TRANSPARENT */\n\n/* function that use _Fortify_malloc(), _Fortify_realloc(), _Fortify_free() */\n\n/*\n * Fortifty_calloc() - Uses _Fortify_malloc() to implement calloc(). Much\n *                     the same protection as _Fortify_malloc().\n */\nvoid *FORTIFY_STORAGE\n_Fortify_calloc(size_t nitems,size_t size,char *file,unsigned long line)\n{\n\tvoid *ptr;\n\n\tptr = _Fortify_malloc(nitems * size, file, line);\n\n\tif(ptr)\n\t\tmemset(ptr, 0, nitems * size);\n\n\treturn(ptr);\n}\n\n/*\n * Fortifty_strdup() - Uses _Fortify_malloc() to implement strdup(). Much\n *                     the same protection as _Fortify_malloc().\n * The library function is not used because it is not certain that getpwd\n * uses the library malloc function (if linked with an alternate library)\n * and if the memory is freed then strange things can happen\n */\nchar *FORTIFY_STORAGE\n_Fortify_strdup(char *str,char *file,unsigned long line)\n{\n\tchar *ptr;\n\tunsigned long l;\n\n\tif(str == NULL) {\n\t\tsprintf(st_Buffer,\n\t\t\t\"\\nFortify: %s.%ld\\n         \", file, line);\n\t\tsprintf(st_Buffer + strlen(st_Buffer), \"%s\", \"strdup pointer is NULL\", file, line);\n\t\tstrcat(st_Buffer, \"\\n\");\n\t\tst_Output(st_Buffer);\n\t\tFORTIFY_UNLOCK();\n\t\tWaitIfstdOutput();\n\t\treturn(0);\n\t}\n\n\tl = (int) strlen(str) + 1;\n\t__Fortify_CheckPointer(str,0,l,file,line);\n\n\tptr = (char *) _Fortify_malloc(l, file, line);\n\n\tif(ptr)\n\t\tstrcpy(ptr, str);\n\n\treturn(ptr);\n}\n\n/*\n * Fortifty_getpwd() - Uses _Fortify_malloc() to implement getpwd(). Much\n *                     the same protection as _Fortify_malloc().\n * Memory is not allocated bu getcwd but by our routine for the same reason\n * as for strdup\n */\nchar *FORTIFY_STORAGE\n_Fortify_getcwd(char *buf,int size,char *file,unsigned long line)\n{\n\tchar *ptr;\n\n        if(buf!=NULL)\n                ptr = buf;\n\telse\n        \tptr = (char *) _Fortify_malloc(size + 1, file, line);\n\n\tif(ptr)\n\t\tptr = getcwd(ptr, size);\n\n\treturn(ptr);\n}\n\n/*\n * Fortifty_tempnam() - Uses _Fortify_strdup() to implement tempnam(). Much\n *                     the same protection as _Fortify_malloc().\n */\nchar *FORTIFY_STORAGE\n_Fortify_tempnam(char *dir,char *pfx,char *file,unsigned long line)\n{\n\tchar *ptr1, *ptr2;\n\n        ptr1 = tempnam(dir,pfx);\n\n\tif(ptr1)\n        {\n                ptr2=_Fortify_strdup(ptr1,file,line);\n                free(ptr1);\n                ptr1=ptr2;\n        }\n\n\treturn(ptr1);\n}\n\n/*\n * Fortify_memcpy()  - check if from/to is in allocated space and if so, then check if start/end is not outside allocated space.\n */\nvoid *FORTIFY_STORAGE\n_Fortify_memcpy(void *to,void *from,size_t size,char *file,unsigned long line)\n{\n    if (size) {\n\t    if((from == NULL) || (to == NULL)) {\n\t\t    sprintf(st_Buffer,\n\t\t\t    \"\\nFortify: %s.%ld\\n         \", file, line);\n\t\t    if(from == NULL)\n\t\t\t    sprintf(st_Buffer + strlen(st_Buffer), \"%s\", \"memcpy from pointer is NULL\", file, line);\n\t\t    if(to == NULL)\n\t\t\t    sprintf(st_Buffer + strlen(st_Buffer), \"%s%s\", (from == NULL) ? \"\" : \" and \", \"memcpy to pointer is NULL\", file, line);\n\t\t    strcat(st_Buffer, \"\\n\");\n\t\t    st_Output(st_Buffer);\n\t\t    FORTIFY_UNLOCK();\n\t\t    WaitIfstdOutput();\n\t\t    return(NULL);\n\t    }\n\n\t    __Fortify_CheckPointer(to,0,size,file,line);\n\t    __Fortify_CheckPointer(from,0,size,file,line);\n    }\n\treturn(memcpy(to,from,size));\n}\n\n/*\n * Fortify_memmove()  - check if from/to is in allocated space and if so, then check if start/end is not outside allocated space.\n */\nvoid *FORTIFY_STORAGE\n_Fortify_memmove(void *to,void *from,size_t size,char *file,unsigned long line)\n{\n\tif((from == NULL) || (to == NULL)) {\n\t\tsprintf(st_Buffer,\n\t\t\t\"\\nFortify: %s.%ld\\n         \", file, line);\n\t\tif(from == NULL)\n\t\t\tsprintf(st_Buffer + strlen(st_Buffer), \"%s\", \"memmove from pointer is NULL\", file, line);\n\t\tif(to == NULL)\n\t\t\tsprintf(st_Buffer + strlen(st_Buffer), \"%s%s\", (from == NULL) ? \"\" : \" and \", \"memmove to pointer is NULL\", file, line);\n\t\tstrcat(st_Buffer, \"\\n\");\n\t\tst_Output(st_Buffer);\n\t\tFORTIFY_UNLOCK();\n\t\tWaitIfstdOutput();\n\t\treturn(NULL);\n\t}\n\n\t__Fortify_CheckPointer(to,0,size,file,line);\n\t__Fortify_CheckPointer(from,0,size,file,line);\n\treturn(memmove(to,from,size));\n}\n\n/*\n * Fortify_memccpy()  - check if from/to is in allocated space and if so, then check if start/end is not outside allocated space.\n */\nvoid *FORTIFY_STORAGE\n_Fortify_memccpy(void *to,void *from,int c,size_t size,char *file,unsigned long line)\n{\n\tif((from == NULL) || (to == NULL)) {\n\t\tsprintf(st_Buffer,\n\t\t\t\"\\nFortify: %s.%ld\\n         \", file, line);\n\t\tif(from == NULL)\n\t\t\tsprintf(st_Buffer + strlen(st_Buffer), \"%s\", \"memccpy from pointer is NULL\", file, line);\n\t\tif(to == NULL)\n\t\t\tsprintf(st_Buffer + strlen(st_Buffer), \"%s%s\", (from == NULL) ? \"\" : \" and \", \"memccpy to pointer is NULL\", file, line);\n\t\tstrcat(st_Buffer, \"\\n\");\n\t\tst_Output(st_Buffer);\n\t\tFORTIFY_UNLOCK();\n\t\tWaitIfstdOutput();\n\t\treturn(NULL);\n\t}\n\n\t__Fortify_CheckPointer(to,0,size,file,line);\n\t__Fortify_CheckPointer(from,0,size,file,line);\n\treturn(memccpy(to,from,c,size));\n}\n\n/*\n * Fortify_memset()  - check if from/to is in allocated space and if so, then check if start/end is not outside allocated space.\n */\nvoid *FORTIFY_STORAGE\n_Fortify_memset(void *buffer,int c,size_t size,char *file,unsigned long line)\n{\n\tif(buffer == NULL) {\n\t\tsprintf(st_Buffer,\n\t\t\t\"\\nFortify: %s.%ld\\n         memset pointer is NULL\\n\", file, line);\n\t\tst_Output(st_Buffer);\n\t\tFORTIFY_UNLOCK();\n\t\tWaitIfstdOutput();\n\t\treturn(NULL);\n\t}\n\n\t__Fortify_CheckPointer(buffer,0,size,file,line);\n\treturn(memset(buffer,c,size));\n}\n\n/*\n * Fortify_memchr()  - check if from/to is in allocated space and if so, then check if start/end is not outside allocated space.\n */\nvoid *FORTIFY_STORAGE\n_Fortify_memchr(void *buffer,int c,size_t size,char *file,unsigned long line)\n{\n\tif(buffer == NULL) {\n\t\tsprintf(st_Buffer,\n\t\t\t\"\\nFortify: %s.%ld\\n         memchr pointer is NULL\\n\", file, line);\n\t\tst_Output(st_Buffer);\n\t\tFORTIFY_UNLOCK();\n\t\tWaitIfstdOutput();\n\t\treturn(NULL);\n\t}\n\n\t__Fortify_CheckPointer(buffer,0,size,file,line);\n\treturn(memchr(buffer,c,size));\n}\n\n/*\n * Fortify_memcmp()  - check if from/to is in allocated space and if so, then check if start/end is not outside allocated space.\n */\nint FORTIFY_STORAGE\n_Fortify_memcmp(void *buffer1,void *buffer2,size_t size,char *file,unsigned long line)\n{\n\tif((buffer1 == NULL) || (buffer2 == NULL)) {\n\t\tsprintf(st_Buffer,\n\t\t\t\"\\nFortify: %s.%ld\\n         \", file, line);\n\t\tif(buffer1 == NULL)\n\t\t\tsprintf(st_Buffer + strlen(st_Buffer), \"%s\", \"memcmp first pointer is NULL\", file, line);\n\t\tif(buffer2 == NULL)\n\t\t\tsprintf(st_Buffer + strlen(st_Buffer), \"%s%s\", (buffer2 == NULL) ? \"\" : \" and \", \"memcmp second pointer is NULL\", file, line);\n\t\tstrcat(st_Buffer, \"\\n\");\n\t\tst_Output(st_Buffer);\n\t\tFORTIFY_UNLOCK();\n\t\tWaitIfstdOutput();\n\t\treturn(0);\n\t}\n\n\t__Fortify_CheckPointer(buffer1,0,size,file,line);\n\t__Fortify_CheckPointer(buffer2,0,size,file,line);\n\treturn(memcmp(buffer1,buffer2,size));\n}\n\n/*\n * Fortify_memicmp()  - check if from/to is in allocated space and if so, then check if start/end is not outside allocated space.\n */\nint FORTIFY_STORAGE\n_Fortify_memicmp(void *buffer1,void *buffer2,size_t size,char *file,unsigned long line)\n{\n\tif((buffer1 == NULL) || (buffer2 == NULL)) {\n\t\tsprintf(st_Buffer,\n\t\t\t\"\\nFortify: %s.%ld\\n         \", file, line);\n\t\tif(buffer1 == NULL)\n\t\t\tsprintf(st_Buffer + strlen(st_Buffer), \"%s\", \"memicmp first pointer is NULL\", file, line);\n\t\tif(buffer2 == NULL)\n\t\t\tsprintf(st_Buffer + strlen(st_Buffer), \"%s%s\", (buffer2 == NULL) ? \"\" : \" and \", \"memicmp second pointer is NULL\", file, line);\n\t\tstrcat(st_Buffer, \"\\n\");\n\t\tst_Output(st_Buffer);\n\t\tFORTIFY_UNLOCK();\n\t\tWaitIfstdOutput();\n\t\treturn(0);\n\t}\n\n\t__Fortify_CheckPointer(buffer1,0,size,file,line);\n\t__Fortify_CheckPointer(buffer2,0,size,file,line);\n\treturn(memicmp(buffer1,buffer2,size));\n}\n\n/*\n * Fortify_strcoll()  - check if from/to is in allocated space and if so, then check if start/end is not outside allocated space.\n */\nint FORTIFY_STORAGE\n_Fortify_strcoll(char *buffer1,char *buffer2,char *file,unsigned long line)\n{\n\tif((buffer1 == NULL) || (buffer2 == NULL)) {\n\t\tsprintf(st_Buffer,\n\t\t\t\"\\nFortify: %s.%ld\\n         \", file, line);\n\t\tif(buffer1 == NULL)\n\t\t\tsprintf(st_Buffer + strlen(st_Buffer), \"%s\", \"strcoll first pointer is NULL\", file, line);\n\t\tif(buffer2 == NULL)\n\t\t\tsprintf(st_Buffer + strlen(st_Buffer), \"%s%s\", (buffer2 == NULL) ? \"\" : \" and \", \"strcoll second pointer is NULL\", file, line);\n\t\tstrcat(st_Buffer, \"\\n\");\n\t\tst_Output(st_Buffer);\n\t\tFORTIFY_UNLOCK();\n\t\tWaitIfstdOutput();\n\t\treturn(0);\n\t}\n\n\t__Fortify_CheckPointer(buffer1,0,strlen(buffer1)+1,file,line);\n\t__Fortify_CheckPointer(buffer2,0,strlen(buffer2)+1,file,line);\n\treturn(strcoll(buffer1,buffer2));\n}\n\n/*\n * Fortify_strcspn()  - check if from/to is in allocated space and if so, then check if start/end is not outside allocated space.\n */\nsize_t FORTIFY_STORAGE\n_Fortify_strcspn(char *buffer1,char *buffer2,char *file,unsigned long line)\n{\n\tif((buffer1 == NULL) || (buffer2 == NULL)) {\n\t\tsprintf(st_Buffer,\n\t\t\t\"\\nFortify: %s.%ld\\n         \", file, line);\n\t\tif(buffer1 == NULL)\n\t\t\tsprintf(st_Buffer + strlen(st_Buffer), \"%s\", \"strcspn first pointer is NULL\", file, line);\n\t\tif(buffer2 == NULL)\n\t\t\tsprintf(st_Buffer + strlen(st_Buffer), \"%s%s\", (buffer2 == NULL) ? \"\" : \" and \", \"strcspn second pointer is NULL\", file, line);\n\t\tstrcat(st_Buffer, \"\\n\");\n\t\tst_Output(st_Buffer);\n\t\tFORTIFY_UNLOCK();\n\t\tWaitIfstdOutput();\n\t\treturn(0);\n\t}\n\n\t__Fortify_CheckPointer(buffer1,0,strlen(buffer1)+1,file,line);\n\t__Fortify_CheckPointer(buffer2,0,strlen(buffer2)+1,file,line);\n\treturn(strcspn(buffer1,buffer2));\n}\n\n/*\n * Fortify_strcmp()  - check if from/to is in allocated space and if so, then check if start/end is not outside allocated space.\n */\nint FORTIFY_STORAGE\n_Fortify_strcmp(char *buffer1,char *buffer2,char *file,unsigned long line)\n{\n\tif((buffer1 == NULL) || (buffer2 == NULL)) {\n\t\tsprintf(st_Buffer,\n\t\t\t\"\\nFortify: %s.%ld\\n         \", file, line);\n\t\tif(buffer1 == NULL)\n\t\t\tsprintf(st_Buffer + strlen(st_Buffer), \"%s\", \"strcmp first pointer is NULL\", file, line);\n\t\tif(buffer2 == NULL)\n\t\t\tsprintf(st_Buffer + strlen(st_Buffer), \"%s%s\", (buffer2 == NULL) ? \"\" : \" and \", \"strcmp second pointer is NULL\", file, line);\n\t\tstrcat(st_Buffer, \"\\n\");\n\t\tst_Output(st_Buffer);\n\t\tFORTIFY_UNLOCK();\n\t\tWaitIfstdOutput();\n\t\treturn(0);\n\t}\n\n\t__Fortify_CheckPointer(buffer1,0,strlen(buffer1)+1,file,line);\n\t__Fortify_CheckPointer(buffer2,0,strlen(buffer2)+1,file,line);\n\treturn(strcmp(buffer1,buffer2));\n}\n\n/*\n * Fortify_strcmpi()  - check if from/to is in allocated space and if so, then check if start/end is not outside allocated space.\n */\nint FORTIFY_STORAGE\n_Fortify_strcmpi(char *buffer1,char *buffer2,char *file,unsigned long line)\n{\n\tif((buffer1 == NULL) || (buffer2 == NULL)) {\n\t\tsprintf(st_Buffer,\n\t\t\t\"\\nFortify: %s.%ld\\n         \", file, line);\n\t\tif(buffer1 == NULL)\n\t\t\tsprintf(st_Buffer + strlen(st_Buffer), \"%s\", \"strcmpi first pointer is NULL\", file, line);\n\t\tif(buffer2 == NULL)\n\t\t\tsprintf(st_Buffer + strlen(st_Buffer), \"%s%s\", (buffer2 == NULL) ? \"\" : \" and \", \"strcmpi second pointer is NULL\", file, line);\n\t\tstrcat(st_Buffer, \"\\n\");\n\t\tst_Output(st_Buffer);\n\t\tFORTIFY_UNLOCK();\n\t\tWaitIfstdOutput();\n\t\treturn(0);\n\t}\n\n\t__Fortify_CheckPointer(buffer1,0,strlen(buffer1)+1,file,line);\n\t__Fortify_CheckPointer(buffer2,0,strlen(buffer2)+1,file,line);\n\treturn(strcmpi(buffer1,buffer2));\n}\n\n/*\n * Fortify_strncmp()  - check if from/to is in allocated space and if so, then check if start/end is not outside allocated space.\n */\nint FORTIFY_STORAGE\n_Fortify_strncmp(char *buffer1,char *buffer2,size_t size,char *file,unsigned long line)\n{\n\tif((buffer1 == NULL) || (buffer2 == NULL)) {\n\t\tsprintf(st_Buffer,\n\t\t\t\"\\nFortify: %s.%ld\\n         \", file, line);\n\t\tif(buffer1 == NULL)\n\t\t\tsprintf(st_Buffer + strlen(st_Buffer), \"%s\", \"strncmp first pointer is NULL\", file, line);\n\t\tif(buffer2 == NULL)\n\t\t\tsprintf(st_Buffer + strlen(st_Buffer), \"%s%s\", (buffer2 == NULL) ? \"\" : \" and \", \"strncmp second pointer is NULL\", file, line);\n\t\tstrcat(st_Buffer, \"\\n\");\n\t\tst_Output(st_Buffer);\n\t\tFORTIFY_UNLOCK();\n\t\tWaitIfstdOutput();\n\t\treturn(0);\n\t}\n\n\t__Fortify_CheckPointer(buffer1,0,MIN(strlen(buffer1)+1,size),file,line);\n\t__Fortify_CheckPointer(buffer2,0,MIN(strlen(buffer2)+1,size),file,line);\n\treturn(strncmp(buffer1,buffer2,size));\n}\n\n/*\n * Fortify_strnicmp()  - check if from/to is in allocated space and if so, then check if start/end is not outside allocated space.\n */\nint FORTIFY_STORAGE\n_Fortify_strnicmp(char *buffer1,char *buffer2,size_t size,char *file,unsigned long line)\n{\n\tif((buffer1 == NULL) || (buffer2 == NULL)) {\n\t\tsprintf(st_Buffer,\n\t\t\t\"\\nFortify: %s.%ld\\n         \", file, line);\n\t\tif(buffer1 == NULL)\n\t\t\tsprintf(st_Buffer + strlen(st_Buffer), \"%s\", \"strnicmp first pointer is NULL\", file, line);\n\t\tif(buffer2 == NULL)\n\t\t\tsprintf(st_Buffer + strlen(st_Buffer), \"%s%s\", (buffer2 == NULL) ? \"\" : \" and \", \"strnicmp second pointer is NULL\", file, line);\n\t\tstrcat(st_Buffer, \"\\n\");\n\t\tst_Output(st_Buffer);\n\t\tFORTIFY_UNLOCK();\n\t\tWaitIfstdOutput();\n\t\treturn(0);\n\t}\n\n\t__Fortify_CheckPointer(buffer1,0,MIN(strlen(buffer1)+1,size),file,line);\n\t__Fortify_CheckPointer(buffer2,0,MIN(strlen(buffer2)+1,size),file,line);\n\treturn(strnicmp(buffer1,buffer2,size));\n}\n\n/*\n * Fortify_strchr()  - check if from/to is in allocated space and if so, then check if start/end is not outside allocated space.\n */\nchar *FORTIFY_STORAGE\n_Fortify_strchr(char *buffer,int c,char *file,unsigned long line)\n{\n\tif(buffer == NULL) {\n\t\tsprintf(st_Buffer,\n\t\t\t\"\\nFortify: %s.%ld\\n         strchr pointer is NULL\\n\", file, line);\n\t\tst_Output(st_Buffer);\n\t\tFORTIFY_UNLOCK();\n\t\tWaitIfstdOutput();\n\t\treturn(NULL);\n\t}\n\n\t__Fortify_CheckPointer(buffer,0,strlen(buffer)+1,file,line);\n\treturn(strchr(buffer,c));\n}\n\n/*\n * Fortify_strrchr()  - check if from/to is in allocated space and if so, then check if start/end is not outside allocated space.\n */\nchar *FORTIFY_STORAGE\n_Fortify_strrchr(char *buffer,int c,char *file,unsigned long line)\n{\n\tif(buffer == NULL) {\n\t\tsprintf(st_Buffer,\n\t\t\t\"\\nFortify: %s.%ld\\n         strchr pointer is NULL\\n\", file, line);\n\t\tst_Output(st_Buffer);\n\t\tFORTIFY_UNLOCK();\n\t\tWaitIfstdOutput();\n\t\treturn(NULL);\n\t}\n\n\t__Fortify_CheckPointer(buffer,0,strlen(buffer)+1,file,line);\n\treturn(strrchr(buffer,c));\n}\n\n/*\n * Fortify_strlwr()  - check if from/to is in allocated space and if so, then check if start/end is not outside allocated space.\n */\nchar *FORTIFY_STORAGE\n_Fortify_strlwr(char *buffer,char *file,unsigned long line)\n{\n\tif(buffer == NULL) {\n\t\tsprintf(st_Buffer,\n\t\t\t\"\\nFortify: %s.%ld\\n         strlwr pointer is NULL\\n\", file, line);\n\t\tst_Output(st_Buffer);\n\t\tFORTIFY_UNLOCK();\n\t\tWaitIfstdOutput();\n\t\treturn(NULL);\n\t}\n\n\t__Fortify_CheckPointer(buffer,0,strlen(buffer)+1,file,line);\n\treturn(strlwr(buffer));\n}\n\n/*\n * Fortify_strlwr()  - check if from/to is in allocated space and if so, then check if start/end is not outside allocated space.\n */\nchar *FORTIFY_STORAGE\n_Fortify_strupr(char *buffer,char *file,unsigned long line)\n{\n\tif(buffer == NULL) {\n\t\tsprintf(st_Buffer,\n\t\t\t\"\\nFortify: %s.%ld\\n         strupr pointer is NULL\\n\", file, line);\n\t\tst_Output(st_Buffer);\n\t\tFORTIFY_UNLOCK();\n\t\tWaitIfstdOutput();\n\t\treturn(NULL);\n\t}\n\n\t__Fortify_CheckPointer(buffer,0,strlen(buffer)+1,file,line);\n\treturn(strupr(buffer));\n}\n\n/*\n * Fortify_strrev()  - check if from/to is in allocated space and if so, then check if start/end is not outside allocated space.\n */\nchar *FORTIFY_STORAGE\n_Fortify_strrev(char *buffer,char *file,unsigned long line)\n{\n\tif(buffer == NULL) {\n\t\tsprintf(st_Buffer,\n\t\t\t\"\\nFortify: %s.%ld\\n         strrev pointer is NULL\\n\", file, line);\n\t\tst_Output(st_Buffer);\n\t\tFORTIFY_UNLOCK();\n\t\tWaitIfstdOutput();\n\t\treturn(NULL);\n\t}\n\n\t__Fortify_CheckPointer(buffer,0,strlen(buffer)+1,file,line);\n\treturn(strrev(buffer));\n}\n\n/*\n * Fortify_strlen()  - check if from/to is in allocated space and if so, then check if start/end is not outside allocated space.\n */\nsize_t FORTIFY_STORAGE\n_Fortify_strlen(char *buffer,char *file,unsigned long line)\n{\n\tunsigned long l;\n\n\tif(buffer == NULL) {\n\t\tsprintf(st_Buffer,\n\t\t\t\"\\nFortify: %s.%ld\\n         strlen pointer is NULL\\n\", file, line);\n\t\tst_Output(st_Buffer);\n\t\tFORTIFY_UNLOCK();\n\t\tWaitIfstdOutput();\n\t\treturn(0);\n\t}\n\n\tl = strlen(buffer);\n\t__Fortify_CheckPointer(buffer,0,l+1,file,line);\n\treturn(l);\n}\n\n/*\n * Fortify_strcat()  - check if from/to is in allocated space and if so, then check if start/end is not outside allocated space.\n */\nchar *FORTIFY_STORAGE\n_Fortify_strcat(char *buffer1,char *buffer2,char *file,unsigned long line)\n{\n\tunsigned long l;\n\n\tif((buffer1 == NULL) || (buffer2 == NULL)) {\n\t\tsprintf(st_Buffer,\n\t\t\t\"\\nFortify: %s.%ld\\n         \", file, line);\n\t\tif(buffer1 == NULL)\n\t\t\tsprintf(st_Buffer + strlen(st_Buffer), \"%s\", \"strcat first pointer is NULL\", file, line);\n\t\tif(buffer2 == NULL)\n\t\t\tsprintf(st_Buffer + strlen(st_Buffer), \"%s%s\", (buffer2 == NULL) ? \"\" : \" and \", \"strcat second pointer is NULL\", file, line);\n\t\tstrcat(st_Buffer, \"\\n\");\n\t\tst_Output(st_Buffer);\n\t\tFORTIFY_UNLOCK();\n\t\tWaitIfstdOutput();\n\t\treturn(0);\n\t}\n\n\tl = strlen(buffer2)+1;\n\t__Fortify_CheckPointer(buffer1,0,l,file,line);\n\t__Fortify_CheckPointer(buffer2,0,l,file,line);\n\treturn(strcat(buffer1,buffer2));\n}\n\n/*\n * Fortify_strpbrk()  - check if from/to is in allocated space and if so, then check if start/end is not outside allocated space.\n */\nchar *FORTIFY_STORAGE\n_Fortify_strpbrk(char *buffer1,char *buffer2,char *file,unsigned long line)\n{\n\tunsigned long l;\n\n\tif((buffer1 == NULL) || (buffer2 == NULL)) {\n\t\tsprintf(st_Buffer,\n\t\t\t\"\\nFortify: %s.%ld\\n         \", file, line);\n\t\tif(buffer1 == NULL)\n\t\t\tsprintf(st_Buffer + strlen(st_Buffer), \"%s\", \"strpbrk first pointer is NULL\", file, line);\n\t\tif(buffer2 == NULL)\n\t\t\tsprintf(st_Buffer + strlen(st_Buffer), \"%s%s\", (buffer2 == NULL) ? \"\" : \" and \", \"strpbrk second pointer is NULL\", file, line);\n\t\tstrcat(st_Buffer, \"\\n\");\n\t\tst_Output(st_Buffer);\n\t\tFORTIFY_UNLOCK();\n\t\tWaitIfstdOutput();\n\t\treturn(0);\n\t}\n\n\tl = strlen(buffer2)+1;\n\t__Fortify_CheckPointer(buffer1,0,strlen(buffer1)+1,file,line);\n\t__Fortify_CheckPointer(buffer2,0,l,file,line);\n\treturn(strpbrk(buffer1,buffer2));\n}\n\n/*\n * Fortify_strstr()  - check if from/to is in allocated space and if so, then check if start/end is not outside allocated space.\n */\nchar *FORTIFY_STORAGE\n_Fortify_strstr(char *buffer1,char *buffer2,char *file,unsigned long line)\n{\n\tunsigned long l;\n\n\tif((buffer1 == NULL) || (buffer2 == NULL)) {\n\t\tsprintf(st_Buffer,\n\t\t\t\"\\nFortify: %s.%ld\\n         \", file, line);\n\t\tif(buffer1 == NULL)\n\t\t\tsprintf(st_Buffer + strlen(st_Buffer), \"%s\", \"strstr first pointer is NULL\", file, line);\n\t\tif(buffer2 == NULL)\n\t\t\tsprintf(st_Buffer + strlen(st_Buffer), \"%s%s\", (buffer2 == NULL) ? \"\" : \" and \", \"strstr second pointer is NULL\", file, line);\n\t\tstrcat(st_Buffer, \"\\n\");\n\t\tst_Output(st_Buffer);\n\t\tFORTIFY_UNLOCK();\n\t\tWaitIfstdOutput();\n\t\treturn(0);\n\t}\n\n\tl = strlen(buffer2)+1;\n\t__Fortify_CheckPointer(buffer1,0,strlen(buffer1)+1,file,line);\n\t__Fortify_CheckPointer(buffer2,0,l,file,line);\n\treturn(strstr(buffer1,buffer2));\n}\n\n/*\n * Fortify_strtol()  - check if from/to is in allocated space and if so, then check if start/end is not outside allocated space.\n */\nlong FORTIFY_STORAGE\n_Fortify_strtol(char *buffer1,char **buffer2,int n,char *file,unsigned long line)\n{\n\tif(buffer1 == NULL) {\n\t\tsprintf(st_Buffer,\n\t\t\t\"\\nFortify: %s.%ld\\n         \", file, line);\n\t\tsprintf(st_Buffer + strlen(st_Buffer), \"%s\", \"strtol first pointer is NULL\", file, line);\n\t\tstrcat(st_Buffer, \"\\n\");\n\t\tst_Output(st_Buffer);\n\t\tFORTIFY_UNLOCK();\n\t\tWaitIfstdOutput();\n\t\treturn(0);\n\t}\n\n\t__Fortify_CheckPointer(buffer1,0,strlen(buffer1)+1,file,line);\n\treturn(strtol(buffer1,buffer2,n));\n}\n\n/*\n * Fortify_atoi()  - check if from/to is in allocated space and if so, then check if start/end is not outside allocated space.\n */\nint FORTIFY_STORAGE\n_Fortify_atoi(char *buffer1,char *file,unsigned long line)\n{\n\tif(buffer1 == NULL) {\n\t\tsprintf(st_Buffer,\n\t\t\t\"\\nFortify: %s.%ld\\n         \", file, line);\n\t\tsprintf(st_Buffer + strlen(st_Buffer), \"%s\", \"atoi first pointer is NULL\", file, line);\n\t\tstrcat(st_Buffer, \"\\n\");\n\t\tst_Output(st_Buffer);\n\t\tFORTIFY_UNLOCK();\n\t\tWaitIfstdOutput();\n\t\treturn(0);\n\t}\n\n\t__Fortify_CheckPointer(buffer1,0,strlen(buffer1)+1,file,line);\n\treturn(atoi(buffer1));\n}\n\n/*\n * Fortify_atol()  - check if from/to is in allocated space and if so, then check if start/end is not outside allocated space.\n */\nlong FORTIFY_STORAGE\n_Fortify_atol(char *buffer1,char *file,unsigned long line)\n{\n\tif(buffer1 == NULL) {\n\t\tsprintf(st_Buffer,\n\t\t\t\"\\nFortify: %s.%ld\\n         \", file, line);\n\t\tsprintf(st_Buffer + strlen(st_Buffer), \"%s\", \"atol first pointer is NULL\", file, line);\n\t\tstrcat(st_Buffer, \"\\n\");\n\t\tst_Output(st_Buffer);\n\t\tFORTIFY_UNLOCK();\n\t\tWaitIfstdOutput();\n\t\treturn(0);\n\t}\n\n\t__Fortify_CheckPointer(buffer1,0,strlen(buffer1)+1,file,line);\n\treturn(atol(buffer1));\n}\n\n/*\n * Fortify_atod()  - check if from/to is in allocated space and if so, then check if start/end is not outside allocated space.\n */\ndouble FORTIFY_STORAGE\n_Fortify_atof(char *buffer1,char *file,unsigned long line)\n{\n\tif(buffer1 == NULL) {\n\t\tsprintf(st_Buffer,\n\t\t\t\"\\nFortify: %s.%ld\\n         \", file, line);\n\t\tsprintf(st_Buffer + strlen(st_Buffer), \"%s\", \"atod first pointer is NULL\", file, line);\n\t\tstrcat(st_Buffer, \"\\n\");\n\t\tst_Output(st_Buffer);\n\t\tFORTIFY_UNLOCK();\n\t\tWaitIfstdOutput();\n\t\treturn(0);\n\t}\n\n\t__Fortify_CheckPointer(buffer1,0,strlen(buffer1)+1,file,line);\n\treturn(atof(buffer1));\n}\n\n/*\n * Fortify_strtoul()  - check if from/to is in allocated space and if so, then check if start/end is not outside allocated space.\n */\nunsigned long FORTIFY_STORAGE\n_Fortify_strtoul(char *buffer1,char **buffer2,int n,char *file,unsigned long line)\n{\n\tif(buffer1 == NULL) {\n\t\tsprintf(st_Buffer,\n\t\t\t\"\\nFortify: %s.%ld\\n         \", file, line);\n\t\tsprintf(st_Buffer + strlen(st_Buffer), \"%s\", \"strtoul first pointer is NULL\", file, line);\n\t\tstrcat(st_Buffer, \"\\n\");\n\t\tst_Output(st_Buffer);\n\t\tFORTIFY_UNLOCK();\n\t\tWaitIfstdOutput();\n\t\treturn(0);\n\t}\n\n\t__Fortify_CheckPointer(buffer1,0,strlen(buffer1)+1,file,line);\n\treturn(strtoul(buffer1,buffer2,n));\n}\n\n/*\n * Fortify_strtod()  - check if from/to is in allocated space and if so, then check if start/end is not outside allocated space.\n */\ndouble FORTIFY_STORAGE\n_Fortify_strtod(char *buffer1,char **buffer2,char *file,unsigned long line)\n{\n\tif(buffer1 == NULL) {\n\t\tsprintf(st_Buffer,\n\t\t\t\"\\nFortify: %s.%ld\\n         \", file, line);\n\t\tsprintf(st_Buffer + strlen(st_Buffer), \"%s\", \"strtod first pointer is NULL\", file, line);\n\t\tstrcat(st_Buffer, \"\\n\");\n\t\tst_Output(st_Buffer);\n\t\tFORTIFY_UNLOCK();\n\t\tWaitIfstdOutput();\n\t\treturn(0);\n\t}\n\n\t__Fortify_CheckPointer(buffer1,0,strlen(buffer1)+1,file,line);\n\treturn(strtod(buffer1,buffer2));\n}\n\n/*\n * Fortify_strset()  - check if from/to is in allocated space and if so, then check if start/end is not outside allocated space.\n */\nchar *FORTIFY_STORAGE\n_Fortify_strset(char *buffer,int c,char *file,unsigned long line)\n{\n\tif(buffer == NULL) {\n\t\tsprintf(st_Buffer,\n\t\t\t\"\\nFortify: %s.%ld\\n         strset pointer is NULL\\n\", file, line);\n\t\tst_Output(st_Buffer);\n\t\tFORTIFY_UNLOCK();\n\t\tWaitIfstdOutput();\n\t\treturn(NULL);\n\t}\n\n\t__Fortify_CheckPointer(buffer,0,strlen(buffer)+1,file,line);\n\treturn(strset(buffer,c));\n}\n\n/*\n * Fortify_strnset()  - check if from/to is in allocated space and if so, then check if start/end is not outside allocated space.\n */\nchar *FORTIFY_STORAGE\n_Fortify_strnset(char *buffer,int c,size_t size,char *file,unsigned long line)\n{\n\tif(buffer == NULL) {\n\t\tsprintf(st_Buffer,\n\t\t\t\"\\nFortify: %s.%ld\\n         strnset pointer is NULL\\n\", file, line);\n\t\tst_Output(st_Buffer);\n\t\tFORTIFY_UNLOCK();\n\t\tWaitIfstdOutput();\n\t\treturn(NULL);\n\t}\n\n\t__Fortify_CheckPointer(buffer,0,strlen(buffer)+1,file,line);\n\treturn(strnset(buffer,c,size));\n}\n\n/*\n * Fortify_strncpy()  - check if from/to is in allocated space and if so, then check if start/end is not outside allocated space.\n */\nstatic char *FORTIFY_STORAGE\n__Fortify_strncpy(char *to,char *from,size_t size,int usesize,char *file,unsigned long line)\n{\n\tsize_t size1;\n\n\tsize1 = strlen(from) + 1;\n\tif(usesize)\n\t{\n\t\tif(size < size1)\n\t\t\tsize1 = size;\n\t}\n\n\treturn((char *) _Fortify_memcpy(to,from,size1,file,line));\n}\n\n/*\n * Fortify_strncpy()  - check if from/to is in allocated space and if so, then check if start/end is not outside allocated space.\n */\nchar *FORTIFY_STORAGE\n_Fortify_strncpy(char *to,char *from,size_t size,char *file,unsigned long line)\n{\n\treturn(__Fortify_strncpy(to,from,size,1,file,line));\n}\n\n/*\n * Fortify_strncpy()  - check if from/to is in allocated space and if so, then check if start/end is not outside allocated space.\n */\nchar *FORTIFY_STORAGE\n_Fortify_strcpy(char *to,char *from,char *file,unsigned long line)\n{\n\treturn(__Fortify_strncpy(to,from,0,0,file,line));\n}\n\n#endif /* FORTIFY */\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/fortify.h",
    "content": "#ifndef __FORTIFY_H__\n#define __FORTIFY_H__\n/*\n * FILE:\n *   fortify.h\n *\n * DESCRIPTION:\n *     Header file for fortify.c - A fortified shell for malloc, realloc,\n *   calloc, strdup, getcwd, tempnam & free\n *\n * WRITTEN:\n *   spb 29/4/94\n *\n * VERSION:\n *   1.0 29/4/94\n */\n#include <stdlib.h>\n\n#include \"declare.h\"\n\n#if defined HP9000 || defined AViiON || defined ALPHA || defined SIGNED_UNKNOWN\n# define signed\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifdef FORTIFY\n\ntypedef void (*OutputFuncPtr) __OF((char *));\n\nextern char *_Fortify_file;\nextern int _Fortify_line;\n\n#define Fortify_FILE(file) _Fortify_file=file\n#define Fortify_LINE(line) _Fortify_line=line\n\n#define _Fortify_FILE (_Fortify_file==(char *) 0 ? __FILE__ : _Fortify_file)\n#define _Fortify_LINE (_Fortify_line==0 ? __LINE__ : _Fortify_line)\n\nvoid  _Fortify_Init __OF((char *file, unsigned long line));\nvoid *_Fortify_malloc __OF((size_t size, char *file, unsigned long line));\nvoid *_Fortify_realloc __OF((void *ptr, size_t new_size, char *file, unsigned long line));\nvoid *_Fortify_calloc __OF((size_t nitems, size_t size, char *file, unsigned long line));\nchar *_Fortify_strdup __OF((char *str, char *file, unsigned long line));\nvoid *_Fortify_memcpy __OF((void *to, void *from, size_t size, char *file, unsigned long line));\nvoid *_Fortify_memmove __OF((void *to, void *from, size_t size, char *file, unsigned long line));\nvoid *_Fortify_memccpy __OF((void *to, void *from, int c, size_t size, char *file, unsigned long line));\nvoid *_Fortify_memset __OF((void *buffer, int c, size_t size, char *file, unsigned long line));\nvoid *_Fortify_memchr __OF((void *buffer, int c, size_t size, char *file, unsigned long line));\nint   _Fortify_memcmp __OF((void *buffer1, void *buffer2, size_t size, char *file, unsigned long line));\nint   _Fortify_memicmp __OF((void *buffer1, void *buffer2, size_t size, char *file, unsigned long line));\nchar *_Fortify_strchr __OF((char *buffer, int c, char *file, unsigned long line));\nchar *_Fortify_strrchr __OF((char *buffer, int c, char *file, unsigned long line));\nchar *_Fortify_strlwr __OF((char *buffer, char *file, unsigned long line));\nchar *_Fortify_strupr __OF((char *buffer, char *file, unsigned long line));\nchar *_Fortify_strrev __OF((char *buffer, char *file, unsigned long line));\nchar *_Fortify_strset __OF((char *buffer, int c, char *file, unsigned long line));\nchar *_Fortify_strnset __OF((char *buffer, int c, size_t size, char *file, unsigned long line));\nchar *_Fortify_strstr __OF((char *to, char *from, char *file, unsigned long line));\nchar *_Fortify_strcpy __OF((char *to, char *from, char *file, unsigned long line));\nchar *_Fortify_strncpy __OF((char *to, char *from, size_t size, char *file, unsigned long line));\nint   _Fortify_strcmp __OF((char *buffer1, char *buffer2, char *file, unsigned long line));\ndouble _Fortify_strtod __OF((char *buffer1, char **buffer2, char *file, unsigned long line));\nlong _Fortify_strtol __OF((char *buffer1, char **buffer2, int n, char *file, unsigned long line));\nint _Fortify_atoi __OF((char *buffer1, char *file, unsigned long line));\nlong _Fortify_atol __OF((char *buffer1, char *file, unsigned long line));\ndouble _Fortify_atof __OF((char *buffer1, char *file, unsigned long line));\nunsigned long _Fortify_strtoul __OF((char *buffer1, char **buffer2, int n, char *file, unsigned long line));\nsize_t _Fortify_strcspn __OF((char *buffer1, char *buffer2, char *file, unsigned long line));\nint   _Fortify_strcoll __OF((char *buffer1, char *buffer2, char *file, unsigned long line));\nint   _Fortify_strcmpi __OF((char *buffer1, char *buffer2, char *file, unsigned long line));\nint   _Fortify_strncmp __OF((char *buffer1, char *buffer2, size_t size, char *file, unsigned long line));\nint   _Fortify_strnicmp __OF((char *buffer1, char *buffer2, size_t size, char *file, unsigned long line));\nchar *_Fortify_strcat __OF((char *buffer1, char *buffer2, char *file, unsigned long line));\nchar *_Fortify_strpbrk __OF((char *buffer1, char *buffer2, char *file, unsigned long line));\nsize_t _Fortify_strlen __OF((char *buffer, char *file, unsigned long line));\nchar *_Fortify_getcwd __OF((char *buf, int size, char *file, unsigned long line));\nchar *_Fortify_tempnam __OF((char *dir, char *pfx, char *file, unsigned long line));\nvoid  _Fortify_free __OF((void *uptr, char *file, unsigned long line));\n\nint   _Fortify_OutputAllMemory __OF((char *file, unsigned long line));\nint   _Fortify_CheckAllMemory __OF((char *file, unsigned long line));\nint   _Fortify_CheckPointer __OF((void *uptr, char *file, unsigned long line));\nint   _Fortify_Disable __OF((char *file, unsigned long line, int how));\nint   _Fortify_SetMallocFailRate __OF((int Percent));\nint   _Fortify_EnterScope __OF((char *file, unsigned long line));\nint   _Fortify_LeaveScope __OF((char *file, unsigned long line));\nint   _Fortify_DumpAllMemory __OF((int scope, char *file, unsigned long line));\n\ntypedef void (*Fortify_OutputFuncPtr) __OF((/* const */ char *));\nFortify_OutputFuncPtr _Fortify_SetOutputFunc __OF((Fortify_OutputFuncPtr Output));\n\n#endif /* FORTIFY */\n\n#ifdef __cplusplus\n}\n#endif\n\n#ifndef __FORTIFY_C__ /* Only define the macros if we're NOT in fortify.c */\n\n#ifdef FORTIFY /* Add file and line information to the fortify calls */\n\n#if defined malloc\n# undef malloc\n#endif\n#if defined realloc\n# undef realloc\n#endif\n#if defined calloc\n# undef calloc\n#endif\n#if defined strdup\n# undef strdup\n#endif\n#if defined memcpy\n# undef memcpy\n#endif\n#if defined memmove\n# undef memmove\n#endif\n#if defined memccpy\n# undef memccpy\n#endif\n#if defined memset\n# undef memset\n#endif\n#if defined memchr\n# undef memchr\n#endif\n#if defined memcmp\n# undef memcmp\n#endif\n#if defined memicmp\n# undef memicmp\n#endif\n#if defined strcoll\n# undef strcoll\n#endif\n#if defined strcspn\n# undef strcspn\n#endif\n#if defined strcmp\n# undef strcmp\n#endif\n#if defined strcmpi\n# undef strcmpi\n#endif\n#if defined stricmp\n# undef stricmp\n#endif\n#if defined strncmp\n# undef strncmp\n#endif\n#if defined strnicmp\n# undef strnicmp\n#endif\n#if defined strlwr\n# undef strlwr\n#endif\n#if defined strupr\n# undef strupr\n#endif\n#if defined strrev\n# undef strrev\n#endif\n#if defined strchr\n# undef strchr\n#endif\n#if defined strrchr\n# undef strrchr\n#endif\n#if defined strcat\n# undef strcat\n#endif\n#if defined strpbrk\n# undef strpbrk\n#endif\n#if defined strcpy\n# undef strcpy\n#endif\n#if defined atoi\n# undef atoi\n#endif\n#if defined atol\n# undef atol\n#endif\n#if defined atof\n# undef atof\n#endif\n#if defined strtol\n# undef strtol\n#endif\n#if defined strtoul\n# undef strtoul\n#endif\n#if defined strtod\n# undef strtod\n#endif\n#if defined strstr\n# undef strstr\n#endif\n#if defined strncpy\n# undef strncpy\n#endif\n#if defined strset\n# undef strset\n#endif\n#if defined strnset\n# undef strnset\n#endif\n#if defined strlen\n# undef strlen\n#endif\n#if defined getcwd\n# undef getcwd\n#endif\n#if defined tempnam\n# undef tempnam\n#endif\n#if defined free\n# undef free\n#endif\n\n#define malloc(size)                  _Fortify_malloc(size, _Fortify_FILE, _Fortify_LINE)\n#define realloc(ptr,new_size)         _Fortify_realloc(ptr, new_size, _Fortify_FILE, _Fortify_LINE)\n#define calloc(num,size)              _Fortify_calloc(num, size, _Fortify_FILE, _Fortify_LINE)\n#define strdup(str)                   _Fortify_strdup(str, _Fortify_FILE, _Fortify_LINE)\n#define memcpy(to,from,size)          _Fortify_memcpy((void *)(to),(void *)(from),size, _Fortify_FILE, _Fortify_LINE)\n#define memmove(to,from,size)         _Fortify_memmove((void *)(to),(void *)(from),size, _Fortify_FILE, _Fortify_LINE)\n#define memccpy(to,from,c,size)       _Fortify_memccpy((void *)(to),(void *)(from),c,size, _Fortify_FILE, _Fortify_LINE)\n#define memset(buffer,c,size)         _Fortify_memset(buffer,c,size, _Fortify_FILE, _Fortify_LINE)\n#define memchr(buffer,c,size)         _Fortify_memchr(buffer,c,size, _Fortify_FILE, _Fortify_LINE)\n#define memcmp(buffer1,buffer2,size)  _Fortify_memcmp((void *)buffer1,(void *)buffer2,size, _Fortify_FILE, _Fortify_LINE)\n#define memicmp(buffer1,buffer2,size) _Fortify_memicmp((void *)buffer1,(void *)buffer2,size, _Fortify_FILE, _Fortify_LINE)\n#define strlwr(buffer)                _Fortify_strlwr(buffer, _Fortify_FILE, _Fortify_LINE)\n#define strupr(buffer)                _Fortify_strupr(buffer, _Fortify_FILE, _Fortify_LINE)\n#define strrev(buffer)                _Fortify_strrev(buffer, _Fortify_FILE, _Fortify_LINE)\n#define strchr(buffer,c)              _Fortify_strchr(buffer,c, _Fortify_FILE, _Fortify_LINE)\n#define strrchr(buffer,c)             _Fortify_strrchr(buffer,c, _Fortify_FILE, _Fortify_LINE)\n#define strset(buffer,c)              _Fortify_strset(buffer,c, _Fortify_FILE, _Fortify_LINE)\n#define strnset(buffer,c)             _Fortify_strnset(buffer,c, _Fortify_FILE, _Fortify_LINE)\n#define strstr(buffer1,buffer2)       _Fortify_strstr(buffer1,buffer2, _Fortify_FILE, _Fortify_LINE)\n#define atoi(buffer)                  _Fortify_atoi(buffer, _Fortify_FILE, _Fortify_LINE)\n#define atol(buffer)                  _Fortify_atol(buffer, _Fortify_FILE, _Fortify_LINE)\n#define atof(buffer)                  _Fortify_atof(buffer, _Fortify_FILE, _Fortify_LINE)\n#define strtol(buffer1,buffer2,n)     _Fortify_strtol(buffer1,buffer2,n, _Fortify_FILE, _Fortify_LINE)\n#define strtoul(buffer1,buffer2,n)    _Fortify_strtoul(buffer1,buffer2,n, _Fortify_FILE, _Fortify_LINE)\n#define strtod(buffer1,buffer2)       _Fortify_strtod(buffer1,buffer2, _Fortify_FILE, _Fortify_LINE)\n#define strcpy(to,from)               _Fortify_strcpy((char *)(to),(char *)(from), _Fortify_FILE, _Fortify_LINE)\n#define strncpy(to,from,size)         _Fortify_strncpy((char *)(to),(char *)(from),size, _Fortify_FILE, _Fortify_LINE)\n#define strcoll(buffer1,buffer2)      _Fortify_strcoll((char *)(buffer1),(char *)(buffer2), _Fortify_FILE, _Fortify_LINE)\n#define strcspn(buffer1,buffer2)      _Fortify_strcspn((char*)(buffer1),(char *)(buffer2), _Fortify_FILE, _Fortify_LINE)\n#define strcmp(buffer1,buffer2)       _Fortify_strcmp((char *)(buffer1),(char *)(buffer2), _Fortify_FILE, _Fortify_LINE)\n#define strcmpi(buffer1,buffer2)      _Fortify_strcmpi((char *)(buffer1),(char *)(buffer2), _Fortify_FILE, _Fortify_LINE)\n#define stricmp(buffer1,buffer2)      _Fortify_strcmpi((char *)(buffer1),(char *)(buffer2), _Fortify_FILE, _Fortify_LINE)\n#define strncmp(buffer1,buffer2,size) _Fortify_strncmp((char *)(buffer1),(char *)(buffer2),size, _Fortify_FILE, _Fortify_LINE)\n#define strnicmp(buffer1,buffer2,size) _Fortify_strnicmp((char *)(buffer1),(char *)(buffer2),size, _Fortify_FILE, _Fortify_LINE)\n#define strcat(buffer1,buffer2)       _Fortify_strcat((char *)(buffer1),(char *)(buffer2), _Fortify_FILE, _Fortify_LINE)\n#define strpbrk(buffer1,buffer2)      _Fortify_strpbrk((char *)(buffer1),(char *)(buffer2), _Fortify_FILE, _Fortify_LINE)\n#define strlen(buffer)                _Fortify_strlen((char*)(buffer), _Fortify_FILE, _Fortify_LINE)\n#define getcwd(buf,size)              _Fortify_getcwd(buf, size, _Fortify_FILE, _Fortify_LINE)\n#define tempnam(dir,pfx)              _Fortify_tempnam(dir, pfx, _Fortify_FILE, _Fortify_LINE)\n#define free(ptr)                     _Fortify_free(ptr, _Fortify_FILE, _Fortify_LINE)\n\n#define Fortify_Init()                _Fortify_Init(_Fortify_FILE, _Fortify_LINE)\n#define Fortify_OutputAllMemory()     _Fortify_OutputAllMemory(_Fortify_FILE, _Fortify_LINE)\n#define Fortify_CheckAllMemory()      _Fortify_CheckAllMemory(_Fortify_FILE, _Fortify_LINE)\n#define Fortify_CheckPointer(ptr)     _Fortify_CheckPointer(ptr, _Fortify_FILE, _Fortify_LINE)\n#define Fortify_Disable(how)          _Fortify_Disable(_Fortify_FILE, _Fortify_LINE,how)\n#define Fortify_EnterScope()          _Fortify_EnterScope(_Fortify_FILE, _Fortify_LINE)\n#define Fortify_LeaveScope()          _Fortify_LeaveScope(_Fortify_FILE, _Fortify_LINE)\n#define Fortify_DumpAllMemory(s)      _Fortify_DumpAllMemory(s,_Fortify_FILE, _Fortify_LINE)\n\n#else /* FORTIFY Define the special fortify functions away to nothing */\n\n#define Fortify_FILE(file)\n#define Fortify_LINE(line)\n#define Fortify_Init()\n#define Fortify_OutputAllMemory()     0\n#define Fortify_CheckAllMemory()      0\n#define Fortify_CheckPointer(ptr)     1\n#define Fortify_Disable(how)          1\n#define Fortify_SetOutputFunc()       0\n#define Fortify_SetMallocFailRate(p)  0\n#define Fortify_EnterScope()          0\n#define Fortify_LeaveScope()          0\n#define Fortify_DumpAllMemory(s)      0\n\n#endif /*   FORTIFY     */\n#endif /* __FORTIFY_C__ */\n#endif /* __FORTIFY_H__ */\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/ini.c",
    "content": "#include <stdio.h>\n#include <ctype.h>\n#include <string.h>\n\n#include \"lp_lib.h\"\n\n#include \"ini.h\"\n\nFILE *ini_create(char *filename)\n{\n  FILE *fp;\n\n  fp = fopen(filename, \"w\");\n\n  return(fp);\n}\n\nFILE *ini_open(char *filename)\n{\n  FILE *fp;\n\n  fp = fopen(filename, \"r\");\n\n  return(fp);\n}\n\nvoid ini_writecomment(FILE *fp, char *comment)\n{\n  fprintf(fp, \"; %s\\n\", comment);\n}\n\nvoid ini_writeheader(FILE *fp, char *header, int addnewline)\n{\n  if((addnewline) && (ftell(fp) > 0))\n    fputs(\"\\n\", fp);\n  fprintf(fp, \"[%s]\\n\", header);\n}\n\nvoid ini_writedata(FILE *fp, char *name, char *data)\n{\n  if(name != NULL)\n    fprintf(fp, \"%s=%s\\n\", name, data);\n  else\n    fprintf(fp, \"%s\\n\", data);\n}\n\nint ini_readdata(FILE *fp, char *data, int szdata, int withcomment)\n{\n  int l;\n  char *ptr;\n\n  if(fgets(data, szdata, fp) == NULL)\n    return(0);\n\n  if(!withcomment) {\n    ptr = strchr(data, ';');\n    if(ptr != NULL)\n      *ptr = 0;\n  }\n\n  l = (int) strlen(data);\n  while((l > 0) && (isspace(data[l - 1])))\n    l--;\n  data[l] = 0;\n  if((l >= 2) && (data[0] == '[') && (data[l - 1] == ']')) {\n    memcpy(data, data + 1, l - 2);\n    data[l - 2] = 0;\n    return(1);\n  }\n  return(2);\n}\n\nvoid ini_close(FILE *fp)\n{\n  fclose(fp);\n}\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/ini.h",
    "content": "#include <stdio.h>\n\n#ifdef __cplusplus\n__EXTERN_C {\n#endif\n\nextern FILE *ini_create(char *filename);\nextern FILE *ini_open(char *filename);\nextern void ini_writecomment(FILE *fp, char *comment);\nextern void ini_writeheader(FILE *fp, char *header, int addnewline);\nextern void ini_writedata(FILE *fp, char *name, char *data);\nextern int ini_readdata(FILE *fp, char *data, int szdata, int withcomment);\nextern void ini_close(FILE *fp);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_Hash.c",
    "content": "\n#include <stdlib.h>\n#include <string.h>\n#include \"lp_lib.h\"\n#include \"lp_utils.h\"\n#include \"lp_report.h\"\n#include \"lp_Hash.h\"\n\n#ifdef FORTIFY\n# include \"lp_fortify.h\"\n#endif\n\n\n#define HASH_START_SIZE  5000  /* Hash table size for row and column name storage */\n#define NUMHASHPRIMES      45\n\nSTATIC hashtable *create_hash_table(int size, int base)\n{\n  int i;\n  int HashPrimes[ ] = {\n             29,     229,     883,    1671,    2791,    4801,    8629,   10007,\n          15289,   25303,   34843,   65269,   99709,  129403,  147673,  166669,\n         201403,  222163,  242729,  261431,  303491,  320237,  402761,  501131,\n         602309,  701507,  800999,  900551, 1000619, 1100837, 1200359, 1300021,\n        1400017, 1500007, 1750009, 2000003, 2500009, 3000017, 4000037, 5000011,\n        6000011, 7000003, 8000009, 9000011, 9999991};\n  hashtable *ht;\n\n  /* Find a good size for the hash table */\n  if(size < HASH_START_SIZE)\n    size = HASH_START_SIZE;\n  for(i = 0; i < NUMHASHPRIMES-1; i++)\n    if(HashPrimes[i] > size)\n      break;\n  size = HashPrimes[i];\n\n  /* Then allocate and initialize memory */\n  ht = (hashtable *) calloc(1 , sizeof(*ht));\n  ht->table = (hashelem **) calloc(size, sizeof(*(ht->table)));\n  ht->size = size;\n  ht->base = base;\n  ht->count = base-1;\n\n  return(ht);\n}\n\nSTATIC void free_hash_item(hashelem **hp)\n{\n  free((*hp)->name);\n  free(*hp);\n  *hp = NULL;\n}\n\nSTATIC void free_hash_table(hashtable *ht)\n{\n  hashelem *hp, *thp;\n\n  hp = ht->first;\n  while(hp != NULL) {\n    thp = hp;\n    hp = hp->nextelem;\n    free_hash_item(&thp);\n  }\n  free(ht->table);\n  free(ht);\n}\n\n\n/* make a good hash function for any int size */\n/* inspired by Aho, Sethi and Ullman, Compilers ..., p436 */\n#define HASH_1 sizeof(unsigned int)\n#define HASH_2 (sizeof(unsigned int) * 6)\n#define HASH_3 (((unsigned int)0xF0) << ((sizeof(unsigned int) - 1) * CHAR_BIT))\n\nSTATIC int hashval(const char *string, int size)\n{\n  unsigned int result = 0, tmp;\n\n  for(; *string; string++) {\n    result = (result << HASH_1) + *string;\n    if((tmp = result & HASH_3) != 0) {\n      /* if any of the most significant bits is on */\n      result ^= tmp >> HASH_2; /* xor them in in a less significant part */\n      result ^= tmp; /* and reset the most significant bits to 0 */\n    }\n  }\n  return(result % size);\n} /* hashval */\n\n\nSTATIC hashelem *findhash(const char *name, hashtable *ht)\n{\n  hashelem *h_tab_p;\n  for(h_tab_p = ht->table[hashval(name, ht->size)];\n      h_tab_p != NULL;\n      h_tab_p = h_tab_p->next)\n    if(strcmp(name, h_tab_p->name) == 0) /* got it! */\n      break;\n  return(h_tab_p);\n} /* findhash */\n\n\nSTATIC hashelem *puthash(const char *name, int index, hashelem **list, hashtable *ht)\n{\n  hashelem *hp = NULL;\n  int      hashindex;\n\n  if(list != NULL) {\n    hp = list[index];\n    if(hp != NULL)\n      list[index] = NULL;\n  }\n\n  if((hp = findhash(name, ht)) == NULL) {\n\n    hashindex = hashval(name, ht->size);\n    hp = (hashelem *) calloc(1, sizeof(*hp));\n    allocCHAR(NULL, &hp->name, (int) (strlen(name) + 1), FALSE);\n    strcpy(hp->name, name);\n    hp->index = index;\n    ht->count++;\n    if(list != NULL)\n      list[index] = hp;\n\n    hp->next = ht->table[hashindex];\n    ht->table[hashindex] = hp;\n    if(ht->first == NULL)\n      ht->first = hp;\n    if(ht->last != NULL)\n      ht->last->nextelem = hp;\n    ht->last = hp;\n\n  }\n  return(hp);\n}\n\nSTATIC void drophash(const char *name, hashelem **list, hashtable *ht) {\n  hashelem *hp, *hp1, *hp2;\n  int      hashindex;\n\n  if((hp = findhash(name, ht)) != NULL) {\n    hashindex = hashval(name, ht->size);\n    if((hp1 = ht->table[hashindex]) != NULL) {\n      hp2 = NULL;\n      while((hp1 != NULL) && (hp1 != hp)) {\n        hp2 = hp1;\n        hp1 = hp1->next;\n      }\n      if(hp1 == hp) {\n        if(hp2 != NULL)\n          hp2->next = hp->next;\n        else\n          ht->table[hashindex] = hp->next;\n      }\n\n      hp1 = ht->first;\n      hp2 = NULL;\n      while((hp1 != NULL) && (hp1 != hp)) {\n        hp2 = hp1;\n        hp1 = hp1->nextelem;\n      }\n      if(hp1 == hp) {\n        if(hp2 != NULL)\n          hp2->nextelem = hp->nextelem;\n        else {\n          ht->first = hp->nextelem;\n          if (ht->first == NULL)\n            ht->last = NULL;\n        }\n      }\n      if(list != NULL)\n        list[hp->index] = NULL;\n      free_hash_item(&hp);\n      ht->count--;\n    }\n  }\n}\n\nSTATIC hashtable *copy_hash_table(hashtable *ht, hashelem **list, int newsize)\n{\n  hashtable *copy;\n  hashelem  *elem, *new_elem;\n\n  if(newsize < ht->size)\n    newsize = ht->size;\n\n  copy = create_hash_table(newsize, ht->base);\n  if (copy != NULL) {\n    elem = ht->first;\n    while (elem != NULL) {\n      if((new_elem = puthash(elem->name, elem->index, list, copy)) == NULL) {\n        free_hash_table(copy);\n        return(NULL);\n      }\n      elem = elem ->nextelem;\n    }\n  }\n\n  return(copy);\n}\n\nSTATIC int find_row(lprec *lp, char *name, MYBOOL Unconstrained_rows_found)\n{\n  hashelem *hp;\n\n  if (lp->rowname_hashtab != NULL)\n      hp = findhash(name, lp->rowname_hashtab);\n  else\n      hp = NULL;\n\n  if (hp == NULL) {\n    if(Unconstrained_rows_found) { /* just ignore them in this case */\n         return(-1);\n    }\n    else {\n      return(-1);\n    }\n  }\n  return(hp->index);\n}\n\nSTATIC int find_var(lprec *lp, char *name, MYBOOL verbose)\n{\n  hashelem *hp;\n\n  if (lp->colname_hashtab != NULL)\n      hp = findhash(name, lp->colname_hashtab);\n  else\n      hp = NULL;\n\n  if (hp == NULL) {\n    if(verbose)\n      report(lp, SEVERE, \"find_var: Unknown variable name '%s'\\n\", name);\n    return(-1);\n  }\n  return(hp->index);\n}\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_Hash.h",
    "content": "#ifndef HEADER_lp_hash\n#define HEADER_lp_hash\n\n/* For row and column name hash tables */\n\ntypedef struct _hashelem\n{\n  char             *name;\n  int               index;\n  struct _hashelem *next;\n  struct _hashelem *nextelem;\n} hashelem;\n\ntypedef struct /* _hashtable */\n{\n  hashelem         **table;\n  int              size;\n  int              base;\n  int              count;\n  struct _hashelem *first;\n  struct _hashelem *last;\n} hashtable;\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nSTATIC hashtable *create_hash_table(int size, int base);\nSTATIC void      free_hash_table(hashtable *ht);\nSTATIC hashelem  *findhash(const char *name, hashtable *ht);\nSTATIC hashelem  *puthash(const char *name, int index, hashelem **list, hashtable *ht);\nSTATIC void      drophash(const char *name, hashelem **list, hashtable *ht);\nSTATIC void      free_hash_item(hashelem **hp);\nSTATIC hashtable *copy_hash_table(hashtable *ht, hashelem **list, int newsize);\nSTATIC int find_var(lprec *lp, char *name, MYBOOL verbose);\nSTATIC int find_row(lprec *lp, char *name, MYBOOL Unconstrained_rows_found);\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* HEADER_lp_hash */\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_MDO.c",
    "content": "/*\n    Minimum matrix inverse fill-in modules - interface for lp_solve v5.0+\n   ----------------------------------------------------------------------------------\n    Author:        Kjell Eikland \n    Contact:       kjell.eikland@broadpark.no \n    License terms: LGPL.\n    \n    Requires:      string.h, colamd.h, lp_lib.h\n\n    Release notes:\n    v1.0    1 September 2003    Preprocessing routines for minimum fill-in column \n                                ordering for inverse factorization using the open \n                                source COLAMD library.  Suitable for the dense parts\n                                of both the product form and LU factorization inverse \n                                methods.\n    v1.1    1 July 2004         Renamed from lp_colamdMDO to lp_MDO.                                \n\n   ---------------------------------------------------------------------------------- \n*/\n\n#include <string.h>\n#include \"commonlib.h\"\n#include \"lp_lib.h\"\n#include \"colamd.h\"\n#include \"lp_MDO.h\"\n\n#ifdef FORTIFY\n# include \"lp_fortify.h\"\n#endif\n\nSTATIC MYBOOL includeMDO(MYBOOL *usedpos, int item)\n{\n/*  Legend:   TRUE            => A basic slack variable already in the basis\n              FALSE           => A column free for being pivoted in\n              AUTOMATIC+TRUE  => A row-singleton user column pivoted into the basis\n              AUTOMATIC+FALSE => A column-singleton user column pivoted into the basis */\n\n  /* Handle case where we are processing all columns */\n  if(usedpos == NULL)\n    return( TRUE );\n    \n  else {\n  /* Otherwise do the selective case */\n    MYBOOL test = usedpos[item];\n#if 1\n    return( test != TRUE );\n#else\n    test = test & TRUE;\n    return( test == FALSE );\n#endif\n  }\n}\n\nSTATIC int prepareMDO(lprec *lp, MYBOOL *usedpos, int *colorder, int *data, int *rowmap)\n/* This routine prepares data structures for colamd().  It is called twice, the first\n   time to count applicable non-zero elements by column, and the second time to fill in \n   the row indexes of the non-zero values from the first call.  Note that the colamd() \n   row index base is 0 (which suits lp_solve fine). */\n{\n  int     i, ii, j, k, kk;\n  int     nrows = lp->rows+1, ncols = colorder[0];\n  int     offset = 0, Bnz = 0, Tnz;\n  MYBOOL  dotally = (MYBOOL) (rowmap == NULL);\n  MATrec  *mat = lp->matA;\n  REAL    hold;\n  REAL    *value;\n  int     *rownr;\n\n  if(dotally)\n    data[0] = 0;\n\n  Tnz = nrows - ncols;\n  for(j = 1; j <= ncols; j++) {\n    kk = colorder[j];\n\n    /* Process slacks */\n    if(kk <= lp->rows) {\n      if(includeMDO(usedpos, kk)) {\n        if(!dotally)\n          data[Bnz] = rowmap[kk]+offset;\n        Bnz++;\n      }\n      Tnz++;\n    }\n    /* Process user columns */\n    else {\n      k = kk - lp->rows;\n      i = mat->col_end[k-1];\n      ii= mat->col_end[k];\n      Tnz += ii-i;\n#ifdef Paranoia\n      if(i >= ii)\n        lp->report(lp, SEVERE, \"prepareMDO: Encountered empty basic column %d\\n\", k);\n#endif\n\n      /* Detect if we need to do phase 1 adjustments of zero-valued OF variable */\n      rownr = &COL_MAT_ROWNR(i);\n      value = &COL_MAT_VALUE(i);\n      hold = 0;\n      if((*rownr > 0) && includeMDO(usedpos, 0) && modifyOF1(lp, kk, &hold, 1.0)) {\n        if(!dotally)\n          data[Bnz] = offset;\n        Bnz++;\n      }\n      /* Loop over all NZ-variables */\n      for(; i < ii; \n          i++, value += matValueStep, rownr += matRowColStep) {\n        if(!includeMDO(usedpos, *rownr))\n          continue;\n        /* See if we need to change phase 1 OF value */\n        if(*rownr == 0) {\n          hold = *value;\n          if(!modifyOF1(lp, kk, &hold, 1.0)) \n            continue;\n        }\n        /* Tally uneliminated constraint row values */\n        if(!dotally)\n          data[Bnz] = rowmap[*rownr]+offset;\n        Bnz++;\n      }\n    }\n    if(dotally)\n      data[j] = Bnz;\n  }\n  return( Tnz );\n}\n\nSTATIC MYBOOL verifyMDO(lprec *lp, int *col_end, int *row_nr, int rowmax, int colmax)\n{\n  int i, j, n, err = 0;\n\n  for(i = 1; i <= colmax; i++) {\n    n = 0;\n    for(j = col_end[i-1]; (j < col_end[i]) && (err == 0); j++, n++) {\n      if(row_nr[j] < 0 || row_nr[j] > rowmax)\n        err = 1;\n      if(n > 0 && row_nr[j] <= row_nr[j-1])\n        err = 2;\n      n++;\n    }\n  }\n  if(err != 0)\n    lp->report(lp, SEVERE, \"verifyMDO: Invalid MDO input structure generated (error %d)\\n\", err);\n  return( (MYBOOL) (err == 0) );\n}\n\nvoid *mdo_calloc(size_t size, size_t count)\n{\n  return ( calloc(size, count) );\n}\nvoid mdo_free(void *mem)\n{\n  free( mem );\n}\n\n\nint __WINAPI getMDO(lprec *lp, MYBOOL *usedpos, int *colorder, int *size, MYBOOL symmetric)\n{\n  int    error = FALSE;\n  int    nrows = lp->rows+1, ncols = colorder[0];\n  int    i, j, kk, n;\n  int    *col_end, *row_map = NULL;\n  int    Bnz, Blen, *Brows = NULL;\n  int    stats[COLAMD_STATS];\n  double knobs[COLAMD_KNOBS];\n\n /* Tally the non-zero counts of the unused columns/rows of the \n    basis matrix and store corresponding \"net\" starting positions */\n  allocINT(lp, &col_end, ncols+1, FALSE);\n  n = prepareMDO(lp, usedpos, colorder, col_end, NULL);\n  Bnz = col_end[ncols];\n\n /* Check that we have unused basic columns, otherwise skip analysis */  \n  if(ncols == 0 || Bnz == 0) \n    goto Transfer;\n\n /* Get net number of rows and fill mapper */\n  allocINT(lp, &row_map, nrows, FALSE);\n  nrows = 0;\n  for(i = 0; i <= lp->rows; i++) {\n    row_map[i] = i-nrows;\n   /* Increment eliminated row counter if necessary */\n    if(!includeMDO(usedpos, i)) \n      nrows++;\n  }\n  nrows = lp->rows+1 - nrows;\n\n /* Store row indeces of non-zero values in the basic columns */\n  Blen = colamd_recommended(Bnz, nrows, ncols);\n  allocINT(lp, &Brows, Blen, FALSE);\n  prepareMDO(lp, usedpos, colorder, Brows, row_map);\n#ifdef Paranoia\n  verifyMDO(lp, col_end, Brows, nrows, ncols);\n#endif\n\n /* Compute the MDO */\n#if 1\n  colamd_set_defaults(knobs);\n  knobs [COLAMD_DENSE_ROW] = 0.2+0.2 ;    /* default changed for UMFPACK */\n  knobs [COLAMD_DENSE_COL] = knobs [COLAMD_DENSE_ROW];    \n  if(symmetric && (nrows == ncols)) {\n    MEMCOPY(colorder, Brows, ncols + 1);\n    error = !symamd(nrows, colorder, col_end, Brows, knobs, stats, mdo_calloc, mdo_free);\n  }\n  else\n    error = !colamd(nrows, ncols, Blen, Brows, col_end, knobs, stats);\n#else\n  if(symmetric && (nrows == ncols)) {\n    MEMCOPY(colorder, Brows, ncols + 1);\n    error = !symamd(nrows, colorder, col_end, Brows, knobs, stats, mdo_calloc, mdo_free);\n  }\n  else\n    error = !colamd(nrows, ncols, Blen, Brows, col_end, (double *) NULL, stats);\n#endif\n\n /* Transfer the estimated optimal ordering, adjusting for index offsets */\nTransfer:\n  if(error) \n    error = stats[COLAMD_STATUS];\n  else {\n    MEMCOPY(Brows, colorder, ncols + 1);\n    for(j = 0; j < ncols; j++) {\n      kk = col_end[j];\n      n = Brows[kk+1];\n      colorder[j+1] = n;\n    }\n  }\n\n  /* Free temporary vectors */\n  FREE(col_end);\n  if(row_map != NULL)\n    FREE(row_map);\n  if(Brows != NULL)\n    FREE(Brows);\n\n  if(size != NULL)\n    *size = ncols;\n  return( error );\n}\n\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_MDO.h",
    "content": "#ifndef HEADER_MDO\n#define HEADER_MDO\n\n#include \"lp_types.h\"\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nint __WINAPI getMDO(lprec *lp, MYBOOL *usedpos, int *colorder, int *size, MYBOOL symmetric);\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* HEADER_MDO */\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_MPS.c",
    "content": "\n#include <string.h>\n#include <stdarg.h>\n#include <ctype.h>\n#include \"commonlib.h\"\n#include \"lp_lib.h\"\n#include \"lp_scale.h\"\n#include \"lp_report.h\"\n#include \"lp_MPS.h\"\n\n#ifdef FORTIFY\n# include \"lp_fortify.h\"\n#endif\n\n/* Define buffer-size controled function mapping */\n# if defined _MSC_VER\n#  define vsnprintf _vsnprintf\n# endif\n\n/* MPS file input and output routines for lp_solve                           */\n/* ------------------------------------------------------------------------- */\n\n/*\nA:  MPS format was named after an early IBM LP product and has emerged\nas a de facto standard ASCII medium among most of the commercial LP\ncodes.  Essentially all commercial LP codes accept this format, but if\nyou are using public domain software and have MPS files, you may need\nto write your own reader routine for this.  It's not too hard.  The\nmain things to know about MPS format are that it is column oriented (as\nopposed to entering the model as equations), and everything (variables,\nrows, etc.) gets a name.  MPS format is described in more detail in\nMurtagh's book, referenced in another section. Also,\n\nftp://softlib.cs.rice.edu/pub/miplib/mps_format\n\nis a nice short introduction.  exports\n\nMPS is an old format, so it is set up as though you were using punch\ncards, and is not free format. Fields start in column 1, 5, 15, 25, 40\nand 50.  Sections of an MPS file are marked by so-called header cards,\nwhich are distinguished by their starting in column 1.  Although it is\ntypical to use upper-case throughout the file (like I said, MPS has\nlong historical roots), many MPS-readers will accept mixed-case for\nanything except the header cards, and some allow mixed-case anywhere.\nThe names that you choose for the individual entities (constraints or\nvariables) are not important to the solver; you should pick names that\nare meaningful to you, or will be easy for a post-processing code to\nread.\n\nHere is a little sample model written in MPS format (explained in more\ndetail below):\n\nNAME          TESTPROB\nROWS\n N  COST\n L  LIM1\n G  LIM2\n E  MYEQN\nCOLUMNS\n    XONE      COST                 1   LIM1                 1\n    XONE      LIM2                 1\n    YTWO      COST                 4   LIM1                 1\n    YTWO      MYEQN               -1\n    ZTHREE    COST                 9   LIM2                 1\n    ZTHREE    MYEQN                1\nRHS\n    RHS1      LIM1                 5   LIM2                10\n    RHS1      MYEQN                7\nBOUNDS\n UP BND1      XONE                 4\n LO BND1      YTWO                -1\n UP BND1      YTWO                 1\nENDATA\n\nmeans:\n\nOptimize\n COST:    XONE + 4 YTWO + 9 ZTHREE\nSubject To\n LIM1:    XONE + YTWO <= 5\n LIM2:    XONE + ZTHREE >= 10\n MYEQN:   - YTWO + ZTHREE  = 7\nBounds\n 0 <= XONE <= 4\n-1 <= YTWO <= 1\nEnd\n\n*/\n\n/* copy a MPS name, only trailing spaces are removed. In MPS, names can have\n   embedded spaces! */\nSTATIC void namecpy(char *into, char *from)\n{\n  int i;\n\n  /* copy at most 8 characters of from, stop at end of string or newline */\n  for(i = 0; (from[i] != '\\0') && (from[i] != '\\n') && (from[i] != '\\r') && (i < 8); i++)\n    into[i] = from[i];\n\n  /* end with end of string */\n  into[i] = '\\0';\n\n  /* remove trailing spaces, if any */\n  for(i--; (i >= 0) && (into[i] == ' '); i--)\n    into[i] = '\\0';\n}\n\n/* scan an MPS line, and pick up the information in the fields that are\n   present */\n\n/* scan_line for fixed MPS format */\nSTATIC int scan_lineFIXED(lprec *lp, int section, char* line, char *field1, char *field2, char *field3,\n                          double *field4, char *field5, double *field6)\n{\n  int  items = 0, line_len;\n  char buf[16], *ptr1, *ptr2;\n\n  line_len = (int) strlen(line);\n  while ((line_len) && ((line[line_len-1] == '\\n') || (line[line_len-1] == '\\r') || (line[line_len-1] == ' ')))\n   line_len--;\n\n  if(line_len >= 1) { /* spaces or N/L/G/E or UP/LO */\n    strncpy(buf, line, 4);\n    buf[4] = '\\0';\n    sscanf(buf, \"%s\", field1);\n    items++;\n  }\n  else\n    field1[0] = '\\0';\n\n  line += 4;\n\n  if(line_len >= 5) { /* name */\n    if (line[-1] != ' ') {\n      report(lp, IMPORTANT, \"MPS_readfile: invalid data card; column 4 must be blank\\n\");\n      return(-1);\n    }\n    namecpy(field2, line);\n    items++;\n  }\n  else\n    field2[0] = '\\0';\n\n  line += 10;\n\n  if(line_len >= 14) { /* name */\n    if (line[-1] != ' ' || line[-2] != ' ') {\n      report(lp, IMPORTANT, \"MPS_readfile: invalid data card; columns 13-14 must be blank\\n\");\n      return(-1);\n    }\n    namecpy(field3, line);\n    items++;\n  }\n  else\n    field3[0] = '\\0';\n\n  line += 10;\n\n  if(line_len >= 25) { /* number */\n    if (line[-1] != ' ' || line[-2] != ' ') {\n      report(lp, IMPORTANT, \"MPS_readfile: invalid data card; columns 23-24 must be blank\\n\");\n      return(-1);\n    }\n    strncpy(buf, line, 15);\n    buf[15] = '\\0';\n    for(ptr1 = ptr2 = buf; ; ptr1++)\n      if(!isspace((unsigned char) *ptr1))\n        if((*(ptr2++) = *ptr1) == 0)\n          break;\n    /* *field4 = atof(buf); */\n    *field4 = strtod(buf, &ptr1);\n    if(*ptr1) {\n      report(lp, IMPORTANT, \"MPS_readfile: invalid number in columns 25-36 \\n\");\n      return(-1);\n    }\n    items++;\n  }\n  else\n    *field4 = 0;\n\n  line += 15;\n\n  if(line_len >= 40) { /* name */\n    if (line[-1] != ' ' || line[-2] != ' ' || line[-3] != ' ') {\n      report(lp, IMPORTANT, \"MPS_readfile: invalid data card; columns 37-39 must be blank\\n\");\n      return(-1);\n    }\n    namecpy(field5, line);\n    items++;\n  }\n  else\n    field5[0] = '\\0';\n  line += 10;\n\n  if(line_len >= 50) { /* number */\n    if (line[-1] != ' ' || line[-2] != ' ') {\n      report(lp, IMPORTANT, \"MPS_readfile: invalid data card; columns 48-49 must be blank\\n\");\n      return(-1);\n    }\n    strncpy(buf, line, 15);\n    buf[15] = '\\0';\n    for(ptr1 = ptr2 = buf; ; ptr1++)\n      if(!isspace((unsigned char) *ptr1))\n        if((*(ptr2++) = *ptr1) == 0)\n          break;\n    /* *field6 = atof(buf); */\n    *field6 = strtod(buf, &ptr1);\n    if(*ptr1) {\n      report(lp, IMPORTANT, \"MPS_readfile: invalid number in columns 50-61 \\n\");\n      return(-1);\n    }\n    items++;\n  }\n  else\n    *field6 = 0;\n\n  return(items);\n}\n\nSTATIC int spaces(char *line, int line_len)\n{\n  int l;\n  char *line1 = line;\n\n  while (*line1 == ' ')\n    line1++;\n  l = (int) (line1 - line);\n  if (line_len < l)\n    l = line_len;\n  return(l);\n}\n\nSTATIC int lenfield(char *line, int line_len)\n{\n  int l;\n  char *line1 = line;\n\n  while ((*line1) && (*line1 != ' '))\n    line1++;\n  l = (int) (line1 - line);\n  if (line_len < l)\n    l = line_len;\n  return(l);\n}\n\n/* scan_line for fixed MPS format */\nSTATIC int scan_lineFREE(lprec *lp, int section, char* line, char *field1, char *field2, char *field3,\n                         double *field4, char *field5, double *field6)\n{\n  int  items = 0, line_len, len;\n  char buf[256], *ptr1 = NULL, *ptr2;\n\n  line_len = (int) strlen(line);\n  while ((line_len) && ((line[line_len-1] == '\\n') || (line[line_len-1] == '\\r') || (line[line_len-1] == ' ')))\n   line_len--;\n\n  len = spaces(line, line_len);\n  line += len;\n  line_len -= len;\n\n  if ((section == MPSCOLUMNS) || (section == MPSRHS) || (section == MPSRANGES)) {\n    field1[0] = '\\0';\n    items++;\n  }\n  else {\n    len = lenfield(line, line_len);\n    if(line_len >= 1) { /* spaces or N/L/G/E or UP/LO */\n      strncpy(buf, line, len);\n      buf[len] = '\\0';\n      sscanf(buf, \"%s\", field1);\n      if(section == MPSBOUNDS) {\n        for(ptr1 = field1; *ptr1; ptr1++)\n          *ptr1=(char)toupper(*ptr1);\n      }\n      items++;\n    }\n    else\n      field1[0] = '\\0';\n\n    line += len;\n    line_len -= len;\n\n    len = spaces(line, line_len);\n    line += len;\n    line_len -= len;\n  }\n\n  len = lenfield(line, line_len);\n  if(line_len >= 1) { /* name */\n    strncpy(field2, line, len);\n    field2[len] = '\\0';\n    items++;\n  }\n  else\n    field2[0] = '\\0';\n\n  line += len;\n  line_len -= len;\n\n  len = spaces(line, line_len);\n  line += len;\n  line_len -= len;\n\n  len = lenfield(line, line_len);\n  if(line_len >= 1) { /* name */\n    strncpy(field3, line, len);\n    field3[len] = '\\0';\n    items++;\n  }\n  else\n    field3[0] = '\\0';\n\n  line += len;\n  line_len -= len;\n\n  len = spaces(line, line_len);\n  line += len;\n  line_len -= len;\n\n  if (*field3) {\n    if((section == MPSCOLUMNS) && (strcmp(field3, \"'MARKER'\") == 0)) {\n      *field4 = 0;\n      items++;\n      ptr1 = field3;\n    }\n    else if((section == MPSBOUNDS) &&\n            ((strcmp(field1, \"FR\") == 0) || (strcmp(field1, \"MI\") == 0) || (strcmp(field1, \"PL\") == 0) || (strcmp(field1, \"BV\") == 0)))\n      /* field3 *is* the variable name */;\n    else {\n      /* Some free MPS formats allow that field 2 is not provided after the first time.\n         The fieldname is then the same as the the defined field the line before.\n         In that case field2 shifts to field3, field1 shifts to field 2.\n         This situation is tested by checking if field3 is numerical AND there are an even number of fields after.\n      */\n      char *line1 = line;\n      int line_len1 = line_len;\n      int items1 = 0;\n\n      while (line_len1 > 0) {\n        len = lenfield(line1, line_len1);\n        if (len > 0) {\n          line1 += len;\n          line_len1 -= len;\n          items1++;\n        }\n        len = spaces(line1, line_len1);\n        line1 += len;\n        line_len1 -= len;\n      }\n      if ((items1 % 2) == 0) {\n        *field4 = strtod(field3, &ptr1);\n        if(*ptr1 == 0) {\n          strcpy(field3, field2);\n          if ((section == MPSROWS) || (section == MPSBOUNDS) /* || (section == MPSSOS) */)\n            *field2 = 0;\n          else {\n            strcpy(field2, field1);\n            *field1 = 0;\n          }\n          items++;\n        }\n        else\n          ptr1 = NULL;\n      }\n      else\n        ptr1 = NULL;\n    }\n  }\n  else {\n    ptr1 = NULL;\n    if((section == MPSBOUNDS) &&\n       ((strcmp(field1, \"FR\") == 0) || (strcmp(field1, \"MI\") == 0) || (strcmp(field1, \"PL\") == 0) || (strcmp(field1, \"BV\") == 0))) {\n      strcpy(field3, field2);\n      *field2 = 0;\n      items++;\n    }\n  }\n\n  if(ptr1 == NULL) {\n    len = lenfield(line, line_len);\n    if(line_len >= 1) { /* number */\n      strncpy(buf, line, len);\n      buf[len] = '\\0';\n      for(ptr1 = ptr2 = buf; ; ptr1++)\n        if(!isspace((unsigned char) *ptr1))\n          if((*(ptr2++) = *ptr1) == 0)\n            break;\n      /* *field4 = atof(buf); */\n      *field4 = strtod(buf, &ptr1);\n      if(*ptr1)\n        return(-1);\n      items++;\n    }\n    else\n      *field4 = 0;\n\n    line += len;\n    line_len -= len;\n\n    len = spaces(line, line_len);\n    line += len;\n    line_len -= len;\n  }\n\n  len = lenfield(line, line_len);\n  if(line_len >= 1) { /* name */\n    strncpy(field5, line, len);\n    field5[len] = '\\0';\n    items++;\n  }\n  else\n    field5[0] = '\\0';\n  line += len;\n  line_len -= len;\n\n  len = spaces(line, line_len);\n  line += len;\n  line_len -= len;\n\n  len = lenfield(line, line_len);\n  if(line_len >= 1) { /* number */\n    strncpy(buf, line, len);\n    buf[len] = '\\0';\n    for(ptr1 = ptr2 = buf; ; ptr1++)\n      if(!isspace((unsigned char) *ptr1))\n        if((*(ptr2++) = *ptr1) == 0)\n          break;\n    /* *field6 = atof(buf); */\n    *field6 = strtod(buf, &ptr1);\n    if(*ptr1)\n      return(-1);\n    items++;\n  }\n  else\n    *field6 = 0;\n\n  if((section == MPSSOS) && (items == 2)) {\n    strcpy(field3, field2);\n    strcpy(field2, field1);\n    *field1 = 0;\n  }\n\n  if((section != MPSOBJNAME) && (section != MPSBOUNDS)) {\n    for(ptr1 = field1; *ptr1; ptr1++)\n      *ptr1=(char)toupper(*ptr1);\n  }\n\n  return(items);\n}\n\nSTATIC int addmpscolumn(lprec *lp, MYBOOL Int_section, int typeMPS, MYBOOL *Column_ready,\n                        int *count, REAL *Last_column, int *Last_columnno, char *Last_col_name)\n{\n  int ok = TRUE;\n\n  if (*Column_ready) {\n    ok = add_columnex(lp, *count, Last_column, Last_columnno);\n    if (ok) {\n      ok = set_col_name(lp, lp->columns, Last_col_name);\n    }\n    if (ok) {\n      set_int(lp, lp->columns, Int_section);\n      if ((Int_section) && (typeMPS & MPSIBM))\n        set_bounds(lp, lp->columns, 10.0 / DEF_INFINITE, DEF_INFINITE / 10.0);\n    }\n  }\n  *Column_ready = FALSE;\n  *count = 0;\n  return(ok);\n}\n\n#if 0\nSTATIC MYBOOL appendmpsitem(int *count, int rowIndex[], REAL rowValue[])\n{\n  int i = *count;\n\n  if(rowValue[i] == 0)\n    return( FALSE );\n\n  while((i > 0) && (rowIndex[i] < rowIndex[i-1])) {\n    swapINT (rowIndex+i, rowIndex+i-1);\n    swapREAL(rowValue+i, rowValue+i-1);\n    i--;\n  }\n  (*count)++;\n  return( TRUE );\n}\n#endif\n\nSTATIC MYBOOL appendmpsitem(int *count, int rowIndex[], REAL rowValue[])\n{\n  int i = *count;\n\n  /* Check for non-negativity of the index */\n  if(rowIndex[i] < 0)\n    return( FALSE );\n\n  /* Move the element so that the index list is sorted ascending */\n  while((i > 0) && (rowIndex[i] < rowIndex[i-1])) {\n    swapINT (rowIndex+i, rowIndex+i-1);\n    swapREAL(rowValue+i, rowValue+i-1);\n    i--;\n  }\n\n  /* Add same-indexed items (which is rarely encountered), and shorten the list */\n  if((i < *count) && (rowIndex[i] == rowIndex[i+1])) {\n    int ii = i + 1;\n    rowValue[i] += rowValue[ii];\n    (*count)--;\n    while(ii < *count) {\n      rowIndex[ii] = rowIndex[ii+1];\n      rowValue[ii] = rowValue[ii+1];\n      ii++;\n    }\n  }\n\n  /* Update the count and return */\n  (*count)++;\n  return( TRUE );\n}\n\nMYBOOL MPS_readfile(lprec **newlp, char *filename, int typeMPS, int verbose)\n{\n  MYBOOL status = FALSE;\n  FILE   *fpin;\n\n  fpin = fopen(filename, \"r\");\n  if(fpin != NULL) {\n    status = MPS_readhandle(newlp, fpin, typeMPS, verbose);\n    fclose(fpin);\n  }\n  return( status );\n}\n\nstatic int __WINAPI MPS_input(void *fpin, char *buf, int max_size)\n{\n  return(fgets(buf, max_size, (FILE *) fpin) != NULL);\n}\n\nMYBOOL __WINAPI MPS_readhandle(lprec **newlp, FILE *filehandle, int typeMPS, int verbose)\n{\n  return(MPS_readex(newlp, (void *) filehandle, MPS_input, typeMPS, verbose));\n}\n\nMYBOOL __WINAPI MPS_readex(lprec **newlp, void *userhandle, read_modeldata_func read_modeldata, int typeMPS, int verbose)\n{\n  char   field1[BUFSIZ], field2[BUFSIZ], field3[BUFSIZ], field5[BUFSIZ], line[BUFSIZ], tmp[BUFSIZ],\n         Last_col_name[BUFSIZ], probname[BUFSIZ], OBJNAME[BUFSIZ], *ptr;\n  int    items, row, Lineno, var,\n         section = MPSUNDEF, variant = 0, NZ = 0, SOS = 0;\n  MYBOOL Int_section, Column_ready, Column_ready1,\n         Unconstrained_rows_found = FALSE, OF_found = FALSE, CompleteStatus = FALSE;\n  double field4, field6;\n  REAL   *Last_column = NULL;\n  int    count = 0, *Last_columnno = NULL;\n  int    OBJSENSE = ROWTYPE_EMPTY;\n  lprec  *lp;\n  int    (*scan_line)(lprec *lp, int section, char* line, char *field1, char *field2, char *field3,\n                      double *field4, char *field5, double *field6);\n\n  if(newlp == NULL)\n    return( CompleteStatus );\n  else if(*newlp == NULL)\n    lp = make_lp(0, 0);\n  else\n    lp = *newlp;\n\n  if((typeMPS & MPSFIXED) == MPSFIXED)\n    scan_line = scan_lineFIXED;\n  else if((typeMPS & MPSFREE) == MPSFREE)\n    scan_line = scan_lineFREE;\n  else {\n    report(lp, IMPORTANT, \"MPS_readfile: Unrecognized MPS line type.\\n\");\n    if (*newlp == NULL)\n      delete_lp(lp);\n    return( CompleteStatus );\n  }\n\n  if (lp != NULL) {\n    lp->source_is_file = TRUE;\n    lp->verbose = verbose;\n    strcpy(Last_col_name, \"\");\n    strcpy(OBJNAME, \"\");\n    Int_section = FALSE;\n    Column_ready = FALSE;\n    Lineno = 0;\n\n    /* let's initialize line to all zero's */\n    MEMCLEAR(line, BUFSIZ);\n\n    while(read_modeldata(userhandle, line, BUFSIZ - 1)) {\n      Lineno++;\n\n      for(ptr = line; (*ptr) && (isspace((unsigned char) *ptr)); ptr++);\n\n      /* skip lines which start with \"*\", they are comment */\n      if((line[0] == '*') || (*ptr == 0) || (*ptr == '\\n') || (*ptr == '\\r')) {\n        report(lp, FULL, \"Comment on line %d: %s\", Lineno, line);\n        continue;\n      }\n\n      report(lp, FULL, \"Line %6d: %s\", Lineno, line);\n\n      /* first check for \"special\" lines: NAME, ROWS, BOUNDS .... */\n      /* this must start in the first position of line */\n      if(line[0] != ' ') {\n        sscanf(line, \"%s\", tmp);\n        if(strcmp(tmp, \"NAME\") == 0) {\n          section = MPSNAME;\n          *probname = 0;\n          sscanf(line, \"NAME %s\", probname);\n          if (!set_lp_name(lp, probname))\n            break;\n        }\n        else if(((typeMPS & MPSFREE) == MPSFREE) && (strcmp(tmp, \"OBJSENSE\") == 0)) {\n          section = MPSOBJSENSE;\n          report(lp, FULL, \"Switching to OBJSENSE section\\n\");\n        }\n        else if(((typeMPS & MPSFREE) == MPSFREE) && (strcmp(tmp, \"OBJNAME\") == 0)) {\n          section = MPSOBJNAME;\n          report(lp, FULL, \"Switching to OBJNAME section\\n\");\n        }\n        else if(strcmp(tmp, \"ROWS\") == 0) {\n          section = MPSROWS;\n          report(lp, FULL, \"Switching to ROWS section\\n\");\n        }\n        else if(strcmp(tmp, \"COLUMNS\") == 0) {\n          allocREAL(lp, &Last_column, lp->rows + 1, TRUE);\n          allocINT(lp, &Last_columnno, lp->rows + 1, TRUE);\n          count = 0;\n          if ((Last_column == NULL) || (Last_columnno == NULL))\n            break;\n          section = MPSCOLUMNS;\n          report(lp, FULL, \"Switching to COLUMNS section\\n\");\n        }\n        else if(strcmp(tmp, \"RHS\") == 0) {\n          if (!addmpscolumn(lp, Int_section, typeMPS, &Column_ready, &count, Last_column, Last_columnno, Last_col_name))\n            break;\n          section = MPSRHS;\n          report(lp, FULL, \"Switching to RHS section\\n\");\n        }\n        else if(strcmp(tmp, \"BOUNDS\") == 0) {\n          section = MPSBOUNDS;\n          report(lp, FULL, \"Switching to BOUNDS section\\n\");\n        }\n        else if(strcmp(tmp, \"RANGES\") == 0) {\n          section = MPSRANGES;\n          report(lp, FULL, \"Switching to RANGES section\\n\");\n        }\n        else if((strcmp(tmp, \"SOS\") == 0) || (strcmp(tmp, \"SETS\") == 0)) {\n          section = MPSSOS;\n          if(strcmp(tmp, \"SOS\") == 0)\n            variant = 0;\n          else\n            variant = 1;\n          report(lp, FULL, \"Switching to %s section\\n\", tmp);\n        }\n        else if(strcmp(tmp, \"ENDATA\") == 0) {\n          report(lp, FULL, \"Finished reading MPS file\\n\");\n          CompleteStatus = TRUE;\n          break;\n        }\n        else { /* line does not start with space and does not match above */\n          report(lp, IMPORTANT, \"Unrecognized MPS line %d: %s\\n\", Lineno, line);\n          break;\n        }\n      }\n      else { /* normal line, process */\n        items = scan_line(lp, section, line, field1, field2, field3, &field4, field5, &field6);\n        if(items < 0){\n          report(lp, IMPORTANT, \"Syntax error on line %d: %s\\n\", Lineno, line);\n          break;\n        }\n\n        switch(section) {\n\n        case MPSNAME:\n          report(lp, IMPORTANT, \"Error, extra line under NAME line\\n\");\n          break;\n\n        case MPSOBJSENSE:\n          if(OBJSENSE != ROWTYPE_EMPTY) {\n            report(lp, IMPORTANT, \"Error, extra line under OBJSENSE line\\n\");\n            break;\n          }\n          if((strcmp(field1, \"MAXIMIZE\") == 0) || (strcmp(field1, \"MAX\") == 0)) {\n            OBJSENSE = ROWTYPE_OFMAX;\n            set_maxim(lp);\n          }\n          else if((strcmp(field1, \"MINIMIZE\") == 0) || (strcmp(field1, \"MIN\") == 0)) {\n            OBJSENSE = ROWTYPE_OFMIN;\n            set_minim(lp);\n          }\n          else {\n            report(lp, SEVERE, \"Unknown OBJSENSE direction '%s' on line %d\\n\", field1, Lineno);\n            break;\n          }\n          continue;\n\n        case MPSOBJNAME:\n          if(*OBJNAME) {\n            report(lp, IMPORTANT, \"Error, extra line under OBJNAME line\\n\");\n            break;\n          }\n          strcpy(OBJNAME, field1);\n          continue;\n\n        /* Process entries in the ROWS section */\n        case MPSROWS:\n          /* field1: rel. operator; field2: name of constraint */\n\n          report(lp, FULL, \"Row   %5d: %s %s\\n\", lp->rows + 1, field1, field2);\n\n          if(strcmp(field1, \"N\") == 0) {\n            if((*OBJNAME) && (strcmp(field2, OBJNAME)))\n              /* Ignore this objective name since it is not equal to the OBJNAME name */;\n            else if(!OF_found) { /* take the first N row as OF, ignore others */\n              if (!set_row_name(lp, 0, field2))\n                break;\n              OF_found = TRUE;\n            }\n            else if(!Unconstrained_rows_found) {\n              report(lp, IMPORTANT, \"Unconstrained row %s ignored\\n\", field2);\n              report(lp, IMPORTANT, \"Further messages of this kind will be suppressed\\n\");\n              Unconstrained_rows_found = TRUE;\n            }\n          }\n          else if(strcmp(field1, \"L\") == 0) {\n            if ((!str_add_constraint(lp, \"\" ,LE ,0)) || (!set_row_name(lp, lp->rows, field2)))\n              break;\n          }\n          else if(strcmp(field1, \"G\") == 0) {\n            if ((!str_add_constraint(lp, \"\" ,GE ,0)) || (!set_row_name(lp, lp->rows, field2)))\n              break;\n          }\n          else if(strcmp(field1, \"E\") == 0) {\n            if ((!str_add_constraint(lp, \"\",EQ ,0)) || (!set_row_name(lp, lp->rows, field2)))\n              break;\n          }\n          else {\n            report(lp, SEVERE, \"Unknown relation code '%s' on line %d\\n\", field1, Lineno);\n            break;\n          }\n\n          continue;\n\n        /* Process entries in the COLUMNS section */\n        case MPSCOLUMNS:\n          /* field2: variable; field3: constraint; field4: coef */\n          /* optional: field5: constraint; field6: coef */\n\n          report(lp, FULL, \"Column %4d: %s %s %g %s %g\\n\",\n                            lp->columns + 1, field2, field3, field4, field5, field6);\n\n          if((items == 4) || (items == 5) || (items == 6)) {\n            if (NZ == 0)\n              strcpy(Last_col_name, field2);\n            else if(*field2) {\n              Column_ready1 = (MYBOOL) (strcmp(field2, Last_col_name) != 0);\n              if(Column_ready1) {\n                if (find_var(lp, field2, FALSE) >= 0) {\n                  report(lp, SEVERE, \"Variable name (%s) is already used!\\n\", field2);\n                  break;\n                }\n\n                if(Column_ready) {  /* Added ability to handle non-standard \"same as above\" column name */\n                  if (addmpscolumn(lp, Int_section, typeMPS, &Column_ready, &count, Last_column, Last_columnno, Last_col_name)) {\n                    strcpy(Last_col_name, field2);\n                    NZ = 0;\n                  }\n                  else\n                    break;\n                }\n              }\n            }\n            if(items == 5) { /* there might be an INTEND or INTORG marker */\n             /* look for \"    <name>  'MARKER'                 'INTORG'\"\n                      or \"    <name>  'MARKER'                 'INTEND'\"  */\n              if(strcmp(field3, \"'MARKER'\") != 0)\n                break;\n              if(strcmp(field5, \"'INTORG'\") == 0) {\n                Int_section = TRUE;\n                report(lp, FULL, \"Switching to integer section\\n\");\n              }\n              else if(strcmp(field5, \"'INTEND'\") == 0) {\n                Int_section = FALSE;\n                report(lp, FULL, \"Switching to non-integer section\\n\");\n              }\n              else\n                report(lp, IMPORTANT, \"Unknown marker (ignored) at line %d: %s\\n\",\n                                       Lineno, field5);\n            }\n            else if((row = find_row(lp, field3, Unconstrained_rows_found)) >= 0) {\n              if(row > lp->rows)\n                report(lp, CRITICAL, \"Invalid row %s encountered in the MPS file\\n\", field3);\n              Last_columnno[count] = row;\n              Last_column[count] = (REAL)field4;\n              if(appendmpsitem(&count, Last_columnno, Last_column)) {\n                NZ++;\n                Column_ready = TRUE;\n              }\n            }\n          }\n          if(items == 6) {\n            if((row = find_row(lp, field5, Unconstrained_rows_found)) >= 0) {\n              if(row > lp->rows)\n                report(lp, CRITICAL, \"Invalid row %s encountered in the MPS file\\n\", field5);\n              Last_columnno[count] = row;\n              Last_column[count] = (REAL)field6;\n              if(appendmpsitem(&count, Last_columnno, Last_column)) {\n                NZ++;\n                Column_ready = TRUE;\n              }\n            }\n          }\n\n          if((items < 4) || (items > 6)) { /* Wrong! */\n            report(lp, CRITICAL, \"Wrong number of items (%d) in COLUMNS section (line %d)\\n\",\n                                  items, Lineno);\n            break;\n          }\n\n          continue;\n\n        /* Process entries in the RHS section */\n        /* field2: uninteresting name; field3: constraint name */\n        /* field4: value */\n        /* optional: field5: constraint name; field6: value */\n        case MPSRHS:\n\n          report(lp, FULL, \"RHS line: %s %s %g %s %g\\n\",\n                            field2, field3, field4, field5, field6);\n\n          if((items != 4) && (items != 6)) {\n            report(lp, CRITICAL, \"Wrong number of items (%d) in RHS section line %d\\n\",\n                                  items, Lineno);\n            break;\n          }\n\n          if((row = find_row(lp, field3, Unconstrained_rows_found)) >= 0) {\n            if ((row == 0) && ((typeMPS & MPSNEGOBJCONST) == MPSNEGOBJCONST))\n              field4 = -field4;\n            set_rh(lp, row, (REAL)field4);\n          }\n\n          if(items == 6) {\n            if((row = find_row(lp, field5, Unconstrained_rows_found)) >= 0) {\n              if ((row == 0) && ((typeMPS & MPSNEGOBJCONST) == MPSNEGOBJCONST))\n                field6 = -field6;\n              set_rh(lp, row, (REAL)field6);\n            }\n          }\n\n          continue;\n\n        /* Process entries in the BOUNDS section */\n        /* field1: bound type; field2: uninteresting name; */\n        /* field3: variable name; field4: value */\n        case MPSBOUNDS:\n\n          report(lp, FULL, \"BOUNDS line: %s %s %s %g\\n\",\n                            field1, field2, field3, field4);\n\n          var = find_var(lp, field3, FALSE);\n          if(var < 0){ /* bound on undefined var in COLUMNS section ... */\n            Column_ready = TRUE;\n            if (!addmpscolumn(lp, FALSE, typeMPS, &Column_ready, &count, Last_column, Last_columnno, field3))\n              break;\n            Column_ready = TRUE;\n            var = find_var(lp, field3, TRUE);\n          }\n          if(var < 0) /* undefined var and could add ... */;\n          else if(strcmp(field1, \"UP\") == 0) {\n          /* upper bound */\n            /* if(!set_bounds(lp, var, get_lowbo(lp, var), field4)) */\n            if(!set_upbo(lp, var, field4))\n              break;\n          }\n          else if(strcmp(field1, \"SC\") == 0) {\n            /* upper bound */\n            if(field4 == 0)\n              field4 = lp->infinite;\n            /* if(!set_bounds(lp, var, get_lowbo(lp, var), field4)) */\n            if(!set_upbo(lp, var, field4))\n              break;\n            set_semicont(lp, var, TRUE);\n          }\n          else if(strcmp(field1, \"SI\") == 0) {\n            /* upper bound */\n            if(field4 == 0)\n              field4 = lp->infinite;\n            /* if(!set_bounds(lp, var, get_lowbo(lp, var), field4)) */\n            if(!set_upbo(lp, var, field4))\n              break;\n            set_int(lp, var, TRUE);\n            set_semicont(lp, var, TRUE);\n          }\n          else if(strcmp(field1, \"LO\") == 0) {\n            /* lower bound */\n            /* if(!set_bounds(lp, var, field4, get_upbo(lp, var))) */\n            if(!set_lowbo(lp, var, field4))\n              break;\n          }\n          else if(strcmp(field1, \"PL\") == 0) { /* plus-ranged variable */\n            /* if(!set_bounds(lp, var, get_lowbo(lp, var), lp->infinite)) */\n            if(!set_upbo(lp, var, lp->infinite))\n              break;\n          }\n          else if(strcmp(field1, \"MI\") == 0) { /* minus-ranged variable */\n            /* if(!set_bounds(lp, var, -lp->infinite, get_upbo(lp, var))) */\n            if(!set_lowbo(lp, var, -lp->infinite))\n              break;\n          }\n          else if(strcmp(field1, \"FR\") == 0) { /* free variable */\n            set_unbounded(lp, var);\n          }\n          else if(strcmp(field1, \"FX\") == 0) {\n            /* fixed, upper _and_ lower  */\n            if(!set_bounds(lp, var, field4, field4))\n              break;\n          }\n          else if(strcmp(field1, \"BV\") == 0) { /* binary variable */\n            set_binary(lp, var, TRUE);\n          }\n          /* AMPL bounds type UI and LI added by E.Imamura (CRIEPI)  */\n          else if(strcmp(field1, \"UI\") == 0) { /* upper bound for integer variable */\n            /* if(!set_bounds(lp, var, get_lowbo(lp, var), field4)) */\n            if(!set_upbo(lp, var, field4))\n              break;\n            set_int(lp, var, TRUE);\n          }\n          else if(strcmp(field1, \"LI\") == 0) { /* lower bound for integer variable - corrected by KE */\n            /* if(!set_bounds(lp, var, field4, get_upbo(lp, var))) */\n            if(!set_lowbo(lp, var, field4))\n              break;\n            set_int(lp, var, TRUE);\n          }\n          else {\n            report(lp, CRITICAL, \"BOUND type %s on line %d is not supported\",\n                                  field1, Lineno);\n            break;\n          }\n\n          continue;\n\n          /* Process entries in the BOUNDS section */\n\n      /* We have to implement the following semantics:\n\n      D. The RANGES section is for constraints of the form: h <=\n      constraint <= u .  The range of the constraint is r = u - h .  The\n      value of r is specified in the RANGES section, and the value of u or\n      h is specified in the RHS section.  If b is the value entered in the\n      RHS section, and r is the value entered in the RANGES section, then\n      u and h are thus defined:\n\n      row type       sign of r       h          u\n      ----------------------------------------------\n     G            + or -         b        b + |r|\n     L            + or -       b - |r|      b\n     E              +            b        b + |r|\n     E              -          b - |r|      b            */\n\n        /* field2: uninteresting name; field3: constraint name */\n        /* field4: value */\n        /* optional: field5: constraint name; field6: value */\n\n        case MPSRANGES:\n\n          report(lp, FULL, \"RANGES line: %s %s %g %s %g\",\n                            field2, field3, field4, field5, field6);\n\n          if((items != 4) && (items != 6)) {\n            report(lp, CRITICAL, \"Wrong number of items (%d) in RANGES section line %d\",\n                                  items, Lineno);\n            break;\n          }\n\n          if((row = find_row(lp, field3, Unconstrained_rows_found)) >= 0) {\n            /* Determine constraint type */\n\n            if(fabs(field4) >= lp->infinite) {\n              report(lp, IMPORTANT,\n                          \"Warning, Range for row %s >= infinity (value %g) on line %d, ignored\",\n                          field3, field4, Lineno);\n            }\n            else if(field4 == 0) {\n              /* Change of a GE or LE to EQ */\n              if(lp->orig_upbo[row] != 0)\n                set_constr_type(lp, row, EQ);\n            }\n            else if(is_chsign(lp, row)) {\n              /* GE */\n              lp->orig_upbo[row] = fabs(field4);\n            }\n            else if((lp->orig_upbo[row] == 0) && (field4 >= 0)) {\n              /*  EQ with positive sign of r value */\n              set_constr_type(lp, row, GE);\n              lp->orig_upbo[row] = field4;\n            }\n            else if(lp->orig_upbo[row] == lp->infinite) {\n              /* LE */\n              lp->orig_upbo[row] = fabs(field4);\n            }\n            else if((lp->orig_upbo[row] == 0) && (field4 < 0)) {\n              /* EQ with negative sign of r value */\n              set_constr_type(lp, row, LE);\n              lp->orig_upbo[row] = my_flipsign(field4);\n            }\n            else { /* let's be paranoid */\n              report(lp, IMPORTANT,\n                          \"Cannot figure out row type, row = %d, is_chsign = %d, upbo = %g on line %d\",\n                          row, is_chsign(lp, row), (double)lp->orig_upbo[row], Lineno);\n            }\n          }\n\n          if(items == 6) {\n            if((row = find_row(lp, field5, Unconstrained_rows_found)) >= 0) {\n              /* Determine constraint type */\n\n              if(fabs(field6) >= lp->infinite) {\n                report(lp, IMPORTANT,\n                            \"Warning, Range for row %s >= infinity (value %g) on line %d, ignored\",\n                            field5, field6, Lineno);\n              }\n              else if(field6 == 0) {\n                /* Change of a GE or LE to EQ */\n                if(lp->orig_upbo[row] != 0)\n                  set_constr_type(lp, row, EQ);\n              }\n              else if(is_chsign(lp, row)) {\n                /* GE */\n                lp->orig_upbo[row] = fabs(field6);\n              }\n              else if(lp->orig_upbo[row] == 0 && field6 >= 0) {\n                /*  EQ with positive sign of r value */\n                set_constr_type(lp, row, GE);\n                lp->orig_upbo[row] = field6;\n              }\n              else if(lp->orig_upbo[row] == lp->infinite) {\n                /* LE */\n                lp->orig_upbo[row] = fabs(field6);\n              }\n              else if((lp->orig_upbo[row] == 0) && (field6 < 0)) {\n                /* EQ with negative sign of r value */\n                set_constr_type(lp, row, LE);\n                lp->orig_upbo[row] = my_flipsign(field6);\n              }\n              else { /* let's be paranoid */\n                report(lp, IMPORTANT,\n                            \"Cannot figure out row type, row = %d, is_chsign = %d, upbo = %g on line %d\",\n                            row, is_chsign(lp,row), (double) lp->orig_upbo[row], Lineno);\n              }\n            }\n          }\n\n          continue;\n\n        /* Process entries in the SOS section */\n\n        /* We have to implement the following semantics:\n\n          E. The SOS section is for ordered variable sets of the form:\n      x1, x2, x3 ... xn where only a given number of consequtive variables\n          may be non-zero.  Each set definition is prefaced by type, name\n      and priority data.  Each set member has an optional weight that\n      determines its order.  There are two forms supported; a full format\n      and a reduced CPLEX-like format.                                       */\n\n        case MPSSOS:\n          report(lp, FULL, \"SOS line: %s %s %g %s %g\",\n                             field2, field3, field4, field5, field6);\n\n          if((items == 0) || (items > 4)) {\n            report(lp, IMPORTANT,\n                   \"Invalid number of items (%d) in SOS section line %d\\n\",\n                   items, Lineno);\n            break;\n          }\n\n          if(strlen(field1) == 0) items--;  /* fix scanline anomoly! */\n\n          /* Check if this is the start of a new SOS */\n          if(items == 1 || items == 4) {\n            row = (int) (field1[1] - '0');\n            if((row <= 0) || (row > 9)) {\n              report(lp, IMPORTANT,\n                     \"Error: Invalid SOS type %s line %d\\n\", field1, Lineno);\n              break;\n            }\n            field1[0] = '\\0';               /* fix scanline anomoly! */\n\n            /* lp_solve needs a name for the SOS */\n            if(variant == 0) {\n              if(strlen(field3) == 0)  /* CPLEX format does not provide a SOS name; create one */\n                sprintf(field3, \"SOS_%d\", SOS_count(lp) + 1);\n            }\n            else {                     /* Remap XPRESS format name */\n              strcpy(field3, field1);\n            }\n            /* Obtain the SOS priority */\n            if(items == 4)\n              SOS = (int) field4;\n            else\n              SOS = 1;\n\n            /* Define a new SOS instance */\n\n            SOS = add_SOS(lp, field3, (int) row, SOS, 0, NULL, NULL);\n          }\n          /* Otherwise, add set members to the active SOS */\n          else {\n            char *field = (items == 3) ? field3 /* Native lp_solve and XPRESS formats */ : field2 /* CPLEX format */;\n\n            var = find_var(lp, field, FALSE);  /* Native lp_solve and XPRESS formats */\n            if(var < 0){ /* SOS on undefined var in COLUMNS section ... */\n              Column_ready = TRUE;\n              if (!addmpscolumn(lp, FALSE, typeMPS, &Column_ready, &count, Last_column, Last_columnno, field))\n                break;\n              Column_ready = TRUE;\n              var = find_var(lp, field, TRUE);\n            }\n            if((var < 0) || (SOS < 1)) /* undefined var and could add ... */;\n            else append_SOSrec(lp->SOS->sos_list[SOS-1], 1, &var, &field4);\n          }\n\n          continue;\n        }\n\n        /* If we got here there was an error \"upstream\" */\n         report(lp, IMPORTANT,\n                     \"Error: Cannot handle line %d\\n\", Lineno);\n         break;\n      }\n    }\n\n    if((*OBJNAME) && (!OF_found)) {\n      report(lp, IMPORTANT,\n                  \"Error: Objective function specified by OBJNAME card not found\\n\");\n      CompleteStatus = FALSE;\n    }\n\n    if(CompleteStatus == FALSE) {\n      if (*newlp == NULL)\n        delete_lp(lp);\n    }\n    else {\n      if (typeMPS & MPSIBM) {\n        REAL lower, upper;\n\n        for (var = 1; var <= lp->columns; var++)\n          if (is_int(lp, var)) {\n            lower = get_lowbo(lp, var);\n            upper = get_upbo(lp, var);\n            if ((lower == 10.0 / DEF_INFINITE) && (upper == DEF_INFINITE / 10.0))\n              upper = 1.0;\n            if (lower == 10.0 / DEF_INFINITE)\n              lower = 0.0;\n            if (upper == DEF_INFINITE / 10.0)\n              upper = lp->infinite;\n            set_bounds(lp, var, lower, upper);\n          }\n      }\n      *newlp = lp;\n    }\n    if(Last_column != NULL)\n      FREE(Last_column);\n    if(Last_columnno != NULL)\n      FREE(Last_columnno);\n  }\n\n  return( CompleteStatus );\n}\n\nstatic void number(char *str,REAL value)\n {\n  char __str[80], *_str;\n  int  i;\n\n  /* sprintf(_str,\"%12.6G\",value); */\n  _str=__str+2;\n  if (value>=0.0)\n   if ((value!=0.0) && ((value>0.99999999e12) || (value<0.0001))) {\n    int n=15;\n\n    do {\n     n--;\n     i=sprintf(_str,\"%*.*E\",n,n-6,(double) value);\n     if (i>12) {\n      char *ptr=strchr(_str,'E');\n\n      if (ptr!=NULL) {\n       if (*(++ptr)=='-') ptr++;\n       while ((i>12) && ((*ptr=='+') || (*ptr=='0'))) {\n        strcpy(ptr,ptr+1);\n        i--;\n       }\n      }\n     }\n    } while (i>12);\n   }\n   else if (value>=1.0e10) {\n    int n=13;\n\n    do {\n     i=sprintf(_str,\"%*.0f\",--n,(double) value);\n    } while (i>12);\n   }\n   else {\n    if (((i=sprintf(_str,\"%12.10f\",(double) value))>12) && (_str[12]>='5')) {\n     for (i=11;i>=0;i--)\n      if (_str[i]!='.') {\n       if (++_str[i]>'9') _str[i]='0';\n       else break;\n      }\n     if (i<0) {\n      *(--_str)='1';\n      *(--_str)=' ';\n     }\n    }\n   }\n  else\n   if ((value<-0.99999999e11) || (value>-0.0001)) {\n    int n=15;\n\n    do {\n     n--;\n     i=sprintf(_str,\"%*.*E\",n,n-7,(double) value);\n     if (i>12) {\n      char *ptr=strchr(_str,'E');\n\n      if (ptr!=NULL) {\n       if (*(++ptr)=='-') ptr++;\n       while ((i>12) && ((*ptr=='+') || (*ptr=='0'))) {\n        strcpy(ptr,ptr+1);\n        i--;\n       }\n      }\n     }\n    } while (i>12);\n   }\n   else if (value<=-1.0e9) {\n    int n=13;\n\n    do {\n     i=sprintf(_str,\"%*.0f\",--n,(double) value);\n    } while (i>12);\n   }\n   else\n    if (((i=sprintf(_str,\"%12.9f\",(double) value))>12) && (_str[12]>='5')) {\n     for (i=11;i>=1;i--)\n      if (_str[i]!='.') {\n       if (++_str[i]>'9') _str[i]='0';\n       else break;\n      }\n     if (i<1) {\n      *_str='1';\n      *(--_str)='-';\n      *(--_str)=' ';\n     }\n    }\n  strncpy(str,_str,12);\n }\n\nstatic char *formatnumber12(char *numberbuffer, double a)\n{\n#if 0\n  return(sprintf(numberbuffer, \"%12g\", a));\n#else\n  number(numberbuffer, a);\n  return(numberbuffer);\n#endif\n}\n\nSTATIC char *MPSnameFIXED(char *name0, char *name)\n{\n  sprintf(name0, \"%-8.8s\", name);\n  return(name0);\n}\n\nSTATIC char *MPSnameFREE(char *name0, char *name)\n{\n  if(strlen(name) < 8)\n    return(MPSnameFIXED(name0, name));\n  else\n    return(name);\n}\n\nstatic void write_data(void *userhandle, write_modeldata_func write_modeldata, char *format, ...)\n{\n  char buff[DEF_STRBUFSIZE+1];\n  va_list ap;\n\n  va_start(ap, format);\n  vsnprintf(buff, DEF_STRBUFSIZE, format, ap);\n  va_end(ap);\n  write_modeldata(userhandle, buff);\n}\n\nMYBOOL __WINAPI MPS_writefileex(lprec *lp, int typeMPS, void *userhandle, write_modeldata_func write_modeldata)\n{\n  int    i, j, jj, je, k, marker, putheader, ChangeSignObj = FALSE, *idx, *idx1;\n  MYBOOL ok = TRUE, names_used;\n  REAL   a, *val, *val1;\n  char * (*MPSname)(char *name0, char *name);\n  char numberbuffer[15];\n  char name0[9];\n\n  if((typeMPS & MPSFIXED) == MPSFIXED) {\n    MPSname = MPSnameFIXED;\n    ChangeSignObj = is_maxim(lp);\n  }\n  else if((typeMPS & MPSFREE) == MPSFREE) {\n    MPSname = MPSnameFREE;\n  }\n  else {\n    report(lp, IMPORTANT, \"MPS_writefile: unrecognized MPS name type.\\n\");\n    return(FALSE);\n  }\n\n  names_used = lp->names_used;\n\n  if((typeMPS & MPSFIXED) == MPSFIXED) {\n    /* Check if there is no variable name where the first 8 charachters are equal to the first 8 characters of anothe variable */\n    if(names_used)\n      for(i = 1; (i <= lp->columns) && (ok); i++)\n        if((lp->col_name[i] != NULL) && (lp->col_name[i]->name != NULL) && (!is_splitvar(lp, i)) && (strlen(lp->col_name[i]->name) > 8))\n          for(j = 1; (j < i) && (ok); j++)\n    if((lp->col_name[j] != NULL) && (lp->col_name[j]->name != NULL) && (!is_splitvar(lp, j)))\n      if(strncmp(lp->col_name[i]->name, lp->col_name[j]->name, 8) == 0)\n        ok = FALSE;\n  }\n\n  if(!ok) {\n    lp->names_used = FALSE;\n    ok = TRUE;\n  }\n\n  memset(numberbuffer, 0, sizeof(numberbuffer));\n\n  marker = 0;\n\n  /* First write metadata in structured comment form (lp_solve style) */\n  write_data(userhandle, write_modeldata, \"*<meta creator='lp_solve v%d.%d'>\\n\",\n                  (int) MAJORVERSION, (int) MINORVERSION);\n  write_data(userhandle, write_modeldata, \"*<meta rows=%d>\\n\", lp->rows);\n  write_data(userhandle, write_modeldata, \"*<meta columns=%d>\\n\", lp->columns);\n  write_data(userhandle, write_modeldata, \"*<meta equalities=%d>\\n\", lp->equalities);\n  if(SOS_count(lp) > 0)\n    write_data(userhandle, write_modeldata, \"*<meta SOS=%d>\\n\", SOS_count(lp));\n  write_data(userhandle, write_modeldata, \"*<meta integers=%d>\\n\", lp->int_vars);\n  if(lp->sc_vars > 0)\n    write_data(userhandle, write_modeldata, \"*<meta scvars=%d>\\n\", lp->sc_vars);\n  write_data(userhandle, write_modeldata, \"*<meta origsense='%s'>\\n\", (is_maxim(lp) ? \"MAX\" : \"MIN\"));\n  write_data(userhandle, write_modeldata, \"*\\n\");\n\n  /* Write the MPS content */\n  write_data(userhandle, write_modeldata, \"NAME          %s\\n\", MPSname(name0, get_lp_name(lp)));\n  if(((typeMPS & MPSFREE) == MPSFREE) && (is_maxim(lp)))\n    write_data(userhandle, write_modeldata, \"OBJSENSE\\n MAX\\n\");\n  write_data(userhandle, write_modeldata, \"ROWS\\n\");\n  for(i = 0; i <= lp->rows; i++) {\n    if(i == 0)\n      write_data(userhandle, write_modeldata, \" N  \");\n    else if(lp->orig_upbo[i] != 0) {\n      if(is_chsign(lp,i))\n        write_data(userhandle, write_modeldata, \" G  \");\n      else\n        write_data(userhandle, write_modeldata, \" L  \");\n    }\n    else\n      write_data(userhandle, write_modeldata, \" E  \");\n    write_data(userhandle, write_modeldata, \"%s\\n\", MPSname(name0, get_row_name(lp, i)));\n  }\n\n  allocREAL(lp, &val, 1 + lp->rows, TRUE);\n  allocINT(lp, &idx, 1 + lp->rows, TRUE);\n  write_data(userhandle, write_modeldata, \"COLUMNS\\n\");\n  for(i = 1; i <= lp->columns; i++) {\n    if(!is_splitvar(lp, i)) {\n      if(is_int(lp,i) && (marker % 2) == 0) {\n        write_data(userhandle, write_modeldata, \"    MARK%04d  'MARKER'                 'INTORG'\\n\",\n                marker);\n        marker++;\n      }\n      if(!is_int(lp,i) && (marker % 2) == 1) {\n        write_data(userhandle, write_modeldata, \"    MARK%04d  'MARKER'                 'INTEND'\\n\",\n                marker);\n        marker++;\n      }\n\n      /* Loop over non-zero column entries */\n      je = get_columnex(lp, i, val, idx);\n      for(k = 1, val1 = val, idx1 = idx, jj = 0; jj < je; jj++) {\n        k = 1 - k;\n        j = *(idx1++);\n        a = *(val1++);\n        if (k == 0) {\n          write_data(userhandle, write_modeldata, \"    %s\",\n                          MPSname(name0, get_col_name(lp, i)));\n          write_data(userhandle, write_modeldata, \"  %s  %s\",\n                          MPSname(name0, get_row_name(lp, j)),\n/*                          formatnumber12(numberbuffer, (double) a)); */\n                          formatnumber12(numberbuffer, (double) (a * (j == 0 && ChangeSignObj ? -1 : 1))));\n    }\n        else\n          write_data(userhandle, write_modeldata, \"   %s  %s\\n\",\n                          MPSname(name0, get_row_name(lp, j)),\n                          formatnumber12(numberbuffer, (double) (a * (j == 0 && ChangeSignObj ? -1 : 1))));\n/*                          formatnumber12(numberbuffer, (double) a)); */\n      }\n      if(k == 0)\n        write_data(userhandle, write_modeldata, \"\\n\");\n    }\n  }\n  if((marker % 2) == 1) {\n    write_data(userhandle, write_modeldata, \"    MARK%04d  'MARKER'                 'INTEND'\\n\",\n            marker);\n  /* marker++; */ /* marker not used after this */\n  }\n  FREE(idx);\n  FREE(val);\n\n  write_data(userhandle, write_modeldata, \"RHS\\n\");\n  for(k = 1, i = 0; i <= lp->rows; i++) {\n    a = lp->orig_rhs[i];\n    if(a) {\n      a = unscaled_value(lp, a, i);\n      if ((i == 0) && ((typeMPS & MPSNEGOBJCONST) == MPSNEGOBJCONST))\n        a = -a;\n      if((i == 0) || is_chsign(lp, i))\n        a = my_flipsign(a);\n      k = 1 - k;\n      if(k == 0)\n        write_data(userhandle, write_modeldata, \"    RHS       %s  %s\",\n                        MPSname(name0, get_row_name(lp, i)),\n                        formatnumber12(numberbuffer, (double)a));\n      else\n        write_data(userhandle, write_modeldata, \"   %s  %s\\n\",\n                        MPSname(name0, get_row_name(lp, i)),\n                        formatnumber12(numberbuffer, (double)a));\n    }\n  }\n  if(k == 0)\n    write_data(userhandle, write_modeldata, \"\\n\");\n\n  putheader = TRUE;\n  for(k = 1, i = 1; i <= lp->rows; i++){\n    a = 0;\n    if((lp->orig_upbo[i] < lp->infinite) && (lp->orig_upbo[i] != 0.0))\n      a = lp->orig_upbo[i];\n    if(a) {\n      if(putheader) {\n        write_data(userhandle, write_modeldata, \"RANGES\\n\");\n        putheader = FALSE;\n      }\n      a = unscaled_value(lp, a, i);\n      k = 1 - k;\n      if(k == 0)\n        write_data(userhandle, write_modeldata, \"    RGS       %s  %s\",\n                        MPSname(name0, get_row_name(lp, i)),\n                        formatnumber12(numberbuffer, (double)a));\n      else\n        write_data(userhandle, write_modeldata, \"   %s  %s\\n\",\n                        MPSname(name0, get_row_name(lp, i)),\n                        formatnumber12(numberbuffer, (double)a));\n    }\n  }\n  if(k == 0)\n    write_data(userhandle, write_modeldata, \"\\n\");\n\n  putheader = TRUE;\n  for(i = lp->rows + 1; i <= lp->sum; i++)\n    if(!is_splitvar(lp, i - lp->rows)) {\n      j = i - lp->rows;\n      if((lp->orig_lowbo[i] != 0) && (lp->orig_upbo[i] < lp->infinite) &&\n         (lp->orig_lowbo[i] == lp->orig_upbo[i])) {\n        a = lp->orig_upbo[i];\n        a = unscaled_value(lp, a, i);\n        if(putheader) {\n          write_data(userhandle, write_modeldata, \"BOUNDS\\n\");\n          putheader = FALSE;\n        }\n        write_data(userhandle, write_modeldata, \" FX BND       %s  %s\\n\",\n                        MPSname(name0, get_col_name(lp, j)),\n                        formatnumber12(numberbuffer, (double)a));\n      }\n      else if(is_binary(lp, j)) {\n        if(putheader) {\n          write_data(userhandle, write_modeldata, \"BOUNDS\\n\");\n          putheader = FALSE;\n        }\n        write_data(userhandle, write_modeldata, \" BV BND       %s\\n\",\n                        MPSname(name0, get_col_name(lp, j)));\n      }\n      else if(is_unbounded(lp, j)) {\n        if(putheader) {\n          write_data(userhandle, write_modeldata, \"BOUNDS\\n\");\n          putheader = FALSE;\n        }\n        write_data(userhandle, write_modeldata, \" FR BND       %s\\n\",\n                        MPSname(name0, get_col_name(lp, j)));\n      }\n      else {\n        if((lp->orig_lowbo[i] != 0) || (is_int(lp, j))) { /* Some solvers like CPLEX need to have a bound on a variable if it is integer, but not binary else it is interpreted as binary which is not ment */\n          a = lp->orig_lowbo[i];\n          a = unscaled_value(lp, a, i);\n          if(putheader) {\n            write_data(userhandle, write_modeldata, \"BOUNDS\\n\");\n            putheader = FALSE;\n          }\n          if(lp->orig_lowbo[i] != -lp->infinite)\n            write_data(userhandle, write_modeldata, \" LO BND       %s  %s\\n\",\n                            MPSname(name0, get_col_name(lp, j)),\n                            formatnumber12(numberbuffer, (double)a));\n          else\n            write_data(userhandle, write_modeldata, \" MI BND       %s\\n\",\n                            MPSname(name0, get_col_name(lp, j)));\n        }\n\n        if((lp->orig_upbo[i] < lp->infinite) || (is_semicont(lp, j))) {\n          a = lp->orig_upbo[i];\n          if(a < lp->infinite)\n            a = unscaled_value(lp, a, i);\n          if(putheader) {\n            write_data(userhandle, write_modeldata, \"BOUNDS\\n\");\n            putheader = FALSE;\n          }\n          if(is_semicont(lp, j)) {\n            if(is_int(lp, j))\n              write_data(userhandle, write_modeldata, \" SI BND       %s  %s\\n\",\n                              MPSname(name0, get_col_name(lp, j)),\n                  (a < lp->infinite) ? formatnumber12(numberbuffer, (double)a) : \"            \");\n            else\n              write_data(userhandle, write_modeldata, \" SC BND       %s  %s\\n\",\n                              MPSname(name0, get_col_name(lp, j)),\n                              (a < lp->infinite) ? formatnumber12(numberbuffer, (double)a) : \"            \");\n          }\n          else\n            write_data(userhandle, write_modeldata, \" UP BND       %s  %s\\n\",\n                            MPSname(name0, get_col_name(lp, j)),\n                            formatnumber12(numberbuffer, (double)a));\n        }\n      }\n    }\n\n /* Write optional SOS section */\n  putheader = TRUE;\n  for(i = 0; i < SOS_count(lp); i++) {\n    SOSgroup *SOS = lp->SOS;\n\n    if(putheader) {\n      write_data(userhandle, write_modeldata, \"SOS\\n\");\n      putheader = FALSE;\n    }\n    write_data(userhandle, write_modeldata, \" S%1d SOS       %s  %s\\n\",\n                    SOS->sos_list[i]->type,\n                    MPSname(name0, SOS->sos_list[i]->name),\n                    formatnumber12(numberbuffer, (double) SOS->sos_list[i]->priority));\n    for(j = 1; j <= SOS->sos_list[i]->size; j++) {\n      write_data(userhandle, write_modeldata, \"    SOS       %s  %s\\n\",\n                      MPSname(name0, get_col_name(lp, SOS->sos_list[i]->members[j])),\n                      formatnumber12(numberbuffer, (double) SOS->sos_list[i]->weights[j]));\n    }\n  }\n\n  write_data(userhandle, write_modeldata, \"ENDATA\\n\");\n\n  lp->names_used = names_used;\n\n  return(ok);\n}\n\nstatic int __WINAPI write_lpdata(void *userhandle, char *buf)\n{\n  fputs(buf, (FILE *) userhandle);\n  return(TRUE);\n}\n\nMYBOOL MPS_writefile(lprec *lp, int typeMPS, char *filename)\n{\n  FILE *output = stdout;\n  MYBOOL ok;\n\n  if (filename != NULL) {\n    ok = ((output = fopen(filename, \"w\")) != NULL);\n    if(!ok)\n      return(ok);\n  }\n  else\n    output = lp->outstream;\n\n  ok = MPS_writefileex(lp, typeMPS, (void *) output, write_lpdata);\n\n  if (filename != NULL)\n    fclose(output);\n\n  return(ok);\n}\n\nMYBOOL MPS_writehandle(lprec *lp, int typeMPS, FILE *output)\n{\n  MYBOOL ok;\n\n  if (output != NULL)\n    set_outputstream(lp, output);\n\n  output = lp->outstream;\n\n  ok = MPS_writefileex(lp, typeMPS, (void *) output, write_lpdata);\n\n  return(ok);\n}\n\n\n/* Read and write BAS files */\n/* #define OldNameMatch */\n#ifdef OldNameMatch\nstatic int MPS_getnameidx(lprec *lp, char *varname, MYBOOL isrow)\n{\n  int in = -1;\n\n  in = get_nameindex(lp, varname, isrow);\n  if((in < 0) && (strncmp(varname, (isrow ? ROWNAMEMASK : COLNAMEMASK), 1) == 0)) {\n    if(sscanf(varname + 1, \"%d\", &in) != 1)\n      in = -1;\n  }\n  return( in );\n}\n#else\nstatic int MPS_getnameidx(lprec *lp, char *varname, MYBOOL tryrowfirst)\n{\n  int in = -1;\n\n  /* Have we defined our own variable names? */\n  if(lp->names_used) {\n    /* First check the primary name list */\n    in = get_nameindex(lp, varname, tryrowfirst);\n    if((in > 0) && !tryrowfirst)\n      in += lp->rows;\n    /* If we were unsuccessful, try the secondary name list */\n    else if(in < 0) {\n      in = get_nameindex(lp, varname, (MYBOOL) !tryrowfirst);\n      if((in > 0) && tryrowfirst)\n        in += lp->rows;\n    }\n  }\n  /* If not, see if we can match the standard name mask */\n\n  if(in == -1) {\n    if(strncmp(varname, (tryrowfirst ? ROWNAMEMASK : COLNAMEMASK), 1) == 0) {\n      /* Fail if we did not successfully scan as a valid integer */\n      if((sscanf(varname + 1, \"%d\", &in) != 1) ||\n         (in < (tryrowfirst ? 0 : 1)) || (in > (tryrowfirst ? lp->rows : lp->columns)))\n        in = -1;\n    }\n    else if(strncmp(varname, (!tryrowfirst ? ROWNAMEMASK : COLNAMEMASK), 1) == 0) {\n      /* Fail if we did not successfully scan as a valid integer */\n      if((sscanf(varname + 1, \"%d\", &in) != 1) ||\n         (in < (tryrowfirst ? 0 : 1)) || (in > (tryrowfirst ? lp->rows : lp->columns)))\n        in = -1;\n    }\n  }\n  return( in );\n}\n#endif\n\nMYBOOL MPS_readBAS(lprec *lp, int typeMPS, char *filename, char *info)\n{\n  char   field1[BUFSIZ], field2[BUFSIZ], field3[BUFSIZ], field5[BUFSIZ],\n         line[BUFSIZ], tmp[BUFSIZ], *ptr;\n  double field4, field6;\n  int    ib, in, items, Lineno = 0;\n  MYBOOL ok;\n  FILE   *input = stdin;\n  int    (*scan_line)(lprec *lp, int section, char* line, char *field1, char *field2, char *field3,\n                      double *field4, char *field5, double *field6);\n\n  if((typeMPS & MPSFIXED) == MPSFIXED)\n    scan_line = scan_lineFIXED;\n  else if((typeMPS & MPSFREE) == MPSFREE)\n    scan_line = scan_lineFREE;\n  else {\n    report(lp, IMPORTANT, \"MPS_readBAS: unrecognized MPS line type.\\n\");\n    return(FALSE);\n  }\n\n  ok = (MYBOOL) ((filename != NULL) && ((input = fopen(filename,\"r\")) != NULL));\n  if(!ok)\n    return(ok);\n  default_basis(lp);\n\n  /* Let's initialize line to all zero's */\n  MEMCLEAR(line, BUFSIZ);\n  ok = FALSE;\n  while(fgets(line, BUFSIZ - 1, input)) {\n    Lineno++;\n\n    for(ptr = line; (*ptr) && (isspace((unsigned char) *ptr)); ptr++);\n\n    /* skip lines which start with \"*\", they are comment */\n    if((line[0] == '*') || (*ptr == 0) || (*ptr == '\\n') || (*ptr == '\\r')) {\n      report(lp, FULL, \"Comment on line %d: %s\", Lineno, line);\n      continue;\n    }\n\n    report(lp, FULL, \"Line %6d: %s\", Lineno, line);\n\n    /* first check for \"special\" lines: in our case only NAME and ENDATA,\n       ...this must start in the first position of line */\n    if(line[0] != ' ') {\n      sscanf(line, \"%s\", tmp);\n      if(strcmp(tmp, \"NAME\") == 0) {\n        if(info != NULL) {\n          *info = 0;\n          for(ptr = line + 4; (*ptr) && (isspace((unsigned char) *ptr)); ptr++);\n          in = (int) strlen(ptr);\n          while ((in > 0) && ((ptr[in - 1] == '\\r') || (ptr[in - 1] == '\\n') || isspace(ptr[in - 1])))\n            in--;\n          ptr[in] = 0;\n          strcpy(info, ptr);\n        }\n      }\n      else if(strcmp(tmp, \"ENDATA\") == 0) {\n        report(lp, FULL, \"Finished reading BAS file\\n\");\n        ok = TRUE;\n        break;\n      }\n      else { /* line does not start with space and does not match above */\n        report(lp, IMPORTANT, \"Unrecognized BAS line %d: %s\\n\", Lineno, line);\n        break;\n      }\n    }\n    else { /* normal line, process */\n      items = scan_line(lp, /* MPSRHS */ MPSBOUNDS, line, field1, field2, field3, &field4, field5, &field6);\n      if(items < 0){\n        report(lp, IMPORTANT, \"Syntax error on line %d: %s\\n\", Lineno, line);\n        break;\n      }\n      /* find first variable index value */\n      in = MPS_getnameidx(lp, field2, FALSE);\n#ifdef OldNameMatch\n      if(in < 0)\n        in = MPS_getnameidx(lp, field2, TRUE);\n      else\n        in += lp->rows;\n#endif\n      if(in < 0)\n        break;\n\n      /* check if we have the basic/non-basic variable format */\n      if(field1[0] == 'X') {\n        /* find second variable index value */\n        ib = in;\n        in = MPS_getnameidx(lp, field3, FALSE);\n#ifdef OldNameMatch\n        if(in < 0)\n          in = MPS_getnameidx(lp, field3, TRUE);\n        else\n          in += lp->rows;\n#endif\n        if(in < 0)\n          break;\n\n        lp->is_lower[in] = (MYBOOL) (field1[1] == 'L');\n        lp->is_basic[ib] = TRUE;\n      }\n      else\n        lp->is_lower[in] = (MYBOOL) (field1[0] == 'L');\n\n      lp->is_basic[in] = FALSE;\n\n    }\n  }\n  /* Update the basis index-to-variable array */\n  ib = 0;\n  items = lp->sum;\n  for(in = 1; in <= items; in++)\n    if(lp->is_basic[in]) {\n      ib++;\n      lp->var_basic[ib] = in;\n    }\n\n  fclose(input);\n  return( ok );\n}\n\nMYBOOL MPS_writeBAS(lprec *lp, int typeMPS, char *filename)\n{\n  int    ib, in;\n  MYBOOL ok;\n  char   name1[100], name2[100];\n  FILE   *output = stdout;\n  char * (*MPSname)(char *name0, char *name);\n  char name0[9];\n\n  /* Set name formatter */\n  if((typeMPS & MPSFIXED) == MPSFIXED)\n    MPSname = MPSnameFIXED;\n  else if((typeMPS & MPSFREE) == MPSFREE)\n    MPSname = MPSnameFREE;\n  else {\n    report(lp, IMPORTANT, \"MPS_writeBAS: unrecognized MPS name type.\\n\");\n    return(FALSE);\n  }\n\n  /* Open the file for writing */\n  ok = (MYBOOL) ((filename == NULL) || ((output = fopen(filename,\"w\")) != NULL));\n  if(!ok)\n    return(ok);\n  if(filename == NULL && lp->outstream != NULL)\n    output = lp->outstream;\n\n  fprintf(output, \"NAME          %s Rows %d Cols %d Iters %.0f\\n\",\n                  get_lp_name(lp), lp->rows, lp->columns, (double) get_total_iter(lp));\n\n  ib = lp->rows;\n  in = 0;\n  while ((ib < lp->sum) || (in < lp->sum)) {\n\n    /* Find next basic variable (skip slacks) */\n    ib++;\n    while((ib <= lp->sum) && !lp->is_basic[ib])\n      ib++;\n\n    /* Find next non-basic variable (skip lower-bounded structural variables) */\n    in++;\n    while((in <= lp->sum) && (lp->is_basic[in] ||\n                              ((in > lp->rows) && lp->is_lower[in])))\n      in++;\n\n    /* Check if we have a basic/non-basic variable pair */\n    if((ib <= lp->sum) && (in <= lp->sum)) {\n      strcpy(name1, MPSname(name0, (ib <= lp->rows ? get_row_name(lp, ib) :\n                                              get_col_name(lp, ib-lp->rows))));\n      strcpy(name2, MPSname(name0, (in <= lp->rows ? get_row_name(lp, in) :\n                                              get_col_name(lp, in-lp->rows))));\n      fprintf(output, \" %2s %s  %s\\n\", (lp->is_lower[in] ? \"XL\" : \"XU\"), name1, name2);\n    }\n\n    /* Otherwise just write the bound state of the non-basic variable */\n    else if(in <= lp->sum) {\n      strcpy(name1, MPSname(name0, (in <= lp->rows ? get_row_name(lp, in) :\n                                              get_col_name(lp, in-lp->rows))));\n      fprintf(output, \" %2s %s\\n\", (lp->is_lower[in] ? \"LL\" : \"UL\"), name1);\n    }\n\n  }\n  fprintf(output, \"ENDATA\\n\");\n\n  if(filename != NULL)\n    fclose(output);\n  return( ok );\n}\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_MPS.h",
    "content": "#ifndef HEADER_lp_MPS\n#define HEADER_lp_MPS\n\n#include \"lp_types.h\"\n\n/* For MPS file reading and writing */\n#define ROWNAMEMASK          \"R%d\"\n#define ROWNAMEMASK2         \"r%d\"\n#define COLNAMEMASK          \"C%d\"\n#define COLNAMEMASK2         \"c%d\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* Read an MPS file */\nMYBOOL MPS_readfile(lprec **newlp, char *filename, int typeMPS, int verbose);\nMYBOOL __WINAPI MPS_readhandle(lprec **newlp, FILE *filehandle, int typeMPS, int verbose);\n\n/* Write a MPS file to output */\nMYBOOL MPS_writefile(lprec *lp, int typeMPS, char *filename);\nMYBOOL MPS_writehandle(lprec *lp, int typeMPS, FILE *output);\n\n/* Read and write BAS files */\nMYBOOL MPS_readBAS(lprec *lp, int typeMPS, char *filename, char *info);\nMYBOOL MPS_writeBAS(lprec *lp, int typeMPS, char *filename);\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* HEADER_lp_MPS */\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_SOS.c",
    "content": "\n#include <string.h>\n#include \"commonlib.h\"\n#include \"lp_lib.h\"\n#include \"lp_report.h\"\n#include \"lp_SOS.h\"\n\n#ifdef FORTIFY\n# include \"lp_fortify.h\"\n#endif\n\n\n/*\n    Specially Ordered Set (SOS) routines - w/interface for lp_solve v5.0+\n   ----------------------------------------------------------------------------------\n    Author:        Kjell Eikland\n    Contact:       kjell.eikland@broadpark.no\n    License terms: LGPL.\n\n    Requires:      lp_lib.h\n\n    Release notes:\n    v1.0    1 September 2003    Complete package for SOS creation and use in a LP\n                                setting.  Notable feature of this implementation\n                                compared to those in other commercial systems is\n                                the generalization to SOS'es of \"unlimited\" order.\n    v1.1     8 December 2003    Added variable (index) deletion method.\n    v1.2    17 December 2004    Added bound change tracking functionality.\n    v1.3    18 September 2005   Added sparse SOS handling to speed up processing\n                                of large number of SOS'es.\n\n   ----------------------------------------------------------------------------------\n*/\n\n/* SOS group functions */\nSTATIC SOSgroup *create_SOSgroup(lprec *lp)\n{\n  SOSgroup *group;\n\n  group = (SOSgroup *) calloc(1, sizeof(*group));\n  group->lp = lp;\n  group->sos_alloc = SOS_START_SIZE;\n  group->sos_list = (SOSrec **) malloc((group->sos_alloc) * sizeof(*group->sos_list));\n  return(group);\n}\n\nSTATIC void resize_SOSgroup(SOSgroup *group)\n{\n  if(group->sos_count == group->sos_alloc) {\n    group->sos_alloc = (int)((double) group->sos_alloc*RESIZEFACTOR);\n    group->sos_list = (SOSrec **) realloc(group->sos_list,\n                                          (group->sos_alloc) * sizeof(*group->sos_list));\n  }\n}\n\nSTATIC int append_SOSgroup(SOSgroup *group, SOSrec *SOS)\n{\n  int    i, k;\n  SOSrec *SOSHold;\n\n  /* Check if we should resize */\n  resize_SOSgroup(group);\n\n  /* First append to the end of the list */\n  group->sos_list[group->sos_count] = SOS;\n  group->sos_count++;\n  i = abs(SOS->type);\n  SETMAX(group->maxorder, i);\n  if(i == 1)\n    group->sos1_count++;\n  k = group->sos_count;\n  SOS->tagorder = k;\n\n  /* Sort the SOS list by given priority */\n  for(i = group->sos_count-1; i > 0; i--) {\n    if(group->sos_list[i]->priority < group->sos_list[i-1]->priority) {\n      SOSHold = group->sos_list[i];\n      group->sos_list[i] = group->sos_list[i-1];\n      group->sos_list[i-1] = SOSHold;\n      if(SOSHold == SOS)\n        k = i; /* This is the index in the [1..> range */\n    }\n    else\n      break;\n  }\n  /* Return the list index of the new SOS */\n  return( k );\n}\n\n\nSTATIC int clean_SOSgroup(SOSgroup *group, MYBOOL forceupdatemap)\n{\n  int    i, n, k;\n  SOSrec *SOS;\n\n  if(group == NULL)\n    return( 0 );\n\n  /* Delete any SOS without members or trivial member count */\n  n = 0;\n  if(group->sos_alloc > 0) {\n    group->maxorder = 0;\n    for(i = group->sos_count; i > 0; i--) {\n      SOS = group->sos_list[i-1];\n      k = SOS->members[0];\n      if((k == 0) ||                              /* Empty */\n         ((k == abs(SOS->type)) && (k <= 2))) {   /* Trivial */\n        delete_SOSrec(group, i);\n        n++;\n      }\n      else {\n        SETMAX(group->maxorder, abs(SOS->type));\n      }\n    }\n    if((n > 0) || forceupdatemap)\n      SOS_member_updatemap(group);\n  }\n  return( n );\n}\n\n\nSTATIC void free_SOSgroup(SOSgroup **group)\n{\n  int i;\n\n  if((group == NULL) || (*group == NULL))\n    return;\n  if((*group)->sos_alloc > 0) {\n    for(i = 0; i < (*group)->sos_count; i++)\n      free_SOSrec((*group)->sos_list[i]);\n    FREE((*group)->sos_list);\n    FREE((*group)->membership);\n    FREE((*group)->memberpos);\n  }\n  FREE(*group);\n}\n\n/* SOS record functions */\nSTATIC SOSrec *create_SOSrec(SOSgroup *group, char *name, int type, int priority, int size, int *variables, REAL *weights)\n{\n  SOSrec *SOS;\n\n  SOS = (SOSrec *) calloc(1 , sizeof(*SOS));\n  SOS->parent = group;\n  SOS->type = type;\n  if(name == NULL)\n    SOS->name = NULL;\n  else\n  {\n    allocCHAR(group->lp, &SOS->name, (int) (strlen(name)+1), FALSE);\n    strcpy(SOS->name, name);\n  }\n  if(type < 0)\n    type = abs(type);\n  SOS->tagorder = 0;\n  SOS->size = 0;\n  SOS->priority = priority;\n  SOS->members = NULL;\n  SOS->weights = NULL;\n  SOS->membersSorted = NULL;\n  SOS->membersMapped = NULL;\n\n  if(size > 0)\n    size = append_SOSrec(SOS, size, variables, weights);\n\n  return(SOS);\n}\n\n\nSTATIC int append_SOSrec(SOSrec *SOS, int size, int *variables, REAL *weights)\n{\n  int   i, oldsize, newsize, nn;\n  lprec *lp = SOS->parent->lp;\n\n  oldsize = SOS->size;\n  newsize = oldsize + size;\n  nn = abs(SOS->type);\n\n /* Shift existing active data right (normally zero) */\n  if(SOS->members == NULL)\n    allocINT(lp, &SOS->members, 1+newsize+1+nn, TRUE);\n  else {\n    allocINT(lp, &SOS->members, 1+newsize+1+nn, AUTOMATIC);\n    for(i = newsize+1+nn; i > newsize+1; i--)\n    SOS->members[i] = SOS->members[i-size];\n  }\n  SOS->members[0] = newsize;\n  SOS->members[newsize+1] = nn;\n\n /* Copy the new data into the arrays */\n  if(SOS->weights == NULL)\n    allocREAL(lp, &SOS->weights, 1+newsize, TRUE);\n  else\n    allocREAL(lp, &SOS->weights, 1+newsize, AUTOMATIC);\n  for(i = oldsize+1; i <= newsize; i++) {\n    SOS->members[i] = variables[i-oldsize-1];\n    if((SOS->members[i] < 1) || (SOS->members[i] > lp->columns))\n      report(lp, IMPORTANT, \"append_SOS_rec: Invalid SOS variable definition for index %d\\n\", SOS->members[i]);\n    else {\n      if(SOS->isGUB)\n        lp->var_type[SOS->members[i]] |= ISGUB;\n      else\n        lp->var_type[SOS->members[i]] |= ISSOS;\n    }\n    if(weights == NULL)\n      SOS->weights[i] = i;  /* Follow standard, which is sorted ascending */\n    else\n      SOS->weights[i] = weights[i-oldsize-1];\n    SOS->weights[0] += SOS->weights[i];\n  }\n\n /* Sort the new paired lists ascending by weight (simple bubble sort) */\n  i = sortByREAL(SOS->members, SOS->weights, newsize, 1, TRUE);\n  if(i > 0)\n    report(lp, DETAILED, \"append_SOS_rec: Non-unique SOS variable weight for index %d\\n\", i);\n\n /* Define mapping arrays to search large SOS's faster */\n  allocINT(lp, &SOS->membersSorted, newsize, AUTOMATIC);\n  allocINT(lp, &SOS->membersMapped, newsize, AUTOMATIC);\n  for(i = oldsize+1; i <= newsize; i++) {\n    SOS->membersSorted[i - 1] = SOS->members[i];\n    SOS->membersMapped[i - 1] = i;\n  }\n  sortByINT(SOS->membersMapped, SOS->membersSorted, newsize, 0, TRUE);\n\n /* Confirm the new size */\n  SOS->size = newsize;\n\n  return(newsize);\n\n}\n\nSTATIC int make_SOSchain(lprec *lp, MYBOOL forceresort)\n{\n  int      i, j, k, n;\n  MYBOOL   *hold = NULL;\n  REAL     *order, sum, weight;\n  SOSgroup *group = lp->SOS;\n\n  /* PART A: Resort individual SOS member lists, if specified */\n  if(forceresort)\n    SOS_member_sortlist(group, 0);\n\n  /* PART B: Tally SOS variables and create master SOS variable list */\n  n = 0;\n  for(i = 0; i < group->sos_count; i++)\n    n += group->sos_list[i]->size;\n  lp->sos_vars = n;\n  if(lp->sos_vars > 0) /* Prevent memory loss in case of multiple solves */\n    FREE(lp->sos_priority);\n  allocINT(lp, &lp->sos_priority, n, FALSE);\n  allocREAL(lp, &order, n, FALSE);\n\n  /* Move variable data to the master SOS list and sort by ascending weight */\n  n = 0;\n  sum = 0;\n  for(i = 0; i < group->sos_count; i++) {\n    for(j = 1; j <= group->sos_list[i]->size; j++) {\n      lp->sos_priority[n] = group->sos_list[i]->members[j];\n      weight = group->sos_list[i]->weights[j];\n      sum += weight;\n      order[n] = sum;\n      n++;\n    }\n  }\n  hpsortex(order, n, 0, sizeof(*order), FALSE, compareREAL, lp->sos_priority);\n  FREE(order);\n\n  /* Remove duplicate SOS variables */\n  allocMYBOOL(lp, &hold, lp->columns+1, TRUE);\n  k = 0;\n  for(i = 0; i < n; i++) {\n    j = lp->sos_priority[i];\n    if(!hold[j]) {\n      hold[j] = TRUE;\n      if(k < i)\n        lp->sos_priority[k] = j;\n      k++;\n    }\n  }\n  FREE(hold);\n\n  /* Adjust the size of the master variable list, if necessary */\n  if(k < lp->sos_vars) {\n    allocINT(lp, &lp->sos_priority, k, AUTOMATIC);\n    lp->sos_vars = k;\n  }\n\n  return( k );\n\n}\n\n\nSTATIC MYBOOL delete_SOSrec(SOSgroup *group, int sosindex)\n{\n#ifdef Paranoia\n  if((sosindex <= 0) || (sosindex > group->sos_count)) {\n    report(group->lp, IMPORTANT, \"delete_SOSrec: Invalid SOS index %d\\n\", sosindex);\n    return(FALSE);\n  }\n#endif\n\n  /* Delete and free the SOS record */\n  if(abs(SOS_get_type(group, sosindex)) == 1)\n    group->sos1_count--;\n  free_SOSrec(group->sos_list[sosindex-1]);\n  while(sosindex < group->sos_count) {\n    group->sos_list[sosindex-1] = group->sos_list[sosindex];\n    sosindex++;\n  }\n  group->sos_count--;\n\n  /* Update maxorder */\n  group->maxorder = 0;\n  for(sosindex = 0; sosindex < group->sos_count; sosindex++) {\n    SETMAX(group->maxorder, abs(group->sos_list[sosindex]->type));\n  }\n\n  return(TRUE);\n}\n\n\nSTATIC void free_SOSrec(SOSrec *SOS)\n{\n  if(SOS->name != NULL)\n    FREE(SOS->name);\n  if(SOS->size > 0) {\n    FREE(SOS->members);\n    FREE(SOS->weights);\n    FREE(SOS->membersSorted);\n    FREE(SOS->membersMapped);\n  }\n  FREE(SOS);\n}\n\n\nSTATIC MYBOOL SOS_member_sortlist(SOSgroup *group, int sosindex)\n/* Routine to (re-)sort SOS member arrays for faster access to large SOSes */\n{\n  int    i, n;\n  int    *list;\n  lprec  *lp = group->lp;\n  SOSrec *SOS;\n\n#ifdef Paranoia\n  if((sosindex < 0) || (sosindex > group->sos_count)) {\n    report(lp, IMPORTANT, \"SOS_member_sortlist: Invalid SOS index %d\\n\", sosindex);\n    return(FALSE);\n  }\n#endif\n\n  if((sosindex == 0) && (group->sos_count == 1))\n    sosindex = 1;\n\n  if(sosindex == 0) {\n    for(i = 1; i <= group->sos_count; i++) {\n      if(!SOS_member_sortlist(group, i))\n        return(FALSE);\n    }\n  }\n  else {\n    SOS = group->sos_list[sosindex-1];\n    list = SOS->members;\n    n = list[0];\n    /* Make sure that the arrays are properly allocated and sized */\n    if(n != group->sos_list[sosindex-1]->size) {\n      allocINT(lp, &SOS->membersSorted, n, AUTOMATIC);\n      allocINT(lp, &SOS->membersMapped, n, AUTOMATIC);\n      group->sos_list[sosindex-1]->size = n;\n    }\n    /* Reload the arrays and do the sorting */\n    for(i = 1; i <= n; i++) {\n      SOS->membersSorted[i - 1] = list[i];\n      SOS->membersMapped[i - 1] = i;\n    }\n    sortByINT(SOS->membersMapped, SOS->membersSorted, n, 0, TRUE);\n  }\n  return( TRUE );\n}\n\nSTATIC int SOS_member_updatemap(SOSgroup *group)\n{\n  int      i, j, k, n, nvars = 0,\n           *list, *tally = NULL;\n  SOSrec   *rec;\n  lprec    *lp = group->lp;\n\n  /* (Re)-initialize usage arrays */\n  allocINT(lp, &group->memberpos, lp->columns+1, AUTOMATIC);\n  allocINT(lp, &tally, lp->columns+1, TRUE);\n\n  /* Get each variable's SOS membership count */\n  for(i = 0; i < group->sos_count; i++) {\n    rec = group->sos_list[i];\n    n = rec->size;\n    list = rec->members;\n    for(j = 1; j <= n; j++) {\n      k = list[j];\n#ifdef Paranoia\n      if((k < 1) || (k > lp->columns))\n        report(lp, SEVERE, \"SOS_member_updatemap: Member %j of SOS number %d is out of column range (%d)\\n\",\n                            j, i+1, k);\n#endif\n      tally[k]++;\n    }\n\n  }\n\n  /* Compute pointer into column-sorted array */\n  group->memberpos[0] = 0;\n  for(i = 1; i <= lp->columns; i++) {\n    n = tally[i];\n    if(n > 0)\n      nvars++;\n    group->memberpos[i] = group->memberpos[i-1] + n;\n  }\n  n = group->memberpos[lp->columns];\n  MEMCOPY(tally+1, group->memberpos, lp->columns);\n\n  /* Load the column-sorted SOS indeces / pointers */\n  allocINT(lp, &group->membership, n+1, AUTOMATIC);\n  for(i = 0; i < group->sos_count; i++) {\n    rec = group->sos_list[i];\n    n = rec->size;\n    list = rec->members;\n    for(j = 1; j <= n; j++) {\n      k = tally[list[j]]++;\n#ifdef Paranoia\n      if(k > group->memberpos[lp->columns])\n        report(lp, SEVERE, \"SOS_member_updatemap: Member mapping for variable %j of SOS number %d is invalid\\n\",\n                            list[j], i+1);\n#endif\n      group->membership[k] = i+1;\n    }\n  }\n  FREE(tally);\n\n  return( nvars );\n}\n\n\nSTATIC MYBOOL SOS_shift_col(SOSgroup *group, int sosindex, int column, int delta, LLrec *usedmap, MYBOOL forceresort)\n/* Routine to adjust SOS indeces for variable insertions or deletions;\n   Note: SOS_shift_col must be called before make_SOSchain! */\n{\n  int    i, ii, n, nn, nr;\n  int    changed;\n  int    *list;\n  REAL   *weights;\n\n#ifdef Paranoia\n  lprec  *lp = group->lp;\n\n  if((sosindex < 0) || (sosindex > group->sos_count)) {\n    report(lp, IMPORTANT, \"SOS_shift_col: Invalid SOS index %d\\n\", sosindex);\n    return(FALSE);\n  }\n  else if((column < 1) || (delta == 0)) {\n    report(lp, IMPORTANT, \"SOS_shift_col: Invalid column %d specified with delta %d\\n\",\n                          column, delta);\n    return(FALSE);\n  }\n#endif\n\n  if((sosindex == 0) && (group->sos_count == 1))\n    sosindex = 1;\n\n  if(sosindex == 0) {\n    for(i = 1; i <= group->sos_count; i++) {\n      if(!SOS_shift_col(group, i, column, delta, usedmap, forceresort))\n        return(FALSE);\n    }\n  }\n  else {\n    list = group->sos_list[sosindex-1]->members;\n    weights = group->sos_list[sosindex-1]->weights;\n    n = list[0];\n    nn = list[n+1];\n\n    /* Case where variable indeces are to be incremented */\n    if(delta > 0) {\n      for(i = 1; i <= n; i++) {\n        if(list[i] >= column)\n          list[i] += delta;\n      }\n    }\n    /* Case where variables are to be deleted/indeces decremented */\n    else {\n      changed = 0;\n      if(usedmap != NULL) {\n        int *newidx = NULL;\n        /* Defer creation of index mapper until we are sure that a\n           member of this SOS is actually targeted for deletion */\n        if(newidx == NULL) {\n          allocINT(group->lp, &newidx, group->lp->columns+1, TRUE);\n          for(i = firstActiveLink(usedmap), ii = 1; i != 0;\n              i = nextActiveLink(usedmap, i), ii++)\n            newidx[i] = ii;\n        }\n        for(i = 1, ii = 0; i <= n; i++) {\n          nr = list[i];\n          /* Check if this SOS variable should be deleted */\n          if(!isActiveLink(usedmap, nr))\n            continue;\n\n          /* If the index is \"high\" then make adjustment and shift */\n          changed++;\n          ii++;\n          list[ii] = newidx[nr];\n          weights[ii] = weights[i];\n        }\n        FREE(newidx);\n      }\n      else\n        for(i = 1, ii = 0; i <= n; i++) {\n          nr = list[i];\n          /* Check if this SOS variable should be deleted */\n          if((nr >= column) && (nr < column-delta))\n            continue;\n          /* If the index is \"high\" then decrement */\n          if(nr > column) {\n            changed++;\n            nr += delta;\n          }\n          ii++;\n          list[ii] = nr;\n          weights[ii] = weights[i];\n        }\n      /* Update the SOS length / type indicators */\n      if(ii < n) {\n        list[0] = ii;\n        list[ii+1] = nn;\n      }\n\n     /* Update mapping arrays to search large SOS's faster */\n      if(forceresort && ((ii < n) || (changed > 0)))\n        SOS_member_sortlist(group, sosindex);\n    }\n\n  }\n  return(TRUE);\n\n}\n\nint SOS_member_count(SOSgroup *group, int sosindex)\n{\n  SOSrec *SOS;\n\n#ifdef Paranoia\n  if((sosindex < 0) || (sosindex > group->sos_count)) {\n    report(group->lp, IMPORTANT, \"SOS_member_count: Invalid SOS index %d\\n\", sosindex);\n    return( -1 );\n  }\n#endif\n  SOS = group->sos_list[sosindex-1];\n  return( SOS->members[0] );\n}\n\nint SOS_member_delete(SOSgroup *group, int sosindex, int member)\n{\n  int   *list, i, i2, k, n, nn = 0;\n  SOSrec *SOS;\n  lprec  *lp = group->lp;\n\n#ifdef Paranoia\n  if((sosindex < 0) || (sosindex > group->sos_count)) {\n    report(group->lp, IMPORTANT, \"SOS_member_delete: Invalid SOS index %d\\n\", sosindex);\n    return( -1 );\n  }\n#endif\n\n  if(sosindex == 0) {\n    for(i = group->memberpos[member-1]; i < group->memberpos[member]; i++) {\n      k = group->membership[i];\n      n = SOS_member_delete(group, k, member);\n      if(n >= 0)\n        nn += n;\n      else\n        return( n );\n    }\n    /* We must update the mapper */\n    k = group->memberpos[member];\n    i = group->memberpos[member-1];\n    n = group->memberpos[lp->columns] - k;\n    if(n > 0)\n      MEMCOPY(group->membership + i, group->membership + k, n);\n    for(i = member; i <= lp->columns; i++)\n      group->memberpos[i] = group->memberpos[i-1];\n  }\n  else {\n    SOS = group->sos_list[sosindex-1];\n    list = SOS->members;\n    n = list[0];\n\n    /* Find the offset of the member */\n    i = 1;\n    while((i <= n) && (abs(list[i]) != member))\n      i++;\n    if(i > n)\n      return( -1 );\n    nn++;\n\n    /* Shift remaining members *and* the active count one position left */\n    while(i <= n) {\n      list[i] = list[i+1];\n      i++;\n    }\n    list[0]--;\n    SOS->size--;\n\n    /* Do the same with the active list one position left */\n    i = n + 1;\n    i2 = i + list[n];\n    k = i + 1;\n    while(i < i2) {\n      if(abs(list[k]) == member)\n        k++;\n      list[i] = list[k];\n      i++;\n      k++;\n    }\n  }\n\n  return( nn );\n}\n\nint SOS_get_type(SOSgroup *group, int sosindex)\n{\n#ifdef Paranoia\n  if((sosindex < 1) || (sosindex > group->sos_count)) {\n    report(group->lp, IMPORTANT, \"SOS_get_type: Invalid SOS index %d\\n\", sosindex);\n    return(FALSE);\n  }\n#endif\n\n  return(group->sos_list[sosindex-1]->type);\n}\n\n\nint SOS_infeasible(SOSgroup *group, int sosindex)\n{\n  int    i, n, nn, varnr, failindex, *list;\n  lprec  *lp = group->lp;\n\n#ifdef Paranoia\n  if((sosindex < 0) || (sosindex > group->sos_count)) {\n    report(lp, IMPORTANT, \"SOS_infeasible: Invalid SOS index %d\\n\", sosindex);\n    return(FALSE);\n  }\n#endif\n\n  if(sosindex == 0 && group->sos_count == 1)\n    sosindex = 1;\n\n  failindex = 0;\n  if(sosindex == 0) {\n    for(i = 1; i <= group->sos_count; i++) {\n      failindex = SOS_infeasible(group, i);\n      if(failindex > 0) break;\n    }\n  }\n  else {\n    list = group->sos_list[sosindex-1]->members;\n    n = list[0];\n    nn = list[n+1];\n   /* Find index of next lower-bounded variable */\n    for(i = 1; i <= n; i++) {\n      varnr = abs(list[i]);\n      if((lp->orig_lowbo[lp->rows + varnr] > 0) &&\n         !((lp->sc_vars > 0) && is_semicont(lp, varnr)))\n        break;\n    }\n\n   /* Find if there is another lower-bounded variable beyond the type window */\n    i = i+nn;\n    while(i <= n) {\n      varnr = abs(list[i]);\n      if((lp->orig_lowbo[lp->rows + varnr] > 0) &&\n         !((lp->sc_vars > 0) && is_semicont(lp, varnr)))\n        break;\n      i++;\n    }\n    if(i <= n)\n      failindex = abs(list[i]);\n  }\n  return(failindex);\n}\n\n\nint SOS_member_index(SOSgroup *group, int sosindex, int member)\n{\n  int    n;\n  SOSrec *SOS;\n\n  SOS = group->sos_list[sosindex-1];\n  n = SOS->members[0];\n\n  n = searchFor(member, SOS->membersSorted, n, 0, FALSE);\n  if(n >= 0)\n    n = SOS->membersMapped[n];\n\n  return(n);\n}\n\n\nint SOS_memberships(SOSgroup *group, int varnr)\n{\n  int   i, n = 0;\n  lprec *lp;\n\n  /* Check if there is anything to do */\n  if((group == NULL) || (SOS_count(lp = group->lp) == 0))\n    return( n );\n\n#ifdef Paranoia\n  if((varnr < 0) || (varnr > lp->columns)) {\n    report(lp, IMPORTANT, \"SOS_memberships: Invalid variable index %d given\\n\", varnr);\n    return( n );\n  }\n#endif\n\n  if(varnr == 0) {\n    for(i = 1; i <= lp->columns; i++)\n      if(group->memberpos[i] > group->memberpos[i-1])\n        n++;\n  }\n  else\n    n = group->memberpos[varnr] - group->memberpos[varnr-1];\n\n  return( n );\n}\n\n\nint SOS_is_member(SOSgroup *group, int sosindex, int column)\n{\n  int    i, n = FALSE, *list;\n  lprec  *lp;\n\n  if(group == NULL)\n    return( FALSE );\n  lp = group->lp;\n\n#ifdef Paranoia\n  if((sosindex < 0) || (sosindex > group->sos_count)) {\n    report(lp, IMPORTANT, \"SOS_is_member: Invalid SOS index %d\\n\", sosindex);\n    return(n);\n  }\n#endif\n\n  if(sosindex == 0) {\n    if(lp->var_type[column] & (ISSOS | ISGUB))\n      n = (MYBOOL) (SOS_memberships(group, column) > 0);\n  }\n  else if(lp->var_type[column] & (ISSOS | ISGUB)) {\n\n   /* Search for the variable */\n    i = SOS_member_index(group, sosindex, column);\n\n   /* Signal active status if found, otherwise return FALSE */\n    if(i > 0) {\n      list = group->sos_list[sosindex-1]->members;\n      if(list[i] < 0)\n        n = -TRUE;\n      else\n      n = TRUE;\n    }\n  }\n  return(n);\n}\n\n\nMYBOOL SOS_is_member_of_type(SOSgroup *group, int column, int sostype)\n{\n  int i, k, n;\n\n  if(group != NULL)\n  for(i = group->memberpos[column-1]; i < group->memberpos[column]; i++) {\n    k = group->membership[i];\n    n = SOS_get_type(group, k);\n    if(((n == sostype) ||\n        ((sostype == SOSn) && (n > 2))) && SOS_is_member(group, k, column))\n      return(TRUE);\n  }\n  return(FALSE);\n}\n\n\nMYBOOL SOS_set_GUB(SOSgroup *group, int sosindex, MYBOOL state)\n{\n  int i;\n\n#ifdef Paranoia\n  if((sosindex < 0) || (sosindex > group->sos_count)) {\n    report(group->lp, IMPORTANT, \"SOS_set_GUB: Invalid SOS index %d\\n\", sosindex);\n    return(FALSE);\n  }\n#endif\n  if((sosindex == 0) && (group->sos_count == 1))\n    sosindex = 1;\n\n  if(sosindex == 0) {\n    for(i = 1; i <= group->sos_count; i++)\n      SOS_set_GUB(group, i, state);\n  }\n  else\n    group->sos_list[sosindex-1]->isGUB = state;\n  return(TRUE);\n}\n\n\nMYBOOL SOS_is_GUB(SOSgroup *group, int sosindex)\n{\n  int    i;\n\n#ifdef Paranoia\n  if((sosindex < 0) || (sosindex > group->sos_count)) {\n    report(group->lp, IMPORTANT, \"SOS_is_GUB: Invalid SOS index %d\\n\", sosindex);\n    return(FALSE);\n  }\n#endif\n\n  if((sosindex == 0) && (group->sos_count == 1))\n    sosindex = 1;\n\n  if(sosindex == 0) {\n    for(i = 1; i <= group->sos_count; i++) {\n      if(SOS_is_GUB(group, i))\n        return(TRUE);\n    }\n    return(FALSE);\n  }\n  else\n    return( group->sos_list[sosindex-1]->isGUB );\n}\n\n\nMYBOOL SOS_is_marked(SOSgroup *group, int sosindex, int column)\n{\n  int    i, k, n, *list;\n  lprec  *lp;\n\n  if(group == NULL)\n    return( FALSE );\n  lp = group->lp;\n\n#ifdef Paranoia\n  if((sosindex < 0) || (sosindex > group->sos_count)) {\n    report(lp, IMPORTANT, \"SOS_is_marked: Invalid SOS index %d\\n\", sosindex);\n    return(FALSE);\n  }\n#endif\n\n  if(!(lp->var_type[column] & (ISSOS | ISGUB)))\n    return(FALSE);\n\n  if(sosindex == 0) {\n    for(i = group->memberpos[column-1]; i < group->memberpos[column]; i++) {\n      k = group->membership[i];\n      n = SOS_is_marked(group, k, column);\n      if(n)\n        return(TRUE);\n    }\n  }\n  else  {\n    list = group->sos_list[sosindex-1]->members;\n    n = list[0];\n\n   /* Search for the variable (normally always faster to do linear search here) */\n    column = -column;\n    for(i = 1; i <= n; i++)\n      if(list[i] == column)\n        return(TRUE);\n  }\n  return(FALSE);\n}\n\n\nMYBOOL SOS_is_active(SOSgroup *group, int sosindex, int column)\n{\n  int    i, n, nn, *list;\n  lprec  *lp = group->lp;\n\n#ifdef Paranoia\n  if((sosindex < 0) || (sosindex > group->sos_count)) {\n    report(lp, IMPORTANT, \"SOS_is_active: Invalid SOS index %d\\n\", sosindex);\n    return(FALSE);\n  }\n#endif\n\n  if(!(lp->var_type[column] & (ISSOS | ISGUB)))\n    return(FALSE);\n\n  if(sosindex == 0) {\n    for(i = group->memberpos[column-1]; i < group->memberpos[column]; i++) {\n      nn = group->membership[i];\n      n = SOS_is_active(group, nn, column);\n      if(n)\n        return(TRUE);\n    }\n  }\n  else {\n\n    list = group->sos_list[sosindex-1]->members;\n    n = list[0]+1;\n    nn = list[n];\n\n    /* Scan the active (non-zero) SOS index list */\n    for(i = 1; (i <= nn) && (list[n+i] != 0); i++)\n      if(list[n+i] == column)\n        return(TRUE);\n  }\n  return(FALSE);\n}\n\n\nMYBOOL SOS_is_full(SOSgroup *group, int sosindex, int column, MYBOOL activeonly)\n{\n  int    i, nn, n, *list;\n  lprec  *lp = group->lp;\n\n#ifdef Paranoia\n  if((sosindex < 0) || (sosindex > group->sos_count)) {\n    report(lp, IMPORTANT, \"SOS_is_full: Invalid SOS index %d\\n\", sosindex);\n    return(FALSE);\n  }\n#endif\n\n  if(!(lp->var_type[column] & (ISSOS | ISGUB)))\n    return(FALSE);\n\n  if(sosindex == 0) {\n    for(i = group->memberpos[column-1]; i < group->memberpos[column]; i++) {\n      nn = group->membership[i];\n      if(SOS_is_full(group, nn, column, activeonly))\n        return(TRUE);\n    }\n  }\n  else if(SOS_is_member(group, sosindex, column)) {\n\n    list = group->sos_list[sosindex-1]->members;\n    n = list[0]+1;\n    nn = list[n];\n\n   /* Info: Last item in the active list is non-zero if the current SOS is full */\n    if(list[n+nn] != 0)\n      return(TRUE);\n\n    if(!activeonly) {\n      /* Spool to last active variable */\n      for(i = nn-1; (i > 0) && (list[n+i] == 0); i--);\n      /* Having found it, check if subsequent variables are set (via bounds) as inactive */\n      if(i > 0) {\n        nn -= i;  /* Compute unused active slots */\n        i = SOS_member_index(group, sosindex, list[n+i]);\n        for(; (nn > 0) && (list[i] < 0); i++, nn--);\n        if(nn == 0)\n          return(TRUE);\n      }\n    }\n  }\n\n  return(FALSE);\n}\n\n\nMYBOOL SOS_can_activate(SOSgroup *group, int sosindex, int column)\n{\n  int    i, n, nn, nz, *list;\n  lprec  *lp;\n\n  if(group == NULL)\n    return( FALSE );\n  lp = group->lp;\n\n#ifdef Paranoia\n  if((sosindex < 0) || (sosindex > group->sos_count)) {\n    report(lp, IMPORTANT, \"SOS_can_activate: Invalid SOS index %d\\n\", sosindex);\n    return(FALSE);\n  }\n#endif\n\n  if(!(lp->var_type[column] & (ISSOS | ISGUB)))\n    return(FALSE);\n\n  if(sosindex == 0) {\n    for(i = group->memberpos[column-1]; i < group->memberpos[column]; i++) {\n      nn = group->membership[i];\n      n = SOS_can_activate(group, nn, column);\n      if(n == FALSE)\n        return(FALSE);\n    }\n  }\n  else if(SOS_is_member(group, sosindex, column)) {\n\n    list = group->sos_list[sosindex-1]->members;\n    n = list[0]+1;\n    nn = list[n];\n\n#if 0\n    /* Accept if the SOS is empty */\n    if(list[n+1] == 0)\n      return(TRUE);\n#endif\n\n    /* Cannot activate a variable if the SOS is full */\n    if(list[n+nn] != 0)\n      return(FALSE);\n\n    /* Check if there are variables quasi-active via non-zero lower bounds */\n    nz = 0;\n    for(i = 1; i < n; i++)\n      if(lp->bb_bounds->lowbo[lp->rows+abs(list[i])] > 0) {\n        nz++;\n        /* Reject outright if selected column has a non-zero lower bound */\n        if(list[i] == column)\n          return(FALSE);\n      }\n#ifdef Paranoia\n    if(nz > nn)\n      report(lp, SEVERE, \"SOS_can_activate: Found too many non-zero member variables for SOS index %d\\n\", sosindex);\n#endif\n    for(i = 1; i <= nn; i++) {\n      if(list[n+i] == 0)\n        break;\n      if(lp->bb_bounds->lowbo[lp->rows+list[n+i]] == 0)\n        nz++;\n    }\n    if(nz == nn)\n      return(FALSE);\n\n    /* Accept if the SOS is empty */\n    if(list[n+1] == 0)\n      return(TRUE);\n\n    /* Check if we can set variable active in SOS2..SOSn\n      (must check left and right neighbours if one variable is already active) */\n    if(nn > 1) {\n\n     /* Find the variable that was last activated;\n       Also check that the candidate variable is not already active */\n      for(i = 1; i <= nn; i++) {\n        if(list[n+i] == 0)\n          break;\n        if(list[n+i] == column)\n          return(FALSE);\n      }\n      i--;\n      nn = list[n+i];\n\n      /* SOS accepts an additional variable; confirm neighbourness of candidate;\n         Search for the SOS set index of the last activated variable */\n      n = list[0];\n      for(i = 1; i <= n; i++)\n        if(abs(list[i]) == nn)\n          break;\n      if(i > n) {\n        report(lp, CRITICAL, \"SOS_can_activate: Internal index error at SOS %d\\n\", sosindex);\n        return(FALSE);\n      }\n\n      /* SOS accepts an additional variable; confirm neighbourness of candidate */\n\n      /* Check left neighbour */\n      if((i > 1) && (list[i-1] == column))\n        return(TRUE);\n      /* Check right neighbour */\n      if((i < n) && (list[i+1] == column))\n        return(TRUE);\n\n      /* It is not the right neighbour; return false */\n      return(FALSE);\n    }\n  }\n  return(TRUE);\n}\n\n\nMYBOOL SOS_set_marked(SOSgroup *group, int sosindex, int column, MYBOOL asactive)\n{\n  int    i, n, nn, *list;\n  lprec  *lp = group->lp;\n\n#ifdef Paranoia\n  if((sosindex < 0) || (sosindex > group->sos_count)) {\n    report(lp, IMPORTANT, \"SOS_set_marked: Invalid SOS index %d\\n\", sosindex);\n    return(FALSE);\n  }\n#endif\n\n  if(!(lp->var_type[column] & (ISSOS | ISGUB)))\n    return(FALSE);\n\n  if(sosindex == 0) {\n\n   /* Define an IBM-\"SOS3\" member variable temporarily as integer, if it is\n      not already a permanent integer; is reset in SOS_unmark */\n    if(asactive && !is_int(lp, column) && SOS_is_member_of_type(group, column, SOS3)) {\n      lp->var_type[column] |= ISSOSTEMPINT;\n      set_int(lp, column, TRUE);\n    }\n\n    nn = 0;\n    for(i = group->memberpos[column-1]; i < group->memberpos[column]; i++) {\n      n = group->membership[i];\n      if(SOS_set_marked(group, n, column, asactive))\n        nn++;\n    }\n    return((MYBOOL) (nn == group->sos_count));\n  }\n  else {\n    list = group->sos_list[sosindex-1]->members;\n    n = list[0]+1;\n    nn = list[n];\n\n   /* Search for the variable */\n    i = SOS_member_index(group, sosindex, column);\n\n   /* First mark active in the set member list as used */\n    if((i > 0) && (list[i] > 0))\n      list[i] *= -1;\n    else\n      return(TRUE);\n\n   /* Then move the variable to the live list */\n    if(asactive) {\n      for(i = 1; i <= nn; i++) {\n        if(list[n+i] == column)\n          return(FALSE);\n        else if(list[n+i] == 0) {\n          list[n+i] = column;\n          return(FALSE);\n        }\n      }\n    }\n    return(TRUE);\n  }\n}\n\n\nMYBOOL SOS_unmark(SOSgroup *group, int sosindex, int column)\n{\n  int    i, n, nn, *list;\n  MYBOOL isactive;\n  lprec  *lp = group->lp;\n\n#ifdef Paranoia\n  if((sosindex < 0) || (sosindex > group->sos_count)) {\n    report(lp, IMPORTANT, \"SOS_unmark: Invalid SOS index %d\\n\", sosindex);\n    return(FALSE);\n  }\n#endif\n\n  if(!(lp->var_type[column] & (ISSOS | ISGUB)))\n    return(FALSE);\n\n\n  if(sosindex == 0) {\n\n    /* Undefine a SOS3 member variable that has temporarily been set as integer */\n    if(lp->var_type[column] & ISSOSTEMPINT) {\n      lp->var_type[column] &= !ISSOSTEMPINT;\n      set_int(lp, column, FALSE);\n    }\n\n    nn = 0;\n    for(i = group->memberpos[column-1]; i < group->memberpos[column]; i++) {\n      n = group->membership[i];\n      if(SOS_unmark(group, n, column))\n        nn++;\n    }\n    return((MYBOOL) (nn == group->sos_count));\n  }\n  else {\n    list = group->sos_list[sosindex-1]->members;\n    n = list[0]+1;\n    nn = list[n];\n\n   /* Search for the variable */\n    i = SOS_member_index(group, sosindex, column);\n\n   /* Restore sign in main list */\n    if((i > 0) && (list[i] < 0))\n      list[i] *= -1;\n    else\n      return(TRUE);\n\n   /* Find the variable in the active list... */\n    isactive = SOS_is_active(group, sosindex, column);\n    if(isactive) {\n      for(i = 1; i <= nn; i++)\n        if(list[n+i] == column)\n          break;\n     /* ...shrink the list if found, otherwise return error */\n      if(i <= nn) {\n        for(; i<nn; i++)\n        list[n+i] = list[n+i+1];\n        list[n+nn] = 0;\n        return(TRUE);\n      }\n      return(FALSE);\n    }\n    else\n      return(TRUE);\n  }\n}\n\n\nint SOS_fix_unmarked(SOSgroup *group, int sosindex, int variable, REAL *bound, REAL value, MYBOOL isupper,\n                     int *diffcount, DeltaVrec *changelog)\n{\n  int    i, ii, count, n, nn, nLeft, nRight, *list;\n  lprec  *lp = group->lp;\n\n#ifdef Paranoia\n  if((sosindex < 0) || (sosindex > group->sos_count)) {\n    report(lp, IMPORTANT, \"SOS_fix_unmarked: Invalid SOS index %d\\n\", sosindex);\n    return(FALSE);\n  }\n#endif\n\n  count = 0;\n  if(sosindex == 0) {\n    for(i = group->memberpos[variable-1]; i < group->memberpos[variable]; i++) {\n      n = group->membership[i];\n      count += SOS_fix_unmarked(group, n, variable, bound, value, isupper, diffcount, changelog);\n    }\n  }\n  else {\n    list = group->sos_list[sosindex-1]->members;\n    n = list[0]+1;\n\n   /* Count the number of active and free SOS variables */\n    nn = list[n];\n    for(i = 1; i <= nn; i++) {\n      if(list[n+i] == 0)\n      break;\n    }\n    i--;\n    i = nn - i;  /* Establish the number of unused slots */\n\n   /* Determine the free SOS variable window */\n    if(i == nn) {\n      nLeft = 0;\n      nRight = SOS_member_index(group, sosindex, variable);\n    }\n    else {\n      nLeft  = SOS_member_index(group, sosindex, list[n+1]);\n      if(variable == list[n+1])\n        nRight = nLeft;\n      else\n        nRight = SOS_member_index(group, sosindex, variable);\n    }\n\n    nRight += i;  /* Loop (nRight+1)..n */\n\n   /* Fix variables outside of the free SOS variable window */\n    for(i = 1; i < n; i++)  {\n     /* Skip the SOS variable window */\n      if((i >= nLeft) && (i <= nRight))\n        continue;\n     /* Otherwise proceed to set bound */\n      ii = list[i];\n      if(ii > 0) {\n        ii += lp->rows;\n        if(bound[ii] != value) {\n         /* Verify that we don't violate original bounds */\n          if(isupper && (value < lp->orig_lowbo[ii]))\n            return(-ii);\n          else if(!isupper && (value > lp->orig_upbo[ii]))\n            return(-ii);\n         /* OK, set the new bound */\n          count++;\n          if(changelog == NULL)\n            bound[ii] = value;\n          else\n            modifyUndoLadder(changelog, ii, bound, value);\n\n        }\n        if((diffcount != NULL) && (lp->solution[ii] != value))\n          (*diffcount)++;\n      }\n    }\n  }\n  return(count);\n}\n\nint *SOS_get_candidates(SOSgroup *group, int sosindex, int column, MYBOOL excludetarget,\n                        REAL *upbound, REAL *lobound)\n{\n  int    i, ii, j, n, nn = 0, *list, *candidates = NULL;\n  lprec  *lp = group->lp;\n\n  if(group == NULL)\n    return( candidates );\n\n#ifdef Paranoia\n  if(sosindex > group->sos_count) {\n    report(lp, IMPORTANT, \"SOS_get_candidates: Invalid index %d\\n\", sosindex);\n    return( candidates );\n  }\n#endif\n\n  /* Determine SOS target(s); note that if \"sosindex\" is negative, only\n     the first non-empty SOS where \"column\" is a member is processed */\n  if(sosindex <= 0) {\n    i = 0;\n    ii = group->sos_count;\n  }\n  else {\n    i = sosindex - 1;\n    ii = sosindex;\n  }\n\n  /* Tally candidate usage */\n  allocINT(lp, &candidates, lp->columns+1, TRUE);\n  for(; i < ii; i++) {\n    if(!SOS_is_member(group, i+1, column))\n      continue;\n    list = group->sos_list[i]->members;\n    n = list[0];\n    while(n > 0) {\n      j = list[n];\n      if((j > 0) && (upbound[lp->rows+j] > 0)) {\n        if(lobound[lp->rows+j] > 0) {\n          report(lp, IMPORTANT, \"SOS_get_candidates: Invalid non-zero lower bound setting\\n\");\n          n = 0;\n          goto Finish;\n        }\n        if(candidates[j] == 0)\n          nn++;\n        candidates[j]++;\n      }\n      n--;\n    }\n    if((sosindex < 0) && (nn > 1))\n      break;\n  }\n\n  /* Condense the list into indeces */\n  n = 0;\n  for(i = 1; i <= lp->columns; i++) {\n    if((candidates[i] > 0) && (!excludetarget || (i != column))) {\n      n++;\n      candidates[n] = i;\n    }\n  }\n\n  /* Finalize */\nFinish:\n  candidates[0] = n;\n  if(n == 0)\n    FREE(candidates);\n\n  return( candidates);\n\n}\n\nint SOS_fix_list(SOSgroup *group, int sosindex, int variable, REAL *bound,\n                 int *varlist, MYBOOL isleft, DeltaVrec *changelog)\n{\n  int    i, ii, jj, count = 0;\n  REAL   value = 0;\n  lprec  *lp = group->lp;\n\n#ifdef Paranoia\n  if((sosindex < 0) || (sosindex > group->sos_count)) {\n    report(lp, IMPORTANT, \"SOS_fix_list: Invalid index %d\\n\", sosindex);\n    return(FALSE);\n  }\n#endif\n\n  if(sosindex == 0) {\n    for(i = group->memberpos[variable-1]; i < group->memberpos[variable]; i++) {\n      ii = group->membership[i];\n      count += SOS_fix_list(group, ii, variable, bound, varlist, isleft, changelog);\n    }\n  }\n  else {\n\n    /* Establish the number of unmarked variables in the left window\n       (note that \"variable\" should have been marked previously) */\n    ii = varlist[0] / 2;\n    if(isleft) {\n      i = 1;\n      if(isleft == AUTOMATIC)\n        ii = varlist[0];\n    }\n    else {\n      i = ii + 1;\n      ii = varlist[0];\n    }\n\n    /* Loop over members to fix values at the new bound (zero) */\n    while(i <= ii) {\n      if(SOS_is_member(group, sosindex, varlist[i])) {\n        jj = lp->rows + varlist[i];\n\n        /* Verify that we don't violate original bounds */\n        if(value < lp->orig_lowbo[jj])\n          return( -jj );\n        /* OK, set the new bound */\n        count++;\n        if(changelog == NULL)\n          bound[jj] = value;\n        else\n          modifyUndoLadder(changelog, jj, bound, value);\n      }\n      i++;\n    }\n\n  }\n  return( count );\n}\n\nint SOS_is_satisfied(SOSgroup *group, int sosindex, REAL *solution)\n/* Determine if the SOS is satisfied for the current solution vector;\n   The return code is in the range [-2..+2], depending on the type of\n   satisfaction.  Positive return value means too many non-zero values,\n   negative value means set incomplete:\n\n              -2: Set member count not full (SOS3)\n              -1: Set member count not full\n               0: Set is full (also returned if the SOS index is invalid)\n               1: Too many non-zero sequential variables\n               2: Set consistency error\n\n*/\n{\n  int    i, n, nn, count, *list;\n  int    type, status = 0;\n  lprec  *lp = group->lp;\n\n#ifdef Paranoia\n  if((sosindex < 0) || (sosindex > group->sos_count)) {\n    report(lp, IMPORTANT, \"SOS_is_satisfied: Invalid index %d\\n\", sosindex);\n    return( SOS_COMPLETE );\n  }\n#endif\n\n  if((sosindex == 0) && (group->sos_count == 1))\n    sosindex = 1;\n\n  if(sosindex == 0) {\n    for(i = 1; i <= group->sos_count; i++) {\n      status = SOS_is_satisfied(group, i, solution);\n      if((status != SOS_COMPLETE) && (status != SOS_INCOMPLETE))\n        break;\n    }\n  }\n  else {\n    type = SOS_get_type(group, sosindex);\n    list = group->sos_list[sosindex-1]->members;\n    n = list[0]+1;\n    nn = list[n];\n\n   /* Count the number of active SOS variables */\n    for(i = 1; i <= nn; i++) {\n      if(list[n+i] == 0)\n        break;\n    }\n    count = i-1;\n    if(count == nn)\n      status = SOS_COMPLETE;    /* Set is full    */\n    else\n      status = SOS_INCOMPLETE;  /* Set is partial */\n\n   /* Find index of the first active variable; fail if some are non-zero */\n    if(count > 0) {\n      nn = list[n+1];\n      for(i = 1; i < n; i++) {\n        if((abs(list[i]) == nn) || (solution[lp->rows + abs(list[i])] != 0))\n          break;\n      }\n      if(abs(list[i]) != nn)\n        status = SOS_INTERNALERROR;  /* Set consistency error (leading set variables are non-zero) */\n      else {\n       /* Scan active SOS variables until we find a non-zero value */\n        while(count > 0) {\n          if(solution[lp->rows + abs(list[i])] != 0)\n            break;\n          i++;\n          count--;\n        }\n       /* Scan active non-zero SOS variables; break at first non-zero (rest required to be zero) */\n        while(count > 0) {\n          if(solution[lp->rows + abs(list[i])] == 0)\n            break;\n          i++;\n          count--;\n        }\n        if(count > 0)\n          status = SOS_INTERNALERROR; /* Set consistency error (active set variables are zero) */\n      }\n    }\n    else {\n      i = 1;\n      /* There are no active variables; see if we have happened to find a valid header */\n      while((i < n) && (solution[lp->rows + abs(list[i])] == 0))\n        i++;\n      count = 0;\n      while((i < n) && (count <= nn) && (solution[lp->rows + abs(list[i])] != 0)) {\n        count++;\n        i++;\n      }\n      if(count > nn)\n        status = SOS_INFEASIBLE;   /* Too-many sequential non-zero variables */\n    }\n\n    /* Scan the trailing set of SOS variables; fail if some are non-zero */\n    if(status <= 0) {\n      n--;\n      while(i <= n) {\n        if(solution[lp->rows + abs(list[i])] != 0)\n          break;\n        i++;\n      }\n      if(i <= n)\n        status = SOS_INFEASIBLE;  /* Too-many sequential non-zero variables */\n\n      /* Code member deficiency for SOS3 separately */\n      else if((status == -1) && (type <= SOS3))\n        status = SOS3_INCOMPLETE;\n    }\n\n  }\n  return( status );\n}\n\nMYBOOL SOS_is_feasible(SOSgroup *group, int sosindex, REAL *solution)\n/* Determine if the SOS is feasible up to the current SOS variable */\n{\n  int    i, n, nn, *list;\n  MYBOOL status = TRUE;\n  lprec  *lp = group->lp;\n\n#ifdef Paranoia\n  if((sosindex < 0) || (sosindex > group->sos_count)) {\n    report(lp, IMPORTANT, \"SOS_is_feasible: Invalid SOS index %d\\n\", sosindex);\n    return( 0 );\n  }\n#endif\n\n  if((sosindex == 0) && (group->sos_count == 1))\n    sosindex = 1;\n\n  if(sosindex == 0) {\n    for(i = 1; status && (i <= group->sos_count); i++) {\n      status = SOS_is_feasible(group, i, solution);\n    }\n  }\n  else {\n    list = group->sos_list[sosindex-1]->members;\n    n = list[0]+1;\n    nn = list[n];\n    if(nn <= 2)\n      return(status);\n\n   /* Find if we have a gap in the non-zero solution values */\n    i = 1;\n    sosindex = 0;\n    while((i <= nn) && (list[n+i] != 0)) {\n      while((i <= nn) && (list[n+i] != 0) && (solution[lp->rows+list[n+i]] == 0))\n        i++;\n      if((i <= nn) && (list[n+i] != 0)) {\n        i++;  /* Step to next */\n        while((i <= nn) && (list[n+i] != 0) && (solution[lp->rows+list[n+i]] != 0))\n          i++;\n        sosindex++;\n      }\n      i++;    /* Step to next */\n    }\n    status = (MYBOOL) (sosindex <= 1);\n  }\n  return(status);\n}\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_SOS.h",
    "content": "#ifndef HEADER_lp_SOS\n#define HEADER_lp_SOS\n\n/* Specially Ordered Sets (SOS) prototypes and settings                      */\n/* ------------------------------------------------------------------------- */\n\n#include \"lp_types.h\"\n#include \"lp_utils.h\"\n#include \"lp_matrix.h\"\n\n\n/* SOS constraint defines                                                    */\n/* ------------------------------------------------------------------------- */\n#define SOS1                     1\n#define SOS2                     2\n#define SOS3                    -1\n#define SOSn                      MAXINT32\n#define SOS_START_SIZE          10  /* Start size of SOS_list array; realloced if needed */\n\n/* Define SOS_is_feasible() return values                                    */\n/* ------------------------------------------------------------------------- */\n#define SOS3_INCOMPLETE         -2\n#define SOS_INCOMPLETE          -1\n#define SOS_COMPLETE             0\n#define SOS_INFEASIBLE           1\n#define SOS_INTERNALERROR        2\n\n\ntypedef struct _SOSgroup SOSgroup;\n\ntypedef struct _SOSrec\n{\n  SOSgroup  *parent;\n  int       tagorder;\n  char      *name;\n  int       type;\n  MYBOOL    isGUB;\n  int       size;\n  int       priority;\n  int       *members;\n  REAL      *weights;\n  int       *membersSorted;\n  int       *membersMapped;\n} SOSrec;\n\n/* typedef */ struct _SOSgroup\n{\n  lprec     *lp;                /* Pointer to owner */\n  SOSrec    **sos_list;         /* Array of pointers to SOS lists */\n  int       sos_alloc;          /* Size allocated to specially ordered sets (SOS1, SOS2...) */\n  int       sos_count;          /* Number of specially ordered sets (SOS1, SOS2...) */\n  int       maxorder;           /* The highest-order SOS in the group */\n  int       sos1_count;         /* Number of the lowest order SOS in the group */\n  int       *membership;        /* Array of variable-sorted indeces to SOSes that the variable is member of */\n  int       *memberpos;         /* Starting positions of the each column's membership list */\n} /* SOSgroup */;\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* SOS storage structure */\nSTATIC SOSgroup *create_SOSgroup(lprec *lp);\nSTATIC void resize_SOSgroup(SOSgroup *group);\nSTATIC int append_SOSgroup(SOSgroup *group, SOSrec *SOS);\nSTATIC int clean_SOSgroup(SOSgroup *group, MYBOOL forceupdatemap);\nSTATIC void free_SOSgroup(SOSgroup **group);\n\nSTATIC SOSrec *create_SOSrec(SOSgroup *group, char *name, int type, int priority, int size, int *variables, REAL *weights);\nSTATIC MYBOOL delete_SOSrec(SOSgroup *group, int sosindex);\nSTATIC int append_SOSrec(SOSrec *SOS, int size, int *variables, REAL *weights);\nSTATIC void free_SOSrec(SOSrec *SOS);\n\n/* SOS utilities */\nSTATIC int make_SOSchain(lprec *lp, MYBOOL forceresort);\nSTATIC int SOS_member_updatemap(SOSgroup *group);\nSTATIC MYBOOL SOS_member_sortlist(SOSgroup *group, int sosindex);\nSTATIC MYBOOL SOS_shift_col(SOSgroup *group, int sosindex, int column, int delta, LLrec *usedmap, MYBOOL forceresort);\nint SOS_member_delete(SOSgroup *group, int sosindex, int member);\nint SOS_get_type(SOSgroup *group, int sosindex);\nint SOS_infeasible(SOSgroup *group, int sosindex);\nint SOS_member_index(SOSgroup *group, int sosindex, int member);\nint SOS_member_count(SOSgroup *group, int sosindex);\nint SOS_memberships(SOSgroup *group, int column);\nint *SOS_get_candidates(SOSgroup *group, int sosindex, int column, MYBOOL excludetarget, REAL *upbound, REAL *lobound);\nint SOS_is_member(SOSgroup *group, int sosindex, int column);\nMYBOOL SOS_is_member_of_type(SOSgroup *group, int column, int sostype);\nMYBOOL SOS_set_GUB(SOSgroup *group, int sosindex, MYBOOL state);\nMYBOOL SOS_is_GUB(SOSgroup *group, int sosindex);\nMYBOOL SOS_is_marked(SOSgroup *group, int sosindex, int column);\nMYBOOL SOS_is_active(SOSgroup *group, int sosindex, int column);\nMYBOOL SOS_is_full(SOSgroup *group, int sosindex, int column, MYBOOL activeonly);\nMYBOOL SOS_can_activate(SOSgroup *group, int sosindex, int column);\nMYBOOL SOS_set_marked(SOSgroup *group, int sosindex, int column, MYBOOL asactive);\nMYBOOL SOS_unmark(SOSgroup *group, int sosindex, int column);\nint SOS_fix_unmarked(SOSgroup *group, int sosindex, int variable, REAL *bound, REAL value,\n                     MYBOOL isupper, int *diffcount, DeltaVrec *changelog);\nint SOS_fix_list(SOSgroup *group, int sosindex, int variable, REAL *bound, \n                  int *varlist, MYBOOL isleft, DeltaVrec *changelog);\nint SOS_is_satisfied(SOSgroup *group, int sosindex, REAL *solution);\nMYBOOL SOS_is_feasible(SOSgroup *group, int sosindex, REAL *solution);\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* HEADER_lp_SOS */\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_bit.h",
    "content": "#include \"lp_types.h\"\r\n\r\n#if defined INLINE\r\n# define MYINLINE INLINE\r\n#else\r\n# define MYINLINE static\r\n#endif\r\n\r\nMYINLINE void set_biton(MYBOOL *bitarray, int item)\r\n{\r\n  bitarray[item / 8] |= (1 << (item % 8));\r\n}\r\n\r\nMYINLINE void set_bitoff(MYBOOL *bitarray, int item)\r\n{\r\n  bitarray[item / 8] &= ~(1 << (item % 8));\r\n}\r\n\r\nMYINLINE MYBOOL is_biton(MYBOOL *bitarray, int item)\r\n{\r\n  return( (MYBOOL) ((bitarray[item / 8] & (1 << (item % 8))) != 0) );\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_crash.c",
    "content": "\n/*\n   ----------------------------------------------------------------------------------\n   Crash management routines in lp_solve v5.0+\n   ----------------------------------------------------------------------------------\n    Author:        Kjell Eikland\n    Contact:       kjell.eikland@broadpark.no\n    License terms: LGPL.\n\n    Requires:      lp_lib.h, lp_utils.h, lp_matrix.h\n\n    Release notes:\n    v1.0.0  1 April   2004      First version.\n    v1.1.0  20 July 2004        Reworked with flexible matrix storage model.\n\n   ----------------------------------------------------------------------------------\n*/\n\n#include <string.h>\n\n#include \"commonlib.h\"\n#include \"lp_lib.h\"\n#include \"lp_scale.h\"\n#include \"lp_utils.h\"\n#include \"lp_report.h\"\n#include \"lp_matrix.h\"\n#include \"lp_crash.h\"\n\n#ifdef FORTIFY\n# include \"lp_fortify.h\"\n#endif\n\n\nMYBOOL crash_basis(lprec *lp)\n{\n  int     i;\n  MATrec  *mat = lp->matA;\n  MYBOOL  ok = TRUE;\n\n  /* Initialize basis indicators */\n  if(lp->basis_valid)\n    lp->var_basic[0] = FALSE;\n  else\n    default_basis(lp);\n\n  /* Set initial partial pricing blocks */\n  if(lp->rowblocks != NULL)\n    lp->rowblocks->blocknow = 1;\n  if(lp->colblocks != NULL)\n    lp->colblocks->blocknow = ((lp->crashmode == CRASH_NONE) || (lp->colblocks->blockcount == 1) ? 1 : 2);\n\n  /* Construct a basis that is in some measure the \"most feasible\" */\n  if((lp->crashmode == CRASH_MOSTFEASIBLE) && mat_validate(mat)) {\n    /* The logic here follows Maros */\n    LLrec   *rowLL = NULL, *colLL = NULL;\n    int     ii, rx, cx, ix, nz;\n    REAL    wx, tx, *rowMAX = NULL, *colMAX = NULL;\n    int     *rowNZ = NULL, *colNZ = NULL, *rowWT = NULL, *colWT = NULL;\n    REAL    *value;\n    int     *rownr, *colnr;\n\n    report(lp, NORMAL, \"crash_basis: 'Most feasible' basis crashing selected\\n\");\n\n    /* Tally row and column non-zero counts */\n    ok = allocINT(lp,  &rowNZ, lp->rows+1,     TRUE) &&\n         allocINT(lp,  &colNZ, lp->columns+1,  TRUE) &&\n         allocREAL(lp, &rowMAX, lp->rows+1,    FALSE) &&\n         allocREAL(lp, &colMAX, lp->columns+1, FALSE);\n    if(!ok)\n      goto Finish;\n\n    nz = mat_nonzeros(mat);\n    rownr = &COL_MAT_ROWNR(0);\n    colnr = &COL_MAT_COLNR(0);\n    value = &COL_MAT_VALUE(0);\n    for(i = 0; i < nz;\n        i++, rownr += matRowColStep, colnr += matRowColStep, value += matValueStep) {\n      rx = *rownr;\n      cx = *colnr;\n      wx = fabs(*value);\n      rowNZ[rx]++;\n      colNZ[cx]++;\n      if(i == 0) {\n        rowMAX[rx] = wx;\n        colMAX[cx] = wx;\n        colMAX[0]  = wx;\n      }\n      else {\n        SETMAX(rowMAX[rx], wx);\n        SETMAX(colMAX[cx], wx);\n        SETMAX(colMAX[0],  wx);\n      }\n    }\n    /* Reduce counts for small magnitude to preserve stability */\n    rownr = &COL_MAT_ROWNR(0);\n    colnr = &COL_MAT_COLNR(0);\n    value = &COL_MAT_VALUE(0);\n    for(i = 0; i < nz;\n        i++, rownr += matRowColStep, colnr += matRowColStep, value += matValueStep) {\n      rx = *rownr;\n      cx = *colnr;\n      wx = fabs(*value);\n#ifdef CRASH_SIMPLESCALE\n      if(wx < CRASH_THRESHOLD * colMAX[0]) {\n        rowNZ[rx]--;\n        colNZ[cx]--;\n      }\n#else\n      if(wx < CRASH_THRESHOLD * rowMAX[rx])\n        rowNZ[rx]--;\n      if(wx < CRASH_THRESHOLD * colMAX[cx])\n        colNZ[cx]--;\n#endif\n    }\n\n    /* Set up priority tables */\n    ok = allocINT(lp, &rowWT, lp->rows+1, TRUE);\n    createLink(lp->rows,    &rowLL, NULL);\n    ok &= (rowLL != NULL);\n    if(!ok)\n      goto Finish;\n    for(i = 1; i <= lp->rows; i++) {\n      if(get_constr_type(lp, i)==EQ)\n        ii = 3;\n      else if(lp->upbo[i] < lp->infinite)\n        ii = 2;\n      else if(fabs(lp->rhs[i]) < lp->infinite)\n        ii = 1;\n      else\n        ii = 0;\n      rowWT[i] = ii;\n      if(ii > 0)\n        appendLink(rowLL, i);\n    }\n    ok = allocINT(lp, &colWT, lp->columns+1, TRUE);\n    createLink(lp->columns, &colLL, NULL);\n    ok &= (colLL != NULL);\n    if(!ok)\n      goto Finish;\n    for(i = 1; i <= lp->columns; i++) {\n      ix = lp->rows+i;\n      if(is_unbounded(lp, i))\n        ii = 3;\n      else if(lp->upbo[ix] >= lp->infinite)\n        ii = 2;\n      else if(fabs(lp->upbo[ix]-lp->lowbo[ix]) > lp->epsmachine)\n        ii = 1;\n      else\n        ii = 0;\n      colWT[i] = ii;\n      if(ii > 0)\n        appendLink(colLL, i);\n    }\n\n    /* Loop over all basis variables */\n    for(i = 1; i <= lp->rows; i++) {\n\n      /* Select row */\n      rx = 0;\n      wx = -lp->infinite;\n      for(ii = firstActiveLink(rowLL); ii > 0; ii = nextActiveLink(rowLL, ii)) {\n        tx = rowWT[ii] - CRASH_SPACER*rowNZ[ii];\n        if(tx > wx) {\n          rx = ii;\n          wx = tx;\n        }\n      }\n      if(rx == 0)\n        break;\n      removeLink(rowLL, rx);\n\n      /* Select column */\n      cx = 0;\n      wx = -lp->infinite;\n      for(ii = mat->row_end[rx-1]; ii < mat->row_end[rx]; ii++) {\n\n        /* Update NZ column counts for row selected above */\n        tx = fabs(ROW_MAT_VALUE(ii));\n        ix = ROW_MAT_COLNR(ii);\n#ifdef CRASH_SIMPLESCALE\n        if(tx >= CRASH_THRESHOLD * colMAX[0])\n#else\n        if(tx >= CRASH_THRESHOLD * colMAX[ix])\n#endif\n          colNZ[ix]--;\n        if(!isActiveLink(colLL, ix) || (tx < CRASH_THRESHOLD * rowMAX[rx]))\n          continue;\n\n        /* Now do the test for best pivot */\n        tx = my_sign(lp->orig_obj[ix]) - my_sign(ROW_MAT_VALUE(ii));\n        tx = colWT[ix] + CRASH_WEIGHT*tx - CRASH_SPACER*colNZ[ix];\n        if(tx > wx) {\n          cx = ix;\n          wx = tx;\n        }\n      }\n      if(cx == 0)\n        break;\n      removeLink(colLL, cx);\n\n      /* Update row NZ counts */\n      ii = mat->col_end[cx-1];\n      rownr = &COL_MAT_ROWNR(ii);\n      value = &COL_MAT_VALUE(ii);\n      for(; ii < mat->col_end[cx];\n          ii++, rownr += matRowColStep, value += matValueStep) {\n        wx = fabs(*value);\n        ix = *rownr;\n#ifdef CRASH_SIMPLESCALE\n        if(wx >= CRASH_THRESHOLD * colMAX[0])\n#else\n        if(wx >= CRASH_THRESHOLD * rowMAX[ix])\n#endif\n          rowNZ[ix]--;\n      }\n\n      /* Set new basis variable */\n      set_basisvar(lp, rx, lp->rows+cx);\n    }\n\n    /* Clean up */\nFinish:\n    FREE(rowNZ);\n    FREE(colNZ);\n    FREE(rowMAX);\n    FREE(colMAX);\n    FREE(rowWT);\n    FREE(colWT);\n    freeLink(&rowLL);\n    freeLink(&colLL);\n  }\n\n  /* Construct a basis that is in some measure the \"least degenerate\" */\n  else if((lp->crashmode == CRASH_LEASTDEGENERATE) && mat_validate(mat)) {\n    /* The logic here follows Maros */\n    LLrec   *rowLL = NULL, *colLL = NULL;\n    int     ii, rx, cx, ix, nz, *merit = NULL;\n    REAL    *value, wx, hold, *rhs = NULL, *eta = NULL;\n    int     *rownr, *colnr;\n\n    report(lp, NORMAL, \"crash_basis: 'Least degenerate' basis crashing selected\\n\");\n\n    /* Create temporary arrays */\n    ok = allocINT(lp,  &merit, lp->columns + 1, FALSE) &&\n         allocREAL(lp, &eta, lp->rows + 1, FALSE) &&\n         allocREAL(lp, &rhs, lp->rows + 1, FALSE);\n    createLink(lp->columns, &colLL, NULL);\n    createLink(lp->rows, &rowLL, NULL);\n    ok &= (colLL != NULL) && (rowLL != NULL);\n    if(!ok)\n      goto FinishLD;\n    MEMCOPY(rhs, lp->orig_rhs, lp->rows + 1);\n    for(i = 1; i <= lp->columns; i++)\n      appendLink(colLL, i);\n    for(i = 1; i <= lp->rows; i++)\n      appendLink(rowLL, i);\n\n    /* Loop until we have found enough new bases */\n    while(colLL->count > 0) {\n\n      /* Tally non-zeros matching in RHS and each active column */\n      nz = mat_nonzeros(mat);\n      rownr = &COL_MAT_ROWNR(0);\n      colnr = &COL_MAT_COLNR(0);\n      ii = 0;\n      MEMCLEAR(merit, lp->columns + 1);\n      for(i = 0; i < nz;\n          i++, rownr += matRowColStep, colnr += matRowColStep) {\n        rx = *rownr;\n        cx = *colnr;\n        if(isActiveLink(colLL, cx) && (rhs[rx] != 0)) {\n          merit[cx]++;\n          ii++;\n        }\n      }\n      if(ii == 0)\n        break;\n\n      /* Find maximal match; break ties with column length */\n      i = firstActiveLink(colLL);\n      cx = i;\n      for(i = nextActiveLink(colLL, i); i != 0; i = nextActiveLink(colLL, i)) {\n        if(merit[i] >= merit[cx]) {\n          if((merit[i] > merit[cx]) || (mat_collength(mat, i) > mat_collength(mat, cx)))\n            cx = i;\n        }\n      }\n\n      /* Determine the best pivot row */\n      i = mat->col_end[cx-1];\n      nz = mat->col_end[cx];\n      rownr = &COL_MAT_ROWNR(i);\n      value = &COL_MAT_VALUE(i);\n      rx = 0;\n      wx = 0;\n      MEMCLEAR(eta, lp->rows + 1);\n      for(; i < nz;\n          i++, rownr += matRowColStep, value += matValueStep) {\n        ix = *rownr;\n        hold = *value;\n        eta[ix] = rhs[ix] / hold;\n        hold = fabs(hold);\n        if(isActiveLink(rowLL, ix) && (hold > wx)) {\n          wx = hold;\n          rx = ix;\n        }\n      }\n\n      /* Set new basis variable */\n      if(rx > 0) {\n\n        /* We have to update the rhs vector for the implied transformation\n          in order to be able to find the new RHS non-zero pattern */\n        for(i = 1; i <= lp->rows; i++)\n           rhs[i] -= wx * eta[i];\n        rhs[rx] = wx;\n\n        /* Do the exchange */\n        set_basisvar(lp, rx, lp->rows+cx);\n        removeLink(rowLL, rx);\n      }\n      removeLink(colLL, cx);\n\n    }\n\n    /* Clean up */\nFinishLD:\n    FREE(merit);\n    FREE(rhs);\n    freeLink(&rowLL);\n    freeLink(&colLL);\n\n  }\n  return( ok );\n}\n\n#if 0\nMYBOOL __WINAPI guess_basis(lprec *lp, REAL *guessvector, int *basisvector)\n{\n  MYBOOL status = FALSE;\n  REAL   *values = NULL, *violation = NULL,\n         *value, error, upB, loB, sortorder = 1.0;\n  int    i, n, *rownr, *colnr;\n  MATrec *mat = lp->matA;\n\n  if(!mat_validate(lp->matA))\n    return( status );\n\n  /* Create helper arrays */\n  if(!allocREAL(lp, &values, lp->sum+1, TRUE) ||\n     !allocREAL(lp, &violation, lp->sum+1, TRUE))\n    goto Finish;\n\n  /* Compute values of slack variables for given guess vector */\n  i = 0;\n  n = get_nonzeros(lp);\n  rownr = &COL_MAT_ROWNR(i);\n  colnr = &COL_MAT_COLNR(i);\n  value = &COL_MAT_VALUE(i);\n  for(; i < n; i++, rownr += matRowColStep, colnr += matRowColStep, value += matValueStep)\n    values[*rownr] += unscaled_mat(lp, my_chsign(is_chsign(lp, *rownr), *value), *rownr, *colnr) *\n                      guessvector[*colnr];\n  MEMMOVE(values+lp->rows+1, guessvector+1, lp->columns);\n\n  /* Initialize constraint bound violation measures */\n  for(i = 1; i <= lp->rows; i++) {\n    upB = get_rh_upper(lp, i);\n    loB = get_rh_lower(lp, i);\n    error = values[i] - upB;\n    if(error > lp->epsprimal)\n      violation[i] = sortorder*error;\n    else {\n      error = loB - values[i];\n      if(error > lp->epsprimal)\n        violation[i] = sortorder*error;\n      else if(is_infinite(lp, loB) && is_infinite(lp, upB))\n        ;\n      else if(is_infinite(lp, upB))\n        violation[i] = sortorder*(loB - values[i]);\n      else if(is_infinite(lp, loB))\n        violation[i] = sortorder*(values[i] - upB);\n      else\n        violation[i] = - sortorder*MAX(upB - values[i], values[i] - loB);\n    }\n    basisvector[i] = i;\n  }\n\n  /* Initialize user variable bound violation measures */\n  for(i = 1; i <= lp->columns; i++) {\n    n = lp->rows+i;\n    upB = get_upbo(lp, i);\n    loB = get_lowbo(lp, i);\n    error = guessvector[i] - upB;\n    if(error > lp->epsprimal)\n      violation[n] = sortorder*error;\n    else {\n      error = loB - values[n];\n      if(error > lp->epsprimal)\n        violation[n] = sortorder*error;\n      else if(is_infinite(lp, loB) && is_infinite(lp, upB))\n        ;\n      else if(is_infinite(lp, upB))\n        violation[n] = sortorder*(loB - values[n]);\n      else if(is_infinite(lp, loB))\n        violation[n] = sortorder*(values[n] - upB);\n      else\n        violation[n] = - sortorder*MAX(upB - values[n], values[n] - loB);\n    }\n    basisvector[n] = n;\n  }\n\n  /* Sort decending by violation; this means that variables with\n     the largest violations will be designated as basic */\n  sortByREAL(basisvector, violation, lp->sum, 1, FALSE);\n\n  /* Adjust the non-basic indeces for the (proximal) bound state */\n  error = lp->epsprimal;\n  for(i = lp->rows+1, rownr = basisvector+i; i <= lp->sum; i++, rownr++) {\n    if(*rownr <= lp->rows) {\n      if(values[*rownr] <= get_rh_lower(lp, *rownr)+error)\n        *rownr = -(*rownr);\n    }\n    else\n      if(values[i] <= get_lowbo(lp, (*rownr)-lp->rows)+error)\n        *rownr = -(*rownr);\n  }\n\n  /* Clean up and return status */\n  status = (MYBOOL) (violation[1] == 0);\nFinish:\n  FREE(values);\n  FREE(violation);\n\n\n  return( status );\n}\n#endif\n\n#if 0\nMYBOOL __WINAPI guess_basis(lprec *lp, REAL *guessvector, int *basisvector)\n{\n  MYBOOL *isnz, status = FALSE;\n  REAL   *values = NULL, *violation = NULL,\n         eps = lp->epsprimal,\n         *value, error, upB, loB, sortorder = 1.0;\n  int    i, j, n, *rownr, *colnr, *slkpos,\n         nrows = lp->rows, ncols = lp->columns;\n  MATrec *mat = lp->matA;\n\n  if(!mat_validate(mat))\n    return( status );\n\n  /* Create helper arrays */\n  if(!allocREAL(lp, &values, lp->sum+1, TRUE) ||\n     !allocREAL(lp, &violation, lp->sum+1, TRUE))\n    goto Finish;\n\n  /* Compute values of slack variables for given guess vector */\n  i = 0;\n  n = get_nonzeros(lp);\n  rownr = &COL_MAT_ROWNR(i);\n  colnr = &COL_MAT_COLNR(i);\n  value = &COL_MAT_VALUE(i);\n  for(; i < n; i++, rownr += matRowColStep, colnr += matRowColStep, value += matValueStep)\n    values[*rownr] += unscaled_mat(lp, my_chsign(is_chsign(lp, *rownr), *value), *rownr, *colnr) *\n                      guessvector[*colnr];\n  MEMMOVE(values+nrows+1, guessvector+1, ncols);\n\n  /* Initialize constraint bound violation measures (expressed as positive values) */\n  for(i = 1; i <= nrows; i++) {\n    upB = get_rh_upper(lp, i);\n    loB = get_rh_lower(lp, i);\n    error = values[i] - upB;\n    if(error > eps)\n      violation[i] = sortorder*error;\n    else {\n      error = loB - values[i];\n      if(error > eps)\n        violation[i] = sortorder*error;\n      else if(my_infinite(lp, loB) && my_infinite(lp, upB))\n        ;\n      else if(my_infinite(lp, upB))\n        violation[i] = sortorder*(loB - values[i]);\n      else if(my_infinite(lp, loB))\n        violation[i] = sortorder*(values[i] - upB);\n      else\n        violation[i] = -sortorder*MAX(upB - values[i], values[i] - loB);\n    }\n    basisvector[i] = i;\n  }\n\n  /* Initialize user variable bound violation measures (expressed as positive values) */\n  for(i = 1; i <= ncols; i++) {\n    n = nrows+i;\n    upB = get_upbo(lp, i);\n    loB = get_lowbo(lp, i);\n    error = guessvector[i] - upB;\n    if(error > eps)\n      violation[n] = sortorder*error;\n    else {\n      error = loB - values[n];\n      if(error > eps)\n        violation[n] = sortorder*error;\n      else if(my_infinite(lp, loB) && my_infinite(lp, upB))\n        ;\n      else if(my_infinite(lp, upB))\n        violation[n] = sortorder*(loB - values[n]);\n      else if(my_infinite(lp, loB))\n        violation[n] = sortorder*(values[n] - upB);\n      else\n        violation[n] = -sortorder*MAX(upB - values[n], values[n] - loB);\n    }\n    basisvector[n] = n;\n  }\n\n  /* Sort decending by violation; this means that variables with\n     the largest violations will be designated as basic */\n  sortByREAL(basisvector, violation, lp->sum, 1, FALSE);\n  error = violation[1];\n\n  /* Adjust the non-basic indeces for the (proximal) bound state */\n  for(i = nrows+1, rownr = basisvector+i; i <= lp->sum; i++, rownr++) {\n    if(*rownr <= nrows) {\n      if(values[*rownr] <= get_rh_lower(lp, *rownr)+eps)\n        *rownr = -(*rownr);\n    }\n    else\n      if(values[i] <= get_lowbo(lp, (*rownr)-nrows)+eps)\n        *rownr = -(*rownr);\n  }\n\n#if 1\n  /* Let us check for obvious row singularities and try to fix these;\n     First assemble necessary basis statistics... */\n  isnz = (MYBOOL *) values;\n  MEMCLEAR(isnz, nrows+1);\n  slkpos = (int *) violation;\n  MEMCLEAR(slkpos, nrows+1);\n  for(i = 1; i <= nrows; i++) {\n    j = abs(basisvector[i]);\n    if(j <= nrows) {\n      isnz[j] = TRUE;\n      slkpos[j] = i;\n    }\n    else {\n      j-= nrows;\n      j = mat->col_end[j-1];\n      isnz[COL_MAT_ROWNR(j)] = TRUE;\n      /*isnz[COL_MAT_ROWNR(j+1)] = TRUE;*/\n    }\n  }\n  for(; i <= lp->sum; i++) {\n    j = abs(basisvector[i]);\n    if(j <= nrows)\n      slkpos[j] = i;\n  }\n\n  /* ...then set the corresponding slacks basic for row rank deficient positions */\n  for(j = 1; j <= nrows; j++) {\n#ifdef Paranoia\n    if(slkpos[j] == 0)\n      report(lp, SEVERE, \"guess_basis: Internal error\");\n#endif\n    if(!isnz[j]) {\n      isnz[j] = TRUE;\n      i = slkpos[j];\n      swapINT(&basisvector[i], &basisvector[j]);\n      basisvector[j] = abs(basisvector[j]);\n    }\n  }\n#endif\n\n  /* Clean up and return status */\n  status = (MYBOOL) (error <= eps);\nFinish:\n  FREE(values);\n  FREE(violation);\n\n  return( status );\n}\n#endif\n\n#if 0\nMYBOOL __WINAPI guess_basis(lprec *lp, REAL *guessvector, int *basisvector)\n{\n  MYBOOL *isnz, status = FALSE;\n  REAL   *values = NULL, *violation = NULL,\n         eps = lp->epsprimal,\n         *value, error, upB, loB, sortorder = 1.0;\n  int    i, j, jj, n, *rownr, *colnr, *slkpos,\n         nrows = lp->rows, ncols = lp->columns;\n  MATrec *mat = lp->matA;\n\n  if(!mat_validate(mat))\n    return( status );\n\n  /* Create helper arrays */\n  if(!allocREAL(lp, &values, lp->sum+1, TRUE) ||\n     !allocREAL(lp, &violation, lp->sum+1, TRUE))\n    goto Finish;\n\n  /* Compute values of slack variables for given guess vector */\n  i = 0;\n  n = get_nonzeros(lp);\n  rownr = &COL_MAT_ROWNR(i);\n  colnr = &COL_MAT_COLNR(i);\n  value = &COL_MAT_VALUE(i);\n  for(; i < n; i++, rownr += matRowColStep, colnr += matRowColStep, value += matValueStep)\n    values[*rownr] += unscaled_mat(lp, my_chsign(is_chsign(lp, *rownr), *value), *rownr, *colnr) *\n                      guessvector[*colnr];\n  MEMMOVE(values+nrows+1, guessvector+1, ncols);\n\n  /* Initialize constraint bound violation measures (expressed as positive values) */\n  for(i = 1; i <= nrows; i++) {\n    upB = get_rh_upper(lp, i);\n    loB = get_rh_lower(lp, i);\n    error = values[i] - upB;\n    if(error > -eps)\n      violation[i] = sortorder*MAX(0,error);\n    else {\n      error = loB - values[i];\n      if(error > -eps)\n        violation[i] = sortorder*MAX(0,error);\n      else if(my_infinite(lp, loB) && my_infinite(lp, upB))\n        ;\n      else if(my_infinite(lp, upB))\n        violation[i] = sortorder*(loB - values[i]);\n      else if(my_infinite(lp, loB))\n        violation[i] = sortorder*(values[i] - upB);\n      else\n        violation[i] = -sortorder*MAX(upB - values[i], values[i] - loB);\n    }\n    basisvector[i] = i;\n  }\n\n  /* Initialize user variable bound violation measures (expressed as positive values) */\n  for(i = 1; i <= ncols; i++) {\n    n = nrows+i;\n    upB = get_upbo(lp, i);\n    loB = get_lowbo(lp, i);\n    error = guessvector[i] - upB;\n    if(error > -eps)\n      violation[n] = sortorder*MAX(0,error);\n    else {\n      error = loB - values[n];\n      if(error > -eps)\n        violation[n] = sortorder*MAX(0,error);\n      else if(my_infinite(lp, loB) && my_infinite(lp, upB))\n        ;\n      else if(my_infinite(lp, upB))\n        violation[n] = sortorder*(loB - values[n]);\n      else if(my_infinite(lp, loB))\n        violation[n] = sortorder*(values[n] - upB);\n      else\n        violation[n] = -sortorder*MAX(upB - values[n], values[n] - loB);\n    }\n    basisvector[n] = n;\n  }\n\n  /* Sort decending by violation; this means that variables with\n     the largest violations will be designated as basic */\n  sortByREAL(basisvector, violation, lp->sum, 1, FALSE);\n  error = violation[1];\n\n  /* Adjust the non-basic indeces for the (proximal) bound state */\n  for(i = nrows+1, rownr = basisvector+i; i <= lp->sum; i++, rownr++) {\n    if(*rownr <= nrows) {\n      values[*rownr] -= lp->orig_rhs[*rownr];\n      if(values[*rownr] <= eps)\n        *rownr = -(*rownr);\n    }\n    else\n      if(values[i] <= get_lowbo(lp, (*rownr)-nrows)+eps)\n        *rownr = -(*rownr);\n  }\n\n  /* Let us check for obvious row singularities and try to fix these;\n     First assemble necessary basis statistics... */\n  isnz = (MYBOOL *) values;\n  MEMCLEAR(isnz, nrows+1);\n  slkpos = (int *) violation;\n  MEMCLEAR(slkpos, nrows+1);\n  for(i = 1; i <= nrows; i++) {\n    j = abs(basisvector[i]);\n    if(j <= nrows) {\n      isnz[j] = TRUE;\n      slkpos[j] = i;\n    }\n    else {\n      j-= nrows;\n      jj = mat->col_end[j-1];\n      isnz[COL_MAT_ROWNR(jj)] = TRUE;\n/*      if(++jj < mat->col_end[j])\n        isnz[COL_MAT_ROWNR(jj)] = TRUE; */\n    }\n  }\n  for(; i <= lp->sum; i++) {\n    j = abs(basisvector[i]);\n    if(j <= nrows)\n      slkpos[j] = i;\n  }\n\n  /* ...then set the corresponding slacks basic for row rank deficient positions */\n  for(j = 1; j <= nrows; j++) {\n#ifdef Paranoia\n    if(slkpos[j] == 0)\n      report(lp, SEVERE, \"guess_basis: Internal error\");\n#endif\n    if(!isnz[j]) {\n      isnz[j] = TRUE;\n      i = slkpos[j];\n      swapINT(&basisvector[i], &basisvector[j]);\n      basisvector[j] = abs(basisvector[j]);\n    }\n  }\n\n  /* Lastly normalize all basic variables to be coded as lower-bounded */\n  for(i = 1; i <= nrows; i++)\n    basisvector[i] = -abs(basisvector[i]);\n\n  /* Clean up and return status */\n  status = (MYBOOL) (error <= eps);\nFinish:\n  FREE(values);\n  FREE(violation);\n\n  return( status );\n}\n#endif\n\nMYBOOL __WINAPI guess_basis(lprec *lp, REAL *guessvector, int *basisvector)\n{\n  MYBOOL *isnz = NULL, status = FALSE;\n  REAL   *values = NULL, *violation = NULL,\n         eps = lp->epsprimal,\n         *value, error, upB, loB, sortorder = -1.0;\n  int    i, j, jj, n, *rownr, *colnr, *slkpos = NULL,\n         nrows = lp->rows, ncols = lp->columns, nsum = lp->sum;\n  int    *basisnr;\n  MATrec *mat = lp->matA;\n\n  if(!mat_validate(mat))\n    return( status );\n\n  /* Create helper arrays, providing for multiple use of the violation array */\n  if(!allocREAL(lp, &values, nsum+1, TRUE) ||\n     !allocREAL(lp, &violation, nsum+1, TRUE))\n    goto Finish;\n\n  /* Compute the values of the constraints for the given guess vector */\n  i = 0;\n  n = get_nonzeros(lp);\n  rownr = &COL_MAT_ROWNR(i);\n  colnr = &COL_MAT_COLNR(i);\n  value = &COL_MAT_VALUE(i);\n  for(; i < n; i++, rownr += matRowColStep, colnr += matRowColStep, value += matValueStep)\n    values[*rownr] += unscaled_mat(lp, my_chsign(is_chsign(lp, *rownr), *value), *rownr, *colnr) *\n                      guessvector[*colnr];\n  MEMMOVE(values+nrows+1, guessvector+1, ncols);\n\n  /* Initialize bound \"violation\" or primal non-degeneracy measures, expressed\n     as the absolute value of the differences from the closest bound. */\n  for(i = 1; i <= nsum; i++) {\n    if(i <= nrows) {\n      loB = get_rh_lower(lp, i);\n      upB = get_rh_upper(lp, i);\n    }\n    else {\n      loB = get_lowbo(lp, i-nrows);\n      upB = get_upbo(lp, i-nrows);\n    }\n\n    /* Free constraints/variables */\n    if(my_infinite(lp, loB) && my_infinite(lp, upB))\n      error = 0;\n    /* Violated constraints/variable bounds */\n    else if(values[i]+eps < loB)\n      error = loB-values[i];\n    else if(values[i]-eps > upB)\n      error = values[i]-upB;\n    /* Non-violated constraints/variables bounds */\n    else if(my_infinite(lp, upB))\n      error = MAX(0, values[i]-loB);\n    else if(my_infinite(lp, loB))\n      error = MAX(0, upB-values[i]);\n    else\n      error = MIN(upB-values[i], values[i]-loB); /* MAX(upB-values[i], values[i]-loB); */\n    if(error != 0)\n      violation[i] = sortorder*error;\n    basisvector[i] = i;\n  }\n\n  /* Sort decending , meaning that variables with the largest\n     \"violations\" will be designated basic. Effectively, we are performing a\n     greedy type algorithm, but start at the \"least interesting\" end. */\n  sortByREAL(basisvector, violation, nsum, 1, FALSE);\n  error = violation[1]; /* Used for setting the return value */\n\n  /* Let us check for obvious row singularities and try to fix these.\n     Note that we reuse the memory allocated to the violation array.\n     First assemble necessary basis statistics... */\n  slkpos = (int *) violation;\n  n = nrows+1;\n  MEMCLEAR(slkpos, n);\n  isnz = (MYBOOL *) (slkpos+n+1);\n  MEMCLEAR(isnz, n);\n  for(i = 1; i <= nrows; i++) {\n    j = abs(basisvector[i]);\n    if(j <= nrows) {\n      isnz[j] = TRUE;\n      slkpos[j] = i;\n    }\n    else {\n      j-= nrows;\n      jj = mat->col_end[j-1];\n      jj = COL_MAT_ROWNR(jj);\n      isnz[jj] = TRUE;\n    }\n  }\n  for(; i <= nsum; i++) {\n    j = abs(basisvector[i]);\n    if(j <= nrows)\n      slkpos[j] = i;\n  }\n\n  /* ...then set the corresponding slacks basic for row rank deficient positions */\n  for(j = 1; j <= nrows; j++) {\n    if(slkpos[j] == 0)\n      report(lp, SEVERE, \"guess_basis: Internal error\");\n    if(!isnz[j]) {\n      isnz[j] = TRUE;\n      i = slkpos[j];\n      swapINT(&basisvector[i], &basisvector[j]);\n      basisvector[j] = abs(basisvector[j]);\n    }\n  }\n\n  /* Adjust the non-basic indeces for the (proximal) bound state */\n  for(i = nrows+1, basisnr = basisvector+i; i <= nsum; i++, basisnr++) {\n    n = *basisnr;\n    if(n <= nrows) {\n      values[n] -= get_rh_lower(lp, n);\n      if(values[n] <= eps)\n        *basisnr = -(*basisnr);\n    }\n    else\n      if(values[n]-eps <= get_lowbo(lp, n-nrows))\n        *basisnr = -(*basisnr);\n  }\n\n/* Lastly normalize all basic variables to be coded as lower-bounded,\n   or effectively zero-based in the case of free variables. */\n  for(i = 1; i <= nrows; i++)\n    basisvector[i] = -abs(basisvector[i]);\n\n  /* Clean up and return status */\n  status = (MYBOOL) (error <= eps);\nFinish:\n  FREE(values);\n  FREE(violation);\n\n  return( status );\n}\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_crash.h",
    "content": "\n#ifndef HEADER_lp_crash\n#define HEADER_lp_crash\n\n\n#include \"lp_types.h\"\n\n#define CRASH_SIMPLESCALE       /* Specify if we should use a simple absolute scaling threshold */\n\n#define CRASH_THRESHOLD  0.167\n#define CRASH_SPACER        10\n#define CRASH_WEIGHT     0.500\n\n\n\n#ifdef __cplusplus\n__EXTERN_C {\n#endif\n\nSTATIC MYBOOL crash_basis(lprec *lp);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* HEADER_lp_crash */\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_explicit.h",
    "content": "#define HEADER_lp_report\n\n#include \"lp_lib.h\"\n\n#if defined LPSOLVEAPIFROMLPRECDEF\n# define LPSOLVEAPIFROMLPREC\n# define LPSOLVEAPIDEF\n#endif\n\n#if defined LPSOLVEAPIFROMLIBDEF\n# define LPSOLVEAPIFROMLIB\n# define LPSOLVEAPIDEF\n#endif\n\n#if !defined LPSOLVEAPIDEF\n# define LPSOLVEAPIDEF extern\n#endif\n\n/* entries for lp structure */\nLPSOLVEAPIDEF add_column_func               *_add_column;\nLPSOLVEAPIDEF add_columnex_func             *_add_columnex;\nLPSOLVEAPIDEF add_constraint_func           *_add_constraint;\nLPSOLVEAPIDEF add_constraintex_func         *_add_constraintex;\nLPSOLVEAPIDEF add_lag_con_func              *_add_lag_con;\nLPSOLVEAPIDEF add_SOS_func                  *_add_SOS;\nLPSOLVEAPIDEF column_in_lp_func             *_column_in_lp;\nLPSOLVEAPIDEF copy_lp_func                  *_copy_lp;\nLPSOLVEAPIDEF default_basis_func            *_default_basis;\nLPSOLVEAPIDEF del_column_func               *_del_column;\nLPSOLVEAPIDEF del_constraint_func           *_del_constraint;\nLPSOLVEAPIDEF delete_lp_func                *_delete_lp;\nLPSOLVEAPIDEF dualize_lp_func               *_dualize_lp;\nLPSOLVEAPIDEF free_lp_func                  *_free_lp;\nLPSOLVEAPIDEF get_anti_degen_func           *_get_anti_degen;\nLPSOLVEAPIDEF get_basis_func                *_get_basis;\nLPSOLVEAPIDEF get_basiscrash_func           *_get_basiscrash;\nLPSOLVEAPIDEF get_bb_depthlimit_func        *_get_bb_depthlimit;\nLPSOLVEAPIDEF get_bb_floorfirst_func        *_get_bb_floorfirst;\nLPSOLVEAPIDEF get_bb_rule_func              *_get_bb_rule;\nLPSOLVEAPIDEF get_bounds_tighter_func       *_get_bounds_tighter;\nLPSOLVEAPIDEF get_break_at_value_func       *_get_break_at_value;\nLPSOLVEAPIDEF get_col_name_func             *_get_col_name;\nLPSOLVEAPIDEF get_column_func               *_get_column;\nLPSOLVEAPIDEF get_columnex_func             *_get_columnex;\nLPSOLVEAPIDEF get_constr_type_func          *_get_constr_type;\nLPSOLVEAPIDEF get_constr_value_func         *_get_constr_value;\nLPSOLVEAPIDEF get_constraints_func          *_get_constraints;\nLPSOLVEAPIDEF get_dual_solution_func        *_get_dual_solution;\nLPSOLVEAPIDEF get_epsb_func                 *_get_epsb;\nLPSOLVEAPIDEF get_epsd_func                 *_get_epsd;\nLPSOLVEAPIDEF get_epsel_func                *_get_epsel;\nLPSOLVEAPIDEF get_epsint_func               *_get_epsint;\nLPSOLVEAPIDEF get_epsperturb_func           *_get_epsperturb;\nLPSOLVEAPIDEF get_epspivot_func             *_get_epspivot;\nLPSOLVEAPIDEF get_improve_func              *_get_improve;\nLPSOLVEAPIDEF get_infinite_func             *_get_infinite;\nLPSOLVEAPIDEF get_lambda_func               *_get_lambda;\nLPSOLVEAPIDEF get_lowbo_func                *_get_lowbo;\nLPSOLVEAPIDEF get_lp_index_func             *_get_lp_index;\nLPSOLVEAPIDEF get_lp_name_func              *_get_lp_name;\nLPSOLVEAPIDEF get_Lrows_func                *_get_Lrows;\nLPSOLVEAPIDEF get_mat_func                  *_get_mat;\nLPSOLVEAPIDEF get_mat_byindex_func          *_get_mat_byindex;\nLPSOLVEAPIDEF get_max_level_func            *_get_max_level;\nLPSOLVEAPIDEF get_maxpivot_func             *_get_maxpivot;\nLPSOLVEAPIDEF get_mip_gap_func              *_get_mip_gap;\nLPSOLVEAPIDEF get_multiprice_func           *_get_multiprice;\nLPSOLVEAPIDEF get_nameindex_func            *_get_nameindex;\nLPSOLVEAPIDEF get_Ncolumns_func             *_get_Ncolumns;\nLPSOLVEAPIDEF get_negrange_func             *_get_negrange;\nLPSOLVEAPIDEF get_nz_func                   *_get_nonzeros;\nLPSOLVEAPIDEF get_Norig_columns_func        *_get_Norig_columns;\nLPSOLVEAPIDEF get_Norig_rows_func           *_get_Norig_rows;\nLPSOLVEAPIDEF get_Nrows_func                *_get_Nrows;\nLPSOLVEAPIDEF get_obj_bound_func            *_get_obj_bound;\nLPSOLVEAPIDEF get_objective_func            *_get_objective;\nLPSOLVEAPIDEF get_orig_index_func           *_get_orig_index;\nLPSOLVEAPIDEF get_origcol_name_func         *_get_origcol_name;\nLPSOLVEAPIDEF get_origrow_name_func         *_get_origrow_name;\nLPSOLVEAPIDEF get_partialprice_func         *_get_partialprice;\nLPSOLVEAPIDEF get_pivoting_func             *_get_pivoting;\nLPSOLVEAPIDEF get_presolve_func             *_get_presolve;\nLPSOLVEAPIDEF get_presolveloops_func        *_get_presolveloops;\nLPSOLVEAPIDEF get_primal_solution_func      *_get_primal_solution;\nLPSOLVEAPIDEF get_print_sol_func            *_get_print_sol;\nLPSOLVEAPIDEF get_pseudocosts_func          *_get_pseudocosts;\nLPSOLVEAPIDEF get_ptr_constraints_func      *_get_ptr_constraints;\nLPSOLVEAPIDEF get_ptr_dual_solution_func    *_get_ptr_dual_solution;\nLPSOLVEAPIDEF get_ptr_lambda_func           *_get_ptr_lambda;\nLPSOLVEAPIDEF get_ptr_primal_solution_func  *_get_ptr_primal_solution;\nLPSOLVEAPIDEF get_ptr_sensitivity_obj_func  *_get_ptr_sensitivity_obj;\nLPSOLVEAPIDEF get_ptr_sensitivity_objex_func *_get_ptr_sensitivity_objex;\nLPSOLVEAPIDEF get_ptr_sensitivity_rhs_func  *_get_ptr_sensitivity_rhs;\nLPSOLVEAPIDEF get_ptr_variables_func        *_get_ptr_variables;\nLPSOLVEAPIDEF get_rh_func                   *_get_rh;\nLPSOLVEAPIDEF get_rh_range_func             *_get_rh_range;\nLPSOLVEAPIDEF get_row_func                  *_get_row;\nLPSOLVEAPIDEF get_rowex_func                *_get_rowex;\nLPSOLVEAPIDEF get_row_name_func             *_get_row_name;\nLPSOLVEAPIDEF get_scalelimit_func           *_get_scalelimit;\nLPSOLVEAPIDEF get_scaling_func              *_get_scaling;\nLPSOLVEAPIDEF get_sensitivity_obj_func      *_get_sensitivity_obj;\nLPSOLVEAPIDEF get_sensitivity_objex_func    *_get_sensitivity_objex;\nLPSOLVEAPIDEF get_sensitivity_rhs_func      *_get_sensitivity_rhs;\nLPSOLVEAPIDEF get_simplextype_func          *_get_simplextype;\nLPSOLVEAPIDEF get_solutioncount_func        *_get_solutioncount;\nLPSOLVEAPIDEF get_solutionlimit_func        *_get_solutionlimit;\nLPSOLVEAPIDEF get_status_func               *_get_status;\nLPSOLVEAPIDEF get_statustext_func           *_get_statustext;\nLPSOLVEAPIDEF get_timeout_func              *_get_timeout;\nLPSOLVEAPIDEF get_total_iter_func           *_get_total_iter;\nLPSOLVEAPIDEF get_total_nodes_func          *_get_total_nodes;\nLPSOLVEAPIDEF get_upbo_func                 *_get_upbo;\nLPSOLVEAPIDEF get_var_branch_func           *_get_var_branch;\nLPSOLVEAPIDEF get_var_dualresult_func       *_get_var_dualresult;\nLPSOLVEAPIDEF get_var_primalresult_func     *_get_var_primalresult;\nLPSOLVEAPIDEF get_var_priority_func         *_get_var_priority;\nLPSOLVEAPIDEF get_variables_func            *_get_variables;\nLPSOLVEAPIDEF get_verbose_func              *_get_verbose;\nLPSOLVEAPIDEF get_working_objective_func    *_get_working_objective;\nLPSOLVEAPIDEF guess_basis_func              *_guess_basis;\nLPSOLVEAPIDEF has_BFP_func                  *_has_BFP;\nLPSOLVEAPIDEF has_XLI_func                  *_has_XLI;\nLPSOLVEAPIDEF is_add_rowmode_func           *_is_add_rowmode;\nLPSOLVEAPIDEF is_anti_degen_func            *_is_anti_degen;\nLPSOLVEAPIDEF is_binary_func                *_is_binary;\nLPSOLVEAPIDEF is_break_at_first_func        *_is_break_at_first;\nLPSOLVEAPIDEF is_constr_type_func           *_is_constr_type;\nLPSOLVEAPIDEF is_debug_func                 *_is_debug;\nLPSOLVEAPIDEF is_feasible_func              *_is_feasible;\nLPSOLVEAPIDEF is_unbounded_func             *_is_unbounded;\nLPSOLVEAPIDEF is_infinite_func              *_is_infinite;\nLPSOLVEAPIDEF is_int_func                   *_is_int;\nLPSOLVEAPIDEF is_integerscaling_func        *_is_integerscaling;\nLPSOLVEAPIDEF is_lag_trace_func             *_is_lag_trace;\nLPSOLVEAPIDEF is_maxim_func                 *_is_maxim;\nLPSOLVEAPIDEF is_nativeBFP_func             *_is_nativeBFP;\nLPSOLVEAPIDEF is_nativeXLI_func             *_is_nativeXLI;\nLPSOLVEAPIDEF is_negative_func              *_is_negative;\nLPSOLVEAPIDEF is_piv_mode_func              *_is_piv_mode;\nLPSOLVEAPIDEF is_piv_rule_func              *_is_piv_rule;\nLPSOLVEAPIDEF is_presolve_func              *_is_presolve;\nLPSOLVEAPIDEF is_scalemode_func             *_is_scalemode;\nLPSOLVEAPIDEF is_scaletype_func             *_is_scaletype;\nLPSOLVEAPIDEF is_semicont_func              *_is_semicont;\nLPSOLVEAPIDEF is_SOS_var_func               *_is_SOS_var;\nLPSOLVEAPIDEF is_trace_func                 *_is_trace;\nLPSOLVEAPIDEF is_use_names_func             *_is_use_names;\nLPSOLVEAPIDEF lp_solve_version_func         *_lp_solve_version;\nLPSOLVEAPIDEF make_lp_func                  *_make_lp;\nLPSOLVEAPIDEF print_constraints_func        *_print_constraints;\nLPSOLVEAPIDEF print_debugdump_func          *_print_debugdump;\nLPSOLVEAPIDEF print_duals_func              *_print_duals;\nLPSOLVEAPIDEF print_lp_func                 *_print_lp;\nLPSOLVEAPIDEF print_objective_func          *_print_objective;\nLPSOLVEAPIDEF print_scales_func             *_print_scales;\nLPSOLVEAPIDEF print_solution_func           *_print_solution;\nLPSOLVEAPIDEF print_str_func                *_print_str;\nLPSOLVEAPIDEF print_tableau_func            *_print_tableau;\nLPSOLVEAPIDEF put_abortfunc_func            *_put_abortfunc;\nLPSOLVEAPIDEF put_bb_nodefunc_func          *_put_bb_nodefunc;\nLPSOLVEAPIDEF put_bb_branchfunc_func        *_put_bb_branchfunc;\nLPSOLVEAPIDEF put_logfunc_func              *_put_logfunc;\nLPSOLVEAPIDEF put_msgfunc_func              *_put_msgfunc;\nLPSOLVEAPIDEF read_LP_func                  *_read_LP;\nLPSOLVEAPIDEF read_MPS_func                 *_read_MPS;\nLPSOLVEAPIDEF read_XLI_func                 *_read_XLI;\nLPSOLVEAPIDEF read_params_func              *_read_params;\nLPSOLVEAPIDEF read_basis_func               *_read_basis;\nLPSOLVEAPIDEF reset_basis_func              *_reset_basis;\nLPSOLVEAPIDEF reset_params_func             *_reset_params;\nLPSOLVEAPIDEF reportfunc                    *_report;\nLPSOLVEAPIDEF resize_lp_func                *_resize_lp;\nLPSOLVEAPIDEF set_add_rowmode_func          *_set_add_rowmode;\nLPSOLVEAPIDEF set_anti_degen_func           *_set_anti_degen;\nLPSOLVEAPIDEF set_basisvar_func             *_set_basisvar;\nLPSOLVEAPIDEF set_basis_func                *_set_basis;\nLPSOLVEAPIDEF set_basiscrash_func           *_set_basiscrash;\nLPSOLVEAPIDEF set_bb_depthlimit_func        *_set_bb_depthlimit;\nLPSOLVEAPIDEF set_bb_floorfirst_func        *_set_bb_floorfirst;\nLPSOLVEAPIDEF set_bb_rule_func              *_set_bb_rule;\nLPSOLVEAPIDEF set_BFP_func                  *_set_BFP;\nLPSOLVEAPIDEF set_binary_func               *_set_binary;\nLPSOLVEAPIDEF set_bounds_func               *_set_bounds;\nLPSOLVEAPIDEF set_bounds_tighter_func       *_set_bounds_tighter;\nLPSOLVEAPIDEF set_break_at_first_func       *_set_break_at_first;\nLPSOLVEAPIDEF set_break_at_value_func       *_set_break_at_value;\nLPSOLVEAPIDEF set_column_func               *_set_column;\nLPSOLVEAPIDEF set_columnex_func             *_set_columnex;\nLPSOLVEAPIDEF set_col_name_func             *_set_col_name;\nLPSOLVEAPIDEF set_constr_type_func          *_set_constr_type;\nLPSOLVEAPIDEF set_debug_func                *_set_debug;\nLPSOLVEAPIDEF set_epsb_func                 *_set_epsb;\nLPSOLVEAPIDEF set_epsd_func                 *_set_epsd;\nLPSOLVEAPIDEF set_epsel_func                *_set_epsel;\nLPSOLVEAPIDEF set_epsint_func               *_set_epsint;\nLPSOLVEAPIDEF set_epslevel_func             *_set_epslevel;\nLPSOLVEAPIDEF set_epsperturb_func           *_set_epsperturb;\nLPSOLVEAPIDEF set_epspivot_func             *_set_epspivot;\nLPSOLVEAPIDEF set_unbounded_func            *_set_unbounded;\nLPSOLVEAPIDEF set_improve_func              *_set_improve;\nLPSOLVEAPIDEF set_infinite_func             *_set_infinite;\nLPSOLVEAPIDEF set_int_func                  *_set_int;\nLPSOLVEAPIDEF set_lag_trace_func            *_set_lag_trace;\nLPSOLVEAPIDEF set_lowbo_func                *_set_lowbo;\nLPSOLVEAPIDEF set_lp_name_func              *_set_lp_name;\nLPSOLVEAPIDEF set_mat_func                  *_set_mat;\nLPSOLVEAPIDEF set_maxim_func                *_set_maxim;\nLPSOLVEAPIDEF set_maxpivot_func             *_set_maxpivot;\nLPSOLVEAPIDEF set_minim_func                *_set_minim;\nLPSOLVEAPIDEF set_mip_gap_func              *_set_mip_gap;\nLPSOLVEAPIDEF set_multiprice_func           *_set_multiprice;\nLPSOLVEAPIDEF set_negrange_func             *_set_negrange;\nLPSOLVEAPIDEF set_obj_bound_func            *_set_obj_bound;\nLPSOLVEAPIDEF set_obj_fn_func               *_set_obj_fn;\nLPSOLVEAPIDEF set_obj_fnex_func             *_set_obj_fnex;\nLPSOLVEAPIDEF set_obj_func                  *_set_obj;\nLPSOLVEAPIDEF set_outputfile_func           *_set_outputfile;\nLPSOLVEAPIDEF set_outputstream_func         *_set_outputstream;\nLPSOLVEAPIDEF set_partialprice_func         *_set_partialprice;\nLPSOLVEAPIDEF set_pivoting_func             *_set_pivoting;\nLPSOLVEAPIDEF set_preferdual_func           *_set_preferdual;\nLPSOLVEAPIDEF set_presolve_func             *_set_presolve;\nLPSOLVEAPIDEF set_print_sol_func            *_set_print_sol;\nLPSOLVEAPIDEF set_pseudocosts_func          *_set_pseudocosts;\nLPSOLVEAPIDEF set_rh_func                   *_set_rh;\nLPSOLVEAPIDEF set_rh_range_func             *_set_rh_range;\nLPSOLVEAPIDEF set_rh_vec_func               *_set_rh_vec;\nLPSOLVEAPIDEF set_row_func                  *_set_row;\nLPSOLVEAPIDEF set_rowex_func                *_set_rowex;\nLPSOLVEAPIDEF set_row_name_func             *_set_row_name;\nLPSOLVEAPIDEF set_scalelimit_func           *_set_scalelimit;\nLPSOLVEAPIDEF set_scaling_func              *_set_scaling;\nLPSOLVEAPIDEF set_semicont_func             *_set_semicont;\nLPSOLVEAPIDEF set_sense_func                *_set_sense;\nLPSOLVEAPIDEF set_simplextype_func          *_set_simplextype;\nLPSOLVEAPIDEF set_solutionlimit_func        *_set_solutionlimit;\nLPSOLVEAPIDEF set_timeout_func              *_set_timeout;\nLPSOLVEAPIDEF set_trace_func                *_set_trace;\nLPSOLVEAPIDEF set_upbo_func                 *_set_upbo;\nLPSOLVEAPIDEF set_var_branch_func           *_set_var_branch;\nLPSOLVEAPIDEF set_var_weights_func          *_set_var_weights;\nLPSOLVEAPIDEF set_verbose_func              *_set_verbose;\nLPSOLVEAPIDEF set_XLI_func                  *_set_XLI;\nLPSOLVEAPIDEF solve_func                    *_solve;\nLPSOLVEAPIDEF str_add_column_func           *_str_add_column;\nLPSOLVEAPIDEF str_add_constraint_func       *_str_add_constraint;\nLPSOLVEAPIDEF str_add_lag_con_func          *_str_add_lag_con;\nLPSOLVEAPIDEF str_set_obj_fn_func           *_str_set_obj_fn;\nLPSOLVEAPIDEF str_set_rh_vec_func           *_str_set_rh_vec;\nLPSOLVEAPIDEF time_elapsed_func             *_time_elapsed;\nLPSOLVEAPIDEF unscale_func                  *_unscale;\nLPSOLVEAPIDEF write_lp_func                 *_write_lp;\nLPSOLVEAPIDEF write_LP_func                 *_write_LP;\nLPSOLVEAPIDEF write_mps_func                *_write_mps;\nLPSOLVEAPIDEF write_MPS_func                *_write_MPS;\nLPSOLVEAPIDEF write_freemps_func            *_write_freemps;\nLPSOLVEAPIDEF write_freeMPS_func            *_write_freeMPS;\nLPSOLVEAPIDEF write_XLI_func                *_write_XLI;\nLPSOLVEAPIDEF write_basis_func              *_write_basis;\nLPSOLVEAPIDEF write_params_func             *_write_params;\n\n#if defined LPSOLVEAPIFROMLPREC\n\nstatic int init_lpsolve(lprec *lp)\n{\n  _add_column = lp->add_column;\n  _add_columnex = lp->add_columnex;\n  _add_constraint = lp->add_constraint;\n  _add_constraintex = lp->add_constraintex;\n  _add_lag_con = lp->add_lag_con;\n  _add_SOS = lp->add_SOS;\n  _column_in_lp = lp->column_in_lp;\n  _copy_lp = lp->copy_lp;\n  _default_basis = lp->default_basis;\n  _del_column = lp->del_column;\n  _del_constraint = lp->del_constraint;\n  _delete_lp = lp->delete_lp;\n  _dualize_lp = lp->dualize_lp;\n  _free_lp = lp->free_lp;\n  _get_anti_degen = lp->get_anti_degen;\n  _get_basis = lp->get_basis;\n  _get_basiscrash = lp->get_basiscrash;\n  _get_bb_depthlimit = lp->get_bb_depthlimit;\n  _get_bb_floorfirst = lp->get_bb_floorfirst;\n  _get_bb_rule = lp->get_bb_rule;\n  _get_bounds_tighter = lp->get_bounds_tighter;\n  _get_break_at_value = lp->get_break_at_value;\n  _get_col_name = lp->get_col_name;\n  _get_columnex = lp->get_columnex;\n  _get_constr_type = lp->get_constr_type;\n  _get_constr_value = lp->get_constr_value;\n  _get_constraints = lp->get_constraints;\n  _get_dual_solution = lp->get_dual_solution;\n  _get_epsb = lp->get_epsb;\n  _get_epsd = lp->get_epsd;\n  _get_epsel = lp->get_epsel;\n  _get_epsint = lp->get_epsint;\n  _get_epsperturb = lp->get_epsperturb;\n  _get_epspivot = lp->get_epspivot;\n  _get_improve = lp->get_improve;\n  _get_infinite = lp->get_infinite;\n  _get_lambda = lp->get_lambda;\n  _get_lowbo = lp->get_lowbo;\n  _get_lp_index = lp->get_lp_index;\n  _get_lp_name = lp->get_lp_name;\n  _get_Lrows = lp->get_Lrows;\n  _get_mat = lp->get_mat;\n  _get_mat_byindex = lp->get_mat_byindex;\n  _get_max_level = lp->get_max_level;\n  _get_maxpivot = lp->get_maxpivot;\n  _get_mip_gap = lp->get_mip_gap;\n  _get_multiprice = lp->get_multiprice;\n  _get_nameindex = lp->get_nameindex;\n  _get_Ncolumns = lp->get_Ncolumns;\n  _get_negrange = lp->get_negrange;\n  _get_nonzeros = lp->get_nonzeros;\n  _get_Norig_columns = lp->get_Norig_columns;\n  _get_Norig_rows = lp->get_Norig_rows;\n  _get_Nrows = lp->get_Nrows;\n  _get_obj_bound = lp->get_obj_bound;\n  _get_objective = lp->get_objective;\n  _get_orig_index = lp->get_orig_index;\n  _get_origcol_name = lp->get_origcol_name;\n  _get_origrow_name = lp->get_origrow_name;\n  _get_partialprice = lp->get_partialprice;\n  _get_pivoting = lp->get_pivoting;\n  _get_presolve = lp->get_presolve;\n  _get_presolveloops = lp->get_presolveloops;\n  _get_primal_solution = lp->get_primal_solution;\n  _get_print_sol = lp->get_print_sol;\n  _get_pseudocosts = lp->get_pseudocosts;\n  _get_ptr_constraints = lp->get_ptr_constraints;\n  _get_ptr_dual_solution = lp->get_ptr_dual_solution;\n  _get_ptr_lambda = lp->get_ptr_lambda;\n  _get_ptr_primal_solution = lp->get_ptr_primal_solution;\n  _get_ptr_sensitivity_obj = lp->get_ptr_sensitivity_obj;\n  _get_ptr_sensitivity_objex = lp->get_ptr_sensitivity_objex;\n  _get_ptr_sensitivity_rhs = lp->get_ptr_sensitivity_rhs;\n  _get_ptr_variables = lp->get_ptr_variables;\n  _get_rh = lp->get_rh;\n  _get_rh_range = lp->get_rh_range;\n  _get_row = lp->get_row;\n  _get_rowex = lp->get_rowex;\n  _get_row_name = lp->get_row_name;\n  _get_scalelimit = lp->get_scalelimit;\n  _get_scaling = lp->get_scaling;\n  _get_sensitivity_obj = lp->get_sensitivity_obj;\n  _get_sensitivity_objex = lp->get_sensitivity_objex;\n  _get_sensitivity_rhs = lp->get_sensitivity_rhs;\n  _get_simplextype = lp->get_simplextype;\n  _get_solutioncount = lp->get_solutioncount;\n  _get_solutionlimit = lp->get_solutionlimit;\n  _get_status = lp->get_status;\n  _get_statustext = lp->get_statustext;\n  _get_timeout = lp->get_timeout;\n  _get_total_iter = lp->get_total_iter;\n  _get_total_nodes = lp->get_total_nodes;\n  _get_upbo = lp->get_upbo;\n  _get_var_branch = lp->get_var_branch;\n  _get_var_dualresult = lp->get_var_dualresult;\n  _get_var_primalresult = lp->get_var_primalresult;\n  _get_var_priority = lp->get_var_priority;\n  _get_variables = lp->get_variables;\n  _get_verbose = lp->get_verbose;\n  _get_working_objective = lp->get_working_objective;\n  _has_BFP = lp->has_BFP;\n  _has_XLI = lp->has_XLI;\n  _is_add_rowmode = lp->is_add_rowmode;\n  _is_anti_degen = lp->is_anti_degen;\n  _is_binary = lp->is_binary;\n  _is_break_at_first = lp->is_break_at_first;\n  _is_constr_type = lp->is_constr_type;\n  _is_debug = lp->is_debug;\n  _is_feasible = lp->is_feasible;\n  _is_unbounded = lp->is_unbounded;\n  _is_infinite = lp->is_infinite;\n  _is_int = lp->is_int;\n  _is_integerscaling = lp->is_integerscaling;\n  _is_lag_trace = lp->is_lag_trace;\n  _is_maxim = lp->is_maxim;\n  _is_nativeBFP = lp->is_nativeBFP;\n  _is_nativeXLI = lp->is_nativeXLI;\n  _is_negative = lp->is_negative;\n  _is_piv_mode = lp->is_piv_mode;\n  _is_piv_rule = lp->is_piv_rule;\n  _is_presolve = lp->is_presolve;\n  _is_scalemode = lp->is_scalemode;\n  _is_scaletype = lp->is_scaletype;\n  _is_semicont = lp->is_semicont;\n  _is_SOS_var = lp->is_SOS_var;\n  _is_trace = lp->is_trace;\n  _is_use_names = lp->is_use_names;\n  _lp_solve_version = lp->lp_solve_version;\n  _make_lp = lp->make_lp;\n  _print_constraints = lp->print_constraints;\n  _print_debugdump = lp->print_debugdump;\n  _print_duals = lp->print_duals;\n  _print_lp = lp->print_lp;\n  _print_objective = lp->print_objective;\n  _print_scales = lp->print_scales;\n  _print_solution = lp->print_solution;\n  _print_str = lp->print_str;\n  _print_tableau = lp->print_tableau;\n  _put_abortfunc = lp->put_abortfunc;\n  _put_bb_nodefunc = lp->put_bb_nodefunc;\n  _put_bb_branchfunc = lp->put_bb_branchfunc;\n  _put_logfunc = lp->put_logfunc;\n  _put_msgfunc = lp->put_msgfunc;\n  _read_LP = lp->read_LP;\n  _read_MPS = lp->read_MPS;\n  _read_XLI = lp->read_XLI;\n  _read_params = lp->read_params;\n  _read_basis = lp->read_basis;\n  _reset_basis = lp->reset_basis;\n  _reset_params = lp->reset_params;\n  _report = lp->report;\n  _resize_lp = lp->resize_lp;\n  _set_add_rowmode = lp->set_add_rowmode;\n  _set_anti_degen = lp->set_anti_degen;\n  _set_basisvar = lp->set_basisvar;\n  _set_basis = lp->set_basis;\n  _set_basiscrash = lp->set_basiscrash;\n  _set_bb_depthlimit = lp->set_bb_depthlimit;\n  _set_bb_floorfirst = lp->set_bb_floorfirst;\n  _set_bb_rule = lp->set_bb_rule;\n  _set_BFP = lp->set_BFP;\n  _set_binary = lp->set_binary;\n  _set_bounds = lp->set_bounds;\n  _set_bounds_tighter = lp->set_bounds_tighter;\n  _set_break_at_first = lp->set_break_at_first;\n  _set_break_at_value = lp->set_break_at_value;\n  _set_column = lp->set_column;\n  _set_columnex = lp->set_columnex;\n  _set_col_name = lp->set_col_name;\n  _set_constr_type = lp->set_constr_type;\n  _set_debug = lp->set_debug;\n  _set_epsb = lp->set_epsb;\n  _set_epsd = lp->set_epsd;\n  _set_epsel = lp->set_epsel;\n  _set_epsint = lp->set_epsint;\n  _set_epslevel = lp->set_epslevel;\n  _set_epsperturb = lp->set_epsperturb;\n  _set_epspivot = lp->set_epspivot;\n  _set_unbounded = lp->set_unbounded;\n  _set_improve = lp->set_improve;\n  _set_infinite = lp->set_infinite;\n  _set_int = lp->set_int;\n  _set_lag_trace = lp->set_lag_trace;\n  _set_lowbo = lp->set_lowbo;\n  _set_lp_name = lp->set_lp_name;\n  _set_mat = lp->set_mat;\n  _set_maxim = lp->set_maxim;\n  _set_maxpivot = lp->set_maxpivot;\n  _set_minim = lp->set_minim;\n  _set_mip_gap = lp->set_mip_gap;\n  _set_multiprice = lp->set_multiprice;\n  _set_negrange = lp->set_negrange;\n  _set_obj_bound = lp->set_obj_bound;\n  _set_obj_fn = lp->set_obj_fn;\n  _set_obj_fnex = lp->set_obj_fnex;\n  _set_obj = lp->set_obj;\n  _set_outputfile = lp->set_outputfile;\n  _set_outputstream = lp->set_outputstream;\n  _set_partialprice = lp->set_partialprice;\n  _set_pivoting = lp->set_pivoting;\n  _set_preferdual = lp->set_preferdual;\n  _set_presolve = lp->set_presolve;\n  _set_print_sol = lp->set_print_sol;\n  _set_pseudocosts = lp->set_pseudocosts;\n  _set_rh = lp->set_rh;\n  _set_rh_range = lp->set_rh_range;\n  _set_rh_vec = lp->set_rh_vec;\n  _set_row = lp->set_row;\n  _set_rowex = lp->set_rowex;\n  _set_row_name = lp->set_row_name;\n  _set_scalelimit = lp->set_scalelimit;\n  _set_scaling = lp->set_scaling;\n  _set_semicont = lp->set_semicont;\n  _set_sense = lp->set_sense;\n  _set_simplextype = lp->set_simplextype;\n  _set_solutionlimit = lp->set_solutionlimit;\n  _set_timeout = lp->set_timeout;\n  _set_trace = lp->set_trace;\n  _set_upbo = lp->set_upbo;\n  _set_var_branch = lp->set_var_branch;\n  _set_var_weights = lp->set_var_weights;\n  _set_verbose = lp->set_verbose;\n  _set_XLI = lp->set_XLI;\n  _solve = lp->solve;\n  _str_add_column = lp->str_add_column;\n  _str_add_constraint = lp->str_add_constraint;\n  _str_add_lag_con = lp->str_add_lag_con;\n  _str_set_obj_fn = lp->str_set_obj_fn;\n  _str_set_rh_vec = lp->str_set_rh_vec;\n  _time_elapsed = lp->time_elapsed;\n  _unscale = lp->unscale;\n  _write_lp = lp->write_lp;\n  _write_LP = lp->write_LP;\n  _write_mps = lp->write_mps;\n  _write_MPS = lp->write_MPS;\n  _write_freemps = lp->write_freemps;\n  _write_freeMPS = lp->write_freeMPS;\n  _write_XLI = lp->write_XLI;\n  _write_basis = lp->write_basis;\n  _write_params = lp->write_params;\n\n  return(TRUE);\n}\n\n#elif defined LPSOLVEAPIFROMLIB\n\n#ifdef WIN32\n#  include <windows.h>\n#else\n#  include <dlfcn.h>\n#endif\n\n#if defined WIN32\n# define hlpsolve HINSTANCE\n#else\n# define hlpsolve void *\n#endif\n\nstatic hlpsolve open_lpsolve_lib(char *filename)\n{\n  hlpsolve lpsolve;\n\n# if defined WIN32\n  /* Get a handle to the Windows DLL module. */\n  lpsolve = LoadLibrary(\"lpsolve55.dll\");\n# else\n  lpsolve = dlopen(\"liblpsolve55.so\", RTLD_LAZY);;\n# endif\n  return(lpsolve);\n}\n\nstatic int close_lpsolve_lib(hlpsolve lpsolve)\n{\n#ifdef WIN32\n  FreeLibrary(lpsolve);\n#else\n  dlclose(lpsolve);\n#endif\n\n  return(TRUE);\n}\n\nstatic int init_lpsolve(hlpsolve lpsolve)\n{\n# if defined WIN32\n#   define AddressOf GetProcAddress\n# else\n#   define AddressOf dlsym\n# endif\n\n  /* assign API functions to lp structure */\n  _add_column = (add_column_func *) AddressOf(lpsolve, \"add_column\");\n  _add_columnex = (add_columnex_func *) AddressOf(lpsolve, \"add_columnex\");\n  _add_constraint = (add_constraint_func *) AddressOf(lpsolve, \"add_constraint\");\n  _add_constraintex = (add_constraintex_func *) AddressOf(lpsolve, \"add_constraintex\");\n  _add_lag_con = (add_lag_con_func *) AddressOf(lpsolve, \"add_lag_con\");\n  _add_SOS = (add_SOS_func *) AddressOf(lpsolve, \"add_SOS\");\n  _column_in_lp = (column_in_lp_func *) AddressOf(lpsolve, \"column_in_lp\");\n  _copy_lp = (copy_lp_func *) AddressOf(lpsolve, \"copy_lp\");\n  _default_basis = (default_basis_func *) AddressOf(lpsolve, \"default_basis\");\n  _del_column = (del_column_func *) AddressOf(lpsolve, \"del_column\");\n  _del_constraint = (del_constraint_func *) AddressOf(lpsolve, \"del_constraint\");\n  _delete_lp = (delete_lp_func *) AddressOf(lpsolve, \"delete_lp\");\n  _dualize_lp = (dualize_lp_func *) AddressOf(lpsolve, \"dualize_lp\");\n  _free_lp = (free_lp_func *) AddressOf(lpsolve, \"free_lp\");\n  _get_anti_degen = (get_anti_degen_func *) AddressOf(lpsolve, \"get_anti_degen\");\n  _get_basis = (get_basis_func *) AddressOf(lpsolve, \"get_basis\");\n  _get_basiscrash = (get_basiscrash_func *) AddressOf(lpsolve, \"get_basiscrash\");\n  _get_bb_depthlimit = (get_bb_depthlimit_func *) AddressOf(lpsolve, \"get_bb_depthlimit\");\n  _get_bb_floorfirst = (get_bb_floorfirst_func *) AddressOf(lpsolve, \"get_bb_floorfirst\");\n  _get_bb_rule = (get_bb_rule_func *) AddressOf(lpsolve, \"get_bb_rule\");\n  _get_bounds_tighter = (get_bounds_tighter_func *) AddressOf(lpsolve, \"get_bounds_tighter\");\n  _get_break_at_value = (get_break_at_value_func *) AddressOf(lpsolve, \"get_break_at_value\");\n  _get_col_name = (get_col_name_func *) AddressOf(lpsolve, \"get_col_name\");\n  _get_column = (get_column_func *) AddressOf(lpsolve, \"get_column\");\n  _get_columnex = (get_columnex_func *) AddressOf(lpsolve, \"get_columnex\");\n  _get_constr_type = (get_constr_type_func *) AddressOf(lpsolve, \"get_constr_type\");\n  _get_constr_value = (get_constr_value_func *) AddressOf(lpsolve, \"get_constr_value\");\n  _get_constraints = (get_constraints_func *) AddressOf(lpsolve, \"get_constraints\");\n  _get_dual_solution = (get_dual_solution_func *) AddressOf(lpsolve, \"get_dual_solution\");\n  _get_epsb = (get_epsb_func *) AddressOf(lpsolve, \"get_epsb\");\n  _get_epsd = (get_epsd_func *) AddressOf(lpsolve, \"get_epsd\");\n  _get_epsel = (get_epsel_func *) AddressOf(lpsolve, \"get_epsel\");\n  _get_epsint = (get_epsint_func *) AddressOf(lpsolve, \"get_epsint\");\n  _get_epsperturb = (get_epsperturb_func *) AddressOf(lpsolve, \"get_epsperturb\");\n  _get_epspivot = (get_epspivot_func *) AddressOf(lpsolve, \"get_epspivot\");\n  _get_improve = (get_improve_func *) AddressOf(lpsolve, \"get_improve\");\n  _get_infinite = (get_infinite_func *) AddressOf(lpsolve, \"get_infinite\");\n  _get_lambda = (get_lambda_func *) AddressOf(lpsolve, \"get_lambda\");\n  _get_lowbo = (get_lowbo_func *) AddressOf(lpsolve, \"get_lowbo\");\n  _get_lp_index = (get_lp_index_func *) AddressOf(lpsolve, \"get_lp_index\");\n  _get_lp_name = (get_lp_name_func *) AddressOf(lpsolve, \"get_lp_name\");\n  _get_Lrows = (get_Lrows_func *) AddressOf(lpsolve, \"get_Lrows\");\n  _get_mat = (get_mat_func *) AddressOf(lpsolve, \"get_mat\");\n  _get_mat_byindex = (get_mat_byindex_func *) AddressOf(lpsolve, \"get_mat_byindex\");\n  _get_max_level = (get_max_level_func *) AddressOf(lpsolve, \"get_max_level\");\n  _get_maxpivot = (get_maxpivot_func *) AddressOf(lpsolve, \"get_maxpivot\");\n  _get_mip_gap = (get_mip_gap_func *) AddressOf(lpsolve, \"get_mip_gap\");\n  _get_multiprice = (get_multiprice_func *) AddressOf(lpsolve, \"get_multiprice\");\n  _get_nameindex = (get_nameindex_func *) AddressOf(lpsolve, \"get_nameindex\");\n  _get_Ncolumns = (get_Ncolumns_func *) AddressOf(lpsolve, \"get_Ncolumns\");\n  _get_negrange = (get_negrange_func *) AddressOf(lpsolve, \"get_negrange\");\n  _get_nonzeros = (get_nz_func *) AddressOf(lpsolve, \"get_nonzeros\");\n  _get_Norig_columns = (get_Norig_columns_func *) AddressOf(lpsolve, \"get_Norig_columns\");\n  _get_Norig_rows = (get_Norig_rows_func *) AddressOf(lpsolve, \"get_Norig_rows\");\n  _get_Nrows = (get_Nrows_func *) AddressOf(lpsolve, \"get_Nrows\");\n  _get_obj_bound = (get_obj_bound_func *) AddressOf(lpsolve, \"get_obj_bound\");\n  _get_objective = (get_objective_func *) AddressOf(lpsolve, \"get_objective\");\n  _get_orig_index = (get_orig_index_func *) AddressOf(lpsolve, \"get_orig_index\");\n  _get_origcol_name = (get_origcol_name_func *) AddressOf(lpsolve, \"get_origcol_name\");\n  _get_origrow_name = (get_origrow_name_func *) AddressOf(lpsolve, \"get_origrow_name\");\n  _get_partialprice = (get_partialprice_func *) AddressOf(lpsolve, \"get_partialprice\");\n  _get_pivoting = (get_pivoting_func *) AddressOf(lpsolve, \"get_pivoting\");\n  _get_presolve = (get_presolve_func *) AddressOf(lpsolve, \"get_presolve\");\n  _get_presolveloops = (get_presolveloops_func *) AddressOf(lpsolve, \"get_presolveloops\");\n  _get_primal_solution = (get_primal_solution_func *) AddressOf(lpsolve, \"get_primal_solution\");\n  _get_print_sol = (get_print_sol_func *) AddressOf(lpsolve, \"get_print_sol\");\n  _get_pseudocosts = (get_pseudocosts_func *) AddressOf(lpsolve, \"get_pseudocosts\");\n  _get_ptr_constraints = (get_ptr_constraints_func *) AddressOf(lpsolve, \"get_ptr_constraints\");\n  _get_ptr_dual_solution = (get_ptr_dual_solution_func *) AddressOf(lpsolve, \"get_ptr_dual_solution\");\n  _get_ptr_lambda = (get_ptr_lambda_func *) AddressOf(lpsolve, \"get_ptr_lambda\");\n  _get_ptr_primal_solution = (get_ptr_primal_solution_func *) AddressOf(lpsolve, \"get_ptr_primal_solution\");\n  _get_ptr_sensitivity_obj = (get_ptr_sensitivity_obj_func *) AddressOf(lpsolve, \"get_ptr_sensitivity_obj\");\n  _get_ptr_sensitivity_objex = (get_ptr_sensitivity_objex_func *) AddressOf(lpsolve, \"get_ptr_sensitivity_objex\");\n  _get_ptr_sensitivity_rhs = (get_ptr_sensitivity_rhs_func *) AddressOf(lpsolve, \"get_ptr_sensitivity_rhs\");\n  _get_ptr_variables = (get_ptr_variables_func *) AddressOf(lpsolve, \"get_ptr_variables\");\n  _get_rh = (get_rh_func *) AddressOf(lpsolve, \"get_rh\");\n  _get_rh_range = (get_rh_range_func *) AddressOf(lpsolve, \"get_rh_range\");\n  _get_row = (get_row_func *) AddressOf(lpsolve, \"get_row\");\n  _get_rowex = (get_rowex_func *) AddressOf(lpsolve, \"get_rowex\");\n  _get_row_name = (get_row_name_func *) AddressOf(lpsolve, \"get_row_name\");\n  _get_scalelimit = (get_scalelimit_func *) AddressOf(lpsolve, \"get_scalelimit\");\n  _get_scaling = (get_scaling_func *) AddressOf(lpsolve, \"get_scaling\");\n  _get_sensitivity_obj = (get_sensitivity_obj_func *) AddressOf(lpsolve, \"get_sensitivity_obj\");\n  _get_sensitivity_objex = (get_sensitivity_objex_func *) AddressOf(lpsolve, \"get_sensitivity_objex\");\n  _get_sensitivity_rhs = (get_sensitivity_rhs_func *) AddressOf(lpsolve, \"get_sensitivity_rhs\");\n  _get_simplextype = (get_simplextype_func *) AddressOf(lpsolve, \"get_simplextype\");\n  _get_solutioncount = (get_solutioncount_func *) AddressOf(lpsolve, \"get_solutioncount\");\n  _get_solutionlimit = (get_solutionlimit_func *) AddressOf(lpsolve, \"get_solutionlimit\");\n  _get_status = (get_status_func *) AddressOf(lpsolve, \"get_status\");\n  _get_statustext = (get_statustext_func *) AddressOf(lpsolve, \"get_statustext\");\n  _get_timeout = (get_timeout_func *) AddressOf(lpsolve, \"get_timeout\");\n  _get_total_iter = (get_total_iter_func *) AddressOf(lpsolve, \"get_total_iter\");\n  _get_total_nodes = (get_total_nodes_func *) AddressOf(lpsolve, \"get_total_nodes\");\n  _get_upbo = (get_upbo_func *) AddressOf(lpsolve, \"get_upbo\");\n  _get_var_branch = (get_var_branch_func *) AddressOf(lpsolve, \"get_var_branch\");\n  _get_var_dualresult = (get_var_dualresult_func *) AddressOf(lpsolve, \"get_var_dualresult\");\n  _get_var_primalresult = (get_var_primalresult_func *) AddressOf(lpsolve, \"get_var_primalresult\");\n  _get_var_priority = (get_var_priority_func *) AddressOf(lpsolve, \"get_var_priority\");\n  _get_variables = (get_variables_func *) AddressOf(lpsolve, \"get_variables\");\n  _get_verbose = (get_verbose_func *) AddressOf(lpsolve, \"get_verbose\");\n  _get_working_objective = (get_working_objective_func *) AddressOf(lpsolve, \"get_working_objective\");\n  _guess_basis = (guess_basis_func *) AddressOf(lpsolve, \"guess_basis\");\n  _has_BFP = (has_BFP_func *) AddressOf(lpsolve, \"has_BFP\");\n  _has_XLI = (has_XLI_func *) AddressOf(lpsolve, \"has_XLI\");\n  _is_add_rowmode = (is_add_rowmode_func *) AddressOf(lpsolve, \"is_add_rowmode\");\n  _is_anti_degen = (is_anti_degen_func *) AddressOf(lpsolve, \"is_anti_degen\");\n  _is_binary = (is_binary_func *) AddressOf(lpsolve, \"is_binary\");\n  _is_break_at_first = (is_break_at_first_func *) AddressOf(lpsolve, \"is_break_at_first\");\n  _is_constr_type = (is_constr_type_func *) AddressOf(lpsolve, \"is_constr_type\");\n  _is_debug = (is_debug_func *) AddressOf(lpsolve, \"is_debug\");\n  _is_feasible = (is_feasible_func *) AddressOf(lpsolve, \"is_feasible\");\n  _is_unbounded = (is_unbounded_func *) AddressOf(lpsolve, \"is_unbounded\");\n  _is_infinite = (is_infinite_func *) AddressOf(lpsolve, \"is_infinite\");\n  _is_int = (is_int_func *) AddressOf(lpsolve, \"is_int\");\n  _is_integerscaling = (is_integerscaling_func *) AddressOf(lpsolve, \"is_integerscaling\");\n  _is_lag_trace = (is_lag_trace_func *) AddressOf(lpsolve, \"is_lag_trace\");\n  _is_maxim = (is_maxim_func *) AddressOf(lpsolve, \"is_maxim\");\n  _is_nativeBFP = (is_nativeBFP_func *) AddressOf(lpsolve, \"is_nativeBFP\");\n  _is_nativeXLI = (is_nativeXLI_func *) AddressOf(lpsolve, \"is_nativeXLI\");\n  _is_negative = (is_negative_func *) AddressOf(lpsolve, \"is_negative\");\n  _is_piv_mode = (is_piv_mode_func *) AddressOf(lpsolve, \"is_piv_mode\");\n  _is_piv_rule = (is_piv_rule_func *) AddressOf(lpsolve, \"is_piv_rule\");\n  _is_presolve = (is_presolve_func *) AddressOf(lpsolve, \"is_presolve\");\n  _is_scalemode = (is_scalemode_func *) AddressOf(lpsolve, \"is_scalemode\");\n  _is_scaletype = (is_scaletype_func *) AddressOf(lpsolve, \"is_scaletype\");\n  _is_semicont = (is_semicont_func *) AddressOf(lpsolve, \"is_semicont\");\n  _is_SOS_var = (is_SOS_var_func *) AddressOf(lpsolve, \"is_SOS_var\");\n  _is_trace = (is_trace_func *) AddressOf(lpsolve, \"is_trace\");\n  _is_use_names = (is_use_names_func *) AddressOf(lpsolve, \"is_use_names\");\n  _lp_solve_version = (lp_solve_version_func *) AddressOf(lpsolve, \"lp_solve_version\");\n  _make_lp = (make_lp_func *) AddressOf(lpsolve, \"make_lp\");\n  _print_constraints = (print_constraints_func *) AddressOf(lpsolve, \"print_constraints\");\n  _print_debugdump = (print_debugdump_func *) AddressOf(lpsolve, \"print_debugdump\");\n  _print_duals = (print_duals_func *) AddressOf(lpsolve, \"print_duals\");\n  _print_lp = (print_lp_func *) AddressOf(lpsolve, \"print_lp\");\n  _print_objective = (print_objective_func *) AddressOf(lpsolve, \"print_objective\");\n  _print_scales = (print_scales_func *) AddressOf(lpsolve, \"print_scales\");\n  _print_solution = (print_solution_func *) AddressOf(lpsolve, \"print_solution\");\n  _print_str = (print_str_func *) AddressOf(lpsolve, \"print_str\");\n  _print_tableau = (print_tableau_func *) AddressOf(lpsolve, \"print_tableau\");\n  _put_abortfunc = (put_abortfunc_func *) AddressOf(lpsolve, \"put_abortfunc\");\n  _put_bb_nodefunc = (put_bb_nodefunc_func *) AddressOf(lpsolve, \"put_bb_nodefunc\");\n  _put_bb_branchfunc = (put_bb_branchfunc_func *) AddressOf(lpsolve, \"put_bb_branchfunc\");\n  _put_logfunc = (put_logfunc_func *) AddressOf(lpsolve, \"put_logfunc\");\n  _put_msgfunc = (put_msgfunc_func *) AddressOf(lpsolve, \"put_msgfunc\");\n  _read_LP = (read_LP_func *) AddressOf(lpsolve, \"read_LP\");\n  _read_MPS = (read_MPS_func *) AddressOf(lpsolve, \"read_MPS\");\n  _read_XLI = (read_XLI_func *) AddressOf(lpsolve, \"read_XLI\");\n  _read_params = (read_params_func *) AddressOf(lpsolve, \"read_params\");\n  _read_basis = (read_basis_func *) AddressOf(lpsolve, \"read_basis\");\n  _reset_basis = (reset_basis_func *) AddressOf(lpsolve, \"reset_basis\");\n  _reset_params = (reset_params_func *) AddressOf(lpsolve, \"reset_params\");\n  _report = (reportfunc *) AddressOf(lpsolve, \"report\");\n  _resize_lp = (resize_lp_func *) AddressOf(lpsolve, \"resize_lp\");\n  _set_add_rowmode = (set_add_rowmode_func *) AddressOf(lpsolve, \"set_add_rowmode\");\n  _set_anti_degen = (set_anti_degen_func *) AddressOf(lpsolve, \"set_anti_degen\");\n  _set_basisvar = (set_basisvar_func *) AddressOf(lpsolve, \"set_basisvar\");\n  _set_basis = (set_basis_func *) AddressOf(lpsolve, \"set_basis\");\n  _set_basiscrash = (set_basiscrash_func *) AddressOf(lpsolve, \"set_basiscrash\");\n  _set_bb_depthlimit = (set_bb_depthlimit_func *) AddressOf(lpsolve, \"set_bb_depthlimit\");\n  _set_bb_floorfirst = (set_bb_floorfirst_func *) AddressOf(lpsolve, \"set_bb_floorfirst\");\n  _set_bb_rule = (set_bb_rule_func *) AddressOf(lpsolve, \"set_bb_rule\");\n  _set_BFP = (set_BFP_func *) AddressOf(lpsolve, \"set_BFP\");\n  _set_binary = (set_binary_func *) AddressOf(lpsolve, \"set_binary\");\n  _set_bounds = (set_bounds_func *) AddressOf(lpsolve, \"set_bounds\");\n  _set_bounds_tighter = (set_bounds_tighter_func *) AddressOf(lpsolve, \"set_bounds_tighter\");\n  _set_break_at_first = (set_break_at_first_func *) AddressOf(lpsolve, \"set_break_at_first\");\n  _set_break_at_value = (set_break_at_value_func *) AddressOf(lpsolve, \"set_break_at_value\");\n  _set_column = (set_column_func *) AddressOf(lpsolve, \"set_column\");\n  _set_columnex = (set_columnex_func *) AddressOf(lpsolve, \"set_columnex\");\n  _set_col_name = (set_col_name_func *) AddressOf(lpsolve, \"set_col_name\");\n  _set_constr_type = (set_constr_type_func *) AddressOf(lpsolve, \"set_constr_type\");\n  _set_debug = (set_debug_func *) AddressOf(lpsolve, \"set_debug\");\n  _set_epsb = (set_epsb_func *) AddressOf(lpsolve, \"set_epsb\");\n  _set_epsd = (set_epsd_func *) AddressOf(lpsolve, \"set_epsd\");\n  _set_epsel = (set_epsel_func *) AddressOf(lpsolve, \"set_epsel\");\n  _set_epsint = (set_epsint_func *) AddressOf(lpsolve, \"set_epsint\");\n  _set_epslevel = (set_epslevel_func *) AddressOf(lpsolve, \"set_epslevel\");\n  _set_epsperturb = (set_epsperturb_func *) AddressOf(lpsolve, \"set_epsperturb\");\n  _set_epspivot = (set_epspivot_func *) AddressOf(lpsolve, \"set_epspivot\");\n  _set_unbounded = (set_unbounded_func *) AddressOf(lpsolve, \"set_unbounded\");\n  _set_improve = (set_improve_func *) AddressOf(lpsolve, \"set_improve\");\n  _set_infinite = (set_infinite_func *) AddressOf(lpsolve, \"set_infinite\");\n  _set_int = (set_int_func *) AddressOf(lpsolve, \"set_int\");\n  _set_lag_trace = (set_lag_trace_func *) AddressOf(lpsolve, \"set_lag_trace\");\n  _set_lowbo = (set_lowbo_func *) AddressOf(lpsolve, \"set_lowbo\");\n  _set_lp_name = (set_lp_name_func *) AddressOf(lpsolve, \"set_lp_name\");\n  _set_mat = (set_mat_func *) AddressOf(lpsolve, \"set_mat\");\n  _set_maxim = (set_maxim_func *) AddressOf(lpsolve, \"set_maxim\");\n  _set_maxpivot = (set_maxpivot_func *) AddressOf(lpsolve, \"set_maxpivot\");\n  _set_minim = (set_minim_func *) AddressOf(lpsolve, \"set_minim\");\n  _set_mip_gap = (set_mip_gap_func *) AddressOf(lpsolve, \"set_mip_gap\");\n  _set_multiprice = (set_multiprice_func *) AddressOf(lpsolve, \"set_multiprice\");\n  _set_negrange = (set_negrange_func *) AddressOf(lpsolve, \"set_negrange\");\n  _set_obj_bound = (set_obj_bound_func *) AddressOf(lpsolve, \"set_obj_bound\");\n  _set_obj_fn = (set_obj_fn_func *) AddressOf(lpsolve, \"set_obj_fn\");\n  _set_obj_fnex = (set_obj_fnex_func *) AddressOf(lpsolve, \"set_obj_fnex\");\n  _set_obj = (set_obj_func *) AddressOf(lpsolve, \"set_obj\");\n  _set_outputfile = (set_outputfile_func *) AddressOf(lpsolve, \"set_outputfile\");\n  _set_outputstream = (set_outputstream_func *) AddressOf(lpsolve, \"set_outputstream\");\n  _set_partialprice = (set_partialprice_func *) AddressOf(lpsolve, \"set_partialprice\");\n  _set_pivoting = (set_pivoting_func *) AddressOf(lpsolve, \"set_pivoting\");\n  _set_preferdual = (set_preferdual_func *) AddressOf(lpsolve, \"set_preferdual\");\n  _set_presolve = (set_presolve_func *) AddressOf(lpsolve, \"set_presolve\");\n  _set_print_sol = (set_print_sol_func *) AddressOf(lpsolve, \"set_print_sol\");\n  _set_pseudocosts = (set_pseudocosts_func *) AddressOf(lpsolve, \"set_pseudocosts\");\n  _set_rh = (set_rh_func *) AddressOf(lpsolve, \"set_rh\");\n  _set_rh_range = (set_rh_range_func *) AddressOf(lpsolve, \"set_rh_range\");\n  _set_rh_vec = (set_rh_vec_func *) AddressOf(lpsolve, \"set_rh_vec\");\n  _set_row = (set_row_func *) AddressOf(lpsolve, \"set_row\");\n  _set_rowex = (set_rowex_func *) AddressOf(lpsolve, \"set_rowex\");\n  _set_row_name = (set_row_name_func *) AddressOf(lpsolve, \"set_row_name\");\n  _set_scalelimit = (set_scalelimit_func *) AddressOf(lpsolve, \"set_scalelimit\");\n  _set_scaling = (set_scaling_func *) AddressOf(lpsolve, \"set_scaling\");\n  _set_semicont = (set_semicont_func *) AddressOf(lpsolve, \"set_semicont\");\n  _set_sense = (set_sense_func *) AddressOf(lpsolve, \"set_sense\");\n  _set_simplextype = (set_simplextype_func *) AddressOf(lpsolve, \"set_simplextype\");\n  _set_solutionlimit = (set_solutionlimit_func *) AddressOf(lpsolve, \"set_solutionlimit\");\n  _set_timeout = (set_timeout_func *) AddressOf(lpsolve, \"set_timeout\");\n  _set_trace = (set_trace_func *) AddressOf(lpsolve, \"set_trace\");\n  _set_upbo = (set_upbo_func *) AddressOf(lpsolve, \"set_upbo\");\n  _set_var_branch = (set_var_branch_func *) AddressOf(lpsolve, \"set_var_branch\");\n  _set_var_weights = (set_var_weights_func *) AddressOf(lpsolve, \"set_var_weights\");\n  _set_verbose = (set_verbose_func *) AddressOf(lpsolve, \"set_verbose\");\n  _set_XLI = (set_XLI_func *) AddressOf(lpsolve, \"set_XLI\");\n  _solve = (solve_func *) AddressOf(lpsolve, \"solve\");\n  _str_add_column = (str_add_column_func *) AddressOf(lpsolve, \"str_add_column\");\n  _str_add_constraint = (str_add_constraint_func *) AddressOf(lpsolve, \"str_add_constraint\");\n  _str_add_lag_con = (str_add_lag_con_func *) AddressOf(lpsolve, \"str_add_lag_con\");\n  _str_set_obj_fn = (str_set_obj_fn_func *) AddressOf(lpsolve, \"str_set_obj_fn\");\n  _str_set_rh_vec = (str_set_rh_vec_func *) AddressOf(lpsolve, \"str_set_rh_vec\");\n  _time_elapsed = (time_elapsed_func *) AddressOf(lpsolve, \"time_elapsed\");\n  _unscale = (unscale_func *) AddressOf(lpsolve, \"unscale\");\n  _write_lp = (write_lp_func *) AddressOf(lpsolve, \"write_lp\");\n  _write_LP = (write_LP_func *) AddressOf(lpsolve, \"write_LP\");\n  _write_mps = (write_mps_func *) AddressOf(lpsolve, \"write_mps\");\n  _write_MPS = (write_MPS_func *) AddressOf(lpsolve, \"write_MPS\");\n  _write_freemps = (write_freemps_func *) AddressOf(lpsolve, \"write_freemps\");\n  _write_freeMPS = (write_freeMPS_func *) AddressOf(lpsolve, \"write_freeMPS\");\n  _write_XLI = (write_XLI_func *) AddressOf(lpsolve, \"write_XLI\");\n  _write_basis = (write_basis_func *) AddressOf(lpsolve, \"write_basis\");\n  _write_params = (write_params_func *) AddressOf(lpsolve, \"write_params\");\n\n  return(TRUE);\n# undef AddressOf\n}\n\n#else\n#  error Either LPSOLVEAPIFROMLPREC or LPSOLVEAPIFROMLIB must be defined\n#endif\n\n#define add_column _add_column\n#define add_columnex _add_columnex\n#define add_constraint _add_constraint\n#define add_constraintex _add_constraintex\n#define add_lag_con _add_lag_con\n#define add_SOS _add_SOS\n#define column_in_lp _column_in_lp\n#define copy_lp _copy_lp\n#define default_basis _default_basis\n#define del_column _del_column\n#define del_constraint _del_constraint\n#define delete_lp _delete_lp\n#define dualize_lp _dualize_lp\n#define free_lp _free_lp\n#define get_anti_degen _get_anti_degen\n#define get_basis _get_basis\n#define get_basiscrash _get_basiscrash\n#define get_bb_depthlimit _get_bb_depthlimit\n#define get_bb_floorfirst _get_bb_floorfirst\n#define get_bb_rule _get_bb_rule\n#define get_bounds_tighter _get_bounds_tighter\n#define get_break_at_value _get_break_at_value\n#define get_col_name _get_col_name\n#define get_column _get_column\n#define get_columnex _get_columnex\n#define get_constr_type _get_constr_type\n#define get_constr_value _get_constr_value\n#define get_constraints _get_constraints\n#define get_dual_solution _get_dual_solution\n#define get_epsb _get_epsb\n#define get_epsd _get_epsd\n#define get_epsel _get_epsel\n#define get_epsint _get_epsint\n#define get_epsperturb _get_epsperturb\n#define get_epspivot _get_epspivot\n#define get_improve _get_improve\n#define get_infinite _get_infinite\n#define get_lambda _get_lambda\n#define get_lowbo _get_lowbo\n#define get_lp_index _get_lp_index\n#define get_lp_name _get_lp_name\n#define get_Lrows _get_Lrows\n#define get_mat _get_mat\n#define get_mat_byindex _get_mat_byindex\n#define get_max_level _get_max_level\n#define get_maxpivot _get_maxpivot\n#define get_mip_gap _get_mip_gap\n#define get_multiprice _get_multiprice\n#define get_nameindex _get_nameindex\n#define get_Ncolumns _get_Ncolumns\n#define get_negrange _get_negrange\n#define get_nonzeros _get_nonzeros\n#define get_Norig_columns _get_Norig_columns\n#define get_Norig_rows _get_Norig_rows\n#define get_Nrows _get_Nrows\n#define get_obj_bound _get_obj_bound\n#define get_objective _get_objective\n#define get_orig_index _get_orig_index\n#define get_origcol_name _get_origcol_name\n#define get_origrow_name _get_origrow_name\n#define get_partialprice _get_partialprice\n#define get_pivoting _get_pivoting\n#define get_presolve _get_presolve\n#define get_presolveloops _get_presolveloops\n#define get_primal_solution _get_primal_solution\n#define get_print_sol _get_print_sol\n#define get_pseudocosts _get_pseudocosts\n#define get_ptr_constraints _get_ptr_constraints\n#define get_ptr_dual_solution _get_ptr_dual_solution\n#define get_ptr_lambda _get_ptr_lambda\n#define get_ptr_primal_solution _get_ptr_primal_solution\n#define get_ptr_sensitivity_obj _get_ptr_sensitivity_obj\n#define get_ptr_sensitivity_objex _get_ptr_sensitivity_objex\n#define get_ptr_sensitivity_rhs _get_ptr_sensitivity_rhs\n#define get_ptr_variables _get_ptr_variables\n#define get_rh _get_rh\n#define get_rh_range _get_rh_range\n#define get_row _get_row\n#define get_rowex _get_rowex\n#define get_row_name _get_row_name\n#define get_scalelimit _get_scalelimit\n#define get_scaling _get_scaling\n#define get_sensitivity_obj _get_sensitivity_obj\n#define get_sensitivity_objex _get_sensitivity_objex\n#define get_sensitivity_rhs _get_sensitivity_rhs\n#define get_simplextype _get_simplextype\n#define get_solutioncount _get_solutioncount\n#define get_solutionlimit _get_solutionlimit\n#define get_status _get_status\n#define get_statustext _get_statustext\n#define get_timeout _get_timeout\n#define get_total_iter _get_total_iter\n#define get_total_nodes _get_total_nodes\n#define get_upbo _get_upbo\n#define get_var_branch _get_var_branch\n#define get_var_dualresult _get_var_dualresult\n#define get_var_primalresult _get_var_primalresult\n#define get_var_priority _get_var_priority\n#define get_variables _get_variables\n#define get_verbose _get_verbose\n#define get_working_objective _get_working_objective\n#define guess_basis _guess_basis\n#define has_BFP _has_BFP\n#define has_XLI _has_XLI\n#define is_add_rowmode _is_add_rowmode\n#define is_anti_degen _is_anti_degen\n#define is_binary _is_binary\n#define is_break_at_first _is_break_at_first\n#define is_constr_type _is_constr_type\n#define is_debug _is_debug\n#define is_feasible _is_feasible\n#define is_unbounded _is_unbounded\n#define is_infinite _is_infinite\n#define is_int _is_int\n#define is_integerscaling _is_integerscaling\n#define is_lag_trace _is_lag_trace\n#define is_maxim _is_maxim\n#define is_nativeBFP _is_nativeBFP\n#define is_nativeXLI _is_nativeXLI\n#define is_negative _is_negative\n#define is_piv_mode _is_piv_mode\n#define is_piv_rule _is_piv_rule\n#define is_presolve _is_presolve\n#define is_scalemode _is_scalemode\n#define is_scaletype _is_scaletype\n#define is_semicont _is_semicont\n#define is_SOS_var _is_SOS_var\n#define is_trace _is_trace\n#define is_use_names _is_use_names\n#define lp_solve_version _lp_solve_version\n#define make_lp _make_lp\n#define print_constraints _print_constraints\n#define print_debugdump _print_debugdump\n#define print_duals _print_duals\n#define print_lp _print_lp\n#define print_objective _print_objective\n#define print_scales _print_scales\n#define print_solution _print_solution\n#define print_str _print_str\n#define print_tableau _print_tableau\n#define put_abortfunc _put_abortfunc\n#define put_bb_nodefunc _put_bb_nodefunc\n#define put_bb_branchfunc _put_bb_branchfunc\n#define put_logfunc _put_logfunc\n#define put_msgfunc _put_msgfunc\n#define read_LP _read_LP\n#define read_MPS _read_MPS\n#define read_XLI _read_XLI\n#define read_params _read_params\n#define read_basis _read_basis\n#define reset_basis _reset_basis\n#define reset_params _reset_params\n#define report _report\n#define resize_lp _resize_lp\n#define set_add_rowmode _set_add_rowmode\n#define set_anti_degen _set_anti_degen\n#define set_basisvar _set_basisvar\n#define set_basis _set_basis\n#define set_basiscrash _set_basiscrash\n#define set_bb_depthlimit _set_bb_depthlimit\n#define set_bb_floorfirst _set_bb_floorfirst\n#define set_bb_rule _set_bb_rule\n#define set_BFP _set_BFP\n#define set_binary _set_binary\n#define set_bounds _set_bounds\n#define set_bounds_tighter _set_bounds_tighter\n#define set_break_at_first _set_break_at_first\n#define set_break_at_value _set_break_at_value\n#define set_column _set_column\n#define set_columnex _set_columnex\n#define set_col_name _set_col_name\n#define set_constr_type _set_constr_type\n#define set_debug _set_debug\n#define set_epsb _set_epsb\n#define set_epsd _set_epsd\n#define set_epsel _set_epsel\n#define set_epsint _set_epsint\n#define set_epslevel _set_epslevel\n#define set_epsperturb _set_epsperturb\n#define set_epspivot _set_epspivot\n#define set_unbounded _set_unbounded\n#define set_improve _set_improve\n#define set_infinite _set_infinite\n#define set_int _set_int\n#define set_lag_trace _set_lag_trace\n#define set_lowbo _set_lowbo\n#define set_lp_name _set_lp_name\n#define set_mat _set_mat\n#define set_maxim _set_maxim\n#define set_maxpivot _set_maxpivot\n#define set_minim _set_minim\n#define set_mip_gap _set_mip_gap\n#define set_multiprice _set_multiprice\n#define set_negrange _set_negrange\n#define set_obj_bound _set_obj_bound\n#define set_obj_fn _set_obj_fn\n#define set_obj_fnex _set_obj_fnex\n#define set_obj _set_obj\n#define set_outputfile _set_outputfile\n#define set_outputstream _set_outputstream\n#define set_partialprice _set_partialprice\n#define set_pivoting _set_pivoting\n#define set_preferdual _set_preferdual\n#define set_presolve _set_presolve\n#define set_print_sol _set_print_sol\n#define set_pseudocosts _set_pseudocosts\n#define set_rh _set_rh\n#define set_rh_range _set_rh_range\n#define set_rh_vec _set_rh_vec\n#define set_row _set_row\n#define set_rowex _set_rowex\n#define set_row_name _set_row_name\n#define set_scalelimit _set_scalelimit\n#define set_scaling _set_scaling\n#define set_semicont _set_semicont\n#define set_sense _set_sense\n#define set_simplextype _set_simplextype\n#define set_solutionlimit _set_solutionlimit\n#define set_timeout _set_timeout\n#define set_trace _set_trace\n#define set_upbo _set_upbo\n#define set_var_branch _set_var_branch\n#define set_var_weights _set_var_weights\n#define set_verbose _set_verbose\n#define set_XLI _set_XLI\n#define solve _solve\n#define str_add_column _str_add_column\n#define str_add_constraint _str_add_constraint\n#define str_add_lag_con _str_add_lag_con\n#define str_set_obj_fn _str_set_obj_fn\n#define str_set_rh_vec _str_set_rh_vec\n#define time_elapsed _time_elapsed\n#define unscale _unscale\n#define write_lp _write_lp\n#define write_LP _write_LP\n#define write_mps _write_mps\n#define write_MPS _write_MPS\n#define write_freemps _write_freemps\n#define write_freeMPS _write_freeMPS\n#define write_XLI _write_XLI\n#define write_basis _write_basis\n#define write_params _write_params\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_fortify.h",
    "content": "#ifdef FORTIFY\n\n#include \"fortify.h\"\n\n#endif\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_lib.c",
    "content": "\n/* ----------------------------------------------------------------------------------\n   Main library of routines for lp_solve v5.0+\n   ----------------------------------------------------------------------------------\n    Author:        Michel Berkelaar (to v3.2)\n                   Kjell Eikland    (v4.0 and forward)\n    Contact:       kjell.eikland@broadpark.no\n    License terms: LGPL.\n\n    Requires:      (see below)\n\n    Release notes:\n    v5.0.0  1 January 2004      First integrated and repackaged version.\n    v5.0.1  8 May 2004          Cumulative update since initial release;\n                                overall functionality scope maintained.\n    v5.1.0  20 July 2004        Reworked lp_solve throughout to fit new\n                                flexible matrix storage model.\n\n   ---------------------------------------------------------------------------------- */\n\n/* ---------------------------------------------------------------------------------- */\n/* Main library of routines for lp_solve                                              */\n/*----------------------------------------------------------------------------------- */\n#include <signal.h>\n#include <string.h>\n#include <float.h>\n#include <math.h>\n\n#if LoadInverseLib == TRUE\n  #ifdef WIN32\n    #include <windows.h>\n  #else\n    #include <dlfcn.h>\n  #endif\n#endif\n\n\n/* ---------------------------------------------------------------------------------- */\n/* Include core and support modules via headers                                       */\n/* ---------------------------------------------------------------------------------- */\n#include \"lp_lib.h\"\n#include \"commonlib.h\"\n#include \"lp_utils.h\"\n#include \"lp_matrix.h\"\n#include \"lp_SOS.h\"\n#include \"lp_Hash.h\"\n#include \"lp_MPS.h\"\n#include \"lp_wlp.h\"\n#include \"lp_presolve.h\"\n#include \"lp_scale.h\"\n#include \"lp_simplex.h\"\n#include \"lp_mipbb.h\"\n#include \"lp_report.h\"\n#include \"lp_MDO.h\"\n#include \"lp_bit.h\"\n\n#if INVERSE_ACTIVE==INVERSE_LUMOD\n  #include \"lp_LUMOD.h\"\n#elif INVERSE_ACTIVE==INVERSE_LUSOL\n  #include \"lp_LUSOL.h\"\n#elif INVERSE_ACTIVE==INVERSE_GLPKLU\n  #include \"lp_glpkLU.h\"\n#elif INVERSE_ACTIVE==INVERSE_ETAPFI\n  #include \"lp_etaPFI.h\"\n#elif INVERSE_ACTIVE==INVERSE_LEGACY\n  #include \"lp_etaPFI.h\"\n#endif\n\n#if libBLAS > 0\n  #include \"myblas.h\"\n#endif\n\n#ifdef __BORLANDC__\n  #pragma hdrstop\n  #pragma package(smart_init)\n#endif\n\n/* ---------------------------------------------------------------------------------- */\n/* Include selected basis inverse routines and price norm scalars                     */\n/* ---------------------------------------------------------------------------------- */\n\n#include \"lp_price.h\"\n#include \"lp_pricePSE.h\"\n\n#ifdef FORTIFY\n# include \"lp_fortify.h\"\n#endif\n\n#define sensrejvar TRUE\n\n/* Return lp_solve version information */\nvoid __WINAPI lp_solve_version(int *majorversion, int *minorversion, int *release, int *build)\n{\n  if(majorversion != NULL)\n    (*majorversion) = MAJORVERSION;\n  if(minorversion != NULL)\n    (*minorversion) = MINORVERSION;\n  if(release != NULL)\n    (*release) = RELEASE;\n  if(build != NULL)\n    (*build) = BUILD;\n}\n\n\n/* ---------------------------------------------------------------------------------- */\n/* Various interaction elements                                                       */\n/* ---------------------------------------------------------------------------------- */\n\nMYBOOL __WINAPI userabort(lprec *lp, int message)\n{\n  MYBOOL abort;\n  int spx_save;\n\n  spx_save = lp->spx_status;\n  lp->spx_status = RUNNING;\n  if(yieldformessages(lp) != 0) {\n    lp->spx_status = USERABORT;\n    if(lp->bb_level > 0)\n      lp->bb_break = TRUE;\n  }\n  if((message > 0) && (lp->usermessage != NULL) && (lp->msgmask & message))\n    lp->usermessage(lp, lp->msghandle, message);\n  abort = (MYBOOL) (lp->spx_status != RUNNING);\n  if(!abort)\n    lp->spx_status = spx_save;\n  return( abort );\n}\n\nSTATIC int yieldformessages(lprec *lp)\n{\n  if((lp->sectimeout > 0) &&\n     ((timeNow()-lp->timestart)-(REAL)lp->sectimeout>0))\n    lp->spx_status = TIMEOUT;\n\n  if(lp->ctrlc != NULL) {\n    int retcode = lp->ctrlc(lp, lp->ctrlchandle);\n    /* Check for command to restart the B&B */\n    if((retcode == ACTION_RESTART) && (lp->bb_level > 1)) {\n      lp->bb_break = AUTOMATIC;\n      retcode = 0;\n    }\n    return(retcode);\n  }\n  else\n    return(0);\n}\n\nvoid __WINAPI set_outputstream(lprec *lp, FILE *stream)\n{\n  if((lp->outstream != NULL) && (lp->outstream != stdout)) {\n    if(lp->streamowned)\n      fclose(lp->outstream);\n    else\n      fflush(lp->outstream);\n  }\n  if(stream == NULL)\n    lp->outstream = stdout;\n  else\n    lp->outstream = stream;\n  lp->streamowned = FALSE;\n}\n\nMYBOOL __WINAPI set_outputfile(lprec *lp, char *filename)\n{\n  MYBOOL ok;\n  FILE   *output = stdout;\n\n  ok = (MYBOOL) ((filename == NULL) || (*filename == 0) || ((output = fopen(filename,\"w\")) != NULL));\n  if(ok) {\n    set_outputstream(lp, output);\n    lp->streamowned = (MYBOOL) ((filename != NULL) && (*filename != 0));\n#if 1\n    if((filename != NULL) && (*filename == 0))\n      lp->outstream = NULL;\n#endif\n  }\n  return(ok);\n}\n\nREAL __WINAPI time_elapsed(lprec *lp)\n{\n  if(lp->timeend > 0)\n    return(lp->timeend - lp->timestart);\n  else\n    return(timeNow() - lp->timestart);\n}\n\nvoid __WINAPI put_bb_nodefunc(lprec *lp, lphandleint_intfunc newnode, void *bbnodehandle)\n{\n  lp->bb_usenode = newnode;\n  lp->bb_nodehandle = bbnodehandle;         /* User-specified \"owner process ID\" */\n}\nvoid __WINAPI put_bb_branchfunc(lprec *lp, lphandleint_intfunc newbranch, void *bbbranchhandle)\n{\n  lp->bb_usebranch = newbranch;\n  lp->bb_branchhandle = bbbranchhandle;     /* User-specified \"owner process ID\" */\n}\nvoid __WINAPI put_abortfunc(lprec *lp, lphandle_intfunc newctrlc, void *ctrlchandle)\n{\n  lp->ctrlc = newctrlc;\n  lp->ctrlchandle = ctrlchandle;            /* User-specified \"owner process ID\" */\n}\nvoid __WINAPI put_logfunc(lprec *lp, lphandlestr_func newlog, void *loghandle)\n{\n  lp->writelog = newlog;\n  lp->loghandle = loghandle;                /* User-specified \"owner process ID\" */\n}\nvoid __WINAPI put_msgfunc(lprec *lp, lphandleint_func newmsg, void *msghandle, int mask)\n{\n  lp->usermessage = newmsg;\n  lp->msghandle = msghandle;                /* User-specified \"owner process ID\" */\n  lp->msgmask = mask;\n}\n\n\n/* ---------------------------------------------------------------------------------- */\n/* DLL exported function                                                              */\n/* ---------------------------------------------------------------------------------- */\nlprec * __WINAPI read_MPS(char *filename, int options)\n{\n  lprec *lp = NULL;\n  int typeMPS;\n\n  typeMPS = (options & ~0x07) >> 2;\n  if ((typeMPS & (MPSFIXED|MPSFREE)) == 0)\n    typeMPS |= MPSFIXED;\n  if(MPS_readfile(&lp, filename, typeMPS, options & 0x07))\n    return( lp );\n  else\n    return( NULL );\n}\nlprec * __WINAPI read_mps(FILE *filename, int options)\n{\n  lprec *lp = NULL;\n  int typeMPS;\n\n  typeMPS = (options & ~0x07) >> 2;\n  if ((typeMPS & (MPSFIXED|MPSFREE)) == 0)\n    typeMPS |= MPSFIXED;\n  if(MPS_readhandle(&lp, filename, typeMPS, options & 0x07))\n    return( lp );\n  else\n    return( NULL );\n}\n/* #if defined develop */\nlprec * __WINAPI read_mpsex(void *userhandle, read_modeldata_func read_modeldata, int options)\n{\n  lprec *lp = NULL;\n  int typeMPS;\n\n  typeMPS = (options & ~0x07) >> 2;\n  if ((typeMPS & (MPSFIXED|MPSFREE)) == 0)\n    typeMPS |= MPSFIXED;\n  if(MPS_readex(&lp, userhandle, read_modeldata, typeMPS, options & 0x07))\n    return( lp );\n  else\n    return( NULL );\n}\n/* #endif */\nlprec * __WINAPI read_freeMPS(char *filename, int options)\n{\n  lprec *lp = NULL;\n  int typeMPS;\n\n  typeMPS = (options & ~0x07) >> 2;\n  typeMPS &= ~MPSFIXED;\n  typeMPS |= MPSFREE;\n  if(MPS_readfile(&lp, filename, typeMPS, options & 0x07))\n    return( lp );\n  else\n    return( NULL );\n}\nlprec * __WINAPI read_freemps(FILE *filename, int options)\n{\n  lprec *lp = NULL;\n  int typeMPS;\n\n  typeMPS = (options & ~0x07) >> 2;\n  typeMPS &= ~MPSFIXED;\n  typeMPS |= MPSFREE;\n  if(MPS_readhandle(&lp, filename, typeMPS, options & 0x07))\n    return( lp );\n  else\n    return( NULL );\n}\n/* #if defined develop */\nlprec * __WINAPI read_freempsex(void *userhandle, read_modeldata_func read_modeldata, int options)\n{\n  lprec *lp = NULL;\n  int typeMPS;\n\n  typeMPS = (options & ~0x07) >> 2;\n  typeMPS &= ~MPSFIXED;\n  typeMPS |= MPSFREE;\n  if(MPS_readex(&lp, userhandle, read_modeldata, typeMPS, options & 0x07))\n    return( lp );\n  else\n    return( NULL );\n}\n/* #endif */\nMYBOOL __WINAPI write_mps(lprec *lp, char *filename)\n{\n  return(MPS_writefile(lp, MPSFIXED, filename));\n}\nMYBOOL __WINAPI write_MPS(lprec *lp, FILE *output)\n{\n  return(MPS_writehandle(lp, MPSFIXED, output));\n}\n\nMYBOOL __WINAPI write_freemps(lprec *lp, char *filename)\n{\n  return(MPS_writefile(lp, MPSFREE, filename));\n}\nMYBOOL __WINAPI write_freeMPS(lprec *lp, FILE *output)\n{\n  return(MPS_writehandle(lp, MPSFREE, output));\n}\n\nMYBOOL __WINAPI write_lp(lprec *lp, char *filename)\n{\n  return(LP_writefile(lp, filename));\n}\nMYBOOL __WINAPI write_LP(lprec *lp, FILE *output)\n{\n  return(LP_writehandle(lp, output));\n}\n#ifndef PARSER_LP\nMYBOOL __WINAPI LP_readhandle(lprec **lp, FILE *filename, int verbose, char *lp_name)\n{\n  return(FALSE);\n}\nlprec * __WINAPI read_lp(FILE *filename, int verbose, char *lp_name)\n{\n  return(NULL);\n}\nlprec * __WINAPI read_LP(char *filename, int verbose, char *lp_name)\n{\n  return(NULL);\n}\n#endif\n\nMYBOOL __WINAPI write_basis(lprec *lp, char *filename)\n{\n  int typeMPS = MPSFIXED;\n  return( MPS_writeBAS(lp, typeMPS, filename) );\n}\nMYBOOL __WINAPI read_basis(lprec *lp, char *filename, char *info)\n{\n  int typeMPS = MPSFIXED;\n\n  typeMPS = MPS_readBAS(lp, typeMPS, filename, info);\n\n  /* Code basis */\n  if(typeMPS) {\n    set_action(&lp->spx_action, ACTION_REBASE | ACTION_REINVERT | ACTION_RECOMPUTE);\n    lp->basis_valid = TRUE;   /* Do not re-initialize basis on entering Solve */\n    lp->var_basic[0] = FALSE; /* Set to signal that this is a non-default basis */\n  }\n  return( (MYBOOL) typeMPS );\n}\n\n/* Write and read lp_solve parameters (placeholders) - see lp_params.c */\nvoid __WINAPI reset_params(lprec *lp)\n{\n  int mode;\n\n  lp->epsmachine        = DEF_EPSMACHINE;\n  lp->epsperturb        = DEF_PERTURB;\n  lp->lag_accept        = DEF_LAGACCEPT;\n  set_epslevel(lp, EPS_DEFAULT);\n\n  lp->tighten_on_set    = FALSE;\n  lp->negrange          = DEF_NEGRANGE;\n\n#if 0\n  lp->do_presolve       = PRESOLVE_ROWS | PRESOLVE_COLS | PRESOLVE_MERGEROWS |\n                          PRESOLVE_REDUCEGCD |\n                          PRESOLVE_ROWDOMINATE;\n#else\n  lp->do_presolve       = PRESOLVE_NONE;\n#endif\n  lp->presolveloops     = DEF_MAXPRESOLVELOOPS;\n\n  lp->scalelimit        = DEF_SCALINGLIMIT;\n  lp->scalemode         = SCALE_INTEGERS |\n#if 0\n                          SCALE_POWER2 |\n                          SCALE_LOGARITHMIC | SCALE_MEAN;\n#else\n                          SCALE_LINEAR | SCALE_GEOMETRIC |\n                          SCALE_EQUILIBRATE;\n#endif\n\n  lp->crashmode         = CRASH_NONE;\n\n  lp->max_pivots        = 0;\n  lp->simplex_strategy  = SIMPLEX_DUAL_PRIMAL;\n#define PricerDefaultOpt 1\n#if PricerDefaultOpt == 1\n  mode = PRICER_DEVEX;\n#elif PricerDefaultOpt == 2\n  mode = PRICER_STEEPESTEDGE;\n  mode |= PRICE_TRUENORMINIT;\n#else\n  mode = PRICER_STEEPESTEDGE | PRICE_PRIMALFALLBACK;\n#endif\n  mode |= PRICE_ADAPTIVE;\n#ifdef EnableRandomizedPricing\n  mode |= PRICE_RANDOMIZE;\n#endif\n  set_pivoting(lp, mode);\n\n  lp->improve           = IMPROVE_DEFAULT;\n  lp->anti_degen        = ANTIDEGEN_DEFAULT;\n\n  lp->bb_floorfirst     = BRANCH_AUTOMATIC;\n  lp->bb_rule           = NODE_DYNAMICMODE | NODE_GREEDYMODE | NODE_GAPSELECT |\n#if 1\n                          NODE_PSEUDOCOSTSELECT |\n#else\n                          NODE_PSEUDOFEASSELECT |\n#endif\n                          NODE_RCOSTFIXING;\n  lp->bb_limitlevel     = DEF_BB_LIMITLEVEL;\n  lp->bb_PseudoUpdates  = DEF_PSEUDOCOSTUPDATES;\n\n  lp->bb_heuristicOF    = my_chsign(is_maxim(lp), MAX(DEF_INFINITE, lp->infinite));\n  lp->bb_breakOF        = -lp->bb_heuristicOF;\n\n  lp->sectimeout        = 0;\n  lp->solutionlimit     = 1;\n\n  set_outputstream(lp, NULL);          /* Set to default output stream */\n  lp->verbose           = NORMAL;\n  lp->print_sol         = FALSE;       /* Can be FALSE, TRUE, AUTOMATIC (only non-zeros printed) */\n  lp->spx_trace         = FALSE;\n  lp->lag_trace         = FALSE;\n  lp->bb_trace          = FALSE;\n}\n\nvoid __WINAPI unscale(lprec *lp)\n{\n  undoscale(lp);\n}\nint __WINAPI solve(lprec *lp)\n{\n#if defined FPUexception\n  catchFPU(_EM_INVALID | _EM_ZERODIVIDE | _EM_OVERFLOW | _EM_UNDERFLOW);\n#endif\n\n  if(has_BFP(lp)) {\n    lp->solvecount++;\n    if(is_add_rowmode(lp))\n      set_add_rowmode(lp, FALSE);\n    return(lin_solve(lp));\n  }\n  else\n    return( NOBFP );\n}\nvoid __WINAPI print_lp(lprec *lp)\n{\n  REPORT_lp(lp);\n}\nvoid __WINAPI print_tableau(lprec *lp)\n{\n  REPORT_tableau(lp);\n}\nvoid __WINAPI print_objective(lprec *lp)\n{\n  REPORT_objective(lp);\n}\nvoid __WINAPI print_solution(lprec *lp, int columns)\n{\n  REPORT_solution(lp, columns);\n}\nvoid __WINAPI print_constraints(lprec *lp, int columns)\n{\n  REPORT_constraints(lp, columns);\n}\nvoid __WINAPI print_duals(lprec *lp)\n{\n  REPORT_duals(lp);\n}\nvoid __WINAPI print_scales(lprec *lp)\n{\n  REPORT_scales(lp);\n}\nMYBOOL __WINAPI print_debugdump(lprec *lp, char *filename)\n{\n  return(REPORT_debugdump(lp, filename, (MYBOOL) (get_total_iter(lp) > 0)));\n}\nvoid __WINAPI print_str(lprec *lp, char *str)\n{\n  report(lp, lp->verbose, \"%s\", str);\n}\n\n\n\n/* ---------------------------------------------------------------------------------- */\n/* Parameter setting and retrieval functions                                          */\n/* ---------------------------------------------------------------------------------- */\n\nvoid __WINAPI set_timeout(lprec *lp, long sectimeout)\n{\n  lp->sectimeout = sectimeout;\n}\n\nlong __WINAPI get_timeout(lprec *lp)\n{\n  return(lp->sectimeout);\n}\n\nvoid __WINAPI set_verbose(lprec *lp, int verbose)\n{\n  lp->verbose = verbose;\n}\n\nint __WINAPI get_verbose(lprec *lp)\n{\n  return(lp->verbose);\n}\n\nvoid __WINAPI set_print_sol(lprec *lp, int print_sol)\n{\n  lp->print_sol = print_sol;\n}\n\nint __WINAPI get_print_sol(lprec *lp)\n{\n  return(lp->print_sol);\n}\n\nvoid __WINAPI set_debug(lprec *lp, MYBOOL debug)\n{\n  lp->bb_trace = debug;\n}\n\nMYBOOL __WINAPI is_debug(lprec *lp)\n{\n  return(lp->bb_trace);\n}\n\nvoid __WINAPI set_trace(lprec *lp, MYBOOL trace)\n{\n  lp->spx_trace = trace;\n}\n\nMYBOOL __WINAPI is_trace(lprec *lp)\n{\n  return(lp->spx_trace);\n}\n\nvoid __WINAPI set_anti_degen(lprec *lp, int anti_degen)\n{\n  lp->anti_degen = anti_degen;\n}\n\nint __WINAPI get_anti_degen(lprec *lp)\n{\n  return(lp->anti_degen);\n}\n\nMYBOOL __WINAPI is_anti_degen(lprec *lp, int testmask)\n{\n  return((MYBOOL) ((lp->anti_degen == testmask) || ((lp->anti_degen & testmask) != 0)));\n}\n\nvoid __WINAPI set_presolve(lprec *lp, int presolvemode, int maxloops)\n{\n  presolvemode &= ~PRESOLVE_REDUCEMIP; /* disable PRESOLVE_REDUCEMIP since it is very rare that this is effective, and also that it adds code complications and delayed presolve effects that are not captured properly. */\n  lp->do_presolve = presolvemode;\n  lp->presolveloops = maxloops;\n}\n\nint __WINAPI get_presolve(lprec *lp)\n{\n  return(lp->do_presolve);\n}\n\nint __WINAPI get_presolveloops(lprec *lp)\n{\n  if(lp->presolveloops < 0)\n    return(DEF_MAXPRESOLVELOOPS);\n  else if(lp->presolveloops == 0)\n    return(MAXINT32);\n  else\n    return(lp->presolveloops);\n}\n\nMYBOOL __WINAPI is_presolve(lprec *lp, int testmask)\n{\n  return((MYBOOL) ((lp->do_presolve == testmask) || ((lp->do_presolve & testmask) != 0)));\n}\n\nvoid __WINAPI set_maxpivot(lprec *lp, int maxpivot)\n{\n  lp->max_pivots = maxpivot;\n}\n\nint __WINAPI get_maxpivot(lprec *lp)\n{\n  return( lp->bfp_pivotmax(lp) );\n}\n\nvoid __WINAPI set_bb_rule(lprec *lp, int bb_rule)\n{\n  lp->bb_rule = bb_rule;\n}\n\nint __WINAPI get_bb_rule(lprec *lp)\n{\n  return(lp->bb_rule);\n}\n\n/* INLINE */ MYBOOL is_bb_rule(lprec *lp, int bb_rule)\n{\n  return( (MYBOOL) ((lp->bb_rule & NODE_STRATEGYMASK) == bb_rule) );\n}\n\n/* INLINE */ MYBOOL is_bb_mode(lprec *lp, int bb_mask)\n{\n  return( (MYBOOL) ((lp->bb_rule & bb_mask) > 0) );\n}\n\nvoid __WINAPI set_action(int *actionvar, int actionmask)\n{\n  *actionvar |= actionmask;\n}\n\nvoid __WINAPI clear_action(int *actionvar, int actionmask)\n{\n  *actionvar &= ~actionmask;\n}\n\nMYBOOL __WINAPI is_action(int actionvar, int testmask)\n{\n  return( (MYBOOL) ((actionvar & testmask) != 0) );\n}\n\nvoid __WINAPI set_bb_depthlimit(lprec *lp, int bb_maxlevel)\n{\n  lp->bb_limitlevel = bb_maxlevel;\n}\n\nint __WINAPI get_bb_depthlimit(lprec *lp)\n{\n  return(lp->bb_limitlevel);\n}\n\nvoid __WINAPI set_obj_bound(lprec *lp, REAL bb_heuristicOF)\n{\n  lp->bb_heuristicOF = bb_heuristicOF;\n}\n\nREAL __WINAPI get_obj_bound(lprec *lp)\n{\n  return(lp->bb_heuristicOF);\n}\n\nvoid __WINAPI set_mip_gap(lprec *lp, MYBOOL absolute, REAL mip_gap)\n{\n  if(absolute)\n    lp->mip_absgap = mip_gap;\n  else\n    lp->mip_relgap = mip_gap;\n}\n\nREAL __WINAPI get_mip_gap(lprec *lp, MYBOOL absolute)\n{\n  if(absolute)\n    return(lp->mip_absgap);\n  else\n    return(lp->mip_relgap);\n}\n\nMYBOOL __WINAPI set_var_branch(lprec *lp, int colnr, int branch_mode)\n{\n  if(colnr > lp->columns || colnr < 1) {\n    report(lp, IMPORTANT, \"set_var_branch: Column %d out of range\\n\", colnr);\n    return( FALSE );\n  }\n\n  if(lp->bb_varbranch == NULL) {\n    int i;\n    if(branch_mode == BRANCH_DEFAULT)\n      return( TRUE );\n    allocMYBOOL(lp, &lp->bb_varbranch, lp->columns_alloc, FALSE);\n    for(i = 0; i < lp->columns; i++)\n      lp->bb_varbranch[i] = BRANCH_DEFAULT;\n  }\n  lp->bb_varbranch[colnr - 1] = (MYBOOL) branch_mode;\n  return( TRUE );\n}\n\nint __WINAPI get_var_branch(lprec *lp, int colnr)\n{\n  if(colnr > lp->columns || colnr < 1) {\n    report(lp, IMPORTANT, \"get_var_branch: Column %d out of range\\n\", colnr);\n    return(lp->bb_floorfirst);\n  }\n\n  if(lp->bb_varbranch == NULL)\n    return(lp->bb_floorfirst);\n  if(lp->bb_varbranch[colnr - 1] == BRANCH_DEFAULT)\n    return(lp->bb_floorfirst);\n  else\n    return(lp->bb_varbranch[colnr - 1]);\n}\n\nstatic void set_infiniteex(lprec *lp, REAL infinite, MYBOOL init)\n{\n  int i;\n\n  infinite = fabs(infinite);\n  if((init) || is_infinite(lp, lp->bb_heuristicOF))\n    lp->bb_heuristicOF = my_chsign(is_maxim(lp), infinite);\n  if((init) || is_infinite(lp, lp->bb_breakOF))\n    lp->bb_breakOF = my_chsign(is_maxim(lp), -infinite);\n  for(i = 0; i <= lp->sum; i++) {\n    if((!init) && is_infinite(lp, lp->orig_lowbo[i]))\n      lp->orig_lowbo[i] = -infinite;\n    if((init) || is_infinite(lp, lp->orig_upbo[i]))\n      lp->orig_upbo[i] = infinite;\n  }\n  lp->infinite = infinite;\n}\n\n\nMYBOOL __WINAPI is_infinite(lprec *lp, REAL value)\n{\n#if 1\n  return( (MYBOOL) (fabs(value) >= lp->infinite) );\n#else\n  if(fabs(value) >= lp->infinite)\n    return( TRUE );\n  else\n    return( FALSE );\n#endif\n}\n\nvoid __WINAPI set_infinite(lprec *lp, REAL infinite)\n{\n  set_infiniteex(lp, infinite, FALSE);\n}\n\nREAL __WINAPI get_infinite(lprec *lp)\n{\n  return(lp->infinite);\n}\n\nvoid __WINAPI set_epsperturb(lprec *lp, REAL epsperturb)\n{\n  lp->epsperturb = epsperturb;\n}\n\nREAL __WINAPI get_epsperturb(lprec *lp)\n{\n  return(lp->epsperturb);\n}\n\nvoid __WINAPI set_epspivot(lprec *lp, REAL epspivot)\n{\n  lp->epspivot = epspivot;\n}\n\nREAL __WINAPI get_epspivot(lprec *lp)\n{\n  return(lp->epspivot);\n}\n\nvoid __WINAPI set_epsint(lprec *lp, REAL epsint)\n{\n  lp->epsint = epsint;\n}\n\nREAL __WINAPI get_epsint(lprec *lp)\n{\n  return(lp->epsint);\n}\n\nvoid __WINAPI set_epsb(lprec *lp, REAL epsb)\n{\n  lp->epsprimal = MAX(epsb, lp->epsmachine);\n}\n\nREAL __WINAPI get_epsb(lprec *lp)\n{\n  return(lp->epsprimal);\n}\n\nvoid __WINAPI set_epsd(lprec *lp, REAL epsd)\n{\n  lp->epsdual = MAX(epsd, lp->epsmachine); /* Mainly used as tolerance for reduced cost */\n}\n\nREAL __WINAPI get_epsd(lprec *lp)\n{\n  return(lp->epsdual);\n}\n\nvoid __WINAPI set_epsel(lprec *lp, REAL epsel)\n{\n  lp->epsvalue = MAX(epsel, lp->epsmachine);\n}\n\nREAL __WINAPI get_epsel(lprec *lp)\n{\n  return(lp->epsvalue);\n}\n\nMYBOOL __WINAPI set_epslevel(lprec *lp, int epslevel)\n{\n  REAL SPX_RELAX, MIP_RELAX;\n\n  switch(epslevel) {\n    case EPS_TIGHT:  SPX_RELAX = 1;\n                      MIP_RELAX = 1;\n                      break;\n    case EPS_MEDIUM: SPX_RELAX = 10;\n                      MIP_RELAX = 1;\n                      break;\n    case EPS_LOOSE:  SPX_RELAX = 100;\n                      MIP_RELAX = 10;\n                      break;\n    case EPS_BAGGY:  SPX_RELAX = 1000;\n                      MIP_RELAX = 100;\n                      break;\n    default:        return( FALSE );\n  }\n  lp->epsvalue   = SPX_RELAX*DEF_EPSVALUE;\n  lp->epsprimal  = SPX_RELAX*DEF_EPSPRIMAL;\n  lp->epsdual    = SPX_RELAX*DEF_EPSDUAL;\n  lp->epspivot   = SPX_RELAX*DEF_EPSPIVOT;\n  lp->epssolution= MIP_RELAX*DEF_EPSSOLUTION;\n  lp->epsint     = MIP_RELAX*DEF_EPSINT;\n  lp->mip_absgap = MIP_RELAX*DEF_MIP_GAP;\n  lp->mip_relgap = MIP_RELAX*DEF_MIP_GAP;\n\n  return( TRUE );\n}\n\nvoid __WINAPI set_scaling(lprec *lp, int scalemode)\n{\n  lp->scalemode = scalemode;\n}\n\nint __WINAPI get_scaling(lprec *lp)\n{\n  return(lp->scalemode);\n}\n\nMYBOOL __WINAPI is_scalemode(lprec *lp, int testmask)\n{\n  return((MYBOOL) ((lp->scalemode & testmask) != 0));\n}\n\nMYBOOL __WINAPI is_scaletype(lprec *lp, int scaletype)\n{\n  int testtype;\n\n  testtype = lp->scalemode & SCALE_MAXTYPE;\n  return((MYBOOL) (scaletype == testtype));\n}\n\nvoid __WINAPI set_scalelimit(lprec *lp, REAL scalelimit)\n/* Set the relative scaling convergence criterion for the active scaling mode;\n   the integer part specifies the maximum number of iterations (default = 5). */\n{\n  lp->scalelimit = fabs(scalelimit);\n}\n\nREAL __WINAPI get_scalelimit(lprec *lp)\n{\n  return(lp->scalelimit);\n}\n\nMYBOOL __WINAPI is_integerscaling(lprec *lp)\n{\n  return(is_scalemode(lp, SCALE_INTEGERS));\n}\n\nvoid __WINAPI set_improve(lprec *lp, int improve)\n{\n  lp->improve = improve;\n}\n\nint __WINAPI get_improve(lprec *lp)\n{\n  return(lp->improve);\n}\n\nvoid __WINAPI set_lag_trace(lprec *lp, MYBOOL lag_trace)\n{\n  lp->lag_trace = lag_trace;\n}\n\nMYBOOL __WINAPI is_lag_trace(lprec *lp)\n{\n  return(lp->lag_trace);\n}\n\nvoid __WINAPI set_pivoting(lprec *lp, int pivoting)\n{\n  /* Set new pivoting strategy */\n  lp->piv_strategy = pivoting;\n  report(lp, DETAILED, \"set_pivoting: Pricing strategy set to '%s'\\n\",\n                       get_str_piv_rule(get_piv_rule(lp)));\n}\n\nint __WINAPI get_pivoting(lprec *lp)\n{\n  return( lp->piv_strategy );\n}\n\n/* INLINE */ int get_piv_rule(lprec *lp)\n{\n  return( (lp->piv_strategy | PRICE_STRATEGYMASK) ^ PRICE_STRATEGYMASK );\n}\n\nSTATIC char *get_str_piv_rule(int rule)\n{\n  static char *pivotText[PRICER_LASTOPTION+1] =\n  {\"Bland first index\", \"Dantzig\", \"Devex\", \"Steepest Edge\"};\n\n  return( pivotText[rule] );\n}\n\nMYBOOL __WINAPI is_piv_rule(lprec *lp, int rule)\n{\n  return( (MYBOOL) (get_piv_rule(lp) == rule) );\n}\n\nMYBOOL __WINAPI is_piv_mode(lprec *lp, int testmask)\n{\n  return((MYBOOL) (((testmask & PRICE_STRATEGYMASK) != 0) &&\n                   ((lp->piv_strategy & testmask) != 0)));\n}\n\nvoid __WINAPI set_break_at_first(lprec *lp, MYBOOL break_at_first)\n{\n  lp->bb_breakfirst = break_at_first;\n}\n\nMYBOOL __WINAPI is_break_at_first(lprec *lp)\n{\n  return(lp->bb_breakfirst);\n}\n\nvoid __WINAPI set_bb_floorfirst(lprec *lp, int bb_floorfirst)\n{\n  lp->bb_floorfirst = (MYBOOL) bb_floorfirst;\n}\n\nint __WINAPI get_bb_floorfirst(lprec *lp)\n{\n  return(lp->bb_floorfirst);\n}\n\nvoid __WINAPI set_break_at_value(lprec *lp, REAL break_at_value)\n{\n  lp->bb_breakOF = break_at_value;\n}\n\nREAL __WINAPI get_break_at_value(lprec *lp)\n{\n  return(lp->bb_breakOF);\n}\n\nvoid __WINAPI set_negrange(lprec *lp, REAL negrange)\n{\n  if(negrange <= 0)\n    lp->negrange = negrange;\n  else\n    lp->negrange = 0.0;\n}\n\nREAL __WINAPI get_negrange(lprec *lp)\n{\n  return(lp->negrange);\n}\n\nint __WINAPI get_max_level(lprec *lp)\n{\n  return(lp->bb_maxlevel);\n}\n\nCOUNTER __WINAPI get_total_nodes(lprec *lp)\n{\n  return(lp->bb_totalnodes);\n}\n\nCOUNTER __WINAPI get_total_iter(lprec *lp)\n{\n  return(lp->total_iter + lp->current_iter);\n}\n\nREAL __WINAPI get_objective(lprec *lp)\n{\n  if(lp->spx_status == OPTIMAL)\n    ;\n  else if(!lp->basis_valid) {\n    report(lp, CRITICAL, \"get_objective: Not a valid basis\\n\");\n    return(0.0);\n  }\n\n  return( lp->best_solution[0] );\n}\n\nint __WINAPI get_nonzeros(lprec *lp)\n{\n  return( mat_nonzeros(lp->matA) );\n}\n\nMYBOOL __WINAPI set_mat(lprec *lp, int rownr, int colnr, REAL value)\n{\n  if((rownr < 0) || (rownr > lp->rows)) {\n    report(lp, IMPORTANT, \"set_mat: Row %d out of range\\n\", rownr);\n    return( FALSE );\n  }\n  if((colnr < 1) || (colnr > lp->columns)) {\n    report(lp, IMPORTANT, \"set_mat: Column %d out of range\\n\", colnr);\n    return( FALSE );\n  }\n\n#ifdef DoMatrixRounding\n  if(rownr == 0)\n    value = roundToPrecision(value, lp->matA->epsvalue);\n#endif\n  value = scaled_mat(lp, value, rownr, colnr);\n  if(rownr == 0) {\n    lp->orig_obj[colnr] = my_chsign(is_chsign(lp, rownr), value);\n    return( TRUE );\n  }\n  else\n    return( mat_setvalue(lp->matA, rownr, colnr, value, FALSE) );\n}\n\nREAL __WINAPI get_working_objective(lprec *lp)\n{\n  REAL value = 0.0;\n\n  if(!lp->basis_valid)\n    report(lp, CRITICAL, \"get_working_objective: Not a valid basis\\n\");\n  else if((lp->spx_status == RUNNING) && (lp->solutioncount == 0))\n    value = my_chsign(!is_maxim(lp), lp->rhs[0]);\n  else\n    value = lp->solution[0];\n\n  return(value);\n}\n\nREAL __WINAPI get_var_primalresult(lprec *lp, int index)\n{\n  if((index < 0) || (index > lp->presolve_undo->orig_sum)) {\n    report(lp, IMPORTANT, \"get_var_primalresult: Index %d out of range\\n\", index);\n    return( 0.0 );\n  }\n  if((lp->do_presolve & PRESOLVE_LASTMASKMODE) != PRESOLVE_NONE)\n    return( lp->full_solution[index] );\n  else\n    return( lp->best_solution[index] );\n}\n\nREAL __WINAPI get_var_dualresult(lprec *lp, int index)\n{\n  REAL *duals;\n\n  if((index < 0) || (index > lp->presolve_undo->orig_sum)) {\n    report(lp, IMPORTANT, \"get_var_dualresult: Index %d out of range\\n\", index);\n    return( 0.0 );\n  }\n\n  if(index == 0)\n    return( lp->best_solution[0] );\n\n  /* Make sure we actually have dual information available */\n  if(!get_ptr_sensitivity_rhs(lp, &duals, NULL, NULL))\n    return( 0.0 );\n  else\n    duals = ((lp->full_duals == NULL) ? lp->duals : lp->full_duals);\n  return( duals[index] );\n}\n\nMYBOOL __WINAPI get_variables(lprec *lp, REAL *var)\n{\n  if(lp->spx_status == OPTIMAL)\n    ;\n  else if(!lp->basis_valid) {\n    report(lp, CRITICAL, \"get_variables: Not a valid basis\\n\");\n    return(FALSE);\n  }\n\n  MEMCOPY(var, lp->best_solution + (1 + lp->rows), lp->columns);\n  return(TRUE);\n}\n\nMYBOOL __WINAPI get_ptr_variables(lprec *lp, REAL **var)\n{\n  if(lp->spx_status == OPTIMAL)\n    ;\n  else if(!lp->basis_valid) {\n    report(lp, CRITICAL, \"get_ptr_variables: Not a valid basis\\n\");\n    return(FALSE);\n  }\n\n  if(var != NULL)\n   *var = lp->best_solution + (1 + lp->rows);\n  return(TRUE);\n}\n\nMYBOOL __WINAPI get_constraints(lprec *lp, REAL *constr)\n{\n  if(lp->spx_status == OPTIMAL)\n    ;\n  else if(!lp->basis_valid) {\n    report(lp, CRITICAL, \"get_constraints: Not a valid basis\\n\");\n    return(FALSE);\n  }\n\n  MEMCOPY(constr, lp->best_solution + 1, lp->rows);\n  return(TRUE);\n}\n\nMYBOOL __WINAPI get_ptr_constraints(lprec *lp, REAL **constr)\n{\n  if(lp->spx_status == OPTIMAL)\n    ;\n  else if(!lp->basis_valid) {\n    report(lp, CRITICAL, \"get_ptr_constraints: Not a valid basis\\n\");\n    return(FALSE);\n  }\n\n  if(constr != NULL)\n   *constr = lp->best_solution + 1;\n  return(TRUE);\n}\n\nMYBOOL __WINAPI get_sensitivity_rhs(lprec *lp, REAL *duals, REAL *dualsfrom, REAL *dualstill)\n{\n  REAL *duals0, *dualsfrom0, *dualstill0;\n\n  if(!lp->basis_valid) {\n    report(lp, CRITICAL, \"get_sensitivity_rhs: Not a valid basis\\n\");\n    return(FALSE);\n  }\n\n  if(!get_ptr_sensitivity_rhs(lp,\n                              (duals != NULL) ? &duals0 : NULL,\n                              (dualsfrom != NULL) ? &dualsfrom0 : NULL,\n                              (dualstill != NULL) ? &dualstill0 : NULL))\n    return(FALSE);\n\n  if(duals != NULL)\n    MEMCOPY(duals, duals0, lp->sum);\n  if(dualsfrom != NULL)\n    MEMCOPY(dualsfrom, dualsfrom0, lp->sum);\n  if(dualstill != NULL)\n    MEMCOPY(dualstill, dualstill0, lp->sum);\n  return(TRUE);\n}\n\nMYBOOL __WINAPI get_ptr_sensitivity_rhs(lprec *lp, REAL **duals, REAL **dualsfrom, REAL **dualstill)\n{\n  if(!lp->basis_valid) {\n    report(lp, CRITICAL, \"get_ptr_sensitivity_rhs: Not a valid basis\\n\");\n    return(FALSE);\n  }\n\n  if(duals != NULL) {\n    if(lp->duals == NULL) {\n      if((MIP_count(lp) > 0) && (lp->bb_totalnodes > 0)) {\n        report(lp, CRITICAL, \"get_ptr_sensitivity_rhs: Sensitivity unknown\\n\");\n        return(FALSE);\n      }\n      if(!construct_duals(lp))\n        return(FALSE);\n    }\n    *duals = lp->duals + 1;\n  }\n\n  if((dualsfrom != NULL) || (dualstill != NULL)) {\n    if((lp->dualsfrom == NULL) || (lp->dualstill == NULL)) {\n      if((MIP_count(lp) > 0) && (lp->bb_totalnodes > 0)) {\n        report(lp, CRITICAL, \"get_ptr_sensitivity_rhs: Sensitivity unknown\\n\");\n        return(FALSE);\n      }\n      construct_sensitivity_duals(lp);\n      if((lp->dualsfrom == NULL) || (lp->dualstill == NULL))\n        return(FALSE);\n    }\n    if(dualsfrom != NULL)\n      *dualsfrom = lp->dualsfrom + 1;\n    if(dualstill != NULL)\n      *dualstill = lp->dualstill + 1;\n  }\n  return(TRUE);\n}\n\nMYBOOL __WINAPI get_sensitivity_objex(lprec *lp, REAL *objfrom, REAL *objtill, REAL *objfromvalue, REAL *objtillvalue)\n{\n  REAL *objfrom0, *objtill0, *objfromvalue0, *objtillvalue0;\n\n  if(!lp->basis_valid) {\n    report(lp, CRITICAL, \"get_sensitivity_objex: Not a valid basis\\n\");\n    return(FALSE);\n  }\n\n  if(!get_ptr_sensitivity_objex(lp, (objfrom != NULL) ? &objfrom0 : NULL,\n                                    (objtill != NULL) ? &objtill0 : NULL,\n                                    (objfromvalue != NULL) ? &objfromvalue0 : NULL,\n                                    (objtillvalue != NULL) ? &objtillvalue0 : NULL))\n    return(FALSE);\n\n  if((objfrom != NULL) && (objfrom0 != NULL))\n    MEMCOPY(objfrom, objfrom0, lp->columns);\n  if((objtill != NULL) && (objtill0 != NULL))\n    MEMCOPY(objtill, objtill0, lp->columns);\n  if((objfromvalue != NULL) && (objfromvalue0 != NULL))\n    MEMCOPY(objfromvalue, objfromvalue0, lp->columns);\n  if((objtillvalue != NULL) && (objtillvalue0 != NULL))\n    MEMCOPY(objtillvalue, objtillvalue0, lp->columns);\n  return(TRUE);\n}\n\nMYBOOL __WINAPI get_sensitivity_obj(lprec *lp, REAL *objfrom, REAL *objtill)\n{\n  return(get_sensitivity_objex(lp, objfrom, objtill, NULL, NULL));\n}\n\nMYBOOL __WINAPI get_ptr_sensitivity_objex(lprec *lp, REAL **objfrom, REAL **objtill, REAL **objfromvalue, REAL **objtillvalue)\n{\n  if(!lp->basis_valid) {\n    report(lp, CRITICAL, \"get_ptr_sensitivity_objex: Not a valid basis\\n\");\n    return(FALSE);\n  }\n\n  if((objfrom != NULL) || (objtill != NULL)) {\n    if((lp->objfrom == NULL) || (lp->objtill == NULL)) {\n      if((MIP_count(lp) > 0) && (lp->bb_totalnodes > 0)) {\n        report(lp, CRITICAL, \"get_ptr_sensitivity_objex: Sensitivity unknown\\n\");\n        return(FALSE);\n      }\n      construct_sensitivity_obj(lp);\n      if((lp->objfrom == NULL) || (lp->objtill == NULL))\n        return(FALSE);\n    }\n    if(objfrom != NULL)\n      *objfrom = lp->objfrom + 1;\n    if(objtill != NULL)\n      *objtill = lp->objtill + 1;\n  }\n\n  if((objfromvalue != NULL) /* || (objtillvalue != NULL) */) {\n    if((lp->objfromvalue == NULL) /* || (lp->objtillvalue == NULL) */) {\n      if((MIP_count(lp) > 0) && (lp->bb_totalnodes > 0)) {\n        report(lp, CRITICAL, \"get_ptr_sensitivity_objex: Sensitivity unknown\\n\");\n        return(FALSE);\n      }\n      construct_sensitivity_duals(lp);\n      if((lp->objfromvalue == NULL) /* || (lp->objtillvalue == NULL) */)\n        return(FALSE);\n    }\n  }\n\n  if(objfromvalue != NULL)\n    *objfromvalue = lp->objfromvalue + 1;\n\n  if(objtillvalue != NULL)\n    *objtillvalue = NULL /* lp->objtillvalue + 1 */;\n\n  return(TRUE);\n}\n\nMYBOOL __WINAPI get_ptr_sensitivity_obj(lprec *lp, REAL **objfrom, REAL **objtill)\n{\n  return(get_ptr_sensitivity_objex(lp, objfrom, objtill, NULL, NULL));\n}\n\nvoid __WINAPI set_solutionlimit(lprec *lp, int limit)\n{\n  lp->solutionlimit = limit;\n}\nint __WINAPI get_solutionlimit(lprec *lp)\n{\n  return(lp->solutionlimit);\n}\nint __WINAPI get_solutioncount(lprec *lp)\n{\n  return(lp->solutioncount);\n}\n\nint __WINAPI get_Nrows(lprec *lp)\n{\n  return(lp->rows);\n}\n\nint __WINAPI get_Norig_rows(lprec *lp)\n{\n  if(lp->varmap_locked)\n    return(lp->presolve_undo->orig_rows);\n  else\n    return(lp->rows);\n}\n\nint __WINAPI get_Lrows(lprec *lp)\n{\n  if(lp->matL == NULL)\n    return( 0 );\n  else\n    return( lp->matL->rows );\n}\n\nint __WINAPI get_Ncolumns(lprec *lp)\n{\n  return(lp->columns);\n}\n\nint __WINAPI get_Norig_columns(lprec *lp)\n{\n  if(lp->varmap_locked)\n    return(lp->presolve_undo->orig_columns);\n  else\n    return(lp->columns);\n}\n\n\n/* ---------------------------------------------------------------------------------- */\n/* Core routines for lp_solve                                                         */\n/* ---------------------------------------------------------------------------------- */\nint __WINAPI get_status(lprec *lp)\n{\n  return(lp->spx_status);\n}\n\nchar * __WINAPI get_statustext(lprec *lp, int statuscode)\n{\n  if (statuscode == NOBFP)             return(\"No basis factorization package\");\n  else if (statuscode == DATAIGNORED)  return(\"Invalid input data provided\");\n  else if (statuscode == NOMEMORY)     return(\"Not enough memory available\");\n  else if (statuscode == NOTRUN)       return(\"Model has not been optimized\");\n  else if (statuscode == OPTIMAL)      return(\"OPTIMAL solution\");\n  else if (statuscode == SUBOPTIMAL)   return(\"SUB-OPTIMAL solution\");\n  else if (statuscode == INFEASIBLE)   return(\"Model is primal INFEASIBLE\");\n  else if (statuscode == UNBOUNDED)    return(\"Model is primal UNBOUNDED\");\n  else if (statuscode == RUNNING)      return(\"lp_solve is currently running\");\n  else if (statuscode == NUMFAILURE)   return(\"NUMERIC FAILURE encountered\");\n  else if (statuscode == DEGENERATE)   return(\"DEGENERATE situation\");\n  else if (statuscode == USERABORT)    return(\"User-requested termination\");\n  else if (statuscode == TIMEOUT)      return(\"Termination due to timeout\");\n  else if (statuscode == PRESOLVED)    return(\"Model solved by presolve\");\n  else if (statuscode == PROCFAIL)     return(\"B&B routine failed\");\n  else if (statuscode == PROCBREAK)    return(\"B&B routine terminated\");\n  else if (statuscode == FEASFOUND)    return(\"Feasible B&B solution found\");\n  else if (statuscode == NOFEASFOUND)  return(\"No feasible B&B solution found\");\n  else if (statuscode == FATHOMED)     return(\"Fathomed/pruned branch\");\n  else                                 return(\"Undefined internal error\");\n}\n\nMYBOOL __WINAPI is_obj_in_basis(lprec *lp)\n{\n  return( lp->obj_in_basis );\n}\n\nvoid __WINAPI set_obj_in_basis(lprec *lp, MYBOOL obj_in_basis)\n{\n  lp->obj_in_basis = (MYBOOL) (obj_in_basis == TRUE);\n}\n\nlprec * __WINAPI make_lp(int rows, int columns)\n{\n  lprec *lp;\n\n# if defined FORTIFY\n   /* Fortify_EnterScope(); */\n# endif\n\n  if(rows < 0 || columns < 0)\n    return(NULL);\n\n  lp = (lprec*) calloc(1, sizeof(*lp));\n  if(!lp)\n    return(NULL);\n\n  set_lp_name(lp, NULL);\n  lp->names_used    = FALSE;\n  lp->use_row_names = TRUE;\n  lp->use_col_names = TRUE;\n  lp->rowcol_name   = NULL;\n\n  /* Do standard initializations ------------------------------------------------------------ */\n#if 1\n  lp->obj_in_basis  = DEF_OBJINBASIS;\n#else\n  lp->obj_in_basis  = FALSE;\n#endif\n  lp->verbose       = NORMAL;\n  set_callbacks(lp);\n  set_BFP(lp, NULL);\n  set_XLI(lp, NULL);\n#if libBLAS > 0\n  init_BLAS();\n#if libBLAS > 1\n  if(is_nativeBLAS() && !load_BLAS(libnameBLAS))\n    /*report(lp, \"make_lp: Could not load external BLAS library '%s'.\\n\", libnameBLAS)*/;\n#endif\n#endif\n\n  /* Define the defaults for key user-settable values --------------------------------------- */\n  reset_params(lp);\n\n  /* Do other initializations --------------------------------------------------------------- */\n  lp->source_is_file    = FALSE;\n  lp->model_is_pure     = TRUE;\n  lp->model_is_valid    = FALSE;\n  lp->spx_status        = NOTRUN;\n  lp->lag_status        = NOTRUN;\n\n  lp->workarrays = mempool_create(lp);\n  lp->wasPreprocessed   = FALSE;\n  lp->wasPresolved      = FALSE;\n  presolve_createUndo(lp);\n\n  lp->bb_varactive      = NULL;\n  lp->bb_varbranch      = NULL;\n  lp->var_priority      = NULL;\n\n  lp->rhsmax            = 0.0;\n  lp->bigM              = 0.0;\n  lp->bb_deltaOF        = 0.0;\n\n  lp->equalities        = 0;\n  lp->fixedvars         = 0;\n  lp->int_vars          = 0;\n  lp->sc_vars           = 0;\n\n  lp->sos_ints          = 0;\n  lp->sos_vars          = 0;\n  lp->sos_priority      = NULL;\n\n  lp->rows_alloc        = 0;\n  lp->columns_alloc     = 0;\n  lp->sum_alloc         = 0;\n\n  lp->rows              = rows;\n  lp->columns           = columns;\n  lp->sum               = rows + columns;\n  varmap_clear(lp);\n\n  lp->matA = mat_create(lp, rows, columns, lp->epsvalue);\n  lp->matL = NULL;\n  lp->invB = NULL;\n  lp->duals = NULL;\n  lp->dualsfrom = NULL;\n  lp->dualstill = NULL;\n  lp->objfromvalue = NULL;\n  lp->objfrom = NULL;\n  lp->objtill = NULL;\n\n  inc_col_space(lp, columns + 1);\n  inc_row_space(lp, rows + 1);\n\n  /* Avoid bound-checker uninitialized variable error */\n  lp->orig_lowbo[0] = 0;\n\n  lp->rootbounds = NULL;\n  lp->bb_bounds = NULL;\n  lp->bb_basis = NULL;\n\n  lp->basis_valid       = FALSE;\n  lp->simplex_mode      = SIMPLEX_DYNAMIC;\n  lp->scaling_used      = FALSE;\n  lp->columns_scaled    = FALSE;\n  lp->P1extraDim        = 0;\n  lp->P1extraVal        = 0.0;\n  lp->bb_strongbranches = 0;\n  lp->current_iter      = 0;\n  lp->total_iter        = 0;\n  lp->current_bswap     = 0;\n  lp->total_bswap       = 0;\n  lp->solutioncount     = 0;\n  lp->solvecount        = 0;\n\n  allocINT(lp, &lp->rejectpivot, DEF_MAXPIVOTRETRY + 1, TRUE);\n\n  set_minim(lp);\n  set_infiniteex(lp, DEF_INFINITE, TRUE);\n\n  initPricer(lp);\n\n  /* Call-back routines by KE */\n  lp->ctrlc = NULL;\n  lp->ctrlchandle = NULL;\n  lp->writelog = NULL;\n  lp->loghandle = NULL;\n  lp->debuginfo = NULL;\n  lp->usermessage = NULL;\n  lp->msgmask = MSG_NONE;\n  lp->msghandle = NULL;\n\n  lp->timecreate = timeNow();\n\n  return(lp);\n}\n\nMYBOOL __WINAPI resize_lp(lprec *lp, int rows, int columns)\n{\n  MYBOOL status = TRUE;\n\n  if(columns > lp->columns)\n    status = inc_col_space(lp, columns - lp->columns);\n  else\n    while(status && (lp->columns > columns)) {\n      status = del_column(lp, lp->columns);\n    }\n  if(status && (rows > lp->rows))\n    status = inc_row_space(lp, rows - lp->rows);\n  else\n    while(status && (lp->rows > rows)) {\n      status = del_constraint(lp, lp->rows);\n    }\n  return( status );\n}\n\nvoid __WINAPI free_lp(lprec **plp)\n{\n  if(plp != NULL) {\n    lprec *lp = *plp;\n    if(lp != NULL)\n      delete_lp(lp);\n    *plp = NULL;\n  }\n}\n\nvoid __WINAPI delete_lp(lprec *lp)\n{\n  if(lp == NULL)\n    return;\n\n  FREE(lp->rowcol_name);\n  FREE(lp->lp_name);\n  FREE(lp->ex_status);\n  if(lp->names_used) {\n    FREE(lp->row_name);\n    FREE(lp->col_name);\n    free_hash_table(lp->rowname_hashtab);\n    free_hash_table(lp->colname_hashtab);\n  }\n\n  mat_free(&lp->matA);\n  lp->bfp_free(lp);\n#if LoadInverseLib == TRUE\n  if(lp->hBFP != NULL)\n    set_BFP(lp, NULL);\n#endif\n#if LoadLanguageLib == TRUE\n  if(lp->hXLI != NULL)\n    set_XLI(lp, NULL);\n#endif\n\n  unset_OF_p1extra(lp);\n  FREE(lp->orig_obj);\n  FREE(lp->orig_rhs);\n  FREE(lp->rhs);\n  FREE(lp->var_type);\n  set_var_weights(lp, NULL);\n  FREE(lp->bb_varbranch);\n  FREE(lp->sc_lobound);\n  FREE(lp->var_is_free);\n  FREE(lp->orig_upbo);\n  FREE(lp->orig_lowbo);\n  FREE(lp->upbo);\n  FREE(lp->lowbo);\n  FREE(lp->var_basic);\n  FREE(lp->is_basic);\n  FREE(lp->is_lower);\n  if(lp->bb_PseudoCost != NULL) {\n/*    report(lp, SEVERE, \"delete_lp: The B&B pseudo-cost array was not cleared on delete\\n\"); */\n    free_pseudocost(lp);\n  }\n  if(lp->bb_bounds != NULL) {\n    report(lp, SEVERE, \"delete_lp: The stack of B&B levels was not empty (failed at %.0f nodes)\\n\",\n                       (double) lp->bb_totalnodes);\n    unload_BB(lp);\n  }\n  if(lp->bb_basis != NULL) {\n/*    report(lp, SEVERE, \"delete_lp: The stack of saved bases was not empty on delete\\n\"); */\n    unload_basis(lp, FALSE);\n  }\n\n  FREE(lp->rejectpivot);\n  partial_freeBlocks(&(lp->rowblocks));\n  partial_freeBlocks(&(lp->colblocks));\n  multi_free(&(lp->multivars));\n  multi_free(&(lp->longsteps));\n\n  FREE(lp->solution);\n  FREE(lp->best_solution);\n  FREE(lp->full_solution);\n\n  presolve_freeUndo(lp);\n  mempool_free(&(lp->workarrays));\n\n  freePricer(lp);\n\n  FREE(lp->drow);\n  FREE(lp->nzdrow);\n\n  FREE(lp->duals);\n  FREE(lp->full_duals);\n  FREE(lp->dualsfrom);\n  FREE(lp->dualstill);\n  FREE(lp->objfromvalue);\n  FREE(lp->objfrom);\n  FREE(lp->objtill);\n  FREE(lp->row_type);\n\n  if(lp->sos_vars > 0)\n    FREE(lp->sos_priority);\n  free_SOSgroup(&(lp->SOS));\n  free_SOSgroup(&(lp->GUB));\n  freecuts_BB(lp);\n\n  if(lp->scaling_used)\n    FREE(lp->scalars);\n  if(lp->matL != NULL) {\n    FREE(lp->lag_rhs);\n    FREE(lp->lambda);\n    FREE(lp->lag_con_type);\n    mat_free(&lp->matL);\n  }\n  if(lp->streamowned)\n    set_outputstream(lp, NULL);\n\n#if libBLAS > 0\n  if(!is_nativeBLAS())\n    unload_BLAS();\n#endif\n\n  FREE(lp);\n\n# if defined FORTIFY\n    /* Fortify_LeaveScope(); */\n# endif\n}\n\nstatic MYBOOL get_SOS(lprec *lp, int index, char *name, int *sostype, int *priority, int *count, int *sosvars, REAL *weights)\n{\n  SOSrec *SOS;\n\n  if((index < 1) || (index > SOS_count(lp)))\n    return( FALSE );\n  SOS = lp->SOS->sos_list[index-1];\n  if(name != NULL)\n    strcpy(name, SOS->name);\n  if(sostype != NULL)\n    *sostype = SOS->type;\n  if(priority != NULL)\n    *priority = SOS->priority;\n  if(count != NULL) {\n    *count = SOS->size;\n    if(sosvars != NULL) {\n      int i;\n      for(i = 1; i <= *count; i++) {\n        sosvars[i-1] = SOS->members[i];\n        if(weights != NULL)\n          weights[i-1] = SOS->weights[i];\n      }\n    }\n  }\n  return( TRUE );\n}\n\n/* Make a copy of the existing model using (mostly) high-level\n   construction routines to simplify future maintainance. */\nlprec* __WINAPI copy_lp(lprec *lp)\n{\n  int   i, n, *idx = NULL;\n  REAL  hold, *val = NULL, infinite;\n  lprec *newlp = NULL;\n  char buf[256], ok = FALSE;\n  int sostype, priority, count, *sosvars, rows, columns;\n  REAL *weights = NULL;\n\n#if 0\n  if(lp->wasPresolved)\n    return( newlp );\n#endif\n\n  rows = get_Nrows(lp);\n  columns = get_Ncolumns(lp);\n\n  if(!allocINT(lp, &idx, rows+1, FALSE) ||\n     !allocREAL(lp, &val, rows+1, FALSE))\n    goto Finish;\n\n  /* Create the new object */\n  newlp = make_lp(rows, 0);\n  if(newlp == NULL)\n    goto Finish;\n  if(!resize_lp(newlp, rows, columns))\n    goto Finish;\n  set_sense(newlp, is_maxim(lp));\n  set_use_names(newlp, FALSE, is_use_names(lp, FALSE));\n  set_use_names(newlp, TRUE, is_use_names(lp, TRUE));\n  if(!set_lp_name(newlp, get_lp_name(lp)))\n    goto Finish;\n  /* set_algopt(newlp, get_algopt(lp)); */ /* v6 */\n  set_verbose(newlp, get_verbose(lp));\n\n  /* Transfer standard simplex parameters */\n  set_epspivot(newlp, get_epspivot(lp));\n  set_epsel(newlp, get_epsel(lp));\n  set_epsb(newlp, get_epsb(lp));\n  set_epsd(newlp, get_epsd(lp));\n  set_pivoting(newlp, get_pivoting(lp));\n  set_negrange(newlp, lp->negrange);\n  set_infinite(newlp, get_infinite(lp));\n  set_presolve(newlp, get_presolve(lp), get_presolveloops(lp));\n  set_scaling(newlp, get_scaling(lp));\n  set_scalelimit(newlp, get_scalelimit(lp));\n  set_simplextype(newlp, get_simplextype(lp));\n  set_epsperturb(newlp, get_epsperturb(lp));\n  set_anti_degen(newlp, get_anti_degen(lp));\n  set_improve(newlp, get_improve(lp));\n  set_basiscrash(newlp, get_basiscrash(lp));\n  set_maxpivot(newlp, get_maxpivot(lp));\n  set_timeout(newlp, get_timeout(lp));\n\n  /* Transfer MILP parameters */\n  set_epsint(newlp, get_epsint(lp));\n  set_bb_rule(newlp, get_bb_rule(lp));\n  set_bb_depthlimit(newlp, get_bb_depthlimit(lp));\n  set_bb_floorfirst(newlp, get_bb_floorfirst(lp));\n  set_mip_gap(newlp, TRUE, get_mip_gap(lp, TRUE));\n  set_mip_gap(newlp, FALSE, get_mip_gap(lp, FALSE));\n  set_break_at_first(newlp, is_break_at_first(lp));\n  set_break_at_value(newlp, get_break_at_value(lp));\n\n  /* Set RHS and range */\n  infinite = get_infinite(lp);\n  for(i = 0; i <= rows; i++) {\n    if(i > 0)\n      if(!set_constr_type(newlp, i, get_constr_type(lp, i)))\n        goto Finish;\n    if(!set_rh(newlp, i, get_rh(lp, i)))\n      goto Finish;\n    if((i > 0) && ((hold = get_rh_range(lp, i)) < infinite))\n      if(!set_rh_range(newlp, i, hold))\n        goto Finish;\n    if(lp->names_used && lp->use_row_names && (lp->row_name[i] != NULL) && (lp->row_name[i]->name != NULL))\n      if(!set_row_name(newlp, i, get_row_name(lp, i)))\n        goto Finish;\n  }\n\n  /* Load the constraint matrix and variable definitions */\n  for(i = 1; i <= columns; i++) {\n    n = get_columnex(lp, i, val, idx);\n    if ((n < 0) || (!add_columnex(newlp, n, val, idx)))\n      goto Finish;\n    if(is_binary(lp, i)) {\n      if (!set_binary(newlp, i, TRUE))\n        goto Finish;\n    }\n    else {\n      if(is_int(lp, i))\n        if(!set_int(newlp, i, TRUE))\n          goto Finish;\n      if((hold = get_lowbo(lp, i)) != 0)\n        if(!set_lowbo(newlp, i, hold))\n          goto Finish;\n      if((hold = get_upbo(lp, i)) < infinite)\n        if(!set_upbo(newlp, i, hold))\n          goto Finish;\n    }\n    if(is_semicont(lp, i))\n      if(!set_semicont(newlp, i, TRUE))\n        goto Finish;\n    if(lp->names_used && lp->use_col_names && (lp->col_name[i] != NULL) && (lp->col_name[i]->name != NULL))\n      if(!set_col_name(newlp, i, get_col_name(lp, i)))\n        goto Finish;\n  }\n\n  /* copy SOS data */\n  for(i = 1; get_SOS(lp, i, buf, &sostype, &priority, &count, NULL, NULL); i++)\n    if (count) {\n      if(!allocINT(lp, &sosvars, count, FALSE) ||\n         !allocREAL(lp, &weights, count, FALSE))\n        n = 0;\n      else {\n        get_SOS(lp, i, buf, &sostype, &priority, &count, sosvars, weights);\n        n = add_SOS(newlp, buf, sostype, priority, count, sosvars, weights);\n      }\n      FREE(weights);\n      FREE(sosvars);\n      if(n == 0)\n        goto Finish;\n    }\n\n#if 0\n  /* Other parameters set if the source model was previously solved */\n  if(lp->solvecount > 0) {\n    MEMCOPY(newlp->scalars, lp->scalars, lp->sum+1);\n    MEMCOPY(newlp->var_basic, lp->var_basic, rows+1);\n    MEMCOPY(newlp->is_basic, lp->is_basic, lp->sum+1);\n    MEMCOPY(newlp->is_lower, lp->is_lower, lp->sum+1);\n    MEMCOPY(newlp->solution, lp->solution, lp->sum+1);\n    if(lp->duals != NULL) {\n      allocREAL(newlp, &newlp->duals, newlp->sum_alloc+1, FALSE);\n      MEMCOPY(newlp->duals, lp->duals, lp->sum+1);\n    }\n    newlp->solutioncount = lp->solutioncount;\n    newlp->solvecount = lp->solvecount;\n  }\n#endif\n\n  ok = TRUE;\n\n  /* Clean up before returning */\nFinish:\n  if(!ok)\n    free_lp(&newlp);\n  FREE(val);\n  FREE(idx);\n\n  return( newlp );\n}\nMYBOOL __WINAPI dualize_lp(lprec *lp)\n{\n  int     i, n;\n  MATrec  *mat = lp->matA;\n  REAL    *item;\n\n  /* Are we allowed to perform the operation? */\n  if((MIP_count(lp) > 0) || (lp->solvecount > 0))\n    return( FALSE );\n\n  /* Modify sense */\n  set_sense(lp, (MYBOOL) !is_maxim(lp));\n\n  /* Transpose matrix and reverse signs */\n  n = mat_nonzeros(mat);\n  mat_transpose(mat);\n  item = &COL_MAT_VALUE(0);\n  for(i = 0; i < n; i++, item += matValueStep)\n    *item *= -1;\n\n  /* Row-column swap other vectors */\n  swapINT(&lp->rows, &lp->columns);\n  swapINT(&lp->rows_alloc, &lp->columns_alloc);\n  swapREAL(lp->orig_rhs, lp->orig_obj);\n  if ((lp->rhs != NULL) && (lp->obj != NULL))\n    swapREAL(lp->rhs, lp->obj);\n\n  /* Reallocate storage */\n/*\nvar_type\nsc_bound\nsolution\nbest_solution\nfull_solution\nduals\n*/\n\n  /* Shift variable bounds */\n/*\nis_basic\norig_upbo\norig_lowbo\nscalars\n*/\n\n  return( TRUE );\n}\n\n/* Optimize memory usage */\nSTATIC MYBOOL memopt_lp(lprec *lp, int rowextra, int colextra, int nzextra)\n{\n  MYBOOL status = FALSE;\n\n  if(lp == NULL)\n    return( status );\n\n  status = mat_memopt(lp->matA, rowextra, colextra, nzextra) &&\n           (++rowextra > 0) && (++colextra > 0) && (++nzextra > 0);\n\n#if 0 /* inc_ routines not well-tested for reduction in size allocation */\n  if(status) {\n    int colalloc = lp->columns_alloc - MIN(lp->columns_alloc, lp->columns + colextra),\n        rowalloc = lp->rows_alloc    - MIN(lp->rows_alloc,    lp->rows + rowextra);\n\n    status = inc_lag_space(lp, rowalloc, FALSE) &&\n             inc_row_space(lp, rowalloc) &&\n             inc_col_space(lp, colalloc);\n  }\n#endif\n\n  return( status );\n}\n\n\n/* Utility routine group for constraint and column deletion/insertion\n   mapping in relation to the original set of constraints and columns */\nSTATIC void varmap_lock(lprec *lp)\n{\n  presolve_fillUndo(lp, lp->rows, lp->columns, TRUE);\n  lp->varmap_locked = TRUE;\n}\nSTATIC void varmap_clear(lprec *lp)\n{\n  presolve_setOrig(lp, 0, 0);\n  lp->varmap_locked = FALSE;\n}\nSTATIC MYBOOL varmap_canunlock(lprec *lp)\n{\n  /* Don't do anything if variables aren't locked yet */\n  if(lp->varmap_locked) {\n    int i;\n    presolveundorec *psundo = lp->presolve_undo;\n\n    /* Check for the obvious */\n    if(/*lp->names_used ||\n       (psundo->orig_columns != lp->columns) || (psundo->orig_rows != lp->rows)) */\n       (psundo->orig_columns > lp->columns) || (psundo->orig_rows > lp->rows))\n      return( FALSE );\n\n    /* Check for deletions */\n    for(i = psundo->orig_rows + psundo->orig_columns; i > 0; i--)\n      if(psundo->orig_to_var[i] == 0)\n        return( FALSE );\n\n    /* Check for insertions */\n    for(i = lp->sum; i > 0; i--)\n      if(psundo->var_to_orig[i] == 0)\n        return( FALSE );\n  }\n  return( TRUE );\n}\nSTATIC void varmap_add(lprec *lp, int base, int delta)\n{\n  int i, ii;\n  presolveundorec *psundo = lp->presolve_undo;\n\n  /* Don't do anything if variables aren't locked yet */\n  if(!lp->varmap_locked)\n    return;\n\n  /* Set new constraints/columns to have an \"undefined\" mapping to original\n     constraints/columns (assumes that counters have NOT yet been updated) */\n  for(i = lp->sum; i >= base; i--) {\n    ii = i + delta;\n    psundo->var_to_orig[ii] = psundo->var_to_orig[i];\n  }\n\n  /* Initialize map of added rows/columns */\n  for(i = 0; i < delta; i++) {\n    ii = base + i;\n    psundo->var_to_orig[ii] = 0;\n  }\n}\n\nSTATIC void varmap_delete(lprec *lp, int base, int delta, LLrec *varmap)\n{\n  int             i, ii, j;\n  MYBOOL          preparecompact = (MYBOOL) (varmap != NULL);\n  presolveundorec *psundo = lp->presolve_undo;\n\n  /* Set the model \"dirty\" if we are deleting row of constraint */\n  lp->model_is_pure &= (MYBOOL) ((lp->solutioncount == 0) && !preparecompact);\n\n  /* Don't do anything if\n     1) variables aren't locked yet, or\n     2) the constraint was added after the variables were locked */\n  if(!lp->varmap_locked) {\n#if 0\n   if(lp->names_used)\n     varmap_lock(lp);\n   else\n     return;\n#else\n    if(!lp->model_is_pure && lp->names_used)\n      varmap_lock(lp);\n#endif\n  }\n\n  /* Do mass deletion via a linked list */\n  preparecompact = (MYBOOL) (varmap != NULL);\n  if(preparecompact) {\n    preparecompact = (MYBOOL) (base > lp->rows);  /* Set TRUE for columns */\n    for(j = firstInactiveLink(varmap); j != 0; j = nextInactiveLink(varmap, j)) {\n      i = j;\n      if(preparecompact) {\n#ifdef Paranoia\n        if(SOS_is_member(lp->SOS, 0, j))\n          report(lp, SEVERE, \"varmap_delete: Deleting variable %d, which is in a SOS!\\n\", j);\n#endif\n        i += lp->rows;\n      }\n      ii = psundo->var_to_orig[i];\n      if(ii > 0)  /* It was an original variable; reverse sign of index to flag deletion */\n        psundo->var_to_orig[i] = -ii;\n      else        /* It was a non-original variable; add special code for deletion */\n        psundo->var_to_orig[i] = -(psundo->orig_rows+psundo->orig_columns+i);\n    }\n    return;\n  }\n\n  /* Do legacy simplified version if we are doing batch delete operations */\n  preparecompact = (MYBOOL) (base < 0);\n  if(preparecompact) {\n    base = -base;\n    if(base > lp->rows)\n      base += (psundo->orig_rows - lp->rows);\n    for(i = base; i < base-delta; i++) {\n      ii = psundo->var_to_orig[i];\n      if(ii > 0)  /* It was an original variable; reverse sign of index to flag deletion */\n        psundo->var_to_orig[i] = -ii;\n      else       /* It was a non-original variable; add special code for deletion */\n        psundo->var_to_orig[i] = -(psundo->orig_rows+psundo->orig_columns+i);\n    }\n    return;\n  }\n\n  /* We are deleting an original constraint/column;\n     1) clear mapping of original to deleted\n     2) shift the deleted variable to original mappings left\n     3) decrement all subsequent original-to-current pointers\n  */\n  if(varmap_canunlock(lp))    lp->varmap_locked = FALSE;\n  for(i = base; i < base-delta; i++) {\n    ii = psundo->var_to_orig[i];\n    if(ii > 0)\n      psundo->orig_to_var[ii] = 0;\n  }\n  for(i = base; i <= lp->sum+delta; i++) {\n    ii = i - delta;\n    psundo->var_to_orig[i] = psundo->var_to_orig[ii];\n  }\n\n  i = 1;\n  j = psundo->orig_rows;\n  if(base > lp->rows) {\n    i += j;\n    j += psundo->orig_columns;\n  }\n  ii = base-delta;\n  for(; i <= j; i++) {\n    if(psundo->orig_to_var[i] >= ii)\n      psundo->orig_to_var[i] += delta;\n  }\n\n}\n\nSTATIC MYBOOL varmap_validate(lprec *lp, int varno)\n{\n  MYBOOL success = TRUE;\n  int i, ii, ix, ie,\n       n_rows = lp->rows,\n       orig_sum = lp->presolve_undo->orig_sum,\n       orig_rows = lp->presolve_undo->orig_rows;\n\n  if(varno <= 0) {\n    varno = 1;\n    ie = orig_sum;\n  }\n  else\n    ie = varno;\n  for(i = varno; success && (i <= ie); i++) {\n    ix = lp->presolve_undo->orig_to_var[i];\n    if((ix > 0) && (i > orig_rows))\n      ix += n_rows;\n\n    /* Check for index out of range due to presolve */\n    success = (MYBOOL) (ix <= orig_sum);\n    if(!success)\n      report(lp, SEVERE, \"varmap_validate: Invalid new mapping found for variable %d\\n\",\n                           i);\n    else if(ix != 0) {\n      ii = lp->presolve_undo->var_to_orig[ix];\n      if(ix > n_rows)\n        ii += orig_rows;\n      success = (MYBOOL) (ii == i);\n      if(!success)\n        report(lp, SEVERE, \"varmap_validate: Invalid old mapping found for variable %d (%d)\\n\",\n                           i, ii);\n    }\n  }\n  return( success );\n}\n\nSTATIC void varmap_compact(lprec *lp, int prev_rows, int prev_cols)\n{\n  presolveundorec *psundo = lp->presolve_undo;\n  int             i, ii, n_sum, n_rows,\n                  orig_rows = psundo->orig_rows,\n                  prev_sum = prev_rows + prev_cols;\n\n  /* Nothing to do if the model is not \"dirty\" or the variable map is not locked */\n  if(lp->model_is_pure || !lp->varmap_locked)\n    return;\n\n  /* We are deleting an original constraint/column;\n     1) clear mapping of original to deleted\n     2) shift the deleted variable to original mappings left\n     3) decrement all subsequent original-to-current pointers\n  */\n  n_sum = 0;\n  n_rows = 0;\n  for(i = 1; i <= prev_sum; i++) {\n    ii = psundo->var_to_orig[i];\n\n    /* Process variable if it was deleted in the previous round */\n    if(ii < 0) {\n      ii = -ii;\n      /* Update map back if we have an original variable, otherwise just skip */\n      if(i <= prev_rows)\n        psundo->orig_to_var[ii] = 0;\n      else\n        psundo->orig_to_var[orig_rows+ii] = 0;\n    }\n    /* Otherwise shift and update map back */\n    else {\n      n_sum++;\n      /* Shift only if necessary */\n      if(n_sum < i)\n        psundo->var_to_orig[n_sum] = ii;\n      /* Update map back if we have an original variable */\n      if(ii > 0) {\n        if(i <= prev_rows) {\n          psundo->orig_to_var[ii] = n_sum;\n          n_rows = n_sum;\n        }\n        else\n          psundo->orig_to_var[orig_rows+ii] = n_sum-n_rows;\n      }\n    }\n  }\n#ifdef xxParanoia\n  if(!varmap_validate(lp, 0))\n    report(lp, SEVERE, \"varmap_compact: Internal presolve mapping error at exit\\n\");\n#endif\n\n}\n\n/* Utility group for shifting row and column data */\nSTATIC MYBOOL shift_rowcoldata(lprec *lp, int base, int delta, LLrec *usedmap, MYBOOL isrow)\n/* Note: Assumes that \"lp->sum\" and \"lp->rows\" HAVE NOT been updated to the new counts */\n{\n  int  i, ii;\n  REAL lodefault;\n\n  /* Shift data right/down (insert), and set default values in positive delta-gap */\n  if(delta > 0) {\n\n    /* Determine if we can take the easy way out */\n    MYBOOL easyout = (MYBOOL) ((lp->solvecount == 0) && (base > lp->rows));\n\n    /* Shift the row/column data */\n\n    MEMMOVE(lp->orig_upbo + base + delta, lp->orig_upbo + base, lp->sum - base + 1);\n    MEMMOVE(lp->orig_lowbo + base + delta, lp->orig_lowbo + base, lp->sum - base + 1);\n\n    if(!easyout) {\n      MEMMOVE(lp->upbo + base + delta, lp->upbo + base, lp->sum - base + 1);\n      MEMMOVE(lp->lowbo + base + delta, lp->lowbo + base, lp->sum - base + 1);\n      if(lp->model_is_valid) {\n        MEMMOVE(lp->solution + base + delta, lp->solution + base, lp->sum - base + 1);\n        MEMMOVE(lp->best_solution + base + delta, lp->best_solution + base, lp->sum - base + 1);\n      }\n      MEMMOVE(lp->is_lower + base + delta, lp->is_lower + base, lp->sum - base + 1);\n    }\n\n    /* Deal with scalars; the vector can be NULL */\n    if(lp->scalars != NULL) {\n      if(!easyout)\n        for(ii = lp->sum; ii >= base; ii--) {\n          i = ii + delta;\n          lp->scalars[i] = lp->scalars[ii];\n        }\n      for(ii = base; ii < base + delta; ii++)\n        lp->scalars[ii] = 1;\n    }\n\n    /* Set defaults */\n#ifdef SlackInitMinusInf\n    if(isrow)\n      lodefault = -lp->infinite;\n    else\n#endif\n      lodefault = 0;\n\n    for(i = 0; i < delta; i++) {\n      ii = base + i;\n      lp->orig_upbo[ii] = lp->infinite;\n      lp->orig_lowbo[ii] = lodefault;\n      if(!easyout) {\n        lp->upbo[ii] = lp->orig_upbo[ii];\n        lp->lowbo[ii] = lp->orig_lowbo[ii];\n        lp->is_lower[ii] = TRUE;\n      }\n    }\n  }\n\n  /* Shift data left/up (delete) */\n  else if(usedmap != NULL) {\n    int k, offset = 0;\n    if(!isrow)\n      offset += lp->rows;\n    i = offset + 1;\n    for(k = firstActiveLink(usedmap); k != 0;\n        i++, k = nextActiveLink(usedmap, k)) {\n      ii = k + offset;\n      if(ii == i)\n        continue;\n      lp->upbo[i] = lp->upbo[ii];\n      lp->orig_upbo[i] = lp->orig_upbo[ii];\n      lp->lowbo[i] = lp->lowbo[ii];\n      lp->orig_lowbo[i] = lp->orig_lowbo[ii];\n      lp->solution[i] = lp->solution[ii];\n      lp->best_solution[i] = lp->best_solution[ii];\n      lp->is_lower[i] = lp->is_lower[ii];\n      if(lp->scalars != NULL)\n        lp->scalars[i] = lp->scalars[ii];\n    }\n    if(isrow) {\n      base = lp->rows + 1;\n      MEMMOVE(lp->upbo + i, lp->upbo + base, lp->columns);\n      MEMMOVE(lp->orig_upbo + i, lp->orig_upbo + base, lp->columns);\n      MEMMOVE(lp->lowbo + i, lp->lowbo + base, lp->columns);\n      MEMMOVE(lp->orig_lowbo + i, lp->orig_lowbo + base, lp->columns);\n      if(lp->model_is_valid) {\n        MEMMOVE(lp->solution + i, lp->solution + base, lp->columns);\n        MEMMOVE(lp->best_solution + i, lp->best_solution + base, lp->columns);\n      }\n      MEMMOVE(lp->is_lower + i, lp->is_lower + base, lp->columns);\n      if(lp->scalars != NULL)\n        MEMMOVE(lp->scalars + i, lp->scalars + base, lp->columns);\n    }\n  }\n\n  else if(delta < 0) {\n\n    /* First make sure we don't cross the sum count border */\n    if(base-delta-1 > lp->sum)\n      delta = base - lp->sum - 1;\n\n    /* Shift the data*/\n    for(i = base; i <= lp->sum + delta; i++) {\n      ii = i - delta;\n      lp->upbo[i] = lp->upbo[ii];\n      lp->orig_upbo[i] = lp->orig_upbo[ii];\n      lp->lowbo[i] = lp->lowbo[ii];\n      lp->orig_lowbo[i] = lp->orig_lowbo[ii];\n      lp->solution[i] = lp->solution[ii];\n      lp->best_solution[i] = lp->best_solution[ii];\n      lp->is_lower[i] = lp->is_lower[ii];\n      if(lp->scalars != NULL)\n        lp->scalars[i] = lp->scalars[ii];\n    }\n\n  }\n\n  lp->sum += delta;\n\n  lp->matA->row_end_valid = FALSE;\n\n  return(TRUE);\n}\n\nSTATIC MYBOOL shift_basis(lprec *lp, int base, int delta, LLrec *usedmap, MYBOOL isrow)\n/* Note: Assumes that \"lp->sum\" and \"lp->rows\" HAVE NOT been updated to the new counts */\n{\n  int i, ii;\n  MYBOOL Ok = TRUE;\n\n  /* Don't bother to shift the basis if it is not yet ready */\n  if(!is_BasisReady(lp))\n    return( Ok );\n\n  /* Basis adjustments due to insertions (after actual row/column insertions) */\n  if(delta > 0) {\n\n    /* Determine if the basis becomes invalidated */\n    if(isrow)\n      set_action(&lp->spx_action, ACTION_REBASE | ACTION_REINVERT);\n\n    /* Shift and fix invalid basis references (increment higher order basic variable index) */\n    if(base <= lp->sum)\n      MEMMOVE(lp->is_basic + base + delta, lp->is_basic + base, lp->sum - base + 1);\n\n    /* Prevent CPU-expensive basis updating if this is the initial model creation */\n    if(!lp->model_is_pure || (lp->solvecount > 0))\n      for(i = 1; i <= lp->rows; i++) {\n        ii = lp->var_basic[i];\n        if(ii >= base)\n          lp->var_basic[i] += delta;\n      }\n\n    /* Update the basis (shift and extend) */\n    for(i = 0; i < delta; i++) {\n      ii = base + i;\n      lp->is_basic[ii] = isrow;\n      if(isrow)\n        lp->var_basic[lp->rows+1+i] = ii;\n    }\n\n  }\n  /* Basis adjustments due to deletions (after actual row/column deletions) */\n  else {\n    int j,k;\n\n    /* Fix invalid basis references (decrement high basic slack variable indexes),\n       but reset the entire basis if a deleted variable is found in the basis */\n    k = 0;\n    for(i = 1; i <= lp->rows; i++) {\n      ii = lp->var_basic[i];\n      lp->is_basic[ii] = FALSE;\n      if(ii >= base) {\n       /* Skip to next basis variable if this one is to be deleted */\n        if(ii < base-delta) {\n          set_action(&lp->spx_action, ACTION_REBASE);\n          continue;\n        }\n       /* Otherwise, update the index of the basic variable for deleted variables */\n        ii += delta;\n      }\n      k++;\n      lp->var_basic[k] = ii;\n    }\n\n    /* Set the new basis indicators */\n    i = k;\n    if(isrow)\n      i = MIN(k, lp->rows+delta);\n    for(; i > 0; i--) {\n      j = lp->var_basic[i];\n      lp->is_basic[j] = TRUE;\n    }\n\n    /* If a column was deleted from the basis then simply add back a non-basic\n       slack variable; do two scans, if necessary to avoid adding equality slacks */\n    if(!isrow && (k < lp->rows)) {\n      for(j = 0; j <= 1; j++)\n      for(i = 1; (i <= lp->rows) && (k < lp->rows); i++)\n        if(!lp->is_basic[i]) {\n          if(!is_constr_type(lp, i, EQ) || (j == 1)) {\n            k++;\n            lp->var_basic[k] = i;\n            lp->is_basic[i] = TRUE;\n          }\n        }\n      k = 0;\n    }\n\n    /* We are left with \"k\" indexes; if no basis variable was deleted, k=rows and the\n       inverse is still valid, if k+delta < 0 we do not have a valid\n       basis and must create one (in most usage modes this should not happen,\n       unless there is a bug) */\n    if(k+delta < 0)\n      Ok = FALSE;\n    if(isrow || (k != lp->rows))\n      set_action(&lp->spx_action, ACTION_REINVERT);\n\n  }\n  return(Ok);\n\n}\n\nSTATIC MYBOOL shift_rowdata(lprec *lp, int base, int delta, LLrec *usedmap)\n/* Note: Assumes that \"lp->rows\" HAS NOT been updated to the new count */\n{\n  int i, ii;\n\n  /* Shift sparse matrix row data */\n  if(lp->matA->is_roworder)\n    mat_shiftcols(lp->matA, &base, delta, usedmap);\n  else\n    mat_shiftrows(lp->matA, &base, delta, usedmap);\n\n  /* Shift data down (insert row), and set default values in positive delta-gap */\n  if(delta > 0) {\n\n    /* Shift row data */\n    for(ii = lp->rows; ii >= base; ii--) {\n      i = ii + delta;\n      lp->orig_rhs[i] = lp->orig_rhs[ii];\n      lp->rhs[i] = lp->rhs[ii];\n      lp->row_type[i] = lp->row_type[ii];\n    }\n\n    /* Set defaults (actual basis set in separate procedure) */\n    for(i = 0; i < delta; i++) {\n      ii = base + i;\n      lp->orig_rhs[ii] = 0;\n      lp->rhs[ii] = 0;\n      lp->row_type[ii] = ROWTYPE_EMPTY;\n    }\n  }\n\n  /* Shift data up (delete row) */\n  else if(usedmap != NULL) {\n    for(i = 1, ii = firstActiveLink(usedmap); ii != 0;\n        i++, ii = nextActiveLink(usedmap, ii)) {\n      if(i == ii)\n        continue;\n      lp->orig_rhs[i] = lp->orig_rhs[ii];\n      lp->rhs[i] = lp->rhs[ii];\n      lp->row_type[i] = lp->row_type[ii];\n    }\n    delta = i - lp->rows - 1;\n  }\n  else if(delta < 0) {\n\n    /* First make sure we don't cross the row count border */\n    if(base-delta-1 > lp->rows)\n      delta = base - lp->rows - 1;\n\n    /* Shift row data (don't shift basis indexes here; done in next step) */\n    for(i = base; i <= lp->rows + delta; i++) {\n      ii = i - delta;\n      lp->orig_rhs[i] = lp->orig_rhs[ii];\n      lp->rhs[i] = lp->rhs[ii];\n      lp->row_type[i] = lp->row_type[ii];\n    }\n  }\n\n  shift_basis(lp, base, delta, usedmap, TRUE);\n  shift_rowcoldata(lp, base, delta, usedmap, TRUE);\n  inc_rows(lp, delta);\n\n  return(TRUE);\n}\n\nSTATIC MYBOOL shift_coldata(lprec *lp, int base, int delta, LLrec *usedmap)\n/* Note: Assumes that \"lp->columns\" has NOT been updated to the new count */\n{\n  int i, ii;\n\n  if(lp->bb_totalnodes == 0)\n    free_duals(lp);\n\n  /* Shift A matrix data */\n  if(lp->matA->is_roworder)\n    mat_shiftrows(lp->matA, &base, delta, usedmap);\n  else\n    mat_shiftcols(lp->matA, &base, delta, usedmap);\n\n  /* Shift data right (insert), and set default values in positive delta-gap */\n  if(delta > 0) {\n\n    /* Fix variable priority data */\n    if((lp->var_priority != NULL) && (base <= lp->columns)) {\n      for(i = 0; i < lp->columns; i++)\n        if(lp->var_priority[i] >= base)\n          lp->var_priority[i] += delta;\n    }\n    if((lp->sos_priority != NULL) && (base <= lp->columns)) {\n      for(i = 0; i < lp->sos_vars; i++)\n        if(lp->sos_priority[i] >= base)\n          lp->sos_priority[i] += delta;\n    }\n\n    /* Fix invalid split variable data */\n    if((lp->var_is_free != NULL) && (base <= lp->columns)) {\n      for(i = 1; i <= lp->columns; i++)\n        if(abs(lp->var_is_free[i]) >= base)\n          lp->var_is_free[i] += my_chsign(lp->var_is_free[i] < 0, delta);\n    }\n\n    /* Shift column data right */\n    for(ii = lp->columns; ii >= base; ii--) {\n      i = ii + delta;\n      lp->var_type[i] = lp->var_type[ii];\n      lp->sc_lobound[i] = lp->sc_lobound[ii];\n      lp->orig_obj[i] = lp->orig_obj[ii];\n      if(lp->obj != NULL)\n        lp->obj[i] = lp->obj[ii];\n/*\n      if(lp->objfromvalue != NULL)\n        lp->objfromvalue[i] = lp->objfromvalue[ii];\n      if(lp->objfrom != NULL)\n        lp->objfrom[i] = lp->objfrom[ii];\n      if(lp->objtill != NULL)\n        lp->objtill[i] = lp->objtill[ii];\n*/\n      if(lp->var_priority != NULL)\n        lp->var_priority[i-1] = lp->var_priority[ii-1];\n      if(lp->bb_varbranch != NULL)\n        lp->bb_varbranch[i-1] = lp->bb_varbranch[ii-1];\n      if(lp->var_is_free != NULL)\n        lp->var_is_free[i] = lp->var_is_free[ii];\n      if(lp->best_solution != NULL)\n        lp->best_solution[lp->rows + i] = lp->best_solution[lp->rows + ii];\n    }\n\n    /* Set defaults */\n    for(i = 0; i < delta; i++) {\n      ii = base + i;\n      lp->var_type[ii] = ISREAL;\n      lp->sc_lobound[ii] = 0;\n      lp->orig_obj[ii] = 0;\n      if(lp->obj != NULL)\n        lp->obj[ii] = 0;\n/*\n      if(lp->objfromvalue != NULL)\n        lp->objfromvalue[ii] = 0;\n      if(lp->objfrom != NULL)\n        lp->objfrom[ii] = 0;\n      if(lp->objtill != NULL)\n        lp->objtill[ii] = 0;\n*/\n      if(lp->var_priority != NULL)\n        lp->var_priority[ii-1] = ii;\n      if(lp->bb_varbranch != NULL)\n        lp->bb_varbranch[ii-1] = BRANCH_DEFAULT;\n      if(lp->var_is_free != NULL)\n        lp->var_is_free[ii] = 0;\n      if(lp->best_solution != NULL)\n        lp->best_solution[lp->rows + ii] = 0;\n    }\n  }\n\n  /* Shift data left (delete) */\n  else if(usedmap != NULL) {\n    /* Assume there is no need to handle split columns, since we are doing\n       this only from presolve, which comes before splitting of columns. */\n\n    /* First update counts */\n    if(lp->int_vars + lp->sc_vars > 0)\n    for(ii = firstInactiveLink(usedmap); ii != 0; ii = nextInactiveLink(usedmap, ii)) {\n      if(is_int(lp, ii)) {\n        lp->int_vars--;\n        if(SOS_is_member(lp->SOS, 0, ii))\n          lp->sos_ints--;\n      }\n      if(is_semicont(lp, ii))\n        lp->sc_vars--;\n    }\n    /* Shift array members */\n    for(i = 1, ii = firstActiveLink(usedmap); ii != 0;\n        i++, ii = nextActiveLink(usedmap, ii)) {\n      if(i == ii)\n        continue;\n      lp->var_type[i] = lp->var_type[ii];\n      lp->sc_lobound[i] = lp->sc_lobound[ii];\n      lp->orig_obj[i] = lp->orig_obj[ii];\n      if(lp->obj != NULL)\n        lp->obj[i] = lp->obj[ii];\n/*\n      if(lp->objfromvalue != NULL)\n        lp->objfromvalue[i] = lp->objfromvalue[ii];\n      if(lp->objfrom != NULL)\n        lp->objfrom[i] = lp->objfrom[ii];\n      if(lp->objtill != NULL)\n        lp->objtill[i] = lp->objtill[ii];\n*/\n      if(lp->bb_varbranch != NULL)\n        lp->bb_varbranch[i-1] = lp->bb_varbranch[ii-1];\n      if(lp->var_is_free != NULL)\n        lp->var_is_free[i] = lp->var_is_free[ii];\n      if(lp->best_solution != NULL)\n        lp->best_solution[lp->rows + i] = lp->best_solution[lp->rows + ii];\n    }\n    /* Shift variable priority data */\n    if((lp->var_priority != NULL) || (lp->sos_priority != NULL)) {\n      int *colmap = NULL, k;\n      allocINT(lp, &colmap, lp->columns + 1, TRUE);\n      for(i = 1, ii = 0; i <= lp->columns; i++) {\n        if(isActiveLink(usedmap, i)) {\n          ii++;\n          colmap[i] = ii;\n        }\n      }\n      if(lp->var_priority != NULL) {\n        for(i = 0, ii = 0; i < lp->columns; i++) {\n          k = colmap[lp->var_priority[i]];\n          if(k > 0) {\n            lp->var_priority[ii] = k;\n            ii++;\n          }\n        }\n      }\n      if(lp->sos_priority != NULL) {\n        for(i = 0, ii = 0; i < lp->sos_vars; i++) {\n          k = colmap[lp->sos_priority[i]];\n          if(k > 0) {\n            lp->sos_priority[ii] = k;\n            ii++;\n          }\n        }\n        lp->sos_vars = ii;\n      }\n      FREE(colmap);\n    }\n\n    delta = i - lp->columns - 1;\n  }\n  else if(delta < 0) {\n\n    /* Fix invalid split variable data */\n    if(lp->var_is_free != NULL) {\n      for(i = 1; i <= lp->columns; i++)\n        if(abs(lp->var_is_free[i]) >= base)\n          lp->var_is_free[i] -= my_chsign(lp->var_is_free[i] < 0, delta);\n    }\n\n    /* Shift column data (excluding the basis) */\n    for(i = base; i < base-delta; i++) {\n      if(is_int(lp, i)) {\n        lp->int_vars--;\n        if(SOS_is_member(lp->SOS, 0, i))\n          lp->sos_ints--;\n      }\n      if(is_semicont(lp, i))\n        lp->sc_vars--;\n    }\n    for(i = base; i <= lp->columns + delta; i++) {\n      ii = i - delta;\n      lp->var_type[i] = lp->var_type[ii];\n      lp->sc_lobound[i] = lp->sc_lobound[ii];\n      lp->orig_obj[i] = lp->orig_obj[ii];\n      if(lp->obj != NULL)\n        lp->obj[i] = lp->obj[ii];\n/*\n      if(lp->objfromvalue != NULL)\n        lp->objfromvalue[i] = lp->objfromvalue[ii];\n      if(lp->objfrom != NULL)\n        lp->objfrom[i] = lp->objfrom[ii];\n      if(lp->objtill != NULL)\n        lp->objtill[i] = lp->objtill[ii];\n*/\n      if(lp->var_priority != NULL)\n        lp->var_priority[i-1] = lp->var_priority[ii-1];\n      if(lp->bb_varbranch != NULL)\n        lp->bb_varbranch[i-1] = lp->bb_varbranch[ii-1];\n      if(lp->var_is_free != NULL)\n        lp->var_is_free[i] = lp->var_is_free[ii];\n      if(lp->best_solution != NULL)\n        lp->best_solution[lp->rows + i] = lp->best_solution[lp->rows + ii];\n    }\n\n    /* Fix invalid variable priority data */\n    if(lp->var_priority != NULL) {\n      for(i = 0, ii = 0; i < lp->columns; i++)\n        if(lp->var_priority[i] > base - delta)\n          lp->var_priority[ii++] = lp->var_priority[i] + delta;\n        else if(lp->var_priority[i] < base)\n          lp->var_priority[ii++] = lp->var_priority[i];\n    }\n    if(lp->sos_priority != NULL) {\n      for(i = 0, ii = 0; i < lp->sos_vars; i++) {\n        if(lp->sos_priority[i] > base - delta)\n          lp->sos_priority[ii++] = lp->sos_priority[i] + delta;\n        else if(lp->sos_priority[i] < base)\n          lp->sos_priority[ii++] = lp->sos_priority[i];\n      }\n      lp->sos_vars = ii;\n    }\n\n  }\n\n  shift_basis(lp, lp->rows+base, delta, usedmap, FALSE);\n  if(SOS_count(lp) > 0)\n    SOS_shift_col(lp->SOS, 0, base, delta, usedmap, FALSE);\n  shift_rowcoldata(lp, lp->rows+base, delta, usedmap, FALSE);\n  inc_columns(lp, delta);\n\n  return( TRUE );\n}\n\n/* Utility group for incrementing row and column vector storage space */\nSTATIC void inc_rows(lprec *lp, int delta)\n{\n  int i;\n\n  if(lp->names_used && (lp->row_name != NULL))\n    for(i = lp->rows + delta; i > lp->rows; i--)\n      lp->row_name[i] = NULL;\n\n  lp->rows += delta;\n  if(lp->matA->is_roworder)\n    lp->matA->columns += delta;\n  else\n    lp->matA->rows += delta;\n}\n\nSTATIC void inc_columns(lprec *lp, int delta)\n{\n  int i;\n\n  if(lp->names_used && (lp->col_name != NULL))\n    for(i = lp->columns + delta; i > lp->columns; i--)\n      lp->col_name[i] = NULL;\n\n  lp->columns += delta;\n  if(lp->matA->is_roworder)\n    lp->matA->rows += delta;\n  else\n    lp->matA->columns += delta;\n  if(get_Lrows(lp) > 0)\n    lp->matL->columns += delta;\n}\n\nSTATIC MYBOOL inc_rowcol_space(lprec *lp, int delta, MYBOOL isrows)\n{\n  int i, oldrowcolalloc, rowcolsum;\n\n  /* Get rid of dual arrays */\n  if(lp->solvecount > 0)\n    free_duals(lp);\n\n  /* Set constants */\n  oldrowcolalloc = lp->sum_alloc;\n  lp->sum_alloc += delta;\n  rowcolsum = lp->sum_alloc + 1;\n\n  /* Reallocate lp memory */\n  if(!allocREAL(lp, &lp->upbo, rowcolsum, AUTOMATIC) ||\n     !allocREAL(lp, &lp->orig_upbo, rowcolsum, AUTOMATIC) ||\n     !allocREAL(lp, &lp->lowbo, rowcolsum, AUTOMATIC) ||\n     !allocREAL(lp, &lp->orig_lowbo, rowcolsum, AUTOMATIC) ||\n     !allocREAL(lp, &lp->solution, rowcolsum, AUTOMATIC) ||\n     !allocREAL(lp, &lp->best_solution, rowcolsum, AUTOMATIC) ||\n     !allocMYBOOL(lp, &lp->is_basic, rowcolsum, AUTOMATIC) ||\n     !allocMYBOOL(lp, &lp->is_lower, rowcolsum, AUTOMATIC) ||\n     ((lp->scalars != NULL) && !allocREAL(lp, &lp->scalars, rowcolsum, AUTOMATIC)))\n    return( FALSE );\n\n  /* Fill in default values, where appropriate */\n  for(i = oldrowcolalloc+1; i < rowcolsum; i++) {\n    lp->upbo[i] = lp->infinite;\n    lp->orig_upbo[i] = lp->upbo[i];\n    lp->lowbo[i] = 0;\n    lp->orig_lowbo[i] = lp->lowbo[i];\n    lp->is_basic[i] = FALSE;\n    lp->is_lower[i] = TRUE;\n  }\n\n  /* Deal with scalars; the vector can be NULL and also contains Lagrangean information */\n  if(lp->scalars != NULL) {\n    for(i = oldrowcolalloc+1; i < rowcolsum; i++)\n      lp->scalars[i] = 1;\n    if(oldrowcolalloc == 0)\n      lp->scalars[0] = 1;\n  }\n\n  return( inc_presolve_space(lp, delta, isrows) &&\n           resizePricer(lp) );\n}\n\nSTATIC MYBOOL inc_lag_space(lprec *lp, int deltarows, MYBOOL ignoreMAT)\n{\n  int newsize;\n\n  if(deltarows > 0) {\n\n    newsize = get_Lrows(lp) + deltarows;\n\n    /* Reallocate arrays */\n    if(!allocREAL(lp, &lp->lag_rhs, newsize+1, AUTOMATIC) ||\n       !allocREAL(lp, &lp->lambda, newsize+1, AUTOMATIC) ||\n       !allocINT(lp, &lp->lag_con_type, newsize+1, AUTOMATIC))\n      return( FALSE );\n\n    /* Reallocate the matrix (note that the row scalars are stored at index 0) */\n    if(!ignoreMAT) {\n      if(lp->matL == NULL)\n        lp->matL = mat_create(lp, newsize, lp->columns, lp->epsvalue);\n      else\n        inc_matrow_space(lp->matL, deltarows);\n    }\n    lp->matL->rows += deltarows;\n\n  }\n  /* Handle column count expansion as special case */\n  else if(!ignoreMAT) {\n    inc_matcol_space(lp->matL, lp->columns_alloc-lp->matL->columns_alloc+1);\n  }\n\n\n  return( TRUE );\n}\n\nSTATIC MYBOOL inc_row_space(lprec *lp, int deltarows)\n{\n  int    i, rowsum, oldrowsalloc;\n  MYBOOL ok = TRUE;\n\n  /* Adjust lp row structures */\n  i = lp->rows_alloc+deltarows;\n  if(lp->matA->is_roworder) {\n    i -= lp->matA->columns_alloc;\n    SETMIN(i, deltarows);\n    if(i > 0)\n      inc_matcol_space(lp->matA, i);\n    rowsum = lp->matA->columns_alloc;\n  }\n  else {\n#if 0\n    if((lp->rows_alloc > 0) && (lp->rows + deltarows > lp->rows_alloc))\n      i = deltarows; /* peno 25/12/06 */\n    else\n#endif\n      i -= lp->matA->rows_alloc;\n    SETMIN(i, deltarows);\n    if(i > 0)\n      inc_matrow_space(lp->matA, i);\n    rowsum = lp->matA->rows_alloc;\n  }\n  if(lp->rows+deltarows > lp->rows_alloc) {\n\n    rowsum++;\n    oldrowsalloc = lp->rows_alloc;\n    lp->rows_alloc = rowsum;\n    deltarows = rowsum - oldrowsalloc;\n    rowsum++;\n\n    if(!allocREAL(lp, &lp->orig_rhs, rowsum, AUTOMATIC) ||\n       !allocLREAL(lp, &lp->rhs, rowsum, AUTOMATIC) ||\n       !allocINT(lp, &lp->row_type, rowsum, AUTOMATIC) ||\n       !allocINT(lp, &lp->var_basic, rowsum, AUTOMATIC))\n      return( FALSE );\n\n    if(oldrowsalloc == 0) {\n      lp->var_basic[0] = AUTOMATIC; /*TRUE;*/  /* Indicates default basis */\n      lp->orig_rhs[0] = 0;\n      lp->row_type[0] = ROWTYPE_OFMIN;\n    }\n    for(i = oldrowsalloc+1; i < rowsum; i++) {\n      lp->orig_rhs[i] = 0;\n      lp->rhs[i] = 0;\n      lp->row_type[i] = ROWTYPE_EMPTY;\n      lp->var_basic[i] = i;\n    }\n\n    /* Adjust hash name structures */\n    if(lp->names_used && (lp->row_name != NULL)) {\n\n      /* First check the hash table */\n      if(lp->rowname_hashtab->size < lp->rows_alloc) {\n        hashtable *ht;\n\n        ht = copy_hash_table(lp->rowname_hashtab, lp->row_name, lp->rows_alloc + 1);\n        if(ht == NULL) {\n          lp->spx_status = NOMEMORY;\n          return( FALSE );\n        }\n        free_hash_table(lp->rowname_hashtab);\n        lp->rowname_hashtab = ht;\n      }\n\n      /* Then the string storage (i.e. pointer to the item's hash structure) */\n      lp->row_name = (hashelem **) realloc(lp->row_name, (rowsum) * sizeof(*lp->row_name));\n      if(lp->row_name == NULL) {\n        lp->spx_status = NOMEMORY;\n        return( FALSE );\n      }\n      for(i = oldrowsalloc + 1; i < rowsum; i++)\n        lp->row_name[i] = NULL;\n    }\n\n    ok = inc_rowcol_space(lp, deltarows, TRUE);\n\n  }\n  return(ok);\n}\n\nSTATIC MYBOOL inc_col_space(lprec *lp, int deltacols)\n{\n  int i,colsum, oldcolsalloc;\n\n  i = lp->columns_alloc+deltacols;\n  if(lp->matA->is_roworder) {\n    i -= lp->matA->rows_alloc;\n    SETMIN(i, deltacols);\n    if(i > 0)\n      inc_matrow_space(lp->matA, i);\n    colsum = lp->matA->rows_alloc;\n  }\n  else {\n    i -= lp->matA->columns_alloc;\n    SETMIN(i, deltacols);\n    if(i > 0)\n      inc_matcol_space(lp->matA, i);\n    colsum = lp->matA->columns_alloc;\n  }\n\n  if(lp->columns+deltacols >= lp->columns_alloc) {\n\n    colsum++;\n    oldcolsalloc = lp->columns_alloc;\n    lp->columns_alloc = colsum;\n    deltacols = colsum - oldcolsalloc;\n    colsum++;\n\n    /* Adjust hash name structures */\n    if(lp->names_used && (lp->col_name != NULL)) {\n\n      /* First check the hash table */\n      if(lp->colname_hashtab->size < lp->columns_alloc) {\n        hashtable *ht;\n\n        ht = copy_hash_table(lp->colname_hashtab, lp->col_name, lp->columns_alloc + 1);\n        if(ht != NULL) {\n          free_hash_table(lp->colname_hashtab);\n          lp->colname_hashtab = ht;\n        }\n      }\n\n      /* Then the string storage (i.e. pointer to the item's hash structure) */\n      lp->col_name = (hashelem **) realloc(lp->col_name, (colsum) * sizeof(*lp->col_name));\n      for(i = oldcolsalloc+1; i < colsum; i++)\n        lp->col_name[i] = NULL;\n    }\n\n    if(!allocREAL(lp, &lp->orig_obj, colsum, AUTOMATIC) ||\n       !allocMYBOOL(lp, &lp->var_type, colsum, AUTOMATIC) ||\n       !allocREAL(lp, &lp->sc_lobound, colsum, AUTOMATIC) ||\n       ((lp->obj != NULL) && !allocREAL(lp, &lp->obj, colsum, AUTOMATIC)) ||\n       ((lp->var_priority != NULL) && !allocINT(lp, &lp->var_priority, colsum-1, AUTOMATIC)) ||\n       ((lp->var_is_free != NULL) && !allocINT(lp, &lp->var_is_free, colsum, AUTOMATIC)) ||\n       ((lp->bb_varbranch != NULL) && !allocMYBOOL(lp, &lp->bb_varbranch, colsum-1, AUTOMATIC)))\n      return( FALSE );\n\n    /* Make sure that Lagrangean constraints have the same number of columns */\n    if(get_Lrows(lp) > 0)\n      inc_lag_space(lp, 0, FALSE);\n\n    /* Update column pointers */\n    for(i = MIN(oldcolsalloc, lp->columns) + 1; i < colsum; i++) {\n      lp->orig_obj[i] = 0;\n      if(lp->obj != NULL)\n        lp->obj[i] = 0;\n      lp->var_type[i] = ISREAL;\n      lp->sc_lobound[i] = 0;\n      if(lp->var_priority != NULL)\n        lp->var_priority[i-1] = i;\n    }\n\n    if(lp->var_is_free != NULL) {\n      for(i = oldcolsalloc+1; i < colsum; i++)\n        lp->var_is_free[i] = 0;\n    }\n\n    if(lp->bb_varbranch != NULL) {\n      for(i = oldcolsalloc; i < colsum-1; i++)\n        lp->bb_varbranch[i] = BRANCH_DEFAULT;\n    }\n\n    inc_rowcol_space(lp, deltacols, FALSE);\n\n  }\n  return(TRUE);\n}\n\n/* Problem manipulation routines */\n\nMYBOOL __WINAPI set_obj(lprec *lp, int colnr, REAL value)\n{\n  if(colnr <= 0)\n    colnr = set_rh(lp, 0, value);\n  else\n    colnr = set_mat(lp, 0, colnr, value);\n  return((MYBOOL) colnr);\n}\n\nMYBOOL __WINAPI set_obj_fnex(lprec *lp, int count, REAL *row, int *colno)\n{\n  MYBOOL chsgn = is_maxim(lp);\n  int    i, ix;\n  REAL   value;\n\n  if(row == NULL)\n    return( FALSE );\n\n  else if(colno == NULL) {\n    if(count <= 0)\n      count = lp->columns;\n    for(i = 1; i <= count; i++) {\n      value = row[i];\n#ifdef DoMatrixRounding\n      value = roundToPrecision(value, lp->matA->epsvalue);\n#endif\n      lp->orig_obj[i] = my_chsign(chsgn, scaled_mat(lp, value, 0, i));\n    }\n  }\n  else {\n    MEMCLEAR(lp->orig_obj, lp->columns+1);\n    for(i = 0; i < count; i++) {\n      ix = colno[i];\n      value = row[i];\n#ifdef DoMatrixRounding\n      value = roundToPrecision(value, lp->matA->epsvalue);\n#endif\n      lp->orig_obj[ix] = my_chsign(chsgn, scaled_mat(lp, value, 0, ix));\n    }\n  }\n\n  return(TRUE);\n}\n\nMYBOOL __WINAPI set_obj_fn(lprec *lp, REAL *row)\n{\n  return( set_obj_fnex(lp, 0, row, NULL) );\n}\n\nMYBOOL __WINAPI str_set_obj_fn(lprec *lp, char *row_string)\n{\n  int    i;\n  MYBOOL ret = TRUE;\n  REAL   *arow;\n  char   *p, *newp;\n\n  allocREAL(lp, &arow, lp->columns + 1, FALSE);\n  p = row_string;\n  for(i = 1; i <= lp->columns; i++) {\n    arow[i] = (REAL) strtod(p, &newp);\n    if(p == newp) {\n      report(lp, IMPORTANT, \"str_set_obj_fn: Bad string %s\\n\", p);\n      lp->spx_status = DATAIGNORED;\n      ret = FALSE;\n      break;\n    }\n    else\n      p = newp;\n  }\n  if(lp->spx_status != DATAIGNORED)\n    ret = set_obj_fn(lp, arow);\n  FREE(arow);\n  return( ret );\n}\n\nSTATIC MYBOOL append_columns(lprec *lp, int deltacolumns)\n{\n  if(!inc_col_space(lp, deltacolumns))\n    return( FALSE );\n  varmap_add(lp, lp->sum+1, deltacolumns);\n  shift_coldata(lp, lp->columns+1, deltacolumns, NULL);\n  return( TRUE );\n}\n\nSTATIC MYBOOL append_rows(lprec *lp, int deltarows)\n{\n  if(!inc_row_space(lp, deltarows))\n    return( FALSE );\n  varmap_add(lp, lp->rows+1, deltarows);\n  shift_rowdata(lp, lp->rows+1, deltarows, NULL);\n\n  return( TRUE );\n}\n\nMYBOOL __WINAPI set_add_rowmode(lprec *lp, MYBOOL turnon)\n{\n  if((lp->solvecount == 0) && (turnon ^ lp->matA->is_roworder))\n    return( mat_transpose(lp->matA) );\n  else\n    return( FALSE );\n}\n\nMYBOOL __WINAPI is_add_rowmode(lprec *lp)\n{\n  return(lp->matA->is_roworder);\n}\n\nMYBOOL __WINAPI set_row(lprec *lp, int rownr, REAL *row)\n{\n  if((rownr < 0) || (rownr > lp->rows)) {\n    report(lp, IMPORTANT, \"set_row: Row %d out of range\\n\", rownr);\n    return( FALSE );\n  }\n  if(rownr == 0)\n    return( set_obj_fn(lp, row) );\n  else\n    return( mat_setrow(lp->matA, rownr, lp->columns, row, NULL, TRUE, TRUE) );\n}\n\nMYBOOL __WINAPI set_rowex(lprec *lp, int rownr, int count, REAL *row, int *colno)\n{\n  if((rownr < 0) || (rownr > lp->rows)) {\n    report(lp, IMPORTANT, \"set_rowex: Row %d out of range\\n\", rownr);\n    return( FALSE );\n  }\n  if(rownr == 0)\n    return( set_obj_fnex(lp, count, row, colno) );\n  else\n    return( mat_setrow(lp->matA, rownr, count, row, colno, TRUE, TRUE) );\n}\n\nMYBOOL __WINAPI add_constraintex(lprec *lp, int count, REAL *row, int *colno, int constr_type, REAL rh)\n{\n  int    n;\n  MYBOOL status = FALSE;\n\n  if(!(constr_type == LE || constr_type == GE || constr_type == EQ)) {\n    report(lp, IMPORTANT, \"add_constraintex: Invalid %d constraint type\\n\", constr_type);\n    return( status );\n  }\n\n  /* Prepare for a new row */\n  if(!append_rows(lp, 1))\n    return( status );\n\n  /* Set constraint parameters, fix the slack */\n  if((constr_type & ROWTYPE_CONSTRAINT) == EQ) {\n    lp->equalities++;\n    lp->orig_upbo[lp->rows] = 0;\n    lp->upbo[lp->rows] = 0;\n  }\n  lp->row_type[lp->rows] = constr_type;\n\n  if(is_chsign(lp, lp->rows) && (rh != 0))\n    lp->orig_rhs[lp->rows] = -rh;\n  else\n    lp->orig_rhs[lp->rows] = rh;\n\n  /* Insert the non-zero constraint values */\n  if(colno == NULL && row != NULL)\n    n = lp->columns;\n  else\n    n = count;\n  mat_appendrow(lp->matA, n, row, colno, my_chsign(is_chsign(lp, lp->rows), 1.0), TRUE);\n  if(!lp->varmap_locked)\n    presolve_setOrig(lp, lp->rows, lp->columns);\n\n#ifdef Paranoia\n  if(lp->matA->is_roworder)\n    n = lp->matA->columns;\n  else\n    n = lp->matA->rows;\n  if(lp->rows != n) {\n    report(lp, SEVERE, \"add_constraintex: Row count mismatch %d vs %d\\n\",\n                       lp->rows, n);\n  }\n  else if(is_BasisReady(lp) && !verify_basis(lp))\n    report(lp, SEVERE, \"add_constraintex: Invalid basis detected for row %d\\n\", lp->rows);\n  else\n#endif\n  status = TRUE;\n\n  return( status );\n}\n\nMYBOOL __WINAPI add_constraint(lprec *lp, REAL *row, int constr_type, REAL rh)\n{\n  return( add_constraintex(lp, 0, row, NULL, constr_type, rh) );\n}\n\nMYBOOL __WINAPI str_add_constraint(lprec *lp, char *row_string, int constr_type, REAL rh)\n{\n  int    i;\n  char   *p, *newp;\n  REAL   *aRow;\n  MYBOOL status = FALSE;\n\n  allocREAL(lp, &aRow, lp->columns + 1, FALSE);\n  p = row_string;\n\n  for(i = 1; i <= lp->columns; i++) {\n    aRow[i] = (REAL) strtod(p, &newp);\n    if(p == newp) {\n      report(lp, IMPORTANT, \"str_add_constraint: Bad string '%s'\\n\", p);\n      lp->spx_status = DATAIGNORED;\n      break;\n    }\n    else\n      p = newp;\n  }\n  if(lp->spx_status != DATAIGNORED)\n    status = add_constraint(lp, aRow, constr_type, rh);\n  FREE(aRow);\n\n  return(status);\n}\n\nSTATIC MYBOOL del_constraintex(lprec *lp, LLrec *rowmap)\n{\n  int i;\n\n  if(lp->equalities > 0)\n  for(i = firstInactiveLink(rowmap); i != 0; i = nextInactiveLink(rowmap, i)) {\n    if(is_constr_type(lp, i, EQ)) {\n#ifdef Paranoia\n      if(lp->equalities == 0)\n        report(lp, SEVERE, \"del_constraintex: Invalid count of equality constraints\\n\");\n#endif\n       lp->equalities--;\n    }\n  }\n\n  varmap_delete(lp, 1, -1, rowmap);\n  shift_rowdata(lp, 1, -1, rowmap);\n  if(!lp->varmap_locked) {\n    presolve_setOrig(lp, lp->rows, lp->columns);\n    if(lp->names_used)\n      del_varnameex(lp, lp->row_name, lp->rows, lp->rowname_hashtab, 0, rowmap);\n  }\n\n#ifdef Paranoia\n  if(is_BasisReady(lp) && !verify_basis(lp))\n    report(lp, SEVERE, \"del_constraintex: Invalid basis detected\\n\");\n#endif\n\n  return(TRUE);\n}\nMYBOOL __WINAPI del_constraint(lprec *lp, int rownr)\n{\n  MYBOOL preparecompact = (MYBOOL) (rownr < 0);\n\n  if(preparecompact)\n    rownr = -rownr;\n  if((rownr < 1) || (rownr > lp->rows)) {\n    report(lp, IMPORTANT, \"del_constraint: Attempt to delete non-existing constraint %d\\n\", rownr);\n    return(FALSE);\n  }\n  /*\n  if(lp->matA->is_roworder) {\n    report(lp, IMPORTANT, \"del_constraint: Cannot delete constraint while in row entry mode.\\n\");\n    return(FALSE);\n  }\n  */\n\n  if(is_constr_type(lp, rownr, EQ) && (lp->equalities > 0))\n    lp->equalities--;\n\n  varmap_delete(lp, my_chsign(preparecompact, rownr), -1, NULL);\n  shift_rowdata(lp, my_chsign(preparecompact, rownr), -1, NULL);\n\n/*\n   peno 04.10.07\n   Fixes a problem with del_constraint.\n   Constraints names were not shifted and reported variable result was incorrect.\n   See UnitTest1, UnitTest2\n\n   min: -2 x3;\n\n   c1: +x2 -x1 <= 10;\n   c: 0 x3 <= 0;\n   c2: +x3 +x2 +x1 <= 20;\n\n   2 <= x3 <= 3;\n   x1 <= 30;\n\n   // del_constraint(lp, 2);\n\n   // See write_LP and print_solution result\n\n   // To fix, commented if(!lp->varmap_locked)\n\n*/\n  if(!lp->varmap_locked)\n  {\n    presolve_setOrig(lp, lp->rows, lp->columns);\n    if(lp->names_used)\n      del_varnameex(lp, lp->row_name, lp->rows, lp->rowname_hashtab, rownr, NULL);\n  }\n\n#ifdef Paranoia\n  if(is_BasisReady(lp) && !verify_basis(lp))\n    report(lp, SEVERE, \"del_constraint: Invalid basis detected at row %d\\n\", rownr);\n#endif\n\n  return(TRUE);\n}\n\nMYBOOL __WINAPI add_lag_con(lprec *lp, REAL *row, int con_type, REAL rhs)\n{\n  int  k;\n  REAL sign;\n\n  if(con_type == LE || con_type == EQ)\n    sign = 1;\n  else if(con_type == GE)\n    sign = -1;\n  else {\n    report(lp, IMPORTANT, \"add_lag_con: Constraint type %d not implemented\\n\", con_type);\n    return(FALSE);\n  }\n\n  inc_lag_space(lp, 1, FALSE);\n\n  k = get_Lrows(lp);\n  lp->lag_rhs[k] = rhs * sign;\n  mat_appendrow(lp->matL, lp->columns, row, NULL, sign, TRUE);\n  lp->lambda[k] = 0;\n  lp->lag_con_type[k] = con_type;\n\n  return(TRUE);\n}\n\nMYBOOL __WINAPI str_add_lag_con(lprec *lp, char *row_string, int con_type, REAL rhs)\n{\n  int    i;\n  MYBOOL ret = TRUE;\n  REAL   *a_row;\n  char   *p, *new_p;\n\n  allocREAL(lp, &a_row, lp->columns + 1, FALSE);\n  p = row_string;\n\n  for(i = 1; i <= lp->columns; i++) {\n    a_row[i] = (REAL) strtod(p, &new_p);\n    if(p == new_p) {\n      report(lp, IMPORTANT, \"str_add_lag_con: Bad string '%s'\\n\", p);\n      lp->spx_status = DATAIGNORED;\n      ret = FALSE;\n      break;\n    }\n    else\n      p = new_p;\n  }\n  if(lp->spx_status != DATAIGNORED)\n    ret = add_lag_con(lp, a_row, con_type, rhs);\n  FREE(a_row);\n  return( ret );\n}\n\n/* INLINE */ MYBOOL is_splitvar(lprec *lp, int colnr)\n/* Two cases handled by var_is_free:\n\n   1) LB:-Inf / UB:<Inf variables\n      No helper column created, sign of var_is_free set negative with index to itself.\n   2) LB:-Inf / UB: Inf (free) variables\n      Sign of var_is_free set positive with index to new helper column,\n      helper column created with negative var_is_free with index to the original column.\n\n   This function helps identify the helper column in 2).\n*/\n{\n   return((MYBOOL) ((lp->var_is_free != NULL) &&\n                    (lp->var_is_free[colnr] < 0) && (-lp->var_is_free[colnr] != colnr)));\n}\n\nvoid del_splitvars(lprec *lp)\n{\n  int j, jj, i;\n\n  if(lp->var_is_free != NULL) {\n    for(j = lp->columns; j >= 1; j--)\n      if(is_splitvar(lp, j)) {\n        /* Check if we need to modify the basis */\n        jj = lp->rows+abs(lp->var_is_free[j]);\n        i = lp->rows+j;\n        if(lp->is_basic[i] && !lp->is_basic[jj]) {\n          i = findBasisPos(lp, i, NULL);\n          set_basisvar(lp, i, jj);\n        }\n        /* Delete the helper column */\n        del_column(lp, j);\n      }\n    FREE(lp->var_is_free);\n  }\n}\n\nMYBOOL __WINAPI set_column(lprec *lp, int colnr, REAL *column)\n{\n  return( mat_setcol(lp->matA, colnr, lp->rows, column, NULL, TRUE, TRUE) );\n}\n\nMYBOOL __WINAPI set_columnex(lprec *lp, int colnr, int count, REAL *column, int *rowno)\n{\n  return( mat_setcol(lp->matA, colnr, count, column, rowno, TRUE, TRUE) );\n}\n\nMYBOOL __WINAPI add_columnex(lprec *lp, int count, REAL *column, int *rowno)\n/* This function adds a data column to the current model; three cases handled:\n\n    1: Prepare for column data by setting column = NULL\n    2: Dense vector indicated by (rowno == NULL) over 0..count+get_Lrows() elements\n    3: Sparse vector set over row vectors rowno, over 0..count-1 elements.\n\n   NB! If the column has only one entry, this should be handled as\n       a bound, but this currently is not the case  */\n{\n  MYBOOL status = FALSE;\n\n /* Prepare and shift column vectors */\n  if(!append_columns(lp, 1))\n    return( status );\n\n /* Append sparse regular constraint values */\n  if(mat_appendcol(lp->matA, count, column, rowno, 1.0, TRUE) < 0)\n    report(lp, SEVERE, \"add_columnex: Data column %d supplied in non-ascending row index order.\\n\",\n                       lp->columns);\n  else\n#ifdef Paranoia\n  if(lp->columns != (lp->matA->is_roworder ? lp->matA->rows : lp->matA->columns)) {\n    report(lp, SEVERE, \"add_columnex: Column count mismatch %d vs %d\\n\",\n                       lp->columns, (lp->matA->is_roworder ? lp->matA->rows : lp->matA->columns));\n  }\n  else if(is_BasisReady(lp) && (lp->P1extraDim == 0) && !verify_basis(lp))\n    report(lp, SEVERE, \"add_columnex: Invalid basis detected for column %d\\n\",\n                       lp->columns);\n  else\n#endif\n    status = TRUE;\n\n  if(!lp->varmap_locked)\n    presolve_setOrig(lp, lp->rows, lp->columns);\n\n  return( status );\n}\n\nMYBOOL __WINAPI add_column(lprec *lp, REAL *column)\n{\n  del_splitvars(lp);\n  return(add_columnex(lp, lp->rows, column, NULL));\n}\n\nMYBOOL __WINAPI str_add_column(lprec *lp, char *col_string)\n{\n  int  i;\n  MYBOOL ret = TRUE;\n  REAL *aCol;\n  char *p, *newp;\n\n  allocREAL(lp, &aCol, lp->rows + 1, FALSE);\n  p = col_string;\n\n  for(i = 0; i <= lp->rows; i++) {\n    aCol[i] = (REAL) strtod(p, &newp);\n    if(p == newp) {\n      report(lp, IMPORTANT, \"str_add_column: Bad string '%s'\\n\", p);\n      lp->spx_status = DATAIGNORED;\n      ret = FALSE;\n      break;\n    }\n    else\n      p = newp;\n  }\n  if(lp->spx_status != DATAIGNORED)\n    ret = add_column(lp, aCol);\n  FREE(aCol);\n  return( ret );\n}\n\nSTATIC MYBOOL del_varnameex(lprec *lp, hashelem **namelist, int items, hashtable *ht, int varnr, LLrec *varmap)\n{\n  int i, n;\n\n  /* First drop hash table entries of the deleted variables */\n  if(varmap != NULL)\n    i = firstInactiveLink(varmap);\n  else\n    i = varnr;\n  while(i > 0) {\n    if(namelist[i] != NULL) {\n      if(namelist[i]->name != NULL)\n        drophash(namelist[i]->name, namelist, ht);\n    }\n    if(varmap != NULL)\n      i = nextInactiveLink(varmap, i);\n    else\n      i = 0;\n  }\n\n  /* Then compress the name list */\n  if(varmap != NULL) {\n    i = firstInactiveLink(varmap);\n    n = nextActiveLink(varmap, i);\n    varnr = i;\n  }\n  else {\n    i = varnr;\n    n = i + 1;\n  }\n  while(n != 0) {\n    namelist[i] = namelist[n];\n    if((namelist[i] != NULL) && (namelist[i]->index > varnr))\n      namelist[i]->index -= n - i;\n    i++;\n    if(varmap != NULL)\n      n = nextActiveLink(varmap, i);\n    else if(n <= items) /* items has been updated for the new count */\n      n++;\n    else\n      n = 0;\n  }\n\n  return( TRUE );\n}\nSTATIC MYBOOL del_columnex(lprec *lp, LLrec *colmap)\n{\n  varmap_delete(lp, lp->rows+1, -1, colmap);\n  shift_coldata(lp, 1, -1, colmap);\n  if(!lp->varmap_locked) {\n    presolve_setOrig(lp, lp->rows, lp->columns);\n    if(lp->names_used)\n      del_varnameex(lp, lp->col_name, lp->columns, lp->colname_hashtab, 0, colmap);\n  }\n#ifdef Paranoia\n  if(is_BasisReady(lp) && (lp->P1extraDim == 0) && !verify_basis(lp))\n    report(lp, SEVERE, \"del_columnex: Invalid basis detected\\n\");\n#endif\n\n  return(TRUE);\n}\nMYBOOL __WINAPI del_column(lprec *lp, int colnr)\n{\n  MYBOOL preparecompact = (MYBOOL) (colnr < 0);\n\n  if(preparecompact)\n    colnr = -colnr;\n  if((colnr > lp->columns) || (colnr < 1)) {\n    report(lp, IMPORTANT, \"del_column: Column %d out of range\\n\", colnr);\n    return(FALSE);\n  }\n  /*\n  if(lp->matA->is_roworder) {\n    report(lp, IMPORTANT, \"del_column: Cannot delete column while in row entry mode.\\n\");\n    return(FALSE);\n  }\n  */\n\n  if((lp->var_is_free != NULL) && (lp->var_is_free[colnr] > 0))\n    del_column(lp, lp->var_is_free[colnr]); /* delete corresponding split column (is always after this column) */\n\n  varmap_delete(lp, my_chsign(preparecompact, lp->rows+colnr), -1, NULL);\n  shift_coldata(lp, my_chsign(preparecompact, colnr), -1, NULL);\n  if(!lp->varmap_locked) {\n    presolve_setOrig(lp, lp->rows, lp->columns);\n    if(lp->names_used)\n      del_varnameex(lp, lp->col_name, lp->columns, lp->colname_hashtab, colnr, NULL);\n  }\n#ifdef Paranoia\n  if(is_BasisReady(lp) && (lp->P1extraDim == 0) && !verify_basis(lp))\n    report(lp, SEVERE, \"del_column: Invalid basis detected at column %d (%d)\\n\", colnr, lp->columns);\n#endif\n\n  return(TRUE);\n}\n\nvoid __WINAPI set_simplextype(lprec *lp, int simplextype)\n{\n  lp->simplex_strategy = simplextype;\n}\n\nint __WINAPI get_simplextype(lprec *lp)\n{\n  return(lp->simplex_strategy);\n}\n\nvoid __WINAPI set_preferdual(lprec *lp, MYBOOL dodual)\n{\n  if(dodual & TRUE)\n    lp->simplex_strategy = SIMPLEX_DUAL_DUAL;\n  else\n    lp->simplex_strategy = SIMPLEX_PRIMAL_PRIMAL;\n}\n\nvoid __WINAPI set_bounds_tighter(lprec *lp, MYBOOL tighten)\n{\n  lp->tighten_on_set = tighten;\n}\nMYBOOL __WINAPI get_bounds_tighter(lprec *lp)\n{\n  return(lp->tighten_on_set);\n}\n\nMYBOOL __WINAPI set_upbo(lprec *lp, int colnr, REAL value)\n{\n  if((colnr > lp->columns) || (colnr < 1)) {\n    report(lp, IMPORTANT, \"set_upbo: Column %d out of range\\n\", colnr);\n    return(FALSE);\n  }\n\n#ifdef DoBorderRounding\n  if(fabs(value) < lp->infinite)\n    value = my_avoidtiny(value, lp->matA->epsvalue);\n#endif\n  value = scaled_value(lp, value, lp->rows + colnr);\n  if(lp->tighten_on_set) {\n    if(value < lp->orig_lowbo[lp->rows + colnr]) {\n      report(lp, IMPORTANT, \"set_upbo: Upperbound must be >= lowerbound\\n\");\n      return(FALSE);\n    }\n    if(value < lp->orig_upbo[lp->rows + colnr]) {\n      set_action(&lp->spx_action, ACTION_REBASE);\n      lp->orig_upbo[lp->rows + colnr] = value;\n    }\n  }\n  else\n  {\n    set_action(&lp->spx_action, ACTION_REBASE);\n    if(value > lp->infinite)\n      value = lp->infinite;\n    lp->orig_upbo[lp->rows + colnr] = value;\n  }\n  return(TRUE);\n}\n\nREAL __WINAPI get_upbo(lprec *lp, int colnr)\n{\n  REAL value;\n\n  if((colnr > lp->columns) || (colnr < 1)) {\n    report(lp, IMPORTANT, \"get_upbo: Column %d out of range\\n\", colnr);\n    return(0);\n  }\n\n  value = lp->orig_upbo[lp->rows + colnr];\n  value = unscaled_value(lp, value, lp->rows + colnr);\n  return(value);\n}\n\nMYBOOL __WINAPI set_lowbo(lprec *lp, int colnr, REAL value)\n{\n  if((colnr > lp->columns) || (colnr < 1)) {\n    report(lp, IMPORTANT, \"set_lowbo: Column %d out of range\\n\", colnr);\n    return(FALSE);\n  }\n\n#ifdef DoBorderRounding\n  if(fabs(value) < lp->infinite)\n    value = my_avoidtiny(value, lp->matA->epsvalue);\n#endif\n  value = scaled_value(lp, value, lp->rows + colnr);\n  if(lp->tighten_on_set) {\n    if(value > lp->orig_upbo[lp->rows + colnr]) {\n      report(lp, IMPORTANT, \"set_lowbo: Upper bound must be >= lower bound\\n\");\n      return(FALSE);\n    }\n    if((value < 0) || (value > lp->orig_lowbo[lp->rows + colnr])) {\n      set_action(&lp->spx_action, ACTION_REBASE);\n      lp->orig_lowbo[lp->rows + colnr] = value;\n    }\n  }\n  else\n  {\n    set_action(&lp->spx_action, ACTION_REBASE);\n    if(value < -lp->infinite)\n      value = -lp->infinite;\n    lp->orig_lowbo[lp->rows + colnr] = value;\n  }\n  return(TRUE);\n}\n\nREAL __WINAPI get_lowbo(lprec *lp, int colnr)\n{\n  REAL value;\n\n  if((colnr > lp->columns) || (colnr < 1)) {\n    report(lp, IMPORTANT, \"get_lowbo: Column %d out of range\\n\", colnr);\n    return(0);\n  }\n\n  value = lp->orig_lowbo[lp->rows + colnr];\n  value = unscaled_value(lp, value, lp->rows + colnr);\n  return(value);\n}\n\nMYBOOL __WINAPI set_bounds(lprec *lp, int colnr, REAL lower, REAL upper)\n{\n  if((colnr > lp->columns) || (colnr < 1)) {\n    report(lp, IMPORTANT, \"set_bounds: Column %d out of range\\n\", colnr);\n    return(FALSE);\n  }\n  if(fabs(upper - lower) < lp->epsvalue) {\n    if(lower < 0)\n      lower = upper;\n    else\n      upper = lower;\n  }\n  else if(lower > upper) {\n    report(lp, IMPORTANT, \"set_bounds: Column %d upper bound must be >= lower bound\\n\",\n                          colnr);\n    return( FALSE );\n  }\n\n  colnr += lp->rows;\n\n  if(lower < -lp->infinite)\n    lower = -lp->infinite;\n  else if(lp->scaling_used) {\n    lower = scaled_value(lp, lower, colnr);\n#ifdef DoBorderRounding\n    lower = my_avoidtiny(lower, lp->matA->epsvalue);\n#endif\n  }\n\n  if(upper > lp->infinite)\n    upper = lp->infinite;\n  else if(lp->scaling_used) {\n    upper = scaled_value(lp, upper, colnr);\n#ifdef DoBorderRounding\n    upper = my_avoidtiny(upper, lp->matA->epsvalue);\n#endif\n  }\n\n  lp->orig_lowbo[colnr] = lower;\n  lp->orig_upbo[colnr]  = upper;\n  set_action(&lp->spx_action, ACTION_REBASE);\n\n  return(TRUE);\n}\n\nMYBOOL get_bounds(lprec *lp, int column, REAL *lower, REAL *upper)\n{\n  if((column > lp->columns) || (column < 1)) {\n    report(lp, IMPORTANT, \"get_bounds: Column %d out of range\", column);\n    return(FALSE);\n  }\n\n  if(lower != NULL)\n    *lower = get_lowbo(lp, column);\n  if(upper != NULL)\n    *upper = get_upbo(lp, column);\n\n  return(TRUE);\n}\n\nMYBOOL __WINAPI set_int(lprec *lp, int colnr, MYBOOL var_type)\n{\n  if((colnr > lp->columns) || (colnr < 1)) {\n    report(lp, IMPORTANT, \"set_int: Column %d out of range\\n\", colnr);\n    return(FALSE);\n  }\n\n  if((lp->var_type[colnr] & ISINTEGER) != 0) {\n    lp->int_vars--;\n    lp->var_type[colnr] &= ~ISINTEGER;\n  }\n  if(var_type) {\n    lp->var_type[colnr] |= ISINTEGER;\n    lp->int_vars++;\n    if(lp->columns_scaled && !is_integerscaling(lp))\n      unscale_columns(lp);\n  }\n  return(TRUE);\n}\n\nMYBOOL __WINAPI is_int(lprec *lp, int colnr)\n{\n  if((colnr > lp->columns) || (colnr < 1)) {\n    report(lp, IMPORTANT, \"is_int: Column %d out of range\\n\", colnr);\n    return(FALSE);\n  }\n\n  return((lp->var_type[colnr] & ISINTEGER) != 0);\n}\n\nMYBOOL __WINAPI is_SOS_var(lprec *lp, int colnr)\n{\n  if((colnr > lp->columns) || (colnr < 1)) {\n    report(lp, IMPORTANT, \"is_SOS_var: Column %d out of range\\n\", colnr);\n    return(FALSE);\n  }\n\n  return((lp->var_type[colnr] & ISSOS) != 0);\n}\n\nint __WINAPI add_SOS(lprec *lp, char *name, int sostype, int priority, int count, int *sosvars, REAL *weights)\n{\n  SOSrec *SOS;\n  int    k;\n\n  if((sostype < 1) || (count < 0)) {\n    report(lp, IMPORTANT, \"add_SOS: Invalid SOS type definition %d\\n\", sostype);\n    return( 0 );\n  }\n\n  /* Make sure SOSes of order 3 and higher are properly defined */\n  if(sostype > 2) {\n    int j;\n    for(k = 0; k < count; k++) {\n      j = sosvars[k];\n      if(!is_int(lp, j) || !is_semicont(lp, j)) {\n        report(lp, IMPORTANT, \"add_SOS: SOS3+ members all have to be integer or semi-continuous.\\n\");\n        return( 0 );\n      }\n    }\n  }\n\n  /* Make size in the list to handle another SOS record */\n  if(lp->SOS == NULL)\n    lp->SOS = create_SOSgroup(lp);\n\n  /* Create and append SOS to list */\n  SOS = create_SOSrec(lp->SOS, name, sostype, priority, count, sosvars, weights);\n  k = append_SOSgroup(lp->SOS, SOS);\n\n  return(k);\n}\n\nSTATIC int add_GUB(lprec *lp, char *name, int priority, int count, int *gubvars)\n{\n  SOSrec *GUB;\n  int    k;\n\n#ifdef Paranoia\n  if(count < 0) {\n    report(lp, IMPORTANT, \"add_GUB: Invalid GUB member count %d\\n\", count);\n    return(FALSE);\n  }\n#endif\n\n  /* Make size in the list to handle another GUB record */\n  if(lp->GUB == NULL)\n    lp->GUB = create_SOSgroup(lp);\n\n  /* Create and append GUB to list */\n  GUB = create_SOSrec(lp->GUB, name, 1, priority, count, gubvars, NULL);\n  GUB->isGUB = TRUE;\n  k = append_SOSgroup(lp->GUB, GUB);\n\n  return(k);\n}\n\nMYBOOL __WINAPI set_binary(lprec *lp, int colnr, MYBOOL must_be_bin)\n{\n  MYBOOL status = FALSE;\n\n  if((colnr > lp->columns) || (colnr < 1)) {\n    report(lp, IMPORTANT, \"set_binary: Column %d out of range\\n\", colnr);\n    return( status );\n  }\n\n  status = set_int(lp, colnr, must_be_bin);\n  if(status && must_be_bin)\n    status = set_bounds(lp, colnr, 0, 1);\n  return( status );\n}\n\nMYBOOL __WINAPI is_binary(lprec *lp, int colnr)\n{\n  if((colnr > lp->columns) || (colnr < 1)) {\n    report(lp, IMPORTANT, \"is_binary: Column %d out of range\\n\", colnr);\n    return(FALSE);\n  }\n\n  return((MYBOOL) (((lp->var_type[colnr] & ISINTEGER) != 0) &&\n                    (get_lowbo(lp, colnr) == 0) &&\n                    (fabs(get_upbo(lp, colnr) - 1) < lp->epsprimal)));\n}\n\nMYBOOL __WINAPI set_unbounded(lprec *lp, int colnr)\n{\n  if((colnr > lp->columns) || (colnr < 1)) {\n    report(lp, IMPORTANT, \"set_unbounded: Column %d out of range\\n\", colnr);\n    return( FALSE );\n  }\n\n  return( set_bounds(lp, colnr, -lp->infinite, lp->infinite) );\n}\n\nMYBOOL __WINAPI is_unbounded(lprec *lp, int colnr)\n{\n  MYBOOL test;\n\n  if((colnr > lp->columns) || (colnr < 1)) {\n    report(lp, IMPORTANT, \"is_unbounded: Column %d out of range\\n\", colnr);\n    return(FALSE);\n  }\n\n  test = is_splitvar(lp, colnr);\n  if(!test) {\n    colnr += lp->rows;\n    test = (MYBOOL) ((lp->orig_lowbo[colnr] <= -lp->infinite) &&\n                     (lp->orig_upbo[colnr] >= lp->infinite));\n  }\n  return( test );\n}\n\nMYBOOL __WINAPI is_negative(lprec *lp, int colnr)\n{\n  if((colnr > lp->columns) || (colnr < 1)) {\n    report(lp, IMPORTANT, \"is_negative: Column %d out of range\\n\", colnr);\n    return( FALSE );\n  }\n\n  colnr += lp->rows;\n  return( (MYBOOL) ((lp->orig_upbo[colnr] <= 0) &&\n                    (lp->orig_lowbo[colnr] < 0)) );\n}\n\nMYBOOL __WINAPI set_var_weights(lprec *lp, REAL *weights)\n{\n  if(lp->var_priority != NULL) {\n    FREE(lp->var_priority);\n  }\n  if(weights != NULL) {\n    int n;\n    allocINT(lp, &lp->var_priority, lp->columns_alloc, FALSE);\n    for(n = 0; n < lp->columns; n++) {\n      lp->var_priority[n] = n+1;\n    }\n    n = sortByREAL(lp->var_priority, weights, lp->columns, 0, FALSE);\n  }\n  return(TRUE);\n}\n\nMYBOOL __WINAPI set_var_priority(lprec *lp)\n/* Experimental automatic variable ordering/priority setting */\n{\n  MYBOOL status = FALSE;\n\n  if(is_bb_mode(lp, NODE_AUTOORDER) &&\n     (lp->var_priority == NULL) &&\n     (SOS_count(lp) == 0)) {\n\n    REAL *rcost = NULL;\n    int  i, j, *colorder = NULL;\n\n    allocINT(lp, &colorder, lp->columns+1, FALSE);\n\n    /* Create an \"optimal\" B&B variable ordering; this MDO-based routine\n       returns column indeces in an increasing order of co-dependency.\n       It can be argued that arranging the columns in right-to-left\n       MDO order should tend to minimize the consequences of choosing the\n       wrong variable by reducing the average B&B depth. */\n    colorder[0] = lp->columns;\n    for(j = 1; j <= lp->columns; j++)\n      colorder[j] = lp->rows+j;\n    i = getMDO(lp, NULL, colorder, NULL, FALSE);\n\n    /* Map to variable weight */\n    allocREAL(lp, &rcost, lp->columns+1, FALSE);\n    for(j = lp->columns; j > 0; j--) {\n      i = colorder[j]-lp->rows;\n      rcost[i] = -j;\n    }\n\n   /* Establish the MIP variable priorities */\n    set_var_weights(lp, rcost+1);\n\n    FREE(rcost);\n    FREE(colorder);\n    status = TRUE;\n  }\n\n  return( status );\n}\n\nint __WINAPI get_var_priority(lprec *lp, int colnr)\n{\n  if((colnr > lp->columns) || (colnr < 1)) {\n    report(lp, IMPORTANT, \"get_var_priority: Column %d out of range\\n\", colnr);\n    return(FALSE);\n  }\n\n  if(lp->var_priority == NULL)\n    return(colnr);\n  else\n    return(lp->var_priority[colnr - 1]);\n}\n\nMYBOOL __WINAPI set_semicont(lprec *lp, int colnr, MYBOOL must_be_sc)\n{\n  if((colnr > lp->columns) || (colnr < 1)) {\n    report(lp, IMPORTANT, \"set_semicont: Column %d out of range\\n\", colnr);\n    return(FALSE);\n  }\n\n  if(lp->sc_lobound[colnr] != 0) {\n    lp->sc_vars--;\n    lp->var_type[colnr] &= ~ISSEMI;\n  }\n  lp->sc_lobound[colnr] = must_be_sc;\n  if(must_be_sc) {\n    lp->var_type[colnr] |= ISSEMI;\n    lp->sc_vars++;\n  }\n  return(TRUE);\n}\n\nMYBOOL __WINAPI is_semicont(lprec *lp, int colnr)\n{\n  if((colnr > lp->columns) || (colnr < 1)) {\n    report(lp, IMPORTANT, \"is_semicont: Column %d out of range\\n\", colnr);\n    return(FALSE);\n  }\n\n  return((lp->var_type[colnr] & ISSEMI) != 0);\n}\n\nMYBOOL __WINAPI set_rh(lprec *lp, int rownr, REAL value)\n{\n  if((rownr > lp->rows) || (rownr < 0)) {\n    report(lp, IMPORTANT, \"set_rh: Row %d out of range\\n\", rownr);\n    return(FALSE);\n  }\n\n  if(((rownr == 0) && (!is_maxim(lp))) ||\n     ((rownr > 0) && is_chsign(lp, rownr)))    /* setting of RHS of OF IS meaningful */\n    value = my_flipsign(value);\n  if(fabs(value) > lp->infinite) {\n    if(value < 0)\n      value = -lp->infinite;\n    else\n      value = lp->infinite;\n  }\n#ifdef DoBorderRounding\n  else\n    value = my_avoidtiny(value, lp->matA->epsvalue);\n#endif\n  value = scaled_value(lp, value, rownr);\n  lp->orig_rhs[rownr] = value;\n  set_action(&lp->spx_action, ACTION_RECOMPUTE);\n  return(TRUE);\n}\n\nREAL __WINAPI get_rh(lprec *lp, int rownr)\n{\n  REAL value;\n\n  if((rownr > lp->rows) || (rownr < 0)) {\n    report(lp, IMPORTANT, \"get_rh: Row %d out of range\", rownr);\n    return( 0.0 );\n  }\n\n  value = lp->orig_rhs[rownr];\n  if (((rownr == 0) && !is_maxim(lp)) ||\n      ((rownr > 0) && is_chsign(lp, rownr)))    /* setting of RHS of OF IS meaningful */\n    value = my_flipsign(value);\n  value = unscaled_value(lp, value, rownr);\n  return(value);\n}\n\nREAL get_rh_upper(lprec *lp, int rownr)\n{\n  REAL value, valueR;\n\n  value = lp->orig_rhs[rownr];\n  if(is_chsign(lp, rownr)) {\n    valueR = lp->orig_upbo[rownr];\n    if(is_infinite(lp, valueR))\n      return(lp->infinite);\n    value = my_flipsign(value);\n    value += valueR;\n  }\n  value = unscaled_value(lp, value, rownr);\n  return(value);\n}\n\nREAL get_rh_lower(lprec *lp, int rownr)\n{\n  REAL value, valueR;\n\n  value = lp->orig_rhs[rownr];\n  if(is_chsign(lp, rownr))\n    value = my_flipsign(value);\n  else {\n    valueR = lp->orig_upbo[rownr];\n    if(is_infinite(lp, valueR))\n      return(-lp->infinite);\n    value -= valueR;\n  }\n  value = unscaled_value(lp, value, rownr);\n  return(value);\n}\n\nMYBOOL set_rh_upper(lprec *lp, int rownr, REAL value)\n{\n  if(rownr > lp->rows || rownr < 1) {\n    report(lp, IMPORTANT, \"set_rh_upper: Row %d out of range\", rownr);\n    return(FALSE);\n  }\n\n /* First scale the value */\n  value = scaled_value(lp, value, rownr);\n\n /* orig_rhs stores the upper bound assuming a < constraint;\n    If we have a > constraint, we must adjust the range instead */\n  if(is_chsign(lp, rownr)) {\n    if(is_infinite(lp, value))\n      lp->orig_upbo[rownr] = lp->infinite;\n    else {\n#ifdef Paranoia\n      if(value + lp->orig_rhs[rownr] < 0) {\n        report(lp, SEVERE, \"set_rh_upper: Invalid negative range in row %d\\n\",\n                           rownr);\n        return(FALSE);\n      }\n#endif\n#ifdef DoBorderRounding\n      lp->orig_upbo[rownr] = my_avoidtiny(value + lp->orig_rhs[rownr], lp->epsvalue);\n#else\n      lp->orig_upbo[rownr] = value + lp->orig_rhs[rownr];\n#endif\n    }\n  }\n  else {\n    /* If there is a constraint range, then this has to be adjusted also */\n    if(!is_infinite(lp, lp->orig_upbo[rownr])) {\n      lp->orig_upbo[rownr] -= lp->orig_rhs[rownr] - value;\n      my_roundzero(lp->orig_upbo[rownr], lp->epsvalue);\n      if(lp->orig_upbo[rownr] < 0) {\n        report(lp, IMPORTANT, \"set_rh_upper: Negative bound set for constraint %d made 0\\n\", rownr);\n        lp->orig_upbo[rownr] = 0;\n      }\n    }\n    lp->orig_rhs[rownr] = value;\n  }\n  return(TRUE);\n}\n\nMYBOOL set_rh_lower(lprec *lp, int rownr, REAL value)\n{\n  if(rownr > lp->rows || rownr < 1) {\n    report(lp, IMPORTANT, \"set_rh_lower: Row %d out of range\", rownr);\n    return(FALSE);\n  }\n\n /* First scale the value */\n  value = scaled_value(lp, value, rownr);\n\n /* orig_rhs stores the upper bound assuming a < constraint;\n    If we have a < constraint, we must adjust the range instead */\n  if(!is_chsign(lp, rownr)) {\n    if(is_infinite(lp, value))\n      lp->orig_upbo[rownr] = lp->infinite;\n    else {\n#ifdef Paranoia\n      if(lp->orig_rhs[rownr] - value < 0) {\n        report(lp, SEVERE, \"set_rh_lower: Invalid negative range in row %d\\n\",\n                           rownr);\n        return(FALSE);\n      }\n#endif\n#ifdef DoBorderRounding\n      lp->orig_upbo[rownr] = my_avoidtiny(lp->orig_rhs[rownr] - value, lp->epsvalue);\n#else\n      lp->orig_upbo[rownr] = lp->orig_rhs[rownr] - value;\n#endif\n    }\n  }\n  else {\n    value = my_flipsign(value);\n    /* If there is a constraint range, then this has to be adjusted also */\n    if(!is_infinite(lp, lp->orig_upbo[rownr])) {\n      lp->orig_upbo[rownr] -= lp->orig_rhs[rownr] - value;\n      my_roundzero(lp->orig_upbo[rownr], lp->epsvalue);\n      if(lp->orig_upbo[rownr] < 0) {\n        report(lp, IMPORTANT, \"set_rh_lower: Negative bound set for constraint %d made 0\\n\", rownr);\n        lp->orig_upbo[rownr] = 0;\n      }\n    }\n    lp->orig_rhs[rownr] = value;\n  }\n  return(TRUE);\n}\n\nMYBOOL __WINAPI set_rh_range(lprec *lp, int rownr, REAL deltavalue)\n{\n  if((rownr > lp->rows) || (rownr < 1)) {\n    report(lp, IMPORTANT, \"set_rh_range: Row %d out of range\", rownr);\n    return(FALSE);\n  }\n\n  deltavalue = scaled_value(lp, deltavalue, rownr);\n  if(deltavalue > lp->infinite)\n    deltavalue = lp->infinite;\n  else if(deltavalue < -lp->infinite)\n    deltavalue = -lp->infinite;\n#ifdef DoBorderRounding\n  else\n    deltavalue = my_avoidtiny(deltavalue, lp->matA->epsvalue);\n#endif\n\n  if(fabs(deltavalue) < lp->epsprimal) {\n    /* Conversion to EQ */\n    set_constr_type(lp, rownr, EQ);\n  }\n  else if(is_constr_type(lp, rownr, EQ)) {\n    /* EQ with a non-zero range */\n    if(deltavalue > 0)\n      set_constr_type(lp, rownr, GE);\n    else\n      set_constr_type(lp, rownr, LE);\n    lp->orig_upbo[rownr] = fabs(deltavalue);\n  }\n  else {\n    /* Modify GE/LE ranges */\n    lp->orig_upbo[rownr] = fabs(deltavalue);\n  }\n\n  return(TRUE);\n}\n\nREAL __WINAPI get_rh_range(lprec *lp, int rownr)\n{\n  if((rownr > lp->rows) || (rownr < 0)) {\n    report(lp, IMPORTANT, \"get_rh_range: row %d out of range\\n\", rownr);\n    return(FALSE);\n  }\n\n  if(lp->orig_upbo[rownr] >= lp->infinite)\n    return(lp->orig_upbo[rownr]);\n  else\n    return(unscaled_value(lp, lp->orig_upbo[rownr], rownr));\n}\n\nvoid __WINAPI set_rh_vec(lprec *lp, REAL *rh)\n{\n  int  i;\n  REAL rhi;\n\n  for(i = 1; i <= lp->rows; i++) {\n    rhi = rh[i];\n#ifdef DoBorderRounding\n    rhi = my_avoidtiny(rhi, lp->matA->epsvalue);\n#endif\n    lp->orig_rhs[i] = my_chsign(is_chsign(lp, i), scaled_value(lp, rhi, i));\n  }\n  set_action(&lp->spx_action, ACTION_RECOMPUTE);\n}\n\nMYBOOL __WINAPI str_set_rh_vec(lprec *lp, char *rh_string)\n{\n  int  i;\n  MYBOOL ret = TRUE;\n  REAL *newrh;\n  char *p, *newp;\n\n  allocREAL(lp, &newrh, lp->rows + 1, TRUE);\n  p = rh_string;\n\n  for(i = 1; i <= lp->rows; i++) {\n    newrh[i] = (REAL) strtod(p, &newp);\n    if(p == newp) {\n      report(lp, IMPORTANT, \"str_set_rh_vec: Bad string %s\\n\", p);\n      lp->spx_status = DATAIGNORED;\n      ret = FALSE;\n      break;\n    }\n    else\n      p = newp;\n  }\n  if(!(lp->spx_status == DATAIGNORED))\n    set_rh_vec(lp, newrh);\n  FREE(newrh);\n  return( ret );\n}\n\nvoid __WINAPI set_sense(lprec *lp, MYBOOL maximize)\n{\n  maximize = (MYBOOL) (maximize != FALSE);\n  if(is_maxim(lp) != maximize) {\n    int i;\n    if(is_infinite(lp, lp->bb_heuristicOF))\n      lp->bb_heuristicOF = my_chsign(maximize, lp->infinite);\n    if(is_infinite(lp, lp->bb_breakOF))\n      lp->bb_breakOF = my_chsign(maximize, -lp->infinite);\n    lp->orig_rhs[0] = my_flipsign(lp->orig_rhs[0]);\n    for(i = 1; i <= lp->columns; i++)\n      lp->orig_obj[i] = my_flipsign(lp->orig_obj[i]);\n    set_action(&lp->spx_action, ACTION_REINVERT | ACTION_RECOMPUTE);\n  }\n  if(maximize)\n    lp->row_type[0] = ROWTYPE_OFMAX;\n  else\n    lp->row_type[0] = ROWTYPE_OFMIN;\n}\n\nvoid __WINAPI set_maxim(lprec *lp)\n{\n  set_sense(lp, TRUE);\n}\n\nvoid __WINAPI set_minim(lprec *lp)\n{\n  set_sense(lp, FALSE);\n}\n\nMYBOOL __WINAPI is_maxim(lprec *lp)\n{\n  return( (MYBOOL) ((lp->row_type != NULL) &&\n                     ((lp->row_type[0] & ROWTYPE_CHSIGN) == ROWTYPE_GE)) );\n}\n\nMYBOOL __WINAPI set_constr_type(lprec *lp, int rownr, int con_type)\n{\n  MYBOOL oldchsign;\n\n  if(rownr > lp->rows+1 || rownr < 1) {\n    report(lp, IMPORTANT, \"set_constr_type: Row %d out of range\\n\", rownr);\n    return( FALSE );\n  }\n\n  /* Prepare for a new row */\n  if((rownr > lp->rows) && !append_rows(lp, rownr-lp->rows))\n    return( FALSE );\n\n  /* Update the constraint type data */\n  if(is_constr_type(lp, rownr, EQ))\n    lp->equalities--;\n\n  if((con_type & ROWTYPE_CONSTRAINT) == EQ) {\n    lp->equalities++;\n    lp->orig_upbo[rownr] = 0;\n  }\n  else if(((con_type & LE) > 0) || ((con_type & GE) > 0) || (con_type == FR))\n    lp->orig_upbo[rownr] = lp->infinite;\n  else {\n    report(lp, IMPORTANT, \"set_constr_type: Constraint type %d not implemented (row %d)\\n\",\n                          con_type, rownr);\n    return( FALSE );\n  }\n\n  /* Change the signs of the row, if necessary */\n  oldchsign = is_chsign(lp, rownr);\n  if(con_type == FR)\n    lp->row_type[rownr] = LE;\n  else\n    lp->row_type[rownr] = con_type;\n  if(oldchsign != is_chsign(lp, rownr)) {\n    MATrec *mat = lp->matA;\n\n    if(mat->is_roworder)\n      mat_multcol(mat, rownr, -1, FALSE);\n    else\n      mat_multrow(mat, rownr, -1);\n    if(lp->orig_rhs[rownr] != 0)\n      lp->orig_rhs[rownr] *= -1;\n    set_action(&lp->spx_action, ACTION_RECOMPUTE);\n  }\n  if(con_type == FR)\n      lp->orig_rhs[rownr] = lp->infinite;\n\n  set_action(&lp->spx_action, ACTION_REINVERT);\n  lp->basis_valid = FALSE;\n\n  return( TRUE );\n}\n\n/* INLINE */ MYBOOL is_chsign(lprec *lp, int rownr)\n{\n  return( (MYBOOL) ((lp->row_type[rownr] & ROWTYPE_CONSTRAINT) == ROWTYPE_CHSIGN) );\n}\n\nMYBOOL __WINAPI is_constr_type(lprec *lp, int rownr, int mask)\n{\n  if((rownr < 0) || (rownr > lp->rows)) {\n    report(lp, IMPORTANT, \"is_constr_type: Row %d out of range\\n\", rownr);\n    return( FALSE );\n  }\n  return( (MYBOOL) ((lp->row_type[rownr] & ROWTYPE_CONSTRAINT) == mask));\n}\n\nint __WINAPI get_constr_type(lprec *lp, int rownr)\n{\n  if((rownr < 0) || (rownr > lp->rows)) {\n    report(lp, IMPORTANT, \"get_constr_type: Row %d out of range\\n\", rownr);\n    return(-1);\n  }\n  return( lp->row_type[rownr] );\n}\nREAL __WINAPI get_constr_value(lprec *lp, int rownr, int count, REAL *primsolution, int *nzindex)\n{\n  int    i;\n  REAL   value = 0.0;\n  MATrec *mat = lp->matA;\n\n  if((rownr < 0) || (rownr > get_Nrows(lp)))\n    return( value );\n\n  /* First do validation and initialization of applicable primal solution */\n  if(!mat_validate(mat) || ((primsolution == NULL) && (lp->solvecount == 0)))\n    return( value );\n  i = get_Ncolumns(lp);\n  if((primsolution != NULL) && (nzindex == NULL) &&\n     ((count <= 0) || (count > i)))\n    count = i;\n  if(primsolution == NULL) {\n    get_ptr_variables(lp, &primsolution);\n    primsolution--;\n    nzindex = NULL;\n    count = i;\n  }\n\n  /* Do objective or constraint, as specified */\n  if(rownr == 0) {\n    value += get_rh(lp, 0);\n    if(nzindex != NULL)\n      for(i = 0; i < count; i++)\n        value += get_mat(lp, 0, nzindex[i]) * primsolution[i];\n    else\n      for(i = 1; i <= count; i++)\n        value += get_mat(lp, 0, i) * primsolution[i];\n  }\n  else {\n    if(nzindex != NULL) {\n      for(i = 0; i < count; i++)\n        value += get_mat(lp, rownr, nzindex[i]) * primsolution[i];\n    }\n    else {\n      int j;\n\n      for(i = mat->row_end[rownr-1]; i < mat->row_end[rownr]; i++) {\n        j = ROW_MAT_COLNR(i);\n        value += unscaled_mat(lp, ROW_MAT_VALUE(i), rownr, j) * primsolution[j];\n      }\n      value = my_chsign(is_chsign(lp, rownr), value);\n    }\n  }\n  return( value );\n}\n\nSTATIC char *get_str_constr_class(lprec *lp, int con_class)\n{\n  switch(con_class) {\n    case ROWCLASS_Unknown:     return(\"Unknown\");\n    case ROWCLASS_Objective:   return(\"Objective\");\n    case ROWCLASS_GeneralREAL: return(\"General REAL\");\n    case ROWCLASS_GeneralMIP:  return(\"General MIP\");\n    case ROWCLASS_GeneralINT:  return(\"General INT\");\n    case ROWCLASS_GeneralBIN:  return(\"General BIN\");\n    case ROWCLASS_KnapsackINT: return(\"Knapsack INT\");\n    case ROWCLASS_KnapsackBIN: return(\"Knapsack BIN\");\n    case ROWCLASS_SetPacking:  return(\"Set packing\");\n    case ROWCLASS_SetCover:    return(\"Set cover\");\n    case ROWCLASS_GUB:         return(\"GUB\");\n    default:                   return(\"Error\");\n  }\n}\n\nSTATIC char *get_str_constr_type(lprec *lp, int con_type)\n{\n  switch(con_type) {\n    case FR: return(\"FR\");\n    case LE: return(\"LE\");\n    case GE: return(\"GE\");\n    case EQ: return(\"EQ\");\n    default: return(\"Error\");\n  }\n}\n\nSTATIC int get_constr_class(lprec *lp, int rownr)\n{\n  int    aBIN = 0, aINT = 0, aREAL = 0,\n         xBIN = 0, xINT = 0, xREAL = 0;\n  int    j, elmnr, elmend, nelm;\n  MYBOOL chsign;\n  REAL   a;\n  MATrec *mat = lp->matA;\n\n  if((rownr < 1) || (rownr > lp->rows)) {\n    report(lp, IMPORTANT, \"get_constr_class: Row %d out of range\\n\", rownr);\n    return( ROWCLASS_Unknown );\n  }\n  mat_validate(mat);\n\n  /* Tally counts of constraint variable types and coefficients */\n  if(rownr == 0) {\n    elmnr = 1;\n    elmend = lp->columns;\n    nelm = 0;\n  }\n  else {\n    elmnr  = mat->row_end[rownr - 1];\n    elmend = mat->row_end[rownr];\n    nelm = elmend - elmnr;\n  }\n  chsign = is_chsign(lp, rownr);\n  for(; elmnr < elmend; elmnr++) {\n    if(rownr == 0) {\n      a = lp->orig_obj[elmnr];\n      if(a == 0)\n        continue;\n      j = elmnr;\n    }\n    else {\n      j = ROW_MAT_COLNR(elmnr);\n      a = ROW_MAT_VALUE(elmnr);\n    }\n    a = unscaled_mat(lp, my_chsign(chsign, a), rownr, j);\n    if(is_binary(lp, j))\n      xBIN++;\n    else if((get_lowbo(lp, j) >= 0) && is_int(lp, j))\n      xINT++;\n    else\n      xREAL++;  /* Includes integer variables with negative lower bound */\n\n    if(fabs(a-1.0) < lp->epsvalue)\n      aBIN++;\n    else if((a > 0) && (fabs(floor(a+lp->epsvalue)-a) < lp->epsvalue))\n      aINT++;\n    else\n      aREAL++;  /* Includes negative integer-valued coefficients */\n  }\n\n  /* Get the constraint type and the RHS */\n  if(rownr == 0)\n    return( ROWCLASS_Objective );\n  j = get_constr_type(lp, rownr);\n  a = get_rh(lp, rownr);\n\n  /* Determine the constraint class */\n  if((aBIN == nelm) && (xBIN == nelm) && (a >= 1)) {\n    if(a > 1)\n      j = ROWCLASS_KnapsackBIN;\n    else if(j == EQ)\n      j = ROWCLASS_GUB;\n    else if(j == LE)\n      j = ROWCLASS_SetCover;\n    else\n      j = ROWCLASS_SetPacking;\n  }\n  else if((aINT == nelm) && (xINT == nelm) && (a >= 1))\n    j = ROWCLASS_KnapsackINT;\n  else if(xBIN == nelm)\n    j = ROWCLASS_GeneralBIN;\n  else if(xINT == nelm)\n    j = ROWCLASS_GeneralINT;\n  else if((xREAL > 0) && (xINT+xBIN > 0))\n    j = ROWCLASS_GeneralMIP;\n  else\n    j = ROWCLASS_GeneralREAL;\n\n  return( j );\n}\n\nREAL __WINAPI get_mat(lprec *lp, int rownr, int colnr)\n{\n  REAL value;\n  int  elmnr;\n  int colnr1 = colnr, rownr1 = rownr;\n\n  if((rownr < 0) || (rownr > lp->rows)) {\n    report(lp, IMPORTANT, \"get_mat: Row %d out of range\", rownr);\n    return(0);\n  }\n  if((colnr < 1) || (colnr > lp->columns)) {\n    report(lp, IMPORTANT, \"get_mat: Column %d out of range\", colnr);\n    return(0);\n  }\n  if(rownr == 0) {\n    value = lp->orig_obj[colnr];\n    value = my_chsign(is_chsign(lp, rownr), value);\n    value = unscaled_mat(lp, value, rownr, colnr);\n  }\n  else {\n    if(lp->matA->is_roworder)\n      swapINT(&colnr1, &rownr1);\n    elmnr = mat_findelm(lp->matA, rownr1, colnr1);\n    if(elmnr >= 0) {\n      MATrec *mat = lp->matA;\n      value = my_chsign(is_chsign(lp, rownr), COL_MAT_VALUE(elmnr));\n      value = unscaled_mat(lp, value, rownr, colnr);\n    }\n    else\n      value = 0;\n  }\n  return(value);\n}\n\nREAL __WINAPI get_mat_byindex(lprec *lp, int matindex, MYBOOL isrow, MYBOOL adjustsign)\n/* Note that this function does not adjust for sign-changed GT constraints! */\n{\n  int  *rownr, *colnr;\n  REAL *value, result;\n\n  mat_get_data(lp, matindex, isrow, &rownr, &colnr, &value);\n  if(adjustsign)\n    result = (*value) * (is_chsign(lp, *rownr) ? -1 : 1);\n  else\n    result = *value;\n  if(lp->scaling_used)\n    return( unscaled_mat(lp, result, *rownr, *colnr) );\n  else\n    return( result );\n}\n\nstatic int mat_getrow(lprec *lp, int rownr, REAL *row, int *colno)\n{\n  MYBOOL isnz;\n  int    j, countnz = 0;\n  REAL   a;\n\n  if((rownr == 0) || !mat_validate(lp->matA)) {\n    for(j = 1; j <= lp->columns; j++) {\n      a = get_mat(lp,rownr,j);\n      isnz = (a != 0);\n      if(colno == NULL)\n        row[j] = a;\n      else if(isnz) {\n        row[countnz]   = a;\n        colno[countnz] = j;\n      }\n      if(isnz)\n        countnz++;\n    }\n  }\n  else {\n    MYBOOL chsign = FALSE;\n    int    ie, i;\n    MATrec *mat = lp->matA;\n\n    if(colno == NULL)\n      MEMCLEAR(row, lp->columns+1);\n    if(mat->is_roworder) {\n     /* Add the objective function */\n      a = get_mat(lp, 0, rownr);\n      if(colno == NULL) {\n        row[countnz] = a;\n        if(a != 0)\n          countnz++;\n      }\n      else if(a != 0) {\n        row[countnz] = a;\n        colno[countnz] = 0;\n        countnz++;\n      }\n    }\n    i = mat->row_end[rownr-1];\n    ie = mat->row_end[rownr];\n    if(!lp->matA->is_roworder)\n      chsign = is_chsign(lp, rownr);\n    for(; i < ie; i++) {\n      j = ROW_MAT_COLNR(i);\n      a = get_mat_byindex(lp, i, TRUE, FALSE);\n      if(lp->matA->is_roworder)\n        chsign = is_chsign(lp, j);\n      a = my_chsign(chsign, a);\n      if(colno == NULL)\n        row[j] = a;\n      else {\n        row[countnz]   = a;\n        colno[countnz] = j;\n      }\n      countnz++;\n    }\n  }\n  return( countnz );\n}\n\nstatic int mat_getcolumn(lprec *lp, int colnr, REAL *column, int *nzrow)\n{\n  int    n = 0, i, ii, ie, *rownr;\n  REAL   hold, *value;\n  MATrec *mat = lp->matA;\n\n  if(nzrow == NULL)\n    MEMCLEAR(column, lp->rows + 1);\n  if(!mat->is_roworder) {\n     /* Add the objective function */\n    hold = get_mat(lp, 0, colnr);\n    if(nzrow == NULL) {\n      column[n] = hold;\n      if(hold != 0)\n        n++;\n    }\n    else if(hold != 0) {\n      column[n] = hold;\n      nzrow[n] = 0;\n      n++;\n    }\n  }\n\n  i  = lp->matA->col_end[colnr - 1];\n  ie = lp->matA->col_end[colnr];\n  if(nzrow == NULL)\n    n += ie - i;\n  rownr = &COL_MAT_ROWNR(i);\n  value = &COL_MAT_VALUE(i);\n  for(; i < ie;\n      i++, rownr += matRowColStep, value += matValueStep) {\n    ii = *rownr;\n\n    hold = my_chsign(is_chsign(lp, (mat->is_roworder) ? colnr : ii), *value);\n    hold = unscaled_mat(lp, hold, ii, colnr);\n    if(nzrow == NULL)\n      column[ii] = hold;\n    else if(hold != 0) {\n      column[n] = hold;\n      nzrow[n] = ii;\n      n++;\n    }\n  }\n  return( n );\n}\n\nint __WINAPI get_columnex(lprec *lp, int colnr, REAL *column, int *nzrow)\n{\n  if((colnr > lp->columns) || (colnr < 1)) {\n    report(lp, IMPORTANT, \"get_columnex: Column %d out of range\\n\", colnr);\n    return( -1 );\n  }\n\n  if(lp->matA->is_roworder)\n    return(mat_getrow(lp, colnr, column, nzrow));\n  else\n    return(mat_getcolumn(lp, colnr, column, nzrow));\n}\n\nMYBOOL __WINAPI get_column(lprec *lp, int colnr, REAL *column)\n{\n  return( (MYBOOL) (get_columnex(lp, colnr, column, NULL) >= 0) );\n}\n\nint __WINAPI get_rowex(lprec *lp, int rownr, REAL *row, int *colno)\n{\n  if((rownr < 0) || (rownr > lp->rows)) {\n    report(lp, IMPORTANT, \"get_rowex: Row %d out of range\\n\", rownr);\n    return( -1 );\n  }\n\n  if(rownr != 0 && lp->matA->is_roworder)\n    return(mat_getcolumn(lp, rownr, row, colno));\n  else\n    return(mat_getrow(lp, rownr, row, colno));\n}\n\nMYBOOL __WINAPI get_row(lprec *lp, int rownr, REAL *row)\n{\n  return((MYBOOL) (get_rowex(lp, rownr, row, NULL) >= 0) );\n}\n\nSTATIC void set_OF_override(lprec *lp, REAL *ofVector)\n/* The purpose of this function is to set, or clear if NULL, the\n   ofVector[0..columns] as the active objective function instead of\n   the one stored in the A-matrix. See also lag_solve().*/\n{\n  lp->obj = ofVector;\n}\n\nMYBOOL modifyOF1(lprec *lp, int index, REAL *ofValue, REAL mult)\n/* Adjust objective function values for primal/dual phase 1, if appropriate */\n{\n  MYBOOL accept = TRUE;\n\n  /* Primal simplex: Set user variables to zero or BigM-scaled */\n  if(((lp->simplex_mode & SIMPLEX_Phase1_PRIMAL) != 0) && (abs(lp->P1extraDim) > 0)) {\n#ifndef Phase1EliminateRedundant\n    if(lp->P1extraDim < 0) {\n      if(index > lp->sum + lp->P1extraDim)\n        accept = FALSE;\n    }\n    else\n#endif\n    if((index <= lp->sum - lp->P1extraDim) || (mult == 0)) {\n      if((mult == 0) || (lp->bigM == 0))\n        accept = FALSE;\n      else\n        (*ofValue) /= lp->bigM;\n    }\n  }\n\n  /* Dual simplex: Subtract P1extraVal from objective function values */\n  else if(((lp->simplex_mode & SIMPLEX_Phase1_DUAL) != 0) && (index > lp->rows)) {\n#if 1  /* This may help increase sparsity of the (extended) basis matrix;\n         Can it introduce degeneracy in some cases? */\n    if((lp->P1extraVal != 0) && (lp->orig_obj[index - lp->rows] > 0))\n      *ofValue = 0;\n    else\n#endif\n    {\n      *ofValue -= lp->P1extraVal;\n#if 0\n      if(is_action(lp->anti_degen, ANTIDEGEN_RHSPERTURB))\n        *ofValue -= rand_uniform(lp, lp->epsperturb);\n#endif\n    }\n  }\n\n  /* Do scaling and test for zero */\n  if(accept) {\n    (*ofValue) *= mult;\n    if(fabs(*ofValue) < lp->epsmachine) {\n      (*ofValue) = 0;\n      accept = FALSE;\n    }\n  }\n  else\n    (*ofValue) = 0;\n\n  return( accept );\n}\n\nSTATIC void set_OF_p1extra(lprec *lp, REAL p1extra)\n{\n  int  i;\n  REAL *value;\n\n  if(lp->spx_trace)\n    report(lp, DETAILED, \"set_OF_p1extra: Set dual objective offset to %g at iter %.0f.\\n\",\n                          p1extra, (double) get_total_iter(lp));\n  lp->P1extraVal = p1extra;\n  if(lp->obj == NULL)\n    allocREAL(lp, &lp->obj, lp->columns_alloc+1, TRUE);\n  for(i = 1, value = lp->obj+1; i <= lp->columns; i++, value++) {\n    *value = lp->orig_obj[i];\n    modifyOF1(lp, lp->rows + i, value, 1.0);\n  }\n}\n\nSTATIC void unset_OF_p1extra(lprec *lp)\n{\n  lp->P1extraVal = 0;\n  FREE(lp->obj);\n}\n\nREAL __WINAPI get_OF_active(lprec *lp, int varnr, REAL mult)\n{\n  int  colnr = varnr - lp->rows;\n  REAL holdOF = 0;\n\n#ifdef Paranoia\n  if((colnr <= 0) || (colnr > lp->columns)) {\n    report(lp, SEVERE, \"get_OF_active: Invalid column index %d supplied\\n\", colnr);\n  }\n  else\n#endif\n  if(lp->obj == NULL) {\n    if(colnr > 0)\n      holdOF = lp->orig_obj[colnr];\n    modifyOF1(lp, varnr, &holdOF, mult);\n  }\n  else if(colnr > 0)\n    holdOF = lp->obj[colnr] * mult;\n\n  return( holdOF );\n}\n\nSTATIC MYBOOL is_OF_nz(lprec *lp, int colnr)\n{\n  return( (MYBOOL) (lp->orig_obj[colnr] != 0) );\n}\n\nSTATIC int singleton_column(lprec *lp, int row_nr, REAL *column, int *nzlist, REAL value, int *maxabs)\n{\n  int nz = 1;\n\n  if(nzlist == NULL) {\n    MEMCLEAR(column, lp->rows + 1);\n    column[row_nr] = value;\n  }\n  else {\n    column[nz] = value;\n    nzlist[nz] = row_nr;\n  }\n\n  if(maxabs != NULL)\n    *maxabs = row_nr;\n  return( nz );\n}\n\nSTATIC int expand_column(lprec *lp, int col_nr, REAL *column, int *nzlist, REAL mult, int *maxabs)\n{\n  int     i, ie, j, maxidx, nzcount;\n  REAL    value, maxval;\n  MATrec  *mat = lp->matA;\n  REAL    *matValue;\n  int     *matRownr;\n\n  /* Retrieve a column from the user data matrix A */\n  maxval = 0;\n  maxidx = -1;\n  if(nzlist == NULL) {\n    MEMCLEAR(column, lp->rows + 1);\n    i  = mat->col_end[col_nr - 1];\n    ie = mat->col_end[col_nr];\n    matRownr = &COL_MAT_ROWNR(i);\n    matValue = &COL_MAT_VALUE(i);\n    nzcount = i;\n    for(; i < ie;\n        i++, matRownr += matRowColStep, matValue += matValueStep) {\n      j = *matRownr;\n      value = *matValue;\n      if(j > 0) {\n        value *= mult;\n        if(fabs(value) > maxval) {\n          maxval = fabs(value);\n          maxidx = j;\n        }\n      }\n      column[j] = value;\n    }\n    nzcount = i - nzcount;\n\n    /* Get the objective as row 0, optionally adjusting the objective for phase 1 */\n    if(lp->obj_in_basis) {\n      column[0] = get_OF_active(lp, lp->rows+col_nr, mult);\n      if(column[0] != 0)\n        nzcount++;\n    }\n  }\n  else {\n    nzcount = 0;\n\n    /* Get the objective as row 0, optionally adjusting the objective for phase 1 */\n    if(lp->obj_in_basis) {\n      value = get_OF_active(lp, lp->rows+col_nr, mult);\n      if(value != 0) {\n        nzcount++;\n        nzlist[nzcount] = 0;\n        column[nzcount] = value;\n      }\n    }\n\n    /* Loop over the non-zero column entries */\n    i  = mat->col_end[col_nr - 1];\n    ie = mat->col_end[col_nr];\n    matRownr = &COL_MAT_ROWNR(i);\n    matValue = &COL_MAT_VALUE(i);\n    for(; i < ie;\n        i++, matRownr += matRowColStep, matValue += matValueStep) {\n      j = *matRownr;\n      value = (*matValue) * mult;\n      nzcount++;\n      nzlist[nzcount] = j;\n      column[nzcount] = value;\n      if(fabs(value) > maxval) {\n        maxval = fabs(value);\n        maxidx = nzcount;\n      }\n    }\n  }\n\n  if(maxabs != NULL)\n    *maxabs = maxidx;\n  return( nzcount );\n}\n\n\n/* Retrieve a column vector from the data matrix [1..rows, rows+1..rows+columns];\n   needs __WINAPI call model since it may be called from BFPs */\nint __WINAPI obtain_column(lprec *lp, int varin, REAL *pcol, int *nzlist, int *maxabs)\n{\n  REAL value = my_chsign(lp->is_lower[varin], -1);\n  if(varin > lp->rows) {\n    varin -= lp->rows;\n    varin = expand_column(lp, varin, pcol, nzlist, value, maxabs);\n  }\n  else if(lp->obj_in_basis || (varin > 0))\n    varin = singleton_column(lp, varin, pcol, nzlist, value, maxabs);\n  else\n    varin = get_basisOF(lp, NULL, pcol, nzlist);\n\n  return(varin);\n}\n\n/* GENERAL INVARIANT CALLBACK FUNCTIONS */\nMYBOOL set_callbacks(lprec *lp)\n{\n  /* Assign API functions to lp structure (mainly for XLIs) */\n  lp->add_column              = add_column;\n  lp->add_columnex            = add_columnex;\n  lp->add_constraint          = add_constraint;\n  lp->add_constraintex        = add_constraintex;\n  lp->add_lag_con             = add_lag_con;\n  lp->add_SOS                 = add_SOS;\n  lp->column_in_lp            = column_in_lp;\n  lp->copy_lp                 = copy_lp;\n  lp->default_basis           = default_basis;\n  lp->del_column              = del_column;\n  lp->del_constraint          = del_constraint;\n  lp->delete_lp               = delete_lp;\n  lp->dualize_lp              = dualize_lp;\n  lp->free_lp                 = free_lp;\n  lp->get_anti_degen          = get_anti_degen;\n  lp->get_basis               = get_basis;\n  lp->get_basiscrash          = get_basiscrash;\n  lp->get_bb_depthlimit       = get_bb_depthlimit;\n  lp->get_bb_floorfirst       = get_bb_floorfirst;\n  lp->get_bb_rule             = get_bb_rule;\n  lp->get_bounds_tighter      = get_bounds_tighter;\n  lp->get_break_at_value      = get_break_at_value;\n  lp->get_col_name            = get_col_name;\n  lp->get_columnex            = get_columnex;\n  lp->get_constr_type         = get_constr_type;\n  lp->get_constr_value        = get_constr_value;\n  lp->get_constraints         = get_constraints;\n  lp->get_dual_solution       = get_dual_solution;\n  lp->get_epsb                = get_epsb;\n  lp->get_epsd                = get_epsd;\n  lp->get_epsel               = get_epsel;\n  lp->get_epsint              = get_epsint;\n  lp->get_epsperturb          = get_epsperturb;\n  lp->get_epspivot            = get_epspivot;\n  lp->get_improve             = get_improve;\n  lp->get_infinite            = get_infinite;\n  lp->get_lambda              = get_lambda;\n  lp->get_lowbo               = get_lowbo;\n  lp->get_lp_index            = get_lp_index;\n  lp->get_lp_name             = get_lp_name;\n  lp->get_Lrows               = get_Lrows;\n  lp->get_mat                 = get_mat;\n  lp->get_mat_byindex         = get_mat_byindex;\n  lp->get_max_level           = get_max_level;\n  lp->get_maxpivot            = get_maxpivot;\n  lp->get_mip_gap             = get_mip_gap;\n  lp->get_multiprice          = get_multiprice;\n  lp->get_nameindex           = get_nameindex;\n  lp->get_Ncolumns            = get_Ncolumns;\n  lp->get_negrange            = get_negrange;\n  lp->get_nonzeros            = get_nonzeros;\n  lp->get_Norig_columns       = get_Norig_columns;\n  lp->get_Norig_rows          = get_Norig_rows;\n  lp->get_Nrows               = get_Nrows;\n  lp->get_obj_bound           = get_obj_bound;\n  lp->get_objective           = get_objective;\n  lp->get_orig_index          = get_orig_index;\n  lp->get_origcol_name        = get_origcol_name;\n  lp->get_origrow_name        = get_origrow_name;\n  lp->get_partialprice        = get_partialprice;\n  lp->get_pivoting            = get_pivoting;\n  lp->get_presolve            = get_presolve;\n  lp->get_presolveloops       = get_presolveloops;\n  lp->get_primal_solution     = get_primal_solution;\n  lp->get_print_sol           = get_print_sol;\n  lp->get_pseudocosts         = get_pseudocosts;\n  lp->get_ptr_constraints     = get_ptr_constraints;\n  lp->get_ptr_dual_solution   = get_ptr_dual_solution;\n  lp->get_ptr_lambda          = get_ptr_lambda;\n  lp->get_ptr_primal_solution = get_ptr_primal_solution;\n  lp->get_ptr_sensitivity_obj = get_ptr_sensitivity_obj;\n  lp->get_ptr_sensitivity_objex = get_ptr_sensitivity_objex;\n  lp->get_ptr_sensitivity_rhs = get_ptr_sensitivity_rhs;\n  lp->get_ptr_variables       = get_ptr_variables;\n  lp->get_rh                  = get_rh;\n  lp->get_rh_range            = get_rh_range;\n  lp->get_row                 = get_row;\n  lp->get_rowex               = get_rowex;\n  lp->get_row_name            = get_row_name;\n  lp->get_scalelimit          = get_scalelimit;\n  lp->get_scaling             = get_scaling;\n  lp->get_sensitivity_obj     = get_sensitivity_obj;\n  lp->get_sensitivity_objex   = get_sensitivity_objex;\n  lp->get_sensitivity_rhs     = get_sensitivity_rhs;\n  lp->get_simplextype         = get_simplextype;\n  lp->get_solutioncount       = get_solutioncount;\n  lp->get_solutionlimit       = get_solutionlimit;\n  lp->get_status              = get_status;\n  lp->get_statustext          = get_statustext;\n  lp->get_timeout             = get_timeout;\n  lp->get_total_iter          = get_total_iter;\n  lp->get_total_nodes         = get_total_nodes;\n  lp->get_upbo                = get_upbo;\n  lp->get_var_branch          = get_var_branch;\n  lp->get_var_dualresult      = get_var_dualresult;\n  lp->get_var_primalresult    = get_var_primalresult;\n  lp->get_var_priority        = get_var_priority;\n  lp->get_variables           = get_variables;\n  lp->get_verbose             = get_verbose;\n  lp->get_working_objective   = get_working_objective;\n  lp->has_BFP                 = has_BFP;\n  lp->has_XLI                 = has_XLI;\n  lp->is_add_rowmode          = is_add_rowmode;\n  lp->is_anti_degen           = is_anti_degen;\n  lp->is_binary               = is_binary;\n  lp->is_break_at_first       = is_break_at_first;\n  lp->is_constr_type          = is_constr_type;\n  lp->is_debug                = is_debug;\n  lp->is_feasible             = is_feasible;\n  lp->is_unbounded            = is_unbounded;\n  lp->is_infinite             = is_infinite;\n  lp->is_int                  = is_int;\n  lp->is_integerscaling       = is_integerscaling;\n  lp->is_lag_trace            = is_lag_trace;\n  lp->is_maxim                = is_maxim;\n  lp->is_nativeBFP            = is_nativeBFP;\n  lp->is_nativeXLI            = is_nativeXLI;\n  lp->is_negative             = is_negative;\n  lp->is_obj_in_basis         = is_obj_in_basis;\n  lp->is_piv_mode             = is_piv_mode;\n  lp->is_piv_rule             = is_piv_rule;\n  lp->is_presolve             = is_presolve;\n  lp->is_scalemode            = is_scalemode;\n  lp->is_scaletype            = is_scaletype;\n  lp->is_semicont             = is_semicont;\n  lp->is_SOS_var              = is_SOS_var;\n  lp->is_trace                = is_trace;\n  lp->lp_solve_version        = lp_solve_version;\n  lp->make_lp                 = make_lp;\n  lp->print_constraints       = print_constraints;\n  lp->print_debugdump         = print_debugdump;\n  lp->print_duals             = print_duals;\n  lp->print_lp                = print_lp;\n  lp->print_objective         = print_objective;\n  lp->print_scales            = print_scales;\n  lp->print_solution          = print_solution;\n  lp->print_str               = print_str;\n  lp->print_tableau           = print_tableau;\n  lp->put_abortfunc           = put_abortfunc;\n  lp->put_bb_nodefunc         = put_bb_nodefunc;\n  lp->put_bb_branchfunc       = put_bb_branchfunc;\n  lp->put_logfunc             = put_logfunc;\n  lp->put_msgfunc             = put_msgfunc;\n  lp->read_LP                 = read_LP;\n  lp->read_MPS                = read_MPS;\n  lp->read_XLI                = read_XLI;\n  lp->read_basis              = read_basis;\n  lp->reset_basis             = reset_basis;\n  lp->read_params             = read_params;\n  lp->reset_params            = reset_params;\n  lp->resize_lp               = resize_lp;\n  lp->set_action              = set_action;\n  lp->set_add_rowmode         = set_add_rowmode;\n  lp->set_anti_degen          = set_anti_degen;\n  lp->set_basisvar            = set_basisvar;\n  lp->set_basis               = set_basis;\n  lp->set_basiscrash          = set_basiscrash;\n  lp->set_bb_depthlimit       = set_bb_depthlimit;\n  lp->set_bb_floorfirst       = set_bb_floorfirst;\n  lp->set_bb_rule             = set_bb_rule;\n  lp->set_BFP                 = set_BFP;\n  lp->set_binary              = set_binary;\n  lp->set_bounds              = set_bounds;\n  lp->set_bounds_tighter      = set_bounds_tighter;\n  lp->set_break_at_first      = set_break_at_first;\n  lp->set_break_at_value      = set_break_at_value;\n  lp->set_col_name            = set_col_name;\n  lp->set_constr_type         = set_constr_type;\n  lp->set_debug               = set_debug;\n  lp->set_epsb                = set_epsb;\n  lp->set_epsd                = set_epsd;\n  lp->set_epsel               = set_epsel;\n  lp->set_epsint              = set_epsint;\n  lp->set_epslevel            = set_epslevel;\n  lp->set_epsperturb          = set_epsperturb;\n  lp->set_epspivot            = set_epspivot;\n  lp->set_unbounded           = set_unbounded;\n  lp->set_improve             = set_improve;\n  lp->set_infinite            = set_infinite;\n  lp->set_int                 = set_int;\n  lp->set_lag_trace           = set_lag_trace;\n  lp->set_lowbo               = set_lowbo;\n  lp->set_lp_name             = set_lp_name;\n  lp->set_mat                 = set_mat;\n  lp->set_maxim               = set_maxim;\n  lp->set_maxpivot            = set_maxpivot;\n  lp->set_minim               = set_minim;\n  lp->set_mip_gap             = set_mip_gap;\n  lp->set_multiprice          = set_multiprice;\n  lp->set_negrange            = set_negrange;\n  lp->set_obj                 = set_obj;\n  lp->set_obj_bound           = set_obj_bound;\n  lp->set_obj_fn              = set_obj_fn;\n  lp->set_obj_fnex            = set_obj_fnex;\n  lp->set_obj_in_basis        = set_obj_in_basis;\n  lp->set_outputfile          = set_outputfile;\n  lp->set_outputstream        = set_outputstream;\n  lp->set_partialprice        = set_partialprice;\n  lp->set_pivoting            = set_pivoting;\n  lp->set_preferdual          = set_preferdual;\n  lp->set_presolve            = set_presolve;\n  lp->set_print_sol           = set_print_sol;\n  lp->set_pseudocosts         = set_pseudocosts;\n  lp->set_rh                  = set_rh;\n  lp->set_rh_range            = set_rh_range;\n  lp->set_rh_vec              = set_rh_vec;\n  lp->set_row                 = set_row;\n  lp->set_rowex               = set_rowex;\n  lp->set_row_name            = set_row_name;\n  lp->set_scalelimit          = set_scalelimit;\n  lp->set_scaling             = set_scaling;\n  lp->set_semicont            = set_semicont;\n  lp->set_sense               = set_sense;\n  lp->set_simplextype         = set_simplextype;\n  lp->set_solutionlimit       = set_solutionlimit;\n  lp->set_timeout             = set_timeout;\n  lp->set_trace               = set_trace;\n  lp->set_upbo                = set_upbo;\n  lp->set_var_branch          = set_var_branch;\n  lp->set_var_weights         = set_var_weights;\n  lp->set_verbose             = set_verbose;\n  lp->set_XLI                 = set_XLI;\n  lp->solve                   = solve;\n  lp->str_add_column          = str_add_column;\n  lp->str_add_constraint      = str_add_constraint;\n  lp->str_add_lag_con         = str_add_lag_con;\n  lp->str_set_obj_fn          = str_set_obj_fn;\n  lp->str_set_rh_vec          = str_set_rh_vec;\n  lp->time_elapsed            = time_elapsed;\n  lp->unscale                 = unscale;\n  lp->write_lp                = write_lp;\n  lp->write_LP                = write_LP;\n  lp->write_mps               = write_mps;\n  lp->write_freemps           = write_freemps;\n  lp->write_MPS               = write_MPS;\n  lp->write_freeMPS           = write_freeMPS;\n  lp->write_XLI               = write_XLI;\n  lp->write_basis             = write_basis;\n  lp->write_params            = write_params;\n\n  /* Utility functions (mainly for BFPs) */\n  lp->userabort               = userabort;\n  lp->report                  = report;\n  lp->explain                 = explain;\n  lp->set_basisvar            = set_basisvar;\n  lp->get_lpcolumn            = obtain_column;\n  lp->get_basiscolumn         = get_basiscolumn;\n  lp->get_OF_active           = get_OF_active;\n  lp->getMDO                  = getMDO;\n  lp->invert                  = invert;\n  lp->set_action              = set_action;\n  lp->clear_action            = clear_action;\n  lp->is_action               = is_action;\n\n  return( TRUE );\n}\n\n/* SUPPORT FUNCTION FOR BASIS FACTORIZATION PACKAGES */\nMYBOOL __WINAPI has_BFP(lprec *lp)\n{\n  return( is_nativeBFP(lp)\n#if LoadInverseLib == TRUE\n       || (MYBOOL) (lp->hBFP != NULL)\n#endif\n        );\n}\n\nMYBOOL __WINAPI is_nativeBFP(lprec *lp)\n{\n#ifdef ExcludeNativeInverse\n  return( FALSE );\n#elif LoadInverseLib == TRUE\n  return( (MYBOOL) (lp->hBFP == NULL) );\n#else\n  return( TRUE );\n#endif\n}\n\nMYBOOL __WINAPI set_BFP(lprec *lp, char *filename)\n/* (Re)mapping of basis factorization variant methods is done here */\n{\n  int result = LIB_LOADED;\n\n  /* Release the BFP and basis if we are active */\n  if(lp->invB != NULL)\n    bfp_free(lp);\n\n#if LoadInverseLib == TRUE\n  if(lp->hBFP != NULL) {\n  #ifdef WIN32\n    FreeLibrary(lp->hBFP);\n  #else\n    dlclose(lp->hBFP);\n  #endif\n    lp->hBFP = NULL;\n  }\n#endif\n\n  if(filename == NULL) {\n    if(!is_nativeBFP(lp))\n      return( FALSE );\n#ifndef ExcludeNativeInverse\n    lp->bfp_name = bfp_name;\n    lp->bfp_compatible = bfp_compatible;\n    lp->bfp_free = bfp_free;\n    lp->bfp_resize = bfp_resize;\n    lp->bfp_nonzeros = bfp_nonzeros;\n    lp->bfp_memallocated = bfp_memallocated;\n    lp->bfp_restart = bfp_restart;\n    lp->bfp_mustrefactorize = bfp_mustrefactorize;\n    lp->bfp_preparefactorization = bfp_preparefactorization;\n    lp->bfp_factorize = bfp_factorize;\n    lp->bfp_finishupdate = bfp_finishupdate;\n    lp->bfp_ftran_normal = bfp_ftran_normal;\n    lp->bfp_ftran_prepare = bfp_ftran_prepare;\n    lp->bfp_btran_normal = bfp_btran_normal;\n    lp->bfp_status = bfp_status;\n    lp->bfp_implicitslack = bfp_implicitslack;\n    lp->bfp_indexbase = bfp_indexbase;\n    lp->bfp_rowoffset = bfp_rowoffset;\n    lp->bfp_pivotmax = bfp_pivotmax;\n    lp->bfp_init = bfp_init;\n    lp->bfp_pivotalloc = bfp_pivotalloc;\n    lp->bfp_colcount = bfp_colcount;\n    lp->bfp_canresetbasis = bfp_canresetbasis;\n    lp->bfp_finishfactorization = bfp_finishfactorization;\n    lp->bfp_updaterefactstats = bfp_updaterefactstats;\n    lp->bfp_prepareupdate = bfp_prepareupdate;\n    lp->bfp_pivotRHS = bfp_pivotRHS;\n    lp->bfp_btran_double = bfp_btran_double;\n    lp->bfp_efficiency = bfp_efficiency;\n    lp->bfp_pivotvector = bfp_pivotvector;\n    lp->bfp_pivotcount = bfp_pivotcount;\n    lp->bfp_refactcount = bfp_refactcount;\n    lp->bfp_isSetI = bfp_isSetI;\n    lp->bfp_findredundant = bfp_findredundant;\n#endif\n  }\n  else {\n#if LoadInverseLib == TRUE\n  #ifdef WIN32\n   /* Get a handle to the Windows DLL module. */\n    lp->hBFP = LoadLibrary(filename);\n\n   /* If the handle is valid, try to get the function addresses. */\n    if(lp->hBFP != NULL) {\n      lp->bfp_compatible           = (BFPbool_lpintintint *)\n                                      GetProcAddress(lp->hBFP, \"bfp_compatible\");\n      if(lp->bfp_compatible == NULL)\n        result = LIB_NOINFO;\n      else if(lp->bfp_compatible(lp, BFPVERSION, MAJORVERSION, sizeof(REAL))) {\n\n      lp->bfp_name                 = (BFPchar *)\n                                      GetProcAddress(lp->hBFP, \"bfp_name\");\n      lp->bfp_free                 = (BFP_lp *)\n                                      GetProcAddress(lp->hBFP, \"bfp_free\");\n      lp->bfp_resize               = (BFPbool_lpint *)\n                                      GetProcAddress(lp->hBFP, \"bfp_resize\");\n      lp->bfp_nonzeros             = (BFPint_lpbool *)\n                                      GetProcAddress(lp->hBFP, \"bfp_nonzeros\");\n      lp->bfp_memallocated         = (BFPint_lp *)\n                                      GetProcAddress(lp->hBFP, \"bfp_memallocated\");\n      lp->bfp_restart              = (BFPbool_lp *)\n                                      GetProcAddress(lp->hBFP, \"bfp_restart\");\n      lp->bfp_mustrefactorize      = (BFPbool_lp *)\n                                      GetProcAddress(lp->hBFP, \"bfp_mustrefactorize\");\n      lp->bfp_preparefactorization = (BFPint_lp *)\n                                      GetProcAddress(lp->hBFP, \"bfp_preparefactorization\");\n      lp->bfp_factorize            = (BFPint_lpintintboolbool *)\n                                      GetProcAddress(lp->hBFP, \"bfp_factorize\");\n      lp->bfp_finishupdate         = (BFPbool_lpbool *)\n                                      GetProcAddress(lp->hBFP, \"bfp_finishupdate\");\n      lp->bfp_ftran_normal         = (BFP_lprealint *)\n                                      GetProcAddress(lp->hBFP, \"bfp_ftran_normal\");\n      lp->bfp_ftran_prepare        = (BFP_lprealint *)\n                                      GetProcAddress(lp->hBFP, \"bfp_ftran_prepare\");\n      lp->bfp_btran_normal         = (BFP_lprealint *)\n                                      GetProcAddress(lp->hBFP, \"bfp_btran_normal\");\n      lp->bfp_status               = (BFPint_lp *)\n                                      GetProcAddress(lp->hBFP, \"bfp_status\");\n      lp->bfp_implicitslack        = (BFPbool_lp *)\n                                      GetProcAddress(lp->hBFP, \"bfp_implicitslack\");\n      lp->bfp_indexbase            = (BFPint_lp *)\n                                      GetProcAddress(lp->hBFP, \"bfp_indexbase\");\n      lp->bfp_rowoffset            = (BFPint_lp *)\n                                      GetProcAddress(lp->hBFP, \"bfp_rowoffset\");\n      lp->bfp_pivotmax             = (BFPint_lp *)\n                                      GetProcAddress(lp->hBFP, \"bfp_pivotmax\");\n      lp->bfp_init                 = (BFPbool_lpintintchar *)\n                                      GetProcAddress(lp->hBFP, \"bfp_init\");\n      lp->bfp_pivotalloc           = (BFPbool_lpint *)\n                                      GetProcAddress(lp->hBFP, \"bfp_pivotalloc\");\n      lp->bfp_colcount             = (BFPint_lp *)\n                                      GetProcAddress(lp->hBFP, \"bfp_colcount\");\n      lp->bfp_canresetbasis        = (BFPbool_lp *)\n                                      GetProcAddress(lp->hBFP, \"bfp_canresetbasis\");\n      lp->bfp_finishfactorization  = (BFP_lp *)\n                                      GetProcAddress(lp->hBFP, \"bfp_finishfactorization\");\n      lp->bfp_updaterefactstats    = (BFP_lp *)\n                                      GetProcAddress(lp->hBFP, \"bfp_updaterefactstats\");\n      lp->bfp_prepareupdate        = (BFPlreal_lpintintreal *)\n                                      GetProcAddress(lp->hBFP, \"bfp_prepareupdate\");\n      lp->bfp_pivotRHS             = (BFPreal_lplrealreal *)\n                                      GetProcAddress(lp->hBFP, \"bfp_pivotRHS\");\n      lp->bfp_btran_double         = (BFP_lprealintrealint *)\n                                      GetProcAddress(lp->hBFP, \"bfp_btran_double\");\n      lp->bfp_efficiency           = (BFPreal_lp *)\n                                      GetProcAddress(lp->hBFP, \"bfp_efficiency\");\n      lp->bfp_pivotvector          = (BFPrealp_lp *)\n                                      GetProcAddress(lp->hBFP, \"bfp_pivotvector\");\n      lp->bfp_pivotcount           = (BFPint_lp *)\n                                      GetProcAddress(lp->hBFP, \"bfp_pivotcount\");\n      lp->bfp_refactcount          = (BFPint_lpint *)\n                                      GetProcAddress(lp->hBFP, \"bfp_refactcount\");\n      lp->bfp_isSetI               = (BFPbool_lp *)\n                                      GetProcAddress(lp->hBFP, \"bfp_isSetI\");\n      lp->bfp_findredundant        = (BFPint_lpintrealcbintint *)\n                                      GetProcAddress(lp->hBFP, \"bfp_findredundant\");\n      }\n      else\n        result = LIB_VERINVALID;\n    }\n  #else\n   /* First standardize UNIX .SO library name format. */\n    char bfpname[260], *ptr;\n\n    strcpy(bfpname, filename);\n    if((ptr = strrchr(filename, '/')) == NULL)\n      ptr = filename;\n    else\n      ptr++;\n    bfpname[(int) (ptr - filename)] = 0;\n    if(strncmp(ptr, \"lib\", 3))\n      strcat(bfpname, \"lib\");\n    strcat(bfpname, ptr);\n    if(strcmp(bfpname + strlen(bfpname) - 3, \".so\"))\n      strcat(bfpname, \".so\");\n\n   /* Get a handle to the module. */\n    lp->hBFP = dlopen(bfpname, RTLD_LAZY);\n\n   /* If the handle is valid, try to get the function addresses. */\n    if(lp->hBFP != NULL) {\n      lp->bfp_compatible           = (BFPbool_lpintintint *)\n                                      dlsym(lp->hBFP, \"bfp_compatible\");\n      if(lp->bfp_compatible == NULL)\n        result = LIB_NOINFO;\n      else if(lp->bfp_compatible(lp, BFPVERSION, MAJORVERSION, sizeof(REAL))) {\n\n      lp->bfp_name                 = (BFPchar *)\n                                      dlsym(lp->hBFP, \"bfp_name\");\n      lp->bfp_free                 = (BFP_lp *)\n                                      dlsym(lp->hBFP, \"bfp_free\");\n      lp->bfp_resize               = (BFPbool_lpint *)\n                                      dlsym(lp->hBFP, \"bfp_resize\");\n      lp->bfp_nonzeros             = (BFPint_lpbool *)\n                                      dlsym(lp->hBFP, \"bfp_nonzeros\");\n      lp->bfp_memallocated         = (BFPint_lp *)\n                                      dlsym(lp->hBFP, \"bfp_memallocated\");\n      lp->bfp_restart              = (BFPbool_lp *)\n                                      dlsym(lp->hBFP, \"bfp_restart\");\n      lp->bfp_mustrefactorize      = (BFPbool_lp *)\n                                      dlsym(lp->hBFP, \"bfp_mustrefactorize\");\n      lp->bfp_preparefactorization = (BFPint_lp *)\n                                      dlsym(lp->hBFP, \"bfp_preparefactorization\");\n      lp->bfp_factorize            = (BFPint_lpintintboolbool *)\n                                      dlsym(lp->hBFP, \"bfp_factorize\");\n      lp->bfp_finishupdate         = (BFPbool_lpbool *)\n                                      dlsym(lp->hBFP, \"bfp_finishupdate\");\n      lp->bfp_ftran_normal         = (BFP_lprealint *)\n                                      dlsym(lp->hBFP, \"bfp_ftran_normal\");\n      lp->bfp_ftran_prepare        = (BFP_lprealint *)\n                                      dlsym(lp->hBFP, \"bfp_ftran_prepare\");\n      lp->bfp_btran_normal         = (BFP_lprealint *)\n                                      dlsym(lp->hBFP, \"bfp_btran_normal\");\n      lp->bfp_status               = (BFPint_lp *)\n                                      dlsym(lp->hBFP, \"bfp_status\");\n      lp->bfp_implicitslack        = (BFPbool_lp *)\n                                      dlsym(lp->hBFP, \"bfp_implicitslack\");\n      lp->bfp_indexbase            = (BFPint_lp *)\n                                      dlsym(lp->hBFP, \"bfp_indexbase\");\n      lp->bfp_rowoffset            = (BFPint_lp *)\n                                      dlsym(lp->hBFP, \"bfp_rowoffset\");\n      lp->bfp_pivotmax             = (BFPint_lp *)\n                                      dlsym(lp->hBFP, \"bfp_pivotmax\");\n      lp->bfp_init                 = (BFPbool_lpintintchar *)\n                                      dlsym(lp->hBFP, \"bfp_init\");\n      lp->bfp_pivotalloc           = (BFPbool_lpint *)\n                                      dlsym(lp->hBFP, \"bfp_pivotalloc\");\n      lp->bfp_colcount             = (BFPint_lp *)\n                                      dlsym(lp->hBFP, \"bfp_colcount\");\n      lp->bfp_canresetbasis        = (BFPbool_lp *)\n                                      dlsym(lp->hBFP, \"bfp_canresetbasis\");\n      lp->bfp_finishfactorization  = (BFP_lp *)\n                                      dlsym(lp->hBFP, \"bfp_finishfactorization\");\n      lp->bfp_updaterefactstats    = (BFP_lp *)\n                                      dlsym(lp->hBFP, \"bfp_updaterefactstats\");\n      lp->bfp_prepareupdate        = (BFPlreal_lpintintreal *)\n                                      dlsym(lp->hBFP, \"bfp_prepareupdate\");\n      lp->bfp_pivotRHS             = (BFPreal_lplrealreal *)\n                                      dlsym(lp->hBFP, \"bfp_pivotRHS\");\n      lp->bfp_btran_double         = (BFP_lprealintrealint *)\n                                      dlsym(lp->hBFP, \"bfp_btran_double\");\n      lp->bfp_efficiency           = (BFPreal_lp *)\n                                      dlsym(lp->hBFP, \"bfp_efficiency\");\n      lp->bfp_pivotvector          = (BFPrealp_lp *)\n                                      dlsym(lp->hBFP, \"bfp_pivotvector\");\n      lp->bfp_pivotcount           = (BFPint_lp *)\n                                      dlsym(lp->hBFP, \"bfp_pivotcount\");\n      lp->bfp_refactcount          = (BFPint_lpint *)\n                                      dlsym(lp->hBFP, \"bfp_refactcount\");\n      lp->bfp_isSetI               = (BFPbool_lp *)\n                                      dlsym(lp->hBFP, \"bfp_isSetI\");\n      lp->bfp_findredundant        = (BFPint_lpintrealcbintint *)\n                                      dlsym(lp->hBFP, \"bfp_findredundant\");\n      }\n      else\n        result = LIB_VERINVALID;\n    }\n  #endif\n    else\n      result = LIB_NOTFOUND;\n#endif\n    /* Do validation */\n    if((result != LIB_LOADED) ||\n       ((lp->bfp_name == NULL) ||\n        (lp->bfp_compatible == NULL) ||\n        (lp->bfp_free == NULL) ||\n        (lp->bfp_resize == NULL) ||\n        (lp->bfp_nonzeros == NULL) ||\n        (lp->bfp_memallocated == NULL) ||\n        (lp->bfp_restart == NULL) ||\n        (lp->bfp_mustrefactorize == NULL) ||\n        (lp->bfp_preparefactorization == NULL) ||\n        (lp->bfp_factorize == NULL) ||\n        (lp->bfp_finishupdate == NULL) ||\n        (lp->bfp_ftran_normal == NULL) ||\n        (lp->bfp_ftran_prepare == NULL) ||\n        (lp->bfp_btran_normal == NULL) ||\n        (lp->bfp_status == NULL) ||\n        (lp->bfp_implicitslack == NULL) ||\n        (lp->bfp_indexbase == NULL) ||\n        (lp->bfp_rowoffset == NULL) ||\n        (lp->bfp_pivotmax == NULL) ||\n        (lp->bfp_init == NULL) ||\n        (lp->bfp_pivotalloc == NULL) ||\n        (lp->bfp_colcount == NULL) ||\n        (lp->bfp_canresetbasis == NULL) ||\n        (lp->bfp_finishfactorization == NULL) ||\n        (lp->bfp_updaterefactstats == NULL) ||\n        (lp->bfp_prepareupdate == NULL) ||\n        (lp->bfp_pivotRHS == NULL) ||\n        (lp->bfp_btran_double == NULL) ||\n        (lp->bfp_efficiency == NULL) ||\n        (lp->bfp_pivotvector == NULL) ||\n        (lp->bfp_pivotcount == NULL) ||\n        (lp->bfp_refactcount == NULL) ||\n        (lp->bfp_isSetI == NULL) ||\n        (lp->bfp_findredundant == NULL)\n       )) {\n      set_BFP(lp, NULL);\n      if(result == LIB_LOADED)\n        result = LIB_NOFUNCTION;\n    }\n  }\n  if(filename != NULL) {\n    char info[LIB_STR_MAXLEN+1];\n    switch(result) {\n      case LIB_NOTFOUND:   strcpy(info, LIB_STR_NOTFOUND);\n                           break;\n      case LIB_NOINFO:     strcpy(info, LIB_STR_NOINFO);\n                           break;\n      case LIB_NOFUNCTION: strcpy(info, LIB_STR_NOFUNCTION);\n                           break;\n      case LIB_VERINVALID: strcpy(info, LIB_STR_VERINVALID);\n                           break;\n      default:             strcpy(info, LIB_STR_LOADED);\n    }\n    report(lp, IMPORTANT, \"set_BFP: %s '%s'\\n\",\n                          info, filename);\n  }\n  return( (MYBOOL) (result == LIB_LOADED));\n}\n\n\n/* External language interface routines */\n/* DON'T MODIFY */\nlprec * __WINAPI read_XLI(char *xliname, char *modelname, char *dataname, char *options, int verbose)\n{\n  lprec *lp;\n\n  lp = make_lp(0, 0);\n  if(lp != NULL) {\n    lp->source_is_file = TRUE;\n    lp->verbose = verbose;\n    if(!set_XLI(lp, xliname)) {\n      free_lp(&lp);\n      printf(\"read_XLI: No valid XLI package selected or available.\\n\");\n    }\n    else {\n      if(!lp->xli_readmodel(lp, modelname, (dataname != NULL) && (*dataname != 0) ? dataname : NULL, options, verbose))\n        free_lp(&lp);\n    }\n  }\n  return( lp );\n}\n\nMYBOOL __WINAPI write_XLI(lprec *lp, char *filename, char *options, MYBOOL results)\n{\n  return( has_XLI(lp) && mat_validate(lp->matA) && lp->xli_writemodel(lp, filename, options, results) );\n}\n\nMYBOOL __WINAPI has_XLI(lprec *lp)\n{\n  return( is_nativeXLI(lp)\n#if LoadLanguageLib == TRUE\n       || (MYBOOL) (lp->hXLI != NULL)\n#endif\n        );\n}\n\nMYBOOL __WINAPI is_nativeXLI(lprec *lp)\n{\n#ifdef ExcludeNativeLanguage\n  return( FALSE );\n#elif LoadLanguageLib == TRUE\n  return( (MYBOOL) (lp->hXLI == NULL) );\n#else\n  return( TRUE );\n#endif\n}\n\nMYBOOL __WINAPI set_XLI(lprec *lp, char *filename)\n/* (Re)mapping of external language interface variant methods is done here */\n{\n  int result = LIB_LOADED;\n\n#if LoadLanguageLib == TRUE\n  if(lp->hXLI != NULL) {\n  #ifdef WIN32\n    FreeLibrary(lp->hXLI);\n  #else\n    dlclose(lp->hXLI);\n  #endif\n    lp->hXLI = NULL;\n  }\n#endif\n\n  if(filename == NULL) {\n    if(!is_nativeXLI(lp))\n      return( FALSE );\n#ifndef ExcludeNativeLanguage\n    lp->xli_name = xli_name;\n    lp->xli_compatible = xli_compatible;\n    lp->xli_readmodel = xli_readmodel;\n    lp->xli_writemodel = xli_writemodel;\n#endif\n  }\n  else {\n#if LoadLanguageLib == TRUE\n  #ifdef WIN32\n   /* Get a handle to the Windows DLL module. */\n    lp->hXLI = LoadLibrary(filename);\n\n   /* If the handle is valid, try to get the function addresses. */\n    if(lp->hXLI != NULL) {\n      lp->xli_compatible           = (XLIbool_lpintintint *)\n                                      GetProcAddress(lp->hXLI, \"xli_compatible\");\n      if(lp->xli_compatible == NULL)\n        result = LIB_NOINFO;\n      else if(lp->xli_compatible(lp, XLIVERSION, MAJORVERSION, sizeof(REAL))) {\n\n        lp->xli_name                 = (XLIchar *)\n                                        GetProcAddress(lp->hXLI, \"xli_name\");\n        lp->xli_readmodel            = (XLIbool_lpcharcharcharint *)\n                                        GetProcAddress(lp->hXLI, \"xli_readmodel\");\n        lp->xli_writemodel           = (XLIbool_lpcharcharbool *)\n                                        GetProcAddress(lp->hXLI, \"xli_writemodel\");\n      }\n      else\n        result = LIB_VERINVALID;\n    }\n  #else\n   /* First standardize UNIX .SO library name format. */\n    char xliname[260], *ptr;\n\n    strcpy(xliname, filename);\n    if((ptr = strrchr(filename, '/')) == NULL)\n      ptr = filename;\n    else\n      ptr++;\n    xliname[(int) (ptr - filename)] = 0;\n    if(strncmp(ptr, \"lib\", 3))\n      strcat(xliname, \"lib\");\n    strcat(xliname, ptr);\n    if(strcmp(xliname + strlen(xliname) - 3, \".so\"))\n      strcat(xliname, \".so\");\n\n   /* Get a handle to the module. */\n    lp->hXLI = dlopen(xliname, RTLD_LAZY);\n\n   /* If the handle is valid, try to get the function addresses. */\n    if(lp->hXLI != NULL) {\n      lp->xli_compatible           = (XLIbool_lpintintint *)\n                                      dlsym(lp->hXLI, \"xli_compatible\");\n      if(lp->xli_compatible == NULL)\n        result = LIB_NOINFO;\n      else if(lp->xli_compatible(lp, XLIVERSION, MAJORVERSION, sizeof(REAL))) {\n\n        lp->xli_name                 = (XLIchar *)\n                                        dlsym(lp->hXLI, \"xli_name\");\n        lp->xli_readmodel            = (XLIbool_lpcharcharcharint *)\n                                        dlsym(lp->hXLI, \"xli_readmodel\");\n        lp->xli_writemodel           = (XLIbool_lpcharcharbool *)\n                                        dlsym(lp->hXLI, \"xli_writemodel\");\n      }\n      else\n        result = LIB_VERINVALID;\n    }\n  #endif\n    else\n      result = LIB_NOTFOUND;\n#endif\n    /* Do validation */\n    if((result != LIB_LOADED) ||\n       ((lp->xli_name == NULL) ||\n        (lp->xli_compatible == NULL) ||\n        (lp->xli_readmodel == NULL) ||\n        (lp->xli_writemodel == NULL)\n       )) {\n      set_XLI(lp, NULL);\n      if(result == LIB_LOADED)\n        result = LIB_NOFUNCTION;\n    }\n  }\n  if(filename != NULL) {\n    char info[LIB_STR_MAXLEN+1];\n    switch(result) {\n      case LIB_NOTFOUND:   strcpy(info, LIB_STR_NOTFOUND);\n                           break;\n      case LIB_NOINFO:     strcpy(info, LIB_STR_NOINFO);\n                           break;\n      case LIB_NOFUNCTION: strcpy(info, LIB_STR_NOFUNCTION);\n                           break;\n      case LIB_VERINVALID: strcpy(info, LIB_STR_VERINVALID);\n                           break;\n      default:             strcpy(info, LIB_STR_LOADED);\n    }\n    report(lp, IMPORTANT, \"set_XLI: %s '%s'\\n\",\n                          info, filename);\n  }\n  return( (MYBOOL) (result == LIB_LOADED));\n}\n\n\nSTATIC int get_basisOF(lprec *lp, int coltarget[], REAL crow[], int colno[])\n/* Fill vector of basic OF values or subtract incoming values from these.\n   This function is called twice during reduced cost updates when the basis\n   does not contain the basic OF vector as the top row.  The colno[] array\n   is filled with the count of non-zero values and the index to those. */\n{\n  int            i, n = lp->rows, nz = 0;\n  REAL           *obj = lp->obj;\n  register REAL epsvalue = lp->epsvalue;\n\n  /* Compute offset over the specified objective indeces (step 2) */\n  if(coltarget != NULL) {\n    register int  ix, m = coltarget[0];\n    register REAL value;\n\n    for(i = 1, coltarget++; i <= m; i++, coltarget++) {\n      ix = *coltarget;\n      /* Finalize the computation of the reduced costs, based on the format that\n         duals are computed as negatives, ref description for step 1 above */\n      value = crow[ix];\n      if(ix > n)\n        value += obj[ix - n];\n/*      if(value != 0) { */\n      if(fabs(value) > epsvalue) {\n        nz++;\n        if(colno != NULL)\n          colno[nz] = ix;\n      }\n      else\n        value = 0.0;\n      crow[ix] = value;\n    }\n  }\n\n  /* Get the basic objective function values (step 1) */\n  else {\n    register int *basvar = lp->var_basic;\n\n    for(i = 1, crow++, basvar++; i <= n;\n         i++, crow++, basvar++) {\n      /* Load the objective value of the active basic variable; note that we\n         change the sign of the value to maintain computational compatibility with\n         the calculation of duals using in-basis storage of the basic OF values */\n      if(*basvar <= n)\n        *crow = 0;\n      else\n        *crow = -obj[(*basvar) - n];\n      if((*crow) != 0) {\n/*      if(fabs(*crow) > epsvalue) { */\n        nz++;\n        if(colno != NULL)\n          colno[nz] = i;\n      }\n    }\n  }\n  if(colno != NULL)\n    colno[0] = nz;\n  return( nz );\n}\n\nint __WINAPI get_basiscolumn(lprec *lp, int j, int rn[], double bj[])\n/* This routine returns sparse vectors for all basis\n   columns, including the OF dummy (index 0) and slack columns.\n   NOTE that the index usage is nonstandard for lp_solve, since\n   the array offset is 1, not 0. */\n{\n  int k = lp->bfp_rowoffset(lp),\n      matbase = lp->bfp_indexbase(lp);\n\n  /* Do target index adjustment (etaPFI with matbase==0 is special case) */\n  if(matbase > 0)\n    matbase += k - 1;\n\n /* Convert index of slack and user columns */\n  j -= k;\n  if((j > 0) && !lp->bfp_isSetI(lp))\n    j = lp->var_basic[j];\n\n /* Process OF dummy and slack columns (always at lower bound) */\n  if(j <= lp->rows) {\n    rn[1] = j + matbase;\n    bj[1] = 1.0;\n    k = 1;\n  }\n /* Process user columns (negated if at lower bound) */\n  else {\n    k = obtain_column(lp, j, bj, rn, NULL);\n    if(matbase != 0)\n      for(j = 1; j <= k; j++)\n        rn[j] += matbase;\n  }\n\n  return( k );\n}\n\nMYBOOL __WINAPI get_primal_solution(lprec *lp, REAL *pv)\n{\n  if(lp->spx_status == OPTIMAL)\n    ;\n  else if(!lp->basis_valid) {\n    report(lp, CRITICAL, \"get_primal_solution: Not a valid basis\");\n    return(FALSE);\n  }\n\n  MEMCOPY(pv, lp->best_solution, lp->sum + 1);\n  return(TRUE);\n}\n\nMYBOOL __WINAPI get_ptr_primal_solution(lprec *lp, REAL **pv)\n{\n  *pv = lp->best_solution;\n  return(TRUE);\n}\n\nMYBOOL __WINAPI get_dual_solution(lprec *lp, REAL *rc)\n{\n  REAL *duals;\n  MYBOOL ret;\n\n  if(!lp->basis_valid) {\n    report(lp, CRITICAL, \"get_dual_solution: Not a valid basis\");\n    return(FALSE);\n  }\n\n  ret = get_ptr_sensitivity_rhs(lp, &duals, NULL, NULL);\n\n  if(ret)\n    MEMCOPY(rc, duals - 1, lp->sum + 1);\n  return(ret);\n}\n\nMYBOOL __WINAPI get_ptr_dual_solution(lprec *lp, REAL **rc)\n{\n  MYBOOL ret = lp->basis_valid;\n\n  /* Just return availability of dual information if rc is NULL */\n  if(rc == NULL)\n    return( ret && ((MIP_count(lp) == 0) || (lp->bb_totalnodes > 0)) );\n\n  if(!ret) {\n    report(lp, CRITICAL, \"get_ptr_dual_solution: Not a valid basis\");\n    return(ret);\n  }\n\n  /* Otherwise, get the pointer to the dual information (and optionally produce it) */\n  ret = get_ptr_sensitivity_rhs(lp, rc, NULL, NULL);\n  if(ret)\n    (*rc)--;\n\n  return(ret);\n}\n\nMYBOOL __WINAPI get_lambda(lprec *lp, REAL *lambda)\n{\n  if(!lp->basis_valid || (get_Lrows(lp) == 0)) {\n    report(lp, CRITICAL, \"get_lambda: Not a valid basis\");\n    return(FALSE);\n  }\n\n  MEMCOPY(lambda, lp->lambda+1, get_Lrows(lp));\n  return(TRUE);\n}\n\nMYBOOL __WINAPI get_ptr_lambda(lprec *lp, REAL **lambda)\n{\n  *lambda = lp->lambda;\n  return(TRUE);\n}\n\nint __WINAPI get_orig_index(lprec *lp, int lp_index)\n{\n  if(lp->varmap_locked)\n    return(lp->presolve_undo->var_to_orig[lp_index]);\n  else if(lp_index <= lp->presolve_undo->orig_rows)\n    return(lp_index);\n  else\n    return(lp_index-lp->presolve_undo->orig_rows);\n}\nint __WINAPI get_lp_index(lprec *lp, int orig_index)\n{\n  if(lp->varmap_locked)\n    return(lp->presolve_undo->orig_to_var[orig_index]);\n  else if(orig_index <= lp->presolve_undo->orig_rows)\n    return(orig_index);\n  else\n    return(orig_index-lp->presolve_undo->orig_rows);\n}\n\nMYBOOL __WINAPI is_feasible(lprec *lp, REAL *values, REAL threshold)\n/* Recommend to use threshold = lp->epspivot */\n{\n  int     i, j, elmnr, ie;\n  REAL    *this_rhs, dist;\n  REAL    *value;\n  int     *rownr;\n  MATrec  *mat = lp->matA;\n\n  for(i = lp->rows + 1; i <= lp->sum; i++) {\n    if(values[i - lp->rows] < unscaled_value(lp, lp->orig_lowbo[i], i)\n       || values[i - lp->rows] > unscaled_value(lp, lp->orig_upbo[i], i)) {\n      if(!((lp->sc_lobound[i - lp->rows]>0) && (values[i - lp->rows]==0)))\n        return(FALSE);\n    }\n  }\n\n  this_rhs = (REAL *) mempool_obtainVector(lp->workarrays, lp->rows+1, sizeof(*this_rhs));\n/*  allocREAL(lp, &this_rhs, lp->rows + 1, TRUE); */\n  for(j = 1; j <= lp->columns; j++) {\n    elmnr = mat->col_end[j - 1];\n    ie = mat->col_end[j];\n    rownr = &COL_MAT_ROWNR(elmnr);\n    value = &COL_MAT_VALUE(elmnr);\n    for(; elmnr < ie; elmnr++, rownr += matRowColStep, value += matValueStep) {\n      this_rhs[*rownr] += unscaled_mat(lp, *value, *rownr, j);\n    }\n  }\n  for(i = 1; i <= lp->rows; i++) {\n    dist = lp->orig_rhs[i] - this_rhs[i];\n    my_roundzero(dist, threshold);\n    if((lp->orig_upbo[i] == 0 && dist != 0) ||( dist < 0)) {\n      FREE(this_rhs);\n      return(FALSE);\n    }\n  }\n  mempool_releaseVector(lp->workarrays, (char *) this_rhs, FALSE);\n/*  FREE(this_rhs); */\n  return(TRUE);\n}\n\nint __WINAPI column_in_lp(lprec *lp, REAL *testcolumn)\n{\n  int    i, j, je, colnr = 0;\n  int    nz, ident = 1;\n  MATrec *mat = lp->matA;\n  int    *matRownr;\n  REAL   value, *matValue;\n\n  for(nz = 0, i = 1; i <= lp->rows; i++)\n    if(fabs(testcolumn[i]) > lp->epsvalue) nz++;\n\n  for(i = 1; (i <= lp->columns) && (ident); i++) {\n    ident = nz;\n    value = fabs(get_mat(lp, 0, i)-testcolumn[0]);\n    if(value > lp->epsvalue)\n      continue;\n    j = mat->col_end[i - 1];\n    je = mat->col_end[i];\n    matRownr = &COL_MAT_ROWNR(j);\n    matValue = &COL_MAT_VALUE(j);\n    for(; (j < je) && (ident >= 0);\n        j++, ident--, matRownr += matRowColStep, matValue += matValueStep) {\n      value = *matValue;\n      if(is_chsign(lp, *matRownr))\n        value = my_flipsign(value);\n      value = unscaled_mat(lp, value, *matRownr, i);\n      value -= testcolumn[*matRownr];\n      if(fabs(value) > lp->epsvalue)\n        break;\n    }\n    if(ident == 0)\n      colnr = i;\n  }\n  return( colnr );\n}\n\nMYBOOL __WINAPI set_lp_name(lprec *lp, char *name)\n{\n  if (name == NULL) {\n    FREE(lp->lp_name);\n    lp->lp_name = NULL;\n  }\n  else {\n    allocCHAR(lp, &lp->lp_name, (int) (strlen(name) + 1), AUTOMATIC);\n    strcpy(lp->lp_name, name);\n  }\n  return(TRUE);\n}\n\nchar * __WINAPI get_lp_name(lprec *lp)\n{\n  return((lp->lp_name != NULL) ? lp->lp_name : (char *) \"\");\n}\n\nSTATIC MYBOOL init_rowcol_names(lprec *lp)\n{\n  if(!lp->names_used) {\n    lp->row_name = (hashelem **) calloc(lp->rows_alloc + 1, sizeof(*lp->row_name));\n    lp->col_name = (hashelem **) calloc(lp->columns_alloc + 1, sizeof(*lp->col_name));\n    lp->rowname_hashtab = create_hash_table(lp->rows_alloc + 1, 0);\n    lp->colname_hashtab = create_hash_table(lp->columns_alloc + 1, 1);\n    lp->names_used = TRUE;\n  }\n  return(TRUE);\n}\n\nMYBOOL rename_var(lprec *lp, int varindex, char *new_name, hashelem **list, hashtable **ht)\n{\n  hashelem *hp;\n  MYBOOL   newitem;\n\n  hp = list[varindex];\n  newitem = (MYBOOL) (hp == NULL);\n  if(newitem)\n    hp = puthash(new_name, varindex, list, *ht);\n  else if((strlen(hp->name) != strlen(new_name)) ||\n          (strcmp(hp->name, new_name) != 0)) {\n    hashtable *newht, *oldht;\n\n    allocCHAR(lp, &hp->name, (int) (strlen(new_name) + 1), AUTOMATIC);\n    strcpy(hp->name, new_name);\n    oldht = *ht;\n    newht = copy_hash_table(oldht, list, oldht->size);\n    *ht = newht;\n    free_hash_table(oldht);\n  }\n  return(newitem);\n}\n\nMYBOOL __WINAPI is_use_names(lprec *lp, MYBOOL isrow)\n{\n  if(isrow)\n    return( lp->use_row_names );\n  else\n    return( lp->use_col_names );\n}\n\nvoid __WINAPI set_use_names(lprec *lp, MYBOOL isrow, MYBOOL use_names)\n{\n  if(isrow)\n    lp->use_row_names = use_names;\n  else\n    lp->use_col_names = use_names;\n}\n\nint __WINAPI get_nameindex(lprec *lp, char *varname, MYBOOL isrow)\n{\n  if(isrow)\n    return( find_row(lp, varname, FALSE) );\n  else\n    return( find_var(lp, varname, FALSE) );\n}\n\nMYBOOL __WINAPI set_row_name(lprec *lp, int rownr, char *new_name)\n{\n  if((rownr < 0) || (rownr > lp->rows+1)) {\n    report(lp, IMPORTANT, \"set_row_name: Row %d out of range\", rownr);\n    return(FALSE);\n  }\n\n  /* Prepare for a new row */\n  if((rownr > lp->rows) && !append_rows(lp, rownr-lp->rows))\n    return( FALSE );\n  if(!lp->names_used) {\n    if(!init_rowcol_names(lp))\n      return(FALSE);\n  }\n  rename_var(lp, rownr, new_name, lp->row_name, &lp->rowname_hashtab);\n\n  return(TRUE);\n}\n\nchar * __WINAPI get_row_name(lprec *lp, int rownr)\n{\n  if((rownr < 0) || (rownr > lp->rows+1)) {\n    report(lp, IMPORTANT, \"get_row_name: Row %d out of range\", rownr);\n    return(NULL);\n  }\n\n  if((lp->presolve_undo->var_to_orig != NULL) && lp->wasPresolved) {\n    if(lp->presolve_undo->var_to_orig[rownr] == 0)\n      rownr = -rownr;\n    else\n      rownr = lp->presolve_undo->var_to_orig[rownr];\n  }\n  return( get_origrow_name(lp, rownr) );\n}\n\nchar * __WINAPI get_origrow_name(lprec *lp, int rownr)\n{\n  MYBOOL newrow;\n  char   *ptr;\n\n  newrow = (MYBOOL) (rownr < 0);\n  rownr = abs(rownr);\n#ifdef Paranoia\n  if(((lp->presolve_undo->var_to_orig == NULL) && newrow) ||\n     (rownr > MAX(lp->rows, lp->presolve_undo->orig_rows))) {\n    report(lp, IMPORTANT, \"get_origrow_name: Row %d out of range\", rownr);\n    return(NULL);\n  }\n#endif\n\n  if(lp->names_used && lp->use_row_names && (lp->row_name[rownr] != NULL) &&\n                            (lp->row_name[rownr]->name != NULL)) {\n#ifdef Paranoia\n    if(lp->row_name[rownr]->index != rownr)\n      report(lp, SEVERE, \"get_origrow_name: Inconsistent row ordinal %d vs %d\\n\",\n                         rownr, lp->row_name[rownr]->index);\n#endif\n    ptr = lp->row_name[rownr]->name;\n  }\n  else {\n    if(lp->rowcol_name == NULL)\n      if (!allocCHAR(lp, &lp->rowcol_name, 20, FALSE))\n        return(NULL);\n    ptr = lp->rowcol_name;\n    if(newrow)\n      sprintf(ptr, ROWNAMEMASK2, rownr);\n    else\n      sprintf(ptr, ROWNAMEMASK, rownr);\n  }\n  return(ptr);\n}\n\nMYBOOL __WINAPI set_col_name(lprec *lp, int colnr, char *new_name)\n{\n  if((colnr > lp->columns+1) || (colnr < 1)) {\n    report(lp, IMPORTANT, \"set_col_name: Column %d out of range\", colnr);\n  }\n\n  if((colnr > lp->columns) && !append_columns(lp, colnr-lp->columns))\n    return(FALSE);\n\n  if(!lp->names_used)\n    init_rowcol_names(lp);\n  rename_var(lp, colnr, new_name, lp->col_name, &lp->colname_hashtab);\n\n  return(TRUE);\n}\n\nchar * __WINAPI get_col_name(lprec *lp, int colnr)\n{\n  if((colnr > lp->columns+1) || (colnr < 1)) {\n    report(lp, IMPORTANT, \"get_col_name: Column %d out of range\", colnr);\n    return(NULL);\n  }\n\n  if((lp->presolve_undo->var_to_orig != NULL) && lp->wasPresolved) {\n    if(lp->presolve_undo->var_to_orig[lp->rows + colnr] == 0)\n      colnr = -colnr;\n    else\n      colnr = lp->presolve_undo->var_to_orig[lp->rows + colnr];\n  }\n  return( get_origcol_name(lp, colnr) );\n}\n\nchar * __WINAPI get_origcol_name(lprec *lp, int colnr)\n{\n  MYBOOL newcol;\n  char   *ptr;\n\n  newcol = (MYBOOL) (colnr < 0);\n  colnr = abs(colnr);\n#ifdef Paranoia\n  if(((lp->presolve_undo->var_to_orig == NULL) && newcol) ||\n     (colnr > MAX(lp->columns, lp->presolve_undo->orig_columns))) {\n    report(lp, IMPORTANT, \"get_origcol_name: Column %d out of range\", colnr);\n    return(NULL);\n  }\n#endif\n\n  if(lp->names_used && lp->use_col_names && (lp->col_name[colnr] != NULL) && (lp->col_name[colnr]->name != NULL)) {\n#ifdef Paranoia\n    if(lp->col_name[colnr]->index != colnr)\n      report(lp, SEVERE, \"get_origcol_name: Inconsistent column ordinal %d vs %d\\n\",\n                         colnr, lp->col_name[colnr]->index);\n#endif\n    ptr = lp->col_name[colnr]->name;\n  }\n  else {\n    if(lp->rowcol_name == NULL)\n      if (!allocCHAR(lp, &lp->rowcol_name, 20, FALSE))\n        return(NULL);\n    ptr = lp->rowcol_name;\n    if(newcol)\n      sprintf(ptr, COLNAMEMASK2, colnr);\n    else\n      sprintf(ptr, COLNAMEMASK, colnr);\n  }\n  return(ptr);\n}\n\nSTATIC int MIP_count(lprec *lp)\n{\n  return( lp->int_vars+lp->sc_vars+SOS_count(lp) );\n}\nSTATIC int bin_count(lprec *lp, MYBOOL working)\n{\n  int i, n = 0;\n  if(working) {\n    for(i = lp->rows+1; i <= lp->sum; i++)\n      if(fabs(unscaled_value(lp, lp->upbo[i], i) - 1) < lp->epsvalue)\n        n++;\n  }\n  else {\n    for(i = 1; i <= lp->columns; i++)\n      if((fabs(get_upbo(lp, i) - 1) < lp->epsvalue) &&\n         (fabs(get_lowbo(lp, i) - 0) < lp->epsvalue))\n        n++;\n  }\n  return( n );\n}\nSTATIC int SOS_count(lprec *lp)\n{\n  if(lp->SOS == NULL)\n    return( 0 );\n  else\n    return( lp->SOS->sos_count );\n}\nSTATIC int GUB_count(lprec *lp)\n{\n  if(lp->GUB == NULL)\n    return( 0 );\n  else\n    return( lp->GUB->sos_count );\n}\n\nSTATIC REAL compute_violation(lprec *lp, int row_nr)\n/* Returns the bound violation of a given basic variable; the return\n   value is negative if it is below is lower bound, it is positive\n   if it is greater than the upper bound, and zero otherwise. */\n{\n  REAL value, test;\n\n  value  = lp->rhs[row_nr];\n  row_nr = lp->var_basic[row_nr];\n  test = value - my_lowbound(lp->lowbo[row_nr]);\n  my_roundzero(test, lp->epsprimal);\n  if(test > 0) {\n    test = value - lp->upbo[row_nr];\n    my_roundzero(test, lp->epsprimal);\n    if(test < 0)\n      test = 0;\n  }\n  return( test );\n}\n\nSTATIC REAL feasibilityOffset(lprec *lp, MYBOOL isdual)\n{\n  int    i, j;\n  REAL   f, Extra;\n\n  Extra = 0;\n  if(isdual) {\n   /* This section computes a OF offset to ensure that the dual phase 1 is\n      feasible.  It is used to compute a primal feasible base that can be\n      passed to the primal simplex in phase 2. */\n#if 0\n\n   /* This is the legacy (v3.2-) P1extraVal logic that sets Extra to be the\n      smallest negative reduced cost. Note that the reduced costs are the\n      values of the dual slacks, which are [0..Inf> for feasibility.\n      If we have negative reduced costs for bounded non-basic variables, we\n      can simply switch the bound to obtain feasibility and possibly avoid\n      having to set Extra. */\n    if(!isDualFeasible(lp, lp->epsprimal, NULL, NULL, &f)\n      Extra = f;\n\n#else\n  /* Find the most negative of the objective coefficients. We will subtract this\n     value from every element of the objective row, making it non-negative and\n     the problem therefore dual feasible. */\n    for(i = 1; i <= lp->columns; i++) {\n      f = lp->orig_obj[i];\n      if(f < Extra)\n        Extra = f;\n    }\n#endif\n  }\n\n  else {\n  /* Set Extra to be the index of the most negative of the net RHS coefficients;\n     this approach can be used in the primal phase 1 followed by the dual phase 2\n     and when there are no ranged constraints.  When there are ranged constraints,\n     additional artificial variables must be introduced. */\n    Extra = 0;\n    j = 0;\n    Extra = lp->infinite;\n    for(i = 1; i <= lp->rows; i++) {\n      f = lp->rhs[i];\n      if(f < Extra) {\n        Extra = f;\n        j = i;\n      }\n    }\n    Extra = j;\n  }\n\n  return(Extra);\n\n}\n\nSTATIC REAL compute_dualslacks(lprec *lp, int target, REAL **dvalues, int **nzdvalues, MYBOOL dosum)\n/* Note that this function is similar to the compute_reducedcosts function in lp_price.c */\n{\n  int    i, varnr,\n         *coltarget, **nzduals, *nzvtemp = NULL;\n  REAL   d, g = 0, **duals, *vtemp = NULL;\n  MYBOOL localREAL = (MYBOOL) (dvalues == NULL),\n         localINT  = (MYBOOL) (nzdvalues == NULL);\n\n  if(is_action(lp->spx_action, ACTION_REBASE) ||\n     is_action(lp->spx_action, ACTION_REINVERT) || !lp->basis_valid)\n    return( g );\n\n  /* Initialize */\n  if(!localREAL) {\n    duals = dvalues;\n    nzduals = nzdvalues;\n  }\n  else {\n    duals = &vtemp;\n    nzduals = &nzvtemp;\n  }\n  if(localINT || (*nzduals == NULL))\n    allocINT(lp, nzduals, lp->columns + 1, AUTOMATIC);\n  if(localREAL || (*duals == NULL))\n    allocREAL(lp, duals, lp->sum + 1, AUTOMATIC);\n  if(target == 0)\n    target = SCAN_ALLVARS+ USE_NONBASICVARS;\n\n  /* Define variable target list and compute the reduced costs */\n  coltarget = (int *) mempool_obtainVector(lp->workarrays, lp->columns+1, sizeof(*coltarget));\n  if(!get_colIndexA(lp, target, coltarget, FALSE)) {\n    mempool_releaseVector(lp->workarrays, (char *) coltarget, FALSE);\n    return(FALSE);\n  }\n  bsolve(lp, 0, *duals, NULL, lp->epsmachine*DOUBLEROUND, 1.0);\n  prod_xA(lp, coltarget, *duals, NULL, lp->epsmachine, 1.0,\n                         *duals, *nzduals, MAT_ROUNDDEFAULT | MAT_ROUNDRC);\n  mempool_releaseVector(lp->workarrays, (char *) coltarget, FALSE);\n\n  /* Compute sum or maximum infeasibility as specified */\n  for(i = 1; i <= (*nzduals)[0]; i++) {\n    varnr = (*nzduals)[i];\n    d = my_chsign(!lp->is_lower[varnr], (*duals)[varnr]);\n    if(d < 0) {\n      if(dosum)\n        g += -d;         /* Compute sum as a positive number */\n      else {\n        SETMIN(g, d);    /* Compute gap as a negative number */\n      }\n    }\n  }\n\n  /* Clean up */\n  if(localREAL)\n    FREE(*duals);\n  if(localINT)\n    FREE(*nzduals);\n\n  return( g );\n}\n\nSTATIC REAL compute_feasibilitygap(lprec *lp, MYBOOL isdual, MYBOOL dosum)\n{\n  REAL f = 0;\n\n  /* This computes the primal feasibility gap (for use with the dual simplex phase 1) */\n  if(isdual) {\n    int  i;\n    REAL g;\n\n    for(i = 1; i <= lp->rows; i++) {\n      if(lp->rhs[i] < 0)\n        g = lp->rhs[i];\n      else if(lp->rhs[i] > lp->upbo[lp->var_basic[i]])\n        g = lp->rhs[i] - lp->upbo[lp->var_basic[i]];\n      else\n        g = 0;\n      if(dosum)\n        f += g;\n      else {\n        SETMAX(f, g);\n      }\n    }\n  }\n  /* This computes the dual feasibility gap (for use with the primal simplex phase 1) */\n  else\n    f = compute_dualslacks(lp, SCAN_USERVARS+USE_ALLVARS, NULL, NULL, dosum);\n\n  return( f );\n}\n\n/* Find the smallest fractional value in a given row of the OF/constraint matrix */\nSTATIC int row_decimals(lprec *lp, int rownr, MYBOOL intsonly, REAL *intscalar)\n{\n  int basi, i, j, ncols = lp->columns;\n  REAL f, /* g, */ epsvalue = lp->epsprimal;\n\n  basi = 0;\n  for(j = 1; j <= ncols; j++) {\n    if(intsonly && !is_int(lp, j)) {\n      if(intsonly == TRUE)\n        break;\n      else\n        continue;\n    }\n    f = fabs(get_mat(lp, rownr, j));\n    /* f = fmod(f, 1); */\n    f -= floor (f + epsvalue);\n/*\n    if(f <= epsvalue)\n      continue;\n    g = f;\n*/\n    for(i = 0; (i <= MAX_FRACSCALE) && (/* g */ f > epsvalue); i++) {\n      f *= 10;\n      /* g = fmod(f, 1); */\n      f -= floor (f + epsvalue);\n    }\n    if(i > MAX_FRACSCALE)\n      /* i = MAX_FRACSCALE */ break;\n    SETMAX(basi, i);\n  }\n  if(j > ncols)\n    *intscalar = pow(10.0, basi);\n  else {\n    basi = -1;\n    *intscalar = 1;\n  }\n  return( basi );\n}\n\nSTATIC int row_intstats(lprec *lp, int rownr, int pivcolnr, int *maxndec,\n                        int *plucount, int *intcount, int *intval, REAL *valGCD, REAL *pivcolval)\n{\n  int    jb, je, jj, nn = 0, multA, multB, intGCD = 0;\n  REAL   rowval, inthold, intfrac;\n  MATrec *mat = lp->matA;\n\n  /* Do we have a valid matrix? */\n  if(mat_validate(mat)) {\n\n    /* Get smallest fractional row value */\n    *maxndec = row_decimals(lp, rownr, AUTOMATIC, &intfrac);\n\n    /* Get OF row starting and ending positions, as well as the first column index */\n    if(rownr == 0) {\n      jb = 1;\n      je = lp->columns+1;\n    }\n    else {\n      jb = mat->row_end[rownr-1];\n      je = mat->row_end[rownr];\n    }\n    nn = je - jb;\n    *pivcolval = 1.0;\n    *plucount = 0;\n    *intcount = 0;\n    *intval   = 0;\n    for(; jb < je; jb++) {\n\n      if(rownr == 0) {\n        if(lp->orig_obj[jb] == 0) {\n          nn--;\n          continue;\n        }\n        jj = jb;\n      }\n      else\n        jj = ROW_MAT_COLNR(jb);\n\n      /* Pick up the value of the pivot column and continue */\n      if(jj == pivcolnr) {\n        if(rownr == 0)\n          *pivcolval = unscaled_mat(lp, lp->orig_obj[jb], 0, jb);\n        else\n          *pivcolval = get_mat_byindex(lp, jb, TRUE, FALSE);\n        continue;\n      }\n      if(!is_int(lp, jj))\n        continue;\n\n      /* Update the count of integer columns */\n      (*intcount)++;\n\n      /* Update the count of positive parameter values */\n      if(rownr == 0)\n        rowval = unscaled_mat(lp, lp->orig_obj[jb], 0, jb);\n      else\n        rowval = get_mat_byindex(lp, jb, TRUE, FALSE);\n      if(rowval > 0)\n        (*plucount)++;\n\n      /* Check if the parameter value is integer and update the row's GCD */\n      rowval = fabs(rowval) * intfrac;\n      rowval += rowval*lp->epsmachine;\n      rowval = modf(rowval, &inthold);\n      if(rowval < lp->epsprimal) {\n        (*intval)++;\n        if(*intval == 1)\n          intGCD = (int) inthold;\n        else\n          intGCD = gcd(intGCD, (LLONG) inthold, &multA, &multB);\n      }\n    }\n    *valGCD = intGCD;\n    *valGCD /= intfrac;\n  }\n\n  return(nn);\n}\n\n#if 0\nREAL MIP_stepOF(lprec *lp)\n/* This function tries to find a non-zero minimum improvement\n   if the OF contains all integer variables (logic only applies if we are\n   looking for a single solution, not possibly several equal-valued ones).\n*/\n{\n  MYBOOL OFgcd;\n  int    colnr, rownr, n, ib, ie, maxndec,\n         pluscount, intcount, intval;\n  REAL   value, valOF, divOF, valGCD;\n  MATrec *mat = lp->matA;\n\n  value = 0;\n  if((lp->int_vars > 0) && (lp->solutionlimit == 1) && mat_validate(mat)) {\n\n    /* Get statistics for integer OF variables and compute base stepsize */\n    n = row_intstats(lp, 0, -1, &maxndec, &pluscount, &intcount, &intval, &valGCD, &divOF);\n    if((n == 0) || (maxndec < 0))\n      return( value );\n    OFgcd = (MYBOOL) (intval > 0);\n    if(OFgcd)\n      value = valGCD;\n\n    /* Check non-ints in the OF to see if we can get more info */\n    if(n - intcount > 0) {\n      int nrv = 0;\n\n      /* See if we have equality constraints */\n      ie = lp->rows;\n      for(ib = 1; ib <= ie; ib++) {\n        if(is_constr_type(lp, ib, EQ))\n          break;\n      }\n\n      /* If so, there may be a chance to find an improved stepsize */\n      if(ib < ie)\n      for(colnr = 1; colnr <= lp->columns; colnr++) {\n\n        /* Go directly to the next variable if this is an integer or\n          there is no row candidate to explore for hidden bounds for\n          real-valued variables (limit scan to one row!) */\n        if(is_int(lp, colnr))\n          continue;\n        nrv++;\n        /* Scan equality constraints */\n        ib = mat->col_end[colnr-1];\n        ie = mat->col_end[colnr];\n        while(ib < ie) {\n          if(is_constr_type(lp, (rownr = COL_MAT_ROWNR(ib)), EQ)) {\n\n            /* Get \"child\" row statistics, but break out if we don't\n              find enough information, i.e. no integers with coefficients of proper type */\n            n = row_intstats(lp, rownr, colnr, &maxndec, &pluscount, &intcount, &intval, &valGCD, &divOF);\n            if((intval < n - 1) || (maxndec < 0)) {\n              value = 0;\n              break;\n            }\n\n            /* We can update */\n            valOF = unscaled_mat(lp, lp->orig_obj[colnr], 0, colnr);\n            valOF = fabs( valOF * (valGCD / divOF) );\n            if(OFgcd) {\n              SETMIN(value, valOF);\n            }\n            else {\n              OFgcd = TRUE;\n              value = valOF;\n            }\n          }\n          ib++;\n        }\n\n        /* No point in continuing scan if we failed in current column */\n        if(value == 0)\n          break;\n      }\n\n      /* Check if we found information for any real-valued variable;\n         if not, then we must set the iprovement delta to 0 */\n      if(nrv == 0)\n        value = 0;\n    }\n  }\n  return( value );\n}\n#else\n\nREAL MIP_stepOF(lprec *lp)\n/* This function tries to find a non-zero minimum improvement\n   if the OF contains all integer variables (logic only applies if we are\n   looking for a single solution, not possibly several equal-valued ones). */\n{\n  MYBOOL  OFgcd;\n  int     colnr, rownr, n, ib, ie,\n          pluscount, intcount;\n  int     intval, maxndec;\n  REAL    value = 0, valOF, divOF, valGCD;\n  MATrec  *mat = lp->matA;\n\n  if((lp->int_vars > 0) && (lp->solutionlimit == 1) && mat_validate(mat)) {\n\n    /* Get statistics for integer OF variables and compute base stepsize */\n    n = row_intstats(lp, 0, 0, &maxndec, &pluscount, &intcount, &intval, &valGCD, &divOF);\n    if((n == 0) || (maxndec < 0))\n      return( value );\n    OFgcd = (MYBOOL) (intval > 0);\n    if(OFgcd)\n      value = valGCD;\n\n    /* Check non-ints in the OF to see if we can get more info */\n    if(n - intcount > 0) {\n      int nrv = n - intcount; /* Number of real variables in the objective */\n      int niv = 0;            /* Number of real variables identified as integer */\n      int nrows = lp->rows;\n\n      /* See if we have equality constraints */\n      for(ib = 1; ib <= nrows; ib++) {\n        if(is_constr_type(lp, ib, EQ))\n          break;\n      }\n\n      /* If so, there may be a chance to find an improved stepsize */\n      if(ib < nrows)\n      for(colnr = 1; colnr <= lp->columns; colnr++) {\n\n        /* Go directly to the next variable if this is an integer or\n          there is no row candidate to explore for hidden bounds for\n          real-valued variables (limit scan to one row/no recursion) */\n        if((lp->orig_obj[colnr] == 0) || is_int(lp, colnr))\n          continue;\n\n        /* Scan equality constraints */\n        ib = mat->col_end[colnr-1];\n        ie = mat->col_end[colnr];\n        while(ib < ie) {\n          if(is_constr_type(lp, (rownr = COL_MAT_ROWNR(ib)), EQ)) {\n\n            /* Get \"child\" row statistics, but break out if we don't\n              find enough information, i.e. no integers with coefficients of proper type */\n            n = row_intstats(lp, rownr, colnr, &maxndec, &pluscount, &intcount, &intval, &valGCD, &divOF);\n            if((intval < n - 1) || (maxndec < 0)) {\n              value = 0;\n              break;\n            }\n            niv++;\n\n            /* We can update */\n            valOF = unscaled_mat(lp, lp->orig_obj[colnr], 0, colnr);\n            valOF = fabs( valOF * (valGCD / divOF) );\n            if(OFgcd) {\n              SETMIN(value, valOF);\n            }\n            else {\n              OFgcd = TRUE;\n              value = valOF;\n            }\n          }\n          ib++;\n        }\n\n        /* No point in continuing scan if we failed in current column */\n        if(value == 0)\n          break;\n      }\n\n      /* Check if we found information for any real-valued variable;\n         if not, then we must set the improvement delta to 0 */\n      if(nrv > niv)\n        value = 0;\n    }\n  }\n  return( value );\n}\n\n#endif\n\nSTATIC MYBOOL isPrimalSimplex(lprec *lp)\n{\n  return((MYBOOL) (((lp->simplex_mode & SIMPLEX_Phase1_PRIMAL) != 0) ||\n                   ((lp->simplex_mode & SIMPLEX_Phase2_PRIMAL) != 0)));\n}\n\nSTATIC MYBOOL isPhase1(lprec *lp)\n{\n  return((MYBOOL) (((lp->simplex_mode & SIMPLEX_Phase1_PRIMAL) != 0) ||\n                   ((lp->simplex_mode & SIMPLEX_Phase1_DUAL) != 0)));\n}\n\nSTATIC MYBOOL isP1extra(lprec *lp)\n{\n  return((MYBOOL) ((lp->P1extraDim > 0) || (lp->P1extraVal != 0)));\n}\n\nSTATIC MYBOOL feasiblePhase1(lprec *lp, REAL epsvalue)\n{\n  REAL   gap;\n  MYBOOL test;\n\n  gap = fabs(lp->rhs[0] - lp->orig_rhs[0]);\n  test = (MYBOOL) (gap < epsvalue);\n  return( test) ;\n}\n\nSTATIC MYBOOL isDegenerateBasis(lprec *lp, int basisvar)\n{\n  int varindex;\n\n  varindex = lp->var_basic[basisvar];\n  if((fabs(lp->rhs[basisvar]) < lp->epsprimal) ||\n     (fabs(lp->upbo[varindex]-lp->rhs[basisvar]) < lp->epsprimal))\n    return( TRUE );\n  else\n    return( FALSE );\n}\n\nSTATIC int findBasicFixedvar(lprec *lp, int afternr, MYBOOL slacksonly)\n{\n  int varnr, delta = 1;\n\n  if(afternr < 0) {\n    delta = -1;\n    afternr = -afternr;\n  }\n  afternr += delta;\n  if((afternr < 1) || (afternr > lp->rows))\n    return( 0 );\n\n  for(; (afternr > 0) && (afternr <= lp->rows); afternr += delta) {\n    varnr = lp->var_basic[afternr];\n    if(((varnr <= lp->rows) && is_constr_type(lp, varnr, EQ)) ||\n       (!slacksonly && (varnr > lp->rows) && is_fixedvar(lp, varnr)))\n      break;\n  }\n\n  if(afternr > lp->rows)\n    afternr = 0;\n\n  return( afternr );\n}\n\nSTATIC MYBOOL isBasisVarFeasible(lprec *lp, REAL tol, int basis_row)\n{\n  int    col;\n  REAL   x;\n  MYBOOL Ok = TRUE;\n  MYBOOL doSC = FALSE;\n\n  col = lp->var_basic[basis_row];\n  x = lp->rhs[basis_row];         /* The current solution of basic variables stored here! */\n  if((x < -tol) || (x > lp->upbo[col]+tol))\n    Ok = FALSE;\n  else if(doSC && (col > lp->rows) && (fabs(lp->sc_lobound[col - lp->rows]) > 0)) {\n    if((x > tol) && (x < fabs(lp->sc_lobound[col - lp->rows])-tol))\n      Ok = FALSE;\n  }\n  return( Ok );\n}\nSTATIC MYBOOL isPrimalFeasible(lprec *lp, REAL tol, int infeasibles[], REAL *feasibilitygap)\n{\n  int    i;\n  MYBOOL feasible = TRUE;\n\n  /* This is a short-hand call to rowdual() to check for primal infeasibility */\n\n#if 0\n  /* Traditional indexing style */\n  for(i = 1; i <= lp->rows; i++) {\n    feasible = isBasisVarFeasible(lp, tol, i);\n#else\n  /* Fast array pointer style */\n  LREAL *rhsptr;\n  int  *idxptr;\n\n  if(infeasibles != NULL)\n    infeasibles[0] = 0;\n  for(i = 1, rhsptr = lp->rhs+1, idxptr = lp->var_basic+1;\n      (i <= lp->rows); i++, rhsptr++, idxptr++) {\n    feasible = TRUE;\n/*    if(((*rhsptr) < lp->lowbo[*idxptr]-tol) || ((*rhsptr) > lp->upbo[*idxptr]+tol)) */\n    if(((*rhsptr) < -tol) || ((*rhsptr) > lp->upbo[*idxptr]+tol))\n      feasible = FALSE;\n#endif\n    if(!feasible) {\n      if(infeasibles == NULL)\n        break;\n      infeasibles[0]++;\n      infeasibles[infeasibles[0]] = i;\n    }\n  }\n\n  /* Compute feasibility gap (could actually do this calculation above) */\n  if(feasibilitygap != NULL) {\n    if(feasible)\n      *feasibilitygap = 0.0;\n    else\n      *feasibilitygap = feasibilityOffset(lp, FALSE);\n  }\n\n  return(feasible);\n}\n\nSTATIC MYBOOL isDualFeasible(lprec *lp, REAL tol, int *boundflipcount, int infeasibles[], REAL *feasibilitygap)\n{\n  int    i, varnr,\n         n = 0,  /* Number of infeasible duals corrected with bound-swaps */\n         m = 0,\n         target = SCAN_ALLVARS+USE_NONBASICVARS;\n  REAL   f = 0;\n  MYBOOL feasible, islower;\n\n\n  /* The reduced costs are the values of the dual slacks, which\n     are [0..Inf> for feasibility.  If we have negative reduced costs\n     for bounded non-basic variables, we can simply switch the bound\n     of bounded variables to obtain dual feasibility and possibly avoid\n     having to use dual simplex phase 1. */\n  if((infeasibles != NULL) || (boundflipcount != NULL)) {\n    int  *nzdcol = NULL;\n    REAL d, *dcol = NULL;\n\n    f = compute_dualslacks(lp, target, &dcol, &nzdcol, FALSE);\n    if(nzdcol != NULL)\n    for(i = 1; i <= nzdcol[0]; i++) {\n      varnr = nzdcol[i];\n      islower = lp->is_lower[varnr];\n      d = my_chsign(!islower, dcol[varnr]);\n\n      /* Don't bother with uninteresting non-basic variables */\n      if((d > -tol) ||                /* Positive reduced costs with a tolerance */\n         my_unbounded(lp, varnr) ||   /* Free variables cannot change bound */\n         is_fixedvar(lp, varnr))      /* Equality slack or a fixed variable (\"type 3\") */\n        continue;\n\n      /* Check if we have non-flippable bounds, i.e. an unbounded variable\n         (types 2+4), or bounded variables (type 3), and if the counter is NULL. */\n      if( (boundflipcount == NULL) ||\n          ((lp->bb_level <= 1) && (my_rangebo(lp, varnr) > fabs(lp->negrange))) ||\n          (islower && my_infinite(lp, lp->upbo[varnr])) ||\n          (!islower && my_infinite(lp, my_lowbo(lp, varnr))) ) {\n        m++;\n        if(infeasibles != NULL)\n          infeasibles[m] = varnr;\n      }\n      /* Only do bound flips if the user-provided counter is non-NULL */\n      else {\n        lp->is_lower[varnr] = !islower;\n        n++;\n      }\n    }\n    if(infeasibles != NULL)\n      infeasibles[0] = m;\n    FREE(dcol);\n    FREE(nzdcol);\n    if(n > 0) {\n      set_action(&lp->spx_action, ACTION_RECOMPUTE);\n      if(m == 0)\n        f = 0;\n    }\n  }\n  else\n    f = compute_dualslacks(lp, target, NULL, NULL, FALSE);\n/*    f = feasibilityOffset(lp, TRUE); */  /* Safe legacy mode */\n\n  /* Do an extra scan to see if there are bounded variables in the OF not present in any constraint;\n     Most typically, presolve fixes such cases, so this is rarely encountered. */\n\n  varnr = lp->rows + 1;\n  for(i = 1; i <= lp->columns; i++, varnr++) {\n    if (mat_collength(lp->matA, i) == 0) {\n      islower = lp->is_lower[varnr];\n      if((my_chsign(islower, lp->orig_obj[i]) > 0) && !SOS_is_member(lp->SOS, 0, i)) {\n        lp->is_lower[varnr] = !islower;\n        if((islower && my_infinite(lp,  lp->upbo[varnr] /* lp->orig_upbo[varnr] */)) ||\n           (!islower && my_infinite(lp,  my_lowbo(lp, varnr) /* lp->orig_lowbo[varnr] */))) {\n          lp->spx_status = UNBOUNDED;\n          break;\n        }\n        /* lp->is_lower[varnr] = !islower; */\n        n++;\n      }\n    }\n  }\n\n  /* Return status */\n\n  if(boundflipcount != NULL)\n    *boundflipcount = n;\n  if(feasibilitygap != NULL) {\n    my_roundzero(f, tol);\n    *feasibilitygap = f;\n  }\n  feasible = (MYBOOL) ((f == 0) && (m == 0));\n\n  return(feasible);\n}\n\nvoid __WINAPI default_basis(lprec *lp)\n{\n  int i;\n\n  /* Set the slack variables to be basic; note that the is_basic[] array\n     is a helper array filled in presolve() to match var_basic[]. */\n  for(i = 1; i <= lp->rows; i++) {\n    lp->var_basic[i] = i;\n    lp->is_basic[i] = TRUE;\n    lp->is_lower[i] = TRUE;\n  }\n  lp->var_basic[0] = TRUE; /* Set to signal that this is the default basis */\n\n  /* Set user variables at their lower bound, including the\n     dummy slack for the objective \"constraint\" */\n  for(; i <= lp->sum; i++) {\n    lp->is_basic[i] = FALSE;\n    lp->is_lower[i] = TRUE;\n  }\n  lp->is_lower[0] = TRUE;\n\n  set_action(&lp->spx_action, ACTION_REBASE | ACTION_REINVERT | ACTION_RECOMPUTE);\n  lp->basis_valid = TRUE;  /* Do not re-initialize basis on entering Solve */\n}\n\nint __WINAPI get_basiscrash(lprec *lp)\n{\n  return(lp->crashmode);\n}\n\nvoid __WINAPI set_basiscrash(lprec *lp, int mode)\n{\n  lp->crashmode = mode;\n}\n\nMYBOOL __WINAPI set_basis(lprec *lp, int *bascolumn, MYBOOL nonbasic)   /* Added by KE */\n{\n  int    i,s,k,n;\n\n  /* Make sure we are consistent */\n  if(lp->wasPresolved && ((lp->rows != lp->presolve_undo->orig_rows) ||\n                          (lp->columns != lp->presolve_undo->orig_columns)))\n    return( FALSE );\n\n /* Initialize (lp->is_basic is set in preprocess); Note that as of v5 and before\n    it is an lp_solve convention that basic variables are at their lower bounds!\n    This routine provides for the a possible future case that basic variables\n    can be upper-bounded. */\n  lp->is_lower[0] = TRUE;\n  for(i = 1; i <= lp->sum; i++) {\n    lp->is_lower[i] = TRUE;\n    lp->is_basic[i] = FALSE;\n  }\n  for(i = 1; i <= lp->rows; i++)\n    lp->var_basic[i] = FALSE;\n\n /* Set basic and optionally non-basic variables;\n    negative index means at lower bound, positive at upper bound */\n  if(nonbasic)\n    n = lp->sum;\n  else\n    n = lp->rows;\n  for(i = 1; i <= n; i++) {\n    s = bascolumn[i];\n    k = abs(s);\n    if(k <= 0 || k > lp->sum)\n      return( FALSE );\n    if(i <= lp->rows) {\n      lp->var_basic[i] = k;\n      lp->is_basic[k] = TRUE;\n    }\n    else     /* Remove this test if basic variables can be upper-bounded */\n    if(s > 0)\n      lp->is_lower[k] = FALSE;\n  }\n  if(!verify_basis(lp))\n    return( FALSE );\n\n /* Invalidate basis */\n  set_action(&lp->spx_action, ACTION_REBASE | ACTION_REINVERT | ACTION_RECOMPUTE);\n  lp->basis_valid = TRUE;   /* Do not re-initialize basis on entering Solve */\n  lp->var_basic[0] = FALSE; /* Set to signal that this is a non-default basis */\n\n  return( TRUE );\n}\n\nvoid __WINAPI reset_basis(lprec *lp)\n{\n  lp->basis_valid = FALSE;   /* Causes reinversion at next opportunity */\n}\n\nMYBOOL __WINAPI get_basis(lprec *lp, int *bascolumn, MYBOOL nonbasic)\n{\n  int    k, i;\n\n  if(!lp->basis_valid ||\n     (lp->rows != lp->presolve_undo->orig_rows) ||\n     (lp->columns != lp->presolve_undo->orig_columns))\n    return( FALSE );\n\n  *bascolumn = 0;\n\n  /* First save basic variable indexes */\n  for(i = 1; i <= lp->rows; i++) {\n    k = lp->var_basic[i];\n    bascolumn[i] = my_chsign(lp->is_lower[k], k);\n  }\n\n  /* Then optionally save non-basic variable indeces */\n  if(nonbasic) {\n    for(k = 1; (k <= lp->sum) && (i <= lp->sum); k++) {\n      if(lp->is_basic[k])\n        continue;\n      bascolumn[i] = my_chsign(lp->is_lower[k], k);\n      i++;\n    }\n  }\n  return( TRUE );\n}\n\nSTATIC MYBOOL is_BasisReady(lprec *lp)\n{\n  return( (MYBOOL) (lp->var_basic[0] != AUTOMATIC) );\n}\n\nSTATIC MYBOOL is_slackbasis(lprec *lp)\n{\n  int n = 0, err = 0;\n  if(lp->basis_valid) {\n    int i, k;\n    MYBOOL *used = NULL;\n\n    allocMYBOOL(lp, &used, lp->rows+1, TRUE);\n    for(i = 1; i <= lp->rows; i++) {\n      k = lp->var_basic[i];\n      if(k <= lp->rows) {\n        if(used[k])\n          err++;\n        else\n          used[k] = TRUE;\n        n++;\n      }\n    }\n    FREE(used);\n    if(err > 0)\n      report(lp, SEVERE, \"is_slackbasis: %d inconsistencies found in slack basis\\n\", err);\n  }\n  return( (MYBOOL) (n == lp->rows) );\n}\n\nSTATIC MYBOOL verify_basis(lprec *lp)\n{\n  int    i, ii, k = 0;\n  MYBOOL result = FALSE;\n\n  for(i = 1; i <= lp->rows; i++) {\n    ii = lp->var_basic[i];\n    if((ii < 1) || (ii > lp->sum) || !lp->is_basic[ii]) {\n      k = i;\n      ii = 0;\n      goto Done;\n    }\n  }\n\n  ii = lp->rows;\n  for(i = 1; i <= lp->sum; i++) {\n    if(lp->is_basic[i])\n      ii--;\n  }\n  result = (MYBOOL) (ii == 0);\n\nDone:\n#if 0  /* For testing */\n  if(!result)\n    ii = 0;\n#endif\n  return(result);\n}\n\nint __WINAPI set_basisvar(lprec *lp, int basisPos, int enteringCol)\n{\n  int leavingCol;\n\n  leavingCol = lp->var_basic[basisPos];\n\n#ifdef Paranoia\n  if((basisPos < 1) || (basisPos > lp->rows))\n    report(lp, SEVERE, \"set_basisvar: Invalid leaving basis position %d specified at iter %.0f\\n\",\n                       basisPos, (double) get_total_iter(lp));\n  if((leavingCol < 1) || (leavingCol > lp->sum))\n    report(lp, SEVERE, \"set_basisvar: Invalid leaving column %d referenced at iter %.0f\\n\",\n                       leavingCol, (double) get_total_iter(lp));\n  if((enteringCol < 1) || (enteringCol > lp->sum))\n    report(lp, SEVERE, \"set_basisvar: Invalid entering column %d specified at iter %.0f\\n\",\n                       enteringCol, (double) get_total_iter(lp));\n#endif\n\n#ifdef ParanoiaXY\n  if(!lp->is_basic[leavingCol])\n    report(lp, IMPORTANT, \"set_basisvar: Leaving variable %d is not basic at iter %.0f\\n\",\n                           leavingCol, (double) get_total_iter(lp));\n  if(enteringCol > lp->rows && lp->is_basic[enteringCol])\n    report(lp, IMPORTANT, \"set_basisvar: Entering variable %d is already basic at iter %.0f\\n\",\n                           enteringCol, (double) get_total_iter(lp));\n#endif\n\n  lp->var_basic[0]          = FALSE;       /* Set to signal that this is a non-default basis */\n  lp->var_basic[basisPos]   = enteringCol;\n  lp->is_basic[leavingCol]  = FALSE;\n  lp->is_basic[enteringCol] = TRUE;\n  if(lp->bb_basis != NULL)\n    lp->bb_basis->pivots++;\n\n  return(leavingCol);\n}\n\n/* Bounds updating and unloading routines; requires that the\n   current values for upbo and lowbo are in the original base. */\nSTATIC int perturb_bounds(lprec *lp, BBrec *perturbed, MYBOOL doRows, MYBOOL doCols, MYBOOL includeFIXED)\n{\n  int  i, ii, n = 0;\n  REAL new_lb, new_ub, *upbo, *lowbo;\n\n  if(perturbed == NULL)\n    return( n );\n\n /* Map reference bounds to previous state, i.e. cumulate\n    perturbations in case of persistent problems */\n  upbo  = perturbed->upbo;\n  lowbo = perturbed->lowbo;\n\n /* Set appropriate target variable range */\n  i = 1;\n  ii = lp->rows;\n  if(!doRows)\n    i += ii;\n  if(!doCols)\n    ii = lp->sum;\n\n /* Perturb (expand) finite variable bounds randomly */\n  for(; i <= ii; i++) {\n\n    /* Don't perturb regular slack variables */\n    if((i <= lp->rows) && (lowbo[i] == 0) && (upbo[i] >= lp->infinite))\n      continue;\n\n    new_lb = lowbo[i];\n    new_ub = upbo[i];\n\n    /* Don't perturb fixed variables if not specified */\n    if(!includeFIXED && (new_ub == new_lb))\n      continue;\n\n    /* Lower bound for variables (consider implementing RHS here w/contentmode== AUTOMATIC) */\n    if((i > lp->rows) && (new_lb < lp->infinite)) {\n      new_lb = rand_uniform(lp, RANDSCALE) + 1;\n      new_lb *= lp->epsperturb;\n      lowbo[i] -= new_lb;\n      n++;\n    }\n\n    /* Upper bound */\n    if(new_ub < lp->infinite) {\n      new_ub = rand_uniform(lp, RANDSCALE) + 1;\n      new_ub *= lp->epsperturb;\n      upbo[i] += new_ub;\n      n++;\n    }\n  }\n\n /* Make sure we start from scratch */\n  set_action(&lp->spx_action, ACTION_REBASE);\n\n  return( n );\n}\n\nSTATIC MYBOOL impose_bounds(lprec *lp, REAL *upbo, REAL *lowbo)\n/* Explicitly set working bounds to given vectors without pushing or popping */\n{\n  MYBOOL ok;\n\n  ok = (MYBOOL) ((upbo != NULL) || (lowbo != NULL));\n  if(ok) {\n    if((upbo != NULL) && (upbo != lp->upbo))\n      MEMCOPY(lp->upbo,  upbo,  lp->sum + 1);\n    if((lowbo != NULL) && (lowbo != lp->lowbo))\n      MEMCOPY(lp->lowbo, lowbo, lp->sum + 1);\n    if(lp->bb_bounds != NULL)\n      lp->bb_bounds->UBzerobased = FALSE;\n    set_action(&lp->spx_action, ACTION_REBASE);\n  }\n  set_action(&lp->spx_action, ACTION_RECOMPUTE);\n  return( ok );\n}\n\nSTATIC MYBOOL validate_bounds(lprec *lp, REAL *upbo, REAL *lowbo)\n/* Check if all bounds are Explicitly set working bounds to given vectors without pushing or popping */\n{\n  MYBOOL ok;\n  int    i;\n\n  ok = (MYBOOL) ((upbo != NULL) || (lowbo != NULL));\n  if(ok) {\n    for(i = 1; i <= lp->sum; i++)\n      if((lowbo[i] > upbo[i]) || (lowbo[i] < lp->orig_lowbo[i]) || (upbo[i] > lp->orig_upbo[i]))\n        break;\n    ok = (MYBOOL) (i > lp->sum);\n  }\n  return( ok );\n}\n\nSTATIC int unload_BB(lprec *lp)\n{\n  int levelsunloaded = 0;\n\n  if(lp->bb_bounds != NULL)\n    while(pop_BB(lp->bb_bounds))\n      levelsunloaded++;\n  return( levelsunloaded );\n}\n\n\n#define LowerStorageModel 1\n#define BasisStorageModel 1\nSTATIC basisrec *push_basis(lprec *lp, int *basisvar, MYBOOL *isbasic, MYBOOL *islower)\n/* Save the ingoing basis and push it onto the stack */\n{\n  int sum = lp->sum + 1;\n  basisrec *newbasis = NULL;\n\n  newbasis = (basisrec *) calloc(sizeof(*newbasis), 1);\n  if((newbasis != NULL) &&\n#if LowerStorageModel == 0\n    allocMYBOOL(lp, &newbasis->is_lower,  sum,  FALSE) &&\n#else\n    allocMYBOOL(lp, &newbasis->is_lower,  (sum + 8) / 8,  TRUE) &&\n#endif\n#if BasisStorageModel == 0\n    allocMYBOOL(lp, &newbasis->is_basic,  sum,  FALSE) &&\n#endif\n    allocINT(lp,    &newbasis->var_basic, lp->rows + 1, FALSE)) {\n\n    if(islower == NULL)\n      islower = lp->is_lower;\n    if(isbasic == NULL)\n      isbasic = lp->is_basic;\n    if(basisvar == NULL)\n      basisvar = lp->var_basic;\n\n#if LowerStorageModel == 0\n    MEMCOPY(newbasis->is_lower,  islower,  sum);\n#else\n    for(sum = 1; sum <= lp->sum; sum++)\n      if(islower[sum])\n        set_biton(newbasis->is_lower, sum);\n#endif\n#if BasisStorageModel == 0\n    MEMCOPY(newbasis->is_basic,  isbasic,  lp->sum + 1);\n#endif\n    MEMCOPY(newbasis->var_basic, basisvar, lp->rows + 1);\n\n    newbasis->previous = lp->bb_basis;\n    if(lp->bb_basis == NULL)\n      newbasis->level = 0;\n    else\n      newbasis->level = lp->bb_basis->level + 1;\n    newbasis->pivots = 0;\n\n    lp->bb_basis = newbasis;\n  }\n  return( newbasis );\n}\n\nSTATIC MYBOOL compare_basis(lprec *lp)\n/* Compares the last pushed basis with the currently active basis */\n{\n  int i, j;\n  MYBOOL same_basis = TRUE;\n\n  if(lp->bb_basis == NULL)\n    return( FALSE );\n\n  /* Loop over basis variables until a mismatch (order can be different) */\n  i = 1;\n  while(same_basis && (i <= lp->rows)) {\n    j = 1;\n    while(same_basis && (j <= lp->rows)) {\n      same_basis = (MYBOOL) (lp->bb_basis->var_basic[i] != lp->var_basic[j]);\n      j++;\n    }\n    same_basis = !same_basis;\n    i++;\n  }\n  /* Loop over bound status indicators until a mismatch */\n  i = 1;\n  while(same_basis && (i <= lp->sum)) {\n    same_basis = (lp->bb_basis->is_lower[i] && lp->is_lower[i]);\n    i++;\n  }\n\n  return( same_basis );\n}\n\nSTATIC MYBOOL restore_basis(lprec *lp)\n/* Restore values from the previously pushed / saved basis without popping it */\n{\n  MYBOOL ok;\n  int    i;\n\n  ok = (MYBOOL) (lp->bb_basis != NULL);\n  if(ok) {\n    MEMCOPY(lp->var_basic, lp->bb_basis->var_basic, lp->rows + 1);\n#if BasisStorageModel == 0\n    MEMCOPY(lp->is_basic,  lp->bb_basis->is_basic,  lp->sum + 1);\n#else\n    MEMCLEAR(lp->is_basic, lp->sum + 1);\n    for(i = 1; i <= lp->rows; i++)\n      lp->is_basic[lp->var_basic[i]] = TRUE;\n#endif\n#if LowerStorageModel == 0\n    MEMCOPY(lp->is_lower,  lp->bb_basis->is_lower,  lp->sum + 1);\n#else\n    for(i = 1; i <= lp->sum; i++)\n      lp->is_lower[i] = is_biton(lp->bb_basis->is_lower, i);\n#endif\n    set_action(&lp->spx_action, ACTION_REBASE | ACTION_REINVERT);\n  }\n  return( ok );\n}\n\nSTATIC MYBOOL pop_basis(lprec *lp, MYBOOL restore)\n/* Pop / free, and optionally restore the previously \"pushed\" / saved basis */\n{\n  MYBOOL ok;\n  basisrec *oldbasis;\n\n  ok = (MYBOOL) (lp->bb_basis != NULL);\n  if(ok) {\n    oldbasis = lp->bb_basis;\n    if(oldbasis != NULL) {\n      lp->bb_basis = oldbasis->previous;\n      FREE(oldbasis->var_basic);\n#if BasisStorageModel == 0\n      FREE(oldbasis->is_basic);\n#endif\n      FREE(oldbasis->is_lower);\n      FREE(oldbasis);\n    }\n    if(restore && (lp->bb_basis != NULL))\n      restore_basis(lp);\n  }\n  return( ok );\n}\n\nSTATIC int unload_basis(lprec *lp, MYBOOL restorelast)\n{\n  int levelsunloaded = 0;\n\n  if(lp->bb_basis != NULL)\n    while(pop_basis(lp, restorelast))\n      levelsunloaded++;\n  return( levelsunloaded );\n}\n\n\nSTATIC REAL scaled_floor(lprec *lp, int colnr, REAL value, REAL epsscale)\n{\n  value = floor(value);\n  if(value != 0)\n  if(lp->columns_scaled && is_integerscaling(lp)) {\n    value = scaled_value(lp, value, colnr);\n    if(epsscale != 0)\n      value += epsscale*lp->epsmachine;\n/*      value += epsscale*lp->epsprimal; */\n/*    value = restoreINT(value, lp->epsint); */\n  }\n  return(value);\n}\n\nSTATIC REAL scaled_ceil(lprec *lp, int colnr, REAL value, REAL epsscale)\n{\n  value = ceil(value);\n  if(value != 0)\n  if(lp->columns_scaled && is_integerscaling(lp)) {\n    value = scaled_value(lp, value, colnr);\n    if(epsscale != 0)\n      value -= epsscale*lp->epsmachine;\n/*      value -= epsscale*lp->epsprimal; */\n/*    value = restoreINT(value, lp->epsint); */\n  }\n  return(value);\n}\n\n/* Branch and bound variable selection functions */\n\nSTATIC MYBOOL is_sc_violated(lprec *lp, int column)\n{\n  int  varno;\n  REAL tmpreal;\n\n  varno = lp->rows+column;\n  tmpreal = unscaled_value(lp, lp->sc_lobound[column], varno);\n  return( (MYBOOL) ((tmpreal > 0) &&                    /* it is an (inactive) SC variable...    */\n                    (lp->solution[varno] < tmpreal) &&  /* ...and the NZ lower bound is violated */\n                    (lp->solution[varno] > 0)) );       /* ...and the Z lowerbound is violated   */\n}\nSTATIC int find_sc_bbvar(lprec *lp, int *count)\n{\n  int    i, ii, n, bestvar;\n  int    firstsc, lastsc;\n  REAL   hold, holdINT, bestval, OFval, randval, scval;\n  MYBOOL reversemode, greedymode, randomizemode,\n         pseudocostmode, pseudocostsel;\n\n  bestvar = 0;\n  if((lp->sc_vars == 0) || (*count > 0))\n    return(bestvar);\n\n  reversemode    = is_bb_mode(lp, NODE_WEIGHTREVERSEMODE);\n  greedymode     = is_bb_mode(lp, NODE_GREEDYMODE);\n  randomizemode  = is_bb_mode(lp, NODE_RANDOMIZEMODE);\n  pseudocostmode = is_bb_mode(lp, NODE_PSEUDOCOSTMODE);\n  pseudocostsel  = is_bb_rule(lp, NODE_PSEUDOCOSTSELECT) ||\n                   is_bb_rule(lp, NODE_PSEUDONONINTSELECT) ||\n                   is_bb_rule(lp, NODE_PSEUDORATIOSELECT);\n\n  bestvar = 0;\n  bestval = -lp->infinite;\n  hold    = 0;\n  randval = 1;\n  firstsc = 0;\n  lastsc  = lp->columns;\n\n  for(n = 1; n <= lp->columns; n++) {\n    ii = get_var_priority(lp, n);\n    i = lp->rows + ii;\n    if(!lp->bb_varactive[ii] && is_sc_violated(lp, ii) && !SOS_is_marked(lp->SOS, 0, ii)) {\n\n      /* Do tallies */\n      (*count)++;\n      lastsc = i;\n      if(firstsc <= 0)\n        firstsc = i;\n      scval = get_pseudorange(lp->bb_PseudoCost, ii, BB_SC);\n\n      /* Select default pricing/weighting mode */\n      if(pseudocostmode)\n        OFval = get_pseudonodecost(lp->bb_PseudoCost, ii, BB_SC, lp->solution[i]);\n      else\n        OFval = my_chsign(is_maxim(lp), get_mat(lp, 0, ii));\n\n      if(randomizemode)\n        randval = exp(rand_uniform(lp, 1.0));\n\n      /* Find the maximum pseudo-cost of a variable (don't apply pseudocostmode here) */\n      if(pseudocostsel) {\n        if(pseudocostmode)\n          hold = OFval;\n        else\n          hold = get_pseudonodecost(lp->bb_PseudoCost, ii, BB_SC, lp->solution[i]);\n        hold *= randval;\n        if(greedymode) {\n          if(pseudocostmode) /* Override! */\n            OFval = my_chsign(is_maxim(lp), get_mat(lp, 0, ii));\n          hold *= OFval;\n        }\n        hold = my_chsign(reversemode, hold);\n      }\n      else\n      /* Find the variable with the largest sc gap (closest to the sc mean) */\n      if(is_bb_rule(lp, NODE_FRACTIONSELECT)) {\n        hold = modf(lp->solution[i]/scval, &holdINT);\n        holdINT = hold-1;\n        if(fabs(holdINT) > hold)\n          hold = holdINT;\n        if(greedymode)\n          hold *= OFval;\n        hold = my_chsign(reversemode, hold)*scval*randval;\n      }\n      else\n      /* Do first or last violated sc index selection (default) */\n      /* if(is_bb_rule(lp, NODE_FIRSTSELECT)) */\n      {\n        if(reversemode)\n          continue;\n        else {\n          bestvar = i;\n          break;\n        }\n      }\n\n      /* Select better, check for ties, and split by proximity to 0.5*sc_lobound */\n      if(hold > bestval) {\n        if( (bestvar == 0) ||\n            (hold > bestval+lp->epsprimal) ||\n            (fabs(modf(lp->solution[i]/scval, &holdINT) - 0.5) <\n             fabs(modf(lp->solution[bestvar]/\n                       get_pseudorange(lp->bb_PseudoCost, bestvar-lp->rows, BB_SC), &holdINT) - 0.5)) ) {\n          bestval = hold;\n          bestvar = i;\n        }\n      }\n    }\n  }\n\n  if(is_bb_rule(lp, NODE_FIRSTSELECT) && reversemode)\n    bestvar = lastsc;\n\n  return(bestvar);\n}\n\nSTATIC int find_sos_bbvar(lprec *lp, int *count, MYBOOL intsos)\n{\n  int k, i, j, var;\n\n  var = 0;\n  if((lp->SOS == NULL) || (*count > 0))\n    return(var);\n\n  /* Check if the SOS'es happen to already be satisified */\n  i = SOS_is_satisfied(lp->SOS, 0, lp->solution);\n  if((i == SOS_COMPLETE) || (i == SOS_INCOMPLETE))\n    return(-1);\n\n  /* Otherwise identify a SOS variable to enter B&B */\n  for(k = 0; k < lp->sos_vars; k++) {\n    i = lp->sos_priority[k];\n#ifdef Paranoia\n    if((i < 1) || (i > lp->columns))\n      report(lp, SEVERE, \"find_sos_bbvar: Invalid SOS variable map %d at %d\\n\",\n                         i, k);\n#endif\n    j = lp->rows + i;\n    if(!SOS_is_marked(lp->SOS, 0, i) && !SOS_is_full(lp->SOS, 0, i, FALSE)) {\n/*    if(!SOS_is_marked(lp->SOS, 0, i) && !SOS_is_full(lp->SOS, 0, i, TRUE)) { */\n      if(!intsos || is_int(lp, i)) {\n        (*count)++;\n        if(var == 0) {\n          var = j;\n          break;\n        }\n      }\n    }\n  }\n#ifdef Paranoia\n  if((var > 0) && !SOS_is_member(lp->SOS, 0, var-lp->rows))\n     report(lp, SEVERE, \"find_sos_bbvar: Found variable %d, which is not a SOS!\\n\", var);\n#endif\n  return(var);\n}\n\nSTATIC int find_int_bbvar(lprec *lp, int *count, BBrec *BB, MYBOOL *isfeasible)\n{\n  int    i, ii, n, k, bestvar, depthmax, *nonint = NULL;\n  REAL   hold, holdINT, bestval, OFval, randval,\n         *lowbo = BB->lowbo, *upbo = BB->upbo;\n  MYBOOL reversemode, greedymode, depthfirstmode, breadthfirstmode,\n         randomizemode, rcostmode,\n         pseudocostmode, pseudocostsel, pseudostrong, isINT, valINT;\n\n  if((lp->int_vars == 0) || (*count > 0))\n    return( 0 );\n  if(lp->bb_usenode != NULL) {\n    i = lp->bb_usenode(lp, lp->bb_nodehandle, BB_INT);\n    if(i >= 0) {\n      if(i > 0)\n        (*count)++;\n      return( i );\n    }\n  }\n\n  reversemode    = is_bb_mode(lp, NODE_WEIGHTREVERSEMODE);\n  greedymode     = is_bb_mode(lp, NODE_GREEDYMODE);\n  randomizemode  = is_bb_mode(lp, NODE_RANDOMIZEMODE);\n  depthfirstmode = is_bb_mode(lp, NODE_DEPTHFIRSTMODE);\n  breadthfirstmode = is_bb_mode(lp, NODE_BREADTHFIRSTMODE) &&\n                     (MYBOOL) (lp->bb_level <= lp->int_vars);\n  rcostmode      = (MYBOOL) /* FALSE */ (BB->lp->solutioncount > 0) && is_bb_mode(lp, NODE_RCOSTFIXING) ; /* 5/2/08 peno disabled NODE_RCOSTFIXING because it results in non-optimal solutions with some models */ /* 15/2/8 peno enabled NODE_RCOSTFIXING again because a fix is found. See lp_simplex.c NODE__RCOSTFIXING fix */\n  pseudocostmode = is_bb_mode(lp, NODE_PSEUDOCOSTMODE);\n  pseudocostsel  = is_bb_rule(lp, NODE_PSEUDOCOSTSELECT) ||\n                   is_bb_rule(lp, NODE_PSEUDONONINTSELECT) ||\n                   is_bb_rule(lp, NODE_PSEUDORATIOSELECT);\n  pseudostrong   = FALSE &&\n                   pseudocostsel && !rcostmode && is_bb_mode(lp, NODE_STRONGINIT);\n\n  /* Fill list of non-ints */\n  allocINT(lp, &nonint, lp->columns + 1, FALSE);\n  n = 0;\n  depthmax = -1;\n  if(isfeasible != NULL)\n    *isfeasible = TRUE;\n  BB->lastrcf = 0;\n  for(k = 1; (k <= lp->columns); k++) {\n    ii = get_var_priority(lp, k);\n    isINT = is_int(lp,ii);\n    i  = lp->rows + ii;\n\n    /* Tally reduced cost fixing opportunities for ranged non-basic nonINTs */\n    if(!isINT) {\n#ifdef UseMilpExpandedRCF\n      if(rcostmode) {\n        bestvar = rcfbound_BB(BB, i, isINT, NULL, isfeasible);\n        if(bestvar != FR)\n          BB->lastrcf++;\n      }\n#endif\n    }\n    else {\n\n      valINT = solution_is_int(lp, i, FALSE);\n\n      /* Skip already fixed variables */\n      if(lowbo[i] == upbo[i]) {\n\n        /* Check for validity */\n#ifdef Paranoia\n        if(!valINT) {\n          report(lp, IMPORTANT,\n                 \"find_int_bbvar: INT var %d was fixed at %d, but computed as %g at node %.0f\\n\",\n                  ii, (int) lowbo[i], lp->solution[i], (double) lp->bb_totalnodes);\n          lp->bb_break = TRUE;\n          lp->spx_status = UNKNOWNERROR;\n          bestvar = 0;\n          goto Done;\n        }\n#endif\n      }\n\n      /* The variable has not yet been fixed */\n      else {\n\n        /* Tally reduced cost fixing opportunities (also when the\n           variables are integer-valued at the current relaxation) */\n        if(rcostmode) {\n          bestvar = rcfbound_BB(BB, i, isINT, NULL, isfeasible);\n          if(bestvar != FR)\n            BB->lastrcf++;\n        }\n        else\n          bestvar = FR;\n\n        /* Only qualify variable as branching node if it is non-integer and\n           it will not be subsequently fixed via reduced cost fixing logic */\n        if(!valINT && (bestvar >= FR)) {\n\n          n++;\n          nonint[n] = ii;\n          SETMAX(depthmax, lp->bb_varactive[ii]);\n        }\n      }\n\n    }\n  }\n\n#ifdef UseMilpSlacksRCF\n  /* Optionally also tally slacks */\n  if(rcostmode) {\n    for(i = 1; (i <= lp->rows) && (BB->lastrcf == 0); i++) {\n      /* Skip already fixed slacks (equalities) */\n      if(lowbo[i] < upbo[i]) {\n        bestvar = rcfbound_BB(BB, i, FALSE, NULL, isfeasible);\n        if(bestvar != FR)\n          BB->lastrcf++;\n      }\n    }\n  }\n#endif\n  nonint[0] = n;\n  *count    = n;\n  bestvar   = 0;\n  if(n == 0)     /* No non-integers found */\n    goto Done;\n\n  bestval  = -lp->infinite;\n  hold     = 0;\n  randval  = 1;\n\n  /* Sort non-ints by depth in case we have breadthfirst or depthfirst modes */\n  if((lp->bb_level > 1) && (depthmax > 0) && (depthfirstmode || breadthfirstmode)) {\n    int *depths = NULL;\n\n    /* Fill attribute array and make sure ordinal order breaks ties during sort */\n    allocINT(lp, &depths, n + 1, FALSE);\n    for(i = 1; i <= n; i++)\n      depths[i] = (depthfirstmode ? n+1-i : i) + (n+1)*lp->bb_varactive[nonint[i]];\n    hpsortex(depths, n, 1, sizeof(*nonint), depthfirstmode, compareINT, nonint);\n    FREE(depths);\n  }\n\n  /* Do simple firstselect handling */\n  if(is_bb_rule(lp, NODE_FIRSTSELECT)) {\n    if(reversemode)\n      bestvar = lp->rows + nonint[nonint[0]];\n    else\n      bestvar = lp->rows + nonint[1];\n  }\n\n  else for(n = 1; n <= nonint[0]; n++) {\n    ii = nonint[n];\n    i = lp->rows + ii;\n\n    /* Do the naive detection */\n    if(n == 1)\n      bestvar = i;\n\n    /* Should we do a \"strong\" pseudo-cost initialization or an incremental update? */\n    if(pseudostrong &&\n       (MAX(lp->bb_PseudoCost->LOcost[ii].rownr,\n            lp->bb_PseudoCost->UPcost[ii].rownr) < lp->bb_PseudoCost->updatelimit) &&\n       (MAX(lp->bb_PseudoCost->LOcost[ii].colnr,\n            lp->bb_PseudoCost->UPcost[ii].colnr) < 5*lp->bb_PseudoCost->updatelimit)) {\n      strongbranch_BB(lp, BB, ii, BB_INT, nonint[0]);\n    }\n\n    /* Select default pricing/weighting mode */\n    if(pseudocostmode)\n      OFval = get_pseudonodecost(lp->bb_PseudoCost, ii, BB_INT, lp->solution[i]);\n    else\n      OFval = my_chsign(is_maxim(lp), get_mat(lp, 0, ii));\n\n    if(randomizemode)\n      randval = exp(rand_uniform(lp, 1.0));\n\n    /* Find the maximum pseudo-cost of a variable (don't apply pseudocostmode here) */\n    if(pseudocostsel) {\n      if(pseudocostmode)\n        hold = OFval;\n      else\n        hold = get_pseudonodecost(lp->bb_PseudoCost, ii, BB_INT, lp->solution[i]);\n      hold *= randval;\n      if(greedymode) {\n        if(pseudocostmode) /* Override! */\n          OFval = my_chsign(is_maxim(lp), get_mat(lp, 0, ii));\n        hold *= OFval;\n      }\n      hold = my_chsign(reversemode, hold);\n    }\n    else\n    /* Find the variable with the largest gap to its bounds (distance from being fixed) */\n    if(is_bb_rule(lp, NODE_GAPSELECT)) {\n      hold = lp->solution[i];\n      holdINT = hold-unscaled_value(lp, upbo[i], i);\n      hold -= unscaled_value(lp, lowbo[i], i);\n      if(fabs(holdINT) > hold)\n        hold = holdINT;\n      if(greedymode)\n        hold *= OFval;\n      hold = my_chsign(reversemode, hold)*randval;\n    }\n    else\n    /* Find the variable with the largest integer gap (closest to 0.5) */\n    if(is_bb_rule(lp, NODE_FRACTIONSELECT)) {\n      hold = modf(lp->solution[i], &holdINT);\n      holdINT = hold-1;\n      if(fabs(holdINT) > hold)\n        hold = holdINT;\n      if(greedymode)\n        hold *= OFval;\n      hold = my_chsign(reversemode, hold)*randval;\n    }\n    else\n    /* Find the \"range\", most flexible variable */\n    if(is_bb_rule(lp, NODE_RANGESELECT)) {\n      hold = unscaled_value(lp, upbo[i]-lowbo[i], i);\n      if(greedymode)\n        hold *= OFval;\n      hold = my_chsign(reversemode, hold)*randval;\n    }\n\n    /* Select better, check for ties, and split by proximity to 0.5 */\n    if(hold > bestval) {\n      if( (hold > bestval+lp->epsprimal) ||\n          (fabs(modf(lp->solution[i], &holdINT) - 0.5) <\n           fabs(modf(lp->solution[bestvar], &holdINT) - 0.5)) ) {\n        bestval = hold;\n        bestvar = i;\n      }\n    }\n  }\n\nDone:\n  FREE(nonint);\n  return(bestvar);\n}\n\nSTATIC BBPSrec *init_pseudocost(lprec *lp, int pseudotype)\n{\n  int     i;\n  REAL    PSinitUP, PSinitLO;\n  BBPSrec *newitem;\n  MYBOOL  isPSCount;\n\n  /* Allocate memory */\n  newitem = (BBPSrec*) malloc(sizeof(*newitem));\n  newitem->lp = lp;\n  newitem->LOcost = (MATitem*) malloc((lp->columns+1) * sizeof(*newitem->LOcost));\n  newitem->UPcost = (MATitem*) malloc((lp->columns+1) * sizeof(*newitem->UPcost));\n  newitem->secondary = NULL;\n\n  /* Initialize with OF values */\n  newitem->pseodotype = (pseudotype & NODE_STRATEGYMASK);\n  isPSCount = ((pseudotype & NODE_PSEUDONONINTSELECT) != 0);\n  for(i = 1; i <= lp->columns; i++) {\n    newitem->LOcost[i].rownr = 1; /* Actual updates */\n    newitem->LOcost[i].colnr = 1; /* Attempted updates */\n    newitem->UPcost[i].rownr = 1;\n    newitem->UPcost[i].colnr = 1;\n\n    /* Initialize with the plain OF value as conventional usage suggests, or\n       override in case of pseudo-nonint count strategy */\n    PSinitUP = my_chsign(is_maxim(lp), get_mat(lp, 0, i));\n    PSinitLO = -PSinitUP;\n    if(isPSCount) {\n      /* Set default assumed reduction in the number of non-ints by choosing this variable;\n         KE changed from 0 on 30 June 2004 and made two-sided selectable.  Note that the\n         typical value range is <0..1>, with a positive bias for an \"a priori\" assumed\n         fast-converging (low \"MIP-complexity\") model. Very hard models may require\n         negative initialized values for one or both. */\n      PSinitUP = 0.1*0;\n#if 0\n      PSinitUP = my_chsign(PSinitUP < 0, PSinitUP);\n      PSinitLO = -PSinitUP;\n#else\n      PSinitLO = PSinitUP;\n#endif\n    }\n    newitem->UPcost[i].value = PSinitUP;\n    newitem->LOcost[i].value = PSinitLO;\n  }\n  newitem->updatelimit     = lp->bb_PseudoUpdates;\n  newitem->updatesfinished = 0;\n  newitem->restartlimit    = DEF_PSEUDOCOSTRESTART;\n\n  /* Let the user get an opportunity to initialize pseudocosts */\n  if(userabort(lp, MSG_INITPSEUDOCOST))\n    lp->spx_status = USERABORT;\n\n  return( newitem );\n}\n\nSTATIC MYBOOL free_pseudoclass(BBPSrec **PseudoClass)\n{\n  BBPSrec *target = *PseudoClass;\n\n  FREE(target->LOcost);\n  FREE(target->UPcost);\n  target = target->secondary;\n  FREE(*PseudoClass);\n  *PseudoClass = target;\n\n  return( (MYBOOL) (target != NULL) );\n}\n\nSTATIC void free_pseudocost(lprec *lp)\n{\n  if((lp != NULL) && (lp->bb_PseudoCost != NULL)) {\n    while(free_pseudoclass(&(lp->bb_PseudoCost)) );\n  }\n}\n\nMYBOOL __WINAPI set_pseudocosts(lprec *lp, REAL *clower, REAL *cupper, int *updatelimit)\n{\n  int i;\n\n  if((lp->bb_PseudoCost == NULL) || ((clower == NULL) && (cupper == NULL)))\n    return(FALSE);\n  for(i = 1; i <= lp->columns; i++) {\n    if(clower != NULL)\n      lp->bb_PseudoCost->LOcost[i].value = clower[i];\n    if(cupper != NULL)\n      lp->bb_PseudoCost->UPcost[i].value = cupper[i];\n  }\n  if(updatelimit != NULL)\n    lp->bb_PseudoCost->updatelimit = *updatelimit;\n  return(TRUE);\n}\n\nMYBOOL __WINAPI get_pseudocosts(lprec *lp, REAL *clower, REAL *cupper, int *updatelimit)\n{\n  int i;\n\n  if((lp->bb_PseudoCost == NULL) || ((clower == NULL) && (cupper == NULL)))\n    return(FALSE);\n  for(i = 1; i <= lp->columns; i++) {\n    if(clower != NULL)\n      clower[i] = lp->bb_PseudoCost->LOcost[i].value;\n    if(cupper != NULL)\n      cupper[i] = lp->bb_PseudoCost->UPcost[i].value;\n  }\n  if(updatelimit != NULL)\n    *updatelimit = lp->bb_PseudoCost->updatelimit;\n  return(TRUE);\n}\n\nSTATIC REAL get_pseudorange(BBPSrec *pc, int mipvar, int varcode)\n{\n  if(varcode == BB_SC)\n    return( unscaled_value(pc->lp, pc->lp->sc_lobound[mipvar], pc->lp->rows+mipvar) );\n  else\n    return( 1.0 );\n}\n\nSTATIC void update_pseudocost(BBPSrec *pc, int mipvar, int varcode, MYBOOL capupper, REAL varsol)\n{\n  REAL     OFsol, uplim;\n  MATitem  *PS;\n  MYBOOL   nonIntSelect = is_bb_rule(pc->lp, NODE_PSEUDONONINTSELECT);\n\n  /* Establish input values;\n     Note: The pseudocosts are normalized to the 0-1 range! */\n  uplim = get_pseudorange(pc, mipvar, varcode);\n  varsol = modf(varsol/uplim, &OFsol);\n\n  /* Set reference value according to pseudocost mode */\n  if(nonIntSelect)\n    OFsol = pc->lp->bb_bounds->lastvarcus;    /* The count of MIP infeasibilities */\n  else\n    OFsol = pc->lp->solution[0];              /* The problem's objective function value */\n\n  if(isnan(varsol)) {\n    pc->lp->bb_parentOF = OFsol;\n    return;\n  }\n\n  /* Point to the applicable (lower or upper) bound and increment attempted update count */\n  if(capupper) {\n    PS = &pc->LOcost[mipvar];\n  }\n  else {\n    PS = &pc->UPcost[mipvar];\n    varsol = 1-varsol;\n  }\n  PS->colnr++;\n\n  /* Make adjustment to divisor if we are using the ratio pseudo-cost approach */\n  if(is_bb_rule(pc->lp, NODE_PSEUDORATIOSELECT))\n    varsol *= capupper;\n\n  /* Compute the update (consider weighting in favor of most recent) */\n  mipvar = pc->updatelimit;\n  if(((mipvar <= 0) || (PS->rownr < mipvar)) &&\n     (fabs(varsol) > pc->lp->epspivot)) {\n    /* We are interested in the change in the MIP measure (contribution to increase\n       or decrease, as the case may be) and not its last value alone. */\n    PS->value = PS->value*PS->rownr + (pc->lp->bb_parentOF-OFsol) / (varsol*uplim);\n    PS->rownr++;\n    PS->value /= PS->rownr;\n    /* Check if we have enough information to restart */\n    if(PS->rownr == mipvar) {\n      pc->updatesfinished++;\n      if(is_bb_mode(pc->lp, NODE_RESTARTMODE) &&\n        (pc->updatesfinished/(2.0*pc->lp->int_vars) >\n         pc->restartlimit)) {\n        pc->lp->bb_break = AUTOMATIC;\n        pc->restartlimit *= 2.681;  /* KE: Who can figure this one out? */\n        if(pc->restartlimit > 1)\n          pc->lp->bb_rule -= NODE_RESTARTMODE;\n        report(pc->lp, NORMAL, \"update_pseudocost: Restarting with updated pseudocosts\\n\");\n      }\n    }\n  }\n  pc->lp->bb_parentOF = OFsol;\n}\n\nSTATIC REAL get_pseudobranchcost(BBPSrec *pc, int mipvar, MYBOOL dofloor)\n{\n  if(dofloor)\n    return( pc->LOcost[mipvar].value );\n  else\n    return( pc->UPcost[mipvar].value );\n}\n\nSTATIC REAL get_pseudonodecost(BBPSrec *pc, int mipvar, int vartype, REAL varsol)\n{\n  REAL hold, uplim;\n\n  uplim = get_pseudorange(pc, mipvar, vartype);\n  varsol = modf(varsol/uplim, &hold);\n  if(isnan(varsol))\n    varsol = 0;\n\n  hold = pc->LOcost[mipvar].value*varsol +\n         pc->UPcost[mipvar].value*(1-varsol);\n\n  return( hold*uplim );\n}\n\nSTATIC int compute_theta(lprec *lp, int rownr, LREAL *theta, int isupbound, REAL HarrisScalar, MYBOOL primal)\n/* The purpose of this routine is to compute the non-basic bound state / value of\n   the leaving variable. Note that the incoming theta is \"d\" in Chvatal-terminology */\n{\n  int             colnr = lp->var_basic[rownr];\n  register LREAL x     = lp->rhs[rownr];\n  REAL            lb    = 0,  /* Put lower bound here when the fully bounded version is implemented */\n                  ub    = lp->upbo[colnr],\n                  eps   = lp->epsprimal;  /* Primal feasibility tolerance */\n\n  /* Compute theta for the primal simplex */\n  HarrisScalar *= eps;\n  if(primal) {\n\n    if(*theta > 0)\n      x -= lb - HarrisScalar;   /* A positive number */\n    else if(ub < lp->infinite)\n      x -= ub + HarrisScalar;   /* A negative number */\n    else {\n      *theta = -lp->infinite;\n      return( colnr );\n    }\n  }\n  /* Compute theta for the dual simplex */\n  else {\n\n    if(isupbound)\n      *theta = -(*theta);\n\n    /* Current value is below or equal to its lower bound */\n    if(x < lb+eps)\n      x -= lb - HarrisScalar;\n\n    /* Current value is above or equal to its upper bound */\n    else if(x > ub-eps) {\n      if(ub >= lp->infinite) {\n        *theta = lp->infinite * my_sign(*theta);\n        return( colnr );\n      }\n      else\n        x -= ub + HarrisScalar;\n    }\n  }\n  my_roundzero(x, lp->epsmachine);\n  *theta = x / *theta;\n\n#ifdef EnforcePositiveTheta\n  /* Check if we have negative theta due to rounding or an internal error */\n  if(*theta < 0) {\n    if(primal && (ub == lb))\n      lp->rhs[rownr] = lb;\n    else\n#ifdef Paranoia\n    if(*theta < -eps) {\n      report(lp, DETAILED, \"compute_theta: Negative theta (%g) not allowed in base-0 version of lp_solve\\n\",\n                            *theta);\n    }\n#endif\n    *theta = 0;\n  }\n#endif\n\n  return( colnr );\n}\n\nSTATIC MYBOOL check_degeneracy(lprec *lp, REAL *pcol, int *degencount)\n/* Check if the entering column Pi=Inv(B)*a is likely to produce improvement;\n   (cfr. Istvan Maros: CTOTSM p. 233) */\n{\n  int  i, ndegen;\n  REAL *rhs, sdegen, epsmargin = lp->epsprimal;\n\n  sdegen = 0;\n  ndegen = 0;\n  rhs    = lp->rhs;\n  for(i = 1; i <= lp->rows; i++) {\n    rhs++;\n    pcol++;\n    if(fabs(*rhs) < epsmargin) {\n      sdegen += *pcol;\n      ndegen++;\n    }\n    else if(fabs((*rhs)-lp->upbo[lp->var_basic[i]]) < epsmargin) {\n      sdegen -= *pcol;\n      ndegen++;\n    }\n  }\n  if(degencount != NULL)\n    *degencount = ndegen;\n/*  sdegen += epsmargin*ndegen; */\n  return( (MYBOOL) (sdegen <= 0) );\n}\n\nSTATIC MYBOOL performiteration(lprec *lp, int rownr, int varin, LREAL theta, MYBOOL primal, MYBOOL allowminit,\n                               REAL *prow, int *nzprow, REAL *pcol, int *nzpcol, int *boundswaps)\n{\n  int    varout;\n  REAL   pivot, epsmargin, leavingValue, leavingUB, enteringUB;\n  MYBOOL leavingToUB = FALSE, enteringFromUB, enteringIsFixed, leavingIsFixed;\n  MYBOOL *islower = &(lp->is_lower[varin]);\n  MYBOOL minitNow = FALSE, minitStatus = ITERATE_MAJORMAJOR;\n  LREAL  deltatheta = theta;\n\n  if(userabort(lp, MSG_ITERATION))\n    return( minitNow );\n\n#ifdef Paranoia\n  if(rownr > lp->rows) {\n    if (lp->spx_trace)\n      report(lp, IMPORTANT, \"performiteration: Numeric instability encountered!\\n\");\n    lp->spx_status = NUMFAILURE;\n    return( FALSE );\n  }\n#endif\n  varout = lp->var_basic[rownr];\n#ifdef Paranoia\n  if(!lp->is_lower[varout])\n    report(lp, SEVERE, \"performiteration: Leaving variable %d was at its upper bound at iter %.0f\\n\",\n                        varout, (double) get_total_iter(lp));\n#endif\n\n  /* Theta is the largest change possible (strictest constraint) for the entering\n     variable (Theta is Chvatal's \"t\", ref. Linear Programming, pages 124 and 156) */\n  lp->current_iter++;\n\n  /* Test if it is possible to do a cheap \"minor iteration\"; i.e. set entering\n     variable to its opposite bound, without entering the basis - which is\n     obviously not possible for fixed variables! */\n  epsmargin = lp->epsprimal;\n  enteringFromUB = !(*islower);\n  enteringUB = lp->upbo[varin];\n  leavingUB  = lp->upbo[varout];\n  enteringIsFixed = (MYBOOL) (fabs(enteringUB) < epsmargin);\n  leavingIsFixed  = (MYBOOL) (fabs(leavingUB) < epsmargin);\n#if defined _PRICE_NOBOUNDFLIP\n  allowminit     &= !ISMASKSET(lp->piv_strategy, PRICE_NOBOUNDFLIP);\n#endif\n#ifdef Paranoia\n  if(enteringUB < 0)\n    report(lp, SEVERE, \"performiteration: Negative range for entering variable %d at iter %.0f\\n\",\n                        varin, (double) get_total_iter(lp));\n  if(leavingUB < 0)\n    report(lp, SEVERE, \"performiteration: Negative range for leaving variable %d at iter %.0f\\n\",\n                        varout, (double) get_total_iter(lp));\n#endif\n\n  /* Handle batch bound swaps with the dual long-step algorithm;\n     Loop over specified bound swaps; update RHS and Theta for bound swaps */\n  if((boundswaps != NULL) && (boundswaps[0] > 0)) {\n\n    int   i, boundvar;\n    REAL  *hold;\n\n    /* Allocate and initialize accumulation array */\n    allocREAL(lp, &hold, lp->rows + 1, TRUE);\n\n    /* Accumulate effective bound swaps and update flag */\n    for(i = 1; i <= boundswaps[0]; i++) {\n      boundvar = boundswaps[i];\n      deltatheta = my_chsign(!lp->is_lower[boundvar], lp->upbo[boundvar]);\n      mat_multadd(lp->matA, hold, boundvar, deltatheta);\n      lp->is_lower[boundvar] = !lp->is_lower[boundvar];\n    }\n    lp->current_bswap += boundswaps[0];\n    lp->current_iter  += boundswaps[0];\n\n    /* Solve for bound flip update vector (note that this does not\n       overwrite the stored update vector for the entering variable) */\n    ftran(lp, hold, NULL, lp->epsmachine);\n    if(!lp->obj_in_basis)\n      hold[0] = 0; /* The correct reduced cost goes here (adjusted for bound state) ****** */\n\n    /* Update the RHS / basic variable values and set revised thetas */\n    pivot = lp->bfp_pivotRHS(lp, 1, hold);\n    deltatheta = multi_enteringtheta(lp->longsteps);\n    theta = deltatheta;\n\n    FREE(hold);\n  }\n\n  /* Otherwise to traditional check for single bound swap */\n  else if(allowminit &&\n           !enteringIsFixed) {\n\n/*    pivot = epsmargin; */\n    pivot = lp->epsdual;\n/* #define v51mode */ /* Enable this for v5.1 operation mode */\n#ifdef v51mode\n    if(((lp->simplex_mode & SIMPLEX_Phase1_DUAL) == 0) ||\n       !is_constr_type(lp, rownr, EQ))                      /* *** DEBUG CODE KE */\n#endif\n    if(enteringUB - theta < -pivot) {\n\n#ifndef v51mode\n      if(fabs(enteringUB - theta) < pivot)\n        minitStatus = ITERATE_MINORMAJOR;\n      else\n#endif\n        minitStatus = ITERATE_MINORRETRY;\n      minitNow    = (MYBOOL) (minitStatus != ITERATE_MAJORMAJOR);\n    }\n  }\n\n  /* Process for traditional style single minor iteration */\n  if(minitNow) {\n\n   /* Set the new values (note that theta is set to always be positive) */\n    theta = MIN(fabs(theta), enteringUB);\n\n    /* Update the RHS / variable values and do bound-swap */\n    pivot = lp->bfp_pivotRHS(lp, theta, NULL);\n    *islower = !(*islower);\n\n    lp->current_bswap++;\n\n  }\n\n  /* Process for major iteration */\n  else {\n\n    /* Update the active pricer for the current pivot */\n    updatePricer(lp, rownr, varin, lp->bfp_pivotvector(lp), prow, nzprow);\n\n    /* Update the current basic variable values */\n    pivot = lp->bfp_pivotRHS(lp, theta, NULL);\n\n    /* See if the leaving variable goes directly to its upper bound. */\n    leavingValue = lp->rhs[rownr];\n    leavingToUB = (MYBOOL) (leavingValue > 0.5*leavingUB);\n    lp->is_lower[varout] = leavingIsFixed || !leavingToUB;\n\n    /* Set the value of the entering varible (theta always set to be positive) */\n    if(enteringFromUB) {\n      lp->rhs[rownr] = enteringUB - deltatheta;\n      *islower = TRUE;\n    }\n    else\n      lp->rhs[rownr] = deltatheta;\n    my_roundzero(lp->rhs[rownr], epsmargin);\n\n   /* Update basis indeces */\n    varout = set_basisvar(lp, rownr, varin);\n\n   /* Finalize the update in preparation for next major iteration */\n    lp->bfp_finishupdate(lp, enteringFromUB);\n\n  }\n\n  /* Show pivot tracking information, if specified */\n  if((lp->verbose > NORMAL) && (MIP_count(lp) == 0) &&\n     ((lp->current_iter % MAX(2, lp->rows / 10)) == 0))\n    report(lp, NORMAL, \"Objective value \" RESULTVALUEMASK \" at iter %10.0f.\\n\",\n                       lp->rhs[0], (double) get_total_iter(lp));\n\n#if 0\n  if(verify_solution(lp, FALSE, my_if(minitNow, \"MINOR\", \"MAJOR\")) >= 0) {\n    if(minitNow)\n      pivot = get_obj_active(lp, varin);\n    else\n      pivot = get_obj_active(lp, varout);\n  }\n#endif\n#if 0\n  if((lp->longsteps != NULL) && (boundswaps[0] > 0) && lp->longsteps->objcheck &&\n    ((pivot = fabs(my_reldiff(lp->rhs[0], lp->longsteps->obj_last))) > lp->epssolution)) {\n    report(lp, IMPORTANT, \"performiteration: Objective value gap %8.6f found at iter %6.0f (%d bound flips, %d)\\n\",\n                          pivot, (double) get_total_iter(lp), boundswaps[0], enteringFromUB);\n  }\n#endif\n\n  if(lp->spx_trace) {\n    if(minitNow)\n      report(lp, NORMAL, \"I:%5.0f - minor - %5d ignored,          %5d flips  from %s with THETA=%g and OBJ=%g\\n\",\n                         (double) get_total_iter(lp), varout, varin, (enteringFromUB ? \"UPPER\" : \"LOWER\"), theta, lp->rhs[0]);\n    else\n      report(lp, NORMAL, \"I:%5.0f - MAJOR - %5d leaves to %s,  %5d enters from %s with THETA=%g and OBJ=%g\\n\",\n                         (double) get_total_iter(lp), varout, (leavingToUB    ? \"UPPER\" : \"LOWER\"),\n                                           varin,  (enteringFromUB ? \"UPPER\" : \"LOWER\"), theta, lp->rhs[0]);\n    if(minitNow) {\n      if(!lp->is_lower[varin])\n        report(lp, DETAILED,\n        \"performiteration: Variable %d changed to its lower bound at iter %.0f (from %g)\\n\",\n        varin, (double) get_total_iter(lp), enteringUB);\n      else\n        report(lp, DETAILED,\n        \"performiteration: Variable %d changed to its upper bound at iter %.0f (to %g)\\n\",\n        varin, (double) get_total_iter(lp), enteringUB);\n    }\n    else\n      report(lp, NORMAL,\n          \"performiteration: Variable %d entered basis at iter %.0f at \" RESULTVALUEMASK \"\\n\",\n          varin, (double) get_total_iter(lp), lp->rhs[rownr]);\n    if(!primal) {\n      pivot = compute_feasibilitygap(lp, (MYBOOL)!primal, TRUE);\n      report(lp, NORMAL, \"performiteration: Feasibility gap at iter %.0f is \" RESULTVALUEMASK \"\\n\",\n                         (double) get_total_iter(lp), pivot);\n    }\n    else\n      report(lp, NORMAL,\n          \"performiteration: Current objective function value at iter %.0f is \" RESULTVALUEMASK \"\\n\",\n          (double) get_total_iter(lp), lp->rhs[0]);\n  }\n\n  return( minitStatus );\n\n} /* performiteration */\n\nSTATIC REAL get_refactfrequency(lprec *lp, MYBOOL final)\n{\n  COUNTER iters;\n  int     refacts;\n\n  /* Get numerator and divisor information */\n  iters   = (lp->total_iter+lp->current_iter) - (lp->total_bswap+lp->current_bswap);\n  refacts = lp->bfp_refactcount(lp, BFP_STAT_REFACT_TOTAL);\n\n  /* Return frequency for different cases:\n      1) Actual frequency in case final statistic is desired\n      2) Dummy if we are in a B&B process\n      3) Frequency with added initialization offsets which\n         are diluted in course of the solution process */\n  if(final)\n    return( (REAL) (iters) / MAX(1,refacts) );\n  else if(lp->bb_totalnodes > 0)\n    return( (REAL) lp->bfp_pivotmax(lp) );\n  else\n    return( (REAL) (lp->bfp_pivotmax(lp)+iters) / (1+refacts) );\n}\n\n#if 0\n/* INLINE */ MYBOOL is_fixedvar(lprec *lp, int variable)\n{\n  if((lp->bb_bounds != NULL && lp->bb_bounds->UBzerobased) || (variable <= lp->rows))\n    return( (MYBOOL) (lp->upbo[variable] < lp->epsprimal) );\n  else\n    return( (MYBOOL) (lp->upbo[variable]-lp->lowbo[variable] < lp->epsprimal) );\n} /* is_fixedvar */\n#else\nMYBOOL is_fixedvar(lprec *lp, int varnr)\n{\n  if(lp->bb_bounds == NULL) {\n    if(varnr <= lp->rows)\n      return( (MYBOOL) (lp->orig_upbo[varnr] < lp->epsmachine) );\n    else\n      return( (MYBOOL) (lp->orig_upbo[varnr]-lp->orig_lowbo[varnr] < lp->epsmachine) );\n  }\n  else if((varnr <= lp->rows) || (lp->bb_bounds->UBzerobased == TRUE))\n    return( (MYBOOL) (lp->upbo[varnr] < lp->epsvalue) );\n  else\n    return( (MYBOOL) (lp->upbo[varnr]-lp->lowbo[varnr] < lp->epsvalue) );\n}\n#endif\n\nSTATIC MYBOOL solution_is_int(lprec *lp, int index, MYBOOL checkfixed)\n{\n#if 1\n  return( (MYBOOL) (isINT(lp, lp->solution[index]) && (!checkfixed || is_fixedvar(lp, index))) );\n#else\n  if(isINT(lp, lp->solution[index])) {\n    if(checkfixed)\n      return(is_fixedvar(lp, index));\n    else\n      return(TRUE);\n  }\n  return(FALSE);\n#endif\n} /* solution_is_int */\n\n\nMYBOOL __WINAPI set_multiprice(lprec *lp, int multiblockdiv)\n{\n  /* See if we are resetting multiply priced column structures */\n  if(multiblockdiv != lp->multiblockdiv) {\n    if(multiblockdiv < 1)\n      multiblockdiv = 1;\n    lp->multiblockdiv = multiblockdiv;\n    multi_free(&(lp->multivars));\n  }\n  return( TRUE );\n}\n\nint __WINAPI get_multiprice(lprec *lp, MYBOOL getabssize)\n{\n  if((lp->multivars == NULL) || (lp->multivars->used == 0))\n    return( 0 );\n  if(getabssize)\n    return( lp->multivars->size );\n  else\n    return( lp->multiblockdiv );\n}\n\nMYBOOL __WINAPI set_partialprice(lprec *lp, int blockcount, int *blockstart, MYBOOL isrow)\n{\n  int        ne, i, items;\n  partialrec **blockdata;\n\n  /* Determine partial target (rows or columns) */\n  if(isrow)\n    blockdata = &(lp->rowblocks);\n  else\n    blockdata = &(lp->colblocks);\n\n  /* See if we are resetting partial blocks */\n  ne = 0;\n  items = IF(isrow, lp->rows, lp->columns);\n  if(blockcount == 1)\n    partial_freeBlocks(blockdata);\n\n  /* Set a default block count if this was not specified */\n  else if(blockcount <= 0) {\n    blockstart = NULL;\n    if(items < DEF_PARTIALBLOCKS*DEF_PARTIALBLOCKS)\n      blockcount = items / DEF_PARTIALBLOCKS + 1;\n    else\n      blockcount = DEF_PARTIALBLOCKS;\n    ne = items / blockcount;\n    if(ne * blockcount < items)\n      ne++;\n  }\n\n  /* Fill partial block arrays;\n     Note: These will be modified during preprocess to reflect\n           presolved columns and the handling of slack variables. */\n  if(blockcount > 1) {\n    MYBOOL     isNew = (MYBOOL) (*blockdata == NULL);\n\n    /* Provide for extra block with slack variables in the column mode */\n    i = 0;\n    if(!isrow)\n      i++;\n\n    /* (Re)-allocate memory */\n    if(isNew)\n      *blockdata = partial_createBlocks(lp, isrow);\n    allocINT(lp, &((*blockdata)->blockend), blockcount+i+1, AUTOMATIC);\n    allocINT(lp, &((*blockdata)->blockpos), blockcount+i+1, AUTOMATIC);\n\n    /* Copy the user-provided block start positions */\n    if(blockstart != NULL) {\n      MEMCOPY((*blockdata)->blockend+i, blockstart, blockcount+i+1);\n      if(!isrow) {\n        blockcount++;\n        (*blockdata)->blockend[0] = 1;\n        for(i = 1; i < blockcount; i++)\n          (*blockdata)->blockend[i] += lp->rows;\n      }\n    }\n\n    /* Fill the block ending positions if they were not specified */\n    else {\n      (*blockdata)->blockend[0] = 1;\n      (*blockdata)->blockpos[0] = 1;\n      if(ne == 0) {\n        ne = items / blockcount;\n        /* Increase the block size if we have a fractional value */\n        while(ne * blockcount < items)\n          ne++;\n      }\n      i = 1;\n      if(!isrow) {\n        (*blockdata)->blockend[i] = (*blockdata)->blockend[i-1]+lp->rows;\n        blockcount++;\n        i++;\n        items += lp->rows;\n      }\n      for(; i < blockcount; i++)\n        (*blockdata)->blockend[i] = (*blockdata)->blockend[i-1]+ne;\n\n      /* Let the last block handle the \"residual\" */\n      (*blockdata)->blockend[blockcount] = items+1;\n    }\n\n    /* Fill starting positions (used in multiple partial pricing) */\n    for(i = 1; i <= blockcount; i++)\n      (*blockdata)->blockpos[i] = (*blockdata)->blockend[i-1];\n\n  }\n\n  /* Update block count */\n  (*blockdata)->blockcount = blockcount;\n\n\n  return( TRUE );\n} /* set_partialprice */\n\nvoid __WINAPI get_partialprice(lprec *lp, int *blockcount, int *blockstart, MYBOOL isrow)\n{\n  partialrec *blockdata;\n\n  /* Determine partial target (rows or columns) */\n  if(isrow)\n    blockdata = lp->rowblocks;\n  else\n    blockdata = lp->colblocks;\n\n  *blockcount = partial_countBlocks(lp, isrow);\n  if((blockdata != NULL) && (blockstart != NULL)) {\n    int i = 0, k = *blockcount;\n    if(!isrow)\n      i++;\n    MEMCOPY(blockstart, blockdata->blockend + i, k - i);\n    if(!isrow) {\n      k -= i;\n      for(i = 0; i < k; i++)\n        blockstart[i] -= lp->rows;\n    }\n  }\n}\n\n\n/* Solution-related functions */\nSTATIC MYBOOL bb_better(lprec *lp, int target, int mode)\n/* Must handle four modes (logic assumes Min!):\n      -----|--.--|----->\n   1  ++++++-----------  LHS exclusive test point is better\n   2  +++++++++--------  LHS inclusive\n   3  ++++++-----++++++  LHS+RHS exclusive\n   4  --------+++++++++  RHS inclusive\n   5  -----------++++++  RHS exclusive\n*/\n{\n  REAL   epsvalue, offset = lp->epsprimal,\n         refvalue = lp->infinite, testvalue = lp->solution[0];\n  MYBOOL ismax = is_maxim(lp),\n         relgap = is_action(mode, OF_TEST_RELGAP),\n         fcast  = is_action(target, OF_PROJECTED),\n         delta  = is_action(target, OF_DELTA);\n\n  if(relgap) {\n    epsvalue = lp->mip_relgap;\n    clear_action(&mode, OF_TEST_RELGAP);\n  }\n  else\n    epsvalue = lp->mip_absgap;\n\n  if(delta)\n    clear_action(&target, OF_DELTA);\n  if(fcast)\n    clear_action(&target, OF_PROJECTED);\n#ifdef Paranoia\n  if((mode < OF_TEST_BT) || (mode > OF_TEST_WT))\n    report(lp, SEVERE, \"bb_better: Passed invalid mode '%d'\\n\", mode);\n#endif\n\n  switch(target) {\n    case OF_RELAXED:   refvalue = lp->real_solution;\n                       break;\n    case OF_INCUMBENT: refvalue = lp->best_solution[0];\n                       break;\n    case OF_WORKING:  refvalue = my_chsign(!ismax, lp->bb_workOF /* unscaled_value(lp, lp->bb_workOF, 0) */ );\n                       if(fcast)\n                         testvalue = my_chsign(!ismax, lp->longsteps->obj_last) - epsvalue;\n                       else\n                         testvalue = my_chsign(!ismax, lp->rhs[0] /* unscaled_value(lp, lp->rhs[0], 0) */);\n                       break;\n    case OF_USERBREAK: refvalue = lp->bb_breakOF;\n                       break;\n    case OF_HEURISTIC: refvalue = lp->bb_heuristicOF;\n                       break;\n    case OF_DUALLIMIT: refvalue = lp->bb_limitOF;\n                       break;\n    default         :  report(lp, SEVERE, \"bb_better: Passed invalid test target '%d'\\n\", target);\n                       return( FALSE );\n  }\n\n  /* Adjust the test value for the desired acceptability window */\n  if(delta) {\n    SETMAX(epsvalue, lp->bb_deltaOF - epsvalue);\n  }\n  else\n    epsvalue = my_chsign(target >= OF_USERBREAK, epsvalue); /* *** This seems Ok, but should be verified */\n  testvalue += my_chsign(ismax, epsvalue);\n\n  /* Compute the raw test value */\n  if(relgap)\n    testvalue = my_reldiff(testvalue, refvalue);\n  else\n    testvalue -= refvalue;\n\n  /* Make test value adjustment based on the selected option */\n  if(mode == OF_TEST_NE)\n    relgap = (MYBOOL) (fabs(testvalue) >= offset);\n  else {\n    testvalue = my_chsign(mode > OF_TEST_NE, testvalue);\n    testvalue = my_chsign(ismax, testvalue);\n    relgap = (MYBOOL) (testvalue < offset);\n  }\n  return( relgap );\n}\n\nSTATIC void construct_solution(lprec *lp, REAL *target)\n{\n  int     i, j, basi;\n  REAL    f, epsvalue = lp->epsprimal;\n  REAL    *solution;\n  REAL    *value;\n  int     *rownr;\n  MATrec  *mat = lp->matA;\n\n  if(target == NULL)\n    solution = lp->solution;\n  else\n    solution = target;\n\n  /* Initialize OF and slack variables. */\n  for(i = 0; i <= lp->rows; i++) {\n#ifdef LegacySlackDefinition\n    if(i == 0)\n      f = unscaled_value(lp, -lp->orig_rhs[i], i);\n    else {\n      j = lp->presolve_undo->var_to_orig[i];\n      if(j > 0) {\n        f = lp->presolve_undo->fixed_rhs[j];\n        f = unscaled_value(lp, f, i);\n      }\n      else\n        f = 0;\n    }\n#else\n    f = lp->orig_rhs[i];\n    if((i > 0) && !lp->is_basic[i] && !lp->is_lower[i])\n#ifdef SlackInitMinusInf\n      f -= my_chsign(is_chsign(lp, i), fabs(lp->upbo[i]));\n#else\n      f -= my_chsign(is_chsign(lp, i), fabs(lp->lowbo[i] + lp->upbo[i]));\n#endif\n    f = unscaled_value(lp, -f, i);\n#endif\n    solution[i] = f;\n  }\n\n  /* Initialize user variables to their lower bounds. */\n  for(i = lp->rows+1; i <= lp->sum; i++)\n    solution[i] = lp->lowbo[i];\n\n  /* Add values of user basic variables. */\n  for(i = 1; i <= lp->rows; i++) {\n    basi = lp->var_basic[i];\n    if(basi > lp->rows) {\n      solution[basi] += lp->rhs[i];\n    }\n  }\n\n  /* 1. Adjust non-basic variables at their upper bounds,\n     2. Unscale all user variables,\n     3. Optionally do precision management. */\n  for(i = lp->rows + 1; i <= lp->sum; i++) {\n    if(!lp->is_basic[i] && !lp->is_lower[i])\n      solution[i] += lp->upbo[i];\n    solution[i] = unscaled_value(lp, solution[i], i);\n#ifdef xImproveSolutionPrecision\n    if(is_int(lp, i-lp->rows))\n      solution[i] = restoreINT(solution[i], lp->epsint);\n    else\n      solution[i] = restoreINT(solution[i], lp->epsprimal);\n#endif\n  }\n\n  /* Compute the OF and slack values \"in extentio\" */\n  for(j = 1; j <= lp->columns; j++) {\n    f = solution[lp->rows + j];\n    if(f != 0) {\n      solution[0] += f * unscaled_mat(lp, lp->orig_obj[j], 0, j);\n      i = mat->col_end[j-1];\n      basi = mat->col_end[j];\n      rownr = &COL_MAT_ROWNR(i);\n      value = &COL_MAT_VALUE(i);\n      for(; i < basi;\n          i++, rownr += matRowColStep, value += matValueStep)\n        solution[*rownr] += f * unscaled_mat(lp, *value, *rownr, j);\n    }\n  }\n\n  /* Do slack precision management and sign reversal if necessary */\n  for(i = 0; i <= lp->rows; i++) {\n#ifdef ImproveSolutionPrecision\n    my_roundzero(solution[i], epsvalue);\n#endif\n    if(is_chsign(lp, i))\n      solution[i] = my_flipsign(solution[i]);\n  }\n\n /* Record the best real-valued solution and compute a simple MIP solution limit */\n  if(target == NULL) {\n    if(is_infinite(lp, lp->real_solution)) {\n      lp->bb_workOF = lp->rhs[0];\n      lp->real_solution = solution[0];\n      if(is_infinite(lp, lp->bb_limitOF))\n        lp->bb_limitOF = lp->real_solution;\n      else {\n        if(is_maxim(lp)) {\n          SETMIN(lp->bb_limitOF, lp->real_solution);\n        }\n        else {\n          SETMAX(lp->bb_limitOF, lp->real_solution);\n        }\n      }\n\n      /* Do MIP-related tests and computations */\n      if((lp->int_vars > 0) && mat_validate(lp->matA) /* && !lp->wasPresolved */) { /* && !lp->wasPresolved uncommented by findings of William H. Patton. The code was never executed when the test was there. The code has effect in an integer model with all integer objective coeff. to cut-off optimization and thus make it faster */\n        REAL fixedOF = unscaled_value(lp, lp->orig_rhs[0], 0);\n\n        /* Check if we have an all-integer OF */\n        basi = lp->columns;\n        for(j = 1; j <= basi; j++) {\n          f = fabs(get_mat(lp, 0, j)) + lp->epsint / 2;\n          if(f > lp->epsint) { /* If coefficient is 0 then it doesn't influence OF, even it variable is not integer */\n            if(!is_int(lp, j) || (fmod(f, 1) > lp->epsint))\n              break;\n          }\n        }\n\n        /* If so, we can round up the fractional OF */\n        if(j > basi) {\n          f = my_chsign(is_maxim(lp), lp->real_solution) + fixedOF;\n          f = floor(f+(1-epsvalue));\n          f = my_chsign(is_maxim(lp), f - fixedOF);\n          if(is_infinite(lp, lp->bb_limitOF))\n            lp->bb_limitOF = f;\n          else if(is_maxim(lp)) {\n            SETMIN(lp->bb_limitOF, f);\n          }\n          else {\n            SETMAX(lp->bb_limitOF, f);\n          }\n        }\n      }\n\n      /* Check that a user limit on the OF is feasible */\n      if((lp->int_vars > 0) &&\n         (my_chsign(is_maxim(lp), my_reldiff(lp->best_solution[0],lp->bb_limitOF)) < -epsvalue)) {\n        lp->spx_status = INFEASIBLE;\n        lp->bb_break = TRUE;\n      }\n    }\n  }\n\n} /* construct_solution */\n\nSTATIC int check_solution(lprec *lp, int  lastcolumn, REAL *solution,\n                          REAL *upbo, REAL *lowbo, REAL tolerance)\n{\n/*#define UseMaxValueInCheck*/\n  MYBOOL isSC;\n  REAL   test, value, hold, diff, maxdiff = 0.0, maxerr = 0.0, *matValue,\n#ifdef UseMaxValueInCheck\n         *maxvalue = NULL,\n#else\n         *plusum = NULL, *negsum = NULL;\n#endif\n  int    i,j,n, errlevel = IMPORTANT, errlimit = 10, *matRownr, *matColnr;\n  MATrec *mat = lp->matA;\n\n  report(lp, NORMAL, \" \\n\");\n  if(MIP_count(lp) > 0)\n    report(lp, NORMAL, \"%s solution  \" RESULTVALUEMASK \" after %10.0f iter, %9.0f nodes (gap %.1f%%).\\n\",\n                       my_if(lp->bb_break && !bb_better(lp, OF_DUALLIMIT, OF_TEST_BE) && bb_better(lp, OF_RELAXED, OF_TEST_NE), \"Subopt.\", \"Optimal\"),\n                       solution[0], (double) lp->total_iter, (double) lp->bb_totalnodes,\n                       100.0*fabs(my_reldiff(solution[0], lp->bb_limitOF)));\n  else\n    report(lp, NORMAL, \"Optimal solution  \" RESULTVALUEMASK \" after %10.0f iter.\\n\",\n                       solution[0], (double) lp->total_iter);\n\n /* Find the signed sums and the largest absolute product in the matrix (exclude the OF for speed) */\n#ifdef UseMaxValueInCheck\n  allocREAL(lp, &maxvalue, lp->rows + 1, FALSE);\n  for(i = 0; i <= lp->rows; i++)\n    maxvalue[i] = fabs(get_rh(lp, i));\n#else\n  allocREAL(lp, &plusum, lp->rows + 1, TRUE);\n  allocREAL(lp, &negsum, lp->rows + 1, TRUE);\n#endif\n  n = get_nonzeros(lp);\n  matRownr = &COL_MAT_ROWNR(0);\n  matColnr = &COL_MAT_COLNR(0);\n  matValue = &COL_MAT_VALUE(0);\n  for(i = 0; i < n; i++, matRownr += matRowColStep,\n                         matColnr += matRowColStep,\n                         matValue += matValueStep) {\n    test = unscaled_mat(lp, *matValue, *matRownr, *matColnr);\n    test *= solution[lp->rows + (*matColnr)];\n#ifdef UseMaxValueInCheck\n    test = fabs(test);\n    if(test > maxvalue[*matRownr])\n      maxvalue[*matRownr] = test;\n#else\n    if(test > 0)\n      plusum[*matRownr] += test;\n    else\n      negsum[*matRownr] += test;\n#endif\n  }\n\n\n /* Check if solution values are within the bounds; allowing a margin for numeric errors */\n  n = 0;\n  for(i = lp->rows + 1; i <= lp->rows+lastcolumn; i++) {\n\n    value = solution[i];\n\n    /* Check for case where we are testing an intermediate solution\n       (variables shifted to the origin) */\n    if(lowbo == NULL)\n      test = 0;\n    else\n      test = unscaled_value(lp, lowbo[i], i);\n\n    isSC = is_semicont(lp, i - lp->rows);\n    diff = my_reldiff(value, test);\n    if(diff < 0) {\n      if(isSC && (value < test/2))\n        test = 0;\n      SETMAX(maxerr, fabs(value-test));\n      SETMAX(maxdiff, fabs(diff));\n    }\n    if((diff < -tolerance) && !isSC)  {\n      if(n < errlimit)\n      report(lp, errlevel,\n        \"check_solution: Variable   %s = \" RESULTVALUEMASK \" is below its lower bound \" RESULTVALUEMASK \"\\n\",\n         get_col_name(lp, i-lp->rows), value, test);\n      n++;\n    }\n\n    test = unscaled_value(lp, upbo[i], i);\n    diff = my_reldiff(value, test);\n    if(diff > 0) {\n      SETMAX(maxerr, fabs(value-test));\n      SETMAX(maxdiff, fabs(diff));\n    }\n    if(diff > tolerance) {\n      if(n < errlimit)\n      report(lp, errlevel,\n         \"check_solution: Variable   %s = \" RESULTVALUEMASK \" is above its upper bound \" RESULTVALUEMASK \"\\n\",\n         get_col_name(lp, i-lp->rows), value, test);\n      n++;\n    }\n  }\n\n /* Check if constraint values are within the bounds; allowing a margin for numeric errors */\n  for(i = 1; i <= lp->rows; i++) {\n\n    test = lp->orig_rhs[i];\n    if(is_infinite(lp, test))\n      continue;\n\n#ifdef LegacySlackDefinition\n    j = lp->presolve_undo->var_to_orig[i];\n    if(j != 0) {\n      if(is_infinite(lp, lp->presolve_undo->fixed_rhs[j]))\n        continue;\n      test += lp->presolve_undo->fixed_rhs[j];\n    }\n#endif\n\n    if(is_chsign(lp, i)) {\n      test = my_flipsign(test);\n      test += fabs(upbo[i]);\n    }\n    value = solution[i];\n    test = unscaled_value(lp, test, i);\n#ifndef LegacySlackDefinition\n    value += test;\n#endif\n/*    diff = my_reldiff(value, test); */\n#ifdef UseMaxValueInCheck\n    hold = maxvalue[i];\n#else\n    hold = plusum[i] - negsum[i];\n#endif\n    if(hold < lp->epsvalue)\n      hold = 1;\n    diff = my_reldiff((value+1)/hold, (test+1)/hold);\n    if(diff > 0) {\n      SETMAX(maxerr, fabs(value-test));\n      SETMAX(maxdiff, fabs(diff));\n    }\n    if(diff > tolerance) {\n      if(n < errlimit)\n      report(lp, errlevel,\n        \"check_solution: Constraint %s = \" RESULTVALUEMASK \" is above its %s \" RESULTVALUEMASK \"\\n\",\n        get_row_name(lp, i), value,\n        (is_constr_type(lp, i, EQ) ? \"equality of\" : \"upper bound\"), test);\n      n++;\n    }\n\n    test = lp->orig_rhs[i];\n#ifdef LegacySlackDefinition\n    j = lp->presolve_undo->var_to_orig[i];\n    if(j != 0) {\n      if(is_infinite(lp, lp->presolve_undo->fixed_rhs[j]))\n        continue;\n      test += lp->presolve_undo->fixed_rhs[j];\n    }\n#endif\n\n    value = solution[i];\n    if(is_chsign(lp, i))\n      test = my_flipsign(test);\n    else {\n      if(is_infinite(lp, upbo[i]))\n        continue;\n      test -= fabs(upbo[i]);\n#ifndef LegacySlackDefinition\n      value = fabs(upbo[i]) - value;\n#endif\n    }\n    test = unscaled_value(lp, test, i);\n#ifndef LegacySlackDefinition\n    value += test;\n#endif\n/*    diff = my_reldiff(value, test); */\n#ifdef UseMaxValueInCheck\n    hold = maxvalue[i];\n#else\n    hold = plusum[i] - negsum[i];\n#endif\n    if(hold < lp->epsvalue)\n      hold = 1;\n    diff = my_reldiff((value+1)/hold, (test+1)/hold);\n    if(diff < 0) {\n      SETMAX(maxerr, fabs(value-test));\n      SETMAX(maxdiff, fabs(diff));\n    }\n    if(diff < -tolerance) {\n      if(n < errlimit)\n      report(lp, errlevel,\n        \"check_solution: Constraint %s = \" RESULTVALUEMASK \" is below its %s \" RESULTVALUEMASK \"\\n\",\n        get_row_name(lp, i), value,\n        (is_constr_type(lp, i, EQ) ? \"equality of\" : \"lower bound\"), test);\n      n++;\n    }\n  }\n\n#ifdef UseMaxValueInCheck\n  FREE(maxvalue);\n#else\n  FREE(plusum);\n  FREE(negsum);\n#endif\n\n  if(n > 0) {\n    report(lp, IMPORTANT, \"\\nSeriously low accuracy found ||*|| = %g (rel. error %g)\\n\",\n               maxerr, maxdiff);\n    return(NUMFAILURE);\n  }\n  else {\n    if(maxerr > 1.0e-7)\n      report(lp, NORMAL, \"\\nMarginal numeric accuracy ||*|| = %g (rel. error %g)\\n\",\n                 maxerr, maxdiff);\n    else if(maxerr > 1.0e-9)\n      report(lp, NORMAL, \"\\nReasonable numeric accuracy ||*|| = %g (rel. error %g)\\n\",\n                 maxerr, maxdiff);\n    else if(maxerr > 1.0e11)\n      report(lp, NORMAL, \"\\nVery good numeric accuracy ||*|| = %g\\n\", maxerr);\n    else\n      report(lp, NORMAL, \"\\nExcellent numeric accuracy ||*|| = %g\\n\", maxerr);\n\n    return(OPTIMAL);\n  }\n\n} /* check_solution */\n\nSTATIC void transfer_solution_var(lprec *lp, int uservar)\n{\n  if(lp->varmap_locked && (MYBOOL) ((lp->do_presolve & PRESOLVE_LASTMASKMODE) != PRESOLVE_NONE)) {\n    uservar += lp->rows;\n    lp->full_solution[lp->presolve_undo->orig_rows +\n                      lp->presolve_undo->var_to_orig[uservar]] = lp->best_solution[uservar];\n  }\n}\nSTATIC void transfer_solution(lprec *lp, MYBOOL dofinal)\n{\n  int i, ii;\n\n  MEMCOPY(lp->best_solution, lp->solution, lp->sum + 1);\n\n  /* Round integer solution values to actual integers */\n  if(is_integerscaling(lp) && (lp->int_vars > 0))\n    for(i = 1; i <= lp->columns; i++) {\n      if(is_int(lp, i)) {\n        ii = lp->rows + i;\n        lp->best_solution[ii] = floor(lp->best_solution[ii] + 0.5);\n      }\n    }\n\n  /* Transfer to full solution vector in the case of presolved eliminations */\n  if(dofinal && lp->varmap_locked &&\n     (MYBOOL) ((lp->do_presolve & PRESOLVE_LASTMASKMODE) != PRESOLVE_NONE)) {\n    presolveundorec *psundo = lp->presolve_undo;\n\n    lp->full_solution[0] = lp->best_solution[0];\n    for(i = 1; i <= lp->rows; i++) {\n      ii = psundo->var_to_orig[i];\n#ifdef Paranoia\n      if((ii < 0) || (ii > lp->presolve_undo->orig_rows))\n        report(lp, SEVERE, \"transfer_solution: Invalid mapping of row index %d to original index '%d'\\n\",\n                            i, ii);\n#endif\n      lp->full_solution[ii] = lp->best_solution[i];\n    }\n    for(i = 1; i <= lp->columns; i++) {\n      ii = psundo->var_to_orig[lp->rows+i];\n#ifdef Paranoia\n      if((ii < 0) || (ii > lp->presolve_undo->orig_columns))\n        report(lp, SEVERE, \"transfer_solution: Invalid mapping of column index %d to original index '%d'\\n\",\n                            i, ii);\n#endif\n      lp->full_solution[psundo->orig_rows+ii] = lp->best_solution[lp->rows+i];\n    }\n  }\n\n}\n\nSTATIC MYBOOL construct_duals(lprec *lp)\n{\n  int  i, n, *coltarget;\n  REAL scale0, value, dualOF;\n\n  if(lp->duals != NULL)\n    free_duals(lp);\n\n  if(is_action(lp->spx_action, ACTION_REBASE) ||\n     is_action(lp->spx_action, ACTION_REINVERT) || (!lp->basis_valid) ||\n     !allocREAL(lp, &(lp->duals), lp->sum + 1, AUTOMATIC))\n    return(FALSE);\n\n  /* Initialize */\n  coltarget = (int *) mempool_obtainVector(lp->workarrays, lp->columns+1, sizeof(*coltarget));\n  if(!get_colIndexA(lp, SCAN_USERVARS+USE_NONBASICVARS, coltarget, FALSE)) {\n    mempool_releaseVector(lp->workarrays, (char *) coltarget, FALSE);\n    return(FALSE);\n  }\n  bsolve(lp, 0, lp->duals, NULL, lp->epsmachine*DOUBLEROUND, 1.0);\n  prod_xA(lp, coltarget, lp->duals, NULL, lp->epsmachine, 1.0,\n                         lp->duals, NULL, MAT_ROUNDDEFAULT | MAT_ROUNDRC);\n  mempool_releaseVector(lp->workarrays, (char *) coltarget, FALSE);\n\n\n  /* The (Lagrangean) dual values are the reduced costs of the primal slacks;\n     when the slack is at its upper bound, change the sign. */\n  n = lp->rows;\n  for(i = 1; i <= n; i++) {\n    if(lp->is_basic[i])\n      lp->duals[i] = 0;\n    /* Added a test if variable is different from 0 because sometime you get -0 and this\n       is different from 0 on for example INTEL processors (ie 0 != -0 on INTEL !) PN */\n    else if((is_chsign(lp, 0) == is_chsign(lp, i)) && lp->duals[i])\n      lp->duals[i] = my_flipsign(lp->duals[i]);\n  }\n  if(is_maxim(lp)) {\n    n = lp->sum;\n    for(i = lp->rows + 1; i <= n; i++)\n      lp->duals[i] = my_flipsign(lp->duals[i]);\n  }\n\n  /* If we presolved, then reconstruct the duals */\n  n = lp->presolve_undo->orig_sum;\n  if(((lp->do_presolve & PRESOLVE_LASTMASKMODE) != PRESOLVE_NONE) &&\n      allocREAL(lp, &(lp->full_duals), n + 1, TRUE)) {\n    int ix, ii = lp->presolve_undo->orig_rows;\n\n    n = lp->sum;\n    for(ix = 1; ix <= n; ix++) {\n      i = lp->presolve_undo->var_to_orig[ix];\n      if(ix > lp->rows)\n        i += ii;\n#ifdef Paranoia\n      /* Check for index out of range due to presolve */\n      if(i > lp->presolve_undo->orig_sum)\n        report(lp, SEVERE, \"construct_duals: Invalid presolve variable mapping found\\n\");\n#endif\n      lp->full_duals[i] = lp->duals[ix];\n    }\n    presolve_rebuildUndo(lp, FALSE);\n  }\n\n  /* Calculate the dual OF and do scaling adjustments to the duals */\n  if(lp->scaling_used)\n    scale0 = lp->scalars[0];\n  else\n    scale0 = 1;\n  dualOF = my_chsign(is_maxim(lp), lp->orig_rhs[0]) / scale0;\n  for(i = 1; i <= lp->sum; i++) {\n    value = scaled_value(lp, lp->duals[i] / scale0, i);\n    my_roundzero(value, lp->epsprimal);\n    lp->duals[i] = value;\n    if(i <= lp->rows)\n      dualOF += value * lp->solution[i];\n  }\n\n#if 0\n  /* See if we can make use of the dual OF;\n     note that we do not currently adjust properly for presolve */\n  if(lp->rows == lp->presolve_undo->orig_rows)\n  if(MIP_count(lp) > 0) {\n    if(is_maxim(lp)) {\n      SETMIN(lp->bb_limitOF, dualOF);\n    }\n    else {\n      SETMAX(lp->bb_limitOF, dualOF);\n    }\n  }\n  else if(fabs(my_reldiff(dualOF, lp->solution[0])) > lp->epssolution)\n    report(lp, IMPORTANT, \"calculate_duals: Check for possible suboptimal solution!\\n\");\n#endif\n\n  return(TRUE);\n} /* construct_duals */\n\n/* Calculate sensitivity duals */\nSTATIC MYBOOL construct_sensitivity_duals(lprec *lp)\n{\n  int  k,varnr, ok = TRUE;\n  int  *workINT = NULL;\n  REAL *pcol,a,infinite,epsvalue,from,till,objfromvalue;\n\n  /* one column of the matrix */\n  FREE(lp->objfromvalue);\n  FREE(lp->dualsfrom);\n  FREE(lp->dualstill);\n  if(!allocREAL(lp, &pcol, lp->rows + 1, TRUE) ||\n     !allocREAL(lp, &lp->objfromvalue, lp->columns + 1, AUTOMATIC) ||\n     !allocREAL(lp, &lp->dualsfrom, lp->sum + 1, AUTOMATIC) ||\n     !allocREAL(lp, &lp->dualstill, lp->sum + 1, AUTOMATIC)) {\n    FREE(pcol);\n    FREE(lp->objfromvalue);\n    FREE(lp->dualsfrom);\n    FREE(lp->dualstill);\n    ok = FALSE;\n  }\n  else {\n    infinite=lp->infinite;\n    epsvalue=lp->epsmachine;\n    for(varnr=1; varnr<=lp->sum; varnr++) {\n      from=infinite;\n      till=infinite;\n      objfromvalue=infinite;\n      if (!lp->is_basic[varnr]) {\n        if (!fsolve(lp, varnr, pcol, workINT, epsvalue, 1.0, FALSE)) {  /* construct one column of the tableau */\n          ok = FALSE;\n          break;\n        }\n        /* Search for the rows(s) which first result in further iterations */\n        for (k=1; k<=lp->rows; k++) {\n          if (fabs(pcol[k])>epsvalue) {\n            a = lp->rhs[k]/pcol[k];\n            if((varnr > lp->rows) && (fabs(lp->solution[varnr]) <= epsvalue) && (a < objfromvalue) && (a >= lp->lowbo[varnr]))\n              objfromvalue = a;\n            if ((a<=0.0) && (pcol[k]<0.0) && (-a<from)) from=my_flipsign(a);\n            if ((a>=0.0) && (pcol[k]>0.0) && ( a<till)) till= a;\n            if (lp->upbo[lp->var_basic[k]] < infinite) {\n              a = (REAL) ((lp->rhs[k]-lp->upbo[lp->var_basic[k]])/pcol[k]);\n              if((varnr > lp->rows) && (fabs(lp->solution[varnr]) <= epsvalue) && (a < objfromvalue) && (a >= lp->lowbo[varnr]))\n                objfromvalue = a;\n              if ((a<=0.0) && (pcol[k]>0.0) && (-a<from)) from=my_flipsign(a);\n              if ((a>=0.0) && (pcol[k]<0.0) && ( a<till)) till= a;\n            }\n          }\n        }\n\n        if (!lp->is_lower[varnr]) {\n          a=from;\n          from=till;\n          till=a;\n        }\n        if ((varnr<=lp->rows) && (!is_chsign(lp, varnr))) {\n          a=from;\n          from=till;\n          till=a;\n        }\n      }\n\n      if (from!=infinite)\n        lp->dualsfrom[varnr]=lp->solution[varnr]-unscaled_value(lp, from, varnr);\n      else\n        lp->dualsfrom[varnr]=-infinite;\n      if (till!=infinite)\n        lp->dualstill[varnr]=lp->solution[varnr]+unscaled_value(lp, till, varnr);\n      else\n        lp->dualstill[varnr]=infinite;\n\n      if (varnr > lp->rows) {\n        if (objfromvalue != infinite) {\n          if ((!sensrejvar) || (lp->upbo[varnr] != 0.0)) {\n            if (!lp->is_lower[varnr])\n              objfromvalue = lp->upbo[varnr] - objfromvalue;\n            if ((lp->upbo[varnr] < infinite) && (objfromvalue > lp->upbo[varnr]))\n              objfromvalue = lp->upbo[varnr];\n          }\n          objfromvalue += lp->lowbo[varnr];\n          objfromvalue = unscaled_value(lp, objfromvalue, varnr);\n        }\n        else\n          objfromvalue = -infinite;\n        lp->objfromvalue[varnr - lp->rows] = objfromvalue;\n      }\n\n    }\n    FREE(pcol);\n  }\n  return((MYBOOL) ok);\n} /* construct_sensitivity_duals */\n\n/* Calculate sensitivity objective function */\nSTATIC MYBOOL construct_sensitivity_obj(lprec *lp)\n{\n  int  i, l, varnr, row_nr, ok = TRUE;\n  REAL *OrigObj = NULL, *drow = NULL, *prow = NULL,\n       sign, a, min1, min2, infinite, epsvalue, from, till;\n\n  /* objective function */\n  FREE(lp->objfrom);\n  FREE(lp->objtill);\n  if(!allocREAL(lp, &drow, lp->sum + 1, TRUE) ||\n     !allocREAL(lp, &OrigObj, lp->columns + 1, FALSE) ||\n     !allocREAL(lp, &prow, lp->sum + 1, TRUE) ||\n     !allocREAL(lp, &lp->objfrom, lp->columns + 1, AUTOMATIC) ||\n     !allocREAL(lp, &lp->objtill, lp->columns + 1, AUTOMATIC)) {\nAbandon:\n    FREE(drow);\n    FREE(OrigObj);\n    FREE(prow);\n    FREE(lp->objfrom);\n    FREE(lp->objtill);\n    ok = FALSE;\n  }\n  else {\n    int *coltarget;\n\n    infinite=lp->infinite;\n    epsvalue=lp->epsmachine;\n\n    coltarget = (int *) mempool_obtainVector(lp->workarrays, lp->columns+1, sizeof(*coltarget));\n    if(!get_colIndexA(lp, SCAN_USERVARS+USE_NONBASICVARS, coltarget, FALSE)) {\n      mempool_releaseVector(lp->workarrays, (char *) coltarget, FALSE);\n      goto Abandon;\n    }\n    bsolve(lp, 0, drow, NULL, epsvalue*DOUBLEROUND, 1.0);\n    prod_xA(lp, coltarget, drow, NULL, epsvalue, 1.0,\n                           drow, NULL, MAT_ROUNDDEFAULT | MAT_ROUNDRC);\n\n    /* original (unscaled) objective function */\n    get_row(lp, 0, OrigObj);\n    for(i = 1; i <= lp->columns; i++) {\n      from=-infinite;\n      till= infinite;\n      varnr = lp->rows + i;\n      if(!lp->is_basic[varnr]) {\n      /* only the coeff of the objective function of column i changes. */\n        a = unscaled_mat(lp, drow[varnr], 0, i);\n        if(is_maxim(lp))\n          a = -a;\n        if ((!sensrejvar) && (lp->upbo[varnr] == 0.0))\n          /* ignore, because this case doesn't results in further iterations */ ;\n        else if(((lp->is_lower[varnr] != 0) == (is_maxim(lp) == FALSE)) && (a > -epsvalue))\n          from = OrigObj[i] - a; /* less than this value gives further iterations */\n        else\n          till = OrigObj[i] - a; /* bigger than this value gives further iterations */\n      }\n      else {\n      /* all the coeff of the objective function change. Search the minimal change needed for further iterations */\n        for(row_nr=1;\n            (row_nr<=lp->rows) && (lp->var_basic[row_nr]!=varnr); row_nr++)\n          /* Search on which row the variable exists in the basis */ ;\n        if(row_nr<=lp->rows) {       /* safety test; should always be found ... */\n          /* Construct one row of the tableau */\n          bsolve(lp, row_nr, prow, NULL, epsvalue*DOUBLEROUND, 1.0);\n          prod_xA(lp, coltarget, prow, NULL, epsvalue, 1.0,\n                                 prow, NULL, MAT_ROUNDDEFAULT);\n          /* sign = my_chsign(is_chsign(lp, row_nr), -1); */\n          sign = my_chsign(lp->is_lower[row_nr], -1);\n          min1=infinite;\n          min2=infinite;\n          for(l=1; l<=lp->sum; l++)   /* search for the column(s) which first results in further iterations */\n            if ((!lp->is_basic[l]) && (lp->upbo[l]>0.0) &&\n                (fabs(prow[l])>epsvalue) && (drow[l]*(lp->is_lower[l] ? -1 : 1)<epsvalue)) {\n              a = unscaled_mat(lp, fabs(drow[l] / prow[l]), 0, i);\n              if(prow[l]*sign*(lp->is_lower[l] ? 1 : -1) < 0.0) {\n                if(a < min1)\n                  min1 = a;\n              }\n              else {\n                if(a < min2)\n                  min2 = a;\n              }\n            }\n          if ((lp->is_lower[varnr] == 0) == (is_maxim(lp) == FALSE)) {\n            a = min1;\n            min1 = min2;\n            min2 = a;\n          }\n          if (min1<infinite)\n            from = OrigObj[i]-min1;\n          if (min2<infinite)\n            till = OrigObj[i]+min2;\n          a = lp->solution[varnr];\n          if (is_maxim(lp)) {\n            if (a - lp->lowbo[varnr] < epsvalue)\n              from = -infinite; /* if variable is at lower bound then decrementing objective coefficient will not result in extra iterations because it would only extra decrease the value, but since it is at its lower bound ... */\n            else if (((!sensrejvar) || (lp->upbo[varnr] != 0.0)) && (lp->lowbo[varnr] + lp->upbo[varnr] - a < epsvalue))\n              till = infinite;  /* if variable is at upper bound then incrementing objective coefficient will not result in extra iterations because it would only extra increase the value, but since it is at its upper bound ... */\n          }\n          else {\n            if (a - lp->lowbo[varnr] < epsvalue)\n              till = infinite;  /* if variable is at lower bound then incrementing objective coefficient will not result in extra iterations because it would only extra decrease the value, but since it is at its lower bound ... */\n            else if (((!sensrejvar) || (lp->upbo[varnr] != 0.0)) && (lp->lowbo[varnr] + lp->upbo[varnr] - a < epsvalue))\n              from = -infinite; /* if variable is at upper bound then decrementing objective coefficient will not result in extra iterations because it would only extra increase the value, but since it is at its upper bound ... */\n          }\n        }\n      }\n      lp->objfrom[i]=from;\n      lp->objtill[i]=till;\n    }\n    mempool_releaseVector(lp->workarrays, (char *) coltarget, FALSE);\n  }\n  FREE(prow);\n  FREE(OrigObj);\n  FREE(drow);\n\n  return((MYBOOL) ok);\n} /* construct_sensitivity_obj */\n\nSTATIC MYBOOL refactRecent(lprec *lp)\n{\n  int pivcount = lp->bfp_pivotcount(lp);\n  if(pivcount == 0)\n    return( AUTOMATIC );\n  else if (pivcount < 2*DEF_MAXPIVOTRETRY)\n    return( TRUE );\n  else\n    return( FALSE );\n}\n\nSTATIC MYBOOL check_if_less(lprec *lp, REAL x, REAL y, int variable)\n{\n  if(y < x-scaled_value(lp, lp->epsint, variable)) {\n    if(lp->bb_trace)\n      report(lp, NORMAL, \"check_if_less: Invalid new bound %g should be < %g for %s\\n\",\n                         x, y, get_col_name(lp, variable));\n    return(FALSE);\n  }\n  else\n    return(TRUE);\n}\n\n/* Various basis utility routines */\n\nSTATIC int findNonBasicSlack(lprec *lp, MYBOOL *is_basic)\n{\n  int i;\n\n  for(i = lp->rows; i > 0; i--)\n    if(!is_basic[i])\n      break;\n  return( i );\n}\n\nSTATIC int findBasisPos(lprec *lp, int notint, int *var_basic)\n{\n  int i;\n\n  if(var_basic == NULL)\n    var_basic = lp->var_basic;\n  for(i = lp->rows; i > 0; i--)\n    if(var_basic[i] == notint)\n      break;\n  return( i );\n}\n\nSTATIC void replaceBasisVar(lprec *lp, int rownr, int var, int *var_basic, MYBOOL *is_basic)\n{\n  int out;\n\n  out = var_basic[rownr];\n  var_basic[rownr] = var;\n  is_basic[out] = FALSE;\n  is_basic[var] = TRUE;\n}\n\nSTATIC void free_duals(lprec *lp)\n{\n  FREE(lp->duals);\n  FREE(lp->full_duals);\n  FREE(lp->dualsfrom);\n  FREE(lp->dualstill);\n  FREE(lp->objfromvalue);\n  FREE(lp->objfrom);\n  FREE(lp->objtill);\n}\n\n/* Transform RHS by adjusting for the bound state of variables;\n   optionally rebase upper bound, and account for this in later calls */\nSTATIC void initialize_solution(lprec *lp, MYBOOL shiftbounds)\n{\n  int     i, k1, k2, *matRownr, colnr;\n  LREAL   theta;\n  REAL    value, *matValue, loB, upB;\n  MATrec  *mat = lp->matA;\n\n  /* Set bounding status indicators */\n  if(lp->bb_bounds != NULL) {\n    if(shiftbounds == INITSOL_SHIFTZERO) {\n      if(lp->bb_bounds->UBzerobased)\n        report(lp, SEVERE, \"initialize_solution: The upper bounds are already zero-based at refactorization %d\\n\",\n                           lp->bfp_refactcount(lp, BFP_STAT_REFACT_TOTAL));\n      lp->bb_bounds->UBzerobased = TRUE;\n    }\n    else if(!lp->bb_bounds->UBzerobased)\n        report(lp, SEVERE, \"initialize_solution: The upper bounds are not zero-based at refactorization %d\\n\",\n                           lp->bfp_refactcount(lp, BFP_STAT_REFACT_TOTAL));\n  }\n\n  /* Initialize the working RHS/basic variable solution vector */\n  i = is_action(lp->anti_degen, ANTIDEGEN_RHSPERTURB) && (lp->monitor != NULL) && lp->monitor->active;\n  if(sizeof(*lp->rhs) == sizeof(*lp->orig_rhs) && !i) {\n    MEMCOPY(lp->rhs, lp->orig_rhs, lp->rows+1);\n  }\n  else if(i) {\n    lp->rhs[0] = lp->orig_rhs[0];\n    for(i = 1; i <= lp->rows; i++) {\n      if(is_constr_type(lp, i, EQ))\n        theta = rand_uniform(lp, lp->epsvalue);\n      else {\n        theta = rand_uniform(lp, lp->epsperturb);\n/*        if(lp->orig_upbo[i] < lp->infinite)\n          lp->orig_upbo[i] += theta; */\n      }\n      lp->rhs[i] = lp->orig_rhs[i] + theta;\n    }\n  }\n  else\n    for(i = 0; i <= lp->rows; i++)\n      lp->rhs[i] = lp->orig_rhs[i];\n\n/* Adjust active RHS for variables at their active upper/lower bounds */\n  for(i = 1; i <= lp->sum; i++) {\n\n    upB = lp->upbo[i];\n    loB = lp->lowbo[i];\n\n    /* Shift to \"ranged\" upper bound, tantamount to defining zero-based variables */\n    if(shiftbounds == INITSOL_SHIFTZERO) {\n      if((loB > -lp->infinite) && (upB < lp->infinite))\n        lp->upbo[i] -= loB;\n      if(lp->upbo[i] < 0)\n        report(lp, SEVERE, \"initialize_solution: Invalid rebounding; variable %d at refact %d, iter %.0f\\n\",\n                           i, lp->bfp_refactcount(lp, BFP_STAT_REFACT_TOTAL), (double) get_total_iter(lp));\n    }\n\n    /* Use \"ranged\" upper bounds */\n    else if(shiftbounds == INITSOL_USEZERO) {\n      if((loB > -lp->infinite) && (upB < lp->infinite))\n        upB += loB;\n    }\n\n    /* Shift upper bound back to original value */\n    else if(shiftbounds == INITSOL_ORIGINAL) {\n      if((loB > -lp->infinite) && (upB < lp->infinite)) {\n        lp->upbo[i] += loB;\n        upB += loB;\n      }\n      continue;\n    }\n    else\n      report(lp, SEVERE, \"initialize_solution: Invalid option value '%d'\\n\",\n                         shiftbounds);\n\n    /* Set the applicable adjustment */\n    if(lp->is_lower[i])\n      theta = loB;\n    else\n      theta = upB;\n\n\n    /* Check if we need to pass through the matrix;\n       remember that basis variables are always lower-bounded */\n    if(theta == 0)\n      continue;\n\n    /* Do user and artificial variables */\n    if(i > lp->rows) {\n\n      /* Get starting and ending indeces in the NZ vector */\n      colnr = i - lp->rows;\n      k1 = mat->col_end[colnr - 1];\n      k2 = mat->col_end[colnr];\n      matRownr = &COL_MAT_ROWNR(k1);\n      matValue = &COL_MAT_VALUE(k1);\n\n      /* Get the objective as row 0, optionally adjusting the objective for phase 1 */\n      value = get_OF_active(lp, i, theta);\n      lp->rhs[0] -= value;\n\n      /* Do the normal case */\n      for(; k1 < k2;\n          k1++, matRownr += matRowColStep, matValue += matValueStep) {\n        lp->rhs[*matRownr] -= theta * (*matValue);\n      }\n    }\n\n    /* Do slack variables (constraint \"bounds\")*/\n    else {\n      lp->rhs[i] -= theta;\n    }\n\n  }\n\n  /* Do final pass to get the maximum value */\n  i = idamax(lp->rows /* +1 */, lp->rhs, 1);\n  lp->rhsmax = fabs(lp->rhs[i]);\n\n  if(shiftbounds == INITSOL_SHIFTZERO)\n    clear_action(&lp->spx_action, ACTION_REBASE);\n\n}\n\n/* This routine recomputes the basic variables using the full inverse */\nSTATIC void recompute_solution(lprec *lp, MYBOOL shiftbounds)\n{\n  /* Compute RHS = b - A(n)*x(n) */\n  initialize_solution(lp, shiftbounds);\n\n  /* Compute x(b) = Inv(B)*RHS (Ref. lp_solve inverse logic and Chvatal p. 121) */\n  lp->bfp_ftran_normal(lp, lp->rhs, NULL);\n  if(!lp->obj_in_basis) {\n    int i, ib, n = lp->rows;\n    for(i = 1; i <= n; i++) {\n      ib = lp->var_basic[i];\n      if(ib > n)\n        lp->rhs[0] -= get_OF_active(lp, ib, lp->rhs[i]);\n    }\n  }\n\n /* Round the values (should not be greater than the factor used in bfp_pivotRHS) */\n  roundVector(lp->rhs, lp->rows, lp->epsvalue);\n\n  clear_action(&lp->spx_action, ACTION_RECOMPUTE);\n}\n\n/* This routine compares an existing basic solution to a recomputed one;\n   Note that the routine must provide for the possibility that the order of the\n   basis variables can be changed by the inversion engine. */\nSTATIC int verify_solution(lprec *lp, MYBOOL reinvert, char *info)\n{\n  int  i, ii, n, *oldmap, *newmap, *refmap = NULL;\n  REAL *oldrhs, err, errmax;\n\n  allocINT(lp, &oldmap, lp->rows+1, FALSE);\n  allocINT(lp, &newmap, lp->rows+1, FALSE);\n  allocREAL(lp, &oldrhs, lp->rows+1, FALSE);\n\n  /* Get sorted mapping of the old basis */\n  for(i = 0; i <= lp->rows; i++)\n    oldmap[i] = i;\n  if(reinvert) {\n    allocINT(lp, &refmap, lp->rows+1, FALSE);\n    MEMCOPY(refmap, lp->var_basic, lp->rows+1);\n    sortByINT(oldmap, refmap, lp->rows, 1, TRUE);\n  }\n\n  /* Save old and calculate the new RHS vector */\n  MEMCOPY(oldrhs, lp->rhs, lp->rows+1);\n  if(reinvert)\n    invert(lp, INITSOL_USEZERO, FALSE);\n  else\n    recompute_solution(lp, INITSOL_USEZERO);\n\n  /* Get sorted mapping of the new basis */\n  for(i = 0; i <= lp->rows; i++)\n    newmap[i] = i;\n  if(reinvert) {\n    MEMCOPY(refmap, lp->var_basic, lp->rows+1);\n    sortByINT(newmap, refmap, lp->rows, 1, TRUE);\n  }\n\n  /* Identify any gap */\n  errmax = 0;\n  ii = -1;\n  n = 0;\n  for(i = lp->rows; i > 0; i--) {\n    err = fabs(my_reldiff(oldrhs[oldmap[i]], lp->rhs[newmap[i]]));\n    if(err > lp->epsprimal) {\n      n++;\n      if(err > errmax) {\n        ii = i;\n        errmax = err;\n      }\n    }\n  }\n  err = fabs(my_reldiff(oldrhs[i], lp->rhs[i]));\n  if(err < lp->epspivot) {\n    i--;\n    err = 0;\n  }\n  else {\n    n++;\n    if(ii < 0) {\n      ii = 0;\n      errmax = err;\n    }\n  }\n  if(n > 0) {\n    report(lp, IMPORTANT, \"verify_solution: Iter %.0f %s - %d errors; OF %g, Max @row %d %g\\n\",\n                           (double) get_total_iter(lp), my_if(info == NULL, \"\", info), n, err, newmap[ii], errmax);\n  }\n  /* Copy old results back (not possible for inversion) */\n  if(!reinvert)\n    MEMCOPY(lp->rhs, oldrhs, lp->rows+1);\n\n  FREE(oldmap);\n  FREE(newmap);\n  FREE(oldrhs);\n  if(reinvert)\n    FREE(refmap);\n\n  return( ii );\n\n}\n\n/* Preprocessing and postprocessing functions */\nSTATIC int identify_GUB(lprec *lp, MYBOOL mark)\n{\n  int    i, j, jb, je, k, knint, srh;\n  REAL   rh, mv, tv, bv;\n  MATrec *mat = lp->matA;\n\n  if((lp->equalities == 0) || !mat_validate(mat))\n    return( 0 );\n\n  k = 0;\n  for(i = 1; i <= lp->rows; i++) {\n\n    /* Check if it is an equality constraint */\n    if(!is_constr_type(lp, i, EQ))\n      continue;\n\n    rh = get_rh(lp, i);\n    srh = my_sign(rh);\n    knint = 0;\n    je = mat->row_end[i];\n    for(jb = mat->row_end[i-1]; jb < je; jb++) {\n      j = ROW_MAT_COLNR(jb);\n\n      /* Check for validity of the equation elements */\n      if(!is_int(lp, j))\n        knint++;\n      if(knint > 1)\n        break;\n\n      mv = get_mat_byindex(lp, jb, TRUE, FALSE);\n      if(fabs(my_reldiff(mv, rh)) > lp->epsprimal)\n        break;\n\n      tv = mv*get_upbo(lp, j);\n      bv = get_lowbo(lp, j);\n#if 0 /* Requires 1 as upper bound */\n      if((fabs(my_reldiff(tv, rh)) > lp->epsprimal) || (bv != 0))\n#else /* Can handle any upper bound >= 1 */\n      if((srh*(tv-rh) < -lp->epsprimal) || (bv != 0))\n#endif\n        break;\n    }\n\n    /* Update GUB count and optionally mark the GUB */\n    if(jb == je) {\n      k++;\n      if(mark == TRUE)\n        lp->row_type[i] |= ROWTYPE_GUB;\n      else if(mark == AUTOMATIC)\n        break;\n    }\n\n  }\n  return( k );\n}\n\nSTATIC int prepare_GUB(lprec *lp)\n{\n  int    i, j, jb, je, k, *members = NULL;\n  REAL   rh;\n  char   GUBname[16];\n  MATrec *mat = lp->matA;\n\n  if((lp->equalities == 0) ||\n     !allocINT(lp, &members, lp->columns+1, TRUE) ||\n     !mat_validate(mat))\n    return( 0 );\n\n  for(i = 1; i <= lp->rows; i++) {\n\n    /* Check if it has been marked as a GUB */\n    if(!(lp->row_type[i] & ROWTYPE_GUB))\n      continue;\n\n    /* Pick up the GUB column indeces */\n    k = 0;\n    je = mat->row_end[i];\n    for(jb = mat->row_end[i-1], k = 0; jb < je; jb++) {\n      members[k] = ROW_MAT_COLNR(jb);\n      k++;\n    }\n\n    /* Add the GUB */\n    j = GUB_count(lp) + 1;\n    sprintf(GUBname, \"GUB_%d\", i);\n    add_GUB(lp, GUBname, j, k, members);\n\n    /* Unmark the GUBs */\n    clear_action(&(lp->row_type[i]), ROWTYPE_GUB);\n\n    /* Standardize coefficients to 1 if necessary */\n    rh = get_rh(lp, i);\n    if(fabs(my_reldiff(rh, 1)) > lp->epsprimal) {\n      set_rh(lp, i, 1);\n      for(jb = mat->row_end[i-1]; jb < je; jb++) {\n        j = ROW_MAT_COLNR(jb);\n        set_mat(lp, i,j, 1);\n      }\n    }\n\n  }\n  FREE(members);\n  return(GUB_count(lp));\n}\n\n/* Pre- and post processing functions, i.a. splitting free variables */\nSTATIC MYBOOL pre_MIPOBJ(lprec *lp)\n{\n#ifdef MIPboundWithOF\n  if(MIP_count(lp) > 0) {\n    int i = 1;\n    while((i <= lp->rows) && !mat_equalRows(lp->matA, 0, i) && !is_constr_type(lp, i, EQ))\n      i++;\n    if(i <= lp->rows)\n      lp->constraintOF = i;\n  }\n#endif\n  lp->bb_deltaOF = MIP_stepOF(lp);\n  return( TRUE );\n}\nSTATIC MYBOOL post_MIPOBJ(lprec *lp)\n{\n#ifdef MIPboundWithOF\n/*\n  if(lp->constraintOF) {\n    del_constraint(lp, lp->rows);\n    if(is_BasisReady(lp) && !verify_basis(lp))\n      return( FALSE );\n  }\n*/\n#endif\n  return( TRUE );\n}\n\nint preprocess(lprec *lp)\n{\n  int    i, j, k, ok = TRUE, *new_index = NULL;\n  REAL   hold, *new_column = NULL;\n  MYBOOL scaled, primal1, primal2;\n\n /* do not process if already preprocessed */\n  if(lp->wasPreprocessed)\n    return( ok );\n\n  /* Write model statistics and optionally initialize partial pricing structures */\n  if(lp->lag_status != RUNNING) {\n    MYBOOL doPP;\n\n    /* Extract the user-specified simplex strategy choices */\n    primal1 = (MYBOOL) (lp->simplex_strategy & SIMPLEX_Phase1_PRIMAL);\n    primal2 = (MYBOOL) (lp->simplex_strategy & SIMPLEX_Phase2_PRIMAL);\n\n    /* Initialize partial pricing structures */\n    doPP = is_piv_mode(lp, PRICE_PARTIAL | PRICE_AUTOPARTIAL);\n/*    doPP &= (MYBOOL) (lp->columns / 2 > lp->rows); */\n    if(doPP) {\n      i = partial_findBlocks(lp, FALSE, FALSE);\n      if(i < 4)\n        i = (int) (5 * log((REAL) lp->columns / lp->rows));\n      report(lp, NORMAL, \"The model is %s to have %d column blocks/stages.\\n\",\n                         (i > 1 ? \"estimated\" : \"set\"), i);\n      set_partialprice(lp, i, NULL, FALSE);\n    }\n/*    doPP &= (MYBOOL) (lp->rows / 4 > lp->columns); */\n    if(doPP) {\n      i = partial_findBlocks(lp, FALSE, TRUE);\n      if(i < 4)\n        i = (int) (5 * log((REAL) lp->rows / lp->columns));\n      report(lp, NORMAL, \"The model is %s to have %d row blocks/stages.\\n\",\n                         (i > 1 ? \"estimated\" : \"set\"), i);\n      set_partialprice(lp, i, NULL, TRUE);\n    }\n\n    /* Check for presence of valid pricing blocks if partial pricing\n      is defined, but not autopartial is not set */\n    if(!doPP && is_piv_mode(lp, PRICE_PARTIAL)) {\n      if((lp->rowblocks == NULL) || (lp->colblocks == NULL)) {\n        report(lp, IMPORTANT, \"Ignoring partial pricing, since block structures are not defined.\\n\");\n        clear_action(&lp->piv_strategy, PRICE_PARTIAL);\n      }\n    }\n\n    /* Initialize multiple pricing block divisor */\n#if 0\n    if(primal1 || primal2)\n      lp->piv_strategy |= PRICE_MULTIPLE | PRICE_AUTOMULTIPLE;\n#endif\n    if(is_piv_mode(lp, PRICE_MULTIPLE) && (primal1 || primal2)) {\n      doPP = is_piv_mode(lp, PRICE_AUTOMULTIPLE);\n      if(doPP) {\n        i = (int) (2.5*log((REAL) lp->sum));\n        SETMAX( i, 1);\n        set_multiprice(lp, i);\n      }\n      if(lp->multiblockdiv > 1)\n      report(lp, NORMAL, \"Using %d-candidate primal simplex multiple pricing block.\\n\",\n                          lp->columns / lp->multiblockdiv);\n    }\n    else\n      set_multiprice(lp, 1);\n\n    report(lp, NORMAL, \"Using %s simplex for phase 1 and %s simplex for phase 2.\\n\",\n                       my_if(primal1, \"PRIMAL\", \"DUAL\"), my_if(primal2, \"PRIMAL\", \"DUAL\"));\n    i = get_piv_rule(lp);\n    if((i == PRICER_STEEPESTEDGE) && is_piv_mode(lp, PRICE_PRIMALFALLBACK))\n      report(lp, NORMAL, \"The pricing strategy is set to '%s' for the dual and '%s' for the primal.\\n\",\n                       get_str_piv_rule(i), get_str_piv_rule(i-1));\n    else\n      report(lp, NORMAL, \"The primal and dual simplex pricing strategy set to '%s'.\\n\",\n                       get_str_piv_rule(i));\n\n    report(lp, NORMAL, \" \\n\");\n  }\n\n  /* Compute a minimum step improvement step requirement */\n  pre_MIPOBJ(lp);\n\n /* First create extra columns for FR variables or flip MI variables */\n  for (j = 1; j <= lp->columns; j++) {\n\n#ifdef Paranoia\n    if((lp->rows != lp->matA->rows) || (lp->columns != lp->matA->columns))\n      report(lp, SEVERE, \"preprocess: Inconsistent variable counts found\\n\");\n#endif\n\n   /* First handle sign-flipping of variables:\n       1) ... with a finite upper bound and a negative Inf-bound (since basis variables are lower-bounded)\n       2) ... with bound assymetry within negrange limits (for stability reasons) */\n    i = lp->rows + j;\n    hold = lp->orig_upbo[i];\n/*\n    if((hold <= 0) || (!is_infinite(lp, lp->negrange) &&\n                       (hold < -lp->negrange) &&\n                       (lp->orig_lowbo[i] <= lp->negrange)) ) {\n*/\n#define fullybounded FALSE\n    if( ((hold < lp->infinite) && my_infinite(lp, lp->orig_lowbo[i])) ||\n        (!fullybounded && !my_infinite(lp, lp->negrange) &&\n         (hold < -lp->negrange) && (lp->orig_lowbo[i] <= lp->negrange)) ) {\n      /* Delete split sibling variable if one existed from before */\n      if((lp->var_is_free != NULL) && (lp->var_is_free[j] > 0))\n        del_column(lp, lp->var_is_free[j]);\n      /* Negate the column / flip to the positive range */\n      mat_multcol(lp->matA, j, -1, TRUE);\n      if(lp->var_is_free == NULL) {\n        if(!allocINT(lp, &lp->var_is_free, MAX(lp->columns, lp->columns_alloc) + 1, TRUE))\n          return(FALSE);\n      }\n      lp->var_is_free[j] = -j; /* Indicator UB and LB are switched, with no helper variable added */\n      lp->orig_upbo[i] = my_flipsign(lp->orig_lowbo[i]);\n      lp->orig_lowbo[i] = my_flipsign(hold);\n      /* Check for presence of negative ranged SC variable */\n      if(lp->sc_lobound[j] > 0) {\n        lp->sc_lobound[j] = lp->orig_lowbo[i];\n        lp->orig_lowbo[i] = 0;\n      }\n    }\n   /* Then deal with -+, full-range/FREE variables by creating a helper variable */\n    else if((lp->orig_lowbo[i] <= lp->negrange) && (hold >= -lp->negrange)) {\n      if(lp->var_is_free == NULL) {\n        if(!allocINT(lp, &lp->var_is_free, MAX(lp->columns,lp->columns_alloc) + 1, TRUE))\n          return(FALSE);\n      }\n      if(lp->var_is_free[j] <= 0) { /* If this variable wasn't split yet ... */\n        if(SOS_is_member(lp->SOS, 0, i - lp->rows)) {   /* Added */\n          report(lp, IMPORTANT, \"preprocess: Converted negative bound for SOS variable %d to zero\",\n                                i - lp->rows);\n          lp->orig_lowbo[i] = 0;\n          continue;\n        }\n        if(new_column == NULL) {\n          if(!allocREAL(lp, &new_column, lp->rows + 1, FALSE) ||\n             !allocINT(lp, &new_index, lp->rows + 1, FALSE)) {\n            ok = FALSE;\n            break;\n          }\n        }\n       /* Avoid precision loss by turning off unscaling and rescaling */\n       /* in get_column and add_column operations; also make sure that */\n       /* full scaling information is preserved */\n        scaled = lp->scaling_used;\n        lp->scaling_used = FALSE;\n        k = get_columnex(lp, j, new_column, new_index);\n        if(!add_columnex(lp, k, new_column, new_index)) {\n          ok = FALSE;\n          break;\n        }\n        mat_multcol(lp->matA, lp->columns, -1, TRUE);\n        if(scaled)\n          lp->scalars[lp->rows+lp->columns] = lp->scalars[i];\n        lp->scaling_used = (MYBOOL) scaled;\n        /* Only create name if we are not clearing a pre-used item, since this\n           variable could have been deleted by presolve but the name is required\n           for solution reconstruction. */\n        if(lp->names_used && (lp->col_name[j] == NULL)) {\n          char fieldn[50];\n\n          sprintf(fieldn, \"__AntiBodyOf(%d)__\", j);\n          if(!set_col_name(lp, lp->columns, fieldn)) {\n/*          if (!set_col_name(lp, lp->columns, get_col_name(lp, j))) { */\n            ok = FALSE;\n            break;\n          }\n        }\n        /* Set (positive) index to the original column's split / helper and back */\n        lp->var_is_free[j] = lp->columns;\n      }\n      lp->orig_upbo[lp->rows + lp->var_is_free[j]] = my_flipsign(lp->orig_lowbo[i]);\n      lp->orig_lowbo[i] = 0;\n\n      /* Negative index indicates x is split var and -var_is_free[x] is index of orig var */\n      lp->var_is_free[lp->var_is_free[j]] = -j;\n      lp->var_type[lp->var_is_free[j]] = lp->var_type[j];\n    }\n   /* Check for positive ranged SC variables */\n    else if(lp->sc_lobound[j] > 0) {\n      lp->sc_lobound[j] = lp->orig_lowbo[i];\n      lp->orig_lowbo[i] = 0;\n    }\n\n   /* Tally integer variables in SOS'es */\n    if(SOS_is_member(lp->SOS, 0, j) && is_int(lp, j))\n      lp->sos_ints++;\n  }\n\n  FREE(new_column);\n  FREE(new_index);\n\n  /* Fill lists of GUB constraints, if appropriate */\n  if((MIP_count(lp) > 0) && is_bb_mode(lp, NODE_GUBMODE) && (identify_GUB(lp, AUTOMATIC) > 0))\n    prepare_GUB(lp);\n\n  /* (Re)allocate reduced cost arrays */\n  ok = allocREAL(lp, &(lp->drow), lp->sum+1, AUTOMATIC) &&\n       allocINT(lp, &(lp->nzdrow), lp->sum+1, AUTOMATIC);\n  if(ok)\n    lp->nzdrow[0] = 0;\n\n  /* Minimize memory usage */\n  memopt_lp(lp, 0, 0, 0);\n\n  lp->wasPreprocessed = TRUE;\n\n  return(ok);\n}\n\nvoid postprocess(lprec *lp)\n{\n  int i,ii,j;\n  REAL hold;\n\n /* Check if the problem actually was preprocessed */\n  if(!lp->wasPreprocessed)\n    return;\n\n /* Must compute duals here in case we have free variables; note that in\n    this case sensitivity analysis is not possible unless done here */\n  if((lp->bb_totalnodes == 0) && (lp->var_is_free == NULL)) {\n    if(is_presolve(lp, PRESOLVE_DUALS))\n      construct_duals(lp);\n    if(is_presolve(lp, PRESOLVE_SENSDUALS))\n      if(!construct_sensitivity_duals(lp) || !construct_sensitivity_obj(lp))\n        report(lp, IMPORTANT, \"postprocess: Unable to allocate working memory for duals.\\n\");\n  }\n\n /* Loop over all columns */\n  for (j = 1; j <= lp->columns; j++) {\n    i = lp->rows + j;\n   /* Reconstruct strictly negative values */\n    if((lp->var_is_free != NULL) && (lp->var_is_free[j] < 0)) {\n      /* Check if we have the simple case where the UP and LB are negated and switched */\n      if(-lp->var_is_free[j] == j) {\n        mat_multcol(lp->matA, j, -1, TRUE);\n        hold = lp->orig_upbo[i];\n        lp->orig_upbo[i] = my_flipsign(lp->orig_lowbo[i]);\n        lp->orig_lowbo[i] = my_flipsign(hold);\n        lp->best_solution[i] = my_flipsign(lp->best_solution[i]);\n        transfer_solution_var(lp, j);\n\n        /* hold = lp->objfrom[j];\n        lp->objfrom[j] = my_flipsign(lp->objtill[j]);\n        lp->objtill[j] = my_flipsign(hold); */ /* under investigation <peno> */\n\n        /* lp->duals[i] = my_flipsign(lp->duals[i]);\n        hold = lp->dualsfrom[i];\n        lp->dualsfrom[i] = my_flipsign(lp->dualstill[i]);\n        lp->dualstill[i] = my_flipsign(hold); */ /* under investigation <peno> */\n       /* Bound switch undone, so clear the status */\n        lp->var_is_free[j] = 0;\n       /* Adjust negative ranged SC */\n        if(lp->sc_lobound[j] > 0)\n          lp->orig_lowbo[lp->rows + j] = -lp->sc_lobound[j];\n      }\n      /* Ignore the split / helper columns (will be deleted later) */\n    }\n   /* Condense values of extra columns of quasi-free variables split in two */\n    else if((lp->var_is_free != NULL) && (lp->var_is_free[j] > 0)) {\n      ii = lp->var_is_free[j]; /* Index of the split helper var */\n      /* if(lp->objfrom[j] == -lp->infinite)\n        lp->objfrom[j] = -lp->objtill[ii];\n      lp->objtill[ii] = lp->infinite;\n      if(lp->objtill[j] == lp->infinite)\n        lp->objtill[j] = my_flipsign(lp->objfrom[ii]);\n      lp->objfrom[ii] = -lp->infinite; */ /* under investigation <peno> */\n\n      ii += lp->rows;\n      lp->best_solution[i] -= lp->best_solution[ii]; /* join the solution again */\n      transfer_solution_var(lp, j);\n      lp->best_solution[ii] = 0;\n\n      /* if(lp->duals[i] == 0)\n        lp->duals[i] = my_flipsign(lp->duals[ii]);\n      lp->duals[ii] = 0;\n      if(lp->dualsfrom[i] == -lp->infinite)\n        lp->dualsfrom[i] = my_flipsign(lp->dualstill[ii]);\n      lp->dualstill[ii] = lp->infinite;\n      if(lp->dualstill[i] == lp->infinite)\n        lp->dualstill[i] = my_flipsign(lp->dualsfrom[ii]);\n      lp->dualsfrom[ii] = -lp->infinite; */ /* under investigation <peno> */\n\n      /* Reset to original bound */\n      lp->orig_lowbo[i] = my_flipsign(lp->orig_upbo[ii]);\n    }\n   /* Adjust for semi-continuous variables */\n    else if(lp->sc_lobound[j] > 0) {\n      lp->orig_lowbo[i] = lp->sc_lobound[j];\n    }\n  }\n\n  /* Remove any split column helper variables */\n  del_splitvars(lp);\n  post_MIPOBJ(lp);\n\n  /* Do extended reporting, if specified */\n  if(lp->verbose > NORMAL) {\n    REPORT_extended(lp);\n\n  }\n\n  lp->wasPreprocessed = FALSE;\n}\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_lib.h",
    "content": "\n#ifndef HEADER_lp_lib\n#define HEADER_lp_lib\n\n/* --------------------------------------------------------------------------\n\n  This is the main library header file for the lp_solve v5.0 release\n\n  Starting at version 3.0, LP_Solve is released under the LGPL license.\n  For full information, see the enclosed file LGPL.txt.\n\n  Original developer:   Michel Berkelaar  -  michel@ics.ele.tue.nl\n  Most changes 1.5-2.0: Jeroen Dirks      -  jeroend@tor.numetrix.com\n  Changes 3.2-4.0:      Kjell Eikland     -  kjell.eikland@broadpark.no\n                        (Simplex code, SOS, SC, code optimization)\n                        Peter Notebaert   -  lpsolve@peno.be\n                        (Sensitivity analysis, documentation)\n  Changes 5.0+:         Kjell Eikland     -  kjell.eikland@broadpark.no\n                        (BFP, XLI, simplex, B&B, code modularization)\n                        Peter Notebaert   -  lpsolve@peno.be\n                        (Sensitivity analysis, New lp parser, LINDO (XLI)\n                        parser, VB/.NET interface, documentation)\n\n  Release notes:\n\n  Version 4.0 enhances version 3.2 in terms of internal program/simplex\n  architecture, call level interfaces, data layout, features and contains\n  several bug fixes.  There is now complete support for semi-continuous\n  variables and SOS constructions.  In the process, a complete API\n  was added. The MPS parser has been amended to support this.\n  Sensitivity analysis and variouse bug fixes was provided by Peter\n  Notebaert in 4.0 sub-releases.  Peter also wrote a complete\n  documentation of the API and contributed a VB interface, both of which\n  significantly enhanced the accessibility of lp_solve.\n\n  Version 5.0 is a major rewrite and code cleanup.  The main additions that\n  drove forward this cleanup were the modular inversion logic with optimal\n  column ordering, addition of primal phase 1 and dual phase 2 logic for\n  full flexibility in the selection of primal and dual simplex modes,\n  DEVEX and steepest edge pivot selection, along with dynamic cycling\n  detection and prevention.  This cleanup made it possible to harmonize the\n  internal rounding principles, contributing to increased numerical stability.\n\n  Version 5.1 rearranges the matrix storage model by enabling both legacy\n  element record-based storage and split vector storage.  In addition the\n  lprec structure is optimized and additional routines are added, mainly for\n  sparse vector additions and enhanced XLI functionality.  Support for XML-\n  based models was added on the basis of the LPFML schema via xli_LPFML.\n\n  Version 5.2 removes the objective function from the constraint matrix,\n  adds a number of presolve options and speed them up.  Degeneracy handling\n  is significantly improved. Support for XLI_ZIMPL was added.\n  Multiple and partial pricing has been enhanced and activated.\n\n  -------------------------------------------------------------------------- */\n/* Define user program feature option switches                               */\n/* ------------------------------------------------------------------------- */\n\n# if defined _WIN32 && !defined __GNUC__\n#  define isnan _isnan\n# endif\n#if defined NOISNAN\n# define isnan(x) FALSE\n#endif\n\n#define SETMASK(variable, mask)     variable |= mask\n#define CLEARMASK(variable, mask)   variable &= ~(mask)\n#define TOGGLEMASK(variable, mask)  variable ^= mask\n#define ISMASKSET(variable, mask)   (MYBOOL) (((variable) & (mask)) != 0)\n\n/* Utility/system settings                                                   */\n/* ------------------------------------------------------------------------- */\n/*#define INTEGERTIME */                    /* Set use of lower-resolution timer */\n\n\n/* New v5.0+ simplex/optimization features and settings                      */\n/* ------------------------------------------------------------------------- */\n/*#define NoRowScaleOF */               /* Optionally skip row-scaling of the OF */\n#define DoMatrixRounding                  /* Round A matrix elements to precision */\n#define DoBorderRounding            /* Round RHS, bounds and ranges to precision */\n#define Phase1EliminateRedundant        /* Remove rows of redundant artificials  */\n#define FixViolatedOptimal\n#define ImproveSolutionPrecision                 /* Round optimal solution values */\n/*#define IncreasePivotOnReducedAccuracy */  /* Increase epspivot on instability */\n/*#define FixInaccurateDualMinit */     /* Reinvert on inaccuracy in dual minits */\n/*#define EnforcePositiveTheta */        /* Ensure that the theta range is valid */\n#define ResetMinitOnReinvert\n/*#define UsePrimalReducedCostUpdate */                            /* Not tested */\n/*#define UseDualReducedCostUpdate */      /* Seems Ok, but slower than expected */\n/*#ifdef UseLegacyExtrad */                     /* Use v3.2- style Extrad method */\n#define UseMilpExpandedRCF         /* Non-ints in reduced cost bound tightening */\n/*#define UseMilpSlacksRCF */  /* Slacks in reduced cost bound tightening (degen\n                                  prone); requires !SlackInitMinusInf */\n#define LegacySlackDefinition      /* Slack as the \"value of the constraint\" */\n\n\n/* Development features (change at own risk)                                 */\n/* ------------------------------------------------------------------------- */\n/*#define MIPboundWithOF */ /* Enable to detect OF constraint for use during B&B */\n/*#define SlackInitMinusInf */        /* Slacks have 0 LB if this is not defined */\n#define FULLYBOUNDEDSIMPLEX FALSE     /* WARNING: Activate at your own risk! */\n\n\n/* Specify use of the basic linear algebra subroutine library                */\n/* ------------------------------------------------------------------------- */\n#define libBLAS                  2        /* 0: No, 1: Internal, 2: External */\n#define libnameBLAS        \"myBLAS\"\n\n\n/* Active inverse logic (default is optimized original etaPFI)               */\n/* ------------------------------------------------------------------------- */\n#if !defined LoadInverseLib\n# define LoadInverseLib TRUE          /* Enable alternate inverse libraries */\n#endif\n/*#define ExcludeNativeInverse     */   /* Disable INVERSE_ACTIVE inverse engine */\n\n#define DEF_OBJINBASIS        TRUE  /* Additional rows inserted at the top (1 => OF) */\n\n#define INVERSE_NONE            -1\n#define INVERSE_LEGACY           0\n#define INVERSE_ETAPFI           1\n#define INVERSE_LUMOD            2\n#define INVERSE_LUSOL            3\n#define INVERSE_GLPKLU           4\n\n#ifndef RoleIsExternalInvEngine            /* Defined in inverse DLL drivers */\n  #ifdef ExcludeNativeInverse\n    #define INVERSE_ACTIVE       INVERSE_NONE       /* Disable native engine */\n  #else\n    #define INVERSE_ACTIVE       INVERSE_LEGACY      /* User or DLL-selected */\n  #endif\n#endif\n\n\n/* Active external language interface logic (default is none)                */\n/* ------------------------------------------------------------------------- */\n#if !defined LoadLanguageLib\n# define LoadLanguageLib TRUE         /* Enable alternate language libraries */\n#endif\n#define ExcludeNativeLanguage                 /* Disable LANGUAGE_ACTIVE XLI */\n\n#define LANGUAGE_NONE           -1\n#define LANGUAGE_LEGACYLP        0\n#define LANGUAGE_CPLEXLP         1\n#define LANGUAGE_MPSX            2\n#define LANGUAGE_LPFML           3\n#define LANGUAGE_MATHPROG        4\n#define LANGUAGE_AMPL            5\n#define LANGUAGE_GAMS            6\n#define LANGUAGE_ZIMPL           7\n#define LANGUAGE_S               8\n#define LANGUAGE_R               9\n#define LANGUAGE_MATLAB         10\n#define LANGUAGE_OMATRIX        11\n#define LANGUAGE_SCILAB         12\n#define LANGUAGE_OCTAVE         13\n#define LANGUAGE_EMPS           14\n\n#ifndef RoleIsExternalLanguageEngine      /* Defined in XLI driver libraries */\n  #ifdef ExcludeNativeLanguage\n    #define LANGUAGE_ACTIVE       LANGUAGE_NONE     /* Disable native engine */\n  #else\n    #define LANGUAGE_ACTIVE       LANGUAGE_CPLEXLP   /* User or DLL-selected */\n  #endif\n#endif\n\n\n/* Default parameters and tolerances                                         */\n/* ------------------------------------------------------------------------- */\n#define OriginalPARAM           0\n#define ProductionPARAM         1\n#define ChvatalPARAM            2\n#define LoosePARAM              3\n#if 1\n  #define ActivePARAM           ProductionPARAM\n#else\n  #define ActivePARAM           LoosePARAM\n#endif\n\n\n/* Miscellaneous settings                                                    */\n/* ------------------------------------------------------------------------- */\n#ifndef Paranoia\n  #ifdef _DEBUG\n    #define Paranoia\n  #endif\n#endif\n\n\n/* Program version data                                                      */\n/* ------------------------------------------------------------------------- */\n#define MAJORVERSION             5\n#define MINORVERSION             5\n#define RELEASE                  2\n#define BUILD                    0\n#define BFPVERSION              12       /* Checked against bfp_compatible() */\n#define XLIVERSION              12       /* Checked against xli_compatible() */\n/* Note that both BFPVERSION and XLIVERSION typically have to be incremented\n   in the case that the lprec structure changes.                             */\n\n\n/* Include/header files                                                      */\n/* ------------------------------------------------------------------------- */\n#include <sys/types.h>\n#include <stdlib.h>\n#include <string.h>\n#include <math.h>\n#include <stdio.h>\n\n#include \"lp_types.h\"\n#include \"lp_utils.h\"\n\n#if (LoadInverseLib == TRUE) || (LoadLanguageLib == TRUE)\n  #ifdef WIN32\n    #include <windows.h>\n  #else\n    #include <dlfcn.h>\n  #endif\n#endif\n\n#ifndef BFP_CALLMODEL\n  #ifdef WIN32\n    #define BFP_CALLMODEL __stdcall   /* \"Standard\" call model */\n  #else\n    #define BFP_CALLMODEL\n  #endif\n#endif\n#ifndef XLI_CALLMODEL\n  #define XLI_CALLMODEL BFP_CALLMODEL\n#endif\n\n#define REGISTER        register      /* Speed up certain operations */\n\n\n/* Definition of program constrants                                          */\n/* ------------------------------------------------------------------------- */\n#define SIMPLEX_UNDEFINED        0\n#define SIMPLEX_Phase1_PRIMAL    1\n#define SIMPLEX_Phase1_DUAL      2\n#define SIMPLEX_Phase2_PRIMAL    4\n#define SIMPLEX_Phase2_DUAL      8\n#define SIMPLEX_DYNAMIC         16\n#define SIMPLEX_AUTODUALIZE     32\n\n#define SIMPLEX_PRIMAL_PRIMAL   (SIMPLEX_Phase1_PRIMAL + SIMPLEX_Phase2_PRIMAL)\n#define SIMPLEX_DUAL_PRIMAL     (SIMPLEX_Phase1_DUAL   + SIMPLEX_Phase2_PRIMAL)\n#define SIMPLEX_PRIMAL_DUAL     (SIMPLEX_Phase1_PRIMAL + SIMPLEX_Phase2_DUAL)\n#define SIMPLEX_DUAL_DUAL       (SIMPLEX_Phase1_DUAL   + SIMPLEX_Phase2_DUAL)\n#define SIMPLEX_DEFAULT         (SIMPLEX_DUAL_PRIMAL)\n\n/* Variable codes (internal) */\n#define ISREAL                   0\n#define ISINTEGER                1\n#define ISSEMI                   2\n#define ISSOS                    4\n#define ISSOSTEMPINT             8\n#define ISGUB                   16\n\n/* Presolve defines */\n#define PRESOLVE_NONE            0\n#define PRESOLVE_ROWS            1\n#define PRESOLVE_COLS            2\n#define PRESOLVE_LINDEP          4\n#define PRESOLVE_AGGREGATE       8  /* Not implemented */\n#define PRESOLVE_SPARSER        16  /* Not implemented */\n#define PRESOLVE_SOS            32\n#define PRESOLVE_REDUCEMIP      64\n#define PRESOLVE_KNAPSACK      128  /* Implementation not tested completely */\n#define PRESOLVE_ELIMEQ2       256\n#define PRESOLVE_IMPLIEDFREE   512\n#define PRESOLVE_REDUCEGCD    1024\n#define PRESOLVE_PROBEFIX     2048\n#define PRESOLVE_PROBEREDUCE  4096\n#define PRESOLVE_ROWDOMINATE  8192\n#define PRESOLVE_COLDOMINATE 16384  /* Reduced functionality, should be expanded */\n#define PRESOLVE_MERGEROWS   32768\n#define PRESOLVE_IMPLIEDSLK  65536\n#define PRESOLVE_COLFIXDUAL 131072\n#define PRESOLVE_BOUNDS     262144\n#define PRESOLVE_LASTMASKMODE    (PRESOLVE_DUALS - 1)\n#define PRESOLVE_DUALS      524288\n#define PRESOLVE_SENSDUALS 1048576\n\n/* Basis crash options */\n#define CRASH_NONE               0\n#define CRASH_NONBASICBOUNDS     1\n#define CRASH_MOSTFEASIBLE       2\n#define CRASH_LEASTDEGENERATE    3\n\n/* Solution recomputation options (internal) */\n#define INITSOL_SHIFTZERO        0\n#define INITSOL_USEZERO          1\n#define INITSOL_ORIGINAL         2\n\n/* Strategy codes to avoid or recover from degenerate pivots,\n   infeasibility or numeric errors via randomized bound relaxation */\n#define ANTIDEGEN_NONE           0\n#define ANTIDEGEN_FIXEDVARS      1\n#define ANTIDEGEN_COLUMNCHECK    2\n#define ANTIDEGEN_STALLING       4\n#define ANTIDEGEN_NUMFAILURE     8\n#define ANTIDEGEN_LOSTFEAS      16\n#define ANTIDEGEN_INFEASIBLE    32\n#define ANTIDEGEN_DYNAMIC       64\n#define ANTIDEGEN_DURINGBB     128\n#define ANTIDEGEN_RHSPERTURB   256\n#define ANTIDEGEN_BOUNDFLIP    512\n#define ANTIDEGEN_DEFAULT        (ANTIDEGEN_FIXEDVARS | ANTIDEGEN_STALLING /* | ANTIDEGEN_INFEASIBLE */)\n\n/* REPORT defines */\n#define NEUTRAL                  0\n#define CRITICAL                 1\n#define SEVERE                   2\n#define IMPORTANT                3\n#define NORMAL                   4\n#define DETAILED                 5\n#define FULL                     6\n\n/* MESSAGE defines */\n#define MSG_NONE                 0\n#define MSG_PRESOLVE             1\n#define MSG_ITERATION            2\n#define MSG_INVERT               4\n#define MSG_LPFEASIBLE           8\n#define MSG_LPOPTIMAL           16\n#define MSG_LPEQUAL             32\n#define MSG_LPBETTER            64\n#define MSG_MILPFEASIBLE       128\n#define MSG_MILPEQUAL          256\n#define MSG_MILPBETTER         512\n#define MSG_MILPSTRATEGY      1024\n#define MSG_MILPOPTIMAL       2048\n#define MSG_PERFORMANCE       4096\n#define MSG_INITPSEUDOCOST    8192\n\n/* MPS file types */\n#define MPSFIXED                 1\n#define MPSFREE                  2\n#define MPSIBM                   4\n#define MPSNEGOBJCONST           8\n\n#define MPS_FREE                 (MPSFREE<<2)\n#define MPS_IBM                  (MPSIBM<<2)\n#define MPS_NEGOBJCONST          (MPSNEGOBJCONST<<2)\n\n/* MPS defines (internal) */\n#define MPSUNDEF                -4\n#define MPSNAME                 -3\n#define MPSOBJSENSE             -2\n#define MPSOBJNAME              -1\n#define MPSROWS                  0\n#define MPSCOLUMNS               1\n#define MPSRHS                   2\n#define MPSBOUNDS                3\n#define MPSRANGES                4\n#define MPSSOS                   5\n\n#define MPSVARMASK          \"%-8s\"\n#define MPSVALUEMASK        \"%12g\"\n\n/* Constraint type codes  (internal) */\n#define ROWTYPE_EMPTY            0\n#define ROWTYPE_LE               1\n#define ROWTYPE_GE               2\n#define ROWTYPE_EQ               3\n#define ROWTYPE_CONSTRAINT       ROWTYPE_EQ  /* This is the mask for modes */\n#define ROWTYPE_OF               4\n#define ROWTYPE_INACTIVE         8\n#define ROWTYPE_RELAX           16\n#define ROWTYPE_GUB             32\n#define ROWTYPE_OFMAX            (ROWTYPE_OF + ROWTYPE_GE)\n#define ROWTYPE_OFMIN            (ROWTYPE_OF + ROWTYPE_LE)\n#define ROWTYPE_CHSIGN           ROWTYPE_GE\n\n/* Public constraint codes */\n#define FR                       ROWTYPE_EMPTY\n#define LE                       ROWTYPE_LE\n#define GE                       ROWTYPE_GE\n#define EQ                       ROWTYPE_EQ\n#define OF                       ROWTYPE_OF\n\n/* MIP constraint classes */\n#define ROWCLASS_Unknown         0   /* Undefined/unknown */\n#define ROWCLASS_Objective       1   /* The objective function */\n#define ROWCLASS_GeneralREAL     2   /* General real-values constraint */\n#define ROWCLASS_GeneralMIP      3   /* General mixed integer/binary and real valued constraint */\n#define ROWCLASS_GeneralINT      4   /* General integer-only constraint */\n#define ROWCLASS_GeneralBIN      5   /* General binary-only constraint */\n#define ROWCLASS_KnapsackINT     6   /* Sum of positive integer times integer variables <= positive integer */\n#define ROWCLASS_KnapsackBIN     7   /* Sum of positive integer times binary variables <= positive integer */\n#define ROWCLASS_SetPacking      8   /* Sum of binary variables >= 1 */\n#define ROWCLASS_SetCover        9   /* Sum of binary variables <= 1 */\n#define ROWCLASS_GUB            10   /* Sum of binary variables = 1  */\n#define ROWCLASS_MAX             ROWCLASS_GUB\n\n/* Column subsets (internal) */\n#define SCAN_USERVARS            1\n#define SCAN_SLACKVARS           2\n#define SCAN_ARTIFICIALVARS      4\n#define SCAN_PARTIALBLOCK        8\n#define USE_BASICVARS           16\n#define USE_NONBASICVARS        32\n#define SCAN_NORMALVARS         (SCAN_USERVARS + SCAN_ARTIFICIALVARS)\n#define SCAN_ALLVARS            (SCAN_SLACKVARS + SCAN_USERVARS + SCAN_ARTIFICIALVARS)\n#define USE_ALLVARS             (USE_BASICVARS + USE_NONBASICVARS)\n#define OMIT_FIXED              64\n#define OMIT_NONFIXED          128\n\n/* Improvement defines */\n#define IMPROVE_NONE             0\n#define IMPROVE_SOLUTION         1\n#define IMPROVE_DUALFEAS         2\n#define IMPROVE_THETAGAP         4\n#define IMPROVE_BBSIMPLEX        8\n#define IMPROVE_DEFAULT          (IMPROVE_DUALFEAS + IMPROVE_THETAGAP)\n#define IMPROVE_INVERSE          (IMPROVE_SOLUTION + IMPROVE_THETAGAP)\n\n/* Scaling types */\n#define SCALE_NONE               0\n#define SCALE_EXTREME            1\n#define SCALE_RANGE              2\n#define SCALE_MEAN               3\n#define SCALE_GEOMETRIC          4\n#define SCALE_FUTURE1            5\n#define SCALE_FUTURE2            6\n#define SCALE_CURTISREID         7   /* Override to Curtis-Reid \"optimal\" scaling */\n\n/* Alternative scaling weights */\n#define SCALE_LINEAR             0\n#define SCALE_QUADRATIC          8\n#define SCALE_LOGARITHMIC       16\n#define SCALE_USERWEIGHT        31\n#define SCALE_MAXTYPE            (SCALE_QUADRATIC-1)\n\n/* Scaling modes */\n#define SCALE_POWER2            32   /* As is or rounded to power of 2 */\n#define SCALE_EQUILIBRATE       64   /* Make sure that no scaled number is above 1 */\n#define SCALE_INTEGERS         128   /* Apply to integer columns/variables */\n#define SCALE_DYNUPDATE        256   /* Apply incrementally every solve() */\n#define SCALE_ROWSONLY         512   /* Override any scaling to only scale the rows */\n#define SCALE_COLSONLY        1024   /* Override any scaling to only scale the rows */\n\n/* Standard defines for typical scaling models (no Lagrangeans) */\n#define SCALEMODEL_EQUILIBRATED  (SCALE_LINEAR+SCALE_EXTREME+SCALE_INTEGERS)\n#define SCALEMODEL_GEOMETRIC     (SCALE_LINEAR+SCALE_GEOMETRIC+SCALE_INTEGERS)\n#define SCALEMODEL_ARITHMETIC    (SCALE_LINEAR+SCALE_MEAN+SCALE_INTEGERS)\n#define SCALEMODEL_DYNAMIC       (SCALEMODEL_GEOMETRIC+SCALE_EQUILIBRATE)\n#define SCALEMODEL_CURTISREID    (SCALE_CURTISREID+SCALE_INTEGERS+SCALE_POWER2)\n\n/* Iteration status and strategies (internal) */\n#define ITERATE_MAJORMAJOR       0\n#define ITERATE_MINORMAJOR       1\n#define ITERATE_MINORRETRY       2\n\n/* Pricing methods */\n#define PRICER_FIRSTINDEX        0\n#define PRICER_DANTZIG           1\n#define PRICER_DEVEX             2\n#define PRICER_STEEPESTEDGE      3\n#define PRICER_LASTOPTION        PRICER_STEEPESTEDGE\n\n/* Additional settings for pricers (internal) */\n#define PRICER_RANDFACT        0.1\n#define DEVEX_RESTARTLIMIT 1.0e+09    /* Reset the norms if any value exceeds this limit */\n#define DEVEX_MINVALUE       0.000    /* Minimum weight [0..1] for entering variable, consider 0.01 */\n\n/* Pricing strategies */\n#define PRICE_PRIMALFALLBACK     4    /* In case of Steepest Edge, fall back to DEVEX in primal */\n#define PRICE_MULTIPLE           8    /* Enable multiple pricing (primal simplex) */\n#define PRICE_PARTIAL           16    /* Enable partial pricing */\n#define PRICE_ADAPTIVE          32    /* Temporarily use alternative strategy if cycling is detected */\n#define PRICE_HYBRID            64    /* NOT IMPLEMENTED */\n#define PRICE_RANDOMIZE        128    /* Adds a small randomization effect to the selected pricer */\n#define PRICE_AUTOPARTIAL      256    /* Detect and use data on the block structure of the model (primal) */\n#define PRICE_AUTOMULTIPLE     512    /* Automatically select multiple pricing (primal simplex) */\n#define PRICE_LOOPLEFT        1024    /* Scan entering/leaving columns left rather than right */\n#define PRICE_LOOPALTERNATE   2048    /* Scan entering/leaving columns alternatingly left/right */\n#define PRICE_HARRISTWOPASS   4096    /* Use Harris' primal pivot logic rather than the default */\n#define PRICE_FORCEFULL       8192    /* Non-user option to force full pricing */\n#define PRICE_TRUENORMINIT   16384    /* Use true norms for Devex and Steepest Edge initializations */\n\n/*#define _PRICE_NOBOUNDFLIP*/\n#if defined _PRICE_NOBOUNDFLIP\n#define PRICE_NOBOUNDFLIP    65536    /* Disallow automatic bound-flip during pivot */\n#endif\n\n#define PRICE_STRATEGYMASK       (PRICE_PRIMALFALLBACK + \\\n                                  PRICE_MULTIPLE + PRICE_PARTIAL + \\\n                                  PRICE_ADAPTIVE + PRICE_HYBRID + \\\n                                  PRICE_RANDOMIZE + PRICE_AUTOPARTIAL + PRICE_AUTOMULTIPLE + \\\n                                  PRICE_LOOPLEFT + PRICE_LOOPALTERNATE + \\\n                                  PRICE_HARRISTWOPASS + \\\n                                  PRICE_FORCEFULL + PRICE_TRUENORMINIT)\n\n/* B&B active variable codes (internal) */\n#define BB_REAL                  0\n#define BB_INT                   1\n#define BB_SC                    2\n#define BB_SOS                   3\n#define BB_GUB                   4\n\n/* B&B strategies */\n#define NODE_FIRSTSELECT         0\n#define NODE_GAPSELECT           1\n#define NODE_RANGESELECT         2\n#define NODE_FRACTIONSELECT      3\n#define NODE_PSEUDOCOSTSELECT    4\n#define NODE_PSEUDONONINTSELECT  5    /* Kjell Eikland #1 - Minimize B&B depth */\n#define NODE_PSEUDOFEASSELECT   (NODE_PSEUDONONINTSELECT+NODE_WEIGHTREVERSEMODE)\n#define NODE_PSEUDORATIOSELECT   6    /* Kjell Eikland #2 - Minimize a \"cost/benefit\" ratio */\n#define NODE_USERSELECT          7\n#define NODE_STRATEGYMASK        (NODE_WEIGHTREVERSEMODE-1) /* Mask for B&B strategies */\n#define NODE_WEIGHTREVERSEMODE   8\n#define NODE_BRANCHREVERSEMODE  16\n#define NODE_GREEDYMODE         32\n#define NODE_PSEUDOCOSTMODE     64\n#define NODE_DEPTHFIRSTMODE    128\n#define NODE_RANDOMIZEMODE     256\n#define NODE_GUBMODE           512\n#define NODE_DYNAMICMODE      1024\n#define NODE_RESTARTMODE      2048\n#define NODE_BREADTHFIRSTMODE 4096\n#define NODE_AUTOORDER        8192\n#define NODE_RCOSTFIXING     16384\n#define NODE_STRONGINIT      32768\n\n#define BRANCH_CEILING           0\n#define BRANCH_FLOOR             1\n#define BRANCH_AUTOMATIC         2\n#define BRANCH_DEFAULT           3\n\n/* Action constants for simplex and B&B (internal) */\n#define ACTION_NONE              0\n#define ACTION_ACTIVE            1\n#define ACTION_REBASE            2\n#define ACTION_RECOMPUTE         4\n#define ACTION_REPRICE           8\n#define ACTION_REINVERT         16\n#define ACTION_TIMEDREINVERT    32\n#define ACTION_ITERATE          64\n#define ACTION_RESTART         255\n\n/* Solver status values */\n#define UNKNOWNERROR            -5\n#define DATAIGNORED             -4\n#define NOBFP                   -3\n#define NOMEMORY                -2\n#define NOTRUN                  -1\n#define OPTIMAL                  0\n#define SUBOPTIMAL               1\n#define INFEASIBLE               2\n#define UNBOUNDED                3\n#define DEGENERATE               4\n#define NUMFAILURE               5\n#define USERABORT                6\n#define TIMEOUT                  7\n#define RUNNING                  8\n#define PRESOLVED                9\n\n/* Branch & Bound and Lagrangean extra status values (internal) */\n#define PROCFAIL                10\n#define PROCBREAK               11\n#define FEASFOUND               12\n#define NOFEASFOUND             13\n#define FATHOMED                14\n\n/* Status values internal to the solver (internal) */\n#define SWITCH_TO_PRIMAL        20\n#define SWITCH_TO_DUAL          21\n#define SINGULAR_BASIS          22\n#define LOSTFEAS                23\n#define MATRIXERROR             24\n\n/* Objective testing options for \"bb_better\" (internal) */\n#define OF_RELAXED               0\n#define OF_INCUMBENT             1\n#define OF_WORKING               2\n#define OF_USERBREAK             3\n#define OF_HEURISTIC             4\n#define OF_DUALLIMIT             5\n#define OF_DELTA                 8  /* Mode */\n#define OF_PROJECTED            16  /* Mode - future, not active */\n\n#define OF_TEST_BT               1\n#define OF_TEST_BE               2\n#define OF_TEST_NE               3\n#define OF_TEST_WE               4\n#define OF_TEST_WT               5\n#define OF_TEST_RELGAP           8  /* Mode */\n\n\n/* Name list and sparse matrix storage parameters (internal) */\n#define MAT_START_SIZE       10000\n#define DELTACOLALLOC          100\n#define DELTAROWALLOC          100\n#define RESIZEFACTOR             4  /* Fractional increase in selected memory allocations */\n\n/* Default solver parameters and tolerances (internal) */\n#define DEF_PARTIALBLOCKS       10  /* The default number of blocks for partial pricing */\n#define DEF_MAXRELAX             7  /* Maximum number of non-BB relaxations in MILP */\n#define DEF_MAXPIVOTRETRY       10  /* Maximum number of times to retry a div-0 situation */\n#define DEF_MAXSINGULARITIES    10  /* Maximum number of singularities in refactorization */\n#define MAX_MINITUPDATES        60  /* Maximum number of bound swaps between refactorizations\n                                       without recomputing the whole vector - contain errors */\n#define MIN_REFACTFREQUENCY      5  /* Refactorization frequency indicating an inherent\n                                       numerical instability of the basis */\n#define LAG_SINGULARLIMIT        5  /* Number of times the objective does not change\n                                       before it is assumed that the Lagrangean constraints\n                                       are non-binding, and therefore impossible to converge;\n                                       upper iteration limit is divided by this threshold */\n#define MIN_TIMEPIVOT      5.0e-02  /* Minimum time per pivot for reinversion optimization\n                                       purposes; use active monitoring only if a pivot\n                                       takes more than MINTIMEPIVOT seconds.  5.0e-2 is\n                                       roughly suitable for a 1GHz system.  */\n#define MAX_STALLCOUNT          12  /* The absolute upper limit to the number of stalling or\n                                       cycling iterations before switching rule */\n#define MAX_RULESWITCH           5  /* The maximum number of times to try an alternate pricing rule\n                                       to recover from stalling; set negative for no limit. */\n#define DEF_TIMEDREFACT  AUTOMATIC  /* Default for timed refactorization in BFPs;\n                                       can be FALSE, TRUE or AUTOMATIC (dynamic) */\n\n#define DEF_SCALINGLIMIT         5  /* The default maximum number of scaling iterations */\n\n#define DEF_NEGRANGE      -1.0e+06  /* Downward limit for expanded variable range before the\n                                       variable is split into positive and negative components */\n#define DEF_BB_LIMITLEVEL      -50  /* Relative B&B limit to protect against very deep,\n                                       memory-consuming trees */\n\n#define MAX_FRACSCALE            6  /* The maximum decimal scan range for simulated integers */\n#define RANDSCALE              100  /* Randomization scaling range */\n#define DOUBLEROUND        0.0e-02  /* Extra rounding scalar used in btran/ftran calculations; the\n                                       rationale for 0.0 is that prod_xA() uses rounding as well */\n#define DEF_EPSMACHINE    2.22e-16  /* Machine relative precision (doubles) */\n#define MIN_STABLEPIVOT        5.0  /* Minimum pivot magnitude assumed to be numerically stable */\n\n\n/* Precision macros                                                                       */\n/* -------------------------------------------------------------------------------------- */\n#define PREC_REDUCEDCOST        lp->epsvalue\n#define PREC_IMPROVEGAP         lp->epsdual\n#define PREC_SUBSTFEASGAP       lp->epsprimal\n#if 1\n  #define PREC_BASICSOLUTION    lp->epsvalue  /* Zero-rounding of RHS/basic solution vector */\n#else\n  #define PREC_BASICSOLUTION    lp->epsmachine  /* Zero-rounding of RHS/basic solution vector */\n#endif\n#define LIMIT_ABS_REL         10.0  /* Limit for testing using relative metric */\n\n\n/* Parameters constants for short-cut setting of tolerances                           */\n/* -------------------------------------------------------------------------------------- */\n#define EPS_TIGHT                0\n#define EPS_MEDIUM               1\n#define EPS_LOOSE                2\n#define EPS_BAGGY                3\n#define EPS_DEFAULT              EPS_TIGHT\n\n\n#if ActivePARAM==ProductionPARAM    /* PARAMETER SET FOR PRODUCTION                       */\n/* -------------------------------------------------------------------------------------- */\n#define DEF_INFINITE       1.0e+30  /* Limit for dynamic range */\n#define DEF_EPSVALUE       1.0e-12  /* High accuracy and feasibility preserving tolerance */\n#define DEF_EPSPRIMAL      1.0e-10  /* For rounding primal/RHS values to 0 */\n#define DEF_EPSDUAL        1.0e-09  /* For rounding reduced costs to 0 */\n#define DEF_EPSPIVOT       2.0e-07  /* Pivot reject threshold */\n#define DEF_PERTURB        1.0e-05  /* Perturbation scalar for degenerate problems;\n                                       must at least be RANDSCALE greater than EPSPRIMAL */\n#define DEF_EPSSOLUTION    1.0e-05  /* Margin of error for solution bounds */\n#define DEF_EPSINT         1.0e-07  /* Accuracy for considering a float value as integer */\n\n#elif ActivePARAM==OriginalPARAM    /* PARAMETER SET FOR LEGACY VERSIONS                  */\n/* -------------------------------------------------------------------------------------- */\n#define DEF_INFINITE       1.0e+24  /* Limit for dynamic range */\n#define DEF_EPSVALUE       1.0e-08  /* High accuracy and feasibility preserving tolerance */\n#define DEF_EPSPRIMAL     5.01e-07  /* For rounding primal/RHS values to 0, infeasibility */\n#define DEF_EPSDUAL        1.0e-06  /* For rounding reduced costs to 0 */\n#define DEF_EPSPIVOT       1.0e-04  /* Pivot reject threshold */\n#define DEF_PERTURB        1.0e-05  /* Perturbation scalar for degenerate problems;\n                                       must at least be RANDSCALE greater than EPSPRIMAL */\n#define DEF_EPSSOLUTION    1.0e-02  /* Margin of error for solution bounds */\n#define DEF_EPSINT         1.0e-03  /* Accuracy for considering a float value as integer */\n\n#elif ActivePARAM==ChvatalPARAM     /* PARAMETER SET EXAMPLES FROM Vacek Chvatal          */\n/* -------------------------------------------------------------------------------------- */\n#define DEF_INFINITE       1.0e+30  /* Limit for dynamic range */\n#define DEF_EPSVALUE       1.0e-10  /* High accuracy and feasibility preserving tolerance */\n#define DEF_EPSPRIMAL       10e-07  /* For rounding primal/RHS values to 0 */\n#define DEF_EPSDUAL         10e-05  /* For rounding reduced costs to 0 */\n#define DEF_EPSPIVOT        10e-05  /* Pivot reject threshold */\n#define DEF_PERTURB         10e-03  /* Perturbation scalar for degenerate problems;\n                                       must at least be RANDSCALE greater than EPSPRIMAL */\n#define DEF_EPSSOLUTION    1.0e-05  /* Margin of error for solution bounds */\n#define DEF_EPSINT         5.0e-03  /* Accuracy for considering a float value as integer */\n\n#elif ActivePARAM==LoosePARAM       /* PARAMETER SET FOR LOOSE TOLERANCES                 */\n/* -------------------------------------------------------------------------------------- */\n#define DEF_INFINITE       1.0e+30  /* Limit for dynamic range */\n#define DEF_EPSVALUE       1.0e-10  /* High accuracy and feasibility preserving tolerance */\n#define DEF_EPSPRIMAL     5.01e-08  /* For rounding primal/RHS values to 0 */\n#define DEF_EPSDUAL        1.0e-07  /* For rounding reduced costs to 0 */\n#define DEF_EPSPIVOT       1.0e-05  /* Pivot reject threshold */\n#define DEF_PERTURB        1.0e-05  /* Perturbation scalar for degenerate problems;\n                                       must at least be RANDSCALE greater than EPSPRIMAL */\n#define DEF_EPSSOLUTION    1.0e-05  /* Margin of error for solution bounds */\n#define DEF_EPSINT         1.0e-04  /* Accuracy for considering a float value as integer */\n\n#endif\n\n\n#define DEF_MIP_GAP        1.0e-11  /* The default absolute and relative MIP gap */\n#define SCALEDINTFIXRANGE      1.6  /* Epsilon range multiplier < 2 for collapsing bounds to fix */\n\n#define MIN_SCALAR         1.0e-10  /* Smallest allowed scaling adjustment */\n#define MAX_SCALAR         1.0e+10  /* Largest allowed scaling adjustment */\n#define DEF_SCALINGEPS     1.0e-02  /* Relative scaling convergence criterion for auto_scale */\n\n#define DEF_LAGACCEPT      1.0e-03  /* Default Lagrangean convergence acceptance criterion */\n#define DEF_LAGCONTRACT       0.90  /* The contraction parameter for Lagrangean iterations */\n#define DEF_LAGMAXITERATIONS   100  /* The maximum number of Lagrangean iterations */\n\n#define DEF_PSEUDOCOSTUPDATES    7  /* The default number of times pseudo-costs are recalculated;\n                                       experiments indicate that costs tend to stabilize */\n#define DEF_PSEUDOCOSTRESTART 0.15  /* The fraction of price updates required for B&B restart\n                                       when the mode is NODE_RESTARTMODE */\n#define DEF_MAXPRESOLVELOOPS     0  /* Upper limit to the number of loops during presolve,\n                                       <= 0 for no limit. */\n\n\n/* Hashing prototypes and function headers                                   */\n/* ------------------------------------------------------------------------- */\n#include \"lp_Hash.h\"\n\n\n/* Sparse matrix prototypes                                                  */\n/* ------------------------------------------------------------------------- */\n#include \"lp_matrix.h\"\n\n\n/* Basis storage (mainly for B&B) */\ntypedef struct _basisrec\n{\n  int       level;\n  int       *var_basic;\n  MYBOOL    *is_basic;\n  MYBOOL    *is_lower;\n  int       pivots;\n  struct   _basisrec *previous;\n} basisrec;\n\n/* Presolve undo data storage */\ntypedef struct _presolveundorec\n{\n  lprec     *lp;\n  int       orig_rows;\n  int       orig_columns;\n  int       orig_sum;\n  int       *var_to_orig;       /* sum_alloc+1 : Mapping of variables from solution to\n                                   best_solution to account for removed variables and\n                                   rows during presolve; a non-positive value indicates\n                                   that the constraint or variable was removed */\n  int       *orig_to_var;       /* sum_alloc+1 : Mapping from original variable index to\n                                   current / working index number */\n  REAL      *fixed_rhs;         /* rows_alloc+1 : Storage of values of presolved fixed colums */\n  REAL      *fixed_obj;         /* columns_alloc+1: Storage of values of presolved fixed rows */\n  DeltaVrec *deletedA;          /* A matrix of eliminated data from matA */\n  DeltaVrec *primalundo;        /* Affine translation vectors for eliminated primal variables */\n  DeltaVrec *dualundo;          /* Affine translation vectors for eliminated dual variables */\n  MYBOOL    OFcolsdeleted;\n} presolveundorec;\n\n/* Pseudo-cost arrays used during B&B */\ntypedef struct _BBPSrec\n{\n  lprec     *lp;\n  int       pseodotype;\n  int       updatelimit;\n  int       updatesfinished;\n  REAL      restartlimit;\n  MATitem   *UPcost;\n  MATitem   *LOcost;\n  struct   _BBPSrec *secondary;\n} BBPSrec;\n\n#include \"lp_mipbb.h\"\n\n\n/* Partial pricing block data */\ntypedef struct _partialrec {\n  lprec     *lp;\n  int       blockcount;         /* ## The number of logical blocks or stages in the model */\n  int       blocknow;           /* The currently active block */\n  int       *blockend;          /* Array of column indeces giving the start of each block */\n  int       *blockpos;          /* Array of column indeces giving the start scan position */\n  MYBOOL    isrow;\n} partialrec;\n\n\n/* Specially Ordered Sets (SOS) prototypes and settings                      */\n/* ------------------------------------------------------------------------- */\n/* SOS storage structure (LINEARSEARCH is typically in the 0-10 range)       */\n#ifndef LINEARSEARCH\n#define LINEARSEARCH 0\n#endif\n\n#include \"lp_SOS.h\"\n\n\n/* Prototypes for user call-back functions                                   */\n/* ------------------------------------------------------------------------- */\ntypedef int    (__WINAPI lphandle_intfunc)(lprec *lp, void *userhandle);\ntypedef void   (__WINAPI lphandlestr_func)(lprec *lp, void *userhandle, char *buf);\ntypedef void   (__WINAPI lphandleint_func)(lprec *lp, void *userhandle, int message);\ntypedef int    (__WINAPI lphandleint_intfunc)(lprec *lp, void *userhandle, int message);\n\n\n/* API typedef definitions                                                   */\n/* ------------------------------------------------------------------------- */\ntypedef MYBOOL (__WINAPI add_column_func)(lprec *lp, REAL *column);\ntypedef MYBOOL (__WINAPI add_columnex_func)(lprec *lp, int count, REAL *column, int *rowno);\ntypedef MYBOOL (__WINAPI add_constraint_func)(lprec *lp, REAL *row, int constr_type, REAL rh);\ntypedef MYBOOL (__WINAPI add_constraintex_func)(lprec *lp, int count, REAL *row, int *colno, int constr_type, REAL rh);\ntypedef MYBOOL (__WINAPI add_lag_con_func)(lprec *lp, REAL *row, int con_type, REAL rhs);\ntypedef int (__WINAPI add_SOS_func)(lprec *lp, char *name, int sostype, int priority, int count, int *sosvars, REAL *weights);\ntypedef int (__WINAPI column_in_lp_func)(lprec *lp, REAL *column);\ntypedef lprec * (__WINAPI copy_lp_func)(lprec *lp);\ntypedef void (__WINAPI default_basis_func)(lprec *lp);\ntypedef MYBOOL (__WINAPI del_column_func)(lprec *lp, int colnr);\ntypedef MYBOOL (__WINAPI del_constraint_func)(lprec *lp, int rownr);\ntypedef void (__WINAPI delete_lp_func)(lprec *lp);\ntypedef MYBOOL (__WINAPI dualize_lp_func)(lprec *lp);\ntypedef void (__WINAPI free_lp_func)(lprec **plp);\ntypedef int (__WINAPI get_anti_degen_func)(lprec *lp);\ntypedef MYBOOL (__WINAPI get_basis_func)(lprec *lp, int *bascolumn, MYBOOL nonbasic);\ntypedef int (__WINAPI get_basiscrash_func)(lprec *lp);\ntypedef int (__WINAPI get_bb_depthlimit_func)(lprec *lp);\ntypedef int (__WINAPI get_bb_floorfirst_func)(lprec *lp);\ntypedef int (__WINAPI get_bb_rule_func)(lprec *lp);\ntypedef MYBOOL (__WINAPI get_bounds_tighter_func)(lprec *lp);\ntypedef REAL (__WINAPI get_break_at_value_func)(lprec *lp);\ntypedef char * (__WINAPI get_col_name_func)(lprec *lp, int colnr);\ntypedef MYBOOL (__WINAPI get_column_func)(lprec *lp, int colnr, REAL *column);\ntypedef int (__WINAPI get_columnex_func)(lprec *lp, int colnr, REAL *column, int *nzrow);\ntypedef int (__WINAPI get_constr_type_func)(lprec *lp, int rownr);\ntypedef REAL (__WINAPI get_constr_value_func)(lprec *lp, int rownr, int count, REAL *primsolution, int *nzindex);\ntypedef MYBOOL (__WINAPI get_constraints_func)(lprec *lp, REAL *constr);\ntypedef MYBOOL (__WINAPI get_dual_solution_func)(lprec *lp, REAL *rc);\ntypedef REAL (__WINAPI get_epsb_func)(lprec *lp);\ntypedef REAL (__WINAPI get_epsd_func)(lprec *lp);\ntypedef REAL (__WINAPI get_epsel_func)(lprec *lp);\ntypedef REAL (__WINAPI get_epsint_func)(lprec *lp);\ntypedef REAL (__WINAPI get_epsperturb_func)(lprec *lp);\ntypedef REAL (__WINAPI get_epspivot_func)(lprec *lp);\ntypedef int (__WINAPI get_improve_func)(lprec *lp);\ntypedef REAL (__WINAPI get_infinite_func)(lprec *lp);\ntypedef MYBOOL (__WINAPI get_lambda_func)(lprec *lp, REAL *lambda);\ntypedef REAL (__WINAPI get_lowbo_func)(lprec *lp, int colnr);\ntypedef int (__WINAPI get_lp_index_func)(lprec *lp, int orig_index);\ntypedef char * (__WINAPI get_lp_name_func)(lprec *lp);\ntypedef int (__WINAPI get_Lrows_func)(lprec *lp);\ntypedef REAL (__WINAPI get_mat_func)(lprec *lp, int rownr, int colnr);\ntypedef REAL (__WINAPI get_mat_byindex_func)(lprec *lp, int matindex, MYBOOL isrow, MYBOOL adjustsign);\ntypedef int (__WINAPI get_max_level_func)(lprec *lp);\ntypedef int (__WINAPI get_maxpivot_func)(lprec *lp);\ntypedef REAL (__WINAPI get_mip_gap_func)(lprec *lp, MYBOOL absolute);\ntypedef int (__WINAPI get_multiprice_func)(lprec *lp, MYBOOL getabssize);\ntypedef MYBOOL (__WINAPI is_use_names_func)(lprec *lp, MYBOOL isrow);\ntypedef void (__WINAPI set_use_names_func)(lprec *lp, MYBOOL isrow, MYBOOL use_names);\ntypedef int (__WINAPI get_nameindex_func)(lprec *lp, char *varname, MYBOOL isrow);\ntypedef int (__WINAPI get_Ncolumns_func)(lprec *lp);\ntypedef REAL (__WINAPI get_negrange_func)(lprec *lp);\ntypedef int (__WINAPI get_nz_func)(lprec *lp);\ntypedef int (__WINAPI get_Norig_columns_func)(lprec *lp);\ntypedef int (__WINAPI get_Norig_rows_func)(lprec *lp);\ntypedef int (__WINAPI get_Nrows_func)(lprec *lp);\ntypedef REAL (__WINAPI get_obj_bound_func)(lprec *lp);\ntypedef REAL (__WINAPI get_objective_func)(lprec *lp);\ntypedef int (__WINAPI get_orig_index_func)(lprec *lp, int lp_index);\ntypedef char * (__WINAPI get_origcol_name_func)(lprec *lp, int colnr);\ntypedef char * (__WINAPI get_origrow_name_func)(lprec *lp, int rownr);\ntypedef void (__WINAPI get_partialprice_func)(lprec *lp, int *blockcount, int *blockstart, MYBOOL isrow);\ntypedef int (__WINAPI get_pivoting_func)(lprec *lp);\ntypedef int (__WINAPI get_presolve_func)(lprec *lp);\ntypedef int (__WINAPI get_presolveloops_func)(lprec *lp);\ntypedef MYBOOL (__WINAPI get_primal_solution_func)(lprec *lp, REAL *pv);\ntypedef int (__WINAPI get_print_sol_func)(lprec *lp);\ntypedef MYBOOL (__WINAPI get_pseudocosts_func)(lprec *lp, REAL *clower, REAL *cupper, int *updatelimit);\ntypedef MYBOOL (__WINAPI get_ptr_constraints_func)(lprec *lp, REAL **constr);\ntypedef MYBOOL (__WINAPI get_ptr_dual_solution_func)(lprec *lp, REAL **rc);\ntypedef MYBOOL (__WINAPI get_ptr_lambda_func)(lprec *lp, REAL **lambda);\ntypedef MYBOOL (__WINAPI get_ptr_primal_solution_func)(lprec *lp, REAL **pv);\ntypedef MYBOOL (__WINAPI get_ptr_sensitivity_obj_func)(lprec *lp, REAL **objfrom, REAL **objtill);\ntypedef MYBOOL (__WINAPI get_ptr_sensitivity_objex_func)(lprec *lp, REAL **objfrom, REAL **objtill, REAL **objfromvalue, REAL **objtillvalue);\ntypedef MYBOOL (__WINAPI get_ptr_sensitivity_rhs_func)(lprec *lp, REAL **duals, REAL **dualsfrom, REAL **dualstill);\ntypedef MYBOOL (__WINAPI get_ptr_variables_func)(lprec *lp, REAL **var);\ntypedef REAL (__WINAPI get_rh_func)(lprec *lp, int rownr);\ntypedef REAL (__WINAPI get_rh_range_func)(lprec *lp, int rownr);\ntypedef int (__WINAPI get_rowex_func)(lprec *lp, int rownr, REAL *row, int *colno);\ntypedef MYBOOL (__WINAPI get_row_func)(lprec *lp, int rownr, REAL *row);\ntypedef char * (__WINAPI get_row_name_func)(lprec *lp, int rownr);\ntypedef REAL (__WINAPI get_scalelimit_func)(lprec *lp);\ntypedef int (__WINAPI get_scaling_func)(lprec *lp);\ntypedef MYBOOL (__WINAPI get_sensitivity_obj_func)(lprec *lp, REAL *objfrom, REAL *objtill);\ntypedef MYBOOL (__WINAPI get_sensitivity_objex_func)(lprec *lp, REAL *objfrom, REAL *objtill, REAL *objfromvalue, REAL *objtillvalue);\ntypedef MYBOOL (__WINAPI get_sensitivity_rhs_func)(lprec *lp, REAL *duals, REAL *dualsfrom, REAL *dualstill);\ntypedef int (__WINAPI get_simplextype_func)(lprec *lp);\ntypedef int (__WINAPI get_solutioncount_func)(lprec *lp);\ntypedef int (__WINAPI get_solutionlimit_func)(lprec *lp);\ntypedef int (__WINAPI get_status_func)(lprec *lp);\ntypedef char * (__WINAPI get_statustext_func)(lprec *lp, int statuscode);\ntypedef long (__WINAPI get_timeout_func)(lprec *lp);\ntypedef COUNTER (__WINAPI get_total_iter_func)(lprec *lp);\ntypedef COUNTER (__WINAPI get_total_nodes_func)(lprec *lp);\ntypedef REAL (__WINAPI get_upbo_func)(lprec *lp, int colnr);\ntypedef int (__WINAPI get_var_branch_func)(lprec *lp, int colnr);\ntypedef REAL (__WINAPI get_var_dualresult_func)(lprec *lp, int index);\ntypedef REAL (__WINAPI get_var_primalresult_func)(lprec *lp, int index);\ntypedef int (__WINAPI get_var_priority_func)(lprec *lp, int colnr);\ntypedef MYBOOL (__WINAPI get_variables_func)(lprec *lp, REAL *var);\ntypedef int (__WINAPI get_verbose_func)(lprec *lp);\ntypedef MYBOOL (__WINAPI guess_basis_func)(lprec *lp, REAL *guessvector, int *basisvector);\ntypedef REAL (__WINAPI get_working_objective_func)(lprec *lp);\ntypedef MYBOOL (__WINAPI has_BFP_func)(lprec *lp);\ntypedef MYBOOL (__WINAPI has_XLI_func)(lprec *lp);\ntypedef MYBOOL (__WINAPI is_add_rowmode_func)(lprec *lp);\ntypedef MYBOOL (__WINAPI is_anti_degen_func)(lprec *lp, int testmask);\ntypedef MYBOOL (__WINAPI is_binary_func)(lprec *lp, int colnr);\ntypedef MYBOOL (__WINAPI is_break_at_first_func)(lprec *lp);\ntypedef MYBOOL (__WINAPI is_constr_type_func)(lprec *lp, int rownr, int mask);\ntypedef MYBOOL (__WINAPI is_debug_func)(lprec *lp);\ntypedef MYBOOL (__WINAPI is_feasible_func)(lprec *lp, REAL *values, REAL threshold);\ntypedef MYBOOL (__WINAPI is_unbounded_func)(lprec *lp, int colnr);\ntypedef MYBOOL (__WINAPI is_infinite_func)(lprec *lp, REAL value);\ntypedef MYBOOL (__WINAPI is_int_func)(lprec *lp, int column);\ntypedef MYBOOL (__WINAPI is_integerscaling_func)(lprec *lp);\ntypedef MYBOOL (__WINAPI is_lag_trace_func)(lprec *lp);\ntypedef MYBOOL (__WINAPI is_maxim_func)(lprec *lp);\ntypedef MYBOOL (__WINAPI is_nativeBFP_func)(lprec *lp);\ntypedef MYBOOL (__WINAPI is_nativeXLI_func)(lprec *lp);\ntypedef MYBOOL (__WINAPI is_negative_func)(lprec *lp, int colnr);\ntypedef MYBOOL (__WINAPI is_obj_in_basis_func)(lprec *lp);\ntypedef MYBOOL (__WINAPI is_piv_mode_func)(lprec *lp, int testmask);\ntypedef MYBOOL (__WINAPI is_piv_rule_func)(lprec *lp, int rule);\ntypedef MYBOOL (__WINAPI is_presolve_func)(lprec *lp, int testmask);\ntypedef MYBOOL (__WINAPI is_scalemode_func)(lprec *lp, int testmask);\ntypedef MYBOOL (__WINAPI is_scaletype_func)(lprec *lp, int scaletype);\ntypedef MYBOOL (__WINAPI is_semicont_func)(lprec *lp, int colnr);\ntypedef MYBOOL (__WINAPI is_SOS_var_func)(lprec *lp, int colnr);\ntypedef MYBOOL (__WINAPI is_trace_func)(lprec *lp);\ntypedef void (__WINAPI lp_solve_version_func)(int *majorversion, int *minorversion, int *release, int *build);\ntypedef lprec * (__WINAPI make_lp_func)(int rows, int columns);\ntypedef void (__WINAPI print_constraints_func)(lprec *lp, int columns);\ntypedef MYBOOL (__WINAPI print_debugdump_func)(lprec *lp, char *filename);\ntypedef void (__WINAPI print_duals_func)(lprec *lp);\ntypedef void (__WINAPI print_lp_func)(lprec *lp);\ntypedef void (__WINAPI print_objective_func)(lprec *lp);\ntypedef void (__WINAPI print_scales_func)(lprec *lp);\ntypedef void (__WINAPI print_solution_func)(lprec *lp, int columns);\ntypedef void (__WINAPI print_str_func)(lprec *lp, char *str);\ntypedef void (__WINAPI print_tableau_func)(lprec *lp);\ntypedef void (__WINAPI put_abortfunc_func)(lprec *lp, lphandle_intfunc newctrlc, void *ctrlchandle);\ntypedef void (__WINAPI put_bb_nodefunc_func)(lprec *lp, lphandleint_intfunc newnode, void *bbnodehandle);\ntypedef void (__WINAPI put_bb_branchfunc_func)(lprec *lp, lphandleint_intfunc newbranch, void *bbbranchhandle);\ntypedef void (__WINAPI put_logfunc_func)(lprec *lp, lphandlestr_func newlog, void *loghandle);\ntypedef void (__WINAPI put_msgfunc_func)(lprec *lp, lphandleint_func newmsg, void *msghandle, int mask);\ntypedef lprec * (__WINAPI read_LP_func)(char *filename, int verbose, char *lp_name);\ntypedef lprec * (__WINAPI read_MPS_func)(char *filename, int options);\ntypedef lprec * (__WINAPI read_XLI_func)(char *xliname, char *modelname, char *dataname, char *options, int verbose);\ntypedef MYBOOL (__WINAPI read_basis_func)(lprec *lp, char *filename, char *info);\ntypedef void (__WINAPI reset_basis_func)(lprec *lp);\ntypedef MYBOOL (__WINAPI read_params_func)(lprec *lp, char *filename, char *options);\ntypedef void (__WINAPI reset_params_func)(lprec *lp);\ntypedef MYBOOL (__WINAPI resize_lp_func)(lprec *lp, int rows, int columns);\ntypedef MYBOOL (__WINAPI set_add_rowmode_func)(lprec *lp, MYBOOL turnon);\ntypedef void (__WINAPI set_anti_degen_func)(lprec *lp, int anti_degen);\ntypedef int  (__WINAPI set_basisvar_func)(lprec *lp, int basisPos, int enteringCol);\ntypedef MYBOOL (__WINAPI set_basis_func)(lprec *lp, int *bascolumn, MYBOOL nonbasic);\ntypedef void (__WINAPI set_basiscrash_func)(lprec *lp, int mode);\ntypedef void (__WINAPI set_bb_depthlimit_func)(lprec *lp, int bb_maxlevel);\ntypedef void (__WINAPI set_bb_floorfirst_func)(lprec *lp, int bb_floorfirst);\ntypedef void (__WINAPI set_bb_rule_func)(lprec *lp, int bb_rule);\ntypedef MYBOOL (__WINAPI set_BFP_func)(lprec *lp, char *filename);\ntypedef MYBOOL (__WINAPI set_binary_func)(lprec *lp, int colnr, MYBOOL must_be_bin);\ntypedef MYBOOL (__WINAPI set_bounds_func)(lprec *lp, int colnr, REAL lower, REAL upper);\ntypedef void (__WINAPI set_bounds_tighter_func)(lprec *lp, MYBOOL tighten);\ntypedef void (__WINAPI set_break_at_first_func)(lprec *lp, MYBOOL break_at_first);\ntypedef void (__WINAPI set_break_at_value_func)(lprec *lp, REAL break_at_value);\ntypedef MYBOOL (__WINAPI set_column_func)(lprec *lp, int colnr, REAL *column);\ntypedef MYBOOL (__WINAPI set_columnex_func)(lprec *lp, int colnr, int count, REAL *column, int *rowno);\ntypedef MYBOOL (__WINAPI set_col_name_func)(lprec *lp, int colnr, char *new_name);\ntypedef MYBOOL (__WINAPI set_constr_type_func)(lprec *lp, int rownr, int con_type);\ntypedef void (__WINAPI set_debug_func)(lprec *lp, MYBOOL debug);\ntypedef void (__WINAPI set_epsb_func)(lprec *lp, REAL epsb);\ntypedef void (__WINAPI set_epsd_func)(lprec *lp, REAL epsd);\ntypedef void (__WINAPI set_epsel_func)(lprec *lp, REAL epsel);\ntypedef void (__WINAPI set_epsint_func)(lprec *lp, REAL epsint);\ntypedef MYBOOL (__WINAPI set_epslevel_func)(lprec *lp, int epslevel);\ntypedef void (__WINAPI set_epsperturb_func)(lprec *lp, REAL epsperturb);\ntypedef void (__WINAPI set_epspivot_func)(lprec *lp, REAL epspivot);\ntypedef MYBOOL (__WINAPI set_unbounded_func)(lprec *lp, int colnr);\ntypedef void (__WINAPI set_improve_func)(lprec *lp, int improve);\ntypedef void (__WINAPI set_infinite_func)(lprec *lp, REAL infinite);\ntypedef MYBOOL (__WINAPI set_int_func)(lprec *lp, int colnr, MYBOOL must_be_int);\ntypedef void (__WINAPI set_lag_trace_func)(lprec *lp, MYBOOL lag_trace);\ntypedef MYBOOL (__WINAPI set_lowbo_func)(lprec *lp, int colnr, REAL value);\ntypedef MYBOOL (__WINAPI set_lp_name_func)(lprec *lp, char *lpname);\ntypedef MYBOOL (__WINAPI set_mat_func)(lprec *lp, int row, int column, REAL value);\ntypedef void (__WINAPI set_maxim_func)(lprec *lp);\ntypedef void (__WINAPI set_maxpivot_func)(lprec *lp, int max_num_inv);\ntypedef void (__WINAPI set_minim_func)(lprec *lp);\ntypedef void (__WINAPI set_mip_gap_func)(lprec *lp, MYBOOL absolute, REAL mip_gap);\ntypedef MYBOOL (__WINAPI set_multiprice_func)(lprec *lp, int multiblockdiv);\ntypedef void (__WINAPI set_negrange_func)(lprec *lp, REAL negrange);\ntypedef MYBOOL (__WINAPI set_obj_func)(lprec *lp, int colnr, REAL value);\ntypedef void (__WINAPI set_obj_bound_func)(lprec *lp, REAL obj_bound);\ntypedef MYBOOL (__WINAPI set_obj_fn_func)(lprec *lp, REAL *row);\ntypedef MYBOOL (__WINAPI set_obj_fnex_func)(lprec *lp, int count, REAL *row, int *colno);\ntypedef void (__WINAPI set_obj_in_basis_func)(lprec *lp, MYBOOL obj_in_basis);\ntypedef MYBOOL (__WINAPI set_outputfile_func)(lprec *lp, char *filename);\ntypedef void (__WINAPI set_outputstream_func)(lprec *lp, FILE *stream);\ntypedef MYBOOL (__WINAPI set_partialprice_func)(lprec *lp, int blockcount, int *blockstart, MYBOOL isrow);\ntypedef void (__WINAPI set_pivoting_func)(lprec *lp, int piv_rule);\ntypedef void (__WINAPI set_preferdual_func)(lprec *lp, MYBOOL dodual);\ntypedef void (__WINAPI set_presolve_func)(lprec *lp, int presolvemode, int maxloops);\ntypedef void (__WINAPI set_print_sol_func)(lprec *lp, int print_sol);\ntypedef MYBOOL (__WINAPI set_pseudocosts_func)(lprec *lp, REAL *clower, REAL *cupper, int *updatelimit);\ntypedef MYBOOL (__WINAPI set_rh_func)(lprec *lp, int rownr, REAL value);\ntypedef MYBOOL (__WINAPI set_rh_range_func)(lprec *lp, int rownr, REAL deltavalue);\ntypedef void (__WINAPI set_rh_vec_func)(lprec *lp, REAL *rh);\ntypedef MYBOOL (__WINAPI set_row_func)(lprec *lp, int rownr, REAL *row);\ntypedef MYBOOL (__WINAPI set_rowex_func)(lprec *lp, int rownr, int count, REAL *row, int *colno);\ntypedef MYBOOL (__WINAPI set_row_name_func)(lprec *lp, int rownr, char *new_name);\ntypedef void (__WINAPI set_scalelimit_func)(lprec *lp, REAL scalelimit);\ntypedef void (__WINAPI set_scaling_func)(lprec *lp, int scalemode);\ntypedef MYBOOL (__WINAPI set_semicont_func)(lprec *lp, int colnr, MYBOOL must_be_sc);\ntypedef void (__WINAPI set_sense_func)(lprec *lp, MYBOOL maximize);\ntypedef void (__WINAPI set_simplextype_func)(lprec *lp, int simplextype);\ntypedef void (__WINAPI set_solutionlimit_func)(lprec *lp, int limit);\ntypedef void (__WINAPI set_timeout_func)(lprec *lp, long sectimeout);\ntypedef void (__WINAPI set_trace_func)(lprec *lp, MYBOOL trace);\ntypedef MYBOOL (__WINAPI set_upbo_func)(lprec *lp, int colnr, REAL value);\ntypedef MYBOOL (__WINAPI set_var_branch_func)(lprec *lp, int colnr, int branch_mode);\ntypedef MYBOOL (__WINAPI set_var_weights_func)(lprec *lp, REAL *weights);\ntypedef void (__WINAPI set_verbose_func)(lprec *lp, int verbose);\ntypedef MYBOOL (__WINAPI set_XLI_func)(lprec *lp, char *filename);\ntypedef int (__WINAPI solve_func)(lprec *lp);\ntypedef MYBOOL (__WINAPI str_add_column_func)(lprec *lp, char *col_string);\ntypedef MYBOOL (__WINAPI str_add_constraint_func)(lprec *lp, char *row_string ,int constr_type, REAL rh);\ntypedef MYBOOL (__WINAPI str_add_lag_con_func)(lprec *lp, char *row_string, int con_type, REAL rhs);\ntypedef MYBOOL (__WINAPI str_set_obj_fn_func)(lprec *lp, char *row_string);\ntypedef MYBOOL (__WINAPI str_set_rh_vec_func)(lprec *lp, char *rh_string);\ntypedef REAL (__WINAPI time_elapsed_func)(lprec *lp);\ntypedef void (__WINAPI unscale_func)(lprec *lp);\ntypedef MYBOOL (__WINAPI write_lp_func)(lprec *lp, char *filename);\ntypedef MYBOOL (__WINAPI write_LP_func)(lprec *lp, FILE *output);\ntypedef MYBOOL (__WINAPI write_mps_func)(lprec *lp, char *filename);\ntypedef MYBOOL (__WINAPI write_MPS_func)(lprec *lp, FILE *output);\ntypedef MYBOOL (__WINAPI write_freemps_func)(lprec *lp, char *filename);\ntypedef MYBOOL (__WINAPI write_freeMPS_func)(lprec *lp, FILE *output);\ntypedef MYBOOL (__WINAPI write_XLI_func)(lprec *lp, char *filename, char *options, MYBOOL results);\ntypedef MYBOOL (__WINAPI write_basis_func)(lprec *lp, char *filename);\ntypedef MYBOOL (__WINAPI write_params_func)(lprec *lp, char *filename, char *options);\n\n\n/* Prototypes for callbacks from basis inverse/factorization libraries       */\n/* ------------------------------------------------------------------------- */\ntypedef MYBOOL (__WINAPI userabortfunc)(lprec *lp, int level);\ntypedef void   (__VACALL reportfunc)(lprec *lp, int level, char *format, ...);\ntypedef char * (__VACALL explainfunc)(lprec *lp, char *format, ...);\ntypedef int    (__WINAPI getvectorfunc)(lprec *lp, int varin, REAL *pcol, int *nzlist, int *maxabs);\ntypedef int    (__WINAPI getpackedfunc)(lprec *lp, int j, int rn[], double bj[]);\ntypedef REAL    (__WINAPI get_OF_activefunc)(lprec *lp, int varnr, REAL mult);\ntypedef int    (__WINAPI getMDOfunc)(lprec *lp, MYBOOL *usedpos, int *colorder, int *size, MYBOOL symmetric);\ntypedef MYBOOL (__WINAPI invertfunc)(lprec *lp, MYBOOL shiftbounds, MYBOOL final);\ntypedef void   (__WINAPI set_actionfunc)(int *actionvar, int actionmask);\ntypedef MYBOOL (__WINAPI is_actionfunc)(int actionvar, int testmask);\ntypedef void   (__WINAPI clear_actionfunc)(int *actionvar, int actionmask);\n\n\n/* Prototypes for basis inverse/factorization libraries                      */\n/* ------------------------------------------------------------------------- */\ntypedef char   *(BFP_CALLMODEL BFPchar)(void);\ntypedef void   (BFP_CALLMODEL BFP_lp)(lprec *lp);\ntypedef void   (BFP_CALLMODEL BFP_lpint)(lprec *lp, int newsize);\ntypedef int    (BFP_CALLMODEL BFPint_lp)(lprec *lp);\ntypedef int    (BFP_CALLMODEL BFPint_lpint)(lprec *lp, int kind);\ntypedef REAL   (BFP_CALLMODEL BFPreal_lp)(lprec *lp);\ntypedef REAL   *(BFP_CALLMODEL BFPrealp_lp)(lprec *lp);\ntypedef void   (BFP_CALLMODEL BFP_lpbool)(lprec *lp, MYBOOL maximum);\ntypedef int    (BFP_CALLMODEL BFPint_lpbool)(lprec *lp, MYBOOL maximum);\ntypedef int    (BFP_CALLMODEL BFPint_lpintintboolbool)(lprec *lp, int uservars, int Bsize, MYBOOL *usedpos, MYBOOL final);\ntypedef void   (BFP_CALLMODEL BFP_lprealint)(lprec *lp, REAL *pcol, int *nzidx);\ntypedef void   (BFP_CALLMODEL BFP_lprealintrealint)(lprec *lp, REAL *prow, int *pnzidx, REAL *drow, int *dnzidx);\ntypedef MYBOOL (BFP_CALLMODEL BFPbool_lp)(lprec *lp);\ntypedef MYBOOL (BFP_CALLMODEL BFPbool_lpbool)(lprec *lp, MYBOOL changesign);\ntypedef MYBOOL (BFP_CALLMODEL BFPbool_lpint)(lprec *lp, int size);\ntypedef MYBOOL (BFP_CALLMODEL BFPbool_lpintintchar)(lprec *lp, int size, int deltasize, char *options);\ntypedef MYBOOL (BFP_CALLMODEL BFPbool_lpintintint)(lprec *lp, int size, int deltasize, int sizeofvar);\ntypedef LREAL  (BFP_CALLMODEL BFPlreal_lpintintreal)(lprec *lp, int row_nr, int col_nr, REAL *pcol);\ntypedef REAL   (BFP_CALLMODEL BFPreal_lplrealreal)(lprec *lp, LREAL theta, REAL *pcol);\n\ntypedef int    (BFP_CALLMODEL getcolumnex_func)(lprec *lp, int colnr, REAL *nzvalues, int *nzrows, int *mapin);\ntypedef int    (BFP_CALLMODEL BFPint_lpintrealcbintint)(lprec *lp, int items, getcolumnex_func cb, int *maprow, int*mapcol);\n\n/* Prototypes for external language libraries                                */\n/* ------------------------------------------------------------------------- */\ntypedef char   *(XLI_CALLMODEL XLIchar)(void);\ntypedef MYBOOL (XLI_CALLMODEL XLIbool_lpintintint)(lprec* lp, int size, int deltasize, int sizevar);\ntypedef MYBOOL (XLI_CALLMODEL XLIbool_lpcharcharcharint)(lprec *lp, char *modelname, char *dataname, char *options, int verbose);\ntypedef MYBOOL (XLI_CALLMODEL XLIbool_lpcharcharbool)(lprec *lp, char *filename, char *options, MYBOOL results);\n\n\n/* Main lp_solve prototypes and function definitions                         */\n/* ------------------------------------------------------------------------- */\nstruct _lprec\n{\n  /* Full list of exported functions made available in a quasi object-oriented fashion */\n  add_column_func               *add_column;\n  add_columnex_func             *add_columnex;\n  add_constraint_func           *add_constraint;\n  add_constraintex_func         *add_constraintex;\n  add_lag_con_func              *add_lag_con;\n  add_SOS_func                  *add_SOS;\n  column_in_lp_func             *column_in_lp;\n  copy_lp_func                  *copy_lp;\n  default_basis_func            *default_basis;\n  del_column_func               *del_column;\n  del_constraint_func           *del_constraint;\n  delete_lp_func                *delete_lp;\n  dualize_lp_func               *dualize_lp;\n  free_lp_func                  *free_lp;\n  get_anti_degen_func           *get_anti_degen;\n  get_basis_func                *get_basis;\n  get_basiscrash_func           *get_basiscrash;\n  get_bb_depthlimit_func        *get_bb_depthlimit;\n  get_bb_floorfirst_func        *get_bb_floorfirst;\n  get_bb_rule_func              *get_bb_rule;\n  get_bounds_tighter_func       *get_bounds_tighter;\n  get_break_at_value_func       *get_break_at_value;\n  get_col_name_func             *get_col_name;\n  get_columnex_func             *get_columnex;\n  get_constr_type_func          *get_constr_type;\n  get_constr_value_func         *get_constr_value;\n  get_constraints_func          *get_constraints;\n  get_dual_solution_func        *get_dual_solution;\n  get_epsb_func                 *get_epsb;\n  get_epsd_func                 *get_epsd;\n  get_epsel_func                *get_epsel;\n  get_epsint_func               *get_epsint;\n  get_epsperturb_func           *get_epsperturb;\n  get_epspivot_func             *get_epspivot;\n  get_improve_func              *get_improve;\n  get_infinite_func             *get_infinite;\n  get_lambda_func               *get_lambda;\n  get_lowbo_func                *get_lowbo;\n  get_lp_index_func             *get_lp_index;\n  get_lp_name_func              *get_lp_name;\n  get_Lrows_func                *get_Lrows;\n  get_mat_func                  *get_mat;\n  get_mat_byindex_func          *get_mat_byindex;\n  get_max_level_func            *get_max_level;\n  get_maxpivot_func             *get_maxpivot;\n  get_mip_gap_func              *get_mip_gap;\n  get_multiprice_func           *get_multiprice;\n  get_nameindex_func            *get_nameindex;\n  get_Ncolumns_func             *get_Ncolumns;\n  get_negrange_func             *get_negrange;\n  get_nz_func                   *get_nonzeros;\n  get_Norig_columns_func        *get_Norig_columns;\n  get_Norig_rows_func           *get_Norig_rows;\n  get_Nrows_func                *get_Nrows;\n  get_obj_bound_func            *get_obj_bound;\n  get_objective_func            *get_objective;\n  get_orig_index_func           *get_orig_index;\n  get_origcol_name_func         *get_origcol_name;\n  get_origrow_name_func         *get_origrow_name;\n  get_partialprice_func         *get_partialprice;\n  get_pivoting_func             *get_pivoting;\n  get_presolve_func             *get_presolve;\n  get_presolveloops_func        *get_presolveloops;\n  get_primal_solution_func      *get_primal_solution;\n  get_print_sol_func            *get_print_sol;\n  get_pseudocosts_func          *get_pseudocosts;\n  get_ptr_constraints_func      *get_ptr_constraints;\n  get_ptr_dual_solution_func    *get_ptr_dual_solution;\n  get_ptr_lambda_func           *get_ptr_lambda;\n  get_ptr_primal_solution_func  *get_ptr_primal_solution;\n  get_ptr_sensitivity_obj_func  *get_ptr_sensitivity_obj;\n  get_ptr_sensitivity_objex_func *get_ptr_sensitivity_objex;\n  get_ptr_sensitivity_rhs_func  *get_ptr_sensitivity_rhs;\n  get_ptr_variables_func        *get_ptr_variables;\n  get_rh_func                   *get_rh;\n  get_rh_range_func             *get_rh_range;\n  get_row_func                  *get_row;\n  get_rowex_func                *get_rowex;\n  get_row_name_func             *get_row_name;\n  get_scalelimit_func           *get_scalelimit;\n  get_scaling_func              *get_scaling;\n  get_sensitivity_obj_func      *get_sensitivity_obj;\n  get_sensitivity_objex_func    *get_sensitivity_objex;\n  get_sensitivity_rhs_func      *get_sensitivity_rhs;\n  get_simplextype_func          *get_simplextype;\n  get_solutioncount_func        *get_solutioncount;\n  get_solutionlimit_func        *get_solutionlimit;\n  get_status_func               *get_status;\n  get_statustext_func           *get_statustext;\n  get_timeout_func              *get_timeout;\n  get_total_iter_func           *get_total_iter;\n  get_total_nodes_func          *get_total_nodes;\n  get_upbo_func                 *get_upbo;\n  get_var_branch_func           *get_var_branch;\n  get_var_dualresult_func       *get_var_dualresult;\n  get_var_primalresult_func     *get_var_primalresult;\n  get_var_priority_func         *get_var_priority;\n  get_variables_func            *get_variables;\n  get_verbose_func              *get_verbose;\n  get_working_objective_func    *get_working_objective;\n  has_BFP_func                  *has_BFP;\n  has_XLI_func                  *has_XLI;\n  is_add_rowmode_func           *is_add_rowmode;\n  is_anti_degen_func            *is_anti_degen;\n  is_binary_func                *is_binary;\n  is_break_at_first_func        *is_break_at_first;\n  is_constr_type_func           *is_constr_type;\n  is_debug_func                 *is_debug;\n  is_feasible_func              *is_feasible;\n  is_infinite_func              *is_infinite;\n  is_int_func                   *is_int;\n  is_integerscaling_func        *is_integerscaling;\n  is_lag_trace_func             *is_lag_trace;\n  is_maxim_func                 *is_maxim;\n  is_nativeBFP_func             *is_nativeBFP;\n  is_nativeXLI_func             *is_nativeXLI;\n  is_negative_func              *is_negative;\n  is_obj_in_basis_func          *is_obj_in_basis;\n  is_piv_mode_func              *is_piv_mode;\n  is_piv_rule_func              *is_piv_rule;\n  is_presolve_func              *is_presolve;\n  is_scalemode_func             *is_scalemode;\n  is_scaletype_func             *is_scaletype;\n  is_semicont_func              *is_semicont;\n  is_SOS_var_func               *is_SOS_var;\n  is_trace_func                 *is_trace;\n  is_unbounded_func             *is_unbounded;\n  is_use_names_func             *is_use_names;\n  lp_solve_version_func         *lp_solve_version;\n  make_lp_func                  *make_lp;\n  print_constraints_func        *print_constraints;\n  print_debugdump_func          *print_debugdump;\n  print_duals_func              *print_duals;\n  print_lp_func                 *print_lp;\n  print_objective_func          *print_objective;\n  print_scales_func             *print_scales;\n  print_solution_func           *print_solution;\n  print_str_func                *print_str;\n  print_tableau_func            *print_tableau;\n  put_abortfunc_func            *put_abortfunc;\n  put_bb_nodefunc_func          *put_bb_nodefunc;\n  put_bb_branchfunc_func        *put_bb_branchfunc;\n  put_logfunc_func              *put_logfunc;\n  put_msgfunc_func              *put_msgfunc;\n  read_LP_func                  *read_LP;\n  read_MPS_func                 *read_MPS;\n  read_XLI_func                 *read_XLI;\n  read_params_func              *read_params;\n  read_basis_func               *read_basis;\n  reset_basis_func              *reset_basis;\n  reset_params_func             *reset_params;\n  resize_lp_func                *resize_lp;\n  set_add_rowmode_func          *set_add_rowmode;\n  set_anti_degen_func           *set_anti_degen;\n  set_basisvar_func             *set_basisvar;\n  set_basis_func                *set_basis;\n  set_basiscrash_func           *set_basiscrash;\n  set_bb_depthlimit_func        *set_bb_depthlimit;\n  set_bb_floorfirst_func        *set_bb_floorfirst;\n  set_bb_rule_func              *set_bb_rule;\n  set_BFP_func                  *set_BFP;\n  set_binary_func               *set_binary;\n  set_bounds_func               *set_bounds;\n  set_bounds_tighter_func       *set_bounds_tighter;\n  set_break_at_first_func       *set_break_at_first;\n  set_break_at_value_func       *set_break_at_value;\n  set_column_func               *set_column;\n  set_columnex_func             *set_columnex;\n  set_col_name_func             *set_col_name;\n  set_constr_type_func          *set_constr_type;\n  set_debug_func                *set_debug;\n  set_epsb_func                 *set_epsb;\n  set_epsd_func                 *set_epsd;\n  set_epsel_func                *set_epsel;\n  set_epsint_func               *set_epsint;\n  set_epslevel_func             *set_epslevel;\n  set_epsperturb_func           *set_epsperturb;\n  set_epspivot_func             *set_epspivot;\n  set_unbounded_func            *set_unbounded;\n  set_improve_func              *set_improve;\n  set_infinite_func             *set_infinite;\n  set_int_func                  *set_int;\n  set_lag_trace_func            *set_lag_trace;\n  set_lowbo_func                *set_lowbo;\n  set_lp_name_func              *set_lp_name;\n  set_mat_func                  *set_mat;\n  set_maxim_func                *set_maxim;\n  set_maxpivot_func             *set_maxpivot;\n  set_minim_func                *set_minim;\n  set_mip_gap_func              *set_mip_gap;\n  set_multiprice_func           *set_multiprice;\n  set_negrange_func             *set_negrange;\n  set_obj_bound_func            *set_obj_bound;\n  set_obj_fn_func               *set_obj_fn;\n  set_obj_fnex_func             *set_obj_fnex;\n  set_obj_func                  *set_obj;\n  set_obj_in_basis_func         *set_obj_in_basis;\n  set_outputfile_func           *set_outputfile;\n  set_outputstream_func         *set_outputstream;\n  set_partialprice_func         *set_partialprice;\n  set_pivoting_func             *set_pivoting;\n  set_preferdual_func           *set_preferdual;\n  set_presolve_func             *set_presolve;\n  set_print_sol_func            *set_print_sol;\n  set_pseudocosts_func          *set_pseudocosts;\n  set_rh_func                   *set_rh;\n  set_rh_range_func             *set_rh_range;\n  set_rh_vec_func               *set_rh_vec;\n  set_row_func                  *set_row;\n  set_rowex_func                *set_rowex;\n  set_row_name_func             *set_row_name;\n  set_scalelimit_func           *set_scalelimit;\n  set_scaling_func              *set_scaling;\n  set_semicont_func             *set_semicont;\n  set_sense_func                *set_sense;\n  set_simplextype_func          *set_simplextype;\n  set_solutionlimit_func        *set_solutionlimit;\n  set_timeout_func              *set_timeout;\n  set_trace_func                *set_trace;\n  set_upbo_func                 *set_upbo;\n  set_use_names_func            *set_use_names;\n  set_var_branch_func           *set_var_branch;\n  set_var_weights_func          *set_var_weights;\n  set_verbose_func              *set_verbose;\n  set_XLI_func                  *set_XLI;\n  solve_func                    *solve;\n  str_add_column_func           *str_add_column;\n  str_add_constraint_func       *str_add_constraint;\n  str_add_lag_con_func          *str_add_lag_con;\n  str_set_obj_fn_func           *str_set_obj_fn;\n  str_set_rh_vec_func           *str_set_rh_vec;\n  time_elapsed_func             *time_elapsed;\n  unscale_func                  *unscale;\n  write_lp_func                 *write_lp;\n  write_LP_func                 *write_LP;\n  write_mps_func                *write_mps;\n  write_MPS_func                *write_MPS;\n  write_freemps_func            *write_freemps;\n  write_freeMPS_func            *write_freeMPS;\n  write_XLI_func                *write_XLI;\n  write_basis_func              *write_basis;\n  write_params_func             *write_params;\n\n  /* Spacer */\n  int       *alignmentspacer;\n\n  /* Problem description */\n  char      *lp_name;           /* The name of the model */\n\n  /* Problem sizes */\n  int       sum;                /* The total number of variables, including slacks */\n  int       rows;\n  int       columns;\n  int       equalities;         /* No of non-Lagrangean equality constraints in the problem */\n  int       boundedvars;        /* Count of bounded variables */\n  int       INTfuture1;\n\n  /* Memory allocation sizes */\n  int       sum_alloc;          /* The allocated memory for row+column-sized data */\n  int       rows_alloc;         /* The allocated memory for row-sized data */\n  int       columns_alloc;      /* The allocated memory for column-sized data */\n\n  /* Model status and solver result variables */\n  MYBOOL    source_is_file;     /* The base model was read from a file */\n  MYBOOL    model_is_pure;      /* The model has been built entirely from row and column additions */\n  MYBOOL    model_is_valid;     /* Has this lp pased the 'test' */\n  MYBOOL    tighten_on_set;     /* Specify if bounds will be tightened or overriden at bound setting */\n  MYBOOL    names_used;         /* Flag to indicate if names for rows and columns are used */\n  MYBOOL    use_row_names;      /* Flag to indicate if names for rows are used */\n  MYBOOL    use_col_names;      /* Flag to indicate if names for columns are used */\n\n  MYBOOL    lag_trace;          /* Print information on Lagrange progression */\n  MYBOOL    spx_trace;          /* Print information on simplex progression */\n  MYBOOL    bb_trace;           /* TRUE to print extra debug information */\n  MYBOOL    streamowned;        /* TRUE if the handle should be closed at delete_lp() */\n  MYBOOL    obj_in_basis;       /* TRUE if the objective function is in the basis matrix */\n\n  int       spx_status;         /* Simplex solver feasibility/mode code */\n  int       lag_status;         /* Extra status variable for lag_solve */\n  int       solutioncount;      /* number of equal-valued solutions found (up to solutionlimit) */\n  int       solutionlimit;      /* upper number of equal-valued solutions kept track of */\n\n  REAL      real_solution;      /* Optimal non-MIP solution base */\n  REAL      *solution;          /* sum_alloc+1 : Solution array of the next to optimal LP,\n                                   Index   0           : Objective function value,\n                                   Indeces 1..rows     : Slack variable values,\n                                   Indeced rows+1..sum : Variable values */\n  REAL      *best_solution;     /* sum_alloc+1 : Solution array of optimal 'Integer' LP,\n                                   structured as the solution array above */\n  REAL      *full_solution;     /* sum_alloc+1 : Final solution array expanded for deleted variables */\n  REAL      *edgeVector;        /* Array of reduced cost scaling norms (DEVEX and Steepest Edge) */\n\n  REAL      *drow;              /* sum+1: Reduced costs of the last simplex */\n  int       *nzdrow;            /* sum+1: Indeces of non-zero reduced costs of the last simplex */\n  REAL      *duals;             /* rows_alloc+1 : The dual variables of the last LP */\n  REAL      *full_duals;        /* sum_alloc+1: Final duals array expanded for deleted variables */\n  REAL      *dualsfrom;         /* sum_alloc+1 :The sensitivity on dual variables/reduced costs\n                                   of the last LP */\n  REAL      *dualstill;         /* sum_alloc+1 :The sensitivity on dual variables/reduced costs\n                                   of the last LP */\n  REAL      *objfrom;           /* columns_alloc+1 :The sensitivity on objective function\n                                   of the last LP */\n  REAL      *objtill;           /* columns_alloc+1 :The sensitivity on objective function\n                                   of the last LP */\n  REAL      *objfromvalue;      /* columns_alloc+1 :The value of the variables when objective value\n                                   is at its from value of the last LP */\n  REAL      *orig_obj;          /* Unused pointer - Placeholder for OF not part of B */\n  REAL      *obj;               /* Special vector used to temporarily change the OF vector */\n\n  COUNTER   current_iter;       /* Number of iterations in the current/last simplex */\n  COUNTER   total_iter;         /* Number of iterations over all B&B steps */\n  COUNTER   current_bswap;      /* Number of bound swaps in the current/last simplex */\n  COUNTER   total_bswap;        /* Number of bount swaps over all B&B steps */\n  int       solvecount;         /* The number of solve() performed in this model */\n  int       max_pivots;         /* Number of pivots between refactorizations of the basis */\n\n  /* Various execution parameters */\n  int       simplex_strategy;   /* Set desired combination of primal and dual simplex algorithms */\n  int       simplex_mode;       /* Specifies the current simplex mode during solve; see simplex_strategy */\n  int       verbose;            /* Set amount of run-time messages and results */\n  int       print_sol;          /* TRUE to print optimal solution; AUTOMATIC skips zeros */\n  FILE      *outstream;         /* Output stream, initialized to STDOUT */\n\n  /* Main Branch and Bound settings */\n  MYBOOL    *bb_varbranch;      /* Determines branching strategy at the individual variable level;\n                                   the setting here overrides the bb_floorfirst setting */\n  int       piv_strategy;       /* Strategy for selecting row and column entering/leaving */\n  int       _piv_rule_;         /* Internal working rule-part of piv_strategy above */\n  int       bb_rule;            /* Rule for selecting B&B variables */\n  MYBOOL    bb_floorfirst;      /* Set BRANCH_FLOOR for B&B to set variables to floor bound first;\n                                   conversely with BRANCH_CEILING, the ceiling value is set first */\n  MYBOOL    bb_breakfirst;      /* TRUE to stop at first feasible solution */\n  MYBOOL    _piv_left_;         /* Internal variable indicating active pricing loop order */\n  MYBOOL    BOOLfuture1;\n\n  REAL      scalelimit;         /* Relative convergence criterion for iterated scaling */\n  int       scalemode;          /* OR-ed codes for data scaling */\n  int       improve;            /* Set to non-zero for iterative improvement */\n  int       anti_degen;         /* Anti-degen strategy (or none) TRUE to avoid cycling */\n  int       do_presolve;        /* PRESOLVE_ parameters for LP presolving */\n  int       presolveloops;      /* Maximum number of presolve loops */\n\n  int       perturb_count;      /* The number of bound relaxation retries performed */\n\n  /* Row and column names storage variables */\n  hashelem  **row_name;         /* rows_alloc+1 */\n  hashelem  **col_name;         /* columns_alloc+1 */\n  hashtable *rowname_hashtab;   /* hash table to store row names */\n  hashtable *colname_hashtab;   /* hash table to store column names */\n\n  /* Optionally specify continuous rows/column blocks for partial pricing */\n  partialrec *rowblocks;\n  partialrec *colblocks;\n\n  /* Row and column type codes */\n  MYBOOL    *var_type;          /* sum_alloc+1 : TRUE if variable must be integer */\n\n  /* Data for multiple pricing */\n  multirec  *multivars;\n  int       multiblockdiv;      /* The divisor used to set or augment pricing block */\n\n  /* Variable (column) parameters */\n  int       fixedvars;          /* The current number of basic fixed variables in the model */\n  int       int_vars;           /* Number of variables required to be integer */\n\n  int       sc_vars;            /* Number of semi-continuous variables */\n  REAL      *sc_lobound;        /* sum_columns+1 : TRUE if variable is semi-continuous;\n                                   value replaced by conventional lower bound during solve */\n  int       *var_is_free;       /* columns+1: Index of twin variable if variable is free */\n  int       *var_priority;      /* columns: Priority-mapping of variables */\n\n  SOSgroup  *GUB;               /* Pointer to record containing GUBs */\n\n  int       sos_vars;           /* Number of variables in the sos_priority list */\n  int       sos_ints;           /* Number of integers in SOS'es above */\n  SOSgroup  *SOS;               /* Pointer to record containing all SOS'es */\n  int       *sos_priority;      /* Priority-sorted list of variables (no duplicates) */\n\n  /* Optionally specify list of active rows/columns used in multiple pricing */\n  REAL      *bsolveVal;         /* rows+1: bsolved solution vector for reduced costs */\n  int       *bsolveIdx;         /* rows+1: Non-zero indeces of bsolveVal */\n\n  /* RHS storage */\n  REAL      *orig_rhs;          /* rows_alloc+1 : The RHS after scaling and sign\n                                   changing, but before 'Bound transformation' */\n  LREAL     *rhs;               /* rows_alloc+1 : The RHS of the current simplex tableau */\n\n  /* Row (constraint) parameters */\n  int       *row_type;          /* rows_alloc+1 : Row/constraint type coding */\n\n  /* Optionally specify data for dual long-step */\n  multirec  *longsteps;\n\n  /* Original and working row and variable bounds */\n  REAL      *orig_upbo;         /* sum_alloc+1 : Bound before transformations */\n  REAL      *upbo;              /*  \" \" : Upper bound after transformation and B&B work */\n  REAL      *orig_lowbo;        /*  \"       \"                                 */\n  REAL      *lowbo;             /*  \" \" : Lower bound after transformation and B&B work */\n\n  /* User data and basis factorization matrices (ETA or LU, product form) */\n  MATrec    *matA;\n  INVrec    *invB;\n\n  /* Basis and bounds */\n  BBrec     *bb_bounds;         /* The linked list of B&B bounds */\n  BBrec     *rootbounds;        /* The bounds at the lowest B&B level */\n  basisrec  *bb_basis;          /* The linked list of B&B bases */\n  basisrec  *rootbasis;\n  OBJmonrec *monitor;           /* Objective monitoring record for stalling/degeneracy handling */\n\n  /* Scaling parameters */\n  REAL      *scalars;           /* sum_alloc+1:0..Rows the scaling of the rows,\n                                   Rows+1..Sum the scaling of the columns */\n  MYBOOL    scaling_used;       /* TRUE if scaling is used */\n  MYBOOL    columns_scaled;     /* TRUE if the columns are scaled too */\n  MYBOOL    varmap_locked;      /* Determines whether the var_to_orig and orig_to_var are fixed */\n\n  /* Variable state information */\n  MYBOOL    basis_valid;        /* TRUE is the basis is still valid */\n  int       crashmode;          /* Basis crashing mode (or none) */\n  int       *var_basic;         /* rows_alloc+1: The list of columns in the basis */\n  REAL      *val_nonbasic;      /* Array to store current values of non-basic variables */\n  MYBOOL    *is_basic;          /* sum_alloc+1: TRUE if the column is in the basis */\n  MYBOOL    *is_lower;          /*  \"       \" : TRUE if the variable is at its\n                                   lower bound (or in the basis), FALSE otherwise */\n\n  /* Simplex basis indicators */\n  int       *rejectpivot;       /* List of unacceptable pivot choices due to division-by-zero */\n  BBPSrec   *bb_PseudoCost;     /* Data structure for costing of node branchings */\n  int       bb_PseudoUpdates;   /* Maximum number of updates for pseudo-costs */\n  int       bb_strongbranches;  /* The number of strong B&B branches performed */\n  int       is_strongbranch;    /* Are we currently in a strong branch mode? */\n  int       bb_improvements;    /* The number of discrete B&B objective improvement steps */\n\n  /* Solver working variables */\n  REAL      rhsmax;             /* The maximum |value| of the rhs vector at any iteration */\n  REAL      suminfeas;          /* The working sum of primal and dual infeasibilities */\n  REAL      bigM;               /* Original objective weighting in primal phase 1 */\n  REAL      P1extraVal;         /* Phase 1 OF/RHS offset for feasibility */\n  int       P1extraDim;         /* Phase 1 additional columns/rows for feasibility */\n  int       spx_action;         /* ACTION_ variables for the simplex routine */\n  MYBOOL    spx_perturbed;      /* The variable bounds were relaxed/perturbed into this simplex */\n  MYBOOL    bb_break;           /* Solver working variable; signals break of the B&B */\n  MYBOOL    wasPreprocessed;    /* The solve preprocessing was performed */\n  MYBOOL    wasPresolved;       /* The solve presolver was invoked */\n  int      INTfuture2;\n\n  /* Lagragean solver storage and parameters */\n  MATrec    *matL;\n  REAL      *lag_rhs;           /* Array of Lagrangean rhs vector */\n  int       *lag_con_type;      /* Array of GT, LT or EQ */\n  REAL      *lambda;            /* Lambda values (Lagrangean multipliers) */\n  REAL      lag_bound;          /* The Lagrangian lower OF bound */\n  REAL      lag_accept;         /* The Lagrangian convergence criterion */\n\n  /* Solver thresholds */\n  REAL      infinite;           /* Limit for dynamic range */\n  REAL      negrange;           /* Limit for negative variable range */\n  REAL      epsmachine;         /* Default machine accuracy */\n  REAL      epsvalue;           /* Input data precision / rounding of data values to 0 */\n  REAL      epsprimal;          /* For rounding RHS values to 0/infeasibility */\n  REAL      epsdual;            /* For rounding reduced costs to zero */\n  REAL      epspivot;           /* Pivot reject tolerance */\n  REAL      epsperturb;         /* Perturbation scalar */\n  REAL      epssolution;        /* The solution tolerance for final validation */\n\n  /* Branch & Bound working parameters */\n  int       bb_status;          /* Indicator that the last solvelp() gave an improved B&B solution */\n  int       bb_level;           /* Solver B&B working variable (recursion depth) */\n  int       bb_maxlevel;        /* The deepest B&B level of the last solution */\n  int       bb_limitlevel;      /* The maximum B&B level allowed */\n  COUNTER   bb_totalnodes;      /* Total number of nodes processed in B&B */\n  int       bb_solutionlevel;   /* The B&B level of the last / best solution */\n  int       bb_cutpoolsize;     /* Size of the B&B cut pool */\n  int       bb_cutpoolused;     /* Currently used cut pool */\n  int       bb_constraintOF;    /* General purpose B&B parameter (typically for testing) */\n  int       *bb_cuttype;        /* The type of the currently used cuts */\n  int       *bb_varactive;      /* The B&B state of the variable; 0 means inactive */\n  DeltaVrec *bb_upperchange;    /* Changes to upper bounds during the B&B phase */\n  DeltaVrec *bb_lowerchange;    /* Changes to lower bounds during the B&B phase */\n\n  REAL      bb_deltaOF;         /* Minimum OF step value; computed at beginning of solve() */\n\n  REAL      bb_breakOF;         /* User-settable value for the objective function deemed\n                               to be sufficiently good in an integer problem */\n  REAL      bb_limitOF;         /* \"Dual\" bound / limit to final optimal MIP solution */\n  REAL      bb_heuristicOF;     /* Set initial \"at least better than\" guess for objective function\n                               (can significantly speed up B&B iterations) */\n  REAL      bb_parentOF;        /* The OF value of the previous BB simplex */\n  REAL      bb_workOF;          /* The unadjusted OF value for the current best solution */\n\n  /* Internal work arrays allocated as required */\n  presolveundorec *presolve_undo;\n  workarraysrec   *workarrays;\n\n  /* MIP parameters */\n  REAL      epsint;             /* Margin of error in determining if a float value is integer */\n  REAL      mip_absgap;         /* Absolute MIP gap */\n  REAL      mip_relgap;         /* Relative MIP gap */\n\n  /* Time/timer variables and extended status text */\n  double    timecreate;\n  double    timestart;\n  double    timeheuristic;\n  double    timepresolved;\n  double    timeend;\n  long      sectimeout;\n\n  /* Extended status message text set via explain() */\n  char      *ex_status;\n\n  /* Refactorization engine interface routines (for dynamic DLL/SO BFPs) */\n#if LoadInverseLib == TRUE\n  #ifdef WIN32\n    HINSTANCE                   hBFP;\n  #else\n    void                        *hBFP;\n  #endif\n#endif\n  BFPchar                       *bfp_name;\n  BFPbool_lpintintint           *bfp_compatible;\n  BFPbool_lpintintchar          *bfp_init;\n  BFP_lp                        *bfp_free;\n  BFPbool_lpint                 *bfp_resize;\n  BFPint_lp                     *bfp_memallocated;\n  BFPbool_lp                    *bfp_restart;\n  BFPbool_lp                    *bfp_mustrefactorize;\n  BFPint_lp                     *bfp_preparefactorization;\n  BFPint_lpintintboolbool       *bfp_factorize;\n  BFP_lp                        *bfp_finishfactorization;\n  BFP_lp                        *bfp_updaterefactstats;\n  BFPlreal_lpintintreal         *bfp_prepareupdate;\n  BFPreal_lplrealreal           *bfp_pivotRHS;\n  BFPbool_lpbool                *bfp_finishupdate;\n  BFP_lprealint                 *bfp_ftran_prepare;\n  BFP_lprealint                 *bfp_ftran_normal;\n  BFP_lprealint                 *bfp_btran_normal;\n  BFP_lprealintrealint          *bfp_btran_double;\n  BFPint_lp                     *bfp_status;\n  BFPint_lpbool                 *bfp_nonzeros;\n  BFPbool_lp                    *bfp_implicitslack;\n  BFPint_lp                     *bfp_indexbase;\n  BFPint_lp                     *bfp_rowoffset;\n  BFPint_lp                     *bfp_pivotmax;\n  BFPbool_lpint                 *bfp_pivotalloc;\n  BFPint_lp                     *bfp_colcount;\n  BFPbool_lp                    *bfp_canresetbasis;\n  BFPreal_lp                    *bfp_efficiency;\n  BFPrealp_lp                   *bfp_pivotvector;\n  BFPint_lp                     *bfp_pivotcount;\n  BFPint_lpint                  *bfp_refactcount;\n  BFPbool_lp                    *bfp_isSetI;\n  BFPint_lpintrealcbintint      *bfp_findredundant;\n\n  /* External language interface routines (for dynamic DLL/SO XLIs) */\n#if LoadLanguageLib == TRUE\n  #ifdef WIN32\n    HINSTANCE                   hXLI;\n  #else\n    void                        *hXLI;\n  #endif\n#endif\n  XLIchar                       *xli_name;\n  XLIbool_lpintintint           *xli_compatible;\n  XLIbool_lpcharcharcharint     *xli_readmodel;\n  XLIbool_lpcharcharbool        *xli_writemodel;\n\n  /* Miscellaneous internal functions made available externally */\n  userabortfunc                 *userabort;\n  reportfunc                    *report;\n  explainfunc                   *explain;\n  getvectorfunc                 *get_lpcolumn;\n  getpackedfunc                 *get_basiscolumn;\n  get_OF_activefunc             *get_OF_active;\n  getMDOfunc                    *getMDO;\n  invertfunc                    *invert;\n  set_actionfunc                *set_action;\n  is_actionfunc                 *is_action;\n  clear_actionfunc              *clear_action;\n\n  /* User program interface callbacks */\n  lphandle_intfunc              *ctrlc;\n    void                          *ctrlchandle;     /* User-specified \"owner process ID\" */\n  lphandlestr_func              *writelog;\n    void                          *loghandle;       /* User-specified \"owner process ID\" */\n  lphandlestr_func              *debuginfo;\n  lphandleint_func              *usermessage;\n    int                           msgmask;\n    void                          *msghandle;       /* User-specified \"owner process ID\" */\n  lphandleint_intfunc           *bb_usenode;\n    void                          *bb_nodehandle;   /* User-specified \"owner process ID\" */\n  lphandleint_intfunc           *bb_usebranch;\n    void                          *bb_branchhandle; /* User-specified \"owner process ID\" */\n\n  /* replacement of static variables */\n  char      *rowcol_name;       /* The name of a row/column */\n};\n\n\n#ifdef __cplusplus\n__EXTERN_C {\n#endif\n\n\n/* User and system function interfaces                                       */\n/* ------------------------------------------------------------------------- */\n\nvoid __EXPORT_TYPE __WINAPI lp_solve_version(int *majorversion, int *minorversion, int *release, int *build);\n\nlprec __EXPORT_TYPE * __WINAPI make_lp(int rows, int columns);\nMYBOOL __EXPORT_TYPE __WINAPI resize_lp(lprec *lp, int rows, int columns);\nint __EXPORT_TYPE __WINAPI get_status(lprec *lp);\nchar __EXPORT_TYPE * __WINAPI get_statustext(lprec *lp, int statuscode);\nMYBOOL __EXPORT_TYPE __WINAPI is_obj_in_basis(lprec *lp);\nvoid __EXPORT_TYPE __WINAPI set_obj_in_basis(lprec *lp, MYBOOL obj_in_basis);\n/* Create and initialise a lprec structure defaults */\n\nlprec __EXPORT_TYPE * __WINAPI copy_lp(lprec *lp);\nMYBOOL __EXPORT_TYPE __WINAPI dualize_lp(lprec *lp);\nSTATIC MYBOOL memopt_lp(lprec *lp, int rowextra, int colextra, int nzextra);\n/* Copy or dualize the lp */\n\nvoid __EXPORT_TYPE __WINAPI delete_lp(lprec *lp);\nvoid __EXPORT_TYPE __WINAPI free_lp(lprec **plp);\n/* Remove problem from memory */\n\nMYBOOL __EXPORT_TYPE __WINAPI set_lp_name(lprec *lp, char *lpname);\nchar __EXPORT_TYPE * __WINAPI get_lp_name(lprec *lp);\n/* Set and get the problem name */\n\nMYBOOL __EXPORT_TYPE __WINAPI has_BFP(lprec *lp);\nMYBOOL __EXPORT_TYPE __WINAPI is_nativeBFP(lprec *lp);\nMYBOOL __EXPORT_TYPE __WINAPI set_BFP(lprec *lp, char *filename);\n/* Set basis factorization engine */\n\nlprec __EXPORT_TYPE * __WINAPI read_XLI(char *xliname, char *modelname, char *dataname, char *options, int verbose);\nMYBOOL __EXPORT_TYPE __WINAPI write_XLI(lprec *lp, char *filename, char *options, MYBOOL results);\nMYBOOL __EXPORT_TYPE __WINAPI has_XLI(lprec *lp);\nMYBOOL __EXPORT_TYPE __WINAPI is_nativeXLI(lprec *lp);\nMYBOOL __EXPORT_TYPE __WINAPI set_XLI(lprec *lp, char *filename);\n/* Set external language interface */\n\nMYBOOL __EXPORT_TYPE __WINAPI set_obj(lprec *lp, int colnr, REAL value);\nMYBOOL __EXPORT_TYPE __WINAPI set_obj_fn(lprec *lp, REAL *row);\nMYBOOL __EXPORT_TYPE __WINAPI set_obj_fnex(lprec *lp, int count, REAL *row, int *colno);\n/* set the objective function (Row 0) of the matrix */\nMYBOOL __EXPORT_TYPE __WINAPI str_set_obj_fn(lprec *lp, char *row_string);\n/* The same, but with string input */\nvoid __EXPORT_TYPE __WINAPI set_sense(lprec *lp, MYBOOL maximize);\nvoid __EXPORT_TYPE __WINAPI set_maxim(lprec *lp);\nvoid __EXPORT_TYPE __WINAPI set_minim(lprec *lp);\nMYBOOL __EXPORT_TYPE __WINAPI is_maxim(lprec *lp);\n/* Set optimization direction for the objective function */\n\nMYBOOL __EXPORT_TYPE __WINAPI add_constraint(lprec *lp, REAL *row, int constr_type, REAL rh);\nMYBOOL __EXPORT_TYPE __WINAPI add_constraintex(lprec *lp, int count, REAL *row, int *colno, int constr_type, REAL rh);\nMYBOOL __EXPORT_TYPE __WINAPI set_add_rowmode(lprec *lp, MYBOOL turnon);\nMYBOOL __EXPORT_TYPE __WINAPI is_add_rowmode(lprec *lp);\n/* Add a constraint to the problem, row is the constraint row, rh is the right hand side,\n   constr_type is the type of constraint (LE (<=), GE(>=), EQ(=)) */\nMYBOOL __EXPORT_TYPE __WINAPI str_add_constraint(lprec *lp, char *row_string, int constr_type, REAL rh);\n/* The same, but with string input */\n\nMYBOOL __EXPORT_TYPE __WINAPI set_row(lprec *lp, int rownr, REAL *row);\nMYBOOL __EXPORT_TYPE __WINAPI set_rowex(lprec *lp, int rownr, int count, REAL *row, int *colno);\nMYBOOL __EXPORT_TYPE __WINAPI get_row(lprec *lp, int rownr, REAL *row);\nint __EXPORT_TYPE __WINAPI get_rowex(lprec *lp, int rownr, REAL *row, int *colno);\n/* Fill row with the row row_nr from the problem */\n\nMYBOOL __EXPORT_TYPE __WINAPI del_constraint(lprec *lp, int rownr);\nSTATIC MYBOOL del_constraintex(lprec *lp, LLrec *rowmap);\n/* Remove constrain nr del_row from the problem */\n\nMYBOOL __EXPORT_TYPE __WINAPI add_lag_con(lprec *lp, REAL *row, int con_type, REAL rhs);\n/* add a Lagrangian constraint of form Row' x contype Rhs */\nMYBOOL __EXPORT_TYPE __WINAPI str_add_lag_con(lprec *lp, char *row_string, int con_type, REAL rhs);\n/* The same, but with string input */\nvoid __EXPORT_TYPE __WINAPI set_lag_trace(lprec *lp, MYBOOL lag_trace);\nMYBOOL __EXPORT_TYPE __WINAPI is_lag_trace(lprec *lp);\n/* Set debugging/tracing mode of the Lagrangean solver */\n\nMYBOOL __EXPORT_TYPE __WINAPI set_constr_type(lprec *lp, int rownr, int con_type);\nint __EXPORT_TYPE __WINAPI get_constr_type(lprec *lp, int rownr);\nREAL __EXPORT_TYPE __WINAPI get_constr_value(lprec *lp, int rownr, int count, REAL *primsolution, int *nzindex);\nMYBOOL __EXPORT_TYPE __WINAPI is_constr_type(lprec *lp, int rownr, int mask);\nSTATIC char *get_str_constr_type(lprec *lp, int con_type);\nSTATIC int get_constr_class(lprec *lp, int rownr);\nSTATIC char *get_str_constr_class(lprec *lp, int con_class);\n/* Set the type of constraint in row Row (LE, GE, EQ) */\n\nMYBOOL __EXPORT_TYPE __WINAPI set_rh(lprec *lp, int rownr, REAL value);\nREAL __EXPORT_TYPE __WINAPI get_rh(lprec *lp, int rownr);\n/* Set and get the right hand side of a constraint row */\nMYBOOL __EXPORT_TYPE __WINAPI set_rh_range(lprec *lp, int rownr, REAL deltavalue);\nREAL __EXPORT_TYPE __WINAPI get_rh_range(lprec *lp, int rownr);\n/* Set the RHS range; i.e. the lower and upper bounds of a constraint row */\nvoid __EXPORT_TYPE __WINAPI set_rh_vec(lprec *lp, REAL *rh);\n/* Set the right hand side vector */\nMYBOOL __EXPORT_TYPE __WINAPI str_set_rh_vec(lprec *lp, char *rh_string);\n/* The same, but with string input */\n\nMYBOOL __EXPORT_TYPE __WINAPI add_column(lprec *lp, REAL *column);\nMYBOOL __EXPORT_TYPE __WINAPI add_columnex(lprec *lp, int count, REAL *column, int *rowno);\nMYBOOL __EXPORT_TYPE __WINAPI str_add_column(lprec *lp, char *col_string);\n/* Add a column to the problem */\n\nMYBOOL __EXPORT_TYPE __WINAPI set_column(lprec *lp, int colnr, REAL *column);\nMYBOOL __EXPORT_TYPE __WINAPI set_columnex(lprec *lp, int colnr, int count, REAL *column, int *rowno);\n/* Overwrite existing column data */\n\nint __EXPORT_TYPE __WINAPI column_in_lp(lprec *lp, REAL *column);\n/* Returns the column index if column is already present in lp, otherwise 0.\n   (Does not look at bounds and types, only looks at matrix values */\n\nint __EXPORT_TYPE __WINAPI get_columnex(lprec *lp, int colnr, REAL *column, int *nzrow);\nMYBOOL __EXPORT_TYPE __WINAPI get_column(lprec *lp, int colnr, REAL *column);\n/* Fill column with the column col_nr from the problem */\n\nMYBOOL __EXPORT_TYPE __WINAPI del_column(lprec *lp, int colnr);\nSTATIC MYBOOL del_columnex(lprec *lp, LLrec *colmap);\n/* Delete a column */\n\nMYBOOL __EXPORT_TYPE __WINAPI set_mat(lprec *lp, int rownr, int colnr, REAL value);\n/* Fill in element (Row,Column) of the matrix\n   Row in [0..Rows] and Column in [1..Columns] */\nREAL __EXPORT_TYPE __WINAPI get_mat(lprec *lp, int rownr, int colnr);\nREAL __EXPORT_TYPE __WINAPI get_mat_byindex(lprec *lp, int matindex, MYBOOL isrow, MYBOOL adjustsign);\nint __EXPORT_TYPE __WINAPI get_nonzeros(lprec *lp);\n/* get a single element from the matrix */  /* Name changed from \"mat_elm\" by KE */\n\nvoid __EXPORT_TYPE __WINAPI set_bounds_tighter(lprec *lp, MYBOOL tighten);\nMYBOOL get_bounds(lprec *lp, int column, REAL *lower, REAL *upper);\nMYBOOL __EXPORT_TYPE __WINAPI get_bounds_tighter(lprec *lp);\nMYBOOL __EXPORT_TYPE __WINAPI set_upbo(lprec *lp, int colnr, REAL value);\nREAL __EXPORT_TYPE __WINAPI get_upbo(lprec *lp, int colnr);\nMYBOOL __EXPORT_TYPE __WINAPI set_lowbo(lprec *lp, int colnr, REAL value);\nREAL __EXPORT_TYPE __WINAPI get_lowbo(lprec *lp, int colnr);\nMYBOOL __EXPORT_TYPE __WINAPI set_bounds(lprec *lp, int colnr, REAL lower, REAL upper);\nMYBOOL __EXPORT_TYPE __WINAPI set_unbounded(lprec *lp, int colnr);\nMYBOOL __EXPORT_TYPE __WINAPI is_unbounded(lprec *lp, int colnr);\n/* Set the upper and lower bounds of a variable */\n\nMYBOOL __EXPORT_TYPE __WINAPI set_int(lprec *lp, int colnr, MYBOOL must_be_int);\nMYBOOL __EXPORT_TYPE __WINAPI is_int(lprec *lp, int colnr);\nMYBOOL __EXPORT_TYPE __WINAPI set_binary(lprec *lp, int colnr, MYBOOL must_be_bin);\nMYBOOL __EXPORT_TYPE __WINAPI is_binary(lprec *lp, int colnr);\nMYBOOL __EXPORT_TYPE __WINAPI set_semicont(lprec *lp, int colnr, MYBOOL must_be_sc);\nMYBOOL __EXPORT_TYPE __WINAPI is_semicont(lprec *lp, int colnr);\nMYBOOL __EXPORT_TYPE __WINAPI is_negative(lprec *lp, int colnr);\nMYBOOL __EXPORT_TYPE __WINAPI set_var_weights(lprec *lp, REAL *weights);\nint __EXPORT_TYPE __WINAPI get_var_priority(lprec *lp, int colnr);\n/* Set the type of variable */\n\nMYBOOL __EXPORT_TYPE __WINAPI set_pseudocosts(lprec *lp, REAL *clower, REAL *cupper, int *updatelimit);\nMYBOOL __EXPORT_TYPE __WINAPI get_pseudocosts(lprec *lp, REAL *clower, REAL *cupper, int *updatelimit);\n/* Set initial values for, or get computed pseudocost vectors;\n   note that setting of pseudocosts can only happen in response to a\n   call-back function optionally requesting this */\n\nint  __EXPORT_TYPE __WINAPI add_SOS(lprec *lp, char *name, int sostype, int priority, int count, int *sosvars, REAL *weights);\nMYBOOL __EXPORT_TYPE __WINAPI is_SOS_var(lprec *lp, int colnr);\n/* Add SOS constraints */\n\nMYBOOL __EXPORT_TYPE __WINAPI set_row_name(lprec *lp, int rownr, char *new_name);\nchar __EXPORT_TYPE * __WINAPI get_row_name(lprec *lp, int rownr);\nchar __EXPORT_TYPE * __WINAPI get_origrow_name(lprec *lp, int rownr);\n/* Set/Get the name of a constraint row */   /* Get added by KE */\n\nMYBOOL __EXPORT_TYPE __WINAPI set_col_name(lprec *lp, int colnr, char *new_name);\nchar __EXPORT_TYPE * __WINAPI get_col_name(lprec *lp, int colnr);\nchar __EXPORT_TYPE * __WINAPI get_origcol_name(lprec *lp, int colnr);\n/* Set/Get the name of a variable column */  /* Get added by KE */\n\nvoid __EXPORT_TYPE __WINAPI unscale(lprec *lp);\n/* Undo previous scaling of the problem */\n\nvoid __EXPORT_TYPE __WINAPI set_preferdual(lprec *lp, MYBOOL dodual);\nvoid __EXPORT_TYPE __WINAPI set_simplextype(lprec *lp, int simplextype);\nint __EXPORT_TYPE __WINAPI get_simplextype(lprec *lp);\n/* Set/Get if lp_solve should prefer the dual simplex over the primal -- added by KE */\n\nvoid __EXPORT_TYPE __WINAPI default_basis(lprec *lp);\nvoid __EXPORT_TYPE __WINAPI set_basiscrash(lprec *lp, int mode);\nint __EXPORT_TYPE __WINAPI get_basiscrash(lprec *lp);\nint __EXPORT_TYPE __WINAPI set_basisvar(lprec *lp, int basisPos, int enteringCol);\nMYBOOL __EXPORT_TYPE __WINAPI set_basis(lprec *lp, int *bascolumn, MYBOOL nonbasic);\nMYBOOL __EXPORT_TYPE __WINAPI get_basis(lprec *lp, int *bascolumn, MYBOOL nonbasic);\nvoid __EXPORT_TYPE __WINAPI reset_basis(lprec *lp);\n/* Set/Get basis for a re-solved system */  /* Added by KE */\nMYBOOL __EXPORT_TYPE __WINAPI guess_basis(lprec *lp, REAL *guessvector, int *basisvector);\n\nMYBOOL __EXPORT_TYPE __WINAPI is_feasible(lprec *lp, REAL *values, REAL threshold);\n/* returns TRUE if the vector in values is a feasible solution to the lp */\n\nint __EXPORT_TYPE __WINAPI solve(lprec *lp);\n/* Solve the problem */\n\nREAL __EXPORT_TYPE __WINAPI time_elapsed(lprec *lp);\n/* Return the number of seconds since start of solution process */\n\nvoid __EXPORT_TYPE __WINAPI put_bb_nodefunc(lprec *lp, lphandleint_intfunc newnode, void *bbnodehandle);\nvoid __EXPORT_TYPE __WINAPI put_bb_branchfunc(lprec *lp, lphandleint_intfunc newbranch, void *bbbranchhandle);\n/* Allow the user to override B&B node and branching decisions */\n\nvoid __EXPORT_TYPE __WINAPI put_abortfunc(lprec *lp, lphandle_intfunc newctrlc, void *ctrlchandle);\n/* Allow the user to define an interruption callback function */\n\nvoid __EXPORT_TYPE __WINAPI put_logfunc(lprec *lp, lphandlestr_func newlog, void *loghandle);\n/* Allow the user to define a logging function */\n\nvoid __EXPORT_TYPE __WINAPI put_msgfunc(lprec *lp, lphandleint_func newmsg, void *msghandle, int mask);\n/* Allow the user to define an event-driven message/reporting */\n\nMYBOOL __EXPORT_TYPE __WINAPI get_primal_solution(lprec *lp, REAL *pv);\nMYBOOL __EXPORT_TYPE __WINAPI get_ptr_primal_solution(lprec *lp, REAL **pv);\nMYBOOL __EXPORT_TYPE __WINAPI get_dual_solution(lprec *lp, REAL *rc);\nMYBOOL __EXPORT_TYPE __WINAPI get_ptr_dual_solution(lprec *lp, REAL **rc);\nMYBOOL __EXPORT_TYPE __WINAPI get_lambda(lprec *lp, REAL *lambda);\nMYBOOL __EXPORT_TYPE __WINAPI get_ptr_lambda(lprec *lp, REAL **lambda);\n/* Get the primal, dual/reduced costs and Lambda vectors */\n\n/* Read an MPS file */\nlprec __EXPORT_TYPE * __WINAPI read_MPS(char *filename, int options);\nlprec __EXPORT_TYPE * __WINAPI read_mps(FILE *filename, int options);\nlprec __EXPORT_TYPE * __WINAPI read_freeMPS(char *filename, int options);\nlprec __EXPORT_TYPE * __WINAPI read_freemps(FILE *filename, int options);\n\n/* Write a MPS file to output */\nMYBOOL __EXPORT_TYPE __WINAPI write_mps(lprec *lp, char *filename);\nMYBOOL __EXPORT_TYPE __WINAPI write_MPS(lprec *lp, FILE *output);\nMYBOOL __EXPORT_TYPE __WINAPI write_freemps(lprec *lp, char *filename);\nMYBOOL __EXPORT_TYPE __WINAPI write_freeMPS(lprec *lp, FILE *output);\n\nMYBOOL __EXPORT_TYPE __WINAPI write_lp(lprec *lp, char *filename);\nMYBOOL __EXPORT_TYPE __WINAPI write_LP(lprec *lp, FILE *output);\n /* Write a LP file to output */\n\nMYBOOL __WINAPI LP_readhandle(lprec **lp, FILE *filename, int verbose, char *lp_name);\nlprec __EXPORT_TYPE * __WINAPI read_lp(FILE *filename, int verbose, char *lp_name);\nlprec __EXPORT_TYPE * __WINAPI read_LP(char *filename, int verbose, char *lp_name);\n/* Old-style lp format file parser */\n\nMYBOOL __EXPORT_TYPE __WINAPI write_basis(lprec *lp, char *filename);\nMYBOOL __EXPORT_TYPE __WINAPI read_basis(lprec *lp, char *filename, char *info);\n/* Read and write basis from/to file in CPLEX BAS format */\n\nMYBOOL __EXPORT_TYPE __WINAPI write_params(lprec *lp, char *filename, char *options);\nMYBOOL __EXPORT_TYPE __WINAPI read_params(lprec *lp, char *filename, char *options);\nvoid __EXPORT_TYPE __WINAPI reset_params(lprec *lp);\n/* Read and write parameter file */\n\nvoid __EXPORT_TYPE __WINAPI print_lp(lprec *lp);\nvoid __EXPORT_TYPE __WINAPI print_tableau(lprec *lp);\n/* Print the current problem, only useful in very small (test) problems */\n\nvoid __EXPORT_TYPE __WINAPI print_objective(lprec *lp);\nvoid __EXPORT_TYPE __WINAPI print_solution(lprec *lp, int columns);\nvoid __EXPORT_TYPE __WINAPI print_constraints(lprec *lp, int columns);\n/* Print the solution to stdout */\n\nvoid __EXPORT_TYPE __WINAPI print_duals(lprec *lp);\n/* Print the dual variables of the solution */\n\nvoid __EXPORT_TYPE __WINAPI print_scales(lprec *lp);\n/* If scaling is used, print the scaling factors */\n\nvoid __EXPORT_TYPE __WINAPI print_str(lprec *lp, char *str);\n\nvoid __EXPORT_TYPE __WINAPI set_outputstream(lprec *lp, FILE *stream);\nMYBOOL __EXPORT_TYPE __WINAPI set_outputfile(lprec *lp, char *filename);\n\nvoid __EXPORT_TYPE __WINAPI set_verbose(lprec *lp, int verbose);\nint __EXPORT_TYPE __WINAPI get_verbose(lprec *lp);\n\nvoid __EXPORT_TYPE __WINAPI set_timeout(lprec *lp, long sectimeout);\nlong __EXPORT_TYPE __WINAPI get_timeout(lprec *lp);\n\nvoid __EXPORT_TYPE __WINAPI set_print_sol(lprec *lp, int print_sol);\nint __EXPORT_TYPE __WINAPI get_print_sol(lprec *lp);\n\nvoid __EXPORT_TYPE __WINAPI set_debug(lprec *lp, MYBOOL debug);\nMYBOOL __EXPORT_TYPE __WINAPI is_debug(lprec *lp);\n\nvoid __EXPORT_TYPE __WINAPI set_trace(lprec *lp, MYBOOL trace);\nMYBOOL __EXPORT_TYPE __WINAPI is_trace(lprec *lp);\n\nMYBOOL __EXPORT_TYPE __WINAPI print_debugdump(lprec *lp, char *filename);\n\nvoid __EXPORT_TYPE __WINAPI set_anti_degen(lprec *lp, int anti_degen);\nint __EXPORT_TYPE __WINAPI get_anti_degen(lprec *lp);\nMYBOOL __EXPORT_TYPE __WINAPI is_anti_degen(lprec *lp, int testmask);\n\nvoid __EXPORT_TYPE __WINAPI set_presolve(lprec *lp, int presolvemode, int maxloops);\nint __EXPORT_TYPE __WINAPI get_presolve(lprec *lp);\nint __EXPORT_TYPE __WINAPI get_presolveloops(lprec *lp);\nMYBOOL __EXPORT_TYPE __WINAPI is_presolve(lprec *lp, int testmask);\n\nint __EXPORT_TYPE __WINAPI get_orig_index(lprec *lp, int lp_index);\nint __EXPORT_TYPE __WINAPI get_lp_index(lprec *lp, int orig_index);\n\nvoid __EXPORT_TYPE __WINAPI set_maxpivot(lprec *lp, int max_num_inv);\nint __EXPORT_TYPE __WINAPI get_maxpivot(lprec *lp);\n\nvoid __EXPORT_TYPE __WINAPI set_obj_bound(lprec *lp, REAL obj_bound);\nREAL __EXPORT_TYPE __WINAPI get_obj_bound(lprec *lp);\n\nvoid __EXPORT_TYPE __WINAPI set_mip_gap(lprec *lp, MYBOOL absolute, REAL mip_gap);\nREAL __EXPORT_TYPE __WINAPI get_mip_gap(lprec *lp, MYBOOL absolute);\n\nvoid __EXPORT_TYPE __WINAPI set_bb_rule(lprec *lp, int bb_rule);\nint __EXPORT_TYPE __WINAPI get_bb_rule(lprec *lp);\n\nMYBOOL __EXPORT_TYPE __WINAPI set_var_branch(lprec *lp, int colnr, int branch_mode);\nint __EXPORT_TYPE __WINAPI get_var_branch(lprec *lp, int colnr);\n\nMYBOOL __EXPORT_TYPE __WINAPI is_infinite(lprec *lp, REAL value);\nvoid __EXPORT_TYPE __WINAPI set_infinite(lprec *lp, REAL infinite);\nREAL __EXPORT_TYPE __WINAPI get_infinite(lprec *lp);\n\nvoid __EXPORT_TYPE __WINAPI set_epsint(lprec *lp, REAL epsint);\nREAL __EXPORT_TYPE __WINAPI get_epsint(lprec *lp);\n\nvoid __EXPORT_TYPE __WINAPI set_epsb(lprec *lp, REAL epsb);\nREAL __EXPORT_TYPE __WINAPI get_epsb(lprec *lp);\n\nvoid __EXPORT_TYPE __WINAPI set_epsd(lprec *lp, REAL epsd);\nREAL __EXPORT_TYPE __WINAPI get_epsd(lprec *lp);\n\nvoid __EXPORT_TYPE __WINAPI set_epsel(lprec *lp, REAL epsel);\nREAL __EXPORT_TYPE __WINAPI get_epsel(lprec *lp);\n\nMYBOOL __EXPORT_TYPE __WINAPI set_epslevel(lprec *lp, int epslevel);\n\nvoid __EXPORT_TYPE __WINAPI set_scaling(lprec *lp, int scalemode);\nint __EXPORT_TYPE __WINAPI get_scaling(lprec *lp);\nMYBOOL __EXPORT_TYPE __WINAPI is_scalemode(lprec *lp, int testmask);\nMYBOOL __EXPORT_TYPE __WINAPI is_scaletype(lprec *lp, int scaletype);\nMYBOOL __EXPORT_TYPE __WINAPI is_integerscaling(lprec *lp);\nvoid __EXPORT_TYPE __WINAPI set_scalelimit(lprec *lp, REAL scalelimit);\nREAL __EXPORT_TYPE __WINAPI get_scalelimit(lprec *lp);\n\nvoid __EXPORT_TYPE __WINAPI set_improve(lprec *lp, int improve);\nint __EXPORT_TYPE __WINAPI get_improve(lprec *lp);\n\nvoid __EXPORT_TYPE __WINAPI set_pivoting(lprec *lp, int piv_rule);\nint __EXPORT_TYPE __WINAPI get_pivoting(lprec *lp);\nMYBOOL __EXPORT_TYPE __WINAPI set_partialprice(lprec *lp, int blockcount, int *blockstart, MYBOOL isrow);\nvoid __EXPORT_TYPE __WINAPI get_partialprice(lprec *lp, int *blockcount, int *blockstart, MYBOOL isrow);\n\nMYBOOL __EXPORT_TYPE __WINAPI set_multiprice(lprec *lp, int multiblockdiv);\nint __EXPORT_TYPE __WINAPI get_multiprice(lprec *lp, MYBOOL getabssize);\n\nMYBOOL __EXPORT_TYPE __WINAPI is_use_names(lprec *lp, MYBOOL isrow);\nvoid __EXPORT_TYPE __WINAPI set_use_names(lprec *lp, MYBOOL isrow, MYBOOL use_names);\n\nint __EXPORT_TYPE __WINAPI get_nameindex(lprec *lp, char *varname, MYBOOL isrow);\n\nMYBOOL __EXPORT_TYPE __WINAPI is_piv_mode(lprec *lp, int testmask);\nMYBOOL __EXPORT_TYPE __WINAPI is_piv_rule(lprec *lp, int rule);\n\nvoid __EXPORT_TYPE __WINAPI set_break_at_first(lprec *lp, MYBOOL break_at_first);\nMYBOOL __EXPORT_TYPE __WINAPI is_break_at_first(lprec *lp);\n\nvoid __EXPORT_TYPE __WINAPI set_bb_floorfirst(lprec *lp, int bb_floorfirst);\nint __EXPORT_TYPE __WINAPI get_bb_floorfirst(lprec *lp);\n\nvoid __EXPORT_TYPE __WINAPI set_bb_depthlimit(lprec *lp, int bb_maxlevel);\nint __EXPORT_TYPE __WINAPI get_bb_depthlimit(lprec *lp);\n\nvoid __EXPORT_TYPE __WINAPI set_break_at_value(lprec *lp, REAL break_at_value);\nREAL __EXPORT_TYPE __WINAPI get_break_at_value(lprec *lp);\n\nvoid __EXPORT_TYPE __WINAPI set_negrange(lprec *lp, REAL negrange);\nREAL __EXPORT_TYPE __WINAPI get_negrange(lprec *lp);\n\nvoid __EXPORT_TYPE __WINAPI set_epsperturb(lprec *lp, REAL epsperturb);\nREAL __EXPORT_TYPE __WINAPI get_epsperturb(lprec *lp);\n\nvoid __EXPORT_TYPE __WINAPI set_epspivot(lprec *lp, REAL epspivot);\nREAL __EXPORT_TYPE __WINAPI get_epspivot(lprec *lp);\n\nint __EXPORT_TYPE __WINAPI get_max_level(lprec *lp);\nCOUNTER __EXPORT_TYPE __WINAPI get_total_nodes(lprec *lp);\nCOUNTER __EXPORT_TYPE __WINAPI get_total_iter(lprec *lp);\n\nREAL __EXPORT_TYPE __WINAPI get_objective(lprec *lp);\nREAL __EXPORT_TYPE __WINAPI get_working_objective(lprec *lp);\n\nREAL __EXPORT_TYPE __WINAPI get_var_primalresult(lprec *lp, int index);\nREAL __EXPORT_TYPE __WINAPI get_var_dualresult(lprec *lp, int index);\n\nMYBOOL __EXPORT_TYPE __WINAPI get_variables(lprec *lp, REAL *var);\nMYBOOL __EXPORT_TYPE __WINAPI get_ptr_variables(lprec *lp, REAL **var);\n\nMYBOOL __EXPORT_TYPE __WINAPI get_constraints(lprec *lp, REAL *constr);\nMYBOOL __EXPORT_TYPE __WINAPI get_ptr_constraints(lprec *lp, REAL **constr);\n\nMYBOOL __EXPORT_TYPE __WINAPI get_sensitivity_rhs(lprec *lp, REAL *duals, REAL *dualsfrom, REAL *dualstill);\nMYBOOL __EXPORT_TYPE __WINAPI get_ptr_sensitivity_rhs(lprec *lp, REAL **duals, REAL **dualsfrom, REAL **dualstill);\n\nMYBOOL __EXPORT_TYPE __WINAPI get_sensitivity_obj(lprec *lp, REAL *objfrom, REAL *objtill);\nMYBOOL __EXPORT_TYPE __WINAPI get_sensitivity_objex(lprec *lp, REAL *objfrom, REAL *objtill, REAL *objfromvalue, REAL *objtillvalue);\nMYBOOL __EXPORT_TYPE __WINAPI get_ptr_sensitivity_obj(lprec *lp, REAL **objfrom, REAL **objtill);\nMYBOOL __EXPORT_TYPE __WINAPI get_ptr_sensitivity_objex(lprec *lp, REAL **objfrom, REAL **objtill, REAL **objfromvalue, REAL **objtillvalue);\n\nvoid __EXPORT_TYPE __WINAPI set_solutionlimit(lprec *lp, int limit);\nint __EXPORT_TYPE __WINAPI get_solutionlimit(lprec *lp);\nint __EXPORT_TYPE __WINAPI get_solutioncount(lprec *lp);\n\nint __EXPORT_TYPE __WINAPI get_Norig_rows(lprec *lp);\nint __EXPORT_TYPE __WINAPI get_Nrows(lprec *lp);\nint __EXPORT_TYPE __WINAPI get_Lrows(lprec *lp);\n\nint __EXPORT_TYPE __WINAPI get_Norig_columns(lprec *lp);\nint __EXPORT_TYPE __WINAPI get_Ncolumns(lprec *lp);\n\ntypedef int (__WINAPI read_modeldata_func)(void *userhandle, char *buf, int max_size);\ntypedef int (__WINAPI write_modeldata_func)(void *userhandle, char *buf);\nMYBOOL __WINAPI MPS_readex(lprec **newlp, void *userhandle, read_modeldata_func read_modeldata, int typeMPS, int options);\n\n/* #if defined develop */\nlprec __EXPORT_TYPE * __WINAPI read_lpex(void *userhandle, read_modeldata_func read_modeldata, int verbose, char *lp_name);\nMYBOOL __EXPORT_TYPE __WINAPI write_lpex(lprec *lp, void *userhandle, write_modeldata_func write_modeldata);\n\nlprec __EXPORT_TYPE * __WINAPI read_mpsex(void *userhandle, read_modeldata_func read_modeldata, int options);\nlprec __EXPORT_TYPE * __WINAPI read_freempsex(void *userhandle, read_modeldata_func read_modeldata, int options);\n\nMYBOOL __EXPORT_TYPE __WINAPI MPS_writefileex(lprec *lp, int typeMPS, void *userhandle, write_modeldata_func write_modeldata);\n/* #endif */\n\n#ifdef __cplusplus\n}\n#endif\n\n\n/* Forward definitions of functions used internaly by the lp toolkit */\nMYBOOL set_callbacks(lprec *lp);\nSTATIC int yieldformessages(lprec *lp);\nMYBOOL __WINAPI userabort(lprec *lp, int message);\n/*char * __VACALL explain(lprec *lp, char *format, ...);\nvoid __VACALL report(lprec *lp, int level, char *format, ...);*/\n\n/* Memory management routines */\nSTATIC MYBOOL append_rows(lprec *lp, int deltarows);\nSTATIC MYBOOL append_columns(lprec *lp, int deltacolumns);\nSTATIC void inc_rows(lprec *lp, int delta);\nSTATIC void inc_columns(lprec *lp, int delta);\nSTATIC MYBOOL init_rowcol_names(lprec *lp);\nSTATIC MYBOOL inc_row_space(lprec *lp, int deltarows);\nSTATIC MYBOOL inc_col_space(lprec *lp, int deltacols);\nSTATIC MYBOOL shift_rowcoldata(lprec *lp, int base, int delta, LLrec *usedmap, MYBOOL isrow);\nSTATIC MYBOOL shift_basis(lprec *lp, int base, int delta, LLrec *usedmap, MYBOOL isrow);\nSTATIC MYBOOL shift_rowdata(lprec *lp, int base, int delta, LLrec *usedmap);\nSTATIC MYBOOL shift_coldata(lprec *lp, int base, int delta, LLrec *usedmap);\n\n/* INLINE */ MYBOOL is_chsign(lprec *lp, int rownr);\n\nSTATIC MYBOOL inc_lag_space(lprec *lp, int deltarows, MYBOOL ignoreMAT);\nlprec *make_lag(lprec *server);\n\nREAL get_rh_upper(lprec *lp, int rownr);\nREAL get_rh_lower(lprec *lp, int rownr);\nMYBOOL set_rh_upper(lprec *lp, int rownr, REAL value);\nMYBOOL set_rh_lower(lprec *lp, int rownr, REAL value);\nSTATIC int bin_count(lprec *lp, MYBOOL working);\nSTATIC int MIP_count(lprec *lp);\nSTATIC int SOS_count(lprec *lp);\nSTATIC int GUB_count(lprec *lp);\nSTATIC int identify_GUB(lprec *lp, MYBOOL mark);\nSTATIC int prepare_GUB(lprec *lp);\n\nSTATIC MYBOOL refactRecent(lprec *lp);\nSTATIC MYBOOL check_if_less(lprec *lp, REAL x, REAL y, int variable);\nSTATIC MYBOOL feasiblePhase1(lprec *lp, REAL epsvalue);\nSTATIC void free_duals(lprec *lp);\nSTATIC void initialize_solution(lprec *lp, MYBOOL shiftbounds);\nSTATIC void recompute_solution(lprec *lp, MYBOOL shiftbounds);\nSTATIC int verify_solution(lprec *lp, MYBOOL reinvert, char *info);\nSTATIC int check_solution(lprec *lp, int  lastcolumn, REAL *solution,\n                          REAL *upbo, REAL *lowbo, REAL tolerance);\n/* INLINE */ MYBOOL is_fixedvar(lprec *lp, int variable);\n/* INLINE */ MYBOOL is_splitvar(lprec *lp, int colnr);\n\nvoid   __WINAPI set_action(int *actionvar, int actionmask);\nvoid   __WINAPI clear_action(int *actionvar, int actionmask);\nMYBOOL __WINAPI is_action(int actionvar, int testmask);\n\n/* INLINE */ MYBOOL is_bb_rule(lprec *lp, int bb_rule);\n/* INLINE */ MYBOOL is_bb_mode(lprec *lp, int bb_mask);\n/* INLINE */ int get_piv_rule(lprec *lp);\nSTATIC char *get_str_piv_rule(int rule);\nSTATIC MYBOOL __WINAPI set_var_priority(lprec *lp);\nSTATIC int find_sc_bbvar(lprec *lp, int *count);\nSTATIC int find_sos_bbvar(lprec *lp, int *count, MYBOOL intsos);\nSTATIC int find_int_bbvar(lprec *lp, int *count, BBrec *BB, MYBOOL *isfeasible);\n\n/* Solution-related functions */\nSTATIC REAL compute_dualslacks(lprec *lp, int target, REAL **dvalues, int **nzdvalues, MYBOOL dosum);\nSTATIC MYBOOL solution_is_int(lprec *lp, int index, MYBOOL checkfixed);\nSTATIC MYBOOL bb_better(lprec *lp, int target, int mode);\nSTATIC void construct_solution(lprec *lp, REAL *target);\nSTATIC void transfer_solution_var(lprec *lp, int uservar);\nSTATIC MYBOOL construct_duals(lprec *lp);\nSTATIC MYBOOL construct_sensitivity_duals(lprec *lp);\nSTATIC MYBOOL construct_sensitivity_obj(lprec *lp);\n\nSTATIC int add_GUB(lprec *lp, char *name, int priority, int count, int *sosvars);\nSTATIC basisrec *push_basis(lprec *lp, int *basisvar, MYBOOL *isbasic, MYBOOL *islower);\nSTATIC MYBOOL compare_basis(lprec *lp);\nSTATIC MYBOOL restore_basis(lprec *lp);\nSTATIC MYBOOL pop_basis(lprec *lp, MYBOOL restore);\nSTATIC MYBOOL is_BasisReady(lprec *lp);\nSTATIC MYBOOL is_slackbasis(lprec *lp);\nSTATIC MYBOOL verify_basis(lprec *lp);\nSTATIC int unload_basis(lprec *lp, MYBOOL restorelast);\n\nSTATIC int perturb_bounds(lprec *lp, BBrec *perturbed, MYBOOL doRows, MYBOOL doCols, MYBOOL includeFIXED);\nSTATIC MYBOOL validate_bounds(lprec *lp, REAL *upbo, REAL *lowbo);\nSTATIC MYBOOL impose_bounds(lprec *lp, REAL * upbo, REAL *lowbo);\nSTATIC int unload_BB(lprec *lp);\n\nSTATIC REAL feasibilityOffset(lprec *lp, MYBOOL isdual);\nSTATIC MYBOOL isP1extra(lprec *lp);\nSTATIC REAL get_refactfrequency(lprec *lp, MYBOOL final);\nSTATIC int findBasicFixedvar(lprec *lp, int afternr, MYBOOL slacksonly);\nSTATIC MYBOOL isBasisVarFeasible(lprec *lp, REAL tol, int basis_row);\nSTATIC MYBOOL isPrimalFeasible(lprec *lp, REAL tol, int infeasibles[], REAL *feasibilitygap);\nSTATIC MYBOOL isDualFeasible(lprec *lp, REAL tol, int *boundflips, int infeasibles[], REAL *feasibilitygap);\n\n/* Main simplex driver routines */\nSTATIC int preprocess(lprec *lp);\nSTATIC void postprocess(lprec *lp);\nSTATIC MYBOOL performiteration(lprec *lp, int rownr, int varin, LREAL theta, MYBOOL primal, MYBOOL allowminit, REAL *prow, int *nzprow, REAL *pcol, int *nzpcol, int *boundswaps);\nSTATIC void transfer_solution_var(lprec *lp, int uservar);\nSTATIC void transfer_solution(lprec *lp, MYBOOL dofinal);\n\n/* Scaling utilities */\nSTATIC REAL scaled_floor(lprec *lp, int colnr, REAL value, REAL epsscale);\nSTATIC REAL scaled_ceil(lprec *lp, int colnr, REAL value, REAL epsscale);\n\n/* Variable mapping utility routines */\nSTATIC void varmap_lock(lprec *lp);\nSTATIC void varmap_clear(lprec *lp);\nSTATIC MYBOOL varmap_canunlock(lprec *lp);\nSTATIC void varmap_addconstraint(lprec *lp);\nSTATIC void varmap_addcolumn(lprec *lp);\nSTATIC void varmap_delete(lprec *lp, int base, int delta, LLrec *varmap);\nSTATIC void varmap_compact(lprec *lp, int prev_rows, int prev_cols);\nSTATIC MYBOOL varmap_validate(lprec *lp, int varno);\n/* STATIC MYBOOL del_varnameex(lprec *lp, hashelem **namelist, hashtable *ht, int varnr, LLrec *varmap); */\n STATIC MYBOOL del_varnameex(lprec *lp, hashelem **namelist, int items, hashtable *ht, int varnr, LLrec *varmap);\n\n/* Pseudo-cost routines (internal) */\nSTATIC BBPSrec *init_pseudocost(lprec *lp, int pseudotype);\nSTATIC void free_pseudocost(lprec *lp);\nSTATIC REAL get_pseudorange(BBPSrec *pc, int mipvar, int varcode);\nSTATIC void update_pseudocost(BBPSrec *pc, int mipvar, int varcode, MYBOOL capupper, REAL varsol);\nSTATIC REAL get_pseudobranchcost(BBPSrec *pc, int mipvar, MYBOOL dofloor);\nSTATIC REAL get_pseudonodecost(BBPSrec *pc, int mipvar, int vartype, REAL varsol);\n\n/* Matrix access and equation solving routines */\nSTATIC void set_OF_override(lprec *lp, REAL *ofVector);\nSTATIC void set_OF_p1extra(lprec *lp, REAL p1extra);\nSTATIC void unset_OF_p1extra(lprec *lp);\nMYBOOL modifyOF1(lprec *lp, int index, REAL *ofValue, REAL mult);\nREAL __WINAPI get_OF_active(lprec *lp, int varnr, REAL mult);\nSTATIC MYBOOL is_OF_nz(lprec *lp, int colnr);\n\nSTATIC int get_basisOF(lprec *lp, int coltarget[], REAL crow[], int colno[]);\nint    __WINAPI get_basiscolumn(lprec *lp, int j, int rn[], double bj[]);\nint    __WINAPI obtain_column(lprec *lp, int varin, REAL *pcol, int *nzlist, int *maxabs);\nSTATIC int compute_theta(lprec *lp, int rownr, LREAL *theta, int isupbound, REAL HarrisScalar, MYBOOL primal);\n\n/* Pivot utility routines */\nSTATIC int findBasisPos(lprec *lp, int notint, int *var_basic);\nSTATIC MYBOOL check_degeneracy(lprec *lp, REAL *pcol, int *degencount);\n\n#endif /* HEADER_lp_lib */\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_matrix.c",
    "content": "\n#include <string.h>\n#include \"commonlib.h\"\n#include \"lp_lib.h\"\n#include \"lp_scale.h\"\n#include \"lp_report.h\"\n#include \"lp_price.h\"\n#include \"lp_pricePSE.h\"\n#include \"lp_matrix.h\"\n\n#ifdef FORTIFY\n# include \"lp_fortify.h\"\n#endif\n\n\n/* -------------------------------------------------------------------------\n   Basic matrix routines in lp_solve v5.0+\n   -------------------------------------------------------------------------\n    Author:        Michel Berkelaar (to lp_solve v3.2),\n                   Kjell Eikland    (v4.0 and forward)\n    Contact:       kjell.eikland@broadpark.no\n    License terms: LGPL.\n\n    Requires:      lp_lib.h, lp_pricerPSE.h, lp_matrix.h\n\n    Release notes:\n    v5.0.0  1 January 2004      First integrated and repackaged version.\n    v5.0.1  7 May 2004          Added matrix transpose function.\n    v5.1.0  20 July 2004        Reworked with flexible matrix storage model.\n    v5.2.0  10 January 2005     Added fast deletion methods.\n                                Added data extraction to matrix method.\n                                Changed to explicit OF storage mode.\n\n   ------------------------------------------------------------------------- */\n\nSTATIC MATrec *mat_create(lprec *lp, int rows, int columns, REAL epsvalue)\n{\n  MATrec *newmat;\n\n  newmat = (MATrec *) calloc(1, sizeof(*newmat));\n  newmat->lp = lp;\n\n  newmat->rows_alloc = 0;\n  newmat->columns_alloc = 0;\n  newmat->mat_alloc = 0;\n\n  inc_matrow_space(newmat, rows);\n  newmat->rows = rows;\n  inc_matcol_space(newmat, columns);\n  newmat->columns = columns;\n  inc_mat_space(newmat, 0);\n\n  newmat->epsvalue = epsvalue;\n\n  return( newmat );\n}\n\nSTATIC void mat_free(MATrec **matrix)\n{\n  if((matrix == NULL) || (*matrix == NULL))\n    return;\n\n#if MatrixColAccess==CAM_Record\n  FREE((*matrix)->col_mat);\n#else /*if MatrixColAccess==CAM_Vector*/\n  FREE((*matrix)->col_mat_colnr);\n  FREE((*matrix)->col_mat_rownr);\n  FREE((*matrix)->col_mat_value);\n#endif\n  FREE((*matrix)->col_end);\n  FREE((*matrix)->col_tag);\n\n#if MatrixRowAccess==RAM_Index\n  FREE((*matrix)->row_mat);\n#elif MatrixColAccess==CAM_Record\n  FREE((*matrix)->row_mat);\n#else /*if MatrixRowAccess==COL_Vector*/\n  FREE((*matrix)->row_mat_colnr);\n  FREE((*matrix)->row_mat_rownr);\n  FREE((*matrix)->row_mat_value);\n#endif\n  FREE((*matrix)->row_end);\n  FREE((*matrix)->row_tag);\n\n  FREE((*matrix)->colmax);\n  FREE((*matrix)->rowmax);\n\n  FREE(*matrix);\n}\n\nSTATIC MYBOOL mat_memopt(MATrec *mat, int rowextra, int colextra, int nzextra)\n{\n  MYBOOL status = TRUE;\n  int matalloc, colalloc, rowalloc;\n\n  if((mat == NULL) ||\n#if 0\n     (++rowextra < 1) || (++colextra < 1) || (++nzextra < 1))\n#else\n     (rowextra < 0) || (colextra < 0) || (nzextra < 0))\n#endif\n    return( FALSE );\n\n  mat->rows_alloc    = MIN(mat->rows_alloc,    mat->rows + rowextra);\n  mat->columns_alloc = MIN(mat->columns_alloc, mat->columns + colextra);\n  mat->mat_alloc     = MIN(mat->mat_alloc,     mat->col_end[mat->columns] + nzextra);\n#if 0\n  rowalloc = mat->rows_alloc;\n  colalloc = mat->columns_alloc;\n  matalloc = mat->mat_alloc;\n#else\n  rowalloc = mat->rows_alloc + 1;\n  colalloc = mat->columns_alloc + 1;\n  matalloc = mat->mat_alloc + 1;\n#endif\n\n#if MatrixColAccess==CAM_Record\n  mat->col_mat = (MATitem *) realloc(mat->col_mat, matalloc * sizeof(*(mat->col_mat)));\n  status &= (mat->col_mat != NULL);\n#else /*if MatrixColAccess==CAM_Vector*/\n  status &= allocINT(mat->lp,  &(mat->col_mat_colnr), matalloc, AUTOMATIC) &&\n            allocINT(mat->lp,  &(mat->col_mat_rownr), matalloc, AUTOMATIC) &&\n            allocREAL(mat->lp, &(mat->col_mat_value), matalloc, AUTOMATIC);\n#endif\n  status &= allocINT(mat->lp, &mat->col_end, colalloc, AUTOMATIC);\n  if(mat->col_tag != NULL)\n    status &= allocINT(mat->lp, &mat->col_tag, colalloc, AUTOMATIC);\n\n#if MatrixRowAccess==RAM_Index\n  status &= allocINT(mat->lp, &(mat->row_mat), matalloc, AUTOMATIC);\n#elif MatrixColAccess==CAM_Record\n  mat->row_mat = (MATitem *) realloc(mat->row_mat, matalloc * sizeof(*(mat->row_mat)));\n  status &= (mat->row_mat != NULL);\n#else /*if MatrixRowAccess==COL_Vector*/\n  status &= allocINT(mat->lp,  &(mat->row_mat_colnr), matalloc, AUTOMATIC) &&\n            allocINT(mat->lp,  &(mat->row_mat_rownr), matalloc, AUTOMATIC) &&\n            allocREAL(mat->lp, &(mat->row_mat_value), matalloc, AUTOMATIC);\n#endif\n  status &= allocINT(mat->lp, &mat->row_end, rowalloc, AUTOMATIC);\n  if(mat->row_tag != NULL)\n    status &= allocINT(mat->lp, &mat->row_tag, rowalloc, AUTOMATIC);\n\n  if(mat->colmax != NULL)\n    status &= allocREAL(mat->lp, &(mat->colmax), colalloc, AUTOMATIC);\n  if(mat->rowmax != NULL)\n    status &= allocREAL(mat->lp, &(mat->rowmax), rowalloc, AUTOMATIC);\n\n  return( status );\n}\n\nSTATIC MYBOOL inc_mat_space(MATrec *mat, int mindelta)\n{\n  int spaceneeded, nz = mat_nonzeros(mat);\n\n  if(mindelta <= 0)\n    mindelta = MAX(mat->rows, mat->columns) + 1;\n  spaceneeded = DELTA_SIZE(mindelta, nz);\n  SETMAX(mindelta, spaceneeded);\n\n  if(mat->mat_alloc == 0)\n    spaceneeded = mindelta;\n  else\n    spaceneeded = nz + mindelta;\n\n  if(spaceneeded >= mat->mat_alloc) {\n    /* Let's allocate at least MAT_START_SIZE entries */\n    if(mat->mat_alloc < MAT_START_SIZE)\n      mat->mat_alloc = MAT_START_SIZE;\n\n    /* Increase the size by RESIZEFACTOR each time it becomes too small */\n    while(spaceneeded >= mat->mat_alloc)\n      mat->mat_alloc += mat->mat_alloc / RESIZEFACTOR;\n\n#if MatrixColAccess==CAM_Record\n    mat->col_mat = (MATitem *) realloc(mat->col_mat, (mat->mat_alloc) * sizeof(*(mat->col_mat)));\n#else /*if MatrixColAccess==CAM_Vector*/\n    allocINT(mat->lp,  &(mat->col_mat_colnr), mat->mat_alloc, AUTOMATIC);\n    allocINT(mat->lp,  &(mat->col_mat_rownr), mat->mat_alloc, AUTOMATIC);\n    allocREAL(mat->lp, &(mat->col_mat_value), mat->mat_alloc, AUTOMATIC);\n#endif\n\n#if MatrixRowAccess==RAM_Index\n    allocINT(mat->lp, &(mat->row_mat), mat->mat_alloc, AUTOMATIC);\n#elif MatrixColAccess==CAM_Record\n    mat->row_mat = (MATitem *) realloc(mat->row_mat, (mat->mat_alloc) * sizeof(*(mat->row_mat)));\n#else /*if MatrixColAccess==CAM_Vector*/\n    allocINT(mat->lp,  &(mat->row_mat_colnr), mat->mat_alloc, AUTOMATIC);\n    allocINT(mat->lp,  &(mat->row_mat_rownr), mat->mat_alloc, AUTOMATIC);\n    allocREAL(mat->lp, &(mat->row_mat_value), mat->mat_alloc, AUTOMATIC);\n#endif\n  }\n  return(TRUE);\n}\n\nSTATIC MYBOOL inc_matrow_space(MATrec *mat, int deltarows)\n{\n  int    rowsum, oldrowsalloc;\n  MYBOOL status = TRUE;\n\n  /* Adjust lp row structures */\n  if(mat->rows+deltarows >= mat->rows_alloc) {\n\n    /* Update memory allocation and sizes */\n    oldrowsalloc = mat->rows_alloc;\n    deltarows = DELTA_SIZE(deltarows, mat->rows);\n    SETMAX(deltarows, DELTAROWALLOC);\n    mat->rows_alloc += deltarows;\n    rowsum = mat->rows_alloc + 1;\n\n    /* Update row pointers */\n    status = allocINT(mat->lp, &mat->row_end, rowsum, AUTOMATIC);\n    mat->row_end_valid = FALSE;\n  }\n  return( status );\n}\n\nSTATIC MYBOOL inc_matcol_space(MATrec *mat, int deltacols)\n{\n  int    i, colsum, oldcolsalloc;\n  MYBOOL status = TRUE;\n\n  /* Adjust lp column structures */\n  if(mat->columns+deltacols >= mat->columns_alloc) {\n\n    /* Update memory allocation and sizes */\n    oldcolsalloc = mat->columns_alloc;\n    deltacols = DELTA_SIZE(deltacols, mat->columns);\n    SETMAX(deltacols, DELTACOLALLOC);\n    mat->columns_alloc += deltacols;\n    colsum = mat->columns_alloc + 1;\n    status = allocINT(mat->lp, &mat->col_end, colsum, AUTOMATIC);\n\n    /* Update column pointers */\n    if(oldcolsalloc == 0)\n      mat->col_end[0] = 0;\n    for(i = MIN(oldcolsalloc, mat->columns) + 1; i < colsum; i++)\n      mat->col_end[i] = mat->col_end[i-1];\n    mat->row_end_valid = FALSE;\n  }\n  return( status );\n}\n\nSTATIC int mat_collength(MATrec *mat, int colnr)\n{\n  return( mat->col_end[colnr] - mat->col_end[colnr-1] );\n}\n\nSTATIC int mat_rowlength(MATrec *mat, int rownr)\n{\n  if(mat_validate(mat)) {\n    if(rownr <= 0)\n      return( mat->row_end[0] );\n    else\n      return( mat->row_end[rownr] - mat->row_end[rownr-1] );\n  }\n  else\n    return( 0 );\n}\n\nSTATIC int mat_nonzeros(MATrec *mat)\n{\n  return( mat->col_end[mat->columns] );\n}\n\nSTATIC MYBOOL mat_indexrange(MATrec *mat, int index, MYBOOL isrow, int *startpos, int *endpos)\n{\n#ifdef Paranoia\n  if(isrow && ((index < 0) || (index > mat->rows)))\n    return( FALSE );\n  else if(!isrow && ((index < 1) || (index > mat->columns)))\n    return( FALSE );\n#endif\n\n  if(isrow && mat_validate(mat)) {\n    if(index == 0)\n      *startpos = 0;\n    else\n      *startpos = mat->row_end[index-1];\n    *endpos = mat->row_end[index];\n  }\n  else {\n    *startpos = mat->col_end[index-1];\n    *endpos = mat->col_end[index];\n  }\n  return( TRUE );\n}\n\nSTATIC int mat_shiftrows(MATrec *mat, int *bbase, int delta, LLrec *varmap)\n{\n  int     j, k, i, ii, thisrow, *colend, base;\n  MYBOOL  preparecompact = FALSE;\n  int     *rownr;\n\n  if(delta == 0)\n    return( 0 );\n  base = abs(*bbase);\n\n  if(delta > 0) {\n\n    /* Insert row by simply incrementing existing row indeces */\n    if(base <= mat->rows) {\n      k = mat_nonzeros(mat);\n      rownr = &COL_MAT_ROWNR(0);\n      for(ii = 0; ii < k; ii++, rownr += matRowColStep) {\n        if(*rownr >= base)\n          *rownr += delta;\n      }\n    }\n\n    /* Set defaults (actual basis set in separate procedure) */\n    for(i = 0; i < delta; i++) {\n      ii = base + i;\n      mat->row_end[ii] = 0;\n    }\n  }\n  else if(base <= mat->rows) {\n\n    /* Check for preparation of mass-deletion of rows */\n    preparecompact = (MYBOOL) (varmap != NULL);\n    if(preparecompact) {\n      /* Create the offset array */\n      int *newrowidx = NULL;\n      allocINT(mat->lp, &newrowidx, mat->rows+1, FALSE);\n      newrowidx[0] = 0;\n      delta = 0;\n      for(j = 1; j <= mat->rows; j++) {\n        if(isActiveLink(varmap, j)) {\n          delta++;\n          newrowidx[j] = delta;\n        }\n        else\n          newrowidx[j] = -1;\n      }\n      k = 0;\n      delta = 0;\n      base = mat_nonzeros(mat);\n      rownr = &COL_MAT_ROWNR(0);\n      for(i = 0; i < base; i++, rownr += matRowColStep) {\n        thisrow = newrowidx[*rownr];\n        if(thisrow < 0) {\n          *rownr = -1;\n          delta++;\n        }\n        else\n          *rownr = thisrow;\n      }\n      FREE(newrowidx);\n      return(delta);\n    }\n\n    /* Check if we should prepare for compacting later\n       (this is in order to speed up multiple row deletions) */\n    preparecompact = (MYBOOL) (*bbase < 0);\n    if(preparecompact)\n      *bbase = my_flipsign((*bbase));\n\n    /* First make sure we don't cross the row count border */\n    if(base-delta-1 > mat->rows)\n      delta = base - mat->rows - 1;\n\n    /* Then scan over all entries shifting and updating rows indeces */\n    if(preparecompact) {\n      k = 0;\n      for(j = 1, colend = mat->col_end + 1;\n          j <= mat->columns; j++, colend++) {\n        i = k;\n        k = *colend;\n        rownr = &COL_MAT_ROWNR(i);\n        for(; i < k; i++, rownr += matRowColStep) {\n          thisrow = *rownr;\n          if(thisrow < base)\n            continue;\n          else if(thisrow >= base-delta)\n            *rownr += delta;\n          else\n            *rownr = -1;\n        }\n      }\n    }\n    else {\n      k = 0;\n      ii = 0;\n      for(j = 1, colend = mat->col_end + 1;\n          j <= mat->columns; j++, colend++) {\n        i = k;\n        k = *colend;\n        rownr = &COL_MAT_ROWNR(i);\n        for(; i < k; i++, rownr += matRowColStep) {\n          thisrow = *rownr;\n          if(thisrow >= base) {\n            if(thisrow >= base-delta)\n              *rownr += delta;\n            else\n              continue;\n          }\n          if(ii != i) {\n            COL_MAT_COPY(ii, i);\n          }\n          ii++;\n        }\n        *colend = ii;\n      }\n    }\n  }\n  return( 0 );\n}\n\n/* Map-based compacting+insertion of matrix elements without changing row and column indeces.\n   When mat2 is NULL, a simple compacting of non-deleted rows and columns is done. */\nSTATIC int mat_mapreplace(MATrec *mat, LLrec *rowmap, LLrec *colmap, MATrec *mat2)\n{\n  lprec *lp = mat->lp;\n  int   i, ib, ie, ii, j, jj, jb, je, nz, *colend, *rownr, *rownr2, *indirect = NULL;\n  REAL  *value, *value2;\n\n  /* Check if there is something to insert */\n  if((mat2 != NULL) && ((mat2->col_tag == NULL) || (mat2->col_tag[0] <= 0) || (mat_nonzeros(mat2) == 0)))\n    return( 0 );\n\n  /* Create map and sort by increasing index in \"mat\" */\n  if(mat2 != NULL) {\n    jj = mat2->col_tag[0];\n    allocINT(lp, &indirect, jj+1, FALSE);\n    indirect[0] = jj;\n    for(i = 1; i <= jj; i++)\n      indirect[i] = i;\n    hpsortex(mat2->col_tag, jj, 1, sizeof(*indirect), FALSE, compareINT, indirect);\n  }\n\n  /* Do the compacting */\n  mat->row_end_valid = FALSE;\n  nz = mat->col_end[mat->columns];\n  ie = 0;\n  ii = 0;\n  if((mat2 == NULL) || (indirect[0] == 0)) {\n    je = mat->columns + 1;\n    jj = 1;\n    jb = 0;\n  }\n  else {\n    je = indirect[0];\n    jj = 0;\n    do {\n      jj++;\n      jb = mat2->col_tag[jj];\n    } while(jb <= 0);\n\n  }\n  for(j = 1, colend = mat->col_end + 1;\n      j <= mat->columns; j++, colend++) {\n    ib = ie;\n    ie = *colend;\n\n    /* Always skip (condense) replacement columns */\n    if(j == jb) {\n      jj++;\n      if(jj <= je)\n        jb = mat2->col_tag[jj];\n      else\n        jb = mat->columns + 1;\n    }\n\n    /* Only include active columns */\n    else if(isActiveLink(colmap, j)) {\n      rownr = &COL_MAT_ROWNR(ib);\n      for(; ib < ie; ib++, rownr += matRowColStep) {\n\n        /* Also make sure the row is active */\n        if(isActiveLink(rowmap, *rownr)) {\n          if(ii != ib) {\n            COL_MAT_COPY(ii, ib);\n          }\n          ii++;\n        }\n      }\n    }\n    *colend = ii;\n  }\n  if(mat2 == NULL)\n    goto Finish;\n\n  /* Tally non-zero insertions */\n  i = 0;\n  for(j = 1; j <= mat2->col_tag[0]; j++) {\n    jj = mat2->col_tag[j];\n    if((jj > 0) && isActiveLink(colmap, jj)) {\n      jj = indirect[j];\n      je = mat2->col_end[jj];\n      jb = mat2->col_end[jj-1];\n      rownr2 = &COL_MAT2_ROWNR(jb);\n      for(; jb < je; jb++, rownr2 += matRowColStep) {\n        if((*rownr2 > 0) && isActiveLink(rowmap, *rownr2))\n          i++;\n      }\n    }\n  }\n\n  /* Make sure we have enough matrix space */\n  ii = mat->col_end[mat->columns] + i;\n  if(mat->mat_alloc <= ii)\n    inc_mat_space(mat, i);\n\n  /* Do shifting and insertion - loop from the end going forward */\n  jj = indirect[0];\n  jj = mat2->col_tag[jj];\n  for(j = mat->columns, colend = mat->col_end + mat->columns, ib = *colend;\n      j > 0; j--) {\n\n    /* Update indeces for this loop */\n    ie = ib;\n    *colend = ii;\n    colend--;\n    ib = *colend;\n\n    /* Insert new values */\n    if(j == jj) {\n      /* Only include an active column */\n      if(isActiveLink(colmap, j)) {\n        jj = indirect[0];\n        jj = indirect[jj];\n        rownr = &COL_MAT_ROWNR(ii-1);\n        value = &COL_MAT_VALUE(ii-1);\n        jb = mat2->col_end[jj-1];\n        je = mat2->col_end[jj] - 1;\n        rownr2 = &COL_MAT2_ROWNR(je);\n        value2 = &COL_MAT2_VALUE(je);\n\n        /* Process constraint coefficients */\n        for(; je >= jb; je--, rownr2 -= matRowColStep, value2 -= matValueStep) {\n          i = *rownr2;\n          if(i == 0) {\n            i = -1;\n            break;\n          }\n          else if(isActiveLink(rowmap, i)) {\n            ii--;\n            *rownr = i;\n            rownr -= matRowColStep;\n            *value = my_chsign(is_chsign(lp, i), *value2);\n            value -= matValueStep;\n          }\n        }\n\n        /* Then handle the objective */\n        if(i == -1) {\n          lp->orig_obj[j] = my_chsign(is_maxim(lp), *value2);\n          rownr2 -= matRowColStep;\n          value2 -= matValueStep;\n        }\n        else\n          lp->orig_obj[j] = 0;\n\n      }\n      /* Update replacement column index or break if no more candidates */\n      jj = --indirect[0];\n      if(jj == 0)\n        break;\n      jj = mat2->col_tag[jj];\n      if(jj <= 0)\n        break;\n    }\n    /* Shift existing values down */\n    else {\n      if(isActiveLink(colmap, j))\n      while(ie > ib) {\n        ii--;\n        ie--;\n        if(ie != ii) {\n          COL_MAT_COPY(ii, ie);\n        }\n      }\n    }\n  }\n\n  /* Return the delta number of non-zero elements */\nFinish:\n  nz -= mat->col_end[mat->columns];\n  FREE(indirect);\n\n  return( nz );\n}\n\n/* Routines to compact rows in matrix based on precoded entries */\nSTATIC int mat_zerocompact(MATrec *mat)\n{\n  return( mat_rowcompact(mat, TRUE) );\n}\nSTATIC int mat_rowcompact(MATrec *mat, MYBOOL dozeros)\n{\n  int  i, ie, ii, j, nn, *colend, *rownr;\n  REAL *value;\n\n  nn = 0;\n  ie = 0;\n  ii = 0;\n  for(j = 1, colend = mat->col_end + 1;\n      j <= mat->columns; j++, colend++) {\n    i = ie;\n    ie = *colend;\n    rownr = &COL_MAT_ROWNR(i);\n    value = &COL_MAT_VALUE(i);\n    for(; i < ie;\n        i++, rownr += matRowColStep, value += matValueStep) {\n      if((*rownr < 0) || (dozeros && (fabs(*value) < mat->epsvalue))) {\n        nn++;\n        continue;\n      }\n      if(ii != i) {\n        COL_MAT_COPY(ii, i);\n      }\n      ii++;\n    }\n    *colend = ii;\n  }\n  return( nn );\n}\n\n/* Routines to compact columns and their indeces based on precoded entries */\nSTATIC int mat_colcompact(MATrec *mat, int prev_rows, int prev_cols)\n{\n  int             i, ii, j, k, n_del, n_sum, *colend, *newcolend, *colnr, newcolnr;\n  MYBOOL          deleted;\n  lprec           *lp = mat->lp;\n  presolveundorec *lpundo = lp->presolve_undo;\n\n\n  n_sum = 0;\n  k  = 0;\n  ii = 0;\n  newcolnr = 1;\n  for(j = 1, colend = newcolend = mat->col_end + 1;\n      j <= prev_cols; j++, colend++) {\n    n_del = 0;\n    i = k;\n    k = *colend;\n    for(colnr = &COL_MAT_COLNR(i); i < k;\n        i++, colnr += matRowColStep) {\n      if(*colnr < 0) {\n        n_del++;\n        n_sum++;\n        continue;\n      }\n      if(ii < i) {\n        COL_MAT_COPY(ii, i);\n      }\n      if(newcolnr < j) {\n        COL_MAT_COLNR(ii) = newcolnr;\n      }\n      ii++;\n    }\n    *newcolend = ii;\n\n    deleted = (MYBOOL) (n_del > 0);\n#if 1\n    /* Do hoops in case there was an empty column */\n    deleted |= (MYBOOL) (!lp->wasPresolved && (lpundo->var_to_orig[prev_rows+j] < 0));\n\n#endif\n    /* Increment column variables if current column was not deleted */\n    if(!deleted) {\n      newcolend++;\n      newcolnr++;\n    }\n  }\n  return(n_sum);\n}\n\nSTATIC int mat_shiftcols(MATrec *mat, int *bbase, int delta, LLrec *varmap)\n{\n  int     i, ii, k, n, base;\n\n\n  k = 0;\n  if(delta == 0)\n    return( k );\n  base = abs(*bbase);\n\n  if(delta > 0) {\n    /* Shift pointers right */\n    for(ii = mat->columns; ii > base; ii--) {\n      i = ii + delta;\n      mat->col_end[i] = mat->col_end[ii];\n    }\n    /* Set defaults */\n    for(i = 0; i < delta; i++) {\n      ii = base + i;\n      mat->col_end[ii] = mat->col_end[ii-1];\n    }\n  }\n  else {\n\n    /* Check for preparation of mass-deletion of columns */\n    MYBOOL preparecompact = (MYBOOL) (varmap != NULL);\n    if(preparecompact) {\n      /* Create the offset array */\n      int j, *colnr, *colend;\n      n = 0;\n      k = 0;\n      base = 0;\n      for(j = 1, colend = mat->col_end + 1;\n          j <= mat->columns; j++, colend++) {\n        i = k;\n        k = *colend;\n        if(isActiveLink(varmap, j)) {\n          base++;\n          ii = base;\n        }\n        else\n          ii = -1;\n        if(ii < 0)\n          n += k - i;\n        colnr = &COL_MAT_COLNR(i);\n        for(; i < k; i++, colnr += matRowColStep)\n          *colnr = ii;\n      }\n      return(n);\n    }\n\n    /* Check if we should prepare for compacting later\n       (this is in order to speed up multiple column deletions) */\n    preparecompact = (MYBOOL) (*bbase < 0);\n    if(preparecompact)\n      *bbase = my_flipsign((*bbase));\n\n    /* First make sure we don't cross the column count border */\n    if(base-delta-1 > mat->columns)\n      delta = base - mat->columns - 1;\n\n    /* Then scan over all entries shifting and updating column indeces */\n    if(preparecompact) {\n      int *colnr;\n      n = 0;\n      i = mat->col_end[base-1];\n      k = mat->col_end[base-delta-1];\n      for(colnr = &COL_MAT_COLNR(i); i < k;\n          i++, colnr += matRowColStep) {\n        n++;\n        *colnr = -1;\n      }\n      k = n;\n    }\n    else {\n      /* Delete sparse matrix data, if required */\n      if(base <= mat->columns) {\n\n        i = mat->col_end[base-1];          /* Beginning of data to be deleted */\n        ii = mat->col_end[base-delta-1];   /* Beginning of data to be shifted left */\n        n = mat_nonzeros(mat);             /* Total number of non-zeros */\n        k = ii-i;                          /* Number of entries to be deleted */\n        if((k > 0) && (n > i)) {\n          n -= ii;\n          COL_MAT_MOVE(i, ii, n);\n        }\n\n        /* Update indexes */\n        for(i = base; i <= mat->columns + delta; i++) {\n          ii = i - delta;\n          mat->col_end[i] = mat->col_end[ii] - k;\n        }\n      }\n    }\n  }\n  return( k );\n}\n\nSTATIC MATrec *mat_extractmat(MATrec *mat, LLrec *rowmap, LLrec *colmap, MYBOOL negated)\n{\n  int    *rownr, *colnr, xa, na;\n  REAL   *value;\n  MATrec *newmat = mat_create(mat->lp, mat->rows, mat->columns, mat->epsvalue);\n\n  /* Initialize */\n  na = mat_nonzeros(mat);\n  rownr = &COL_MAT_ROWNR(0);\n  colnr = &COL_MAT_COLNR(0);\n  value = &COL_MAT_VALUE(0);\n\n  /* Loop over the indeces, picking out values in qualifying rows and colums\n     (note that the loop could be speeded up for dense matrices by making an\n      outer loop for columns and inner loop for rows) */\n  for(xa = 0; xa < na; xa++, rownr += matRowColStep, colnr += matRowColStep, value += matValueStep) {\n    if((isActiveLink(colmap, *colnr) ^ negated) &&\n       (isActiveLink(rowmap, *rownr) ^ negated))\n      mat_setvalue(newmat, *rownr, *colnr, *value, FALSE);\n  }\n\n  /* Return the populated new matrix */\n  return( newmat );\n}\n\nSTATIC MYBOOL mat_setcol(MATrec *mat, int colno, int count, REAL *column, int *rowno, MYBOOL doscale, MYBOOL checkrowmode)\n{\n  int    i, jj = 0, elmnr, orignr, newnr, firstrow;\n  MYBOOL *addto = NULL, isA, isNZ;\n  REAL   value, saved = 0;\n  lprec  *lp = mat->lp;\n\n  /* Check if we are in row order mode and should add as row instead;\n     the matrix will be transposed at a later stage */\n  if(checkrowmode && mat->is_roworder)\n    return( mat_setrow(mat, colno, count, column, rowno, doscale, FALSE) );\n\n  /* Initialize and validate */\n  isA = (MYBOOL) (mat == mat->lp->matA);\n  isNZ = (MYBOOL) (rowno != NULL);\n  if(!isNZ)\n    count = mat->lp->rows;\n  else if((count < 0) || (count > mat->rows+((mat->is_roworder) ? 0 : 1)))\n    return( FALSE );\n  if(isNZ && (count > 0)) {\n    if(count > 1)\n      sortREALByINT(column, rowno, count, 0, TRUE);\n    if((rowno[0] < 0) || (rowno[count-1] > mat->rows))\n      return( FALSE );\n  }\n\n  /* Capture OF definition in column mode */\n  if(isA && !mat->is_roworder) {\n    if(isNZ && (count > 0) && (rowno[0] == 0)) {\n      value = column[0];\n#ifdef DoMatrixRounding\n      value = roundToPrecision(value, mat->epsvalue);\n#endif\n      if(doscale)\n        value = scaled_mat(lp, value, 0, colno);\n      value = my_chsign(is_maxim(lp), value);\n      lp->orig_obj[colno] = value;\n      count--;\n      column++;\n      rowno++;\n    }\n    else if(!isNZ && (column[0] != 0)) {\n      value = saved = column[0];\n#ifdef DoMatrixRounding\n      value = roundToPrecision(value, mat->epsvalue);\n#endif\n      if(doscale)\n        value = scaled_mat(lp, value, 0, colno);\n      value = my_chsign(is_maxim(lp), value);\n      lp->orig_obj[colno] = value;\n      column[0] = 0;\n    }\n    else\n      lp->orig_obj[colno] = 0;\n  }\n\n  /* Optionally tally and map the new non-zero values */\n  firstrow = mat->rows + 1;\n  if(isNZ) {\n    newnr = count;\n    if(newnr) {\n      firstrow = rowno[0];\n      jj = rowno[newnr - 1];\n    }\n  }\n  else {\n    newnr = 0;\n    if(!allocMYBOOL(lp, &addto, mat->rows + 1, TRUE)) {\n      return( FALSE );\n    }\n    for(i = mat->rows; i >= 0; i--) {\n      if(fabs(column[i]) > mat->epsvalue) {\n        addto[i] = TRUE;\n        firstrow = i;\n        newnr++;\n      }\n    }\n  }\n\n  /* Make sure we have enough matrix space */\n  if(!inc_mat_space(mat, newnr)) {\n    newnr = 0;\n    goto Done;\n  }\n\n  /* Shift existing column data and adjust position indeces */\n  orignr = mat_collength(mat, colno);\n  elmnr = newnr - orignr;\n  i = mat_nonzeros(mat) - mat->col_end[colno];\n  if((elmnr != 0) && (i > 0)) {\n    COL_MAT_MOVE(mat->col_end[colno] + elmnr, mat->col_end[colno], i);\n  }\n  if(elmnr != 0)\n    for(i = colno; i <= mat->columns; i++)\n      mat->col_end[i] += elmnr;\n\n  /* We are now ready to copy the new data */\n  jj = mat->col_end[colno-1];\n  if(isNZ) {\n    for(i = 0; i < count; jj++, i++) {\n      value = column[i];\n#ifdef DoMatrixRounding\n      value = roundToPrecision(value, mat->epsvalue);\n#endif\n      if(mat->is_roworder) {    /* Fix following Ingmar Stein bug report 12.10.2006 */\n        if(isA && doscale)\n          value = scaled_mat(lp, value, colno, rowno[i]);\n        if(isA)\n          value = my_chsign(is_chsign(lp, colno), value);\n      }\n      else {\n        if(isA && doscale)\n          value = scaled_mat(lp, value, rowno[i], colno);\n        if(isA)\n          value = my_chsign(is_chsign(lp, rowno[i]), value);\n      }\n      SET_MAT_ijA(jj, rowno[i], colno, value);\n    }\n  }\n  else {\n    for(i = firstrow; i <= mat->rows; i++) {\n      if(!addto[i])\n        continue;\n      value = column[i];\n#ifdef DoMatrixRounding\n      value = roundToPrecision(value, mat->epsvalue);\n#endif\n      if(mat->is_roworder) {    /* Fix following Ingmar Stein bug report 12.10.2006 */\n        if(isA && doscale)\n          value = scaled_mat(lp, value, colno, i);\n        if(isA)\n          value = my_chsign(is_chsign(lp, colno), value);\n      }\n      else {\n        if(isA && doscale)\n          value = scaled_mat(lp, value, i, colno);\n        if(isA)\n          value = my_chsign(is_chsign(lp, i), value);\n      }\n      SET_MAT_ijA(jj, i, colno, value);\n      jj++;\n    }\n  }\n  mat->row_end_valid = FALSE;\n\n  /* Finish and return */\nDone:\n  if(saved != 0)\n    column[0] = saved;\n  FREE(addto);\n  return( TRUE );\n\n}\n\nSTATIC MYBOOL mat_mergemat(MATrec *target, MATrec *source, MYBOOL usecolmap)\n{\n  lprec *lp = target->lp;\n  int   i, ix, iy, n, *colmap = NULL;\n  REAL  *colvalue = NULL;\n\n  if((target->rows < source->rows) || !allocREAL(lp, &colvalue, target->rows+1, FALSE))\n    return( FALSE );\n\n  if(usecolmap) {\n    n = source->col_tag[0];\n    allocINT(lp, &colmap, n+1, FALSE);\n    for(i = 1; i <= n; i++)\n      colmap[i] = i;\n    hpsortex(source->col_tag, n, 1, sizeof(*colmap), FALSE, compareINT, colmap);\n  }\n  else\n    n = source->columns;\n  for(i = 1; i <= n; i++) {\n    if(!usecolmap && (mat_collength(source, i) == 0))\n      continue;\n    if(usecolmap) {\n      ix = colmap[i];\n      if(ix <= 0)\n        continue;\n      iy = source->col_tag[i];\n      if(iy <= 0)\n        continue;\n    }\n    else\n      ix = iy = i;\n    mat_expandcolumn(source, ix, colvalue, NULL, FALSE);\n    mat_setcol(target, iy, 0, colvalue, NULL, FALSE, FALSE);\n  }\n\n  FREE( colvalue );\n  FREE( colmap );\n\n  return( TRUE );\n}\n\nSTATIC int mat_nz_unused(MATrec *mat)\n{\n  return( mat->mat_alloc - mat->col_end[mat->columns] );\n}\n\n#if 0\nSTATIC MYBOOL mat_setrow(MATrec *mat, int rowno, int count, REAL *row, int *colno, MYBOOL doscale, MYBOOL checkrowmode)\n{\n  lprec   *lp = mat->lp;\n  int     delta;\n  int k, kk, i, ii, j, jj = 0, jj_j, elmnr, orignr, newnr, firstcol, rownr, colnr, matz = 0;\n  MYBOOL  *addto = NULL, isA, isNZ;\n  REAL    value = 0.0, saved = 0;\n\n  /* Check if we are in row order mode and should add as column instead;\n     the matrix will be transposed at a later stage */\n  if(checkrowmode && mat->is_roworder)\n    return( mat_setcol(mat, rowno, count, row, colno, doscale, FALSE) );\n\n  /* Do initialization and validation */\n  if(!mat_validate(mat))\n    return( FALSE );\n  isA = (MYBOOL) (mat == lp->matA);\n  isNZ = (MYBOOL) (colno != NULL);\n  if(!isNZ)\n    count = mat->columns;\n  else if((count < 0) || (count > mat->columns))\n    return( FALSE );\n  if(isNZ && (count > 0)) {\n    if(count > 1)\n      sortREALByINT(row, (int *) colno, count, 0, TRUE);\n    if((colno[0] < 1) || (colno[count-1] > mat->columns))\n      return( FALSE );\n  }\n\n  /* Capture OF definition in row mode */\n  if(isA && mat->is_roworder) {\n    lp->orig_obj[rowno] = 0;\n    if(isNZ && (count > 0) && (colno[0] == 0)) {\n      value = row[0];\n      if(doscale)\n        value = scaled_mat(lp, value, 0, rowno);\n      value = my_chsign(is_maxim(lp), value);\n#ifdef DoMatrixRounding\n      value = roundToPrecision(value, mat->epsvalue);\n#endif\n      lp->orig_obj[rowno] = value;\n      count--;\n      row++;\n      colno++;\n    }\n    else if(!isNZ && (row[0] != 0)) {\n      value = saved = row[0];\n      if(doscale)\n        value = scaled_mat(lp, value, 0, rowno);\n      value = my_chsign(is_maxim(lp), value);\n#ifdef DoMatrixRounding\n      value = roundToPrecision(value, mat->epsvalue);\n#endif\n      lp->orig_obj[rowno] = value;\n      row[0] = 0;\n    }\n    else {\n      lp->orig_obj[rowno] = 0;\n      value = 0;\n    }\n  }\n\n  /* Optionally tally and map the new non-zero values */\n  i  = mat->row_end[rowno-1];\n  ii = mat->row_end[rowno];     // ****** KE 20070106 - was \"-1\"\n  firstcol = mat->columns + 1;\n  if(isNZ) {\n    /* See if we can do fast in-place replacements of leading items */\n    colnr = 1; /* initialise in case of an empty row */\n    while((i < ii) /* && (count > 0) */ && ((colnr = ROW_MAT_COLNR(i)) == *colno) && (count > 0)) {\n      value = *row;             // ****** KE 20080111 - Added line\n      if(mat->is_roworder) {\n        if(isA && doscale)\n          value = scaled_mat(lp, value, colnr, rowno);\n        if(isA)\n          value = my_chsign(is_chsign(lp, colnr), value);\n      }\n      else {\n        if(isA && doscale)\n          value = scaled_mat(lp, value, rowno, colnr);\n        if(isA)\n          value = my_chsign(is_chsign(lp, rowno), value);\n      }\n#ifdef DoMatrixRounding\n      value = roundToPrecision(value, mat->epsvalue);\n      if(value == 0)\n        matz++;\n#endif\n      ROW_MAT_VALUE(i) = value;\n      i++;\n      count--;\n      row++;\n      colno++;\n    }\n  if(i >= ii)\n      colnr = 0;\n    /* Proceed with remaining entries */\n    newnr = count;\n    if(newnr > 0)\n      firstcol = colno[0];\n  }\n  else {\n    newnr = 0;\n    kk = mat->columns;\n    if(i < ii)\n      colnr = ROW_MAT_COLNR(i);\n    else\n      colnr = 0;\n    for(k = 1; k <= kk; k++) {\n      value = row[k];           // ****** KE 20080111 - Added line\n      if(fabs(value) > mat->epsvalue) {\n        /* See if we can do fast in-place replacements of leading items */\n        if((addto == NULL) && (i < ii) && (colnr == k)) {\n          if(mat->is_roworder) {\n            if(isA && doscale)\n              value = scaled_mat(lp, value, colnr, rowno);\n            if(isA)\n              value = my_chsign(is_chsign(lp, colnr), value);\n          }\n          else {\n            if(isA && doscale)\n              value = scaled_mat(lp, value, rowno, colnr);\n            if(isA)\n              value = my_chsign(is_chsign(lp, rowno), value);\n          }\n#ifdef DoMatrixRounding\n          value = roundToPrecision(value, mat->epsvalue);\n          if(value == 0)\n            matz++;\n#endif\n          ROW_MAT_VALUE(i) = value;\n          i++;\n          if(i < ii)\n            colnr = ROW_MAT_COLNR(i);\n          else\n            colnr = 0;\n        }\n        /* Otherwise update addto-list */\n        else {\n          if(addto == NULL) {\n            if(!allocMYBOOL(lp, &addto, mat->columns + 1, TRUE))\n              return( FALSE );\n            firstcol = k;\n          }\n          addto[k] = TRUE;\n          newnr++;\n        }\n      }\n    }\n  }\n  if(newnr == 0)\n   if (FALSE)\n    return( TRUE );\n\n  /* Make sure we have enough matrix space */\n  if((newnr > 0) && (mat_nz_unused(mat) <= newnr) && !inc_mat_space(mat, newnr)) {\n    newnr = 0;\n    goto Done;\n  }\n\n  /* Pack initial entries if existing row data has a lower column\n     start index than the first index of the new vector */\n  orignr = mat_nonzeros(mat);\n  /* delta = newnr - mat_rowlength(mat, rowno);*/\n  kk = 0;\n  if(rowno == 0)\n    ii = 0;\n  else\n    ii = mat->row_end[rowno-1];\n\n  if((orignr == 0) || (ii >= orignr))\n    j = firstcol;\n  else if(isNZ||TRUE)\n    j = colnr;\n  else\n    j = ROW_MAT_COLNR(ii); /* first column with a value on that row */\n\n  jj = mat->col_end[firstcol-1];  /* Set the index of the insertion point for the first new value */\n  if(jj >= orignr)\n    colnr = firstcol;\n  else\n    colnr = COL_MAT_COLNR(jj); /* first column with a value starting from firstcol */\n\n  if((j > 0) && (j < colnr)) {\n    jj = elmnr = mat->col_end[j-1];\n    for( ; j < colnr; j++) {\n      /* Shift entries in current column */\n      k = mat->col_end[j];\n      for( ; jj < k; jj++) {\n        if(COL_MAT_ROWNR(jj) != rowno) {\n          COL_MAT_COPY(elmnr, jj);\n          elmnr++;\n        }\n      }\n      /* Update next column start index */\n      mat->col_end[j] = elmnr;\n    }\n    delta = elmnr - jj;  /* The shrinkage count */\n  }\n  else {\n    delta = 0;\n    /* Adjust for case where we simply append values - jj is initially the first column item */\n    if((mat->col_end[firstcol] == orignr) && 0)\n      jj = orignr;\n  }\n\n  /* Make sure we have sufficient space for any additional entries and move existing data down;\n     this ensures that we only have to relocate matrix elements up in the next stage */\n  jj_j = MAX(0, newnr + delta);\n  if(jj_j > 0) {\n    if(!inc_mat_space(mat, jj_j)) {\n      FREE(addto);\n      return( FALSE );\n    }\n    if(orignr-jj > 0) {\n      COL_MAT_MOVE(jj+jj_j, jj, orignr-jj);\n    }\n    jj += jj_j;\n  }\n\n  /* Handle case where the matrix was empty before (or we can simply append) */\n  if((delta >= 0) && (mat->col_end[firstcol] == orignr) && 0) {\n    if(isNZ)\n      elmnr = count;\n    else\n      elmnr = mat->columns;\n    jj_j = mat->col_end[firstcol];\n    for(newnr = 0; newnr < elmnr; newnr++) {\n      if(isNZ)\n        colnr = colno[newnr];\n      else\n        colnr = newnr + 1;\n      /* Update column start position if we have crossed a column */\n      while(colnr > firstcol) {\n        mat->col_end[firstcol] = jj_j;\n        firstcol++;\n      }\n      if(isNZ || ((addto != NULL) && addto[colnr])) {\n        if(isNZ)\n          value = row[newnr];\n        else\n          value = row[colnr];\n        if(isA && doscale)\n          value = scaled_mat(lp, value, rowno, colnr);\n        if(isA)\n          value = my_chsign(is_chsign(lp, rowno), value);\n#ifdef DoMatrixRounding\n        value = roundToPrecision(value, mat->epsvalue);\n        if(value == 0)\n          matz++;\n#endif\n        SET_MAT_ijA(jj_j, rowno, colnr, value);\n        jj_j++;\n        /* Update last column start position */\n        mat->col_end[firstcol] = jj_j;\n        firstcol++;\n      }\n    }\n\n    /* Make sure we update tail empty column offsets */\n    while(firstcol <= mat->columns) {\n      mat->col_end[firstcol] = jj_j;\n      firstcol++;\n    }\n    jj_j = 0;\n  }\n\n  /* Start from the top of the first non-zero column of the new row */\n  elmnr = orignr + jj_j;\n  if(jj <= elmnr) {\n    if(isNZ)\n      newnr = 0;\n    else\n      newnr = firstcol - 1;\n    j = jj - mat->col_end[firstcol-1];\n    colnr = firstcol;\n    while((jj < elmnr) || (newnr < count)) {\n\n      /* Update column start position if we have crossed a column */\n      while(colnr > firstcol) {\n        mat->col_end[firstcol] = kk;\n        firstcol++;\n      }\n\n      /* See if we have a row equal to or greater than the target row */\n      jj_j = jj - j;\n      if(jj < elmnr) {\n        rownr = COL_MAT_ROWNR(jj);\n        colnr = COL_MAT_COLNR(jj);\n      }\n      else {\n        rownr = rowno;\n        if(!isNZ)                              /* KE added this conditional on 13.9.2006 */\n          colnr = firstcol + 1;\n        else\n          colnr = mat->columns + 1;\n      }\n\n      if(isNZ) {\n        if(newnr < count)\n          kk = colno[newnr];\n        else\n          kk = mat->columns + 1;\n      }\n      else\n        kk = newnr + 1;\n\n      /* Test if there is an available new item ... */\n      if((isNZ && (kk > colnr)) ||                    /* If this is not the case */\n         (!isNZ && ((kk > colnr) || (!addto[kk])))) {\n        /* DELETE if there is an existing value */\n        if(!isNZ && (kk <= colnr))\n          newnr++;\n        if(rownr == rowno) {\n          kk = jj_j;\n          j++;\n          jj++;\n          continue;\n        }\n        /* KEEP otherwise and move entry up */\n        if(!isNZ && (colnr > kk)) {\n          colnr = kk;\n          kk = jj_j;\n          continue;\n        }\n      }\n      else if((colnr > kk) ||                         /* Existing column index > new => INSERT */\n              ((colnr == kk) && (rownr >= rowno)) ) { /* Same column index, existing row >= target row => INSERT/REPLACE */\n\n        if(isNZ)\n          value = row[newnr];\n        else\n          value = row[newnr+1];\n        newnr++;\n        if(isA && doscale)\n          value = scaled_mat(lp, value, rowno, kk);\n        if(isA)\n          value = my_chsign(is_chsign(lp, rowno), value);\n#ifdef DoMatrixRounding\n        value = roundToPrecision(value, mat->epsvalue);\n        if(value == 0)\n          matz++;\n#endif\n        SET_MAT_ijA(jj_j, rowno, kk, value);\n\n        /* Adjust if we have inserted an element */\n        if((colnr > kk) || (rownr > rowno)) {\n          j--;\n          jj--;\n        }\n        colnr = kk;\n        kk = jj_j;\n        jj++;\n        continue;\n      }\n\n      /* Shift the matrix element up by the active difference */\n      if(jj_j != jj) {\n        COL_MAT_COPY(jj_j, jj);\n      }\n      kk = jj_j;\n      jj++;\n\n    }\n\n    /* Update pending / incomplete column start position */\n    while(colnr > firstcol) {\n      mat->col_end[firstcol] = kk;\n      firstcol++;\n    }\n\n    /* Make sure we update tail column offsets */\n    jj_j = jj - j;\n    while(firstcol <= mat->columns) {\n      mat->col_end[firstcol] = jj_j;\n      firstcol++;\n    }\n  }\n\n  /* Compact in the case that we added zeros and set flag for row index update */\n  if(matz > 0)\n    mat_zerocompact(mat);\n  mat->row_end_valid = FALSE;\n\nDone:\n  if(saved != 0)\n    row[0] = saved;\n  FREE(addto);\n  return( (MYBOOL) (newnr > 0) );\n\n}\n\n#else\n\nSTATIC MYBOOL mat_setrow(MATrec *mat, int rowno, int count, REAL *row, int *colno, MYBOOL doscale, MYBOOL checkrowmode)\n{\n  lprec   *lp = mat->lp;\n  int     delta, delta1;\n  int k, i, ii, j, jj_j, lendense,\n          origidx = 0, newidx, orignz, newnz,\n          rownr, colnr, colnr1;\n  MYBOOL  isA, isNZ;\n  REAL    value = 0.0;\n\n  /* Check if we are in row order mode and should add as column instead;\n     the matrix will be transposed at a later stage */\n  if(checkrowmode && mat->is_roworder)\n    return( mat_setcol(mat, rowno, count, row, colno, doscale, FALSE) );\n\n  /* Do initialization and validation */\n  if(!mat_validate(mat))\n    return( FALSE );\n  isA = (MYBOOL) (mat == lp->matA);\n  if(doscale && isA && !lp->scaling_used)\n    doscale = FALSE;\n  isNZ = (MYBOOL) (colno != NULL);\n  lendense = (mat->is_roworder ? lp->rows : lp->columns);\n  if((count < 0) || (count > lendense))\n    return( FALSE );\n  colnr1 = lendense + 1;\n\n  /* Capture OF definition in row mode */\n  if(isA && mat->is_roworder) {\n    lp->orig_obj[rowno] = 0;\n    if((count > 0) && (colno[0] == 0)) {\n      value = row[0];\n      if(doscale)\n        value = scaled_mat(lp, value, 0, rowno);\n      value = my_chsign(is_maxim(lp), value);\n#ifdef DoMatrixRounding\n      value = roundToPrecision(value, mat->epsvalue);\n#endif\n      lp->orig_obj[rowno] = value;\n      if(isNZ) {\n        colno++;\n        row++;\n        count--;\n      }\n    }\n    else {\n      lp->orig_obj[rowno] = 0;\n      value = 0;\n    }\n  }\n\n  /* Make local working data copies */\n  if(!isNZ) {\n    REAL *tmprow = NULL;\n    if(!allocINT(lp, &colno, lendense+1, FALSE))\n      return( FALSE );\n    newnz = 0;\n    for(i = 1; i <= lendense; i++)\n      if((value = row[i]) != 0) {\n        if((tmprow == NULL) && !allocREAL(lp, &tmprow, lendense-i+1, FALSE)) {\n          FREE(colno);\n          return( FALSE );\n        }\n        tmprow[newnz] = value;\n        colno[newnz++] = i;\n      }\n    count = newnz;\n    row = tmprow;\n  }\n  else {\n    int *tmpcolno = NULL;\n    if(!allocINT(lp, &tmpcolno, lendense, FALSE))\n      return( FALSE );\n    newnz = count;\n    MEMCOPY(tmpcolno, colno, newnz);\n    colno = tmpcolno;\n    if(newnz > 1)\n      sortREALByINT(row, (int *) colno, newnz, 0, TRUE);\n    if((newnz > 0) && ((colno[0] < 0) || (colno[newnz-1] > lendense))) {\n      FREE(colno);\n      newnz = 0;\n      return( FALSE );\n    }\n  }\n\n  /* Make sure we have enough matrix space */\n  i  = mat->row_end[rowno-1];\n  ii = mat->row_end[rowno];\n  delta1 = delta = count - (ii-i);\n  colnr1 = (newnz > 0 ? colno[0] : lendense+1);\n\n  /* Pack initial entries if existing row data has a lower column\n     start index than the first index of the new vector */\n  orignz = mat_nonzeros(mat);\n  j = (i >= orignz ? colnr1 : ROW_MAT_COLNR(i));\n\n  /* Index of the column-top insertion point for the first new value */\n  origidx = mat->col_end[colnr1-1];\n  colnr = (origidx >= orignz ? colnr1 : COL_MAT_COLNR(origidx));\n\n  if(j < colnr) {\n    origidx = newidx = mat->col_end[j-1];\n    for( ; j < colnr; j++) {\n      /* Shift entries in current column */\n      jj_j = mat->col_end[j];\n      for( ; origidx < jj_j; origidx++) {\n        if(COL_MAT_ROWNR(origidx) != rowno) {\n          if(newidx != origidx) {\n            COL_MAT_COPY(newidx, origidx);\n          }\n          newidx++;\n        }\n      }\n      /* Update next column start index */\n      mat->col_end[j] = newidx;\n    }\n    delta = newidx - origidx;  /* The first stage element shrinkage count */\n  }\n  else {\n    delta = 0;\n    newidx = origidx;\n  }\n\n  /* Make sure we have sufficient space for any additional entries and move existing data down;\n     this ensures that we only have to relocate matrix elements up in the next stage */\n  jj_j = MAX(0, (int) newnz + delta);\n\n  j = !((orignz == lendense) && (newnz == orignz) && (delta1 == 0)) && (jj_j > 0) && (orignz > origidx);\n\n  if ((j) && (jj_j > delta1))\n    delta1 = jj_j;\n\n  if((delta1 > 0) && (mat_nz_unused(mat) <= delta1) && !inc_mat_space(mat, delta1)) {\n    newnz = 0;\n    goto Done;\n  }\n\n  if(j) {\n    COL_MAT_MOVE(origidx+jj_j, origidx, orignz-origidx);\n    origidx += jj_j;\n    orignz += jj_j;\n  }\n\n  /* Start from the top of the first non-zero column of the new row */\n  newnz = 0;\n  j = origidx - mat->col_end[colnr1-1];\n  k = colnr1;  /* Last column for which col_end is valid/updated */\n  while((colnr1 <= lendense) || (origidx < orignz)) {\n\n    /* Get the column index of the active update item */\n    if(newnz < count)\n      colnr1 = colno[newnz];\n    else\n      colnr1 = lendense + 1;\n\n    /* Get coordinate of active existing matrix entries */\n    if(origidx < orignz) {\n      rownr = COL_MAT_ROWNR(origidx);\n      colnr = COL_MAT_COLNR(origidx);\n    }\n    else {\n      if(colnr1 > lendense)\n        break;\n      rownr = rowno;\n      colnr = lendense + 1;\n    }\n\n    /* Update column start position if we just crossed into a column */\n    jj_j = origidx - j;\n    i = MIN(colnr, colnr1);\n    for(; k < i; k++)\n      mat->col_end[k] = jj_j;\n\n    /* Test if there is an available new item ... */\n    if(colnr1 > colnr) {             /* If this is not the case */\n      /* DELETE if there is an existing value */\n      if(rownr == rowno) {\nForceDelete:\n        j++;\n        delta--;\n        origidx++;\n        continue;\n      }\n    }\n    else if((colnr > colnr1) ||                         /* Existing column index > new => INSERT */\n            ((colnr == colnr1) && (rownr >= rowno)) ) { /* Same column index, existing row >= target row => INSERT/REPLACE */\n\n      value = row[newnz];\n      newnz++;\n      if(isA && doscale)\n        value = scaled_mat(lp, value, rowno, colnr1);\n      if(isA)\n        value = my_chsign(is_chsign(lp, rowno), value);\n#ifdef DoMatrixRounding\n      value = roundToPrecision(value, mat->epsvalue);\n      if(value == 0) {\n        if((colnr > colnr1) || (rownr > rowno))\n        ;\n        else\n          goto ForceDelete;\n      }\n#endif\n      SET_MAT_ijA(jj_j, rowno, colnr1, value);\n\n      /* Adjust if we have inserted an element */\n      if((colnr > colnr1) || (rownr > rowno)) {\n        j--;\n        origidx--;\n        jj_j++;\n        delta++;\n      }\n      origidx++;\n      continue;\n    }\n\n    /* Shift the matrix element up by the active difference */\n    if(jj_j != origidx) {\n      COL_MAT_COPY(jj_j, origidx);\n    }\n    origidx++;\n  }\n\n  /* Update pending / incomplete column start position */\n  jj_j = origidx - j;\n  for(; k <= lendense; k++)\n    mat->col_end[k] = jj_j;\n  mat->row_end_valid = FALSE;\n\nDone:\n  if(!isNZ)\n    FREE(row);\n  FREE(colno);\n  return( (MYBOOL) (newnz > 0) );\n\n} /* mat_setrow */\n#endif\n\nSTATIC int mat_appendrow(MATrec *mat, int count, REAL *row, int *colno, REAL mult, MYBOOL checkrowmode)\n{\n  int    i, j, jj = 0, stcol, elmnr, orignr, newnr, firstcol;\n  MYBOOL *addto = NULL, isA, isNZ;\n  REAL   value, saved = 0;\n  lprec  *lp = mat->lp;\n\n  /* Check if we are in row order mode and should add as column instead;\n     the matrix will be transposed at a later stage */\n  if(checkrowmode && mat->is_roworder)\n    return( mat_appendcol(mat, count, row, colno, mult, FALSE) );\n\n  /* Do initialization and validation */\n  isA = (MYBOOL) (mat == lp->matA);\n  isNZ = (MYBOOL) (colno != NULL);\n  if(isNZ && (count > 0)) {\n    if(count > 1)\n      sortREALByINT(row, colno, count, 0, TRUE);\n    if((colno[0] < 1) || (colno[count-1] > mat->columns))\n      return( 0 );\n  }\n  /* else if((row != NULL) && !mat->is_roworder) */\n  else if(!isNZ && (row != NULL) && !mat->is_roworder)\n    row[0] = 0;\n\n  /* Capture OF definition in row mode */\n  if(isA && mat->is_roworder) {\n    if(isNZ && (colno[0] == 0)) {\n      value = row[0];\n#ifdef DoMatrixRounding\n      value = roundToPrecision(value, mat->epsvalue);\n#endif\n      value = scaled_mat(lp, value, 0, lp->columns);\n      value = my_chsign(is_maxim(lp), value);\n      lp->orig_obj[lp->columns] = value;\n      count--;\n      row++;\n      colno++;\n    }\n    else if(!isNZ && (row != NULL) && (row[0] != 0)) {\n      value = saved = row[0];\n#ifdef DoMatrixRounding\n      value = roundToPrecision(value, mat->epsvalue);\n#endif\n      value = scaled_mat(lp, value, 0, lp->columns);\n      value = my_chsign(is_maxim(lp), value);\n      lp->orig_obj[lp->columns] = value;\n      row[0] = 0;\n    }\n    else\n      lp->orig_obj[lp->columns] = 0;\n  }\n\n  /* Optionally tally and map the new non-zero values */\n  firstcol = mat->columns + 1;\n  if(isNZ) {\n    newnr = count;\n    if(newnr) {\n      firstcol = colno[0];\n      jj = colno[newnr - 1];\n    }\n  }\n  else {\n    newnr = 0;\n    if(row != NULL) {\n      if(!allocMYBOOL(lp, &addto, mat->columns + 1, TRUE)) {\n        return( newnr );\n      }\n      for(i = mat->columns; i >= 1; i--) {\n        if(fabs(row[i]) > mat->epsvalue) {\n          addto[i] = TRUE;\n          firstcol = i;\n          newnr++;\n        }\n      }\n    }\n  }\n\n  /* Make sure we have sufficient space */\n  if(!inc_mat_space(mat, newnr)) {\n    newnr = 0;\n    goto Done;\n  }\n\n  /* Insert the non-zero constraint values */\n  orignr = mat_nonzeros(mat) - 1;\n  elmnr = orignr + newnr;\n\n  for(j = mat->columns; j >= firstcol; j--) {\n    stcol = mat->col_end[j] - 1;\n    mat->col_end[j] = elmnr + 1;\n\n   /* Add a new non-zero entry */\n    if(((isNZ) && (j == jj)) || ((addto != NULL) && (addto[j]))) {\n      newnr--;\n      if(isNZ) {\n        value = row[newnr];\n        if(newnr)\n          jj = colno[newnr - 1];\n        else\n          jj = 0;\n      }\n      else\n        value = row[j];\n#ifdef DoMatrixRounding\n      value = roundToPrecision(value, mat->epsvalue);\n#endif\n      value *= mult;\n      if(isA) {\n        if(mat->is_roworder)\n          value = my_chsign(is_chsign(lp, j), value);\n        value = scaled_mat(lp, value, mat->rows, j);\n      }\n      SET_MAT_ijA(elmnr, mat->rows, j, value);\n      elmnr--;\n    }\n\n   /* Shift previous column entries down */\n    i = stcol - mat->col_end[j-1] + 1;\n    if(i > 0) {\n      orignr -= i;\n      elmnr  -= i;\n      COL_MAT_MOVE(elmnr+1, orignr+1, i);\n    }\n  }\n\nDone:\n  if(saved != 0)\n    row[0] = saved;\n  FREE(addto);\n\n  return( newnr );\n\n}\n\nSTATIC int mat_appendcol(MATrec *mat, int count, REAL *column, int *rowno, REAL mult, MYBOOL checkrowmode)\n{\n  int     i, row, elmnr, lastnr;\n  REAL    value;\n  MYBOOL  isA, isNZ;\n  lprec   *lp = mat->lp;\n\n  /* Check if we are in row order mode and should add as row instead;\n     the matrix will be transposed at a later stage */\n  if(checkrowmode && mat->is_roworder)\n    return( mat_appendrow(mat, count, column, rowno, mult, FALSE) );\n\n  /* Make sure we have enough space */\n/*\n  if(!inc_mat_space(mat, mat->rows+1))\n    return( 0 );\n*/\n  if(column == NULL)\n    i = 0;\n  else if(rowno != NULL)\n    i = count;\n  else {\n    int nrows = mat->rows;\n\n    elmnr = 0;\n    for(i = 1; i <= nrows; i++)\n      if(column[i] != 0)\n        elmnr++;\n    i = elmnr;\n  }\n  if((mat_nz_unused(mat) <= i) && !inc_mat_space(mat, i))\n    return( 0 );\n\n  /* Do initialization and validation */\n  isA = (MYBOOL) (mat == lp->matA);\n  isNZ = (MYBOOL) (column == NULL || rowno != NULL);\n  if(isNZ && (count > 0)) {\n    if(count > 1)\n      sortREALByINT(column, rowno, count, 0, TRUE);\n    if((rowno[0] < 0))\n      return( 0 );\n  }\n  if(rowno != NULL)\n    count--;\n\n  /* Append sparse regular constraint values */\n  elmnr = mat->col_end[mat->columns - 1];\n  if(column != NULL) {\n    row = -1;\n    for(i = ((isNZ || !mat->is_roworder) ? 0 : 1); i <= count ; i++) {\n      value = column[i];\n      if(fabs(value) > mat->epsvalue) {\n        if(isNZ) {\n          lastnr = row;\n          row = rowno[i];\n          /* Check if we have come to the Lagrangean constraints */\n          if(row > mat->rows)\n            break;\n          if(row <= lastnr)\n            return( -1 );\n        }\n        else\n          row = i;\n#ifdef DoMatrixRounding\n        value = roundToPrecision(value, mat->epsvalue);\n#endif\n        if(mat->is_roworder)\n          value *= mult;\n        else if(isA) {\n          value = my_chsign(is_chsign(lp, row), value);\n          value = scaled_mat(lp, value, row, mat->columns);\n          if(!mat->is_roworder && (row == 0)) {\n            lp->orig_obj[mat->columns] = value;\n            continue;\n          }\n        }\n\n       /* Store the item and update counters */\n        SET_MAT_ijA(elmnr, row, mat->columns, value);\n        elmnr++;\n      }\n    }\n\n   /* Fill dense Lagrangean constraints */\n    if(get_Lrows(lp) > 0)\n      mat_appendcol(lp->matL, get_Lrows(lp), column+mat->rows, NULL, mult, checkrowmode);\n\n  }\n\n /* Set end of data */\n  mat->col_end[mat->columns] = elmnr;\n\n  return( mat->col_end[mat->columns] - mat->col_end[mat->columns-1] );\n}\n\nSTATIC int mat_checkcounts(MATrec *mat, int *rownum, int *colnum, MYBOOL freeonexit)\n{\n  int i, j, n;\n  int *rownr;\n\n  if(rownum == NULL)\n    allocINT(mat->lp, &rownum, mat->rows + 1, TRUE);\n  if(colnum == NULL)\n    allocINT(mat->lp, &colnum, mat->columns + 1, TRUE);\n\n  for(i = 1 ; i <= mat->columns; i++) {\n    j = mat->col_end[i - 1];\n    n = mat->col_end[i];\n    rownr = &COL_MAT_ROWNR(j);\n    for(; j < n;\n        j++, rownr += matRowColStep) {\n      colnum[i]++;\n      rownum[*rownr]++;\n    }\n  }\n\n  n = 0;\n  if((mat->lp->do_presolve != PRESOLVE_NONE) &&\n     (mat->lp->spx_trace || (mat->lp->verbose > NORMAL))) {\n    for(j = 1; j <= mat->columns; j++)\n      if(colnum[j] == 0) {\n        n++;\n        report(mat->lp, FULL, \"mat_checkcounts: Variable %s is not used in any constraints\\n\",\n                              get_col_name(mat->lp, j));\n      }\n    for(i = 0; i <= mat->rows; i++)\n      if(rownum[i] == 0) {\n        n++;\n        report(mat->lp, FULL, \"mat_checkcounts: Constraint %s empty\\n\",\n                              get_row_name(mat->lp, i));\n      }\n  }\n\n  if(freeonexit) {\n    FREE(rownum);\n    FREE(colnum);\n  }\n\n  return( n );\n\n}\n\nSTATIC MYBOOL mat_validate(MATrec *mat)\n/* Routine to make sure that row mapping arrays are valid */\n{\n  int     i, j, je, *rownum;\n  int     *rownr, *colnr;\n\n  if(!mat->row_end_valid) {\n\n    MEMCLEAR(mat->row_end, mat->rows + 1);\n    allocINT(mat->lp, &rownum, mat->rows + 1, TRUE);\n\n    /* First tally row counts and then cumulate them */\n    j = mat_nonzeros(mat);\n    rownr = &COL_MAT_ROWNR(0);\n    for(i = 0; i < j; i++, rownr += matRowColStep)\n      mat->row_end[*rownr]++;\n    for(i = 1; i <= mat->rows; i++)\n      mat->row_end[i] += mat->row_end[i - 1];\n\n    /* Calculate the column index for every non-zero */\n    for(i = 1; i <= mat->columns; i++) {\n      j = mat->col_end[i - 1];\n      je = mat->col_end[i];\n      rownr = &COL_MAT_ROWNR(j);\n      colnr = &COL_MAT_COLNR(j);\n      for(; j < je; j++, rownr += matRowColStep, colnr += matRowColStep) {\n#ifdef Paranoia\n        if(/*(*colnr < 0) || (*colnr > mat->columns) || (Normally violated in primal phase 1) */\n           (*rownr < 0) || (*rownr > mat->rows)) {\n          report(mat->lp, SEVERE, \"mat_validate: Matrix value storage error row %d [0..%d], column %d [1..%d]\\n\",\n                                  *rownr, mat->rows, *colnr, mat->columns);\n          mat->lp->spx_status = UNKNOWNERROR;\n          return(FALSE);\n        }\n#endif\n        *colnr = i;\n        if(*rownr == 0)\n          mat_set_rowmap(mat, rownum[*rownr],\n                              *rownr, i, j);\n        else\n          mat_set_rowmap(mat, mat->row_end[*rownr - 1] + rownum[*rownr],\n                              *rownr, i, j);\n        rownum[*rownr]++;\n      }\n    }\n\n    FREE(rownum);\n    mat->row_end_valid = TRUE;\n  }\n\n  if(mat == mat->lp->matA)\n    mat->lp->model_is_valid = TRUE;\n  return( TRUE );\n}\n\nMYBOOL mat_get_data(lprec *lp, int matindex, MYBOOL isrow, int **rownr, int **colnr, REAL **value)\n{\n  MATrec *mat = lp->matA;\n\n#if MatrixRowAccess == RAM_Index\n  if(isrow)\n    matindex = mat->row_mat[matindex];\n  if(rownr != NULL)\n    *rownr = &COL_MAT_ROWNR(matindex);\n  if(colnr != NULL)\n    *colnr = &COL_MAT_COLNR(matindex);\n  if(value != NULL)\n    *value = &COL_MAT_VALUE(matindex);\n\n#else\n  if(isrow) {\n    if(rownr != NULL)\n      *rownr = &ROW_MAT_ROWNR(matindex);\n    if(colnr != NULL)\n      *colnr = &ROW_MAT_COLNR(matindex);\n    if(value != NULL)\n      *value = &ROW_MAT_VALUE(matindex);\n  }\n  else {\n    if(rownr != NULL)\n      *rownr = &COL_MAT_ROWNR(matindex);\n    if(colnr != NULL)\n      *colnr = &COL_MAT_COLNR(matindex);\n    if(value != NULL)\n      *value = &COL_MAT_VALUE(matindex);\n  }\n\n#endif\n\n  return( TRUE );\n}\n\n\nMYBOOL mat_set_rowmap(MATrec *mat, int row_mat_index, int rownr, int colnr, int col_mat_index)\n{\n#if MatrixRowAccess == RAM_Index\n  mat->row_mat[row_mat_index] = col_mat_index;\n\n#elif MatrixColAccess==CAM_Record\n  mat->row_mat[row_mat_index].rownr = rownr;\n  mat->row_mat[row_mat_index].colnr = colnr;\n  mat->row_mat[row_mat_index].value = COL_MAT_VALUE(col_mat_index);\n\n#else /* if MatrixColAccess==CAM_Vector */\n  mat->row_mat_rownr[row_mat_index] = rownr;\n  mat->row_mat_colnr[row_mat_index] = colnr;\n  mat->row_mat_value[row_mat_index] = COL_MAT_VALUE(col_mat_index);\n\n#endif\n\n  return( TRUE );\n}\n\n/* Implement combined binary/linear sub-search for matrix look-up */\nint mat_findelm(MATrec *mat, int row, int column)\n{\n  int low, high, mid, item;\n\n#if 0\n  if(mat->row_end_valid && (row > 0) &&\n     (ROW_MAT_COLNR(mat->row_mat[(low = mat->row_end[row-1])]) == column))\n    return(low);\n#endif\n\n  if((column < 1) || (column > mat->columns)) {\n    report(mat->lp, IMPORTANT, \"mat_findelm: Column %d out of range\\n\", column);\n    return( -1 );\n  }\n  if((row < 0) || (row > mat->rows)) {\n    report(mat->lp, IMPORTANT, \"mat_findelm: Row %d out of range\\n\", row);\n    return( -1 );\n  }\n\n  low = mat->col_end[column - 1];\n  high = mat->col_end[column] - 1;\n  if(low > high)\n    return( -2 );\n\n /* Do binary search logic */\n  mid = (low+high) / 2;\n  item = COL_MAT_ROWNR(mid);\n  while(high - low > LINEARSEARCH) {\n    if(item < row) {\n      low = mid + 1;\n      mid = (low+high) / 2;\n      item = COL_MAT_ROWNR(mid);\n    }\n    else if(item > row) {\n      high = mid - 1;\n      mid = (low+high) / 2;\n      item = COL_MAT_ROWNR(mid);\n    }\n    else {\n      low = mid;\n      high = mid;\n    }\n  }\n\n /* Do linear scan search logic */\n  if((high > low) && (high - low <= LINEARSEARCH)) {\n    item = COL_MAT_ROWNR(low);\n    while((low < high) && (item < row)) {\n      low++;\n      item = COL_MAT_ROWNR(low);\n    }\n    if(item == row)\n      high = low;\n  }\n\n  if((low == high) && (row == item))\n    return( low );\n  else\n    return( -2 );\n}\n\nint mat_findins(MATrec *mat, int row, int column, int *insertpos, MYBOOL validate)\n{\n  int low, high, mid, item, exitvalue, insvalue;\n\n#if 0\n  if(mat->row_end_valid && (row > 0) &&\n     (ROW_MAT_COLNR(mat->row_mat[(low = mat->row_end[row-1])]) == column)) {\n    insvalue = low;\n    exitvalue = low;\n    goto Done;\n  }\n#endif\n\n  insvalue = -1;\n\n  if((column < 1) || (column > mat->columns)) {\n    if((column > 0) && !validate) {\n      insvalue = mat->col_end[mat->columns];\n      exitvalue = -2;\n      goto Done;\n    }\n    report(mat->lp, IMPORTANT, \"mat_findins: Column %d out of range\\n\", column);\n    exitvalue = -1;\n    goto Done;\n  }\n  if((row < 0) || (row > mat->rows)) {\n    if((row >= 0) && !validate) {\n      insvalue = mat->col_end[column];\n      exitvalue = -2;\n      goto Done;\n    }\n    report(mat->lp, IMPORTANT, \"mat_findins: Row %d out of range\\n\", row);\n    exitvalue = -1;\n    goto Done;\n  }\n\n  low = mat->col_end[column - 1];\n  insvalue = low;\n  high = mat->col_end[column] - 1;\n  if(low > high) {\n    exitvalue = -2;\n    goto Done;\n  }\n\n /* Do binary search logic */\n  mid = (low+high) / 2;\n  item = COL_MAT_ROWNR(mid);\n  while(high - low > LINEARSEARCH) {\n    if(item < row) {\n      low = mid + 1;\n      mid = (low+high) / 2;\n      item = COL_MAT_ROWNR(mid);\n    }\n    else if(item > row) {\n      high = mid - 1;\n      mid = (low+high) / 2;\n      item = COL_MAT_ROWNR(mid);\n    }\n    else {\n      low = mid;\n      high = mid;\n    }\n  }\n\n /* Do linear scan search logic */\n  if((high > low) && (high - low <= LINEARSEARCH)) {\n    item = COL_MAT_ROWNR(low);\n    while((low < high) && (item < row)) {\n      low++;\n      item = COL_MAT_ROWNR(low);\n    }\n    if(item == row)\n      high = low;\n  }\n\n  insvalue = low;\n  if((low == high) && (row == item))\n    exitvalue = low;\n  else {\n    if((low < mat->col_end[column]) && (COL_MAT_ROWNR(low) < row))\n      insvalue++;\n    exitvalue = -2;\n  }\n\nDone:\n  if(insertpos != NULL)\n    (*insertpos) = insvalue;\n  return( exitvalue );\n}\n\nSTATIC REAL mat_getitem(MATrec *mat, int row, int column)\n{\n  int elmnr;\n\n#ifdef DirectOverrideOF\n  if((row == 0) && (mat == mat->lp->matA) && (mat->lp->OF_override != NULL))\n    return( mat->lp->OF_override[column] );\n  else\n#endif\n  {\n    elmnr = mat_findelm(mat, row, column);\n    if(elmnr >= 0)\n      return( COL_MAT_VALUE(elmnr) );\n    else\n      return( 0 );\n  }\n}\n\nSTATIC MYBOOL mat_additem(MATrec *mat, int row, int column, REAL delta)\n{\n  int elmnr;\n\n#ifdef DirectOverrideOF\n  if((row == 0) && (mat == mat->lp->matA) && (mat->lp->OF_override != NULL))\n    return( mat->lp->OF_override[column] );\n  else\n#endif\n  {\n    elmnr = mat_findelm(mat, row, column);\n    if(elmnr >= 0) {\n      COL_MAT_VALUE(elmnr) += delta;\n      return( TRUE );\n    }\n    else {\n      mat_setitem(mat, row, column, delta);\n      return( FALSE );\n    }\n  }\n}\n\nSTATIC MYBOOL mat_setitem(MATrec *mat, int row, int column, REAL value)\n{\n  return( mat_setvalue(mat, row, column, value, FALSE) );\n}\n\nSTATIC void mat_multrow(MATrec *mat, int row_nr, REAL mult)\n{\n  int i, k1, k2;\n\n#if 0\n  if(row_nr == 0) {\n    k2 = mat->col_end[0];\n    for(i = 1; i <= mat->columns; i++) {\n      k1 = k2;\n      k2 = mat->col_end[i];\n      if((k1 < k2) && (COL_MAT_ROWNR(k1) == row_nr))\n        COL_MAT_VALUE(k1) *= mult;\n    }\n  }\n  else if(mat_validate(mat)) {\n    if(row_nr == 0)\n      k1 = 0;\n    else\n#else\n  if(mat_validate(mat)) {\n    if(row_nr == 0)\n      k1 = 0;\n    else\n#endif\n    k1 = mat->row_end[row_nr-1];\n    k2 = mat->row_end[row_nr];\n    for(i = k1; i < k2; i++)\n      ROW_MAT_VALUE(i) *= mult;\n  }\n}\n\nSTATIC void mat_multcol(MATrec *mat, int col_nr, REAL mult, MYBOOL DoObj)\n{\n  int    i, ie;\n  MYBOOL isA;\n\n#ifdef Paranoia\n  if((col_nr < 1) || (col_nr > mat->columns)) {\n    report(mat->lp, IMPORTANT, \"mult_column: Column %d out of range\\n\", col_nr);\n    return;\n  }\n#endif\n  if(mult == 1.0)\n    return;\n\n  isA = (MYBOOL) (mat == mat->lp->matA);\n\n  ie = mat->col_end[col_nr];\n  for(i = mat->col_end[col_nr - 1]; i < ie; i++)\n    COL_MAT_VALUE(i) *= mult;\n  if(isA) {\n    if(DoObj)\n      mat->lp->orig_obj[col_nr] *= mult;\n    if(get_Lrows(mat->lp) > 0)\n      mat_multcol(mat->lp->matL, col_nr, mult, DoObj);\n  }\n}\n\nSTATIC void mat_multadd(MATrec *mat, REAL *lhsvector, int varnr, REAL mult)\n{\n  int               colnr;\n  register int      ib, ie, *matRownr;\n  register REAL     *matValue;\n\n  /* Handle case of a slack variable */\n  if(varnr <= mat->lp->rows) {\n    lhsvector[varnr] += mult;\n    return;\n  }\n\n  /* Do operation on the objective */\n  if(mat->lp->matA == mat)\n    lhsvector[0] += get_OF_active(mat->lp, varnr, mult);\n\n  /* Scan the constraint matrix target columns */\n  colnr = varnr - mat->lp->rows;\n  ib = mat->col_end[colnr - 1];\n  ie = mat->col_end[colnr];\n  if(ib < ie) {\n\n    /* Initialize pointers */\n    matRownr = &COL_MAT_ROWNR(ib);\n    matValue = &COL_MAT_VALUE(ib);\n\n    /* Then loop over all regular rows */\n    for(; ib < ie;\n        ib++, matValue += matValueStep, matRownr += matRowColStep) {\n      lhsvector[*matRownr] += mult * (*matValue);\n    }\n  }\n\n}\n\nSTATIC MYBOOL mat_setvalue(MATrec *mat, int Row, int Column, REAL Value, MYBOOL doscale)\n{\n  int    elmnr, lastelm, i, RowA = Row, ColumnA = Column;\n  MYBOOL isA;\n\n  /* This function is inefficient if used to add new matrix entries in\n     other places than at the end of the matrix. OK for replacing existing\n     a non-zero value with another non-zero value */\n  isA = (MYBOOL) (mat == mat->lp->matA);\n  if(mat->is_roworder)\n    swapINT(&Row, &Column);\n\n  /* Set small numbers to zero */\n  if(fabs(Value) < mat->epsvalue)\n    Value = 0;\n#ifdef DoMatrixRounding\n  else\n    Value = roundToPrecision(Value, mat->epsvalue);\n#endif\n\n  /* Check if we need to update column space */\n  if(Column > mat->columns) {\n    if(isA)\n      inc_col_space(mat->lp, ColumnA - mat->columns);\n    else\n      inc_matcol_space(mat, Column - mat->columns);\n  }\n\n  /* Find out if we already have such an entry, or return insertion point */\n  i = mat_findins(mat, Row, Column, &elmnr, FALSE);\n  if(i == -1)\n    return(FALSE);\n\n  if(isA)\n    set_action(&mat->lp->spx_action, ACTION_REBASE | ACTION_RECOMPUTE | ACTION_REINVERT);\n\n  if(i >= 0) {\n    /* there is an existing entry */\n    if(fabs(Value) > mat->epsvalue) { /* we replace it by something non-zero */\n      if(isA) {\n        Value = my_chsign(is_chsign(mat->lp, RowA), Value);\n        if(doscale && mat->lp->scaling_used)\n          Value = scaled_mat(mat->lp, Value, RowA, ColumnA);\n      }\n      COL_MAT_VALUE(elmnr) = Value;\n    }\n    else { /* setting existing non-zero entry to zero. Remove the entry */\n      /* This might remove an entire column, or leave just a bound. No\n          nice solution for that yet */\n\n      /* Shift up tail end of the matrix */\n      lastelm = mat_nonzeros(mat);\n#if 0\n      for(i = elmnr; i < lastelm ; i++) {\n        COL_MAT_COPY(i, i + 1);\n      }\n#else\n      lastelm -= elmnr;\n      COL_MAT_MOVE(elmnr, elmnr + 1, lastelm);\n#endif\n      for(i = Column; i <= mat->columns; i++)\n        mat->col_end[i]--;\n\n      mat->row_end_valid = FALSE;\n    }\n  }\n  else if(fabs(Value) > mat->epsvalue) {\n    /* no existing entry. make new one only if not nearly zero */\n    /* check if more space is needed for matrix */\n    if(!inc_mat_space(mat, 1))\n      return(FALSE);\n\n    if(Column > mat->columns) {\n      i = mat->columns + 1;\n      if(isA)\n        shift_coldata(mat->lp, i, ColumnA - mat->columns, NULL);\n      else\n        mat_shiftcols(mat, &i, Column - mat->columns, NULL);\n    }\n\n    /* Shift down tail end of the matrix by one */\n    lastelm = mat_nonzeros(mat);\n#if 1 /* Does compiler optimization work better here? */\n    for(i = lastelm; i > elmnr ; i--) {\n      COL_MAT_COPY(i, i - 1);\n    }\n#else\n    lastelm -= elmnr - 1;\n    COL_MAT_MOVE(elmnr + 1, elmnr, lastelm);\n#endif\n\n    /* Set new element */\n    if(isA) {\n      Value = my_chsign(is_chsign(mat->lp, RowA), Value);\n      if(doscale)\n        Value = scaled_mat(mat->lp, Value, RowA, ColumnA);\n    }\n    SET_MAT_ijA(elmnr, Row, Column, Value);\n\n    /* Update column indexes */\n    for(i = Column; i <= mat->columns; i++)\n      mat->col_end[i]++;\n\n    mat->row_end_valid = FALSE;\n  }\n\n  if(isA && (mat->lp->var_is_free != NULL) && (mat->lp->var_is_free[ColumnA] > 0))\n    return( mat_setvalue(mat, RowA, mat->lp->var_is_free[ColumnA], -Value, doscale) );\n  return(TRUE);\n}\n\nSTATIC MYBOOL mat_appendvalue(MATrec *mat, int Row, REAL Value)\n{\n  int *elmnr, Column = mat->columns;\n\n  /* Set small numbers to zero */\n  if(fabs(Value) < mat->epsvalue)\n    Value = 0;\n#ifdef DoMatrixRounding\n  else\n    Value = roundToPrecision(Value, mat->epsvalue);\n#endif\n\n  /* Check if more space is needed for matrix */\n  if(!inc_mat_space(mat, 1))\n    return(FALSE);\n\n#ifdef Paranoia\n  /* Check valid indeces */\n  if((Row < 0) || (Row > mat->rows)) {\n    report(mat->lp, SEVERE, \"mat_appendvalue: Invalid row index %d specified\\n\", Row);\n    return(FALSE);\n  }\n#endif\n\n  /* Get insertion point and set value */\n  elmnr = mat->col_end + Column;\n  SET_MAT_ijA((*elmnr), Row, Column, Value);\n\n  /* Update column count */\n  (*elmnr)++;\n  mat->row_end_valid = FALSE;\n\n  return(TRUE);\n}\n\nSTATIC MYBOOL mat_equalRows(MATrec *mat, int baserow, int comprow)\n{\n  MYBOOL status = FALSE;\n\n  if(mat_validate(mat)) {\n    int bj1 = 0, ej1, bj2 = 0, ej2;\n\n    /* Get starting and ending positions */\n    if(baserow >= 0)\n      bj1 = mat->row_end[baserow-1];\n    ej1 = mat->row_end[baserow];\n    if(comprow >= 0)\n      bj2 = mat->row_end[comprow-1];\n    ej2 = mat->row_end[comprow];\n    /* Fail if row lengths are unequal */\n    if((ej1-bj1) != (ej2-bj2))\n      return( status );\n\n    /* Compare column index and value, element by element */\n    for(; bj1 < ej1; bj1++, bj2++) {\n      if(COL_MAT_COLNR(bj1) != COL_MAT_COLNR(bj2))\n        break;\n#if 1\n      if(fabs(get_mat_byindex(mat->lp, bj1, TRUE, FALSE)-get_mat_byindex(mat->lp, bj2, TRUE, FALSE)) > mat->lp->epsprimal)\n#else\n      if(fabs(COL_MAT_VALUE(bj1)-COL_MAT_VALUE(bj2)) > mat->lp->epsprimal)\n#endif\n        break;\n    }\n    status = (MYBOOL) (bj1 == ej1);\n  }\n  return( status );\n}\n\nSTATIC int mat_findcolumn(MATrec *mat, int matindex)\n{\n  int j;\n\n  for(j = 1; j <= mat->columns; j++) {\n    if(matindex < mat->col_end[j])\n      break;\n  }\n  return(j);\n}\n\nSTATIC int mat_expandcolumn(MATrec *mat, int colnr, REAL *column, int *nzlist, MYBOOL signedA)\n{\n  MYBOOL  isA = (MYBOOL) (mat->lp->matA == mat);\n  int     i, ie, j, nzcount = 0;\n  REAL    *matValue;\n  int     *matRownr;\n\n  signedA &= isA;\n\n  /* Retrieve a column from the user data matrix A */\n  MEMCLEAR(column, mat->rows + 1);\n  if(isA) {\n    column[0] = mat->lp->orig_obj[colnr];\n    if(signedA && is_chsign(mat->lp, 0))\n      column[0] = -column[0];\n  }\n\n  i = mat->col_end[colnr - 1];\n  ie = mat->col_end[colnr];\n  matRownr = &COL_MAT_ROWNR(i);\n  matValue = &COL_MAT_VALUE(i);\n  for(; i < ie;\n      i++, matRownr += matRowColStep, matValue += matValueStep) {\n    j = *matRownr;\n    column[j] = *matValue;\n    if(signedA && is_chsign(mat->lp, j))\n      column[j] = -column[j];\n    nzcount++;\n    if(nzlist != NULL)\n      nzlist[nzcount] = j;\n  }\n  if(nzlist != NULL)\n    nzlist[0] = nzcount;\n  return( nzcount );\n}\n\nSTATIC MYBOOL mat_computemax(MATrec *mat)\n{\n  int  *rownr = &COL_MAT_ROWNR(0),\n       *colnr = &COL_MAT_COLNR(0),\n       i = 0, ie = mat->col_end[mat->columns], ez = 0;\n  REAL *value = &COL_MAT_VALUE(0), epsmachine = mat->lp->epsmachine, absvalue;\n\n  /* Prepare arrays */\n  if(!allocREAL(mat->lp, &mat->colmax, mat->columns_alloc+1, AUTOMATIC) ||\n     !allocREAL(mat->lp, &mat->rowmax, mat->rows_alloc+1, AUTOMATIC))\n     return( FALSE );\n  MEMCLEAR(mat->colmax, mat->columns+1);\n  MEMCLEAR(mat->rowmax, mat->rows+1);\n\n  /* Obtain the row and column maxima in one sweep */\n  mat->dynrange = mat->lp->infinite;\n  for(; i < ie;\n      i++, rownr += matRowColStep, colnr += matRowColStep, value += matValueStep) {\n    absvalue = fabs(*value);\n    SETMAX(mat->colmax[*colnr], absvalue);\n    SETMAX(mat->rowmax[*rownr], absvalue);\n    SETMIN(mat->dynrange, absvalue);\n    if(absvalue < epsmachine)\n      ez++;\n  }\n\n  /* Lastly, compute the global maximum and get the dynamic range */\n  for(i = 1; i <= mat->rows; i++)\n    SETMAX(mat->rowmax[0], mat->rowmax[i]);\n  mat->infnorm = mat->colmax[0] = mat->rowmax[0];\n  if(mat->dynrange == 0) {\n    report(mat->lp, SEVERE, \"%d matrix contains zero-valued coefficients.\\n\", ez);\n    mat->dynrange = mat->lp->infinite;\n  }\n  else {\n    mat->dynrange = mat->infnorm / mat->dynrange;\n    if(ez > 0)\n      report(mat->lp, IMPORTANT, \"%d matrix coefficients below machine precision were found.\\n\", ez);\n  }\n\n  return( TRUE );\n}\n\nSTATIC MYBOOL mat_transpose(MATrec *mat)\n{\n  int     i, j, nz, k;\n  MYBOOL  status;\n\n  status = mat_validate(mat);\n  if(status) {\n\n    /* Create a column-ordered sparse element list; \"column\" index must be shifted */\n    nz = mat_nonzeros(mat);\n    if(nz > 0) {\n#if MatrixColAccess==CAM_Record\n      MATitem *newmat;\n      newmat = (MATitem *) malloc((mat->mat_alloc) * sizeof(*(mat->col_mat)));\n      j = mat->row_end[0];\n      for(i = nz-1; i >= j ; i--) {\n        k = i-j;\n        newmat[k] = mat->col_mat[mat->row_mat[i]];\n        newmat[k].row_nr = newmat[k].col_nr;\n      }\n      for(i = j-1; i >= 0 ; i--) {\n        k = nz-j+i;\n        newmat[k] = mat->col_mat[mat->row_mat[i]];\n        newmat[k].row_nr = newmat[k].col_nr;\n      }\n      swapPTR((void **) &mat->col_mat, (void **) &newmat);\n      FREE(newmat);\n#else /*if MatrixColAccess==CAM_Vector*/\n      REAL *newValue = NULL;\n      int  *newRownr = NULL;\n      allocREAL(mat->lp, &newValue, mat->mat_alloc, FALSE);\n      allocINT(mat->lp, &newRownr, mat->mat_alloc, FALSE);\n\n      j = mat->row_end[0];\n      for(i = nz-1; i >= j ; i--) {\n        k = i-j;\n        newValue[k] = ROW_MAT_VALUE(i);\n        newRownr[k] = ROW_MAT_COLNR(i);\n      }\n      for(i = j-1; i >= 0 ; i--) {\n        k = nz-j+i;\n        newValue[k] = ROW_MAT_VALUE(i);\n        newRownr[k] = ROW_MAT_COLNR(i);\n      }\n\n      swapPTR((void **) &mat->col_mat_rownr, (void **) &newRownr);\n      swapPTR((void **) &mat->col_mat_value, (void **) &newValue);\n      FREE(newValue);\n      FREE(newRownr);\n#endif\n    }\n\n    /* Transfer row start to column start position; must adjust for different offsets */\n    if(mat->rows == mat->rows_alloc)\n      inc_matcol_space(mat, 1);\n    j = mat->row_end[0];\n    for(i = mat->rows; i >= 1; i--)\n      mat->row_end[i] -= j;\n    mat->row_end[mat->rows] = nz;\n    swapPTR((void **) &mat->row_end, (void **) &mat->col_end);\n\n    /* Swap arrays of maximum values */\n    swapPTR((void **) &mat->rowmax, (void **) &mat->colmax);\n\n    /* Swap array sizes */\n    swapINT(&mat->rows, &mat->columns);\n    swapINT(&mat->rows_alloc, &mat->columns_alloc);\n\n    /* Finally set current storage mode */\n    mat->is_roworder = (MYBOOL) !mat->is_roworder;\n    mat->row_end_valid = FALSE;\n  }\n  return(status);\n}\n\n\n/* ---------------------------------------------------------------------------------- */\n/* Change-tracking routines                                                           */\n/* ---------------------------------------------------------------------------------- */\nSTATIC DeltaVrec *createUndoLadder(lprec *lp, int levelitems, int maxlevels)\n{\n  DeltaVrec *hold;\n\n  hold = (DeltaVrec *) malloc(sizeof(*hold));\n  hold->lp = lp;\n  hold->activelevel = 0;\n  hold->tracker = mat_create(lp, levelitems, 0, 0.0);\n  inc_matcol_space(hold->tracker, maxlevels);\n  return( hold );\n}\nSTATIC int incrementUndoLadder(DeltaVrec *DV)\n{\n  DV->activelevel++;\n  inc_matcol_space(DV->tracker, 1);\n  mat_shiftcols(DV->tracker, &(DV->activelevel), 1, NULL);\n  DV->tracker->columns++;\n  return(DV->activelevel);\n}\nSTATIC MYBOOL modifyUndoLadder(DeltaVrec *DV, int itemno, REAL target[], REAL newvalue)\n{\n  MYBOOL status;\n  int    varindex = itemno;\n  REAL   oldvalue = target[itemno];\n\n#ifndef UseMilpSlacksRCF  /* Check if we should include ranged constraints */\n  varindex -= DV->lp->rows;\n#endif\n  status = mat_appendvalue(DV->tracker, varindex, oldvalue);\n  target[itemno] = newvalue;\n  return(status);\n}\nSTATIC int countsUndoLadder(DeltaVrec *DV)\n{\n  if(DV->activelevel > 0)\n    return( mat_collength(DV->tracker, DV->activelevel) );\n  else\n    return( 0 );\n}\nSTATIC int restoreUndoLadder(DeltaVrec *DV, REAL target[])\n{\n  int iD = 0;\n\n  if(DV->activelevel > 0) {\n    MATrec *mat = DV->tracker;\n    int    iB = mat->col_end[DV->activelevel-1],\n           iE = mat->col_end[DV->activelevel],\n           *matRownr = &COL_MAT_ROWNR(iB);\n    REAL   *matValue = &COL_MAT_VALUE(iB),\n           oldvalue;\n\n    /* Restore the values */\n    iD = iE-iB;\n    for(; iB < iE; iB++, matValue += matValueStep, matRownr += matRowColStep) {\n      oldvalue = *matValue;\n#ifdef UseMilpSlacksRCF  /* Check if we should include ranged constraints */\n      target[(*matRownr)] = oldvalue;\n#else\n      target[DV->lp->rows+(*matRownr)] = oldvalue;\n#endif\n    }\n\n    /* Get rid of the changes */\n    mat_shiftcols(DV->tracker, &(DV->activelevel), -1, NULL);\n  }\n\n  return(iD);\n}\nSTATIC int decrementUndoLadder(DeltaVrec *DV)\n{\n  int deleted = 0;\n\n  if(DV->activelevel > 0) {\n    deleted = mat_shiftcols(DV->tracker, &(DV->activelevel), -1, NULL);\n    DV->activelevel--;\n    DV->tracker->columns--;\n  }\n  return(deleted);\n}\nSTATIC MYBOOL freeUndoLadder(DeltaVrec **DV)\n{\n  if((DV == NULL) || (*DV == NULL))\n    return(FALSE);\n\n  mat_free(&((*DV)->tracker));\n  FREE(*DV);\n  return(TRUE);\n}\n\nSTATIC MYBOOL appendUndoPresolve(lprec *lp, MYBOOL isprimal, REAL beta, int colnrDep)\n{\n  MATrec *mat;\n\n  /* Point to correct undo structure */\n  if(isprimal)\n    mat = lp->presolve_undo->primalundo->tracker;\n  else\n    mat = lp->presolve_undo->dualundo->tracker;\n\n  /* Append the data */\n  if((colnrDep > 0) && (beta != 0) &&\n     (mat != NULL) && (mat->col_tag[0] > 0)) {\n    int ix = mat->col_tag[0];\n#if 0\n    report(lp, NORMAL, \"appendUndoPresolve: %s %g * x%d\\n\",\n                       ( beta < 0 ? \"-\" : \"+\"), fabs(beta), colnrDep);\n#endif\n\n    /* Do normal user variable case */\n    if(colnrDep <= lp->columns)\n      mat_setvalue(mat, colnrDep, ix, beta, FALSE);\n\n    /* Handle case where a slack variable is referenced */\n    else {\n      int ipos, jx = mat->col_tag[ix];\n      mat_setvalue(mat, jx, ix, beta, FALSE);\n      jx = mat_findins(mat, jx, ix, &ipos, FALSE);\n      COL_MAT_ROWNR(ipos) = colnrDep;\n    }\n    return( TRUE );\n  }\n  else\n    return( FALSE );\n}\nSTATIC MYBOOL addUndoPresolve(lprec *lp, MYBOOL isprimal, int colnrElim, REAL alpha, REAL beta, int colnrDep)\n{\n  int       ix;\n  DeltaVrec **DV;\n  MATrec    *mat;\n  presolveundorec *psdata = lp->presolve_undo;\n\n  /* Point to and initialize undo structure at first call */\n  if(isprimal) {\n    DV = &(psdata->primalundo);\n    if(*DV == NULL) {\n      *DV = createUndoLadder(lp, lp->columns+1, lp->columns);\n      mat = (*DV)->tracker;\n      mat->epsvalue = lp->matA->epsvalue;\n      allocINT(lp, &(mat->col_tag), lp->columns+1, FALSE);\n      mat->col_tag[0] = 0;\n    }\n  }\n  else {\n    DV = &(psdata->dualundo);\n    if(*DV == NULL) {\n      *DV = createUndoLadder(lp, lp->rows+1, lp->rows);\n      mat = (*DV)->tracker;\n      mat->epsvalue = lp->matA->epsvalue;\n      allocINT(lp, &(mat->col_tag), lp->rows+1, FALSE);\n      mat->col_tag[0] = 0;\n    }\n  }\n  mat = (*DV)->tracker;\n#if 0\n  report(lp, NORMAL, \"addUndoPresolve: x%d = %g %s %g * x%d\\n\",\n                     colnrElim, alpha, ( beta < 0 ? \"-\" : \"+\"), fabs(beta), colnrDep);\n#endif\n  /* Add the data */\n  ix = mat->col_tag[0] = incrementUndoLadder(*DV);\n  mat->col_tag[ix] = colnrElim;\n  if(alpha != 0)\n    mat_setvalue(mat, 0, ix, alpha, FALSE);\n/*    mat_appendvalue(*mat, 0, alpha);*/\n  if((colnrDep > 0) && (beta != 0)) {\n    if(colnrDep > lp->columns)\n      return( appendUndoPresolve(lp, isprimal, beta, colnrDep) );\n    else\n      mat_setvalue(mat, colnrDep, ix, beta, FALSE);\n  }\n\n  return( TRUE );\n}\n\n\n\n/* ---------------------------------------------------------------------------------- */\n/* High level matrix inverse and product routines in lp_solve                         */\n/* ---------------------------------------------------------------------------------- */\n\n/* ---------------------------------------------------------------------------------- */\n/*    A brief description of the basis inverse and factorization logic in lp_solve    */\n/* ---------------------------------------------------------------------------------- */\n/*\n\n   In order to better understand the legacy code for operating with the\n   basis and its factorization in lp_solve I (KE) will briefly explain\n   the conventions and associated matrix algebra.  Note that with lp_solve\n   version 5.5, it is also possible to direct lp_solve to use the traditional\n   (textbook) format by setting the obj_in_B parameter to FALSE.\n\n   The matrix description of a linear program (as represented by lp_solve) goes\n   like this:\n\n           maximize         c'x\n           subject to  r <=  Ax <= b\n           where       l <=   x <= u\n\n   The matrix A is partitioned into two column sets [B|N], where B is\n   a square matrix of \"basis\" variables containing non-fixed\n   variables of the linear program at any given stage and N is the\n   submatrix of corresponding non-basic, fixed variables. The\n   variables (columns) in N may be fixed at their lower or upper levels.\n\n   Similarly, the c vector is partitioned into the basic and non-basic\n   parts [z|n].\n\n   While lp_solve stores the objective vector c in a dense format, and\n   the constraint matrix A in a (fairly standard) sparse format, the\n   column vectors passed to the factorization routine include the\n   objective coefficient at row index 0.  (In versions of lp_solve\n   before v5.2, c was actually explicitly stored as the 0-th row of A).\n   The expanded matrix may be called the \"A~\" form and looks like this:\n\n                       A~ = [ c ]\n                            [ A ]\n\n   Linear programming involves solving linear equations based on the\n   square basis matrix B, which includes is a subset of columns from A~.\n   The implications of the common storage of c and A (e.g. A~) vs. the\n   inverse / factorization of B for the operations and updates performed\n   by the simplex routine therefore needs to be understood.  As a consquence\n   of A~, in lp_solve B is stored in an expanded, bordered format using the\n   following (non-singular) representation:\n\n                       B~ = [ 1 z ]\n                            [ 0 B ]\n\n   Any basis inversion / factorization engine used by lp_solve must therefore\n   explicitly represent and handle the implications of this structure for\n   associated matrix operations.\n\n   The standard matrix formula for computing the inverse of a bordered\n   matrix shows what the inversion of B~ actually produces:\n\n                  Inv(B~) = [ 1 -z*Inv(B) ]\n                            [ 0   Inv(B)  ]\n\n   The A~ and B~ representations require awareness by the developer of the side\n   effects of the presence of the top row when doing product operations such as\n   b'N, btran and ftran.  Note in particular z*Inv(B) in the top row of Inv(B~),\n   which is actually the dual solution vector of the given basis.  This fact\n   makes a very common update in the simplex algorithm (reduced costs) returnable\n   as a vector simply by setting 1 at the top of a vector being pre-multiplied\n   with Inv(B~).\n\n   However, if the objective vector (c) is changed, the expanded representation\n   requires that B / B~ be refactorized.  Also, when doing FTRAN, BTRAN\n   and x'A-type operations, you will patently get the incorrect result\n   if you simply copy the operations given in textbooks.  First I'll show the\n   results of an FTRAN operation:\n\n                   Bx = a  ==>  x = FTRAN(a)\n\n   In lp_solve, this operation solves:\n\n                   [ 1 z ] [y] = [d]\n                   [ 0 B ] [x]   [a]\n\n   Using the Inv(B~) expression earlier, the FTRAN result is therefore:\n\n             [y] = [ 1 -z*Inv(B) ] [d] = [ d - z*Inv(B)*a ]\n             [x]   [ 0   Inv(B)  ] [a]   [   Inv(B)*a     ]\n\n   As an example, the value of the dual objective can be returned at the\n   0-th index by passing the active RHS vector with 0 at the 0-th position.\n\n   Similarily, doing the left solve - performing the BTRAN calculation:\n\n                   [x y] [ 1 z ] = [d a']\n                         [ 0 B ]\n\n   ... will produce the following result in lp_solve:\n\n   [x y] = [d a'] [ 1 -z*Inv(B) ] = [ d | -d*z*Inv(B) + a'*Inv(B) ]\n                  [ 0   Inv(B)  ]\n\n   So, if you thought you were simply computing \"a'*Inv(B)\", look again.\n   In order to produce the desired result, you have to set d to 0 before\n   the BTRAN operation.  On the other hand, if you set d to 1 and a to 0,\n   then you are very conveniently on your way to obtain the reduced costs\n   (needs a further matrix premultiplication with non-basic variables).\n\n   Incidentally, the BTRAN with [1 0] that yields [ 1 | -z*Inv(B) ] can\n   also be used as a fast way of checking the accuracy of the current\n   factorization.\n\n   Equipped with this understanding, I hope that you see that\n   the approach in lp_solve is actually pretty convenient.  It also\n   becomes easier to extend functionality in lp_solve by drawing on\n   formulas and expressions from LP literature that otherwise assume\n   the non-bordered syntax and representation.\n\n                                     Kjell Eikland -- November 2003\n                                     KE update     -- April 2005\n                                     KE update     -- June 2005\n\n*/\n\nSTATIC MYBOOL __WINAPI invert(lprec *lp, MYBOOL shiftbounds, MYBOOL final)\n{\n  MYBOOL *usedpos, resetbasis;\n  REAL   test;\n  int    k, i, j;\n  int    singularities, usercolB;\n\n /* Make sure the tags are correct */\n  if(!mat_validate(lp->matA)) {\n    lp->spx_status = INFEASIBLE;\n    return(FALSE);\n  }\n\n /* Create the inverse management object at the first call to invert() */\n  if(lp->invB == NULL)\n    lp->bfp_init(lp, lp->rows, 0, NULL);\n  else\n    lp->bfp_preparefactorization(lp);\n  singularities = 0;\n\n /* Must save spx_status since it is used to carry information about\n    the presence and handling of singular columns in the matrix */\n  if(userabort(lp, MSG_INVERT))\n    return(FALSE);\n\n#ifdef Paranoia\n  if(lp->spx_trace)\n    report(lp, DETAILED, \"invert: Iter %10g, fact-length %7d, OF \" RESULTVALUEMASK \".\\n\",\n                         (double) get_total_iter(lp), lp->bfp_colcount(lp), (double) -lp->rhs[0]);\n#endif\n\n /* Store state of pre-existing basis, and at the same time check if\n    the basis is I; in this case take the easy way out */\n  if(!allocMYBOOL(lp, &usedpos, lp->sum + 1, TRUE)) {\n    lp->bb_break = TRUE;\n    return(FALSE);\n  }\n  usedpos[0] = TRUE;\n  usercolB = 0;\n  for(i = 1; i <= lp->rows; i++) {\n    k = lp->var_basic[i];\n    if(k > lp->rows)\n      usercolB++;\n    usedpos[k] = TRUE;\n  }\n#ifdef Paranoia\n  if(!verify_basis(lp))\n    report(lp, SEVERE, \"invert: Invalid basis detected (iter %g).\\n\",\n                       (double) get_total_iter(lp));\n#endif\n\n /* Tally matrix nz-counts and check if we should reset basis\n    indicators to all slacks */\n  resetbasis = (MYBOOL) ((usercolB > 0) && lp->bfp_canresetbasis(lp));\n  k = 0;\n  for(i = 1; i <= lp->rows; i++) {\n    if(lp->var_basic[i] > lp->rows)\n      k += mat_collength(lp->matA, lp->var_basic[i] - lp->rows) + (is_OF_nz(lp,lp->var_basic[i] - lp->rows) ? 1 : 0);\n    if(resetbasis) {\n      j = lp->var_basic[i];\n      if(j > lp->rows)\n        lp->is_basic[j] = FALSE;\n      lp->var_basic[i] = i;\n      lp->is_basic[i] = TRUE;\n    }\n  }\n\n /* Now do the refactorization */\n  singularities = lp->bfp_factorize(lp, usercolB, k, usedpos, final);\n\n /* Do user reporting */\n  if(userabort(lp, MSG_INVERT))\n    goto Cleanup;\n\n /* Finalize factorization/inversion */\n  lp->bfp_finishfactorization(lp);\n\n  /* Recompute the RHS ( Ref. lp_solve inverse logic and Chvatal p. 121 ) */\n#ifdef DebugInv\n  blockWriteLREAL(stdout, \"RHS-values pre invert\", lp->rhs, 0, lp->rows);\n#endif\n  recompute_solution(lp, shiftbounds);\n  restartPricer(lp, AUTOMATIC);\n#ifdef DebugInv\n  blockWriteLREAL(stdout, \"RHS-values post invert\", lp->rhs, 0, lp->rows);\n#endif\n\nCleanup:\n  /* Check for numerical instability indicated by frequent refactorizations */\n  test = get_refactfrequency(lp, FALSE);\n  if(test < MIN_REFACTFREQUENCY) {\n    test = get_refactfrequency(lp, TRUE);\n    report(lp, NORMAL, \"invert: Refactorization frequency %.1g indicates numeric instability.\\n\",\n                       test);\n    lp->spx_status = NUMFAILURE;\n  }\n\n  FREE(usedpos);\n  return((MYBOOL) (singularities <= 0));\n} /* invert */\n\n\nSTATIC MYBOOL fimprove(lprec *lp, REAL *pcol, int *nzidx, REAL roundzero)\n{\n  REAL   *errors, sdp;\n  int    j;\n  MYBOOL Ok = TRUE;\n\n  allocREAL(lp, &errors, lp->rows + 1, FALSE);\n  if(errors == NULL) {\n    Ok = FALSE;\n    return(Ok);\n  }\n  MEMCOPY(errors, pcol, lp->rows + 1);\n  lp->bfp_ftran_normal(lp, pcol, nzidx);\n  prod_Ax(lp, NULL, pcol, NULL, 0.0, -1,\n                                errors, NULL, MAT_ROUNDDEFAULT);\n  lp->bfp_ftran_normal(lp, errors, NULL);\n\n  sdp = 0;\n  for(j = 1; j <= lp->rows; j++)\n    if(fabs(errors[j])>sdp)\n      sdp = fabs(errors[j]);\n  if(sdp > lp->epsmachine) {\n    report(lp, DETAILED, \"Iterative FTRAN correction metric %g\", sdp);\n    for(j = 1; j <= lp->rows; j++) {\n      pcol[j] += errors[j];\n      my_roundzero(pcol[j], roundzero);\n    }\n  }\n  FREE(errors);\n  return(Ok);\n}\n\nSTATIC MYBOOL bimprove(lprec *lp, REAL *rhsvector, int *nzidx, REAL roundzero)\n{\n  int    j;\n  REAL   *errors, err, maxerr;\n  MYBOOL Ok = TRUE;\n\n  allocREAL(lp, &errors, lp->sum + 1, FALSE);\n  if(errors == NULL) {\n    Ok = FALSE;\n    return(Ok);\n  }\n  MEMCOPY(errors, rhsvector, lp->sum + 1);\n\n  /* Solve Ax=b for x, compute b back */\n  lp->bfp_btran_normal(lp, errors, nzidx);\n  prod_xA(lp, NULL, errors, NULL, 0.0, 1.0,\n                                  errors, NULL,\n                                  MAT_ROUNDDEFAULT);\n\n  /* Take difference with ingoing values, while shifting the column values\n     to the rows section and zeroing the columns again */\n  for(j = 1; j <= lp->rows; j++)\n    errors[j] = errors[lp->rows+lp->var_basic[j]] - rhsvector[j];\n  for(j = lp->rows; j <= lp->sum; j++)\n    errors[j] = 0;\n\n  /* Solve the b errors for the iterative x adjustment */\n  lp->bfp_btran_normal(lp, errors, NULL);\n\n  /* Generate the adjustments and compute statistic */\n  maxerr = 0;\n  for(j = 1; j <= lp->rows; j++) {\n    if(lp->var_basic[j]<=lp->rows) continue;\n    err = errors[lp->rows+lp->var_basic[j]];\n    if(fabs(err)>maxerr)\n      maxerr = fabs(err);\n  }\n  if(maxerr > lp->epsmachine) {\n    report(lp, DETAILED, \"Iterative BTRAN correction metric %g\", maxerr);\n    for(j = 1; j <= lp->rows; j++) {\n      if(lp->var_basic[j]<=lp->rows) continue;\n      rhsvector[j] += errors[lp->rows+lp->var_basic[j]];\n      my_roundzero(rhsvector[j], roundzero);\n    }\n  }\n  FREE(errors);\n  return(Ok);\n}\n\nSTATIC void ftran(lprec *lp, REAL *rhsvector, int *nzidx, REAL roundzero)\n{\n#if 0\n  if(is_action(lp->improve, IMPROVE_SOLUTION) && lp->bfp_pivotcount(lp))\n    fimprove(lp, rhsvector, nzidx, roundzero);\n  else\n#endif\n    lp->bfp_ftran_normal(lp, rhsvector, nzidx);\n}\n\nSTATIC void btran(lprec *lp, REAL *rhsvector, int *nzidx, REAL roundzero)\n{\n#if 0\n  if(is_action(lp->improve, IMPROVE_SOLUTION) && lp->bfp_pivotcount(lp))\n    bimprove(lp, rhsvector, nzidx, roundzero);\n  else\n#endif\n    lp->bfp_btran_normal(lp, rhsvector, nzidx);\n}\n\nSTATIC MYBOOL fsolve(lprec *lp, int varin, REAL *pcol, int *nzidx, REAL roundzero, REAL ofscalar, MYBOOL prepareupdate)\n/* Was setpivcol in versions earlier than 4.0.1.8 - KE */\n{\n  MYBOOL ok = TRUE;\n\n  if(varin > 0)\n    obtain_column(lp, varin, pcol, nzidx, NULL);\n\n /* Solve, adjusted for objective function scalar */\n  pcol[0] *= ofscalar;\n  if(prepareupdate)\n    lp->bfp_ftran_prepare(lp, pcol, nzidx);\n  else\n    ftran(lp, pcol, nzidx, roundzero);\n\n  return(ok);\n\n} /* fsolve */\n\n\nSTATIC MYBOOL bsolve(lprec *lp, int row_nr, REAL *rhsvector, int *nzidx, REAL roundzero, REAL ofscalar)\n{\n  MYBOOL ok = TRUE;\n\n  if(row_nr >= 0) /* Note that row_nr == 0 returns the [1, 0...0 ] vector */\n    row_nr = obtain_column(lp, row_nr, rhsvector, nzidx, NULL);\n\n  /* Solve, adjusted for objective function scalar */\n  rhsvector[0] *= ofscalar;\n  btran(lp, rhsvector, nzidx, roundzero);\n\n  return(ok);\n\n} /* bsolve */\n\n\n/* Vector compression and expansion routines */\nSTATIC MYBOOL vec_compress(REAL *densevector, int startpos, int endpos, REAL epsilon,\n                           REAL *nzvector, int *nzindex)\n{\n  int n;\n\n  if((densevector == NULL) || (nzindex == NULL) || (startpos > endpos))\n    return( FALSE );\n\n  n = 0;\n  densevector += startpos;\n  while(startpos <= endpos) {\n    if(fabs(*densevector) > epsilon) {  /* Apply zero-threshold */\n      if(nzvector != NULL)                       /* Only produce index if no nzvector is given */\n        nzvector[n] = *densevector;\n      n++;\n      nzindex[n] = startpos;\n    }\n    startpos++;\n    densevector++;\n  }\n  nzindex[0] = n;\n  return( TRUE );\n}\n\nSTATIC MYBOOL vec_expand(REAL *nzvector, int *nzindex, REAL *densevector, int startpos, int endpos)\n{\n  int i, n;\n\n  n = nzindex[0];\n  i = nzindex[n];\n  densevector += endpos;\n  while(endpos >= startpos) {                     /* Loop from behind to allow densevector == nzvector */\n    if(endpos == i) {\n      n--;\n      *densevector = nzvector[n];\n      i = nzindex[n];\n    }\n    else\n      *densevector = 0;\n    endpos--;\n    densevector--;\n  }\n  return( TRUE );\n}\n\n\n/* ----------------------------------------------------------------------- */\n/* Sparse matrix product routines and utility                              */\n/* ----------------------------------------------------------------------- */\n\nSTATIC MYBOOL get_colIndexA(lprec *lp, int varset, int *colindex, MYBOOL append)\n{\n  int      i, varnr, P1extraDim, vb, ve, n, nrows = lp->rows, nsum = lp->sum;\n  MYBOOL   omitfixed, omitnonfixed;\n  REAL     v;\n\n  /* Find what variable range to scan - default is {SCAN_USERVARS} */\n  /* First determine the starting position; add from the top, going down */\n  P1extraDim = abs(lp->P1extraDim);\n  vb = nrows + 1;\n  if(varset & SCAN_ARTIFICIALVARS)\n    vb = nsum - P1extraDim + 1;\n  if(varset & SCAN_USERVARS)\n    vb = nrows + 1;\n  if(varset & SCAN_SLACKVARS)\n    vb = 1;\n\n  /* Then determine the ending position, add from the bottom, going up */\n  ve = nsum;\n  if(varset & SCAN_SLACKVARS)\n    ve = nrows;\n  if(varset & SCAN_USERVARS)\n    ve = nsum - P1extraDim;\n  if(varset & SCAN_ARTIFICIALVARS)\n    ve = nsum;\n\n  /* Adjust for partial pricing */\n  if(varset & SCAN_PARTIALBLOCK) {\n    SETMAX(vb, partial_blockStart(lp, FALSE));\n    SETMIN(ve, partial_blockEnd(lp, FALSE));\n  }\n\n  /* Determine exclusion columns */\n  omitfixed = (MYBOOL) ((varset & OMIT_FIXED) != 0);\n  omitnonfixed = (MYBOOL) ((varset & OMIT_NONFIXED) != 0);\n  if(omitfixed && omitnonfixed)\n    return(FALSE);\n\n  /* Scan the target colums */\n  if(append)\n    n = colindex[0];\n  else\n    n = 0;\n  for(varnr = vb; varnr <= ve; varnr++) {\n\n    /* Skip gap in the specified column scan range (possibly user variables) */\n    if(varnr > nrows) {\n      if((varnr <= nsum-P1extraDim) && !(varset & SCAN_USERVARS))\n        continue;\n#if 1\n      /* Skip empty columns */\n      if(/*(lp->P1extraVal == 0) &&*/\n         (mat_collength(lp->matA, varnr-nrows) == 0))\n        continue;\n#endif\n    }\n\n    /* Find if the variable is in the scope - default is {} */\n    i = lp->is_basic[varnr];\n    if((varset & USE_BASICVARS) > 0 && (i))\n      ;\n    else if((varset & USE_NONBASICVARS) > 0 && (!i))\n      ;\n    else\n      continue;\n\n    v = lp->upbo[varnr];\n    if((omitfixed && (v == 0)) ||\n       (omitnonfixed && (v != 0)))\n      continue;\n\n    /* Append to list */\n    n++;\n    colindex[n] = varnr;\n  }\n  colindex[0] = n;\n\n  return(TRUE);\n}\n\nSTATIC int prod_Ax(lprec *lp, int *coltarget, REAL *input, int *nzinput,\n                              REAL roundzero, REAL ofscalar,\n                              REAL *output, int *nzoutput, int roundmode)\n/* prod_Ax is only used in fimprove; note that it is NOT VALIDATED/verified as of 20030801 - KE */\n{\n  int      j, colnr, ib, ie, vb, ve;\n  MYBOOL   localset, localnz = FALSE, isRC;\n  MATrec   *mat = lp->matA;\n  REAL     sdp;\n  REAL     *value;\n  int      *rownr;\n\n  /* Find what variable range to scan - default is {SCAN_USERVARS} */\n  /* Define default column target if none was provided */\n  isRC = (MYBOOL) ((roundmode & MAT_ROUNDRC) != 0);\n  localset = (MYBOOL) (coltarget == NULL);\n  if(localset) {\n    int varset = SCAN_SLACKVARS | SCAN_USERVARS |\n                 USE_BASICVARS | OMIT_FIXED;\n    if(isRC && is_piv_mode(lp, PRICE_PARTIAL) && !is_piv_mode(lp, PRICE_FORCEFULL))\n      varset |= SCAN_PARTIALBLOCK;\n    coltarget = (int *) mempool_obtainVector(lp->workarrays, lp->sum+1, sizeof(*coltarget));\n    if(!get_colIndexA(lp, varset, coltarget, FALSE)) {\n      mempool_releaseVector(lp->workarrays, (char *) coltarget, FALSE);\n      return(FALSE);\n    }\n  }\n  localnz = (MYBOOL) (nzinput == NULL);\n  if(localnz) {\n    nzinput = (int *) mempool_obtainVector(lp->workarrays, lp->rows+1, sizeof(*nzinput));\n    vec_compress(input, 0, lp->rows, lp->matA->epsvalue, NULL, nzinput);\n  }\n\n  /* Scan the columns */\n  vb = 1;\n  ve = coltarget[0];\n  for(vb = 1; vb <= coltarget[0]; vb++) {\n    colnr = coltarget[vb];\n    j = lp->is_basic[colnr];\n\n    /* Perform the multiplication */\n    sdp = ofscalar*input[j];\n    if(colnr <= lp->rows)               /* A slack variable is in the basis */\n      output[colnr] += sdp;\n    else {                              /* A normal variable is in the basis */\n      colnr -= lp->rows;\n      ib = mat->col_end[colnr - 1];\n      ie = mat->col_end[colnr];\n      rownr = &COL_MAT_ROWNR(ib);\n      value = &COL_MAT_VALUE(ib);\n      for(; ib < ie;\n          ib++, rownr += matRowColStep, value += matValueStep) {\n        output[*rownr] += (*value)*sdp;\n      }\n    }\n  }\n  roundVector(output+1, lp->rows-1, roundzero);\n\n  /* Clean up and return */\n  if(localset)\n    mempool_releaseVector(lp->workarrays, (char *) coltarget, FALSE);\n  if(localnz)\n    mempool_releaseVector(lp->workarrays, (char *) nzinput, FALSE);\n\n  return(TRUE);\n}\n\nSTATIC int prod_xA(lprec *lp, int *coltarget,\n                              REAL *input, int *nzinput, REAL roundzero, REAL ofscalar,\n                              REAL *output, int *nzoutput, int roundmode)\n/* Note that the dot product xa is stored at the active column index of A, i.e. of a.\n   This means that if the basis only contains non-slack variables, output may point to\n   the same vector as input, without overwriting the [0..rows] elements. */\n{\n  int      colnr, rownr, varnr, ib, ie, vb, ve, nrows = lp->rows;\n  MYBOOL   localset, localnz = FALSE, includeOF, isRC;\n  REALXP   vmax;\n  register REALXP v;\n  int      inz, *rowin, countNZ = 0;\n  MATrec   *mat = lp->matA;\n  register REAL     *matValue;\n  register int      *matRownr;\n\n  /* Clean output area (only necessary if we are returning the full vector) */\n  isRC = (MYBOOL) ((roundmode & MAT_ROUNDRC) != 0);\n  if(nzoutput == NULL) {\n    if(input == output)\n      MEMCLEAR(output+nrows+1, lp->columns);\n    else\n      MEMCLEAR(output, lp->sum+1);\n  }\n\n  /* Find what variable range to scan - default is {SCAN_USERVARS} */\n  /* Define default column target if none was provided */\n  localset = (MYBOOL) (coltarget == NULL);\n  if(localset) {\n    int varset = SCAN_SLACKVARS | SCAN_USERVARS |\n                 USE_NONBASICVARS | OMIT_FIXED;\n    if(isRC && is_piv_mode(lp, PRICE_PARTIAL) && !is_piv_mode(lp, PRICE_FORCEFULL))\n      varset |= SCAN_PARTIALBLOCK;\n    coltarget = (int *) mempool_obtainVector(lp->workarrays, lp->sum+1, sizeof(*coltarget));\n    if(!get_colIndexA(lp, varset, coltarget, FALSE)) {\n      mempool_releaseVector(lp->workarrays, (char *) coltarget, FALSE);\n      return(FALSE);\n    }\n  }\n/*#define UseLocalNZ*/\n#ifdef UseLocalNZ\n  localnz = (MYBOOL) (nzinput == NULL);\n  if(localnz) {\n    nzinput = (int *) mempool_obtainVector(lp->workarrays, nrows+1, sizeof(*nzinput));\n    vec_compress(input, 0, nrows, lp->matA->epsvalue, NULL, nzinput);\n  }\n#endif\n  includeOF = (MYBOOL) (((nzinput == NULL) || (nzinput[1] == 0)) &&\n                        (input[0] != 0) && lp->obj_in_basis);\n\n  /* Scan the target colums */\n  vmax = 0;\n  ve = coltarget[0];\n  for(vb = 1; vb <= ve; vb++) {\n\n    varnr = coltarget[vb];\n\n    if(varnr <= nrows) {\n      v = input[varnr];\n    }\n    else {\n      colnr = varnr - nrows;\n      v = 0;\n      ib = mat->col_end[colnr - 1];\n      ie = mat->col_end[colnr];\n      if(ib < ie) {\n\n        /* Do dense input vector version */\n#ifdef UseLocalNZ\n        if(localnz || (nzinput == NULL)) {\n#else\n        if(nzinput == NULL) {\n#endif\n          /* Do the OF */\n          if(includeOF)\n#ifdef DirectArrayOF\n            v += input[0] * lp->obj[colnr] * ofscalar;\n#else\n            v += input[0] * get_OF_active(lp, varnr, ofscalar);\n#endif\n\n          /* Initialize pointers */\n          matRownr = &COL_MAT_ROWNR(ib);\n          matValue = &COL_MAT_VALUE(ib);\n\n          /* Do extra loop optimization based on target window overlaps */\n#ifdef UseLocalNZ\n          if((ib < ie)\n             && (colnr <= *nzinput)\n             && (COL_MAT_ROWNR(ie-1) >= nzinput[colnr])\n             && (*matRownr <= nzinput[*nzinput])\n             )\n#endif\n#ifdef NoLoopUnroll\n          /* Then loop over all regular rows */\n          for(; ib < ie; ib++) {\n            v += input[*matRownr] * (*matValue);\n            matValue += matValueStep;\n            matRownr += matRowColStep;\n          }\n#else\n          /* Prepare for simple loop unrolling */\n          if(((ie-ib) % 2) == 1) {\n            v += input[*matRownr] * (*matValue);\n            ib++;\n            matValue += matValueStep;\n            matRownr += matRowColStep;\n          }\n\n          /* Then loop over remaining pairs of regular rows */\n          while(ib < ie) {\n            v += input[*matRownr] * (*matValue);\n            v += input[*(matRownr+matRowColStep)] * (*(matValue+matValueStep));\n            ib += 2;\n            matValue += 2*matValueStep;\n            matRownr += 2*matRowColStep;\n          }\n#endif\n        }\n        /* Do sparse input vector version */\n        else {\n\n          /* Do the OF */\n          if(includeOF)\n#ifdef DirectArrayOF\n            v += input[0] * lp->obj[colnr] * ofscalar;\n#else\n            v += input[0] * get_OF_active(lp, varnr, ofscalar);\n#endif\n\n          /* Initialize pointers */\n          inz = 1;\n          rowin = nzinput+inz;\n          matRownr = &COL_MAT_ROWNR(ib);\n          matValue = &COL_MAT_VALUE(ib);\n          ie--;\n\n          /* Then loop over all non-OF rows */\n          while((inz <= *nzinput) && (ib <= ie)) {\n\n           /* Try to synchronize at right */\n            while((*rowin > *matRownr) && (ib < ie)) {\n              ib++;\n              matValue += matValueStep;\n              matRownr += matRowColStep;\n            }\n            /* Try to synchronize at left */\n            while((*rowin < *matRownr) && (inz < *nzinput)) {\n              inz++;\n              rowin++;\n            }\n            /* Perform dot product operation if there was a match */\n            if(*rowin == *matRownr) {\n              v += input[*rowin] * (*matValue);\n              /* Step forward at left */\n              inz++;\n              rowin++;\n            }\n          }\n        }\n      }\n      if((roundmode & MAT_ROUNDABS) != 0) {\n        my_roundzero(v, roundzero);\n      }\n    }\n\n    /* Special handling of small reduced cost values */\n    if(!isRC || (my_chsign(lp->is_lower[varnr], v) < 0)) {\n      SETMAX(vmax, fabs((REAL) v));\n    }\n    if(v != 0) {\n      countNZ++;\n      if(nzoutput != NULL)\n        nzoutput[countNZ] = varnr;\n    }\n    output[varnr] = (REAL) v;\n  }\n\n  /* Compute reduced cost if this option is active */\n  if(isRC && !lp->obj_in_basis)\n    countNZ = get_basisOF(lp, coltarget, output, nzoutput);\n\n  /* Check if we should do relative rounding */\n  if((roundmode & MAT_ROUNDREL) != 0) {\n    if((roundzero > 0) && (nzoutput != NULL)) {\n      ie = 0;\n      if(isRC) {\n        SETMAX(vmax, MAT_ROUNDRCMIN);  /* Make sure we don't use very small values */\n      }\n      vmax *= roundzero;\n      for(ib = 1; ib <= countNZ;  ib++) {\n        rownr = nzoutput[ib];\n        if(fabs(output[rownr]) < vmax)\n          output[rownr] = 0;\n        else {\n          ie++;\n          nzoutput[ie] = rownr;\n        }\n      }\n      countNZ = ie;\n    }\n  }\n\n  /* Clean up and return */\n  if(localset)\n    mempool_releaseVector(lp->workarrays, (char *) coltarget, FALSE);\n  if(localnz)\n    mempool_releaseVector(lp->workarrays, (char *) nzinput, FALSE);\n\n  if(nzoutput != NULL)\n    *nzoutput = countNZ;\n  return(countNZ);\n}\n\nSTATIC MYBOOL prod_xA2(lprec *lp, int *coltarget,\n                                  REAL *prow, REAL proundzero, int *nzprow,\n                                  REAL *drow, REAL droundzero, int *nzdrow,\n                                  REAL ofscalar, int roundmode)\n{\n  int      varnr, colnr, ib, ie, vb, ve, nrows = lp->rows;\n  MYBOOL   includeOF, isRC;\n  REALXP   dmax, pmax;\n  register REALXP d, p;\n  MATrec   *mat = lp->matA;\n  REAL     value;\n  register REAL     *matValue;\n  register int      *matRownr;\n  MYBOOL localset;\n\n  /* Find what variable range to scan - default is {SCAN_USERVARS} */\n  /* First determine the starting position; add from the top, going down */\n  localset = (MYBOOL) (coltarget == NULL);\n  if(localset) {\n    int varset = SCAN_SLACKVARS + SCAN_USERVARS + /*SCAN_ALLVARS +*/\n                 /*SCAN_PARTIALBLOCK+*/\n                 USE_NONBASICVARS+OMIT_FIXED;\n    coltarget = (int *) mempool_obtainVector(lp->workarrays, lp->sum+1, sizeof(*coltarget));\n    if(!get_colIndexA(lp, varset, coltarget, FALSE)) {\n      mempool_releaseVector(lp->workarrays, (char *) coltarget, FALSE);\n      return(FALSE);\n    }\n  }\n\n  /* Initialize variables */\n  isRC = (MYBOOL) ((roundmode & MAT_ROUNDRC) != 0);\n  pmax = 0;\n  dmax = 0;\n  if(nzprow != NULL)\n    *nzprow = 0;\n  if(nzdrow != NULL)\n    *nzdrow = 0;\n  includeOF = (MYBOOL) (((prow[0] != 0) || (drow[0] != 0)) &&\n                        lp->obj_in_basis);\n\n  /* Scan the target colums */\n  ve = coltarget[0];\n  for(vb = 1; vb <= ve; vb++) {\n\n    varnr = coltarget[vb];\n\n    if(varnr <= nrows) {\n      p = prow[varnr];\n      d = drow[varnr];\n    }\n    else {\n\n      colnr = varnr - nrows;\n\n      p = 0;\n      d = 0;\n      ib = mat->col_end[colnr - 1];\n      ie = mat->col_end[colnr];\n\n      if(ib < ie) {\n\n        /* Do the OF */\n        if(includeOF) {\n#ifdef DirectArrayOF\n          value = lp->obj[colnr] * ofscalar;\n#else\n          value = get_OF_active(lp, varnr, ofscalar);\n#endif\n          p += prow[0] * value;\n          d += drow[0] * value;\n        }\n\n        /* Then loop over all regular rows */\n        matRownr = &COL_MAT_ROWNR(ib);\n        matValue = &COL_MAT_VALUE(ib);\n#ifdef NoLoopUnroll\n        for( ; ib < ie; ib++) {\n          p += prow[*matRownr] * (*matValue);\n          d += drow[*matRownr] * (*matValue);\n          matValue += matValueStep;\n          matRownr += matRowColStep;\n        }\n#else\n        /* Prepare for simple loop unrolling */\n        if(((ie-ib) % 2) == 1) {\n          p += prow[*matRownr] * (*matValue);\n          d += drow[*matRownr] * (*matValue);\n          ib++;\n          matValue += matValueStep;\n          matRownr += matRowColStep;\n        }\n\n        /* Then loop over remaining pairs of regular rows */\n        while(ib < ie) {\n          p += prow[*matRownr] * (*matValue);\n          p += prow[*(matRownr+matRowColStep)] * (*(matValue+matValueStep));\n          d += drow[*matRownr] * (*matValue);\n          d += drow[*(matRownr+matRowColStep)] * (*(matValue+matValueStep));\n          ib += 2;\n          matValue += 2*matValueStep;\n          matRownr += 2*matRowColStep;\n        }\n#endif\n\n      }\n      if((roundmode & MAT_ROUNDABS) != 0) {\n        my_roundzero(p, proundzero);\n        my_roundzero(d, droundzero);\n      }\n    }\n\n    SETMAX(pmax, fabs((REAL) p));\n    prow[varnr] = (REAL) p;\n    if((nzprow != NULL) && (p != 0)) {\n      (*nzprow)++;\n      nzprow[*nzprow] = varnr;\n    }\n\n    /* Special handling of reduced cost rounding */\n    if(!isRC || (my_chsign(lp->is_lower[varnr], d) < 0)) {\n      SETMAX(dmax, fabs((REAL) d));\n    }\n    drow[varnr] = (REAL) d;\n    if((nzdrow != NULL) && (d != 0)) {\n      (*nzdrow)++;\n      nzdrow[*nzdrow] = varnr;\n    }\n  }\n\n  /* Compute reduced cost here if this option is active */\n  if((drow != 0) && !lp->obj_in_basis)\n    get_basisOF(lp, coltarget, drow, nzdrow);\n\n  /* Check if we should do relative rounding */\n  if((roundmode & MAT_ROUNDREL) != 0) {\n    if((proundzero > 0) && (nzprow != NULL)) {\n      ie = 0;\n      pmax *= proundzero;\n      for(ib = 1; ib <= *nzprow;  ib++) {\n        varnr = nzprow[ib];\n        if(fabs(prow[varnr]) < pmax)\n          prow[varnr] = 0;\n        else {\n          ie++;\n          nzprow[ie] = varnr;\n        }\n      }\n      *nzprow = ie;\n    }\n    if((droundzero > 0) && (nzdrow != NULL)) {\n      ie = 0;\n      if(isRC) {\n        SETMAX(dmax, MAT_ROUNDRCMIN);  /* Make sure we don't use very small values */\n      }\n      dmax *= droundzero;\n      for(ib = 1; ib <= *nzdrow;  ib++) {\n        varnr = nzdrow[ib];\n        if(fabs(drow[varnr]) < dmax)\n          drow[varnr] = 0;\n        else {\n          ie++;\n          nzdrow[ie] = varnr;\n        }\n      }\n      *nzdrow = ie;\n    }\n  }\n\n  /* Clean up and return */\n  if(localset)\n    mempool_releaseVector(lp->workarrays, (char *) coltarget, FALSE);\n  return( TRUE );\n}\n\nSTATIC void bsolve_xA2(lprec *lp, int* coltarget,\n                                  int row_nr1, REAL *vector1, REAL roundzero1, int *nzvector1,\n                                  int row_nr2, REAL *vector2, REAL roundzero2, int *nzvector2, int roundmode)\n{\n  REAL ofscalar = 1.0;\n\n /* Clear and initialize first vector */\n  if(nzvector1 == NULL)\n    MEMCLEAR(vector1, lp->sum + 1);\n  else\n    MEMCLEAR(vector1, lp->rows + 1);\n  vector1[row_nr1] = 1;\n/*  workINT[0] = 1;\n  workINT[1] = row_nr1; */\n\n  if(vector2 == NULL) {\n    lp->bfp_btran_normal(lp, vector1, NULL);\n    prod_xA(lp, coltarget, vector1, NULL, roundzero1, ofscalar*0,\n                           vector1, nzvector1, roundmode);\n  }\n  else {\n\n   /* Clear and initialize second vector */\n    if(nzvector2 == NULL)\n      MEMCLEAR(vector2, lp->sum + 1);\n    else\n      MEMCLEAR(vector2, lp->rows + 1);\n    if(lp->obj_in_basis || (row_nr2 > 0)) {\n      vector2[row_nr2] = 1;\n/*      workINT[2] = 1;\n      workINT[3] = row_nr2; */\n    }\n    else\n      get_basisOF(lp, NULL, vector2, nzvector2);\n\n   /* A double BTRAN equation solver process is implemented \"in-line\" below in\n      order to save time and to implement different rounding for the two */\n    lp->bfp_btran_double(lp, vector1, NULL, vector2, NULL);\n\n   /* Multiply solution vectors with matrix values */\n    prod_xA2(lp, coltarget, vector1, roundzero1, nzvector1,\n                            vector2, roundzero2, nzvector2,\n                            ofscalar, roundmode);\n  }\n}\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_matrix.h",
    "content": "#ifndef HEADER_lp_matrix\n#define HEADER_lp_matrix\n\n#include \"lp_types.h\"\n#include \"lp_utils.h\"\n\n\n/* Sparse matrix element (ordered columnwise) */\ntypedef struct _MATitem\n{\n  int  rownr;\n  int  colnr;\n  REAL value;\n} MATitem;\n\n/* Constants for matrix product rounding options */\n#define MAT_ROUNDNONE             0\n#define MAT_ROUNDABS              1\n#define MAT_ROUNDREL              2\n#define MAT_ROUNDABSREL          (MAT_ROUNDABS + MAT_ROUNDREL)\n#define MAT_ROUNDRC               4\n#define MAT_ROUNDRCMIN            1.0 /* lp->epspivot */\n#if 1\n #define MAT_ROUNDDEFAULT         MAT_ROUNDREL  /* Typically increases performance */\n#else\n #define MAT_ROUNDDEFAULT         MAT_ROUNDABS  /* Probably gives more precision */\n#endif\n\n/* Compiler option development features */\n/*#define DebugInv*/               /* Report array values at factorization/inversion */\n#define NoLoopUnroll              /* Do not do loop unrolling */\n#define DirectArrayOF             /* Reference lp->obj[] array instead of function call */\n\n\n/* Matrix column access macros to be able to easily change storage model */\n#define CAM_Record                0\n#define CAM_Vector                1\n#if 0\n #define MatrixColAccess           CAM_Record\n#else\n #define MatrixColAccess           CAM_Vector\n#endif\n\n#if MatrixColAccess==CAM_Record\n#define SET_MAT_ijA(item,i,j,A)   mat->col_mat[item].rownr = i; \\\n                                  mat->col_mat[item].colnr = j; \\\n                                  mat->col_mat[item].value = A\n#define COL_MAT_COLNR(item)       (mat->col_mat[item].colnr)\n#define COL_MAT_ROWNR(item)       (mat->col_mat[item].rownr)\n#define COL_MAT_VALUE(item)       (mat->col_mat[item].value)\n#define COL_MAT_COPY(left,right)  mat->col_mat[left] = mat->col_mat[right]\n#define COL_MAT_MOVE(to,from,rec) MEMMOVE(&(mat->col_mat[to]),&(mat->col_mat[from]),rec)\n#define COL_MAT2_COLNR(item)      (mat2->col_mat[item].colnr)\n#define COL_MAT2_ROWNR(item)      (mat2->col_mat[item].rownr)\n#define COL_MAT2_VALUE(item)      (mat2->col_mat[item].value)\n#define matRowColStep             (sizeof(MATitem)/sizeof(int))\n#define matValueStep              (sizeof(MATitem)/sizeof(REAL))\n\n#else /* if MatrixColAccess==CAM_Vector */\n#define SET_MAT_ijA(item,i,j,A)   mat->col_mat_rownr[item] = i; \\\n                                  mat->col_mat_colnr[item] = j; \\\n                                  mat->col_mat_value[item] = A\n#define COL_MAT_COLNR(item)       (mat->col_mat_colnr[item])\n#define COL_MAT_ROWNR(item)       (mat->col_mat_rownr[item])\n#define COL_MAT_VALUE(item)       (mat->col_mat_value[item])\n#define COL_MAT_COPY(left,right)  COL_MAT_COLNR(left) = COL_MAT_COLNR(right); \\\n                                  COL_MAT_ROWNR(left) = COL_MAT_ROWNR(right); \\\n                                  COL_MAT_VALUE(left) = COL_MAT_VALUE(right)\n#define COL_MAT_MOVE(to,from,rec) MEMMOVE(&COL_MAT_COLNR(to),&COL_MAT_COLNR(from),rec); \\\n                                  MEMMOVE(&COL_MAT_ROWNR(to),&COL_MAT_ROWNR(from),rec); \\\n                                  MEMMOVE(&COL_MAT_VALUE(to),&COL_MAT_VALUE(from),rec)\n#define COL_MAT2_COLNR(item)      (mat2->col_mat_colnr[item])\n#define COL_MAT2_ROWNR(item)      (mat2->col_mat_rownr[item])\n#define COL_MAT2_VALUE(item)      (mat2->col_mat_value[item])\n#define matRowColStep             1\n#define matValueStep              1\n\n#endif\n\n\n/* Matrix row access macros to be able to easily change storage model */\n#define RAM_Index                 0\n#define RAM_FullCopy              1\n#define MatrixRowAccess           RAM_Index\n\n#if MatrixRowAccess==RAM_Index\n#define ROW_MAT_COLNR(item)       COL_MAT_COLNR(mat->row_mat[item])\n#define ROW_MAT_ROWNR(item)       COL_MAT_ROWNR(mat->row_mat[item])\n#define ROW_MAT_VALUE(item)       COL_MAT_VALUE(mat->row_mat[item])\n\n#elif MatrixColAccess==CAM_Record\n#define ROW_MAT_COLNR(item)       (mat->row_mat[item].colnr)\n#define ROW_MAT_ROWNR(item)       (mat->row_mat[item].rownr)\n#define ROW_MAT_VALUE(item)       (mat->row_mat[item].value)\n\n#else /* if MatrixColAccess==CAM_Vector */\n#define ROW_MAT_COLNR(item)       (mat->row_mat_colnr[item])\n#define ROW_MAT_ROWNR(item)       (mat->row_mat_rownr[item])\n#define ROW_MAT_VALUE(item)       (mat->row_mat_value[item])\n\n#endif\n\n\ntypedef struct _MATrec\n{\n  /* Owner reference */\n  lprec     *lp;\n\n  /* Active dimensions */\n  int       rows;\n  int       columns;\n\n  /* Allocated memory */\n  int       rows_alloc;\n  int       columns_alloc;\n  int       mat_alloc;          /* The allocated size for matrix sized structures */\n\n  /* Sparse problem matrix storage */\n#if MatrixColAccess==CAM_Record  \n  MATitem   *col_mat;           /* mat_alloc : The sparse data storage */\n#else /*MatrixColAccess==CAM_Vector*/\n  int       *col_mat_colnr;\n  int       *col_mat_rownr;\n  REAL      *col_mat_value;\n#endif  \n  int       *col_end;           /* columns_alloc+1 : col_end[i] is the index of the\n                                   first element after column i; column[i] is stored\n                                   in elements col_end[i-1] to col_end[i]-1 */\n  int       *col_tag;           /* user-definable tag associated with each column */\n\n#if MatrixRowAccess==RAM_Index\n  int       *row_mat;           /* mat_alloc : From index 0, row_mat contains the\n                                   row-ordered index of the elements of col_mat */\n#elif MatrixColAccess==CAM_Record\n  MATitem   *row_mat;           /* mat_alloc : From index 0, row_mat contains the\n                                   row-ordered copy of the elements in col_mat */\n#else /*if MatrixColAccess==CAM_Vector*/\n  int       *row_mat_colnr;\n  int       *row_mat_rownr;\n  REAL      *row_mat_value;\n#endif\n  int       *row_end;           /* rows_alloc+1 : row_end[i] is the index of the\n                                   first element in row_mat after row i */\n  int       *row_tag;           /* user-definable tag associated with each row */\n\n  REAL      *colmax;            /* Array of maximum values of each column */\n  REAL      *rowmax;            /* Array of maximum values of each row */\n\n  REAL      epsvalue;           /* Zero element rejection threshold */\n  REAL      infnorm;            /* The largest absolute value in the matrix */\n  REAL      dynrange;\n  MYBOOL    row_end_valid;      /* TRUE if row_end & row_mat are valid */\n  MYBOOL    is_roworder;        /* TRUE if the current (temporary) matrix order is row-wise */\n\n} MATrec;\n\ntypedef struct _DeltaVrec\n{\n  lprec     *lp;\n  int       activelevel;\n  MATrec    *tracker;\n} DeltaVrec;\n\n\n#ifdef __cplusplus\n__EXTERN_C {\n#endif\n\n/* Sparse matrix routines */\nSTATIC MATrec *mat_create(lprec *lp, int rows, int columns, REAL epsvalue);\nSTATIC MYBOOL mat_memopt(MATrec *mat, int rowextra, int colextra, int nzextra);\nSTATIC void mat_free(MATrec **matrix);\nSTATIC MYBOOL inc_matrow_space(MATrec *mat, int deltarows);\nSTATIC int mat_mapreplace(MATrec *mat, LLrec *rowmap, LLrec *colmap, MATrec *insmat);\nSTATIC int mat_matinsert(MATrec *mat, MATrec *insmat);\nSTATIC int mat_zerocompact(MATrec *mat);\nSTATIC int mat_rowcompact(MATrec *mat, MYBOOL dozeros);\nSTATIC int mat_colcompact(MATrec *mat, int prev_rows, int prev_cols);\nSTATIC MYBOOL inc_matcol_space(MATrec *mat, int deltacols);\nSTATIC MYBOOL inc_mat_space(MATrec *mat, int mindelta);\nSTATIC int mat_shiftrows(MATrec *mat, int *bbase, int delta, LLrec *varmap);\nSTATIC int mat_shiftcols(MATrec *mat, int *bbase, int delta, LLrec *varmap);\nSTATIC MATrec *mat_extractmat(MATrec *mat, LLrec *rowmap, LLrec *colmap, MYBOOL negated);\nSTATIC int mat_appendrow(MATrec *mat, int count, REAL *row, int *colno, REAL mult, MYBOOL checkrowmode);\nSTATIC int mat_appendcol(MATrec *mat, int count, REAL *column, int *rowno, REAL mult, MYBOOL checkrowmode);\nMYBOOL mat_get_data(lprec *lp, int matindex, MYBOOL isrow, int **rownr, int **colnr, REAL **value);\nMYBOOL mat_set_rowmap(MATrec *mat, int row_mat_index, int rownr, int colnr, int col_mat_index);\nSTATIC MYBOOL mat_indexrange(MATrec *mat, int index, MYBOOL isrow, int *startpos, int *endpos);\nSTATIC MYBOOL mat_validate(MATrec *mat);\nSTATIC MYBOOL mat_equalRows(MATrec *mat, int baserow, int comprow);\nSTATIC int mat_findelm(MATrec *mat, int row, int column);\nSTATIC int mat_findins(MATrec *mat, int row, int column, int *insertpos, MYBOOL validate);\nSTATIC void mat_multcol(MATrec *mat, int col_nr, REAL mult, MYBOOL DoObj);\nSTATIC REAL mat_getitem(MATrec *mat, int row, int column);\nSTATIC MYBOOL mat_setitem(MATrec *mat, int row, int column, REAL value);\nSTATIC MYBOOL mat_additem(MATrec *mat, int row, int column, REAL delta);\nSTATIC MYBOOL mat_setvalue(MATrec *mat, int Row, int Column, REAL Value, MYBOOL doscale);\nSTATIC int mat_nonzeros(MATrec *mat);\nSTATIC int mat_collength(MATrec *mat, int colnr);\nSTATIC int mat_rowlength(MATrec *mat, int rownr);\nSTATIC void mat_multrow(MATrec *mat, int row_nr, REAL mult);\nSTATIC void mat_multadd(MATrec *mat, REAL *lhsvector, int varnr, REAL mult);\nSTATIC MYBOOL mat_setrow(MATrec *mat, int rowno, int count, REAL *row, int *colno, MYBOOL doscale, MYBOOL checkrowmode);\nSTATIC MYBOOL mat_setcol(MATrec *mat, int colno, int count, REAL *column, int *rowno, MYBOOL doscale, MYBOOL checkrowmode);\nSTATIC MYBOOL mat_mergemat(MATrec *target, MATrec *source, MYBOOL usecolmap);\nSTATIC int mat_checkcounts(MATrec *mat, int *rownum, int *colnum, MYBOOL freeonexit);\nSTATIC int mat_expandcolumn(MATrec *mat, int colnr, REAL *column, int *nzlist, MYBOOL signedA);\nSTATIC MYBOOL mat_computemax(MATrec *mat);\nSTATIC MYBOOL mat_transpose(MATrec *mat);\n\n/* Refactorization and recomputation routine */\nMYBOOL __WINAPI invert(lprec *lp, MYBOOL shiftbounds, MYBOOL final);\n\n/* Vector compression and expansion routines */\nSTATIC MYBOOL vec_compress(REAL *densevector, int startpos, int endpos, REAL epsilon, REAL *nzvector, int *nzindex);\nSTATIC MYBOOL vec_expand(REAL *nzvector, int *nzindex, REAL *densevector, int startpos, int endpos);\n\n/* Sparse matrix products */\nSTATIC MYBOOL get_colIndexA(lprec *lp, int varset, int *colindex, MYBOOL append);\nSTATIC int prod_Ax(lprec *lp, int *coltarget, REAL *input, int *nzinput, REAL roundzero, REAL ofscalar, REAL *output, int *nzoutput, int roundmode);\nSTATIC int prod_xA(lprec *lp, int *coltarget, REAL *input, int *nzinput, REAL roundzero, REAL ofscalar, REAL *output, int *nzoutput, int roundmode);\nSTATIC MYBOOL prod_xA2(lprec *lp, int *coltarget, REAL *prow, REAL proundzero, int *pnzprow,\n                                                  REAL *drow, REAL droundzero, int *dnzdrow, REAL ofscalar, int roundmode);\n\n/* Equation solution */\nSTATIC MYBOOL fimprove(lprec *lp, REAL *pcol, int *nzidx, REAL roundzero);\nSTATIC void ftran(lprec *lp, REAL *rhsvector, int *nzidx, REAL roundzero);\nSTATIC MYBOOL bimprove(lprec *lp, REAL *rhsvector, int *nzidx, REAL roundzero);\nSTATIC void btran(lprec *lp, REAL *rhsvector, int *nzidx, REAL roundzero);\n\n/* Combined equation solution and matrix product for simplex operations */\nSTATIC MYBOOL fsolve(lprec *lp, int varin, REAL *pcol, int *nzidx, REAL roundzero, REAL ofscalar, MYBOOL prepareupdate);\nSTATIC MYBOOL bsolve(lprec *lp, int row_nr, REAL *rhsvector, int *nzidx, REAL roundzero, REAL ofscalar);\nSTATIC void bsolve_xA2(lprec *lp, int* coltarget, \n                                  int row_nr1, REAL *vector1, REAL roundzero1, int *nzvector1,\n                                  int row_nr2, REAL *vector2, REAL roundzero2, int *nzvector2, int roundmode);\n\n/* Change-tracking routines (primarily for B&B and presolve) */\nSTATIC DeltaVrec *createUndoLadder(lprec *lp, int levelitems, int maxlevels);\nSTATIC int incrementUndoLadder(DeltaVrec *DV);\nSTATIC MYBOOL modifyUndoLadder(DeltaVrec *DV, int itemno, REAL target[], REAL newvalue);\nSTATIC int countsUndoLadder(DeltaVrec *DV);\nSTATIC int restoreUndoLadder(DeltaVrec *DV, REAL target[]);\nSTATIC int decrementUndoLadder(DeltaVrec *DV);\nSTATIC MYBOOL freeUndoLadder(DeltaVrec **DV);\n\n/* Specialized presolve undo functions */\nSTATIC MYBOOL appendUndoPresolve(lprec *lp, MYBOOL isprimal, REAL beta, int colnrDep);\nSTATIC MYBOOL addUndoPresolve(lprec *lp, MYBOOL isprimal, int colnrElim, REAL alpha, REAL beta, int colnrDep);\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* HEADER_lp_matrix */\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_mipbb.c",
    "content": "\n/*\n    Mixed integer programming optimization drivers for lp_solve v5.0+\n   ----------------------------------------------------------------------------------\n    Author:        Michel Berkelaar (to lp_solve v3.2)\n                   Kjell Eikland    (v4.0 and forward)\n    Contact:\n    License terms: LGPL.\n\n    Requires:      string.h, float.h, commonlib.h, lp_lib.h, lp_report.h,\n                   lp_simplex.h\n\n    Release notes:\n    v5.0.0 31 January 2004      New unit isolating B&B routines.\n    v5.0.1 01 February 2004     Complete rewrite into non-recursive version.\n    v5.0.2 05 April 2004        Expanded pseudocosting with options for MIP fraction\n                                counts and \"cost/benefit\" ratio (KE special!).\n                                Added GUB functionality based on SOS structures.\n    v5.0.3    1 May 2004        Changed routine names to be more intuitive.\n    v5.0.4    15 May 2004       Added functinality to pack bounds in order to\n                                conserve memory in B&B-processing large MIP models.\n    v5.1.0    25 July 2004      Added functions for dynamic cut generation.\n    v5.2.0    15 December 2004  Added functions for reduced cost variable fixing\n                                and converted to delta-model of B&B bound storage.\n   ----------------------------------------------------------------------------------\n*/\n\n#include <string.h>\n#include <float.h>\n#include \"commonlib.h\"\n#include \"lp_lib.h\"\n#include \"lp_scale.h\"\n#include \"lp_report.h\"\n#include \"lp_simplex.h\"\n#include \"lp_mipbb.h\"\n\n#ifdef FORTIFY\n# include \"lp_fortify.h\"\n#endif\n\n\n/* Allocation routine for the BB record structure */\nSTATIC BBrec *create_BB(lprec *lp, BBrec *parentBB, MYBOOL dofullcopy)\n{\n  BBrec *newBB;\n\n  newBB = (BBrec *) calloc(1, sizeof(*newBB));\n  if(newBB != NULL) {\n\n    if(parentBB == NULL) {\n      allocREAL(lp, &newBB->upbo,  lp->sum + 1, FALSE);\n      allocREAL(lp, &newBB->lowbo, lp->sum + 1, FALSE);\n      MEMCOPY(newBB->upbo,  lp->orig_upbo,  lp->sum + 1);\n      MEMCOPY(newBB->lowbo, lp->orig_lowbo, lp->sum + 1);\n    }\n    else if(dofullcopy) {\n      allocREAL(lp, &newBB->upbo,  lp->sum + 1, FALSE);\n      allocREAL(lp, &newBB->lowbo, lp->sum + 1, FALSE);\n      MEMCOPY(newBB->upbo,  parentBB->upbo,  lp->sum + 1);\n      MEMCOPY(newBB->lowbo, parentBB->lowbo, lp->sum + 1);\n    }\n    else {\n      newBB->upbo  = parentBB->upbo;\n      newBB->lowbo = parentBB->lowbo;\n    }\n    newBB->contentmode = dofullcopy;\n\n    newBB->lp = lp;\n\n    /* Set parent by default, but not child */\n    newBB->parent = parentBB;\n\n  }\n  return( newBB );\n}\n\n\n/* Pushing and popping routines for the B&B structure */\n\nSTATIC BBrec *push_BB(lprec *lp, BBrec *parentBB, int varno, int vartype, int varcus)\n/* Push ingoing bounds and B&B data onto the stack */\n{\n  BBrec *newBB;\n\n  /* Do initialization and updates */\n  if(parentBB == NULL)\n    parentBB = lp->bb_bounds;\n  newBB = create_BB(lp, parentBB, FALSE);\n  if(newBB != NULL) {\n\n    newBB->varno = varno;\n    newBB->vartype = vartype;\n    newBB->lastvarcus = varcus;\n    incrementUndoLadder(lp->bb_lowerchange);\n    newBB->LBtrack++;\n    incrementUndoLadder(lp->bb_upperchange);\n    newBB->UBtrack++;\n\n    /* Adjust variable fixing/bound tightening based on the last reduced cost */\n    if((parentBB != NULL) && (parentBB->lastrcf > 0)) {\n      MYBOOL isINT;\n      int    k, ii, nfixed = 0, ntighten = 0;\n      REAL   deltaUL;\n\n      for(k = 1; k <= lp->nzdrow[0]; k++) {\n        ii = lp->nzdrow[k];\n#ifdef UseMilpSlacksRCF  /* Check if we should include ranged constraints */\n        isINT = FALSE;\n#else\n        if(ii <= lp->rows)\n          continue;\n        isINT = is_int(lp, ii-lp->rows);\n#endif\n#ifndef UseMilpExpandedRCF  /* Don't include non-integers if it is not defined */\n        if(!isINT)\n          continue;\n#endif\n        switch(abs(rcfbound_BB(newBB, ii, isINT, &deltaUL, NULL))) {\n          case LE: SETMIN(deltaUL, newBB->upbo[ii]);\n                   SETMAX(deltaUL, newBB->lowbo[ii]);\n                   modifyUndoLadder(lp->bb_upperchange, ii, newBB->upbo, deltaUL);\n                   break;\n          case GE: SETMAX(deltaUL, newBB->lowbo[ii]);\n                   SETMIN(deltaUL, newBB->upbo[ii]);\n                   modifyUndoLadder(lp->bb_lowerchange, ii, newBB->lowbo, deltaUL);\n                   break;\n          default: continue;\n        }\n        if(newBB->upbo[ii] == newBB->lowbo[ii])\n          nfixed++;\n        else\n          ntighten++;\n      }\n      if(lp->bb_trace) {\n        report(lp, DETAILED,\n                 \"push_BB: Used reduced cost to fix %d variables and tighten %d bounds\\n\",\n                  nfixed, ntighten);\n      }\n    }\n\n    /* Handle case where we are pushing at the end */\n    if(parentBB == lp->bb_bounds)\n      lp->bb_bounds = newBB;\n    /* Handle case where we are pushing in the middle */\n    else\n      newBB->child = parentBB->child;\n    if(parentBB != NULL)\n      parentBB->child = newBB;\n\n    lp->bb_level++;\n    if(lp->bb_level > lp->bb_maxlevel)\n      lp->bb_maxlevel = lp->bb_level;\n\n    if(!initbranches_BB(newBB))\n      newBB = pop_BB(newBB);\n    else if(MIP_count(lp) > 0) {\n      if( (lp->bb_level <= 1) && (lp->bb_varactive == NULL) &&\n          (!allocINT(lp, &lp->bb_varactive, lp->columns+1, TRUE) ||\n           !initcuts_BB(lp)) )\n        newBB = pop_BB(newBB);\n      if(varno > 0) {\n        lp->bb_varactive[varno-lp->rows]++;\n      }\n    }\n  }\n  return( newBB );\n}\n\nSTATIC MYBOOL free_BB(BBrec **BB)\n{\n  MYBOOL parentreturned = FALSE;\n\n  if((BB != NULL) && (*BB != NULL)) {\n    BBrec *parent = (*BB)->parent;\n\n    if((parent == NULL) || (*BB)->contentmode) {\n      FREE((*BB)->upbo);\n      FREE((*BB)->lowbo);\n    }\n    FREE((*BB)->varmanaged);\n    FREE(*BB);\n\n    parentreturned = (MYBOOL) (parent != NULL);\n    if(parentreturned)\n      *BB = parent;\n\n  }\n  return( parentreturned );\n}\n\nSTATIC BBrec *pop_BB(BBrec *BB)\n/* Pop / free the previously \"pushed\" / saved bounds */\n{\n  int   k;\n  BBrec *parentBB;\n  lprec *lp = BB->lp;\n\n  if(BB == NULL)\n    return( BB );\n\n  /* Handle case where we are popping the end of the chain */\n  parentBB = BB->parent;\n  if(BB == lp->bb_bounds) {\n    lp->bb_bounds = parentBB;\n    if(parentBB != NULL)\n      parentBB->child = NULL;\n  }\n  /* Handle case where we are popping inside or at the beginning of the chain */\n  else {\n    if(parentBB != NULL)\n      parentBB->child = BB->child;\n    if(BB->child != NULL)\n      BB->child->parent = parentBB;\n  }\n\n  /* Unwind other variables */\n  if(lp->bb_upperchange != NULL) {\n    restoreUndoLadder(lp->bb_upperchange, BB->upbo);\n    for(; BB->UBtrack > 0; BB->UBtrack--) {\n      decrementUndoLadder(lp->bb_upperchange);\n      restoreUndoLadder(lp->bb_upperchange, BB->upbo);\n    }\n  }\n  if(lp->bb_lowerchange != NULL) {\n    restoreUndoLadder(lp->bb_lowerchange, BB->lowbo);\n    for(; BB->LBtrack > 0; BB->LBtrack--) {\n      decrementUndoLadder(lp->bb_lowerchange);\n      restoreUndoLadder(lp->bb_lowerchange, BB->lowbo);\n    }\n  }\n  lp->bb_level--;\n  k = BB->varno - lp->rows;\n  if(lp->bb_level == 0) {\n    if(lp->bb_varactive != NULL) {\n      FREE(lp->bb_varactive);\n      freecuts_BB(lp);\n    }\n    if(lp->int_vars+lp->sc_vars > 0)\n      free_pseudocost(lp);\n    pop_basis(lp, FALSE);\n    lp->rootbounds = NULL;\n  }\n  else\n    lp->bb_varactive[k]--;\n\n  /* Undo SOS/GUB markers */\n  if(BB->isSOS && (BB->vartype != BB_INT))\n    SOS_unmark(lp->SOS, 0, k);\n  else if(BB->isGUB)\n    SOS_unmark(lp->GUB, 0, k);\n\n  /* Undo the SC marker */\n  if(BB->sc_canset)\n    lp->sc_lobound[k] *= -1;\n\n  /* Pop the associated basis */\n#if 1\n  /* Original version that does not restore previous basis */\n  pop_basis(lp, FALSE);\n#else\n  /* Experimental version that restores previous basis */\n  pop_basis(lp, BB->isSOS);\n#endif\n\n  /* Finally free the B&B object */\n  free_BB(&BB);\n\n  /* Return the parent BB */\n  return( parentBB );\n}\n\n/* Here are heuristic routines to see if we need bother with branching further\n\n    1. A probing routine to see of the best OF can be better than incumbent\n    2. A presolve routine to fix other variables and detect infeasibility\n\n   THIS IS INACTIVE CODE, PLACEHOLDERS FOR FUTURE DEVELOPMENT!!! */\nSTATIC REAL probe_BB(BBrec *BB)\n{\n  int  i, ii;\n  REAL coefOF, sum = 0;\n  lprec *lp = BB->lp;\n\n  /* Loop over all ints to see if the best possible solution\n     stands any chance of being better than the incumbent solution */\n  if(lp->solutioncount == 0)\n    return( lp->infinite );\n  for(i = 1; i <= lp->columns; i++) {\n    if(!is_int(lp, i))\n      continue;\n    ii = lp->rows + i;\n    coefOF = lp->obj[i];\n    if(coefOF < 0) {\n      if(is_infinite(lp, BB->lowbo[ii]))\n        return( lp->infinite );\n      sum += coefOF * (lp->solution[ii]-BB->lowbo[ii]);\n    }\n    else {\n      if(is_infinite(lp, BB->upbo[ii]))\n        return( lp->infinite );\n      sum += coefOF * (BB->upbo[ii] - lp->solution[ii]);\n    }\n  }\n  return( sum );\n}\n\nSTATIC REAL presolve_BB(BBrec *BB)\n{\n  return( 0 );\n}\n\n/* Node and branch management routines */\nSTATIC MYBOOL initbranches_BB(BBrec *BB)\n{\n  REAL   new_bound, temp;\n  int    k;\n  lprec  *lp = BB->lp;\n\n /* Create and initialize local bounds and basis */\n  BB->nodestatus = NOTRUN;\n  BB->noderesult = lp->infinite;\n  push_basis(lp, NULL, NULL, NULL);\n\n /* Set default number of branches at the current B&B branch */\n  if(BB->vartype == BB_REAL)\n    BB->nodesleft = 1;\n\n  else {\n   /* The default is a binary up-low branching */\n    BB->nodesleft = 2;\n\n   /* Initialize the MIP status code pair and set reference values */\n    k = BB->varno - lp->rows;\n    BB->lastsolution = lp->solution[BB->varno];\n\n   /* Determine if we must process in the B&B SOS mode */\n    BB->isSOS = (MYBOOL) ((BB->vartype == BB_SOS) || SOS_is_member(lp->SOS, 0, k));\n#ifdef Paranoia\n    if((BB->vartype == BB_SOS) && !SOS_is_member(lp->SOS, 0, k))\n      report(lp, SEVERE, \"initbranches_BB: Inconsistent identification of SOS variable %s (%d)\\n\",\n                         get_col_name(lp, k), k);\n#endif\n\n   /* Check if we have a GUB-member variable that needs a triple-branch */\n    BB->isGUB = (MYBOOL) ((BB->vartype == BB_INT) && SOS_can_activate(lp->GUB, 0, k));\n    if(BB->isGUB) {\n      /* Obtain variable index list from applicable GUB - now the first GUB is used,\n        but we could also consider selecting the longest */\n      BB->varmanaged = SOS_get_candidates(lp->GUB, -1, k, TRUE, BB->upbo, BB->lowbo);\n      BB->nodesleft++;\n    }\n\n\n   /* Set local pruning info, automatic, or user-defined strategy */\n    if(BB->vartype == BB_SOS) {\n      if(!SOS_can_activate(lp->SOS, 0, k)) {\n        BB->nodesleft--;\n        BB->isfloor = TRUE;\n      }\n      else\n        BB->isfloor = (MYBOOL) (BB->lastsolution == 0);\n    }\n\n    /* First check if the user wishes to select the branching direction */\n    else if(lp->bb_usebranch != NULL)\n      BB->isfloor = (MYBOOL) lp->bb_usebranch(lp, lp->bb_branchhandle, k);\n\n    /* Otherwise check if we should do automatic branching */\n    else if(get_var_branch(lp, k) == BRANCH_AUTOMATIC) {\n      new_bound = modf(BB->lastsolution/get_pseudorange(lp->bb_PseudoCost, k, BB->vartype), &temp);\n      if(isnan(new_bound))\n        new_bound = 0;\n      else if(new_bound < 0)\n        new_bound += 1.0;\n      BB->isfloor = (MYBOOL) (new_bound <= 0.5);\n\n      /* Set direction by OF value; note that a zero-value in\n         the OF gives priority to floor_first = TRUE */\n      if(is_bb_mode(lp, NODE_GREEDYMODE)) {\n        if(is_bb_mode(lp, NODE_PSEUDOCOSTMODE))\n          BB->sc_bound = get_pseudonodecost(lp->bb_PseudoCost, k, BB->vartype, BB->lastsolution);\n        else\n          BB->sc_bound = mat_getitem(lp->matA, 0, k);\n        new_bound -= 0.5;\n        BB->sc_bound *= new_bound;\n        BB->isfloor = (MYBOOL) (BB->sc_bound > 0);\n      }\n      /* Set direction by pseudocost (normally used in tandem with NODE_PSEUDOxxxSELECT) */\n      else if(is_bb_mode(lp, NODE_PSEUDOCOSTMODE)) {\n        BB->isfloor = (MYBOOL) (get_pseudobranchcost(lp->bb_PseudoCost, k, TRUE) >\n                                get_pseudobranchcost(lp->bb_PseudoCost, k, FALSE));\n        if(is_maxim(lp))\n          BB->isfloor = !BB->isfloor;\n      }\n\n      /* Check for reversal */\n      if(is_bb_mode(lp, NODE_BRANCHREVERSEMODE))\n        BB->isfloor = !BB->isfloor;\n    }\n    else\n      BB->isfloor = (MYBOOL) (get_var_branch(lp, k) == BRANCH_FLOOR);\n\n    /* SC logic: If the current SC variable value is in the [0..NZLOBOUND> range, then\n\n      UP: Set lower bound to NZLOBOUND, upper bound is the original\n      LO: Fix the variable by setting upper/lower bound to zero\n\n      ... indicate that the variable is B&B-active by reversing sign of sc_lobound[]. */\n    new_bound = fabs(lp->sc_lobound[k]);\n    BB->sc_bound = new_bound;\n    BB->sc_canset = (MYBOOL) (new_bound != 0);\n\n   /* Must make sure that we handle fractional lower bounds properly;\n      also to ensure that we do a full binary tree search */\n    new_bound = unscaled_value(lp, new_bound, BB->varno);\n    if(is_int(lp, k) && ((new_bound > 0) &&\n                         (BB->lastsolution > floor(new_bound)))) {\n      if(BB->lastsolution < ceil(new_bound))\n        BB->lastsolution += 1;\n      modifyUndoLadder(lp->bb_lowerchange, BB->varno, BB->lowbo,\n                       scaled_floor(lp, BB->varno, BB->lastsolution, 1));\n    }\n  }\n\n  /* Now initialize the brances and set to first */\n  return( fillbranches_BB(BB) );\n}\n\nSTATIC MYBOOL fillbranches_BB(BBrec *BB)\n{\n  int    K, k;\n  REAL   ult_upbo, ult_lowbo;\n  REAL   new_bound, SC_bound, intmargin = BB->lp->epsprimal;\n  lprec  *lp = BB->lp;\n  MYBOOL OKstatus = FALSE;\n\n  if(lp->bb_break || userabort(lp, MSG_MILPSTRATEGY))\n    return( OKstatus );\n\n  K = BB->varno;\n  if(K > 0) {\n\n  /* Shortcut variables */\n    k = BB->varno - lp->rows;\n    ult_upbo  = lp->orig_upbo[K];\n    ult_lowbo = lp->orig_lowbo[K];\n    SC_bound  = unscaled_value(lp, BB->sc_bound, K);\n\n    /* First, establish the upper bound to be applied (when isfloor == TRUE)\n       --------------------------------------------------------------------- */\n/*SetUB:*/\n    BB->UPbound = lp->infinite;\n\n    /* Handle SC-variables for the [0-LoBound> range */\n    if((SC_bound > 0) && (fabs(BB->lastsolution) < SC_bound-intmargin)) {\n      new_bound = 0;\n    }\n    /* Handle pure integers (non-SOS, non-SC) */\n    else if(BB->vartype == BB_INT) {\n#if 1\n      if(((ult_lowbo >= 0) &&\n          ((floor(BB->lastsolution) < /* Skip cases where the lower bound becomes violated */\n            unscaled_value(lp, MAX(ult_lowbo, fabs(lp->sc_lobound[k])), K)-intmargin))) ||\n         ((ult_upbo <= 0) &&   /*  Was  ((ult_lowbo < 0) && */\n          ((floor(BB->lastsolution) > /* Skip cases where the upper bound becomes violated */\n            unscaled_value(lp, MIN(ult_upbo, -fabs(lp->sc_lobound[k])), K)-intmargin)))) {\n#else\n      if((floor(BB->lastsolution) <  /* Skip cases where the lower bound becomes violated */\n          unscaled_value(lp, MAX(ult_lowbo, fabs(lp->sc_lobound[k])), K)-intmargin)) {\n#endif\n        BB->nodesleft--;\n        goto SetLB;\n      }\n      new_bound = scaled_floor(lp, K, BB->lastsolution, 1);\n    }\n    else if(BB->isSOS) {           /* Handle all SOS variants */\n      new_bound = ult_lowbo;\n      if(is_int(lp, k))\n        new_bound = scaled_ceil(lp, K, unscaled_value(lp, new_bound, K), -1);\n    }\n    else                           /* Handle all other variable incarnations */\n      new_bound = BB->sc_bound;\n\n    /* Check if the new bound might conflict and possibly make adjustments */\n    if(new_bound < BB->lowbo[K])\n      new_bound = BB->lowbo[K] - my_avoidtiny(new_bound-BB->lowbo[K], intmargin);\n    if(new_bound < BB->lowbo[K]) {\n#ifdef Paranoia\n      debug_print(lp,\n          \"fillbranches_BB: New upper bound value %g conflicts with old lower bound %g\\n\",\n          new_bound, BB->lowbo[K]);\n#endif\n      BB->nodesleft--;\n      goto SetLB;\n    }\n#ifdef Paranoia\n    /* Do additional consistency checking */\n    else if(!check_if_less(lp, new_bound, BB->upbo[K], K)) {\n      BB->nodesleft--;\n      goto SetLB;\n    }\n#endif\n    /* Bound (at least near) feasible */\n    else {\n      /* Makes a difference with models like QUEEN\n         (note consistent use of epsint for scaled integer variables) */\n      if(fabs(new_bound - BB->lowbo[K]) < intmargin*SCALEDINTFIXRANGE)\n        new_bound = BB->lowbo[K];\n    }\n\n    BB->UPbound = new_bound;\n\n\n    /* Next, establish the lower bound to be applied (when isfloor == FALSE)\n       --------------------------------------------------------------------- */\nSetLB:\n    BB->LObound = -lp->infinite;\n\n    /* Handle SC-variables for the [0-LoBound> range */\n    if((SC_bound > 0) && (fabs(BB->lastsolution) < SC_bound)) {\n      if(is_int(lp, k))\n        new_bound = scaled_ceil(lp, K, SC_bound, 1);\n      else\n        new_bound = BB->sc_bound;\n    }\n    /* Handle pure integers (non-SOS, non-SC, but Ok for GUB!) */\n    else if((BB->vartype == BB_INT)) {\n      if(((ceil(BB->lastsolution) == BB->lastsolution)) ||    /* Skip branch 0 if the current solution is integer */\n         (ceil(BB->lastsolution) >   /* Skip cases where the upper bound becomes violated */\n          unscaled_value(lp, ult_upbo, K)+intmargin) ||\n          (BB->isSOS && (BB->lastsolution == 0))) {           /* Don't branch 0 since this is handled in SOS logic */\n        BB->nodesleft--;\n        goto Finish;\n      }\n      new_bound = scaled_ceil(lp, K, BB->lastsolution, 1);\n    }\n    else if(BB->isSOS) {             /* Handle all SOS variants */\n      if(SOS_is_member_of_type(lp->SOS, k, SOS3))\n        new_bound = scaled_floor(lp, K, 1, 1);\n      else {\n        new_bound = ult_lowbo;\n        if(is_int(lp, k))\n          new_bound = scaled_floor(lp, K, unscaled_value(lp, new_bound, K), 1);\n        /* If we have a high-order SOS (SOS3+) and this variable is \"intermediate\"\n          between members previously lower-bounded at a non-zero level, then we should\n          set this and similar neighbouring variables at non-zero lowbo-values (remember\n          that SOS3+ members are all either integers or semi-continuous). Flag this\n          situation and prune tree, since we cannot lower-bound. */\n        if((lp->SOS->maxorder > 2) && (BB->lastsolution == 0) &&\n           SOS_is_member_of_type(lp->SOS, k, SOSn)) {\n          BB->isSOS = AUTOMATIC;\n        }\n      }\n    }\n    else                              /* Handle all other variable incarnations */\n      new_bound = BB->sc_bound;\n\n    /* Check if the new bound might conflict and possibly make adjustments */\n    if(new_bound > BB->upbo[K])\n      new_bound = BB->upbo[K] + my_avoidtiny(new_bound-BB->upbo[K], intmargin);\n    if(new_bound > BB->upbo[K]) {\n#ifdef Paranoia\n      debug_print(lp,\n        \"fillbranches_BB: New lower bound value %g conflicts with old upper bound %g\\n\",\n        new_bound, BB->upbo[K]);\n#endif\n      BB->nodesleft--;\n      goto Finish;\n    }\n#ifdef Paranoia\n    /* Do additional consistency checking */\n    else if(!check_if_less(lp, BB->lowbo[K], new_bound, K)) {\n      BB->nodesleft--;\n      goto Finish;\n    }\n#endif\n    /* Bound (at least near-)feasible */\n    else {\n      /* Makes a difference with models like QUEEN\n         (note consistent use of lp->epsprimal for scaled integer variables) */\n      if(fabs(BB->upbo[K]-new_bound) < intmargin*SCALEDINTFIXRANGE)\n        new_bound = BB->upbo[K];\n    }\n\n    BB->LObound = new_bound;\n\n    /* Prepare for the first branch by making sure we are pointing correctly */\nFinish:\n    if(BB->nodesleft > 0) {\n\n      /* Make sure the change tracker levels are \"clean\" for the B&B */\n      if(countsUndoLadder(lp->bb_upperchange) > 0) {\n        incrementUndoLadder(lp->bb_upperchange);\n        BB->UBtrack++;\n      }\n      if(countsUndoLadder(lp->bb_lowerchange) > 0) {\n        incrementUndoLadder(lp->bb_lowerchange);\n        BB->LBtrack++;\n      }\n\n      /* Do adjustments */\n      if((BB->vartype != BB_SOS) && (fabs(BB->LObound-BB->UPbound) < intmargin)) {\n        BB->nodesleft--;\n        if(fabs(BB->lowbo[K]-BB->LObound) < intmargin)\n          BB->isfloor = FALSE;\n        else if(fabs(BB->upbo[K]-BB->UPbound) < intmargin)\n          BB->isfloor = TRUE;\n        else\n          report(BB->lp, IMPORTANT, \"fillbranches_BB: Inconsistent equal-valued bounds for %s\\n\",\n                                    get_col_name(BB->lp, k));\n      }\n      if((BB->nodesleft == 1) &&\n         ((BB->isfloor && (BB->UPbound >= lp->infinite)) ||\n          (!BB->isfloor && (BB->LObound <= -lp->infinite))))\n        BB->isfloor = !BB->isfloor;\n      /* Header initialization */\n      BB->isfloor = !BB->isfloor;\n      while(!OKstatus && /* !userabort(lp, -1) */ lp->spx_status != TIMEOUT && !lp->bb_break && (BB->nodesleft > 0))\n        OKstatus = nextbranch_BB( BB );\n    }\n\n    /* Set an SC variable active, if necessary */\n    if(BB->sc_canset)\n      lp->sc_lobound[k] *= -1;\n\n  }\n  else {\n    BB->nodesleft--;\n    OKstatus = TRUE;\n  }\n\n  return( OKstatus );\n}\n\nSTATIC MYBOOL nextbranch_BB(BBrec *BB)\n{\n  int    k;\n  lprec  *lp = BB->lp;\n  MYBOOL OKstatus = FALSE;\n\n  /* Undo the most recently imposed B&B bounds using the data\n     in the last level of change tracker; this code handles changes\n     to both upper and lower bounds */\n  if(BB->nodessolved > 0) {\n      restoreUndoLadder(lp->bb_upperchange, BB->upbo);\n      restoreUndoLadder(lp->bb_lowerchange, BB->lowbo);\n  }\n\n  if(lp->bb_break || userabort(lp, MSG_MILPSTRATEGY)) {\n    /* Handle the special case of B&B restart;\n       (typically used with the restart after pseudocost initialization) */\n    if((lp->bb_level == 1) && (lp->bb_break == AUTOMATIC)) {\n      lp->bb_break = FALSE;\n      OKstatus = TRUE;\n    }\n    return( OKstatus );\n  }\n\n  if(BB->nodesleft > 0) {\n\n    /* Step and update remaining branch count */\n    k = BB->varno - lp->rows;\n    BB->isfloor = !BB->isfloor;\n    BB->nodesleft--;\n\n    /* Special SOS handling:\n       1) Undo and set new marker for k,\n       2) In case that previous branch was ceiling restore upper bounds of the\n          non-k variables outside of the SOS window set to 0 */\n    if(BB->isSOS && (BB->vartype != BB_INT)) {\n\n      /* First undo previous marker */\n      if((BB->nodessolved > 0) || ((BB->nodessolved == 0) && (BB->nodesleft == 0))) {\n        if(BB->isfloor) {\n          if((BB->nodesleft == 0) && (lp->orig_lowbo[BB->varno] != 0))\n            return( OKstatus );\n        }\n        SOS_unmark(lp->SOS, 0, k);\n      }\n\n      /* Set new SOS marker */\n      if(BB->isfloor) {\n        SOS_set_marked(lp->SOS, 0, k, (MYBOOL) (BB->UPbound != 0));\n        /* Do case of high-order SOS where intervening variables need to be set */\n        if(BB->isSOS == AUTOMATIC) {\n\n/*          SOS_fix_list(lp->SOS, 0, k, BB->lowbo, NULL, AUTOMATIC, lp->bb_lowerchange); */\n        }\n      }\n      else {\n        SOS_set_marked(lp->SOS, 0, k, TRUE);\n        if(SOS_fix_unmarked(lp->SOS, 0, k, BB->upbo, 0, TRUE,\n                            NULL, lp->bb_upperchange) < 0)\n          return( OKstatus );\n      }\n    }\n\n    /* Special GUB handling (three branches):\n       1) Undo and set new marker for k,\n       2) Restore upper bounds of the left/right/all non-k variables\n          set to 0 in the previous branch\n       3) Set new upper bounds for the non-k variables (k is set later) */\n    else if(BB->isGUB) {\n\n      /* First undo previous marker */\n      if(BB->nodessolved > 0)\n        SOS_unmark(lp->GUB, 0, k);\n\n      /* Make sure we take floor bound twice */\n      if((BB->nodesleft == 0) && !BB->isfloor)\n        BB->isfloor = !BB->isfloor;\n\n      /* Handle two floor instances;\n         (selected variable and left/right halves of non-selected variables at 0) */\n      SOS_set_marked(lp->GUB, 0, k, (MYBOOL) !BB->isfloor);\n      if(BB->isfloor) {\n        if(SOS_fix_list(lp->GUB, 0, k, BB->upbo,\n                        BB->varmanaged, (MYBOOL) (BB->nodesleft > 0), lp->bb_upperchange) < 0)\n          return( OKstatus );\n      }\n      /* Handle one ceil instance;\n         (selected variable at 1, all other at 0) */\n      else {\n        if(SOS_fix_unmarked(lp->GUB, 0, k, BB->upbo, 0, TRUE,\n                            NULL, lp->bb_upperchange) < 0)\n          return( OKstatus );\n      }\n    }\n\n    OKstatus = TRUE;\n\n  }\n  /* Initialize simplex status variables */\n  if(OKstatus) {\n    lp->bb_totalnodes++;\n    BB->nodestatus = NOTRUN;\n    BB->noderesult = lp->infinite;\n  }\n  return( OKstatus );\n}\n\n\n/* Cut generation and management routines */\nSTATIC MYBOOL initcuts_BB(lprec *lp)\n{\n  return( TRUE );\n}\n\nSTATIC int updatecuts_BB(lprec *lp)\n{\n  return( 0 );\n}\n\nSTATIC MYBOOL freecuts_BB(lprec *lp)\n{\n  if(lp->bb_cuttype != NULL)\n    FREE(lp->bb_cuttype);\n  return( TRUE );\n}\n\n/* B&B solver routines */\nSTATIC int solve_LP(lprec *lp, BBrec *BB)\n{\n  int    tilted, restored, status;\n  REAL   testOF, *upbo = BB->upbo, *lowbo = BB->lowbo;\n  BBrec  *perturbed = NULL;\n\n  if(lp->bb_break)\n    return(PROCBREAK);\n\n#ifdef Paranoia\n  debug_print(lp, \"solve_LP: Starting solve for iter %.0f, B&B node level %d.\\n\",\n                   (double) lp->total_iter, lp->bb_level);\n  if(lp->bb_trace &&\n     !validate_bounds(lp, upbo, lowbo))\n    report(lp, SEVERE, \"solve_LP: Inconsistent bounds at iter %.0f, B&B node level %d.\\n\",\n                       (double) lp->total_iter, lp->bb_level);\n#endif\n\n  /* Copy user-specified entering bounds into lp_solve working bounds */\n  impose_bounds(lp, upbo, lowbo);\n\n  /* Restore previously pushed / saved basis for this level if we are in\n     the B&B mode and it is not the first call of the binary tree */\n  if(BB->nodessolved > 1)\n    restore_basis(lp);\n\n  /* Solve and possibly handle degeneracy cases via bound relaxations */\n  status   = RUNNING;\n  tilted   = 0;\n  restored = 0;\n\n  while(status == RUNNING) {\n\n    /* Copy user-specified entering bounds into lp_solve working bounds and run */\n    status = spx_run(lp, (MYBOOL) (tilted+restored > 0));\n    lp->bb_status     = status;\n    lp->spx_perturbed = FALSE;\n\n    if(tilted < 0)\n      break;\n\n    else if((status == OPTIMAL) && (tilted > 0)) {\n      if(lp->spx_trace)\n        report(lp, DETAILED, \"solve_LP: Restoring relaxed bounds at level %d.\\n\",\n                              tilted);\n\n    /* Restore original pre-perturbed problem bounds, and solve again using the basis\n       found for the perturbed problem; also make sure we rebase and recompute. */\n      free_BB(&perturbed);\n      if((perturbed == NULL) || (perturbed == BB)) {\n        perturbed = NULL;\n        impose_bounds(lp, upbo, lowbo);\n      }\n      else\n        impose_bounds(lp, perturbed->upbo, perturbed->lowbo);\n      set_action(&lp->spx_action, ACTION_REBASE | ACTION_RECOMPUTE);\n      BB->UBzerobased = FALSE;\n      if(lp->bb_totalnodes == 0)\n        lp->real_solution = lp->infinite;\n      status = RUNNING;\n      tilted--;\n      restored++;\n      lp->spx_perturbed = TRUE;\n    }\n\n    else if(((lp->bb_level <= 1) ||     is_anti_degen(lp, ANTIDEGEN_DURINGBB)) &&\n            (((status == LOSTFEAS) &&   is_anti_degen(lp, ANTIDEGEN_LOSTFEAS)) ||\n             ((status == INFEASIBLE) && is_anti_degen(lp, ANTIDEGEN_INFEASIBLE)) ||\n             ((status == NUMFAILURE) && is_anti_degen(lp, ANTIDEGEN_NUMFAILURE)) ||\n             ((status == DEGENERATE) && is_anti_degen(lp, ANTIDEGEN_STALLING)))) {\n     /* Allow up to .. consecutive relaxations for non-B&B phases */\n      if((tilted <= DEF_MAXRELAX) &&                       /* Conventional recovery case,...  */\n         !((tilted == 0) && (restored > DEF_MAXRELAX))) {  /* but not iterating infeasibility */\n\n        /* Create working copy of ingoing bounds if this is the first perturbation */\n        if(tilted == 0)\n          perturbed = BB;\n        perturbed = create_BB(lp, perturbed, TRUE);\n\n        /* Perturb/shift variable bounds; also make sure we rebase and recompute\n           (no refactorization is necessary, since the basis is unchanged) */\n#if 1\n        perturb_bounds(lp, perturbed, TRUE, TRUE, TRUE);\n#else\n        perturb_bounds(lp, perturbed, TRUE, TRUE, FALSE);\n#endif\n        impose_bounds(lp, perturbed->upbo, perturbed->lowbo);\n        set_action(&lp->spx_action, ACTION_REBASE | ACTION_RECOMPUTE);\n        BB->UBzerobased = FALSE;\n        status = RUNNING;\n        tilted++;\n        lp->perturb_count++;\n        lp->spx_perturbed = TRUE;\n        if(lp->spx_trace)\n          report(lp, DETAILED, \"solve_LP: Starting bound relaxation #%d ('%s')\\n\",\n                               tilted, get_statustext(lp, status));\n      }\n      else  {\n        if(lp->spx_trace)\n          report(lp, DETAILED, \"solve_LP: Relaxation limit exceeded in resolving infeasibility\\n\");\n        while((perturbed != NULL) && (perturbed != BB))\n          free_BB(&perturbed);\n        perturbed = NULL;\n      }\n    }\n  }\n\n  /* Handle the different simplex outcomes */\n  if(status != OPTIMAL) {\n    if(lp->bb_level <= 1)\n      lp->bb_parentOF = lp->infinite;\n    if((status == USERABORT) || (status == TIMEOUT)) {\n      /* Construct the last feasible solution, if available */\n      if((lp->solutioncount == 0) &&\n         /*\n            30/01/08 <peno> added MIP_count test because in following situation thing were wrong:\n             - The model contains integers\n             - A break at first is set\n             - A timeout is set\n             - The timeout occurs before a first integer solution is found\n             - When the timeout occurs, the simplex algorithm is in phase 2 and has a feasible (but non-integer) solution, but not optimal yet.\n            If above situation occurs then a (sub-optimal) solution was returned while no integer\n            solution isn't found yet at this time\n         */\n         (MIP_count(lp) == 0) &&\n         ((lp->simplex_mode & (SIMPLEX_Phase2_PRIMAL | SIMPLEX_Phase2_DUAL)) > 0)) {\n        lp->solutioncount++;\n        construct_solution(lp, NULL);\n        transfer_solution(lp, TRUE);\n      }\n      /* Return messages */\n      report(lp, NORMAL, \"\\nlp_solve optimization was stopped %s.\\n\",\n                         ((status == USERABORT) ? \"by the user\" : \"due to time-out\"));\n    }\n    else if(BB->varno == 0)\n      report(lp, NORMAL, \"The model %s\\n\",\n      (status == UNBOUNDED) ? \"is UNBOUNDED\" :\n      ((status == INFEASIBLE) ? \"is INFEASIBLE\" : \"FAILED\"));\n    else {\n#ifdef Paranoia\n      if((status != FATHOMED) && (status != INFEASIBLE))\n        report(lp, SEVERE, \"spx_solve: Invalid return code %d during B&B\\n\", status);\n#endif\n      /* If we fathomed a node due to an inferior OF having been detected, return infeasible */\n      if(status == FATHOMED)\n        lp->spx_status = INFEASIBLE;\n    }\n  }\n\n  else { /* ... there is a good solution */\n    construct_solution(lp, NULL);\n    if((lp->bb_level <= 1) && (restored > 0))\n      report(lp, DETAILED, \"%s numerics encountered; validate accuracy\\n\",\n                 (restored == 1) ? \"Difficult\" : \"Severe\");\n    /* Handle case where a user bound on the OF was found to\n       have been set too aggressively, giving an infeasible model */\n    if(lp->spx_status != OPTIMAL)\n      status = lp->spx_status;\n\n    else if((lp->bb_totalnodes == 0) && (MIP_count(lp) > 0)) {\n      if(lp->lag_status != RUNNING) {\n        report(lp, NORMAL, \"\\nRelaxed solution  \" RESULTVALUEMASK \" after %10.0f iter is B&B base.\\n\",\n                           lp->solution[0], (double) lp->total_iter);\n        report(lp, NORMAL, \" \\n\");\n      }\n      if((lp->usermessage != NULL) && (lp->msgmask & MSG_LPOPTIMAL)) {\n        REAL *best_solution = lp->best_solution;\n\n        /* transfer_solution(lp, TRUE); */\n        lp->best_solution = lp->solution;\n        lp->usermessage(lp, lp->msghandle, MSG_LPOPTIMAL);\n        lp->best_solution = best_solution;\n      }\n      set_var_priority(lp);\n    }\n\n   /* Check if we have a numeric problem (an earlier version of this code used the\n      absolute difference, but it is not robust for large-valued OFs) */\n    testOF = my_chsign(is_maxim(lp), my_reldiff(lp->solution[0], lp->real_solution));\n    if(testOF < -lp->epsprimal) {\n      report(lp, DETAILED, \"solve_LP: A MIP subproblem returned a value better than the base.\\n\");\n      status = INFEASIBLE;\n      lp->spx_status = status;\n      set_action(&lp->spx_action, ACTION_REBASE | ACTION_REINVERT | ACTION_RECOMPUTE);\n    }\n    else if(testOF < 0)  /* Avoid problems later (could undo integer roundings, but usually Ok) */\n      lp->solution[0] = lp->real_solution;\n\n  }\n\n  /* status can have the following values:\n     OPTIMAL, SUBOPTIMAL, TIMEOUT, USERABORT, PROCFAIL, UNBOUNDED and INFEASIBLE. */\n\n  return( status );\n} /* solve_LP */\n\nSTATIC BBrec *findself_BB(BBrec *BB)\n{\n  int   varno = BB->varno, vartype = BB->vartype;\n\n  BB = BB->parent;\n  while((BB != NULL) && (BB->vartype != vartype) && (BB->varno != varno))\n    BB = BB->parent;\n  return( BB );\n}\n\n/* Function to determine the opportunity for variable fixing and bound\n   tightening based on a previous best MILP solution and a variable's\n   reduced cost at the current relaxation - inspired by Wolsley */\nSTATIC int rcfbound_BB(BBrec *BB, int varno, MYBOOL isINT, REAL *newbound, MYBOOL *isfeasible)\n{\n  int   i = FR;\n  lprec *lp = BB->lp;\n  REAL  deltaRC, rangeLU, deltaOF, lowbo, upbo;\n\n  /* Make sure we only accept non-basic variables */\n  if(lp->is_basic[varno])\n    return( i );\n\n  /* Make sure we only accept non-fixed variables */\n  lowbo = BB->lowbo[varno];\n  upbo  = BB->upbo[varno];\n  rangeLU = upbo - lowbo;\n\n  if(rangeLU > lp->epsprimal) {\n#if 1      /* v5.5 problematic - Gap between current node and the current best bound */\n    deltaOF = lp->rhs[0] - lp->bb_workOF;\n#elif 0    /* v6 less aggressive - Gap between current best bound and the relaxed problem */\n    deltaOF = my_chsign(is_maxim(lp), lp->real_solution) - lp->bb_workOF;\n#else      /* v6 more aggressive - Gap between current node and the relaxed problem */\n    deltaOF = my_chsign(is_maxim(lp), lp->real_solution) - lp->rhs[0];\n#endif\n\n    deltaRC = my_chsign(!lp->is_lower[varno], lp->drow[varno]);\n    /* Protect against divisions with tiny numbers and stray sign\n       reversals of the reduced cost */\n    if(deltaRC < lp->epspivot)\n      return( i );\n    deltaRC = deltaOF / deltaRC;  /* Should always be a positive number! */\n#ifdef Paranoia\n    if(deltaRC <= 0)\n      report(lp, SEVERE, \"rcfbound_BB: A negative bound fixing level was encountered after node %.0f\\n\",\n                         (double) lp->bb_totalnodes);\n#endif\n\n    /* Check if bound implied by the reduced cost is less than existing range */\n    if(deltaRC < rangeLU + lp->epsint) {\n      if(lp->is_lower[varno]) {\n        if(isINT)\n          deltaRC = scaled_floor(lp, varno, unscaled_value(lp, deltaRC, varno)+lp->epsprimal, 1);\n        upbo = lowbo + deltaRC;\n        deltaRC = upbo;\n        i = LE;  /* Sets the upper bound */\n      }\n      else {\n        if(isINT)\n          deltaRC = scaled_ceil(lp, varno, unscaled_value(lp, deltaRC, varno)+lp->epsprimal, 1);\n        lowbo = upbo - deltaRC;\n        deltaRC = lowbo;\n        i = GE;  /* Sets the lower bound */\n      }\n\n      /* Check and set feasibility status */\n      if((isfeasible != NULL) && (upbo - lowbo < -lp->epsprimal))\n        *isfeasible = FALSE;\n\n      /* Flag that we can fix the variable by returning the relation code negated */\n      else if(fabs(upbo - lowbo) < lp->epsprimal)\n        i = -i;\n      if(newbound != NULL) {\n        my_roundzero(deltaRC, lp->epsprimal);\n        *newbound = deltaRC;\n      }\n    }\n\n  }\n  return( i );\n}\n\n\nSTATIC MYBOOL findnode_BB(BBrec *BB, int *varno, int *vartype, int *varcus)\n{\n  int    countsossc, countnint, k, reasonmsg = MSG_NONE;\n  REAL   varsol;\n  MYBOOL is_better = FALSE, is_equal = FALSE, is_feasible = TRUE;\n  lprec  *lp = BB->lp;\n\n  /* Initialize result and return variables */\n  *varno    = 0;\n  *vartype  = BB_REAL;\n  *varcus   = 0;\n  countnint = 0;\n  BB->nodestatus = lp->spx_status;\n  BB->noderesult = lp->solution[0];\n\n  /* If this solution is worse than the best so far, this branch dies.\n     If we can only have integer OF values, and we only need the first solution\n     then the OF must be at least (unscaled) 1 better than the best so far */\n  if((lp->bb_limitlevel != 1) && (MIP_count(lp) > 0)) {\n\n    /* Check that we don't have a limit on the recursion level; two versions supported:\n        1) Absolute B&B level (bb_limitlevel > 0), and\n        2) B&B level relative to the \"B&B order\" (bb_limitlevel < 0). */\n    countsossc =  lp->sos_vars + lp->sc_vars;\n    if((lp->bb_limitlevel > 0) && (lp->bb_level > lp->bb_limitlevel+countsossc))\n      return( FALSE );\n    else if((lp->bb_limitlevel < 0) &&\n            (lp->bb_level > 2*(lp->int_vars+countsossc)*abs(lp->bb_limitlevel))) {\n      if(lp->bb_limitlevel == DEF_BB_LIMITLEVEL)\n        report(lp, IMPORTANT, \"findnode_BB: Default B&B limit reached at %d; optionally change strategy or limit.\\n\\n\",\n                              lp->bb_level);\n      return( FALSE );\n    }\n\n    /* First initialize or update pseudo-costs from previous optimal solution */\n    if(BB->varno == 0) {\n      varsol = lp->infinite;\n      if((lp->int_vars+lp->sc_vars > 0) && (lp->bb_PseudoCost == NULL))\n        lp->bb_PseudoCost = init_pseudocost(lp, get_bb_rule(lp));\n    }\n    else {\n      varsol = lp->solution[BB->varno];\n      if( ((lp->int_vars > 0) && (BB->vartype == BB_INT)) ||\n          ((lp->sc_vars > 0) && (BB->vartype == BB_SC) && !is_int(lp, BB->varno-lp->rows)) )\n        update_pseudocost(lp->bb_PseudoCost, BB->varno-lp->rows, BB->vartype, BB->isfloor, varsol);\n    }\n\n    /* Make sure we don't have numeric problems (typically due to integer scaling) */\n    if((lp->bb_totalnodes > 0) && !bb_better(lp, OF_RELAXED, OF_TEST_WE)) {\n      if(lp->bb_trace)\n        report(lp, IMPORTANT, \"findnode_BB: Simplex failure due to loss of numeric accuracy\\n\");\n      lp->spx_status = NUMFAILURE;\n      return( FALSE );\n    }\n\n    /* Abandon this branch if the solution is \"worse\" than a heuristically\n      determined limit or the previous best MIP solution */\n    if(((lp->solutioncount == 0) && !bb_better(lp, OF_HEURISTIC, OF_TEST_BE)) ||\n       ((lp->solutioncount > 0) &&\n        (!bb_better(lp, OF_INCUMBENT | OF_DELTA, OF_TEST_BE | OF_TEST_RELGAP) ||\n         !bb_better(lp, OF_INCUMBENT | OF_DELTA, OF_TEST_BE)))) {\n      return( FALSE );\n    }\n\n    /* Collect violated SC variables (since they can also be real-valued); the\n       approach is to get them out of the way, since a 0-value is assumed to be \"cheap\" */\n    if(lp->sc_vars > 0) {\n      *varno = find_sc_bbvar(lp, &countnint);\n      if(*varno > 0)\n        *vartype = BB_SC;\n    }\n\n    /* Look among SOS variables if no SC candidate was found */\n    if((SOS_count(lp) > 0) && (*varno == 0)) {\n      *varno = find_sos_bbvar(lp, &countnint, FALSE);\n      if(*varno < 0)\n        *varno = 0;\n      else if(*varno > 0)\n        *vartype = BB_SOS;\n    }\n\n    /* Then collect INTS that are not integer valued, and verify bounds */\n    if((lp->int_vars > 0) && (*varno == 0)) {\n      *varno = find_int_bbvar(lp, &countnint, BB, &is_feasible);\n      if(*varno > 0) {\n        *vartype = BB_INT;\n        if((countnint == 1) && !is_feasible) {\n          BB->lastrcf = 0;\n          return( FALSE );\n        }\n      }\n    }\n\n#if 1 /* peno */\n    /* Check if we have reached the depth limit for any individual variable\n      (protects against infinite recursions of mainly integer variables) */\n    k = *varno-lp->rows;\n    if((*varno > 0) && (lp->bb_limitlevel != 0) && (lp->bb_varactive[k] >= abs(lp->bb_limitlevel) /* abs(DEF_BB_LIMITLEVEL) */)) {\n      /* if(!is_action(lp->nomessage, NOMSG_BBLIMIT)) {*/\n/*\n        report(lp, IMPORTANT, \"findnode_BB: Reached B&B depth limit %d for variable %d; will not dive further.\\n\\n\",\n                              lp->bb_varactive[k], k);\n*/\n      /*  set_action(&lp->nomessage, NOMSG_BBLIMIT); */\n      /* } */\n      return( FALSE );\n    }\n#endif\n\n    /* Check if the current MIP solution is optimal; equal or better */\n    if(*varno == 0) {\n      is_better = (MYBOOL) (lp->solutioncount == 0) || bb_better(lp, OF_INCUMBENT | OF_DELTA, OF_TEST_BT);\n#if 1\n      is_better &= bb_better(lp, OF_INCUMBENT | OF_DELTA, OF_TEST_BT | OF_TEST_RELGAP);\n#else\n      /* Check if we can determine clear improvement */\n      is_better = (MYBOOL) (lp->solutioncount == 0) ||\n                  (MYBOOL) ((lp->bb_deltaOF > 0) &&\n                            (my_chsign(is_maxim(lp), lp->solution[0]-lp->best_solution[0]) < 0));\n\n      /* Apply gap-based improvement testing if the current solution is not clearly better */\n\n      if(!is_better) {\n        is_better  = bb_better(lp, OF_INCUMBENT | OF_DELTA, OF_TEST_BT);\n        is_better |= bb_better(lp, OF_INCUMBENT | OF_DELTA, OF_TEST_BT | OF_TEST_RELGAP);\n      }\n#endif\n      is_equal  = !is_better;\n\n      if(is_equal) {\n        if((lp->solutionlimit <= 0) || (lp->solutioncount < lp->solutionlimit)) {\n          lp->solutioncount++;\n          SETMIN(lp->bb_solutionlevel, lp->bb_level);\n          reasonmsg = MSG_MILPEQUAL;\n        }\n      }\n\n      /* Current solution is better */\n      else if(is_better) {\n\n        /* Update grand total solution count and check if we should go from\n           depth-first to best-first variable selection mode */\n        if(lp->bb_varactive != NULL) {\n          lp->bb_varactive[0]++;\n          if((lp->bb_varactive[0] == 1) &&\n             is_bb_mode(lp, NODE_DEPTHFIRSTMODE) && is_bb_mode(lp, NODE_DYNAMICMODE))\n            lp->bb_rule &= !NODE_DEPTHFIRSTMODE;\n        }\n\n        if(lp->bb_trace ||\n           ((lp->verbose >= NORMAL) && (lp->print_sol == FALSE) && (lp->lag_status != RUNNING))) {\n          report(lp, IMPORTANT,\n                 \"%s solution \" RESULTVALUEMASK \" after %10.0f iter, %9.0f nodes (gap %.1f%%)\\n\",\n                 (lp->bb_improvements == 0) ? \"Feasible\" : \"Improved\",\n                 lp->solution[0], (double) lp->total_iter, (double) lp->bb_totalnodes,\n                 100.0*fabs(my_reldiff(lp->solution[0], lp->bb_limitOF)));\n        }\n        if(MIP_count(lp) > 0) {\n          if(lp->bb_improvements == 0)\n            reasonmsg = MSG_MILPFEASIBLE;\n          else\n            reasonmsg = MSG_MILPBETTER;\n        }\n\n        lp->bb_status = FEASFOUND;\n        lp->bb_solutionlevel = lp->bb_level;\n        lp->solutioncount = 1;\n        lp->bb_improvements++;\n        lp->bb_workOF = lp->rhs[0];\n\n        if(lp->bb_breakfirst ||\n           (!is_infinite(lp, lp->bb_breakOF) && bb_better(lp, OF_USERBREAK, OF_TEST_BE)))\n          lp->bb_break = TRUE;\n      }\n    }\n  }\n  else {\n    is_better = TRUE;\n    lp->solutioncount = 1;\n  }\n\n  /* Transfer the successful solution vector */\n  if(is_better || is_equal) {\n#ifdef ParanoiaMIP\n    if((lp->bb_level > 0) &&\n       (check_solution(lp, lp->columns, lp->solution,\n                           lp->orig_upbo, lp->orig_lowbo, lp->epssolution) != OPTIMAL)) {\n      lp->solutioncount = 0;\n      lp->spx_status = NUMFAILURE;\n      lp->bb_status = lp->spx_status;\n      lp->bb_break = TRUE;\n      return( FALSE );\n    }\n#endif\n    transfer_solution(lp, (MYBOOL) ((lp->do_presolve & PRESOLVE_LASTMASKMODE) != PRESOLVE_NONE));\n    if((MIP_count(lp) > 0) && (lp->bb_totalnodes > 0)) {\n      if ((!construct_duals(lp)) ||\n          (is_presolve(lp, PRESOLVE_SENSDUALS) &&\n           (!construct_sensitivity_duals(lp) || !construct_sensitivity_obj(lp))\n          )\n         ) {\n      }\n    }\n    if((reasonmsg != MSG_NONE) && (lp->msgmask & reasonmsg) && (lp->usermessage != NULL))\n      lp->usermessage(lp, lp->msghandle, reasonmsg);\n\n    if(lp->print_sol != FALSE) {\n      print_objective(lp);\n      print_solution(lp, 1);\n    }\n  }\n\n  /* Do tracing and determine if we have arrived at the estimated lower MIP limit */\n  *varcus = countnint;\n  if(MIP_count(lp) > 0) {\n    if((countnint == 0) && (lp->solutioncount == 1) && (lp->solutionlimit == 1) &&\n       (bb_better(lp, OF_DUALLIMIT, OF_TEST_BE) || bb_better(lp, OF_USERBREAK, OF_TEST_BE | OF_TEST_RELGAP))) {\n      lp->bb_break = (MYBOOL) (countnint == 0);\n      return( FALSE );\n    }\n    else if(lp->bb_level > 0) {\n#ifdef MIPboundWithOF\n      if((lp->constraintOF > 0) && (countnint == 0))\n         set_rh(lp, lp->constraintOF, lp->solution[0] + my_chsign(!is_maxim(lp), lp->bb_deltaOF));\n#endif\n      if(lp->spx_trace)\n        report(lp, DETAILED, \"B&B level %5d OPT %16s value \" RESULTVALUEMASK \"\\n\",\n                             lp->bb_level, (*varno) ? \"   \" : \"INT\", lp->solution[0]);\n    }\n    return( (MYBOOL) (*varno > 0));\n  }\n  else\n    return( FALSE );\n\n}\n\nSTATIC int solve_BB(BBrec *BB)\n{\n  int   K, status;\n  lprec *lp = BB->lp;\n\n  /* Protect against infinite recursions do to integer rounding effects */\n  status = PROCFAIL;\n\n  /* Shortcut variables, set default bounds */\n  K = BB->varno;\n\n  /* Load simple MIP bounds */\n  if(K > 0) {\n\n    /* Update cuts, if specified */\n    updatecuts_BB(lp);\n\n    /* BRANCH_FLOOR: Force the variable to be smaller than the B&B upper bound */\n    if(BB->isfloor)\n      modifyUndoLadder(lp->bb_upperchange, K, BB->upbo, BB->UPbound);\n\n    /* BRANCH_CEILING: Force the variable to be greater than the B&B lower bound */\n    else\n      modifyUndoLadder(lp->bb_lowerchange, K, BB->lowbo, BB->LObound);\n\n    /* Update MIP node count */\n    BB->nodessolved++;\n\n  }\n\n  /* Solve! */\n  status = solve_LP(lp, BB);\n\n  /* Do special feasibility assessment of high order SOS'es */\n#if 1\n  if((status == OPTIMAL) && (BB->vartype == BB_SOS) && !SOS_is_feasible(lp->SOS, 0, lp->solution))\n    status = INFEASIBLE;\n#endif\n\n  return( status );\n}\n\n/* Routine to compute a \"strong\" pseudo-cost update for a node */\nSTATIC MYBOOL strongbranch_BB(lprec *lp, BBrec *BB, int varno, int vartype, int varcus)\n{\n  MYBOOL   success = FALSE;\n  int      i;\n  BBrec    *strongBB;\n\n  /* Create new B&B level and solve each of the branches */\n  lp->is_strongbranch = TRUE;\n  push_basis(lp, lp->var_basic, lp->is_basic, lp->is_lower);\n  strongBB = push_BB(lp, BB, lp->rows+varno, vartype, varcus);\n  if(strongBB == BB)\n    return( success );\n\n  do {\n\n    /* Solve incremental problem to local optimality */\n    lp->bb_strongbranches++;\n/*    set_action(&lp->spx_action, ACTION_REBASE | ACTION_RECOMPUTE); */\n    if(solve_BB(strongBB) == OPTIMAL) {\n\n      /* Update result indicator*/\n      success |= 1 << strongBB->isfloor;\n\n      /* Compute new count of non-ints */\n      strongBB->lastvarcus = 0;\n      for(i = 1; i <= lp->columns; i++) {\n        if(is_int(lp, i) && !solution_is_int(lp, lp->rows+i, FALSE))\n          strongBB->lastvarcus++;\n      }\n\n      /* Perform the pseudo-cost update */\n      update_pseudocost(lp->bb_PseudoCost, varno, strongBB->vartype, strongBB->isfloor,\n                                           lp->solution[strongBB->varno]);\n    }\n  }\n  while(nextbranch_BB(strongBB));\n\n  strongBB = pop_BB(strongBB);\n  if(strongBB != BB)\n    report(lp, SEVERE, \"strongbranch_BB: Invalid bound settings restored for variable %d\\n\",\n                       varno);\n  pop_basis(lp, TRUE);\n  set_action(&lp->spx_action, ACTION_REBASE | ACTION_REINVERT | ACTION_RECOMPUTE);\n\n  lp->is_strongbranch = FALSE;\n\n  return( success );\n}\n\n/* Future functions */\nSTATIC MYBOOL pre_BB(lprec *lp)\n{\n  return( TRUE );\n}\nSTATIC MYBOOL post_BB(lprec *lp)\n{\n  return( TRUE );\n}\n\n/* This is the non-recursive B&B driver routine - beautifully simple, yet so subtle! */\nSTATIC int run_BB(lprec *lp)\n{\n  BBrec *currentBB;\n  int   varno, vartype, varcus, prevsolutions;\n  int   status = NOTRUN;\n\n  /* Initialize */\n  pre_BB(lp);\n  prevsolutions = lp->solutioncount;\n#ifdef UseMilpSlacksRCF  /* Check if we should include ranged constraints */\n  varno = lp->sum;\n#else\n  varno = lp->columns;\n#endif\n  lp->bb_upperchange = createUndoLadder(lp, varno, 2*MIP_count(lp));\n  lp->bb_lowerchange = createUndoLadder(lp, varno, 2*MIP_count(lp));\n  lp->rootbounds = currentBB = push_BB(lp, NULL, 0, BB_REAL, 0);\n\n  /* Perform the branch & bound loop */\n  while(lp->bb_level > 0) {\n    status = solve_BB(currentBB);\n\n#if 0\n    if((lp->bb_level == 1) && (MIP_count(lp) > 0)) {\n      if(status == RUNNING)\n        ;\n\n      /* Check if there was an integer solution of an aborted model */\n      else if((status == SUBOPTIMAL) && (lp->solutioncount == 1) &&\n              findnode_BB(currentBB, &varno, &vartype, &varcus))\n        status = USERABORT;\n    }\n#endif\n\n    if((status == OPTIMAL) && findnode_BB(currentBB, &varno, &vartype, &varcus))\n      currentBB = push_BB(lp, currentBB, varno, vartype, varcus);\n\n    else while((lp->bb_level > 0) && !nextbranch_BB(currentBB))\n      currentBB = pop_BB(currentBB);\n\n  }\n\n  /* Finalize */\n  freeUndoLadder(&(lp->bb_upperchange));\n  freeUndoLadder(&(lp->bb_lowerchange));\n\n  /* Check if we should adjust status */\n  if(lp->solutioncount > prevsolutions) {\n    if((status == PROCBREAK) || (status == USERABORT) || (status == TIMEOUT) || userabort(lp, -1))\n      status = SUBOPTIMAL;\n    else\n      status = OPTIMAL;\n    if(lp->bb_totalnodes > 0)\n      lp->spx_status = OPTIMAL;\n  }\n  post_BB(lp);\n  return( status );\n}\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_mipbb.h",
    "content": "#ifndef HEADER_lp_mipbb\n#define HEADER_lp_mipbb\n\n#include \"lp_types.h\"\n#include \"lp_utils.h\"\n\n\n/* Bounds storage for B&B routines */\ntypedef struct _BBrec\n{\n  struct    _BBrec *parent;\n  struct    _BBrec *child;\n  lprec     *lp;\n  int       varno;\n  int       vartype;\n  int       lastvarcus;            /* Count of non-int variables of the previous branch */\n  int       lastrcf;\n  int       nodesleft;\n  int       nodessolved;\n  int       nodestatus;\n  REAL      noderesult;\n  REAL      lastsolution;          /* Optimal solution of the previous branch */\n  REAL      sc_bound;\n  REAL      *upbo,   *lowbo;\n  REAL      UPbound, LObound;\n  int       UBtrack, LBtrack;      /* Signals that incoming bounds were changed */\n  MYBOOL    contentmode;           /* Flag indicating if we \"own\" the bound vectors */\n  MYBOOL    sc_canset;\n  MYBOOL    isSOS;\n  MYBOOL    isGUB;\n  int       *varmanaged;           /* Extended list of variables managed by this B&B level */\n  MYBOOL    isfloor;               /* State variable indicating the active B&B bound */\n  MYBOOL    UBzerobased;           /* State variable indicating if bounds have been rebased */\n} BBrec;\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nSTATIC BBrec *create_BB(lprec *lp, BBrec *parentBB, MYBOOL dofullcopy);\nSTATIC BBrec *push_BB(lprec *lp, BBrec *parentBB, int varno, int vartype, int varcus);\nSTATIC MYBOOL initbranches_BB(BBrec *BB);\nSTATIC MYBOOL fillbranches_BB(BBrec *BB);\nSTATIC MYBOOL nextbranch_BB(BBrec *BB);\nSTATIC MYBOOL strongbranch_BB(lprec *lp, BBrec *BB, int varno, int vartype, int varcus);\nSTATIC MYBOOL initcuts_BB(lprec *lp);\nSTATIC int updatecuts_BB(lprec *lp);\nSTATIC MYBOOL freecuts_BB(lprec *lp);\nSTATIC BBrec *findself_BB(BBrec *BB);\nSTATIC int solve_LP(lprec *lp, BBrec *BB);\nSTATIC int rcfbound_BB(BBrec *BB, int varno, MYBOOL isINT, REAL *newbound, MYBOOL *isfeasible);\nSTATIC MYBOOL findnode_BB(BBrec *BB, int *varno, int *vartype, int *varcus);\nSTATIC int solve_BB(BBrec *BB);\nSTATIC MYBOOL free_BB(BBrec **BB);\nSTATIC BBrec *pop_BB(BBrec *BB);\n\nSTATIC int run_BB(lprec *lp);\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* HEADER_lp_mipbb */\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_params.c",
    "content": "#include <stdio.h>\n#include <stdlib.h>\n#include <ctype.h>\n#include <errno.h>\n\n#include \"commonlib.h\"\n#include \"lp_lib.h\"\n#include \"lp_report.h\"\n#include \"ini.h\"\n\ntypedef int (__WINAPI fn_int_get_function)(lprec *lp);\ntypedef long (__WINAPI fn_long_get_function)(lprec *lp);\ntypedef MYBOOL (__WINAPI fn_MYBOOL_get_function)(lprec *lp);\ntypedef REAL (__WINAPI fn_REAL_get_function)(lprec *lp);\ntypedef void (__WINAPI fn_int_set_function)(lprec *lp, int value);\ntypedef void (__WINAPI fn_long_set_function)(lprec *lp, long value);\ntypedef void (__WINAPI fn_MYBOOL_set_function)(lprec *lp, MYBOOL value);\ntypedef void (__WINAPI fn_REAL_set_function)(lprec *lp, REAL value);\n\n#define intfunction    1\n#define longfunction   2\n#define MYBOOLfunction 3\n#define REALfunction   4\n\n#define setvalues(values, basemask) values, sizeof(values) / sizeof(*values), basemask\n#define setNULLvalues NULL, 0, 0\n#define setvalue(value) value, #value\n#define setintfunction(get_function, set_function) { get_function }, { set_function }, intfunction\n#define setlongfunction(get_function, set_function) { (fn_int_get_function *) get_function }, {(fn_int_set_function *) set_function }, longfunction\n#define setMYBOOLfunction(get_function, set_function) { (fn_int_get_function *) get_function }, { (fn_int_set_function *) set_function }, MYBOOLfunction\n#define setREALfunction(get_function, set_function) {(fn_int_get_function *) get_function }, { (fn_int_set_function *) set_function }, REALfunction\n\n#define WRITE_COMMENTED 0\n#define WRITE_ACTIVE    1\n\nstruct _values {\n  int value;\n  char *svalue;\n};\n\nstruct _functions {\n  char *par;                                    /* name of parameter in ini file */\n  union {\n    fn_int_get_function *int_get_function;         /* set via setintfunction */\n    fn_long_get_function *long_get_function;       /* set via setlongfunction */\n    fn_MYBOOL_get_function *MYBOOL_get_function;   /* set via setMYBOOLfunction */\n    fn_REAL_get_function *REAL_get_function;       /* set via setREALfunction */\n  } get_function;\n  union {\n    fn_int_set_function *int_set_function;         /* set via setintfunction */\n    fn_long_set_function *long_set_function;       /* set via setlongfunction */\n    fn_MYBOOL_set_function *MYBOOL_set_function;   /* set via setMYBOOLfunction */\n    fn_REAL_set_function *REAL_set_function;       /* set via setREALfunction */\n  } set_function;\n  int type;                                     /* set via set*function */\n  struct _values *values;                       /* set via setvalues to a structure of _values */\n  int elements;                                 /*  or via setNULLvalues if the value is shown as is */\n  unsigned int basemask;\n  int mask;                                     /* WRITE_ACTIVE or WRITE_COMMENTED */\n};\n\nstatic struct _values anti_degen[] =\n{\n  { setvalue(ANTIDEGEN_NONE) },\n  { setvalue(ANTIDEGEN_FIXEDVARS) },\n  { setvalue(ANTIDEGEN_COLUMNCHECK) },\n  { setvalue(ANTIDEGEN_STALLING) },\n  { setvalue(ANTIDEGEN_NUMFAILURE) },\n  { setvalue(ANTIDEGEN_LOSTFEAS) },\n  { setvalue(ANTIDEGEN_INFEASIBLE) },\n  { setvalue(ANTIDEGEN_DYNAMIC) },\n  { setvalue(ANTIDEGEN_DURINGBB) },\n  { setvalue(ANTIDEGEN_RHSPERTURB) },\n  { setvalue(ANTIDEGEN_BOUNDFLIP) },\n};\n\nstatic struct _values basiscrash[] =\n{\n  { setvalue(CRASH_NONE) },\n  /* { setvalue(CRASH_NONBASICBOUNDS) }, */ /* not yet implemented */\n  { setvalue(CRASH_MOSTFEASIBLE) },\n  { setvalue(CRASH_LEASTDEGENERATE) },\n};\n\nstatic struct _values bb_floorfirst[] =\n{\n  { setvalue(BRANCH_CEILING) },\n  { setvalue(BRANCH_FLOOR) },\n  { setvalue(BRANCH_AUTOMATIC) },\n};\n\nstatic struct _values bb_rule[] =\n{\n  { setvalue(NODE_FIRSTSELECT) },\n  { setvalue(NODE_GAPSELECT) },\n  { setvalue(NODE_RANGESELECT) },\n  { setvalue(NODE_FRACTIONSELECT) },\n  { setvalue(NODE_PSEUDOCOSTSELECT) },\n  { setvalue(NODE_PSEUDONONINTSELECT) },\n  { setvalue(NODE_PSEUDORATIOSELECT) },\n  { setvalue(NODE_USERSELECT) },\n  { setvalue(NODE_WEIGHTREVERSEMODE) },\n  { setvalue(NODE_BRANCHREVERSEMODE) },\n  { setvalue(NODE_GREEDYMODE) },\n  { setvalue(NODE_PSEUDOCOSTMODE) },\n  { setvalue(NODE_DEPTHFIRSTMODE) },\n  { setvalue(NODE_RANDOMIZEMODE) },\n  { setvalue(NODE_GUBMODE) },\n  { setvalue(NODE_DYNAMICMODE) },\n  { setvalue(NODE_RESTARTMODE) },\n  { setvalue(NODE_BREADTHFIRSTMODE) },\n  { setvalue(NODE_AUTOORDER) },\n  { setvalue(NODE_RCOSTFIXING) },\n  { setvalue(NODE_STRONGINIT) },\n};\n\nstatic struct _values improve[] =\n{\n  { setvalue(IMPROVE_NONE) },\n  { setvalue(IMPROVE_SOLUTION) },\n  { setvalue(IMPROVE_DUALFEAS) },\n  { setvalue(IMPROVE_THETAGAP) },\n  { setvalue(IMPROVE_BBSIMPLEX) },\n};\n\nstatic REAL __WINAPI get_mip_gap_abs(lprec *lp)\n{\n  return(get_mip_gap(lp, TRUE));\n}\n\nstatic REAL __WINAPI get_mip_gap_rel(lprec *lp)\n{\n  return(get_mip_gap(lp, FALSE));\n}\n\nstatic void __WINAPI set_mip_gap_abs(lprec *lp, REAL mip_gap)\n{\n  set_mip_gap(lp, TRUE, mip_gap);\n}\n\nstatic void __WINAPI set_mip_gap_rel(lprec *lp, REAL mip_gap)\n{\n  set_mip_gap(lp, FALSE, mip_gap);\n}\n\nstatic struct _values pivoting[] =\n{\n  { setvalue(PRICER_FIRSTINDEX) },\n  { setvalue(PRICER_DANTZIG) },\n  { setvalue(PRICER_DEVEX) },\n  { setvalue(PRICER_STEEPESTEDGE) },\n  { setvalue(PRICE_PRIMALFALLBACK) },\n  { setvalue(PRICE_MULTIPLE) },\n  { setvalue(PRICE_PARTIAL) },\n  { setvalue(PRICE_ADAPTIVE) },\n  { setvalue(PRICE_RANDOMIZE) },\n  { setvalue(PRICE_AUTOPARTIAL) },\n  { setvalue(PRICE_LOOPLEFT) },\n  { setvalue(PRICE_LOOPALTERNATE) },\n  { setvalue(PRICE_HARRISTWOPASS) },\n  { setvalue(PRICE_TRUENORMINIT) },\n};\n\nstatic struct _values presolving[] =\n{\n  { setvalue(PRESOLVE_NONE) },\n  { setvalue(PRESOLVE_ROWS) },\n  { setvalue(PRESOLVE_COLS) },\n  { setvalue(PRESOLVE_LINDEP) },\n  { setvalue(PRESOLVE_AGGREGATE) },\n  { setvalue(PRESOLVE_SPARSER) },\n  { setvalue(PRESOLVE_SOS) },\n  { setvalue(PRESOLVE_REDUCEMIP) },\n  { setvalue(PRESOLVE_KNAPSACK) },\n  { setvalue(PRESOLVE_ELIMEQ2) },\n  { setvalue(PRESOLVE_IMPLIEDFREE) },\n  { setvalue(PRESOLVE_REDUCEGCD) },\n  { setvalue(PRESOLVE_PROBEFIX) },\n  { setvalue(PRESOLVE_PROBEREDUCE) },\n  { setvalue(PRESOLVE_ROWDOMINATE) },\n  { setvalue(PRESOLVE_COLDOMINATE) },\n  { setvalue(PRESOLVE_MERGEROWS) },\n  { setvalue(PRESOLVE_IMPLIEDSLK) },\n  { setvalue(PRESOLVE_COLFIXDUAL) },\n  { setvalue(PRESOLVE_BOUNDS) },\n  { setvalue(PRESOLVE_DUALS) },\n  { setvalue(PRESOLVE_SENSDUALS) },\n};\n\nstatic char *STRLWR(char *str)\n{\n  char *ptr;\n\n  for(ptr = str; *ptr; ptr++)\n    *ptr = (char) tolower((unsigned char) *ptr);\n\n  return(str);\n}\n\nstatic char *STRUPR(char *str)\n{\n  char *ptr;\n\n  for(ptr = str; *ptr; ptr++)\n    *ptr = (char) toupper((unsigned char) *ptr);\n\n  return(str);\n}\n\nstatic void __WINAPI set_presolve1(lprec *lp, int do_presolve)\n{\n  set_presolve(lp, do_presolve, get_presolveloops(lp));\n}\n\nstatic void __WINAPI set_presolve2(lprec *lp, int maxloops)\n{\n  set_presolve(lp, get_presolve(lp), maxloops);\n}\n\nstatic struct _values print_sol[] =\n{\n  { FALSE, \"0\" },\n  { TRUE,  \"1\" },\n  { setvalue(AUTOMATIC) },\n};\n\nstatic struct _values scaling[] =\n{\n  { setvalue(SCALE_NONE) },\n  { setvalue(SCALE_EXTREME) },\n  { setvalue(SCALE_RANGE) },\n  { setvalue(SCALE_MEAN) },\n  { setvalue(SCALE_GEOMETRIC) },\n  { setvalue(SCALE_CURTISREID) },\n  { setvalue(SCALE_QUADRATIC) },\n  { setvalue(SCALE_LOGARITHMIC) },\n  { setvalue(SCALE_USERWEIGHT) },\n  { setvalue(SCALE_POWER2) },\n  { setvalue(SCALE_EQUILIBRATE) },\n  { setvalue(SCALE_INTEGERS) },\n  { setvalue(SCALE_DYNUPDATE) },\n  { setvalue(SCALE_ROWSONLY) },\n  { setvalue(SCALE_COLSONLY) },\n};\n\nstatic struct _values simplextype[] =\n{\n  { setvalue(SIMPLEX_PRIMAL_PRIMAL) },\n  { setvalue(SIMPLEX_DUAL_PRIMAL) },\n  { setvalue(SIMPLEX_PRIMAL_DUAL) },\n  { setvalue(SIMPLEX_DUAL_DUAL) },\n};\n\nstatic struct _values verbose[] =\n{\n  { setvalue(NEUTRAL) },\n  { setvalue(CRITICAL) },\n  { setvalue(SEVERE) },\n  { setvalue(IMPORTANT) },\n  { setvalue(NORMAL) },\n  { setvalue(DETAILED) },\n  { setvalue(FULL) },\n};\n\nstatic struct _functions functions[] =\n{\n  /* solve options */\n  { \"ANTI_DEGEN\", setintfunction(get_anti_degen, set_anti_degen), setvalues(anti_degen, ~0), WRITE_ACTIVE },\n  { \"BASISCRASH\", setintfunction(get_basiscrash, set_basiscrash), setvalues(basiscrash, ~0), WRITE_ACTIVE },\n  { \"IMPROVE\", setintfunction(get_improve, set_improve), setvalues(improve, ~0), WRITE_ACTIVE },\n  { \"MAXPIVOT\", setintfunction(get_maxpivot, set_maxpivot), setNULLvalues, WRITE_ACTIVE },\n  { \"NEGRANGE\", setREALfunction(get_negrange, set_negrange), setNULLvalues, WRITE_ACTIVE },\n  { \"PIVOTING\", setintfunction(get_pivoting, set_pivoting), setvalues(pivoting, PRICER_LASTOPTION), WRITE_ACTIVE },\n  { \"PRESOLVE\", setintfunction(get_presolve, set_presolve1), setvalues(presolving, ~0), WRITE_ACTIVE },\n  { \"PRESOLVELOOPS\", setintfunction(get_presolveloops, set_presolve2), setNULLvalues, WRITE_ACTIVE },\n  { \"SCALELIMIT\", setREALfunction(get_scalelimit, set_scalelimit), setNULLvalues, WRITE_ACTIVE },\n  { \"SCALING\", setintfunction(get_scaling, set_scaling), setvalues(scaling, SCALE_CURTISREID), WRITE_ACTIVE },\n  { \"SIMPLEXTYPE\", setintfunction(get_simplextype, set_simplextype), setvalues(simplextype, ~0), WRITE_ACTIVE },\n  { \"OBJ_IN_BASIS\", setMYBOOLfunction(is_obj_in_basis, set_obj_in_basis), setNULLvalues, WRITE_COMMENTED },\n\n  /* B&B options */\n  { \"BB_DEPTHLIMIT\", setintfunction(get_bb_depthlimit, set_bb_depthlimit), setNULLvalues, WRITE_ACTIVE },\n  { \"BB_FLOORFIRST\", setintfunction(get_bb_floorfirst, set_bb_floorfirst), setvalues(bb_floorfirst, ~0), WRITE_ACTIVE },\n  { \"BB_RULE\", setintfunction(get_bb_rule, set_bb_rule), setvalues(bb_rule, NODE_STRATEGYMASK), WRITE_ACTIVE },\n  { \"BREAK_AT_FIRST\", setMYBOOLfunction(is_break_at_first, set_break_at_first), setNULLvalues, WRITE_COMMENTED },\n  { \"BREAK_AT_VALUE\", setREALfunction(get_break_at_value, set_break_at_value), setNULLvalues, WRITE_COMMENTED },\n  { \"MIP_GAP_ABS\", setREALfunction(get_mip_gap_abs, set_mip_gap_abs), setNULLvalues, WRITE_ACTIVE },\n  { \"MIP_GAP_REL\", setREALfunction(get_mip_gap_rel, set_mip_gap_rel), setNULLvalues, WRITE_ACTIVE },\n  { \"EPSINT\", setREALfunction(get_epsint, set_epsint), setNULLvalues, WRITE_ACTIVE },\n\n  /* tolerances, values */\n  { \"EPSB\", setREALfunction(get_epsb, set_epsb), setNULLvalues, WRITE_ACTIVE },\n  { \"EPSD\", setREALfunction(get_epsd, set_epsd), setNULLvalues, WRITE_ACTIVE },\n  { \"EPSEL\", setREALfunction(get_epsel, set_epsel), setNULLvalues, WRITE_ACTIVE },\n  { \"EPSPERTURB\", setREALfunction(get_epsperturb, set_epsperturb), setNULLvalues, WRITE_ACTIVE },\n  { \"EPSPIVOT\", setREALfunction(get_epspivot, set_epspivot), setNULLvalues, WRITE_ACTIVE },\n  { \"INFINITE\", setREALfunction(get_infinite, set_infinite), setNULLvalues, WRITE_ACTIVE },\n\n  /* read-only options */\n  { \"DEBUG\", setMYBOOLfunction(is_debug, set_debug), setNULLvalues, WRITE_COMMENTED },\n  { \"OBJ_BOUND\", setREALfunction(get_obj_bound, set_obj_bound), setNULLvalues, WRITE_COMMENTED },\n  { \"PRINT_SOL\", setintfunction(get_print_sol, set_print_sol), setvalues(print_sol, ~0), WRITE_COMMENTED },\n  { \"TIMEOUT\", setlongfunction(get_timeout, set_timeout), setNULLvalues, WRITE_COMMENTED },\n  { \"TRACE\", setMYBOOLfunction(is_trace, set_trace), setNULLvalues, WRITE_COMMENTED },\n  { \"VERBOSE\", setintfunction(get_verbose, set_verbose), setvalues(verbose, ~0), WRITE_COMMENTED },\n};\n\nstatic void write_params1(lprec *lp, FILE *fp, char *header, int newline)\n{\n  int ret = 0, ret2, i, j, k, value, value2, elements, majorversion, minorversion, release, build;\n  unsigned int basemask;\n  REAL a = 0;\n  char buf[4096], par[20];\n\n  ini_writeheader(fp, header, newline);\n  lp_solve_version(&majorversion, &minorversion, &release, &build);\n  sprintf(buf, \"lp_solve version %d.%d settings\\n\", majorversion, minorversion);\n  ini_writecomment(fp, buf);\n  for(i = 0; i < sizeof(functions) / sizeof(*functions); i++) {\n    switch(functions[i].type) {\n    case intfunction:\n      if(functions[i].get_function.int_get_function == NULL)\n        continue;\n      ret = functions[i].get_function.int_get_function(lp);\n      break;\n    case longfunction:\n      if(functions[i].get_function.long_get_function == NULL)\n        continue;\n      ret = functions[i].get_function.long_get_function(lp);\n      break;\n    case MYBOOLfunction:\n      if(functions[i].get_function.MYBOOL_get_function == NULL)\n        continue;\n      ret = (int) functions[i].get_function.MYBOOL_get_function(lp);\n      break;\n    case REALfunction:\n      if(functions[i].get_function.REAL_get_function == NULL)\n        continue;\n      a = functions[i].get_function.REAL_get_function(lp);\n      break;\n    }\n    buf[0] = 0;\n    if(functions[i].values == NULL) {\n      switch(functions[i].type) {\n      case intfunction:\n      case longfunction:\n      case MYBOOLfunction:\n        sprintf(buf, \"%d\", ret);\n        break;\n      case REALfunction:\n        sprintf(buf, \"%g\", a);\n        break;\n      }\n    }\n    else {\n      elements = functions[i].elements;\n      basemask = functions[i].basemask;\n      for(j = 0; j < elements; j++) {\n        value = functions[i].values[j].value;\n        ret2 = ret;\n        if(((unsigned int) value) < basemask)\n          ret2 &= basemask;\n        if(value == 0) {\n          if(ret2 == 0) {\n            if(*buf)\n              strcat(buf, \" + \");\n            strcat(buf, functions[i].values[j].svalue);\n          }\n        }\n        else if((ret2 & value) == value) {\n          for(k = 0; k < elements; k++) {\n            value2 = functions[i].values[k].value;\n            if((k != j) && (value2 > value) && ((value2 & value) == value) && ((ret2 & value2) == value2))\n              break;\n          }\n          if(k == elements) {\n            if(*buf)\n              strcat(buf, \" + \");\n            strcat(buf, functions[i].values[j].svalue);\n          }\n        }\n      }\n    }\n    if(functions[i].mask & WRITE_ACTIVE)\n      par[0] = 0;\n    else\n      strcpy(par, \";\");\n    strcat(par, functions[i].par);\n    ini_writedata(fp, STRLWR(par), buf);\n  }\n}\n\nstatic void readoptions(char *options, char **header)\n{\n  char *ptr1, *ptr2;\n\n  if(options != NULL) {\n    ptr1 = options;\n    while(*ptr1) {\n      ptr2 = strchr(ptr1, '-');\n      if(ptr2 == NULL)\n        break;\n      ptr2++;\n      if(tolower((unsigned char) *ptr2) == 'h') {\n        for(++ptr2; (*ptr2) && (isspace(*ptr2)); ptr2++);\n        for(ptr1 = ptr2; (*ptr1) && (!isspace(*ptr1)); ptr1++);\n        *header = (char *) calloc(1 + (int) (ptr1 - ptr2), 1);\n        memcpy(*header, ptr2, (int) (ptr1 - ptr2));\n      }\n    }\n  }\n\n  if(*header == NULL)\n    *header = strdup(\"Default\");\n}\n\nMYBOOL __WINAPI write_params(lprec *lp, char *filename, char *options)\n{\n  int k, ret, params_written;\n  FILE *fp, *fp0;\n  int state = 0, looping, newline;\n  char buf[4096], *filename0, *ptr1, *ptr2, *header = NULL;\n\n  readoptions(options, &header);\n\n  k = (int) strlen(filename);\n  filename0 = (char *) malloc(k + 1 + 1);\n  strcpy(filename0, filename);\n  ptr1 = strrchr(filename0, '.');\n  ptr2 = strrchr(filename0, '\\\\');\n  if((ptr1 == NULL) || ((ptr2 != NULL) && (ptr1 < ptr2)))\n    ptr1 = filename0 + k;\n  memmove(ptr1 + 1, ptr1, k + 1 - (int) (ptr1 - filename0));\n  ptr1[0] = '_';\n  if(rename(filename, filename0)) {\n    switch(errno) {\n    case ENOENT: /* File or path specified by oldname not found */\n      FREE(filename0);\n      filename0 = NULL;\n      break;\n    case EACCES: /* File or directory specified by newname already exists or could not be created (invalid path); or oldname is a directory and newname specifies a different path. */\n      FREE(filename0);\n      FREE(header);\n      return(FALSE);\n      break;\n    }\n  }\n\n  if((fp = ini_create(filename)) == NULL)\n    ret = FALSE;\n  else {\n    params_written = FALSE;\n    newline = TRUE;\n    if(filename0 != NULL) {\n      fp0 = ini_open(filename0);\n      if(fp0 == NULL) {\n        rename(filename0, filename);\n        FREE(filename0);\n        FREE(header);\n        return(FALSE);\n      }\n      looping = TRUE;\n      while(looping) {\n        switch(ini_readdata(fp0, buf, sizeof(buf), TRUE)) {\n        case 0: /* End of file */\n          looping = FALSE;\n          break;\n        case 1: /* header */\n          ptr1 = strdup(buf);\n          STRUPR(buf);\n          ptr2 = strdup(header);\n          STRUPR(ptr2);\n          if(strcmp(buf, ptr2) == 0) {\n            write_params1(lp, fp, ptr1, newline);\n            params_written = TRUE;\n            newline = TRUE;\n            state = 1;\n          }\n          else {\n            state = 0;\n            ini_writeheader(fp, ptr1, newline);\n            newline = TRUE;\n          }\n          FREE(ptr2);\n          FREE(ptr1);\n          break;\n        case 2: /* data */\n          if(state == 0) {\n            ini_writedata(fp, NULL, buf);\n            newline = (*buf != 0);\n          }\n          break;\n        }\n      }\n      ini_close(fp0);\n    }\n\n    if(!params_written)\n      write_params1(lp, fp, header, newline);\n\n    ini_close(fp);\n    ret = TRUE;\n  }\n\n  if(filename0 != NULL) {\n    remove(filename0);\n    FREE(filename0);\n  }\n\n  FREE(header);\n\n  return( (MYBOOL) ret );\n}\n\n\nMYBOOL __WINAPI read_params(lprec *lp, char *filename, char *options)\n{\n  int ret, looping, line;\n  FILE *fp;\n  hashtable *hashfunctions, *hashparameters;\n  hashelem *hp;\n  int i, j, elements, n, intvalue, state = 0;\n  REAL REALvalue;\n  char buf[4096], *header = NULL, *ptr, *ptr1, *ptr2;\n\n  if((fp = ini_open(filename)) == NULL)\n    ret = FALSE;\n  else {\n    /* create hashtable of all callable commands to find them quickly */\n    hashfunctions = create_hash_table(sizeof(functions) / sizeof(*functions), 0);\n    for (n = 0, i = 0; i < (int) (sizeof(functions)/sizeof(*functions)); i++) {\n      puthash(functions[i].par, i, NULL, hashfunctions);\n      if(functions[i].values != NULL)\n        n += functions[i].elements;\n    }\n    /* create hashtable of all arguments to find them quickly */\n    hashparameters = create_hash_table(n, 0);\n    for (n = 0, i = 0; i < (int) (sizeof(functions)/sizeof(*functions)); i++) {\n      if(functions[i].values != NULL) {\n        elements = functions[i].elements;\n        for(j = 0; j < elements; j++)\n          if((strcmp(functions[i].values[j].svalue, \"0\") != 0) &&\n             (strcmp(functions[i].values[j].svalue, \"1\") != 0))\n            puthash(functions[i].values[j].svalue, j, NULL, hashparameters);\n      }\n    }\n\n    readoptions(options, &header);\n\n    STRUPR(header);\n    ret = looping = TRUE;\n    line = 0;\n    while((ret) && (looping)) {\n      line++;\n      switch(ini_readdata(fp, buf, sizeof(buf), FALSE)) {\n        case 0: /* End of file */\n          looping = FALSE;\n          break;\n        case 1: /* header */\n          switch(state) {\n            case 0:\n              STRUPR(buf);\n              if(strcmp(buf, header) == 0)\n                state = 1;\n              break;\n            case 1:\n              looping = FALSE;\n              break;\n          }\n          break;\n        case 2: /* data */\n          if(state == 1) {\n            for(ptr = buf; (*ptr) && (isspace(*ptr)); ptr++);\n          }\n          else\n            ptr = NULL;\n          if((ptr != NULL) && (*ptr)) {\n            STRUPR(buf);\n            ptr = strchr(buf, '=');\n            if(ptr == NULL) {\n              report(lp, IMPORTANT, \"read_params: No equal sign on line %d\\n\", line);\n              ret = FALSE;\n            }\n            else {\n              *ptr = 0;\n              for(ptr1 = buf; isspace(*ptr1); ptr1++);\n              for(ptr2 = ptr - 1; (ptr2 >= ptr1) && (isspace(*ptr2)); ptr2--);\n              if(ptr2 <= ptr1) {\n                report(lp, IMPORTANT, \"read_params: No parameter name before equal sign on line %d\\n\", line);\n                ret = FALSE;\n              }\n              else {\n                ptr2[1] = 0;\n                hp = findhash(ptr1, hashfunctions);\n                if(hp == NULL) {\n                  report(lp, IMPORTANT, \"read_params: Unknown parameter name (%s) before equal sign on line %d\\n\", ptr1, line);\n                  ret = FALSE;\n                }\n                else {\n                  i = hp->index;\n                  ptr1 = ++ptr;\n                  intvalue = 0;\n                  REALvalue = 0;\n                  if(functions[i].values == NULL) {\n                    switch(functions[i].type) {\n                      case intfunction:\n                      case longfunction:\n                      case MYBOOLfunction:\n                        intvalue = strtol(ptr1, &ptr2, 10);\n                        while((*ptr2) && (isspace(*ptr2)))\n                          ptr2++;\n                        if(*ptr2) {\n                          report(lp, IMPORTANT, \"read_params: Invalid integer value on line %d\\n\", line);\n                          ret = FALSE;\n                        }\n                        break;\n                      case REALfunction:\n                        REALvalue = strtod(ptr1, &ptr2);\n                        while((*ptr2) && (isspace(*ptr2)))\n                          ptr2++;\n                        if(*ptr2) {\n                          report(lp, IMPORTANT, \"read_params: Invalid real value on line %d\\n\", line);\n                          ret = FALSE;\n                        }\n                        break;\n                    }\n                  }\n                  else {\n                    while(ret) {\n                      ptr = strchr(ptr1, '+');\n                      if(ptr == NULL)\n                        ptr = ptr1 + strlen(ptr1);\n                      for(; isspace(*ptr1); ptr1++);\n                      for(ptr2 = ptr - 1; (ptr2 >= ptr1) && (isspace(*ptr2)); ptr2--);\n                      if(ptr2 <= ptr1)\n                        break;\n                      else {\n                        ptr2[1] = 0;\n                        hp = findhash(ptr1, hashparameters);\n                        if (hp == NULL) {\n                          report(lp, IMPORTANT, \"read_params: Invalid parameter name (%s) on line %d\\n\", ptr1, line);\n                          ret = FALSE;\n                        }\n                        else {\n                          j = hp->index;\n                          if((j >= functions[i].elements) ||\n                             (strcmp(functions[i].values[j].svalue, ptr1))) {\n                            report(lp, IMPORTANT, \"read_params: Inappropriate parameter name (%s) on line %d\\n\", ptr1, line);\n                            ret = FALSE;\n                          }\n                          else {\n                            intvalue += functions[i].values[j].value;\n                          }\n                        }\n                        ptr1 = ptr + 1;\n                      }\n                    }\n                  }\n                  if(ret) {\n                    switch(functions[i].type) {\n                      case intfunction:\n                        functions[i].set_function.int_set_function(lp, intvalue);\n                        break;\n                      case longfunction:\n                        functions[i].set_function.long_set_function(lp, intvalue);\n                        break;\n                      case MYBOOLfunction:\n                        functions[i].set_function.MYBOOL_set_function(lp, (MYBOOL) intvalue);\n                        break;\n                      case REALfunction:\n                        functions[i].set_function.REAL_set_function(lp, REALvalue);\n                        break;\n                    }\n                  }\n                }\n              }\n            }\n          }\n          break;\n      }\n    }\n\n    FREE(header);\n    free_hash_table(hashfunctions);\n    free_hash_table(hashparameters);\n\n    ini_close(fp);\n  }\n\n  return( (MYBOOL) ret );\n}\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_presolve.c",
    "content": "\n/* -------------------------------------------------------------------------\n   Presolve routines for lp_solve v5.0+\n   -------------------------------------------------------------------------\n    Author:        Kjell Eikland\n    Contact:       kjell.eikland@broadpark.no\n    License terms: LGPL.\n\n    Requires:      lp_lib.h, lp_presolve, lp_crash.h, lp_scale.h, lp_report.h\n\n    Release notes:\n    v1.0.0  1 January 2003      Initial crude version used with lp_solve v4.\n    v5.0.0  1 January 2004      Significantly expanded and repackaged\n                                presolve routines for lp_solve v5 release.\n    v5.0.1  1 April   2004      Added reference to new crash module\n    v5.1.0  20 August 2004      Reworked infeasibility detection.\n                                Added encapsulation of presolve undo logic.\n    v5.1.1  10 September 2004   Added variable bound tightening based on\n                                full-constraint information, as well as\n                                variable fixing by duality.\n    v5.2.0  1 January 2005      Fixes to bound fixing handling.\n                                Added fast batch compression after presolve.\n                                Restructured calls by adding presolve wrapper.\n                                Major optimization of identification logic\n                                  along with bug fixes.\n                                Enabled storage of eliminated matrix data.\n                                Added function to report on constraint classes.\n    v5.5.0  1 June 2005         Added implied slack presolve, restructured\n                                looping logic to be more modular, and made\n                                active row/column selection logic faster.\n    v5.5.1  18 June 2005        Finished sparsity-enhancing logic and added\n                                initial version of column aggregation code.\n   ------------------------------------------------------------------------- */\n\n#include <string.h>\n#include \"commonlib.h\"\n#include \"lp_lib.h\"\n#include \"lp_presolve.h\"\n#include \"lp_crash.h\"\n#include \"lp_scale.h\"\n#include \"lp_report.h\"\n\n#ifdef FORTIFY\n# include \"lp_fortify.h\"\n#endif\n\n\n#define presolve_setstatus(one, two)  presolve_setstatusex(one, two, __LINE__, __FILE__)\nSTATIC int presolve_setstatusex(presolverec *psdata, int status, int lineno, char *filename)\n{\n  if((status == INFEASIBLE) || (status == UNBOUNDED)) {\n    report(psdata->lp,\n#ifdef Paranoia\n           NORMAL,\n#else\n           DETAILED,\n#endif\n           \"presolve_setstatus: Status set to '%s' on code line %d, file '%s'\\n\",\n           (status == INFEASIBLE ? \"INFEASIBLE\" : \"UNBOUNDED\"), lineno, (filename == NULL ? \"Unknown\" : filename));\n  }\n  return( status );\n}\n\nSTATIC MYBOOL presolve_statuscheck(presolverec *psdata, int *status)\n{\n  if(*status == RUNNING) {\n    lprec *lp = psdata->lp;\n    if(!mat_validate(lp->matA))\n      *status = MATRIXERROR;\n    else if(userabort(lp, -1))\n      *status = lp->spx_status;\n  }\n  return( (MYBOOL) (*status == RUNNING) );\n}\n\nSTATIC MYBOOL presolve_createUndo(lprec *lp)\n{\n  if(lp->presolve_undo != NULL)\n    presolve_freeUndo(lp);\n  lp->presolve_undo = (presolveundorec *) calloc(1, sizeof(presolveundorec));\n  lp->presolve_undo->lp = lp;\n  if(lp->presolve_undo == NULL)\n    return( FALSE );\n  return( TRUE );\n}\nSTATIC MYBOOL inc_presolve_space(lprec *lp, int delta, MYBOOL isrows)\n{\n  int i, ii,\n      oldrowcolalloc, rowcolsum, oldrowalloc, oldcolalloc;\n  presolveundorec *psundo = lp->presolve_undo;\n\n  if(psundo == NULL) {\n    presolve_createUndo(lp);\n    psundo = lp->presolve_undo;\n  }\n\n  /* Set constants */\n  oldrowalloc = lp->rows_alloc-delta;\n  oldcolalloc = lp->columns_alloc-delta;\n  oldrowcolalloc = lp->sum_alloc-delta;\n  rowcolsum = lp->sum_alloc + 1;\n\n  /* Reallocate lp memory */\n  if(isrows)\n    allocREAL(lp, &psundo->fixed_rhs,   lp->rows_alloc+1, AUTOMATIC);\n  else\n    allocREAL(lp, &psundo->fixed_obj,   lp->columns_alloc+1, AUTOMATIC);\n  allocINT(lp,  &psundo->var_to_orig, rowcolsum, AUTOMATIC);\n  allocINT(lp,  &psundo->orig_to_var, rowcolsum, AUTOMATIC);\n\n  /* Fill in default values, where appropriate */\n  if(isrows)\n    ii = oldrowalloc+1;\n  else\n    ii = oldcolalloc+1;\n  for(i = oldrowcolalloc+1; i < rowcolsum; i++, ii++) {\n    psundo->var_to_orig[i] = 0;\n    psundo->orig_to_var[i] = 0;\n    if(isrows)\n      psundo->fixed_rhs[ii] = 0;\n    else\n      psundo->fixed_obj[ii] = 0;\n  }\n\n  return(TRUE);\n}\nSTATIC MYBOOL presolve_setOrig(lprec *lp, int orig_rows, int orig_cols)\n{\n  presolveundorec *psundo = lp->presolve_undo;\n\n  if(psundo == NULL)\n    return( FALSE );\n  psundo->orig_rows = orig_rows;\n  psundo->orig_columns = orig_cols;\n  psundo->orig_sum = orig_rows + orig_cols;\n  if(lp->wasPresolved)\n    presolve_fillUndo(lp, orig_rows, orig_cols, FALSE);\n  return( TRUE );\n}\nSTATIC MYBOOL presolve_fillUndo(lprec *lp, int orig_rows, int orig_cols, MYBOOL setOrig)\n{\n  int i;\n  presolveundorec *psundo = lp->presolve_undo;\n\n  for(i = 0; i <= orig_rows; i++) {\n    psundo->var_to_orig[i] = i;\n    psundo->orig_to_var[i] = i;\n    psundo->fixed_rhs[i]   = 0;\n  }\n  for(i = 1; i <= orig_cols; i++) {\n    psundo->var_to_orig[orig_rows + i] = i;\n    psundo->orig_to_var[orig_rows + i] = i;\n    psundo->fixed_obj[i] = 0;\n  }\n  if(setOrig)\n    presolve_setOrig(lp, orig_rows, orig_cols);\n\n  return( TRUE );\n}\nSTATIC MYBOOL presolve_rebuildUndo(lprec *lp, MYBOOL isprimal)\n{\n  int             ik, ie, ix, j, k, *colnrDep;\n  REAL             hold, *value, *solution, *slacks;\n  presolveundorec *psdata = lp->presolve_undo;\n  MATrec          *mat = NULL;\n\n  /* Point to and initialize undo structure at first call */\n  if(isprimal) {\n    if(psdata->primalundo != NULL)\n      mat = psdata->primalundo->tracker;\n    solution = lp->full_solution + lp->presolve_undo->orig_rows;\n    slacks   = lp->full_solution;\n  }\n  else {\n    if(psdata->dualundo != NULL)\n      mat = psdata->dualundo->tracker;\n    solution = lp->full_duals;\n    slacks   = lp->full_duals + lp->presolve_undo->orig_rows;\n  }\n  if(mat == NULL)\n    return( FALSE );\n\n  /* Loop backward over the undo chain */\n  for(j = mat->col_tag[0]; j > 0; j--) {\n    ix = mat->col_tag[j];\n    ik = mat->col_end[j-1];\n    ie = mat->col_end[j];\n    colnrDep = &COL_MAT_ROWNR(ik);\n    value    = &COL_MAT_VALUE(ik);\n    hold = 0;\n    k = 0;\n    for(; ik < ie; ik++, colnrDep += matRowColStep, value += matValueStep) {\n\n      /* Constant term */\n      if(*colnrDep == 0)\n        hold += *value;\n\n      /* Special case with dependence on a slack variable */\n      else if(isprimal && (*colnrDep > lp->presolve_undo->orig_columns)) {\n        k = (*colnrDep) - lp->presolve_undo->orig_columns;\n        hold -= (*value) * slacks[k];\n        slacks[k] = 0;\n      }\n      else if(!isprimal && (*colnrDep > lp->presolve_undo->orig_rows)) {\n        k = (*colnrDep) - lp->presolve_undo->orig_rows;\n        hold -= (*value) * slacks[k];\n        slacks[k] = 0;\n      }\n\n      /* Dependence on other user variable */\n      else\n        hold -= (*value) * solution[*colnrDep];\n\n      *value = 0;\n    }\n    if(fabs(hold) > lp->epsvalue)\n      solution[ix] = hold;\n  }\n\n  return( TRUE );\n}\nSTATIC MYBOOL presolve_freeUndo(lprec *lp)\n{\n  presolveundorec *psundo = lp->presolve_undo;\n\n  if(psundo == NULL)\n    return( FALSE );\n  FREE(psundo->orig_to_var);\n  FREE(psundo->var_to_orig);\n  FREE(psundo->fixed_rhs);\n  FREE(psundo->fixed_obj);\n  if(psundo->deletedA != NULL)\n    freeUndoLadder(&(psundo->deletedA));\n  if(psundo->primalundo != NULL)\n    freeUndoLadder(&(psundo->primalundo));\n  if(psundo->dualundo != NULL)\n    freeUndoLadder(&(psundo->dualundo));\n  FREE(lp->presolve_undo);\n  return( TRUE );\n}\n\nSTATIC void presolve_storeDualUndo(presolverec *psdata, int rownr, int colnr)\n{\n  lprec    *lp = psdata->lp;\n  MYBOOL   firstdone = FALSE;\n  int      ix, iix, item;\n  REAL     Aij = get_mat(lp, rownr, colnr);\n  MATrec   *mat = lp->matA;\n\n  if(presolve_collength(psdata, colnr) == 0)\n    return;\n\n  /* Add undo information for the dual of the deleted constraint */\n  item = 0;\n  for(ix = presolve_nextrow(psdata, colnr, &item); ix >= 0;\n      ix = presolve_nextrow(psdata, colnr, &item)) {\n    iix = COL_MAT_ROWNR(ix);\n    if(iix == rownr)\n      continue;\n    if(!firstdone)\n      firstdone = addUndoPresolve(lp, FALSE, rownr, get_mat(lp, 0, colnr)/Aij,\n                                                    get_mat_byindex(lp, ix, FALSE, TRUE)/Aij, iix);\n    else\n      appendUndoPresolve(lp, FALSE, get_mat_byindex(lp, ix, FALSE, TRUE)/Aij, iix);\n  }\n}\n\n/* ----------------------------------------------------------------------------- */\n/* Presolve debugging routines                                                   */\n/* ----------------------------------------------------------------------------- */\nSTATIC MYBOOL presolve_SOScheck(presolverec *psdata)\n{\n  MYBOOL status = TRUE;\n  lprec  *lp = psdata->lp;\n  int    *list, i, j, n, k, nk, colnr, nSOS = SOS_count(lp), nerr = 0;\n  SOSrec *SOS;\n\n  if(nSOS == 0)\n    return( status );\n\n  /* For each SOS and each member check validity */\n  for(i = 1; i<= nSOS; i++) {\n    SOS = lp->SOS->sos_list[i-1];\n    list = SOS->members;\n    n = list[0];\n    for(j = 1; j<= n; j++) {\n      colnr = list[j];\n      /* Check valid range */\n      if((colnr < 1) || (colnr > lp->columns)) {\n        nerr++;\n        report(lp, IMPORTANT, \"presolve_SOScheck: A - Column index %d is outside of valid range\\n\",\n                              colnr);\n      }\n      /* Check for deletion */\n      if(!isActiveLink(psdata->cols->varmap, colnr)) {\n        nerr++;\n        report(lp, IMPORTANT, \"presolve_SOScheck: B - Column index %d has been marked for deletion\\n\",\n                              colnr);\n      }\n      /* Check if sorted member array is Ok */\n      if(SOS_member_index(lp->SOS, i, colnr) != j) {\n        nerr++;\n        report(lp, IMPORTANT, \"presolve_SOScheck: C - Column index %d not found in fast search array\\n\",\n                              colnr);\n      }\n      /* Check for variable membership in this SOS record of the sparse storage */\n      k = lp->SOS->memberpos[colnr-1];\n      nk = lp->SOS->memberpos[colnr];\n      while((k < nk) && (lp->SOS->membership[k] != i))\n        k++;\n      if(k >= nk) {\n        nerr++;\n        report(lp, IMPORTANT, \"presolve_SOScheck: D - Column index %d was not found in sparse array\\n\",\n                              colnr);\n      }\n    }\n  }\n\n  /* Check that all members in the sparse array can be validated as SOS members */\n  for(colnr = 1; colnr <= lp->columns; colnr++) {\n    k = lp->SOS->memberpos[colnr-1];\n    nk = lp->SOS->memberpos[colnr];\n    for(; k < nk; k++) {\n      if(!SOS_is_member(lp->SOS, lp->SOS->membership[k], colnr)) {\n        nerr++;\n        report(lp, IMPORTANT, \"presolve_SOScheck: E - Sparse array did not indicate column index %d as member of SOS %d\\n\",\n                              colnr, lp->SOS->membership[k]);\n      }\n    }\n  }\n  status = (MYBOOL) (nerr == 0);\n  if(!status)\n    report(lp, IMPORTANT, \"presolve_SOScheck: There were %d errors\\n\",\n                           nerr);\n\n\n  return( status );\n}\n\n/* ----------------------------------------------------------------------------- */\n/* Presolve routines for tightening the model                                    */\n/* ----------------------------------------------------------------------------- */\n\nINLINE REAL presolve_roundrhs(lprec *lp, REAL value, MYBOOL isGE)\n{\n#ifdef DoPresolveRounding\n  REAL eps = PRESOLVE_EPSVALUE*1000,\n  /* REAL eps = PRESOLVE_EPSVALUE*pow(10.0,MAX(0,log10(1+fabs(value)))), */\n  testout = my_precision(value, eps);\n#if 1\n  if(my_chsign(isGE, value-testout) < 0)\n    value = testout;\n#elif 0\n  if(my_chsign(isGE, value-testout) < 0)\n    value = testout;\n  else if(value != testout)\n    value += my_chsign(isGE, (value-testout)/2);\n    /* value = testout + my_chsign(isGE, (value-testout)/2); */\n#else\n  if(testout != value)\n    value += my_chsign(isGE, eps*1000);              /* BASE OPTION */\n#endif\n\n#endif\n  return( value );\n}\n\nINLINE REAL presolve_roundval(lprec *lp, REAL value)\n{\n#ifdef DoPresolveRounding\n  /* value = my_precision(value, PRESOLVE_EPSVALUE*MAX(1,log10(1+fabs(value)))); */\n  value = my_precision(value, PRESOLVE_EPSVALUE);    /* BASE OPTION */\n#endif\n  return( value );\n}\n\nINLINE MYBOOL presolve_mustupdate(lprec *lp, int colnr)\n{\n#if 0\n  return( my_infinite(lp, get_lowbo(lp, colnr)) ||\n          my_infinite(lp, get_upbo(lp, colnr)) );\n#else\n  return( my_infinite(lp, lp->orig_lowbo[lp->rows+colnr]) ||\n          my_infinite(lp, lp->orig_upbo[lp->rows+colnr]) );\n#endif\n}\n\nINLINE REAL presolve_sumplumin(lprec *lp, int item, psrec *ps, MYBOOL doUpper)\n{\n  REAL *plu = (doUpper ? ps->pluupper : ps->plulower),\n       *neg = (doUpper ? ps->negupper : ps->neglower);\n\n  if(fabs(plu[item]) >= lp->infinite)\n    return( plu[item] );\n  else if(fabs(neg[item]) >= lp->infinite)\n    return( neg[item] );\n  else\n    return( plu[item]+neg[item] );\n}\n\nINLINE void presolve_range(lprec *lp, int rownr, psrec *ps, REAL *loValue, REAL *hiValue)\n{\n  *loValue = presolve_sumplumin(lp, rownr,   ps, FALSE);\n  *hiValue = presolve_sumplumin(lp, rownr,   ps, TRUE);\n}\n\nSTATIC void presolve_rangeorig(lprec *lp, int rownr, psrec *ps, REAL *loValue, REAL *hiValue, REAL delta)\n{\n  delta = my_chsign(is_chsign(lp, rownr), lp->presolve_undo->fixed_rhs[rownr] + delta);\n  *loValue = presolve_sumplumin(lp, rownr,   ps, FALSE) + delta;\n  *hiValue = presolve_sumplumin(lp, rownr,   ps, TRUE) + delta;\n}\n\nSTATIC MYBOOL presolve_rowfeasible(presolverec *psdata, int rownr, MYBOOL userowmap)\n{\n  lprec    *lp = psdata->lp;\n  MYBOOL   status = TRUE;\n  int      contype, origrownr = rownr;\n  REAL     LHS, RHS, value;\n\n  /* Optionally loop across all active rows in the provided map (debugging) */\n  if(userowmap)\n    rownr = firstActiveLink(psdata->rows->varmap);\n\n  /* Now do once for ingoing rownr or loop across rowmap */\n  while((status == TRUE) && (rownr != 0)) {\n\n    /* Check the lower bound */\n    value = presolve_sumplumin(lp, rownr, psdata->rows, TRUE);\n    LHS = get_rh_lower(lp, rownr);\n    if(value < LHS-lp->epssolution) {\n      contype = get_constr_type(lp, rownr);\n      report(lp, NORMAL, \"presolve_rowfeasible: Lower bound infeasibility in %s row %s (%g << %g)\\n\",\n                          get_str_constr_type(lp, contype), get_row_name(lp, rownr), value, LHS);\n      if(rownr != origrownr)\n      report(lp, NORMAL, \"        ...           Input row base used for testing was %s\\n\",\n                                                    get_row_name(lp, origrownr));\n      status = FALSE;\n    }\n\n    /* Check the upper bound */\n    value = presolve_sumplumin(lp, rownr, psdata->rows, FALSE);\n    RHS = get_rh_upper(lp, rownr);\n    if(value > RHS+lp->epssolution) {\n      contype = get_constr_type(lp, rownr);\n      report(lp, NORMAL, \"presolve_rowfeasible: Upper bound infeasibility in %s row %s (%g >> %g)\\n\",\n                          get_str_constr_type(lp, contype), get_row_name(lp, rownr), value, RHS);\n      status = FALSE;\n    }\n    if(userowmap)\n      rownr = nextActiveLink(psdata->rows->varmap, rownr);\n    else\n      rownr = 0;\n  }\n  return( status );\n}\n\nSTATIC MYBOOL presolve_debugmap(presolverec *psdata, char *caption)\n{\n  lprec *lp = psdata->lp;\n  MATrec *mat = lp->matA;\n  int    colnr, ix, ie, nx, jx, je, *cols, *rows, n;\n  int    nz = mat->col_end[lp->columns] - 1;\n  MYBOOL status = FALSE;\n\n  for(colnr = 1; colnr <= lp->columns; colnr++) {\n    rows = psdata->cols->next[colnr];\n    if(!isActiveLink(psdata->cols->varmap, colnr)) {\n      if(rows != NULL) {\n        report(lp, SEVERE, \"presolve_debugmap: Inactive column %d is non-empty\\n\",\n                           colnr);\n        goto Done;\n      }\n      else\n        continue;\n    }\n    if(rows == NULL)\n      report(lp, SEVERE, \"presolve_debugmap: Active column %d is empty\\n\",\n                         colnr);\n    je = *rows;\n    rows++;\n    for(jx = 1; jx <= je; jx++, rows++) {\n      if((*rows < 0) || (*rows > nz)) {\n        report(lp, SEVERE, \"presolve_debugmap: NZ index %d for column %d out of range (index %d<=%d)\\n\",\n                           *rows, colnr, jx, je);\n        goto Done;\n      }\n      cols = psdata->rows->next[COL_MAT_ROWNR(*rows)];\n      ie = cols[0];\n      n = 0;\n      for(ix = 1; ix <= ie; ix++) {\n        nx = cols[ix];\n        if((nx < 0) || (nx > nz)) {\n          report(lp, SEVERE, \"presolve_debugmap: NZ index %d for column %d to row %d out of range\\n\",\n                             nx, colnr, jx);\n          goto Done;\n        }\n      }\n    }\n  }\n  status = TRUE;\nDone:\n  if(!status && (caption != NULL))\n    report(lp, SEVERE, \"...caller was '%s'\\n\", caption);\n  return( status );\n}\n\nSTATIC MYBOOL presolve_validate(presolverec *psdata, MYBOOL forceupdate)\n{\n  int    i, ie, j, je, k, rownr, *items;\n  REAL   upbound, lobound, value;\n  lprec  *lp = psdata->lp;\n  MATrec *mat = lp->matA;\n  MYBOOL status = mat->row_end_valid && !forceupdate;\n\n  if(status)\n    return( status );\n  else if(!mat->row_end_valid)\n    status = mat_validate(mat);\n  else\n    status = forceupdate;\n  if(status) {\n\n    /* First update rows... */\n    for(i = 1; i <= lp->rows; i++) {\n\n      psdata->rows->plucount[i] = 0;\n      psdata->rows->negcount[i] = 0;\n      psdata->rows->pluneg[i]   = 0;\n\n      if(!isActiveLink(psdata->rows->varmap, i)) {\n        FREE(psdata->rows->next[i]);\n      }\n      else {\n        /* Create next column pointers by row */\n        k = mat_rowlength(mat, i);\n        allocINT(lp, &(psdata->rows->next[i]), k+1, AUTOMATIC);\n        items = psdata->rows->next[i];\n        je = mat->row_end[i];\n        k = 0;\n        for(j = mat->row_end[i-1]; j < je; j++)\n          if(isActiveLink(psdata->cols->varmap, ROW_MAT_COLNR(j))) {\n            k++;\n            items[k] = j;\n          }\n        items[0] = k;\n      }\n    }\n\n    /* ...then update columns */\n    for(j = 1; j <= lp->columns; j++) {\n\n      psdata->cols->plucount[j] = 0;\n      psdata->cols->negcount[j] = 0;\n      psdata->cols->pluneg[j]   = 0;\n\n      if(!isActiveLink(psdata->cols->varmap, j)) {\n        FREE(psdata->cols->next[j]);\n      }\n      else {\n        upbound = get_upbo(lp, j);\n        lobound = get_lowbo(lp, j);\n        if(is_semicont(lp, j) && (upbound > lobound)) {\n          if(lobound > 0)\n            lobound = 0;\n          else if(upbound < 0)\n            upbound = 0;\n        }\n\n        /* Create next row pointers by column */\n        k = mat_collength(mat, j);\n        allocINT(lp, &(psdata->cols->next[j]), k+1, AUTOMATIC);\n        items = psdata->cols->next[j];\n        ie = mat->col_end[j];\n        k = 0;\n        for(i = mat->col_end[j-1]; i < ie; i++) {\n          rownr = COL_MAT_ROWNR(i);\n          if(isActiveLink(psdata->rows->varmap, rownr)) {\n            k++;\n            items[k] = i;\n\n            /* Cumulate counts */\n            value = COL_MAT_VALUE(i);\n            if(my_chsign(is_chsign(lp, rownr), value) > 0) {\n              psdata->rows->plucount[rownr]++;\n              psdata->cols->plucount[j]++;\n            }\n            else {\n              psdata->rows->negcount[rownr]++;\n              psdata->cols->negcount[j]++;\n            }\n            if((lobound < 0) && (upbound >= 0)) {\n              psdata->rows->pluneg[rownr]++;\n              psdata->cols->pluneg[j]++;\n            }\n          }\n        }\n        items[0] = k;\n      }\n    }\n#ifdef Paranoia\n    presolve_debugmap(psdata, \"presolve_validate\");\n#endif\n  }\n  return( status );\n}\n\nSTATIC MYBOOL presolve_rowtallies(presolverec *psdata, int rownr, int *plu, int *neg, int *pluneg)\n{\n  REAL   value;\n  lprec  *lp = psdata->lp;\n  MATrec *mat = lp->matA;\n  int    ix, jx, ib = 0;\n  MYBOOL chsign = is_chsign(lp, rownr);\n\n  /* Initialize */\n  *plu = 0;\n  *neg = 0;\n  *pluneg = 0;\n\n  /* Loop over still active row members */\n  for(ix = presolve_nextcol(psdata, rownr, &ib); ix >= 0; ix = presolve_nextcol(psdata, rownr, &ib)) {\n\n    /* Get matrix column and value */\n    jx    = ROW_MAT_COLNR(ix);\n    value = ROW_MAT_VALUE(ix);\n\n    /* Cumulate counts */\n    if(my_chsign(chsign, value) > 0)\n      (*plu)++;\n    else\n      (*neg)++;\n    if((get_lowbo(lp, jx) < 0) && (get_upbo(lp, jx) >= 0))\n      (*pluneg)++;\n  }\n  return( TRUE );\n}\nSTATIC MYBOOL presolve_debugrowtallies(presolverec *psdata)\n{\n  lprec  *lp = psdata->lp;\n  int    i, plu, neg, pluneg, nerr = 0;\n\n  for(i = 1; i <= lp->rows; i++)\n    if(isActiveLink(psdata->rows->varmap, i) &&\n       presolve_rowtallies(psdata, i, &plu, &neg, &pluneg)) {\n      if((psdata->rows->plucount[i] != plu) ||\n         (psdata->rows->negcount[i] != neg) ||\n         (psdata->rows->pluneg[i] != pluneg)) {\n        nerr++;\n        report(lp, SEVERE, \"presolve_debugrowtallies: Detected inconsistent count for row %d\\n\", i);\n      }\n    }\n  return( (MYBOOL) (nerr == 0) );\n}\n\nSTATIC int presolve_debugcheck(lprec *lp, LLrec *rowmap, LLrec *colmap)\n{\n  int i, j, errc = 0;\n\n  /* Validate constraint bounds */\n  for(i = 1; i < lp->rows; i++) {\n    if((rowmap != NULL) && !isActiveLink(rowmap, i))\n      continue;\n    /* Check if we have a negative range */\n    if(lp->orig_upbo[i] < 0) {\n      errc++;\n      report(lp, SEVERE, \"presolve_debugcheck: Detected negative range %g for row %d\\n\",\n                         lp->orig_upbo[i], i);\n    }\n  }\n  /* Validate variables */\n  for(j = 1; j < lp->columns; j++) {\n    if((colmap != NULL) && !isActiveLink(colmap, j))\n      continue;\n    i = lp->rows+j;\n    /* Check if we have infeasible  bounds */\n    if(lp->orig_lowbo[i] > lp->orig_upbo[i]) {\n      errc++;\n      report(lp, SEVERE, \"presolve_debugcheck: Detected UB < LB for column %d\\n\",\n                         j);\n    }\n  }\n  /* Return total number of errors */\n  return( errc );\n}\n\nSTATIC MYBOOL presolve_candeletevar(presolverec *psdata, int colnr)\n{\n  lprec    *lp = psdata->lp;\n  int      usecount = SOS_memberships(lp->SOS, colnr);\n\n  return( (MYBOOL) ((lp->SOS == NULL) || (usecount == 0) ||\n                    (/*is_presolve(lp, PRESOLVE_SOS) &&*/\n                     (((lp->SOS->sos1_count == lp->SOS->sos_count)) ||\n                      (usecount == SOS_is_member_of_type(lp->SOS, colnr, SOS1))))) );\n}\n\nSTATIC int presolve_rowlengthex(presolverec *psdata, int rownr)\n{\n  int j1 = psdata->rows->plucount[rownr] + psdata->rows->negcount[rownr];\n#ifdef Paranoia\n  int j2 = presolve_rowlength(psdata, rownr);\n\n  if(j1 != j2) {\n    report(psdata->lp, SEVERE, \"presolve_rowlengthex: Expected row length %d, but found %d in row %s\\n\",\n                                j2, j1, get_row_name(psdata->lp, rownr));\n    j1 = -j1;\n  }\n#endif\n\n  return( j1 );\n}\nSTATIC int presolve_rowlengthdebug(presolverec *psdata)\n{\n  int rownr, n = 0;\n\n  for(rownr = firstActiveLink(psdata->rows->varmap); rownr != 0;\n    rownr = nextActiveLink(psdata->rows->varmap, rownr))\n    n += presolve_rowlengthex(psdata, rownr);\n  return( n );\n}\n\nINLINE int presolve_nextrecord(psrec *ps, int recnr, int *previtem)\n{\n  int *nzlist = ps->next[recnr], nzcount = nzlist[0], status = -1;\n\n  /* Check if we simply wish the last active column */\n  if(previtem == NULL) {\n    if(nzlist != NULL)\n      status = nzlist[*nzlist];\n    return( status );\n  }\n\n  /* Step to next */\n#ifdef Paranoia\n  else if((*previtem < 0) || (*previtem > nzcount))\n    return( status );\n#endif\n  (*previtem)++;\n\n  /* Set the return values */\n  if(*previtem > nzcount)\n    (*previtem) = 0;\n  else\n    status = nzlist[*previtem];\n\n  return( status );\n}\nINLINE int presolve_nextcol(presolverec *psdata, int rownr, int *previtem)\n/* Find the first active (non-eliminated) nonzero column in rownr after prevcol */\n{\n  return( presolve_nextrecord(psdata->rows, rownr, previtem) );\n}\nINLINE int presolve_lastcol(presolverec *psdata, int rownr)\n{\n  return( presolve_nextrecord(psdata->rows, rownr, NULL) );\n}\nINLINE int presolve_nextrow(presolverec *psdata, int colnr, int *previtem)\n/* Find the first active (non-eliminated) nonzero row in colnr after prevrow */\n{\n  return( presolve_nextrecord(psdata->cols, colnr, previtem) );\n}\nINLINE int presolve_lastrow(presolverec *psdata, int colnr)\n{\n  return( presolve_nextrecord(psdata->cols, colnr, NULL) );\n}\n\nINLINE void presolve_adjustrhs(presolverec *psdata, int rownr, REAL fixdelta, REAL epsvalue)\n{\n  lprec *lp = psdata->lp;\n\n  lp->orig_rhs[rownr] -= fixdelta;\n  if(epsvalue > 0)\n#if 1\n    my_roundzero(lp->orig_rhs[rownr], epsvalue);\n#else\n    lp->orig_rhs[rownr] = presolve_roundrhs(lp, lp->orig_rhs[rownr], FALSE);\n#endif\n  lp->presolve_undo->fixed_rhs[rownr] += fixdelta;\n}\n\nSTATIC int presolve_shrink(presolverec *psdata, int *nConRemove, int *nVarRemove)\n{\n  SOSgroup *SOS = psdata->lp->SOS;\n  int     status = RUNNING, countR = 0, countC = 0,\n          i, ix, n, *list;\n  REAL    fixValue;\n\n  /* Remove empty rows */\n  list = psdata->rows->empty;\n  if(list != NULL) {\n    n = list[0];\n    for(i = 1; i <= n; i++)\n      if(isActiveLink(psdata->rows->varmap, list[i])) {\n        presolve_rowremove(psdata, list[i], FALSE);\n        countR++;\n      }\n    if(nConRemove != NULL)\n      (*nConRemove) += countR;\n    list[0] = 0;\n  }\n\n  /* Fix and remove empty columns (unless they are in a SOS) */\n  list = psdata->cols->empty;\n  if(list != NULL) {\n    n = list[0];\n    for(i = 1; i <= n; i++) {\n      ix = list[i];\n      if(isActiveLink(psdata->cols->varmap, ix)) {\n        if(presolve_colfixdual(psdata, ix, &fixValue, &status)) {\n          if(!presolve_colfix(psdata, ix, fixValue, TRUE, nVarRemove)) {\n            status = presolve_setstatus(psdata, INFEASIBLE);\n            break;\n          }\n          presolve_colremove(psdata, ix, FALSE);\n          countC++;\n        }\n        else if(SOS_is_member(SOS, 0, ix))\n          report(psdata->lp, DETAILED, \"presolve_shrink: Empty column %d is member of a SOS\\n\", ix);\n      }\n    }\n    list[0] = 0;\n  }\n\n  return( status );\n}\n\nSTATIC void presolve_rowremove(presolverec *psdata, int rownr, MYBOOL allowcoldelete)\n{\n  lprec    *lp = psdata->lp;\n  MATrec   *mat = lp->matA;\n  int      ix, ie, nx, jx, je, *cols, *rows, n, colnr;\n\n#ifdef Paranoia\n  if((rownr < 1) || (rownr > lp->rows))\n    report(lp, SEVERE, \"presolve_rowremove: Row %d out of range\\n\", rownr);\n#endif\n\n  /* Remove this row for each column that is active in the row */\n  cols = psdata->rows->next[rownr];\n  ie = *cols;\n  cols++;\n  for(ix = 1; ix <= ie; ix++, cols++) {\n    n = 0;\n    colnr = ROW_MAT_COLNR(*cols);\n    rows = psdata->cols->next[colnr];\n    je = rows[0];\n    /* See if we can narrow the search window */\n    jx = je / 2;\n    if((jx > 5) && (rownr >= COL_MAT_ROWNR(rows[jx])))\n      n = jx-1;\n    else\n      jx = 1;\n    /* Do the compression loop */\n    for(; jx <= je; jx++) {\n      nx = rows[jx];\n      if(COL_MAT_ROWNR(nx) != rownr) {\n        n++;\n        rows[n] = nx;\n      }\n    }\n    rows[0] = n;\n\n    /* Make sure we delete columns that have become empty */\n#if 1\n    if((n == 0) && allowcoldelete) {\n      int *list = psdata->cols->empty;\n      n = ++list[0];\n      list[n] = colnr;\n    }\n#endif\n\n  }\n  FREE(psdata->rows->next[rownr]);\n\n  removeLink(psdata->rows->varmap, rownr);\n  switch(get_constr_type(lp, rownr)) {\n    case LE: removeLink(psdata->LTmap, rownr);\n              break;\n    case EQ: removeLink(psdata->EQmap, rownr);\n              break;\n  }\n  if(isActiveLink(psdata->INTmap, rownr))\n    removeLink(psdata->INTmap, rownr);\n}\n\nSTATIC int presolve_colremove(presolverec *psdata, int colnr, MYBOOL allowrowdelete)\n{\n  lprec    *lp = psdata->lp;\n\n#ifdef Paranoia\n  if((colnr < 1) || (colnr > lp->columns))\n    report(lp, SEVERE, \"presolve_colremove: Column %d out of range\\n\", colnr);\n  if(!isActiveLink(psdata->cols->varmap, colnr) || !presolve_candeletevar(psdata, colnr))\n    colnr = -1;\n  else\n#endif\n  {\n    MATrec *mat = lp->matA;\n    int    ix, ie, nx, jx, je, *cols, *rows, n, rownr;\n\n    /* Remove this column for each row that is active in the column */\n    rows = psdata->cols->next[colnr];\n    je = *rows;\n    rows++;\n    for(jx = 1; jx <= je; jx++, rows++) {\n      n = 0;\n      rownr = COL_MAT_ROWNR(*rows);\n      cols = psdata->rows->next[rownr];\n      ie = cols[0];\n      /* See if we can narrow the search window */\n      ix = ie / 2;\n      if((ix > 5) && (colnr >= ROW_MAT_COLNR(cols[ix])))\n        n = ix-1;\n      else\n        ix = 1;\n      /* Do the compression loop */\n      for(; ix <= ie; ix++) {\n        nx = cols[ix];\n        if(ROW_MAT_COLNR(nx) != colnr) {\n          n++;\n          cols[n] = nx;\n        }\n      }\n      cols[0] = n;\n\n      /* Make sure we delete rows that become empty */\n#if 1\n      if((n == 0) && allowrowdelete) {\n        int *list = psdata->rows->empty;\n        n = ++list[0];\n        list[n] = rownr;\n      }\n#endif\n\n    }\n    FREE(psdata->cols->next[colnr]);\n\n    /* Update other counts */\n    if(SOS_is_member(lp->SOS, 0, colnr)) {\n      if(lp->sos_priority != NULL) {\n        lp->sos_vars--;\n        if(is_int(lp, colnr))\n          lp->sos_ints--;\n      }\n      SOS_member_delete(lp->SOS, 0, colnr);\n      clean_SOSgroup(lp->SOS, TRUE);\n      if(SOS_count(lp) == 0)\n        free_SOSgroup(&(lp->SOS));\n    }\n\n    /* Finally remove the column from the active column list */\n    colnr = removeLink(psdata->cols->varmap, colnr);\n  }\n  return( colnr );\n}\n\nSTATIC int presolve_redundantSOS(presolverec *psdata, int *nb, int *nSum)\n{\n  lprec    *lp = psdata->lp;\n  int      i, ii, k, kk, j, nrows = lp->rows, *fixed = NULL,\n           iBoundTighten = 0, status = RUNNING;\n  SOSrec   *SOS;\n\n  /* Is there anything to do? */\n  i = ii = SOS_count(lp);\n  if(ii == 0)\n    return( status );\n\n  /* Allocate working member list */\n  if(!allocINT(lp, &fixed, lp->columns+1, FALSE) )\n    return( lp->spx_status );\n\n  /* Check if we have SOS'es that are already satisfied or fixable/satisfiable */\n  while(i > 0) {\n    SOS = lp->SOS->sos_list[i-1];\n    kk = SOS->members[0];\n    fixed[0] = 0;\n    for(k = 1; k <= kk; k++) {\n      j = SOS->members[k];\n      if((get_lowbo(lp, j) > 0) && !is_semicont(lp, j)) {\n        fixed[++fixed[0]] = k;\n        /* Abort if we have identified SOS infeasibility */\n        if(fixed[0] > SOS->type) {\n          status = presolve_setstatus(psdata, INFEASIBLE);\n          goto Done;\n        }\n      }\n    }\n    /* If there were an exact number of non-zero SOS members, check their sequentiality */\n    if(fixed[0] == SOS->type) {\n      /* Check sequentiality of members with non-zero lower bounds */\n      for(k = 2; k <= fixed[0]; k++) {\n        if(fixed[k] != fixed[k-1]+1) {\n          status = presolve_setstatus(psdata, INFEASIBLE);\n          goto Done;\n        }\n      }\n      /* Fix other member variables to zero, if necessary */\n      for(k = kk; k > 0; k--) {\n        j = SOS->members[k];\n        if((get_lowbo(lp, j) > 0) && !is_semicont(lp, j))\n          continue;\n        if(!presolve_colfix(psdata, j, 0.0, AUTOMATIC, &iBoundTighten)) {\n          status = presolve_setstatus(psdata, INFEASIBLE);\n          goto Done;\n        }\n      }\n      /* Remove the SOS */\n      delete_SOSrec(lp->SOS, i /* , FALSE */);\n    }\n    /* Otherwise, try to fix variables outside the SOS type window */\n    else if(fixed[0] > 0) {\n      for(k = kk; k > 0; k--) {\n        if((k > fixed[fixed[0]]-SOS->type) && /* After leading entries   */\n           (k < fixed[1]+SOS->type))          /* Before trailing entries */\n          continue;\n        j = SOS->members[k];\n        SOS_member_delete(lp->SOS, i, j);\n        /* if(get_upbo(lp, j) - get_lowbo(lp, j) < lp->epsprimal) */\n        if(is_fixedvar(lp, nrows+j))\n          continue;\n        if(!presolve_colfix(psdata, j, 0.0, AUTOMATIC, &iBoundTighten)) {\n          status = presolve_setstatus(psdata, INFEASIBLE);\n          goto Done;\n        }\n      }\n    }\n    i--;\n  }\n\n  /* Update the sparse member map if there were SOS deletions;\n     Remember that delete_SOSrec() above specified deferred updating! */\n  i = SOS_count(lp);\n  if((i < ii) || (iBoundTighten > 0)) {\n    SOS_member_updatemap(lp->SOS);\n  }\n\n  /* Update tag orders */\n  for(; i > 0; i--)\n    lp->SOS->sos_list[i-1]->tagorder = i;\n\nDone:\n  FREE(fixed);\n  (*nb) += iBoundTighten;\n  (*nSum) += iBoundTighten;\n\n  return( status );\n}\n\nSTATIC MYBOOL presolve_fixSOS1(presolverec *psdata, int colnr, REAL fixvalue, int *nr, int *nv)\n{\n  lprec    *lp = psdata->lp;\n  int      i, k, j;\n  SOSrec   *SOS;\n  REAL     newvalue;\n  MYBOOL   *fixed = NULL, status = FALSE;\n\n  /* Allocate working member list */\n  if(!allocMYBOOL(lp, &fixed, lp->columns+1, TRUE) )\n    return(FALSE);\n\n  /* Fix variables in SOS's where colnr is a member */\n  i = SOS_count(lp);\n  while(i > 0) {\n    /* Set next SOS target (note that colnr has been tested earlier as not being a member of a higher order SOS) */\n    SOS = lp->SOS->sos_list[i-1];\n    if(SOS_is_member(lp->SOS, i, colnr)) {\n      for(k = SOS->members[0]; k > 0; k--) {\n        j = SOS->members[k];\n        if(fixed[j])\n          continue;\n        if(j == colnr) {\n          fixed[j] = TRUE;\n          newvalue = fixvalue;\n        }\n        else {\n          fixed[j] = AUTOMATIC;\n          newvalue = 0.0;\n        }\n        /* If it is a member of a higher order SOS then just change bounds */\n        if(!presolve_candeletevar(psdata, j)) {\n          set_bounds(lp, j, newvalue, newvalue);\n          fixed[j] = TRUE | AUTOMATIC;\n          psdata->forceupdate = TRUE;\n        }\n        /* Otherwise fix it in preparation for removal */\n        else if(!presolve_colfix(psdata, j, newvalue, TRUE, nv))\n          goto Done;\n      }\n    }\n    i--;\n  }\n\n  /* Delete SOS'es or SOS member variables where we can */\n  k = i = SOS_count(lp);\n  while(i > 0) {\n    /* Set next SOS target */\n    SOS = lp->SOS->sos_list[i-1];\n    if(SOS_is_member(lp->SOS, i, colnr)) {\n      /* Always delete SOS1's */\n      if(SOS->type == SOS1)\n        delete_SOSrec(lp->SOS, i /* , FALSE */);\n      /* Only delete leading or trailing SOS members in higher-order SOS'es that are fixed at 0;\n        (note that this section of the code will never be called in the current setup) */\n      else {\n        /* First the leading entries... */\n        for(j = 1; j <= SOS->members[0]; j++) {\n          if(fixed[SOS->members[j]] == AUTOMATIC)\n            SOS_member_delete(lp->SOS, i, SOS->members[j]);\n        }\n        /* ...then trailing entries */\n        for(j = SOS->members[0]; j > 0; j--) {\n          if(fixed[SOS->members[j]] == AUTOMATIC)\n            SOS_member_delete(lp->SOS, i, SOS->members[j]);\n        }\n      }\n    }\n    i--;\n  }\n\n  /* Update the sparse member map if there were SOS deletions; delete_SOSrec() above\n     specified deferred updating */\n  i = SOS_count(lp);\n  if(i < k)\n    SOS_member_updatemap(lp->SOS);\n\n  /* Delete the variables that have been fixed */\n  k = 0;\n  for(j = lp->columns; j > 0; j--) {\n    if((fixed[j] == TRUE) || (fixed[j] == AUTOMATIC)) {\n       presolve_colremove(psdata, j, TRUE);\n       k++;\n    }\n  }\n\n  /* Update tag orders */\n  i = SOS_count(lp);\n  for(; i > 0; i--)\n    lp->SOS->sos_list[i-1]->tagorder = i;\n\n  status = TRUE;\n\nDone:\n  FREE(fixed);\n  return( status );\n}\n\nSTATIC void presolve_setEQ(presolverec *psdata, int rownr)\n{\n  lprec *lp = psdata->lp;\n\n  if(is_constr_type(lp, rownr, LE))\n     removeLink(psdata->LTmap, rownr);\n   setLink(psdata->EQmap, rownr);\n   set_constr_type(lp, rownr, EQ);\n   psdata->dv_lobo[rownr] = -lp->infinite;\n   psdata->dv_upbo[rownr] = lp->infinite;\n}\n\nSTATIC MYBOOL presolve_singletonbounds(presolverec *psdata, int rownr, int colnr, REAL *lobound, REAL *upbound, REAL *aval)\n{\n  lprec  *lp = psdata->lp;\n  REAL   coeff_a, epsvalue = psdata->epsvalue;\n  MYBOOL isneg;\n\n  /* Compute row singleton variable range */\n  if(is_constr_type(lp, rownr, EQ) && (fabs(*lobound) < epsvalue))\n    *lobound = *upbound = 0;\n  else {\n    if(aval == NULL)\n      coeff_a = get_mat(lp, rownr, colnr);\n    else\n      coeff_a = *aval;\n    isneg = (MYBOOL) (coeff_a < 0);\n    if(*lobound > -lp->infinite)\n      *lobound /= coeff_a;\n    else if(isneg)\n      *lobound = -(*lobound);\n    if(*upbound < lp->infinite)\n      *upbound /= coeff_a;\n    else if(isneg)\n      *upbound = -(*upbound);\n    if(isneg)\n      swapREAL(lobound, upbound);\n  }\n\n  /* Check against bound - handle SC variables specially */\n  if(is_semicont(lp, colnr)) {\n    coeff_a = get_lowbo(lp, colnr);\n    if(coeff_a > 0) {\n      SETMAX(*lobound, 0.0);\n      SETMIN(*upbound, get_upbo(lp, colnr));\n    }\n    else {\n      coeff_a = get_upbo(lp, colnr);\n      if(coeff_a > 0) {\n        SETMAX(*lobound, get_lowbo(lp, colnr));\n        SETMIN(*upbound, 0.0);\n      }\n    }\n  }\n  else {\n    SETMAX(*lobound, get_lowbo(lp, colnr));\n    SETMIN(*upbound, get_upbo(lp, colnr));\n  }\n\n  /* Return with consistency status */\n#ifdef DoPresolveRelativeTest\n  isneg = (MYBOOL) (my_reldiff(*upbound, *lobound) >= - epsvalue);\n#else\n  isneg = (MYBOOL) (*upbound >= *lobound - epsvalue);\n#endif\n  if(!isneg) {\n    /* Attempt bound-related error correction */\n    if(fabs(my_reldiff(*lobound, get_upbo(lp, colnr))) < PRESOLVE_BOUNDSLACK*epsvalue)\n      *lobound = get_upbo(lp, colnr);\n    else if(fabs(my_reldiff(*upbound, get_lowbo(lp, colnr))) < PRESOLVE_BOUNDSLACK*epsvalue)\n      *upbound = get_lowbo(lp, colnr);\n#ifdef DoPresolveRelativeTest\n    isneg = (MYBOOL) (my_reldiff(*upbound, *lobound) >= - epsvalue);\n#else\n    isneg = (MYBOOL) (*upbound >= *lobound - epsvalue);\n#endif\n    if(!isneg)\n      report(lp, NORMAL, \"presolve_singletonbounds: Singleton variable %s in row %s infeasibility (%g << %g)\\n\",\n                         get_col_name(lp, colnr), get_row_name(lp, rownr), *lobound, *upbound);\n  }\n  return( isneg );\n}\n\nSTATIC MYBOOL presolve_altsingletonvalid(presolverec *psdata, int rownr, int colnr, REAL reflotest, REAL refuptest)\n{\n  lprec *lp = psdata->lp;\n  REAL  coeff_bl, coeff_bu, epsvalue = psdata->epsvalue;\n\n  coeff_bl = get_rh_lower(lp, rownr);\n  coeff_bu = get_rh_upper(lp, rownr);\n\n  /* Check base data validity */\n#ifdef DoPresolveRelativeTest\n  if((my_reldiff(refuptest, reflotest) < -epsvalue) ||\n#else\n  if((reflotest > refuptest + epsvalue) ||\n#endif\n     !presolve_singletonbounds(psdata, rownr, colnr, &coeff_bl, &coeff_bu, NULL))\n    return( FALSE );\n\n  /* Base data is Ok, now check against against each other */\n  epsvalue = MAX(reflotest-coeff_bu, coeff_bl-refuptest) / epsvalue;\n  if(epsvalue > PRESOLVE_BOUNDSLACK) {\n    report(lp, NORMAL, \"presolve_altsingletonvalid: Singleton variable %s in row %s infeasible (%g)\\n\",\n                       get_col_name(lp, colnr), get_row_name(lp, rownr), MAX(reflotest-coeff_bu, coeff_bl-refuptest));\n    return( FALSE );\n  }\n  else\n    return( TRUE );\n}\n\nSTATIC MYBOOL presolve_multibounds(presolverec *psdata, int rownr, int colnr,\n                                   REAL *lobound, REAL *upbound, REAL *aval, MYBOOL *rowbinds)\n{\n  lprec    *lp = psdata->lp;\n  MYBOOL   rowbindsvar = FALSE, status = FALSE;\n  REAL     coeff_a, LHS, RHS, netX, Xupper, Xlower, epsvalue = psdata->epsvalue;\n\n  /* Get variable bounds for netting */\n  LHS = *lobound;\n  RHS = *upbound;\n  Xlower = get_lowbo(lp, colnr);\n  Xupper = get_upbo(lp, colnr);\n\n  /* Identify opportunity for bound tightening */\n  if(aval == NULL)\n    coeff_a = get_mat(lp, rownr, colnr);\n  else\n    coeff_a = *aval;\n\n  netX = presolve_sumplumin(lp, rownr, psdata->rows, TRUE);\n  if(!my_infinite(lp, LHS) && !my_infinite(lp, netX)) {\n    if(coeff_a > 0) {\n      LHS -= netX-coeff_a*Xupper;\n      LHS /= coeff_a;\n      if(LHS > Xlower + epsvalue) {\n        Xlower = presolve_roundrhs(lp, LHS, TRUE);\n        status = TRUE;\n      }\n      else if(LHS > Xlower - epsvalue)\n        rowbindsvar = TRUE;\n    }\n    else {\n      LHS -= netX-coeff_a*Xlower;\n      LHS /= coeff_a;\n      if(LHS < Xupper - epsvalue) {\n        Xupper = presolve_roundrhs(lp, LHS, FALSE);\n        status = AUTOMATIC;\n      }\n      else if(LHS < Xupper + epsvalue)\n        rowbindsvar = AUTOMATIC;\n    }\n  }\n\n  netX = presolve_sumplumin(lp, rownr, psdata->rows, FALSE);\n  if(!my_infinite(lp, RHS) && !my_infinite(lp, netX)) {\n    if(coeff_a < 0) {\n      if(!my_infinite(lp, Xupper)) {\n        RHS -= netX-coeff_a*Xupper;\n        RHS /= coeff_a;\n        if(RHS > Xlower + epsvalue) {\n          Xlower = presolve_roundrhs(lp, RHS, TRUE);\n          status |= TRUE;\n        }\n        else if(RHS > Xlower - epsvalue)\n          rowbindsvar |= TRUE;\n      }\n    }\n    else if(!my_infinite(lp, Xlower)) {\n      RHS -= netX-coeff_a*Xlower;\n      RHS /= coeff_a;\n      if(RHS < Xupper - epsvalue) {\n        Xupper = presolve_roundrhs(lp, RHS, FALSE);\n        status |= AUTOMATIC;\n      }\n      else if(RHS < Xupper + epsvalue)\n        rowbindsvar |= AUTOMATIC;\n    }\n  }\n\n  *lobound = Xlower;\n  *upbound = Xupper;\n  if(rowbinds != NULL)\n    *rowbinds = rowbindsvar;\n\n  return(status);\n}\n\nSTATIC MYBOOL isnz_origobj(lprec *lp, int colnr)\n{\n  return( (MYBOOL) (lp->orig_obj[colnr] != 0) );\n}\n\nSTATIC MYBOOL presolve_testrow(presolverec *psdata, int lastrow)\n{\n  if(psdata->forceupdate) {\n    presolve_updatesums(psdata);\n    psdata->forceupdate = FALSE;\n  }\n  if(!presolve_rowfeasible(psdata, 0, TRUE))\n    return( FALSE );\n  else\n    return( TRUE );\n}\n\nSTATIC MYBOOL presolve_coltighten(presolverec *psdata, int colnr, REAL LOnew, REAL UPnew, int *count)\n{\n  lprec    *lp = psdata->lp;\n  int      elmnr, elmend, k, oldcount = 0, newcount = 0, deltainf;\n  REAL     LOold, UPold, Value, margin = psdata->epsvalue;\n  MATrec   *mat = lp->matA;\n  REAL     *value;\n  int      *rownr;\n\n  /* Attempt correction of marginally equal, but inconsistent input values */\n  Value = UPnew - LOnew;\n  if((Value <= -margin) && (Value > -lp->epsprimal)) {\n    if(fabs(fmod(UPnew, 1.0)) < margin)\n      LOnew = UPnew;\n    else\n      UPnew = LOnew;\n  }\n\n  /* Check if there is anything to do */\n  LOold = get_lowbo(lp, colnr);\n  UPold = get_upbo(lp, colnr);\n#ifdef Paranoia\n  if(((LOold > LOnew) && !is_semicont(lp, colnr)) || (UPold < UPnew)) {\n    report(lp, SEVERE, \"presolve_coltighten: Inconsistent new bounds requested for column %d\\n\", colnr);\n    return( FALSE );\n  }\n#endif\n  if(count != NULL)\n    newcount = *count;\n  oldcount = newcount;\n\n  /* Modify inf-count */\n  deltainf = 0;\n  if((UPold < lp->infinite) || (LOold > -lp->infinite))\n    deltainf -= 1;\n  if((UPnew < lp->infinite) || (LOnew > -lp->infinite))\n    deltainf += 1;\n  if(isnz_origobj(lp, colnr))\n    psdata->rows->infcount[0] += deltainf;\n  elmnr = mat->col_end[colnr-1];\n  elmend = mat->col_end[colnr];\n  rownr = &COL_MAT_ROWNR(elmnr);\n  for(; elmnr < elmend; elmnr++, rownr += matRowColStep) {\n    k = *rownr;\n    if(isActiveLink(psdata->rows->varmap, k))\n      psdata->rows->infcount[k] += deltainf;\n  }\n\n  /* Look for opportunity to tighten upper variable bound */\n  if((UPnew < lp->infinite) && (UPnew+margin < UPold)) {\n    if(is_int(lp, colnr))\n      UPnew = floor(UPnew+margin);\n    if(UPold < lp->infinite) {\n      /* First do OF */\n      k = 0;\n      Value = my_chsign(is_chsign(lp, k), lp->orig_obj[colnr]);\n      if((Value > 0) && (psdata->rows->pluupper[k] < lp->infinite))\n        psdata->rows->pluupper[k] += (UPnew-UPold)*Value;\n      else if((Value < 0) && (psdata->rows->negupper[k] < lp->infinite))\n        psdata->rows->negupper[k] += (LOnew-LOold)*Value;\n      psdata->rows->infcount[k] += deltainf;\n\n      /* Then scan the constraint rows */\n      elmnr = mat->col_end[colnr-1];\n      elmend = mat->col_end[colnr];\n      rownr = &COL_MAT_ROWNR(elmnr);\n      value = &COL_MAT_VALUE(elmnr);\n      for(; elmnr < elmend;\n          elmnr++, rownr += matRowColStep, value += matValueStep) {\n        k = *rownr;\n        if(!isActiveLink(psdata->rows->varmap, k))\n          continue;\n        Value = my_chsign(is_chsign(lp, k), *value);\n        if((Value > 0) && (psdata->rows->pluupper[k] < lp->infinite))\n          psdata->rows->pluupper[k] += (UPnew-UPold)*Value;\n        else if((Value < 0) && (psdata->rows->negupper[k] < lp->infinite))\n          psdata->rows->negupper[k] += (LOnew-LOold)*Value;\n      }\n    }\n    else\n      psdata->forceupdate = TRUE;\n    if(UPnew < UPold) {\n      UPold = UPnew;\n      newcount++;\n    }\n  }\n\n  /* Look for opportunity to tighten lower variable bound */\n  if((LOnew > -lp->infinite) && (LOnew-margin > LOold)) {\n    if(is_int(lp, colnr))\n       LOnew = ceil(LOnew-margin);\n    if(LOold > -lp->infinite) {\n      /* First do OF */\n      k = 0;\n      Value = my_chsign(is_chsign(lp, k), lp->orig_obj[colnr]);\n      if((Value > 0) && (psdata->rows->plulower[k] > -lp->infinite))\n        psdata->rows->plulower[k] += (LOnew-LOold)*Value;\n      else if((Value < 0) && (psdata->rows->neglower[k] > -lp->infinite))\n        psdata->rows->neglower[k] += (UPnew-UPold)*Value;\n\n      /* Then scan the constraint rows */\n      elmnr = mat->col_end[colnr-1];\n      elmend = mat->col_end[colnr];\n      rownr = &COL_MAT_ROWNR(elmnr);\n      value = &COL_MAT_VALUE(elmnr);\n      for(; elmnr < elmend;\n          elmnr++, rownr += matRowColStep, value += matValueStep) {\n        k = *rownr;\n        if(!isActiveLink(psdata->rows->varmap, k))\n          continue;\n        Value = my_chsign(is_chsign(lp, k), *value);\n        if((Value > 0) && (psdata->rows->plulower[k] > -lp->infinite))\n          psdata->rows->plulower[k] += (LOnew-LOold)*Value;\n        else if((Value < 0) && (psdata->rows->neglower[k] > -lp->infinite))\n          psdata->rows->neglower[k] += (UPnew-UPold)*Value;\n      }\n    }\n    else\n      psdata->forceupdate = TRUE;\n    if(LOnew > LOold) {\n      LOold = LOnew;\n      newcount++;\n    }\n  }\n\n  /* Now set the new variable bounds, if they are tighter */\n  if(newcount > oldcount) {\n    UPnew = presolve_roundval(lp, UPnew);\n    LOnew = presolve_roundval(lp, LOnew);\n    if(LOnew > UPnew) {\n      if(LOnew-UPnew < margin) {\n        LOnew = UPnew;\n      }\n      else {\n        report(lp, NORMAL, \"presolve_coltighten: Found column %s with LB %g > UB %g\\n\",\n                            get_col_name(lp, colnr), LOnew, UPnew);\n        return( FALSE );\n      }\n    }\n    if(lp->spx_trace || (lp->verbose > DETAILED))\n      report(lp, NORMAL, \"presolve_coltighten: Replaced bounds on column %s to [%g ... %g]\\n\",\n                         get_col_name(lp, colnr), LOnew, UPnew);\n    set_bounds(lp, colnr, LOnew, UPnew);\n  }\n  if(count != NULL)\n    *count = newcount;\n\n  return( TRUE );\n}\n\nSTATIC int presolve_rowtighten(presolverec *psdata, int rownr, int *tally, MYBOOL intsonly)\n{\n  lprec  *lp = psdata->lp;\n  MYBOOL rowbinds;\n  int    item = 0, jx, jjx, ix, idxn = 0, *idxbound = NULL, status = RUNNING;\n  REAL   *newbound = NULL, RHlo = get_rh_lower(lp, rownr), RHup = get_rh_upper(lp, rownr),\n         VARlo, VARup, Aval;\n  MATrec *mat = lp->matA;\n\n  jx = presolve_rowlength(psdata, rownr);\n  allocREAL(lp, &newbound, 2*jx, TRUE);\n  allocINT (lp, &idxbound, 2*jx, TRUE);\n\n  /* Identify bound tightening for each active variable in the constraint */\n  for(jx = presolve_nextcol(psdata, rownr, &item); jx >= 0;\n      jx = presolve_nextcol(psdata, rownr, &item)) {\n    jjx = ROW_MAT_COLNR(jx);\n    Aval = ROW_MAT_VALUE(jx);\n    Aval = my_chsign(rownr, Aval);\n\n    VARlo = RHlo;\n    VARup = RHup;\n    presolve_multibounds(psdata, rownr,jjx, &VARlo, &VARup, &Aval, &rowbinds);\n    if(rowbinds & TRUE) {\n      idxbound[idxn] = -jjx;\n      newbound[idxn] = VARlo;\n      idxn++;\n    }\n    if(rowbinds & AUTOMATIC) {\n      idxbound[idxn] = jjx;\n      newbound[idxn] = VARup;\n      idxn++;\n    }\n  }\n\n  /* Loop over the bounds identified for tightening and perform update */\n  ix = 0;\n  while(ix < idxn) {\n    jjx = idxbound[ix];\n    jx = abs(jjx);\n\n    /* Skip free variables and non-ints, if specified */\n    if(is_unbounded(lp, jx) ||\n       (intsonly && !is_int(lp, jx)))\n      continue;\n\n    VARlo = get_lowbo(lp, jx);\n    VARup = get_upbo(lp, jx);\n    /* while((ix < idxn) && (jx == abs(jjx))) { */\n    while((ix < idxn) && (jx == abs((jjx = idxbound[ix])))) {\n      if(jjx < 0)\n        VARlo = newbound[ix];\n      else\n        VARup = newbound[ix];\n      ix++;\n    }\n    if(!presolve_coltighten(psdata, jx, VARlo, VARup, tally)) {\n      status = presolve_setstatus(psdata, INFEASIBLE);\n      break;\n    }\n  }\n\n  FREE(newbound);\n  FREE(idxbound);\n\n  return(status);\n}\n\nSTATIC void set_dv_bounds(presolverec *psdata, int rownr, REAL lowbo, REAL upbo)\n{\n  psdata->dv_lobo[rownr] = lowbo;\n  psdata->dv_upbo[rownr] = upbo;\n}\nSTATIC REAL get_dv_lower(presolverec *psdata, int rownr)\n{\n  return( psdata->dv_lobo[rownr] );\n}\n\nSTATIC REAL get_dv_upper(presolverec *psdata, int rownr)\n{\n  return( psdata->dv_upbo[rownr] );\n}\n\nSTATIC MYBOOL presolve_rowfix(presolverec *psdata, int rownr, REAL newvalue, MYBOOL remove, int *tally)\n{\n  lprec    *lp = psdata->lp;\n  int      i, ix, ie;\n  MYBOOL   isneg, lofinite, upfinite, doupdate = FALSE, chsign = is_chsign(lp, rownr);\n  REAL     lobound, upbound, lovalue, upvalue,\n           Value, fixvalue, fixprod, mult;\n  MATrec   *mat = lp->matA;\n  psrec    *ps = psdata->cols;\n\n  /* Set \"fixed\" value in case we are deleting a variable */\n  upbound = get_dv_upper(psdata, rownr);\n  lobound = get_dv_lower(psdata, rownr);\n  if(remove) {\n    if(upbound-lobound < psdata->epsvalue) {\n      if((newvalue > lobound) && (newvalue < upbound))\n        fixvalue = newvalue;\n      else\n        fixvalue = lobound;\n    }\n    else {\n      if(my_infinite(lp, newvalue) && (get_rh(lp, rownr) == 0))\n        fixvalue = ((lobound <= 0) && (upbound >= 0) ? 0 : MIN(upbound, lobound));\n      else\n        fixvalue = newvalue;\n    }\n    set_dv_bounds(psdata, rownr, fixvalue, fixvalue);\n    if(fixvalue != 0)\n      addUndoPresolve(lp, FALSE, rownr, fixvalue, 0, 0);\n    mult = -1;\n  }\n  else {\n    mult = 1;\n    fixvalue = 0;\n  }\n\n  /* Loop over rows to update statistics */\n  ix = mat->row_end[rownr - 1];\n  ie = mat->row_end[rownr];\n  for(; ix < ie; ix++) {\n\n   /* Retrieve row data and adjust RHS if we are deleting a variable */\n    i     = ROW_MAT_COLNR(ix);\n    Value = ROW_MAT_VALUE(ix);\n    if(Value == 0)\n      continue;\n\n    if(remove && (fixvalue != 0)) {\n      fixprod = Value*fixvalue;\n      lp->orig_obj[i] -= fixprod;\n      my_roundzero(lp->orig_obj[i], psdata->epsvalue);\n      lp->presolve_undo->fixed_obj[i] += fixprod;\n    }\n\n   /* Prepare for further processing */\n    Value = my_chsign(chsign, Value);\n    isneg = (MYBOOL) (Value < 0);\n\n   /* Reduce row variable counts if we are removing the variable */\n    if(!isActiveLink(ps->varmap, i))\n      continue;\n    if(remove) {\n      if(isneg) {\n        ps->negcount[i]--;\n      }\n      else {\n        ps->plucount[i]--;\n      }\n      if((lobound < 0) && (upbound >= 0)) {\n        ps->pluneg[i]--;\n      }\n    }\n\n   /* Compute associated constraint contribution values */\n    upfinite = (MYBOOL) (upbound < lp->infinite);\n    lofinite = (MYBOOL) (lobound > -lp->infinite);\n    if(upfinite || lofinite) {\n      if(remove)\n        ps->infcount[i]--;\n      else\n        ps->infcount[i]++;\n    }\n    upvalue = my_if(upfinite, Value*upbound, my_chsign(isneg, lp->infinite));\n    lovalue = my_if(lofinite, Value*lobound, my_chsign(isneg, -lp->infinite));\n\n   /* Cumulate effective upper column bound (only bother with non-finite bound) */\n    if(isneg) {\n      if((ps->negupper[i] < lp->infinite) && lofinite) {\n        ps->negupper[i] += mult*lovalue;\n        ps->negupper[i] = presolve_roundrhs(lp, ps->negupper[i], FALSE);\n      }\n      else if(remove && !lofinite)\n        doupdate = TRUE;\n      else\n        ps->negupper[i] = lp->infinite;\n    }\n    else {\n      if((ps->pluupper[i] < lp->infinite) && upfinite) {\n        ps->pluupper[i] += mult*upvalue;\n        ps->pluupper[i] = presolve_roundrhs(lp, ps->pluupper[i], FALSE);\n      }\n      else if(remove && !upfinite)\n        doupdate = TRUE;\n      else\n        ps->pluupper[i] = lp->infinite;\n    }\n\n   /* Cumulate effective lower column bound (only bother with non-finite bound) */\n    if(isneg) {\n      if((ps->neglower[i] > -lp->infinite) && upfinite) {\n        ps->neglower[i] += mult*upvalue;\n        ps->neglower[i] = presolve_roundrhs(lp, ps->neglower[i], TRUE);\n      }\n      else if(remove && !upfinite)\n        doupdate = TRUE;\n      else\n        ps->neglower[i] = -lp->infinite;\n    }\n    else {\n      if((ps->plulower[i] > -lp->infinite) && lofinite) {\n        ps->plulower[i] += mult*lovalue;\n        ps->plulower[i] = presolve_roundrhs(lp, ps->plulower[i], TRUE);\n      }\n      else if(remove && !lofinite)\n        doupdate = TRUE;\n      else\n        ps->plulower[i] = -lp->infinite;\n    }\n\n   /* Validate consistency of eliminated singleton */\n    if(remove && ((i == 0) || (ps->next[i][0] == 1)) && !psdata->forceupdate) {\n      presolve_range(lp, i, ps, &lovalue, &upvalue);\n      Value = get_mat(lp, 0, i);\n      if((upvalue < Value) ||\n         (lovalue > Value)) {\n        report(lp, IMPORTANT, \"presolve: Row %s (%g << %g) infeasibility in column %s (OF=%g)\\n\",\n                              get_row_name(lp, rownr), lovalue, upvalue, get_col_name(lp, i), Value);\n        return( FALSE );\n      }\n    }\n  }\n  if(remove) {\n    psdata->forceupdate |= doupdate;\n    if(tally != NULL)\n      (*tally)++;\n  }\n  return( TRUE );\n}\n\n\nSTATIC int presolve_colsingleton(presolverec *psdata, int i, int j, int *count)\n{\n  lprec    *lp = psdata->lp;\n  REAL     RHlow, RHup, LObound, UPbound, Value;\n\n#ifdef Paranoia\n  if(!isActiveLink(psdata->cols->varmap, j))\n    report(lp, SEVERE, \"presolve_colsingleton: Nothing to do, column %d was eliminated earlier\\n\",\n                       j);\n#endif\n\n  Value = get_mat(lp,i,j);\n  if(Value == 0)\n    return( RUNNING );\n\n  /* Initialize and identify semicontinuous variable */\n  LObound = get_lowbo(lp, j);\n  UPbound = get_upbo(lp, j);\n  if(is_semicont(lp, j) && (UPbound > LObound)) {\n    if(LObound > 0)\n      LObound = 0;\n    else if(UPbound < 0)\n      UPbound = 0;\n  }\n\n  /* Get singleton variable bounds */\n  RHlow = get_rh_lower(lp, i);\n  RHup  = get_rh_upper(lp, i);\n  if(!presolve_singletonbounds(psdata, i,j, &RHlow, &RHup, &Value))\n    return( presolve_setstatus(psdata, INFEASIBLE) );\n\n  if(presolve_coltighten(psdata, j, RHlow, RHup, count))\n    return( RUNNING );\n  else\n    return( presolve_setstatus(psdata, INFEASIBLE) );\n}\n\nSTATIC MYBOOL presolve_colfix(presolverec *psdata, int colnr, REAL newvalue, MYBOOL remove, int *tally)\n{\n  lprec    *lp = psdata->lp;\n  int      i, ix, ie;\n  MYBOOL   isneg, lofinite, upfinite, doupdate = FALSE, doOF = TRUE;\n  REAL     lobound, upbound, lovalue, upvalue,\n           Value, fixvalue, mult;\n  MATrec   *mat = lp->matA;\n  psrec    *ps = psdata->rows;\n  REAL     *value;\n  int      *rownr;\n\n  /* Set \"fixed\" value in case we are deleting a variable */\n  upbound = get_upbo(lp, colnr);\n  lobound = get_lowbo(lp, colnr);\n  if(remove) {\n    if(upbound-lobound < psdata->epsvalue) {\n      if((newvalue > lobound) && (newvalue < upbound))\n        fixvalue = newvalue;\n      else\n        fixvalue = lobound;\n    }\n    else {\n      if(my_infinite(lp, newvalue) && (get_mat(lp, 0, colnr) == 0))\n        fixvalue = ((lobound <= 0) && (upbound >= 0) ? 0 : MIN(upbound, lobound));\n      else\n        fixvalue = newvalue;\n    }\n#if 1 /* Fast normal version */\n    set_bounds(lp, colnr, fixvalue, fixvalue);\n#else /* Slower version that can be used for debugging/control purposes */\n    presolve_coltighten(psdata, colnr, fixvalue, fixvalue, NULL);\n    lobound = fixvalue;\n    upbound = fixvalue;\n#endif\n    if(fixvalue != 0)\n      addUndoPresolve(lp, TRUE, colnr, fixvalue, 0, 0);\n    mult = -1;\n  }\n  else {\n    mult = 1;\n    fixvalue = 0;\n  }\n\n  /* Adjust semi-continuous variable bounds to zero-base */\n  if(is_semicont(lp, colnr) && (upbound > lobound)) {\n    if(lobound > 0)\n      lobound = 0;\n    else if(upbound < 0)\n      upbound = 0;\n  }\n\n  /* Loop over rows to update statistics */\n  ix = mat->col_end[colnr - 1];\n  ie = mat->col_end[colnr];\n  rownr = &COL_MAT_ROWNR(ix);\n  value = &COL_MAT_VALUE(ix);\n  for(; doOF || (ix < ie);\n      ix++, rownr += matRowColStep, value += matValueStep) {\n\n   /* Retrieve row data and adjust RHS if we are deleting a variable */\nRestart:\n    if(doOF) {\n      i = 0;\n      Value = lp->orig_obj[colnr];\n    }\n    else {\n      i = *rownr;\n      Value = *value;\n      if(!isActiveLink(ps->varmap, i))\n        continue;\n    }\n    if(Value == 0)\n      goto BlockEnd;\n\n    if(remove && (fixvalue != 0))\n      presolve_adjustrhs(psdata, i, Value*fixvalue, psdata->epsvalue);\n\n   /* Prepare for further processing */\n    Value = my_chsign(is_chsign(lp, i), Value);\n    isneg = (MYBOOL) (Value < 0);\n\n   /* Reduce row variable counts if we are removing the variable */\n    if(remove == TRUE) {\n      if(isneg) {\n        ps->negcount[i]--;\n      }\n      else {\n        ps->plucount[i]--;\n      }\n      if((lobound < 0) && (upbound >= 0)) {\n        ps->pluneg[i]--;\n      }\n    }\n\n   /* Compute associated constraint contribution values */\n    upfinite = (MYBOOL) (upbound < lp->infinite);\n    lofinite = (MYBOOL) (lobound > -lp->infinite);\n    if(upfinite || lofinite) {\n      if(remove)\n        ps->infcount[i]--;\n      else\n        ps->infcount[i]++;\n    }\n    upvalue = my_if(upfinite, Value*upbound, my_chsign(isneg, lp->infinite));\n    lovalue = my_if(lofinite, Value*lobound, my_chsign(isneg, -lp->infinite));\n\n   /* Cumulate effective upper row bound (only bother with non-finite bound) */\n    if(isneg) {\n      if((ps->negupper[i] < lp->infinite) && lofinite) {\n        ps->negupper[i] += mult*lovalue;\n        ps->negupper[i] = presolve_roundrhs(lp, ps->negupper[i], FALSE);\n      }\n      else if(remove && !lofinite)\n        doupdate = TRUE;\n      else\n        ps->negupper[i] = lp->infinite;\n    }\n    else {\n      if((ps->pluupper[i] < lp->infinite) && upfinite) {\n        ps->pluupper[i] += mult*upvalue;\n        ps->pluupper[i] = presolve_roundrhs(lp, ps->pluupper[i], FALSE);\n      }\n      else if(remove && !upfinite)\n        doupdate = TRUE;\n      else\n        ps->pluupper[i] = lp->infinite;\n    }\n\n   /* Cumulate effective lower row bound (only bother with non-finite bound) */\n    if(isneg) {\n      if((ps->neglower[i] > -lp->infinite) && upfinite) {\n        ps->neglower[i] += mult*upvalue;\n        ps->neglower[i] = presolve_roundrhs(lp, ps->neglower[i], TRUE);\n      }\n      else if(remove && !upfinite)\n        doupdate = TRUE;\n      else\n        ps->neglower[i] = -lp->infinite;\n    }\n    else {\n      if((ps->plulower[i] > -lp->infinite) && lofinite) {\n        ps->plulower[i] += mult*lovalue;\n        ps->plulower[i] = presolve_roundrhs(lp, ps->plulower[i], TRUE);\n      }\n      else if(remove && !lofinite)\n        doupdate = TRUE;\n      else\n        ps->plulower[i] = -lp->infinite;\n    }\n\n   /* Validate consistency of eliminated singleton */\n    if(remove && ((i == 0) || (ps->next[i][0] == 1)) && !psdata->forceupdate) {\n      if(i == 0) {\n        lovalue = get_rh_lower(lp, i);\n        upvalue = get_rh_upper(lp, i);\n        report(lp, DETAILED, \"presolve_colfix: Objective determined by presolve as %18g\\n\",\n                             (is_maxim(lp) ? upvalue : lovalue));\n      }\n      else {\n        presolve_range(lp, i, ps, &lovalue, &upvalue);\n#if 1\n        Value = 0;\n#else\n        Value = MAX(fabs(upvalue), fabs(lovalue));\n        Value = psdata->epsvalue * MAX(1, Value);\n#endif\n        if((upvalue < get_rh_lower(lp, i)-Value) ||\n           (lovalue > get_rh_upper(lp, i)+Value)) {\n          report(lp, NORMAL, \"presolve_colfix: Variable %s (%g << %g) infeasibility in row %s (%g << %g)\\n\",\n                              get_col_name(lp, colnr), lovalue, upvalue,\n                              get_row_name(lp, i), get_rh_lower(lp,i), get_rh_upper(lp, i));\n          return( FALSE );\n        }\n      }\n    }\nBlockEnd:\n    if(doOF) {\n      doOF = FALSE;\n      if(ix < ie)\n        goto Restart;\n    }\n\n  }\n  if(remove) {\n    psdata->forceupdate |= doupdate;\n    if(tally != NULL)\n      (*tally)++;\n  }\n  return( TRUE );\n}\n\n/* Delete the columns of the specified row, but make sure we don't delete SOS variables.\n   Note that we cannot use presolve_nextcol() here, since the variables are deleted. */\nSTATIC int presolve_rowfixzero(presolverec *psdata, int rownr, int *nv)\n{\n  lprec  *lp = psdata->lp;\n  MATrec *mat = lp->matA;\n  int    ix, jx, ib = mat->row_end[rownr-1];\n  for(ix = mat->row_end[rownr]-1; ix >= ib; ix--) {\n    jx = ROW_MAT_COLNR(ix);\n    if(isActiveLink(psdata->cols->varmap, jx)) {\n      if(!presolve_colfix(psdata, jx, 0.0, TRUE, nv))\n        return( presolve_setstatus(psdata, INFEASIBLE) );\n      if(presolve_candeletevar(psdata, jx))\n        presolve_colremove(psdata, jx, TRUE);\n    }\n  }\n#ifdef xxParanoia\n  if(!presolve_debugrowtallies(psdata))\n    return( INFEASIBLE );\n#endif\n  return( RUNNING );\n}\n\n/* Function to find if a variable can be fixed based on considering the dual */\nSTATIC MYBOOL presolve_colfixdual(presolverec *psdata, int colnr, REAL *fixValue, int *status)\n{\n  lprec   *lp = psdata->lp;\n  MYBOOL  hasOF, isMI, isDualFREE = TRUE;\n  int     i, ix, ie, *rownr, signOF;\n  REAL    *value, loX, upX, eps = psdata->epsvalue;\n  MATrec  *mat = lp->matA;\n\n  /* First check basic variable range */\n  loX = get_lowbo(lp, colnr);\n  upX = get_upbo(lp, colnr);\n  if(((loX < 0) && (upX > 0)) ||\n     (fabs(upX-loX) < lp->epsvalue) ||\n     SOS_is_member_of_type(lp->SOS, colnr, SOSn))\n    return( FALSE );\n  isMI = (MYBOOL) (upX <= 0);\n\n  /* Retrieve OF (standard form assuming maximization) */\n  ix = mat->col_end[colnr - 1];\n  ie = mat->col_end[colnr];\n  rownr = &COL_MAT_ROWNR(ix);\n  value = &COL_MAT_VALUE(ix);\n  hasOF = isnz_origobj(lp, colnr);\n  if(hasOF)\n    signOF = my_sign(lp->orig_obj[colnr]);\n  else\n    signOF = 0;\n\n  /* Loop over all constraints involving active variable (standard form with LE constraints)*/\n  for(; (ix < ie) && isDualFREE;\n      ix++, rownr += matRowColStep, value += matValueStep) {\n    i = *rownr;\n    if(!isActiveLink(psdata->rows->varmap, i))\n      continue;\n    if(presolve_rowlength(psdata, i) == 1) {\n      REAL val = my_chsign(is_chsign(lp, i), *value),\n           loR = get_rh_lower(lp, i),\n           upR = get_rh_upper(lp, i);\n      if(!presolve_singletonbounds(psdata, i, colnr, &loR, &upR, &val)) {\n        *status = presolve_setstatus(psdata, INFEASIBLE);\n        return( FALSE );\n      }\n      if(loR > loX + psdata->epsvalue)\n        loX = presolve_roundrhs(lp, loR, TRUE);\n      if(upR < upX - psdata->epsvalue)\n        upX = presolve_roundrhs(lp, upR, FALSE);\n      continue;\n    }\n    else\n      isDualFREE = my_infinite(lp, get_rh_range(lp, i)) ||                                          /* Explicitly free */\n                   ((presolve_sumplumin(lp, i, psdata->rows, TRUE)-eps <= get_rh_upper(lp, i)) &&   /* Implicitly free */\n                    (presolve_sumplumin(lp, i, psdata->rows, FALSE)+eps >= get_rh_lower(lp, i)));\n    if(isDualFREE) {\n      if(signOF == 0)  /* Test on the basis of identical signs in the constraints */\n        signOF = my_sign(*value);\n      else             /* Test on the basis of constraint sign equal to OF sign */\n        isDualFREE = (MYBOOL) (signOF == my_sign(*value));\n    }\n  }\n\n  /* Set fixing value if we were successful */\n  if(isDualFREE) {\n    if(signOF == 0) {\n      SETMAX(loX, 0);\n      *fixValue = MIN(loX, upX);\n    }\n    else if(signOF > 0) {\n      if(my_infinite(lp, loX))\n        isDualFREE = FALSE;\n      else {\n        if(is_int(lp, colnr))\n          *fixValue = ceil(loX-PRESOLVE_EPSVALUE);\n        else\n          *fixValue = loX;\n      }\n    }\n    else {\n      if(my_infinite(lp, upX))\n        isDualFREE = FALSE;\n      else {\n        if(is_int(lp, colnr) && (upX != 0))\n          *fixValue = floor(upX+PRESOLVE_EPSVALUE);\n        else\n          *fixValue = upX;\n      }\n    }\n    if((*fixValue != 0) && SOS_is_member(lp->SOS, 0, colnr))\n      return( FALSE );\n\n  }\n\n  return( isDualFREE );\n}\n\n#if 0\nSTATIC MYBOOL presolve_probefix01(presolverec *psdata, int colnr, REAL *fixvalue)\n{\n  lprec    *lp = psdata->lp;\n  int      i, ix, item;\n  REAL     loLim, absvalue, epsvalue = psdata->epsvalue;\n  MATrec   *mat = lp->matA;\n  MYBOOL   chsign, canfix = FALSE;\n\n  if(!is_binary(lp, colnr))\n    return( canfix );\n\n  /* Loop over all active rows to search for fixing opportunity */\n  item = 0;\n  for(ix = presolve_nextrow(psdata, colnr, &item);\n      (ix >= 0) && !canfix;\n      ix = presolve_nextrow(psdata, colnr, &item)) {\n    i = COL_MAT_ROWNR(ix);\n    *fixvalue = COL_MAT_VALUE(ix);\n    chsign = is_chsign(lp, i);\n\n    /* First check the lower bound of the normalized constraint */\n    loLim = presolve_sumplumin(lp, i, psdata->rows, chsign);\n    loLim = my_chsign(chsign, loLim);\n    absvalue = fabs(*fixvalue);\n    canfix = (MYBOOL) ((loLim + absvalue > lp->orig_rhs[i]+epsvalue*MAX(1, absvalue)));\n\n    /* If we were unsuccessful in fixing above, try the upper bound\n       of the normalized constraint - if it is finite */\n    if(!canfix && !my_infinite(lp, get_rh_range(lp, i))) {\n      loLim = presolve_sumplumin(lp, i, psdata->rows, (MYBOOL) !chsign);\n      loLim = my_chsign(!chsign, loLim);\n      *fixvalue = -(*fixvalue);\n      canfix = (MYBOOL) ((loLim + absvalue > get_rh_range(lp, i)-lp->orig_rhs[i]+epsvalue*MAX(1, absvalue)));\n    }\n  }\n\n  /* Check if we were successful in identifying fixing opportunity */\n  if(canfix) {\n    if(*fixvalue < 0)\n      *fixvalue = 1;\n    else\n      *fixvalue = 0;\n  }\n  return( canfix );\n}\n#else\nSTATIC MYBOOL presolve_probefix01(presolverec *psdata, int colnr, REAL *fixvalue)\n{\n  lprec    *lp = psdata->lp;\n  int      i, ix, item;\n  REAL     loLim, upLim, range, absvalue, epsvalue = psdata->epsvalue, tolgap;\n  MATrec   *mat = lp->matA;\n  MYBOOL   chsign, status = FALSE;\n\n  if(!is_binary(lp, colnr))\n    return( status );\n\n  /* Loop over all active rows to search for fixing opportunity.  The logic is that if a\n     constraint gets violated by setting a variable at one of its bounds, then it can be\n     fixed at its opposite bound. */\n  item = 0;\n\n  for(ix = presolve_nextrow(psdata, colnr, &item); (ix >= 0); ix = presolve_nextrow(psdata, colnr, &item)) {\n    i = COL_MAT_ROWNR(ix);\n    *fixvalue = COL_MAT_VALUE(ix);\n    absvalue = fabs(*fixvalue);\n    SETMIN(absvalue, 100);\n    tolgap = epsvalue*MAX(1, absvalue);\n    chsign = is_chsign(lp, i);\n\n    /* Get the constraint value limits based on variable bounds, normalized to LE constraint */\n    loLim = presolve_sumplumin(lp, i, psdata->rows, FALSE);\n    upLim = presolve_sumplumin(lp, i, psdata->rows, TRUE);\n    if(chsign) {\n      loLim = my_chsign(chsign, loLim);\n      upLim = my_chsign(chsign, upLim);\n      swapREAL(&loLim, &upLim);\n    }\n\n    /* Check the upper constraint bound for possible violation if the value were to be fixed at 1 */\n    if(loLim + *fixvalue > lp->orig_rhs[i]+tolgap) {\n      if(*fixvalue < 0)\n        presolve_setstatus(psdata, INFEASIBLE);\n      *fixvalue = 0;\n      break;\n    }\n\n    /* Check the lower constraint bound for possible violation if the value were to be fixed at 1 */\n    range = get_rh_range(lp, i);\n    if(!my_infinite(lp, range) &&\n       (upLim + *fixvalue < lp->orig_rhs[i]-range-tolgap)) {\n      if(*fixvalue > 0)\n        presolve_setstatus(psdata, INFEASIBLE);\n      *fixvalue = 0;\n      break;\n    }\n\n    /* Check if we have to fix the value at 1 to avoid constraint infeasibility */\n    if(psdata->rows->infcount[i] >= 1)\n      continue;\n    if(((*fixvalue < 0) && (upLim + *fixvalue >= loLim-tolgap) && (upLim > lp->orig_rhs[i]+tolgap)) ||\n       ((*fixvalue > 0) && (loLim + *fixvalue <= upLim+tolgap) && (loLim < lp->orig_rhs[i]-range-tolgap) && !my_infinite(lp, range))) {\n      *fixvalue = 1;\n      break;\n    }\n  }\n  status = (MYBOOL) (ix >= 0);\n\n  /* Returns TRUE if fixing opportunity was identified */\n  return( status );\n}\n#endif\n\nSTATIC int presolve_probetighten01(presolverec *psdata, int colnr)\n{\n  lprec    *lp = psdata->lp;\n  MYBOOL   chsign;\n  int      i, ix, item, n = 0;\n  REAL     upLim, value, absvalue, epsvalue = psdata->epsvalue;\n  MATrec   *mat = lp->matA;\n\n#if 0 /* Handled in calling routine */\n  if(!is_binary(lp, colnr))\n    return( n );\n#endif\n\n  /* Loop over all active rows and do coefficient tightening for qualifying constraints */\n  item = 0;\n  for(ix = presolve_nextrow(psdata, colnr, &item); ix >= 0;\n      ix = presolve_nextrow(psdata, colnr, &item)) {\n    i = COL_MAT_ROWNR(ix);\n    value = COL_MAT_VALUE(ix);\n    chsign = is_chsign(lp, i);\n    upLim = presolve_sumplumin(lp, i, psdata->rows, (MYBOOL) !chsign);\n    upLim = my_chsign(chsign, upLim);\n\n    /* Does this constraint qualify for coefficient tightening? */\n    absvalue = fabs(value);\n    if(upLim - absvalue < lp->orig_rhs[i]-epsvalue*MAX(1, absvalue)) {\n      REAL delta = lp->orig_rhs[i] - upLim;\n      lp->orig_rhs[i] = upLim;\n      upLim = value - my_chsign(value < 0, delta);\n      COL_MAT_VALUE(ix) = upLim;\n      if(my_sign(value) != my_sign(upLim)) {\n        if(chsign) {\n          psdata->rows->negcount[i]--;\n          psdata->rows->plucount[i]++;\n        }\n        else {\n          psdata->rows->negcount[i]++;\n          psdata->rows->plucount[i]--;\n        }\n      }\n      n++;\n    }\n  }\n  return( n );\n}\n\nSTATIC int presolve_mergerows(presolverec *psdata, int *nRows, int *nSum)\n{\n  lprec *lp = psdata->lp;\n  MYBOOL candelete;\n  int    status = RUNNING, item1, item2,\n         firstix, RT1, RT2, i, ix, iix, j, jjx, n = 0;\n  REAL   Value1, Value2, bound;\n  MATrec *mat = lp->matA;\n\n  for(i = lastActiveLink(psdata->rows->varmap); (i > 0) && (status == RUNNING); ) {\n\n    /* First scan for rows with identical row lengths */\n    ix = prevActiveLink(psdata->rows->varmap, i);\n    if(ix == 0)\n      break;\n\n    /* Don't bother about empty rows or row singletons, since they are\n       handled by PRESOLVE_ROWS */\n    j = presolve_rowlength(psdata, i);\n    if(j <= 1) {\n      i = ix;\n      continue;\n    }\n\n#if 0\n    /* Enable this to scan all rows back */\n    RT2 = lp->rows;\n\n    /* Check abort since this section can be pretty \"expensive\" */\n    if(!presolve_statuscheck(psdata, &status))\n      return( status );\n#else\n    RT2 = 2+1;\n#endif\n    firstix = ix;\n    for(RT1 = 0; (ix > 0) && (RT1 < RT2) && (status == RUNNING);\n        ix = prevActiveLink(psdata->rows->varmap, ix), RT1++)  {\n      candelete = FALSE;\n      if(presolve_rowlength(psdata, ix) != j)\n        continue;\n\n      /* Check if the beginning columns are identical; if not, continue */\n      item1 = 0;\n      iix = presolve_nextcol(psdata, ix, &item1);\n      item2 = 0;\n      jjx = presolve_nextcol(psdata, i,  &item2);\n\n      if(ROW_MAT_COLNR(iix) != ROW_MAT_COLNR(jjx))\n        continue;\n\n      /* We have a candidate row; check if the entries have a fixed non-zero ratio */\n      Value1 = get_mat_byindex(lp, iix, TRUE, FALSE);\n      Value2 = get_mat_byindex(lp, jjx, TRUE, FALSE);\n      bound = Value1 / Value2;\n      Value1 = bound;\n\n      /* Loop over remaining entries */\n      jjx = presolve_nextcol(psdata, i, &item2);\n      for(; (jjx >= 0) && (Value1 == bound);\n          jjx = presolve_nextcol(psdata, i, &item2)) {\n        iix = presolve_nextcol(psdata, ix, &item1);\n        if(ROW_MAT_COLNR(iix) != ROW_MAT_COLNR(jjx))\n          break;\n        Value1 = get_mat_byindex(lp, iix, TRUE, FALSE);\n        Value2 = get_mat_byindex(lp, jjx, TRUE, FALSE);\n\n        /* If the ratio is different from the reference value we have a mismatch */\n        Value1 = Value1 / Value2;\n        if(bound == lp->infinite)\n          bound = Value1;\n        else if(fabs(Value1 - bound) > psdata->epsvalue)\n          break;\n      }\n\n      /* Check if we found a match (we traversed all active columns without a break) */\n      if(jjx < 0) {\n\n        /* Get main reference values */\n        Value1 = lp->orig_rhs[ix];\n        Value2 = lp->orig_rhs[i] * bound;\n\n        /* First check for inconsistent equalities */\n        if((fabs(Value1 - Value2) > psdata->epsvalue) &&\n           ((get_constr_type(lp, ix) == EQ) && (get_constr_type(lp, i) == EQ))) {\n          report(lp, NORMAL, \"presolve_mergerows: Inconsistent equalities %d and %d found\\n\",\n                             ix, i);\n          status = presolve_setstatus(psdata, INFEASIBLE);\n        }\n\n        else {\n\n          /* Update lower and upper bounds */\n          if(is_chsign(lp, i) != is_chsign(lp, ix))\n            bound = -bound;\n\n          Value1 = get_rh_lower(lp, i);\n          if(Value1 <= -lp->infinite)\n            Value1 *= my_sign(bound);\n          else\n            Value1 *= bound;\n          my_roundzero(Value1, lp->epsdual);      /* Extra rounding tolerance *** */\n\n          Value2 = get_rh_upper(lp, i);\n          if(Value2 >= lp->infinite)\n            Value2 *= my_sign(bound);\n          else\n            Value2 *= bound;\n          my_roundzero(Value2, lp->epsdual);      /* Extra rounding tolerance *** */\n\n          if((bound < 0))\n            swapREAL(&Value1, &Value2);\n\n          bound = get_rh_lower(lp, ix);\n          if(Value1 > bound + psdata->epsvalue)\n            set_rh_lower(lp, ix, Value1);\n          else\n            Value1 = bound;\n          bound = get_rh_upper(lp, ix);\n          if(Value2 < bound - psdata->epsvalue)\n            set_rh_upper(lp, ix, Value2);\n          else\n            Value2 = bound;\n\n          /* Check results and make equality if appropriate */\n          if(fabs(Value2-Value1) < psdata->epsvalue)\n            presolve_setEQ(psdata, ix);\n          else if(Value2 < Value1) {\n            status = presolve_setstatus(psdata, INFEASIBLE);\n          }\n\n          /* Verify if we can continue */\n          candelete = (MYBOOL) (status == RUNNING);\n          if(!candelete) {\n            report(lp, NORMAL, \"presolve: Range infeasibility found involving rows %s and %s\\n\",\n                                get_row_name(lp, ix), get_row_name(lp, i));\n          }\n        }\n      }\n      /* Perform i-row deletion if authorized */\n      if(candelete) {\n        presolve_rowremove(psdata, i, TRUE);\n        n++;\n        break;\n      }\n    }\n    i = firstix;\n  }\n  (*nRows) += n;\n  (*nSum)  += n;\n\n  return( status );\n}\n\nSTATIC MYBOOL presolve_reduceGCD(presolverec *psdata, int *nn, int *nb, int *nsum)\n{\n  lprec    *lp = psdata->lp;\n  MYBOOL   status = TRUE;\n  int      i, jx, je, in = 0, ib = 0;\n  LLONG    GCDvalue;\n  REAL     *Avalue, Rvalue, epsvalue = psdata->epsvalue;\n  MATrec   *mat = lp->matA;\n\n  for(i = firstActiveLink(psdata->INTmap); i != 0; i = nextActiveLink(psdata->INTmap, i)) {\n\n    /* Obtain the row GCD */\n    jx = mat->row_end[i - 1];\n    je = mat->row_end[i];\n    Rvalue = ROW_MAT_VALUE(jx);\n    GCDvalue = abs((int) Rvalue);\n    jx++;\n    if(jx < je)\n    for(; (jx < je) && (GCDvalue > 1); jx++) {\n      Rvalue = fabs(ROW_MAT_VALUE(jx));\n      GCDvalue = gcd((LLONG) Rvalue, GCDvalue, NULL, NULL);\n    }\n\n    /* Reduce the coefficients, if possible */\n    if(GCDvalue > 1) {\n      jx = mat->row_end[i - 1];\n      je = mat->row_end[i];\n      for(; jx < je; jx++) {\n        Avalue = &ROW_MAT_VALUE(jx);\n        *Avalue /= GCDvalue;\n        in++;\n      }\n      Rvalue = (lp->orig_rhs[i] / GCDvalue) + epsvalue;\n      lp->orig_rhs[i] = floor(Rvalue);\n      Rvalue = fabs(lp->orig_rhs[i]-Rvalue);\n      if(is_constr_type(lp, i, EQ) && (Rvalue > epsvalue)) {\n        report(lp, NORMAL, \"presolve_reduceGCD: Infeasible equality constraint %d\\n\", i);\n        status = FALSE;\n        break;\n      }\n      if(!my_infinite(lp, lp->orig_upbo[i]))\n        lp->orig_upbo[i] = floor(lp->orig_upbo[i] / GCDvalue);\n      ib++;\n    }\n  }\n  if(status && (in > 0))\n    report(lp, DETAILED, \"presolve_reduceGCD: Did %d constraint coefficient reductions.\\n\", in);\n\n  (*nn)   += in;\n  (*nb)   += ib;\n  (*nsum) += in + ib;\n\n  return( status );\n}\n\nSTATIC int presolve_knapsack(presolverec *psdata, int *nn)\n{\n  lprec *lp = psdata->lp;\n  int    m, n, i, ix, j, jx, colnr, *rownr = NULL,\n         status = RUNNING;\n  REAL   *colOF = lp->orig_obj, value, *ratio = NULL;\n  LLrec  *map = psdata->EQmap;\n  MATrec *mat = lp->matA;\n\n  /* Check if it is worth trying */\n  m = mat->row_end[0];\n  if((map->count == 0) || (m < 2))\n    return( status );\n\n  /* Get the OF row */\n  allocINT(lp, &rownr,  map->count+1, FALSE);\n  allocREAL(lp, &ratio, map->count+1, FALSE);\n\n  /* Loop over each row trying to find equal entries in the OF */\n  rownr[0] = 0;\n  for(i = firstActiveLink(map); i != 0; i = nextActiveLink(map, i)) {\n    if(get_rh(lp, i) <= 0)\n      continue;\n    jx = mat->row_end[i];\n    n = 0;\n    for(j = mat->row_end[i-1]; j  < jx; j++, n++) {\n      colnr = ROW_MAT_COLNR(j);\n      value = ROW_MAT_VALUE(j);\n      if(colOF[colnr] == 0)\n        break;\n      if(n == 0) {\n        ratio[0] = colOF[colnr] / value;\n      }\n      else if(fabs(value * ratio[0] - colOF[colnr]) > psdata->epsvalue) {\n        n = -1;\n        break;\n      }\n    }\n    /* Register row if we were successful (and row long enough) */\n    if(n >= 2) {\n      ix = ++rownr[0];\n      rownr[ix] = i;\n      ratio[ix] = ratio[0];\n    }\n  }\n  n = rownr[0];\n  if(n == 0)\n    goto Finish;\n\n  /* Process the identified rows, eliminating the OF value */\n  for(ix = 1; ix <= n; ix++) {\n    i = rownr[ix];\n    jx = mat->row_end[i];\n    for(j = mat->row_end[i-1]; j  < jx; j++) {\n      colnr = ROW_MAT_COLNR(j);\n      colOF[colnr] = 0;\n    }\n  }\n\n  /* Update key mapper structures */\n  j = lp->columns;\n  psdata->cols->varmap = cloneLink(psdata->cols->varmap, j+n, TRUE);\n  psdata->forceupdate = TRUE;\n\n  /* Finally, add helper columns */\n  for(ix = 1; ix <= n; ix++) {\n    i = rownr[ix];\n    rownr[0] = 0;\n    colOF[0] = my_chsign(is_maxim(lp), ratio[ix]);\n    rownr[1] = i;\n    colOF[1] = -1;\n    value = get_rh(lp, i);\n/*    j = get_constr_type(lp, i); */\n    add_columnex(lp, 2, colOF, rownr);\n    set_bounds(lp, lp->columns, value, value);\n/*    presolve_setEQ(psdata, i); */\n    set_rh(lp, i, 0);\n    appendLink(psdata->cols->varmap, j+ix);\n  }\n  presolve_validate(psdata, TRUE);\n\n  /* Clean up before returning */\nFinish:\n  FREE(rownr);\n  FREE(ratio);\n  (*nn) += n;\n\n  return( status );\n}\n\nSTATIC MYBOOL presolve_invalideq2(lprec *lp, presolverec *psdata)\n{\n  int    jx, jjx, i = 0, item;\n  MATrec *mat = lp->matA;\n  MYBOOL error = FALSE;\n\n  do {\n\n    if(i == 0)\n      i = firstActiveLink(psdata->EQmap);\n    else\n      i = nextActiveLink(psdata->EQmap, i);\n    if(i == 0)\n      return( error );\n\n    /* Get the row index of the first 2-element equality */\n    for(; i > 0; i = nextActiveLink(psdata->EQmap, i))\n      if(presolve_rowlength(psdata, i) == 2)\n        break;\n    if(i == 0)\n      return( error );\n\n    /* Get the first column */\n    item = 0;\n    jx  = presolve_nextcol(psdata, i, &item);\n    if(jx < 0)\n      error = TRUE;\n    jx  = ROW_MAT_COLNR(jx);\n\n    /* Get the second column */\n    jjx = presolve_nextcol(psdata, i, &item);\n    if(jjx < 0)\n      error = AUTOMATIC;\n  } while(!error);\n\n  return( error );\n}\n\n/* Callback to obtain the non-zero rows of equality constraints */\nint BFP_CALLMODEL presolve_getcolumnEQ(lprec *lp, int colnr, REAL nzvalues[], int nzrows[], int mapin[])\n{\n  int    i, ib, ie, nn = 0;\n  MATrec *mat = lp->matA;\n\n  ib = mat->col_end[colnr-1];\n  ie = mat->col_end[colnr];\n  for(; ib < ie; ib++) {\n    i = COL_MAT_ROWNR(ib);\n    if(!is_constr_type(lp, i, EQ) ||  /* It has to be an equality constraint         */\n       (mapin[i] == 0))               /* And it should not already have been deleted */\n      continue;\n    if(nzvalues != NULL) {\n      nzrows[nn] = mapin[i];\n      nzvalues[nn] = COL_MAT_VALUE(ib);\n    }\n    nn++;\n  }\n  return( nn );\n}\nSTATIC int presolve_singularities(presolverec *psdata, int *nn, int *nr, int *nv, int *nSum)\n{\n  lprec *lp = psdata->lp;\n  int i, j, n, *rmapin = NULL, *rmapout = NULL, *cmapout = NULL;\n\n  if(lp->bfp_findredundant(lp, 0, NULL, NULL, NULL) == 0)\n    return( 0 );\n\n  /* Create condensed row map */\n  allocINT(lp, &rmapin, lp->rows+1, TRUE);\n  allocINT(lp, &rmapout, psdata->EQmap->count+1, FALSE);\n  allocINT(lp, &cmapout, lp->columns+1, FALSE);\n  n = 0;\n  for(i = firstActiveLink(psdata->EQmap); i != 0; i = nextActiveLink(psdata->EQmap, i)) {\n    n++;\n    rmapout[n] = i;\n    rmapin[i]  = n;\n  }\n  rmapout[0] = n;\n  n = 0;\n  for(i = firstActiveLink(psdata->cols->varmap); i != 0; i = nextActiveLink(psdata->cols->varmap, i)) {\n    n++;\n    cmapout[n]  = i;\n  }\n  cmapout[0] = n;\n\n  /* Do the rank-revealing factorization */\n  n = lp->bfp_findredundant(lp, psdata->EQmap->count, presolve_getcolumnEQ, rmapin, cmapout);\n\n  /* Delete the redundant rows */\n  for(i = 1; i <= n; i++) {\n    j = rmapin[i];\n    j = rmapout[j];\n    presolve_rowremove(psdata, j, TRUE);\n  }\n  (*nn)   += n;\n  (*nr)   += n;\n  (*nSum) += n;\n\n  /* Clean up */\n  FREE(rmapout);\n  FREE(rmapin);\n  FREE(cmapout);\n\n  return( n );\n}\n\nSTATIC int presolve_elimeq2(presolverec *psdata, int *nn, int *nr, int *nc, int *nSum)\n{\n  lprec     *lp = psdata->lp;\n  int       n, i, jx, jjx, k, item, *plucount, *negcount, colplu, colneg,\n            iCoeffChanged = 0, iRowsRemoved = 0, iVarsFixed = 0, nrows = lp->rows,\n            status = RUNNING, *colindex = NULL;\n  MYBOOL    freshupdate;\n  REAL      Coeff1, Coeff2, Value1, Value2, lobound, upbound, bound, test, product,\n            *colvalue = NULL, *delvalue = NULL, *colitem;\n  MATrec    *mat = lp->matA, *rev = NULL;\n  DeltaVrec *DV = NULL;\n  LLrec     *EQ2 = NULL;\n\n  /* See if there is anything to do */\n  if(psdata->EQmap->count == 0) {\n    (*nSum) = 0;\n    return( status );\n  }\n\n  /* Tally counts */\n  createLink(lp->rows, &EQ2, NULL);\n  if((EQ2 == NULL) || !allocREAL(lp, &colvalue, nrows+1, FALSE) ||\n                      !allocREAL(lp, &delvalue, nrows+1, FALSE))\n    goto Finish;\n  for(i = firstActiveLink(psdata->EQmap); i > 0; i = nextActiveLink(psdata->EQmap, i)) {\n    if(presolve_rowlength(psdata, i) == 2)\n      appendLink(EQ2, i);\n  }\n  if(EQ2->count == 0)\n    goto Finish;\n  n = 0;\n\n  /* Do the elimination loop for all identified 2-element equalities */\n  for(i = firstActiveLink(EQ2); i > 0; i = nextActiveLink(EQ2, i)) {\n\n    /* Check if the constraint has been modified by a previous elimination */\n    if(presolve_rowlength(psdata, i) != 2)\n      continue;\n\n    /* Get the column indeces of NZ-values of the \"pivot\" row */\n    item = 0;\n    jx  = presolve_nextcol(psdata, i, &item);   /* Eliminated variable coefficient    b */\n#ifdef Paranoia\n    if(jx < 0)\n      report(lp, SEVERE, \"presolve_elimeq2: No qualifying %dst column was found in row %s (ostensible length %d)\\n\",\n                         1, get_row_name(lp, i), presolve_rowlength(psdata, i));\n#endif\n    Coeff2 = ROW_MAT_VALUE(jx);\n    jx  = ROW_MAT_COLNR(jx);\n    jjx = presolve_nextcol(psdata, i, &item);  /* Non-eliminated variable coefficient a */\n#ifdef Paranoia\n    if(jjx < 0)\n      report(lp, SEVERE, \"presolve_elimeq2: No qualifying %dnd column was found in row %s (ostensible length %d)\\n\",\n                          2, get_row_name(lp, i), presolve_rowlength(psdata, i));\n#endif\n    Coeff1 = ROW_MAT_VALUE(jjx);\n    jjx = ROW_MAT_COLNR(jjx);\n\n    /* Check if at least one of the coefficients is large enough to preserve stability;\n       use opposing maximum column values for stability testing. */\n    if((fabs(Coeff1) < psdata->epspivot*mat->colmax[jx]) &&\n       ((fabs(Coeff1) != 1) && (fabs(Coeff2) != 1)) &&\n       (fabs(Coeff2) < psdata->epspivot*mat->colmax[jjx]))\n      continue;\n\n    /* Cannot eliminate a variable if both are SOS members or SC variables */\n    if((is_semicont(lp, jx) && is_semicont(lp, jjx)) ||\n        (SOS_is_member(lp->SOS, 0, jx) && SOS_is_member(lp->SOS, 0, jjx)))\n      continue;\n\n    /* First check if we are allowed to swap; set swap \"blockers\" */\n    k = 0;\n    if(!is_int(lp, jx) && is_int(lp, jjx))\n      k += 1;\n    else if(!is_semicont(lp, jx) && is_semicont(lp, jjx))\n      k += 2;\n    else if(!SOS_is_member(lp->SOS, 0, jx) && SOS_is_member(lp->SOS, 0, jjx))\n      k += 4;\n\n    /* If there were no blockers, determine if we MUST swap the variable to be eliminated */\n    if(k == 0) {\n      if(is_int(lp, jx) && !is_int(lp, jjx))\n        k += 8;\n      else if(is_semicont(lp, jx) && !is_semicont(lp, jjx))\n        k += 16;\n      else if(SOS_is_member(lp->SOS, 0, jx) && !SOS_is_member(lp->SOS, 0, jjx))\n        k += 32;\n\n      /* If we are not forced to swap, decide if it otherwise makes sense - high order */\n      if(k == 0) {\n        if((fabs(Coeff2) < psdata->epspivot*mat->colmax[jjx]) &&\n           (fabs(Coeff1) > psdata->epspivot*mat->colmax[jx]))\n          k += 64;\n        else if(presolve_collength(psdata, jx) > presolve_collength(psdata, jjx))\n          k += 128;\n      }\n\n      /* If we are not forced to swap, decide if it otherwise makes sense - low order */\n      if(k == 0) {\n        Value2 = Coeff1/Coeff2;\n#ifdef DualFeasibilityLogicEQ2\n        if((Value2*lp->orig_obj[jx] < 0) &&\n          (Value2*lp->orig_obj[jjx] > 0))                     /* Seek increased dual feasibility */\n          k += 256;\n#endif\n#ifdef DivisorIntegralityLogicEQ2\n        if((fabs(modf(Coeff2, &Value2)) >= lp->epsvalue) &&    /* Seek integrality of result */\n           (fabs(modf(Coeff1, &Value2)) < lp->epsvalue))\n          k += 512;\n        else if((fabs(fabs(Coeff2)-1) >= lp->epsvalue) &&    /* Seek integrality of divisor */\n                 (fabs(fabs(Coeff1)-1) < lp->epsvalue))\n          k += 1024;\n#endif\n      }\n\n    }\n    else\n      k = 0;\n\n    /* Perform variable index swap if indicated */\n    if(k != 0) {\n      swapINT(&jx, &jjx);\n      swapREAL(&Coeff1, &Coeff2);\n    }\n\n    Value1 = lp->orig_rhs[i]/Coeff2; /* Delta constant term */\n    Value2 = Coeff1/Coeff2;          /* Delta variable term */\n    upbound = lp->orig_upbo[lp->rows+jx];\n    lobound = lp->orig_lowbo[lp->rows+jx];\n    if(lp->spx_trace) {\n      report(lp, DETAILED, \"Row %3d : Elim %g %s - %d\\n\", i, Coeff2, get_col_name(lp, jx), jx);\n      report(lp, DETAILED, \"          Keep %g %s - %d\\n\",    Coeff1, get_col_name(lp, jjx), jjx);\n    }\n\n    /* Get the coefficient vectors of the independent (jjx) and dependent (jx) columns;\n      the dependent column will be deleted and reconstructed during postsolve. */\n    freshupdate = (MYBOOL) ((colindex == NULL) || (colindex[jjx] == 0));\n    if(freshupdate)\n      mat_expandcolumn(mat, jjx, colvalue, NULL, TRUE);\n    else\n      mat_expandcolumn(rev, colindex[jjx], colvalue, NULL, FALSE);\n    if((colindex == NULL) || (colindex[jx] == 0))\n      mat_expandcolumn(mat, jx, delvalue, NULL, TRUE);\n    else\n      mat_expandcolumn(rev, colindex[jx], delvalue, NULL, FALSE);\n\n    /* Add variable reconstruction information */\n    addUndoPresolve(lp, TRUE, jx, Value1, Value2, jjx);\n\n    /* If possible, tighten the bounds of the uneliminated variable based\n       on the bounds of the eliminated variable. Also handle roundings\n       and attempt precision management. */\n    bound = lobound;\n    k = nrows+jjx;\n    if(bound > -lp->infinite) {\n      bound = (lp->orig_rhs[i] - Coeff2*bound) / Coeff1;\n      if(Value2 > 0) {\n        test = lp->orig_upbo[k];\n        if(bound < test - psdata->epsvalue) {\n          if(is_int(lp, jjx))\n            lp->orig_upbo[k] = floor(bound + lp->epsint);\n          else\n            lp->orig_upbo[k] = presolve_roundrhs(lp, bound, FALSE);\n        }\n      }\n      else {\n        test = lp->orig_lowbo[k];\n        if(bound > test + psdata->epsvalue) {\n          if(is_int(lp, jjx))\n            lp->orig_lowbo[k] = ceil(bound - lp->epsint);\n          else\n            lp->orig_lowbo[k] = presolve_roundrhs(lp, bound, TRUE);\n        }\n      }\n    }\n    bound = upbound;\n    if(bound < lp->infinite) {\n      bound = (lp->orig_rhs[i] - Coeff2*bound) / Coeff1;\n      if(Value2 < 0) {\n        test = lp->orig_upbo[k];\n        if(bound < test - psdata->epsvalue) {\n          if(is_int(lp, jjx))\n            lp->orig_upbo[k] = floor(bound + lp->epsint);\n          else\n            lp->orig_upbo[k] = presolve_roundrhs(lp, bound, FALSE);\n        }\n      }\n      else {\n        test = lp->orig_lowbo[k];\n        if(bound > test + psdata->epsvalue) {\n          if(is_int(lp, jjx))\n            lp->orig_lowbo[k] = ceil(bound - lp->epsint);\n          else\n            lp->orig_lowbo[k] = presolve_roundrhs(lp, bound, TRUE);\n        }\n      }\n    }\n\n#ifdef Eq2Reldiff\n    test = 2*lp->epsvalue;\n#else\n    test = psdata->epsvalue;\n#endif\n    if(/*(lp->orig_upbo[k] < lp->orig_lowbo[k]) ||*/\n#ifdef Eq2Reldiff\n       (fabs(my_reldiff(lp->orig_upbo[k],lp->orig_lowbo[k])) < test)) {\n#else\n       (fabs(lp->orig_upbo[k] - lp->orig_lowbo[k]) < test)) {\n#endif\n      my_roundzero(lp->orig_lowbo[k], test);\n      lp->orig_upbo[k] = lp->orig_lowbo[k];\n    }\n    else {\n      my_roundzero(lp->orig_upbo[k], test);\n      my_roundzero(lp->orig_lowbo[k], test);\n    }\n\n    if(/*(upbound < lobound) ||*/\n#ifdef Eq2Reldiff\n       (fabs(my_reldiff(upbound, lobound)) < test)) {\n#else\n       (fabs(upbound - lobound) < test)) {\n#endif\n      my_roundzero(lobound, test);\n      lp->orig_upbo[nrows+jx] = lobound;\n      upbound = lobound;\n    }\n\n    /* Loop over the non-zero rows of the column (jx) to be eliminated;\n      substitute jx-variable by updating rhs and jjx coefficients */\n    colitem = colvalue;\n    plucount = psdata->rows->plucount;\n    negcount = psdata->rows->negcount;\n    colplu = 0;\n    colneg = 0;\n    /* Count of non-zeros in the independent column jjx */\n    item = presolve_collength(psdata, jjx) - 1;\n    if(isnz_origobj(lp, jjx))\n      item++;\n    for(k = 0; k <= nrows; k++, colitem++) {\n\n      bound = delvalue[k];\n      if((k == i) || (bound == 0) ||\n         ((k > 0) && !isActiveLink(psdata->rows->varmap, k)))\n        continue;\n\n      /* Do constraint and nz-count updates for the substituted variable */\n      product = bound*Value1;\n\n      /* \"Raw\"/unsigned data */\n      presolve_adjustrhs(psdata, k, my_chsign(is_chsign(lp, k), product), test);\n\n      /* Change back to signed part */\n      if(*colitem != 0) {\n        if(*colitem > 0) {\n          colplu--;\n          plucount[k]--;\n        }\n        else {\n          colneg--;\n          negcount[k]--;\n        }\n        if((lobound < 0) && (upbound >= 0)) {\n          psdata->cols->pluneg[jjx]--;\n          psdata->rows->pluneg[k]--;\n        }\n        item--;\n      }\n      (*colitem) -= bound*Value2;\n      iCoeffChanged++;\n\n      /* Update counts */\n      if(fabs(*colitem) >= mat->epsvalue) {\n        if(*colitem > 0) {\n          colplu++;\n          plucount[k]++;\n        }\n        else {\n          colneg++;\n          negcount[k]++;\n        }\n        if((lobound < 0) && (upbound >= 0)) {\n          psdata->cols->pluneg[jjx]++;\n          psdata->rows->pluneg[k]++;\n        }\n        item++;\n      }\n      else {\n        *colitem = 0;\n      }\n\n      /* Also reduce count if the row contains the deleted variable */\n      if(bound > 0)\n        plucount[k]--;\n      else\n        negcount[k]--;\n    }\n    psdata->cols->plucount[jjx] += colplu;\n    psdata->cols->negcount[jjx] += colneg;\n\n    /* Save the new column */\n    if(rev == NULL) {\n      DV = createUndoLadder(lp, nrows, lp->columns / RESIZEFACTOR);\n      rev = DV->tracker;\n      rev->epsvalue = mat->epsvalue;\n      allocINT(lp, &(rev->col_tag), mat->columns_alloc+1, FALSE);\n      allocINT(lp, &colindex, lp->columns+1, TRUE);\n      rev->col_tag[0] = 0;\n    }\n    n = rev->col_tag[0] = incrementUndoLadder(DV);\n    mat_setcol(rev, n, 0, colvalue, NULL, FALSE, FALSE);\n    rev->col_tag[n] = jjx;\n\n    /* Save index to updated vector, but specially handle case where we have\n      the same independent variable for multiple equations! */\n    if(!freshupdate)\n      rev->col_tag[colindex[jjx]] *= -1;\n    colindex[jjx] = n;\n\n    /* Delete the column dependent variable */\n    jx = presolve_colremove(psdata, jx, FALSE);\n    iVarsFixed++;\n\n    /* Check if we have been lucky enough to have eliminated the independent\n       variable via substitution of the dependent variable */\n    if(item == 0) {\n#ifdef Paranoia\n      report(lp, DETAILED, \"presolve_elimeq2: Was able to remove variables %d and %d in row %s\\n\",\n                         jx, jjx, get_row_name(lp, i));\n#endif\n      if(presolve_colfix(psdata, jjx, 0.0, TRUE, nc))\n        jjx = presolve_colremove(psdata, jjx, FALSE);\n    }\n\n    /* Delete the row */\n    presolve_rowremove(psdata, i, FALSE);\n    iRowsRemoved++;\n  }\n\n  /* Perform the column updates collected above */\n  if(n > 0) {\n    mat_mapreplace(mat, psdata->rows->varmap, psdata->cols->varmap, rev);\n    presolve_validate(psdata, TRUE);\n#ifdef PresolveForceUpdateMax\n    mat_computemax(mat /* , FALSE */);\n#endif\n    psdata->forceupdate = TRUE;\n  }\n\n  /* Free work arrays */\nFinish:\n  if(DV != NULL)\n    freeUndoLadder(&DV);\n  freeLink(&EQ2);\n  FREE(colvalue);\n  FREE(delvalue);\n  FREE(colindex);\n\n  /* Update counters */\n  (*nn)   += iCoeffChanged;\n  (*nr)   += iRowsRemoved;\n  (*nc)   += iVarsFixed;\n  (*nSum) += iCoeffChanged + iRowsRemoved + iVarsFixed;\n\n  return( status );\n}\n\nSTATIC MYBOOL presolve_impliedfree(lprec *lp, presolverec *psdata, int colnr)\n{\n  int    i, ix, ie;\n  REAL   Tlower, Tupper;\n  MYBOOL status, rowbinds, isfree = FALSE;\n  MATrec *mat = lp->matA;\n\n  if(my_infinite(lp, get_lowbo(lp, colnr)) && my_infinite(lp, get_upbo(lp, colnr)))\n    return( TRUE );\n\n  ie = mat->col_end[colnr];\n  for(ix = mat->col_end[colnr-1]; (isfree != (TRUE | AUTOMATIC)) && (ix < ie); ix++) {\n    i = COL_MAT_ROWNR(ix);\n    if(!isActiveLink(psdata->rows->varmap, i))\n      continue;\n    Tlower = get_rh_lower(lp, i);\n    Tupper = get_rh_upper(lp, i);\n    status = presolve_multibounds(psdata, i, colnr, &Tlower, &Tupper, NULL, &rowbinds);\n    isfree = isfree | status | rowbinds;\n  }\n\n  return( (MYBOOL) (isfree == (TRUE | AUTOMATIC)) );\n}\n\nSTATIC MYBOOL presolve_impliedcolfix(presolverec *psdata, int rownr, int colnr, MYBOOL isfree)\n{\n  lprec    *lp = psdata->lp;\n  MYBOOL   signflip, undoadded = FALSE;\n  MATrec   *mat = lp->matA;\n  int      jx, i, ib, ie = mat->row_end[rownr];\n  REAL     varLo = 0, varHi = 0, varRange, conRange = 0, matValue = 0, dual, RHS = lp->orig_rhs[rownr],\n           pivot, matAij = mat_getitem(mat, rownr, colnr), *vecOF = lp->orig_obj;\n\n  /* We cannot have semi-continuous or non-qualifying integers */\n  if(is_semicont(lp, colnr) || is_SOS_var(lp, colnr))\n    return( FALSE );\n  if(is_int(lp, colnr)) {\n    if(!isActiveLink(psdata->INTmap, rownr) || !is_presolve(lp, PRESOLVE_KNAPSACK))\n      return( FALSE );\n    /* colnr must have a coefficient equal to the smallest in the row */\n    varRange = lp->infinite;\n    i = 0;\n    pivot = 0;\n    for(ib = presolve_nextcol(psdata, rownr, &i); i != 0; ib = presolve_nextcol(psdata, rownr, &i)) {\n      jx = ROW_MAT_COLNR(ib);\n      dual = fabs(ROW_MAT_VALUE(ib));\n      /* Check if we have the target column and save the pivot value */\n      if(jx == colnr) {\n        /* Always accept unit coefficient */\n        if(fabs(dual - 1) < psdata->epsvalue)\n          break;\n        pivot = dual;\n        /* Otherwise continue scan */\n      }\n      /* Cannot accept case where result can be fractional */\n      else if((pivot > dual + psdata->epsvalue) ||\n               ((pivot > 0) && (fabs(fmod(dual, pivot)) > psdata->epsvalue)))\n        return( FALSE );\n    }\n  }\n\n  /* Ascertain that the pivot value is large enough to preserve stability */\n  pivot = matAij;\n  if(fabs(pivot) < psdata->epspivot*mat->colmax[colnr])\n    return( FALSE );\n\n  /* Must ascertain that the row variables are not SOS'es; this is because\n     the eliminated variable will be a function of another variable. */\n  if(SOS_count(lp) > 0) {\n    for(ib = mat->row_end[rownr-1]; ib < ie; ib++)\n      if(SOS_is_member(lp->SOS, 0, ROW_MAT_COLNR(ib)))\n        return( FALSE );\n  }\n\n  /* Calculate the dual value */\n  dual = vecOF[colnr]/pivot;\n\n  /* Here we have free variable in an equality constraint; this means we can\n     can adjust the OF for the deleted variable and also delete the constraint. */\n  if(isfree && is_constr_type(lp, rownr, EQ)) {\n    matValue = RHS/pivot;\n    if(matValue != 0)\n      undoadded = addUndoPresolve(lp, TRUE, colnr, matValue, 0.0, 0);\n  }\n\n  else {\n\n    /* IMPLIEDFREE: For simplicity, ensure that we can keep the slack based at 0,\n                   and not its upper bound. Effectively, we consider the constraint\n                   an equality, using the information of the sign of the dual.\n       IMPLIEDSLK: Since we already have an equality constraint, we wish to make sure\n                   that the ensuing inequality constraint will have an RHS that is\n                   non-infinite. */\n    if(isfree) {\n      SETMIN(RHS, presolve_sumplumin(lp, rownr, psdata->rows, TRUE));\n      matValue = presolve_sumplumin(lp, rownr, psdata->rows, FALSE);\n      conRange = get_rh_lower(lp, rownr);\n      conRange = RHS - MAX(matValue, conRange);\n      signflip = (MYBOOL) ((dual > 0) &&\n                           !my_infinite(lp, conRange));\n    }\n    else {\n      varLo = get_lowbo(lp, colnr);\n      varLo *= (my_infinite(lp, varLo) ? my_sign(pivot) : pivot);\n      varHi = get_upbo(lp, colnr);\n      varHi *= (my_infinite(lp, varHi) ? my_sign(pivot) : pivot);\n      if(pivot < 0)\n        swapREAL(&varHi, &varLo);\n      signflip = my_infinite(lp, varLo);\n    }\n    if(signflip) {\n      mat_multrow(mat, rownr, -1);\n      RHS -= conRange;\n      RHS = -RHS;\n      lp->orig_rhs[rownr] = RHS;\n      pivot = -pivot;\n      dual  = -dual;\n      if(!isfree) {\n        varLo = -varLo;\n        varHi = -varHi;\n        swapREAL(&varHi, &varLo);\n      }\n    }\n    matValue = RHS/pivot;\n\n    /* Prepare for deleting free or implied free variable in inequality constraint.\n       Different strategies need to be used:\n\n       ACTUAL:  Find the proper constraint bound and store undo information for\n                recovering the value of the implied free variable.  The constraint\n                is then deleted.  We have to adjust the objective function if the\n                OF coefficient for the implied free variable is non-zero.\n       IMPLIED: Convert the constraint to an inequality at the proper bound.\n                For given models, the new equality constraint can later provide\n                an implied slack, which means that a further variable is eliminated,\n                and the constraint again becomes an inequality constraint.\n\n      Note that this version only implements the ACTUAL mode */\n    if(isfree) {\n      /* Add undo information connecting the deleted variable to the RHS */\n      if(matValue != 0)\n        undoadded = addUndoPresolve(lp, TRUE, colnr, matValue, 0.0, 0);\n      /* Add undo information for the dual of the deleted constraint */\n      if(dual != 0)\n        addUndoPresolve(lp, FALSE, rownr, dual, 0.0, 0);\n    }\n\n    /* Prepare for deleting implied slack variable.  The following two cases are\n      handled:\n\n      1. Equality constraint: Convert the constraint to an inequality constraint\n                              that is possibly ranged\n      2. Other constraints:   Expand existing slack variable / constraint\n                              range, if required. */\n    else {\n      if(my_infinite(lp, varHi))\n        varRange = lp->infinite;\n#ifdef Paranoia\n      else if(my_infinite(lp, varLo)) {\n        report(lp, SEVERE, \"presolve_impliedcolfix: Negative infinite limit for variable %d\\n\", colnr);\n        varRange = lp->infinite;\n      }\n#endif\n      else\n        varRange = my_precision(fabs(varHi - varLo) + lp->epsvalue, psdata->epsvalue);\n      presolve_adjustrhs(psdata, rownr, varLo, psdata->epsvalue);\n\n      /* Handle case 1 of an equality constraint */\n      if(is_constr_type(lp, rownr, EQ)) {\n        /* Make sure we actually have a ranged constraint */\n        if(varRange > 0) {\n          set_constr_type(lp, rownr, LE);\n          if(!my_infinite(lp, varRange))\n            lp->orig_upbo[rownr] = varRange;\n          setLink(psdata->LTmap, rownr);\n          removeLink(psdata->EQmap, rownr);\n        }\n      }\n      /* Handle case 2 of an inequality constraint (UNDER CONSTRUCTION!)*/\n      else {\n        if(!my_infinite(lp, lp->orig_upbo[rownr])) {\n          if(my_infinite(lp, varRange))\n            lp->orig_upbo[rownr] = lp->infinite;\n          else\n            lp->orig_upbo[rownr] += varHi - varLo;\n        }\n      }\n      /* Update counts */\n      if(matAij > 0)\n        psdata->rows->plucount[rownr]--;\n      else\n        psdata->rows->negcount[rownr]--;\n      if(my_sign(varLo) != my_sign(varHi))\n        psdata->rows->pluneg[rownr]--;\n\n      /* Add undo information for the deleted variable; note that we cannot link the\n        deleted variable to the slack, since it may not be available during undo.\n        We really should have a mini LP to compute this allocation ex-post. */\n      if(RHS != 0)\n        undoadded = addUndoPresolve(lp, TRUE, colnr, RHS/pivot, 0.0, 0);\n    }\n  }\n\n  /* Update the OF constant */\n  if(dual != 0) {\n    presolve_adjustrhs(psdata, 0, dual * RHS, 0);\n/*    lp->orig_rhs[0] -= dual * RHS; */\n    vecOF[colnr] = 0;\n  }\n\n  /* Do affine transformation with the constraint row */\n  i = 0;\n  for(ib = presolve_nextcol(psdata, rownr, &i); ib >= 0;\n      ib = presolve_nextcol(psdata, rownr, &i)) {\n\n    /* Get the constraint element */\n    jx = ROW_MAT_COLNR(ib);\n    if(jx == colnr)\n      continue;\n    matValue = ROW_MAT_VALUE(ib);\n\n    /* Adjust OF for the variable to be deleted */\n    if(dual != 0)\n      vecOF[jx] -= dual * matValue;\n\n    /* Add reconstruction/undo parameters for the deleted variable */\n    if(!undoadded)\n      undoadded = addUndoPresolve(lp, TRUE, colnr, 0.0, matValue/pivot, jx);\n    else\n      appendUndoPresolve(lp, TRUE, matValue/pivot, jx);\n  }\n\n  return( TRUE );\n}\n\nSTATIC psrec *presolve_initpsrec(lprec *lp, int size)\n{\n  psrec *ps = (psrec *) calloc(1, sizeof(*ps));\n\n  createLink(size, &ps->varmap, NULL);\n    fillLink(ps->varmap);\n\n  size++;\n\n  allocINT(lp, &ps->empty, size, FALSE);\n  ps->empty[0] = 0;\n\n  allocREAL(lp, &ps->pluupper,  size, FALSE);\n  allocREAL(lp, &ps->negupper,  size, FALSE);\n  allocREAL(lp, &ps->plulower,  size, FALSE);\n  allocREAL(lp, &ps->neglower,  size, FALSE);\n  allocINT(lp,  &ps->infcount,  size, FALSE);\n\n  ps->next = (int **) calloc(size, sizeof(*(ps->next)));\n\n  allocINT(lp,  &ps->plucount,  size, TRUE);\n  allocINT(lp,  &ps->negcount,  size, TRUE);\n  allocINT(lp,  &ps->pluneg,    size, TRUE);\n\n  ps->allocsize = size;\n\n  return( ps );\n}\nSTATIC void presolve_freepsrec(psrec **ps)\n{\n  FREE((*ps)->plucount);\n  FREE((*ps)->negcount);\n  FREE((*ps)->pluneg);\n  FREE((*ps)->infcount);\n\n  if((*ps)->next != NULL) {\n    int i, n = (*ps)->allocsize;\n    for(i = 0; i < n; i++)\n      FREE((*ps)->next[i]);\n    FREE((*ps)->next);\n  }\n\n  FREE((*ps)->plulower);\n  FREE((*ps)->neglower);\n  FREE((*ps)->pluupper);\n  FREE((*ps)->negupper);\n\n  FREE((*ps)->empty);\n\n  freeLink(&(*ps)->varmap);\n\n  FREE(*ps);\n}\n\nSTATIC presolverec *presolve_init(lprec *lp)\n{\n  int         k, i, ix, ixx, colnr,\n              ncols = lp->columns,\n              nrows = lp->rows;\n  REAL        hold;\n  MATrec      *mat = lp->matA;\n  presolverec *psdata = NULL;\n\n  /* Optimize memory usage if we have a very large model;\n     this is to reduce the risk of out-of-memory situations. */\n  ix  = get_nonzeros(lp);\n  ixx = lp->matA->mat_alloc;\n  if((ixx - ix > MAT_START_SIZE) && ((ixx - ix) * 20 > ixx))\n    mat_memopt(lp->matA, nrows / 20, ncols / 20, ix / 20);\n\n  psdata = (presolverec *) calloc(1, sizeof(*psdata));\n\n  psdata->lp   = lp;\n  psdata->rows = presolve_initpsrec(lp, nrows);\n  psdata->cols = presolve_initpsrec(lp, ncols);\n\n  psdata->epsvalue = PRESOLVE_EPSVALUE;\n  psdata->epspivot = PRESOLVE_EPSPIVOT;\n  psdata->forceupdate = TRUE;\n\n  /* Save incoming primal bounds */\n  k = lp->sum + 1;\n  allocREAL(lp, &psdata->pv_lobo, k, FALSE);\n  MEMCOPY(psdata->pv_lobo, lp->orig_lowbo, k);\n  allocREAL(lp, &psdata->pv_upbo, k, FALSE);\n  MEMCOPY(psdata->pv_upbo, lp->orig_upbo, k);\n\n  /* Create and initialize dual value (Langrangean and slack) limits */\n  allocREAL(lp, &psdata->dv_lobo, k, FALSE);\n  allocREAL(lp, &psdata->dv_upbo, k, FALSE);\n  for(i = 0; i <= nrows; i++) {\n    psdata->dv_lobo[i] = (is_constr_type(lp, i, EQ) ? -lp->infinite : 0);\n    psdata->dv_upbo[i] = lp->infinite;\n  }\n  k--;\n  for(; i <= k; i++) {\n    psdata->dv_lobo[i] = 0;\n    psdata->dv_upbo[i] = lp->infinite;\n  }\n\n /* Create NZ count and sign arrays, and do general initialization of row bounds */\n  createLink(nrows, &psdata->EQmap, NULL);\n  createLink(nrows, &psdata->LTmap, NULL);\n  createLink(nrows, &psdata->INTmap, NULL);\n  for(i = 1; i <= nrows; i++) {\n    switch (get_constr_type(lp, i)) {\n      case LE: appendLink(psdata->LTmap, i);\n                break;\n      case EQ: appendLink(psdata->EQmap, i);\n                break;\n    }\n    k = mat_rowlength(mat, i);\n    if((lp->int_vars > 0) && (k > 0))\n      appendLink(psdata->INTmap, i);\n  }\n\n  /* Seek to reduce set of sum(INT*INT) rows (mainly for GCD coefficient reductions) */\n  if(psdata->INTmap->count > 0)\n  for(i = 1; i <= nrows; i++) {\n    if(!isActiveLink(psdata->INTmap, i))\n      continue;\n    /* Disqualify if there is a non-int variable, otherwise find smallest absolute fractional row value */\n    ix = mat->row_end[i - 1];\n    ixx = mat->row_end[i];\n    colnr = 0;\n    for(; ix < ixx; ix++) {\n      if(!is_int(lp, ROW_MAT_COLNR(ix))) {\n        removeLink(psdata->INTmap, i);\n        break;\n      }\n      hold = fabs(ROW_MAT_VALUE(ix));\n      hold = fmod(hold, 1);\n      /* Adjust colnr to be a decimal scalar */\n      for(k = 0; (k <= MAX_FRACSCALE) && (hold+psdata->epsvalue < 1); k++)\n        hold *= 10;\n      if(k > MAX_FRACSCALE) {\n        removeLink(psdata->INTmap, i);\n        break;\n      }\n      SETMAX(colnr, k);\n    }\n    if(!isActiveLink(psdata->INTmap, i))\n      continue;\n    hold = pow(10.0, colnr);\n    /* Also disqualify if the RHS is fractional after scaling */\n    if(fabs(fmod(lp->orig_rhs[i] * hold, 1)) > psdata->epsvalue) {\n      removeLink(psdata->INTmap, i);\n      continue;\n    }\n    /* We have an all-int constraint, see if we should scale it up */\n    if(k > 0) {\n      ix = mat->row_end[i - 1];\n      for(; ix < ixx; ix++) {\n        ROW_MAT_VALUE(ix) *= hold;\n      }\n      lp->orig_rhs[i] *= hold;\n      if(!my_infinite(lp, lp->orig_upbo[i]))\n        lp->orig_upbo[i] *= hold; /* KE: Fix due to Andy Loto - 20070619 */\n    }\n  }\n\n  /* Do the real tallying and ordering work */\n  presolve_validate(psdata, TRUE);\n\n  return( psdata );\n}\n\nSTATIC void presolve_free(presolverec **psdata)\n{\n  presolve_freepsrec(&(*psdata)->rows);\n  presolve_freepsrec(&(*psdata)->cols);\n  FREE((*psdata)->dv_lobo);\n  FREE((*psdata)->dv_upbo);\n  FREE((*psdata)->pv_lobo);\n  FREE((*psdata)->pv_upbo);\n  freeLink(&(*psdata)->EQmap);\n  freeLink(&(*psdata)->LTmap);\n  freeLink(&(*psdata)->INTmap);\n  FREE(*psdata);\n}\n\nSTATIC int presolve_makefree(presolverec *psdata)\n{\n  lprec    *lp = psdata->lp;\n  int      i, ix, j, nn = 0;\n  REAL     Xlower, Xupper, losum, upsum, lorhs, uprhs, freeinf = lp->infinite / 10;\n  MATrec   *mat = lp->matA;\n  LLrec    *colLL = NULL;\n\n  /* First see if we can relax ranged constraints */\n  for(i = firstActiveLink(psdata->rows->varmap); i != 0; i = nextActiveLink(psdata->rows->varmap, i)) {\n    if(is_constr_type(lp, i, EQ))\n      continue;\n    presolve_range(lp, i, psdata->rows, &losum, &upsum);\n    lorhs = get_rh_lower(lp, i);\n    uprhs = get_rh_upper(lp, i);\n\n    /* Look for opportunity to relax constraint bounds */\n    if(presolve_rowlength(psdata, i) > 1) {\n      if((is_constr_type(lp, i, GE) && (upsum <= uprhs)) ||\n         (is_constr_type(lp, i, LE) && (losum >= lorhs)))\n        set_rh_range(lp, i, lp->infinite);\n    }\n  }\n\n  /* Collect columns available for bound relaxation (find implied free variables)\n     (consider sorting the list in decending order of column lengths or do call to\n      COLAMD to maximize impact) */\n  createLink(lp->columns, &colLL, NULL);\n  for(j = firstActiveLink(psdata->cols->varmap); j != 0; j = nextActiveLink(psdata->cols->varmap, j))\n    if(presolve_impliedfree(lp, psdata, j))\n      appendLink(colLL, j);\n\n  /* Find what columns to relax (ideally one per row) */\n  if(colLL->count > 0) {\n    LLrec  *rowLL = NULL;\n    MYBOOL canfree;\n\n    /* Create row tracker */\n    createLink(lp->rows, &rowLL, NULL);\n    fillLink(rowLL);\n\n    /* Loop over all column candidates */\n    for(j = firstActiveLink(colLL); (j > 0) && (rowLL->count > 0); j = nextActiveLink(colLL, j)) {\n\n      /* Verify that the variable is applicable */\n      canfree = TRUE;\n      for(ix = mat->col_end[j-1]; canfree && (ix < mat->col_end[j]); ix++)\n        canfree = isActiveLink(rowLL, COL_MAT_ROWNR(ix));\n\n      /* If so, then open the bounds and update the row availability mapper */\n      if(canfree) {\n        nn++;\n        Xlower = get_lowbo(lp, j);\n        Xupper = get_upbo(lp, j);\n        if(Xlower >= 0)\n          set_bounds(lp, j, 0, freeinf);\n        else if(Xupper <= 0)\n          set_bounds(lp, j, -freeinf, 0);\n        else\n/*          set_bounds(lo, j, -freeinf, freeinf); */\n          set_unbounded(lp, j);\n        for(ix = mat->col_end[j-1]; ix < mat->col_end[j]; ix++)\n          removeLink(rowLL, COL_MAT_ROWNR(ix));\n      }\n    }\n    freeLink(&rowLL);\n  }\n\n  /* Free list and return */\n  freeLink(&colLL);\n  return( nn );\n}\n\nSTATIC MYBOOL presolve_updatesums(presolverec *psdata)\n{\n  lprec    *lp = psdata->lp;\n  int      j;\n\n  /* Initialize row accumulation arrays */\n  MEMCLEAR(psdata->rows->pluupper, lp->rows + 1);\n  MEMCLEAR(psdata->rows->negupper, lp->rows + 1);\n  MEMCLEAR(psdata->rows->plulower, lp->rows + 1);\n  MEMCLEAR(psdata->rows->neglower, lp->rows + 1);\n  MEMCLEAR(psdata->rows->infcount, lp->rows + 1);\n\n  /* Loop over active columns */\n  for(j = firstActiveLink(psdata->cols->varmap); j != 0;\n      j = nextActiveLink(psdata->cols->varmap, j)) {\n    presolve_colfix(psdata, j, lp->infinite, FALSE, NULL);\n  }\n\n#ifdef UseDualPresolve\n  /* Initialize column accumulation arrays */\n  MEMCLEAR(psdata->cols->pluupper, lp->columns + 1);\n  MEMCLEAR(psdata->cols->negupper, lp->columns + 1);\n  MEMCLEAR(psdata->cols->plulower, lp->columns + 1);\n  MEMCLEAR(psdata->cols->neglower, lp->columns + 1);\n  MEMCLEAR(psdata->cols->infcount, lp->columns + 1);\n\n  /* Loop over active rows */\n  for(j = firstActiveLink(psdata->rows->varmap); j != 0;\n      j = nextActiveLink(psdata->rows->varmap, j)) {\n    presolve_rowfix(psdata, j, lp->infinite, FALSE, NULL);\n  }\n#endif\n\n  return( TRUE );\n}\n\nSTATIC MYBOOL presolve_finalize(presolverec *psdata)\n{\n  lprec    *lp = psdata->lp;\n  MYBOOL   compactvars = FALSE;\n  int      ke, n;\n\n  /* Save eliminated rows and columns for restoration purposes */\n#ifdef SavePresolveEliminated\n  psdata->deletedA = mat_extractmat(lp->matA, rowmap, colmap, TRUE);\n  if(!mat_validate(psdata->deletedA))\n    report(lp, SEVERE, \"presolve_finalize: Could not validate matrix with undo data\\n\");\n#endif\n\n  /* Check if OF columns are to be deleted */\n  lp->presolve_undo->OFcolsdeleted = FALSE;\n  for(n = firstInactiveLink(psdata->cols->varmap); (n != 0) && !lp->presolve_undo->OFcolsdeleted;\n      n = nextInactiveLink(psdata->cols->varmap, n))\n    lp->presolve_undo->OFcolsdeleted = (MYBOOL) (lp->orig_obj[n] != 0);\n\n  /* Delete eliminated columns */\n  ke = lastInactiveLink(psdata->cols->varmap);\n  n = countInactiveLink(psdata->cols->varmap);\n  if((n > 0) && (ke > 0)) {\n    del_columnex(lp, psdata->cols->varmap);\n    mat_colcompact(lp->matA, lp->presolve_undo->orig_rows,\n                             lp->presolve_undo->orig_columns);\n    compactvars = TRUE;\n  }\n\n  /* Delete eliminated rows */\n  ke = lastInactiveLink(psdata->rows->varmap);\n  n = countInactiveLink(psdata->rows->varmap);\n  if((n > 0) && (ke > 0)) {\n    del_constraintex(lp, psdata->rows->varmap);\n    mat_rowcompact(lp->matA, TRUE);\n    compactvars = TRUE;\n  }\n  else if(psdata->nzdeleted > 0)\n    mat_zerocompact(lp->matA);\n\n  /* Do compacting and updating of variable maps */\n  if(compactvars)\n    varmap_compact(lp, lp->presolve_undo->orig_rows,\n                       lp->presolve_undo->orig_columns);\n\n  /* Reduce memory usage of postsolve matrices */\n  if(lp->presolve_undo->primalundo != NULL)\n    mat_memopt(lp->presolve_undo->primalundo->tracker, 0, 0, 0);\n  if(lp->presolve_undo->dualundo != NULL)\n    mat_memopt(lp->presolve_undo->dualundo->tracker, 0, 0, 0);\n\n  /* Round near-zero objective function coefficients and RHS values */\n  ke = lp->columns;\n  for(n = 1; n <= ke; n++)\n    my_roundzero(lp->orig_obj[n], lp->epsvalue);\n  ke = lp->rows;\n  for(n = 1; n <= ke; n++)\n    my_roundzero(lp->orig_rhs[n], lp->epsvalue);\n\n  /* Update the SOS sparse mapping */\n  if(SOS_count(lp) > 0)\n    SOS_member_updatemap(lp->SOS);\n\n  /* Validate matrix and reconstruct row indexation */\n  return(mat_validate(lp->matA));\n}\n\nSTATIC MYBOOL presolve_debugdump(lprec *lp, presolverec *psdata, char *filename, MYBOOL doappend)\n{\n  FILE   *output = stdout;\n  int   size;\n  MYBOOL ok;\n\n  ok = (MYBOOL) ((filename == NULL) || ((output = fopen(filename, my_if(doappend, \"a\", \"w\"))) != NULL));\n  if(!ok)\n    return(ok);\n  if((filename == NULL) && (lp->outstream != NULL))\n    output = lp->outstream;\n\n  fprintf(output, \"\\nPRESOLVE - Status at loop %d:%d:%d\\n\",\n                  psdata->outerloops, psdata->middleloops, psdata->innerloops);\n  fprintf(output, \"Model size:     %d rows (%d equalities, %d less than), %d columns\\n\",\n                  psdata->rows->varmap->count, psdata->EQmap->count, psdata->LTmap->count, psdata->cols->varmap->count);\n\n  fprintf(output, \"\\nMAPPERS\\n-------\\n\\n\");\n  size = 1;\n  blockWriteINT(output,  \"colmap\", psdata->cols->varmap->map, 0, size*psdata->cols->varmap->size);\n  blockWriteINT(output,  \"rowmap\", psdata->rows->varmap->map, 0, size*psdata->rows->varmap->size);\n  blockWriteINT(output,  \"EQmap\",  psdata->EQmap->map,  0, size*psdata->EQmap->size);\n  blockWriteINT(output,  \"LTmap\",  psdata->LTmap->map,  0, size*psdata->LTmap->size);\n\n  fprintf(output, \"\\nCOUNTS\\n------\\n\\n\");\n  blockWriteINT(output, \"plucount\",  psdata->rows->plucount,  0, lp->rows);\n  blockWriteINT(output, \"negcount\",  psdata->rows->negcount,  0, lp->rows);\n  blockWriteINT(output, \"pluneg\",    psdata->rows->pluneg,    0, lp->rows);\n\n  fprintf(output, \"\\nSUMS\\n----\\n\\n\");\n  blockWriteREAL(output, \"pluupper\", psdata->rows->pluupper, 0, lp->rows);\n  blockWriteREAL(output, \"negupper\", psdata->rows->negupper, 0, lp->rows);\n  blockWriteREAL(output, \"plulower\", psdata->rows->pluupper, 0, lp->rows);\n  blockWriteREAL(output, \"neglower\", psdata->rows->negupper, 0, lp->rows);\n\n  if(filename != NULL)\n    fclose(output);\n  return(ok);\n}\n\nint CMP_CALLMODEL compRedundant(const UNIONTYPE QSORTrec *current, const UNIONTYPE QSORTrec *candidate)\n{\n  int start1 = (int) (current->int4.intpar1),\n      start2 = (int) (candidate->int4.intpar1),\n      result = CMP_COMPARE(start1, start2);\n\n  if(result == 0) {\n    start1 = (int) (current->int4.intpar2);\n    start2 = (int) (candidate->int4.intpar2);\n    result = -CMP_COMPARE(start1, start2);\n  }\n  return( result );\n}\nint CMP_CALLMODEL compSparsity(const UNIONTYPE QSORTrec *current, const UNIONTYPE QSORTrec *candidate)\n{\n  int start1 = (int) (current->int4.intpar1),\n      start2 = (int) (candidate->int4.intpar1),\n      result = CMP_COMPARE(start1, start2);\n\n  if(result == 0) {\n    start1 = (int) (current->int4.intpar2);\n    start2 = (int) (candidate->int4.intpar2);\n    result = -CMP_COMPARE(start1, start2);\n  }\n\n  if(result == 0) {\n    start1 = (int) (current->int4.intval);\n    start2 = (int) (candidate->int4.intval);\n    result = CMP_COMPARE(start1, start2);\n  }\n  return( result );\n}\nint CMP_CALLMODEL compAggregate(const UNIONTYPE QSORTrec *current, const UNIONTYPE QSORTrec *candidate)\n{\n  int  index1 = (int) (current->pvoidint2.intval),\n       index2 = (int) (candidate->pvoidint2.intval);\n  lprec *lp   = (lprec *) current->pvoidint2.ptr;\n  REAL value1 = lp->orig_obj[index1],\n       value2 = lp->orig_obj[index2];\n\n  /* Smallest objective coefficient (largest contribution to OF) */\n  int  result = CMP_COMPARE(value1, value2);\n\n  /* Smallest lower variable bound */\n  if(result == 0) {\n    index1 += lp->rows;\n    index2 += lp->rows;\n    value1 = lp->orig_lowbo[index1];\n    value2 = lp->orig_lowbo[index2];\n    result = CMP_COMPARE(value1, value2);\n  }\n\n  /* Largest upper variable bound */\n  if(result == 0) {\n    value1 = lp->orig_upbo[index1];\n    value2 = lp->orig_upbo[index2];\n    result = -CMP_COMPARE(value1, value2);\n  }\n  return( result );\n}\n\nSTATIC int presolve_rowdominance(presolverec *psdata, int *nCoeffChanged, int *nRowsRemoved, int *nVarsFixed, int *nSum)\n{\n  lprec    *lp = psdata->lp;\n  MATrec   *mat = lp->matA;\n  int      i, ii, ib, ie, n, jb, je, jx, *coldel = NULL, status = RUNNING, item,\n           iCoeffChanged = 0, iRowRemoved = 0, iVarFixed = 0;\n  REAL     ratio, *rowvalues = NULL;\n  UNIONTYPE QSORTrec *QS = (UNIONTYPE QSORTrec *) calloc(lp->rows+1, sizeof(*QS));\n\n  /* Check if we were able to obtain working memory */\n  if(QS == NULL)\n    return( status);\n\n  /* A dominating row of variables always satisfy the following criteria:\n      1) The starting column position is never lower, but could be the same\n      2) The non-zero row count is always lower */\n  n = 0;\n  for(i = firstActiveLink(psdata->EQmap); i != 0; i = nextActiveLink(psdata->EQmap, i)) {\n    /* Make sure we have no SOS or semi-continuous variables */\n    jb = je = 0;\n    if((SOS_count(lp) > 0) || (lp->sc_vars > 0)) {\n      item = 0;\n      for(jb = presolve_nextcol(psdata, i, &item); jb >= 0;\n          jb = presolve_nextcol(psdata, i, &item)) {\n        jx = ROW_MAT_COLNR(jb);\n        if(SOS_is_member(lp->SOS, 0, jx) || is_semicont(lp, jx))\n          break;\n      }\n    }\n\n    /* Add to list if we are Ok */\n    if(jb < 0) {\n      QS[n].int4.intval = i;\n      item = 0;\n      ii = presolve_nextcol(psdata, i, &item);\n      QS[n].int4.intpar1 = ROW_MAT_COLNR(ii);\n      QS[n].int4.intpar2 = presolve_rowlength(psdata, i);\n      n++;\n    }\n  }\n  if(n <= 1)\n    goto Finish;\n  QS_execute(QS, n, (findCompare_func *) compRedundant, NULL);\n\n  /* Let us start from the top of the list, going forward and looking\n    for the longest possible dominating row */\n  if(!allocREAL(lp, &rowvalues, lp->columns + 1, TRUE) ||\n     !allocINT(lp, &coldel, lp->columns + 1, FALSE))\n    goto Finish;\n\n  for(ib = 0; ib < n; ib++) {\n\n    /* Get row and check if it was previously eliminated */\n    i = QS[ib].int4.intval;\n    if(i < 0)\n      continue;\n\n    /* Load the non-zero row values */\n    item = 0;\n    for(jb = presolve_nextcol(psdata, i, &item); jb >= 0;\n        jb = presolve_nextcol(psdata, i, &item)) {\n      jx = ROW_MAT_COLNR(jb);\n      rowvalues[jx] = ROW_MAT_VALUE(jb);\n    }\n\n    for(ie = ib+1; ie < n; ie++) {\n\n      /* Get row and check if it was previously eliminated */\n      ii = QS[ie].int4.intval;\n      if(ii < 0)\n        continue;\n\n#ifdef Paranoia\n      if((QS[ib].int4.intpar1 > QS[ie].int4.intpar1) ||\n         ((QS[ib].int4.intpar1 == QS[ie].int4.intpar1) && (QS[ib].int4.intpar2 < QS[ie].int4.intpar2)))\n        report(lp, SEVERE, \"presolve_rowdominance: Invalid sorted row order\\n\");\n#endif\n\n      /* Loop over every row member to confirm that the candidate\n        actually dominates in every position */\n      if((lp->orig_rhs[i] == 0) && (lp->orig_rhs[ii] == 0))\n        ratio = 0;\n      else if((lp->orig_rhs[i] != 0) && (lp->orig_rhs[ii] != 0))\n        ratio = lp->orig_rhs[i] / lp->orig_rhs[ii];\n      else\n        continue;\n      item = 0;\n      for(jb = presolve_nextcol(psdata, ii, &item); jb >= 0;\n          jb = presolve_nextcol(psdata, ii, &item)) {\n        jx = ROW_MAT_COLNR(jb);\n        if(rowvalues[jx] == 0)\n          break;\n        if(ratio == 0)\n          ratio = rowvalues[jx] / ROW_MAT_VALUE(jb);\n        else if(fabs(rowvalues[jx] - ratio*ROW_MAT_VALUE(jb)) > psdata->epsvalue)\n          break;\n      }\n\n      /* \"We have contact\" */\n      if(jb < 0) {\n        int sign_1 = 0, sign_j = 0;\n\n        /* Need to fix any superset columns, but require that they have equal signs */\n        coldel[0] = 0;\n        item = 0;\n        for(jb = presolve_nextcol(psdata, i, &item); jb >= 0;\n            jb = presolve_nextcol(psdata, i, &item)) {\n          jx = ROW_MAT_COLNR(jb);\n          if(mat_findelm(mat, ii, jx) <= 0) {\n\n            /* Cancel if we detect a free or \"quasi-free\" variable */\n            if((lp->orig_lowbo[lp->rows + jx] < 0) &&\n               (lp->orig_upbo[lp->rows + jx] > 0)) {\n              coldel[0] = -1;\n              break;\n            }\n\n            /* Ensure that we are feasible */\n            else if((lp->orig_lowbo[lp->rows + jx] > 0) ||\n               (lp->orig_upbo[lp->rows + jx] < 0)) {\n              report(lp, DETAILED, \"presolve_rowdominate: Column %s is infeasible due to conflict in rows %s and %s\\n\",\n                                    get_col_name(lp, jx), get_row_name(lp, i), get_row_name(lp, ii));\n              coldel[0] = -1;\n              break;\n            }\n\n            /* Check consistency / uniformity of signs */\n            sign_j = my_sign(ROW_MAT_VALUE(jb));\n            sign_j = my_chsign(is_negative(lp, jx), sign_j);\n            if(coldel[0] == 0) {\n              sign_1 = sign_j;\n              coldel[++coldel[0]] = jx;\n            }\n            else if(sign_j == sign_1) {\n              coldel[++coldel[0]] = jx;\n            }\n            else {\n              coldel[0] = -1;\n              break;\n            }\n          }\n        }\n\n        /* Force break / continuation if the superset columns were incompatible */\n        if(coldel[0] < 0)\n          continue;\n\n        /* Do the column fixing and deletion (check for infeasibility in the process) */\n        for(jb = 1; jb <= coldel[0]; jb++) {\n          jx = coldel[jb];\n          if(!presolve_colfix(psdata, jx, 0, TRUE, &iVarFixed)) {\n             status = presolve_setstatus(psdata, INFEASIBLE);\n             goto Finish;\n          }\n          presolve_colremove(psdata, jx, TRUE);\n          rowvalues[jx] = 0;\n        }\n\n        /* Then delete the row */\n        presolve_rowremove(psdata, ii, TRUE);\n        iRowRemoved++;\n        QS[ie].int4.intval = -ii;\n      }\n    }\n\n    /* Clear the non-zero row values ahead of the next row candidate */\n    ie = mat->row_end[i-1];\n    ii = mat->row_end[i];\n    for(; ie < ii; ie++)\n      rowvalues[ROW_MAT_COLNR(ie)] = 0;\n\n  }\nFinish:\n  FREE(QS);\n  FREE(rowvalues);\n  FREE(coldel);\n\n  (*nCoeffChanged) += iCoeffChanged;\n  (*nRowsRemoved)  += iRowRemoved;\n  (*nVarsFixed)    += iVarFixed;\n  (*nSum)          += iCoeffChanged + iRowRemoved + iVarFixed;\n\n  return( status );\n}\n\n#if 0\nSTATIC int presolve_coldominance01(presolverec *psdata, int *nConRemoved, int *nVarsFixed, int *nSum)\n/* The current version of this routine eliminates binary variables\n   that are dominated via set coverage or unit knapsack constraints */\n{\n  lprec    *lp = psdata->lp;\n  MATrec   *mat = lp->matA;\n  MYBOOL   first;\n  int      i, ii, ib, ie, n, jb, je, jx, jj, item, item2,\n           *coldel = NULL, status = RUNNING, iVarFixed = 0;\n  REAL     scale, rhsval, *colvalues = NULL;\n  UNIONTYPE QSORTrec *QS = (UNIONTYPE QSORTrec *) calloc(lp->columns+1, sizeof(*QS));\n\n  /* Check if we were able to obtain working memory */\n  if(QS == NULL)\n    return( status);\n  if(lp->int_vars == 0)\n    goto Finish;\n\n  /* A column dominates another binary variable column with the following criteria:\n      1) The relative matrix non-zero entries are identical\n      2) The relative objective coefficient is worse than the other;\n         if the OF coefficients are identical, we can delete an arbitrary variable */\n  n = 0;\n  for(i = firstActiveLink(psdata->cols->varmap); i != 0; i = nextActiveLink(psdata->cols->varmap, i))\n    if(is_binary(lp, i) && !SOS_is_member(lp->SOS, 0, i)) {\n      /* Make sure we have an all-binary, unit-coefficient row */\n      je = mat->col_end[i];\n      item = 0;\n      for(jb = presolve_nextrow(psdata, i, &item); jb >= 0;\n          jb = presolve_nextrow(psdata, i, &item)) {\n        jx = COL_MAT_ROWNR(jb);\n        if(COL_MAT_VALUE(jb) != 1)\n          break;\n      }\n\n      /* Add to list if we are Ok */\n      if(jb < 0) {\n        QS[n].int4.intval = i;\n        item = 0;\n        ii = presolve_nextrow(psdata, i, &item);\n        QS[n].int4.intpar1 = COL_MAT_ROWNR(ii);\n        ii = presolve_collength(psdata, i);\n        QS[n].int4.intpar2 = ii;\n        n++;\n      }\n    }\n  if(n <= 1) {\n    FREE(QS);\n    return( status );\n  }\n  QS_execute(QS, n, (findCompare_func *) compRedundant, NULL);\n\n  /* Let us start from the top of the list, going forward and looking\n    for the longest possible dominated column */\n  if(!allocREAL(lp, &colvalues, lp->rows + 1, TRUE) ||\n     !allocINT(lp, &coldel, lp->columns + 1, FALSE))\n    goto Finish;\n\n  for(ib = 0; ib < n; ib++) {\n\n    /* Get column and check if it was previously eliminated */\n    i = QS[ib].int4.intval;\n    if(i < 0)\n      continue;\n\n    /* Load the non-zero column values */\n    item = 0;\n    for(jb = presolve_nextrow(psdata, i, &item); jb >= 0;\n        jb = presolve_nextrow(psdata, i, &item)) {\n      jx = COL_MAT_ROWNR(jb);\n      colvalues[jx] = COL_MAT_VALUE(jb);\n    }\n\n    coldel[0] = 0;\n    for(ie = ib+1; ie < n; ie++) {\n\n      /* Insist on identical column lengths (sort is decending in column lengths) */\n      ii = QS[ib].int4.intpar2 - QS[ie].int4.intpar2;\n      if(ii != 0)\n        break;\n\n      /* Also insist on identical starting positions */\n      ii = QS[ib].int4.intpar1 - QS[ie].int4.intpar1;\n      if(ii != 0)\n        break;\n\n      /* Get column and check if it was previously eliminated */\n      ii = QS[ie].int4.intval;\n      if(ii < 0)\n        continue;\n\n      /* Also make sure that the variables have \"compatible\" bounds */\n#if 1\n      if((fabs(my_reldiff(lp->orig_lowbo[lp->rows + i], lp->orig_lowbo[lp->rows + ii])) > psdata->epsvalue) ||\n         (fabs(my_reldiff(lp->orig_upbo[lp->rows + i],  lp->orig_upbo[lp->rows + ii] )) > psdata->epsvalue))\n        continue;\n#endif\n\n#ifdef Paranoia\n      if((QS[ib].int4.intpar1 > QS[ie].int4.intpar1) ||\n         ((QS[ib].int4.intpar1 == QS[ie].int4.intpar1) && (QS[ib].int4.intpar2 < QS[ie].int4.intpar2)))\n        report(lp, SEVERE, \"presolve_coldominance01: Invalid sorted column order\\n\");\n#endif\n\n      /* Loop over every column member to confirm that the candidate is\n        relatively identical in every position */\n      first = TRUE;\n      item = 0;\n      item2 = 0;\n      scale = 1;\n      for(jb = presolve_nextrow(psdata, ii, &item),\n          jj = presolve_nextrow(psdata, i, &item2); jb >= 0;\n          jb = presolve_nextrow(psdata, ii, &item),\n          jj = presolve_nextrow(psdata, i, &item2)) {\n        jx = COL_MAT_ROWNR(jb);\n        if(jx != COL_MAT_ROWNR(jj))\n          break;\n        if(first) {\n          first = !first;\n          scale = colvalues[jx] / COL_MAT_VALUE(jb);\n        }\n        else {\n          if(fabs(colvalues[jx] - scale * COL_MAT_VALUE(jb)) > psdata->epsvalue)\n            break;\n        }\n        /* Also make sure we have a compatible RHS (since this version of the\n          dominance logic only applies to \"sets\") */\n        rhsval = scale*lp->orig_rhs[jx] - 1.0;\n        /* if((rhsval < 0) || (rhsval > 1 + psdata->epsvalue)) */\n        if(fabs(rhsval) > psdata->epsvalue)\n          break;\n      }\n\n      /* \"We have contact\" */\n      if(jb < 0) {\n        coldel[++coldel[0]] = ii;\n        QS[ie].int4.intval = -ii;\n      }\n    }\n\n    /* Find the dominant column and delete / fix the others;\n       if there is a tie, simply delete the second candidate */\n    ii = i;\n    for(jb = 1; jb <= coldel[0]; jb++) {\n      jx = coldel[jb];\n      if(lp->orig_obj[jx] < lp->orig_obj[ii])\n        swapINT(&ii, &coldel[jb]);\n    }\n    for(jb = 1; jb <= coldel[0]; jb++) {\n      jx = coldel[jb];\n      if(!presolve_colfix(psdata, jx, lp->orig_lowbo[lp->rows+jx], TRUE, &iVarFixed)) {\n         status = presolve_setstatus(psdata, INFEASIBLE);\n         goto Finish;\n      }\n      presolve_colremove(psdata, jx, TRUE);\n    }\n\n    /* Clear the non-zero row values ahead of the next row candidate */\n    if(ib + 1 < n) {\n      ie = mat->col_end[i-1];\n      ii = mat->col_end[i];\n      for(; ie < ii; ie++)\n        colvalues[COL_MAT_ROWNR(ie)] = 0;\n    }\n  }\nFinish:\n  FREE(QS);\n  FREE(colvalues);\n  FREE(coldel);\n\n  (*nVarsFixed) += iVarFixed;\n  (*nSum)       += iVarFixed;\n\n  return( status );\n}\n#else\n\n/* DEVELOPMENT/TEST CODE FOR POSSIBLE REPLACEMENT OF SIMILAR FUNCTION IN lp_presolve.c */\n\n#define NATURAL int\n\nSTATIC int presolve_coldominance01(presolverec *psdata, NATURAL *nConRemoved, NATURAL *nVarsFixed, NATURAL *nSum)\n/* The current version of this routine eliminates binary variables\n   that are dominated via set coverage or unit knapsack constraints */\n{\n  lprec    *lp = psdata->lp;\n  MATrec   *mat = lp->matA;\n  NATURAL  i, ib, ie, jx, item, item2,\n           n = lp->int_vars, iVarFixed = 0, nrows = lp->rows,\n           *coldel = NULL;\n  int      jb, jj, ii,\n           status = RUNNING;\n  REAL     rhsval = 0.0,\n           *colvalues = NULL, *colobj = NULL;\n  LLrec    *sets = NULL;\n  UNIONTYPE QSORTrec *QS = (UNIONTYPE QSORTrec *) calloc(n+1, sizeof(*QS));\n\n  /* Check if we were able to obtain working memory */\n  if(QS == NULL)\n    return( status);\n  if(n == 0)\n    goto Finish;\n\n  /* Create list of set coverage and knapsack constraints */\n  createLink(nrows, &sets, NULL);\n  for(i = firstActiveLink(psdata->rows->varmap); i != 0; i = nextActiveLink(psdata->rows->varmap, i)) {\n    if((lp->orig_rhs[i] < 0) || (psdata->rows->negcount[i] > 0))\n      continue;\n    item = 0;\n    for(jb = presolve_nextcol(psdata, i, &item); jb >= 0;\n        jb = presolve_nextcol(psdata, i, &item)) {\n      jx = ROW_MAT_COLNR(jb);\n      if(!is_binary(lp, jx))\n        break;\n      rhsval = ROW_MAT_VALUE(jb) - 1;\n      if(fabs(rhsval) > lp->epsvalue)\n        break;\n    }\n    if(jb < 0)\n      setLink(sets, i);\n  }\n  if(countActiveLink(sets) == 0)\n    goto Finish;\n\n  /* A column dominates another binary variable column with the following criteria:\n      1) The relative matrix non-zero entries are identical\n      2) The relative objective coefficient is worse than the other;\n         if the OF coefficients are identical, we can delete an arbitrary variable */\n  n = 0;\n  for(i = firstActiveLink(psdata->cols->varmap); i != 0; i = nextActiveLink(psdata->cols->varmap, i))\n    if(is_binary(lp, i) && !SOS_is_member(lp->SOS, 0, i)) {\n      /* Make sure the column is member of at least one set */\n      item = 0;\n      for(jb = presolve_nextrow(psdata, i, &item); jb >= 0;\n          jb = presolve_nextrow(psdata, i, &item)) {\n        jx = COL_MAT_ROWNR(jb);\n        if(isActiveLink(sets, jx))\n          break;\n      }\n\n      /* Add to list if set membership test is Ok */\n      if(jb >= 0) {\n        QS[n].int4.intval = i;\n        item = 0;\n        ii = presolve_nextrow(psdata, i, &item);\n        QS[n].int4.intpar1 = COL_MAT_ROWNR(ii);\n        ii = presolve_collength(psdata, i);\n        QS[n].int4.intpar2 = ii;\n        n++;\n      }\n    }\n  if(n <= 1) {\n    FREE(QS);\n    return( status );\n  }\n  QS_execute(QS, n, (findCompare_func *) compRedundant, NULL);\n\n  /* Let us start from the top of the list, going forward and looking\n    for the longest possible dominated column */\n  if(!allocREAL(lp, &colvalues, nrows + 1, TRUE) ||\n     !allocREAL(lp, &colobj, n + 1, FALSE) ||\n     !allocINT(lp, &coldel, n + 1, FALSE))\n    goto Finish;\n\n  for(ib = 0; ib < n; ib++) {\n\n    /* Get column and check if it was previously eliminated */\n    i = QS[ib].int4.intval;\n    if(!isActiveLink(psdata->cols->varmap, i))\n      continue;\n\n    /* Load the non-zero column values */\n    item = 0;\n    for(jb = presolve_nextrow(psdata, i, &item); jb >= 0;\n        jb = presolve_nextrow(psdata, i, &item)) {\n      jx = COL_MAT_ROWNR(jb);\n      colvalues[jx] = COL_MAT_VALUE(jb);\n    }\n\n    /* Store data for current column */\n    coldel[0] = 1;\n    coldel[1] = i;\n    colobj[1] = lp->orig_obj[i];\n\n    /* Loop over all other columns to see if they have equal constraint coefficients */\n    for(ie = ib+1; ie < n; ie++) {\n\n      /* Check if this column was previously eliminated */\n      ii = QS[ie].int4.intval;\n      if(!isActiveLink(psdata->cols->varmap, ii))\n        continue;\n\n      /* Insist on identical column lengths (sort is decending in column lengths) */\n      ii = QS[ib].int4.intpar2 - QS[ie].int4.intpar2;\n      if(ii != 0)\n        break;\n\n      /* Also insist on identical starting positions */\n      ii = QS[ib].int4.intpar1 - QS[ie].int4.intpar1;\n      if(ii != 0)\n        break;\n\n      /* Get column and check if it was previously eliminated */\n      ii = QS[ie].int4.intval;\n\n#ifdef Paranoia\n      if((QS[ib].int4.intpar1 > QS[ie].int4.intpar1) ||\n         ((QS[ib].int4.intpar1 == QS[ie].int4.intpar1) && (QS[ib].int4.intpar2 < QS[ie].int4.intpar2)))\n        report(lp, SEVERE, \"presolve_coldominance01: Invalid sorted column order\\n\");\n#endif\n\n      /* Loop over every column member to confirm that the candidate is identical in every row;\n         we also compute the minimal set order */\n      rhsval = lp->infinite;\n      item = 0;\n      item2 = 0;\n      for(jb = presolve_nextrow(psdata, ii, &item),\n          jj = presolve_nextrow(psdata, i, &item2); jb >= 0;\n          jb = presolve_nextrow(psdata, ii, &item),\n          jj = presolve_nextrow(psdata, i, &item2)) {\n        jx = COL_MAT_ROWNR(jb);\n        if(jx != COL_MAT_ROWNR(jj))\n          break;\n        if(isActiveLink(sets, jx))\n          SETMIN(rhsval, lp->orig_rhs[jx]);\n      }\n\n      /* \"We have contact\" */\n      if(jb < 0) {\n        coldel[++coldel[0]] = ii;\n        colobj[coldel[0]] = lp->orig_obj[ii];\n      }\n    }\n\n    /* Find the dominant columns, fix and delete the others */\n    if(coldel[0] > 1) {\n      qsortex(colobj+1, coldel[0], 0, sizeof(*colobj), FALSE, compareREAL, coldel+1, sizeof(*coldel));\n      /* if(rhsval+lp->epsvalue < lp->infinite) { */\n        jb = (NATURAL) (rhsval+lp->epsvalue);\n        /* printf(\"%f / %d\\n\", rhsval, jb); */\n        for(jb++; jb <= coldel[0]; jb++) {\n          jx = coldel[jb];\n          if(!presolve_colfix(psdata, jx, lp->orig_lowbo[nrows+jx], TRUE, &iVarFixed)) {\n            status = presolve_setstatus(psdata, INFEASIBLE);\n            goto Finish;\n          }\n          presolve_colremove(psdata, jx, TRUE);\n        }\n      /*} */\n    }\n\n    /* Clear the non-zero row values ahead of the next row candidate */\n    if(ib + 1 < n) {\n      ie = mat->col_end[i-1];\n      ii = mat->col_end[i];\n      for(; ie < ii; ie++)\n        colvalues[COL_MAT_ROWNR(ie)] = 0;\n    }\n  }\nFinish:\n  freeLink(&sets);\n  FREE(QS);\n  FREE(colvalues);\n  FREE(coldel);\n  FREE(colobj);\n\n  (*nVarsFixed) += iVarFixed;\n  (*nSum)       += iVarFixed;\n\n  return( status );\n}\n\n#endif\n\nSTATIC int presolve_aggregate(presolverec *psdata, int *nConRemoved, int *nVarsFixed, int *nSum)\n/* This routine combines compatible or identical columns */\n{\n  lprec    *lp = psdata->lp;\n  MATrec   *mat = lp->matA;\n  MYBOOL   first;\n  int      i, ii, ib, ie, ix, n, jb, je, jx, jj, item, item2,\n           *coldel = NULL, status = RUNNING, iVarFixed = 0;\n  REAL     scale, *colvalues = NULL;\n  UNIONTYPE QSORTrec *QScand = (UNIONTYPE QSORTrec *) calloc(lp->columns+1, sizeof(*QScand));\n\n  /* Check if we were able to obtain working memory */\n  if(QScand == NULL)\n    return( status);\n\n  /* Obtain the list of qualifying columns to be sorted */\n  n = 0;\n  for(i = firstActiveLink(psdata->cols->varmap); i != 0; i = nextActiveLink(psdata->cols->varmap, i))\n    if(!is_semicont(lp, i) && !SOS_is_member(lp->SOS, 0, i)) {\n      QScand[n].int4.intval = i;\n      item = 0;\n      ii = presolve_nextrow(psdata, i, &item);\n      QScand[n].int4.intpar1 = COL_MAT_ROWNR(ii);\n      ii = presolve_collength(psdata, i);\n      QScand[n].int4.intpar2 = ii;\n      n++;\n    }\n  if(n <= 1) {\n    FREE(QScand);\n    return( status );\n  }\n  QS_execute(QScand, n, (findCompare_func *) compRedundant, NULL);\n\n  /* Let us start from the top of the list, going forward and looking\n    for the longest possible identical column */\n  if(!allocREAL(lp, &colvalues, lp->rows + 1, TRUE) ||\n     !allocINT(lp, &coldel, lp->columns + 1, FALSE))\n    goto Finish;\n\n  for(ib = 0; ib < n; ib++) {\n\n    /* Get column and check if it was previously eliminated */\n    i = QScand[ib].int4.intval;\n    if(i < 0)\n      continue;\n\n    /* Load the non-zero column values of this active/reference column */\n    item = 0;\n    for(jb = presolve_nextrow(psdata, i, &item); jb >= 0;\n        jb = presolve_nextrow(psdata, i, &item)) {\n      jx = COL_MAT_ROWNR(jb);\n      colvalues[jx] = COL_MAT_VALUE(jb);\n    }\n\n    coldel[0] = 0;\n    for(ie = ib+1; ie < n; ie++) {\n\n      /* Insist on identical column lengths (sort is decending in column lengths) */\n      ii = QScand[ib].int4.intpar2 - QScand[ie].int4.intpar2;\n      if(ii != 0)\n        break;\n\n      /* Also insist on identical starting positions */\n      ii = QScand[ib].int4.intpar1 - QScand[ie].int4.intpar1;\n      if(ii != 0)\n        break;\n\n      /* Get column and check if it was previously eliminated */\n      ii = QScand[ie].int4.intval;\n      if(ii < 0)\n        continue;\n\n      /* Loop over every column member to confirm that the candidate is\n        relatively identical in every position */\n      first = TRUE;\n      item = 0;\n      item2 = 0;\n      scale = 1;\n      for(jb = presolve_nextrow(psdata, ii, &item),\n          jj = presolve_nextrow(psdata, i, &item2); jb >= 0;\n          jb = presolve_nextrow(psdata, ii, &item),\n          jj = presolve_nextrow(psdata, i, &item2)) {\n        jx = COL_MAT_ROWNR(jb);\n        if(jx != COL_MAT_ROWNR(jj))\n          break;\n        if(first) {\n          first = !first;\n          scale = colvalues[jx] / COL_MAT_VALUE(jb);\n        }\n        else {\n          if(fabs(colvalues[jx] - scale * COL_MAT_VALUE(jb)) > psdata->epsvalue)\n            break;\n        }\n      }\n\n      /* \"We have contact\", store the column in the aggregation list */\n      if(jb < 0) {\n        coldel[++coldel[0]] = ii;\n        QScand[ie].int4.intval = -ii;\n      }\n    }\n\n    /* Sort the aggregation list if we have aggregation candidates */\n    if(coldel[0] > 1) {\n      REAL     of, ofelim, fixvalue;\n      MYBOOL   isint;\n      UNIONTYPE QSORTrec *QSagg = (UNIONTYPE QSORTrec *) calloc(coldel[0], sizeof(*QSagg));\n\n      for(jb = 1; jb <= coldel[0]; jb++) {\n        ii = jb - 1;\n        QSagg[ii].pvoidint2.intval = coldel[jb];\n        QSagg[ii].pvoidint2.ptr    = (void *) lp;\n      }\n      QS_execute(QSagg, coldel[0], (findCompare_func *) compAggregate, NULL);\n\n      /* Process columns with identical OF coefficients */\n      jb = 0;\n      while((status == RUNNING) && (jb < coldel[0])) {\n        ii = QSagg[jb].pvoidint2.intval;\n        of = lp->orig_obj[ii];\n        isint = is_int(lp, ii);\n        je = jb + 1;\n        while((status == RUNNING) && (je < coldel[0]) &&\n              (fabs(lp->orig_obj[ix = QSagg[je].pvoidint2.intval] - of) < psdata->epsvalue)) {\n           /* We now have two columns with equal OFs; the following cases are possible:\n\n             1) The first column has Inf upper bound, which means that it can\n                \"absorb\" compatible columns, which are then fixed at the appropriate\n                bounds (or zero in case of free variables).\n             2) The first column has a -Inf lower bound, and further columns are\n                Inf upper bounds, which means steps towards forming a free variable\n                can be made.\n             3) The first column is a non-Inf upper bound, in which case the bounds\n                are summed into a helper variable and the variable simply deleted.\n                The deleted variables' value are allocated/distributed via a simple\n                linear programming routine at postsolve.\n\n             In the current version of this code, we only handle case 1. */\n          if(is_int(lp, ix) == isint) {\n            ofelim = lp->orig_obj[ix];\n            if(of == 0)\n              scale = 1;\n            else\n              scale = ofelim / of;\n\n            if(my_infinite(lp, lp->orig_upbo[lp->rows+ii])) { /* Case 1 (recipe.mps) */\n              if(is_unbounded(lp, ix))\n                fixvalue = 0;\n              else if(ofelim < 0)\n                fixvalue = lp->orig_upbo[lp->rows+ix];\n              else\n                fixvalue = lp->orig_lowbo[lp->rows+ix];\n              if(my_infinite(lp, fixvalue))\n                status = presolve_setstatus(psdata, UNBOUNDED);\n              else if(!presolve_colfix(psdata, ix, fixvalue, TRUE, &iVarFixed))\n                status = presolve_setstatus(psdata, INFEASIBLE);\n              else\n                presolve_colremove(psdata, ix, TRUE);\n            }\n\n            else if(my_infinite(lp, lp->orig_lowbo[lp->rows+ii])) { /* Case 2 */\n              /* Do nothing */\n            }\n\n            else {                                            /* Case 3 */\n#if 0\n              /* Do nothing */\n#else\n              if(ofelim >= 0) {\n                fixvalue = lp->orig_lowbo[lp->rows+ix];\n                lp->orig_upbo[lp->rows+ii] += scale * (lp->orig_upbo[lp->rows+ix] - fixvalue);\n              }\n              else {\n                fixvalue = lp->orig_upbo[lp->rows+ix];\n                lp->orig_upbo[lp->rows+ii] -= scale * (fixvalue - lp->orig_lowbo[lp->rows+ix]);\n              }\n              if(my_infinite(lp, fixvalue))\n                status = presolve_setstatus(psdata, UNBOUNDED);\n              else if(!presolve_colfix(psdata, ix, fixvalue, TRUE, &iVarFixed))\n                status = presolve_setstatus(psdata, INFEASIBLE);\n              else\n                presolve_colremove(psdata, ix, TRUE);\n#ifdef xxParanoia\n              if(presolve_rowlengthdebug(psdata) > 0)\n                report(lp, SEVERE, \"presolve_aggregate: Invalid row count\\n\");\n#endif\n              psdata->forceupdate = TRUE;\n#endif\n            }\n          }\n          je++;\n        }\n        jb = je;\n      }\n      FREE(QSagg);\n    }\n\n    /* Clear the non-zero row values ahead of the next row candidate */\n    if(ib + 1 < n) {\n      ie = mat->col_end[i-1];\n      ii = mat->col_end[i];\n      for(; ie < ii; ie++)\n        colvalues[COL_MAT_ROWNR(ie)] = 0;\n    }\n  }\nFinish:\n  FREE(QScand);\n  FREE(colvalues);\n  FREE(coldel);\n\n  (*nVarsFixed) += iVarFixed;\n  (*nSum)       += iVarFixed;\n\n  return( status );\n}\n\nSTATIC int presolve_makesparser(presolverec *psdata, int *nCoeffChanged, int *nConRemove, int *nVarFixed, int *nSum)\n{\n  lprec    *lp = psdata->lp;\n  MATrec   *mat = lp->matA;\n  MYBOOL   chsign;\n  int      i, ii, ib, ix, k, n, jb, je, jl, jjb, jje, jjl, jx, jjx, item, itemEQ,\n           *nzidx = NULL, status = RUNNING, iObjChanged = 0, iCoeffChanged = 0, iConRemove = 0;\n  REAL     test, ratio, value, valueEQ, *valptr;\n  LLrec    *EQlist = NULL;\n  UNIONTYPE QSORTrec *QS = (UNIONTYPE QSORTrec *) calloc(lp->rows, sizeof(*QS));\n\n  /* Check if we were able to obtain working memory */\n  if((QS == NULL) || (psdata->rows->varmap->count == 0) || (psdata->EQmap->count == 0))\n    return( status);\n\n  /* Sort rows in 1) increasing order of start index, 2) decreasing length, and\n     3) non-equalities (i.e. equalities last) */\n  n = 0;\n  for(i = firstActiveLink(psdata->rows->varmap); i != 0; i = nextActiveLink(psdata->rows->varmap, i)) {\n    k = presolve_rowlength(psdata, i);\n    if(k >= 2) {\n      item = 0;\n      ii = presolve_nextcol(psdata, i, &item);\n#ifdef Paranoia\n      if((ii < 0) || (item == 0)) {\n        report(lp, SEVERE, \"presolve_makesparser: Unexpected zero-length row %d\\n\", i);\n        continue;\n      }\n#endif\n      QS[n].int4.intval  = my_chsign(is_constr_type(lp, i, EQ), i);\n      QS[n].int4.intpar1 = ROW_MAT_COLNR(ii);\n      QS[n].int4.intpar2 = k;\n      n++;\n    }\n  }\n  if(n <= 1) {\n    FREE(QS);\n    return( status );\n  }\n  QS_execute(QS, n, (findCompare_func *) compSparsity, NULL);\n\n  /* Create associated sorted map of indeces to equality constraints;\n     note that we need to have a unit offset for compatibility. */\n  allocINT(lp, &nzidx, lp->columns + 1, FALSE);\n  createLink(lp->rows, &EQlist, NULL);\n  for(ib = 0; ib < n; ib++) {\n    i = QS[ib].int4.intval;\n    if(i < 0)\n      appendLink(EQlist, ib + 1);\n  }\n\n  /* Loop over all equality masks */\n  for(ix = firstActiveLink(EQlist); ix != 0; ) {\n\n    /* Get row starting and ending positions of the mask */\n    ii = abs(QS[ix-1].int4.intval);\n    jjb = QS[ix-1].int4.intpar1;\n    jje = presolve_lastcol(psdata, ii);\n    jje = ROW_MAT_COLNR(jje);\n    jjl = QS[ix-1].int4.intpar2;\n\n    /* Scan the OF */\n    i = 0;\n    chsign = is_chsign(lp, i);\n    test = ratio = 0.0;\n    itemEQ = 0;\n    nzidx[0] = 0;\n    while(((jjx = presolve_nextcol(psdata, ii, &itemEQ)) >= 0) && /*(itemEQ > 0) && */\n           (fabs(test-ratio) < psdata->epsvalue)) {\n      valueEQ = ROW_MAT_VALUE(jjx);\n      if(valueEQ == 0)\n        continue;\n      k = ROW_MAT_COLNR(jjx);\n      value = lp->orig_obj[k];\n      if(fabs(value) < psdata->epsvalue)\n        break;\n      if(ratio == 0.0) {\n        test = ratio = value / valueEQ;\n      }\n      else\n        test = value / valueEQ;\n      /* Store nz index */\n      nzidx[++nzidx[0]] = k;\n    }\n\n    /* We were successful if the equality was completely traversed; we will\n      then zero-out the OF coefficients and update the constant term. */\n    if((itemEQ == 0) && (nzidx[0] > 0) && (fabs(test-ratio) < psdata->epsvalue)) {\n      for(k = 1; k <= nzidx[0]; k++) {\n        /* We should add recovery data for the zero'ed coefficient here */\n        jx = nzidx[k];\n        value = lp->orig_obj[jx];\n        lp->orig_obj[jx] = 0.0;\n        /* Update counts */\n        value = my_chsign(chsign, value);\n        if(value < 0) {\n          psdata->rows->negcount[i]--;\n          psdata->cols->negcount[jx]--;\n        }\n        else {\n          psdata->rows->plucount[i]--;\n          psdata->cols->plucount[jx]--;\n        }\n        iObjChanged++;\n      }\n      value = ratio * lp->orig_rhs[ii];\n      presolve_adjustrhs(psdata, i, value, psdata->epsvalue);\n    }\n\n    /* Scan for compatible constraints that can be masked for sparsity elimination */\n    for(ib = 1; ib < ix; ib++) {\n\n      /* Get row starting and ending positions of the target constraint */\n      i  = abs(QS[ib-1].int4.intval);\n      jb = QS[ib-1].int4.intpar1;\n      je = presolve_lastcol(psdata, i);\n      je = ROW_MAT_COLNR(je);\n      jl = QS[ib-1].int4.intpar2;\n\n      /* Check if there is a window mismatch */\n      if((jjb < jb) || (jje > je) || (jjl > jl))\n        goto NextEQ;\n\n      /* We have a window match; now check if there is a (scalar) member-by-member\n        match as well.  We approach this in the following manner:\n          1) Get first (or next) member of active equality\n          2) Loop to matching member in the target constraint, but abandon if no match\n          3) Set ratio if this is the first match, otherwise compare ratio and abandon\n             on mismatch\n          4) Go to 1) of there are more elements in the active equality\n          5) Proceed to do sparsity elimination if we were successful. */\n      chsign = is_chsign(lp, i);\n      test = ratio = 0.0;\n      itemEQ = 0;\n      item = 0;\n      nzidx[0] = 0;\n      while(((jjx = presolve_nextcol(psdata, ii, &itemEQ)) >= 0) && /*(itemEQ > 0) &&*/\n             (fabs(test-ratio) < psdata->epsvalue)) {\n        valueEQ = ROW_MAT_VALUE(jjx);\n        if(valueEQ == 0)\n          continue;\n        jx = 0;\n        jjx = ROW_MAT_COLNR(jjx);\n        for(k = presolve_nextcol(psdata, i, &item);\n            (jx < jjx) && (item > 0);\n            k = presolve_nextcol(psdata, i, &item)) {\n          jx = ROW_MAT_COLNR(k);\n          /* Do we have a column index match? */\n          if(jx == jjx) {\n            value = ROW_MAT_VALUE(k);\n            /* Abandon if we have a zero value */\n            if(value == 0)\n              goto NextEQ;\n            if(ratio == 0.0) {\n              test = ratio = value / valueEQ;\n            }\n            else\n              test = value / valueEQ;\n           /* Store nz index */\n            nzidx[++nzidx[0]] = k;\n            break;\n          }\n          /* Give up matching if there is overshooting */\n          else if(jx > jjx)\n            goto NextEQ;\n        }\n      }\n\n      /* We were successful if the equality was completely traversed */\n      if((itemEQ == 0) && (nzidx[0] > 0) && (fabs(test-ratio) < psdata->epsvalue)) {\n\n        /* Check if we have found parametrically indentical constraints */\n        if(presolve_rowlength(psdata, i) == presolve_rowlength(psdata,ii)) {\n\n          value = lp->orig_rhs[i];\n          valueEQ = lp->orig_rhs[ii];\n\n          /* Are they both equalities? */\n          if(is_constr_type(lp, i, EQ)) {\n            /* Determine applicable ratio for the RHS */\n            if(fabs(valueEQ) < psdata->epsvalue) {\n              if(fabs(value) < psdata->epsvalue)\n                test = ratio;\n              else\n                test = lp->infinite;\n            }\n            else\n              test = value / valueEQ;\n            /* Check for infeasibility */\n            if(fabs(test-ratio) > psdata->epsvalue) {\n              report(lp, NORMAL, \"presolve_sparser: Infeasibility of relatively equal constraints %d and %d\\n\",\n                                 i, ii);\n              status = presolve_setstatus(psdata, INFEASIBLE);\n              goto Finish;\n            }\n            /* Otherwise we can delete a redundant constraint */\n            else {\n              removeLink(EQlist, i);\n              presolve_rowremove(psdata, i, TRUE);\n              MEMCOPY(&QS[ib-1], &QS[ib], n-ib);\n              n--;\n              iConRemove++;\n            }\n          }\n          /* ... if not, then delete the inequality, since the equality dominates */\n          else {\n            /* First verify feasibility of the RHS */\n            if((value+psdata->epsvalue < valueEQ) ||\n               (value-get_rh_range(lp, i)-psdata->epsvalue > valueEQ)) {\n              report(lp, NORMAL, \"presolve_sparser: Infeasibility of relatively equal RHS values for %d and %d\\n\",\n                                 i, ii);\n              status = presolve_setstatus(psdata, INFEASIBLE);\n              goto Finish;\n            }\n            presolve_rowremove(psdata, i, TRUE);\n            MEMCOPY(&QS[ib-1], &QS[ib], n-ib);\n            n--;\n            iConRemove++;\n          }\n        }\n\n        /* Otherwise zero-out the target constraint coefficients and update the RHS */\n        else {\n          for(k = 1; k <= nzidx[0]; k++) {\n            /* We should add recovery data for the zero'ed coefficient here */\n            jjx = nzidx[k];\n            jx = ROW_MAT_COLNR(jjx);\n            valptr = &ROW_MAT_VALUE(jjx);\n            value  = *valptr;\n            *valptr = 0.0;\n            /* Update counts */\n            value = my_chsign(chsign, value);\n            if(value < 0) {\n              psdata->rows->negcount[i]--;\n              psdata->cols->negcount[jx]--;\n            }\n            else {\n              psdata->rows->plucount[i]--;\n              psdata->cols->plucount[jx]--;\n            }\n            iCoeffChanged++;\n          }\n          value = ratio * lp->orig_rhs[ii];\n          presolve_adjustrhs(psdata, i, value, psdata->epsvalue);\n        }\n      }\n\n    }\n    /* Get next equality index */\nNextEQ:\n    ix = nextActiveLink(EQlist, ix);\n  }\n\nFinish:\n  FREE(QS);\n  freeLink(&EQlist);\n  FREE(nzidx);\n\n  /* Let us condense the matrix if we modified the constraint matrix */\n  if(iCoeffChanged > 0) {\n    mat->row_end_valid = FALSE;\n    mat_zerocompact(mat);\n    presolve_validate(psdata, TRUE);\n#ifdef PresolveForceUpdateMax\n    mat_computemax(mat /* , FALSE */);\n#endif\n    psdata->forceupdate = TRUE;\n  }\n\n  (*nConRemove)    += iConRemove;\n  (*nCoeffChanged) += iCoeffChanged + iObjChanged;\n  (*nSum)          += iCoeffChanged + iObjChanged + iConRemove;\n\n  return( status );\n}\n\nSTATIC int presolve_SOS1(presolverec *psdata, int *nCoeffChanged, int *nConRemove, int *nVarFixed, int *nSOS, int *nSum)\n{\n  lprec    *lp = psdata->lp;\n  MYBOOL   candelete, SOS_GUBactive = FALSE;\n  int      iCoeffChanged = 0, iConRemove = 0, iSOS = 0,\n           i,ix,iix, j,jx,jjx, status = RUNNING;\n  REAL     Value1;\n  MATrec   *mat = lp->matA;\n\n  for(i = lastActiveLink(psdata->rows->varmap); i > 0; ) {\n    candelete = FALSE;\n    Value1 = get_rh(lp, i);\n    jx = get_constr_type(lp, i);\n    if((Value1 == 1) && (presolve_rowlength(psdata, i) >= MIN_SOS1LENGTH) &&\n       ((SOS_GUBactive && (jx != GE)) || (!SOS_GUBactive && (jx == LE)))) {\n      jjx = mat->row_end[i-1];\n      iix = mat->row_end[i];\n      for(; jjx < iix; jjx++) {\n        j = ROW_MAT_COLNR(jjx);\n        if(!isActiveLink(psdata->cols->varmap, j))\n          continue;\n        if(!is_binary(lp, j) || (ROW_MAT_VALUE(jjx) != 1))\n          break;\n      }\n      if(jjx >= iix) {\n        char SOSname[16];\n\n        /* Define a new SOS instance */\n        ix = SOS_count(lp) + 1;\n        sprintf(SOSname, \"SOS_%d\", ix);\n        ix = add_SOS(lp, SOSname, 1, ix, 0, NULL, NULL);\n        if(jx == EQ)\n          SOS_set_GUB(lp->SOS, ix, TRUE);\n        Value1 = 0;\n        jjx = mat->row_end[i-1];\n        for(; jjx < iix; jjx++) {\n          j = ROW_MAT_COLNR(jjx);\n          if(!isActiveLink(psdata->cols->varmap, j))\n            continue;\n          Value1 += 1;\n          append_SOSrec(lp->SOS->sos_list[ix-1], 1, &j, &Value1);\n        }\n        candelete = TRUE;\n        iSOS++;\n      }\n    }\n\n    /* Get next row and do the deletion of the previous, if indicated */\n    ix = i;\n    i = prevActiveLink(psdata->rows->varmap, i);\n    if(candelete) {\n      presolve_rowremove(psdata, ix, TRUE);\n      iConRemove++;\n    }\n  }\n  if(iSOS)\n    report(lp, DETAILED, \"presolve_SOS1: Converted %5d constraints to SOS1.\\n\", iSOS);\n  clean_SOSgroup(lp->SOS, (MYBOOL) (iSOS > 0));\n\n  (*nCoeffChanged) += iCoeffChanged;\n  (*nConRemove)    += iConRemove;\n  (*nSOS)          += iSOS;\n  (*nSum)          += iCoeffChanged+iConRemove+iSOS;\n\n  return( status );\n}\n\nSTATIC int presolve_boundconflict(presolverec *psdata, int baserowno, int colno)\n{\n  REAL   Value1, Value2;\n  lprec  *lp = psdata->lp;\n  MATrec *mat = lp->matA;\n  int    ix, item = 0,\n         status = RUNNING;\n\n  if(baserowno <= 0) do {\n    ix = presolve_nextrow(psdata, colno, &item);\n    if(ix < 0)\n      return( status );\n    baserowno = COL_MAT_ROWNR(ix);\n  } while(presolve_rowlength(psdata, baserowno) != 1);\n  Value1 = get_rh_upper(lp, baserowno),\n  Value2 = get_rh_lower(lp, baserowno);\n\n  if(presolve_singletonbounds(psdata, baserowno, colno, &Value2, &Value1, NULL)) {\n    int iix;\n    item = 0;\n    for(ix = presolve_nextrow(psdata, colno, &item);\n        ix >= 0; ix = presolve_nextrow(psdata, colno, &item)) {\n      iix = COL_MAT_ROWNR(ix);\n      if((iix != baserowno) &&\n         (presolve_rowlength(psdata, iix) == 1) &&\n         !presolve_altsingletonvalid(psdata, iix, colno, Value2, Value1)) {\n        status = presolve_setstatus(psdata, INFEASIBLE);\n        break;\n      }\n    }\n  }\n  else\n    status = presolve_setstatus(psdata, INFEASIBLE);\n  return( status );\n}\n\nSTATIC int presolve_columns(presolverec *psdata, int *nCoeffChanged, int *nConRemove, int *nVarFixed, int *nBoundTighten, int *nSum)\n{\n  lprec    *lp = psdata->lp;\n  MYBOOL   candelete, isOFNZ, unbounded,\n           probefix = is_presolve(lp, PRESOLVE_PROBEFIX),\n#if 0\n           probereduce = is_presolve(lp, PRESOLVE_PROBEREDUCE),\n#endif\n           colfixdual = is_presolve(lp, PRESOLVE_COLFIXDUAL);\n  int      iCoeffChanged = 0, iConRemove = 0, iVarFixed = 0, iBoundTighten = 0,\n           status = RUNNING, ix, j, countNZ, item;\n  REAL     Value1;\n\n  for(j = firstActiveLink(psdata->cols->varmap); (j != 0) && (status == RUNNING); ) {\n\n    /* Don't presolve members SOS'es */\n    if(SOS_is_member(lp->SOS, 0, j)) {\n      j = nextActiveLink(psdata->cols->varmap, j);\n      continue;\n    }\n\n    /* Initialize */\n    countNZ = presolve_collength(psdata, j);\n    isOFNZ  = isnz_origobj(lp, j);\n    Value1  = get_lowbo(lp, j);\n    unbounded = is_unbounded(lp, j);\n\n    /* Clear unnecessary semicont-definitions */\n    if((lp->sc_vars > 0) && (Value1 == 0) && is_semicont(lp, j))\n      set_semicont(lp, j, FALSE);\n\n    candelete = FALSE;\n    item = 0;\n    ix = lp->rows + j;\n\n    /* Check if the variable is unused */\n    if((countNZ == 0) && !isOFNZ) {\n      if(Value1 != 0)\n        report(lp, DETAILED, \"presolve_columns: Eliminated unused variable %s\\n\",\n                              get_col_name(lp,j));\n      candelete = TRUE;\n    }\n\n    /* Check if the variable has a cost, but is not limited by constraints */\n    else if((countNZ == 0) && isOFNZ) {\n      if(lp->orig_obj[j] < 0)\n        Value1 = get_upbo(lp, j);\n      if(fabs(Value1) >= lp->infinite) {\n        report(lp, DETAILED, \"presolve_columns: Unbounded variable %s\\n\",\n                              get_col_name(lp,j));\n        status = presolve_setstatus(psdata, UNBOUNDED);\n      }\n      else {\n        /* Fix the value at its best bound */\n        report(lp, DETAILED, \"presolve_columns: Eliminated trivial variable %s fixed at %g\\n\",\n                              get_col_name(lp,j), Value1);\n        candelete = TRUE;\n      }\n    }\n\n    /* Check if the variable can be eliminated because it is fixed */\n    else if(isOrigFixed(lp, ix)) {\n      if(countNZ > 0) {\n        status = presolve_boundconflict(psdata, -1, j);\n        if(status != RUNNING)\n          break;\n      }\n      report(lp, DETAILED, \"presolve_columns: Eliminated variable %s fixed at %g\\n\",\n                            get_col_name(lp,j), Value1);\n      candelete = TRUE;\n    }\n\n#if 0\n    /* Merge OF-constraint column doubleton in equality constraint (if it has\n      not been captured by the singleton free variable rule above) */\n    else if((countNZ == 1) && isOFNZ &&\n             ((i = presolve_nextrow(psdata, j, &item)) >= 0) &&\n             is_constr_type(lp, i = COL_MAT_ROWNR(i), EQ)) {\n      MATrec *mat = lp->matA;\n\n      /* Merge the constraint into the OF */\n      Value1 = lp->orig_obj[j] / get_mat(lp, i, j);\n      for(jx = mat->row_end[i-1]; jx < mat->row_end[i]; jx++) {\n        jjx = ROW_MAT_COLNR(jx);\n        lp->orig_obj[jjx] -= Value1 * ROW_MAT_VALUE(jx);\n      }\n      Value2 = lp->orig_rhs[i];\n      presolve_adjustrhs(psdata, 0, Value1 * Value2, 0.0);\n\n      /* Verify feasibility */\n      Value2 /= get_mat(lp, i, j);\n      if((Value2 < get_lowbo(lp, j)) || (Value2 > get_upbo(lp, j))) {\n        status = presolve_setstatus(psdata, INFEASIBLE);\n        break;\n      }\n\n      /* Do column (and flag row) deletion */\n      presolve_rowremove(psdata, i, TRUE);\n      psdata->forceupdate = TRUE;\n      iConRemove++;\n      candelete = TRUE;\n    }\n#endif\n    /* Look for opportunity to fix column based on the dual */\n    else if(colfixdual && presolve_colfixdual(psdata, j, &Value1, &status)) {\n      if(my_infinite(lp, Value1)) {\n        report(lp, DETAILED, \"presolve_columns: Unbounded variable %s\\n\",\n                              get_col_name(lp,j));\n        status = presolve_setstatus(psdata, UNBOUNDED);\n      }\n      else {\n        /* Fix the value at its best bound */\n        report(lp, DETAILED, \"presolve_columns: Eliminated dual-zero variable %s fixed at %g\\n\",\n                              get_col_name(lp,j), Value1);\n        candelete = TRUE;\n      }\n    }\n\n    /* Do probing of binary variables to see if we can fix them */\n    else if(probefix && is_binary(lp, j) &&\n            presolve_probefix01(psdata, j, &Value1)) {\n      report(lp, DETAILED, \"presolve_columns: Fixed binary variable %s at %g\\n\",\n                            get_col_name(lp,j), Value1);\n      candelete = TRUE;\n    }\n#if 0\n    /* Do probing of binary variables to see if we can tighten their coefficients */\n    else if(probereduce && is_binary(lp, j) &&\n            (ix = presolve_probetighten01(psdata, j) > 0)) {\n      report(lp, DETAILED, \"presolve_columns: Tightened coefficients for binary variable %s in %d rows\\n\",\n                            get_col_name(lp,j), ix);\n      iCoeffChanged += ix;\n      psdata->forceupdate = TRUE;\n    }\n#endif\n\n    /* Perform fixing and deletion, if indicated */\n    if(candelete) {\n\n      /* If we have a SOS1 member variable fixed at a non-zero value, then we\n        must fix the other member variables at zero and delete the SOS(es) */\n      if((Value1 != 0) && SOS_is_member(lp->SOS, 0, j)) {\n        ix = iVarFixed;\n        if(!presolve_fixSOS1(psdata, j, Value1, &iConRemove, &iVarFixed))\n          status = presolve_setstatus(psdata, INFEASIBLE);\n        if(iVarFixed > ix)\n          psdata->forceupdate = TRUE;\n        break;\n      }\n      else {\n        if(!presolve_colfix(psdata, j, Value1, TRUE, &iVarFixed)) {\n          status = presolve_setstatus(psdata, INFEASIBLE);\n          break;\n        }\n        j = presolve_colremove(psdata, j, TRUE);\n      }\n    }\n    else\n      j = nextActiveLink(psdata->cols->varmap, j);\n  }\n\n  /* Remove any \"hanging\" empty row and columns */\n  if(status == RUNNING)\n    status = presolve_shrink(psdata, &iConRemove, &iVarFixed);\n\n  (*nCoeffChanged) += iCoeffChanged;\n  (*nConRemove)    += iConRemove;\n  (*nVarFixed)     += iVarFixed;\n  (*nBoundTighten) += iBoundTighten;\n  (*nSum)          += iCoeffChanged+iConRemove+iVarFixed+iBoundTighten;\n\n  return( status );\n}\n\nSTATIC int presolve_freeandslacks(presolverec *psdata, int *nCoeffChanged, int *nConRemove, int *nVarFixed, int *nSum)\n{\n  lprec    *lp = psdata->lp;\n  MYBOOL   isOFNZ, unbounded,\n           impliedfree = is_presolve(lp, PRESOLVE_IMPLIEDFREE),\n           impliedslack = is_presolve(lp, PRESOLVE_IMPLIEDSLK);\n  int      iCoeffChanged = 0, iConRemove = 0, iVarFixed = 0,\n           status = RUNNING, i, ix, j, countNZ;\n  REAL     coeff_bl, coeff_bu;\n  MATrec   *mat = lp->matA;\n\n  if(impliedfree || impliedslack)\n  for(j = firstActiveLink(psdata->cols->varmap); j != 0; ) {\n\n    /* Check and initialize */\n    if((presolve_collength(psdata, j) != 1) ||\n       is_int(lp, j) || is_semicont(lp, j) ||\n       !presolve_candeletevar(psdata, j)) {\n      j = nextActiveLink(psdata->cols->varmap, j);\n      continue;\n    }\n    ix = 0;\n    i = COL_MAT_ROWNR(presolve_nextrow(psdata, j, &ix));\n    isOFNZ  = isnz_origobj(lp, j);\n    countNZ = presolve_rowlength(psdata, i);\n    coeff_bu = get_upbo(lp, j);\n    coeff_bl = get_lowbo(lp, j);\n    unbounded = my_infinite(lp, coeff_bl) && my_infinite(lp, coeff_bu);\n    ix = lp->rows + j;\n\n    /* Eliminate singleton free variable and its associated constraint */\n    if(impliedfree && unbounded &&\n       presolve_impliedcolfix(psdata, i, j, TRUE)) {\n      report(lp, DETAILED, \"presolve_freeandslacks: Eliminated free variable %s and row %s\\n\",\n                            get_col_name(lp, j), get_row_name(lp, i));\n      presolve_rowremove(psdata, i, TRUE);\n      iConRemove++;\n      j = presolve_colremove(psdata, j, TRUE);\n      iVarFixed++;\n    }\n\n    /* Check for implied slack variable in equality constraint */\n    else if(impliedslack &&\n             (countNZ > 1) &&\n             is_constr_type(lp, i, EQ) &&\n             presolve_impliedcolfix(psdata, i, j, FALSE)) {\n      report(lp, DETAILED, \"presolve_freeandslacks: Eliminated implied slack variable %s via row %s\\n\",\n                            get_col_name(lp, j), get_row_name(lp, i));\n      psdata->forceupdate = TRUE;\n      j = presolve_colremove(psdata, j, TRUE);\n      iVarFixed++;\n    }\n\n    /* Check for implied (generalized) slack variable in inequality constraint */\n    else if(impliedslack && !isOFNZ &&\n             my_infinite(lp, coeff_bu) &&                 /* Consider removing this test */\n#if 0 /* Force zero-bounded implicit slack  */\n             (coeff_bl == 0)) &&\n#else\n             !my_infinite(lp, coeff_bl) &&\n#endif\n             (countNZ > 1) &&\n             !is_constr_type(lp, i, EQ))  {\n      REAL *target,\n            ValueA   = COL_MAT_VALUE(presolve_lastrow(psdata, j));\n#if 0\n      coeff_bu = get_rh_upper(lp, i);\n      coeff_bl = get_rh_lower(lp, i);\n      if(!presolve_singletonbounds(psdata, i, j, &coeff_bl, &coeff_bu, &ValueA)) {\n        status = presolve_setstatus(psdata, INFEASIBLE);\n        break;\n      }\n#endif\n      if((coeff_bl != 0) && !my_infinite(lp, coeff_bl) && !my_infinite(lp, coeff_bu))\n        coeff_bu -= coeff_bl;\n\n      /* If the coefficient is negative, reduce the lower bound / increase range */\n      if(ValueA > 0) {\n        target = &lp->orig_upbo[i];\n        if(!my_infinite(lp, *target)) {\n          if(my_infinite(lp, coeff_bu)) {\n            *target = lp->infinite;\n            psdata->forceupdate = TRUE;\n          }\n          else {\n            *target += ValueA * coeff_bu;\n            *target = presolve_roundrhs(lp, *target, FALSE);\n          }\n        }\n      }\n      /* Otherwise see if the upper bound should be changed */\n      else {\n        target = &lp->orig_rhs[i];\n        if(my_infinite(lp, coeff_bu) || my_infinite(lp, *target)) {\n          /* Do we suddenly find that the constraint becomes redundant? (e226.mps) */\n          if(my_infinite(lp, lp->orig_upbo[i])) {\n            presolve_rowremove(psdata, i, TRUE);\n            iConRemove++;\n          }\n          /* Or does the upper bound of a ranged constraint become Inf? */\n          else {\n            *target -= lp->orig_upbo[i];\n            *target = -(*target);\n            mat_multrow(mat, i, -1);\n            lp->orig_upbo[i] = lp->infinite;\n            psdata->forceupdate = TRUE;\n          }\n        }\n        else {\n          *target -= ValueA * coeff_bu;\n          *target = presolve_roundrhs(lp, *target, FALSE);\n        }\n      }\n      presolve_colfix(psdata, j, coeff_bl, TRUE, &iVarFixed);\n      report(lp, DETAILED, \"presolve_freeandslacks: Eliminated duplicate slack variable %s via row %s\\n\",\n                            get_col_name(lp, j), get_row_name(lp, i));\n      j = presolve_colremove(psdata, j, TRUE);\n    }\n\n    /* Go to next column */\n    else\n      j = nextActiveLink(psdata->cols->varmap, j);\n  }\n\n  (*nCoeffChanged) += iCoeffChanged;\n  (*nConRemove)    += iConRemove;\n  (*nVarFixed)     += iVarFixed;\n  (*nSum)          += iCoeffChanged+iConRemove+iVarFixed;\n\n  return( status );\n}\n\nSTATIC int presolve_preparerows(presolverec *psdata, int *nBoundTighten, int *nSum)\n{\n  lprec    *lp = psdata->lp;\n  MYBOOL   impliedfree = is_presolve(lp, PRESOLVE_IMPLIEDFREE),\n           tightenbounds  = is_presolve(lp, PRESOLVE_BOUNDS);\n  int      iRangeTighten = 0, iBoundTighten = 0, status = RUNNING, i, j;\n  REAL     losum, upsum, lorhs, uprhs, epsvalue = psdata->epsvalue;\n  MATrec   *mat = lp->matA;\n\n  for(i = lastActiveLink(psdata->rows->varmap); i > 0; i = prevActiveLink(psdata->rows->varmap, i)) {\n\n   /* First identify any full row infeasibilities */\n    j = presolve_rowlengthex(psdata, i);\n#ifdef Paranoia\n    if(!presolve_testrow(psdata, nextActiveLink(psdata->rows->varmap, i))) {\n#else\n    if((j > 1) && !psdata->forceupdate && !presolve_rowfeasible(psdata, i, FALSE)) {\n#endif\n      status = presolve_setstatus(psdata, INFEASIBLE);\n      break;\n    }\n\n    /* Do bound (LHS) or constraint range (RHS) tightening if we will later identify\n      implied free variables (tends to produce degeneracy otherwise) */\n    if(impliedfree && (j > 1) && mat_validate(mat)){\n\n      /* Look for opportunity to tighten constraint bounds (and check for feasibility again) */\n      presolve_range(lp, i, psdata->rows, &losum, &upsum);\n      lorhs = get_rh_lower(lp, i);\n      uprhs = get_rh_upper(lp, i);\n      if((losum > MIN(upsum, uprhs)+epsvalue) ||\n         (upsum < MAX(losum, lorhs)-epsvalue)) {\n        report(lp, NORMAL, \"presolve_preparerows: Variable bound / constraint value infeasibility in row %s.\\n\",\n                           get_row_name(lp, i));\n        status = presolve_setstatus(psdata, INFEASIBLE);\n        break;\n      }\n\n      if(losum > lorhs+epsvalue) {\n        set_rh_lower(lp, i, presolve_roundrhs(lp, losum, TRUE));\n        iRangeTighten++;\n      }\n      if(upsum < uprhs-epsvalue) {\n        set_rh_upper(lp, i, presolve_roundrhs(lp, upsum, FALSE));\n        iRangeTighten++;\n      }\n    }\n\n    /* Seek to tighten bounds on individual variables */\n    if(tightenbounds && mat_validate(mat)) {\n#if 1\n      if(j > 1)\n        status = presolve_rowtighten(psdata, i, &iBoundTighten, FALSE);\n#else\n      if((MIP_count(lp) > 0) && (j > 1))\n        status = presolve_rowtighten(psdata, i, &iBoundTighten, TRUE);\n#endif\n    }\n\n    /* Look for opportunity to convert ranged constraint to equality-type */\n    if(!is_constr_type(lp, i, EQ) && (get_rh_range(lp, i) < epsvalue)) {\n      presolve_setEQ(psdata, i);\n      iRangeTighten++;\n    }\n  }\n\n  psdata->forceupdate |= (MYBOOL) (iBoundTighten > 0);\n  (*nBoundTighten) += iBoundTighten+iRangeTighten;\n  (*nSum)          += iBoundTighten+iRangeTighten;\n\n  return( status );\n}\n\nSTATIC int presolve_rows(presolverec *psdata, int *nCoeffChanged, int *nConRemove, int *nVarFixed, int *nBoundTighten, int *nSum)\n{\n  lprec    *lp = psdata->lp;\n  MYBOOL   candelete;\n  int      iCoeffChanged = 0, iConRemove = 0, iVarFixed = 0, iBoundTighten = 0,\n           status = RUNNING, i,ix, j,jx, item;\n  REAL     Value1, Value2, losum, upsum, lorhs, uprhs, epsvalue = psdata->epsvalue;\n  MATrec   *mat = lp->matA;\n\n  for(i = lastActiveLink(psdata->rows->varmap); (i > 0) && (status == RUNNING); ) {\n\n    candelete = FALSE;\n\n   /* First identify any full row infeasibilities\n      Note: Handle singletons below to ensure that conflicting multiple singleton\n            rows with this variable do not provoke notice of infeasibility */\n    j = presolve_rowlengthex(psdata, i);\n    if((j > 1) &&\n       !psdata->forceupdate && !presolve_rowfeasible(psdata, i, FALSE)) {\n      status = presolve_setstatus(psdata, INFEASIBLE);\n      break;\n    }\n    presolve_range(lp, i, psdata->rows, &losum, &upsum);\n    lorhs = get_rh_lower(lp, i);\n    uprhs = get_rh_upper(lp, i);\n#ifdef Paranoia\n    if((losum>uprhs+epsvalue) || (upsum<lorhs-epsvalue)) {\n      status = presolve_setstatus(psdata, INFEASIBLE);\n      break;\n    }\n#endif\n\n    /* Delete empty rows */\n    if(j == 0)\n      candelete = TRUE;\n    else\n\n    /* Convert non-fixed row singletons to bounds */\n#if 0  /* Version that deletes bound-fixed columns in presolve_columns() */\n    if((j == 1) && (upsum-losum >= -epsvalue)) {\n#else  /* Version that deletes bound-fixed columns here */\n    if((j == 1) && (uprhs-lorhs >= -epsvalue)) {\n#endif\n      item = 0;\n      jx = presolve_nextcol(psdata, i, &item);\n      j = ROW_MAT_COLNR(jx);\n\n      /* Make sure we don't have conflicting other singleton rows with this variable */\n      Value1 = lp->infinite;\n      Value2 = -Value1;\n      if(presolve_collength(psdata, j) > 1)\n        status = presolve_boundconflict(psdata, i, j);\n      else if(is_constr_type(lp, i, EQ)) {\n        Value2 = ROW_MAT_VALUE(jx);\n        Value1 = lp->orig_rhs[i] / Value2;\n        if(Value2 < 0)\n          swapREAL(&losum, &upsum);\n        if((Value1 < losum / my_if(my_infinite(lp, losum), my_sign(Value2), Value2) - epsvalue) ||\n           (Value1 > upsum / my_if(my_infinite(lp, upsum), my_sign(Value2), Value2) + epsvalue))\n          status = presolve_setstatus(psdata, INFEASIBLE);\n        Value2 = Value1;\n      }\n\n      /* Proceed to fix and remove variable (if it is not a SOS member) */\n      if(status == RUNNING) {\n        if((fabs(Value2-Value1) < epsvalue) && (fabs(Value2) > epsvalue)) {\n          MYBOOL isSOS     = (MYBOOL) (SOS_is_member(lp->SOS, 0, j) != FALSE),\n                 deleteSOS = isSOS && presolve_candeletevar(psdata, j);\n          if((Value1 != 0) && deleteSOS) {\n            if(!presolve_fixSOS1(psdata, j, Value1, &iConRemove, &iVarFixed))\n              status = presolve_setstatus(psdata, INFEASIBLE);\n              psdata->forceupdate = TRUE;\n          }\n          else {\n            if(!presolve_colfix(psdata, j, Value1, (MYBOOL) !isSOS, NULL))\n              status = presolve_setstatus(psdata, INFEASIBLE);\n            else if(isSOS && !deleteSOS)\n              iBoundTighten++;\n            else {\n              presolve_colremove(psdata, j, TRUE);\n              iVarFixed++;\n            }\n          }\n        }\n        else\n          status = presolve_colsingleton(psdata, i, j, &iBoundTighten);\n      }\n      if(status == INFEASIBLE) {\n        break;\n      }\n      if(psdata->forceupdate != AUTOMATIC) {\n        /* Store dual recovery information and code for deletion */\n        presolve_storeDualUndo(psdata, i, j);\n        candelete = TRUE;\n      }\n    }\n\n    /* Delete non-empty rows and variables that are completely determined at zero */\n    else if((j > 0)                            /* Only examine non-empty rows, */\n       && (fabs(lp->orig_rhs[i]) < epsvalue)   /* .. and the current RHS is zero, */\n       && ((psdata->rows->plucount[i] == 0) ||\n           (psdata->rows->negcount[i] == 0))   /* .. and the parameter signs are all equal, */\n       && (psdata->rows->pluneg[i] == 0)       /* .. and no (quasi) free variables, */\n       && (is_constr_type(lp, i, EQ)\n#ifdef FindImpliedEqualities\n           || (fabs(lorhs-upsum) < epsvalue)   /* Convert to equalities */\n           || (fabs(uprhs-losum) < epsvalue)   /* Convert to equalities */\n#endif\n          )\n          ) {\n\n      /* Delete the columns we can delete */\n      status = presolve_rowfixzero(psdata, i, &iVarFixed);\n\n      /* Then delete the row, which is redundant */\n      if(status == RUNNING)\n        candelete = TRUE;\n    }\n\n\n    /* Check if we have a constraint made redundant through bounds on individual\n       variables; such constraints are often referred to as \"forcing constraints\" */\n    else if((losum >= lorhs-epsvalue) &&\n             (upsum <= uprhs+epsvalue)) {\n\n      /* Check if we can also fix all the variables */\n      if(fabs(losum-upsum) < epsvalue) {\n        item = 0;\n        jx = presolve_nextcol(psdata, i, &item);\n        while((status == RUNNING) && (jx >= 0)) {\n          j = ROW_MAT_COLNR(jx);\n          Value1 = get_lowbo(lp, j);\n          if(presolve_colfix(psdata, j, Value1, TRUE, &iVarFixed)) {\n            presolve_colremove(psdata, j, TRUE);\n            iVarFixed++;\n            jx = presolve_nextcol(psdata, i, &item);\n          }\n          else\n            status = presolve_setstatus(psdata, INFEASIBLE);\n        }\n      }\n      candelete = TRUE;\n    }\n\n    /* Get next row and do the deletion of the previous, if indicated */\n    ix = i;\n    i = prevActiveLink(psdata->rows->varmap, i);\n    if(candelete) {\n      presolve_rowremove(psdata, ix, TRUE);\n      iConRemove++;\n    }\n  }\n\n  /* Remove any \"hanging\" empty row and columns */\n  if(status == RUNNING)\n    status = presolve_shrink(psdata, &iConRemove, &iVarFixed);\n\n  (*nCoeffChanged) += iCoeffChanged;\n  (*nConRemove)    += iConRemove;\n  (*nVarFixed)     += iVarFixed;\n  (*nBoundTighten) += iBoundTighten;\n  (*nSum)          += iCoeffChanged+iConRemove+iVarFixed+iBoundTighten;\n\n  return( status );\n}\n\n/* Top level presolve routine */\nSTATIC int presolve(lprec *lp)\n{\n  int    status = RUNNING,\n         i, j = 0, jx = 0, jjx = 0, k, oSum,\n         iCoeffChanged = 0, iConRemove = 0, iVarFixed = 0, iBoundTighten = 0, iSOS = 0, iSum = 0,\n         nCoeffChanged = 0, nConRemove = 0, nVarFixed = 0, nBoundTighten = 0, nSOS = 0, nSum = 0;\n  REAL   Value1, Value2, initrhs0 = lp->orig_rhs[0];\n  presolverec *psdata = NULL;\n  MATrec *mat = lp->matA;\n\n#if 0\n  lp->do_presolve     = PRESOLVE_ROWS;\n  report(lp, IMPORTANT, \"presolve: Debug override of presolve setting to %d\\n\", lp->do_presolve);\n#endif\n\n /* Lock the variable mapping arrays and counts ahead of any row/column\n    deletion or creation in the course of presolve, solvelp or postsolve */\n  if(!lp->varmap_locked)\n    varmap_lock(lp);\n\n /* Check if we have already done presolve */\n  mat_validate(mat);\n  if(lp->wasPresolved) {\n    if(SOS_count(lp) > 0) {\n      SOS_member_updatemap(lp->SOS);\n      make_SOSchain(lp, (MYBOOL) ((lp->do_presolve & PRESOLVE_LASTMASKMODE) != PRESOLVE_NONE));\n    }\n    if((lp->solvecount > 1) && (lp->bb_level < 1) &&\n       ((lp->scalemode & SCALE_DYNUPDATE) != 0))\n      auto_scale(lp);\n    if(!lp->basis_valid) {\n      crash_basis(lp);\n      report(lp, DETAILED, \"presolve: Had to repair broken basis.\\n\");\n    }\n    lp->timepresolved = timeNow();\n    return(status);\n  }\n\n  /* Produce original model statistics (do hoops to produce correct stats if we have SOS'es) */\n  i = SOS_count(lp);\n  if(i > 0) {\n    SOS_member_updatemap(lp->SOS);\n    lp->sos_vars = SOS_memberships(lp->SOS, 0);\n  }\n  REPORT_modelinfo(lp, TRUE, \"SUBMITTED\");\n  report(lp, NORMAL, \" \\n\");\n  if(i > 0)\n    lp->sos_vars = 0;\n\n  /* Finalize basis indicators; if no basis was created earlier via\n     set_basis or crash_basis then simply set the default basis. */\n  if(!lp->basis_valid)\n    lp->var_basic[0] = AUTOMATIC; /* Flag that we are presolving */\n\n#if 0\nwrite_lp(lp, \"test_in.lp\");    /* Write to lp-formatted file for debugging */\n/*write_mps(lp, \"test_in.mps\");*/  /* Write to lp-formatted file for debugging */\n#endif\n\n  /* Update inf norms and check for potential factorization trouble */\n  mat_computemax(mat /*, FALSE */);\n#if 0\n  Value1 = fabs(lp->negrange);\n  if(is_obj_in_basis(lp) && (mat->dynrange < Value1) && vec_computeext(lp->orig_obj, 1, lp->columns, TRUE, &i, &j)) {\n\n    /* Compute relative scale metric */\n    Value2 = fabs(lp->orig_obj[j]/lp->orig_obj[i]) / mat->dynrange;\n    if(Value2 < 1.0)\n      Value2 = 1.0 / Value2;\n\n    /* Determine if we should alert modeler and possibly move the OF out of the coefficient matrix */\n    if((Value2 > Value1)           /* Case with extreme scale difference */\n#if 1\n        || (mat->dynrange == 1.0)  /* Case where we have an all-unit coefficient matrix, possibly totally unimodular */\n#endif\n      )\n      if((lp->simplex_strategy & SIMPLEX_DYNAMIC) > 0) {\n        clear_action(&lp->algopt, ALGOPT_OBJINBASIS);\n        report(lp, NORMAL, \"Moved objective function out of the basis matrix to enhance factorization accuracy.\\n\");\n      }\n      else if(mat->dynrange > 1.0)\n        report(lp, IMPORTANT, \"Warning: Objective/matrix coefficient magnitude differences will cause inaccuracy!\\n\");\n  }\n#endif\n\n  /* Do traditional simple presolve */\n  yieldformessages(lp);\n  if((lp->do_presolve & PRESOLVE_LASTMASKMODE) == PRESOLVE_NONE) {\n    mat_checkcounts(mat, NULL, NULL, TRUE);\n    i = 0;\n  }\n  else {\n\n    if(lp->full_solution == NULL)\n      allocREAL(lp, &lp->full_solution, lp->sum_alloc+1, TRUE);\n\n    /* Identify infeasible SOS'es prior to any pruning */\n    j = 0;\n    for(i = 1; i <= SOS_count(lp); i++) {\n      k = SOS_infeasible(lp->SOS, i);\n      if(k > 0) {\n        presolverec psdata;\n\n        psdata.lp = lp;\n        report(lp, NORMAL, \"presolve: Found SOS %d (type %d) to be range-infeasible on variable %d\\n\",\n                            i, SOS_get_type(lp->SOS, i), k);\n        status = presolve_setstatus(&psdata, INFEASIBLE);\n        j++;\n      }\n    }\n    if(j > 0)\n      goto Finish;\n\n    /* Create and initialize the presolve data structures */\n    psdata = presolve_init(lp);\n\n    /* Reentry point for the outermost, computationally expensive presolve loop */\n    psdata->outerloops = 0;\n    do {\n      psdata->outerloops++;\n      iCoeffChanged = 0;\n      iConRemove    = 0;\n      iVarFixed     = 0;\n      iBoundTighten = 0;\n      iSOS          = 0;\n      oSum          = nSum;\n\n      /* Do the middle elimination loop */\n      do {\n        psdata->middleloops++;\n        nSum += iSum;\n        iSum = 0;\n\n        /* Accumulate constraint bounds based on bounds on individual variables. */\n        j = 0;\n        while(presolve_statuscheck(psdata, &status) && psdata->forceupdate) {\n          psdata->forceupdate = FALSE;\n          /* Update sums, but limit iteration count to avoid possible\n            \"endless\" loops with only marginal bound improvements */\n          if(presolve_updatesums(psdata) && (j < MAX_PSBOUNDTIGHTENLOOPS)) {\n            /* Do row preparation useful for subsequent column and row presolve operations */\n            if((psdata->outerloops == 1) && (psdata->middleloops == 1))\n              status = presolve_preparerows(psdata, &iBoundTighten, &iSum);\n            nBoundTighten += iBoundTighten;\n            iBoundTighten  = 0;\n            nSum          += iSum;\n            iSum           = 0;\n            j++;\n            if(status != RUNNING)\n              report(lp, NORMAL, \"presolve: Break after bound tightening iteration %d.\\n\", j);\n          }\n        }\n        if(status != RUNNING)\n          break;\n\n        /* Do the relatively cheap innermost elimination loop */\n        do {\n\n          psdata->innerloops++;\n          nSum += iSum;\n          iSum = 0;\n\n          /* Eliminate empty rows, convert row singletons to bounds,\n            tighten bounds, and remove always satisfied rows */\n          if(presolve_statuscheck(psdata, &status) &&\n             is_presolve(lp, PRESOLVE_ROWS))\n            status = presolve_rows(psdata, &iCoeffChanged, &iConRemove, &iVarFixed, &iBoundTighten, &iSum);\n\n          /* Eliminate empty or fixed columns (including trivial OF column singletons) */\n          if(presolve_statuscheck(psdata, &status) &&\n             is_presolve(lp, PRESOLVE_COLS))\n            status = presolve_columns(psdata, &iCoeffChanged, &iConRemove, &iVarFixed, &iBoundTighten, &iSum);\n\n          /* Presolve SOS'es if possible (always do this) */\n          if(presolve_statuscheck(psdata, &status))\n            status = presolve_redundantSOS(psdata, &iBoundTighten, &iSum);\n\n        } while((status == RUNNING) && (iSum > 0));\n        if(status != RUNNING)\n          break;\n\n        /* Merge compatible similar rows; loop backwards over every row */\n        if(presolve_statuscheck(psdata, &status) &&\n           (psdata->outerloops == 1) && (psdata->middleloops <= MAX_PSMERGELOOPS) &&\n           is_presolve(lp, PRESOLVE_MERGEROWS))\n          status = presolve_mergerows(psdata, &iConRemove, &iSum);\n\n        /* Eliminate dominated rows */\n        if(presolve_statuscheck(psdata, &status) &&\n           is_presolve(lp, PRESOLVE_ROWDOMINATE))\n          presolve_rowdominance(psdata, &iCoeffChanged, &iConRemove, &iVarFixed, &iSum);\n\n        /* See if we can convert some constraints to SOSes (only SOS1 handled) */\n        if(presolve_statuscheck(psdata, &status) && (MIP_count(lp) > 0) &&\n           is_presolve(lp, PRESOLVE_SOS))\n          status = presolve_SOS1(psdata, &iCoeffChanged, &iConRemove, &iVarFixed, &iSOS, &iSum);\n\n        /* Eliminate dominated columns in set coverage models */\n        if(presolve_statuscheck(psdata, &status) && (lp->int_vars > 1) &&\n           is_presolve(lp, PRESOLVE_COLDOMINATE))\n          presolve_coldominance01(psdata, &iConRemove, &iVarFixed, &iSum);\n\n        /* Aggregate compatible columns */\n        if(presolve_statuscheck(psdata, &status) && /*TRUE ||*/\n           is_presolve(lp, PRESOLVE_AGGREGATE))\n          presolve_aggregate(psdata, &iConRemove, &iVarFixed, &iSum);\n\n        /* Eliminate free variables and implied slacks */\n        if(presolve_statuscheck(psdata, &status) &&\n/*           !is_presolve(lp, PRESOLVE_ELIMEQ2) && */\n           is_presolve(lp, PRESOLVE_IMPLIEDSLK | PRESOLVE_IMPLIEDFREE))\n          status = presolve_freeandslacks(psdata, &iCoeffChanged, &iConRemove, &iVarFixed, &iSum);\n\n      } while((status == RUNNING) && (iSum > 0));\n      if(status != RUNNING)\n        break;\n\n      /* Check if we can do elimination of rank-deficient equality constraints */\n      if(presolve_statuscheck(psdata, &status) && (psdata->EQmap->count > 1) &&\n         is_presolve(lp, PRESOLVE_LINDEP)) {\n#if 0\n        REPORT_mat_mmsave(lp, \"A.mtx\", NULL, FALSE, \"Constraint matrix A\");\n#endif\n        presolve_singularities(psdata, &iCoeffChanged, &iConRemove, &iVarFixed, &iSum);\n      }\n\n      /* Eliminate variable and tighten bounds using 2-element EQs;\n        note that this involves modifying the coefficients of A and\n        can therefore be a slow operation. */\n      if(presolve_statuscheck(psdata, &status) &&\n         is_presolve(lp, PRESOLVE_ELIMEQ2)) {\n        jjx = 0;\n        do {\n          jjx += iSum;\n          status = presolve_elimeq2(psdata, &iCoeffChanged, &iConRemove, &iVarFixed, &iSum);\n        } while((status == RUNNING) && (iSum > jjx));\n        iSum = jjx;\n\n#if 0\n        /* Eliminate free variables and implied slacks */\n        if(presolve_statuscheck(psdata, &status) &&\n           is_presolve(lp, PRESOLVE_IMPLIEDSLK | PRESOLVE_IMPLIEDFREE))\n          status = presolve_freeandslacks(psdata, &iCoeffChanged, &iConRemove, &iVarFixed, &iSum);\n#endif\n      }\n\n      /* Increase A matrix sparsity by discovering common subsets using EQs */\n      if(presolve_statuscheck(psdata, &status) && (psdata->EQmap->count > 0) &&\n         is_presolve(lp, PRESOLVE_SPARSER))\n        status = presolve_makesparser(psdata, &iCoeffChanged, &iConRemove, &iVarFixed, &iSum);\n\n      /* Do GCD-based coefficient reductions (also does row scaling,\n        even if no rhs INT truncations are possible) */\n      if(presolve_statuscheck(psdata, &status) && (psdata->INTmap->count > 0) &&\n         is_presolve(lp, PRESOLVE_REDUCEGCD))\n        if(!presolve_reduceGCD(psdata, &iCoeffChanged, &iBoundTighten, &iSum))\n          status = presolve_setstatus(psdata, INFEASIBLE);\n\n      /* Simplify knapsack or set coverage models where OF coefficients are\n        duplicated in the constraints.  At the cost of adding helper columns, this\n        increases sparsity and facilitates identification of lower and upper bounds. */\n      if(presolve_statuscheck(psdata, &status) &&\n          is_presolve(lp, PRESOLVE_KNAPSACK)) {\n        i = iCoeffChanged;\n        status = presolve_knapsack(psdata, &iCoeffChanged);\n      }\n\n      /* Remove any \"hanging\" empty row and columns */\n      if(status == RUNNING)\n        status = presolve_shrink(psdata, &iConRemove, &iVarFixed);\n\n      nCoeffChanged += iCoeffChanged;\n      nConRemove    += iConRemove;\n      nVarFixed     += iVarFixed;\n      nBoundTighten += iBoundTighten;\n      nSOS          += iSOS;\n      nSum          += iSum;\n\n      iSum           = iConRemove + iVarFixed + iBoundTighten + iCoeffChanged;\n      if(iSum > 0)\n        report(lp, NORMAL, \"Presolve O:%d -> Reduced rows:%5d, cols:%5d --- changed bnds:%5d, Ab:%5d.\\n\",\n                           psdata->outerloops, iConRemove, iVarFixed, iBoundTighten, iCoeffChanged);\n\n   /* Do the outermost loop again if we were successful in this presolve sequences */\n    } while(presolve_statuscheck(psdata, &status) &&\n           (psdata->forceupdate || (oSum < nSum)) &&\n           (psdata->outerloops < get_presolveloops(lp)) &&\n           (psdata->rows->varmap->count+psdata->cols->varmap->count > 0));\n\n   /* Finalize presolve */\n#ifdef Paranoia\n    i = presolve_debugcheck(lp, psdata->rows->varmap, psdata->cols->varmap);\n    if(i > 0)\n      report(lp, SEVERE, \"presolve: %d internal consistency failure%s\\n\", i, my_plural_std(i));\n    if((SOS_count(lp) > 0) && !presolve_SOScheck(psdata))\n      report(lp, SEVERE, \"presolve: SOS sparse member mapping problem - part 1\\n\");\n#endif\n    /* Perform bound relaxation to reduce chance of degeneracy. */\n    if((status == RUNNING) && !is_presolve(lp, PRESOLVE_IMPLIEDFREE))\n      jjx = presolve_makefree(psdata);\n    else\n      jjx = 0;\n\n\n    /* Finalize the presolve */\n    if(!presolve_finalize(psdata))\n      report(lp, SEVERE, \"presolve: Unable to construct internal data representation\\n\");\n\n   /* Report summary information */\n    i = NORMAL;\n    iVarFixed  = lp->presolve_undo->orig_columns - psdata->cols->varmap->count;\n    iConRemove = lp->presolve_undo->orig_rows - psdata->rows->varmap->count;\n    if(nSum > 0)\n      report(lp, i, \"PRESOLVE             Elimination loops performed.......... O%d:M%d:I%d\\n\",\n                                  psdata->outerloops, psdata->middleloops, psdata->innerloops);\n    if(nVarFixed)\n      report(lp, i, \"            %8d empty or fixed variables............. %s.\\n\", nVarFixed, \"REMOVED\");\n    if(nConRemove)\n      report(lp, i, \"            %8d empty or redundant constraints....... %s.\\n\", nConRemove, \"REMOVED\");\n    if(nBoundTighten)\n      report(lp, i, \"            %8d bounds............................... %s.\\n\", nBoundTighten, \"TIGHTENED\");\n    if(nCoeffChanged)\n      report(lp, i, \"            %8d matrix coefficients.................. %s.\\n\", nCoeffChanged, \"CHANGED\");\n    if(jjx > 0)\n      report(lp, i, \"            %8d variables' final bounds.............. %s.\\n\", jjx, \"RELAXED\");\n    if(nSOS)\n      report(lp, i, \"            %8d constraints detected as SOS1......... %s.\\n\", nSOS, \"CONVERTED\");\n\n    /* Report optimality or infeasibility */\n    if(status == UNBOUNDED)\n      report(lp, NORMAL, \"%20s Solution status detected............. %s.\\n\", \"\", \"UNBOUNDED\");\n    else if(status == INFEASIBLE)\n      report(lp, NORMAL, \"%20s Solution status detected............. %s.\\n\", \"\", \"INFEASIBLE\");\n    else {\n      if(psdata->cols->varmap->count == 0)\n        Value1 = Value2 = lp->presolve_undo->fixed_rhs[0] -initrhs0;\n      else\n        presolve_rangeorig(lp, 0, psdata->rows, &Value1, &Value2, -initrhs0);\n      if((fabs(Value1 - Value2) < psdata->epsvalue) || (fabs(my_reldiff(Value1, Value2)) < psdata->epsvalue)) {\n        if((lp->rows == 0) && (lp->columns == 0)) {\n          status = PRESOLVED;\n          Value1 = my_chsign(is_maxim(lp), Value1);\n          lp->solution[0] = Value1;\n          lp->best_solution[0] = Value1;\n          lp->full_solution[0] = Value1;\n        }\n        report(lp, NORMAL, \"%20s OPTIMAL solution found............... %-g\", \"\", Value1);\n      }\n      else if((status == RUNNING) && (i >= NORMAL)) {\n        char lonum[20], upnum[20];\n        if(my_infinite(lp, Value1))\n          sprintf(lonum, \"%13s\", \"-Inf\");\n        else\n          sprintf(lonum, \"%+12g\", Value1);\n        if(my_infinite(lp, Value2))\n          sprintf(upnum, \"%-13s\", \"Inf\");\n        else\n          sprintf(upnum, \"%+-12g\", Value2);\n        report(lp, i,    \"%20s [ %s < Z < %s ]\\n\", \"\", lonum, upnum);\n      }\n\n      /* Update values for dual limit and best heuristic values */\n      if((MIP_count(lp) > 0) || (get_Lrows(lp) > 0)) {\n        if(is_maxim(lp)) {\n          SETMAX(lp->bb_heuristicOF, Value1);\n          SETMIN(lp->bb_limitOF, Value2);\n        }\n        else {\n          SETMIN(lp->bb_heuristicOF, Value2);\n          SETMAX(lp->bb_limitOF, Value1);\n        }\n      }\n    }\n    report(lp, NORMAL, \" \\n\");\n\n    /* Clean up (but save counts of constraint types for display later) */\n    j = psdata->LTmap->count;\n    jx = psdata->EQmap->count;\n    jjx = lp->rows - j - jx;\n    presolve_free(&psdata);\n\n  }\n\n  /* Signal that we are done presolving */\n  if((lp->usermessage != NULL) &&\n     ((lp->do_presolve & PRESOLVE_LASTMASKMODE) != 0) && (lp->msgmask & MSG_PRESOLVE))\n     lp->usermessage(lp, lp->msghandle, MSG_PRESOLVE);\n\n  /* Create master SOS variable list */\n  if(SOS_count(lp) > 0) {\n    /*SOS_member_updatemap(lp->SOS); */\n    make_SOSchain(lp, (MYBOOL) ((lp->do_presolve & PRESOLVE_LASTMASKMODE) != PRESOLVE_NONE));\n  }\n\n  /* Finalize model not identified as infeasible or unbounded */\n  if(status == RUNNING) {\n\n    /* Resolve GUBs */\n    if(is_bb_mode(lp, NODE_GUBMODE))\n      identify_GUB(lp, TRUE);\n\n#if 0\n    /* Mark rows containing hidden identity matrices so that supporting factorization\n      engines can use this structural information to boost efficiency */\n    if(is_algopt(lp, ALGOPT_COMPACTBPF))\n      lp->bfpoptimize = (MYBOOL) (assist_factorization(lp, ROWTYPE_LOGICAL,\n                                                       &lp->rowset1, &lp->rowno1) > 0);\n#endif\n\n    /* Scale the model based on current settings */\n    auto_scale(lp);\n\n    /* Crash the basis, if specified */\n    crash_basis(lp);\n\n    /* Produce presolved model statistics */\n    if(nConRemove+nVarFixed+nBoundTighten+nVarFixed+nCoeffChanged > 0) {\n      REPORT_modelinfo(lp, FALSE, \"REDUCED\");\n      if(nSum > 0) {\n        report(lp, NORMAL, \"Row-types:   %7d LE,          %7d GE,             %7d EQ.\\n\",\n                           j, jjx, jx);\n        report(lp, NORMAL, \" \\n\");\n      }\n    }\n  }\n\n  /* Optionally produce data on constraint classes */\n  if(lp->verbose > NORMAL) {\n    report(lp, NORMAL, \" \\n\");\n    REPORT_constraintinfo(lp, \"CONSTRAINT CLASSES\");\n    report(lp, NORMAL, \" \\n\");\n  }\n\nFinish:\n  lp->wasPresolved  = TRUE;\n  lp->timepresolved = timeNow();\n\n#if 0\n/*  write_mps(lp, \"test_out.mps\"); */ /* Must put here due to variable name mapping */\n  write_lp(lp, \"test_out.lp\");   /* Must put here due to variable name mapping */\n#endif\n#if 0\n  REPORT_debugdump(lp, \"testint2.txt\", FALSE);\n#endif\n\n  return( status );\n\n}\n\nSTATIC MYBOOL postsolve(lprec *lp, int status)\n{\n  /* Verify solution */\n  if(lp->lag_status != RUNNING) {\n    int itemp;\n\n    if(status == PRESOLVED)\n      status = OPTIMAL;\n\n    if((status == OPTIMAL) || (status == SUBOPTIMAL)) {\n      itemp = check_solution(lp, lp->columns, lp->best_solution,\n                                 lp->orig_upbo, lp->orig_lowbo, lp->epssolution);\n      if((itemp != OPTIMAL) && (lp->spx_status == OPTIMAL))\n        lp->spx_status = itemp;\n      else if((itemp == OPTIMAL) && ((status == SUBOPTIMAL) || (lp->spx_status == PRESOLVED)))\n        lp->spx_status = status;\n    }\n    else if(status != PRESOLVED) {\n      report(lp, NORMAL, \"lp_solve unsuccessful after %.0f iter and a last best value of %g\\n\",\n             (double) get_total_iter(lp), lp->best_solution[0]);\n      if(lp->bb_totalnodes > 0)\n        report(lp, NORMAL, \"lp_solve explored %.0f nodes before termination\\n\",\n               (double) get_total_nodes(lp));\n    }\n    else\n      lp->spx_status = OPTIMAL;\n\n    /* Only rebuild primal solution here, since the dual is only computed on request */\n    presolve_rebuildUndo(lp, TRUE);\n  }\n\n  /* Check if we can clear the variable map */\n  if(varmap_canunlock(lp))\n    lp->varmap_locked = FALSE;\n#if 0\n  REPORT_mat_mmsave(lp, \"basis.mtx\", NULL, FALSE);  /* Write the current basis matrix (no OF) */\n#endif\n\n  return( TRUE );\n}\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_presolve.h",
    "content": "#ifndef HEADER_lp_presolve\n#define HEADER_lp_presolve\n\n#include \"lp_types.h\"\n#include \"lp_matrix.h\"\n\n/* -------------------------------------------------------------------------------------------- */\n/* Defines for various presolve options                                                         */\n/* -------------------------------------------------------------------------------------------- */\n\n#define MAX_PSMERGELOOPS                2                 /* Max loops to merge compatible constraints */\n#define MAX_PSLINDEPLOOPS               1   /* Max loops to detect linearly dependendent constraints */\n#define MAX_PSBOUNDTIGHTENLOOPS         5     /* Maximumn number of loops to allow bound tightenings */\n#define MIN_SOS1LENGTH                  4   /* Minimum length of a constraint for conversion to SOS1 */\n#if 1\n  #define PRESOLVE_EPSVALUE (0.1*lp->epsprimal)\n#else\n  #define PRESOLVE_EPSVALUE  lp->epsvalue\n#endif\n#define PRESOLVE_EPSPIVOT         1.0e-3        /* Looses robustness at values smaller than ~1.0e-3 */\n#define PRESOLVE_BOUNDSLACK           10                     /* Extra error recovery/tolerance margin */\n\n#define DoPresolveRounding              /* Use absolute and directed rounding (disable at own risk) */\n/*#define DoPresolveRelativeTest*/\n\n/*#define PresolveForceUpdateMax*/\n\n/*#define DualFeasibilityLogicEQ2*/              /* Add low-order feasibility/accuracy logic to elimEQ2 */\n#define DivisorIntegralityLogicEQ2                                   /* Always prefer integer divisors */\n#define FindImpliedEqualities                               /* Detect equalities (default is enabled) */\n#define Eq2Reldiff\n\n/*#define SavePresolveEliminated */        /* Enable to activate storage of eliminated matrix data */\n/*#define UseDualPresolve */                    /* Enable to use full dual information for presolve */\n\n\ntypedef struct _psrec\n{\n  LLrec *varmap;\n  int  **next;\n  int  *empty;\n  int  *plucount;\n  int  *negcount;\n  int  *pluneg;\n  int  *infcount;\n  REAL  *plulower;\n  REAL  *neglower;\n  REAL  *pluupper;\n  REAL  *negupper;\n  int  allocsize;\n} psrec;\n\ntypedef struct _presolverec\n{\n  psrec *rows;\n  psrec *cols;\n  LLrec *EQmap;\n  LLrec *LTmap;\n  LLrec *INTmap;\n  REAL  *pv_upbo;\n  REAL  *pv_lobo;\n  REAL  *dv_upbo;\n  REAL  *dv_lobo;\n  lprec *lp;\n  REAL  epsvalue;\n  REAL  epspivot;\n  int   innerloops;\n  int   middleloops;\n  int   outerloops;\n  int   nzdeleted;\n  MYBOOL forceupdate;\n} presolverec;\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* Put function headers here */\n\nSTATIC MYBOOL presolve_createUndo(lprec *lp);\nSTATIC MYBOOL presolve_rebuildUndo(lprec *lp, MYBOOL isprimal);\nSTATIC MYBOOL inc_presolve_space(lprec *lp, int delta, MYBOOL isrows);\nSTATIC MYBOOL presolve_setOrig(lprec *lp, int orig_rows, int orig_cols);\nSTATIC MYBOOL presolve_colfix(presolverec *psdata, int colnr, REAL newvalue, MYBOOL remove, int *tally);\nSTATIC MYBOOL presolve_fillUndo(lprec *lp, int orig_rows, int orig_cols, MYBOOL setOrig);\nSTATIC MYBOOL presolve_freeUndo(lprec *lp);\n\nSTATIC MYBOOL presolve_updatesums(presolverec *psdata);\n\nINLINE int presolve_nextrow(presolverec *psdata, int colnr, int *previtem);\nINLINE int presolve_nextcol(presolverec *psdata, int rownr, int *previtem);\n\nSTATIC presolverec *presolve_init(lprec *lp);\nSTATIC void presolve_free(presolverec **psdata);\nSTATIC int presolve_shrink(presolverec *psdata, int *nConRemove, int *nVarRemove);\nSTATIC void presolve_rowremove(presolverec *psdata, int rownr, MYBOOL allowcoldelete);\nSTATIC int presolve_colremove(presolverec *psdata, int colnr, MYBOOL allowrowdelete);\n\nSTATIC MYBOOL presolve_colfixdual(presolverec *psdata, int colnr, REAL *fixValue, int *status);\n\nINLINE int presolve_rowlength(presolverec *psdata, int rownr)\n{\n  int *items = psdata->rows->next[rownr];\n\n  if(items == NULL)\n    return( 0 );\n  else\n    return( items[0] );\n}\nINLINE int presolve_collength(presolverec *psdata, int colnr)\n{\n  int *items = psdata->cols->next[colnr];\n  if(items == NULL)\n    return( 0 );\n  else\n    return( items[0] );\n}\n\nSTATIC int presolve(lprec *lp);\nSTATIC MYBOOL postsolve(lprec *lp, int status);\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* HEADER_lp_presolve */\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_price.c",
    "content": "\n#include <string.h>\n#include \"commonlib.h\"\n#include \"lp_lib.h\"\n#include \"lp_report.h\"\n#include \"lp_pricePSE.h\"\n#include \"lp_price.h\"\n\n#if libBLAS > 0\n  #include \"myblas.h\"\n#endif\n\n#ifdef FORTIFY\n# include \"lp_fortify.h\"\n#endif\n\n/* Simplex pricing utility module - w/interface for lp_solve v5.0+\n   -------------------------------------------------------------------------\n    Author:        Kjell Eikland\n    Contact:       kjell.eikland@broadpark.no\n    License terms: LGPL.\n\n    Requires:      lp_lib.h, commonlib.h\n\n    Release notes:\n    v1.0.0  1 July 2004         Routines extracted from lp_lib.\n    v1.0.1 10 July 2004         Added comparison operators for determination\n                                of entering and leaving variables.\n                                Added routines for multiple and partial\n                                pricing and made corresponding changes to\n                                colprim and rowdual.\n    v1.0.2 20 August 2004       Implemented relative pivot size control in\n                                rowprim and rowdual.\n    v1.1.0 15 October 2004      Added dual long step logic.\n    v1.1.1 22 October 2004      Added bound sort order to variable selections.\n    v1.2.0 24 March 2005        Completed multiple pricing logic.\n   ------------------------------------------------------------------------- */\n\n\n/* Comparison operators for entering and leaving variables for both the primal and\n   dual simplexes.  The functions compare a candidate variable with an incumbent. */\nint CMP_CALLMODEL compareImprovementVar(const pricerec *current, const pricerec *candidate)\n{\n  register int   result = COMP_PREFERNONE;\n  register lprec *lp = current->lp;\n  register REAL  testvalue, margin = PREC_IMPROVEGAP;\n  int currentcolno, currentvarno = current->varno,\n      candidatecolno, candidatevarno = candidate->varno;\n  MYBOOL isdual = candidate->isdual;\n\n  if(isdual) {\n    candidatevarno = lp->var_basic[candidatevarno];\n    currentvarno   = lp->var_basic[currentvarno];\n  }\n  candidatecolno = candidatevarno - lp->rows;\n  currentcolno   = currentvarno - lp->rows;\n\n  /* Do pivot-based selection unless Bland's (first index) rule is active */\n  if(lp->_piv_rule_ != PRICER_FIRSTINDEX) {\n\n    MYBOOL candbetter;\n\n    /* Find the largest value - normalize in case of the dual, since\n       constraint violation is expressed as a negative number. */\n    /* Use absolute test for \"small numbers\", relative otherwise */\n    testvalue = candidate->pivot;\n    if(fabs(testvalue) < LIMIT_ABS_REL)\n      testvalue -= current->pivot;\n    else\n      testvalue = my_reldiff(testvalue, current->pivot);\n    if(isdual)\n      testvalue = -testvalue;\n\n    candbetter = (MYBOOL) (testvalue > 0);\n    if(candbetter) {\n      if(testvalue > margin)\n        result = COMP_PREFERCANDIDATE;\n    }\n#if 0 /* Give more opportunity to optimize on non-primary criteria */\n    else if (testvalue < -margin)\n#else /* Give reduced opportunity to optimize on non-primary criteria */\n    else if (testvalue < -lp->epsvalue)\n#endif\n      result = COMP_PREFERINCUMBENT;\n\n#ifdef UseSortOnBound\n      /* Extra selection criterion based on the variable's range;\n        variable with - DUAL: small bound out; PRIMAL: large bound in */\n    if(result == COMP_PREFERNONE) {\n      testvalue = lp->upbo[candidatevarno] - lp->upbo[currentvarno];\n      if(testvalue < -margin)\n        result = COMP_PREFERINCUMBENT;\n      else if(testvalue > margin)\n        result = COMP_PREFERCANDIDATE;\n      result = my_chsign(isdual, result);\n    }\n#endif\n\n#ifdef UseSortOnColumnLength\n    /* Prevent long columns from entering the basis */\n    if(result == COMP_PREFERNONE) {\n      if(candidatecolno > 0)\n        testvalue = mat_collength(lp->matA, candidatecolno) +\n                    (is_obj_in_basis(lp) && (lp->obj[candidatecolno] != 0) ? 1 : 0);\n      else\n        testvalue = 1;\n      if(currentcolno > 0)\n        testvalue -= mat_collength(lp->matA, currentcolno) +\n                     (is_obj_in_basis(lp) && (lp->obj[currentcolno] != 0) ? 1 : 0);\n      else\n        testvalue -= 1;\n      if(testvalue > 0)\n        result = COMP_PREFERINCUMBENT;\n      else if(testvalue < 0)\n        result = COMP_PREFERCANDIDATE;\n      result = my_chsign(isdual, result);\n    }\n#endif\n\n    /* Select absolute best if the non-primary criteria failed to separate */\n    if((result == COMP_PREFERNONE) && candbetter) {\n      result = COMP_PREFERCANDIDATE;\n      goto Finish;\n    }\n  }\n\n  /* Final tie-breakers */\n  if(result == COMP_PREFERNONE) {\n\n    /* Add randomization tie-braker */\n    if(lp->piv_strategy & PRICE_RANDOMIZE) {\n      result = my_sign(PRICER_RANDFACT - rand_uniform(lp, 1.0));\n      if(candidatevarno < currentvarno)\n        result = -result;\n    }\n\n    /* Resolve ties via index ordinal */\n    if(result == COMP_PREFERNONE) {\n      if(candidatevarno < currentvarno)\n        result = COMP_PREFERCANDIDATE;\n      else /* if(candidatevarno > currentvarno) */\n        result = COMP_PREFERINCUMBENT;\n      if(lp->_piv_left_)\n        result = -result;\n    }\n  }\n\nFinish:\n  return( result );\n\n}\n\nint CMP_CALLMODEL compareSubstitutionVar(const pricerec *current, const pricerec *candidate)\n{\n  register int    result = COMP_PREFERNONE;\n  register lprec  *lp = current->lp;\n  register REAL   testvalue = candidate->theta,\n                  margin = current->theta;\n  MYBOOL isdual = candidate->isdual, candbetter;\n  int    currentcolno, currentvarno = current->varno,\n         candidatecolno, candidatevarno = candidate->varno;\n\n  if(!isdual) {\n    candidatevarno = lp->var_basic[candidatevarno];\n    currentvarno   = lp->var_basic[currentvarno];\n  }\n  candidatecolno = candidatevarno - lp->rows;\n  currentcolno   = currentvarno - lp->rows;\n\n  /* Compute the ranking test metric. */\n  if(isdual) {\n    testvalue = fabs(testvalue);\n    margin    = fabs(margin);\n  }\n\n  /* Use absolute test for \"small numbers\", relative otherwise */\n  if(fabs(testvalue) < LIMIT_ABS_REL)\n    testvalue -= margin;\n  else\n    testvalue = my_reldiff(testvalue, margin);\n\n  /* Find if the new Theta is smaller or near equal (i.e. testvalue <= eps)\n     compared to the previous best; ties will be broken by pivot size or index\n     NB! The margin below is essential in maintaining primal/dual feasibility\n         during the primal/dual simplex, respectively.  Sometimes a small\n         value prevents the selection of a suitable pivot, thereby weakening\n         the numerical stability of some models */\n  margin = PREC_SUBSTFEASGAP;\n  candbetter = (MYBOOL) (testvalue < 0);\n  if(candbetter) {\n    if(testvalue < -margin)\n      result = COMP_PREFERCANDIDATE;\n  }\n  else if(testvalue > margin)\n    result = COMP_PREFERINCUMBENT;\n\n  /* Resolve a tie */\n  if(result == COMP_PREFERNONE) {\n    REAL currentpivot = fabs(current->pivot),\n         candidatepivot = fabs(candidate->pivot);\n\n    /* Handle first index / Bland's rule specially */\n    if(lp->_piv_rule_ == PRICER_FIRSTINDEX) {\n#if 1\n      /* Special secondary selection by pivot size (limited stability protection) */\n      margin = candidate->epspivot;\n      if((candidatepivot >= margin) && (currentpivot < margin))\n        result = COMP_PREFERCANDIDATE;\n#endif\n    }\n\n    else {\n\n      /* General secondary selection based on pivot size */\n#if 0\n      if(candidatepivot > MIN_STABLEPIVOT)\n        testvalue = my_reldiff(testvalue, currentpivot);\n      else\n#endif\n        testvalue = candidatepivot - currentpivot;\n      if(testvalue > margin)\n        result = COMP_PREFERCANDIDATE;\n      else if(testvalue < -margin)\n        result = COMP_PREFERINCUMBENT;\n\n#ifdef UseSortOnBound\n      /* Extra selection criterion based on the variable's range;\n        variable with - PRIMAL: small bound out; DUAL: large bound in */\n      if(result == COMP_PREFERNONE) {\n        testvalue = lp->upbo[candidatevarno] - lp->upbo[currentvarno];\n        if(testvalue < -margin)\n          result = COMP_PREFERCANDIDATE;\n        else if(testvalue > margin)\n          result = COMP_PREFERINCUMBENT;\n        result = my_chsign(isdual, result);\n      }\n#endif\n\n#ifdef UseSortOnColumnLength\n      /* Prevent long columns from entering the basis */\n      if(result == COMP_PREFERNONE) {\n        if(candidatecolno > 0)\n          testvalue = mat_collength(lp->matA, candidatecolno) +\n                      (is_obj_in_basis(lp) && (lp->obj[candidatecolno] != 0) ? 1 : 0);\n        else\n          testvalue = 1;\n        if(currentcolno > 0)\n          testvalue -= mat_collength(lp->matA, currentcolno) +\n                       (is_obj_in_basis(lp) && (lp->obj[currentcolno] != 0) ? 1 : 0);\n        else\n          testvalue -= 1;\n        if(testvalue > 0)\n          result = COMP_PREFERCANDIDATE;\n        else if(testvalue < 0)\n          result = COMP_PREFERINCUMBENT;\n        result = my_chsign(isdual, result);\n      }\n#endif\n\n    }\n  }\n\n  /* Select absolute best if the non-primary criteria failed to separate */\n  if((result == COMP_PREFERNONE) && candbetter) {\n    result = COMP_PREFERCANDIDATE;\n    goto Finish;\n  }\n\n  /* Final tie-breakers */\n  if(result == COMP_PREFERNONE) {\n\n    /* Add randomization tie-braker */\n    if(lp->piv_strategy & PRICE_RANDOMIZE) {\n      result = my_sign(PRICER_RANDFACT - rand_uniform(lp, 1.0));\n      if(candidatevarno < currentvarno)\n        result = -result;\n    }\n\n    /* Resolve ties via index ordinal (also prefers slacks over user variables) */\n    if(result == COMP_PREFERNONE) {\n      if(candidatevarno < currentvarno)\n        result = COMP_PREFERCANDIDATE;\n      else /* if(candidatevarno > currentvarno) */\n        result = COMP_PREFERINCUMBENT;\n      if(lp->_piv_left_)\n        result = -result;\n    }\n  }\n\nFinish:\n  return( result );\n}\nint CMP_CALLMODEL compareBoundFlipVar(const pricerec *current, const pricerec *candidate)\n{\n  register REAL  testvalue, margin;\n  register int   result = COMP_PREFERNONE;\n  register lprec *lp = current->lp;\n  MYBOOL    candbetter;\n  int currentvarno = current->varno,\n      candidatevarno = candidate->varno;\n\n  if(!current->isdual) {\n    candidatevarno = lp->var_basic[candidatevarno];\n    currentvarno   = lp->var_basic[currentvarno];\n  }\n\n  /* Compute the ranking test metric. */\n  testvalue = candidate->theta;\n  margin    = current->theta;\n  if(candidate->isdual) {\n    testvalue = fabs(testvalue);\n    margin    = fabs(margin);\n  }\n  if(fabs(margin) < LIMIT_ABS_REL)\n    testvalue -= margin;\n  else\n    testvalue = my_reldiff(testvalue, margin);\n\n  /* Find if the new Theta is smaller or near equal (i.e. testvalue <= eps)\n     compared to the previous best; ties will be broken by pivot size or index */\n  margin = PREC_SUBSTFEASGAP;\n  candbetter = (MYBOOL) (testvalue < 0);\n  if(candbetter) {\n    if(testvalue < -margin)\n      result = COMP_PREFERCANDIDATE;\n  }\n  else if(testvalue > margin)\n    result = COMP_PREFERINCUMBENT;\n\n  /* Resolve a tie */\n  if(result == COMP_PREFERNONE) {\n\n    /* Tertiary selection based on priority for large pivot sizes */\n    if(result == COMP_PREFERNONE) {\n      REAL currentpivot   = fabs(current->pivot),\n           candidatepivot = fabs(candidate->pivot);\n      if(candidatepivot > currentpivot+margin)\n        result = COMP_PREFERCANDIDATE;\n      else if(candidatepivot < currentpivot-margin)\n        result = COMP_PREFERINCUMBENT;\n    }\n\n    /* Secondary selection based on priority for narrow-bounded variables */\n    if(result == COMP_PREFERNONE)\n      result = compareREAL(&(lp->upbo[currentvarno]),\n                           &(lp->upbo[candidatevarno]));\n\n  }\n\n  /* Select absolute best if the non-primary criteria failed to separate */\n  if((result == COMP_PREFERNONE) && candbetter) {\n    result = COMP_PREFERCANDIDATE;\n    goto Finish;\n  }\n\n  /* Quaternary selection by index value */\n  if(result == COMP_PREFERNONE) {\n    if(candidatevarno < currentvarno)\n      result = COMP_PREFERCANDIDATE;\n    else\n      result = COMP_PREFERINCUMBENT;\n    if(lp->_piv_left_)\n      result = -result;\n  }\n\nFinish:\n  return( result );\n}\n\n/* Validity operators for entering and leaving columns for both the primal and dual\n   simplex.  All candidates must satisfy these tests to qualify to be allowed to be\n   a subject for the comparison functions/operators. */\nSTATIC MYBOOL validImprovementVar(pricerec *candidate)\n{\n  register REAL candidatepivot = fabs(candidate->pivot);\n\n#ifdef Paranoia\n  return( (MYBOOL) ((candidate->varno > 0) && (candidatepivot > candidate->lp->epsvalue)) );\n#else\n  return( (MYBOOL) (candidatepivot > candidate->lp->epsvalue) );\n#endif\n}\n\nSTATIC MYBOOL validSubstitutionVar(pricerec *candidate)\n{\n  register lprec *lp   = candidate->lp;\n  register REAL  theta = (candidate->isdual ? fabs(candidate->theta) : candidate->theta);\n\n#ifdef Paranoia\n  if(candidate->varno <= 0)\n    return( FALSE );\n  else\n#endif\n  if(fabs(candidate->pivot) >= lp->infinite)\n    return( (MYBOOL) (theta < lp->infinite) );\n  else\n    return( (MYBOOL) ((theta < lp->infinite) &&\n                      (fabs(candidate->pivot) >= candidate->epspivot)) );\n}\n\nint CMP_CALLMODEL compareImprovementQS(const UNIONTYPE QSORTrec *current, const UNIONTYPE QSORTrec *candidate)\n{\n  return( compareImprovementVar((pricerec *) current->pvoidint2.ptr, (pricerec *) candidate->pvoidint2.ptr) );\n}\nint CMP_CALLMODEL compareSubstitutionQS(const UNIONTYPE QSORTrec *current, const UNIONTYPE QSORTrec *candidate)\n{\n  return( compareBoundFlipVar((pricerec *) current->pvoidint2.ptr, (pricerec *) candidate->pvoidint2.ptr) );\n/*  return( compareSubstitutionVar((pricerec *) current->self, (pricerec *) candidate->self) ); */\n}\n\n/* Function to add a valid pivot candidate into the specified list */\nSTATIC int addCandidateVar(pricerec *candidate, multirec *multi, findCompare_func findCompare, MYBOOL allowSortedExpand)\n{\n  int     insertpos, delta = 1;\n  pricerec *targetrec;\n\n  /* Find the insertion point (if any) */\n  if((multi->freeList[0] == 0) ||\n     (multi->sorted && allowSortedExpand) ||\n     (candidate->isdual && (multi->used == 1) && ((multi->step_last >= multi->epszero) ||\n                                                  multi_truncatingvar(multi, ((pricerec *) (multi->sortedList[0].pvoidreal.ptr))->varno)))\n     ) {\n    UNIONTYPE QSORTrec searchTarget;\n\n    /* Make sure that the list is sorted before the search for an insertion point */\n    if((multi->freeList[0] == 0) && !multi->sorted) {\n      multi->sorted = QS_execute(multi->sortedList, multi->used, findCompare, &insertpos);\n      multi->dirty  = (MYBOOL) (insertpos > 0);\n    }\n\n    /* Perform the search */\n    searchTarget.pvoidint2.ptr = (void *) candidate;\n    insertpos = sizeof(searchTarget);\n    insertpos = findIndexEx(&searchTarget, multi->sortedList-delta, multi->used, delta, insertpos, findCompare, TRUE);\n    if(insertpos > 0)\n      return( -1 );\n    insertpos = -insertpos - delta;\n\n    /* Check if the candidate is worse than the worst of the list */\n    if(((insertpos >= multi->size) && (multi->freeList[0] == 0)) ||\n       ((insertpos == multi->used) && (!allowSortedExpand ||\n                                       (multi->step_last >= multi->epszero))))\n      return( -1 );\n\n#ifdef Paranoia\n    /* Do validation */\n    if((insertpos < 0) || (insertpos > multi->used))\n      return( -1 );\n#endif\n\n    /* Define the target for storing the candidate;\n       Case 1: List is full and we must discard the previously worst candidate\n       Case 2: List is not full and we simply use the next free position */\n    if(multi->freeList[0] == 0)\n      targetrec = (pricerec *) multi->sortedList[multi->used-1].pvoidreal.ptr;\n    else {\n      delta = multi->freeList[0]--;\n      delta = multi->freeList[delta];\n      targetrec = &(multi->items[delta]);\n    }\n  }\n  else {\n    delta = multi->freeList[0]--;\n    delta = multi->freeList[delta];\n    targetrec = &(multi->items[delta]);\n    insertpos = multi->used;\n  }\n\n  /* Insert the new candidate record in the data store */\n  MEMCOPY(targetrec, candidate, 1);\n\n  /* Store the pointer data and handle tree cases:\n     Case 1: The list is unsorted and not full; simply append pointer to list,\n     Case 2: The list is sorted and full; insert the pointer by discarding previous last,\n     Case 3: The list is sorted and not full; shift the inferior items down, and increment count */\n  if((multi->used < multi->size) && (insertpos >= multi->used)) {\n    QS_append(multi->sortedList, insertpos, targetrec);\n    multi->used++;\n  }\n  else {\n    if(multi->used == multi->size)\n      QS_insert(multi->sortedList, insertpos, targetrec, multi->size-1); /* Discard previous last */\n    else {\n      QS_insert(multi->sortedList, insertpos, targetrec, multi->used);   /* Keep previous last    */\n      multi->used++;\n    }\n  }\n  multi->active = insertpos;\n\n#ifdef Paranoia\n  if((insertpos >= multi->size) || (insertpos >= multi->used))\n    report(multi->lp, SEVERE, \"addCandidateVar: Insertion point beyond limit!\\n\");\n#endif\n\n  return( insertpos );\n}\n\nSTATIC MYBOOL findImprovementVar(pricerec *current, pricerec *candidate, MYBOOL collectMP, int *candidatecount)\n/* PRIMAL: Find a variable to enter the basis\n   DUAL:   Find a variable to leave the basis\n\n   Allowed variable set: Any pivot PRIMAL:larger or DUAL:smaller than threshold value of 0 */\n{\n  MYBOOL Action = FALSE,\n#ifdef ExtractedValidityTest\n         Accept = TRUE;\n#else    /* Check for validity and compare result with previous best */\n         Accept = validImprovementVar(candidate);\n#endif\n  if(Accept) {\n    if(candidatecount != NULL)\n      (*candidatecount)++;\n    if(collectMP) {\n      if(addCandidateVar(candidate, current->lp->multivars, (findCompare_func *) compareImprovementQS, FALSE) < 0)\n        return(Action);\n    }\n    if(current->varno > 0)\n      Accept = (MYBOOL) (compareImprovementVar(current, candidate) > 0);\n  }\n\n /* Apply candidate if accepted */\n  if(Accept) {\n    (*current) = *candidate;\n\n    /* Force immediate acceptance for Bland's rule using the primal simplex */\n    if(!candidate->isdual)\n      Action = (MYBOOL) (candidate->lp->_piv_rule_ == PRICER_FIRSTINDEX);\n  }\n  return(Action);\n}\n\n/* Bound flip variable accumulation routine */\nSTATIC MYBOOL collectMinorVar(pricerec *candidate, multirec *longsteps, MYBOOL isphase2, MYBOOL isbatch)\n{\n  int   inspos;\n\n  /* 1. Check for ratio and pivot validity (to have the extra flexibility that all\n        bound-flip candidates are also possible as basis-entering variables */\n  if(!validSubstitutionVar(candidate))\n    return( FALSE );\n\n  /* 2. If the free-list is empty we need to see if we have a better candidate,\n        and for this the candidate list has to be sorted by merit */\n  if(!isbatch &&\n     !longsteps->sorted && (longsteps->used > 1) &&\n     ((longsteps->freeList[0] == 0) ||\n      multi_truncatingvar(longsteps, candidate->varno) ||\n      (longsteps->step_last >= longsteps->epszero) )) {\n    longsteps->sorted = QS_execute(longsteps->sortedList, longsteps->used,\n                                   (findCompare_func *) compareSubstitutionQS, &inspos);\n    longsteps->dirty  = (MYBOOL) (inspos > 0);\n    if(longsteps->dirty)\n      multi_recompute(longsteps, 0, isphase2, TRUE);\n  }\n\n  /* 3. Now handle three cases...\n        - Add to the list when the list is not full and there is opportunity for improvement,\n        - Check if we should replace an incumbent when the list is full,\n        - Check if we should replace an incumbent when the list is not full, there is no room\n          for improvement, but the current candidate is better than an incumbent. */\n  inspos = addCandidateVar(candidate, longsteps, (findCompare_func *) compareSubstitutionQS, TRUE);\n\n  /* 4. Recompute steps and objective, and (if relevant) determine if we\n        may be suboptimal in relation to an incumbent MILP solution. */\n  return( (MYBOOL) (inspos >= 0) &&\n           ((isbatch == TRUE) || multi_recompute(longsteps, inspos, isphase2, TRUE)) );\n}\n\nSTATIC MYBOOL findSubstitutionVar(pricerec *current, pricerec *candidate, int *candidatecount)\n/* PRIMAL: Find a variable to leave the basis\n   DUAL:   Find a variable to enter the basis\n\n   Allowed variable set: \"Equal-valued\" smallest thetas! */\n{\n  MYBOOL Action = FALSE,\n#ifdef ExtractedValidityTest\n         Accept = TRUE;\n#else  /* Check for validity and comparison result with previous best */\n         Accept = validSubstitutionVar(candidate);\n#endif\n  if(Accept) {\n    if(candidatecount != NULL)\n      (*candidatecount)++;\n    if(current->varno != 0)\n      Accept = (MYBOOL) (compareSubstitutionVar(current, candidate) > 0);\n  }\n\n /* Apply candidate if accepted */\n  if(Accept) {\n    (*current) = *candidate;\n\n    /* Force immediate acceptance for Bland's rule using the dual simplex */\n#ifdef ForceEarlyBlandRule\n    if(candidate->isdual)\n      Action = (MYBOOL) (candidate->lp->_piv_rule_ == PRICER_FIRSTINDEX);\n#endif\n  }\n  return(Action);\n}\n\n/* Partial pricing management routines */\nSTATIC partialrec *partial_createBlocks(lprec *lp, MYBOOL isrow)\n{\n  partialrec *blockdata;\n\n  blockdata = (partialrec *) calloc(1, sizeof(*blockdata));\n  blockdata->lp = lp;\n  blockdata->blockcount = 1;\n  blockdata->blocknow = 1;\n  blockdata->isrow = isrow;\n\n  return(blockdata);\n}\nSTATIC int partial_countBlocks(lprec *lp, MYBOOL isrow)\n{\n  partialrec *blockdata = IF(isrow, lp->rowblocks, lp->colblocks);\n\n  if(blockdata == NULL)\n    return( 1 );\n  else\n    return( blockdata->blockcount );\n}\nSTATIC int partial_activeBlocks(lprec *lp, MYBOOL isrow)\n{\n  partialrec *blockdata = IF(isrow, lp->rowblocks, lp->colblocks);\n\n  if(blockdata == NULL)\n    return( 1 );\n  else\n    return( blockdata->blocknow );\n}\nSTATIC void partial_freeBlocks(partialrec **blockdata)\n{\n  if((blockdata == NULL) || (*blockdata == NULL))\n    return;\n  FREE((*blockdata)->blockend);\n  FREE((*blockdata)->blockpos);\n  FREE(*blockdata);\n}\n\n\n/* Function to provide for left-right or right-left scanning of entering/leaving\n   variables; note that *end must have been initialized by the calling routine! */\nSTATIC void makePriceLoop(lprec *lp, int *start, int *end, int *delta)\n{\n  int offset = is_piv_mode(lp, PRICE_LOOPLEFT);\n\n  if((offset) ||\n     (((lp->total_iter+offset) % 2 == 0) && is_piv_mode(lp, PRICE_LOOPALTERNATE))) {\n    *delta = -1; /* Step backwards - \"left\" */\n    swapINT(start, end);\n    lp->_piv_left_ = TRUE;\n  }\n  else {\n    *delta = 1;  /* Step forwards - \"right\" */\n    lp->_piv_left_ = FALSE;\n  }\n}\n\n/* Routine to verify accuracy of the current basis factorization */\nSTATIC MYBOOL serious_facterror(lprec *lp, REAL *bvector, int maxcols, REAL tolerance)\n{\n  int    i, j, ib, ie, nz, nc;\n  REAL   sum, tsum = 0, err = 0;\n  MATrec *mat = lp->matA;\n\n  if(bvector == 0)\n    bvector = lp->bsolveVal;\n  nc =0;\n  nz = 0;\n  for(i = 1; (i <= lp->rows) && (nc <= maxcols); i++) {\n\n    /* Do we have a non-slack variable? (we choose to skip slacks,\n      since they have \"natural\" good accuracy properties) */\n    j = lp->var_basic[i] - lp->rows;\n    if(j <= 0)\n      continue;\n    nc++;\n\n    /* Compute cross product for basic, non-slack column */\n    ib = mat->col_end[j-1];\n    ie = mat->col_end[j];\n    nz += ie - ib;\n    sum = get_OF_active(lp, j+lp->rows, bvector[0]);\n    for(; ib < ie; ib++)\n      sum += COL_MAT_VALUE(ib)*bvector[COL_MAT_ROWNR(ib)];\n\n    /* Catch high precision early, so we don't to uneccessary work */\n    tsum += sum;\n    SETMAX(err, fabs(sum));\n    if((tsum / nc > tolerance / 100) && (err < tolerance / 100))\n      break;\n  }\n  err /= mat->infnorm;\n  return( (MYBOOL) (err >= tolerance) );\n}\n\n/* Computation of reduced costs */\nSTATIC void update_reducedcosts(lprec *lp, MYBOOL isdual, int leave_nr, int enter_nr, REAL *prow, REAL *drow)\n{\n  /* \"Fast\" update of the dual reduced cost vector; note that it must be called\n     after the pivot operation and only applies to a major \"true\" iteration */\n  int  i;\n  REAL hold;\n\n  if(isdual) {\n    hold = -drow[enter_nr]/prow[enter_nr];\n    for(i=1; i <= lp->sum; i++)\n      if(!lp->is_basic[i]) {\n        if(i == leave_nr)\n          drow[i] = hold;\n        else {\n          drow[i] += hold*prow[i];\n          my_roundzero(drow[i], lp->epsmachine);\n        }\n      }\n  }\n  else\n    report(lp, SEVERE, \"update_reducedcosts: Cannot update primal reduced costs!\\n\");\n}\n\n\nSTATIC void compute_reducedcosts(lprec *lp, MYBOOL isdual, int row_nr, int *coltarget, MYBOOL dosolve,\n                                            REAL *prow, int *nzprow,\n                                            REAL *drow, int *nzdrow,\n                                            int roundmode)\n{\n  REAL epsvalue = lp->epsvalue;  /* Any larger value can produce a suboptimal result */\n  roundmode |=  MAT_ROUNDRC;\n\n  if(isdual) {\n    bsolve_xA2(lp, coltarget,\n                   row_nr, prow, epsvalue, nzprow,  /* Calculate net sensitivity given a leaving variable */\n                        0, drow, epsvalue, nzdrow,  /* Calculate the net objective function values */\n                   roundmode);\n  }\n  else {\n    REAL *bVector;\n\n#if 1 /* Legacy mode, that is possibly a little faster */\n    if((lp->multivars == NULL) && (lp->P1extraDim == 0))\n      bVector = drow;\n    else\n#endif\n      bVector = lp->bsolveVal;\n    if(dosolve) {\n      bsolve(lp, 0, bVector, lp->bsolveIdx, epsvalue*DOUBLEROUND, 1.0);\n      if(!isdual && (row_nr == 0) && (lp->improve & IMPROVE_SOLUTION) && !refactRecent(lp) &&\n         serious_facterror(lp, bVector, lp->rows, lp->epsvalue))\n        set_action(&lp->spx_action, ACTION_REINVERT);\n    }\n    prod_xA(lp,   coltarget,\n                  bVector, lp->bsolveIdx, epsvalue, 1.0,\n                  drow, nzdrow, roundmode);\n  }\n}\n\n\n/* Primal: Prevent acceptance of an entering variable when the magnitude of\n           other candidates is also very small.\n   Dual:   Prevent acceptance of a leaving variable when the magnitude of\n           other candidates is also very small.\n\n   Both of these cases are associated with numerical stalling, which we could\n   argue should be detected and handled by the stalling monitor routine. */\nSTATIC MYBOOL verify_stability(lprec *lp, MYBOOL isprimal, REAL xfeas, REAL sfeas, int nfeas)\n{\n  MYBOOL testOK = TRUE;\n  return( testOK );\n\n#if 1\n  /* Try to make dual feasibility as tight as possible */\n  if(!isprimal)\n/*  if(lp->P1extraVal == 0) */\n  {\n    xfeas /= (1+lp->rhsmax);\n    sfeas /= (1+lp->rhsmax);\n  }\n#endif\n  xfeas = fabs(xfeas);             /* Maximum (positive) infeasibility */\n/*  if(xfeas < lp->epspivot) { */\n  if(xfeas < lp->epssolution) {\n    REAL f;\n    sfeas = fabs(sfeas);           /* Make sum of infeasibilities positive */\n    xfeas = (sfeas-xfeas)/nfeas;   /* Average \"residual\" feasibility */\n    f = 1 + log10((REAL) nfeas);   /* Some numerical complexity scalar */\n    /* Numerical errors can interact to cause non-convergence, and the\n      idea is to relax the tolerance to account for this and only\n      marginally weakening the (user-specified) tolerance. */\n    if((sfeas-xfeas) < f*lp->epsprimal)\n      testOK = FALSE;\n  }\n  return( testOK );\n}\n\n\n/* Find an entering column for the case that the specified basic variable\n   is fixed or zero - typically used for artificial variable elimination */\nSTATIC int find_rowReplacement(lprec *lp, int rownr, REAL *prow, int *nzprow)\n/* The logic in this section generally follows Chvatal: Linear Programming, p. 130\n   Basically, the function is a specialized coldual(). */\n{\n  int  i, bestindex;\n  REAL bestvalue;\n\n /* Solve for \"local reduced cost\" */\n  set_action(&lp->piv_strategy, PRICE_FORCEFULL);\n    compute_reducedcosts(lp, TRUE, rownr, NULL, TRUE,\n                             prow, nzprow, NULL, NULL, MAT_ROUNDDEFAULT);\n  clear_action(&lp->piv_strategy, PRICE_FORCEFULL);\n\n /* Find a suitably non-singular variable to enter (\"most orthogonal\") */\n  bestindex = 0;\n  bestvalue = 0;\n  for(i = 1; i <= lp->sum-abs(lp->P1extraDim); i++) {\n    if(!lp->is_basic[i] && !is_fixedvar(lp, i) &&\n      (fabs(prow[i]) > bestvalue)) {\n      bestindex = i;\n      bestvalue = fabs(prow[i]);\n    }\n  }\n\n  /* Prepare to update inverse and pivot/iterate (compute Bw=a) */\n  if(i > lp->sum-abs(lp->P1extraDim))\n    bestindex = 0;\n  else\n    fsolve(lp, bestindex, prow, nzprow, lp->epsmachine, 1.0, TRUE);\n\n  return( bestindex );\n}\n\n/* Find the primal simplex entering non-basic column variable */\nSTATIC int colprim(lprec *lp, REAL *drow, int *nzdrow, MYBOOL skipupdate, int partialloop, int *candidatecount, MYBOOL updateinfeas, REAL *xviol)\n{\n  int      i, ix, iy, iz, ninfeas, nloop = 0;\n  REAL     f, sinfeas, xinfeas, epsvalue = lp->epsdual;\n  pricerec current, candidate;\n  MYBOOL   collectMP = FALSE;\n  int      *coltarget = NULL;\n\n  /* Identify pivot column according to pricing strategy; set\n     entering variable initial threshold reduced cost value to \"0\" */\n  current.pivot    = lp->epsprimal;    /* Minimum acceptable improvement */\n  current.varno    = 0;\n  current.lp       = lp;\n  current.isdual   = FALSE;\n  candidate.lp     = lp;\n  candidate.isdual = FALSE;\n  *candidatecount  = 0;\n\n  /* Update local value of pivot setting and determine active multiple pricing set */\n  lp->_piv_rule_ = get_piv_rule(lp);\ndoLoop:\n  nloop++;\n  if((lp->multivars != NULL) && ((lp->simplex_mode & SIMPLEX_PRIMAL_PRIMAL) != 0)) {\n    collectMP = multi_mustupdate(lp->multivars);\n    if(collectMP) {\n      multi_restart(lp->multivars);\n      coltarget = NULL;\n    }\n    else\n      coltarget = multi_indexSet(lp->multivars, FALSE);\n  }\n\n  /* Compute reduced costs c - c*Inv(B), if necessary\n     (i.e. the previous iteration was not a \"minor\" iteration/bound flip) */\n  if(!skipupdate) {\n#ifdef UsePrimalReducedCostUpdate\n    /* Recompute from scratch only at the beginning, otherwise update */\n    if((lp->current_iter > 0) && (refactRecent(lp) == AUTOMATIC))\n#endif\n    compute_reducedcosts(lp, FALSE, 0, coltarget, (MYBOOL) ((nloop <= 1) || (partialloop > 1)),\n                             NULL, NULL,\n                             drow, nzdrow,\n                             MAT_ROUNDDEFAULT);\n  }\n\n  /* Loop over active partial column set; we presume that reduced costs\n     have only been updated for columns in the active partial range. */\n  ix = 1;\n  iy = nzdrow[0];\n  ninfeas = 0;\n  xinfeas = 0;\n  sinfeas = 0;\n  makePriceLoop(lp, &ix, &iy, &iz);\n  iy *= iz;\n  for(; ix*iz <= iy; ix += iz) {\n    i = nzdrow[ix];\n#if 0 /* Not necessary since we masked them out in compute_reducedcosts() */\n    if(i > lp->sum-abs(lp->P1extraDim))\n      continue;\n#endif\n\n    /* Check if the pivot candidate is on the block-list */\n    if(lp->rejectpivot[0] > 0) {\n      int kk;\n      for(kk = 1; (kk <= lp->rejectpivot[0]) && (i != lp->rejectpivot[kk]); kk++);\n      if(kk <= lp->rejectpivot[0])\n        continue;\n    }\n\n   /* Retrieve the applicable reduced cost - threshold should not be smaller than 0 */\n    f = my_chsign(lp->is_lower[i], drow[i]);\n    if(f <= epsvalue)\n      continue;\n\n   /* Find entering variable according to strategy (largest positive f) */\n    ninfeas++;\n    SETMAX(xinfeas, f);\n    sinfeas += f;\n    candidate.pivot = normalizeEdge(lp, i, f, FALSE);\n    candidate.varno = i;\n    if(findImprovementVar(&current, &candidate, collectMP, candidatecount))\n      break;\n  }\n\n  /* Check if we should loop again after a multiple pricing update */\n  if(lp->multivars != NULL) {\n    if(collectMP) {\n      if(!lp->multivars->sorted)\n        lp->multivars->sorted = QS_execute(lp->multivars->sortedList, lp->multivars->used,\n                                           (findCompare_func *) compareImprovementQS, NULL);\n      coltarget = multi_indexSet(lp->multivars, TRUE);\n    }\n    else if((current.varno == 0) && (lp->multivars->retries == 0)) {\n      ix = partial_blockStart(lp, FALSE);\n      iy = partial_blockEnd(lp, FALSE);\n      lp->multivars->used = 0;\n      lp->multivars->retries++;\n      goto doLoop;\n    }\n    /* Shrink the candidate list */\n    lp->multivars->retries = 0;\n    if(current.varno != 0)\n      multi_removevar(lp->multivars, current.varno);\n  }\n\n  /* Check for optimality */\n  if(xviol != NULL)\n    *xviol = xinfeas;\n  if(updateinfeas)\n    lp->suminfeas = fabs(sinfeas);\n  if((lp->multivars == NULL) && (current.varno > 0) &&\n     !verify_stability(lp, TRUE, xinfeas, sinfeas, ninfeas))\n    current.varno = 0;\n\n  /* Produce statistics */\n  if(lp->spx_trace) {\n    if(current.varno > 0)\n      report(lp, DETAILED, \"colprim: Column %d reduced cost = \" RESULTVALUEMASK \"\\n\",\n                          current.varno, current.pivot);\n    else\n      report(lp, DETAILED, \"colprim: No positive reduced costs found, optimality!\\n\");\n  }\n\n  return( current.varno );\n} /* colprim */\n\n/* Find the primal simplex leaving basic column variable */\nSTATIC int rowprim(lprec *lp, int colnr, LREAL *theta, REAL *pcol, int *nzpcol, MYBOOL forceoutEQ, REAL *xviol)\n{\n  int      i, ii, iy, iz, Hpass, k, *nzlist;\n  LREAL    f, savef;\n  REAL     Heps, Htheta, Hlimit, epsvalue, epspivot, p = 0.0;\n  pricerec current, candidate;\n  MYBOOL   isupper = !lp->is_lower[colnr], HarrisTwoPass = FALSE;\n\n  /* Update local value of pivot setting */\n  lp->_piv_rule_ = get_piv_rule(lp);\n  if(nzpcol == NULL)\n    nzlist = (int *) mempool_obtainVector(lp->workarrays, lp->rows+1, sizeof(*nzlist));\n  else\n    nzlist = nzpcol;\n\n  /* Find unconditional non-zeros and optionally compute relative size of epspivot */\n  epspivot = lp->epspivot;\n  epsvalue = lp->epsvalue;\n  Hlimit = 0;\n  Htheta = 0;\n  k = 0;\n  for(i = 1; i <= lp->rows; i++) {\n    p = fabs(pcol[i]);\n    if(p > Hlimit)\n      Hlimit = p;\n    if(p > epsvalue) {\n      k++;\n      nzlist[k] = i;\n      SETMAX(Htheta, p);\n    }\n#ifdef Paranoia\n    else {\n      if(lp->spx_trace)\n        report(lp, FULL, \"rowprim: Row %d with pivot \" RESULTVALUEMASK \" rejected as too small\\n\",\n                         i, p);\n    }\n#endif\n  }\n  if(xviol != NULL)\n    *xviol = Htheta;\n  Htheta = 0;\n\n  /* Update non-zero list based on the new pivot threshold */\n#ifdef UseRelativePivot_Primal\n/*  epspivot *= sqrt(lp->matA->dynrange) / lp->matA->infnorm; */\n  epspivot /= MAX(1, sqrt(lp->matA->colmax[colnr]));\n  iy = k;\n  k = 0;\n  p = 0;\n  for(ii = 1; ii <= iy; ii++) {\n    i = nzlist[ii];\n    p = fabs(pcol[i]);\n\n    /* Compress the list of valid alternatives, if appropriate */\n    if(p > epspivot) {\n      k++;\n      nzlist[k] = i;\n    }\n#ifdef Paranoia\n    else {\n      if(lp->spx_trace)\n        report(lp, FULL, \"rowprim: Row %d with pivot \" RESULTVALUEMASK \" rejected as too small\\n\",\n                         i, p);\n    }\n#endif\n  }\n#endif\n\n  /* Initialize counters */\n  nzlist[0] = k;\n  k = 0;\n\nRetry:\n  k++;\n  HarrisTwoPass = is_piv_mode(lp, PRICE_HARRISTWOPASS);\n  if(HarrisTwoPass)\n    Hpass = 1;\n  else\n    Hpass = 2;\n  current.theta    = lp->infinite;\n  current.pivot    = 0;\n  current.varno    = 0;\n  current.isdual   = FALSE;\n  current.epspivot = epspivot;\n  current.lp       = lp;\n  candidate.epspivot = epspivot;\n  candidate.isdual = FALSE;\n  candidate.lp     = lp;\n  savef  = 0;\n  for(; Hpass <= 2; Hpass++) {\n    Htheta = lp->infinite;\n    if(Hpass == 1) {\n      Hlimit = lp->infinite;           /* Don't apply any limit in the first pass */\n      Heps   = epspivot/lp->epsprimal; /* Scaled to lp->epsprimal used in compute_theta() */\n    }\n    else {\n      Hlimit = current.theta;          /* This is the smallest Theta of the first pass */\n      Heps   = 0.0;\n    }\n    current.theta = lp->infinite;\n    current.pivot = 0;\n    current.varno = 0;\n    savef = 0;\n\n    ii = 1;\n    iy = nzlist[0];\n    makePriceLoop(lp, &ii, &iy, &iz);\n    iy *= iz;\n    for(; ii*iz <= iy; ii += iz) {\n      i = nzlist[ii];\n      f = pcol[i];\n      candidate.theta = f;\n      candidate.pivot = f;\n      candidate.varno = i;\n\n      /*i =*/ compute_theta(lp, i, &candidate.theta, isupper,\n                            my_if(lp->upbo[lp->var_basic[i]] < lp->epsprimal, Heps/10, Heps), TRUE);\n\n      if(fabs(candidate.theta) >= lp->infinite) {\n        savef = f;\n        candidate.theta = 2*lp->infinite;\n        continue;\n      }\n\n      /* Find the candidate leaving variable according to strategy (smallest theta) */\n      if((Hpass == 2) && (candidate.theta > Hlimit))\n        continue;\n\n      /* Give a slight preference to fixed variables (mainly equality slacks) */\n      if(forceoutEQ) {\n        p = candidate.pivot;\n        if(lp->upbo[lp->var_basic[i]] < lp->epsprimal) {\n          /* Give an extra early boost to equality slack elimination, if specified */\n          if(forceoutEQ == AUTOMATIC)\n            candidate.pivot *= 1.0+lp->epspivot;\n          else\n            candidate.pivot *= 10.0;\n\n        }\n      }\n      if(HarrisTwoPass) {\n        f = candidate.theta;\n        if(Hpass == 2)\n          candidate.theta = 1;\n        if(findSubstitutionVar(&current, &candidate, NULL))\n          break;\n        if((Hpass == 2) && (current.varno == candidate.varno))\n          Htheta = f;\n      }\n      else\n        if(findSubstitutionVar(&current, &candidate, NULL))\n          break;\n      /* Restore temporarily modified pivot */\n      if(forceoutEQ && (current.varno == candidate.varno))\n        current.pivot = p;\n    }\n  }\n  if(HarrisTwoPass)\n    current.theta = Htheta;\n\n  /* Handle case of no available leaving variable */\n  if(current.varno == 0) {\n    if(lp->upbo[colnr] >= lp->infinite) {\n      /* Optionally try again with reduced pivot threshold level */\n      if(k < 2) {\n        epspivot = epspivot / 10;\n        goto Retry;\n      }\n    }\n    else {\n#if 1\n      i = 1;\n      while((pcol[i] >= 0) && (i <= lp->rows))\n        i++;\n      if(i > lp->rows) { /* Empty column with upper bound! */\n        lp->is_lower[colnr] = !lp->is_lower[colnr];\n/*        lp->is_lower[colnr] = FALSE; */\n        lp->rhs[0] += lp->upbo[colnr]*pcol[0];\n      }\n      else /* if(pcol[i]<0) */\n      {\n        current.varno = i;\n      }\n#endif\n    }\n  }\n  else if(current.theta >= lp->infinite) {\n    report(lp, IMPORTANT, \"rowprim: Numeric instability pcol[%d] = %g, rhs[%d] = %g, upbo = %g\\n\",\n                          current.varno, savef, current.varno, lp->rhs[current.varno],\n                          lp->upbo[lp->var_basic[current.varno]]);\n  }\n\n /* Return working array to pool */\n  if(nzpcol == NULL)\n    mempool_releaseVector(lp->workarrays, (char *) nzlist, FALSE);\n\n  if(lp->spx_trace)\n    report(lp, DETAILED, \"row_prim: %d, pivot size = \" RESULTVALUEMASK \"\\n\",\n                         current.varno, current.pivot);\n\n/*  *theta = current.theta; */\n  *theta = fabs(current.theta);\n\n  return(current.varno);\n} /* rowprim */\n\n\n/* Find the dual simplex leaving basic variable */\nSTATIC int rowdual(lprec *lp, REAL *rhvec, MYBOOL forceoutEQ, MYBOOL updateinfeas, REAL *xviol)\n{\n  int       k, i, iy, iz, ii, ninfeas;\n  register REAL     rh;\n  REAL      up, lo = 0,\n            epsvalue, sinfeas, xinfeas;\n  pricerec  current, candidate;\n  MYBOOL    collectMP = FALSE;\n\n  /* Initialize */\n  if(rhvec == NULL)\n    rhvec = lp->rhs;\n  epsvalue = lp->epsdual;\n  current.pivot    = -epsvalue;  /* Initialize leaving variable threshold; \"less than 0\" */\n  current.theta    = 0;\n  current.varno    = 0;\n  current.isdual   = TRUE;\n  current.lp       = lp;\n  candidate.isdual = TRUE;\n  candidate.lp     = lp;\n\n  /* Loop over active partial row set */\n  if(is_action(lp->piv_strategy, PRICE_FORCEFULL)) {\n    k  = 1;\n    iy = lp->rows;\n  }\n  else {\n    k = partial_blockStart(lp, TRUE);\n    iy = partial_blockEnd(lp, TRUE);\n  }\n  ninfeas = 0;\n  xinfeas = 0;\n  sinfeas = 0;\n  makePriceLoop(lp, &k, &iy, &iz);\n  iy *= iz;\n  for(; k*iz <= iy; k += iz) {\n\n    /* Map loop variable to target */\n    i = k;\n\n    /* Check if the pivot candidate is on the block-list */\n    if(lp->rejectpivot[0] > 0) {\n      int kk;\n      for(kk = 1; (kk <= lp->rejectpivot[0]) && (i != lp->rejectpivot[kk]); kk++);\n      if(kk <= lp->rejectpivot[0])\n        continue;\n    }\n\n    /* Set local variables - express violation as a negative number */\n    ii = lp->var_basic[i];\n    up = lp->upbo[ii];\n    lo = 0;\n    rh = rhvec[i];\n    if(rh > up)\n      rh = up - rh;\n    else\n      rh -= lo;\n    up -= lo;\n\n   /* Analyze relevant constraints ...\n      KE version skips uninteresting alternatives and gives a noticeable speedup */\n/*    if((rh < -epsvalue*sqrt(lp->matA->rowmax[i])) || */\n    if((rh < -epsvalue) ||\n       ((forceoutEQ == TRUE) && (up < epsvalue))) {  /* It causes instability to remove the \"TRUE\" test */\n\n     /* Accumulate stats */\n      ninfeas++;\n      SETMIN(xinfeas, rh);\n      sinfeas += rh;\n\n     /* Give a slight preference to fixed variables (mainly equality slacks) */\n      if(up < epsvalue) {\n        /* Break out immediately if we are directed to force slacks out of the basis */\n        if(forceoutEQ == TRUE) {\n          current.varno = i;\n          current.pivot = -1;\n          break;\n        }\n        /* Give an extra early boost to equality slack elimination, if specified */\n        if(forceoutEQ == AUTOMATIC)\n          rh *= 10.0;\n        else /* .. or just the normal. marginal boost */\n          rh *= 1.0+lp->epspivot;\n      }\n\n     /* Select leaving variable according to strategy (the most negative/largest violation) */\n      candidate.pivot = normalizeEdge(lp, i, rh, TRUE);\n      candidate.varno = i;\n      if(findImprovementVar(&current, &candidate, collectMP, NULL))\n        break;\n    }\n  }\n\n  /* Verify infeasibility */\n  if(updateinfeas)\n    lp->suminfeas = fabs(sinfeas);\n  if((ninfeas > 1) &&\n     !verify_stability(lp, FALSE, xinfeas, sinfeas, ninfeas)) {\n    report(lp, IMPORTANT, \"rowdual: Check for reduced accuracy and tolerance settings.\\n\");\n    current.varno = 0;\n  }\n\n  /* Produce statistics */\n  if(lp->spx_trace) {\n    report(lp, NORMAL, \"rowdual: Infeasibility sum \" RESULTVALUEMASK \" in %7d constraints.\\n\",\n                        sinfeas, ninfeas);\n    if(current.varno > 0) {\n      report(lp, DETAILED, \"rowdual: rhs[%d] = \" RESULTVALUEMASK \"\\n\",\n                           current.varno, lp->rhs[current.varno]);\n    }\n    else\n      report(lp, FULL, \"rowdual: Optimality - No primal infeasibilities found\\n\");\n  }\n  if(xviol != NULL)\n    *xviol = fabs(xinfeas);\n\n  return(current.varno);\n} /* rowdual */\n\n\nSTATIC void longdual_testset(lprec *lp, int which, int rownr, REAL *prow, int *nzprow,\n                                                    REAL *drow, int *nzdrow)\n{\n  int i,j;\n  REAL F = lp->infinite;\n  if(which == 0) {             /* Maros Example-1 - raw data */\n    j =  1; i = lp->rows+j; lp->upbo[i] = 0;  lp->is_lower[i] =  TRUE; nzprow[j] = i; prow[i] =  2; drow[i] = -1;\n    j =  2; i = lp->rows+j; lp->upbo[i] = 1;  lp->is_lower[i] =  TRUE; nzprow[j] = i; prow[i] = -2; drow[i] =  2;\n    j =  3; i = lp->rows+j; lp->upbo[i] = 1;  lp->is_lower[i] =  TRUE; nzprow[j] = i; prow[i] =  1; drow[i] =  5;\n    j =  4; i = lp->rows+j; lp->upbo[i] = 1;  lp->is_lower[i] = FALSE; nzprow[j] = i; prow[i] =  3; drow[i] = -6;\n    j =  5; i = lp->rows+j; lp->upbo[i] = 1;  lp->is_lower[i] = FALSE; nzprow[j] = i; prow[i] = -4; drow[i] = -2;\n    j =  6; i = lp->rows+j; lp->upbo[i] = 1;  lp->is_lower[i] =  TRUE; nzprow[j] = i; prow[i] = -1; drow[i] =  0;\n    j =  7; i = lp->rows+j; lp->upbo[i] = 2;  lp->is_lower[i] = FALSE; nzprow[j] = i; prow[i] =  1; drow[i] =  0;\n    j =  8; i = lp->rows+j; lp->upbo[i] = 1;  lp->is_lower[i] = FALSE; nzprow[j] = i; prow[i] = -2; drow[i] =  0;\n    j =  9; i = lp->rows+j; lp->upbo[i] = 5;  lp->is_lower[i] =  TRUE; nzprow[j] = i; prow[i] = -1; drow[i] =  4;\n    j = 10; i = lp->rows+j; lp->upbo[i] = F;  lp->is_lower[i] =  TRUE; nzprow[j] = i; prow[i] = -2; drow[i] = 10;\n    nzprow[0] = i-lp->rows;\n    lp->rhs[rownr] = -11;\n    lp->upbo[lp->var_basic[rownr]] = F;\n    lp->rhs[0] = 1;\n  }\n  else if(which == 1) {       /* Maros Example-1 - presorted in correct order */\n    j =  1; i = lp->rows+j; lp->upbo[i] = 0;  lp->is_lower[i] =  TRUE; nzprow[j] = i; prow[i] =  2; drow[i] = -1;\n    j =  2; i = lp->rows+j; lp->upbo[i] = 1;  lp->is_lower[i] =  TRUE; nzprow[j] = i; prow[i] =  1; drow[i] =  5;\n    j =  3; i = lp->rows+j; lp->upbo[i] = 1;  lp->is_lower[i] = FALSE; nzprow[j] = i; prow[i] = -4; drow[i] = -2;\n    j =  4; i = lp->rows+j; lp->upbo[i] = 1;  lp->is_lower[i] = FALSE; nzprow[j] = i; prow[i] = -2; drow[i] =  0;\n\n    j =  5; i = lp->rows+j; lp->upbo[i] = 1;  lp->is_lower[i] =  TRUE; nzprow[j] = i; prow[i] = -1; drow[i] =  0;\n    j =  6; i = lp->rows+j; lp->upbo[i] = 2;  lp->is_lower[i] = FALSE; nzprow[j] = i; prow[i] =  1; drow[i] =  0;\n    j =  7; i = lp->rows+j; lp->upbo[i] = 1;  lp->is_lower[i] =  TRUE; nzprow[j] = i; prow[i] = -2; drow[i] =  2;\n    j =  8; i = lp->rows+j; lp->upbo[i] = 1;  lp->is_lower[i] = FALSE; nzprow[j] = i; prow[i] =  3; drow[i] = -6;\n    j =  9; i = lp->rows+j; lp->upbo[i] = 5;  lp->is_lower[i] =  TRUE; nzprow[j] = i; prow[i] = -1; drow[i] =  4;\n    j = 10; i = lp->rows+j; lp->upbo[i] = F;  lp->is_lower[i] =  TRUE; nzprow[j] = i; prow[i] = -2; drow[i] = 10;\n    nzprow[0] = i-lp->rows;\n    lp->rhs[rownr] = -11;\n    lp->upbo[lp->var_basic[rownr]] = F;\n    lp->rhs[0] = 1;\n  }\n\n  else if(which == 10) {       /* Maros Example-2 - raw data */\n    j =  1; i = lp->rows+j; lp->upbo[i] = 5;  lp->is_lower[i] =  TRUE; nzprow[j] = i; prow[i] = -2; drow[i] =  2;\n    j =  2; i = lp->rows+j; lp->upbo[i] = 1;  lp->is_lower[i] =  TRUE; nzprow[j] = i; prow[i] =  3; drow[i] =  3;\n    j =  3; i = lp->rows+j; lp->upbo[i] = 1;  lp->is_lower[i] = FALSE; nzprow[j] = i; prow[i] = -2; drow[i] =  0;\n    j =  4; i = lp->rows+j; lp->upbo[i] = 2;  lp->is_lower[i] = FALSE; nzprow[j] = i; prow[i] = -1; drow[i] = -2;\n    j =  5; i = lp->rows+j; lp->upbo[i] = 2;  lp->is_lower[i] =  TRUE; nzprow[j] = i; prow[i] =  1; drow[i] =  0;\n    j =  6; i = lp->rows+j; lp->upbo[i] = F;  lp->is_lower[i] =  TRUE; nzprow[j] = i; prow[i] =  3; drow[i] =  9;\n    nzprow[0] = i-lp->rows;\n    lp->rhs[rownr] = 14;\n    lp->upbo[lp->var_basic[rownr]] = 2;\n    lp->rhs[0] = 6;\n  }\n}\n\n\n/* Find the dual simplex entering non-basic variable */\nSTATIC int coldual(lprec *lp, int row_nr, REAL *prow, int *nzprow,\n                                          REAL *drow, int *nzdrow,\n                                          MYBOOL dualphase1, MYBOOL skipupdate,\n                                          int *candidatecount, REAL *xviol)\n{\n  int      i, iy, iz, ix, k, nbound;\n  LREAL    w, g, quot;\n  REAL     viol, p, epspivot = lp->epspivot;\n#ifdef MachinePrecRoundRHS\n  REAL     epsvalue = lp->epsmachine;\n#else\n  REAL     epsvalue = lp->epsvalue;\n#endif\n  pricerec current, candidate;\n  MYBOOL   isbatch = FALSE, /* Requires that lp->longsteps->size > lp->sum */\n           dolongsteps = (MYBOOL) (lp->longsteps != NULL);\n\n  /* Initialize */\n  if(xviol != NULL)\n    *xviol = lp->infinite;\n  if(dolongsteps && !dualphase1)\n    dolongsteps = AUTOMATIC;  /* Sets Phase1 = TRUE, Phase2 = AUTOMATIC */\n  current.theta    = lp->infinite;\n  current.pivot    = 0;\n  current.varno    = 0;\n  current.epspivot = epspivot;\n  current.isdual   = TRUE;\n  current.lp       = lp;\n  candidate.epspivot = epspivot;\n  candidate.isdual = TRUE;\n  candidate.lp     = lp;\n  *candidatecount  = 0;\n\n  /* Compute reduced costs */\n  if(!skipupdate) {\n#ifdef UseDualReducedCostUpdate\n    /* Recompute from scratch only at the beginning, otherwise update */\n    if((lp->current_iter > 0) && (refactRecent(lp) < AUTOMATIC))\n      compute_reducedcosts(lp, TRUE, row_nr, NULL, TRUE,\n                               prow, nzprow,\n                               NULL, NULL,\n                               MAT_ROUNDDEFAULT);\n    else\n#endif\n      compute_reducedcosts(lp, TRUE, row_nr, NULL, TRUE,\n                               prow, nzprow,\n                               drow, nzdrow,\n                               MAT_ROUNDDEFAULT);\n  }\n\n#if 0\n  /* Override all above to do in-line testing with fixed test set */\n  if(lp->rows > 1 && lp->columns > 10)\n    longdual_testset(lp, 10, row_nr, prow, nzprow, drow, nzdrow);\n#endif\n\n  /* Compute the current violation of the bounds of the outgoing variable,\n     negative for violation of lower bound, positive for upper bound violation.\n     (Basic variables are always lower-bounded, by lp_solve convention) */\n  g = 1;\n  viol = lp->rhs[row_nr];\n  if(viol > 0) {   /* Check if the leaving variable is >= its upper bound */\n    p = lp->upbo[lp->var_basic[row_nr]];\n    if(p < lp->infinite) {\n      viol -= p;\n      my_roundzero(viol, epsvalue);\n      if(viol > 0)\n        g = -1;\n    }\n    /* Do validation of numerics */\n    if(g == 1) {\n      if(viol >= lp->infinite) {\n        report(lp, IMPORTANT, \"coldual: Large basic solution value %g at iter %.0f indicates numerical instability\\n\",\n                               lp->rhs[row_nr], (double) get_total_iter(lp));\n        lp->spx_status = NUMFAILURE;\n        return( 0 );\n\n      }\n      if(skipupdate)\n        report(lp, DETAILED, \"coldual: Inaccurate bound-flip accuracy at iter %.0f\\n\",\n                              (double) get_total_iter(lp));\n      else\n        report(lp, SEVERE,   \"coldual: Leaving variable %d does not violate bounds at iter %.0f\\n\",\n                              row_nr, (double) get_total_iter(lp));\n      return( -1 );\n    }\n  }\n\n  /* Update local value of pivot setting */\n  lp->_piv_rule_ = get_piv_rule(lp);\n\n  /* Condense list of relevant targets */\n  p = 0;\n  k = 0;\n  nbound = 0;\n  ix = 1;\n  iy = nzprow[0];\n  for(ix = 1; ix <= iy; ix++) {\n    i = nzprow[ix];\n    w = prow[i] * g;            /* Change sign if upper bound of the leaving variable is violated   */\n    /* Change sign if the non-basic variable is currently upper-bounded */\n    /* w *= 2*lp->is_lower[i] - 1; */ /* fails on AIX!!! */\n    w = my_chsign(!lp->is_lower[i], w);\n\n    /* Check if the candidate is worth using for anything */\n    if(w < -epsvalue) {\n      /* Tally bounded variables */\n      if(lp->upbo[i] < lp->infinite)\n        nbound++;\n\n      /* Update the nz-index */\n      k++;\n      nzprow[k] = i;\n      SETMAX(p, -w);\n    }\n#ifdef Paranoia\n    else {\n      if(lp->spx_trace) {\n        report(lp, FULL, \"coldual: Candidate variable prow[%d] rejected with %g too small\\n\",\n                         i, w);\n      }\n    }\n#endif\n\n  }\n  nzprow[0] = k;\n  if(xviol != NULL)\n    *xviol = p;\n\n#ifdef UseRelativePivot_Dual\n/*  epspivot *= sqrt(lp->matA->dynrange) / lp->matA->infnorm; */\n  epspivot /= MAX(1, sqrt(lp->matA->rowmax[row_nr]));\n#endif\n  current.epspivot   = epspivot;\n  candidate.epspivot = epspivot;\n\n  /* Initialize the long-step structures if indicated */\n  if(dolongsteps) {\n    if((nzprow[0] <= 1) || (nbound == 0)) {  /* Don't bother */\n      dolongsteps = FALSE;\n      lp->longsteps->indexSet[0] = 0;\n    }\n    else {\n      multi_restart(lp->longsteps);\n      multi_valueInit(lp->longsteps, g*viol, lp->rhs[0]);\n    }\n  }\n\n  /* Loop over all entering column candidates */\n  ix = 1;\n  iy = nzprow[0];\n  makePriceLoop(lp, &ix, &iy, &iz);\n  iy *= iz;\n  for(; ix*iz <= iy; ix += iz) {\n    i = nzprow[ix];\n\n    /* Compute the dual ratio (prow = w and drow = cbar in Chvatal's \"nomenclatura\") */\n    w    = prow[i] * g;         /* Change sign if upper bound of the leaving variable is violated   */\n    quot = -drow[i] / w;        /* Remember this sign-reversal in multi_recompute!                  */\n\n    /* Apply the selected pivot strategy (smallest theta) */\n    candidate.theta = quot;  /* Note that abs() is applied in findSubstitutionVar */\n    candidate.pivot = w;\n    candidate.varno = i;\n\n    /* Collect candidates for minor iterations/bound flips */\n    if(dolongsteps) {\n      if(isbatch && (ix == iy))\n        isbatch = AUTOMATIC;\n      if(collectMinorVar(&candidate, lp->longsteps, (MYBOOL) (dolongsteps == AUTOMATIC), isbatch) &&\n         lp->spx_trace)\n        report(lp, DETAILED, \"coldual: Long-dual break point with %d bound-flip variables\\n\",\n                             lp->longsteps->used);\n      if(lp->spx_status == FATHOMED)\n        return( 0 );\n    }\n\n    /* We have a candidate for entering the basis; check if it is better than the incumbent */\n    else if(findSubstitutionVar(&current, &candidate, candidatecount))\n      break;\n  }\n\n  /* Set entering variable and long-step bound swap variables */\n  if(dolongsteps) {\n    *candidatecount = lp->longsteps->used;\n    i = multi_enteringvar(lp->longsteps, NULL, 3);\n  }\n  else\n    i = current.varno;\n\n  if(lp->spx_trace)\n    report(lp, NORMAL, \"coldual: Entering column %d, reduced cost %g, pivot value %g, bound swaps %d\\n\",\n                       i, drow[i], prow[i], multi_used(lp->longsteps));\n\n  return( i );\n} /* coldual */\n\n\nINLINE REAL normalizeEdge(lprec *lp, int item, REAL edge, MYBOOL isdual)\n{\n#if 1\n  /* Don't use the pricer \"close to home\", since this can possibly\n    worsen the final feasibility picture (mainly a Devex issue?) */\n  if(fabs(edge) > lp->epssolution)\n#endif\n    edge /= getPricer(lp, item, isdual);\n  if((lp->piv_strategy & PRICE_RANDOMIZE) != 0)\n    edge *= (1.0-PRICER_RANDFACT) + PRICER_RANDFACT*rand_uniform(lp, 1.0);\n  return( edge );\n\n}\n\n/* Support routines for block detection and partial pricing */\nSTATIC int partial_findBlocks(lprec *lp, MYBOOL autodefine, MYBOOL isrow)\n{\n  int    i, jj, n, nb, ne, items;\n  REAL   hold, biggest, *sum = NULL;\n  MATrec *mat = lp->matA;\n  partialrec *blockdata;\n\n  if(!mat_validate(mat))\n    return( 1 );\n\n  blockdata = IF(isrow, lp->rowblocks, lp->colblocks);\n  items     = IF(isrow, lp->rows, lp->columns);\n  allocREAL(lp, &sum, items+1, FALSE);\n\n  /* Loop over items and compute the average column index for each */\n  sum[0] = 0;\n  for(i = 1; i <= items; i++) {\n    n = 0;\n    if(isrow) {\n      nb = mat->row_end[i-1];\n      ne = mat->row_end[i];\n    }\n    else {\n      nb = mat->col_end[i-1];\n      ne = mat->col_end[i];\n    }\n    n = ne-nb;\n    sum[i] = 0;\n    if(n > 0) {\n      if(isrow)\n        for(jj = nb; jj < ne; jj++)\n          sum[i] += ROW_MAT_COLNR(jj);\n      else\n        for(jj = nb; jj < ne; jj++)\n          sum[i] += COL_MAT_ROWNR(jj);\n      sum[i] /= n;\n    }\n    else\n      sum[i] = sum[i-1];\n  }\n\n  /* Loop over items again, find largest difference and make monotone */\n  hold = 0;\n  biggest = 0;\n  for(i = 2; i <= items; i++) {\n    hold = sum[i] - sum[i-1];\n    if(hold > 0) {\n      if(hold > biggest)\n        biggest = hold;\n    }\n    else\n      hold = 0;\n    sum[i-1] = hold;\n  }\n\n  /* Loop over items again and find differences exceeding threshold;\n     the discriminatory power of this routine depends strongly on the\n     magnitude of the scaling factor - from empirical evidence > 0.9 */\n  biggest = MAX(1, 0.9*biggest);\n  n = 0;\n  nb = 0;\n  ne = 0;\n  for(i = 1; i < items; i++)\n    if(sum[i] > biggest) {\n      ne += i-nb;        /* Compute sum of index gaps between maxima */\n      nb = i;\n      n++;               /* Increment count */\n    }\n\n  /* Clean up */\n  FREE(sum);\n\n  /* Require that the maxima are spread \"nicely\" across the columns,\n     otherwise return that there is only one monolithic block.\n     (This is probably an area for improvement in the logic!) */\n  if(n > 0) {\n    ne /= n;                 /* Average index gap between maxima */\n    i = IF(isrow, lp->columns, lp->rows);\n    nb = i / ne;             /* Another estimated block count */\n    if(abs(nb - n) > 2)      /* Probably Ok to require equality (nb==n)*/\n      n = 1;\n    else if(autodefine)      /* Generate row/column break-indeces for partial pricing */\n      set_partialprice(lp, nb, NULL, isrow);\n  }\n  else\n    n = 1;\n\n  return( n );\n}\nSTATIC int partial_blockStart(lprec *lp, MYBOOL isrow)\n{\n  partialrec *blockdata;\n\n  blockdata = IF(isrow, lp->rowblocks, lp->colblocks);\n  if(blockdata == NULL)\n    return( 1 );\n  else {\n    if((blockdata->blocknow < 1) || (blockdata->blocknow > blockdata->blockcount))\n      blockdata->blocknow = 1;\n    return( blockdata->blockend[blockdata->blocknow-1] );\n  }\n}\nSTATIC int partial_blockEnd(lprec *lp, MYBOOL isrow)\n{\n  partialrec *blockdata;\n\n  blockdata = IF(isrow, lp->rowblocks, lp->colblocks);\n  if(blockdata == NULL)\n    return( IF(isrow, lp->rows, lp->sum) );\n  else {\n    if((blockdata->blocknow < 1) || (blockdata->blocknow > blockdata->blockcount))\n      blockdata->blocknow = 1;\n    return( blockdata->blockend[blockdata->blocknow]-1 );\n  }\n}\nSTATIC int partial_blockNextPos(lprec *lp, int block, MYBOOL isrow)\n{\n  partialrec *blockdata;\n\n  blockdata = IF(isrow, lp->rowblocks, lp->colblocks);\n#ifdef Paranoia\n  if((blockdata == NULL) || (block <= 1) || (block > blockdata->blockcount)) {\n    report(lp, SEVERE, \"partial_blockNextPos: Invalid block %d specified.\\n\",\n                       block);\n    return( -1 );\n  }\n#endif\n  block--;\n  if(blockdata->blockpos[block] == blockdata->blockend[block+1])\n    blockdata->blockpos[block] = blockdata->blockend[block];\n  else\n    blockdata->blockpos[block]++;\n  return( blockdata->blockpos[block] );\n}\nSTATIC MYBOOL partial_blockStep(lprec *lp, MYBOOL isrow)\n{\n  partialrec *blockdata;\n\n  blockdata = IF(isrow, lp->rowblocks, lp->colblocks);\n  if(blockdata == NULL)\n    return( FALSE );\n  else if(blockdata->blocknow < blockdata->blockcount) {\n    blockdata->blocknow++;\n    return( TRUE);\n  }\n  else {\n    blockdata->blocknow = 1;\n    return( TRUE );\n  }\n}\nSTATIC MYBOOL partial_isVarActive(lprec *lp, int varno, MYBOOL isrow)\n{\n  partialrec *blockdata;\n\n  blockdata = IF(isrow, lp->rowblocks, lp->colblocks);\n  if(blockdata == NULL)\n    return( TRUE );\n  else {\n    return( (MYBOOL) ((varno >= blockdata->blockend[blockdata->blocknow-1]) &&\n                      (varno < blockdata->blockend[blockdata->blocknow])) );\n  }\n}\n\n\n/* Multiple pricing routines */\nSTATIC multirec *multi_create(lprec *lp, MYBOOL truncinf)\n{\n  multirec *multi;\n\n  multi = (multirec *) calloc(1, sizeof(*multi));\n  if(multi != NULL) {\n    multi->active = 1;\n    multi->lp = lp;\n    multi->epszero = lp->epsprimal;\n    multi->truncinf = truncinf;\n  }\n\n  return(multi);\n}\nSTATIC void multi_free(multirec **multi)\n{\n  if((multi == NULL) || (*multi == NULL))\n    return;\n  FREE((*multi)->items);\n  FREE((*multi)->valueList);\n  FREE((*multi)->indexSet);\n  FREE((*multi)->freeList);\n  FREE((*multi)->sortedList);\n  FREE(*multi);\n}\nSTATIC MYBOOL multi_mustupdate(multirec *multi)\n{\n  return( (MYBOOL) ((multi != NULL) &&\n                     (multi->used < multi->limit)) );\n}\nSTATIC MYBOOL multi_resize(multirec *multi, int blocksize, int blockdiv, MYBOOL doVlist, MYBOOL doIset)\n{\n  MYBOOL ok = TRUE;\n\n  if((blocksize > 1) && (blockdiv > 0)) {\n    int oldsize = multi->size;\n\n    multi->size = blocksize;\n    if(blockdiv > 1)\n      multi->limit += (multi->size-oldsize) / blockdiv;\n\n    multi->items = (pricerec *) realloc(multi->items, (multi->size+1)*sizeof(*(multi->items)));\n    multi->sortedList = (UNIONTYPE QSORTrec *) realloc(multi->sortedList, (multi->size+1)*sizeof(*(multi->sortedList)));\n    ok = (multi->items != NULL) && (multi->sortedList != NULL) &&\n         allocINT(multi->lp, &(multi->freeList), multi->size+1, AUTOMATIC);\n    if(ok) {\n      int i, n;\n\n      if(oldsize == 0)\n        i = 0;\n      else\n        i = multi->freeList[0];\n      multi->freeList[0] = i + (multi->size-oldsize);\n      for(n = multi->size - 1, i++; i <= multi->freeList[0]; i++, n--)\n        multi->freeList[i] = n;\n    }\n    if(doVlist)\n      ok &= allocREAL(multi->lp, &(multi->valueList), multi->size+1, AUTOMATIC);\n    if(doIset) {\n      ok &= allocINT(multi->lp, &(multi->indexSet), multi->size+1, AUTOMATIC);\n      if(ok && (oldsize == 0))\n        multi->indexSet[0] = 0;\n    }\n    if(!ok)\n      goto Undo;\n\n  }\n  else {\nUndo:\n    multi->size = 0;\n    FREE(multi->items);\n    FREE(multi->valueList);\n    FREE(multi->indexSet);\n    FREE(multi->freeList);\n    FREE(multi->sortedList);\n  }\n  multi->active = 1;\n\n  return( ok );\n}\n\nSTATIC int multi_size(multirec *multi)\n{\n  if(multi == NULL)\n    return( 0 );\n  else\n    return( multi->size );\n}\n\nSTATIC int multi_used(multirec *multi)\n{\n  if(multi == NULL)\n    return( 0 );\n  else\n    return( multi->used );\n}\n\nSTATIC int multi_restart(multirec *multi)\n{\n  int i, n = multi->used;\n\n  multi->used   = 0;\n  multi->sorted = FALSE;\n  multi->dirty  = FALSE;\n  if(multi->freeList != NULL) {\n    for(i = 1; i <= multi->size; i++)\n      multi->freeList[i] = multi->size - i;\n    multi->freeList[0] = multi->size;\n  }\n#if 0\n  if(multi->indexSet != NULL)\n    multi->indexSet[0] = 0;\n#endif\n  return( n );\n}\n\nSTATIC void multi_valueInit(multirec *multi, REAL step_base, REAL obj_base)\n{\n  multi->step_base = multi->step_last = step_base;\n  multi->obj_base  = multi->obj_last  = obj_base;\n#ifdef Paranoia\n  if(step_base > 0)\n    report(multi->lp, SEVERE, \"multi_valueInit: Positive constraint violation %g provided at iteration %6.0f\\n\",\n                              step_base, (double) get_total_iter(multi->lp));\n#endif\n}\n\nSTATIC REAL *multi_valueList(multirec *multi)\n{\n  return(multi->valueList);\n}\n\nSTATIC int *multi_indexSet(multirec *multi, MYBOOL regenerate)\n{\n  if(regenerate)\n    multi_populateSet(multi, NULL, -1);\n  return(multi->indexSet);\n}\n\nSTATIC int multi_getvar(multirec *multi, int item)\n{\n#ifdef Paranoia\n  if((item < 1) || (item >= multi->size))\n    return(-1);\n#endif\n  return( ((pricerec *) &(multi->sortedList[item].pvoidreal.ptr))->varno );\n}\n\nSTATIC MYBOOL multi_recompute(multirec *multi, int index, MYBOOL isphase2, MYBOOL fullupdate)\n{\n  int      i, n;\n  REAL     lB, uB, Alpha, this_theta, prev_theta;\n  lprec    *lp = multi->lp;\n  pricerec *thisprice;\n\n  /* Define target update window */\n  if(multi->dirty) {\n    index = 0;\n    n = multi->used - 1;\n  }\n  else if(fullupdate)\n    n = multi->used - 1;\n  else\n    n = index;\n\n  /* Initialize accumulators from the specified update index */\n  if(index == 0) {\n    multi->maxpivot = 0;\n    multi->maxbound = 0;\n    multi->step_last = multi->step_base;\n    multi->obj_last  = multi->obj_base;\n    thisprice  = NULL;\n    this_theta  = 0;\n  }\n  else {\n    multi->obj_last  = multi->valueList[index-1];\n    multi->step_last = multi->sortedList[index-1].pvoidreal.realval;\n    thisprice  = (pricerec *) (multi->sortedList[index-1].pvoidreal.ptr);\n    this_theta = thisprice->theta;\n  }\n\n  /* Update step lengths and objective values */\n  while((index <= n) && (multi->step_last < multi->epszero)) {\n\n    /* Update parameters for this loop */\n    prev_theta = this_theta;\n    thisprice  = (pricerec *) (multi->sortedList[index].pvoidreal.ptr);\n    this_theta = thisprice->theta;\n    Alpha = fabs(thisprice->pivot);\n    uB = lp->upbo[thisprice->varno];\n    lB = 0;\n    SETMAX(multi->maxpivot, Alpha);\n    SETMAX(multi->maxbound, uB);\n\n    /* Do the value updates */\n    if(isphase2) {\n      multi->obj_last += (this_theta - prev_theta) * multi->step_last; /* Sign-readjusted from coldual()/Maros */\n      if(uB >= lp->infinite)\n        multi->step_last  = lp->infinite;\n      else\n        multi->step_last += Alpha*(uB-lB);\n    }\n    else {\n      multi->obj_last += (this_theta - prev_theta) * multi->step_last; /* Sign-readjusted from coldual()/Maros */\n      multi->step_last += Alpha;\n    }\n\n    /* Store updated values at the indexed locations */\n    multi->sortedList[index].pvoidreal.realval = multi->step_last;\n    multi->valueList[index] = multi->obj_last;\n#ifdef Paranoia\n    if(lp->spx_trace &&\n       (multi->step_last > lp->infinite))\n      report(lp, SEVERE, \"multi_recompute: A very large step-size %g was generated at iteration %6.0f\\n\",\n                         multi->step_last, (double) get_total_iter(lp));\n#endif\n    index++;\n  }\n\n  /* Discard candidates entered earlier that now make the OF worsen, and\n     make sure that the released positions are added to the free list. */\n  n = index;\n  while(n < multi->used) {\n    i = ++multi->freeList[0];\n    multi->freeList[i] = (int) (((pricerec *) multi->sortedList[n].pvoidreal.ptr) - multi->items);\n    n++;\n  }\n  multi->used  = index;\n  if(multi->sorted && (index == 1))\n    multi->sorted = FALSE;\n  multi->dirty = FALSE;\n\n  /* Return TRUE if the step is now positive */\n  return( (MYBOOL) (multi->step_last >= multi->epszero) );\n}\n\nSTATIC MYBOOL multi_truncatingvar(multirec *multi, int varnr)\n{\n  return( multi->truncinf && is_infinite(multi->lp, multi->lp->upbo[varnr]) );\n}\n\nSTATIC MYBOOL multi_removevar(multirec *multi, int varnr)\n{\n  int i = 1;\n  int *coltarget = multi->indexSet;\n\n  if(coltarget == NULL)\n    return( FALSE );\n\n  while((i <= multi->used) && (coltarget[i] != varnr))\n    i++;\n  if(i > multi->used)\n    return( FALSE );\n\n  for(; i < multi->used; i++)\n    coltarget[i] = coltarget[i+1];\n  coltarget[0]--;\n  multi->used--;\n  multi->dirty = TRUE;\n  return( TRUE );\n}\n\nSTATIC int multi_enteringvar(multirec *multi, pricerec *current, int priority)\n{\n  lprec    *lp = multi->lp;\n  int      i = 0, bestindex, colnr;\n  REAL     bound, score, bestscore = -lp->infinite;\n  REAL     b1, b2, b3;\n  pricerec *candidate, *bestcand;\n\n  /* Check that we have a candidate */\n  multi->active = bestindex = 0;\n  if((multi == NULL) || (multi->used == 0))\n    return( bestindex );\n\n  /* Check for pruning possibility of the B&B tree */\n  if(multi->objcheck && (lp->solutioncount > 0) &&\n     bb_better(lp, OF_WORKING | OF_PROJECTED, OF_TEST_WE)) {\n    lp->spx_status = FATHOMED;\n    return( bestindex );\n  }\n\n  /* Check the trivial case */\n  if(multi->used == 1) {\n    bestcand = (pricerec *) (multi->sortedList[bestindex].pvoidreal.ptr);\n    goto Finish;\n  }\n\n  /* Set priority weights */\nRedo:\n  switch(priority) {\n    case 0:  b1 = 0.0, b2 = 0.0, b3 = 1.0;          /* Only OF          */\n              bestindex = multi->used - 2;   break;\n    case 1:  b1 = 0.2, b2 = 0.3, b3 = 0.5; break;  /* Emphasize OF     */\n    case 2:  b1 = 0.3, b2 = 0.5, b3 = 0.2; break;  /* Emphasize bound  */\n    case 3:  b1 = 0.6, b2 = 0.2, b3 = 0.2; break;  /* Emphasize pivot  */\n    case 4:  b1 = 1.0, b2 = 0.0, b3 = 0.0; break;  /* Only pivot       */\n    default: b1 = 0.4, b2 = 0.2, b3 = 0.4;         /* Balanced default */\n  }\n  bestcand = (pricerec *) (multi->sortedList[bestindex].pvoidreal.ptr);\n\n  /* Loop over all candidates to get the best entering candidate;\n     start at the end to try to maximize the chain length */\n  for(i = multi->used - 1; i >= 0; i--) {\n    candidate = (pricerec *) (multi->sortedList[i].pvoidreal.ptr);\n    colnr = candidate->varno;\n    bound = lp->upbo[colnr];\n    score = fabs(candidate->pivot) / multi->maxpivot;\n    score = pow(1.0 + score                           , b1) *\n            pow(1.0 + log(bound / multi->maxbound + 1), b2) *\n            pow(1.0 + (REAL) i / multi->used          , b3);\n    if(score > bestscore) {\n      bestscore = score;\n      bestindex = i;\n      bestcand  = candidate;\n    }\n  }\n\n  /* Do pivot protection */\n  if((priority < 4) && (fabs(bestcand->pivot) < lp->epssolution)) {\n    bestindex = 0;\n    priority++;\n    goto Redo;\n  }\n\nFinish:\n  /* Make sure we shrink the list and update */\n  multi->active = colnr = bestcand->varno;\n  if(bestindex < multi->used - 1) {\n#if 0\n/*    if(lp->upbo[colnr] >= lp->infinite) */\n    QS_swap(multi->sortedList, bestindex, multi->used-1);\n    multi_recompute(multi, bestindex, (bestcand->isdual == AUTOMATIC), TRUE);\n#else\n    multi->used = i + 1;\n#endif\n  }\n  multi_populateSet(multi, NULL, multi->active);\n\n  /* Compute the entering theta and update parameters */\n  score = (multi->used == 1 ? multi->step_base : multi->sortedList[multi->used-2].pvoidreal.realval);\n  score /= bestcand->pivot;\n  score = my_chsign(!lp->is_lower[multi->active], score);\n\n  if(lp->spx_trace &&\n     (fabs(score) > 1/lp->epsprimal))\n    report(lp, IMPORTANT, \"multi_enteringvar: A very large Theta %g was generated (pivot %g)\\n\",\n                       score, bestcand->pivot);\n  multi->step_base = score;\n  if(current != NULL)\n    *current = *bestcand;\n\n  return( multi->active );\n}\n\nSTATIC REAL multi_enteringtheta(multirec *multi)\n{\n  return( multi->step_base );\n}\n\nSTATIC int multi_populateSet(multirec *multi, int **list, int excludenr)\n{\n  int n = 0;\n  if(list == NULL)\n    list = &(multi->indexSet);\n  if((multi->used > 0) &&\n     ((*list != NULL) || allocINT(multi->lp, list, multi->size+1, FALSE))) {\n    int i, colnr;\n\n    for(i = 0; i < multi->used; i++) {\n      colnr = ((pricerec *) (multi->sortedList[i].pvoidreal.ptr))->varno;\n      if((colnr != excludenr) &&\n        /* Prevent an unbounded variable from \"bound-flip\"; this could\n          actually indicate that we should let the entering variable be\n          bound-swapped (in the case that it is bounded), but we\n          disregard this possibility here, since it brings with it\n          issues of pivot size, etc. */\n        ((excludenr > 0) && (multi->lp->upbo[colnr] < multi->lp->infinite))) {\n        n++;\n        (*list)[n] = colnr;\n      }\n    }\n    (*list)[0] = n;\n  }\n  return( n );\n}\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_price.h",
    "content": "#ifndef HEADER_lp_price\n#define HEADER_lp_price\n\n/* Local defines                                                             */\n/* ------------------------------------------------------------------------- */\n#define UseSortOnBound_Improve\n/*#define UseSortOnBound_Substitute*/\n\n#if 0 /* Stricter feasibility-preserving tolerance; use w/ *_UseRejectionList */\n  #define UseRelativeFeasibility       /* Use machine-precision and A-scale data */\n#endif\n#if 0          /* Stricter pivot-selection criteria; use w/ *UseRejectionList */\n  #define UseRelativePivot_Primal             /* In rowprim based on A-scale data */\n  #define UseRelativePivot_Dual               /* In coldual based on A-scale data */\n#endif\n\n\n/* Include required library headers                                          */\n/* ------------------------------------------------------------------------- */\n#include \"lp_types.h\"\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* Comparison and validity routines */\nint CMP_CALLMODEL compareImprovementVar(const pricerec *current, const pricerec *candidate);\nint CMP_CALLMODEL compareSubstitutionVar(const pricerec *current, const pricerec *candidate);\nint CMP_CALLMODEL compareBoundFlipVar(const pricerec *current, const pricerec *candidate);\nSTATIC int addCandidateVar(pricerec *candidate, multirec *multi, findCompare_func findCompare, MYBOOL allowSortedExpand);\nSTATIC MYBOOL collectMinorVar(pricerec *candidate, multirec *longsteps, MYBOOL isphase2, MYBOOL isbatch);\nSTATIC MYBOOL validImprovementVar(pricerec *candidate);\nSTATIC MYBOOL validSubstitutionVar(pricerec *candidate);\n\n/* Row+column selection routines */\nSTATIC MYBOOL findImprovementVar(pricerec *current, pricerec *candidate, MYBOOL collectMP, int *candidatecount);\nSTATIC MYBOOL findSubstitutionVar(pricerec *current, pricerec *candidate, int *candidatecount);\nINLINE REAL normalizeEdge(lprec *lp, int item, REAL edge, MYBOOL isdual);\nSTATIC void makePriceLoop(lprec *lp, int *start, int *end, int *delta);\n\n/* Computation of reduced costs */\nSTATIC void update_reducedcosts(lprec *lp, MYBOOL isdual, int leave_nr, int enter_nr, REAL *prow, REAL *drow);\nSTATIC void compute_reducedcosts(lprec *lp, MYBOOL isdual, int row_nr, int *coltarget, MYBOOL dosolve,\n                                                            REAL *prow, int *nzprow,\n                                                            REAL *drow, int *nzdrow,\n                                                            int roundmode);\n\n/* Leaving variable selection and entering column pricing loops */\nSTATIC int find_rowReplacement(lprec *lp, int rownr, REAL *prow, int *nzprow);\nSTATIC int colprim(lprec *lp, REAL *drow, int *nzdrow,\n                              MYBOOL skipupdate, int partialloop, int *candidatecount, MYBOOL updateinfeas, REAL *xviol);\nSTATIC int rowprim(lprec *lp, int colnr, LREAL *theta, REAL *pcol, int *nzpcol, MYBOOL forceoutEQ, REAL *xviol);\nSTATIC int rowdual(lprec *lp, REAL *rhvec, MYBOOL forceoutEQ, MYBOOL updateinfeas, REAL *xviol);\nSTATIC int coldual(lprec *lp, int row_nr,\n                              REAL *prow, int *nzprow, REAL *drow, int *nzdrow,\n                              MYBOOL dualphase1, MYBOOL skipupdate,\n                              int *candidatecount, REAL *xviol);\n\n/* Partial pricing management routines */\nSTATIC partialrec *partial_createBlocks(lprec *lp, MYBOOL isrow);\nSTATIC int partial_countBlocks(lprec *lp, MYBOOL isrow);\nSTATIC int partial_activeBlocks(lprec *lp, MYBOOL isrow);\nSTATIC void partial_freeBlocks(partialrec **blockdata);\n\n/* Partial pricing utility routines */\nSTATIC int partial_findBlocks(lprec *lp, MYBOOL autodefine, MYBOOL isrow);\nSTATIC int partial_blockStart(lprec *lp, MYBOOL isrow);\nSTATIC int partial_blockEnd(lprec *lp, MYBOOL isrow);\nSTATIC int partial_blockNextPos(lprec *lp, int block, MYBOOL isrow);\n\nSTATIC MYBOOL partial_blockStep(lprec *lp, MYBOOL isrow);\nSTATIC MYBOOL partial_isVarActive(lprec *lp, int varno, MYBOOL isrow);\n\n/* Multiple pricing / dual long step management routines */\nSTATIC multirec *multi_create(lprec *lp, MYBOOL truncinf);\nSTATIC MYBOOL multi_resize(multirec *multi, int blocksize, int blockdiv, MYBOOL doVlist, MYBOOL doIset);\nSTATIC int multi_restart(multirec *multi);\nSTATIC int multi_size(multirec *multi);\nSTATIC int multi_used(multirec *multi);\nSTATIC MYBOOL multi_truncatingvar(multirec *multi, int varnr);\nSTATIC MYBOOL multi_mustupdate(multirec *multi);\nSTATIC void multi_valueInit(multirec *multi, REAL step_base, REAL obj_base);\nSTATIC REAL *multi_valueList(multirec *multi);\nSTATIC int *multi_indexSet(multirec *multi, MYBOOL regenerate);\nSTATIC int multi_getvar(multirec *multi, int item);\nSTATIC MYBOOL multi_recompute(multirec *multi, int index, MYBOOL isphase2, MYBOOL fullupdate);\nSTATIC MYBOOL multi_removevar(multirec *multi, int varnr);\nSTATIC int multi_enteringvar(multirec *multi, pricerec *current, int priority);\nSTATIC REAL multi_enteringtheta(multirec *multi);\nSTATIC void multi_free(multirec **multi);\nSTATIC int multi_populateSet(multirec *multi, int **list, int excludenr);\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* HEADER_lp_price */\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_pricePSE.c",
    "content": "\n#include <string.h>\n#include \"commonlib.h\"\n#include \"lp_lib.h\"\n#include \"lp_report.h\"\n#include \"lp_pricePSE.h\"\n\n#ifdef FORTIFY\n# include \"lp_fortify.h\"\n#endif\n\n\n/*\n    Advanced simplex price scaling modules - w/interface for lp_solve v5.0+\n   ----------------------------------------------------------------------------------\n    Author:        Kjell Eikland\n    Contact:       kjell.eikland@broadpark.no\n    License terms: LGPL.\n\n    Requires:      lp_lib.h\n\n    Release notes:\n    v1.0.0  1 September 2003    Implementation of DEVEX and STEEPEST EDGE\n                                routines for the primal and dual simplex.\n    v1.0.1  1 January 2004      Made initial value of weight of ingoing\n                                variable for the standard mode of DEVEX\n                                consistent with the initialization at restart;\n                                original version could at worst contribute\n                                to cycling.\n    v1.0.2  23 March 2004       Added floors to Steepest Edge updates and\n                                moved tests for tiny update higher. Previous\n                                logic can be simulated by disabling the compiler\n                                define ApplySteepestEdgeMinimum.\n    v1.1.0  1 July 2004         Renamed from lp_pricerPSE to lp_pricePSE in\n                                conjuction with the creation of a separate\n                                price library.\n    v1.2.0  1 March 2005        Changed memory allocation routines to use\n                                standard lp_solve functions, improve error handling\n                                and return boolean status values.\n\n   ----------------------------------------------------------------------------------\n*/\n\nINLINE MYBOOL applyPricer(lprec *lp)\n{\n  int rule = get_piv_rule(lp);\n  return( (MYBOOL) ((rule == PRICER_DEVEX) || (rule == PRICER_STEEPESTEDGE)) );\n}\n\n\nSTATIC void simplexPricer(lprec *lp, MYBOOL isdual)\n{\n  if(lp->edgeVector != NULL)\n    lp->edgeVector[0] = (REAL) isdual;\n}\n\n\nSTATIC void freePricer(lprec *lp)\n{\n  FREE(lp->edgeVector);\n}\n\n\nSTATIC MYBOOL resizePricer(lprec *lp)\n{\n  if(!applyPricer(lp))\n    return( TRUE );\n\n  /* Reallocate vector for new size */\n  if(!allocREAL(lp, &(lp->edgeVector), lp->sum_alloc+1, AUTOMATIC))\n    return( FALSE );\n\n  /* Signal that we have not yet initialized the price vector */\n  MEMCLEAR(lp->edgeVector, lp->sum_alloc+1);\n  lp->edgeVector[0] = -1;\n  return( TRUE );\n}\n\n\nSTATIC MYBOOL initPricer(lprec *lp)\n{\n  if(!applyPricer(lp))\n    return( FALSE );\n\n  /* Free any pre-existing pricer */\n  freePricer(lp);\n\n  /* Allocate vector to fit current problem size */\n  return( resizePricer(lp) );\n}\n\n\nSTATIC REAL getPricer(lprec *lp, int item, MYBOOL isdual)\n{\n  REAL value = 1.0;\n\n  if(!applyPricer(lp))\n    return( value );\n\n  value = *lp->edgeVector;\n\n  /* Make sure we have a price vector to use */\n  if(value < 0) {\n#ifdef Paranoia\n    report(lp, SEVERE, \"getPricer: Called without having being initialized!\\n\");\n#endif\n    return( 1.0 );\n  }\n  /* We may be calling the primal from the dual (and vice-versa) for validation\n     of feasibility; ignore calling origin and simply return 1 */\n  else if(isdual != value) {\n    return( 1.0 );\n  }\n  /* Do the normal norm retrieval */\n  else {\n\n    if(isdual)\n      item = lp->var_basic[item];\n\n    value = lp->edgeVector[item];\n\n    if(value == 0) {\n      value = 1.0;\n      report(lp, SEVERE, \"getPricer: Detected a zero-valued price at index %d\\n\", item);\n    }\n#ifdef Paranoia\n    else if(value < 0)\n      report(lp, SEVERE, \"getPricer: Invalid %s reduced cost norm %g at index %d\\n\",\n                          my_if(isdual, \"dual\", \"primal\"), value, item);\n#endif\n\n  /* Return the norm */\n    return( sqrt(value) );\n  }\n}\n\nSTATIC MYBOOL restartPricer(lprec *lp, MYBOOL isdual)\n{\n  REAL   *sEdge = NULL, seNorm, hold;\n  int    i, j, m;\n  MYBOOL isDEVEX, ok = applyPricer(lp);\n\n  if(!ok)\n    return( ok );\n\n  /* Store the active/current pricing type */\n  if(isdual == AUTOMATIC)\n    isdual = (MYBOOL) lp->edgeVector[0];\n  else\n    lp->edgeVector[0] = isdual;\n\n  m = lp->rows;\n\n  /* Determine strategy and check if we have strategy fallback for the primal */\n  isDEVEX = is_piv_rule(lp, PRICER_DEVEX);\n  if(!isDEVEX && !isdual)\n    isDEVEX = is_piv_mode(lp, PRICE_PRIMALFALLBACK);\n\n  /* Check if we only need to do the simple DEVEX initialization */\n  if(!is_piv_mode(lp, PRICE_TRUENORMINIT)) {\n    if(isdual) {\n      for(i = 1; i <= m; i++)\n        lp->edgeVector[lp->var_basic[i]] = 1.0;\n    }\n    else {\n      for(i = 1; i <= lp->sum; i++)\n        if(!lp->is_basic[i])\n          lp->edgeVector[i] = 1.0;\n    }\n    return( ok );\n  }\n\n  /* Otherwise do the full Steepest Edge norm initialization */\n  ok = allocREAL(lp, &sEdge, m+1, FALSE);\n  if(!ok)\n    return( ok );\n\n  if(isdual) {\n\n   /* Extract the rows of the basis inverse and compute their squared norms */\n\n    for(i = 1; i <= m; i++) {\n\n      bsolve(lp, i, sEdge, NULL, 0, 0.0);\n\n      /* Compute the edge norm */\n      seNorm = 0;\n      for(j = 1; j <= m; j++) {\n        hold = sEdge[j];\n        seNorm += hold*hold;\n      }\n\n      j = lp->var_basic[i];\n      lp->edgeVector[j] = seNorm;\n    }\n\n  }\n  else {\n\n   /* Solve a=Bb for b over all non-basic variables and compute their squared norms */\n\n    for(i = 1; i <= lp->sum; i++) {\n      if(lp->is_basic[i])\n        continue;\n\n      fsolve(lp, i, sEdge, NULL, 0, 0.0, FALSE);\n\n      /* Compute the edge norm */\n      seNorm = 1;\n      for(j = 1; j <= m; j++) {\n        hold = sEdge[j];\n        seNorm += hold*hold;\n      }\n\n      lp->edgeVector[i] = seNorm;\n    }\n\n  }\n\n  FREE(sEdge);\n\n  return( ok );\n\n}\n\n\nSTATIC MYBOOL formWeights(lprec *lp, int colnr, REAL *pcol, REAL **w)\n/* This computes Bw = a, where B is the basis and a is a column of A */\n{\n  MYBOOL ok = allocREAL(lp, w, lp->rows+1, FALSE);\n\n  if(ok) {\n    if(pcol == NULL)\n      fsolve(lp, colnr, *w, NULL, 0.0, 0.0, FALSE);\n    else {\n      MEMCOPY(*w, pcol, lp->rows+1);\n/*    *w[0] = 0; */ /* Test */\n    }\n  }\n/*\n  if(pcol != NULL) {\n    REAL cEdge, hold;\n    int  i;\n\n    cEdge = 0;\n    for(i = 1; i <= m; i++) {\n      hold = *w[i]-pcol[i];\n      cEdge += hold*hold;\n    }\n    cEdge /= m;\n    cEdge = sqrt(cEdge);\n    if(cEdge > lp->epspivot)\n      report(lp, SEVERE, \"updatePricer: MRS error is %g\\n\", cEdge);\n  }\n*/\n  return(ok);\n}\nSTATIC void freeWeights(REAL *w)\n{\n  FREE(w);\n}\n\n\nSTATIC MYBOOL updatePricer(lprec *lp, int rownr, int colnr, REAL *pcol, REAL *prow, int *nzprow)\n{\n  REAL   *vEdge = NULL, cEdge, hold, *newEdge, *w = NULL;\n  int    i, m, n, exitcol, errlevel = DETAILED;\n  MYBOOL forceRefresh = FALSE, isDual, isDEVEX, ok = FALSE;\n\n  if(!applyPricer(lp))\n    return(ok);\n\n  /* Make sure we have something to update */\n  hold = lp->edgeVector[0];\n  if(hold < 0)\n    return(ok);\n  isDual = (MYBOOL) (hold > 0);\n\n  /* Do common initializations and computations */\n  m = lp->rows;\n  n = lp->sum;\n  isDEVEX = is_piv_rule(lp, PRICER_DEVEX);\n  exitcol = lp->var_basic[rownr];\n\n  /* Solve/copy Bw = a */\n#if 0\n  ok = formWeights(lp, colnr, NULL, &w);  /* Compute from scratch - Experimental */\n#else\n  ok = formWeights(lp, colnr, pcol, &w);  /* Use previously computed values */\n#endif\n  if(!ok)\n    return( ok );\n\n  /* Price norms for the dual simplex - the basic columns */\n  if(isDual) {\n    REAL rw;\n    int  targetcol;\n\n    /* Don't need to compute cross-products with DEVEX */\n    if(!isDEVEX) {\n      ok = allocREAL(lp, &vEdge, m+1, FALSE);\n      if(!ok)\n        return( ok );\n\n    /* Extract the row of the inverse containing the leaving variable\n       and then form the dot products against the other variables, i.e. \"Tau\" */\n#if 0 /* Extract row explicitly */\n      bsolve(lp, rownr, vEdge, 0, 0.0);\n#else /* Reuse previously extracted row data */\n      MEMCOPY(vEdge, prow, m+1);\n      vEdge[0] = 0;\n#endif\n      lp->bfp_ftran_normal(lp, vEdge, NULL);\n    }\n\n    /* Update the squared steepest edge norms; first store some constants */\n    cEdge = lp->edgeVector[exitcol];\n    rw = w[rownr];\n    if(fabs(rw) < lp->epspivot) {\n      forceRefresh = TRUE;\n      goto Finish2;\n    }\n\n   /* Deal with the variable entering the basis to become a new leaving candidate */\n    hold = 1 / rw;\n    lp->edgeVector[colnr] = (hold*hold) * cEdge;\n\n#ifdef Paranoia\n    if(lp->edgeVector[colnr] <= lp->epsmachine)\n      report(lp, errlevel, \"updatePricer: Invalid dual norm %g at entering index %d - iteration %.0f\\n\",\n                           lp->edgeVector[colnr], rownr, (double) (lp->total_iter+lp->current_iter));\n#endif\n\n   /* Then loop over all basic variables, but skip the leaving row */\n    for(i = 1; i <= m; i++) {\n      if(i == rownr)\n        continue;\n      targetcol = lp->var_basic[i];\n      hold = w[i];\n      if(hold == 0)\n        continue;\n      hold /= rw;\n      if(fabs(hold) < lp->epsmachine)\n        continue;\n\n      newEdge = &(lp->edgeVector[targetcol]);\n      *newEdge += (hold*hold) * cEdge;\n      if(isDEVEX) {\n        if((*newEdge) > DEVEX_RESTARTLIMIT) {\n          forceRefresh = TRUE;\n          break;\n        }\n      }\n      else {\n        *newEdge -= 2*hold*vEdge[i];\n#ifdef xxApplySteepestEdgeMinimum\n        SETMAX(*newEdge, hold*hold+1); /* Kludge; use the primal lower bound */\n#else\n        if(*newEdge <= 0) {\n          report(lp, errlevel, \"updatePricer: Invalid dual norm %g at index %d - iteration %.0f\\n\",\n                                *newEdge, i, (double) (lp->total_iter+lp->current_iter));\n          forceRefresh = TRUE;\n          break;\n        }\n#endif\n      }\n    }\n\n\n  }\n  /* Price norms for the primal simplex - the non-basic columns */\n  else {\n\n    REAL *vTemp = NULL, *vAlpha = NULL, cAlpha;\n    int  *coltarget;\n\n    ok = allocREAL(lp, &vTemp, m+1, TRUE) &&\n         allocREAL(lp, &vAlpha, n+1, TRUE);\n    if(!ok)\n      return( ok );\n\n    /* Check if we have strategy fallback for the primal */\n    if(!isDEVEX)\n      isDEVEX = is_piv_mode(lp, PRICE_PRIMALFALLBACK);\n\n    /* Initialize column target array */\n    coltarget = (int *) mempool_obtainVector(lp->workarrays, lp->sum+1, sizeof(*coltarget));\n    ok = get_colIndexA(lp, SCAN_SLACKVARS+SCAN_USERVARS+USE_NONBASICVARS, coltarget, FALSE);\n    if(!ok) {\n      mempool_releaseVector(lp->workarrays, (char *) coltarget, FALSE);\n      return( ok );\n    }\n\n    /* Don't need to compute cross-products with DEVEX */\n    if(!isDEVEX) {\n      ok = allocREAL(lp, &vEdge, n+1, TRUE);\n      if(!ok)\n        return( ok );\n\n      /* Compute v and then N'v */\n      MEMCOPY(vTemp, w, m+1);\n      bsolve(lp, -1, vTemp, NULL, lp->epsmachine*DOUBLEROUND, 0.0);\n      vTemp[0] = 0;\n      prod_xA(lp, coltarget, vTemp, NULL, lp->epsmachine, 0.0,\n                             vEdge, NULL, MAT_ROUNDDEFAULT);\n    }\n\n    /* Compute Sigma and then Alpha */\n    bsolve(lp, rownr, vTemp, NULL, 0*DOUBLEROUND, 0.0);\n    vTemp[0] = 0;\n    prod_xA(lp, coltarget, vTemp, NULL, lp->epsmachine, 0.0,\n                           vAlpha, NULL, MAT_ROUNDDEFAULT);\n    mempool_releaseVector(lp->workarrays, (char *) coltarget, FALSE);\n\n    /* Update the squared steepest edge norms; first store some constants */\n    cEdge = lp->edgeVector[colnr];\n    cAlpha = vAlpha[colnr];\n    if(fabs(cAlpha) < lp->epspivot) {\n      forceRefresh = TRUE;\n      goto Finish1;\n    }\n\n    /* Deal with the variable leaving the basis to become a new entry candidate */\n    hold = 1 / cAlpha;\n    lp->edgeVector[exitcol] = (hold*hold) * cEdge;\n\n#ifdef Paranoia\n    if(lp->edgeVector[exitcol] <= lp->epsmachine)\n      report(lp, errlevel, \"updatePricer: Invalid primal norm %g at leaving index %d - iteration %.0f\\n\",\n                          lp->edgeVector[exitcol], exitcol, (double) (lp->total_iter+lp->current_iter));\n#endif\n\n    /* Then loop over all non-basic variables, but skip the entering column */\n    for(i = 1; i <= lp->sum; i++) {\n      if(lp->is_basic[i] || (i == colnr))\n        continue;\n      hold = vAlpha[i];\n      if(hold == 0)\n        continue;\n      hold /= cAlpha;\n      if(fabs(hold) < lp->epsmachine)\n        continue;\n\n      newEdge = &(lp->edgeVector[i]);\n      *newEdge += (hold*hold) * cEdge;\n      if(isDEVEX) {\n        if((*newEdge) > DEVEX_RESTARTLIMIT) {\n          forceRefresh = TRUE;\n          break;\n        }\n      }\n      else {\n        *newEdge -= 2*hold*vEdge[i];\n#ifdef ApplySteepestEdgeMinimum\n        SETMAX(*newEdge, hold*hold+1);\n#else\n        if(*newEdge < 0) {\n          report(lp, errlevel, \"updatePricer: Invalid primal norm %g at index %d - iteration %.0f\\n\",\n                               *newEdge, i, (double) (lp->total_iter+lp->current_iter));\n          if(lp->spx_trace)\n            report(lp, errlevel, \"Error detail: (RelAlpha=%g, vEdge=%g, cEdge=%g)\\n\", hold, vEdge[i], cEdge);\n          forceRefresh = TRUE;\n          break;\n        }\n#endif\n      }\n    }\n\nFinish1:\n    FREE(vAlpha);\n    FREE(vTemp);\n\n  }\n\nFinish2:\n  FREE(vEdge);\n  freeWeights(w);\n\n  if(forceRefresh)\n    ok = restartPricer(lp, AUTOMATIC);\n  else\n    ok = TRUE;\n\n  return( ok );\n\n}\n\n\nSTATIC MYBOOL verifyPricer(lprec *lp)\n{\n  REAL value;\n  int  i, n;\n  MYBOOL ok = applyPricer(lp);\n\n  if(!ok)\n    return( ok );\n  ok = FALSE;\n\n  /* Verify */\n  if(lp->edgeVector == NULL)\n    return( ok );\n  value = *lp->edgeVector;\n  if(value < 0)\n    return( ok );\n\n  /* Check the primal */\n  n = 1;\n  if(value == 0) {\n\n    for(n = lp->sum; n > 0; n--) {\n      if(lp->is_basic[n])\n        continue;\n      value = lp->edgeVector[n];\n      if(value <= 0)\n        break;\n    }\n  }\n  /* Check the dual */\n  else {\n    for(i = lp->rows; i > 0; i--) {\n      n = lp->var_basic[i];\n      value = lp->edgeVector[n];\n      if(value <= 0)\n        break;\n    }\n  }\n\n  ok = (MYBOOL) (n == 0);\n#ifdef Paranoia\n  if(!ok)\n    report(lp, SEVERE, \"verifyPricer: Invalid norm %g at index %d\\n\",\n                       value, n);\n#endif\n  return( ok );\n}\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_pricePSE.h",
    "content": "#ifndef HEADER_lp_pricePSE\n#define HEADER_lp_pricePSE\n\n#include \"lp_types.h\"\n\n#define ApplySteepestEdgeMinimum\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* Price norm management routines */\nSTATIC MYBOOL initPricer(lprec *lp);\nINLINE MYBOOL applyPricer(lprec *lp);\nSTATIC void simplexPricer(lprec *lp, MYBOOL isdual);\nSTATIC void freePricer(lprec *lp);\nSTATIC MYBOOL resizePricer(lprec *lp);\nSTATIC REAL getPricer(lprec *lp, int item, MYBOOL isdual);\nSTATIC MYBOOL restartPricer(lprec *lp, MYBOOL isdual);\nSTATIC MYBOOL updatePricer(lprec *lp, int rownr, int colnr, REAL *pcol, REAL *prow, int *nzprow);\nSTATIC MYBOOL verifyPricer(lprec *lp);\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* HEADER_lp_pricePSE */\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_report.c",
    "content": "\n/*\n    Mixed integer programming optimization drivers for lp_solve v5.0+\n   ----------------------------------------------------------------------------------\n    Author:        Michel Berkelaar (to lp_solve v3.2),\n                   Kjell Eikland\n    Contact:\n    License terms: LGPL.\n\n    Requires:      stdarg.h, lp_lib.h\n\n    Release notes:\n    v5.0.0 3   1 January 2004      New unit isolating reporting routines.\n    v5.2.0.0   1 December 2005     Addition of Matrix Market writing function.\n\n   ----------------------------------------------------------------------------------\n*/\n\n#include <stdio.h>\n#include <stdarg.h>\n#include <string.h>\n\n#include \"lp_lib.h\"\n#include \"lp_scale.h\"\n#include \"commonlib.h\"\n#include \"lp_report.h\"\n\n#include \"mmio.h\"\n\n#ifdef FORTIFY\n# include \"lp_fortify.h\"\n#endif\n\n/* Define buffer-size controled function mapping */\n# if defined _MSC_VER\n#  define vsnprintf _vsnprintf\n# endif\n\n/* Various reporting functions for lp_solve                                  */\n/* ------------------------------------------------------------------------- */\n\n/* First define general utilties for reporting and output */\nchar * __VACALL explain(lprec *lp, char *format, ...)\n{\n  char buff[DEF_STRBUFSIZE+1];\n  va_list ap;\n\n  va_start(ap, format);\n  vsnprintf(buff, DEF_STRBUFSIZE, format, ap);\n  va_end(ap);\n  allocCHAR(lp, &(lp->ex_status), (int) strlen(buff), AUTOMATIC);\n  strcpy(lp->ex_status, buff);\n  return( lp->ex_status );\n}\nvoid __VACALL report(lprec *lp, int level, char *format, ...)\n{\n  char buff[DEF_STRBUFSIZE+1];\n  va_list ap;\n\n  if(lp == NULL) {\n    va_start(ap, format);\n    vfprintf(stderr, format, ap);\n    va_end(ap);\n  }\n  else if(level <= lp->verbose) {\n    if(lp->writelog != NULL) {\n      va_start(ap, format);\n      vsnprintf(buff, DEF_STRBUFSIZE, format, ap);\n      va_end(ap);\n      lp->writelog(lp, lp->loghandle, buff);\n    }\n    if(lp->outstream != NULL) {\n      va_start(ap, format);\n      vfprintf(lp->outstream, format, ap);\n      va_end(ap);\n      if(lp->outstream != stdout)\n        fflush(lp->outstream);\n    }\n  }\n#ifdef xParanoia\n  if(level == CRITICAL)\n    raise(SIGSEGV);\n#endif\n}\n\nSTATIC void print_indent(lprec *lp)\n{\n  int i;\n\n  report(lp, NEUTRAL, \"%2d\", lp->bb_level);\n  if(lp->bb_level < 50) /* useless otherwise */\n    for(i = lp->bb_level; i > 0; i--)\n      report(lp, NEUTRAL, \"--\");\n  else\n    report(lp, NEUTRAL, \" *** too deep ***\");\n  report(lp, NEUTRAL, \"> \");\n} /* print_indent */\n\nSTATIC void debug_print(lprec *lp, char *format, ...)\n{\n  va_list ap;\n\n  if(lp->bb_trace) {\n    print_indent(lp);\n    if (lp == NULL)\n    {\n      va_start(ap, format);\n      vfprintf(stderr, format, ap);\n      va_end(ap);\n      fputc('\\n', stderr);\n    }\n    else if(lp->debuginfo != NULL)\n    {\n      char buff[DEF_STRBUFSIZE+1];\n      va_start(ap, format);\n      vsnprintf(buff, DEF_STRBUFSIZE, format, ap);\n      va_end(ap);\n      lp->debuginfo(lp, lp->loghandle, buff);\n    }\n  }\n} /* debug_print */\n\nSTATIC void debug_print_solution(lprec *lp)\n{\n  int i;\n\n  if(lp->bb_trace)\n    for (i = lp->rows + 1; i <= lp->sum; i++) {\n      print_indent(lp);\n      report(lp, NEUTRAL, \"%s \" RESULTVALUEMASK \"\\n\",\n                 get_col_name(lp, i - lp->rows),\n                (double)lp->solution[i]);\n    }\n} /* debug_print_solution */\n\nSTATIC void debug_print_bounds(lprec *lp, REAL *upbo, REAL *lowbo)\n{\n  int i;\n\n  if(lp->bb_trace)\n    for(i = lp->rows + 1; i <= lp->sum; i++) {\n      if(lowbo[i] == upbo[i]) {\n        print_indent(lp);\n        report(lp, NEUTRAL, \"%s = \" RESULTVALUEMASK \"\\n\", get_col_name(lp, i - lp->rows),\n                             (double)lowbo[i]);\n      }\n      else {\n        if(lowbo[i] != 0) {\n          print_indent(lp);\n          report(lp, NEUTRAL, \"%s > \" RESULTVALUEMASK \"\\n\", get_col_name(lp, i - lp->rows),\n                               (double)lowbo[i]);\n        }\n        if(upbo[i] != lp->infinite) {\n          print_indent(lp);\n          report(lp, NEUTRAL, \"%s < \" RESULTVALUEMASK \"\\n\", get_col_name(lp, i - lp->rows),\n                               (double)upbo[i]);\n    }\n      }\n    }\n} /* debug_print_bounds */\n\n/* List a vector of LREAL values for the given index range */\nvoid blockWriteLREAL(FILE *output, char *label, LREAL *vector, int first, int last)\n{\n  int i, k = 0;\n\n  fprintf(output, \"%s\", label);\n  fprintf(output, \"\\n\");\n  for(i = first; i <= last; i++) {\n    fprintf(output, \" %18g\", vector[i]);\n    k++;\n    if(my_mod(k, 4) == 0) {\n      fprintf(output, \"\\n\");\n      k = 0;\n    }\n  }\n  if(my_mod(k, 4) != 0)\n    fprintf(output, \"\\n\");\n}\n\n/* List the current user data matrix columns over the selected row range */\nvoid blockWriteAMAT(FILE *output, const char *label, lprec* lp, int first, int last)\n{\n  int    i, j, k = 0;\n  int    nzb, nze, jb;\n  double hold;\n  MATrec *mat = lp->matA;\n\n  if(!mat_validate(mat))\n    return;\n  if(first < 0)\n    first = 0;\n  if(last < 0)\n    last = lp->rows;\n\n  fprintf(output, \"%s\", label);\n  fprintf(output, \"\\n\");\n\n  if(first == 0) {\n    for(j = 1; j <= lp->columns; j++) {\n      hold = get_mat(lp, 0, j);\n      fprintf(output, \" %18g\", hold);\n      k++;\n      if(my_mod(k, 4) == 0) {\n        fprintf(output, \"\\n\");\n        k = 0;\n      }\n    }\n    if(my_mod(k, 4) != 0) {\n      fprintf(output, \"\\n\");\n      k = 0;\n    }\n    first++;\n  }\n  nze = mat->row_end[first-1];\n  for(i = first; i <= last; i++) {\n    nzb = nze;\n    nze = mat->row_end[i];\n    if(nzb >= nze)\n      jb = lp->columns+1;\n    else\n      jb = ROW_MAT_COLNR(nzb);\n    for(j = 1; j <= lp->columns; j++) {\n      if(j < jb)\n        hold = 0;\n      else {\n        hold = get_mat(lp, i, j);\n        nzb++;\n        if(nzb < nze)\n          jb = ROW_MAT_COLNR(nzb);\n        else\n          jb = lp->columns+1;\n      }\n      fprintf(output, \" %18g\", hold);\n      k++;\n      if(my_mod(k, 4) == 0) {\n        fprintf(output, \"\\n\");\n        k = 0;\n      }\n    }\n    if(my_mod(k, 4) != 0) {\n      fprintf(output, \"\\n\");\n      k = 0;\n    }\n  }\n  if(my_mod(k, 4) != 0)\n    fprintf(output, \"\\n\");\n}\n\n/* List the current basis matrix columns over the selected row range */\nvoid blockWriteBMAT(FILE *output, const char *label, lprec* lp, int first, int last)\n{\n  int    i, j, jb, k = 0;\n  double hold;\n\n  if(first < 0)\n    first = 0;\n  if(last < 0)\n    last = lp->rows;\n\n  fprintf(output, \"%s\", label);\n  fprintf(output, \"\\n\");\n\n  for(i = first; i <= last; i++) {\n    for(j = 1; j <= lp->rows; j++) {\n      jb = lp->var_basic[j];\n      if(jb <= lp->rows) {\n        if(jb == i)\n          hold = 1;\n        else\n          hold = 0;\n      }\n      else\n        hold = get_mat(lp, i, j);\n      if(i == 0)\n        modifyOF1(lp, jb, &hold, 1);\n      hold = unscaled_mat(lp, hold, i, jb);\n      fprintf(output, \" %18g\", hold);\n      k++;\n      if(my_mod(k, 4) == 0) {\n        fprintf(output, \"\\n\");\n        k = 0;\n      }\n    }\n    if(my_mod(k, 4) != 0) {\n      fprintf(output, \"\\n\");\n      k = 0;\n    }\n  }\n  if(my_mod(k, 4) != 0)\n    fprintf(output, \"\\n\");\n}\n\n/* Do a generic readable data dump of key lp_solve model variables;\n   principally for run difference and debugging purposes */\nMYBOOL REPORT_debugdump(lprec *lp, char *filename, MYBOOL livedata)\n{\n  FILE   *output = stdout;\n  MYBOOL ok;\n\n  ok = (MYBOOL) ((filename == NULL) || ((output = fopen(filename,\"w\")) != NULL));\n  if(!ok)\n    return(ok);\n  if((filename == NULL) && (lp->outstream != NULL))\n    output = lp->outstream;\n\n  fprintf(output, \"\\nGENERAL INFORMATION\\n-------------------\\n\\n\");\n  fprintf(output, \"Model size:     %d rows (%d equalities, %d Lagrangean), %d columns (%d integers, %d SC, %d SOS, %d GUB)\\n\",\n                  lp->rows, lp->equalities, get_Lrows(lp), lp->columns,\n      lp->int_vars, lp->sc_vars, SOS_count(lp), GUB_count(lp));\n  fprintf(output, \"Data size:      %d model non-zeros, %d invB non-zeros (engine is %s)\\n\",\n                  get_nonzeros(lp), my_if(lp->invB == NULL, 0, lp->bfp_nonzeros(lp, FALSE)), lp->bfp_name());\n  fprintf(output, \"Internal sizes: %d rows allocated, %d columns allocated, %d columns used, %d eta length\\n\",\n                  lp->rows_alloc, lp->columns_alloc, lp->columns, my_if(lp->invB == NULL, 0, lp->bfp_colcount(lp)));\n  fprintf(output, \"Memory use:     %d sparse matrix, %d eta\\n\",\n                  lp->matA->mat_alloc, my_if(lp->invB == NULL, 0, lp->bfp_memallocated(lp)));\n  fprintf(output, \"Parameters:     Maximize=%d, Names used=%d, Scalingmode=%d, Presolve=%d, SimplexPivot=%d\\n\",\n                  is_maxim(lp), lp->names_used, lp->scalemode, lp->do_presolve, lp->piv_strategy);\n  fprintf(output, \"Precision:      EpsValue=%g, EpsPrimal=%g, EpsDual=%g, EpsPivot=%g, EpsPerturb=%g\\n\",\n                  lp->epsvalue, lp->epsprimal, lp->epsdual, lp->epspivot, lp->epsperturb);\n  fprintf(output, \"Stability:      AntiDegen=%d, Improvement=%d, Split variables at=%g\\n\",\n                  lp->improve, lp->anti_degen, lp->negrange);\n  fprintf(output, \"B&B settings:   BB pivot rule=%d, BB branching=%s, BB strategy=%d, Integer precision=%g, MIP gaps=%g,%g\\n\",\n                  lp->bb_rule, my_boolstr(lp->bb_varbranch), lp->bb_floorfirst, lp->epsint, lp->mip_absgap, lp->mip_relgap);\n\n  fprintf(output, \"\\nCORE DATA\\n---------\\n\\n\");\n  blockWriteINT(output,  \"Column starts\", lp->matA->col_end, 0, lp->columns);\n  blockWriteINT(output,  \"row_type\", lp->row_type, 0, lp->rows);\n  blockWriteREAL(output, \"orig_rhs\", lp->orig_rhs, 0, lp->rows);\n  blockWriteREAL(output, \"orig_lowbo\", lp->orig_lowbo, 0, lp->sum);\n  blockWriteREAL(output, \"orig_upbo\", lp->orig_upbo, 0, lp->sum);\n  blockWriteINT(output,  \"row_type\", lp->row_type, 0, lp->rows);\n  blockWriteBOOL(output, \"var_type\", lp->var_type, 0, lp->columns, TRUE);\n  blockWriteAMAT(output, \"A\", lp, 0, lp->rows);\n\n  if(livedata) {\n    fprintf(output, \"\\nPROCESS DATA\\n------------\\n\\n\");\n    blockWriteREAL(output,  \"Active rhs\", lp->rhs, 0, lp->rows);\n    blockWriteINT(output,  \"Basic variables\", lp->var_basic, 0, lp->rows);\n    blockWriteBOOL(output, \"is_basic\", lp->is_basic, 0, lp->sum, TRUE);\n    blockWriteREAL(output, \"lowbo\", lp->lowbo, 0, lp->sum);\n    blockWriteREAL(output, \"upbo\", lp->upbo, 0, lp->sum);\n    if(lp->scalars != NULL)\n      blockWriteREAL(output, \"scalars\", lp->scalars, 0, lp->sum);\n  }\n\n  if(filename != NULL)\n    fclose(output);\n  return(ok);\n}\n\n\n/* High level reports for model results */\n\nvoid REPORT_objective(lprec *lp)\n{\n  if(lp->outstream == NULL)\n    return;\n  if(fabs(lp->best_solution[0]) < 1e-5)\n    fprintf(lp->outstream, \"\\nValue of objective function: %g\\n\", (double)lp->best_solution[0]);\n  else\n    fprintf(lp->outstream, \"\\nValue of objective function: %.8f\\n\", (double)lp->best_solution[0]);\n  fflush(lp->outstream);\n}\n\nvoid REPORT_solution(lprec *lp, int columns)\n{\n  int i, j, n;\n  REAL value;\n  presolveundorec *psundo = lp->presolve_undo;\n  MYBOOL NZonly = (MYBOOL) ((lp->print_sol & AUTOMATIC) > 0);\n\n  if(lp->outstream == NULL)\n    return;\n\n  fprintf(lp->outstream, \"\\nActual values of the variables:\\n\");\n  if(columns <= 0)\n    columns = 2;\n  n = 0;\n  for(i = 1; i <= psundo->orig_columns; i++) {\n    j = psundo->orig_rows + i;\n    value = get_var_primalresult(lp, j);\n    if(NZonly && (fabs(value) < lp->epsprimal))\n      continue;\n    n = (n+1) % columns;\n    fprintf(lp->outstream, \"%-20s %12g\", get_origcol_name(lp, i), (double) value);\n    if(n == 0)\n      fprintf(lp->outstream, \"\\n\");\n    else\n      fprintf(lp->outstream, \"       \");\n  }\n\n  fflush(lp->outstream);\n} /* REPORT_solution */\n\nvoid REPORT_constraints(lprec *lp, int columns)\n{\n  int i, n;\n  REAL value;\n  MYBOOL NZonly = (MYBOOL) ((lp->print_sol & AUTOMATIC) > 0);\n\n  if(lp->outstream == NULL)\n    return;\n\n  if(columns <= 0)\n    columns = 2;\n\n  fprintf(lp->outstream, \"\\nActual values of the constraints:\\n\");\n  n = 0;\n  for(i = 1; i <= lp->rows; i++) {\n    value = (double)lp->best_solution[i];\n    if(NZonly && (fabs(value) < lp->epsprimal))\n      continue;\n    n = (n+1) % columns;\n    fprintf(lp->outstream, \"%-20s %12g\", get_row_name(lp, i), value);\n    if(n == 0)\n      fprintf(lp->outstream, \"\\n\");\n    else\n      fprintf(lp->outstream, \"       \");\n  }\n\n  fflush(lp->outstream);\n}\n\nvoid REPORT_duals(lprec *lp)\n{\n  int i;\n  REAL *duals, *dualsfrom, *dualstill, *objfrom, *objtill, *objfromvalue;\n  MYBOOL ret;\n\n  if(lp->outstream == NULL)\n    return;\n\n  ret = get_ptr_sensitivity_objex(lp, &objfrom, &objtill, &objfromvalue, NULL);\n  if(ret) {\n    fprintf(lp->outstream, \"\\nObjective function limits:\\n\");\n    fprintf(lp->outstream, \"                                 From            Till       FromValue\\n\");\n    for(i = 1; i <= lp->columns; i++)\n      if(!is_splitvar(lp, i))\n        fprintf(lp->outstream, \"%-20s  %15.7g %15.7g %15.7g\\n\", get_col_name(lp, i),\n         (double)objfrom[i - 1], (double)objtill[i - 1], (double)objfromvalue[i - 1]);\n  }\n\n  ret = get_ptr_sensitivity_rhs(lp, &duals, &dualsfrom, &dualstill);\n  if(ret) {\n    fprintf(lp->outstream, \"\\nDual values with from - till limits:\\n\");\n    fprintf(lp->outstream, \"                           Dual value            From            Till\\n\");\n    for(i = 1; i <= lp->sum; i++)\n      fprintf(lp->outstream, \"%-20s  %15.7g %15.7g %15.7g\\n\",\n              (i <= lp->rows) ? get_row_name(lp, i) : get_col_name(lp, i - lp->rows),\n              (double)duals[i - 1], (double)dualsfrom[i - 1], (double)dualstill[i - 1]);\n    fflush(lp->outstream);\n  }\n}\n\n/* Printing of sensitivity analysis reports */\nvoid REPORT_extended(lprec *lp)\n{\n  int  i, j;\n  REAL hold;\n  REAL *duals, *dualsfrom, *dualstill, *objfrom, *objtill;\n  MYBOOL ret;\n\n  ret = get_ptr_sensitivity_obj(lp, &objfrom, &objtill);\n  report(lp, NORMAL, \" \\n\");\n  report(lp, NORMAL, \"Primal objective:\\n\");\n  report(lp, NORMAL, \" \\n\");\n  report(lp, NORMAL, \"  Column name                      Value   Objective         Min         Max\\n\");\n  report(lp, NORMAL, \"  --------------------------------------------------------------------------\\n\");\n  for(j = 1; j <= lp->columns; j++) {\n    hold = get_mat(lp,0,j);\n    report(lp, NORMAL, \"  %-25s \" MPSVALUEMASK MPSVALUEMASK MPSVALUEMASK MPSVALUEMASK \"\\n\",\n           get_col_name(lp,j),\n           my_precision(hold,lp->epsprimal),\n           my_precision(hold*lp->best_solution[lp->rows+j],lp->epsprimal),\n           my_precision((ret) ? objfrom[j - 1] : 0.0,lp->epsprimal),\n           my_precision((ret) ? objtill[j - 1] : 0.0,lp->epsprimal));\n  }\n  report(lp, NORMAL, \" \\n\");\n\n  ret = get_ptr_sensitivity_rhs(lp, &duals, &dualsfrom, &dualstill);\n  report(lp, NORMAL, \"Primal variables:\\n\");\n  report(lp, NORMAL, \" \\n\");\n  report(lp, NORMAL, \"  Column name                      Value       Slack         Min         Max\\n\");\n  report(lp, NORMAL, \"  --------------------------------------------------------------------------\\n\");\n  for(j = 1; j <= lp->columns; j++)\n    report(lp, NORMAL, \"  %-25s \" MPSVALUEMASK MPSVALUEMASK MPSVALUEMASK MPSVALUEMASK \"\\n\",\n           get_col_name(lp,j),\n           my_precision(lp->best_solution[lp->rows+j],lp->epsprimal),\n           my_precision(my_inflimit(lp, (ret) ? duals[lp->rows+j-1] : 0.0),lp->epsprimal),\n           my_precision((ret) ? dualsfrom[lp->rows+j-1] : 0.0,lp->epsprimal),\n           my_precision((ret) ? dualstill[lp->rows+j-1] : 0.0,lp->epsprimal));\n\n  report(lp, NORMAL, \" \\n\");\n  report(lp, NORMAL, \"Dual variables:\\n\");\n  report(lp, NORMAL, \" \\n\");\n  report(lp, NORMAL, \"  Row name                         Value       Slack         Min         Max\\n\");\n  report(lp, NORMAL, \"  --------------------------------------------------------------------------\\n\");\n  for(i = 1; i <= lp->rows; i++)\n    report(lp, NORMAL, \"  %-25s \" MPSVALUEMASK MPSVALUEMASK MPSVALUEMASK MPSVALUEMASK \"\\n\",\n           get_row_name(lp,i),\n           my_precision((ret) ? duals[i - 1] : 0.0, lp->epsprimal),\n           my_precision(lp->best_solution[i], lp->epsprimal),\n           my_precision((ret) ? dualsfrom[i - 1] : 0.0,lp->epsprimal),\n           my_precision((ret) ? dualstill[i - 1] : 0.0,lp->epsprimal));\n\n  report(lp, NORMAL, \" \\n\");\n}\n\n/* A more readable lp-format report of the model; antiquated and not updated */\nvoid REPORT_lp(lprec *lp)\n{\n  int  i, j;\n\n  if(lp->outstream == NULL)\n    return;\n\n  fprintf(lp->outstream, \"Model name: %s\\n\", get_lp_name(lp));\n  fprintf(lp->outstream, \"          \");\n\n  for(j = 1; j <= lp->columns; j++)\n    fprintf(lp->outstream, \"%8s \", get_col_name(lp,j));\n\n  fprintf(lp->outstream, \"\\n%simize  \", (is_maxim(lp) ? \"Max\" : \"Min\"));\n  for(j = 1; j <= lp->columns; j++)\n      fprintf(lp->outstream, \"%8g \", get_mat(lp, 0, j));\n  fprintf(lp->outstream, \"\\n\");\n\n  for(i = 1; i <= lp->rows; i++) {\n    fprintf(lp->outstream, \"%-9s \", get_row_name(lp, i));\n    for(j = 1; j <= lp->columns; j++)\n      fprintf(lp->outstream, \"%8g \", get_mat(lp, i, j));\n    if(is_constr_type(lp, i, GE))\n      fprintf(lp->outstream, \">= \");\n    else if(is_constr_type(lp, i, LE))\n      fprintf(lp->outstream, \"<= \");\n    else\n      fprintf(lp->outstream, \" = \");\n    fprintf(lp->outstream, \"%8g\", get_rh(lp, i));\n\n    if(is_constr_type(lp, i, GE)) {\n      if(get_rh_upper(lp, i) < lp->infinite)\n        fprintf(lp->outstream, \"  %s = %8g\", \"upbo\", get_rh_upper(lp, i));\n    }\n    else if(is_constr_type(lp, i, LE)) {\n      if(get_rh_lower(lp, i) > -lp->infinite)\n        fprintf(lp->outstream, \"  %s = %8g\", \"lowbo\", get_rh_lower(lp, i));\n    }\n    fprintf(lp->outstream, \"\\n\");\n  }\n\n  fprintf(lp->outstream, \"Type      \");\n  for(i = 1; i <= lp->columns; i++) {\n    if(is_int(lp,i))\n      fprintf(lp->outstream, \"     Int \");\n    else\n      fprintf(lp->outstream, \"    Real \");\n  }\n\n  fprintf(lp->outstream, \"\\nupbo      \");\n  for(i = 1; i <= lp->columns; i++)\n    if(get_upbo(lp, i) >= lp->infinite)\n      fprintf(lp->outstream, \"     Inf \");\n    else\n      fprintf(lp->outstream, \"%8g \", get_upbo(lp, i));\n  fprintf(lp->outstream, \"\\nlowbo     \");\n  for(i = 1; i <= lp->columns; i++)\n    if(get_lowbo(lp, i) <= -lp->infinite)\n      fprintf(lp->outstream, \"    -Inf \");\n    else\n      fprintf(lp->outstream, \"%8g \", get_lowbo(lp, i));\n  fprintf(lp->outstream, \"\\n\");\n\n  fflush(lp->outstream);\n}\n\n/* Report the scaling factors used; extremely rarely used */\nvoid REPORT_scales(lprec *lp)\n{\n  int i, colMax;\n\n  colMax = lp->columns;\n\n  if(lp->outstream == NULL)\n    return;\n\n  if(lp->scaling_used) {\n    fprintf(lp->outstream, \"\\nScale factors:\\n\");\n    for(i = 0; i <= lp->rows + colMax; i++)\n      fprintf(lp->outstream, \"%-20s scaled at %g\\n\",\n              (i <= lp->rows) ? get_row_name(lp, i) : get_col_name(lp, i - lp->rows),\n        (double)lp->scalars[i]);\n  }\n  fflush(lp->outstream);\n}\n\n/* Report the traditional tableau corresponding to the current basis */\nMYBOOL REPORT_tableau(lprec *lp)\n{\n  int  j, row_nr, *coltarget;\n  REAL *prow = NULL;\n  FILE *stream = lp->outstream;\n\n  if(lp->outstream == NULL)\n    return(FALSE);\n\n  if(!lp->model_is_valid || !has_BFP(lp) ||\n     (get_total_iter(lp) == 0) || (lp->spx_status == NOTRUN)) {\n    lp->spx_status = NOTRUN;\n    return(FALSE);\n  }\n  if(!allocREAL(lp, &prow,lp->sum + 1, TRUE)) {\n    lp->spx_status = NOMEMORY;\n    return(FALSE);\n  }\n\n  fprintf(stream, \"\\n\");\n  fprintf(stream, \"Tableau at iter %.0f:\\n\", (double) get_total_iter(lp));\n\n  for(j = 1; j <= lp->sum; j++)\n    if (!lp->is_basic[j])\n      fprintf(stream, \"%15d\", (j <= lp->rows ?\n                               (j + lp->columns) * ((lp->orig_upbo[j] == 0) ||\n                                                    (is_chsign(lp, j)) ? 1 : -1) : j - lp->rows) *\n                              (lp->is_lower[j] ? 1 : -1));\n  fprintf(stream, \"\\n\");\n\n  coltarget = (int *) mempool_obtainVector(lp->workarrays, lp->columns+1, sizeof(*coltarget));\n  if(!get_colIndexA(lp, SCAN_USERVARS+USE_NONBASICVARS, coltarget, FALSE)) {\n    mempool_releaseVector(lp->workarrays, (char *) coltarget, FALSE);\n    return(FALSE);\n  }\n  for(row_nr = 1; (row_nr <= lp->rows + 1); row_nr++) {\n    if (row_nr <= lp->rows)\n      fprintf(stream, \"%3d\", (lp->var_basic[row_nr] <= lp->rows ?\n                              (lp->var_basic[row_nr] + lp->columns) * ((lp->orig_upbo[lp->var_basic [row_nr]] == 0) ||\n                                                                       (is_chsign(lp, lp->var_basic[row_nr])) ? 1 : -1) : lp->var_basic[row_nr] - lp->rows) *\n                             (lp->is_lower[lp->var_basic [row_nr]] ? 1 : -1));\n    else\n      fprintf(stream, \"   \");\n    bsolve(lp, row_nr <= lp->rows ? row_nr : 0, prow, NULL, lp->epsmachine*DOUBLEROUND, 1.0);\n    prod_xA(lp, coltarget, prow, NULL, lp->epsmachine, 1.0,\n                                       prow, NULL, MAT_ROUNDDEFAULT);\n\n    for(j = 1; j <= lp->rows + lp->columns; j++)\n      if (!lp->is_basic[j])\n        fprintf(stream, \"%15.7f\", prow[j] * (lp->is_lower[j] ? 1 : -1) *\n                                            (row_nr <= lp->rows ? 1 : -1));\n    fprintf(stream, \"%15.7f\", lp->rhs[row_nr <= lp->rows ? row_nr : 0] *\n                              (double) ((row_nr <= lp->rows) || (is_maxim(lp)) ? 1 : -1));\n    fprintf(stream, \"\\n\");\n  }\n  fflush(stream);\n\n  mempool_releaseVector(lp->workarrays, (char *) coltarget, FALSE);\n  FREE(prow);\n  return(TRUE);\n}\n\nvoid REPORT_constraintinfo(lprec *lp, char *datainfo)\n{\n  int i, tally[ROWCLASS_MAX+1];\n\n  MEMCLEAR(tally, ROWCLASS_MAX+1);\n  for(i = 1; i <= lp->rows; i++)\n    tally[get_constr_class(lp, i)]++;\n\n  if(datainfo != NULL)\n    report(lp, NORMAL, \"%s\\n\", datainfo);\n\n  for(i = 0; i <= ROWCLASS_MAX; i++)\n    if(tally[i] > 0)\n      report(lp, NORMAL, \"%-15s %4d\\n\", get_str_constr_class(lp, i), tally[i]);\n}\n\nvoid REPORT_modelinfo(lprec *lp, MYBOOL doName, char *datainfo)\n{\n  if(doName) {\n    report(lp, NORMAL, \"\\nModel name:  '%s' - run #%-5d\\n\",\n                       get_lp_name(lp), lp->solvecount);\n    report(lp, NORMAL, \"Objective:   %simize(%s)\\n\",\n                       my_if(is_maxim(lp), \"Max\", \"Min\"), get_row_name(lp, 0));\n    report(lp, NORMAL, \" \\n\");\n  }\n  if(datainfo != NULL)\n    report(lp, NORMAL, \"%s\\n\", datainfo);\n\n  report(lp, NORMAL, \"Model size:  %7d constraints, %7d variables, %12d non-zeros.\\n\",\n         lp->rows, lp->columns, get_nonzeros(lp));\n  if(GUB_count(lp)+SOS_count(lp) > 0)\n  report(lp, NORMAL, \"Var-types:   %7d integer,     %7d semi-cont.,     %7d SOS.\\n\",\n         lp->int_vars, lp->sc_vars, lp->sos_vars);\n  report(lp, NORMAL, \"Sets:                             %7d GUB,            %7d SOS.\\n\",\n                         GUB_count(lp), SOS_count(lp));\n}\n\n/* Save a matrix column subset to a MatrixMarket formatted file,\n   say to export the basis matrix for further numerical analysis.\n   If colndx is NULL, then the full constraint matrix is assumed. */\nMYBOOL REPORT_mat_mmsave(lprec *lp, char *filename, int *colndx, MYBOOL includeOF, char *infotext)\n{\n  int         n, m, nz, i, j, k, kk;\n  MATrec      *mat = lp->matA;\n  MM_typecode matcode;\n  FILE        *output = stdout;\n  MYBOOL      ok;\n  REAL        *acol = NULL;\n  int         *nzlist = NULL;\n\n  /* Open file */\n  ok = (MYBOOL) ((filename == NULL) || ((output = fopen(filename,\"w\")) != NULL));\n  if(!ok)\n    return(ok);\n  if((filename == NULL) && (lp->outstream != NULL))\n    output = lp->outstream;\n\n  /* Compute column and non-zero counts */\n  if(colndx == lp->var_basic) {\n    if(!lp->basis_valid)\n      return( FALSE );\n    m = lp->rows;\n  }\n  else if(colndx != NULL)\n    m = colndx[0];\n  else\n    m = lp->columns;\n  n = lp->rows;\n  nz = 0;\n\n  for(j = 1; j <= m; j++) {\n    k = (colndx == NULL ? n + j : colndx[j]);\n    if(k > n) {\n      k -= lp->rows;\n      nz += mat_collength(mat, k);\n      if(includeOF && is_OF_nz(lp, k))\n        nz++;\n    }\n    else\n      nz++;\n  }\n  kk = 0;\n  if(includeOF) {\n    n++;   /* Row count */\n    kk++;  /* Row index offset */\n  }\n\n  /* Initialize */\n  mm_initialize_typecode(&matcode);\n  mm_set_matrix(&matcode);\n  mm_set_coordinate(&matcode);\n  mm_set_real(&matcode);\n\n  mm_write_banner(output, matcode);\n  mm_write_mtx_crd_size(output, n+kk, m, nz+(colndx == lp->var_basic ? 1 : 0));\n\n  /* Allocate working arrays for sparse column storage */\n  allocREAL(lp, &acol, n+2, FALSE);\n  allocINT(lp, &nzlist, n+2, FALSE);\n\n  /* Write the matrix non-zero values column-by-column.\n     NOTE: matrixMarket files use 1-based indeces,\n     i.e. first row of a vector has index 1, not 0. */\n  if(infotext != NULL) {\n    fprintf(output, \"%%\\n\");\n    fprintf(output, \"%% %s\\n\", infotext);\n    fprintf(output, \"%%\\n\");\n  }\n  if(includeOF && (colndx == lp->var_basic))\n    fprintf(output, \"%d %d %g\\n\", 1, 1, 1.0);\n  for(j = 1; j <= m; j++) {\n    k = (colndx == NULL ? lp->rows + j : colndx[j]);\n    if(k == 0)\n      continue;\n    nz = obtain_column(lp, k, acol, nzlist, NULL);\n    for(i = 1; i <= nz; i++) {\n      if(!includeOF && (nzlist[i] == 0))\n        continue;\n      fprintf(output, \"%d %d %g\\n\", nzlist[i]+kk, j+kk, acol[i]);\n    }\n  }\n  fprintf(output, \"%% End of MatrixMarket file\\n\");\n\n  /* Finish */\n  FREE(acol);\n  FREE(nzlist);\n  fclose(output);\n\n  return(ok);\n}\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_report.h",
    "content": "#ifndef HEADER_lp_report\n#define HEADER_lp_report\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* General information functions */\nchar * __VACALL explain(lprec *lp, char *format, ...);\nvoid __VACALL report(lprec *lp, int level, char *format, ...);\n\n/* Prototypes for debugging and general data dumps */\nvoid debug_print(lprec *lp, char *format, ...);\nvoid debug_print_solution(lprec *lp);\nvoid debug_print_bounds(lprec *lp, REAL *upbo, REAL *lowbo);\nvoid blockWriteLREAL(FILE *output, char *label, LREAL *vector, int first, int last);\nvoid blockWriteAMAT(FILE *output, const char *label, lprec* lp, int first, int last);\nvoid blockWriteBMAT(FILE *output, const char *label, lprec* lp, int first, int last);\n\n\n/* Model reporting headers */\nvoid REPORT_objective(lprec *lp);\nvoid REPORT_solution(lprec *lp, int columns);\nvoid REPORT_constraints(lprec *lp, int columns);\nvoid REPORT_duals(lprec *lp);\nvoid REPORT_extended(lprec *lp);\n\n/* Other rarely used, but sometimes extremely useful reports */\nvoid REPORT_constraintinfo(lprec *lp, char *datainfo);\nvoid REPORT_modelinfo(lprec *lp, MYBOOL doName, char *datainfo);\nvoid REPORT_lp(lprec *lp);\nMYBOOL REPORT_tableau(lprec *lp);\nvoid REPORT_scales(lprec *lp);\nMYBOOL REPORT_debugdump(lprec *lp, char *filename, MYBOOL livedata);\nMYBOOL REPORT_mat_mmsave(lprec *lp, char *filename, int *colndx, MYBOOL includeOF, char *infotext);\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* HEADER_lp_report */\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_rlp.c",
    "content": "/* A Bison parser, made by GNU Bison 2.3.  */\n\n/* Skeleton implementation for Bison's Yacc-like parsers in C\n\n   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006\n   Free Software Foundation, Inc.\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 2, or (at your option)\n   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, write to the Free Software\n   Foundation, Inc., 51 Franklin Street, Fifth Floor,\n   Boston, MA 02110-1301, USA.  */\n\n/* As a special exception, you may create a larger work that contains\n   part or all of the Bison parser skeleton and distribute that work\n   under terms of your choice, so long as that work isn't itself a\n   parser generator using the skeleton or a modified version thereof\n   as a parser skeleton.  Alternatively, if you modify or redistribute\n   the parser skeleton itself, you may (at your option) remove this\n   special exception, which will cause the skeleton and the resulting\n   Bison output files to be licensed under the GNU General Public\n   License without this special exception.\n\n   This special exception was added by the Free Software Foundation in\n   version 2.2 of Bison.  */\n\n/* C LALR(1) parser skeleton written by Richard Stallman, by\n   simplifying the original so-called \"semantic\" parser.  */\n\n/* All symbols defined below should begin with lp_yy or YY, to avoid\n   infringing on user name space.  This should be done even for local\n   variables, as they might otherwise be expanded by user macros.\n   There are some unavoidable exceptions within include files to\n   define necessary library symbols; they are noted \"INFRINGES ON\n   USER NAME SPACE\" below.  */\n\n/* Identify Bison output.  */\n#define YYBISON 1\n\n/* Bison version.  */\n#define YYBISON_VERSION \"2.3\"\n\n/* Skeleton name.  */\n#define YYSKELETON_NAME \"yacc.c\"\n\n/* Pure parsers.  */\n#define YYPURE 1\n\n/* Using locations.  */\n#define YYLSP_NEEDED 0\n\n\n\n/* Tokens.  */\n#ifndef YYTOKENTYPE\n# define YYTOKENTYPE\n   /* Put the tokens into the symbol table, so that GDB and other debuggers\n      know about them.  */\n   enum lp_yytokentype {\n     VAR = 258,\n     CONS = 259,\n     INTCONS = 260,\n     VARIABLECOLON = 261,\n     INF = 262,\n     SEC_INT = 263,\n     SEC_BIN = 264,\n     SEC_SEC = 265,\n     SEC_SOS = 266,\n     SOSDESCR = 267,\n     SEC_FREE = 268,\n     TOK_SIGN = 269,\n     AR_M_OP = 270,\n     RE_OPEQ = 271,\n     RE_OPLE = 272,\n     RE_OPGE = 273,\n     END_C = 274,\n     COMMA = 275,\n     COLON = 276,\n     MINIMISE = 277,\n     MAXIMISE = 278,\n     UNDEFINED = 279\n   };\n#endif\n/* Tokens.  */\n#define VAR 258\n#define CONS 259\n#define INTCONS 260\n#define VARIABLECOLON 261\n#define INF 262\n#define SEC_INT 263\n#define SEC_BIN 264\n#define SEC_SEC 265\n#define SEC_SOS 266\n#define SOSDESCR 267\n#define SEC_FREE 268\n#define TOK_SIGN 269\n#define AR_M_OP 270\n#define RE_OPEQ 271\n#define RE_OPLE 272\n#define RE_OPGE 273\n#define END_C 274\n#define COMMA 275\n#define COLON 276\n#define MINIMISE 277\n#define MAXIMISE 278\n#define UNDEFINED 279\n\n\n\n\n/* Copy the first part of user declarations.  */\n\n\n#include <stdlib.h>\n#include <string.h>\n#include <ctype.h>\n\n#define scanner lp_yyscanner\n#define PARM lp_yyget_extra(lp_yyscanner)\n#define YYSTYPE int\n#define YY_EXTRA_TYPE parse_parm *\n#define YY_FATAL_ERROR(msg) lex_fatal_error(PARM, lp_yyscanner, msg)\n#undef YY_INPUT\n#define YY_INPUT(buf,result,max_size) result = lp_input((void *) PARM, buf, max_size);\n#define lp_yyerror read_error\n\n#include \"lpkit.h\"\n#include \"yacc_read.h\"\n\ntypedef struct parse_vars_s\n{\n  read_modeldata_func *lp_input;\n  void *userhandle;\n  char HadVar, HadVar0, HadVar1, HadVar2, HasAR_M_OP, HadConstraint, Had_lineair_sum, Had_lineair_sum0, do_add_row, HadSign, OP, Sign, isign, isign0, make_neg;\n  char state, state0;\n  char Within_int_decl;  /* TRUE when we are within an char declaration */\n  char Within_bin_decl;  /* TRUE when we are within an bin declaration */\n  char Within_sec_decl;  /* TRUE when we are within a sec declaration */\n  char Within_sos_decl;  /* TRUE when we are within a sos declaration */\n  char Within_sos_decl1;\n  char Within_free_decl; /* TRUE when we are within a free declaration */\n  short SOStype, SOStype0;        /* SOS type */\n  int SOSNr;\n  int SOSweight;         /* SOS weight */\n  char *Last_var, *Last_var0;\n  REAL f, f0, f1;\n} parse_vars;\n\n#ifdef FORTIFY\n# include \"lp_fortify.h\"\n#endif\n\n/* let's please C++ users */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if defined MSDOS || defined __MSDOS__ || defined WINDOWS || defined _WINDOWS || defined WIN32 || defined _WIN32\n#define YY_NO_UNISTD_H\n\nstatic int isatty(int f)\n{\n  return(FALSE);\n}\n\n#if !defined _STDLIB_H\n# define _STDLIB_H\n#endif\n#endif\n\nstatic int __WINAPI lp_input_lp_yyin(void *fpin, char *buf, int max_size)\n{\n  int result;\n\n  result = fread( (char*)buf, sizeof(char), max_size, (FILE *)fpin);\n\n  return(result);\n}\n\nstatic int __WINAPI lp_input(void *vpp, char *buf, int max_size)\n{\n  parse_parm *pp = (parse_parm *) vpp;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n  int result;\n\n  result = pv->lp_input(pv->userhandle, buf, max_size);\n  if (result < 0)\n    lex_fatal_error(pp, pp->scanner, \"read() in flex scanner failed\");\n  return(result);\n}\n\n#ifdef __cplusplus\n};\n#endif\n\n#include \"lp_rlp.h\"\n\n#undef lp_yylval\n\n\n\n/* Enabling traces.  */\n#ifndef YYDEBUG\n# define YYDEBUG 0\n#endif\n\n/* Enabling verbose error messages.  */\n#ifdef YYERROR_VERBOSE\n# undef YYERROR_VERBOSE\n# define YYERROR_VERBOSE 1\n#else\n# define YYERROR_VERBOSE 0\n#endif\n\n/* Enabling the token table.  */\n#ifndef YYTOKEN_TABLE\n# define YYTOKEN_TABLE 0\n#endif\n\n#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED\ntypedef int YYSTYPE;\n# define lp_yystype YYSTYPE /* obsolescent; will be withdrawn */\n# define YYSTYPE_IS_DECLARED 1\n# define YYSTYPE_IS_TRIVIAL 1\n#endif\n\n\n\n/* Copy the second part of user declarations.  */\n\n\n/* Line 216 of yacc.c.  */\n\n\n#ifdef short\n# undef short\n#endif\n\n#ifdef YYTYPE_UINT8\ntypedef YYTYPE_UINT8 lp_yytype_uint8;\n#else\ntypedef unsigned char lp_yytype_uint8;\n#endif\n\n#ifdef YYTYPE_INT8\ntypedef YYTYPE_INT8 lp_yytype_int8;\n#elif (defined __STDC__ || defined __C99__FUNC__ \\\n     || defined __cplusplus || defined _MSC_VER)\ntypedef signed char lp_yytype_int8;\n#else\ntypedef short int lp_yytype_int8;\n#endif\n\n#ifdef YYTYPE_UINT16\ntypedef YYTYPE_UINT16 lp_yytype_uint16;\n#else\ntypedef unsigned short int lp_yytype_uint16;\n#endif\n\n#ifdef YYTYPE_INT16\ntypedef YYTYPE_INT16 lp_yytype_int16;\n#else\ntypedef short int lp_yytype_int16;\n#endif\n\n#ifndef YYSIZE_T\n# ifdef __SIZE_TYPE__\n#  define YYSIZE_T __SIZE_TYPE__\n# elif defined size_t\n#  define YYSIZE_T size_t\n# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \\\n     || defined __cplusplus || defined _MSC_VER)\n#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */\n#  define YYSIZE_T size_t\n# else\n#  define YYSIZE_T unsigned int\n# endif\n#endif\n\n#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)\n\n#ifndef YY_\n# if YYENABLE_NLS\n#  if ENABLE_NLS\n#   include <libintl.h> /* INFRINGES ON USER NAME SPACE */\n#   define YY_(msgid) dgettext (\"bison-runtime\", msgid)\n#  endif\n# endif\n# ifndef YY_\n#  define YY_(msgid) msgid\n# endif\n#endif\n\n/* Suppress unused-variable warnings by \"using\" E.  */\n#if ! defined lint || defined __GNUC__\n# define YYUSE(e) ((void) (e))\n#else\n# define YYUSE(e) /* empty */\n#endif\n\n/* Identity function, used to suppress warnings about constant conditions.  */\n#ifndef lint\n# define YYID(n) (n)\n#else\n#if (defined __STDC__ || defined __C99__FUNC__ \\\n     || defined __cplusplus || defined _MSC_VER)\nstatic int\nYYID (int i)\n#else\nstatic int\nYYID (i)\n    int i;\n#endif\n{\n  return i;\n}\n#endif\n\n#if ! defined lp_yyoverflow || YYERROR_VERBOSE\n\n/* The parser invokes alloca or malloc; define the necessary symbols.  */\n\n# ifdef YYSTACK_USE_ALLOCA\n#  if YYSTACK_USE_ALLOCA\n#   ifdef __GNUC__\n#    define YYSTACK_ALLOC __builtin_alloca\n#   elif defined __BUILTIN_VA_ARG_INCR\n#    include <alloca.h> /* INFRINGES ON USER NAME SPACE */\n#   elif defined _AIX\n#    define YYSTACK_ALLOC __alloca\n#   elif defined _MSC_VER\n#    include <malloc.h> /* INFRINGES ON USER NAME SPACE */\n#    define alloca _alloca\n#   else\n#    define YYSTACK_ALLOC alloca\n#    if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \\\n     || defined __cplusplus || defined _MSC_VER)\n#     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */\n#     ifndef _STDLIB_H\n#      define _STDLIB_H 1\n#     endif\n#    endif\n#   endif\n#  endif\n# endif\n\n# ifdef YYSTACK_ALLOC\n   /* Pacify GCC's `empty if-body' warning.  */\n#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))\n#  ifndef YYSTACK_ALLOC_MAXIMUM\n    /* The OS might guarantee only one guard page at the bottom of the stack,\n       and a page size can be as small as 4096 bytes.  So we cannot safely\n       invoke alloca (N) if N exceeds 4096.  Use a slightly smaller number\n       to allow for a few compiler-allocated temporary stack slots.  */\n#   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */\n#  endif\n# else\n#  define YYSTACK_ALLOC YYMALLOC\n#  define YYSTACK_FREE YYFREE\n#  ifndef YYSTACK_ALLOC_MAXIMUM\n#   define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM\n#  endif\n#  if (defined __cplusplus && ! defined _STDLIB_H \\\n       && ! ((defined YYMALLOC || defined malloc) \\\n\t     && (defined YYFREE || defined free)))\n#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */\n#   ifndef _STDLIB_H\n#    define _STDLIB_H 1\n#   endif\n#  endif\n#  ifndef YYMALLOC\n#   define YYMALLOC malloc\n#   if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \\\n     || defined __cplusplus || defined _MSC_VER)\nvoid *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */\n#   endif\n#  endif\n#  ifndef YYFREE\n#   define YYFREE free\n#   if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \\\n     || defined __cplusplus || defined _MSC_VER)\nvoid free (void *); /* INFRINGES ON USER NAME SPACE */\n#   endif\n#  endif\n# endif\n#endif /* ! defined lp_yyoverflow || YYERROR_VERBOSE */\n\n\n#if (! defined lp_yyoverflow \\\n     && (! defined __cplusplus \\\n\t || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))\n\n/* A type that is properly aligned for any stack member.  */\nunion lp_yyalloc\n{\n  lp_yytype_int16 lp_yyss;\n  YYSTYPE lp_yyvs;\n  };\n\n/* The size of the maximum gap between one aligned stack and the next.  */\n# define YYSTACK_GAP_MAXIMUM (sizeof (union lp_yyalloc) - 1)\n\n/* The size of an array large to enough to hold all stacks, each with\n   N elements.  */\n# define YYSTACK_BYTES(N) \\\n     ((N) * (sizeof (lp_yytype_int16) + sizeof (YYSTYPE)) \\\n      + YYSTACK_GAP_MAXIMUM)\n\n/* Copy COUNT objects from FROM to TO.  The source and destination do\n   not overlap.  */\n# ifndef YYCOPY\n#  if defined __GNUC__ && 1 < __GNUC__\n#   define YYCOPY(To, From, Count) \\\n      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))\n#  else\n#   define YYCOPY(To, From, Count)\t\t\\\n      do\t\t\t\t\t\\\n\t{\t\t\t\t\t\\\n\t  YYSIZE_T lp_yyi;\t\t\t\t\\\n\t  for (lp_yyi = 0; lp_yyi < (Count); lp_yyi++)\t\\\n\t    (To)[lp_yyi] = (From)[lp_yyi];\t\t\\\n\t}\t\t\t\t\t\\\n      while (YYID (0))\n#  endif\n# endif\n\n/* Relocate STACK from its old location to the new one.  The\n   local variables YYSIZE and YYSTACKSIZE give the old and new number of\n   elements in the stack, and YYPTR gives the new location of the\n   stack.  Advance YYPTR to a properly aligned location for the next\n   stack.  */\n# define YYSTACK_RELOCATE(Stack)\t\t\t\t\t\\\n    do\t\t\t\t\t\t\t\t\t\\\n      {\t\t\t\t\t\t\t\t\t\\\n\tYYSIZE_T lp_yynewbytes;\t\t\t\t\t\t\\\n\tYYCOPY (&lp_yyptr->Stack, Stack, lp_yysize);\t\t\t\t\\\n\tStack = &lp_yyptr->Stack;\t\t\t\t\t\t\\\n\tlp_yynewbytes = lp_yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \\\n\tlp_yyptr += lp_yynewbytes / sizeof (*lp_yyptr);\t\t\t\t\\\n      }\t\t\t\t\t\t\t\t\t\\\n    while (YYID (0))\n\n#endif\n\n/* YYFINAL -- State number of the termination state.  */\n#define YYFINAL  3\n/* YYLAST -- Last index in YYTABLE.  */\n#define YYLAST   115\n\n/* YYNTOKENS -- Number of terminals.  */\n#define YYNTOKENS  25\n/* YYNNTS -- Number of nonterminals.  */\n#define YYNNTS  56\n/* YYNRULES -- Number of rules.  */\n#define YYNRULES  89\n/* YYNRULES -- Number of states.  */\n#define YYNSTATES  123\n\n/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */\n#define YYUNDEFTOK  2\n#define YYMAXUTOK   279\n\n#define YYTRANSLATE(YYX)\t\t\t\t\t\t\\\n  ((unsigned int) (YYX) <= YYMAXUTOK ? lp_yytranslate[YYX] : YYUNDEFTOK)\n\n/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */\nstatic const lp_yytype_uint8 lp_yytranslate[] =\n{\n       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     1,     2,     3,     4,\n       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,\n      15,    16,    17,    18,    19,    20,    21,    22,    23,    24\n};\n\n#if YYDEBUG\n/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in\n   YYRHS.  */\nstatic const lp_yytype_uint8 lp_yyprhs[] =\n{\n       0,     0,     3,     4,     5,    10,    13,    16,    18,    21,\n      23,    25,    27,    29,    31,    34,    36,    37,    41,    42,\n      43,    44,    53,    55,    56,    57,    63,    65,    67,    69,\n      70,    74,    75,    78,    80,    83,    86,    88,    89,    93,\n      95,    97,    99,   102,   104,   106,   108,   110,   112,   114,\n     116,   118,   120,   122,   124,   127,   129,   131,   133,   135,\n     137,   138,   142,   143,   149,   151,   154,   156,   157,   161,\n     163,   164,   169,   171,   174,   176,   178,   180,   184,   186,\n     188,   190,   191,   193,   195,   198,   202,   205,   208,   211\n};\n\n/* YYRHS -- A `-1'-separated list of the rules' RHS.  */\nstatic const lp_yytype_int8 lp_yyrhs[] =\n{\n      27,     0,    -1,    -1,    -1,    28,    29,    32,    58,    -1,\n      23,    30,    -1,    22,    30,    -1,    30,    -1,    31,    19,\n      -1,    26,    -1,    46,    -1,    26,    -1,    33,    -1,    34,\n      -1,    33,    34,    -1,    36,    -1,    -1,     6,    35,    36,\n      -1,    -1,    -1,    -1,    43,    37,    52,    38,    44,    39,\n      40,    19,    -1,    26,    -1,    -1,    -1,    52,    41,    53,\n      42,    57,    -1,    26,    -1,    44,    -1,    46,    -1,    -1,\n       7,    45,    57,    -1,    -1,    47,    48,    -1,    49,    -1,\n      48,    49,    -1,    55,    50,    -1,    54,    -1,    -1,    56,\n      51,     3,    -1,    16,    -1,    17,    -1,    18,    -1,    55,\n      54,    -1,     7,    -1,     5,    -1,     4,    -1,    26,    -1,\n      14,    -1,    26,    -1,    15,    -1,    26,    -1,    26,    -1,\n      59,    -1,    61,    -1,    59,    61,    -1,     8,    -1,     9,\n      -1,    10,    -1,    11,    -1,    13,    -1,    -1,    60,    62,\n      65,    -1,    -1,    64,    66,    71,    68,    19,    -1,    63,\n      -1,    65,    63,    -1,    26,    -1,    -1,    12,    67,    77,\n      -1,    26,    -1,    -1,    17,     5,    69,    70,    -1,    26,\n      -1,    21,     5,    -1,    26,    -1,    72,    -1,    78,    -1,\n      72,    73,    78,    -1,    26,    -1,    20,    -1,    26,    -1,\n      -1,    26,    -1,    26,    -1,     3,    74,    -1,     6,    75,\n      79,    -1,    54,    76,    -1,    77,    80,    -1,     3,    74,\n      -1,     6,    75,    54,    76,    -1\n};\n\n/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */\nstatic const lp_yytype_uint16 lp_yyrline[] =\n{\n       0,   116,   116,   120,   120,   145,   149,   153,   156,   170,\n     171,   201,   202,   205,   206,   210,   212,   211,   224,   232,\n     242,   223,   288,   298,   311,   297,   342,   355,   364,   366,\n     365,   376,   376,   400,   401,   405,   444,   452,   451,   470,\n     470,   470,   473,   475,   489,   489,   492,   500,   510,   517,\n     526,   547,   548,   551,   552,   555,   555,   555,   555,   555,\n     560,   559,   570,   570,   598,   599,   602,   604,   603,   614,\n     626,   624,   643,   650,   660,   661,   664,   665,   670,   671,\n     674,   703,   724,   749,   770,   772,   777,   779,   784,   786\n};\n#endif\n\n#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE\n/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.\n   First, the terminals, then, starting at YYNTOKENS, nonterminals.  */\nstatic const char *const lp_yytname[] =\n{\n  \"$end\", \"error\", \"$undefined\", \"VAR\", \"CONS\", \"INTCONS\",\n  \"VARIABLECOLON\", \"INF\", \"SEC_INT\", \"SEC_BIN\", \"SEC_SEC\", \"SEC_SOS\",\n  \"SOSDESCR\", \"SEC_FREE\", \"TOK_SIGN\", \"AR_M_OP\", \"RE_OPEQ\", \"RE_OPLE\",\n  \"RE_OPGE\", \"END_C\", \"COMMA\", \"COLON\", \"MINIMISE\", \"MAXIMISE\",\n  \"UNDEFINED\", \"$accept\", \"EMPTY\", \"inputfile\", \"@1\", \"objective_function\",\n  \"real_of\", \"lineair_sum\", \"constraints\", \"x_constraints\", \"constraint\",\n  \"@2\", \"real_constraint\", \"@3\", \"@4\", \"@5\", \"optionalrange\", \"@6\", \"@7\",\n  \"x_lineair_sum2\", \"x_lineair_sum3\", \"@8\", \"x_lineair_sum\", \"@9\",\n  \"x_lineair_sum1\", \"x_lineair_term\", \"x_lineair_term1\", \"@10\", \"RE_OP\",\n  \"cons_term\", \"REALCONS\", \"x_SIGN\", \"optional_AR_M_OP\", \"RHS_STORE\",\n  \"int_bin_sec_sos_free_declarations\", \"real_int_bin_sec_sos_free_decls\",\n  \"SEC_INT_BIN_SEC_SOS_FREE\", \"int_bin_sec_sos_free_declaration\", \"@11\",\n  \"xx_int_bin_sec_sos_free_declaration\", \"@12\",\n  \"x_int_bin_sec_sos_free_declaration\", \"optionalsos\", \"@13\",\n  \"optionalsostype\", \"@14\", \"optionalSOSweight\", \"vars\", \"x_vars\",\n  \"optionalcomma\", \"variable\", \"variablecolon\", \"sosweight\", \"sosdescr\",\n  \"onevarwithoptionalweight\", \"INTCONSorVARIABLE\",\n  \"x_onevarwithoptionalweight\", 0\n};\n#endif\n\n# ifdef YYPRINT\n/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to\n   token YYLEX-NUM.  */\nstatic const lp_yytype_uint16 lp_yytoknum[] =\n{\n       0,   256,   257,   258,   259,   260,   261,   262,   263,   264,\n     265,   266,   267,   268,   269,   270,   271,   272,   273,   274,\n     275,   276,   277,   278,   279\n};\n# endif\n\n/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */\nstatic const lp_yytype_uint8 lp_yyr1[] =\n{\n       0,    25,    26,    28,    27,    29,    29,    29,    30,    31,\n      31,    32,    32,    33,    33,    34,    35,    34,    37,    38,\n      39,    36,    40,    41,    42,    40,    43,    43,    44,    45,\n      44,    47,    46,    48,    48,    49,    50,    51,    50,    52,\n      52,    52,    53,    53,    54,    54,    55,    55,    56,    56,\n      57,    58,    58,    59,    59,    60,    60,    60,    60,    60,\n      62,    61,    64,    63,    65,    65,    66,    67,    66,    68,\n      69,    68,    70,    70,    71,    71,    72,    72,    73,    73,\n      74,    75,    76,    77,    78,    78,    79,    79,    80,    80\n};\n\n/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */\nstatic const lp_yytype_uint8 lp_yyr2[] =\n{\n       0,     2,     0,     0,     4,     2,     2,     1,     2,     1,\n       1,     1,     1,     1,     2,     1,     0,     3,     0,     0,\n       0,     8,     1,     0,     0,     5,     1,     1,     1,     0,\n       3,     0,     2,     1,     2,     2,     1,     0,     3,     1,\n       1,     1,     2,     1,     1,     1,     1,     1,     1,     1,\n       1,     1,     1,     1,     2,     1,     1,     1,     1,     1,\n       0,     3,     0,     5,     1,     2,     1,     0,     3,     1,\n       0,     4,     1,     2,     1,     1,     1,     3,     1,     1,\n       1,     0,     1,     1,     2,     3,     2,     2,     2,     4\n};\n\n/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state\n   STATE-NUM when YYTABLE doesn't specify something else to do.  Zero\n   means the default is an error.  */\nstatic const lp_yytype_uint8 lp_yydefact[] =\n{\n       3,     0,    31,     1,    31,    31,     9,     2,     7,     0,\n      10,     2,     6,     5,    16,    29,    11,     2,    12,    13,\n      15,    18,    27,    28,     8,    47,    46,     2,    33,     2,\n      31,     2,    55,    56,    57,    58,    59,    51,     4,    52,\n      60,    53,    26,    14,     0,    34,    45,    44,    49,    48,\n      35,    36,    37,    17,    50,    30,    54,    62,    39,    40,\n      41,    19,     0,    64,     2,    61,    31,    38,    67,    66,\n       2,    65,    20,     2,     2,    81,    74,     2,     2,    76,\n       2,    83,    68,    80,    84,     2,     0,    69,     0,    79,\n      78,     0,    22,     0,    23,     2,     0,    85,    70,    63,\n      77,    21,     2,    82,    86,     2,    81,    87,     2,    43,\n      24,     0,    88,     0,     0,    72,    71,     2,    42,     2,\n      73,    25,    89\n};\n\n/* YYDEFGOTO[NTERM-NUM].  */\nstatic const lp_yytype_int8 lp_yydefgoto[] =\n{\n      -1,     6,     1,     2,     7,     8,     9,    17,    18,    19,\n      30,    20,    44,    66,    80,    93,   102,   117,    21,    22,\n      31,    23,    11,    27,    28,    50,    62,    61,   110,    51,\n      29,    52,    55,    38,    39,    40,    41,    57,    63,    64,\n      65,    70,    73,    88,   108,   116,    77,    78,    91,    84,\n      85,   104,    82,    79,    97,   107\n};\n\n/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing\n   STATE-NUM.  */\n#define YYPACT_NINF -85\nstatic const lp_yytype_int8 lp_yypact[] =\n{\n     -85,    13,    46,   -85,     2,     2,   -85,    32,   -85,     7,\n     -85,    26,   -85,   -85,   -85,   -85,    64,    40,    27,   -85,\n     -85,   -85,   -85,   -85,   -85,   -85,   -85,    42,   -85,     3,\n      -2,   -85,   -85,   -85,   -85,   -85,   -85,   -85,   -85,    40,\n     -85,   -85,   -85,   -85,    67,   -85,   -85,   -85,   -85,   -85,\n     -85,   -85,   -85,   -85,   -85,   -85,   -85,   -85,   -85,   -85,\n     -85,   -85,    59,   -85,    52,     0,    84,   -85,   -85,   -85,\n      22,   -85,   -85,   -85,   -85,   -85,   -85,    60,    35,   -85,\n      67,   -85,   -85,   -85,   -85,    82,    87,   -85,    74,   -85,\n     -85,    22,   -85,    75,   -85,   -85,    73,   -85,   -85,   -85,\n     -85,   -85,    -5,   -85,   -85,   -85,   -85,   -85,    76,   -85,\n     -85,    82,   -85,    82,    91,   -85,   -85,   -85,   -85,   -85,\n     -85,   -85,   -85\n};\n\n/* YYPGOTO[NTERM-NUM].  */\nstatic const lp_yytype_int8 lp_yypgoto[] =\n{\n     -85,    -7,   -85,   -85,   -85,    85,   -85,   -85,   -85,    81,\n     -85,    72,   -85,   -85,   -85,   -85,   -85,   -85,   -85,    34,\n     -85,    70,   -85,   -85,    77,   -85,   -85,    23,   -85,   -84,\n       4,   -85,   -12,   -85,   -85,   -85,    68,   -85,    43,   -85,\n     -85,   -85,   -85,   -85,   -85,   -85,   -85,   -85,   -85,     6,\n       8,   -10,    28,    24,   -85,   -85\n};\n\n/* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If\n   positive, shift that token.  If negative, reduce the rule which\n   number is the opposite.  If zero, do what YYDEFACT says.\n   If YYTABLE_NINF, syntax error.  */\n#define YYTABLE_NINF -76\nstatic const lp_yytype_int8 lp_yytable[] =\n{\n      16,    95,   109,   -62,    26,    15,   -62,    46,    47,    25,\n      37,    42,   -62,     3,    -2,    -2,    -2,   -62,    48,   -62,\n      26,    -2,    49,    42,    54,    74,    24,   118,    75,   119,\n     -31,   -31,   -31,    14,    15,   -31,   -31,   -31,    14,    15,\n      25,   -31,   -31,    -2,    -2,    -2,   -31,   -31,    32,    33,\n      34,    35,   -75,    36,   -75,    89,    25,    69,   -32,   -32,\n     -32,   -32,    67,    76,    68,    -2,    81,    83,     4,     5,\n      87,    90,    10,    92,    10,    10,   105,    86,    81,   106,\n     -26,   -26,   -26,    58,    59,    60,    46,    47,   103,    12,\n      13,    15,    98,    99,   101,    26,   120,   114,    83,    43,\n      72,   115,    53,    94,    45,   121,   111,    56,    71,   122,\n      54,   112,   103,    96,   113,   100\n};\n\nstatic const lp_yytype_uint8 lp_yycheck[] =\n{\n       7,    85,     7,     3,    11,     7,     6,     4,     5,    14,\n      17,    18,    12,     0,    16,    17,    18,    17,    15,    19,\n      27,    19,    29,    30,    31,     3,    19,   111,     6,   113,\n       3,     4,     5,     6,     7,     3,     4,     5,     6,     7,\n      14,    14,    15,    16,    17,    18,    14,    15,     8,     9,\n      10,    11,    17,    13,    19,    20,    14,    64,    16,    17,\n      18,    19,     3,    70,    12,    19,    73,    74,    22,    23,\n      77,    78,     2,    80,     4,     5,     3,    17,    85,     6,\n      16,    17,    18,    16,    17,    18,     4,     5,    95,     4,\n       5,     7,     5,    19,    19,   102,     5,    21,   105,    18,\n      66,   108,    30,    80,    27,   117,   102,    39,    65,   119,\n     117,   105,   119,    85,   106,    91\n};\n\n/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing\n   symbol of state STATE-NUM.  */\nstatic const lp_yytype_uint8 lp_yystos[] =\n{\n       0,    27,    28,     0,    22,    23,    26,    29,    30,    31,\n      46,    47,    30,    30,     6,     7,    26,    32,    33,    34,\n      36,    43,    44,    46,    19,    14,    26,    48,    49,    55,\n      35,    45,     8,     9,    10,    11,    13,    26,    58,    59,\n      60,    61,    26,    34,    37,    49,     4,     5,    15,    26,\n      50,    54,    56,    36,    26,    57,    61,    62,    16,    17,\n      18,    52,    51,    63,    64,    65,    38,     3,    12,    26,\n      66,    63,    44,    67,     3,     6,    26,    71,    72,    78,\n      39,    26,    77,    26,    74,    75,    17,    26,    68,    20,\n      26,    73,    26,    40,    52,    54,    77,    79,     5,    19,\n      78,    19,    41,    26,    76,     3,     6,    80,    69,     7,\n      53,    55,    74,    75,    21,    26,    70,    42,    54,    54,\n       5,    57,    76\n};\n\n#define lp_yyerrok\t\t(lp_yyerrstatus = 0)\n#define lp_yyclearin\t(lp_yychar = YYEMPTY)\n#define YYEMPTY\t\t(-2)\n#define YYEOF\t\t0\n\n#define YYACCEPT\tgoto lp_yyacceptlab\n#define YYABORT\t\tgoto lp_yyabortlab\n#define YYERROR\t\tgoto lp_yyerrorlab\n\n\n/* Like YYERROR except do call lp_yyerror.  This remains here temporarily\n   to ease the transition to the new meaning of YYERROR, for GCC.\n   Once GCC version 2 has supplanted version 1, this can go.  */\n\n#define YYFAIL\t\tgoto lp_yyerrlab\n\n#define YYRECOVERING()  (!!lp_yyerrstatus)\n\n#define YYBACKUP(Token, Value)\t\t\t\t\t\\\ndo\t\t\t\t\t\t\t\t\\\n  if (lp_yychar == YYEMPTY && lp_yylen == 1)\t\t\t\t\\\n    {\t\t\t\t\t\t\t\t\\\n      lp_yychar = (Token);\t\t\t\t\t\t\\\n      lp_yylval = (Value);\t\t\t\t\t\t\\\n      lp_yytoken = YYTRANSLATE (lp_yychar);\t\t\t\t\\\n      YYPOPSTACK (1);\t\t\t\t\t\t\\\n      goto lp_yybackup;\t\t\t\t\t\t\\\n    }\t\t\t\t\t\t\t\t\\\n  else\t\t\t\t\t\t\t\t\\\n    {\t\t\t\t\t\t\t\t\\\n      lp_yyerror (parm, scanner, YY_(\"syntax error: cannot back up\")); \\\n      YYERROR;\t\t\t\t\t\t\t\\\n    }\t\t\t\t\t\t\t\t\\\nwhile (YYID (0))\n\n\n#define YYTERROR\t1\n#define YYERRCODE\t256\n\n\n/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].\n   If N is 0, then set CURRENT to the empty location which ends\n   the previous symbol: RHS[0] (always defined).  */\n\n#define YYRHSLOC(Rhs, K) ((Rhs)[K])\n#ifndef YYLLOC_DEFAULT\n# define YYLLOC_DEFAULT(Current, Rhs, N)\t\t\t\t\\\n    do\t\t\t\t\t\t\t\t\t\\\n      if (YYID (N))                                                    \\\n\t{\t\t\t\t\t\t\t\t\\\n\t  (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;\t\\\n\t  (Current).first_column = YYRHSLOC (Rhs, 1).first_column;\t\\\n\t  (Current).last_line    = YYRHSLOC (Rhs, N).last_line;\t\t\\\n\t  (Current).last_column  = YYRHSLOC (Rhs, N).last_column;\t\\\n\t}\t\t\t\t\t\t\t\t\\\n      else\t\t\t\t\t\t\t\t\\\n\t{\t\t\t\t\t\t\t\t\\\n\t  (Current).first_line   = (Current).last_line   =\t\t\\\n\t    YYRHSLOC (Rhs, 0).last_line;\t\t\t\t\\\n\t  (Current).first_column = (Current).last_column =\t\t\\\n\t    YYRHSLOC (Rhs, 0).last_column;\t\t\t\t\\\n\t}\t\t\t\t\t\t\t\t\\\n    while (YYID (0))\n#endif\n\n\n/* YY_LOCATION_PRINT -- Print the location on the stream.\n   This macro was not mandated originally: define only if we know\n   we won't break user code: when these are the locations we know.  */\n\n#ifndef YY_LOCATION_PRINT\n# if YYLTYPE_IS_TRIVIAL\n#  define YY_LOCATION_PRINT(File, Loc)\t\t\t\\\n     fprintf (File, \"%d.%d-%d.%d\",\t\t\t\\\n\t      (Loc).first_line, (Loc).first_column,\t\\\n\t      (Loc).last_line,  (Loc).last_column)\n# else\n#  define YY_LOCATION_PRINT(File, Loc) ((void) 0)\n# endif\n#endif\n\n\n/* YYLEX -- calling `lp_yylex' with the right arguments.  */\n\n#ifdef YYLEX_PARAM\n# define YYLEX lp_yylex (&lp_yylval, YYLEX_PARAM)\n#else\n# define YYLEX lp_yylex (&lp_yylval, scanner)\n#endif\n\n/* Enable debugging if requested.  */\n#if YYDEBUG\n\n# ifndef YYFPRINTF\n#  include <stdio.h> /* INFRINGES ON USER NAME SPACE */\n#  define YYFPRINTF fprintf\n# endif\n\n# define YYDPRINTF(Args)\t\t\t\\\ndo {\t\t\t\t\t\t\\\n  if (lp_yydebug)\t\t\t\t\t\\\n    YYFPRINTF Args;\t\t\t\t\\\n} while (YYID (0))\n\n# define YY_SYMBOL_PRINT(Title, Type, Value, Location)\t\t\t  \\\ndo {\t\t\t\t\t\t\t\t\t  \\\n  if (lp_yydebug)\t\t\t\t\t\t\t\t  \\\n    {\t\t\t\t\t\t\t\t\t  \\\n      YYFPRINTF (stderr, \"%s \", Title);\t\t\t\t\t  \\\n      lp_yy_symbol_print (stderr,\t\t\t\t\t\t  \\\n\t\t  Type, Value, parm, scanner); \\\n      YYFPRINTF (stderr, \"\\n\");\t\t\t\t\t\t  \\\n    }\t\t\t\t\t\t\t\t\t  \\\n} while (YYID (0))\n\n\n/*--------------------------------.\n| Print this symbol on YYOUTPUT.  |\n`--------------------------------*/\n\n/*ARGSUSED*/\n#if (defined __STDC__ || defined __C99__FUNC__ \\\n     || defined __cplusplus || defined _MSC_VER)\nstatic void\nlp_yy_symbol_value_print (FILE *lp_yyoutput, int lp_yytype, YYSTYPE const * const lp_yyvaluep, parse_parm *parm, void *scanner)\n#else\nstatic void\nlp_yy_symbol_value_print (lp_yyoutput, lp_yytype, lp_yyvaluep, parm, scanner)\n    FILE *lp_yyoutput;\n    int lp_yytype;\n    YYSTYPE const * const lp_yyvaluep;\n    parse_parm *parm;\n    void *scanner;\n#endif\n{\n  if (!lp_yyvaluep)\n    return;\n  YYUSE (parm);\n  YYUSE (scanner);\n# ifdef YYPRINT\n  if (lp_yytype < YYNTOKENS)\n    YYPRINT (lp_yyoutput, lp_yytoknum[lp_yytype], *lp_yyvaluep);\n# else\n  YYUSE (lp_yyoutput);\n# endif\n  switch (lp_yytype)\n    {\n      default:\n\tbreak;\n    }\n}\n\n\n/*--------------------------------.\n| Print this symbol on YYOUTPUT.  |\n`--------------------------------*/\n\n#if (defined __STDC__ || defined __C99__FUNC__ \\\n     || defined __cplusplus || defined _MSC_VER)\nstatic void\nlp_yy_symbol_print (FILE *lp_yyoutput, int lp_yytype, YYSTYPE const * const lp_yyvaluep, parse_parm *parm, void *scanner)\n#else\nstatic void\nlp_yy_symbol_print (lp_yyoutput, lp_yytype, lp_yyvaluep, parm, scanner)\n    FILE *lp_yyoutput;\n    int lp_yytype;\n    YYSTYPE const * const lp_yyvaluep;\n    parse_parm *parm;\n    void *scanner;\n#endif\n{\n  if (lp_yytype < YYNTOKENS)\n    YYFPRINTF (lp_yyoutput, \"token %s (\", lp_yytname[lp_yytype]);\n  else\n    YYFPRINTF (lp_yyoutput, \"nterm %s (\", lp_yytname[lp_yytype]);\n\n  lp_yy_symbol_value_print (lp_yyoutput, lp_yytype, lp_yyvaluep, parm, scanner);\n  YYFPRINTF (lp_yyoutput, \")\");\n}\n\n/*------------------------------------------------------------------.\n| lp_yy_stack_print -- Print the state stack from its BOTTOM up to its |\n| TOP (included).                                                   |\n`------------------------------------------------------------------*/\n\n#if (defined __STDC__ || defined __C99__FUNC__ \\\n     || defined __cplusplus || defined _MSC_VER)\nstatic void\nlp_yy_stack_print (lp_yytype_int16 *bottom, lp_yytype_int16 *top)\n#else\nstatic void\nlp_yy_stack_print (bottom, top)\n    lp_yytype_int16 *bottom;\n    lp_yytype_int16 *top;\n#endif\n{\n  YYFPRINTF (stderr, \"Stack now\");\n  for (; bottom <= top; ++bottom)\n    YYFPRINTF (stderr, \" %d\", *bottom);\n  YYFPRINTF (stderr, \"\\n\");\n}\n\n# define YY_STACK_PRINT(Bottom, Top)\t\t\t\t\\\ndo {\t\t\t\t\t\t\t\t\\\n  if (lp_yydebug)\t\t\t\t\t\t\t\\\n    lp_yy_stack_print ((Bottom), (Top));\t\t\t\t\\\n} while (YYID (0))\n\n\n/*------------------------------------------------.\n| Report that the YYRULE is going to be reduced.  |\n`------------------------------------------------*/\n\n#if (defined __STDC__ || defined __C99__FUNC__ \\\n     || defined __cplusplus || defined _MSC_VER)\nstatic void\nlp_yy_reduce_print (YYSTYPE *lp_yyvsp, int lp_yyrule, parse_parm *parm, void *scanner)\n#else\nstatic void\nlp_yy_reduce_print (lp_yyvsp, lp_yyrule, parm, scanner)\n    YYSTYPE *lp_yyvsp;\n    int lp_yyrule;\n    parse_parm *parm;\n    void *scanner;\n#endif\n{\n  int lp_yynrhs = lp_yyr2[lp_yyrule];\n  int lp_yyi;\n  unsigned long int lp_yylno = lp_yyrline[lp_yyrule];\n  YYFPRINTF (stderr, \"Reducing stack by rule %d (line %lu):\\n\",\n\t     lp_yyrule - 1, lp_yylno);\n  /* The symbols being reduced.  */\n  for (lp_yyi = 0; lp_yyi < lp_yynrhs; lp_yyi++)\n    {\n      fprintf (stderr, \"   $%d = \", lp_yyi + 1);\n      lp_yy_symbol_print (stderr, lp_yyrhs[lp_yyprhs[lp_yyrule] + lp_yyi],\n\t\t       &(lp_yyvsp[(lp_yyi + 1) - (lp_yynrhs)])\n\t\t       \t\t       , parm, scanner);\n      fprintf (stderr, \"\\n\");\n    }\n}\n\n# define YY_REDUCE_PRINT(Rule)\t\t\\\ndo {\t\t\t\t\t\\\n  if (lp_yydebug)\t\t\t\t\\\n    lp_yy_reduce_print (lp_yyvsp, Rule, parm, scanner); \\\n} while (YYID (0))\n\n/* Nonzero means print parse trace.  It is left uninitialized so that\n   multiple parsers can coexist.  */\nint lp_yydebug;\n#else /* !YYDEBUG */\n# define YYDPRINTF(Args)\n# define YY_SYMBOL_PRINT(Title, Type, Value, Location)\n# define YY_STACK_PRINT(Bottom, Top)\n# define YY_REDUCE_PRINT(Rule)\n#endif /* !YYDEBUG */\n\n\n/* YYINITDEPTH -- initial size of the parser's stacks.  */\n#ifndef\tYYINITDEPTH\n# define YYINITDEPTH 200\n#endif\n\n/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only\n   if the built-in stack extension method is used).\n\n   Do not make this value too large; the results are undefined if\n   YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)\n   evaluated with infinite-precision integer arithmetic.  */\n\n#ifndef YYMAXDEPTH\n# define YYMAXDEPTH 10000\n#endif\n\n\f\n\n#if YYERROR_VERBOSE\n\n# ifndef lp_yystrlen\n#  if defined __GLIBC__ && defined _STRING_H\n#   define lp_yystrlen strlen\n#  else\n/* Return the length of YYSTR.  */\n#if (defined __STDC__ || defined __C99__FUNC__ \\\n     || defined __cplusplus || defined _MSC_VER)\nstatic YYSIZE_T\nlp_yystrlen (const char *lp_yystr)\n#else\nstatic YYSIZE_T\nlp_yystrlen (lp_yystr)\n    const char *lp_yystr;\n#endif\n{\n  YYSIZE_T lp_yylen;\n  for (lp_yylen = 0; lp_yystr[lp_yylen]; lp_yylen++)\n    continue;\n  return lp_yylen;\n}\n#  endif\n# endif\n\n# ifndef lp_yystpcpy\n#  if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE\n#   define lp_yystpcpy stpcpy\n#  else\n/* Copy YYSRC to YYDEST, returning the address of the terminating '\\0' in\n   YYDEST.  */\n#if (defined __STDC__ || defined __C99__FUNC__ \\\n     || defined __cplusplus || defined _MSC_VER)\nstatic char *\nlp_yystpcpy (char *lp_yydest, const char *lp_yysrc)\n#else\nstatic char *\nlp_yystpcpy (lp_yydest, lp_yysrc)\n    char *lp_yydest;\n    const char *lp_yysrc;\n#endif\n{\n  char *lp_yyd = lp_yydest;\n  const char *lp_yys = lp_yysrc;\n\n  while ((*lp_yyd++ = *lp_yys++) != '\\0')\n    continue;\n\n  return lp_yyd - 1;\n}\n#  endif\n# endif\n\n# ifndef lp_yytnamerr\n/* Copy to YYRES the contents of YYSTR after stripping away unnecessary\n   quotes and backslashes, so that it's suitable for lp_yyerror.  The\n   heuristic is that double-quoting is unnecessary unless the string\n   contains an apostrophe, a comma, or backslash (other than\n   backslash-backslash).  YYSTR is taken from lp_yytname.  If YYRES is\n   null, do not copy; instead, return the length of what the result\n   would have been.  */\nstatic YYSIZE_T\nlp_yytnamerr (char *lp_yyres, const char *lp_yystr)\n{\n  if (*lp_yystr == '\"')\n    {\n      YYSIZE_T lp_yyn = 0;\n      char const *lp_yyp = lp_yystr;\n\n      for (;;)\n\tswitch (*++lp_yyp)\n\t  {\n\t  case '\\'':\n\t  case ',':\n\t    goto do_not_strip_quotes;\n\n\t  case '\\\\':\n\t    if (*++lp_yyp != '\\\\')\n\t      goto do_not_strip_quotes;\n\t    /* Fall through.  */\n\t  default:\n\t    if (lp_yyres)\n\t      lp_yyres[lp_yyn] = *lp_yyp;\n\t    lp_yyn++;\n\t    break;\n\n\t  case '\"':\n\t    if (lp_yyres)\n\t      lp_yyres[lp_yyn] = '\\0';\n\t    return lp_yyn;\n\t  }\n    do_not_strip_quotes: ;\n    }\n\n  if (! lp_yyres)\n    return lp_yystrlen (lp_yystr);\n\n  return lp_yystpcpy (lp_yyres, lp_yystr) - lp_yyres;\n}\n# endif\n\n/* Copy into YYRESULT an error message about the unexpected token\n   YYCHAR while in state YYSTATE.  Return the number of bytes copied,\n   including the terminating null byte.  If YYRESULT is null, do not\n   copy anything; just return the number of bytes that would be\n   copied.  As a special case, return 0 if an ordinary \"syntax error\"\n   message will do.  Return YYSIZE_MAXIMUM if overflow occurs during\n   size calculation.  */\nstatic YYSIZE_T\nlp_yysyntax_error (char *lp_yyresult, int lp_yystate, int lp_yychar)\n{\n  int lp_yyn = lp_yypact[lp_yystate];\n\n  if (! (YYPACT_NINF < lp_yyn && lp_yyn <= YYLAST))\n    return 0;\n  else\n    {\n      int lp_yytype = YYTRANSLATE (lp_yychar);\n      YYSIZE_T lp_yysize0 = lp_yytnamerr (0, lp_yytname[lp_yytype]);\n      YYSIZE_T lp_yysize = lp_yysize0;\n      YYSIZE_T lp_yysize1;\n      int lp_yysize_overflow = 0;\n      enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };\n      char const *lp_yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];\n      int lp_yyx;\n\n# if 0\n      /* This is so xgettext sees the translatable formats that are\n\t constructed on the fly.  */\n      YY_(\"syntax error, unexpected %s\");\n      YY_(\"syntax error, unexpected %s, expecting %s\");\n      YY_(\"syntax error, unexpected %s, expecting %s or %s\");\n      YY_(\"syntax error, unexpected %s, expecting %s or %s or %s\");\n      YY_(\"syntax error, unexpected %s, expecting %s or %s or %s or %s\");\n# endif\n      char *lp_yyfmt;\n      char const *lp_yyf;\n      static char const lp_yyunexpected[] = \"syntax error, unexpected %s\";\n      static char const lp_yyexpecting[] = \", expecting %s\";\n      static char const lp_yyor[] = \" or %s\";\n      char lp_yyformat[sizeof lp_yyunexpected\n\t\t    + sizeof lp_yyexpecting - 1\n\t\t    + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)\n\t\t       * (sizeof lp_yyor - 1))];\n      char const *lp_yyprefix = lp_yyexpecting;\n\n      /* Start YYX at -YYN if negative to avoid negative indexes in\n\t YYCHECK.  */\n      int lp_yyxbegin = lp_yyn < 0 ? -lp_yyn : 0;\n\n      /* Stay within bounds of both lp_yycheck and lp_yytname.  */\n      int lp_yychecklim = YYLAST - lp_yyn + 1;\n      int lp_yyxend = lp_yychecklim < YYNTOKENS ? lp_yychecklim : YYNTOKENS;\n      int lp_yycount = 1;\n\n      lp_yyarg[0] = lp_yytname[lp_yytype];\n      lp_yyfmt = lp_yystpcpy (lp_yyformat, lp_yyunexpected);\n\n      for (lp_yyx = lp_yyxbegin; lp_yyx < lp_yyxend; ++lp_yyx)\n\tif (lp_yycheck[lp_yyx + lp_yyn] == lp_yyx && lp_yyx != YYTERROR)\n\t  {\n\t    if (lp_yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)\n\t      {\n\t\tlp_yycount = 1;\n\t\tlp_yysize = lp_yysize0;\n\t\tlp_yyformat[sizeof lp_yyunexpected - 1] = '\\0';\n\t\tbreak;\n\t      }\n\t    lp_yyarg[lp_yycount++] = lp_yytname[lp_yyx];\n\t    lp_yysize1 = lp_yysize + lp_yytnamerr (0, lp_yytname[lp_yyx]);\n\t    lp_yysize_overflow |= (lp_yysize1 < lp_yysize);\n\t    lp_yysize = lp_yysize1;\n\t    lp_yyfmt = lp_yystpcpy (lp_yyfmt, lp_yyprefix);\n\t    lp_yyprefix = lp_yyor;\n\t  }\n\n      lp_yyf = YY_(lp_yyformat);\n      lp_yysize1 = lp_yysize + lp_yystrlen (lp_yyf);\n      lp_yysize_overflow |= (lp_yysize1 < lp_yysize);\n      lp_yysize = lp_yysize1;\n\n      if (lp_yysize_overflow)\n\treturn YYSIZE_MAXIMUM;\n\n      if (lp_yyresult)\n\t{\n\t  /* Avoid sprintf, as that infringes on the user's name space.\n\t     Don't have undefined behavior even if the translation\n\t     produced a string with the wrong number of \"%s\"s.  */\n\t  char *lp_yyp = lp_yyresult;\n\t  int lp_yyi = 0;\n\t  while ((*lp_yyp = *lp_yyf) != '\\0')\n\t    {\n\t      if (*lp_yyp == '%' && lp_yyf[1] == 's' && lp_yyi < lp_yycount)\n\t\t{\n\t\t  lp_yyp += lp_yytnamerr (lp_yyp, lp_yyarg[lp_yyi++]);\n\t\t  lp_yyf += 2;\n\t\t}\n\t      else\n\t\t{\n\t\t  lp_yyp++;\n\t\t  lp_yyf++;\n\t\t}\n\t    }\n\t}\n      return lp_yysize;\n    }\n}\n#endif /* YYERROR_VERBOSE */\n\f\n\n/*-----------------------------------------------.\n| Release the memory associated to this symbol.  |\n`-----------------------------------------------*/\n\n/*ARGSUSED*/\n#if (defined __STDC__ || defined __C99__FUNC__ \\\n     || defined __cplusplus || defined _MSC_VER)\nstatic void\nlp_yydestruct (const char *lp_yymsg, int lp_yytype, YYSTYPE *lp_yyvaluep, parse_parm *parm, void *scanner)\n#else\nstatic void\nlp_yydestruct (lp_yymsg, lp_yytype, lp_yyvaluep, parm, scanner)\n    const char *lp_yymsg;\n    int lp_yytype;\n    YYSTYPE *lp_yyvaluep;\n    parse_parm *parm;\n    void *scanner;\n#endif\n{\n  YYUSE (lp_yyvaluep);\n  YYUSE (parm);\n  YYUSE (scanner);\n\n  if (!lp_yymsg)\n    lp_yymsg = \"Deleting\";\n  YY_SYMBOL_PRINT (lp_yymsg, lp_yytype, lp_yyvaluep, lp_yylocationp);\n\n  switch (lp_yytype)\n    {\n\n      default:\n\tbreak;\n    }\n}\n\f\n\n/* Prevent warnings from -Wmissing-prototypes.  */\n\n#ifdef YYPARSE_PARAM\n#if defined __STDC__ || defined __cplusplus\nint lp_yyparse (void *YYPARSE_PARAM);\n#else\nint lp_yyparse ();\n#endif\n#else /* ! YYPARSE_PARAM */\n#if defined __STDC__ || defined __cplusplus\nint lp_yyparse (parse_parm *parm, void *scanner);\n#else\nint lp_yyparse ();\n#endif\n#endif /* ! YYPARSE_PARAM */\n\n\n\n\n\n\n/*----------.\n| lp_yyparse.  |\n`----------*/\n\n#ifdef YYPARSE_PARAM\n#if (defined __STDC__ || defined __C99__FUNC__ \\\n     || defined __cplusplus || defined _MSC_VER)\nint\nlp_yyparse (void *YYPARSE_PARAM)\n#else\nint\nlp_yyparse (YYPARSE_PARAM)\n    void *YYPARSE_PARAM;\n#endif\n#else /* ! YYPARSE_PARAM */\n#if (defined __STDC__ || defined __C99__FUNC__ \\\n     || defined __cplusplus || defined _MSC_VER)\nint\nlp_yyparse (parse_parm *parm, void *scanner)\n#else\nint\nlp_yyparse (parm, scanner)\n    parse_parm *parm;\n    void *scanner;\n#endif\n#endif\n{\n  /* The look-ahead symbol.  */\nint lp_yychar;\n\n/* The semantic value of the look-ahead symbol.  */\nYYSTYPE lp_yylval;\n\n/* Number of syntax errors so far.  */\nint lp_yynerrs;\n\n  int lp_yystate;\n  int lp_yyn;\n  int lp_yyresult;\n  /* Number of tokens to shift before error messages enabled.  */\n  int lp_yyerrstatus;\n  /* Look-ahead token as an internal (translated) token number.  */\n  int lp_yytoken = 0;\n#if YYERROR_VERBOSE\n  /* Buffer for error messages, and its allocated size.  */\n  char lp_yymsgbuf[128];\n  char *lp_yymsg = lp_yymsgbuf;\n  YYSIZE_T lp_yymsg_alloc = sizeof lp_yymsgbuf;\n#endif\n\n  /* Three stacks and their tools:\n     `lp_yyss': related to states,\n     `lp_yyvs': related to semantic values,\n     `lp_yyls': related to locations.\n\n     Refer to the stacks thru separate pointers, to allow lp_yyoverflow\n     to reallocate them elsewhere.  */\n\n  /* The state stack.  */\n  lp_yytype_int16 lp_yyssa[YYINITDEPTH];\n  lp_yytype_int16 *lp_yyss = lp_yyssa;\n  lp_yytype_int16 *lp_yyssp;\n\n  /* The semantic value stack.  */\n  YYSTYPE lp_yyvsa[YYINITDEPTH];\n  YYSTYPE *lp_yyvs = lp_yyvsa;\n  YYSTYPE *lp_yyvsp;\n\n\n\n#define YYPOPSTACK(N)   (lp_yyvsp -= (N), lp_yyssp -= (N))\n\n  YYSIZE_T lp_yystacksize = YYINITDEPTH;\n\n  /* The variables used to return semantic value and location from the\n     action routines.  */\n  YYSTYPE lp_yyval;\n\n\n  /* The number of symbols on the RHS of the reduced rule.\n     Keep to zero when no symbol should be popped.  */\n  int lp_yylen = 0;\n\n  YYDPRINTF ((stderr, \"Starting parse\\n\"));\n\n  lp_yystate = 0;\n  lp_yyerrstatus = 0;\n  lp_yynerrs = 0;\n  lp_yychar = YYEMPTY;\t\t/* Cause a token to be read.  */\n\n  /* Initialize stack pointers.\n     Waste one element of value and location stack\n     so that they stay on the same level as the state stack.\n     The wasted elements are never initialized.  */\n\n  lp_yyssp = lp_yyss;\n  lp_yyvsp = lp_yyvs;\n\n  goto lp_yysetstate;\n\n/*------------------------------------------------------------.\n| lp_yynewstate -- Push a new state, which is found in lp_yystate.  |\n`------------------------------------------------------------*/\n lp_yynewstate:\n  /* In all cases, when you get here, the value and location stacks\n     have just been pushed.  So pushing a state here evens the stacks.  */\n  lp_yyssp++;\n\n lp_yysetstate:\n  *lp_yyssp = lp_yystate;\n\n  if (lp_yyss + lp_yystacksize - 1 <= lp_yyssp)\n    {\n      /* Get the current used size of the three stacks, in elements.  */\n      YYSIZE_T lp_yysize = lp_yyssp - lp_yyss + 1;\n\n#ifdef lp_yyoverflow\n      {\n\t/* Give user a chance to reallocate the stack.  Use copies of\n\t   these so that the &'s don't force the real ones into\n\t   memory.  */\n\tYYSTYPE *lp_yyvs1 = lp_yyvs;\n\tlp_yytype_int16 *lp_yyss1 = lp_yyss;\n\n\n\t/* Each stack pointer address is followed by the size of the\n\t   data in use in that stack, in bytes.  This used to be a\n\t   conditional around just the two extra args, but that might\n\t   be undefined if lp_yyoverflow is a macro.  */\n\tlp_yyoverflow (YY_(\"memory exhausted\"),\n\t\t    &lp_yyss1, lp_yysize * sizeof (*lp_yyssp),\n\t\t    &lp_yyvs1, lp_yysize * sizeof (*lp_yyvsp),\n\n\t\t    &lp_yystacksize);\n\n\tlp_yyss = lp_yyss1;\n\tlp_yyvs = lp_yyvs1;\n      }\n#else /* no lp_yyoverflow */\n# ifndef YYSTACK_RELOCATE\n      goto lp_yyexhaustedlab;\n# else\n      /* Extend the stack our own way.  */\n      if (YYMAXDEPTH <= lp_yystacksize)\n\tgoto lp_yyexhaustedlab;\n      lp_yystacksize *= 2;\n      if (YYMAXDEPTH < lp_yystacksize)\n\tlp_yystacksize = YYMAXDEPTH;\n\n      {\n\tlp_yytype_int16 *lp_yyss1 = lp_yyss;\n\tunion lp_yyalloc *lp_yyptr =\n\t  (union lp_yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (lp_yystacksize));\n\tif (! lp_yyptr)\n\t  goto lp_yyexhaustedlab;\n\tYYSTACK_RELOCATE (lp_yyss);\n\tYYSTACK_RELOCATE (lp_yyvs);\n\n#  undef YYSTACK_RELOCATE\n\tif (lp_yyss1 != lp_yyssa)\n\t  YYSTACK_FREE (lp_yyss1);\n      }\n# endif\n#endif /* no lp_yyoverflow */\n\n      lp_yyssp = lp_yyss + lp_yysize - 1;\n      lp_yyvsp = lp_yyvs + lp_yysize - 1;\n\n\n      YYDPRINTF ((stderr, \"Stack size increased to %lu\\n\",\n\t\t  (unsigned long int) lp_yystacksize));\n\n      if (lp_yyss + lp_yystacksize - 1 <= lp_yyssp)\n\tYYABORT;\n    }\n\n  YYDPRINTF ((stderr, \"Entering state %d\\n\", lp_yystate));\n\n  goto lp_yybackup;\n\n/*-----------.\n| lp_yybackup.  |\n`-----------*/\nlp_yybackup:\n\n  /* Do appropriate processing given the current state.  Read a\n     look-ahead token if we need one and don't already have one.  */\n\n  /* First try to decide what to do without reference to look-ahead token.  */\n  lp_yyn = lp_yypact[lp_yystate];\n  if (lp_yyn == YYPACT_NINF)\n    goto lp_yydefault;\n\n  /* Not known => get a look-ahead token if don't already have one.  */\n\n  /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol.  */\n  if (lp_yychar == YYEMPTY)\n    {\n      YYDPRINTF ((stderr, \"Reading a token: \"));\n      lp_yychar = YYLEX;\n    }\n\n  if (lp_yychar <= YYEOF)\n    {\n      lp_yychar = lp_yytoken = YYEOF;\n      YYDPRINTF ((stderr, \"Now at end of input.\\n\"));\n    }\n  else\n    {\n      lp_yytoken = YYTRANSLATE (lp_yychar);\n      YY_SYMBOL_PRINT (\"Next token is\", lp_yytoken, &lp_yylval, &lp_yylloc);\n    }\n\n  /* If the proper action on seeing token YYTOKEN is to reduce or to\n     detect an error, take that action.  */\n  lp_yyn += lp_yytoken;\n  if (lp_yyn < 0 || YYLAST < lp_yyn || lp_yycheck[lp_yyn] != lp_yytoken)\n    goto lp_yydefault;\n  lp_yyn = lp_yytable[lp_yyn];\n  if (lp_yyn <= 0)\n    {\n      if (lp_yyn == 0 || lp_yyn == YYTABLE_NINF)\n\tgoto lp_yyerrlab;\n      lp_yyn = -lp_yyn;\n      goto lp_yyreduce;\n    }\n\n  if (lp_yyn == YYFINAL)\n    YYACCEPT;\n\n  /* Count tokens shifted since error; after three, turn off error\n     status.  */\n  if (lp_yyerrstatus)\n    lp_yyerrstatus--;\n\n  /* Shift the look-ahead token.  */\n  YY_SYMBOL_PRINT (\"Shifting\", lp_yytoken, &lp_yylval, &lp_yylloc);\n\n  /* Discard the shifted token unless it is eof.  */\n  if (lp_yychar != YYEOF)\n    lp_yychar = YYEMPTY;\n\n  lp_yystate = lp_yyn;\n  *++lp_yyvsp = lp_yylval;\n\n  goto lp_yynewstate;\n\n\n/*-----------------------------------------------------------.\n| lp_yydefault -- do the default action for the current state.  |\n`-----------------------------------------------------------*/\nlp_yydefault:\n  lp_yyn = lp_yydefact[lp_yystate];\n  if (lp_yyn == 0)\n    goto lp_yyerrlab;\n  goto lp_yyreduce;\n\n\n/*-----------------------------.\n| lp_yyreduce -- Do a reduction.  |\n`-----------------------------*/\nlp_yyreduce:\n  /* lp_yyn is the number of a rule to reduce with.  */\n  lp_yylen = lp_yyr2[lp_yyn];\n\n  /* If YYLEN is nonzero, implement the default value of the action:\n     `$$ = $1'.\n\n     Otherwise, the following line sets YYVAL to garbage.\n     This behavior is undocumented and Bison\n     users should not rely upon it.  Assigning to YYVAL\n     unconditionally makes the parser a bit smaller, and it avoids a\n     GCC warning that YYVAL may be used uninitialized.  */\n  lp_yyval = lp_yyvsp[1-lp_yylen];\n\n\n  YY_REDUCE_PRINT (lp_yyn);\n  switch (lp_yyn)\n    {\n        case 3:\n\n    {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pv->isign = 0;\n  pv->make_neg = 0;\n  pv->Sign = 0;\n  pv->HadConstraint = FALSE;\n  pv->HadVar = pv->HadVar0 = FALSE;\n}\n    break;\n\n  case 5:\n\n    {\n  set_obj_dir(PARM, TRUE);\n}\n    break;\n\n  case 6:\n\n    {\n  set_obj_dir(PARM, FALSE);\n}\n    break;\n\n  case 8:\n\n    {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  add_row(pp);\n  pv->HadConstraint = FALSE;\n  pv->HadVar = pv->HadVar0 = FALSE;\n  pv->isign = 0;\n  pv->make_neg = 0;\n}\n    break;\n\n  case 16:\n\n    {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  if(!add_constraint_name(pp, pv->Last_var))\n    YYABORT;\n  pv->HadConstraint = TRUE;\n}\n    break;\n\n  case 18:\n\n    {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pv->HadVar1 = pv->HadVar0;\n  pv->HadVar0 = FALSE;\n}\n    break;\n\n  case 19:\n\n    {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  if(!store_re_op(pp, pv->OP, (int) pv->HadConstraint, (int) pv->HadVar, (int) pv->Had_lineair_sum))\n    YYABORT;\n  pv->make_neg = 1;\n  pv->f1 = 0;\n}\n    break;\n\n  case 20:\n\n    {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pv->Had_lineair_sum0 = pv->Had_lineair_sum;\n  pv->Had_lineair_sum = TRUE;\n  pv->HadVar2 = pv->HadVar0;\n  pv->HadVar0 = FALSE;\n  pv->do_add_row = FALSE;\n  if(pv->HadConstraint && !pv->HadVar ) {\n    /* it is a range */\n    /* already handled */\n  }\n  else if(!pv->HadConstraint && pv->HadVar) {\n    /* it is a bound */\n\n    if(!store_bounds(pp, TRUE))\n      YYABORT;\n  }\n  else {\n    /* it is a row restriction */\n    if(pv->HadConstraint && pv->HadVar)\n      store_re_op(pp, '\\0', (int) pv->HadConstraint, (int) pv->HadVar, (int) pv->Had_lineair_sum); /* makes sure that data stored in temporary buffers is treated correctly */\n    pv->do_add_row = TRUE;\n  }\n}\n    break;\n\n  case 21:\n\n    {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  if((!pv->HadVar) && (!pv->HadConstraint)) {\n    lp_yyerror(pp, pp->scanner, \"parse error\");\n    YYABORT;\n  }\n  if(pv->do_add_row)\n    add_row(pp);\n  pv->HadConstraint = FALSE;\n  pv->HadVar = pv->HadVar0 = FALSE;\n  pv->isign = 0;\n  pv->make_neg = 0;\n  null_tmp_store(pp, TRUE);\n}\n    break;\n\n  case 22:\n\n    {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  if((!pv->HadVar1) && (pv->Had_lineair_sum0))\n    if(!negate_constraint(pp))\n      YYABORT;\n}\n    break;\n\n  case 23:\n\n    {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pv->make_neg = 0;\n  pv->isign = 0;\n  if(pv->HadConstraint)\n    pv->HadVar = pv->Had_lineair_sum = FALSE;\n  pv->HadVar0 = FALSE;\n  if(!store_re_op(pp, (char) ((pv->OP == '<') ? '>' : (pv->OP == '>') ? '<' : pv->OP), (int) pv->HadConstraint, (int) pv->HadVar, (int) pv->Had_lineair_sum))\n    YYABORT;\n}\n    break;\n\n  case 24:\n\n    {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pv->f -= pv->f1;\n}\n    break;\n\n  case 25:\n\n    {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  if((pv->HadVar1) || (!pv->HadVar2) || (pv->HadVar0)) {\n    lp_yyerror(pp, pp->scanner, \"parse error\");\n    YYABORT;\n  }\n\n  if(pv->HadConstraint && !pv->HadVar ) {\n    /* it is a range */\n    /* already handled */\n    if(!negate_constraint(pp))\n      YYABORT;\n  }\n  else if(!pv->HadConstraint && pv->HadVar) {\n    /* it is a bound */\n\n    if(!store_bounds(pp, TRUE))\n      YYABORT;\n  }\n}\n    break;\n\n  case 26:\n\n    {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  /* to allow a range */\n  /* constraint: < max */\n  if(!pv->HadConstraint) {\n    lp_yyerror(pp, pp->scanner, \"parse error\");\n    YYABORT;\n  }\n  pv->Had_lineair_sum = FALSE;\n}\n    break;\n\n  case 27:\n\n    {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pv->Had_lineair_sum = TRUE;\n}\n    break;\n\n  case 29:\n\n    {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pv->isign = pv->Sign;\n}\n    break;\n\n  case 31:\n\n    {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pv->state = pv->state0 = 0;\n}\n    break;\n\n  case 32:\n\n    {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  if (pv->state == 1) {\n    /* RHS_STORE */\n    if (    (pv->isign0 || !pv->make_neg)\n        && !(pv->isign0 && !pv->make_neg)) /* but not both! */\n      pv->f0 = -pv->f0;\n    if(pv->make_neg)\n      pv->f1 += pv->f0;\n    if(!rhs_store(pp, pv->f0, (int) pv->HadConstraint, (int) pv->HadVar, (int) pv->Had_lineair_sum))\n      YYABORT;\n  }\n}\n    break;\n\n  case 35:\n\n    {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  if ((pv->HadSign || pv->state == 1) && (pv->state0 == 1)) {\n    /* RHS_STORE */\n    if (    (pv->isign0 || !pv->make_neg)\n        && !(pv->isign0 && !pv->make_neg)) /* but not both! */\n      pv->f0 = -pv->f0;\n    if(pv->make_neg)\n      pv->f1 += pv->f0;\n    if(!rhs_store(pp, pv->f0, (int) pv->HadConstraint, (int) pv->HadVar, (int) pv->Had_lineair_sum))\n      YYABORT;\n  }\n  if (pv->state == 1) {\n    pv->f0 = pv->f;\n    pv->isign0 = pv->isign;\n  }\n  if (pv->state == 2) {\n    if((pv->HadSign) || (pv->state0 != 1)) {\n     pv->isign0 = pv->isign;\n     pv->f0 = 1.0;\n    }\n    if (    (pv->isign0 || pv->make_neg)\n        && !(pv->isign0 && pv->make_neg)) /* but not both! */\n      pv->f0 = -pv->f0;\n    if(!var_store(pp, pv->Last_var, pv->f0, (int) pv->HadConstraint, (int) pv->HadVar, (int) pv->Had_lineair_sum)) {\n      lp_yyerror(pp, pp->scanner, \"var_store failed\");\n      YYABORT;\n    }\n    pv->HadConstraint |= pv->HadVar;\n    pv->HadVar = pv->HadVar0 = TRUE;\n  }\n  pv->state0 = pv->state;\n}\n    break;\n\n  case 36:\n\n    {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pv->state = 1;\n}\n    break;\n\n  case 37:\n\n    {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  if ((pv->HasAR_M_OP) && (pv->state != 1)) {\n    lp_yyerror(pp, pp->scanner, \"parse error\");\n    YYABORT;\n  }\n}\n    break;\n\n  case 38:\n\n    {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pv->state = 2;\n}\n    break;\n\n  case 43:\n\n    {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pv->isign = pv->Sign;\n}\n    break;\n\n  case 46:\n\n    {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pv->isign = 0;\n  pv->HadSign = FALSE;\n}\n    break;\n\n  case 47:\n\n    {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pv->isign = pv->Sign;\n  pv->HadSign = TRUE;\n}\n    break;\n\n  case 48:\n\n    {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pv->HasAR_M_OP = FALSE;\n}\n    break;\n\n  case 49:\n\n    {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pv->HasAR_M_OP = TRUE;\n}\n    break;\n\n  case 50:\n\n    {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  if (    (pv->isign || !pv->make_neg)\n      && !(pv->isign && !pv->make_neg)) /* but not both! */\n    pv->f = -pv->f;\n  if(!rhs_store(pp, pv->f, (int) pv->HadConstraint, (int) pv->HadVar, (int) pv->Had_lineair_sum))\n    YYABORT;\n  pv->isign = 0;\n}\n    break;\n\n  case 60:\n\n    {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pv->Within_sos_decl1 = pv->Within_sos_decl;\n}\n    break;\n\n  case 62:\n\n    {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  if((!pv->Within_int_decl) && (!pv->Within_sec_decl) && (!pv->Within_sos_decl1) && (!pv->Within_free_decl)) {\n    lp_yyerror(pp, pp->scanner, \"parse error\");\n    YYABORT;\n  }\n  pv->SOStype = pv->SOStype0;\n  check_int_sec_sos_free_decl(pp, (int) pv->Within_int_decl, (int) pv->Within_sec_decl, (int) (pv->Within_sos_decl1 = (pv->Within_sos_decl1 ? 1 : 0)), (int) pv->Within_free_decl);\n}\n    break;\n\n  case 63:\n\n    {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  if((pv->Within_sos_decl1) && (pv->SOStype == 0))\n  {\n    lp_yyerror(pp, pp->scanner, \"Unsupported SOS type (0)\");\n    YYABORT;\n  }\n}\n    break;\n\n  case 67:\n\n    {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  FREE(pv->Last_var0);\n  pv->Last_var0 = strdup(pv->Last_var);\n}\n    break;\n\n  case 69:\n\n    {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  if(pv->Within_sos_decl1) {\n    set_sos_type(pp, pv->SOStype);\n    set_sos_weight(pp, (double) pv->SOSweight, 1);\n  }\n}\n    break;\n\n  case 70:\n\n    {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  if((pv->Within_sos_decl1) && (!pv->SOStype))\n  {\n    set_sos_type(pp, pv->SOStype = (short) (pv->f + .1));\n  }\n  else\n  {\n    lp_yyerror(pp, pp->scanner, \"SOS type not expected\");\n    YYABORT;\n  }\n}\n    break;\n\n  case 72:\n\n    {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  set_sos_weight(pp, (double) pv->SOSweight, 1);\n}\n    break;\n\n  case 73:\n\n    {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  set_sos_weight(pp, pv->f, 1);\n}\n    break;\n\n  case 80:\n\n    {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  if(pv->Within_sos_decl1 == 1)\n  {\n    char buf[16];\n\n    pv->SOSweight++;\n    sprintf(buf, \"SOS%d\", pv->SOSweight);\n    storevarandweight(pp, buf);\n\n    check_int_sec_sos_free_decl(pp, (int) pv->Within_int_decl, (int) pv->Within_sec_decl, 2, (int) pv->Within_free_decl);\n    pv->Within_sos_decl1 = 2;\n    pv->SOSNr = 0;\n  }\n\n  storevarandweight(pp, pv->Last_var);\n\n  if(pv->Within_sos_decl1 == 2)\n  {\n    pv->SOSNr++;\n    set_sos_weight(pp, (double) pv->SOSNr, 2);\n  }\n}\n    break;\n\n  case 81:\n\n    {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  if(!pv->Within_sos_decl1) {\n    lp_yyerror(pp, pp->scanner, \"parse error\");\n    YYABORT;\n  }\n  if(pv->Within_sos_decl1 == 1) {\n    FREE(pv->Last_var0);\n    pv->Last_var0 = strdup(pv->Last_var);\n  }\n  if(pv->Within_sos_decl1 == 2)\n  {\n    storevarandweight(pp, pv->Last_var);\n    pv->SOSNr++;\n    set_sos_weight(pp, (double) pv->SOSNr, 2);\n  }\n}\n    break;\n\n  case 82:\n\n    {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  if(pv->Within_sos_decl1 == 1)\n  {\n    char buf[16];\n\n    pv->SOSweight++;\n    sprintf(buf, \"SOS%d\", pv->SOSweight);\n    storevarandweight(pp, buf);\n\n    check_int_sec_sos_free_decl(pp, (int) pv->Within_int_decl, (int) pv->Within_sec_decl, 2, (int) pv->Within_free_decl);\n    pv->Within_sos_decl1 = 2;\n    pv->SOSNr = 0;\n\n    storevarandweight(pp, pv->Last_var0);\n    pv->SOSNr++;\n  }\n\n  set_sos_weight(pp, pv->f, 2);\n}\n    break;\n\n  case 83:\n\n    { /* SOS name */\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  if(pv->Within_sos_decl1 == 1)\n  {\n    parse_parm *pp = PARM;\n    parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n    storevarandweight(pp, pv->Last_var0);\n    set_sos_type(pp, pv->SOStype);\n    check_int_sec_sos_free_decl(pp, (int) pv->Within_int_decl, (int) pv->Within_sec_decl, 2, (int) pv->Within_free_decl);\n    pv->Within_sos_decl1 = 2;\n    pv->SOSNr = 0;\n    pv->SOSweight++;\n  }\n}\n    break;\n\n\n/* Line 1267 of yacc.c.  */\n\n      default: break;\n    }\n  YY_SYMBOL_PRINT (\"-> $$ =\", lp_yyr1[lp_yyn], &lp_yyval, &lp_yyloc);\n\n  YYPOPSTACK (lp_yylen);\n  lp_yylen = 0;\n  YY_STACK_PRINT (lp_yyss, lp_yyssp);\n\n  *++lp_yyvsp = lp_yyval;\n\n\n  /* Now `shift' the result of the reduction.  Determine what state\n     that goes to, based on the state we popped back to and the rule\n     number reduced by.  */\n\n  lp_yyn = lp_yyr1[lp_yyn];\n\n  lp_yystate = lp_yypgoto[lp_yyn - YYNTOKENS] + *lp_yyssp;\n  if (0 <= lp_yystate && lp_yystate <= YYLAST && lp_yycheck[lp_yystate] == *lp_yyssp)\n    lp_yystate = lp_yytable[lp_yystate];\n  else\n    lp_yystate = lp_yydefgoto[lp_yyn - YYNTOKENS];\n\n  goto lp_yynewstate;\n\n\n/*------------------------------------.\n| lp_yyerrlab -- here on detecting error |\n`------------------------------------*/\nlp_yyerrlab:\n  /* If not already recovering from an error, report this error.  */\n  if (!lp_yyerrstatus)\n    {\n      ++lp_yynerrs;\n#if ! YYERROR_VERBOSE\n      lp_yyerror (parm, scanner, YY_(\"syntax error\"));\n#else\n      {\n\tYYSIZE_T lp_yysize = lp_yysyntax_error (0, lp_yystate, lp_yychar);\n\tif (lp_yymsg_alloc < lp_yysize && lp_yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)\n\t  {\n\t    YYSIZE_T lp_yyalloc = 2 * lp_yysize;\n\t    if (! (lp_yysize <= lp_yyalloc && lp_yyalloc <= YYSTACK_ALLOC_MAXIMUM))\n\t      lp_yyalloc = YYSTACK_ALLOC_MAXIMUM;\n\t    if (lp_yymsg != lp_yymsgbuf)\n\t      YYSTACK_FREE (lp_yymsg);\n\t    lp_yymsg = (char *) YYSTACK_ALLOC (lp_yyalloc);\n\t    if (lp_yymsg)\n\t      lp_yymsg_alloc = lp_yyalloc;\n\t    else\n\t      {\n\t\tlp_yymsg = lp_yymsgbuf;\n\t\tlp_yymsg_alloc = sizeof lp_yymsgbuf;\n\t      }\n\t  }\n\n\tif (0 < lp_yysize && lp_yysize <= lp_yymsg_alloc)\n\t  {\n\t    (void) lp_yysyntax_error (lp_yymsg, lp_yystate, lp_yychar);\n\t    lp_yyerror (parm, scanner, lp_yymsg);\n\t  }\n\telse\n\t  {\n\t    lp_yyerror (parm, scanner, YY_(\"syntax error\"));\n\t    if (lp_yysize != 0)\n\t      goto lp_yyexhaustedlab;\n\t  }\n      }\n#endif\n    }\n\n\n\n  if (lp_yyerrstatus == 3)\n    {\n      /* If just tried and failed to reuse look-ahead token after an\n\t error, discard it.  */\n\n      if (lp_yychar <= YYEOF)\n\t{\n\t  /* Return failure if at end of input.  */\n\t  if (lp_yychar == YYEOF)\n\t    YYABORT;\n\t}\n      else\n\t{\n\t  lp_yydestruct (\"Error: discarding\",\n\t\t      lp_yytoken, &lp_yylval, parm, scanner);\n\t  lp_yychar = YYEMPTY;\n\t}\n    }\n\n  /* Else will try to reuse look-ahead token after shifting the error\n     token.  */\n  goto lp_yyerrlab1;\n\n\n/*---------------------------------------------------.\n| lp_yyerrorlab -- error raised explicitly by YYERROR.  |\n`---------------------------------------------------*/\nlp_yyerrorlab:\n\n  /* Pacify compilers like GCC when the user code never invokes\n     YYERROR and the label lp_yyerrorlab therefore never appears in user\n     code.  */\n  if (/*CONSTCOND*/ 0)\n     goto lp_yyerrorlab;\n\n  /* Do not reclaim the symbols of the rule which action triggered\n     this YYERROR.  */\n  YYPOPSTACK (lp_yylen);\n  lp_yylen = 0;\n  YY_STACK_PRINT (lp_yyss, lp_yyssp);\n  lp_yystate = *lp_yyssp;\n  goto lp_yyerrlab1;\n\n\n/*-------------------------------------------------------------.\n| lp_yyerrlab1 -- common code for both syntax error and YYERROR.  |\n`-------------------------------------------------------------*/\nlp_yyerrlab1:\n  lp_yyerrstatus = 3;\t/* Each real token shifted decrements this.  */\n\n  for (;;)\n    {\n      lp_yyn = lp_yypact[lp_yystate];\n      if (lp_yyn != YYPACT_NINF)\n\t{\n\t  lp_yyn += YYTERROR;\n\t  if (0 <= lp_yyn && lp_yyn <= YYLAST && lp_yycheck[lp_yyn] == YYTERROR)\n\t    {\n\t      lp_yyn = lp_yytable[lp_yyn];\n\t      if (0 < lp_yyn)\n\t\tbreak;\n\t    }\n\t}\n\n      /* Pop the current state because it cannot handle the error token.  */\n      if (lp_yyssp == lp_yyss)\n\tYYABORT;\n\n\n      lp_yydestruct (\"Error: popping\",\n\t\t  lp_yystos[lp_yystate], lp_yyvsp, parm, scanner);\n      YYPOPSTACK (1);\n      lp_yystate = *lp_yyssp;\n      YY_STACK_PRINT (lp_yyss, lp_yyssp);\n    }\n\n  if (lp_yyn == YYFINAL)\n    YYACCEPT;\n\n  *++lp_yyvsp = lp_yylval;\n\n\n  /* Shift the error token.  */\n  YY_SYMBOL_PRINT (\"Shifting\", lp_yystos[lp_yyn], lp_yyvsp, lp_yylsp);\n\n  lp_yystate = lp_yyn;\n  goto lp_yynewstate;\n\n\n/*-------------------------------------.\n| lp_yyacceptlab -- YYACCEPT comes here.  |\n`-------------------------------------*/\nlp_yyacceptlab:\n  lp_yyresult = 0;\n  goto lp_yyreturn;\n\n/*-----------------------------------.\n| lp_yyabortlab -- YYABORT comes here.  |\n`-----------------------------------*/\nlp_yyabortlab:\n  lp_yyresult = 1;\n  goto lp_yyreturn;\n\n#ifndef lp_yyoverflow\n/*-------------------------------------------------.\n| lp_yyexhaustedlab -- memory exhaustion comes here.  |\n`-------------------------------------------------*/\nlp_yyexhaustedlab:\n  lp_yyerror (parm, scanner, YY_(\"memory exhausted\"));\n  lp_yyresult = 2;\n  /* Fall through.  */\n#endif\n\nlp_yyreturn:\n  if (lp_yychar != YYEOF && lp_yychar != YYEMPTY)\n     lp_yydestruct (\"Cleanup: discarding lookahead\",\n\t\t lp_yytoken, &lp_yylval, parm, scanner);\n  /* Do not reclaim the symbols of the rule which action triggered\n     this YYABORT or YYACCEPT.  */\n  YYPOPSTACK (lp_yylen);\n  YY_STACK_PRINT (lp_yyss, lp_yyssp);\n  while (lp_yyssp != lp_yyss)\n    {\n      lp_yydestruct (\"Cleanup: popping\",\n\t\t  lp_yystos[*lp_yyssp], lp_yyvsp, parm, scanner);\n      YYPOPSTACK (1);\n    }\n#ifndef lp_yyoverflow\n  if (lp_yyss != lp_yyssa)\n    YYSTACK_FREE (lp_yyss);\n#endif\n#if YYERROR_VERBOSE\n  if (lp_yymsg != lp_yymsgbuf)\n    YYSTACK_FREE (lp_yymsg);\n#endif\n  /* Make sure YYID is used.  */\n  return YYID (lp_yyresult);\n}\n\n\n\n\n\nstatic void lp_yy_delete_allocated_memory(parse_parm *pp)\n{\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n  /* free memory allocated by flex. Otherwise some memory is not freed.\n     This is a bit tricky. There is not much documentation about this, but a lot of\n     reports of memory that keeps allocated */\n\n  /* If you get errors on this function call, just comment it. This will only result\n     in some memory that is not being freed. */\n\n# if defined YY_CURRENT_BUFFER\n    /* flex defines the macro YY_CURRENT_BUFFER, so you should only get here if lp_rlp.h is\n       generated by flex */\n    /* lex doesn't define this macro and thus should not come here, but lex doesn't has\n       this memory leak also ...*/\n\n#  if 0\n    /* older versions of flex */\n    lp_yy_delete_buffer(YY_CURRENT_BUFFER); /* comment this line if you have problems with it */\n    lp_yy_init = 1; /* make sure that the next time memory is allocated again */\n    lp_yy_start = 0;\n#  else\n    /* As of version 2.5.9 Flex  */\n    lp_yylex_destroy(pp->scanner); /* comment this line if you have problems with it */\n#  endif\n# endif\n\n  FREE(pv->Last_var);\n  FREE(pv->Last_var0);\n}\n\nstatic int parse(parse_parm *pp)\n{\n  return(lp_yyparse(pp, pp->scanner));\n}\n\nlprec *read_lp1(lprec *lp, void *userhandle, read_modeldata_func read_modeldata, int verbose, char *lp_name)\n{\n  parse_vars *pv;\n  lprec *lp1 = NULL;\n\n  CALLOC(pv, 1, parse_vars);\n  if (pv != NULL) {\n    parse_parm pp;\n\n    memset(&pp, 0, sizeof(pp));\n    pp.parse_vars = (void *) pv;\n\n    lp_yylex_init(&pp.scanner);\n    lp_yyset_extra(&pp, pp.scanner);\n\n    lp_yyset_in((FILE *) userhandle, pp.scanner);\n    lp_yyset_out(NULL, pp.scanner);\n    pv->lp_input = read_modeldata;\n    pv->userhandle = userhandle;\n    lp1 = yacc_read(lp, verbose, lp_name, parse, &pp, lp_yy_delete_allocated_memory);\n    FREE(pv);\n  }\n  return(lp1);\n}\n\nlprec * __WINAPI read_lp(FILE *filename, int verbose, char *lp_name)\n{\n  return(read_lp1(NULL, filename, lp_input_lp_yyin, verbose, lp_name));\n}\n\nlprec * __WINAPI read_lpex(void *userhandle, read_modeldata_func read_modeldata, int verbose, char *lp_name)\n{\n  return(read_lp1(NULL, userhandle, read_modeldata, verbose, lp_name));\n}\n\nlprec *read_LP1(lprec *lp, char *filename, int verbose, char *lp_name)\n{\n  FILE *fpin;\n\n  if((fpin = fopen(filename, \"r\")) != NULL) {\n    lp = read_lp1(lp, fpin, lp_input_lp_yyin, verbose, lp_name);\n    fclose(fpin);\n  }\n  else\n    lp = NULL;\n  return(lp);\n}\n\nlprec * __WINAPI read_LP(char *filename, int verbose, char *lp_name)\n{\n  return(read_LP1(NULL, filename, verbose, lp_name));\n}\n\nMYBOOL __WINAPI LP_readhandle(lprec **lp, FILE *filename, int verbose, char *lp_name)\n{\n  if(lp != NULL)\n    *lp = read_lp1(*lp, filename, lp_input_lp_yyin, verbose, lp_name);\n\n  return((lp != NULL) && (*lp != NULL));\n}\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_rlp.h",
    "content": "\n\n\n#define  YY_INT_ALIGNED short int\n\n/* A lexical scanner generated by flex */\n\n#define FLEX_SCANNER\n#define YY_FLEX_MAJOR_VERSION 2\n#define YY_FLEX_MINOR_VERSION 5\n#define YY_FLEX_SUBMINOR_VERSION 35\n#if YY_FLEX_SUBMINOR_VERSION > 0\n#define FLEX_BETA\n#endif\n\n/* First, we deal with  platform-specific or compiler-specific issues. */\n\n/* begin standard C headers. */\n#include <stdio.h>\n#include <string.h>\n#include <errno.h>\n#include <stdlib.h>\n\n/* end standard C headers. */\n\n/* flex integer type definitions */\n\n#ifndef FLEXINT_H\n#define FLEXINT_H\n\n/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */\n\n#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L\n\n/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,\n * if you want the limit (max/min) macros for int types. \n */\n#ifndef __STDC_LIMIT_MACROS\n#define __STDC_LIMIT_MACROS 1\n#endif\n\n#include <inttypes.h>\ntypedef int8_t flex_int8_t;\ntypedef uint8_t flex_uint8_t;\ntypedef int16_t flex_int16_t;\ntypedef uint16_t flex_uint16_t;\ntypedef int32_t flex_int32_t;\ntypedef uint32_t flex_uint32_t;\n#else\ntypedef signed char flex_int8_t;\ntypedef short int flex_int16_t;\ntypedef int flex_int32_t;\ntypedef unsigned char flex_uint8_t; \ntypedef unsigned short int flex_uint16_t;\ntypedef unsigned int flex_uint32_t;\n#endif /* ! C99 */\n\n/* Limits of integral types. */\n#ifndef INT8_MIN\n#define INT8_MIN               (-128)\n#endif\n#ifndef INT16_MIN\n#define INT16_MIN              (-32767-1)\n#endif\n#ifndef INT32_MIN\n#define INT32_MIN              (-2147483647-1)\n#endif\n#ifndef INT8_MAX\n#define INT8_MAX               (127)\n#endif\n#ifndef INT16_MAX\n#define INT16_MAX              (32767)\n#endif\n#ifndef INT32_MAX\n#define INT32_MAX              (2147483647)\n#endif\n#ifndef UINT8_MAX\n#define UINT8_MAX              (255U)\n#endif\n#ifndef UINT16_MAX\n#define UINT16_MAX             (65535U)\n#endif\n#ifndef UINT32_MAX\n#define UINT32_MAX             (4294967295U)\n#endif\n\n#endif /* ! FLEXINT_H */\n\n#ifdef __cplusplus\n\n/* The \"const\" storage-class-modifier is valid. */\n#define YY_USE_CONST\n\n#else\t/* ! __cplusplus */\n\n/* C99 requires __STDC__ to be defined as 1. */\n#if defined (__STDC__)\n\n#define YY_USE_CONST\n\n#endif\t/* defined (__STDC__) */\n#endif\t/* ! __cplusplus */\n\n#ifdef YY_USE_CONST\n#define lp_yyconst const\n#else\n#define lp_yyconst\n#endif\n\n/* Returned upon end-of-file. */\n#define YY_NULL 0\n\n/* Promotes a possibly negative, possibly signed char to an unsigned\n * integer for use as an array index.  If the signed char is negative,\n * we want to instead treat it as an 8-bit unsigned char, hence the\n * double cast.\n */\n#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)\n\n/* An opaque pointer. */\n#ifndef YY_TYPEDEF_YY_SCANNER_T\n#define YY_TYPEDEF_YY_SCANNER_T\ntypedef void* lp_yyscan_t;\n#endif\n\n/* For convenience, these vars (plus the bison vars far below)\n   are macros in the reentrant scanner. */\n#define lp_yyin lp_yyg->lp_yyin_r\n#define lp_yyout lp_yyg->lp_yyout_r\n#define lp_yyextra lp_yyg->lp_yyextra_r\n#define lp_yyleng lp_yyg->lp_yyleng_r\n#define lp_yytext lp_yyg->lp_yytext_r\n#define lp_yylineno (YY_CURRENT_BUFFER_LVALUE->lp_yy_bs_lineno)\n#define lp_yycolumn (YY_CURRENT_BUFFER_LVALUE->lp_yy_bs_column)\n#define lp_yy_flex_debug lp_yyg->lp_yy_flex_debug_r\n\n/* Enter a start condition.  This macro really ought to take a parameter,\n * but we do it the disgusting crufty way forced on us by the ()-less\n * definition of BEGIN.\n */\n#define BEGIN lp_yyg->lp_yy_start = 1 + 2 *\n\n/* Translate the current start state into a value that can be later handed\n * to BEGIN to return to the state.  The YYSTATE alias is for lex\n * compatibility.\n */\n#define YY_START ((lp_yyg->lp_yy_start - 1) / 2)\n#define YYSTATE YY_START\n\n/* Action number for EOF rule of a given start state. */\n#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)\n\n/* Special action meaning \"start processing a new file\". */\n#define YY_NEW_FILE lp_yyrestart(lp_yyin ,lp_yyscanner )\n\n#define YY_END_OF_BUFFER_CHAR 0\n\n/* Size of default input buffer. */\n#ifndef YY_BUF_SIZE\n#define YY_BUF_SIZE 16384\n#endif\n\n/* The state buf must be large enough to hold one state per character in the main buffer.\n */\n#define YY_STATE_BUF_SIZE   ((YY_BUF_SIZE + 2) * sizeof(lp_yy_state_type))\n\n#ifndef YY_TYPEDEF_YY_BUFFER_STATE\n#define YY_TYPEDEF_YY_BUFFER_STATE\ntypedef struct lp_yy_buffer_state *YY_BUFFER_STATE;\n#endif\n\n#define EOB_ACT_CONTINUE_SCAN 0\n#define EOB_ACT_END_OF_FILE 1\n#define EOB_ACT_LAST_MATCH 2\n\n    /* Note: We specifically omit the test for lp_yy_rule_can_match_eol because it requires\n     *       access to the local variable lp_yy_act. Since lp_yyless() is a macro, it would break\n     *       existing scanners that call lp_yyless() from OUTSIDE lp_yylex. \n     *       One obvious solution it to make lp_yy_act a global. I tried that, and saw\n     *       a 5% performance hit in a non-lp_yylineno scanner, because lp_yy_act is\n     *       normally declared as a register variable-- so it is not worth it.\n     */\n    #define  YY_LESS_LINENO(n) \\\n            do { \\\n                int lp_yyl;\\\n                for ( lp_yyl = n; lp_yyl < lp_yyleng; ++lp_yyl )\\\n                    if ( lp_yytext[lp_yyl] == '\\n' )\\\n                        --lp_yylineno;\\\n            }while(0)\n    \n/* Return all but the first \"n\" matched characters back to the input stream. */\n#define lp_yyless(n) \\\n\tdo \\\n\t\t{ \\\n\t\t/* Undo effects of setting up lp_yytext. */ \\\n        int lp_yyless_macro_arg = (n); \\\n        YY_LESS_LINENO(lp_yyless_macro_arg);\\\n\t\t*lp_yy_cp = lp_yyg->lp_yy_hold_char; \\\n\t\tYY_RESTORE_YY_MORE_OFFSET \\\n\t\tlp_yyg->lp_yy_c_buf_p = lp_yy_cp = lp_yy_bp + lp_yyless_macro_arg - YY_MORE_ADJ; \\\n\t\tYY_DO_BEFORE_ACTION; /* set up lp_yytext again */ \\\n\t\t} \\\n\twhile ( 0 )\n\n#define unput(c) lp_yyunput( c, lp_yyg->lp_yytext_ptr , lp_yyscanner )\n\n#ifndef YY_TYPEDEF_YY_SIZE_T\n#define YY_TYPEDEF_YY_SIZE_T\ntypedef size_t lp_yy_size_t;\n#endif\n\n#ifndef YY_STRUCT_YY_BUFFER_STATE\n#define YY_STRUCT_YY_BUFFER_STATE\nstruct lp_yy_buffer_state\n\t{\n\tFILE *lp_yy_input_file;\n\n\tchar *lp_yy_ch_buf;\t\t/* input buffer */\n\tchar *lp_yy_buf_pos;\t\t/* current position in input buffer */\n\n\t/* Size of input buffer in bytes, not including room for EOB\n\t * characters.\n\t */\n\tlp_yy_size_t lp_yy_buf_size;\n\n\t/* Number of characters read into lp_yy_ch_buf, not including EOB\n\t * characters.\n\t */\n\tint lp_yy_n_chars;\n\n\t/* Whether we \"own\" the buffer - i.e., we know we created it,\n\t * and can realloc() it to grow it, and should free() it to\n\t * delete it.\n\t */\n\tint lp_yy_is_our_buffer;\n\n\t/* Whether this is an \"interactive\" input source; if so, and\n\t * if we're using stdio for input, then we want to use getc()\n\t * instead of fread(), to make sure we stop fetching input after\n\t * each newline.\n\t */\n\tint lp_yy_is_interactive;\n\n\t/* Whether we're considered to be at the beginning of a line.\n\t * If so, '^' rules will be active on the next match, otherwise\n\t * not.\n\t */\n\tint lp_yy_at_bol;\n\n    int lp_yy_bs_lineno; /**< The line count. */\n    int lp_yy_bs_column; /**< The column count. */\n    \n\t/* Whether to try to fill the input buffer when we reach the\n\t * end of it.\n\t */\n\tint lp_yy_fill_buffer;\n\n\tint lp_yy_buffer_status;\n\n#define YY_BUFFER_NEW 0\n#define YY_BUFFER_NORMAL 1\n\t/* When an EOF's been seen but there's still some text to process\n\t * then we mark the buffer as YY_EOF_PENDING, to indicate that we\n\t * shouldn't try reading from the input source any more.  We might\n\t * still have a bunch of tokens to match, though, because of\n\t * possible backing-up.\n\t *\n\t * When we actually see the EOF, we change the status to \"new\"\n\t * (via lp_yyrestart()), so that the user can continue scanning by\n\t * just pointing lp_yyin at a new input file.\n\t */\n#define YY_BUFFER_EOF_PENDING 2\n\n\t};\n#endif /* !YY_STRUCT_YY_BUFFER_STATE */\n\n/* We provide macros for accessing buffer states in case in the\n * future we want to put the buffer states in a more general\n * \"scanner state\".\n *\n * Returns the top of the stack, or NULL.\n */\n#define YY_CURRENT_BUFFER ( lp_yyg->lp_yy_buffer_stack \\\n                          ? lp_yyg->lp_yy_buffer_stack[lp_yyg->lp_yy_buffer_stack_top] \\\n                          : NULL)\n\n/* Same as previous macro, but useful when we know that the buffer stack is not\n * NULL or when we need an lvalue. For internal use only.\n */\n#define YY_CURRENT_BUFFER_LVALUE lp_yyg->lp_yy_buffer_stack[lp_yyg->lp_yy_buffer_stack_top]\n\nvoid lp_yyrestart (FILE *input_file ,lp_yyscan_t lp_yyscanner );\nvoid lp_yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ,lp_yyscan_t lp_yyscanner );\nYY_BUFFER_STATE lp_yy_create_buffer (FILE *file,int size ,lp_yyscan_t lp_yyscanner );\nvoid lp_yy_delete_buffer (YY_BUFFER_STATE b ,lp_yyscan_t lp_yyscanner );\nvoid lp_yy_flush_buffer (YY_BUFFER_STATE b ,lp_yyscan_t lp_yyscanner );\nvoid lp_yypush_buffer_state (YY_BUFFER_STATE new_buffer ,lp_yyscan_t lp_yyscanner );\nvoid lp_yypop_buffer_state (lp_yyscan_t lp_yyscanner );\n\nstatic void lp_yyensure_buffer_stack (lp_yyscan_t lp_yyscanner );\nstatic void lp_yy_load_buffer_state (lp_yyscan_t lp_yyscanner );\nstatic void lp_yy_init_buffer (YY_BUFFER_STATE b,FILE *file ,lp_yyscan_t lp_yyscanner );\n\n#define YY_FLUSH_BUFFER lp_yy_flush_buffer(YY_CURRENT_BUFFER ,lp_yyscanner)\n\nYY_BUFFER_STATE lp_yy_scan_buffer (char *base,lp_yy_size_t size ,lp_yyscan_t lp_yyscanner );\nYY_BUFFER_STATE lp_yy_scan_string (lp_yyconst char *lp_yy_str ,lp_yyscan_t lp_yyscanner );\nYY_BUFFER_STATE lp_yy_scan_bytes (lp_yyconst char *bytes,int len ,lp_yyscan_t lp_yyscanner );\n\nvoid *lp_yyalloc (lp_yy_size_t ,lp_yyscan_t lp_yyscanner );\nvoid *lp_yyrealloc (void *,lp_yy_size_t ,lp_yyscan_t lp_yyscanner );\nvoid lp_yyfree (void * ,lp_yyscan_t lp_yyscanner );\n\n#define lp_yy_new_buffer lp_yy_create_buffer\n\n#define lp_yy_set_interactive(is_interactive) \\\n\t{ \\\n\tif ( ! YY_CURRENT_BUFFER ){ \\\n        lp_yyensure_buffer_stack (lp_yyscanner); \\\n\t\tYY_CURRENT_BUFFER_LVALUE =    \\\n            lp_yy_create_buffer(lp_yyin,YY_BUF_SIZE ,lp_yyscanner); \\\n\t} \\\n\tYY_CURRENT_BUFFER_LVALUE->lp_yy_is_interactive = is_interactive; \\\n\t}\n\n#define lp_yy_set_bol(at_bol) \\\n\t{ \\\n\tif ( ! YY_CURRENT_BUFFER ){\\\n        lp_yyensure_buffer_stack (lp_yyscanner); \\\n\t\tYY_CURRENT_BUFFER_LVALUE =    \\\n            lp_yy_create_buffer(lp_yyin,YY_BUF_SIZE ,lp_yyscanner); \\\n\t} \\\n\tYY_CURRENT_BUFFER_LVALUE->lp_yy_at_bol = at_bol; \\\n\t}\n\n#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->lp_yy_at_bol)\n\n/* Begin user sect3 */\n\n#define lp_yywrap(n) 1\n#define YY_SKIP_YYWRAP\n\ntypedef unsigned char YY_CHAR;\n\ntypedef int lp_yy_state_type;\n\n#define lp_yytext_ptr lp_yytext_r\n\nstatic lp_yy_state_type lp_yy_get_previous_state (lp_yyscan_t lp_yyscanner );\nstatic lp_yy_state_type lp_yy_try_NUL_trans (lp_yy_state_type current_state  ,lp_yyscan_t lp_yyscanner);\nstatic int lp_yy_get_next_buffer (lp_yyscan_t lp_yyscanner );\nstatic void lp_yy_fatal_error (lp_yyconst char msg[] ,lp_yyscan_t lp_yyscanner );\n\n/* Done after the current pattern has been matched and before the\n * corresponding action - sets up lp_yytext.\n */\n#define YY_DO_BEFORE_ACTION \\\n\tlp_yyg->lp_yytext_ptr = lp_yy_bp; \\\n\tlp_yyleng = (size_t) (lp_yy_cp - lp_yy_bp); \\\n\tlp_yyg->lp_yy_hold_char = *lp_yy_cp; \\\n\t*lp_yy_cp = '\\0'; \\\n\tlp_yyg->lp_yy_c_buf_p = lp_yy_cp;\n\n#define YY_NUM_RULES 33\n#define YY_END_OF_BUFFER 34\n/* This struct is not used in this scanner,\n   but its presence is necessary. */\nstruct lp_yy_trans_info\n\t{\n\tflex_int32_t lp_yy_verify;\n\tflex_int32_t lp_yy_nxt;\n\t};\nstatic lp_yyconst flex_int16_t lp_yy_accept[144] =\n    {   0,\n        0,    0,    0,    0,    0,    0,   34,   32,   10,   10,\n       27,   17,   11,   32,   32,   14,   26,   31,   29,   28,\n       30,   25,   25,   10,   25,   25,   25,   25,    3,    4,\n        3,    3,    9,    7,    8,   10,   17,   17,    0,   15,\n        1,    6,   15,   14,    0,   29,   30,    0,   25,   24,\n        0,   25,   25,   10,    0,    0,    0,    0,   25,   25,\n       25,   25,   25,    2,    0,   15,    0,   15,   22,    0,\n       25,   25,    0,    0,    0,    0,    0,   19,   25,   18,\n       20,   25,   25,   21,    0,   25,    0,   13,   25,    0,\n       12,   25,   19,    0,   18,   20,   21,   25,   23,   25,\n\n       20,   21,   21,   16,   16,    0,   25,   25,    0,   23,\n        0,   21,   25,   25,    0,    0,   25,   25,    0,    0,\n       19,   25,    0,    0,   25,   25,   19,    0,   18,    0,\n        0,   25,   25,   18,    0,    0,    0,    0,    0,    0,\n        0,    0,    0\n    } ;\n\nstatic lp_yyconst flex_int32_t lp_yy_ec[256] =\n    {   0,\n        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,\n        1,    1,    4,    1,    1,    1,    1,    1,    1,    1,\n        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n        1,    2,    1,    1,    5,    6,    5,    5,    5,    1,\n        1,    7,    8,    9,   10,   11,   12,   13,   14,   14,\n       13,   13,   13,   13,   13,   13,   13,   15,   16,   17,\n       18,   19,    1,    5,   20,   21,   22,   23,   24,   25,\n       26,   23,   27,   23,   23,   23,   28,   29,   30,   23,\n       23,   31,   32,   33,   34,   23,   23,   35,   36,   37,\n        5,    1,    5,    5,    5,    1,   20,   21,   22,   23,\n\n       24,   25,   26,   23,   27,   23,   23,   23,   28,   29,\n       30,   23,   23,   31,   32,   33,   34,   23,   23,   35,\n       36,   37,    5,    1,    5,    5,    1,    1,    1,    1,\n        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n\n        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n        1,    1,    1,    1,    1\n    } ;\n\nstatic lp_yyconst flex_int32_t lp_yy_meta[38] =\n    {   0,\n        1,    2,    3,    3,    4,    5,    6,    3,    6,    3,\n        5,    5,    5,    5,    7,    6,    7,    6,    6,    4,\n        4,    4,    4,    4,    4,    4,    8,    4,    4,    4,\n        4,    4,    4,    4,    4,    4,    4\n    } ;\n\nstatic lp_yyconst flex_int16_t lp_yy_base[150] =\n    {   0,\n        0,   36,   36,   38,   43,   45,  366,  388,   48,   62,\n      388,  338,  388,   40,   48,   60,  388,  388,  346,  388,\n      326,   60,   65,   91,   81,   74,   85,  102,  388,  388,\n      388,  330,  388,  388,  388,  125,  313,  134,  308,   96,\n      388,  388,  117,  132,  139,  388,  388,   88,  146,  320,\n        0,  149,  152,    0,  307,  301,  294,   83,  153,  156,\n      157,  189,  160,  388,  286,  126,   65,  108,  388,  289,\n      181,  185,  272,  273,  250,  249,  220,  199,  203,  208,\n      192,  211,  219,  227,  243,  109,  163,  225,  202,  174,\n      224,  215,  213,  207,  191,  388,  189,  227,  228,  231,\n\n      244,  240,  253,  276,  388,  170,  260,  262,  166,  388,\n      169,  179,  263,  241,  166,  159,  270,  272,  149,  155,\n      284,  288,  130,  124,  296,  303,  388,  103,  300,   96,\n       45,  324,  328,  388,   82,  311,   79,   68,   54,   56,\n       25,   12,  388,  345,  353,  360,  367,  372,  379\n    } ;\n\nstatic lp_yyconst flex_int16_t lp_yy_def[150] =\n    {   0,\n      143,    1,  144,  144,  145,  145,  143,  143,  143,  143,\n      143,  146,  143,  143,  143,  143,  143,  143,  143,  143,\n      143,  147,  147,  143,  147,  147,  147,  147,  143,  143,\n      143,  143,  143,  143,  143,  143,  146,  143,  143,  143,\n      143,  143,  143,  143,  143,  143,  143,  143,  147,  143,\n      148,  147,  147,   24,  143,  143,  143,  143,  147,  147,\n      147,  147,  147,  143,  143,  143,  143,  143,  143,  148,\n      147,  147,  143,  143,  143,  143,  143,  147,  147,  147,\n      147,  147,  147,  147,  149,  143,  143,  143,   62,  143,\n      143,   62,  143,  143,  143,  143,  143,   62,   62,   62,\n\n       62,   62,   62,  143,  143,  143,   62,   62,  143,  143,\n      143,  143,   62,   62,  143,  143,   62,   62,  143,  143,\n       62,   62,  143,  143,   62,   62,  143,  143,   62,  143,\n      143,  147,  147,  143,  143,  149,  143,  143,  143,  143,\n      143,  143,    0,  143,  143,  143,  143,  143,  143\n    } ;\n\nstatic lp_yyconst flex_int16_t lp_yy_nxt[426] =\n    {   0,\n        8,    9,   10,    9,    8,    8,   11,   12,   13,   12,\n       14,   15,   16,   16,   17,   18,   19,   20,   21,   22,\n       22,   22,   22,   22,   22,   22,   22,   23,   22,   22,\n       22,   22,   22,   22,   22,   22,   22,   24,   30,   31,\n       30,   31,   32,   96,   32,   34,   35,   34,   35,   36,\n       36,   36,   40,   40,   41,   37,   25,   37,  142,   42,\n       26,   48,   27,   36,   36,   36,   48,   28,  136,   37,\n       43,   37,   44,   44,   50,   48,   51,   68,   68,   50,\n      136,   51,   48,   45,   52,  141,   48,  140,   50,   48,\n       51,   53,   54,   36,   36,   50,  139,   51,   37,   50,\n\n       37,   51,   50,   48,   60,  138,   76,   59,   40,   40,\n       48,   55,   77,   61,  137,   56,   50,   57,   51,   45,\n       68,   68,   58,   50,  135,   62,   36,   36,   36,   66,\n       66,   63,   37,  134,   37,   38,   38,   38,   66,   66,\n       45,   38,   43,   38,   44,   44,   67,   48,   67,   45,\n       48,   68,   68,   48,   48,   45,  131,   48,   48,  130,\n       50,   48,   51,   50,   87,   51,   50,   50,   51,   51,\n       50,   50,   51,   51,   50,   90,   51,   88,  128,   79,\n       72,   78,   87,   71,  127,  124,   90,  123,   91,   80,\n       48,   84,  112,   48,  120,   88,  119,   51,  116,   91,\n\n       48,   51,  112,   50,   48,   51,   50,   89,   51,   48,\n       81,   92,   48,   50,  111,   51,   82,   50,   98,   51,\n       48,   83,   50,   49,   51,   50,   99,   51,   48,  107,\n      110,  100,  109,   50,   49,   51,   49,  101,   69,   69,\n      103,   50,  108,   51,  104,  104,  104,   49,   49,   49,\n      102,   97,   49,  115,   49,   49,  114,  113,   49,   49,\n       49,   49,   49,   49,  122,   49,  103,   49,   49,  106,\n       96,   49,   49,   49,   49,   81,   49,  104,  104,  104,\n       49,   49,   95,   49,   49,   49,  117,   49,  118,   49,\n       49,   49,   49,   49,   49,   49,   94,   49,  121,   49,\n\n       93,  125,   49,  126,   49,   49,  125,   86,  126,   49,\n       85,   49,  104,  104,  104,   49,   49,   49,  129,  132,\n       49,   49,   75,   49,   49,   87,  133,   49,   49,   90,\n       49,   74,   49,   73,   69,   49,   65,  143,   88,   39,\n       51,   64,   91,   47,   51,   29,   29,   29,   29,   29,\n       29,   29,   29,   33,   33,   33,   33,   33,   33,   33,\n       33,   38,   38,   46,   39,  143,  143,   38,   49,  143,\n       49,   49,  143,   49,   49,   70,   70,  143,  143,   70,\n      105,  105,  143,  105,  105,  105,  105,    7,  143,  143,\n      143,  143,  143,  143,  143,  143,  143,  143,  143,  143,\n\n      143,  143,  143,  143,  143,  143,  143,  143,  143,  143,\n      143,  143,  143,  143,  143,  143,  143,  143,  143,  143,\n      143,  143,  143,  143,  143\n    } ;\n\nstatic lp_yyconst flex_int16_t lp_yy_chk[426] =\n    {   0,\n        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n        1,    1,    1,    1,    1,    1,    1,    2,    3,    3,\n        4,    4,    3,  142,    4,    5,    5,    6,    6,    9,\n        9,    9,   14,   14,   15,    9,    2,    9,  141,   15,\n        2,   22,    2,   10,   10,   10,   23,    2,  131,   10,\n       16,   10,   16,   16,   22,   26,   22,   67,   67,   23,\n      131,   23,   25,   16,   23,  140,   27,  139,   26,   48,\n       26,   23,   24,   24,   24,   25,  138,   25,   24,   27,\n\n       24,   27,   48,   28,   26,  137,   58,   25,   40,   40,\n       86,   24,   58,   27,  135,   24,   28,   24,   28,   40,\n       68,   68,   24,   86,  130,   28,   36,   36,   36,   43,\n       43,   28,   36,  128,   36,   38,   38,   38,   66,   66,\n       43,   38,   44,   38,   44,   44,   45,   49,   45,   66,\n       52,   45,   45,   53,   59,   44,  124,   60,   61,  123,\n       49,   63,   49,   52,   87,   52,   53,   59,   53,   59,\n       60,   61,   60,   61,   63,   90,   63,   87,  120,   60,\n       53,   59,   71,   52,  119,  116,   72,  115,   90,   61,\n       62,   63,  112,   81,  111,   71,  109,   71,  106,   72,\n\n       78,   72,   97,   62,   79,   62,   81,   71,   81,   80,\n       62,   72,   82,   78,   95,   78,   62,   79,   78,   79,\n       83,   62,   80,   89,   80,   82,   79,   82,   84,   89,\n       94,   80,   93,   83,   89,   83,   92,   82,   91,   88,\n       84,   84,   92,   84,   85,   85,   85,   92,   98,   99,\n       83,   77,  100,  101,   98,   99,  100,   98,  100,   98,\n       99,  102,  114,  100,  114,  101,  103,  102,  114,   85,\n       76,  101,  102,  114,  103,  101,  101,  104,  104,  104,\n      103,  107,   75,  108,  113,  103,  107,  107,  108,  108,\n      113,  117,  107,  118,  108,  113,   74,  117,  113,  118,\n\n       73,  117,  117,  118,  118,  121,  117,   70,  118,  122,\n       65,  121,  136,  136,  136,  122,  121,  125,  122,  125,\n      122,  129,   57,  125,  126,  132,  126,  129,  125,  133,\n      126,   56,  129,   55,   50,  126,   39,  136,  132,   37,\n      132,   32,  133,   21,  133,  144,  144,  144,  144,  144,\n      144,  144,  144,  145,  145,  145,  145,  145,  145,  145,\n      145,  146,  146,   19,   12,    7,    0,  146,  147,    0,\n      147,  147,    0,  147,  147,  148,  148,    0,    0,  148,\n      149,  149,    0,  149,  149,  149,  149,  143,  143,  143,\n      143,  143,  143,  143,  143,  143,  143,  143,  143,  143,\n\n      143,  143,  143,  143,  143,  143,  143,  143,  143,  143,\n      143,  143,  143,  143,  143,  143,  143,  143,  143,  143,\n      143,  143,  143,  143,  143\n    } ;\n\n/* Table of booleans, true if rule could match eol. */\nstatic lp_yyconst flex_int32_t lp_yy_rule_can_match_eol[34] =\n    {   0,\n0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, \n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,     };\n\n/* The intent behind this definition is that it'll catch\n * any uses of REJECT which flex missed.\n */\n#define REJECT reject_used_but_not_detected\n#define lp_yymore() lp_yymore_used_but_not_detected\n#define YY_MORE_ADJ 0\n#define YY_RESTORE_YY_MORE_OFFSET\n/*\n   made reentrant with help of\n   http://www.usualcoding.eu/post/2007/09/03/Building-a-reentrant-parser-in-C-with-Flex/Bison\n*/\n/*\n   Note that a minimum version of flex is needed to be able to compile this.\n   Older version don't know the reentrant code.\n   Version 2.5.4 is not enough. Probably at least v2.5.31 is needed. Tested with v2.5.35\n*/\n/*\n** We want the scanner to be reentrant, therefore generate no global variables.\n** That what the 'reentrant' option is for.\n** 'bison-bridge' is used to create a bison compatible scanner and share lp_yylval\n*/\n\n#define INITIAL 0\n#define COMMENT 1\n#define LINECOMMENT 2\n\n#ifndef YY_NO_UNISTD_H\n/* Special case for \"unistd.h\", since it is non-ANSI. We include it way\n * down here because we want the user's section 1 to have been scanned first.\n * The user has a chance to override it with an option.\n */\n#include <unistd.h>\n#endif\n\n#ifndef YY_EXTRA_TYPE\n#define YY_EXTRA_TYPE void *\n#endif\n\n/* Holds the entire state of the reentrant scanner. */\nstruct lp_yyguts_t\n    {\n\n    /* User-defined. Not touched by flex. */\n    YY_EXTRA_TYPE lp_yyextra_r;\n\n    /* The rest are the same as the globals declared in the non-reentrant scanner. */\n    FILE *lp_yyin_r, *lp_yyout_r;\n    size_t lp_yy_buffer_stack_top; /**< index of top of stack. */\n    size_t lp_yy_buffer_stack_max; /**< capacity of stack. */\n    YY_BUFFER_STATE * lp_yy_buffer_stack; /**< Stack as an array. */\n    char lp_yy_hold_char;\n    int lp_yy_n_chars;\n    int lp_yyleng_r;\n    char *lp_yy_c_buf_p;\n    int lp_yy_init;\n    int lp_yy_start;\n    int lp_yy_did_buffer_switch_on_eof;\n    int lp_yy_start_stack_ptr;\n    int lp_yy_start_stack_depth;\n    int *lp_yy_start_stack;\n    lp_yy_state_type lp_yy_last_accepting_state;\n    char* lp_yy_last_accepting_cpos;\n\n    int lp_yylineno_r;\n    int lp_yy_flex_debug_r;\n\n    char *lp_yytext_r;\n    int lp_yy_more_flag;\n    int lp_yy_more_len;\n\n    YYSTYPE * lp_yylval_r;\n\n    }; /* end struct lp_yyguts_t */\n\nstatic int lp_yy_init_globals (lp_yyscan_t lp_yyscanner );\n\n    /* This must go here because YYSTYPE and YYLTYPE are included\n     * from bison output in section 1.*/\n    #    define lp_yylval lp_yyg->lp_yylval_r\n    \nint lp_yylex_init (lp_yyscan_t* scanner);\n\nint lp_yylex_init_extra (YY_EXTRA_TYPE user_defined,lp_yyscan_t* scanner);\n\n/* Accessor methods to globals.\n   These are made visible to non-reentrant scanners for convenience. */\n\nint lp_yylex_destroy (lp_yyscan_t lp_yyscanner );\n\nint lp_yyget_debug (lp_yyscan_t lp_yyscanner );\n\nvoid lp_yyset_debug (int debug_flag ,lp_yyscan_t lp_yyscanner );\n\nYY_EXTRA_TYPE lp_yyget_extra (lp_yyscan_t lp_yyscanner );\n\nvoid lp_yyset_extra (YY_EXTRA_TYPE user_defined ,lp_yyscan_t lp_yyscanner );\n\nFILE *lp_yyget_in (lp_yyscan_t lp_yyscanner );\n\nvoid lp_yyset_in  (FILE * in_str ,lp_yyscan_t lp_yyscanner );\n\nFILE *lp_yyget_out (lp_yyscan_t lp_yyscanner );\n\nvoid lp_yyset_out  (FILE * out_str ,lp_yyscan_t lp_yyscanner );\n\nint lp_yyget_leng (lp_yyscan_t lp_yyscanner );\n\nchar *lp_yyget_text (lp_yyscan_t lp_yyscanner );\n\nint lp_yyget_lineno (lp_yyscan_t lp_yyscanner );\n\nvoid lp_yyset_lineno (int line_number ,lp_yyscan_t lp_yyscanner );\n\nYYSTYPE * lp_yyget_lval (lp_yyscan_t lp_yyscanner );\n\nvoid lp_yyset_lval (YYSTYPE * lp_yylval_param ,lp_yyscan_t lp_yyscanner );\n\n/* Macros after this point can all be overridden by user definitions in\n * section 1.\n */\n\n#ifndef YY_SKIP_YYWRAP\n#ifdef __cplusplus\nextern \"C\" int lp_yywrap (lp_yyscan_t lp_yyscanner );\n#else\nextern int lp_yywrap (lp_yyscan_t lp_yyscanner );\n#endif\n#endif\n\n    static void lp_yyunput (int c,char *buf_ptr  ,lp_yyscan_t lp_yyscanner);\n    \n#ifndef lp_yytext_ptr\nstatic void lp_yy_flex_strncpy (char *,lp_yyconst char *,int ,lp_yyscan_t lp_yyscanner);\n#endif\n\n#ifdef YY_NEED_STRLEN\nstatic int lp_yy_flex_strlen (lp_yyconst char * ,lp_yyscan_t lp_yyscanner);\n#endif\n\n#ifndef YY_NO_INPUT\n\n#ifdef __cplusplus\nstatic int lp_yyinput (lp_yyscan_t lp_yyscanner );\n#else\nstatic int input (lp_yyscan_t lp_yyscanner );\n#endif\n\n#endif\n\n/* Amount of stuff to slurp up with each read. */\n#ifndef YY_READ_BUF_SIZE\n#define YY_READ_BUF_SIZE 8192\n#endif\n\n/* Copy whatever the last rule matched to the standard output. */\n#ifndef ECHO\n/* This used to be an fputs(), but since the string might contain NUL's,\n * we now use fwrite().\n */\n#define ECHO fwrite( lp_yytext, lp_yyleng, 1, lp_yyout )\n#endif\n\n/* Gets input and stuffs it into \"buf\".  number of characters read, or YY_NULL,\n * is returned in \"result\".\n */\n#ifndef YY_INPUT\n#define YY_INPUT(buf,result,max_size) \\\n\tif ( YY_CURRENT_BUFFER_LVALUE->lp_yy_is_interactive ) \\\n\t\t{ \\\n\t\tint c = '*'; \\\n\t\tint n; \\\n\t\tfor ( n = 0; n < max_size && \\\n\t\t\t     (c = getc( lp_yyin )) != EOF && c != '\\n'; ++n ) \\\n\t\t\tbuf[n] = (char) c; \\\n\t\tif ( c == '\\n' ) \\\n\t\t\tbuf[n++] = (char) c; \\\n\t\tif ( c == EOF && ferror( lp_yyin ) ) \\\n\t\t\tYY_FATAL_ERROR( \"input in flex scanner failed\" ); \\\n\t\tresult = n; \\\n\t\t} \\\n\telse \\\n\t\t{ \\\n\t\terrno=0; \\\n\t\twhile ( (result = fread(buf, 1, max_size, lp_yyin))==0 && ferror(lp_yyin)) \\\n\t\t\t{ \\\n\t\t\tif( errno != EINTR) \\\n\t\t\t\t{ \\\n\t\t\t\tYY_FATAL_ERROR( \"input in flex scanner failed\" ); \\\n\t\t\t\tbreak; \\\n\t\t\t\t} \\\n\t\t\terrno=0; \\\n\t\t\tclearerr(lp_yyin); \\\n\t\t\t} \\\n\t\t}\\\n\\\n\n#endif\n\n/* No semi-colon after return; correct usage is to write \"lp_yyterminate();\" -\n * we don't want an extra ';' after the \"return\" because that will cause\n * some compilers to complain about unreachable statements.\n */\n#ifndef lp_yyterminate\n#define lp_yyterminate() return YY_NULL\n#endif\n\n/* Number of entries by which start-condition stack grows. */\n#ifndef YY_START_STACK_INCR\n#define YY_START_STACK_INCR 25\n#endif\n\n/* Report a fatal error. */\n#ifndef YY_FATAL_ERROR\n#define YY_FATAL_ERROR(msg) lp_yy_fatal_error( msg , lp_yyscanner)\n#endif\n\n/* end tables serialization structures and prototypes */\n\n/* Default declaration of generated scanner - a define so the user can\n * easily add parameters.\n */\n#ifndef YY_DECL\n#define YY_DECL_IS_OURS 1\n\nextern int lp_yylex \\\n               (YYSTYPE * lp_yylval_param ,lp_yyscan_t lp_yyscanner);\n\n#define YY_DECL int lp_yylex \\\n               (YYSTYPE * lp_yylval_param , lp_yyscan_t lp_yyscanner)\n#endif /* !YY_DECL */\n\n/* Code executed at the beginning of each rule, after lp_yytext and lp_yyleng\n * have been set up.\n */\n#ifndef YY_USER_ACTION\n#define YY_USER_ACTION\n#endif\n\n/* Code executed at the end of each rule. */\n#ifndef YY_BREAK\n#define YY_BREAK break;\n#endif\n\n#define YY_RULE_SETUP \\\n\tif ( lp_yyleng > 0 ) \\\n\t\tYY_CURRENT_BUFFER_LVALUE->lp_yy_at_bol = \\\n\t\t\t\t(lp_yytext[lp_yyleng - 1] == '\\n'); \\\n\tYY_USER_ACTION\n\n/** The main scanner function which does all the work.\n */\nYY_DECL\n{\n\tregister lp_yy_state_type lp_yy_current_state;\n\tregister char *lp_yy_cp, *lp_yy_bp;\n\tregister int lp_yy_act;\n    struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner;\n\n    lp_yylval = lp_yylval_param;\n\n\tif ( !lp_yyg->lp_yy_init )\n\t\t{\n\t\tlp_yyg->lp_yy_init = 1;\n\n#ifdef YY_USER_INIT\n\t\tYY_USER_INIT;\n#endif\n\n\t\tif ( ! lp_yyg->lp_yy_start )\n\t\t\tlp_yyg->lp_yy_start = 1;\t/* first start state */\n\n\t\tif ( ! lp_yyin )\n\t\t\tlp_yyin = stdin;\n\n\t\tif ( ! lp_yyout )\n\t\t\tlp_yyout = stdout;\n\n\t\tif ( ! YY_CURRENT_BUFFER ) {\n\t\t\tlp_yyensure_buffer_stack (lp_yyscanner);\n\t\t\tYY_CURRENT_BUFFER_LVALUE =\n\t\t\t\tlp_yy_create_buffer(lp_yyin,YY_BUF_SIZE ,lp_yyscanner);\n\t\t}\n\n\t\tlp_yy_load_buffer_state(lp_yyscanner );\n\t\t}\n\n\twhile ( 1 )\t\t/* loops until end-of-file is reached */\n\t\t{\n\t\tlp_yy_cp = lp_yyg->lp_yy_c_buf_p;\n\n\t\t/* Support of lp_yytext. */\n\t\t*lp_yy_cp = lp_yyg->lp_yy_hold_char;\n\n\t\t/* lp_yy_bp points to the position in lp_yy_ch_buf of the start of\n\t\t * the current run.\n\t\t */\n\t\tlp_yy_bp = lp_yy_cp;\n\n\t\tlp_yy_current_state = lp_yyg->lp_yy_start;\n\t\tlp_yy_current_state += YY_AT_BOL();\nlp_yy_match:\n\t\tdo\n\t\t\t{\n\t\t\tregister YY_CHAR lp_yy_c = lp_yy_ec[YY_SC_TO_UI(*lp_yy_cp)];\n\t\t\tif ( lp_yy_accept[lp_yy_current_state] )\n\t\t\t\t{\n\t\t\t\tlp_yyg->lp_yy_last_accepting_state = lp_yy_current_state;\n\t\t\t\tlp_yyg->lp_yy_last_accepting_cpos = lp_yy_cp;\n\t\t\t\t}\n\t\t\twhile ( lp_yy_chk[lp_yy_base[lp_yy_current_state] + lp_yy_c] != lp_yy_current_state )\n\t\t\t\t{\n\t\t\t\tlp_yy_current_state = (int) lp_yy_def[lp_yy_current_state];\n\t\t\t\tif ( lp_yy_current_state >= 144 )\n\t\t\t\t\tlp_yy_c = lp_yy_meta[(unsigned int) lp_yy_c];\n\t\t\t\t}\n\t\t\tlp_yy_current_state = lp_yy_nxt[lp_yy_base[lp_yy_current_state] + (unsigned int) lp_yy_c];\n\t\t\t++lp_yy_cp;\n\t\t\t}\n\t\twhile ( lp_yy_base[lp_yy_current_state] != 388 );\n\nlp_yy_find_action:\n\t\tlp_yy_act = lp_yy_accept[lp_yy_current_state];\n\t\tif ( lp_yy_act == 0 )\n\t\t\t{ /* have to back up */\n\t\t\tlp_yy_cp = lp_yyg->lp_yy_last_accepting_cpos;\n\t\t\tlp_yy_current_state = lp_yyg->lp_yy_last_accepting_state;\n\t\t\tlp_yy_act = lp_yy_accept[lp_yy_current_state];\n\t\t\t}\n\n\t\tYY_DO_BEFORE_ACTION;\n\n\t\tif ( lp_yy_act != YY_END_OF_BUFFER && lp_yy_rule_can_match_eol[lp_yy_act] )\n\t\t\t{\n\t\t\tint lp_yyl;\n\t\t\tfor ( lp_yyl = 0; lp_yyl < lp_yyleng; ++lp_yyl )\n\t\t\t\tif ( lp_yytext[lp_yyl] == '\\n' )\n\t\t\t\t\t   \n    do{ lp_yylineno++;\n        lp_yycolumn=0;\n    }while(0)\n;\n\t\t\t}\n\ndo_action:\t/* This label is used only to access EOF actions. */\n\n\t\tswitch ( lp_yy_act )\n\t{ /* beginning of action switch */\n\t\t\tcase 0: /* must back up */\n\t\t\t/* undo the effects of YY_DO_BEFORE_ACTION */\n\t\t\t*lp_yy_cp = lp_yyg->lp_yy_hold_char;\n\t\t\tlp_yy_cp = lp_yyg->lp_yy_last_accepting_cpos;\n\t\t\tlp_yy_current_state = lp_yyg->lp_yy_last_accepting_state;\n\t\t\tgoto lp_yy_find_action;\n\ncase 1:\nYY_RULE_SETUP\n{\n  BEGIN COMMENT;\n} /* begin skip comment */\n\tYY_BREAK\ncase 2:\nYY_RULE_SETUP\n{\n  BEGIN INITIAL;\n} /* end skip comment */\n\tYY_BREAK\ncase 3:\nYY_RULE_SETUP\n{\n}\n\tYY_BREAK\ncase 4:\n/* rule 4 can match eol */\nYY_RULE_SETUP\n{\n}\n\tYY_BREAK\ncase 5:\nYY_RULE_SETUP\n{\n}\n\tYY_BREAK\ncase 6:\nYY_RULE_SETUP\n{\n  BEGIN LINECOMMENT;\n} /* begin skip LINECOMMENT */\n\tYY_BREAK\ncase 7:\n/* rule 7 can match eol */\nYY_RULE_SETUP\n{\n  BEGIN INITIAL;\n} /* end skip LINECOMMENT */\n\tYY_BREAK\ncase 8:\nYY_RULE_SETUP\n{\n  BEGIN INITIAL;\n} /* end skip LINECOMMENT */\n\tYY_BREAK\ncase 9:\nYY_RULE_SETUP\n{\n}\n\tYY_BREAK\ncase 10:\n/* rule 10 can match eol */\nYY_RULE_SETUP\n{\n}\n\tYY_BREAK\ncase 11:\nYY_RULE_SETUP\n{\n  parse_parm *pp = PARM;\n\n  pp->lineno = lp_yylineno;\n  return(COMMA);\n}\n\tYY_BREAK\ncase 12:\nYY_RULE_SETUP\n{\n  parse_parm *pp = PARM;\n\n  pp->lineno = lp_yylineno;\n  return(MINIMISE);\n}\n\tYY_BREAK\ncase 13:\nYY_RULE_SETUP\n{\n  parse_parm *pp = PARM;\n\n  pp->lineno = lp_yylineno;\n  return(MAXIMISE);\n}\n\tYY_BREAK\ncase 14:\nYY_RULE_SETUP\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pp->lineno = lp_yylineno;\n  pv->f = atof((char *)lp_yytext);\n  return(INTCONS);\n} /* f contains the last float */\n\tYY_BREAK\ncase 15:\nYY_RULE_SETUP\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pp->lineno = lp_yylineno;\n  pv->f = atof((char *)lp_yytext);\n  return(CONS);\n} /* f contains the last float */\n\tYY_BREAK\ncase 16:\n/* rule 16 can match eol */\nYY_RULE_SETUP\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n  char *ptr, c;\n\n  pp->lineno = lp_yylineno;\n  pv->f = DEF_INFINITE;\n  pv->Sign = 0;\n  ptr = (char *)lp_yytext;\n  while (isspace(*ptr)) ptr++;\n  if(*ptr == '-')\n    pv->Sign = 1;\n  if(lp_yyleng > 0) {\n    c = lp_yytext[lp_yyleng - 1];\n    if(!isalnum(c))\n      unput(c);\n  }\n  return(INF);\n} /* f contains the last float */\n\tYY_BREAK\ncase 17:\n/* rule 17 can match eol */\nYY_RULE_SETUP\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n  int x;\n\n  pp->lineno = lp_yylineno;\n  pv->Sign = 0;\n  for(x = 0; x < lp_yyleng; x++)\n    if(lp_yytext[x] == '-' || lp_yytext[x] == '+')\n      pv->Sign = (pv->Sign == (lp_yytext[x] == '+'));\n  return (TOK_SIGN);\n  /* Sign is TRUE if the sign-string\n     represents a '-'. Otherwise Sign\n     is FALSE */\n}\n\tYY_BREAK\ncase 18:\nYY_RULE_SETUP\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pp->lineno = lp_yylineno;\n  if((!pv->Within_int_decl) && (!pv->Within_sec_decl) && (!pv->Within_sos_decl) && (!pv->Within_free_decl)) {\n    pv->Within_int_decl = 1;\n    pv->Within_sos_decl1 = FALSE;\n  }\n  return(SEC_INT);\n}\n\tYY_BREAK\ncase 19:\nYY_RULE_SETUP\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pp->lineno = lp_yylineno;\n  if((!pv->Within_int_decl) && (!pv->Within_sec_decl) && (!pv->Within_sos_decl) && (!pv->Within_free_decl)) {\n    pv->Within_int_decl = 2;\n    pv->Within_sos_decl1 = FALSE;\n  }\n  return(SEC_BIN);\n}\n\tYY_BREAK\ncase 20:\nYY_RULE_SETUP\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pp->lineno = lp_yylineno;\n  if((!pv->Within_int_decl) && (!pv->Within_sec_decl) && (!pv->Within_sos_decl) && (!pv->Within_free_decl)) {\n    pv->Within_sec_decl = TRUE;\n    pv->Within_sos_decl1 = FALSE;\n  }\n  return(SEC_SEC);\n}\n\tYY_BREAK\ncase 21:\nYY_RULE_SETUP\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pp->lineno = lp_yylineno;\n  if(!pv->Within_sos_decl)\n    pv->SOStype0 = (short)atoi(((char *)lp_yytext) + 3);\n  if((!pv->Within_int_decl) && (!pv->Within_sec_decl) && (!pv->Within_sos_decl) && (!pv->Within_free_decl))\n    pv->Within_sos_decl = TRUE;\n  return(SEC_SOS);\n}\n\tYY_BREAK\ncase 22:\nYY_RULE_SETUP\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pp->lineno = lp_yylineno;\n  FREE(pv->Last_var);\n  pv->Last_var = strdup((char *)lp_yytext);\n  pv->Last_var[strlen(pv->Last_var) - 2] = 0;\n  return(SOSDESCR);\n}\n\tYY_BREAK\ncase 23:\nYY_RULE_SETUP\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pp->lineno = lp_yylineno;\n  if((!pv->Within_int_decl) && (!pv->Within_sec_decl) && (!pv->Within_sos_decl) && (!pv->Within_free_decl)) {\n    pv->Within_free_decl = TRUE;\n    pv->Within_sos_decl1 = FALSE;\n  }\n  return(SEC_FREE);\n}\n\tYY_BREAK\ncase 24:\nYY_RULE_SETUP\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n  char *ptr;\n\n  pp->lineno = lp_yylineno;\n  FREE(pv->Last_var);\n  pv->Last_var = strdup((char *)lp_yytext);\n  ptr = pv->Last_var + strlen(pv->Last_var);\n  ptr[-1] = ' ';\n  while ((--ptr >= pv->Last_var) && (isspace(*ptr)))\n    *ptr = 0;\n  return(VARIABLECOLON);\n}\n\tYY_BREAK\ncase 25:\nYY_RULE_SETUP\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pp->lineno = lp_yylineno;\n  FREE(pv->Last_var);\n  pv->Last_var = strdup((char *)lp_yytext);\n  return(VAR);\n}\n\tYY_BREAK\ncase 26:\nYY_RULE_SETUP\n{\n  parse_parm *pp = PARM;\n\n  pp->lineno = lp_yylineno;\n  return (COLON);\n}\n\tYY_BREAK\ncase 27:\nYY_RULE_SETUP\n{\n  parse_parm *pp = PARM;\n\n  pp->lineno = lp_yylineno;\n  return(AR_M_OP);\n}\n\tYY_BREAK\ncase 28:\nYY_RULE_SETUP\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pp->lineno = lp_yylineno;\n  pv->OP = *lp_yytext;\n  return(RE_OPEQ);\n}\n\tYY_BREAK\ncase 29:\nYY_RULE_SETUP\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pp->lineno = lp_yylineno;\n  pv->OP = *lp_yytext;\n  return(RE_OPLE);\n}\n\tYY_BREAK\ncase 30:\nYY_RULE_SETUP\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pp->lineno = lp_yylineno;\n  pv->OP = *lp_yytext;\n  return(RE_OPGE);\n}\n\tYY_BREAK\ncase 31:\nYY_RULE_SETUP\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pp->lineno = lp_yylineno;\n  pv->Within_int_decl = pv->Within_sec_decl = pv->Within_sos_decl = pv->Within_free_decl = FALSE;\n  check_int_sec_sos_free_decl(pp, (int) pv->Within_int_decl, (int) pv->Within_sec_decl, (int) pv->Within_sos_decl, (int) pv->Within_free_decl);\n  return(END_C);\n}\n\tYY_BREAK\ncase 32:\nYY_RULE_SETUP\n{\n  parse_parm *pp = PARM;\n\n  pp->lineno = lp_yylineno;\n  report(NULL, CRITICAL, \"LEX ERROR : %s lineno %d\\n\", lp_yytext, lp_yylineno);\n  return(UNDEFINED);\n}\n\tYY_BREAK\ncase 33:\nYY_RULE_SETUP\nECHO;\n\tYY_BREAK\ncase YY_STATE_EOF(INITIAL):\ncase YY_STATE_EOF(COMMENT):\ncase YY_STATE_EOF(LINECOMMENT):\n\tlp_yyterminate();\n\n\tcase YY_END_OF_BUFFER:\n\t\t{\n\t\t/* Amount of text matched not including the EOB char. */\n\t\tint lp_yy_amount_of_matched_text = (int) (lp_yy_cp - lp_yyg->lp_yytext_ptr) - 1;\n\n\t\t/* Undo the effects of YY_DO_BEFORE_ACTION. */\n\t\t*lp_yy_cp = lp_yyg->lp_yy_hold_char;\n\t\tYY_RESTORE_YY_MORE_OFFSET\n\n\t\tif ( YY_CURRENT_BUFFER_LVALUE->lp_yy_buffer_status == YY_BUFFER_NEW )\n\t\t\t{\n\t\t\t/* We're scanning a new file or input source.  It's\n\t\t\t * possible that this happened because the user\n\t\t\t * just pointed lp_yyin at a new source and called\n\t\t\t * lp_yylex().  If so, then we have to assure\n\t\t\t * consistency between YY_CURRENT_BUFFER and our\n\t\t\t * globals.  Here is the right place to do so, because\n\t\t\t * this is the first action (other than possibly a\n\t\t\t * back-up) that will match for the new input source.\n\t\t\t */\n\t\t\tlp_yyg->lp_yy_n_chars = YY_CURRENT_BUFFER_LVALUE->lp_yy_n_chars;\n\t\t\tYY_CURRENT_BUFFER_LVALUE->lp_yy_input_file = lp_yyin;\n\t\t\tYY_CURRENT_BUFFER_LVALUE->lp_yy_buffer_status = YY_BUFFER_NORMAL;\n\t\t\t}\n\n\t\t/* Note that here we test for lp_yy_c_buf_p \"<=\" to the position\n\t\t * of the first EOB in the buffer, since lp_yy_c_buf_p will\n\t\t * already have been incremented past the NUL character\n\t\t * (since all states make transitions on EOB to the\n\t\t * end-of-buffer state).  Contrast this with the test\n\t\t * in input().\n\t\t */\n\t\tif ( lp_yyg->lp_yy_c_buf_p <= &YY_CURRENT_BUFFER_LVALUE->lp_yy_ch_buf[lp_yyg->lp_yy_n_chars] )\n\t\t\t{ /* This was really a NUL. */\n\t\t\tlp_yy_state_type lp_yy_next_state;\n\n\t\t\tlp_yyg->lp_yy_c_buf_p = lp_yyg->lp_yytext_ptr + lp_yy_amount_of_matched_text;\n\n\t\t\tlp_yy_current_state = lp_yy_get_previous_state( lp_yyscanner );\n\n\t\t\t/* Okay, we're now positioned to make the NUL\n\t\t\t * transition.  We couldn't have\n\t\t\t * lp_yy_get_previous_state() go ahead and do it\n\t\t\t * for us because it doesn't know how to deal\n\t\t\t * with the possibility of jamming (and we don't\n\t\t\t * want to build jamming into it because then it\n\t\t\t * will run more slowly).\n\t\t\t */\n\n\t\t\tlp_yy_next_state = lp_yy_try_NUL_trans( lp_yy_current_state , lp_yyscanner);\n\n\t\t\tlp_yy_bp = lp_yyg->lp_yytext_ptr + YY_MORE_ADJ;\n\n\t\t\tif ( lp_yy_next_state )\n\t\t\t\t{\n\t\t\t\t/* Consume the NUL. */\n\t\t\t\tlp_yy_cp = ++lp_yyg->lp_yy_c_buf_p;\n\t\t\t\tlp_yy_current_state = lp_yy_next_state;\n\t\t\t\tgoto lp_yy_match;\n\t\t\t\t}\n\n\t\t\telse\n\t\t\t\t{\n\t\t\t\tlp_yy_cp = lp_yyg->lp_yy_c_buf_p;\n\t\t\t\tgoto lp_yy_find_action;\n\t\t\t\t}\n\t\t\t}\n\n\t\telse switch ( lp_yy_get_next_buffer( lp_yyscanner ) )\n\t\t\t{\n\t\t\tcase EOB_ACT_END_OF_FILE:\n\t\t\t\t{\n\t\t\t\tlp_yyg->lp_yy_did_buffer_switch_on_eof = 0;\n\n\t\t\t\tif ( lp_yywrap(lp_yyscanner ) )\n\t\t\t\t\t{\n\t\t\t\t\t/* Note: because we've taken care in\n\t\t\t\t\t * lp_yy_get_next_buffer() to have set up\n\t\t\t\t\t * lp_yytext, we can now set up\n\t\t\t\t\t * lp_yy_c_buf_p so that if some total\n\t\t\t\t\t * hoser (like flex itself) wants to\n\t\t\t\t\t * call the scanner after we return the\n\t\t\t\t\t * YY_NULL, it'll still work - another\n\t\t\t\t\t * YY_NULL will get returned.\n\t\t\t\t\t */\n\t\t\t\t\tlp_yyg->lp_yy_c_buf_p = lp_yyg->lp_yytext_ptr + YY_MORE_ADJ;\n\n\t\t\t\t\tlp_yy_act = YY_STATE_EOF(YY_START);\n\t\t\t\t\tgoto do_action;\n\t\t\t\t\t}\n\n\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\tif ( ! lp_yyg->lp_yy_did_buffer_switch_on_eof )\n\t\t\t\t\t\tYY_NEW_FILE;\n\t\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\tcase EOB_ACT_CONTINUE_SCAN:\n\t\t\t\tlp_yyg->lp_yy_c_buf_p =\n\t\t\t\t\tlp_yyg->lp_yytext_ptr + lp_yy_amount_of_matched_text;\n\n\t\t\t\tlp_yy_current_state = lp_yy_get_previous_state( lp_yyscanner );\n\n\t\t\t\tlp_yy_cp = lp_yyg->lp_yy_c_buf_p;\n\t\t\t\tlp_yy_bp = lp_yyg->lp_yytext_ptr + YY_MORE_ADJ;\n\t\t\t\tgoto lp_yy_match;\n\n\t\t\tcase EOB_ACT_LAST_MATCH:\n\t\t\t\tlp_yyg->lp_yy_c_buf_p =\n\t\t\t\t&YY_CURRENT_BUFFER_LVALUE->lp_yy_ch_buf[lp_yyg->lp_yy_n_chars];\n\n\t\t\t\tlp_yy_current_state = lp_yy_get_previous_state( lp_yyscanner );\n\n\t\t\t\tlp_yy_cp = lp_yyg->lp_yy_c_buf_p;\n\t\t\t\tlp_yy_bp = lp_yyg->lp_yytext_ptr + YY_MORE_ADJ;\n\t\t\t\tgoto lp_yy_find_action;\n\t\t\t}\n\t\tbreak;\n\t\t}\n\n\tdefault:\n\t\tYY_FATAL_ERROR(\n\t\t\t\"fatal flex scanner internal error--no action found\" );\n\t} /* end of action switch */\n\t\t} /* end of scanning one token */\n} /* end of lp_yylex */\n\n/* lp_yy_get_next_buffer - try to read in a new buffer\n *\n * Returns a code representing an action:\n *\tEOB_ACT_LAST_MATCH -\n *\tEOB_ACT_CONTINUE_SCAN - continue scanning from current position\n *\tEOB_ACT_END_OF_FILE - end of file\n */\nstatic int lp_yy_get_next_buffer (lp_yyscan_t lp_yyscanner)\n{\n    struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner;\n\tregister char *dest = YY_CURRENT_BUFFER_LVALUE->lp_yy_ch_buf;\n\tregister char *source = lp_yyg->lp_yytext_ptr;\n\tregister int number_to_move, i;\n\tint ret_val;\n\n\tif ( lp_yyg->lp_yy_c_buf_p > &YY_CURRENT_BUFFER_LVALUE->lp_yy_ch_buf[lp_yyg->lp_yy_n_chars + 1] )\n\t\tYY_FATAL_ERROR(\n\t\t\"fatal flex scanner internal error--end of buffer missed\" );\n\n\tif ( YY_CURRENT_BUFFER_LVALUE->lp_yy_fill_buffer == 0 )\n\t\t{ /* Don't try to fill the buffer, so this is an EOF. */\n\t\tif ( lp_yyg->lp_yy_c_buf_p - lp_yyg->lp_yytext_ptr - YY_MORE_ADJ == 1 )\n\t\t\t{\n\t\t\t/* We matched a single character, the EOB, so\n\t\t\t * treat this as a final EOF.\n\t\t\t */\n\t\t\treturn EOB_ACT_END_OF_FILE;\n\t\t\t}\n\n\t\telse\n\t\t\t{\n\t\t\t/* We matched some text prior to the EOB, first\n\t\t\t * process it.\n\t\t\t */\n\t\t\treturn EOB_ACT_LAST_MATCH;\n\t\t\t}\n\t\t}\n\n\t/* Try to read more data. */\n\n\t/* First move last chars to start of buffer. */\n\tnumber_to_move = (int) (lp_yyg->lp_yy_c_buf_p - lp_yyg->lp_yytext_ptr) - 1;\n\n\tfor ( i = 0; i < number_to_move; ++i )\n\t\t*(dest++) = *(source++);\n\n\tif ( YY_CURRENT_BUFFER_LVALUE->lp_yy_buffer_status == YY_BUFFER_EOF_PENDING )\n\t\t/* don't do the read, it's not guaranteed to return an EOF,\n\t\t * just force an EOF\n\t\t */\n\t\tYY_CURRENT_BUFFER_LVALUE->lp_yy_n_chars = lp_yyg->lp_yy_n_chars = 0;\n\n\telse\n\t\t{\n\t\t\tint num_to_read =\n\t\t\tYY_CURRENT_BUFFER_LVALUE->lp_yy_buf_size - number_to_move - 1;\n\n\t\twhile ( num_to_read <= 0 )\n\t\t\t{ /* Not enough room in the buffer - grow it. */\n\n\t\t\t/* just a shorter name for the current buffer */\n\t\t\tYY_BUFFER_STATE b = YY_CURRENT_BUFFER;\n\n\t\t\tint lp_yy_c_buf_p_offset =\n\t\t\t\t(int) (lp_yyg->lp_yy_c_buf_p - b->lp_yy_ch_buf);\n\n\t\t\tif ( b->lp_yy_is_our_buffer )\n\t\t\t\t{\n\t\t\t\tint new_size = b->lp_yy_buf_size * 2;\n\n\t\t\t\tif ( new_size <= 0 )\n\t\t\t\t\tb->lp_yy_buf_size += b->lp_yy_buf_size / 8;\n\t\t\t\telse\n\t\t\t\t\tb->lp_yy_buf_size *= 2;\n\n\t\t\t\tb->lp_yy_ch_buf = (char *)\n\t\t\t\t\t/* Include room in for 2 EOB chars. */\n\t\t\t\t\tlp_yyrealloc((void *) b->lp_yy_ch_buf,b->lp_yy_buf_size + 2 ,lp_yyscanner );\n\t\t\t\t}\n\t\t\telse\n\t\t\t\t/* Can't grow it, we don't own it. */\n\t\t\t\tb->lp_yy_ch_buf = 0;\n\n\t\t\tif ( ! b->lp_yy_ch_buf )\n\t\t\t\tYY_FATAL_ERROR(\n\t\t\t\t\"fatal error - scanner input buffer overflow\" );\n\n\t\t\tlp_yyg->lp_yy_c_buf_p = &b->lp_yy_ch_buf[lp_yy_c_buf_p_offset];\n\n\t\t\tnum_to_read = YY_CURRENT_BUFFER_LVALUE->lp_yy_buf_size -\n\t\t\t\t\t\tnumber_to_move - 1;\n\n\t\t\t}\n\n\t\tif ( num_to_read > YY_READ_BUF_SIZE )\n\t\t\tnum_to_read = YY_READ_BUF_SIZE;\n\n\t\t/* Read in more data. */\n\t\tYY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->lp_yy_ch_buf[number_to_move]),\n\t\t\tlp_yyg->lp_yy_n_chars, (size_t) num_to_read );\n\n\t\tYY_CURRENT_BUFFER_LVALUE->lp_yy_n_chars = lp_yyg->lp_yy_n_chars;\n\t\t}\n\n\tif ( lp_yyg->lp_yy_n_chars == 0 )\n\t\t{\n\t\tif ( number_to_move == YY_MORE_ADJ )\n\t\t\t{\n\t\t\tret_val = EOB_ACT_END_OF_FILE;\n\t\t\tlp_yyrestart(lp_yyin  ,lp_yyscanner);\n\t\t\t}\n\n\t\telse\n\t\t\t{\n\t\t\tret_val = EOB_ACT_LAST_MATCH;\n\t\t\tYY_CURRENT_BUFFER_LVALUE->lp_yy_buffer_status =\n\t\t\t\tYY_BUFFER_EOF_PENDING;\n\t\t\t}\n\t\t}\n\n\telse\n\t\tret_val = EOB_ACT_CONTINUE_SCAN;\n\n\tif ((lp_yy_size_t) (lp_yyg->lp_yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->lp_yy_buf_size) {\n\t\t/* Extend the array by 50%, plus the number we really need. */\n\t\tlp_yy_size_t new_size = lp_yyg->lp_yy_n_chars + number_to_move + (lp_yyg->lp_yy_n_chars >> 1);\n\t\tYY_CURRENT_BUFFER_LVALUE->lp_yy_ch_buf = (char *) lp_yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->lp_yy_ch_buf,new_size ,lp_yyscanner );\n\t\tif ( ! YY_CURRENT_BUFFER_LVALUE->lp_yy_ch_buf )\n\t\t\tYY_FATAL_ERROR( \"out of dynamic memory in lp_yy_get_next_buffer()\" );\n\t}\n\n\tlp_yyg->lp_yy_n_chars += number_to_move;\n\tYY_CURRENT_BUFFER_LVALUE->lp_yy_ch_buf[lp_yyg->lp_yy_n_chars] = YY_END_OF_BUFFER_CHAR;\n\tYY_CURRENT_BUFFER_LVALUE->lp_yy_ch_buf[lp_yyg->lp_yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;\n\n\tlp_yyg->lp_yytext_ptr = &YY_CURRENT_BUFFER_LVALUE->lp_yy_ch_buf[0];\n\n\treturn ret_val;\n}\n\n/* lp_yy_get_previous_state - get the state just before the EOB char was reached */\n\n    static lp_yy_state_type lp_yy_get_previous_state (lp_yyscan_t lp_yyscanner)\n{\n\tregister lp_yy_state_type lp_yy_current_state;\n\tregister char *lp_yy_cp;\n    struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner;\n\n\tlp_yy_current_state = lp_yyg->lp_yy_start;\n\tlp_yy_current_state += YY_AT_BOL();\n\n\tfor ( lp_yy_cp = lp_yyg->lp_yytext_ptr + YY_MORE_ADJ; lp_yy_cp < lp_yyg->lp_yy_c_buf_p; ++lp_yy_cp )\n\t\t{\n\t\tregister YY_CHAR lp_yy_c = (*lp_yy_cp ? lp_yy_ec[YY_SC_TO_UI(*lp_yy_cp)] : 1);\n\t\tif ( lp_yy_accept[lp_yy_current_state] )\n\t\t\t{\n\t\t\tlp_yyg->lp_yy_last_accepting_state = lp_yy_current_state;\n\t\t\tlp_yyg->lp_yy_last_accepting_cpos = lp_yy_cp;\n\t\t\t}\n\t\twhile ( lp_yy_chk[lp_yy_base[lp_yy_current_state] + lp_yy_c] != lp_yy_current_state )\n\t\t\t{\n\t\t\tlp_yy_current_state = (int) lp_yy_def[lp_yy_current_state];\n\t\t\tif ( lp_yy_current_state >= 144 )\n\t\t\t\tlp_yy_c = lp_yy_meta[(unsigned int) lp_yy_c];\n\t\t\t}\n\t\tlp_yy_current_state = lp_yy_nxt[lp_yy_base[lp_yy_current_state] + (unsigned int) lp_yy_c];\n\t\t}\n\n\treturn lp_yy_current_state;\n}\n\n/* lp_yy_try_NUL_trans - try to make a transition on the NUL character\n *\n * synopsis\n *\tnext_state = lp_yy_try_NUL_trans( current_state );\n */\n    static lp_yy_state_type lp_yy_try_NUL_trans  (lp_yy_state_type lp_yy_current_state , lp_yyscan_t lp_yyscanner)\n{\n\tregister int lp_yy_is_jam;\n    struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner; /* This var may be unused depending upon options. */\n\tregister char *lp_yy_cp = lp_yyg->lp_yy_c_buf_p;\n\n\tregister YY_CHAR lp_yy_c = 1;\n\tif ( lp_yy_accept[lp_yy_current_state] )\n\t\t{\n\t\tlp_yyg->lp_yy_last_accepting_state = lp_yy_current_state;\n\t\tlp_yyg->lp_yy_last_accepting_cpos = lp_yy_cp;\n\t\t}\n\twhile ( lp_yy_chk[lp_yy_base[lp_yy_current_state] + lp_yy_c] != lp_yy_current_state )\n\t\t{\n\t\tlp_yy_current_state = (int) lp_yy_def[lp_yy_current_state];\n\t\tif ( lp_yy_current_state >= 144 )\n\t\t\tlp_yy_c = lp_yy_meta[(unsigned int) lp_yy_c];\n\t\t}\n\tlp_yy_current_state = lp_yy_nxt[lp_yy_base[lp_yy_current_state] + (unsigned int) lp_yy_c];\n\tlp_yy_is_jam = (lp_yy_current_state == 143);\n\n\treturn lp_yy_is_jam ? 0 : lp_yy_current_state;\n}\n\n    static void lp_yyunput (int c, register char * lp_yy_bp , lp_yyscan_t lp_yyscanner)\n{\n\tregister char *lp_yy_cp;\n    struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner;\n\n    lp_yy_cp = lp_yyg->lp_yy_c_buf_p;\n\n\t/* undo effects of setting up lp_yytext */\n\t*lp_yy_cp = lp_yyg->lp_yy_hold_char;\n\n\tif ( lp_yy_cp < YY_CURRENT_BUFFER_LVALUE->lp_yy_ch_buf + 2 )\n\t\t{ /* need to shift things up to make room */\n\t\t/* +2 for EOB chars. */\n\t\tregister int number_to_move = lp_yyg->lp_yy_n_chars + 2;\n\t\tregister char *dest = &YY_CURRENT_BUFFER_LVALUE->lp_yy_ch_buf[\n\t\t\t\t\tYY_CURRENT_BUFFER_LVALUE->lp_yy_buf_size + 2];\n\t\tregister char *source =\n\t\t\t\t&YY_CURRENT_BUFFER_LVALUE->lp_yy_ch_buf[number_to_move];\n\n\t\twhile ( source > YY_CURRENT_BUFFER_LVALUE->lp_yy_ch_buf )\n\t\t\t*--dest = *--source;\n\n\t\tlp_yy_cp += (int) (dest - source);\n\t\tlp_yy_bp += (int) (dest - source);\n\t\tYY_CURRENT_BUFFER_LVALUE->lp_yy_n_chars =\n\t\t\tlp_yyg->lp_yy_n_chars = YY_CURRENT_BUFFER_LVALUE->lp_yy_buf_size;\n\n\t\tif ( lp_yy_cp < YY_CURRENT_BUFFER_LVALUE->lp_yy_ch_buf + 2 )\n\t\t\tYY_FATAL_ERROR( \"flex scanner push-back overflow\" );\n\t\t}\n\n\t*--lp_yy_cp = (char) c;\n\n    if ( c == '\\n' ){\n        --lp_yylineno;\n    }\n\n\tlp_yyg->lp_yytext_ptr = lp_yy_bp;\n\tlp_yyg->lp_yy_hold_char = *lp_yy_cp;\n\tlp_yyg->lp_yy_c_buf_p = lp_yy_cp;\n}\n\n#ifndef YY_NO_INPUT\n#ifdef __cplusplus\n    static int lp_yyinput (lp_yyscan_t lp_yyscanner)\n#else\n    static int input  (lp_yyscan_t lp_yyscanner)\n#endif\n\n{\n\tint c;\n    struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner;\n\n\t*lp_yyg->lp_yy_c_buf_p = lp_yyg->lp_yy_hold_char;\n\n\tif ( *lp_yyg->lp_yy_c_buf_p == YY_END_OF_BUFFER_CHAR )\n\t\t{\n\t\t/* lp_yy_c_buf_p now points to the character we want to return.\n\t\t * If this occurs *before* the EOB characters, then it's a\n\t\t * valid NUL; if not, then we've hit the end of the buffer.\n\t\t */\n\t\tif ( lp_yyg->lp_yy_c_buf_p < &YY_CURRENT_BUFFER_LVALUE->lp_yy_ch_buf[lp_yyg->lp_yy_n_chars] )\n\t\t\t/* This was really a NUL. */\n\t\t\t*lp_yyg->lp_yy_c_buf_p = '\\0';\n\n\t\telse\n\t\t\t{ /* need more input */\n\t\t\tint offset = lp_yyg->lp_yy_c_buf_p - lp_yyg->lp_yytext_ptr;\n\t\t\t++lp_yyg->lp_yy_c_buf_p;\n\n\t\t\tswitch ( lp_yy_get_next_buffer( lp_yyscanner ) )\n\t\t\t\t{\n\t\t\t\tcase EOB_ACT_LAST_MATCH:\n\t\t\t\t\t/* This happens because lp_yy_g_n_b()\n\t\t\t\t\t * sees that we've accumulated a\n\t\t\t\t\t * token and flags that we need to\n\t\t\t\t\t * try matching the token before\n\t\t\t\t\t * proceeding.  But for input(),\n\t\t\t\t\t * there's no matching to consider.\n\t\t\t\t\t * So convert the EOB_ACT_LAST_MATCH\n\t\t\t\t\t * to EOB_ACT_END_OF_FILE.\n\t\t\t\t\t */\n\n\t\t\t\t\t/* Reset buffer status. */\n\t\t\t\t\tlp_yyrestart(lp_yyin ,lp_yyscanner);\n\n\t\t\t\t\t/*FALLTHROUGH*/\n\n\t\t\t\tcase EOB_ACT_END_OF_FILE:\n\t\t\t\t\t{\n\t\t\t\t\tif ( lp_yywrap(lp_yyscanner ) )\n\t\t\t\t\t\treturn EOF;\n\n\t\t\t\t\tif ( ! lp_yyg->lp_yy_did_buffer_switch_on_eof )\n\t\t\t\t\t\tYY_NEW_FILE;\n#ifdef __cplusplus\n\t\t\t\t\treturn lp_yyinput(lp_yyscanner);\n#else\n\t\t\t\t\treturn input(lp_yyscanner);\n#endif\n\t\t\t\t\t}\n\n\t\t\t\tcase EOB_ACT_CONTINUE_SCAN:\n\t\t\t\t\tlp_yyg->lp_yy_c_buf_p = lp_yyg->lp_yytext_ptr + offset;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\tc = *(unsigned char *) lp_yyg->lp_yy_c_buf_p;\t/* cast for 8-bit char's */\n\t*lp_yyg->lp_yy_c_buf_p = '\\0';\t/* preserve lp_yytext */\n\tlp_yyg->lp_yy_hold_char = *++lp_yyg->lp_yy_c_buf_p;\n\n\tYY_CURRENT_BUFFER_LVALUE->lp_yy_at_bol = (c == '\\n');\n\tif ( YY_CURRENT_BUFFER_LVALUE->lp_yy_at_bol )\n\t\t   \n    do{ lp_yylineno++;\n        lp_yycolumn=0;\n    }while(0)\n;\n\n\treturn c;\n}\n#endif\t/* ifndef YY_NO_INPUT */\n\n/** Immediately switch to a different input stream.\n * @param input_file A readable stream.\n * @param lp_yyscanner The scanner object.\n * @note This function does not reset the start condition to @c INITIAL .\n */\n    void lp_yyrestart  (FILE * input_file , lp_yyscan_t lp_yyscanner)\n{\n    struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner;\n\n\tif ( ! YY_CURRENT_BUFFER ){\n        lp_yyensure_buffer_stack (lp_yyscanner);\n\t\tYY_CURRENT_BUFFER_LVALUE =\n            lp_yy_create_buffer(lp_yyin,YY_BUF_SIZE ,lp_yyscanner);\n\t}\n\n\tlp_yy_init_buffer(YY_CURRENT_BUFFER,input_file ,lp_yyscanner);\n\tlp_yy_load_buffer_state(lp_yyscanner );\n}\n\n/** Switch to a different input buffer.\n * @param new_buffer The new input buffer.\n * @param lp_yyscanner The scanner object.\n */\n    void lp_yy_switch_to_buffer  (YY_BUFFER_STATE  new_buffer , lp_yyscan_t lp_yyscanner)\n{\n    struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner;\n\n\t/* TODO. We should be able to replace this entire function body\n\t * with\n\t *\t\tlp_yypop_buffer_state();\n\t *\t\tlp_yypush_buffer_state(new_buffer);\n     */\n\tlp_yyensure_buffer_stack (lp_yyscanner);\n\tif ( YY_CURRENT_BUFFER == new_buffer )\n\t\treturn;\n\n\tif ( YY_CURRENT_BUFFER )\n\t\t{\n\t\t/* Flush out information for old buffer. */\n\t\t*lp_yyg->lp_yy_c_buf_p = lp_yyg->lp_yy_hold_char;\n\t\tYY_CURRENT_BUFFER_LVALUE->lp_yy_buf_pos = lp_yyg->lp_yy_c_buf_p;\n\t\tYY_CURRENT_BUFFER_LVALUE->lp_yy_n_chars = lp_yyg->lp_yy_n_chars;\n\t\t}\n\n\tYY_CURRENT_BUFFER_LVALUE = new_buffer;\n\tlp_yy_load_buffer_state(lp_yyscanner );\n\n\t/* We don't actually know whether we did this switch during\n\t * EOF (lp_yywrap()) processing, but the only time this flag\n\t * is looked at is after lp_yywrap() is called, so it's safe\n\t * to go ahead and always set it.\n\t */\n\tlp_yyg->lp_yy_did_buffer_switch_on_eof = 1;\n}\n\nstatic void lp_yy_load_buffer_state  (lp_yyscan_t lp_yyscanner)\n{\n    struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner;\n\tlp_yyg->lp_yy_n_chars = YY_CURRENT_BUFFER_LVALUE->lp_yy_n_chars;\n\tlp_yyg->lp_yytext_ptr = lp_yyg->lp_yy_c_buf_p = YY_CURRENT_BUFFER_LVALUE->lp_yy_buf_pos;\n\tlp_yyin = YY_CURRENT_BUFFER_LVALUE->lp_yy_input_file;\n\tlp_yyg->lp_yy_hold_char = *lp_yyg->lp_yy_c_buf_p;\n}\n\n/** Allocate and initialize an input buffer state.\n * @param file A readable stream.\n * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.\n * @param lp_yyscanner The scanner object.\n * @return the allocated buffer state.\n */\n    YY_BUFFER_STATE lp_yy_create_buffer  (FILE * file, int  size , lp_yyscan_t lp_yyscanner)\n{\n\tYY_BUFFER_STATE b;\n    \n\tb = (YY_BUFFER_STATE) lp_yyalloc(sizeof( struct lp_yy_buffer_state ) ,lp_yyscanner );\n\tif ( ! b )\n\t\tYY_FATAL_ERROR( \"out of dynamic memory in lp_yy_create_buffer()\" );\n\n\tb->lp_yy_buf_size = size;\n\n\t/* lp_yy_ch_buf has to be 2 characters longer than the size given because\n\t * we need to put in 2 end-of-buffer characters.\n\t */\n\tb->lp_yy_ch_buf = (char *) lp_yyalloc(b->lp_yy_buf_size + 2 ,lp_yyscanner );\n\tif ( ! b->lp_yy_ch_buf )\n\t\tYY_FATAL_ERROR( \"out of dynamic memory in lp_yy_create_buffer()\" );\n\n\tb->lp_yy_is_our_buffer = 1;\n\n\tlp_yy_init_buffer(b,file ,lp_yyscanner);\n\n\treturn b;\n}\n\n/** Destroy the buffer.\n * @param b a buffer created with lp_yy_create_buffer()\n * @param lp_yyscanner The scanner object.\n */\n    void lp_yy_delete_buffer (YY_BUFFER_STATE  b , lp_yyscan_t lp_yyscanner)\n{\n    struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner;\n\n\tif ( ! b )\n\t\treturn;\n\n\tif ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */\n\t\tYY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;\n\n\tif ( b->lp_yy_is_our_buffer )\n\t\tlp_yyfree((void *) b->lp_yy_ch_buf ,lp_yyscanner );\n\n\tlp_yyfree((void *) b ,lp_yyscanner );\n}\n\n#ifndef __cplusplus\nextern int isatty (int );\n#endif /* __cplusplus */\n    \n/* Initializes or reinitializes a buffer.\n * This function is sometimes called more than once on the same buffer,\n * such as during a lp_yyrestart() or at EOF.\n */\n    static void lp_yy_init_buffer  (YY_BUFFER_STATE  b, FILE * file , lp_yyscan_t lp_yyscanner)\n\n{\n\tint oerrno = errno;\n    struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner;\n\n\tlp_yy_flush_buffer(b ,lp_yyscanner);\n\n\tb->lp_yy_input_file = file;\n\tb->lp_yy_fill_buffer = 1;\n\n    /* If b is the current buffer, then lp_yy_init_buffer was _probably_\n     * called from lp_yyrestart() or through lp_yy_get_next_buffer.\n     * In that case, we don't want to reset the lineno or column.\n     */\n    if (b != YY_CURRENT_BUFFER){\n        b->lp_yy_bs_lineno = 1;\n        b->lp_yy_bs_column = 0;\n    }\n\n        b->lp_yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;\n    \n\terrno = oerrno;\n}\n\n/** Discard all buffered characters. On the next scan, YY_INPUT will be called.\n * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.\n * @param lp_yyscanner The scanner object.\n */\n    void lp_yy_flush_buffer (YY_BUFFER_STATE  b , lp_yyscan_t lp_yyscanner)\n{\n    struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner;\n\tif ( ! b )\n\t\treturn;\n\n\tb->lp_yy_n_chars = 0;\n\n\t/* We always need two end-of-buffer characters.  The first causes\n\t * a transition to the end-of-buffer state.  The second causes\n\t * a jam in that state.\n\t */\n\tb->lp_yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;\n\tb->lp_yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;\n\n\tb->lp_yy_buf_pos = &b->lp_yy_ch_buf[0];\n\n\tb->lp_yy_at_bol = 1;\n\tb->lp_yy_buffer_status = YY_BUFFER_NEW;\n\n\tif ( b == YY_CURRENT_BUFFER )\n\t\tlp_yy_load_buffer_state(lp_yyscanner );\n}\n\n/** Pushes the new state onto the stack. The new state becomes\n *  the current state. This function will allocate the stack\n *  if necessary.\n *  @param new_buffer The new state.\n *  @param lp_yyscanner The scanner object.\n */\nvoid lp_yypush_buffer_state (YY_BUFFER_STATE new_buffer , lp_yyscan_t lp_yyscanner)\n{\n    struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner;\n\tif (new_buffer == NULL)\n\t\treturn;\n\n\tlp_yyensure_buffer_stack(lp_yyscanner);\n\n\t/* This block is copied from lp_yy_switch_to_buffer. */\n\tif ( YY_CURRENT_BUFFER )\n\t\t{\n\t\t/* Flush out information for old buffer. */\n\t\t*lp_yyg->lp_yy_c_buf_p = lp_yyg->lp_yy_hold_char;\n\t\tYY_CURRENT_BUFFER_LVALUE->lp_yy_buf_pos = lp_yyg->lp_yy_c_buf_p;\n\t\tYY_CURRENT_BUFFER_LVALUE->lp_yy_n_chars = lp_yyg->lp_yy_n_chars;\n\t\t}\n\n\t/* Only push if top exists. Otherwise, replace top. */\n\tif (YY_CURRENT_BUFFER)\n\t\tlp_yyg->lp_yy_buffer_stack_top++;\n\tYY_CURRENT_BUFFER_LVALUE = new_buffer;\n\n\t/* copied from lp_yy_switch_to_buffer. */\n\tlp_yy_load_buffer_state(lp_yyscanner );\n\tlp_yyg->lp_yy_did_buffer_switch_on_eof = 1;\n}\n\n/** Removes and deletes the top of the stack, if present.\n *  The next element becomes the new top.\n *  @param lp_yyscanner The scanner object.\n */\nvoid lp_yypop_buffer_state (lp_yyscan_t lp_yyscanner)\n{\n    struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner;\n\tif (!YY_CURRENT_BUFFER)\n\t\treturn;\n\n\tlp_yy_delete_buffer(YY_CURRENT_BUFFER ,lp_yyscanner);\n\tYY_CURRENT_BUFFER_LVALUE = NULL;\n\tif (lp_yyg->lp_yy_buffer_stack_top > 0)\n\t\t--lp_yyg->lp_yy_buffer_stack_top;\n\n\tif (YY_CURRENT_BUFFER) {\n\t\tlp_yy_load_buffer_state(lp_yyscanner );\n\t\tlp_yyg->lp_yy_did_buffer_switch_on_eof = 1;\n\t}\n}\n\n/* Allocates the stack if it does not exist.\n *  Guarantees space for at least one push.\n */\nstatic void lp_yyensure_buffer_stack (lp_yyscan_t lp_yyscanner)\n{\n\tint num_to_alloc;\n    struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner;\n\n\tif (!lp_yyg->lp_yy_buffer_stack) {\n\n\t\t/* First allocation is just for 2 elements, since we don't know if this\n\t\t * scanner will even need a stack. We use 2 instead of 1 to avoid an\n\t\t * immediate realloc on the next call.\n         */\n\t\tnum_to_alloc = 1;\n\t\tlp_yyg->lp_yy_buffer_stack = (struct lp_yy_buffer_state**)lp_yyalloc\n\t\t\t\t\t\t\t\t(num_to_alloc * sizeof(struct lp_yy_buffer_state*)\n\t\t\t\t\t\t\t\t, lp_yyscanner);\n\t\tif ( ! lp_yyg->lp_yy_buffer_stack )\n\t\t\tYY_FATAL_ERROR( \"out of dynamic memory in lp_yyensure_buffer_stack()\" );\n\t\t\t\t\t\t\t\t  \n\t\tmemset(lp_yyg->lp_yy_buffer_stack, 0, num_to_alloc * sizeof(struct lp_yy_buffer_state*));\n\t\t\t\t\n\t\tlp_yyg->lp_yy_buffer_stack_max = num_to_alloc;\n\t\tlp_yyg->lp_yy_buffer_stack_top = 0;\n\t\treturn;\n\t}\n\n\tif (lp_yyg->lp_yy_buffer_stack_top >= (lp_yyg->lp_yy_buffer_stack_max) - 1){\n\n\t\t/* Increase the buffer to prepare for a possible push. */\n\t\tint grow_size = 8 /* arbitrary grow size */;\n\n\t\tnum_to_alloc = lp_yyg->lp_yy_buffer_stack_max + grow_size;\n\t\tlp_yyg->lp_yy_buffer_stack = (struct lp_yy_buffer_state**)lp_yyrealloc\n\t\t\t\t\t\t\t\t(lp_yyg->lp_yy_buffer_stack,\n\t\t\t\t\t\t\t\tnum_to_alloc * sizeof(struct lp_yy_buffer_state*)\n\t\t\t\t\t\t\t\t, lp_yyscanner);\n\t\tif ( ! lp_yyg->lp_yy_buffer_stack )\n\t\t\tYY_FATAL_ERROR( \"out of dynamic memory in lp_yyensure_buffer_stack()\" );\n\n\t\t/* zero only the new slots.*/\n\t\tmemset(lp_yyg->lp_yy_buffer_stack + lp_yyg->lp_yy_buffer_stack_max, 0, grow_size * sizeof(struct lp_yy_buffer_state*));\n\t\tlp_yyg->lp_yy_buffer_stack_max = num_to_alloc;\n\t}\n}\n\n/** Setup the input buffer state to scan directly from a user-specified character buffer.\n * @param base the character buffer\n * @param size the size in bytes of the character buffer\n * @param lp_yyscanner The scanner object.\n * @return the newly allocated buffer state object. \n */\nYY_BUFFER_STATE lp_yy_scan_buffer  (char * base, lp_yy_size_t  size , lp_yyscan_t lp_yyscanner)\n{\n\tYY_BUFFER_STATE b;\n    \n\tif ( size < 2 ||\n\t     base[size-2] != YY_END_OF_BUFFER_CHAR ||\n\t     base[size-1] != YY_END_OF_BUFFER_CHAR )\n\t\t/* They forgot to leave room for the EOB's. */\n\t\treturn 0;\n\n\tb = (YY_BUFFER_STATE) lp_yyalloc(sizeof( struct lp_yy_buffer_state ) ,lp_yyscanner );\n\tif ( ! b )\n\t\tYY_FATAL_ERROR( \"out of dynamic memory in lp_yy_scan_buffer()\" );\n\n\tb->lp_yy_buf_size = size - 2;\t/* \"- 2\" to take care of EOB's */\n\tb->lp_yy_buf_pos = b->lp_yy_ch_buf = base;\n\tb->lp_yy_is_our_buffer = 0;\n\tb->lp_yy_input_file = 0;\n\tb->lp_yy_n_chars = b->lp_yy_buf_size;\n\tb->lp_yy_is_interactive = 0;\n\tb->lp_yy_at_bol = 1;\n\tb->lp_yy_fill_buffer = 0;\n\tb->lp_yy_buffer_status = YY_BUFFER_NEW;\n\n\tlp_yy_switch_to_buffer(b ,lp_yyscanner );\n\n\treturn b;\n}\n\n/** Setup the input buffer state to scan a string. The next call to lp_yylex() will\n * scan from a @e copy of @a str.\n * @param lp_yystr a NUL-terminated string to scan\n * @param lp_yyscanner The scanner object.\n * @return the newly allocated buffer state object.\n * @note If you want to scan bytes that may contain NUL values, then use\n *       lp_yy_scan_bytes() instead.\n */\nYY_BUFFER_STATE lp_yy_scan_string (lp_yyconst char * lp_yystr , lp_yyscan_t lp_yyscanner)\n{\n    \n\treturn lp_yy_scan_bytes(lp_yystr,strlen(lp_yystr) ,lp_yyscanner);\n}\n\n/** Setup the input buffer state to scan the given bytes. The next call to lp_yylex() will\n * scan from a @e copy of @a bytes.\n * @param bytes the byte buffer to scan\n * @param len the number of bytes in the buffer pointed to by @a bytes.\n * @param lp_yyscanner The scanner object.\n * @return the newly allocated buffer state object.\n */\nYY_BUFFER_STATE lp_yy_scan_bytes  (lp_yyconst char * lp_yybytes, int  _lp_yybytes_len , lp_yyscan_t lp_yyscanner)\n{\n\tYY_BUFFER_STATE b;\n\tchar *buf;\n\tlp_yy_size_t n;\n\tint i;\n    \n\t/* Get memory for full buffer, including space for trailing EOB's. */\n\tn = _lp_yybytes_len + 2;\n\tbuf = (char *) lp_yyalloc(n ,lp_yyscanner );\n\tif ( ! buf )\n\t\tYY_FATAL_ERROR( \"out of dynamic memory in lp_yy_scan_bytes()\" );\n\n\tfor ( i = 0; i < _lp_yybytes_len; ++i )\n\t\tbuf[i] = lp_yybytes[i];\n\n\tbuf[_lp_yybytes_len] = buf[_lp_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;\n\n\tb = lp_yy_scan_buffer(buf,n ,lp_yyscanner);\n\tif ( ! b )\n\t\tYY_FATAL_ERROR( \"bad buffer in lp_yy_scan_bytes()\" );\n\n\t/* It's okay to grow etc. this buffer, and we should throw it\n\t * away when we're done.\n\t */\n\tb->lp_yy_is_our_buffer = 1;\n\n\treturn b;\n}\n\n#ifndef YY_EXIT_FAILURE\n#define YY_EXIT_FAILURE 2\n#endif\n\nstatic void lp_yy_fatal_error (lp_yyconst char* msg , lp_yyscan_t lp_yyscanner)\n{\n    \t(void) fprintf( stderr, \"%s\\n\", msg );\n\texit( YY_EXIT_FAILURE );\n}\n\n/* Redefine lp_yyless() so it works in section 3 code. */\n\n#undef lp_yyless\n#define lp_yyless(n) \\\n\tdo \\\n\t\t{ \\\n\t\t/* Undo effects of setting up lp_yytext. */ \\\n        int lp_yyless_macro_arg = (n); \\\n        YY_LESS_LINENO(lp_yyless_macro_arg);\\\n\t\tlp_yytext[lp_yyleng] = lp_yyg->lp_yy_hold_char; \\\n\t\tlp_yyg->lp_yy_c_buf_p = lp_yytext + lp_yyless_macro_arg; \\\n\t\tlp_yyg->lp_yy_hold_char = *lp_yyg->lp_yy_c_buf_p; \\\n\t\t*lp_yyg->lp_yy_c_buf_p = '\\0'; \\\n\t\tlp_yyleng = lp_yyless_macro_arg; \\\n\t\t} \\\n\twhile ( 0 )\n\n/* Accessor  methods (get/set functions) to struct members. */\n\n/** Get the user-defined data for this scanner.\n * @param lp_yyscanner The scanner object.\n */\nYY_EXTRA_TYPE lp_yyget_extra  (lp_yyscan_t lp_yyscanner)\n{\n    struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner;\n    return lp_yyextra;\n}\n\n/** Get the current line number.\n * @param lp_yyscanner The scanner object.\n */\nint lp_yyget_lineno  (lp_yyscan_t lp_yyscanner)\n{\n    struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner;\n    \n        if (! YY_CURRENT_BUFFER)\n            return 0;\n    \n    return lp_yylineno;\n}\n\n/** Get the current column number.\n * @param lp_yyscanner The scanner object.\n */\nint lp_yyget_column  (lp_yyscan_t lp_yyscanner)\n{\n    struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner;\n    \n        if (! YY_CURRENT_BUFFER)\n            return 0;\n    \n    return lp_yycolumn;\n}\n\n/** Get the input stream.\n * @param lp_yyscanner The scanner object.\n */\nFILE *lp_yyget_in  (lp_yyscan_t lp_yyscanner)\n{\n    struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner;\n    return lp_yyin;\n}\n\n/** Get the output stream.\n * @param lp_yyscanner The scanner object.\n */\nFILE *lp_yyget_out  (lp_yyscan_t lp_yyscanner)\n{\n    struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner;\n    return lp_yyout;\n}\n\n/** Get the length of the current token.\n * @param lp_yyscanner The scanner object.\n */\nint lp_yyget_leng  (lp_yyscan_t lp_yyscanner)\n{\n    struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner;\n    return lp_yyleng;\n}\n\n/** Get the current token.\n * @param lp_yyscanner The scanner object.\n */\n\nchar *lp_yyget_text  (lp_yyscan_t lp_yyscanner)\n{\n    struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner;\n    return lp_yytext;\n}\n\n/** Set the user-defined data. This data is never touched by the scanner.\n * @param user_defined The data to be associated with this scanner.\n * @param lp_yyscanner The scanner object.\n */\nvoid lp_yyset_extra (YY_EXTRA_TYPE  user_defined , lp_yyscan_t lp_yyscanner)\n{\n    struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner;\n    lp_yyextra = user_defined ;\n}\n\n/** Set the current line number.\n * @param line_number\n * @param lp_yyscanner The scanner object.\n */\nvoid lp_yyset_lineno (int  line_number , lp_yyscan_t lp_yyscanner)\n{\n    struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner;\n\n        /* lineno is only valid if an input buffer exists. */\n        if (! YY_CURRENT_BUFFER )\n           lp_yy_fatal_error( \"lp_yyset_lineno called with no buffer\" , lp_yyscanner); \n    \n    lp_yylineno = line_number;\n}\n\n/** Set the current column.\n * @param line_number\n * @param lp_yyscanner The scanner object.\n */\nvoid lp_yyset_column (int  column_no , lp_yyscan_t lp_yyscanner)\n{\n    struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner;\n\n        /* column is only valid if an input buffer exists. */\n        if (! YY_CURRENT_BUFFER )\n           lp_yy_fatal_error( \"lp_yyset_column called with no buffer\" , lp_yyscanner); \n    \n    lp_yycolumn = column_no;\n}\n\n/** Set the input stream. This does not discard the current\n * input buffer.\n * @param in_str A readable stream.\n * @param lp_yyscanner The scanner object.\n * @see lp_yy_switch_to_buffer\n */\nvoid lp_yyset_in (FILE *  in_str , lp_yyscan_t lp_yyscanner)\n{\n    struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner;\n    lp_yyin = in_str ;\n}\n\nvoid lp_yyset_out (FILE *  out_str , lp_yyscan_t lp_yyscanner)\n{\n    struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner;\n    lp_yyout = out_str ;\n}\n\nint lp_yyget_debug  (lp_yyscan_t lp_yyscanner)\n{\n    struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner;\n    return lp_yy_flex_debug;\n}\n\nvoid lp_yyset_debug (int  bdebug , lp_yyscan_t lp_yyscanner)\n{\n    struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner;\n    lp_yy_flex_debug = bdebug ;\n}\n\n/* Accessor methods for lp_yylval and lp_yylloc */\n\nYYSTYPE * lp_yyget_lval  (lp_yyscan_t lp_yyscanner)\n{\n    struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner;\n    return lp_yylval;\n}\n\nvoid lp_yyset_lval (YYSTYPE *  lp_yylval_param , lp_yyscan_t lp_yyscanner)\n{\n    struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner;\n    lp_yylval = lp_yylval_param;\n}\n\n/* User-visible API */\n\n/* lp_yylex_init is special because it creates the scanner itself, so it is\n * the ONLY reentrant function that doesn't take the scanner as the last argument.\n * That's why we explicitly handle the declaration, instead of using our macros.\n */\n\nint lp_yylex_init(lp_yyscan_t* ptr_lp_yy_globals)\n\n{\n    if (ptr_lp_yy_globals == NULL){\n        errno = EINVAL;\n        return 1;\n    }\n\n    *ptr_lp_yy_globals = (lp_yyscan_t) lp_yyalloc ( sizeof( struct lp_yyguts_t ), NULL );\n\n    if (*ptr_lp_yy_globals == NULL){\n        errno = ENOMEM;\n        return 1;\n    }\n\n    /* By setting to 0xAA, we expose bugs in lp_yy_init_globals. Leave at 0x00 for releases. */\n    memset(*ptr_lp_yy_globals,0x00,sizeof(struct lp_yyguts_t));\n\n    return lp_yy_init_globals ( *ptr_lp_yy_globals );\n}\n\n/* lp_yylex_init_extra has the same functionality as lp_yylex_init, but follows the\n * convention of taking the scanner as the last argument. Note however, that\n * this is a *pointer* to a scanner, as it will be allocated by this call (and\n * is the reason, too, why this function also must handle its own declaration).\n * The user defined value in the first argument will be available to lp_yyalloc in\n * the lp_yyextra field.\n */\n\nint lp_yylex_init_extra(YY_EXTRA_TYPE lp_yy_user_defined,lp_yyscan_t* ptr_lp_yy_globals )\n\n{\n    struct lp_yyguts_t dummy_lp_yyguts;\n\n    lp_yyset_extra (lp_yy_user_defined, &dummy_lp_yyguts);\n\n    if (ptr_lp_yy_globals == NULL){\n        errno = EINVAL;\n        return 1;\n    }\n\t\n    *ptr_lp_yy_globals = (lp_yyscan_t) lp_yyalloc ( sizeof( struct lp_yyguts_t ), &dummy_lp_yyguts );\n\t\n    if (*ptr_lp_yy_globals == NULL){\n        errno = ENOMEM;\n        return 1;\n    }\n    \n    /* By setting to 0xAA, we expose bugs in\n    lp_yy_init_globals. Leave at 0x00 for releases. */\n    memset(*ptr_lp_yy_globals,0x00,sizeof(struct lp_yyguts_t));\n    \n    lp_yyset_extra (lp_yy_user_defined, *ptr_lp_yy_globals);\n    \n    return lp_yy_init_globals ( *ptr_lp_yy_globals );\n}\n\nstatic int lp_yy_init_globals (lp_yyscan_t lp_yyscanner)\n{\n    struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner;\n    /* Initialization is the same as for the non-reentrant scanner.\n     * This function is called from lp_yylex_destroy(), so don't allocate here.\n     */\n\n    lp_yyg->lp_yy_buffer_stack = 0;\n    lp_yyg->lp_yy_buffer_stack_top = 0;\n    lp_yyg->lp_yy_buffer_stack_max = 0;\n    lp_yyg->lp_yy_c_buf_p = (char *) 0;\n    lp_yyg->lp_yy_init = 0;\n    lp_yyg->lp_yy_start = 0;\n\n    lp_yyg->lp_yy_start_stack_ptr = 0;\n    lp_yyg->lp_yy_start_stack_depth = 0;\n    lp_yyg->lp_yy_start_stack =  NULL;\n\n/* Defined in main.c */\n#ifdef YY_STDINIT\n    lp_yyin = stdin;\n    lp_yyout = stdout;\n#else\n    lp_yyin = (FILE *) 0;\n    lp_yyout = (FILE *) 0;\n#endif\n\n    /* For future reference: Set errno on error, since we are called by\n     * lp_yylex_init()\n     */\n    return 0;\n}\n\n/* lp_yylex_destroy is for both reentrant and non-reentrant scanners. */\nint lp_yylex_destroy  (lp_yyscan_t lp_yyscanner)\n{\n    struct lp_yyguts_t * lp_yyg = (struct lp_yyguts_t*)lp_yyscanner;\n\n    /* Pop the buffer stack, destroying each element. */\n\twhile(YY_CURRENT_BUFFER){\n\t\tlp_yy_delete_buffer(YY_CURRENT_BUFFER ,lp_yyscanner );\n\t\tYY_CURRENT_BUFFER_LVALUE = NULL;\n\t\tlp_yypop_buffer_state(lp_yyscanner);\n\t}\n\n\t/* Destroy the stack itself. */\n\tlp_yyfree(lp_yyg->lp_yy_buffer_stack ,lp_yyscanner);\n\tlp_yyg->lp_yy_buffer_stack = NULL;\n\n    /* Destroy the start condition stack. */\n        lp_yyfree(lp_yyg->lp_yy_start_stack ,lp_yyscanner );\n        lp_yyg->lp_yy_start_stack = NULL;\n\n    /* Reset the globals. This is important in a non-reentrant scanner so the next time\n     * lp_yylex() is called, initialization will occur. */\n    lp_yy_init_globals( lp_yyscanner);\n\n    /* Destroy the main struct (reentrant only). */\n    lp_yyfree ( lp_yyscanner , lp_yyscanner );\n    lp_yyscanner = NULL;\n    return 0;\n}\n\n/*\n * Internal utility routines.\n */\n\n#ifndef lp_yytext_ptr\nstatic void lp_yy_flex_strncpy (char* s1, lp_yyconst char * s2, int n , lp_yyscan_t lp_yyscanner)\n{\n\tregister int i;\n\tfor ( i = 0; i < n; ++i )\n\t\ts1[i] = s2[i];\n}\n#endif\n\n#ifdef YY_NEED_STRLEN\nstatic int lp_yy_flex_strlen (lp_yyconst char * s , lp_yyscan_t lp_yyscanner)\n{\n\tregister int n;\n\tfor ( n = 0; s[n]; ++n )\n\t\t;\n\n\treturn n;\n}\n#endif\n\nvoid *lp_yyalloc (lp_yy_size_t  size , lp_yyscan_t lp_yyscanner)\n{\n\treturn (void *) malloc( size );\n}\n\nvoid *lp_yyrealloc  (void * ptr, lp_yy_size_t  size , lp_yyscan_t lp_yyscanner)\n{\n\t/* The cast to (char *) in the following accommodates both\n\t * implementations that use char* generic pointers, and those\n\t * that use void* generic pointers.  It works with the latter\n\t * because both ANSI C and C++ allow castless assignment from\n\t * any pointer type to void*, and deal with argument conversions\n\t * as though doing an assignment.\n\t */\n\treturn (void *) realloc( (char *) ptr, size );\n}\n\nvoid lp_yyfree (void * ptr , lp_yyscan_t lp_yyscanner)\n{\n\tfree( (char *) ptr );\t/* see lp_yyrealloc() for (char *) cast */\n}\n\n#define YYTABLES_NAME \"lp_yytables\"\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_rlp.l",
    "content": "WS1  [ \\t]\nWS2  [ \\t\\r\\n]\nLT   [A-Za-z]\nKR   [A-Za-z0-9_\\[\\]\\{\\}/.&#$%~'@^]\nDI   [0-9]\nINNM {DI}+\nNM   (({DI}+\\.?{DI}*)|(\\.{DI}+))([Ee][-+]?{DI}+)?\nVR   {LT}{KR}*(<{KR}+>)?\nOPEQ =\nOPLE [<]=?\nOPGE [>]=?\nEOW  $|[*+-;<=>]|{WS2}+\nINF  {WS2}*[-+][Ii][Nn][Ff]([Ii][Nn][Ii][Tt]([Ee]|[Yy]))?{EOW}\nS_OP [-+ \\t\\n\\r]+\nMIN  [mM][iI][nN]([iI][mM][iI][zZsS][eE])?{WS1}*:\nMAX  [mM][aA][xX]([iI][mM][iI][zZsS][eE])?{WS1}*:\nINT  ^{WS1}*[Ii][Nn][Tt]([Ee][Gg][Ee][Rr])?\nBIN  ^{WS1}*[Bb][Ii][Nn]([Aa][Rr][Yy])?\nSEC  ^{WS1}*([Ss][Ee][Cc])|([Ss][Ee][Mm][Ii]-[Cc][Oo][Nn][Tt][Ii][Nn][Uu][Oo][Uu][Ss])|([Ss][Ee][Mm][Ii])|([Ss][Ee][Mm][Ii][Ss])\nSOS  ^{WS1}*([Ss][Oo][Ss][12]*)|([Ss][Ee][Tt][Ss])\nFREE ^{WS1}*[Ff][Rr][Ee][Ee]\nLBL  {VR}{WS1}*:\nSOSD {LBL}:\n\n/*\n   made reentrant with help of\n   http://www.usualcoding.eu/post/2007/09/03/Building-a-reentrant-parser-in-C-with-Flex/Bison\n*/\n\n/*\n   Note that a minimum version of flex is needed to be able to compile this.\n   Older version don't know the reentrant code.\n   Version 2.5.4 is not enough. Probably at least v2.5.31 is needed. Tested with v2.5.35\n*/\n\n/*\n** We want the scanner to be reentrant, therefore generate no global variables.\n** That what the 'reentrant' option is for.\n** 'bison-bridge' is used to create a bison compatible scanner and share yylval\n*/\n\n%option reentrant bison-bridge\n%option noyywrap\n%option yylineno\n\n%start COMMENT\n%start LINECOMMENT\n\n%%\n<INITIAL>\"/*\" {\n  BEGIN COMMENT;\n} /* begin skip comment */\n\n<COMMENT>\"*/\" {\n  BEGIN INITIAL;\n} /* end skip comment */\n\n<COMMENT>. {\n}\n\n<COMMENT>\\n {\n}\n\n<COMMENT>\\r {\n}\n\n<INITIAL>\"//\" {\n  BEGIN LINECOMMENT;\n} /* begin skip LINECOMMENT */\n\n<LINECOMMENT>\\n {\n  BEGIN INITIAL;\n} /* end skip LINECOMMENT */\n\n<LINECOMMENT>\\r {\n  BEGIN INITIAL;\n} /* end skip LINECOMMENT */\n\n<LINECOMMENT>. {\n}\n\n<INITIAL>{WS2}+ {\n}\n\n<INITIAL>\",\" {\n  parse_parm *pp = PARM;\n\n  pp->lineno = yylineno;\n  return(COMMA);\n}\n\n<INITIAL>{MIN} {\n  parse_parm *pp = PARM;\n\n  pp->lineno = yylineno;\n  return(MINIMISE);\n}\n\n<INITIAL>{MAX} {\n  parse_parm *pp = PARM;\n\n  pp->lineno = yylineno;\n  return(MAXIMISE);\n}\n\n<INITIAL>{INNM} {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pp->lineno = yylineno;\n  pv->f = atof((char *)yytext);\n  return(INTCONS);\n} /* f contains the last float */\n\n<INITIAL>{NM} {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pp->lineno = yylineno;\n  pv->f = atof((char *)yytext);\n  return(CONS);\n} /* f contains the last float */\n\n<INITIAL>{INF} {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n  char *ptr, c;\n\n  pp->lineno = yylineno;\n  pv->f = DEF_INFINITE;\n  pv->Sign = 0;\n  ptr = (char *)yytext;\n  while (isspace(*ptr)) ptr++;\n  if(*ptr == '-')\n    pv->Sign = 1;\n  if(yyleng > 0) {\n    c = yytext[yyleng - 1];\n    if(!isalnum(c))\n      unput(c);\n  }\n  return(INF);\n} /* f contains the last float */\n\n<INITIAL>{S_OP} {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n  int x;\n\n  pp->lineno = yylineno;\n  pv->Sign = 0;\n  for(x = 0; x < yyleng; x++)\n    if(yytext[x] == '-' || yytext[x] == '+')\n      pv->Sign = (pv->Sign == (yytext[x] == '+'));\n  return (TOK_SIGN);\n  /* Sign is TRUE if the sign-string\n     represents a '-'. Otherwise Sign\n     is FALSE */\n}\n\n<INITIAL>{INT} {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pp->lineno = yylineno;\n  if((!pv->Within_int_decl) && (!pv->Within_sec_decl) && (!pv->Within_sos_decl) && (!pv->Within_free_decl)) {\n    pv->Within_int_decl = 1;\n    pv->Within_sos_decl1 = FALSE;\n  }\n  return(SEC_INT);\n}\n\n<INITIAL>{BIN} {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pp->lineno = yylineno;\n  if((!pv->Within_int_decl) && (!pv->Within_sec_decl) && (!pv->Within_sos_decl) && (!pv->Within_free_decl)) {\n    pv->Within_int_decl = 2;\n    pv->Within_sos_decl1 = FALSE;\n  }\n  return(SEC_BIN);\n}\n\n<INITIAL>{SEC} {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pp->lineno = yylineno;\n  if((!pv->Within_int_decl) && (!pv->Within_sec_decl) && (!pv->Within_sos_decl) && (!pv->Within_free_decl)) {\n    pv->Within_sec_decl = TRUE;\n    pv->Within_sos_decl1 = FALSE;\n  }\n  return(SEC_SEC);\n}\n\n<INITIAL>{SOS} {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pp->lineno = yylineno;\n  if(!pv->Within_sos_decl)\n    pv->SOStype0 = (short)atoi(((char *)yytext) + 3);\n  if((!pv->Within_int_decl) && (!pv->Within_sec_decl) && (!pv->Within_sos_decl) && (!pv->Within_free_decl))\n    pv->Within_sos_decl = TRUE;\n  return(SEC_SOS);\n}\n\n<INITIAL>{SOSD} {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pp->lineno = yylineno;\n  FREE(pv->Last_var);\n  pv->Last_var = strdup((char *)yytext);\n  pv->Last_var[strlen(pv->Last_var) - 2] = 0;\n  return(SOSDESCR);\n}\n\n<INITIAL>{FREE} {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pp->lineno = yylineno;\n  if((!pv->Within_int_decl) && (!pv->Within_sec_decl) && (!pv->Within_sos_decl) && (!pv->Within_free_decl)) {\n    pv->Within_free_decl = TRUE;\n    pv->Within_sos_decl1 = FALSE;\n  }\n  return(SEC_FREE);\n}\n\n<INITIAL>{LBL} {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n  char *ptr;\n\n  pp->lineno = yylineno;\n  FREE(pv->Last_var);\n  pv->Last_var = strdup((char *)yytext);\n  ptr = pv->Last_var + strlen(pv->Last_var);\n  ptr[-1] = ' ';\n  while ((--ptr >= pv->Last_var) && (isspace(*ptr)))\n    *ptr = 0;\n  return(VARIABLECOLON);\n}\n\n<INITIAL>{VR} {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pp->lineno = yylineno;\n  FREE(pv->Last_var);\n  pv->Last_var = strdup((char *)yytext);\n  return(VAR);\n}\n\n<INITIAL>\":\" {\n  parse_parm *pp = PARM;\n\n  pp->lineno = yylineno;\n  return (COLON);\n}\n\n<INITIAL>\"*\" {\n  parse_parm *pp = PARM;\n\n  pp->lineno = yylineno;\n  return(AR_M_OP);\n}\n\n<INITIAL>{OPEQ} {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pp->lineno = yylineno;\n  pv->OP = *yytext;\n  return(RE_OPEQ);\n}\n\n<INITIAL>{OPLE} {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pp->lineno = yylineno;\n  pv->OP = *yytext;\n  return(RE_OPLE);\n}\n\n<INITIAL>{OPGE} {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pp->lineno = yylineno;\n  pv->OP = *yytext;\n  return(RE_OPGE);\n}\n\n<INITIAL>\";\" {\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pp->lineno = yylineno;\n  pv->Within_int_decl = pv->Within_sec_decl = pv->Within_sos_decl = pv->Within_free_decl = FALSE;\n  check_int_sec_sos_free_decl(pp, (int) pv->Within_int_decl, (int) pv->Within_sec_decl, (int) pv->Within_sos_decl, (int) pv->Within_free_decl);\n  return(END_C);\n}\n\n<INITIAL>. {\n  parse_parm *pp = PARM;\n\n  pp->lineno = yylineno;\n  report(NULL, CRITICAL, \"LEX ERROR : %s lineno %d\\n\", yytext, yylineno);\n  return(UNDEFINED);\n}\n\n%%\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_rlp.y",
    "content": "/* ========================================================================= */\n/* NAME  : lp_rlp.y                                                          */\n/* ========================================================================= */\n\n/*\n   made reentrant with help of\n   http://www.usualcoding.eu/post/2007/09/03/Building-a-reentrant-parser-in-C-with-Flex/Bison\n*/\n\n/*\n   Note that a minimum version of bison is needed to be able to compile this.\n   Older version don't know the reentrant code.\n   Version 1.35 is not enough. v1.875 could be ok. Tested with v2.3\n*/\n\n%pure-parser\n%parse-param {parse_parm *parm}\n%parse-param {void *scanner}\n%lex-param {yyscan_t *scanner}\n\n%token VAR CONS INTCONS VARIABLECOLON INF SEC_INT SEC_BIN SEC_SEC SEC_SOS SOSDESCR SEC_FREE TOK_SIGN AR_M_OP RE_OPEQ RE_OPLE RE_OPGE END_C COMMA COLON MINIMISE MAXIMISE UNDEFINED\n\n\n%{\n#include <stdlib.h>\n#include <string.h>\n#include <ctype.h>\n\n#define scanner yyscanner\n#define PARM yyget_extra(yyscanner)\n#define YYSTYPE int\n#define YY_EXTRA_TYPE parse_parm *\n#define YY_FATAL_ERROR(msg) lex_fatal_error(PARM, yyscanner, msg)\n#undef YY_INPUT\n#define YY_INPUT(buf,result,max_size) result = lp_input((void *) PARM, buf, max_size);\n#define yyerror read_error\n\n#include \"lpkit.h\"\n#include \"yacc_read.h\"\n\ntypedef struct parse_vars_s\n{\n  read_modeldata_func *lp_input;\n  void *userhandle;\n  char HadVar, HadVar0, HadVar1, HadVar2, HasAR_M_OP, HadConstraint, Had_lineair_sum, Had_lineair_sum0, do_add_row, HadSign, OP, Sign, isign, isign0, make_neg;\n  char state, state0;\n  char Within_int_decl;  /* TRUE when we are within an char declaration */\n  char Within_bin_decl;  /* TRUE when we are within an bin declaration */\n  char Within_sec_decl;  /* TRUE when we are within a sec declaration */\n  char Within_sos_decl;  /* TRUE when we are within a sos declaration */\n  char Within_sos_decl1;\n  char Within_free_decl; /* TRUE when we are within a free declaration */\n  short SOStype, SOStype0;        /* SOS type */\n  int SOSNr;\n  int SOSweight;         /* SOS weight */\n  char *Last_var, *Last_var0;\n  REAL f, f0, f1;\n} parse_vars;\n\n#ifdef FORTIFY\n# include \"lp_fortify.h\"\n#endif\n\n/* let's please C++ users */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if defined MSDOS || defined __MSDOS__ || defined WINDOWS || defined _WINDOWS || defined WIN32 || defined _WIN32\n#define YY_NO_UNISTD_H\n\nstatic int isatty(int f)\n{\n  return(FALSE);\n}\n\n#if !defined _STDLIB_H\n# define _STDLIB_H\n#endif\n#endif\n\nstatic int __WINAPI lp_input_yyin(void *fpin, char *buf, int max_size)\n{\n  int result;\n\n  result = fread( (char*)buf, sizeof(char), max_size, (FILE *)fpin);\n\n  return(result);\n}\n\nstatic int __WINAPI lp_input(void *vpp, char *buf, int max_size)\n{\n  parse_parm *pp = (parse_parm *) vpp;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n  int result;\n\n  result = pv->lp_input(pv->userhandle, buf, max_size);\n  if (result < 0)\n    lex_fatal_error(pp, pp->scanner, \"read() in flex scanner failed\");\n  return(result);\n}\n\n#ifdef __cplusplus\n};\n#endif\n\n#include \"lp_rlp.h\"\n\n#undef yylval\n\n%}\n\n%start inputfile\n%%\n\nEMPTY: /* EMPTY */\n                ;\n\ninputfile       :\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pv->isign = 0;\n  pv->make_neg = 0;\n  pv->Sign = 0;\n  pv->HadConstraint = FALSE;\n  pv->HadVar = pv->HadVar0 = FALSE;\n}\n                  objective_function\n                  constraints\n                  int_bin_sec_sos_free_declarations\n                ;\n\n/* start objective_function */\n\n/*\n\n objective_function: MAXIMISE real_of | MINIMISE real_of | real_of;\n real_of:            lineair_sum END_C;\n lineair_sum:        EMPTY | x_lineair_sum;\n\n*/\n\nobjective_function:   MAXIMISE real_of\n{\n  set_obj_dir(PARM, TRUE);\n}\n                    | MINIMISE real_of\n{\n  set_obj_dir(PARM, FALSE);\n}\n                    | real_of\n                ;\n\nreal_of:            lineair_sum\n                    END_C\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  add_row(pp);\n  pv->HadConstraint = FALSE;\n  pv->HadVar = pv->HadVar0 = FALSE;\n  pv->isign = 0;\n  pv->make_neg = 0;\n}\n                ;\n\nlineair_sum:          EMPTY\n                    | x_lineair_sum\n                ;\n\n/* end objective_function */\n\n\n\n/* start constraints */\n\n/*\n\n constraints:        EMPTY | x_constraints;\n x_constraints:      constraint | x_constraints constraint;\n constraint:         real_constraint | VARIABLECOLON real_constraint;\n real_constraint:    x_lineair_sum2 RE_OP x_lineair_sum3 optionalrange END_C;\n optionalrange:      EMPTY | RE_OP cons_term RHS_STORE;\n RE_OP:              RE_OPEQ | RE_OPLE | RE_OPGE;\n cons_term:          x_SIGN REALCONS | INF;\n x_lineair_sum2:     EMPTY | x_lineair_sum3;\n x_lineair_sum3:     x_lineair_sum | INF RHS_STORE;\n x_lineair_sum:      x_lineair_sum1;\n x_lineair_sum1:     x_lineair_term | x_lineair_sum1 x_lineair_term;\n x_lineair_term:     x_SIGN x_lineair_term1;\n x_lineair_term1:    REALCONS | optional_AR_M_OP VAR;\n x_SIGN:             EMPTY | TOK_SIGN;\n REALCONS:           INTCONS | CONS;\n optional_AR_M_OP:   EMPTY | AR_M_OP;\n\n*/\n\nconstraints:      EMPTY\n                | x_constraints\n                ;\n\nx_constraints   : constraint\n                | x_constraints\n                  constraint\n                ;\n\nconstraint      : real_constraint\n                | VARIABLECOLON\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  if(!add_constraint_name(pp, pv->Last_var))\n    YYABORT;\n  pv->HadConstraint = TRUE;\n}\n                  real_constraint\n                ;\n\nreal_constraint : x_lineair_sum2\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pv->HadVar1 = pv->HadVar0;\n  pv->HadVar0 = FALSE;\n}\n                  RE_OP\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  if(!store_re_op(pp, pv->OP, (int) pv->HadConstraint, (int) pv->HadVar, (int) pv->Had_lineair_sum))\n    YYABORT;\n  pv->make_neg = 1;\n  pv->f1 = 0;\n}\n                  x_lineair_sum3\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pv->Had_lineair_sum0 = pv->Had_lineair_sum;\n  pv->Had_lineair_sum = TRUE;\n  pv->HadVar2 = pv->HadVar0;\n  pv->HadVar0 = FALSE;\n  pv->do_add_row = FALSE;\n  if(pv->HadConstraint && !pv->HadVar ) {\n    /* it is a range */\n    /* already handled */\n  }\n  else if(!pv->HadConstraint && pv->HadVar) {\n    /* it is a bound */\n\n    if(!store_bounds(pp, TRUE))\n      YYABORT;\n  }\n  else {\n    /* it is a row restriction */\n    if(pv->HadConstraint && pv->HadVar)\n      store_re_op(pp, '\\0', (int) pv->HadConstraint, (int) pv->HadVar, (int) pv->Had_lineair_sum); /* makes sure that data stored in temporary buffers is treated correctly */\n    pv->do_add_row = TRUE;\n  }\n}\n                  optionalrange\n                  END_C\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  if((!pv->HadVar) && (!pv->HadConstraint)) {\n    yyerror(pp, pp->scanner, \"parse error\");\n    YYABORT;\n  }\n  if(pv->do_add_row)\n    add_row(pp);\n  pv->HadConstraint = FALSE;\n  pv->HadVar = pv->HadVar0 = FALSE;\n  pv->isign = 0;\n  pv->make_neg = 0;\n  null_tmp_store(pp, TRUE);\n}\n                ;\n\noptionalrange:    EMPTY\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  if((!pv->HadVar1) && (pv->Had_lineair_sum0))\n    if(!negate_constraint(pp))\n      YYABORT;\n}\n                | RE_OP\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pv->make_neg = 0;\n  pv->isign = 0;\n  if(pv->HadConstraint)\n    pv->HadVar = pv->Had_lineair_sum = FALSE;\n  pv->HadVar0 = FALSE;\n  if(!store_re_op(pp, (char) ((pv->OP == '<') ? '>' : (pv->OP == '>') ? '<' : pv->OP), (int) pv->HadConstraint, (int) pv->HadVar, (int) pv->Had_lineair_sum))\n    YYABORT;\n}\n                  cons_term\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pv->f -= pv->f1;\n}\n                  RHS_STORE\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  if((pv->HadVar1) || (!pv->HadVar2) || (pv->HadVar0)) {\n    yyerror(pp, pp->scanner, \"parse error\");\n    YYABORT;\n  }\n\n  if(pv->HadConstraint && !pv->HadVar ) {\n    /* it is a range */\n    /* already handled */\n    if(!negate_constraint(pp))\n      YYABORT;\n  }\n  else if(!pv->HadConstraint && pv->HadVar) {\n    /* it is a bound */\n\n    if(!store_bounds(pp, TRUE))\n      YYABORT;\n  }\n}\n                ;\n\nx_lineair_sum2:   EMPTY\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  /* to allow a range */\n  /* constraint: < max */\n  if(!pv->HadConstraint) {\n    yyerror(pp, pp->scanner, \"parse error\");\n    YYABORT;\n  }\n  pv->Had_lineair_sum = FALSE;\n}\n                | x_lineair_sum3\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pv->Had_lineair_sum = TRUE;\n}\n                ;\n\nx_lineair_sum3  :  x_lineair_sum\n                | INF\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pv->isign = pv->Sign;\n}\n                  RHS_STORE\n                ;\n\nx_lineair_sum:\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pv->state = pv->state0 = 0;\n}\n                x_lineair_sum1\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  if (pv->state == 1) {\n    /* RHS_STORE */\n    if (    (pv->isign0 || !pv->make_neg)\n        && !(pv->isign0 && !pv->make_neg)) /* but not both! */\n      pv->f0 = -pv->f0;\n    if(pv->make_neg)\n      pv->f1 += pv->f0;\n    if(!rhs_store(pp, pv->f0, (int) pv->HadConstraint, (int) pv->HadVar, (int) pv->Had_lineair_sum))\n      YYABORT;\n  }\n}\n                ;\n\nx_lineair_sum1  : x_lineair_term\n                | x_lineair_sum1\n                  x_lineair_term\n                ;\n\nx_lineair_term  : x_SIGN\n                  x_lineair_term1\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  if ((pv->HadSign || pv->state == 1) && (pv->state0 == 1)) {\n    /* RHS_STORE */\n    if (    (pv->isign0 || !pv->make_neg)\n        && !(pv->isign0 && !pv->make_neg)) /* but not both! */\n      pv->f0 = -pv->f0;\n    if(pv->make_neg)\n      pv->f1 += pv->f0;\n    if(!rhs_store(pp, pv->f0, (int) pv->HadConstraint, (int) pv->HadVar, (int) pv->Had_lineair_sum))\n      YYABORT;\n  }\n  if (pv->state == 1) {\n    pv->f0 = pv->f;\n    pv->isign0 = pv->isign;\n  }\n  if (pv->state == 2) {\n    if((pv->HadSign) || (pv->state0 != 1)) {\n     pv->isign0 = pv->isign;\n     pv->f0 = 1.0;\n    }\n    if (    (pv->isign0 || pv->make_neg)\n        && !(pv->isign0 && pv->make_neg)) /* but not both! */\n      pv->f0 = -pv->f0;\n    if(!var_store(pp, pv->Last_var, pv->f0, (int) pv->HadConstraint, (int) pv->HadVar, (int) pv->Had_lineair_sum)) {\n      yyerror(pp, pp->scanner, \"var_store failed\");\n      YYABORT;\n    }\n    pv->HadConstraint |= pv->HadVar;\n    pv->HadVar = pv->HadVar0 = TRUE;\n  }\n  pv->state0 = pv->state;\n}\n                ;\n\nx_lineair_term1 : REALCONS\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pv->state = 1;\n}\n                | optional_AR_M_OP\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  if ((pv->HasAR_M_OP) && (pv->state != 1)) {\n    yyerror(pp, pp->scanner, \"parse error\");\n    YYABORT;\n  }\n}\n                  VAR\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pv->state = 2;\n}\n                ;\n\nRE_OP: RE_OPEQ | RE_OPLE | RE_OPGE\n                ;\n\ncons_term:        x_SIGN\n                  REALCONS\n                | INF\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pv->isign = pv->Sign;\n}\n                ;\n\n/* end constraints */\n\n\n/* start common for objective & constraints */\n\nREALCONS: INTCONS | CONS\n                ;\n\nx_SIGN:           EMPTY\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pv->isign = 0;\n  pv->HadSign = FALSE;\n}\n                | TOK_SIGN\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pv->isign = pv->Sign;\n  pv->HadSign = TRUE;\n}\n                ;\n\noptional_AR_M_OP: EMPTY\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pv->HasAR_M_OP = FALSE;\n}\n                | AR_M_OP\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pv->HasAR_M_OP = TRUE;\n}\n                ;\n\nRHS_STORE:        EMPTY\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  if (    (pv->isign || !pv->make_neg)\n      && !(pv->isign && !pv->make_neg)) /* but not both! */\n    pv->f = -pv->f;\n  if(!rhs_store(pp, pv->f, (int) pv->HadConstraint, (int) pv->HadVar, (int) pv->Had_lineair_sum))\n    YYABORT;\n  pv->isign = 0;\n}\n                ;\n\n/* end common for objective & constraints */\n\n\n\n/* start int_bin_sec_sos_free_declarations */\n\nint_bin_sec_sos_free_declarations:\n                  EMPTY\n                | real_int_bin_sec_sos_free_decls\n                ;\n\nreal_int_bin_sec_sos_free_decls: int_bin_sec_sos_free_declaration\n                | real_int_bin_sec_sos_free_decls int_bin_sec_sos_free_declaration\n                ;\n\nSEC_INT_BIN_SEC_SOS_FREE: SEC_INT | SEC_BIN | SEC_SEC | SEC_SOS | SEC_FREE\n                ;\n\nint_bin_sec_sos_free_declaration:\n                  SEC_INT_BIN_SEC_SOS_FREE\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  pv->Within_sos_decl1 = pv->Within_sos_decl;\n}\n                  x_int_bin_sec_sos_free_declaration\n                ;\n\nxx_int_bin_sec_sos_free_declaration:\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  if((!pv->Within_int_decl) && (!pv->Within_sec_decl) && (!pv->Within_sos_decl1) && (!pv->Within_free_decl)) {\n    yyerror(pp, pp->scanner, \"parse error\");\n    YYABORT;\n  }\n  pv->SOStype = pv->SOStype0;\n  check_int_sec_sos_free_decl(pp, (int) pv->Within_int_decl, (int) pv->Within_sec_decl, (int) (pv->Within_sos_decl1 = (pv->Within_sos_decl1 ? 1 : 0)), (int) pv->Within_free_decl);\n}\n                  optionalsos\n                  vars\n                  optionalsostype\n                  END_C\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  if((pv->Within_sos_decl1) && (pv->SOStype == 0))\n  {\n    yyerror(pp, pp->scanner, \"Unsupported SOS type (0)\");\n    YYABORT;\n  }\n}\n                ;\n\nx_int_bin_sec_sos_free_declaration:\n                  xx_int_bin_sec_sos_free_declaration\n                | x_int_bin_sec_sos_free_declaration xx_int_bin_sec_sos_free_declaration\n                ;\n\noptionalsos:      EMPTY\n                | SOSDESCR\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  FREE(pv->Last_var0);\n  pv->Last_var0 = strdup(pv->Last_var);\n}\n                  sosdescr\n                ;\n\noptionalsostype:  EMPTY\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  if(pv->Within_sos_decl1) {\n    set_sos_type(pp, pv->SOStype);\n    set_sos_weight(pp, (double) pv->SOSweight, 1);\n  }\n}\n                | RE_OPLE\n                  INTCONS\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  if((pv->Within_sos_decl1) && (!pv->SOStype))\n  {\n    set_sos_type(pp, pv->SOStype = (short) (pv->f + .1));\n  }\n  else\n  {\n    yyerror(pp, pp->scanner, \"SOS type not expected\");\n    YYABORT;\n  }\n}\n                optionalSOSweight\n                ;\n\noptionalSOSweight:EMPTY\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  set_sos_weight(pp, (double) pv->SOSweight, 1);\n}\n                | COLON\n                  INTCONS\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  set_sos_weight(pp, pv->f, 1);\n}\n                ;\n\nvars:             EMPTY\n                | x_vars\n                ;\n\nx_vars          : onevarwithoptionalweight\n                | x_vars\n                  optionalcomma\n                  onevarwithoptionalweight\n                ;\n\noptionalcomma:    EMPTY\n                | COMMA\n                ;\n\nvariable:         EMPTY\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  if(pv->Within_sos_decl1 == 1)\n  {\n    char buf[16];\n\n    pv->SOSweight++;\n    sprintf(buf, \"SOS%d\", pv->SOSweight);\n    storevarandweight(pp, buf);\n\n    check_int_sec_sos_free_decl(pp, (int) pv->Within_int_decl, (int) pv->Within_sec_decl, 2, (int) pv->Within_free_decl);\n    pv->Within_sos_decl1 = 2;\n    pv->SOSNr = 0;\n  }\n\n  storevarandweight(pp, pv->Last_var);\n\n  if(pv->Within_sos_decl1 == 2)\n  {\n    pv->SOSNr++;\n    set_sos_weight(pp, (double) pv->SOSNr, 2);\n  }\n}\n                ;\n\nvariablecolon:\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  if(!pv->Within_sos_decl1) {\n    yyerror(pp, pp->scanner, \"parse error\");\n    YYABORT;\n  }\n  if(pv->Within_sos_decl1 == 1) {\n    FREE(pv->Last_var0);\n    pv->Last_var0 = strdup(pv->Last_var);\n  }\n  if(pv->Within_sos_decl1 == 2)\n  {\n    storevarandweight(pp, pv->Last_var);\n    pv->SOSNr++;\n    set_sos_weight(pp, (double) pv->SOSNr, 2);\n  }\n}\n                ;\n\nsosweight:        EMPTY\n{\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  if(pv->Within_sos_decl1 == 1)\n  {\n    char buf[16];\n\n    pv->SOSweight++;\n    sprintf(buf, \"SOS%d\", pv->SOSweight);\n    storevarandweight(pp, buf);\n\n    check_int_sec_sos_free_decl(pp, (int) pv->Within_int_decl, (int) pv->Within_sec_decl, 2, (int) pv->Within_free_decl);\n    pv->Within_sos_decl1 = 2;\n    pv->SOSNr = 0;\n\n    storevarandweight(pp, pv->Last_var0);\n    pv->SOSNr++;\n  }\n\n  set_sos_weight(pp, pv->f, 2);\n}\n                ;\n\nsosdescr:         EMPTY\n{ /* SOS name */\n  parse_parm *pp = PARM;\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n  if(pv->Within_sos_decl1 == 1)\n  {\n    parse_parm *pp = PARM;\n    parse_vars *pv = (parse_vars *) pp->parse_vars;\n\n    storevarandweight(pp, pv->Last_var0);\n    set_sos_type(pp, pv->SOStype);\n    check_int_sec_sos_free_decl(pp, (int) pv->Within_int_decl, (int) pv->Within_sec_decl, 2, (int) pv->Within_free_decl);\n    pv->Within_sos_decl1 = 2;\n    pv->SOSNr = 0;\n    pv->SOSweight++;\n  }\n}\n                ;\n\nonevarwithoptionalweight:\n                  VAR\n                  variable\n                | VARIABLECOLON\n                  variablecolon\n                  INTCONSorVARIABLE\n                ;\n\nINTCONSorVARIABLE:REALCONS /* INTCONS */\n                  sosweight\n                | sosdescr\n                  x_onevarwithoptionalweight\n                ;\n\nx_onevarwithoptionalweight:\n                  VAR\n                  variable\n                | VARIABLECOLON\n                  variablecolon\n                  REALCONS /* INTCONS */\n                  sosweight\n                ;\n\n/* end int_bin_sec_sos_free_declarations */\n\n%%\n\nstatic void yy_delete_allocated_memory(parse_parm *pp)\n{\n  parse_vars *pv = (parse_vars *) pp->parse_vars;\n  /* free memory allocated by flex. Otherwise some memory is not freed.\n     This is a bit tricky. There is not much documentation about this, but a lot of\n     reports of memory that keeps allocated */\n\n  /* If you get errors on this function call, just comment it. This will only result\n     in some memory that is not being freed. */\n\n# if defined YY_CURRENT_BUFFER\n    /* flex defines the macro YY_CURRENT_BUFFER, so you should only get here if lp_rlp.h is\n       generated by flex */\n    /* lex doesn't define this macro and thus should not come here, but lex doesn't has\n       this memory leak also ...*/\n\n#  if 0\n    /* older versions of flex */\n    yy_delete_buffer(YY_CURRENT_BUFFER); /* comment this line if you have problems with it */\n    yy_init = 1; /* make sure that the next time memory is allocated again */\n    yy_start = 0;\n#  else\n    /* As of version 2.5.9 Flex  */\n    yylex_destroy(pp->scanner); /* comment this line if you have problems with it */\n#  endif\n# endif\n\n  FREE(pv->Last_var);\n  FREE(pv->Last_var0);\n}\n\nstatic int parse(parse_parm *pp)\n{\n  return(yyparse(pp, pp->scanner));\n}\n\nlprec *read_lp1(lprec *lp, void *userhandle, read_modeldata_func read_modeldata, int verbose, char *lp_name)\n{\n  parse_vars *pv;\n  lprec *lp1 = NULL;\n\n  CALLOC(pv, 1, parse_vars);\n  if (pv != NULL) {\n    parse_parm pp;\n\n    memset(&pp, 0, sizeof(pp));\n    pp.parse_vars = (void *) pv;\n\n    yylex_init(&pp.scanner);\n    yyset_extra(&pp, pp.scanner);\n\n    yyset_in((FILE *) userhandle, pp.scanner);\n    yyset_out(NULL, pp.scanner);\n    pv->lp_input = read_modeldata;\n    pv->userhandle = userhandle;\n    lp1 = yacc_read(lp, verbose, lp_name, parse, &pp, yy_delete_allocated_memory);\n    FREE(pv);\n  }\n  return(lp1);\n}\n\nlprec * __WINAPI read_lp(FILE *filename, int verbose, char *lp_name)\n{\n  return(read_lp1(NULL, filename, lp_input_yyin, verbose, lp_name));\n}\n\nlprec * __WINAPI read_lpex(void *userhandle, read_modeldata_func read_modeldata, int verbose, char *lp_name)\n{\n  return(read_lp1(NULL, userhandle, read_modeldata, verbose, lp_name));\n}\n\nlprec *read_LP1(lprec *lp, char *filename, int verbose, char *lp_name)\n{\n  FILE *fpin;\n\n  if((fpin = fopen(filename, \"r\")) != NULL) {\n    lp = read_lp1(lp, fpin, lp_input_yyin, verbose, lp_name);\n    fclose(fpin);\n  }\n  else\n    lp = NULL;\n  return(lp);\n}\n\nlprec * __WINAPI read_LP(char *filename, int verbose, char *lp_name)\n{\n  return(read_LP1(NULL, filename, verbose, lp_name));\n}\n\nMYBOOL __WINAPI LP_readhandle(lprec **lp, FILE *filename, int verbose, char *lp_name)\n{\n  if(lp != NULL)\n    *lp = read_lp1(*lp, filename, lp_input_yyin, verbose, lp_name);\n\n  return((lp != NULL) && (*lp != NULL));\n}\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_scale.c",
    "content": "\n#include <string.h>\n#include \"commonlib.h\"\n#include \"lp_lib.h\"\n#include \"lp_report.h\"\n#include \"lp_scale.h\"\n\n#ifdef FORTIFY\n# include \"lp_fortify.h\"\n#endif\n\n\n/*\n    Scaling routines for lp_solve v5.0+\n   ----------------------------------------------------------------------------------\n    Author:        Kjell Eikland\n    Contact:       kjell.eikland@broadpark.no\n    License terms: LGPL.\n\n    Requires:      lp_lib.h, lp_scale.h\n\n    Release notes:\n    v5.0.0  1 January 2004      Significantly expanded and repackaged scaling\n                                routines.\n    v5.0.1  20 February 2004    Modified rounding behaviour in several areas.\n    v5.1.0  20 July 2004        Reworked with flexible matrix storage model.\n    v5.2.0  20 February 2005    Converted to matrix storage model without the OF.\n\n   ----------------------------------------------------------------------------------\n*/\n\n/* First define scaling and unscaling primitives */\n\nREAL scaled_value(lprec *lp, REAL value, int index)\n{\n  if(fabs(value) < lp->infinite) {\n    if(lp->scaling_used) {\n      if(index > lp->rows)\n        value /= lp->scalars[index];\n      else\n        value *= lp->scalars[index];\n    }\n  }\n  else\n    value = my_sign(value)*lp->infinite;\n  return(value);\n}\n\nREAL unscaled_value(lprec *lp, REAL value, int index)\n{\n  if(fabs(value) < lp->infinite) {\n    if(lp->scaling_used) {\n      if(index > lp->rows)\n        value *= lp->scalars[index];\n      else\n        value /= lp->scalars[index];\n    }\n  }\n  else\n    value = my_sign(value)*lp->infinite;\n  return(value);\n}\n\nSTATIC REAL scaled_mat(lprec *lp, REAL value, int rownr, int colnr)\n{\n  if(lp->scaling_used)\n    value *= lp->scalars[rownr] * lp->scalars[lp->rows + colnr];\n  return( value );\n}\n\nSTATIC REAL unscaled_mat(lprec *lp, REAL value, int rownr, int colnr)\n{\n  if(lp->scaling_used)\n    value /= lp->scalars[rownr] * lp->scalars[lp->rows + colnr];\n  return( value );\n}\n\n/* Compute the scale factor by the formulae:\n      FALSE: SUM (log |Aij|) ^ 2\n      TRUE:  SUM (log |Aij| - RowScale[i] - ColScale[j]) ^ 2 */\nREAL CurtisReidMeasure(lprec *lp, MYBOOL _Advanced, REAL *FRowScale, REAL *FColScale)\n{\n  int      i, nz;\n  REAL     absvalue, logvalue;\n  register REAL result;\n  MATrec   *mat = lp->matA;\n  REAL     *value;\n  int      *rownr, *colnr;\n\n  /* Do OF part */\n  result = 0;\n  for(i = 1; i <= lp->columns; i++) {\n    absvalue = fabs(lp->orig_obj[i]);\n    if(absvalue > 0) {\n      logvalue = log(absvalue);\n      if(_Advanced)\n        logvalue -= FRowScale[0] + FColScale[i];\n      result += logvalue*logvalue;\n    }\n  }\n\n  /* Do constraint matrix part */\n  mat_validate(mat);\n  value = &(COL_MAT_VALUE(0));\n  rownr = &(COL_MAT_ROWNR(0));\n  colnr = &(COL_MAT_COLNR(0));\n  nz = get_nonzeros(lp);\n  for(i = 0; i < nz;\n      i++, value += matValueStep, rownr += matRowColStep, colnr += matRowColStep) {\n    absvalue = fabs(*value);\n    if(absvalue > 0) {\n      logvalue = log(absvalue);\n      if(_Advanced)\n        logvalue -= FRowScale[*rownr] + FColScale[*colnr];\n      result += logvalue*logvalue;\n    }\n  }\n  return( result );\n}\n\n/* Implementation of the Curtis-Reid scaling based on the paper\n   \"On the Automatic Scaling of Matrices for Gaussian\n    Elimination,\" Journal of the Institute of Mathematics and\n    Its Applications (1972) 10, 118-124.\n\n    Solve the system | M   E | (r)   (sigma)\n                     |       | ( ) = (     )\n                     | E^T N | (c)   ( tau )\n\n    by the conjugate gradient method (clever recurrences).\n\n    E is the matrix A with all elements = 1\n\n    M is diagonal matrix of row    counts (RowCount)\n    N is diagonal matrix of column counts (ColCount)\n\n    sigma is the vector of row    logarithm sums (RowSum)\n    tau   is the vector of column logarithm sums (ColSum)\n\n    r, c are resulting row and column scalings (RowScale, ColScale) */\n\nint CurtisReidScales(lprec *lp, MYBOOL _Advanced, REAL *FRowScale, REAL *FColScale)\n{\n  int    i, row, col, ent, nz;\n  REAL   *RowScalem2, *ColScalem2,\n         *RowSum, *ColSum,\n         *residual_even, *residual_odd;\n  REAL   sk,   qk,     ek,\n         skm1, qkm1,   ekm1,\n         qkm2, qkqkm1, ekm2, ekekm1,\n         absvalue, logvalue,\n         StopTolerance;\n  int    *RowCount, *ColCount, colMax;\n  int    Result;\n  MATrec *mat = lp->matA;\n  REAL   *value;\n  int    *rownr, *colnr;\n\n  if(CurtisReidMeasure(lp, _Advanced, FRowScale, FColScale)<0.1*get_nonzeros(lp))\n  return(0);\n\n  /* Allocate temporary memory and find RowSum and ColSum measures */\n  nz = get_nonzeros(lp);\n  colMax = lp->columns;\n\n  allocREAL(lp, &RowSum, lp->rows+1, TRUE);\n  allocINT(lp,  &RowCount, lp->rows+1, TRUE);\n  allocREAL(lp, &residual_odd, lp->rows+1, TRUE);\n\n  allocREAL(lp, &ColSum, colMax+1, TRUE);\n  allocINT(lp,  &ColCount, colMax+1, TRUE);\n  allocREAL(lp, &residual_even, colMax+1, TRUE);\n\n  allocREAL(lp, &RowScalem2, lp->rows+1, FALSE);\n  allocREAL(lp, &ColScalem2, colMax+1, FALSE);\n\n  /* Set origin for row scaling */\n  for(i = 1; i <= colMax; i++) {\n    absvalue=fabs(lp->orig_obj[i]);\n    if(absvalue>0) {\n      logvalue = log(absvalue);\n      ColSum[i] += logvalue;\n      RowSum[0] += logvalue;\n      ColCount[i]++;\n      RowCount[0]++;\n    }\n  }\n\n  value = &(COL_MAT_VALUE(0));\n  rownr = &(COL_MAT_ROWNR(0));\n  colnr = &(COL_MAT_COLNR(0));\n  for(i = 0; i < nz;\n      i++, value += matValueStep, rownr += matRowColStep, colnr += matRowColStep) {\n    absvalue=fabs(*value);\n    if(absvalue>0) {\n      logvalue = log(absvalue);\n      ColSum[*colnr] += logvalue;\n      RowSum[*rownr] += logvalue;\n      ColCount[*colnr]++;\n      RowCount[*rownr]++;\n    }\n  }\n\n  /* Make sure we dont't have division by zero errors */\n  for(row = 0; row <= lp->rows; row++)\n    if(RowCount[row] == 0)\n      RowCount[row] = 1;\n  for(col = 1; col <= colMax; col++)\n    if(ColCount[col] == 0)\n      ColCount[col] = 1;\n\n  /* Initialize to RowScale = RowCount-1 RowSum\n                   ColScale = 0.0\n                   residual = ColSum - ET RowCount-1 RowSum */\n\n  StopTolerance= MAX(lp->scalelimit-floor(lp->scalelimit), DEF_SCALINGEPS);\n  StopTolerance *= (REAL) nz;\n  for(row = 0; row <= lp->rows; row++) {\n    FRowScale[row] = RowSum[row] / (REAL) RowCount[row];\n    RowScalem2[row] = FRowScale[row];\n  }\n\n  /* Compute initial residual */\n  for(col = 1; col <= colMax; col++) {\n    FColScale[col] = 0;\n    ColScalem2[col] = 0;\n    residual_even[col] = ColSum[col];\n\n    if(lp->orig_obj[col] != 0)\n      residual_even[col] -= RowSum[0] / (REAL) RowCount[0];\n\n    i = mat->col_end[col-1];\n    rownr = &(COL_MAT_ROWNR(i));\n    ent = mat->col_end[col];\n    for(; i < ent;\n        i++, rownr += matRowColStep) {\n      residual_even[col] -= RowSum[*rownr] / (REAL) RowCount[*rownr];\n    }\n  }\n\n  /* Compute sk */\n  sk = 0;\n  skm1 = 0;\n  for(col = 1; col <= colMax; col++)\n    sk += (residual_even[col]*residual_even[col]) / (REAL) ColCount[col];\n\n  Result = 0;\n  qk=1; qkm1=0; qkm2=0;\n  ek=0; ekm1=0; ekm2=0;\n\n  while(sk>StopTolerance) {\n  /* Given the values of residual and sk, construct\n     ColScale (when pass is even)\n     RowScale (when pass is odd)  */\n\n    qkqkm1 = qk * qkm1;\n    ekekm1 = ek * ekm1;\n    if((Result % 2) == 0) { /* pass is even; construct RowScale[pass+1] */\n      if(Result != 0) {\n        for(row = 0; row <= lp->rows; row++)\n          RowScalem2[row] = FRowScale[row];\n        if(qkqkm1 != 0) {\n          for(row = 0; row <= lp->rows; row++)\n            FRowScale[row]*=(1 + ekekm1 / qkqkm1);\n          for(row = 0; row<=lp->rows; row++)\n            FRowScale[row]+=(residual_odd[row] / (qkqkm1 * (REAL) RowCount[row]) -\n                             RowScalem2[row] * ekekm1 / qkqkm1);\n        }\n      }\n    }\n    else { /* pass is odd; construct ColScale[pass+1] */\n      for(col = 1; col <= colMax; col++)\n        ColScalem2[col] = FColScale[col];\n      if(qkqkm1 != 0) {\n        for(col = 1; col <= colMax; col++)\n          FColScale[col] *= (1 + ekekm1 / qkqkm1);\n        for(col = 1; col <= colMax; col++)\n          FColScale[col] += (residual_even[col] / ((REAL) ColCount[col] * qkqkm1) -\n                             ColScalem2[col] * ekekm1 / qkqkm1);\n      }\n    }\n\n    /* update residual and sk (pass + 1) */\n    if((Result % 2) == 0) { /* even */\n       /* residual */\n      for(row = 0; row <= lp->rows; row++)\n        residual_odd[row] *= ek;\n\n      for(i = 1; i <= colMax; i++)\n        if(lp->orig_obj[i] != 0)\n          residual_odd[0] += (residual_even[i] / (REAL) ColCount[i]);\n\n      rownr = &(COL_MAT_ROWNR(0));\n      colnr = &(COL_MAT_COLNR(0));\n      for(i = 0; i < nz;\n          i++, rownr += matRowColStep, colnr += matRowColStep) {\n        residual_odd[*rownr] += (residual_even[*colnr] / (REAL) ColCount[*colnr]);\n      }\n      for(row = 0; row <= lp->rows; row++)\n        residual_odd[row] *= (-1 / qk);\n\n      /* sk */\n      skm1 = sk;\n      sk = 0;\n      for(row = 0; row <= lp->rows; row++)\n        sk += (residual_odd[row]*residual_odd[row]) / (REAL) RowCount[row];\n    }\n    else { /* odd */\n      /* residual */\n      for(col = 1; col <= colMax; col++)\n        residual_even[col] *= ek;\n\n      for(i = 1; i <= colMax; i++)\n        if(lp->orig_obj[i] != 0)\n          residual_even[i] += (residual_odd[0] / (REAL) RowCount[0]);\n\n      rownr = &(COL_MAT_ROWNR(0));\n      colnr = &(COL_MAT_COLNR(0));\n      for(i = 0; i < nz;\n          i++, rownr += matRowColStep, colnr += matRowColStep) {\n        residual_even[*colnr] += (residual_odd[*rownr] / (REAL) RowCount[*rownr]);\n      }\n      for(col = 1; col <= colMax; col++)\n        residual_even[col] *= (-1 / qk);\n\n      /* sk */\n      skm1 = sk;\n      sk = 0;\n      for(col = 1; col <= colMax; col++)\n        sk += (residual_even[col]*residual_even[col]) / (REAL) ColCount[col];\n    }\n\n    /* Compute ek and qk */\n    ekm2=ekm1;\n    ekm1=ek;\n    ek=qk * sk / skm1;\n\n    qkm2=qkm1;\n    qkm1=qk;\n    qk=1-ek;\n\n    Result++;\n  }\n\n  /* Synchronize the RowScale and ColScale vectors */\n  ekekm1 = ek * ekm1;\n  if(qkm1 != 0) {\n  if((Result % 2) == 0) { /* pass is even, compute RowScale */\n    for(row = 0; row<=lp->rows; row++)\n      FRowScale[row]*=(1.0 + ekekm1 / qkm1);\n    for(row = 0; row<=lp->rows; row++)\n      FRowScale[row]+=(residual_odd[row] / (qkm1 * (REAL) RowCount[row]) -\n                      RowScalem2[row] * ekekm1 / qkm1);\n  }\n  else { /* pass is odd, compute ColScale */\n    for(col=1; col<=colMax; col++)\n      FColScale[col]*=(1 + ekekm1 / qkm1);\n    for(col=1; col<=colMax; col++)\n      FColScale[col]+=(residual_even[col] / ((REAL) ColCount[col] * qkm1) -\n                       ColScalem2[col] * ekekm1 / qkm1);\n  }\n  }\n\n  /* Do validation, if indicated */\n  if(FALSE && mat_validate(mat)){\n    double check, error;\n\n    /* CHECK: M RowScale + E ColScale = RowSum */\n    error = 0;\n    for(row = 0; row <= lp->rows; row++) {\n      check = (REAL) RowCount[row] * FRowScale[row];\n      if(row == 0) {\n        for(i = 1; i <= colMax; i++) {\n          if(lp->orig_obj[i] != 0)\n            check += FColScale[i];\n        }\n      }\n      else {\n        i = mat->row_end[row-1];\n        ent = mat->row_end[row];\n        for(; i < ent; i++) {\n          col = ROW_MAT_COLNR(i);\n          check += FColScale[col];\n        }\n      }\n      check -= RowSum[row];\n      error += check*check;\n    }\n\n    /* CHECK: E^T RowScale + N ColScale = ColSum */\n    error = 0;\n    for(col = 1; col <= colMax; col++) {\n      check = (REAL) ColCount[col] * FColScale[col];\n\n      if(lp->orig_obj[col] != 0)\n        check += FRowScale[0];\n\n      i = mat->col_end[col-1];\n      ent = mat->col_end[col];\n      rownr = &(COL_MAT_ROWNR(i));\n      for(; i < ent;\n          i++, rownr += matRowColStep) {\n        check += FRowScale[*rownr];\n      }\n      check -= ColSum[col];\n      error += check*check;\n    }\n  }\n\n  /* Convert to scaling factors (rounding to nearest power\n     of 2 can optionally be done as a separate step later) */\n  for(col = 1; col <= colMax; col++) {\n    absvalue = exp(-FColScale[col]);\n    if(absvalue < MIN_SCALAR) absvalue = MIN_SCALAR;\n    if(absvalue > MAX_SCALAR) absvalue = MAX_SCALAR;\n    if(!is_int(lp,col) || is_integerscaling(lp))\n        FColScale[col] = absvalue;\n    else\n        FColScale[col] = 1;\n  }\n  for(row = 0; row <= lp->rows; row++) {\n    absvalue = exp(-FRowScale[row]);\n    if(absvalue < MIN_SCALAR) absvalue = MIN_SCALAR;\n    if(absvalue > MAX_SCALAR) absvalue = MAX_SCALAR;\n    FRowScale[row] = absvalue;\n  }\n\n /* free temporary memory */\n  FREE(RowSum);\n  FREE(ColSum);\n  FREE(RowCount);\n  FREE(ColCount);\n  FREE(residual_even);\n  FREE(residual_odd);\n  FREE(RowScalem2);\n  FREE(ColScalem2);\n\n  return(Result);\n\n}\n\nSTATIC MYBOOL scaleCR(lprec *lp, REAL *scaledelta)\n{\n  REAL *scalechange = NULL;\n  int  Result;\n\n  if(!lp->scaling_used) {\n    allocREAL(lp, &lp->scalars, lp->sum_alloc + 1, FALSE);\n    for(Result = 0; Result <= lp->sum; Result++)\n      lp->scalars[Result] = 1;\n    lp->scaling_used = TRUE;\n  }\n\n  if(scaledelta == NULL)\n    allocREAL(lp, &scalechange, lp->sum + 1, FALSE);\n  else\n    scalechange = scaledelta;\n\n  Result=CurtisReidScales(lp, FALSE, scalechange, &scalechange[lp->rows]);\n  if(Result>0) {\n\n    /* Do the scaling*/\n    if(scale_updaterows(lp, scalechange, TRUE) ||\n       scale_updatecolumns(lp, &scalechange[lp->rows], TRUE))\n      lp->scalemode |= SCALE_CURTISREID;\n\n    set_action(&lp->spx_action, ACTION_REBASE | ACTION_REINVERT | ACTION_RECOMPUTE);\n  }\n\n  if(scaledelta == NULL)\n    FREE(scalechange);\n\n  return((MYBOOL) (Result > 0));\n}\n\nSTATIC MYBOOL transform_for_scale(lprec *lp, REAL *value)\n{\n  MYBOOL Accept = TRUE;\n  *value = fabs(*value);\n#ifdef Paranoia\n  if(*value < lp->epsmachine) {\n    Accept = FALSE;\n    report(lp, SEVERE, \"transform_for_scale: A zero-valued entry was passed\\n\");\n  }\n  else\n#endif\n  if(is_scalemode(lp, SCALE_LOGARITHMIC))\n    *value = log(*value);\n  else if(is_scalemode(lp, SCALE_QUADRATIC))\n    (*value) *= (*value);\n  return( Accept );\n}\n\nSTATIC void accumulate_for_scale(lprec *lp, REAL *min, REAL *max, REAL value)\n{\n  if(transform_for_scale(lp, &value)) {\n    if(is_scaletype(lp, SCALE_MEAN)) {\n      *max += value;\n      *min += 1;\n    }\n    else {\n      SETMAX(*max, value);\n      SETMIN(*min, value);\n    }\n  }\n}\n\nSTATIC REAL minmax_to_scale(lprec *lp, REAL min, REAL max, int itemcount)\n{\n  REAL scale;\n\n  /* Initialize according to transformation / weighting model */\n  if(is_scalemode(lp, SCALE_LOGARITHMIC))\n    scale = 0;\n  else\n    scale = 1;\n  if(itemcount <= 0)\n    return(scale);\n\n  /* Compute base scalar according to chosen scaling type */\n  if(is_scaletype(lp, SCALE_MEAN)) {\n    if(min > 0)\n      scale = max / min;\n  }\n  else if(is_scaletype(lp, SCALE_RANGE))\n    scale = (max + min) / 2;\n  else if(is_scaletype(lp, SCALE_GEOMETRIC))\n    scale = sqrt(min*max);\n  else if(is_scaletype(lp, SCALE_EXTREME))\n    scale = max;\n\n  /* Compute final scalar according to transformation / weighting model */\n  if(is_scalemode(lp, SCALE_LOGARITHMIC))\n    scale = exp(-scale);\n  else if(is_scalemode(lp, SCALE_QUADRATIC)) {\n    if(scale == 0)\n      scale = 1;\n    else\n      scale = 1 / sqrt(scale);\n  }\n  else {\n    if(scale == 0)\n      scale = 1;\n    else\n      scale = 1 / scale;\n  }\n\n  /* Make sure we are within acceptable scaling ranges */\n  SETMAX(scale, MIN_SCALAR);\n  SETMIN(scale, MAX_SCALAR);\n\n  return(scale);\n}\n\nSTATIC REAL roundPower2(REAL scale)\n/* Purpose is to round a number to it nearest power of 2; in a system\n   with binary number representation, this avoids rounding errors when\n   scale is used to normalize another value */\n{\n  long int power2;\n  MYBOOL   isSmall = FALSE;\n\n  if(scale == 1)\n    return( scale );\n\n  /* Obtain the fractional power of 2 */\n  if(scale < 2) {\n    scale = 2 / scale;\n    isSmall = TRUE;\n  }\n  else\n    scale /= 2;\n  scale = log(scale)/log(2.0);\n\n  /* Find the desired nearest power of two and compute the associated scalar */\n  power2 = (long) ceil(scale-0.5);\n  scale = 1 << power2;\n  if(isSmall)\n    scale = 1.0 / scale;\n\n  return( scale );\n\n}\n\nSTATIC MYBOOL scale_updatecolumns(lprec *lp, REAL *scalechange, MYBOOL updateonly)\n{\n  int i, j;\n\n  /* Verify that the scale change is significant (different from the unit) */\n  for(i = lp->columns; i > 0; i--)\n    if(fabs(scalechange[i]-1) > lp->epsprimal)\n      break;\n  if(i <= 0)\n    return( FALSE );\n\n /* Update the pre-existing column scalar */\n  if(updateonly)\n    for(i = 1, j = lp->rows + 1; j <= lp->sum; i++, j++)\n      lp->scalars[j] *= scalechange[i];\n  else\n    for(i = 1, j = lp->rows + 1; j <= lp->sum; i++, j++)\n      lp->scalars[j] = scalechange[i];\n\n  return( TRUE );\n}\n\nSTATIC MYBOOL scale_updaterows(lprec *lp, REAL *scalechange, MYBOOL updateonly)\n{\n  int i;\n\n  /* Verify that the scale change is significant (different from the unit) */\n  for(i = lp->rows; i >= 0; i--) {\n    if(fabs(scalechange[i]-1) > lp->epsprimal)\n      break;\n  }\n  if(i < 0)\n    return( FALSE );\n\n /* Update the pre-existing row scalar */\n  if(updateonly)\n    for(i = 0; i <= lp->rows; i++)\n      lp->scalars[i] *= scalechange[i];\n  else\n    for(i = 0; i <= lp->rows; i++)\n      lp->scalars[i] = scalechange[i];\n\n  return( TRUE );\n}\n\nSTATIC MYBOOL scale_columns(lprec *lp, REAL *scaledelta)\n{\n  int     i,j, colMax, nz;\n  REAL    *scalechange;\n  REAL    *value;\n  int     *colnr;\n  MATrec  *mat = lp->matA;\n\n  /* Check that columns are in fact targeted */\n  if((lp->scalemode & SCALE_ROWSONLY) != 0)\n    return( TRUE );\n\n  if(scaledelta == NULL)\n    scalechange = &lp->scalars[lp->rows];\n  else\n    scalechange = &scaledelta[lp->rows];\n\n  colMax = lp->columns;\n\n  /* Scale matrix entries (including any Lagrangean constraints) */\n  for(i = 1; i <= lp->columns; i++) {\n    lp->orig_obj[i] *= scalechange[i];\n  }\n\n  mat_validate(lp->matA);\n  nz = get_nonzeros(lp);\n  value = &(COL_MAT_VALUE(0));\n  colnr = &(COL_MAT_COLNR(0));\n  for(i = 0; i < nz;\n      i++, value += matValueStep, colnr += matRowColStep) {\n    (*value) *= scalechange[*colnr];\n  }\n\n  /* Scale variable bounds as well */\n  for(i = 1, j = lp->rows + 1; j <= lp->sum; i++, j++) {\n    if(lp->orig_lowbo[j] > -lp->infinite)\n      lp->orig_lowbo[j] /= scalechange[i];\n    if(lp->orig_upbo[j] < lp->infinite)\n      lp->orig_upbo[j] /= scalechange[i];\n    if(lp->sc_lobound[i] != 0)\n      lp->sc_lobound[i] /= scalechange[i];\n  }\n\n  lp->columns_scaled = TRUE;\n  set_action(&lp->spx_action, ACTION_REBASE | ACTION_REINVERT | ACTION_RECOMPUTE);\n\n  return( TRUE );\n}\n\nSTATIC MYBOOL scale_rows(lprec *lp, REAL *scaledelta)\n{\n  int     i, j, nz, colMax;\n  REAL    *scalechange;\n  REAL    *value;\n  int     *rownr;\n  MATrec  *mat = lp->matA;\n\n\n  /* Check that rows are in fact targeted */\n  if((lp->scalemode & SCALE_COLSONLY) != 0)\n    return( TRUE );\n\n  if(scaledelta == NULL)\n    scalechange = lp->scalars;\n  else\n    scalechange = scaledelta;\n\n  colMax = lp->columns;\n\n  /* First row-scale the matrix (including the objective function) */\n  for(i = 1; i <= colMax; i++) {\n    lp->orig_obj[i] *= scalechange[0];\n  }\n\n  nz = get_nonzeros(lp);\n  value = &(COL_MAT_VALUE(0));\n  rownr = &(COL_MAT_ROWNR(0));\n  for(i = 0; i < nz;\n      i++, value += matValueStep, rownr += matRowColStep) {\n    (*value) *= scalechange[*rownr];\n  }\n\n  /* ...and scale the rhs and the row bounds (RANGES in MPS!!) */\n  for(i = 0; i <= lp->rows; i++) {\n    if(fabs(lp->orig_rhs[i]) < lp->infinite)\n      lp->orig_rhs[i] *= scalechange[i];\n\n    j = lp->presolve_undo->var_to_orig[i];\n    if(j != 0)\n      lp->presolve_undo->fixed_rhs[j] *= scalechange[i];\n\n    if(lp->orig_upbo[i] < lp->infinite)     /* This is the range */\n      lp->orig_upbo[i] *= scalechange[i];\n\n    if((lp->orig_lowbo[i] != 0) && (fabs(lp->orig_lowbo[i]) < lp->infinite))\n      lp->orig_lowbo[i] *= scalechange[i];\n  }\n\n  set_action(&lp->spx_action, ACTION_REBASE | ACTION_REINVERT | ACTION_RECOMPUTE);\n\n  return( TRUE );\n}\n\nSTATIC REAL scale(lprec *lp, REAL *scaledelta)\n{\n  int     i, j, nz, row_count, nzOF = 0;\n  REAL    *row_max, *row_min, *scalechange = NULL, absval;\n  REAL    col_max, col_min;\n  MYBOOL  rowscaled, colscaled;\n  MATrec  *mat = lp->matA;\n  REAL    *value;\n  int     *rownr;\n\n  if(is_scaletype(lp, SCALE_NONE))\n    return(0.0);\n\n  if(!lp->scaling_used) {\n    allocREAL(lp, &lp->scalars, lp->sum_alloc + 1, FALSE);\n    for(i = 0; i <= lp->sum; i++) {\n      lp->scalars[i] = 1;\n    }\n    lp->scaling_used = TRUE;\n  }\n#ifdef Paranoia\n  else\n    for(i = 0; i <= lp->sum; i++) {\n      if(lp->scalars[i] == 0)\n        report(lp, SEVERE, \"scale: Zero-valued scalar found at index %d\\n\", i);\n    }\n#endif\n  if(scaledelta == NULL)\n    allocREAL(lp, &scalechange, lp->sum + 1, FALSE);\n  else\n    scalechange = scaledelta;\n\n /* Must initialize due to computation of scaling statistic - KE */\n  for(i = 0; i <= lp->sum; i++)\n    scalechange[i] = 1;\n\n  row_count = lp->rows;\n  allocREAL(lp, &row_max, row_count + 1, TRUE);\n  allocREAL(lp, &row_min, row_count + 1, FALSE);\n\n  /* Initialise min and max values of rows */\n  for(i = 0; i <= row_count; i++) {\n    if(is_scaletype(lp, SCALE_MEAN))\n      row_min[i] = 0;             /* Carries the count of elements */\n    else\n      row_min[i] = lp->infinite;  /* Carries the minimum element */\n  }\n\n  /* Calculate row scaling data */\n  for(j = 1; j <= lp->columns; j++) {\n\n    absval = lp->orig_obj[j];\n    if(absval != 0) {\n      absval = scaled_mat(lp, absval, 0, j);\n      accumulate_for_scale(lp, &row_min[0], &row_max[0], absval);\n      nzOF++;\n    }\n\n    i = mat->col_end[j - 1];\n    value = &(COL_MAT_VALUE(i));\n    rownr = &(COL_MAT_ROWNR(i));\n    nz = mat->col_end[j];\n    for(; i < nz;\n        i++, value += matValueStep, rownr += matRowColStep) {\n      absval = scaled_mat(lp, *value, *rownr, j);\n      accumulate_for_scale(lp, &row_min[*rownr], &row_max[*rownr], absval);\n    }\n  }\n\n  /* Calculate scale factors for rows */\n  i = 0;\n  for(; i <= lp->rows; i++) {\n    if(i == 0)\n      nz = nzOF;\n    else\n      nz = mat_rowlength(lp->matA, i);\n    absval = minmax_to_scale(lp, row_min[i], row_max[i], nz); /* nz instead of nzOF KJEI 20/05/2010 */\n    if(absval == 0)\n      absval = 1;\n    scalechange[i] = absval;\n  }\n\n  FREE(row_max);\n  FREE(row_min);\n\n  /* Row-scale the matrix (including the objective function and Lagrangean constraints) */\n  rowscaled = scale_updaterows(lp, scalechange, TRUE);\n\n  /* Calculate column scales */\n  i = 1;\n  for(j = 1; j <= lp->columns; j++) {\n    if(is_int(lp,j) && !is_integerscaling(lp)) { /* do not scale integer columns */\n      scalechange[lp->rows + j] = 1;\n    }\n    else {\n      col_max = 0;\n      if(is_scaletype(lp, SCALE_MEAN))\n        col_min = 0;\n      else\n        col_min = lp->infinite;\n\n      absval = lp->orig_obj[j];\n      if(absval != 0) {\n        absval = scaled_mat(lp, absval, 0, j);\n        accumulate_for_scale(lp, &col_min, &col_max, absval);\n      }\n\n      i = mat->col_end[j - 1];\n      value = &(COL_MAT_VALUE(i));\n      rownr = &(COL_MAT_ROWNR(i));\n      nz = mat->col_end[j];\n      for(; i < nz;\n          i++, value += matValueStep, rownr += matRowColStep) {\n        absval = scaled_mat(lp, *value, *rownr, j);\n        accumulate_for_scale(lp, &col_min, &col_max, absval);\n      }\n      nz = mat_collength(lp->matA, j);\n      if(fabs(lp->orig_obj[j]) > 0)\n        nz++;\n      scalechange[lp->rows + j] = minmax_to_scale(lp, col_min, col_max, nz);\n    }\n  }\n\n  /* ... and then column-scale the already row-scaled matrix */\n  colscaled = scale_updatecolumns(lp, &scalechange[lp->rows], TRUE);\n\n  /* Create a geometric mean-type measure of the extent of scaling performed; */\n  /* ideally, upon successive calls to scale() the value should converge to 0 */\n  if(rowscaled || colscaled) {\n    col_max = 0;\n    for(j = 1; j <= lp->columns; j++)\n      col_max += log(scalechange[lp->rows + j]);\n    col_max = exp(col_max/lp->columns);\n\n    i = 0;\n    col_min = 0;\n    for(; i <= lp->rows; i++)\n      col_min += log(scalechange[i]);\n    col_min = exp(col_min/row_count);\n  }\n  else {\n    col_max = 1;\n    col_min = 1;\n  }\n\n  if(scaledelta == NULL)\n    FREE(scalechange);\n\n  return(1 - sqrt(col_max*col_min));\n}\n\nSTATIC MYBOOL finalize_scaling(lprec *lp, REAL *scaledelta)\n{\n  int i;\n\n  /* Check if we should equilibrate */\n  if(is_scalemode(lp, SCALE_EQUILIBRATE) && !is_scaletype(lp, SCALE_CURTISREID)) {\n    int oldmode;\n\n    oldmode = lp->scalemode;\n    lp->scalemode = SCALE_LINEAR + SCALE_EXTREME;\n    scale(lp, scaledelta);\n    lp->scalemode = oldmode;\n  }\n\n  /* Check if we should prevent rounding errors */\n  if(is_scalemode(lp, SCALE_POWER2)) {\n    REAL *scalars;\n    if(scaledelta == NULL)\n      scalars = lp->scalars;\n    else\n      scalars = scaledelta;\n\n    for(i = 0; i <= lp->sum; i++)\n      scalars[i] = roundPower2(scalars[i]);\n  }\n\n  /* Then transfer the scalars to the model's data */\n  return( scale_rows(lp, scaledelta) && scale_columns(lp, scaledelta) );\n\n}\n\nSTATIC REAL auto_scale(lprec *lp)\n{\n  int    n = 1;\n  REAL   scalingmetric = 0, *scalenew = NULL;\n\n  if(lp->scaling_used &&\n     ((((lp->scalemode & SCALE_DYNUPDATE) == 0)) || (lp->bb_level > 0)))\n    return( scalingmetric);\n\n  if(lp->scalemode != SCALE_NONE) {\n\n    /* Allocate array for incremental scaling if appropriate */\n    if((lp->solvecount > 1) && (lp->bb_level < 1) &&\n       ((lp->scalemode & SCALE_DYNUPDATE) != 0))\n      allocREAL(lp, &scalenew, lp->sum + 1, FALSE);\n\n    if(is_scaletype(lp, SCALE_CURTISREID)) {\n      scalingmetric = scaleCR(lp, scalenew);\n    }\n    else {\n      REAL scalinglimit, scalingdelta;\n      int  count;\n\n      /* Integer value of scalelimit holds the maximum number of iterations; default to 1 */\n      count = (int) floor(lp->scalelimit);\n      scalinglimit = lp->scalelimit;\n      if((count == 0) || (scalinglimit == 0)) {\n        if(scalinglimit > 0)\n          count = DEF_SCALINGLIMIT;  /* A non-zero convergence has been given, default to max 5 iterations */\n        else\n          count = 1;\n      }\n      else\n        scalinglimit -= count;\n\n      /* Scale to desired relative convergence or iteration limit */\n      n = 0;\n      scalingdelta = 1.0;\n      scalingmetric = 1.0;\n      while((n < count) && (fabs(scalingdelta) > scalinglimit)) {\n        n++;\n        scalingdelta = scale(lp, scalenew);\n        scalingmetric = scalingmetric*(1+scalingdelta);\n      }\n      scalingmetric -= 1;\n    }\n  }\n\n  /* Update the inf norm of the elements of the matrix (excluding the OF) */\n  mat_computemax(lp->matA);\n\n  /* Check if we really have to do scaling */\n  if(lp->scaling_used && (fabs(scalingmetric) >= lp->epsprimal))\n    /* Ok, do it */\n    finalize_scaling(lp, scalenew);\n\n  else {\n\n    /* Otherwise reset scaling variables */\n    if(lp->scalars != NULL) {\n      FREE(lp->scalars);\n    }\n    lp->scaling_used = FALSE;\n    lp->columns_scaled = FALSE;\n  }\n  if(scalenew != NULL)\n    FREE(scalenew);\n\n  return(scalingmetric);\n}\n\nSTATIC void unscale_columns(lprec *lp)\n{\n  int     i, j, nz;\n  MATrec  *mat = lp->matA;\n  REAL    *value;\n  int     *rownr, *colnr;\n\n  if(!lp->columns_scaled)\n    return;\n\n  /* Unscale OF */\n  for(j = 1; j <= lp->columns; j++) {\n    lp->orig_obj[j] = unscaled_mat(lp, lp->orig_obj[j], 0, j);\n  }\n\n  /* Unscale mat */\n  mat_validate(mat);\n  nz = get_nonzeros(lp);\n  value = &(COL_MAT_VALUE(0));\n  rownr = &(COL_MAT_ROWNR(0));\n  colnr = &(COL_MAT_COLNR(0));\n  for(j = 0; j < nz;\n      j++, value += matValueStep, rownr += matRowColStep, colnr += matRowColStep) {\n    *value = unscaled_mat(lp, *value, *rownr, *colnr);\n  }\n\n  /* Unscale bounds as well */\n  for(i = lp->rows + 1, j = 1; i <= lp->sum; i++, j++) {\n    lp->orig_lowbo[i] = unscaled_value(lp, lp->orig_lowbo[i], i);\n    lp->orig_upbo[i]  = unscaled_value(lp, lp->orig_upbo[i], i);\n    lp->sc_lobound[j]  = unscaled_value(lp, lp->sc_lobound[j], i);\n  }\n\n  for(i = lp->rows + 1; i<= lp->sum; i++)\n    lp->scalars[i] = 1;\n\n  lp->columns_scaled = FALSE;\n  set_action(&lp->spx_action, ACTION_REBASE | ACTION_REINVERT | ACTION_RECOMPUTE);\n}\n\nvoid undoscale(lprec *lp)\n{\n  int     i, j, nz;\n  MATrec  *mat = lp->matA;\n  REAL    *value;\n  int     *rownr, *colnr;\n\n  if(lp->scaling_used) {\n\n    /* Unscale the OF */\n    for(j = 1; j <= lp->columns; j++) {\n      lp->orig_obj[j] = unscaled_mat(lp, lp->orig_obj[j], 0, j);\n    }\n\n    /* Unscale the matrix */\n    mat_validate(mat);\n    nz = get_nonzeros(lp);\n    value = &(COL_MAT_VALUE(0));\n    rownr = &(COL_MAT_ROWNR(0));\n    colnr = &(COL_MAT_COLNR(0));\n    for(j = 0; j < nz;\n        j++, value += matValueStep, rownr += matRowColStep, colnr += matRowColStep) {\n      *value = unscaled_mat(lp, *value, *rownr, *colnr);\n    }\n\n    /* Unscale variable bounds */\n    for(i = lp->rows + 1, j = 1; i <= lp->sum; i++, j++) {\n      lp->orig_lowbo[i] = unscaled_value(lp, lp->orig_lowbo[i], i);\n      lp->orig_upbo[i]  = unscaled_value(lp, lp->orig_upbo[i], i);\n      lp->sc_lobound[j]  = unscaled_value(lp, lp->sc_lobound[j], i);\n    }\n\n    /* Unscale the rhs, upper and lower bounds... */\n    for(i = 0; i <= lp->rows; i++) {\n      lp->orig_rhs[i] = unscaled_value(lp, lp->orig_rhs[i], i);\n      j = lp->presolve_undo->var_to_orig[i];\n      if(j != 0)\n        lp->presolve_undo->fixed_rhs[j] = unscaled_value(lp, lp->presolve_undo->fixed_rhs[j], i);\n      lp->orig_lowbo[i] = unscaled_value(lp, lp->orig_lowbo[i], i);\n      lp->orig_upbo[i] = unscaled_value(lp, lp->orig_upbo[i], i);\n    }\n\n    FREE(lp->scalars);\n    lp->scaling_used = FALSE;\n    lp->columns_scaled = FALSE;\n\n    set_action(&lp->spx_action, ACTION_REBASE | ACTION_REINVERT | ACTION_RECOMPUTE);\n  }\n}\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_scale.h",
    "content": "#ifndef HEADER_lp_scale\n#define HEADER_lp_scale\n\n#include \"lp_types.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* Put function headers here */\nSTATIC MYBOOL scale_updatecolumns(lprec *lp, REAL *scalechange, MYBOOL updateonly);\nSTATIC MYBOOL scale_updaterows(lprec *lp, REAL *scalechange, MYBOOL updateonly);\nSTATIC MYBOOL scale_rows(lprec *lp, REAL *scaledelta);\nSTATIC MYBOOL scale_columns(lprec *lp, REAL *scaledelta);\nSTATIC void unscale_columns(lprec *lp);\nSTATIC REAL scale(lprec *lp, REAL *scaledelta);\nSTATIC REAL scaled_mat(lprec *lp, REAL value, int rownr, int colnr);\nSTATIC REAL unscaled_mat(lprec *lp, REAL value, int rownr, int colnr);\nSTATIC REAL scaled_value(lprec *lp, REAL value, int index);\nSTATIC REAL unscaled_value(lprec *lp, REAL value, int index);\nSTATIC MYBOOL scaleCR(lprec *lp, REAL *scaledelta);\nSTATIC MYBOOL finalize_scaling(lprec *lp, REAL *scaledelta);\nSTATIC REAL auto_scale(lprec *lp);\nvoid undoscale(lprec *lp);\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* HEADER_lp_scale */\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_simplex.c",
    "content": "\n/*\n    Core optimization drivers for lp_solve v5.0+\n   ----------------------------------------------------------------------------------\n    Author:        Michel Berkelaar (to lp_solve v3.2),\n                   Kjell Eikland    (v4.0 and forward)\n    Contact:\n    License terms: LGPL.\n\n    Requires:      lp_lib.h, lp_simplex.h, lp_presolve.h, lp_pricerPSE.h\n\n    Release notes:\n    v5.0.0  1 January 2004      New unit applying stacked basis and bounds storage.\n    v5.0.1 31 January 2004      Moved B&B routines to separate file and implemented\n                                a new runsolver() general purpose call method.\n    v5.0.2  1 May 2004          Changed routine names to be more intuitive.\n    v5.1.0  10 January 2005     Created modular stalling/cycling functions.\n                                Rewrote dualloop() to optimize long dual and\n                                also streamlined primloop() correspondingly.\n    v5.2.0  20 March 2005       Reimplemented primal phase 1 logic.\n                                Made multiple pricing finally work (primal simplex).\n\n   ----------------------------------------------------------------------------------\n*/\n\n#include <string.h>\n#include \"commonlib.h\"\n#include \"lp_lib.h\"\n#include \"lp_BFP.h\"\n#include \"lp_simplex.h\"\n#include \"lp_crash.h\"\n#include \"lp_presolve.h\"\n#include \"lp_price.h\"\n#include \"lp_pricePSE.h\"\n#include \"lp_report.h\"\n\n#ifdef FORTIFY\n# include \"lp_fortify.h\"\n#endif\n\n\nSTATIC void stallMonitor_update(lprec *lp, REAL newOF)\n{\n  int newpos;\n  OBJmonrec *monitor = lp->monitor;\n\n  if(monitor->countstep < OBJ_STEPS)\n    monitor->countstep++;\n  else\n    monitor->startstep = mod(monitor->startstep + 1, OBJ_STEPS);\n  newpos = mod(monitor->startstep + monitor->countstep - 1, OBJ_STEPS);\n  monitor->objstep[newpos] = newOF;\n  monitor->idxstep[newpos] = monitor->Icount;\n  monitor->currentstep = newpos;\n}\n\nSTATIC MYBOOL stallMonitor_creepingObj(lprec *lp)\n{\n  OBJmonrec *monitor = lp->monitor;\n\n  if(monitor->countstep > 1) {\n    REAL deltaOF = (monitor->objstep[monitor->currentstep] -\n                    monitor->objstep[monitor->startstep]) / monitor->countstep;\n    deltaOF /= MAX(1, (monitor->idxstep[monitor->currentstep] -\n                       monitor->idxstep[monitor->startstep]));\n    deltaOF = my_chsign(monitor->isdual, deltaOF);\n    return( (MYBOOL) (deltaOF < monitor->epsvalue) );\n  }\n  else\n    return( FALSE );\n}\n\nSTATIC MYBOOL stallMonitor_shortSteps(lprec *lp)\n{\n  OBJmonrec *monitor = lp->monitor;\n\n  if(monitor->countstep == OBJ_STEPS) {\n    REAL deltaOF = MAX(1, (monitor->idxstep[monitor->currentstep] -\n                           monitor->idxstep[monitor->startstep])) / monitor->countstep;\n    deltaOF = pow(deltaOF*OBJ_STEPS, 0.66);\n    return( (MYBOOL) (deltaOF > monitor->limitstall[TRUE]) );\n  }\n  else\n    return( FALSE );\n}\n\nSTATIC void stallMonitor_reset(lprec *lp)\n{\n  OBJmonrec *monitor = lp->monitor;\n\n  monitor->ruleswitches = 0;\n  monitor->Ncycle = 0;\n  monitor->Mcycle = 0;\n  monitor->Icount = 0;\n  monitor->startstep = 0;\n  monitor->objstep[monitor->startstep] = lp->infinite;\n  monitor->idxstep[monitor->startstep] = monitor->Icount;\n  monitor->prevobj = 0;\n  monitor->countstep = 1;\n}\n\nSTATIC MYBOOL stallMonitor_create(lprec *lp, MYBOOL isdual, char *funcname)\n{\n  OBJmonrec *monitor = NULL;\n  if(lp->monitor != NULL)\n    return( FALSE );\n\n  monitor = (OBJmonrec *) calloc(sizeof(*monitor), 1);\n  if(monitor == NULL)\n    return( FALSE );\n\n  monitor->lp = lp;\n  strcpy(monitor->spxfunc, funcname);\n  monitor->isdual = isdual;\n  monitor->pivdynamic = is_piv_mode(lp, PRICE_ADAPTIVE);\n  monitor->oldpivstrategy = lp->piv_strategy;\n  monitor->oldpivrule = get_piv_rule(lp);\n  if(MAX_STALLCOUNT <= 1)\n    monitor->limitstall[FALSE] = 0;\n  else\n    monitor->limitstall[FALSE] = MAX(MAX_STALLCOUNT,\n                                     (int) pow((REAL) (lp->rows+lp->columns)/2, 0.667));\n#if 1\n  monitor->limitstall[FALSE] *= 2+2;  /* Expand degeneracy/stalling tolerance range */\n#endif\n  monitor->limitstall[TRUE] = monitor->limitstall[FALSE];\n  if(monitor->oldpivrule == PRICER_DEVEX) /* Increase tolerance since primal Steepest Edge is expensive */\n    monitor->limitstall[TRUE] *= 2;\n  if(MAX_RULESWITCH <= 0)\n    monitor->limitruleswitches = MAXINT32;\n  else\n    monitor->limitruleswitches = MAX(MAX_RULESWITCH,\n                                     lp->rows/MAX_RULESWITCH);\n  monitor->epsvalue = lp->epsprimal; /* lp->epsvalue; */\n  lp->monitor = monitor;\n  stallMonitor_reset(lp);\n  lp->suminfeas = lp->infinite;\n  return( TRUE );\n}\n\nSTATIC MYBOOL stallMonitor_check(lprec *lp, int rownr, int colnr, int lastnr,\n                                 MYBOOL minit, MYBOOL approved, MYBOOL *forceoutEQ)\n{\n  OBJmonrec *monitor = lp->monitor;\n  MYBOOL    isStalled, isCreeping, acceptance = TRUE;\n  int       altrule,\n#ifdef Paranoia\n         msglevel = NORMAL;\n#else\n         msglevel = DETAILED;\n#endif\n  REAL   deltaobj = lp->suminfeas;\n\n  /* Accept unconditionally if this is the first or second call */\n  monitor->active = FALSE;\n  if(monitor->Icount <= 1) {\n    if(monitor->Icount == 1) {\n      monitor->prevobj = lp->rhs[0];\n      monitor->previnfeas = deltaobj;\n    }\n    monitor->Icount++;\n    return( acceptance );\n  }\n\n  /* Define progress as primal objective less sum of (primal/dual) infeasibilities */\n  monitor->thisobj = lp->rhs[0];\n  monitor->thisinfeas = deltaobj;\n  if(lp->spx_trace &&\n     (lastnr > 0))\n    report(lp, NORMAL, \"%s: Objective at iter %10.0f is \" RESULTVALUEMASK \" (%4d: %4d %s- %4d)\\n\",\n                       monitor->spxfunc,\n                       (double) get_total_iter(lp), monitor->thisobj, rownr, lastnr,\n                       my_if(minit == ITERATE_MAJORMAJOR, \"<\",\"|\"), colnr);\n  monitor->pivrule = get_piv_rule(lp);\n\n  /* Check if we have a stationary solution at selected tolerance level;\n     allow some difference in case we just refactorized the basis. */\n  deltaobj = my_reldiff(monitor->thisobj, monitor->prevobj);\n  deltaobj = fabs(deltaobj); /* Pre v5.2 version */\n  isStalled = (MYBOOL) (deltaobj < monitor->epsvalue);\n\n  /* Also require that we have a measure of infeasibility-stalling */\n  if(isStalled) {\n    REAL testvalue, refvalue = monitor->epsvalue;\n#if 1\n    if(monitor->isdual)\n      refvalue *= 1000*log10(9.0+lp->rows);\n    else\n      refvalue *= 1000*log10(9.0+lp->columns);\n#else\n      refvalue *= 1000*log10(9.0+lp->sum);\n#endif\n    testvalue = my_reldiff(monitor->thisinfeas, monitor->previnfeas);\n    isStalled &= (fabs(testvalue) < refvalue);\n\n    /* Check if we should force \"major\" pivoting, i.e. no bound flips;\n      this is activated when we see the feasibility deteriorate */\n/*    if(!isStalled && (testvalue > 0) && (TRUE || is_action(lp->anti_degen, ANTIDEGEN_BOUNDFLIP))) */\n#if !defined _PRICE_NOBOUNDFLIP\n    if(!isStalled && (testvalue > 0) && is_action(lp->anti_degen, ANTIDEGEN_BOUNDFLIP))\n      acceptance = AUTOMATIC;\n  }\n#else\n    if(!isStalled && (testvalue > 0) && !ISMASKSET(lp->piv_strategy, PRICE_NOBOUNDFLIP)) {\n      SETMASK(lp->piv_strategy, PRICE_NOBOUNDFLIP);\n      acceptance = AUTOMATIC;\n    }\n  }\n  else\n    CLEARMASK(lp->piv_strategy, PRICE_NOBOUNDFLIP);\n#endif\n\n#if 1\n  isCreeping = FALSE;\n#else\n  isCreeping |= stallMonitor_creepingObj(lp);\n/*  isCreeping |= stallMonitor_shortSteps(lp); */\n#endif\n  if(isStalled || isCreeping) {\n\n    /* Update counters along with specific tolerance for bound flips */\n#if 1\n    if(minit != ITERATE_MAJORMAJOR) {\n      if(++monitor->Mcycle > 2) {\n        monitor->Mcycle = 0;\n        monitor->Ncycle++;\n      }\n    }\n    else\n#endif\n      monitor->Ncycle++;\n\n    /* Start to monitor for variable cycling if this is the initial stationarity */\n    if(monitor->Ncycle <= 1) {\n      monitor->Ccycle = colnr;\n      monitor->Rcycle = rownr;\n    }\n\n    /* Check if we should change pivoting strategy */\n    else if(isCreeping ||                                                 /* We have OF creep */\n            (monitor->Ncycle > monitor->limitstall[monitor->isdual]) ||   /* KE empirical value */\n            ((monitor->Ccycle == rownr) && (monitor->Rcycle == colnr))) {   /* Obvious cycling */\n\n      monitor->active = TRUE;\n\n      /* Try to force out equality slacks to combat degeneracy */\n      if((lp->fixedvars > 0) && (*forceoutEQ != TRUE)) {\n        *forceoutEQ = TRUE;\n        goto Proceed;\n      }\n\n      /* Our options are now to select an alternative rule or to do bound perturbation;\n         check if these options are available to us or if we must signal failure and break out. */\n      approved &= monitor->pivdynamic && (monitor->ruleswitches < monitor->limitruleswitches);\n      if(!approved && !is_anti_degen(lp, ANTIDEGEN_STALLING)) {\n        lp->spx_status = DEGENERATE;\n        report(lp, msglevel, \"%s: Stalling at iter %10.0f; no alternative strategy left.\\n\",\n                             monitor->spxfunc, (double) get_total_iter(lp));\n        acceptance = FALSE;\n        return( acceptance );\n      }\n\n      /* See if we can do the appropriate alternative rule. */\n      switch (monitor->oldpivrule) {\n        case PRICER_FIRSTINDEX:    altrule = PRICER_DEVEX;\n                                   break;\n        case PRICER_DANTZIG:       altrule = PRICER_DEVEX;\n                                   break;\n        case PRICER_DEVEX:         altrule = PRICER_STEEPESTEDGE;\n                                   break;\n        case PRICER_STEEPESTEDGE:  altrule = PRICER_DEVEX;\n                                   break;\n        default:                   altrule = PRICER_FIRSTINDEX;\n      }\n      if(approved &&\n         (monitor->pivrule != altrule) && (monitor->pivrule == monitor->oldpivrule)) {\n\n        /* Switch rule to combat degeneracy. */\n        monitor->ruleswitches++;\n        lp->piv_strategy = altrule;\n        monitor->Ccycle = 0;\n        monitor->Rcycle = 0;\n        monitor->Ncycle = 0;\n        monitor->Mcycle = 0;\n        report(lp, msglevel, \"%s: Stalling at iter %10.0f; changed to '%s' rule.\\n\",\n                             monitor->spxfunc, (double) get_total_iter(lp),\n                             get_str_piv_rule(get_piv_rule(lp)));\n        if((altrule == PRICER_DEVEX) || (altrule == PRICER_STEEPESTEDGE))\n          restartPricer(lp, AUTOMATIC);\n      }\n\n      /* If not, code for bound relaxation/perturbation */\n      else {\n        report(lp, msglevel, \"%s: Stalling at iter %10.0f; proceed to bound relaxation.\\n\",\n                             monitor->spxfunc, (double) get_total_iter(lp));\n        acceptance = FALSE;\n        lp->spx_status = DEGENERATE;\n        return( acceptance );\n      }\n    }\n  }\n\n  /* Otherwise change back to original selection strategy as soon as possible */\n  else {\n    if(monitor->pivrule != monitor->oldpivrule) {\n      lp->piv_strategy = monitor->oldpivstrategy;\n      altrule = monitor->oldpivrule;\n      if((altrule == PRICER_DEVEX) || (altrule == PRICER_STEEPESTEDGE))\n        restartPricer(lp, AUTOMATIC);\n      report(lp, msglevel, \"...returned to original pivot selection rule at iter %.0f.\\n\",\n                           (double) get_total_iter(lp));\n    }\n    stallMonitor_update(lp, monitor->thisobj);\n    monitor->Ccycle = 0;\n    monitor->Rcycle = 0;\n    monitor->Ncycle = 0;\n    monitor->Mcycle = 0;\n  }\n\n  /* Update objective progress tracker */\nProceed:\n  monitor->Icount++;\n  if(deltaobj >= monitor->epsvalue)\n    monitor->prevobj = monitor->thisobj;\n  monitor->previnfeas = monitor->thisinfeas;\n\n  return( acceptance );\n}\n\nSTATIC void stallMonitor_finish(lprec *lp)\n{\n  OBJmonrec *monitor = lp->monitor;\n  if(monitor == NULL)\n    return;\n  if(lp->piv_strategy != monitor->oldpivstrategy)\n    lp->piv_strategy = monitor->oldpivstrategy;\n  FREE(monitor);\n  lp->monitor = NULL;\n}\n\n\nSTATIC MYBOOL add_artificial(lprec *lp, int forrownr, REAL *nzarray, int *idxarray)\n/* This routine is called for each constraint at the start of\n   primloop and the primal problem is infeasible. Its\n   purpose is to add artificial variables and associated\n   objective function values to populate primal phase 1. */\n{\n  MYBOOL add;\n\n  /* Make sure we don't add unnecessary artificials, i.e. avoid\n     cases where the slack variable is enough */\n  add = !isBasisVarFeasible(lp, lp->epspivot, forrownr);\n\n  if(add) {\n    int    *rownr = NULL, i, bvar, ii;\n    REAL   *avalue = NULL, rhscoef, acoef;\n    MATrec *mat = lp->matA;\n\n    /* Check the simple case where a slack is basic */\n    for(i = 1; i <= lp->rows; i++) {\n      if(lp->var_basic[i] == forrownr)\n        break;\n    }\n    acoef = 1;\n\n    /* If not, look for any basic user variable that has a\n       non-zero coefficient in the current constraint row */\n    if(i > lp->rows) {\n      for(i = 1; i <= lp->rows; i++) {\n        ii = lp->var_basic[i] - lp->rows;\n        if((ii <= 0) || (ii > (lp->columns-lp->P1extraDim)))\n          continue;\n        ii = mat_findelm(mat, forrownr, ii);\n        if(ii >= 0) {\n          acoef = COL_MAT_VALUE(ii);\n          break;\n        }\n      }\n    }\n\n    /* If no candidate was found above, gamble on using the densest column available */\n#if 0\n    if(i > lp->rows) {\n      int len = 0;\n      bvar = 0;\n      for(i = 1; i <= lp->rows; i++) {\n        ii = lp->var_basic[i] - lp->rows;\n        if((ii <= 0) || (ii > (lp->columns-lp->P1extraDim)))\n          continue;\n        if(mat_collength(mat, ii) > len) {\n          len = mat_collength(mat, ii);\n          bvar = i;\n        }\n      }\n      i = bvar;\n      acoef = 1;\n    }\n#endif\n\n    bvar = i;\n\n    add = (MYBOOL) (bvar <= lp->rows);\n    if(add) {\n      rhscoef = lp->rhs[forrownr];\n\n     /* Create temporary sparse array storage */\n      if(nzarray == NULL)\n        allocREAL(lp, &avalue, 2, FALSE);\n      else\n        avalue = nzarray;\n      if(idxarray == NULL)\n        allocINT(lp, &rownr, 2, FALSE);\n      else\n        rownr = idxarray;\n\n     /* Set the objective coefficient */\n      rownr[0]  =  0;\n      avalue[0] = my_chsign(is_chsign(lp, 0), 1);\n\n     /* Set the constraint row coefficient */\n      rownr[1]  = forrownr;\n      avalue[1] = my_chsign(is_chsign(lp, forrownr), my_sign(rhscoef/acoef));\n\n     /* Add the column of artificial variable data to the user data matrix */\n      add_columnex(lp, 2, avalue, rownr);\n\n     /* Free the temporary sparse array storage */\n      if(idxarray == NULL)\n        FREE(rownr);\n      if(nzarray == NULL)\n        FREE(avalue);\n\n     /* Now set the artificial variable to be basic */\n      set_basisvar(lp, bvar, lp->sum);\n      lp->P1extraDim++;\n    }\n    else {\n      report(lp, CRITICAL, \"add_artificial: Could not find replacement basis variable for row %d\\n\",\n                           forrownr);\n      lp->basis_valid = FALSE;\n    }\n\n  }\n\n  return(add);\n\n}\n\nSTATIC int get_artificialRow(lprec *lp, int colnr)\n{\n  MATrec *mat = lp->matA;\n\n#ifdef Paranoia\n  if((colnr <= lp->columns-abs(lp->P1extraDim)) || (colnr > lp->columns))\n    report(lp, SEVERE, \"get_artificialRow: Invalid column index %d\\n\", colnr);\n  if(mat->col_end[colnr] - mat->col_end[colnr-1] != 1)\n    report(lp, SEVERE, \"get_artificialRow: Invalid column non-zero count\\n\");\n#endif\n\n  /* Return the row index of the singleton */\n  colnr = mat->col_end[colnr-1];\n  colnr = COL_MAT_ROWNR(colnr);\n  return( colnr );\n}\n\nSTATIC int findAnti_artificial(lprec *lp, int colnr)\n/* Primal simplex: Find a basic artificial variable to swap\n   against the non-basic slack variable, if possible */\n{\n  int    i, k, rownr = 0, P1extraDim = abs(lp->P1extraDim);\n\n  if((P1extraDim == 0) || (colnr > lp->rows) || !lp->is_basic[colnr])\n    return( rownr );\n\n  for(i = 1; i <= lp->rows; i++) {\n    k = lp->var_basic[i];\n    if((k > lp->sum-P1extraDim) && (lp->rhs[i] == 0)) {\n      rownr = get_artificialRow(lp, k-lp->rows);\n\n      /* Should we find the artificial's slack direct \"antibody\"? */\n      if(rownr == colnr)\n        break;\n      rownr = 0;\n    }\n  }\n  return( rownr );\n}\n\nSTATIC int findBasicArtificial(lprec *lp, int before)\n{\n  int i = 0, P1extraDim = abs(lp->P1extraDim);\n\n  if(P1extraDim > 0) {\n    if(before > lp->rows || before <= 1)\n      i = lp->rows;\n    else\n      i = before;\n\n    while((i > 0) && (lp->var_basic[i] <= lp->sum-P1extraDim))\n      i--;\n  }\n\n  return(i);\n}\n\nSTATIC void eliminate_artificials(lprec *lp, REAL *prow)\n{\n  int   i, j, colnr, rownr, P1extraDim = abs(lp->P1extraDim);\n\n  for(i = 1; (i <= lp->rows) && (P1extraDim > 0); i++) {\n    j = lp->var_basic[i];\n    if(j <= lp->sum-P1extraDim)\n      continue;\n    j -= lp->rows;\n    rownr = get_artificialRow(lp, j);\n    colnr = find_rowReplacement(lp, rownr, prow, NULL);\n#if 0\n    performiteration(lp, rownr, colnr, 0.0, TRUE, FALSE, prow, NULL,\n                                                          NULL, NULL, NULL);\n#else\n    set_basisvar(lp, rownr, colnr);\n#endif\n    del_column(lp, j);\n    P1extraDim--;\n  }\n  lp->P1extraDim = 0;\n}\n\nSTATIC void clear_artificials(lprec *lp)\n{\n  int i, j, n, P1extraDim;\n\n  /* Substitute any basic artificial variable for its slack counterpart */\n  n = 0;\n  P1extraDim = abs(lp->P1extraDim);\n  for(i = 1; (i <= lp->rows) && (n < P1extraDim); i++) {\n    j = lp->var_basic[i];\n    if(j <= lp->sum-P1extraDim)\n      continue;\n    j = get_artificialRow(lp, j-lp->rows);\n    set_basisvar(lp, i, j);\n    n++;\n  }\n#ifdef Paranoia\n  if(n != lp->P1extraDim)\n    report(lp, SEVERE, \"clear_artificials: Unable to clear all basic artificial variables\\n\");\n#endif\n\n  /* Delete any remaining non-basic artificial variables */\n  while(P1extraDim > 0) {\n    i = lp->sum-lp->rows;\n    del_column(lp, i);\n    P1extraDim--;\n  }\n  lp->P1extraDim = 0;\n  if(n > 0) {\n    set_action(&lp->spx_action, ACTION_REINVERT);\n    lp->basis_valid = TRUE;\n  }\n}\n\n\nSTATIC int primloop(lprec *lp, MYBOOL primalfeasible, REAL primaloffset)\n{\n  MYBOOL primal = TRUE, bfpfinal = FALSE, changedphase = FALSE, forceoutEQ = AUTOMATIC,\n         primalphase1, pricerCanChange, minit, stallaccept, pendingunbounded;\n  int    i, j, k, colnr = 0, rownr = 0, lastnr = 0,\n         candidatecount = 0, minitcount = 0, ok = TRUE;\n  LREAL  theta = 0.0;\n  REAL   epsvalue, xviolated = 0.0, cviolated = 0.0,\n         *prow = NULL, *pcol = NULL,\n         *drow = lp->drow;\n  int    *workINT = NULL,\n         *nzdrow = lp->nzdrow;\n\n  if(lp->spx_trace)\n    report(lp, DETAILED, \"Entered primal simplex algorithm with feasibility %s\\n\",\n                         my_boolstr(primalfeasible));\n\n /* Add sufficent number of artificial variables to make the problem feasible\n    through the first phase; delete when primal feasibility has been achieved */\n  lp->P1extraDim = 0;\n  if(!primalfeasible) {\n    lp->simplex_mode = SIMPLEX_Phase1_PRIMAL;\n#ifdef Paranoia\n    if(!verify_basis(lp))\n      report(lp, SEVERE, \"primloop: No valid basis for artificial variables\\n\");\n#endif\n#if 0\n    /* First check if we can get away with a single artificial variable */\n    if(lp->equalities == 0) {\n      i = (int) feasibilityOffset(lp, !primal);\n      add_artificial(lp, i, prow, (int *) pcol);\n    }\n    else\n#endif\n    /* Otherwise add as many artificial variables as is necessary\n       to force primal feasibility. */\n      for(i = 1; i <= lp->rows; i++) {\n        add_artificial(lp, i, NULL, NULL);\n      }\n\n    /* Make sure we update the working objective */\n    if(lp->P1extraDim > 0) {\n#if 1 /* v5.1 code: Not really necessary since we do not price the artificial\n        variables (stored at the end of the column list, they are initially\n        basic and are never allowed to enter the basis, once they exit) */\n      ok = allocREAL(lp, &(lp->drow), lp->sum+1, AUTOMATIC) &&\n           allocINT(lp, &(lp->nzdrow), lp->sum+1, AUTOMATIC);\n      if(!ok)\n        goto Finish;\n      lp->nzdrow[0] = 0;\n      drow = lp->drow;\n      nzdrow = lp->nzdrow;\n#endif\n      mat_validate(lp->matA);\n      set_OF_p1extra(lp, 0.0);\n    }\n    if(lp->spx_trace)\n      report(lp, DETAILED, \"P1extraDim count = %d\\n\", lp->P1extraDim);\n\n    simplexPricer(lp, (MYBOOL)!primal);\n    invert(lp, INITSOL_USEZERO, TRUE);\n  }\n  else {\n    lp->simplex_mode = SIMPLEX_Phase2_PRIMAL;\n    restartPricer(lp, (MYBOOL)!primal);\n  }\n\n  /* Create work arrays and optionally the multiple pricing structure */\n  ok = allocREAL(lp, &(lp->bsolveVal), lp->rows + 1, FALSE) &&\n       allocREAL(lp, &prow, lp->sum + 1, TRUE) &&\n       allocREAL(lp, &pcol, lp->rows + 1, TRUE);\n  if(is_piv_mode(lp, PRICE_MULTIPLE) && (lp->multiblockdiv > 1)) {\n    lp->multivars = multi_create(lp, FALSE);\n    ok &= (lp->multivars != NULL) &&\n          multi_resize(lp->multivars, lp->sum / lp->multiblockdiv, 2, FALSE, TRUE);\n  }\n  if(!ok)\n    goto Finish;\n\n  /* Initialize regular primal simplex algorithm variables */\n  lp->spx_status = RUNNING;\n  minit = ITERATE_MAJORMAJOR;\n  epsvalue = lp->epspivot;\n  pendingunbounded = FALSE;\n\n  ok = stallMonitor_create(lp, FALSE, \"primloop\");\n  if(!ok)\n    goto Finish;\n\n  lp->rejectpivot[0] = 0;\n\n /* Iterate while we are successful; exit when the model is infeasible/unbounded,\n    or we must terminate due to numeric instability or user-determined reasons */\n  while((lp->spx_status == RUNNING) && !userabort(lp, -1)) {\n\n    primalphase1 = (MYBOOL) (lp->P1extraDim > 0);\n    clear_action(&lp->spx_action, ACTION_REINVERT | ACTION_ITERATE);\n\n    /* Check if we have stalling (from numerics or degenerate cycling) */\n    pricerCanChange = !primalphase1;\n    stallaccept = stallMonitor_check(lp, rownr, colnr, lastnr, minit, pricerCanChange, &forceoutEQ);\n    if(!stallaccept)\n      break;\n\n   /* Find best column to enter the basis */\nRetryCol:\n#if 0\n    if(verify_solution(lp, FALSE, \"spx_loop\") > 0)\n      i = 1; /* This is just a debug trap */\n#endif\n    if(!changedphase) {\n      i = 0;\n      do {\n        i++;\n        colnr = colprim(lp, drow, nzdrow, (MYBOOL) (minit == ITERATE_MINORRETRY), i, &candidatecount, TRUE, &xviolated);\n      } while ((colnr == 0) && (i < partial_countBlocks(lp, (MYBOOL) !primal)) &&\n                                partial_blockStep(lp, (MYBOOL) !primal));\n\n      /* Handle direct outcomes */\n      if(colnr == 0)\n        lp->spx_status = OPTIMAL;\n      if(lp->rejectpivot[0] > 0)\n        minit = ITERATE_MAJORMAJOR;\n\n      /* See if accuracy check during compute_reducedcosts flagged refactorization */\n      if(is_action(lp->spx_action, ACTION_REINVERT))\n        bfpfinal = TRUE;\n\n    }\n\n    /* Make sure that we do not erroneously conclude that an unbounded model is optimal */\n#ifdef primal_UseRejectionList\n    if((colnr == 0) && (lp->rejectpivot[0] > 0)) {\n      lp->spx_status = UNBOUNDED;\n      if((lp->spx_trace && (lp->bb_totalnodes == 0)) ||\n         (lp->bb_trace && (lp->bb_totalnodes > 0)))\n        report(lp, DETAILED, \"The model is primal unbounded.\\n\");\n      colnr = lp->rejectpivot[1];\n      rownr = 0;\n      lp->rejectpivot[0] = 0;\n      ok = FALSE;\n      break;\n    }\n#endif\n\n    /* Check if we found an entering variable (indicating that we are still dual infeasible) */\n    if(colnr > 0) {\n      changedphase = FALSE;\n      fsolve(lp, colnr, pcol, NULL, lp->epsmachine, 1.0, TRUE);  /* Solve entering column for Pi */\n\n      /* Do special anti-degeneracy column selection, if specified */\n      if(is_anti_degen(lp, ANTIDEGEN_COLUMNCHECK) && !check_degeneracy(lp, pcol, NULL)) {\n        if(lp->rejectpivot[0] < DEF_MAXPIVOTRETRY/3) {\n          i = ++lp->rejectpivot[0];\n          lp->rejectpivot[i] = colnr;\n          report(lp, DETAILED, \"Entering column %d found to be non-improving due to degeneracy.\\n\",\n                     colnr);\n          minit = ITERATE_MINORRETRY;\n          goto RetryCol;\n        }\n        else {\n          lp->rejectpivot[0] = 0;\n          report(lp, DETAILED, \"Gave up trying to find a strictly improving entering column.\\n\");\n        }\n      }\n\n      /* Find the leaving variable that gives the most stringent bound on the entering variable */\n      theta = drow[colnr];\n      rownr = rowprim(lp, colnr, &theta, pcol, workINT, forceoutEQ, &cviolated);\n\n#ifdef AcceptMarginalAccuracy\n      /* Check for marginal accuracy */\n      if((rownr > 0) && (xviolated+cviolated < lp->epspivot)) {\n        if(lp->bb_trace || (lp->bb_totalnodes == 0))\n          report(lp, DETAILED, \"primloop: Assuming convergence with reduced accuracy %g.\\n\",\n                               MAX(xviolated, cviolated));\n        rownr = 0;\n        colnr = 0;\n        goto Optimality;\n      }\n      else\n#endif\n\n      /* See if we can do a straight artificial<->slack replacement (when \"colnr\" is a slack) */\n      if((lp->P1extraDim != 0) && (rownr == 0) && (colnr <= lp->rows))\n        rownr = findAnti_artificial(lp, colnr);\n\n      if(rownr > 0) {\n        pendingunbounded = FALSE;\n        lp->rejectpivot[0] = 0;\n        set_action(&lp->spx_action, ACTION_ITERATE);\n        if(!lp->obj_in_basis)  /* We must manually copy the reduced cost for RHS update */\n          pcol[0] = my_chsign(!lp->is_lower[colnr], drow[colnr]);\n        lp->bfp_prepareupdate(lp, rownr, colnr, pcol);\n      }\n\n      /* We may be unbounded... */\n      else {\n        /* First make sure that we are not suffering from precision loss */\n#ifdef primal_UseRejectionList\n        if(lp->rejectpivot[0] < DEF_MAXPIVOTRETRY) {\n          lp->spx_status = RUNNING;\n          lp->rejectpivot[0]++;\n          lp->rejectpivot[lp->rejectpivot[0]] = colnr;\n          report(lp, DETAILED, \"...trying to recover via another pivot column.\\n\");\n          minit = ITERATE_MINORRETRY;\n          goto RetryCol;\n        }\n        else\n#endif\n        /* Check that we are not having numerical problems */\n        if(!refactRecent(lp) && !pendingunbounded) {\n          bfpfinal = TRUE;\n          pendingunbounded = TRUE;\n          set_action(&lp->spx_action, ACTION_REINVERT);\n        }\n\n        /* Conclude that the model is unbounded */\n        else {\n          lp->spx_status = UNBOUNDED;\n          report(lp, DETAILED, \"The model is primal unbounded.\\n\");\n          break;\n        }\n      }\n    }\n\n    /* We handle optimality and phase 1 infeasibility ... */\n    else {\n\nOptimality:\n      /* Handle possible transition from phase 1 to phase 2 */\n      if(!primalfeasible || isP1extra(lp)) {\n\n        if(feasiblePhase1(lp, epsvalue)) {\n          lp->spx_status = RUNNING;\n          if(lp->bb_totalnodes == 0) {\n            report(lp, NORMAL, \"Found feasibility by primal simplex after  %10.0f iter.\\n\",\n                                (double) get_total_iter(lp));\n            if((lp->usermessage != NULL) && (lp->msgmask & MSG_LPFEASIBLE))\n              lp->usermessage(lp, lp->msghandle, MSG_LPFEASIBLE);\n          }\n          changedphase = FALSE;\n          primalfeasible = TRUE;\n          lp->simplex_mode = SIMPLEX_Phase2_PRIMAL;\n          set_OF_p1extra(lp, 0.0);\n\n         /* We can do two things now;\n            1) delete the rows belonging to those variables, since they are redundant, OR\n            2) drive out the existing artificial variables via pivoting. */\n          if(lp->P1extraDim > 0) {\n\n#ifdef Phase1EliminateRedundant\n           /* If it is not a MIP model we can try to delete redundant rows */\n            if((lp->bb_totalnodes == 0) && (MIP_count(lp) == 0)) {\n              while(lp->P1extraDim > 0) {\n                i = lp->rows;\n                while((i > 0) && (lp->var_basic[i] <= lp->sum-lp->P1extraDim))\n                  i--;\n#ifdef Paranoia\n                if(i <= 0) {\n                  report(lp, SEVERE, \"primloop: Could not find redundant artificial.\\n\");\n                  break;\n                }\n#endif\n                /* Obtain column and row indeces */\n                j = lp->var_basic[i]-lp->rows;\n                k = get_artificialRow(lp, j);\n\n                /* Delete row before column due to basis \"compensation logic\" */\n                if(lp->is_basic[k]) {\n                  lp->is_basic[lp->rows+j] = FALSE;\n                  del_constraint(lp, k);\n                }\n                else\n                  set_basisvar(lp, i, k);\n                del_column(lp, j);\n                lp->P1extraDim--;\n              }\n              lp->basis_valid = TRUE;\n            }\n           /* Otherwise we drive out the artificials by elimination pivoting */\n            else\n              eliminate_artificials(lp, prow);\n\n#else\n            /* Indicate phase 2 with artificial variables by negating P1extraDim */\n            lp->P1extraDim = my_flipsign(lp->P1extraDim);\n#endif\n          }\n\n          /* We must refactorize since the OF changes from phase 1 to phase 2 */\n          set_action(&lp->spx_action, ACTION_REINVERT);\n          bfpfinal = TRUE;\n        }\n\n        /* We are infeasible in phase 1 */\n        else {\n          lp->spx_status = INFEASIBLE;\n          minit = ITERATE_MAJORMAJOR;\n          if(lp->spx_trace)\n            report(lp, NORMAL, \"Model infeasible by primal simplex at iter   %10.0f.\\n\",\n                               (double) get_total_iter(lp));\n        }\n      }\n\n      /* Handle phase 1 optimality */\n      else {\n        /* (Do nothing special) */\n      }\n\n      /* Check if we are still primal feasible; the default assumes that this check\n         is not necessary after the relaxed problem has been solved satisfactorily. */\n      if((lp->bb_level <= 1) || (lp->improve & IMPROVE_BBSIMPLEX) /* || (lp->bb_rule & NODE_RCOSTFIXING) */) { /* NODE_RCOSTFIXING fix */\n        set_action(&lp->piv_strategy, PRICE_FORCEFULL);\n          i = rowdual(lp, lp->rhs, FALSE, FALSE, NULL);\n        clear_action(&lp->piv_strategy, PRICE_FORCEFULL);\n        if(i > 0) {\n          lp->spx_status = LOSTFEAS;\n          if(lp->total_iter == 0)\n            report(lp, DETAILED, \"primloop: Lost primal feasibility at iter  %10.0f: will try to recover.\\n\",\n                                 (double) get_total_iter(lp));\n        }\n      }\n    }\n\n    /* Pivot row/col and update the inverse */\n    if(is_action(lp->spx_action, ACTION_ITERATE)) {\n      lastnr = lp->var_basic[rownr];\n\n      if(refactRecent(lp) == AUTOMATIC)\n        minitcount = 0;\n      else if(minitcount > MAX_MINITUPDATES) {\n        recompute_solution(lp, INITSOL_USEZERO);\n        minitcount = 0;\n      }\n      minit = performiteration(lp, rownr, colnr, theta, primal,\n                                                 (MYBOOL) (/*(candidatecount > 1) && */\n                                                           (stallaccept != AUTOMATIC)),\n                                                 NULL, NULL,\n                                                 pcol, NULL, NULL);\n      if(minit != ITERATE_MAJORMAJOR)\n        minitcount++;\n\n      if((lp->spx_status == USERABORT) || (lp->spx_status == TIMEOUT))\n        break;\n      else if(minit == ITERATE_MINORMAJOR)\n        continue;\n#ifdef UsePrimalReducedCostUpdate\n      /* Do a fast update of the reduced costs in preparation for the next iteration */\n      if(minit == ITERATE_MAJORMAJOR)\n        update_reducedcosts(lp, primal, lastnr, colnr, pcol, drow);\n#endif\n\n      /* Detect if an auxiliary variable has left the basis and delete it; if\n         the non-basic variable only changed bound (a \"minor iteration\"), the\n         basic artificial variable did not leave and there is nothing to do */\n      if((minit == ITERATE_MAJORMAJOR) && (lastnr > lp->sum - abs(lp->P1extraDim))) {\n#ifdef Paranoia\n        if(lp->is_basic[lastnr] || !lp->is_basic[colnr])\n          report(lp, SEVERE, \"primloop: Invalid basis indicator for variable %d at iter %10.0f.\\n\",\n                              lastnr, (double) get_total_iter(lp));\n#endif\n        del_column(lp, lastnr-lp->rows);\n        if(lp->P1extraDim > 0)\n          lp->P1extraDim--;\n        else\n          lp->P1extraDim++;\n        if(lp->P1extraDim == 0) {\n          colnr = 0;\n          changedphase = TRUE;\n          stallMonitor_reset(lp);\n        }\n      }\n    }\n\n    if(lp->spx_status == SWITCH_TO_DUAL)\n      ;\n    else if(!changedphase && lp->bfp_mustrefactorize(lp)) {\n#ifdef ResetMinitOnReinvert\n      minit = ITERATE_MAJORMAJOR;\n#endif\n      if(!invert(lp, INITSOL_USEZERO, bfpfinal))\n        lp->spx_status = SINGULAR_BASIS;\n      bfpfinal = FALSE;\n    }\n  }\n\n  /* Remove any remaining artificial variables (feasible or infeasible model) */\n  lp->P1extraDim = abs(lp->P1extraDim);\n/*  if((lp->P1extraDim > 0) && (lp->spx_status != DEGENERATE)) { */\n  if(lp->P1extraDim > 0) {\n    clear_artificials(lp);\n    if(lp->spx_status != OPTIMAL)\n      restore_basis(lp);\n    i = invert(lp, INITSOL_USEZERO, TRUE);\n  }\n#ifdef Paranoia\n  if(!verify_basis(lp))\n    report(lp, SEVERE, \"primloop: Invalid basis detected due to internal error\\n\");\n#endif\n\n  /* Switch to dual phase 1 simplex for MIP models during\n     B&B phases, since this is typically far more efficient */\n#ifdef ForceDualSimplexInBB\n  if((lp->bb_totalnodes == 0) && (MIP_count(lp) > 0) &&\n     ((lp->simplex_strategy & SIMPLEX_Phase1_DUAL) == 0)) {\n    lp->simplex_strategy &= ~SIMPLEX_Phase1_PRIMAL;\n    lp->simplex_strategy += SIMPLEX_Phase1_DUAL;\n  }\n#endif\n\nFinish:\n  stallMonitor_finish(lp);\n  multi_free(&(lp->multivars));\n  FREE(prow);\n  FREE(pcol);\n  FREE(lp->bsolveVal);\n\n  return(ok);\n} /* primloop */\n\nSTATIC int dualloop(lprec *lp, MYBOOL dualfeasible, int dualinfeasibles[], REAL dualoffset)\n{\n  MYBOOL primal = FALSE, inP1extra, dualphase1 = FALSE, changedphase = TRUE,\n         pricerCanChange, minit, stallaccept, longsteps,\n         forceoutEQ = FALSE, bfpfinal = FALSE;\n  int    i, colnr = 0, rownr = 0, lastnr = 0,\n         candidatecount = 0, minitcount = 0,\n#ifdef FixInaccurateDualMinit\n         minitcolnr = 0,\n#endif\n         ok = TRUE;\n  int    *boundswaps = NULL;\n  LREAL  theta = 0.0;\n  REAL   epsvalue, xviolated, cviolated,\n         *prow = NULL, *pcol = NULL,\n         *drow = lp->drow;\n  int    *nzprow = NULL, *workINT = NULL,\n         *nzdrow = lp->nzdrow;\n\n  if(lp->spx_trace)\n    report(lp, DETAILED, \"Entered dual simplex algorithm with feasibility %s.\\n\",\n                         my_boolstr(dualfeasible));\n\n  /* Allocate work arrays */\n  ok = allocREAL(lp, &prow,   lp->sum + 1,  TRUE) &&\n       allocINT (lp, &nzprow, lp->sum + 1,  FALSE) &&\n       allocREAL(lp, &pcol,   lp->rows + 1, TRUE);\n  if(!ok)\n    goto Finish;\n\n  /* Set non-zero P1extraVal value to force dual feasibility when the dual\n     simplex is used as a phase 1 algorithm for the primal simplex.\n     The value will be reset when primal feasibility has been achieved, or\n     a dual non-feasibility has been encountered (no candidate for a first\n     leaving variable) */\n  inP1extra = (MYBOOL) (dualoffset != 0);\n  if(inP1extra) {\n    set_OF_p1extra(lp, dualoffset);\n    simplexPricer(lp, (MYBOOL)!primal);\n    invert(lp, INITSOL_USEZERO, TRUE);\n  }\n  else\n    restartPricer(lp, (MYBOOL)!primal);\n\n  /* Prepare dual long-step structures */\n#if 0\n  longsteps = TRUE;\n#elif 0\n  longsteps = (MYBOOL) ((MIP_count(lp) > 0) && (lp->bb_level > 1));\n#elif 0\n  longsteps = (MYBOOL) ((MIP_count(lp) > 0) && (lp->solutioncount >= 1));\n#else\n  longsteps = FALSE;\n#endif\n#ifdef UseLongStepDualPhase1\n  longsteps = !dualfeasible && (MYBOOL) (dualinfeasibles != NULL);\n#endif\n\n  if(longsteps) {\n    lp->longsteps = multi_create(lp, TRUE);\n    ok = (lp->longsteps != NULL) &&\n         multi_resize(lp->longsteps, MIN(lp->boundedvars+2, 11), 1, TRUE, TRUE);\n    if(!ok)\n      goto Finish;\n#ifdef UseLongStepPruning\n    lp->longsteps->objcheck = TRUE;\n#endif\n    boundswaps = multi_indexSet(lp->longsteps, FALSE);\n  }\n\n  /* Do regular dual simplex variable initializations */\n  lp->spx_status = RUNNING;\n  minit = ITERATE_MAJORMAJOR;\n  epsvalue = lp->epspivot;\n\n  ok = stallMonitor_create(lp, TRUE, \"dualloop\");\n  if(!ok)\n    goto Finish;\n\n  lp->rejectpivot[0] = 0;\n  if(dualfeasible)\n    lp->simplex_mode = SIMPLEX_Phase2_DUAL;\n  else\n    lp->simplex_mode = SIMPLEX_Phase1_DUAL;\n\n  /* Check if we have equality slacks in the basis and we should try to\n     drive them out in order to reduce chance of degeneracy in Phase 1.\n     forceoutEQ = FALSE :    Only eliminate assured \"good\" violated\n                             equality constraint slacks\n                  AUTOMATIC: Seek more elimination of equality constraint\n                             slacks (but not as aggressive as the rule\n                             used in lp_solve v4.0 and earlier)\n                  TRUE:      Force remaining equality slacks out of the\n                             basis */\n  if(dualphase1 || inP1extra ||\n     ((lp->fixedvars > 0) && is_anti_degen(lp, ANTIDEGEN_FIXEDVARS))) {\n    forceoutEQ = AUTOMATIC;\n  }\n#if 1\n  if(is_anti_degen(lp, ANTIDEGEN_DYNAMIC) && (bin_count(lp, TRUE)*2 > lp->columns)) {\n    switch (forceoutEQ) {\n      case FALSE:     forceoutEQ = AUTOMATIC;\n                      break;\n /*     case AUTOMATIC: forceoutEQ = TRUE;\n                      break;\n      default:        forceoutEQ = TRUE; */\n    }\n  }\n#endif\n\n  while((lp->spx_status == RUNNING) && !userabort(lp, -1)) {\n\n    /* Check if we have stalling (from numerics or degenerate cycling) */\n    pricerCanChange = !dualphase1 && !inP1extra;\n    stallaccept = stallMonitor_check(lp, rownr, colnr, lastnr, minit, pricerCanChange, &forceoutEQ);\n    if(!stallaccept)\n      break;\n\n    /* Store current LP index for reference at next iteration */\n    changedphase = FALSE;\n\n    /* Compute (pure) dual phase1 offsets / reduced costs if appropriate */\n    dualphase1 &= (MYBOOL) (lp->simplex_mode == SIMPLEX_Phase1_DUAL);\n    if(longsteps && dualphase1 && !inP1extra) {\n      obtain_column(lp, dualinfeasibles[1], pcol, NULL, NULL);\n      i = 2;\n      for(i = 2; i <= dualinfeasibles[0]; i++)\n        mat_multadd(lp->matA, pcol, dualinfeasibles[i], 1.0);\n      /* Solve (note that solved pcol will be used instead of lp->rhs) */\n      ftran(lp, pcol, NULL, lp->epsmachine);\n    }\n\n    /* Do minor iterations (non-basic variable bound flips) for as\n       long as possible since this is a cheap way of iterating */\n#if (defined dual_Phase1PriceEqualities) || (defined dual_UseRejectionList)\nRetryRow:\n#endif\n    if(minit != ITERATE_MINORRETRY) {\n      i = 0;\n      do {\n        i++;\n        rownr = rowdual(lp, my_if(dualphase1, pcol, NULL), forceoutEQ, TRUE, &xviolated);\n      } while ((rownr == 0) && (i < partial_countBlocks(lp, (MYBOOL) !primal)) &&\n                                partial_blockStep(lp, (MYBOOL) !primal));\n    }\n\n    /* Make sure that we do not erroneously conclude that an infeasible model is optimal */\n#ifdef dual_UseRejectionList\n    if((rownr == 0) && (lp->rejectpivot[0] > 0)) {\n      lp->spx_status = INFEASIBLE;\n      if((lp->spx_trace && (lp->bb_totalnodes == 0)) ||\n         (lp->bb_trace && (lp->bb_totalnodes > 0)))\n        report(lp, DETAILED, \"The model is primal infeasible.\\n\");\n      rownr = lp->rejectpivot[1];\n      colnr = 0;\n      lp->rejectpivot[0] = 0;\n      ok = FALSE;\n      break;\n    }\n#endif\n\n    /* If we found a leaving variable, find a matching entering one */\n    clear_action(&lp->spx_action, ACTION_ITERATE);\n    if(rownr > 0) {\n      colnr = coldual(lp, rownr, prow, nzprow, drow, nzdrow,\n                                 (MYBOOL) (dualphase1 && !inP1extra),\n                                 (MYBOOL) (minit == ITERATE_MINORRETRY), &candidatecount, &cviolated);\n      if(colnr < 0) {\n        minit = ITERATE_MAJORMAJOR;\n        continue;\n      }\n#ifdef AcceptMarginalAccuracy\n      else if(xviolated+cviolated < lp->epspivot) {\n        if(lp->bb_trace || (lp->bb_totalnodes == 0))\n          report(lp, DETAILED, \"dualloop: Assuming convergence with reduced accuracy %g.\\n\",\n                               MAX(xviolated, cviolated));\n        rownr = 0;\n        colnr = 0;\n      }\n#endif\n      /* Check if the long-dual found reason to prune the B&B tree */\n      if(lp->spx_status == FATHOMED)\n        break;\n    }\n    else\n      colnr = 0;\n\n    /* Process primal-infeasible row */\n    if(rownr > 0) {\n\n      if(colnr > 0) {\n#ifdef Paranoia\n        if((rownr > lp->rows) || (colnr > lp->sum)) {\n          report(lp, SEVERE, \"dualloop: Invalid row %d(%d) and column %d(%d) pair selected at iteration %.0f\\n\",\n                             rownr, lp->rows, colnr-lp->columns, lp->columns, (double) get_total_iter(lp));\n          lp->spx_status = UNKNOWNERROR;\n          break;\n        }\n#endif\n        fsolve(lp, colnr, pcol, workINT, lp->epsmachine, 1.0, TRUE);\n\n#ifdef FixInaccurateDualMinit\n       /* Prevent bound flip-flops during minor iterations; used to detect\n          infeasibility after triggering of minor iteration accuracy management */\n        if(colnr != minitcolnr)\n          minitcolnr = 0;\n#endif\n\n       /* Getting division by zero here; catch it and try to recover */\n        if(pcol[rownr] == 0) {\n          if(lp->spx_trace)\n            report(lp, DETAILED, \"dualloop: Attempt to divide by zero (pcol[%d])\\n\", rownr);\n          if(!refactRecent(lp)) {\n            report(lp, DETAILED, \"...trying to recover by refactorizing basis.\\n\");\n            set_action(&lp->spx_action, ACTION_REINVERT);\n            bfpfinal = FALSE;\n          }\n          else {\n            if(lp->bb_totalnodes == 0)\n              report(lp, DETAILED, \"...cannot recover by refactorizing basis.\\n\");\n            lp->spx_status = NUMFAILURE;\n            ok = FALSE;\n          }\n        }\n        else {\n          set_action(&lp->spx_action, ACTION_ITERATE);\n          lp->rejectpivot[0] = 0;\n          if(!lp->obj_in_basis)  /* We must manually copy the reduced cost for RHS update */\n            pcol[0] = my_chsign(!lp->is_lower[colnr], drow[colnr]);\n          theta = lp->bfp_prepareupdate(lp, rownr, colnr, pcol);\n\n         /* Verify numeric accuracy of the basis factorization and change to\n            the \"theoretically\" correct version of the theta */\n          if((lp->improve & IMPROVE_THETAGAP) && !refactRecent(lp) &&\n             (my_reldiff(fabs(theta), fabs(prow[colnr])) >\n              lp->epspivot*10.0*log(2.0+50.0*lp->rows))) {  /* This is my kludge - KE */\n            set_action(&lp->spx_action, ACTION_REINVERT);\n            bfpfinal = TRUE;\n#ifdef IncreasePivotOnReducedAccuracy\n            lp->epspivot = MIN(1.0e-4, lp->epspivot*2.0);\n#endif\n            report(lp, DETAILED, \"dualloop: Refactorizing at iter %.0f due to loss of accuracy.\\n\",\n                                 (double) get_total_iter(lp));\n          }\n          theta = prow[colnr];\n          compute_theta(lp, rownr, &theta, !lp->is_lower[colnr], 0, primal);\n        }\n      }\n\n#ifdef FixInaccurateDualMinit\n      /* Force reinvertion and try another row if we did not find a bound-violated leaving column */\n      else if(!refactRecent(lp) && (minit != ITERATE_MAJORMAJOR) && (colnr != minitcolnr)) {\n        minitcolnr = colnr;\n        i = invert(lp, INITSOL_USEZERO, TRUE);\n        if((lp->spx_status == USERABORT) || (lp->spx_status == TIMEOUT))\n          break;\n        else if(!i) {\n          lp->spx_status = SINGULAR_BASIS;\n          break;\n        }\n        minit = ITERATE_MAJORMAJOR;\n        continue;\n      }\n#endif\n\n      /* We may be infeasible, have lost dual feasibility, or simply have no valid entering\n         variable for the selected row.  The strategy is to refactorize if we suspect numerical\n         problems and loss of dual feasibility; this is done if it has been a while since\n         refactorization.  If not, first try to select a different row/leaving variable to\n         see if a valid entering variable can be found.  Otherwise, determine this model\n         as infeasible. */\n      else {\n\n        /* As a first option, try to recover from any numerical trouble by refactorizing */\n        if(!refactRecent(lp)) {\n          set_action(&lp->spx_action, ACTION_REINVERT);\n          bfpfinal = TRUE;\n        }\n\n#ifdef dual_UseRejectionList\n        /* Check for pivot size issues */\n        else if(lp->rejectpivot[0] < DEF_MAXPIVOTRETRY) {\n          lp->spx_status = RUNNING;\n          lp->rejectpivot[0]++;\n          lp->rejectpivot[lp->rejectpivot[0]] = rownr;\n          if(lp->bb_totalnodes == 0)\n            report(lp, DETAILED, \"...trying to find another pivot row!\\n\");\n          goto RetryRow;\n        }\n#endif\n        /* Check if we may have lost dual feasibility if we also did phase 1 here */\n        else if(dualphase1 && (dualoffset != 0)) {\n          lp->spx_status = LOSTFEAS;\n          if((lp->spx_trace && (lp->bb_totalnodes == 0)) ||\n             (lp->bb_trace && (lp->bb_totalnodes > 0)))\n            report(lp, DETAILED, \"dualloop: Model lost dual feasibility.\\n\");\n          ok = FALSE;\n          break;\n        }\n\n        /* Otherwise just determine that we are infeasible */\n        else {\n          if(lp->spx_status == RUNNING) {\n#if 1\n            if(xviolated < lp->epspivot) {\n              if(lp->bb_trace || (lp->bb_totalnodes == 0))\n                report(lp, NORMAL, \"The model is primal optimal, but marginally infeasible.\\n\");\n              lp->spx_status = OPTIMAL;\n              break;\n            }\n#endif\n            lp->spx_status = INFEASIBLE;\n            if((lp->spx_trace && (lp->bb_totalnodes == 0)) ||\n               (lp->bb_trace && (lp->bb_totalnodes > 0)))\n            report(lp, DETAILED, \"The model is primal infeasible.\\n\");\n          }\n          ok = FALSE;\n          break;\n        }\n      }\n    }\n\n    /* Make sure that we enter the primal simplex with a high quality solution */\n    else if(inP1extra && !refactRecent(lp) && is_action(lp->improve, IMPROVE_INVERSE)) {\n       set_action(&lp->spx_action, ACTION_REINVERT);\n       bfpfinal = TRUE;\n    }\n\n    /* High quality solution with no leaving candidates available ... */\n    else {\n\n      bfpfinal = TRUE;\n\n#ifdef dual_RemoveBasicFixedVars\n      /* See if we should try to eliminate basic fixed variables;\n        can be time-consuming for some models */\n      if(inP1extra && (colnr == 0) && (lp->fixedvars > 0) && is_anti_degen(lp, ANTIDEGEN_FIXEDVARS)) {\n        report(lp, DETAILED, \"dualloop: Trying to pivot out %d fixed basic variables at iter %.0f\\n\",\n                             lp->fixedvars, (double) get_total_iter(lp));\n        rownr = 0;\n        while(lp->fixedvars > 0) {\n          rownr = findBasicFixedvar(lp, rownr, TRUE);\n          if(rownr == 0) {\n            colnr = 0;\n            break;\n          }\n          colnr = find_rowReplacement(lp, rownr, prow, nzprow);\n          if(colnr > 0) {\n            theta = 0;\n            performiteration(lp, rownr, colnr, theta, TRUE, FALSE, prow, NULL,\n                                                            NULL, NULL, NULL);\n            lp->fixedvars--;\n          }\n        }\n      }\n#endif\n\n      /* Check if we are INFEASIBLE for the case that the dual is used\n         as phase 1 before the primal simplex phase 2 */\n      if(inP1extra && (colnr < 0) && !isPrimalFeasible(lp, lp->epsprimal, NULL, NULL)) {\n        if(lp->bb_totalnodes == 0) {\n          if(dualfeasible)\n            report(lp, DETAILED, \"The model is primal infeasible and dual feasible.\\n\");\n          else\n            report(lp, DETAILED, \"The model is primal infeasible and dual unbounded.\\n\");\n        }\n        set_OF_p1extra(lp, 0);\n        inP1extra = FALSE;\n        set_action(&lp->spx_action, ACTION_REINVERT);\n        lp->spx_status = INFEASIBLE;\n        lp->simplex_mode = SIMPLEX_UNDEFINED;\n        ok = FALSE;\n      }\n\n      /* Check if we are FEASIBLE (and possibly also optimal) for the case that the\n         dual is used as phase 1 before the primal simplex phase 2 */\n      else if(inP1extra) {\n\n        /* Set default action; force an update of the rhs vector, adjusted for\n           the new P1extraVal=0 (set here so that usermessage() behaves properly) */\n        if(lp->bb_totalnodes == 0) {\n          report(lp, NORMAL, \"Found feasibility by dual simplex after    %10.0f iter.\\n\",\n                             (double) get_total_iter(lp));\n          if((lp->usermessage != NULL) && (lp->msgmask & MSG_LPFEASIBLE))\n            lp->usermessage(lp, lp->msghandle, MSG_LPFEASIBLE);\n        }\n        set_OF_p1extra(lp, 0);\n        inP1extra = FALSE;\n        set_action(&lp->spx_action, ACTION_REINVERT);\n\n#if 1\n        /* Optionally try another dual loop, if so selected by the user */\n        if((lp->simplex_strategy & SIMPLEX_DUAL_PRIMAL) && (lp->fixedvars == 0))\n          lp->spx_status = SWITCH_TO_PRIMAL;\n#endif\n        changedphase = TRUE;\n\n      }\n\n      /* We are primal feasible and also optimal if we were in phase 2 */\n      else  {\n\n        lp->simplex_mode = SIMPLEX_Phase2_DUAL;\n\n        /* Check if we still have equality slacks stuck in the basis; drive them out? */\n        if((lp->fixedvars > 0) && (lp->bb_totalnodes == 0)) {\n#ifdef dual_Phase1PriceEqualities\n          if(forceoutEQ != TRUE) {\n            forceoutEQ = TRUE;\n            goto RetryRow;\n          }\n#endif\n#ifdef Paranoia\n          report(lp, NORMAL,\n#else\n          report(lp, DETAILED,\n#endif\n                    \"Found dual solution with %d fixed slack variables left basic.\\n\",\n                    lp->fixedvars);\n        }\n        /* Check if we are still dual feasible; the default assumes that this check\n          is not necessary after the relaxed problem has been solved satisfactorily. */\n        colnr = 0;\n        if((dualoffset != 0) || (lp->bb_level <= 1) || (lp->improve & IMPROVE_BBSIMPLEX) || (lp->bb_rule & NODE_RCOSTFIXING)) { /* NODE_RCOSTFIXING fix */\n          set_action(&lp->piv_strategy, PRICE_FORCEFULL);\n            colnr = colprim(lp, drow, nzdrow, FALSE, 1, &candidatecount, FALSE, NULL);\n          clear_action(&lp->piv_strategy, PRICE_FORCEFULL);\n          if((dualoffset == 0) && (colnr > 0)) {\n            lp->spx_status = LOSTFEAS;\n            if(lp->total_iter == 0)\n              report(lp, DETAILED, \"Recovering lost dual feasibility at iter %10.0f.\\n\",\n                                   (double) get_total_iter(lp));\n            break;\n          }\n        }\n\n        if(colnr == 0)\n          lp->spx_status = OPTIMAL;\n        else {\n          lp->spx_status = SWITCH_TO_PRIMAL;\n          if(lp->total_iter == 0)\n            report(lp, DETAILED, \"Use primal simplex for finalization at iter  %10.0f.\\n\",\n                                 (double) get_total_iter(lp));\n        }\n        if((lp->total_iter == 0) && (lp->spx_status == OPTIMAL))\n          report(lp, DETAILED, \"Optimal solution with dual simplex at iter   %10.0f.\\n\",\n                               (double) get_total_iter(lp));\n      }\n\n      /* Determine if we are ready to break out of the loop */\n      if(!changedphase)\n        break;\n    }\n\n    /* Check if we are allowed to iterate on the chosen column and row */\n    if(is_action(lp->spx_action, ACTION_ITERATE)) {\n\n      lastnr = lp->var_basic[rownr];\n      if(refactRecent(lp) == AUTOMATIC)\n        minitcount = 0;\n      else if(minitcount > MAX_MINITUPDATES) {\n        recompute_solution(lp, INITSOL_USEZERO);\n        minitcount = 0;\n      }\n      minit = performiteration(lp, rownr, colnr, theta, primal,\n                                                 (MYBOOL) (/*(candidatecount > 1) && */\n                                                           (stallaccept != AUTOMATIC)),\n                                                 prow, nzprow,\n                                                 pcol, NULL, boundswaps);\n\n      /* Check if we should abandon iterations on finding that there is no\n        hope that this branch can improve on the incumbent B&B solution */\n      if(!lp->is_strongbranch && (lp->solutioncount >= 1) && !lp->spx_perturbed && !inP1extra &&\n          bb_better(lp, OF_WORKING, OF_TEST_WE)) {\n        lp->spx_status = FATHOMED;\n        ok = FALSE;\n        break;\n      }\n\n      if(minit != ITERATE_MAJORMAJOR)\n        minitcount++;\n\n      /* Update reduced costs for (pure) dual long-step phase 1 */\n      if(longsteps && dualphase1 && !inP1extra) {\n        dualfeasible = isDualFeasible(lp, lp->epsprimal, NULL, dualinfeasibles, NULL);\n        if(dualfeasible) {\n          dualphase1 = FALSE;\n          changedphase = TRUE;\n          lp->simplex_mode = SIMPLEX_Phase2_DUAL;\n        }\n      }\n#ifdef UseDualReducedCostUpdate\n      /* Do a fast update of reduced costs in preparation for the next iteration */\n      else if(minit == ITERATE_MAJORMAJOR)\n        update_reducedcosts(lp, primal, lastnr, colnr, prow, drow);\n#endif\n      if((minit == ITERATE_MAJORMAJOR) && (lastnr <= lp->rows) && is_fixedvar(lp, lastnr))\n        lp->fixedvars--;\n    }\n\n    /* Refactorize if required to */\n    if(lp->bfp_mustrefactorize(lp)) {\n      if(invert(lp, INITSOL_USEZERO, bfpfinal)) {\n\n#if 0\n        /* Verify dual feasibility in case we are attempting the extra dual loop */\n        if(changedphase && (dualoffset != 0) && !inP1extra && (lp->spx_status != SWITCH_TO_PRIMAL)) {\n#if 1\n          if(!isDualFeasible(lp, lp->epsdual, &colnr, NULL, NULL)) {\n#else\n          set_action(&lp->piv_strategy, PRICE_FORCEFULL);\n            colnr = colprim(lp, drow, nzdrow, FALSE, 1, &candidatecount, FALSE, NULL);\n          clear_action(&lp->piv_strategy, PRICE_FORCEFULL);\n          if(colnr > 0) {\n#endif\n            lp->spx_status = SWITCH_TO_PRIMAL;\n            colnr = 0;\n          }\n        }\n#endif\n\n        bfpfinal = FALSE;\n#ifdef ResetMinitOnReinvert\n        minit = ITERATE_MAJORMAJOR;\n#endif\n      }\n      else\n        lp->spx_status = SINGULAR_BASIS;\n    }\n  }\n\nFinish:\n  stallMonitor_finish(lp);\n  multi_free(&(lp->longsteps));\n  FREE(prow);\n  FREE(nzprow);\n  FREE(pcol);\n\n  return(ok);\n}\n\nSTATIC int spx_run(lprec *lp, MYBOOL validInvB)\n{\n  int    i, j, singular_count, lost_feas_count, *infeasibles = NULL, *boundflip_count;\n  MYBOOL primalfeasible, dualfeasible, lost_feas_state, isbb;\n  REAL   primaloffset = 0, dualoffset = 0;\n\n  lp->current_iter  = 0;\n  lp->current_bswap = 0;\n  lp->spx_status    = RUNNING;\n  lp->bb_status = lp->spx_status;\n  lp->P1extraDim = 0;\n  set_OF_p1extra(lp, 0);\n  singular_count  = 0;\n  lost_feas_count = 0;\n  lost_feas_state = FALSE;\n  lp->simplex_mode = SIMPLEX_DYNAMIC;\n\n  /* Compute the number of fixed basic and bounded variables (used in long duals) */\n  lp->fixedvars = 0;\n  lp->boundedvars = 0;\n  for(i = 1; i <= lp->rows; i++) {\n    j = lp->var_basic[i];\n    if((j <= lp->rows) && is_fixedvar(lp, j))\n      lp->fixedvars++;\n    if((lp->upbo[i] < lp->infinite) && (lp->upbo[i] > lp->epsprimal))\n      lp->boundedvars++;\n  }\n  for(; i <= lp->sum; i++){\n    if((lp->upbo[i] < lp->infinite) && (lp->upbo[i] > lp->epsprimal))\n      lp->boundedvars++;\n  }\n#ifdef UseLongStepDualPhase1\n  allocINT(lp, &infeasibles, lp->columns + 1, FALSE);\n  infeasibles[0] = 0;\n#endif\n\n  /* Reinvert for initialization, if necessary */\n  isbb = (MYBOOL) ((MIP_count(lp) > 0) && (lp->bb_level > 1));\n  if(is_action(lp->spx_action, ACTION_REINVERT)) {\n    if(isbb && (lp->bb_bounds->nodessolved == 0))\n/*    if(isbb && (lp->bb_basis->pivots == 0)) */\n      recompute_solution(lp, INITSOL_SHIFTZERO);\n    else {\n      i = my_if(is_action(lp->spx_action, ACTION_REBASE), INITSOL_SHIFTZERO, INITSOL_USEZERO);\n      invert(lp, (MYBOOL) i, TRUE);\n    }\n  }\n  else if(is_action(lp->spx_action, ACTION_REBASE))\n    recompute_solution(lp, INITSOL_SHIFTZERO);\n\n  /* Optionally try to do bound flips to obtain dual feasibility */\n  if(is_action(lp->improve, IMPROVE_DUALFEAS) || (lp->rows == 0))\n    boundflip_count = &i;\n  else\n    boundflip_count = NULL;\n\n  /* Loop for as long as is needed */\n  while(lp->spx_status == RUNNING) {\n\n    /* Check for dual and primal feasibility */\n    dualfeasible   = isbb ||\n                     isDualFeasible(lp, lp->epsprimal, boundflip_count, infeasibles, &dualoffset);\n\n    /* Recompute if the dual feasibility check included bound flips */\n    if(is_action(lp->spx_action, ACTION_RECOMPUTE))\n      recompute_solution(lp, INITSOL_USEZERO);\n    primalfeasible = isPrimalFeasible(lp, lp->epsprimal, NULL, &primaloffset);\n\n    if(userabort(lp, -1))\n      break;\n\n    if(lp->spx_trace) {\n      if(primalfeasible)\n        report(lp, NORMAL, \"Start at primal feasible basis\\n\");\n      else if(dualfeasible)\n        report(lp, NORMAL, \"Start at dual feasible basis\\n\");\n      else if(lost_feas_count > 0)\n        report(lp, NORMAL, \"Continuing at infeasible basis\\n\");\n      else\n        report(lp, NORMAL, \"Start at infeasible basis\\n\");\n    }\n\n   /* Now do the simplex magic */\n    if(((lp->simplex_strategy & SIMPLEX_Phase1_DUAL) == 0) ||\n       ((MIP_count(lp) > 0) && (lp->total_iter == 0) &&\n        is_presolve(lp, PRESOLVE_REDUCEMIP))) {\n      if(!lost_feas_state && primalfeasible && ((lp->simplex_strategy & SIMPLEX_Phase2_DUAL) > 0))\n        lp->spx_status = SWITCH_TO_DUAL;\n      else\n        primloop(lp, primalfeasible, 0.0);\n      if(lp->spx_status == SWITCH_TO_DUAL)\n        dualloop(lp, TRUE, NULL, 0.0);\n    }\n    else {\n      if(!lost_feas_state && primalfeasible && ((lp->simplex_strategy & SIMPLEX_Phase2_PRIMAL) > 0))\n        lp->spx_status = SWITCH_TO_PRIMAL;\n      else\n        dualloop(lp, dualfeasible, infeasibles, dualoffset);\n      if(lp->spx_status == SWITCH_TO_PRIMAL)\n        primloop(lp, TRUE, 0.0);\n    }\n\n    /* Check for simplex outcomes that always involve breaking out of the loop;\n       this includes optimality, unboundedness, pure infeasibility (i.e. not\n       loss of feasibility), numerical failure and perturbation-based degeneracy\n       handling */\n    i = lp->spx_status;\n    primalfeasible = (MYBOOL) (i == OPTIMAL);\n    if(primalfeasible || (i == UNBOUNDED))\n      break;\n    else if(((i == INFEASIBLE) && is_anti_degen(lp, ANTIDEGEN_INFEASIBLE)) ||\n             ((i == LOSTFEAS)   && is_anti_degen(lp, ANTIDEGEN_LOSTFEAS)) ||\n             ((i == NUMFAILURE) && is_anti_degen(lp, ANTIDEGEN_NUMFAILURE)) ||\n             ((i == DEGENERATE) && is_anti_degen(lp, ANTIDEGEN_STALLING))) {\n      /* Check if we should not loop here, but do perturbations */\n      if((lp->bb_level <= 1)   || is_anti_degen(lp, ANTIDEGEN_DURINGBB))\n        break;\n\n      /* Assume that accuracy during B&B is high and that infeasibility is \"real\" */\n#ifdef AssumeHighAccuracyInBB\n      if((lp->bb_level > 1) && (i == INFEASIBLE))\n        break;\n#endif\n    }\n\n    /* Check for outcomes that may involve trying another simplex loop */\n    if(lp->spx_status == SINGULAR_BASIS) {\n      lost_feas_state = FALSE;\n      singular_count++;\n      if(singular_count >= DEF_MAXSINGULARITIES) {\n        report(lp, IMPORTANT, \"spx_run: Failure due to too many singular bases.\\n\");\n        lp->spx_status = NUMFAILURE;\n        break;\n      }\n      if(lp->spx_trace || (lp->verbose > DETAILED))\n        report(lp, NORMAL, \"spx_run: Singular basis; attempting to recover.\\n\");\n      lp->spx_status = RUNNING;\n      /* Singular pivots are simply skipped by the inversion, leaving a row's\n         slack variable in the basis instead of the singular user variable. */\n    }\n    else {\n      lost_feas_state = (MYBOOL) (lp->spx_status == LOSTFEAS);\n#if 0\n      /* Optionally handle loss of numerical accuracy as loss of feasibility,\n         but only attempt a single loop to try to recover from this. */\n      lost_feas_state |= (MYBOOL) ((lp->spx_status == NUMFAILURE) && (lost_feas_count < 1));\n#endif\n      if(lost_feas_state) {\n        lost_feas_count++;\n        if(lost_feas_count < DEF_MAXSINGULARITIES) {\n          report(lp, DETAILED, \"spx_run: Recover lost feasibility at iter  %10.0f.\\n\",\n                                (double) get_total_iter(lp));\n          lp->spx_status = RUNNING;\n        }\n        else {\n          report(lp, IMPORTANT, \"spx_run: Lost feasibility %d times - iter %10.0f and %9.0f nodes.\\n\",\n                                lost_feas_count, (double) get_total_iter(lp), (double) lp->bb_totalnodes);\n          lp->spx_status = NUMFAILURE;\n        }\n      }\n    }\n  }\n\n  /* Update iteration tallies before returning */\n  lp->total_iter   += lp->current_iter;\n  lp->current_iter  = 0;\n  lp->total_bswap  += lp->current_bswap;\n  lp->current_bswap = 0;\n  FREE(infeasibles);\n\n  return(lp->spx_status);\n} /* spx_run */\n\nlprec *make_lag(lprec *lpserver)\n{\n  int    i;\n  lprec  *hlp;\n  MYBOOL ret;\n  REAL   *duals;\n\n  /* Create a Lagrangean solver instance */\n  hlp = make_lp(0, lpserver->columns);\n\n  if(hlp != NULL) {\n\n    /* First create and core variable data */\n    set_sense(hlp, is_maxim(lpserver));\n    hlp->lag_bound = lpserver->bb_limitOF;\n    for(i = 1; i <= lpserver->columns; i++) {\n      set_mat(hlp, 0, i, get_mat(lpserver, 0, i));\n      if(is_binary(lpserver, i))\n        set_binary(hlp, i, TRUE);\n      else {\n        set_int(hlp, i, is_int(lpserver, i));\n        set_bounds(hlp, i, get_lowbo(lpserver, i), get_upbo(lpserver, i));\n      }\n    }\n    /* Then fill data for the Lagrangean constraints */\n    hlp->matL = lpserver->matA;\n    inc_lag_space(hlp, lpserver->rows, TRUE);\n    ret = get_ptr_sensitivity_rhs(hlp, &duals, NULL, NULL);\n    for(i = 1; i <= lpserver->rows; i++) {\n      hlp->lag_con_type[i] = get_constr_type(lpserver, i);\n      hlp->lag_rhs[i] = lpserver->orig_rhs[i];\n      hlp->lambda[i] = (ret) ? duals[i - 1] : 0.0;\n    }\n  }\n\n  return(hlp);\n}\n\nSTATIC int heuristics(lprec *lp, int mode)\n/* Initialize / bound a MIP problem */\n{\n  lprec *hlp;\n  int   status = PROCFAIL;\n\n  if(lp->bb_level > 1)\n    return( status );\n\n  status = RUNNING;\n  lp->bb_limitOF = my_chsign(is_maxim(lp), -lp->infinite);\n  if(FALSE && (lp->int_vars > 0)) {\n\n    /* 1. Copy the problem into a new relaxed instance, extracting Lagrangean constraints */\n    hlp = make_lag(lp);\n\n    /* 2. Run the Lagrangean relaxation */\n    status = solve(hlp);\n\n    /* 3. Copy the key results (bound) into the original problem */\n    lp->bb_heuristicOF = hlp->best_solution[0];\n\n    /* 4. Delete the helper heuristic */\n    hlp->matL = NULL;\n    delete_lp(hlp);\n  }\n\n  lp->timeheuristic = timeNow();\n  return( status );\n}\n\nSTATIC int lag_solve(lprec *lp, REAL start_bound, int num_iter)\n{\n  int    i, j, citer, nochange, oldpresolve;\n  MYBOOL LagFeas, AnyFeas, Converged, same_basis;\n  REAL   *OrigObj, *ModObj, *SubGrad, *BestFeasSol;\n  REAL   Zub, Zlb, Znow, Zprev, Zbest, rhsmod, hold;\n  REAL   Phi, StepSize = 0.0, SqrsumSubGrad;\n\n  /* Make sure we have something to work with */\n  if(lp->spx_status != OPTIMAL) {\n    lp->lag_status = NOTRUN;\n    return( lp->lag_status );\n  }\n\n  /* Allocate iteration arrays */\n  if(!allocREAL(lp, &OrigObj, lp->columns + 1, FALSE) ||\n     !allocREAL(lp, &ModObj,  lp->columns + 1, TRUE) ||\n     !allocREAL(lp, &SubGrad, get_Lrows(lp) + 1, TRUE) ||\n     !allocREAL(lp, &BestFeasSol, lp->sum + 1, TRUE)) {\n    lp->lag_status = NOMEMORY;\n     return( lp->lag_status );\n  }\n  lp->lag_status = RUNNING;\n\n  /* Prepare for Lagrangean iterations using results from relaxed problem */\n  oldpresolve = lp->do_presolve;\n  lp->do_presolve = PRESOLVE_NONE;\n  push_basis(lp, NULL, NULL, NULL);\n\n  /* Initialize variables (assume minimization problem in overall structure) */\n  Zlb      = lp->best_solution[0];\n  Zub      = start_bound;\n  Zbest    = Zub;\n  Znow     = Zlb;\n  Zprev    = lp->infinite;\n  rhsmod   = 0;\n\n  Phi      = DEF_LAGCONTRACT; /* In the range 0-2.0 to guarantee convergence */\n/*  Phi      = 0.15; */\n  LagFeas  = FALSE;\n  Converged= FALSE;\n  AnyFeas  = FALSE;\n  citer    = 0;\n  nochange = 0;\n\n  /* Initialize reference and solution vectors; don't bother about the\n     original OF offset since we are maintaining an offset locally. */\n\n/* #define DirectOverrideOF */\n\n  get_row(lp, 0, OrigObj);\n#ifdef DirectOverrideOF\n  set_OF_override(lp, ModObj);\n#endif\n  OrigObj[0] = get_rh(lp, 0);\n  for(i = 1 ; i <= get_Lrows(lp); i++)\n    lp->lambda[i] = 0;\n\n  /* Iterate to convergence, failure or user-specified termination */\n  while((lp->lag_status == RUNNING) && (citer < num_iter)) {\n\n    citer++;\n\n    /* Compute constraint feasibility gaps and associated sum of squares,\n       and determine feasibility over the Lagrangean constraints;\n       SubGrad is the subgradient, which here is identical to the slack. */\n    LagFeas = TRUE;\n    Converged = TRUE;\n    SqrsumSubGrad = 0;\n    for(i = 1; i <= get_Lrows(lp); i++) {\n      hold = lp->lag_rhs[i];\n      for(j = 1; j <= lp->columns; j++)\n        hold -= mat_getitem(lp->matL, i, j) * lp->best_solution[lp->rows + j];\n      if(LagFeas) {\n        if(lp->lag_con_type[i] == EQ) {\n          if(fabs(hold) > lp->epsprimal)\n            LagFeas = FALSE;\n        }\n        else if(hold < -lp->epsprimal)\n          LagFeas = FALSE;\n      }\n      /* Test for convergence and update */\n      if(Converged && (fabs(my_reldiff(hold , SubGrad[i])) > lp->lag_accept))\n        Converged = FALSE;\n      SubGrad[i] = hold;\n      SqrsumSubGrad += hold * hold;\n    }\n    SqrsumSubGrad = sqrt(SqrsumSubGrad);\n#if 1\n    Converged &= LagFeas;\n#endif\n    if(Converged)\n      break;\n\n    /* Modify step parameters and initialize ahead of next iteration */\n    Znow = lp->best_solution[0] - rhsmod;\n    if(Znow > Zub) {\n      /* Handle exceptional case where we overshoot */\n      Phi *= DEF_LAGCONTRACT;\n      StepSize *= (Zub-Zlb) / (Znow-Zlb);\n    }\n    else\n#define LagBasisContract\n#ifdef LagBasisContract\n/*      StepSize = Phi * (Zub - Znow) / SqrsumSubGrad; */\n      StepSize = Phi * (2-DEF_LAGCONTRACT) * (Zub - Znow) / SqrsumSubGrad;\n#else\n      StepSize = Phi * (Zub - Znow) / SqrsumSubGrad;\n#endif\n\n    /* Compute the new dual price vector (Lagrangean multipliers, lambda) */\n    for(i = 1; i <= get_Lrows(lp); i++) {\n      lp->lambda[i] += StepSize * SubGrad[i];\n      if((lp->lag_con_type[i] != EQ) && (lp->lambda[i] > 0)) {\n        /* Handle case where we overshoot and need to correct (see above) */\n        if(Znow < Zub)\n          lp->lambda[i] = 0;\n      }\n    }\n/*    normalizeVector(lp->lambda, get_Lrows(lp)); */\n\n    /* Save the current vector if it is better */\n    if(LagFeas && (Znow < Zbest)) {\n\n      /* Recompute the objective function value in terms of the original values */\n      MEMCOPY(BestFeasSol, lp->best_solution, lp->sum+1);\n      hold = OrigObj[0];\n      for(i = 1; i <= lp->columns; i++)\n        hold += lp->best_solution[lp->rows + i] * OrigObj[i];\n      BestFeasSol[0] = hold;\n      if(lp->lag_trace)\n        report(lp, NORMAL, \"lag_solve: Improved feasible solution at iteration %d of %g\\n\",\n                           citer, hold);\n\n      /* Reset variables */\n      Zbest = Znow;\n      AnyFeas  = TRUE;\n      nochange = 0;\n    }\n    else if(Znow == Zprev) {\n      nochange++;\n      if(nochange > LAG_SINGULARLIMIT) {\n        Phi *= 0.5;\n        nochange = 0;\n      }\n    }\n    Zprev = Znow;\n\n    /* Recompute the objective function values for the next iteration */\n    for(j = 1; j <= lp->columns; j++) {\n      hold = 0;\n      for(i = 1; i <= get_Lrows(lp); i++)\n        hold += lp->lambda[i] * mat_getitem(lp->matL, i, j);\n      ModObj[j] = OrigObj[j] - my_chsign(is_maxim(lp), hold);\n#ifndef DirectOverrideOF\n      set_mat(lp, 0, j, ModObj[j]);\n#endif\n    }\n\n    /* Recompute the fixed part of the new objective function */\n    rhsmod = my_chsign(is_maxim(lp), get_rh(lp, 0));\n    for(i = 1; i <= get_Lrows(lp); i++)\n      rhsmod += lp->lambda[i] * lp->lag_rhs[i];\n\n    /* Print trace/debugging information, if specified */\n    if(lp->lag_trace) {\n      report(lp, IMPORTANT, \"Zub: %10g Zlb: %10g Stepsize: %10g Phi: %10g Feas %d\\n\",\n                 (double) Zub, (double) Zlb, (double) StepSize, (double) Phi, LagFeas);\n      for(i = 1; i <= get_Lrows(lp); i++)\n        report(lp, IMPORTANT, \"%3d SubGrad %10g lambda %10g\\n\",\n                   i, (double) SubGrad[i], (double) lp->lambda[i]);\n      if(lp->sum < 20)\n        print_lp(lp);\n    }\n\n    /* Solve the Lagrangean relaxation, handle failures and compute\n       the Lagrangean objective value, if successful */\n    i = spx_solve(lp);\n    if(lp->spx_status == UNBOUNDED) {\n      if(lp->lag_trace) {\n        report(lp, NORMAL, \"lag_solve: Unbounded solution encountered with this OF:\\n\");\n        for(i = 1; i <= lp->columns; i++)\n          report(lp, NORMAL, RESULTVALUEMASK \" \", (double) ModObj[i]);\n      }\n      goto Leave;\n    }\n    else if((lp->spx_status == NUMFAILURE)   || (lp->spx_status == PROCFAIL) ||\n            (lp->spx_status == USERABORT) || (lp->spx_status == TIMEOUT) ||\n            (lp->spx_status == INFEASIBLE)) {\n      lp->lag_status = lp->spx_status;\n    }\n\n    /* Compare optimal bases and contract if we have basis stationarity */\n#ifdef LagBasisContract\n    same_basis = compare_basis(lp);\n    if(LagFeas &&\n       !same_basis) {\n      pop_basis(lp, FALSE);\n      push_basis(lp, NULL, NULL, NULL);\n      Phi *= DEF_LAGCONTRACT;\n    }\n    if(lp->lag_trace) {\n      report(lp, DETAILED, \"lag_solve: Simplex status code %d, same basis %s\\n\",\n                 lp->spx_status, my_boolstr(same_basis));\n      print_solution(lp, 1);\n    }\n#endif\n  }\n\n  /* Transfer solution values */\n  if(AnyFeas) {\n    lp->lag_bound = my_chsign(is_maxim(lp), Zbest);\n    for(i = 0; i <= lp->sum; i++)\n      lp->solution[i] = BestFeasSol[i];\n    transfer_solution(lp, TRUE);\n    if(!is_maxim(lp))\n      for(i = 1; i <= get_Lrows(lp); i++)\n        lp->lambda[i] = my_flipsign(lp->lambda[i]);\n  }\n\n  /* Do standard postprocessing */\nLeave:\n\n  /* Set status variables and report */\n  if(citer >= num_iter) {\n    if(AnyFeas)\n      lp->lag_status = FEASFOUND;\n    else\n      lp->lag_status = NOFEASFOUND;\n  }\n  else\n    lp->lag_status = lp->spx_status;\n  if(lp->lag_status == OPTIMAL) {\n    report(lp, NORMAL, \"\\nLagrangean convergence achieved in %d iterations\\n\",  citer);\n    i = check_solution(lp, lp->columns,\n                       lp->best_solution, lp->orig_upbo, lp->orig_lowbo, lp->epssolution);\n  }\n  else {\n    report(lp, NORMAL, \"\\nUnsatisfactory convergence achieved over %d Lagrangean iterations.\\n\",\n                       citer);\n    if(AnyFeas)\n      report(lp, NORMAL, \"The best feasible Lagrangean objective function value was %g\\n\",\n                         lp->best_solution[0]);\n  }\n\n  /* Restore the original objective function */\n#ifdef DirectOverrideOF\n  set_OF_override(lp, NULL);\n#else\n  for(i = 1; i <= lp->columns; i++)\n    set_mat(lp, 0, i, OrigObj[i]);\n#endif\n\n  /* ... and then free memory */\n  FREE(BestFeasSol);\n  FREE(SubGrad);\n  FREE(OrigObj);\n  FREE(ModObj);\n  pop_basis(lp, FALSE);\n\n  lp->do_presolve = oldpresolve;\n\n  return( lp->lag_status );\n}\n\nSTATIC int spx_solve(lprec *lp)\n{\n  int       status;\n  MYBOOL    iprocessed;\n\n  lp->total_iter       = 0;\n  lp->total_bswap      = 0;\n  lp->perturb_count    = 0;\n  lp->bb_maxlevel      = 1;\n  lp->bb_totalnodes    = 0;\n  lp->bb_improvements  = 0;\n  lp->bb_strongbranches= 0;\n  lp->is_strongbranch  = FALSE;\n  lp->bb_level         = 0;\n  lp->bb_solutionlevel = 0;\n  lp->best_solution[0] = my_chsign(is_maxim(lp), lp->infinite);\n  if(lp->invB != NULL)\n    lp->bfp_restart(lp);\n\n  lp->spx_status = presolve(lp);\n  if(lp->spx_status == PRESOLVED) {\n    status = lp->spx_status;\n    goto Reconstruct;\n  }\n  else if(lp->spx_status != RUNNING)\n    goto Leave;\n\n  iprocessed = !lp->wasPreprocessed;\n  if(!preprocess(lp) || userabort(lp, -1))\n    goto Leave;\n\n  if(mat_validate(lp->matA)) {\n\n    /* Do standard initializations */\n    lp->solutioncount = 0;\n    lp->real_solution = lp->infinite;\n    set_action(&lp->spx_action, ACTION_REBASE | ACTION_REINVERT);\n    lp->bb_break = FALSE;\n\n    /* Do the call to the real underlying solver (note that\n       run_BB is replaceable with any compatible MIP solver) */\n    status = run_BB(lp);\n\n    /* Restore modified problem */\n    if(iprocessed)\n      postprocess(lp);\n\n    /* Restore data related to presolve (mainly a placeholder as of v5.1) */\nReconstruct:\n    if(!postsolve(lp, status))\n      report(lp, SEVERE, \"spx_solve: Failure during postsolve.\\n\");\n\n    goto Leave;\n  }\n\n  /* If we get here, mat_validate(lp) failed. */\n  if(lp->bb_trace || lp->spx_trace)\n    report(lp, CRITICAL, \"spx_solve: The current LP seems to be invalid\\n\");\n  lp->spx_status = NUMFAILURE;\n\nLeave:\n  lp->timeend = timeNow();\n\n  if((lp->lag_status != RUNNING) && (lp->invB != NULL)) {\n    int       itemp;\n    REAL      test;\n\n    itemp = lp->bfp_nonzeros(lp, TRUE);\n    test = 100;\n    if(lp->total_iter > 0)\n      test *= (REAL) lp->total_bswap/lp->total_iter;\n    report(lp, NORMAL, \"\\n \");\n    report(lp, NORMAL, \"MEMO: lp_solve version %d.%d.%d.%d for %d bit OS, with %d bit REAL variables.\\n\",\n                        MAJORVERSION, MINORVERSION, RELEASE, BUILD, 8*sizeof(void *), 8*sizeof(REAL));\n    report(lp, NORMAL, \"      In the total iteration count %.0f, %.0f (%.1f%%) were bound flips.\\n\",\n                        (double) lp->total_iter, (double) lp->total_bswap, test);\n    report(lp, NORMAL, \"      There were %d refactorizations, %d triggered by time and %d by density.\\n\",\n                        lp->bfp_refactcount(lp, BFP_STAT_REFACT_TOTAL),\n                        lp->bfp_refactcount(lp, BFP_STAT_REFACT_TIMED),\n                        lp->bfp_refactcount(lp, BFP_STAT_REFACT_DENSE));\n    report(lp, NORMAL, \"       ... on average %.1f major pivots per refactorization.\\n\",\n                        get_refactfrequency(lp, TRUE));\n    report(lp, NORMAL, \"      The largest [%s] fact(B) had %d NZ entries, %.1fx largest basis.\\n\",\n                        lp->bfp_name(), itemp, lp->bfp_efficiency(lp));\n    if(lp->perturb_count > 0)\n      report(lp, NORMAL, \"      The bounds were relaxed via perturbations %d times.\\n\",\n                          lp->perturb_count);\n    if(MIP_count(lp) > 0) {\n      if(lp->bb_solutionlevel > 0)\n        report(lp, NORMAL, \"      The maximum B&B level was %d, %.1fx MIP order, %d at the optimal solution.\\n\",\n                        lp->bb_maxlevel, (double) lp->bb_maxlevel / (MIP_count(lp)+lp->int_vars), lp->bb_solutionlevel);\n      else\n        report(lp, NORMAL, \"      The maximum B&B level was %d, %.1fx MIP order, with %.0f nodes explored.\\n\",\n                        lp->bb_maxlevel, (double) lp->bb_maxlevel / (MIP_count(lp)+lp->int_vars), (double) get_total_nodes(lp));\n      if(GUB_count(lp) > 0)\n        report(lp, NORMAL, \"      %d general upper-bounded (GUB) structures were employed during B&B.\\n\",\n                         GUB_count(lp));\n    }\n    report(lp, NORMAL, \"      The constraint matrix inf-norm is %g, with a dynamic range of %g.\\n\",\n                        lp->matA->infnorm, lp->matA->dynrange);\n    report(lp, NORMAL, \"      Time to load data was %.3f seconds, presolve used %.3f seconds,\\n\",\n                        lp->timestart-lp->timecreate, lp->timepresolved-lp->timestart);\n    report(lp, NORMAL, \"       ... %.3f seconds in simplex solver, in total %.3f seconds.\\n\",\n                        lp->timeend-lp->timepresolved, lp->timeend-lp->timecreate);\n  }\n  return( lp->spx_status );\n\n} /* spx_solve */\n\nint lin_solve(lprec *lp)\n{\n  int status = NOTRUN;\n\n  /* Don't do anything in case of an empty model */\n  lp->lag_status = NOTRUN;\n  /* if(get_nonzeros(lp) == 0) { */\n  if(lp->columns == 0) {\n    default_basis(lp);\n    lp->spx_status = NOTRUN;\n    return( /* OPTIMAL */ lp->spx_status);\n  }\n\n  /* Otherwise reset selected arrays before solving */\n  unset_OF_p1extra(lp);\n  free_duals(lp);\n  FREE(lp->drow);\n  FREE(lp->nzdrow);\n  if(lp->bb_cuttype != NULL)\n    freecuts_BB(lp);\n\n  /* Reset/initialize timers */\n  lp->timestart        = timeNow();\n  lp->timeheuristic    = 0;\n  lp->timepresolved    = 0;\n  lp->timeend          = 0;\n\n  /* Do heuristics ahead of solving the model */\n  if(heuristics(lp, AUTOMATIC) != RUNNING)\n    return( INFEASIBLE );\n\n  /* Solve the full, prepared model */\n  status = spx_solve(lp);\n  if((get_Lrows(lp) > 0) && (lp->lag_status == NOTRUN)) {\n    if(status == OPTIMAL)\n      status = lag_solve(lp, lp->bb_heuristicOF, DEF_LAGMAXITERATIONS);\n    else\n      report(lp, IMPORTANT, \"\\nCannot do Lagrangean optimization since root model was not solved.\\n\");\n  }\n\n  /* Reset heuristic in preparation for next run (if any) */\n  lp->bb_heuristicOF = my_chsign(is_maxim(lp), lp->infinite);\n\n  /* Check that correct status code is returned */\n/*\n   peno 26.12.07\n   status was not set to SUBOPTIMAL, only lp->spx_status\n   Bug occured by a change in 5.5.0.10 when  && (lp->bb_totalnodes > 0) was added\n   added status =\n   See UnitTest3\n*/\n/*\n   peno 12.01.08\n   If an integer solution is found with the same objective value as the relaxed solution then\n   searching is stopped. This by setting lp->bb_break. However this resulted in a report of SUBOPTIMAL\n   solution. For this,  && !bb_better(lp, OF_DUALLIMIT, OF_TEST_BE) is added in the test.\n   See UnitTest20\n*/\n  if((lp->spx_status == OPTIMAL) && (lp->bb_totalnodes > 0)) {\n    if((lp->bb_break && !bb_better(lp, OF_DUALLIMIT, OF_TEST_BE)) /* ||\n       ISMASKSET(lp->trace, TRACE_NOBBLIMIT) */)\n    status = lp->spx_status = SUBOPTIMAL;\n  }\n\n  return( status );\n}\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_simplex.h",
    "content": "#ifndef HEADER_lp_simplex\n#define HEADER_lp_simplex\n\n#include \"lp_types.h\"\n\n#define ForceDualSimplexInBB               /* Force use/switch of dual simplex in B&B */\n#define AssumeHighAccuracyInBB    /* No iteration of simplex solves at infeasibility */\n/*#define UseLongStepPruning*/\n/*#define UseLongStepDualPhase1*/\n#define primal_UseRejectionList\n#define dual_UseRejectionList\n#define dual_RemoveBasicFixedVars\n/*#define dual_Phase1PriceEqualities */   /* Force elimination of equality slacks */\n#define AcceptMarginalAccuracy\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* Put function headers here */\nSTATIC int primloop(lprec *lp, MYBOOL primalfeasible, REAL primaloffset);\nSTATIC int dualloop(lprec *lp, MYBOOL dualfeasible, int dualinfeasibles[], REAL dualoffset);\nSTATIC int spx_run(lprec *lp, MYBOOL validInvB);\nSTATIC int spx_solve(lprec *lp);\nSTATIC int lag_solve(lprec *lp, REAL start_bound, int num_iter);\nSTATIC int heuristics(lprec *lp, int mode);\nSTATIC int lin_solve(lprec *lp);\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* HEADER_lp_simplex */\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_solve.def",
    "content": "EXPORTS\r\n   add_SOS\r\n   add_column\r\n   add_columnex\r\n   add_constraint\r\n   add_constraintex\r\n   add_lag_con\r\n   column_in_lp\r\n   copy_lp\r\n   default_basis\r\n   del_column\r\n   del_constraint\r\n   delete_lp\r\n   dualize_lp\r\n   free_lp\r\n   get_Lrows\r\n   get_Ncolumns\r\n   get_Norig_columns\r\n   get_Norig_rows\r\n   get_Nrows\r\n   get_pseudocosts\r\n   get_anti_degen\r\n   get_basis\r\n   get_basiscrash\r\n   get_bb_depthlimit\r\n   get_bb_floorfirst\r\n   get_bb_rule\r\n   get_bounds_tighter\r\n   get_break_at_value\r\n   get_col_name\r\n   get_column\r\n   get_columnex\r\n   get_constr_type\r\n   get_constr_value\r\n   get_constraints\r\n   get_dual_solution\r\n   get_epsb\r\n   get_epsd\r\n   get_epsel\r\n   get_epsint\r\n   get_epsperturb\r\n   get_epspivot\r\n   get_improve\r\n   get_infinite\r\n   get_lambda\r\n   get_lowbo\r\n   get_lp_index\r\n   get_lp_name\r\n   get_mat\r\n   get_mat_byindex\r\n   get_max_level\r\n   get_maxpivot\r\n   get_mip_gap\r\n   get_multiprice\r\n   get_nameindex\r\n   get_negrange\r\n   get_nonzeros\r\n   get_obj_bound\r\n   get_objective\r\n   get_orig_index\r\n   get_origcol_name\r\n   get_origrow_name\r\n   get_partialprice\r\n   get_pivoting\r\n   get_presolve\r\n   get_presolveloops\r\n   get_primal_solution\r\n   get_print_sol\r\n   get_ptr_constraints\r\n   get_ptr_dual_solution\r\n   get_ptr_lambda\r\n   get_ptr_primal_solution\r\n   get_ptr_sensitivity_obj\r\n   get_ptr_sensitivity_objex\r\n   get_ptr_sensitivity_rhs\r\n   get_ptr_variables\r\n   get_rh\r\n   get_rh_range\r\n   get_row\r\n   get_rowex\r\n   get_row_name\r\n   get_scalelimit\r\n   get_scaling\r\n   get_sensitivity_obj\r\n   get_sensitivity_objex\r\n   get_sensitivity_rhs\r\n   get_simplextype\r\n   get_solutioncount\r\n   get_solutionlimit\r\n   get_status\r\n   get_statustext\r\n   get_timeout\r\n   get_total_iter\r\n   get_total_nodes\r\n   get_upbo\r\n   get_var_branch\r\n   get_var_dualresult\r\n   get_var_primalresult\r\n   get_var_priority\r\n   get_variables\r\n   get_verbose\r\n   get_working_objective\r\n   guess_basis\r\n   has_BFP\r\n   has_XLI\r\n   is_SOS_var\r\n   is_add_rowmode\r\n   is_anti_degen\r\n   is_binary\r\n   is_break_at_first\r\n   is_constr_type\r\n   is_debug\r\n   is_feasible\r\n   is_unbounded\r\n   is_infinite\r\n   is_int\r\n   is_integerscaling\r\n   is_lag_trace\r\n   is_maxim\r\n   is_nativeBFP\r\n   is_nativeXLI\r\n   is_negative\r\n   is_obj_in_basis\r\n   is_piv_mode\r\n   is_piv_rule\r\n   is_presolve\r\n   is_scalemode\r\n   is_scaletype\r\n   is_semicont\r\n   is_trace\r\n   is_use_names\r\n   lp_solve_version\r\n   make_lp\r\n   print_constraints\r\n   print_debugdump\r\n   print_duals\r\n   print_lp\r\n   print_objective\r\n   print_scales\r\n   print_solution\r\n   print_str\r\n   print_tableau\r\n   put_abortfunc\r\n   put_bb_nodefunc\r\n   put_bb_branchfunc\r\n   put_logfunc\r\n   put_msgfunc\r\n   read_LP\r\n   read_MPS\r\n   read_XLI\r\n   read_freeMPS\r\n   read_freemps\r\n   read_lp\r\n   read_lpex\r\n   read_mps\r\n   read_basis\r\n   read_params\r\n   reset_basis\r\n   reset_params\r\n   resize_lp\r\n   set_BFP\r\n   set_pseudocosts\r\n   set_XLI\r\n   set_add_rowmode\r\n   set_anti_degen\r\n   set_basis\r\n   set_basiscrash\r\n   set_basisvar\r\n   set_bb_depthlimit\r\n   set_bb_floorfirst\r\n   set_bb_rule\r\n   set_binary\r\n   set_bounds\r\n   set_bounds_tighter\r\n   set_break_at_first\r\n   set_break_at_value\r\n   set_col_name\r\n   set_column\r\n   set_columnex\r\n   set_constr_type\r\n   set_debug\r\n   set_epsb\r\n   set_epsd\r\n   set_epsel\r\n   set_epsint\r\n   set_epslevel\r\n   set_epsperturb\r\n   set_epspivot\r\n   set_unbounded\r\n   set_improve\r\n   set_infinite\r\n   set_int\r\n   set_lag_trace\r\n   set_lowbo\r\n   set_lp_name\r\n   set_mat\r\n   set_maxim\r\n   set_maxpivot\r\n   set_minim\r\n   set_mip_gap\r\n   set_multiprice\r\n   set_negrange\r\n   set_obj\r\n   set_obj_bound\r\n   set_obj_fn\r\n   set_obj_fnex\r\n   set_obj_in_basis\r\n   set_outputfile\r\n   set_outputstream\r\n   set_partialprice\r\n   set_pivoting\r\n   set_preferdual\r\n   set_presolve\r\n   set_print_sol\r\n   set_rh\r\n   set_rh_range\r\n   set_rh_vec\r\n   set_row\r\n   set_row_name\r\n   set_rowex\r\n   set_scalelimit\r\n   set_scaling\r\n   set_semicont\r\n   set_sense\r\n   set_simplextype\r\n   set_solutionlimit\r\n   set_timeout\r\n   set_trace\r\n   set_upbo\r\n   set_use_names\r\n   set_var_branch\r\n   set_var_weights\r\n   set_verbose\r\n   solve\r\n   str_add_column\r\n   str_add_constraint\r\n   str_add_lag_con\r\n   str_set_obj_fn\r\n   str_set_rh_vec\r\n   time_elapsed\r\n   unscale\r\n   write_LP\r\n   write_MPS\r\n   write_XLI\r\n   write_freeMPS\r\n   write_freemps\r\n   MPS_writefileex\r\n   write_lp\r\n   write_lpex\r\n   write_mps\r\n   write_basis\r\n   write_params\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_types.h",
    "content": "#ifndef HEADER_lp_types\n#define HEADER_lp_types\n\n#ifdef WIN32\n  #include <windows.h>\n#endif\n\n/* Define data types                                                         */\n/* ------------------------------------------------------------------------- */\n#ifndef LLONG\n  #if defined __BORLANDC__\n    #define LLONG __int64\n  #elif !defined _MSC_VER || _MSC_VER >= 1310\n    #define LLONG long long\n  #else\n    #define LLONG __int64\n  #endif\n#endif\n\n#ifndef COUNTER\n  #define COUNTER LLONG\n#endif\n\n#ifndef REAL\n  #define REAL    double\n#endif\n\n#ifndef REALXP\n  #if 1\n    #define REALXP long double  /* Set local accumulation variable as long double */\n  #else\n    #define REALXP REAL          /* Set local accumulation as default precision */\n  #endif\n#endif\n\n#ifndef LREAL\n  #if 0\n    #define LREAL long double   /* Set global solution update variable as long double */\n  #else\n    #define LREAL REAL           /* Set global solution update variable as default precision */\n  #endif\n#endif\n\n#define RESULTVALUEMASK \"%18.12g\" /* Set fixed-format real-valued output precision;\n                                  suggested width: ABS(exponent of DEF_EPSVALUE)+6. */\n#define INDEXVALUEMASK  \"%8d\"     /* Set fixed-format integer-valued output width */\n\n#ifndef DEF_STRBUFSIZE\n  #define DEF_STRBUFSIZE   512\n#endif\n#ifndef MAXINT32\n  #define MAXINT32  2147483647\n#endif\n#ifndef MAXUINT32\n  #define MAXUINT32 4294967295\n#endif\n\n#ifndef MAXINT64\n  #if defined _LONGLONG || defined __LONG_LONG_MAX__ || defined LLONG_MAX\n    #define MAXINT64   9223372036854775807ll\n  #else\n    #define MAXINT64   9223372036854775807l\n  #endif\n#endif\n#ifndef MAXUINT64\n  #if defined _LONGLONG || defined __LONG_LONG_MAX__ || defined LLONG_MAX\n    #define MAXUINT64 18446744073709551615ll\n  #else\n    #define MAXUINT64 18446744073709551615l\n  #endif\n#endif\n\n#ifndef CHAR_BIT\n  #define CHAR_BIT  8\n#endif\n#ifndef MYBOOL\n  #define MYBOOL  unsigned char    /* Conserve memory, could be unsigned int */\n#endif\n\n\n/* Constants                                                                 */\n/* ------------------------------------------------------------------------- */\n#ifndef NULL\n  #define NULL                   0\n#endif\n\n/* Byte-sized Booleans and extended options */\n#define FALSE                    0\n#define TRUE                     1\n#define AUTOMATIC                2\n#define DYNAMIC                  4\n\n/* Sorting and comparison constants */\n#define COMP_PREFERCANDIDATE     1\n#define COMP_PREFERNONE          0\n#define COMP_PREFERINCUMBENT    -1\n\n/* Library load status values */\n#define LIB_LOADED               0\n#define LIB_NOTFOUND             1\n#define LIB_NOINFO               2\n#define LIB_NOFUNCTION           3\n#define LIB_VERINVALID           4\n#define LIB_STR_LOADED           \"Successfully loaded\"\n#define LIB_STR_NOTFOUND         \"File not found\"\n#define LIB_STR_NOINFO           \"No version data\"\n#define LIB_STR_NOFUNCTION       \"Missing function header\"\n#define LIB_STR_VERINVALID       \"Incompatible version\"\n#define LIB_STR_MAXLEN           23\n\n\n/* Compiler/target settings                                                  */\n/* ------------------------------------------------------------------------- */\n#if (defined _WIN32) || (defined WIN32) || (defined _WIN64) || (defined WIN64)\n# define __WINAPI WINAPI\n#else\n# define __WINAPI\n#endif\n\n#if (defined _WIN32) || (defined WIN32) || (defined _WIN64) || (defined WIN64)\n# define __VACALL __cdecl\n#else\n# define __VACALL\n#endif\n\n#ifndef __BORLANDC__\n\n  #ifdef _USRDLL\n\n    #if 1\n      #define __EXPORT_TYPE __declspec(dllexport)\n    #else\n     /* Set up for the Microsoft compiler */\n      #ifdef LP_SOLVE_EXPORTS\n        #define __EXPORT_TYPE __declspec(dllexport)\n      #else\n        #define __EXPORT_TYPE __declspec(dllimport)\n      #endif\n    #endif\n\n  #else\n\n    #define __EXPORT_TYPE\n\n  #endif\n\n  #ifdef __cplusplus\n    #define __EXTERN_C extern \"C\"\n  #else\n    #define __EXTERN_C\n  #endif\n\n#else  /* Otherwise set up for the Borland compiler */\n\n  #ifdef __DLL__\n\n    #define _USRDLL\n    #define __EXTERN_C extern \"C\"\n\n    #ifdef __READING_THE_DLL\n      #define __EXPORT_TYPE __import\n    #else\n      #define __EXPORT_TYPE __export\n    #endif\n\n  #else\n\n    #define __EXPORT_TYPE\n    #define __EXTERN_C extern \"C\"\n\n  #endif\n\n#endif\n\n\n#if 0\n  #define STATIC static\n#else\n  #define STATIC\n#endif\n\n#if !defined INLINE\n  #if defined __cplusplus\n    #define INLINE inline\n  #elif (defined _WIN32) || (defined WIN32) || (defined _WIN64) || (defined WIN64)\n    #define INLINE __inline\n  #else\n    #define INLINE static\n  #endif\n#endif\n\n/* Function macros                                                           */\n/* ------------------------------------------------------------------------- */\n#define my_limitrange(x, lo, hi) ((x) < (lo) ? (lo) : ((x) > (hi) ? (hi) : (x)))\n#ifndef my_mod\n  #define my_mod(n, m)          ((n) % (m))\n#endif\n#define my_if(t, x, y)          ((t) ? (x) : (y))\n#define my_sign(x)              ((x) < 0 ? -1 : 1)\n#if 1\n  #define my_chsign(t, x)       ( ((t) && ((x) != 0)) ? -(x) : (x))\n#else\n  #define my_chsign(t, x)       ( (2*((t) == 0) - 1) * (x) )  /* \"Pipelined\", but problem with \"negative zero\" and possible problems on AIX  */\n#endif\n#define my_flipsign(x)          ( fabs((REAL) (x)) == 0 ? 0 : -(x) )\n#define my_roundzero(val, eps)  if (fabs((REAL) (val)) < eps) val = 0\n#define my_avoidtiny(val, eps)  (fabs((REAL) (val)) < eps ? 0 : val)\n\n#if 1\n  #define my_infinite(lp, val)  ( (MYBOOL) (fabs(val) >= lp->infinite) )\n#else\n  #define my_infinite(lp, val)  is_infinite(lp, val)\n#endif\n#define my_inflimit(lp, val)    ( my_infinite(lp, val) ? lp->infinite * my_sign(val) : (val) )\n#if 0\n  #define my_precision(val, eps) ((fabs((REAL) (val))) < (eps) ? 0 : (val))\n#else\n  #define my_precision(val, eps) restoreINT(val, eps)\n#endif\n#define my_reldiff(x, y)       (((x) - (y)) / (1.0 + fabs((REAL) (y))))\n#define my_boundstr(x)         (fabs(x) < lp->infinite ? sprintf(\"%g\",x) : ((x) < 0 ? \"-Inf\" : \"Inf\") )\n#ifndef my_boolstr\n  #define my_boolstr(x)          (!(x) ? \"FALSE\" : \"TRUE\")\n#endif\n#define my_basisstr(isbasic)     ((isbasic) ? \"BASIC\" : \"NON-BASIC\")\n#define my_simplexstr(isdual)    ((isdual) ? \"DUAL\" : \"PRIMAL\")\n#define my_plural_std(count)     (count == 1 ? \"\" : \"s\")\n#define my_plural_y(count)       (count == 1 ? \"y\" : \"ies\")\n#define my_lowbound(x)           ((FULLYBOUNDEDSIMPLEX) ? (x) : 0)\n\n\n/* Bound macros usable for both the standard and fully bounded simplex       */\n/* ------------------------------------------------------------------------- */\n/*\n#define my_lowbo(lp, varnr)      ( lp->isfullybounded ? lp->lowbo[varnr] : 0.0 )\n#define my_upbo(lp, varnr)       ( lp->isfullybounded ? lp->upbo[varnr]  : lp->lowbo[varnr] + lp->upbo[varnr] )\n#define my_rangebo(lp, varnr)    ( lp->isfullybounded ? lp->upbo[varnr] - lp->lowbo[varnr] : lp->upbo[varnr] )\n*/\n#define my_lowbo(lp, varnr)      ( 0.0 )\n#define my_upbo(lp, varnr)       ( lp->lowbo[varnr] + lp->upbo[varnr] )\n#define my_rangebo(lp, varnr)    ( lp->upbo[varnr] )\n\n#define my_unbounded(lp, varnr)  ((lp->upbo[varnr] >= lp->infinite) && (lp->lowbo[varnr] <= -lp->infinite))\n#define my_bounded(lp, varnr)    ((lp->upbo[varnr] < lp->infinite) && (lp->lowbo[varnr] > -lp->infinite))\n\n/* Forward declarations                                                      */\n/* ------------------------------------------------------------------------- */\ntypedef struct _lprec     lprec;\ntypedef struct _INVrec    INVrec;\nunion  QSORTrec;\n\n#ifndef UNIONTYPE\n  #ifdef __cplusplus\n    #define UNIONTYPE\n  #else\n    #define UNIONTYPE union\n  #endif\n#endif\n\n/* B4 factorization optimization data */\ntypedef struct _B4rec\n{\n  int  *B4_var;  /* Position of basic columns in the B4 basis */\n  int  *var_B4;  /* Variable in the B4 basis */\n  int  *B4_row;  /* B4 position of the i'th row */\n  int  *row_B4;  /* Original position of the i'th row */\n  REAL *wcol;\n  int  *nzwcol;\n} B4rec;\n\n#define OBJ_STEPS   5\ntypedef struct _OBJmonrec {\n  lprec  *lp;\n  int    oldpivstrategy,\n         oldpivrule, pivrule, ruleswitches,\n         limitstall[2], limitruleswitches,\n         idxstep[OBJ_STEPS], countstep, startstep, currentstep,\n         Rcycle, Ccycle, Ncycle, Mcycle, Icount;\n  REAL   thisobj, prevobj,\n         objstep[OBJ_STEPS],\n         thisinfeas, previnfeas,\n         epsvalue;\n  char   spxfunc[10];\n  MYBOOL pivdynamic;\n  MYBOOL isdual;\n  MYBOOL active;\n} OBJmonrec;\n\ntypedef struct _edgerec\n{\n  REAL      *edgeVector;\n} edgerec;\n\ntypedef struct _pricerec\n{\n  REAL   theta;\n  REAL   pivot;\n  REAL   epspivot;\n  int    varno;\n  lprec  *lp;\n  MYBOOL isdual;\n} pricerec;\ntypedef struct _multirec\n{\n  lprec    *lp;\n  int      size;                  /* The maximum number of multiply priced rows/columns */\n  int      used;                  /* The current / active number of multiply priced rows/columns */\n  int      limit;                 /* The active/used count at which a full update is triggered */\n  pricerec *items;                /* Array of best multiply priced rows/columns */\n  int      *freeList;             /* The indeces of available positions in \"items\" */\n  UNIONTYPE QSORTrec *sortedList; /* List of pointers to \"pricerec\" items in sorted order */\n  REAL     *stepList;             /* Working array (values in sortedList order) */\n  REAL     *valueList;            /* Working array (values in sortedList order) */\n  int      *indexSet;             /* The final exported index list of pivot variables */\n  int      active;                /* Index of currently active multiply priced row/column */\n  int      retries;\n  REAL     step_base;\n  REAL     step_last;\n  REAL     obj_base;\n  REAL     obj_last;\n  REAL     epszero;\n  REAL     maxpivot;\n  REAL     maxbound;\n  MYBOOL   sorted;\n  MYBOOL   truncinf;\n  MYBOOL   objcheck;\n  MYBOOL   dirty;\n} multirec;\n\n#endif /* HEADER_lp_types */\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_utils.c",
    "content": "#define CODE_lp_utils\n\n#include <string.h>\n#include \"commonlib.h\"\n#include \"lp_lib.h\"\n#include \"lp_utils.h\"\n#include <time.h>\n#include <sys/timeb.h>\n#include \"lp_bit.h\"\n\n#ifdef FORTIFY\n# include \"lp_fortify.h\"\n#endif\n\n\n/*\n    Miscellaneous utilities as implemented for lp_solve v5.0+\n   ----------------------------------------------------------------------------------\n    Author:        Kjell Eikland\n    Contact:       kjell.eikland@broadpark.no\n    License terms: GLPL.\n\n    Requires:      lp_utils.h, lp_lib.h\n\n    Release notes:\n    v1.0.0  1 January 2003      Memory allocation, sorting, searching, time and\n                                doubly linked list functions.\n    v1.1.0  15 May 2004         Added vector packing functionality\n    v1.2.0  10 January 2005     Added vector pushing/popping functionality\n                                Modified return values and fixed problem in\n                                linked list functions.\n\n   ----------------------------------------------------------------------------------\n*/\n\nSTATIC MYBOOL allocCHAR(lprec *lp, char **ptr, int size, MYBOOL clear)\n{\n  if(clear == TRUE)\n    *ptr = (char *) calloc(size, sizeof(**ptr));\n  else if(clear & AUTOMATIC) {\n    *ptr = (char *) realloc(*ptr, size * sizeof(**ptr));\n    if(clear & TRUE)\n      MEMCLEAR(*ptr, size);\n  }\n  else\n    *ptr = (char *) malloc(size * sizeof(**ptr));\n  if(((*ptr) == NULL) && (size > 0)) {\n    lp->report(lp, CRITICAL, \"alloc of %d 'char' failed\\n\", size);\n    lp->spx_status = NOMEMORY;\n    return( FALSE );\n  }\n  else\n    return( TRUE );\n}\nSTATIC MYBOOL allocMYBOOL(lprec *lp, MYBOOL **ptr, int size, MYBOOL clear)\n{\n  if(clear == TRUE)\n    *ptr = (MYBOOL *) calloc(size, sizeof(**ptr));\n  else if(clear & AUTOMATIC) {\n    *ptr = (MYBOOL *) realloc(*ptr, size * sizeof(**ptr));\n    if(clear & TRUE)\n      MEMCLEAR(*ptr, size);\n  }\n  else\n    *ptr = (MYBOOL *) malloc(size * sizeof(**ptr));\n  if(((*ptr) == NULL) && (size > 0)) {\n    lp->report(lp, CRITICAL, \"alloc of %d 'MYBOOL' failed\\n\", size);\n    lp->spx_status = NOMEMORY;\n    return( FALSE );\n  }\n  else\n    return( TRUE );\n}\nSTATIC MYBOOL allocINT(lprec *lp, int **ptr, int size, MYBOOL clear)\n{\n  if(clear == TRUE)\n    *ptr = (int *) calloc(size, sizeof(**ptr));\n  else if(clear & AUTOMATIC) {\n    *ptr = (int *) realloc(*ptr, size * sizeof(**ptr));\n    if(clear & TRUE)\n      MEMCLEAR(*ptr, size);\n  }\n  else\n    *ptr = (int *) malloc(size * sizeof(**ptr));\n  if(((*ptr) == NULL) && (size > 0)) {\n    lp->report(lp, CRITICAL, \"alloc of %d 'INT' failed\\n\", size);\n    lp->spx_status = NOMEMORY;\n    return( FALSE );\n  }\n  else\n    return( TRUE );\n}\nSTATIC MYBOOL allocREAL(lprec *lp, REAL **ptr, int size, MYBOOL clear)\n{\n  if(clear == TRUE)\n    *ptr = (REAL *) calloc(size, sizeof(**ptr));\n  else if(clear & AUTOMATIC) {\n    *ptr = (REAL *) realloc(*ptr, size * sizeof(**ptr));\n    if(clear & TRUE)\n      MEMCLEAR(*ptr, size);\n  }\n  else\n    *ptr = (REAL *) malloc(size * sizeof(**ptr));\n  if(((*ptr) == NULL) && (size > 0)) {\n    lp->report(lp, CRITICAL, \"alloc of %d 'REAL' failed\\n\", size);\n    lp->spx_status = NOMEMORY;\n    return( FALSE );\n  }\n  else\n    return( TRUE );\n}\nSTATIC MYBOOL allocLREAL(lprec *lp, LREAL **ptr, int size, MYBOOL clear)\n{\n  if(clear == TRUE)\n    *ptr = (LREAL *) calloc(size, sizeof(**ptr));\n  else if(clear & AUTOMATIC) {\n    *ptr = (LREAL *) realloc(*ptr, size * sizeof(**ptr));\n    if(clear & TRUE)\n      MEMCLEAR(*ptr, size);\n  }\n  else\n    *ptr = (LREAL *) malloc(size * sizeof(**ptr));\n  if(((*ptr) == NULL) && (size > 0)) {\n    lp->report(lp, CRITICAL, \"alloc of %d 'LREAL' failed\\n\", size);\n    lp->spx_status = NOMEMORY;\n    return( FALSE );\n  }\n  else\n    return( TRUE );\n}\n\nSTATIC MYBOOL allocFREE(lprec *lp, void **ptr)\n{\n  MYBOOL status = TRUE;\n\n  if(*ptr != NULL) {\n    free(*ptr);\n    *ptr = NULL;\n  }\n  else {\n    status = FALSE;\n    lp->report(lp, CRITICAL, \"free() failed on line %d of file %s\\n\",\n                             __LINE__, __FILE__);\n  }\n  return(status);\n}\n\n/* Do hoops to provide debugging info with FORTIFY */\n#undef CODE_lp_utils\n#include \"lp_utils.h\"\n/* alloc-routines should always be before this line! */\n\nint comp_bits(MYBOOL *bitarray1, MYBOOL *bitarray2, int items)\n{\n  int            i, items4, left = 0, right = 0;\n  MYBOOL         comp1;\n  unsigned long comp4;\n\n  /* Convert items count to 8-bit representation, if necessary */\n  if(items > 0) {\n    i = items % 8;\n    items /= 8;\n    if(i)\n      items++;\n  }\n  else\n    items = -items;\n\n  /* Do the wide unsigned integer part for speed */\n  items4 = items / sizeof(unsigned long);\n  i = 0;\n  while(i < items4) {\n    comp4 = ((unsigned long *) bitarray1)[i] &  ~((unsigned long *) bitarray2)[i];\n    if(comp4)\n      left++;\n    comp4 = ((unsigned long *) bitarray2)[i] &  ~((unsigned long *) bitarray1)[i];\n    if(comp4)\n      right++;\n    i++;\n  }\n\n  /* Do the trailing slow narrow unsigned integer part */\n  i *= sizeof(unsigned long);\n  i++;\n  while(i < items) {\n    comp1 = bitarray1[i] & ~bitarray2[i];\n    if(comp1)\n      left++;\n    comp1 = bitarray2[i] & ~bitarray1[i];\n    if(comp1)\n      right++;\n    i++;\n  }\n\n  /* Determine set comparison outcomes */\n  if((left > 0) && (right == 0))         /* array1 is a superset of array2 */\n    i = 1;\n  else if((left == 0) && (right > 0))   /* array2 is a superset of array1 */\n    i = -1;\n  else if((left == 0) && (right == 0))  /* array1 and array2 are identical */\n    i = 0;\n  else\n    i = -2;                              /* indicate all other outcomes */\n  return( i );\n}\n\n\nSTATIC workarraysrec *mempool_create(lprec *lp)\n{\n  workarraysrec *temp;\n  temp = (workarraysrec *) calloc(1, sizeof(workarraysrec));\n  temp->lp = lp;\n  return( temp );\n}\nSTATIC char *mempool_obtainVector(workarraysrec *mempool, int count, int unitsize)\n{\n  char   *newmem = NULL;\n  MYBOOL *bnewmem = NULL;\n  int    *inewmem = NULL, size, i, ib, ie, memMargin = 0;\n  REAL   *rnewmem = NULL;\n\n  /* First find the iso-sized window (binary search) */\n  size = count*unitsize;\n  memMargin += size;\n  ib = 0;\n  ie = mempool->count-1;\n  while(ie >= ib) {\n    i = (ib+ie) / 2;\n    if(abs(mempool->vectorsize[i]) > memMargin)\n      ie = i-1;\n    else if(abs(mempool->vectorsize[i]) < size)\n      ib = i+1;\n    else {\n      /* Find the beginning of the exact-sized array group */\n      do {\n        ib = i;\n        i--;\n      } while((i >= 0) && (abs(mempool->vectorsize[i]) >= size));\n      break;\n    }\n  }\n\n  /* Check if we have a preallocated unused array of sufficient size */\n  ie = mempool->count-1;\n  for(i = ib; i <= ie; i++)\n    if(mempool->vectorsize[i] < 0)\n      break;\n\n  /* Obtain and activate existing, unused vector if we are permitted */\n  if(i <= ie) {\n#ifdef Paranoia\n    if((mempool->vectorsize[i] > 0) || (abs(mempool->vectorsize[i]) < size)) {\n      lprec *lp = mempool->lp;\n      lp->report(lp, SEVERE, \"mempool_obtainVector: Invalid %s existing vector selected\\n\",\n                             (ie < 0 ? \"too small\" : \"occupied\"));\n      lp->spx_status = NOMEMORY;\n      lp->bb_break = TRUE;\n      return( newmem );\n    }\n#endif\n    newmem = mempool->vectorarray[i];\n    mempool->vectorsize[i] *= -1;\n  }\n\n  /* Otherwise allocate a new vector */\n  else if(unitsize == sizeof(MYBOOL)) {\n    allocMYBOOL(mempool->lp, &bnewmem, count, TRUE);\n    newmem = (char *) bnewmem;\n  }\n  else if(unitsize == sizeof(int)) {\n    allocINT(mempool->lp, &inewmem, count, TRUE);\n    newmem = (char *) inewmem;\n  }\n  else if(unitsize == sizeof(REAL)) {\n    allocREAL(mempool->lp, &rnewmem, count, TRUE);\n    newmem = (char *) rnewmem;\n  }\n\n  /* Insert into master array if necessary (maintain sort by ascending size) */\n  if((i > ie) && (newmem != NULL)) {\n    mempool->count++;\n    if(mempool->count >= mempool->size) {\n      mempool->size += 10;\n      mempool->vectorarray = (char **) realloc(mempool->vectorarray,\n                                     sizeof(*(mempool->vectorarray))*mempool->size);\n      mempool->vectorsize  = (int *) realloc(mempool->vectorsize,\n                                     sizeof(*(mempool->vectorsize))*mempool->size);\n    }\n    ie++;\n    i = ie + 1;\n    if(i < mempool->count) {\n      MEMMOVE(mempool->vectorarray+i, mempool->vectorarray+ie, 1);\n      MEMMOVE(mempool->vectorsize+i,  mempool->vectorsize+ie,  1);\n    }\n    mempool->vectorarray[ie] = newmem;\n    mempool->vectorsize[ie]  = size;\n  }\n\n  return( newmem );\n}\nSTATIC MYBOOL mempool_releaseVector(workarraysrec *mempool, char *memvector, MYBOOL forcefree)\n{\n  int i;\n\n#if 0\n  forcefree = TRUE;\n#endif\n\n  for(i = mempool->count-1; i >= 0; i--)\n    if(mempool->vectorarray[i] == memvector)\n      break;\n\n  if((i < 0) || (mempool->vectorsize[i] < 0))\n    return( FALSE );\n\n  if(forcefree) {\n    FREE(mempool->vectorarray[i]);\n    mempool->count--;\n    for(; i < mempool->count; i++)\n      mempool->vectorarray[i] = mempool->vectorarray[i+1];\n  }\n  else\n    mempool->vectorsize[i] *= -1;\n\n  return( TRUE );\n}\nSTATIC MYBOOL mempool_free(workarraysrec **mempool)\n{\n  int i = (*mempool)->count;\n\n  while(i > 0) {\n    i--;\n    if((*mempool)->vectorsize[i] < 0)  /* Handle unused vectors */\n      (*mempool)->vectorsize[i] *= -1;\n    mempool_releaseVector(*mempool, (*mempool)->vectorarray[i], TRUE);\n  }\n  FREE((*mempool)->vectorarray);\n  FREE((*mempool)->vectorsize);\n  FREE(*mempool);\n  return( TRUE );\n}\n\nREAL *cloneREAL(lprec *lp, REAL *origlist, int size)\n{\n  REAL *newlist;\n\n  size += 1;\n  if(allocREAL(lp, &newlist, size, FALSE))\n    MEMCOPY(newlist, origlist, size);\n  return(newlist);\n}\nMYBOOL *cloneMYBOOL(lprec *lp, MYBOOL *origlist, int size)\n{\n  MYBOOL *newlist;\n\n  size += 1;\n  if(allocMYBOOL(lp, &newlist, size, FALSE))\n    MEMCOPY(newlist, origlist, size);\n  return(newlist);\n}\nint *cloneINT(lprec *lp, int *origlist, int size)\n{\n  int *newlist;\n\n  size += 1;\n  if(allocINT(lp, &newlist, size, FALSE))\n    MEMCOPY(newlist, origlist, size);\n  return(newlist);\n}\n\nSTATIC void roundVector(LREAL *myvector, int endpos, LREAL roundzero)\n{\n  if(roundzero > 0)\n    for(; endpos >= 0; myvector++, endpos--)\n      if(fabs(*myvector) < roundzero)\n        *myvector = 0;\n}\n\nSTATIC REAL normalizeVector(REAL *myvector, int endpos)\n/* Scale the ingoing vector so that its norm is unit, and return the original length */\n{\n  int  i;\n  REAL SSQ;\n\n  /* Cumulate squares */\n  SSQ = 0;\n  for(i = 0; i <= endpos; myvector++, i++)\n    SSQ += (*myvector) * (*myvector);\n\n  /* Normalize */\n  SSQ = sqrt(SSQ);\n  if(SSQ > 0)\n    for(myvector--; i > 0; myvector--, i--)\n      (*myvector) /= SSQ;\n\n  return( SSQ );\n}\n\n/* ---------------------------------------------------------------------------------- */\n/* Other general utilities                                                            */\n/* ---------------------------------------------------------------------------------- */\n\nSTATIC void swapINT(int *item1, int *item2)\n{\n  int hold = *item1;\n  *item1 = *item2;\n  *item2 = hold;\n}\n\nSTATIC void swapREAL(REAL *item1, REAL *item2)\n{\n  REAL hold = *item1;\n  *item1 = *item2;\n  *item2 = hold;\n}\n\nSTATIC void swapPTR(void **item1, void **item2)\n{\n  void *hold;\n  hold = *item1;\n  *item1 = *item2;\n  *item2 = hold;\n}\n\n\nSTATIC REAL restoreINT(REAL valREAL, REAL epsilon)\n{\n  REAL valINT, fracREAL, fracABS;\n\n  fracREAL = modf(valREAL, &valINT);\n  fracABS = fabs(fracREAL);\n  if(fracABS < epsilon)\n    return(valINT);\n  else if(fracABS > 1-epsilon) {\n    if(fracREAL < 0)\n      return(valINT-1);\n    else\n      return(valINT+1);\n  }\n  return(valREAL);\n}\n\nSTATIC REAL roundToPrecision(REAL value, REAL precision)\n{\n#if 1\n  REAL  vmod;\n  int   vexp2, vexp10;\n  LLONG sign;\n\n  if(precision == 0)\n    return(value);\n\n  sign  = my_sign(value);\n  value = fabs(value);\n\n  /* Round to integer if possible */\n  if(value < precision)\n    return( 0 );\n  else if(value == floor(value))\n    return( value*sign );\n  else if((value < (REAL) MAXINT64) &&\n     (modf((REAL) (value+precision), &vmod) < precision)) {\n    /* sign *= (LLONG) (value+precision); */\n    sign *= (LLONG) (value+0.5);\n    return( (REAL) sign );\n  }\n\n  /* Optionally round with base 2 representation for additional precision */\n#define roundPrecisionBase2\n#ifdef roundPrecisionBase2\n  value = frexp(value, &vexp2);\n#else\n  vexp2 = 0;\n#endif\n\n  /* Convert to desired precision */\n  vexp10 = (int) log10(value);\n  precision *= pow(10.0, vexp10);\n  modf(value/precision+0.5, &value);\n  value *= sign*precision;\n\n  /* Restore base 10 representation if base 2 was active */\n  if(vexp2 != 0)\n    value = ldexp(value, vexp2);\n#endif\n\n  return( value );\n}\n\n\n/* ---------------------------------------------------------------------------------- */\n/* Searching function specialized for lp_solve                                        */\n/* ---------------------------------------------------------------------------------- */\nSTATIC int searchFor(int target, int *attributes, int size, int offset, MYBOOL absolute)\n{\n  int beginPos, endPos;\n  int newPos, match;\n\n /* Set starting and ending index offsets */\n  beginPos = offset;\n  endPos = beginPos + size - 1;\n\n /* Do binary search logic based on a sorted attribute vector */\n  newPos = (beginPos + endPos) / 2;\n  match = attributes[newPos];\n  if(absolute)\n    match = abs(match);\n  while(endPos - beginPos > LINEARSEARCH) {\n    if(match < target) {\n      beginPos = newPos + 1;\n      newPos = (beginPos + endPos) / 2;\n      match = attributes[newPos];\n      if(absolute)\n        match = abs(match);\n    }\n    else if(match > target) {\n      endPos = newPos - 1;\n      newPos = (beginPos + endPos) / 2;\n      match = attributes[newPos];\n      if(absolute)\n        match = abs(match);\n    }\n    else {\n      beginPos = newPos;\n      endPos = newPos;\n    }\n  }\n\n /* Do linear (unsorted) search logic */\n  if(endPos - beginPos <= LINEARSEARCH) {\n    match = attributes[beginPos];\n    if(absolute)\n      match = abs(match);\n      while((beginPos < endPos) && (match != target)) {\n        beginPos++;\n        match = attributes[beginPos];\n        if(absolute)\n          match = abs(match);\n      }\n      if(match == target)\n        endPos = beginPos;\n  }\n\n /* Return the index if a match was found, or signal failure with a -1 */\n  if((beginPos == endPos) && (match == target))\n    return(beginPos);\n  else\n    return(-1);\n\n}\n\n\n/* ---------------------------------------------------------------------------------- */\n/* Other supporting math routines                                                     */\n/* ---------------------------------------------------------------------------------- */\n\nSTATIC MYBOOL isINT(lprec *lp, REAL value)\n{\n#if 0\n  return( (MYBOOL) (modf(fabs(value)+lp->epsint, &value) < 2*lp->epsint) );\n#elif 1\n  value = fabs(value)+lp->epsint;\n  return( (MYBOOL) (my_reldiff(value, floor(value)) < 2*lp->epsint) );\n#elif 0\n  REAL hold;\n  value = fabs(value);\n  hold = pow(10, MIN(-2, log10(value+1)+log10(lp->epsint)));\n  return( (MYBOOL) (modf(value+lp->epsint, &value) < 2*hold) );\n#elif 0\n  value -= (REAL)floor(value);\n  return( (MYBOOL) ((value < lp->epsint) || (value > (1 - lp->epsint)) );\n#else\n  value += lp->epsint;\n  return( (MYBOOL) (fabs(value-floor(value)) < 2*lp->epsint) );\n#endif\n}\n\nSTATIC MYBOOL isOrigFixed(lprec *lp, int varno)\n{\n  return( (MYBOOL) (lp->orig_upbo[varno] - lp->orig_lowbo[varno] <= lp->epsmachine) );\n}\n\nSTATIC void chsign_bounds(REAL *lobound, REAL *upbound)\n{\n  REAL temp;\n  temp = *upbound;\n  if(fabs(*lobound) > 0)\n    *upbound = -(*lobound);\n  else\n    *upbound = 0;\n  if(fabs(temp) > 0)\n    *lobound = -temp;\n  else\n    *lobound = 0;\n}\n\n\n/* ---------------------------------------------------------------------------------- */\n/* Define randomization routine                                                       */\n/* ---------------------------------------------------------------------------------- */\nSTATIC REAL rand_uniform(lprec *lp, REAL range)\n{\n  static MYBOOL randomized = FALSE; /* static ok here for reentrancy/multithreading */\n\n  if(!randomized) {\n    randomized = TRUE;\n    srand((unsigned) time( NULL ));\n  }\n  range *= (REAL) rand() / (REAL) RAND_MAX;\n  return( range );\n}\n\n\n/* ---------------------------------------------------------------------------------- */\n/* Define routines for doubly linked lists of integers                                */\n/* ---------------------------------------------------------------------------------- */\n\nSTATIC int createLink(int size, LLrec **linkmap, MYBOOL *usedpos)\n{\n  int i, j;\n  MYBOOL reverse;\n\n  *linkmap = (LLrec *) calloc(1, sizeof(**linkmap));\n  if(*linkmap == NULL)\n    return( -1 );\n\n  reverse = (MYBOOL) (size < 0);\n  if(reverse)\n    size = -size;\n  (*linkmap)->map = (int *) calloc(2*(size + 1), sizeof(int));\n  if((*linkmap)->map == NULL)\n    return( -1 );\n\n  (*linkmap)->size = size;\n  j = 0;\n  if(usedpos == NULL)\n    (*linkmap)->map[0] = 0;\n  else {\n    for(i = 1; i <= size; i++)\n      if(!usedpos[i] ^ reverse) {\n        /* Set the forward link */\n        (*linkmap)->map[j] = i;\n        /* Set the backward link */\n        (*linkmap)->map[size+i] = j;\n        j = i;\n        if((*linkmap)->count == 0)\n          (*linkmap)->firstitem = i;\n        (*linkmap)->lastitem = i;\n        (*linkmap)->count++;\n      }\n  }\n  (*linkmap)->map[2*size+1] = j;\n\n  return( (*linkmap)->count );\n}\n\nSTATIC MYBOOL freeLink(LLrec **linkmap)\n{\n  MYBOOL status = TRUE;\n\n  if((linkmap == NULL) || (*linkmap == NULL))\n    status = FALSE;\n  else {\n    if((*linkmap)->map != NULL)\n      free((*linkmap)->map);\n    free(*linkmap);\n    *linkmap = NULL;\n  }\n  return( status );\n}\n\nSTATIC int sizeLink(LLrec *linkmap)\n{\n  return(linkmap->size);\n}\n\nSTATIC MYBOOL isActiveLink(LLrec *linkmap, int itemnr)\n{\n  if((linkmap->map[itemnr] != 0) ||\n     (linkmap->map[linkmap->size+itemnr] != 0) ||\n     (linkmap->map[0] == itemnr))\n    return( TRUE );\n  else\n    return( FALSE );\n}\n\nSTATIC int countActiveLink(LLrec *linkmap)\n{\n  return(linkmap->count);\n}\n\nSTATIC int countInactiveLink(LLrec *linkmap)\n{\n  return(linkmap->size-linkmap->count);\n}\n\nSTATIC int firstActiveLink(LLrec *linkmap)\n{\n  return(linkmap->map[0]);\n}\n\nSTATIC int lastActiveLink(LLrec *linkmap)\n{\n  return(linkmap->map[2*linkmap->size+1]);\n}\n\nSTATIC MYBOOL appendLink(LLrec *linkmap, int newitem)\n{\n  int k, size;\n  size = linkmap->size;\n\n  if(linkmap->map[newitem] != 0)\n    return( FALSE );\n\n  /* Link forward */\n  k = linkmap->map[2*size+1];\n  linkmap->map[k] = newitem;\n\n  /* Link backward */\n  linkmap->map[size+newitem] = k;\n  linkmap->map[2*size+1] = newitem;\n\n  /* Update count and return */\n  if(linkmap->count == 0)\n    linkmap->firstitem = newitem;\n  linkmap->lastitem = newitem;\n  linkmap->count++;\n\n  return( TRUE );\n}\n\nSTATIC MYBOOL insertLink(LLrec *linkmap, int afteritem, int newitem)\n{\n  int k, size;\n\n  size = linkmap->size;\n\n  if(linkmap->map[newitem] != 0)\n    return( FALSE );\n\n  if(afteritem == linkmap->map[2*size+1])\n    appendLink(linkmap, newitem);\n  else {\n    /* Link forward */\n    k = linkmap->map[afteritem];\n    linkmap->map[afteritem] = newitem;\n    linkmap->map[newitem] = k;\n\n    /* Link backward */\n    linkmap->map[size+k] = newitem;\n    linkmap->map[size+newitem] = afteritem;\n\n    /* Update count */\n    SETMIN(linkmap->firstitem, newitem);\n    SETMAX(linkmap->lastitem, newitem);\n    linkmap->count++;\n  }\n\n  return( TRUE );\n}\n\nSTATIC MYBOOL setLink(LLrec *linkmap, int newitem)\n{\n  if(isActiveLink(linkmap, newitem))\n    return( FALSE );\n  else\n    return( insertLink(linkmap, prevActiveLink(linkmap, newitem), newitem) );\n}\n\nSTATIC MYBOOL fillLink(LLrec *linkmap)\n{\n  int k, size;\n  size = linkmap->size;\n\n  k = firstActiveLink(linkmap);\n  if(k != 0)\n    return( FALSE );\n  for(k = 1; k <= size; k++)\n    appendLink(linkmap, k);\n  return( TRUE );\n}\n\nSTATIC int nextActiveLink(LLrec *linkmap, int backitemnr)\n{\n  if((backitemnr < 0) || (backitemnr > linkmap->size))\n    return( -1 );\n  else {\n    if(backitemnr < linkmap->lastitem)\n    while((backitemnr > linkmap->firstitem) && (linkmap->map[backitemnr] == 0))\n      backitemnr--;\n    return(linkmap->map[backitemnr]);\n  }\n}\n\nSTATIC int prevActiveLink(LLrec *linkmap, int forwitemnr)\n{\n  if((forwitemnr <= 0) || (forwitemnr > linkmap->size+1))\n    return( -1 );\n  else {\n    if(forwitemnr > linkmap->lastitem)\n      return( linkmap->lastitem);\n    if(forwitemnr > linkmap->firstitem) {\n      forwitemnr += linkmap->size;\n      while((forwitemnr < linkmap->size + linkmap->lastitem) && (linkmap->map[forwitemnr] == 0))\n        forwitemnr++;\n    }\n    else\n      forwitemnr += linkmap->size;\n    return(linkmap->map[forwitemnr]);\n  }\n}\n\nSTATIC int firstInactiveLink(LLrec *linkmap)\n{\n  int i, n;\n\n  if(countInactiveLink(linkmap) == 0)\n    return( 0 );\n  n = 1;\n  i = firstActiveLink(linkmap);\n  while(i == n) {\n    n++;\n    i = nextActiveLink(linkmap, i);\n  }\n  return( n );\n}\n\nSTATIC int lastInactiveLink(LLrec *linkmap)\n{\n  int i, n;\n\n  if(countInactiveLink(linkmap) == 0)\n    return( 0 );\n  n = linkmap->size;\n  i = lastActiveLink(linkmap);\n  while(i == n) {\n    n--;\n    i = prevActiveLink(linkmap, i);\n  }\n  return( n );\n}\n\nSTATIC int nextInactiveLink(LLrec *linkmap, int backitemnr)\n{\n  do {\n    backitemnr++;\n  } while((backitemnr <= linkmap->size) && isActiveLink(linkmap, backitemnr));\n  if(backitemnr <= linkmap->size)\n    return( backitemnr );\n  else\n    return( 0 );\n}\n\nSTATIC int prevInactiveLink(LLrec *linkmap, int forwitemnr)\n{\n  return( 0 );\n}\n\nSTATIC int removeLink(LLrec *linkmap, int itemnr)\n{\n  int size, prevnr, nextnr = -1;\n\n  size = linkmap->size;\n  if((itemnr <= 0) || (itemnr > size))\n    return( nextnr );\n#ifdef Paranoia\n  if(!isActiveLink(linkmap, itemnr))\n    return( nextnr );\n#endif\n\n  /* Get link data at the specified position */\n  nextnr = linkmap->map[itemnr];\n  prevnr = linkmap->map[size+itemnr];\n  if(itemnr == linkmap->firstitem)\n    linkmap->firstitem = nextnr;\n  if(itemnr == linkmap->lastitem)\n    linkmap->lastitem = prevnr;\n\n  /* Update forward link */\n  linkmap->map[prevnr] = linkmap->map[itemnr];\n  linkmap->map[itemnr] = 0;\n\n  /* Update backward link */\n  if(nextnr == 0)\n    linkmap->map[2*size+1] = prevnr;\n  else\n    linkmap->map[size+nextnr] = linkmap->map[size+itemnr];\n  linkmap->map[size+itemnr] = 0;\n\n  /* Decrement the count */\n  linkmap->count--;\n\n  /* Return the next active item */\n  return( nextnr );\n}\n\nSTATIC LLrec *cloneLink(LLrec *sourcemap, int newsize, MYBOOL freesource)\n{\n  LLrec *testmap = NULL;\n\n  if((newsize == sourcemap->size) || (newsize <= 0)) {\n    createLink(sourcemap->size, &testmap, NULL);\n    MEMCOPY(testmap->map, sourcemap->map, 2*(sourcemap->size+1));\n    testmap->firstitem = sourcemap->firstitem;\n    testmap->lastitem = sourcemap->lastitem;\n    testmap->size = sourcemap->size;\n    testmap->count = sourcemap->count;\n  }\n  else {\n    int j;\n\n    createLink(newsize, &testmap, NULL);\n    for(j = firstActiveLink(sourcemap); (j != 0) && (j <= newsize); j = nextActiveLink(sourcemap, j))\n      appendLink(testmap, j);\n  }\n  if(freesource)\n    freeLink(&sourcemap);\n\n  return(testmap);\n}\n\nSTATIC int compareLink(LLrec *linkmap1, LLrec *linkmap2)\n{\n  int test;\n\n  test = memcmp(&linkmap1->size, &linkmap2->size, sizeof(int));\n  if(test == 0)\n    test = memcmp(&linkmap1->count, &linkmap2->count, sizeof(int));\n    if(test == 0)\n      test = memcmp(linkmap1->map, linkmap2->map, sizeof(int)*(2*linkmap1->size+1));\n\n  return( test );\n}\n\nSTATIC MYBOOL verifyLink(LLrec *linkmap, int itemnr, MYBOOL doappend)\n{\n  LLrec *testmap;\n\n  testmap = cloneLink(linkmap, -1, FALSE);\n  if(doappend) {\n    appendLink(testmap, itemnr);\n    removeLink(testmap, itemnr);\n  }\n  else {\n    int previtem = prevActiveLink(testmap, itemnr);\n    removeLink(testmap, itemnr);\n    insertLink(testmap, previtem, itemnr);\n  }\n  itemnr = compareLink(linkmap, testmap);\n  freeLink(&testmap);\n  return((MYBOOL) (itemnr == 0));\n}\n\n/* Packed vector routines */\nSTATIC PVrec *createPackedVector(int size, REAL *values, int *workvector)\n{\n  int      i, k;\n  REGISTER REAL  ref;\n  PVrec    *newPV = NULL;\n  MYBOOL   localWV = (MYBOOL) (workvector == NULL);\n\n  if(localWV)\n    workvector = (int *) malloc((size+1)*sizeof(*workvector));\n\n  /* Tally equal-valued vector entries - also check if it is worth compressing */\n  k = 0;\n  workvector[k] = 1;\n  ref = values[1];\n  for(i = 2; i <= size; i++) {\n    if(fabs(ref - values[i]) > DEF_EPSMACHINE) {\n      k++;\n      workvector[k] = i;\n      ref = values[i];\n    }\n  }\n  if(k > size / 2) {\n    if(localWV)\n      FREE(workvector);\n    return( newPV );\n  }\n\n  /* Create the packing object, adjust the position vector and allocate value vector */\n  newPV = (PVrec *) malloc(sizeof(*newPV));\n  k++;                            /* Adjust from index to to count */\n  newPV->count = k;\n  if(localWV)\n    newPV->startpos = (int *) realloc(workvector, (k + 1)*sizeof(*(newPV->startpos)));\n  else {\n    newPV->startpos = (int *) malloc((k + 1)*sizeof(*(newPV->startpos)));\n    MEMCOPY(newPV->startpos, workvector, k);\n  }\n  newPV->startpos[k] = size + 1;  /* Store terminal index + 1 for searching purposes */\n  newPV->value = (REAL *) malloc(k*sizeof(*(newPV->value)));\n\n  /* Fill the values vector before returning */\n  for(i = 0; i < k; i++)\n    newPV->value[i] = values[newPV->startpos[i]];\n\n  return( newPV );\n}\n\nSTATIC MYBOOL unpackPackedVector(PVrec *PV, REAL **target)\n{\n  int      i, ii, k;\n  REGISTER REAL ref;\n\n  /* Test for validity of the target and create it if necessary */\n  if(target == NULL)\n    return( FALSE );\n  if(*target == NULL)\n    allocREAL(NULL, target, PV->startpos[PV->count], FALSE);\n\n  /* Expand the packed vector into the target */\n  i = PV->startpos[0];\n  for(k = 0; k < PV->count; k++) {\n    ii = PV->startpos[k+1];\n    ref = PV->value[k];\n    while (i < ii) {\n      (*target)[i] = ref;\n      i++;\n    }\n  }\n  return( TRUE );\n}\n\nSTATIC REAL getvaluePackedVector(PVrec *PV, int index)\n{\n  index = searchFor(index, PV->startpos, PV->count, 0, FALSE);\n  index = abs(index)-1;\n  if(index >= 0)\n    return( PV->value[index] );\n  else\n    return( 0 );\n}\n\nSTATIC MYBOOL freePackedVector(PVrec **PV)\n{\n  if((PV == NULL) || (*PV == NULL))\n    return( FALSE );\n\n  FREE((*PV)->value);\n  FREE((*PV)->startpos);\n  FREE(*PV);\n  return( TRUE );\n}\n\nSTATIC void pushPackedVector(PVrec *PV, PVrec *parent)\n{\n  PV->parent = parent;\n}\n\nSTATIC PVrec *popPackedVector(PVrec *PV)\n{\n  PVrec *parent = PV->parent;\n  freePackedVector(&PV);\n  return( parent );\n}\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_utils.h",
    "content": "#ifndef HEADER_lp_utils\n#define HEADER_lp_utils\n\n#ifdef FORTIFY\n\n#include \"lp_fortify.h\"\n\n#define allocCHAR allocCHAR_FORTIFY\n#define allocMYBOOL allocMYBOOL_FORTIFY\n#define allocINT allocINT_FORTIFY\n#define allocREAL allocREAL_FORTIFY\n#define allocLREAL allocLREAL_FORTIFY\n\n#endif\n\n#include \"lp_types.h\"\n\n/* Temporary data storage arrays */\ntypedef struct _workarraysrec\n{\n  lprec     *lp;\n  int       size;\n  int       count;\n  char      **vectorarray;\n  int       *vectorsize;\n} workarraysrec;\n\ntypedef struct _LLrec\n{\n  int       size;               /* The allocated list size */\n  int       count;              /* The current entry count */\n  int       firstitem;\n  int       lastitem;\n  int       *map;               /* The list of forward and backward-mapped entries */\n} LLrec;\n\ntypedef struct _PVrec\n{\n  int       count;              /* The allocated list item count */\n  int       *startpos;          /* Starting index of the current value */\n  REAL      *value;             /* The list of forward and backward-mapped entries */\n  struct   _PVrec *parent;     /* The parent record in a pushed chain */\n} PVrec;\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* Put function headers here */\nSTATIC MYBOOL allocCHAR(lprec *lp, char **ptr, int size, MYBOOL clear);\nSTATIC MYBOOL allocMYBOOL(lprec *lp, MYBOOL **ptr, int size, MYBOOL clear);\nSTATIC MYBOOL allocINT(lprec *lp, int **ptr, int size, MYBOOL clear);\nSTATIC MYBOOL allocREAL(lprec *lp, REAL **ptr, int size, MYBOOL clear);\nSTATIC MYBOOL allocLREAL(lprec *lp, LREAL **ptr, int size, MYBOOL clear);\nSTATIC MYBOOL allocFREE(lprec *lp, void **ptr);\nREAL *cloneREAL(lprec *lp, REAL *origlist, int size);\nMYBOOL *cloneMYBOOL(lprec *lp, MYBOOL *origlist, int size);\nint *cloneINT(lprec *lp, int *origlist, int size);\n\nint comp_bits(MYBOOL *bitarray1, MYBOOL *bitarray2, int items);\n\nSTATIC workarraysrec *mempool_create(lprec *lp);\nSTATIC char *mempool_obtainVector(workarraysrec *mempool, int count, int unitsize);\nSTATIC MYBOOL mempool_releaseVector(workarraysrec *mempool, char *memvector, MYBOOL forcefree);\nSTATIC MYBOOL mempool_free(workarraysrec **mempool);\n\nSTATIC void roundVector(LREAL *myvector, int endpos, LREAL roundzero);\nSTATIC REAL normalizeVector(REAL *myvector, int endpos);\n\nSTATIC void swapINT(int *item1, int *item2);\nSTATIC void swapREAL(REAL *item1, REAL *item2);\nSTATIC void swapPTR(void **item1, void **item2);\nSTATIC REAL restoreINT(REAL valREAL, REAL epsilon);\nSTATIC REAL roundToPrecision(REAL value, REAL precision);\n\nSTATIC int searchFor(int target, int *attributes, int size, int offset, MYBOOL absolute);\n\nSTATIC MYBOOL isINT(lprec *lp, REAL value);\nSTATIC MYBOOL isOrigFixed(lprec *lp, int varno);\nSTATIC void chsign_bounds(REAL *lobound, REAL *upbound);\nSTATIC REAL rand_uniform(lprec *lp, REAL range);\n\n/* Doubly linked list routines */\nSTATIC int createLink(int size, LLrec **linkmap, MYBOOL *usedpos);\nSTATIC MYBOOL freeLink(LLrec **linkmap);\nSTATIC int sizeLink(LLrec *linkmap);\nSTATIC MYBOOL isActiveLink(LLrec *linkmap, int itemnr);\nSTATIC int countActiveLink(LLrec *linkmap);\nSTATIC int countInactiveLink(LLrec *linkmap);\nSTATIC int firstActiveLink(LLrec *linkmap);\nSTATIC int lastActiveLink(LLrec *linkmap);\nSTATIC MYBOOL appendLink(LLrec *linkmap, int newitem);\nSTATIC MYBOOL insertLink(LLrec *linkmap, int afteritem, int newitem);\nSTATIC MYBOOL setLink(LLrec *linkmap, int newitem);\nSTATIC MYBOOL fillLink(LLrec *linkmap);\nSTATIC int nextActiveLink(LLrec *linkmap, int backitemnr);\nSTATIC int prevActiveLink(LLrec *linkmap, int forwitemnr);\nSTATIC int firstInactiveLink(LLrec *linkmap);\nSTATIC int lastInactiveLink(LLrec *linkmap);\nSTATIC int nextInactiveLink(LLrec *linkmap, int backitemnr);\nSTATIC int prevInactiveLink(LLrec *linkmap, int forwitemnr);\nSTATIC int removeLink(LLrec *linkmap, int itemnr);\nSTATIC LLrec *cloneLink(LLrec *sourcemap, int newsize, MYBOOL freesource);\nSTATIC int compareLink(LLrec *linkmap1, LLrec *linkmap2);\nSTATIC MYBOOL verifyLink(LLrec *linkmap, int itemnr, MYBOOL doappend);\n\n/* Packed vector routines */\nSTATIC PVrec  *createPackedVector(int size, REAL *values, int *workvector);\nSTATIC void   pushPackedVector(PVrec *PV, PVrec *parent);\nSTATIC MYBOOL unpackPackedVector(PVrec *PV, REAL **target);\nSTATIC REAL   getvaluePackedVector(PVrec *PV, int index);\nSTATIC PVrec  *popPackedVector(PVrec *PV);\nSTATIC MYBOOL freePackedVector(PVrec **PV);\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* HEADER_lp_utils */\n\n#ifdef FORTIFY\n\n#if defined CODE_lp_utils && !defined CODE_lp_utils_\nint _Fortify_ret;\n#else\nextern int _Fortify_ret;\n#endif\n\n#ifdef CODE_lp_utils\n#define CODE_lp_utils_\n#else\n# undef allocCHAR\n# undef allocMYBOOL\n# undef allocINT\n# undef allocREAL\n# undef allocLREAL\n# define allocCHAR(lp, ptr, size, clear) (Fortify_LINE(__LINE__), Fortify_FILE(__FILE__), _Fortify_ret = allocCHAR_FORTIFY(lp, ptr, size, clear), Fortify_LINE(0), Fortify_FILE(NULL), _Fortify_ret)\n# define allocMYBOOL(lp, ptr, size, clear) (Fortify_LINE(__LINE__), Fortify_FILE(__FILE__), _Fortify_ret = allocMYBOOL_FORTIFY(lp, ptr, size, clear), Fortify_LINE(0), Fortify_FILE(NULL), _Fortify_ret)\n# define allocINT(lp, ptr, size, clear) (Fortify_LINE(__LINE__), Fortify_FILE(__FILE__), _Fortify_ret = allocINT_FORTIFY(lp, ptr, size, clear), Fortify_LINE(0), Fortify_FILE(NULL), _Fortify_ret)\n# define allocREAL(lp, ptr, size, clear) (Fortify_LINE(__LINE__), Fortify_FILE(__FILE__), _Fortify_ret = allocREAL_FORTIFY(lp, ptr, size, clear), Fortify_LINE(0), Fortify_FILE(NULL), _Fortify_ret)\n# define allocLREAL(lp, ptr, size, clear) (Fortify_LINE(__LINE__), Fortify_FILE(__FILE__), _Fortify_ret = allocLREAL_FORTIFY(lp, ptr, size, clear), Fortify_LINE(0), Fortify_FILE(NULL), _Fortify_ret)\n#endif\n\n#endif\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_wlp.c",
    "content": "\n#include <stdio.h>\n#include <stdarg.h>\n#include <string.h>\n\n#include \"commonlib.h\"\n#include \"lp_lib.h\"\n#include \"lp_scale.h\"\n#include \"lp_utils.h\"\n#include \"lp_report.h\"\n#include \"lp_wlp.h\"\n\n#ifdef FORTIFY\n# include \"lp_fortify.h\"\n#endif\n\n/* Define buffer-size controled function mapping */\n# if defined _MSC_VER\n#  define vsnprintf _vsnprintf\n# endif\n\n/* ------------------------------------------------------------------------- */\n/* Input and output of lp format model files for lp_solve                    */\n/* ------------------------------------------------------------------------- */\n\nstatic int write_data(void *userhandle, write_modeldata_func write_modeldata, char *format, ...)\n{\n  char buff[DEF_STRBUFSIZE+1];\n  va_list ap;\n  int n;\n\n  va_start(ap, format);\n  vsnprintf(buff, DEF_STRBUFSIZE, format, ap);\n  va_end(ap);\n  n = write_modeldata(userhandle, buff);\n  return(n);\n}\n\nSTATIC void write_lpcomment(void *userhandle, write_modeldata_func write_modeldata, char *string, MYBOOL newlinebefore)\n{\n  write_data(userhandle, write_modeldata, \"%s/* %s */\\n\", (newlinebefore) ? \"\\n\" : \"\", string);\n}\n\nSTATIC int write_lprow(lprec *lp, int rowno, void *userhandle, write_modeldata_func write_modeldata, int maxlen, int *idx, REAL *val)\n{\n  int     i, j, nchars, elements;\n  REAL    a;\n  MYBOOL  first = TRUE;\n  char    buf[50];\n\n  elements = get_rowex(lp, rowno, val, idx);\n  if(write_modeldata != NULL) {\n    nchars = 0;\n    for(i = 0; i < elements; i++) {\n      j = idx[i];\n      if(is_splitvar(lp, j))\n        continue;\n      a = val[i];\n      if(!first)\n        nchars += write_data(userhandle, write_modeldata, \" \");\n      else\n        first = FALSE;\n      sprintf(buf, \"%+.12g\", (double)a);\n      if(strcmp(buf, \"-1\") == 0)\n        nchars += write_data(userhandle, write_modeldata, \"-\");\n      else if(strcmp(buf, \"+1\") == 0)\n        nchars += write_data(userhandle, write_modeldata, \"+\");\n      else\n        nchars += write_data(userhandle, write_modeldata, \"%s \", buf);\n      nchars += write_data(userhandle, write_modeldata, \"%s\", get_col_name(lp, j));\n      /* Check if we should add a linefeed */\n      if((maxlen > 0) && (nchars >= maxlen) && (i < elements-1)) {\n        write_data(userhandle, write_modeldata, \"%s\", \"\\n\");\n        nchars = 0;\n      }\n    }\n  }\n  return(elements);\n}\n\n#if !defined LP_MAXLINELEN\n# define LP_MAXLINELEN 100\n#endif\n\nMYBOOL __WINAPI write_lpex(lprec *lp, void *userhandle, write_modeldata_func write_modeldata)\n{\n  int    i, j, b,\n         nrows = lp->rows,\n         ncols = lp->columns,\n         nchars, maxlen = LP_MAXLINELEN,\n         *idx;\n  MYBOOL ok;\n  REAL   a, *val;\n  char   *ptr;\n\n  if(!mat_validate(lp->matA)) {\n    report(lp, IMPORTANT, \"LP_writefile: Could not validate the data matrix.\\n\");\n    return(FALSE);\n  }\n\n  /* Write name of model */\n  ptr = get_lp_name(lp);\n  if(ptr != NULL) {\n    if(*ptr)\n      write_lpcomment(userhandle, write_modeldata, ptr, FALSE);\n    else\n      ptr = NULL;\n  }\n\n  /* Write the objective function */\n  write_lpcomment(userhandle, write_modeldata, \"Objective function\", (MYBOOL) (ptr != NULL));\n  if(is_maxim(lp))\n    write_data(userhandle, write_modeldata, \"max: \");\n  else\n    write_data(userhandle, write_modeldata, \"min: \");\n\n  allocREAL(lp, &val, 1 + lp->columns, TRUE);\n  allocINT(lp, &idx, 1 + lp->columns, TRUE);\n\n  write_lprow(lp, 0, userhandle, write_modeldata, maxlen, idx, val);\n  a = get_rh(lp, 0);\n  if(a != 0)\n    write_data(userhandle, write_modeldata, \" %+.12g\", a);\n  write_data(userhandle, write_modeldata, \";\\n\");\n\n  /* Write constraints */\n  if(nrows > 0)\n    write_lpcomment(userhandle, write_modeldata, \"Constraints\", TRUE);\n  for(j = 1; j <= nrows; j++) {\n    if(((lp->names_used) && (lp->row_name[j] != NULL)) || (write_lprow(lp, j, userhandle, NULL, maxlen, idx, val) == 1))\n      ptr = get_row_name(lp, j);\n    else\n      ptr = NULL;\n    if((ptr != NULL) && (*ptr))\n      write_data(userhandle, write_modeldata, \"%s: \", ptr);\n\n#ifndef SingleBoundedRowInLP\n    /* Write the ranged part of the constraint, if specified */\n    if ((lp->orig_upbo[j]) && (lp->orig_upbo[j] < lp->infinite)) {\n      if(my_chsign(is_chsign(lp, j), lp->orig_rhs[j]) == -lp->infinite)\n        write_data(userhandle, write_modeldata, \"-Inf %s \", (is_chsign(lp, j)) ? \">=\" : \"<=\");\n      else if(my_chsign(is_chsign(lp, j), lp->orig_rhs[j]) == lp->infinite)\n        write_data(userhandle, write_modeldata, \"+Inf %s \", (is_chsign(lp, j)) ? \">=\" : \"<=\");\n      else\n        write_data(userhandle, write_modeldata, \"%+.12g %s \",\n                (lp->orig_upbo[j]-lp->orig_rhs[j]) * (is_chsign(lp, j) ? 1.0 : -1.0) / (lp->scaling_used ? lp->scalars[j] : 1.0),\n                (is_chsign(lp, j)) ? \">=\" : \"<=\");\n    }\n#endif\n\n    if((!write_lprow(lp, j, userhandle, write_modeldata, maxlen, idx, val)) && (ncols >= 1))\n      write_data(userhandle, write_modeldata, \"0 %s\", get_col_name(lp, 1));\n\n    if(lp->orig_upbo[j] == 0)\n      write_data(userhandle, write_modeldata, \" =\");\n    else if(is_chsign(lp, j))\n      write_data(userhandle, write_modeldata, \" >=\");\n    else\n      write_data(userhandle, write_modeldata, \" <=\");\n    if(fabs(get_rh(lp, j) + lp->infinite) < 1)\n      write_data(userhandle, write_modeldata, \" -Inf;\\n\");\n    else if(fabs(get_rh(lp, j) - lp->infinite) < 1)\n      write_data(userhandle, write_modeldata, \" +Inf;\\n\");\n    else\n      write_data(userhandle, write_modeldata, \" %.12g;\\n\", get_rh(lp, j));\n\n#ifdef SingleBoundedRowInLP\n    /* Write the ranged part of the constraint, if specified */\n    if ((lp->orig_upbo[j]) && (lp->orig_upbo[j] < lp->infinite)) {\n      if(((lp->names_used) && (lp->row_name[j] != NULL)) || (write_lprow(lp, j, userhandle, NULL, maxlen, idx, val) == 1))\n        ptr = get_row_name(lp, j);\n      else\n        ptr = NULL;\n      if((ptr != NULL) && (*ptr))\n        write_data(userhandle, write_modeldata, \"%s: \", ptr);\n      if((!write_lprow(lp, j, userhandle, write_modeldata, maxlen, idx, val)) && (get_Ncolumns(lp) >= 1))\n        write_data(userhandle, write_modeldata, \"0 %s\", get_col_name(lp, 1));\n      write_data(userhandle, write_modeldata, \" %s %g;\\n\",\n                     (is_chsign(lp, j)) ? \"<=\" : \">=\",\n                     (lp->orig_upbo[j]-lp->orig_rhs[j]) * (is_chsign(lp, j) ? 1.0 : -1.0) / (lp->scaling_used ? lp->scalars[j] : 1.0));\n    }\n#endif\n  }\n\n  /* Write bounds on variables */\n  ok = FALSE;\n  for(i = nrows + 1; i <= lp->sum; i++)\n    if(!is_splitvar(lp, i - nrows)) {\n      if(lp->orig_lowbo[i] == lp->orig_upbo[i]) {\n        if(!ok) {\n          write_lpcomment(userhandle, write_modeldata, \"Variable bounds\", TRUE);\n          ok = TRUE;\n        }\n        write_data(userhandle, write_modeldata, \"%s = %.12g;\\n\", get_col_name(lp, i - nrows), get_upbo(lp, i - nrows));\n      }\n      else {\n#ifndef SingleBoundedRowInLP\n        if((lp->orig_lowbo[i] != 0) && (lp->orig_upbo[i] < lp->infinite)) {\n          if(!ok) {\n            write_lpcomment(userhandle, write_modeldata, \"Variable bounds\", TRUE);\n            ok = TRUE;\n          }\n          if(lp->orig_lowbo[i] == -lp->infinite)\n            write_data(userhandle, write_modeldata, \"-Inf\");\n          else\n            write_data(userhandle, write_modeldata, \"%.12g\", get_lowbo(lp, i - nrows));\n          write_data(userhandle, write_modeldata, \" <= %s <= \", get_col_name(lp, i - nrows));\n          if(lp->orig_lowbo[i] == lp->infinite)\n            write_data(userhandle, write_modeldata, \"+Inf\");\n          else\n            write_data(userhandle, write_modeldata, \"%.12g\", get_upbo(lp, i - nrows));\n          write_data(userhandle, write_modeldata, \";\\n\");\n        }\n        else\n#endif\n        {\n          if(lp->orig_lowbo[i] != 0) {\n            if(!ok) {\n              write_lpcomment(userhandle, write_modeldata, \"Variable bounds\", TRUE);\n              ok = TRUE;\n            }\n            if(lp->orig_lowbo[i] == -lp->infinite)\n              write_data(userhandle, write_modeldata, \"%s >= -Inf;\\n\", get_col_name(lp, i - nrows));\n            else if(lp->orig_lowbo[i] == lp->infinite)\n              write_data(userhandle, write_modeldata, \"%s >= +Inf;\\n\", get_col_name(lp, i - nrows));\n            else\n              write_data(userhandle, write_modeldata, \"%s >= %.12g;\\n\",\n                         get_col_name(lp, i - nrows), get_lowbo(lp, i - nrows));\n          }\n          if(lp->orig_upbo[i] != lp->infinite) {\n            if(!ok) {\n              write_lpcomment(userhandle, write_modeldata, \"Variable bounds\", TRUE);\n              ok = TRUE;\n            }\n            write_data(userhandle, write_modeldata, \"%s <= %.12g;\\n\",\n                       get_col_name(lp, i - nrows), get_upbo(lp, i - nrows));\n          }\n        }\n      }\n    }\n\n  /* Write optional integer section */\n  if(lp->int_vars > 0) {\n    write_lpcomment(userhandle, write_modeldata, \"Integer definitions\", TRUE);\n    i = 1;\n    while((i <= ncols) && !is_int(lp, i))\n      i++;\n    if(i <= ncols) {\n      nchars = write_data(userhandle, write_modeldata, \"int %s\", get_col_name(lp, i));\n      i++;\n      for(; i <= ncols; i++)\n        if((!is_splitvar(lp, i)) && (is_int(lp, i))) {\n          if((maxlen!= 0) && (nchars > maxlen)) {\n            write_data(userhandle, write_modeldata, \"%s\", \"\\n\");\n            nchars = 0;\n          }\n          write_data(userhandle, write_modeldata, \",%s\", get_col_name(lp, i));\n        }\n      write_data(userhandle, write_modeldata, \";\\n\");\n    }\n  }\n\n  /* Write optional SEC section */\n  if(lp->sc_vars > 0) {\n    write_lpcomment(userhandle, write_modeldata, \"Semi-continuous variables\", TRUE);\n    i = 1;\n    while((i <= ncols) && !is_semicont(lp, i))\n      i++;\n    if(i <= ncols) {\n      nchars = write_data(userhandle, write_modeldata, \"sec %s\", get_col_name(lp, i));\n      i++;\n      for(; i <= ncols; i++)\n        if((!is_splitvar(lp, i)) && (is_semicont(lp, i))) {\n          if((maxlen != 0) && (nchars > maxlen)) {\n            write_data(userhandle, write_modeldata, \"%s\", \"\\n\");\n            nchars = 0;\n          }\n          nchars += write_data(userhandle, write_modeldata, \",%s\", get_col_name(lp, i));\n        }\n      write_data(userhandle, write_modeldata, \";\\n\");\n    }\n  }\n\n  /* Write optional SOS section */\n  if(SOS_count(lp) > 0) {\n    SOSgroup *SOS = lp->SOS;\n    write_lpcomment(userhandle, write_modeldata, \"SOS definitions\", TRUE);\n    write_data(userhandle, write_modeldata, \"SOS\\n\");\n    for(b = 0, i = 0; i < SOS->sos_count; b = SOS->sos_list[i]->priority, i++) {\n      nchars = write_data(userhandle, write_modeldata, \"%s: \",\n              (SOS->sos_list[i]->name == NULL) ||\n              (*SOS->sos_list[i]->name==0) ? \"SOS\" : SOS->sos_list[i]->name); /* formatnumber12((double) lp->sos_list[i]->priority) */\n\n      for(a = 0.0, j = 1; j <= SOS->sos_list[i]->size; a = SOS->sos_list[i]->weights[j], j++) {\n        if((maxlen != 0) && (nchars > maxlen)) {\n          write_data(userhandle, write_modeldata, \"%s\", \"\\n\");\n          nchars = 0;\n        }\n        if(SOS->sos_list[i]->weights[j] == ++a)\n          nchars += write_data(userhandle, write_modeldata, \"%s%s\",\n                  (j > 1) ? \",\" : \"\",\n                  get_col_name(lp, SOS->sos_list[i]->members[j]));\n        else\n          nchars += write_data(userhandle, write_modeldata, \"%s%s:%.12g\",\n                  (j > 1) ? \",\" : \"\",\n                  get_col_name(lp, SOS->sos_list[i]->members[j]),\n        SOS->sos_list[i]->weights[j]);\n      }\n      if(SOS->sos_list[i]->priority == ++b)\n        nchars += write_data(userhandle, write_modeldata, \" <= %d;\\n\", SOS->sos_list[i]->type);\n      else\n        nchars += write_data(userhandle, write_modeldata, \" <= %d:%d;\\n\", SOS->sos_list[i]->type, SOS->sos_list[i]->priority);\n    }\n  }\n\n  FREE(val);\n  FREE(idx);\n\n  ok = TRUE;\n\n  return(ok);\n}\n\nstatic int __WINAPI write_lpdata(void *userhandle, char *buf)\n{\n  return(fprintf((FILE *) userhandle, \"%s\", buf));\n}\n\nMYBOOL LP_writefile(lprec *lp, char *filename)\n{\n  FILE *output = stdout;\n  MYBOOL ok;\n\n  if (filename != NULL) {\n    ok = (MYBOOL) ((output = fopen(filename, \"w\")) != NULL);\n    if(!ok)\n      return(ok);\n  }\n  else\n    output = lp->outstream;\n\n  ok = write_lpex(lp, (void *) output, write_lpdata);\n\n  if (filename != NULL)\n    fclose(output);\n\n  return(ok);\n}\n\nMYBOOL LP_writehandle(lprec *lp, FILE *output)\n{\n  MYBOOL ok;\n\n  if (output != NULL)\n    set_outputstream(lp, output);\n\n  output = lp->outstream;\n\n  ok = write_lpex(lp, (void *) output, write_lpdata);\n\n  return(ok);\n}\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lp_wlp.h",
    "content": "#ifndef HEADER_lp_lp\n#define HEADER_lp_lp\n\n#include \"lp_types.h\"\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* Put function headers here */\nMYBOOL LP_writefile(lprec *lp, char *filename);\nMYBOOL LP_writehandle(lprec *lp, FILE *output);\n\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* HEADER_lp_lp */\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lpkit.h",
    "content": "#include \"lp_lib.h\"\n#include \"lp_report.h\"\n\n#define MALLOC(ptr, nr, type)\\\n  ((((nr) == 0) || ((ptr = (type *) malloc((size_t)((nr) * sizeof(*ptr)))) == NULL)) ? \\\n   report(NULL, CRITICAL, \"malloc of %d bytes failed on line %d of file %s\\n\",\\\n           (nr) * sizeof(*ptr), __LINE__, __FILE__), (ptr = NULL /* (void *) 0 */) : \\\n   ptr\\\n  )\n\n#define CALLOC(ptr, nr, type)\\\n  ((((nr) == 0) || ((ptr = (type *) calloc((size_t)(nr), sizeof(*ptr))) == NULL)) ? \\\n   report(NULL, CRITICAL, \"calloc of %d bytes failed on line %d of file %s\\n\",\\\n           (nr) * sizeof(*ptr), __LINE__, __FILE__), (ptr = NULL /* (void *) 0 */) : \\\n   ptr\\\n  )\n\n#define REALLOC(ptr, nr, type)\\\n  ((((nr) == 0) || ((ptr = (type *) realloc(ptr, (size_t)((nr) * sizeof(*ptr)))) == NULL)) ? \\\n   report(NULL, CRITICAL, \"realloc of %d bytes failed on line %d of file %s\\n\",\\\n           (nr) * sizeof(*ptr), __LINE__, __FILE__), (ptr = NULL /* (void *) 0 */) : \\\n   ptr\\\n  )\n\n#if defined FREE\n# undef FREE\n#endif\n\n#define FREE(ptr) if (ptr != NULL) {free(ptr), ptr = NULL;} else\n\n#define MALLOCCPY(nptr, optr, nr, type)\\\n  (MALLOC(nptr, nr, type), (nptr != NULL) ? memcpy(nptr, optr, (size_t)((nr) * sizeof(*optr))) : 0, nptr)\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/lpsolve.h",
    "content": "// stdafx.h : include file for standard system include files,\n//  or project specific include files that are used frequently, but\n//      are changed infrequently\n//\n\n#if !defined(AFX_STDAFX_H__22BF6D92_917F_4BDF_B806_0954721EBA95__INCLUDED_)\n#define AFX_STDAFX_H__22BF6D92_917F_4BDF_B806_0954721EBA95__INCLUDED_\n\n#if _MSC_VER > 1000\n#pragma once\n#endif // _MSC_VER > 1000\n\n\n// Insert your headers here\n#define WIN32_LEAN_AND_MEAN\t\t// Exclude rarely-used stuff from Windows headers\n\n#include <windows.h>\n\n// TODO: reference additional headers your program requires here\n\n//{{AFX_INSERT_LOCATION}}\n// Microsoft Visual C++ will insert additional declarations immediately before the previous line.\n\n#endif // !defined(AFX_STDAFX_H__22BF6D92_917F_4BDF_B806_0954721EBA95__INCLUDED_)\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/shared/commonlib.c",
    "content": "\n#include <sys/types.h>\n\n#if defined INTEGERTIME || defined CLOCKTIME || defined PosixTime\n# include <time.h>\n#elif defined EnhTime\n# include <windows.h>\n#else\n# include <sys/timeb.h>\n#endif\n\n#include <stdlib.h>\n#include <stdio.h>\n#ifdef WIN32\n# include <io.h>       /* Used in file search functions */\n#endif\n#include <ctype.h>\n#include <string.h>\n#include <float.h>\n#include <math.h>\n#include \"commonlib.h\"\n\n#ifdef FORTIFY\n# include \"lp_fortify.h\"\n#endif\n\n#if defined FPUexception\n/* FPU exception masks */\nunsigned int clearFPU()\n{\n  return( _clearfp() );\n}\nunsigned int resetFPU(unsigned int mask)\n{\n  _clearfp();\n  mask = _controlfp( mask, 0xfffff);\n  return( mask );\n}\nunsigned int catchFPU(unsigned int mask)\n{\n  /* Always call _clearfp before enabling/unmasking a FPU exception */\n  unsigned int u = _clearfp();\n\n  /* Set the new mask by not-and'ing it with the previous settings */\n  u = _controlfp(0, 0);\n  mask = u & ~mask;\n  mask = _controlfp(mask, _MCW_EM);\n\n  /* Return the previous mask */\n  return( u );\n}\n#endif\n\n/* Math operator equivalence function */\nint intpow(int base, int exponent)\n{\n  int result = 1;\n  while(exponent > 0) {\n    result *= base;\n    exponent--;\n  }\n  while(exponent < 0) {\n    result /= base;\n    exponent++;\n  }\n  return( result );\n}\nint mod(int n, int d)\n{\n  return(n % d);\n}\n\n/* Some string functions */\nvoid strtoup(char *s)\n{\n  if(s != NULL)\n  while (*s) {\n    *s = toupper(*s);\n    s++;\n  }\n}\nvoid strtolo(char *s)\n{\n  if(s != NULL)\n  while (*s) {\n    *s = tolower(*s);\n    s++;\n  }\n}\nvoid strcpyup(char *t, char *s)\n{\n  if((s != NULL) && (t != NULL)) {\n    while (*s) {\n      *t = toupper(*s);\n      t++;\n      s++;\n    }\n    *t = '\\0';\n  }\n}\nvoid strcpylo(char *t, char *s)\n{\n  if((s != NULL) && (t != NULL)) {\n    while (*s) {\n      *t = tolower(*s);\n      t++;\n      s++;\n    }\n    *t = '\\0';\n  }\n}\n\n/* Unix library naming utility function */\nMYBOOL so_stdname(char *stdname, char *descname, int buflen)\n{\n  char *ptr;\n\n  if((descname == NULL) || (stdname == NULL) || (((int) strlen(descname)) >= buflen - 6))\n    return( FALSE );\n\n  strcpy(stdname, descname);\n  if((ptr = strrchr(descname, '/')) == NULL)\n    ptr = descname;\n  else\n    ptr++;\n  stdname[(int) (ptr - descname)] = 0;\n  if(strncmp(ptr, \"lib\", 3))\n    strcat(stdname, \"lib\");\n  strcat(stdname, ptr);\n  if(strcmp(stdname + strlen(stdname) - 3, \".so\"))\n    strcat(stdname, \".so\");\n  return( TRUE );\n}\n\n/* Return the greatest common divisor of a and b, or -1 if it is\n   not defined. Return through the pointer arguments the integers\n   such that gcd(a,b) = c*a + b*d. */\nint gcd(LLONG a, LLONG b, int *c, int *d)\n{\n  LLONG q,r,t;\n  int   cret,dret,C,D,rval, sgn_a = 1,sgn_b = 1, swap = 0;\n\n  if((a == 0) || (b == 0))\n    return( -1 );\n\n  /* Use local multiplier instances, if necessary */\n  if(c == NULL)\n    c = &cret;\n  if(d == NULL)\n    d = &dret;\n\n  /* Normalize so that 0 < a <= b */\n  if(a < 0){\n    a = -a;\n    sgn_a = -1;\n  }\n  if(b < 0){\n    b = -b;\n    sgn_b = -1;\n  }\n  if(b < a){\n    t = b;\n    b = a;\n    a = t;\n    swap = 1;\n  }\n\n  /* Now a <= b and both >= 1. */\n  q = b/a;\n  r = b - a*q;\n  if(r == 0) {\n    if(swap){\n      *d = 1;\n      *c = 0;\n    }\n    else {\n      *c = 1;\n      *d = 0;\n    }\n    *c = sgn_a*(*c);\n    *d = sgn_b*(*d);\n    return( (int) a );\n  }\n\n  rval = gcd(a,r,&C,&D);\n  if(swap){\n    *d = (int) (C-D*q);\n    *c = D;\n  }\n  else {\n    *d = D;\n    *c = (int) (C-D*q);\n  }\n  *c = sgn_a*(*c);\n  *d = sgn_b*(*d);\n  return( rval );\n}\n\n/* Array search functions */\nint findIndex(int target, int *attributes, int count, int offset)\n{\n  int focusPos, beginPos, endPos;\n  int focusAttrib, beginAttrib, endAttrib;\n\n /* Set starting and ending index offsets */\n  beginPos = offset;\n  endPos = beginPos + count - 1;\n  if(endPos < beginPos)\n    return(-1);\n\n /* Do binary search logic based on a sorted (decending) attribute vector */\n  focusPos = (beginPos + endPos) / 2;\n  beginAttrib = attributes[beginPos];\n  focusAttrib = attributes[focusPos];\n  endAttrib   = attributes[endPos];\n\n  while(endPos - beginPos > LINEARSEARCH) {\n    if(beginAttrib == target) {\n      focusAttrib = beginAttrib;\n      endPos = beginPos;\n    }\n    else if(endAttrib == target) {\n      focusAttrib = endAttrib;\n      beginPos = endPos;\n    }\n    else if(focusAttrib < target) {\n      beginPos = focusPos + 1;\n      beginAttrib = attributes[beginPos];\n      focusPos = (beginPos + endPos) / 2;\n      focusAttrib = attributes[focusPos];\n    }\n    else if(focusAttrib > target) {\n      endPos = focusPos - 1;\n      endAttrib = attributes[endPos];\n      focusPos = (beginPos + endPos) / 2;\n      focusAttrib = attributes[focusPos];\n    }\n    else {\n      beginPos = focusPos;\n      endPos = focusPos;\n    }\n  }\n\n /* Do linear (unsorted) search logic */\n  if(endPos - beginPos <= LINEARSEARCH) {\n\n    /* CPU intensive loop; provide alternative evaluation models */\n#if defined DOFASTMATH\n    /* Do fast pointer arithmetic */\n    int *attptr = attributes + beginPos;\n    while((beginPos < endPos) && ((*attptr) < target)) {\n      beginPos++;\n      attptr++;\n    }\n    focusAttrib = (*attptr);\n#else\n    /* Do traditional indexed access */\n    focusAttrib = attributes[beginPos];\n    while((beginPos < endPos) && (focusAttrib < target)) {\n      beginPos++;\n      focusAttrib = attributes[beginPos];\n    }\n#endif\n  }\n\n /* Return the index if a match was found, or signal failure with a -1        */\n  if(focusAttrib == target)             /* Found; return retrieval index      */\n    return(beginPos);\n  else if(focusAttrib > target)         /* Not found; last item               */\n    return(-beginPos);\n  else if(beginPos > offset+count-1)\n    return(-(endPos+1));                /* Not found; end of list             */\n  else\n    return(-(beginPos+1));              /* Not found; intermediate point      */\n\n}\nint findIndexEx(void *target, void *attributes, int count, int offset, int recsize, findCompare_func findCompare, MYBOOL ascending)\n{\n  int  focusPos, beginPos, endPos, compare, order;\n  void *focusAttrib, *beginAttrib, *endAttrib;\n\n /* Set starting and ending index offsets */\n  beginPos = offset;\n  endPos = beginPos + count - 1;\n  if(endPos < beginPos)\n    return(-1);\n  order = (ascending ? -1 : 1);\n\n /* Do binary search logic based on a sorted attribute vector */\n  focusPos = (beginPos + endPos) / 2;\n  beginAttrib = CMP_ATTRIBUTES(beginPos);\n  focusAttrib = CMP_ATTRIBUTES(focusPos);\n  endAttrib   = CMP_ATTRIBUTES(endPos);\n\n  compare = 0;\n  while(endPos - beginPos > LINEARSEARCH) {\n    if(findCompare(target, beginAttrib) == 0) {\n      focusAttrib = beginAttrib;\n      endPos = beginPos;\n    }\n    else if(findCompare(target, endAttrib) == 0) {\n      focusAttrib = endAttrib;\n      beginPos = endPos;\n    }\n    else {\n      compare = findCompare(target, focusAttrib)*order;\n      if(compare < 0) {\n        beginPos = focusPos + 1;\n        beginAttrib = CMP_ATTRIBUTES(beginPos);\n        focusPos = (beginPos + endPos) / 2;\n        focusAttrib = CMP_ATTRIBUTES(focusPos);\n      }\n      else if(compare > 0) {\n        endPos = focusPos - 1;\n        endAttrib = CMP_ATTRIBUTES(endPos);\n        focusPos = (beginPos + endPos) / 2;\n        focusAttrib = CMP_ATTRIBUTES(focusPos);\n      }\n      else {\n        beginPos = focusPos;\n        endPos = focusPos;\n      }\n    }\n  }\n\n /* Do linear (unsorted) search logic */\n  if(endPos - beginPos <= LINEARSEARCH) {\n\n    /* Do traditional indexed access */\n    focusAttrib = CMP_ATTRIBUTES(beginPos);\n    if(beginPos == endPos)\n      compare = findCompare(target, focusAttrib)*order;\n    else\n    while((beginPos < endPos) &&\n          ((compare = findCompare(target, focusAttrib)*order) < 0)) {\n      beginPos++;\n      focusAttrib = CMP_ATTRIBUTES(beginPos);\n    }\n  }\n\n /* Return the index if a match was found, or signal failure with a -1        */\n  if(compare == 0)                      /* Found; return retrieval index      */\n    return(beginPos);\n  else if(compare > 0)                  /* Not found; last item               */\n    return(-beginPos);\n  else if(beginPos > offset+count-1)\n    return(-(endPos+1));                /* Not found; end of list             */\n  else\n    return(-(beginPos+1));              /* Not found; intermediate point      */\n\n}\n\n/* Simple sorting and searching comparison \"operators\" */\nint CMP_CALLMODEL compareCHAR(const void *current, const void *candidate)\n{\n  return( CMP_COMPARE( *(char *) current, *(char *) candidate ) );\n}\nint CMP_CALLMODEL compareINT(const void *current, const void *candidate)\n{\n  return( CMP_COMPARE( *(int *) current, *(int *) candidate ) );\n}\nint CMP_CALLMODEL compareREAL(const void *current, const void *candidate)\n{\n  return( CMP_COMPARE( *(REAL *) current, *(REAL *) candidate ) );\n}\n\n/* Heap sort function (procedurally based on the Numerical Recipes version,\n   but expanded and generalized to hande any object with the use of\n   qsort-style comparison operator).  An expanded version is also implemented,\n   where interchanges are reflected in a caller-initialized integer \"tags\" list. */\nvoid hpsort(void *attributes, int count, int offset, int recsize, MYBOOL descending, findCompare_func findCompare)\n{\n  register int  i, j, k, ir, order;\n  register char *hold, *base;\n  char          *save;\n\n  if(count < 2)\n    return;\n  offset -= 1;\n  attributes = CMP_ATTRIBUTES(offset);\n  base = CMP_ATTRIBUTES(1);\n  save = (char *) malloc(recsize);\n  if(descending)\n    order = -1;\n  else\n    order = 1;\n\n  k = (count >> 1) + 1;\n  ir = count;\n\n  for(;;) {\n    if(k > 1) {\n      MEMCOPY(save, CMP_ATTRIBUTES(--k), recsize);\n    }\n    else {\n      hold = CMP_ATTRIBUTES(ir);\n      MEMCOPY(save, hold, recsize);\n      MEMCOPY(hold, base, recsize);\n      if(--ir == 1) {\n        MEMCOPY(base, save, recsize);\n        break;\n      }\n    }\n\n    i = k;\n    j = k << 1;\n    while(j <= ir) {\n      hold = CMP_ATTRIBUTES(j);\n      if( (j < ir) && (findCompare(hold, CMP_ATTRIBUTES(j+1))*order < 0) ) {\n        hold += recsize;\n        j++;\n      }\n      if(findCompare(save, hold)*order < 0) {\n        MEMCOPY(CMP_ATTRIBUTES(i), hold, recsize);\n        i = j;\n        j <<= 1;\n\t    }\n      else\n        break;\n    }\n    MEMCOPY(CMP_ATTRIBUTES(i), save, recsize);\n  }\n\n  FREE(save);\n}\nvoid hpsortex(void *attributes, int count, int offset, int recsize, MYBOOL descending, findCompare_func findCompare, int *tags)\n{\n  if(count < 2)\n    return;\n  if(tags == NULL) {\n    hpsort(attributes, count, offset, recsize, descending, findCompare);\n    return;\n  }\n  else {\n    register int  i, j, k, ir, order;\n    register char *hold, *base;\n    char          *save;\n    int           savetag;\n\n    offset -= 1;\n    attributes = CMP_ATTRIBUTES(offset);\n    tags += offset;\n    base = CMP_ATTRIBUTES(1);\n    save = (char *) malloc(recsize);\n    if(descending)\n      order = -1;\n    else\n      order = 1;\n\n    k = (count >> 1) + 1;\n    ir = count;\n\n    for(;;) {\n      if(k > 1) {\n        MEMCOPY(save, CMP_ATTRIBUTES(--k), recsize);\n        savetag = tags[k];\n      }\n      else {\n        hold = CMP_ATTRIBUTES(ir);\n        MEMCOPY(save, hold, recsize);\n        MEMCOPY(hold, base, recsize);\n        savetag = tags[ir];\n        tags[ir] = tags[1];\n        if(--ir == 1) {\n          MEMCOPY(base, save, recsize);\n          tags[1] = savetag;\n          break;\n        }\n      }\n\n      i = k;\n      j = k << 1;\n      while(j <= ir) {\n        hold = CMP_ATTRIBUTES(j);\n        if( (j < ir) && (findCompare(hold, CMP_ATTRIBUTES(j+1))*order < 0) ) {\n          hold += recsize;\n          j++;\n        }\n        if(findCompare(save, hold)*order < 0) {\n          MEMCOPY(CMP_ATTRIBUTES(i), hold, recsize);\n          tags[i] = tags[j];\n          i = j;\n          j <<= 1;\n  \t    }\n        else\n          break;\n      }\n      MEMCOPY(CMP_ATTRIBUTES(i), save, recsize);\n      tags[i] = savetag;\n    }\n\n    FREE(save);\n  }\n}\n\n/* This is a \"specialized generic\" version of C.A.R Hoare's Quick Sort algorithm.\n   It will handle arrays that are already sorted, and arrays with duplicate keys.\n   There are two versions here; one extended conventional with optional tag data\n   for each sortable value, and a version for the QSORTrec format.  The QSORTrec\n   format i.a. includes the ability for to do linked list sorting. If the passed\n   comparison operator is NULL, the comparison is assumed to be for integers. */\n#define QS_IS_switch LINEARSEARCH    /* Threshold for switching to insertion sort */\n\nvoid qsortex_swap(void *attributes, int l, int r, int recsize,\n                         void *tags, int tagsize, char *save, char *savetag)\n{\n   MEMCOPY(save, CMP_ATTRIBUTES(l), recsize);\n   MEMCOPY(CMP_ATTRIBUTES(l), CMP_ATTRIBUTES(r), recsize);\n   MEMCOPY(CMP_ATTRIBUTES(r), save, recsize);\n   if(tags != NULL) {\n     MEMCOPY(savetag, CMP_TAGS(l), tagsize);\n     MEMCOPY(CMP_TAGS(l), CMP_TAGS(r), tagsize);\n     MEMCOPY(CMP_TAGS(r), savetag, tagsize);\n   }\n}\n\nint qsortex_sort(void *attributes, int l, int r, int recsize, int sortorder, findCompare_func findCompare,\n                        void *tags, int tagsize, char *save, char *savetag)\n{\n  register int i, j, nmove = 0;\n  char     *v;\n\n  /* Perform the a fast QuickSort */\n  if((r-l) > QS_IS_switch) {\n    i = (r+l)/2;\n\n    /* Tri-Median Method */\n    if(sortorder*findCompare(CMP_ATTRIBUTES(l), CMP_ATTRIBUTES(i)) > 0)\n      { nmove++; qsortex_swap(attributes, l,i, recsize, tags, tagsize, save, savetag); }\n    if(sortorder*findCompare(CMP_ATTRIBUTES(l), CMP_ATTRIBUTES(r)) > 0)\n      { nmove++; qsortex_swap(attributes, l,r, recsize, tags, tagsize, save, savetag); }\n    if(sortorder*findCompare(CMP_ATTRIBUTES(i), CMP_ATTRIBUTES(r)) > 0)\n      { nmove++; qsortex_swap(attributes, i,r, recsize, tags, tagsize, save, savetag); }\n\n    j = r-1;\n    qsortex_swap(attributes, i,j, recsize, tags, tagsize, save, savetag);\n    i = l;\n    v = CMP_ATTRIBUTES(j);\n    for(;;) {\n      while(sortorder*findCompare(CMP_ATTRIBUTES(++i), v) < 0);\n      while(sortorder*findCompare(CMP_ATTRIBUTES(--j), v) > 0);\n      if(j < i) break;\n      nmove++; qsortex_swap(attributes, i,j, recsize, tags, tagsize, save, savetag);\n    }\n    nmove++; qsortex_swap(attributes, i,r-1, recsize, tags, tagsize, save, savetag);\n    nmove += qsortex_sort(attributes, l,j,   recsize, sortorder, findCompare, tags, tagsize, save, savetag);\n    nmove += qsortex_sort(attributes, i+1,r, recsize, sortorder, findCompare, tags, tagsize, save, savetag);\n  }\n  return( nmove );\n}\n\nint qsortex_finish(void *attributes, int lo0, int hi0, int recsize, int sortorder, findCompare_func findCompare,\n                          void *tags, int tagsize, char *save, char *savetag)\n{\n  int i, j, nmove = 0;\n\n  /* This is actually InsertionSort, which is faster for local sorts */\n  for(i = lo0+1; i <= hi0; i++) {\n\n    /* Save bottom-most item */\n    MEMCOPY(save, CMP_ATTRIBUTES(i), recsize);\n    if(tags != NULL)\n      MEMCOPY(savetag, CMP_TAGS(i), tagsize);\n\n    /* Shift down! */\n    j = i;\n    while ((j > lo0) && (sortorder*findCompare(CMP_ATTRIBUTES(j-1), save) > 0)) {\n      MEMCOPY(CMP_ATTRIBUTES(j), CMP_ATTRIBUTES(j-1), recsize);\n      if(tags != NULL)\n        MEMCOPY(CMP_TAGS(j), CMP_TAGS(j-1), tagsize);\n      j--;\n      nmove++;\n    }\n\n    /* Store bottom-most item at the top */\n    MEMCOPY(CMP_ATTRIBUTES(j), save, recsize);\n    if(tags != NULL)\n      MEMCOPY(CMP_TAGS(j), savetag, tagsize);\n  }\n  return( nmove );\n}\n\nint qsortex(void *attributes, int count, int offset, int recsize, MYBOOL descending, findCompare_func findCompare, void *tags, int tagsize)\n{\n  int  iswaps = 0, sortorder = (descending ? -1 : 1);\n  char *save = NULL, *savetag = NULL;\n\n  /* Check and initialize to zero-based arrays */\n  if(count <= 1)\n    goto Finish;\n  attributes = (void *) CMP_ATTRIBUTES(offset);\n  save = (char *) malloc(recsize);\n  if((tagsize <= 0) && (tags != NULL))\n    tags = NULL;\n  else if(tags != NULL) {\n    tags = (void *) CMP_TAGS(offset);\n    savetag = (char *) malloc(tagsize);\n  }\n  count--;\n\n  /* Perform sort */\n  iswaps = qsortex_sort(attributes, 0, count, recsize, sortorder, findCompare, tags, tagsize, save, savetag);\n#if QS_IS_switch > 0\n  iswaps += qsortex_finish(attributes, 0, count, recsize, sortorder, findCompare, tags, tagsize, save, savetag);\n#endif\n\nFinish:\n  FREE(save);\n  FREE(savetag);\n  return( iswaps );\n}\n\n#undef QS_IS_switch\n\n/* This is a \"specialized generic\" version of C.A.R Hoare's Quick Sort algorithm.\n   It will handle arrays that are already sorted, and arrays with duplicate keys.\n   The implementation here requires the user to pass a comparison operator and\n   assumes that the array passed has the QSORTrec format, which i.a. includes\n   the ability for to do linked list sorting. If the passed comparison operator\n   is NULL, the comparison is assumed to be for integers. */\n#define QS_IS_switch 4    /* Threshold for switching to insertion sort */\n\nvoid QS_swap(UNIONTYPE QSORTrec a[], int i, int j)\n{\n  UNIONTYPE QSORTrec T = a[i];\n  a[i] = a[j];\n  a[j] = T;\n}\nint QS_addfirst(UNIONTYPE QSORTrec a[], void *mydata)\n{\n  a[0].pvoid2.ptr = mydata;\n  return( 0 );\n}\nint QS_append(UNIONTYPE QSORTrec a[], int ipos, void *mydata)\n{\n  if(ipos <= 0)\n    ipos = QS_addfirst(a, mydata);\n  else\n    a[ipos].pvoid2.ptr = mydata;\n  return( ipos );\n}\nvoid QS_replace(UNIONTYPE QSORTrec a[], int ipos, void *mydata)\n{\n  a[ipos].pvoid2.ptr = mydata;\n}\nvoid QS_insert(UNIONTYPE QSORTrec a[], int ipos, void *mydata, int epos)\n{\n  for(; epos > ipos; epos--)\n    a[epos] = a[epos-1];\n  a[ipos].pvoid2.ptr = mydata;\n}\nvoid QS_delete(UNIONTYPE QSORTrec a[], int ipos, int epos)\n{\n  for(; epos > ipos; epos--)\n    a[epos] = a[epos-1];\n}\nint QS_sort(UNIONTYPE QSORTrec a[], int l, int r, findCompare_func findCompare)\n{\n  register int i, j, nmove = 0;\n  UNIONTYPE QSORTrec v;\n\n  /* Perform the a fast QuickSort */\n  if((r-l) > QS_IS_switch) {\n    i = (r+l)/2;\n\n    /* Tri-Median Method */\n    if(findCompare((char *) &a[l], (char *) &a[i]) > 0)\n      { nmove++; QS_swap(a,l,i); }\n    if(findCompare((char *) &a[l], (char *) &a[r]) > 0)\n      { nmove++; QS_swap(a,l,r); }\n    if(findCompare((char *) &a[i], (char *) &a[r]) > 0)\n      { nmove++; QS_swap(a,i,r); }\n\n    j = r-1;\n    QS_swap(a,i,j);\n    i = l;\n    v = a[j];\n    for(;;) {\n      while(findCompare((char *) &a[++i], (char *) &v) < 0);\n      while(findCompare((char *) &a[--j], (char *) &v) > 0);\n      if(j < i) break;\n      nmove++; QS_swap (a,i,j);\n    }\n    nmove++; QS_swap(a,i,r-1);\n    nmove += QS_sort(a,l,j,findCompare);\n    nmove += QS_sort(a,i+1,r,findCompare);\n  }\n  return( nmove );\n}\nint QS_finish(UNIONTYPE QSORTrec a[], int lo0, int hi0, findCompare_func findCompare)\n{\n  int      i, j, nmove = 0;\n  UNIONTYPE QSORTrec v;\n\n  /* This is actually InsertionSort, which is faster for local sorts */\n  for(i = lo0+1; i <= hi0; i++) {\n\n    /* Save bottom-most item */\n    v = a[i];\n\n    /* Shift down! */\n    j = i;\n    while ((j > lo0) && (findCompare((char *) &a[j-1], (char *) &v) > 0)) {\n      a[j] = a[j-1];\n      j--;\n      nmove++;\n    }\n\n    /* Store bottom-most item at the top */\n    a[j] = v;\n  }\n  return( nmove );\n}\nMYBOOL QS_execute(UNIONTYPE QSORTrec a[], int count, findCompare_func findCompare, int *nswaps)\n{\n  int iswaps = 0;\n\n  /* Check and initialize */\n  if(count <= 1)\n    goto Finish;\n  count--;\n\n  /* Perform sort */\n  iswaps = QS_sort(a, 0, count, findCompare);\n#if QS_IS_switch > 0\n  iswaps += QS_finish(a, 0, count, findCompare);\n#endif\n\nFinish:\n  if(nswaps != NULL)\n    *nswaps = iswaps;\n  return( TRUE );\n}\n\n\n\n/* Simple specialized bubble/insertion sort functions */\nint sortByREAL(int *item, REAL *weight, int size, int offset, MYBOOL unique)\n{\n  int i, ii, saveI;\n  REAL saveW;\n\n  for(i = 1; i < size; i++) {\n    ii = i+offset-1;\n    while ((ii >= offset) && (weight[ii] >= weight[ii+1])) {\n      if(weight[ii] == weight[ii+1]) {\n        if(unique)\n          return(item[ii]);\n      }\n      else {\n        saveI = item[ii];\n        saveW = weight[ii];\n        item[ii] = item[ii+1];\n        weight[ii] = weight[ii+1];\n        item[ii+1] = saveI;\n        weight[ii+1] = saveW;\n      }\n      ii--;\n    }\n  }\n  return(0);\n}\nint sortByINT(int *item, int *weight, int size, int offset, MYBOOL unique)\n{\n  int i, ii, saveI;\n  int saveW;\n\n  for(i = 1; i < size; i++) {\n    ii = i+offset-1;\n    while ((ii >= offset) && (weight[ii] >= weight[ii+1])) {\n      if(weight[ii] == weight[ii+1]) {\n        if(unique)\n          return(item[ii]);\n      }\n      else {\n        saveI = item[ii];\n        saveW = weight[ii];\n        item[ii] = item[ii+1];\n        weight[ii] = weight[ii+1];\n        item[ii+1] = saveI;\n        weight[ii+1] = saveW;\n      }\n      ii--;\n    }\n  }\n  return(0);\n}\nREAL sortREALByINT(REAL *item, int *weight, int size, int offset, MYBOOL unique)\n{\n  int  i, ii, saveW;\n  REAL saveI;\n\n  for(i = 1; i < size; i++) {\n    ii = i+offset-1;\n    while ((ii >= offset) && (weight[ii] >= weight[ii+1])) {\n      if(weight[ii] == weight[ii+1]) {\n        if(unique)\n          return(item[ii]);\n      }\n      else {\n        saveI = item[ii];\n        saveW = weight[ii];\n        item[ii] = item[ii+1];\n        weight[ii] = weight[ii+1];\n        item[ii+1] = saveI;\n        weight[ii+1] = saveW;\n      }\n      ii--;\n    }\n  }\n  return(0);\n}\n\n\n/* Time and message functions */\ndouble timeNow(void)\n{\n#ifdef INTEGERTIME\n  return((double)time(NULL));\n#elif defined CLOCKTIME\n  return((double)clock()/CLOCKS_PER_SEC /* CLK_TCK */);\n#elif defined PosixTime\n  struct timespec t;\n# if 0\n  clock_gettime(CLOCK_REALTIME, &t);\n  return( (double) t.tv_sec + (double) t.tv_nsec/1.0e9 );\n# else\n  static double   timeBase;\n\n  clock_gettime(CLOCK_MONOTONIC, &t);\n  if(timeBase == 0)\n    timeBase = clockNow() - ((double) t.tv_sec + (double) t.tv_nsec/1.0e9);\n  return( timeBase + (double) t.tv_sec + (double) t.tv_nsec/1.0e9 );\n# endif\n#elif defined EnhTime\n  static LARGE_INTEGER freq;\n  static double        timeBase;\n  LARGE_INTEGER        now;\n\n  QueryPerformanceCounter(&now);\n  if(timeBase == 0) {\n    QueryPerformanceFrequency(&freq);\n    timeBase = clockNow() - (double) now.QuadPart/(double) freq.QuadPart;\n  }\n  return( timeBase + (double) now.QuadPart/(double) freq.QuadPart );\n#else\n  struct timeb buf;\n\n  ftime(&buf);\n  return((double)buf.time+((double) buf.millitm)/1000.0);\n#endif\n}\n\n\n/* Miscellaneous reporting functions */\n\n/* List a vector of INT values for the given index range */\nvoid blockWriteINT(FILE *output, char *label, int *myvector, int first, int last)\n{\n  int i, k = 0;\n\n  fprintf(output, \"%s\", label);\n  fprintf(output, \"\\n\");\n  for(i = first; i <= last; i++) {\n    fprintf(output, \" %5d\", myvector[i]);\n    k++;\n    if(k % 12 == 0) {\n      fprintf(output, \"\\n\");\n      k = 0;\n    }\n  }\n  if(k % 12 != 0)\n    fprintf(output, \"\\n\");\n}\n\n/* List a vector of MYBOOL values for the given index range */\nvoid blockWriteBOOL(FILE *output, char *label, MYBOOL *myvector, int first, int last, MYBOOL asRaw)\n{\n  int i, k = 0;\n\n  fprintf(output, \"%s\", label);\n  fprintf(output, \"\\n\");\n  for(i = first; i <= last; i++) {\n    if(asRaw)\n      fprintf(output, \" %1d\", myvector[i]);\n    else\n      fprintf(output, \" %5s\", my_boolstr(myvector[i]));\n    k++;\n    if(k % 36 == 0) {\n      fprintf(output, \"\\n\");\n      k = 0;\n    }\n  }\n  if(k % 36 != 0)\n    fprintf(output, \"\\n\");\n}\n\n/* List a vector of REAL values for the given index range */\nvoid blockWriteREAL(FILE *output, char *label, REAL *myvector, int first, int last)\n{\n  int i, k = 0;\n\n  fprintf(output, \"%s\", label);\n  fprintf(output, \"\\n\");\n  for(i = first; i <= last; i++) {\n    fprintf(output, \" %18g\", myvector[i]);\n    k++;\n    if(k % 4 == 0) {\n      fprintf(output, \"\\n\");\n      k = 0;\n    }\n  }\n  if(k % 4 != 0)\n    fprintf(output, \"\\n\");\n}\n\n\n/* CONSOLE vector and matrix printing routines */\nvoid printvec( int n, REAL *x, int modulo )\n{\n  int i;\n\n  if (modulo <= 0) modulo = 5;\n  for (i = 1; i<=n; i++) {\n    if(mod(i, modulo) == 1)\n      printf(\"\\n%2d:%12g\", i, x[i]);\n    else\n      printf(\" %2d:%12g\", i, x[i]);\n  }\n  if(i % modulo != 0) printf(\"\\n\");\n}\n\n\nvoid printmatUT( int size, int n, REAL *U, int modulo)\n{\n   int i, ll;\n   ll = 0;\n   for(i = 1; i<=n; i++) {\n     printvec(n-i+1, &U[ll], modulo);\n     ll += size-i+1;\n   }\n}\n\n\nvoid printmatSQ( int size, int n, REAL *X, int modulo)\n{\n   int i, ll;\n   ll = 0;\n   for(i = 1; i<=n; i++) {\n     printvec(n, &X[ll], modulo);\n     ll += size;\n   }\n}\n\n/* Miscellaneous file functions */\n#if defined _MSC_VER\n/* Check MS versions before 7 */\n#if _MSC_VER < 1300\n# define intptr_t long\n#endif\n\nint fileCount( char *filemask )\n{\n  struct   _finddata_t c_file;\n  intptr_t hFile;\n  int      count = 0;\n\n  /* Find first .c file in current directory */\n  if( (hFile = _findfirst( filemask, &c_file )) == -1L )\n    ;\n  /* Iterate over all matching names */\n  else {\n     while( _findnext( hFile, &c_file ) == 0 )\n       count++;\n    _findclose( hFile );\n  }\n  return( count );\n}\nMYBOOL fileSearchPath( char *envvar, char *searchfile, char *foundpath )\n{\n   char pathbuffer[_MAX_PATH];\n\n   _searchenv( searchfile, envvar, pathbuffer );\n   if(pathbuffer[0] == '\\0')\n     return( FALSE );\n   else {\n     if(foundpath != NULL)\n       strcpy(foundpath, pathbuffer);\n     return( TRUE );\n   }\n}\n#endif\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/shared/commonlib.h",
    "content": "#ifndef HEADER_commonlib\n#define HEADER_commonlib\n\n#include <stdlib.h>\n#include <stdio.h>\n#ifdef WIN32\n  #include <windows.h>\n#endif\n\n/* static char SpaceChars[3] = {\" \" \"\\7\"}; */\n/* static char NumChars[14]  = {\"0123456789-+.\"}; */\n\n#define BIGNUMBER      1.0e+30\n#define TINYNUMBER     1.0e-04\n#define MACHINEPREC   2.22e-16\n#define MATHPREC       1.0e-16\n#define ERRLIMIT       1.0e-06\n\n#ifndef LINEARSEARCH\n  #define LINEARSEARCH 5\n#endif\n\n#if 0\n  #define INTEGERTIME\n#endif\n\n/* ************************************************************************ */\n/* Define loadable library function headers                                 */\n/* ************************************************************************ */\n#if (defined WIN32) || (defined WIN64)\n  #define my_LoadLibrary(name)              LoadLibrary(name)\n  #define my_GetProcAddress(handle, name)   GetProcAddress(handle, name)\n  #define my_FreeLibrary(handle)            FreeLibrary(handle); \\\n                                            handle = NULL\n#else\n  #define my_LoadLibrary(name)              dlopen(name, RTLD_LAZY)\n  #define my_GetProcAddress(handle, name)   dlsym(handle, name)\n  #define my_FreeLibrary(handle)            dlclose(handle); \\\n                                            handle = NULL\n#endif\n\n\n/* ************************************************************************ */\n/* Define sizes of standard number types                                    */\n/* ************************************************************************ */\n#ifndef LLONG\n  #if defined __BORLANDC__\n    #define LLONG __int64\n  #elif !defined _MSC_VER || _MSC_VER >= 1310\n    #define LLONG long long\n  #else\n    #define LLONG __int64\n  #endif\n#endif\n\n#ifndef MYBOOL\n  #if 0\n    #define MYBOOL unsigned int\n  #else\n    #define MYBOOL unsigned char\n  #endif\n#endif\n\n#ifndef REAL\n  #define REAL     double\n#endif\n#ifndef BLAS_prec\n  #define BLAS_prec \"d\" /* The BLAS precision prefix must correspond to the REAL type */\n#endif\n\n#ifndef REALXP\n  #if 1\n    #define REALXP long double  /* Set local accumulation variable as long double */\n  #else\n    #define REALXP REAL          /* Set local accumulation as default precision */\n  #endif\n#endif\n\n#ifndef my_boolstr\n  #define my_boolstr(x)          (!(x) ? \"FALSE\" : \"TRUE\")\n#endif\n\n#ifndef NULL\n  #define NULL \t       0\n#endif\n\n#ifndef FALSE\n  #define FALSE        0\n  #define TRUE         1\n#endif\n\n#ifndef DEF_STRBUFSIZE\n  #define DEF_STRBUFSIZE   512\n#endif\n#ifndef MAXINT32\n  #define MAXINT32  2147483647\n#endif\n#ifndef MAXUINT32\n  #define MAXUINT32 4294967295\n#endif\n\n#ifndef MAXINT64\n  #if defined _LONGLONG || defined __LONG_LONG_MAX__ || defined LLONG_MAX\n    #define MAXINT64   9223372036854775807ll\n  #else\n    #define MAXINT64   9223372036854775807l\n  #endif\n#endif\n#ifndef MAXUINT64\n  #if defined _LONGLONG || defined __LONG_LONG_MAX__ || defined LLONG_MAX\n    #define MAXUINT64 18446744073709551615ll\n  #else\n    #define MAXUINT64 18446744073709551615l\n  #endif\n#endif\n\n#ifndef DOFASTMATH\n  #define DOFASTMATH\n#endif\n\n\n#ifndef CALLOC\n#define CALLOC(ptr, nr)\\\n  if(!((void *) ptr = calloc((size_t)(nr), sizeof(*ptr))) && nr) {\\\n    printf(\"calloc of %d bytes failed on line %d of file %s\\n\",\\\n           (size_t) nr * sizeof(*ptr), __LINE__, __FILE__);\\\n  }\n#endif\n\n#ifndef MALLOC\n#define MALLOC(ptr, nr)\\\n  if(!((void *) ptr = malloc((size_t)((size_t) (nr) * sizeof(*ptr)))) && nr) {\\\n    printf(\"malloc of %d bytes failed on line %d of file %s\\n\",\\\n           (size_t) nr * sizeof(*ptr), __LINE__, __FILE__);\\\n  }\n#endif\n\n#ifndef REALLOC\n#define REALLOC(ptr, nr)\\\n  if(!((void *) ptr = realloc(ptr, (size_t)((size_t) (nr) * sizeof(*ptr)))) && nr) {\\\n    printf(\"realloc of %d bytes failed on line %d of file %s\\n\",\\\n           (size_t) nr * sizeof(*ptr), __LINE__, __FILE__);\\\n  }\n#endif\n\n#ifndef FREE\n#define FREE(ptr)\\\n  if((void *) ptr != NULL) {\\\n    free(ptr);\\\n    ptr = NULL; \\\n  }\n#endif\n\n#ifndef MEMCOPY\n#define MEMCOPY(nptr, optr, nr)\\\n  memcpy((nptr), (optr), (size_t)((size_t)(nr) * sizeof(*(optr))))\n#endif\n\n#ifndef MEMMOVE\n#define MEMMOVE(nptr, optr, nr)\\\n  memmove((nptr), (optr), (size_t)((size_t)(nr) * sizeof(*(optr))))\n#endif\n\n#ifndef MEMALLOCCOPY\n#define MEMALLOCCOPY(nptr, optr, nr)\\\n  {MALLOC(nptr, (size_t)(nr));\\\n   MEMCOPY(nptr, optr, (size_t)(nr));}\n#endif\n\n#ifndef STRALLOCCOPY\n#define STRALLOCCOPY(nstr, ostr)\\\n  {nstr = (char *) malloc((size_t) (strlen(ostr) + 1));\\\n   strcpy(nstr, ostr);}\n#endif\n\n#ifndef MEMCLEAR\n/*#define useMMX*/\n#ifdef useMMX\n  #define MEMCLEAR(ptr, nr)\\\n    mem_set((ptr), '\\0', (size_t)((size_t)(nr) * sizeof(*(ptr))))\n#else\n  #define MEMCLEAR(ptr, nr)\\\n    memset((ptr), '\\0', (size_t)((size_t)(nr) * sizeof(*(ptr))))\n#endif\n#endif\n\n\n#define MIN(x, y)         ((x) < (y) ? (x) : (y))\n#define MAX(x, y)         ((x) > (y) ? (x) : (y))\n#define SETMIN(x, y)      if((x) > (y)) x = y\n#define SETMAX(x, y)      if((x) < (y)) x = y\n#define LIMIT(lo, x, hi)  ((x < (lo) ? lo : ((x) > hi ? hi : x)))\n#define BETWEEN(x, a, b)  (MYBOOL) (((x)-(a)) * ((x)-(b)) <= 0)\n#define IF(t, x, y)       ((t) ? (x) : (y))\n#define SIGN(x)           ((x) < 0 ? -1 : 1)\n\n#define DELTA_SIZE(newSize, oldSize) ((int) ((newSize) * MIN(1.33, pow(1.5, fabs((double)newSize)/((oldSize+newSize)+1)))))\n\n#ifndef CMP_CALLMODEL\n#if (defined WIN32) || (defined WIN64)\n  #define CMP_CALLMODEL _cdecl\n#else\n  #define CMP_CALLMODEL\n#endif\n#endif\n\ntypedef int (CMP_CALLMODEL findCompare_func)(const void *current, const void *candidate);\n#define CMP_COMPARE(current, candidate) ( current < candidate ? -1 : (current > candidate ? 1 : 0) )\n#define CMP_ATTRIBUTES(item)            (((char *) attributes)+(item)*recsize)\n#define CMP_TAGS(item)                  (((char *) tags)+(item)*tagsize)\n\n#ifndef UNIONTYPE\n  #ifdef __cplusplus\n    #define UNIONTYPE\n  #else\n    #define UNIONTYPE union\n  #endif\n#endif\n\n/* This defines a 16 byte sort record (in both 32 and 64 bit OS-es) */\ntypedef struct _QSORTrec1\n{\n  void     *ptr;\n  void     *ptr2;\n} QSORTrec1;\ntypedef struct _QSORTrec2\n{\n  void     *ptr;\n  double   realval;\n} QSORTrec2;\ntypedef struct _QSORTrec3\n{\n  void     *ptr;\n  int      intval;\n  int      intpar1;\n} QSORTrec3;\ntypedef struct _QSORTrec4\n{\n  REAL     realval;\n  int      intval;\n  int      intpar1;\n} QSORTrec4;\ntypedef struct _QSORTrec5\n{\n  double   realval;\n  long int longval;\n} QSORTrec5;\ntypedef struct _QSORTrec6\n{\n  double   realval;\n  double   realpar1;\n} QSORTrec6;\ntypedef struct _QSORTrec7\n{\n  int      intval;\n  int      intpar1;\n  int      intpar2;\n  int      intpar3;\n} QSORTrec7;\nunion QSORTrec\n{\n  QSORTrec1 pvoid2;\n  QSORTrec2 pvoidreal;\n  QSORTrec3 pvoidint2;\n  QSORTrec4 realint2;\n  QSORTrec5 reallong;\n  QSORTrec6 real2;\n  QSORTrec7 int4;\n};\n\n\n#ifdef __cplusplus\n  extern \"C\" {\n#endif\n\nint intpow(int base, int exponent);\nint mod(int n, int d);\n\nvoid strtoup(char *s);\nvoid strtolo(char *s);\nvoid strcpyup(char *t, char *s);\nvoid strcpylo(char *t, char *s);\n\nMYBOOL so_stdname(char *stdname, char *descname, int buflen);\nint gcd(LLONG a, LLONG b, int *c, int *d);\n\nint findIndex(int target, int *attributes, int count, int offset);\nint findIndexEx(void *target, void *attributes, int count, int offset, int recsize, findCompare_func findCompare, MYBOOL ascending);\n\nvoid qsortex_swap(void *attributes, int l, int r, int recsize,\n                         void *tags, int tagsize, char *save, char *savetag);\n\nint qsortex(void *attributes, int count, int offset, int recsize, MYBOOL descending, findCompare_func findCompare, void *tags, int tagsize);\n\nint CMP_CALLMODEL compareCHAR(const void *current, const void *candidate);\nint CMP_CALLMODEL compareINT(const void *current, const void *candidate);\nint CMP_CALLMODEL compareREAL(const void *current, const void *candidate);\nvoid hpsort(void *attributes, int count, int offset, int recsize, MYBOOL descending, findCompare_func findCompare);\nvoid hpsortex(void *attributes, int count, int offset, int recsize, MYBOOL descending, findCompare_func findCompare, int *tags);\n\nvoid QS_swap(UNIONTYPE QSORTrec a[], int i, int j);\nint QS_addfirst(UNIONTYPE QSORTrec a[], void *mydata);\nint QS_append(UNIONTYPE QSORTrec a[], int ipos, void *mydata);\nvoid QS_replace(UNIONTYPE QSORTrec a[], int ipos, void *mydata);\nvoid QS_insert(UNIONTYPE QSORTrec a[], int ipos, void *mydata, int epos);\nvoid QS_delete(UNIONTYPE QSORTrec a[], int ipos, int epos);\nMYBOOL QS_execute(UNIONTYPE QSORTrec a[], int count, findCompare_func findCompare, int *nswaps);\n\nint sortByREAL(int *item, REAL *weight, int size, int offset, MYBOOL unique);\nint sortByINT(int *item, int *weight, int size, int offset, MYBOOL unique);\nREAL sortREALByINT(REAL *item, int *weight, int size, int offset, MYBOOL unique);\n\ndouble timeNow(void);\n\nvoid blockWriteBOOL(FILE *output, char *label, MYBOOL *myvector, int first, int last, MYBOOL asRaw);\nvoid blockWriteINT(FILE *output, char *label, int *myvector, int first, int last);\nvoid blockWriteREAL(FILE *output, char *label, REAL *myvector, int first, int last);\n\nvoid printvec( int n, REAL *x, int modulo );\nvoid printmatSQ( int size, int n, REAL *X, int modulo );\nvoid printmatUT( int size, int n, REAL *U, int modulo );\n\nunsigned int catchFPU(unsigned int mask);\n\n#if defined _MSC_VER\nint fileCount( char *filemask );\nMYBOOL fileSearchPath( char *envvar, char *searchfile, char *foundpath );\n#endif\n\n#ifdef __cplusplus\n  }\n#endif\n\n#endif /* HEADER_commonlib */\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/shared/mmio.c",
    "content": "/*\n*   Matrix Market I/O library for ANSI C\n*\n*   See http://math.nist.gov/MatrixMarket for details.\n*\n*   (Version 1.01, 5/2003)\n*/\n\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <ctype.h>\n\n#include \"mmio.h\"\n\nint mm_read_unsymmetric_sparse(const char *fname, int *M_, int *N_, int *nz_,\n                double **val_, int **I_, int **J_)\n{\n    FILE *f;\n    MM_typecode matcode;\n    int M, N, nz;\n    int i;\n    double *val;\n    int *I, *J;\n    int x;\n\n    if ((f = fopen(fname, \"r\")) == NULL)\n            return -1;\n\n\n    if (mm_read_banner(f, &matcode) != 0)\n    {\n        printf(\"mm_read_unsymetric: Could not process Matrix Market banner \");\n        printf(\" in file [%s]\\n\", fname);\n        return -1;\n    }\n\n\n\n    if ( !(mm_is_real(matcode) && mm_is_matrix(matcode) &&\n            mm_is_sparse(matcode)))\n    {\n        fprintf(stderr, \"Sorry, this application does not support \");\n        fprintf(stderr, \"Market Market type: [%s]\\n\",\n                mm_typecode_to_str(matcode));\n        return -1;\n    }\n\n    /* find out size of sparse matrix: M, N, nz .... */\n\n    if (mm_read_mtx_crd_size(f, &M, &N, &nz) !=0)\n    {\n        fprintf(stderr, \"read_unsymmetric_sparse(): could not parse matrix size.\\n\");\n        return -1;\n    }\n\n    *M_ = M;\n    *N_ = N;\n    *nz_ = nz;\n\n    /* reseve memory for matrices */\n\n    I = (int *) malloc(nz * sizeof(int));\n    J = (int *) malloc(nz * sizeof(int));\n    val = (double *) malloc(nz * sizeof(double));\n\n    *val_ = val;\n    *I_ = I;\n    *J_ = J;\n\n    /* NOTE: when reading in doubles, ANSI C requires the use of the \"l\"  */\n    /*   specifier as in \"%lg\", \"%lf\", \"%le\", otherwise errors will occur */\n    /*  (ANSI C X3.159-1989, Sec. 4.9.6.2, p. 136 lines 13-15)            */\n\n    for (i=0; i<nz; i++)\n    {\n        x = fscanf(f, \"%d %d %lg\\n\", &I[i], &J[i], &val[i]);\n        I[i]--;  /* adjust from 1-based to 0-based */\n        J[i]--;\n    }\n    fclose(f);\n\n    return 0;\n}\n\nint mm_is_valid(MM_typecode matcode)\n{\n    if (!mm_is_matrix(matcode)) return 0;\n    if (mm_is_dense(matcode) && mm_is_pattern(matcode)) return 0;\n    if (mm_is_real(matcode) && mm_is_hermitian(matcode)) return 0;\n    if (mm_is_pattern(matcode) && (mm_is_hermitian(matcode) ||\n                mm_is_skew(matcode))) return 0;\n    return 1;\n}\n\nint mm_read_banner(FILE *f, MM_typecode *matcode)\n{\n    char line[MM_MAX_LINE_LENGTH];\n    char banner[MM_MAX_TOKEN_LENGTH];\n    char mtx[MM_MAX_TOKEN_LENGTH];\n    char crd[MM_MAX_TOKEN_LENGTH];\n    char data_type[MM_MAX_TOKEN_LENGTH];\n    char storage_scheme[MM_MAX_TOKEN_LENGTH];\n    char *p;\n\n\n    mm_clear_typecode(matcode);\n\n    if (fgets(line, MM_MAX_LINE_LENGTH, f) == NULL)\n        return MM_PREMATURE_EOF;\n\n    if (sscanf(line, \"%s %s %s %s %s\", banner, mtx, crd, data_type,\n        storage_scheme) != 5)\n        return MM_PREMATURE_EOF;\n\n\t/* convert to lower case */\n    for (p=mtx; *p!='\\0'; *p= (char) tolower(*p),p++);\n    for (p=crd; *p!='\\0'; *p= (char) tolower(*p),p++);\n    for (p=data_type; *p!='\\0'; *p= (char) tolower(*p),p++);\n    for (p=storage_scheme; *p!='\\0'; *p= (char) tolower(*p),p++);\n\n    /* check for banner */\n    if (strncmp(banner, MatrixMarketBanner, strlen(MatrixMarketBanner)) != 0)\n        return MM_NO_HEADER;\n\n    /* first field should be \"mtx\" */\n    if (strcmp(mtx, MM_MTX_STR) != 0)\n        return  MM_UNSUPPORTED_TYPE;\n    mm_set_matrix(matcode);\n\n\n    /* second field describes whether this is a sparse matrix (in coordinate\n            storgae) or a dense array */\n\n\n    if (strcmp(crd, MM_SPARSE_STR) == 0)\n        mm_set_sparse(matcode);\n    else\n    if (strcmp(crd, MM_DENSE_STR) == 0)\n            mm_set_dense(matcode);\n    else\n        return MM_UNSUPPORTED_TYPE;\n\n\n    /* third field */\n\n    if (strcmp(data_type, MM_REAL_STR) == 0)\n        mm_set_real(matcode);\n    else\n    if (strcmp(data_type, MM_COMPLEX_STR) == 0)\n        mm_set_complex(matcode);\n    else\n    if (strcmp(data_type, MM_PATTERN_STR) == 0)\n        mm_set_pattern(matcode);\n    else\n    if (strcmp(data_type, MM_INT_STR) == 0)\n        mm_set_integer(matcode);\n    else\n        return MM_UNSUPPORTED_TYPE;\n\n\n    /* fourth field */\n\n    if (strcmp(storage_scheme, MM_GENERAL_STR) == 0)\n        mm_set_general(matcode);\n    else\n    if (strcmp(storage_scheme, MM_SYMM_STR) == 0)\n        mm_set_symmetric(matcode);\n    else\n    if (strcmp(storage_scheme, MM_HERM_STR) == 0)\n        mm_set_hermitian(matcode);\n    else\n    if (strcmp(storage_scheme, MM_SKEW_STR) == 0)\n        mm_set_skew(matcode);\n    else\n        return MM_UNSUPPORTED_TYPE;\n\n\n    return 0;\n}\n\nint mm_write_mtx_crd_size(FILE *f, int M, int N, int nz)\n{\n    if (fprintf(f, \"%d %d %d\\n\", M, N, nz) < 0)\n        return MM_COULD_NOT_WRITE_FILE;\n    else\n        return 0;\n}\n\nint mm_read_mtx_crd_size(FILE *f, int *M, int *N, int *nz )\n{\n    char line[MM_MAX_LINE_LENGTH];\n    int num_items_read;\n\n    /* set return null parameter values, in case we exit with errors */\n    *M = *N = *nz = 0;\n\n    /* now continue scanning until you reach the end-of-comments */\n    do {\n      if (fgets(line,MM_MAX_LINE_LENGTH,f) == NULL)\n          return MM_PREMATURE_EOF;\n    } while (line[0] == '%');\n\n    /* line[] is either blank, har M,N or M,N,nz */\n    if (sscanf(line, \"%d %d %d\", M, N, nz) >= 2)\n      return 0;\n\n    else\n    do {\n        num_items_read = fscanf(f, \"%d %d %d\", M, N, nz);\n        if (num_items_read == EOF) return MM_PREMATURE_EOF;\n    } while (num_items_read < 2);\n\n    return 0;\n}\n\n\nint mm_read_mtx_array_size(FILE *f, int *M, int *N)\n{\n    char line[MM_MAX_LINE_LENGTH];\n    int num_items_read;\n    /* set return null parameter values, in case we exit with errors */\n    *M = *N = 0;\n\n    /* now continue scanning until you reach the end-of-comments */\n    do\n    {\n        if (fgets(line,MM_MAX_LINE_LENGTH,f) == NULL)\n            return MM_PREMATURE_EOF;\n    }while (line[0] == '%');\n\n    /* line[] is either blank or has M,N, nz */\n    if (sscanf(line, \"%d %d\", M, N) == 2)\n        return 0;\n\n    else /* we have a blank line */\n    do\n    {\n        num_items_read = fscanf(f, \"%d %d\", M, N);\n        if (num_items_read == EOF) return MM_PREMATURE_EOF;\n    }\n    while (num_items_read != 2);\n\n    return 0;\n}\n\nint mm_write_mtx_array_size(FILE *f, int M, int N)\n{\n    if (fprintf(f, \"%d %d\\n\", M, N) < 0)\n        return MM_COULD_NOT_WRITE_FILE;\n    else\n        return 0;\n}\n\n\n\n/*-------------------------------------------------------------------------*/\n\n/******************************************************************/\n/* use when I[], J[], and val[]J, and val[] are already allocated */\n/******************************************************************/\n\nint mm_read_mtx_crd_data(FILE *f, int M, int N, int nz, int I[], int J[],\n        double val[], MM_typecode matcode)\n{\n    int i;\n    if (mm_is_complex(matcode))\n    {\n        for (i=0; i<nz; i++)\n            if (fscanf(f, \"%d %d %lg %lg\", &I[i], &J[i], &val[2*i], &val[2*i+1])\n                != 4) return MM_PREMATURE_EOF;\n    }\n    else if (mm_is_real(matcode))\n    {\n        for (i=0; i<nz; i++)\n        {\n            if (fscanf(f, \"%d %d %lg\\n\", &I[i], &J[i], &val[i])\n                != 3) return MM_PREMATURE_EOF;\n\n        }\n    }\n\n    else if (mm_is_pattern(matcode))\n    {\n        for (i=0; i<nz; i++)\n            if (fscanf(f, \"%d %d\", &I[i], &J[i])\n                != 2) return MM_PREMATURE_EOF;\n    }\n    else\n        return MM_UNSUPPORTED_TYPE;\n\n    return 0;\n\n}\n\nint mm_read_mtx_crd_entry(FILE *f, int *I, int *J,\n        double *real, double *imag, MM_typecode matcode)\n{\n    if (mm_is_complex(matcode))\n    {\n            if (fscanf(f, \"%d %d %lg %lg\", I, J, real, imag)\n                != 4) return MM_PREMATURE_EOF;\n    }\n    else if (mm_is_real(matcode))\n    {\n            if (fscanf(f, \"%d %d %lg\\n\", I, J, real)\n                != 3) return MM_PREMATURE_EOF;\n\n    }\n\n    else if (mm_is_pattern(matcode))\n    {\n            if (fscanf(f, \"%d %d\", I, J) != 2) return MM_PREMATURE_EOF;\n    }\n    else\n        return MM_UNSUPPORTED_TYPE;\n\n    return 0;\n\n}\n\n\n/************************************************************************\n    mm_read_mtx_crd()  fills M, N, nz, array of values, and return\n                        type code, e.g. 'MCRS'\n\n                        if matrix is complex, values[] is of size 2*nz,\n                            (nz pairs of real/imaginary values)\n************************************************************************/\n\nint mm_read_mtx_crd(char *fname, int *M, int *N, int *nz, int **I, int **J,\n        double **val, MM_typecode *matcode)\n{\n    int ret_code;\n    FILE *f;\n\n    if (strcmp(fname, \"stdin\") == 0) f=stdin;\n    else\n    if ((f = fopen(fname, \"r\")) == NULL)\n        return MM_COULD_NOT_READ_FILE;\n\n\n    if ((ret_code = mm_read_banner(f, matcode)) != 0)\n        return ret_code;\n\n    if (!(mm_is_valid(*matcode) && mm_is_sparse(*matcode) &&\n            mm_is_matrix(*matcode)))\n        return MM_UNSUPPORTED_TYPE;\n\n    if ((ret_code = mm_read_mtx_crd_size(f, M, N, nz)) != 0)\n        return ret_code;\n\n\n    *I = (int *)  malloc(*nz * sizeof(int));\n    *J = (int *)  malloc(*nz * sizeof(int));\n    *val = NULL;\n\n    if (mm_is_complex(*matcode))\n    {\n        *val = (double *) malloc(*nz * 2 * sizeof(double));\n        ret_code = mm_read_mtx_crd_data(f, *M, *N, *nz, *I, *J, *val,\n                *matcode);\n        if (ret_code != 0) return ret_code;\n    }\n    else if (mm_is_real(*matcode))\n    {\n        *val = (double *) malloc(*nz * sizeof(double));\n        ret_code = mm_read_mtx_crd_data(f, *M, *N, *nz, *I, *J, *val,\n                *matcode);\n        if (ret_code != 0) return ret_code;\n    }\n\n    else if (mm_is_pattern(*matcode))\n    {\n        ret_code = mm_read_mtx_crd_data(f, *M, *N, *nz, *I, *J, *val,\n                *matcode);\n        if (ret_code != 0) return ret_code;\n    }\n\n    if (f != stdin) fclose(f);\n    return 0;\n}\n\nint mm_write_banner(FILE *f, MM_typecode matcode)\n{\n    char *str = mm_typecode_to_str(matcode);\n    int ret_code;\n\n    ret_code = fprintf(f, \"%s %s\\n\", MatrixMarketBanner, str);\n/*    free(str);  This is a bug from the official distribution - KE fixed */\n    if (ret_code < 0 )\n        return MM_COULD_NOT_WRITE_FILE;\n    else\n        return 0;\n}\n\nint mm_write_mtx_crd(char fname[], int M, int N, int nz, int I[], int J[],\n        double val[], MM_typecode matcode)\n{\n    FILE *f;\n    int i;\n\n    if (strcmp(fname, \"stdout\") == 0)\n        f = stdout;\n    else\n    if ((f = fopen(fname, \"w\")) == NULL)\n        return MM_COULD_NOT_WRITE_FILE;\n\n    /* print banner followed by typecode */\n    fprintf(f, \"%s \", MatrixMarketBanner);\n    fprintf(f, \"%s\\n\", mm_typecode_to_str(matcode));\n\n    /* print matrix sizes and nonzeros */\n    fprintf(f, \"%d %d %d\\n\", M, N, nz);\n\n    /* print values */\n    if (mm_is_pattern(matcode))\n        for (i=0; i<nz; i++)\n            fprintf(f, \"%d %d\\n\", I[i], J[i]);\n    else\n    if (mm_is_real(matcode))\n        for (i=0; i<nz; i++)\n            fprintf(f, \"%d %d %20.16g\\n\", I[i], J[i], val[i]);\n    else\n    if (mm_is_complex(matcode))\n        for (i=0; i<nz; i++)\n            fprintf(f, \"%d %d %20.16g %20.16g\\n\", I[i], J[i], val[2*i],\n                        val[2*i+1]);\n    else\n    {\n        if (f != stdout) fclose(f);\n        return MM_UNSUPPORTED_TYPE;\n    }\n\n    if (f !=stdout) fclose(f);\n\n    return 0;\n}\n\n\nchar  *mm_typecode_to_str(MM_typecode matcode)\n{\n    static char buffer[MM_MAX_LINE_LENGTH];\n    char *types[4];\n\n    /* check for MTX type */\n    if (mm_is_matrix(matcode))\n        types[0] = MM_MTX_STR;\n    else\n        return NULL;\n\n    /* check for CRD or ARR matrix */\n    if (mm_is_sparse(matcode))\n        types[1] = MM_SPARSE_STR;\n    else\n    if (mm_is_dense(matcode))\n        types[1] = MM_DENSE_STR;\n    else\n        return NULL;\n\n    /* check for element data type */\n    if (mm_is_real(matcode))\n        types[2] = MM_REAL_STR;\n    else\n    if (mm_is_complex(matcode))\n        types[2] = MM_COMPLEX_STR;\n    else\n    if (mm_is_pattern(matcode))\n        types[2] = MM_PATTERN_STR;\n    else\n    if (mm_is_integer(matcode))\n        types[2] = MM_INT_STR;\n    else\n        return NULL;\n\n\n    /* check for symmetry type */\n    if (mm_is_general(matcode))\n        types[3] = MM_GENERAL_STR;\n    else\n    if (mm_is_symmetric(matcode))\n        types[3] = MM_SYMM_STR;\n    else\n    if (mm_is_hermitian(matcode))\n        types[3] = MM_HERM_STR;\n    else\n    if (mm_is_skew(matcode))\n        types[3] = MM_SKEW_STR;\n    else\n        return NULL;\n\n    sprintf(buffer,\"%s %s %s %s\", types[0], types[1], types[2], types[3]);\n    return & buffer[0];\n\n}\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/shared/mmio.h",
    "content": "/*\n*   Matrix Market I/O library for ANSI C\n*\n*   See http://math.nist.gov/MatrixMarket for details.\n*\n*\n*/\n\n#ifndef MM_IO_H\n#define MM_IO_H\n\n#define MM_MAX_LINE_LENGTH 1025\n#define MatrixMarketBanner \"%%MatrixMarket\"\n#define MM_MAX_TOKEN_LENGTH 64\n\ntypedef char MM_typecode[4];\n\nchar *mm_typecode_to_str(MM_typecode matcode);\n\nint mm_read_banner(FILE *f, MM_typecode *matcode);\nint mm_read_mtx_crd_size(FILE *f, int *M, int *N, int *nz);\nint mm_read_mtx_array_size(FILE *f, int *M, int *N);\n\nint mm_write_banner(FILE *f, MM_typecode matcode);\nint mm_write_mtx_crd_size(FILE *f, int M, int N, int nz);\nint mm_write_mtx_array_size(FILE *f, int M, int N);\n\n\n/********************* MM_typecode query fucntions ***************************/\n\n#define mm_is_matrix(typecode)  ((typecode)[0]=='M')\n\n#define mm_is_sparse(typecode)  ((typecode)[1]=='C')\n#define mm_is_coordinate(typecode)((typecode)[1]=='C')\n#define mm_is_dense(typecode) ((typecode)[1]=='A')\n#define mm_is_array(typecode) ((typecode)[1]=='A')\n\n#define mm_is_complex(typecode) ((typecode)[2]=='C')\n#define mm_is_real(typecode)    ((typecode)[2]=='R')\n#define mm_is_pattern(typecode) ((typecode)[2]=='P')\n#define mm_is_integer(typecode) ((typecode)[2]=='I')\n\n#define mm_is_symmetric(typecode)((typecode)[3]=='S')\n#define mm_is_general(typecode) ((typecode)[3]=='G')\n#define mm_is_skew(typecode)  ((typecode)[3]=='K')\n#define mm_is_hermitian(typecode)((typecode)[3]=='H')\n\nint mm_is_valid(MM_typecode matcode);   /* too complex for a macro */\n\n\n/********************* MM_typecode modify fucntions ***************************/\n\n#define mm_set_matrix(typecode) ((*typecode)[0]='M')\n#define mm_set_coordinate(typecode) ((*typecode)[1]='C')\n#define mm_set_array(typecode)  ((*typecode)[1]='A')\n#define mm_set_dense(typecode)  mm_set_array(typecode)\n#define mm_set_sparse(typecode) mm_set_coordinate(typecode)\n\n#define mm_set_complex(typecode)((*typecode)[2]='C')\n#define mm_set_real(typecode) ((*typecode)[2]='R')\n#define mm_set_pattern(typecode)((*typecode)[2]='P')\n#define mm_set_integer(typecode)((*typecode)[2]='I')\n\n\n#define mm_set_symmetric(typecode)((*typecode)[3]='S')\n#define mm_set_general(typecode)((*typecode)[3]='G')\n#define mm_set_skew(typecode) ((*typecode)[3]='K')\n#define mm_set_hermitian(typecode)((*typecode)[3]='H')\n\n#define mm_clear_typecode(typecode) ((*typecode)[0]=(*typecode)[1]= \\\n                  (*typecode)[2]=' ',(*typecode)[3]='G')\n\n#define mm_initialize_typecode(typecode) mm_clear_typecode(typecode)\n\n\n/********************* Matrix Market error codes ***************************/\n\n\n#define MM_COULD_NOT_READ_FILE  11\n#define MM_PREMATURE_EOF        12\n#define MM_NOT_MTX              13\n#define MM_NO_HEADER            14\n#define MM_UNSUPPORTED_TYPE     15\n#define MM_LINE_TOO_LONG        16\n#define MM_COULD_NOT_WRITE_FILE 17\n\n\n/******************** Matrix Market internal definitions ********************\n\n   MM_matrix_typecode: 4-character sequence\n\n            ojbect    sparse/     data        storage\n                  dense       type        scheme\n\n   string position:  [0]        [1]     [2]         [3]\n\n   Matrix typecode:  M(atrix)  C(oord)    R(eal)    G(eneral)\n                    A(array)  C(omplex)   H(ermitian)\n                      P(attern)   S(ymmetric)\n                        I(nteger) K(kew)\n\n ***********************************************************************/\n\n#define MM_MTX_STR    \"matrix\"\n#define MM_ARRAY_STR  \"array\"\n#define MM_DENSE_STR  \"array\"\n#define MM_COORDINATE_STR \"coordinate\"\n#define MM_SPARSE_STR \"coordinate\"\n#define MM_COMPLEX_STR  \"complex\"\n#define MM_REAL_STR   \"real\"\n#define MM_INT_STR    \"integer\"\n#define MM_GENERAL_STR  \"general\"\n#define MM_SYMM_STR   \"symmetric\"\n#define MM_HERM_STR   \"hermitian\"\n#define MM_SKEW_STR   \"skew-symmetric\"\n#define MM_PATTERN_STR  \"pattern\"\n\n\n/*  high level routines */\n\nint mm_write_mtx_crd(char fname[], int M, int N, int nz, int I[], int J[],\n     double val[], MM_typecode matcode);\nint mm_read_mtx_crd_data(FILE *f, int M, int N, int nz, int I[], int J[],\n    double val[], MM_typecode matcode);\nint mm_read_mtx_crd_entry(FILE *f, int *I, int *J, double *real, double *img,\n      MM_typecode matcode);\n\nint mm_read_unsymmetric_sparse(const char *fname, int *M_, int *N_, int *nz_,\n                double **val_, int **I_, int **J_);\n\n\n\n#endif\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/shared/myblas.c",
    "content": "\n#include <stdlib.h>\n#include <stdio.h>\n/*#include <memory.h>*/\n#include <string.h>\n#include <math.h>\n#include \"myblas.h\"\n\n#ifdef FORTIFY\n# include \"lp_fortify.h\"\n#endif\n\n/* ************************************************************************ */\n/* Initialize BLAS interfacing routines                                     */\n/* ************************************************************************ */\nMYBOOL mustinitBLAS = TRUE;\n#ifdef WIN32\n  HINSTANCE hBLAS = NULL;\n#else\n  void      *hBLAS = NULL;\n#endif\n\n\n/* ************************************************************************ */\n/* Function pointers for external BLAS library (C base 0)                   */\n/* ************************************************************************ */\nBLAS_dscal_func  *BLAS_dscal;\nBLAS_dcopy_func  *BLAS_dcopy;\nBLAS_daxpy_func  *BLAS_daxpy;\nBLAS_dswap_func  *BLAS_dswap;\nBLAS_ddot_func   *BLAS_ddot;\nBLAS_idamax_func *BLAS_idamax;\nBLAS_dload_func  *BLAS_dload;\nBLAS_dnormi_func *BLAS_dnormi;\n\n\n/* ************************************************************************ */\n/* Define the BLAS interfacing routines                                     */\n/* ************************************************************************ */\n\nvoid init_BLAS(void)\n{\n  if(mustinitBLAS) {\n    load_BLAS(NULL);\n    mustinitBLAS = FALSE;\n  }\n}\n\nMYBOOL is_nativeBLAS(void)\n{\n#ifdef LoadableBlasLib\n  return( (MYBOOL) (hBLAS == NULL) );\n#else\n  return( TRUE );\n#endif\n}\n\nMYBOOL load_BLAS(char *libname)\n{\n  MYBOOL result = TRUE;\n\n#ifdef LoadableBlasLib\n  if(hBLAS != NULL) {\n  #ifdef WIN32\n    FreeLibrary(hBLAS);\n  #else\n    dlclose(hBLAS);\n  #endif\n    hBLAS = NULL;\n  }\n#endif\n\n  if(libname == NULL) {\n    if(!mustinitBLAS && is_nativeBLAS())\n      return( FALSE );\n    BLAS_dscal = my_dscal;\n    BLAS_dcopy = my_dcopy;\n    BLAS_daxpy = my_daxpy;\n    BLAS_dswap = my_dswap;\n    BLAS_ddot  = my_ddot;\n    BLAS_idamax = my_idamax;\n    BLAS_dload = my_dload;\n    BLAS_dnormi = my_dnormi;\n    if(mustinitBLAS)\n      mustinitBLAS = FALSE;\n  }\n  else {\n#ifdef LoadableBlasLib\n  #ifdef WIN32\n   /* Get a handle to the Windows DLL module. */\n    hBLAS = LoadLibrary(libname);\n\n   /* If the handle is valid, try to get the function addresses. */\n    result = (MYBOOL) (hBLAS != NULL);\n    if(result) {\n      BLAS_dscal  = (BLAS_dscal_func *)  GetProcAddress(hBLAS, BLAS_prec \"scal\");\n      BLAS_dcopy  = (BLAS_dcopy_func *)  GetProcAddress(hBLAS, BLAS_prec \"copy\");\n      BLAS_daxpy  = (BLAS_daxpy_func *)  GetProcAddress(hBLAS, BLAS_prec \"axpy\");\n      BLAS_dswap  = (BLAS_dswap_func *)  GetProcAddress(hBLAS, BLAS_prec \"swap\");\n      BLAS_ddot   = (BLAS_ddot_func *)   GetProcAddress(hBLAS, BLAS_prec \"dot\");\n      BLAS_idamax = (BLAS_idamax_func *) GetProcAddress(hBLAS, \"i\" BLAS_prec \"amax\");\n#if 0      \n      BLAS_dload  = (BLAS_dload_func *)  GetProcAddress(hBLAS, BLAS_prec \"load\");\n      BLAS_dnormi = (BLAS_dnormi_func *) GetProcAddress(hBLAS, BLAS_prec \"normi\");\n#endif      \n    }\n  #else\n   /* First standardize UNIX .SO library name format. */\n    char blasname[260], *ptr;\n\n    strcpy(blasname, libname);\n    if((ptr = strrchr(libname, '/')) == NULL)\n      ptr = libname;\n    else\n      ptr++;\n    blasname[(int) (ptr - libname)] = 0;\n    if(strncmp(ptr, \"lib\", 3))\n      strcat(blasname, \"lib\");\n    strcat(blasname, ptr);\n    if(strcmp(blasname + strlen(blasname) - 3, \".so\"))\n      strcat(blasname, \".so\");\n\n   /* Get a handle to the module. */\n    hBLAS = dlopen(blasname, RTLD_LAZY);\n\n   /* If the handle is valid, try to get the function addresses. */\n    result = (MYBOOL) (hBLAS != NULL);\n    if(result) {\n      BLAS_dscal  = (BLAS_dscal_func *)  dlsym(hBLAS, BLAS_prec \"scal\");\n      BLAS_dcopy  = (BLAS_dcopy_func *)  dlsym(hBLAS, BLAS_prec \"copy\");\n      BLAS_daxpy  = (BLAS_daxpy_func *)  dlsym(hBLAS, BLAS_prec \"axpy\");\n      BLAS_dswap  = (BLAS_dswap_func *)  dlsym(hBLAS, BLAS_prec \"swap\");\n      BLAS_ddot   = (BLAS_ddot_func *)   dlsym(hBLAS, BLAS_prec \"dot\");\n      BLAS_idamax = (BLAS_idamax_func *) dlsym(hBLAS, \"i\" BLAS_prec \"amax\");\n#if 0      \n      BLAS_dload  = (BLAS_dload_func *)  dlsym(hBLAS, BLAS_prec \"load\");\n      BLAS_dnormi = (BLAS_dnormi_func *) dlsym(hBLAS, BLAS_prec \"normi\");\n#endif      \n    }\n  #endif\n#endif\n    /* Do validation */\n    if(!result ||\n       ((BLAS_dscal  == NULL) ||\n        (BLAS_dcopy  == NULL) ||\n        (BLAS_daxpy  == NULL) ||\n        (BLAS_dswap  == NULL) ||\n        (BLAS_ddot   == NULL) ||\n        (BLAS_idamax == NULL) ||\n        (BLAS_dload  == NULL) ||\n        (BLAS_dnormi == NULL))\n      ) {\n      load_BLAS(NULL);\n      result = FALSE;\n    }\n  }\n  return( result );\n}\nMYBOOL unload_BLAS(void)\n{\n  return( load_BLAS(NULL) );\n}\n\n\n/* ************************************************************************ */\n/* Now define the unoptimized local BLAS functions                          */\n/* ************************************************************************ */\nvoid daxpy( int n, REAL da, REAL *dx, int incx, REAL *dy, int incy)\n{\n  dx++;\n  dy++;\n  BLAS_daxpy( &n, &da, dx, &incx, dy, &incy);\n}\nvoid BLAS_CALLMODEL my_daxpy( int *_n, REAL *_da, REAL *dx, int *_incx, REAL *dy, int *_incy)\n{\n\n/* constant times a vector plus a vector.\n   uses unrolled loops for increments equal to one.\n   jack dongarra, linpack, 3/11/78.\n   modified 12/3/93, array[1] declarations changed to array[*] */\n\n  int      i, ix, iy;\n#if !defined DOFASTMATH\n  int      m, mp1;\n#endif\n  register REAL rda;\n  REAL     da = *_da;\n  int      n = *_n, incx = *_incx, incy = *_incy;\n\n  if (n <= 0) return;\n  if (da == 0.0) return;\n\n  dx--;\n  dy--;\n  ix = 1;\n  iy = 1;\n  if (incx < 0)\n     ix = (-n+1)*incx + 1;\n  if (incy < 0)\n     iy = (-n+1)*incy + 1;\n  rda = da;\n\n/* CPU intensive loop; option to do pointer arithmetic */\n#if defined DOFASTMATH\n  {\n    REAL *xptr, *yptr;\n    for (i = 1, xptr = dx + ix, yptr = dy + iy;\n         i <= n; i++, xptr += incx, yptr += incy)\n      (*yptr) += rda*(*xptr);\n    return;\n  }\n#else  \n\n  if (incx==1 && incy==1) goto x20;\n\n/* code for unequal increments or equal increments not equal to 1 */\n  for (i = 1; i<=n; i++) {\n     dy[iy]+= rda*dx[ix];\n     ix+= incx;\n     iy+= incy;\n  }\n  return;\n\n/*  code for both increments equal to 1 */\n\n/*  clean-up loop */\nx20:\n  m = n % 4;\n  if (m == 0) goto x40;\n  for (i = 1; i<=m; i++)\n     dy[i]+= rda*dx[i];\n  if(n < 4) return;\nx40:\n  mp1 = m + 1;\n  for (i = mp1; i<=n; i=i+4) {\n    dy[i]+= rda*dx[i];\n    dy[i + 1]+= rda*dx[i + 1];\n    dy[i + 2]+= rda*dx[i + 2];\n    dy[i + 3]+= rda*dx[i + 3];\n  }\n#endif\n}\n\n\n/* ************************************************************************ */\nvoid dcopy( int n, REAL *dx, int incx, REAL *dy, int incy)\n{\n  dx++;\n  dy++;\n  BLAS_dcopy( &n, dx, &incx, dy, &incy);\n}\n\nvoid BLAS_CALLMODEL my_dcopy (int *_n, REAL *dx, int *_incx, REAL *dy, int *_incy)\n{\n\n/* copies a vector, x, to a vector, y.\n   uses unrolled loops for increments equal to one.\n   jack dongarra, linpack, 3/11/78.\n   modified 12/3/93, array[1] declarations changed to array[*] */\n\n  int      i, ix, iy;\n#if !defined DOFASTMATH\n  int      m, mp1;\n#endif\n  int      n = *_n, incx = *_incx, incy = *_incy;\n\n  if (n<=0) return;\n\n  dx--;\n  dy--;\n  ix = 1;\n  iy = 1;\n  if (incx<0)\n    ix = (-n+1)*incx + 1;\n  if (incy<0)\n    iy = (-n+1)*incy + 1;\n\n\n/* CPU intensive loop; option to do pointer arithmetic */\n#if defined DOFASTMATH\n  {\n    REAL *xptr, *yptr;\n    for (i = 1, xptr = dx + ix, yptr = dy + iy;\n         i <= n; i++, xptr += incx, yptr += incy)\n      (*yptr) = (*xptr);\n    return;\n  }\n#else\n\n  if (incx==1 && incy==1) goto x20;\n\n/* code for unequal increments or equal increments not equal to 1 */\n\n  for (i = 1; i<=n; i++) {\n    dy[iy] = dx[ix];\n    ix+= incx;\n    iy+= incy;\n  }\n  return;\n\n/* code for both increments equal to 1 */\n\n/* version with fast machine copy logic (requires memory.h or string.h) */\nx20:\n#if defined DOFASTMATH\n  MEMCOPY(&dy[1], &dx[1], n);\n  return;\n#else\n\n  m = n % 7;\n  if (m == 0) goto x40;\n  for (i = 1; i<=m; i++)\n     dy[i] = dx[i];\n  if (n < 7) return;\n\nx40:\n  mp1 = m + 1;\n  for (i = mp1; i<=n; i=i+7) {\n     dy[i] = dx[i];\n     dy[i + 1] = dx[i + 1];\n     dy[i + 2] = dx[i + 2];\n     dy[i + 3] = dx[i + 3];\n     dy[i + 4] = dx[i + 4];\n     dy[i + 5] = dx[i + 5];\n     dy[i + 6] = dx[i + 6];\n  }\n#endif\n#endif\n}\n\n\n/* ************************************************************************ */\n\nvoid dscal (int n, REAL da, REAL *dx, int incx)\n{\n  dx++;\n  BLAS_dscal (&n, &da, dx, &incx);\n}\n\nvoid BLAS_CALLMODEL my_dscal (int *_n, REAL *_da, REAL *dx, int *_incx)\n{\n\n/* Multiply a vector by a constant.\n\n     --Input--\n        N  number of elements in input vector(s)\n       DA  double precision scale factor\n       DX  double precision vector with N elements\n     INCX  storage spacing between elements of DX\n\n     --Output--\n       DX  double precision result (unchanged if N.LE.0)\n\n     Replace double precision DX by double precision DA*DX.\n     For I = 0 to N-1, replace DX(IX+I*INCX) with  DA * DX(IX+I*INCX),\n     where IX = 1 if INCX .GE. 0, else IX = 1+(1-N)*INCX. */\n\n  int      i;\n#if !defined DOFASTMATH\n  int      ix, m, mp1;\n#endif\n  register REAL rda;\n  REAL      da = *_da;\n  int      n = *_n, incx = *_incx;\n\n  if (n <= 0)\n    return;\n  rda = da;  \n  \n  dx--;\n\n/* Optionally do fast pointer arithmetic */\n#if defined DOFASTMATH\n  {\n    REAL *xptr;\n    for (i = 1, xptr = dx + 1; i <= n; i++, xptr += incx)\n      (*xptr) *= rda;\n    return;\n  }\n#else\n\n  if (incx == 1)\n    goto x20;\n\n/* Code for increment not equal to 1 */\n  ix = 1;\n  if (incx < 0)\n    ix = (-n+1)*incx + 1;\n  for(i = 1; i <= n; i++, ix += incx)\n    dx[ix] *= rda;\n  return;\n\n/* Code for increment equal to 1. */\n/* Clean-up loop so remaining vector length is a multiple of 5. */\nx20:\n  m = n % 5;\n  if (m == 0) goto x40;\n  for( i = 1; i <= m; i++)\n    dx[i] *= rda;\n  if (n < 5)\n    return;\nx40:\n  mp1 = m + 1;\n  for(i = mp1; i <= n; i += 5) {\n    dx[i]   *= rda;\n    dx[i+1] *= rda;\n    dx[i+2] *= rda;\n    dx[i+3] *= rda;\n    dx[i+4] *= rda;\n  }\n#endif\n}\n\n\n/* ************************************************************************ */\n\nREAL ddot(int n, REAL *dx, int incx, REAL *dy, int incy)\n{\n  dx++;\n  dy++;\n  return( BLAS_ddot (&n, dx, &incx, dy, &incy) );\n}\n\nREAL BLAS_CALLMODEL my_ddot(int *_n, REAL *dx, int *_incx, REAL *dy, int *_incy)\n{\n\n/* forms the dot product of two vectors.\n   uses unrolled loops for increments equal to one.\n   jack dongarra, linpack, 3/11/78.\n   modified 12/3/93, array[1] declarations changed to array[*] */\n\n  register REAL dtemp;\n  int      i, ix, iy;\n#if !defined DOFASTMATH\n  int      m, mp1;\n#endif\n  int      n = *_n, incx = *_incx, incy = *_incy;\n\n  dtemp = 0.0;\n  if (n<=0)\n    return( (REAL) dtemp);\n\n  dx--;\n  dy--;\n  ix = 1;\n  iy = 1;\n  if (incx<0)\n     ix = (-n+1)*incx + 1;\n  if (incy<0)\n     iy = (-n+1)*incy + 1;\n\n/* CPU intensive loop; option to do pointer arithmetic */\n\n#if defined DOFASTMATH\n  {\n    REAL *xptr, *yptr;\n    for (i = 1, xptr = dx + ix, yptr = dy + iy;\n         i <= n; i++, xptr += incx, yptr += incy)\n      dtemp+= (*yptr)*(*xptr);\n    return(dtemp);\n  }\n#else\n\n  if (incx==1 && incy==1) goto x20;\n\n/* code for unequal increments or equal increments not equal to 1 */\n\n  for (i = 1; i<=n; i++) {\n     dtemp+= dx[ix]*dy[iy];\n     ix+= incx;\n     iy+= incy;\n  }\n  return(dtemp);\n\n/* code for both increments equal to 1 */\n\n/* clean-up loop */\n\nx20:\n  m = n % 5;\n  if (m == 0) goto x40;\n  for (i = 1; i<=m; i++)\n     dtemp+= dx[i]*dy[i];\n  if (n < 5) goto x60;\n\nx40:\n  mp1 = m + 1;\n  for (i = mp1; i<=n; i=i+5)\n     dtemp+= dx[i]*dy[i] + dx[i + 1]*dy[i + 1] +\n             dx[i + 2]*dy[i + 2] + dx[i + 3]*dy[i + 3] + dx[i + 4]*dy[i + 4];\n\nx60:\n  return(dtemp);\n#endif\n}\n\n\n/* ************************************************************************ */\n\nvoid dswap( int n, REAL *dx, int incx, REAL *dy, int incy )\n{\n  dx++;\n  dy++;\n  BLAS_dswap( &n, dx, &incx, dy, &incy );\n}\n\nvoid BLAS_CALLMODEL my_dswap( int *_n, REAL *dx, int *_incx, REAL *dy, int *_incy )\n{\n  int   i, ix, iy;\n#if !defined DOFASTMATH\n  int   m, mp1, ns;\n  REAL  dtemp2, dtemp3;\n#endif\n  REAL  dtemp1;\n  int   n = *_n, incx = *_incx, incy = *_incy;\n\n  if (n <= 0) return;\n\n  dx--;\n  dy--;\n  ix = 1;\n  iy = 1;\n  if (incx < 0)\n    ix = (-n+1)*incx + 1;\n  if (incy < 0)\n    iy = (-n+1)*incy + 1;\n\n/* CPU intensive loop; option to do pointer arithmetic */\n#if defined DOFASTMATH\n  {\n    REAL *xptr, *yptr;\n    for (i = 1, xptr = dx + ix, yptr = dy + iy;\n         i <= n; i++, xptr += incx, yptr += incy) {\n      dtemp1 = (*xptr);\n     (*xptr) = (*yptr);\n     (*yptr) = dtemp1;\n    }\n    return;\n  }\n#else  \n\n  if (incx == incy) {\n    if (incx <= 0) goto x5;\n    if (incx == 1) goto x20;\n    goto x60;\n  }\n\n/* code for unequal or nonpositive increments. */\nx5:\n  for (i = 1; i<=n; i++) {\n     dtemp1 = dx[ix];\n     dx[ix] = dy[iy];\n     dy[iy] = dtemp1;\n     ix+= incx;\n     iy+= incy;\n  }\n  return;\n\n/* code for both increments equal to 1.\n   clean-up loop so remaining vector length is a multiple of 3. */\nx20:\n  m = n % 3;\n  if (m == 0) goto x40;\n  for (i = 1; i<=m; i++) {\n     dtemp1 = dx[i];\n     dx[i] = dy[i];\n     dy[i] = dtemp1;\n  }\n  if (n < 3) return;\n\nx40:\n  mp1 = m + 1;\n  for (i = mp1; i<=n; i=i+3) {\n     dtemp1 = dx[i];\n     dtemp2 = dx[i+1];\n     dtemp3 = dx[i+2];\n     dx[i] = dy[i];\n     dx[i+1] = dy[i+1];\n     dx[i+2] = dy[i+2];\n     dy[i] = dtemp1;\n     dy[i+1] = dtemp2;\n     dy[i+2] = dtemp3;\n  }\n  return;\n\n/* code for equal, positive, non-unit increments. */\nx60:\n  ns = n*incx;\n  for (i = 1; i<=ns; i=i+incx) {\n     dtemp1 = dx[i];\n     dx[i] = dy[i];\n     dy[i] = dtemp1;\n  }\n#endif\n}\n\n\n/* ************************************************************************ */\n\nvoid dload(int n, REAL da, REAL *dx, int incx)\n{\n  dx++;\n  BLAS_dload (&n, &da, dx, &incx);\n}\n\nvoid BLAS_CALLMODEL my_dload (int *_n, REAL *_da, REAL *dx, int *_incx)\n{\n/* copies a scalar, a, to a vector, x.\n   uses unrolled loops when incx equals one.\n\n   To change the precision of this program, run the change\n   program on dload.f\n   Alternatively, to make a single precision version append a\n   comment character to the start of all lines between sequential\n      precision > double\n   and\n      end precision > double\n   comments and delete the comment character at the start of all\n   lines between sequential\n      precision > single\n   and\n      end precision > single\n   comments.  To make a double precision version interchange\n    the append and delete operations in these instructions. */\n\n  int    i, ix, m, mp1;\n  REAL   da = *_da;\n  int    n = *_n, incx = *_incx;\n\n  if (n<=0) return;\n  dx--;\n  if (incx==1) goto x20;\n\n/* code for incx not equal to 1 */\n\n  ix = 1;\n  if (incx<0)\n     ix = (-n+1)*incx + 1;\n  for (i = 1; i<=n; i++) {\n     dx[ix] = da;\n     ix+= incx;\n  }\n  return;\n\n/* code for incx equal to 1 and clean-up loop */\n\nx20:\n  m = n % 7;\n  if (m == 0) goto x40;\n  for (i = 1; i<=m; i++)\n     dx[i] = da;\n  if (n < 7) return;\n\nx40:\n  mp1 = m + 1;\n  for (i = mp1; i<=n; i=i+7) {\n     dx[i] = da;\n     dx[i + 1] = da;\n     dx[i + 2] = da;\n     dx[i + 3] = da;\n     dx[i + 4] = da;\n     dx[i + 5] = da;\n     dx[i + 6] = da;\n  }\n}\n\n/* ************************************************************************ */\nint idamax( int n, REAL *x, int is )\n{\n  x++;\n  return ( BLAS_idamax( &n, x, &is ) );\n}\n\nint BLAS_CALLMODEL my_idamax( int *_n, REAL *x, int *_is )\n{\n  register REAL xmax, xtest;\n  int    i, imax = 0;\n#if !defined DOFASTMATH\n  int    ii;\n#endif\n  int    n = *_n, is = *_is;\n\n  if((n < 1) || (is <= 0))\n    return(imax);\n  imax = 1;\n  if(n == 1)\n    return(imax);\n\n#if defined DOFASTMATH\n  xmax = fabs(*x);\n  for (i = 2, x += is; i <= n; i++, x += is) {\n    xtest = fabs(*x);\n    if(xtest > xmax) {\n      xmax = xtest;\n      imax = i;\n    }\n  }\n#else\n  x--;\n  ii = 1;\n  xmax = fabs(x[ii]);\n  for(i = 2, ii+ = is; i <= n; i++, ii+ = is) {\n    xtest = fabs(x[ii]);\n\t  if(xtest > xmax) {\n      xmax = xtest;\n\t\t  imax = i;\n    }\n  }\n#endif  \n  return(imax);\n}\n\n\n/* ************************************************************************ */\nREAL dnormi( int n, REAL *x )\n{\n  x++;\n  return( BLAS_dnormi( &n, x ) );\n}\n\nREAL BLAS_CALLMODEL my_dnormi( int *_n, REAL *x )\n{\n/* ===============================================================\n   dnormi  returns the infinity-norm of the vector x.\n   =============================================================== */\n   int      j;\n   register REAL hold, absval;\n   int      n = *_n;\n\n   x--;\n   hold = 0.0;\n/*   for(j = 1; j <= n; j++) */\n   for(j = n; j > 0; j--) {\n     absval = fabs(x[j]);\n     hold = MAX( hold, absval );\n   }\n\n   return( hold );\n}\n\n\n/* ************************************************************************ */\n/* Subvector and submatrix access routines (Fortran compatibility)          */\n/* ************************************************************************ */\n\n#ifndef UseMacroVector\nint  subvec( int item)\n{\n  return( item-1 );\n}\n#endif\n\nint submat( int nrowb, int row, int col)\n{\n  return( nrowb*(col-1) + subvec(row) );\n}\n\nint posmat( int nrowb, int row, int col)\n{\n  return( submat(nrowb, row, col)+BLAS_BASE );\n}\n\n/* ************************************************************************ */\n/* Randomization functions                                                  */\n/* ************************************************************************ */\n\nvoid randomseed(int seeds[])\n/* Simply create some default seed values */\n{\n  seeds[1] = 123456;\n  seeds[2] = 234567;\n  seeds[3] = 345678;\n}\n\nvoid randomdens( int n, REAL *x, REAL r1, REAL r2, REAL densty, int *seeds )\n{\n/* ------------------------------------------------------------------\n   random  generates a vector x[*] of random numbers\n   in the range (r1, r2) with (approximate) specified density.\n   seeds[*] must be initialized before the first call.\n   ------------------------------------------------------------------ */\n\n  int   i;\n  REAL  *y;\n\n  y = (REAL *) malloc(sizeof(*y) * (n+1));\n  ddrand( n, x, 1, seeds );\n  ddrand( n, y, 1, seeds );\n\n  for (i = 1; i<=n; i++) {\n     if (y[i] < densty)\n        x[i] = r1  +  (r2 - r1) * x[i];\n     else\n        x[i] = 0.0;\n  }\n  free(y);\n}\n\n\n/* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */\n\nvoid ddrand( int n, REAL *x, int incx, int *seeds )\n{\n\n/* ------------------------------------------------------------------\n   ddrand fills a vector x with uniformly distributed random numbers\n   in the interval (0, 1) using a method due to  Wichman and Hill.\n\n   seeds[1..3] should be set to integer values\n   between 1 and 30000 before the first entry.\n\n   Integer arithmetic up to 30323 is required.\n\n   Blatantly copied from Wichman and Hill 19-January-1987.\n   14-Feb-94. Original version.\n   30 Jun 1999. seeds stored in an array.\n   30 Jun 1999. This version of ddrand.\n   ------------------------------------------------------------------ */\n\n  int    ix, xix;\n\n  if (n < 1) return;\n\n  for (ix = 1; ix<=1+(n-1)*incx; ix=ix+incx) {\n     seeds[1]     = 171*(seeds[1] % 177) -  2*(seeds[1]/177);\n     seeds[2]     = 172*(seeds[2] % 176) - 35*(seeds[2]/176);\n     seeds[3]     = 170*(seeds[3] % 178) - 63*(seeds[3]/178);\n\n     if (seeds[1] < 0) seeds[1] = seeds[1] + 30269;\n     if (seeds[2] < 0) seeds[2] = seeds[2] + 30307;\n     if (seeds[3] < 0) seeds[3] = seeds[3] + 30323;\n\n\t x[ix]  = ((REAL) seeds[1])/30269.0 +\n             ((REAL) seeds[2])/30307.0 +\n             ((REAL) seeds[3])/30323.0;\n     xix    = (int) x[ix];\n\t x[ix]  = fabs(x[ix] - xix);\n   }\n\n}\n\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/shared/myblas.h",
    "content": "#ifndef HEADER_myblas\n#define HEADER_myblas\n\n/* ************************************************************************ */\n/* BLAS function interface with local and external loadable versions        */\n/* Author:  Kjell Eikland                                                   */\n/* Version: Initial version spring 2004                                     */\n/* Licence: LGPL                                                            */\n/* ************************************************************************ */\n/* Changes: 19 September 2004   Moved function pointer variable             */\n/*                              declarations from myblas.h to myblas.c      */\n/*                              to avoid linker problems with the Mac.      */\n/*          20 April 2005       Modified all double types to REAL to self-  */\n/*                              adjust to global settings.  Note that BLAS  */\n/*                              as of now does not have double double.      */\n/* ************************************************************************ */\n\n#define BLAS_BASE         1\n#define UseMacroVector\n#if defined LoadableBlasLib\n#  if LoadableBlasLib == 0\n#    undef LoadableBlasLib\n#  endif\n#else\n#  define LoadableBlasLib\n#endif\n\n\n/* ************************************************************************ */\n/* Include necessary libraries                                              */\n/* ************************************************************************ */\n#include \"commonlib.h\"\n#ifdef LoadableBlasLib\n  #ifdef WIN32\n    #include <windows.h>\n  #else\n    #include <dlfcn.h>\n  #endif\n#endif\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n/* ************************************************************************ */\n/* BLAS functions                                                           */\n/* ************************************************************************ */\n\n#ifndef BLAS_CALLMODEL\n#ifdef WIN32\n# define BLAS_CALLMODEL _cdecl\n#else\n# define BLAS_CALLMODEL\n#endif\n#endif\n\ntypedef void   (BLAS_CALLMODEL BLAS_dscal_func) (int *n, REAL *da, REAL *dx, int *incx);\ntypedef void   (BLAS_CALLMODEL BLAS_dcopy_func) (int *n, REAL *dx, int *incx,  REAL *dy, int *incy);\ntypedef void   (BLAS_CALLMODEL BLAS_daxpy_func) (int *n, REAL *da, REAL *dx, int *incx,  REAL *dy, int *incy);\ntypedef void   (BLAS_CALLMODEL BLAS_dswap_func) (int *n, REAL *dx, int *incx,  REAL *dy, int *incy);\ntypedef double (BLAS_CALLMODEL BLAS_ddot_func)  (int *n, REAL *dx, int *incx,  REAL *dy, int *incy);\ntypedef int    (BLAS_CALLMODEL BLAS_idamax_func)(int *n, REAL *x,  int *is);\ntypedef void   (BLAS_CALLMODEL BLAS_dload_func) (int *n, REAL *da, REAL *dx, int *incx);\ntypedef double (BLAS_CALLMODEL BLAS_dnormi_func)(int *n, REAL *x);\n\n#ifndef __WINAPI\n# ifdef WIN32\n#  define __WINAPI WINAPI\n# else\n#  define __WINAPI\n# endif\n#endif\n\nvoid init_BLAS(void);\nMYBOOL is_nativeBLAS(void);\nMYBOOL load_BLAS(char *libname);\nMYBOOL unload_BLAS(void);\n\n/* ************************************************************************ */\n/* User-callable BLAS definitions (C base 1)                                */\n/* ************************************************************************ */\nvoid dscal ( int n, REAL da,  REAL *dx, int incx );\nvoid dcopy ( int n, REAL *dx, int incx, REAL *dy, int incy );\nvoid daxpy ( int n, REAL da,  REAL *dx, int incx,   REAL *dy, int incy );\nvoid dswap ( int n, REAL *dx, int incx, REAL *dy, int incy );\nREAL ddot  ( int n, REAL *dx, int incx, REAL *dy, int incy );\nint  idamax( int n, REAL *x,  int is );\nvoid dload ( int n, REAL da,  REAL *dx, int incx );\nREAL dnormi( int n, REAL *x );\n\n\n/* ************************************************************************ */\n/* Locally implemented BLAS functions (C base 0)                            */\n/* ************************************************************************ */\nvoid BLAS_CALLMODEL my_dscal ( int *n, REAL *da, REAL *dx,  int *incx );\nvoid BLAS_CALLMODEL my_dcopy ( int *n, REAL *dx, int *incx, REAL *dy, int *incy );\nvoid BLAS_CALLMODEL my_daxpy ( int *n, REAL *da, REAL *dx,  int *incx,  REAL *dy, int *incy );\nvoid BLAS_CALLMODEL my_dswap ( int *n, REAL *dx, int *incx, REAL *dy, int *incy );\nREAL BLAS_CALLMODEL my_ddot  ( int *n, REAL *dx, int *incx,  REAL *dy, int *incy );\nint  BLAS_CALLMODEL my_idamax( int *n, REAL *x,  int *is );\nvoid BLAS_CALLMODEL my_dload ( int *n, REAL *da, REAL *dx, int *incx );\nREAL BLAS_CALLMODEL my_dnormi( int *n, REAL *x );\n\n\n/* ************************************************************************ */\n/* Subvector and submatrix access routines (Fortran compatibility)          */\n/* ************************************************************************ */\n#ifdef UseMacroVector\n  #define subvec(item) (item - 1)\n#else\n  int subvec( int item );\n#endif\n\nint submat( int nrowb, int row, int col );\nint posmat( int nrowb, int row, int col );\n\n\n/* ************************************************************************ */\n/* Randomization functions                                                  */\n/* ************************************************************************ */\nvoid randomseed(int *seeds);\nvoid randomdens( int n, REAL *x, REAL r1, REAL r2, REAL densty, int *seeds);\nvoid ddrand( int n, REAL *x, int incx, int *seeds );\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/ufortify.h",
    "content": "/*\n * FILE:\n *   ufortify.h\n *\n * DESCRIPTION:\n *   User options for fortify. Changes to this file require fortify.c to be\n * recompiled, but nothing else.\n */\n\n#ifndef __UFORTIFY_H__\n#define __UFORTIFY_H__\n\n#define FORTIFY_STORAGE\n\n#if defined MSDOS || defined __BORLANDC__ || defined __HIGHC__\n# define KNOWS_POINTER_TYPE\n#endif\n\n#define FORTIFY_WAIT_FOR_KEY         /* Pause after message            */\n\n#if !defined FORTIFY_BEFORE_SIZE\n# define FORTIFY_BEFORE_SIZE     16  /* Bytes to allocate before block */\n#endif\n\n#if !defined FORTIFY_BEFORE_VALUE\n# define FORTIFY_BEFORE_VALUE  0xA3  /* Fill value before block        */\n#endif\n\n#if !defined FORTIFY_AFTER_SIZE\n# define FORTIFY_AFTER_SIZE      16  /* Bytes to allocate after block  */\n#endif\n\n#if !defined FORTIFY_AFTER_VALUE\n# define FORTIFY_AFTER_VALUE   0xA5  /* Fill value after block         */\n#endif\n\n#define FILL_ON_MALLOC               /* Nuke out malloc'd memory       */\n\n#if !defined FILL_ON_MALLOC_VALUE\n# define FILL_ON_MALLOC_VALUE  0xA7  /* Value to initialize with       */\n#endif\n\n#define FILL_ON_FREE                 /* free'd memory is cleared       */\n\n#if !defined FILL_ON_FREE_VALUE\n# define FILL_ON_FREE_VALUE    0xA9  /* Value to de-initialize with    */\n#endif\n\n#define FORTIFY_CheckInterval 1      /* seconds */\n/* #define CHECK_ALL_MEMORY_ON_MALLOC */\n#define CHECK_ALL_MEMORY_ON_FREE\n#define PARANOID_FREE\n\n#define WARN_ON_MALLOC_FAIL    /* A debug is issued on a failed malloc */\n#define WARN_ON_ZERO_MALLOC    /* A debug is issued on a malloc(0)     */\n#define WARN_ON_FALSE_FAIL     /* See Fortify_SetMallocFailRate        */\n#define WARN_ON_SIZE_T_OVERFLOW/* Watch for breaking the 64K limit in  */\n                               /* some braindead architectures...      */\n\n#define FORTIFY_LOCK()\n#define FORTIFY_UNLOCK()\n\n#endif\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/yacc_read.c",
    "content": "/*\n   ============================================================================\n   NAME : yacc_read.c\n\n   PURPOSE : translation of lp-problem and storage in sparse matrix\n\n   SHORT : Subroutines for yacc program to store the input in an intermediate\n   data-structure. The yacc and lex programs translate the input.  First the\n   problemsize is determined and the date is read into an intermediate\n   structure, then readinput fills the sparse matrix.\n\n   USAGE : call yyparse(); to start reading the input.  call readinput(); to\n   fill the sparse matrix.\n   ============================================================================\n   Rows : contains the amount of rows + 1. Rows-1 is the amount of constraints\n   (no bounds) Rows also contains the rownr 0 which is the objective function\n\n   Columns : contains the amount of columns (different variable names found in\n   the constraints)\n\n   Nonnuls : contains the amount of nonnuls = sum of different entries of all\n   columns in the constraints and in the objectfunction\n\n   Hash_tab : contains all columnnames on the first level of the structure the\n   row information is kept under each column structure in a linked list (also\n   the objective funtion is in this structure) Bound information is also\n   stored under under the column name\n\n   First_rside : points to a linked list containing all relational operators\n   and the righthandside values of the constraints the linked list is in\n   reversed order with respect to the rownumbers\n   ============================================================================ */\n#include <string.h>\n#include <limits.h>\n#include <setjmp.h>\n#include \"lpkit.h\"\n#include \"yacc_read.h\"\n\n#ifdef FORTIFY\n# include \"lp_fortify.h\"\n#endif\n\n#define tol 1.0e-10\n#define coldatastep 100\n\n#define HASHSIZE       10007  /* A prime number! */\n\nstruct structSOSvars {\n  char                 *name;\n  int                  col;\n  REAL                 weight;\n  struct structSOSvars *next;\n};\n\nstruct structSOS {\n  char                 *name;\n  short                type;\n  int                  Nvars;\n  int                  weight;\n  struct structSOSvars *SOSvars, *LastSOSvars;\n  struct structSOS     *next;\n};\n\nstruct SOSrow {\n  int  col;\n  REAL value;\n  struct SOSrow *next;\n};\n\nstruct SOSrowdata {\n  short type;\n  char *name;\n  struct SOSrow *SOSrow;\n};\n\nstruct rside /* contains relational operator and rhs value */\n{\n  int           row;\n  REAL          value;\n  REAL          range_value;\n  struct rside  *next;\n  short         relat;\n  short         range_relat;\n  char          negate;\n  short         SOStype;\n};\n\nstruct column\n{\n  int            row;\n  REAL           value;\n  struct  column *next;\n  struct  column *prev;\n};\n\nstruct structcoldata {\n  int               must_be_int;\n  int               must_be_sec;\n  int               must_be_free;\n  REAL              upbo;\n  REAL              lowbo;\n  struct  column   *firstcol;\n  struct  column   *col;\n};\n\nstatic void error(parse_parm *pp, int verbose, char *string)\n{\n  if(pp == NULL)\n    report(NULL, CRITICAL, string);\n  else if(pp->Verbose >= verbose)\n    report(NULL, verbose, \"%s on line %d\\n\", string, pp->lineno);\n}\n\n/*\n * error handling routine for yyparse()\n */\nvoid read_error(parse_parm *pp, void *scanner, char *string)\n{\n  error(pp, CRITICAL, string);\n}\n\n/* called when lex gets a fatal error */\nvoid lex_fatal_error(parse_parm *pp, void *scanner, char *msg)\n{\n  read_error(pp, scanner, msg);\n  longjmp(pp->jump_buf, 1);\n}\n\nvoid add_row(parse_parm *pp)\n{\n  pp->Rows++;\n  pp->rs = NULL;\n  pp->Lin_term_count = 0;\n}\n\nvoid add_sos_row(parse_parm *pp, short SOStype)\n{\n  if (pp->rs != NULL)\n    pp->rs->SOStype = SOStype;\n  pp->Rows++;\n  pp->rs = NULL;\n  pp->Lin_term_count = 0;\n}\n\nvoid check_int_sec_sos_free_decl(parse_parm *pp, int within_int_decl, int within_sec_decl, int sos_decl0, int within_free_decl)\n{\n  pp->Ignore_int_decl = TRUE;\n  pp->Ignore_sec_decl = TRUE;\n  pp->Ignore_free_decl = TRUE;\n  pp->sos_decl = 0;\n  if(within_int_decl) {\n    pp->Ignore_int_decl = FALSE;\n    pp->int_decl = (char) within_int_decl;\n    if(within_sec_decl)\n      pp->Ignore_sec_decl = FALSE;\n  }\n  else if(within_sec_decl) {\n    pp->Ignore_sec_decl = FALSE;\n  }\n  else if(sos_decl0) {\n    pp->sos_decl = (char) sos_decl0;\n  }\n  else if(within_free_decl) {\n    pp->Ignore_free_decl = FALSE;\n  }\n}\n\nstatic void add_int_var(parse_parm *pp, char *name, short int_decl)\n{\n  hashelem *hp;\n\n  if((hp = findhash(name, pp->Hash_tab)) == NULL) {\n    char buf[256];\n\n    sprintf(buf, \"Unknown variable %s declared integer, ignored\", name);\n    error(pp, NORMAL, buf);\n  }\n  else if(pp->coldata[hp->index].must_be_int) {\n    char buf[256];\n\n    sprintf(buf, \"Variable %s declared integer more than once, ignored\", name);\n    error(pp, NORMAL, buf);\n  }\n  else {\n    pp->coldata[hp->index].must_be_int = TRUE;\n    if(int_decl == 2) {\n      if(pp->coldata[hp->index].lowbo != -DEF_INFINITE * (REAL) 10.0) {\n        char buf[256];\n\n        sprintf(buf, \"Variable %s: lower bound on variable redefined\", name);\n        error(pp, NORMAL, buf);\n      }\n      pp->coldata[hp->index].lowbo = 0;\n      if(pp->coldata[hp->index].upbo < DEF_INFINITE) {\n        char buf[256];\n\n        sprintf(buf, \"Variable %s: upper bound on variable redefined\", name);\n        error(pp, NORMAL, buf);\n      }\n      pp->coldata[hp->index].upbo = 1;\n    }\n    else if(int_decl == 3) {\n      if(pp->coldata[hp->index].upbo == DEF_INFINITE * (REAL) 10.0)\n        pp->coldata[hp->index].upbo = 1.0;\n    }\n  }\n}\n\nstatic void add_sec_var(parse_parm *pp, char *name)\n{\n  hashelem *hp;\n\n  if((hp = findhash(name, pp->Hash_tab)) == NULL) {\n    char buf[256];\n\n    sprintf(buf, \"Unknown variable %s declared semi-continuous, ignored\", name);\n    error(pp, NORMAL, buf);\n  }\n  else if(pp->coldata[hp->index].must_be_sec) {\n    char buf[256];\n\n    sprintf(buf, \"Variable %s declared semi-continuous more than once, ignored\", name);\n    error(pp, NORMAL, buf);\n  }\n  else\n    pp->coldata[hp->index].must_be_sec = TRUE;\n}\n\nint set_sec_threshold(parse_parm *pp, char *name, REAL threshold)\n{\n  hashelem *hp;\n\n  if((hp = findhash(name, pp->Hash_tab)) == NULL) {\n    char buf[256];\n\n    sprintf(buf, \"Unknown variable %s declared semi-continuous, ignored\", name);\n    error(pp, NORMAL, buf);\n    return(FALSE);\n  }\n\n  if ((pp->coldata[hp->index].lowbo > 0.0) && (threshold > 0.0)) {\n    char buf[256];\n\n    pp->coldata[hp->index].must_be_sec = FALSE;\n    sprintf(buf, \"Variable %s declared semi-continuous, but it has a non-negative lower bound (%f), ignored\", name, pp->coldata[hp->index].lowbo);\n    error(pp, NORMAL, buf);\n  }\n  if (threshold > pp->coldata[hp->index].lowbo)\n    pp->coldata[hp->index].lowbo = threshold;\n\n  return(pp->coldata[hp->index].must_be_sec);\n}\n\nstatic void add_free_var(parse_parm *pp, char *name)\n{\n  hashelem *hp;\n\n  if((hp = findhash(name, pp->Hash_tab)) == NULL) {\n    char buf[256];\n\n    sprintf(buf, \"Unknown variable %s declared free, ignored\", name);\n    error(pp, NORMAL, buf);\n  }\n  else if(pp->coldata[hp->index].must_be_free) {\n    char buf[256];\n\n    sprintf(buf, \"Variable %s declared free more than once, ignored\", name);\n    error(pp, NORMAL, buf);\n  }\n  else\n    pp->coldata[hp->index].must_be_free = TRUE;\n}\n\nstatic int add_sos_name(parse_parm *pp, char *name)\n{\n  struct structSOS *SOS;\n\n  if(CALLOC(SOS, 1, struct structSOS) == NULL)\n    return(FALSE);\n\n  if(MALLOC(SOS->name, strlen(name) + 1, char) == NULL)\n  {\n    FREE(SOS);\n    return(FALSE);\n  }\n  strcpy(SOS->name, name);\n  SOS->type = 0;\n\n  if(pp->FirstSOS == NULL)\n    pp->FirstSOS = SOS;\n  else\n    pp->LastSOS->next = SOS;\n  pp->LastSOS = SOS;\n\n  return(TRUE);\n}\n\nstatic int add_sos_var(parse_parm *pp, char *name)\n{\n  struct structSOSvars *SOSvar;\n\n  if(name != NULL) {\n    if(CALLOC(SOSvar, 1, struct structSOSvars) == NULL)\n      return(FALSE);\n\n    if(MALLOC(SOSvar->name, strlen(name) + 1, char) == NULL)\n    {\n      FREE(SOSvar);\n      return(FALSE);\n    }\n    strcpy(SOSvar->name, name);\n\n    if(pp->LastSOS->SOSvars == NULL)\n      pp->LastSOS->SOSvars = SOSvar;\n    else\n      pp->LastSOS->LastSOSvars->next = SOSvar;\n    pp->LastSOS->LastSOSvars = SOSvar;\n    pp->LastSOS->Nvars = pp->LastSOS->Nvars + 1;\n  }\n  pp->LastSOS->LastSOSvars->weight = 0;\n\n  return(TRUE);\n}\n\nvoid storevarandweight(parse_parm *pp, char *name)\n{\n  if(!pp->Ignore_int_decl) {\n    add_int_var(pp, name, pp->int_decl);\n    if(!pp->Ignore_sec_decl)\n      add_sec_var(pp, name);\n  }\n  else if(!pp->Ignore_sec_decl)\n    add_sec_var(pp, name);\n  else if(pp->sos_decl==1)\n    add_sos_name(pp, name);\n  else if(pp->sos_decl==2)\n    add_sos_var(pp, name);\n  else if(!pp->Ignore_free_decl)\n    add_free_var(pp, name);\n}\n\nint set_sos_type(parse_parm *pp, int SOStype)\n{\n  if(pp->LastSOS != NULL)\n    pp->LastSOS->type = (short) SOStype;\n  return(TRUE);\n}\n\nint set_sos_weight(parse_parm *pp, double weight, int sos_decl)\n{\n  if(pp->LastSOS != NULL) {\n    if(sos_decl==1)\n      pp->LastSOS->weight = (int) (weight+.1);\n    else\n      pp->LastSOS->LastSOSvars->weight = weight;\n  }\n  return(TRUE);\n}\n\nstatic int inccoldata(parse_parm *pp)\n{\n  long Columns = pp->Columns;\n\n  if(Columns == 0)\n    CALLOC(pp->coldata, coldatastep, struct structcoldata);\n  else if((Columns%coldatastep) == 0)\n    REALLOC(pp->coldata, Columns + coldatastep, struct structcoldata);\n\n  if(pp->coldata != NULL) {\n    pp->coldata[Columns].upbo = (REAL) DEF_INFINITE * (REAL) 10.0;\n    pp->coldata[Columns].lowbo = (REAL) -DEF_INFINITE * (REAL) 10.0; /* temporary. If still this value then 0 will be taken */\n    pp->coldata[Columns].col = NULL;\n    pp->coldata[Columns].firstcol = NULL;\n    pp->coldata[Columns].must_be_int = FALSE;\n    pp->coldata[Columns].must_be_sec = FALSE;\n    pp->coldata[Columns].must_be_free = FALSE;\n  }\n\n  return(pp->coldata != NULL);\n}\n\n/*\n * initialisation of hashstruct and globals.\n */\nstatic int init_read(parse_parm *pp, int verbose)\n{\n  int ok = FALSE;\n\n  pp->Verbose = verbose;\n  set_obj_dir(pp, TRUE);\n  pp->Rows = 0;\n  pp->Non_zeros = 0;\n  pp->Columns = 0;\n  pp->FirstSOS = pp->LastSOS = NULL;\n  pp->Lin_term_count = 0;\n  if (CALLOC(pp->First_rside, 1, struct rside) != NULL) {\n    pp->rs = pp->First_rside;\n    pp->rs->value = pp->rs->range_value = 0;\n    /* first row (nr 0) is always the objective function */\n    pp->rs->relat = OF;\n    pp->rs->range_relat = -1;\n    pp->rs->SOStype = 0;\n    pp->Hash_tab = NULL;\n    pp->Hash_constraints = NULL;\n    if (((pp->Hash_tab = create_hash_table(HASHSIZE, 0)) == NULL) ||\n        ((pp->Hash_constraints = create_hash_table(HASHSIZE, 0)) == NULL)){\n      FREE(pp->First_rside);\n      FREE(pp->Hash_tab);\n      FREE(pp->Hash_constraints);\n    }\n    else\n      ok = TRUE;\n  }\n  return(ok);\n} /* init */\n\n/*\n * clears the tmp_store variable after all information has been copied\n */\nvoid null_tmp_store(parse_parm *pp, int init_Lin_term_count)\n{\n  pp->tmp_store.value = 0;\n  pp->tmp_store.rhs_value = 0;\n  FREE(pp->tmp_store.name);\n  if(init_Lin_term_count)\n    pp->Lin_term_count = 0;\n}\n\n/*\n * variable : pointer to text array with name of variable\n * row      : the rownumber of the constraint\n * value    : value of matrixelement\n *            A(row, variable).\n * Sign     : (global)  determines the sign of value.\n * store()  : stores value in matrix\n *            A(row, variable). If A(row, variable) already contains data,\n *            value is added to the existing value.\n */\nstatic int store(parse_parm *pp, char *variable,\n                 int row,\n                 REAL value)\n{\n  hashelem *h_tab_p;\n  struct column *col_p;\n\n  if(value == 0) {\n    char buf[256];\n\n    sprintf(buf, \"(store) Warning, variable %s has an effective coefficient of 0, Ignored\", variable);\n    error(pp, NORMAL, buf);\n    /* return(TRUE); */\n  }\n\n  if((h_tab_p = findhash(variable, pp->Hash_tab)) == NULL) {\n    if (((h_tab_p = puthash(variable, pp->Columns, NULL, pp->Hash_tab)) == NULL)\n       ) return(FALSE);\n    inccoldata(pp);\n    pp->Columns++; /* counter for calloc of final array */\n    if(value) {\n      if (CALLOC(col_p, 1, struct column) == NULL)\n        return(FALSE);\n      pp->Non_zeros++; /* for calloc of final arrays */\n      col_p->row = row;\n      col_p->value = value;\n      pp->coldata[h_tab_p->index].firstcol = pp->coldata[h_tab_p->index].col = col_p;\n    }\n  }\n  else if((pp->coldata[h_tab_p->index].col == NULL) || (pp->coldata[h_tab_p->index].col->row != row)) {\n    if(value) {\n      if (CALLOC(col_p, 1, struct column) == NULL)\n        return(FALSE);\n      pp->Non_zeros++; /* for calloc of final arrays */\n      if(pp->coldata[h_tab_p->index].col != NULL)\n        pp->coldata[h_tab_p->index].col->prev = col_p;\n      else\n        pp->coldata[h_tab_p->index].firstcol = col_p;\n      col_p->value = value;\n      col_p->row = row;\n      col_p->next = pp->coldata[h_tab_p->index].col;\n      pp->coldata[h_tab_p->index].col = col_p;\n    }\n  }\n  else if(value) {\n    pp->coldata[h_tab_p->index].col->value += value;\n    if(fabs(pp->coldata[h_tab_p->index].col->value) < tol) /* eliminitate rounding errors */\n      pp->coldata[h_tab_p->index].col->value = 0;\n  }\n  return(TRUE);\n} /* store */\n\nstatic int storefirst(parse_parm *pp)\n{\n    struct rside *rp;\n\n    if ((pp->rs != NULL) && (pp->rs->row == pp->tmp_store.row))\n      return(TRUE);\n\n    /* make space for the rhs information */\n    if (CALLOC(rp, 1, struct rside) == NULL)\n      return(FALSE);\n    rp->next = pp->First_rside;\n    pp->First_rside = pp->rs = rp;\n    pp->rs->row = /* row */ pp->tmp_store.row;\n    pp->rs->value = pp->tmp_store.rhs_value;\n    pp->rs->relat = pp->tmp_store.relat;\n    pp->rs->range_relat = -1;\n    pp->rs->SOStype = 0;\n\n    if(pp->tmp_store.name != NULL) {\n      if(pp->tmp_store.value != 0) {\n        if (!store(pp, pp->tmp_store.name, pp->tmp_store.row, pp->tmp_store.value))\n          return(FALSE);\n      }\n      else {\n        char buf[256];\n\n        sprintf(buf, \"Warning, variable %s has an effective coefficient of 0, ignored\", pp->tmp_store.name);\n        error(pp, NORMAL, buf);\n      }\n    }\n    null_tmp_store(pp, FALSE);\n    return(TRUE);\n}\n\n/*\n * store relational operator given in yylex[0] in the rightside list.\n * Also checks if it constraint was a bound and if so stores it in the\n * boundslist\n */\nint store_re_op(parse_parm *pp, char OP, int HadConstraint, int HadVar, int Had_lineair_sum)\n{\n  short tmp_relat;\n\n  switch(OP) {\n\n  case '=':\n    tmp_relat = EQ;\n    break;\n\n  case '>':\n    tmp_relat = GE;\n    break;\n\n  case '<':\n    tmp_relat = LE;\n    break;\n\n  case 0:\n    if(pp->rs != NULL)\n      tmp_relat = pp->rs->relat;\n    else\n      tmp_relat = pp->tmp_store.relat;\n    break;\n\n  default:\n    {\n      char buf[256];\n\n      sprintf(buf, \"Error: unknown relational operator %c\", OP);\n      error(pp, CRITICAL, buf);\n    }\n    return(FALSE);\n    break;\n  }\n\n  if(/* pp->Lin_term_count > 1 */ HadConstraint && HadVar) {/* it is not a bound */\n    if(pp->Lin_term_count <= 1)\n      if(!storefirst(pp))\n        return(FALSE);\n    pp->rs->relat = tmp_relat;\n  }\n  else if(/* pp->Lin_term_count == 0 */ HadConstraint && !Had_lineair_sum /* HadVar */ /* && (pp->rs != NULL) */) { /* it is a range */\n    if(pp->Lin_term_count == 1)\n      if(!storefirst(pp))\n        return(FALSE);\n    if(pp->rs == NULL) { /* range before row, already reported */\n      error(pp, CRITICAL, \"Error: range for undefined row\");\n      return(FALSE);\n    }\n\n    if(pp->rs->negate)\n      switch (tmp_relat) {\n      case LE:\n        tmp_relat = GE;\n        break;\n      case GE:\n        tmp_relat = LE;\n        break;\n      }\n\n    if(pp->rs->range_relat != -1) {\n      error(pp, CRITICAL, \"Error: There was already a range for this row\");\n      return(FALSE);\n    }\n    else if(tmp_relat == pp->rs->relat) {\n      error(pp, CRITICAL, \"Error: relational operator for range is the same as relation operator for equation\");\n      return(FALSE);\n    }\n    else\n      pp->rs->range_relat = tmp_relat;\n  }\n  else /* could be a bound */\n    pp->tmp_store.relat = tmp_relat;\n\n  return(TRUE);\n} /* store_re_op */\n\nint negate_constraint(parse_parm *pp)\n{\n    if(pp->rs != NULL)\n      pp->rs->negate = TRUE;\n\n    return(TRUE);\n}\n\n/*\n * store RHS value in the rightside structure\n * if type = true then\n */\nint rhs_store(parse_parm *pp, REAL value, int HadConstraint, int HadVar, int Had_lineair_sum)\n{\n  if(/* pp->Lin_term_count > 1 */ (HadConstraint && HadVar) || (pp->Rows == 0)){ /* not a bound */\n    if (pp->Rows == 0)\n      value = -value;\n    /* if(pp->Lin_term_count < 2) */\n    if(pp->rs == NULL)\n      pp->tmp_store.rhs_value += value;\n    else\n\n    if(pp->rs == NULL) {\n      error(pp, CRITICAL, \"Error: No variable specified\");\n      return(FALSE);\n    }\n    else\n      pp->rs->value += value;\n  }\n  else if(/* pp->Lin_term_count == 0 */ HadConstraint && !HadVar) { /* a range */\n    if(pp->rs == NULL) /* if range before row, already reported */\n      pp->tmp_store.rhs_value += value;\n    else if(pp->rs->range_relat < 0) /* was a bad range; ignore */;\n    else {\n      if(pp->rs->negate)\n        value = -value;\n      if(((pp->rs->relat == LE) && (pp->rs->range_relat == GE) &&\n         (pp->rs->value < value)) ||\n        ((pp->rs->relat == GE) && (pp->rs->range_relat == LE) &&\n         (pp->rs->value > value)) ||\n        ((pp->rs->relat == EQ) || (pp->rs->range_relat == EQ))) {\n        pp->rs->range_relat = -2;\n        error(pp, CRITICAL, \"Error: range restriction conflicts\");\n        return(FALSE);\n      }\n      else\n        pp->rs->range_value += value;\n    }\n  }\n  else /* a bound */\n    pp->tmp_store.rhs_value += value;\n  return(TRUE);\n} /* RHS_store */\n\n/*\n * store all data in the right place\n * count the amount of lineair terms in a constraint\n * only store in data-structure if the constraint is not a bound\n */\nint var_store(parse_parm *pp, char *var, REAL value, int HadConstraint, int HadVar, int Had_lineair_sum)\n{\n  int row;\n\n  row = pp->Rows;\n\n  /* also in a bound the same var name can occur more than once. Check for\n     this. Don't increment Lin_term_count */\n\n  if(pp->Lin_term_count != 1 || pp->tmp_store.name == NULL || strcmp(pp->tmp_store.name, var) != 0)\n    pp->Lin_term_count++;\n\n  /* always store objective function with rownr == 0. */\n  if(row == 0)\n    return(store(pp, var,  row,  value));\n\n  if(pp->Lin_term_count == 1) { /* don't store yet. could be a bound */\n    if(MALLOC(pp->tmp_store.name, strlen(var) + 1, char) != NULL)\n      strcpy(pp->tmp_store.name, var);\n    pp->tmp_store.row = row;\n    pp->tmp_store.value += value;\n    return(TRUE);\n  }\n\n  if(pp->Lin_term_count == 2) { /* now you can also store the first variable */\n    if(!storefirst(pp))\n      return(FALSE);\n    /* null_tmp_store(pp, FALSE); */\n  }\n\n  return(store(pp, var, row, value));\n} /* var_store */\n\n\n\n/*\n * store the information in tmp_store because it is a bound\n */\nint store_bounds(parse_parm *pp, int warn)\n{\n  if(pp->tmp_store.value != 0) {\n    hashelem *h_tab_p;\n    REAL boundvalue;\n\n    if((h_tab_p = findhash(pp->tmp_store.name, pp->Hash_tab)) == NULL) {\n      /* a new columnname is found, create an entry in the hashlist */\n      if ((h_tab_p = puthash(pp->tmp_store.name, pp->Columns, NULL, pp->Hash_tab)) == NULL) {\n        error(pp, CRITICAL, \"Not enough memory\");\n        return(FALSE);\n      }\n      inccoldata(pp);\n      pp->Columns++; /* counter for calloc of final array */\n    }\n\n    if(pp->tmp_store.value < 0) { /* divide by negative number, */\n      /* relational operator may change */\n      if(pp->tmp_store.relat == GE)\n        pp->tmp_store.relat = LE;\n      else if(pp->tmp_store.relat == LE)\n        pp->tmp_store.relat = GE;\n    }\n\n    boundvalue = pp->tmp_store.rhs_value / pp->tmp_store.value;\n\n#if FALSE\n    /* Check sanity of bound; all variables should be positive */\n    if(   ((pp->tmp_store.relat == EQ) && (boundvalue < 0))\n       || ((pp->tmp_store.relat == LE) && (boundvalue < 0))) { /* Error */\n      error(pp, CRITICAL, \"Error: variables must always be non-negative\");\n      return(FALSE);\n    }\n#endif\n\n#if FALSE\n    if((pp->tmp_store.relat == GE) && (boundvalue <= 0)) /* Warning */\n      error(pp, NORMAL, \"Warning: useless bound; variables are always >= 0\");\n#endif\n\n    /* bound seems to be sane, add it */\n    if((pp->tmp_store.relat == GE) || (pp->tmp_store.relat == EQ)) {\n      if(boundvalue > pp->coldata[h_tab_p->index].lowbo - tol)\n        pp->coldata[h_tab_p->index].lowbo = boundvalue;\n      else if(warn)\n        error(pp, NORMAL, \"Ineffective lower bound, ignored\");\n    }\n    if((pp->tmp_store.relat == LE) || (pp->tmp_store.relat == EQ)) {\n      if(boundvalue < pp->coldata[h_tab_p->index].upbo + tol)\n        pp->coldata[h_tab_p->index].upbo  = boundvalue;\n      else if (warn)\n        error(pp, NORMAL, \"Ineffective upper bound, ignored\");\n    }\n\n    /* check for empty range */\n    if((warn) && (pp->coldata[h_tab_p->index].upbo + tol < pp->coldata[h_tab_p->index].lowbo)) {\n      error(pp, CRITICAL, \"Error: bound contradicts earlier bounds\");\n      return(FALSE);\n    }\n  }\n  else /* pp->tmp_store.value = 0 ! */ {\n    char buf[256];\n\n    if((pp->tmp_store.rhs_value == 0) ||\n       ((pp->tmp_store.rhs_value > 0) && (pp->tmp_store.relat == LE)) ||\n       ((pp->tmp_store.rhs_value < 0) && (pp->tmp_store.relat == GE))) {\n      sprintf(buf, \"Variable %s has an effective coefficient of 0 in bound, ignored\",\n              pp->tmp_store.name);\n      if(warn)\n        error(pp, NORMAL, buf);\n    }\n    else {\n      sprintf(buf, \"Error, variable %s has an effective coefficient of 0 in bound\",\n              pp->tmp_store.name);\n      error(pp, CRITICAL, buf);\n      return(FALSE);\n    }\n  }\n\n  /* null_tmp_store(pp, FALSE); */\n  pp->tmp_store.rhs_value = 0;\n\n  return(TRUE);\n} /* store_bounds */\n\nint set_title(parse_parm *pp, char *name)\n{\n  pp->title = strdup(name);\n  return(TRUE);\n}\n\nint add_constraint_name(parse_parm *pp, char *name)\n{\n  int row;\n  hashelem *hp;\n\n  if((hp = findhash(name, pp->Hash_constraints)) != NULL) {\n    row = hp->index;\n    pp->rs = pp->First_rside;\n    while ((pp->rs != NULL) && (pp->rs->row != row))\n      pp->rs = pp->rs->next;\n  }\n  else {\n    row = pp->Rows;\n    if (((hp = puthash(name, row, NULL, pp->Hash_constraints)) == NULL)\n       ) return(FALSE);\n    if(row)\n      pp->rs = NULL;\n  }\n\n  return(TRUE);\n}\n\n/*\n * transport the data from the intermediate structure to the sparse matrix\n * and free the intermediate structure\n */\nstatic int readinput(parse_parm *pp, lprec *lp)\n{\n  int    i, i1, count, index, col;\n  struct column *cp, *tcp;\n  hashelem *hp;\n  struct rside *rp;\n  signed char *negateAndSOS = NULL;\n  REAL *row = NULL, a;\n  int *rowno = NULL;\n  MYBOOL SOSinMatrix = FALSE;\n  struct SOSrowdata *SOSrowdata = NULL;\n  struct SOSrow *SOSrow, *SOSrow1;\n\n  if(lp != NULL) {\n    if (CALLOC(negateAndSOS, 1 + pp->Rows, signed char) == NULL)\n      return(FALSE);\n\n    rp = pp->First_rside;\n    for(i = pp->Rows; (i >= 0) && (rp != NULL); i--) {\n      if(rp->SOStype == 0)\n        negateAndSOS[i] = (rp->negate ? -1 : 0);\n      else\n        negateAndSOS[i] = (signed char) rp->SOStype;\n\n      rp = rp->next;\n    }\n\n    /* fill names with the rownames */\n    hp = pp->Hash_constraints->first;\n    while(hp != NULL) {\n      if (/* (negateAndSOS[hp->index] <= 0) && */ (!set_row_name(lp, hp->index, hp->name)))\n        return(FALSE);\n      hp = hp->nextelem;\n    }\n  }\n\n  for(i = pp->Rows; i >= 0; i--) {\n    rp = pp->First_rside;\n    if((lp != NULL) && (rp != NULL)) {\n      if(rp->SOStype == 0) {\n        if (rp->negate) {\n          switch (rp->relat) {\n          case LE:\n            rp->relat = GE;\n            break;\n          case GE:\n            rp->relat = LE;\n            break;\n          }\n          switch (rp->range_relat) {\n          case LE:\n            rp->range_relat = GE;\n            break;\n          case GE:\n            rp->range_relat = LE;\n            break;\n          }\n          rp->range_value = -rp->range_value;\n          rp->value = -rp->value;\n        }\n\n        if((rp->range_relat >= 0) && (rp->value == lp->infinite)) {\n          rp->value = rp->range_value;\n          rp->relat = rp->range_relat;\n          rp->range_relat = -1;\n        }\n        else if((rp->range_relat >= 0) && (rp->value == -lp->infinite)) {\n          rp->value = rp->range_value;\n          rp->relat = rp->range_relat;\n          rp->range_relat = -1;\n        }\n        if ((rp->range_relat >= 0) && (rp->range_value == rp->value)) {\n          rp->relat = EQ;\n          rp->range_relat = EQ;\n        }\n        if(i) {\n          set_constr_type(lp, i, rp->relat);\n          pp->relat[i] = rp->relat;\n        }\n        set_rh(lp, i, rp->value);\n        if (rp->range_relat >= 0)\n          set_rh_range(lp, i, rp->range_value - rp->value);\n      }\n      else {\n        SOSinMatrix = TRUE;\n        if(i)\n          pp->relat[i] = rp->relat;\n      }\n    }\n    if(rp != NULL) {\n      pp->First_rside = rp->next;\n      free(rp); /* free memory when data has been read */\n    }\n    else\n      pp->First_rside = NULL;\n  }\n\n  while(pp->First_rside != NULL) {\n    rp = pp->First_rside;\n    pp->First_rside = rp->next;\n    free(rp); /* free memory when data has been read */\n  }\n\n  /* start reading the Hash_list structure */\n  index = 0;\n\n  if((SOSinMatrix) && (CALLOC(SOSrowdata, 1 + pp->Rows, struct SOSrowdata) == NULL)) {\n    FREE(negateAndSOS);\n    FREE(row);\n    FREE(rowno);\n    return(FALSE);\n  }\n\n  if((lp != NULL) &&\n     ((MALLOC(row, 1 + pp->Rows, REAL) == NULL) || (MALLOC(rowno, 1 + pp->Rows, int) == NULL))) {\n    FREE(SOSrowdata);\n    FREE(negateAndSOS);\n    FREE(row);\n    FREE(rowno);\n    return(FALSE);\n  }\n\n  /* for(i = 0; i < pp->Hash_tab->size; i++) {\n    hp = pp->Hash_tab->table[i]; */\n    hp = pp->Hash_tab->first;\n    while(hp != NULL) {\n      count = 0;\n      index++;\n      cp = pp->coldata[hp->index].firstcol;\n      col = hp->index + 1;\n      while(cp != NULL) {\n        if(lp != NULL) {\n          if (negateAndSOS[cp->row] <= 0) {\n            rowno[count] = cp->row;\n              a = cp->value;\n              if (negateAndSOS[cp->row])\n                a = -a;\n            row[count++] = a;\n          }\n          else {\n            if (MALLOC(SOSrow, 1, struct SOSrow) == NULL) {\n              FREE(SOSrowdata);\n              FREE(negateAndSOS);\n              FREE(row);\n              FREE(rowno);\n              return(FALSE);\n            }\n            if(SOSrowdata[cp->row].SOSrow == NULL)\n              SOSrowdata[cp->row].name = strdup(get_row_name(lp, cp->row));\n            SOSrow->next = SOSrowdata[cp->row].SOSrow;\n            SOSrowdata[cp->row].SOSrow = SOSrow;\n            SOSrowdata[cp->row].type = negateAndSOS[cp->row];\n            SOSrow->col = col;\n            SOSrow->value = cp->value;\n          }\n        }\n        tcp = cp;\n        /* cp = cp->next; */\n        cp = cp->prev;\n        free(tcp); /* free memory when data has been read */\n      }\n\n      if(lp != NULL) {\n        add_columnex(lp, count, row, rowno);\n        /* check for bound */\n        if(pp->coldata[hp->index].lowbo == -DEF_INFINITE * 10.0)\n          /* lp->orig_lowbo[pp->Rows+index] = 0.0; */\n          set_lowbo(lp, index, 0);\n        else\n          /* lp->orig_lowbo[pp->Rows+index] = pp->coldata[hp->index].lowbo; */\n          set_lowbo(lp, index, pp->coldata[hp->index].lowbo);\n        /* lp->orig_upbo[pp->Rows+index] = pp->coldata[hp->index].upbo; */\n        if(pp->coldata[hp->index].upbo >= DEF_INFINITE)\n          set_upbo(lp, index, DEF_INFINITE);\n        else\n          set_upbo(lp, index, pp->coldata[hp->index].upbo);\n\n        /* check if it must be an integer variable */\n        if(pp->coldata[hp->index].must_be_int) {\n          /* lp->must_be_int[pp->Rows + index]=TRUE; */\n          set_int(lp, index, TRUE);\n        }\n        if(pp->coldata[hp->index].must_be_sec) {\n          set_semicont(lp, index, TRUE);\n        }\n        if(pp->coldata[hp->index].must_be_free) {\n          set_unbounded(lp, index);\n        }\n\n        /* copy name of column variable */\n        if (!set_col_name(lp, index, hp->name)) {\n          FREE(SOSrowdata);\n          FREE(negateAndSOS);\n          FREE(row);\n          FREE(rowno);\n          return(FALSE);\n        }\n\n        /* put matrix values in intermediate row */\n        /* cp = hp->col; */\n        /* cp = hp->firstcol; */\n      }\n\n      /* thp = hp; */\n      /* hp = hp->next; */\n      /* free(thp->name); */\n      /* free(thp); */ /* free memory when data has been read */\n\n      hp = hp->nextelem;\n\n    }\n    /* pp->Hash_tab->table[i] = NULL; */\n\n  FREE(pp->coldata);\n\n  if(SOSrowdata != NULL) {\n    struct structSOS *structSOS;\n    struct structSOSvars *SOSvars, *SOSvars1;\n    int SOSweight = 0;\n\n    for(i = 1; i <= pp->Rows; i++) {\n      SOSrow = SOSrowdata[i].SOSrow;\n      if(SOSrow != NULL) {\n        if(MALLOC(structSOS, 1, struct structSOS) == NULL) {\n          FREE(SOSrowdata);\n          FREE(negateAndSOS);\n          FREE(row);\n          FREE(rowno);\n          return(FALSE);\n        }\n        structSOS->Nvars = 0;\n        structSOS->type = SOSrowdata[i].type;\n        structSOS->weight = ++SOSweight;\n        structSOS->name = strdup(SOSrowdata[i].name);\n        structSOS->LastSOSvars = NULL;\n        structSOS->next = pp->FirstSOS;\n        pp->FirstSOS = structSOS;\n        SOSvars = NULL;\n        while(SOSrow != NULL) {\n          SOSvars1 = SOSvars;\n          MALLOC(SOSvars, 1, struct structSOSvars);\n          SOSvars->next = SOSvars1;\n          SOSvars->col = SOSrow->col;\n          SOSvars->weight = SOSrow->value;\n          SOSvars->name = NULL;\n          structSOS->Nvars++;\n          SOSrow1 = SOSrow->next;\n          FREE(SOSrow);\n          SOSrow = SOSrow1;\n        }\n        structSOS->SOSvars = SOSvars;\n      }\n    }\n    FREE(SOSrowdata);\n  }\n\n  while(pp->FirstSOS != NULL)\n  {\n    struct structSOSvars *SOSvars, *SOSvars1;\n    int *sosvars, n, col;\n    REAL *weights;\n    hashelem *hp;\n\n    pp->LastSOS = pp->FirstSOS;\n    pp->FirstSOS = pp->FirstSOS->next;\n    SOSvars = pp->LastSOS->SOSvars;\n    if(lp != NULL) {\n      MALLOC(sosvars, pp->LastSOS->Nvars, int);\n      MALLOC(weights, pp->LastSOS->Nvars, double);\n    }\n    else {\n      sosvars = NULL;\n      weights = NULL;\n    }\n    n = 0;\n    while(SOSvars != NULL)\n    {\n      SOSvars1 = SOSvars;\n      SOSvars = SOSvars->next;\n      if(lp != NULL) {\n        col = SOSvars1->col;\n        if(col == 0)\n          if((hp = findhash(SOSvars1->name, lp->colname_hashtab)) != NULL)\n            col = hp->index;\n        if (col) {\n          sosvars[n] = col;\n          weights[n++] = SOSvars1->weight;\n        }\n      }\n      FREE(SOSvars1->name);\n      FREE(SOSvars1);\n    }\n    if(lp != NULL) {\n      add_SOS(lp, pp->LastSOS->name, pp->LastSOS->type, pp->LastSOS->weight, n, sosvars, weights);\n      FREE(weights);\n      FREE(sosvars);\n    }\n    FREE(pp->LastSOS->name);\n    FREE(pp->LastSOS);\n  }\n\n  if(negateAndSOS != NULL) {\n    for(i1 = 0, i = 1; i <= pp->Rows; i++)\n      if(negateAndSOS[i] <= 0)\n        pp->relat[++i1] = pp->relat[i];\n\n#if 01\n    for(i = pp->Rows; i > 0; i--)\n      if(negateAndSOS[i] > 0) {\n        del_constraint(lp, i);\n        pp->Rows--;\n      }\n#endif\n  }\n\n  /* the following should be replaced by a call to the MPS print routine MB */\n\n#if 0\n  if(pp->Verbose) {\n    int j;\n\n    printf(\"\\n\");\n    printf(\"**********Data read**********\\n\");\n    printf(\"Rows    : %d\\n\", pp->Rows);\n    printf(\"Columns : %d\\n\", pp->Columns);\n    printf(\"Nonnuls : %d\\n\", pp->Non_zeros);\n    printf(\"NAME          LPPROB\\n\");\n    printf(\"ROWS\\n\");\n    for(i = 0; i <= pp->Rows; i++) {\n      if(pp->relat[i] == LE)\n        printf(\" L  \");\n      else if(pp->relat[i] == EQ)\n        printf(\" E  \");\n      else if(pp->relat[i] == GE)\n        printf(\" G  \");\n      else if(pp->relat[i] == OF)\n        printf(\" N  \");\n      printf(\"%s\\n\", get_row_name(lp, i));\n    }\n\n    printf(\"COLUMNS\\n\");\n    j = 0;\n    for(i = 0; i < pp->Non_zeros; i++) {\n      if(i == lp->col_end[j])\n        j++;\n      printf(\"    %-8s  %-8s  %g\\n\", get_col_name(lp, j),\n             get_row_name(lp, lp->mat[i].row_nr), (double)lp->mat[i].value);\n    }\n\n    printf(\"RHS\\n\");\n    for(i = 0; i <= pp->Rows; i++) {\n      printf(\"    RHS       %-8s  %g\\n\", get_row_name(lp, i),\n             (double)lp->orig_rhs[i]);\n    }\n\n    printf(\"RANGES\\n\");\n    for(i = 1; i <= pp->Rows; i++)\n      if((lp->orig_upbo[i] != lp->infinite) && (lp->orig_upbo[i] != 0)) {\n        printf(\"    RGS       %-8s  %g\\n\", get_row_name(lp, i),\n               (double)lp->orig_upbo[i]);\n      }\n      else if((lp->orig_lowbo[i] != 0)) {\n        printf(\"    RGS       %-8s  %g\\n\", get_row_name(lp, i),\n               (double)-lp->orig_lowbo[i]);\n      }\n\n    printf(\"BOUNDS\\n\");\n    for(i = pp->Rows + 1; i <= pp->Rows + pp->Columns; i++) {\n      if((lp->orig_lowbo[i] != 0) && (lp->orig_upbo[i] < lp->infinite) &&\n         (lp->orig_lowbo[i] == lp->orig_upbo[i])) {\n        printf(\" FX BND       %-8s  %g\\n\", get_col_name(lp, i - pp->Rows),\n               (double)lp->orig_upbo[i]);\n      }\n      else {\n        if(lp->orig_upbo[i] < lp->infinite)\n            printf(\" UP BND       %-8s  %g\\n\", get_col_name(lp, i - pp->Rows),\n                   (double)lp->orig_upbo[i]);\n        if(lp->orig_lowbo[i] > 0)\n            printf(\" LO BND       %-8s  %g\\n\", get_col_name(lp, i - pp->Rows),\n                   (double)lp->orig_lowbo[i]);\n      }\n    }\n\n    printf(\"ENDATA\\n\");\n  }\n#endif\n\n  FREE(row);\n  FREE(rowno);\n  FREE(negateAndSOS);\n  return(TRUE);\n} /* readinput */\n\nlprec *yacc_read(lprec *lp, int verbose, char *lp_name, int (*parse) (parse_parm *pp), parse_parm *pp, void (*delete_allocated_memory) (parse_parm *pp))\n{\n  REAL *orig_upbo;\n  int stat = -1;\n  lprec *lp0 = lp;\n\n  pp->title = lp_name;\n\n  if(!init_read(pp, verbose))\n    error(pp, CRITICAL, \"init_read failed\");\n  else if (setjmp(pp->jump_buf) == 0)\n    stat = parse(pp);\n\n  delete_allocated_memory(pp);\n\n  pp->Rows--;\n\n  pp->relat = NULL;\n  if((stat != 0) || (CALLOC(pp->relat, pp->Rows + 1, short) != NULL)) {\n    if(stat == 0) {\n      if(lp == NULL) {\n        lp = make_lp(pp->Rows, 0);\n      }\n      else {\n        int NRows;\n\n        for(NRows = get_Nrows(lp); NRows < pp->Rows; NRows++)\n          add_constraintex(lp, 0, NULL, NULL, LE, 0);\n      }\n    }\n    else\n      lp = NULL;\n    if ((stat != 0) || (lp != NULL)) {\n      if(lp != NULL) {\n        set_verbose(lp, pp->Verbose);\n      }\n\n      if (!readinput(pp, lp)) {\n        if((lp != NULL) && (lp0 == NULL))\n          delete_lp(lp);\n        lp = NULL;\n      }\n\n      if(lp != NULL) {\n        set_lp_name(lp, pp->title);\n        if(pp->Maximise)\n          set_maxim(lp);\n\n        if(pp->Rows) {\n          int row;\n\n          MALLOCCPY(orig_upbo, lp->orig_upbo, 1 + pp->Rows, REAL);\n          for(row = 1; row <= pp->Rows; row++)\n            set_constr_type(lp, row, pp->relat[row]);\n\n          memcpy(lp->orig_upbo, orig_upbo, (1 + pp->Rows) * sizeof(*orig_upbo)); /* restore upper bounds (range) */\n          FREE(orig_upbo);\n        }\n      }\n      if((pp->title != NULL) && (pp->title != lp_name))\n        free(pp->title);\n\n      free_hash_table(pp->Hash_tab);\n      free_hash_table(pp->Hash_constraints);\n    }\n    FREE(pp->relat);\n  }\n  null_tmp_store(pp, FALSE);\n  return(lp);\n}\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/lp_solve_5.5/yacc_read.h",
    "content": "/* prototypes of functions used in the parser */\n\n#include <setjmp.h>\n\n#ifndef __READ_H__\n#define __READ_H__\n\nstruct _tmp_store_struct\n{\n  char    *name;\n  int     row;\n  REAL    value;\n  REAL    rhs_value;\n  short   relat;\n};\n\ntypedef struct parse_parm_s\n{\n  void *scanner;\n  long lineno;\n  int Verbose;\n  jmp_buf jump_buf;\n  long Rows, Columns, Non_zeros, Lin_term_count;\n  struct rside *First_rside, *rs;\n  short SOStype;         /* SOS type */\n  char Ignore_int_decl, int_decl, Ignore_sec_decl, Ignore_free_decl, sos_decl, Maximise;\n  hashtable *Hash_tab, *Hash_constraints;\n  struct structcoldata *coldata;\n  struct structSOS *FirstSOS, *LastSOS;\n  struct _tmp_store_struct tmp_store;\n  char *title;\n  short *relat;\n  void *parse_vars;\n} parse_parm;\n\nvoid lex_fatal_error(parse_parm *, void *, char *);\nint set_title(parse_parm *pp, char *name);\nint add_constraint_name(parse_parm *pp, char *name);\nint store_re_op(parse_parm *pp, char OP, int HadConstraint, int HadVar, int Had_lineair_sum);\nvoid null_tmp_store(parse_parm *pp, int init_Lin_term_count);\nint store_bounds(parse_parm *pp, int warn);\nvoid storevarandweight(parse_parm *pp, char *name);\nint set_sos_type(parse_parm *pp, int SOStype);\nint set_sos_weight(parse_parm *pp, double weight, int sos_decl);\nint set_sec_threshold(parse_parm *pp, char *name, REAL threshold);\nint rhs_store(parse_parm *pp, REAL value, int HadConstraint, int HadVar, int Had_lineair_sum);\nint var_store(parse_parm *pp, char *var, REAL value, int HadConstraint, int HadVar, int Had_lineair_sum);\nint negate_constraint(parse_parm *pp);\nvoid add_row(parse_parm *pp);\nvoid add_sos_row(parse_parm *pp, short SOStype);\n\nvoid read_error(parse_parm *, void *, char *);\nvoid check_int_sec_sos_free_decl(parse_parm *, int, int, int, int);\nlprec *yacc_read(lprec *lp, int verbose, char *lp_name, int (*parse) (parse_parm *pp), parse_parm *pp, void (*delete_allocated_memory) (parse_parm *pp));\n\n#define set_obj_dir(pp, maximise) pp->Maximise = maximise\n#endif\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/patchgen/ILP.h",
    "content": "#pragma once\r\n#include <lp_lib.h>\r\n#include <Eigen/Core>\r\n\r\nstruct ILP {\r\n    int num_variables;\r\n    lprec* ptr;\r\n    \r\n    ILP(int num_variables)\r\n        : num_variables(num_variables)\r\n        , ptr(::make_lp(0, num_variables))\r\n    {\r\n        ::set_verbose(ptr, SEVERE);\r\n        // set all variables to be integer\r\n        for (int i = 0; i < num_variables; ++i)\r\n            if (!::set_int(ptr, i + 1, TRUE)) assert(false);\n        // default ojective\r\n        set_objective(Eigen::VectorXd::Ones(num_variables), true);\r\n    }\r\n    ~ILP() { ::delete_lp(ptr); }\r\n    void add_constraint(const Eigen::VectorXd& row, int constr_type, double rhs) const {\r\n        assert(row.size() == num_variables);\r\n        Eigen::VectorXd tmp;\r\n        tmp.resize(num_variables + 1);\r\n        tmp[0] = 0;\r\n        tmp.tail(num_variables) = row;\r\n        if (!::add_constraint(ptr, &tmp[0], constr_type, rhs)) assert(false);\n    }\n    void add_constraint(const Eigen::MatrixXd& rows, int constr_type, const Eigen::VectorXd& rhs) const {\n        for (int i = 0; i < rows.rows(); ++i)\n            add_constraint(rows.row(i), constr_type, rhs[i]);\n    }\n    void set_objective(const Eigen::VectorXd& row, bool is_maxim) const {\n        assert(row.size() == num_variables);\r\n        Eigen::VectorXd tmp;\n        tmp.resize(num_variables + 1);\r\n        tmp[0] = 0;\r\n        tmp.tail(num_variables) = row;\r\n        if (!::set_obj_fn(ptr, &tmp[0])) assert(false);\n        (is_maxim ? ::set_maxim : ::set_minim)(ptr);\n    }\n    bool solve() const { return ::solve(ptr) <= SUBOPTIMAL; }\n    void refresh() {            // workaround for weird error when re-solving\r\n        auto ptr_old = ptr;\r\n        ptr = ::copy_lp(ptr);\r\n        ::delete_lp(ptr_old);\r\n    }\r\n    Eigen::VectorXi get_variables() const {\r\n        Eigen::VectorXd variables = Eigen::VectorXd::Zero(num_variables);\r\n        if (!::get_variables(ptr, &variables[0])) assert(false);\n        return variables.cast<int>();\n    }\n};\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/patchgen/PatchParam.h",
    "content": "#pragma once\r\n#include \"Permutation.h\"\r\n\r\nnamespace patchgen {\r\n    struct PatchParam {\r\n        int pattern_id;\r\n        Eigen::VectorXi l;              // original input without permutation\r\n        Permutation permutation;\r\n        Eigen::VectorXi p;              // padding\r\n        Eigen::VectorXi q;              // padding inserted inside the pattern (p[i] and q[i] have the same effect on the boundary. i.e. same basis vector)\r\n        int x;                          // number of edgeflows\r\n        int y;\r\n        int z;                          // parameters describing auxiliary edgeflow counts (only relevant for 6-sided) TODO: better explanation...\r\n        int w;\r\n        PatchParam()\r\n            : pattern_id(-1)\r\n            , x(-1)\r\n            , y(-1)\r\n            , z(-1)\r\n            , w(-1)\r\n        {}\r\n        int get_num_sides() const { return l.size(); }\r\n        Eigen::VectorXi get_l_permuted() const { return permutation(l); }\r\n    };\r\n}"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/patchgen/PatchVertexTag.h",
    "content": "#pragma once\r\n#include <kt84/util.h>\r\n\r\nnamespace patchgen {\r\n\r\nenum struct PatchVertexTag {\r\n    None = -1,\r\n    C0,\r\n    C1,\r\n    C2,\r\n    C3,\r\n    C4,\r\n    C5,\r\n    V0,\r\n    V1,\r\n    V2,\r\n    V3,\r\n    V4,\r\n    V5,\r\n    V6,\r\n    V7,\r\n    V8,\r\n};\r\n\r\ntemplate <typename PatchT>\r\ntypename PatchT::VHandle add_tagged_vertex (PatchT& patch, int index, bool is_corner) {\r\n    auto v = patch.add_vertex(typename PatchT::Point());\r\n    auto& vdata = patch.data(v);\r\n    vdata.patchgen.corner_index = is_corner ? index : -1;\r\n    vdata.patchgen.tag          = kt84::util::add_enum(is_corner ? PatchVertexTag::C0 : PatchVertexTag::V0, index);\r\n    return v;\r\n}\r\n\r\ntemplate <typename PatchT>\r\ntypename PatchT::VHandle find_tagged_vertex(const PatchT& patch, const PatchVertexTag& tag) {\r\n    for (auto v : patch.vertices())\r\n        if (patch.data(v).patchgen.tag == tag) return v;\r\n    return typename PatchT::VHandle();\r\n}\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/patchgen/PatchVertexTraits.h",
    "content": "#pragma once\r\n#include \"PatchVertexTag.h\"\r\n\r\nnamespace patchgen {\r\n    struct PatchVertexTraits {\r\n        struct Data {\r\n            int corner_index;\r\n            PatchVertexTag tag;            // later used when finding vertices in the core pattern\r\n            Data()\r\n                : corner_index(-1)\r\n                , tag(PatchVertexTag::None)\r\n            {}\r\n        } patchgen;\r\n    };\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/patchgen/Pattern.h",
    "content": "#pragma once\r\n#include \"PatchParam.h\"\r\n#include \"PatchVertexTag.h\"\r\n#include <vector>\r\n#include <string>\r\n#include <utility>\r\n\r\nnamespace patchgen {\r\n    typedef std::vector<std::vector<std::pair<PatchVertexTag, PatchVertexTag>>> VariableIndicators;\r\n    \r\n    template <int NumSides, int PatternID>\r\n    struct Pattern {\r\n        static Eigen::MatrixXd& get_constraint_matrix();\r\n        \r\n        static Eigen::VectorXd get_constraint_rhs(const Eigen::VectorXi& l);\r\n        \r\n        static int& get_variable(PatchParam& param, int index);\r\n        \r\n        static bool get_default_parameter(const Eigen::VectorXi& l, PatchParam& param);\r\n        \r\n        template <typename PatchT>\r\n        static void generate_subtopology(const PatchParam& param, PatchT& patch);\r\n        \r\n        static VariableIndicators& get_variable_indicators();\r\n        \r\n        static std::string get_param_str(const PatchParam& param);\r\n    };\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/patchgen/Pattern_2_0.h",
    "content": "#pragma once\r\n#include \"Pattern.h\"\r\n#include \"ILP.h\"\r\n#include <sstream>\r\n#include <kt84/openmesh/edgeloop.h>\r\n\r\n/*\r\nequation for pattern 0:\r\np0|0| + p1|2| + |3| + x|2| + y|1| = |l0|\r\n|2|     |0|   |1|    |0|    |1|   |l1|\r\nactually, x can be seen the same as p1:\r\np0|0| + p1|2| + |3| + y|1| = |l0|\r\n|2|     |0|   |1|    |1|   |l1|\r\n*/\r\nnamespace patchgen {\r\n    template <>\r\n    struct Pattern<2, 0> {\r\n        static Eigen::MatrixXd& get_constraint_matrix() {\r\n            static Eigen::MatrixXd constraint_matrix;\r\n            if (constraint_matrix.size() == 0) {\r\n                constraint_matrix.resize(2, 3);\r\n                constraint_matrix <<\r\n                    0, 2, 1,\r\n                    2, 0, 1;\r\n            }\r\n            return constraint_matrix;\r\n        }\r\n        static Eigen::VectorXd get_constraint_rhs(const Eigen::VectorXi& l) {\r\n            return Eigen::Vector2d(l[0] - 3, l[1] - 1);\r\n        }\r\n\r\n        static int& get_variable(PatchParam& param, int index) {\r\n            if (index < 2) return param.p[index];\r\n            return param.y;\r\n        }\r\n\r\n        static bool get_default_parameter(const Eigen::VectorXi& l, PatchParam& param) {\r\n            auto& constraint_matrix = get_constraint_matrix();\r\n            const int num_variables = constraint_matrix.cols();\r\n            ILP ilp(num_variables);\r\n            ilp.add_constraint(constraint_matrix, EQ, get_constraint_rhs(l));\r\n\r\n            // arbitrary constraints and objective\r\n            // ymin\r\n            ilp.set_objective(Eigen::Vector3d(0, 0, 1), false);\r\n            if (!ilp.solve()) return false;\r\n            int ymin = ilp.get_variables()[2];\r\n            // ymax\r\n            ilp.refresh();\r\n            ilp.set_objective(Eigen::Vector3d(0, 0, 1), true);\r\n            if (!ilp.solve()) return false;\r\n            int ymax = ilp.get_variables()[2];\r\n            // ymid-1<=y<=ymid+1\r\n            ilp.refresh();\r\n            int ymid = (ymin + ymax) / 2;\r\n            ilp.add_constraint(Eigen::Vector3d(0, 0, 1), LE, ymid + 1);\r\n            ilp.add_constraint(Eigen::Vector3d(0, 0, 1), GE, ymid - 1);\r\n            // maximize p0+p1\r\n            ilp.set_objective(Eigen::Vector3d(1, 1, 0), true);\r\n            if (!ilp.solve()) return false;\r\n\r\n            auto variables = ilp.get_variables();\r\n            for (int i = 0; i < num_variables; ++i)\r\n                get_variable(param, i) = variables[i];\r\n\r\n            param.pattern_id = 0;\r\n            return true;\r\n        }\r\n        template <typename PatchT>\r\n        static void generate_subtopology(const PatchParam& param, PatchT& patch) {\r\n            /*\r\n            |          v--y\r\n            |         ____\r\n            |     ___/    \\___\r\n            |    /            \\\r\n            |   C0            C1\r\n            |    \\__        __/\r\n            |  x--^ V0____V1 ^--x\r\n            |          ^--y\r\n            */\r\n            patch.clear();\r\n            typename PatchT::VHandle C[2];\r\n            typename PatchT::VHandle V[2];\r\n            for (int i = 0; i < 2; ++i) C[i] = add_tagged_vertex(patch, i, true);\r\n            for (int i = 0; i < 2; ++i) V[i] = add_tagged_vertex(patch, i, false);\r\n\r\n            patch.add_face(C[0], V[0], V[1], C[1]);\r\n\r\n            auto h_insert_y = patch.halfedge_handle(V[1]);  // corresponds to V1-V0\r\n            for (int i = 0; i < param.y; ++i)\r\n                insert_edgeloop(patch, h_insert_y);\r\n        }\r\n        static VariableIndicators& get_variable_indicators() {\r\n            static VariableIndicators variable_indicators;\r\n            if (variable_indicators.empty()) {\r\n                variable_indicators.resize(1);\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::V0, PatchVertexTag::V1));       // for y\r\n            }\r\n            return variable_indicators;\r\n        }\r\n        static std::string get_param_str(const PatchParam& param) {\r\n            std::stringstream ss;\r\n            ss << \"y=\" << param.y;\r\n            return ss.str();\r\n        }\r\n    };\r\n\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/patchgen/Pattern_2_1.h",
    "content": "#pragma once\r\n#include \"Pattern.h\"\r\n#include \"ILP.h\"\r\n#include <sstream>\r\n#include <kt84/openmesh/edgeloop.h>\r\n\r\n/*\r\nequation for pattern 1:\r\np0|0| + p1|2| + |2| + x|1| + y|1| = |l0|\r\n  |2|     |0|   |2|    |1|    |1|   |l1|\r\n*/\r\nnamespace patchgen {\r\n    template <>\r\n    struct Pattern<2, 1> {\r\n        static Eigen::MatrixXd& get_constraint_matrix() {\r\n            static Eigen::MatrixXd constraint_matrix;\r\n            if (constraint_matrix.size() == 0) {\r\n                constraint_matrix.resize(2, 4);\r\n                constraint_matrix << 0, 2, 1, 1,\r\n                                     2, 0, 1, 1;\r\n            }\r\n            return constraint_matrix;\r\n        }\r\n        static Eigen::VectorXd get_constraint_rhs(const Eigen::VectorXi& l) {\r\n            return Eigen::Vector2d(l[0] - 2, l[1] - 2);\r\n        }\r\n        static int& get_variable(PatchParam& param, int index) {\r\n            if (index < 2) return param.p[index];\r\n            if (index == 2) return param.x;\r\n            return param.y;\r\n        }\r\n        static bool get_default_parameter(const Eigen::VectorXi& l, PatchParam& param) {\r\n            auto& constraint_matrix = get_constraint_matrix();\r\n            const int num_variables = constraint_matrix.cols();\r\n            ILP ilp(num_variables);\r\n            ilp.add_constraint(constraint_matrix, EQ, get_constraint_rhs(l));\r\n    \r\n            // arbitrary constraints and objective\r\n            // xmin\r\n            ilp.set_objective(Eigen::Vector4d(0, 0, 1, 0), false);\r\n            if (!ilp.solve()) return false;\r\n            int xmin = ilp.get_variables()[2];\r\n            // xmax\r\n            ilp.refresh();\r\n            ilp.set_objective(Eigen::Vector4d(0, 0, 1, 0), true);\r\n            if (!ilp.solve()) return false;\r\n            int xmax = ilp.get_variables()[2];\r\n            // xmid-1<=x<=xmid+1\r\n            ilp.refresh();\r\n            int xmid = (xmin + xmax) / 2;\r\n            ilp.add_constraint(Eigen::Vector4d(0, 0, 1, 0), LE, xmid + 1);\r\n            ilp.add_constraint(Eigen::Vector4d(0, 0, 1, 0), GE, xmid - 1);\r\n            // maximize p0+p1\r\n            ilp.set_objective(Eigen::Vector4d(1, 1, 0, 0), true);\r\n            if (!ilp.solve()) return false;\r\n        \r\n            auto variables = ilp.get_variables();\r\n            for (int i = 0; i < num_variables; ++i)\r\n                get_variable(param, i) = variables[i];\r\n        \r\n            param.pattern_id = 1;\r\n            return true;\r\n        }\r\n        template <typename PatchT>\r\n        static void generate_subtopology(const PatchParam& param, PatchT& patch) {\r\n            /*\r\n        |   y--v __V1__  v--x\r\n        |     __/      \\__\r\n        |    /            \\\r\n        |   C0            C1\r\n        |    \\__        __/\r\n        |       \\__V0__/\r\n        |   x--^       ^--y\r\n            */\r\n            patch.clear();\r\n            typename PatchT::VHandle C[2];\r\n            typename PatchT::VHandle V[2];\r\n            for (int i = 0; i < 2; ++i) C[i] = add_tagged_vertex(patch, i, true );\r\n            for (int i = 0; i < 2; ++i) V[i] = add_tagged_vertex(patch, i, false);\r\n        \r\n            patch.add_face(C[0], V[0], C[1], V[1]);\r\n        \r\n            auto h_insert_x = patch.halfedge_handle(V[0]);  // corresponds to V0-C0\r\n            for (int i = 0; i < param.x; ++i)\r\n                insert_edgeloop(patch, h_insert_x);\r\n            auto h_insert_y = patch.halfedge_handle(C[1]);  // corresponds to C1-V0\r\n            for (int i = 0; i < param.y; ++i)\r\n                insert_edgeloop(patch, h_insert_y);\r\n        }\r\n        static VariableIndicators& get_variable_indicators() {\r\n            static VariableIndicators variable_indicators;\r\n            if (variable_indicators.empty()) {\r\n                variable_indicators.resize(2);\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::C0, PatchVertexTag::V0));       // for x\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::C1, PatchVertexTag::V1));\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::C0, PatchVertexTag::V1));       // for y\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::C1, PatchVertexTag::V0));\r\n            }\r\n            return variable_indicators;\r\n        }\r\n        static std::string get_param_str(const PatchParam& param) {\r\n            std::stringstream ss;\r\n            ss << \"x=\" << param.x\r\n               << \"_y=\" << param.y;\r\n            return ss.str();\r\n        }\r\n    };\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/patchgen/Pattern_3_0.h",
    "content": "#pragma once\r\n#include \"Pattern.h\"\r\n#include \"ILP.h\"\r\n\r\n/*\r\nequation for pattern 0:\r\n  |0|     |1|     |1|   |2|   |l0|\r\np0|1| + p1|0| + p2|1| + |1| = |l1|\r\n  |1|     |1|     |0|   |1|   |l2|\r\n*/\r\nnamespace patchgen {\r\n    template <>\r\n    struct Pattern<3, 0> {\r\n        static Eigen::MatrixXd& get_constraint_matrix() {\r\n            static Eigen::MatrixXd constraint_matrix;\r\n            if (constraint_matrix.size() == 0) {\r\n                constraint_matrix.resize(3, 3);\r\n                constraint_matrix << 0, 1, 1,\r\n                                     1, 0, 1,\r\n                                     1, 1, 0;\r\n            }\r\n            return constraint_matrix;\r\n        }\r\n        static Eigen::VectorXd get_constraint_rhs(const Eigen::VectorXi& l) {\r\n            return Eigen::Vector3d(l[0] - 2,\r\n                                   l[1] - 1,\r\n                                   l[2] - 1);\r\n        }\r\n        static int& get_variable(PatchParam& param, int index) {\r\n            return param.p[index];\r\n        }\r\n        static bool get_default_parameter(const Eigen::VectorXi& l, PatchParam& param) {\r\n            auto& constraint_matrix = get_constraint_matrix();\r\n            const int num_variables = constraint_matrix.cols();\r\n            ILP ilp(num_variables);\r\n            ilp.add_constraint(constraint_matrix, EQ, get_constraint_rhs(l));\r\n            \r\n            if (!ilp.solve()) return false;\r\n            \r\n            auto variables = ilp.get_variables();\r\n            for (int i = 0; i < num_variables; ++i)\r\n                get_variable(param, i) = variables[i];\r\n            \r\n            param.pattern_id = 0;\r\n            return true;\r\n        }\r\n        template <typename PatchT>\r\n        static void generate_subtopology(const PatchParam& param, PatchT& patch) {\r\n            /*\r\n        |        C2\r\n        |       /  \\\r\n        |      /    \\ \r\n        |     /      \\\r\n        |   C0---V0---C1\r\n            */\r\n            patch.clear();\r\n            typename PatchT::VHandle C[3];\r\n            for (int i = 0; i < 3; ++i) C[i] = add_tagged_vertex(patch, i, true );\r\n            auto V0 = add_tagged_vertex(patch, 0, false);\r\n        \r\n            patch.add_face(C[0], V0, C[1], C[2]);\r\n        }\r\n        static VariableIndicators& get_variable_indicators() {\r\n            static VariableIndicators variable_indicators;\r\n            return variable_indicators;\r\n        }\r\n        static std::string get_param_str(const PatchParam& param) { return \"\"; }\r\n    };\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/patchgen/Pattern_3_1.h",
    "content": "#pragma once\r\n#include \"Pattern.h\"\r\n#include \"ILP.h\"\r\n#include <kt84/eigen_def.h>\r\n#include <kt84/openmesh/edgeloop.h>\r\n#include <sstream>\r\n\r\n/*\r\nequation for pattern 1:\r\n  |0|     |1|     |1|     |1|     |1|   |4|    |2|   |l0|\r\np0|1| + p1|0| + p2|1| + q1|0| + q2|1| + |1| + x|0| = |l1|\r\n  |1|     |1|     |0|     |1|     |0|   |1|    |0|   |l2|\r\n*/\r\nnamespace patchgen {\r\n    template <>\r\n    struct Pattern<3, 1> {\r\n        static Eigen::MatrixXd& get_constraint_matrix() {\r\n            static Eigen::MatrixXd constraint_matrix;\r\n            if (constraint_matrix.size() == 0) {\r\n                constraint_matrix.resize(3, 6);\r\n                constraint_matrix << 0, 1, 1, 1, 1, 2,\r\n                                     1, 0, 1, 0, 1, 0,\r\n                                     1, 1, 0, 1, 0, 0;\r\n            }\r\n            return constraint_matrix;\r\n        }\r\n        static Eigen::VectorXd get_constraint_rhs(const Eigen::VectorXi& l) {\r\n            return Eigen::Vector3d(l[0] - 4,\r\n                                   l[1] - 1,\r\n                                   l[2] - 1);\r\n        }\r\n        static int& get_variable(PatchParam& param, int index) {\r\n            if (index < 3) return param.p[index];\r\n            if (index == 3) return param.q[1];\r\n            if (index == 4) return param.q[2];\r\n            return param.x;\r\n        }\r\n        static bool get_default_parameter(const Eigen::VectorXi& l, PatchParam& param) {\r\n            auto& constraint_matrix = get_constraint_matrix();\r\n            const int num_variables = constraint_matrix.cols();\r\n            ILP ilp(num_variables);\r\n            ilp.add_constraint(constraint_matrix, EQ, get_constraint_rhs(l));\r\n        \r\n            // arbitrary constraints and objective\r\n            // xmin\r\n            ilp.set_objective(kt84::make_Vector6d(0, 0, 0, 0, 0, 1), false);\r\n            if (!ilp.solve()) return false;\r\n            int xmin = ilp.get_variables()[5];\r\n            // xmax\r\n            ilp.refresh();\r\n            ilp.set_objective(kt84::make_Vector6d(0, 0, 0, 0, 0, 1), true);\r\n            if (!ilp.solve()) return false;\r\n            int xmax = ilp.get_variables()[5];\r\n            // xmid-1<=x<=xmid+1\r\n            ilp.refresh();\r\n            int xmid = (xmin + xmax) / 2;\r\n            ilp.add_constraint(kt84::make_Vector6d(0, 0, 0, 0, 0, 1), LE, xmid + 1);\r\n            ilp.add_constraint(kt84::make_Vector6d(0, 0, 0, 0, 0, 1), GE, xmid - 1);\r\n            // p1<=q1\r\n            ilp.add_constraint(kt84::make_Vector6d(0, 1, 0, -1, 0, 0), LE, 0);\r\n            // p2<=q2\r\n            ilp.add_constraint(kt84::make_Vector6d(0, 0, 1, 0, -1, 0), LE, 0);\r\n            // maximize p0+p1+p2\r\n            ilp.set_objective(kt84::make_Vector6d(1, 1, 1, 0, 0, 0), true);\r\n            if (!ilp.solve()) return false;\r\n        \r\n            auto variables = ilp.get_variables();\r\n            for (int i = 0; i < num_variables; ++i)\r\n                get_variable(param, i) = variables[i];\r\n        \r\n            param.pattern_id = 1;\r\n            return true;\r\n        }\r\n\r\n        template <typename PatchT>\r\n        static void generate_subtopology(const PatchParam& param, PatchT& patch) {\r\n            /*\r\n        |               C2\r\n        |              /| \\\r\n        |             / |  \\\r\n        |            /  |   \\\r\n        |           /   V3   \\ \r\n        |   q1-->  /   / \\    \\  <--q2\r\n        |         /   /   \\    \\\r\n        |        /   /     \\    \\\r\n        |       /   /       \\    \\\r\n        |      /   /         \\    \\\r\n        |    C0---V0----V1----V2---C1\r\n        |   x --^ q2--^    ^--q1  ^-- x\r\n            */\r\n            patch.clear();\r\n            typename PatchT::VHandle C[3];\r\n            typename PatchT::VHandle V[4];\r\n            for (int i = 0; i < 3; ++i) C[i] = add_tagged_vertex(patch, i, true );\r\n            for (int i = 0; i < 4; ++i) V[i] = add_tagged_vertex(patch, i, false);\r\n        \r\n            patch.add_face(C[0], V[0], V[3], C[2]);\r\n            patch.add_face(V[0], V[1], V[2], V[3]);\r\n            patch.add_face(C[2], V[3], V[2], C[1]);\r\n        \r\n            auto h_insert_x = patch.halfedge_handle(V[0]);  // corresponds to V0-C0\r\n            for (int i = 0; i < param.x; ++i)\r\n                insert_edgeloop(patch, h_insert_x);\r\n            auto h_insert_q1 = patch.halfedge_handle(V[2]);  // corresponds to V2-V1\r\n            for (int i = 0; i < param.q[1]; ++i)\r\n                insert_edgeloop(patch, h_insert_q1);\r\n            auto h_insert_q2 = patch.halfedge_handle(V[1]);  // corresponds to V1-V0\r\n            for (int i = 0; i < param.q[2]; ++i)\r\n                insert_edgeloop(patch, h_insert_q2);\r\n        }\r\n        static VariableIndicators& get_variable_indicators() {\r\n            static VariableIndicators variable_indicators;\r\n            if (variable_indicators.empty()) {\r\n                variable_indicators.resize(3);\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::C0, PatchVertexTag::C2));       // for q1\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::V0, PatchVertexTag::V3));\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::V1, PatchVertexTag::V2));\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::C1, PatchVertexTag::C2));       // for q2\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::V2, PatchVertexTag::V3));\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::V0, PatchVertexTag::V1));\r\n                variable_indicators[2].push_back(std::make_pair(PatchVertexTag::C0, PatchVertexTag::V0));       // for x\r\n                variable_indicators[2].push_back(std::make_pair(PatchVertexTag::C1, PatchVertexTag::V2));\r\n                variable_indicators[2].push_back(std::make_pair(PatchVertexTag::C2, PatchVertexTag::V3));\r\n            }\r\n            return variable_indicators;\r\n        }\r\n        static std::string get_param_str(const PatchParam& param) {\r\n            std::stringstream ss;\r\n            ss << \"q1=\" << param.q[1] \r\n               << \"_q2=\" << param.q[2]\r\n               << \"_x=\" << param.x;\r\n            return ss.str();\r\n        }\r\n    };\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/patchgen/Pattern_3_2.h",
    "content": "#pragma once\r\n#include \"Pattern.h\"\r\n#include \"ILP.h\"\r\n#include <kt84/eigen_def.h>\r\n#include <kt84/openmesh/edgeloop.h>\r\n#include <sstream>\r\n\r\n/*\r\nequation for pattern 2:\r\n  |0|     |1|     |1|     |1|   |3|    |2|   |l0|\r\np0|1| + p1|0| + p2|1| + q2|1| + |2| + x|0| = |l1|\r\n  |1|     |1|     |0|     |0|   |1|    |0|   |l2|\r\n*/\r\nnamespace patchgen {\r\n    template <>\r\n    struct Pattern<3, 2> {\r\n        static Eigen::MatrixXd& get_constraint_matrix() {\r\n            static Eigen::MatrixXd constraint_matrix;\r\n            if (constraint_matrix.size() == 0) {\r\n                constraint_matrix.resize(3, 5);\r\n                constraint_matrix << 0, 1, 1, 1, 2,\r\n                                     1, 0, 1, 1, 0,\r\n                                     1, 1, 0, 0, 0;\r\n            }\r\n            return constraint_matrix;\r\n        }\r\n        static Eigen::VectorXd get_constraint_rhs(const Eigen::VectorXi& l) {\r\n            return Eigen::Vector3d(l[0] - 3,\r\n                                   l[1] - 2,\r\n                                   l[2] - 1);\r\n        }\r\n    \r\n        static int& get_variable(PatchParam& param, int index) {\r\n            if (index < 3) return param.p[index];\r\n            if (index == 3) return param.q[2];\r\n            return param.x;\r\n        }\r\n\r\n        static bool get_default_parameter(const Eigen::VectorXi& l, PatchParam& param) {\r\n            auto& constraint_matrix = get_constraint_matrix();\r\n            const int num_variables = constraint_matrix.cols();\r\n            ILP ilp(num_variables);\r\n            ilp.add_constraint(constraint_matrix, EQ, get_constraint_rhs(l));\r\n        \r\n            // arbitrary constraints and objective\r\n            // xmin\r\n            ilp.set_objective(kt84::make_Vector5d(0, 0, 0, 0, 1), false);\r\n            if (!ilp.solve()) return false;\r\n            int xmin = ilp.get_variables()[4];\r\n            // xmax\r\n            ilp.refresh();\r\n            ilp.set_objective(kt84::make_Vector5d(0, 0, 0, 0, 1), true);\r\n            if (!ilp.solve()) return false;\r\n            int xmax = ilp.get_variables()[4];\r\n            // xmid-1<=x<=xmid+1\r\n            ilp.refresh();\r\n            int xmid = (xmin + xmax) / 2;\r\n            ilp.add_constraint(kt84::make_Vector5d(0, 0, 0, 0, 1), LE, xmid + 1);\r\n            ilp.add_constraint(kt84::make_Vector5d(0, 0, 0, 0, 1), GE, xmid - 1);\r\n            // p2<=q2\r\n            ilp.add_constraint(kt84::make_Vector5d(0, 0, 1, -1, 0), LE, 0);\r\n            // maximize p0+p1+p2\r\n            ilp.set_objective(kt84::make_Vector5d(1, 1, 1, 0, 0), true);\r\n            if (!ilp.solve()) return false;\r\n        \r\n            auto variables = ilp.get_variables();\r\n            for (int i = 0; i < num_variables; ++i)\r\n                get_variable(param, i) = variables[i];\r\n        \r\n            param.pattern_id = 2;\r\n            return true;\r\n        }\r\n\r\n        template <typename PatchT>\r\n        static void generate_subtopology(const PatchParam& param, PatchT& patch) {\r\n            /*\r\n            |                C2\r\n            |               /| \\\r\n            |              / |  \\\r\n            |             /  |   \\  <--q2\r\n            |            /   |    \\\r\n            |           /    |     V2\r\n            |          /     |     / \\\r\n            |         /      |    /   \\\r\n            |        /      V3---V4    \\\r\n            |       /      /      \\     \\\r\n            |      /      /        \\     \\\r\n            |    C0------V0---------V1----C1\r\n            |     x --^   q2--^         ^-- x\r\n            */\r\n            patch.clear();\r\n            typename PatchT::VHandle C[3];\r\n            typename PatchT::VHandle V[5];\r\n            for (int i = 0; i < 3; ++i) C[i] = add_tagged_vertex(patch, i, true );\r\n            for (int i = 0; i < 5; ++i) V[i] = add_tagged_vertex(patch, i, false);\r\n        \r\n            patch.add_face(C[0], V[0], V[3], C[2]);\r\n            patch.add_face(V[0], V[1], V[4], V[3]);\r\n            patch.add_face(C[1], V[2], V[4], V[1]);\r\n            patch.add_face(C[2], V[3], V[4], V[2]);\r\n        \r\n            auto h_insert_x = patch.halfedge_handle(V[0]);  // corresponds to V0-C0\r\n            for (int i = 0; i < param.x; ++i)\r\n                insert_edgeloop(patch, h_insert_x);\r\n            auto h_insert_q2 = patch.halfedge_handle(V[1]);  // corresponds to V1-V0\r\n            for (int i = 0; i < param.q[2]; ++i)\r\n                insert_edgeloop(patch, h_insert_q2);\r\n        }\r\n        static VariableIndicators& get_variable_indicators() {\r\n            static VariableIndicators variable_indicators;\r\n            if (variable_indicators.empty()) {\r\n                variable_indicators.resize(2);\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::V0, PatchVertexTag::V1));       // for q2\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::V3, PatchVertexTag::V4));\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::C2, PatchVertexTag::V2));\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::C0, PatchVertexTag::V0));       // for x\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::C2, PatchVertexTag::V3));\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::V2, PatchVertexTag::V4));\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::C1, PatchVertexTag::V1));\r\n            }\r\n            return variable_indicators;\r\n        }\r\n        static std::string get_param_str(const PatchParam& param) {\r\n            std::stringstream ss;\r\n            ss << \"q2=\" << param.q[2]\r\n               << \"_x=\" << param.x;\r\n            return ss.str();\r\n        }\r\n    };\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/patchgen/Pattern_3_3.h",
    "content": "#pragma once\r\n#include \"Pattern.h\"\r\n#include \"ILP.h\"\r\n#include <kt84/eigen_def.h>\r\n#include <kt84/openmesh/edgeloop.h>\r\n#include <sstream>\r\n\r\n/*\r\nequation for pattern 3: Fig 9(a) of Yassen et al., Computer-Aided Design 45 (2013)\r\n  |0|     |1|     |1|     |1|     |1|    |2|   |4|   |l0|\r\np0|1| + p1|0| + p2|1| + q1|0| + q2|1| + x|0| + |2| = |l1|\r\n  |1|     |1|     |0|     |1|     |0|    |0|   |2|   |l2|\r\n*/\r\nnamespace patchgen {\r\n    template <>\r\n    struct Pattern<3, 3> {\r\n        static Eigen::MatrixXd& get_constraint_matrix() {\r\n            static Eigen::MatrixXd constraint_matrix;\r\n            if (constraint_matrix.size() == 0) {\r\n                constraint_matrix.resize(3, 6);\r\n                constraint_matrix << 0, 1, 1, 1, 1, 2,\r\n                                     1, 0, 1, 0, 1, 0,\r\n                                     1, 1, 0, 1, 0, 0;\r\n            }\r\n            return constraint_matrix;\r\n        }\r\n        static Eigen::VectorXd get_constraint_rhs(const Eigen::VectorXi& l) {\r\n            return Eigen::Vector3d(l[0] - 4,\r\n                                   l[1] - 2,\r\n                                   l[2] - 2);\r\n        }\r\n    \r\n        static int& get_variable(PatchParam& param, int index) {\r\n            if (index < 3) return param.p[index];\r\n            if (index == 3) return param.q[1];\r\n            if (index == 4) return param.q[2];\r\n            return param.x;\r\n        }\r\n\r\n        static bool get_default_parameter(const Eigen::VectorXi& l, PatchParam& param) {\r\n            auto& constraint_matrix = get_constraint_matrix();\r\n            const int num_variables = constraint_matrix.cols();\r\n            ILP ilp(num_variables);\r\n            ilp.add_constraint(constraint_matrix, EQ, get_constraint_rhs(l));\r\n        \r\n            // arbitrary constraints and objective\r\n            // xmin\r\n            ilp.set_objective(kt84::make_Vector6d(0, 0, 0, 0, 0, 1), false);\r\n            if (!ilp.solve()) return false;\r\n            int xmin = ilp.get_variables()[5];\r\n            // xmax\r\n            ilp.refresh();\r\n            ilp.set_objective(kt84::make_Vector6d(0, 0, 0, 0, 0, 1), true);\r\n            if (!ilp.solve()) return false;\r\n            int xmax = ilp.get_variables()[5];\r\n            // xmid-1<=x<=xmid+1\r\n            ilp.refresh();\r\n            int xmid = (xmin + xmax) / 2;\r\n            ilp.add_constraint(kt84::make_Vector6d(0, 0, 0, 0, 0, 1), LE, xmid + 1);\r\n            ilp.add_constraint(kt84::make_Vector6d(0, 0, 0, 0, 0, 1), GE, xmid - 1);\r\n            // p1<=q1\r\n            ilp.add_constraint(kt84::make_Vector6d(0, 1, 0, -1, 0, 0), LE, 0);\r\n            // p2<=q2\r\n            ilp.add_constraint(kt84::make_Vector6d(0, 0, 1, 0, -1, 0), LE, 0);\r\n            // maximize p0+p1+p2\r\n            ilp.set_objective(kt84::make_Vector6d(1, 1, 1, 0, 0, 0), true);\r\n            if (!ilp.solve()) return false;\r\n        \r\n            auto variables = ilp.get_variables();\r\n            for (int i = 0; i < num_variables; ++i)\r\n                get_variable(param, i) = variables[i];\r\n        \r\n            param.pattern_id = 3;\r\n            return true;\r\n        }\r\n\r\n        template <typename PatchT>\r\n        static void generate_subtopology(const PatchParam& param, PatchT& patch) {\r\n            /*\r\n            |                   C2\r\n            |                  /  \\\r\n            |                 /    \\\r\n            |         p2-->  /      \\ <--q2\r\n            |               /        \\\r\n            |              /          \\\r\n            |             /            \\\r\n            |            V4__        __V3\r\n            |           /    \\__  __/    \\\r\n            |          /        V6        \\\r\n            |         /         |          \\\r\n            |        /          |           \\\r\n            |       /        _--V5--_        \\\r\n            |      /      _--   |    --_      \\\r\n            |     /    _--      |       --_    \\\r\n            |    /  _--         |          --_  \\\r\n            |   /_--            |             --_\\\r\n            | C0-------V0-------V1------V2-------C1\r\n            |    x--^   q2--^   q1--^     x--^\r\n            */\r\n            patch.clear();\r\n            typename PatchT::VHandle C[3];\r\n            typename PatchT::VHandle V[7];\r\n            for (int i = 0; i < 3; ++i) C[i] = add_tagged_vertex(patch, i, true );\r\n            for (int i = 0; i < 7; ++i) V[i] = add_tagged_vertex(patch, i, false);\r\n            \r\n            patch.add_face(C[0], V[0], V[1], V[5]);\r\n            patch.add_face(V[1], V[2], C[1], V[5]);\r\n            patch.add_face(C[1], V[3], V[6], V[5]);\r\n            patch.add_face(V[3], C[2], V[4], V[6]);\r\n            patch.add_face(V[4], C[0], V[5], V[6]);\r\n            \r\n            auto h_insert_x = patch.halfedge_handle(V[0]);  // corresponds to V0-C0\r\n            for (int i = 0; i < param.x; ++i)\r\n                insert_edgeloop(patch, h_insert_x);\r\n            auto h_insert_q2 = patch.halfedge_handle(V[1]);  // corresponds to V1-V0\r\n            for (int i = 0; i < param.q[2]; ++i)\r\n                insert_edgeloop(patch, h_insert_q2);\r\n            auto h_insert_q1 = patch.halfedge_handle(V[2]);  // corresponds to V2-V1\r\n            for (int i = 0; i < param.q[1]; ++i)\r\n                insert_edgeloop(patch, h_insert_q1);\r\n        }\r\n        static VariableIndicators& get_variable_indicators() {\r\n            static VariableIndicators variable_indicators;\r\n            if (variable_indicators.empty()) {\r\n                variable_indicators.resize(3);\r\n                // for q1\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::V1, PatchVertexTag::V2));\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::V5, PatchVertexTag::C1));\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::V6, PatchVertexTag::V3));\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::V4, PatchVertexTag::C2));\r\n                // for q2\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::V0, PatchVertexTag::V1));\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::C0, PatchVertexTag::V5));\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::V4, PatchVertexTag::V6));\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::C2, PatchVertexTag::V3));\r\n                // for x\r\n                variable_indicators[2].push_back(std::make_pair(PatchVertexTag::C0, PatchVertexTag::V0));\r\n                variable_indicators[2].push_back(std::make_pair(PatchVertexTag::V5, PatchVertexTag::V1));\r\n                variable_indicators[2].push_back(std::make_pair(PatchVertexTag::C1, PatchVertexTag::V2));\r\n            }\r\n            return variable_indicators;\r\n        }\r\n        static std::string get_param_str(const PatchParam& param) {\r\n            std::stringstream ss;\r\n            ss << \"q1=\"  << param.q[1]\r\n               << \"_q2=\" << param.q[2]\r\n               << \"_x=\"  << param.x;\r\n            return ss.str();\r\n        }\r\n    };\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/patchgen/Pattern_4_0.h",
    "content": "#pragma once\r\n#include \"Pattern.h\"\r\n#include \"ILP.h\"\r\n\r\n/*\r\nequation for pattern 0:\r\n  |0|     |1|   |1|   |l0|\r\np0|1| + p1|0| + |1| = |l1|\r\n  |0|     |1|   |1|   |l2|\r\n  |1|     |0|   |1|   |l3|\r\n*/\r\nnamespace patchgen {\r\n    template <>\r\n    struct Pattern<4, 0> {\r\n        static Eigen::MatrixXd& get_constraint_matrix() {\r\n            static Eigen::MatrixXd constraint_matrix;\r\n            if (constraint_matrix.size() == 0) {\r\n                constraint_matrix.resize(4, 2);\r\n                constraint_matrix << 0, 1,\r\n                                     1, 0,\r\n                                     0, 1,\r\n                                     1, 0;\r\n            }\r\n            return constraint_matrix;\r\n        }\r\n    \r\n        static Eigen::VectorXd get_constraint_rhs(const Eigen::VectorXi& l) {\r\n            return Eigen::Vector4d(l[0] - 1,\r\n                                   l[1] - 1,\r\n                                   l[2] - 1,\r\n                                   l[3] - 1);\r\n        }\r\n    \r\n        static int& get_variable(PatchParam& param, int index) {\r\n            return param.p[index];\r\n        }\r\n\r\n        static bool get_default_parameter(const Eigen::VectorXi& l, PatchParam& param) {\r\n            auto& constraint_matrix = get_constraint_matrix();\r\n            const int num_variables = constraint_matrix.cols();\r\n            ILP ilp(num_variables);\r\n            ilp.add_constraint(constraint_matrix, EQ, get_constraint_rhs(l));\r\n        \r\n            if (!ilp.solve()) return false;\r\n        \r\n            auto variables = ilp.get_variables();\r\n            for (int i = 0; i < num_variables; ++i)\r\n                get_variable(param, i) = variables[i];\r\n        \r\n            param.pattern_id = 0;\r\n            return true;\r\n        }\r\n        template <typename PatchT>\r\n        static void generate_subtopology(const PatchParam& param, PatchT& patch) {\r\n            /*\r\n        |   C3----C2\r\n        |   |      |\r\n        |   |      |\r\n        |   C0----C1\r\n            */\r\n            patch.clear();\r\n            typename PatchT::VHandle C[4];\r\n            for (int i = 0; i < 4; ++i) C[i] = add_tagged_vertex(patch, i, true );\r\n            patch.add_face(C[0], C[1], C[2], C[3]);\r\n        }\r\n        static VariableIndicators& get_variable_indicators() {\r\n            static VariableIndicators variable_indicators;\r\n            return variable_indicators;\r\n        }\r\n        static std::string get_param_str(const PatchParam& param) { return \"\"; }\r\n    };\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/patchgen/Pattern_4_1.h",
    "content": "#pragma once\r\n#include \"Pattern.h\"\r\n#include \"ILP.h\"\r\n#include <kt84/eigen_def.h>\r\n#include <kt84/openmesh/edgeloop.h>\r\n#include <sstream>\r\n\r\n/*\r\nequation for pattern 1:\r\n  |0|     |1|     |0|     |1|   |2|    |1|   |l0|\r\np0|1| + p1|0| + p2|1| + p3|0| + |2| + x|1| = |l1|\r\n  |0|     |1|     |0|     |1|   |1|    |0|   |l2|\r\n  |1|     |0|     |1|     |0|   |1|    |0|   |l3|\r\n*/\r\nnamespace patchgen {\r\n    template <>\r\n    struct Pattern<4, 1> {\r\n        static Eigen::MatrixXd& get_constraint_matrix() {\r\n            static Eigen::MatrixXd constraint_matrix;\r\n            if (constraint_matrix.size() == 0) {\r\n                constraint_matrix.resize(4, 5);\r\n                constraint_matrix << 0, 1, 0, 1, 1,\r\n                                     1, 0, 1, 0, 1,\r\n                                     0, 1, 0, 1, 0,\r\n                                     1, 0, 1, 0, 0;\r\n            }\r\n            return constraint_matrix;\r\n        }\r\n    \r\n        static Eigen::VectorXd get_constraint_rhs(const Eigen::VectorXi& l) {\r\n            return Eigen::Vector4d(l[0] - 2,\r\n                                   l[1] - 2,\r\n                                   l[2] - 1,\r\n                                   l[3] - 1);\r\n        }\r\n    \r\n        static int& get_variable(PatchParam& param, int index) {\r\n            if (index < 4) return param.p[index];\r\n            return param.x;\r\n        }\r\n\r\n        static bool get_default_parameter(const Eigen::VectorXi& l, PatchParam& param) {\r\n            auto& constraint_matrix = get_constraint_matrix();\r\n            const int num_variables = constraint_matrix.cols();\r\n            ILP ilp(num_variables);\r\n            ilp.add_constraint(constraint_matrix, EQ, get_constraint_rhs(l));\r\n        \r\n            // arbitrary constraints and objective\r\n            // p0 <= p2\r\n            ilp.add_constraint(kt84::make_Vector5d(1, 0, -1, 0, 0), LE, 0);\r\n            // p1 <= p3\r\n            ilp.add_constraint(kt84::make_Vector5d(0, 1, 0, -1, 0), LE, 0);\r\n            // maximize p0+p1\r\n            ilp.set_objective(kt84::make_Vector5d(1, 1, 0, 0, 0), true);\r\n            if (!ilp.solve()) return false;\r\n        \r\n            auto variables = ilp.get_variables();\r\n            for (int i = 0; i < num_variables; ++i)\r\n                get_variable(param, i) = variables[i];\r\n        \r\n            param.pattern_id = 1;\r\n            return true;\r\n        }\r\n        template <typename PatchT>\r\n        static void generate_subtopology(const PatchParam& param, PatchT& patch) {\r\n            /*\r\n        |   C3--------C2\r\n        |   |\\        |\r\n        |   | \\       | <--x\r\n        |   |  \\      |\r\n        |   |   \\     |\r\n        |   |    V2---V1\r\n        |   |    |    |\r\n        |   |    |    |\r\n        |   |    |    |\r\n        |   |    |    |\r\n        |   C0---V0---C1\r\n        |      ^--x\r\n            */\r\n            patch.clear();\r\n            typename PatchT::VHandle C[4];\r\n            typename PatchT::VHandle V[3];\r\n            for (int i = 0; i < 4; ++i) C[i] = add_tagged_vertex(patch, i, true );\r\n            for (int i = 0; i < 3; ++i) V[i] = add_tagged_vertex(patch, i, false);\r\n            patch.add_face(C[0], V[0], V[2], C[3]);\r\n            patch.add_face(V[0], C[1], V[1], V[2]);\r\n            patch.add_face(V[1], C[2], C[3], V[2]);\r\n        \r\n            auto h_insert_x = patch.halfedge_handle(V[0]);  // corresponds to V0-C0\r\n            for (int i = 0; i < param.x; ++i)\r\n                insert_edgeloop(patch, h_insert_x);\r\n        }\r\n        static VariableIndicators& get_variable_indicators() {\r\n            static VariableIndicators variable_indicators;\r\n            if (variable_indicators.empty()) {\r\n                variable_indicators.resize(1);\r\n                //variable_indicators[0].push_back(std::make_pair(PatchVertexTag::C0, PatchVertexTag::V0));       // for x (not editable anyway)\r\n                //variable_indicators[0].push_back(std::make_pair(PatchVertexTag::C2, PatchVertexTag::V1));\r\n                //variable_indicators[0].push_back(std::make_pair(PatchVertexTag::C3, PatchVertexTag::V2));\r\n            }\r\n            return variable_indicators;\r\n        }\r\n        static std::string get_param_str(const PatchParam& param) {\r\n            std::stringstream ss;\r\n            ss << \"p0=\" << param.p[0] \r\n               << \"_p1=\" << param.p[1];\r\n            return ss.str();\r\n        }\r\n    };\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/patchgen/Pattern_4_2.h",
    "content": "#pragma once\r\n#include \"Pattern.h\"\r\n#include \"ILP.h\"\r\n#include <kt84/eigen_def.h>\r\n#include <kt84/openmesh/edgeloop.h>\r\n#include <sstream>\r\n\r\n/*\r\nequation for pattern 2:\r\n  |0|     |1|     |0|     |1|   |3|    |1|    |1|   |l0|\r\np0|1| + p1|0| + p2|1| + p3|0| + |1| + x|1| + y|0| = |l1|\r\n  |0|     |1|     |0|     |1|   |1|    |0|    |0|   |l2|\r\n  |1|     |0|     |1|     |0|   |1|    |0|    |1|   |l3|\r\n*/\r\nnamespace patchgen {\r\n    template <>\r\n    struct Pattern<4, 2> {\r\n        static Eigen::MatrixXd& get_constraint_matrix() {\r\n            static Eigen::MatrixXd constraint_matrix;\r\n            if (constraint_matrix.size() == 0) {\r\n                constraint_matrix.resize(4, 6);\r\n                constraint_matrix << 0, 1, 0, 1, 1, 1,\r\n                                     1, 0, 1, 0, 1, 0,\r\n                                     0, 1, 0, 1, 0, 0,\r\n                                     1, 0, 1, 0, 0, 1;\r\n            }\r\n            return constraint_matrix;\r\n        }\r\n    \r\n        static Eigen::VectorXd get_constraint_rhs(const Eigen::VectorXi& l) {\r\n            return Eigen::Vector4d(l[0] - 3,\r\n                                   l[1] - 1,\r\n                                   l[2] - 1,\r\n                                   l[3] - 1);\r\n        }\r\n    \r\n        static int& get_variable(PatchParam& param, int index) {\r\n            if (index < 4) return param.p[index];\r\n            if (index == 4) return param.x;\r\n            return param.y;\r\n        }\r\n\r\n        static bool get_default_parameter(const Eigen::VectorXi& l, PatchParam& param) {\r\n            auto& constraint_matrix = get_constraint_matrix();\r\n            const int num_variables = constraint_matrix.cols();\r\n            ILP ilp(num_variables);\r\n            ilp.add_constraint(constraint_matrix, EQ, get_constraint_rhs(l));\r\n        \r\n            // arbitrary constraints and objective\r\n            // p0 <= p2\r\n            ilp.add_constraint(kt84::make_Vector6d(1, 0, -1, 0, 0, 0), LE, 0);\r\n            // p1 <= p3\r\n            ilp.add_constraint(kt84::make_Vector6d(0, 1, 0, -1, 0, 0), LE, 0);\r\n            // maximize p0+p1\r\n            ilp.set_objective(kt84::make_Vector6d(1, 1, 0, 0, 0, 0), true);\r\n            if (!ilp.solve()) return false;\r\n        \r\n            auto variables = ilp.get_variables();\r\n            for (int i = 0; i < num_variables; ++i)\r\n                get_variable(param, i) = variables[i];\r\n        \r\n            param.pattern_id = 2;\r\n            return true;\r\n        }\r\n        template <typename PatchT>\r\n        static void generate_subtopology(const PatchParam& param, PatchT& patch) {\r\n            /*\r\n        |        C3-------------C2\r\n        |        |            _/|\r\n        |        |          _/  |\r\n        |   y--> |        _/    | <--x\r\n        |        |      _/      |\r\n        |        |     /        |\r\n        |        C0---V0---V1---C1\r\n        |             x--^    ^--y\r\n            */\r\n            patch.clear();\r\n            typename PatchT::VHandle C[4];\r\n            typename PatchT::VHandle V[2];\r\n            for (int i = 0; i < 4; ++i) C[i] = add_tagged_vertex(patch, i, true );\r\n            for (int i = 0; i < 2; ++i) V[i] = add_tagged_vertex(patch, i, false);\r\n            patch.add_face(C[0], V[0], C[2], C[3]);\r\n            patch.add_face(V[0], V[1], C[1], C[2]);\r\n        \r\n            auto h_insert_x = patch.halfedge_handle(V[1]);  // corresponds to V1-V0\r\n            for (int i = 0; i < param.x; ++i)\r\n                insert_edgeloop(patch, h_insert_x);\r\n            auto h_insert_y = patch.halfedge_handle(C[1]);  // corresponds to C1-V1\r\n            for (int i = 0; i < param.y; ++i)\r\n                insert_edgeloop(patch, h_insert_y);\r\n        }\r\n        static VariableIndicators& get_variable_indicators() {\r\n            static VariableIndicators variable_indicators;\r\n            if (variable_indicators.empty()) {\r\n                variable_indicators.resize(2);\r\n                //variable_indicators[0].push_back(std::make_pair(PatchVertexTag::V0, PatchVertexTag::V1));       // for x (not editable anyway)\r\n                //variable_indicators[0].push_back(std::make_pair(PatchVertexTag::C1, PatchVertexTag::C2));\r\n                //variable_indicators[1].push_back(std::make_pair(PatchVertexTag::C0, PatchVertexTag::C3));       // for y (not editable anyway)\r\n                //variable_indicators[1].push_back(std::make_pair(PatchVertexTag::C1, PatchVertexTag::V1));\r\n            }\r\n            return variable_indicators;\r\n        }\r\n        static std::string get_param_str(const PatchParam& param) {\r\n            std::stringstream ss;\r\n            ss << \"p0=\" << param.p[0] \r\n               << \"_p1=\" << param.p[1];\r\n            return ss.str();\r\n        }\r\n    };\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/patchgen/Pattern_4_3.h",
    "content": "#pragma once\r\n#include \"Pattern.h\"\r\n#include \"ILP.h\"\r\n#include <kt84/eigen_def.h>\r\n#include <kt84/openmesh/edgeloop.h>\r\n#include <sstream>\r\n\r\n/*\r\nequation for pattern 3:\r\n  |0|     |1|     |0|     |1|     |1|   |3|    |2|   |l0|\r\np0|1| + p1|0| + p2|1| + p3|0| + q1|0| + |1| + x|0| = |l1|\r\n  |0|     |1|     |0|     |1|     |1|   |1|    |0|   |l2|\r\n  |1|     |0|     |1|     |0|     |0|   |1|    |0|   |l3|\r\n*/\r\nnamespace patchgen {\r\n    template <>\r\n    struct Pattern<4, 3> {\r\n        static Eigen::MatrixXd& get_constraint_matrix() {\r\n            static Eigen::MatrixXd constraint_matrix;\r\n            if (constraint_matrix.size() == 0) {\r\n                constraint_matrix.resize(4, 6);\r\n                constraint_matrix << 0, 1, 0, 1, 1, 2,\r\n                                     1, 0, 1, 0, 0, 0,\r\n                                     0, 1, 0, 1, 1, 0,\r\n                                     1, 0, 1, 0, 0, 0;\r\n            }\r\n            return constraint_matrix;\r\n        }\r\n    \r\n        static Eigen::VectorXd get_constraint_rhs(const Eigen::VectorXi& l) {\r\n            return Eigen::Vector4d(l[0] - 3,\r\n                                   l[1] - 1,\r\n                                   l[2] - 1,\r\n                                   l[3] - 1);\r\n        }\r\n    \r\n        static int& get_variable(PatchParam& param, int index) {\r\n            if (index < 4) return param.p[index];\r\n            if (index == 4) return param.q[1];\r\n            return param.x;\r\n        }\r\n\r\n        static bool get_default_parameter(const Eigen::VectorXi& l, PatchParam& param) {\r\n            auto& constraint_matrix = get_constraint_matrix();\r\n            const int num_variables = constraint_matrix.cols();\r\n            ILP ilp(num_variables);\r\n            ilp.add_constraint(constraint_matrix, EQ, get_constraint_rhs(l));\r\n        \r\n            // arbitrary constraints and objective\r\n            // p0 <= p2\r\n            ilp.add_constraint(kt84::make_Vector6d(1, 0, -1, 0, 0, 0), LE, 0);\r\n            // p1 <= p3\r\n            ilp.add_constraint(kt84::make_Vector6d(0, 1, 0, -1, 0, 0), LE, 0);\r\n            // p3 <= q1\r\n            ilp.add_constraint(kt84::make_Vector6d(0, 0, 0, 1, -1, 0), LE, 0);\r\n            // maximize p0+p1\r\n            ilp.set_objective(kt84::make_Vector6d(1, 1, 0, 0, 0, 0), true);\r\n            if (!ilp.solve()) return false;\r\n        \r\n            auto variables = ilp.get_variables();\r\n            for (int i = 0; i < num_variables; ++i)\r\n                get_variable(param, i) = variables[i];\r\n        \r\n            param.pattern_id = 3;\r\n            return true;\r\n        }\r\n        template <typename PatchT>\r\n        static void generate_subtopology(const PatchParam& param, PatchT& patch) {\r\n            /*\r\n        |           v--q1\r\n        |   C3-------------C2\r\n        |   |\\            /|\r\n        |   | \\          / |\r\n        |   |  \\        /  |\r\n        |   |   \\      /   |\r\n        |   |    V3--V2    |\r\n        |   |    |    |    |\r\n        |   |    |    |    |\r\n        |   |    |    |    |\r\n        |   |    |    |    |\r\n        |   C0---V0---V1---C1\r\n        |   x--^    ^--q1 ^--x\r\n            */\r\n            patch.clear();\r\n            typename PatchT::VHandle C[4];\r\n            typename PatchT::VHandle V[4];\r\n            for (int i = 0; i < 4; ++i) C[i] = add_tagged_vertex(patch, i, true );\r\n            for (int i = 0; i < 4; ++i) V[i] = add_tagged_vertex(patch, i, false);\r\n            patch.add_face(C[0], V[0], V[3], C[3]);\r\n            patch.add_face(V[0], V[1], V[2], V[3]);\r\n            patch.add_face(V[1], C[1], C[2], V[2]);\r\n            patch.add_face(C[2], C[3], V[3], V[2]);\r\n        \r\n            auto h_insert_x = patch.halfedge_handle(V[0]);  // corresponds to V0-C0\r\n            for (int i = 0; i < param.x; ++i)\r\n                insert_edgeloop(patch, h_insert_x);\r\n            auto h_insert_q1 = patch.halfedge_handle(V[1]);  // corresponds to V1-V0\r\n            for (int i = 0; i < param.q[1]; ++i)\r\n                insert_edgeloop(patch, h_insert_q1);\r\n        }\r\n        static VariableIndicators& get_variable_indicators() {\r\n            static VariableIndicators variable_indicators;\r\n            if (variable_indicators.empty()) {\r\n                variable_indicators.resize(2);\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::V0, PatchVertexTag::V1));       // for q1\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::V2, PatchVertexTag::V3));\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::C2, PatchVertexTag::C3));\r\n                //variable_indicators[1].push_back(std::make_pair(PatchVertexTag::C0, PatchVertexTag::V0));       // for x (not editable anyway)\r\n                //variable_indicators[1].push_back(std::make_pair(PatchVertexTag::C1, PatchVertexTag::V1));\r\n                //variable_indicators[1].push_back(std::make_pair(PatchVertexTag::C2, PatchVertexTag::V2));\r\n                //variable_indicators[1].push_back(std::make_pair(PatchVertexTag::C3, PatchVertexTag::V3));\r\n            }\r\n            return variable_indicators;\r\n        }\r\n        static std::string get_param_str(const PatchParam& param) {\r\n            std::stringstream ss;\r\n            ss << \"p0=\" << param.p[0] \r\n               << \"_p1=\" << param.p[1]\r\n               << \"_q1=\" << param.q[1];\r\n            return ss.str();\r\n        }\r\n    };\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/patchgen/Pattern_4_4.h",
    "content": "#pragma once\r\n#include \"Pattern.h\"\r\n#include \"ILP.h\"\r\n#include <kt84/eigen_def.h>\r\n#include <kt84/openmesh/edgeloop.h>\r\n#include <sstream>\r\n\r\n/*\r\nequation for pattern 4:\r\n  |0|     |1|     |0|     |1|     |1|   |4|    |2|    |1|   |l0|\r\np0|1| + p1|0| + p2|1| + p3|0| + q1|0| + |2| + x|0| + y|1| = |l1|\r\n  |0|     |1|     |0|     |1|     |1|   |1|    |0|    |0|   |l2|\r\n  |1|     |0|     |1|     |0|     |0|   |1|    |0|    |0|   |l3|\r\n*/\r\nnamespace patchgen {\r\n    template <>\r\n    struct Pattern<4, 4> {\r\n        static Eigen::MatrixXd& get_constraint_matrix() {\r\n            static Eigen::MatrixXd constraint_matrix;\r\n            if (constraint_matrix.size() == 0) {\r\n                constraint_matrix.resize(4, 7);\r\n                constraint_matrix << 0, 1, 0, 1, 1, 2, 1,\r\n                                     1, 0, 1, 0, 0, 0, 1,\r\n                                     0, 1, 0, 1, 1, 0, 0,\r\n                                     1, 0, 1, 0, 0, 0, 0;\r\n            }\r\n            return constraint_matrix;\r\n        }\r\n    \r\n        static Eigen::VectorXd get_constraint_rhs(const Eigen::VectorXi& l) {\r\n            return Eigen::Vector4d(l[0] - 4,\r\n                                   l[1] - 2,\r\n                                   l[2] - 1,\r\n                                   l[3] - 1);\r\n        }\r\n    \r\n        static int& get_variable(PatchParam& param, int index) {\r\n            if (index < 4) return param.p[index];\r\n            if (index == 4) return param.q[1];\r\n            if (index == 5) return param.x;\r\n            return param.y;\r\n        }\r\n\r\n        static bool get_default_parameter(const Eigen::VectorXi& l, PatchParam& param) {\r\n            auto& constraint_matrix = get_constraint_matrix();\r\n            const int num_variables = constraint_matrix.cols();\r\n            ILP ilp(num_variables);\r\n            ilp.add_constraint(constraint_matrix, EQ, get_constraint_rhs(l));\r\n        \r\n            // arbitrary constraints and objective\r\n            // p0 <= p2\r\n            ilp.add_constraint(kt84::make_Vector7d(1, 0, -1, 0, 0, 0, 0), LE, 0);\r\n            // p1 <= p3\r\n            ilp.add_constraint(kt84::make_Vector7d(0, 1, 0, -1, 0, 0, 0), LE, 0);\r\n            // p3 <= q1\r\n            ilp.add_constraint(kt84::make_Vector7d(0, 0, 0, 1, -1, 0, 0), LE, 0);\r\n            // maximize p0+p1\r\n            ilp.set_objective(kt84::make_Vector7d(1, 1, 0, 0, 0, 0, 0), true);\r\n            if (!ilp.solve()) return false;\r\n        \r\n            auto variables = ilp.get_variables();\r\n            for (int i = 0; i < num_variables; ++i)\r\n                get_variable(param, i) = variables[i];\r\n        \r\n            param.pattern_id = 4;\r\n            return true;\r\n        }\r\n        template <typename PatchT>\r\n        static void generate_subtopology(const PatchParam& param, PatchT& patch) {\r\n            /*\r\n        |            v--q1\r\n        |   C3-----------------C2\r\n        |   | \\              _/ |\r\n        |   |  \\           _/   |\r\n        |   |   \\        _/     | <--y\r\n        |   |    \\      /       |\r\n        |   |     V6--V5        V3\r\n        |   |     |    |\\_    _/|\r\n        |   |     |    |  \\  /  |\r\n        |   |     |    |   V4   |\r\n        |   |     |    |   |    |\r\n        |   C0---V0---V1---V2---C1\r\n        |  x--^  q1--^ y--^    ^--x\r\n            */\r\n            patch.clear();\r\n            typename PatchT::VHandle C[4];\r\n            typename PatchT::VHandle V[7];\r\n            for (int i = 0; i < 4; ++i) C[i] = add_tagged_vertex(patch, i, true );\r\n            for (int i = 0; i < 7; ++i) V[i] = add_tagged_vertex(patch, i, false);\r\n            patch.add_face(C[0], V[0], V[6], C[3]);\r\n            patch.add_face(V[0], V[1], V[5], V[6]);\r\n            patch.add_face(V[1], V[2], V[4], V[5]);\r\n            patch.add_face(V[2], C[1], V[3], V[4]);\r\n            patch.add_face(V[3], C[2], V[5], V[4]);\r\n            patch.add_face(C[2], C[3], V[6], V[5]);\r\n        \r\n            auto h_insert_x = patch.halfedge_handle(V[0]);  // corresponds to V0-C0\r\n            for (int i = 0; i < param.x; ++i)\r\n                insert_edgeloop(patch, h_insert_x);\r\n            auto h_insert_y = patch.halfedge_handle(V[2]);  // corresponds to V2-V1\r\n            for (int i = 0; i < param.y; ++i)\r\n                insert_edgeloop(patch, h_insert_y);\r\n            auto h_insert_q1 = patch.halfedge_handle(V[1]);  // corresponds to V1-V0\r\n            for (int i = 0; i < param.q[1]; ++i)\r\n                insert_edgeloop(patch, h_insert_q1);\r\n        }\r\n        static VariableIndicators& get_variable_indicators() {\r\n            static VariableIndicators variable_indicators;\r\n            if (variable_indicators.empty()) {\r\n                variable_indicators.resize(3);\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::V0, PatchVertexTag::V1));       // for q1\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::V5, PatchVertexTag::V6));\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::C2, PatchVertexTag::C3));\r\n                //variable_indicators[1].push_back(std::make_pair(PatchVertexTag::C0, PatchVertexTag::V0));       // for x (not editable anyway)\r\n                //variable_indicators[1].push_back(std::make_pair(PatchVertexTag::C1, PatchVertexTag::V2));\r\n                //variable_indicators[1].push_back(std::make_pair(PatchVertexTag::C2, PatchVertexTag::V5));\r\n                //variable_indicators[1].push_back(std::make_pair(PatchVertexTag::C3, PatchVertexTag::V6));\r\n                //variable_indicators[1].push_back(std::make_pair(PatchVertexTag::V3, PatchVertexTag::V4));\r\n                //variable_indicators[2].push_back(std::make_pair(PatchVertexTag::C2, PatchVertexTag::V3));       // for y (not editable anyway)\r\n                //variable_indicators[2].push_back(std::make_pair(PatchVertexTag::V1, PatchVertexTag::V2));\r\n                //variable_indicators[2].push_back(std::make_pair(PatchVertexTag::V4, PatchVertexTag::V5));\r\n            }\r\n            return variable_indicators;\r\n        }\r\n        static std::string get_param_str(const PatchParam& param) {\r\n            std::stringstream ss;\r\n            ss << \"p0=\" << param.p[0] \r\n               << \"_p1=\" << param.p[1]\r\n               << \"_q1=\" << param.q[1];\r\n            return ss.str();\r\n        }\r\n    };\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/patchgen/Pattern_5_0.h",
    "content": "#pragma once\r\n#include \"Pattern.h\"\r\n#include \"ILP.h\"\r\n#include <kt84/eigen_def.h>\r\n\r\n/*\r\nequation for pattern 0:\r\n  |0|     |1|     |0|     |0|     |1|   |2|   |l0|\r\n  |1|     |0|     |1|     |0|     |0|   |1|   |l1|\r\np0|0| + p1|1| + p2|0| + p3|1| + p4|0| + |1| = |l2|\r\n  |0|     |0|     |1|     |0|     |1|   |1|   |l3|\r\n  |1|     |0|     |0|     |1|     |0|   |1|   |l4|\r\n*/\r\nnamespace patchgen {\r\n    template <>\r\n    struct Pattern<5, 0> {\r\n        static Eigen::MatrixXd& get_constraint_matrix() {\r\n            static Eigen::MatrixXd constraint_matrix;\r\n            if (constraint_matrix.size() == 0) {\r\n                constraint_matrix.resize(5, 5);\r\n                constraint_matrix << 0, 1, 0, 0, 1,\r\n                                     1, 0, 1, 0, 0,\r\n                                     0, 1, 0, 1, 0,\r\n                                     0, 0, 1, 0, 1,\r\n                                     1, 0, 0, 1, 0;\r\n            }\r\n            return constraint_matrix;\r\n        }\r\n    \r\n        static Eigen::VectorXd get_constraint_rhs(const Eigen::VectorXi& l) {\r\n            return kt84::make_Vector5d(l[0] - 2,\r\n                                       l[1] - 1,\r\n                                       l[2] - 1,\r\n                                       l[3] - 1,\r\n                                       l[4] - 1);\r\n        }\r\n    \r\n        static int& get_variable(PatchParam& param, int index) {\r\n            return param.p[index];\r\n        }\r\n\r\n        static bool get_default_parameter(const Eigen::VectorXi& l, PatchParam& param) {\r\n            auto& constraint_matrix = get_constraint_matrix();\r\n            const int num_variables = constraint_matrix.cols();\r\n            ILP ilp(num_variables);\r\n            ilp.add_constraint(constraint_matrix, EQ, get_constraint_rhs(l));\r\n        \r\n            if (!ilp.solve()) return false;\r\n        \r\n            auto variables = ilp.get_variables();\r\n            for (int i = 0; i < num_variables; ++i)\r\n                get_variable(param, i) = variables[i];\r\n        \r\n            param.pattern_id = 0;\r\n            return true;\r\n        }\r\n        template <typename PatchT>\r\n        static void generate_subtopology(const PatchParam& param, PatchT& patch) {\r\n            /*\r\n        |        ___C3__\r\n        |      _/   |   \\_   \r\n        |     /     |     \\\r\n        |   C4      |      C2\r\n        |     \\     |     /\r\n        |      \\    |    /\r\n        |      C0---V0--C1\r\n            */\r\n            patch.clear();\r\n            typename PatchT::VHandle C[5];\r\n            for (int i = 0; i < 5; ++i) C[i] = add_tagged_vertex(patch, i, true );\r\n            auto V0 = add_tagged_vertex(patch, 0, false);\r\n        \r\n            patch.add_face(V0, C[3], C[4], C[0]);\r\n            patch.add_face(V0, C[1], C[2], C[3]);\r\n        }\r\n        static VariableIndicators& get_variable_indicators() {\r\n            static VariableIndicators variable_indicators;\r\n            return variable_indicators;\r\n        }\r\n        static std::string get_param_str(const PatchParam& param) { return \"\"; }\r\n    };\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/patchgen/Pattern_5_1.h",
    "content": "#pragma once\r\n#include \"Pattern.h\"\r\n#include \"ILP.h\"\r\n#include <kt84/eigen_def.h>\r\n#include <kt84/openmesh/edgeloop.h>\r\n#include <sstream>\r\n\r\n/*\r\nequation for pattern 1:\r\n  |0|     |1|     |0|     |0|     |1|     |1|   |2|    |1|   |l0|\r\n  |1|     |0|     |1|     |0|     |0|     |0|   |1|    |1|   |l1|\r\np0|0| + p1|1| + p2|0| + p3|1| + p4|0| + q4|0| + |1| + x|0| = |l2|\r\n  |0|     |0|     |1|     |0|     |1|     |1|   |1|    |0|   |l3|\r\n  |1|     |0|     |0|     |1|     |0|     |0|   |1|    |0|   |l4|\r\n*/\r\nnamespace patchgen {\r\n    template <>\r\n    struct Pattern<5, 1> {\r\n        static Eigen::MatrixXd& get_constraint_matrix() {\r\n            static Eigen::MatrixXd constraint_matrix;\r\n            if (constraint_matrix.size() == 0) {\r\n                constraint_matrix.resize(5, 7);\r\n                constraint_matrix << 0, 1, 0, 0, 1, 1, 1,\r\n                                     1, 0, 1, 0, 0, 0, 1,\r\n                                     0, 1, 0, 1, 0, 0, 0,\r\n                                     0, 0, 1, 0, 1, 1, 0,\r\n                                     1, 0, 0, 1, 0, 0, 0;\r\n            }\r\n            return constraint_matrix;\r\n        }\r\n    \r\n        static Eigen::VectorXd get_constraint_rhs(const Eigen::VectorXi& l) {\r\n            return kt84::make_Vector5d(l[0] - 2,\r\n                                       l[1] - 1,\r\n                                       l[2] - 1,\r\n                                       l[3] - 1,\r\n                                       l[4] - 1);\r\n        }\r\n    \r\n        static int& get_variable(PatchParam& param, int index) {\r\n            if (index < 5) return param.p[index];\r\n            if (index == 5) return param.q[4];\r\n            return param.x;\r\n        }\r\n\r\n        static bool get_default_parameter(const Eigen::VectorXi& l, PatchParam& param) {\r\n            auto& constraint_matrix = get_constraint_matrix();\r\n            const int num_variables = constraint_matrix.cols();\r\n            ILP ilp(num_variables);\r\n            ilp.add_constraint(constraint_matrix, EQ, get_constraint_rhs(l));\r\n        \r\n            // arbitrary constraints and objective\r\n            // xmin\r\n            ilp.set_objective(kt84::make_Vector7d(0, 0, 0, 0, 0, 0, 1), false);\r\n            if (!ilp.solve()) return false;\r\n            int xmin = ilp.get_variables()[6];\r\n            // xmax\r\n            ilp.refresh();\r\n            ilp.set_objective(kt84::make_Vector7d(0, 0, 0, 0, 0, 0, 1), true);\r\n            if (!ilp.solve()) return false;\r\n            int xmax = ilp.get_variables()[6];\r\n            // xmid-1<=x<=xmid+1\r\n            ilp.refresh();\r\n            int xmid = (xmin + xmax) / 2;\r\n            ilp.add_constraint(kt84::make_Vector7d(0, 0, 0, 0, 0, 0, 1), LE, xmid + 1);\r\n            ilp.add_constraint(kt84::make_Vector7d(0, 0, 0, 0, 0, 0, 1), GE, xmid - 1);\r\n            // p4<=q4\r\n            ilp.add_constraint(kt84::make_Vector7d(0, 0, 0, 0, 1, -1, 0), LE, 0);\r\n            // maximize p0+p1+p2+p3+p4\r\n            ilp.set_objective(kt84::make_Vector7d(1, 1, 1, 1, 1, 0, 0), true);\r\n            if (!ilp.solve()) return false;\r\n        \r\n            auto variables = ilp.get_variables();\r\n            for (int i = 0; i < num_variables; ++i)\r\n                get_variable(param, i) = variables[i];\r\n        \r\n            param.pattern_id = 1;\r\n            return true;\r\n        }\r\n        template <typename PatchT>\r\n        static void generate_subtopology(const PatchParam& param, PatchT& patch) {\r\n            /*\r\n        |             __C3__\r\n        |   q4--> ___/      \\___\r\n        |        /              \\\r\n        |      C4            ___C2\r\n        |       \\        ___/  /\r\n        |        \\   ___/     /  <--x\r\n        |         \\ /        /\r\n        |         C0---V0---C1\r\n        |         x--^    ^--q4\r\n            */\r\n            patch.clear();\r\n            typename PatchT::VHandle C[5];\r\n            for (int i = 0; i < 5; ++i) C[i] = add_tagged_vertex(patch, i, true );\r\n            auto V0 = add_tagged_vertex(patch, 0, false);\r\n        \r\n            patch.add_face(C[0], V0, C[1], C[2]);\r\n            patch.add_face(C[0], C[2], C[3], C[4]);\r\n        \r\n            auto h_insert_x = patch.halfedge_handle(V0);  // corresponds to V0-C0\r\n            for (int i = 0; i < param.x; ++i)\r\n                insert_edgeloop(patch, h_insert_x);\r\n            auto h_insert_q4 = patch.halfedge_handle(C[1]);  // corresponds to C1-V0\r\n            for (int i = 0; i < param.q[4]; ++i)\r\n                insert_edgeloop(patch, h_insert_q4);\r\n        }\r\n        static VariableIndicators& get_variable_indicators() {\r\n            static VariableIndicators variable_indicators;\r\n            if (variable_indicators.empty()) {\r\n                variable_indicators.resize(2);\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::C1, PatchVertexTag::V0));       // for q4\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::C0, PatchVertexTag::C2));\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::C3, PatchVertexTag::C4));\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::C0, PatchVertexTag::V0));       // for x\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::C1, PatchVertexTag::C2));\r\n            }\r\n            return variable_indicators;\r\n        }\r\n        static std::string get_param_str(const PatchParam& param) {\r\n            std::stringstream ss;\r\n            ss << \"q4=\" << param.q[4] \r\n               << \"_x=\" << param.x;\r\n            return ss.str();\r\n        }\r\n    };\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/patchgen/Pattern_5_2.h",
    "content": "#pragma once\r\n#include \"Pattern.h\"\r\n#include \"ILP.h\"\r\n#include <kt84/eigen_def.h>\r\n#include <kt84/openmesh/edgeloop.h>\r\n#include <sstream>\r\n\r\n/*\r\nequation for pattern 2:\r\n  |0|     |1|     |0|     |0|     |1|     |0|     |1|     |1|   |4|    |2|   |l0|\r\n  |1|     |0|     |1|     |0|     |0|     |1|     |0|     |0|   |1|    |0|   |l1|\r\np0|0| + p1|1| + p2|0| + p3|1| + p4|0| + q0|0| + q1|1| + q4|0| + |1| + x|0| = |l2|\r\n  |0|     |0|     |1|     |0|     |1|     |0|     |0|     |1|   |1|    |0|   |l3|\r\n  |1|     |0|     |0|     |1|     |0|     |1|     |0|     |0|   |1|    |0|   |l4|\r\n*/\r\nnamespace patchgen {\r\n    template <>\r\n    struct Pattern<5, 2> {\r\n        static Eigen::MatrixXd& get_constraint_matrix() {\r\n            static Eigen::MatrixXd constraint_matrix;\r\n            if (constraint_matrix.size() == 0) {\r\n                constraint_matrix.resize(5, 9);\r\n                constraint_matrix << 0, 1, 0, 0, 1, 0, 1, 1, 2,\r\n                                     1, 0, 1, 0, 0, 1, 0, 0, 0,\r\n                                     0, 1, 0, 1, 0, 0, 1, 0, 0,\r\n                                     0, 0, 1, 0, 1, 0, 0, 1, 0,\r\n                                     1, 0, 0, 1, 0, 1, 0, 0, 0;\r\n            }\r\n            return constraint_matrix;\r\n        }\r\n    \r\n        static Eigen::VectorXd get_constraint_rhs(const Eigen::VectorXi& l) {\r\n            return kt84::make_Vector5d(l[0] - 4,\r\n                                       l[1] - 1,\r\n                                       l[2] - 1,\r\n                                       l[3] - 1,\r\n                                       l[4] - 1);\r\n        }\r\n    \r\n        static int& get_variable(PatchParam& param, int index) {\r\n            if (index < 5) return param.p[index];\r\n            if (index == 5) return param.q[0];\r\n            if (index == 6) return param.q[1];\r\n            if (index == 7) return param.q[4];\r\n            return param.x;\r\n        }\r\n\r\n        static bool get_default_parameter(const Eigen::VectorXi& l, PatchParam& param) {\r\n            auto& constraint_matrix = get_constraint_matrix();\r\n            const int num_variables = constraint_matrix.cols();\r\n            ILP ilp(num_variables);\r\n            ilp.add_constraint(constraint_matrix, EQ, get_constraint_rhs(l));\r\n        \r\n            // arbitrary constraints and objective\r\n            // xmin\r\n            ilp.set_objective(kt84::make_Vector9d(0, 0, 0, 0, 0, 0, 0, 0, 1), false);\r\n            if (!ilp.solve()) return false;\r\n            int xmin = ilp.get_variables()[8];\r\n            // xmax\r\n            ilp.refresh();\r\n            ilp.set_objective(kt84::make_Vector9d(0, 0, 0, 0, 0, 0, 0, 0, 1), true);\r\n            if (!ilp.solve()) return false;\r\n            int xmax = ilp.get_variables()[8];\r\n            // xmid-1<=x<=xmid+1\r\n            ilp.refresh();\r\n            int xmid = (xmin + xmax) / 2;\r\n            ilp.add_constraint(kt84::make_Vector9d(0, 0, 0, 0, 0, 0, 0, 0, 1), LE, xmid + 1);\r\n            ilp.add_constraint(kt84::make_Vector9d(0, 0, 0, 0, 0, 0, 0, 0, 1), GE, xmid - 1);\r\n            // p0<=q0\r\n            ilp.add_constraint(kt84::make_Vector9d(1, 0, 0, 0, 0, -1, 0, 0, 0), LE, 0);\r\n            // p1<=q1\r\n            ilp.add_constraint(kt84::make_Vector9d(0, 1, 0, 0, 0, 0, -1, 0, 0), LE, 0);\r\n            // p4<=q4\r\n            ilp.add_constraint(kt84::make_Vector9d(0, 0, 0, 0, 1, 0, 0, -1, 0), LE, 0);\r\n            // maximize p0+p1+p2+p3+p4\r\n            ilp.set_objective(kt84::make_Vector9d(1, 1, 1, 1, 1, 0, 0, 0, 0), true);\r\n            if (!ilp.solve()) return false;\r\n        \r\n            auto variables = ilp.get_variables();\r\n            for (int i = 0; i < num_variables; ++i)\r\n                get_variable(param, i) = variables[i];\r\n        \r\n            param.pattern_id = 2;\r\n            return true;\r\n        }\r\n        template <typename PatchT>\r\n        static void generate_subtopology(const PatchParam& param, PatchT& patch) {\r\n            /*\r\n        |                         _C3\r\n        |                       _/ | \\_\r\n        |                     _/   |   \\_\r\n        |                   _/     |     \\_\r\n        |                 _/       |       \\_\r\n        |        q4-->  _/         |         \\_   <--q1\r\n        |             _/           |           \\_\r\n        |           _/             |             \\_\r\n        |         _/               V4              \\_\r\n        |       _/                /|\\                \\_\r\n        |     _/                 / | \\                 \\_\r\n        |   C4                  /  |  \\                  C2\r\n        |    \\                 /   |   \\                 /\r\n        |     \\               /    |    \\               /\r\n        |      \\             /    V3     \\             /\r\n        |       \\           /     /\\      \\           /\r\n        |        \\         /     /  \\      \\         /\r\n        |   q0--> \\       /     /    \\      \\       /  <--q0\r\n        |          \\     /     /      \\      \\     /\r\n        |           \\   /     /        \\      \\   /\r\n        |            \\ /     /          \\      \\ /\r\n        |            C0----V0-----V1---V2-------C1\r\n        |            x--^  q1--^     ^--q4   ^--x\r\n            */\r\n            patch.clear();\r\n            typename PatchT::VHandle C[5];\r\n            typename PatchT::VHandle V[5];\r\n            for (int i = 0; i < 5; ++i) C[i] = add_tagged_vertex(patch, i, true );\r\n            for (int i = 0; i < 5; ++i) V[i] = add_tagged_vertex(patch, i, false);\r\n        \r\n            patch.add_face(C[0], V[0], V[3], V[4]);\r\n            patch.add_face(C[1], V[4], V[3], V[2]);\r\n            patch.add_face(V[0], V[1], V[2], V[3]);\r\n            patch.add_face(V[4], C[3], C[4], C[0]);\r\n            patch.add_face(V[4], C[1], C[2], C[3]);\r\n        \r\n            auto h_insert_x = patch.halfedge_handle(V[0]);  // corresponds to V0-C0\r\n            for (int i = 0; i < param.x; ++i)\r\n                insert_edgeloop(patch, h_insert_x);\r\n            auto h_insert_q0 = patch.halfedge_handle(C[0]);  // corresponds to C0-C4\r\n            for (int i = 0; i < param.q[0]; ++i)\r\n                insert_edgeloop(patch, h_insert_q0);\r\n            auto h_insert_q1 = patch.halfedge_handle(V[1]);  // corresponds to V1-V0\r\n            for (int i = 0; i < param.q[1]; ++i)\r\n                insert_edgeloop(patch, h_insert_q1);\r\n            auto h_insert_q4 = patch.halfedge_handle(V[2]);  // corresponds to V2-V1\r\n            for (int i = 0; i < param.q[4]; ++i)\r\n                insert_edgeloop(patch, h_insert_q4);\r\n        }\r\n        static VariableIndicators& get_variable_indicators() {\r\n            static VariableIndicators variable_indicators;\r\n            if (variable_indicators.empty()) {\r\n                variable_indicators.resize(4);\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::C0, PatchVertexTag::C4));       // for q0\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::C1, PatchVertexTag::C2));\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::C3, PatchVertexTag::V4));\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::V0, PatchVertexTag::V1));       // for q1\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::V2, PatchVertexTag::V3));\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::C1, PatchVertexTag::V4));\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::C2, PatchVertexTag::C3));\r\n                variable_indicators[2].push_back(std::make_pair(PatchVertexTag::V2, PatchVertexTag::V1));       // for q4\r\n                variable_indicators[2].push_back(std::make_pair(PatchVertexTag::V0, PatchVertexTag::V3));\r\n                variable_indicators[2].push_back(std::make_pair(PatchVertexTag::C0, PatchVertexTag::V4));\r\n                variable_indicators[2].push_back(std::make_pair(PatchVertexTag::C4, PatchVertexTag::C3));\r\n                variable_indicators[3].push_back(std::make_pair(PatchVertexTag::C0, PatchVertexTag::V0));       // for x\r\n                variable_indicators[3].push_back(std::make_pair(PatchVertexTag::C1, PatchVertexTag::V2));\r\n                variable_indicators[3].push_back(std::make_pair(PatchVertexTag::V3, PatchVertexTag::V4));\r\n            }\r\n            return variable_indicators;\r\n        }\r\n        static std::string get_param_str(const PatchParam& param) {\r\n            std::stringstream ss;\r\n            ss << \"q0=\" << param.q[0] \r\n               << \"_q1=\" << param.q[1]\r\n               << \"_q4=\" << param.q[4]\r\n               << \"_x=\" << param.x;\r\n            return ss.str();\r\n        }\r\n    };\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/patchgen/Pattern_5_3.h",
    "content": "#pragma once\r\n#include \"Pattern.h\"\r\n#include \"ILP.h\"\r\n#include <kt84/eigen_def.h>\r\n#include <kt84/openmesh/edgeloop.h>\r\n#include <sstream>\r\n\r\n/*\r\nequation for pattern 3:\r\n  |0|     |1|     |0|     |0|     |1|     |1|     |1|   |5|    |2|    |1|   |l0|\r\n  |1|     |0|     |1|     |0|     |0|     |0|     |0|   |2|    |0|    |1|   |l1|\r\np0|0| + p1|1| + p2|0| + p3|1| + p4|0| + q1|1| + q4|0| + |1| + x|0| + y|0| = |l2|\r\n  |0|     |0|     |1|     |0|     |1|     |0|     |1|   |1|    |0|    |0|   |l3|\r\n  |1|     |0|     |0|     |1|     |0|     |0|     |0|   |1|    |0|    |0|   |l4|\r\n*/\r\nnamespace patchgen {\r\n    template <>\r\n    struct Pattern<5, 3> {\r\n        static Eigen::MatrixXd& get_constraint_matrix() {\r\n            static Eigen::MatrixXd constraint_matrix;\r\n            if (constraint_matrix.size() == 0) {\r\n                constraint_matrix.resize(5, 9);\r\n                constraint_matrix << 0, 1, 0, 0, 1, 1, 1, 2, 1,\r\n                                     1, 0, 1, 0, 0, 0, 0, 0, 1,\r\n                                     0, 1, 0, 1, 0, 1, 0, 0, 0,\r\n                                     0, 0, 1, 0, 1, 0, 1, 0, 0,\r\n                                     1, 0, 0, 1, 0, 0, 0, 0, 0;\r\n            }\r\n            return constraint_matrix;\r\n        }\r\n    \r\n        static Eigen::VectorXd get_constraint_rhs(const Eigen::VectorXi& l) {\r\n            return kt84::make_Vector5d(l[0] - 5,\r\n                                       l[1] - 2,\r\n                                       l[2] - 1,\r\n                                       l[3] - 1,\r\n                                       l[4] - 1);\r\n        }\r\n    \r\n        static int& get_variable(PatchParam& param, int index) {\r\n            if (index < 5) return param.p[index];\r\n            if (index == 5) return param.q[1];\r\n            if (index == 6) return param.q[4];\r\n            if (index == 7) return param.x;\r\n            return param.y;\r\n        }\r\n\r\n        static bool get_default_parameter(const Eigen::VectorXi& l, PatchParam& param) {\r\n            auto& constraint_matrix = get_constraint_matrix();\r\n            const int num_variables = constraint_matrix.cols();\r\n            ILP ilp(num_variables);\r\n            ilp.add_constraint(constraint_matrix, EQ, get_constraint_rhs(l));\r\n        \r\n            // arbitrary constraints and objective\r\n            // xmin\r\n            ilp.set_objective(kt84::make_Vector9d(0, 0, 0, 0, 0, 0, 0, 1, 0), false);\r\n            if (!ilp.solve()) return false;\r\n            int xmin = ilp.get_variables()[7];\r\n            // xmax\r\n            ilp.refresh();\r\n            ilp.set_objective(kt84::make_Vector9d(0, 0, 0, 0, 0, 0, 0, 1, 0), true);\r\n            if (!ilp.solve()) return false;\r\n            int xmax = ilp.get_variables()[7];\r\n            // xmid-1<=x<=xmid+1\r\n            ilp.refresh();\r\n            int xmid = (xmin + xmax) / 2;\r\n            ilp.add_constraint(kt84::make_Vector9d(0, 0, 0, 0, 0, 0, 0, 1, 0), LE, xmid + 1);\r\n            ilp.add_constraint(kt84::make_Vector9d(0, 0, 0, 0, 0, 0, 0, 1, 0), GE, xmid - 1);\r\n            // p1<=q1\r\n            ilp.add_constraint(kt84::make_Vector9d(0, 1, 0, 0, 0, -1, 0, 0, 0), LE, 0);\r\n            // p4<=q4\r\n            ilp.add_constraint(kt84::make_Vector9d(0, 0, 0, 0, 1, 0, -1, 0, 0), LE, 0);\r\n            // maximize p0+p1+p2+p3+p4\r\n            ilp.set_objective(kt84::make_Vector9d(1, 1, 1, 1, 1, 0, 0, 0, 0), true);\r\n            if (!ilp.solve()) return false;\r\n        \r\n            auto variables = ilp.get_variables();\r\n            for (int i = 0; i < num_variables; ++i)\r\n                get_variable(param, i) = variables[i];\r\n        \r\n            param.pattern_id = 3;\r\n            return true;\r\n        }\r\n        template <typename PatchT>\r\n        static void generate_subtopology(const PatchParam& param, PatchT& patch) {\r\n            /*\r\n        |           ____C3_____\r\n        |       ___/     |     \\_____\r\n        |   ___/         |            \\_____\r\n        |  /             |                  \\\r\n        |C4__            |               ____C2\r\n        | \\  \\__         |          ____/    /\r\n        |  \\    \\__      |     ____/        /\r\n        |   \\      \\    _V6--V7_           /  <--y\r\n        |    \\      V5_/ |    | \\_        /\r\n        |     \\      |   |    |   V8-----V4\r\n        |      \\     |   |    |   |     /\r\n        |       \\    |   |    |   |    /\r\n        |        C0--V0--V1---V2--V3--C1\r\n        |          ^   ^    ^    ^  ^\r\n        |          x   q4   q1   y  x\r\n            */\r\n            patch.clear();\r\n            typename PatchT::VHandle C[5];\r\n            typename PatchT::VHandle V[9];\r\n            for (int i = 0; i < 5; ++i) C[i] = add_tagged_vertex(patch, i, true );\r\n            for (int i = 0; i < 9; ++i) V[i] = add_tagged_vertex(patch, i, false);\r\n        \r\n            patch.add_face(C[0], V[0], V[5], C[4]);\r\n            patch.add_face(V[0], V[1], V[6], V[5]);\r\n            patch.add_face(V[1], V[2], V[7], V[6]);\r\n            patch.add_face(V[2], V[3], V[8], V[7]);\r\n            patch.add_face(V[3], C[1], V[4], V[8]);\r\n            patch.add_face(V[4], C[2], V[7], V[8]);\r\n            patch.add_face(C[2], C[3], V[6], V[7]);\r\n            patch.add_face(C[3], C[4], V[5], V[6]);\r\n        \r\n            auto h_insert_x = patch.halfedge_handle(V[0]);  // corresponds to V0-C0\r\n            for (int i = 0; i < param.x; ++i)\r\n                insert_edgeloop(patch, h_insert_x);\r\n            auto h_insert_y = patch.halfedge_handle(V[3]);  // corresponds to V3-V2\r\n            for (int i = 0; i < param.y; ++i)\r\n                insert_edgeloop(patch, h_insert_y);\r\n            auto h_insert_q1 = patch.halfedge_handle(V[2]);  // corresponds to V2-V1\r\n            for (int i = 0; i < param.q[1]; ++i)\r\n                insert_edgeloop(patch, h_insert_q1);\r\n            auto h_insert_q4 = patch.halfedge_handle(V[1]);  // corresponds to V1-V0\r\n            for (int i = 0; i < param.q[4]; ++i)\r\n                insert_edgeloop(patch, h_insert_q4);\r\n        }\r\n        static VariableIndicators& get_variable_indicators() {\r\n            static VariableIndicators variable_indicators;\r\n            if (variable_indicators.empty()) {\r\n                variable_indicators.resize(4);\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::V1, PatchVertexTag::V2));       // for q1\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::V6, PatchVertexTag::V7));\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::C2, PatchVertexTag::C3));\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::V0, PatchVertexTag::V1));       // for q4\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::V5, PatchVertexTag::V6));\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::C3, PatchVertexTag::C4));\r\n                variable_indicators[2].push_back(std::make_pair(PatchVertexTag::C0, PatchVertexTag::V0));       // for x\r\n                variable_indicators[2].push_back(std::make_pair(PatchVertexTag::C4, PatchVertexTag::V5));\r\n                variable_indicators[2].push_back(std::make_pair(PatchVertexTag::C3, PatchVertexTag::V6));\r\n                variable_indicators[2].push_back(std::make_pair(PatchVertexTag::C2, PatchVertexTag::V7));\r\n                variable_indicators[2].push_back(std::make_pair(PatchVertexTag::V4, PatchVertexTag::V8));\r\n                variable_indicators[2].push_back(std::make_pair(PatchVertexTag::C1, PatchVertexTag::V3));\r\n                variable_indicators[3].push_back(std::make_pair(PatchVertexTag::V2, PatchVertexTag::V3));       // for y\r\n                variable_indicators[3].push_back(std::make_pair(PatchVertexTag::V7, PatchVertexTag::V8));\r\n                variable_indicators[3].push_back(std::make_pair(PatchVertexTag::C2, PatchVertexTag::V4));\r\n            }\r\n            return variable_indicators;\r\n        }\r\n        static std::string get_param_str(const PatchParam& param) {\r\n            std::stringstream ss;\r\n            ss << \"q1=\" << param.q[1]\r\n               << \"_q4=\" << param.q[4]\r\n               << \"_x=\" << param.x\r\n               << \"_y=\" << param.y;\r\n            return ss.str();\r\n        }\r\n    };\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/patchgen/Pattern_5_4.h",
    "content": "#pragma once\r\n#include \"Pattern.h\"\r\n#include \"ILP.h\"\r\n#include <kt84/eigen_def.h>\r\n#include <kt84/openmesh/edgeloop.h>\r\n#include <sstream>\r\n\r\n/*\r\nequation for pattern 4: Fig 9(b) of Yassen et al., Computer-Aided Design 45 (2013)\r\n  |0|     |1|     |0|     |0|     |1|     |0|     |1|   |3|    |1|   |l0|\r\n  |1|     |0|     |1|     |0|     |0|     |1|     |0|   |3|    |1|   |l1|\r\np0|0| + p1|1| + p2|0| + p3|1| + p4|0| + q0|0| + q1|1| + |3| + x|0| = |l2|\r\n  |0|     |0|     |1|     |0|     |1|     |0|     |0|   |1|    |0|   |l3|\r\n  |1|     |0|     |0|     |1|     |0|     |1|     |0|   |2|    |0|   |l4|\r\n*/\r\nnamespace patchgen {\r\n    template <>\r\n    struct Pattern<5, 4> {\r\n        static Eigen::MatrixXd& get_constraint_matrix() {\r\n            static Eigen::MatrixXd constraint_matrix;\r\n            if (constraint_matrix.size() == 0) {\r\n                constraint_matrix.resize(5, 8);\r\n                constraint_matrix << 0, 1, 0, 0, 1, 0, 1, 1,\r\n                                     1, 0, 1, 0, 0, 1, 0, 1,\r\n                                     0, 1, 0, 1, 0, 0, 1, 0,\r\n                                     0, 0, 1, 0, 1, 0, 0, 0,\r\n                                     1, 0, 0, 1, 0, 1, 0, 0;\r\n            }\r\n            return constraint_matrix;\r\n        }\r\n    \r\n        static Eigen::VectorXd get_constraint_rhs(const Eigen::VectorXi& l) {\r\n            return kt84::make_Vector5d(l[0] - 3,\r\n                                       l[1] - 3,\r\n                                       l[2] - 3,\r\n                                       l[3] - 1,\r\n                                       l[4] - 2);\r\n        }\r\n    \r\n        static int& get_variable(PatchParam& param, int index) {\r\n            if (index < 5) return param.p[index];\r\n            if (index == 5) return param.q[0];\r\n            if (index == 6) return param.q[1];\r\n            if (index == 7) return param.x;\r\n            return param.y;\r\n        }\r\n\r\n        static bool get_default_parameter(const Eigen::VectorXi& l, PatchParam& param) {\r\n            auto& constraint_matrix = get_constraint_matrix();\r\n            const int num_variables = constraint_matrix.cols();\r\n            ILP ilp(num_variables);\r\n            ilp.add_constraint(constraint_matrix, EQ, get_constraint_rhs(l));\r\n        \r\n            // arbitrary constraints and objective\r\n            // xmin\r\n            ilp.set_objective(kt84::make_Vector8d(0, 0, 0, 0, 0, 0, 0, 1), false);\r\n            if (!ilp.solve()) return false;\r\n            int xmin = ilp.get_variables()[7];\r\n            // xmax\r\n            ilp.refresh();\r\n            ilp.set_objective(kt84::make_Vector8d(0, 0, 0, 0, 0, 0, 0, 1), true);\r\n            if (!ilp.solve()) return false;\r\n            int xmax = ilp.get_variables()[7];\r\n            // xmid-1<=x<=xmid+1\r\n            ilp.refresh();\r\n            int xmid = (xmin + xmax) / 2;\r\n            ilp.add_constraint(kt84::make_Vector8d(0, 0, 0, 0, 0, 0, 0, 1), LE, xmid + 1);\r\n            ilp.add_constraint(kt84::make_Vector8d(0, 0, 0, 0, 0, 0, 0, 1), GE, xmid - 1);\r\n            // p1<=q1\r\n            ilp.add_constraint(kt84::make_Vector8d(0, 1, 0, 0, 0, -1, 0, 0), LE, 0);\r\n            // p4<=q4\r\n            ilp.add_constraint(kt84::make_Vector8d(0, 0, 0, 0, 1, 0, -1, 0), LE, 0);\r\n            // maximize p0+p1+p2+p3+p4\r\n            ilp.set_objective(kt84::make_Vector8d(1, 1, 1, 1, 1, 0, 0, 0), true);\r\n            if (!ilp.solve()) return false;\r\n        \r\n            auto variables = ilp.get_variables();\r\n            for (int i = 0; i < num_variables; ++i)\r\n                get_variable(param, i) = variables[i];\r\n        \r\n            param.pattern_id = 4;\r\n            return true;\r\n        }\r\n        template <typename PatchT>\r\n        static void generate_subtopology(const PatchParam& param, PatchT& patch) {\r\n            /*\r\n            |             __C3--__    v--q1\r\n            |         __--      __V5--__\r\n            |     __--       __/        V4___   \r\n            | C4--        __/          /     ----___\r\n            |  \\        _/            /             C2\r\n            |   \\    __/             /               /\r\n            |    \\ _/               /               /\r\n            |    V6---------------V7--------------V3\r\n            |      \\             /                /\r\n            |       \\            |               /<--q0\r\n            |   q0-->\\          /         ___--V2\r\n            |         \\         |   ___---     / <--x\r\n            |          \\       /__--          /\r\n            |          C0-----V0------V1-----C1\r\n            |          q1--^    x--^ \r\n            */\r\n            patch.clear();\r\n            typename PatchT::VHandle C[5];\r\n            typename PatchT::VHandle V[8];\r\n            for (int i = 0; i < 5; ++i) C[i] = add_tagged_vertex(patch, i, true );\r\n            for (int i = 0; i < 8; ++i) V[i] = add_tagged_vertex(patch, i, false);\r\n        \r\n            patch.add_face(C[0], V[0], V[7], V[6]);\r\n            patch.add_face(V[0], V[1], C[1], V[2]);\r\n            patch.add_face(V[2], V[3], V[7], V[0]);\r\n            patch.add_face(V[3], C[2], V[4], V[7]);\r\n            patch.add_face(V[4], V[5], V[6], V[7]);\r\n            patch.add_face(V[5], C[3], C[4], V[6]);\r\n        \r\n            auto h_insert_x = patch.halfedge_handle(V[1]);  // corresponds to V1-V0\r\n            for (int i = 0; i < param.x; ++i)\r\n                insert_edgeloop(patch, h_insert_x);\r\n            auto h_insert_q0 = patch.halfedge_handle(V[3]);  // corresponds to V3-V2\r\n            for (int i = 0; i < param.q[0]; ++i)\r\n                insert_edgeloop(patch, h_insert_q0);\r\n            auto h_insert_q1 = patch.halfedge_handle(V[0]);  // corresponds to V0-C0\r\n            for (int i = 0; i < param.q[1]; ++i)\r\n                insert_edgeloop(patch, h_insert_q1);\r\n        }\r\n        static VariableIndicators& get_variable_indicators() {\r\n            static VariableIndicators variable_indicators;\r\n            if (variable_indicators.empty()) {\r\n                variable_indicators.resize(3);\r\n                // for q0\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::V2, PatchVertexTag::V3));\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::V0, PatchVertexTag::V7));\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::C0, PatchVertexTag::V6));\r\n                // for q1\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::C0, PatchVertexTag::V0));\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::V6, PatchVertexTag::V7));\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::V5, PatchVertexTag::V4));\r\n                // for x\r\n                variable_indicators[2].push_back(std::make_pair(PatchVertexTag::V0, PatchVertexTag::V1));\r\n                variable_indicators[2].push_back(std::make_pair(PatchVertexTag::V2, PatchVertexTag::C1));\r\n            }\r\n            return variable_indicators;\r\n        }\r\n        static std::string get_param_str(const PatchParam& param) {\r\n            std::stringstream ss;\r\n            ss << \"q0=\" << param.q[0]\r\n               << \"_q1=\" << param.q[1]\r\n               << \"_x=\" << param.x;\r\n            return ss.str();\r\n        }\r\n    };\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/patchgen/Pattern_6_0.h",
    "content": "#pragma once\r\n#include \"Pattern.h\"\r\n#include \"ILP.h\"\r\n#include <kt84/eigen_def.h>\r\n#include <kt84/openmesh/edgeloop.h>\r\n#include <sstream>\r\n\r\n/*\r\nequation for pattern 0:\r\n  |0|     |1|     |0|     |0|     |0|     |1|   |1|    |1|   |l0|\r\n  |1|     |0|     |1|     |0|     |0|     |0|   |1|    |0|   |l1|\r\np0|0| + p1|1| + p2|0| + p3|1| + p4|0| + p5|0| + |1| + x|0| = |l2|\r\n  |0|     |0|     |1|     |0|     |1|     |0|   |1|    |1|   |l3|\r\n  |0|     |0|     |0|     |1|     |0|     |1|   |1|    |0|   |l4|\r\n  |1|     |0|     |0|     |0|     |1|     |0|   |1|    |0|   |l5|\r\n*/\r\nnamespace patchgen {\r\n    template <>\r\n    struct Pattern<6, 0> {\r\n        static Eigen::MatrixXd& get_constraint_matrix() {\r\n            static Eigen::MatrixXd constraint_matrix;\r\n            if (constraint_matrix.size() == 0) {\r\n                constraint_matrix.resize(6, 7);\r\n                constraint_matrix << 0, 1, 0, 0, 0, 1, 1,\r\n                                     1, 0, 1, 0, 0, 0, 0,\r\n                                     0, 1, 0, 1, 0, 0, 0,\r\n                                     0, 0, 1, 0, 1, 0, 1,\r\n                                     0, 0, 0, 1, 0, 1, 0,\r\n                                     1, 0, 0, 0, 1, 0, 0;\r\n            }\r\n            return constraint_matrix;\r\n        }\r\n    \r\n        static Eigen::VectorXd get_constraint_rhs(const Eigen::VectorXi& l) {\r\n            return kt84::make_Vector6d(l[0] - 1,\r\n                                       l[1] - 1,\r\n                                       l[2] - 1,\r\n                                       l[3] - 1,\r\n                                       l[4] - 1,\r\n                                       l[5] - 1);\r\n        }\r\n    \r\n        static int& get_variable(PatchParam& param, int index) {\r\n            if (index < 6) return param.p[index];\r\n            return param.x;\r\n        }\r\n\r\n        static bool get_default_parameter(const Eigen::VectorXi& l, PatchParam& param) {\r\n            auto& constraint_matrix = get_constraint_matrix();\r\n            const int num_variables = constraint_matrix.cols();\r\n            ILP ilp(num_variables);\r\n            ilp.add_constraint(constraint_matrix, EQ, get_constraint_rhs(l));\r\n        \r\n            // arbitrary constraints and objective\r\n            // xmin\r\n            ilp.set_objective(kt84::make_Vector7d(0, 0, 0, 0, 0, 0, 1), false);\r\n            if (!ilp.solve()) return false;\r\n            int xmin = ilp.get_variables()[6];\r\n            // xmax\r\n            ilp.refresh();\r\n            ilp.set_objective(kt84::make_Vector7d(0, 0, 0, 0, 0, 0, 1), true);\r\n            if (!ilp.solve()) return false;\r\n            int xmax = ilp.get_variables()[6];\r\n            // xmid-1<=x<=xmid+1\r\n            ilp.refresh();\r\n            int xmid = (xmin + xmax) / 2;\r\n            ilp.add_constraint(kt84::make_Vector7d(0, 0, 0, 0, 0, 0, 1), LE, xmid + 1);\r\n            ilp.add_constraint(kt84::make_Vector7d(0, 0, 0, 0, 0, 0, 1), GE, xmid - 1);\r\n            // maximize p0+p1+p2+p3+p4+p5\r\n            ilp.set_objective(kt84::make_Vector7d(1, 1, 1, 1, 1, 1, 0), true);\r\n            if (!ilp.solve()) return false;\r\n        \r\n            auto variables = ilp.get_variables();\r\n            for (int i = 0; i < num_variables; ++i)\r\n                get_variable(param, i) = variables[i];\r\n        \r\n            param.pattern_id = 0;\r\n            return true;\r\n        }\r\n        template <typename PatchT>\r\n        static void generate_subtopology(const PatchParam& param, PatchT& patch) {\r\n            /*\r\n        |      v--x\r\n        |   C4----C3\r\n        |  /       \\\r\n        | /         \\\r\n        |C5----------C2\r\n        | \\         /\r\n        |  \\       /\r\n        |   C0----C1\r\n        |      ^--x\r\n            */\r\n            patch.clear();\r\n            typename PatchT::VHandle C[6];\r\n            for (int i = 0; i < 6; ++i) C[i] = add_tagged_vertex(patch, i, true );\r\n        \r\n            patch.add_face(C[0], C[1], C[2], C[5]);\r\n            patch.add_face(C[2], C[3], C[4], C[5]);\r\n        \r\n            auto h_insert_x = patch.halfedge_handle(C[1]);  // corresponds to C1-C0\r\n            for (int i = 0; i < param.x; ++i)\r\n                insert_edgeloop(patch, h_insert_x);\r\n        }\r\n        static VariableIndicators& get_variable_indicators() {\r\n            static VariableIndicators variable_indicators;\r\n            if (variable_indicators.empty()) {\r\n                variable_indicators.resize(1);\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::C0, PatchVertexTag::C1));       // for x\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::C5, PatchVertexTag::C2));\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::C4, PatchVertexTag::C3));\r\n            }\r\n            return variable_indicators;\r\n        }\r\n        static std::string get_param_str(const PatchParam& param) {\r\n            std::stringstream ss;\r\n            ss << \"x=\" << param.x;\r\n            return ss.str();\r\n        }\r\n    };\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/patchgen/Pattern_6_1.h",
    "content": "#pragma once\r\n#include \"Pattern.h\"\r\n#include \"ILP.h\"\r\n#include <kt84/eigen_def.h>\r\n#include <kt84/openmesh/edgeloop.h>\r\n#include <sstream>\r\n\r\n/*\r\n  |0|     |1|     |0|     |0|     |0|     |1|   |2|    |1|    |1|    |0|    |0|   |l0|\r\n  |1|     |0|     |1|     |0|     |0|     |0|   |2|    |1|    |0|    |1|    |0|   |l1|\r\np0|0| + p1|1| + p2|0| + p3|1| + p4|0| + p5|0| + |1| + x|0| + y|0| + z|0| + w|1| = |l2|\r\n  |0|     |0|     |1|     |0|     |1|     |0|   |1|    |0|    |1|    |0|    |0|   |l3|\r\n  |0|     |0|     |0|     |1|     |0|     |1|   |1|    |0|    |0|    |1|    |0|   |l4|\r\n  |1|     |0|     |0|     |0|     |1|     |0|   |1|    |0|    |0|    |0|    |1|   |l5|\r\n*/\r\nnamespace patchgen {\r\n    template <>\r\n    struct Pattern<6, 1> {\r\n        static Eigen::MatrixXd& get_constraint_matrix() {\r\n            static Eigen::MatrixXd constraint_matrix;\r\n            if (constraint_matrix.size() == 0) {\r\n                constraint_matrix.resize(6, 10);\r\n                constraint_matrix << 0, 1, 0, 0, 0, 1, 1, 1, 0, 0,\r\n                                     1, 0, 1, 0, 0, 0, 1, 0, 1, 0,\r\n                                     0, 1, 0, 1, 0, 0, 0, 0, 0, 1,\r\n                                     0, 0, 1, 0, 1, 0, 0, 1, 0, 0,\r\n                                     0, 0, 0, 1, 0, 1, 0, 0, 1, 0,\r\n                                     1, 0, 0, 0, 1, 0, 0, 0, 0, 1;\r\n            }\r\n            return constraint_matrix;\r\n        }\r\n    \r\n        static Eigen::VectorXd get_constraint_rhs(const Eigen::VectorXi& l) {\r\n            return kt84::make_Vector6d(l[0] - 2,\r\n                                       l[1] - 2,\r\n                                       l[2] - 1,\r\n                                       l[3] - 1,\r\n                                       l[4] - 1,\r\n                                       l[5] - 1);\r\n        }\r\n    \r\n        static int& get_variable(PatchParam& param, int index) {\r\n            if (index < 6) return param.p[index];\r\n            if (index == 6) return param.x;\r\n            if (index == 7) return param.y;\r\n            if (index == 8) return param.z;\r\n            return param.w;\r\n        }\r\n\r\n        static bool get_default_parameter(const Eigen::VectorXi& l, PatchParam& param) {\r\n            auto& constraint_matrix = get_constraint_matrix();\r\n            const int num_variables = constraint_matrix.cols();\r\n            ILP ilp(num_variables);\r\n            ilp.add_constraint(constraint_matrix, EQ, get_constraint_rhs(l));\r\n        \r\n            // arbitrary constraints and objective\r\n            // xmin\r\n            ilp.set_objective(kt84::make_Vector10d(0, 0, 0, 0, 0, 0, 1, 0, 0, 0), false);\r\n            if (!ilp.solve()) return false;\r\n            int xmin = ilp.get_variables()[6];\r\n            // xmax\r\n            ilp.refresh();\r\n            ilp.set_objective(kt84::make_Vector10d(0, 0, 0, 0, 0, 0, 1, 0, 0, 0), true);\r\n            if (!ilp.solve()) return false;\r\n            int xmax = ilp.get_variables()[6];\r\n            // xmid-1<=x<=xmid+1\r\n            ilp.refresh();\r\n            int xmid = (xmin + xmax) / 2;\r\n            ilp.add_constraint(kt84::make_Vector10d(0, 0, 0, 0, 0, 0, 1, 0, 0, 0), LE, xmid + 1);\r\n            ilp.add_constraint(kt84::make_Vector10d(0, 0, 0, 0, 0, 0, 1, 0, 0, 0), GE, xmid - 1);\r\n            // maximize p0+p1+p2+p3+p4+p5\r\n            ilp.set_objective(kt84::make_Vector10d(1, 1, 1, 1, 1, 1, 0, 0, 0, 0), true);\r\n            if (!ilp.solve()) return false;\r\n        \r\n            auto variables = ilp.get_variables();\r\n            for (int i = 0; i < num_variables; ++i)\r\n                get_variable(param, i) = variables[i];\r\n        \r\n            param.pattern_id = 1;\r\n            return true;\r\n        }\r\n        template <typename PatchT>\r\n        static void generate_subtopology(const PatchParam& param, PatchT& patch) {\r\n            /*\r\n        |                v--y\r\n        |           C4--------C3\r\n        |          /  \\        \\\r\n        |   z-->  /    \\        \\  <--w\r\n        |        /      \\        \\\r\n        |       C5      V3-------C2\r\n        |        \\     /  \\      /   <--x\r\n        |   w-->  \\   /   V2----V1\r\n        |          \\ /    /    /   <--z\r\n        |           C0---V0---C1\r\n        |           x--^    ^--y\r\n            */\r\n            patch.clear();\r\n            typename PatchT::VHandle C[6];\r\n            typename PatchT::VHandle V[4];\r\n            for (int i = 0; i < 6; ++i) C[i] = add_tagged_vertex(patch, i, true );\r\n            for (int i = 0; i < 4; ++i) V[i] = add_tagged_vertex(patch, i, false);\r\n        \r\n            patch.add_face(C[0], V[0], V[2], V[3]);\r\n            patch.add_face(C[1], V[1], V[2], V[0]);\r\n            patch.add_face(V[1], C[2], V[3], V[2]);\r\n            patch.add_face(C[2], C[3], C[4], V[3]);\r\n            patch.add_face(C[4], C[5], C[0], V[3]);\r\n        \r\n            auto h_insert_x = patch.halfedge_handle(V[0]);  // corresponds to V0-C0\r\n            for (int i = 0; i < param.x; ++i)\r\n                insert_edgeloop(patch, h_insert_x);\r\n            auto h_insert_y = patch.halfedge_handle(C[1]);  // corresponds to C1-V0\r\n            for (int i = 0; i < param.y; ++i)\r\n                insert_edgeloop(patch, h_insert_y);\r\n            auto h_insert_z = patch.halfedge_handle(V[1]);  // corresponds to V1-C1\r\n            for (int i = 0; i < param.z; ++i)\r\n                insert_edgeloop(patch, h_insert_z);\r\n            auto h_insert_w = patch.halfedge_handle(C[3]);  // corresponds to C3-C2\r\n            for (int i = 0; i < param.w; ++i)\r\n                insert_edgeloop(patch, h_insert_w);\r\n        }\r\n        static VariableIndicators& get_variable_indicators() {\r\n            static VariableIndicators variable_indicators;\r\n            if (variable_indicators.empty()) {\r\n                variable_indicators.resize(4);\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::C0, PatchVertexTag::V0));       // for x\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::V3, PatchVertexTag::V2));\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::C2, PatchVertexTag::V1));\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::C1, PatchVertexTag::V0));       // for y\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::V1, PatchVertexTag::V2));\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::C2, PatchVertexTag::V3));\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::C3, PatchVertexTag::C4));\r\n                variable_indicators[2].push_back(std::make_pair(PatchVertexTag::C1, PatchVertexTag::V1));       // for z\r\n                variable_indicators[2].push_back(std::make_pair(PatchVertexTag::V0, PatchVertexTag::V2));\r\n                variable_indicators[2].push_back(std::make_pair(PatchVertexTag::C0, PatchVertexTag::V3));\r\n                variable_indicators[2].push_back(std::make_pair(PatchVertexTag::C5, PatchVertexTag::C4));\r\n                variable_indicators[3].push_back(std::make_pair(PatchVertexTag::C0, PatchVertexTag::C5));       // for w\r\n                variable_indicators[3].push_back(std::make_pair(PatchVertexTag::V3, PatchVertexTag::C4));\r\n                variable_indicators[3].push_back(std::make_pair(PatchVertexTag::C2, PatchVertexTag::C3));\r\n            }\r\n            return variable_indicators;\r\n        }\r\n        static std::string get_param_str(const PatchParam& param) {\r\n            std::stringstream ss;\r\n            ss << \"x=\" << param.x\r\n               << \"_y=\" << param.y\r\n               << \"_z=\" << param.z\r\n               << \"_w=\" << param.w;\r\n            return ss.str();\r\n        }\r\n    };\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/patchgen/Pattern_6_2.h",
    "content": "#pragma once\r\n#include \"Pattern.h\"\r\n#include \"ILP.h\"\r\n#include <kt84/eigen_def.h>\r\n#include <kt84/openmesh/edgeloop.h>\r\n#include <sstream>\r\n\r\n/*\r\nequation for pattern 2:\r\n  |0|     |1|     |0|     |0|     |0|     |1|     |0|     |0|   |3|    |2|    |1|   |l0|\r\n  |1|     |0|     |1|     |0|     |0|     |0|     |1|     |0|   |1|    |0|    |0|   |l1|\r\np0|0| + p1|1| + p2|0| + p3|1| + p4|0| + p5|0| + q0|0| + q3|1| + |1| + x|0| + y|0| = |l2|\r\n  |0|     |0|     |1|     |0|     |1|     |0|     |0|     |0|   |1|    |0|    |1|   |l3|\r\n  |0|     |0|     |0|     |1|     |0|     |1|     |0|     |1|   |1|    |0|    |0|   |l4|\r\n  |1|     |0|     |0|     |0|     |1|     |0|     |1|     |0|   |1|    |0|    |0|   |l5|\r\n*/\r\nnamespace patchgen {\r\n    template <>\r\n    struct Pattern<6, 2> {\r\n        static Eigen::MatrixXd& get_constraint_matrix() {\r\n            static Eigen::MatrixXd constraint_matrix;\r\n            if (constraint_matrix.size() == 0) {\r\n                constraint_matrix.resize(6, 10);\r\n                constraint_matrix << 0, 1, 0, 0, 0, 1, 0, 0, 2, 1,\r\n                                     1, 0, 1, 0, 0, 0, 1, 0, 0, 0,\r\n                                     0, 1, 0, 1, 0, 0, 0, 1, 0, 0,\r\n                                     0, 0, 1, 0, 1, 0, 0, 0, 0, 1,\r\n                                     0, 0, 0, 1, 0, 1, 0, 1, 0, 0,\r\n                                     1, 0, 0, 0, 1, 0, 1, 0, 0, 0;\r\n            }\r\n            return constraint_matrix;\r\n        }\r\n    \r\n        static Eigen::VectorXd get_constraint_rhs(const Eigen::VectorXi& l) {\r\n            return kt84::make_Vector6d(l[0] - 3,\r\n                                       l[1] - 1,\r\n                                       l[2] - 1,\r\n                                       l[3] - 1,\r\n                                       l[4] - 1,\r\n                                       l[5] - 1);\r\n        }\r\n    \r\n        static int& get_variable(PatchParam& param, int index) {\r\n            if (index < 6) return param.p[index];\r\n            if (index == 6) return param.q[0];\r\n            if (index == 7) return param.q[3];\r\n            if (index == 8) return param.x;\r\n            return param.y;\r\n        }\r\n\r\n        static bool get_default_parameter(const Eigen::VectorXi& l, PatchParam& param) {\r\n            auto& constraint_matrix = get_constraint_matrix();\r\n            const int num_variables = constraint_matrix.cols();\r\n            ILP ilp(num_variables);\r\n            ilp.add_constraint(constraint_matrix, EQ, get_constraint_rhs(l));\r\n        \r\n            // arbitrary constraints\r\n            // xmin\r\n            ilp.set_objective(kt84::make_Vector10d(0, 0, 0, 0, 0, 0, 0, 0, 1, 0), false);\r\n            if (!ilp.solve()) return false;\r\n            int xmin = ilp.get_variables()[8];\r\n            // xmax\r\n            ilp.refresh();\r\n            ilp.set_objective(kt84::make_Vector10d(0, 0, 0, 0, 0, 0, 0, 0, 1, 0), true);\r\n            if (!ilp.solve()) return false;\r\n            int xmax = ilp.get_variables()[8];\r\n            // xmid-1<=x<=xmid+1\r\n            ilp.refresh();\r\n            int xmid = (xmin + xmax) / 2;\r\n            ilp.add_constraint(kt84::make_Vector10d(0, 0, 0, 0, 0, 0, 0, 0, 1, 0), LE, xmid + 1);\r\n            ilp.add_constraint(kt84::make_Vector10d(0, 0, 0, 0, 0, 0, 0, 0, 1, 0), GE, xmid - 1);\r\n            // p0<=q0\r\n            ilp.add_constraint(kt84::make_Vector10d(1, 0, 0, 0, 0, 0, -1, 0, 0, 0), LE, 0);\r\n            // p3<=q3\r\n            ilp.add_constraint(kt84::make_Vector10d(0, 0, 0, 1, 0, 0, 0, -1, 0, 0), LE, 0);\r\n            // maximize p0+p1+p2+p3+p4+p5\r\n            ilp.set_objective(kt84::make_Vector10d(1, 1, 1, 1, 1, 1, 0, 0, 0, 0), true);\r\n            if (!ilp.solve()) return false;\r\n        \r\n            auto variables = ilp.get_variables();\r\n            for (int i = 0; i < num_variables; ++i)\r\n                get_variable(param, i) = variables[i];\r\n        \r\n            param.pattern_id = 2;\r\n            return true;\r\n        }\r\n        template <typename PatchT>\r\n        static void generate_subtopology(const PatchParam& param, PatchT& patch) {\r\n            /*\r\n        |                      v--y              \r\n        |            C4-----------------C3       \r\n        |           / \\                 / \\      \r\n        |   q3-->  /   \\               /   \\  <--q3   \r\n        |         /     \\             /     \\    \r\n        |        /       \\           /       \\   \r\n        |      C5         \\         /         C2 \r\n        |       \\         V4-------V5         /  \r\n        |        \\       / \\       / \\       /   \r\n        |         \\     /   \\     /   \\     /    \r\n        |   q0-->  \\   /    V2---V3    \\   /  <--q0\r\n        |           \\ /      |   |      \\ /      \r\n        |           C0------V0---V1------C1      \r\n        |             x--^     ^--y   ^--x\r\n            */\r\n            patch.clear();\r\n            typename PatchT::VHandle C[6];\r\n            typename PatchT::VHandle V[6];\r\n            for (int i = 0; i < 6; ++i) C[i] = add_tagged_vertex(patch, i, true );\r\n            for (int i = 0; i < 6; ++i) V[i] = add_tagged_vertex(patch, i, false);\r\n        \r\n            patch.add_face(C[0], V[0], V[2], V[4]);\r\n            patch.add_face(V[0], V[1], V[3], V[2]);\r\n            patch.add_face(V[1], C[1], V[5], V[3]);\r\n            patch.add_face(C[1], C[2], C[3], V[5]);\r\n            patch.add_face(C[3], C[4], V[4], V[5]);\r\n            patch.add_face(C[4], C[5], C[0], V[4]);\r\n            patch.add_face(V[2], V[3], V[5], V[4]);\r\n        \r\n            auto h_insert_x = patch.halfedge_handle(V[0]);  // corresponds to V0-C0\r\n            for (int i = 0; i < param.x; ++i)\r\n                insert_edgeloop(patch, h_insert_x);\r\n            auto h_insert_y = patch.halfedge_handle(V[1]);  // corresponds to V1-V0\r\n            for (int i = 0; i < param.y; ++i)\r\n                insert_edgeloop(patch, h_insert_y);\r\n            auto h_insert_q0 = patch.halfedge_handle(C[0]);  // corresponds to C0-C5\r\n            for (int i = 0; i < param.q[0]; ++i)\r\n                insert_edgeloop(patch, h_insert_q0);\r\n            auto h_insert_q3 = patch.halfedge_handle(C[3]);  // corresponds to C3-C2\r\n            for (int i = 0; i < param.q[3]; ++i)\r\n                insert_edgeloop(patch, h_insert_q3);\r\n        }\r\n        static VariableIndicators& get_variable_indicators() {\r\n            static VariableIndicators variable_indicators;\r\n            if (variable_indicators.empty()) {\r\n                variable_indicators.resize(4);\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::C0, PatchVertexTag::C5));       // for q0\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::V4, PatchVertexTag::C4));\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::V5, PatchVertexTag::C3));\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::C1, PatchVertexTag::C2));\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::C4, PatchVertexTag::C5));       // for q3\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::V4, PatchVertexTag::C0));\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::V2, PatchVertexTag::V0));\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::V3, PatchVertexTag::V1));\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::V5, PatchVertexTag::C1));\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::C3, PatchVertexTag::C2));\r\n                variable_indicators[2].push_back(std::make_pair(PatchVertexTag::C0, PatchVertexTag::V0));       // for x\r\n                variable_indicators[2].push_back(std::make_pair(PatchVertexTag::V4, PatchVertexTag::V2));\r\n                variable_indicators[2].push_back(std::make_pair(PatchVertexTag::V5, PatchVertexTag::V3));\r\n                variable_indicators[2].push_back(std::make_pair(PatchVertexTag::C1, PatchVertexTag::V1));\r\n                variable_indicators[3].push_back(std::make_pair(PatchVertexTag::V0, PatchVertexTag::V1));       // for y\r\n                variable_indicators[3].push_back(std::make_pair(PatchVertexTag::V2, PatchVertexTag::V3));\r\n                variable_indicators[3].push_back(std::make_pair(PatchVertexTag::V4, PatchVertexTag::V5));\r\n                variable_indicators[3].push_back(std::make_pair(PatchVertexTag::C4, PatchVertexTag::C3));\r\n            }\r\n            return variable_indicators;\r\n        }\r\n        static std::string get_param_str(const PatchParam& param) {\r\n            std::stringstream ss;\r\n            ss << \"q0=\" << param.q[0]\r\n               << \"_q3=\" << param.q[3]\r\n               << \"_x=\" << param.x\r\n               << \"_y=\" << param.y;\r\n            return ss.str();\r\n        }\r\n    };\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/patchgen/Pattern_6_3.h",
    "content": "#pragma once\r\n#include \"Pattern.h\"\r\n#include \"ILP.h\"\r\n#include <kt84/eigen_def.h>\r\n#include <kt84/openmesh/edgeloop.h>\r\n#include <sstream>\r\n\r\n/*\r\nequation for pattern 3:\r\n  |0|     |1|     |0|     |0|     |0|     |1|     |0|   |4|    |2|    |1|    |1|   |l0|\r\n  |1|     |0|     |1|     |0|     |0|     |0|     |0|   |2|    |0|    |1|    |0|   |l1|\r\np0|0| + p1|1| + p2|0| + p3|1| + p4|0| + p5|0| + q3|1| + |1| + x|0| + y|0| + z|0| = |l2|\r\n  |0|     |0|     |1|     |0|     |1|     |0|     |0|   |1|    |0|    |0|    |1|   |l3|\r\n  |0|     |0|     |0|     |1|     |0|     |1|     |1|   |1|    |0|    |0|    |0|   |l4|\r\n  |1|     |0|     |0|     |0|     |1|     |0|     |0|   |1|    |0|    |0|    |0|   |l5|\r\n*/\r\nnamespace patchgen {\r\n    template <>\r\n    struct Pattern<6, 3> {\r\n        static Eigen::MatrixXd& get_constraint_matrix() {\r\n            static Eigen::MatrixXd constraint_matrix;\r\n            if (constraint_matrix.size() == 0) {\r\n                constraint_matrix.resize(6, 10);\r\n                constraint_matrix << 0, 1, 0, 0, 0, 1, 0, 2, 1, 1,\r\n                                     1, 0, 1, 0, 0, 0, 0, 0, 1, 0,\r\n                                     0, 1, 0, 1, 0, 0, 1, 0, 0, 0,\r\n                                     0, 0, 1, 0, 1, 0, 0, 0, 0, 1,\r\n                                     0, 0, 0, 1, 0, 1, 1, 0, 0, 0,\r\n                                     1, 0, 0, 0, 1, 0, 0, 0, 0, 0;\r\n            }\r\n            return constraint_matrix;\r\n        }\r\n    \r\n        static Eigen::VectorXd get_constraint_rhs(const Eigen::VectorXi& l) {\r\n            return kt84::make_Vector6d(l[0] - 4,\r\n                                       l[1] - 2,\r\n                                       l[2] - 1,\r\n                                       l[3] - 1,\r\n                                       l[4] - 1,\r\n                                       l[5] - 1);\r\n        }\r\n    \r\n        static int& get_variable(PatchParam& param, int index) {\r\n            if (index < 6) return param.p[index];\r\n            if (index == 6) return param.q[3];\r\n            if (index == 7) return param.x;\r\n            if (index == 8) return param.y;\r\n            return param.z;\r\n        }\r\n\r\n        static bool get_default_parameter(const Eigen::VectorXi& l, PatchParam& param) {\r\n            auto& constraint_matrix = get_constraint_matrix();\r\n            const int num_variables = constraint_matrix.cols();\r\n            ILP ilp(num_variables);\r\n            ilp.add_constraint(constraint_matrix, EQ, get_constraint_rhs(l));\r\n        \r\n            // arbitrary constraints\r\n            // xmin\r\n            ilp.set_objective(kt84::make_Vector10d(0, 0, 0, 0, 0, 0, 0, 1, 0, 0), false);\r\n            if (!ilp.solve()) return false;\r\n            int xmin = ilp.get_variables()[7];\r\n            // xmax\r\n            ilp.refresh();\r\n            ilp.set_objective(kt84::make_Vector10d(0, 0, 0, 0, 0, 0, 0, 1, 0, 0), true);\r\n            if (!ilp.solve()) return false;\r\n            int xmax = ilp.get_variables()[7];\r\n            // xmid-1<=x<=xmid+1\r\n            ilp.refresh();\r\n            int xmid = (xmin + xmax) / 2;\r\n            ilp.add_constraint(kt84::make_Vector10d(0, 0, 0, 0, 0, 0, 0, 1, 0, 0), LE, xmid + 1);\r\n            ilp.add_constraint(kt84::make_Vector10d(0, 0, 0, 0, 0, 0, 0, 1, 0, 0), GE, xmid - 1);\r\n            // maximize p0+p1+p2+p3+p4+p5\r\n            ilp.set_objective(kt84::make_Vector10d(1, 1, 1, 1, 1, 1, 0, 0, 0, 0), true);\r\n            if (!ilp.solve()) return false;\r\n        \r\n            auto variables = ilp.get_variables();\r\n            for (int i = 0; i < num_variables; ++i)\r\n                get_variable(param, i) = variables[i];\r\n        \r\n            param.pattern_id = 3;\r\n            return true;\r\n        }\r\n        template <typename PatchT>\r\n        static void generate_subtopology(const PatchParam& param, PatchT& patch) {\r\n            /*\r\n        |                    v--z                  \r\n        |            C4------------C3              \r\n        |           /  \\          /  \\             \r\n        |          /    \\        /    \\            \r\n        |  q3-->  /      \\      /      \\    <--q3\r\n        |        /        V7--V8        \\          \r\n        |       /        /     |         \\         \r\n        |      /        /      |          \\        \r\n        |     /        /       |           \\       \r\n        |   C5--------V6-------V5----------C2      \r\n        |    \\         |      /  \\        /        \r\n        |     \\        |     /    \\      /  <--y\r\n        |      \\       |     |     V4---V3         \r\n        |       \\      |     /    /    /           \r\n        |        \\     |    /    /    /            \r\n        |        C0---V0---V1---V2---C1            \r\n        |        x--^    A   ^--y  ^--x\r\n        |                |                         \r\n        |                z                         \r\n            */\r\n            patch.clear();\r\n            typename PatchT::VHandle C[6];\r\n            typename PatchT::VHandle V[9];\r\n            for (int i = 0; i < 6; ++i) C[i] = add_tagged_vertex(patch, i, true );\r\n            for (int i = 0; i < 9; ++i) V[i] = add_tagged_vertex(patch, i, false);\r\n        \r\n            patch.add_face(C[0], V[0], V[6], C[5]);\r\n            patch.add_face(V[0], V[1], V[5], V[6]);\r\n            patch.add_face(V[1], V[2], V[4], V[5]);\r\n            patch.add_face(V[2], C[1], V[3], V[4]);\r\n            patch.add_face(V[3], C[2], V[5], V[4]);\r\n            patch.add_face(C[2], C[3], V[8], V[5]);\r\n            patch.add_face(C[3], C[4], V[7], V[8]);\r\n            patch.add_face(C[4], C[5], V[6], V[7]);\r\n            patch.add_face(V[5], V[8], V[7], V[6]);\r\n        \r\n            auto h_insert_x = patch.halfedge_handle(V[0]);  // corresponds to V0-C0\r\n            for (int i = 0; i < param.x; ++i)\r\n                insert_edgeloop(patch, h_insert_x);\r\n            auto h_insert_y = patch.halfedge_handle(V[2]);  // corresponds to V2-V1\r\n            for (int i = 0; i < param.y; ++i)\r\n                insert_edgeloop(patch, h_insert_y);\r\n            auto h_insert_z = patch.halfedge_handle(V[1]);  // corresponds to V1-V0\r\n            for (int i = 0; i < param.z; ++i)\r\n                insert_edgeloop(patch, h_insert_z);\r\n            auto h_insert_q3 = patch.halfedge_handle(C[3]);  // corresponds to C3-C2\r\n            for (int i = 0; i < param.q[3]; ++i)\r\n                insert_edgeloop(patch, h_insert_q3);\r\n        }\r\n        static VariableIndicators& get_variable_indicators() {\r\n            static VariableIndicators variable_indicators;\r\n            if (variable_indicators.empty()) {\r\n                variable_indicators.resize(4);\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::C4, PatchVertexTag::C5));       // for q3\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::V7, PatchVertexTag::V6));\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::V8, PatchVertexTag::V5));\r\n                variable_indicators[0].push_back(std::make_pair(PatchVertexTag::C3, PatchVertexTag::C2));\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::C0, PatchVertexTag::V0));       // for x\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::C5, PatchVertexTag::V6));\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::C4, PatchVertexTag::V7));\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::C3, PatchVertexTag::V8));\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::C2, PatchVertexTag::V5));\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::V3, PatchVertexTag::V4));\r\n                variable_indicators[1].push_back(std::make_pair(PatchVertexTag::C1, PatchVertexTag::V2));\r\n                variable_indicators[2].push_back(std::make_pair(PatchVertexTag::V1, PatchVertexTag::V2));       // for y\r\n                variable_indicators[2].push_back(std::make_pair(PatchVertexTag::V5, PatchVertexTag::V4));\r\n                variable_indicators[2].push_back(std::make_pair(PatchVertexTag::C2, PatchVertexTag::V3));\r\n                variable_indicators[3].push_back(std::make_pair(PatchVertexTag::V0, PatchVertexTag::V1));       // for z\r\n                variable_indicators[3].push_back(std::make_pair(PatchVertexTag::V6, PatchVertexTag::V5));\r\n                variable_indicators[3].push_back(std::make_pair(PatchVertexTag::V7, PatchVertexTag::V8));\r\n                variable_indicators[3].push_back(std::make_pair(PatchVertexTag::C4, PatchVertexTag::C3));\r\n            }\r\n            return variable_indicators;\r\n        }\r\n        static std::string get_param_str(const PatchParam& param) {\r\n            std::stringstream ss;\r\n            ss << \"q3=\" << param.q[3]\r\n               << \"_x=\" << param.x\r\n               << \"_y=\" << param.y\r\n               << \"_z=\" << param.z;\r\n            return ss.str();\r\n        }\r\n    };\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/patchgen/Pattern_all.h",
    "content": "#pragma once\r\n#include \"Pattern_2_0.h\"\r\n#include \"Pattern_2_1.h\"\r\n#include \"Pattern_3_0.h\"\r\n#include \"Pattern_3_1.h\"\r\n#include \"Pattern_3_2.h\"\r\n#include \"Pattern_3_3.h\"\r\n#include \"Pattern_4_0.h\"\r\n#include \"Pattern_4_1.h\"\r\n#include \"Pattern_4_2.h\"\r\n#include \"Pattern_4_3.h\"\r\n#include \"Pattern_4_4.h\"\r\n#include \"Pattern_5_0.h\"\r\n#include \"Pattern_5_1.h\"\r\n#include \"Pattern_5_2.h\"\r\n#include \"Pattern_5_3.h\"\r\n#include \"Pattern_5_4.h\"\r\n#include \"Pattern_6_0.h\"\r\n#include \"Pattern_6_1.h\"\r\n#include \"Pattern_6_2.h\"\r\n#include \"Pattern_6_3.h\"\r\n\r\nnamespace patchgen {\r\n    const int num_patterns[7] = {\r\n        0,\r\n        0,\r\n        2,\r\n        4,\r\n        5,\r\n        5,\r\n        4,\r\n    };\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/patchgen/Permutation.h",
    "content": "#pragma once\r\n#include <Eigen/Core>\r\n\r\nnamespace patchgen {\r\n\r\n    struct Permutation {\r\n        int num_sides;  // number of sides\r\n        int id;         // 0 <= id <=   num_sides-1 : permutation with original order and offset id\r\n        // n <= id <= 2*num_sides-1 : permutation with reversed order and offset id-num_sides\r\n\r\n        Permutation() {\r\n            init(0);\r\n        }\r\n        void init(int num_sides_, int id_ = 0) {\r\n            num_sides = num_sides_;\r\n            id = id_;\r\n        }\r\n        bool is_flipped() const {\r\n            return id >= num_sides;\r\n        }\r\n        bool operator==(const Permutation& rhs) const {\r\n            return num_sides == rhs.num_sides && id == rhs.id;\r\n        }\r\n        // loop utility\r\n        void next(bool is_forward = true) {\r\n            id += is_forward ? 1 : -1;\r\n        }\r\n        bool is_valid() const {\r\n            return 0 <= id && id < 2 * num_sides;\r\n        }\r\n        // accessor\r\n        int operator[](int index) const {\r\n            return id < num_sides ? ((index + id) % num_sides)\r\n                : (num_sides - 1 - (index + id - num_sides) % num_sides);\r\n        }\r\n        Eigen::VectorXi operator()(const Eigen::VectorXi& l) const {\r\n            Eigen::VectorXi l_permuted(num_sides);\r\n            for (int i = 0; i < num_sides; ++i)\r\n                l_permuted[i] = l[this->operator[](i)];\r\n            return l_permuted;\r\n        }\r\n    };\r\n\r\n}"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/patchgen/add_padding.h",
    "content": "#pragma once\r\n#include \"decl.h\"\r\n#include <kt84/openmesh/append_quad_strip.h>\r\n\r\ntemplate <typename PatchT>\r\nvoid patchgen::add_padding(PatchT& patch, const PatchParam& param) {\r\n    const int num_sides = param.get_num_sides();\r\n    // IMPORTANT NOTE: boundary halfedges are oriented CLOCKWISE!\r\n    typename PatchT::HHandle h_boundary_front;\r\n    for (auto v : patch.vertices()) {\r\n        if (patch.data(v).patchgen.corner_index == 0) {\r\n            h_boundary_front = patch.halfedge_handle(v);\r\n            break;\r\n        }\r\n    }\r\n\r\n    for (int i = num_sides - 1; i >= 0; --i) {\r\n        auto h_boundary_back = h_boundary_front;\r\n        while (patch.data(patch.to_vertex_handle(h_boundary_back)).patchgen.corner_index == -1)\r\n            h_boundary_back = patch.next_halfedge_handle(h_boundary_back);\r\n\r\n        for (int j = 0; j < param.p[i]; ++j) {\r\n            // clear corner flag for current corner vertices\r\n            patch.data(patch.from_vertex_handle(h_boundary_front)).patchgen.corner_index = -1;\r\n            patch.data(patch.to_vertex_handle  (h_boundary_back )).patchgen.corner_index = -1;\r\n\r\n            kt84::append_quad_strip(patch, h_boundary_front, h_boundary_back);\r\n\r\n            // set corner flag for new corner vertices\r\n            patch.data(patch.from_vertex_handle(h_boundary_front)).patchgen.corner_index = (i + 1) % num_sides;\r\n            patch.data(patch.to_vertex_handle  (h_boundary_back )).patchgen.corner_index = i;\r\n        }\r\n\r\n        // go to next (clockwise) side\r\n        h_boundary_front = patch.next_halfedge_handle(h_boundary_back);\r\n    }\r\n    assert(patch.data(patch.from_vertex_handle(h_boundary_front)).patchgen.corner_index == 0);\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/patchgen/adjust_parameter.cpp",
    "content": "#include \"decl.h\"\r\n#include \"ILP.h\"\r\n\r\nbool patchgen::adjust_parameter(PatchParam& param, int variable_index, bool is_increase) {\r\n    // goal: increase/decrease specified variable with minimal change to the rest\r\n    // let: v[i]:=actual variables sought, u[i]:=older vaiables, w[i]:=abs(v[i]-u[i])\r\n    // objective: minimize sum { w[i] }\r\n    int num_sides = param.get_num_sides();\r\n\r\n    Eigen::MatrixXd A = get_constraint_matrix(num_sides, param.pattern_id);\r\n    Eigen::VectorXd b = get_constraint_rhs(num_sides, param.pattern_id, param.get_l_permuted());\r\n    int num_variables = A.cols();\r\n    int num_variables_2 = num_variables * 2;\r\n\r\n    auto get_variable = [&](PatchParam& param, int index) -> int& {\r\n        return patchgen::get_variable(num_sides, param.pattern_id, param, index);\r\n    };\r\n        \r\n    // auxiliary variables to handle objective of this form:  minimize { abs(x) + abs(y) + ... }\r\n    // actual variables:    v[0], ..., v[n-1]                        n: num_variables\r\n    // auxiliary variables: w[0], ..., w[n-1]\r\n    // appended: v[0], ..., v[n-1], w[0], ..., w[n-1]\r\n    A.conservativeResize(num_sides, num_variables_2);\r\n    A.rightCols(num_variables).setZero();\r\n    ILP ilp(num_variables_2);\r\n\r\n    // basic constraints\r\n    ilp.add_constraint(A, EQ, b);\r\n\r\n    // constrain the target variable to be increased/decreased\r\n    ilp.add_constraint(Eigen::VectorXd::Unit(num_variables_2, variable_index), is_increase ? GE : LE, get_variable(param, variable_index) + (is_increase ? 1 : -1));\r\n\r\n    // constraints for auxiliary variables\r\n    for (int i = 0; i < num_variables; ++i) {\r\n        Eigen::VectorXd row_constr = Eigen::VectorXd::Zero(num_variables_2);\r\n        row_constr[num_variables + i] = -1;\r\n        int old_value = get_variable(param, i);\r\n\r\n        row_constr[i] =  1;    ilp.add_constraint(row_constr, LE, old_value);      // constraint:   v[i]-u[i]  <= w[i]\r\n        row_constr[i] = -1;    ilp.add_constraint(row_constr, LE, -old_value);      // constraint: -(v[i]-u[i]) <= w[i]\r\n    }\r\n\r\n    // objective\r\n    Eigen::VectorXd row_obj(num_variables_2);\r\n    row_obj << Eigen::VectorXd::Zero(num_variables), Eigen::VectorXd::Ones(num_variables);\r\n    ilp.set_objective(row_obj, false);\r\n\r\n    if (!ilp.solve()) return false;\r\n\r\n    auto variables = ilp.get_variables();\r\n    for (int i = 0; i < num_variables; ++i)\r\n        get_variable(param, i) = variables[i];\r\n\r\n    return true;\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/patchgen/decl.h",
    "content": "#pragma once\r\n#include \"Pattern.h\"\r\n\r\nnamespace patchgen {\r\n    // generate topology according to the input pattern parameter\r\n    template <typename PatchT>\r\n    void generate_topology(const PatchParam& param, PatchT& patch);\r\n    \r\n    // compute a default pattern parameter from the input l, then generate topology accordingly\r\n    template <typename PatchT>\r\n    void generate_topology(const Eigen::VectorXi& l, PatchParam& param, PatchT& patch);\r\n    \r\n    // generate an intermediate mesh (after edge loops insertion, before padding)\r\n    template <typename PatchT>\r\n    void generate_subtopology(int num_sides, int pattern_id, const PatchParam& param, PatchT& patch);\r\n    \r\n    template <typename PatchT>\r\n    void add_padding(PatchT& patch, const PatchParam& param);\r\n    \r\n    Eigen::MatrixXd& get_constraint_matrix(int num_sides, int pattern_id);\r\n    inline int get_num_variables(int num_sides, int pattern_id) {\r\n        return get_constraint_matrix(num_sides, pattern_id).cols();\r\n    }\r\n    \r\n    Eigen::VectorXd get_constraint_rhs(int num_sides, int pattern_id, const Eigen::VectorXi& l);\r\n    \r\n    int& get_variable(int num_sides, int pattern_id, PatchParam& param, int index);\r\n    \r\n    PatchParam get_default_parameter(const Eigen::VectorXi& l);\r\n    \r\n    VariableIndicators& get_variable_indicators(int num_sides, int pattern_id);\r\n    \r\n    std::string get_param_str(int num_sides, int pattern_id, const PatchParam& param);\r\n    \r\n    bool adjust_parameter(PatchParam& param, int variable_index, bool is_increase);\r\n    \r\n    bool switch_pattern(PatchParam& param, bool is_forward);\r\n    \r\n    Eigen::Vector2d get_boundary_geometry(int num_sides, double t);\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/patchgen/generate_subtopology.h",
    "content": "#pragma once\r\n#include \"decl.h\"\r\n#include \"Pattern_all.h\"\r\n\r\ntemplate <typename PatchT>\r\nvoid patchgen::generate_subtopology(int num_sides, int pattern_id, const PatchParam& param, PatchT& patch) {\r\n    typedef void (*func_type)(const PatchParam& param, PatchT& patch);\r\n    static const func_type func_table_2[2] = {\r\n        Pattern<2, 0>::generate_subtopology,\r\n        Pattern<2, 1>::generate_subtopology\r\n    };\r\n    static const func_type func_table_3[4] = {\r\n        Pattern<3, 0>::generate_subtopology,\r\n        Pattern<3, 1>::generate_subtopology,\r\n        Pattern<3, 2>::generate_subtopology,\r\n        Pattern<3, 3>::generate_subtopology,\r\n    };\r\n    static const func_type func_table_4[5] = {\r\n        Pattern<4, 0>::generate_subtopology,\r\n        Pattern<4, 1>::generate_subtopology,\r\n        Pattern<4, 2>::generate_subtopology,\r\n        Pattern<4, 3>::generate_subtopology,\r\n        Pattern<4, 4>::generate_subtopology\r\n    };\r\n    static const func_type func_table_5[5] = {\r\n        Pattern<5, 0>::generate_subtopology,\r\n        Pattern<5, 1>::generate_subtopology,\r\n        Pattern<5, 2>::generate_subtopology,\r\n        Pattern<5, 3>::generate_subtopology,\r\n        Pattern<5, 4>::generate_subtopology,\r\n    };\r\n    static const func_type func_table_6[4] = {\r\n        Pattern<6, 0>::generate_subtopology,\r\n        Pattern<6, 1>::generate_subtopology,\r\n        Pattern<6, 2>::generate_subtopology,\r\n        Pattern<6, 3>::generate_subtopology,\r\n    };\r\n    static const func_type* func_table[7] = {\r\n        nullptr,\r\n        nullptr,\r\n        func_table_2,\r\n        func_table_3,\r\n        func_table_4,\r\n        func_table_5,\r\n        func_table_6,\r\n    };\r\n    func_table[num_sides][pattern_id](param, patch);\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/patchgen/generate_topology.h",
    "content": "#include \"Pattern.h\"\r\n#include \"decl.h\"\r\n#include \"add_padding.h\"\r\n#include \"generate_subtopology.h\"\r\n#include <kt84/util.h>\r\n#include <kt84/openmesh/flip_faces.h>\r\n\r\ntemplate <typename PatchT>\r\nvoid patchgen::generate_topology(const PatchParam& param, PatchT& patch) {\r\n    int num_sides = param.get_num_sides();\r\n#ifdef PATTERN_VERBOSE\r\n    std::cout << \"pattern=\" << param.pattern_id;\r\n#endif\r\n#ifdef PATTERN_VERBOSE\r\n    std::string param_str = get_param_str(num_sides, param.pattern_id, param);\r\n    if (!param_str.empty())\r\n        std::cout << \", param=\" << param_str;\r\n    std::cout << \"\\n\";\r\n#endif\r\n\r\n    // generate topology\r\n    generate_subtopology(num_sides, param.pattern_id, param, patch);\r\n        \r\n    add_padding(patch, param);\r\n\r\n    // reordering corner index, flip faces\r\n    for (auto v : patch.vertices()) {\r\n        int& corner_index = patch.data(v).patchgen.corner_index;\r\n        if (corner_index == -1) continue;\r\n        corner_index = param.permutation[corner_index];\r\n        if (param.permutation.is_flipped()) corner_index = (corner_index + 1) % num_sides;      // Be careful!\r\n    }\r\n    if (param.permutation.is_flipped())\r\n        kt84::flip_faces(patch);\r\n}\r\n\r\ntemplate <typename PatchT>\r\nvoid patchgen::generate_topology(const Eigen::VectorXi& l, PatchParam& param, PatchT& patch) {\r\n#ifdef PATTERN_VERBOSE\r\n    int num_sides = l.size();\r\n    std::cout << \"input=[\";\r\n    for (int i = 0; i < num_sides; ++i)\r\n        std::cout << \" \" << l[i];\r\n    std::cout << \" ]\\n\";\r\n#endif\r\n\r\n    param = get_default_parameter(l);\r\n#ifdef PATTERN_VERBOSE\r\n    std::cout << \"\\n\";\r\n#endif\r\n\r\n    generate_topology(param, patch);\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/patchgen/get_boundary_geometry.cpp",
    "content": "#include \"decl.h\"\r\nusing namespace std;\r\nusing namespace Eigen;\r\n\r\nVector2d patchgen::get_boundary_geometry(int num_sides, double t) {\r\n    const double pi = 3.1415926535897932384626433832795;\r\n\r\n    if (num_sides == 1) {\r\n        double theta = t * 2 * pi;\r\n        return Vector2d(cos(theta), sin(theta));            // I don't know what shape is expected here.\r\n    }\r\n\r\n    if (num_sides == 2) {\r\n        if (t < 1) {\r\n            // left to right\r\n            double theta = (2 * t - 1) * 3.14159 / 3;\r\n            return Vector2d(sin(theta), -cos(theta) + 0.5);\r\n        } else {\r\n            t -= 1;\r\n            // right to left\r\n            double theta = (2 * t - 1) * 3.14159 / 3;\r\n            return Vector2d(-sin(theta), cos(theta) - 0.5);\r\n        }\r\n    }\r\n\r\n    double side_angle = 2 * pi / num_sides;\r\n    vector<Vector2d> corners(num_sides);\r\n    for (int i = 0; i < num_sides; ++i) {\r\n        double theta = side_angle * i;\r\n        // orient such that the first corner comes to the bottom left\r\n        theta -= 0.5 * pi + 0.5 * side_angle;\r\n        corners[i] << cos(theta), sin(theta);\r\n    }\r\n\r\n    if (t == num_sides) return corners[0];\r\n\r\n    int i1 = static_cast<int>(t);\r\n    int i2 = (i1 + 1) % num_sides;\r\n    double s = t - i1;\r\n    return (1 - s) * corners[i1] + s * corners[i2];\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/patchgen/get_constraint_matrix.cpp",
    "content": "#include \"decl.h\"\r\n#include \"Pattern_all.h\"\r\n\r\nEigen::MatrixXd& patchgen::get_constraint_matrix(int num_sides, int pattern_id) {\r\n    typedef Eigen::MatrixXd& (*func_type)();\r\n    static const func_type func_table_2[2] = {\r\n        Pattern<2, 0>::get_constraint_matrix,\r\n        Pattern<2, 1>::get_constraint_matrix,\r\n    };\r\n    static const func_type func_table_3[4] = {\r\n        Pattern<3, 0>::get_constraint_matrix,\r\n        Pattern<3, 1>::get_constraint_matrix,\r\n        Pattern<3, 2>::get_constraint_matrix,\r\n        Pattern<3, 3>::get_constraint_matrix,\r\n    };\r\n    static const func_type func_table_4[5] = {\r\n        Pattern<4, 0>::get_constraint_matrix,\r\n        Pattern<4, 1>::get_constraint_matrix,\r\n        Pattern<4, 2>::get_constraint_matrix,\r\n        Pattern<4, 3>::get_constraint_matrix,\r\n        Pattern<4, 4>::get_constraint_matrix\r\n    };\r\n    static const func_type func_table_5[5] = {\r\n        Pattern<5, 0>::get_constraint_matrix,\r\n        Pattern<5, 1>::get_constraint_matrix,\r\n        Pattern<5, 2>::get_constraint_matrix,\r\n        Pattern<5, 3>::get_constraint_matrix,\r\n        Pattern<5, 4>::get_constraint_matrix,\r\n    };\r\n    static const func_type func_table_6[4] = {\r\n        Pattern<6, 0>::get_constraint_matrix,\r\n        Pattern<6, 1>::get_constraint_matrix,\r\n        Pattern<6, 2>::get_constraint_matrix,\r\n        Pattern<6, 3>::get_constraint_matrix,\r\n    };\r\n    static const func_type* func_table[7] = {\r\n        nullptr,\r\n        nullptr,\r\n        func_table_2,\r\n        func_table_3,\r\n        func_table_4,\r\n        func_table_5,\r\n        func_table_6,\r\n    };\r\n    return func_table[num_sides][pattern_id]();\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/patchgen/get_constraint_rhs.cpp",
    "content": "#include \"decl.h\"\r\n#include \"Pattern_all.h\"\r\n\r\nEigen::VectorXd patchgen::get_constraint_rhs(int num_sides, int pattern_id, const Eigen::VectorXi& l) {\r\n    typedef Eigen::VectorXd (*func_type)(const Eigen::VectorXi& l);\r\n    static const func_type func_table_2[2] = {\r\n        Pattern<2, 0>::get_constraint_rhs,\r\n        Pattern<2, 1>::get_constraint_rhs\r\n    };\r\n    static const func_type func_table_3[4] = {\r\n        Pattern<3, 0>::get_constraint_rhs,\r\n        Pattern<3, 1>::get_constraint_rhs,\r\n        Pattern<3, 2>::get_constraint_rhs,\r\n        Pattern<3, 3>::get_constraint_rhs,\r\n    };\r\n    static const func_type func_table_4[5] = {\r\n        Pattern<4, 0>::get_constraint_rhs,\r\n        Pattern<4, 1>::get_constraint_rhs,\r\n        Pattern<4, 2>::get_constraint_rhs,\r\n        Pattern<4, 3>::get_constraint_rhs,\r\n        Pattern<4, 4>::get_constraint_rhs\r\n    };\r\n    static const func_type func_table_5[5] = {\r\n        Pattern<5, 0>::get_constraint_rhs,\r\n        Pattern<5, 1>::get_constraint_rhs,\r\n        Pattern<5, 2>::get_constraint_rhs,\r\n        Pattern<5, 3>::get_constraint_rhs,\r\n        Pattern<5, 4>::get_constraint_rhs,\r\n    };\r\n    static const func_type func_table_6[4] = {\r\n        Pattern<6, 0>::get_constraint_rhs,\r\n        Pattern<6, 1>::get_constraint_rhs,\r\n        Pattern<6, 2>::get_constraint_rhs,\r\n        Pattern<6, 3>::get_constraint_rhs,\r\n    };\r\n    static const func_type* func_table[7] = {\r\n        nullptr,\r\n        nullptr,\r\n        func_table_2,\r\n        func_table_3,\r\n        func_table_4,\r\n        func_table_5,\r\n        func_table_6,\r\n    };\r\n    return func_table[num_sides][pattern_id](l);\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/patchgen/get_default_parameter.cpp",
    "content": "#include \"decl.h\"\r\n#include \"Pattern_all.h\"\r\n\r\nnamespace {\r\n    template <int NumSides, int PatternID>\r\n    bool get_default_parameter_sub(patchgen::PatchParam& param) {\r\n        for (param.permutation.init(NumSides); param.permutation.is_valid(); param.permutation.next())\r\n            if (patchgen::Pattern<NumSides, PatternID>::get_default_parameter(param.get_l_permuted(), param))\r\n                return true;\r\n        return false;\r\n    }\r\n}\r\n\r\npatchgen::PatchParam patchgen::get_default_parameter(const Eigen::VectorXi& l) {\r\n    int num_sides = l.size();\r\n\r\n    PatchParam param;\r\n    param.l = l;\r\n    param.p = param.q = Eigen::VectorXi::Constant(num_sides, -1);\r\n    if (num_sides == 2) {\r\n        if (get_default_parameter_sub<2, 0>(param)) return param;\r\n        if (get_default_parameter_sub<2, 1>(param)) return param;\r\n    } else if (num_sides == 3) {\r\n        if (get_default_parameter_sub<3, 0>(param)) return param;\r\n        if (get_default_parameter_sub<3, 1>(param)) return param;\r\n        if (get_default_parameter_sub<3, 2>(param)) return param;\r\n    } else if (num_sides == 4) {\r\n        if (get_default_parameter_sub<4, 0>(param)) return param;\r\n        if (get_default_parameter_sub<4, 1>(param)) return param;\r\n        if (get_default_parameter_sub<4, 2>(param)) return param;\r\n        if (get_default_parameter_sub<4, 3>(param)) return param;\r\n        if (get_default_parameter_sub<4, 4>(param)) return param;\r\n    } else if (num_sides == 5) {\r\n        if (get_default_parameter_sub<5, 0>(param)) return param;\r\n        if (get_default_parameter_sub<5, 1>(param)) return param;\r\n        if (get_default_parameter_sub<5, 2>(param)) return param;\r\n        if (get_default_parameter_sub<5, 3>(param)) return param;\r\n    } else if (num_sides == 6) {\r\n        if (get_default_parameter_sub<6, 0>(param)) return param;\r\n        if (get_default_parameter_sub<6, 1>(param)) return param;\r\n        if (get_default_parameter_sub<6, 2>(param)) return param;\r\n        if (get_default_parameter_sub<6, 3>(param)) return param;\r\n    }\r\n    \r\n    assert(false);\r\n    return {};\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/patchgen/get_param_str.cpp",
    "content": "#include \"decl.h\"\r\n#include \"Pattern_all.h\"\r\n\r\nstd::string patchgen::get_param_str(int num_sides, int pattern_id, const PatchParam& param) {\r\n    typedef std::string (*func_type)(const PatchParam& param);\r\n    static const func_type func_table_2[2] = {\r\n        Pattern<2, 0>::get_param_str,\r\n        Pattern<2, 1>::get_param_str\r\n    };\r\n    static const func_type func_table_3[4] = {\r\n        Pattern<3, 0>::get_param_str,\r\n        Pattern<3, 1>::get_param_str,\r\n        Pattern<3, 2>::get_param_str,\r\n        Pattern<3, 3>::get_param_str,\r\n    };\r\n    static const func_type func_table_4[5] = {\r\n        Pattern<4, 0>::get_param_str,\r\n        Pattern<4, 1>::get_param_str,\r\n        Pattern<4, 2>::get_param_str,\r\n        Pattern<4, 3>::get_param_str,\r\n        Pattern<4, 4>::get_param_str\r\n    };\r\n    static const func_type func_table_5[5] = {\r\n        Pattern<5, 0>::get_param_str,\r\n        Pattern<5, 1>::get_param_str,\r\n        Pattern<5, 2>::get_param_str,\r\n        Pattern<5, 3>::get_param_str,\r\n        Pattern<5, 4>::get_param_str,\r\n    };\r\n    static const func_type func_table_6[4] = {\r\n        Pattern<6, 0>::get_param_str,\r\n        Pattern<6, 1>::get_param_str,\r\n        Pattern<6, 2>::get_param_str,\r\n        Pattern<6, 3>::get_param_str,\r\n    };\r\n    static const func_type* func_table[7] = {\r\n        nullptr,\r\n        nullptr,\r\n        func_table_2,\r\n        func_table_3,\r\n        func_table_4,\r\n        func_table_5,\r\n        func_table_6,\r\n    };\r\n    return func_table[num_sides][pattern_id](param);\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/patchgen/get_variable.cpp",
    "content": "#include \"decl.h\"\r\n#include \"Pattern_all.h\"\r\n\r\nint& patchgen::get_variable(int num_sides, int pattern_id, PatchParam& param, int index) {\r\n    typedef int& (*func_type)(PatchParam& param, int index);\r\n    static const func_type func_table_2[2] = {\r\n        Pattern<2, 0>::get_variable,\r\n        Pattern<2, 1>::get_variable\r\n    };\r\n    static const func_type func_table_3[4] = {\r\n        Pattern<3, 0>::get_variable,\r\n        Pattern<3, 1>::get_variable,\r\n        Pattern<3, 2>::get_variable,\r\n        Pattern<3, 3>::get_variable,\r\n    };\r\n    static const func_type func_table_4[5] = {\r\n        Pattern<4, 0>::get_variable,\r\n        Pattern<4, 1>::get_variable,\r\n        Pattern<4, 2>::get_variable,\r\n        Pattern<4, 3>::get_variable,\r\n        Pattern<4, 4>::get_variable\r\n    };\r\n    static const func_type func_table_5[5] = {\r\n        Pattern<5, 0>::get_variable,\r\n        Pattern<5, 1>::get_variable,\r\n        Pattern<5, 2>::get_variable,\r\n        Pattern<5, 3>::get_variable,\r\n        Pattern<5, 4>::get_variable,\r\n    };\r\n    static const func_type func_table_6[4] = {\r\n        Pattern<6, 0>::get_variable,\r\n        Pattern<6, 1>::get_variable,\r\n        Pattern<6, 2>::get_variable,\r\n        Pattern<6, 3>::get_variable,\r\n    };\r\n    static const func_type* func_table[7] = {\r\n        nullptr,\r\n        nullptr,\r\n        func_table_2,\r\n        func_table_3,\r\n        func_table_4,\r\n        func_table_5,\r\n        func_table_6,\r\n    };\r\n    return func_table[num_sides][pattern_id](param, index);\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/patchgen/get_variable_indicators.cpp",
    "content": "#include \"decl.h\"\r\n#include \"Pattern_all.h\"\r\n\r\npatchgen::VariableIndicators& patchgen::get_variable_indicators(int num_sides, int pattern_id) {\r\n    typedef VariableIndicators& (*func_type)();\r\n    static const func_type func_table_2[2] = {\r\n        Pattern<2, 0>::get_variable_indicators,\r\n        Pattern<2, 1>::get_variable_indicators\r\n    };\r\n    static const func_type func_table_3[4] = {\r\n        Pattern<3, 0>::get_variable_indicators,\r\n        Pattern<3, 1>::get_variable_indicators,\r\n        Pattern<3, 2>::get_variable_indicators,\r\n        Pattern<3, 3>::get_variable_indicators,\r\n    };\r\n    static const func_type func_table_4[5] = {\r\n        Pattern<4, 0>::get_variable_indicators,\r\n        Pattern<4, 1>::get_variable_indicators,\r\n        Pattern<4, 2>::get_variable_indicators,\r\n        Pattern<4, 3>::get_variable_indicators,\r\n        Pattern<4, 4>::get_variable_indicators\r\n    };\r\n    static const func_type func_table_5[5] = {\r\n        Pattern<5, 0>::get_variable_indicators,\r\n        Pattern<5, 1>::get_variable_indicators,\r\n        Pattern<5, 2>::get_variable_indicators,\r\n        Pattern<5, 3>::get_variable_indicators,\r\n        Pattern<5, 4>::get_variable_indicators,\r\n    };\r\n    static const func_type func_table_6[4] = {\r\n        Pattern<6, 0>::get_variable_indicators,\r\n        Pattern<6, 1>::get_variable_indicators,\r\n        Pattern<6, 2>::get_variable_indicators,\r\n        Pattern<6, 3>::get_variable_indicators,\r\n    };\r\n    static const func_type* func_table[7] = {\r\n        nullptr,\r\n        nullptr,\r\n        func_table_2,\r\n        func_table_3,\r\n        func_table_4,\r\n        func_table_5,\r\n        func_table_6,\r\n    };\r\n    return func_table[num_sides][pattern_id]();\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns/patchgen/switch_pattern.cpp",
    "content": "#include \"decl.h\"\r\n#include \"Pattern_all.h\"\r\n#include <kt84/util.h>\r\n\r\nbool patchgen::switch_pattern(PatchParam& param, bool is_forward) {\r\n    const PatchParam param_old = param;\r\n    const int num_sides = param.get_num_sides();\r\n\r\n    for (param.permutation.next(is_forward);; param.permutation.next(is_forward)) {\r\n        if (!param.permutation.is_valid()) {\r\n            // permutation reached to end -> switch to next pattern, reset permutation\r\n            (is_forward ? kt84::util::incr_mod<int> : kt84::util::decr_mod<int>)(param.pattern_id, num_patterns[num_sides]);\r\n            param.permutation.init(num_sides, is_forward ? 0 : (2 * num_sides - 1));\r\n        }\r\n        if (param.pattern_id == param_old.pattern_id && param.permutation == param_old.permutation) {\r\n            // came back to the original param -> there's no other pattern to switch\r\n            param = param_old;\r\n            return false;\r\n        }\r\n        auto l_permuted = param.get_l_permuted();\r\n        if (num_sides == 2) {\r\n            if (param.pattern_id == 0 && Pattern<2, 0>::get_default_parameter(l_permuted, param)) return true;\r\n            if (param.pattern_id == 1 && Pattern<2, 1>::get_default_parameter(l_permuted, param)) return true;\r\n        } else if (num_sides == 3) {\r\n            if (param.pattern_id == 0 && Pattern<3, 0>::get_default_parameter(l_permuted, param)) return true;\r\n            if (param.pattern_id == 1 && Pattern<3, 1>::get_default_parameter(l_permuted, param)) return true;\r\n            if (param.pattern_id == 2 && Pattern<3, 2>::get_default_parameter(l_permuted, param)) return true;\r\n            if (param.pattern_id == 3 && Pattern<3, 3>::get_default_parameter(l_permuted, param)) return true;\r\n        } else if (num_sides == 4) {\r\n            if (param.pattern_id == 0 && Pattern<4, 0>::get_default_parameter(l_permuted, param)) return true;\r\n            if (param.pattern_id == 1 && Pattern<4, 1>::get_default_parameter(l_permuted, param)) return true;\r\n            if (param.pattern_id == 2 && Pattern<4, 2>::get_default_parameter(l_permuted, param)) return true;\r\n            if (param.pattern_id == 3 && Pattern<4, 3>::get_default_parameter(l_permuted, param)) return true;\r\n            if (param.pattern_id == 4 && Pattern<4, 4>::get_default_parameter(l_permuted, param)) return true;\r\n        } else if (num_sides == 5) {\r\n            if (param.pattern_id == 0 && Pattern<5, 0>::get_default_parameter(l_permuted, param)) return true;\r\n            if (param.pattern_id == 1 && Pattern<5, 1>::get_default_parameter(l_permuted, param)) return true;\r\n            if (param.pattern_id == 2 && Pattern<5, 2>::get_default_parameter(l_permuted, param)) return true;\r\n            if (param.pattern_id == 3 && Pattern<5, 3>::get_default_parameter(l_permuted, param)) return true;\r\n            if (param.pattern_id == 4 && Pattern<5, 4>::get_default_parameter(l_permuted, param)) return true;\r\n        } else if (num_sides == 6) {\r\n            if (param.pattern_id == 0 && Pattern<6, 0>::get_default_parameter(l_permuted, param)) return true;\r\n            if (param.pattern_id == 1 && Pattern<6, 1>::get_default_parameter(l_permuted, param)) return true;\r\n            if (param.pattern_id == 2 && Pattern<6, 2>::get_default_parameter(l_permuted, param)) return true;\r\n            if (param.pattern_id == 3 && Pattern<6, 3>::get_default_parameter(l_permuted, param)) return true;\r\n        }\r\n    }\r\n    assert(false);\r\n    return false;\r\n}\r\n"
  },
  {
    "path": "libs/quadretopology/patterns/patterns.pri",
    "content": "INCLUDEPATH += $$PWD\nINCLUDEPATH += $$PWD/patterns\n\nLPSOLVER_PATH = $$PWD/patterns/lp_solve_5.5\nOPENMESH_PATH = $$PWD/patterns/OpenMesh\nPATCHGEN_PATH = $$PWD/patterns/patchgen\nKT_PATH = $$PWD/patterns/kt84\n\n\n#Main files\nSOURCES += \\\n    $$PWD/patterns/Patch.cpp \\\n    $$PWD/patterns/determine_geometry.cpp \\\n    $$PWD/patterns/generate_patch.cpp\n\nHEADERS += \\\n    $$PWD/patterns/Patch.h \\\n    $$PWD/patterns/determine_geometry.h \\\n    $$PWD/patterns/generate_patch.h\n\n\n#LPSolver\nINCLUDEPATH += $$LPSOLVER_PATH\nINCLUDEPATH += $$LPSOLVER_PATH/bfp\nINCLUDEPATH += $$LPSOLVER_PATH/bfp/bfp_LUSOL\nINCLUDEPATH += $$LPSOLVER_PATH/bfp/bfp_LUSOL/LUSOL\nINCLUDEPATH += $$LPSOLVER_PATH/colamd\nINCLUDEPATH += $$LPSOLVER_PATH/shared\n\nDEFINES += LoadInverseLib=FALSE\nDEFINES += LoadLanguageLib=FALSE\nDEFINES += LoadableBlasLib=0\nDEFINES += INVERSE_ACTIVE=INVERSE_LUSOL\nDEFINES += RoleIsExternalInvEngine\nDEFINES += NOFORTIFY\nDEFINES += CHECK_SOLUTION\nDEFINES += YY_NEVER_INTERACTIVE\nDEFINES += PARSER_LP\nDEFINES += LP_MAXLINELEN=0\n\n\nSOURCES += \\\n    $$LPSOLVER_PATH/bfp/bfp_LUSOL/lp_LUSOL.c \\\n    $$LPSOLVER_PATH/bfp/bfp_LUSOL/LUSOL/lusol.c \\\n    $$LPSOLVER_PATH/colamd/colamd.c \\\n    $$LPSOLVER_PATH/fortify.c \\\n    $$LPSOLVER_PATH/ini.c \\\n    $$LPSOLVER_PATH/lp_Hash.c \\\n    $$LPSOLVER_PATH/lp_MDO.c \\\n    $$LPSOLVER_PATH/lp_MPS.c \\\n    $$LPSOLVER_PATH/lp_SOS.c \\\n    $$LPSOLVER_PATH/lp_crash.c \\\n    $$LPSOLVER_PATH/lp_lib.c \\\n    $$LPSOLVER_PATH/lp_matrix.c \\\n    $$LPSOLVER_PATH/lp_mipbb.c \\\n    $$LPSOLVER_PATH/lp_params.c \\\n    $$LPSOLVER_PATH/lp_presolve.c \\\n    $$LPSOLVER_PATH/lp_price.c \\\n    $$LPSOLVER_PATH/lp_pricePSE.c \\\n    $$LPSOLVER_PATH/lp_report.c \\\n    $$LPSOLVER_PATH/lp_rlp.c \\\n    $$LPSOLVER_PATH/lp_scale.c \\\n    $$LPSOLVER_PATH/lp_simplex.c \\\n    $$LPSOLVER_PATH/lp_utils.c \\\n    $$LPSOLVER_PATH/lp_wlp.c \\\n    $$LPSOLVER_PATH/shared/commonlib.c \\\n    $$LPSOLVER_PATH/shared/mmio.c \\\n    $$LPSOLVER_PATH/shared/myblas.c \\\n    $$LPSOLVER_PATH/yacc_read.c\nHEADERS += \\\n    $$LPSOLVER_PATH/colamd/colamd.h \\\n    $$LPSOLVER_PATH/declare.h \\\n    $$LPSOLVER_PATH/fortify.h \\\n    $$LPSOLVER_PATH/ini.h \\\n    $$LPSOLVER_PATH/lp_Hash.h \\\n    $$LPSOLVER_PATH/lp_MDO.h \\\n    $$LPSOLVER_PATH/lp_MPS.h \\\n    $$LPSOLVER_PATH/lp_SOS.h \\\n    $$LPSOLVER_PATH/lp_bit.h \\\n    $$LPSOLVER_PATH/lp_crash.h \\\n    $$LPSOLVER_PATH/lp_explicit.h \\\n    $$LPSOLVER_PATH/lp_fortify.h \\\n    $$LPSOLVER_PATH/lp_lib.h \\\n    $$LPSOLVER_PATH/lp_matrix.h \\\n    $$LPSOLVER_PATH/lp_mipbb.h \\\n    $$LPSOLVER_PATH/lp_presolve.h \\\n    $$LPSOLVER_PATH/lp_price.h \\\n    $$LPSOLVER_PATH/lp_pricePSE.h \\\n    $$LPSOLVER_PATH/lp_report.h \\\n    $$LPSOLVER_PATH/lp_rlp.h \\\n    $$LPSOLVER_PATH/lp_rlp.y \\\n    $$LPSOLVER_PATH/lp_scale.h \\\n    $$LPSOLVER_PATH/lp_simplex.h \\\n    $$LPSOLVER_PATH/lp_types.h \\\n    $$LPSOLVER_PATH/lp_utils.h \\\n    $$LPSOLVER_PATH/lp_wlp.h \\\n    $$LPSOLVER_PATH/lpkit.h \\\n    $$LPSOLVER_PATH/lpsolve.h \\\n    $$LPSOLVER_PATH/shared/commonlib.h \\\n    $$LPSOLVER_PATH/shared/mmio.h \\\n    $$LPSOLVER_PATH/shared/myblas.h \\\n    $$LPSOLVER_PATH/ufortify.h \\\n    $$LPSOLVER_PATH/yacc_read.h\n\n\n#OpenMesh\n#DEFINES += _USE_MATH_DEFINES\n#DEFINES += NOMINMAX\n\nSOURCES += \\\n    $$OPENMESH_PATH/Core/Geometry/NormalConeT.cc \\\n    $$OPENMESH_PATH/Core/IO/BinaryHelper.cc \\\n    $$OPENMESH_PATH/Core/IO/IOManager.cc \\\n    $$OPENMESH_PATH/Core/IO/OMFormat.cc \\\n    $$OPENMESH_PATH/Core/IO/OMFormatT.cc \\\n    $$OPENMESH_PATH/Core/IO/reader/BaseReader.cc \\\n    $$OPENMESH_PATH/Core/IO/reader/OBJReader.cc \\\n    $$OPENMESH_PATH/Core/IO/reader/OFFReader.cc \\\n    $$OPENMESH_PATH/Core/IO/reader/OMReader.cc \\\n    $$OPENMESH_PATH/Core/IO/reader/PLYReader.cc \\\n    $$OPENMESH_PATH/Core/IO/reader/STLReader.cc \\\n    $$OPENMESH_PATH/Core/IO/writer/BaseWriter.cc \\\n    $$OPENMESH_PATH/Core/IO/writer/OBJWriter.cc \\\n    $$OPENMESH_PATH/Core/IO/writer/OFFWriter.cc \\\n    $$OPENMESH_PATH/Core/IO/writer/OMWriter.cc \\\n    $$OPENMESH_PATH/Core/IO/writer/PLYWriter.cc \\\n    $$OPENMESH_PATH/Core/IO/writer/STLWriter.cc \\\n    $$OPENMESH_PATH/Core/IO/writer/VTKWriter.cc \\\n    $$OPENMESH_PATH/Core/Mesh/ArrayKernel.cc \\\n    $$OPENMESH_PATH/Core/Mesh/ArrayKernelT.cc \\\n    $$OPENMESH_PATH/Core/Mesh/BaseKernel.cc \\\n    $$OPENMESH_PATH/Core/Mesh/PolyConnectivity.cc \\\n    $$OPENMESH_PATH/Core/Mesh/PolyMeshT.cc \\\n    $$OPENMESH_PATH/Core/Mesh/TriConnectivity.cc \\\n    $$OPENMESH_PATH/Core/Mesh/TriMeshT.cc \\\n    $$OPENMESH_PATH/Core/System/omstream.cc \\\n    $$OPENMESH_PATH/Core/Utils/BaseProperty.cc \\\n    $$OPENMESH_PATH/Core/Utils/Endian.cc \\\n    $$OPENMESH_PATH/Core/Utils/RandomNumberGenerator.cc \\\n    $$OPENMESH_PATH/Core/Utils/SingletonT.cc\n\nHEADERS += \\\n    $$OPENMESH_PATH/Core/Geometry/Config.hh \\\n    $$OPENMESH_PATH/Core/Geometry/LoopSchemeMaskT.hh \\\n    $$OPENMESH_PATH/Core/Geometry/MathDefs.hh \\\n    $$OPENMESH_PATH/Core/Geometry/NormalConeT.hh \\\n    $$OPENMESH_PATH/Core/Geometry/Plane3d.hh \\\n    $$OPENMESH_PATH/Core/Geometry/QuadricT.hh \\\n    $$OPENMESH_PATH/Core/Geometry/VectorT.hh \\\n    $$OPENMESH_PATH/Core/Geometry/VectorT_inc.hh \\\n    $$OPENMESH_PATH/Core/IO/BinaryHelper.hh \\\n    $$OPENMESH_PATH/Core/IO/IOInstances.hh \\\n    $$OPENMESH_PATH/Core/IO/IOManager.hh \\\n    $$OPENMESH_PATH/Core/IO/MeshIO.hh \\\n    $$OPENMESH_PATH/Core/IO/OFFFormat.hh \\\n    $$OPENMESH_PATH/Core/IO/OMFormat.hh \\\n    $$OPENMESH_PATH/Core/IO/Options.hh \\\n    $$OPENMESH_PATH/Core/IO/SR_binary.hh \\\n    $$OPENMESH_PATH/Core/IO/SR_binary_spec.hh \\\n    $$OPENMESH_PATH/Core/IO/SR_binary_vector_of_bool.inl \\\n    $$OPENMESH_PATH/Core/IO/SR_binary_vector_of_fundamentals.inl \\\n    $$OPENMESH_PATH/Core/IO/SR_binary_vector_of_string.inl \\\n    $$OPENMESH_PATH/Core/IO/SR_rbo.hh \\\n    $$OPENMESH_PATH/Core/IO/SR_store.hh \\\n    $$OPENMESH_PATH/Core/IO/SR_types.hh \\\n    $$OPENMESH_PATH/Core/IO/StoreRestore.hh \\\n    $$OPENMESH_PATH/Core/IO/exporter/BaseExporter.hh \\\n    $$OPENMESH_PATH/Core/IO/exporter/ExporterT.hh \\\n    $$OPENMESH_PATH/Core/IO/importer/BaseImporter.hh \\\n    $$OPENMESH_PATH/Core/IO/importer/ImporterT.hh \\\n    $$OPENMESH_PATH/Core/IO/reader/BaseReader.hh \\\n    $$OPENMESH_PATH/Core/IO/reader/OBJReader.hh \\\n    $$OPENMESH_PATH/Core/IO/reader/OFFReader.hh \\\n    $$OPENMESH_PATH/Core/IO/reader/OMReader.hh \\\n    $$OPENMESH_PATH/Core/IO/reader/PLYReader.hh \\\n    $$OPENMESH_PATH/Core/IO/reader/STLReader.hh \\\n    $$OPENMESH_PATH/Core/IO/writer/BaseWriter.hh \\\n    $$OPENMESH_PATH/Core/IO/writer/OBJWriter.hh \\\n    $$OPENMESH_PATH/Core/IO/writer/OFFWriter.hh \\\n    $$OPENMESH_PATH/Core/IO/writer/OMWriter.hh \\\n    $$OPENMESH_PATH/Core/IO/writer/PLYWriter.hh \\\n    $$OPENMESH_PATH/Core/IO/writer/STLWriter.hh \\\n    $$OPENMESH_PATH/Core/IO/writer/VTKWriter.hh \\\n    $$OPENMESH_PATH/Core/Mesh/ArrayItems.hh \\\n    $$OPENMESH_PATH/Core/Mesh/ArrayKernel.hh \\\n    $$OPENMESH_PATH/Core/Mesh/AttribKernelT.hh \\\n    $$OPENMESH_PATH/Core/Mesh/Attributes.hh \\\n    $$OPENMESH_PATH/Core/Mesh/BaseKernel.hh \\\n    $$OPENMESH_PATH/Core/Mesh/BaseMesh.hh \\\n    $$OPENMESH_PATH/Core/Mesh/Casts.hh \\\n    $$OPENMESH_PATH/Core/Mesh/CirculatorsT.hh \\\n    $$OPENMESH_PATH/Core/Mesh/FinalMeshItemsT.hh \\\n    $$OPENMESH_PATH/Core/Mesh/Handles.hh \\\n    $$OPENMESH_PATH/Core/Mesh/IteratorsT.hh \\\n    $$OPENMESH_PATH/Core/Mesh/PolyConnectivity.hh \\\n    $$OPENMESH_PATH/Core/Mesh/PolyMeshT.hh \\\n    $$OPENMESH_PATH/Core/Mesh/PolyMesh_ArrayKernelT.hh \\\n    $$OPENMESH_PATH/Core/Mesh/Status.hh \\\n    $$OPENMESH_PATH/Core/Mesh/Traits.hh \\\n    $$OPENMESH_PATH/Core/Mesh/TriConnectivity.hh \\\n    $$OPENMESH_PATH/Core/Mesh/TriMeshT.hh \\\n    $$OPENMESH_PATH/Core/Mesh/TriMesh_ArrayKernelT.hh \\\n    $$OPENMESH_PATH/Core/System/OpenMeshDLLMacros.hh \\\n    $$OPENMESH_PATH/Core/System/compiler.hh \\\n    $$OPENMESH_PATH/Core/System/config.h \\\n    $$OPENMESH_PATH/Core/System/config.hh \\\n    $$OPENMESH_PATH/Core/System/mostream.hh \\\n    $$OPENMESH_PATH/Core/System/omstream.hh \\\n    $$OPENMESH_PATH/Core/Utils/AutoPropertyHandleT.hh \\\n    $$OPENMESH_PATH/Core/Utils/BaseProperty.hh \\\n    $$OPENMESH_PATH/Core/Utils/Endian.hh \\\n    $$OPENMESH_PATH/Core/Utils/GenProg.hh \\\n    $$OPENMESH_PATH/Core/Utils/Noncopyable.hh \\\n    $$OPENMESH_PATH/Core/Utils/Property.hh \\\n    $$OPENMESH_PATH/Core/Utils/PropertyContainer.hh \\\n    $$OPENMESH_PATH/Core/Utils/PropertyManager.hh \\\n    $$OPENMESH_PATH/Core/Utils/RandomNumberGenerator.hh \\\n    $$OPENMESH_PATH/Core/Utils/SingletonT.hh \\\n    $$OPENMESH_PATH/Core/Utils/color_cast.hh \\\n    $$OPENMESH_PATH/Core/Utils/vector_cast.hh \\\n    $$OPENMESH_PATH/Core/Utils/vector_traits.hh \\\n\n#Patchgen\nSOURCES += \\\n    $$PATCHGEN_PATH/adjust_parameter.cpp \\\n    $$PATCHGEN_PATH/get_boundary_geometry.cpp \\\n    $$PATCHGEN_PATH/get_constraint_matrix.cpp \\\n    $$PATCHGEN_PATH/get_constraint_rhs.cpp \\\n    $$PATCHGEN_PATH/get_default_parameter.cpp \\\n    $$PATCHGEN_PATH/get_param_str.cpp \\\n    $$PATCHGEN_PATH/get_variable.cpp \\\n    $$PATCHGEN_PATH/get_variable_indicators.cpp \\\n    $$PATCHGEN_PATH/switch_pattern.cpp\n\nHEADERS += \\\n    $$PATCHGEN_PATH/ILP.h \\\n    $$PATCHGEN_PATH/PatchParam.h \\\n    $$PATCHGEN_PATH/PatchVertexTag.h \\\n    $$PATCHGEN_PATH/PatchVertexTraits.h \\\n    $$PATCHGEN_PATH/Pattern.h \\\n    $$PATCHGEN_PATH/Pattern_2_0.h \\\n    $$PATCHGEN_PATH/Pattern_2_1.h \\\n    $$PATCHGEN_PATH/Pattern_3_0.h \\\n    $$PATCHGEN_PATH/Pattern_3_1.h \\\n    $$PATCHGEN_PATH/Pattern_3_2.h \\\n    $$PATCHGEN_PATH/Pattern_3_3.h \\\n    $$PATCHGEN_PATH/Pattern_4_0.h \\\n    $$PATCHGEN_PATH/Pattern_4_1.h \\\n    $$PATCHGEN_PATH/Pattern_4_2.h \\\n    $$PATCHGEN_PATH/Pattern_4_3.h \\\n    $$PATCHGEN_PATH/Pattern_4_4.h \\\n    $$PATCHGEN_PATH/Pattern_5_0.h \\\n    $$PATCHGEN_PATH/Pattern_5_1.h \\\n    $$PATCHGEN_PATH/Pattern_5_2.h \\\n    $$PATCHGEN_PATH/Pattern_5_3.h \\\n    $$PATCHGEN_PATH/Pattern_5_4.h \\\n    $$PATCHGEN_PATH/Pattern_6_0.h \\\n    $$PATCHGEN_PATH/Pattern_6_1.h \\\n    $$PATCHGEN_PATH/Pattern_6_2.h \\\n    $$PATCHGEN_PATH/Pattern_6_3.h \\\n    $$PATCHGEN_PATH/Pattern_all.h \\\n    $$PATCHGEN_PATH/Permutation.h \\\n    $$PATCHGEN_PATH/add_padding.h \\\n    $$PATCHGEN_PATH/decl.h \\\n    $$PATCHGEN_PATH/generate_subtopology.h \\\n    $$PATCHGEN_PATH/generate_topology.h\n\n"
  },
  {
    "path": "libs/quadretopology/quadretopology/includes/qr_charts.cpp",
    "content": "﻿/***************************************************************************/\n/* Copyright(C) 2021\n\n\nThe authors of\n\nReliable Feature-Line Driven Quad-Remeshing\nSiggraph 2021\n\n\n All rights reserved.\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <https://www.gnu.org/licenses/>.\n****************************************************************************/\n\n#include \"qr_charts.h\"\n\n#include \"assert.h\"\n\n#include <map>\n#include <unordered_set>\n\n#include \"qr_utils.h\"\n\n#include <vcg/complex/complex.h>\n#include <wrap/io_trimesh/export.h>\n\n#define MAXITERATIONS 100000\n\nnamespace QuadRetopology {\nnamespace internal {\n\ntemplate<class TriangleMeshType>\nvoid findChartFacesAndBorderFaces(\n        TriangleMeshType& mesh,\n        const std::vector<int>& faceLabel,\n        ChartData& chartData)\n{\n    if (mesh.face.size() == 0)\n        return;\n\n    std::set<int>& labels = chartData.labels;\n    std::vector<Chart>& charts = chartData.charts;\n\n    for (size_t fId = 0; fId < mesh.face.size(); fId++) {\n        if (!mesh.face[fId].IsD() && faceLabel.at(fId) >= 0)\n            labels.insert(faceLabel.at(fId));\n    }\n\n    int maxChartLabel = *labels.rbegin();\n    charts.resize(maxChartLabel + 1);\n\n    std::vector<bool> visited(mesh.face.size(), false);\n\n    for (size_t i = 0; i < mesh.face.size(); i++) {\n        if (!mesh.face[i].IsD() && !visited[i]) {\n            //Region growing to get chart\n            std::stack<size_t> stack;\n            stack.push(i);\n\n            Chart chart;\n\n            chart.label = faceLabel[i];\n\n            if (chart.label >= 0) {\n                std::set<size_t> borderFacesSet;\n                do {\n                    size_t fId = stack.top();\n                    stack.pop();\n                    assert(faceLabel[fId] == chart.label);\n\n                    if (!visited[fId]) {\n                        chart.faces.push_back(fId);\n\n                        typename TriangleMeshType::FaceType* currentFacePointer = &mesh.face[fId];\n                        vcg::face::Pos<typename TriangleMeshType::FaceType> pos(currentFacePointer, 0);\n                        for (int k = 0; k < 3; k++) {\n                            pos.FlipF();\n                            size_t adjFace = vcg::tri::Index(mesh, pos.F());\n\n                            //Saving border faces\n                            if (currentFacePointer == pos.F() || faceLabel[adjFace] != chart.label) {\n                                borderFacesSet.insert(fId);\n                            }\n                            else {\n                                if (!visited[adjFace]) {\n                                    stack.push(adjFace);\n                                }\n                            }\n                            pos.FlipF();\n\n                            //Next edge\n                            pos.FlipV();\n                            pos.FlipE();\n                        }\n\n                        visited[fId] = true;\n                    }\n                }\n                while (!stack.empty());\n\n                assert(borderFacesSet.size() >= 1);\n\n                std::copy(borderFacesSet.begin(), borderFacesSet.end(), std::back_inserter(chart.borderFaces));\n\n                charts[chart.label] = chart;\n            }\n\n        }\n    }\n}\n\n}\n}\n"
  },
  {
    "path": "libs/quadretopology/quadretopology/includes/qr_charts.h",
    "content": "/***************************************************************************/\n/* Copyright(C) 2021\n\n\nThe authors of\n\nReliable Feature-Line Driven Quad-Remeshing\nSiggraph 2021\n\n\n All rights reserved.\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <https://www.gnu.org/licenses/>.\n****************************************************************************/\n\n#ifndef QR_CHARTS_H\n#define QR_CHARTS_H\n\n#include <vector>\n#include <array>\n#include <set>\n#include <cmath>\n\nnamespace QuadRetopology {\n\nstruct ChartSubside {\n    std::array<int, 2> incidentCharts;\n    std::array<int, 2> incidentChartSubsideId;\n    std::array<int, 2> incidentChartSideId;\n    std::vector<size_t> vertices;\n\n    double length;\n    int size;\n\n    bool isOnBorder;\n};\n\nstruct ChartSide {\n    std::vector<size_t> vertices;\n    std::vector<size_t> subsides;\n    std::vector<bool> reversedSubside;\n\n    double length;\n    int size;\n};\n\nstruct Chart {\n    std::vector<size_t> faces;\n    std::vector<size_t> borderFaces;\n\n    std::vector<size_t> adjacentCharts;\n\n    std::vector<ChartSide> chartSides;\n    std::vector<size_t> chartSubsides;\n\n    int label;\n};\n\nstruct ChartData {\n    std::set<int> labels;\n    std::vector<Chart> charts;\n    std::vector<ChartSubside> subsides;\n};\n\ntemplate<class TriangleMeshType>\nvoid findChartFacesAndBorderFaces(\n        TriangleMeshType& mesh,\n        const std::vector<int>& faceLabel,\n        ChartData& chartData);\n\n}\n\n#include \"qr_charts.cpp\"\n\n#endif // QR_CHARTS_H\n"
  },
  {
    "path": "libs/quadretopology/quadretopology/includes/qr_convert.cpp",
    "content": "/***************************************************************************/\n/* Copyright(C) 2021\n\n\nThe authors of\n\nReliable Feature-Line Driven Quad-Remeshing\nSiggraph 2021\n\n\n All rights reserved.\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <https://www.gnu.org/licenses/>.\n****************************************************************************/\n\n#include \"qr_convert.h\"\n\n#include <vcg/complex/complex.h>\n\nnamespace QuadRetopology {\nnamespace internal {\n\ntemplate<class PolyMeshType>\nvoid VCGToEigen(\n        PolyMeshType& vcgMesh,\n        Eigen::MatrixXd& V,\n        Eigen::MatrixXi& F,\n        std::vector<int>& vMap,\n        std::vector<int>& fMap,\n        bool selectedOnly,\n        int numVerticesPerFace,\n        int dim)\n{\n    assert(dim >= 2);\n    assert(numVerticesPerFace > 2);\n\n    int nSelectedVertices = 0;\n    for (size_t i = 0; i < vcgMesh.vert.size(); i++){\n        if ((!selectedOnly || vcgMesh.vert[i].IsS()) && !vcgMesh.vert[i].IsD()) {\n            nSelectedVertices++;\n        }\n    }\n    int nSelectedFaces = 0;\n    for (size_t i = 0; i < vcgMesh.face.size(); i++){\n        if ((!selectedOnly || vcgMesh.face[i].IsS()) && !vcgMesh.face[i].IsD()) {\n            nSelectedFaces++;\n        }\n    }\n\n    V.resize(nSelectedVertices, dim);\n    F.resize(nSelectedFaces, numVerticesPerFace);\n\n    vMap.resize(vcgMesh.vert.size(), -1);\n    int vId = 0;\n    for (size_t i = 0; i < vcgMesh.vert.size(); i++){\n        if ((!selectedOnly || vcgMesh.vert[i].IsS()) && !vcgMesh.vert[i].IsD()) {\n            vMap[i] = vId;\n            for (int j = 0; j < dim; j++) {\n                V(vId, j) = vcgMesh.vert[i].P()[j];\n            }\n            vId++;\n        }\n    }\n\n    fMap.resize(vcgMesh.face.size(), -1);\n    int fId = 0;\n    for (size_t i = 0; i < vcgMesh.face.size(); i++){\n        if ((!selectedOnly || vcgMesh.face[i].IsS()) && !vcgMesh.face[i].IsD()) {\n            fMap[i] = fId;\n            for (int j = 0; j < vcgMesh.face[i].VN(); j++) {\n                F(fId, j) = vMap[vcg::tri::Index(vcgMesh, vcgMesh.face[i].V(j))];\n            }\n            fId++;\n        }\n    }\n}\n\ntemplate<class PolyMeshType>\nvoid eigenToVCG(\n        const Eigen::MatrixXd& V,\n        const Eigen::MatrixXi& F,\n        PolyMeshType& vcgMesh,\n        int numVertices,\n        int dim)\n{\n    assert(dim >= 2);\n    assert(numVertices > 2);\n\n    vcgMesh.Clear();\n\n    vcg::tri::Allocator<PolyMeshType>::AddVertices(vcgMesh, V.rows());\n    for (int i = 0; i < V.rows(); i++) {\n        typename PolyMeshType::CoordType vv(V(i,0), V(i,1), V(i,2));\n        vcgMesh.vert[static_cast<size_t>(i)].P() = vv;\n    }\n\n    vcg::tri::Allocator<PolyMeshType>::AddFaces(vcgMesh, static_cast<size_t>(F.rows()));\n    for (int i = 0; i < F.rows(); i++) {\n        vcgMesh.face[static_cast<size_t>(i)].Alloc(numVertices);\n        for (int j = 0; j < numVertices; j++) {\n            vcgMesh.face[static_cast<size_t>(i)].V(j) = &(vcgMesh.vert[static_cast<size_t>(F(i,j))]);\n        }\n    }\n}\n\n}\n}\n"
  },
  {
    "path": "libs/quadretopology/quadretopology/includes/qr_convert.h",
    "content": "/***************************************************************************/\n/* Copyright(C) 2021\n\n\nThe authors of\n\nReliable Feature-Line Driven Quad-Remeshing\nSiggraph 2021\n\n\n All rights reserved.\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <https://www.gnu.org/licenses/>.\n****************************************************************************/\n\n#ifndef QR_CONVERT_H\n#define QR_CONVERT_H\n\n#include <Eigen/Core>\n#include <vector>\n\nnamespace QuadRetopology {\nnamespace internal {\n\ntemplate<class PolyMeshType>\nvoid VCGToEigen(\n        PolyMeshType& vcgMesh,\n        Eigen::MatrixXd& V,\n        Eigen::MatrixXi& F,\n        std::vector<int>& vMap,\n        std::vector<int>& fMap,\n        bool selectedOnly = false,\n        int numVerticesPerFace = 3,\n        int dim = 3);\n\ntemplate<class PolyMeshType>\nvoid eigenToVCG(\n        const Eigen::MatrixXd& V,\n        const Eigen::MatrixXi& F,\n        PolyMeshType& vcgMesh,\n        int numVertices = 3,\n        int dim = 3);\n\n}\n}\n\n#include \"qr_convert.cpp\"\n\n#endif // QR_CONVERT_H\n"
  },
  {
    "path": "libs/quadretopology/quadretopology/includes/qr_ilp.cpp",
    "content": "/***************************************************************************/\n/* Copyright(C) 2021\n\n\nThe authors of\n\nReliable Feature-Line Driven Quad-Remeshing\nSiggraph 2021\n\n\n All rights reserved.\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <https://www.gnu.org/licenses/>.\n****************************************************************************/\n\n#include \"qr_ilp.h\"\n\n#include <gurobi_c++.h>\n\n#define MIN_SUBDIVISION_VALUE 1\n#define FEASIBILITY_FIX_COST 1000000.0\n\nnamespace QuadRetopology {\nnamespace internal {\n\nclass GurobiCallBack : public GRBCallback\n{\n    const std::vector<float>& times;\n    const std::vector<float>& gaps;\n    size_t index;\npublic:\n    GurobiCallBack(const std::vector<float>& times, const std::vector<float>& gaps);\nprotected:\n    void callback() override;\n};\n\nvoid getChartSubsideSum(\n        const ChartData& chartData,\n        const size_t& cId,\n        const std::vector<GRBVar>& vars,\n        const std::vector<bool>& isFixed,\n        const std::vector<int>& ilpResults,\n        const bool hardParityConstraint,\n        std::vector<GRBLinExpr>& chartSubsideSum);\n\nvoid getChartSubsideSumResults(\n        const ChartData& chartData,\n        const size_t& cId,\n        const std::vector<int>& results,\n        std::vector<int>& chartSubsideSum);\n\nGRBQuadExpr getGurobiCostTermInteger(GRBModel& model, const ILPMethod& method, const GRBLinExpr& value);\nGRBQuadExpr getGurobiCostTermContinuous(GRBModel& model, const ILPMethod& method, const GRBLinExpr& value);\n\nGRBLinExpr getGurobiAbsInteger(GRBModel& model, const GRBLinExpr& value);\nGRBLinExpr getGurobiAbsContinuous(GRBModel& model, const GRBLinExpr& value);\n\ninline void solveILP(\n        const ChartData& chartData,\n        const std::vector<double>& chartEdgeLength,\n        const ILPMethod& method,\n        const double alpha,\n        const bool isometry,\n        const bool regularityQuadrilaterals,\n        const bool regularityNonQuadrilaterals,\n        const double regularityNonQuadrilateralsWeight,\n        const bool alignSingularities,\n        const double alignSingularitiesWeight,\n        const int repeatLosingConstraintsIterations,\n        const bool repeatLosingConstraintsQuads,\n        const bool repeatLosingConstraintsNonQuads,\n        const bool repeatLosingConstraintsAlign,\n        const bool feasibilityFix,\n        const bool hardParityConstraint,\n        const double timeLimit,\n        const double gapLimit,\n        const std::vector<float>& callbackTimeLimit,\n        const std::vector<float>& callbackGapLimit,\n        double& gap,\n        ILPStatus& status,\n        std::vector<int>& ilpResults)\n{\n    using namespace std;\n\n    vector<int> result;\n\n    std::vector<bool> constraintRespected;\n\n    bool allRespectConstraints = false;\n    int it = 0;\n    do {\n        std::cout << std::endl << std::endl << \" --- OPTIMIZATION: iteration \" << it << \" ----\" << std::endl;\n        try {\n            std::vector<bool> isFixed(chartData.subsides.size(), false);\n            std::vector<bool> isComputable(chartData.subsides.size(), true);\n            for (size_t subsideId = 0; subsideId < chartData.subsides.size(); ++subsideId) {\n                if (ilpResults[subsideId] == ILP_IGNORE) {\n                    isComputable[subsideId] = false;\n                }\n                else if (ilpResults[subsideId] >= 0) {\n                    isFixed[subsideId] = true;\n                }\n            }\n\n            result = ilpResults;\n\n            GRBEnv env = GRBEnv();\n\n            GRBModel model = GRBModel(env);\n\n            GurobiCallBack cb(callbackTimeLimit, callbackGapLimit);\n            if (!callbackTimeLimit.empty() && !callbackGapLimit.empty() && callbackTimeLimit.size() == callbackGapLimit.size()) {\n                model.setCallback(&cb);\n            }\n\n#ifdef GUROBI_NON_VERBOSE\n            model.set(GRB_IntParam_OutputFlag, 0);\n#endif\n\n            model.set(GRB_DoubleParam_TimeLimit, timeLimit);\n            model.set(GRB_DoubleParam_MIPGap, gapLimit);\n\n            // Create variables\n            GRBQuadExpr obj = 0;\n            GRBQuadExpr supportObj = 0;\n\n            vector<GRBVar> vars(chartData.subsides.size());\n\n            size_t constraintRespectedId = 0;\n\n            for (size_t subsideId = 0; subsideId < chartData.subsides.size(); subsideId++) {\n                if (!isComputable[subsideId]) {\n                    continue;\n                }\n\n                const ChartSubside& subside = chartData.subsides[subsideId];\n\n                //If it is not a border (free)\n                if (!isFixed[subsideId]) {\n                    vars[subsideId] = model.addVar(MIN_SUBDIVISION_VALUE, GRB_INFINITY, 0.0, GRB_INTEGER, \"s\" + to_string(subsideId));\n                }\n                else if (feasibilityFix && subside.isOnBorder) {\n                    const int fixedSize = hardParityConstraint ? ilpResults[subsideId] : std::round(ilpResults[subsideId] / 2.0);\n\n                    vars[subsideId] = model.addVar(std::max(fixedSize - 1, MIN_SUBDIVISION_VALUE), fixedSize + 1, 0.0, GRB_INTEGER, \"s\" + to_string(subsideId));\n                    GRBLinExpr value = vars[subsideId] - fixedSize;\n\n                    supportObj += getGurobiAbsInteger(model, value) * FEASIBILITY_FIX_COST * (1.0 / fixedSize);\n\n                    isFixed[subsideId] = false;\n                }\n            }\n\n            std::cout << chartData.subsides.size() << \" subsides!\" << std::endl;\n\n            for (size_t cId = 0; cId < chartData.charts.size(); cId++) {\n                const Chart& chart = chartData.charts[cId];\n\n                bool computable = true;\n\n                for (size_t i = 0; i < chart.chartSubsides.size(); i++) {\n                    const size_t subsideId = chart.chartSubsides[i];\n                    if (!isComputable[subsideId])\n                        computable = false;\n                }\n\n                if (computable && chart.faces.size() > 0) {\n                    size_t nSides = chart.chartSides.size();\n\n\n                    size_t numRegularityTerms = 0;\n                    size_t numIsometryTerms = 0;\n\n                    GRBQuadExpr regExpr = 0;\n                    GRBQuadExpr isoExpr = 0;\n\n                    /* ------------------------ ISOMETRY ------------------------ */\n\n                    if (isometry) {\n                        for (size_t i = 0; i < chart.chartSubsides.size(); i++) {\n                            const size_t subsideId = chart.chartSubsides[i];\n                            const ChartSubside& subside = chartData.subsides[subsideId];\n\n                            //If it is not fixed (free)\n                            if (!isFixed[subsideId]) {\n                                double edgeLength = chartEdgeLength[cId];\n\n                                double sideSubdivision = subside.length / edgeLength;\n                                if (!hardParityConstraint) {\n                                    sideSubdivision /= 2.0;\n                                }\n\n                                sideSubdivision = std::max(static_cast<double>(MIN_SUBDIVISION_VALUE), sideSubdivision);\n\n                                GRBLinExpr value = vars[subsideId] - sideSubdivision;\n\n                                isoExpr += getGurobiCostTermContinuous(model, method, value);\n                                numIsometryTerms++;\n                            }\n                        }\n                    }\n\n\n                    /* ------------------------ REGULARITY ------------------------ */\n\n                    std::vector<GRBLinExpr> chartSubsideSum;\n                    getChartSubsideSum(chartData, cId, vars, isFixed, ilpResults, hardParityConstraint, chartSubsideSum);\n\n                    for (size_t j = 0; j < nSides; j++) {\n                        GRBLinExpr value = 0.0;\n                        bool valueComputed = false;\n\n                        //Regularity for quad case\n                        if (nSides == 4 && regularityQuadrilaterals) {\n                            const GRBLinExpr& subside0Sum = chartSubsideSum[j];\n                            const GRBLinExpr& subside2Sum = chartSubsideSum[(j+2)%nSides];\n\n                            value = subside0Sum - subside2Sum;\n                            valueComputed = true;\n                        }\n                        //Regularity for triangular case\n                        else if (nSides == 3 && regularityNonQuadrilaterals) {\n                            const GRBLinExpr& subside0Sum = chartSubsideSum[j];\n                            const GRBLinExpr& subside1Sum = chartSubsideSum[(j+1)%nSides];\n                            const GRBLinExpr& subside2Sum = chartSubsideSum[(j+2)%nSides];\n\n                            GRBVar c = model.addVar(0, GRB_INFINITY, 0.0, GRB_INTEGER);\n                            model.addConstr(subside0Sum + 1 <= subside1Sum + subside2Sum + c);\n\n                            value = c;\n                            valueComputed = true;\n                        }\n                        //Regularity for pentagonal case\n                        else if (nSides == 5 && regularityNonQuadrilaterals) {\n                            const GRBLinExpr& subside0Sum = chartSubsideSum[j];\n                            const GRBLinExpr& subside1Sum = chartSubsideSum[(j+1)%nSides];\n                            const GRBLinExpr& subside2Sum = chartSubsideSum[(j+2)%nSides];\n                            const GRBLinExpr& subside3Sum = chartSubsideSum[(j+3)%nSides];\n                            const GRBLinExpr& subside4Sum = chartSubsideSum[(j+4)%nSides];\n\n                            GRBVar c = model.addVar(0, GRB_INFINITY, 0.0, GRB_INTEGER);\n                            model.addConstr(subside0Sum + subside1Sum + 1 <= subside2Sum + subside3Sum + subside4Sum + c);\n\n                            value = c;\n                            valueComputed = true;\n                        }\n                        //Regularity for hexagonal case\n                        else if (nSides == 6 && regularityNonQuadrilaterals) {\n                            const GRBLinExpr& subside0Sum = chartSubsideSum[j];\n                            const GRBLinExpr& subside2Sum = chartSubsideSum[(j+2)%nSides];\n                            const GRBLinExpr& subside4Sum = chartSubsideSum[(j+4)%nSides];\n\n                            GRBVar c = model.addVar(0, GRB_INFINITY, 0.0, GRB_INTEGER);\n                            model.addConstr(subside0Sum + 1 <= subside2Sum + subside4Sum + c);\n\n                            GRBLinExpr parityEquation = subside0Sum + subside2Sum + subside4Sum;\n                            GRBVar hexParity = model.addVar(3, GRB_INFINITY, 0.0, GRB_INTEGER);\n                            GRBVar hexFree = model.addVar(0, 1, 0.0, GRB_INTEGER);\n                            model.addConstr(hexParity * 2 == parityEquation + hexFree);\n\n                            value = (c + hexFree) / 2.0;\n                            valueComputed = true;\n                        }\n\n                        if (valueComputed) {\n                            if (constraintRespected.empty() || constraintRespected[constraintRespectedId]) {\n                                if (nSides == 4) {\n                                    regExpr += getGurobiCostTermInteger(model, ILPMethod::ABS, value) / nSides;\n                                }\n                                else {\n                                    regExpr += getGurobiCostTermInteger(model, ILPMethod::ABS, value) / nSides * regularityNonQuadrilateralsWeight;\n                                }\n\n                                numRegularityTerms++;\n                            }\n\n                            constraintRespectedId++;\n                        }\n\n                    }\n\n\n\n                    /* ------------------------ ALIGN SINGULARITIES ------------------------ */\n\n                    if (alignSingularities && (nSides == 3 || nSides == 5 || nSides == 6)) {\n                        for (size_t j = 0; j < nSides; j++) {\n                            GRBLinExpr value1 = 0.0;\n                            GRBLinExpr value2 = 0.0;\n\n                            int currentChartId = cId;\n                            int currentChartSideId = j;\n                            size_t currentChartNSides = chartData.charts[currentChartId].chartSides.size();\n\n                            bool valueComputed = false;\n                            do {\n                                const Chart& currentChart = chartData.charts[currentChartId];\n                                const ChartSide& currentChartSide = currentChart.chartSides[currentChartSideId];\n\n                                if (currentChartSide.subsides.size() != 1) {\n                                    currentChartId = -1;\n                                    currentChartSideId = -1;\n                                    currentChartNSides = 0;\n                                }\n                                else {\n                                    int adjOppositeSideId = currentChartSideId;\n                                    if (currentChartId != static_cast<int>(cId)) {\n                                        adjOppositeSideId = (currentChartSideId + 2) % chartData.charts[currentChartId].chartSides.size();\n                                    }\n                                    const ChartSide& adjOppositeSide = currentChart.chartSides[adjOppositeSideId];\n\n                                    const std::array<int, 2>& incidentCharts = chartData.subsides[adjOppositeSide.subsides[0]].incidentCharts;\n                                    const std::array<int, 2>& incidentChartSides = chartData.subsides[adjOppositeSide.subsides[0]].incidentChartSideId;\n\n                                    if (incidentCharts[0] == static_cast<int>(currentChartId)) {\n                                        currentChartId = incidentCharts[1];\n                                        currentChartSideId = incidentChartSides[1];\n                                    }\n                                    else if (incidentCharts[1] == static_cast<int>(currentChartId)) {\n                                        currentChartId = incidentCharts[0];\n                                        currentChartSideId = incidentChartSides[0];\n                                    }\n\n                                    if (currentChartId > -1) {\n                                        currentChartNSides = chartData.charts[currentChartId].chartSides.size();\n                                    }\n                                }\n\n                            } while (currentChartId != static_cast<int>(cId) && currentChartId > -1 && currentChartNSides == 4);\n\n                            if (currentChartId != static_cast<int>(cId) && currentChartId > -1 && (currentChartNSides == 3 || currentChartNSides == 5 || currentChartNSides == 6)) {\n                                bool currentComputable = true;\n                                for (size_t i = 0; i < chartData.charts[currentChartId].chartSubsides.size(); i++) {\n                                    const size_t subsideId = chartData.charts[currentChartId].chartSubsides[i];\n                                    if (!isComputable[subsideId])\n                                        currentComputable = false;\n                                }\n\n                                if (currentComputable) {\n                                    GRBLinExpr valueDown1 = 0.0;\n                                    GRBLinExpr valueUp1 = 0.0;\n                                    GRBLinExpr valueDown2 = 0.0;\n                                    GRBLinExpr valueUp2 = 0.0;\n\n                                    //Singularity alignment for triangular case\n                                    if (nSides == 3) {\n                                        const GRBLinExpr& subside0Sum = chartSubsideSum[j];\n                                        const GRBLinExpr& subside1Sum = chartSubsideSum[(j+1)%nSides];\n                                        const GRBLinExpr& subside2Sum = chartSubsideSum[(j+2)%nSides];\n\n                                        GRBLinExpr down = subside0Sum + subside2Sum - subside1Sum;\n                                        GRBLinExpr up = subside1Sum + subside0Sum - subside2Sum;\n\n                                        valueDown1 = down;\n                                        valueUp1 = up;\n                                    }\n                                    //Singularity alignment for pentagonal case\n                                    else if (nSides == 5) {\n                                        const GRBLinExpr& subside0Sum = chartSubsideSum[j];\n                                        const GRBLinExpr& subside1Sum = chartSubsideSum[(j+1)%nSides];\n                                        const GRBLinExpr& subside2Sum = chartSubsideSum[(j+2)%nSides];\n                                        const GRBLinExpr& subside3Sum = chartSubsideSum[(j+3)%nSides];\n                                        const GRBLinExpr& subside4Sum = chartSubsideSum[(j+4)%nSides];\n\n                                        GRBLinExpr down = (subside0Sum + subside1Sum + subside2Sum) - (subside3Sum + subside4Sum);\n                                        GRBLinExpr up = (subside3Sum + subside4Sum + subside0Sum) - (subside1Sum + subside2Sum);\n\n                                        valueDown1 = down;\n                                        valueUp1 = up;\n                                    }\n                                    //Singularity alignment for hexagonal case\n                                    else if (nSides == 6) {\n                                        const GRBLinExpr& subside0Sum = chartSubsideSum[j];\n                                        const GRBLinExpr& subside2Sum = chartSubsideSum[(j+2)%nSides];\n                                        const GRBLinExpr& subside4Sum = chartSubsideSum[(j+4)%nSides];\n\n                                        GRBLinExpr down = subside0Sum + subside2Sum - subside4Sum;\n                                        GRBLinExpr up = subside4Sum + subside0Sum - subside2Sum;\n\n                                        valueDown1 = down;\n                                        valueUp1 = up;\n                                    }\n\n\n\n\n                                    std::vector<GRBLinExpr> adjChartSubsideSum;\n                                    getChartSubsideSum(chartData, currentChartId, vars, isFixed, ilpResults, hardParityConstraint, adjChartSubsideSum);\n\n                                    //Singularity alignment for triangular case\n                                    if (currentChartNSides == 3) {\n                                        const GRBLinExpr& subside0Sum = adjChartSubsideSum[currentChartSideId];\n                                        const GRBLinExpr& subside1Sum = adjChartSubsideSum[(currentChartSideId+1)%currentChartNSides];\n                                        const GRBLinExpr& subside2Sum = adjChartSubsideSum[(currentChartSideId+2)%currentChartNSides];\n\n                                        GRBLinExpr down = subside0Sum + subside2Sum - subside1Sum;\n                                        GRBLinExpr up = subside1Sum + subside0Sum - subside2Sum;\n\n                                        valueDown2 = down;\n                                        valueUp2 = up;\n                                    }\n                                    //Singularity alignment for pentagonal case\n                                    else if (currentChartNSides == 5) {\n                                        const GRBLinExpr& subside0Sum = adjChartSubsideSum[currentChartSideId];\n                                        const GRBLinExpr& subside1Sum = adjChartSubsideSum[(currentChartSideId+1)%currentChartNSides];\n                                        const GRBLinExpr& subside2Sum = adjChartSubsideSum[(currentChartSideId+2)%currentChartNSides];\n                                        const GRBLinExpr& subside3Sum = adjChartSubsideSum[(currentChartSideId+3)%currentChartNSides];\n                                        const GRBLinExpr& subside4Sum = adjChartSubsideSum[(currentChartSideId+4)%currentChartNSides];\n\n                                        GRBLinExpr down = (subside0Sum + subside1Sum + subside2Sum) - (subside3Sum + subside4Sum);\n                                        GRBLinExpr up = (subside3Sum + subside4Sum + subside0Sum) - (subside1Sum + subside2Sum);\n\n                                        valueDown2 = down;\n                                        valueUp2 = up;\n                                    }\n                                    //Singularity alignment for hexagonal case\n                                    else if (currentChartNSides == 6) {\n                                        const GRBLinExpr& subside0Sum = adjChartSubsideSum[currentChartSideId];\n                                        const GRBLinExpr& subside2Sum = adjChartSubsideSum[(currentChartSideId+2)%currentChartNSides];\n                                        const GRBLinExpr& subside4Sum = adjChartSubsideSum[(currentChartSideId+4)%currentChartNSides];\n\n                                        GRBLinExpr down = subside0Sum + subside2Sum - subside4Sum;\n                                        GRBLinExpr up = subside4Sum + subside0Sum - subside2Sum;\n\n                                        valueDown2 = down;\n                                        valueUp2 = up;\n                                    }\n\n                                    value1 = valueUp1 - valueDown2;\n                                    value2 = valueDown1 - valueUp2;\n                                    valueComputed = true;\n                                }\n                            }\n\n                            if (valueComputed) {\n                                if (constraintRespected.empty() || constraintRespected[constraintRespectedId]) {\n                                    regExpr += (\n                                        0.5 * getGurobiCostTermInteger(model, ILPMethod::ABS, value1) +\n                                        0.5 * getGurobiCostTermInteger(model, ILPMethod::ABS, value2)\n                                        )  / nSides * alignSingularitiesWeight;\n                                }\n\n                                constraintRespectedId++;\n                            }\n                        }\n                    }\n\n                    const double isoWeight = alpha;\n                    const double regWeight = (1 - alpha);\n\n                    if (numIsometryTerms > 0)\n                        obj += isoWeight * isoExpr / numIsometryTerms;\n                    if (numRegularityTerms > 0)\n                        obj += regWeight * regExpr / numRegularityTerms;\n\n\n                    //Even side size sum constraint in a chart\n                    if (hardParityConstraint) {\n                        GRBLinExpr sumExp = 0;\n                        for (const size_t& subsideId : chart.chartSubsides) {\n                            const ChartSubside& subside = chartData.subsides[subsideId];\n\n                            if (!isFixed[subsideId]) {\n                                assert(isComputable[subsideId] && !isFixed[subsideId]);\n                                sumExp += vars[subsideId];\n                            }\n                            else {                                \n                                const int fixedSize = hardParityConstraint ? ilpResults[subsideId] : std::round(ilpResults[subsideId] / 2.0);\n                                sumExp += fixedSize;\n                            }\n                        }\n\n                        GRBVar free = model.addVar(2, GRB_INFINITY, 0.0, GRB_INTEGER);\n                        model.addConstr(free * 2 == sumExp);\n                    }\n\n                    if (chart.chartSides.size() < 3 || chart.chartSides.size() > 6) {\n                        std::cout << \"Chart \" << cId << \" has \" << chart.chartSides.size() << \" sides.\" << std::endl;\n#ifdef ASSERT_FOR_NUMBER_SIDES\n                        assert(chart.chartSides.size() >= 3 && chart.chartSides.size() <= 6);\n#endif\n                    }\n\n                }\n            }\n\n            //Set objective function\n            model.setObjective(obj + supportObj, GRB_MINIMIZE);\n\n            //model.write(\"out.lp\");\n\n            //Optimize model\n            model.optimize();\n\n            for (size_t subsideId = 0; subsideId < chartData.subsides.size(); subsideId++) {\n                const ChartSubside& subside = chartData.subsides[subsideId];\n                if (isComputable[subsideId]) {\n                    if (!isFixed[subsideId]) {\n                        assert(isComputable[subsideId] && !isFixed[subsideId]);\n                        result[subsideId] = static_cast<int>(std::round(vars[subsideId].get(GRB_DoubleAttr_X)));\n                    }\n                    else {\n                        const int fixedSize = hardParityConstraint ? ilpResults[subsideId] : std::round(ilpResults[subsideId] / 2.0);\n                        result[subsideId] = fixedSize;\n                    }\n    \n                    if (!hardParityConstraint) {\n                        result[subsideId] *= 2;\n                    }\n                }\n            }\n\n\n            if (it < repeatLosingConstraintsIterations) {\n                int numLostConstraintsQuad = 0;\n                int numLostConstraintsNonQuad = 0;\n                int numLostConstraintsAlign = 0;\n\n                if (constraintRespected.empty()) {\n                    constraintRespected.resize(constraintRespectedId, true);\n                }\n\n                allRespectConstraints = true;\n\n                constraintRespectedId = 0;\n\n                for (size_t cId = 0; cId < chartData.charts.size(); cId++) {\n                    const Chart& chart = chartData.charts[cId];\n\n                    bool computable = true;\n\n                    for (size_t i = 0; i < chart.chartSubsides.size(); i++) {\n                        const size_t subsideId = chart.chartSubsides[i];\n                        if (!isComputable[subsideId])\n                            computable = false;\n                    }\n\n                    if (computable && chart.faces.size() > 0) {\n                        size_t nSides = chart.chartSides.size();\n\n                        std::vector<int> chartSubsideSumResults;\n                        getChartSubsideSumResults(chartData, cId, result, chartSubsideSumResults);\n\n                        for (size_t j = 0; j < nSides; j++) {\n                            int value = 0.0;\n                            bool valueComputed = false;\n                            bool respected = false;\n\n                            //Regularity for quad case\n                            if (nSides == 4 && regularityQuadrilaterals) {\n                                const int& subside0Sum = chartSubsideSumResults[j];\n                                const int& subside2Sum = chartSubsideSumResults[(j+2)%nSides];\n\n                                value = subside0Sum - subside2Sum;\n                                respected = value == 0;\n                                valueComputed = true;\n                            }\n                            //Regularity for triangular case\n                            else if (nSides == 3 && regularityNonQuadrilaterals) {\n                                const int& subside0Sum = chartSubsideSumResults[j];\n                                const int& subside1Sum = chartSubsideSumResults[(j+1)%nSides];\n                                const int& subside2Sum = chartSubsideSumResults[(j+2)%nSides];\n\n                                respected = subside0Sum < subside1Sum + subside2Sum;\n                                valueComputed = true;\n                            }\n                            //Regularity for pentagonal case\n                            else if (nSides == 5 && regularityNonQuadrilaterals) {\n                                const int& subside0Sum = chartSubsideSumResults[j];\n                                const int& subside1Sum = chartSubsideSumResults[(j+1)%nSides];\n                                const int& subside2Sum = chartSubsideSumResults[(j+2)%nSides];\n                                const int& subside3Sum = chartSubsideSumResults[(j+3)%nSides];\n                                const int& subside4Sum = chartSubsideSumResults[(j+4)%nSides];\n\n                                respected = subside0Sum + subside1Sum < subside2Sum + subside3Sum + subside4Sum;\n                                valueComputed = true;\n                            }\n                            //Regularity for hexagonal case\n                            else if (nSides == 6 && regularityNonQuadrilaterals) {\n                                const int& subside0Sum = chartSubsideSumResults[j];\n                                const int& subside2Sum = chartSubsideSumResults[(j+2)%nSides];\n                                const int& subside4Sum = chartSubsideSumResults[(j+4)%nSides];\n\n                                respected = subside0Sum < subside2Sum + subside4Sum && ((subside0Sum + subside2Sum + subside4Sum) % 2 == 0);\n                                valueComputed = true;\n                            }\n\n                            if (valueComputed) {\n                                if (!respected) {\n                                    if (nSides == 4 && repeatLosingConstraintsQuads) {\n                                        numLostConstraintsQuad++;\n                                        allRespectConstraints = false;\n                                        constraintRespected[constraintRespectedId] = false;\n                                    }\n                                    else if (((nSides == 3 || nSides == 5 || nSides == 6) && repeatLosingConstraintsNonQuads)) {\n                                        numLostConstraintsNonQuad++;\n                                        allRespectConstraints = false;\n                                        constraintRespected[constraintRespectedId] = false;\n                                    }\n                                }\n\n                                constraintRespectedId++;\n                            }\n                        }\n\n                        if (alignSingularities && (nSides == 3 || nSides == 5 || nSides == 6)) {\n                            for (size_t j = 0; j < nSides; j++) {\n                                int value1 = 0.0;\n                                int value2 = 0.0;\n\n                                int currentChartId = cId;\n                                int currentChartSideId = j;\n                                size_t currentChartNSides = chartData.charts[currentChartId].chartSides.size();\n\n                                bool valueComputed = false;\n                                bool respected = false;\n                                do {\n                                    const Chart& currentChart = chartData.charts[currentChartId];\n                                    const ChartSide& currentChartSide = currentChart.chartSides[currentChartSideId];\n\n                                    if (currentChartSide.subsides.size() != 1) {\n                                        currentChartId = -1;\n                                        currentChartSideId = -1;\n                                        currentChartNSides = 0;\n                                    }\n                                    else {\n                                        int adjOppositeSideId = currentChartSideId;\n                                        if (currentChartId != static_cast<int>(cId)) {\n                                            adjOppositeSideId = (currentChartSideId + 2) % chartData.charts[currentChartId].chartSides.size();\n                                        }\n                                        const ChartSide& adjOppositeSide = currentChart.chartSides[adjOppositeSideId];\n\n                                        const std::array<int, 2>& incidentCharts = chartData.subsides[adjOppositeSide.subsides[0]].incidentCharts;\n                                        const std::array<int, 2>& incidentChartSides = chartData.subsides[adjOppositeSide.subsides[0]].incidentChartSideId;\n\n                                        if (incidentCharts[0] == static_cast<int>(currentChartId)) {\n                                            currentChartId = incidentCharts[1];\n                                            currentChartSideId = incidentChartSides[1];\n                                        }\n                                        else if (incidentCharts[1] == static_cast<int>(currentChartId)) {\n                                            currentChartId = incidentCharts[0];\n                                            currentChartSideId = incidentChartSides[0];\n                                        }\n\n                                        if (currentChartId > -1) {\n                                            currentChartNSides = chartData.charts[currentChartId].chartSides.size();\n                                        }\n                                    }\n\n                                } while (currentChartId != static_cast<int>(cId) && currentChartId > -1 && currentChartNSides == 4);\n\n                                if (currentChartId != static_cast<int>(cId) && currentChartId > -1 && (currentChartNSides == 3 || currentChartNSides == 5 || currentChartNSides == 6)) {\n                                    bool currentComputable = true;\n                                    for (size_t i = 0; i < chartData.charts[currentChartId].chartSubsides.size(); i++) {\n                                        const size_t subsideId = chartData.charts[currentChartId].chartSubsides[i];\n                                        if (!isComputable[subsideId])\n                                            currentComputable = false;\n                                    }\n\n                                    if (currentComputable) {\n\n                                        int valueDown1 = 0.0;\n                                        int valueUp1 = 0.0;\n                                        int valueDown2 = 0.0;\n                                        int valueUp2 = 0.0;\n\n                                        //Singularity alignment for triangular case\n                                        if (nSides == 3) {\n                                            const int& subside0Sum = chartSubsideSumResults[j];\n                                            const int& subside1Sum = chartSubsideSumResults[(j+1)%nSides];\n                                            const int& subside2Sum = chartSubsideSumResults[(j+2)%nSides];\n\n                                            int down = subside0Sum + subside2Sum - subside1Sum;\n                                            int up = subside1Sum + subside0Sum - subside2Sum;\n\n                                            valueDown1 = down;\n                                            valueUp1 = up;\n                                        }\n                                        //Singularity alignment for pentagonal case\n                                        else if (nSides == 5) {\n                                            const int& subside0Sum = chartSubsideSumResults[j];\n                                            const int& subside1Sum = chartSubsideSumResults[(j+1)%nSides];\n                                            const int& subside2Sum = chartSubsideSumResults[(j+2)%nSides];\n                                            const int& subside3Sum = chartSubsideSumResults[(j+3)%nSides];\n                                            const int& subside4Sum = chartSubsideSumResults[(j+4)%nSides];\n\n                                            int down = (subside0Sum + subside1Sum + subside2Sum) - (subside3Sum + subside4Sum);\n                                            int up = (subside3Sum + subside4Sum + subside0Sum) - (subside1Sum + subside2Sum);\n\n                                            valueDown1 = down;\n                                            valueUp1 = up;\n                                        }\n                                        //Singularity alignment for hexagonal case\n                                        else if (nSides == 6) {\n                                            const int& subside0Sum = chartSubsideSumResults[j];\n                                            const int& subside2Sum = chartSubsideSumResults[(j+2)%nSides];\n                                            const int& subside4Sum = chartSubsideSumResults[(j+4)%nSides];\n\n                                            int down = subside0Sum + subside2Sum - subside4Sum;\n                                            int up = subside4Sum + subside0Sum - subside2Sum;\n\n                                            valueDown1 = down;\n                                            valueUp1 = up;\n                                        }\n\n\n\n\n                                        std::vector<int> adjChartSubsideSumResults;\n                                        getChartSubsideSumResults(chartData, currentChartId, result, adjChartSubsideSumResults);\n\n                                        //Singularity alignment for triangular case\n                                        if (currentChartNSides == 3) {\n                                            const int& subside0Sum = adjChartSubsideSumResults[currentChartSideId];\n                                            const int& subside1Sum = adjChartSubsideSumResults[(currentChartSideId+1)%currentChartNSides];\n                                            const int& subside2Sum = adjChartSubsideSumResults[(currentChartSideId+2)%currentChartNSides];\n\n                                            int down = subside0Sum + subside2Sum - subside1Sum;\n                                            int up = subside1Sum + subside0Sum - subside2Sum;\n\n                                            valueDown2 = down;\n                                            valueUp2 = up;\n                                        }\n                                        //Singularity alignment for pentagonal case\n                                        else if (currentChartNSides == 5) {\n                                            const int& subside0Sum = adjChartSubsideSumResults[currentChartSideId];\n                                            const int& subside1Sum = adjChartSubsideSumResults[(currentChartSideId+1)%currentChartNSides];\n                                            const int& subside2Sum = adjChartSubsideSumResults[(currentChartSideId+2)%currentChartNSides];\n                                            const int& subside3Sum = adjChartSubsideSumResults[(currentChartSideId+3)%currentChartNSides];\n                                            const int& subside4Sum = adjChartSubsideSumResults[(currentChartSideId+4)%currentChartNSides];\n\n                                            int down = (subside0Sum + subside1Sum + subside2Sum) - (subside3Sum + subside4Sum);\n                                            int up = (subside3Sum + subside4Sum + subside0Sum) - (subside1Sum + subside2Sum);\n\n                                            valueDown2 = down;\n                                            valueUp2 = up;\n                                        }\n                                        //Singularity alignment for hexagonal case\n                                        else if (currentChartNSides == 6) {\n                                            const int& subside0Sum = adjChartSubsideSumResults[currentChartSideId];\n                                            const int& subside2Sum = adjChartSubsideSumResults[(currentChartSideId+2)%currentChartNSides];\n                                            const int& subside4Sum = adjChartSubsideSumResults[(currentChartSideId+4)%currentChartNSides];\n\n                                            int down = subside0Sum + subside2Sum - subside4Sum;\n                                            int up = subside4Sum + subside0Sum - subside2Sum;\n\n                                            valueDown2 = down;\n                                            valueUp2 = up;\n                                        }\n\n                                        value1 = valueUp1 - valueDown2;\n                                        value2 = valueDown1 - valueUp2;\n\n                                        respected = value1 == 0 && value2 == 0;\n\n                                        valueComputed = true;\n                                    }\n                                }\n\n                                if (valueComputed) {\n                                    if (!respected) {\n                                        if (((nSides == 3 || nSides == 5 || nSides == 6) && repeatLosingConstraintsAlign)) {\n                                            allRespectConstraints = false;\n                                            constraintRespected[constraintRespectedId] = false;\n                                            numLostConstraintsAlign++;\n                                        }\n                                    }\n\n                                    constraintRespectedId++;\n                                }\n                            }\n                        }\n                    }\n                }\n\n                std::cout << \"Lost contraints quad: \" << numLostConstraintsQuad << std::endl;\n                std::cout << \"Lost contraints non quad: \" << numLostConstraintsNonQuad << std::endl;\n                std::cout << \"Lost contraints alignment: \" << numLostConstraintsAlign << std::endl << std::endl << std::endl;\n            }\n\n#ifndef GUROBI_NON_VERBOSE\n            cout << \"Support obj: \" << supportObj.getValue() << std::endl;\n            cout << \"Obj: \" << obj.getValue() << std::endl;\n#endif\n            gap = model.get(GRB_DoubleAttr_MIPGap);\n\n            status = ILPStatus::SOLUTIONFOUND;\n\n            model.reset();\n\n\n            for (size_t cId = 0; cId < chartData.charts.size(); cId++) {\n                const Chart& chart = chartData.charts[cId];\n\n                bool computable = true;\n\n                for (size_t i = 0; i < chart.chartSubsides.size(); i++) {\n                    const size_t subsideId = chart.chartSubsides[i];\n                    if (!isComputable[subsideId])\n                        computable = false;\n                }\n\n                if (computable && chart.faces.size() > 0) {\n                    int sizeSum = 0;\n                    for (const size_t& subsideId : chart.chartSubsides) {\n                        sizeSum += result[subsideId];\n                    }\n\n                    if (sizeSum % 2 == 1) {\n                        std::cout << \"Error not even, chart: \" << cId << \" -> \";\n                        for (const size_t& subsideId : chart.chartSubsides) {\n                            std::cout << result[subsideId] << \" \";\n                        }\n                        std::cout << \" = \" << sizeSum << std::endl;\n\n                        status = ILPStatus::SOLUTIONWRONG;\n                    }\n                }\n            }\n\n        } catch(GRBException e) {\n            cout << \"Error code = \" << e.getErrorCode() << std::endl;\n            cout << e.getMessage() << std::endl;\n\n            status = ILPStatus::INFEASIBLE;\n        }\n\n        it++;\n    }\n    while (status == ILPStatus::SOLUTIONFOUND && it < repeatLosingConstraintsIterations + 1 && !allRespectConstraints);\n\n    ilpResults = result;\n}\n\ninline void getChartSubsideSum(\n        const ChartData& chartData,\n        const size_t& cId,\n        const std::vector<GRBVar>& vars,\n        const std::vector<bool>& isFixed,\n        const std::vector<int>& ilpResults,\n        const bool hardParityConstraint,\n        std::vector<GRBLinExpr>& chartSubsideSum)\n{\n    const Chart& chart = chartData.charts[cId];\n\n    size_t nSides = chart.chartSides.size();\n\n    chartSubsideSum.resize(nSides, 0.0);\n\n    for (size_t i = 0; i < nSides; i++) {\n        const ChartSide& side = chart.chartSides[i];\n        GRBLinExpr subsideSum = 0;\n        for (const size_t& subsideId : side.subsides) {\n            const ChartSubside& subside = chartData.subsides[subsideId];\n\n            if (!isFixed[subsideId]) {\n                assert(ilpResults[subsideId] != ILP_IGNORE && !isFixed[subsideId]);\n                subsideSum += vars[subsideId];\n            }\n            else {                \n                const int fixedSize = hardParityConstraint ? ilpResults[subsideId] : std::round(ilpResults[subsideId] / 2.0);\n                subsideSum += fixedSize;\n            }\n        }\n\n        chartSubsideSum[i] = subsideSum;\n    }\n}\n\ninline void getChartSubsideSumResults(\n        const ChartData& chartData,\n        const size_t& cId,\n        const std::vector<int>& results,\n        std::vector<int>& chartSubsideSum)\n{\n    const Chart& chart = chartData.charts[cId];\n\n    size_t nSides = chart.chartSides.size();\n\n    chartSubsideSum.resize(nSides, 0.0);\n\n    for (size_t i = 0; i < nSides; i++) {        \n        const ChartSide& side = chart.chartSides[i];\n        int subsideSum = 0;\n        for (const size_t& subsideId : side.subsides) {\n            subsideSum += results[subsideId];\n        }\n\n        chartSubsideSum[i] = subsideSum;\n    }\n}\n\ninline GRBQuadExpr getGurobiCostTermInteger(GRBModel& model, const ILPMethod& method, const GRBLinExpr& value)\n{\n    GRBQuadExpr expr;\n\n    if (method == LEASTSQUARES) {\n        expr = value * value;\n    }\n    else {\n        expr = getGurobiAbsInteger(model, value);\n    }\n\n    return expr;\n}\n\ninline GRBQuadExpr getGurobiCostTermContinuous(GRBModel& model, const ILPMethod& method, const GRBLinExpr& value)\n{\n    GRBQuadExpr expr;\n\n    if (method == LEASTSQUARES) {\n        expr = value * value;\n    }\n    else {\n        expr = getGurobiAbsContinuous(model, value);\n    }\n\n    return expr;\n}\n\ninline GRBLinExpr getGurobiAbsInteger(GRBModel& model, const GRBLinExpr& value) {\n    GRBVar diff = model.addVar(-GRB_INFINITY, GRB_INFINITY, 0.0, GRB_INTEGER);\n    GRBVar abs = model.addVar(0, GRB_INFINITY, 0.0, GRB_INTEGER);\n    model.addConstr(diff == value);\n    model.addGenConstrAbs(abs, diff);\n\n    return abs;\n}\n\ninline GRBLinExpr getGurobiAbsContinuous(GRBModel& model, const GRBLinExpr& value) {\n    GRBVar diff = model.addVar(-GRB_INFINITY, GRB_INFINITY, 0.0, GRB_CONTINUOUS);\n    GRBVar abs = model.addVar(0, GRB_INFINITY, 0.0, GRB_CONTINUOUS);\n    model.addConstr(diff == value);\n    model.addGenConstrAbs(abs, diff);\n\n    return abs;\n}\n\ninline GurobiCallBack::GurobiCallBack(const std::vector<float>& times, const std::vector<float>& gaps) :\n    times(times), gaps(gaps), index(0)\n{\n\n}\n\ninline void GurobiCallBack::callback() {\n    try {\n        GRBCallback::callback();\n\n        if (where == GRB_CB_MIP) {\n            const double runtime = getDoubleInfo(GRB_CB_RUNTIME);\n\n            while (index < times.size() && times[index] <= runtime) {\n                index++;\n            }\n\n            if (index > 0) {\n                const double objbst = getDoubleInfo(GRB_CB_MIP_OBJBST);\n                const double objbnd = getDoubleInfo(GRB_CB_MIP_OBJBND);\n\n                if (objbst == GRB_INFINITY)\n                    return;\n\n                const double currentGap = std::fabs(objbnd - objbst) / std::fabs(objbst);\n\n                if (currentGap < gaps[index - 1]) {\n                    std::cout << \"Stop early - Gap: \" << currentGap << \" < \" << gaps[index - 1] << \" gap achieved after \" << times[index - 1] << \" seconds\" << std::endl;\n                    abort();\n                }\n            }\n        }\n    } catch (GRBException e) {\n        std::cout << \"Error number: \" << e.getErrorCode() << std::endl;\n        std::cout << e.getMessage() << std::endl;\n    } catch (...) {\n        std::cout << \"Error during callback\" << std::endl;\n    }\n}\n\n}\n}\n\n\n"
  },
  {
    "path": "libs/quadretopology/quadretopology/includes/qr_ilp.h",
    "content": "/***************************************************************************/\n/* Copyright(C) 2021\n\n\nThe authors of\n\nReliable Feature-Line Driven Quad-Remeshing\nSiggraph 2021\n\n\n All rights reserved.\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <https://www.gnu.org/licenses/>.\n****************************************************************************/\n\n#ifndef QR_ILP_H\n#define QR_ILP_H\n\n#include \"qr_charts.h\"\n#include \"qr_parameters.h\"\n\n#include <gurobi_c++.h>\n\n#define ILP_FIND_SUBDIVISION -1\n#define ILP_IGNORE -2\n\nnamespace QuadRetopology {\n\nenum ILPStatus { SOLUTIONFOUND, SOLUTIONWRONG, INFEASIBLE };\n\nnamespace internal {\n\nvoid solveILP(\n        const ChartData& chartData,     \n        const std::vector<double>& chartEdgeLength,\n        const ILPMethod& method,\n        const double alpha,\n        const bool isometry,\n        const bool regularityQuadrilaterals,\n        const bool regularityNonQuadrilaterals,\n        const double regularityNonQuadrilateralsWeight,\n        const bool alignSingularities,\n        const double alignSingularitiesWeight,\n        const int repeatLosingConstraintsIterations,\n        const bool repeatLosingConstraintsQuads,\n        const bool repeatLosingConstraintsNonQuads,\n        const bool repeatLosingConstraintsAlign,\n        const bool feasibilityFix,\n        const bool hardParityConstraint,\n        const double timeLimit,\n        const double gapLimit,\n        const std::vector<float>& callbackTimeLimit,\n        const std::vector<float>& callbackGapLimit,\n        double& gap,\n        ILPStatus& status,\n        std::vector<int>& ilpResults);\n\n}\n}\n\n#include \"qr_ilp.cpp\"\n\n#endif // QR_ILP_H\n"
  },
  {
    "path": "libs/quadretopology/quadretopology/includes/qr_mapping.cpp",
    "content": "/***************************************************************************/\n/* Copyright(C) 2021\n\n\nThe authors of\n\nReliable Feature-Line Driven Quad-Remeshing\nSiggraph 2021\n\n\n All rights reserved.\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <https://www.gnu.org/licenses/>.\n****************************************************************************/\n\n#include \"qr_mapping.h\"\n\n#include <igl/lscm.h>\n\n#include <igl/AABB.h>\n#include <igl/in_element.h>\n\n#include <vcg/space/distance3.h>\n\nnamespace QuadRetopology {\nnamespace internal {\n\nEigen::VectorXd pointToBarycentric(\n        const Eigen::VectorXd& t1,\n        const Eigen::VectorXd& t2,\n        const Eigen::VectorXd& t3,\n        const Eigen::VectorXd& p);\n\nEigen::VectorXd barycentricToPoint(\n        const Eigen::VectorXd& t1,\n        const Eigen::VectorXd& t2,\n        const Eigen::VectorXd& t3,\n        const Eigen::VectorXd& p);\n\nbool findParametricValueInSegment(\n        const Eigen::VectorXd& s1,\n        const Eigen::VectorXd& s2,\n        const Eigen::VectorXd& p,\n        Eigen::VectorXd& t);\n\nvoid computeQuadrangulation(\n        const Eigen::MatrixXd& chartV,\n        const Eigen::MatrixXi& chartF,\n        const Eigen::MatrixXd& patchV,\n        const Eigen::MatrixXi& patchF,\n        const std::vector<std::vector<std::vector<size_t>>>& chartSideVertices,\n        const std::vector<std::vector<double>>& chartSideLength,\n        const std::vector<std::vector<size_t>>& chartSideSubdivision,\n        const std::vector<std::vector<size_t>>& patchSides,\n        Eigen::MatrixXd& uvMapV,\n        Eigen::MatrixXi& uvMapF,\n        Eigen::MatrixXd& quadrangulationV,\n        Eigen::MatrixXi& quadrangulationF)\n{\n    Eigen::VectorXi b;\n    Eigen::MatrixXd bc;\n\n    int chartBorderSize = 0;\n    for (const std::vector<std::vector<size_t>>& side : chartSideVertices) {\n        for (const std::vector<size_t>& subside : side) {\n            chartBorderSize += subside.size()-1;\n        }\n    }\n\n    b.resize(chartBorderSize);\n    bc.resize(chartBorderSize, 2);\n\n    int fixedId = 0;\n    for (size_t i = 0; i < chartSideVertices.size(); i++) {\n        size_t patchStart = 0;\n\n        for (size_t j = 0; j < chartSideVertices[i].size(); j++) {\n            size_t patchEnd = patchStart + chartSideSubdivision[i][j];\n\n            //Get first and last corner of the side\n            const size_t& patchFirstId = patchSides[i][patchStart];\n            const size_t& patchLastId = patchSides[i][patchEnd];\n\n            //Coordinate of the current corner\n            const Eigen::VectorXd& patchFirstCoord = patchV.row(patchFirstId);\n            const Eigen::VectorXd& patchLastCoord = patchV.row(patchLastId);\n\n            //Get vector of the side\n            const Eigen::VectorXd vector = patchLastCoord - patchFirstCoord;\n\n            double currentLength = 0;\n            for (size_t k = 0; k < chartSideVertices[i][j].size() - 1; k++) {\n                if (k > 0) {\n                    currentLength += (chartV.row(chartSideVertices[i][j][k]) - chartV.row(chartSideVertices[i][j][k-1])).norm();\n                }\n\n                size_t vId = chartSideVertices[i][j][k];\n\n                double lengthRatio = currentLength / chartSideLength[i][j];\n                assert(lengthRatio >= 0 && lengthRatio < 1);\n\n                const Eigen::VectorXd uv = patchFirstCoord + (vector * lengthRatio);\n\n                b(fixedId) = static_cast<int>(vId);\n\n                bc(fixedId, 0) = uv(0);\n                bc(fixedId, 1) = uv(1);\n\n                fixedId++;\n            }\n\n            patchStart += chartSideSubdivision[i][j];\n        }\n    }\n\n    if (b.size() < chartV.rows()) {\n        //Apply Least Square Conformal Maps\n        igl::lscm(chartV, chartF, b, bc, uvMapV);\n\n        //Flip x with y (problem with libigl)\n        for (int i = 0; i < uvMapV.rows(); i++) {\n            uvMapV.row(i).reverseInPlace();\n        }\n    }\n    else {\n        //Get the UV map with all fixed border\n        uvMapV.resize(chartV.rows(), 2);\n        for (int i = 0; i < bc.rows(); i++) {\n            uvMapV.row(b(i)) = bc.row(i);\n        }\n\n#ifndef NDEBUG\n        std::cout << \"No fixed border! UVMap setted as bc.\" << std::endl;\n#endif\n    }\n\n    uvMapF = chartF;\n\n#ifndef NDEBUG\n    for (int i = 0; i < uvMapF.rows(); ++i) {\n        Eigen::VectorXd v1 = uvMapV.row(uvMapF(i,0));\n        Eigen::VectorXd v2 = uvMapV.row(uvMapF(i,1));\n        Eigen::VectorXd v3 = uvMapV.row(uvMapF(i,2));\n        double A = std::abs(\n            (v1.x()*v2.y() - v2.x()*v1.y()) +\n            (v2.x()*v3.y() - v3.x()*v2.y()) +\n            (v3.x()*v1.y() - v1.x()*v3.y())\n        ) / 2.0;\n        if (A <= 0) {\n            std::cout << \"Warning: degenerate triangle found in UV mapping!\" << std::endl;\n        }\n    }\n#endif\n\n    //AABB tree for point location\n    igl::AABB<Eigen::MatrixXd, 2> tree;\n    tree.init(uvMapV, uvMapF);\n\n    quadrangulationV.resize(patchV.rows(), 3);\n    for (int i = 0; i < patchV.rows(); i++) {\n        const Eigen::VectorXd& Q = patchV.row(i);\n\n        Eigen::MatrixXd Q2D(1,2);\n        Q2D(0,0) = Q.x();\n        Q2D(0,1) = Q.y();\n\n        int triIndex;\n        if (uvMapF.rows() == 1) {\n            triIndex = 0;\n        }\n        else {\n            Eigen::VectorXi I;\n            igl::in_element(uvMapV, uvMapF, Q2D, tree, I);\n\n            triIndex = I(0);\n\n            if (triIndex < 0) {\n                Eigen::VectorXd sqrD;\n                Eigen::MatrixXd C;\n                tree.squared_distance(uvMapV, uvMapF, Q2D, sqrD, I, C);\n\n                double currentSquareDistance = sqrD(0);\n                triIndex = I(0);\n                for (int k = 1; k < I.size(); k++) {\n                    if (sqrD(k) < currentSquareDistance) {\n                        triIndex = I(k);\n                        currentSquareDistance = sqrD(k);\n                    }\n                }\n\n                assert(triIndex > -1);\n            }\n        }\n\n        const Eigen::VectorXi& tri = chartF.row(triIndex);\n\n        Eigen::VectorXd baryc = pointToBarycentric(\n                    uvMapV.row(tri(0)),\n                    uvMapV.row(tri(1)),\n                    uvMapV.row(tri(2)),\n                    Q2D.row(0));\n\n        Eigen::VectorXd mappedPoint = barycentricToPoint(\n                    chartV.row(tri(0)),\n                    chartV.row(tri(1)),\n                    chartV.row(tri(2)),\n                    baryc);\n\n        quadrangulationV.row(i) = mappedPoint;\n    }\n\n    quadrangulationF = patchF;\n}\n\n\nEigen::VectorXd pointToBarycentric(\n        const Eigen::VectorXd& t1,\n        const Eigen::VectorXd& t2,\n        const Eigen::VectorXd& t3,\n        const Eigen::VectorXd& p)\n{\n    const double eps = 0.0001;\n    double det = (t2.y() - t3.y()) * (t1.x() - t3.x()) + (t3.x() - t2.x()) * (t1.y() - t3.y());\n\n    Eigen::VectorXd baryc(3);\n\n    baryc(0) = ((t2.y() - t3.y()) * (p.x() - t3.x()) + (t3.x() - t2.x()) * (p.y() - t3.y())) / det;\n    baryc(1) = ((t3.y() - t1.y()) * (p.x() - t3.x()) + (t1.x() - t3.x()) * (p.y() - t3.y())) / det;\n\n    if (baryc(0) > 1.0 + eps || baryc(1) > 1.0 + eps || baryc(0) < 0.0 - eps || baryc(1) < 0.0 - eps) {\n#ifndef NDEBUG\n        std::cout << \"Valid barycenter coordinates not found.\" << std::endl;\n#endif\n\n        vcg::Point3d t1vcg(t1.x(), t1.y(), 0);\n        vcg::Point3d t2vcg(t2.x(), t2.y(), 0);\n        vcg::Point3d t3vcg(t3.x(), t3.y(), 0);\n        vcg::Point3d pvcg(p.x(), p.y(), 0);\n        vcg::Segment3d seg1(t1vcg, t2vcg);\n        vcg::Segment3d seg2(t2vcg, t3vcg);\n        vcg::Segment3d seg3(t3vcg, t1vcg);\n\n        vcg::Point3d vcgClosestPoint1;\n        vcg::Point3d vcgClosestPoint2;\n        vcg::Point3d vcgClosestPoint3;\n        double dist1;\n        double dist2;\n        double dist3;\n\n        vcg::SegmentPointDistance(seg1, pvcg, vcgClosestPoint1, dist1);\n        vcg::SegmentPointDistance(seg2, pvcg, vcgClosestPoint2, dist2);\n        vcg::SegmentPointDistance(seg3, pvcg, vcgClosestPoint3, dist3);\n\n        Eigen::VectorXd paramT(2);\n        Eigen::VectorXd closestPoint(2);\n        if (dist1 <= dist2 && dist1 <= dist3) {\n            closestPoint.x() = vcgClosestPoint1.X();\n            closestPoint.y() = vcgClosestPoint1.Y();\n\n            findParametricValueInSegment(t1,t2,closestPoint,paramT);\n\n            baryc(0) = 1 - paramT.x();\n            baryc(1) = paramT.x();\n            baryc(2) = 0;\n        }\n        else if (dist2 <= dist1 && dist2 <= dist3) {\n            closestPoint.x() = vcgClosestPoint2.X();\n            closestPoint.y() = vcgClosestPoint2.Y();\n\n            findParametricValueInSegment(t2,t3,closestPoint,paramT);\n\n            baryc(0) = 0;\n            baryc(1) = 1 - paramT.x();\n            baryc(2) = paramT.x();\n        }\n        else {\n            closestPoint.x() = vcgClosestPoint3.X();\n            closestPoint.y() = vcgClosestPoint3.Y();\n\n            findParametricValueInSegment(t3,t1,closestPoint,paramT);\n\n            baryc(0) = paramT.x();\n            baryc(1) = 0;\n            baryc(2) = 1 - paramT.x();\n        }\n    }\n    else {\n        baryc(2) = 1.0 - baryc(0) - baryc(1);\n    }\n\n    if (baryc(0) + baryc(1) + baryc(2) < 1.0 - eps || baryc(0) + baryc(1) + baryc(2) > 1.0 + eps) {\n        baryc(0) = baryc(1) =  baryc(2) = 1.0/3.0;\n#ifndef NDEBUG\n        std::cout << \"Barycenter sum not 1!\" << std::endl;\n#endif\n    }\n\n    if (std::isnan(baryc(0)) || std::isnan(baryc(1)) || std::isnan(baryc(2))) {\n        baryc(0) = baryc(1) =  baryc(2) = 1.0/3.0;\n#ifndef NDEBUG\n        std::cout << \"Barycenter nan!\" << std::endl;\n#endif\n    }\n\n    baryc(0) = std::max(std::min(baryc(0), 1.0), 0.0);\n    baryc(1) = std::max(std::min(baryc(1), 1.0), 0.0);\n    baryc(2) = std::max(std::min(baryc(2), 1.0), 0.0);\n\n    return baryc;\n}\n\nEigen::VectorXd barycentricToPoint(\n        const Eigen::VectorXd& t1,\n        const Eigen::VectorXd& t2,\n        const Eigen::VectorXd& t3,\n        const Eigen::VectorXd& baryc)\n{\n    Eigen::VectorXd coordinates =\n            t1 * baryc(0) +\n            t2 * baryc(1) +\n            t3 * baryc(2);\n\n    return coordinates;\n}\n\nbool findParametricValueInSegment(\n        const Eigen::VectorXd& s1,\n        const Eigen::VectorXd& s2,\n        const Eigen::VectorXd& p,\n        Eigen::VectorXd& t)\n{\n    const double eps = 0.0001;\n\n    t.x() = (p.x() - s1.x())/(s2.x() - s1.x());\n    t.y() = (p.y() - s1.y())/(s2.y() - s1.y());\n\n    //Return true if it is collinear and inside the segment\n    return  t.x() >= 0 - eps &&\n            t.x() <= 1 + eps &&\n            t.y() >= 0 - eps &&\n            t.y() <= 1 + eps &&\n            t.x() - eps <= t.y() + eps &&\n            t.x() + eps >= t.y() - eps;\n\n}\n\n}\n}\n"
  },
  {
    "path": "libs/quadretopology/quadretopology/includes/qr_mapping.h",
    "content": "/***************************************************************************/\n/* Copyright(C) 2021\n\n\nThe authors of\n\nReliable Feature-Line Driven Quad-Remeshing\nSiggraph 2021\n\n\n All rights reserved.\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <https://www.gnu.org/licenses/>.\n****************************************************************************/\n\n#ifndef QR_MAPPING_H\n#define QR_MAPPING_H\n\n#include <vector>\n\n#include <Eigen/Core>\n\nnamespace QuadRetopology {\nnamespace internal {\n\nvoid computeQuadrangulation(\n        const Eigen::MatrixXd& chartV,\n        const Eigen::MatrixXi& chartF,\n        const Eigen::MatrixXd& patchV,\n        const Eigen::MatrixXi& patchF,\n        const std::vector<std::vector<std::vector<size_t>>>& chartSideVertices,\n        const std::vector<std::vector<double>>& chartSideLength,\n        const std::vector<std::vector<size_t>>& chartSideSubdivision,\n        const std::vector<std::vector<size_t>>& patchSides,\n        Eigen::MatrixXd& uvMapV,\n        Eigen::MatrixXi& uvMapF,\n        Eigen::MatrixXd& quadrangulationV,\n        Eigen::MatrixXi& quadrangulationF);\n\n}\n\n}\n\n\n#endif // QR_MAPPING_H\n"
  },
  {
    "path": "libs/quadretopology/quadretopology/includes/qr_parameters.h",
    "content": "/***************************************************************************/\n/* Copyright(C) 2021\n\n\nThe authors of\n\nReliable Feature-Line Driven Quad-Remeshing\nSiggraph 2021\n\n\n All rights reserved.\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <https://www.gnu.org/licenses/>.\n****************************************************************************/\n\n#ifndef QR_PARAMETERS_H\n#define QR_PARAMETERS_H\n\n#include <vector>\n\n#define DEFAULTINITIALREMESHING true\n#define DEFAULTEDGEFACTOR 1\n#define DEFAULTREPROJECT true\n#define DEFAULTSPLITCONCAVES false\n#define DEFAULTFINALSMOOTHING true\n\n#define DEFAULTILPMETHOD QuadRetopology::ILPMethod::LEASTSQUARES\n#define DEFAULTALPHA 0.5\n#define DEFAULTISOMETRY true\n#define DEFAULTREGULARITYQUADRILATERALS true\n#define DEFAULTREGULARITYNONQUADRILATERALS true\n#define DEFAULTREGULARITYNONQUADRILATERALSWEIGHT 0.9\n#define DEFAULTALIGNSINGULARITIES false\n#define DEFAULTALIGNSINGULARITIESWEIGHT 0.01\n#define DEFAULTREPEATLOSINGCONSTRAINTSITERATIONS 0\n#define DEFAULTREPEATLOSINGCONSTRAINTSQUADS false\n#define DEFAULTREPEATLOSINGCONSTRAINTSNONQUADS false\n#define DEFAULTREPEATLOSINGCONSTRAINTSALIGN false\n#define DEFAULTHARDPARITYCONSTRAINT true\n#define DEFAULTFEASIBILITYFIX false\n\n#define DEFAULTTIMELIMIT 60 //1 minute\n#define DEFAULTGAPLIMIT 0.0 //Optimal\n#define DEFAULTMINIMUMGAP 0.2\n\n#define DEFAULTCHARTSMOOTHINGITERATIONS 5\n#define DEFAULTQUADRANGULATIONFIXEDSMOOTHINGITERATIONS 5\n#define DEFAULTQUADRANGULATIONNONFIXEDSMOOTHINGITERATIONS 5\n#define DEFAULTDOUBLETREMOVAL true\n\n#define DEFAULTRESULTSMOOTHINGITERATIONS 5\n#define DEFAULTRESULTSMOOTHINGNRING 3\n#define DEFAULTRESULTSMOOTHINGLAPLACIANITERATIONS 2\n#define DEFAULTRESULTSMOOTHINGLAPLACIANNRING 3\n\nnamespace QuadRetopology {\n\nenum ILPMethod { LEASTSQUARES, ABS };\n\nstruct Parameters {\n    bool initialRemeshing;\n    double initialRemeshingEdgeFactor;\n    bool reproject;\n    bool splitConcaves;\n    bool finalSmoothing;\n    \n    ILPMethod ilpMethod;\n    double alpha;\n    bool isometry;\n    bool regularityQuadrilaterals;\n    bool regularityNonQuadrilaterals;\n    double regularityNonQuadrilateralsWeight;\n    bool alignSingularities;\n    double alignSingularitiesWeight;\n    bool repeatLosingConstraintsIterations;\n    bool repeatLosingConstraintsQuads;\n    bool repeatLosingConstraintsNonQuads;\n    bool repeatLosingConstraintsAlign;\n    bool feasibilityFix;\n    bool hardParityConstraint;\n\n    double timeLimit;\n    double gapLimit;\n    double minimumGap;\n    std::vector<float> callbackTimeLimit;\n    std::vector<float> callbackGapLimit;\n\n    int chartSmoothingIterations;\n    int quadrangulationFixedSmoothingIterations;\n    int quadrangulationNonFixedSmoothingIterations;\n    bool doubletRemoval;\n    \n    int resultSmoothingIterations;\n    double resultSmoothingNRing;\n    int resultSmoothingLaplacianIterations;\n    double resultSmoothingLaplacianNRing;    \n\n    Parameters() {\n        initialRemeshing = DEFAULTINITIALREMESHING;\n        initialRemeshingEdgeFactor = DEFAULTEDGEFACTOR;\n        reproject = DEFAULTREPROJECT;\n        splitConcaves = DEFAULTSPLITCONCAVES;\n        finalSmoothing = DEFAULTFINALSMOOTHING;\n                \n        ilpMethod = DEFAULTILPMETHOD;\n        alpha = DEFAULTALPHA;\n\n        isometry = DEFAULTISOMETRY;\n        regularityQuadrilaterals = DEFAULTREGULARITYQUADRILATERALS;\n        regularityNonQuadrilaterals = DEFAULTREGULARITYNONQUADRILATERALS;\n        regularityNonQuadrilateralsWeight = DEFAULTREGULARITYNONQUADRILATERALSWEIGHT;\n        alignSingularities = DEFAULTALIGNSINGULARITIES;\n        alignSingularitiesWeight = DEFAULTALIGNSINGULARITIESWEIGHT;\n        repeatLosingConstraintsIterations = DEFAULTREPEATLOSINGCONSTRAINTSITERATIONS;\n        repeatLosingConstraintsQuads = DEFAULTREPEATLOSINGCONSTRAINTSQUADS;\n        repeatLosingConstraintsNonQuads = DEFAULTREPEATLOSINGCONSTRAINTSNONQUADS;\n        repeatLosingConstraintsAlign = DEFAULTREPEATLOSINGCONSTRAINTSALIGN;\n        hardParityConstraint = DEFAULTHARDPARITYCONSTRAINT;\n        feasibilityFix = DEFAULTFEASIBILITYFIX;\n\n        timeLimit = DEFAULTTIMELIMIT;\n        gapLimit = DEFAULTGAPLIMIT;\n        minimumGap = DEFAULTMINIMUMGAP;\n\n        chartSmoothingIterations = DEFAULTCHARTSMOOTHINGITERATIONS;\n        quadrangulationFixedSmoothingIterations = DEFAULTQUADRANGULATIONFIXEDSMOOTHINGITERATIONS;\n        quadrangulationNonFixedSmoothingIterations = DEFAULTQUADRANGULATIONNONFIXEDSMOOTHINGITERATIONS;\n        doubletRemoval = DEFAULTDOUBLETREMOVAL;\n        \n        resultSmoothingIterations = DEFAULTRESULTSMOOTHINGITERATIONS;\n        resultSmoothingNRing = DEFAULTRESULTSMOOTHINGNRING;\n        resultSmoothingLaplacianIterations = DEFAULTRESULTSMOOTHINGLAPLACIANITERATIONS;\n        resultSmoothingLaplacianNRing = DEFAULTRESULTSMOOTHINGLAPLACIANNRING;\n    }\n};\n\n}\n\n#endif // QR_PARAMETERS_H\n"
  },
  {
    "path": "libs/quadretopology/quadretopology/includes/qr_patterns.cpp",
    "content": "/***************************************************************************/\n/* Copyright(C) 2021\n\n\nThe authors of\n\nReliable Feature-Line Driven Quad-Remeshing\nSiggraph 2021\n\n\n All rights reserved.\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <https://www.gnu.org/licenses/>.\n****************************************************************************/\n\n#include \"qr_patterns.h\"\n\n#include \"qr_convert.h\"\n\n#include <patterns/generate_patch.h>\n\nnamespace QuadRetopology {\nnamespace internal {\n\ntemplate<class PolyMesh>\nvoid computePattern(\n        const Eigen::VectorXi &l,\n        Eigen::MatrixXd& patchV,\n        Eigen::MatrixXi& patchF,\n        PolyMesh& patchMesh,\n        std::vector<size_t>& borders,\n        std::vector<size_t>& corners,\n        std::vector<std::vector<size_t>>& sides)\n{\n    long int num_sides = l.size();\n    if (num_sides < 2 || 6 < num_sides) {\n        std::cout << \"num_sides=\" << num_sides << \" is unsupported.\\n\";\n        return;\n    }\n    if (l.sum() % 2 != 0) {\n        std::cout << \"The sum of number of edge subdivisions should be even.\\n\";\n        return;\n    }\n    if (l.sum() < 4) {\n        std::cout << \"Input numbers are too small.\\n\";\n        return;\n    }\n\n    patchgen::PatchParam param;\n    patterns::Patch patch;\n    patterns::generatePatch(l, param, patch);\n\n    corners.resize(l.size());\n    patchV.resize(patch.n_vertices(), 3);\n\n    for (patterns::Patch::VertexIter v_it=patch.vertices_begin(); v_it!=patch.vertices_end(); ++v_it) {\n        const int& corner_index = patch.data(*v_it).patchgen.corner_index;\n        if (corner_index >= 0) {\n            corners[corner_index] = v_it->idx();\n        }\n\n        patterns::Patch::Point p = patch.point(*v_it);\n\n        patchV(v_it->idx(), 0) = p[0];\n        patchV(v_it->idx(), 1) = p[1];\n        patchV(v_it->idx(), 2) = p[2];\n    }\n\n    patchF.resize(patch.n_faces(), 4);\n    for (patterns::Patch::FaceIter f_it=patch.faces_begin(); f_it!=patch.faces_end(); ++f_it) {\n        int i = 0;\n        for (patterns::Patch::FaceVertexIter fv_it = patch.fv_iter(*f_it); fv_it.is_valid(); ++fv_it) {\n            patchF(f_it->idx(), i) = fv_it->idx();\n            ++i;\n        }\n    }\n\n    eigenToVCG(patchV, patchF, patchMesh, 4, 3);\n\n    vcg::tri::UpdateTopology<PolyMesh>::FaceFace(patchMesh);\n\n    std::vector<size_t> nextMap(patchV.rows(), patchV.rows() + 1);\n    for (size_t i = 0; i < patchMesh.face.size(); i++) {\n        for (int j = 0; j < patchMesh.face[i].VN(); j++) {\n            if (vcg::face::IsBorder(patchMesh.face[i], j)) {\n                size_t vStartId = vcg::tri::Index(patchMesh, patchMesh.face[i].V0(j));\n                size_t vEndId = vcg::tri::Index(patchMesh, patchMesh.face[i].V1(j));\n                nextMap[vStartId] = vEndId;\n            }\n        }\n    }\n\n    size_t currentId = corners[0];\n    do {\n        borders.push_back(currentId);\n        currentId = nextMap[currentId];\n    } while (currentId != corners[0]);\n\n\n    size_t startCornerId = 0;\n\n    size_t cId = 0;\n    size_t bId = 0;\n    assert(borders[bId] == corners[cId]);\n\n    size_t sId = 0;\n    sides.resize(corners.size());\n    do {\n        std::vector<size_t> side;\n\n        cId = (cId + 1) % corners.size();\n\n        while (borders[bId] != corners[cId]) {\n            side.push_back(borders[bId]);\n            bId = (bId + 1) % borders.size();\n        }\n\n        assert(borders[bId] == corners[cId]);\n        assert(side[side.size() - 1] != corners[cId]);\n\n        side.push_back(corners[cId]);\n\n        sides[sId] = side;\n        sId++;\n    } while (cId != startCornerId);\n}\n\n}\n}\n"
  },
  {
    "path": "libs/quadretopology/quadretopology/includes/qr_patterns.h",
    "content": "/***************************************************************************/\n/* Copyright(C) 2021\n\n\nThe authors of\n\nReliable Feature-Line Driven Quad-Remeshing\nSiggraph 2021\n\n\n All rights reserved.\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <https://www.gnu.org/licenses/>.\n****************************************************************************/\n\n#ifndef QR_PATTERNS_H\n#define QR_PATTERNS_H\n\n#include <vector>\n\n#include <Eigen/Core>\n\nnamespace QuadRetopology {\nnamespace internal {\n\ntemplate<class PolyMesh>\nvoid computePattern(\n        const Eigen::VectorXi &l,\n        Eigen::MatrixXd& patchV,\n        Eigen::MatrixXi& patchF,\n        PolyMesh& patchMesh,\n        std::vector<size_t>& borders,\n        std::vector<size_t>& corners,\n        std::vector<std::vector<size_t>>& sides);\n\n}\n}\n\n#include \"qr_patterns.cpp\"\n\n#endif // QR_PATTERNS_H\n"
  },
  {
    "path": "libs/quadretopology/quadretopology/includes/qr_utils.cpp",
    "content": "/***************************************************************************/\n/* Copyright(C) 2021\n\n\nThe authors of\n\nReliable Feature-Line Driven Quad-Remeshing\nSiggraph 2021\n\n\n All rights reserved.\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <https://www.gnu.org/licenses/>.\n****************************************************************************/\n\n#include \"qr_utils.h\"\n\n#include <vector>\n\n#include <vcg/complex/complex.h>\n#include <vcg/complex/algorithms/update/flag.h>\n#include <vcg/complex/algorithms/update/topology.h>\n#include <vcg/complex/algorithms/update/bounding.h>\n#include <vcg/complex/algorithms/update/normal.h>\n#include <vcg/complex/algorithms/update/quality.h>\n#include <vcg/complex/algorithms/polygonal_algorithms.h>\n#include <vcg/complex/algorithms/geodesic.h>\n#include <vcg/space/distance3.h>\n\nnamespace QuadRetopology {\nnamespace internal {\n\ntemplate <class PolyMeshType>\nint removeUnreferencedVertices(PolyMeshType& m, bool onlySelected)\n{\n    int deleted = 0;\n\n    std::vector<bool> referredVec(m.vert.size(),false);\n\n    for(auto fi = m.face.begin(); fi != m.face.end(); ++fi) {\n        if(fi->IsD())\n            continue;\n\n        for(int j=0; j < fi->VN(); ++j) {\n            referredVec[vcg::tri::Index(m, fi->V(j))]=true;\n        }\n    }\n\n    for(auto vi=m.vert.begin();vi!=m.vert.end();++vi) {\n        if(vi->IsD())\n            continue;\n\n        if(onlySelected && !vi->IsS())\n            continue;\n\n        if(!referredVec[vcg::tri::Index(m,*vi)]) {\n            vcg::tri::Allocator<PolyMeshType>::DeleteVertex(m,*vi);\n            ++deleted;\n        }\n    }\n\n    return deleted;\n}\n\ntemplate <class PolyMeshType, class ScalarType>\nint clusterVertices(PolyMeshType &mesh, const bool onlySelected, const ScalarType radius)\n{\n    typedef typename PolyMeshType::CoordType CoordType;\n    typedef typename PolyMeshType::VertexPointer VertexPointer;\n\n    size_t nVertices = mesh.vert.size();\n\n    if(nVertices == 0)\n        return 0;\n\n    int clustered = 0;\n\n    std::vector<VertexPointer> vertices;\n\n    for(size_t i = 0; i < mesh.vert.size(); i++) {\n        if (mesh.vert[i].IsD())\n            continue;\n\n        vertices.push_back(&mesh.vert[i]);\n    }\n\n    std::sort(vertices.begin(), vertices.end(), [] (VertexPointer const &a, VertexPointer const &b)\n    {\n        return a->cP() < b->cP();\n    });\n\n    for(size_t i = 0; i < vertices.size(); i++) {\n        if (vertices[i]->IsD())\n            continue;\n\n        const CoordType& p = vertices[i]->cP();\n\n        std::vector<VertexPointer> cluster;\n\n        cluster.push_back(vertices[i]);\n\n        bool done = false;\n        for(size_t j = i+1; !done && j < vertices.size(); j++) {\n            if (vertices[j]->IsD())\n                continue;\n\n            const CoordType& q = vertices[j]->cP();\n\n            double distanceX = std::abs(q.X() - p.X());\n            double distanceY = std::abs(q.Y() - p.Y());\n            double distanceZ = std::abs(q.Z() - p.Z());\n\n            if (distanceX > radius && distanceY > radius && distanceZ > radius) {\n                done = true;\n            }\n            else if ((p - q).Norm() <= radius) {\n                cluster.push_back(vertices[j]);\n            }\n        }\n\n        if (cluster.size() > 1) {\n            CoordType point = cluster[0]->cP();\n\n            if (onlySelected) {\n                for(size_t j = 0; j < cluster.size(); j++) {\n                    if (!cluster[j]->IsS()) {\n                        point = cluster[j]->cP();\n                        break;\n                    }\n                }\n            }\n\n            for(size_t j = 0; j < cluster.size(); j++) {\n                if (cluster[j]->cP() != point && (!onlySelected || cluster[j]->IsS())) {\n                    cluster[j]->P() = point;\n\n                    clustered++;\n                }\n            }\n        }\n    }\n\n    return clustered;\n}\n\ntemplate <class PolyMeshType>\nint removeDegenerateFaces(PolyMeshType& mesh, bool onlySelected, bool alwaysDelete)\n{\n    typedef typename PolyMeshType::FaceIterator FaceIterator;\n    typedef typename PolyMeshType::VertexPointer VertexPointer;\n    int count_fd = 0;\n\n    for(FaceIterator fi = mesh.face.begin(); fi != mesh.face.end(); ++fi) {\n        if(fi->IsD())\n            continue;\n\n        if(onlySelected && !fi->IsS())\n            continue;\n\n        int numRemainingVertices = fi->VN();\n\n        for (int j1 = 0; j1 < numRemainingVertices - 1; ++j1) {\n            for (int j2 = j1 + 1; j2 < numRemainingVertices; ++j2) {\n                if (fi->V(j1) == fi->V(j2)) {\n                    for (int k = j2; k < numRemainingVertices - 1; ++k) {\n                        fi->V0(k) = fi->V1(k);\n                    }\n\n                    numRemainingVertices--;\n\n                    j2--;\n                }\n            }\n        }\n\n        if (numRemainingVertices < fi->VN()) {\n            if(alwaysDelete || numRemainingVertices < 3) {\n                vcg::tri::Allocator<PolyMeshType>::DeleteFace(mesh,*fi);\n            }\n            else {\n                std::vector<VertexPointer> vp(numRemainingVertices);\n\n                for (int j = 0; j < numRemainingVertices; j++) {\n                    vp[j] = fi->V(j);\n                }\n\n                fi->Dealloc();\n                fi->Alloc(numRemainingVertices);\n\n                for (int j = 0; j < numRemainingVertices; j++) {\n                    fi->V(j) = vp[j];\n                }\n            }\n\n            count_fd++;\n        }\n    }\n\n    return count_fd;\n}\n\ntemplate <class PolyMeshType>\nint removeDuplicateVertices(PolyMeshType& mesh, const bool onlySelected)\n{\n    typedef typename PolyMeshType::CoordType CoordType;\n    typedef typename PolyMeshType::VertexPointer VertexPointer;\n    typedef typename PolyMeshType::VertexPointer VertexIterator;\n    typedef typename PolyMeshType::FaceIterator FaceIterator;\n\n    int deleted = 0;\n\n    std::vector<VertexPointer> vertices;\n\n    for(size_t i = 0; i < mesh.vert.size(); i++) {\n        if (mesh.vert[i].IsD())\n            continue;\n\n        vertices.push_back(&mesh.vert[i]);\n    }\n\n    std::sort(vertices.begin(), vertices.end(), [] (VertexPointer const &a, VertexPointer const &b)\n    {\n        return a->cP() < b->cP();\n    });\n\n    std::map<VertexPointer, VertexPointer> vertexMap;\n    for(size_t i = 0; i < vertices.size(); i++) {\n        if (vertices[i]->IsD())\n            continue;\n\n        const CoordType& p = vertices[i]->cP();\n\n        std::vector<VertexPointer> cluster;\n\n        cluster.push_back(vertices[i]);\n\n        bool done = false;\n        for(size_t j = i+1; !done && j < vertices.size(); j++) {\n            if (vertices[j]->IsD())\n                continue;\n\n            const CoordType& q = vertices[j]->cP();\n\n            if (p == q) {\n                cluster.push_back(vertices[j]);\n            }\n            else {\n                done = true;\n            }\n        }\n\n        if (cluster.size() > 1) {\n            size_t kept = 0;\n\n            if (onlySelected) {\n                for(size_t j = 0; j < cluster.size(); j++) {\n                    if (!cluster[j]->IsS()) {\n                        kept = j;\n                        break;\n                    }\n                }\n            }\n\n            for(size_t j = 0; j < cluster.size(); j++) {\n                if (j != kept && (!onlySelected || cluster[j]->IsS())) {\n                    vcg::tri::Allocator<PolyMeshType>::DeleteVertex(mesh, *cluster[j]);\n                    deleted++;\n\n                    vertexMap[cluster[j]] = cluster[kept];\n                }\n            }\n        }\n    }\n\n    for(FaceIterator fi = mesh.face.begin(); fi != mesh.face.end(); ++fi) {\n        if(fi->IsD())\n            continue;\n\n        for (int k = 0; k < fi->VN(); ++k) {\n            typename std::map<VertexPointer, VertexPointer>::iterator it = vertexMap.find(fi->V(k));\n            if (it != vertexMap.end()) {\n                fi->V(k) = it->second;\n            }\n        }\n    }\n\n    return deleted;\n}\n\ntemplate <class PolyMeshType>\nint removeDoubletFaces(PolyMeshType& mesh, bool onlySelected, bool recursive)\n{\n    int count = 0;\n\n    vcg::tri::UpdateTopology<PolyMeshType>::FaceFace(mesh);\n\n    bool done;\n    do {\n        done = true;\n        for (size_t i = 0; i < mesh.face.size(); ++i) {\n            if (mesh.face[i].IsD() || mesh.face[i].VN() != 4)\n                continue;\n\n            typename PolyMeshType::FacePointer face = &mesh.face[i];\n\n            for (int j1 = 0; j1 < face->VN(); ++j1) {\n                int j2 = (j1+1) % face->VN();\n                int j3 = (j1+2) % face->VN();\n                int j4 = (j1+3) % face->VN();\n\n                if (vcg::face::IsBorder(*face, j1) || vcg::face::IsBorder(*face, j2))\n                    continue;\n\n                if (face->FFp(j1) == face->FFp(j2)) {\n                    typename PolyMeshType::FacePointer adjFace = face->FFp(j2);\n\n                    if (adjFace->IsD() || adjFace->VN() != 4)\n                        continue;\n\n                    if (onlySelected && !adjFace->IsS())\n                        continue;\n\n                    int adjJ1 = adjFace->FFi(j1);\n                    int adjJ2 = (adjJ1+1) % adjFace->VN();\n                    int adjJ3 = (adjJ1+2) % adjFace->VN();\n                    int adjJ4 = (adjJ1+3) % adjFace->VN();\n\n                    //Remove warnings\n                    static_cast<void>(j3);\n                    static_cast<void>(j4);\n                    static_cast<void>(adjJ2);\n\n                    if (adjFace->FFp(adjJ1) != face || adjFace->FFp(adjJ4) != face) //Non manifoldness (it should not happen)\n                        continue;\n\n                    assert(face->V(j1) == adjFace->V(adjJ2) && face->V(j2) == adjFace->V(adjJ1) && face->V(j3) == adjFace->V(adjJ4));\n\n                    face->V(j2) = adjFace->V(adjJ3);\n\n                    vcg::tri::Allocator<PolyMeshType>::DeleteFace(mesh, *adjFace);\n                    count++;\n\n                    done = false;\n                }\n            }\n        }\n        if (recursive && !done) {\n            vcg::tri::UpdateTopology<PolyMeshType>::FaceFace(mesh);\n        }\n    } while (recursive && !done);\n\n    return count;\n}\n\nbool findVertexChainPathRecursive(\n        const size_t& vCurrentId,\n        const size_t& vStartId,\n        const std::vector<std::vector<size_t>>& vertexNextMap,\n        std::vector<size_t>& nextConfiguration);\n\n\ntemplate <class MeshType>\nvoid updateAllMeshAttributes(MeshType &mesh)\n{\n    vcg::tri::UpdateNormal<MeshType>::PerFaceNormalized(mesh);\n    vcg::tri::UpdateNormal<MeshType>::PerVertexNormalized(mesh);\n    vcg::tri::UpdateBounding<MeshType>::Box(mesh);\n    vcg::tri::UpdateTopology<MeshType>::FaceFace(mesh);\n    vcg::tri::UpdateTopology<MeshType>::VertexFace(mesh);\n    vcg::tri::UpdateFlags<MeshType>::FaceBorderFromFF(mesh);\n    vcg::tri::UpdateFlags<MeshType>::VertexBorderFromNone(mesh);\n}\n\ntemplate <class MeshType>\nstd::vector<std::vector<size_t>> findConnectedComponents(\n        const MeshType &mesh)\n{\n    std::vector<std::vector<size_t>> components;\n\n    std::set<size_t> visited;\n\n    for (size_t i = 0; i < mesh.face.size(); i++) {\n        std::stack<size_t> stack;\n\n        //If face has not been visited\n        if (visited.find(i) == visited.end()) {\n            stack.push(i);\n\n            std::vector<size_t> facesInComponents;\n            do {\n                size_t fId = stack.top();\n                stack.pop();\n\n                if (visited.find(fId) == visited.end()) {\n                    facesInComponents.push_back(fId);\n                    visited.insert(fId);\n\n                    for (size_t j = 0; j < mesh.face[fId].VN(); j++) {\n                        if (!vcg::face::IsBorder(mesh.face[fId], j)) {\n                            size_t adjFId = vcg::tri::Index(mesh, mesh.face[fId].cFFp(j));\n\n                            if (visited.find(adjFId) == visited.end()) {\n                                stack.push(adjFId);\n                            }\n                        }\n                    }\n                }\n            } while (!stack.empty());\n            components.push_back(facesInComponents);\n        }\n    }\n\n#ifndef NDEBUG\n    //Check unique faces in components\n    for (size_t i = 0; i < components.size(); i++)\n    {\n        std::set<size_t> checkComponentsUnique(components[i].begin(), components[i].end());\n        assert(components[i].size() == checkComponentsUnique.size());\n    }\n#endif\n\n    return components;\n}\n\n\n\ntemplate<class MeshType>\nvoid LaplacianPos(MeshType &poly_m,std::vector<typename MeshType::CoordType> &AvVert)\n{\n    //cumulate step\n    AvVert.clear();\n    AvVert.resize(poly_m.vert.size(),typename MeshType::CoordType(0,0,0));\n    std::vector<typename MeshType::ScalarType> AvSum(poly_m.vert.size(),0);\n    for (size_t i=0;i<poly_m.face.size();i++)\n        for (size_t j=0;j<(size_t)poly_m.face[i].VN();j++)\n        {\n            //get current vertex\n            typename MeshType::VertexType *currV=poly_m.face[i].V(j);\n            //and its position\n            typename MeshType::CoordType currP=currV->P();\n            //cumulate over other positions\n            typename MeshType::ScalarType W=vcg::PolyArea(poly_m.face[i]);\n            //assert(W!=0);\n            for (size_t k=0;k<(size_t)poly_m.face[i].VN();k++)\n            {\n                if (k==j) continue;\n                int IndexV=vcg::tri::Index(poly_m,poly_m.face[i].V(k));\n                AvVert[IndexV]+=currP*W;\n                AvSum[IndexV]+=W;\n            }\n        }\n\n    //average step\n    for (size_t i=0;i<poly_m.vert.size();i++)\n    {\n        if (AvSum[i]==0)continue;\n        AvVert[i]/=AvSum[i];\n    }\n}\n\ntemplate <class MeshType>\nvoid LaplacianGeodesicSmoothing(\n        MeshType &poly_m,\n        int nstep,\n        const double maxDistance,\n        const double minDumpS,\n        std::vector<size_t>& smoothedVertices)\n{\n    std::vector<typename MeshType::VertexPointer> seedVec;\n    for (int i = 0; i < poly_m.vert.size(); i++) {\n        if (poly_m.vert[i].IsS()) {\n            seedVec.push_back(&poly_m.vert[i]);\n        }\n    }\n    vcg::tri::UpdateQuality<MeshType>::VertexConstant(poly_m, std::numeric_limits<float>::max());\n    vcg::tri::EuclideanDistance<MeshType> ed;\n    vcg::tri::UpdateTopology<MeshType>::VertexFace(poly_m);\n    vcg::tri::Geodesic<MeshType>::Compute(poly_m,seedVec, ed);\n\n    smoothedVertices.clear();\n    std::vector<double> DampS(poly_m.vert.size());\n    for (size_t i = 0; i < poly_m.vert.size(); i++) {\n        if (!poly_m.vert[i].IsD()) {\n            if (poly_m.vert[i].IsS()) {\n                DampS[i] = minDumpS;\n            }\n            else if (poly_m.vert[i].Q() < maxDistance) {\n                smoothedVertices.push_back(i);\n                DampS[i] = poly_m.vert[i].Q() / maxDistance;\n                assert(DampS[i] >= 0 && DampS[i] <= 1);\n                DampS[i] = minDumpS + DampS[i]*(1-minDumpS);\n            }\n            else {\n                DampS[i] = std::numeric_limits<double>::max();\n            }\n        }\n    }\n\n    for (int s=0;s<nstep;s++)\n    {\n        std::vector< typename MeshType::CoordType> AvVert;\n        LaplacianPos(poly_m,AvVert);\n\n        for (size_t i=0;i<poly_m.vert.size();i++)\n        {\n            if (!poly_m.vert[i].IsD() && DampS[i] <= 1) {\n                poly_m.vert[i].P()=poly_m.vert[i].P()*DampS[i]+\n                        AvVert[i]*(1-DampS[i]);\n            }\n        }\n    }\n}\n\n\ntemplate <class MeshType>\nstd::vector<int> splitFacesInTriangles(MeshType& mesh) {\n    typedef typename MeshType::VertexType VertexType;\n\n    size_t numFaces = mesh.face.size();\n    std::vector<int> birthFace(mesh.face.size(), -1);\n\n    for (size_t i = 0; i < numFaces; i++) {\n        size_t prevSize = mesh.face.size();\n\n        if (mesh.face[i].VN() == 4) {\n            VertexType* v[4];\n            v[0] = mesh.face[i].V(0);\n            v[1] = mesh.face[i].V(1);\n            v[2] = mesh.face[i].V(2);\n            v[3] = mesh.face[i].V(3);\n\n            size_t startIndex = 0;\n            if ((v[0]->P() - v[2]->P()).Norm() > (v[1]->P() - v[3]->P()).Norm()) {\n                startIndex++;\n            }\n\n            vcg::tri::Allocator<MeshType>::AddFaces(mesh,1);\n            mesh.face.back().Alloc(3);\n            mesh.face.back().V(0) = v[startIndex];\n            mesh.face.back().V(1) = v[(startIndex + 1)%4];\n            mesh.face.back().V(2) = v[(startIndex + 2)%4];\n\n            mesh.face[i].Dealloc();\n            mesh.face[i].Alloc(3);\n            mesh.face[i].V(0)=v[(startIndex + 2)%4];\n            mesh.face[i].V(1)=v[(startIndex + 3)%4];\n            mesh.face[i].V(2)=v[(startIndex + 4)%4];\n        }\n        else if (mesh.face[i].VN() > 4) {\n            vcg::PolygonalAlgorithm<MeshType>::Triangulate(mesh, i);\n        }\n\n        birthFace[i] = static_cast<int>(i);\n\n        for (size_t j = 0; j < mesh.face.size() - prevSize; j++)\n            birthFace.push_back(static_cast<int>(i));\n    }\n\n    return birthFace;\n}\n\ntemplate<class MeshType>\ntypename MeshType::ScalarType averageEdgeLength(MeshType& mesh, const std::vector<size_t>& faces) {\n    typename MeshType::ScalarType length = 0;\n    size_t numEdges = 0;\n    for (size_t fId : faces) {\n        for (size_t j=0;j<mesh.face[fId].VN();j++)\n        {\n            size_t index0=vcg::tri::Index(mesh,mesh.face[fId].V0(j));\n            size_t index1=vcg::tri::Index(mesh,mesh.face[fId].V1(j));\n            typename MeshType::CoordType p0=mesh.vert[index0].P();\n            typename MeshType::CoordType p1=mesh.vert[index1].P();\n            length += (p0-p1).Norm();\n            numEdges++;\n        }\n\n    }\n\n    length /= numEdges;\n\n    return length;\n}\n\ntemplate<class MeshType>\ntypename MeshType::ScalarType averageEdgeLength(MeshType& mesh) {\n    std::vector<size_t> faces;\n\n    for (size_t i=0;i<mesh.face.size();i++) {\n        if (!mesh.face[i].IsD()) {\n            faces.push_back(i);\n        }\n    }\n\n    return averageEdgeLength(mesh, faces);\n}\n\ntemplate <class MeshType>\nclass OrientFaces\n{\n    typedef typename MeshType::FaceType FaceType;\n    typedef typename MeshType::VertexType VertexType;\n    typedef typename MeshType::CoordType CoordType;\n    typedef typename MeshType::ScalarType ScalarType;\n\npublic:\n\n    static void InvertFace(FaceType &f0)\n    {\n        std::vector<VertexType*> faceVert;\n        for (int i=0;i<f0.VN();i++)\n            faceVert.push_back(f0.V(i));\n        std::reverse(faceVert.begin(),faceVert.end());\n        for (int i=0;i<f0.VN();i++)\n            f0.V(i)=faceVert[i];\n    }\n\nprivate:\n\n    static bool IsCoherent(const FaceType &f0,const FaceType &f1,const int IndexE)\n    {\n        assert(f0.cFFp(IndexE)==&f1);\n        assert(&f0!=&f1);\n        const VertexType *v0=f0.cV(IndexE);\n        const VertexType *v1=f0.cV((IndexE+1)%f0.VN());\n        int IndexEopp=f0.cFFi(IndexE);\n        assert(f1.cFFp(IndexEopp)==&f0);\n        const VertexType *v2=f1.cV(IndexEopp);\n        const VertexType *v3=f1.cV((IndexEopp+1)%f1.VN());\n        if (v0==v2){assert(v1==v3);return false;}\n        assert(v0==v3);\n        assert(v1==v2);\n        return true;\n    }\n\n    static void InvertFaces(MeshType &PolyM,\n                            const std::vector<int> &ToInvert)\n    {\n        for (size_t i=0;i<ToInvert.size();i++)\n            InvertFace(PolyM.face[ToInvert[i]]);\n    }\n\n    static void PropagateFrom(MeshType &PolyM,int &fI0,\n                       std::vector<int> &OrientSet0,\n                       std::vector<int> &OrientSet1)\n    {\n        OrientSet0.clear();\n        OrientSet1.clear();\n\n        std::vector<int> CoherentSet(PolyM.face.size(),-1);\n        CoherentSet[fI0]=0;\n\n        assert(!PolyM.face[fI0].IsS());\n\n        std::vector<int> exploreStack;\n        exploreStack.push_back(fI0);\n        do{\n            //get from the stack and set as explored\n            int currF=exploreStack.back();\n            exploreStack.pop_back();\n            if(PolyM.face[currF].IsS())continue;//already explored\n            PolyM.face[currF].SetS();\n\n            //put in the right coherent set\n            int currSet=CoherentSet[currF];\n            if (currSet==0)\n                OrientSet0.push_back(currF);\n            else\n                OrientSet1.push_back(currF);\n            for (int i=0;i<PolyM.face[currF].VN();i++)\n            {\n                FaceType *f0=&PolyM.face[currF];\n                FaceType *f1=PolyM.face[currF].FFp(i);\n                if (f1==f0)continue;//border\n\n                int IndexF1=vcg::tri::Index(PolyM,f1);\n                if(PolyM.face[IndexF1].IsS())continue;\n\n                exploreStack.push_back(IndexF1);//add to the stack\n\n                //either is coherent or the opposite\n                if (IsCoherent(*f0,*f1,i))\n                    CoherentSet[IndexF1]=currSet;\n                else\n                    CoherentSet[IndexF1]=(currSet+1)%2;\n            }\n        }while(!exploreStack.empty());\n    }\n\npublic:\n\n    static void AutoOrientFaces(MeshType &PolyM)\n    {\n        vcg::tri::UpdateTopology<MeshType>::FaceFace(PolyM);\n        vcg::tri::UpdateFlags<MeshType>::FaceClearS(PolyM);\n        for (int i=0;i<(int)PolyM.face.size();i++)\n        {\n            if (PolyM.face[i].IsS())continue;\n            std::cout<<\"Reoriented face.\"<<std::endl;\n            std::vector<int> OrientSet0,OrientSet1;\n            PropagateFrom(PolyM,i,OrientSet0,OrientSet1);\n            if (OrientSet0.size()<OrientSet1.size())\n                InvertFaces(PolyM,OrientSet0);\n            else\n                InvertFaces(PolyM,OrientSet1);\n        }\n    }\n\n};\n\n\ninline bool findVertexChainPathRecursive(\n        const size_t& vCurrentId,\n        const size_t& vStartId,\n        const std::vector<std::vector<size_t>>& vertexNextMap,\n        std::vector<size_t>& nextConfiguration)\n{\n    if (vCurrentId == vStartId)\n        return true;\n\n    for (size_t i = 0; i < vertexNextMap[vCurrentId].size(); i++) {\n        nextConfiguration[vCurrentId] = i;\n        if (findVertexChainPathRecursive(vertexNextMap[vCurrentId][i], vStartId, vertexNextMap, nextConfiguration)) {\n            return true;\n        }\n    }\n    return false;\n}\n\ninline std::vector<size_t> findVertexChainPath(\n        const size_t& vCurrentId,\n        const std::vector<std::vector<size_t>>& vertexNextMap)\n{\n    std::vector<size_t> nextConfiguration(vertexNextMap.size());\n\n    findVertexChainPathRecursive(vCurrentId, vCurrentId, vertexNextMap, nextConfiguration);\n\n    return nextConfiguration;\n}\n\n\ntemplate <class MeshType>\nbool isTriangleMesh(MeshType& mesh) {\n    for (size_t i = 0; i < mesh.face.size(); i++) {\n        if (mesh.face[i].VN() != 3)\n            return false;\n    }\n\n    return true;\n}\n\ntemplate <class MeshType>\nbool isQuadMesh(MeshType& mesh) {\n    for (size_t i = 0; i < mesh.face.size(); i++) {\n        if (mesh.face[i].VN() != 4)\n            return false;\n    }\n\n    return true;\n}\n\n}\n}\n"
  },
  {
    "path": "libs/quadretopology/quadretopology/includes/qr_utils.h",
    "content": "/***************************************************************************/\n/* Copyright(C) 2021\n\n\nThe authors of\n\nReliable Feature-Line Driven Quad-Remeshing\nSiggraph 2021\n\n\n All rights reserved.\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <https://www.gnu.org/licenses/>.\n****************************************************************************/\n\n#ifndef QR_UTILS_H\n#define QR_UTILS_H\n\n#include <vector>\n#include \"qr_charts.h\"\n\nnamespace QuadRetopology {\nnamespace internal {\n\ntemplate <class PolyMeshType>\nint removeUnreferencedVertices(PolyMeshType& m, bool onlySelected);\n\ntemplate <class PolyMeshType, class ScalarType>\nint clusterVertices(PolyMeshType &m, const bool onlySelected, const ScalarType radius);\n\ntemplate <class PolyMeshType>\nint removeDuplicateVertices(PolyMeshType& mesh, const bool onlySelected);\n\ntemplate <class PolyMeshType>\nint removeDegenerateFaces(PolyMeshType& mesh, bool onlySelected, bool alwaysDelete);\n\ntemplate <class PolyMeshType>\nint removeDoubletFaces(PolyMeshType& mesh, bool onlySelected, bool recursive);\n\nstatic std::vector<size_t> dummySizetVector;\n\ntemplate <class MeshType>\nvoid updateAllMeshAttributes(MeshType &mesh);\n\ntemplate <class MeshType>\nstd::vector<std::vector<size_t>> findConnectedComponents(\n        const MeshType &mesh);\n\ntemplate<class MeshType>\nvoid LaplacianPos(MeshType &poly_m,std::vector<typename MeshType::CoordType> &AvVert);\n\ntemplate <class MeshType>\nvoid LaplacianGeodesicSmoothing(\n        MeshType &poly_m,\n        int nstep,\n        const double maxDistance,\n        const double minDumpS = 0.5,\n        std::vector<size_t>& smoothedVertices = dummySizetVector);\n\nstd::vector<size_t> findVertexChainPath(\n        const size_t& vCurrentId,\n        const std::vector<std::vector<size_t>>& vertexNextMap);\n\n\ntemplate <class MeshType>\nbool isTriangleMesh(MeshType& mesh);\n\ntemplate <class MeshType>\nbool isQuadMesh(MeshType& mesh);\n\ntemplate <class MeshType>\nstd::vector<int> splitFacesInTriangles(MeshType& mesh);\n\ntemplate<class PolyMeshType>\ntypename PolyMeshType::ScalarType averageEdgeLength(PolyMeshType& mesh, const std::vector<size_t>& faces);\n\ntemplate<class PolyMeshType>\ntypename PolyMeshType::ScalarType averageEdgeLength(PolyMeshType& mesh);\n\n\n}\n}\n\n#include \"qr_utils.cpp\"\n\n#endif // QR_UTILS_H\n"
  },
  {
    "path": "libs/quadretopology/quadretopology/quadretopology.cpp",
    "content": "/***************************************************************************/\n/* Copyright(C) 2021\n\n\nThe authors of\n\nReliable Feature-Line Driven Quad-Remeshing\nSiggraph 2021\n\n\n All rights reserved.\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <https://www.gnu.org/licenses/>.\n****************************************************************************/\n\n#include \"quadretopology.h\"\n\n#include \"includes/qr_convert.h\"\n#include \"includes/qr_utils.h\"\n#include \"includes/qr_patterns.h\"\n#include \"includes/qr_mapping.h\"\n#include <map>\n\n#include <vcg/complex/algorithms/polygonal_algorithms.h>\n\n#ifdef QUADRETOPOLOGY_DEBUG_SAVE_MESHES\n#include <igl/writeOBJ.h>\n#endif\n\nnamespace QuadRetopology {\n\ntemplate<class TriangleMesh>\nChartData computeChartData(\n        TriangleMesh& mesh,\n        const std::vector<std::vector<size_t>>& meshPartitions,\n        const std::vector<std::vector<size_t>>& meshCorners)\n{\n    std::vector<int> faceLabel(mesh.face.size(), -1);\n    for (size_t pId = 0; pId < meshPartitions.size(); pId++) {\n        for (const size_t& fId : meshPartitions[pId]) {\n            assert(faceLabel[fId] == -1);\n            faceLabel[fId] = static_cast<int>(pId);\n        }\n    }\n\n    ChartData chartData = computeChartData(mesh, faceLabel, meshCorners);\n    return chartData;\n}\n\n//It works just on triangle meshes\ntemplate<class TriangleMeshType>\nChartData computeChartData(\n        TriangleMeshType& mesh,\n        const std::vector<int>& faceLabel,\n        const std::vector<std::vector<size_t>>& corners)\n{\n    typedef std::map<std::pair<size_t, size_t>, std::pair<int, int>> EdgeLabelMap;\n    typedef std::map<std::pair<size_t, size_t>, int> EdgeSubSideMap;\n\n    ChartData chartData;\n\n    if (mesh.face.size() == 0)\n        return chartData;\n\n    vcg::tri::UpdateTopology<TriangleMeshType>::FaceFace(mesh);\n\n    //Region growing algorithm for getting charts\n    internal::findChartFacesAndBorderFaces(mesh, faceLabel, chartData);\n\n    //TODO SPLIT IN FUNCTIONS\n    EdgeSubSideMap edgeSubSideMap;\n    for (const int& pId : chartData.labels) {\n        Chart& chart = chartData.charts[pId];\n\n        assert(chart.label == pId);\n\n        if (chart.faces.size() == 0)\n            continue;\n\n        std::unordered_set<size_t> cornerSet(corners[pId].begin(), corners[pId].end());\n\n#ifndef NDEBUG\n        if (cornerSet.size() < 3 || cornerSet.size() > 6) {\n            std::cout << \"Warning 3: Given as input for \" << pId << \": \" << cornerSet.size() << \" sides.\" << std::endl;\n        }\n#endif\n\n        EdgeLabelMap edgeLabelMap;\n        std::vector<std::vector<size_t>> vertexNextMap(mesh.vert.size());\n\n        std::set<size_t> remainingVertices;\n\n        //Fill edge map and next vertex map\n        for (const size_t& fId : chart.borderFaces) {\n            typename TriangleMeshType::FaceType* currentFacePointer = &mesh.face[fId];\n            vcg::face::Pos<typename TriangleMeshType::FaceType> pos(currentFacePointer, 0);\n\n            for (int k = 0; k < currentFacePointer->VN(); k++) {\n                pos.FlipF();\n                size_t adjFace = vcg::tri::Index(mesh, pos.F());\n                int adjLabel = faceLabel[adjFace];\n\n                bool isBorderEdge = false;\n                int adjChartLabel = -2;\n\n                if (currentFacePointer == pos.F()) {\n                    adjChartLabel = -1;\n                    isBorderEdge = true;\n                }\n                else if (adjLabel != chart.label) {\n                    adjChartLabel = adjLabel;\n                    isBorderEdge = true;\n                }\n                pos.FlipF();\n\n                //For each border edge\n                if (isBorderEdge) {\n                    assert(adjChartLabel > -2);\n\n                    typename TriangleMeshType::VertexType* vStart = pos.V();\n                    pos.FlipV();\n                    typename TriangleMeshType::VertexType* vEnd = pos.V();\n                    pos.FlipV();\n\n                    size_t vStartId = vcg::tri::Index(mesh, vStart);\n                    size_t vEndId = vcg::tri::Index(mesh, vEnd);\n\n                    std::pair<size_t, size_t> edge(vStartId, vEndId);\n                    if (edge.first > edge.second) {\n                        std::swap(edge.first, edge.second);\n                    }\n\n                    edgeLabelMap.insert(std::make_pair(edge, std::make_pair(chart.label, adjChartLabel)));\n                    vertexNextMap[vStartId].push_back(vEndId);\n\n                    remainingVertices.insert(vStartId);\n                    remainingVertices.insert(vEndId);\n                }\n\n                pos.FlipV();\n                pos.FlipE();\n            }\n        }\n\n        do {\n            //Find first label\n            size_t vStartId;\n            size_t vCurrentId;\n            size_t vNextId;\n\n            //Corner detection variables\n            typename TriangleMeshType::CoordType lastEdgeVec;\n            bool isCorner = false;\n\n            vCurrentId = *remainingVertices.begin();\n\n            std::vector<size_t> nextConfiguration = internal::findVertexChainPath(vCurrentId, vertexNextMap);\n            vNextId = vertexNextMap[vCurrentId][nextConfiguration[vCurrentId]];\n\n            //Get last edge vector\n            lastEdgeVec = mesh.vert[vNextId].P() - mesh.vert[vCurrentId].P();\n            lastEdgeVec.Normalize();\n\n//            std::pair<size_t, size_t> startEdge(vCurrentId, vNextId);\n//            if (startEdge.first > startEdge.second) {\n//                std::swap(startEdge.first, startEdge.second);\n//            }\n\n            int currentLabel;\n\n            //Iterate in the borders to get the first corner\n            vStartId = vCurrentId;\n            size_t firstCornerIterations = 0;\n            do {\n                //Next border edge\n                vCurrentId = vertexNextMap[vCurrentId][nextConfiguration[vCurrentId]];\n                vNextId = vertexNextMap[vCurrentId][nextConfiguration[vCurrentId]];\n\n                typename TriangleMeshType::CoordType currentEdgeVec = mesh.vert[vNextId].P() - mesh.vert[vCurrentId].P();\n                currentEdgeVec.Normalize();\n\n                //Check if it is a corner\n                isCorner = cornerSet.find(vCurrentId) != cornerSet.end();\n\n                lastEdgeVec = currentEdgeVec;\n\n                firstCornerIterations++;\n            } while (!isCorner && vCurrentId != vStartId && firstCornerIterations < MAXITERATIONS);\n\n#ifndef NDEBUG\n            if (firstCornerIterations >= MAXITERATIONS) {\n                std::cout << \"Error: error iterating! Cannot find the first corner or get back to the start vertex.\" << std::endl;\n            }\n#endif\n\n#ifndef NDEBUG\n            if (vCurrentId == vStartId) {\n                std::cout << \"Warning 1: input mesh is not well-defined: no corners!\" << std::endl;\n            }\n#endif\n            vStartId = vCurrentId;\n            vNextId = vertexNextMap[vCurrentId][nextConfiguration[vCurrentId]];\n\n            ChartSide currentSide;\n            size_t chartSideId = 0;\n            currentSide.length = 0;\n            currentSide.size = 0;\n\n\n            int adjChartLabel;\n            do {\n                size_t subsideId = chartData.subsides.size();\n                ChartSubside currentSubSide;\n\n                //Get edge\n                std::pair<size_t, size_t> edge(vCurrentId, vNextId);\n                if (edge.first > edge.second) {\n                    std::swap(edge.first, edge.second);\n                }\n                //Get current label on the other side\n                const std::pair<int,int>& currentEdgeLabels = edgeLabelMap.at(edge);\n                assert(currentEdgeLabels.first == chart.label || currentEdgeLabels.second == chart.label);\n                adjChartLabel = currentEdgeLabels.first == chart.label ? currentEdgeLabels.second : currentEdgeLabels.first;\n\n                std::unordered_set<size_t> cornerSetAdj;\n                if (adjChartLabel >= 0)\n                    cornerSetAdj.insert(corners[adjChartLabel].begin(), corners[adjChartLabel].end());\n\n                double length = 0;\n\n                bool newSubSide = false;\n\n                bool firstIteration = true;\n                isCorner = false;\n                bool isAdjCorner = false;\n                size_t vSubSideStartId = vCurrentId;\n                size_t iterations = 0;\n                do {\n                    typename TriangleMeshType::CoordType currentEdgeVec = mesh.vert[vNextId].P() - mesh.vert[vCurrentId].P();\n                    currentEdgeVec.Normalize();\n\n                    std::pair<size_t, size_t> edge(vCurrentId, vNextId);\n                    if (edge.first > edge.second) {\n                        std::swap(edge.first, edge.second);\n                    }\n\n                    //Check if it is a corner\n                    if (!firstIteration) {\n                        isCorner = cornerSet.find(vCurrentId) != cornerSet.end();\n                        isAdjCorner = cornerSetAdj.find(vCurrentId) != cornerSetAdj.end();\n                    }\n\n                    //Get current label on the other subside\n                    const std::pair<int,int>& currentEdgeLabels = edgeLabelMap.at(edge);\n                    assert(currentEdgeLabels.first == chart.label || currentEdgeLabels.second == chart.label);\n                    currentLabel = currentEdgeLabels.first == chart.label ? currentEdgeLabels.second : currentEdgeLabels.first;\n\n                    if (!isCorner && !isAdjCorner && currentLabel == adjChartLabel) {\n                        EdgeSubSideMap::iterator findIt = edgeSubSideMap.find(edge);\n\n                        //If the subside has already been processed\n                        if (findIt == edgeSubSideMap.end()) {\n                            currentSubSide.vertices.push_back(vCurrentId);\n\n                            length += (mesh.vert[vNextId].P() - mesh.vert[vCurrentId].P()).Norm();\n\n                            edgeSubSideMap.insert(std::make_pair(edge, subsideId));\n\n                            newSubSide = true;\n                        }\n                        else if (firstIteration) {\n                            subsideId = findIt->second;\n                        }\n                        firstIteration = false;\n\n                        remainingVertices.erase(vCurrentId);\n\n                        //Next border edge\n                        vCurrentId = vertexNextMap[vCurrentId][nextConfiguration[vCurrentId]];\n                        vNextId = vertexNextMap[vCurrentId][nextConfiguration[vCurrentId]];\n\n                        lastEdgeVec = currentEdgeVec;\n                    }\n                } while (!isCorner && !isAdjCorner && currentLabel == adjChartLabel && vCurrentId != vSubSideStartId && iterations < MAXITERATIONS);\n#ifndef NDEBUG\n                if (iterations >= MAXITERATIONS) {\n                    std::cout << \"Error: error iterating! Cannot find a corner or get back to the start vertex.\" << std::endl;\n                }\n#endif\n#ifndef NDEBUG\n                if (vCurrentId == vSubSideStartId) {\n                    std::cout << \"Warning 2: input mesh is not well-defined: single border chart with no corners!\" << std::endl;\n                }\n#endif\n\n                //True if the subside is reversed (from the last to the first vertex)\n                bool reversed;\n\n                if (newSubSide) {\n                    //Add last vertex\n                    currentSubSide.vertices.push_back(vCurrentId);\n\n                    //Create new side\n                    chart.chartSubsides.push_back(subsideId);\n\n                    currentSubSide.incidentCharts[0] = chart.label;\n                    currentSubSide.incidentCharts[1] = adjChartLabel;\n\n                    currentSubSide.length = length;\n\n                    currentSubSide.incidentChartSubsideId[0] = subsideId;\n                    currentSubSide.incidentChartSideId[0] = chartSideId;\n\n                    if (adjChartLabel >= 0) {\n                        currentSubSide.isOnBorder = false;\n\n                        chart.adjacentCharts.push_back(adjChartLabel);\n                    }\n                    else {\n                        currentSubSide.isOnBorder = true;\n                        currentSubSide.incidentChartSubsideId[1] = -1;\n                        currentSubSide.incidentChartSideId[1] = -1;\n                    }\n\n                    assert(currentSubSide.vertices.size() >= 2);\n                    currentSubSide.size = currentSubSide.vertices.size() - 1;\n\n                    chartData.subsides.push_back(currentSubSide);\n\n\n                    //Pop last vertex\n                    if (currentSide.vertices.size() > 0) {\n                        assert(currentSide.vertices.back() == currentSubSide.vertices.front());\n                        currentSide.vertices.pop_back();\n                    }\n                    currentSide.vertices.insert(\n                                currentSide.vertices.end(),\n                                currentSubSide.vertices.begin(),\n                                currentSubSide.vertices.end());\n\n                    reversed = false;\n                }\n                else {\n                    assert(currentSubSide.vertices.size() == 0);\n\n                    //Add the side to other chart\n                    if (adjChartLabel >= 0) {\n                        chart.chartSubsides.push_back(subsideId);\n\n                        assert(chartData.subsides[subsideId].incidentCharts[1] == chart.label);\n                        chartData.subsides[subsideId].incidentChartSubsideId[1] = subsideId;\n                        chartData.subsides[subsideId].incidentChartSideId[1] = chartSideId;\n\n                        chart.adjacentCharts.push_back(adjChartLabel);\n\n                        //Pop last vertex\n                        if (currentSide.vertices.size() > 0) {\n                            assert(currentSide.vertices.back() == chartData.subsides[subsideId].vertices.back());\n                            currentSide.vertices.pop_back();\n                        }\n\n                        //Add side vertices\n                        currentSide.vertices.insert(\n                                    currentSide.vertices.end(),\n                                    chartData.subsides[subsideId].vertices.rbegin(),\n                                    chartData.subsides[subsideId].vertices.rend());\n                    }\n\n                    reversed = true;\n                }\n\n                currentSide.subsides.push_back(subsideId);\n                currentSide.reversedSubside.push_back(reversed);\n\n                currentSide.length += chartData.subsides[subsideId].length;\n                currentSide.size += chartData.subsides[subsideId].size;\n\n                if (isCorner) {\n                    chart.chartSides.push_back(currentSide);\n                    currentSide = ChartSide();\n                    chartSideId++;\n                }\n\n            } while (vCurrentId != vStartId);\n\n#ifndef NDEBUG\n            if (!isCorner) {\n                std::cout << \"Warning 4: Chart has no final corner!\" << std::endl;\n            }\n#endif\n\n        } while (!remainingVertices.empty());\n\n#ifndef NDEBUG\n        if (chart.chartSides.size() < 3 || chart.chartSides.size() > 6) {\n            std::cout << \"Warning 3: Chart \" << pId << \" has \" << chart.chartSides.size() << \" sides.\" << std::endl;\n        }\n#endif\n    }\n\n    return chartData;\n}\n\ninline std::vector<double> computeChartEdgeLength(\n        const ChartData& chartData,\n        const size_t& iterations,\n        const std::vector<int>& ilpResults,\n        const double& weight)\n{\n    std::vector<double> avgLengths(chartData.charts.size() , -1);\n\n\n    std::vector<bool> isFixed(chartData.subsides.size(), false);\n    std::vector<bool> isComputable(chartData.subsides.size(), true);\n    for (size_t subsideId = 0; subsideId < chartData.subsides.size(); ++subsideId) {\n        if (ilpResults[subsideId] == ILP_IGNORE) {\n            isComputable[subsideId] = false;\n        }\n        else if (ilpResults[subsideId] >= 0) {\n            isFixed[subsideId] = true;\n        }\n    }\n\n    //Fill charts with a border\n    for (size_t i = 0; i < chartData.charts.size(); i++) {\n        const Chart& chart = chartData.charts[i];\n        if (chart.faces.size() > 0) {\n            double currentQuadLength = 0;\n            int numSides = 0;\n\n            for (size_t sId : chart.chartSubsides) {\n                const ChartSubside& subside = chartData.subsides[sId];\n                if (isComputable[sId] && isFixed[sId]) {\n                    currentQuadLength += subside.length / subside.size;\n                    numSides++;\n                }\n            }\n\n            if (numSides > 0) {\n                currentQuadLength /= numSides;\n                avgLengths[i] = currentQuadLength;\n            }\n        }\n    }\n\n    //Fill charts with no borders\n    bool done;\n    do {\n        done = true;\n        for (size_t i = 0; i < chartData.charts.size(); i++) {\n            const Chart& chart = chartData.charts[i];\n            if (chart.faces.size() > 0 && avgLengths[i] < 0) {\n                double currentLength = 0;\n                size_t numAdjacentCharts = 0;\n\n                for (size_t adjId : chart.adjacentCharts) {\n                    if (avgLengths[adjId] > 0) {\n                        currentLength += avgLengths[adjId];\n                        numAdjacentCharts++;\n                        done = false;\n                    }\n                }\n\n                if (currentLength > 0) {\n                    currentLength /= numAdjacentCharts;\n                    avgLengths[i] = currentLength;\n                }\n            }\n        }\n    } while (!done);\n\n\n    //Smoothing\n    for (size_t k = 0; k < iterations; k++) {\n        std::vector<double> lastAvgLengths = avgLengths;\n\n        for (size_t i = 0; i < chartData.charts.size(); i++) {\n            const Chart& chart = chartData.charts[i];\n            if (chart.faces.size() > 0) {\n                assert(lastAvgLengths[i] > 0);\n\n                double adjValue = 0.0;\n                size_t numAdjacentCharts = 0;\n\n                for (size_t adjId : chart.adjacentCharts) {\n                    if (avgLengths[adjId] > 0) {\n                        adjValue += lastAvgLengths[adjId];\n                        numAdjacentCharts++;\n                    }\n                }\n\n                if (adjValue > 0.0) {\n                    adjValue = weight * lastAvgLengths[i] + (1.0 - weight) * adjValue;\n                }\n            }\n        }\n    }\n\n    return avgLengths;\n}\n\ninline void findSubdivisions(\n        const ChartData& chartData,\n        const std::vector<double>& chartEdgeLength,\n        const Parameters& parameters,\n        double& gap,\n        std::vector<int>& ilpResults)\n{\n    return findSubdivisions(\n        chartData,\n        chartEdgeLength,\n        parameters.ilpMethod,\n        parameters.alpha,\n        parameters.isometry,\n        parameters.regularityQuadrilaterals,\n        parameters.regularityNonQuadrilaterals,\n        parameters.regularityNonQuadrilateralsWeight,\n        parameters.alignSingularities,\n        parameters.alignSingularitiesWeight,\n        parameters.repeatLosingConstraintsIterations,\n        parameters.repeatLosingConstraintsQuads,\n        parameters.repeatLosingConstraintsNonQuads,\n        parameters.repeatLosingConstraintsAlign,\n        parameters.feasibilityFix,\n        parameters.hardParityConstraint,\n        parameters.timeLimit,\n        parameters.gapLimit,\n        parameters.callbackTimeLimit,\n        parameters.callbackGapLimit,\n        parameters.minimumGap,\n        gap,\n        ilpResults);\n}\n\ninline void findSubdivisions(\n        const ChartData& chartData,\n        const std::vector<double>& chartEdgeLength,\n        const ILPMethod& method,\n        const double alpha,\n        const bool isometry,\n        const bool regularityQuadrilaterals,\n        const bool regularityNonQuadrilaterals,\n        const double regularityNonQuadrilateralsWeight,\n        const bool alignSingularities,\n        const double alignSingularitiesWeight,\n        const int repeatLosingConstraintsIterations,\n        const bool repeatLosingConstraintsQuads,\n        const bool repeatLosingConstraintsNonQuads,\n        const bool repeatLosingConstraintsAlign,\n        const bool feasibilityFix,\n        const bool hardParityConstraint,\n        const double timeLimit,\n        const double gapLimit,\n        const std::vector<float>& callbackTimeLimit,\n        const std::vector<float>& callbackGapLimit,\n        const double minimumGap,\n        double& gap,\n        std::vector<int>& ilpResults)\n{\n    if (chartData.charts.size() <= 0)\n        return;\n\n    ILPStatus status;\n\n    //Solve ILP to find the best patches\n    std::vector<int> result = ilpResults;\n    internal::solveILP(\n        chartData,\n        chartEdgeLength,\n        method,\n        alpha,\n        isometry,\n        regularityQuadrilaterals,\n        regularityNonQuadrilaterals,\n        regularityNonQuadrilateralsWeight,\n        alignSingularities,\n        alignSingularitiesWeight,\n        repeatLosingConstraintsIterations,\n        repeatLosingConstraintsQuads,\n        repeatLosingConstraintsNonQuads,\n        repeatLosingConstraintsAlign,\n        feasibilityFix,\n        hardParityConstraint,\n        timeLimit,\n        gapLimit,\n        callbackTimeLimit,\n        callbackGapLimit,\n        gap,\n        status,\n        result);\n\n    if (status == ILPStatus::SOLUTIONFOUND && gap < minimumGap) {\n        std::cout << \"Solution found! Gap: \" << gap << std::endl;\n        ilpResults = result;\n    }\n    else if (status == ILPStatus::SOLUTIONWRONG && !hardParityConstraint) {\n        std::cout << std::endl << \" >>>>>> Solution wrong! Trying with hard constraints for parity. It should not happen...\" << std::endl << std::endl;\n\n        return findSubdivisions(\n            chartData,\n            chartEdgeLength,\n            method,\n            alpha,\n            isometry,\n            regularityQuadrilaterals,\n            regularityNonQuadrilaterals,\n            regularityNonQuadrilateralsWeight,\n            alignSingularities,\n            alignSingularitiesWeight,\n            repeatLosingConstraintsIterations,\n            repeatLosingConstraintsQuads,\n            repeatLosingConstraintsNonQuads,\n            repeatLosingConstraintsAlign,\n            feasibilityFix,\n            true,\n            timeLimit,\n            gapLimit,\n            callbackTimeLimit,\n            callbackGapLimit,\n            minimumGap,\n            gap,\n            ilpResults);\n    }\n    else if (method != ILPMethod::ABS ||\n             alignSingularities ||\n             repeatLosingConstraintsIterations > 0 ||\n             repeatLosingConstraintsQuads ||\n             repeatLosingConstraintsNonQuads ||\n             repeatLosingConstraintsAlign)\n    {\n        std::cout << std::endl << \" >>>>>> Minimum gap has been not reached. Trying with ABS (linear optimization method), singularity align disabled, minimum gap 1.0 and timeLimit x10. Gap was: \" << gap << std::endl << std::endl;\n\n        return findSubdivisions(\n            chartData,\n            chartEdgeLength,\n            ILPMethod::ABS,\n            alpha,\n            isometry,\n            regularityQuadrilaterals,\n            regularityNonQuadrilaterals,\n            regularityNonQuadrilateralsWeight,\n            false,\n            alignSingularitiesWeight,\n            0,\n            false,\n            false,\n            false,\n            feasibilityFix,\n            hardParityConstraint,\n            timeLimit*10,\n            gapLimit,\n            callbackTimeLimit,\n            callbackGapLimit,\n            1.0,\n            gap,\n            ilpResults);\n    }\n}\n\ntemplate<class TriangleMeshType, class PolyMeshType>\nvoid quadrangulate(\n        TriangleMeshType& newSurface,\n        const ChartData& chartData,\n        const std::vector<size_t> fixedPositionSubsides,\n        const std::vector<int>& ilpResult,\n        const Parameters& parameters,\n        PolyMeshType& quadrangulation,\n        std::vector<int>& quadrangulationFaceLabel,\n        std::vector<std::vector<size_t>>& quadrangulationPartitions,\n        std::vector<std::vector<size_t>>& quadrangulationCorners)\n{\n    return QuadRetopology::quadrangulate(\n            newSurface,\n            chartData,\n            fixedPositionSubsides,\n            ilpResult,\n            parameters.chartSmoothingIterations,\n            parameters.quadrangulationFixedSmoothingIterations,\n            parameters.quadrangulationNonFixedSmoothingIterations,\n            parameters.doubletRemoval,\n            quadrangulation,\n            quadrangulationFaceLabel,\n            quadrangulationPartitions,\n            quadrangulationCorners);\n}\n\ntemplate<class TriangleMeshType, class PolyMeshType>\nvoid quadrangulate(\n        TriangleMeshType& newSurface,\n        const ChartData& chartData,\n        const std::vector<size_t> fixedPositionSubsides,\n        const std::vector<int>& ilpResult,\n        const int chartSmoothingIterations,\n        const int quadrangulationFixedSmoothingIterations,\n        const int quadrangulationNonFixedSmoothingIterations,\n        const bool doubletRemoval,\n        PolyMeshType& quadrangulation,\n        std::vector<int>& quadrangulationFaceLabel,\n        std::vector<std::vector<size_t>>& quadrangulationPartitions,\n        std::vector<std::vector<size_t>>& quadrangulationCorners)\n{\n    if (newSurface.face.size() <= 0)\n        return;\n    if (ilpResult.size() == 0)\n        return;\n\n    std::vector<std::vector<size_t>> subsideVertexMap(chartData.subsides.size());\n    std::vector<int> cornerVertices(newSurface.vert.size(), -1);\n\n    quadrangulationPartitions.resize(chartData.charts.size());\n    quadrangulationCorners.resize(chartData.charts.size());\n\n    std::vector<bool> isFixed(chartData.subsides.size(), false);\n    for (int sId : fixedPositionSubsides) {\n        isFixed[sId] = true;\n    }\n\n    //Fill fixed vertices (subsides corners)\n    for (const ChartSubside& subside : chartData.subsides) {\n        size_t vStart = subside.vertices[0];\n        size_t vEnd = subside.vertices[subside.vertices.size() - 1];\n\n        if (cornerVertices[vStart] == -1) {\n            cornerVertices[vStart] = quadrangulation.vert.size();\n            vcg::tri::Allocator<PolyMeshType>::AddVertex(\n                        quadrangulation,\n                        newSurface.vert[vStart].P());\n        }\n\n        if (cornerVertices[vEnd] == -1) {\n            cornerVertices[vEnd] = quadrangulation.vert.size();\n            vcg::tri::Allocator<PolyMeshType>::AddVertex(\n                        quadrangulation,\n                        newSurface.vert[vEnd].P());\n        }\n    }\n\n    //Fill subside map for fixed borders\n    std::set<size_t> fixedVerticesSet;\n    for (size_t subsideId = 0; subsideId < chartData.subsides.size(); subsideId++) {\n        const ChartSubside& subside = chartData.subsides[subsideId];\n        if (isFixed[subsideId]) {\n            for (size_t k = 0; k < subside.vertices.size(); k++) {\n                const size_t& vId = subside.vertices[k];\n\n                size_t newVertexId;\n\n                if (cornerVertices[vId] == -1) {\n                    assert(k > 0 && k < subside.vertices.size() - 1);\n\n                    newVertexId = quadrangulation.vert.size();\n                    vcg::tri::Allocator<PolyMeshType>::AddVertex(\n                                quadrangulation,\n                                newSurface.vert[vId].P());\n                }\n                else {\n                    newVertexId = cornerVertices[vId];\n                    assert(newVertexId >= 0);\n                }\n\n                fixedVerticesSet.insert(newVertexId);\n                subsideVertexMap[subsideId].push_back(newVertexId);\n            }\n\n            if (ilpResult[subsideId] > subside.size) {\n                int vToSplit = -1;\n                double maxLength = 0.0;\n                for (size_t k = 0; k < subside.vertices.size() - 1; k++) {\n                    const size_t& vId1 = subside.vertices[k];\n                    const size_t& vId2 = subside.vertices[k + 1];\n                    double length = (newSurface.vert[vId2].P() - newSurface.vert[vId1].P()).Norm();\n                    if (length >= maxLength) {\n                        vToSplit = k;\n                    }\n                }\n\n                if (vToSplit >= 0) {\n                    const size_t& vId1 = subside.vertices[vToSplit];\n                    const size_t& vId2 = subside.vertices[vToSplit + 1];\n                    size_t splitVertexId = quadrangulation.vert.size();\n                    vcg::tri::Allocator<PolyMeshType>::AddVertex(\n                                quadrangulation,\n                                (newSurface.vert[vId1].P() + newSurface.vert[vId2].P()) / 2.0);\n                    vcg::tri::Allocator<PolyMeshType>::AddFace(\n                                quadrangulation, subsideVertexMap[subsideId][vToSplit], subsideVertexMap[subsideId][vToSplit + 1], splitVertexId);\n\n                    subsideVertexMap[subsideId].insert(subsideVertexMap[subsideId].begin() + vToSplit + 1, splitVertexId);\n\n                    std::cout << \"Triangle added in subside \" << subsideId << \": +1!\" << std::endl;\n                }\n                else {\n                    std::cout << \"ERROR: impossible to augment the subside \" << subsideId << \": +1! Target vertex not found.\" << std::endl;\n                }\n            }\n            else if (ilpResult[subsideId] < subside.size) {\n                if (subside.size >= 2) {\n                    int vToSkip = -1;\n                    double minLength = std::numeric_limits<double>::max();\n                    for (size_t k = 0; k < subside.vertices.size() - 2; k++) {\n                        const size_t& vId1 = subside.vertices[k];\n                        const size_t& vId2 = subside.vertices[k + 1];\n                        const size_t& vId3 = subside.vertices[k + 2];\n                        double length = (newSurface.vert[vId2].P() - newSurface.vert[vId1].P()).Norm() + (newSurface.vert[vId3].P() - newSurface.vert[vId2].P()).Norm();\n                        if (length <= minLength) {\n                            vToSkip = k;\n                        }\n                    }\n\n                    if (vToSkip >= 0) {\n                        vcg::tri::Allocator<PolyMeshType>::AddFace(\n                                    quadrangulation, subsideVertexMap[subsideId][vToSkip], subsideVertexMap[subsideId][vToSkip + 1], subsideVertexMap[subsideId][vToSkip + 2]);\n\n                        subsideVertexMap[subsideId].erase(subsideVertexMap[subsideId].begin() + vToSkip + 1);\n\n                        std::cout << \"Triangle added in subside \" << subsideId << \": -1!\" << std::endl;\n                    }\n                    else {\n                        std::cout << \"ERROR: impossible to reduce the subside \" << subsideId << \": -1! Target vertex not found.\" << std::endl;\n                    }\n                }\n                else {\n                    std::cout << \"ERROR: impossible to reduce the subside \" << subsideId << \": -1! Subside is less than 2.\" << std::endl;\n                }\n            }\n        }\n    }\n\n\n    //For each chart\n    for (size_t cId = 0; cId < chartData.charts.size(); cId++) {\n        const Chart& chart = chartData.charts[cId];\n\n        if (chart.faces.size() == 0)\n            continue;\n\n        const std::vector<ChartSide>& chartSides = chart.chartSides;\n        if (chartSides.size() < 3 || chartSides.size() > 6) {\n            std::cout << \"Chart \" << cId << \" with corners less than 3 or greater than 6!\" << std::endl;\n            continue;\n        }\n\n        bool ilpSolvedForAll = true;\n        for (size_t sId : chart.chartSubsides) {\n            if (ilpResult[sId] < 0)\n                ilpSolvedForAll = false;\n        }\n\n        if (!ilpSolvedForAll) {\n            std::cout << \"Chart \" << cId << \" not computed. ILP was not solved.\" << std::endl;\n            continue;\n        }\n\n        //Input mesh\n        Eigen::MatrixXd chartV;\n        Eigen::MatrixXi chartF;\n        vcg::tri::UpdateFlags<TriangleMeshType>::FaceClearS(newSurface);\n        vcg::tri::UpdateFlags<TriangleMeshType>::VertexClearS(newSurface);\n        for (const size_t& fId : chart.faces) {\n            newSurface.face[fId].SetS();\n            for (int k = 0; k < newSurface.face[fId].VN(); k++) {\n                newSurface.face[fId].V(k)->SetS();\n            }\n        }\n        std::vector<int> vMap, fMap;\n        QuadRetopology::internal::VCGToEigen(newSurface, chartV, chartF, vMap, fMap, true, 3);\n\n        //Input subdivisions\n        Eigen::VectorXi l(chartSides.size());\n\n        std::vector<std::vector<double>> chartSideLength(chartSides.size());\n        std::vector<std::vector<std::vector<size_t>>> chartSideVertices(chartSides.size());\n        std::vector<std::vector<size_t>> chartSideSubdivision(chartSides.size());\n\n        for (size_t i = 0; i < chartSides.size(); i++) {\n            const ChartSide& chartSide = chartSides[i];\n\n            chartSideLength[i].resize(chartSide.subsides.size());\n            chartSideVertices[i].resize(chartSide.subsides.size());\n            chartSideSubdivision[i].resize(chartSide.subsides.size());\n\n            size_t targetSideSubdivision = 0;\n            for (size_t j = 0; j < chartSide.subsides.size(); j++) {\n                const size_t& subSideId = chartSides[i].subsides[j];\n                const ChartSubside& subSide = chartData.subsides[subSideId];\n\n                if (ilpResult[subSideId] < 0) {\n                    std::cout << \"Error: ILP not valid\" << std::endl;\n                    return;\n                }\n\n                targetSideSubdivision += ilpResult[subSideId];\n\n                chartSideLength[i][j] = subSide.length;\n                chartSideVertices[i][j] = subSide.vertices;\n                chartSideSubdivision[i][j] = ilpResult[subSideId];\n\n                if (chartSide.reversedSubside[j]) {\n                    std::reverse(chartSideVertices[i][j].begin(), chartSideVertices[i][j].end());\n                }\n\n                for (size_t k = 0; k < chartSideVertices[i][j].size(); k++) {\n                    size_t vId = chartSideVertices[i][j][k];\n                    assert(vMap[vId] >= 0);\n                    chartSideVertices[i][j][k] = vMap[vId];\n                }\n\n            }\n\n            l(static_cast<int>(i)) = targetSideSubdivision;\n        }\n\n        //Pattern quadrangulation\n        Eigen::MatrixXd patchV;\n        Eigen::MatrixXi patchF;\n        std::vector<size_t> patchBorders;\n        std::vector<size_t> patchCorners;\n        PolyMeshType patchMesh;\n        std::vector<std::vector<size_t>> patchSides;\n        QuadRetopology::internal::computePattern(l, patchV, patchF, patchMesh, patchBorders, patchCorners, patchSides);\n\n#ifdef QUADRETOPOLOGY_DEBUG_SAVE_MESHES\n        igl::writeOBJ(std::string(\"results/\") + std::to_string(cId) + std::string(\"_patch.obj\"), patchV, patchF);\n#endif\n\n        assert(chartSides.size() == patchCorners.size());\n        assert(chartSides.size() == patchSides.size());\n\n#ifdef QUADRETOPOLOGY_DEBUG_SAVE_MESHES\n        igl::writeOBJ(std::string(\"results/\") + std::to_string(cId) + std::string(\"_chart.obj\"), chartV, chartF);\n#endif\n\n        //Compute quadrangulation\n        Eigen::MatrixXd uvMapV;\n        Eigen::MatrixXi uvMapF;\n        Eigen::MatrixXd quadrangulationV;\n        Eigen::MatrixXi quadrangulationF;\n        QuadRetopology::internal::computeQuadrangulation(chartV, chartF, patchV, patchF, chartSideVertices, chartSideLength, chartSideSubdivision, patchSides, uvMapV, uvMapF, quadrangulationV, quadrangulationF);\n\n#ifdef QUADRETOPOLOGY_DEBUG_SAVE_MESHES\n        Eigen::MatrixXd uvMesh(uvMapV.rows(), 3);\n        for (int i = 0; i < uvMapV.rows(); i++) {\n            uvMesh(i, 0) = uvMapV(i, 0);\n            uvMesh(i, 1) = uvMapV(i, 1);\n            uvMesh(i, 2) = 0;\n        }\n\n        std::string uvFile = std::string(\"results/\") + std::to_string(cId) + std::string(\"_uv.obj\");\n        igl::writeOBJ(uvFile, uvMesh, uvMapF);\n#endif\n        assert(chartV.rows() == uvMapV.rows());\n\n        //Get polymesh\n        PolyMeshType quadrangulatedChartMesh;\n        QuadRetopology::internal::eigenToVCG(quadrangulationV, quadrangulationF, quadrangulatedChartMesh, 4);\n\n#ifdef QUADRETOPOLOGY_DEBUG_SAVE_MESHES\n        igl::writeOBJ(std::string(\"results/\") + std::to_string(cId) + std::string(\"_quadrangulation.obj\"), quadrangulationV, quadrangulationF);\n#endif\n\n        //Smoothing\n        if (chartSmoothingIterations > 0) {\n            vcg::tri::UpdateSelection<PolyMeshType>::VertexAll(quadrangulatedChartMesh);\n            for (size_t vId : patchBorders) {\n                quadrangulatedChartMesh.vert[vId].ClearS();\n            }\n            vcg::PolygonalAlgorithm<PolyMeshType>::LaplacianReproject(quadrangulatedChartMesh, chartSmoothingIterations, 0.5, true);\n        }\n\n        std::vector<int> currentVertexMap(quadrangulatedChartMesh.vert.size(), -1);\n\n        //Map subsides on the vertices of the current mesh (create if necessary)\n        for (size_t i = 0; i < chartSides.size(); i++) {\n            const ChartSide& side = chartSides[i];\n            const std::vector<size_t>& patchSide = patchSides[i];\n\n            size_t currentPatchSideVertex = 0;\n\n            for (size_t j = 0; j < side.subsides.size(); j++) {\n                const size_t& subsideId = side.subsides[j];\n                const bool& reversed = side.reversedSubside[j];\n                const ChartSubside& subside = chartData.subsides[subsideId];\n\n                //Create new vertices of the subsides\n                if (subsideVertexMap[subsideId].empty()) {\n                    assert(!isFixed[subsideId]);\n\n                    //Get fixed corners of the subside\n                    size_t vStart = subside.vertices[0];\n                    size_t vEnd = subside.vertices[subside.vertices.size() - 1];\n                    assert(cornerVertices[vStart] >= 0 && cornerVertices[vEnd] >= 0);\n\n                    currentVertexMap[patchSide[currentPatchSideVertex]] = cornerVertices[vStart];\n                    currentVertexMap[patchSide[currentPatchSideVertex + ilpResult[subsideId]]] = cornerVertices[vEnd];\n\n                    for (int k = 0; k <= ilpResult[subsideId]; k++) {\n                        size_t patchSideVId = patchSide[currentPatchSideVertex];\n\n                        if (currentVertexMap[patchSideVId] == -1) {\n                            assert(k > 0 && k < ilpResult[subsideId]);\n\n                            //Add new vertex\n                            size_t newVertexId = quadrangulation.vert.size();\n\n                            const typename PolyMeshType::CoordType& coord = quadrangulatedChartMesh.vert[patchSideVId].P();\n                            vcg::tri::Allocator<PolyMeshType>::AddVertex(quadrangulation, coord);\n\n                            currentVertexMap[patchSideVId] = newVertexId;\n\n                            subsideVertexMap[subsideId].push_back(newVertexId);\n                        }\n                        else {\n                            //Use the existing vertex\n                            int existingVertexId = currentVertexMap[patchSideVId];\n                            assert(existingVertexId >= 0);\n                            subsideVertexMap[subsideId].push_back(existingVertexId);\n                        }\n\n                        currentPatchSideVertex++;\n                    }\n\n                    if (reversed) {\n                        std::reverse(subsideVertexMap[subsideId].begin(), subsideVertexMap[subsideId].end());\n                    }\n                }\n                //Set the existing vertices\n                else {\n                    assert(subsideVertexMap[subsideId].size() == ilpResult[subsideId] + 1);\n\n                    for (int k = 0; k <= ilpResult[subsideId]; k++) {\n                        int patchSideVId = patchSide[currentPatchSideVertex];\n\n                        size_t subSideVertexIndex = reversed ? ilpResult[subsideId] - k : k;\n\n                        currentVertexMap[patchSideVId] = subsideVertexMap[subsideId][subSideVertexIndex];\n\n                        size_t existingVertexId = currentVertexMap[patchSideVId];\n\n                        //If it is not a corner or if it is not on border\n                        if (!isFixed[subsideId] && k > 0 && k < ilpResult[subsideId]) {\n                            //Average\n                            const typename PolyMeshType::CoordType& coord = quadrangulatedChartMesh.vert[patchSideVId].P();\n                            quadrangulation.vert[existingVertexId].P() =\n                                    (coord + quadrangulation.vert[existingVertexId].P())/2;\n                        }\n\n                        currentPatchSideVertex++;\n                    }\n                }\n\n                currentPatchSideVertex--;\n            }\n\n            assert(currentPatchSideVertex+1 == patchSide.size());\n        }\n\n        //Internal vertices\n        for (size_t i = 0; i < quadrangulatedChartMesh.vert.size(); i++) {\n            if (currentVertexMap[i] == -1) {\n                size_t newId = quadrangulation.vert.size();\n\n                const typename PolyMeshType::CoordType& coord = quadrangulatedChartMesh.vert[i].P();\n                vcg::tri::Allocator<PolyMeshType>::AddVertex(quadrangulation, coord);\n\n                currentVertexMap[i] = newId;\n            }\n        }\n\n        //Set faces\n        for (size_t i = 0; i < quadrangulatedChartMesh.face.size(); i++) {\n            assert(quadrangulatedChartMesh.face[i].VN() == 4);\n\n            size_t newFaceId = quadrangulation.face.size();\n\n            vcg::tri::Allocator<PolyMeshType>::AddFaces(quadrangulation, 1);\n\n            quadrangulation.face[newFaceId].Alloc(quadrangulatedChartMesh.face[i].VN());\n            for (int j = 0; j < quadrangulatedChartMesh.face[i].VN(); j++) {\n                int vId = currentVertexMap[vcg::tri::Index(quadrangulatedChartMesh, quadrangulatedChartMesh.face[i].V(j))];\n                assert(vId >= 0);\n\n                quadrangulation.face[newFaceId].V(j) = &quadrangulation.vert[vId];\n            }\n\n            quadrangulationFaceLabel.push_back(chart.label);\n            quadrangulationPartitions[chart.label].push_back(newFaceId);\n        }\n\n        //Fill corners vertices\n        for (size_t i = 0; i < chartSides.size(); i++) {\n            const ChartSide& side = chartSides[i];\n            size_t vStart = side.vertices[0];\n\n            quadrangulationCorners[chart.label].push_back(cornerVertices.at(vStart));\n        }\n    }\n\n#ifdef QUADRETOPOLOGY_DEBUG_SAVE_MESHES\n    vcg::tri::io::ExporterOBJ<PolyMeshType>::Save(quadrangulation, \"results/quadrangulation_1_original.obj\", vcg::tri::io::Mask::IOM_NONE);\n#endif\n\n    //Duplicate vertices\n    vcg::tri::UpdateTopology<PolyMeshType>::FaceFace(quadrangulation);\n    int numDuplicateVertices = QuadRetopology::internal::removeDuplicateVertices(quadrangulation, false);\n    if (numDuplicateVertices > 0) {\n        std::cout << \"Warning: removed \" << numDuplicateVertices << \" duplicate vertices in quadrangulation.\" << std::endl;\n    }\n\n    //Degenerate faces\n    int numDegenerateFaces = QuadRetopology::internal::removeDegenerateFaces(quadrangulation, false, true);\n    if (numDegenerateFaces > 0) {\n        std::cout << \"Warning: removed \" << numDegenerateFaces << \" degenerate faces in quadrangulation.\" << std::endl;\n        vcg::tri::UpdateTopology<PolyMeshType>::FaceFace(quadrangulation);\n    }\n\n    //Update attributes and re-orient faces\n    vcg::tri::UpdateTopology<PolyMeshType>::FaceFace(quadrangulation);\n    vcg::PolygonalAlgorithm<PolyMeshType>::UpdateFaceNormalByFitting(quadrangulation);\n    QuadRetopology::internal::OrientFaces<PolyMeshType>::AutoOrientFaces(quadrangulation);\n\n    //Reupdate attributes\n    vcg::tri::UpdateTopology<PolyMeshType>::FaceFace(quadrangulation);\n    vcg::PolygonalAlgorithm<PolyMeshType>::UpdateFaceNormalByFitting(quadrangulation);\n\n    //Doublet removal\n    if (doubletRemoval) {\n        int numDoublets = QuadRetopology::internal::removeDoubletFaces(quadrangulation, false, true);\n        if (numDoublets > 0) {\n            std::cout << \"Removed \" << numDoublets << \" doublets in quadrangulation.\" << std::endl;\n            vcg::tri::UpdateTopology<PolyMeshType>::FaceFace(quadrangulation);\n        }\n    }\n\n    //Unreferenced vertices\n    int numUnreferencedVertices = QuadRetopology::internal::removeUnreferencedVertices(quadrangulation, false);\n    if (numUnreferencedVertices > 0) {\n        std::cout << \"Warning: removed \" << numUnreferencedVertices << \" unreferenced vertices in quadrangulation.\" << std::endl;\n    }\n\n\n#ifdef QUADRETOPOLOGY_DEBUG_SAVE_MESHES\n    vcg::tri::io::ExporterOBJ<PolyMeshType>::Save(quadrangulation, \"results/quadrangulation_2_cleaned.obj\", vcg::tri::io::Mask::IOM_NONE);\n#endif\n\n    //Set birth info in quality\n    vcg::tri::UpdateQuality<PolyMeshType>::VertexConstant(quadrangulation, -1);\n    vcg::tri::UpdateQuality<PolyMeshType>::FaceConstant(quadrangulation, -1);\n    for (size_t i=0; i < quadrangulation.vert.size(); i++) {\n        if (quadrangulation.vert[i].IsD())\n            continue;\n\n        quadrangulation.vert[i].Q() = i;\n    }\n    for (size_t i = 0;i < quadrangulation.face.size(); i++) {\n        if (quadrangulation.face[i].IsD())\n            continue;\n\n        quadrangulation.face[i].Q() = i;\n    }\n\n    //Compact\n    PolyMeshType tmpMesh;\n    vcg::tri::Append<PolyMeshType, PolyMeshType>::Mesh(tmpMesh, quadrangulation);\n\n    //Maps for remapping infos\n    std::vector<int> tmpToQuadrangulationVertex(tmpMesh.vert.size(), -1);\n    std::vector<int> quadrangulationToTmpVertex(quadrangulation.vert.size(), -1);\n    std::vector<int> tmpToQuadrangulationFace(tmpMesh.face.size(), -1);\n    std::vector<int> quadrangulationToTmpFace(quadrangulation.face.size(), -1);\n    for (size_t i = 0; i < tmpMesh.vert.size(); i++) {\n        if (tmpMesh.vert[i].IsD())\n            continue;\n\n        int id = tmpMesh.vert[i].Q();\n        assert(id >= 0);\n\n        tmpToQuadrangulationVertex[i] = id;\n        quadrangulationToTmpVertex[id] = i;\n    }\n    for (size_t i = 0; i < tmpMesh.face.size(); i++) {\n        if (tmpMesh.face[i].IsD())\n            continue;\n\n        int id = tmpMesh.face[i].Q();\n        assert(id >= 0);\n\n        tmpToQuadrangulationFace[i] = id;\n        quadrangulationToTmpFace[id] = i;\n    }\n\n    //Remap all infos\n    std::vector<int> newFaceLabel(tmpMesh.face.size(), -1);\n    for (size_t i = 0; i < tmpMesh.face.size(); i++) {\n        if (tmpMesh.face[i].IsD())\n            continue;\n\n        assert(tmpToQuadrangulationFace[i] >= 0);\n        newFaceLabel[i] = quadrangulationFaceLabel[tmpToQuadrangulationFace[i]];\n    }\n    quadrangulationFaceLabel = newFaceLabel;\n\n    for (std::vector<size_t>& corners : quadrangulationCorners) {\n        std::vector<size_t> newCorners;\n        for (const size_t& vId : corners) {\n            if (quadrangulation.vert[vId].IsD())\n                continue;\n\n            assert(quadrangulationToTmpVertex[vId] >= 0);\n            newCorners.push_back(quadrangulationToTmpVertex[vId]);\n        }\n        corners = newCorners;\n    }\n\n    for (std::vector<size_t>& partition : quadrangulationPartitions) {\n        std::vector<size_t> newPartition;\n        for (const size_t& fId : partition) {\n            if (quadrangulation.face[fId].IsD())\n                continue;\n\n            assert(quadrangulationToTmpFace[fId] >= 0);\n            newPartition.push_back(quadrangulationToTmpFace[fId]);\n        }\n        partition = newPartition;\n    }\n\n\n    std::vector<size_t> quadrangulationVerticesBetweenPatch;\n    for (const size_t& vId : fixedVerticesSet) {\n        if (quadrangulation.vert[vId].IsD())\n            continue;\n\n        assert(quadrangulationToTmpFace[vId] >= 0);\n        quadrangulationVerticesBetweenPatch.push_back(quadrangulationToTmpVertex[vId]);\n    }\n\n    //Recopy in quadrangulation mesh\n    quadrangulation.Clear();\n    vcg::tri::Append<PolyMeshType, PolyMeshType>::Mesh(quadrangulation, tmpMesh);\n    vcg::tri::UpdateTopology<PolyMeshType>::FaceFace(quadrangulation);\n    vcg::tri::UpdateFlags<PolyMeshType>::FaceBorderFromFF(quadrangulation);\n    vcg::tri::UpdateFlags<PolyMeshType>::VertexBorderFromFaceAdj(quadrangulation);\n\n#ifdef QUADRETOPOLOGY_DEBUG_SAVE_MESHES\n    vcg::tri::io::ExporterOBJ<PolyMeshType>::Save(quadrangulation, \"results/quadrangulation_3_recompacted.obj\", vcg::tri::io::Mask::IOM_NONE);\n#endif\n\n    vcg::tri::UpdateNormal<TriangleMeshType>::PerFaceNormalized(newSurface);\n    vcg::tri::UpdateNormal<TriangleMeshType>::PerVertexNormalized(newSurface);\n    vcg::tri::UpdateBounding<TriangleMeshType>::Box(newSurface);\n\n    vcg::GridStaticPtr<typename TriangleMeshType::FaceType,typename TriangleMeshType::FaceType::ScalarType> Grid;\n    Grid.Set(newSurface.face.begin(),newSurface.face.end());\n\n    //Reproject\n    vcg::tri::UpdateBounding<PolyMeshType>::Box(quadrangulation);\n    typename TriangleMeshType::ScalarType maxD=quadrangulation.bbox.Diag();\n    typename TriangleMeshType::ScalarType minD=0;\n\n    for (size_t i=0;i<quadrangulation.vert.size();i++) {\n        if (quadrangulation.vert[i].IsD())\n            continue;\n\n        typename TriangleMeshType::CoordType closestPT;\n        typename TriangleMeshType::FaceType *f=\n                vcg::tri::GetClosestFaceBase<TriangleMeshType>(\n                    newSurface,\n                    Grid,\n                    quadrangulation.vert[i].P(),\n                    maxD,minD,\n                    closestPT);\n\n        quadrangulation.vert[i].P()=closestPT;\n    }\n\n#ifdef QUADRETOPOLOGY_DEBUG_SAVE_MESHES\n    vcg::tri::io::ExporterOBJ<PolyMeshType>::Save(quadrangulation, \"results/quadrangulation_4_reprojected.obj\", vcg::tri::io::Mask::IOM_NONE);\n#endif\n\n    if (quadrangulationFixedSmoothingIterations > 0) {\n        vcg::tri::UpdateSelection<PolyMeshType>::VertexAll(quadrangulation);\n        for (const size_t& fixedVertexId : quadrangulationVerticesBetweenPatch) {\n            if (quadrangulation.vert[fixedVertexId].IsD())\n                continue;\n\n            quadrangulation.vert[fixedVertexId].ClearS();\n        }\n\n        vcg::PolygonalAlgorithm<PolyMeshType>::template LaplacianReproject<TriangleMeshType>(quadrangulation, newSurface, quadrangulationFixedSmoothingIterations, 0.7, 0.7, true);\n    }\n\n#ifdef QUADRETOPOLOGY_DEBUG_SAVE_MESHES\n    vcg::tri::io::ExporterOBJ<PolyMeshType>::Save(quadrangulation, \"results/quadrangulation_5_smoothed_fixed.obj\", vcg::tri::io::Mask::IOM_NONE);\n#endif\n\n    if (quadrangulationNonFixedSmoothingIterations > 0) {\n        vcg::tri::UpdateSelection<PolyMeshType>::VertexAll(quadrangulation);\n        for (size_t i=0;i<quadrangulation.vert.size();i++) {\n            if (quadrangulation.vert[i].IsD())\n                continue;\n            if (quadrangulation.vert[i].IsB()) {\n                quadrangulation.vert[i].ClearS();\n            }\n        }\n\n        vcg::PolygonalAlgorithm<PolyMeshType>::template LaplacianReproject<TriangleMeshType>(quadrangulation, newSurface, quadrangulationNonFixedSmoothingIterations, 0.7, 0.7, true);\n    }\n\n    vcg::PolygonalAlgorithm<PolyMeshType>::UpdateFaceNormalByFitting(quadrangulation);\n    vcg::tri::UpdateNormal<PolyMeshType>::PerVertexNormalized(quadrangulation);\n    vcg::tri::UpdateBounding<PolyMeshType>::Box(quadrangulation);\n\n#ifdef QUADRETOPOLOGY_DEBUG_SAVE_MESHES\n    vcg::tri::io::ExporterOBJ<PolyMeshType>::Save(quadrangulation, \"results/quadrangulation_6_final.obj\", vcg::tri::io::Mask::IOM_NONE);\n#endif\n}\n\n}\n"
  },
  {
    "path": "libs/quadretopology/quadretopology/quadretopology.h",
    "content": "/***************************************************************************/\n/* Copyright(C) 2021\n\n\nThe authors of\n\nReliable Feature-Line Driven Quad-Remeshing\nSiggraph 2021\n\n\n All rights reserved.\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <https://www.gnu.org/licenses/>.\n****************************************************************************/\n\n#ifndef QUADRETOPOLOGY_H\n#define QUADRETOPOLOGY_H\n\n#include <vector>\n\n#include <Eigen/Core>\n\n#include <unordered_map>\n\n#include \"includes/qr_charts.h\"\n#include \"includes/qr_ilp.h\"\n#include \"includes/qr_parameters.h\"\n\nnamespace QuadRetopology {\n\ntemplate<class TriangleMesh>\nChartData computeChartData(\n        TriangleMesh& mesh,\n        const std::vector<std::vector<size_t>>& meshPartitions,\n        const std::vector<std::vector<size_t>>& meshCorners);\ntemplate<class TriangleMeshType>\nChartData computeChartData(\n        TriangleMeshType& mesh,\n        const std::vector<int>& faceLabel,\n        const std::vector<std::vector<size_t>>& corners);\n\nstd::vector<double> computeChartEdgeLength(\n        const ChartData& chartData,\n        const size_t& iterations,\n        const std::vector<int>& ilpResults,\n        const double& weight);\n\nvoid findSubdivisions(\n        const ChartData& chartData,\n        const std::vector<double>& chartEdgeLength,\n        const Parameters& parameters,\n        double& gap,\n        std::vector<int>& ilpResults);\n\nvoid findSubdivisions(\n        const ChartData& chartData,\n        const std::vector<double>& chartEdgeLength,\n        const ILPMethod& method,\n        const double alpha,\n        const bool isometry,\n        const bool regularityQuadrilaterals,\n        const bool regularityNonQuadrilaterals,\n        const double regularityNonQuadrilateralsWeight,\n        const bool alignSingularities,\n        const double alignSingularitiesWeight,\n        const int repeatLosingConstraintsIterations,\n        const bool repeatLosingConstraintsQuads,\n        const bool repeatLosingConstraintsNonQuads,\n        const bool repeatLosingConstraintsAlign,\n        const bool feasibilityFix,\n        const bool hardParityConstraint,\n        const double timeLimit,\n        const double gapLimit,\n        const std::vector<float>& callbackTimeLimit,\n        const std::vector<float>& callbackGapLimit,\n        const double minimumGap,\n        double& gap,\n        std::vector<int>& ilpResults);\n\ntemplate<class TriangleMeshType, class PolyMeshType>\nvoid quadrangulate(\n        TriangleMeshType& newSurface,\n        const ChartData& chartData,\n        const std::vector<size_t> fixedPositionSubsides,\n        const std::vector<int>& ilpResult,\n        const Parameters& parameters,\n        PolyMeshType& quadrangulation,\n        std::vector<int>& quadrangulationFaceLabel,\n        std::vector<std::vector<size_t>>& quadrangulationPartitions,\n        std::vector<std::vector<size_t>>& quadrangulationCorners);\ntemplate<class TriangleMeshType, class PolyMeshType>\nvoid quadrangulate(\n        TriangleMeshType& newSurface,\n        const ChartData& chartData,\n        const std::vector<size_t> fixedPositionSubsides,\n        const std::vector<int>& ilpResult,\n        const int chartSmoothingIterations,\n        const int quadrangulationFixedSmoothingIterations,\n        const int quadrangulationNonFixedSmoothingIterations,\n        const bool doubletsRemoval,\n        PolyMeshType& quadrangulation,\n        std::vector<int>& quadrangulationFaceLabel,\n        std::vector<std::vector<size_t>>& quadrangulationPartitions,\n        std::vector<std::vector<size_t>>& quadrangulationCorners);\n\n}\n\n#include \"quadretopology.cpp\"\n\n#endif // QUADRETOPOLOGY_H\n"
  },
  {
    "path": "libs/quadretopology/quadretopology.pri",
    "content": "INCLUDEPATH += $$PWD\n\n#Include patterns\ninclude($$PWD/patterns/patterns.pri)\n\nSOURCES += \\\n        $$PWD/quadretopology/includes/qr_charts.cpp \\\n        $$PWD/quadretopology/includes/qr_convert.cpp \\\n        $$PWD/quadretopology/includes/qr_ilp.cpp \\\n        $$PWD/quadretopology/includes/qr_patterns.cpp \\\n        $$PWD/quadretopology/includes/qr_mapping.cpp \\\n        $$PWD/quadretopology/includes/qr_utils.cpp \\\n        $$PWD/quadretopology/quadretopology.cpp\n\nHEADERS += \\\n        $$PWD/quadretopology/includes/qr_convert.h \\\n        $$PWD/quadretopology/includes/qr_charts.h \\\n        $$PWD/quadretopology/includes/qr_convert.h \\\n        $$PWD/quadretopology/includes/qr_ilp.h \\\n        $$PWD/quadretopology/includes/qr_parameters.h \\\n        $$PWD/quadretopology/includes/qr_patterns.h \\\n        $$PWD/quadretopology/includes/qr_mapping.h \\\n        $$PWD/quadretopology/includes/qr_utils.h \\\n        $$PWD/quadretopology/quadretopology.h\n"
  },
  {
    "path": "quadwild/basic_setup.txt",
    "content": "do_remesh 1\nsharp_feature_thr 35\nalpha 0.01\nscaleFact 1\n"
  },
  {
    "path": "quadwild/basic_setup_mechanical.txt",
    "content": "do_remesh 1\nsharp_feature_thr 35\nalpha 0.01\nscaleFact 1\n"
  },
  {
    "path": "quadwild/basic_setup_organic.txt",
    "content": "do_remesh 1\nsharp_feature_thr -1\nalpha 0.02\nscaleFact 1\n"
  },
  {
    "path": "quadwild/functions.cpp",
    "content": "#include \"functions.h\"\n\ninline void remeshAndField(\n        FieldTriMesh& trimesh,\n        const Parameters& parameters,\n        const std::string& meshFilename,\n        const std::string& sharpFilename,\n        const std::string& fieldFilename)\n{\n    typename MeshPrepocess<FieldTriMesh>::BatchParam BPar;\n    BPar.DoRemesh=parameters.remesh;\n    BPar.feature_erode_dilate=4;\n    BPar.remesher_aspect_ratio=0.3;\n    BPar.remesher_iterations=15;\n    BPar.remesher_termination_delta=10000;\n    BPar.SharpFactor=6;\n    BPar.sharp_feature_thr=parameters.sharpAngle;\n    BPar.surf_dist_check=true;\n    BPar.UpdateSharp=(!parameters.hasFeature);\n\n    typename vcg::tri::FieldSmoother<FieldTriMesh>::SmoothParam FieldParam;\n    FieldParam.alpha_curv=0.3;\n    FieldParam.curv_thr=0.8;\n\n    if (parameters.hasFeature) {\n        bool loaded=trimesh.LoadSharpFeatures(sharpFilename);\n        if (!loaded)\n        {\n            std::cout<<\"ERROR: Wrong Sharp Feature File\"<<std::endl;\n            exit(0);\n        }\n        std::cout<<\"Sharp Feature Length:\"<<trimesh.SharpLenght()<<std::endl;\n    }\n    if (!parameters.hasField) {\n        MeshPrepocess<FieldTriMesh>::BatchProcess(trimesh,BPar,FieldParam);\n    }\n    else {\n        trimesh.LoadField(fieldFilename.c_str());\n    }\n\n    MeshPrepocess<FieldTriMesh>::SaveAllData(trimesh,meshFilename);\n}\n\ninline void trace(const std::string& filename, TraceMesh& traceTrimesh)\n{\n    //Get base filename\n    std::string baseFilename=filename;\n    baseFilename.erase(baseFilename.find_last_of(\".\"));\n\n    std::string meshFilename=baseFilename;\n    meshFilename.append(\"_rem.obj\");\n    std::cout<<\"Loading Remeshed M:\"<<meshFilename.c_str()<<std::endl;\n\n    std::string fieldFilename=baseFilename;\n    fieldFilename.append(\"_rem.rosy\");\n    std::cout<<\"Loading Rosy Field:\"<<fieldFilename.c_str()<<std::endl;\n\n    std::string sharpFilename=baseFilename;\n    sharpFilename.append(\"_rem.sharp\");\n    std::cout<<\"Loading Sharp F:\"<<sharpFilename.c_str()<<std::endl;\n\n    //Mesh load\n    printf(\"Loading the mesh \\n\");\n    bool loadedMesh=traceTrimesh.LoadMesh(meshFilename);\n    assert(loadedMesh);\n    traceTrimesh.UpdateAttributes();\n\n    //Field load\n    bool loadedField=traceTrimesh.LoadField(fieldFilename);\n    assert(loadedField);\n    traceTrimesh.UpdateAttributes();\n\n    //Sharp load\n    bool loadedFeatures=traceTrimesh.LoadSharpFeatures(sharpFilename);\n    assert(loadedFeatures);\n    traceTrimesh.SolveGeometricIssues();\n    traceTrimesh.UpdateSharpFeaturesFromSelection();\n\n    //preprocessing mesh\n    PreProcessMesh(traceTrimesh);\n\n    //initializing graph\n    VertexFieldGraph<TraceMesh> VGraph(traceTrimesh);\n    VGraph.InitGraph(false);\n\n    //INIT TRACER\n    typedef PatchTracer<TraceMesh> TracerType;\n    TracerType PTr(VGraph);\n    TraceMesh::ScalarType Drift=100;\n    bool add_only_needed=true;\n    bool final_removal=true;\n    bool meta_mesh_collapse=true;\n    bool force_split=false;\n    PTr.sample_ratio=0.01;\n    PTr.CClarkability=1;\n    PTr.split_on_removal=true;\n    PTr.away_from_singular=true;\n    PTr.match_valence=true;\n    PTr.check_quality_functor=false;\n    PTr.MinVal=3;\n    PTr.MaxVal=5;\n    PTr.Concave_Need=1;\n\n    //TRACING\n    PTr.InitTracer(Drift,false);\n    RecursiveProcess<TracerType>(PTr,Drift, add_only_needed,final_removal,true,meta_mesh_collapse,force_split,true,false);\n    PTr.SmoothPatches();\n    SaveAllData(PTr,baseFilename,0,false,false);\n}\n\ninline void quadrangulate(\n        const std::string& filename,\n        TriangleMesh& trimeshToQuadrangulate,\n        PolyMesh& quadmesh,\n        std::vector<std::vector<size_t>>& trimeshPartitions,\n        std::vector<std::vector<size_t>>& trimeshCorners,\n        std::vector<std::pair<size_t,size_t>>& trimeshFeatures,\n        std::vector<size_t>& trimeshFeaturesC,\n        std::vector<std::vector<size_t>> quadmeshPartitions,\n        std::vector<std::vector<size_t>> quadmeshCorners,\n        std::vector<int> ilpResult,\n        const Parameters& parameters)\n{\n    //Get base filename\n    std::string baseFilename=filename;\n    baseFilename.erase(baseFilename.find_last_of(\".\"));\n\n    std::string meshFilename=baseFilename;\n    meshFilename.append(\"_p0.obj\");\n\n    int mask;\n    vcg::tri::io::ImporterOBJ<TriangleMesh>::LoadMask(meshFilename.c_str(), mask);\n    int err = vcg::tri::io::ImporterOBJ<TriangleMesh>::Open(trimeshToQuadrangulate, meshFilename.c_str(), mask);\n    if ((err!=0)&&(err!=5))\n        assert(0);\n\n    //FACE PARTITIONS\n    std::string partitionFilename = baseFilename;\n    partitionFilename.append(\"_p0.patch\");\n    trimeshPartitions = loadPatches(partitionFilename);\n    std::cout<<\"Loaded \"<<trimeshPartitions.size()<<\" patches\"<<std::endl;\n\n    //PATCH CORNERS\n    std::string cornerFilename = baseFilename;\n    cornerFilename.append(\"_p0.corners\");\n    trimeshCorners = loadCorners(cornerFilename);\n    std::cout<<\"Loaded \"<<trimeshCorners.size()<<\" corners set\"<<std::endl;\n\n    //FEATURES\n    std::string featureFilename = baseFilename;\n    featureFilename.append(\"_p0.feature\");\n    trimeshFeatures = LoadFeatures(featureFilename);\n    std::cout<<\"Loaded \"<<trimeshFeatures.size()<<\" features\"<<std::endl;\n\n    //FEATURE CORNERS\n    std::string featureCFilename = baseFilename;\n    featureCFilename.append(\"_p0.c_feature\");\n    trimeshFeaturesC = loadFeatureCorners(featureCFilename);\n    std::cout<<\"Loaded \"<<featureCFilename.size()<<\" corner features\"<<std::endl;\n    loadFeatureCorners(featureCFilename);\n\n    std::cout<<\"Alpha: \"<<parameters.alpha<<std::endl;\n\n    OrientIfNeeded(trimeshToQuadrangulate,trimeshPartitions,trimeshCorners,trimeshFeatures,trimeshFeaturesC);\n\n    //COMPUTE QUADRANGULATION\n    QuadRetopology::internal::updateAllMeshAttributes(trimeshToQuadrangulate);\n\n    QuadRetopology::Parameters qParameters;\n    float scaleFactor;\n    int fixedChartClusters;\n\n    qParameters.alpha=parameters.alpha;\n    qParameters.ilpMethod=QuadRetopology::ILPMethod::LEASTSQUARES;\n    qParameters.timeLimit=200;\n    qParameters.gapLimit=0.0;\n    qParameters.callbackTimeLimit.push_back(3.0);\n    qParameters.callbackTimeLimit.push_back(5.0);\n    qParameters.callbackTimeLimit.push_back(10.0);\n    qParameters.callbackTimeLimit.push_back(20.0);\n    qParameters.callbackTimeLimit.push_back(30.0);\n    qParameters.callbackTimeLimit.push_back(60.0);\n    qParameters.callbackTimeLimit.push_back(90.0);\n    qParameters.callbackTimeLimit.push_back(120.0);\n\n    qParameters.callbackGapLimit.push_back(0.005);\n    qParameters.callbackGapLimit.push_back(0.02);\n    qParameters.callbackGapLimit.push_back(0.05);\n    qParameters.callbackGapLimit.push_back(0.1);\n    qParameters.callbackGapLimit.push_back(0.15);\n    qParameters.callbackGapLimit.push_back(0.20);\n    qParameters.callbackGapLimit.push_back(0.25);\n    qParameters.callbackGapLimit.push_back(0.3);\n\n    qParameters.minimumGap=0.4;\n\n    qParameters.isometry=true;\n\n    qParameters.regularityQuadrilaterals=true;\n\n    qParameters.regularityNonQuadrilaterals=true;\n\n    qParameters.regularityNonQuadrilateralsWeight=0.9;\n\n    qParameters.alignSingularities=true;\n\n    qParameters.alignSingularitiesWeight=0.1;\n\n    qParameters.repeatLosingConstraintsIterations=true;\n\n    qParameters.repeatLosingConstraintsQuads=false;\n\n    qParameters.repeatLosingConstraintsNonQuads=false;\n\n    qParameters.repeatLosingConstraintsAlign=true;\n\n    qParameters.hardParityConstraint=true;\n\n    scaleFactor=parameters.scaleFact;\n\n    fixedChartClusters=300;\n\n    qParameters.chartSmoothingIterations = 0; //Chart smoothing\n    qParameters.quadrangulationFixedSmoothingIterations = 0; //Smoothing with fixed borders of the patches\n    qParameters.quadrangulationNonFixedSmoothingIterations = 0; //Smoothing with fixed borders of the quadrangulation\n    qParameters.feasibilityFix = false;\n\n    double edgeSize=avgEdge(trimeshToQuadrangulate)*scaleFactor;\n    std::cout<<\"Edge size: \"<<edgeSize<<std::endl;\n    const std::vector<double> edgeFactor(trimeshPartitions.size(), edgeSize);\n\n    qfp::quadrangulationFromPatches(trimeshToQuadrangulate, trimeshPartitions, trimeshCorners, edgeFactor, qParameters, fixedChartClusters, quadmesh, quadmeshPartitions, quadmeshCorners, ilpResult);\n\n    //SAVE OUTPUT\n    std::string outputFilename = baseFilename;\n    outputFilename+=std::string(\"_quadrangulation\")+std::string(\".obj\");\n    vcg::tri::io::ExporterOBJ<PolyMesh>::Save(quadmesh, outputFilename.c_str(),0);\n\n\n    //SMOOTH\n    std::vector<size_t> QuadPart(quadmesh.face.size(),0);\n    for (size_t i=0;i<quadmeshPartitions.size();i++)\n        for (size_t j=0;j<quadmeshPartitions[i].size();j++)\n            QuadPart[quadmeshPartitions[i][j]]=i;\n\n    std::vector<size_t> TriPart(trimeshToQuadrangulate.face.size(),0);\n    for (size_t i=0;i<trimeshPartitions.size();i++)\n        for (size_t j=0;j<trimeshPartitions[i].size();j++)\n            TriPart[trimeshPartitions[i][j]]=i;\n\n    std::vector<size_t> QuadCornersVect;\n    for (size_t i=0;i<quadmeshCorners.size();i++)\n        for (size_t j=0;j<quadmeshCorners[i].size();j++)\n            QuadCornersVect.push_back(quadmeshCorners[i][j]);\n\n    std::sort(QuadCornersVect.begin(),QuadCornersVect.end());\n    auto last=std::unique(QuadCornersVect.begin(),QuadCornersVect.end());\n    QuadCornersVect.erase(last, QuadCornersVect.end());\n\n    std::cout<<\"** SMOOTHING **\"<<std::endl;\n    MultiCostraintSmooth(quadmesh,trimeshToQuadrangulate,trimeshFeatures,trimeshFeaturesC,TriPart,QuadCornersVect,QuadPart,0.5,edgeSize,30,1);\n\n    //SAVE OUTPUT\n    std::string smoothOutputFilename = baseFilename;\n    smoothOutputFilename+=std::string(\"_quadrangulation_smooth\")+std::string(\".obj\");\n\n    vcg::tri::io::ExporterOBJ<PolyMesh>::Save(quadmesh, smoothOutputFilename.c_str(),0);\n}\n\ninline typename TriangleMesh::ScalarType avgEdge(const TriangleMesh& trimesh)\n{\n    typedef typename TriangleMesh::ScalarType ScalarType;\n\n    ScalarType avg=0;\n    size_t num=0;\n\n    for (size_t i=0;i<trimesh.face.size();i++) {\n        for (int j=0;j<trimesh.face[i].VN();j++) {\n            avg+=(trimesh.face[i].cP0(j)-trimesh.face[i].cP1(j)).Norm();\n            num++;\n        }\n    }\n\n    return avg/num;\n}\n\ninline bool loadConfigFile(const std::string& filename, Parameters& parameters)\n{\n    FILE *f=fopen(filename.c_str(),\"rt\");\n\n    if (f==NULL)return false;\n\n    std::cout<<\"READ CONFIG FILE\"<<std::endl;\n\n    int IntVar;\n    fscanf(f,\"do_remesh %d\\n\",&IntVar);\n    if (IntVar==0)\n        parameters.remesh=false;\n    else\n        parameters.remesh=true;\n\n    fscanf(f,\"sharp_feature_thr %f\\n\",&parameters.sharpAngle);\n\n    fscanf(f,\"alpha %f\\n\",&parameters.alpha);\n\n    fscanf(f,\"scaleFact %f\\n\",&parameters.scaleFact);\n\n    fclose(f);\n\n    std::cout << \"Successful config import\" << std::endl;\n\n    return true;\n}\n"
  },
  {
    "path": "quadwild/functions.h",
    "content": "#ifndef FUNCTIONS_H\n#define FUNCTIONS_H\n\n#include <triangle_mesh_type.h>\n#include <mesh_manager.h>\n#include <vcg/space/box3.h>\n#include <tracing/mesh_type.h>\n#include <tracing/tracer_interface.h>\n\n#include <load_save.h>\n#include <mesh_types.h>\n#include <smooth_mesh.h>\n#include <quad_from_patches.h>\n#include <quad_mesh_tracer.h>\n\nstruct Parameters {\n    Parameters() :\n        remesh(true),\n        sharpAngle(35),\n        alpha(0.02),\n        scaleFact(1),\n        hasFeature(false),\n        hasField(false)\n    {\n\n    }\n\n    bool remesh;\n    float sharpAngle;\n    float alpha;\n    float scaleFact;\n    bool hasFeature;\n    bool hasField;\n};\n\nvoid remeshAndField(\n        FieldTriMesh& trimesh,\n        const Parameters& parameters,\n        const std::string& meshFilename,\n        const std::string& sharpFilename,\n        const std::string& fieldFilename);\nvoid trace(const std::string& path, TraceMesh& traceTrimesh);\nvoid quadrangulate(\n        const std::string& path,\n        TriangleMesh& trimeshToQuadrangulate,\n        PolyMesh& quadmesh,\n        std::vector<std::vector<size_t>>& trimeshPartitions,\n        std::vector<std::vector<size_t>>& trimeshCorners,\n        std::vector<std::pair<size_t,size_t>>& trimeshFeatures,\n        std::vector<size_t>& trimeshFeaturesC,\n        std::vector<std::vector<size_t>> quadmeshPartitions,\n        std::vector<std::vector<size_t>> quadmeshCorners,\n        std::vector<int> ilpResult,\n        const Parameters& parameters);\n\ntypename TriangleMesh::ScalarType avgEdge(const TriangleMesh& trimesh);\nbool loadConfigFile(const std::string& filename, Parameters& parameters);\n\n#include \"functions.cpp\"\n\n#endif // FUNCTIONS_H\n"
  },
  {
    "path": "quadwild/quadwild.cpp",
    "content": "//***************************************************************************/\n/* Copyright(C) 2021\n\n\nThe authors of\n\nReliable Feature-Line Driven Quad-Remeshing\nSiggraph 2021\n\n\n All rights reserved.\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <https://www.gnu.org/licenses/>.\n****************************************************************************/\n\n#include <iomanip>\n#include <clocale>\n\n#include \"functions.h\"\n\nint main(int argc, char *argv[])\n{\n    Parameters parameters;\n\n    FieldTriMesh trimesh;\n    TraceMesh traceTrimesh;\n\n    TriangleMesh trimeshToQuadrangulate;\n    std::vector<std::vector<size_t>> trimeshPartitions;\n    std::vector<std::vector<size_t>> trimeshCorners;\n    std::vector<std::pair<size_t,size_t> > trimeshFeatures;\n    std::vector<size_t> trimeshFeaturesC;\n\n    PolyMesh quadmesh;\n    std::vector<std::vector<size_t>> quadmeshPartitions;\n    std::vector<std::vector<size_t>> quadmeshCorners;\n    std::vector<int> ilpResult;\n\n    if (argc==1)\n    {\n        std::cout<<\"Please specify a mesh (OBJ or PLY) as argument\"<<std::endl;\n        exit(0);\n    }\n\n    std::string meshFilename=std::string(argv[1]);\n    std::string sharpFilename;\n    std::string fieldFilename;\n\n    //Use \".\" as decimal separator\n    std::setlocale(LC_NUMERIC, \"en_US.UTF-8\");\n\n    std::cout<<\"Reading input...\"<<std::endl;\n    loadConfigFile(\"basic_setup.txt\", parameters);\n\n    for (int i=2;i<argc;i++)\n    {\n        int position;\n\n        std::string pathTest=std::string(argv[i]);\n\n        position=pathTest.find(\".sharp\");\n        if (position!=-1)\n        {\n            sharpFilename=pathTest;\n            parameters.hasFeature=true;\n            continue;\n        }\n\n        position=pathTest.find(\".txt\");\n        if (position!=-1)\n        {\n           loadConfigFile(pathTest.c_str(), parameters);\n           continue;\n        }\n\n        position=pathTest.find(\".rosy\");\n        if (position!=-1)\n        {\n           fieldFilename=pathTest;\n           parameters.hasField=true;\n           continue;\n        }\n    }\n\n\n    std::cout<<\"Loading:\"<<meshFilename.c_str()<<std::endl;\n\n    bool allQuad;\n    bool loaded=trimesh.LoadTriMesh(meshFilename,allQuad);\n    trimesh.UpdateDataStructures();\n\n    if (!loaded)\n    {\n        std::cout<<\"Wrong mesh filename\"<<std::endl;\n        exit(0);\n    }\n\n    std::cout<<\"Loaded \"<<trimesh.fn<<\" faces and \"<<trimesh.vn<<\" vertices\"<<std::endl;\n\n    std::cout<<std::endl<<\"--------------------- 1 - Remesh and field ---------------------\"<<std::endl;\n    remeshAndField(trimesh, parameters, meshFilename, sharpFilename, fieldFilename);\n\n    std::cout<<std::endl<<\"--------------------- 2 - Tracing ---------------------\"<<std::endl;\n    trace(meshFilename, traceTrimesh);\n\n    std::cout<<std::endl<<\"--------------------- 3 - Quadrangulation ---------------------\"<<std::endl;\n    quadrangulate(meshFilename, trimeshToQuadrangulate, quadmesh, trimeshPartitions, trimeshCorners, trimeshFeatures, trimeshFeaturesC, quadmeshPartitions, quadmeshCorners, ilpResult, parameters);\n}\n\n"
  },
  {
    "path": "quadwild/quadwild.pro",
    "content": "############################ PROJECT FILES ############################\n\ninclude(../libs/libs.pri)\ninclude($$QUADRETOPOLOGY_PATH/quadretopology.pri)\n\nSOURCES += \\\n    functions.cpp \\\n    quadwild.cpp\n\nHEADERS += \\\n    functions.h\n\n############################ TARGET ############################\n\n#App config\nTARGET = quadwild\nCONFIG += c++11\nCONFIG -= app_bundle\n\nmacx {\n    QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.13\n    QMAKE_MAC_SDK = macosx10.13\n}\n\n\nDEFINES += GLEW_STATIC\nDEFINES += INCLUDE_TEMPLATES\n\n\n#Debug/release optimization flags\nCONFIG(debug, debug|release){\n    DEFINES += DEBUG\n}\nCONFIG(release, debug|release){\n    DEFINES -= DEBUG\n    #just uncomment next line if you want to ignore asserts and got a more optimized binary\n    CONFIG += FINAL_RELEASE\n}\n\n#Final release optimization flag\nFINAL_RELEASE {\n    unix:!macx{\n        QMAKE_CXXFLAGS_RELEASE -= -g -O2\n        QMAKE_CXXFLAGS += -O3 -DNDEBUG\n    }\n}\n\nmacx {\n    QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.13\n    QMAKE_MAC_SDK = macosx10.13\n}\n\n############################ INCLUDES ############################\n\nMESHFIELD_PATH = ../components/field_computation\nMESHTRACE_PATH =../components/field_tracing\nQUADRANGULATE_PATH = ../components/quad_from_patches\n\nHEADERS += \\\n    $$LIBIGL_PATH/include/igl/principal_curvature.h \\\n    $$QUADRANGULATE_PATH/load_save.h \\\n    $$QUADRANGULATE_PATH/quad_from_patches.h \\\n    $$VCGLIB_PATH/wrap/ply/plylib.h\n\nSOURCES += \\\n    $$LIBIGL_PATH/include/igl/principal_curvature.cpp \\\n    $$QUADRANGULATE_PATH/load_save.cpp \\\n    $$QUADRANGULATE_PATH/quad_from_patches.cpp \\\n    $$VCGLIB_PATH/wrap/ply/plylib.cpp\n\n#vcglib\nINCLUDEPATH += $$VCGLIB_PATH\n\n#eigen\nINCLUDEPATH += $$EIGEN_PATH\n\n#tracing\nINCLUDEPATH += $$MESHFIELD_PATH\nINCLUDEPATH += $$MESHTRACE_PATH\nINCLUDEPATH += $$QUADRANGULATE_PATH\n\n#Comiso\ncontains(DEFINES, COMISO_FIELD) {\n    LIBS += -L$$COMISO_PATH/build/Build/lib/CoMISo/ -lCoMISo\n    INCLUDEPATH += $$COMISO_PATH/..\n\n    #gmm (we have to use comiso gmm)\n    INCLUDEPATH += $$GMM_PATH/include\n\n    HEADERS += \\\n        $$LIBIGL_PATH/include/igl/copyleft/comiso/nrosy.h\n    SOURCES += \\\n        $$LIBIGL_PATH/include/igl/copyleft/comiso/nrosy.cpp\n}\n\n#libigl\nINCLUDEPATH += $$LIBIGL_PATH/include\nQMAKE_CXXFLAGS += -isystem $$LIBIGL_PATH/include/\n\n#Boost\nINCLUDEPATH += $$BOOST_PATH\n\n#Gurobi\nINCLUDEPATH += $$GUROBI_PATH/include\nLIBS += -L$$GUROBI_PATH/lib -l$$GUROBI_COMPILER -l$$GUROBI_LIB\nDEFINES += GUROBI_DEFINED\n\n#Field tracer\nINCLUDEPATH += $$XFIELDTRACER_PATH\n\n#Parallel computation (just in release)\nunix:!mac {\n    QMAKE_CXXFLAGS += -fopenmp\n    LIBS += -fopenmp\n}\n#macx{\n#    QMAKE_CXXFLAGS += -Xpreprocessor -fopenmp -lomp -I/usr/local/include\n#    QMAKE_LFLAGS += -lomp\n#    LIBS += -L /usr/local/lib /usr/local/lib/libomp.dylib\n#}\n\nwin32{\n    DEFINES += NOMINMAX # Awful problem with windows..\n    DEFINES *= _USE_MATH_DEFINES\n    DEFINES *= _SCL_SECURE_NO_DEPRECATE\n    QMAKE_CXXFLAGS *= /bigobj\n}\n\n"
  },
  {
    "path": "quadwild/quadwild_mechanical.command",
    "content": "#!/bin/bash\n\necho \"Processing all OBJs in $1\"\n\nfor i in $1/*.obj; do\n\n    complete_file=\"${i}\"\n\n    echo \"Processing File ${i}\"\n\n    only_file_name=$(basename $complete_file)\n    dir_name=\"${complete_file%.*}\"\n    dir_name+=\"/\"\n\n    mkdir -p \"$dir_name\" | cut -f 1 -d '.'\n\n    cp $i $dir_name\n\n    new_filename=\"${dir_name}\"\"${only_file_name}\"\n\n    ./quadwild  \"${new_filename}\" basic_setup_mechanical.txt\ndone\n"
  },
  {
    "path": "quadwild/quadwild_organic.command",
    "content": "#!/bin/bash\n\necho \"Processing all OBJs in $1\"\n\nfor i in $1/*.obj; do\n\n    complete_file=\"${i}\"\n\n    echo \"Processing File ${i}\"\n\n    only_file_name=$(basename $complete_file)\n    dir_name=\"${complete_file%.*}\"\n    dir_name+=\"/\"\n\n    mkdir -p \"$dir_name\" | cut -f 1 -d '.'\n\n    cp $i $dir_name\n\n    new_filename=\"${dir_name}\"\"${only_file_name}\"\n\n    ./quadwild  \"${new_filename}\" basic_setup_organic.txt\ndone\n"
  },
  {
    "path": "scripts/organize_folders_300_mechanical.command",
    "content": "#!/bin/bash\n\nfor i in ../../test/300/Mechanical/*.obj; do\n\n\n    complete_file=\"${i}\"\n    only_file_name=$(basename $complete_file)\n    dir_name=\"${complete_file%.*}\"\n    dir_name+=\"/\"\n\n    mkdir -p \"$dir_name\" | cut -f 1 -d '.'\n\n    cp $i $dir_name\n\n done\n"
  },
  {
    "path": "scripts/organize_folders_300_organic.command",
    "content": "#!/bin/bash\n\nfor i in ../../test/300/Organic/*.obj; do\n\n\n    complete_file=\"${i}\"\n    only_file_name=$(basename $complete_file)\n    dir_name=\"${complete_file%.*}\"\n    dir_name+=\"/\"\n\n    mkdir -p \"$dir_name\" | cut -f 1 -d '.'\n\n    cp $i $dir_name\n\n done\n"
  }
]